diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 359746db8a..bdb8fa9134 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -7,7 +7,7 @@ jobs: name: Build strategy: matrix: - go: [1.18.x] + go: [1.20.2] os: ["ubuntu-latest", "windows-latest", "macos-latest"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 8edd8e5d08..68f6b3f51c 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -7,7 +7,7 @@ jobs: name: Check Source strategy: matrix: - go: [1.18.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b7ff29d4a5..7ab03b050a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,9 +11,9 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: - go-version: "1.18" + go-version: "1.20.2" - name: Lint - run: make check + run: make check && make check-templates - name: Check that 'func.yaml schema' is up-to-date run: make schema-check - name: Check embedded templates content @@ -22,7 +22,7 @@ jobs: test-unit: strategy: matrix: - go: [ 1.18.x ] + go: [ 1.20.2 ] java: [ 17 ] os: [ "ubuntu-latest", "windows-latest", "macos-latest" ] runs-on: ${{ matrix.os }} @@ -50,7 +50,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: - go-version: "1.18" + go-version: "1.20.2" - name: Install Binaries run: ./hack/binaries.sh - name: Allocate Cluster @@ -67,7 +67,7 @@ jobs: e2e-test: strategy: matrix: - go: [1.20.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: @@ -91,7 +91,7 @@ jobs: e2e-on-cluster-test: strategy: matrix: - go: [1.20.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: @@ -126,7 +126,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: - go-version: "1.18" + go-version: "1.20.2" # Standard build tasks - name: Build run: make cross-platform @@ -167,6 +167,6 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: - go-version: "1.18" + go-version: "1.20.2" - uses: imjasonh/setup-ko@v0.6 - run: ko build -B ./cmd/func diff --git a/.github/workflows/schema.yaml b/.github/workflows/schema.yaml index 2669d78256..3bf7fd879f 100644 --- a/.github/workflows/schema.yaml +++ b/.github/workflows/schema.yaml @@ -7,7 +7,7 @@ jobs: name: Check Schema strategy: matrix: - go: [1.18.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/test-e2e-oncluster-runtime.yaml b/.github/workflows/test-e2e-oncluster-runtime.yaml index 6778c1e26c..858c2639ea 100644 --- a/.github/workflows/test-e2e-oncluster-runtime.yaml +++ b/.github/workflows/test-e2e-oncluster-runtime.yaml @@ -7,7 +7,7 @@ jobs: name: On Cluster RT Test strategy: matrix: - go: [1.20.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/test-e2e-oncluster.yaml b/.github/workflows/test-e2e-oncluster.yaml index a7e4f4a9d8..f6e9d35585 100644 --- a/.github/workflows/test-e2e-oncluster.yaml +++ b/.github/workflows/test-e2e-oncluster.yaml @@ -7,7 +7,7 @@ jobs: name: On Cluster Test strategy: matrix: - go: [1.20.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/test-e2e-runtime.yaml b/.github/workflows/test-e2e-runtime.yaml index 6b7eac28fc..5a6dde3efb 100644 --- a/.github/workflows/test-e2e-runtime.yaml +++ b/.github/workflows/test-e2e-runtime.yaml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: - go-version: 1.20.x + go-version: 1.20.2 - name: Install Binaries run: ./hack/binaries.sh - name: Allocate Cluster diff --git a/.github/workflows/test-e2e.yaml b/.github/workflows/test-e2e.yaml index b2d0ea51a2..cf1ab0136c 100644 --- a/.github/workflows/test-e2e.yaml +++ b/.github/workflows/test-e2e.yaml @@ -7,7 +7,7 @@ jobs: name: E2E Test strategy: matrix: - go: [1.20.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/test-embedded-fs.yaml b/.github/workflows/test-embedded-fs.yaml index 61f693d0ce..395c603e9e 100644 --- a/.github/workflows/test-embedded-fs.yaml +++ b/.github/workflows/test-embedded-fs.yaml @@ -7,7 +7,7 @@ jobs: name: Func Embedded FS Test strategy: matrix: - go: [1.18.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/test-integration.yaml b/.github/workflows/test-integration.yaml index cbf205024d..d0933b3419 100644 --- a/.github/workflows/test-integration.yaml +++ b/.github/workflows/test-integration.yaml @@ -7,7 +7,7 @@ jobs: name: Integration Test strategy: matrix: - go: [1.18.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: @@ -15,14 +15,44 @@ jobs: - uses: actions/setup-go@v3 with: go-version: ${{ matrix.go }} + - uses: imjasonh/setup-ko@v0.6 - name: Install Binaries run: ./hack/binaries.sh - - name: Allocate Cluster - run: ./hack/allocate.sh + - name: Setup testing func image + run: ./hack/create-testing-func-image.sh - name: Local Registry run: ./hack/registry.sh + - name: Allocate Cluster + run: ./hack/allocate.sh + - name: Patch S2I Task + run: ./hack/patch-s2i-task.sh + - name: Install Tekton + run: ./hack/tekton.sh + - name: Set up environment variables + run: | + echo "TEKTON_TESTS_ENABLED=1" >> "$GITHUB_ENV" + echo "GITLAB_TESTS_ENABLED=1" >> "$GITHUB_ENV" + echo "GITLAB_HOSTNAME=gitlab.127.0.0.1.sslip.io" >> "$GITHUB_ENV" + echo "GITLAB_ROOT_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32})" >> "$GITHUB_ENV" + echo "PAC_CONTROLLER_HOSTNAME=pac-ctr.127.0.0.1.sslip.io" >> "$GITHUB_ENV" + - name: Install Pipelines as Code + run: ./hack/install-pac.sh + - name: Install Gitlab + run: ./hack/install-gitlab.sh + - name: Patch Hosts + run: ./hack/patch-hosts.sh - name: Integration Test run: make test-integration + - name: Dump Cluster Logs + if: always() + run: | + echo "::group::cluster events" + kubectl get events -A + echo "::endgroup::" + + echo "::group::cluster containers logs" + stern '.*' --all-namespaces --no-follow + echo "::endgroup::" - uses: codecov/codecov-action@v3 with: files: ./coverage.txt diff --git a/.github/workflows/test-podman.yaml b/.github/workflows/test-podman.yaml index 68f1d0b57c..5b162f7a4f 100644 --- a/.github/workflows/test-podman.yaml +++ b/.github/workflows/test-podman.yaml @@ -7,7 +7,7 @@ jobs: name: Podman Test strategy: matrix: - go: [1.18.x] + go: [1.20.2] os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: @@ -17,7 +17,7 @@ jobs: go-version: ${{ matrix.go }} - name: Install Podman run: | - # TODO uncomment following once https://github.com/containers/podman/pull/16781 is in the kubic repository + # TODO uncomment following once https://github.com/containers/podman/pull/16781 is in the kubic repository #. /etc/os-release #sudo mkdir -p /etc/apt/keyrings #curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_${VERSION_ID}/Release.key \ diff --git a/.github/workflows/test-unit.yaml b/.github/workflows/test-unit.yaml index a6621a4310..ec07040d22 100644 --- a/.github/workflows/test-unit.yaml +++ b/.github/workflows/test-unit.yaml @@ -7,7 +7,7 @@ jobs: name: Unit Test strategy: matrix: - go: [1.18.x] + go: [1.20.2] java: [17] os: ["ubuntu-latest", "windows-latest", "macos-latest"] runs-on: ${{ matrix.os }} diff --git a/.github/workflows/update-builder.yaml b/.github/workflows/update-builder.yaml new file mode 100644 index 0000000000..0cbe9380c0 --- /dev/null +++ b/.github/workflows/update-builder.yaml @@ -0,0 +1,21 @@ +name: Update builder-jammy-full image + +on: + schedule: + - cron: '0 */4 * * *' + +jobs: + build-and-push-image: + permissions: + contents: read + packages: write + runs-on: "ubuntu-latest" + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: "1.20.x" + - name: Build and Push + env: + GITHUB_TOKEN: ${{ github.token }} + run: go run ./hack/update-builder.go diff --git a/.github/workflows/update-springboot-platform.yaml b/.github/workflows/update-springboot-platform.yaml new file mode 100644 index 0000000000..658f018b87 --- /dev/null +++ b/.github/workflows/update-springboot-platform.yaml @@ -0,0 +1,29 @@ +name: Update Spring Boot Platform in embedded templates + +permissions: + contents: write + pull-requests: write + +on: + schedule: + - cron: '0 */4 * * *' + +jobs: + update: + name: Update Spring Boot Platform + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - uses: actions/setup-java@v1 + with: + java-version: 17 + - name: Install NPM deps. + run: npm install axios xml2js octokit + - name: Create PR + env: + GITHUB_TOKEN: ${{ github.token }} + run: node ./hack/update-springboot-platform.js + diff --git a/.gitignore b/.gitignore index c64c2e592a..d0535f87c6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /cmd/func.yaml /templates/typescript/cloudevents/build /templates/typescript/http/build +/templates/go/cloudevents/go.sum /coverage.out /coverage.txt /.coverage diff --git a/Makefile b/Makefile index f8cf0a103d..e6e2ed979f 100644 --- a/Makefile +++ b/Makefile @@ -5,30 +5,37 @@ # ## # Binaries -BIN := func -BIN_DARWIN_AMD64 ?= $(BIN)_darwin_amd64 -BIN_DARWIN_ARM64 ?= $(BIN)_darwin_arm64 +BIN := func +BIN_DARWIN_AMD64 ?= $(BIN)_darwin_amd64 +BIN_DARWIN_ARM64 ?= $(BIN)_darwin_arm64 BIN_LINUX_AMD64 ?= $(BIN)_linux_amd64 BIN_LINUX_ARM64 ?= $(BIN)_linux_arm64 BIN_LINUX_PPC64LE ?= $(BIN)_linux_ppc64le BIN_LINUX_S390X ?= $(BIN)_linux_s390x -BIN_WINDOWS ?= $(BIN)_windows_amd64.exe +BIN_WINDOWS ?= $(BIN)_windows_amd64.exe + +# Utilities +BIN_GOLANGCI_LINT ?= "$(PWD)/bin/golangci-lint" # Version # A verbose version is built into the binary including a date stamp, git commit # hash and the version tag of the current commit (semver) if it exists. # If the current commit does not have a semver tag, 'tip' is used, unless there # is a TAG environment variable. Precedence is git tag, environment variable, 'tip' -DATE := $(shell date -u +"%Y%m%dT%H%M%SZ") -HASH := $(shell git rev-parse --short HEAD 2>/dev/null) -VTAG := $(shell git tag --points-at HEAD | head -1) -VTAG := $(shell [ -z $(VTAG) ] && echo $(ETAG) || echo $(VTAG)) -VERS ?= $(shell [ -z $(VTAG) ] && echo 'tip' || echo $(VTAG) ) -LDFLAGS := "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH)" +HASH := $(shell git rev-parse --short HEAD 2>/dev/null) +VTAG := $(shell git tag --points-at HEAD | head -1) +VTAG := $(shell [ -z $(VTAG) ] && echo $(ETAG) || echo $(VTAG)) +VERS ?= $(shell git describe --tags --match 'v*') +KVER ?= $(shell git describe --tags --match 'knative-*') +LDFLAGS := "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.kver=$(KVER) -X main.hash=$(HASH)" +MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) # All Code prerequisites, including generated files, etc. -CODE := $(shell find . -name '*.go') generate/zz_filesystem_generated.go go.mod schema/func_yaml-schema.json -TEMPLATES := $(shell find templates -name '*' -type f) +CODE := $(shell find . -name '*.go') \ + generate/zz_filesystem_generated.go \ + schema/func_yaml-schema.json \ + templates/certs/ca-certificates.crt \ + go.mod .PHONY: test docs @@ -57,15 +64,19 @@ $(BIN): $(CODE) test: $(CODE) ## Run core unit tests go test -race -cover -coverprofile=coverage.txt ./... -check: bin/golangci-lint ## Check code quality (lint) - ./bin/golangci-lint run --timeout 300s - cd test && ../bin/golangci-lint run --timeout 300s +.PHONY: check +check: $(BIN_GOLANGCI_LINT) ## Check code quality (lint) + $(BIN_GOLANGCI_LINT) run --timeout 300s + cd test && $(BIN_GOLANGCI_LINT) run --timeout 300s -bin/golangci-lint: - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./bin v1.49.0 +$(BIN_GOLANGCI_LINT): + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./bin v1.53.2 -.PHONY: clean_templates +.PHONY: generate/zz_filesystem_generated.go +generate/zz_filesystem_generated.go: clean_templates + go generate pkg/functions/templates_embedded.go +.PHONY: clean_templates clean_templates: # Removing temporary template files @rm -f templates/go/cloudevents/go.sum @@ -86,26 +97,46 @@ clean_templates: @rm -rf templates/springboot/http/target @rm -f templates/**/.DS_Store -.PHONY: generate/zz_filesystem_generated.go - -generate/zz_filesystem_generated.go: clean_templates - go generate pkg/functions/templates_embedded.go - .PHONY: clean - clean: clean_templates ## Remove generated artifacts such as binaries and schemas rm -f $(BIN) $(BIN_WINDOWS) $(BIN_LINUX) $(BIN_DARWIN_AMD64) $(BIN_DARWIN_ARM64) + rm -f $(BIN_GOLANGCI_LINT) rm -f schema/func_yaml-schema.json rm -f coverage.txt +.PHONY: docs docs: # Generating command reference doc go run docs/generator/main.go +############# +##@ Prow Integration +############# + +presubmit-unit-tests: ## Run prow presubmit unit tests locally + docker run --platform linux/amd64 -it --rm -v$(MAKEFILE_DIR):/src/ us-docker.pkg.dev/knative-tests/images/prow-tests:v20230616-086ddd644 sh -c 'cd /src && runner.sh ./test/presubmit-tests.sh --unit-tests' + + ############# ##@ Templates ############# +# TODO: add linters for other templates +.PHONY: check-templates +check-templates: check-go check-rust ## Run template source code checks + +.PHONY: check-go +check-go: ## Check Go templates' source + cd templates/go/scaffolding/instanced-http && go vet ./... && $(BIN_GOLANGCI_LINT) run + cd templates/go/scaffolding/instanced-cloudevents && go vet && $(BIN_GOLANGCI_LINT) run + cd templates/go/scaffolding/static-http && go vet ./... && $(BIN_GOLANGCI_LINT) run + cd templates/go/scaffolding/static-cloudevents && go vet ./... && $(BIN_GOLANGCI_LINT) run + +.PHONY: check-rust +check-rust: ## Check Rust templates' source + cd templates/rust/cloudevents && cargo clippy && cargo clean + cd templates/rust/http && cargo clippy && cargo clean + test-templates: test-go test-node test-python test-quarkus test-springboot test-rust test-typescript ## Run all template tests test-go: ## Test Go templates @@ -121,21 +152,41 @@ test-python: ## Test Python templates cd templates/python/http && python3 test_func.py && rm -rf __pycache__ test-quarkus: ## Test Quarkus templates - cd templates/quarkus/cloudevents && mvn test && mvn clean - cd templates/quarkus/http && mvn test && mvn clean + cd templates/quarkus/cloudevents && mvn -q test && mvn clean + cd templates/quarkus/http && mvn -q test && mvn clean test-springboot: ## Test Spring Boot templates - cd templates/springboot/cloudevents && mvn test && mvn clean - cd templates/springboot/http && mvn test && mvn clean + cd templates/springboot/cloudevents && mvn -q test && mvn clean + cd templates/springboot/http && mvn -q test && mvn clean test-rust: ## Test Rust templates - cd templates/rust/cloudevents && cargo test && cargo clean - cd templates/rust/http && cargo test && cargo clean + cd templates/rust/cloudevents && cargo -q test && cargo clean + cd templates/rust/http && cargo -q test && cargo clean test-typescript: ## Test Typescript templates cd templates/typescript/cloudevents && npm ci && npm test && rm -rf node_modules build cd templates/typescript/http && npm ci && npm test && rm -rf node_modules build +############### +##@ Scaffolding +############### + +# Pulls runtimes then rebuilds the embedded filesystem +update-runtimes: pull-runtimes generate/zz_filesystem_generated.go ## Update Scaffolding Runtimes + +pull-runtimes: + cd templates/go/scaffolding/instanced-http && go get -u github.com/knative-sandbox/func-go/http + cd templates/go/scaffolding/static-http && go get -u github.com/knative-sandbox/func-go/http + cd templates/go/scaffolding/instanced-cloudevents && go get -u github.com/knative-sandbox/func-go/cloudevents + cd templates/go/scaffolding/static-cloudevents && go get -u github.com/knative-sandbox/func-go/cloudevents + +.PHONY: cert +certs: templates/certs/ca-certificates.crt ## Update root certificates + +.PHONY: templates/certs/ca-certificates.crt +templates/certs/ca-certificates.crt: + # Updating root certificates + curl --output templates/certs/ca-certificates.crt https://curl.se/ca/cacert.pem ################### ##@ Extended Testing (cluster required) @@ -202,6 +253,7 @@ $(BIN_WINDOWS): generate/zz_filesystem_generated.go ###################### ##@ Schemas ###################### + schema-generate: schema/func_yaml-schema.json ## Generate func.yaml schema schema/func_yaml-schema.json: pkg/functions/function.go pkg/functions/function_*.go go run schema/generator/main.go diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index 9bf8cadb08..ad7e618bc2 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -20,13 +20,19 @@ aliases: - salaboy docs-reviewers: - nainaz + - nak3 - pmbanugo + - retocode + - skonto - snneji docs-wg-leads: - snneji docs-writers: - csantanapr + - nak3 - psschwei + - retocode + - skonto - snneji eventing-reviewers: - aslom @@ -43,6 +49,7 @@ aliases: - odacremolbap - pierDipi func-reviewers: + - gauron99 - jrangelramos - nainaz func-writers: @@ -56,10 +63,11 @@ aliases: - lance - salaboy knative-admin: + - Vishal-Chdhry + - creydr - csantanapr - dprotaso - dsimansk - - evankanderson - knative-automation - knative-prow-releaser-robot - knative-prow-robot @@ -70,18 +78,20 @@ aliases: - mchmarny - nainaz - pierDipi - - pradnyavmw - psschwei - puerco - salaboy + - skonto - smoser-ibm - upodroid + - xtreme-sameer-vohra - zroubalik knative-release-leads: + - Vishal-Chdhry + - creydr - dsimansk - - kvmware - pierDipi - - pradnyavmw + - skonto knative-robots: - knative-automation - knative-prow-releaser-robot @@ -122,6 +132,7 @@ aliases: - evankanderson serving-approvers: - nak3 + - psschwei - skonto serving-reviewers: - KauzClay @@ -137,7 +148,6 @@ aliases: - skonto serving-wg-leads: - dprotaso - - psschwei serving-writers: - dprotaso - nak3 @@ -152,13 +162,13 @@ aliases: technical-oversight-committee: - dprotaso - dsimansk - - evankanderson + - kvmware - psschwei - zroubalik trademark-committee: - - evankanderson - mchmarny - smoser-ibm + - xtreme-sameer-vohra ux-wg-leads: - snneji ux-writers: diff --git a/README.md b/README.md index 0108e5b87a..37f34b1b26 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ We use GitHub issues and project to track our roadmap. Please see our roadmap [here](https://github.com/orgs/knative/projects/49). +## Knative Function demos and examples +- [Knative Functions in action: Amsterdam City Data App](https://github.com/zroubalik/knative-functions-ams-data-demo/) + ## Contributing We are always looking for contributions from the Function Developer community. For more information on how to participate, see the [Contribuiting Guide](docs/CONTRIBUTING.md) diff --git a/cmd/build.go b/cmd/build.go index 6fec468e98..374c70f70d 100644 --- a/cmd/build.go +++ b/cmd/build.go @@ -14,6 +14,7 @@ import ( "knative.dev/func/pkg/builders/s2i" "knative.dev/func/pkg/config" fn "knative.dev/func/pkg/functions" + "knative.dev/func/pkg/oci" ) func NewBuildCmd(newClient ClientFactory) *cobra.Command { @@ -150,14 +151,15 @@ func runBuild(cmd *cobra.Command, _ []string, newClient ClientFactory) (err erro return } if !f.Initialized() { - return fn.NewUninitializedError(f.Root) + return fn.NewErrNotInitialized(f.Root) } f = cfg.Configure(f) // Updates f at path to include build request values // TODO: this logic is duplicated with runDeploy. Shouild be in buildConfig // constructor. - // Checks if there is a difference between defined registry and its value used as a prefix in the image tag - // In case of a mismatch a new image tag is created and used for build + // Checks if there is a difference between defined registry and its value + // used as a prefix in the image tag In case of a mismatch a new image tag is + // created and used for build. // Do not react if image tag has been changed outside configuration if f.Registry != "" && !cmd.Flags().Changed("image") && strings.Index(f.Image, "/") > 0 && !strings.HasPrefix(f.Image, f.Registry) { prfx := f.Registry @@ -171,25 +173,19 @@ func runBuild(cmd *cobra.Command, _ []string, newClient ClientFactory) (err erro } // Client - // Concrete implementations (ex builder) vary based on final effective config - o := []fn.Option{fn.WithRegistry(cfg.Registry)} - if f.Build.Builder == builders.Pack { - o = append(o, fn.WithBuilder(pack.NewBuilder( - pack.WithName(builders.Pack), - pack.WithTimestamp(cfg.WithTimestamp), - pack.WithVerbose(cfg.Verbose)))) - } else if f.Build.Builder == builders.S2I { - o = append(o, fn.WithBuilder(s2i.NewBuilder( - s2i.WithName(builders.S2I), - s2i.WithPlatform(cfg.Platform), - s2i.WithVerbose(cfg.Verbose)))) + clientOptions, err := cfg.clientOptions() + if err != nil { + return } - - client, done := newClient(ClientConfig{Verbose: cfg.Verbose}, o...) + client, done := newClient(ClientConfig{Verbose: cfg.Verbose}, clientOptions...) defer done() - // Build and (optionally) push - if f, err = client.Build(cmd.Context(), f); err != nil { + // Build + buildOptions, err := cfg.buildOptions() + if err != nil { + return + } + if f, err = client.Build(cmd.Context(), f, buildOptions...); err != nil { return } if cfg.Push { @@ -346,3 +342,62 @@ func (c buildConfig) Validate() (err error) { return } + +// clientOptions returns options suitable for instantiating a client based on +// the current state of the build config object. +// This will be unnecessary and refactored away when the host-based OCI +// builder and pusher are the default implementations and the Pack and S2I +// constructors simplified. +// +// TODO: Platform is currently only used by the S2I builder. This should be +// a multi-valued argument which passes through to the "host" builder (which +// supports multi-arch/platform images), and throw an error if either trying +// to specify a platform for buildpacks, or trying to specify more than one +// for S2I. +// +// TODO: As a further optimization, it might be ideal to only build the +// image necessary for the target cluster, since the end product of a function +// deployment is not the contiainer, but rather the running service. +func (c buildConfig) clientOptions() ([]fn.Option, error) { + o := []fn.Option{fn.WithRegistry(c.Registry)} + if c.Builder == builders.Host { + o = append(o, + fn.WithBuilder(oci.NewBuilder(builders.Host, c.Verbose)), + fn.WithPusher(oci.NewPusher(false, c.Verbose))) + } else if c.Builder == builders.Pack { + o = append(o, + fn.WithBuilder(pack.NewBuilder( + pack.WithName(builders.Pack), + pack.WithTimestamp(c.WithTimestamp), + pack.WithVerbose(c.Verbose)))) + } else if c.Builder == builders.S2I { + o = append(o, + fn.WithBuilder(s2i.NewBuilder( + s2i.WithName(builders.S2I), + s2i.WithVerbose(c.Verbose)))) + } else { + return o, builders.ErrUnknownBuilder{Name: c.Builder, Known: KnownBuilders()} + } + return o, nil +} + +// buildOptions returns options for use with the client.Build request +func (c buildConfig) buildOptions() (oo []fn.BuildOption, err error) { + oo = []fn.BuildOption{} + + // Platforms + // + // TODO: upgrade --platform to a multi-value field. The individual builder + // implementations are responsible for bubbling an error if they do + // not support this. Pack supports none, S2I supports one, host builder + // supports multi. + if c.Platform != "" { + parts := strings.Split(c.Platform, "/") + if len(parts) != 2 { + return oo, fmt.Errorf("the value for --patform must be in the form [OS]/[Architecture]. eg \"linux/amd64\"") + } + oo = append(oo, fn.BuildWithPlatforms([]fn.Platform{{OS: parts[0], Architecture: parts[1]}})) + } + + return +} diff --git a/cmd/client.go b/cmd/client.go index 91a187c84b..8b53be89b1 100644 --- a/cmd/client.go +++ b/cmd/client.go @@ -12,8 +12,8 @@ import ( "knative.dev/func/pkg/docker/creds" fn "knative.dev/func/pkg/functions" fnhttp "knative.dev/func/pkg/http" + "knative.dev/func/pkg/k8s" "knative.dev/func/pkg/knative" - "knative.dev/func/pkg/openshift" "knative.dev/func/pkg/pipelines/tekton" "knative.dev/func/pkg/progress" ) @@ -103,7 +103,7 @@ func NewClient(cfg ClientConfig, options ...fn.Option) (*fn.Client, func()) { // newTransport returns a transport with cluster-flavor-specific variations // which take advantage of additional features offered by cluster variants. func newTransport(insecureSkipVerify bool) fnhttp.RoundTripCloser { - return fnhttp.NewRoundTripper(fnhttp.WithInsecureSkipVerify(insecureSkipVerify), openshift.WithOpenShiftServiceCA()) + return fnhttp.NewRoundTripper(fnhttp.WithInsecureSkipVerify(insecureSkipVerify), fnhttp.WithOpenShiftServiceCA()) } // newCredentialsProvider returns a credentials provider which possibly @@ -114,7 +114,7 @@ func newCredentialsProvider(configPath string, t http.RoundTripper) docker.Crede creds.WithPromptForCredentials(prompt.NewPromptForCredentials(os.Stdin, os.Stdout, os.Stderr)), creds.WithPromptForCredentialStore(prompt.NewPromptForCredentialStore()), creds.WithTransport(t), - creds.WithAdditionalCredentialLoaders(openshift.GetDockerCredentialLoaders()...), + creds.WithAdditionalCredentialLoaders(k8s.GetOpenShiftDockerCredentialLoaders()...), } // Other cluster variants can be supported here @@ -144,18 +144,18 @@ func newKnativeDeployer(namespace string, verbose bool) fn.Deployer { } type deployDecorator struct { - oshDec openshift.OpenshiftMetadataDecorator + oshDec k8s.OpenshiftMetadataDecorator } func (d deployDecorator) UpdateAnnotations(function fn.Function, annotations map[string]string) map[string]string { - if openshift.IsOpenShift() { + if k8s.IsOpenShift() { return d.oshDec.UpdateAnnotations(function, annotations) } return annotations } func (d deployDecorator) UpdateLabels(function fn.Function, labels map[string]string) map[string]string { - if openshift.IsOpenShift() { + if k8s.IsOpenShift() { return d.oshDec.UpdateLabels(function, labels) } return labels diff --git a/cmd/config.go b/cmd/config.go index 7536105691..7092005129 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -32,7 +32,7 @@ func (s standardLoaderSaver) Load(path string) (fn.Function, error) { return fn.Function{}, fmt.Errorf("failed to create new function (path: %q): %w", path, err) } if !f.Initialized() { - return fn.Function{}, fn.NewUninitializedError(f.Root) + return fn.Function{}, fn.NewErrNotInitialized(f.Root) } return f, nil } diff --git a/cmd/delete.go b/cmd/delete.go index 3e02cc6df2..ec8573409d 100644 --- a/cmd/delete.go +++ b/cmd/delete.go @@ -30,7 +30,8 @@ No local files are deleted. # Undeploy the function 'myfunc' in namespace 'apps' {{rootCmdUse}} delete -n apps myfunc `, - SuggestFor: []string{"remove", "rm", "del"}, + SuggestFor: []string{"remove", "del"}, + Aliases: []string{"rm"}, ValidArgsFunction: CompleteFunctionList, PreRunE: bindEnv("path", "confirm", "all", "namespace", "verbose"), SilenceUsage: true, // no usage dump on error @@ -80,7 +81,7 @@ func runDelete(cmd *cobra.Command, args []string, newClient ClientFactory) (err // Check if the function has been initialized if !function.Initialized() { - return fn.NewUninitializedError(function.Root) + return fn.NewErrNotInitialized(function.Root) } // If not provided, use the function's extant namespace diff --git a/cmd/deploy.go b/cmd/deploy.go index 4540c873a1..f4cc63943a 100644 --- a/cmd/deploy.go +++ b/cmd/deploy.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + "os" "strconv" "strings" @@ -13,8 +14,6 @@ import ( "k8s.io/apimachinery/pkg/api/resource" "knative.dev/client-pkg/pkg/util" "knative.dev/func/pkg/builders" - "knative.dev/func/pkg/builders/buildpacks" - "knative.dev/func/pkg/builders/s2i" "knative.dev/func/pkg/config" fn "knative.dev/func/pkg/functions" "knative.dev/func/pkg/k8s" @@ -32,8 +31,8 @@ SYNOPSIS {{rootCmdUse}} deploy [-R|--remote] [-r|--registry] [-i|--image] [-n|--namespace] [-e|--env] [-g|--git-url] [-t|--git-branch] [-d|--git-dir] [-b|--build] [--builder] [--builder-image] [-p|--push] - [--domain] [--platform] [--build-timestamp] - [-c|--confirm] [-v|--verbose] + [--domain] [--platform] [--build-timestamp] [--pvc-size] + [--service-account] [-c|--confirm] [-v|--verbose] DESCRIPTION @@ -125,7 +124,7 @@ EXAMPLES `, SuggestFor: []string{"delpoy", "deplyo"}, - PreRunE: bindEnv("build", "build-timestamp", "builder", "builder-image", "confirm", "domain", "env", "git-branch", "git-dir", "git-url", "image", "namespace", "path", "platform", "push", "pvc-size", "registry", "remote", "verbose"), + PreRunE: bindEnv("build", "build-timestamp", "builder", "builder-image", "confirm", "domain", "env", "git-branch", "git-dir", "git-url", "image", "namespace", "path", "platform", "push", "pvc-size", "service-account", "registry", "remote", "verbose"), RunE: func(cmd *cobra.Command, args []string) error { return runDeploy(cmd, newClient) }, @@ -176,11 +175,12 @@ EXAMPLES "Git revision (branch) to be used when deploying via the Git repository ($FUNC_GIT_BRANCH)") cmd.Flags().StringP("git-dir", "d", f.Build.Git.ContextDir, "Directory in the Git repository containing the function (default is the root) ($FUNC_GIT_DIR)") - cmd.Flags().Bool("remote", f.Deploy.Remote, + cmd.Flags().BoolP("remote", "R", f.Deploy.Remote, "Trigger a remote deployment. Default is to deploy and build from the local system ($FUNC_REMOTE)") - cmd.Flags().String("pvc-size", fn.DefaultPersistentVolumeClaimSize, - "Configure the PVC size used by a pipeline during remote build.") - + cmd.Flags().String("pvc-size", f.Build.PVCSize, + "When triggering a remote deployment, set a custom volume size to allocate for the build operation ($FUNC_PVC_SIZE)") + cmd.Flags().String("service-account", f.Deploy.ServiceAccountName, + "Service account to be used in the deployed function ($FUNC_SERVICE_ACCOUNT)") // Static Flags: // Options which have static defaults only (not globally configurable nor // persisted with the function) @@ -228,7 +228,7 @@ func runDeploy(cmd *cobra.Command, newClient ClientFactory) (err error) { return } if !f.Initialized() { - return fn.NewUninitializedError(f.Root) + return fn.NewErrNotInitialized(f.Root) } if f, err = cfg.Configure(f); err != nil { // Updates f with deploy cfg return @@ -251,27 +251,11 @@ func runDeploy(cmd *cobra.Command, newClient ClientFactory) (err error) { // Informative non-error messages regarding the final deployment request printDeployMessages(cmd.OutOrStdout(), cfg) - // Client - // Concrete implementations (ex builder) vary based on final effective cfg. - var builder fn.Builder - if f.Build.Builder == builders.Pack { - builder = buildpacks.NewBuilder( - buildpacks.WithName(builders.Pack), - buildpacks.WithVerbose(cfg.Verbose), - buildpacks.WithTimestamp(cfg.Timestamp), - ) - } else if f.Build.Builder == builders.S2I { - builder = s2i.NewBuilder( - s2i.WithName(builders.S2I), - s2i.WithPlatform(cfg.Platform), - s2i.WithVerbose(cfg.Verbose)) - } else { - return builders.ErrUnknownBuilder{Name: f.Build.Builder, Known: KnownBuilders()} + clientOptions, err := cfg.clientOptions() + if err != nil { + return } - - client, done := newClient(ClientConfig{Namespace: f.Deploy.Namespace, Verbose: cfg.Verbose}, - fn.WithRegistry(cfg.Registry), - fn.WithBuilder(builder)) + client, done := newClient(ClientConfig{Namespace: f.Deploy.Namespace, Verbose: cfg.Verbose}, clientOptions...) defer done() // Deploy @@ -282,10 +266,12 @@ func runDeploy(cmd *cobra.Command, newClient ClientFactory) (err error) { return } } else { - if shouldBuild(cfg.Build, f, client) { // --build or "auto" with FS changes - if f, err = client.Build(cmd.Context(), f); err != nil { - return - } + var buildOptions []fn.BuildOption + if buildOptions, err = cfg.buildOptions(); err != nil { + return + } + if f, err = build(cmd, cfg.Build, f, client, buildOptions); err != nil { + return } if cfg.Push { if f, err = client.Push(cmd.Context(), f); err != nil { @@ -309,16 +295,30 @@ func runDeploy(cmd *cobra.Command, newClient ClientFactory) (err error) { return f.Stamp() } -// shouldBuild returns true if the value of the build option is a truthy value, -// or if it is the literal "auto" and the function reports as being currently -// unbuilt. Invalid errors are not reported as this is the purview of -// deployConfig.Validate -func shouldBuild(buildCfg string, f fn.Function, client *fn.Client) bool { - if buildCfg == "auto" { - return !f.Built() // first build or modified filesystem +// build when flag == 'auto' and the function is out-of-date, or when the +// flag value is explicitly truthy such as 'true' or '1'. Error if flag +// is neither 'auto' nor parseable as a boolean. Return CLI-specific error +// message verbeage suitable for both Deploy and Run commands which feature an +// optional build step. +func build(cmd *cobra.Command, flag string, f fn.Function, client *fn.Client, buildOptions []fn.BuildOption) (fn.Function, error) { + var err error + if flag == "auto" { + if f.Built() { + fmt.Fprintln(cmd.OutOrStdout(), "function up-to-date. Force rebuild with --build") + } else { + if f, err = client.Build(cmd.Context(), f, buildOptions...); err != nil { + return f, err + } + } + } else if build, _ := strconv.ParseBool(flag); build { + if f, err = client.Build(cmd.Context(), f, buildOptions...); err != nil { + return f, err + } + } else if _, err = strconv.ParseBool(flag); err != nil { + return f, fmt.Errorf("--build ($FUNC_BUILD) %q not recognized. Should be 'auto' or a truthy value such as 'true', 'false', '0', or '1'.", flag) + } - build, _ := strconv.ParseBool(buildCfg) - return build + return f, nil } func NewRegistryValidator(path string) survey.Validator { @@ -364,6 +364,19 @@ func KnownBuilders() builders.Known { // the set of builders enumerated in the builders pacakage. // However, future third-party integrations may support less than, or more // builders, and certain environmental considerations may alter this list. + + // Also a good place to stick feature-flags; to wit: + enable_host, _ := strconv.ParseBool(os.Getenv("FUNC_ENABLE_HOST_BUILDER")) + if !enable_host { + bb := []string{} + for _, b := range builders.All() { + if b != builders.Host { + bb = append(bb, b) + } + } + return bb + } + return builders.All() } @@ -431,6 +444,9 @@ type deployConfig struct { // (~/.kube/config) in the case of Kubernetes. Namespace string + //Service account to be used in deployed function + ServiceAccountName string + // Remote indicates the deployment (and possibly build) process are to // be triggered in a remote environment rather than run locally. Remote bool @@ -447,17 +463,18 @@ type deployConfig struct { // environment variables; in that precedence. func newDeployConfig(cmd *cobra.Command) (c deployConfig) { c = deployConfig{ - buildConfig: newBuildConfig(), - Build: viper.GetString("build"), - Env: viper.GetStringSlice("env"), - Domain: viper.GetString("domain"), - GitBranch: viper.GetString("git-branch"), - GitDir: viper.GetString("git-dir"), - GitURL: viper.GetString("git-url"), - Namespace: viper.GetString("namespace"), - Remote: viper.GetBool("remote"), - PVCSize: viper.GetString("pvc-size"), - Timestamp: viper.GetBool("build-timestamp"), + buildConfig: newBuildConfig(), + Build: viper.GetString("build"), + Env: viper.GetStringSlice("env"), + Domain: viper.GetString("domain"), + GitBranch: viper.GetString("git-branch"), + GitDir: viper.GetString("git-dir"), + GitURL: viper.GetString("git-url"), + Namespace: viper.GetString("namespace"), + Remote: viper.GetBool("remote"), + PVCSize: viper.GetString("pvc-size"), + Timestamp: viper.GetBool("build-timestamp"), + ServiceAccountName: viper.GetString("service-account"), } // NOTE: .Env should be viper.GetStringSlice, but this returns unparsed // results and appears to be an open issue since 2017: @@ -490,12 +507,16 @@ func (c deployConfig) Configure(f fn.Function) (fn.Function, error) { f.Build.Git.Revision = c.GitBranch // TODO: should match; perhaps "refSpec" f.Deploy.Namespace = c.Namespace f.Deploy.Remote = c.Remote - // Validate if PVC size can be parsed to quantity - _, err = resource.ParseQuantity(c.PVCSize) - if err != nil { - return f, fmt.Errorf("cannot parse the provided PVC size '%s' due to: %w", c.PVCSize, err) + f.Deploy.ServiceAccountName = c.ServiceAccountName + + // PVCSize + // If a specific value is requested, ensure it parses as a resource.Quantity + if c.PVCSize != "" { + if _, err = resource.ParseQuantity(c.PVCSize); err != nil { + return f, fmt.Errorf("cannot parse PVC size %q. %w", c.PVCSize, err) + } + f.Build.PVCSize = c.PVCSize } - f.Build.PVCSize = c.PVCSize // ImageDigest // Parsed off f.Image if provided. Deploying adds the ability to specify a diff --git a/cmd/deploy_test.go b/cmd/deploy_test.go index 8afc7c5fc5..1a27fd821a 100644 --- a/cmd/deploy_test.go +++ b/cmd/deploy_test.go @@ -1516,9 +1516,9 @@ func TestDeploy_UnsetFlag(t *testing.T) { } // Test_ValidateBuilder tests that the bulder validation accepts the -// accepts === the set of known builders. +// the set of known builders, and spot-checks an error is thrown for unknown. func Test_ValidateBuilder(t *testing.T) { - for _, name := range builders.All() { + for _, name := range KnownBuilders() { if err := ValidateBuilder(name); err != nil { t.Fatalf("expected builder '%v' to be valid, but got error: %v", name, err) } diff --git a/cmd/describe.go b/cmd/describe.go index 23cfee4f7f..d5419b8a2a 100644 --- a/cmd/describe.go +++ b/cmd/describe.go @@ -74,7 +74,7 @@ func runDescribe(cmd *cobra.Command, args []string, newClient ClientFactory) (er return } if !f.Initialized() { - return fn.NewUninitializedError(f.Root) + return fn.NewErrNotInitialized(f.Root) } // Use Function's Namespace with precedence // diff --git a/cmd/environment.go b/cmd/environment.go new file mode 100644 index 0000000000..52d388fe07 --- /dev/null +++ b/cmd/environment.go @@ -0,0 +1,185 @@ +package cmd + +import ( + "encoding/json" + "fmt" + "os" + "strings" + + "github.com/ory/viper" + "github.com/spf13/cobra" + "gopkg.in/yaml.v2" + + "knative.dev/func/pkg/builders/buildpacks" + "knative.dev/func/pkg/builders/s2i" + "knative.dev/func/pkg/config" + "knative.dev/func/pkg/functions" + "knative.dev/func/pkg/k8s" +) + +var format string = "json" + +func NewEnvironmentCmd(newClient ClientFactory, version *Version) *cobra.Command { + cmd := &cobra.Command{ + Use: "environment", + Short: "Display function execution environment information", + Long: ` +NAME + {{rootCmdUse}} environment - display function execution environment information + +SYNOPSIS + {{rootCmdUse}} environment [-e|--env-format] [-v|--verbose] + + +DESCRIPTION + Display information about the function execution environment, including + the version of func, the version of the function spec, the default builder, + available runtimes, and available templates. +`, + SuggestFor: []string{"env", "environemtn", "enviroment", "enviornment", "enviroment"}, + PreRunE: bindEnv("verbose", "format"), + RunE: func(cmd *cobra.Command, args []string) error { + return runEnvironment(cmd, newClient, version) + }, + } + cfg, err := config.NewDefault() + if err != nil { + fmt.Fprintf(cmd.OutOrStdout(), "error loading config at '%v'. %v\n", config.File(), err) + } + + cmd.Flags().StringP("format", "f", format, "Format of output environment information, 'json' or 'yaml'. ($FUNC_FORMAT)") + addVerboseFlag(cmd, cfg.Verbose) + + return cmd +} + +type Environment struct { + Version string + GitRevision string + SpecVersion string + SocatImage string + TarImage string + Languages []string + DefaultImageBuilders map[string]map[string]string + Templates map[string][]string + Environment []string + Cluster string + Defaults config.Global +} + +func runEnvironment(cmd *cobra.Command, newClient ClientFactory, v *Version) (err error) { + cfg, err := newEnvironmentConfig() + if err != nil { + return + } + + // Create a client to get runtimes and templates + client := functions.New(functions.WithVerbose(cfg.Verbose)) + + r, err := getRuntimes(client) + if err != nil { + return + } + t, err := getTemplates(client, r) + if err != nil { + return + } + + // Get all environment variables that start with FUNC_ + var envs []string + for _, e := range os.Environ() { + if strings.HasPrefix(e, "FUNC_") { + envs = append(envs, e) + } + } + + // If no environment variables are set, make sure we return an empty array + // otherwise the output is "null" instead of "[]" + if len(envs) == 0 { + envs = make([]string, 0) + } + + // Get global defaults + defaults, err := config.NewDefault() + if err != nil { + return + } + + // Gets the cluster host + var host string + cc, err := k8s.GetClientConfig().ClientConfig() + if err != nil { + fmt.Printf("error getting client config %v\n", err) + } else { + host = cc.Host + } + + //Get default image builders + builderimagesdefault := make(map[string]map[string]string) + builderimagesdefault["s2i"] = s2i.DefaultBuilderImages + builderimagesdefault["buildpacks"] = buildpacks.DefaultBuilderImages + + environment := Environment{ + Version: v.String(), + GitRevision: v.Hash, + SpecVersion: functions.LastSpecVersion(), + SocatImage: k8s.SocatImage, + TarImage: k8s.TarImage, + Languages: r, + DefaultImageBuilders: builderimagesdefault, + Templates: t, + Environment: envs, + Cluster: host, + Defaults: defaults, + } + + var s []byte + switch cfg.Format { + case "json": + s, err = json.MarshalIndent(environment, "", " ") + case "yaml": + s, err = yaml.Marshal(&environment) + default: + err = fmt.Errorf("unsupported format: %s", cfg.Format) + } + if err != nil { + return err + } + fmt.Fprintln(cmd.OutOrStdout(), string(s)) + + return nil +} + +func getRuntimes(client *functions.Client) ([]string, error) { + runtimes, err := client.Runtimes() + if err != nil { + return nil, err + } + return runtimes, nil +} + +func getTemplates(client *functions.Client, runtimes []string) (map[string][]string, error) { + templateMap := make(map[string][]string) + for _, runtime := range runtimes { + templates, err := client.Templates().List(runtime) + if err != nil { + return nil, err + } + templateMap[runtime] = templates + } + return templateMap, nil +} + +type environmentConfig struct { + Verbose bool + Format string +} + +func newEnvironmentConfig() (cfg environmentConfig, err error) { + cfg = environmentConfig{ + Verbose: viper.GetBool("verbose"), + Format: viper.GetString("format"), + } + + return +} diff --git a/cmd/func/main.go b/cmd/func/main.go index 335550fbc0..999a26e164 100644 --- a/cmd/func/main.go +++ b/cmd/func/main.go @@ -15,7 +15,7 @@ import ( ) // Statically-populated build metadata set by `make build`. -var date, vers, hash string +var vers, kver, hash string func main() { ctx, cancel := context.WithCancel(context.Background()) @@ -33,8 +33,8 @@ func main() { cfg := cmd.RootCommandConfig{ Name: "func", Version: cmd.Version{ - Date: date, Vers: vers, + Kver: kver, Hash: hash, }} diff --git a/cmd/invoke.go b/cmd/invoke.go index a6d66657c0..b44da82b51 100644 --- a/cmd/invoke.go +++ b/cmd/invoke.go @@ -149,7 +149,7 @@ func runInvoke(cmd *cobra.Command, args []string, newClient ClientFactory) (err return err } if !f.Initialized() { - return fn.NewUninitializedError(f.Root) + return fn.NewErrNotInitialized(f.Root) } // Client instance from env vars, flags, args and user prompts (if --confirm) @@ -182,24 +182,26 @@ func runInvoke(cmd *cobra.Command, args []string, newClient ClientFactory) (err return err } - // Always print a "Received response" message because a simple echo to - // stdout could be confusing on a first-time run, viewing a proper echo. - fmt.Println("Received response") - // When Verbose // - Print an explicit "Received response" indicator // - Print metadata (headers for HTTP requests, CloudEvents already include // metadata in their data value. if cfg.Verbose { + // Print a "Received response" message because a simple echo to + // stdout could be confusing on a first-time run, viewing a proper echo. + // user feedback suggests this actually be placed behind the --verbose + // setting: + fmt.Println("Function invoked. Response:") + if len(metadata) > 0 { - fmt.Println("Metadata:") + fmt.Println(" Metadata:") } for k, vv := range metadata { values := strings.Join(vv, ";") - fmt.Fprintf(cmd.OutOrStdout(), " %v: %v\n", k, values) + fmt.Fprintf(cmd.OutOrStdout(), " %v: %v\n", k, values) } if len(metadata) > 0 { - fmt.Println("Content:") + fmt.Println(" Content:") } } diff --git a/cmd/invoke_test.go b/cmd/invoke_test.go index dd4402f327..8995041fe2 100644 --- a/cmd/invoke_test.go +++ b/cmd/invoke_test.go @@ -9,6 +9,7 @@ import ( "os" "sync/atomic" "testing" + "time" fn "knative.dev/func/pkg/functions" "knative.dev/func/pkg/mock" @@ -28,7 +29,7 @@ func TestInvoke(t *testing.T) { // Mock Runner // Starts a service which sets invoked=1 on any request runner := mock.NewRunner() - runner.RunFn = func(ctx context.Context, f fn.Function) (job *fn.Job, err error) { + runner.RunFn = func(ctx context.Context, f fn.Function, _ time.Duration) (job *fn.Job, err error) { var ( l net.Listener h = http.NewServeMux() @@ -46,10 +47,10 @@ func TestInvoke(t *testing.T) { fmt.Fprintf(os.Stderr, "error serving: %v", err) } }() - _, port, _ := net.SplitHostPort(l.Addr().String()) + host, port, _ := net.SplitHostPort(l.Addr().String()) errs := make(chan error, 10) stop := func() error { _ = s.Close(); return nil } - return fn.NewJob(f, port, errs, stop, false) + return fn.NewJob(f, host, port, errs, stop, false) } // Run the mock http service function interloper diff --git a/cmd/list.go b/cmd/list.go index b6ff8da98d..f0d2ed5a02 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -35,7 +35,8 @@ Lists all deployed functions in a given namespace. # List all functions in all namespaces with JSON output {{rootCmdUse}} list --all-namespaces --output json `, - SuggestFor: []string{"ls", "lsit"}, + SuggestFor: []string{"lsit"}, + Aliases: []string{"ls"}, PreRunE: bindEnv("all-namespaces", "output", "namespace", "verbose"), RunE: func(cmd *cobra.Command, args []string) error { return runList(cmd, args, newClient) diff --git a/cmd/root.go b/cmd/root.go index 861c7787b0..2c143e67c2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -6,8 +6,8 @@ import ( "os" "path/filepath" "strings" - "time" + "github.com/Masterminds/semver" "github.com/ory/viper" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -90,6 +90,7 @@ Learn more about Knative at: https://knative.dev`, cfg.Name), NewLanguagesCmd(newClient), NewTemplatesCmd(newClient), NewRepositoryCmd(newClient), + NewEnvironmentCmd(newClient, &cfg.Version), }, }, { @@ -305,7 +306,7 @@ func addPathFlag(cmd *cobra.Command) { // addVerboseFlag ensures common text/wording when the --path flag is used func addVerboseFlag(cmd *cobra.Command, dflt bool) { - cmd.Flags().BoolP("verbose", "v", false, "Print verbose logs ($FUNC_VERBOSE)") + cmd.Flags().BoolP("verbose", "v", dflt, "Print verbose logs ($FUNC_VERBOSE)") } // cwd returns the current working directory or exits 1 printing the error. @@ -317,61 +318,50 @@ func cwd() (cwd string) { return cwd } +// Version information populated on build. type Version struct { - // Date of compilation - Date string // Version tag of the git commit, or 'tip' if no tag. Vers string + // Kver is the version of knative in which func was most recently + // If the build is not tagged as being released with a specific Knative + // build, this is the most recent version of knative along with a suffix + // consisting of the number of commits which have been added since it was + // included in Knative. + Kver string // Hash of the currently active git commit on build. Hash string // Verbose printing enabled for the string representation. Verbose bool } -// Return the stringification of the Version struct, which takes into account -// the verbosity setting. +// Return the stringification of the Version struct. func (v Version) String() string { if v.Verbose { return v.StringVerbose() } - - // Ensure that the value returned is parseable as a semver, with the special - // value v0.0.0 as the default indicating there is no version information - // available. - if strings.HasPrefix(v.Vers, "v") { - // TODO: this is the naive approach, perhaps consider actually parse it - // using the semver lib - return v.Vers - } - - // Any non-semver value is invalid, and thus indistinguishable from a - // nonexistent version value, so the default zero value of v0.0.0 is used. - return "v0.0.0" + _ = semver.MustParse(v.Vers) + return v.Vers } -// StringVerbose returns the verbose version of the version stringification. -// The format returned is [semver]-[hash]-[date] where the special value -// 'v0.0.0' and 'source' are used when version is not available and/or the -// libray has been built from source, respectively. +// StringVerbose returns the version along with extended version metadata. func (v Version) StringVerbose() string { var ( vers = v.Vers + kver = v.Kver hash = v.Hash - date = v.Date ) - if vers == "" { - vers = "v0.0.0" - } - if hash == "" { - hash = "source" - } - if date == "" { - date = time.Now().Format(time.RFC3339) + if strings.HasPrefix(kver, "knative-") { + kver = strings.Split(kver, "-")[1] } - funcVersion := fmt.Sprintf("%s-%s-%s", vers, hash, date) - return fmt.Sprintf("Version: %s\n"+ - "SocatImage: %s\n"+ - "TarImage: %s", funcVersion, + return fmt.Sprintf( + "Version: %s\n"+ + "Knative: %s\n"+ + "Commit: %s\n"+ + "SocatImage: %s\n"+ + "TarImage: %s\n", + vers, + kver, + hash, k8s.SocatImage, k8s.TarImage) } diff --git a/cmd/root_test.go b/cmd/root_test.go index e8fff30010..5baf9b8ae0 100644 --- a/cmd/root_test.go +++ b/cmd/root_test.go @@ -170,8 +170,8 @@ func TestVerbose(t *testing.T) { { name: "verbose as version's flag", args: []string{"version", "-v"}, - want: "Version: v0.42.0-cafe-1970-01-01", - wantLF: 3, + want: "Version: v0.42.0", + wantLF: 6, }, { name: "no verbose", @@ -189,9 +189,9 @@ func TestVerbose(t *testing.T) { cmd := NewRootCmd(RootCommandConfig{ Name: "func", Version: Version{ - Date: "1970-01-01", Vers: "v0.42.0", Hash: "cafe", + Kver: "v1.10.0", }}) cmd.SetArgs(tt.args) diff --git a/cmd/run.go b/cmd/run.go index 9734c9b414..fdad9a192f 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -7,13 +7,11 @@ import ( "os" "strconv" "strings" + "time" "github.com/ory/viper" "github.com/spf13/cobra" - "knative.dev/func/pkg/builders" - pack "knative.dev/func/pkg/builders/buildpacks" - "knative.dev/func/pkg/builders/s2i" "knative.dev/func/pkg/config" "knative.dev/func/pkg/docker" fn "knative.dev/func/pkg/functions" @@ -67,7 +65,7 @@ EXAMPLES $ {{rootCmdUse}} run --container=false `, SuggestFor: []string{"rnu"}, - PreRunE: bindEnv("build", "builder", "builder-image", "confirm", "env", "image", "registry", "path", "container", "verbose"), + PreRunE: bindEnv("build", "builder", "builder-image", "confirm", "container", "env", "image", "path", "registry", "start-timeout", "verbose"), RunE: func(cmd *cobra.Command, args []string) error { return runRun(cmd, args, newClient) }, @@ -105,6 +103,13 @@ EXAMPLES "Environment variable to set in the form NAME=VALUE. "+ "You may provide this flag multiple times for setting multiple environment variables. "+ "To unset, specify the environment variable name followed by a \"-\" (e.g., NAME-).") + cmd.Flags().Duration("start-timeout", f.Run.StartTimeout, fmt.Sprintf("time this function needs in order to start. If not provided, the client default %v will be in effect. ($FUNC_START_TIMEOUT)", fn.DefaultStartTimeout)) + + // TODO: Without the "Host" builder enabled, this code-path is unreachable, + // so remove hidden flag when either the Host builder path is available, + // or when containerized runs support start-timeout (and ideally both). + // Also remember to add it to the command help text's synopsis section. + _ = cmd.Flags().MarkHidden("start-timeout") // Static Flags: // Options which have static defaults only @@ -140,14 +145,14 @@ func runRun(cmd *cobra.Command, args []string, newClient ClientFactory) (err err if cfg, err = newRunConfig(cmd).Prompt(); err != nil { return } - if err = cfg.Validate(cmd); err != nil { + if f, err = fn.NewFunction(cfg.Path); err != nil { return } - if f, err = fn.NewFunction(cfg.Path); err != nil { + if err = cfg.Validate(cmd, f); err != nil { return } if !f.Initialized() { - return fn.NewUninitializedError(f.Root) + return fn.NewErrNotInitialized(f.Root) } if f, err = cfg.Configure(f); err != nil { // Updates f with deploy cfg return @@ -168,40 +173,37 @@ func runRun(cmd *cobra.Command, args []string, newClient ClientFactory) (err err } // Client - // - // Builder and runner implementations are based on the value of f.Build.Builder, and - // - o := []fn.Option{} - if f.Build.Builder == builders.Pack { - o = append(o, fn.WithBuilder(pack.NewBuilder( - pack.WithName(builders.Pack), - pack.WithVerbose(cfg.Verbose)))) - } else if f.Build.Builder == builders.S2I { - o = append(o, fn.WithBuilder(s2i.NewBuilder( - s2i.WithName(builders.S2I), - s2i.WithPlatform(cfg.Platform), - s2i.WithVerbose(cfg.Verbose)))) + clientOptions, err := cfg.clientOptions() + if err != nil { + return } if cfg.Container { - o = append(o, fn.WithRunner(docker.NewRunner(cfg.Verbose, os.Stdout, os.Stderr))) + clientOptions = append(clientOptions, fn.WithRunner(docker.NewRunner(cfg.Verbose, os.Stdout, os.Stderr))) + } + if cfg.StartTimeout != 0 { + clientOptions = append(clientOptions, fn.WithStartTimeout(cfg.StartTimeout)) } - client, done := newClient(ClientConfig{Verbose: cfg.Verbose}, o...) + client, done := newClient(ClientConfig{Verbose: cfg.Verbose}, clientOptions...) defer done() // Build // // If requesting to run via the container, build the container if it is // either out-of-date or a build was explicitly requested. - if cfg.Container && shouldBuild(cfg.Build, f, client) { - if f, err = client.Build(cmd.Context(), f); err != nil { - return + if cfg.Container { + buildOptions, err := cfg.buildOptions() + if err != nil { + return err + } + if f, err = build(cmd, cfg.Build, f, client, buildOptions); err != nil { + return err } } // Run // - // Runs the code either via a container or the default host-based runniner. + // Runs the code either via a container or the default host-based runner. // For the former, build is required and a container runtime. For the // latter, scaffolding is first applied and the local host must be // configured to build/run the language of the function. @@ -252,14 +254,19 @@ type runConfig struct { // Env variables. may include removals using a "-" Env []string + + // StartTimeout optionally adjusts the startup timeout from the client's + // default of fn.DefaultStartTimeout. + StartTimeout time.Duration } func newRunConfig(cmd *cobra.Command) (c runConfig) { c = runConfig{ - buildConfig: newBuildConfig(), - Build: viper.GetString("build"), - Env: viper.GetStringSlice("env"), - Container: viper.GetBool("container"), + buildConfig: newBuildConfig(), + Build: viper.GetString("build"), + Env: viper.GetStringSlice("env"), + Container: viper.GetBool("container"), + StartTimeout: viper.GetDuration("start-timeout"), } // NOTE: .Env should be viper.GetStringSlice, but this returns unparsed // results and appears to be an open issue since 2017: @@ -278,11 +285,13 @@ func (c runConfig) Configure(f fn.Function) (fn.Function, error) { var err error f = c.buildConfig.Configure(f) + f.Run.StartTimeout = c.StartTimeout + f.Run.Envs, err = applyEnvs(f.Run.Envs, c.Env) - return f, err // The other members; build, path, and container; are not part of function // state, so are not mentioned here in Configure. + return f, err } func (c runConfig) Prompt() (runConfig, error) { @@ -300,7 +309,7 @@ func (c runConfig) Prompt() (runConfig, error) { return c, nil } -func (c runConfig) Validate(cmd *cobra.Command) (err error) { +func (c runConfig) Validate(cmd *cobra.Command, f fn.Function) (err error) { // Bubble if err = c.buildConfig.Validate(); err != nil { return @@ -314,14 +323,21 @@ func (c runConfig) Validate(cmd *cobra.Command) (err error) { } // There is currently no local host runner implemented, so specifying - // --container=false should always return an informative error to the user - // such that they do not receive the rather cryptic "no runner defined" - // error from a Client instance which was instantiated with no runner. + // --container=false should return an informative error for runtimes other + // than Go that is more helpful than the cryptic, though correct, error + // from the Client that it was instantated without a runner. // TODO: modify this check when the local host runner is available to // only generate this error when --container==false && the --language is // not yet implemented. - if !c.Container { + if !c.Container && f.Runtime != "go" { return errors.New("the ability to run functions outside of a container via 'func run' is coming soon.") } + + // When the docker runner respects the StartTimeout, this validation check + // can be removed + if c.StartTimeout != 0 && c.Container { + return errors.New("the ability to specify the startup timeout for containerized runs is coming soon") + } + return } diff --git a/cmd/run_test.go b/cmd/run_test.go index 3039251d57..b7cd6b2d5e 100644 --- a/cmd/run_test.go +++ b/cmd/run_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "testing" + "time" fn "knative.dev/func/pkg/functions" "knative.dev/func/pkg/mock" @@ -105,7 +106,7 @@ func TestRun_Run(t *testing.T) { runner := mock.NewRunner() if tt.runError != nil { - runner.RunFn = func(context.Context, fn.Function) (*fn.Job, error) { return nil, tt.runError } + runner.RunFn = func(context.Context, fn.Function, time.Duration) (*fn.Job, error) { return nil, tt.runError } } builder := mock.NewBuilder() diff --git a/cmd/version.go b/cmd/version.go index 7afb39da10..d43095aaa6 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -26,7 +26,8 @@ DESCRIPTION o Print the functions version $ {{rootCmdUse}} version - o Print the functions version along with date and associated git commit hash. + o Print the functions version along with source git commit hash and other + metadata. $ {{rootCmdUse}} version -v `, diff --git a/docs/building-functions/on_cluster_build.md b/docs/building-functions/on_cluster_build.md index f5d6840f4b..937cbdaac1 100644 --- a/docs/building-functions/on_cluster_build.md +++ b/docs/building-functions/on_cluster_build.md @@ -8,29 +8,11 @@ This guide describes how you can build a Function on Cluster with Tekton Pipelin ## Prerequisite 1. Install Tekton Pipelines on the cluster. Please refer to [Tekton Pipelines documentation](https://github.com/tektoncd/pipeline/blob/main/docs/install.md) or run the following command: ```bash -kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.42.0/release.yaml +kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.49.0/release.yaml ``` ## Enabling a namespace to run Function related Tekton Pipelines -In each namespace that you would like to run Pipelines and deploy a Function you need to create or install the following resources. -1. Install the Git Clone Tekton Task to fetch the Function source code: -```bash -kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/master/task/git-clone/0.4/git-clone.yaml -``` -2. Install a Tekton Task responsible for building the Function, based on the builder preference (Buildpacks or S2I) - 1. For Buildpacks builder install the Functions Buildpacks Tekton Task: - ```bash - kubectl apply -f https://raw.githubusercontent.com/knative-extension/kn-plugin-func/main/pkg/pipelines/resources/tekton/task/func-buildpacks/0.1/func-buildpacks.yaml - ``` - 2. For S2I builder install the S2I task: - ```bash - kubectl apply -f https://raw.githubusercontent.com/knative-extension/kn-plugin-func/main/pkg/pipelines/resources/tekton/task/func-s2i/0.1/func-s2i.yaml - ``` -3. Install the `kn func` Deploy Tekton Task to be able to deploy the Function on in the Pipeline: -```bash -kubectl apply -f https://raw.githubusercontent.com/knative-extension/kn-plugin-func/main/pkg/pipelines/resources/tekton/task/func-deploy/0.1/func-deploy.yaml -``` -4. Add permission to deploy on Knative to `default` Service Account: (This is not needed on OpenShift) +Add permission to deploy on Knative to `default` Service Account: (This is not needed on OpenShift) ```bash export NAMESPACE= kubectl create clusterrolebinding $NAMESPACE:knative-serving-namespaced-admin \ @@ -52,12 +34,16 @@ git remote add origin git@github.com:my-repo/my-function.git ``` 4. Update the Function configuration in `func.yaml` to enable on cluster builds for the Git repository: ```yaml -build: git # required, specify `git` build type -git: - url: https://github.com/my-repo/my-function.git # required, git repository with the function source code - revision: main # optional, git revision to be used (branch, tag, commit) - # contextDir: myfunction # optional, needed only if the function is not located - # in the repository root folder +build: + git: + url: https://github.com/my-repo/my-function.git # required, git repository with the function source code + revision: main # optional, git revision to be used (branch, tag, commit) + # contextDir: myfunction # optional, needed only if the function is not located in the repository root folder + # builderImages: # optional, needed only if the runtime is golang + # pack: ghcr.io/boson-project/go-function-builder:tip + buildpacks: [] + builder: "" + buildEnvs: [] ``` 5. Implement the business logic of your Function, then commit and push changes ```bash @@ -88,10 +74,7 @@ Please provide credentials for image registry used by Pipeline. ```bash export NAMESPACE= kubectl delete clusterrolebinding $NAMESPACE:knative-serving-namespaced-admin -kubectl delete task.tekton.dev git-clone -kubectl delete task.tekton.dev func-buildpacks -kubectl delete task.tekton.dev func-s2i -kubectl delete task.tekton.dev func-deploy + ``` 2. Uninstall Tekton Pipelines ```bash diff --git a/docs/reference/func.md b/docs/reference/func.md index 1df7423b9b..b0267a209e 100644 --- a/docs/reference/func.md +++ b/docs/reference/func.md @@ -30,6 +30,7 @@ Learn more about Knative at: https://knative.dev * [func delete](func_delete.md) - Undeploy a function * [func deploy](func_deploy.md) - Deploy a function * [func describe](func_describe.md) - Describe a function +* [func environment](func_environment.md) - Display function execution environment information * [func invoke](func_invoke.md) - Invoke a local or remote function * [func languages](func_languages.md) - List available function language runtimes * [func list](func_list.md) - List deployed functions diff --git a/docs/reference/func_config_git_set.md b/docs/reference/func_config_git_set.md index afaaca5e4a..7e52b75c12 100644 --- a/docs/reference/func_config_git_set.md +++ b/docs/reference/func_config_git_set.md @@ -26,7 +26,7 @@ func config git set --gh-webhook-secret string GitHub Webhook Secret used for payload validation. If not specified, it will be generated automatically. -t, --git-branch string Git revision (branch) to be used when deploying via the Git repository ($FUNC_GIT_BRANCH) -d, --git-dir string Directory in the Git repository containing the function (default is the root) ($FUNC_GIT_DIR) - --git-provider string The type of the Git platform provider to setup webhook. This value is usually automatically generated from input URL, use this parameter to override this setting. Currently supported providers are "github". + --git-provider string The type of the Git platform provider to setup webhook. This value is usually automatically generated from input URL, use this parameter to override this setting. Currently supported providers are "github" and "gitlab". -g, --git-url string Repository url containing the function to build ($FUNC_GIT_URL) -h, --help help for set -i, --image string Full image name in the form [registry]/[namespace]/[name]:[tag]@[digest]. This option takes precedence over --registry. Specifying digest is optional, but if it is given, 'build' and 'push' phases are disabled. ($FUNC_IMAGE) diff --git a/docs/reference/func_deploy.md b/docs/reference/func_deploy.md index 7e147aa0a1..61e985baec 100644 --- a/docs/reference/func_deploy.md +++ b/docs/reference/func_deploy.md @@ -12,8 +12,8 @@ SYNOPSIS func deploy [-R|--remote] [-r|--registry] [-i|--image] [-n|--namespace] [-e|--env] [-g|--git-url] [-t|--git-branch] [-d|--git-dir] [-b|--build] [--builder] [--builder-image] [-p|--push] - [--domain] [--platform] [--build-timestamp] - [-c|--confirm] [-v|--verbose] + [--domain] [--platform] [--build-timestamp] [--pvc-size] + [--service-account] [-c|--confirm] [-v|--verbose] DESCRIPTION @@ -112,26 +112,27 @@ func deploy ### Options ``` - --build string[="true"] Build the function. [auto|true|false]. ($FUNC_BUILD) (default "auto") - --build-timestamp Use the actual time as the created time for the docker image. This is only useful for buildpacks builder. - -b, --builder string Builder to use when creating the function's container. Currently supported builders are "pack" and "s2i". (default "pack") - --builder-image string Specify a custom builder image for use by the builder other than its default. ($FUNC_BUILDER_IMAGE) - -c, --confirm Prompt to confirm options interactively ($FUNC_CONFIRM) - --domain string Domain to use for the function's route. Cluster must be configured with domain matching for the given domain (ignored if unrecognized) ($FUNC_DOMAIN) - -e, --env stringArray Environment variable to set in the form NAME=VALUE. You may provide this flag multiple times for setting multiple environment variables. To unset, specify the environment variable name followed by a "-" (e.g., NAME-). - -t, --git-branch string Git revision (branch) to be used when deploying via the Git repository ($FUNC_GIT_BRANCH) - -d, --git-dir string Directory in the Git repository containing the function (default is the root) ($FUNC_GIT_DIR) - -g, --git-url string Repository url containing the function to build ($FUNC_GIT_URL) - -h, --help help for deploy - -i, --image string Full image name in the form [registry]/[namespace]/[name]:[tag]@[digest]. This option takes precedence over --registry. Specifying digest is optional, but if it is given, 'build' and 'push' phases are disabled. ($FUNC_IMAGE) - -n, --namespace string Deploy into a specific namespace. Will use function's current namespace by default if already deployed, and the currently active namespace if it can be determined. ($FUNC_NAMESPACE) - -p, --path string Path to the function. Default is current directory ($FUNC_PATH) - --platform string Optionally specify a specific platform to build for (e.g. linux/amd64). ($FUNC_PLATFORM) - -u, --push Push the function image to registry before deploying. ($FUNC_PUSH) (default true) - --pvc-size string Configure the PVC size used by a pipeline during remote build. (default "256Mi") - -r, --registry string Container registry + registry namespace. (ex 'ghcr.io/myuser'). The full image name is automatically determined using this along with function name. ($FUNC_REGISTRY) - --remote Trigger a remote deployment. Default is to deploy and build from the local system ($FUNC_REMOTE) - -v, --verbose Print verbose logs ($FUNC_VERBOSE) + --build string[="true"] Build the function. [auto|true|false]. ($FUNC_BUILD) (default "auto") + --build-timestamp Use the actual time as the created time for the docker image. This is only useful for buildpacks builder. + -b, --builder string Builder to use when creating the function's container. Currently supported builders are "pack" and "s2i". (default "pack") + --builder-image string Specify a custom builder image for use by the builder other than its default. ($FUNC_BUILDER_IMAGE) + -c, --confirm Prompt to confirm options interactively ($FUNC_CONFIRM) + --domain string Domain to use for the function's route. Cluster must be configured with domain matching for the given domain (ignored if unrecognized) ($FUNC_DOMAIN) + -e, --env stringArray Environment variable to set in the form NAME=VALUE. You may provide this flag multiple times for setting multiple environment variables. To unset, specify the environment variable name followed by a "-" (e.g., NAME-). + -t, --git-branch string Git revision (branch) to be used when deploying via the Git repository ($FUNC_GIT_BRANCH) + -d, --git-dir string Directory in the Git repository containing the function (default is the root) ($FUNC_GIT_DIR) + -g, --git-url string Repository url containing the function to build ($FUNC_GIT_URL) + -h, --help help for deploy + -i, --image string Full image name in the form [registry]/[namespace]/[name]:[tag]@[digest]. This option takes precedence over --registry. Specifying digest is optional, but if it is given, 'build' and 'push' phases are disabled. ($FUNC_IMAGE) + -n, --namespace string Deploy into a specific namespace. Will use function's current namespace by default if already deployed, and the currently active namespace if it can be determined. ($FUNC_NAMESPACE) + -p, --path string Path to the function. Default is current directory ($FUNC_PATH) + --platform string Optionally specify a specific platform to build for (e.g. linux/amd64). ($FUNC_PLATFORM) + -u, --push Push the function image to registry before deploying. ($FUNC_PUSH) (default true) + --pvc-size string When triggering a remote deployment, set a custom volume size to allocate for the build operation ($FUNC_PVC_SIZE) + -r, --registry string Container registry + registry namespace. (ex 'ghcr.io/myuser'). The full image name is automatically determined using this along with function name. ($FUNC_REGISTRY) + -R, --remote Trigger a remote deployment. Default is to deploy and build from the local system ($FUNC_REMOTE) + --service-account string Service account to be used in the deployed function ($FUNC_SERVICE_ACCOUNT) + -v, --verbose Print verbose logs ($FUNC_VERBOSE) ``` ### SEE ALSO diff --git a/docs/reference/func_environment.md b/docs/reference/func_environment.md new file mode 100644 index 0000000000..f0256ffa00 --- /dev/null +++ b/docs/reference/func_environment.md @@ -0,0 +1,36 @@ +## func environment + +Display function execution environment information + +### Synopsis + + +NAME + func environment - display function execution environment information + +SYNOPSIS + func environment [-e|--env-format] [-v|--verbose] + + +DESCRIPTION + Display information about the function execution environment, including + the version of func, the version of the function spec, the default builder, + available runtimes, and available templates. + + +``` +func environment +``` + +### Options + +``` + -f, --format string Format of output environment information, 'json' or 'yaml'. ($FUNC_FORMAT) (default "json") + -h, --help help for environment + -v, --verbose Print verbose logs ($FUNC_VERBOSE) +``` + +### SEE ALSO + +* [func](func.md) - func manages Knative Functions + diff --git a/docs/reference/func_version.md b/docs/reference/func_version.md index 52d40e5d15..3091eddf2f 100644 --- a/docs/reference/func_version.md +++ b/docs/reference/func_version.md @@ -18,7 +18,8 @@ DESCRIPTION o Print the functions version $ func version - o Print the functions version along with date and associated git commit hash. + o Print the functions version along with source git commit hash and other + metadata. $ func version -v diff --git a/docs/reference/func_yaml.md b/docs/reference/func_yaml.md index 1787fe5c07..01fadb4b42 100644 --- a/docs/reference/func_yaml.md +++ b/docs/reference/func_yaml.md @@ -121,6 +121,14 @@ subsequent deployments. The Kubernetes namespace where your function will be deployed. + +### `serviceAccountName` + +The name of the service account used for the function pod. The service account +must exist in the namespace to succeed. + +More info: https://k8s.io/docs/tasks/configure-pod-container/configure-service-account + ### `options` Options allows you to set specific configuration for the deployed function, allowing you to tweak Knative Service options related to autoscaling and other properties. If these options are not set, the Knative defaults will be used. - `scale` diff --git a/generate/templates/main.go b/generate/templates/main.go index 45ec4848de..f29ceb4f34 100644 --- a/generate/templates/main.go +++ b/generate/templates/main.go @@ -80,7 +80,7 @@ func main() { if err != nil { return err } - _, err = w.Write([]byte(symlinkTarget)) + _, err = w.Write([]byte(filepath.ToSlash(symlinkTarget))) return err case info.Mode()&fs.ModeType == 0: // regular file f, err := os.Open(path) diff --git a/generate/zz_filesystem_generated.go b/generate/zz_filesystem_generated.go index e7d032c3c6..b826144962 100644 --- a/generate/zz_filesystem_generated.go +++ b/generate/zz_filesystem_generated.go @@ -3,5877 +3,9987 @@ package generate var TemplatesZip = []byte{ 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x52, 0x45, - 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x8c, 0x93, 0x4f, 0x4f, 0xdc, 0x3c, 0x10, 0xc6, 0xef, 0xfe, 0x14, 0x23, 0x71, 0x01, 0x69, 0x95, 0xbc, 0xe8, 0x15, 0x95, 0xda, 0x73, 0xbb, 0xb4, 0x97, - 0x0a, 0xb1, 0x54, 0x95, 0xb8, 0x90, 0x89, 0x3d, 0x49, 0x46, 0xeb, 0xd8, 0x91, 0x67, 0xcc, 0x12, 0x3e, 0x7d, 0xe5, 0x2c, 0x1b, 0x40, 0xe2, 0xc0, 0x31, 0x76, 0xe6, 0xcf, 0xf3, 0x3c, 0x3f, 0x9f, - 0xc1, 0x1d, 0x8d, 0x93, 0x47, 0x25, 0x31, 0xe6, 0xec, 0x0c, 0x6e, 0xd0, 0xee, 0xb1, 0xe7, 0xd0, 0x1b, 0xf3, 0x77, 0xa0, 0x00, 0x79, 0x72, 0xe5, 0x0e, 0x30, 0x11, 0x8c, 0xe8, 0x08, 0x34, 0x82, - 0x0e, 0x24, 0x04, 0x7a, 0xaa, 0xdb, 0x94, 0x83, 0x19, 0xc6, 0x2c, 0x0a, 0x2d, 0xc1, 0xb4, 0x74, 0x20, 0x07, 0xe7, 0x42, 0x89, 0xd1, 0xf3, 0x33, 0x39, 0x40, 0x01, 0x84, 0xeb, 0x08, 0xed, 0xac, - 0x04, 0x98, 0x12, 0xce, 0x17, 0xa6, 0x9d, 0x21, 0xe5, 0x10, 0x38, 0xf4, 0xd0, 0x8c, 0xb8, 0x27, 0xe8, 0x29, 0x50, 0x42, 0xa5, 0xfa, 0xf9, 0xf9, 0xa1, 0x63, 0x4f, 0x32, 0x8b, 0xd2, 0xf8, 0x70, - 0x3a, 0x76, 0x55, 0x1f, 0x9b, 0x0d, 0x60, 0x70, 0x60, 0x07, 0xb2, 0xfb, 0x52, 0xc8, 0xa1, 0x0c, 0x87, 0x44, 0x92, 0xbd, 0x62, 0x50, 0x68, 0xaa, 0xfa, 0x33, 0x6d, 0xa0, 0x5c, 0x54, 0x8b, 0xe2, - 0x9f, 0xf1, 0x00, 0xac, 0x70, 0x88, 0x69, 0x2f, 0xc6, 0xdc, 0x0d, 0xf4, 0xae, 0xc7, 0xaa, 0xb2, 0x01, 0xc7, 0x89, 0xac, 0xc6, 0x34, 0x83, 0x8d, 0x41, 0x91, 0x83, 0x14, 0x45, 0x53, 0x8a, 0x7d, - 0xc2, 0x11, 0x74, 0x40, 0x5d, 0x15, 0xc8, 0x67, 0xf7, 0xa8, 0x96, 0x81, 0xe5, 0x16, 0x1c, 0x75, 0x1c, 0x48, 0xde, 0x58, 0x04, 0x8f, 0x98, 0x18, 0x5b, 0x4f, 0x10, 0x70, 0x24, 0x07, 0xcd, 0x1a, - 0xd5, 0x3d, 0x4f, 0x2f, 0xa5, 0xeb, 0x2f, 0xeb, 0x4e, 0xf7, 0xbf, 0x6e, 0x20, 0xd1, 0x94, 0x48, 0x28, 0x28, 0x2a, 0xc7, 0x00, 0xb1, 0x5b, 0x5c, 0x5a, 0xb5, 0xbc, 0x4a, 0x39, 0x36, 0xf9, 0x68, - 0x24, 0x4b, 0xa9, 0x09, 0x90, 0x85, 0x5c, 0x09, 0x9d, 0x83, 0x14, 0x83, 0x19, 0x95, 0x80, 0x9e, 0xa6, 0x98, 0x94, 0x1c, 0xf4, 0x3e, 0xb6, 0xe8, 0x5f, 0x8b, 0x9a, 0x2e, 0x07, 0x5b, 0x46, 0x56, - 0x3f, 0xc6, 0x96, 0x9c, 0x23, 0xb7, 0xae, 0xbc, 0xdd, 0x35, 0x1b, 0x73, 0x18, 0xd8, 0x0e, 0xc0, 0xe3, 0xe4, 0x69, 0xa4, 0xa0, 0x02, 0xa5, 0xa7, 0xc3, 0xe4, 0x8a, 0x93, 0x1c, 0x94, 0x52, 0x87, - 0xb6, 0xb8, 0xd7, 0x49, 0x75, 0x4b, 0xe8, 0xbe, 0x73, 0xda, 0xee, 0x9a, 0x25, 0xf2, 0x72, 0xb4, 0x53, 0xd4, 0xed, 0xae, 0x39, 0xe6, 0x76, 0xbb, 0x68, 0x43, 0x4f, 0xc6, 0xfc, 0x09, 0xca, 0x1e, - 0x24, 0xdb, 0x01, 0x94, 0x47, 0x2a, 0xb4, 0xd1, 0x32, 0xbf, 0x20, 0x22, 0xc5, 0x04, 0x0b, 0x28, 0x42, 0x2a, 0x05, 0x98, 0x96, 0x03, 0x26, 0x26, 0x29, 0x12, 0x39, 0x58, 0x9f, 0x1d, 0xb9, 0x17, - 0x90, 0x4c, 0x8b, 0x42, 0xd0, 0xf4, 0x11, 0xda, 0xcc, 0xde, 0x35, 0x70, 0xd2, 0x83, 0x9e, 0x75, 0x2e, 0x44, 0x13, 0x0c, 0xaa, 0x93, 0x7c, 0xab, 0xeb, 0x9e, 0x75, 0xc8, 0x6d, 0x65, 0xe3, 0x58, - 0xf7, 0xd1, 0x63, 0xe8, 0xeb, 0x3e, 0xd6, 0x2c, 0x92, 0x49, 0xea, 0xff, 0xaf, 0xbe, 0x5e, 0xfd, 0x77, 0x61, 0x0e, 0x04, 0x81, 0x8e, 0xf6, 0x65, 0x21, 0x88, 0x39, 0x81, 0xcd, 0xa2, 0x71, 0x84, - 0xd3, 0xd3, 0x38, 0xe6, 0x23, 0x36, 0xf1, 0xa4, 0x70, 0xfe, 0x21, 0x78, 0xf5, 0x88, 0x1c, 0x0a, 0x2b, 0x17, 0x95, 0x31, 0xbf, 0x51, 0xf9, 0x91, 0x8a, 0x5b, 0xaf, 0x02, 0x39, 0x68, 0x8a, 0x2e, - 0xdb, 0xa3, 0x8a, 0xeb, 0x08, 0x97, 0xd5, 0xe5, 0x17, 0xb0, 0x31, 0x7b, 0x57, 0xde, 0xe3, 0x12, 0x60, 0x17, 0x13, 0xd0, 0x13, 0xd9, 0xac, 0x4b, 0x4e, 0x8b, 0x05, 0xf3, 0xc6, 0x0c, 0xf1, 0x40, - 0x8f, 0x94, 0x0a, 0xff, 0x16, 0x43, 0x88, 0xfa, 0xae, 0xc0, 0x73, 0x9b, 0xb0, 0x30, 0xb2, 0x8d, 0x09, 0xf0, 0xf4, 0x09, 0x6f, 0x54, 0x9d, 0xb6, 0x3d, 0x3e, 0x6e, 0x89, 0x39, 0xd9, 0x42, 0xa2, - 0x5b, 0x71, 0x2c, 0xfb, 0xbd, 0x43, 0xaf, 0x32, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd5, 0x5f, 0x62, 0x3f, 0x47, 0x02, 0x00, 0x00, 0x72, 0x04, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, - 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x54, 0x92, 0xcf, 0x6e, 0xdb, 0x3c, 0x10, 0xc4, 0xef, 0x7c, - 0x8a, 0xf9, 0x9c, 0x83, 0x63, 0xe0, 0x93, 0x94, 0xdc, 0x02, 0x5d, 0xd3, 0xa4, 0xbd, 0x14, 0x2d, 0xd0, 0x00, 0x6d, 0x91, 0x06, 0x15, 0x4d, 0xae, 0x2d, 0x26, 0xd4, 0xae, 0xc0, 0x3f, 0x4e, 0x8d, - 0xa2, 0xef, 0x5e, 0x90, 0x8e, 0x1b, 0xe7, 0xc8, 0xd9, 0xe5, 0xce, 0x8f, 0xc3, 0x3d, 0xc3, 0x7b, 0xc1, 0xb5, 0x97, 0x6c, 0x71, 0xb3, 0x23, 0x4e, 0x11, 0xb7, 0x99, 0x4d, 0x72, 0xc2, 0x4a, 0x7d, - 0x25, 0x6f, 0x64, 0x22, 0x24, 0xc1, 0x5e, 0x72, 0x00, 0xd3, 0x73, 0xe9, 0x3e, 0x36, 0xfc, 0x87, 0xbb, 0x91, 0xb0, 0x16, 0xe7, 0x29, 0xcc, 0x5e, 0x27, 0xc2, 0xe6, 0xa5, 0x02, 0x23, 0x96, 0x60, - 0x34, 0x63, 0x4d, 0xd8, 0x48, 0x66, 0x0b, 0xc7, 0xb8, 0x1f, 0x8e, 0xf5, 0x76, 0x2b, 0xc3, 0xc3, 0xf9, 0xc9, 0x69, 0xd5, 0xe2, 0x6e, 0x74, 0xaf, 0xde, 0x08, 0x14, 0x67, 0x61, 0x1b, 0x8b, 0xf7, - 0xfd, 0x29, 0xde, 0xc3, 0xf9, 0x98, 0xd2, 0x1c, 0xfb, 0xae, 0x33, 0x45, 0xa5, 0x2a, 0xb6, 0x4e, 0xba, 0x55, 0xab, 0xd4, 0xd9, 0x19, 0xde, 0xd1, 0x8e, 0xbc, 0xcc, 0x13, 0x71, 0x52, 0xea, 0xe5, - 0x50, 0xc1, 0x37, 0xa4, 0x53, 0x0e, 0x14, 0xb1, 0xde, 0x43, 0x5b, 0xeb, 0x78, 0x0b, 0x8d, 0x44, 0x31, 0x55, 0x8b, 0x7f, 0x68, 0x3f, 0x8b, 0xf4, 0x96, 0xef, 0x28, 0xad, 0xb0, 0x91, 0x00, 0xd2, - 0x66, 0x3c, 0x0e, 0xfb, 0x1f, 0x9a, 0x2d, 0x8c, 0xf0, 0xc6, 0x85, 0x09, 0x2e, 0xe1, 0x59, 0xc2, 0x53, 0xc4, 0xb3, 0x4b, 0x23, 0x86, 0xad, 0xd4, 0xf1, 0x43, 0x5b, 0x38, 0x66, 0x2f, 0xfb, 0x43, - 0x88, 0x66, 0xd4, 0xbc, 0xa5, 0x88, 0x1c, 0x0b, 0x42, 0xf5, 0x85, 0xad, 0xf5, 0xa1, 0x05, 0xbe, 0x4b, 0xae, 0xb9, 0x69, 0x1f, 0x05, 0x8e, 0x77, 0xf2, 0x44, 0x87, 0x6b, 0x47, 0x18, 0x65, 0x5d, - 0x20, 0x93, 0xfc, 0xbe, 0xbc, 0x23, 0x64, 0xe6, 0x32, 0xa5, 0x38, 0x57, 0xcf, 0x3a, 0x2d, 0x64, 0x1e, 0x2a, 0x58, 0x1a, 0x89, 0x8f, 0x3e, 0x26, 0x07, 0x3f, 0xf4, 0x4a, 0x0d, 0xc3, 0x60, 0x84, - 0xa3, 0x78, 0x52, 0x45, 0x42, 0xb3, 0x43, 0xf3, 0x0d, 0x9f, 0x3f, 0x7d, 0xb9, 0x43, 0x63, 0xb1, 0xfc, 0xbd, 0x98, 0x28, 0x46, 0xbd, 0xa5, 0x45, 0x8f, 0xc5, 0x48, 0xde, 0xcb, 0xe2, 0xcf, 0x12, - 0x3f, 0x14, 0xd0, 0x7c, 0x58, 0x5e, 0x0b, 0x27, 0xe2, 0xd4, 0xa4, 0xfd, 0x4c, 0x3d, 0xf4, 0x3c, 0x7b, 0x67, 0x74, 0x81, 0xea, 0x1e, 0xa3, 0xf0, 0x6b, 0x1b, 0x35, 0xce, 0xf6, 0xb8, 0x3c, 0x15, - 0xa2, 0xe4, 0x60, 0xa8, 0x47, 0xfd, 0xb4, 0xa6, 0xfe, 0x5a, 0x43, 0xbf, 0xf4, 0x34, 0x7b, 0x7a, 0xd3, 0x96, 0xd7, 0x8f, 0x64, 0x52, 0x8f, 0x1b, 0x33, 0x4a, 0x09, 0xb6, 0xf8, 0x9d, 0x36, 0x1c, - 0xac, 0x3f, 0xee, 0xeb, 0x32, 0xbc, 0xb9, 0x39, 0x93, 0xd9, 0x51, 0x88, 0x4e, 0xb8, 0xc7, 0x65, 0x7b, 0x71, 0xa8, 0x95, 0x5d, 0xe9, 0xbb, 0xce, 0x8b, 0xd1, 0x7e, 0x94, 0x98, 0xfa, 0xab, 0x8b, - 0xab, 0x8b, 0xae, 0x84, 0xa0, 0xd4, 0xad, 0x04, 0x4c, 0x52, 0x3e, 0x31, 0x12, 0xe1, 0x3e, 0x8d, 0x04, 0x23, 0x05, 0x28, 0x11, 0xac, 0x98, 0x5c, 0x56, 0xa8, 0xbe, 0xee, 0xe1, 0x7c, 0x79, 0xdc, - 0xb9, 0xad, 0x4b, 0x63, 0x5e, 0xb7, 0x46, 0xa6, 0xee, 0x89, 0x75, 0x72, 0x3b, 0xea, 0x4a, 0xe4, 0x5d, 0x0a, 0x44, 0xdd, 0xa4, 0x1d, 0x77, 0x56, 0x4c, 0x5c, 0xae, 0x94, 0xfa, 0x1b, 0x00, 0x00, - 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x27, 0x80, 0x38, 0xa2, 0xec, 0x01, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6f, 0xac, 0x55, 0x41, 0x6f, 0xe3, 0x36, 0x13, 0x3d, 0x5b, 0xbf, 0x62, 0xa0, - 0xc3, 0xf7, 0xd9, 0x81, 0x2b, 0x01, 0x3d, 0xee, 0x6d, 0x9b, 0xcd, 0x62, 0x7b, 0xe8, 0xa6, 0x48, 0xd3, 0x43, 0x4f, 0x0d, 0x43, 0x8e, 0x25, 0x62, 0x29, 0x8e, 0x4a, 0x8e, 0xec, 0x18, 0x41, 0xfe, - 0x7b, 0x31, 0xa4, 0x2c, 0x2b, 0xce, 0xda, 0x9b, 0x43, 0x4f, 0x12, 0x87, 0xc3, 0x79, 0x8f, 0xc3, 0xc7, 0xc7, 0xba, 0x86, 0x5e, 0xe9, 0x6f, 0xaa, 0x41, 0xd8, 0x0c, 0x5e, 0xb3, 0x25, 0x0f, 0x36, - 0x82, 0xf2, 0x80, 0x4f, 0xaa, 0xeb, 0x1d, 0x02, 0x6d, 0x40, 0xc1, 0xe7, 0x69, 0x4e, 0x62, 0x1d, 0x7a, 0x56, 0x69, 0xb8, 0x6b, 0xad, 0x6e, 0x8b, 0xba, 0x86, 0x80, 0xb1, 0x27, 0x6f, 0x22, 0x30, - 0xc1, 0xb5, 0xa3, 0xc1, 0xdc, 0x6c, 0xd1, 0x73, 0xac, 0x8a, 0xba, 0x96, 0xe9, 0xfb, 0xd6, 0xc6, 0x09, 0xc8, 0xab, 0x0e, 0x41, 0x2b, 0x0f, 0x8f, 0x08, 0xba, 0x55, 0xbe, 0x41, 0x03, 0xbb, 0x16, - 0x3d, 0x0c, 0xd1, 0xfa, 0x06, 0xb8, 0x45, 0x28, 0x5b, 0x8a, 0x5c, 0xc2, 0xe3, 0x60, 0x9d, 0xc1, 0x20, 0x15, 0x96, 0x2a, 0xa6, 0x35, 0x32, 0xdb, 0x91, 0x19, 0x1c, 0x82, 0xf5, 0xd0, 0x50, 0xd5, - 0x91, 0x59, 0x15, 0xa7, 0x7b, 0x28, 0x0a, 0xdb, 0xf5, 0x14, 0x18, 0x96, 0xc5, 0xa2, 0xd4, 0xe4, 0x19, 0x9f, 0xb8, 0x2c, 0x16, 0xe5, 0xa6, 0xe3, 0xb2, 0x28, 0x16, 0x65, 0x63, 0xb9, 0x1d, 0x1e, - 0x2b, 0x4d, 0x5d, 0xad, 0x85, 0x2d, 0x26, 0xb6, 0x75, 0x34, 0xdf, 0x7e, 0x6a, 0xa8, 0xde, 0xfe, 0x5c, 0xa7, 0x40, 0x59, 0xac, 0x0a, 0xc1, 0xfe, 0x6d, 0xff, 0x79, 0xd6, 0x9b, 0x3d, 0x0d, 0x61, - 0x02, 0xfa, 0x7f, 0x3c, 0x69, 0x49, 0x35, 0x6d, 0x37, 0x72, 0x18, 0xf2, 0xa2, 0xef, 0x6c, 0xb8, 0x2a, 0x78, 0xdf, 0xe3, 0xbc, 0x72, 0x4e, 0x7f, 0x7e, 0x49, 0x88, 0x5f, 0x71, 0x07, 0x9a, 0x7c, - 0x8e, 0xa5, 0xe3, 0xb0, 0x3e, 0xb2, 0xf2, 0x3a, 0x9d, 0xc7, 0x2b, 0x06, 0x15, 0xc0, 0xaf, 0x2c, 0xbc, 0xb4, 0x72, 0x0e, 0x0d, 0xa0, 0xd2, 0x2d, 0xb0, 0xed, 0x10, 0x94, 0x54, 0xf2, 0xb8, 0x3b, - 0x9e, 0x6c, 0xc4, 0xb0, 0xb5, 0x1a, 0x53, 0x76, 0x40, 0xc5, 0x68, 0x2a, 0xc8, 0x64, 0xa7, 0x94, 0x6e, 0x88, 0x2c, 0x3c, 0x85, 0xb3, 0x81, 0xf2, 0x2b, 0xee, 0xca, 0x35, 0x28, 0xad, 0xb1, 0xe7, - 0x54, 0x8e, 0x40, 0x85, 0x66, 0x90, 0xed, 0x0a, 0x2d, 0x03, 0x01, 0x79, 0x08, 0xfe, 0x94, 0xa1, 0x1a, 0xb7, 0x33, 0x04, 0xcc, 0x1a, 0x01, 0x7c, 0x92, 0xf3, 0x88, 0x40, 0x3e, 0x25, 0x70, 0x8b, - 0x52, 0x2e, 0x0e, 0xbd, 0x84, 0xd1, 0xc0, 0x17, 0xe5, 0x8d, 0x43, 0x88, 0xb6, 0xf1, 0x4a, 0x96, 0xc5, 0xaa, 0x10, 0x4e, 0xd2, 0x89, 0xe5, 0x0a, 0xae, 0x66, 0x8d, 0x7a, 0x2e, 0x16, 0x23, 0xe8, - 0xff, 0x8e, 0xd1, 0xe7, 0x97, 0x22, 0x77, 0x6e, 0xac, 0xa3, 0x20, 0xe0, 0x3f, 0x03, 0x46, 0x1e, 0x45, 0xf5, 0xaa, 0x65, 0x13, 0xd5, 0x83, 0x3c, 0x6f, 0x27, 0x52, 0xb0, 0x21, 0xe7, 0x68, 0x27, - 0x4b, 0x3a, 0xe4, 0x96, 0xcc, 0x8c, 0x11, 0x78, 0xc4, 0xac, 0xf0, 0x47, 0x3c, 0x9e, 0x3a, 0x1a, 0xd8, 0x50, 0x48, 0x00, 0x52, 0x6a, 0xc2, 0x60, 0x82, 0xc8, 0x2a, 0xf0, 0x87, 0x8c, 0xb1, 0xc8, - 0xc4, 0x96, 0xab, 0xf9, 0x3f, 0x60, 0x08, 0x14, 0x66, 0x91, 0x51, 0xaa, 0xd5, 0x75, 0xfe, 0xae, 0x2e, 0x4c, 0xbd, 0x59, 0x9b, 0x24, 0x5b, 0xa5, 0x7b, 0xb7, 0x3a, 0x13, 0xfe, 0x11, 0xde, 0x1a, - 0xce, 0x14, 0xb9, 0x98, 0x77, 0x91, 0x09, 0x5c, 0xcd, 0x46, 0xe7, 0x72, 0x96, 0xf3, 0xa4, 0x75, 0xae, 0xf7, 0x7e, 0xf8, 0x33, 0x08, 0x97, 0x17, 0x9d, 0x83, 0x7c, 0x2d, 0x87, 0x38, 0xb3, 0xc5, - 0x99, 0x10, 0x0e, 0x97, 0xe4, 0x7b, 0x22, 0x38, 0x7a, 0x50, 0x5d, 0x4f, 0x22, 0x18, 0xc5, 0xbc, 0xdc, 0xcc, 0x95, 0xbc, 0x82, 0x03, 0x53, 0x7e, 0x82, 0xb7, 0x6c, 0xdf, 0xc1, 0x57, 0xee, 0x42, - 0x7d, 0x55, 0x2c, 0xe0, 0x0a, 0xfe, 0xba, 0xfd, 0xf3, 0x0e, 0xae, 0x6f, 0x3f, 0xdd, 0xc0, 0x97, 0x9b, 0xbb, 0x1b, 0x09, 0xa5, 0xf0, 0x7d, 0xd8, 0x43, 0x18, 0xbc, 0x17, 0x41, 0x3f, 0x34, 0x04, - 0x8c, 0x91, 0x1f, 0x2a, 0x80, 0x8f, 0xc6, 0x40, 0x47, 0x01, 0x53, 0x00, 0x54, 0x72, 0x35, 0xd0, 0x64, 0x92, 0xab, 0x3e, 0xb4, 0x89, 0xd7, 0xdf, 0x32, 0x57, 0x35, 0xf4, 0x50, 0x49, 0xa9, 0xba, - 0x28, 0x16, 0x9b, 0x8e, 0xab, 0xdf, 0x83, 0xf5, 0xec, 0xfc, 0xb2, 0xbc, 0x43, 0x8d, 0x76, 0x2b, 0x8e, 0x93, 0xbc, 0x72, 0xf5, 0x7a, 0x1a, 0x57, 0x50, 0xd7, 0x80, 0xba, 0x25, 0x69, 0x82, 0x23, - 0xad, 0x1c, 0xd0, 0xc0, 0xfd, 0xc0, 0xc7, 0xeb, 0x8b, 0x6b, 0xf0, 0xd6, 0xcd, 0xf3, 0x92, 0x87, 0x85, 0xf1, 0x2a, 0xdf, 0xdf, 0x7e, 0xba, 0xfd, 0x00, 0x7f, 0x48, 0xff, 0xe6, 0x43, 0xea, 0x8f, - 0xa3, 0x8f, 0xce, 0x6e, 0xf1, 0x38, 0xbc, 0x43, 0x65, 0xf6, 0x73, 0x1b, 0xc8, 0x4f, 0x19, 0xf5, 0xd2, 0x6e, 0xe5, 0x0e, 0x57, 0x3a, 0x3b, 0xd2, 0x68, 0xc8, 0x43, 0x44, 0x23, 0xd0, 0xd3, 0x59, - 0x42, 0x4c, 0xbf, 0xf3, 0xcb, 0x1c, 0x61, 0x67, 0xb9, 0x05, 0x67, 0x99, 0xe5, 0x45, 0x0c, 0x62, 0x83, 0x91, 0x15, 0x63, 0xb2, 0xc0, 0xce, 0x7a, 0xdb, 0x29, 0x97, 0x5a, 0x29, 0x7d, 0x16, 0xe7, - 0xb1, 0x21, 0xd5, 0x8a, 0x15, 0xc0, 0x2f, 0x7b, 0x29, 0x25, 0x96, 0x83, 0xca, 0x80, 0x6e, 0x89, 0xc6, 0x67, 0x6e, 0xf6, 0x24, 0x4a, 0x31, 0xab, 0x27, 0xbc, 0x75, 0xb2, 0x49, 0x21, 0xb8, 0xa1, - 0x80, 0x72, 0x6c, 0xd9, 0x2e, 0xa7, 0x27, 0x81, 0x42, 0x42, 0xce, 0x03, 0xe9, 0xab, 0xb3, 0x1e, 0x0d, 0xa8, 0x47, 0xda, 0x62, 0xb2, 0x74, 0x84, 0x28, 0x8f, 0xce, 0x5b, 0x0f, 0x53, 0xe1, 0xc4, - 0x78, 0x5b, 0x0c, 0x28, 0x02, 0xd8, 0xa1, 0x73, 0xeb, 0xbc, 0xf7, 0x7d, 0xda, 0x2e, 0x0d, 0xdc, 0x26, 0x4b, 0x1c, 0x51, 0x7a, 0xb2, 0x9e, 0x31, 0x40, 0xc8, 0xe7, 0x1e, 0x0e, 0xe6, 0x99, 0x94, - 0xfd, 0x1f, 0x28, 0x39, 0x57, 0x83, 0xfa, 0x54, 0xcb, 0x22, 0xbd, 0x6c, 0xa1, 0x97, 0xe5, 0x27, 0x8b, 0xdf, 0xa9, 0x40, 0x49, 0xfd, 0xa1, 0x08, 0xeb, 0x1a, 0x5e, 0x8a, 0x7f, 0x03, 0x00, 0x00, - 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xcf, 0xe8, 0xdf, 0xc0, 0x6e, 0x03, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x5c, 0x90, 0x41, 0x8b, 0xdb, 0x30, 0x10, - 0x85, 0xcf, 0x9a, 0x5f, 0x31, 0x15, 0x94, 0x48, 0xc5, 0xb5, 0xa0, 0xc7, 0x42, 0x0e, 0x6d, 0x77, 0x4b, 0x7b, 0xe9, 0x65, 0xf3, 0x07, 0x14, 0x69, 0x62, 0x8b, 0x38, 0x92, 0x91, 0xc6, 0xd9, 0x5d, - 0xca, 0xfe, 0xf7, 0x32, 0x4e, 0x1a, 0xc2, 0x9e, 0x6c, 0x3f, 0x3f, 0xbe, 0x79, 0xef, 0xcd, 0x3e, 0x1c, 0xfd, 0x40, 0x78, 0x58, 0x72, 0xe0, 0x54, 0x32, 0x40, 0x3a, 0xcd, 0xa5, 0x32, 0x1a, 0x50, - 0x3a, 0x94, 0xcc, 0xf4, 0xc2, 0x1a, 0x94, 0x66, 0x6a, 0x9c, 0xf2, 0xa0, 0x01, 0x94, 0x1e, 0x12, 0x8f, 0xcb, 0xbe, 0x0f, 0xe5, 0xe4, 0xc2, 0x54, 0x96, 0x48, 0x67, 0xca, 0xdc, 0x5c, 0x8b, 0xc7, - 0xcf, 0x43, 0x71, 0xe7, 0x2f, 0x6e, 0x15, 0x34, 0x58, 0x00, 0xe7, 0x70, 0x47, 0x8d, 0x7f, 0xf9, 0x1c, 0x27, 0x42, 0xca, 0x6d, 0xa9, 0xd4, 0x90, 0x47, 0xcf, 0x78, 0xd5, 0x7c, 0x08, 0x34, 0x73, - 0x43, 0x8f, 0x67, 0x3f, 0xa5, 0x88, 0x3f, 0x84, 0xf8, 0x28, 0x00, 0x7c, 0x4e, 0x3c, 0x96, 0x85, 0x91, 0x6a, 0x2d, 0xb5, 0x07, 0x89, 0x78, 0x47, 0x33, 0x8c, 0x9f, 0xae, 0xa9, 0xfa, 0x9d, 0xc5, - 0xbf, 0xa0, 0x9c, 0xc3, 0x6f, 0xad, 0xd1, 0x69, 0x3f, 0x11, 0x28, 0xc2, 0xaf, 0x5b, 0x5c, 0x83, 0xf4, 0x7f, 0xe8, 0xd9, 0x58, 0x50, 0xd4, 0x3f, 0x11, 0xff, 0x7e, 0x30, 0x3a, 0x45, 0xfd, 0xff, - 0x73, 0xf7, 0x3a, 0x93, 0xd1, 0xfc, 0x3a, 0xd3, 0x4d, 0x7a, 0x2a, 0x4b, 0x0d, 0x64, 0x74, 0x5b, 0x9f, 0x37, 0xf9, 0xc1, 0xb3, 0x37, 0x5a, 0xe6, 0x70, 0xf3, 0xe4, 0x53, 0xd6, 0x1d, 0xea, 0xe8, - 0xd9, 0x6b, 0x0b, 0x97, 0xcb, 0x81, 0x41, 0x51, 0x18, 0x4b, 0x27, 0x79, 0xe5, 0xf8, 0x35, 0xe6, 0x75, 0xc4, 0xfe, 0xbb, 0x0f, 0xc7, 0xa1, 0x96, 0x25, 0x47, 0x63, 0x3b, 0x24, 0x0b, 0x2a, 0x1d, - 0x56, 0xeb, 0x87, 0x2d, 0xe6, 0x34, 0x49, 0x01, 0xc5, 0xfd, 0x4f, 0xcf, 0x7e, 0x32, 0x54, 0xab, 0x05, 0xf5, 0x06, 0xb7, 0x4e, 0x95, 0x2f, 0xf6, 0x30, 0x16, 0xdc, 0xde, 0xfb, 0x1f, 0x65, 0x9b, - 0x83, 0xd1, 0x95, 0x02, 0xa5, 0x33, 0xc5, 0xf5, 0xd7, 0x65, 0x7f, 0x8b, 0xce, 0xe1, 0xc1, 0xa7, 0x09, 0x4b, 0x16, 0x59, 0x80, 0x02, 0x69, 0x5c, 0x53, 0x1e, 0x8c, 0xb0, 0xfa, 0xb5, 0x95, 0xb5, - 0x92, 0xe1, 0xd2, 0xe6, 0x1d, 0x96, 0x47, 0xc2, 0x1b, 0x7a, 0xc5, 0x22, 0xbd, 0xcc, 0x14, 0x98, 0x22, 0x8a, 0x1f, 0xb9, 0xe0, 0x9e, 0x70, 0x23, 0xef, 0x9b, 0x0e, 0x87, 0xc2, 0xb8, 0xf9, 0xd8, - 0x36, 0xba, 0xc3, 0x7b, 0xbc, 0x5c, 0x7e, 0x83, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x04, 0xc0, 0xd1, 0x11, 0xc2, - 0x30, 0x08, 0x00, 0xd0, 0x7f, 0xa6, 0x60, 0x01, 0x83, 0xa9, 0x4e, 0x24, 0x60, 0xe4, 0x6c, 0xe1, 0x4c, 0x20, 0xf3, 0xfb, 0xae, 0x90, 0x3a, 0x15, 0xdf, 0xe5, 0x9c, 0x16, 0x0e, 0x30, 0x02, 0x7b, - 0xeb, 0x4f, 0x80, 0xa9, 0xbf, 0xb2, 0xa9, 0x38, 0x2c, 0x3f, 0xf5, 0x6a, 0x1c, 0x17, 0xf1, 0x19, 0x25, 0xba, 0xd5, 0x73, 0xd1, 0x92, 0xef, 0x6d, 0x04, 0xed, 0x03, 0xf7, 0xd1, 0xfa, 0xa3, 0xdd, - 0x91, 0x08, 0xcd, 0xc5, 0xa6, 0x72, 0xc2, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa3, 0xb7, 0x09, 0xae, 0x51, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, - 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, - 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, - 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, - 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, - 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, - 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, - 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, - 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x54, 0x90, 0x41, 0x6f, 0xd3, 0x40, 0x10, 0x85, 0xef, 0xfb, 0x2b, 0x1e, 0xca, 0xa1, 0x8d, 0x94, 0xda, 0x77, 0x38, 0x82, 0x0a, 0x95, 0x90, 0xe0, 0x10, 0x89, - 0x43, 0x55, 0xe1, 0xcd, 0xee, 0x38, 0x5e, 0x75, 0x3d, 0x63, 0x76, 0xc6, 0x89, 0xf2, 0xef, 0xd1, 0x9a, 0xb8, 0xa1, 0x37, 0xcf, 0xf3, 0xf8, 0xf3, 0x37, 0x6f, 0x83, 0x6f, 0xfb, 0xfd, 0x4f, 0x3c, - 0xce, 0x1c, 0x2c, 0x09, 0xe3, 0x89, 0xd5, 0x3c, 0x07, 0x72, 0xee, 0x17, 0xe5, 0x20, 0x23, 0xc1, 0x04, 0x17, 0x99, 0x0b, 0x98, 0xce, 0xf8, 0x2a, 0x6f, 0x9b, 0x1f, 0xb0, 0x1f, 0x08, 0x07, 0x49, - 0x99, 0xca, 0x94, 0xbd, 0x11, 0xfa, 0x95, 0x11, 0x24, 0x12, 0x82, 0x67, 0x1c, 0x08, 0xbd, 0xcc, 0x1c, 0x91, 0xd8, 0x3d, 0x77, 0xeb, 0xfb, 0xe6, 0x28, 0xdd, 0xcb, 0xfd, 0x7f, 0xd3, 0xb6, 0xc1, - 0x7e, 0x48, 0x7a, 0x93, 0x28, 0xa4, 0x93, 0x70, 0xd4, 0xfa, 0xef, 0x45, 0xaf, 0xd0, 0x9f, 0x99, 0xd4, 0xb4, 0x71, 0x6e, 0xb3, 0xc1, 0x17, 0x3a, 0x51, 0x96, 0x69, 0x24, 0x36, 0xe7, 0xae, 0xc3, - 0xa2, 0xd7, 0x93, 0xb7, 0xb9, 0x90, 0xe2, 0x70, 0x81, 0x8f, 0x31, 0xf1, 0x11, 0x1e, 0x46, 0x6a, 0x15, 0x74, 0x13, 0xf8, 0x5d, 0xa3, 0xf7, 0x16, 0x6b, 0xb4, 0x45, 0x2f, 0xc5, 0x91, 0x0f, 0xc3, - 0x0a, 0xdb, 0xc1, 0x73, 0x44, 0x10, 0xee, 0x53, 0x19, 0x91, 0x0c, 0x67, 0x29, 0xaf, 0x8a, 0x73, 0xb2, 0x01, 0xdd, 0x51, 0x16, 0x7c, 0xd7, 0x38, 0xf7, 0x83, 0x03, 0xfd, 0x2b, 0xea, 0xad, 0x87, - 0xa4, 0x98, 0xbc, 0x6a, 0xd5, 0xa8, 0x5b, 0xba, 0x43, 0xa4, 0x29, 0xcb, 0xa5, 0x52, 0xe6, 0x25, 0x5e, 0x94, 0xae, 0x69, 0xd7, 0xa0, 0x56, 0xea, 0x96, 0xac, 0xc3, 0xe7, 0xef, 0x4f, 0xf0, 0x59, - 0x05, 0xd2, 0xf7, 0x54, 0x14, 0x4a, 0x27, 0x2a, 0x3e, 0x43, 0x6c, 0xa0, 0xb2, 0xf0, 0x96, 0xf3, 0x38, 0x22, 0xde, 0xea, 0x40, 0x90, 0x71, 0xf4, 0x1c, 0xf5, 0x13, 0x94, 0xae, 0x28, 0x3c, 0x3c, - 0x0c, 0x94, 0xa7, 0xae, 0x5e, 0x86, 0x51, 0x0a, 0x35, 0xce, 0x3d, 0x5e, 0x1f, 0x77, 0x75, 0x0d, 0xcf, 0x36, 0x50, 0xfd, 0x72, 0xca, 0x64, 0x84, 0x28, 0x61, 0xae, 0x2c, 0x5f, 0x6f, 0x78, 0xb9, - 0xbf, 0x1b, 0xcc, 0x26, 0xfd, 0xd8, 0xb6, 0xc7, 0x64, 0xc3, 0x7c, 0x68, 0x82, 0x8c, 0xed, 0x2b, 0x7b, 0x4b, 0x27, 0x6a, 0x2b, 0xbe, 0xb5, 0x42, 0xd4, 0x8e, 0x3e, 0x71, 0x1b, 0x25, 0xe8, 0xdd, - 0xd6, 0x39, 0xf7, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x32, 0xa2, 0x9d, 0xb2, 0x62, 0x01, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6f, 0xac, 0x56, 0xcf, 0x6e, 0x1b, 0xbf, 0x11, 0x3e, 0x47, 0x4f, 0x31, 0xd0, - 0xa1, 0x95, 0x0c, 0x41, 0x7a, 0x86, 0x5f, 0x03, 0x18, 0xe9, 0xa1, 0x41, 0x90, 0x14, 0x28, 0x8a, 0xb6, 0x87, 0x59, 0x72, 0x76, 0x97, 0x08, 0x97, 0xb3, 0x19, 0x92, 0x92, 0x05, 0x23, 0xef, 0x5e, - 0x0c, 0x49, 0xad, 0xd6, 0xb1, 0xe1, 0xdf, 0x25, 0x27, 0x5b, 0x4b, 0x72, 0xfe, 0x7d, 0xdf, 0x7c, 0x33, 0xa7, 0x13, 0xcc, 0x68, 0xbe, 0xe3, 0x40, 0xd0, 0xe7, 0x60, 0x92, 0xe3, 0x00, 0x2e, 0x02, - 0x06, 0xa0, 0x27, 0x9c, 0x66, 0x4f, 0xc0, 0x3d, 0x20, 0x3c, 0x2e, 0x67, 0xfa, 0x6d, 0xa2, 0x90, 0x50, 0x7f, 0x1e, 0x37, 0xa7, 0xd3, 0xe6, 0x74, 0x82, 0x7f, 0x8e, 0x2e, 0x2e, 0x76, 0x02, 0x4e, - 0x04, 0x06, 0x03, 0x74, 0x04, 0x66, 0xc4, 0x30, 0x90, 0x85, 0xcb, 0x48, 0x01, 0x72, 0x74, 0x61, 0x80, 0x34, 0x12, 0x6c, 0x47, 0x8e, 0x69, 0x0b, 0x5d, 0x76, 0xde, 0x92, 0xa8, 0x85, 0x1d, 0xc6, - 0xf2, 0x46, 0x4f, 0x27, 0xb6, 0xd9, 0x37, 0x3b, 0x2e, 0xc0, 0xc0, 0xc7, 0x89, 0xed, 0x7e, 0xf3, 0x6b, 0x9c, 0x9b, 0x8d, 0x9b, 0x66, 0x96, 0x04, 0xbb, 0xcd, 0x87, 0xad, 0xe1, 0x90, 0xe8, 0x29, - 0x6d, 0x37, 0x1f, 0xb6, 0xfd, 0x54, 0xfe, 0x04, 0x4a, 0xa7, 0x31, 0xa5, 0x79, 0xbb, 0xd9, 0x6f, 0xd4, 0xc3, 0x3f, 0xae, 0x8f, 0xab, 0x04, 0xd5, 0xcf, 0x92, 0xf0, 0x2c, 0x7c, 0x76, 0x96, 0x2c, - 0x74, 0x57, 0x48, 0x9a, 0x8a, 0x77, 0x9d, 0xa0, 0x5c, 0x8f, 0x4b, 0x6e, 0x31, 0x49, 0x36, 0x29, 0xcb, 0x9b, 0xd9, 0x1d, 0x37, 0xe9, 0x3a, 0xd3, 0xda, 0x41, 0xbd, 0xfe, 0xfc, 0xb3, 0x38, 0xfe, - 0x4c, 0x17, 0x30, 0x1c, 0xea, 0xb7, 0x52, 0x5a, 0x17, 0x62, 0xc2, 0x60, 0x4a, 0x6d, 0xaf, 0x9c, 0x65, 0x89, 0xe4, 0x08, 0xf0, 0xf7, 0xa4, 0xe1, 0x19, 0xf4, 0x9e, 0x2c, 0x10, 0x9a, 0x11, 0x92, - 0x9b, 0x08, 0x10, 0x02, 0x5d, 0xd4, 0xda, 0xfa, 0xed, 0x8b, 0x24, 0x22, 0xc9, 0xd9, 0x19, 0x2a, 0xaf, 0x85, 0x30, 0x91, 0x3d, 0x42, 0x0d, 0x7e, 0xb9, 0x32, 0xe5, 0x98, 0x34, 0x6e, 0xcd, 0xc1, - 0xaa, 0xb1, 0xed, 0x67, 0xba, 0x6c, 0x0f, 0x80, 0xc6, 0xd0, 0x9c, 0x20, 0x30, 0xa0, 0x0c, 0x59, 0xd1, 0x8d, 0x07, 0xc0, 0x60, 0x41, 0x28, 0x65, 0x09, 0x80, 0xab, 0xfc, 0x2f, 0xa3, 0x33, 0x23, - 0xd0, 0x93, 0x56, 0x3e, 0x02, 0x26, 0xf0, 0x84, 0x31, 0xa9, 0x31, 0x84, 0x4f, 0x18, 0xac, 0x27, 0x98, 0x28, 0x8d, 0x6c, 0x61, 0xa7, 0x16, 0x78, 0x56, 0xcf, 0xe8, 0xfd, 0x15, 0x30, 0x5c, 0x6f, - 0x41, 0xa3, 0xb5, 0xae, 0x7e, 0x6f, 0x97, 0x23, 0x58, 0x8a, 0x46, 0x5c, 0x57, 0xe3, 0x72, 0x95, 0x08, 0x86, 0xa7, 0x12, 0x0c, 0x74, 0xe4, 0xf9, 0xb2, 0x3f, 0x6e, 0x34, 0x13, 0xad, 0xe7, 0x6e, - 0x0f, 0x0f, 0xab, 0x72, 0x3f, 0x6f, 0x3e, 0xb4, 0x48, 0xff, 0x72, 0xff, 0xfa, 0xfc, 0x73, 0x53, 0xeb, 0xdf, 0xa2, 0x42, 0x10, 0xfa, 0x91, 0x29, 0xa6, 0xc6, 0xc3, 0x17, 0x85, 0x5f, 0xca, 0xda, - 0x7c, 0xec, 0xfa, 0xb5, 0x83, 0x7d, 0xb3, 0xb1, 0x33, 0xe9, 0x09, 0x1a, 0xd3, 0x8e, 0x1f, 0xeb, 0xdf, 0x03, 0x08, 0x45, 0x50, 0xa2, 0x1d, 0xbf, 0x52, 0x9c, 0x39, 0x44, 0xfa, 0x97, 0xb8, 0x44, - 0xa2, 0x07, 0x3f, 0xe0, 0xa1, 0x9d, 0x14, 0xcf, 0x7b, 0x8d, 0xb4, 0x9f, 0xd2, 0xf1, 0x8b, 0xb8, 0x90, 0x7c, 0xd8, 0x6d, 0xdb, 0x01, 0x08, 0x19, 0x72, 0x67, 0xb2, 0xdb, 0x7d, 0xbd, 0xf0, 0x38, - 0xeb, 0x8d, 0x7e, 0x27, 0x14, 0x0f, 0xf0, 0xea, 0xd6, 0x7f, 0xc3, 0x76, 0xdf, 0x92, 0xfb, 0x96, 0x50, 0xd6, 0x8c, 0xd1, 0x46, 0xa3, 0x33, 0x09, 0xe0, 0xeb, 0xdc, 0xa0, 0x10, 0x19, 0x45, 0xa9, - 0xd1, 0x1a, 0xf7, 0xcb, 0x8d, 0xf9, 0x89, 0x2b, 0xf3, 0xcb, 0xf9, 0x0d, 0x41, 0x14, 0x02, 0xf4, 0xfe, 0xce, 0x8a, 0x42, 0x0a, 0x0a, 0x67, 0x27, 0x1c, 0xf4, 0x03, 0x9c, 0x51, 0x1c, 0x76, 0x9e, - 0xa2, 0x1a, 0xab, 0xd4, 0xc0, 0x79, 0xf6, 0xd7, 0xc5, 0xde, 0x8a, 0xd9, 0x8f, 0x2c, 0xd0, 0x51, 0x4a, 0xb4, 0x2a, 0xbb, 0xb2, 0x08, 0x3b, 0xe7, 0x5d, 0xba, 0x1e, 0x20, 0x51, 0xbc, 0xfd, 0x28, - 0x7c, 0x52, 0x02, 0x72, 0x97, 0x63, 0x0a, 0x14, 0xe3, 0x01, 0x5c, 0xc9, 0x93, 0x82, 0xe1, 0x2c, 0x38, 0xd4, 0x98, 0x73, 0xa4, 0xea, 0xa7, 0x45, 0xdc, 0xb3, 0x14, 0x36, 0xc7, 0x02, 0xf1, 0xa2, - 0x14, 0xa7, 0x93, 0xc2, 0xd6, 0xbb, 0x21, 0x4b, 0xd1, 0x2d, 0x10, 0x4c, 0x23, 0x09, 0xa4, 0x11, 0x03, 0x78, 0xe6, 0xef, 0xe5, 0x36, 0xcb, 0xdb, 0xb9, 0x01, 0x0b, 0xf4, 0x1e, 0x87, 0x58, 0xf4, - 0xe0, 0x4d, 0x7e, 0x14, 0x18, 0xde, 0xa6, 0x07, 0xca, 0x10, 0x61, 0xc2, 0xf9, 0x3f, 0x31, 0x89, 0x0b, 0xc3, 0xff, 0xea, 0x9f, 0x3d, 0x90, 0x08, 0x0b, 0x3c, 0xab, 0x49, 0x80, 0x17, 0xa4, 0x58, - 0x78, 0xfd, 0xad, 0x82, 0xb5, 0xdd, 0xd7, 0x4b, 0x8d, 0xe3, 0xc1, 0x79, 0xfd, 0x7d, 0xc3, 0x9f, 0xe7, 0x3f, 0x83, 0x5f, 0x51, 0xe5, 0x79, 0xbe, 0xa3, 0x5e, 0x54, 0x61, 0xc2, 0x2b, 0x8c, 0x38, - 0xcf, 0x14, 0x4a, 0xe6, 0x42, 0x18, 0x39, 0x44, 0x88, 0x59, 0x31, 0xd4, 0x96, 0xd3, 0x9a, 0x08, 0x45, 0x33, 0x92, 0xca, 0xb1, 0x05, 0x0e, 0x89, 0x01, 0xc1, 0xba, 0xbe, 0x27, 0xd1, 0x02, 0x05, - 0xb6, 0x74, 0x50, 0x7b, 0xf5, 0x6e, 0x9e, 0xad, 0xaa, 0x0e, 0x5c, 0x5c, 0x1a, 0xab, 0x5e, 0x91, 0xc0, 0x99, 0x24, 0x3a, 0x0e, 0x07, 0xad, 0xa1, 0xab, 0xcd, 0x1f, 0xf2, 0xd4, 0x91, 0xa8, 0x14, - 0xbc, 0x62, 0x68, 0xa1, 0x91, 0xbb, 0x39, 0x8f, 0x06, 0xd5, 0xaf, 0xe5, 0x4b, 0x00, 0x9b, 0x49, 0xf1, 0xf6, 0x7c, 0x01, 0xcf, 0xb8, 0x48, 0x9b, 0x8e, 0x2a, 0x18, 0x98, 0x2d, 0xcc, 0x1e, 0x4d, - 0xb9, 0x62, 0x3c, 0x61, 0xc8, 0xb3, 0xd2, 0x47, 0xad, 0x09, 0xa1, 0x2a, 0x14, 0x15, 0xf9, 0x11, 0x8a, 0x9c, 0xc5, 0x50, 0xbc, 0xcb, 0x18, 0x99, 0xa4, 0xaf, 0x3a, 0x82, 0x09, 0x43, 0x2e, 0x42, - 0x25, 0x54, 0x5e, 0x2c, 0xe5, 0x5a, 0x10, 0x5f, 0xe3, 0xcd, 0xf3, 0x5b, 0x70, 0x2f, 0xb0, 0xae, 0xc0, 0x6a, 0x48, 0xfd, 0xe1, 0xdd, 0x99, 0xda, 0x6c, 0xbd, 0xa9, 0xe2, 0x8d, 0xb6, 0xad, 0x73, - 0xbc, 0xe7, 0x4b, 0x54, 0x61, 0xd2, 0x88, 0x26, 0x16, 0x02, 0x4b, 0xa4, 0xdd, 0xe4, 0x82, 0x75, 0x06, 0x93, 0x72, 0x1d, 0x8b, 0xd6, 0xfe, 0x22, 0x5e, 0x11, 0x50, 0xad, 0x97, 0xaa, 0xe8, 0xa3, - 0x1e, 0xb3, 0x4f, 0xa0, 0x9f, 0xb4, 0x75, 0x7e, 0x19, 0xda, 0x2d, 0xb4, 0x08, 0x49, 0x32, 0x95, 0x82, 0xf7, 0xaf, 0xc6, 0xa1, 0x29, 0xcf, 0x22, 0x04, 0x4e, 0x60, 0x09, 0xad, 0x67, 0xf3, 0x9d, - 0x6c, 0x69, 0x49, 0x6d, 0x09, 0x8d, 0x4f, 0x8a, 0xda, 0x29, 0x12, 0x7f, 0x80, 0xc9, 0x31, 0xf1, 0x54, 0x6c, 0xbd, 0x74, 0x55, 0xf4, 0xfe, 0xde, 0x9e, 0xca, 0xb9, 0x8e, 0xb4, 0x6b, 0xfb, 0xec, - 0xeb, 0x52, 0xb0, 0x22, 0x6a, 0x1c, 0x39, 0x7b, 0x5b, 0x7c, 0x76, 0xd4, 0x7a, 0x36, 0x3a, 0x4b, 0xa2, 0x9e, 0x6b, 0xf5, 0xfa, 0x02, 0xa3, 0xa5, 0x99, 0x82, 0x55, 0x0a, 0xb6, 0xa1, 0x17, 0x9b, - 0x54, 0xb9, 0x33, 0x15, 0xa6, 0x71, 0xe9, 0x6e, 0xad, 0x60, 0x35, 0xa3, 0x41, 0x3d, 0x81, 0xe7, 0xc1, 0x99, 0x77, 0x40, 0x2d, 0x08, 0xbd, 0x8d, 0xea, 0xae, 0x63, 0xf6, 0x87, 0x0a, 0xee, 0xfe, - 0xd6, 0xb4, 0x0d, 0x62, 0x2d, 0xe3, 0xe1, 0x65, 0x57, 0x7e, 0x25, 0xb4, 0xd7, 0xf7, 0xb0, 0x3e, 0xd4, 0xe4, 0x97, 0x6a, 0x91, 0x3d, 0xc0, 0xc5, 0x79, 0x0f, 0x14, 0xa2, 0x4e, 0xd9, 0x1b, 0xce, - 0x6d, 0x64, 0xd5, 0xfc, 0xb4, 0x30, 0x13, 0x5a, 0xaa, 0xe2, 0x4a, 0xcb, 0x52, 0xf6, 0xd7, 0xb8, 0x8c, 0xb6, 0xb1, 0xcc, 0x29, 0x81, 0x1c, 0x92, 0xf3, 0xeb, 0xd2, 0x57, 0x63, 0x75, 0x68, 0x6b, - 0xc0, 0xef, 0x94, 0xa1, 0x04, 0xff, 0x5b, 0xca, 0xd0, 0x26, 0xef, 0x7b, 0x9c, 0x6f, 0x9b, 0x54, 0x8e, 0x55, 0xcf, 0x97, 0x82, 0x40, 0x2c, 0xff, 0x2e, 0xe4, 0xa8, 0x03, 0x46, 0x95, 0xc5, 0xbb, - 0x94, 0x74, 0x2d, 0x15, 0xdd, 0x57, 0x62, 0xc2, 0x44, 0x75, 0x57, 0x99, 0x5c, 0x70, 0x13, 0xfa, 0x32, 0x45, 0xaa, 0x74, 0xfd, 0xc8, 0x4e, 0x8a, 0xb1, 0x78, 0x04, 0xf8, 0xdb, 0xf5, 0x6e, 0xdc, - 0x85, 0x41, 0xcd, 0xa5, 0xf5, 0xd6, 0xaa, 0x96, 0x9c, 0x59, 0xfc, 0x1d, 0x80, 0x43, 0xdd, 0xf3, 0x7a, 0x16, 0x1a, 0xb8, 0xed, 0x23, 0x6d, 0x8b, 0xd3, 0x29, 0x13, 0x6c, 0xdb, 0x8a, 0xd4, 0x14, - 0xe7, 0xe4, 0x5d, 0x50, 0x9e, 0x76, 0x5c, 0xfa, 0xf0, 0x33, 0xb7, 0x6e, 0xad, 0xdd, 0x75, 0x6f, 0x01, 0xa7, 0xab, 0x4e, 0xaf, 0x77, 0x0f, 0xc5, 0x66, 0xbc, 0xc6, 0x44, 0x53, 0x05, 0xdf, 0x0d, - 0xa1, 0x51, 0x56, 0x4f, 0x6e, 0xa2, 0x68, 0xef, 0x1d, 0xb2, 0x0e, 0xc0, 0xf5, 0x6d, 0x22, 0x36, 0x73, 0x2f, 0x10, 0xfd, 0x7d, 0xfb, 0x4a, 0x81, 0xf8, 0xf4, 0x00, 0xff, 0x56, 0xc5, 0xf9, 0x56, - 0x8b, 0xf4, 0xa9, 0xb1, 0xec, 0x23, 0x5b, 0x82, 0x4f, 0x24, 0x04, 0x0f, 0xa7, 0x8a, 0xfa, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc8, 0x9d, 0xa7, 0x1e, 0x01, 0x05, 0x00, - 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, - 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x64, 0x90, 0xcd, 0xae, 0xdb, 0x20, 0x10, 0x46, 0xd7, 0xcc, 0x53, 0x4c, 0x91, 0x2a, 0xc1, 0x95, 0x85, 0xa3, 0x2e, 0x23, 0x65, 0x93, 0xa8, 0x3f, 0xab, 0x2c, - 0xd2, 0xbc, 0x00, 0x85, 0x71, 0xec, 0xc6, 0x01, 0x07, 0x86, 0x38, 0x55, 0x95, 0x77, 0xaf, 0x70, 0x53, 0x29, 0xea, 0xdd, 0x00, 0x62, 0x3e, 0x0e, 0x67, 0x66, 0xb2, 0xee, 0x6c, 0x4f, 0x84, 0x5d, - 0x09, 0x8e, 0x87, 0x18, 0x00, 0x86, 0xcb, 0x14, 0x13, 0xa3, 0x02, 0x21, 0x5d, 0x0c, 0x4c, 0x77, 0x96, 0x20, 0x64, 0x20, 0x6e, 0x7b, 0xe6, 0xe9, 0xf5, 0xbc, 0x2c, 0x4c, 0x79, 0x09, 0xd4, 0x7d, - 0x08, 0x27, 0x09, 0x1a, 0xa0, 0x6d, 0xf1, 0x48, 0x99, 0xbf, 0xd9, 0xe0, 0x47, 0x42, 0x0a, 0xb9, 0x24, 0xca, 0xc8, 0xbd, 0x65, 0xe4, 0x9e, 0xd0, 0xc5, 0x90, 0x39, 0x15, 0xc7, 0x31, 0x61, 0x22, - 0x2e, 0x29, 0x64, 0xb4, 0x01, 0xe3, 0x8f, 0x9f, 0xe4, 0x18, 0xe7, 0x7e, 0x70, 0x3d, 0xf6, 0xcb, 0xdb, 0x0c, 0xd5, 0xeb, 0x05, 0xa6, 0x18, 0xdf, 0x9e, 0x3f, 0x99, 0xa3, 0xc6, 0xdf, 0x20, 0x6e, - 0x36, 0x55, 0x57, 0x31, 0x23, 0xe2, 0x06, 0xff, 0x19, 0x99, 0x3d, 0xcd, 0x07, 0x72, 0x31, 0x79, 0x4a, 0x4a, 0x83, 0x10, 0x89, 0xae, 0xef, 0xca, 0xd7, 0x42, 0x99, 0x95, 0xfc, 0xfa, 0xf9, 0x28, - 0x1b, 0x94, 0xb5, 0xb6, 0x6e, 0x5b, 0xba, 0xdb, 0xcb, 0x34, 0x92, 0x71, 0xf1, 0xd2, 0x2e, 0xbd, 0x35, 0x18, 0x86, 0xf1, 0x2f, 0x22, 0xe3, 0x5b, 0x4d, 0x99, 0x03, 0xe5, 0x29, 0x86, 0x4c, 0x20, - 0x34, 0x80, 0xd8, 0xd3, 0xac, 0xb4, 0x79, 0xfa, 0x3d, 0x47, 0x66, 0xb6, 0xd6, 0x9d, 0x4f, 0x29, 0x96, 0xe0, 0x95, 0x6e, 0x70, 0x6e, 0x30, 0xd1, 0x55, 0xc3, 0xc2, 0xd8, 0xe0, 0x5c, 0x09, 0x65, - 0xe4, 0x6a, 0xe6, 0xa9, 0xa3, 0x3a, 0x86, 0x6c, 0xb6, 0xd1, 0xff, 0x32, 0xbb, 0x31, 0x66, 0x52, 0x15, 0x3b, 0x74, 0xcb, 0xed, 0x77, 0xb6, 0x5c, 0xf2, 0x2e, 0x7a, 0xc2, 0x0f, 0x1b, 0xfc, 0xb4, - 0x5a, 0xd5, 0xa6, 0x05, 0x9b, 0x2f, 0x96, 0xed, 0xd8, 0x29, 0x59, 0x02, 0xdd, 0x27, 0x72, 0x4c, 0xbe, 0xc6, 0x17, 0x2d, 0x74, 0xd1, 0xd3, 0x1a, 0x3f, 0xde, 0x64, 0xf3, 0x1f, 0x42, 0x83, 0x78, - 0xc0, 0x03, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x41, 0x39, 0xf1, 0xa6, 0x42, 0x01, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0xca, 0xcd, 0x4f, 0x29, 0xcd, 0x49, 0x55, 0x48, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xe3, 0xe2, - 0x4a, 0xcf, 0x57, 0x30, 0xd4, 0x33, 0x34, 0xe1, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0xe0, 0x7c, 0xeb, 0x1f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, + 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x8c, 0x95, 0x51, 0x8b, 0xdc, 0x46, 0x0c, 0xc7, 0xdf, 0xe7, 0x53, 0x08, 0x0e, 0x42, 0x0e, 0x16, 0x6f, 0x43, 0x49, 0xa1, 0x7d, 0x6d, 0x73, 0x69, 0x21, + 0x94, 0x90, 0xbd, 0x52, 0xc8, 0x4b, 0x2c, 0xcf, 0xc8, 0xb6, 0xb8, 0xf1, 0x8c, 0x19, 0x69, 0x76, 0xe3, 0xfb, 0xf4, 0x65, 0xc6, 0xbb, 0x7b, 0x4e, 0xef, 0x02, 0x79, 0x5c, 0xdb, 0x92, 0xfe, 0xfa, + 0xeb, 0x27, 0xed, 0x0d, 0xdc, 0xd3, 0x34, 0x7b, 0x54, 0x12, 0x63, 0x7e, 0x8f, 0x41, 0x91, 0x83, 0x00, 0x7a, 0x0f, 0xf4, 0x15, 0xa7, 0xd9, 0x13, 0x48, 0xcc, 0xc9, 0x12, 0xd8, 0xe8, 0x68, 0x07, + 0x62, 0xb1, 0xef, 0xa3, 0x77, 0x1c, 0x86, 0x1d, 0x58, 0x4a, 0xca, 0x3d, 0xdb, 0x12, 0x0c, 0x18, 0x1c, 0x4c, 0xa4, 0xe8, 0x50, 0x11, 0xb2, 0x90, 0x33, 0xdd, 0x02, 0x7d, 0x0e, 0x16, 0x4e, 0x23, + 0x05, 0xb0, 0x89, 0x50, 0x39, 0x0c, 0xf5, 0xbb, 0x2e, 0x73, 0x4d, 0x51, 0xdf, 0x2b, 0xc7, 0x00, 0x1c, 0x44, 0x31, 0x58, 0x92, 0xc6, 0x98, 0xfb, 0x08, 0x89, 0xea, 0x27, 0x90, 0x72, 0x80, 0x76, + 0xc2, 0x07, 0x02, 0xbd, 0xa8, 0x6c, 0xe1, 0xf5, 0x69, 0x64, 0x3b, 0x82, 0x45, 0x3b, 0x92, 0xdc, 0x36, 0x00, 0xf7, 0x11, 0xfa, 0x58, 0x34, 0x22, 0xf4, 0xd9, 0xfb, 0x6d, 0xb4, 0x59, 0xa3, 0xad, + 0x27, 0x0c, 0xf0, 0xea, 0x15, 0x94, 0x5f, 0xad, 0x31, 0x37, 0x37, 0xf0, 0x01, 0x97, 0x98, 0xd5, 0x98, 0x77, 0x68, 0x47, 0x70, 0x9c, 0xc8, 0x6a, 0x4c, 0x0b, 0x9c, 0x58, 0x47, 0x0e, 0xd0, 0x6e, + 0xea, 0xd9, 0x98, 0x12, 0xc9, 0x1c, 0x83, 0x13, 0xd0, 0x08, 0x08, 0x0f, 0x21, 0x9e, 0x02, 0x78, 0x0c, 0x43, 0xc6, 0x81, 0x4a, 0x19, 0xe5, 0x89, 0x1a, 0x73, 0x3f, 0x12, 0xb4, 0xc5, 0x14, 0x69, + 0x37, 0x19, 0x59, 0x00, 0x21, 0x91, 0x50, 0x3a, 0x92, 0x83, 0x53, 0x4c, 0x0e, 0xec, 0xea, 0x73, 0x71, 0x20, 0xc5, 0xa8, 0x70, 0x38, 0x7c, 0xf8, 0xc6, 0xcc, 0xe6, 0x3b, 0xaa, 0xf0, 0x52, 0x6b, + 0xf3, 0xea, 0x99, 0xba, 0x80, 0x13, 0xb9, 0xb3, 0x5f, 0xa8, 0x17, 0x59, 0x9b, 0xc1, 0xb5, 0xcf, 0x13, 0xeb, 0x48, 0x2f, 0xa4, 0x7e, 0xae, 0xdc, 0x6c, 0x94, 0x97, 0x18, 0x74, 0x38, 0x2b, 0xa5, + 0x0a, 0x07, 0xe8, 0x88, 0x5a, 0x5a, 0x3b, 0x16, 0x07, 0xea, 0x2c, 0xce, 0xc3, 0x2d, 0x45, 0x00, 0x61, 0xe0, 0x23, 0x85, 0xc2, 0xc8, 0x18, 0x9d, 0x11, 0x1e, 0x02, 0x6a, 0x4e, 0x04, 0x1c, 0xaa, + 0xec, 0x52, 0x85, 0x2d, 0x41, 0xb7, 0xc0, 0x09, 0x17, 0x88, 0x7d, 0x2d, 0x40, 0x5f, 0x95, 0x52, 0x40, 0xff, 0x94, 0xec, 0x22, 0xd3, 0x73, 0x97, 0x30, 0x71, 0x25, 0xe6, 0xe6, 0x06, 0x3e, 0xa2, + 0x7d, 0xc0, 0x81, 0xc3, 0x60, 0xcc, 0xbf, 0x85, 0xb7, 0x3c, 0xbb, 0x15, 0xcb, 0x44, 0x30, 0x61, 0x51, 0x17, 0x4b, 0x42, 0xd9, 0x90, 0xb4, 0x2b, 0x0f, 0x16, 0x98, 0xb2, 0x28, 0x74, 0x04, 0x73, + 0xcd, 0x40, 0x0e, 0x5e, 0x0b, 0x25, 0x46, 0xcf, 0x8f, 0xe4, 0x00, 0xc5, 0x20, 0xbc, 0x8f, 0xd0, 0x2d, 0x4a, 0x80, 0x29, 0xe1, 0x72, 0x5b, 0x14, 0xa6, 0x1c, 0xaa, 0x07, 0xdf, 0x63, 0xf3, 0x4c, + 0xa0, 0x98, 0x76, 0xa0, 0x40, 0x09, 0x95, 0xf6, 0x8f, 0x8f, 0x5f, 0x7a, 0xf6, 0x24, 0x8b, 0x28, 0x4d, 0x5f, 0x2e, 0x8f, 0x5d, 0x33, 0xc4, 0x76, 0x57, 0x97, 0xc2, 0x8e, 0x64, 0x1f, 0x4a, 0xd2, + 0xcb, 0x3c, 0x48, 0xb2, 0x57, 0x0c, 0x6a, 0xda, 0x66, 0xff, 0x23, 0x69, 0xa0, 0xbc, 0x58, 0xdd, 0xf8, 0x33, 0x9e, 0x80, 0xb5, 0x8c, 0xec, 0x41, 0xcc, 0x0a, 0xc0, 0x26, 0xc7, 0x46, 0xef, 0x96, + 0xa3, 0xf3, 0xee, 0xbf, 0x8f, 0x30, 0xa7, 0x38, 0x24, 0x9c, 0xd6, 0x89, 0x5e, 0xc2, 0x04, 0x7e, 0x50, 0xc7, 0x4a, 0x5c, 0x79, 0x0b, 0x8e, 0x7a, 0x0e, 0x24, 0x1b, 0xfb, 0xe0, 0x88, 0x89, 0xb1, + 0xf3, 0x74, 0xe6, 0xb4, 0xbd, 0x9e, 0x9f, 0xcf, 0x3c, 0x9f, 0x43, 0xaf, 0x9f, 0x5c, 0x35, 0x7d, 0xfe, 0xeb, 0x23, 0x24, 0x9a, 0x0b, 0x8b, 0x41, 0xb1, 0x72, 0x70, 0x06, 0xe4, 0xda, 0xcb, 0x53, + 0x2b, 0x6b, 0x92, 0x97, 0x4a, 0xb2, 0x94, 0x98, 0x50, 0xcf, 0x53, 0x01, 0x62, 0xbd, 0x3a, 0xca, 0xa8, 0x85, 0xb4, 0x39, 0x26, 0x25, 0x07, 0x83, 0x8f, 0x1d, 0xfa, 0xa7, 0xa0, 0xf6, 0x82, 0x5e, + 0xf3, 0x6e, 0xea, 0xc8, 0x39, 0x72, 0x57, 0xc9, 0x77, 0x87, 0x76, 0x67, 0xd6, 0x89, 0x73, 0xb9, 0x95, 0x13, 0x05, 0x15, 0x28, 0x39, 0x1d, 0x26, 0x57, 0x9c, 0xe4, 0xa0, 0x94, 0x7a, 0xb4, 0xc5, + 0xbd, 0x5e, 0x9a, 0x4f, 0x84, 0xee, 0x0f, 0x4e, 0x77, 0x87, 0xb6, 0x8e, 0xbc, 0x3c, 0x3a, 0x28, 0xea, 0xdd, 0xa1, 0x5d, 0xe7, 0xf6, 0xa9, 0xf6, 0x86, 0x9e, 0x8c, 0xf9, 0x27, 0x28, 0x7b, 0x90, + 0x6c, 0x47, 0xa8, 0xbc, 0xa3, 0x00, 0xd5, 0xfa, 0x05, 0x11, 0x29, 0x26, 0x58, 0x40, 0x11, 0x52, 0x29, 0xc0, 0x74, 0x1c, 0xea, 0x32, 0x94, 0x16, 0x39, 0x58, 0x9f, 0x1d, 0xb9, 0x33, 0x48, 0xa6, + 0x43, 0x21, 0x68, 0x87, 0xb8, 0x9e, 0xdd, 0xf6, 0xba, 0x4a, 0xe8, 0x59, 0x97, 0x42, 0x3b, 0xc1, 0xa8, 0x3a, 0xcb, 0x6f, 0xfb, 0xfd, 0xc0, 0x3a, 0xe6, 0xae, 0xb1, 0x71, 0xda, 0x0f, 0xb1, 0x1c, + 0xb8, 0xfd, 0x10, 0xf7, 0x2c, 0x92, 0x49, 0xf6, 0x3f, 0xbf, 0xfd, 0xf5, 0xed, 0x4f, 0xb7, 0xe6, 0x44, 0x10, 0x68, 0xb5, 0x2f, 0x0b, 0x41, 0xcc, 0x09, 0x6c, 0x16, 0x8d, 0x13, 0x5c, 0xd6, 0x66, + 0x9d, 0x8f, 0xd8, 0xc4, 0xb3, 0xc2, 0xeb, 0x17, 0xc1, 0xdb, 0x4f, 0xc8, 0xa1, 0xb0, 0x72, 0xdb, 0x18, 0xf3, 0x37, 0x2a, 0x1f, 0xa9, 0xb8, 0xf5, 0xd4, 0x20, 0x07, 0x4d, 0xd1, 0x65, 0xbb, 0x76, + 0xf1, 0x3e, 0xc2, 0x9b, 0xe6, 0xcd, 0x2f, 0x60, 0x63, 0xf6, 0xae, 0xec, 0x6a, 0x1d, 0x60, 0x1f, 0x13, 0xd0, 0x57, 0xb2, 0x59, 0xeb, 0x9c, 0xaa, 0x05, 0xcb, 0xce, 0x8c, 0xf1, 0x44, 0x47, 0x4a, + 0x85, 0x7f, 0x8b, 0x21, 0x44, 0xfd, 0x26, 0x60, 0x3d, 0x1b, 0x4b, 0x63, 0xee, 0x62, 0x02, 0xbc, 0xfc, 0x84, 0x4d, 0x57, 0x17, 0xb5, 0x50, 0x17, 0x7f, 0xf3, 0xef, 0x07, 0xff, 0x3b, 0x7e, 0xd7, + 0x6e, 0x1a, 0xf3, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x05, 0xf1, 0x56, 0xa3, 0x62, 0x03, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x63, 0x65, 0x72, 0x74, 0x73, + 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x6c, 0x8c, 0x3b, 0x8e, 0xc3, 0x30, 0x0c, 0x44, 0x7b, 0x9d, 0x62, 0x80, 0xed, 0x7d, 0x89, 0x6d, 0xb7, 0xf3, 0x1e, 0x40, 0xb4, 0x34, + 0xb6, 0x89, 0xc4, 0x54, 0x40, 0x51, 0x08, 0x7c, 0xfb, 0x20, 0x9f, 0x32, 0xed, 0xcc, 0x7b, 0xef, 0x07, 0xbf, 0xf4, 0xe8, 0x29, 0xfd, 0xef, 0xda, 0x51, 0xd5, 0x59, 0xa2, 0xf9, 0x89, 0xd2, 0x2c, + 0x44, 0xad, 0x23, 0x76, 0x62, 0x9e, 0xff, 0xe0, 0xad, 0x05, 0x0a, 0x3d, 0x74, 0xd5, 0x22, 0xc1, 0x8e, 0xd1, 0x59, 0x71, 0xdf, 0x69, 0x28, 0x4e, 0x09, 0xb5, 0x2d, 0xad, 0xc3, 0x4a, 0x68, 0x33, + 0xe8, 0x21, 0x1b, 0xfb, 0xf4, 0xcc, 0xf2, 0x65, 0x75, 0x14, 0x31, 0x2c, 0xc4, 0xb8, 0x55, 0x09, 0x56, 0x2c, 0x27, 0x7c, 0x98, 0xa9, 0x6d, 0xc8, 0x87, 0x5c, 0x3e, 0x54, 0x46, 0xf3, 0x2f, 0xd7, + 0x95, 0x62, 0x39, 0x2d, 0x5c, 0x9b, 0xf3, 0xbd, 0xe5, 0x29, 0xa5, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe0, 0x7c, 0xcc, 0x0a, 0x87, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x63, + 0x65, 0x72, 0x74, 0x73, 0x2f, 0x63, 0x61, 0x2d, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x74, 0xc4, 0xbc, 0x57, 0x8f, 0xe3, 0xc8, 0xb6, 0x2e, + 0xf8, 0xce, 0x5f, 0x91, 0xc0, 0x79, 0x98, 0x7b, 0xa1, 0x39, 0x5b, 0xf4, 0xe6, 0x00, 0xf3, 0x40, 0xef, 0x44, 0x4a, 0xf4, 0xe6, 0xe5, 0x82, 0x4e, 0xf4, 0x46, 0xf4, 0xe4, 0xaf, 0x1f, 0x64, 0x66, + 0x65, 0x75, 0x55, 0xed, 0xea, 0xee, 0xbd, 0x2f, 0xee, 0x99, 0x49, 0xa0, 0xd1, 0xaa, 0xd0, 0xa2, 0x18, 0x41, 0x46, 0x7c, 0xeb, 0x8b, 0xb5, 0xbe, 0x15, 0xff, 0xf1, 0x1f, 0xc0, 0x7f, 0xfc, 0xc7, + 0x1b, 0xb3, 0x74, 0x69, 0x93, 0xbd, 0xf5, 0xcf, 0x37, 0x96, 0x7e, 0x33, 0xfb, 0x7e, 0x7e, 0x63, 0xb3, 0x71, 0x2e, 0x9f, 0x65, 0x12, 0xcd, 0xd9, 0x04, 0x7c, 0x1a, 0xfd, 0xd0, 0xf4, 0x96, 0x46, + 0x73, 0xf4, 0xf6, 0x1c, 0xfb, 0xf6, 0x4d, 0xeb, 0xcf, 0xb2, 0x69, 0xa2, 0xb7, 0x68, 0x7a, 0xeb, 0x9f, 0xff, 0xf5, 0x66, 0x2f, 0xd9, 0x9b, 0x16, 0x1d, 0x6f, 0x08, 0xf8, 0x06, 0x22, 0xff, 0x05, + 0xc1, 0xff, 0x05, 0xa2, 0x6f, 0x30, 0x08, 0x23, 0x6f, 0xa2, 0x66, 0x7f, 0xfb, 0x1d, 0xbb, 0x28, 0xa7, 0xb7, 0x72, 0x7a, 0x8b, 0xde, 0xe2, 0xef, 0xb7, 0xf5, 0xff, 0x81, 0x81, 0xd4, 0x5b, 0xf2, + 0xc3, 0x4d, 0xdf, 0x5b, 0x87, 0x25, 0x6e, 0xca, 0xe4, 0xa7, 0x1b, 0xd3, 0xcb, 0x5c, 0xf4, 0x63, 0x39, 0x97, 0x1f, 0xdd, 0x7a, 0xfb, 0x1f, 0x2c, 0xfd, 0x3f, 0xff, 0xf1, 0x66, 0x17, 0xd9, 0x94, + 0xbd, 0x6d, 0xd9, 0x98, 0xbd, 0x45, 0xcb, 0xdc, 0xb7, 0xd1, 0x5c, 0x26, 0x51, 0xd3, 0x1c, 0x6f, 0xd9, 0x3e, 0x8f, 0x51, 0x32, 0x67, 0xe9, 0x4f, 0x7d, 0xfd, 0xbf, 0xa6, 0xb7, 0xf1, 0x7d, 0x8c, + 0xc9, 0xcf, 0x63, 0x7c, 0x7b, 0x96, 0x4d, 0xf6, 0xf6, 0x3f, 0xde, 0x5b, 0xdf, 0x87, 0xf7, 0x8f, 0x79, 0x9f, 0xff, 0xe7, 0x3f, 0xde, 0x3e, 0xbb, 0xfb, 0xf1, 0x55, 0x12, 0x75, 0x6f, 0x71, 0xf6, + 0xf6, 0xec, 0x97, 0x2e, 0x7d, 0x2b, 0xbb, 0xb7, 0xb9, 0xc8, 0xde, 0xda, 0x6f, 0xc3, 0x9f, 0xfa, 0x65, 0x4c, 0xb2, 0xb7, 0x79, 0xcc, 0xb2, 0xff, 0x7a, 0xff, 0xad, 0x62, 0x9e, 0x87, 0xe9, 0xbf, + 0xae, 0xd7, 0x22, 0xff, 0xc7, 0x37, 0x93, 0x7f, 0xf4, 0x63, 0x7e, 0x1d, 0xb3, 0x26, 0x8b, 0xa6, 0x6c, 0xba, 0x7e, 0x6b, 0xfc, 0xcf, 0x6f, 0x0d, 0xd7, 0x31, 0xda, 0xfe, 0xf3, 0xfd, 0x26, 0xd7, + 0x34, 0x7b, 0x46, 0x4b, 0x33, 0x5f, 0xa7, 0x2c, 0x59, 0xc6, 0x72, 0x3e, 0xae, 0xdd, 0x34, 0x5d, 0x9b, 0x32, 0xbe, 0x26, 0xf5, 0x73, 0xbb, 0xc6, 0x4b, 0xd9, 0xcc, 0x65, 0x37, 0x5d, 0x7f, 0xec, + 0xe5, 0xb7, 0xe7, 0x2a, 0xcf, 0x6f, 0x49, 0xdf, 0xcd, 0x51, 0xd9, 0x4d, 0x1f, 0x5d, 0xfb, 0xe9, 0x69, 0x96, 0xdd, 0xdb, 0x83, 0xd7, 0xde, 0x9e, 0xfd, 0xd8, 0x46, 0xf3, 0x5b, 0xd4, 0xa5, 0xef, + 0x26, 0x63, 0xf6, 0xec, 0xc7, 0xec, 0xfd, 0xda, 0x6f, 0x43, 0x4b, 0xcb, 0x31, 0x4b, 0xe6, 0xe6, 0x78, 0x5b, 0xa6, 0x2c, 0x7d, 0xdb, 0xca, 0xb9, 0x78, 0x4b, 0x96, 0xb1, 0x79, 0xbb, 0xbe, 0x35, + 0x65, 0xfc, 0xed, 0xd3, 0x50, 0x0c, 0xff, 0xeb, 0xfd, 0xe3, 0xff, 0xfd, 0xd6, 0x8f, 0x1f, 0x26, 0xef, 0xd7, 0x47, 0xdd, 0x1b, 0x3d, 0x44, 0x49, 0x91, 0x5d, 0xda, 0x3e, 0xfd, 0x5f, 0xd3, 0xd4, + 0xbc, 0x6d, 0x59, 0x3c, 0x65, 0xe3, 0x9a, 0x8d, 0xef, 0xf7, 0x7c, 0xb3, 0xac, 0xdb, 0x5b, 0xd2, 0x94, 0x59, 0x37, 0xbf, 0xbf, 0xa1, 0x22, 0xeb, 0xde, 0xdf, 0xd0, 0x5c, 0xf6, 0xdd, 0x3f, 0xde, + 0xaf, 0x56, 0x96, 0xe9, 0xa3, 0xef, 0xcf, 0x32, 0x5f, 0xc6, 0xec, 0x6d, 0xfe, 0xfe, 0xc4, 0xa3, 0xcf, 0x91, 0x58, 0xd6, 0x8d, 0xa5, 0x7f, 0x98, 0x05, 0x42, 0xd9, 0x64, 0xff, 0xf8, 0x9a, 0x95, + 0x7d, 0xb7, 0x66, 0xe3, 0x54, 0xf6, 0xdd, 0x5b, 0xda, 0x77, 0xd9, 0x67, 0xa7, 0xdb, 0xfa, 0x3f, 0x93, 0xe8, 0x3f, 0x3f, 0xa7, 0xd7, 0x3f, 0x86, 0xe6, 0xed, 0xcb, 0x02, 0xfa, 0x07, 0x4c, 0x7d, + 0xdc, 0xd1, 0x92, 0x68, 0x18, 0xc3, 0xff, 0xeb, 0x2d, 0x41, 0x09, 0x94, 0xc0, 0x20, 0x10, 0x79, 0xc6, 0x20, 0x16, 0xc7, 0x18, 0x0e, 0xc7, 0x71, 0x94, 0x3e, 0x9f, 0x60, 0x0a, 0x65, 0x04, 0x8c, + 0xa0, 0x78, 0x0c, 0x22, 0x30, 0x82, 0x43, 0x18, 0x9a, 0x41, 0x28, 0x4a, 0x46, 0x78, 0x12, 0x41, 0x14, 0x14, 0x13, 0x28, 0xf8, 0x24, 0x11, 0x0c, 0x24, 0xde, 0x3b, 0x01, 0x00, 0x62, 0xd3, 0xc7, + 0x51, 0x63, 0x95, 0x79, 0xf7, 0x6d, 0xf1, 0xd0, 0xc0, 0xff, 0xf3, 0x4f, 0x7f, 0xc0, 0x7f, 0xbe, 0xff, 0x31, 0xbc, 0x28, 0xeb, 0x6f, 0x2c, 0x6f, 0xda, 0xb2, 0x20, 0xb3, 0xb4, 0xcd, 0x7f, 0xb4, + 0x02, 0x9a, 0x2c, 0x73, 0xa9, 0xcd, 0xb2, 0x74, 0x03, 0xe7, 0xf4, 0x26, 0x33, 0x74, 0x2e, 0xdf, 0x18, 0xfa, 0xe3, 0x8f, 0x11, 0x9c, 0x39, 0xda, 0x30, 0x63, 0xe3, 0x8c, 0x40, 0x51, 0xfb, 0x50, + 0x2e, 0xd6, 0x44, 0xa7, 0x0d, 0x5e, 0x60, 0x0c, 0x7a, 0x73, 0x4f, 0xfe, 0xa6, 0xd1, 0xb5, 0x48, 0x43, 0x0e, 0xcf, 0x14, 0x1a, 0x6b, 0xd4, 0xce, 0x0e, 0x88, 0x36, 0xed, 0x33, 0xb9, 0xee, 0x32, + 0x74, 0x6f, 0xf3, 0x7c, 0x3a, 0xc5, 0xb0, 0x52, 0xc4, 0x82, 0x3e, 0x84, 0x30, 0x9a, 0xc7, 0x5d, 0x30, 0x27, 0x30, 0xbf, 0xf3, 0x1c, 0x7d, 0xff, 0xb4, 0x99, 0x6c, 0x06, 0x52, 0xd6, 0x18, 0x31, + 0x72, 0x03, 0xe4, 0x77, 0xf1, 0xa4, 0xc3, 0xcf, 0x76, 0xcd, 0xe6, 0xeb, 0x74, 0x02, 0x7e, 0xbc, 0xd8, 0x69, 0xa9, 0x35, 0x65, 0x19, 0xce, 0xb0, 0xe9, 0x4c, 0xd8, 0x40, 0xec, 0xce, 0xd1, 0x98, + 0xc6, 0xf1, 0xbb, 0x56, 0xd1, 0x9b, 0xc6, 0x31, 0x91, 0xb0, 0x81, 0xc7, 0x9d, 0xa3, 0x77, 0xad, 0xca, 0xbf, 0xb7, 0x69, 0x42, 0xb2, 0xb3, 0x27, 0xad, 0xbc, 0xff, 0x28, 0xc0, 0xd0, 0x81, 0x4d, + 0xd7, 0x8a, 0xa0, 0x99, 0xf5, 0x26, 0x6c, 0x01, 0xe7, 0x1a, 0x86, 0xca, 0xef, 0x8c, 0x14, 0x8b, 0x54, 0x19, 0x78, 0xbb, 0x1d, 0x79, 0xe9, 0x22, 0x8b, 0x18, 0x7c, 0xf3, 0xf5, 0x42, 0x33, 0xe9, + 0x8d, 0xcb, 0x3f, 0x6c, 0x6e, 0xfc, 0x96, 0x5a, 0x31, 0x4c, 0x81, 0x32, 0xaf, 0x33, 0x9a, 0x39, 0x6d, 0xa2, 0x11, 0x70, 0x80, 0x6b, 0x18, 0x1c, 0xbf, 0x2b, 0x3f, 0x5f, 0x2c, 0x7c, 0x1f, 0xca, + 0x96, 0xe7, 0x7c, 0xa9, 0xd1, 0xa0, 0xc8, 0x5a, 0x2f, 0xd1, 0x92, 0x63, 0x84, 0x33, 0x78, 0x86, 0x36, 0x1c, 0x9a, 0x46, 0x65, 0x86, 0xdb, 0xe8, 0xf7, 0xef, 0x55, 0xba, 0x97, 0x19, 0xda, 0xe0, + 0x22, 0x80, 0x5b, 0xa2, 0xb0, 0x4a, 0xf0, 0x0a, 0x05, 0x2f, 0xea, 0x73, 0x5d, 0xf7, 0x12, 0xd5, 0x9a, 0xe8, 0x32, 0xc8, 0xd2, 0x95, 0x7f, 0x4d, 0xb7, 0xd6, 0xe5, 0x0d, 0x8b, 0x22, 0xc5, 0x87, + 0x89, 0xb6, 0x69, 0x7b, 0xee, 0x67, 0x7a, 0xee, 0xb3, 0xac, 0x5e, 0x70, 0xbd, 0x0c, 0xf0, 0x68, 0x3c, 0x5a, 0x3a, 0x8c, 0xd6, 0x61, 0x3f, 0x40, 0xeb, 0xc0, 0xa7, 0x04, 0xb0, 0x25, 0x5a, 0xea, + 0x6d, 0x50, 0xd5, 0x34, 0xd0, 0xad, 0x9c, 0x2b, 0x8a, 0xa4, 0x96, 0xe6, 0x30, 0x4e, 0x42, 0x40, 0xdc, 0xb2, 0xb3, 0x04, 0x72, 0xbd, 0x37, 0x16, 0x39, 0x08, 0x14, 0x2a, 0x22, 0xae, 0x6e, 0xb3, + 0x77, 0xbf, 0xd6, 0x4f, 0xb2, 0x96, 0x06, 0xc8, 0x1b, 0xab, 0xa9, 0xaf, 0x71, 0xb7, 0xaa, 0xd1, 0x78, 0x0b, 0xc8, 0x52, 0x6c, 0x62, 0x40, 0xad, 0x11, 0x61, 0x80, 0x2c, 0x34, 0x96, 0x3b, 0xad, + 0xbd, 0xd6, 0xe4, 0xb1, 0xf8, 0x54, 0xf9, 0x74, 0xac, 0x87, 0xa2, 0xa0, 0xcd, 0x1c, 0x27, 0xa9, 0x88, 0xdb, 0xa6, 0x28, 0x99, 0x55, 0x92, 0x8a, 0x53, 0xe7, 0xdc, 0x8b, 0x25, 0x0f, 0xcb, 0xd9, + 0x9d, 0x63, 0xdd, 0x45, 0x85, 0xc1, 0x2b, 0xf1, 0x24, 0x57, 0xef, 0xf7, 0xf5, 0x50, 0x18, 0xfd, 0x01, 0x24, 0x90, 0x65, 0xf3, 0xa8, 0x83, 0x8b, 0xc4, 0x96, 0xe9, 0x37, 0xef, 0xc6, 0x04, 0x07, + 0x96, 0xa2, 0xcb, 0x0e, 0xef, 0x64, 0x5e, 0x47, 0x93, 0xe2, 0xc0, 0xb8, 0x71, 0x76, 0x13, 0x92, 0xde, 0x9a, 0xcd, 0xc4, 0xf8, 0xd2, 0xf1, 0x34, 0x2f, 0x8b, 0xf0, 0x7d, 0xac, 0xf9, 0x96, 0xd5, + 0xf2, 0x50, 0xa5, 0x04, 0xf1, 0x55, 0x57, 0x5e, 0xc8, 0x8e, 0x3e, 0x90, 0x9f, 0xf6, 0xf5, 0xc6, 0x8e, 0x4c, 0xcc, 0x34, 0x9c, 0x95, 0x67, 0x02, 0x46, 0xe9, 0x24, 0x55, 0x0a, 0x3d, 0x71, 0x19, + 0x0f, 0x67, 0xa0, 0xae, 0x35, 0xc6, 0x3d, 0xe8, 0x5c, 0x63, 0x68, 0x5a, 0xac, 0x8c, 0x8a, 0xa1, 0x35, 0x1a, 0x7d, 0x9f, 0xa8, 0x29, 0xb7, 0xf1, 0xcc, 0x75, 0x33, 0xf8, 0xf7, 0x89, 0xce, 0x54, + 0xf4, 0xe3, 0x63, 0x6a, 0x48, 0xa6, 0xc6, 0xd0, 0x4f, 0x92, 0x67, 0x6c, 0x9a, 0xa3, 0x0d, 0xe9, 0xaa, 0x31, 0xe0, 0xa7, 0x71, 0x6e, 0x78, 0x0c, 0x63, 0xe6, 0x19, 0x1c, 0x44, 0xa6, 0x01, 0xfb, + 0x47, 0xdf, 0x18, 0x37, 0x04, 0xe4, 0x4f, 0xdb, 0xea, 0xaf, 0xd7, 0x93, 0xb2, 0x4e, 0x5a, 0x67, 0xf2, 0xfa, 0x55, 0xd4, 0xa5, 0x48, 0x6d, 0xe0, 0xfb, 0x1b, 0x16, 0x00, 0x9a, 0xbe, 0xb3, 0xb4, + 0xc1, 0xd3, 0x50, 0xf7, 0xe8, 0x9e, 0x3c, 0x05, 0x83, 0x32, 0x7c, 0x25, 0x6e, 0xaf, 0x72, 0xad, 0x6c, 0x41, 0xe5, 0x54, 0xe8, 0xf9, 0xd8, 0xa7, 0x8e, 0xdd, 0xc6, 0xd5, 0x68, 0x33, 0x87, 0xa0, + 0x46, 0xff, 0xd5, 0x9b, 0xd6, 0x2d, 0x6e, 0x58, 0xf5, 0x7e, 0x1e, 0x15, 0x54, 0xd8, 0xa9, 0x2e, 0xb2, 0xb1, 0x76, 0xd9, 0x70, 0xae, 0x02, 0x02, 0xc8, 0x89, 0xc9, 0x71, 0x5c, 0x47, 0xbb, 0x2b, + 0x0c, 0xa2, 0x46, 0xfb, 0x4b, 0xb0, 0x96, 0x65, 0x40, 0x10, 0x38, 0x63, 0xb8, 0x6b, 0x27, 0xb2, 0x2b, 0x88, 0x9e, 0x89, 0x71, 0x4b, 0x04, 0xd1, 0x69, 0xb0, 0x9c, 0x47, 0x48, 0xfd, 0xd9, 0xe8, + 0x8e, 0x7b, 0x98, 0x26, 0xd3, 0x69, 0x66, 0x9a, 0x7a, 0x86, 0xcb, 0x3d, 0x29, 0x57, 0xbb, 0x1f, 0x22, 0x50, 0x5d, 0x49, 0x9d, 0x38, 0x0e, 0x2c, 0x00, 0x63, 0xf8, 0xb5, 0x9e, 0xcf, 0x55, 0xec, + 0xa8, 0x5b, 0xa1, 0xc8, 0xa1, 0x32, 0xe6, 0xcd, 0x93, 0x6d, 0x89, 0xa3, 0x7d, 0xd0, 0x31, 0xef, 0xce, 0xc6, 0x96, 0x0e, 0x4f, 0x6c, 0xb8, 0x89, 0x75, 0x9d, 0x31, 0xf8, 0x39, 0xec, 0xfb, 0x1e, + 0x2c, 0x84, 0x7a, 0x28, 0xd9, 0x24, 0x40, 0xb0, 0xba, 0xad, 0x85, 0x04, 0x14, 0x2d, 0xfa, 0xda, 0x85, 0x60, 0x6f, 0x52, 0xa6, 0x2b, 0x03, 0x67, 0xbc, 0x78, 0x47, 0xeb, 0x3b, 0x51, 0xca, 0xa9, + 0x2f, 0x16, 0x53, 0x1a, 0x13, 0xf1, 0x59, 0x04, 0x86, 0x02, 0x2a, 0xc8, 0xcc, 0x17, 0xea, 0x9e, 0x1e, 0xb5, 0xa2, 0x14, 0x52, 0x4b, 0x1a, 0x83, 0x63, 0x95, 0x33, 0x52, 0xb6, 0x73, 0x35, 0x46, + 0x3c, 0x79, 0x52, 0xf3, 0x9a, 0xb1, 0x80, 0x8f, 0xfa, 0x96, 0x61, 0x56, 0x71, 0x1e, 0x6b, 0xbc, 0xa4, 0x39, 0xcf, 0x41, 0x66, 0x56, 0xc1, 0xe2, 0x14, 0x24, 0x3f, 0x64, 0xb6, 0x40, 0xbc, 0xb0, + 0xf1, 0xcb, 0x2b, 0x5f, 0x29, 0xaa, 0x15, 0x0e, 0x28, 0xfd, 0x85, 0x67, 0xbc, 0xce, 0xfd, 0x33, 0x9a, 0x01, 0x7c, 0x37, 0x8f, 0xcb, 0x34, 0xff, 0xa3, 0xcb, 0xe6, 0xb7, 0xc7, 0x98, 0xb5, 0xe5, + 0xd2, 0xbe, 0xc1, 0x20, 0x4a, 0xbe, 0x59, 0xef, 0x5e, 0x2d, 0x7b, 0xb3, 0x3e, 0x3d, 0xc3, 0x6f, 0x71, 0xf2, 0x4f, 0xfe, 0xfe, 0x0e, 0x3e, 0x79, 0xb5, 0x62, 0x59, 0x7a, 0x57, 0xbf, 0xe0, 0x93, + 0xbf, 0x8b, 0x8f, 0xec, 0xc2, 0xfd, 0xf3, 0xe4, 0xa0, 0x39, 0x96, 0x99, 0x39, 0xde, 0xd1, 0x18, 0xf9, 0x03, 0x36, 0xd9, 0x42, 0xbb, 0x99, 0x1e, 0x06, 0x26, 0x9d, 0x7b, 0xa6, 0x2c, 0xb6, 0x00, + 0xa1, 0x6f, 0xec, 0x06, 0x47, 0x5f, 0xbe, 0xc1, 0xa3, 0xa3, 0x23, 0x29, 0x92, 0x1e, 0x58, 0x13, 0x77, 0xe6, 0x91, 0xfa, 0x3a, 0x78, 0x6b, 0xb1, 0x26, 0x65, 0x29, 0xce, 0x11, 0xf4, 0xa7, 0x56, + 0xd1, 0xe0, 0x9d, 0x65, 0x86, 0xb8, 0xd5, 0xd7, 0xa4, 0xa3, 0x17, 0x59, 0x54, 0x30, 0x59, 0x52, 0x9a, 0xb0, 0x44, 0x73, 0x55, 0xdc, 0x07, 0x20, 0xf6, 0x1a, 0x30, 0x39, 0x98, 0x29, 0xf2, 0x84, + 0xf2, 0x56, 0xd6, 0xbb, 0x62, 0xd3, 0xd5, 0x17, 0xee, 0x4a, 0x6c, 0x51, 0xa9, 0x16, 0xbd, 0xdf, 0xed, 0x1a, 0x93, 0x79, 0x77, 0x49, 0x25, 0x05, 0x4a, 0x10, 0x63, 0x89, 0x5b, 0x17, 0x94, 0xf9, + 0x7d, 0x78, 0xbf, 0x36, 0xf4, 0x8c, 0x5d, 0x3b, 0xe9, 0xfd, 0x1b, 0x7c, 0x6a, 0xb6, 0x5a, 0xff, 0x6a, 0xa8, 0x37, 0x49, 0x67, 0x0e, 0x61, 0xdb, 0x54, 0x81, 0x6f, 0x0e, 0x31, 0x8c, 0xe6, 0x86, + 0xef, 0x82, 0x91, 0x48, 0x1d, 0x91, 0x6f, 0x62, 0x32, 0x9b, 0x1f, 0x1a, 0x67, 0xa0, 0xea, 0x17, 0x66, 0xdb, 0xfc, 0xa1, 0x55, 0xc6, 0x0e, 0xe8, 0xa7, 0xb3, 0xe9, 0xb6, 0xf0, 0x09, 0xda, 0x36, + 0x8d, 0xbc, 0x37, 0xea, 0x1c, 0x0f, 0x69, 0xb6, 0x12, 0x69, 0xb2, 0x08, 0x6a, 0xa6, 0xb1, 0xf1, 0xf9, 0x37, 0x8c, 0xde, 0x66, 0xe1, 0xa7, 0xe1, 0x73, 0x02, 0xad, 0x71, 0xe8, 0xe7, 0xf3, 0xdb, + 0x0d, 0x04, 0x48, 0x91, 0x14, 0xb9, 0xb5, 0x3f, 0xf7, 0xec, 0x06, 0xea, 0x86, 0x03, 0x91, 0x1f, 0x77, 0x97, 0xc5, 0x66, 0x09, 0x60, 0xea, 0x48, 0x58, 0x34, 0x0f, 0xba, 0x3a, 0x4f, 0x5a, 0xb7, + 0xbd, 0x95, 0x74, 0x1f, 0x8b, 0xcd, 0x1c, 0xf9, 0xe6, 0x29, 0x8b, 0xfb, 0x10, 0x78, 0xf2, 0xa2, 0xda, 0x7c, 0x03, 0x68, 0xac, 0xf6, 0xed, 0x97, 0xb5, 0x44, 0x15, 0xb5, 0x41, 0xe6, 0x78, 0xec, + 0x6e, 0xd7, 0xf9, 0x8f, 0x6f, 0x29, 0xf4, 0x8d, 0xdc, 0xfe, 0xbc, 0xb8, 0x09, 0x39, 0xfe, 0xd4, 0x38, 0xfe, 0xe3, 0x1a, 0x7a, 0xd7, 0x5e, 0xbf, 0xbe, 0xcd, 0xdc, 0x80, 0xdd, 0x23, 0x15, 0x9b, + 0x36, 0xf2, 0xf4, 0x22, 0x15, 0x9b, 0x35, 0x2e, 0x19, 0x26, 0xf5, 0xcd, 0x3e, 0x46, 0x94, 0x21, 0x95, 0xea, 0x5c, 0xe5, 0xe4, 0x4d, 0xe7, 0xf2, 0x41, 0x93, 0x65, 0x46, 0xae, 0x7e, 0x9d, 0x32, + 0xbc, 0xf0, 0x09, 0x27, 0x24, 0xfd, 0x3e, 0xcf, 0x18, 0x36, 0x57, 0x3f, 0xb0, 0x65, 0x74, 0xa0, 0xdb, 0xcb, 0x54, 0xc5, 0x69, 0x79, 0x55, 0x32, 0x9d, 0xb8, 0x42, 0x6b, 0xbc, 0x54, 0x70, 0x35, + 0xd7, 0x6d, 0x56, 0xed, 0x80, 0x98, 0x73, 0x29, 0x6a, 0x42, 0x22, 0x45, 0x0d, 0x8d, 0x39, 0x8d, 0xa9, 0xe8, 0x37, 0x7d, 0xb6, 0x55, 0x0a, 0xca, 0x16, 0x29, 0x0a, 0xf4, 0xf0, 0x7e, 0x03, 0xc4, + 0x01, 0x22, 0xf9, 0xb3, 0xbf, 0x4b, 0xd0, 0x82, 0x48, 0xd3, 0xb5, 0x51, 0x18, 0x23, 0x9b, 0x02, 0x71, 0xa8, 0x7c, 0x18, 0x3d, 0xc5, 0xf9, 0x46, 0x5f, 0x79, 0x96, 0xd3, 0x8f, 0x71, 0x70, 0xe8, + 0x9a, 0x96, 0x28, 0xb0, 0x51, 0xc5, 0x94, 0x65, 0xdb, 0xb3, 0xa4, 0x57, 0xa8, 0x40, 0xb2, 0xd4, 0x4d, 0x90, 0x7a, 0x43, 0x08, 0x3f, 0x6a, 0xad, 0x11, 0x28, 0x4c, 0x4b, 0x6c, 0xdc, 0xc5, 0xd7, + 0x1a, 0x66, 0x7d, 0x24, 0x25, 0x1e, 0xe6, 0x67, 0x75, 0xbd, 0xc1, 0xa8, 0x95, 0x08, 0x70, 0xe9, 0xd4, 0xe1, 0x35, 0x61, 0xfb, 0x35, 0x68, 0xab, 0xf0, 0xb8, 0x8a, 0x1d, 0xb1, 0xef, 0xa2, 0xc7, + 0xa2, 0xb7, 0xac, 0x9e, 0x8e, 0x90, 0x81, 0xc3, 0x6e, 0x71, 0xd0, 0x17, 0x85, 0x42, 0xad, 0x6b, 0xfb, 0xf6, 0xe9, 0x01, 0xdd, 0xed, 0xf6, 0x50, 0x8d, 0x07, 0x76, 0xc3, 0x4d, 0x63, 0x9a, 0x4d, + 0xf9, 0xcc, 0x9d, 0xc3, 0x0d, 0x46, 0x6a, 0x6a, 0x4d, 0x8d, 0x5b, 0xac, 0x80, 0x41, 0xfc, 0xf8, 0x49, 0x5d, 0x30, 0x56, 0x70, 0xf3, 0xc2, 0xa6, 0x87, 0x8b, 0x3f, 0xcb, 0x83, 0xd8, 0x8a, 0xe8, + 0xe9, 0x5c, 0xa5, 0x3e, 0x4c, 0xb3, 0xae, 0x77, 0xd7, 0x8c, 0xa4, 0xab, 0xc2, 0x29, 0x01, 0x97, 0x49, 0xe8, 0x9a, 0x8d, 0xec, 0x95, 0xc6, 0x94, 0x48, 0x11, 0xaf, 0x17, 0xfe, 0x69, 0x77, 0xa1, + 0xcb, 0x6e, 0x06, 0xa6, 0x23, 0x30, 0xd9, 0x9e, 0xa4, 0x16, 0xc8, 0x9e, 0xd2, 0x1a, 0x08, 0xe7, 0x41, 0x09, 0x2d, 0xa1, 0x86, 0xcc, 0xd1, 0x06, 0xcd, 0xf4, 0xa0, 0xbc, 0x19, 0xdf, 0x58, 0x8a, + 0x64, 0x90, 0x1f, 0xce, 0xe1, 0x7d, 0x05, 0xb0, 0xb4, 0x11, 0x6c, 0xdc, 0x3b, 0x79, 0x30, 0x41, 0xfb, 0xdd, 0x53, 0x30, 0xb4, 0xb3, 0xd1, 0xef, 0x2e, 0xe5, 0xa4, 0xd3, 0x4f, 0x63, 0x94, 0x17, + 0x72, 0xc3, 0x71, 0x33, 0x8b, 0x01, 0x4d, 0x91, 0x5e, 0xe7, 0x52, 0x59, 0x8c, 0xb2, 0xd2, 0x9e, 0x6d, 0xa1, 0xd0, 0xb5, 0xb7, 0xf8, 0xf4, 0x07, 0x97, 0x02, 0x7e, 0x21, 0x53, 0x5c, 0x9e, 0xf3, + 0x0c, 0xcd, 0x2d, 0x71, 0x05, 0x45, 0xb1, 0x76, 0x4f, 0xed, 0xd6, 0xdf, 0xf1, 0x2c, 0x4a, 0xf5, 0x86, 0x4a, 0xc2, 0x26, 0xe4, 0x08, 0xa6, 0xb8, 0xaa, 0x1a, 0xb2, 0x8b, 0x01, 0x7a, 0xf1, 0xc2, + 0xd2, 0xc6, 0x0d, 0x66, 0x2a, 0x14, 0x72, 0x6c, 0x93, 0xee, 0x71, 0x00, 0xf6, 0x15, 0xdd, 0xdb, 0x27, 0x22, 0x73, 0xfc, 0xde, 0x3b, 0x64, 0x44, 0xe7, 0xc5, 0x3d, 0xb8, 0x8c, 0xd1, 0x0c, 0x37, + 0x20, 0x45, 0x26, 0xd8, 0x42, 0x15, 0x8e, 0xd9, 0xc8, 0xb2, 0x46, 0x54, 0x17, 0x77, 0xdc, 0xc5, 0x91, 0xa3, 0x92, 0x15, 0x29, 0x48, 0xae, 0x82, 0x92, 0x49, 0x9a, 0x5a, 0xa2, 0x2d, 0x06, 0xbe, + 0xc9, 0xa6, 0xc0, 0xc6, 0x83, 0x27, 0x70, 0xfa, 0x90, 0xcf, 0xb3, 0x97, 0x98, 0xa1, 0x9b, 0xa8, 0xb8, 0xb9, 0x0b, 0xcc, 0x80, 0x38, 0x9a, 0x46, 0x19, 0xe8, 0xed, 0x98, 0xdf, 0xd5, 0x89, 0xa0, + 0xf9, 0x15, 0xc8, 0x1f, 0xf6, 0x1d, 0x76, 0x48, 0x22, 0x25, 0xa9, 0xf5, 0x15, 0x37, 0x8d, 0x39, 0x72, 0xb3, 0xd9, 0x71, 0xab, 0x8b, 0xc5, 0xcb, 0x95, 0xac, 0x08, 0x38, 0x0f, 0x8f, 0x5d, 0xb5, + 0x01, 0x05, 0xda, 0xb8, 0x9b, 0x47, 0x6e, 0x20, 0x83, 0xc3, 0xe2, 0xeb, 0xcc, 0xbc, 0xf5, 0x69, 0xbe, 0x5e, 0x79, 0x37, 0xac, 0x18, 0x96, 0x27, 0x26, 0xd6, 0xda, 0xba, 0xbf, 0x14, 0xea, 0xf6, + 0xca, 0x18, 0x36, 0x56, 0x1e, 0xaa, 0x3b, 0x13, 0x97, 0x38, 0x30, 0x6e, 0xac, 0x3c, 0x5f, 0xaa, 0x6c, 0xf4, 0x5b, 0x56, 0x12, 0xc9, 0x4b, 0x42, 0x66, 0x16, 0x95, 0x01, 0x9d, 0x2e, 0x68, 0x42, + 0x80, 0x14, 0x04, 0x2b, 0x23, 0xa7, 0x32, 0x70, 0x2c, 0xf6, 0x4c, 0x72, 0x85, 0xd5, 0x27, 0x38, 0x8b, 0x63, 0x30, 0x97, 0x05, 0x37, 0x7e, 0xac, 0x57, 0x7e, 0x7c, 0x0a, 0x78, 0x94, 0x2e, 0x4d, + 0x58, 0x6b, 0x2e, 0x99, 0x9f, 0x8e, 0x19, 0xba, 0xfc, 0x5f, 0x7a, 0x0c, 0x26, 0x6a, 0xe6, 0xb2, 0xed, 0xc7, 0xec, 0x8d, 0x3d, 0xe2, 0x6c, 0xb4, 0xdf, 0xdd, 0xc7, 0x07, 0x99, 0xfe, 0x73, 0x0f, + 0xf1, 0x77, 0x1e, 0x81, 0x4b, 0xcf, 0x77, 0x42, 0x7d, 0xf9, 0xee, 0x11, 0xe8, 0x9c, 0xa6, 0x17, 0xfb, 0x77, 0x1e, 0x81, 0x89, 0x34, 0x63, 0xda, 0x58, 0xe3, 0x03, 0xed, 0x44, 0x7e, 0x53, 0x14, + 0xd3, 0xe6, 0x2d, 0x8d, 0xa1, 0x3f, 0x30, 0x05, 0x60, 0x0b, 0x4d, 0x31, 0x5a, 0x61, 0x4a, 0xc5, 0x66, 0x8e, 0x11, 0xa5, 0xd1, 0x4c, 0x6d, 0xe3, 0x8d, 0x2f, 0x6a, 0x3a, 0x70, 0x99, 0xa7, 0x34, + 0x49, 0xf3, 0x09, 0x8f, 0x9a, 0x25, 0x6f, 0x32, 0xfd, 0xf1, 0x1d, 0xc7, 0xef, 0x0d, 0x1b, 0x78, 0x3b, 0x18, 0x79, 0xd0, 0x9a, 0xb4, 0x4e, 0x6e, 0x20, 0x4d, 0x09, 0x84, 0xbe, 0xe2, 0x7c, 0xa2, + 0x13, 0xf3, 0xc1, 0x69, 0x35, 0x06, 0xf5, 0x39, 0xfb, 0x9d, 0x2c, 0x3b, 0xbb, 0x56, 0xf1, 0xa8, 0xce, 0x05, 0x9b, 0x26, 0xf4, 0x3e, 0x67, 0xcb, 0xd0, 0x67, 0x9b, 0x7c, 0xea, 0x76, 0xfd, 0xde, + 0xb6, 0x79, 0xd5, 0xcf, 0x74, 0x1f, 0xb0, 0x1c, 0x67, 0xe7, 0x2b, 0xda, 0xf8, 0xa2, 0xfb, 0xac, 0xa3, 0x14, 0xb1, 0x64, 0x0e, 0xb1, 0x47, 0x1d, 0xa1, 0xcd, 0xdb, 0x1a, 0xc3, 0x7f, 0x41, 0xa9, + 0xfa, 0x7e, 0xf7, 0xef, 0x37, 0xe7, 0xf8, 0x52, 0x63, 0xe9, 0x2f, 0xc8, 0x0c, 0xdf, 0x47, 0x07, 0x7c, 0x0d, 0x4f, 0xe6, 0x75, 0x2c, 0x68, 0xdd, 0xc3, 0xfd, 0x04, 0xf3, 0x4f, 0xda, 0xcf, 0xb1, + 0x2c, 0x6d, 0xc9, 0xbf, 0x6e, 0x42, 0x98, 0x6f, 0xeb, 0xe6, 0x41, 0xbf, 0x7f, 0x6f, 0xf4, 0xec, 0xc7, 0x1a, 0x52, 0x35, 0x1e, 0x58, 0x0e, 0x75, 0x6c, 0x39, 0xc8, 0xc7, 0xd9, 0xf0, 0x68, 0x47, + 0x17, 0x83, 0xd8, 0xae, 0x44, 0xb3, 0xd2, 0xcd, 0x6f, 0xe2, 0x86, 0x42, 0xcb, 0x5d, 0x3d, 0xda, 0x28, 0xd4, 0x2f, 0x85, 0x9f, 0xc1, 0x1b, 0x6b, 0xb8, 0x33, 0x7c, 0xe4, 0xcb, 0xd9, 0xaa, 0x65, + 0xb0, 0xe2, 0x60, 0xa9, 0xf7, 0x16, 0x7e, 0x56, 0xa3, 0x1c, 0x22, 0xb4, 0x61, 0x4d, 0x0c, 0xe0, 0x74, 0x8b, 0x9c, 0x52, 0x5a, 0x52, 0x91, 0x19, 0xbe, 0x04, 0x25, 0x14, 0xe5, 0x5d, 0x97, 0x5c, + 0x72, 0xd3, 0x50, 0x9f, 0xe6, 0xa9, 0x0d, 0x65, 0x65, 0x21, 0x4d, 0xb5, 0x2d, 0xad, 0xa3, 0xab, 0xbd, 0xa3, 0x69, 0x3d, 0xbe, 0x7a, 0xa3, 0x12, 0x64, 0x6a, 0x3b, 0x04, 0xc9, 0xcb, 0xcb, 0xd0, + 0xc7, 0x76, 0xba, 0xd4, 0xb5, 0xb1, 0xf8, 0xe3, 0xca, 0x02, 0x22, 0xe5, 0x6e, 0xc9, 0x83, 0x7d, 0x6c, 0xcc, 0x4d, 0x65, 0xa6, 0x25, 0x42, 0xd3, 0x4e, 0xd5, 0x90, 0x01, 0x81, 0xd6, 0x6a, 0x5a, + 0x9e, 0x42, 0x6f, 0xf2, 0x8a, 0xcc, 0x53, 0x37, 0x7a, 0x7b, 0x59, 0x8b, 0xdf, 0x72, 0x97, 0xf9, 0x15, 0x08, 0xd7, 0x9b, 0x9d, 0x32, 0x50, 0xcd, 0x42, 0x42, 0x1d, 0xb4, 0xe2, 0x03, 0x1a, 0xbc, + 0x47, 0x5e, 0xd3, 0x3b, 0x05, 0xf8, 0xb1, 0x2c, 0x66, 0xeb, 0x5d, 0xc0, 0x97, 0xd5, 0xa1, 0x71, 0x2c, 0x2b, 0x38, 0xec, 0x79, 0xdd, 0xfd, 0x39, 0x8a, 0x4f, 0xec, 0x6e, 0x87, 0x47, 0x9a, 0x50, + 0x88, 0x53, 0x23, 0xe7, 0x11, 0xd2, 0xd3, 0x62, 0x23, 0xcd, 0x61, 0xe9, 0xf6, 0x63, 0x27, 0xeb, 0x96, 0x15, 0x12, 0x06, 0xab, 0x87, 0x35, 0x09, 0x70, 0xe2, 0x9e, 0x2e, 0x45, 0x35, 0x8c, 0x40, + 0x83, 0x98, 0x95, 0x46, 0x40, 0xbd, 0xc8, 0x49, 0x5b, 0x26, 0x43, 0xf0, 0x7a, 0x3d, 0xb2, 0xaa, 0x01, 0x5f, 0xc5, 0x2b, 0xd5, 0x6b, 0x7d, 0xeb, 0xc4, 0xaa, 0x66, 0xe9, 0x8d, 0xa7, 0xe9, 0x48, + 0x17, 0x34, 0x5e, 0xdb, 0x24, 0xe3, 0x03, 0x05, 0xef, 0x0c, 0x13, 0xf0, 0xc2, 0xdd, 0x4b, 0x3d, 0x9b, 0x65, 0x4d, 0xa8, 0xd2, 0xc6, 0x47, 0x2f, 0x03, 0x2e, 0x17, 0x89, 0xd9, 0xf9, 0x82, 0x18, + 0x1e, 0xd9, 0xbe, 0x71, 0x9d, 0x94, 0xff, 0x64, 0xde, 0xb2, 0x46, 0x07, 0xef, 0x78, 0xca, 0xd2, 0x86, 0xf6, 0xb9, 0xc7, 0x32, 0xc1, 0xc7, 0x27, 0x94, 0x1a, 0x1c, 0x9d, 0xf3, 0xe2, 0xaf, 0xdb, + 0x26, 0x80, 0xf9, 0xb6, 0x6f, 0xa2, 0x0d, 0x56, 0xe0, 0x04, 0xf8, 0x8e, 0x89, 0x94, 0x19, 0xf1, 0xb2, 0xd0, 0xeb, 0x30, 0x61, 0x1f, 0x49, 0x53, 0xd0, 0x77, 0x8a, 0x82, 0x6d, 0xea, 0x96, 0x26, + 0x1b, 0x8a, 0x1b, 0x86, 0x70, 0x59, 0x23, 0xd5, 0x6a, 0xe1, 0xcc, 0xa6, 0x60, 0xaa, 0xa8, 0x6d, 0x99, 0xc8, 0x0d, 0x76, 0x6d, 0x82, 0x41, 0x37, 0x0b, 0x20, 0xb9, 0x81, 0x7c, 0xe0, 0xf5, 0x56, + 0x59, 0x3c, 0x5d, 0x76, 0x44, 0x84, 0x95, 0x63, 0x48, 0x68, 0xa9, 0x35, 0x25, 0x80, 0x45, 0x83, 0xbf, 0x4e, 0xa7, 0xaa, 0x5f, 0xee, 0x5a, 0x80, 0xf0, 0xce, 0x75, 0x46, 0xbc, 0x7c, 0xaf, 0xea, + 0xd3, 0x9a, 0x36, 0x01, 0x24, 0x46, 0x0c, 0xf2, 0xf3, 0x54, 0x16, 0x3b, 0x6a, 0xbb, 0xee, 0x61, 0x52, 0x68, 0x0c, 0x06, 0x14, 0x71, 0x2e, 0x5c, 0xfd, 0xcb, 0x25, 0x34, 0xc5, 0x8a, 0x23, 0x69, + 0x76, 0x7e, 0x14, 0x96, 0x7e, 0xd6, 0x3c, 0x14, 0xd5, 0x7b, 0x56, 0x94, 0xd7, 0x9e, 0x1d, 0x41, 0x7e, 0xe8, 0x90, 0x1e, 0xf4, 0x58, 0xf4, 0xdc, 0x33, 0x2a, 0x84, 0xb3, 0x39, 0x29, 0xb3, 0x27, + 0x4b, 0xc8, 0x83, 0x82, 0xdd, 0x59, 0xc6, 0xbc, 0xc5, 0x4f, 0x68, 0x8b, 0xbd, 0x29, 0x02, 0x02, 0x02, 0xaa, 0xb1, 0xe2, 0x82, 0x9c, 0x2b, 0x77, 0x74, 0x07, 0x4e, 0x88, 0xc4, 0xf3, 0x70, 0xe4, + 0xe2, 0xac, 0xa7, 0x5b, 0x89, 0xee, 0x91, 0xde, 0x56, 0x32, 0xfb, 0x42, 0xd1, 0x00, 0xc9, 0x6a, 0x83, 0xcf, 0xb0, 0x8b, 0x1e, 0x2d, 0xc6, 0x78, 0xa2, 0x5b, 0x23, 0x8d, 0x86, 0x76, 0xc2, 0x5d, + 0x68, 0x5c, 0xa1, 0xab, 0x8c, 0x67, 0xc1, 0x44, 0x49, 0x80, 0xc9, 0x6e, 0x8c, 0x1f, 0x4f, 0xe9, 0x6c, 0xdf, 0x2c, 0x93, 0x92, 0xd1, 0xdb, 0xcc, 0x5d, 0xf2, 0x74, 0x3b, 0xa2, 0x02, 0x87, 0x88, + 0xea, 0x74, 0xaf, 0xf7, 0x8c, 0x91, 0xcc, 0x8e, 0x53, 0xf8, 0xdb, 0x2b, 0x38, 0xdb, 0xe1, 0x5f, 0x20, 0xd4, 0xbf, 0xc6, 0xe6, 0xca, 0xbe, 0xfb, 0x1e, 0x11, 0x3b, 0xfe, 0x25, 0x2e, 0xfd, 0x77, + 0xa0, 0xc9, 0xd7, 0x36, 0xcb, 0xd2, 0x48, 0xfb, 0x1d, 0x34, 0x4d, 0x6f, 0x36, 0xdc, 0x3f, 0xa1, 0xd1, 0x13, 0xf7, 0x33, 0x1c, 0xb9, 0xae, 0xb6, 0x0b, 0x15, 0xed, 0x7c, 0x23, 0xab, 0xbd, 0xcd, + 0x39, 0xdf, 0x29, 0xe1, 0x24, 0xf3, 0xcd, 0x12, 0x1c, 0xe8, 0xfe, 0xce, 0x35, 0xbf, 0x18, 0xb0, 0x26, 0xfd, 0x19, 0xb5, 0xd6, 0xf2, 0xc8, 0xd7, 0xf2, 0xc8, 0xc3, 0xaa, 0x18, 0x51, 0x36, 0x20, + 0x46, 0x94, 0x22, 0x15, 0xdd, 0xfa, 0x3b, 0xbf, 0x6e, 0xdd, 0x23, 0xf4, 0xb0, 0x2a, 0xb4, 0xf9, 0xe7, 0xb7, 0x9d, 0xe2, 0x3b, 0xc6, 0x79, 0x9f, 0x74, 0x51, 0xde, 0x34, 0x2e, 0xf8, 0x81, 0x2e, + 0x6e, 0xb9, 0xe5, 0x61, 0xd5, 0xad, 0xe2, 0x67, 0x8d, 0x9d, 0x44, 0xe0, 0x1b, 0xe8, 0xd5, 0x7f, 0x18, 0x30, 0x5f, 0xd1, 0x85, 0xbf, 0xa4, 0xd2, 0xdf, 0x90, 0x1a, 0xd6, 0x6c, 0xfe, 0xd0, 0x4f, + 0x79, 0xd3, 0x2a, 0x0d, 0x04, 0xb4, 0xe6, 0x03, 0xaa, 0xbf, 0x37, 0xea, 0xb6, 0x06, 0x6a, 0x4d, 0xbf, 0xe5, 0x31, 0xfd, 0x3d, 0xee, 0xf1, 0x11, 0xf6, 0x68, 0x5c, 0x5b, 0x33, 0x83, 0x4d, 0xa0, + 0xbf, 0x28, 0x35, 0xf4, 0x07, 0xa5, 0x66, 0x19, 0x25, 0x6e, 0xb5, 0x05, 0xd0, 0xec, 0x7a, 0xd3, 0xb7, 0x6f, 0x8e, 0xe5, 0x64, 0x90, 0x14, 0x49, 0x96, 0xf0, 0x67, 0xd6, 0xbb, 0x1a, 0x10, 0x63, + 0xcb, 0x62, 0x73, 0x7e, 0xa7, 0xd4, 0x22, 0x75, 0x04, 0xef, 0x2c, 0x98, 0x65, 0xca, 0xcc, 0x62, 0x8e, 0xd0, 0x0b, 0x9b, 0xa4, 0x75, 0x17, 0x20, 0x80, 0x9d, 0x5d, 0xfa, 0xc6, 0x89, 0xde, 0x1f, + 0xb6, 0x50, 0x7e, 0x6c, 0x37, 0x0e, 0x8d, 0xa3, 0xe1, 0x1f, 0xb6, 0x1b, 0xdf, 0x5f, 0xcc, 0xcd, 0xa6, 0xc7, 0xaf, 0xd0, 0x8f, 0xf2, 0xc7, 0xf7, 0x1f, 0xf0, 0x0f, 0xa4, 0x2c, 0xc3, 0x85, 0xbe, + 0x02, 0x46, 0x5e, 0x38, 0x04, 0xb0, 0x00, 0x46, 0x1e, 0xb5, 0xc8, 0xbc, 0x00, 0xa5, 0x62, 0xb1, 0x26, 0x6d, 0x03, 0x66, 0xf6, 0xbf, 0xee, 0x1f, 0x00, 0xfa, 0x16, 0xb9, 0x73, 0xad, 0xb3, 0x97, + 0x29, 0x9c, 0xd5, 0x96, 0x92, 0x11, 0xcc, 0xd4, 0xee, 0x6e, 0x22, 0x10, 0x93, 0x8e, 0xf1, 0x8e, 0xd0, 0xeb, 0x0b, 0x32, 0x5d, 0x87, 0x9e, 0xa9, 0x70, 0x1e, 0x55, 0x1f, 0x27, 0xc2, 0xf3, 0x61, + 0x7b, 0xab, 0xc1, 0x4c, 0x1c, 0xf9, 0xc8, 0x9e, 0x62, 0x73, 0x53, 0x3c, 0x79, 0xd2, 0xba, 0xab, 0x16, 0x4c, 0x27, 0x40, 0x53, 0x0b, 0x92, 0x23, 0xd3, 0x45, 0x96, 0xcd, 0x8c, 0x88, 0x15, 0x4f, + 0x55, 0x9f, 0x28, 0x7a, 0x6b, 0xe8, 0xc4, 0x7e, 0x0a, 0x07, 0x98, 0xdc, 0x9b, 0x63, 0xe8, 0x37, 0x56, 0x75, 0x83, 0xc2, 0x8f, 0x4d, 0xaa, 0x83, 0x40, 0x76, 0xbd, 0xe6, 0xf5, 0xaa, 0x8c, 0x36, + 0x91, 0xd9, 0xfa, 0x62, 0xe4, 0x02, 0x7d, 0x65, 0x83, 0x17, 0x4f, 0xdf, 0xb7, 0x0d, 0x60, 0x2b, 0x30, 0x38, 0x9f, 0x2b, 0xa5, 0x36, 0x6d, 0x24, 0x63, 0x8e, 0x7f, 0xe3, 0xbd, 0x4c, 0x82, 0x31, + 0x2e, 0xf3, 0x40, 0xcd, 0x57, 0xaa, 0x8b, 0xa5, 0x3e, 0x05, 0x19, 0x4c, 0x13, 0x7f, 0x85, 0x16, 0x6c, 0xc7, 0x41, 0xaa, 0x2d, 0x04, 0x30, 0x88, 0x38, 0x0f, 0x57, 0xd5, 0x2a, 0x96, 0x2a, 0x35, + 0xe0, 0x2e, 0x8a, 0x2f, 0xca, 0x63, 0x8c, 0x93, 0x40, 0x85, 0xef, 0x56, 0x53, 0x2f, 0x2f, 0x27, 0x40, 0x6a, 0xfe, 0xe4, 0x43, 0x9c, 0xc7, 0xf4, 0x8e, 0x5a, 0xa6, 0x09, 0x1e, 0xdd, 0x95, 0x6b, + 0x9c, 0x24, 0x19, 0xf0, 0xac, 0xbb, 0x18, 0x88, 0x0f, 0xa6, 0xb9, 0xde, 0x32, 0x0b, 0x54, 0xb7, 0x5b, 0x21, 0x5d, 0xb0, 0xe1, 0x51, 0x52, 0x28, 0x57, 0x87, 0xcf, 0x09, 0xd4, 0x37, 0x74, 0xc8, + 0x25, 0x46, 0x07, 0xc6, 0xb3, 0x14, 0x6f, 0x03, 0x76, 0x75, 0xf1, 0x4b, 0x26, 0xe0, 0xc4, 0x28, 0x69, 0x53, 0x2f, 0xbb, 0x17, 0x58, 0xd2, 0xab, 0xae, 0xcf, 0x8d, 0xf2, 0x92, 0x3e, 0x22, 0x58, + 0x9b, 0xbe, 0xf9, 0x87, 0x3b, 0x33, 0x71, 0x2c, 0x33, 0xda, 0x3f, 0xd3, 0xe7, 0x2f, 0xf6, 0x0c, 0xfc, 0x09, 0x7d, 0xfe, 0x78, 0xfd, 0x92, 0x49, 0xf3, 0x0a, 0x47, 0x97, 0x39, 0x4d, 0x7e, 0x4c, + 0x95, 0x1f, 0x67, 0xbb, 0xd6, 0xbc, 0x18, 0xee, 0xe3, 0x73, 0xb0, 0x6b, 0xb6, 0x8c, 0x68, 0x15, 0x0d, 0x01, 0xda, 0x69, 0x1c, 0x5e, 0x45, 0x3f, 0x3f, 0x2e, 0xb6, 0x34, 0x5e, 0xe4, 0x68, 0x2f, + 0x67, 0xcc, 0xbe, 0xbe, 0x9b, 0xdd, 0xa0, 0x86, 0x76, 0xae, 0x65, 0x62, 0xf8, 0xb2, 0x77, 0x0a, 0x9c, 0xb9, 0x0b, 0x6a, 0x51, 0xb1, 0xfd, 0x33, 0x4f, 0x8f, 0x14, 0xae, 0x0e, 0x71, 0xab, 0x75, + 0x50, 0x4e, 0x02, 0x8a, 0x36, 0xaa, 0xc9, 0x67, 0x7a, 0x33, 0xae, 0x0b, 0xbf, 0x7a, 0xe0, 0xbb, 0x8b, 0xfb, 0x36, 0x9f, 0x42, 0x8a, 0x01, 0x79, 0x9a, 0x61, 0xe8, 0x8d, 0x2b, 0x26, 0xd9, 0xad, + 0x92, 0x45, 0xb3, 0x7b, 0xf0, 0x56, 0xd1, 0x1c, 0x9d, 0x5b, 0xc6, 0xaf, 0x1e, 0xeb, 0xdd, 0x61, 0x01, 0xdf, 0x3c, 0x96, 0x0d, 0x71, 0xec, 0x06, 0x6d, 0x5a, 0xae, 0xce, 0x1c, 0x16, 0x5c, 0x4a, + 0x93, 0xa3, 0x9d, 0xfc, 0xe5, 0x92, 0xe1, 0xd1, 0xcd, 0x87, 0x3d, 0x5b, 0x3b, 0x4c, 0xb1, 0xde, 0x05, 0x32, 0x23, 0xd1, 0xda, 0x34, 0xf6, 0x91, 0x1d, 0xab, 0xec, 0xf5, 0x9d, 0x4f, 0xcd, 0x77, + 0x48, 0x3d, 0xd5, 0x79, 0xed, 0x20, 0xd9, 0xd2, 0x80, 0xe0, 0x1a, 0x3c, 0x8e, 0x23, 0x60, 0x6a, 0x97, 0x99, 0x28, 0x81, 0x74, 0xd0, 0x41, 0x07, 0x37, 0xe6, 0x9e, 0x69, 0xdc, 0x60, 0xa0, 0x84, + 0x99, 0xef, 0xe6, 0xb9, 0xc9, 0xb5, 0xa5, 0x27, 0x4e, 0x36, 0x1d, 0xcc, 0xa8, 0xe0, 0xe1, 0x12, 0xd1, 0x22, 0x6d, 0x5f, 0x11, 0xe6, 0xe2, 0xef, 0x82, 0x6e, 0x99, 0xcb, 0x29, 0xb8, 0x0a, 0x71, + 0xb8, 0x76, 0x04, 0xac, 0x18, 0xec, 0x8e, 0xf0, 0x12, 0xc1, 0x0a, 0x31, 0x90, 0x99, 0xc9, 0x55, 0x99, 0x6c, 0x9a, 0xdc, 0xeb, 0x3a, 0x12, 0x30, 0x67, 0x74, 0xba, 0x55, 0xe2, 0x2f, 0x62, 0x38, + 0xba, 0x07, 0xe5, 0x19, 0x09, 0x5b, 0x23, 0xe6, 0xaa, 0xbe, 0xa6, 0xee, 0x18, 0x8d, 0x2b, 0x42, 0x5d, 0xe1, 0x0e, 0x79, 0x4d, 0x19, 0xb8, 0x29, 0x89, 0xc8, 0xc3, 0x95, 0x6d, 0x01, 0x1e, 0x52, + 0x72, 0xee, 0x72, 0x24, 0xfa, 0xa4, 0xb5, 0x68, 0x21, 0xc1, 0x21, 0x58, 0xa7, 0xf5, 0x6b, 0xd1, 0x2e, 0x97, 0xf5, 0x9a, 0x2d, 0xb8, 0x60, 0xbd, 0x52, 0x23, 0x7f, 0xb0, 0x9d, 0xcf, 0xbf, 0x9c, + 0x5b, 0x43, 0x0a, 0xad, 0xbd, 0x5b, 0x46, 0xc6, 0xe9, 0xb3, 0xf8, 0x78, 0xd0, 0xce, 0x1d, 0xef, 0xe4, 0x47, 0x52, 0xc1, 0x34, 0x41, 0x42, 0x2f, 0x10, 0x98, 0xa5, 0x65, 0x81, 0xf3, 0xc5, 0xb8, + 0x4b, 0xfe, 0x9a, 0x9b, 0x50, 0x0b, 0xae, 0xa9, 0x9f, 0x70, 0xd1, 0xb9, 0x5e, 0xb7, 0x7e, 0x44, 0xf8, 0xa6, 0x70, 0x27, 0xfb, 0x5a, 0x60, 0x57, 0x6f, 0x34, 0xc8, 0xbf, 0xf2, 0x58, 0x6c, 0xdf, + 0xf6, 0x69, 0xff, 0x46, 0xd3, 0xf4, 0x47, 0xb4, 0xa7, 0x4c, 0xb2, 0xcf, 0xac, 0xcb, 0x9f, 0x7a, 0xa9, 0xbf, 0xf5, 0x4c, 0xda, 0x47, 0x80, 0xe7, 0xf5, 0xe5, 0x99, 0x18, 0xfa, 0xf7, 0x54, 0x9e, + 0xf8, 0x85, 0xca, 0x4b, 0x46, 0xc5, 0xc7, 0x1a, 0xf3, 0xe9, 0xa5, 0x58, 0x7a, 0xb3, 0x00, 0x13, 0x51, 0x9a, 0x77, 0xc4, 0x4c, 0x4a, 0x46, 0x0f, 0x3c, 0xac, 0x8a, 0x44, 0xf7, 0x4c, 0x45, 0xf7, + 0xf8, 0x21, 0xe2, 0x2c, 0x71, 0x74, 0x6a, 0x07, 0xde, 0xde, 0xc6, 0x88, 0x52, 0x6b, 0x66, 0xbf, 0x89, 0xdf, 0x60, 0x9b, 0x63, 0x04, 0x2e, 0x86, 0xa1, 0x35, 0x14, 0xc9, 0xdc, 0x00, 0xf9, 0x1c, + 0xf8, 0x21, 0x08, 0x51, 0x68, 0x0c, 0xf9, 0xc9, 0xa8, 0xb7, 0x2d, 0x30, 0x1c, 0x81, 0xf9, 0xc5, 0xa1, 0x34, 0xb2, 0xf0, 0xfe, 0xef, 0x77, 0x00, 0x75, 0xcf, 0x6f, 0xce, 0x04, 0xd4, 0x38, 0x7e, + 0xd3, 0x3e, 0xe8, 0x3f, 0xbd, 0x01, 0xdf, 0x78, 0x3f, 0xaa, 0xd9, 0xf2, 0xf9, 0xfe, 0x9f, 0x6e, 0xd7, 0xd0, 0xdd, 0xed, 0xb7, 0xec, 0x97, 0x30, 0xbf, 0x09, 0xca, 0x3f, 0x44, 0xea, 0x73, 0x8d, + 0xaf, 0xd3, 0x23, 0xf4, 0x04, 0x30, 0xf4, 0xe5, 0xdc, 0xf6, 0x84, 0x25, 0x80, 0x8b, 0x06, 0x48, 0x10, 0xb3, 0x49, 0x2a, 0xde, 0xf8, 0x16, 0x76, 0xe5, 0x99, 0x6d, 0x93, 0x1c, 0x58, 0x98, 0xc2, + 0x96, 0x3a, 0x42, 0x8e, 0x8f, 0x34, 0x26, 0xff, 0x7c, 0x26, 0xf9, 0x66, 0x1a, 0x30, 0x35, 0xc7, 0xb0, 0xb9, 0xca, 0xbc, 0xce, 0xfc, 0x18, 0x7a, 0x92, 0xed, 0xcf, 0x75, 0xfd, 0xbe, 0xf1, 0xd6, + 0xc4, 0xf7, 0x6d, 0xb2, 0xf5, 0xb3, 0x1f, 0x08, 0x2d, 0xc6, 0x0e, 0x7d, 0x05, 0x8e, 0x3c, 0xbd, 0x49, 0xce, 0x7f, 0xcd, 0x07, 0x00, 0x1f, 0x9b, 0x84, 0x1b, 0x46, 0x77, 0x4f, 0x73, 0x41, 0xb3, + 0x01, 0x2e, 0xf6, 0x5d, 0x37, 0x1d, 0xeb, 0xbe, 0xd6, 0xb1, 0x9c, 0x6f, 0x51, 0xba, 0x59, 0xe3, 0x45, 0x64, 0x2e, 0x77, 0x8c, 0xbe, 0xe1, 0x24, 0x3e, 0xa7, 0x8e, 0xdc, 0x7b, 0x9a, 0xb1, 0x44, + 0xcc, 0xcc, 0x09, 0x09, 0x7b, 0xd3, 0x2d, 0x0b, 0x72, 0x02, 0xf2, 0x80, 0xe3, 0xb6, 0x10, 0x01, 0x16, 0x7a, 0xbc, 0x0e, 0x70, 0xab, 0xb7, 0xdb, 0x7e, 0xd8, 0xcb, 0xb8, 0x0b, 0x11, 0x01, 0xba, + 0x4a, 0x6f, 0xb1, 0x93, 0x8e, 0x4f, 0x95, 0x9e, 0xa3, 0xf3, 0x4b, 0x71, 0x9f, 0x5a, 0xe9, 0x3d, 0x1e, 0x19, 0xa2, 0x5d, 0xd7, 0x1c, 0x8d, 0xca, 0x4a, 0x31, 0x1f, 0x1d, 0x5c, 0x1d, 0xad, 0xc2, + 0x88, 0x05, 0xfb, 0x94, 0xd2, 0xf1, 0x5a, 0x9d, 0x9c, 0x33, 0x01, 0x25, 0x84, 0x4a, 0xa1, 0xe8, 0xb1, 0x1b, 0x5f, 0x6e, 0x2f, 0x45, 0xc2, 0x82, 0x90, 0x82, 0x65, 0x81, 0xed, 0xeb, 0x24, 0x6d, + 0xe7, 0x6c, 0x46, 0x83, 0x5c, 0xf7, 0x48, 0xb9, 0x8f, 0xf8, 0x4b, 0xbf, 0xf7, 0x3b, 0x9e, 0xb7, 0x4f, 0x10, 0xa5, 0xd6, 0xa0, 0xd3, 0x9a, 0x62, 0x65, 0xae, 0xee, 0xb8, 0x3c, 0x26, 0x47, 0xc5, + 0x2f, 0xc8, 0x6b, 0x3a, 0x3d, 0x20, 0x80, 0xa8, 0xb3, 0xd2, 0x7b, 0xa1, 0x8d, 0x72, 0xf4, 0xa5, 0x4d, 0x7e, 0xc6, 0x85, 0xe6, 0x78, 0x6f, 0x33, 0x4a, 0xca, 0xf1, 0x2a, 0x21, 0x1f, 0xb0, 0x73, + 0x2b, 0x5b, 0xfa, 0x18, 0x6f, 0x18, 0x79, 0xa7, 0x53, 0x62, 0xed, 0xb0, 0x46, 0x21, 0x2d, 0xe4, 0x39, 0x4a, 0xa6, 0x2e, 0x62, 0x25, 0x64, 0x92, 0x7e, 0xa3, 0xa6, 0x12, 0x56, 0x33, 0x95, 0x04, + 0x04, 0xc3, 0x71, 0xc9, 0xc9, 0xa4, 0xcd, 0x4e, 0x5c, 0x55, 0x92, 0x27, 0x8d, 0x84, 0x48, 0xab, 0x7b, 0xb9, 0x21, 0x2b, 0xf0, 0x03, 0xd6, 0x09, 0x6b, 0x43, 0xad, 0x84, 0x73, 0x89, 0xfe, 0x46, + 0xd6, 0xdf, 0x7d, 0xc0, 0xc6, 0xb1, 0xcc, 0xfa, 0x0b, 0xda, 0xf6, 0x0c, 0xaf, 0x02, 0xf2, 0x89, 0x7b, 0xa4, 0xf1, 0x9c, 0xd0, 0x17, 0x39, 0x10, 0xa8, 0xda, 0x3c, 0x29, 0x7a, 0x1b, 0x6e, 0xc6, + 0x9f, 0xec, 0x05, 0xc8, 0x1f, 0xf7, 0x0e, 0x82, 0x46, 0x7f, 0x04, 0xea, 0xb7, 0xec, 0xd3, 0x87, 0x3c, 0x01, 0x46, 0x32, 0xb6, 0xa4, 0xa2, 0xd1, 0x9e, 0x8b, 0x72, 0x5d, 0x0e, 0x8e, 0x48, 0x32, + 0xc1, 0x84, 0xeb, 0xd7, 0x1b, 0xac, 0x1f, 0x31, 0x8b, 0x55, 0x9f, 0xcb, 0x85, 0xaa, 0x02, 0xeb, 0xfd, 0x33, 0xb8, 0xbe, 0xaf, 0x8c, 0x9f, 0x23, 0x72, 0xee, 0xf7, 0x29, 0x04, 0x24, 0x07, 0x56, + 0x25, 0xed, 0xb6, 0xe9, 0x2f, 0x1a, 0xec, 0x39, 0x55, 0xd4, 0xc4, 0x02, 0x4c, 0x25, 0x1a, 0xbf, 0x1d, 0xd4, 0x7b, 0xfb, 0x3b, 0xe3, 0xf9, 0x98, 0xa8, 0xdf, 0x98, 0x22, 0x63, 0x38, 0xc2, 0xcf, + 0xf3, 0xd1, 0xfd, 0x63, 0x89, 0x01, 0xb7, 0x56, 0x3f, 0xe2, 0xdf, 0x71, 0xd7, 0x6f, 0xe9, 0x01, 0x56, 0x88, 0x49, 0x7a, 0x65, 0x63, 0xfc, 0x71, 0xa9, 0x2f, 0x73, 0x48, 0xec, 0xb5, 0x45, 0x9f, + 0xf5, 0x95, 0xdf, 0x9f, 0x01, 0xed, 0x69, 0x47, 0x3b, 0x8f, 0x9b, 0x63, 0x79, 0x39, 0x9f, 0x2e, 0x55, 0x0b, 0x10, 0x0d, 0x32, 0xd1, 0x39, 0x95, 0x43, 0x3d, 0x64, 0x88, 0x3c, 0xd9, 0xda, 0xb9, + 0x54, 0x61, 0x23, 0xdb, 0x10, 0xe3, 0x85, 0x4c, 0x05, 0x93, 0x59, 0xaf, 0x08, 0xc9, 0x8f, 0x95, 0x64, 0x43, 0x23, 0x58, 0x7a, 0xb4, 0xf0, 0x84, 0x59, 0x84, 0x71, 0xc6, 0x93, 0x5a, 0x25, 0x76, + 0x25, 0x2d, 0x2c, 0x95, 0x23, 0xf8, 0xe6, 0x43, 0xe3, 0xa9, 0xdf, 0x4e, 0xc0, 0x9c, 0xc1, 0x75, 0x5f, 0x98, 0xd7, 0x46, 0x6a, 0x20, 0x7d, 0xec, 0x54, 0x33, 0x43, 0xd1, 0x96, 0xe3, 0x1d, 0x3b, + 0x74, 0x0c, 0x13, 0x2c, 0x23, 0xc7, 0x5e, 0x4f, 0x9f, 0x1b, 0x1f, 0x31, 0x97, 0xba, 0x6c, 0xf0, 0xcc, 0x1c, 0x90, 0x99, 0xbc, 0xfb, 0x95, 0x9c, 0x5f, 0x73, 0x13, 0xe7, 0x36, 0x2c, 0x52, 0x1b, + 0x89, 0x0a, 0xbd, 0xbb, 0x0f, 0x44, 0x08, 0x90, 0x6e, 0x23, 0x6b, 0xac, 0xd0, 0xd0, 0xf0, 0x39, 0xe1, 0x96, 0x70, 0x12, 0xca, 0xc4, 0xf5, 0x19, 0x8d, 0x8c, 0x11, 0xed, 0x8a, 0xf2, 0x15, 0x5f, + 0xf2, 0xdb, 0x7d, 0x38, 0x8e, 0x81, 0x67, 0xb4, 0x09, 0xba, 0x3b, 0xb2, 0xf2, 0x9a, 0xca, 0x06, 0xe6, 0xd0, 0x5a, 0xc0, 0x40, 0x48, 0x55, 0x23, 0x87, 0x40, 0x8e, 0x97, 0x57, 0xe5, 0x7d, 0x4b, + 0xb0, 0x00, 0x04, 0x1f, 0x7b, 0xbf, 0x5d, 0xb2, 0xf5, 0x32, 0xf7, 0x18, 0x14, 0x1f, 0xe3, 0x7a, 0xab, 0xd4, 0x33, 0xc7, 0xd9, 0x40, 0x84, 0x22, 0xd4, 0xf7, 0xd7, 0x12, 0x99, 0x1f, 0xfb, 0x0b, + 0x99, 0xda, 0x47, 0x49, 0x79, 0xf2, 0x94, 0xcf, 0xe6, 0x8b, 0xe6, 0x05, 0x83, 0xb4, 0x5b, 0xae, 0xc3, 0xfc, 0x41, 0x1f, 0xa2, 0x20, 0xce, 0xff, 0x3a, 0x3d, 0x60, 0x2c, 0xbd, 0x1b, 0xa5, 0xe5, + 0xf4, 0x95, 0x2d, 0x7d, 0x83, 0xff, 0x37, 0xf2, 0xa5, 0xc2, 0xfc, 0x0e, 0x37, 0xd8, 0xf7, 0xf0, 0x0e, 0xcb, 0x18, 0xf5, 0x6f, 0x73, 0xa4, 0xa6, 0xfd, 0x6b, 0x8e, 0x14, 0xdc, 0x7f, 0x4c, 0x91, + 0x02, 0xbc, 0x20, 0x40, 0x31, 0x14, 0x16, 0xe1, 0x3b, 0xab, 0xfe, 0x01, 0xfc, 0x7e, 0xca, 0x85, 0x36, 0x3f, 0xd8, 0xfc, 0x91, 0x64, 0xcc, 0xb5, 0xea, 0x23, 0xac, 0xbe, 0xe9, 0x15, 0xbf, 0x7f, + 0x84, 0xd5, 0xef, 0x9c, 0x8c, 0x7c, 0xcb, 0x85, 0x9e, 0x9a, 0xfd, 0xd9, 0x78, 0xe7, 0xe4, 0x53, 0x3b, 0xf5, 0x48, 0xe3, 0x9d, 0x9f, 0xf7, 0x04, 0xb5, 0xa2, 0xff, 0x92, 0x0a, 0x35, 0x53, 0x8f, + 0xf2, 0x02, 0xcf, 0x1c, 0x92, 0x83, 0xd1, 0x80, 0xc8, 0x83, 0x86, 0xf7, 0x6d, 0xcf, 0x57, 0xce, 0xf3, 0x5b, 0xca, 0xf3, 0x47, 0xa3, 0xef, 0x79, 0xd1, 0xf7, 0x6d, 0x4f, 0x9e, 0xcb, 0x7f, 0x96, + 0xf2, 0x64, 0x81, 0xcf, 0x9c, 0xa7, 0xac, 0xd2, 0xbd, 0xcc, 0xd2, 0x06, 0x1b, 0x89, 0xda, 0x70, 0x6b, 0x68, 0x90, 0xbe, 0x45, 0x24, 0xa7, 0x06, 0xe3, 0xc6, 0xa1, 0x92, 0x3c, 0xd6, 0x5b, 0x58, + 0x98, 0xa0, 0xdc, 0xe1, 0xd3, 0x60, 0xca, 0xfe, 0x79, 0x43, 0xc5, 0x59, 0x2b, 0x70, 0xc3, 0x1c, 0x2f, 0x55, 0x51, 0x06, 0x91, 0xb4, 0x62, 0x17, 0x89, 0xc9, 0x71, 0xc0, 0x57, 0xf6, 0x5c, 0x38, + 0x7a, 0x3c, 0x95, 0xb5, 0x53, 0x93, 0xa0, 0xc2, 0x65, 0xa4, 0x1b, 0x11, 0xad, 0x39, 0x36, 0xab, 0xe5, 0x73, 0x75, 0xc7, 0x78, 0x2f, 0x11, 0x36, 0x9f, 0xe6, 0x6b, 0x56, 0x5f, 0x88, 0x6d, 0x14, + 0xa7, 0x9d, 0x1b, 0x10, 0x4d, 0x11, 0x85, 0x6b, 0x91, 0x5e, 0x23, 0x3b, 0xba, 0x62, 0x98, 0xe2, 0x0d, 0x67, 0xab, 0x5d, 0x82, 0x1a, 0x68, 0xd6, 0xe4, 0xba, 0x34, 0xd3, 0x28, 0x49, 0x3d, 0xb4, + 0xcd, 0x61, 0x77, 0x7d, 0xcd, 0xad, 0x23, 0xcf, 0xb3, 0x2a, 0xd2, 0x23, 0x41, 0xa5, 0xf9, 0x46, 0x66, 0xf6, 0x2a, 0x83, 0x70, 0xfd, 0xd4, 0xaf, 0x17, 0x7d, 0x32, 0x79, 0xd2, 0x4a, 0x52, 0x24, + 0x66, 0xc6, 0x31, 0x61, 0xa3, 0x5e, 0xc0, 0x5f, 0x8e, 0xc7, 0xa1, 0xb9, 0xdf, 0x2e, 0x6e, 0xcc, 0x00, 0x0d, 0x97, 0x3d, 0x2c, 0x49, 0xa8, 0xe4, 0x65, 0xf3, 0x43, 0x23, 0x73, 0xcb, 0x7a, 0x7d, + 0x56, 0x64, 0x18, 0xb1, 0x8b, 0xb7, 0xa1, 0x10, 0x95, 0x45, 0xbb, 0x38, 0x72, 0x8f, 0x56, 0xc0, 0x41, 0x7b, 0xb8, 0xd0, 0xe6, 0x49, 0x2e, 0xdd, 0xc5, 0x57, 0x4a, 0x8d, 0xf2, 0xef, 0x6b, 0x44, + 0x98, 0x97, 0x33, 0x35, 0x13, 0xba, 0x9c, 0xb5, 0x7b, 0x26, 0x1e, 0x40, 0x13, 0x3a, 0xb3, 0xd1, 0x3f, 0x7d, 0x28, 0xbe, 0x1b, 0x06, 0x91, 0x4e, 0xfc, 0x55, 0xca, 0x90, 0x67, 0xcc, 0x5f, 0xe4, + 0xfa, 0x0a, 0xfa, 0x3e, 0x54, 0x4f, 0x77, 0x13, 0x0a, 0x5e, 0x32, 0xa8, 0x70, 0x13, 0x22, 0x22, 0x59, 0x99, 0x28, 0x4d, 0x12, 0x46, 0x37, 0xce, 0x78, 0x50, 0xdd, 0x8d, 0x8a, 0x85, 0xd7, 0x61, + 0xc1, 0x97, 0xf1, 0x92, 0xf9, 0xc7, 0x0c, 0xe0, 0xf8, 0x15, 0x11, 0xa6, 0x35, 0x3e, 0x2d, 0x67, 0xc4, 0xcc, 0x2b, 0xd1, 0x0e, 0xd7, 0xd2, 0x49, 0x36, 0xdc, 0xd9, 0x76, 0x19, 0xcb, 0x71, 0xea, + 0x88, 0x4d, 0x98, 0x69, 0x6e, 0x2d, 0x6f, 0xde, 0x85, 0xa4, 0xd5, 0x38, 0xe6, 0x4e, 0xf3, 0x7a, 0x39, 0xe5, 0xa2, 0x71, 0xeb, 0x53, 0x35, 0x79, 0xce, 0x53, 0xe3, 0x85, 0x2b, 0x03, 0x29, 0xe9, + 0xde, 0x01, 0x9b, 0x81, 0x15, 0x81, 0x5c, 0x9e, 0x8f, 0x59, 0xec, 0xaf, 0xea, 0x23, 0x92, 0x62, 0xce, 0x9c, 0x2c, 0xdd, 0x41, 0x40, 0x13, 0x8e, 0x33, 0x88, 0x81, 0x35, 0xf1, 0x90, 0xc7, 0xd0, + 0x96, 0x74, 0x12, 0x92, 0xd2, 0xa3, 0x48, 0x8f, 0x7e, 0xc7, 0x58, 0x04, 0xc2, 0x32, 0x3f, 0x3e, 0xee, 0xdc, 0x15, 0x0b, 0x38, 0x9f, 0x85, 0xef, 0xf9, 0xf5, 0xbc, 0x17, 0x00, 0x47, 0xf4, 0x93, + 0x60, 0xfa, 0xaf, 0x86, 0x78, 0x58, 0xfd, 0xe8, 0x5d, 0xc8, 0xfe, 0xf0, 0xa4, 0xe2, 0xf5, 0x90, 0xbc, 0xa3, 0x0e, 0xec, 0x0c, 0x2b, 0x3a, 0xed, 0x84, 0xb0, 0xcc, 0xeb, 0x4a, 0x9d, 0xca, 0x5f, + 0xa6, 0x96, 0x67, 0x6a, 0x01, 0xc6, 0x43, 0xe7, 0x63, 0x8e, 0xd4, 0x1f, 0x89, 0x49, 0x14, 0x81, 0x91, 0x11, 0xbb, 0x60, 0xd5, 0xc7, 0x01, 0x30, 0xba, 0x3a, 0x12, 0x94, 0x4f, 0x71, 0x82, 0x74, + 0x77, 0xc4, 0x5e, 0xd6, 0x9e, 0xad, 0x09, 0xe7, 0xc7, 0x23, 0x14, 0x36, 0x6e, 0x3b, 0x5f, 0x37, 0x99, 0xa3, 0x96, 0xca, 0x4b, 0xa8, 0xfb, 0x1c, 0x5f, 0x9e, 0xee, 0x22, 0x1f, 0x2e, 0x41, 0x9c, + 0xa2, 0x94, 0x94, 0xa7, 0x8e, 0x80, 0xa0, 0x71, 0xe8, 0x46, 0x53, 0x32, 0x8a, 0xec, 0xf1, 0x7a, 0x99, 0x01, 0x0a, 0xf8, 0x24, 0xee, 0x87, 0x54, 0x5d, 0xee, 0x53, 0xea, 0x6d, 0xdf, 0x32, 0x03, + 0xa8, 0xb8, 0x69, 0xb2, 0x38, 0xff, 0x99, 0x67, 0x62, 0x3f, 0x3d, 0xd3, 0xe3, 0xbb, 0x07, 0xfb, 0x96, 0x4a, 0x06, 0x3e, 0x73, 0xc9, 0x46, 0x54, 0x88, 0x2a, 0x69, 0xf1, 0xdb, 0xa9, 0x18, 0xb6, + 0x43, 0xcc, 0x1c, 0x4c, 0x93, 0x46, 0x68, 0xce, 0xa2, 0x13, 0x9d, 0xcc, 0xf2, 0xb5, 0x8b, 0x09, 0x4f, 0xa6, 0xc9, 0xff, 0xc2, 0x16, 0x88, 0x70, 0x41, 0x19, 0xf8, 0xe4, 0x6f, 0xe1, 0xe5, 0x5f, + 0x41, 0x17, 0xe0, 0x4f, 0xe1, 0xa5, 0xff, 0x53, 0x5c, 0xe3, 0xf2, 0x77, 0x0e, 0xcc, 0xa1, 0xaa, 0x50, 0xc3, 0x4f, 0xa6, 0x59, 0xfa, 0xb1, 0x13, 0xd2, 0xdb, 0xe6, 0xac, 0x40, 0x78, 0x09, 0x6c, + 0x33, 0x78, 0xf0, 0xfa, 0x1a, 0x9f, 0x1b, 0x1b, 0x68, 0x5c, 0xec, 0x4a, 0xa1, 0x80, 0xa0, 0xb3, 0x74, 0x53, 0xcc, 0x97, 0xc3, 0x89, 0x6c, 0xea, 0x96, 0x7e, 0x41, 0xa5, 0xcb, 0xcb, 0xd3, 0x65, + 0xda, 0x97, 0xf5, 0xb3, 0xcb, 0xaf, 0xa5, 0x7e, 0xa5, 0x33, 0x14, 0x6e, 0x28, 0xfd, 0xd6, 0x66, 0x47, 0xf1, 0x40, 0x42, 0xf3, 0xb1, 0x23, 0x80, 0x23, 0x4b, 0xed, 0xf3, 0x66, 0x2b, 0x9c, 0x31, + 0x1f, 0xce, 0xb5, 0x80, 0x99, 0x2d, 0x65, 0x4c, 0x2c, 0xd0, 0x2e, 0x17, 0x96, 0x55, 0x06, 0xdd, 0xad, 0x1e, 0x68, 0x29, 0xc1, 0x4c, 0xf3, 0x14, 0xae, 0x9d, 0x32, 0x3e, 0x10, 0x6d, 0x60, 0x03, + 0x47, 0x37, 0x90, 0xc4, 0xf5, 0xe1, 0xba, 0x14, 0x50, 0x0a, 0x73, 0xb1, 0xcb, 0x9a, 0xcf, 0x4a, 0x9f, 0xb6, 0x80, 0x5b, 0x31, 0xc8, 0x50, 0xa5, 0xa8, 0x06, 0xc9, 0x86, 0xa7, 0xa2, 0xd7, 0x20, + 0x20, 0x8e, 0x68, 0x94, 0x56, 0x51, 0xc2, 0x54, 0xcf, 0x7b, 0xa8, 0x55, 0xa4, 0x78, 0x50, 0x94, 0xac, 0xab, 0x10, 0x3c, 0xcf, 0xb3, 0x63, 0xd0, 0x75, 0x52, 0x5f, 0x8c, 0x33, 0x3d, 0x1d, 0x08, + 0x0f, 0xc8, 0x70, 0x6a, 0x40, 0x83, 0x04, 0xdb, 0x2b, 0x67, 0x15, 0x89, 0x0a, 0x5c, 0x14, 0xce, 0x72, 0x71, 0x39, 0x74, 0x22, 0x67, 0x6e, 0x40, 0x29, 0x62, 0xc0, 0xcb, 0xe0, 0xe8, 0x2f, 0xa3, + 0x0a, 0x4d, 0x11, 0xb5, 0x89, 0xad, 0x79, 0x80, 0x06, 0xcd, 0x55, 0xd0, 0xfd, 0x52, 0xd0, 0x68, 0x6c, 0x2e, 0x6e, 0xd1, 0xe7, 0xa7, 0x48, 0x05, 0x55, 0x06, 0x2e, 0x66, 0x70, 0xf5, 0xf0, 0x50, + 0xbb, 0x62, 0x04, 0x3f, 0x21, 0xe7, 0xe8, 0x01, 0x72, 0x7f, 0x26, 0xc5, 0x6d, 0x2a, 0x63, 0x8a, 0x43, 0x31, 0x2d, 0xc0, 0x70, 0xc3, 0x92, 0x1f, 0xda, 0x1d, 0xc7, 0x21, 0x17, 0x8f, 0x03, 0x36, + 0x54, 0x1e, 0xee, 0x44, 0x3f, 0x57, 0xb4, 0x21, 0x58, 0xc7, 0xbb, 0xac, 0x14, 0xd8, 0x5e, 0xf7, 0x14, 0xce, 0x75, 0xdd, 0x33, 0xaa, 0xf1, 0x56, 0xb8, 0xbd, 0xf1, 0x30, 0x6d, 0x47, 0x0e, 0x91, + 0x47, 0x01, 0x01, 0x9e, 0x1b, 0x55, 0x97, 0xa8, 0x50, 0xb2, 0x67, 0xb9, 0x72, 0x63, 0x6d, 0xf6, 0xd2, 0x81, 0x44, 0x0b, 0x08, 0x82, 0xb7, 0xa0, 0x0d, 0xaa, 0x3c, 0x2a, 0xb6, 0x13, 0xc5, 0x1f, + 0xe0, 0x02, 0x62, 0xcc, 0x95, 0xc1, 0xf8, 0x97, 0x94, 0x86, 0x17, 0x5f, 0xf6, 0xb8, 0x36, 0xa6, 0x51, 0x96, 0xbb, 0x0e, 0xfe, 0x5a, 0x43, 0xcc, 0xc5, 0x56, 0x82, 0x16, 0xf3, 0x81, 0x27, 0x9e, + 0x1a, 0xcd, 0x33, 0xc3, 0x0f, 0x65, 0x6d, 0xab, 0x97, 0xcc, 0xec, 0x69, 0xd8, 0xae, 0x48, 0x53, 0x90, 0xe7, 0x96, 0xa0, 0x71, 0xcb, 0xfa, 0x02, 0x9c, 0x6f, 0x97, 0x2e, 0xb0, 0x6e, 0x60, 0xd8, + 0x17, 0xbc, 0x23, 0x7a, 0xf8, 0x51, 0x14, 0x73, 0xff, 0xa8, 0x73, 0x44, 0xec, 0x4b, 0xc4, 0x0f, 0xc3, 0xac, 0xd3, 0x9e, 0xab, 0x02, 0xcb, 0x32, 0x80, 0x0e, 0x7c, 0xe8, 0xeb, 0xb7, 0x5d, 0x4e, + 0x61, 0x5c, 0x00, 0x55, 0xb6, 0x41, 0x44, 0xc6, 0x39, 0xc5, 0xa1, 0xbb, 0x86, 0x54, 0x30, 0x52, 0x07, 0x1a, 0xdd, 0x6d, 0x29, 0x39, 0x54, 0xa5, 0xe9, 0x95, 0xbb, 0xce, 0xdd, 0xa1, 0x0d, 0xa6, + 0x85, 0xd1, 0x44, 0x07, 0xfb, 0x25, 0xd9, 0x32, 0xac, 0x0e, 0xa9, 0x2b, 0x36, 0x57, 0x79, 0xe2, 0x6f, 0x2d, 0x09, 0xb8, 0xec, 0x8d, 0xa6, 0x5d, 0x66, 0x30, 0x30, 0x02, 0x9c, 0x16, 0x6a, 0xbe, + 0xdc, 0xcf, 0x88, 0xcc, 0xee, 0x3b, 0x41, 0x5d, 0xcc, 0x0a, 0x32, 0x5e, 0xec, 0xe1, 0x33, 0x4a, 0xd1, 0xf1, 0x4e, 0x41, 0x0b, 0x61, 0xea, 0xb1, 0xfc, 0x7d, 0x64, 0xb5, 0x04, 0x5c, 0xfe, 0x2d, + 0x6a, 0x80, 0xfc, 0x6f, 0x50, 0x03, 0xb1, 0xb3, 0x59, 0x96, 0x91, 0xbd, 0x3f, 0xa8, 0x41, 0x12, 0xfc, 0xff, 0x40, 0x0d, 0xce, 0x5f, 0xa9, 0xc1, 0x07, 0x1d, 0xd0, 0x7f, 0xa6, 0x06, 0x36, 0x0d, + 0xeb, 0x9c, 0xf9, 0xdf, 0x4d, 0x0d, 0xb4, 0x7f, 0x87, 0x1a, 0x70, 0x9a, 0x0b, 0xca, 0x9e, 0xab, 0x9c, 0x6d, 0xab, 0x3f, 0x6c, 0x3b, 0x23, 0x2e, 0x44, 0x92, 0x3d, 0x8d, 0xb3, 0x51, 0xc3, 0xf8, + 0xd1, 0x0b, 0x7d, 0x0e, 0xc2, 0x1b, 0x14, 0xd6, 0xbe, 0xfd, 0xa8, 0xc7, 0x9c, 0x37, 0x54, 0x90, 0xb5, 0x4e, 0x71, 0x5c, 0x65, 0xd8, 0x8c, 0xf4, 0x3c, 0x07, 0xb8, 0xa2, 0x67, 0xd0, 0x62, 0x20, + 0xec, 0x22, 0x4d, 0xd1, 0xfe, 0x85, 0x3c, 0xb0, 0x3a, 0x3a, 0xb3, 0xb9, 0x78, 0x91, 0x4a, 0x33, 0x14, 0x17, 0x64, 0x26, 0x60, 0xa4, 0xba, 0x9e, 0x54, 0x22, 0x93, 0xb7, 0x5e, 0xcc, 0x2e, 0x74, + 0xa4, 0x84, 0x27, 0x22, 0xb5, 0xdc, 0xd1, 0xc0, 0x57, 0x42, 0xf0, 0x32, 0xc7, 0x19, 0x25, 0x0c, 0xc3, 0xdd, 0x7b, 0x59, 0x01, 0xaa, 0xed, 0xf6, 0x03, 0x2d, 0x3c, 0x38, 0xdc, 0x58, 0xf4, 0x0b, + 0x19, 0xaf, 0x97, 0xfb, 0x83, 0x57, 0x8b, 0xe3, 0x05, 0x15, 0x3e, 0x06, 0x59, 0xe2, 0xa1, 0x75, 0xa7, 0x47, 0xf5, 0x13, 0xdc, 0xc0, 0xf7, 0xb8, 0x3a, 0xaa, 0xc7, 0x3c, 0x12, 0xf9, 0xe2, 0xa7, + 0x64, 0x73, 0x1c, 0x8c, 0xad, 0xaf, 0x65, 0x15, 0xdf, 0x41, 0x46, 0xbf, 0x5f, 0x09, 0x4a, 0x05, 0x38, 0xce, 0xd4, 0x86, 0x49, 0x2b, 0x56, 0x97, 0xe6, 0xdd, 0x6c, 0xd9, 0x17, 0x0c, 0x21, 0x4c, + 0x13, 0xab, 0x85, 0x14, 0x73, 0xe9, 0x60, 0x63, 0xd3, 0xd1, 0xbf, 0xf5, 0x36, 0xc5, 0x46, 0xf1, 0xb6, 0xae, 0x5e, 0xc1, 0x09, 0x4d, 0xa4, 0xa8, 0x55, 0x5a, 0xd4, 0x4f, 0xb8, 0x1d, 0x6b, 0x82, + 0x3e, 0x76, 0xb3, 0x69, 0xb8, 0xf4, 0x56, 0xe7, 0xf1, 0x0a, 0x30, 0x3a, 0x27, 0x77, 0x72, 0x15, 0xb3, 0xc8, 0xc2, 0x8c, 0x04, 0x4f, 0xa9, 0x93, 0xd9, 0xdc, 0xbb, 0x12, 0x26, 0xe6, 0x83, 0x9e, + 0xd2, 0x9b, 0xdd, 0x86, 0x1b, 0x4e, 0xb4, 0x73, 0x14, 0x11, 0x77, 0x7d, 0xa6, 0xfc, 0x7b, 0xa7, 0xa9, 0x97, 0xc1, 0x99, 0x56, 0x61, 0x14, 0xb3, 0x88, 0x9b, 0xc4, 0x18, 0xc7, 0xa8, 0xee, 0x5a, + 0x65, 0x84, 0xb6, 0x0d, 0xc0, 0x80, 0x95, 0x95, 0xe2, 0x68, 0x2b, 0x71, 0x15, 0x9e, 0xca, 0x22, 0xca, 0xf6, 0xb3, 0xc8, 0xe2, 0xf9, 0x19, 0x0a, 0x22, 0x1a, 0x6a, 0x70, 0xdb, 0xdd, 0x51, 0x4b, + 0xa9, 0x49, 0xd3, 0x76, 0xcd, 0x7b, 0xe1, 0xf8, 0x05, 0x7d, 0xb9, 0x55, 0x4a, 0xbf, 0x60, 0xc4, 0xd2, 0x28, 0x6c, 0x8e, 0xa1, 0x0e, 0x61, 0xb8, 0x96, 0xd7, 0x34, 0xde, 0x80, 0x3d, 0x49, 0xa0, + 0xb3, 0x49, 0x55, 0x4d, 0xab, 0xc4, 0xc6, 0xf8, 0x3b, 0x4f, 0x9c, 0x59, 0x13, 0xd9, 0xcf, 0x12, 0x6b, 0x2f, 0xa3, 0x32, 0x9d, 0xe5, 0xfd, 0x02, 0xe5, 0x11, 0x19, 0xef, 0xa5, 0x62, 0x1f, 0x8f, + 0x58, 0x22, 0x86, 0xc4, 0x99, 0x34, 0x97, 0xcc, 0x84, 0x9b, 0x4c, 0x6a, 0xd8, 0x92, 0xc2, 0x2c, 0x3f, 0x2c, 0xf5, 0x2b, 0x2d, 0xb9, 0xd9, 0xa3, 0x79, 0x1f, 0xd0, 0x94, 0xc7, 0x20, 0xf6, 0x6b, + 0x9e, 0xc0, 0x8f, 0x30, 0x1a, 0x54, 0xc7, 0x72, 0x70, 0x70, 0x74, 0x5e, 0xc2, 0xae, 0x6a, 0xa5, 0xf6, 0xd8, 0x14, 0xc2, 0xcb, 0xcb, 0x04, 0x8f, 0x64, 0x4e, 0x70, 0x0a, 0x4f, 0xf3, 0x8b, 0xfb, + 0x40, 0xbe, 0x90, 0x64, 0x2c, 0xea, 0x3b, 0x17, 0x26, 0xf8, 0x3c, 0xe5, 0xb7, 0xaa, 0x67, 0x61, 0xcb, 0xee, 0x95, 0x43, 0x03, 0xc4, 0xe7, 0xe5, 0x04, 0xf3, 0x73, 0xaa, 0xad, 0x48, 0x2a, 0xc7, + 0x7b, 0x89, 0xfa, 0xec, 0xe3, 0x46, 0x8f, 0xcd, 0xe9, 0x41, 0xbd, 0x93, 0xad, 0xd1, 0x63, 0x73, 0xaf, 0xe5, 0x79, 0x6b, 0x79, 0x68, 0x1f, 0xaf, 0x0d, 0x45, 0xa3, 0xe5, 0x4d, 0x9e, 0x6f, 0x66, + 0x6d, 0x53, 0x11, 0xfe, 0x74, 0xf2, 0xcb, 0x4b, 0xac, 0x35, 0x88, 0x58, 0xc4, 0x24, 0x69, 0x4e, 0x60, 0xe1, 0x48, 0xa2, 0xb3, 0xdc, 0x1b, 0xbc, 0x52, 0x34, 0xfe, 0x9d, 0x1a, 0xc8, 0x4c, 0x63, + 0xb3, 0x2c, 0x1d, 0xf2, 0x7f, 0xa2, 0x11, 0x60, 0x19, 0xf4, 0x33, 0x6b, 0x96, 0x33, 0xb2, 0x14, 0x6a, 0xb2, 0xe4, 0x69, 0xb2, 0x64, 0x03, 0x4c, 0x5e, 0x8f, 0x4c, 0xce, 0xf3, 0x74, 0x8c, 0x05, + 0x34, 0xad, 0x6d, 0x79, 0xe2, 0x6c, 0x79, 0xa8, 0x89, 0x2c, 0x3b, 0x89, 0xef, 0x5b, 0x46, 0x66, 0x93, 0x59, 0x4d, 0x16, 0x45, 0xb1, 0x17, 0x39, 0xc3, 0xc3, 0x30, 0x59, 0x72, 0xcf, 0xd0, 0x62, + 0xd6, 0xb0, 0x64, 0xc0, 0xe8, 0x03, 0x1c, 0xfe, 0x08, 0xf5, 0x00, 0x1f, 0xb1, 0x1e, 0x51, 0x5f, 0xe3, 0x4e, 0x07, 0x23, 0xdf, 0x84, 0x52, 0xd1, 0x3d, 0x65, 0x51, 0xa8, 0x02, 0xd8, 0xdd, 0x52, + 0x51, 0x58, 0x02, 0xd8, 0xc9, 0x63, 0x38, 0xc8, 0x53, 0xb1, 0x68, 0x64, 0xe1, 0x4f, 0xd0, 0xe3, 0xf8, 0x0c, 0xb4, 0x00, 0x3f, 0x44, 0x5a, 0x8c, 0x18, 0xde, 0x87, 0x00, 0xa9, 0xf3, 0xdb, 0xf1, + 0x9b, 0x68, 0xbc, 0xc0, 0x1c, 0x81, 0xa7, 0x83, 0xef, 0xdb, 0x68, 0x59, 0xd0, 0xc1, 0xf7, 0x4e, 0xc4, 0x9e, 0xbb, 0xa4, 0x2c, 0xba, 0xdd, 0x8c, 0x40, 0x56, 0xb7, 0xe0, 0x23, 0x8f, 0x27, 0xd1, + 0x39, 0xef, 0xc9, 0xde, 0xf7, 0x6d, 0xf5, 0x47, 0x92, 0x21, 0xf1, 0xdd, 0x35, 0x6d, 0x85, 0x3a, 0xf2, 0xf5, 0xee, 0x53, 0x4f, 0xf9, 0xb9, 0xd5, 0xbe, 0xc1, 0xfa, 0x96, 0x9c, 0xf4, 0xed, 0x5b, + 0x14, 0xf9, 0x7b, 0x04, 0x59, 0xfa, 0x10, 0x60, 0x7e, 0xa5, 0x1e, 0x1f, 0x37, 0x9a, 0xbf, 0xb0, 0xac, 0x71, 0x12, 0x04, 0x51, 0x52, 0x9d, 0x36, 0x04, 0x90, 0xaf, 0x2f, 0xe8, 0xb1, 0xdd, 0x0c, + 0x4d, 0xfc, 0xd4, 0xfc, 0xc9, 0x9b, 0xd9, 0x69, 0xa2, 0x47, 0xff, 0x99, 0x2d, 0xf0, 0x6e, 0xdc, 0x3b, 0x6d, 0x6d, 0x9e, 0x8c, 0xf0, 0x4b, 0x04, 0x8f, 0xb5, 0x6d, 0x3e, 0xd4, 0x98, 0xe4, 0x4b, + 0xae, 0x65, 0x38, 0xbe, 0xbb, 0xba, 0x1f, 0xbd, 0xd5, 0x7e, 0x14, 0x01, 0x7d, 0x8f, 0xf2, 0x01, 0xf4, 0xae, 0x59, 0x3f, 0x1a, 0x7d, 0x17, 0xae, 0x5a, 0xf4, 0x99, 0xe7, 0xb2, 0xb0, 0xff, 0x93, + 0xc8, 0xe7, 0x5b, 0x50, 0x20, 0xe7, 0x69, 0x1b, 0x87, 0xf3, 0x1b, 0x7f, 0xe2, 0xdb, 0x43, 0x59, 0x29, 0x38, 0x74, 0x81, 0xd7, 0xa1, 0x81, 0xc4, 0x92, 0x0c, 0xf0, 0xa4, 0xc7, 0xf3, 0xc8, 0x72, + 0x70, 0xca, 0x19, 0x68, 0x29, 0x11, 0x24, 0xcc, 0x76, 0x77, 0x08, 0xca, 0x9d, 0x23, 0x2b, 0xdb, 0x6b, 0x20, 0xcb, 0xe5, 0xd8, 0xad, 0x38, 0x73, 0x60, 0xe1, 0x56, 0x47, 0x95, 0xb8, 0xd7, 0x52, + 0xdf, 0xc1, 0xa8, 0x61, 0x96, 0x56, 0xd6, 0xa6, 0x50, 0x8f, 0x42, 0xc4, 0x65, 0x02, 0x8a, 0xf5, 0x5c, 0xfc, 0xe0, 0x4e, 0x32, 0x53, 0x6c, 0xa6, 0xf0, 0xf4, 0x88, 0x2d, 0x63, 0xb5, 0x90, 0x61, + 0x1a, 0xb6, 0xcc, 0x3b, 0x96, 0x3b, 0xdf, 0xe1, 0xb0, 0x5c, 0xee, 0xf0, 0x28, 0xf4, 0x50, 0x1c, 0x16, 0xcf, 0x50, 0x58, 0xad, 0x5b, 0xae, 0xdf, 0xd2, 0xcb, 0x4d, 0x81, 0xb7, 0xeb, 0x86, 0xf2, + 0x78, 0xaf, 0x21, 0xb5, 0x32, 0xa8, 0x30, 0x71, 0x02, 0x8f, 0xfb, 0x42, 0x2b, 0xd4, 0x0a, 0x0d, 0xb5, 0xa1, 0x77, 0xd0, 0xe0, 0x7a, 0xc6, 0xea, 0x72, 0xae, 0x22, 0xef, 0x11, 0xfe, 0x24, 0xcb, + 0x0b, 0xbd, 0x67, 0xfd, 0xe1, 0x70, 0x8e, 0xd5, 0x1c, 0x04, 0x83, 0x3e, 0xaf, 0xbb, 0x8c, 0x16, 0xe6, 0x5d, 0xb9, 0x1e, 0x61, 0x13, 0xc2, 0xd8, 0x46, 0x99, 0x0d, 0xee, 0x5a, 0x1c, 0x0f, 0x29, + 0x4e, 0xe8, 0xc0, 0xc0, 0x23, 0xbe, 0x94, 0xd6, 0xb6, 0x19, 0x52, 0x10, 0x85, 0xb6, 0x3a, 0x9e, 0x49, 0x21, 0xda, 0xd8, 0x7d, 0x84, 0x5b, 0xea, 0xd5, 0xfb, 0x51, 0xaa, 0xcf, 0x18, 0xca, 0x8e, + 0x9d, 0x46, 0x1f, 0x7a, 0x5f, 0xd1, 0x97, 0x0a, 0xc3, 0x8b, 0x06, 0x0c, 0x72, 0xd6, 0x39, 0x0e, 0x39, 0x5f, 0x07, 0xab, 0xf3, 0x62, 0x8f, 0x8d, 0x46, 0x3c, 0xcc, 0xfc, 0xd7, 0x00, 0x90, 0x75, + 0x5f, 0x3b, 0x6b, 0x0a, 0x5e, 0xe3, 0xe1, 0x8e, 0xbd, 0xf2, 0x94, 0x6e, 0xf1, 0x9d, 0x0b, 0x18, 0x7e, 0x8b, 0x08, 0x5b, 0x3e, 0xd3, 0xe7, 0x82, 0xba, 0xa4, 0x8a, 0xc9, 0x0b, 0x2e, 0xe1, 0x4d, + 0x49, 0xc1, 0x21, 0x1a, 0x93, 0x5d, 0x7c, 0x40, 0xe9, 0xab, 0x5b, 0xa4, 0x6b, 0x3e, 0xa6, 0xd6, 0xf5, 0xb8, 0x53, 0x56, 0x5c, 0xc7, 0x1d, 0xc3, 0x02, 0x71, 0xf5, 0x98, 0xb4, 0x10, 0x23, 0x6a, + 0x52, 0xaa, 0x0f, 0xaf, 0x8e, 0x1e, 0x09, 0x33, 0xda, 0xa5, 0x32, 0x13, 0xaf, 0x39, 0xb0, 0x93, 0xd8, 0x30, 0x12, 0x7e, 0xc4, 0x6b, 0xd2, 0x2a, 0x20, 0x62, 0x34, 0xd3, 0x62, 0xa2, 0xc2, 0x9c, + 0x05, 0x71, 0x2e, 0x70, 0x83, 0x5e, 0x6c, 0xcd, 0xb6, 0xec, 0xa5, 0xa7, 0xa9, 0x29, 0xf8, 0x74, 0x4a, 0xfe, 0x02, 0xe4, 0x57, 0x6f, 0x0b, 0xaa, 0xee, 0x11, 0x0b, 0xcf, 0xd2, 0xd6, 0x55, 0x93, + 0xdd, 0x30, 0x48, 0x65, 0x96, 0x68, 0xbd, 0x82, 0x91, 0x71, 0x95, 0xd4, 0xf4, 0x3a, 0x11, 0x15, 0x2c, 0xa2, 0x91, 0x95, 0x7b, 0x46, 0x6e, 0x66, 0x09, 0xdb, 0x27, 0x72, 0x5a, 0x3e, 0xd0, 0x18, + 0xac, 0xbc, 0x03, 0x02, 0x0d, 0xe5, 0x16, 0x06, 0x7b, 0xad, 0x27, 0x14, 0x34, 0x00, 0xab, 0xa8, 0x48, 0xeb, 0x9d, 0x01, 0x55, 0xe2, 0x36, 0x3e, 0x63, 0x8c, 0x11, 0x09, 0x9f, 0x36, 0x27, 0xaf, + 0x90, 0xa7, 0xf9, 0x69, 0x4f, 0x7c, 0x5f, 0xcf, 0x68, 0xb0, 0xcc, 0xce, 0x4b, 0xbd, 0x4d, 0x66, 0xb9, 0x67, 0x76, 0xab, 0x34, 0x79, 0x23, 0x6c, 0xd5, 0x09, 0xf5, 0x5d, 0x03, 0xa1, 0x37, 0xc6, + 0x88, 0x6c, 0x7d, 0x47, 0x89, 0xc8, 0x8e, 0x47, 0xe0, 0x15, 0x62, 0x85, 0x14, 0x90, 0x07, 0xdc, 0xa3, 0x1a, 0xd4, 0x19, 0x97, 0x6c, 0xab, 0x6b, 0x38, 0x17, 0x10, 0x93, 0x34, 0x88, 0xd3, 0xb6, + 0xb4, 0xf6, 0xe9, 0xab, 0xa8, 0xe5, 0x16, 0x1a, 0xa1, 0x84, 0xe2, 0x45, 0x59, 0xa0, 0x33, 0xf5, 0xe7, 0x1c, 0x1e, 0xf8, 0xb9, 0xff, 0xcb, 0x68, 0x8b, 0xf5, 0xad, 0x92, 0xe0, 0x8d, 0xed, 0xdb, + 0x76, 0xe9, 0xbe, 0xf2, 0xc6, 0x7f, 0xae, 0x54, 0xff, 0x77, 0xa8, 0x16, 0xe7, 0x55, 0x2c, 0x4b, 0xd7, 0xea, 0x1f, 0x51, 0xf9, 0xdf, 0xe6, 0x8a, 0x19, 0xe3, 0x97, 0x35, 0xad, 0x3a, 0x1c, 0x1f, + 0x68, 0x4c, 0xf0, 0xb5, 0xa6, 0x1f, 0x80, 0x03, 0xba, 0x9c, 0x0d, 0x82, 0xb9, 0xfb, 0x83, 0x84, 0x50, 0xb3, 0x92, 0x4d, 0xf9, 0x12, 0xda, 0xec, 0x98, 0x1d, 0x7a, 0x3a, 0xf4, 0x91, 0x6d, 0xb4, + 0x18, 0x2e, 0x86, 0xa1, 0x39, 0xf5, 0xb0, 0x1f, 0xf0, 0xef, 0x1d, 0x3c, 0x4d, 0xce, 0xb0, 0xf9, 0x0d, 0x90, 0x8a, 0x44, 0xd7, 0x38, 0x6d, 0xbb, 0xdb, 0xda, 0xa6, 0x71, 0xc6, 0xa1, 0x71, 0x06, + 0xe6, 0xbd, 0xb7, 0x55, 0xbf, 0xb4, 0x55, 0xff, 0x5f, 0xf7, 0xec, 0x5f, 0x57, 0xa5, 0xb3, 0xe7, 0x74, 0xc5, 0xae, 0x20, 0x0c, 0xef, 0xc4, 0x1e, 0x92, 0x2e, 0xee, 0x68, 0xb1, 0x1f, 0xa9, 0x37, + 0x70, 0xb9, 0x86, 0x8f, 0x59, 0x23, 0xfa, 0x71, 0x03, 0xc8, 0xa3, 0x21, 0xa9, 0xe7, 0x75, 0x51, 0x17, 0x6e, 0xc0, 0xe3, 0x21, 0x0e, 0x59, 0x35, 0x6a, 0x5b, 0x72, 0xba, 0x97, 0xe1, 0xe0, 0x18, + 0x5e, 0xa8, 0xcc, 0xa7, 0x2b, 0x89, 0xc3, 0xbe, 0x0f, 0x03, 0x25, 0x0d, 0x48, 0xfa, 0x14, 0x4f, 0xb1, 0x12, 0xd3, 0xce, 0xaa, 0x08, 0x34, 0x89, 0xe9, 0x50, 0xc1, 0x6b, 0x85, 0x53, 0x23, 0x77, + 0x05, 0x17, 0x0d, 0xe0, 0x1e, 0x83, 0xdb, 0x72, 0x6b, 0x80, 0xb3, 0x6a, 0x61, 0x21, 0x3c, 0x9a, 0x45, 0x87, 0x5f, 0xb7, 0xed, 0x59, 0xfa, 0xc4, 0x4b, 0xf6, 0x72, 0xb1, 0x65, 0x2c, 0xaf, 0xa0, + 0x94, 0x42, 0x1f, 0xf7, 0x59, 0x81, 0xa2, 0xcc, 0xbd, 0x10, 0xf4, 0x26, 0xc4, 0x94, 0x36, 0x5d, 0x6a, 0x38, 0x20, 0x58, 0x99, 0xca, 0xf4, 0xd7, 0xe3, 0x11, 0x28, 0xd1, 0xe1, 0x03, 0x98, 0x44, + 0xa3, 0xd4, 0x2d, 0xc0, 0x67, 0x05, 0x24, 0x9a, 0x23, 0xe4, 0x7a, 0x5c, 0x24, 0x2d, 0xb7, 0x39, 0x6c, 0x56, 0xdb, 0x8a, 0x4d, 0x08, 0xa8, 0x1a, 0xbf, 0x48, 0x62, 0xe1, 0x85, 0xaf, 0xab, 0x6e, + 0xb8, 0x88, 0x3c, 0x81, 0xe0, 0xcb, 0x75, 0xa2, 0x51, 0xa2, 0xfa, 0x0c, 0xad, 0x69, 0x0a, 0x26, 0x21, 0x6a, 0x09, 0x55, 0xba, 0xe3, 0x9e, 0x29, 0xc0, 0x29, 0x61, 0xdd, 0xa5, 0x5b, 0x49, 0xc1, + 0xd6, 0x0d, 0x81, 0xa5, 0x4c, 0x08, 0x4d, 0x4b, 0x88, 0x18, 0xca, 0x99, 0x9a, 0xdb, 0x8b, 0x95, 0x94, 0x7d, 0x94, 0xe6, 0x83, 0xbc, 0xbb, 0x81, 0xce, 0x3f, 0x48, 0x75, 0xde, 0x2e, 0xfa, 0xf5, + 0x66, 0xfb, 0xc4, 0x04, 0xad, 0xaf, 0x11, 0x8e, 0xa1, 0xab, 0xfb, 0x50, 0x1b, 0xdc, 0xef, 0x70, 0x38, 0x0d, 0x61, 0x40, 0x61, 0x8b, 0xf3, 0x4b, 0x95, 0xfe, 0x38, 0x69, 0xea, 0x67, 0xa1, 0xb9, + 0x95, 0x27, 0x60, 0x1b, 0x46, 0xfa, 0x21, 0x78, 0xb0, 0x5f, 0xb5, 0x47, 0xbe, 0xba, 0xd8, 0x85, 0xd2, 0x88, 0x4d, 0xb2, 0xb8, 0x7f, 0x76, 0x83, 0x7f, 0x96, 0x48, 0xfd, 0xd3, 0x88, 0x73, 0xc4, + 0xb3, 0xc3, 0xeb, 0xb6, 0xd6, 0x36, 0x04, 0x61, 0xd3, 0xe6, 0x41, 0x02, 0xa1, 0xe7, 0xfc, 0x65, 0x15, 0xeb, 0x06, 0xc9, 0x01, 0x30, 0xd5, 0x5f, 0xd7, 0x75, 0xb9, 0xb4, 0x30, 0x7c, 0xdd, 0x37, + 0x77, 0xf6, 0x2c, 0x8e, 0x97, 0x1e, 0x2c, 0x02, 0xf7, 0x66, 0x40, 0xb7, 0x0f, 0xdc, 0x62, 0xe2, 0xd5, 0xc6, 0x9d, 0x1b, 0x05, 0xbe, 0x02, 0xb2, 0xba, 0x64, 0x22, 0x0e, 0x49, 0x11, 0xfc, 0xb8, + 0xb3, 0xfc, 0x73, 0x74, 0x2a, 0x0a, 0xed, 0x54, 0x4a, 0x1f, 0xd7, 0xca, 0xb5, 0xc9, 0x4b, 0x04, 0xb4, 0x6c, 0x6f, 0x18, 0x76, 0x63, 0xed, 0x3a, 0x12, 0xb6, 0x1b, 0xb1, 0xd6, 0x9b, 0xb8, 0x4c, + 0x25, 0xa1, 0x46, 0xbc, 0x5c, 0x1b, 0xed, 0xb1, 0x4d, 0x67, 0x7f, 0x39, 0xb3, 0x2e, 0xb2, 0x34, 0xc3, 0x3d, 0x2e, 0x1d, 0xc6, 0x6c, 0x17, 0xcb, 0xe1, 0x5b, 0x15, 0xb1, 0x45, 0xdf, 0x27, 0xbb, + 0x41, 0xc7, 0x7b, 0xc2, 0xf3, 0x3c, 0xbf, 0xe1, 0x6e, 0x0a, 0x30, 0x61, 0xe4, 0xe5, 0xde, 0x2a, 0xc1, 0xee, 0xb4, 0x73, 0x90, 0x63, 0xfb, 0x60, 0xab, 0xaf, 0x1b, 0x19, 0x29, 0x69, 0xad, 0xd3, + 0xfc, 0xae, 0x77, 0x8f, 0x48, 0x71, 0x14, 0x93, 0xbb, 0x91, 0xf6, 0x78, 0xc0, 0xcf, 0x31, 0xb6, 0xdc, 0x88, 0x18, 0x56, 0xbc, 0x33, 0x6c, 0x9f, 0x43, 0xe5, 0xa2, 0x38, 0x82, 0x4a, 0x42, 0xce, + 0xc0, 0x90, 0x87, 0x22, 0x04, 0xf0, 0x91, 0x51, 0x2f, 0x50, 0xe0, 0x25, 0x30, 0x3e, 0xd9, 0xcf, 0xa4, 0xec, 0x9d, 0xcb, 0x2c, 0xf9, 0xfd, 0x6c, 0x5a, 0xcf, 0x46, 0xd3, 0x84, 0x8c, 0x9c, 0x7b, + 0xfb, 0x38, 0x5c, 0xd6, 0x09, 0x5d, 0x89, 0x46, 0xf7, 0x49, 0x4e, 0x76, 0xd0, 0x58, 0x20, 0xfb, 0x7a, 0xde, 0x6f, 0xd5, 0x46, 0xf9, 0xb4, 0x19, 0xac, 0x27, 0x1e, 0x2f, 0x87, 0x4f, 0x97, 0x80, + 0x70, 0x43, 0xa8, 0xb5, 0xdd, 0x6e, 0xf4, 0xf6, 0xd7, 0x21, 0x67, 0xdf, 0x8c, 0xda, 0xe1, 0xed, 0xb3, 0x50, 0xe7, 0xab, 0xc8, 0xed, 0xb7, 0xd0, 0xf7, 0x77, 0x80, 0xc7, 0x6b, 0x1c, 0xcb, 0xd2, + 0x7b, 0xf9, 0x05, 0x78, 0x86, 0xa3, 0x98, 0x13, 0xc1, 0x54, 0x2f, 0x28, 0xdc, 0x75, 0x28, 0x7c, 0xae, 0x69, 0x70, 0xc9, 0xc7, 0xdf, 0xa6, 0x26, 0x59, 0x26, 0xff, 0x41, 0xbf, 0x07, 0x7c, 0x29, + 0x66, 0xa4, 0x8a, 0x4e, 0xbe, 0x6b, 0x34, 0xfc, 0x0f, 0x41, 0x0c, 0x9a, 0xb4, 0xc2, 0x9c, 0x48, 0x7a, 0x13, 0x20, 0xee, 0x87, 0xf4, 0xe4, 0xd6, 0xea, 0x6b, 0x6c, 0xf3, 0xb5, 0xc6, 0x7e, 0x17, + 0xad, 0xc7, 0x9e, 0xa0, 0x14, 0xb1, 0x4f, 0xe7, 0x0e, 0xec, 0x56, 0x40, 0xea, 0x7f, 0x4a, 0x99, 0x1d, 0xd8, 0x3d, 0xd2, 0xb6, 0xa9, 0x42, 0x5f, 0xfb, 0x10, 0xbd, 0x68, 0x16, 0xb8, 0xa9, 0xdb, + 0xb7, 0xed, 0xe1, 0x61, 0x06, 0xce, 0xfb, 0x0f, 0xb3, 0x5f, 0x15, 0x37, 0xdb, 0x6f, 0xa5, 0xd1, 0xc0, 0x0f, 0xda, 0xe8, 0xed, 0x13, 0x49, 0x8d, 0x5d, 0xb3, 0xe9, 0x5d, 0xb3, 0x93, 0x5d, 0xe7, + 0x68, 0xf0, 0x03, 0x49, 0x4f, 0x67, 0xfb, 0x68, 0xe3, 0x9c, 0x53, 0x3f, 0x79, 0xcc, 0xab, 0x7e, 0x1e, 0xde, 0xd7, 0xe8, 0x80, 0xff, 0x13, 0xc3, 0xfb, 0x1a, 0x1d, 0xf0, 0x7f, 0x62, 0x78, 0x5f, + 0xa3, 0x03, 0xde, 0x87, 0xf7, 0x6f, 0xc0, 0x71, 0xa0, 0x30, 0x38, 0x25, 0xc4, 0x16, 0x8e, 0x90, 0x99, 0x36, 0x58, 0x19, 0x7c, 0xa7, 0xe7, 0x81, 0x24, 0xc2, 0xfb, 0x8b, 0xdd, 0x16, 0x40, 0x36, + 0xa1, 0xc4, 0xd4, 0xc9, 0xc2, 0xf7, 0xd1, 0x2a, 0x7d, 0x60, 0xd9, 0x73, 0x34, 0xd5, 0x19, 0x8f, 0x66, 0x09, 0x27, 0x72, 0xa6, 0x88, 0xcb, 0x16, 0x5a, 0xc3, 0x10, 0x31, 0x47, 0x3f, 0x60, 0x1f, + 0x6a, 0x08, 0x8b, 0x22, 0xd5, 0x26, 0x5c, 0x58, 0xcc, 0x69, 0x41, 0xf7, 0xde, 0xdd, 0x6c, 0x26, 0x89, 0x52, 0x5b, 0xa9, 0x7d, 0xa2, 0x9a, 0xb6, 0x03, 0xcf, 0x9e, 0x1e, 0xe7, 0xe0, 0xa4, 0x0d, + 0x6e, 0x32, 0x8b, 0x99, 0xbb, 0xf5, 0x7d, 0x00, 0x07, 0xaa, 0xed, 0x6a, 0xb2, 0x32, 0xc3, 0x1e, 0x61, 0x70, 0xbb, 0xcc, 0x6b, 0x58, 0xfa, 0xb4, 0x61, 0x21, 0x22, 0xef, 0x36, 0x56, 0x47, 0x6b, + 0x27, 0xd9, 0x0b, 0x89, 0x6b, 0x57, 0x30, 0x3a, 0x40, 0xf0, 0x79, 0x57, 0xe4, 0xc0, 0x3c, 0xee, 0x24, 0x2c, 0xf0, 0xc0, 0x29, 0x5e, 0x72, 0xeb, 0xd5, 0x3a, 0x13, 0x8f, 0x44, 0x18, 0x5e, 0x83, + 0x59, 0x27, 0xa3, 0x2f, 0x5e, 0xd2, 0x1e, 0x8a, 0x61, 0x3e, 0xb3, 0x55, 0x1e, 0xfa, 0x03, 0x29, 0xa6, 0x55, 0xd5, 0xce, 0x35, 0x7c, 0xd8, 0xd9, 0xed, 0x82, 0xf4, 0x97, 0xa2, 0x3c, 0xbb, 0x84, + 0x4a, 0x54, 0x17, 0xdf, 0xeb, 0x76, 0xef, 0x46, 0x8a, 0x26, 0x79, 0x56, 0x7e, 0x4d, 0x00, 0xbd, 0x27, 0x61, 0xf8, 0x30, 0x23, 0xc5, 0x52, 0x75, 0x9d, 0x3d, 0x0e, 0xaa, 0xcd, 0x53, 0xbe, 0x45, + 0xec, 0xb2, 0x40, 0x1d, 0x78, 0xb2, 0x1e, 0xc3, 0x22, 0x57, 0x45, 0xea, 0xe2, 0x5c, 0x0c, 0xbd, 0xd0, 0x7b, 0x37, 0x11, 0x4c, 0x46, 0x18, 0xc5, 0xdc, 0xbd, 0x4a, 0x7f, 0x36, 0x03, 0xad, 0xb8, + 0x6a, 0x92, 0xf2, 0xd4, 0xdd, 0xf2, 0xb1, 0x8e, 0x07, 0xb0, 0x5b, 0x88, 0x7d, 0x4d, 0xcd, 0xe6, 0x0b, 0x8e, 0xf3, 0x90, 0xdc, 0xf2, 0x70, 0xdb, 0xf8, 0x2d, 0x50, 0xde, 0xb7, 0x2b, 0x0c, 0x2d, + 0xb2, 0xfa, 0x6e, 0xb0, 0x0c, 0x1d, 0x64, 0x0c, 0xcd, 0x70, 0x34, 0xcf, 0xff, 0x12, 0xdc, 0x15, 0xbf, 0xa7, 0x27, 0x81, 0x5f, 0xa3, 0xc0, 0x3f, 0x89, 0x23, 0xb5, 0xf0, 0xd1, 0x57, 0xa0, 0x18, + 0xa0, 0x86, 0xd2, 0x69, 0x58, 0x89, 0xd1, 0xd6, 0x54, 0xb9, 0x07, 0x84, 0xc7, 0x41, 0xac, 0x71, 0x1f, 0xae, 0x3e, 0x95, 0x36, 0x63, 0xd5, 0x58, 0x70, 0x53, 0x71, 0x7a, 0x00, 0x7a, 0x36, 0x13, + 0x15, 0xef, 0xe7, 0xd4, 0x63, 0x26, 0xbd, 0x4f, 0x48, 0xe6, 0xfc, 0xc3, 0xd5, 0x7f, 0xe6, 0x33, 0x3d, 0x3e, 0xe5, 0x0c, 0xeb, 0x33, 0x6d, 0xc9, 0xd3, 0x3f, 0xf6, 0xdc, 0x61, 0xde, 0x1d, 0x05, + 0x40, 0x1b, 0xfc, 0x9f, 0x04, 0x70, 0x79, 0x86, 0x56, 0x78, 0xf7, 0x6e, 0x68, 0x8c, 0x08, 0x3f, 0x09, 0xab, 0x38, 0x31, 0xb6, 0x65, 0xe2, 0x3e, 0x1d, 0xf4, 0x06, 0xbe, 0x61, 0x8a, 0xa0, 0x75, + 0x10, 0xaa, 0xd4, 0xf6, 0x40, 0x2f, 0x1b, 0x58, 0xc7, 0x2a, 0x36, 0x26, 0xc0, 0x55, 0x2d, 0xd0, 0xf0, 0xf4, 0x77, 0xe9, 0x49, 0x9b, 0x6b, 0x9c, 0xca, 0xe8, 0xce, 0xc1, 0x5c, 0x4a, 0x5e, 0xc1, + 0xa9, 0x85, 0x5f, 0x8d, 0x57, 0x5b, 0xb7, 0x9e, 0x85, 0x29, 0x2c, 0xbc, 0x15, 0x6e, 0x7c, 0xc7, 0x40, 0xef, 0xe9, 0x3c, 0x7d, 0xfd, 0x32, 0x3c, 0x6d, 0x3f, 0xb0, 0xf4, 0x71, 0x7a, 0x42, 0xb8, + 0xc8, 0x30, 0x7c, 0x90, 0xf7, 0xc7, 0x3e, 0x03, 0xaf, 0x10, 0x65, 0x9e, 0x15, 0x39, 0x9c, 0x39, 0x6b, 0x23, 0x57, 0x44, 0xa9, 0xbb, 0xbb, 0x52, 0x7a, 0x56, 0x86, 0x1d, 0x6b, 0x2d, 0x29, 0xfc, + 0x04, 0x8e, 0xdd, 0xfd, 0x99, 0x60, 0xab, 0x16, 0x76, 0x36, 0x36, 0x12, 0x96, 0x34, 0x70, 0x1b, 0x6b, 0x9a, 0x98, 0xcf, 0xde, 0x47, 0x3b, 0xbd, 0x45, 0xb2, 0x49, 0xe9, 0xad, 0xdf, 0xa6, 0x68, + 0x42, 0x76, 0x40, 0xb7, 0xb3, 0xb1, 0x24, 0xe7, 0xfa, 0x24, 0x0f, 0xb5, 0x61, 0x8b, 0x28, 0xd7, 0x1e, 0x86, 0xa2, 0x5a, 0xb1, 0x2f, 0x89, 0x8f, 0x65, 0x9c, 0x2f, 0x12, 0xb3, 0xc6, 0x51, 0x4f, + 0x3f, 0xe4, 0xf8, 0x1c, 0x60, 0x3c, 0x42, 0x8c, 0x87, 0x75, 0x94, 0x78, 0xbb, 0x63, 0xf7, 0x4b, 0x24, 0xce, 0x34, 0x15, 0x85, 0xdd, 0xf2, 0x62, 0xcb, 0x0a, 0xb5, 0x8f, 0x13, 0x20, 0x6f, 0xb2, + 0xd9, 0x69, 0x14, 0x69, 0xdc, 0xe3, 0x14, 0x03, 0x75, 0xaa, 0x9f, 0x73, 0x7c, 0x8e, 0x5a, 0x9d, 0xac, 0xac, 0x70, 0xd7, 0x0d, 0x03, 0x35, 0x62, 0x8a, 0x0d, 0x0c, 0xe3, 0x7e, 0x21, 0x78, 0xfb, + 0x61, 0x4f, 0x0a, 0xb2, 0xb3, 0x5b, 0x67, 0x92, 0x79, 0xdf, 0x2b, 0x47, 0x6c, 0x70, 0x4a, 0xbc, 0xfd, 0xa5, 0x3f, 0x10, 0xfb, 0x37, 0x2e, 0x4a, 0xd3, 0xe3, 0x8d, 0x6d, 0xa2, 0x69, 0x7a, 0x83, + 0xff, 0x84, 0x09, 0xff, 0xad, 0x37, 0xf8, 0xd0, 0x34, 0x2c, 0xe5, 0xdf, 0xd1, 0xdf, 0xea, 0x17, 0x92, 0xe9, 0x3a, 0xe7, 0x1f, 0x72, 0x11, 0xb6, 0xd0, 0x02, 0xc0, 0x15, 0x8b, 0x46, 0xe6, 0xd3, + 0x55, 0xe6, 0xcd, 0x22, 0x14, 0x4d, 0x4c, 0xe6, 0xd3, 0x23, 0x46, 0xdc, 0xed, 0x4b, 0x1b, 0xa8, 0xd9, 0xfc, 0x76, 0xfb, 0x92, 0x06, 0x1e, 0x85, 0x14, 0x1f, 0x0c, 0x1f, 0x78, 0x66, 0xfd, 0x41, + 0x38, 0x45, 0xe1, 0x4c, 0x0e, 0xfa, 0xf8, 0x0a, 0x42, 0x00, 0x7f, 0xa3, 0x60, 0x04, 0x35, 0x2e, 0x38, 0xee, 0x36, 0x8f, 0xbc, 0xff, 0xff, 0x53, 0x73, 0xa2, 0xfd, 0xda, 0xb6, 0x05, 0xdf, 0x34, + 0x27, 0xc0, 0x8f, 0x68, 0xfe, 0xa5, 0x07, 0x61, 0xe8, 0xde, 0x16, 0x05, 0xb3, 0x0f, 0x2d, 0xe6, 0xc7, 0x9e, 0x48, 0x49, 0x4b, 0x41, 0xc9, 0x1f, 0x7a, 0xcb, 0x5d, 0x63, 0xc9, 0x2f, 0x6d, 0x66, + 0x6f, 0xc2, 0x64, 0x0e, 0x98, 0xa2, 0x50, 0x87, 0x52, 0x9d, 0x1b, 0xf0, 0x5e, 0x24, 0x88, 0x96, 0x6b, 0xe5, 0xbf, 0xa2, 0x2b, 0xa4, 0x7f, 0xab, 0x29, 0x79, 0xe7, 0xd2, 0xfa, 0xa7, 0xa8, 0x24, + 0xff, 0x14, 0x9e, 0xeb, 0x78, 0x0a, 0x5d, 0x06, 0x5f, 0xe4, 0xdb, 0xc2, 0xbb, 0xac, 0xbe, 0x0f, 0x96, 0x22, 0x3e, 0x12, 0xe9, 0xf5, 0x62, 0xaf, 0xe1, 0x7e, 0x82, 0xa1, 0x57, 0x9e, 0x2e, 0x22, + 0xe6, 0x7e, 0x97, 0x11, 0x44, 0x38, 0x2b, 0xb8, 0xcf, 0xd2, 0x0f, 0x37, 0x08, 0x82, 0xad, 0x58, 0x01, 0x78, 0xbd, 0x69, 0x20, 0x47, 0x5d, 0xe9, 0xc6, 0x28, 0x5d, 0x86, 0x0b, 0xa6, 0x5e, 0x72, + 0x36, 0xc9, 0xa1, 0x2c, 0xe4, 0x2a, 0xa5, 0xa4, 0x76, 0xc9, 0xd4, 0x29, 0xa2, 0x09, 0x27, 0x8f, 0x0e, 0xea, 0xa5, 0x12, 0x92, 0x50, 0x4a, 0x04, 0xbf, 0xec, 0xf8, 0xb6, 0xa5, 0x85, 0xa0, 0xc0, + 0x97, 0x97, 0x0e, 0x55, 0x48, 0x71, 0xc4, 0x3e, 0xcc, 0x22, 0x30, 0xf0, 0x32, 0x33, 0x44, 0x42, 0x64, 0xd8, 0x7e, 0x05, 0xfe, 0x03, 0xf6, 0x82, 0x7a, 0x9e, 0x5e, 0x71, 0x03, 0x97, 0xd7, 0xbe, + 0xca, 0x59, 0x0a, 0xbb, 0x62, 0x01, 0xe8, 0xa2, 0xd9, 0x7a, 0xbb, 0xcf, 0x7e, 0xc9, 0xbf, 0x64, 0xfb, 0x96, 0x96, 0xf7, 0x11, 0x22, 0xad, 0x47, 0x44, 0xcb, 0x8c, 0x51, 0xc2, 0xbe, 0xea, 0x36, + 0x77, 0xda, 0x14, 0x5a, 0x13, 0xaf, 0x80, 0x40, 0x64, 0xc0, 0xdd, 0x11, 0x9b, 0xa4, 0x95, 0xe3, 0x60, 0x72, 0x9e, 0x31, 0x44, 0x46, 0xc6, 0x88, 0xb2, 0x8e, 0xe7, 0xf5, 0x63, 0xa9, 0x05, 0xd1, + 0xba, 0xa3, 0x34, 0xde, 0xe8, 0x4f, 0x94, 0xe3, 0x2e, 0xaf, 0x39, 0xba, 0xaa, 0x02, 0x3d, 0x68, 0x7d, 0x28, 0xac, 0xf8, 0x71, 0xdc, 0xa9, 0x2c, 0xd9, 0x90, 0x25, 0x25, 0xe0, 0x88, 0xea, 0xda, + 0x00, 0x58, 0x6f, 0xbc, 0x14, 0xe2, 0xb2, 0xcb, 0xa5, 0x70, 0xee, 0x69, 0x21, 0x9f, 0x6d, 0xfd, 0x25, 0x28, 0x8b, 0xe7, 0x52, 0xf3, 0x92, 0x03, 0x55, 0x0f, 0xde, 0x47, 0xd1, 0x54, 0xf3, 0xd1, + 0x2b, 0xe1, 0x0e, 0xb5, 0x7c, 0xe1, 0xd3, 0xfb, 0xcb, 0x17, 0x71, 0x92, 0xa5, 0x8d, 0x7b, 0x95, 0x27, 0xf4, 0x96, 0xc7, 0xe0, 0x77, 0x68, 0x05, 0x3e, 0xb0, 0x55, 0xbf, 0xf1, 0x93, 0xae, 0x9a, + 0x10, 0xbf, 0x99, 0x49, 0xac, 0x17, 0xc7, 0x09, 0x17, 0xd7, 0x19, 0xee, 0xa3, 0xd9, 0xae, 0x34, 0x59, 0xd4, 0xbf, 0x12, 0x6a, 0x79, 0xe0, 0x6c, 0x79, 0xa0, 0xd2, 0x7f, 0x66, 0x0f, 0xbc, 0x5f, + 0xd0, 0x7b, 0x59, 0x1d, 0xda, 0x7f, 0xbf, 0x5c, 0xfe, 0x6e, 0xb5, 0x00, 0xff, 0xce, 0x72, 0xf9, 0xb3, 0xd5, 0x92, 0xe7, 0x3c, 0xad, 0xd1, 0xdb, 0xc7, 0x0a, 0x48, 0xf9, 0x1f, 0x5c, 0xcb, 0x9f, + 0x82, 0x39, 0xa7, 0xdc, 0x48, 0xe2, 0xa6, 0x3e, 0x06, 0x89, 0xe4, 0xa7, 0xa8, 0x60, 0xd0, 0xe3, 0x9e, 0xe2, 0xf4, 0xc9, 0x14, 0x66, 0x52, 0x33, 0x68, 0x40, 0x6d, 0x65, 0x0b, 0x3c, 0x8c, 0x3e, + 0xbc, 0x04, 0x19, 0xcd, 0x7b, 0xd8, 0x80, 0x29, 0x81, 0xaf, 0x3d, 0x48, 0xb0, 0xf6, 0xf4, 0xe3, 0x7e, 0x27, 0x34, 0x89, 0x16, 0x2b, 0x29, 0x34, 0xfa, 0x81, 0x93, 0xe0, 0x6c, 0x32, 0x1d, 0xe8, + 0x1a, 0x37, 0x9a, 0x9b, 0x73, 0xfd, 0x74, 0xde, 0x83, 0x79, 0x71, 0x4c, 0xff, 0x0e, 0xad, 0xa0, 0xaf, 0x28, 0x37, 0xdf, 0xcd, 0x73, 0x75, 0x06, 0x64, 0xa4, 0x19, 0xaa, 0xb8, 0x84, 0xed, 0x84, + 0x78, 0xd8, 0x5a, 0x7f, 0xca, 0x97, 0x3c, 0x29, 0xd5, 0x57, 0x5a, 0x82, 0xc2, 0x22, 0x4c, 0x75, 0x8e, 0x05, 0x6d, 0x76, 0xda, 0x6b, 0x94, 0x3c, 0xd2, 0x4b, 0x6b, 0x05, 0xb9, 0x20, 0x18, 0xcd, + 0x0b, 0xc6, 0xce, 0x22, 0x8b, 0x62, 0x39, 0x04, 0xd5, 0x58, 0x96, 0xef, 0xaf, 0x47, 0xc5, 0x72, 0x8f, 0xde, 0x00, 0xa4, 0xf6, 0xf0, 0x08, 0x34, 0xd1, 0x77, 0x9a, 0x2a, 0x4a, 0x1c, 0x59, 0xf2, + 0x63, 0x71, 0x2f, 0x32, 0x6e, 0x15, 0x92, 0x8c, 0xe1, 0x07, 0xf7, 0xca, 0x2f, 0x30, 0x77, 0x86, 0xe9, 0xc2, 0xde, 0xce, 0xd1, 0x2e, 0x23, 0x38, 0x39, 0xd6, 0x1a, 0xbc, 0x86, 0xda, 0xb5, 0x0c, + 0x77, 0xb4, 0xe5, 0xcd, 0x94, 0x1f, 0xaf, 0xee, 0xfe, 0x92, 0x38, 0xc4, 0x95, 0x81, 0xdb, 0x44, 0x99, 0x91, 0x99, 0xe5, 0x74, 0xa1, 0x14, 0x4d, 0xea, 0x9b, 0xc6, 0x4d, 0x36, 0xec, 0x3b, 0xc1, + 0x8f, 0x0c, 0xc3, 0x0d, 0x2f, 0x2f, 0x63, 0x67, 0xcf, 0x0d, 0x86, 0x5e, 0x3f, 0xd1, 0x92, 0xdd, 0x6d, 0x59, 0xc3, 0xd8, 0xe5, 0x69, 0x66, 0x81, 0xde, 0x1d, 0x65, 0x32, 0xc5, 0xf5, 0xcb, 0x6b, + 0xb2, 0x59, 0xdf, 0x2e, 0xab, 0xe4, 0x5f, 0x63, 0x60, 0x0d, 0xc9, 0xbf, 0x0e, 0x71, 0xcc, 0xd1, 0xf8, 0x2c, 0xb3, 0x26, 0xfd, 0x1b, 0x38, 0xff, 0x7b, 0x3c, 0xe7, 0x4e, 0x96, 0xa5, 0xd7, 0xec, + 0xef, 0xf0, 0xbc, 0xff, 0xcd, 0x04, 0x6d, 0xbe, 0xd7, 0x2d, 0x16, 0x5a, 0x02, 0x38, 0x88, 0x59, 0x24, 0x6d, 0x38, 0x84, 0xde, 0x5e, 0xcb, 0x82, 0xd9, 0x04, 0x70, 0xb1, 0xc4, 0xf0, 0xbe, 0x86, + 0x70, 0xd3, 0x24, 0xc7, 0x77, 0x84, 0x3c, 0x34, 0x8e, 0xfe, 0x42, 0xc8, 0xe1, 0xa7, 0x6b, 0x78, 0x7d, 0x0a, 0x7c, 0xfd, 0x94, 0x39, 0x39, 0x07, 0xfe, 0xa6, 0x80, 0xf1, 0x8b, 0xa4, 0x6f, 0x7a, + 0x25, 0x63, 0x9a, 0x9d, 0x9c, 0x77, 0x9b, 0x87, 0x3f, 0x49, 0xfa, 0x2f, 0x6d, 0x15, 0xd3, 0x03, 0x7f, 0xd7, 0xf5, 0x7f, 0xa7, 0xe7, 0xc0, 0xdf, 0x75, 0xfd, 0xef, 0x7a, 0x9e, 0xe7, 0x7c, 0xfe, + 0xc5, 0xbf, 0x81, 0x7f, 0x22, 0xe0, 0xc6, 0x07, 0x01, 0x97, 0xbf, 0x11, 0x70, 0x44, 0x9b, 0xaa, 0x0b, 0xee, 0x8b, 0x2d, 0x23, 0x7b, 0x33, 0xc7, 0x08, 0x35, 0x42, 0x62, 0x3a, 0x41, 0xe6, 0x9c, + 0x28, 0x27, 0xd7, 0x3e, 0x5a, 0x89, 0x87, 0x1a, 0x3d, 0x49, 0xed, 0x5e, 0xc0, 0xb3, 0x1d, 0x00, 0x71, 0x39, 0xdb, 0xf5, 0x63, 0xaa, 0x07, 0x0e, 0xe7, 0x49, 0x85, 0xe8, 0xfd, 0xcb, 0xd9, 0x28, + 0xa0, 0x0d, 0xa9, 0x6a, 0x70, 0xcd, 0x28, 0x22, 0x57, 0x57, 0x4e, 0x1e, 0x21, 0x6d, 0xed, 0xa6, 0x5e, 0xa0, 0x43, 0x2d, 0xab, 0xe0, 0x20, 0xb9, 0x47, 0xa9, 0x7e, 0x69, 0x5e, 0x70, 0xb2, 0x19, + 0x4d, 0xb8, 0xcc, 0xc8, 0xf3, 0x92, 0x86, 0x7b, 0xfd, 0x0a, 0x01, 0xc5, 0x34, 0x1d, 0xfc, 0x88, 0x25, 0x12, 0x21, 0x43, 0xc8, 0x66, 0xb6, 0x0a, 0xbf, 0x6c, 0x66, 0x39, 0x5e, 0xc7, 0x6c, 0x1a, + 0x88, 0x34, 0x7b, 0xbe, 0x72, 0x4b, 0xea, 0x29, 0x1b, 0x2b, 0x23, 0x07, 0xf4, 0xa9, 0x99, 0xab, 0x03, 0x19, 0x86, 0xbd, 0x80, 0x9c, 0xe2, 0x12, 0xcb, 0x57, 0x38, 0xb9, 0x57, 0xa8, 0x71, 0x70, + 0xeb, 0xca, 0xb4, 0x6e, 0x0b, 0x64, 0xc3, 0x14, 0x8a, 0x1c, 0x72, 0x4d, 0x5c, 0x9e, 0xd4, 0x58, 0xec, 0xb9, 0x56, 0x10, 0x92, 0x10, 0x4a, 0xca, 0xb4, 0x27, 0x27, 0x43, 0x51, 0xa4, 0xa2, 0x4e, + 0x5b, 0x17, 0x47, 0x47, 0x8f, 0x8f, 0xfa, 0xb1, 0xc1, 0x2b, 0x2b, 0xb5, 0xec, 0xc2, 0x05, 0x14, 0x3e, 0x9c, 0xb6, 0x1e, 0xdf, 0xc9, 0x28, 0x19, 0xa1, 0x53, 0x41, 0xfa, 0xab, 0x67, 0xe9, 0x80, + 0x80, 0xd2, 0x67, 0xdc, 0x60, 0xaa, 0x1f, 0x76, 0x8a, 0xd4, 0x67, 0x60, 0x67, 0x8e, 0x34, 0xe4, 0xa1, 0xb6, 0x6e, 0xe9, 0x19, 0x82, 0xcd, 0xcf, 0x47, 0x76, 0xf5, 0x28, 0x24, 0x66, 0xf1, 0x0a, + 0x27, 0x32, 0x1a, 0x4c, 0x8c, 0x36, 0x1d, 0x19, 0xbd, 0x42, 0xa1, 0x79, 0x58, 0xcb, 0xab, 0xc2, 0xf7, 0xb4, 0x38, 0xd2, 0x39, 0xcf, 0xf5, 0xa8, 0x24, 0x00, 0x9a, 0x2c, 0xb1, 0xbf, 0xc4, 0x43, + 0xae, 0x3e, 0xf1, 0x34, 0xcf, 0x19, 0x7c, 0x16, 0xab, 0x19, 0xbb, 0xd1, 0x99, 0x40, 0x3b, 0xc7, 0x72, 0xaf, 0x56, 0xc6, 0x4e, 0x96, 0xa9, 0x3f, 0xf5, 0x82, 0x15, 0x23, 0x8b, 0xaa, 0x26, 0x8b, + 0x52, 0xfe, 0x83, 0x3d, 0xf0, 0x4f, 0x17, 0xe0, 0xc2, 0x34, 0x88, 0xfd, 0x16, 0xfd, 0xa6, 0x6a, 0xe4, 0x8f, 0xb2, 0xe8, 0xde, 0x96, 0x3e, 0x92, 0x17, 0x4a, 0x1b, 0x79, 0xee, 0x14, 0xb2, 0x8c, + 0x13, 0x7a, 0x7a, 0x0f, 0xc4, 0x2d, 0x35, 0xc5, 0x70, 0x3a, 0x84, 0xbe, 0xf6, 0xbd, 0x60, 0x41, 0xab, 0xe8, 0xed, 0x6b, 0x67, 0xa9, 0xba, 0x3f, 0x5d, 0xf4, 0x97, 0x18, 0x0f, 0xfc, 0x0e, 0xe4, + 0xff, 0x65, 0x8c, 0xa7, 0xbd, 0xf4, 0x81, 0x96, 0x29, 0x98, 0xd4, 0x91, 0x1b, 0x89, 0x13, 0x10, 0x3d, 0x1f, 0xa7, 0x97, 0xbe, 0x62, 0x3a, 0x48, 0x22, 0x1b, 0xca, 0x86, 0xde, 0xaf, 0x15, 0x75, + 0x5e, 0x91, 0x1b, 0x21, 0x67, 0xa7, 0x96, 0x66, 0xd1, 0x5c, 0x72, 0x05, 0x2e, 0xfa, 0x04, 0x58, 0x43, 0x8f, 0x2e, 0x11, 0x0d, 0xb7, 0x28, 0x57, 0x14, 0x0b, 0x16, 0x7a, 0xe8, 0x1e, 0x97, 0xe3, + 0x44, 0x2c, 0xa1, 0x95, 0xc8, 0xc6, 0xb9, 0x74, 0x37, 0x0d, 0x78, 0x38, 0x3b, 0x0d, 0xcb, 0xe2, 0x9a, 0x62, 0x38, 0x97, 0x8d, 0x4b, 0xb9, 0x5f, 0x1d, 0x50, 0x40, 0x89, 0x90, 0x77, 0x38, 0xf0, + 0xca, 0x6e, 0x2f, 0xdb, 0x74, 0xaf, 0x03, 0xac, 0xa4, 0xb7, 0xd2, 0xb7, 0x69, 0x7a, 0xca, 0xc5, 0x02, 0xea, 0x2f, 0x66, 0x86, 0x52, 0x37, 0xf8, 0x46, 0x58, 0x45, 0x88, 0x38, 0xa0, 0x57, 0xee, + 0x19, 0x77, 0xdc, 0x94, 0x06, 0xd8, 0x0f, 0x08, 0x1f, 0xa2, 0x17, 0xe9, 0xa0, 0xe1, 0x8c, 0xb8, 0x59, 0x7d, 0xac, 0x79, 0x6e, 0x18, 0x73, 0x4f, 0x3e, 0x6c, 0x22, 0xbd, 0x61, 0x9e, 0xef, 0x0f, + 0x18, 0xf5, 0xac, 0xd3, 0x22, 0xd3, 0xe6, 0x26, 0x26, 0xa0, 0x24, 0x64, 0xb8, 0x53, 0x06, 0x9f, 0x6d, 0x4e, 0xab, 0xc5, 0xd1, 0x0d, 0xae, 0xa5, 0x04, 0x34, 0xfb, 0x78, 0xa1, 0xbb, 0xc2, 0x01, + 0xaa, 0x3b, 0x4b, 0xac, 0x0e, 0x6b, 0x86, 0x37, 0x34, 0xcc, 0xab, 0x6a, 0xe4, 0x68, 0x60, 0x66, 0xc5, 0x29, 0x9a, 0xb8, 0xa1, 0x40, 0xdb, 0x1a, 0x79, 0x2a, 0x9a, 0x57, 0xfd, 0x2c, 0x1f, 0x76, + 0xa7, 0xaf, 0x36, 0x06, 0x25, 0x2a, 0x1f, 0x78, 0xc6, 0x43, 0x91, 0x47, 0xeb, 0xd1, 0xe9, 0x6e, 0xa6, 0xce, 0x59, 0x33, 0xcf, 0x86, 0x1a, 0x3f, 0x4b, 0x04, 0x30, 0x18, 0x41, 0x6c, 0x0b, 0x0a, + 0xe3, 0x5a, 0xf5, 0xca, 0x61, 0xcf, 0x09, 0x65, 0xc9, 0xa7, 0x80, 0x19, 0x7f, 0x89, 0xf1, 0x5c, 0x99, 0x97, 0x6c, 0x36, 0xce, 0x6f, 0xf4, 0x34, 0x2d, 0x63, 0x96, 0xbe, 0xc9, 0xdc, 0xbf, 0x12, + 0xc3, 0xfe, 0x3b, 0xc4, 0xe7, 0x3e, 0x64, 0x84, 0xc3, 0x77, 0x19, 0xa1, 0xc1, 0xdd, 0x9f, 0x39, 0x66, 0x3e, 0x03, 0x73, 0xc5, 0x1f, 0x98, 0xc7, 0x91, 0xe2, 0x95, 0xde, 0xee, 0xbf, 0x97, 0x9a, + 0x37, 0x3f, 0x42, 0x29, 0xf0, 0x0d, 0x4b, 0x5d, 0x8d, 0xf9, 0x8e, 0xa5, 0x9a, 0x29, 0x36, 0x5d, 0xe4, 0xbc, 0x4f, 0x41, 0xe3, 0x33, 0x5e, 0xf1, 0x47, 0x4a, 0xff, 0xc6, 0xef, 0xdf, 0x0a, 0x7c, + 0xde, 0x6d, 0xbc, 0x0f, 0x9b, 0x8f, 0x9c, 0x9b, 0x66, 0x19, 0x1b, 0x20, 0xe7, 0x5f, 0x29, 0xfd, 0x99, 0x8f, 0xbc, 0x74, 0xf8, 0xc0, 0x51, 0x96, 0x61, 0x12, 0xe4, 0x7d, 0xf3, 0xe9, 0xd6, 0x32, + 0xdf, 0xf0, 0x3f, 0x1e, 0x76, 0xf2, 0xe9, 0x01, 0x82, 0xfd, 0x9d, 0xf7, 0x68, 0xdc, 0xa7, 0x9c, 0xfc, 0xd3, 0x03, 0xf0, 0x3b, 0xf0, 0x53, 0x63, 0xf5, 0x73, 0xb7, 0xff, 0xdd, 0x5e, 0x03, 0x7f, + 0xd5, 0xed, 0x7f, 0xb7, 0xd7, 0xff, 0x4e, 0x34, 0x7c, 0xe6, 0x0a, 0xff, 0x8e, 0xf1, 0x77, 0xda, 0xbf, 0x89, 0x12, 0x49, 0xa4, 0xf9, 0xc5, 0xe7, 0xad, 0x21, 0x22, 0x12, 0x65, 0xb0, 0xe4, 0xd7, + 0x6a, 0xdf, 0x01, 0xca, 0xa2, 0x31, 0x55, 0x28, 0x72, 0xee, 0x51, 0xd2, 0xf0, 0xab, 0x76, 0x1b, 0x5b, 0x29, 0x1e, 0x37, 0x6f, 0x57, 0x65, 0x4b, 0x2d, 0xe7, 0xe3, 0xc9, 0xe6, 0x07, 0x27, 0x20, + 0xaf, 0x47, 0xad, 0x1e, 0x2a, 0x86, 0x34, 0xb6, 0xcf, 0x89, 0xbc, 0xba, 0x06, 0x8f, 0x96, 0x93, 0xe1, 0x74, 0x3a, 0x33, 0xc4, 0x3e, 0xfa, 0x7e, 0xa1, 0x5e, 0x97, 0x43, 0x3a, 0x00, 0xa7, 0x95, + 0x9e, 0xdd, 0xc1, 0xf9, 0xd2, 0x45, 0xdd, 0xe1, 0x27, 0x1a, 0x84, 0xba, 0x6c, 0x79, 0xd0, 0x15, 0xf3, 0x98, 0x1c, 0x5a, 0xf9, 0xa7, 0xde, 0xdb, 0x31, 0x16, 0x21, 0x57, 0x67, 0xe2, 0xf2, 0xcb, + 0x66, 0xae, 0x5c, 0xc5, 0x3d, 0x42, 0x98, 0x25, 0x83, 0x6b, 0x99, 0x3f, 0x26, 0x3c, 0xe3, 0xa0, 0x49, 0x5f, 0x4c, 0x8d, 0x29, 0xf4, 0x30, 0xf0, 0x80, 0x6b, 0xd3, 0x26, 0x25, 0x12, 0xce, 0xd0, + 0x55, 0x2c, 0xad, 0x0d, 0x1c, 0xaf, 0xdb, 0x7c, 0xc0, 0x03, 0x96, 0x83, 0x32, 0x6e, 0xe8, 0x49, 0x88, 0xba, 0x41, 0x92, 0xf7, 0xc9, 0xb5, 0x89, 0x8d, 0x51, 0xb6, 0xfc, 0x6d, 0x6f, 0x39, 0x7d, + 0x92, 0x97, 0x56, 0x02, 0x39, 0x25, 0xea, 0xc7, 0xde, 0xce, 0x0b, 0x69, 0xbe, 0x9b, 0x59, 0xda, 0xda, 0xc3, 0x01, 0xf4, 0x59, 0x8c, 0x0f, 0x7a, 0xe7, 0x0a, 0xa7, 0x00, 0x8d, 0xbd, 0x4b, 0xc9, + 0x2f, 0xf4, 0x4a, 0x3b, 0x91, 0x48, 0x95, 0x05, 0x76, 0xdc, 0xa4, 0x08, 0x13, 0x12, 0x7f, 0x97, 0xd0, 0x84, 0x1b, 0x59, 0xb0, 0x7e, 0x85, 0xde, 0x44, 0xc0, 0x47, 0x73, 0x81, 0x5f, 0xc3, 0x95, + 0x45, 0xf6, 0x28, 0xbf, 0x36, 0x66, 0x6c, 0x5c, 0x71, 0xd1, 0xc3, 0xb7, 0xe2, 0x09, 0x88, 0x52, 0xfa, 0xfd, 0x8c, 0x96, 0xe0, 0x64, 0x8a, 0xdf, 0x9d, 0xd1, 0x52, 0x7c, 0x3b, 0xa3, 0xe5, 0x6f, + 0x8e, 0x68, 0x11, 0x00, 0x1c, 0x57, 0x57, 0x4a, 0xb9, 0xdd, 0xf2, 0x8a, 0x9f, 0x9d, 0x60, 0xe9, 0x86, 0x43, 0x4c, 0x49, 0x18, 0x91, 0xb9, 0xf3, 0x9f, 0xaa, 0x83, 0x84, 0xbf, 0xb0, 0xfd, 0x58, + 0x6a, 0xc0, 0xef, 0xc2, 0xe7, 0x7d, 0x8e, 0x93, 0xc8, 0xe5, 0x36, 0x93, 0x77, 0xfd, 0x48, 0x90, 0xa1, 0x6e, 0x6e, 0x57, 0x24, 0x69, 0xe3, 0x40, 0x5b, 0x4c, 0x36, 0xf5, 0xd4, 0xa5, 0xb8, 0xac, + 0x07, 0x94, 0x76, 0x99, 0x3b, 0xde, 0x9f, 0xa7, 0x86, 0x3a, 0xea, 0xad, 0xd6, 0x1b, 0x98, 0x49, 0x00, 0xbe, 0xde, 0x03, 0x4c, 0xd7, 0xa8, 0x1c, 0x6c, 0x04, 0x4f, 0x49, 0xa0, 0xc8, 0x7c, 0xf5, + 0xe6, 0x65, 0xf0, 0xf6, 0xae, 0x1d, 0xf9, 0xb9, 0xe8, 0xf2, 0xc0, 0x7e, 0x3e, 0xb7, 0x9a, 0x6c, 0xee, 0x11, 0xaa, 0x94, 0x5b, 0xbe, 0xda, 0xf0, 0xa9, 0xca, 0x1d, 0xe2, 0x5f, 0xc9, 0x12, 0x1d, + 0x32, 0x5e, 0xba, 0x34, 0x0d, 0x81, 0x3e, 0x73, 0x84, 0x14, 0x3a, 0xc0, 0x8a, 0xf5, 0x14, 0x27, 0x64, 0x45, 0x5d, 0xa6, 0x96, 0xf0, 0xcb, 0xcb, 0xd3, 0x26, 0x47, 0x92, 0x48, 0x5a, 0xdd, 0x83, + 0x9e, 0xa5, 0x21, 0xc2, 0x96, 0xbb, 0x3c, 0x69, 0xc3, 0x8b, 0x5f, 0x27, 0xd8, 0x6c, 0xc9, 0x01, 0x3f, 0xc9, 0xdb, 0x1e, 0xa3, 0xb1, 0x78, 0x69, 0xcd, 0x1e, 0x47, 0xf9, 0xb9, 0xb9, 0xcf, 0xec, + 0x7c, 0x7d, 0x69, 0xd2, 0x0c, 0x95, 0x00, 0x19, 0x63, 0x46, 0x48, 0xa4, 0xd3, 0xfa, 0x7c, 0xec, 0x12, 0x3c, 0x69, 0x7a, 0x9e, 0x78, 0xcf, 0x33, 0x25, 0x5f, 0xee, 0x3c, 0x67, 0x2b, 0x6f, 0x99, + 0x2d, 0xcb, 0x41, 0x47, 0xc2, 0xaf, 0xf5, 0x7a, 0x6f, 0x08, 0x82, 0x0b, 0x8f, 0xa1, 0xe7, 0xd3, 0x0b, 0x8d, 0x6d, 0xdb, 0x19, 0x8e, 0xa4, 0xcd, 0x99, 0xe6, 0x42, 0x22, 0xe4, 0x33, 0xd8, 0xe9, + 0x0c, 0xb8, 0xf4, 0x60, 0xac, 0x78, 0xd0, 0x54, 0xe1, 0x1e, 0x12, 0x18, 0xe2, 0x0e, 0xbe, 0xb4, 0xb6, 0x37, 0x99, 0xbd, 0x8b, 0x90, 0x72, 0xbb, 0x76, 0x5c, 0xeb, 0x8a, 0x88, 0xba, 0x25, 0xf2, + 0x59, 0x12, 0xad, 0x73, 0x53, 0xbb, 0x4b, 0x3e, 0x08, 0x37, 0xfc, 0xb6, 0x91, 0x7f, 0x23, 0xd8, 0xfe, 0x8e, 0xbd, 0xdf, 0x02, 0xe8, 0x7f, 0x83, 0xbb, 0x7f, 0x8b, 0xb9, 0xe3, 0x07, 0xe6, 0x7e, + 0x67, 0xd9, 0x06, 0xcb, 0xad, 0xb9, 0x3b, 0x30, 0xac, 0x39, 0x8a, 0x45, 0xea, 0x8d, 0x8a, 0x17, 0x4a, 0x92, 0xf5, 0xbb, 0x1c, 0x3d, 0xc7, 0x14, 0xff, 0x4d, 0x98, 0x4b, 0x6f, 0x80, 0xf4, 0x1d, + 0xbd, 0xd2, 0x1f, 0xd1, 0xeb, 0x7b, 0x30, 0xf9, 0x97, 0xe3, 0xaf, 0x3e, 0x85, 0x5d, 0xdf, 0x4a, 0x77, 0x7e, 0x92, 0x7c, 0xdb, 0xf4, 0x06, 0x7c, 0x35, 0x6a, 0x22, 0xff, 0x9b, 0x3a, 0x50, 0x67, + 0xe3, 0xbf, 0x84, 0x5d, 0xdb, 0xfe, 0xe3, 0xcd, 0xde, 0x77, 0xaf, 0x3f, 0x48, 0xd0, 0x26, 0x9b, 0x97, 0x52, 0x04, 0x48, 0x0f, 0xac, 0x7e, 0x37, 0x0a, 0x3e, 0x8c, 0x3e, 0xc2, 0x8e, 0xbb, 0xcc, + 0xd1, 0xd9, 0x97, 0x04, 0x4d, 0x00, 0xcd, 0x21, 0x84, 0x9b, 0x8f, 0x48, 0x8a, 0xfc, 0x75, 0xe2, 0xd7, 0x1f, 0x55, 0xad, 0xcc, 0x8f, 0x07, 0x9b, 0x00, 0xbf, 0x3b, 0xd9, 0xe4, 0xc7, 0x83, 0x4d, + 0xd0, 0x6a, 0x2d, 0x78, 0xff, 0x96, 0xbd, 0x54, 0xdb, 0xee, 0xa1, 0xec, 0xe5, 0xa8, 0xea, 0x83, 0x45, 0x32, 0xe3, 0x88, 0xd4, 0x86, 0x28, 0x6e, 0xf7, 0xa6, 0x99, 0x18, 0xd6, 0xe2, 0x34, 0x3a, + 0xbc, 0x77, 0x80, 0x5d, 0xb1, 0x88, 0x73, 0x4d, 0xb9, 0x5d, 0xac, 0x69, 0x17, 0x43, 0xca, 0xca, 0xba, 0xa5, 0xc5, 0x16, 0xd2, 0xb4, 0xcc, 0x2b, 0xe7, 0x84, 0xc6, 0x39, 0x71, 0x7d, 0x9e, 0xf6, + 0xbc, 0x9b, 0xcb, 0xcd, 0x0b, 0xa7, 0x44, 0x98, 0x90, 0xa0, 0x13, 0x7a, 0x8a, 0xe8, 0x0a, 0xdc, 0x7d, 0x66, 0x38, 0x62, 0xa9, 0x9a, 0x0c, 0xcf, 0xd1, 0x9a, 0xe5, 0x1b, 0x06, 0x30, 0xad, 0x7b, + 0xb5, 0x1a, 0xf0, 0xb9, 0x32, 0x4f, 0xf4, 0x45, 0x10, 0x8b, 0xaa, 0xa7, 0xe0, 0x13, 0x19, 0xd0, 0xd6, 0x6d, 0x85, 0x48, 0xc4, 0x12, 0xf9, 0x54, 0x6e, 0x2b, 0x48, 0xd0, 0xb8, 0x30, 0xcc, 0x28, + 0xc2, 0x5e, 0xd3, 0x9d, 0xbd, 0x5e, 0x69, 0x09, 0x2e, 0xd2, 0xf7, 0x59, 0xce, 0x04, 0xda, 0xab, 0x81, 0x44, 0xdd, 0x37, 0xfb, 0x11, 0x93, 0x00, 0xb4, 0x4c, 0x5f, 0x94, 0xd2, 0x9f, 0x17, 0xbe, + 0x96, 0x03, 0x79, 0x75, 0x7c, 0xc2, 0xc0, 0x8b, 0xdb, 0xa5, 0x78, 0xd5, 0x83, 0xf6, 0xb4, 0x89, 0x87, 0x0d, 0x51, 0x53, 0xda, 0xe0, 0xb9, 0x75, 0x66, 0x66, 0x37, 0x6f, 0x25, 0xd6, 0x22, 0x77, + 0x81, 0x79, 0xdd, 0xa3, 0x69, 0xbd, 0x9c, 0xb1, 0xe6, 0x84, 0xcc, 0x53, 0xf2, 0x8e, 0x36, 0xd3, 0xc6, 0xeb, 0x01, 0x10, 0xeb, 0x68, 0xb3, 0xe0, 0xcd, 0x79, 0x11, 0x29, 0xa3, 0xcd, 0xbd, 0x06, + 0xdd, 0xaf, 0x68, 0x9e, 0x7a, 0x44, 0xe5, 0xe6, 0xd7, 0xd9, 0x5c, 0x7b, 0xcb, 0x2a, 0xcb, 0x44, 0xef, 0x77, 0x46, 0x47, 0x90, 0xa9, 0x88, 0x0f, 0x9b, 0x1e, 0xee, 0x0c, 0x5e, 0xcd, 0x56, 0x05, + 0x65, 0xb3, 0x7f, 0xa9, 0x6a, 0xed, 0xbe, 0x2a, 0xdf, 0x34, 0x4a, 0x40, 0x0f, 0x6b, 0x5b, 0xf0, 0xbb, 0xd2, 0xcc, 0xe0, 0x5f, 0x3b, 0xd8, 0x84, 0xa6, 0x30, 0x43, 0x77, 0x63, 0xd3, 0xbe, 0xcd, + 0x2d, 0x40, 0xaa, 0x8f, 0x52, 0xdc, 0x57, 0xae, 0x21, 0x64, 0x0a, 0x74, 0x9d, 0x4d, 0xda, 0xbe, 0x51, 0x72, 0x26, 0xdf, 0x84, 0x9e, 0xfe, 0xc9, 0xf8, 0x57, 0xdb, 0x5f, 0x39, 0x2e, 0xf0, 0x9d, + 0xe4, 0x6a, 0x4b, 0xa2, 0xe3, 0x83, 0xcc, 0xef, 0xb2, 0x7a, 0x99, 0x21, 0xbe, 0xe3, 0x29, 0x6b, 0x7a, 0xd8, 0xcf, 0x31, 0xb7, 0xa1, 0xcc, 0xaf, 0xe5, 0xfe, 0x30, 0x82, 0x2b, 0x3f, 0x8d, 0x85, + 0x46, 0xcf, 0x4b, 0xea, 0x4b, 0xd7, 0xd5, 0x66, 0x24, 0xa8, 0xba, 0x2d, 0x22, 0x9c, 0x64, 0x9d, 0xdd, 0xb5, 0x6c, 0x3b, 0x02, 0x7c, 0xec, 0x57, 0x89, 0xca, 0x16, 0xa7, 0x73, 0xc8, 0x6d, 0x78, + 0xd7, 0x6a, 0x9f, 0x2b, 0x5f, 0x1b, 0x99, 0xac, 0xc3, 0x7d, 0xb8, 0xc2, 0x0f, 0x17, 0xa3, 0xd3, 0x1c, 0xc4, 0xef, 0xd7, 0xce, 0x9d, 0x14, 0x32, 0xf5, 0xee, 0x28, 0xf4, 0x00, 0xab, 0xf6, 0x81, + 0x3f, 0xf0, 0x67, 0x3c, 0x8b, 0xf1, 0x33, 0x68, 0x63, 0x0f, 0xf4, 0x30, 0xa6, 0x7a, 0xca, 0x33, 0x30, 0x67, 0x03, 0x62, 0x0d, 0x97, 0xd4, 0xbb, 0xcb, 0xa3, 0x97, 0x30, 0xb4, 0x7c, 0x01, 0x67, + 0x55, 0x56, 0x84, 0x47, 0xd7, 0x38, 0x75, 0x19, 0x05, 0xa8, 0xcc, 0xc8, 0x2f, 0xee, 0xb9, 0x92, 0x7a, 0x88, 0x05, 0x4c, 0x9c, 0x8d, 0xf7, 0xfc, 0x7e, 0x7a, 0xf8, 0x64, 0x32, 0x09, 0x7a, 0x03, + 0xbb, 0x08, 0x75, 0x9c, 0x8b, 0x3a, 0xd6, 0xb0, 0x43, 0x92, 0x38, 0xe0, 0xd0, 0x31, 0x72, 0x5b, 0x2a, 0xde, 0x05, 0x9b, 0x29, 0xb0, 0xf8, 0x00, 0x32, 0xac, 0x39, 0xe3, 0xb6, 0xe9, 0xde, 0x33, + 0xe3, 0x70, 0x59, 0x56, 0xc1, 0xb4, 0x07, 0x58, 0xee, 0x98, 0xc5, 0x2e, 0x26, 0x74, 0x10, 0xa6, 0x72, 0xa5, 0xea, 0xc5, 0x4f, 0x1a, 0xf7, 0xe4, 0x68, 0xf1, 0xb0, 0x2a, 0x34, 0x3d, 0x07, 0x04, + 0x4c, 0xc9, 0x39, 0x36, 0x6a, 0x80, 0xa5, 0x9d, 0x8d, 0x60, 0x61, 0x8a, 0x25, 0x28, 0x61, 0x85, 0x58, 0xec, 0xf5, 0x7c, 0x8c, 0x2d, 0xcd, 0x5b, 0x63, 0x52, 0xca, 0xfb, 0x90, 0x83, 0x3e, 0x0a, + 0xaa, 0x0f, 0x2d, 0x1e, 0xa0, 0xd0, 0x73, 0xe3, 0x14, 0xfd, 0xd7, 0x70, 0x56, 0x2a, 0xf3, 0xe2, 0x93, 0xe8, 0x46, 0x5d, 0x92, 0xbd, 0xf1, 0xee, 0xdf, 0x41, 0xee, 0xbf, 0x83, 0xbe, 0xbb, 0xcd, + 0xb2, 0xf4, 0xeb, 0xfb, 0x41, 0x83, 0x06, 0xfd, 0xda, 0x13, 0xa5, 0xed, 0x6f, 0x86, 0xb2, 0x3c, 0x58, 0xa4, 0x3b, 0xc6, 0x3a, 0x68, 0xd2, 0xdf, 0x25, 0xb1, 0x39, 0x66, 0xfa, 0x6f, 0x42, 0xdf, + 0x69, 0x03, 0xd4, 0x2f, 0x11, 0xeb, 0xa1, 0xfc, 0x08, 0x88, 0x72, 0xe4, 0xa5, 0xbd, 0xcc, 0x0b, 0x67, 0x82, 0xb8, 0x47, 0xe0, 0x61, 0x55, 0x68, 0x31, 0x82, 0x5b, 0xfe, 0x80, 0x6d, 0x7f, 0x54, + 0xe5, 0xef, 0x5f, 0x24, 0xf7, 0x5b, 0x21, 0xa5, 0xb6, 0xff, 0xd8, 0xa8, 0x09, 0xfd, 0x16, 0xff, 0xee, 0xc4, 0x02, 0x9b, 0xb6, 0xbf, 0xf6, 0x9e, 0x1c, 0xff, 0x23, 0x90, 0x36, 0x4b, 0x70, 0xf2, + 0x21, 0xf0, 0x5d, 0x7a, 0xb6, 0x6b, 0xc6, 0xe7, 0x41, 0x57, 0x1f, 0x46, 0xd5, 0xbb, 0xd1, 0xb7, 0xcc, 0xe5, 0xa8, 0xb1, 0x9f, 0x3f, 0x4a, 0xef, 0x5a, 0xf9, 0xd3, 0x23, 0x78, 0xff, 0xfc, 0x9d, + 0x01, 0x0b, 0x1f, 0x55, 0xf9, 0xb9, 0xe9, 0x06, 0x3f, 0x38, 0x93, 0x7f, 0xad, 0x68, 0xf2, 0x73, 0x59, 0xc6, 0x1a, 0xe6, 0x3f, 0xda, 0x0b, 0x65, 0x11, 0x98, 0x05, 0xce, 0x80, 0xf6, 0x8a, 0x9f, + 0x58, 0xc0, 0x5f, 0x8f, 0x04, 0x6c, 0xac, 0x38, 0xdc, 0xd5, 0xe9, 0xe1, 0x36, 0x9c, 0xd9, 0xf5, 0x79, 0x9f, 0x4c, 0x02, 0x35, 0x0c, 0x35, 0xbb, 0xef, 0xb7, 0xec, 0xa8, 0x28, 0x36, 0x18, 0xd4, + 0x86, 0xf1, 0xec, 0xd1, 0x46, 0x14, 0xdb, 0x7b, 0xe8, 0x33, 0x78, 0x57, 0x4d, 0xf5, 0xe4, 0xc1, 0x26, 0x5f, 0x53, 0x75, 0x70, 0x35, 0x0b, 0xb8, 0xdf, 0x89, 0xd3, 0xf2, 0xa0, 0xbd, 0xf6, 0xb1, + 0x6a, 0x7e, 0x2d, 0xad, 0x4f, 0xde, 0xeb, 0xe2, 0x51, 0x3c, 0x82, 0x46, 0xbc, 0x5c, 0x34, 0x7f, 0x82, 0xcf, 0xd2, 0x42, 0xb7, 0xb8, 0x61, 0x15, 0x5e, 0xdb, 0xd9, 0x82, 0x71, 0x9f, 0xeb, 0xcd, + 0xeb, 0x6b, 0xf7, 0xd9, 0x49, 0xbd, 0x1e, 0x53, 0x7a, 0x92, 0xd7, 0xd4, 0x5a, 0xf5, 0xa8, 0x23, 0xcc, 0x08, 0xa0, 0x99, 0x8b, 0x3e, 0x91, 0x49, 0x6d, 0x86, 0xaf, 0x6e, 0x14, 0x41, 0x5a, 0x10, + 0x7a, 0x7e, 0x26, 0x7a, 0x1b, 0x87, 0x78, 0xb5, 0xe5, 0x05, 0x46, 0xae, 0xb1, 0x26, 0x08, 0x32, 0xc6, 0x70, 0xd9, 0x36, 0x73, 0x0f, 0x05, 0x29, 0x1a, 0xd5, 0xa5, 0x9c, 0x05, 0x6b, 0xc0, 0xc4, + 0x39, 0xf6, 0x4b, 0xab, 0x81, 0x11, 0x53, 0x44, 0x75, 0x24, 0x3d, 0x0c, 0x40, 0xa7, 0x0d, 0xdb, 0x57, 0x85, 0x1d, 0x84, 0x06, 0xd2, 0x4d, 0xe7, 0x2c, 0xbc, 0xf3, 0x48, 0x71, 0x32, 0x1e, 0x73, + 0x77, 0xcc, 0x99, 0x6d, 0x69, 0x7e, 0x15, 0xb0, 0x7b, 0x50, 0x96, 0x74, 0x21, 0x90, 0x0a, 0x1c, 0x21, 0xe5, 0x2d, 0x45, 0xc9, 0xa9, 0x57, 0x5f, 0x5c, 0x39, 0xb2, 0xad, 0xcd, 0xae, 0x70, 0x98, + 0x36, 0x81, 0xcd, 0xf4, 0x96, 0x93, 0x01, 0x05, 0x04, 0x46, 0x0e, 0x3d, 0xe5, 0xfc, 0xb4, 0x33, 0x0b, 0x8c, 0xde, 0x1c, 0xbb, 0x44, 0x2d, 0xf2, 0xab, 0x70, 0x5e, 0xaf, 0x34, 0x91, 0xff, 0x4d, + 0x1d, 0xa4, 0xf8, 0xdb, 0x3a, 0x48, 0xe0, 0x9f, 0x12, 0x8d, 0x37, 0xfe, 0xb2, 0xc1, 0x35, 0x77, 0xb9, 0x51, 0x12, 0x9d, 0x5a, 0x81, 0x52, 0xf4, 0x32, 0xbd, 0x50, 0x55, 0xc8, 0xae, 0xdc, 0xb7, + 0xf8, 0x75, 0x2a, 0x6f, 0x46, 0xa0, 0x31, 0x11, 0xfd, 0xab, 0x2d, 0xf0, 0x93, 0xf1, 0x6f, 0xea, 0xd9, 0x3f, 0xcb, 0xd9, 0xe9, 0x44, 0xcc, 0x23, 0x1f, 0xd1, 0xb3, 0xa4, 0x3b, 0x0f, 0x39, 0xcc, + 0x03, 0xd9, 0x3d, 0xa4, 0x58, 0x76, 0x9e, 0xa8, 0xda, 0x66, 0xaf, 0x75, 0xcf, 0x8f, 0xb4, 0xa6, 0x0d, 0xc0, 0x25, 0x45, 0x95, 0x44, 0xc6, 0x90, 0xf7, 0xbc, 0xbb, 0xfe, 0x7c, 0x65, 0x57, 0xde, + 0x83, 0xba, 0xb9, 0xd1, 0x34, 0x67, 0x41, 0xeb, 0xac, 0xe0, 0x6e, 0x32, 0x7e, 0x66, 0x1a, 0x11, 0xa3, 0x90, 0x8e, 0x25, 0x69, 0xdc, 0xc8, 0xa1, 0xc1, 0xc0, 0x8d, 0x27, 0xb5, 0xa5, 0x59, 0x53, + 0xfd, 0xd0, 0x9e, 0x3a, 0x9e, 0xe8, 0x24, 0xdc, 0xeb, 0x37, 0x61, 0x00, 0xda, 0xe3, 0x21, 0x77, 0x5d, 0x5e, 0xaa, 0x08, 0xc3, 0xa1, 0x90, 0x2b, 0x69, 0x1e, 0x1f, 0x12, 0x50, 0x25, 0x14, 0x16, + 0x75, 0xd7, 0x1e, 0x51, 0xae, 0x99, 0x41, 0x75, 0xdc, 0x9f, 0x65, 0x68, 0x06, 0xe7, 0x41, 0x90, 0x91, 0x88, 0xd3, 0xd4, 0x45, 0x1b, 0xb2, 0xf2, 0x14, 0x6f, 0x01, 0x5d, 0x2a, 0x37, 0x63, 0x13, + 0x7d, 0x41, 0x45, 0xf6, 0x47, 0xad, 0x02, 0xad, 0xce, 0xbb, 0x3e, 0x46, 0x5a, 0x6b, 0xb7, 0xc1, 0xc1, 0x59, 0x52, 0xa6, 0x6a, 0x5e, 0x31, 0x36, 0x18, 0xd9, 0xc9, 0xf2, 0x23, 0x03, 0x19, 0xaa, + 0xfb, 0x8d, 0xe6, 0x85, 0x0c, 0x3d, 0xa4, 0xc0, 0xaa, 0x5d, 0xff, 0xb0, 0xc4, 0x2e, 0x58, 0xd9, 0x9e, 0xf5, 0x36, 0x8a, 0x87, 0x58, 0x7a, 0x87, 0xaf, 0x16, 0x9e, 0xb0, 0x61, 0x5a, 0x8b, 0x6c, + 0x06, 0xac, 0xfc, 0xe4, 0xb3, 0xd6, 0x05, 0x3c, 0x76, 0x8c, 0x8b, 0xb4, 0x5a, 0x52, 0x48, 0xc9, 0xf2, 0x1f, 0xcf, 0x97, 0x1c, 0x37, 0x3d, 0x3f, 0x6c, 0x64, 0x77, 0xbb, 0x64, 0x57, 0x99, 0x49, + 0x5a, 0xf8, 0xa1, 0x13, 0x7c, 0xf6, 0x52, 0xac, 0xb4, 0xeb, 0xb9, 0xe7, 0x49, 0xcb, 0x0a, 0xe5, 0xea, 0xd9, 0x70, 0xb9, 0xd7, 0x0b, 0x8f, 0xeb, 0x08, 0xce, 0x50, 0xea, 0x5f, 0x46, 0x98, 0xb7, + 0x72, 0x9a, 0x3e, 0x4e, 0x78, 0x15, 0xfb, 0x26, 0x7d, 0x63, 0xe9, 0xb7, 0xff, 0x7c, 0x13, 0x7f, 0x57, 0xb6, 0xf8, 0xaf, 0x20, 0xb0, 0xb0, 0x54, 0x2c, 0x4b, 0xe3, 0xdf, 0x45, 0x73, 0x0a, 0x7d, + 0x9b, 0x69, 0x89, 0x7f, 0x40, 0x7e, 0x7d, 0xd9, 0x7e, 0xf7, 0xe6, 0xff, 0xb9, 0x3a, 0x40, 0x97, 0xdf, 0x49, 0x24, 0xf0, 0x03, 0x8b, 0xb4, 0x53, 0xb8, 0x39, 0x13, 0xe8, 0xf3, 0xa4, 0x56, 0xc3, + 0x49, 0x7e, 0x38, 0xfb, 0x43, 0xb3, 0x85, 0x46, 0x47, 0x22, 0x5f, 0x3f, 0x1d, 0xb8, 0xe9, 0xe2, 0x92, 0x91, 0x62, 0xf8, 0x23, 0x4c, 0xcb, 0xc8, 0x2c, 0x98, 0x9b, 0xa7, 0xfc, 0x11, 0x3e, 0x00, + 0x3e, 0xe2, 0x07, 0x9c, 0x0c, 0x69, 0x5c, 0x7e, 0x6a, 0x9c, 0x06, 0x7d, 0xc6, 0x0f, 0x7e, 0x69, 0xab, 0xfe, 0x49, 0x9e, 0xcb, 0x59, 0xdc, 0xcf, 0x2e, 0xc0, 0x41, 0xd2, 0x01, 0x48, 0x10, 0xfd, + 0xf3, 0x44, 0x56, 0x5e, 0x90, 0x34, 0xf3, 0xdb, 0x2a, 0xf9, 0x20, 0xd7, 0xe1, 0x4f, 0x3d, 0x35, 0x61, 0xea, 0x23, 0x60, 0x67, 0x58, 0xf4, 0x2c, 0xf3, 0xc9, 0xa1, 0xc9, 0x32, 0xfb, 0xeb, 0x19, + 0x7c, 0xc0, 0x77, 0xaa, 0x9a, 0x7f, 0x50, 0x55, 0xf6, 0x83, 0xaa, 0xe6, 0x3c, 0x3d, 0x5e, 0xec, 0xe5, 0xd9, 0x4f, 0x35, 0x57, 0x28, 0xcb, 0xcb, 0xa5, 0x67, 0xa1, 0x36, 0x88, 0x7a, 0x50, 0x92, + 0x63, 0x2c, 0xd2, 0x42, 0x51, 0x58, 0xfe, 0x78, 0x91, 0xa1, 0x9b, 0xb1, 0x06, 0x87, 0xf9, 0x8a, 0x06, 0x19, 0xe5, 0xe1, 0xbc, 0x80, 0x19, 0xbe, 0x92, 0x04, 0x7e, 0x33, 0x36, 0x86, 0x64, 0x15, + 0xbe, 0xb7, 0x9b, 0x9e, 0xac, 0xf8, 0x4b, 0xd0, 0x7b, 0x34, 0x5b, 0x99, 0x64, 0x22, 0x0e, 0xa8, 0x51, 0xa9, 0xc4, 0x42, 0x35, 0xe5, 0x7c, 0x75, 0x93, 0xe3, 0xb6, 0xb9, 0xc9, 0x93, 0x6b, 0x95, + 0x86, 0xa3, 0x40, 0xca, 0xed, 0x87, 0x13, 0x7e, 0x61, 0x97, 0x38, 0x7e, 0x31, 0x92, 0x84, 0xb1, 0x40, 0xc5, 0xd2, 0x10, 0xec, 0xe8, 0x7a, 0xf1, 0x78, 0xf1, 0x30, 0x24, 0x4f, 0xe4, 0x86, 0x76, + 0xe9, 0x36, 0x8f, 0xeb, 0xce, 0xaf, 0x49, 0x57, 0x3e, 0x6f, 0x73, 0x7e, 0xc1, 0x8a, 0x1c, 0xf1, 0xca, 0xe1, 0xb8, 0xa4, 0x43, 0x59, 0x2b, 0xaa, 0x7b, 0x14, 0x97, 0x04, 0x8f, 0x35, 0x52, 0x25, + 0xd7, 0x93, 0x36, 0xef, 0x57, 0x6f, 0xba, 0x32, 0xb3, 0x31, 0xe4, 0xc0, 0x9a, 0xc2, 0x50, 0xeb, 0x99, 0xf6, 0xa2, 0xb2, 0xde, 0x04, 0x5f, 0x4b, 0xa5, 0xcb, 0xcc, 0xea, 0xce, 0x94, 0x3c, 0xad, + 0x3e, 0x75, 0xfa, 0x52, 0x43, 0xa1, 0x7c, 0x3a, 0x29, 0x7e, 0xa9, 0xe2, 0x17, 0x9f, 0xb5, 0x34, 0x19, 0xcd, 0xcb, 0x53, 0xbd, 0x9c, 0x19, 0x92, 0xf3, 0xd7, 0xb8, 0x46, 0x1a, 0x47, 0x8e, 0x6f, + 0xb3, 0x7a, 0x9d, 0x4d, 0x9e, 0x13, 0x80, 0xa3, 0x79, 0x69, 0xf0, 0x2c, 0x8f, 0x4f, 0xb5, 0x5a, 0xd6, 0x57, 0xdc, 0xb0, 0xaf, 0xfe, 0x3e, 0xa4, 0xa4, 0xe0, 0x8c, 0xa9, 0xbb, 0x1f, 0x4a, 0xaa, + 0xb5, 0x2f, 0xbf, 0x81, 0x35, 0x1b, 0x26, 0xbb, 0x38, 0xb3, 0x43, 0xa2, 0xb0, 0x07, 0x75, 0x77, 0x55, 0xe5, 0x62, 0xd9, 0x5d, 0xe7, 0x67, 0x43, 0xbe, 0x52, 0xae, 0xa4, 0xba, 0x7b, 0x64, 0xad, + 0x26, 0x40, 0x97, 0xf6, 0x31, 0x1d, 0xb1, 0x13, 0x51, 0x3d, 0xef, 0x66, 0x3e, 0xc3, 0x4e, 0xe9, 0xac, 0x71, 0x99, 0xa1, 0x2e, 0x56, 0x26, 0x70, 0x7a, 0x26, 0x14, 0xa9, 0xbb, 0xbb, 0x0b, 0x74, + 0x9c, 0x96, 0x52, 0xaf, 0x62, 0xaa, 0xf4, 0x97, 0x82, 0xa1, 0x6c, 0x71, 0xea, 0x0a, 0x03, 0xde, 0x36, 0x8d, 0x45, 0xb6, 0x5b, 0xc5, 0x4b, 0xfe, 0x92, 0x75, 0x29, 0x50, 0xc9, 0x15, 0xd2, 0x83, + 0xf0, 0xa1, 0x4d, 0x67, 0x20, 0x50, 0xa3, 0x3e, 0x93, 0x58, 0xdb, 0xa5, 0x36, 0xe5, 0xaf, 0x17, 0xaa, 0x39, 0xd1, 0x21, 0xcd, 0xd2, 0xcb, 0x00, 0x2b, 0xc1, 0x78, 0x38, 0xe0, 0xe0, 0x48, 0xd2, + 0x23, 0xde, 0x74, 0x47, 0xeb, 0x39, 0x7a, 0x23, 0x65, 0xaf, 0xb8, 0xfc, 0xbf, 0xb4, 0xfd, 0x49, 0xce, 0xdc, 0xc6, 0xd7, 0x3d, 0x08, 0xcf, 0xb9, 0x8a, 0xdf, 0xf0, 0xfb, 0x40, 0x54, 0x25, 0xfb, + 0x24, 0x87, 0xec, 0x9b, 0x64, 0x93, 0xec, 0x93, 0x9c, 0xb1, 0xef, 0xfb, 0x64, 0xbb, 0x8b, 0x5a, 0x42, 0x2d, 0xa0, 0x36, 0x50, 0xd3, 0x3f, 0x6a, 0x5f, 0x05, 0xe9, 0x91, 0x64, 0x49, 0x96, 0x65, + 0xfb, 0x7d, 0xdf, 0x4a, 0xc0, 0x30, 0x10, 0x24, 0x4c, 0xc6, 0x63, 0xc6, 0x8d, 0x7b, 0x4f, 0xdc, 0x73, 0x8e, 0x97, 0xa0, 0x65, 0xb5, 0x11, 0xd4, 0x29, 0x88, 0x8d, 0x01, 0x8c, 0x99, 0xcb, 0x71, + 0x7d, 0x65, 0x28, 0x55, 0xc9, 0x92, 0x74, 0xa2, 0x06, 0x15, 0x6d, 0x86, 0x57, 0x2b, 0x82, 0x53, 0xc3, 0x5d, 0xb4, 0x89, 0x65, 0x5d, 0xbc, 0xc9, 0xb2, 0x01, 0xd7, 0xfc, 0xe8, 0xd7, 0x23, 0x4f, + 0xdf, 0x64, 0x3c, 0x29, 0xde, 0x84, 0x3c, 0x68, 0xcf, 0x2a, 0x12, 0x71, 0xaa, 0xce, 0x48, 0x12, 0xf5, 0x5f, 0xd0, 0x2b, 0x3a, 0x2c, 0xe0, 0x7e, 0xda, 0xf4, 0x3c, 0x8d, 0x7e, 0x8b, 0xdc, 0xf0, + 0xf9, 0x85, 0x46, 0x81, 0x03, 0x06, 0xe9, 0x75, 0xb6, 0x4d, 0x1c, 0x24, 0x35, 0x1b, 0x47, 0x61, 0x24, 0x2b, 0x71, 0x22, 0x55, 0x9e, 0x61, 0xe0, 0x67, 0x73, 0x68, 0x85, 0x4c, 0xa1, 0x19, 0xc2, + 0x46, 0xd2, 0x1b, 0x44, 0xc8, 0xa6, 0xc8, 0xb8, 0x79, 0x34, 0x3c, 0x11, 0x09, 0x30, 0x43, 0xac, 0x00, 0x71, 0x52, 0x50, 0x57, 0xbb, 0xf1, 0x01, 0xae, 0x2e, 0xd6, 0xd1, 0xa5, 0x04, 0x18, 0xce, + 0xd7, 0xc2, 0x7f, 0x63, 0xe7, 0xcf, 0x1c, 0xcb, 0x4c, 0x7f, 0xa1, 0xd0, 0xf2, 0x73, 0x19, 0x00, 0xfc, 0xaa, 0x0e, 0xf0, 0x4f, 0xef, 0xde, 0x4e, 0x56, 0xeb, 0xbe, 0x08, 0xcc, 0xc8, 0x9f, 0x74, + 0x26, 0x86, 0x19, 0xc1, 0xcd, 0x3d, 0x69, 0x60, 0x7f, 0x2a, 0x03, 0xbe, 0xbf, 0x17, 0xf8, 0xf9, 0x66, 0xab, 0xf8, 0xc2, 0x88, 0xe0, 0xc8, 0xfd, 0xe9, 0xd0, 0x77, 0xa6, 0x68, 0x8b, 0xf2, 0x65, + 0x32, 0xbe, 0xc9, 0x7f, 0xaa, 0x08, 0x77, 0xb5, 0xa6, 0x17, 0xa6, 0x28, 0x66, 0xa6, 0xe0, 0x05, 0xc6, 0x4c, 0x58, 0xda, 0x0a, 0x8a, 0xaf, 0x2c, 0x7f, 0x40, 0x45, 0x95, 0x36, 0x11, 0xa9, 0x2b, + 0x7a, 0x59, 0x5b, 0xd2, 0x37, 0x6b, 0x82, 0xa6, 0x63, 0x82, 0xea, 0xd7, 0xa7, 0xc5, 0xff, 0x39, 0x3b, 0xb2, 0xff, 0x0a, 0x4c, 0x97, 0x19, 0x9a, 0xcd, 0x08, 0x0c, 0xb7, 0x48, 0x32, 0xba, 0xd3, + 0x68, 0x99, 0x77, 0x00, 0x9e, 0xd6, 0x1e, 0xe5, 0xd9, 0x7b, 0x71, 0xb3, 0xef, 0x97, 0x87, 0x09, 0x19, 0x04, 0xe6, 0xa9, 0x1f, 0x6d, 0x4f, 0xa3, 0xf4, 0xf3, 0xed, 0x38, 0x33, 0xae, 0xe0, 0x10, + 0xfb, 0x5d, 0x89, 0x3b, 0x8b, 0x83, 0x46, 0x5b, 0x5c, 0xc9, 0x65, 0xb8, 0xc1, 0x2c, 0xb9, 0x9c, 0xb0, 0x62, 0xee, 0x08, 0x8a, 0x2c, 0x35, 0xfa, 0x71, 0x40, 0x85, 0x32, 0x3f, 0x03, 0x18, 0x66, + 0xf0, 0x78, 0xf5, 0x90, 0xea, 0x1e, 0x2d, 0xee, 0xc5, 0x23, 0x0c, 0xe2, 0x22, 0xa3, 0xd4, 0x62, 0xae, 0x18, 0xd9, 0x2f, 0x35, 0xf9, 0x68, 0xae, 0xca, 0xd7, 0xa2, 0x08, 0x37, 0x60, 0xed, 0xb6, + 0x9f, 0xb6, 0xe3, 0xb5, 0xef, 0xb1, 0x59, 0x2f, 0x61, 0x8f, 0x17, 0x8c, 0x36, 0x9e, 0x8b, 0x40, 0x74, 0x18, 0xaa, 0xa5, 0x24, 0x1d, 0x18, 0x39, 0xa0, 0x35, 0x19, 0xe1, 0x56, 0x32, 0x24, 0x39, + 0x0a, 0xc1, 0x7a, 0x51, 0x9f, 0xb3, 0x2e, 0x32, 0x39, 0xb0, 0x8a, 0x2c, 0x2c, 0x1b, 0xef, 0xd3, 0x9d, 0x5f, 0x2a, 0xc9, 0x3e, 0x13, 0x0b, 0xb4, 0xb0, 0xf7, 0x81, 0x6b, 0xb7, 0xfe, 0xfd, 0xce, + 0x95, 0xee, 0x6d, 0x23, 0x36, 0xf1, 0x20, 0x2d, 0x47, 0xb4, 0x64, 0xc8, 0x9b, 0xe2, 0xec, 0xb6, 0xa5, 0x44, 0x07, 0x88, 0x2b, 0xb1, 0xaa, 0xf9, 0x5b, 0x4e, 0x8f, 0x1c, 0x5c, 0xc1, 0x73, 0x13, + 0x9f, 0xee, 0xe4, 0xe6, 0x34, 0x5e, 0x2a, 0x99, 0x17, 0x8b, 0x58, 0xbc, 0x9f, 0x1b, 0x9f, 0x8a, 0x0c, 0xae, 0xc4, 0xf4, 0x43, 0xa1, 0x6e, 0xf9, 0xeb, 0x2d, 0xe3, 0x17, 0xe4, 0x51, 0x66, 0xb3, + 0xe5, 0xcb, 0xb9, 0x67, 0x47, 0x12, 0xa6, 0x67, 0xeb, 0x12, 0x83, 0x72, 0x8c, 0x40, 0x37, 0xdc, 0xa2, 0xfb, 0xfd, 0xb1, 0x3f, 0x15, 0x50, 0x8a, 0x19, 0x79, 0x0e, 0x5f, 0xb4, 0xe7, 0xd6, 0x7c, + 0xa4, 0x68, 0xd4, 0xa6, 0xd9, 0xba, 0x29, 0x61, 0xc7, 0xb3, 0x3e, 0x9f, 0x5c, 0xca, 0x0b, 0xb5, 0x24, 0xf8, 0x83, 0xa0, 0x43, 0x20, 0x26, 0x08, 0xe6, 0x75, 0xe3, 0x63, 0x4d, 0x08, 0x8c, 0x66, + 0x66, 0xd9, 0x32, 0xad, 0xb8, 0xf3, 0x54, 0x1a, 0x60, 0x63, 0x11, 0x4c, 0x49, 0x3d, 0x77, 0x98, 0x0b, 0x91, 0x98, 0x10, 0x7b, 0x64, 0xed, 0x62, 0x0f, 0x22, 0xd8, 0x2e, 0xf5, 0xc9, 0x22, 0xc9, + 0x95, 0x85, 0x23, 0xcf, 0xd3, 0x36, 0xa3, 0x7b, 0xbf, 0xa7, 0xf7, 0x23, 0x3a, 0x11, 0x88, 0x97, 0xcb, 0x2a, 0x45, 0x29, 0x64, 0x2a, 0xcc, 0x6e, 0x57, 0x0d, 0xed, 0xfe, 0x4a, 0x3d, 0xfa, 0x6c, + 0x16, 0x35, 0x07, 0x1e, 0x17, 0x5d, 0xd9, 0x3a, 0xe7, 0x99, 0x4e, 0xd1, 0xbe, 0x22, 0x67, 0x7c, 0x85, 0x37, 0xb1, 0x95, 0x5e, 0xa6, 0x95, 0x43, 0x7b, 0x0b, 0x19, 0xcf, 0xe6, 0xb1, 0x3c, 0x0e, + 0x2c, 0xbc, 0x02, 0x7e, 0x1c, 0xd5, 0x94, 0x68, 0x33, 0x3d, 0x11, 0x91, 0x6e, 0xca, 0xec, 0x0b, 0x47, 0x8d, 0x8a, 0x76, 0xe4, 0x42, 0x32, 0x37, 0xa4, 0xca, 0x02, 0x84, 0x99, 0x01, 0xdd, 0x85, + 0xd4, 0x38, 0x9e, 0xca, 0x67, 0xc2, 0x3a, 0x98, 0x44, 0xd6, 0x0b, 0xec, 0xbf, 0x93, 0xca, 0x33, 0xac, 0xad, 0xb7, 0x85, 0x15, 0xdc, 0x43, 0x8d, 0x67, 0xfa, 0xb5, 0x7f, 0x0c, 0xe2, 0x14, 0x70, + 0xcb, 0x2d, 0x08, 0x9e, 0xf2, 0x66, 0xc7, 0x75, 0x63, 0xae, 0x3c, 0xa6, 0x5b, 0x31, 0x74, 0x8a, 0xf8, 0x93, 0xc2, 0x04, 0x9f, 0x50, 0xa7, 0x1a, 0xd8, 0x2a, 0x63, 0x9b, 0x37, 0x78, 0xa3, 0x41, + 0x9a, 0x35, 0x2e, 0x06, 0x01, 0xcb, 0xf7, 0xdb, 0x4c, 0x48, 0x66, 0xc9, 0x3a, 0xec, 0xf4, 0x63, 0x08, 0x39, 0xe3, 0xcb, 0x98, 0x2c, 0x88, 0x6c, 0x9a, 0xc6, 0x27, 0xbb, 0x1d, 0x12, 0x72, 0x06, + 0xac, 0x71, 0x02, 0x0b, 0x73, 0xe5, 0x9f, 0xa5, 0x09, 0x76, 0xd5, 0x7e, 0x48, 0x1c, 0xff, 0x2e, 0x51, 0xf8, 0x07, 0xa9, 0xc2, 0xf6, 0xa9, 0x3e, 0x20, 0xbe, 0x51, 0x19, 0x65, 0xe7, 0xd8, 0x5c, + 0x15, 0xb6, 0xef, 0x2a, 0xb4, 0xfc, 0x9a, 0xd2, 0xf8, 0xb3, 0x22, 0x3c, 0x54, 0x7c, 0xae, 0x70, 0x80, 0x6f, 0x25, 0x8e, 0xf0, 0x43, 0x2a, 0xc0, 0x58, 0xdf, 0xb5, 0x56, 0xd0, 0x87, 0x16, 0xb8, + 0x1f, 0xeb, 0xf7, 0x8b, 0x9c, 0xba, 0x3e, 0xc6, 0x52, 0xd8, 0x26, 0xd5, 0x77, 0x1b, 0x34, 0x83, 0xbd, 0x80, 0x8f, 0x82, 0x8b, 0x3e, 0x75, 0x87, 0xc6, 0xb4, 0x4b, 0x86, 0xf4, 0xcf, 0x2a, 0x68, + 0xda, 0xcf, 0x63, 0x7f, 0xf9, 0x36, 0xdf, 0xbf, 0x0c, 0xf0, 0xdf, 0x7a, 0x9b, 0x9f, 0xd2, 0x05, 0xe0, 0x07, 0x64, 0xeb, 0xa7, 0x74, 0xe1, 0x78, 0x8a, 0x52, 0x4e, 0xe9, 0x98, 0x96, 0x27, 0xd8, + 0x99, 0xd7, 0x5c, 0xe7, 0x1a, 0xe4, 0x71, 0xcb, 0x48, 0x1d, 0x4c, 0x8d, 0x24, 0x1e, 0xd5, 0x9a, 0xf0, 0x2e, 0xc9, 0x3b, 0xd6, 0xee, 0x81, 0x71, 0x1e, 0x81, 0x61, 0x80, 0x0e, 0x69, 0x9b, 0x70, + 0x41, 0xf9, 0xa9, 0xe1, 0x03, 0xaf, 0x09, 0xd8, 0x5c, 0x36, 0xdc, 0xe3, 0xe0, 0x08, 0x55, 0xea, 0x38, 0x6a, 0xad, 0xf0, 0x48, 0x6d, 0x3d, 0xb2, 0xb0, 0xf8, 0xf1, 0xea, 0xf1, 0x1b, 0x6d, 0xab, + 0xd2, 0x26, 0x56, 0x8e, 0x9d, 0xe3, 0xc1, 0x6b, 0x25, 0xde, 0xa0, 0x5f, 0xf1, 0xf7, 0x78, 0x0e, 0x9c, 0xbb, 0x19, 0xeb, 0x52, 0x07, 0x80, 0xb7, 0x31, 0xbb, 0x5b, 0x08, 0xd4, 0x4f, 0x34, 0xec, + 0x13, 0xa2, 0x7d, 0xde, 0x18, 0xa5, 0xd9, 0x08, 0x81, 0x2d, 0x5c, 0x10, 0x7f, 0x37, 0x2a, 0xd6, 0x80, 0x77, 0x54, 0x71, 0xd1, 0x9b, 0x22, 0x8d, 0x5a, 0xed, 0x56, 0x90, 0x45, 0x12, 0x4e, 0x95, + 0x09, 0x7d, 0x4c, 0x7b, 0x2d, 0xa7, 0x46, 0x81, 0x09, 0x4b, 0x8e, 0xcf, 0xb0, 0xf3, 0xa8, 0x48, 0x00, 0x21, 0xeb, 0x91, 0x2b, 0xd4, 0x63, 0x35, 0xac, 0xf8, 0x2b, 0x92, 0x12, 0x34, 0x6c, 0x1f, + 0xd2, 0x15, 0xf6, 0x2b, 0x54, 0x37, 0xc5, 0x3d, 0x40, 0x09, 0xa8, 0x20, 0xe6, 0x9d, 0xea, 0xeb, 0x23, 0x91, 0x08, 0xda, 0x79, 0xdc, 0x91, 0xe1, 0x28, 0x29, 0x87, 0x7e, 0x6f, 0x9d, 0x9b, 0xbc, + 0xde, 0x7d, 0xa8, 0x56, 0x48, 0xe3, 0x8e, 0x6c, 0x86, 0xb8, 0x2b, 0xa0, 0x89, 0x83, 0x46, 0x85, 0xdc, 0xda, 0x66, 0xf1, 0x79, 0x05, 0xea, 0x82, 0x44, 0xc2, 0xe3, 0xfe, 0x8c, 0x4e, 0x1b, 0xf4, + 0x84, 0x32, 0x0b, 0xdf, 0x99, 0xa2, 0xf1, 0xea, 0x78, 0xb2, 0xb1, 0x13, 0x8d, 0x07, 0x27, 0x34, 0x12, 0x16, 0x71, 0xec, 0x39, 0x43, 0xba, 0x39, 0x62, 0xa7, 0xf7, 0x7a, 0x9a, 0x31, 0x23, 0x11, + 0x0e, 0x9b, 0x77, 0x31, 0x5e, 0x02, 0x13, 0x1d, 0xf1, 0xab, 0x5d, 0x12, 0xaf, 0xab, 0x0e, 0x45, 0xa2, 0xc1, 0x16, 0x59, 0xbf, 0x25, 0xa4, 0xc4, 0x19, 0x50, 0x31, 0x15, 0x05, 0x59, 0x76, 0xf7, + 0x5a, 0x9b, 0xb8, 0x17, 0x57, 0x32, 0x2b, 0xb7, 0x5c, 0x04, 0x38, 0x2a, 0xde, 0x48, 0x3b, 0x93, 0x42, 0x4b, 0x05, 0x8f, 0x24, 0x3d, 0xd4, 0x59, 0xdd, 0xec, 0xf5, 0x78, 0x5c, 0x61, 0x01, 0x0e, + 0x08, 0xa1, 0xd8, 0xf0, 0xec, 0xae, 0x68, 0x03, 0x53, 0x2c, 0xf8, 0x93, 0x7e, 0xcc, 0x41, 0xc0, 0xe2, 0x30, 0x58, 0xbb, 0xfd, 0xc9, 0xf3, 0xe3, 0x0d, 0x4c, 0x3d, 0x51, 0x3d, 0x3a, 0x7b, 0xc0, + 0xbb, 0x5e, 0x99, 0xce, 0x7b, 0xcd, 0x5d, 0x1d, 0x37, 0x1f, 0x12, 0x43, 0x1d, 0x97, 0x9b, 0x0b, 0x7b, 0xc8, 0x92, 0x32, 0x18, 0x5b, 0x92, 0xe4, 0x30, 0x0b, 0x60, 0x19, 0xc3, 0xa8, 0x63, 0xbe, + 0x1d, 0x89, 0x11, 0x59, 0x5c, 0x35, 0x98, 0x5d, 0xcd, 0x0a, 0xc1, 0xdc, 0x2e, 0xdd, 0xde, 0x59, 0xa0, 0x46, 0xe3, 0xb8, 0x0d, 0xbd, 0x99, 0x8b, 0xb1, 0x28, 0xa9, 0x27, 0x15, 0x58, 0x90, 0xbd, + 0xb4, 0xfd, 0x21, 0xd8, 0xab, 0x2d, 0x3a, 0x79, 0xad, 0x0b, 0xeb, 0xc2, 0xa0, 0x25, 0x83, 0x91, 0xb2, 0x34, 0x76, 0x09, 0x90, 0x64, 0xad, 0x86, 0x3c, 0x5e, 0xa8, 0x75, 0xc8, 0x79, 0xaa, 0x0b, + 0x56, 0x3f, 0xc4, 0xd7, 0x3e, 0xc9, 0xb5, 0x49, 0xbf, 0x2f, 0x04, 0x5a, 0x3b, 0x1c, 0xd5, 0xc4, 0x5a, 0x13, 0x0b, 0x22, 0x11, 0xc2, 0x99, 0x8f, 0x09, 0xbc, 0xba, 0x61, 0x17, 0x2a, 0x26, 0x56, + 0x87, 0xe0, 0x07, 0xe3, 0xeb, 0x86, 0xd4, 0x70, 0x96, 0x5b, 0x6f, 0x87, 0x80, 0xbe, 0x00, 0xd6, 0x20, 0x24, 0xc3, 0x7e, 0x88, 0x4b, 0x01, 0x3d, 0x7d, 0xfe, 0x89, 0x26, 0x51, 0x2b, 0xab, 0x1b, + 0x3a, 0xc1, 0x25, 0xf9, 0xaf, 0xd3, 0x05, 0xe0, 0xaf, 0x60, 0x43, 0x81, 0xe0, 0xf4, 0x3d, 0xb3, 0x98, 0x77, 0x3d, 0xc6, 0x06, 0xf9, 0x16, 0xfa, 0x18, 0x4a, 0xf6, 0xb1, 0x26, 0xca, 0xb6, 0xf8, + 0x53, 0xba, 0xf0, 0xf5, 0x5e, 0xe0, 0x57, 0x37, 0xff, 0x26, 0x5d, 0xe0, 0x7e, 0x97, 0x2e, 0x00, 0x9f, 0x55, 0x81, 0xfe, 0x3b, 0xe9, 0x82, 0xf4, 0x14, 0x8b, 0x8c, 0xee, 0xa1, 0x0a, 0x7a, 0x02, + 0x98, 0xe2, 0xee, 0xd8, 0x38, 0x32, 0x39, 0x4c, 0x2f, 0x2f, 0x98, 0xaa, 0x82, 0xa8, 0x13, 0xa3, 0xae, 0x09, 0x38, 0xc9, 0x52, 0xe0, 0x16, 0xe1, 0x89, 0x46, 0xb0, 0x45, 0x91, 0x0a, 0x66, 0x8f, + 0xf1, 0x65, 0x71, 0x16, 0x37, 0xbb, 0x1c, 0x7d, 0x45, 0x4a, 0x1a, 0x8b, 0x87, 0x27, 0x67, 0x48, 0x37, 0x66, 0x6a, 0x03, 0xe5, 0x1e, 0x48, 0x28, 0x25, 0x00, 0x8d, 0xdf, 0x87, 0xf9, 0xfc, 0xc6, + 0x92, 0x85, 0x17, 0xb9, 0x73, 0x36, 0x6a, 0xcc, 0xdb, 0x83, 0xe8, 0x2c, 0x2e, 0x73, 0xc5, 0x0c, 0xbb, 0xf5, 0x4b, 0x4e, 0x31, 0xca, 0x79, 0xa1, 0x0e, 0x76, 0x0e, 0xe1, 0x83, 0x3a, 0xef, 0x1b, + 0x6e, 0x0d, 0xb6, 0xc2, 0x2c, 0x2f, 0x9e, 0x0d, 0x8e, 0x89, 0x5d, 0xc4, 0xc7, 0xfc, 0x6a, 0x13, 0x5b, 0xa2, 0x6e, 0x2a, 0x80, 0xbe, 0xfc, 0x62, 0x17, 0x60, 0xbc, 0x91, 0xf7, 0x18, 0x13, 0xb8, + 0x0e, 0xad, 0x25, 0xb0, 0x93, 0xde, 0xfb, 0x8b, 0xf0, 0x4d, 0xe4, 0x81, 0x62, 0xf4, 0x1c, 0x6e, 0x10, 0xc2, 0xa5, 0x26, 0xbf, 0x54, 0x87, 0x83, 0xbc, 0x8d, 0x7e, 0xca, 0xc5, 0x72, 0x94, 0x9a, + 0x57, 0x73, 0xad, 0x83, 0x9a, 0x68, 0x5d, 0xc3, 0xb5, 0x1d, 0x96, 0xdb, 0x37, 0xe6, 0x00, 0x6e, 0xab, 0xde, 0x27, 0x13, 0x7b, 0x6c, 0xf0, 0xa9, 0xe2, 0xcf, 0x29, 0x94, 0x97, 0x8c, 0x5f, 0xad, + 0x55, 0x97, 0xf1, 0xe4, 0x76, 0xb7, 0x5f, 0xc5, 0x85, 0xf8, 0x77, 0xca, 0xe7, 0xf9, 0x3b, 0x05, 0x65, 0x4b, 0x3b, 0x32, 0x72, 0x3b, 0x95, 0x3d, 0x0c, 0x2d, 0x84, 0xb0, 0x29, 0x71, 0xd4, 0x68, + 0x9c, 0x54, 0x4d, 0x81, 0x16, 0xfa, 0xf5, 0x2e, 0x44, 0x00, 0x27, 0x56, 0x64, 0x64, 0xb5, 0xf8, 0xc1, 0x50, 0x60, 0xbb, 0xfb, 0xb7, 0x23, 0x6b, 0x1a, 0xd7, 0xbb, 0xbb, 0xb0, 0xfb, 0x76, 0xee, + 0x69, 0x53, 0xfb, 0x75, 0xc0, 0x85, 0xd1, 0x93, 0xa1, 0x09, 0x98, 0xd1, 0x9e, 0xba, 0x28, 0x62, 0xbe, 0x39, 0x23, 0x3e, 0x0c, 0xc7, 0x52, 0x23, 0xb4, 0x6f, 0x2c, 0xb5, 0x90, 0x57, 0xd6, 0xc1, + 0xe1, 0x64, 0x4f, 0x4f, 0x20, 0xa3, 0xee, 0x5c, 0x89, 0x35, 0x66, 0xe7, 0xb6, 0x57, 0xa6, 0x15, 0xd4, 0xe6, 0xf1, 0x70, 0xca, 0xce, 0x1e, 0xf9, 0xc2, 0x47, 0xf1, 0x9c, 0xee, 0xc6, 0x1d, 0x6a, + 0x57, 0x65, 0x8c, 0x9e, 0x2f, 0xa5, 0x6c, 0xc4, 0x48, 0xba, 0x17, 0x97, 0xef, 0xa4, 0xa6, 0x95, 0xd2, 0xef, 0xe9, 0x56, 0x2c, 0xdc, 0xed, 0xa1, 0x7b, 0x1e, 0xd6, 0x83, 0xf6, 0xb2, 0xae, 0x80, + 0x7f, 0x24, 0xc2, 0xf9, 0x7c, 0xe8, 0xf2, 0x25, 0x38, 0x86, 0x2e, 0xbf, 0xa3, 0x1a, 0x64, 0xd7, 0x00, 0x92, 0xa3, 0x2d, 0xcd, 0xcc, 0x97, 0xb5, 0xee, 0x87, 0x00, 0x32, 0xc4, 0x3e, 0x06, 0x0a, + 0x7f, 0x33, 0xb4, 0xf1, 0xc5, 0xd3, 0x08, 0xa5, 0xb1, 0x37, 0x69, 0xcc, 0x42, 0x66, 0xd0, 0xa7, 0x95, 0x09, 0xb2, 0x68, 0x78, 0x58, 0x6d, 0xcc, 0xef, 0x0a, 0xc0, 0xc9, 0x1d, 0xb1, 0xea, 0x06, + 0xbe, 0x2b, 0xc6, 0x43, 0x7b, 0x4e, 0x3a, 0x1e, 0x8e, 0xb3, 0x60, 0x0a, 0x46, 0x48, 0xcc, 0x51, 0xd0, 0x06, 0x60, 0x49, 0x97, 0x1d, 0xb4, 0x98, 0x48, 0x1e, 0x25, 0x20, 0xff, 0x3c, 0x65, 0x4c, + 0xb7, 0x69, 0xdc, 0x64, 0xa9, 0x69, 0xd3, 0x0d, 0x66, 0xd2, 0x89, 0x68, 0x6b, 0xab, 0x64, 0xd5, 0x14, 0x07, 0x5c, 0x63, 0x80, 0x2b, 0xf8, 0x9a, 0x0c, 0xc1, 0x7b, 0xae, 0x5f, 0x49, 0xcc, 0x88, + 0x2f, 0x25, 0x56, 0xcf, 0xb7, 0xa8, 0xb9, 0x50, 0x11, 0x4c, 0x21, 0x76, 0x72, 0x54, 0x72, 0x9f, 0x18, 0xaa, 0x8a, 0xa2, 0xf2, 0xbe, 0xe0, 0xf4, 0x74, 0x7f, 0x34, 0xd7, 0xcc, 0xfa, 0x34, 0x7e, + 0x2d, 0x63, 0x85, 0xb0, 0xf8, 0x6f, 0xd5, 0x0e, 0x3e, 0xec, 0x10, 0x3e, 0xc4, 0xae, 0xff, 0x84, 0xed, 0xfe, 0x5d, 0x6a, 0xc0, 0xad, 0x1c, 0xcb, 0xd2, 0x13, 0xfb, 0x47, 0xe7, 0xc2, 0x93, 0x35, + 0x5e, 0x74, 0xe1, 0x8f, 0x11, 0xcc, 0xe6, 0x37, 0x6e, 0x56, 0x8e, 0x32, 0x84, 0x7e, 0xdd, 0xbf, 0x26, 0xff, 0x0a, 0xc7, 0x2d, 0x34, 0x06, 0xfb, 0x5a, 0xc4, 0xbf, 0xbe, 0xd0, 0x2e, 0xda, 0xaf, + 0x22, 0xd0, 0xe6, 0x1f, 0x52, 0xa3, 0x63, 0x8c, 0x60, 0x87, 0x70, 0xd1, 0xde, 0x57, 0x74, 0x81, 0x6b, 0x3f, 0xa8, 0x1c, 0xa1, 0x67, 0x9d, 0x40, 0xfa, 0xd2, 0x7f, 0xc6, 0x65, 0x77, 0xfd, 0xe2, + 0x71, 0xed, 0xe2, 0x0f, 0xe3, 0x43, 0xdf, 0x0e, 0xff, 0xd0, 0xb7, 0xe3, 0x71, 0x9d, 0xa3, 0x61, 0xdd, 0x1b, 0x76, 0xfb, 0x17, 0xb0, 0xac, 0xcc, 0xd1, 0xd9, 0xb7, 0xa4, 0x45, 0x80, 0xff, 0x78, + 0xc2, 0x97, 0x07, 0x6c, 0x49, 0xcf, 0x6c, 0x49, 0xf7, 0xd1, 0x32, 0xac, 0x59, 0xc9, 0x2e, 0x7c, 0x45, 0x18, 0xf6, 0xaf, 0x74, 0x3c, 0xef, 0xab, 0xd0, 0xf6, 0x67, 0x94, 0x15, 0xf8, 0xc7, 0x30, + 0xeb, 0x63, 0x6d, 0x8a, 0xcc, 0xf7, 0xae, 0xfc, 0x85, 0x08, 0xf2, 0x9d, 0x75, 0xc8, 0xd9, 0xc5, 0xfa, 0xca, 0xf3, 0x95, 0x83, 0xc1, 0x4c, 0x24, 0x34, 0x59, 0xf3, 0x05, 0x18, 0x21, 0x7f, 0x85, + 0x6b, 0x07, 0x62, 0x81, 0xb1, 0x05, 0xed, 0xa9, 0x40, 0xf9, 0xde, 0xf8, 0x88, 0x78, 0x61, 0x0c, 0x6f, 0x99, 0xd6, 0x9e, 0xc6, 0x1b, 0x8b, 0xad, 0xb7, 0x3a, 0x1b, 0x31, 0x91, 0x18, 0x9b, 0x5a, + 0xec, 0x0f, 0x84, 0xda, 0x06, 0x62, 0x34, 0x1d, 0x02, 0x6b, 0x0d, 0x68, 0x14, 0xdf, 0xb6, 0x01, 0x15, 0x5a, 0x4a, 0x83, 0xd4, 0x1b, 0xe0, 0xfc, 0x24, 0xf1, 0xa8, 0x44, 0x9c, 0x93, 0x59, 0xa6, + 0x72, 0xcc, 0x98, 0x91, 0xa0, 0xb5, 0x69, 0xdb, 0x67, 0x61, 0xa4, 0x5e, 0xcb, 0x98, 0x63, 0xf9, 0x9b, 0x65, 0x6d, 0x85, 0xfb, 0x7a, 0xaa, 0xf2, 0xab, 0x10, 0xc3, 0x38, 0x47, 0xe4, 0x4b, 0x8e, + 0x86, 0xdd, 0x27, 0x0f, 0xb3, 0x3b, 0xec, 0x67, 0x57, 0xab, 0xe4, 0xd1, 0x40, 0xe8, 0x7d, 0x95, 0x00, 0x51, 0x88, 0x68, 0x65, 0x71, 0x4c, 0x54, 0x63, 0x36, 0x94, 0x22, 0x8a, 0x7d, 0xe4, 0xfd, + 0x41, 0x34, 0x2d, 0x1b, 0xb2, 0x49, 0x69, 0x8b, 0x7b, 0xb0, 0x7b, 0x66, 0xe1, 0x74, 0x20, 0xa3, 0x24, 0xd6, 0x77, 0x2e, 0x72, 0x23, 0x69, 0x44, 0x47, 0x55, 0xea, 0xb9, 0x0a, 0x64, 0xb2, 0xf5, + 0x01, 0x27, 0x43, 0xbc, 0x0d, 0xdd, 0xaa, 0x92, 0xf4, 0x2d, 0x06, 0x20, 0xb8, 0xb9, 0xad, 0xfd, 0x83, 0xb4, 0x58, 0x3b, 0xc1, 0x50, 0xe3, 0xa2, 0x08, 0xea, 0xa5, 0x42, 0x72, 0xd7, 0x47, 0x2d, + 0xb4, 0x16, 0x8c, 0x4d, 0x36, 0x9b, 0xee, 0xa2, 0x87, 0xc4, 0x5e, 0x91, 0xc0, 0x75, 0xd1, 0xc8, 0x2a, 0x89, 0xaf, 0x0b, 0x39, 0x13, 0x6e, 0x19, 0x8d, 0x81, 0xf0, 0xee, 0x69, 0x99, 0x83, 0xb1, + 0xd8, 0x20, 0x78, 0x9d, 0x04, 0xac, 0xf3, 0x1f, 0xfa, 0xa4, 0xbd, 0xc3, 0x32, 0x5d, 0xfd, 0x29, 0x13, 0xfc, 0x42, 0xbc, 0x0f, 0x64, 0x54, 0xa0, 0x65, 0x9e, 0x29, 0x31, 0x9e, 0xe6, 0x35, 0xda, + 0x74, 0x7e, 0xa2, 0xdb, 0x05, 0xff, 0x70, 0x9b, 0x33, 0xeb, 0x07, 0x22, 0x6c, 0x03, 0x7f, 0xcb, 0xf1, 0xd4, 0x46, 0x67, 0xee, 0x96, 0xa7, 0x9a, 0xc9, 0xc0, 0x91, 0x49, 0x90, 0xbb, 0x4e, 0x7f, + 0x68, 0xd6, 0x31, 0x2c, 0xb4, 0x3f, 0x2e, 0x7a, 0x1c, 0xd8, 0xac, 0x50, 0x82, 0xa0, 0x06, 0x7e, 0xd2, 0xac, 0xfb, 0xc2, 0xf1, 0xf0, 0xbe, 0x0a, 0xef, 0x7e, 0xe6, 0x79, 0xb8, 0xb0, 0xf5, 0x5b, + 0x9e, 0x07, 0x6d, 0xfe, 0xd6, 0x57, 0x80, 0x7b, 0x3b, 0xd0, 0x5c, 0xfa, 0xdc, 0x68, 0x27, 0xed, 0x0a, 0x8f, 0x93, 0xde, 0x8a, 0x8f, 0xe8, 0xee, 0x3a, 0x6f, 0x94, 0x08, 0xd1, 0x09, 0xc2, 0xa9, + 0x04, 0xe3, 0xbd, 0x36, 0xdb, 0xd1, 0x87, 0x0f, 0x2a, 0xbb, 0xab, 0x3e, 0x5c, 0xc6, 0xb2, 0x57, 0xc0, 0x4e, 0x32, 0xdd, 0x34, 0x13, 0x3b, 0xc1, 0x2d, 0x90, 0x63, 0xb5, 0xf2, 0x16, 0xef, 0x66, + 0x8e, 0xd0, 0xa6, 0xdf, 0xab, 0x70, 0x47, 0x13, 0xcb, 0x5d, 0x6d, 0x6f, 0xe8, 0x6b, 0xdc, 0x5e, 0xa9, 0x96, 0x50, 0x4f, 0x50, 0x66, 0xfc, 0x96, 0x9d, 0x4c, 0xef, 0x38, 0xd5, 0x6c, 0x51, 0xd6, + 0x62, 0x7d, 0xcb, 0xc7, 0x74, 0x43, 0xa5, 0x64, 0x55, 0xa5, 0x1c, 0xe8, 0xe2, 0x83, 0x94, 0x3d, 0x73, 0xc6, 0x85, 0xaa, 0x5a, 0xe1, 0x64, 0x9c, 0x47, 0x62, 0x1c, 0x8e, 0xa6, 0xe3, 0xf0, 0x66, + 0x65, 0x55, 0x6e, 0xbb, 0xf9, 0xfd, 0xb3, 0xb3, 0x06, 0xa5, 0xce, 0x8c, 0xbe, 0x3f, 0x37, 0x45, 0xaf, 0xad, 0xbb, 0xa2, 0xea, 0x98, 0xa3, 0xb8, 0xaf, 0x91, 0x0e, 0x3a, 0x69, 0x0e, 0x1b, 0xb7, + 0x0e, 0xf3, 0x40, 0xcc, 0x43, 0xa0, 0xd7, 0x5c, 0x21, 0xa5, 0xb7, 0x3e, 0x3c, 0x9f, 0x36, 0xfb, 0x3c, 0x65, 0x22, 0x22, 0xd4, 0x1c, 0xe4, 0x77, 0x8a, 0x4b, 0xc1, 0x5b, 0x12, 0x9c, 0x48, 0x85, + 0x64, 0x16, 0x47, 0xef, 0xb1, 0x81, 0x49, 0xe8, 0x5b, 0x86, 0x6e, 0xba, 0x7a, 0x33, 0x9f, 0xa1, 0x4a, 0x89, 0xa1, 0xc8, 0xb4, 0x76, 0x47, 0xd6, 0xf2, 0x23, 0x38, 0x83, 0x3d, 0xc2, 0x37, 0x0b, + 0x40, 0xe5, 0xb7, 0xb4, 0xae, 0x22, 0x0e, 0xfb, 0xaa, 0x39, 0x4c, 0x1c, 0x14, 0xee, 0x1e, 0xf6, 0xf0, 0xb5, 0x28, 0xde, 0x1d, 0x1f, 0xd4, 0x42, 0x6d, 0xc0, 0xa7, 0x43, 0xbf, 0xdb, 0x3a, 0x6e, + 0x97, 0xaa, 0x14, 0x62, 0xcb, 0x3e, 0x97, 0xc3, 0x66, 0x40, 0xec, 0xbd, 0xfe, 0xbd, 0xaf, 0xc0, 0x17, 0xc3, 0x99, 0x6f, 0xc4, 0xbf, 0x3f, 0x15, 0x62, 0x7f, 0x1b, 0x65, 0xb7, 0xcf, 0x51, 0xd6, + 0xfe, 0x16, 0x65, 0x19, 0x38, 0xa8, 0x46, 0xa3, 0x76, 0xab, 0xa1, 0xd5, 0x29, 0xe6, 0x29, 0x93, 0xcf, 0x7a, 0x1a, 0x7f, 0xdd, 0x1f, 0xf6, 0xf8, 0x6f, 0x47, 0xd9, 0x3f, 0x3a, 0x01, 0x34, 0x87, + 0x17, 0xbe, 0xc4, 0x40, 0x9b, 0x91, 0x80, 0x6f, 0x04, 0xb7, 0x1f, 0x7a, 0xbf, 0x68, 0x54, 0x73, 0x1a, 0x48, 0xab, 0x65, 0xec, 0x83, 0xec, 0xdc, 0x1c, 0x5a, 0xad, 0x1d, 0x9a, 0xd3, 0xc0, 0x5a, + 0x4d, 0x23, 0x7e, 0xfd, 0xe3, 0x1b, 0x7d, 0x7d, 0x21, 0xe0, 0x7f, 0xe2, 0x8d, 0xbe, 0xbe, 0x10, 0xf0, 0xef, 0xac, 0xb7, 0xd8, 0x4d, 0xb7, 0xef, 0xc1, 0x2c, 0x1e, 0x5e, 0x64, 0x86, 0x07, 0x6e, + 0xe9, 0x83, 0xa2, 0xea, 0x4f, 0x44, 0xdb, 0x4b, 0xeb, 0x56, 0x1f, 0x40, 0xc0, 0x55, 0x4a, 0x65, 0x3e, 0xc7, 0x2d, 0x1b, 0x33, 0xab, 0xd5, 0x14, 0x54, 0xb8, 0x60, 0x7f, 0xad, 0x51, 0xcb, 0x1e, + 0x58, 0xe2, 0x12, 0x4a, 0xf8, 0x6c, 0x2e, 0x47, 0xbb, 0x4b, 0x39, 0x3d, 0xa0, 0x79, 0x01, 0x12, 0xda, 0x58, 0x97, 0x52, 0x98, 0x6d, 0x35, 0x99, 0x27, 0xa7, 0x53, 0xf9, 0x24, 0xb5, 0x44, 0x37, + 0x41, 0x7a, 0x47, 0x5a, 0x6c, 0x02, 0xf1, 0x64, 0x91, 0x8a, 0x2e, 0xae, 0xe6, 0x52, 0xf9, 0xae, 0xa8, 0xad, 0xd8, 0x13, 0x87, 0x6f, 0x63, 0xd5, 0xbf, 0xa0, 0x66, 0x6d, 0x33, 0x0d, 0xd7, 0x10, + 0xdb, 0x90, 0x26, 0x2b, 0x6f, 0x74, 0xa5, 0x7f, 0xaa, 0x6a, 0x78, 0x6b, 0x44, 0xdc, 0x8b, 0x12, 0xa5, 0xee, 0x65, 0x41, 0x1a, 0xb6, 0xd4, 0x92, 0x7d, 0xd6, 0x7c, 0x33, 0xca, 0xce, 0xc0, 0x05, + 0x40, 0xea, 0xfc, 0x4b, 0x55, 0x5e, 0x33, 0x35, 0xbd, 0x98, 0x66, 0x7a, 0x0a, 0xfb, 0x94, 0xc8, 0x01, 0x0d, 0x17, 0x0c, 0xc3, 0xfa, 0x59, 0x88, 0xf9, 0xba, 0x11, 0x8d, 0xef, 0x6d, 0x68, 0x2d, + 0xa7, 0x97, 0xa5, 0xee, 0x85, 0x37, 0x37, 0x7f, 0x22, 0x3d, 0x35, 0xe9, 0xc2, 0x82, 0x1a, 0x83, 0x20, 0xe2, 0x38, 0xf7, 0x02, 0x9b, 0xb5, 0x65, 0xe8, 0xc0, 0x03, 0x24, 0x4e, 0xa4, 0xef, 0xc4, + 0x10, 0x44, 0xa4, 0x72, 0x87, 0xa9, 0xd9, 0x00, 0x1d, 0xad, 0x80, 0x73, 0x9f, 0x8a, 0x6a, 0xed, 0x5d, 0x98, 0xce, 0x7d, 0x11, 0x2e, 0xb7, 0x7f, 0x3c, 0xab, 0x17, 0x83, 0xd6, 0x93, 0xab, 0xc0, + 0xaf, 0x7e, 0x73, 0x53, 0x90, 0xc4, 0x3d, 0x75, 0x56, 0xd8, 0xb2, 0x88, 0xf9, 0xb1, 0x55, 0x54, 0xac, 0x54, 0x6f, 0x1e, 0x53, 0x01, 0xd0, 0xeb, 0xd9, 0xd7, 0xe8, 0xc8, 0xfd, 0xc1, 0xaa, 0x83, + 0xf6, 0x22, 0x1c, 0xfe, 0x3f, 0x60, 0xd5, 0x3d, 0x28, 0x9e, 0xd1, 0x14, 0x26, 0x6f, 0x2a, 0x0e, 0x81, 0x30, 0x9c, 0x5e, 0xaf, 0xa5, 0x94, 0xe6, 0xee, 0x5a, 0xba, 0x46, 0xe3, 0xcc, 0xaf, 0xac, + 0xba, 0xb7, 0xc6, 0x2e, 0xfb, 0x23, 0xa2, 0x7b, 0x60, 0x60, 0x7d, 0x51, 0x46, 0x7e, 0x64, 0xd5, 0x25, 0x5f, 0xbe, 0xb7, 0xaf, 0xce, 0x41, 0x9f, 0x55, 0x47, 0x60, 0x5d, 0x32, 0x21, 0x7e, 0x0d, + 0x50, 0x65, 0xd1, 0x3e, 0xbd, 0xae, 0xbd, 0x88, 0xb4, 0x69, 0x32, 0x45, 0x9d, 0x78, 0xb4, 0xf9, 0x59, 0xd4, 0x8d, 0x06, 0xfe, 0xfa, 0x84, 0x8c, 0xa9, 0xc5, 0xa2, 0xa4, 0xf3, 0xc8, 0xca, 0xdc, + 0x1d, 0x46, 0x11, 0x69, 0x5a, 0xa5, 0x1d, 0x52, 0x5d, 0x2b, 0xe0, 0xee, 0x47, 0x49, 0x9e, 0x86, 0xb1, 0x45, 0x6d, 0xe5, 0x08, 0x22, 0x6b, 0x2d, 0x83, 0x93, 0x54, 0x3c, 0x01, 0x02, 0x46, 0x30, + 0x10, 0x24, 0x18, 0xb1, 0x95, 0x07, 0x31, 0xfa, 0xdd, 0x98, 0x95, 0x87, 0xe9, 0x71, 0xa3, 0x0c, 0xfb, 0xcd, 0xc8, 0xbf, 0x1a, 0xfc, 0x05, 0xf6, 0x2f, 0x43, 0x82, 0x6a, 0x23, 0xdc, 0x4c, 0xd2, + 0x64, 0x23, 0xbb, 0x13, 0xf7, 0xf8, 0x5e, 0x59, 0x22, 0xc7, 0x64, 0x97, 0x3b, 0xbd, 0xe2, 0x31, 0x14, 0xad, 0xeb, 0xca, 0x9d, 0x18, 0x4c, 0x7a, 0x80, 0xe5, 0x46, 0x43, 0xb4, 0x48, 0x62, 0x84, + 0xcb, 0x44, 0x20, 0x29, 0xfc, 0x89, 0x6d, 0xcd, 0x48, 0x69, 0x9d, 0x8c, 0x43, 0x1d, 0x07, 0x97, 0xe3, 0x8d, 0x4f, 0xc1, 0xe5, 0xcd, 0xea, 0x15, 0x6e, 0xdc, 0x1e, 0x2e, 0xc5, 0x45, 0x2f, 0x0b, + 0x09, 0xa1, 0xed, 0xc9, 0x60, 0x57, 0x47, 0x6f, 0x19, 0x8c, 0xc5, 0x16, 0xf7, 0x76, 0x97, 0xb7, 0xa0, 0xdc, 0x70, 0x00, 0x65, 0x03, 0x7d, 0x23, 0x42, 0x29, 0xa5, 0xe3, 0xa0, 0xd2, 0x79, 0xe2, + 0xe1, 0xb0, 0xfc, 0xf5, 0x96, 0xf1, 0x42, 0x94, 0xe3, 0x49, 0x4b, 0x5f, 0x76, 0x7c, 0x4c, 0x9e, 0x27, 0xf4, 0x82, 0x3b, 0x81, 0xba, 0x99, 0x37, 0xf0, 0xcb, 0x0f, 0x74, 0xb4, 0xd9, 0x05, 0x7d, + 0x19, 0x7b, 0xff, 0x12, 0xa2, 0xe4, 0x90, 0xbc, 0x48, 0xde, 0x29, 0xf2, 0x48, 0x80, 0x9c, 0x54, 0xb9, 0x8e, 0x39, 0x66, 0xa7, 0x8c, 0x68, 0x02, 0x1d, 0xb1, 0xd0, 0xf5, 0x2b, 0x9a, 0x99, 0x36, + 0x8e, 0x86, 0xbd, 0x90, 0xb3, 0xe4, 0x55, 0x79, 0xe0, 0x64, 0x6c, 0x99, 0x8f, 0x5c, 0x79, 0xca, 0xc7, 0x2d, 0x8a, 0x1f, 0x7b, 0x6e, 0x19, 0x52, 0x2a, 0xa3, 0xa5, 0xe5, 0x93, 0x89, 0xff, 0x5b, + 0xc1, 0x67, 0x43, 0x33, 0x38, 0xe3, 0xbf, 0x68, 0x4e, 0xf0, 0x77, 0x51, 0x98, 0x97, 0x1c, 0x96, 0xa5, 0xf7, 0x6f, 0x30, 0x98, 0xe9, 0x0c, 0xfc, 0xbb, 0x1a, 0x94, 0x16, 0xa3, 0x17, 0xf6, 0x5e, + 0x63, 0x30, 0xdd, 0xc4, 0xed, 0xf3, 0xaf, 0x58, 0xd7, 0xce, 0x4f, 0xac, 0xeb, 0x9f, 0xe4, 0x93, 0x9d, 0x5f, 0xc9, 0x27, 0xff, 0x49, 0x3d, 0xf9, 0xd0, 0xfe, 0xa4, 0x9e, 0x0c, 0x7c, 0x09, 0x9a, + 0x96, 0x09, 0x51, 0xba, 0x03, 0x59, 0xcf, 0x9f, 0xe5, 0x93, 0x95, 0x8b, 0x6e, 0xbf, 0x06, 0x4b, 0xa9, 0xd1, 0x9f, 0x8e, 0x4b, 0xf1, 0xce, 0xaf, 0xb4, 0x7b, 0x78, 0x01, 0x06, 0xfe, 0xa0, 0xbc, + 0x7d, 0x6b, 0x2f, 0x3b, 0x3f, 0xab, 0x43, 0x73, 0xdf, 0xb9, 0x2b, 0x3a, 0xfc, 0xa9, 0x5d, 0x9f, 0xfe, 0x71, 0x71, 0xdd, 0x69, 0x23, 0x4d, 0x16, 0x99, 0x5f, 0xe9, 0x5d, 0x03, 0xdf, 0x04, 0xaf, + 0x19, 0xcd, 0xfe, 0x27, 0x7a, 0xd7, 0xfc, 0xfe, 0x6b, 0xbd, 0x6b, 0xfe, 0x10, 0x38, 0xc0, 0x81, 0xe0, 0xa7, 0xc5, 0x7f, 0x08, 0x5e, 0x7f, 0xa7, 0xb7, 0xd3, 0x6b, 0xac, 0xfb, 0x15, 0xa8, 0xcb, + 0xbe, 0xfb, 0x13, 0xfc, 0x96, 0x54, 0x05, 0xfc, 0x9d, 0xc9, 0xd6, 0xf7, 0xad, 0x68, 0x10, 0xcf, 0xaa, 0x15, 0xaa, 0xd6, 0x8d, 0xb5, 0xa1, 0x6e, 0xc2, 0xc7, 0x1e, 0x6d, 0x07, 0x10, 0xd1, 0xdd, + 0xf6, 0x2c, 0x7a, 0xbc, 0x9c, 0x55, 0x02, 0xc0, 0xfb, 0x2a, 0x5f, 0x05, 0x5a, 0xab, 0x17, 0x29, 0xb6, 0x1b, 0x5b, 0x3d, 0x3c, 0x36, 0x9c, 0xdf, 0xcb, 0x7d, 0xf0, 0xb2, 0x3d, 0x15, 0x84, 0xe3, + 0xca, 0x60, 0xb6, 0x71, 0x61, 0xe6, 0x36, 0xf5, 0x32, 0x22, 0x4e, 0x62, 0x0a, 0xd9, 0x77, 0xdf, 0x8f, 0x5e, 0xae, 0x40, 0x40, 0x30, 0x7b, 0xec, 0x96, 0x76, 0x8b, 0x74, 0xdc, 0x63, 0x23, 0x67, + 0xdf, 0x81, 0x43, 0x12, 0x2f, 0x77, 0xa3, 0x4b, 0x27, 0x92, 0x82, 0xb5, 0x6e, 0x49, 0x49, 0x21, 0x6a, 0x45, 0x41, 0xcf, 0xe2, 0x88, 0x82, 0xa9, 0x0c, 0x49, 0x13, 0x5f, 0x3c, 0xff, 0x9e, 0xad, + 0xba, 0x22, 0x81, 0xb0, 0x28, 0x77, 0x22, 0x1f, 0x45, 0x4f, 0x70, 0x63, 0xc0, 0x5c, 0x34, 0x3d, 0x70, 0x5d, 0xb2, 0x02, 0x51, 0x11, 0x54, 0xde, 0xa3, 0x2e, 0xf6, 0x00, 0x8c, 0x8f, 0xea, 0x44, + 0x3f, 0x06, 0x24, 0x27, 0x79, 0x5b, 0x6e, 0x51, 0x74, 0x7e, 0x8d, 0x20, 0x92, 0xbe, 0xcd, 0xac, 0x23, 0x8d, 0x18, 0x3a, 0x11, 0x5f, 0x66, 0xc9, 0x58, 0x1c, 0x9e, 0x3e, 0x86, 0xf6, 0x86, 0xbc, + 0x61, 0x6f, 0xa3, 0x52, 0x86, 0x4d, 0x5c, 0x05, 0x8f, 0xab, 0x0c, 0xbe, 0x7e, 0x4e, 0x2f, 0x5b, 0xe1, 0xda, 0xc9, 0x22, 0x16, 0x1a, 0x80, 0x1f, 0xe2, 0x35, 0xd9, 0x2f, 0x90, 0x73, 0xc0, 0x5e, + 0x8a, 0x67, 0xc7, 0x4d, 0x78, 0x75, 0xd4, 0xa7, 0xc5, 0x30, 0x28, 0xcf, 0x65, 0x4d, 0x21, 0x74, 0x23, 0x47, 0xe7, 0xc9, 0x77, 0x1d, 0xa1, 0x22, 0xcc, 0xf2, 0x21, 0x34, 0xdc, 0x1f, 0x8c, 0x2f, + 0x1c, 0x0c, 0xaa, 0x4b, 0x78, 0x30, 0x84, 0xfc, 0x0c, 0xf1, 0x4e, 0x82, 0x1b, 0xfd, 0xc3, 0x93, 0x81, 0x59, 0x5d, 0x3a, 0xea, 0x0f, 0x29, 0x4d, 0x43, 0x93, 0x45, 0xf5, 0xc7, 0x56, 0x5e, 0x53, + 0xf5, 0x0d, 0x5f, 0x3d, 0x9a, 0xdd, 0xd3, 0x09, 0x8b, 0x9e, 0x1c, 0x76, 0x94, 0x63, 0x5c, 0xd2, 0xdb, 0xd1, 0xbf, 0x5d, 0xff, 0xca, 0x90, 0x8b, 0x51, 0x3e, 0xfa, 0x86, 0x49, 0xfe, 0xb3, 0xff, + 0x23, 0x47, 0x14, 0xcf, 0x07, 0x4d, 0x94, 0x75, 0x39, 0xa4, 0x92, 0xb5, 0x1b, 0x15, 0xb9, 0x7d, 0x0a, 0xf1, 0x9f, 0x61, 0x1f, 0x9f, 0x6a, 0x80, 0x18, 0xd1, 0xcb, 0x0f, 0x0c, 0x88, 0xe2, 0x3e, + 0xbe, 0x39, 0xea, 0x4f, 0x4b, 0xe5, 0xfb, 0x6f, 0xe9, 0x77, 0xfa, 0xce, 0xc0, 0xa7, 0xef, 0xe7, 0x39, 0x56, 0x59, 0x77, 0x0b, 0x62, 0x22, 0x4d, 0xf0, 0x37, 0x5a, 0xad, 0xd2, 0x4b, 0x0e, 0xec, + 0xd4, 0x90, 0x70, 0xde, 0x60, 0x89, 0xeb, 0xa6, 0x4c, 0x9b, 0x3f, 0xbc, 0x33, 0xca, 0xcb, 0x59, 0xc1, 0x0e, 0xf3, 0xde, 0xe3, 0x32, 0x61, 0xa1, 0x38, 0x42, 0x6b, 0x50, 0xc3, 0x52, 0x0b, 0x95, + 0x77, 0x8a, 0xf4, 0x88, 0x49, 0xf6, 0x09, 0x18, 0x22, 0x2f, 0x4f, 0x0c, 0xc1, 0xb0, 0x0b, 0xbd, 0xc9, 0x2c, 0xc5, 0x54, 0xb8, 0x94, 0xd8, 0xbc, 0x4f, 0x92, 0x49, 0x9c, 0xad, 0x7d, 0x38, 0x6b, + 0x64, 0x41, 0xab, 0x8e, 0x20, 0x3a, 0x06, 0xda, 0xf7, 0x09, 0x28, 0xb7, 0x4f, 0xf2, 0xda, 0x85, 0x78, 0x50, 0xe4, 0xa0, 0x5b, 0xf5, 0x02, 0x33, 0x74, 0x72, 0x8a, 0x28, 0xc8, 0xbe, 0xb4, 0xe4, + 0x06, 0x58, 0x47, 0xaa, 0x0d, 0x8b, 0x2c, 0xb6, 0x45, 0xef, 0x23, 0x37, 0xec, 0xf6, 0xe4, 0x43, 0x06, 0x85, 0xeb, 0xca, 0x2b, 0x48, 0xd2, 0x20, 0xf9, 0xa4, 0xb9, 0x5e, 0xa1, 0x21, 0x3c, 0x96, + 0xfb, 0x52, 0x2f, 0x6a, 0xcd, 0x18, 0x2d, 0xe7, 0x43, 0x0a, 0x43, 0xa9, 0x99, 0xd8, 0x47, 0x64, 0x21, 0x63, 0x97, 0xe2, 0xd9, 0xcd, 0x8d, 0xd9, 0x15, 0xaf, 0x4b, 0x00, 0x59, 0xcc, 0xf9, 0xfb, + 0xd6, 0xa9, 0x1e, 0x22, 0x41, 0x4d, 0x1f, 0x52, 0x4f, 0xcc, 0xd6, 0xbd, 0x38, 0x1f, 0xf0, 0xe8, 0xf2, 0xc8, 0xdc, 0x0d, 0xbd, 0x29, 0x8c, 0x40, 0x9c, 0x4e, 0x66, 0xfc, 0x39, 0xe3, 0xd6, 0xe5, + 0x86, 0x78, 0x9a, 0x32, 0x34, 0x01, 0xb2, 0x98, 0xd1, 0x09, 0x98, 0x81, 0x6b, 0xcc, 0xa3, 0x38, 0x1c, 0xcd, 0x63, 0xe2, 0x46, 0x07, 0x40, 0x32, 0x11, 0xd2, 0xf5, 0x19, 0xd8, 0x03, 0x4a, 0xea, + 0x4c, 0x56, 0x1f, 0x15, 0x3f, 0x6c, 0x35, 0x23, 0x68, 0xd6, 0x5d, 0xca, 0x54, 0x3c, 0x08, 0x9c, 0x6a, 0x31, 0x40, 0x99, 0x09, 0xcd, 0xdf, 0xf7, 0x0b, 0x7f, 0xd9, 0x0b, 0x78, 0x96, 0xfd, 0x2f, + 0xee, 0x07, 0xff, 0x64, 0x4f, 0x60, 0xab, 0x4f, 0x7b, 0x42, 0xf1, 0x07, 0x73, 0x43, 0x82, 0xb2, 0x6d, 0xea, 0x64, 0x3a, 0x11, 0x18, 0xd7, 0xa1, 0xc5, 0xac, 0x43, 0x8c, 0xf0, 0x51, 0xd3, 0x0f, + 0xa6, 0x28, 0xa6, 0xb2, 0xa9, 0x8d, 0xe7, 0xa7, 0xd4, 0xe1, 0x62, 0x99, 0xf2, 0x27, 0xd5, 0x47, 0xe0, 0x7f, 0x6a, 0x3f, 0xa0, 0xbf, 0x98, 0x85, 0xfd, 0xe5, 0x7e, 0xf0, 0xa9, 0xe6, 0xfc, 0xba, + 0x1f, 0xc8, 0x7f, 0xec, 0x07, 0x82, 0x09, 0x69, 0xff, 0x54, 0x89, 0xa3, 0xd8, 0xb5, 0x8b, 0x46, 0x7e, 0xa4, 0x78, 0x14, 0xbb, 0xe6, 0xf0, 0x98, 0x56, 0x6b, 0xb0, 0xe1, 0xb8, 0x9f, 0x95, 0x38, + 0x7e, 0x9e, 0xe2, 0xa7, 0x19, 0x02, 0xff, 0x53, 0x53, 0xfc, 0x34, 0x43, 0xe0, 0x7f, 0x6a, 0x8a, 0x9f, 0x66, 0x08, 0x7c, 0x9d, 0x62, 0xfa, 0xd9, 0xca, 0x2c, 0xf9, 0xf2, 0x7f, 0x4b, 0x66, 0x98, + 0xc2, 0x9d, 0x0b, 0xd3, 0xa4, 0xe5, 0x42, 0xaf, 0x68, 0xda, 0xe4, 0x2c, 0x74, 0xd9, 0xd2, 0xa4, 0x63, 0x85, 0xe0, 0x75, 0x4f, 0x33, 0xdb, 0x12, 0xde, 0xf6, 0x1c, 0x8c, 0x3d, 0xfc, 0x6c, 0x65, + 0x95, 0x59, 0x70, 0x86, 0x96, 0xc0, 0x17, 0x80, 0x99, 0x43, 0xf3, 0x64, 0x20, 0x86, 0x31, 0x30, 0x0a, 0x1a, 0x20, 0xa5, 0xdd, 0xaf, 0x22, 0xcd, 0x1c, 0x02, 0x44, 0xb3, 0xc7, 0x63, 0x73, 0xb9, + 0x80, 0x5f, 0x90, 0xea, 0x08, 0x6a, 0x61, 0x82, 0x94, 0x24, 0xb7, 0x1e, 0x14, 0x5b, 0x9a, 0xef, 0x27, 0x21, 0x4b, 0x22, 0x76, 0x8b, 0x59, 0x72, 0x63, 0xbd, 0x36, 0x1e, 0xbd, 0x45, 0xd5, 0xf0, + 0xbe, 0x02, 0xf6, 0x0b, 0x51, 0x40, 0x7f, 0x58, 0xee, 0x77, 0xd5, 0x61, 0xd6, 0xee, 0xc3, 0xc7, 0xf6, 0x47, 0xde, 0x03, 0x9c, 0x44, 0x49, 0x68, 0x33, 0x1d, 0xd9, 0x87, 0xe8, 0x64, 0xba, 0x79, + 0xde, 0x6a, 0x96, 0x9c, 0xe2, 0xbd, 0x93, 0x39, 0xff, 0x2a, 0x58, 0xfe, 0xf4, 0xa1, 0xee, 0xfa, 0x40, 0x73, 0x4c, 0x4b, 0xd7, 0x3c, 0x7d, 0xdf, 0xf5, 0x38, 0x9b, 0x4e, 0x34, 0xa3, 0xc7, 0xf3, + 0x8d, 0xd5, 0xf9, 0xed, 0xee, 0x89, 0x80, 0x40, 0x37, 0x0f, 0x70, 0xe2, 0xba, 0xdc, 0xac, 0x45, 0x71, 0xc8, 0x28, 0xf1, 0x51, 0x5e, 0x9b, 0x1d, 0x3f, 0x02, 0xfa, 0x4c, 0xaf, 0xb1, 0xcb, 0x2f, + 0x78, 0x7f, 0x6a, 0x86, 0x08, 0x0a, 0x9c, 0x34, 0xd1, 0x35, 0xed, 0x52, 0x8a, 0x46, 0xda, 0x51, 0x72, 0x65, 0x23, 0x23, 0x5a, 0x77, 0xbd, 0xce, 0x2d, 0x23, 0x76, 0xe6, 0x74, 0x13, 0xb9, 0x8c, + 0x06, 0xdc, 0xdb, 0x3d, 0x95, 0x0d, 0x1a, 0xee, 0xea, 0xd8, 0x3a, 0x76, 0x11, 0xc7, 0xdf, 0x57, 0x4a, 0xde, 0xc8, 0x54, 0xe5, 0x06, 0xdf, 0xa3, 0x3a, 0xdb, 0x48, 0x83, 0xdf, 0x2f, 0xf8, 0x4f, + 0xab, 0xbc, 0xe8, 0x23, 0xe0, 0x9f, 0x2e, 0x5e, 0x6e, 0xfa, 0x54, 0x56, 0x8f, 0xec, 0x1f, 0x2d, 0x50, 0xcf, 0x7b, 0x82, 0xed, 0xfc, 0xf3, 0x74, 0xeb, 0xdb, 0x2f, 0x5b, 0xa0, 0x38, 0xf3, 0xa7, + 0x16, 0xa8, 0xd0, 0xd6, 0x2c, 0x79, 0x07, 0xf8, 0xaf, 0xce, 0x1c, 0x74, 0xcb, 0x47, 0x62, 0xfb, 0xce, 0x7c, 0x0a, 0x8a, 0x5e, 0xda, 0xc1, 0x3b, 0x1f, 0xac, 0x15, 0x86, 0xd6, 0x34, 0xf6, 0x6b, + 0x52, 0x82, 0xe0, 0xe5, 0x17, 0x5c, 0x12, 0xfd, 0xa2, 0x77, 0x00, 0x6b, 0x8e, 0xb6, 0xeb, 0xde, 0x67, 0x5c, 0x12, 0x05, 0x7e, 0x1a, 0xdc, 0xf5, 0x9f, 0x80, 0x49, 0xab, 0x95, 0xbf, 0xf7, 0xdb, + 0xd3, 0x58, 0xd7, 0x1a, 0x22, 0x1f, 0xc6, 0x63, 0xd4, 0x1a, 0x93, 0x8b, 0xb7, 0xbe, 0xd4, 0x4d, 0x3c, 0xbd, 0xef, 0xf2, 0x57, 0xd6, 0x6e, 0x1f, 0x77, 0xff, 0xa6, 0x22, 0xe6, 0xe4, 0xe8, 0x29, + 0x29, 0xf0, 0x3b, 0xba, 0x74, 0xc9, 0xed, 0x8a, 0xf2, 0xbe, 0xbc, 0xd5, 0xfb, 0x04, 0xbc, 0x0c, 0xbe, 0xbb, 0x5b, 0x82, 0x14, 0x64, 0x62, 0x95, 0x33, 0x21, 0x66, 0xb2, 0x52, 0x13, 0x28, 0x78, + 0x74, 0x8a, 0xcf, 0xf2, 0x50, 0x45, 0xbf, 0xd9, 0xc8, 0x20, 0xf6, 0x9b, 0x1a, 0xb3, 0xdf, 0x15, 0x45, 0xa1, 0x95, 0x5e, 0x81, 0x16, 0x73, 0x6f, 0xe5, 0x6b, 0xbf, 0x2f, 0x59, 0x1c, 0x2c, 0xf8, + 0x65, 0xa9, 0x09, 0x5d, 0xb4, 0xc3, 0x75, 0x4a, 0x80, 0x78, 0xf4, 0x67, 0x61, 0x26, 0x4f, 0x43, 0xa1, 0x43, 0xe8, 0x90, 0xc0, 0x72, 0x76, 0x4e, 0xc8, 0xc3, 0x32, 0x69, 0x8c, 0xf5, 0x42, 0xbc, + 0x0c, 0xe3, 0x12, 0x9d, 0xf7, 0xf6, 0x28, 0xa0, 0x47, 0xe7, 0xf1, 0x3d, 0xd2, 0x76, 0xcb, 0x31, 0x9f, 0xb2, 0xe5, 0x57, 0xb5, 0x31, 0xe2, 0xa7, 0xec, 0xb9, 0x47, 0xbc, 0x5f, 0x4c, 0xbe, 0x78, + 0xf0, 0x6d, 0x04, 0x86, 0x62, 0x0a, 0xd8, 0xf4, 0x5e, 0xbf, 0xf0, 0x63, 0x43, 0xf9, 0xba, 0x2e, 0xcd, 0xc5, 0xf3, 0xa7, 0x88, 0xe8, 0x89, 0x43, 0xc6, 0xf6, 0xee, 0xa4, 0x6e, 0xe6, 0x89, 0xb6, + 0x18, 0xb4, 0x95, 0x07, 0xf6, 0x72, 0x95, 0xf8, 0x2a, 0xb0, 0xaa, 0x86, 0x10, 0x13, 0x46, 0xa1, 0x53, 0x54, 0x35, 0x55, 0x15, 0xa7, 0x5b, 0x5d, 0x93, 0x2e, 0x1f, 0x34, 0x05, 0xc0, 0xf5, 0x89, + 0xfb, 0x76, 0x10, 0x97, 0x95, 0x73, 0x54, 0xb1, 0xee, 0xde, 0xd2, 0xd1, 0xf4, 0x5d, 0x24, 0xa7, 0x07, 0xeb, 0xad, 0x8f, 0x1a, 0x0b, 0x82, 0x23, 0x69, 0x9f, 0x17, 0xce, 0xcb, 0x4c, 0x8c, 0x28, + 0x4b, 0xd1, 0xce, 0x85, 0xf7, 0x78, 0x1b, 0x69, 0xad, 0x3e, 0x0d, 0x4d, 0x68, 0x75, 0xf0, 0xf5, 0x5c, 0x2c, 0xb1, 0xa8, 0x19, 0xab, 0x7b, 0xe4, 0x80, 0x3c, 0xd7, 0xc7, 0x3e, 0xc0, 0x23, 0xfa, + 0x1c, 0x08, 0x9f, 0x8e, 0xf3, 0x6f, 0x15, 0x71, 0xbc, 0xef, 0x45, 0xdc, 0xfc, 0xa3, 0x66, 0x7b, 0x71, 0x45, 0x41, 0xd3, 0xe9, 0x4c, 0xe0, 0xcd, 0x5a, 0xe1, 0x56, 0x48, 0xa7, 0xfb, 0xf6, 0x04, + 0xaa, 0x1d, 0x70, 0x94, 0xe1, 0xf7, 0x90, 0xfe, 0x72, 0x6c, 0x26, 0x40, 0xbb, 0x8f, 0xd1, 0xdf, 0x6e, 0xfe, 0xf3, 0xbd, 0x62, 0x69, 0x3c, 0x4c, 0xe4, 0xeb, 0x47, 0x0c, 0xfc, 0xfc, 0x15, 0xff, + 0xdb, 0x8f, 0xb8, 0x28, 0x1a, 0xfa, 0xf6, 0xbe, 0x6a, 0xda, 0xbc, 0x29, 0x80, 0xfd, 0x24, 0x7f, 0xed, 0xdc, 0xc1, 0xf0, 0x22, 0xeb, 0xb3, 0xa2, 0x4d, 0x8b, 0x22, 0xc8, 0x7f, 0xfa, 0xb6, 0x3e, + 0xf3, 0xb9, 0x68, 0xe6, 0x37, 0x02, 0x65, 0x40, 0x69, 0x6a, 0x59, 0xd3, 0x4b, 0x88, 0x39, 0xdd, 0xca, 0x01, 0x11, 0x33, 0xe2, 0xf6, 0xa4, 0xb9, 0xdb, 0xa3, 0x85, 0xf5, 0xc9, 0xc3, 0xdf, 0x11, + 0x18, 0x71, 0x01, 0x95, 0x77, 0x58, 0xee, 0xc8, 0xf3, 0x06, 0x99, 0x64, 0x19, 0x7b, 0x44, 0xeb, 0x76, 0x4f, 0x83, 0xdf, 0xea, 0xed, 0xf1, 0x1e, 0x37, 0xe2, 0xca, 0x41, 0x7e, 0x57, 0xa5, 0xf3, + 0x5a, 0x40, 0x40, 0xee, 0xb6, 0x28, 0xb0, 0xf1, 0x1b, 0x2c, 0xc9, 0x14, 0xea, 0x70, 0xa5, 0xd4, 0x1c, 0xb4, 0x18, 0xec, 0x4f, 0x18, 0xbf, 0xac, 0xe2, 0x62, 0xee, 0x9d, 0xd0, 0x27, 0x79, 0x12, + 0xe1, 0x1c, 0xdb, 0x6a, 0x83, 0x63, 0x54, 0x04, 0x92, 0x10, 0x61, 0xe0, 0x38, 0xed, 0xaa, 0xbe, 0xd3, 0xc6, 0xdb, 0xeb, 0xbb, 0x3b, 0xa3, 0x5b, 0x53, 0xc3, 0x4d, 0xbb, 0x02, 0x4f, 0xc6, 0x86, + 0x8f, 0x91, 0x84, 0xa5, 0x96, 0x33, 0xf7, 0x80, 0x9a, 0x12, 0xde, 0x64, 0x83, 0x65, 0x5d, 0x25, 0xbf, 0x64, 0x46, 0x62, 0x7c, 0x11, 0x82, 0x31, 0x31, 0x94, 0x2c, 0x52, 0x6f, 0xd7, 0x65, 0x8a, + 0xd5, 0xa2, 0x51, 0x77, 0x89, 0xa5, 0x07, 0x1c, 0x84, 0x7e, 0xc4, 0x05, 0x2b, 0xce, 0x65, 0x39, 0x8c, 0xc2, 0x8e, 0x8e, 0xae, 0x71, 0x00, 0xc0, 0x45, 0x23, 0xb7, 0xc8, 0xb3, 0xdd, 0x6d, 0x62, + 0x7f, 0x43, 0x66, 0xb7, 0xb3, 0x31, 0x3d, 0xc3, 0xee, 0xde, 0xd7, 0x9b, 0xa7, 0x57, 0x43, 0xc8, 0x3c, 0xad, 0x44, 0xda, 0x6e, 0x4f, 0x55, 0xcd, 0x6f, 0xd0, 0x13, 0x91, 0x4c, 0x46, 0xf2, 0x78, + 0xdb, 0xb8, 0xdb, 0x1a, 0x5d, 0x4e, 0x91, 0x39, 0xa8, 0x39, 0xe4, 0x81, 0x2a, 0x63, 0x3c, 0x6e, 0xe6, 0x0e, 0xf8, 0xa7, 0x44, 0xf2, 0x21, 0x0f, 0x6d, 0x8d, 0xb4, 0x65, 0x38, 0xf2, 0x4a, 0x73, + 0xf0, 0xd5, 0x26, 0xac, 0xef, 0xb3, 0xb7, 0x69, 0x85, 0xe2, 0xd7, 0x0a, 0x3a, 0xa1, 0xfa, 0x37, 0x14, 0xab, 0xec, 0xf9, 0x90, 0xff, 0x9b, 0xf6, 0x7e, 0x7f, 0x17, 0x73, 0x85, 0xe5, 0x53, 0xcc, + 0xc5, 0xff, 0x90, 0x2e, 0x13, 0x92, 0x8a, 0x0a, 0xdd, 0x34, 0x99, 0xef, 0xd5, 0x8b, 0x16, 0xee, 0x0d, 0xf3, 0x7e, 0x90, 0xfd, 0xaf, 0xa1, 0xcc, 0xec, 0x67, 0x28, 0xd3, 0xf5, 0x2e, 0xbe, 0xd6, + 0xd8, 0x2f, 0xf6, 0xa2, 0xc5, 0x1e, 0x99, 0x48, 0x09, 0xc7, 0x5d, 0x3a, 0xa4, 0x08, 0x5f, 0x78, 0xa2, 0xb7, 0x84, 0xfe, 0xa7, 0x44, 0x9e, 0xe1, 0xe2, 0x13, 0x5b, 0x64, 0xfe, 0x80, 0x42, 0x16, + 0x3b, 0x1e, 0x35, 0x3d, 0x7c, 0x7c, 0xce, 0x8b, 0x26, 0xfb, 0x9e, 0x69, 0x43, 0x4d, 0x01, 0x7c, 0xed, 0x84, 0xff, 0xbd, 0x0c, 0xcc, 0x97, 0x9a, 0x98, 0xe3, 0x4f, 0xad, 0xa6, 0xf7, 0xcf, 0xb0, + 0x66, 0x9d, 0x7e, 0xa6, 0x5c, 0x7d, 0x3f, 0x06, 0x7c, 0x1a, 0xd4, 0x04, 0xec, 0x27, 0xca, 0x95, 0xf5, 0xd2, 0x6c, 0x6d, 0x97, 0xcd, 0x2f, 0x8b, 0x8c, 0x19, 0xb9, 0x48, 0xf2, 0xd6, 0x10, 0x29, + 0xd1, 0xc0, 0x66, 0xdc, 0xd0, 0x3f, 0xda, 0x00, 0xa1, 0xde, 0x32, 0xaf, 0x6f, 0x6a, 0xb5, 0x17, 0x8e, 0x64, 0x35, 0x6a, 0xcd, 0x4f, 0x80, 0xc6, 0x7e, 0x49, 0x78, 0xf6, 0xbd, 0x0c, 0x3d, 0x46, + 0xb5, 0xed, 0x7f, 0x68, 0x14, 0xf8, 0x6f, 0x7a, 0x58, 0x31, 0xdb, 0x7d, 0xde, 0x07, 0x34, 0xae, 0x38, 0x1d, 0x0e, 0x49, 0xe4, 0x2d, 0xa1, 0x10, 0xe1, 0x74, 0x48, 0x0a, 0x9d, 0xa4, 0x4b, 0x22, + 0x3a, 0x74, 0xee, 0x7c, 0x19, 0xd5, 0xf9, 0x54, 0x0a, 0xb4, 0x64, 0x9f, 0x61, 0xcc, 0xba, 0xfa, 0x02, 0xc8, 0x21, 0x3e, 0x9d, 0xba, 0xcb, 0x51, 0x3e, 0x33, 0xd6, 0xe4, 0xb5, 0xcb, 0xab, 0x99, + 0xe3, 0xb7, 0x74, 0x92, 0x6b, 0x11, 0x55, 0x99, 0xd7, 0x89, 0x3d, 0x31, 0x3a, 0x6a, 0x9e, 0xb7, 0x12, 0x79, 0x89, 0x6f, 0x6b, 0x66, 0x46, 0xe8, 0x78, 0xcb, 0x3d, 0x5d, 0x56, 0xb5, 0x74, 0xb6, + 0xa8, 0xad, 0xb0, 0x96, 0xdc, 0x49, 0xca, 0xfd, 0x81, 0x58, 0x8f, 0x0a, 0x68, 0x9d, 0x2b, 0x22, 0xfc, 0xec, 0xc6, 0x3e, 0x98, 0x06, 0xa3, 0x42, 0xf6, 0x0d, 0xbd, 0xb6, 0xf6, 0xe6, 0x20, 0x54, + 0x9a, 0xc1, 0x76, 0xe9, 0xb2, 0xbe, 0x84, 0x04, 0x3e, 0xff, 0x2e, 0x36, 0x0d, 0x7d, 0x71, 0xe1, 0xe0, 0x68, 0xf0, 0xd3, 0x0a, 0xf2, 0x96, 0x80, 0xd3, 0x14, 0x5b, 0xf0, 0xe1, 0xa2, 0x76, 0x56, + 0xbc, 0x4a, 0x58, 0x6f, 0xb9, 0x6a, 0x03, 0x26, 0xe3, 0xc0, 0xdc, 0x17, 0xfb, 0x78, 0x31, 0x2c, 0xe7, 0xda, 0x12, 0xca, 0x3b, 0x10, 0x54, 0xb6, 0xf7, 0xd6, 0xd6, 0x90, 0x57, 0x11, 0xc8, 0xb0, + 0xc3, 0xf4, 0x4b, 0x98, 0x87, 0xf3, 0x61, 0xfa, 0xe5, 0xbd, 0x49, 0x1c, 0x78, 0xd6, 0x4a, 0x05, 0x37, 0x4d, 0xf6, 0xdd, 0x34, 0xc6, 0x7d, 0x02, 0x2d, 0x46, 0x17, 0x35, 0x0e, 0x7c, 0x3d, 0xf5, + 0xfa, 0x05, 0xc0, 0xc8, 0xbc, 0x1a, 0x57, 0x5d, 0x3f, 0x28, 0xfb, 0xc5, 0xcd, 0x4d, 0x8c, 0xef, 0xa9, 0x92, 0x5f, 0xc9, 0x04, 0xbe, 0x52, 0xec, 0x82, 0x9d, 0xb7, 0x0f, 0x45, 0xe9, 0x80, 0xd1, + 0x46, 0xe3, 0x3e, 0x19, 0xb8, 0x7d, 0xe7, 0x82, 0x3a, 0xe5, 0xe3, 0x00, 0x35, 0x16, 0xc4, 0x84, 0x1b, 0x2a, 0x63, 0x4b, 0x1d, 0x2e, 0xfa, 0x0d, 0x0c, 0x21, 0x0f, 0x32, 0x00, 0xdf, 0x9c, 0xe6, + 0x28, 0xcf, 0xe9, 0xa5, 0xb0, 0x84, 0xac, 0x35, 0xe9, 0x79, 0xc6, 0x1d, 0x6a, 0x7e, 0xf5, 0x58, 0x5e, 0x90, 0xc3, 0x25, 0xd9, 0x53, 0x8e, 0x95, 0x6e, 0xe7, 0x08, 0x63, 0x97, 0xef, 0xa9, 0x99, + 0x88, 0x2d, 0x63, 0x33, 0x5e, 0x12, 0xf4, 0x38, 0x2d, 0x3e, 0x05, 0x52, 0x98, 0x92, 0x34, 0x03, 0xed, 0xdb, 0xea, 0xfa, 0x12, 0x0c, 0x02, 0xbc, 0x63, 0x1c, 0xe6, 0x96, 0x56, 0x31, 0x53, 0xfb, + 0xd7, 0xde, 0x0e, 0xcf, 0x9e, 0x5a, 0xa8, 0x92, 0x78, 0x06, 0x13, 0xd2, 0x06, 0xd4, 0xa2, 0x8c, 0x07, 0x59, 0x99, 0x0d, 0x9f, 0xc5, 0x78, 0xf7, 0x78, 0xbe, 0x73, 0xfc, 0x09, 0x31, 0x44, 0x16, + 0xb3, 0x2d, 0x1d, 0xaa, 0x76, 0xef, 0x40, 0xb2, 0x10, 0xb9, 0x26, 0x6d, 0x23, 0x97, 0xd6, 0x47, 0x03, 0xd0, 0x9a, 0xc8, 0x95, 0x8d, 0xf3, 0x9d, 0x39, 0x18, 0x8c, 0xf7, 0x6f, 0x65, 0x4d, 0x66, + 0x04, 0x77, 0xba, 0x51, 0xca, 0xce, 0xad, 0xa4, 0x94, 0x4c, 0x97, 0x92, 0x65, 0x09, 0x56, 0x1e, 0xd3, 0x0d, 0x8f, 0x05, 0x19, 0xa5, 0xb4, 0x7b, 0x21, 0xc6, 0x02, 0x3e, 0x83, 0x32, 0x09, 0xb3, + 0x7d, 0x18, 0x2e, 0x6b, 0xb6, 0x8b, 0x03, 0x2b, 0x8f, 0xf3, 0xbc, 0x01, 0xdb, 0x46, 0x95, 0x91, 0x9a, 0xf6, 0xe2, 0xfd, 0x8d, 0x39, 0x01, 0x6a, 0x84, 0xe0, 0xab, 0xd9, 0x03, 0x02, 0x95, 0x91, + 0xb8, 0xea, 0x43, 0x06, 0xd6, 0x95, 0x6a, 0xd4, 0xab, 0xf5, 0xd1, 0x8d, 0x36, 0xde, 0x67, 0x97, 0x56, 0xcd, 0x12, 0xa6, 0x04, 0x6d, 0xe2, 0xcf, 0xc1, 0x56, 0x33, 0xd4, 0x3b, 0xb3, 0xed, 0xde, + 0xed, 0x6a, 0xae, 0xe4, 0x5e, 0x15, 0x10, 0x0e, 0x70, 0xcd, 0x55, 0x9e, 0x0e, 0x5b, 0xdd, 0x89, 0xf7, 0x0d, 0x3a, 0x9e, 0x8f, 0xd4, 0xe3, 0xbe, 0xf6, 0xb0, 0xea, 0x93, 0x26, 0x16, 0x3f, 0x42, + 0xc2, 0x0c, 0xa6, 0x51, 0xf7, 0xb0, 0x27, 0x57, 0xd1, 0x56, 0x8a, 0x56, 0xd8, 0x05, 0x17, 0x57, 0xfb, 0xe4, 0x66, 0x36, 0x53, 0x05, 0xfc, 0x4a, 0x66, 0xc1, 0x30, 0x03, 0x3e, 0x3c, 0x07, 0x89, + 0xa6, 0xcd, 0x43, 0x63, 0xc9, 0x5d, 0x35, 0x3f, 0x6b, 0xae, 0x28, 0x9f, 0x32, 0x7f, 0xae, 0xd0, 0x58, 0xb1, 0x70, 0x69, 0x8d, 0x4e, 0x44, 0xc6, 0x4f, 0x26, 0x7a, 0xa7, 0x69, 0x86, 0xb1, 0x84, + 0x45, 0x53, 0x25, 0x80, 0x6d, 0x43, 0xf2, 0xde, 0xbe, 0x31, 0x4e, 0x79, 0xe1, 0xa2, 0xf0, 0x64, 0xc6, 0xf2, 0x0a, 0xf8, 0xbf, 0xf2, 0x7a, 0x2a, 0x78, 0x9a, 0x8d, 0x0d, 0xce, 0x85, 0x1b, 0xe6, + 0x39, 0x7a, 0xca, 0x9a, 0x8b, 0xcc, 0xba, 0xb5, 0x88, 0xcc, 0x1a, 0xb0, 0x82, 0x30, 0x10, 0x00, 0x8b, 0x53, 0xa8, 0x0b, 0xf8, 0x42, 0x0b, 0xcf, 0xb0, 0xbf, 0x3d, 0xba, 0xc5, 0x36, 0x25, 0x4b, + 0x1c, 0xa6, 0x63, 0xf2, 0x8d, 0x8c, 0x51, 0x07, 0x8b, 0x6a, 0x03, 0xf1, 0xd0, 0xa6, 0x57, 0xdf, 0xc5, 0xfd, 0x3e, 0x4c, 0x21, 0x11, 0xb4, 0xcf, 0x3d, 0x1c, 0xbd, 0xfe, 0xc9, 0x55, 0x5d, 0x28, + 0x83, 0x67, 0xc7, 0x78, 0xa8, 0x29, 0x9e, 0xe3, 0x35, 0x01, 0x0f, 0xa3, 0xc0, 0xc2, 0x33, 0x98, 0xc9, 0xd4, 0x87, 0x9f, 0x88, 0xef, 0x80, 0x5c, 0x98, 0xd6, 0x03, 0xa2, 0x9b, 0x2c, 0x2b, 0x89, + 0xd9, 0xbc, 0x29, 0x24, 0x4d, 0xbd, 0xb9, 0xe6, 0xa9, 0xbc, 0xde, 0x83, 0x2b, 0x59, 0x5e, 0x4f, 0x1f, 0x61, 0xee, 0x0d, 0x94, 0x19, 0x9a, 0xad, 0x5b, 0xd4, 0x85, 0x75, 0xee, 0x9e, 0x66, 0xf5, + 0xde, 0xb6, 0xa7, 0x1e, 0x70, 0xcc, 0x8b, 0xfd, 0x0e, 0x73, 0xe8, 0x85, 0x19, 0xc2, 0xda, 0x4b, 0x0c, 0xe2, 0x9f, 0x0c, 0xff, 0x0a, 0x1e, 0xec, 0xcc, 0xde, 0x8a, 0x31, 0x47, 0x89, 0x1a, 0x25, + 0xc0, 0x75, 0x7f, 0x4f, 0x76, 0xe5, 0x1a, 0x70, 0x9c, 0x42, 0x2d, 0xbf, 0xce, 0x0b, 0x4b, 0xb1, 0x8c, 0xaf, 0xa5, 0xb0, 0x0c, 0xb5, 0xef, 0x28, 0x9e, 0x75, 0x2d, 0xad, 0x3b, 0xfe, 0x09, 0xe8, + 0xaf, 0x35, 0x9e, 0xeb, 0x76, 0x64, 0x11, 0xa5, 0x30, 0x59, 0x1a, 0xa9, 0x89, 0xdb, 0x5d, 0x5f, 0xb1, 0x37, 0xcb, 0x0f, 0xe9, 0xaa, 0x82, 0xf1, 0xeb, 0x59, 0x4f, 0xa3, 0xb5, 0x16, 0x09, 0x11, + 0x07, 0xa0, 0x78, 0x2f, 0xb4, 0xdd, 0xca, 0xa3, 0xc7, 0xd0, 0x97, 0x20, 0x1a, 0xee, 0x21, 0x9b, 0xdc, 0x63, 0xb4, 0x8e, 0x6a, 0x7f, 0x0b, 0x28, 0x70, 0x06, 0x44, 0xbd, 0x23, 0xf0, 0xb5, 0x7d, + 0x10, 0x2d, 0xfb, 0xe0, 0x10, 0xd1, 0x91, 0x56, 0xf9, 0x2d, 0x66, 0xf2, 0xde, 0x72, 0xbe, 0xfd, 0x32, 0x09, 0x84, 0x21, 0xc8, 0xb0, 0x90, 0x29, 0xa9, 0x11, 0x04, 0x55, 0x6d, 0xd0, 0xb4, 0xcc, + 0x54, 0x9b, 0x6d, 0xe5, 0x87, 0x80, 0xcf, 0xa4, 0x38, 0x33, 0x26, 0xbd, 0xba, 0xcc, 0x80, 0x68, 0xa8, 0xec, 0x1e, 0x3c, 0x70, 0x28, 0x6f, 0xab, 0xb3, 0x78, 0x23, 0xc1, 0x77, 0xb1, 0x86, 0xcd, + 0x75, 0x3c, 0xcb, 0xcc, 0xe2, 0x3a, 0xc9, 0xab, 0x20, 0x74, 0x0b, 0x3c, 0xbe, 0x35, 0x78, 0xcd, 0x3e, 0xcf, 0x64, 0xc7, 0x1f, 0x82, 0x2e, 0x4a, 0x2a, 0x77, 0xaf, 0x62, 0xbb, 0xd1, 0xed, 0x5b, + 0x6d, 0x12, 0x79, 0x5c, 0x8f, 0x8f, 0xf4, 0x40, 0xa6, 0xa4, 0xd8, 0x41, 0xc6, 0x3a, 0x80, 0x42, 0x0b, 0x32, 0xbd, 0x29, 0x21, 0xb9, 0x11, 0x92, 0x12, 0x53, 0x07, 0x51, 0x12, 0x55, 0x33, 0x68, + 0x79, 0x1c, 0xc5, 0x03, 0x9f, 0xa8, 0xb0, 0xda, 0x7a, 0x8e, 0x23, 0x72, 0x71, 0x16, 0x88, 0x5c, 0xe2, 0x08, 0x57, 0xf3, 0x80, 0xb0, 0xc4, 0x68, 0x67, 0xa8, 0xd7, 0x98, 0x3b, 0x81, 0xa6, 0x58, + 0x83, 0xd6, 0x5a, 0xfa, 0x92, 0xee, 0x46, 0x7d, 0x02, 0xcb, 0x93, 0xb0, 0xa5, 0x32, 0x78, 0x88, 0xdb, 0x15, 0x92, 0xb7, 0xa2, 0x7f, 0x2f, 0x1d, 0x28, 0xc5, 0xd6, 0x12, 0x2a, 0xcc, 0x8d, 0x32, + 0x1c, 0xde, 0xa7, 0x12, 0x74, 0x6e, 0x64, 0x03, 0x8d, 0xcc, 0x28, 0x46, 0x4f, 0xd9, 0xd3, 0x5c, 0x3f, 0x5e, 0x05, 0x22, 0x62, 0xef, 0x98, 0x31, 0x93, 0xfa, 0xc8, 0x9d, 0x8a, 0x81, 0x56, 0xbd, + 0xd3, 0x19, 0x1c, 0xc0, 0xb0, 0xbc, 0x1c, 0x62, 0xe8, 0x59, 0x34, 0xbd, 0xe9, 0xdf, 0x90, 0xe3, 0x32, 0x41, 0xae, 0xd4, 0x4d, 0x50, 0x96, 0x5f, 0xa8, 0x5d, 0x43, 0x73, 0xff, 0x84, 0x26, 0xb6, + 0x68, 0x75, 0x62, 0x90, 0x30, 0x3e, 0xfc, 0xbd, 0x82, 0x5d, 0x92, 0xcd, 0x6f, 0x5b, 0x16, 0xf5, 0xff, 0x58, 0x86, 0xe1, 0xfc, 0x97, 0x4e, 0x36, 0x8d, 0x4f, 0xe9, 0x40, 0xf5, 0xad, 0x04, 0x13, + 0x65, 0x3a, 0x10, 0x84, 0x9e, 0x66, 0x7f, 0x5d, 0x7e, 0x2d, 0x3f, 0xed, 0xa9, 0xca, 0x53, 0xb3, 0x3e, 0x44, 0xf6, 0x81, 0x0f, 0x06, 0x4a, 0xf9, 0x99, 0x10, 0xe7, 0x42, 0xad, 0xe4, 0xd4, 0xdf, + 0xe9, 0xb5, 0x1f, 0x9a, 0xf9, 0x99, 0xb6, 0x2c, 0xe8, 0x8a, 0x05, 0x61, 0x85, 0xdb, 0x50, 0x4f, 0xef, 0x07, 0x12, 0xf5, 0xa7, 0x52, 0xcc, 0x3c, 0x3e, 0x5b, 0x8c, 0x72, 0x56, 0x04, 0x7c, 0xb0, + 0xa8, 0x7f, 0x1c, 0xfc, 0xdd, 0xd3, 0x7f, 0xf7, 0x70, 0xe0, 0xaf, 0x9f, 0xfe, 0x2f, 0x58, 0x77, 0x6a, 0x72, 0xad, 0xaf, 0xbb, 0x0c, 0x28, 0xee, 0x64, 0xbc, 0xd3, 0x15, 0x7a, 0x30, 0xeb, 0xe4, + 0xe1, 0xdc, 0x00, 0xd9, 0xaa, 0x13, 0xaa, 0xb3, 0xd3, 0x80, 0xb5, 0x3b, 0xcb, 0x61, 0x69, 0x8a, 0x63, 0xe1, 0x21, 0xa5, 0x5b, 0xf2, 0x08, 0x19, 0xb5, 0x26, 0xcb, 0xe4, 0xb7, 0xbc, 0xc3, 0x87, + 0x69, 0x6e, 0x21, 0xa9, 0x86, 0x66, 0xee, 0x21, 0xdd, 0x36, 0xf0, 0xdc, 0x88, 0x2c, 0x97, 0x24, 0x60, 0xce, 0x69, 0xd3, 0x3d, 0x6d, 0xb3, 0x42, 0x62, 0x65, 0x92, 0xab, 0x79, 0x86, 0xa7, 0x9a, + 0x36, 0x3a, 0x70, 0x6d, 0xe2, 0xd5, 0x47, 0xf5, 0xbb, 0xca, 0x64, 0x6c, 0xe1, 0xe1, 0x95, 0xfa, 0xe0, 0xd9, 0x30, 0x36, 0xa8, 0xc3, 0x5e, 0xe8, 0x7c, 0x71, 0x48, 0xfa, 0xd2, 0x5f, 0x5c, 0x86, + 0x56, 0xe0, 0x82, 0xa7, 0x56, 0x1a, 0x60, 0x97, 0xe3, 0x23, 0xc0, 0xb2, 0x48, 0x66, 0x2f, 0x0b, 0x8f, 0x69, 0xb5, 0x4f, 0xda, 0xdb, 0xd3, 0x1a, 0x06, 0xc3, 0x43, 0x15, 0xdf, 0x08, 0x56, 0x94, + 0x04, 0x4e, 0xcb, 0xc5, 0xc0, 0x5d, 0xda, 0x43, 0xe7, 0xf0, 0x91, 0x65, 0xe7, 0xd6, 0x1d, 0xec, 0x0c, 0x8e, 0x61, 0xa2, 0x31, 0x0d, 0xfa, 0x0e, 0xd6, 0xd0, 0x11, 0x77, 0x50, 0x3c, 0x99, 0xb9, + 0xbf, 0xb3, 0x92, 0xc3, 0x01, 0x90, 0x5c, 0x5c, 0xef, 0xfe, 0x7a, 0xa5, 0xfa, 0x2d, 0x29, 0x75, 0x81, 0xe3, 0x7a, 0x17, 0x1f, 0x6c, 0x8f, 0x7e, 0x18, 0x23, 0x76, 0xee, 0xd8, 0xa2, 0xd6, 0x5d, + 0x5a, 0xcb, 0xef, 0x55, 0x28, 0xf7, 0x4d, 0x19, 0x64, 0x13, 0x5b, 0xf5, 0xb6, 0xa5, 0x07, 0x7e, 0x17, 0xee, 0xe8, 0xcb, 0xdb, 0x30, 0xde, 0x50, 0xcd, 0xb5, 0x1f, 0x55, 0x90, 0xc2, 0x50, 0x80, + 0xa6, 0xe9, 0xc8, 0x3f, 0xeb, 0x1a, 0x1a, 0x8f, 0xeb, 0x59, 0x3f, 0xa4, 0xee, 0x21, 0x29, 0xae, 0x7d, 0x7b, 0xa1, 0xd3, 0x7e, 0x2d, 0xd0, 0xd7, 0xee, 0x46, 0x9d, 0xd5, 0x78, 0xfa, 0xaf, 0xca, + 0xb1, 0x6f, 0x18, 0x0a, 0xf0, 0xad, 0xe5, 0x31, 0x09, 0x7e, 0xf2, 0x3e, 0x67, 0xb5, 0x8e, 0x5a, 0x5a, 0x3b, 0x7e, 0x1e, 0xb9, 0x1c, 0xfb, 0x4b, 0xf3, 0x90, 0x58, 0x8a, 0x99, 0x07, 0xbd, 0x6f, + 0xfe, 0xea, 0x98, 0x10, 0xa0, 0x4d, 0x1a, 0x84, 0xca, 0x53, 0x51, 0xeb, 0x17, 0x09, 0x4a, 0xaf, 0x14, 0xef, 0xa9, 0xb6, 0x7a, 0x5a, 0xa7, 0xa3, 0x35, 0x0b, 0x7c, 0x29, 0x06, 0x49, 0x41, 0x61, + 0xe6, 0x66, 0x54, 0x5d, 0xbf, 0xe3, 0x66, 0xa7, 0x4c, 0xdb, 0x36, 0x9d, 0xe8, 0x30, 0xc5, 0x64, 0x25, 0x15, 0x88, 0x10, 0x4b, 0x0c, 0x62, 0xf9, 0x33, 0x4b, 0x02, 0xad, 0x37, 0x49, 0xc0, 0x16, + 0xb1, 0x67, 0x0f, 0x6d, 0x2e, 0x75, 0xdc, 0x9d, 0x06, 0x0b, 0x1b, 0x4f, 0x49, 0xeb, 0xa4, 0xe5, 0x3c, 0x2f, 0xb9, 0x11, 0xb2, 0xa2, 0xb1, 0xc3, 0xb8, 0x71, 0x32, 0xae, 0x1b, 0x42, 0xeb, 0x21, + 0x83, 0xc4, 0xe0, 0x71, 0x02, 0x95, 0x12, 0x49, 0x6e, 0x6a, 0xbc, 0x87, 0x18, 0x56, 0x1c, 0xa0, 0xd0, 0x44, 0x85, 0xd9, 0xcb, 0x2d, 0x11, 0x42, 0xc0, 0x81, 0x70, 0xbc, 0x4f, 0x1e, 0xaf, 0x7a, + 0x56, 0xe0, 0x9b, 0xb5, 0xb0, 0x6c, 0xfa, 0x0e, 0x63, 0xf4, 0xe1, 0x44, 0x79, 0x72, 0x98, 0x69, 0x24, 0x1b, 0x2a, 0x28, 0x2d, 0x33, 0xe4, 0x67, 0x79, 0x37, 0xe1, 0x2a, 0x21, 0x2b, 0x29, 0x5c, + 0x2a, 0xa7, 0x96, 0xbc, 0x1d, 0x5e, 0x62, 0xb8, 0x08, 0x12, 0x47, 0x96, 0x1a, 0x24, 0xeb, 0x70, 0xe5, 0xf6, 0x0d, 0x6c, 0x8c, 0x53, 0x73, 0x58, 0xb4, 0x92, 0xd1, 0x02, 0x1e, 0x04, 0xad, 0x5c, + 0x0f, 0x5d, 0x86, 0x32, 0x2e, 0x0e, 0x8d, 0xcc, 0x7e, 0x27, 0xe0, 0x96, 0x34, 0xfa, 0x5e, 0xdd, 0x7a, 0xae, 0xe4, 0x76, 0x67, 0xea, 0x09, 0xbb, 0x83, 0x53, 0xa7, 0xb9, 0x8d, 0xfb, 0x3e, 0xf2, + 0x86, 0x96, 0x77, 0x71, 0x08, 0xa3, 0x63, 0x5b, 0x97, 0xd9, 0xeb, 0xae, 0x5f, 0x80, 0x33, 0x14, 0x5e, 0x48, 0x11, 0x59, 0x5a, 0x32, 0x95, 0xac, 0xe2, 0x5e, 0x14, 0x7a, 0x1c, 0xcd, 0xb5, 0x3a, + 0xb5, 0x12, 0xbb, 0xdf, 0xe0, 0x8a, 0x25, 0x58, 0xc1, 0x0b, 0x7a, 0x70, 0xbf, 0x8b, 0x5b, 0x7a, 0xf6, 0x56, 0x87, 0xa4, 0xf9, 0x0f, 0x3d, 0x47, 0xfd, 0xf9, 0x9f, 0xff, 0xdf, 0x87, 0x60, 0x9b, + 0x38, 0xb4, 0xe9, 0xff, 0xff, 0x3f, 0xc2, 0xff, 0xf3, 0x7f, 0xbc, 0xa3, 0xfe, 0x7f, 0xfd, 0xdf, 0xcb, 0xff, 0xfa, 0xbf, 0xde, 0xdb, 0xff, 0xfa, 0x3f, 0xfb, 0x7f, 0x50, 0xf3, 0x7c, 0xf9, 0xfd, + 0x5d, 0xac, 0xe3, 0x85, 0x4f, 0x0b, 0x7e, 0xfb, 0xc6, 0x79, 0x16, 0x6d, 0x97, 0x5f, 0x70, 0x9a, 0xfe, 0x93, 0x6f, 0x30, 0xbb, 0xbb, 0xb4, 0x26, 0x8b, 0xfd, 0x4f, 0x87, 0x6a, 0xb2, 0xe7, 0x7c, + 0x80, 0x3b, 0x1f, 0x6a, 0x98, 0xfb, 0x2e, 0x9b, 0xbd, 0xd7, 0x04, 0x2f, 0xa6, 0x4d, 0x50, 0xf3, 0xfb, 0x8e, 0x76, 0x8d, 0xe3, 0xf1, 0x36, 0xe5, 0x8f, 0x2d, 0x40, 0x96, 0xc2, 0x46, 0x42, 0x48, + 0xad, 0x79, 0x54, 0xe3, 0xdc, 0xaf, 0x75, 0xc4, 0xea, 0x89, 0xc2, 0xba, 0xdf, 0xc7, 0x6b, 0x27, 0x60, 0x08, 0x48, 0x17, 0xa3, 0x8c, 0xfb, 0x76, 0x8e, 0x7c, 0xa1, 0xd9, 0xef, 0xfa, 0x2c, 0xb3, + 0xe5, 0x2f, 0x7c, 0x3d, 0xfe, 0x70, 0xb4, 0x7c, 0x38, 0x3c, 0xac, 0x71, 0xda, 0x57, 0x88, 0x69, 0x71, 0x3a, 0x0f, 0x72, 0x44, 0xaa, 0x8e, 0x4e, 0x86, 0x01, 0x92, 0x4e, 0x58, 0x33, 0x9b, 0x1e, + 0xbe, 0x4a, 0x6b, 0x7e, 0x30, 0xeb, 0x9a, 0xc2, 0x5a, 0x7c, 0x2b, 0xfd, 0xee, 0xa9, 0x1f, 0x0f, 0xfd, 0x86, 0x27, 0x1f, 0xda, 0x67, 0x19, 0x0b, 0x77, 0x37, 0x38, 0xf9, 0xf8, 0x68, 0x1b, 0x29, + 0x3e, 0xd5, 0x51, 0x34, 0xf2, 0x6d, 0xb0, 0x66, 0x99, 0xf1, 0xa7, 0x46, 0x7e, 0x5b, 0x70, 0xbf, 0x03, 0x27, 0x12, 0x8d, 0xe5, 0x15, 0x38, 0x14, 0x85, 0x3d, 0x7c, 0xe9, 0xd0, 0xf7, 0xf2, 0x16, + 0x1c, 0x7d, 0x18, 0x40, 0xf8, 0xb2, 0xb4, 0x18, 0xd1, 0x67, 0x99, 0x7f, 0x77, 0x29, 0x8b, 0x1d, 0xfa, 0x45, 0xc3, 0x5f, 0xcb, 0x40, 0xb5, 0xb5, 0xca, 0x78, 0x31, 0x88, 0x84, 0x34, 0xde, 0xa9, + 0x14, 0x73, 0x83, 0x8f, 0xe3, 0x11, 0xd2, 0x96, 0xa1, 0x66, 0x5c, 0xd1, 0xf9, 0x69, 0x36, 0x3f, 0x62, 0xc6, 0x40, 0x5c, 0x7d, 0xe7, 0x38, 0x7b, 0x36, 0x87, 0xee, 0xd0, 0xd7, 0x57, 0x88, 0x44, + 0xfd, 0xee, 0x8f, 0x6f, 0xbe, 0x94, 0x4f, 0xd3, 0x2c, 0x1e, 0x5f, 0xd5, 0xe8, 0xf8, 0x74, 0x8b, 0x45, 0x73, 0x94, 0xf9, 0x58, 0x68, 0x5e, 0x1f, 0x0f, 0x05, 0xbe, 0x7f, 0xea, 0xbf, 0x39, 0x98, + 0x3c, 0x58, 0x2b, 0x4b, 0xee, 0xb8, 0x1a, 0x5b, 0x0e, 0x37, 0xe4, 0x4e, 0xdd, 0xe2, 0xcc, 0x0a, 0x40, 0x35, 0x23, 0x48, 0xf5, 0xb5, 0x86, 0x54, 0xdb, 0x60, 0xcc, 0xf4, 0xc8, 0xc9, 0x61, 0x3f, + 0x87, 0x67, 0x2d, 0x6b, 0x52, 0x4d, 0x71, 0xb3, 0xd3, 0x0a, 0x64, 0x94, 0x0b, 0xef, 0xf7, 0x76, 0x31, 0xcf, 0x92, 0xcd, 0x91, 0xfe, 0xa0, 0x94, 0x4d, 0x8b, 0x42, 0x76, 0xe4, 0x4e, 0xee, 0xe6, + 0xdd, 0x4c, 0xcc, 0x44, 0x03, 0x58, 0x54, 0xb3, 0xc9, 0xdb, 0x81, 0x9b, 0x34, 0x06, 0x57, 0x40, 0xc4, 0xf7, 0x44, 0x17, 0x63, 0xd9, 0xda, 0x5f, 0xe9, 0x7c, 0xd1, 0x21, 0x5d, 0xdf, 0x78, 0x6c, + 0x9f, 0x5e, 0xf7, 0x52, 0x41, 0x9e, 0xfd, 0xdd, 0x37, 0xc9, 0x41, 0xad, 0x15, 0x0d, 0x79, 0x82, 0xc2, 0xc8, 0xdd, 0x16, 0xb5, 0xa6, 0x60, 0xa2, 0xa6, 0x77, 0xc5, 0xe2, 0xd8, 0x7b, 0xec, 0xf9, + 0x51, 0x94, 0x79, 0x6f, 0xba, 0x01, 0x24, 0x94, 0xc1, 0x67, 0x6a, 0xc1, 0x3d, 0x1a, 0x6e, 0xd3, 0xb4, 0xf1, 0xcc, 0xd0, 0x64, 0x66, 0xf8, 0xbe, 0x50, 0x03, 0x7a, 0xdc, 0x08, 0xb8, 0xb9, 0x55, + 0x6c, 0x04, 0xc3, 0xd7, 0x7c, 0x9b, 0x82, 0x9c, 0x15, 0xed, 0xba, 0x42, 0x43, 0x6f, 0xb6, 0xb0, 0xfb, 0x43, 0xa4, 0xd7, 0xf2, 0x7c, 0x0d, 0xd3, 0x44, 0xe6, 0x47, 0x67, 0x89, 0xb2, 0x9a, 0xee, + 0x40, 0x7e, 0x5d, 0x99, 0xad, 0xaf, 0xbe, 0x7b, 0x4f, 0xf0, 0x14, 0x34, 0x23, 0x6c, 0x49, 0xfc, 0x52, 0x8a, 0x5e, 0xfe, 0x09, 0xde, 0x45, 0xcb, 0x17, 0x40, 0xb1, 0x13, 0xa8, 0xb0, 0xeb, 0xa7, + 0x5c, 0x86, 0x46, 0xa2, 0x43, 0xc6, 0xe2, 0x49, 0xc6, 0x58, 0x40, 0x79, 0xd2, 0x81, 0x30, 0xca, 0x7b, 0x06, 0x5d, 0x26, 0xa5, 0x39, 0x47, 0x52, 0xc7, 0x16, 0x06, 0xfa, 0xcc, 0x97, 0x69, 0x62, + 0xd4, 0x41, 0xfa, 0x69, 0x9b, 0x7d, 0x4c, 0x8b, 0xbb, 0xcc, 0xd1, 0x8f, 0x4a, 0x1d, 0x20, 0x77, 0x37, 0x2f, 0xda, 0x66, 0xbe, 0xd3, 0x1d, 0x62, 0x39, 0x5a, 0xfc, 0xb4, 0x37, 0xd0, 0x05, 0xcf, + 0xff, 0x4a, 0xa7, 0x08, 0x60, 0xea, 0x1f, 0xb1, 0xbb, 0xeb, 0x39, 0xf6, 0xcd, 0x8d, 0x45, 0x56, 0x9d, 0x6d, 0x77, 0xe6, 0x7e, 0xb9, 0x37, 0x44, 0x73, 0x29, 0x90, 0x83, 0xf1, 0x3f, 0xd9, 0x81, + 0xa9, 0xdf, 0x1a, 0xf5, 0x1e, 0xef, 0xdb, 0xbd, 0xdc, 0x7d, 0x60, 0x0a, 0x77, 0xd2, 0x35, 0xd9, 0x62, 0x67, 0x78, 0x99, 0x89, 0xb2, 0x10, 0xef, 0x48, 0xa6, 0x12, 0xac, 0x32, 0xde, 0x44, 0x5c, + 0x7c, 0xc0, 0x8f, 0x39, 0x27, 0x18, 0x93, 0x35, 0x5c, 0xf5, 0xf6, 0x86, 0x73, 0x96, 0x1c, 0x6c, 0x44, 0x6e, 0x8a, 0x40, 0x56, 0x29, 0x5f, 0x3a, 0x24, 0x91, 0xc0, 0x02, 0xa7, 0x9e, 0x8b, 0x7c, + 0xac, 0x06, 0xe7, 0x1d, 0x01, 0xc1, 0xdb, 0x70, 0xc3, 0xc4, 0x29, 0xf1, 0x0e, 0x61, 0x41, 0x96, 0x6c, 0x13, 0x55, 0x2e, 0x95, 0x45, 0x38, 0x5d, 0x0b, 0xd4, 0x54, 0xcd, 0xe0, 0x1b, 0x4d, 0x8f, + 0xea, 0xfb, 0xfc, 0xa4, 0x1e, 0x69, 0x3b, 0x66, 0x6b, 0x00, 0xe5, 0x8b, 0xb0, 0x34, 0x21, 0x2c, 0xd8, 0xfa, 0x14, 0x63, 0x5e, 0xad, 0xc9, 0xdc, 0x0e, 0x87, 0x58, 0xfe, 0xb0, 0x2e, 0x16, 0x88, + 0x55, 0xc6, 0xf4, 0x3d, 0xc4, 0xf4, 0xaf, 0x75, 0xe0, 0x1c, 0xee, 0xb9, 0xa1, 0xf0, 0xed, 0xda, 0xc4, 0xb4, 0xb8, 0xa3, 0x8a, 0xd5, 0x61, 0xc5, 0xb8, 0xb5, 0xa5, 0x1b, 0x0f, 0xa5, 0x8a, 0xae, + 0xe0, 0x68, 0x79, 0xf5, 0x90, 0xda, 0x5e, 0x79, 0x13, 0xb3, 0x35, 0x37, 0x14, 0xf2, 0x42, 0x84, 0x55, 0xad, 0xe3, 0x6d, 0xf6, 0xf1, 0x47, 0xde, 0x47, 0x80, 0xbe, 0xbb, 0xb4, 0x1d, 0x9a, 0x5c, + 0xc9, 0x3b, 0xfd, 0x06, 0x69, 0xc7, 0x85, 0xfa, 0xaa, 0x92, 0x4a, 0xd0, 0xd8, 0x39, 0x70, 0xb3, 0x45, 0x33, 0x93, 0x2d, 0x14, 0x11, 0xb9, 0xaa, 0xde, 0xa9, 0xd1, 0x45, 0x87, 0xb9, 0x3e, 0xac, + 0xc8, 0xab, 0x16, 0xb1, 0xc7, 0xf6, 0xce, 0xa8, 0x5e, 0xca, 0x2d, 0x36, 0xca, 0x0e, 0x23, 0xd0, 0x9b, 0xd8, 0x5c, 0x81, 0x34, 0xf4, 0x69, 0xd7, 0x1f, 0x55, 0xed, 0x11, 0xed, 0xc1, 0x24, 0x3a, + 0x64, 0xb8, 0x05, 0xd7, 0x62, 0xd5, 0xa9, 0x43, 0x85, 0xd6, 0xfd, 0x9f, 0x74, 0xea, 0x7d, 0xe6, 0x4e, 0x59, 0xc3, 0xf0, 0x66, 0x69, 0x18, 0xfe, 0xaf, 0x28, 0x32, 0x73, 0xf1, 0xa7, 0x48, 0xdf, + 0xfa, 0x7f, 0x67, 0x13, 0x1e, 0xfc, 0xc2, 0xf6, 0xe3, 0x9b, 0x8a, 0x03, 0x5b, 0x6a, 0x15, 0x60, 0x77, 0xc2, 0x1e, 0xf8, 0xd8, 0xaf, 0x4e, 0xad, 0xbe, 0x0b, 0x40, 0xdf, 0xf4, 0x30, 0x13, 0x8d, + 0x19, 0xbe, 0x76, 0x43, 0x38, 0x5f, 0xbb, 0xe8, 0xbe, 0xd0, 0x9a, 0x6c, 0x20, 0x46, 0x28, 0xc8, 0x84, 0x3e, 0x6b, 0x03, 0x7d, 0x4e, 0x7b, 0x8d, 0xcf, 0x2a, 0xcc, 0xc5, 0xae, 0x73, 0x2e, 0xa2, + 0x73, 0xe9, 0x97, 0xe6, 0x8e, 0x1f, 0xc7, 0x34, 0xa1, 0xf8, 0xe9, 0xc8, 0x63, 0x34, 0xbf, 0x97, 0xca, 0x78, 0xf0, 0xa7, 0xf2, 0x08, 0x5e, 0x4c, 0x19, 0xff, 0x4a, 0x44, 0xf9, 0xbb, 0x6d, 0xe3, + 0x9b, 0x86, 0xb4, 0xb5, 0xef, 0xe2, 0x37, 0x91, 0x23, 0xfd, 0x73, 0x97, 0x34, 0x90, 0x74, 0xde, 0x17, 0x76, 0xd5, 0x37, 0x97, 0x92, 0xe3, 0xdf, 0x84, 0xc2, 0xdb, 0x2b, 0x9b, 0x46, 0xeb, 0x34, + 0x19, 0x67, 0x53, 0x01, 0x47, 0x59, 0xae, 0x0a, 0x1e, 0x5c, 0x2b, 0x72, 0xfa, 0x86, 0x89, 0x2d, 0x14, 0xce, 0x6d, 0xd9, 0x62, 0x1b, 0xe1, 0x86, 0xe6, 0xb3, 0x1e, 0xe4, 0x23, 0xe8, 0xc4, 0xf9, + 0x33, 0x5f, 0xd0, 0x7b, 0xc1, 0x21, 0xa3, 0x15, 0xdc, 0x3c, 0xf8, 0xcc, 0xe5, 0xfd, 0xf6, 0xda, 0x85, 0x3e, 0x65, 0x7c, 0x1f, 0xdb, 0x65, 0xb2, 0xa4, 0xd6, 0xf5, 0xdc, 0x45, 0x03, 0xd8, 0x37, + 0xbd, 0x3b, 0x06, 0x4f, 0xa0, 0x68, 0x55, 0x34, 0x66, 0xaf, 0x5a, 0xa6, 0x1b, 0xd1, 0xab, 0x60, 0x83, 0xbf, 0x6d, 0x5a, 0x53, 0xea, 0x8b, 0x8b, 0x23, 0xa7, 0x26, 0x7a, 0x17, 0xe1, 0xe2, 0x73, + 0x79, 0x9e, 0x8f, 0xb3, 0x3a, 0x4b, 0xc1, 0x31, 0x3c, 0x2d, 0x9d, 0x69, 0xf1, 0xa6, 0xae, 0xc1, 0xd8, 0x89, 0xc1, 0x05, 0xde, 0xd0, 0x50, 0x9b, 0x80, 0x82, 0x28, 0x91, 0xd5, 0xd2, 0xf2, 0x37, + 0x89, 0x1b, 0xe6, 0xe0, 0x3f, 0xe5, 0x35, 0x59, 0xc5, 0xed, 0xe1, 0xb1, 0xb1, 0x2c, 0xbc, 0x5d, 0xcb, 0x48, 0x09, 0xbe, 0xd8, 0xa2, 0xfe, 0x74, 0x8a, 0x91, 0x72, 0x1f, 0x28, 0xcc, 0x98, 0xb0, + 0xe0, 0x40, 0xe1, 0x71, 0xb3, 0x0b, 0xd0, 0xbd, 0x2d, 0x3c, 0xc2, 0xa2, 0xaf, 0xd0, 0x82, 0x1f, 0xe2, 0x6d, 0x7e, 0x02, 0xc6, 0x9d, 0x3e, 0xba, 0xda, 0x5b, 0x4f, 0x79, 0x11, 0xa1, 0x9d, 0xb5, + 0xc8, 0xd1, 0x94, 0x43, 0xf7, 0x3c, 0x74, 0x3a, 0xa0, 0xb3, 0xa1, 0xaf, 0x48, 0x2d, 0xe1, 0xfc, 0xe4, 0xe6, 0xc1, 0x6b, 0xd5, 0x6b, 0xf3, 0xb3, 0xeb, 0x78, 0x56, 0x3c, 0x12, 0xa8, 0xe7, 0x87, + 0x4d, 0xcb, 0x48, 0x02, 0xe5, 0x9d, 0xa3, 0x0a, 0xe8, 0xa4, 0x7e, 0x56, 0x6f, 0x1a, 0x88, 0x47, 0x9b, 0x66, 0x7d, 0x04, 0x59, 0x10, 0x0a, 0x8d, 0x2f, 0x57, 0x76, 0x9f, 0x0b, 0x5b, 0x92, 0x2e, + 0x58, 0x99, 0x5f, 0x7a, 0x34, 0x20, 0x79, 0x37, 0xb9, 0x9f, 0xa8, 0xbf, 0xb7, 0x52, 0x77, 0xee, 0x8f, 0xb6, 0x7c, 0x9b, 0x04, 0xb4, 0x09, 0x75, 0x37, 0xb1, 0x20, 0x9b, 0x87, 0x2f, 0xe0, 0x4d, + 0x61, 0xff, 0xca, 0xc5, 0xfb, 0x2f, 0x65, 0x2e, 0x1f, 0x6c, 0x09, 0x18, 0x4c, 0xd8, 0xa9, 0x53, 0xea, 0x4b, 0xa7, 0x98, 0x30, 0xdb, 0x90, 0xde, 0xe3, 0xa6, 0x3a, 0x9c, 0xa2, 0x43, 0x78, 0xfc, + 0x79, 0x7f, 0xe8, 0xb7, 0x2c, 0xc5, 0x45, 0x39, 0x12, 0xa5, 0x14, 0x23, 0x25, 0x56, 0x99, 0xce, 0x51, 0xf3, 0x37, 0xee, 0x7a, 0x04, 0x2c, 0x7a, 0x74, 0x8f, 0x38, 0x8a, 0x73, 0xdb, 0xb3, 0x6d, + 0xd7, 0x98, 0x1d, 0x16, 0x9b, 0x81, 0xb8, 0x1f, 0xf7, 0xf9, 0x08, 0x0c, 0x6c, 0x57, 0x16, 0x10, 0x52, 0x3b, 0x51, 0x81, 0x05, 0x44, 0x78, 0xc9, 0x04, 0xb7, 0xa5, 0x38, 0x28, 0x41, 0x6a, 0xb1, + 0x24, 0xba, 0x70, 0x2c, 0x3e, 0x3f, 0xdf, 0x6b, 0xb9, 0x34, 0x5f, 0xb8, 0x9b, 0x6c, 0x20, 0x32, 0xcb, 0xb3, 0xd7, 0x2e, 0x98, 0x4f, 0xf4, 0x05, 0x88, 0xcd, 0x99, 0x47, 0x88, 0xd8, 0x68, 0x02, + 0x46, 0x89, 0x50, 0x5c, 0x7c, 0xdc, 0x3d, 0x81, 0x56, 0x57, 0xf7, 0xb1, 0x79, 0x11, 0x1d, 0x14, 0x11, 0xdc, 0x76, 0x19, 0x08, 0xe2, 0xca, 0x79, 0x3b, 0x64, 0x7f, 0x36, 0x63, 0xc5, 0x8d, 0xa9, + 0xbd, 0xbd, 0x32, 0x18, 0xc3, 0x06, 0x4c, 0xab, 0xcd, 0x56, 0x41, 0x7d, 0xfd, 0xee, 0x77, 0x9d, 0x4f, 0x57, 0xe2, 0xb0, 0x79, 0x4a, 0x48, 0xbc, 0x20, 0x18, 0x38, 0xc9, 0xd2, 0x3e, 0x7b, 0x90, + 0xb9, 0xbd, 0xdb, 0x19, 0xba, 0x25, 0xd6, 0xdd, 0x7e, 0xe5, 0xa0, 0x91, 0xe3, 0xe3, 0x73, 0x3c, 0x5b, 0xcc, 0x72, 0xb8, 0xe8, 0x65, 0x6a, 0x65, 0x69, 0xa5, 0x6d, 0xe3, 0xc6, 0xf4, 0x6d, 0xbe, + 0x0b, 0x20, 0x5d, 0x4b, 0x1e, 0x57, 0x90, 0x86, 0xd0, 0x3d, 0x29, 0xad, 0xaf, 0x20, 0x1d, 0x97, 0x32, 0xae, 0x81, 0x08, 0x18, 0x68, 0x8b, 0x4c, 0x7d, 0x30, 0x46, 0x5c, 0x33, 0x9d, 0x6e, 0xda, + 0xa9, 0x62, 0x1a, 0xf7, 0x0c, 0xaf, 0x74, 0xde, 0x48, 0xcf, 0x52, 0x7e, 0x47, 0x04, 0x7d, 0x93, 0x7f, 0x1b, 0x06, 0xb5, 0x2a, 0x99, 0x87, 0x25, 0x4b, 0xfe, 0x93, 0xfd, 0x6f, 0xf6, 0x55, 0x15, + 0xfd, 0xf0, 0x87, 0x49, 0x36, 0x04, 0x51, 0xff, 0xdd, 0x36, 0x3a, 0xb6, 0xfe, 0x94, 0x06, 0x7f, 0x27, 0x3c, 0xa1, 0x29, 0xa0, 0xb9, 0x5b, 0x86, 0x75, 0x91, 0xe1, 0x5f, 0xa4, 0xc2, 0xec, 0xaf, + 0x52, 0x61, 0xe0, 0xeb, 0x41, 0xe7, 0x9f, 0x52, 0xe1, 0x9a, 0x76, 0xbf, 0xa5, 0xc2, 0x2e, 0x3c, 0x06, 0xa8, 0xb2, 0x25, 0x88, 0x57, 0x7f, 0x3d, 0x01, 0xf8, 0xae, 0x23, 0x4e, 0x93, 0x9a, 0x8f, + 0xeb, 0xc0, 0xe7, 0x1b, 0x44, 0xf7, 0xed, 0xa2, 0xe3, 0x18, 0x22, 0xf8, 0xf6, 0x93, 0xc1, 0xf6, 0x6e, 0x38, 0x7c, 0xae, 0x31, 0x3f, 0xbc, 0x9d, 0x42, 0x5b, 0x81, 0x19, 0xf9, 0x78, 0x17, 0x43, + 0x4c, 0xab, 0xbe, 0x74, 0xe2, 0x53, 0x08, 0x8b, 0x4f, 0x7c, 0x00, 0xd2, 0x3f, 0x22, 0x2c, 0xa2, 0x39, 0xc1, 0xa1, 0x39, 0xda, 0xae, 0x39, 0xe5, 0x77, 0xed, 0x73, 0xf4, 0xb7, 0xb1, 0xbf, 0x9a, + 0xde, 0xd7, 0xd9, 0x01, 0xff, 0x13, 0xd3, 0xfb, 0x3a, 0x3b, 0xe0, 0x7f, 0x62, 0x7a, 0xe9, 0x17, 0xe0, 0x02, 0xf8, 0x47, 0xc8, 0x85, 0xd1, 0x63, 0xf5, 0x4d, 0xaf, 0xe7, 0x74, 0x12, 0x91, 0x47, + 0x5e, 0x98, 0xdb, 0xf6, 0x6c, 0x52, 0xa2, 0x53, 0xb6, 0x2a, 0x1c, 0x7d, 0x7d, 0x9f, 0xc3, 0x75, 0x3d, 0x6b, 0x9d, 0x06, 0x72, 0x1f, 0xf1, 0xe3, 0x89, 0x37, 0x2c, 0xe3, 0x5e, 0xf2, 0x38, 0xe2, + 0x9a, 0xed, 0x23, 0xda, 0x5e, 0xbe, 0x90, 0xb2, 0xe7, 0xc0, 0x95, 0x88, 0xf3, 0x2e, 0x2b, 0xb4, 0x66, 0xcf, 0xe1, 0xba, 0xbd, 0x93, 0x24, 0xee, 0xa3, 0xfb, 0xf3, 0x3e, 0xe4, 0xc3, 0xad, 0x51, + 0x0f, 0xe4, 0x9c, 0x24, 0x5f, 0x42, 0xd4, 0xac, 0xc4, 0x9d, 0xed, 0xd9, 0xb9, 0xa3, 0x08, 0x40, 0xb2, 0x16, 0xe6, 0x09, 0x5b, 0xf2, 0xe5, 0xe9, 0xc5, 0xee, 0x0c, 0x21, 0x5a, 0xd6, 0x3a, 0x8e, + 0xb6, 0x96, 0x4e, 0x4b, 0xa7, 0x2f, 0xcc, 0xcd, 0x65, 0xda, 0xee, 0x04, 0x4e, 0x32, 0xfd, 0x0c, 0x1b, 0x64, 0xa6, 0xf4, 0x1e, 0xe1, 0xe2, 0x94, 0xb7, 0xa2, 0x37, 0x31, 0x89, 0x48, 0x3a, 0x42, + 0x03, 0x73, 0x70, 0x17, 0xdc, 0x41, 0xa5, 0x1f, 0x34, 0x30, 0x1e, 0x3d, 0xdc, 0xbf, 0x0f, 0xcf, 0xdd, 0x8d, 0x57, 0xb6, 0xa7, 0xf2, 0x0d, 0xef, 0xef, 0x3a, 0x36, 0x34, 0x87, 0xd0, 0x6b, 0x2e, + 0xc3, 0xd4, 0xf5, 0x34, 0x8d, 0xe2, 0xcc, 0xf2, 0xe2, 0x10, 0xe3, 0xaf, 0xfb, 0x7a, 0xb8, 0x22, 0xd1, 0x40, 0xe6, 0xac, 0xc1, 0x2f, 0x01, 0x94, 0x88, 0x24, 0xce, 0x9f, 0x9e, 0x13, 0x57, 0x4a, + 0x7e, 0x9e, 0x5b, 0x07, 0xc0, 0xd2, 0x91, 0xce, 0xef, 0x98, 0x3d, 0x9a, 0xab, 0x65, 0x4c, 0x29, 0xbc, 0x7b, 0x39, 0xb9, 0xdb, 0x3a, 0x7e, 0x7b, 0xce, 0xb2, 0x22, 0x1b, 0x1e, 0x79, 0xf7, 0x26, + 0xd7, 0x94, 0xcc, 0x94, 0x8a, 0x47, 0x7e, 0x92, 0x70, 0x71, 0x78, 0xde, 0x8b, 0x72, 0xc5, 0x17, 0x25, 0x87, 0xd2, 0x22, 0xb8, 0x4c, 0xa8, 0x2b, 0x6e, 0xfb, 0x0a, 0x83, 0xb3, 0xcb, 0x02, 0x5f, + 0x89, 0x2c, 0x05, 0xc7, 0x80, 0x7f, 0x19, 0x5d, 0x7f, 0x79, 0x2a, 0xfb, 0x7d, 0xf7, 0x88, 0xa3, 0x72, 0x64, 0x9c, 0x03, 0x66, 0xf3, 0xd4, 0x9e, 0xc9, 0x0a, 0xdb, 0xac, 0x51, 0x8a, 0xfd, 0xd4, + 0x3d, 0xe6, 0x05, 0x8a, 0xb8, 0x9f, 0x55, 0x33, 0x3f, 0x6e, 0xfe, 0x8b, 0x7b, 0xe3, 0x8f, 0x54, 0x99, 0xe7, 0x01, 0x81, 0xa3, 0xed, 0xc2, 0x62, 0xc6, 0xb8, 0x0b, 0x37, 0x53, 0x74, 0xdf, 0xc9, + 0x97, 0xef, 0x4e, 0xed, 0x4a, 0xf8, 0x57, 0x8b, 0xfc, 0xa3, 0x6b, 0x9a, 0x53, 0x20, 0x13, 0xcf, 0xd4, 0xf7, 0x4b, 0x5b, 0xd0, 0x1d, 0x3c, 0x6f, 0x3b, 0x75, 0xdb, 0xa1, 0x01, 0x68, 0x43, 0x8d, + 0x3f, 0xd5, 0x5b, 0x74, 0xbd, 0x3a, 0xcc, 0xc4, 0xb9, 0x7d, 0x54, 0xef, 0x1b, 0xb9, 0x92, 0x65, 0xa7, 0x5e, 0x2e, 0x2c, 0x40, 0x22, 0xb5, 0xe2, 0xec, 0x9d, 0x63, 0x96, 0xe1, 0x31, 0x8d, 0xe7, + 0x26, 0x6e, 0xd5, 0x36, 0xdc, 0x58, 0x54, 0x9f, 0x9e, 0xeb, 0xb0, 0x9a, 0x12, 0x96, 0xcf, 0xad, 0x55, 0x66, 0xd9, 0xb2, 0xb2, 0x5c, 0xfe, 0x02, 0xe4, 0x9b, 0xa1, 0xf5, 0x77, 0x2c, 0x5d, 0x32, + 0xb1, 0x49, 0xd3, 0xb5, 0xc0, 0x5a, 0xd3, 0x5d, 0xe2, 0x21, 0x79, 0x44, 0x66, 0x40, 0x95, 0x0f, 0x62, 0x28, 0x4d, 0x17, 0xbb, 0x78, 0xf8, 0xe4, 0xb9, 0xdb, 0x1b, 0xa4, 0x85, 0xb4, 0xcd, 0x19, + 0x49, 0xe8, 0x4f, 0x50, 0xbd, 0x35, 0x77, 0xdb, 0xab, 0x5e, 0xb2, 0xb3, 0xe7, 0x3d, 0x96, 0x2f, 0xf7, 0x3b, 0x0e, 0xbc, 0x4f, 0xde, 0xba, 0x68, 0x8d, 0xf1, 0x7a, 0xb6, 0xe7, 0x15, 0x39, 0x13, + 0x2f, 0x9b, 0x91, 0x26, 0x24, 0x11, 0x17, 0x8d, 0x7f, 0x1a, 0x10, 0x1b, 0xa4, 0x41, 0xc6, 0x6c, 0x7a, 0x6e, 0x0c, 0xf9, 0xf9, 0xb8, 0x09, 0x42, 0x09, 0xba, 0xd4, 0xac, 0x4b, 0x92, 0x87, 0xd9, + 0x54, 0x44, 0xdc, 0x13, 0xe4, 0xd9, 0x21, 0x22, 0xa2, 0xec, 0xec, 0x05, 0x21, 0xc0, 0xe9, 0xaa, 0xa7, 0xf6, 0x4e, 0x89, 0x20, 0x8b, 0x6d, 0xe4, 0x42, 0x9f, 0xe7, 0xa3, 0x57, 0x3a, 0xea, 0x8a, + 0x7d, 0xde, 0x79, 0xc5, 0x57, 0xb5, 0xe5, 0x68, 0xed, 0x0c, 0x04, 0x14, 0xa5, 0xf1, 0x90, 0xec, 0x4e, 0x48, 0xd6, 0x07, 0xfe, 0x96, 0x34, 0x1d, 0xb6, 0x26, 0x0c, 0x66, 0xa2, 0x18, 0x79, 0x71, + 0x50, 0x79, 0x6f, 0xe3, 0xfd, 0x0c, 0xe4, 0x0a, 0x50, 0x5f, 0xa3, 0x3b, 0xa1, 0x1c, 0x97, 0xdb, 0x4a, 0x5b, 0xf4, 0xec, 0x6f, 0xdb, 0xa6, 0x3f, 0x98, 0x29, 0xdf, 0xd2, 0xde, 0x0f, 0xc1, 0x00, + 0xeb, 0x57, 0xae, 0xc7, 0xff, 0x28, 0xc2, 0x73, 0xaf, 0x8b, 0x65, 0xe9, 0xe6, 0x9b, 0xb4, 0xa6, 0xca, 0xd0, 0x9f, 0x7f, 0x8c, 0xec, 0x95, 0x0e, 0xfb, 0xf8, 0x13, 0xe2, 0xf9, 0xa9, 0xee, 0xd9, + 0x1d, 0xee, 0x3b, 0x56, 0xca, 0xa1, 0xbd, 0x2c, 0xe4, 0xd8, 0x80, 0xa0, 0x13, 0x96, 0xaf, 0xe9, 0xeb, 0x37, 0x23, 0x61, 0x16, 0x2a, 0xdc, 0x5a, 0x3b, 0xf8, 0x8b, 0xb6, 0xbe, 0x84, 0x41, 0x87, + 0x6d, 0xbe, 0xe8, 0x4d, 0x0a, 0x9f, 0x05, 0x7d, 0xbe, 0xbb, 0xa6, 0x7d, 0xbb, 0x06, 0x7c, 0xb9, 0xf8, 0x05, 0x73, 0x68, 0x76, 0xed, 0xe2, 0xb1, 0xaf, 0xd2, 0x99, 0x5f, 0xa8, 0x2a, 0x3f, 0x8e, + 0xd5, 0x8c, 0xa6, 0xd9, 0xf4, 0xfe, 0x45, 0x92, 0x53, 0xe5, 0x8f, 0xf4, 0x0b, 0xc3, 0xe4, 0x70, 0x80, 0x3f, 0xb2, 0xd5, 0x8f, 0x18, 0xaa, 0xda, 0x8c, 0xad, 0x5d, 0xbc, 0xa3, 0x31, 0xfc, 0xd7, + 0xec, 0xfd, 0xf1, 0x69, 0x0a, 0xdf, 0x66, 0x50, 0xff, 0x71, 0x8d, 0x3e, 0x7e, 0xbc, 0x06, 0xc4, 0xf5, 0xbf, 0x40, 0x82, 0xb5, 0xbd, 0x4d, 0x47, 0x06, 0x67, 0xfa, 0xa2, 0x12, 0xb6, 0x17, 0x5d, + 0xdc, 0x23, 0xfe, 0xac, 0xaa, 0xec, 0x66, 0x7a, 0x08, 0x9f, 0xf8, 0x6f, 0xa0, 0x92, 0x54, 0xd2, 0x2a, 0x14, 0xee, 0xb8, 0x3f, 0x1e, 0xbd, 0x69, 0xe5, 0x8a, 0xb6, 0xac, 0x36, 0x28, 0x14, 0x45, + 0x13, 0x97, 0xee, 0xb4, 0x68, 0x85, 0x9b, 0xee, 0xb1, 0x0e, 0x37, 0x50, 0xb6, 0xc1, 0xea, 0x43, 0x7b, 0x16, 0x35, 0xa4, 0x3d, 0x08, 0xe2, 0x05, 0xdf, 0x03, 0xb7, 0x2c, 0x19, 0x7c, 0xbd, 0x16, + 0xa7, 0x90, 0x32, 0x8d, 0x35, 0x04, 0x05, 0x80, 0xba, 0xb1, 0x52, 0x0f, 0x2a, 0x03, 0xc7, 0x70, 0x40, 0xb1, 0xa6, 0x6f, 0x9d, 0x2a, 0x67, 0xde, 0x09, 0x78, 0x26, 0x4b, 0xe7, 0x9b, 0xf0, 0x85, + 0xce, 0x9c, 0x4c, 0xd8, 0x81, 0x51, 0x1c, 0x2f, 0xf1, 0x0e, 0xaf, 0x2a, 0x54, 0x58, 0xc5, 0xd9, 0x74, 0xdd, 0xe3, 0x19, 0x8e, 0xc6, 0x2d, 0x56, 0x4f, 0xb6, 0xb2, 0xf0, 0x10, 0x79, 0x04, 0x5e, + 0x82, 0x02, 0xb3, 0x64, 0xba, 0xa8, 0xe4, 0x14, 0xc6, 0x8a, 0x9f, 0xea, 0x49, 0x24, 0x20, 0xc5, 0xde, 0xb7, 0x9b, 0x4b, 0xd1, 0x06, 0x2f, 0x6a, 0x60, 0xc5, 0x3e, 0x08, 0xdc, 0x19, 0xeb, 0xc1, + 0x4f, 0xb0, 0x2b, 0x35, 0x4d, 0xac, 0x30, 0x16, 0x16, 0x1a, 0x09, 0x69, 0x5c, 0x1a, 0xd0, 0x54, 0x6b, 0xa5, 0x20, 0xbc, 0x5c, 0x5d, 0x4d, 0xdb, 0x8e, 0xc4, 0xba, 0x05, 0x0c, 0x36, 0x2c, 0xd2, + 0xf8, 0x91, 0xa7, 0x37, 0xd0, 0x12, 0x0c, 0x70, 0x95, 0xf9, 0x9e, 0x9c, 0x5d, 0xda, 0xb3, 0x75, 0x9e, 0xd5, 0x7c, 0x3e, 0x7c, 0xcd, 0xd5, 0xeb, 0x4e, 0xc0, 0xe8, 0x1b, 0xb1, 0xa3, 0x6c, 0xa6, + 0xf2, 0xdd, 0x7a, 0x6e, 0x1d, 0xa2, 0xde, 0x39, 0xff, 0x2a, 0x3c, 0xb1, 0xf1, 0x27, 0xf3, 0x19, 0xc5, 0x6b, 0xc7, 0x35, 0xa8, 0x80, 0x00, 0x47, 0xd7, 0x09, 0x45, 0x99, 0xfc, 0x88, 0x04, 0xff, + 0x8b, 0x0c, 0xf6, 0x7b, 0x20, 0x18, 0x10, 0xe4, 0xdb, 0x6e, 0xa3, 0xe0, 0xa0, 0x36, 0x6e, 0x33, 0x37, 0xb0, 0x09, 0x76, 0x46, 0x54, 0x51, 0xf7, 0x0a, 0xb5, 0x56, 0xf2, 0xaf, 0x43, 0x1f, 0xa3, + 0x9a, 0xfa, 0x46, 0xbb, 0x8f, 0x19, 0x3c, 0xe9, 0x6b, 0xa3, 0xf0, 0xd0, 0xb5, 0xdc, 0xee, 0x0e, 0xb4, 0x05, 0xad, 0x98, 0xd1, 0x79, 0xf1, 0x58, 0x24, 0x3e, 0xe8, 0xe4, 0x3a, 0xbb, 0xad, 0x4b, + 0xd5, 0x8e, 0xa0, 0x59, 0x64, 0x1d, 0xe9, 0xd9, 0xa1, 0x72, 0xe9, 0xe0, 0xb0, 0xe9, 0x96, 0x20, 0xe9, 0xa3, 0x20, 0x53, 0x3e, 0x43, 0xeb, 0x62, 0x46, 0xf0, 0x25, 0xde, 0xb5, 0xb1, 0xae, 0x35, + 0xdc, 0x4a, 0x0c, 0x03, 0x57, 0xdb, 0x57, 0xfc, 0x98, 0x49, 0x80, 0x1f, 0xe3, 0xc5, 0x25, 0x83, 0x37, 0xce, 0x5a, 0xcb, 0x1a, 0x5a, 0x35, 0x48, 0x1d, 0x4e, 0x24, 0xa6, 0xfe, 0x73, 0x30, 0xb0, + 0xeb, 0x72, 0xcb, 0x9d, 0x6c, 0x87, 0xdb, 0x72, 0x8f, 0xf6, 0xd6, 0x98, 0x2e, 0x85, 0x7d, 0x10, 0x39, 0x93, 0x5a, 0xc3, 0xe9, 0xa1, 0xaf, 0x31, 0x78, 0x30, 0xc3, 0x26, 0xa5, 0x77, 0x9d, 0xe6, + 0x52, 0xa6, 0x06, 0x61, 0x1e, 0x88, 0xd3, 0xd4, 0x79, 0x28, 0x29, 0x48, 0x22, 0x09, 0x2f, 0x95, 0xaf, 0x57, 0x35, 0x46, 0x10, 0x44, 0xe1, 0x9a, 0x42, 0x58, 0x9a, 0x88, 0xea, 0x57, 0xba, 0x99, + 0xaf, 0x2e, 0x91, 0xf3, 0xac, 0xb8, 0xd7, 0xaa, 0x59, 0xbd, 0xd9, 0x72, 0x5f, 0x6e, 0xd7, 0x39, 0x7b, 0x26, 0xf6, 0x6c, 0x5e, 0x18, 0x42, 0x90, 0xfa, 0xcb, 0x8e, 0xef, 0xa5, 0x5a, 0xc1, 0x24, + 0x10, 0xc8, 0x1b, 0x67, 0x7a, 0xbc, 0x23, 0xe3, 0xa8, 0x41, 0x5d, 0xca, 0xdc, 0xd2, 0xe2, 0xd0, 0x65, 0xc9, 0xa2, 0x1d, 0x24, 0x61, 0x9c, 0x2f, 0xbb, 0x6c, 0x38, 0xc3, 0x38, 0x4f, 0x31, 0xd3, + 0xda, 0x52, 0x3d, 0x6c, 0xe2, 0xfe, 0x7e, 0x7b, 0x31, 0x05, 0xf2, 0xf7, 0xc2, 0x55, 0x9c, 0x18, 0x1a, 0x10, 0x49, 0x35, 0x20, 0x44, 0x31, 0x43, 0xeb, 0x3e, 0x03, 0xcd, 0x98, 0x71, 0x5a, 0xda, + 0x5d, 0xef, 0x64, 0x94, 0x7c, 0x8e, 0xca, 0x7f, 0x17, 0xfa, 0xe8, 0xf5, 0x3d, 0xcc, 0x55, 0x1a, 0xa5, 0xff, 0x49, 0xb3, 0x3f, 0xba, 0x5e, 0x92, 0x6a, 0xe8, 0xff, 0x23, 0x54, 0x73, 0x17, 0x8d, + 0xf3, 0x90, 0x67, 0x4b, 0x35, 0xf4, 0x51, 0xfb, 0x1f, 0x56, 0x16, 0xfe, 0x43, 0x13, 0x08, 0x81, 0x62, 0x10, 0x41, 0xfe, 0x63, 0x58, 0xf8, 0x4f, 0xbf, 0xbf, 0x0b, 0x9f, 0xa2, 0xf0, 0x69, 0xb9, + 0xdf, 0xce, 0x6f, 0x72, 0x2b, 0x2e, 0xb8, 0xdf, 0xef, 0xdb, 0x7a, 0xda, 0xc2, 0x2f, 0x6b, 0xa5, 0xdd, 0xfd, 0xb9, 0xd1, 0xd6, 0xd3, 0x0e, 0xb3, 0x66, 0x68, 0xe0, 0x6b, 0x16, 0x68, 0xb8, 0x02, + 0x9c, 0x8a, 0xd4, 0x19, 0xf9, 0x56, 0x19, 0xb2, 0x4c, 0x13, 0xda, 0x3f, 0xd4, 0xea, 0xf5, 0x47, 0xa7, 0x4b, 0x38, 0x26, 0x1d, 0x5c, 0x26, 0x92, 0xb2, 0x85, 0x9d, 0x77, 0x7d, 0x1a, 0xfb, 0x20, + 0xf7, 0xb5, 0xa2, 0xcc, 0xf3, 0x08, 0xa0, 0xd5, 0xc1, 0xa5, 0x73, 0x34, 0x62, 0x70, 0xdf, 0x72, 0x5b, 0xf8, 0x73, 0xe6, 0xc8, 0x69, 0x98, 0xe6, 0x78, 0x1f, 0xca, 0xc3, 0xdc, 0x67, 0x6a, 0xc8, + 0xb7, 0x31, 0x4d, 0xf8, 0x49, 0x78, 0xb8, 0xf1, 0x1c, 0xcd, 0x95, 0x77, 0xc0, 0xfc, 0xe8, 0x35, 0xe3, 0x38, 0xae, 0x65, 0xd2, 0x97, 0xb5, 0x25, 0x5d, 0xdb, 0x04, 0xbe, 0x59, 0x84, 0xa2, 0xfb, + 0x03, 0xd6, 0x11, 0x20, 0x9f, 0xb1, 0x0e, 0x31, 0x7a, 0x29, 0xef, 0xe0, 0xc5, 0x9c, 0x31, 0x12, 0xb6, 0xc9, 0xa7, 0xb1, 0x4e, 0x58, 0x64, 0x5e, 0x57, 0xac, 0x8a, 0x61, 0x00, 0xbd, 0x96, 0x91, + 0x0f, 0x97, 0x91, 0xe2, 0xb7, 0x16, 0xf3, 0x3f, 0x39, 0xcc, 0x3f, 0xda, 0x6e, 0x35, 0x88, 0xad, 0xbe, 0x93, 0x91, 0x0c, 0x63, 0x12, 0xa5, 0x21, 0x2b, 0xc7, 0x01, 0xee, 0x3b, 0xa5, 0xde, 0x25, + 0x27, 0xd3, 0x2d, 0x71, 0x99, 0xe7, 0xcc, 0x3b, 0xc8, 0x74, 0x9e, 0xe5, 0x91, 0x3e, 0x94, 0x11, 0xe3, 0xad, 0x71, 0xf4, 0xbd, 0x6c, 0x7b, 0xdb, 0x0c, 0x8b, 0xcb, 0xcb, 0x13, 0x7f, 0x53, 0xf1, + 0x58, 0x18, 0xb6, 0x7a, 0x73, 0x2d, 0x5c, 0x54, 0x5f, 0x5a, 0xcf, 0x63, 0x88, 0x69, 0x6a, 0x49, 0xb4, 0x50, 0xee, 0x0b, 0x7b, 0x02, 0x0c, 0x45, 0xd5, 0x8c, 0x77, 0x8d, 0x1b, 0x6e, 0x6d, 0xbb, + 0xdd, 0xb1, 0xbb, 0xea, 0x44, 0x6e, 0xcc, 0x31, 0x4f, 0x75, 0x7d, 0xeb, 0xd0, 0x98, 0x9c, 0x9b, 0xa0, 0xea, 0x05, 0xd6, 0x4c, 0xf7, 0x1b, 0x57, 0x4a, 0x39, 0x35, 0x09, 0x1c, 0xb4, 0x64, 0xb9, + 0xa8, 0x52, 0xf2, 0xdb, 0x0f, 0x60, 0x82, 0x6d, 0x08, 0x3f, 0xf2, 0x64, 0x76, 0xaa, 0xa3, 0x00, 0xb8, 0x3f, 0x2f, 0x42, 0x90, 0x35, 0x4d, 0x3f, 0x6e, 0x4a, 0x53, 0xa7, 0x37, 0x18, 0xe3, 0xdf, + 0x78, 0x62, 0xe3, 0x18, 0x87, 0x41, 0xb7, 0x2e, 0x87, 0x9e, 0x5d, 0x6c, 0x41, 0x37, 0x8b, 0xbe, 0x60, 0xbc, 0xd2, 0x69, 0x6a, 0x67, 0x6a, 0xac, 0x10, 0x85, 0xd9, 0xa0, 0x50, 0x39, 0x56, 0xfc, + 0xd3, 0x49, 0x19, 0xdb, 0x19, 0x50, 0xe3, 0xe0, 0xa6, 0x49, 0x02, 0x78, 0x56, 0x0f, 0x5f, 0x27, 0x2d, 0x88, 0x6e, 0xfe, 0x8e, 0x64, 0xc2, 0xe6, 0x97, 0x31, 0xbd, 0xe9, 0xc1, 0xbc, 0x8c, 0x32, + 0x29, 0x6b, 0xb7, 0xf2, 0x45, 0x90, 0xc5, 0x36, 0x31, 0x48, 0x8e, 0xc6, 0xed, 0x9d, 0x99, 0xc4, 0xc0, 0xd1, 0x40, 0x1c, 0x5d, 0xa1, 0x27, 0x41, 0x3f, 0xeb, 0xe9, 0x81, 0x47, 0x1d, 0x88, 0x97, + 0x67, 0xb8, 0x99, 0xfe, 0x29, 0x03, 0x63, 0xcb, 0x51, 0x51, 0xa7, 0xa9, 0x54, 0xa8, 0xf9, 0xe2, 0xd1, 0x3d, 0x97, 0x15, 0x89, 0x3b, 0xb2, 0x33, 0x29, 0x93, 0xd7, 0xd0, 0xa3, 0xa1, 0xb8, 0x0b, + 0xc3, 0x64, 0xb2, 0xd9, 0xea, 0xfd, 0xb2, 0xe8, 0x0d, 0x8b, 0xbd, 0x34, 0x34, 0x20, 0x19, 0x22, 0x67, 0x08, 0x6c, 0xc8, 0x1b, 0xb1, 0x3d, 0xde, 0x9a, 0xd0, 0xbf, 0x1a, 0x79, 0x48, 0xde, 0x2f, + 0x40, 0x8b, 0xed, 0xe4, 0x54, 0xd8, 0x33, 0xbc, 0x99, 0x81, 0x30, 0x6a, 0xc4, 0x8d, 0xcf, 0x03, 0xe8, 0x55, 0xf9, 0x9a, 0x05, 0x12, 0x8f, 0xfd, 0xc8, 0x5f, 0x61, 0xf7, 0x0e, 0xb0, 0x36, 0x52, + 0x58, 0x06, 0x41, 0xf4, 0x1b, 0x35, 0x41, 0x44, 0x27, 0x4f, 0x53, 0xfa, 0x5a, 0x83, 0xbe, 0xea, 0xe1, 0xe1, 0x11, 0x3d, 0xfb, 0x6a, 0xae, 0x23, 0x3e, 0x5e, 0x5e, 0x80, 0x1a, 0x76, 0x29, 0x7f, + 0x5a, 0x22, 0x45, 0xbe, 0x2a, 0x44, 0x01, 0x8d, 0x9c, 0xcc, 0x9e, 0xa9, 0x08, 0x47, 0xcb, 0x5a, 0x9e, 0x54, 0x74, 0xad, 0x0a, 0xc3, 0xbe, 0xd5, 0xc3, 0x89, 0x6e, 0x27, 0x12, 0x59, 0xbd, 0x20, + 0x6d, 0x8d, 0x9a, 0xaf, 0xbb, 0x14, 0x53, 0xd2, 0xcd, 0x79, 0xc8, 0xe4, 0xe1, 0x7b, 0x9b, 0x73, 0x9a, 0x8f, 0xee, 0x2d, 0xa8, 0x0f, 0x20, 0x1e, 0xf3, 0xbb, 0x49, 0xba, 0xb2, 0xd2, 0x81, 0x0f, + 0x4a, 0xdd, 0xa8, 0xfe, 0xac, 0x26, 0x2e, 0xf5, 0x04, 0xf2, 0xd0, 0x08, 0x29, 0xad, 0xe9, 0x4c, 0xa6, 0x98, 0xf0, 0xda, 0xb3, 0x56, 0xb4, 0xd7, 0x6c, 0xdf, 0x04, 0x42, 0x6f, 0x98, 0x8a, 0x6b, + 0xa2, 0x16, 0x0b, 0x1b, 0x33, 0x75, 0xef, 0xe5, 0x7e, 0xac, 0x60, 0x71, 0x13, 0x37, 0xb7, 0x70, 0x81, 0xed, 0x6a, 0x75, 0x58, 0xc1, 0x99, 0xf7, 0x00, 0xfa, 0x92, 0x6f, 0xf8, 0x0d, 0xd5, 0x79, + 0x4c, 0x5f, 0x1c, 0x91, 0x82, 0xa1, 0x4c, 0xbd, 0xd2, 0x95, 0xeb, 0x95, 0x86, 0xfd, 0x94, 0x44, 0xc8, 0xae, 0x85, 0xcc, 0x4d, 0x40, 0x45, 0xde, 0xd7, 0x6f, 0x8c, 0x19, 0x69, 0xd3, 0x64, 0x69, + 0xd1, 0x98, 0xcf, 0x56, 0x95, 0xdf, 0x18, 0x92, 0xb2, 0x46, 0x07, 0x9f, 0xf6, 0xa3, 0xcf, 0x82, 0x69, 0x7f, 0x9f, 0xf7, 0x5b, 0xed, 0x95, 0xad, 0xb3, 0x6e, 0x61, 0xf4, 0xb3, 0xbf, 0x7b, 0xa9, + 0x46, 0x27, 0x6f, 0x49, 0x97, 0x00, 0xae, 0x1c, 0x1b, 0xf5, 0x62, 0x99, 0xf1, 0xab, 0xc4, 0x8a, 0x2c, 0x66, 0x9a, 0x2c, 0xc6, 0x9a, 0x2c, 0x06, 0x4c, 0x61, 0x79, 0x92, 0x4d, 0x7f, 0xaa, 0xc9, + 0x9f, 0x1a, 0x4b, 0x7e, 0x6f, 0x4d, 0xcf, 0x08, 0x95, 0xfe, 0x8d, 0x52, 0xf3, 0x21, 0x51, 0x1b, 0x8e, 0xc0, 0x2f, 0x42, 0xca, 0x77, 0xa6, 0xee, 0x4c, 0xf2, 0x83, 0x46, 0x4b, 0xcd, 0x98, 0x52, + 0x83, 0xd1, 0x2e, 0xcd, 0x94, 0xb4, 0xa4, 0xd1, 0xa1, 0xc9, 0x6c, 0x34, 0x4b, 0xd3, 0x21, 0xcd, 0xb4, 0x9f, 0xfe, 0x0d, 0xc4, 0x9f, 0x2e, 0xb0, 0x34, 0x6d, 0x16, 0xcc, 0x46, 0x8b, 0x18, 0x1d, + 0x98, 0xcc, 0x4a, 0x8b, 0x24, 0x9d, 0x16, 0x1f, 0xe3, 0x3a, 0x4d, 0xa3, 0x5f, 0xae, 0x97, 0xb4, 0x24, 0xd3, 0xc1, 0xce, 0xb4, 0xb4, 0xb8, 0xd3, 0xf1, 0xfe, 0xe9, 0x3e, 0x9e, 0x96, 0x69, 0x7a, + 0xa7, 0xb9, 0x82, 0xd6, 0x68, 0xfa, 0x00, 0x68, 0x2e, 0xf9, 0x6b, 0x91, 0x17, 0x26, 0xa5, 0x86, 0x67, 0x07, 0xa1, 0xc9, 0x4b, 0x20, 0x08, 0x58, 0x55, 0x54, 0xbf, 0xa4, 0xa7, 0x2d, 0x1d, 0x83, + 0xf2, 0xb1, 0x14, 0x94, 0x67, 0x9f, 0xef, 0x57, 0xcd, 0x6d, 0xad, 0x96, 0xa2, 0xe0, 0xc1, 0xa9, 0x07, 0x80, 0xc3, 0xef, 0xa6, 0xad, 0x83, 0x53, 0x34, 0xce, 0x56, 0xeb, 0xf3, 0x17, 0x06, 0xd9, + 0xc8, 0xce, 0xf0, 0x53, 0xa1, 0x36, 0x54, 0xd4, 0xe1, 0x64, 0x47, 0x19, 0xef, 0x9b, 0xf6, 0xf4, 0x07, 0x30, 0x6c, 0x1e, 0xaf, 0xcb, 0xc2, 0x9c, 0x22, 0x2b, 0xaa, 0xed, 0xa6, 0x20, 0xfe, 0x06, + 0x1e, 0x81, 0x77, 0xb0, 0xf8, 0x51, 0x1a, 0x3e, 0x7c, 0xbb, 0x4d, 0x0d, 0x60, 0xdd, 0xe1, 0x46, 0x9b, 0x37, 0x44, 0x09, 0xec, 0x4a, 0x81, 0x54, 0x58, 0x56, 0x39, 0x96, 0x3f, 0x68, 0xeb, 0xb2, + 0x68, 0x6f, 0x6d, 0x1e, 0xe6, 0xe3, 0xad, 0xf0, 0x58, 0x18, 0x74, 0xc4, 0x25, 0xc8, 0xfc, 0x06, 0x4d, 0xc8, 0xd2, 0x88, 0x17, 0x6a, 0x66, 0x93, 0xbb, 0x79, 0xe5, 0x59, 0xe3, 0x99, 0x63, 0xdb, + 0xcf, 0x0a, 0xe7, 0x89, 0x67, 0xf4, 0x04, 0x1c, 0x8c, 0x84, 0x9f, 0xa7, 0x7f, 0x19, 0xe9, 0x51, 0x3f, 0x46, 0x66, 0x96, 0x85, 0x1b, 0xef, 0x96, 0x8a, 0xd1, 0x9e, 0xfb, 0x34, 0x2b, 0xc8, 0x0b, + 0x6d, 0xea, 0x73, 0x40, 0xe2, 0x78, 0x7f, 0x3f, 0xb8, 0x36, 0x0a, 0xbb, 0x11, 0xc7, 0x5a, 0x0e, 0x6c, 0x54, 0x0d, 0x17, 0x5a, 0xb6, 0x9d, 0x39, 0xc4, 0x33, 0x6d, 0x34, 0xba, 0x71, 0x4e, 0x81, + 0xe5, 0x80, 0xd2, 0x62, 0x3a, 0xaa, 0x1a, 0xfa, 0x5d, 0xf7, 0x99, 0x44, 0xbf, 0xdb, 0xce, 0x69, 0x0a, 0x24, 0x72, 0x18, 0x94, 0x7b, 0x28, 0xe1, 0x80, 0x5a, 0x37, 0x4a, 0x56, 0x15, 0x57, 0x90, + 0x6f, 0xad, 0xc8, 0x1f, 0xcd, 0x63, 0x2b, 0x68, 0xe7, 0x09, 0x49, 0x78, 0x63, 0x67, 0xce, 0x89, 0x12, 0xea, 0xb2, 0xb8, 0x17, 0xfd, 0x28, 0xd1, 0xfe, 0xad, 0x0a, 0x2d, 0x30, 0x2c, 0x36, 0x49, + 0x86, 0x35, 0x34, 0xf5, 0xb4, 0x14, 0xdc, 0x6d, 0x0c, 0xa9, 0xdf, 0x1a, 0xd8, 0xd0, 0x95, 0x26, 0x2c, 0xd6, 0xb8, 0xd1, 0x02, 0xb7, 0x04, 0x2c, 0x0d, 0x55, 0x73, 0x39, 0xae, 0x02, 0x9a, 0x6e, + 0x29, 0x31, 0x29, 0x48, 0x21, 0xe9, 0x14, 0x15, 0xee, 0xfc, 0xc1, 0xfb, 0x3a, 0x7e, 0x6f, 0x92, 0x0a, 0xbf, 0x4f, 0x30, 0xfa, 0xb2, 0x80, 0x64, 0x96, 0xb2, 0xd4, 0x75, 0x7a, 0xb3, 0x47, 0x2b, + 0x0f, 0x79, 0x53, 0xa8, 0xd2, 0x91, 0xcf, 0x40, 0x1b, 0x88, 0x81, 0x75, 0xea, 0xc4, 0xd3, 0xc2, 0x44, 0xd8, 0x8b, 0xb8, 0xc0, 0x6e, 0xbc, 0x76, 0x2c, 0x5b, 0xc0, 0xe9, 0x7c, 0x76, 0xce, 0xcf, + 0xa5, 0x62, 0x96, 0x25, 0x43, 0xad, 0x54, 0x92, 0x04, 0xaa, 0x5b, 0x53, 0x2d, 0x1a, 0xde, 0x83, 0x05, 0x2c, 0x91, 0x4d, 0xca, 0x64, 0xdf, 0x6c, 0x43, 0x7e, 0x5b, 0x43, 0x1b, 0x01, 0x05, 0xa8, + 0xb0, 0xdf, 0x56, 0x8e, 0xdf, 0xe1, 0x21, 0x43, 0x5e, 0xa7, 0x60, 0xdd, 0x6d, 0x63, 0x6a, 0xde, 0x44, 0x5a, 0xce, 0xca, 0xe3, 0x7c, 0xf9, 0xbc, 0x25, 0xcd, 0x5e, 0x13, 0x90, 0xb6, 0xd0, 0x26, + 0xfa, 0xdd, 0xd0, 0x45, 0x76, 0x30, 0x9f, 0xd2, 0xf5, 0x7c, 0x38, 0x1c, 0xf0, 0x60, 0x0d, 0xed, 0x56, 0x25, 0x97, 0x09, 0xb1, 0x85, 0x70, 0x5d, 0x33, 0x51, 0xaf, 0x7b, 0x32, 0x45, 0xf5, 0xea, + 0x8e, 0xea, 0xab, 0x0c, 0x65, 0x4a, 0x7d, 0x90, 0xa7, 0x7c, 0xda, 0x47, 0x88, 0xe4, 0xb3, 0x24, 0x23, 0x1b, 0x67, 0xd3, 0xba, 0xb8, 0x8e, 0x15, 0xae, 0xd2, 0x2b, 0x93, 0xbf, 0xef, 0x52, 0xe8, + 0x50, 0xb6, 0xc9, 0xd4, 0xaa, 0x56, 0x01, 0x04, 0xff, 0x26, 0xbd, 0x24, 0x4a, 0xc1, 0x49, 0x73, 0x57, 0xc4, 0x17, 0xe2, 0x0e, 0x7f, 0xf2, 0x3d, 0xf6, 0x78, 0x2a, 0x88, 0xf7, 0xbb, 0x34, 0x47, + 0xbe, 0xb2, 0x7e, 0xcc, 0xfe, 0xf7, 0x64, 0xe8, 0x80, 0x7f, 0x9e, 0x88, 0x08, 0xa4, 0xc3, 0xb2, 0x34, 0xd5, 0xfd, 0x21, 0xd2, 0xad, 0xb2, 0xa8, 0x5f, 0x86, 0xf2, 0xeb, 0x7e, 0x2b, 0xcf, 0x9b, + 0xaf, 0xc2, 0x47, 0xdf, 0xe5, 0x7f, 0x3a, 0xda, 0x58, 0x04, 0x9a, 0xa3, 0xb1, 0x9f, 0x7b, 0x75, 0x05, 0xf7, 0xe2, 0xdd, 0x2f, 0x01, 0x8b, 0x67, 0x8b, 0x5d, 0xb5, 0xbd, 0x51, 0x70, 0x5a, 0x46, + 0x90, 0x05, 0x6d, 0x35, 0xed, 0x1f, 0x6a, 0x36, 0x8d, 0x6d, 0x5a, 0x22, 0xf4, 0xf1, 0x3d, 0xfc, 0xb0, 0x37, 0xfd, 0x52, 0xb2, 0x25, 0x87, 0x56, 0xf3, 0x17, 0xa0, 0x39, 0xda, 0x6e, 0x70, 0x5f, + 0xe4, 0x05, 0xae, 0x8f, 0x41, 0x8d, 0x2b, 0x4e, 0xfd, 0x92, 0x61, 0xbf, 0xfe, 0xf1, 0xc9, 0x7f, 0xf7, 0x60, 0xe0, 0xef, 0x9e, 0xfc, 0x2f, 0xf2, 0x09, 0x05, 0x80, 0xd0, 0xf9, 0xc1, 0x1d, 0xc4, + 0x32, 0x62, 0xf1, 0x20, 0x74, 0xde, 0xb4, 0x24, 0x72, 0x6c, 0x39, 0xca, 0xd1, 0xa6, 0x3d, 0xc8, 0x0b, 0x9b, 0x36, 0x83, 0x59, 0x9b, 0x99, 0xe2, 0xb3, 0x4a, 0x9e, 0x0f, 0xb2, 0xf5, 0x0e, 0x0a, + 0xcd, 0xc0, 0x14, 0x77, 0xae, 0x64, 0x32, 0x17, 0x4b, 0xaf, 0xb2, 0x66, 0x5c, 0x5c, 0x63, 0x92, 0x7a, 0x45, 0xa1, 0x1f, 0x00, 0xdb, 0x46, 0xc6, 0x91, 0x16, 0x5d, 0x6b, 0x48, 0xa1, 0x6d, 0xf0, + 0xef, 0xe7, 0x7b, 0x78, 0x24, 0x6f, 0xa4, 0xee, 0xac, 0x57, 0x54, 0x44, 0x0f, 0x89, 0x92, 0xde, 0xab, 0xd2, 0x67, 0x8a, 0xff, 0x40, 0x7d, 0x62, 0x3f, 0x4f, 0xf3, 0x35, 0x5e, 0x71, 0x87, 0xc6, + 0x59, 0x5f, 0x32, 0x84, 0x59, 0xc9, 0x7c, 0x4f, 0x48, 0x6a, 0x17, 0x58, 0x01, 0x72, 0xb8, 0x00, 0x78, 0x9d, 0x69, 0xb2, 0xb0, 0xa4, 0xba, 0xdd, 0xd8, 0x37, 0x05, 0xe9, 0xe9, 0xaa, 0x11, 0xf0, + 0x2d, 0x83, 0x22, 0x95, 0xa8, 0xa8, 0xcc, 0x60, 0xe2, 0x45, 0x10, 0x63, 0x18, 0xd1, 0x31, 0x1e, 0x15, 0x3d, 0xc1, 0x57, 0xc4, 0x5a, 0x3b, 0xd8, 0x59, 0x78, 0xad, 0x91, 0xf1, 0xe8, 0xb4, 0xe7, + 0x62, 0x5c, 0x8e, 0xd0, 0xba, 0xc2, 0x98, 0xf7, 0x2f, 0x16, 0x78, 0xb2, 0x9c, 0x10, 0xc4, 0xa3, 0x65, 0x11, 0x74, 0xd1, 0x28, 0x46, 0xd9, 0xf0, 0xdb, 0xe5, 0xf4, 0xa7, 0x60, 0x79, 0x76, 0x04, + 0x99, 0x6e, 0x67, 0xc6, 0x2c, 0xec, 0x58, 0xd0, 0xb5, 0x2d, 0x26, 0x77, 0xb2, 0x1e, 0xb9, 0xbf, 0xb8, 0xd8, 0xb8, 0x99, 0x8a, 0xea, 0x99, 0xbd, 0xfd, 0xd8, 0x37, 0x2c, 0xb1, 0x97, 0xe7, 0x52, + 0xab, 0x4d, 0x73, 0x38, 0x80, 0xe1, 0x24, 0xf5, 0x5d, 0xd7, 0x18, 0x30, 0xa3, 0x15, 0x8b, 0x87, 0xf5, 0x50, 0xe3, 0x4a, 0xce, 0x9b, 0x24, 0x79, 0x3e, 0xdf, 0x22, 0xf1, 0x04, 0x95, 0xd9, 0xf5, + 0x48, 0x22, 0x27, 0x4b, 0xa6, 0x1f, 0xef, 0x0f, 0x51, 0x7e, 0xf3, 0xd6, 0x58, 0xca, 0xcf, 0xab, 0x4a, 0x05, 0x88, 0x99, 0x7a, 0x8d, 0xa5, 0x62, 0x16, 0xad, 0x32, 0xc1, 0x65, 0xe3, 0x07, 0x20, + 0xdc, 0x6b, 0x25, 0x1b, 0x52, 0x5f, 0x65, 0x06, 0x46, 0xea, 0x4e, 0x90, 0x27, 0x20, 0x73, 0x56, 0xdd, 0x86, 0x72, 0x2a, 0x6b, 0x48, 0x43, 0x15, 0xd9, 0xc4, 0x3b, 0xf4, 0xc6, 0xa5, 0x77, 0x2e, + 0x92, 0x45, 0x1e, 0x86, 0x11, 0x49, 0x86, 0x2e, 0xd8, 0xe9, 0x42, 0xf2, 0x7e, 0x9c, 0x44, 0xbb, 0x59, 0x86, 0x1b, 0x9b, 0xc9, 0xad, 0x2c, 0xa7, 0xfc, 0x01, 0x40, 0xe2, 0x94, 0x6f, 0xfc, 0xa9, + 0x33, 0xb5, 0x1e, 0x0d, 0xc3, 0xab, 0x6d, 0x38, 0xbf, 0x08, 0xda, 0xdd, 0x77, 0x36, 0xae, 0x1e, 0xb6, 0x81, 0x13, 0x67, 0x73, 0x49, 0x62, 0x3d, 0x50, 0x75, 0xfc, 0xce, 0x52, 0x4b, 0xc4, 0x81, + 0x5b, 0x26, 0x5b, 0xa4, 0x98, 0xee, 0x01, 0xb7, 0x68, 0xfd, 0xd6, 0xe5, 0x17, 0xbd, 0xba, 0xa4, 0x5a, 0x56, 0x35, 0x08, 0x40, 0x73, 0x3f, 0x61, 0xd4, 0xd4, 0xee, 0x50, 0x3a, 0xf2, 0x2b, 0x17, + 0x93, 0xcf, 0x20, 0xac, 0x40, 0xf8, 0x9e, 0xe8, 0x09, 0x0b, 0xaf, 0x88, 0x24, 0xb2, 0xc5, 0xc2, 0xb0, 0x96, 0x96, 0x82, 0x96, 0x5c, 0x95, 0xb3, 0x68, 0xe0, 0xb3, 0xcb, 0x91, 0x33, 0x91, 0xa6, + 0x32, 0x63, 0x0a, 0x93, 0x9e, 0xc5, 0xa0, 0x7a, 0x41, 0xdb, 0x73, 0x2a, 0x63, 0x06, 0x68, 0x33, 0xfb, 0xed, 0xc8, 0x03, 0x28, 0xe0, 0x92, 0xbb, 0xf8, 0x6a, 0x5b, 0xac, 0x3e, 0xcd, 0x3c, 0x4c, + 0x2e, 0x1f, 0x90, 0x1b, 0xd2, 0x83, 0x15, 0x87, 0xa7, 0x4f, 0x4e, 0xd7, 0x74, 0x90, 0xca, 0x2d, 0xfc, 0xa5, 0x80, 0x92, 0x56, 0xa2, 0x37, 0x78, 0x8d, 0xb8, 0x7b, 0xb6, 0x32, 0x6e, 0xdc, 0x92, + 0x51, 0xe1, 0xdf, 0xf9, 0xac, 0x11, 0x76, 0x99, 0x03, 0xbe, 0x24, 0x14, 0x88, 0x26, 0x4b, 0x97, 0x26, 0x8b, 0xfb, 0x57, 0x08, 0xaf, 0x88, 0x8a, 0xbd, 0x88, 0x7c, 0x86, 0x43, 0xda, 0x35, 0xec, + 0x28, 0x3a, 0x7a, 0x8d, 0x6d, 0xdc, 0x33, 0xed, 0x67, 0x72, 0x6c, 0x64, 0x33, 0x8d, 0xc3, 0x32, 0x75, 0x2d, 0x48, 0x1a, 0xef, 0x7e, 0x5d, 0x5a, 0x20, 0xf0, 0xd3, 0xa2, 0x2e, 0x54, 0x9b, 0xe1, + 0x6c, 0x37, 0x28, 0x4c, 0x87, 0x3e, 0xb4, 0x4b, 0x43, 0xb5, 0x3a, 0xd8, 0x55, 0x4f, 0xd1, 0xc3, 0x97, 0x52, 0xab, 0x6d, 0x38, 0x7e, 0x54, 0x25, 0xfc, 0xdb, 0x42, 0x84, 0x2b, 0x15, 0xbd, 0x31, + 0xab, 0x18, 0x57, 0x73, 0x68, 0x58, 0xb7, 0x19, 0xf1, 0x53, 0x5e, 0x5f, 0xb8, 0x57, 0x71, 0x98, 0x17, 0xc3, 0x7c, 0xac, 0xcf, 0x46, 0x33, 0x1a, 0x01, 0x09, 0x45, 0xbe, 0x08, 0x45, 0x6f, 0x91, + 0x79, 0xb8, 0x0d, 0xc5, 0x16, 0x0a, 0x5f, 0xca, 0x19, 0xf8, 0x78, 0x1b, 0x9f, 0x8c, 0xf0, 0xe9, 0x3f, 0x18, 0x74, 0x6d, 0x13, 0xfa, 0x7c, 0xa1, 0x39, 0x66, 0xa1, 0xda, 0xf4, 0x67, 0x8b, 0x70, + 0x40, 0x63, 0x19, 0x3f, 0xfa, 0xa8, 0x34, 0x4a, 0xd5, 0x4d, 0xcb, 0x04, 0xb5, 0xda, 0xe8, 0x35, 0xfc, 0x6d, 0xc3, 0xd7, 0xf7, 0x12, 0x77, 0x3f, 0x7a, 0x8e, 0x32, 0x50, 0x12, 0x9a, 0xc4, 0x40, + 0x56, 0xde, 0xfd, 0xad, 0x48, 0x4f, 0x5c, 0x15, 0x0f, 0x7c, 0x86, 0xbd, 0x54, 0xdc, 0x85, 0xbf, 0x28, 0xf3, 0x59, 0xda, 0x64, 0xb0, 0xb1, 0xd8, 0x7d, 0x7b, 0xa4, 0xb4, 0x8a, 0x9b, 0xe9, 0x73, + 0x27, 0x5a, 0x40, 0xe8, 0x91, 0x7c, 0x75, 0xcb, 0x5c, 0x94, 0x49, 0x3d, 0xa8, 0x63, 0xe4, 0xb2, 0xda, 0x79, 0x7e, 0x6c, 0x1e, 0x35, 0x0a, 0xd4, 0xdc, 0x4b, 0xd7, 0xf3, 0xae, 0x19, 0x99, 0xec, + 0xc7, 0x6d, 0x64, 0xf6, 0xb2, 0x9b, 0xb2, 0x76, 0x7f, 0xc8, 0xc6, 0xe6, 0x09, 0xb9, 0xaa, 0x69, 0x75, 0x2b, 0x60, 0xb3, 0xe2, 0x3a, 0xe8, 0x12, 0x53, 0x79, 0x5c, 0x44, 0x40, 0xc3, 0x9f, 0x73, + 0x53, 0x3c, 0xa5, 0xbb, 0x2b, 0x33, 0x57, 0x71, 0x0b, 0x96, 0x7c, 0xaa, 0x9a, 0x55, 0x28, 0xe2, 0x08, 0x27, 0xa2, 0xbd, 0x9b, 0x8e, 0xaa, 0x5f, 0x23, 0xbe, 0xed, 0x35, 0x99, 0x6e, 0xb2, 0x9a, + 0xf7, 0x0d, 0xef, 0x0d, 0x92, 0xd6, 0xbe, 0xa2, 0xfe, 0xae, 0xcc, 0xb9, 0x7c, 0xec, 0x81, 0x62, 0xac, 0xf1, 0x86, 0x6f, 0x33, 0x39, 0x01, 0xa5, 0x73, 0xa3, 0xcd, 0x87, 0x46, 0xf8, 0xf9, 0x11, + 0xda, 0xd7, 0x3e, 0x28, 0xfa, 0x0a, 0x09, 0x2f, 0x7f, 0xe5, 0x82, 0x8a, 0x50, 0xfb, 0x27, 0xbd, 0x79, 0x95, 0x84, 0xbb, 0xea, 0x49, 0xc0, 0xf7, 0x55, 0xaa, 0xe9, 0xaa, 0x4b, 0x16, 0x14, 0x4a, + 0xcc, 0x32, 0x96, 0xa5, 0x65, 0xeb, 0xa0, 0x0e, 0x2f, 0xaf, 0xc6, 0xac, 0xd8, 0xcc, 0xba, 0xb3, 0x0b, 0x50, 0xc0, 0xed, 0xae, 0x72, 0x2f, 0x7f, 0xbe, 0x02, 0xe8, 0xad, 0x41, 0x77, 0x90, 0x7b, + 0x0c, 0x77, 0x50, 0xc7, 0xaa, 0x7c, 0xd5, 0x2d, 0xfb, 0x8a, 0x7a, 0xb5, 0x04, 0x4d, 0xe6, 0x28, 0xf1, 0x8b, 0xa8, 0x9a, 0xea, 0x50, 0xc9, 0x05, 0x25, 0x3a, 0x35, 0x18, 0x6f, 0xb7, 0xe7, 0x99, + 0x11, 0x4d, 0xae, 0x4e, 0xac, 0xe3, 0x9d, 0x5b, 0x56, 0x9a, 0x4f, 0x1c, 0x88, 0x9c, 0x5c, 0xed, 0xfb, 0x72, 0x62, 0x62, 0x47, 0xd0, 0x5e, 0x95, 0x72, 0x97, 0xa6, 0xbe, 0xcc, 0x44, 0x3c, 0xbb, + 0xae, 0x6c, 0x2b, 0x71, 0xbc, 0xd4, 0x88, 0x3c, 0xa1, 0xf1, 0x70, 0xaf, 0xdd, 0xb5, 0x61, 0x87, 0x03, 0xc9, 0x2c, 0x21, 0x6b, 0xc4, 0x46, 0x2d, 0x8d, 0x58, 0xa7, 0xf1, 0x2e, 0x83, 0xba, 0x39, + 0x54, 0x72, 0xd3, 0x5a, 0x74, 0x1c, 0xe8, 0x5f, 0x8a, 0x19, 0x10, 0x51, 0xe0, 0xef, 0x11, 0x65, 0x8b, 0x68, 0x60, 0x04, 0xfa, 0x4e, 0x70, 0xaf, 0x9d, 0x49, 0xc5, 0x69, 0x33, 0x9e, 0xf1, 0x49, + 0xab, 0x53, 0xfe, 0x44, 0x58, 0x64, 0x51, 0x62, 0xb7, 0xf6, 0xd7, 0x8e, 0x9b, 0xde, 0x6b, 0xed, 0x3b, 0x32, 0x91, 0xe4, 0xb6, 0x0e, 0xc1, 0xd6, 0x58, 0x9d, 0xbc, 0x58, 0x37, 0xa3, 0x23, 0xb1, + 0x00, 0xdb, 0x16, 0xab, 0x18, 0xf0, 0xe6, 0xe9, 0x31, 0xf0, 0xcd, 0x18, 0x23, 0x61, 0xc1, 0x2c, 0x18, 0xbc, 0x6f, 0xae, 0x5c, 0xbc, 0x83, 0x9c, 0xbc, 0x99, 0xbd, 0x26, 0xb4, 0xfc, 0xd3, 0xab, + 0xeb, 0xc3, 0xa0, 0x9d, 0x21, 0x1c, 0x2d, 0x4a, 0x74, 0xfa, 0xdc, 0x7c, 0x65, 0x3e, 0x23, 0x57, 0xa2, 0x74, 0x1b, 0x2d, 0xaa, 0xd4, 0x2b, 0x67, 0x4e, 0xc3, 0x01, 0x30, 0xa1, 0xea, 0x44, 0xc0, + 0xf7, 0xa5, 0x18, 0x99, 0x95, 0xc3, 0x76, 0xf3, 0x1e, 0x68, 0xb0, 0x8f, 0x34, 0xd2, 0x91, 0x54, 0xd6, 0x23, 0xed, 0x02, 0xd6, 0x76, 0x4c, 0x21, 0xef, 0x1e, 0x33, 0x12, 0x95, 0xad, 0xf7, 0x63, + 0x4f, 0x12, 0x6c, 0xc2, 0x45, 0x4e, 0x57, 0x6f, 0x79, 0x5b, 0x49, 0xb5, 0x1f, 0x27, 0x1a, 0x32, 0xf2, 0x28, 0xf9, 0x84, 0x43, 0xc0, 0x9f, 0x8d, 0xf0, 0x14, 0xdb, 0xc5, 0x3c, 0x03, 0x46, 0xf7, + 0xf5, 0xc2, 0x0b, 0x1a, 0xce, 0xe8, 0x5f, 0xc1, 0xda, 0xcc, 0xa1, 0xf7, 0xbc, 0xad, 0xe8, 0xc0, 0x05, 0x6a, 0xca, 0x63, 0xb0, 0x87, 0xbd, 0x59, 0xbc, 0xa4, 0x9e, 0xdd, 0x15, 0xdf, 0xd8, 0x48, + 0x3e, 0xf6, 0xdf, 0xb3, 0x86, 0xbe, 0xd9, 0x58, 0xff, 0xc4, 0x1c, 0xca, 0xfe, 0xe0, 0x0d, 0xfd, 0x5e, 0x7f, 0xf6, 0xe7, 0xdf, 0xdf, 0xe5, 0x25, 0x3f, 0x9b, 0x87, 0xfc, 0xc2, 0x20, 0x75, 0xf9, + 0x10, 0xdd, 0xb8, 0xfe, 0x2c, 0xe9, 0xc6, 0x73, 0x1f, 0x6b, 0x9b, 0xa1, 0x0b, 0x07, 0x60, 0x20, 0xe1, 0x8c, 0x5e, 0xe3, 0x16, 0x77, 0xfc, 0x77, 0x59, 0x40, 0xe2, 0xb0, 0xad, 0x5e, 0xc7, 0xa8, + 0x05, 0x25, 0x88, 0x55, 0xc6, 0xa2, 0x7b, 0x88, 0x35, 0x1d, 0x7c, 0xc5, 0x9a, 0x79, 0x37, 0xdd, 0xbe, 0x38, 0x48, 0x7f, 0x54, 0x32, 0xbf, 0xb0, 0xfb, 0xe5, 0x7e, 0xb2, 0xfb, 0xfd, 0x15, 0x63, + 0xa7, 0xfd, 0x81, 0x5b, 0xf4, 0x9d, 0xb0, 0x2d, 0xe7, 0xd0, 0x38, 0xf0, 0x19, 0xa0, 0x76, 0xbe, 0x99, 0x86, 0xbc, 0x38, 0x47, 0x43, 0x3f, 0x14, 0xeb, 0xe4, 0x4b, 0x77, 0x1a, 0xd8, 0xf0, 0x86, + 0xbd, 0x08, 0xb4, 0x5f, 0xd8, 0x3a, 0x7d, 0xd3, 0xd3, 0x90, 0xf9, 0x3d, 0x65, 0x92, 0xae, 0x25, 0x80, 0x18, 0xc1, 0x4b, 0xcd, 0xd2, 0x76, 0xde, 0xfc, 0x2a, 0xb4, 0x31, 0x3a, 0x01, 0x42, 0x41, + 0xa9, 0xa4, 0x37, 0x81, 0x7f, 0xb4, 0x3f, 0x89, 0x6d, 0x48, 0x31, 0xf4, 0xe1, 0x68, 0xfc, 0xa1, 0x83, 0xf0, 0xa3, 0x93, 0x36, 0xf0, 0x05, 0xc1, 0xfe, 0x6c, 0xa5, 0xfd, 0xd5, 0x49, 0xfb, 0x57, + 0xf4, 0xa9, 0xd0, 0xfe, 0xc1, 0x65, 0xf5, 0xd3, 0x56, 0x20, 0x69, 0x3f, 0x01, 0xdd, 0xc0, 0xef, 0x7b, 0x9e, 0xa9, 0x23, 0x28, 0xea, 0x03, 0x6c, 0x1b, 0x88, 0x3a, 0x36, 0x45, 0x7c, 0x3c, 0xd1, + 0x82, 0x6f, 0x03, 0xc2, 0x7e, 0x70, 0x3c, 0x11, 0x0b, 0x32, 0xaf, 0x31, 0x06, 0xe6, 0x1c, 0xf8, 0xe0, 0x29, 0xfd, 0x99, 0x4f, 0x00, 0x35, 0x98, 0xb1, 0x33, 0xb1, 0x10, 0x82, 0xb2, 0xc1, 0x71, + 0xc9, 0xcc, 0x62, 0xba, 0x20, 0x03, 0xdd, 0x57, 0xea, 0x39, 0x3e, 0xd5, 0xff, 0x97, 0xbb, 0xff, 0x58, 0x76, 0x1c, 0xe9, 0x92, 0x85, 0xd1, 0x39, 0x9e, 0xa2, 0xe7, 0xb0, 0xdf, 0xa0, 0x41, 0x62, + 0x08, 0xad, 0xb5, 0x24, 0x66, 0xd0, 0x82, 0x50, 0x84, 0x06, 0x9e, 0xfe, 0x5a, 0xaa, 0x12, 0xd9, 0x59, 0xe2, 0xeb, 0xd3, 0xe7, 0x0c, 0x6e, 0x8d, 0x2a, 0x63, 0x27, 0x8d, 0x81, 0x9d, 0x08, 0xf7, + 0x15, 0x11, 0xbe, 0xdc, 0x91, 0xf7, 0x21, 0x6f, 0xc5, 0x2c, 0x06, 0xf1, 0x8c, 0x8f, 0xb4, 0x04, 0x59, 0x7a, 0x98, 0xbf, 0x68, 0xc2, 0x8f, 0xf6, 0x0e, 0xf4, 0x42, 0x34, 0xe7, 0xc9, 0xa9, 0x7d, + 0xc9, 0x1e, 0xa1, 0xbd, 0xa0, 0x8f, 0x6d, 0x72, 0x00, 0xf8, 0x51, 0xc1, 0xa6, 0x0e, 0x3e, 0x25, 0x85, 0x6b, 0xc7, 0xe3, 0x15, 0x0b, 0x74, 0xa4, 0x92, 0x8b, 0x39, 0x32, 0x8a, 0xfd, 0x70, 0x86, + 0xe3, 0xe2, 0x4a, 0x9d, 0x8e, 0x1b, 0x4d, 0x6e, 0xc3, 0x6e, 0x35, 0xc6, 0xc3, 0x11, 0xb5, 0xd2, 0x5b, 0xea, 0xb3, 0x5a, 0xb9, 0x96, 0xa4, 0xc7, 0xdb, 0x84, 0x29, 0x44, 0x64, 0x28, 0x5c, 0xb5, + 0xb6, 0x35, 0x07, 0x4a, 0xbd, 0x7e, 0x82, 0x0f, 0x7a, 0xf6, 0x49, 0xd7, 0x7d, 0xf5, 0x9d, 0xa3, 0xd8, 0x41, 0x2d, 0xbe, 0x5d, 0xa6, 0x65, 0xaf, 0xc9, 0x26, 0x5e, 0x2d, 0x46, 0x1e, 0x64, 0x15, + 0x8f, 0xa6, 0x9a, 0xf9, 0xd9, 0xa7, 0xe8, 0x72, 0x69, 0x4e, 0x8a, 0xa1, 0xa5, 0x55, 0x33, 0x7b, 0x9c, 0x8d, 0xcc, 0x3d, 0x5c, 0x04, 0xd3, 0xf5, 0xed, 0x12, 0x5e, 0x6f, 0xbd, 0x03, 0x0c, 0x5a, + 0x09, 0x95, 0x43, 0x74, 0x56, 0x6e, 0x3d, 0xd4, 0x96, 0xda, 0x96, 0xa2, 0xc9, 0x1a, 0x5a, 0xa0, 0x06, 0xca, 0x23, 0x50, 0xc4, 0x58, 0x5f, 0x0a, 0x0a, 0x69, 0x66, 0xfe, 0xfa, 0x3c, 0xea, 0xd2, + 0xd9, 0x6f, 0xf3, 0x64, 0x16, 0xce, 0xa2, 0x87, 0xd9, 0xf5, 0x84, 0x2c, 0xf1, 0x93, 0x1b, 0xe7, 0x7f, 0x3f, 0xe8, 0x06, 0xfe, 0x8d, 0xe6, 0xf9, 0x57, 0x14, 0xf8, 0x95, 0x01, 0xb9, 0x4f, 0x52, + 0xdb, 0x99, 0x1d, 0x5f, 0x0d, 0xfa, 0x80, 0x12, 0x0a, 0x60, 0x7c, 0x61, 0x93, 0x75, 0xd1, 0x47, 0x2b, 0xa8, 0xf8, 0xeb, 0x93, 0x6e, 0x36, 0x46, 0x11, 0x84, 0x40, 0xca, 0x3e, 0x0a, 0xc3, 0x8c, + 0x7b, 0x95, 0x02, 0x68, 0x1e, 0xaf, 0x33, 0x77, 0xd1, 0x5a, 0x96, 0x09, 0x2b, 0x7e, 0x15, 0x30, 0x45, 0x26, 0x19, 0xb0, 0x1b, 0xed, 0xa4, 0x51, 0x5c, 0x1a, 0x6e, 0x0f, 0x2b, 0x97, 0xcf, 0x7b, + 0xe5, 0x6a, 0x16, 0xad, 0x82, 0x07, 0x48, 0x2b, 0xc8, 0x66, 0xa1, 0xdd, 0x92, 0x17, 0x1b, 0xb5, 0x96, 0x05, 0xff, 0x5c, 0x3d, 0x5e, 0x22, 0x55, 0x67, 0x15, 0x23, 0x70, 0xce, 0x36, 0xf5, 0x14, + 0xe7, 0xb7, 0x46, 0x0f, 0x95, 0x35, 0x8c, 0x03, 0x32, 0x4f, 0x06, 0x01, 0xce, 0x00, 0x61, 0x50, 0xcb, 0x82, 0xfb, 0xd1, 0xe0, 0x61, 0xb1, 0xc2, 0x53, 0xc4, 0xdb, 0x8b, 0xc2, 0xe8, 0xf0, 0xe6, + 0x4a, 0x36, 0xe7, 0xbe, 0x92, 0xd7, 0xd5, 0xe1, 0x60, 0x54, 0xe1, 0x24, 0x46, 0x32, 0xe8, 0x47, 0x24, 0x77, 0xa3, 0xda, 0x97, 0x0f, 0x85, 0x9c, 0x13, 0x46, 0x8d, 0x83, 0x67, 0x62, 0xf1, 0xed, + 0xa8, 0x4c, 0x1a, 0xc2, 0x43, 0xf6, 0x2b, 0x00, 0x8c, 0xa7, 0x98, 0x12, 0x9c, 0xda, 0x3e, 0xbc, 0x76, 0x44, 0x45, 0xef, 0xd6, 0x24, 0xdc, 0x87, 0x68, 0xed, 0x33, 0x3c, 0x31, 0x88, 0x41, 0xab, + 0x08, 0xbd, 0x54, 0xdb, 0x64, 0x11, 0xb2, 0xcd, 0x05, 0xff, 0x19, 0x0e, 0x6d, 0x74, 0x5b, 0x6a, 0xd1, 0x22, 0x0f, 0x76, 0xb3, 0xd4, 0x12, 0x79, 0x12, 0x44, 0xa1, 0x20, 0xdb, 0x12, 0xa0, 0x22, + 0x67, 0x99, 0x80, 0x66, 0xd1, 0xbb, 0xa7, 0x62, 0xd8, 0x52, 0x94, 0xa6, 0x47, 0xb6, 0x7c, 0x0f, 0x4f, 0x3e, 0xb3, 0x04, 0x50, 0x99, 0xfb, 0x32, 0x07, 0xca, 0x19, 0x34, 0xe0, 0xd1, 0xa6, 0x9e, + 0x05, 0xb5, 0xda, 0xe1, 0xf2, 0xd6, 0x15, 0x8e, 0xc7, 0xd0, 0x09, 0xdd, 0xe0, 0xfe, 0xe5, 0x74, 0xd7, 0xf0, 0x91, 0xf1, 0x4d, 0xe1, 0xf7, 0xee, 0xc6, 0xc8, 0xfa, 0x46, 0xfe, 0x56, 0xda, 0xf6, + 0x5b, 0x3c, 0xf5, 0xff, 0x16, 0x4c, 0xff, 0x33, 0x4e, 0x63, 0x5f, 0x70, 0x7a, 0x09, 0xff, 0x11, 0xa7, 0xdb, 0xff, 0x2d, 0x9c, 0xfe, 0xa7, 0x08, 0xdf, 0xb4, 0xa7, 0x16, 0xe0, 0xaf, 0x23, 0x7c, + 0xf5, 0x9f, 0x23, 0x7c, 0xff, 0x11, 0xb7, 0x81, 0x9f, 0x81, 0xfb, 0xdf, 0xe1, 0xf6, 0xf3, 0x97, 0xb8, 0x0d, 0xfc, 0x0c, 0xdc, 0xff, 0x88, 0xdb, 0xae, 0x7f, 0xc8, 0x3f, 0xda, 0x4f, 0xce, 0xd3, + 0xcb, 0x45, 0xe1, 0x8a, 0xfb, 0xae, 0x4b, 0x45, 0xbb, 0x02, 0x02, 0x31, 0x68, 0x13, 0x91, 0xd8, 0x53, 0x91, 0x1a, 0x92, 0xf0, 0x0f, 0x02, 0x3c, 0x4f, 0x3e, 0x74, 0xfa, 0x07, 0x4d, 0x75, 0x7f, + 0xfa, 0xd0, 0x5f, 0xe1, 0x38, 0xf0, 0x4f, 0x40, 0xfe, 0xf7, 0x38, 0x8e, 0xad, 0x87, 0x6d, 0x3d, 0xa9, 0x11, 0x7a, 0xd2, 0xb3, 0xb0, 0x03, 0x21, 0x41, 0xc9, 0x68, 0x8c, 0x10, 0xf8, 0x47, 0xc5, + 0x68, 0x54, 0x08, 0x45, 0xdd, 0x90, 0xd6, 0xb5, 0x54, 0x2d, 0xcf, 0xdf, 0x1a, 0xdf, 0xc2, 0xc6, 0xb0, 0x4f, 0xb1, 0x71, 0x4c, 0x20, 0x47, 0xaf, 0x06, 0xcd, 0x51, 0xf2, 0x5b, 0x9e, 0x82, 0x1d, + 0x25, 0x1e, 0xf2, 0x9d, 0xcb, 0xfb, 0x74, 0x61, 0x6c, 0x5e, 0x77, 0xe0, 0x03, 0x0d, 0x47, 0x6f, 0x01, 0xd2, 0xba, 0x27, 0x1a, 0xf7, 0xce, 0x6a, 0x61, 0x0f, 0x72, 0x6b, 0x9d, 0xa3, 0x67, 0xa8, + 0x4c, 0x0e, 0xe3, 0x36, 0x7e, 0x1c, 0x50, 0x5a, 0x8d, 0x48, 0x66, 0x0c, 0x11, 0x82, 0xbb, 0xb9, 0x50, 0x1d, 0x64, 0x5d, 0xc6, 0x8a, 0x65, 0x15, 0x65, 0xc1, 0x30, 0x4b, 0x4d, 0x25, 0xe5, 0x7a, + 0x98, 0xbb, 0x1a, 0xb1, 0xac, 0x96, 0xfb, 0x5e, 0x2c, 0xe3, 0x0d, 0x18, 0x58, 0xef, 0x1e, 0xe6, 0x29, 0x46, 0x03, 0x54, 0xa7, 0x81, 0xa1, 0xbf, 0x3e, 0x90, 0x21, 0x1d, 0x6b, 0xbb, 0xdd, 0x9f, + 0x1c, 0x84, 0x4e, 0x82, 0x56, 0xea, 0x3a, 0xd7, 0x9f, 0x7d, 0xf5, 0x66, 0xda, 0xe7, 0x43, 0xb9, 0x92, 0xfa, 0x6d, 0xf4, 0xd9, 0xec, 0x73, 0x43, 0xa4, 0x1b, 0xd0, 0xa6, 0x35, 0x99, 0x10, 0x3f, + 0x43, 0x05, 0x8a, 0x1e, 0x46, 0x09, 0xc4, 0x1e, 0x87, 0x4f, 0x8f, 0xdc, 0xc8, 0xbb, 0xb1, 0xc8, 0x3b, 0x1c, 0x3e, 0xcc, 0x26, 0x0c, 0xa6, 0x5e, 0x5d, 0x20, 0x06, 0x9a, 0x74, 0x94, 0xc2, 0x38, + 0xf9, 0x2c, 0x15, 0xc9, 0xc2, 0x85, 0xa7, 0x03, 0x8a, 0xdb, 0xc7, 0x0d, 0x6e, 0xa7, 0x8f, 0x3d, 0x67, 0xdc, 0x8c, 0x36, 0x3c, 0x3a, 0x74, 0x0d, 0xe2, 0x06, 0xf7, 0x57, 0x58, 0x8a, 0x53, 0x1f, + 0x50, 0x56, 0x5b, 0x66, 0x84, 0xc1, 0xee, 0x69, 0xdc, 0x24, 0xd6, 0xc7, 0xf3, 0x00, 0x8f, 0xf2, 0x6d, 0xf1, 0xff, 0x51, 0xef, 0xca, 0x0f, 0x1c, 0x07, 0xfe, 0x1b, 0x90, 0x4b, 0x87, 0xae, 0xd7, + 0xe0, 0x80, 0x7a, 0x0c, 0x74, 0x4a, 0xc8, 0x38, 0xa2, 0xea, 0x38, 0x66, 0xe4, 0xcc, 0x20, 0xcb, 0xf0, 0xd7, 0x38, 0x4e, 0x3b, 0x61, 0x39, 0x76, 0x80, 0x77, 0x18, 0x7b, 0xa7, 0xbc, 0x1f, 0x7d, + 0x0d, 0xb2, 0xb5, 0x37, 0xf8, 0x79, 0x15, 0xfa, 0xd1, 0xc6, 0x8f, 0x6f, 0x14, 0x69, 0x22, 0x7b, 0x60, 0x47, 0xb5, 0xf5, 0x17, 0xc9, 0xc7, 0x9f, 0x9e, 0xf3, 0x19, 0x0a, 0xb7, 0x6c, 0xc6, 0x57, + 0xef, 0x17, 0xaf, 0x05, 0xce, 0x5e, 0x6b, 0x3a, 0xf9, 0x95, 0x3b, 0xc9, 0xcc, 0x43, 0x6b, 0xd4, 0x18, 0x5b, 0x4e, 0x00, 0xef, 0xb3, 0xad, 0x55, 0x7c, 0x4e, 0x69, 0x08, 0x6e, 0xf0, 0xc7, 0x93, + 0xaa, 0x48, 0x84, 0xd3, 0x36, 0x0c, 0x6f, 0x73, 0x48, 0x9e, 0x47, 0x7a, 0x3c, 0x88, 0x87, 0xbf, 0xaf, 0xf3, 0x76, 0xef, 0x3c, 0x8c, 0x75, 0x8e, 0xb7, 0xa0, 0x36, 0x25, 0x66, 0x92, 0x98, 0x55, + 0x4f, 0x67, 0x18, 0x0d, 0x3a, 0xc2, 0x84, 0xd0, 0xcc, 0x57, 0x62, 0xf4, 0x0f, 0x40, 0x20, 0xc6, 0xf7, 0xc9, 0x70, 0x15, 0x63, 0x95, 0xd5, 0x73, 0x80, 0xfc, 0x4f, 0x35, 0x43, 0x76, 0x0d, 0x63, + 0x8f, 0xd8, 0xeb, 0x62, 0xe1, 0xed, 0xca, 0x52, 0x86, 0xc3, 0xb7, 0x0c, 0x9a, 0xb2, 0x80, 0x74, 0x83, 0x45, 0x26, 0x32, 0x78, 0x5e, 0x4f, 0xbc, 0x3c, 0x8b, 0x9b, 0x1c, 0xa4, 0x87, 0x55, 0xce, + 0xd2, 0xc9, 0x5c, 0x28, 0x0a, 0x69, 0x90, 0x0a, 0x4c, 0x1a, 0x64, 0x77, 0x47, 0xa0, 0xee, 0xe6, 0xf8, 0x52, 0x69, 0xd5, 0xde, 0x03, 0x07, 0x67, 0x5d, 0xe1, 0x84, 0x29, 0x81, 0x92, 0xf2, 0x77, + 0xb8, 0xa8, 0x5d, 0x6d, 0xe5, 0xb4, 0x4a, 0xb3, 0xda, 0xf3, 0xc4, 0x76, 0x8d, 0x0d, 0x1d, 0x81, 0xbd, 0x57, 0xba, 0x2a, 0x73, 0xaa, 0xe4, 0x34, 0xa4, 0xd7, 0xa7, 0x57, 0x3b, 0xc0, 0x9f, 0xc7, + 0xc4, 0xc4, 0x40, 0x86, 0x7a, 0x84, 0x31, 0x38, 0x85, 0x92, 0x48, 0x48, 0x5c, 0xf9, 0x5b, 0x79, 0xbf, 0x83, 0x8f, 0x3b, 0x3f, 0x7c, 0x79, 0x33, 0xeb, 0x70, 0x80, 0xff, 0x1d, 0x90, 0xbb, 0xc5, + 0xbc, 0x37, 0x59, 0xb1, 0xfc, 0xef, 0x21, 0xfa, 0x6f, 0xff, 0xfd, 0x23, 0xb4, 0x3f, 0x6e, 0x96, 0xa5, 0xd7, 0xe2, 0x1f, 0xa1, 0xbd, 0xff, 0x85, 0xab, 0xf2, 0xff, 0x3b, 0x68, 0x37, 0x6f, 0x9a, + 0xf8, 0x01, 0xed, 0x7a, 0xf7, 0xa7, 0x0f, 0xfd, 0x41, 0x3e, 0xfd, 0x6b, 0x98, 0x07, 0xfe, 0xae, 0x3e, 0xff, 0x57, 0x30, 0x1f, 0xff, 0x2e, 0x9d, 0x06, 0xfe, 0xae, 0x3e, 0xff, 0x4f, 0x61, 0x1e, + 0xf8, 0x23, 0x64, 0xff, 0x35, 0xcc, 0x2f, 0x87, 0xf9, 0xc3, 0x8d, 0xfa, 0x56, 0xfe, 0x0c, 0xf3, 0x68, 0x70, 0xe5, 0x7d, 0xd7, 0xc6, 0x91, 0xfe, 0x6b, 0xeb, 0x83, 0x7f, 0x53, 0xbb, 0xff, 0x0a, + 0xf2, 0x81, 0xdf, 0x30, 0xdf, 0xf0, 0x75, 0x73, 0xb1, 0x3f, 0xa0, 0xff, 0x68, 0xa8, 0x14, 0x8f, 0x3b, 0x04, 0x34, 0x1b, 0xc1, 0x3c, 0xa5, 0x1b, 0xd2, 0x6e, 0xe2, 0x59, 0xf1, 0x28, 0x3c, 0x99, + 0x4b, 0x65, 0x95, 0xde, 0x8d, 0x25, 0xd8, 0x0b, 0x7f, 0x51, 0x6f, 0xf4, 0xa5, 0x36, 0x69, 0xd4, 0x1d, 0x74, 0xa5, 0xc9, 0x7b, 0x18, 0x41, 0x28, 0x50, 0x43, 0xef, 0xce, 0xc6, 0xd3, 0x21, 0x71, + 0x56, 0xb7, 0x9f, 0xb8, 0x3a, 0x2b, 0xac, 0x97, 0x66, 0x23, 0x66, 0x0a, 0xa5, 0xb2, 0x9b, 0xf7, 0xe8, 0xf3, 0x9c, 0xc2, 0xb9, 0xd9, 0xd0, 0x9c, 0xf1, 0xe6, 0x1b, 0x5a, 0x7a, 0xfc, 0xfc, 0x90, + 0x52, 0xfc, 0xda, 0x92, 0x76, 0x7d, 0x75, 0x72, 0x27, 0x05, 0xfb, 0xb3, 0x1b, 0x15, 0xe3, 0xf0, 0x71, 0x2b, 0x01, 0x6a, 0xc9, 0xf6, 0x0f, 0xb4, 0x28, 0x18, 0xb1, 0x22, 0x31, 0x9c, 0xa0, 0xc3, + 0x1a, 0x51, 0xbd, 0x85, 0xe2, 0xde, 0xde, 0x3e, 0x04, 0xeb, 0x8b, 0xce, 0xf4, 0xd5, 0x7d, 0x0c, 0x2b, 0x35, 0xb7, 0xf3, 0xb0, 0x73, 0x12, 0xe1, 0x94, 0x29, 0xfb, 0xd2, 0x9f, 0x5e, 0x68, 0xcb, + 0x73, 0xa5, 0x1f, 0xb0, 0x43, 0x81, 0x04, 0x36, 0x31, 0x5d, 0x6a, 0x6b, 0x16, 0xa0, 0x29, 0x62, 0x3f, 0x6d, 0x65, 0x51, 0x3b, 0xb5, 0x52, 0x8a, 0xb1, 0x39, 0xde, 0xd3, 0xfa, 0x49, 0xa3, 0xcd, + 0x60, 0x49, 0x92, 0xb3, 0x4d, 0x5c, 0xa7, 0x28, 0x89, 0x7c, 0x08, 0x73, 0xeb, 0x46, 0x71, 0xff, 0x24, 0x19, 0xd8, 0x0f, 0x44, 0x7d, 0x8a, 0x8f, 0x9a, 0xc2, 0x59, 0xee, 0xdd, 0x71, 0x75, 0x1a, + 0x2f, 0xd9, 0x63, 0x7d, 0x93, 0xbd, 0xc0, 0x00, 0xb3, 0x3e, 0xf8, 0x81, 0x01, 0x4a, 0xda, 0x33, 0x6b, 0x96, 0x26, 0xd5, 0x07, 0xa4, 0xf3, 0x13, 0x05, 0x7a, 0xee, 0xcd, 0xb8, 0x9f, 0x82, 0x9f, + 0xe5, 0x3e, 0x53, 0x09, 0xb8, 0xcf, 0x06, 0x5e, 0xaf, 0x95, 0x87, 0xff, 0xb7, 0x90, 0x0f, 0xfc, 0xeb, 0xda, 0x5d, 0x39, 0x4b, 0xda, 0x00, 0x3f, 0x74, 0x9e, 0x1d, 0xea, 0xdd, 0xc8, 0xe3, 0x5c, + 0xaf, 0xee, 0x74, 0x5f, 0x7c, 0x2c, 0xfe, 0x96, 0xfb, 0x07, 0xfc, 0x4a, 0xa5, 0x62, 0x7c, 0x12, 0x3e, 0x47, 0x87, 0xdc, 0x3c, 0xfb, 0x32, 0xbe, 0x74, 0x39, 0x3d, 0x88, 0xfa, 0x2a, 0x51, 0x1e, + 0x13, 0xa0, 0x97, 0x31, 0x4a, 0x06, 0xca, 0xac, 0x8c, 0x16, 0x53, 0x15, 0x96, 0x65, 0x49, 0x62, 0x0c, 0x4e, 0x3a, 0xa6, 0x75, 0xc3, 0x5a, 0x16, 0xc0, 0x53, 0x04, 0x77, 0x83, 0x32, 0xbc, 0x1c, + 0x6e, 0x2e, 0x5d, 0x43, 0xb0, 0x43, 0x75, 0x71, 0x19, 0x11, 0xb3, 0x17, 0xa4, 0x9b, 0xde, 0x0a, 0xfc, 0x9c, 0x44, 0x56, 0x7b, 0xa0, 0xac, 0x3d, 0x7c, 0x56, 0x75, 0xce, 0xaa, 0xd2, 0x47, 0x9f, + 0x45, 0xe7, 0xbb, 0x47, 0x1d, 0x7d, 0xf6, 0x32, 0xff, 0x74, 0x2e, 0xb1, 0xe4, 0x0a, 0x64, 0x49, 0x9a, 0x77, 0x01, 0xa7, 0x2d, 0xb6, 0x75, 0xce, 0x5c, 0xd6, 0x07, 0xb9, 0x3f, 0xc7, 0x96, 0xe6, + 0xf6, 0xb9, 0x3a, 0x69, 0x61, 0x76, 0xea, 0x15, 0x1a, 0x8f, 0xb0, 0x82, 0xe5, 0x67, 0xe0, 0x1c, 0x8f, 0x96, 0x94, 0xad, 0xbc, 0x85, 0xb0, 0xdd, 0xb6, 0x05, 0xec, 0x66, 0x8b, 0xe9, 0x35, 0xfa, + 0xf7, 0xb3, 0xcd, 0xe4, 0x07, 0x26, 0x59, 0xf9, 0x91, 0x16, 0x17, 0xf3, 0xce, 0x81, 0x86, 0xe7, 0xac, 0xd2, 0x7f, 0xe5, 0xd0, 0xf9, 0x90, 0xf0, 0xec, 0x01, 0xc9, 0xd4, 0x2e, 0x82, 0x23, 0x12, + 0x78, 0x9f, 0x37, 0x4b, 0xc0, 0x99, 0xe3, 0xb4, 0x0f, 0x18, 0x4a, 0x91, 0x87, 0xea, 0x26, 0x8f, 0x4f, 0x28, 0x34, 0xc6, 0xd5, 0xa0, 0x9a, 0x3b, 0xa3, 0xbc, 0x1c, 0xbf, 0xaf, 0x88, 0x1d, 0xe0, + 0x0f, 0x8a, 0xa9, 0x11, 0x43, 0x90, 0xed, 0x9d, 0x00, 0xaf, 0x2b, 0x2c, 0xa1, 0xb0, 0xc1, 0x74, 0xf3, 0x3c, 0x40, 0x2c, 0x54, 0x57, 0x14, 0xa9, 0xe2, 0x87, 0x5c, 0x5c, 0xda, 0x30, 0xa1, 0x6a, + 0xbd, 0xd3, 0xe3, 0x3a, 0x70, 0x3e, 0xdc, 0x07, 0x98, 0x94, 0xc8, 0xd6, 0xcd, 0xb8, 0x1d, 0x6b, 0x2c, 0x6e, 0x43, 0xfe, 0xad, 0x48, 0xa5, 0x2c, 0x9b, 0xb9, 0xff, 0x6e, 0xd1, 0x3f, 0xf6, 0x7d, + 0x31, 0x67, 0x4d, 0xd2, 0xfd, 0x0f, 0x83, 0xff, 0x38, 0xef, 0x4b, 0x6d, 0xd6, 0xfe, 0x66, 0x26, 0x2d, 0xe7, 0x58, 0x26, 0x2a, 0x57, 0x32, 0x2d, 0xd1, 0xf1, 0x4b, 0x65, 0x9e, 0xf3, 0xab, 0xbc, + 0x52, 0x8e, 0x76, 0x7f, 0x18, 0xe3, 0xeb, 0x2c, 0x2c, 0xf4, 0x71, 0xdf, 0x5d, 0xe9, 0x77, 0x63, 0xfc, 0x3f, 0x46, 0xed, 0x71, 0x4c, 0xcc, 0xc4, 0xfd, 0x57, 0x69, 0xc9, 0x6f, 0x46, 0xf8, 0x29, + 0x8a, 0xac, 0x71, 0xa4, 0xb4, 0x49, 0x28, 0x2c, 0xdf, 0x00, 0x95, 0x3f, 0x00, 0x9d, 0xe3, 0x2f, 0xd3, 0xe3, 0x61, 0x9d, 0x7b, 0x1d, 0xdf, 0x93, 0x7c, 0x8e, 0xef, 0x16, 0xfd, 0x3f, 0xc6, 0xfe, + 0x72, 0x26, 0x3f, 0x4f, 0x04, 0xf8, 0x1f, 0xcd, 0xe4, 0x2f, 0xfa, 0x4d, 0x80, 0x5f, 0x35, 0x9c, 0x50, 0xf5, 0x6a, 0xc5, 0x47, 0x36, 0x8f, 0x4e, 0x84, 0x30, 0x8d, 0xa6, 0x49, 0x87, 0x78, 0xe1, + 0x98, 0x21, 0x30, 0x6f, 0x47, 0xd1, 0xb4, 0x55, 0x51, 0x1c, 0x2f, 0xbc, 0x17, 0x13, 0xfb, 0x5c, 0xa7, 0x75, 0xbe, 0xf9, 0xab, 0x13, 0x4a, 0x92, 0xff, 0xe4, 0x29, 0xc0, 0x6d, 0xaa, 0x25, 0x9d, + 0xa4, 0x28, 0x26, 0xc5, 0x67, 0x75, 0x51, 0x22, 0x3a, 0x50, 0xf5, 0xf8, 0x80, 0x82, 0x11, 0xbd, 0x2f, 0x2d, 0x5d, 0xb2, 0x57, 0x5b, 0x5e, 0x4b, 0xb0, 0xaa, 0x56, 0x36, 0x1b, 0x59, 0x00, 0x4d, + 0xf6, 0x4c, 0xfa, 0xa4, 0xde, 0x16, 0xa0, 0xab, 0xc8, 0xb1, 0x9e, 0x76, 0x9f, 0xe7, 0x6b, 0x4e, 0x13, 0x58, 0x78, 0x5a, 0x73, 0x00, 0xb0, 0x4f, 0x30, 0x21, 0x4a, 0xc6, 0x9e, 0xe4, 0xe5, 0xe1, + 0x90, 0x7e, 0x1b, 0x62, 0x13, 0x09, 0x72, 0x3a, 0xb4, 0x99, 0x60, 0xdc, 0x81, 0x7a, 0x75, 0xe4, 0xaf, 0xb1, 0xc9, 0x40, 0x1f, 0x7c, 0x74, 0xc2, 0xa3, 0x30, 0x68, 0xe1, 0x94, 0xfc, 0xdc, 0xa2, + 0x35, 0xbd, 0x90, 0x67, 0xa5, 0xff, 0xa4, 0x9e, 0x50, 0x6c, 0x33, 0x4b, 0x83, 0xdb, 0x3b, 0x20, 0x01, 0xa6, 0x34, 0xa9, 0x1e, 0x7d, 0x07, 0xf3, 0x80, 0x98, 0xb2, 0x68, 0xf1, 0x46, 0xf4, 0x22, + 0x99, 0x43, 0x53, 0x0c, 0x08, 0x93, 0x1c, 0xf0, 0x31, 0x3e, 0xa3, 0x57, 0x9e, 0x9d, 0xd1, 0xd5, 0x91, 0x2e, 0x72, 0x49, 0x13, 0x81, 0xfa, 0xea, 0x47, 0xc5, 0xa8, 0x0c, 0x5a, 0xf0, 0xde, 0x23, + 0x8d, 0xbe, 0xf2, 0xc2, 0xdd, 0xd1, 0x26, 0x5f, 0xaa, 0x8f, 0x03, 0xd0, 0xfb, 0x30, 0x27, 0xda, 0xcb, 0x8b, 0x3a, 0xc6, 0x2c, 0x36, 0x9d, 0x44, 0xc4, 0x87, 0x2e, 0xee, 0x3b, 0x01, 0xb7, 0xc5, + 0xa6, 0xb0, 0x9f, 0x39, 0x38, 0xf4, 0x46, 0xa5, 0x11, 0x25, 0x8f, 0x40, 0x4c, 0x35, 0x26, 0x64, 0xc7, 0x1f, 0x2d, 0x46, 0x13, 0x84, 0xfe, 0x8b, 0x7e, 0x13, 0xe0, 0x47, 0xc3, 0xc9, 0x10, 0x5b, + 0xa2, 0x8f, 0xaf, 0xc5, 0xf5, 0x79, 0x42, 0xc3, 0x89, 0x5b, 0x44, 0xdc, 0x07, 0x3b, 0xeb, 0xa1, 0x9d, 0xfc, 0xfc, 0xcf, 0x6a, 0xdf, 0xbf, 0xec, 0xbb, 0x13, 0x9a, 0x85, 0xa2, 0x6d, 0xf3, 0xce, + 0x68, 0x03, 0x3a, 0x66, 0x0a, 0xd1, 0xc6, 0x30, 0xba, 0x7a, 0xaa, 0x40, 0x9b, 0x38, 0xe4, 0x07, 0x77, 0x65, 0x60, 0xcc, 0x8b, 0x9e, 0x43, 0xe9, 0xbf, 0xc4, 0xc8, 0xb7, 0x44, 0xa0, 0x6e, 0x70, + 0x30, 0x7b, 0xc8, 0x7d, 0xe9, 0x83, 0xde, 0x27, 0x4d, 0x79, 0x75, 0xfa, 0xcc, 0x72, 0x9c, 0xf9, 0x4b, 0x4e, 0xea, 0x30, 0xb9, 0x29, 0x42, 0x5e, 0xcf, 0x8a, 0xe1, 0x9d, 0xc2, 0xe7, 0xf1, 0x9a, + 0x84, 0xdb, 0x2f, 0x11, 0xd1, 0x7c, 0x38, 0x15, 0xb3, 0xc4, 0x46, 0xbb, 0xa7, 0x37, 0xfe, 0x7a, 0xb1, 0xc9, 0x30, 0x4b, 0xa6, 0x3d, 0x70, 0x0d, 0xf0, 0x89, 0x60, 0x51, 0x89, 0xe0, 0x61, 0x2c, + 0x89, 0xfd, 0xa1, 0xe9, 0x85, 0x62, 0xcc, 0xad, 0x8b, 0xf8, 0x09, 0xcd, 0x2d, 0xc8, 0xca, 0xed, 0x31, 0x82, 0xc0, 0x07, 0xf4, 0xe2, 0xbd, 0xa6, 0xd4, 0x58, 0xa6, 0xd9, 0xd7, 0xf8, 0xe9, 0x9a, + 0x97, 0x6f, 0x5e, 0x91, 0xb8, 0x04, 0x8d, 0xad, 0x3e, 0x5f, 0xfb, 0x69, 0x3e, 0x67, 0xff, 0xfe, 0xcc, 0xca, 0x0e, 0xc0, 0xc7, 0xa7, 0xf1, 0x4d, 0x0b, 0x35, 0xc1, 0x6a, 0x73, 0x74, 0x2d, 0x8d, + 0xdb, 0x66, 0xd2, 0x91, 0x58, 0x7e, 0x86, 0x70, 0xaa, 0xe3, 0xb0, 0xd1, 0x72, 0x54, 0x65, 0x10, 0x98, 0x77, 0xf5, 0x08, 0x68, 0x48, 0xb8, 0x31, 0x60, 0x0a, 0xda, 0x9c, 0x5b, 0x99, 0xed, 0x88, + 0x6b, 0xf8, 0x82, 0x40, 0x4f, 0xaf, 0x5d, 0xd2, 0xd4, 0x24, 0x83, 0xdf, 0x35, 0xb0, 0xf8, 0x9d, 0xe4, 0xf8, 0x05, 0xfc, 0x40, 0x47, 0x98, 0xcf, 0x3a, 0xa3, 0x5f, 0xce, 0x78, 0xa5, 0x5e, 0xec, + 0xd0, 0x4d, 0x66, 0x9c, 0x86, 0xfe, 0x5c, 0xef, 0xa5, 0x9a, 0xd2, 0xe1, 0x33, 0x7d, 0xd2, 0x43, 0x95, 0x91, 0x02, 0xea, 0x22, 0x8c, 0xe6, 0xb7, 0x72, 0xfc, 0x56, 0x3b, 0x6f, 0x8b, 0x4a, 0xf3, + 0xf9, 0xb7, 0x27, 0xc8, 0x7f, 0xc4, 0x37, 0xa3, 0x58, 0x8f, 0x71, 0x7e, 0x37, 0x43, 0xf5, 0xbf, 0x85, 0x6f, 0x25, 0xff, 0xe4, 0x4d, 0xe7, 0xf6, 0x7b, 0x17, 0xfe, 0x75, 0x5a, 0xd9, 0xff, 0x32, + 0xbe, 0x99, 0x71, 0xe4, 0x60, 0x29, 0xa6, 0xcc, 0x49, 0x48, 0x0c, 0xbf, 0xc0, 0xb7, 0xea, 0x32, 0x84, 0x9f, 0xf1, 0xed, 0xeb, 0xd8, 0xff, 0x3a, 0xbe, 0xfd, 0x79, 0x26, 0xff, 0x09, 0xbe, 0xad, + 0xb2, 0xa7, 0xeb, 0x67, 0xb6, 0x25, 0x84, 0xb3, 0x24, 0xa8, 0xe0, 0x8e, 0xe6, 0xd6, 0xde, 0x58, 0xef, 0x7b, 0x66, 0xe8, 0x57, 0xca, 0xa0, 0x05, 0xa1, 0xc3, 0xc7, 0x2f, 0x6a, 0x88, 0x4d, 0x59, + 0xc4, 0x91, 0x03, 0x73, 0xcb, 0xd7, 0xde, 0xe3, 0x2e, 0x0f, 0x48, 0x0d, 0x76, 0xbd, 0x14, 0xf8, 0xf0, 0x96, 0x8b, 0xaf, 0x0b, 0x79, 0xb9, 0x4f, 0xb2, 0x80, 0xda, 0x64, 0xd6, 0xb1, 0x0c, 0x71, + 0x8c, 0x0a, 0xe9, 0xea, 0x91, 0x32, 0xb6, 0x9a, 0xe4, 0xd6, 0x36, 0x70, 0x48, 0xe1, 0x93, 0xbc, 0xf6, 0x18, 0xd2, 0x16, 0x72, 0x1e, 0xba, 0x04, 0x29, 0xbd, 0x30, 0x4b, 0xb7, 0xe4, 0xcd, 0x1a, + 0x73, 0x3f, 0x17, 0x32, 0x90, 0xcb, 0x99, 0x2e, 0x75, 0x20, 0x31, 0x34, 0x18, 0xf9, 0x41, 0xf4, 0x19, 0xd3, 0x56, 0xd4, 0x9a, 0x0c, 0x9d, 0xa5, 0x1b, 0x5d, 0xfa, 0xc8, 0xad, 0x64, 0x38, 0x9f, + 0xd9, 0x55, 0xc9, 0xde, 0xe6, 0xb7, 0x34, 0x8c, 0xb4, 0xbd, 0x71, 0xfa, 0xc0, 0x75, 0x34, 0x9b, 0x77, 0x4f, 0x91, 0x2a, 0xeb, 0x63, 0x8c, 0x68, 0xac, 0xa6, 0x21, 0xab, 0x40, 0x71, 0x00, 0xb2, + 0xa4, 0x53, 0x46, 0xac, 0x6c, 0x47, 0xc3, 0x28, 0xa5, 0x06, 0xc2, 0x96, 0x44, 0xa3, 0x4c, 0xd1, 0x00, 0xd1, 0x49, 0x70, 0x14, 0xf0, 0x41, 0xa6, 0x1e, 0xd4, 0xb4, 0xd2, 0x3d, 0x57, 0xd1, 0x13, + 0x79, 0x9f, 0xe2, 0x93, 0x43, 0xaa, 0xfd, 0xa6, 0x6c, 0x78, 0x3d, 0x7a, 0x3b, 0x10, 0x0b, 0x81, 0xcb, 0x59, 0x46, 0x35, 0x8e, 0x80, 0xac, 0x52, 0xa0, 0x06, 0xe1, 0x15, 0x1c, 0xf6, 0xad, 0xa5, + 0xe7, 0xf6, 0x13, 0x26, 0x8a, 0x98, 0xad, 0x0c, 0x98, 0x23, 0xbc, 0xd1, 0x4b, 0x16, 0x3e, 0xe4, 0xe2, 0x25, 0x61, 0x28, 0xa5, 0xa8, 0x8c, 0xb1, 0x63, 0xa9, 0x61, 0x09, 0x57, 0xb9, 0xeb, 0xba, + 0x30, 0xa3, 0xb0, 0xf0, 0x77, 0xf8, 0xc6, 0x9c, 0x90, 0x4b, 0x10, 0x77, 0x72, 0xf4, 0x64, 0x63, 0x6b, 0xee, 0x51, 0x74, 0xb4, 0xed, 0x4b, 0x1e, 0x7f, 0x69, 0xf0, 0xff, 0x11, 0xbe, 0xfd, 0xde, + 0x50, 0x27, 0x77, 0xd1, 0x52, 0xc7, 0xe4, 0x47, 0xd7, 0x28, 0x64, 0xed, 0xd3, 0xfe, 0xf6, 0xd8, 0x41, 0xb3, 0x2f, 0x81, 0x47, 0x87, 0xc9, 0x80, 0x96, 0xfd, 0x53, 0x80, 0x20, 0x6f, 0xa5, 0x6f, + 0xaf, 0x34, 0x57, 0x4e, 0xde, 0x00, 0x5f, 0xf0, 0x13, 0xc3, 0x27, 0x50, 0x1b, 0xe3, 0xab, 0x07, 0x61, 0x60, 0x5e, 0x1d, 0x1c, 0xda, 0x58, 0x72, 0x87, 0x83, 0xac, 0x98, 0xbe, 0x21, 0x0a, 0x65, + 0x2f, 0xc1, 0x2a, 0xb8, 0xfe, 0x3d, 0xf1, 0xf0, 0x60, 0xc9, 0x27, 0xb3, 0x08, 0x71, 0x30, 0x35, 0xef, 0xe9, 0xde, 0xec, 0x17, 0x7c, 0xa2, 0x60, 0x06, 0x93, 0xdd, 0xbb, 0x46, 0x6c, 0x81, 0x04, + 0x10, 0xd4, 0xc5, 0x63, 0x6e, 0x30, 0xae, 0x02, 0xdd, 0x1f, 0xfe, 0xc2, 0xb9, 0x6a, 0x51, 0xf5, 0xb6, 0x48, 0x63, 0x62, 0xd8, 0x1a, 0x1f, 0xa2, 0x0b, 0xfd, 0xda, 0xaa, 0xde, 0xbb, 0x1c, 0x97, + 0x42, 0x24, 0x15, 0x41, 0xac, 0x55, 0x23, 0x94, 0x1a, 0xad, 0x43, 0x15, 0xbe, 0xb2, 0x8a, 0xa7, 0x4f, 0xd3, 0x73, 0x25, 0xf8, 0xa8, 0x94, 0x87, 0x28, 0x06, 0x84, 0x4a, 0x9c, 0x60, 0x21, 0xe6, + 0xd2, 0x2a, 0x07, 0xf7, 0x70, 0x03, 0x1e, 0x77, 0xf1, 0xde, 0xda, 0xb4, 0x2a, 0xe5, 0x42, 0xe8, 0xce, 0x31, 0x18, 0x57, 0x7c, 0x1b, 0xbb, 0x8d, 0x9a, 0xcf, 0x96, 0x78, 0x0b, 0x9c, 0x91, 0x09, + 0x03, 0xae, 0xa0, 0xb9, 0x74, 0x3d, 0x8b, 0x8a, 0xb9, 0x27, 0x0a, 0x76, 0xcf, 0x3c, 0x65, 0xde, 0x64, 0x3c, 0x07, 0x14, 0x00, 0xc5, 0xc2, 0x5e, 0xcd, 0x22, 0xc8, 0x2a, 0x56, 0x2a, 0xf0, 0xe5, + 0x39, 0xb6, 0xa5, 0xe4, 0xc4, 0xf8, 0xf3, 0xc4, 0x8a, 0x3d, 0x56, 0x1b, 0x0f, 0x83, 0xe2, 0xa9, 0xc2, 0x95, 0xea, 0xf9, 0xee, 0x58, 0xc3, 0x44, 0x12, 0x5a, 0x70, 0x05, 0x89, 0x79, 0xa1, 0xef, + 0xea, 0xcc, 0xc0, 0x4f, 0xb2, 0xee, 0xd4, 0xf2, 0xaf, 0xf1, 0xcd, 0x9a, 0x8b, 0xbe, 0xd9, 0xfa, 0xff, 0x49, 0x5b, 0xb1, 0xe0, 0x7c, 0xd9, 0x82, 0x5d, 0xe4, 0x6f, 0xc8, 0x96, 0xbe, 0x0e, 0xdf, + 0x99, 0xc5, 0x9e, 0xdd, 0xf0, 0x9f, 0xff, 0xcd, 0xf5, 0x2f, 0xc8, 0x66, 0x7b, 0xff, 0x31, 0xb2, 0xfd, 0xde, 0x9c, 0xcb, 0x31, 0xc6, 0xcf, 0x78, 0x62, 0x67, 0x7d, 0xb0, 0x26, 0x51, 0xb0, 0xfe, + 0x40, 0xb5, 0x2f, 0xa0, 0x06, 0x7c, 0x45, 0x35, 0x8f, 0xbe, 0xbf, 0x55, 0x6d, 0xf6, 0xef, 0xa8, 0xf6, 0x6d, 0xec, 0x2f, 0x67, 0xf1, 0xab, 0x49, 0x00, 0xff, 0xd1, 0x2c, 0x7e, 0x61, 0x71, 0xf7, + 0x47, 0x87, 0x3b, 0xe0, 0x4f, 0xb9, 0x8b, 0x8c, 0x56, 0x7e, 0x02, 0x08, 0xb4, 0x73, 0x2c, 0xa7, 0x62, 0x50, 0xc5, 0xa1, 0x64, 0xc1, 0xbd, 0x13, 0xef, 0xe7, 0xfb, 0xf5, 0x94, 0x28, 0x72, 0xe4, + 0xf4, 0x0f, 0x26, 0xc3, 0x55, 0x48, 0xe2, 0x6b, 0x0a, 0x16, 0x1e, 0xea, 0xc5, 0x47, 0xd2, 0xb7, 0x56, 0xdb, 0x89, 0x6d, 0x1d, 0xac, 0x03, 0xc0, 0xa8, 0xb4, 0xad, 0x88, 0x54, 0xae, 0xca, 0x1a, + 0xd3, 0x21, 0xe5, 0xcb, 0x65, 0xdf, 0xde, 0xba, 0x89, 0xe0, 0xdb, 0xc7, 0xca, 0xda, 0x3e, 0x3d, 0x51, 0x19, 0x0b, 0x45, 0x55, 0xac, 0x16, 0x62, 0x9b, 0xda, 0xde, 0x35, 0x8a, 0xed, 0x20, 0xf8, + 0xe3, 0xbc, 0x1e, 0x4d, 0x6c, 0x5c, 0xc9, 0x67, 0x2c, 0x88, 0x39, 0x06, 0xdb, 0xb6, 0x70, 0x84, 0x2c, 0x00, 0x88, 0xb2, 0xd1, 0x2f, 0xa3, 0x93, 0xf1, 0x0a, 0x0e, 0x95, 0x13, 0x2e, 0x2e, 0xd9, + 0x14, 0x94, 0xb4, 0x20, 0x3f, 0x5d, 0xc0, 0xdc, 0xb4, 0xde, 0xb8, 0x17, 0xea, 0xb4, 0xaf, 0xbd, 0x6f, 0x12, 0xaa, 0x3f, 0xc1, 0x01, 0x52, 0xc1, 0xf7, 0x73, 0x36, 0x66, 0x77, 0x79, 0x5a, 0x75, + 0xa2, 0x5c, 0x0a, 0x28, 0x8d, 0x74, 0xb0, 0x3e, 0xe0, 0x20, 0x0e, 0x16, 0x00, 0x7c, 0x4c, 0x6f, 0x2c, 0x54, 0x35, 0xec, 0xf8, 0xb2, 0x28, 0xd7, 0xe6, 0x66, 0x93, 0xa4, 0x7f, 0x6c, 0x9f, 0xd7, + 0x68, 0xe8, 0x2b, 0x1d, 0x93, 0xba, 0x5e, 0x4d, 0x3b, 0x08, 0x8b, 0x5e, 0x5c, 0x10, 0x92, 0x6e, 0x9f, 0x2a, 0x15, 0x94, 0xbb, 0xa0, 0xbb, 0x02, 0x71, 0xc5, 0xc1, 0xd5, 0xf5, 0x39, 0xca, 0xd7, + 0xba, 0x9d, 0x6d, 0x8a, 0xdf, 0xe7, 0x80, 0x68, 0x69, 0xdb, 0xf3, 0x5a, 0xcf, 0x56, 0x0b, 0x49, 0xd3, 0xce, 0x95, 0x1c, 0xba, 0x77, 0x6d, 0x52, 0x6d, 0xe6, 0x05, 0xaf, 0x1a, 0x96, 0x3f, 0x1e, + 0xb0, 0x09, 0x19, 0xe9, 0x96, 0xa0, 0x56, 0x77, 0x4f, 0xd7, 0x7d, 0xc1, 0x42, 0xb9, 0xa9, 0x3c, 0xde, 0x47, 0x38, 0x68, 0x27, 0xf4, 0x7b, 0xdf, 0xac, 0x36, 0x63, 0xb6, 0xf7, 0xd6, 0xb7, 0x84, + 0x03, 0x4c, 0x14, 0xdf, 0x9c, 0xf4, 0x67, 0x30, 0xf9, 0x7a, 0x59, 0xa0, 0x01, 0x2a, 0x93, 0x4d, 0x0c, 0x40, 0x93, 0x44, 0xc6, 0x00, 0xcf, 0x1f, 0x13, 0x47, 0xbe, 0x6b, 0x88, 0x5a, 0x1b, 0x50, + 0x46, 0xe1, 0x62, 0xa7, 0x78, 0x34, 0x15, 0xea, 0xec, 0x59, 0x90, 0x6f, 0x31, 0xb0, 0x13, 0xca, 0xb6, 0xdc, 0x7c, 0x4b, 0xeb, 0x56, 0x83, 0x9f, 0x0b, 0x65, 0xc8, 0x80, 0x0b, 0x6a, 0x32, 0x28, + 0x81, 0xee, 0x47, 0x8a, 0xc5, 0x81, 0x57, 0x3a, 0xeb, 0x63, 0x17, 0x87, 0x9d, 0x71, 0xe1, 0xfb, 0xb5, 0x6e, 0x4a, 0x79, 0xaf, 0x54, 0x78, 0x05, 0xae, 0xb4, 0x6f, 0xeb, 0xa9, 0xd3, 0x4a, 0xf9, + 0x10, 0x14, 0x7f, 0xd0, 0x1f, 0xd0, 0x68, 0xc3, 0xb9, 0x08, 0x57, 0x4d, 0x2c, 0xf4, 0xf4, 0xa3, 0x1f, 0x1e, 0x2e, 0xb1, 0xc1, 0x38, 0x40, 0x6e, 0x07, 0x23, 0xb5, 0xa7, 0x1c, 0xbc, 0xdf, 0xca, + 0x09, 0x1f, 0x18, 0xad, 0x90, 0x32, 0xb7, 0x30, 0x37, 0x1e, 0x52, 0x3d, 0x19, 0x29, 0x92, 0xce, 0xe1, 0x36, 0x61, 0x2f, 0xdc, 0x15, 0x4f, 0x2c, 0x2d, 0xde, 0x42, 0x27, 0x11, 0xf5, 0x29, 0xcf, + 0x65, 0x89, 0xcb, 0x09, 0x8b, 0x0c, 0x7c, 0xe8, 0x29, 0xd8, 0xf2, 0x38, 0xab, 0x24, 0x78, 0x11, 0x00, 0x94, 0xda, 0x62, 0x71, 0xdd, 0x61, 0xcc, 0xa5, 0xf1, 0xee, 0xb7, 0x6b, 0xcd, 0x50, 0xe0, + 0xe4, 0xaa, 0x96, 0x3a, 0xd7, 0x2c, 0x25, 0xab, 0x18, 0x22, 0x98, 0x76, 0xc1, 0xe3, 0xab, 0xb8, 0xa3, 0x4c, 0x0a, 0x7b, 0x91, 0x79, 0x08, 0x70, 0xf7, 0xd6, 0x2a, 0xda, 0x94, 0xb7, 0x04, 0x9c, + 0x85, 0xc7, 0xa0, 0x2e, 0xdb, 0x03, 0x02, 0xc9, 0xcf, 0x67, 0x04, 0x40, 0xe3, 0x46, 0x97, 0xa1, 0x57, 0xd7, 0xfe, 0xcf, 0xfd, 0x28, 0x7f, 0xde, 0xbd, 0x63, 0x74, 0x4c, 0xbe, 0x74, 0x79, 0x7d, + 0xf7, 0x94, 0x1f, 0xce, 0x53, 0x1f, 0xb8, 0xbc, 0x5b, 0xbe, 0x9c, 0xe4, 0x6c, 0xff, 0xd8, 0xa3, 0x02, 0xfc, 0x63, 0x23, 0xe0, 0x4f, 0xa7, 0xbb, 0x1c, 0xfd, 0x43, 0xa8, 0xc2, 0xde, 0x01, 0x0c, + 0xdb, 0xaf, 0x37, 0x4e, 0x12, 0xea, 0xfd, 0xd9, 0x98, 0x6b, 0x07, 0xf4, 0xc6, 0x92, 0x17, 0xb8, 0x4b, 0xfc, 0xf8, 0x44, 0x55, 0x19, 0x21, 0x3e, 0x5d, 0x2e, 0x0a, 0x54, 0x84, 0xf8, 0x7b, 0x82, + 0x39, 0x66, 0x25, 0x3b, 0xda, 0xf3, 0x55, 0x1b, 0xb2, 0x56, 0xe9, 0x98, 0xc0, 0xef, 0x30, 0x1d, 0xd8, 0x41, 0x5d, 0xc3, 0x52, 0xb6, 0xba, 0x6e, 0x61, 0xe9, 0xde, 0xeb, 0xb2, 0xd6, 0x63, 0x68, + 0x28, 0xbc, 0x1b, 0xf5, 0x0a, 0x30, 0x56, 0xe2, 0xc9, 0xa1, 0x6f, 0xaf, 0x51, 0x03, 0xc4, 0x98, 0x2a, 0x79, 0x5a, 0xd2, 0x72, 0xd6, 0x1f, 0x6d, 0x68, 0x24, 0x98, 0xb5, 0x92, 0xe4, 0x13, 0x5c, + 0x60, 0xdb, 0x68, 0x9a, 0xaa, 0x0c, 0x70, 0xeb, 0x82, 0x82, 0xa9, 0xbc, 0xe3, 0x71, 0x75, 0x0a, 0x86, 0xc6, 0xa3, 0xb9, 0x24, 0x98, 0xa7, 0x19, 0x5e, 0xd9, 0x3e, 0xf1, 0x55, 0x6b, 0xb0, 0x00, + 0xc9, 0x22, 0x2f, 0x0a, 0x49, 0xf4, 0x57, 0x0b, 0x92, 0xf6, 0xcc, 0x66, 0x9c, 0x70, 0x82, 0x5a, 0xef, 0xf7, 0x91, 0x60, 0x58, 0xb4, 0xa6, 0xe0, 0xe5, 0x87, 0x37, 0x7a, 0x17, 0x35, 0x36, 0x06, + 0x35, 0xc7, 0xc5, 0x3d, 0xa0, 0x90, 0xb3, 0x75, 0xd5, 0x35, 0x2f, 0xda, 0x69, 0x3e, 0x99, 0xb7, 0x1a, 0x39, 0x41, 0x76, 0x20, 0x6c, 0x9a, 0x02, 0xe9, 0x02, 0x1a, 0x61, 0x1c, 0x53, 0xd2, 0x67, + 0x29, 0x99, 0x53, 0xfc, 0x89, 0x80, 0x67, 0x55, 0xcb, 0x4b, 0x40, 0x0c, 0x24, 0xc2, 0xcb, 0x4a, 0x31, 0xf4, 0x4a, 0xb8, 0xba, 0x6a, 0x2c, 0x66, 0x70, 0xdb, 0xdd, 0xac, 0x50, 0x16, 0xbd, 0x9d, + 0xc0, 0x21, 0x01, 0xdb, 0xcc, 0x26, 0xb1, 0xb4, 0xda, 0xe0, 0x12, 0x3f, 0xb2, 0x6c, 0xed, 0xd9, 0x87, 0x2f, 0xa9, 0x00, 0x88, 0x1f, 0x88, 0x1c, 0xa1, 0xac, 0x69, 0xa9, 0x53, 0xa0, 0xf0, 0xb1, + 0x11, 0x9b, 0x7e, 0x1a, 0x8e, 0xe4, 0x99, 0x6a, 0xf6, 0x86, 0xf7, 0xe2, 0x1b, 0x6c, 0xd2, 0xcb, 0x7e, 0x92, 0x13, 0xf6, 0xc1, 0xc7, 0x92, 0xc1, 0x9d, 0x7d, 0x7e, 0x1a, 0x17, 0xd4, 0x35, 0xa3, + 0x77, 0x63, 0x10, 0xce, 0xa3, 0x89, 0x30, 0x8e, 0xec, 0xf3, 0x8d, 0x57, 0x7d, 0x00, 0x30, 0x6b, 0x18, 0x5c, 0x1b, 0xff, 0xee, 0xb6, 0xf5, 0x49, 0x4d, 0xba, 0xb0, 0x81, 0xc8, 0x4d, 0xba, 0x98, + 0x93, 0x7b, 0x43, 0x44, 0x5c, 0x5e, 0x8a, 0xf2, 0x44, 0x69, 0xe3, 0x60, 0x01, 0x33, 0x36, 0xb1, 0x23, 0xc1, 0xe1, 0x2a, 0x5d, 0xa4, 0xa7, 0x6e, 0xf6, 0x78, 0x7f, 0x5e, 0x34, 0xf1, 0x3a, 0x24, + 0x94, 0x16, 0x1f, 0xf5, 0xd2, 0x42, 0xa3, 0x50, 0x01, 0xf2, 0x39, 0x49, 0xaf, 0x31, 0xec, 0x6e, 0xe6, 0x0d, 0x57, 0x22, 0x78, 0xcf, 0xcc, 0xdc, 0x0e, 0x10, 0xf3, 0x70, 0x55, 0x2c, 0xa0, 0xf3, + 0x6e, 0x58, 0x3f, 0xdd, 0xf5, 0x06, 0xc7, 0x35, 0x9e, 0xc3, 0x6b, 0x33, 0x6d, 0xca, 0xd2, 0xb4, 0xdd, 0x93, 0xef, 0x0f, 0x79, 0x14, 0xd0, 0xe7, 0x0e, 0x93, 0xe0, 0x95, 0x3c, 0x45, 0x35, 0x41, + 0x3e, 0x02, 0x09, 0x03, 0x15, 0x7a, 0xce, 0x89, 0xcf, 0x79, 0x03, 0x75, 0x9f, 0x07, 0xda, 0xcd, 0x5b, 0x21, 0xac, 0x6c, 0xe9, 0x9d, 0x9f, 0x8e, 0x41, 0xd9, 0x61, 0xa2, 0x8a, 0xba, 0xa8, 0x83, + 0x38, 0x66, 0x7b, 0x8f, 0x57, 0xb0, 0x90, 0x76, 0x5a, 0xdb, 0x3f, 0xca, 0x2d, 0x31, 0x9d, 0x55, 0xcc, 0x05, 0x63, 0x96, 0x04, 0xd0, 0x16, 0xba, 0xf1, 0xe6, 0x15, 0xcd, 0x4f, 0x81, 0xfb, 0xb4, + 0xa5, 0xe5, 0xcd, 0xe1, 0x23, 0x41, 0x30, 0xf5, 0x7c, 0xf0, 0xb0, 0xb8, 0x85, 0x17, 0xfb, 0xa1, 0x0d, 0x0b, 0x85, 0x1e, 0x47, 0xd2, 0x62, 0x41, 0x2b, 0xd4, 0x1e, 0x0c, 0xb6, 0x10, 0x59, 0xa8, + 0x05, 0x8b, 0x6e, 0x74, 0x37, 0x8a, 0xce, 0xf1, 0xb2, 0xff, 0x41, 0xa8, 0xf2, 0x0b, 0x1a, 0xfe, 0x2f, 0x9e, 0x65, 0xff, 0xa7, 0x6d, 0x8e, 0x0c, 0xf4, 0x85, 0x8e, 0x5f, 0xbf, 0xc7, 0x22, 0xe7, + 0x4a, 0xd6, 0x35, 0x4b, 0x06, 0x15, 0x9d, 0x7d, 0xb0, 0xd5, 0x4b, 0xfe, 0x42, 0xc7, 0x77, 0x0b, 0xf3, 0xf4, 0xa1, 0x1f, 0xce, 0xdf, 0x90, 0x20, 0xf0, 0x4b, 0x2a, 0xfe, 0xbd, 0xf3, 0x90, 0xe3, + 0x98, 0xfc, 0x2f, 0x49, 0x50, 0xe6, 0x03, 0xce, 0xbe, 0xbf, 0xb6, 0xe4, 0x9c, 0x3a, 0x47, 0x9f, 0x80, 0xde, 0xbe, 0x4f, 0x83, 0x93, 0x0f, 0xbd, 0x75, 0x12, 0xe1, 0x80, 0xe1, 0xef, 0x3d, 0x39, + 0xbf, 0x8d, 0xe9, 0xbc, 0xff, 0x8b, 0xdb, 0x47, 0xfb, 0xe0, 0xab, 0x1f, 0x6e, 0x49, 0xeb, 0x6f, 0x5f, 0x06, 0x7c, 0xfd, 0xb6, 0x3f, 0x74, 0x66, 0xd2, 0xc7, 0x11, 0xd9, 0x61, 0xdc, 0x27, 0x91, + 0xb2, 0xfe, 0x48, 0xe7, 0xf2, 0x25, 0xa5, 0x4b, 0xc3, 0x0e, 0x49, 0xdd, 0xaf, 0x0e, 0xfb, 0x7f, 0x69, 0xa0, 0x0f, 0x7c, 0x77, 0xd0, 0x37, 0x74, 0x01, 0x4f, 0x85, 0x18, 0xe6, 0x60, 0x55, 0x20, + 0x8c, 0x34, 0x23, 0x2d, 0x45, 0x21, 0xaf, 0xda, 0xcf, 0xee, 0x50, 0xbb, 0x07, 0x36, 0xce, 0x98, 0x1b, 0xeb, 0x02, 0xeb, 0xd3, 0x22, 0xcb, 0xe1, 0x92, 0xbb, 0xed, 0x47, 0x60, 0x63, 0x8a, 0xc9, + 0xb2, 0x6b, 0xef, 0xb6, 0x9f, 0x99, 0x9a, 0x2b, 0xd4, 0xdb, 0x06, 0x8c, 0xa7, 0x49, 0x2d, 0x0b, 0xbc, 0x10, 0xef, 0xb2, 0x11, 0xb7, 0xb8, 0xdd, 0x38, 0x78, 0xd3, 0xb0, 0x96, 0xf7, 0xa8, 0x1d, + 0xe6, 0x48, 0x67, 0xf4, 0x84, 0xe0, 0x4a, 0x08, 0x3f, 0xf7, 0xea, 0x9a, 0xed, 0xa2, 0x56, 0x37, 0xee, 0xcb, 0xc1, 0xa7, 0xb5, 0x53, 0xaf, 0xff, 0x6e, 0xa0, 0x0f, 0x30, 0x8c, 0x9b, 0xcc, 0x57, + 0x47, 0x1e, 0x0c, 0x8f, 0x18, 0x6e, 0xec, 0xe8, 0x34, 0xc7, 0x25, 0x3b, 0x41, 0x23, 0xc9, 0x23, 0xb4, 0xb8, 0x6f, 0x0e, 0x53, 0x3f, 0x1c, 0x80, 0x18, 0x8f, 0xe6, 0xbe, 0x40, 0xe8, 0xaf, 0xdc, + 0x7f, 0x98, 0x96, 0x56, 0x81, 0x9f, 0x1c, 0xf4, 0x07, 0x9a, 0x63, 0xde, 0x74, 0x4b, 0x47, 0x6c, 0x69, 0x4a, 0x8d, 0xc0, 0x24, 0xf3, 0xb3, 0xa5, 0xed, 0x99, 0x92, 0x22, 0x28, 0x58, 0x92, 0x31, + 0xad, 0x4e, 0x36, 0x87, 0x09, 0xae, 0xf6, 0x90, 0x23, 0x80, 0xc4, 0xdb, 0x6b, 0xcf, 0x06, 0xbc, 0xaf, 0xea, 0xfd, 0x34, 0x08, 0x2c, 0x02, 0x88, 0x47, 0x2d, 0x3e, 0x4b, 0xb4, 0xc6, 0x07, 0x9e, + 0xd5, 0x79, 0x25, 0xae, 0x61, 0xcb, 0xf7, 0x73, 0x90, 0x84, 0x8f, 0xf7, 0x15, 0x2e, 0xa4, 0x5c, 0x76, 0x19, 0x35, 0x08, 0x14, 0x9b, 0x40, 0xbe, 0xa4, 0xa5, 0xd1, 0x51, 0x4d, 0x16, 0x11, 0x86, + 0xe0, 0x16, 0x5b, 0xd3, 0x8b, 0x78, 0x2d, 0x05, 0x8e, 0x9a, 0xe0, 0xfa, 0x92, 0x8c, 0xf4, 0x50, 0x75, 0xa0, 0xf8, 0xa7, 0xc8, 0x8c, 0x62, 0x5e, 0xb7, 0xfe, 0xbf, 0xbe, 0xae, 0x90, 0x22, 0xff, + 0xb1, 0x15, 0xff, 0x95, 0xaf, 0xe3, 0xbf, 0x5e, 0x24, 0xdc, 0x76, 0xb3, 0x2c, 0xfd, 0x31, 0x7f, 0x2c, 0x12, 0x8e, 0xe1, 0x3d, 0xfa, 0x97, 0xe6, 0x8e, 0xd2, 0xcf, 0x86, 0xc9, 0x8c, 0xae, 0xbb, + 0xf2, 0x21, 0x7f, 0xd7, 0x25, 0x01, 0xfc, 0xd9, 0x05, 0x69, 0xdf, 0x91, 0x71, 0xe4, 0xec, 0xb2, 0xe0, 0x74, 0x2f, 0xb4, 0xde, 0x52, 0xf4, 0xdc, 0x63, 0xb4, 0xeb, 0xb2, 0x8b, 0xf1, 0xb4, 0x37, + 0xbf, 0xe9, 0x6e, 0x76, 0x28, 0xf6, 0x8f, 0x76, 0x5d, 0xe2, 0xeb, 0x9d, 0x46, 0x1e, 0xc2, 0xff, 0xcd, 0x3e, 0x07, 0xf8, 0x91, 0xfa, 0xf0, 0xfd, 0x82, 0xe3, 0x94, 0x5b, 0xba, 0xfa, 0x71, 0x51, + 0x24, 0xfa, 0x5f, 0x2f, 0x82, 0xbe, 0xbc, 0xcf, 0xdf, 0x56, 0x9b, 0x18, 0xbc, 0x65, 0x9e, 0xe8, 0x72, 0x29, 0xdf, 0xb3, 0x7e, 0xf9, 0x43, 0xdc, 0x5d, 0x75, 0xea, 0x9c, 0x7c, 0x01, 0xba, 0x27, + 0x1f, 0xc6, 0xad, 0x63, 0x7f, 0xce, 0xbb, 0xfb, 0x3e, 0xd6, 0x32, 0xe0, 0x4f, 0x82, 0x74, 0xdb, 0xe3, 0xf8, 0x46, 0x67, 0xe9, 0x1f, 0x7d, 0xc2, 0x71, 0x10, 0x12, 0x53, 0xd1, 0x07, 0x70, 0x7a, + 0x31, 0x3e, 0xf0, 0xe3, 0x2e, 0xeb, 0xfb, 0x55, 0x56, 0xe5, 0x5f, 0x04, 0xa3, 0xb5, 0xbf, 0xe7, 0x1c, 0xb1, 0xa7, 0x5e, 0x7c, 0x7d, 0x1c, 0xe9, 0xcb, 0xda, 0xff, 0xa7, 0x9c, 0xa3, 0xdf, 0x7f, + 0x81, 0x1c, 0x7f, 0x76, 0xbf, 0xfd, 0x3e, 0xbe, 0x2d, 0x5d, 0xa7, 0x8b, 0xff, 0x70, 0x46, 0xf0, 0x35, 0x2f, 0xf5, 0x6f, 0x3c, 0x77, 0x80, 0x9f, 0xcf, 0x08, 0x70, 0x68, 0xa5, 0x46, 0x4c, 0x25, + 0x8f, 0x9d, 0x53, 0x04, 0xb9, 0x44, 0x92, 0x43, 0x30, 0xf1, 0x90, 0xa0, 0x99, 0xc7, 0xb4, 0x2a, 0x08, 0x02, 0x51, 0xc8, 0xb2, 0x2e, 0xc8, 0x2c, 0xf9, 0x01, 0x38, 0x4f, 0x9c, 0xda, 0xbf, 0x5e, + 0x05, 0x9a, 0x56, 0xa0, 0x08, 0xb7, 0x34, 0x0b, 0x74, 0x50, 0x1b, 0x25, 0x41, 0x51, 0x8b, 0x5c, 0x97, 0x27, 0xbd, 0x43, 0x9c, 0x95, 0x10, 0xcf, 0xdc, 0x71, 0xba, 0x6d, 0xfd, 0x84, 0x2b, 0xcf, + 0x75, 0xaf, 0x76, 0x94, 0x85, 0xe7, 0x83, 0x21, 0x35, 0xdd, 0x8b, 0xac, 0xf4, 0x49, 0x12, 0xd6, 0x89, 0xa4, 0x41, 0xf8, 0x29, 0xc2, 0xa6, 0x9c, 0xef, 0x0f, 0xda, 0xfa, 0x32, 0x1e, 0xc7, 0xca, + 0xf3, 0xa9, 0x00, 0xca, 0xe3, 0x5a, 0xd2, 0x41, 0xe5, 0x24, 0x8e, 0xb9, 0x30, 0x90, 0x6d, 0xc8, 0x5c, 0xab, 0x73, 0xc9, 0x8f, 0x77, 0xf7, 0x53, 0x14, 0x67, 0xe0, 0x33, 0xcc, 0x1e, 0xd9, 0x77, + 0xbf, 0x06, 0x6e, 0x2b, 0xe0, 0xf5, 0xe7, 0x41, 0xe9, 0xdc, 0x7b, 0x6e, 0x6b, 0x45, 0x7f, 0x9e, 0x68, 0x1d, 0x3f, 0x09, 0x27, 0x57, 0xdf, 0xc3, 0x2e, 0xbb, 0xad, 0x20, 0xe1, 0x40, 0x69, 0xda, + 0x6b, 0x09, 0x85, 0x4b, 0x04, 0x2e, 0xe1, 0xf0, 0xe0, 0x57, 0x38, 0x9d, 0xf5, 0xb7, 0xaf, 0x60, 0x1e, 0x1b, 0x29, 0x6f, 0xae, 0xde, 0x51, 0x88, 0xd3, 0x41, 0x1c, 0x2f, 0x3a, 0xe4, 0x0d, 0x22, + 0x21, 0x63, 0x12, 0x95, 0x3f, 0x3e, 0xfc, 0x8e, 0xe0, 0xe1, 0x8d, 0x74, 0x8d, 0x65, 0x07, 0x23, 0xcd, 0x33, 0xb3, 0x19, 0x94, 0xa8, 0x0a, 0x06, 0xb2, 0x3d, 0x84, 0x6d, 0xfd, 0x79, 0xd2, 0x99, + 0xb5, 0x60, 0x35, 0xbf, 0x0a, 0x08, 0x5c, 0x6e, 0x02, 0xe7, 0x44, 0x75, 0x3f, 0x24, 0x39, 0x2e, 0xe9, 0x57, 0xab, 0xfa, 0x4a, 0x44, 0x4c, 0x88, 0xa7, 0x05, 0x72, 0x6c, 0x3b, 0xc9, 0x40, 0xb8, + 0x7f, 0x3e, 0x23, 0xf8, 0x0d, 0x7c, 0x80, 0x3f, 0xa1, 0xcf, 0x9f, 0xc3, 0x92, 0xe4, 0x7c, 0xc1, 0x34, 0x06, 0x7a, 0xbe, 0xa9, 0x25, 0x32, 0x1e, 0xe9, 0x66, 0xef, 0xa6, 0xca, 0x1b, 0x70, 0x8c, + 0x50, 0x7f, 0x71, 0x17, 0xf4, 0xb3, 0x77, 0xc7, 0x1f, 0x4c, 0x77, 0x92, 0x71, 0x76, 0x35, 0x93, 0xf6, 0xd0, 0x7e, 0x84, 0xa8, 0x06, 0xe6, 0x9b, 0xbc, 0x41, 0x88, 0x6b, 0x91, 0x6a, 0x1e, 0xa7, + 0x8e, 0x6c, 0x3e, 0x06, 0x4a, 0x86, 0x5b, 0x72, 0x77, 0x67, 0x7e, 0x0b, 0x7c, 0x7e, 0x75, 0xd8, 0x16, 0x68, 0xdd, 0xb2, 0x60, 0x71, 0xa5, 0x85, 0xcd, 0x47, 0xc1, 0x71, 0x39, 0x61, 0x07, 0x4b, + 0xb3, 0xcc, 0x6c, 0x62, 0x07, 0x57, 0x9f, 0x99, 0x9c, 0x0f, 0x4b, 0xa5, 0x26, 0x53, 0x5f, 0x10, 0xf3, 0x0c, 0x35, 0x50, 0x98, 0x38, 0x1b, 0x8b, 0x3f, 0xf3, 0xb3, 0xae, 0x02, 0x2e, 0x66, 0x3e, + 0xe1, 0x08, 0x11, 0x3e, 0x06, 0xab, 0x33, 0x88, 0xcf, 0x16, 0x02, 0xf4, 0x2e, 0x22, 0xd4, 0xf2, 0xdc, 0xd9, 0xd5, 0x10, 0xe5, 0xb4, 0xbc, 0x53, 0xf8, 0xf0, 0xea, 0x8b, 0xfe, 0xa9, 0x50, 0x8e, + 0xd4, 0xa6, 0xa3, 0xe1, 0xd4, 0x27, 0x76, 0x9f, 0xee, 0x5b, 0xd2, 0xfa, 0xb7, 0x9e, 0xb9, 0x99, 0x2a, 0xd9, 0x9c, 0x61, 0x3d, 0x6f, 0xd1, 0x4d, 0x3a, 0xd2, 0x46, 0xe0, 0xf5, 0x26, 0xa3, 0x73, + 0x48, 0x47, 0x85, 0x48, 0x5a, 0x20, 0x5e, 0xb1, 0x7a, 0xde, 0x15, 0x26, 0x7c, 0x7e, 0x5e, 0xc1, 0x68, 0xdc, 0x99, 0xe9, 0x8a, 0xe2, 0x2a, 0x9f, 0x76, 0x3a, 0xee, 0x7b, 0x03, 0x7b, 0xe1, 0x10, + 0xef, 0xde, 0x56, 0x9b, 0x95, 0x8d, 0x43, 0xe1, 0xa1, 0x37, 0x23, 0xa3, 0x82, 0x71, 0x57, 0x39, 0xee, 0xb2, 0x70, 0xa7, 0x66, 0x7f, 0xd4, 0x06, 0x0d, 0x05, 0x90, 0x26, 0x02, 0xed, 0x94, 0x01, + 0x18, 0x7b, 0x0d, 0x43, 0x3c, 0xae, 0xcc, 0x27, 0x55, 0x1e, 0xdc, 0xe0, 0x7e, 0xa8, 0xad, 0xec, 0xab, 0x65, 0xa0, 0x5b, 0x7f, 0x5a, 0x7c, 0x36, 0x20, 0xa0, 0x61, 0x1c, 0x84, 0x50, 0x16, 0xfd, + 0x34, 0x5c, 0x6f, 0x0f, 0x29, 0x17, 0x9c, 0xe8, 0xd7, 0x37, 0xfe, 0x0c, 0x24, 0xcc, 0xbb, 0xfe, 0xde, 0x4a, 0xd7, 0x0b, 0x59, 0xfa, 0xff, 0xb2, 0xf7, 0x3e, 0x57, 0x7c, 0xc1, 0xe2, 0xde, 0xfc, + 0x27, 0x5b, 0xb2, 0xf2, 0x27, 0xc0, 0xf2, 0x83, 0x9b, 0x77, 0x75, 0x86, 0xfe, 0x21, 0xf3, 0x57, 0x80, 0x80, 0x17, 0x94, 0x00, 0x16, 0x4c, 0xcd, 0x37, 0x98, 0x3f, 0xdc, 0x68, 0x6b, 0x1c, 0x9d, + 0xff, 0xe6, 0xd3, 0xa0, 0xbb, 0xe3, 0xa1, 0xfe, 0x68, 0xf3, 0x65, 0x05, 0x3f, 0x80, 0x0d, 0xe6, 0x37, 0xc7, 0x84, 0x3f, 0xe0, 0x31, 0xf0, 0xc7, 0x14, 0x9e, 0x9f, 0x73, 0x86, 0x4c, 0x4e, 0xc6, + 0x75, 0x2e, 0xbb, 0x0c, 0x4e, 0xbf, 0xbf, 0xf5, 0xfb, 0xd0, 0xdf, 0xe1, 0xd5, 0xff, 0x9e, 0x33, 0xf4, 0xe7, 0xd9, 0x02, 0xbf, 0x9a, 0xee, 0xff, 0x74, 0xb6, 0xc0, 0xaf, 0xa6, 0xfb, 0xab, 0xd9, + 0xfe, 0x9b, 0x60, 0x15, 0xe0, 0x7b, 0xd6, 0xe8, 0x51, 0x0e, 0x2a, 0x3e, 0xd1, 0xa6, 0x4f, 0x7c, 0xca, 0x82, 0xf5, 0x1a, 0xc7, 0xad, 0x05, 0xba, 0x26, 0xf3, 0x67, 0x18, 0xda, 0x7e, 0xf1, 0xf0, + 0x1d, 0xde, 0xc0, 0xc0, 0x9d, 0x8a, 0xe8, 0x0d, 0x49, 0x9b, 0xda, 0x8d, 0x60, 0x23, 0x92, 0x2d, 0x50, 0xb0, 0x6c, 0xbb, 0x10, 0x78, 0x3a, 0x53, 0x61, 0x49, 0xd7, 0x4f, 0xc0, 0xae, 0x63, 0xa9, + 0xf6, 0xf4, 0x26, 0x9f, 0x65, 0x35, 0x3d, 0xa0, 0x4e, 0x09, 0x18, 0xab, 0x7e, 0x25, 0xe0, 0x4e, 0x54, 0x1b, 0x2f, 0x66, 0xc5, 0x5e, 0xf3, 0x42, 0x5d, 0x85, 0xf6, 0x29, 0x0c, 0x76, 0x29, 0x55, + 0xf6, 0x22, 0x33, 0xd9, 0x0a, 0x4a, 0x92, 0x8a, 0x45, 0x5a, 0xa9, 0x80, 0xdb, 0x9a, 0x8b, 0xb9, 0x7c, 0xe7, 0xed, 0x44, 0x9d, 0x2c, 0x30, 0x36, 0xa8, 0xcb, 0x30, 0xab, 0x7d, 0x44, 0x1b, 0x6e, + 0xd5, 0xbb, 0x12, 0x54, 0xae, 0xa6, 0x21, 0x6a, 0x3a, 0x27, 0x5d, 0x48, 0x66, 0x12, 0x34, 0x27, 0xdd, 0xab, 0xbe, 0x59, 0xb4, 0x2a, 0x8b, 0xc8, 0x29, 0x8f, 0x38, 0xb8, 0x97, 0x39, 0x05, 0x1d, + 0x89, 0x52, 0x3a, 0x01, 0xaa, 0xb1, 0x13, 0x54, 0x8a, 0xb6, 0x61, 0x60, 0x4c, 0x12, 0x2e, 0x0b, 0xc0, 0xa5, 0x57, 0xd7, 0x77, 0x1c, 0x3e, 0x0a, 0x1e, 0xe4, 0x28, 0x0c, 0x2a, 0x53, 0xf2, 0x75, + 0x2e, 0xe6, 0xcc, 0xcc, 0xd0, 0x13, 0x7c, 0x40, 0xf7, 0x1c, 0xa1, 0xee, 0xab, 0x52, 0x52, 0x35, 0xd7, 0x91, 0x91, 0x30, 0x13, 0x1b, 0x75, 0xaa, 0x28, 0xd5, 0x48, 0x7d, 0x7f, 0x3e, 0x18, 0x95, + 0x32, 0x6c, 0x71, 0x26, 0x4e, 0xd0, 0xda, 0x65, 0x08, 0x99, 0x81, 0x0b, 0xf4, 0xad, 0xe6, 0xae, 0x8c, 0x47, 0x35, 0x3f, 0xa1, 0x0a, 0x7c, 0x0d, 0x37, 0x7d, 0x62, 0xe1, 0xe9, 0xc6, 0x65, 0xaf, + 0x55, 0x29, 0xde, 0xe0, 0xce, 0xf9, 0xa2, 0x1f, 0x1f, 0x47, 0xc4, 0xdf, 0xd2, 0x8f, 0x60, 0x95, 0xaf, 0xc5, 0xdd, 0x5f, 0x38, 0x33, 0xfe, 0xba, 0x90, 0xfb, 0x73, 0x53, 0xec, 0xc7, 0x14, 0x96, + 0xbe, 0xcd, 0x49, 0x2d, 0xdc, 0x15, 0xab, 0xe8, 0x5c, 0x4e, 0x74, 0xda, 0x96, 0xe5, 0xc2, 0x7e, 0xfb, 0x03, 0x31, 0x02, 0x3f, 0x67, 0x96, 0x58, 0x46, 0x80, 0x59, 0xf9, 0x5c, 0x36, 0xe9, 0x47, + 0xe2, 0xe8, 0xda, 0x4f, 0x1a, 0xc6, 0x7e, 0xcf, 0xe4, 0x61, 0x7b, 0x28, 0xa1, 0xf4, 0x2e, 0xc7, 0x36, 0xd0, 0x68, 0xeb, 0x6c, 0xa4, 0xb2, 0x05, 0xab, 0xf3, 0xb3, 0xf2, 0x86, 0xa8, 0x0f, 0x41, + 0xbe, 0xe8, 0x12, 0xef, 0x58, 0xa0, 0x5f, 0x5f, 0x0e, 0x11, 0x58, 0xa6, 0xf6, 0xbc, 0x2f, 0xb4, 0x8a, 0x78, 0x68, 0x53, 0xec, 0x93, 0xfb, 0x88, 0x65, 0x76, 0x27, 0x65, 0x4d, 0x2b, 0x26, 0x21, + 0x23, 0x6a, 0x67, 0x5e, 0xd0, 0xb6, 0xcc, 0x4c, 0xde, 0x2d, 0x51, 0x91, 0xda, 0x0f, 0xca, 0xf8, 0xc4, 0x13, 0x1e, 0xa8, 0x72, 0x40, 0x92, 0xb2, 0x4c, 0xcf, 0x0c, 0x39, 0xb0, 0x61, 0x17, 0x02, + 0xf6, 0x6a, 0x8c, 0xbe, 0xd3, 0x80, 0x81, 0xf2, 0x81, 0x1c, 0x5e, 0x24, 0xdd, 0x14, 0xaf, 0xb6, 0xbe, 0xcb, 0x1e, 0x73, 0x8d, 0xdd, 0x19, 0xb1, 0x48, 0x24, 0xca, 0x75, 0x75, 0x4d, 0x71, 0xb3, + 0xef, 0x9b, 0x2f, 0xef, 0x54, 0xcd, 0xf7, 0x3a, 0x12, 0xc4, 0x43, 0x1a, 0xa6, 0x2b, 0x1c, 0xcd, 0xbb, 0x08, 0xa1, 0x7d, 0xb5, 0x6e, 0x9b, 0xfd, 0x04, 0x2f, 0xc0, 0x83, 0xd3, 0x12, 0x44, 0x11, + 0x22, 0x2c, 0x55, 0x5e, 0xee, 0xd4, 0x8d, 0x7b, 0xde, 0x8f, 0x92, 0xdb, 0x87, 0x64, 0x99, 0xa4, 0x57, 0x66, 0x90, 0xa0, 0x61, 0xba, 0x0c, 0x03, 0xe2, 0xb2, 0xec, 0xd5, 0x46, 0x67, 0x87, 0x27, + 0xcc, 0x15, 0x26, 0x3e, 0xdd, 0x98, 0x01, 0x89, 0xac, 0x7f, 0x97, 0x0f, 0x63, 0x86, 0x10, 0xc1, 0x60, 0xc7, 0x6c, 0xb8, 0x80, 0x57, 0x0d, 0x37, 0xd5, 0x7d, 0x45, 0x67, 0xf9, 0x8e, 0x5f, 0x4d, + 0xb1, 0xc4, 0xae, 0x16, 0xc1, 0xf7, 0x2d, 0x12, 0x2f, 0xf2, 0xf2, 0x9f, 0xa7, 0x72, 0xcf, 0xc7, 0x01, 0x0d, 0x8b, 0xa9, 0x13, 0xdc, 0xe3, 0x91, 0xcb, 0xfe, 0xdb, 0x79, 0x4a, 0xf3, 0x3f, 0xec, + 0xe9, 0xbe, 0x3a, 0x36, 0x36, 0xeb, 0xf5, 0xf5, 0x5e, 0x7c, 0x1b, 0x7e, 0xa0, 0xe6, 0x37, 0xf7, 0xc6, 0x7f, 0x52, 0x3e, 0xfd, 0x23, 0x60, 0xe6, 0x5f, 0x00, 0xb3, 0x03, 0xff, 0x41, 0xe5, 0xc4, + 0xe4, 0xbf, 0xf0, 0x71, 0xec, 0x74, 0x56, 0xff, 0x51, 0xe1, 0x65, 0x80, 0x0f, 0x07, 0x9c, 0x07, 0xff, 0x28, 0xbc, 0xec, 0xca, 0xc7, 0xba, 0x2f, 0x75, 0xe5, 0x9a, 0x5d, 0x0c, 0xe7, 0x5d, 0xf8, + 0xe2, 0x09, 0x0e, 0xff, 0x73, 0x95, 0xf7, 0xdd, 0xbf, 0xf1, 0xab, 0x00, 0xc7, 0x46, 0xa9, 0x35, 0x8d, 0x82, 0xed, 0x8f, 0x80, 0xe9, 0x7e, 0xf7, 0x73, 0xfc, 0x83, 0x28, 0xc9, 0xbf, 0xbe, 0xba, + 0x32, 0x70, 0xf4, 0x6d, 0x06, 0xdf, 0x53, 0xee, 0xff, 0x3c, 0x76, 0x44, 0x3f, 0xe7, 0xce, 0xb9, 0x1d, 0xfd, 0xb3, 0xb6, 0x4a, 0xb0, 0x61, 0xca, 0x90, 0x85, 0xef, 0x29, 0xf7, 0x82, 0x41, 0x7c, + 0x29, 0x15, 0xd3, 0x48, 0xaf, 0x6c, 0xf8, 0xb9, 0x69, 0xfc, 0xe9, 0x3b, 0x7f, 0x72, 0x19, 0x5b, 0x3c, 0xe9, 0x7b, 0xf6, 0x3e, 0xf0, 0xa5, 0xe8, 0x94, 0x79, 0x63, 0x4f, 0x43, 0x04, 0x49, 0xff, + 0x50, 0x94, 0x7e, 0xd5, 0x18, 0x7d, 0x41, 0xd9, 0x7f, 0xa1, 0x21, 0xfa, 0x21, 0x21, 0x02, 0x68, 0x83, 0x0e, 0xcc, 0x40, 0x3d, 0xfd, 0xd9, 0x24, 0xcf, 0xa0, 0x67, 0x4f, 0x01, 0x71, 0xe7, 0x76, + 0xe2, 0xe2, 0x17, 0xa3, 0x9d, 0x90, 0x1a, 0xee, 0xc6, 0x82, 0x76, 0x54, 0xd2, 0xc7, 0xf2, 0x35, 0x46, 0x3b, 0xd7, 0xb2, 0xf5, 0x8d, 0x61, 0x44, 0x46, 0xb9, 0xe4, 0x03, 0x8d, 0x8a, 0xa3, 0x5e, + 0x7d, 0x71, 0xbe, 0xd3, 0x0e, 0xcc, 0x27, 0x10, 0x04, 0x40, 0x0f, 0x47, 0x0d, 0x95, 0x7e, 0x1c, 0xe5, 0xeb, 0xe4, 0xfd, 0x00, 0x7e, 0xdf, 0x48, 0x54, 0xe9, 0x11, 0xd1, 0xc4, 0x83, 0x4a, 0x24, + 0xeb, 0x07, 0xd1, 0xa2, 0xc4, 0x8e, 0x69, 0xfb, 0xc8, 0xd3, 0xd0, 0x1e, 0x07, 0x76, 0x87, 0x6c, 0x9c, 0x9f, 0x02, 0x3d, 0xa0, 0x23, 0xcc, 0xd8, 0x1c, 0xa1, 0xc2, 0x16, 0x3f, 0xce, 0xd3, 0x8c, + 0xe3, 0x31, 0x07, 0xc0, 0x06, 0x5c, 0xff, 0xdc, 0x3b, 0x2f, 0xa4, 0x38, 0x19, 0x7c, 0xe2, 0x24, 0xc5, 0xe2, 0xc9, 0xff, 0x74, 0xe4, 0x96, 0xb5, 0x73, 0x32, 0x4d, 0xb9, 0xbf, 0xd2, 0x2b, 0xdb, + 0x2f, 0x88, 0x50, 0xbd, 0xed, 0xda, 0x60, 0x3e, 0x57, 0x3b, 0x8a, 0x34, 0x97, 0x4b, 0x84, 0x44, 0x44, 0xde, 0x0d, 0x6a, 0x24, 0x5a, 0xe0, 0x8d, 0x3a, 0x0b, 0x7b, 0x67, 0x04, 0xc0, 0x32, 0x49, + 0x7c, 0x99, 0xf6, 0x47, 0xed, 0xbc, 0xc5, 0x82, 0x7d, 0xa4, 0x2f, 0x67, 0x26, 0xeb, 0x32, 0x50, 0xdf, 0x89, 0x34, 0x08, 0x6b, 0x68, 0x8e, 0xed, 0x50, 0x76, 0x5a, 0x7d, 0x48, 0x57, 0x05, 0x35, + 0xd0, 0x49, 0x47, 0xbd, 0xc9, 0x59, 0xb2, 0xfe, 0x11, 0xa7, 0x6e, 0xbe, 0x29, 0x22, 0x4e, 0xda, 0xfd, 0x99, 0x9e, 0x69, 0x24, 0x41, 0x88, 0x0a, 0xf0, 0xe6, 0x6a, 0x56, 0xf5, 0x8b, 0x9c, 0xd9, + 0x4c, 0xf7, 0x21, 0x71, 0x45, 0x5c, 0xf7, 0x48, 0x0e, 0xc3, 0x3e, 0x5c, 0xf8, 0x29, 0xac, 0x08, 0x6f, 0xb0, 0x59, 0x92, 0x97, 0xcb, 0x5f, 0x1f, 0x2c, 0xd2, 0x1f, 0xe1, 0x13, 0xe5, 0x1d, 0x13, + 0xd7, 0x4f, 0xc0, 0x96, 0x25, 0x9c, 0x23, 0xb2, 0xc5, 0xb4, 0x78, 0xf5, 0xc1, 0xdd, 0xd6, 0x5f, 0xec, 0x78, 0xff, 0x62, 0x77, 0xfc, 0x67, 0x3a, 0x04, 0xfe, 0xa0, 0x21, 0xd2, 0xcd, 0x8f, 0xc1, + 0xcf, 0x5a, 0x27, 0x2c, 0x59, 0xe1, 0x95, 0x4b, 0xa5, 0xb1, 0x6f, 0xad, 0x8c, 0xcd, 0x31, 0x7b, 0x74, 0xdd, 0xc2, 0x6a, 0x1f, 0x25, 0x42, 0x67, 0xd5, 0x9d, 0xc2, 0xa2, 0x18, 0x9f, 0xd2, 0x99, + 0x4f, 0x42, 0x36, 0x2a, 0x27, 0xd7, 0xce, 0xee, 0x2d, 0x82, 0xc3, 0xaa, 0xf2, 0x2d, 0xb0, 0x41, 0xaf, 0xf7, 0xf0, 0x5c, 0x22, 0x68, 0xbc, 0xfa, 0x7b, 0xd1, 0x5c, 0xf4, 0x79, 0x19, 0x90, 0x24, + 0x3d, 0xe9, 0x6b, 0x60, 0x52, 0x01, 0xbe, 0x23, 0xd4, 0x45, 0x63, 0x6f, 0x53, 0xd2, 0xb3, 0x46, 0x0b, 0x2b, 0xca, 0xc6, 0x77, 0x55, 0x8a, 0x1e, 0x68, 0xbe, 0xc1, 0xfd, 0x04, 0xeb, 0x72, 0xbb, + 0xfd, 0x47, 0xcb, 0x30, 0x4a, 0x80, 0x6c, 0xd1, 0x1b, 0xc0, 0xca, 0x05, 0x64, 0xa2, 0xbb, 0x91, 0x82, 0x87, 0x38, 0x3d, 0xae, 0xc8, 0x43, 0x2b, 0x92, 0x2a, 0xde, 0x1b, 0xfb, 0x36, 0xd1, 0x19, + 0xc9, 0xb3, 0x57, 0x5f, 0x3f, 0x57, 0x08, 0x6d, 0x9b, 0xd1, 0xad, 0x66, 0x51, 0x05, 0xd5, 0xa3, 0x97, 0x0c, 0x8b, 0xf9, 0xd0, 0xe9, 0x96, 0xaa, 0xc1, 0xeb, 0x09, 0x55, 0x34, 0x76, 0x5f, 0xc6, + 0xf2, 0xf4, 0xc9, 0x0f, 0xb0, 0x0e, 0x8e, 0xc8, 0xf7, 0x97, 0xf3, 0x68, 0xbd, 0xe0, 0xa1, 0x7c, 0x1c, 0x02, 0x76, 0xc1, 0x37, 0x27, 0x5c, 0x88, 0xff, 0x66, 0xa9, 0x4a, 0xeb, 0x28, 0x06, 0x9a, + 0x4b, 0xa3, 0x0f, 0x83, 0x64, 0x80, 0x1e, 0xf2, 0x4c, 0xf4, 0x7e, 0x09, 0x19, 0xc1, 0xc8, 0x7e, 0x2a, 0x4f, 0x6b, 0xba, 0x4d, 0xca, 0xdc, 0xde, 0xd9, 0x13, 0x17, 0x2e, 0x2a, 0x94, 0x02, 0xfa, + 0x3d, 0x88, 0xe4, 0x83, 0x96, 0x64, 0x27, 0x83, 0xdc, 0x76, 0x70, 0x18, 0xff, 0xad, 0x4d, 0x8f, 0x17, 0x56, 0x25, 0x41, 0xde, 0xaa, 0xe3, 0x1d, 0x8d, 0xfc, 0x58, 0xaa, 0x39, 0xa5, 0x80, 0x0b, + 0x3d, 0x8f, 0x30, 0xf6, 0xb7, 0x87, 0x5f, 0xd9, 0x9a, 0x74, 0xcd, 0xf2, 0xb5, 0x9e, 0x2c, 0x86, 0xf5, 0x8f, 0x40, 0xf9, 0xb7, 0x1b, 0xfc, 0x7f, 0x05, 0x94, 0xc2, 0xd7, 0x5d, 0x3e, 0xf9, 0x5b, + 0x65, 0x29, 0x07, 0xc7, 0xe8, 0x74, 0xb0, 0xc6, 0xe3, 0xcf, 0x5f, 0x6b, 0x8a, 0x92, 0x9f, 0xad, 0xbc, 0x03, 0xfb, 0xe4, 0x5a, 0x5a, 0xff, 0x7e, 0x33, 0x95, 0xe9, 0x8c, 0x8f, 0x4c, 0xa9, 0x28, + 0x6c, 0x3f, 0x65, 0x26, 0x31, 0x2f, 0xcc, 0xa9, 0x53, 0xb1, 0xbb, 0x65, 0x41, 0xdf, 0x32, 0x96, 0x60, 0xb4, 0xe6, 0x79, 0xe8, 0xb7, 0x8e, 0x98, 0x9c, 0x7f, 0xe9, 0xdc, 0x1b, 0x35, 0xee, 0xdf, + 0x41, 0x14, 0xa0, 0x8f, 0xa3, 0xb0, 0x43, 0x03, 0x7e, 0x85, 0xe7, 0x94, 0x5d, 0xdf, 0x6a, 0xb6, 0x38, 0x24, 0xe0, 0x3f, 0xd4, 0x71, 0xbf, 0x17, 0x80, 0xdf, 0xae, 0xb4, 0x4e, 0x9d, 0x7b, 0x5f, + 0x5f, 0xdd, 0xc8, 0x5b, 0xf9, 0xd0, 0x7f, 0xe8, 0x90, 0xb8, 0xf7, 0x05, 0xfc, 0x61, 0xf0, 0x2f, 0xa7, 0xff, 0x6f, 0x67, 0x0f, 0xfc, 0x9b, 0xe9, 0xff, 0xdb, 0xd9, 0x03, 0xdf, 0x77, 0xee, 0x7f, + 0x7b, 0x17, 0xf6, 0xc7, 0xab, 0xb0, 0xe9, 0x99, 0xf2, 0x93, 0xdb, 0xbf, 0x35, 0x13, 0xea, 0x44, 0x3d, 0x3c, 0x7c, 0xd5, 0xd8, 0x7d, 0x6f, 0x2b, 0xd9, 0x6e, 0x56, 0x80, 0xe3, 0x5d, 0xe1, 0xec, + 0x22, 0x67, 0x23, 0x53, 0x43, 0xef, 0x34, 0x94, 0x36, 0x9f, 0x86, 0x30, 0x07, 0x19, 0xa5, 0xa3, 0xe1, 0x10, 0x17, 0x2e, 0x1a, 0x95, 0xc3, 0x5b, 0x24, 0xb1, 0xd2, 0xf8, 0xcd, 0xbe, 0x27, 0x3a, + 0x44, 0x82, 0xa7, 0x9c, 0xca, 0x43, 0x84, 0x27, 0xd7, 0x53, 0xd6, 0xd5, 0x13, 0x97, 0x0d, 0xa7, 0xe9, 0x3b, 0x83, 0x56, 0xe2, 0x04, 0x48, 0x2f, 0x88, 0x76, 0x24, 0xb2, 0xe5, 0x36, 0xd7, 0xb9, + 0x83, 0x76, 0xc3, 0xac, 0x5d, 0x92, 0xde, 0x81, 0x84, 0xb9, 0x05, 0xc1, 0xd2, 0x62, 0x39, 0x35, 0x7c, 0x4e, 0xf9, 0xfc, 0xaa, 0xc1, 0x37, 0xa5, 0xaa, 0x58, 0xd5, 0x7c, 0xe0, 0x66, 0x15, 0xe2, + 0xae, 0x1d, 0x63, 0xbf, 0x25, 0x0c, 0x4e, 0xcd, 0x71, 0xc2, 0x19, 0x9a, 0x56, 0x67, 0x4d, 0x12, 0xb8, 0x4b, 0x86, 0xe2, 0x91, 0x92, 0x8e, 0x72, 0x95, 0x4b, 0xe0, 0x5a, 0x3f, 0xd5, 0xad, 0xac, + 0x84, 0x29, 0x35, 0x67, 0x4c, 0x99, 0x2e, 0x19, 0xaa, 0xd8, 0xec, 0x0e, 0x0f, 0x12, 0x6b, 0xaa, 0x33, 0x67, 0xee, 0x4c, 0xbe, 0xd0, 0xdb, 0x2d, 0xde, 0x59, 0xe3, 0x70, 0x91, 0x70, 0xeb, 0xc7, + 0xd6, 0xae, 0xf0, 0xe7, 0x91, 0xe6, 0x54, 0x5c, 0x21, 0x25, 0xf0, 0x0a, 0xf8, 0x26, 0x70, 0xf6, 0xd6, 0xd9, 0xac, 0xd6, 0xca, 0x69, 0xe4, 0x35, 0xcd, 0xe9, 0x7c, 0x7a, 0x72, 0x48, 0x4a, 0x7a, + 0xe3, 0xec, 0xb5, 0xce, 0xa6, 0xcf, 0x51, 0x59, 0xca, 0x2a, 0xc9, 0x25, 0xe9, 0xf0, 0xe6, 0xf1, 0xee, 0x5d, 0x66, 0x02, 0x63, 0xf8, 0x01, 0x79, 0xe4, 0x9b, 0xb2, 0x07, 0x66, 0x00, 0xbb, 0x31, + 0x2b, 0x2c, 0x31, 0x42, 0x81, 0xf1, 0xac, 0xde, 0x15, 0xfe, 0xb2, 0x09, 0xc4, 0x06, 0x3f, 0xdc, 0x84, 0x2a, 0x3c, 0xc8, 0xc8, 0x59, 0xd4, 0x72, 0x87, 0x86, 0xbf, 0x09, 0x47, 0x92, 0xb5, 0x1d, + 0x44, 0xe8, 0x87, 0x97, 0x68, 0x43, 0x7e, 0x4a, 0x1f, 0xbe, 0xda, 0x0c, 0x2f, 0x90, 0x86, 0x1c, 0x25, 0x6e, 0xf7, 0x59, 0x15, 0xa9, 0x36, 0x27, 0x4f, 0x6b, 0x43, 0x85, 0xb4, 0x78, 0x76, 0x00, + 0x5f, 0xaa, 0x91, 0xf8, 0x56, 0x6a, 0x0a, 0xfe, 0x44, 0xa4, 0xbc, 0x9d, 0x3c, 0x5d, 0x92, 0xf1, 0x4b, 0xbc, 0xc6, 0x76, 0xb0, 0xa8, 0xfb, 0x86, 0x44, 0x6b, 0x17, 0x9f, 0xc1, 0x47, 0x0b, 0x0b, + 0x99, 0x9d, 0xa5, 0xcd, 0x85, 0x79, 0xdc, 0xf7, 0x90, 0x4e, 0xa0, 0xaa, 0xb3, 0x50, 0x05, 0xf0, 0x20, 0x39, 0x4a, 0xb8, 0x9f, 0xe0, 0xde, 0xa3, 0xd0, 0x03, 0xa8, 0x0d, 0x03, 0x0b, 0xa7, 0x60, + 0x9f, 0x15, 0x97, 0x1f, 0x36, 0xf2, 0x79, 0xf0, 0x1f, 0xcb, 0x9d, 0x2c, 0xdc, 0x61, 0xa5, 0x46, 0xf7, 0x83, 0xda, 0xe7, 0x71, 0x1b, 0x35, 0x75, 0xa4, 0xe4, 0x8f, 0x78, 0x35, 0x70, 0x61, 0x27, + 0x75, 0x71, 0x78, 0x36, 0xc8, 0x5d, 0xd8, 0x25, 0x72, 0x66, 0x22, 0x17, 0x7d, 0x82, 0x5c, 0xf0, 0x8d, 0x84, 0x99, 0x9f, 0x00, 0xcf, 0xac, 0x4d, 0xac, 0x20, 0x2b, 0xae, 0x84, 0xd5, 0x41, 0xd8, + 0x52, 0x70, 0xc0, 0x3e, 0x31, 0xc3, 0x02, 0xf8, 0x68, 0x4a, 0x62, 0x05, 0x35, 0x7c, 0x49, 0x87, 0x72, 0x4a, 0x51, 0xff, 0x19, 0xd2, 0x86, 0x40, 0x8f, 0xa1, 0x45, 0xbb, 0xbe, 0xc4, 0x47, 0xba, + 0x36, 0xf7, 0x85, 0x68, 0x3e, 0x29, 0x4d, 0x5d, 0xfb, 0x6b, 0xbb, 0xa0, 0x8d, 0x27, 0x80, 0x56, 0x20, 0x49, 0xf6, 0x62, 0x7d, 0x6c, 0xd8, 0xb8, 0xcd, 0x82, 0xda, 0x60, 0x44, 0x31, 0xbe, 0x78, + 0x3f, 0x5a, 0x4b, 0x3d, 0x8f, 0x00, 0xcd, 0x27, 0x7a, 0xd5, 0x55, 0xaa, 0xbf, 0x44, 0x2b, 0x44, 0x06, 0xf8, 0x37, 0xc6, 0x6a, 0x75, 0x91, 0xff, 0x33, 0x63, 0x09, 0xda, 0x0b, 0x68, 0xb8, 0x59, + 0x1e, 0xb0, 0xba, 0x7f, 0xbc, 0x86, 0xbb, 0xb8, 0xeb, 0xa3, 0xd3, 0xdf, 0x2c, 0xdd, 0xa6, 0xf6, 0x5f, 0xfa, 0xb5, 0x1d, 0xdf, 0x33, 0x13, 0x99, 0xea, 0x10, 0x46, 0xda, 0xf7, 0xd7, 0x46, 0x36, + 0x97, 0xa6, 0x2c, 0xc4, 0x74, 0x05, 0x9a, 0xd2, 0x78, 0x98, 0x12, 0xeb, 0x5f, 0xb6, 0xcc, 0x1a, 0xeb, 0x5f, 0x19, 0xc1, 0xfd, 0x55, 0x83, 0x37, 0xad, 0x15, 0x98, 0x2a, 0x1d, 0x22, 0xdb, 0xbb, + 0xfe, 0x25, 0x03, 0xa1, 0xf9, 0xca, 0x1b, 0x2b, 0xf3, 0x63, 0xbe, 0xe9, 0x51, 0xa1, 0x52, 0xb9, 0xf7, 0xd3, 0x33, 0xf2, 0x27, 0x22, 0xe5, 0xde, 0xca, 0xb4, 0x92, 0x5c, 0x79, 0xc4, 0x07, 0xc9, + 0xe1, 0x87, 0xd8, 0x6a, 0xdb, 0x9b, 0x83, 0x1d, 0xb8, 0x79, 0xc0, 0xed, 0x62, 0xb4, 0x5a, 0x63, 0xf4, 0x8b, 0x58, 0x80, 0xe9, 0x23, 0xa5, 0xf9, 0xbb, 0xab, 0x3e, 0x1f, 0x19, 0x06, 0x94, 0xd8, + 0x40, 0xfc, 0x95, 0x1c, 0x86, 0x04, 0x36, 0x6b, 0xbc, 0x73, 0xb3, 0x70, 0x0c, 0x2d, 0xe6, 0x9d, 0x57, 0x50, 0x93, 0xa8, 0x61, 0x08, 0x52, 0x1c, 0x98, 0xa0, 0x25, 0x77, 0x87, 0x63, 0x56, 0x67, + 0x2f, 0xc6, 0xb8, 0x40, 0x1a, 0xef, 0x6f, 0xf0, 0x01, 0x6e, 0xf4, 0xe1, 0x65, 0xa0, 0x08, 0xa3, 0xbe, 0x2d, 0x3a, 0xad, 0xd3, 0x1d, 0xea, 0x09, 0xa8, 0x98, 0xc2, 0x26, 0xea, 0x55, 0xed, 0x3e, + 0x91, 0xa0, 0x75, 0x03, 0x25, 0x44, 0xc3, 0xc0, 0x16, 0x9a, 0xec, 0x1d, 0x1e, 0xb8, 0x3a, 0xec, 0x08, 0xe9, 0x40, 0xab, 0xc1, 0x05, 0x93, 0x72, 0x8b, 0x59, 0x6d, 0xb2, 0xad, 0xa8, 0x46, 0x49, + 0xbd, 0x56, 0x64, 0x52, 0x65, 0x4b, 0x7c, 0x9d, 0xa2, 0xf3, 0xf5, 0x36, 0xb5, 0x69, 0x78, 0x04, 0x3e, 0x08, 0x44, 0x5d, 0x59, 0x22, 0xb4, 0x41, 0x7b, 0xb2, 0xf8, 0x86, 0xdf, 0x54, 0x3b, 0x1d, + 0x1d, 0xcb, 0x3a, 0xde, 0x93, 0x56, 0x07, 0xb6, 0x92, 0x0c, 0x4b, 0x5b, 0x18, 0x1a, 0x75, 0x84, 0x87, 0x6b, 0x4e, 0x24, 0xbd, 0x70, 0x1e, 0x79, 0x55, 0x8c, 0xd2, 0xd5, 0xf0, 0x91, 0x31, 0xb7, + 0xdc, 0xa3, 0x5e, 0x57, 0xc2, 0x44, 0x99, 0x2e, 0x1f, 0x1c, 0x4a, 0x58, 0x00, 0xbf, 0xae, 0x28, 0x82, 0xf1, 0xf2, 0x1d, 0x7b, 0x24, 0xd4, 0x5c, 0x2d, 0x2a, 0xbd, 0x92, 0x8d, 0x47, 0x2f, 0x93, + 0x07, 0x53, 0xb0, 0x46, 0xe4, 0x97, 0xf4, 0xee, 0xf1, 0xdd, 0xa2, 0x3e, 0x39, 0x9b, 0x90, 0x12, 0x6b, 0xb9, 0xd1, 0x1c, 0x12, 0x29, 0xac, 0x72, 0xeb, 0xb2, 0x3e, 0x71, 0x14, 0x22, 0x41, 0xf3, + 0x5d, 0x66, 0xbb, 0xd4, 0x45, 0xd2, 0x08, 0xa0, 0x1f, 0xe3, 0x79, 0x66, 0x1a, 0x9e, 0x2b, 0x32, 0x2f, 0xe2, 0xc9, 0x32, 0xb1, 0x8a, 0x67, 0x6b, 0xc9, 0x02, 0xbd, 0x4f, 0xf4, 0x86, 0x36, 0x5f, + 0x5f, 0x68, 0x64, 0xc0, 0x5e, 0x50, 0xba, 0x85, 0x76, 0xfa, 0x61, 0x7b, 0xe5, 0xa3, 0xe2, 0x9a, 0xf6, 0x70, 0x54, 0x3c, 0xa2, 0x26, 0xb4, 0x95, 0xb7, 0x8a, 0x9f, 0x97, 0xf0, 0x84, 0xa5, 0xb4, + 0xbe, 0x81, 0xae, 0x28, 0xb7, 0xf5, 0x99, 0x75, 0x4f, 0x9a, 0xd1, 0x69, 0x4d, 0x01, 0xd7, 0x6a, 0xd3, 0x24, 0xcb, 0xa2, 0x7d, 0x05, 0xef, 0xb6, 0x82, 0x96, 0xb1, 0x36, 0xee, 0xa1, 0xbb, 0xe8, + 0xe0, 0x74, 0xf5, 0x63, 0xf6, 0x56, 0x94, 0x47, 0xa0, 0xbd, 0x07, 0xa2, 0x83, 0x28, 0x7d, 0xc5, 0xd3, 0xce, 0xdc, 0x25, 0xf0, 0x6d, 0xbb, 0xa2, 0x6d, 0x47, 0x45, 0x0f, 0x98, 0x0e, 0xf4, 0x19, + 0x36, 0xb3, 0x84, 0xc5, 0x78, 0x67, 0x8a, 0xeb, 0x93, 0x0f, 0x24, 0x94, 0x9c, 0x49, 0x45, 0x3e, 0x22, 0x09, 0x52, 0x14, 0x5f, 0xbb, 0x16, 0x47, 0xb9, 0x7c, 0xac, 0xe0, 0x4f, 0x27, 0x99, 0xb9, + 0xfb, 0x16, 0xea, 0x5c, 0xb0, 0x84, 0x8f, 0xcb, 0x44, 0xd0, 0x51, 0x15, 0xe8, 0xf2, 0x82, 0xad, 0xb6, 0x3b, 0x6d, 0x67, 0xd6, 0x29, 0x60, 0x3f, 0xc4, 0x97, 0xf7, 0x50, 0xe2, 0x80, 0xcf, 0x40, + 0x43, 0x5a, 0xf1, 0x34, 0x48, 0x3c, 0x6d, 0xb0, 0x3e, 0x71, 0x53, 0xe3, 0xb7, 0x03, 0xfb, 0x3b, 0xc9, 0x5a, 0xda, 0x45, 0xe2, 0xda, 0xf8, 0xb8, 0x04, 0x79, 0xd6, 0xc9, 0x34, 0x78, 0x82, 0xe8, + 0x95, 0x73, 0x6a, 0x54, 0x77, 0xff, 0x10, 0x0b, 0xc9, 0x6c, 0xd7, 0x94, 0x2c, 0xcb, 0x7f, 0x7d, 0x8b, 0x49, 0x41, 0xff, 0xa9, 0x66, 0xf8, 0xc7, 0x62, 0x21, 0xf4, 0x58, 0x96, 0x86, 0xc5, 0xdf, + 0x77, 0x55, 0xff, 0x8d, 0xb7, 0xbe, 0xee, 0xaa, 0xcc, 0x9f, 0x76, 0x55, 0xa6, 0x77, 0xf3, 0xb9, 0xce, 0x2c, 0x3f, 0xce, 0x75, 0x7c, 0xc0, 0x1e, 0x02, 0x22, 0x13, 0x85, 0xfb, 0x0b, 0x3b, 0xfa, + 0x17, 0x4c, 0x98, 0x9c, 0x7e, 0x1a, 0xad, 0x7e, 0xeb, 0x6d, 0x76, 0xca, 0x1c, 0x5d, 0x7c, 0x3f, 0xd1, 0xd7, 0x05, 0x58, 0x41, 0x8a, 0x88, 0xf9, 0x9a, 0x48, 0xf2, 0x23, 0x99, 0x44, 0xff, 0x89, + 0xfb, 0x81, 0xaf, 0x7a, 0x16, 0x8f, 0xbe, 0x8c, 0x96, 0xc6, 0xbf, 0xc6, 0x59, 0x23, 0x3f, 0xe4, 0x2c, 0x7f, 0x1a, 0x3b, 0xbc, 0xf6, 0xcf, 0xdc, 0xef, 0xbd, 0x9f, 0xa7, 0xe4, 0x7d, 0xb3, 0xbe, + 0x65, 0xe8, 0x51, 0x17, 0x78, 0x05, 0x01, 0x7e, 0xfb, 0xb6, 0x40, 0x5f, 0x4d, 0xaf, 0xba, 0x75, 0xef, 0x75, 0xeb, 0xb7, 0x8c, 0xfd, 0x74, 0xab, 0xc7, 0xe6, 0x51, 0x77, 0x7c, 0x0b, 0x06, 0xf9, + 0x1e, 0x10, 0xc2, 0xc9, 0xbf, 0x35, 0xe1, 0x7d, 0xcd, 0x87, 0x6a, 0xfe, 0xd2, 0x66, 0x59, 0xfe, 0xb6, 0x5b, 0xaa, 0xbe, 0xec, 0x96, 0x64, 0x86, 0x36, 0x4a, 0x29, 0xda, 0x4b, 0x86, 0xa1, 0x1c, + 0x0c, 0x84, 0xf5, 0x9a, 0xb2, 0x3c, 0x24, 0x29, 0xbc, 0x4d, 0xaf, 0xa4, 0x74, 0xc4, 0x5f, 0x25, 0x21, 0xbc, 0x8d, 0x6d, 0xcb, 0x11, 0xa0, 0x42, 0xb4, 0x99, 0xac, 0xcf, 0x5a, 0xf0, 0x9b, 0x87, + 0x64, 0x97, 0x6a, 0xab, 0x92, 0x07, 0xa6, 0x24, 0x39, 0xb9, 0x18, 0xd5, 0x7b, 0x4c, 0x58, 0x55, 0x32, 0xb3, 0xa0, 0x4a, 0x21, 0x17, 0xf5, 0x0e, 0x8e, 0x1d, 0x31, 0x37, 0x8d, 0xba, 0xfb, 0x38, + 0x9f, 0x8f, 0x5d, 0x50, 0x37, 0x4c, 0x3f, 0xe2, 0xd2, 0x0a, 0x34, 0xdc, 0x44, 0xcb, 0xcd, 0x1a, 0x00, 0x2a, 0x26, 0xe7, 0x97, 0x35, 0x78, 0xcf, 0x18, 0x75, 0x73, 0x79, 0x7e, 0x4b, 0x4a, 0xb2, + 0x84, 0x38, 0x37, 0xad, 0xa5, 0x7d, 0xd6, 0xa4, 0xe1, 0x40, 0x7a, 0x0e, 0x8e, 0x21, 0x68, 0xfa, 0x58, 0xe9, 0x77, 0x4f, 0x21, 0xd0, 0x09, 0x19, 0x14, 0x59, 0x0a, 0x41, 0x54, 0x54, 0x74, 0xb3, + 0x2d, 0x98, 0x11, 0x5b, 0x4c, 0x8d, 0x4a, 0xe4, 0x71, 0x24, 0x05, 0x20, 0x90, 0xef, 0xc5, 0x60, 0xa0, 0x15, 0xed, 0xc3, 0x64, 0x51, 0x6f, 0x3b, 0x02, 0x33, 0x2a, 0x8a, 0x53, 0x6e, 0x9a, 0xee, + 0x3c, 0xdd, 0x8e, 0x79, 0x25, 0x06, 0x73, 0x5d, 0x3a, 0x8a, 0x64, 0xd2, 0xa9, 0x77, 0xb4, 0xed, 0x0d, 0x10, 0x5c, 0x4f, 0xd6, 0x52, 0x1b, 0xa6, 0xb9, 0xf3, 0x1b, 0x14, 0xd1, 0x82, 0xc9, 0xdc, + 0x58, 0x26, 0xc8, 0x1f, 0x1f, 0x60, 0x3f, 0xde, 0x27, 0x83, 0x16, 0xcd, 0x2f, 0x2a, 0x8f, 0x39, 0x5b, 0x92, 0xdb, 0xf9, 0x19, 0x0e, 0xec, 0xa0, 0xf4, 0xee, 0x9a, 0x7a, 0xd8, 0xb1, 0xdd, 0xe7, + 0x4d, 0x34, 0x94, 0xd5, 0xd8, 0x45, 0xcb, 0xba, 0x76, 0x93, 0x40, 0xf9, 0xe4, 0x0c, 0x7b, 0xab, 0xbb, 0x84, 0x05, 0x21, 0x8d, 0x43, 0x69, 0x06, 0x08, 0x42, 0xce, 0x9a, 0x52, 0x94, 0x25, 0x90, + 0x1c, 0x73, 0xca, 0xc1, 0xa8, 0xe7, 0x7d, 0x9a, 0xea, 0x8e, 0x96, 0xed, 0xd9, 0xbd, 0x99, 0x64, 0xce, 0x8c, 0x8d, 0x2e, 0x98, 0x72, 0x5c, 0x70, 0xf1, 0x6e, 0x7b, 0xb6, 0x2b, 0x62, 0xab, 0xc0, + 0x6b, 0x52, 0xb5, 0x10, 0x8e, 0x49, 0xf3, 0x06, 0x3c, 0xe0, 0x76, 0x3a, 0x3e, 0x12, 0x4d, 0x07, 0x02, 0x8e, 0x8c, 0x15, 0xa5, 0x1c, 0xc3, 0x59, 0xc9, 0xc0, 0xed, 0x08, 0x23, 0x92, 0x75, 0xb3, + 0xbf, 0x60, 0xbc, 0x33, 0x42, 0xd9, 0x5a, 0x5a, 0xaf, 0x00, 0xd3, 0x0b, 0x32, 0xb6, 0x09, 0x46, 0x83, 0x3c, 0xac, 0x6d, 0x8b, 0x55, 0xb0, 0x96, 0xc4, 0xb9, 0x9a, 0x72, 0x71, 0x2d, 0x82, 0x59, + 0x8f, 0xb9, 0x54, 0x1b, 0xb0, 0xdc, 0x31, 0xa1, 0x77, 0xfa, 0x24, 0xa6, 0x14, 0x3f, 0xd1, 0x1a, 0xc1, 0xa9, 0x07, 0x80, 0x79, 0x4f, 0x10, 0x12, 0x5e, 0x88, 0x97, 0xea, 0x37, 0x2e, 0x4a, 0x73, + 0x94, 0x3e, 0xa6, 0x9e, 0x7e, 0x5e, 0xc8, 0x89, 0x68, 0x16, 0x4b, 0x24, 0x74, 0xa0, 0x3a, 0x6c, 0xa9, 0x95, 0xe4, 0x88, 0xbd, 0x98, 0x37, 0xd3, 0x7e, 0x6a, 0xe9, 0x0d, 0x2d, 0x3a, 0x36, 0xd4, + 0x8e, 0x6b, 0x41, 0x5e, 0x73, 0x5b, 0x4a, 0xfd, 0xa6, 0x24, 0x2a, 0x46, 0xf7, 0x08, 0xf0, 0x3f, 0x24, 0x94, 0xa8, 0x2b, 0x6d, 0x93, 0x4c, 0x64, 0x04, 0x06, 0xfe, 0x14, 0x2c, 0xfc, 0xe5, 0xcb, + 0x52, 0xac, 0xa7, 0x51, 0x4a, 0xac, 0xba, 0x49, 0x23, 0xed, 0x2c, 0xaa, 0xbb, 0x31, 0x6e, 0x4d, 0x76, 0x8c, 0x06, 0xe5, 0x8a, 0x54, 0xae, 0x4e, 0x06, 0x39, 0xc8, 0x9c, 0x9b, 0xef, 0x52, 0x74, + 0x22, 0xcd, 0xeb, 0x59, 0x52, 0x58, 0x2c, 0x2d, 0x80, 0x0e, 0x3e, 0x90, 0x34, 0x75, 0x36, 0x5d, 0x6c, 0x8b, 0xcb, 0x78, 0xf5, 0x8b, 0x14, 0x14, 0xc5, 0xc3, 0x96, 0x64, 0xa5, 0xa9, 0xf3, 0x56, + 0xc5, 0xbd, 0xf0, 0xb4, 0xfe, 0x7c, 0x64, 0xf7, 0xd7, 0xd6, 0xaa, 0xc0, 0x6f, 0x64, 0xaf, 0xf7, 0x74, 0x0e, 0x32, 0xcd, 0x7b, 0xd4, 0x10, 0x67, 0xba, 0xef, 0x6d, 0xcf, 0xf5, 0x83, 0x22, 0xf1, + 0x91, 0x84, 0x89, 0xbf, 0xd8, 0x9d, 0xfe, 0x37, 0x64, 0x01, 0x7e, 0xa4, 0x31, 0xfa, 0xc8, 0xb3, 0xa6, 0xd2, 0xcf, 0x61, 0x76, 0x32, 0xa1, 0x29, 0xea, 0x91, 0xd2, 0x9c, 0xf2, 0x78, 0xe2, 0xd5, + 0xe3, 0x48, 0xaf, 0x6e, 0x7a, 0x4c, 0x93, 0xe4, 0x40, 0x45, 0x9d, 0x3e, 0x57, 0x28, 0x44, 0xc1, 0xd3, 0x4f, 0x2d, 0x72, 0xeb, 0x0f, 0x49, 0xc9, 0x79, 0x4d, 0x38, 0x1f, 0xf3, 0x69, 0xe1, 0x24, + 0xba, 0x00, 0x34, 0x0a, 0x6f, 0x99, 0x4b, 0xee, 0xa7, 0x69, 0xae, 0xe3, 0x03, 0xd6, 0xf9, 0xa4, 0x80, 0x21, 0xf8, 0x73, 0x15, 0x27, 0x6d, 0x4b, 0x64, 0x1e, 0xd9, 0xa9, 0x46, 0xcf, 0xbb, 0xbd, + 0x84, 0x79, 0x2c, 0xf1, 0x72, 0x7b, 0xcb, 0x01, 0x3f, 0xe9, 0xfa, 0x54, 0xd5, 0x1f, 0x4a, 0xfc, 0x9c, 0xd8, 0x6a, 0x76, 0xdb, 0xd1, 0x19, 0x04, 0x8f, 0xc3, 0xbc, 0x0c, 0x8c, 0x8b, 0xb4, 0x48, + 0x79, 0x4a, 0x79, 0x8f, 0x34, 0x74, 0x28, 0xda, 0x67, 0x9f, 0x73, 0x7f, 0xcd, 0xc1, 0x23, 0xc7, 0x08, 0x46, 0x42, 0x48, 0xee, 0x7c, 0x24, 0xba, 0x19, 0x27, 0x87, 0x45, 0x24, 0x8c, 0x1d, 0x52, + 0xd5, 0xdb, 0xd4, 0x46, 0xb0, 0x5c, 0x9a, 0x2c, 0xef, 0xa8, 0xe5, 0x46, 0xc4, 0xfd, 0xe1, 0xf2, 0x33, 0x41, 0x67, 0x1c, 0xfe, 0x74, 0x81, 0xe4, 0x03, 0xed, 0x8f, 0x9a, 0x20, 0xe7, 0x4a, 0x51, + 0x9b, 0x3a, 0x9b, 0xf3, 0x9d, 0x5c, 0x02, 0xf9, 0xfd, 0xd6, 0xf8, 0x27, 0xb4, 0xce, 0xea, 0xe0, 0x8d, 0xd7, 0xf8, 0x8e, 0xcb, 0x87, 0x9a, 0xc5, 0x8f, 0x88, 0x45, 0x89, 0x0b, 0x4d, 0xd0, 0x95, + 0xac, 0x53, 0xbe, 0x13, 0x85, 0xd5, 0xee, 0xc0, 0xd7, 0x50, 0x1f, 0xd0, 0xa7, 0xfb, 0xbc, 0xb4, 0x57, 0x0e, 0x70, 0xc3, 0x5b, 0x87, 0xb2, 0xf9, 0xa3, 0xc8, 0xcc, 0x75, 0x10, 0x19, 0xf4, 0x1c, + 0x8a, 0xd9, 0xbe, 0x64, 0xf5, 0x04, 0x37, 0x94, 0x93, 0x5d, 0x56, 0x93, 0x99, 0xd9, 0x7e, 0x8d, 0xf2, 0x61, 0x6e, 0x5d, 0x42, 0x81, 0x31, 0xbf, 0x6c, 0x2a, 0x12, 0x90, 0x34, 0xa7, 0x48, 0x95, + 0x52, 0x55, 0xa8, 0xab, 0x47, 0xa4, 0xc9, 0xf0, 0x08, 0x74, 0x85, 0x1c, 0xa0, 0x95, 0x0a, 0xb9, 0x53, 0x33, 0xd5, 0xee, 0x64, 0x77, 0xc1, 0xfe, 0x22, 0x3d, 0x5d, 0xd9, 0x27, 0x09, 0x8c, 0x5b, + 0xfb, 0x24, 0x5f, 0x42, 0x53, 0x63, 0xd0, 0x76, 0x5b, 0xa3, 0x45, 0xff, 0x3c, 0xe8, 0xcf, 0xe7, 0xc6, 0xe0, 0x68, 0x32, 0x48, 0xca, 0x96, 0xf0, 0x77, 0x8b, 0xc9, 0x23, 0x79, 0x4c, 0x0a, 0xf5, + 0xb9, 0x47, 0xf2, 0x5a, 0x7a, 0x0e, 0x06, 0xc6, 0x4b, 0xb3, 0x65, 0x70, 0xf3, 0xc3, 0x61, 0x9a, 0x30, 0x1b, 0x84, 0x6c, 0xa1, 0x58, 0x12, 0xa4, 0xb3, 0xd1, 0xc4, 0x8c, 0xf1, 0xf0, 0x01, 0xb6, + 0xb6, 0x40, 0x28, 0x97, 0x1e, 0x60, 0x93, 0x9a, 0x17, 0x47, 0x67, 0x84, 0x5b, 0xae, 0xb9, 0x1c, 0x93, 0x88, 0xe6, 0x4b, 0x4d, 0x8b, 0xc4, 0xc2, 0x0d, 0xf5, 0x41, 0xac, 0xd4, 0x33, 0x6d, 0x44, + 0x16, 0x38, 0xc2, 0x8a, 0xf0, 0x52, 0xf7, 0x15, 0x8a, 0x71, 0x73, 0xf3, 0x1f, 0x3b, 0x5a, 0x2c, 0x52, 0x39, 0xdc, 0xb3, 0x70, 0x02, 0xb8, 0xcf, 0x2e, 0x70, 0x76, 0xb9, 0x42, 0xe9, 0xe9, 0x8c, + 0x44, 0x62, 0x67, 0xfa, 0x58, 0x1f, 0x42, 0xd5, 0xa1, 0x09, 0xa2, 0x6a, 0xcc, 0x12, 0x12, 0x2f, 0x3c, 0x2e, 0x19, 0xb6, 0xb6, 0x59, 0x6d, 0xb7, 0xc7, 0x7b, 0x74, 0x01, 0xd6, 0x3b, 0xf3, 0x2c, + 0x53, 0xc1, 0xa2, 0x9c, 0xd9, 0x1a, 0xad, 0x72, 0x16, 0x42, 0xb2, 0x24, 0x3b, 0x44, 0x58, 0x99, 0xa8, 0x40, 0x79, 0x7f, 0x2e, 0xef, 0x9d, 0x88, 0x09, 0xa5, 0xa9, 0x6f, 0xeb, 0x7e, 0x21, 0x48, + 0x12, 0x9a, 0xf2, 0x8e, 0x9f, 0xd8, 0xfb, 0x93, 0xa7, 0x36, 0xbb, 0xb2, 0xc5, 0x4e, 0x15, 0x0c, 0x5b, 0x4a, 0xca, 0x79, 0xbd, 0x0c, 0x60, 0x56, 0xaa, 0x30, 0xf8, 0xd0, 0xff, 0x01, 0x4f, 0x63, + 0xff, 0x7f, 0xc2, 0xd3, 0xd7, 0xdf, 0xf1, 0x74, 0x5b, 0x21, 0xa6, 0xf0, 0x13, 0x4f, 0x7f, 0x1b, 0xfb, 0xbf, 0xcd, 0xd3, 0xfa, 0xff, 0x90, 0xa7, 0xd5, 0x28, 0x61, 0x27, 0x3f, 0xf4, 0x4d, 0x33, + 0x78, 0x76, 0x64, 0x9e, 0xb7, 0xbc, 0xa8, 0x0f, 0x9f, 0xf4, 0xe9, 0x30, 0xe8, 0x46, 0xb3, 0xc9, 0x1a, 0xc8, 0xe8, 0xed, 0x3a, 0x12, 0xb0, 0x28, 0xcf, 0x57, 0xac, 0x5d, 0x09, 0xb5, 0xcf, 0x41, + 0x91, 0x37, 0xf6, 0xeb, 0x7d, 0x34, 0x1a, 0x85, 0xe3, 0x56, 0x9e, 0x56, 0x1f, 0xf3, 0x9d, 0x69, 0xc6, 0x8a, 0xf3, 0x45, 0x6f, 0x26, 0x02, 0x1f, 0x64, 0x4b, 0x79, 0xeb, 0x78, 0xf9, 0x1e, 0x05, + 0x58, 0x8b, 0x4c, 0x26, 0x62, 0xae, 0xf1, 0xa0, 0x32, 0x8c, 0x37, 0xb0, 0x6c, 0xf4, 0x9c, 0xc6, 0x01, 0x88, 0x19, 0x0a, 0xfc, 0x1d, 0x39, 0xb5, 0x88, 0x06, 0x89, 0x67, 0xca, 0x37, 0x9b, 0x75, + 0xa8, 0xf4, 0x0e, 0xe7, 0x53, 0x53, 0x37, 0x78, 0x1e, 0x2c, 0xed, 0xe8, 0x41, 0x5a, 0x06, 0x2a, 0x77, 0x61, 0xca, 0x9b, 0x39, 0x7a, 0xd7, 0xbc, 0xbf, 0xb4, 0x85, 0x5a, 0xef, 0x81, 0xe3, 0x2a, + 0x41, 0xea, 0x03, 0xd8, 0xf5, 0xa8, 0x95, 0x03, 0xbb, 0xa2, 0x06, 0x1e, 0x65, 0x9f, 0xef, 0xb5, 0x20, 0x29, 0xdd, 0xe2, 0xf5, 0xea, 0x9a, 0x0b, 0xe3, 0xe7, 0x30, 0xce, 0x33, 0x1a, 0xfc, 0x08, + 0x6a, 0x94, 0x17, 0xba, 0x3f, 0x76, 0x95, 0xc1, 0xd6, 0xbd, 0x46, 0xad, 0x08, 0xe6, 0x94, 0x0f, 0xd2, 0x21, 0x0b, 0x67, 0x89, 0x77, 0xda, 0x0e, 0x4d, 0x72, 0xf3, 0x9b, 0x69, 0xd3, 0x83, 0x60, + 0xe0, 0xf8, 0x61, 0x1e, 0x31, 0x10, 0x8f, 0x2f, 0x97, 0x54, 0x90, 0x4b, 0xa8, 0x8d, 0xb7, 0xbf, 0x14, 0x93, 0x71, 0xde, 0x54, 0xd5, 0x72, 0x6b, 0xcd, 0x54, 0x39, 0xa5, 0x12, 0x19, 0x84, 0xd1, + 0x1e, 0x6d, 0x6e, 0x27, 0xe5, 0x19, 0xa4, 0x4b, 0xc5, 0x01, 0x48, 0x87, 0x86, 0x8b, 0xf6, 0x07, 0x95, 0xea, 0xa3, 0xd1, 0x1d, 0xfe, 0x29, 0x08, 0xb7, 0x17, 0x2e, 0xda, 0xd3, 0xb3, 0x25, 0x00, + 0x3d, 0x33, 0x02, 0xa1, 0x8e, 0xb1, 0x40, 0x77, 0x64, 0x80, 0xf4, 0xed, 0xf0, 0x9f, 0x91, 0x5a, 0x73, 0xf7, 0xad, 0xcf, 0x23, 0x09, 0x21, 0xf3, 0xe7, 0x22, 0x93, 0xe1, 0x42, 0xd9, 0xb4, 0xf2, + 0x7c, 0xbf, 0x12, 0x3d, 0xcd, 0x43, 0x45, 0x48, 0x7a, 0x3c, 0x31, 0x90, 0x62, 0xa5, 0x24, 0x9e, 0x1f, 0x8f, 0x77, 0x75, 0xee, 0x05, 0x35, 0xaa, 0x45, 0x00, 0x40, 0x49, 0xd9, 0x37, 0xae, 0xf7, + 0xba, 0xe5, 0x03, 0x4e, 0x4d, 0xb9, 0xd5, 0xa8, 0xb7, 0x2b, 0x36, 0x22, 0x11, 0xc4, 0xc2, 0xce, 0x12, 0x02, 0x21, 0xda, 0xd7, 0x6a, 0xcb, 0x95, 0x96, 0x99, 0x0a, 0x09, 0x57, 0x8f, 0x57, 0xc2, + 0x37, 0x8f, 0xaa, 0xd6, 0x09, 0x5e, 0x68, 0x27, 0x94, 0x1d, 0xa5, 0xb3, 0xd6, 0xd2, 0xd0, 0xd8, 0x5d, 0x13, 0xf1, 0x6d, 0xc0, 0x39, 0xfc, 0x20, 0x46, 0x15, 0x50, 0x14, 0xcd, 0xde, 0x69, 0x9f, + 0x0a, 0xd7, 0xd9, 0x57, 0x34, 0x3f, 0x8d, 0xd7, 0x30, 0x0e, 0x0f, 0x9c, 0x1b, 0x51, 0xaa, 0xd3, 0x98, 0x6e, 0xc4, 0xc2, 0x26, 0xb2, 0x59, 0x46, 0xc1, 0x10, 0xf1, 0xa9, 0xf8, 0x4a, 0x46, 0x5d, + 0x0c, 0xc6, 0x61, 0xf8, 0x29, 0xe8, 0x42, 0x2a, 0xc2, 0xa8, 0x3b, 0xc7, 0xbb, 0x45, 0x03, 0xd1, 0x94, 0x64, 0xc7, 0xd3, 0xdb, 0x0f, 0xec, 0x9c, 0x9b, 0x7b, 0x22, 0xca, 0x87, 0xa1, 0xdc, 0x37, + 0xd6, 0x34, 0x31, 0x58, 0xe9, 0xfc, 0x26, 0x6c, 0xf1, 0xe5, 0x2b, 0x52, 0x6f, 0x95, 0xe1, 0x36, 0x39, 0x61, 0x65, 0xa9, 0x14, 0x77, 0xa2, 0xf5, 0xad, 0x25, 0x69, 0xab, 0xba, 0xa1, 0xb2, 0x5e, + 0x06, 0xd3, 0xbe, 0x56, 0xa4, 0xe2, 0x90, 0xe6, 0x03, 0xb4, 0xa4, 0xf8, 0x64, 0x92, 0xa0, 0x1f, 0x97, 0x67, 0x9a, 0xcf, 0x2a, 0x1f, 0x6b, 0x82, 0x6e, 0x06, 0x1a, 0xad, 0x6b, 0xf3, 0xd1, 0xf2, + 0x0b, 0xbb, 0x68, 0x09, 0xf6, 0x9f, 0xf3, 0x34, 0x5f, 0xe0, 0x77, 0x09, 0x75, 0x29, 0xf8, 0xc0, 0x97, 0xed, 0xd8, 0xbd, 0xea, 0x41, 0x28, 0x29, 0x6b, 0x5a, 0xe2, 0xce, 0xfd, 0xc7, 0x3c, 0x4d, + 0xb3, 0x74, 0x6b, 0x7b, 0x3e, 0xff, 0xd6, 0x15, 0xfa, 0xd5, 0x73, 0x3b, 0xde, 0x06, 0x3a, 0x72, 0x83, 0x0b, 0xde, 0xba, 0xf6, 0xa6, 0x0a, 0x7b, 0xbe, 0x8f, 0xa1, 0xf0, 0x71, 0x64, 0xe3, 0xba, + 0xa7, 0xb7, 0xae, 0x5d, 0x96, 0x55, 0xa9, 0x03, 0xd5, 0x30, 0x44, 0xba, 0xa6, 0x68, 0xe3, 0x2f, 0x93, 0x9a, 0x07, 0x40, 0xe6, 0xda, 0x17, 0xb5, 0x54, 0xda, 0x73, 0x3e, 0x3f, 0xa0, 0x62, 0x2e, + 0x4b, 0x55, 0xb2, 0x11, 0x01, 0xa5, 0xb7, 0xde, 0xa8, 0x9f, 0x99, 0xf8, 0xa4, 0xa0, 0xa0, 0xf0, 0xfa, 0x71, 0x22, 0x38, 0xfb, 0xd8, 0x9e, 0xed, 0x6b, 0xac, 0x88, 0x77, 0x00, 0x7e, 0x1a, 0x2a, + 0x53, 0x27, 0xdd, 0x89, 0x5c, 0x59, 0x9c, 0x17, 0x88, 0x95, 0x19, 0x55, 0x07, 0x45, 0x60, 0x93, 0xe9, 0xe2, 0x93, 0x1d, 0xce, 0xe4, 0xdd, 0x97, 0x30, 0x1b, 0xd2, 0x50, 0xde, 0x6e, 0xc5, 0x4a, + 0xfc, 0x45, 0x31, 0x52, 0xc6, 0x8b, 0xf5, 0x35, 0xea, 0x31, 0xcb, 0x9e, 0xeb, 0xb3, 0x43, 0xb0, 0x41, 0x1e, 0x7d, 0x9e, 0xb2, 0x51, 0x49, 0xd1, 0x0e, 0xc2, 0x7e, 0x61, 0x98, 0x9a, 0xf6, 0x6f, + 0x65, 0xc1, 0x5b, 0xe4, 0x9c, 0x45, 0x38, 0x11, 0x01, 0x1b, 0x56, 0x4a, 0xab, 0xe2, 0x25, 0x1f, 0x71, 0xf2, 0x38, 0xc2, 0xb0, 0x66, 0x30, 0xeb, 0xbe, 0x73, 0x12, 0xe9, 0xea, 0x38, 0x81, 0x2d, + 0xd9, 0xda, 0x06, 0x91, 0x46, 0x5a, 0x12, 0x93, 0x70, 0x31, 0x29, 0x64, 0x87, 0x35, 0xbe, 0x07, 0x35, 0xec, 0xa2, 0x70, 0xda, 0xbc, 0xe2, 0xad, 0x1f, 0xe2, 0x61, 0x45, 0xaf, 0xa5, 0xa6, 0xa7, + 0xcf, 0xfc, 0x04, 0x62, 0xd3, 0x51, 0x11, 0x42, 0xf0, 0xe8, 0xa4, 0xaa, 0x1a, 0x91, 0xcc, 0x22, 0xd8, 0x25, 0x2e, 0x94, 0x65, 0x0c, 0xf3, 0xdc, 0x61, 0x0c, 0x4b, 0x5c, 0x01, 0x9a, 0x57, 0x85, + 0x7d, 0x6a, 0xc9, 0x3b, 0x63, 0xc9, 0x23, 0x43, 0x12, 0x65, 0x94, 0x65, 0x9a, 0x47, 0xf6, 0xeb, 0x6c, 0x2f, 0xf0, 0xe1, 0xb6, 0xbc, 0xe1, 0x8e, 0xaf, 0x8c, 0x04, 0x65, 0x14, 0x50, 0xdd, 0x14, + 0x41, 0xd7, 0x96, 0x7f, 0x0e, 0x41, 0x7d, 0x63, 0xe4, 0x96, 0xf7, 0x86, 0x5a, 0xbc, 0x99, 0xee, 0x8d, 0x97, 0xb8, 0x34, 0xb2, 0x7a, 0xbd, 0x85, 0x22, 0x32, 0x3e, 0x4d, 0x48, 0xd0, 0x97, 0x97, + 0x59, 0x85, 0x2f, 0xe7, 0xd3, 0x58, 0x6f, 0xe3, 0x71, 0x7b, 0x5d, 0x15, 0x88, 0x33, 0xf2, 0x1c, 0xdf, 0x3d, 0x1d, 0x36, 0x9c, 0xab, 0xca, 0x37, 0x40, 0xea, 0x6f, 0xfe, 0x9d, 0xca, 0x8e, 0xc1, + 0xf0, 0x20, 0xb9, 0x32, 0x9c, 0xe8, 0x3c, 0xb9, 0x37, 0x41, 0xeb, 0x10, 0xc2, 0x53, 0x01, 0xe4, 0x30, 0xe9, 0x26, 0x69, 0xa3, 0xf6, 0x98, 0xaf, 0xd0, 0x32, 0xd2, 0xec, 0x7e, 0x83, 0x5c, 0xf2, + 0x49, 0x14, 0x6c, 0xdd, 0x03, 0x34, 0xca, 0x78, 0xdb, 0x58, 0x2b, 0x1c, 0xc1, 0x4c, 0x5e, 0x8f, 0xd2, 0xad, 0x02, 0xfc, 0xd8, 0xd3, 0xca, 0x3a, 0x9d, 0x79, 0x17, 0x6c, 0xdf, 0xef, 0x48, 0xf6, + 0x24, 0x29, 0xde, 0xf5, 0x3e, 0xf6, 0xbb, 0x5c, 0xd4, 0x10, 0xce, 0xda, 0xbd, 0x60, 0xa2, 0x38, 0x38, 0xb8, 0xab, 0xa4, 0xd3, 0xe8, 0x27, 0x48, 0x8d, 0x22, 0xd9, 0x69, 0x3b, 0xb7, 0x3d, 0xa8, + 0xae, 0x30, 0x54, 0xb1, 0x28, 0x29, 0xc5, 0x3c, 0x3f, 0x1c, 0x67, 0x71, 0x05, 0x50, 0x98, 0xb7, 0xfc, 0x7c, 0x23, 0xba, 0xb8, 0x92, 0xac, 0x5a, 0xb6, 0x4c, 0xb8, 0xce, 0xeb, 0x63, 0x7b, 0x0d, + 0xd1, 0x56, 0x0b, 0xb0, 0x02, 0x67, 0x7e, 0x52, 0x8f, 0x1f, 0xd8, 0x6b, 0x61, 0x79, 0xfd, 0xe0, 0x50, 0xf5, 0xd8, 0xa8, 0xd3, 0x40, 0x50, 0xef, 0xf2, 0xd3, 0x47, 0xff, 0xf9, 0xac, 0x09, 0xe9, + 0x49, 0x1b, 0x33, 0x9f, 0xf7, 0x7e, 0x1a, 0x0d, 0xc0, 0x4e, 0x90, 0xb4, 0xc5, 0xd9, 0xdf, 0x4b, 0x3d, 0xfe, 0x3f, 0xaf, 0xe8, 0x0a, 0xb7, 0xc8, 0xfe, 0xeb, 0x5b, 0xf0, 0xc6, 0x37, 0x9e, 0xfe, + 0x46, 0xda, 0x7f, 0x7b, 0x10, 0xff, 0x4f, 0x8c, 0xcd, 0x1d, 0x5f, 0xc5, 0x76, 0xdb, 0xdf, 0x08, 0x3c, 0xbe, 0x1b, 0xa3, 0xfd, 0xc4, 0x8d, 0x0e, 0xef, 0x9f, 0xea, 0x4d, 0x4f, 0x3f, 0xb8, 0x11, + 0x90, 0x3b, 0x7b, 0xfd, 0xc3, 0x1d, 0xa5, 0x90, 0x0e, 0x4e, 0x97, 0x0d, 0xcc, 0x95, 0x44, 0x46, 0xf7, 0xc7, 0x54, 0x37, 0x99, 0xcf, 0xd7, 0xd7, 0xbb, 0x3a, 0xa5, 0xfb, 0x5b, 0x2f, 0x13, 0x43, + 0x2f, 0xba, 0xf0, 0xe7, 0xcf, 0x7e, 0x17, 0x91, 0xb2, 0x0c, 0x17, 0x87, 0x04, 0x1c, 0x47, 0xf2, 0x1f, 0xae, 0x1b, 0x75, 0x5d, 0x12, 0xec, 0x35, 0x10, 0x83, 0x25, 0x0e, 0x8c, 0xee, 0x75, 0x31, + 0x3f, 0x02, 0x36, 0x7e, 0x50, 0xfe, 0x0f, 0xb2, 0xfd, 0x4d, 0x70, 0x07, 0xe8, 0x1c, 0x7d, 0x7e, 0xa1, 0x7a, 0xd3, 0xf3, 0xd1, 0x6f, 0x8a, 0x10, 0xfd, 0xab, 0xee, 0x55, 0x6f, 0xf5, 0xef, 0x8a, + 0x90, 0x7f, 0x7e, 0xbc, 0x1f, 0x4f, 0x07, 0xfc, 0x6f, 0x3c, 0xde, 0x8f, 0xa7, 0x03, 0xfe, 0x4f, 0x1e, 0xef, 0x67, 0x05, 0x09, 0xf0, 0x2b, 0x09, 0xc9, 0x77, 0x05, 0x09, 0x95, 0xc7, 0xd6, 0xf1, + 0x6a, 0x94, 0x5d, 0x51, 0x1f, 0x55, 0x31, 0x24, 0x4b, 0x99, 0x62, 0xb1, 0x62, 0x84, 0xf8, 0x0a, 0xdd, 0xc6, 0x93, 0xd7, 0x2a, 0x12, 0x6b, 0xe4, 0xa0, 0x23, 0xd3, 0xbe, 0xb3, 0x73, 0xcf, 0xbe, + 0x54, 0x80, 0x5a, 0x2d, 0x2b, 0xb3, 0x1c, 0x77, 0xcd, 0x1b, 0x8f, 0x31, 0x0d, 0xb1, 0x1e, 0x04, 0xc6, 0x6d, 0xf6, 0x43, 0x6d, 0xce, 0x80, 0xa6, 0x62, 0xf9, 0x00, 0x69, 0xc2, 0x34, 0xb1, 0x2b, + 0xe2, 0x0e, 0xc8, 0xd1, 0x2e, 0xcf, 0x0a, 0xc5, 0xd9, 0x5b, 0x60, 0x63, 0xdf, 0xe9, 0x4a, 0x41, 0x2a, 0xd3, 0x91, 0x9e, 0xbc, 0x38, 0x16, 0x1d, 0x42, 0xbc, 0x7c, 0xc0, 0x98, 0x38, 0xdb, 0x8d, + 0xb6, 0x3a, 0x2f, 0x97, 0x24, 0xc1, 0xcc, 0x13, 0xd4, 0xc9, 0x89, 0x75, 0xef, 0xcb, 0xa7, 0x22, 0x4e, 0xe0, 0x5d, 0xbc, 0xfe, 0x44, 0x68, 0x73, 0x2d, 0x04, 0xfa, 0xd1, 0xef, 0xc0, 0x18, 0xc8, + 0xac, 0x9e, 0x31, 0xb9, 0xf6, 0xb3, 0x46, 0x11, 0xe6, 0x12, 0x4d, 0xbb, 0x03, 0xfd, 0xd0, 0x0b, 0xeb, 0xdd, 0x18, 0x1e, 0x0b, 0x40, 0x63, 0xc1, 0x71, 0x89, 0x85, 0x92, 0x74, 0x82, 0xa7, 0x78, + 0x4c, 0xb7, 0x22, 0x6c, 0x44, 0x5c, 0xd0, 0x4b, 0xa0, 0xd7, 0x15, 0x8c, 0xbe, 0x22, 0x0b, 0x94, 0xf4, 0x80, 0x33, 0xee, 0xb7, 0x2d, 0x93, 0xd3, 0x40, 0x3d, 0xf2, 0xb6, 0x6f, 0x24, 0x22, 0x41, + 0x4d, 0x95, 0x44, 0x2e, 0xc5, 0x80, 0xa5, 0x98, 0x24, 0x56, 0x33, 0xa8, 0x06, 0x97, 0x0a, 0x01, 0xb8, 0xe0, 0xe6, 0xa8, 0x5b, 0x75, 0x7e, 0xa0, 0xf5, 0x94, 0xb7, 0xab, 0xcf, 0x29, 0xbd, 0x28, + 0x66, 0x40, 0xe1, 0xe9, 0x74, 0x0d, 0xb0, 0x24, 0xd7, 0x45, 0x3e, 0x4d, 0x78, 0xf6, 0x05, 0xa5, 0x5f, 0xcf, 0x73, 0x46, 0xa2, 0x00, 0x22, 0x99, 0x47, 0xfd, 0xe4, 0x1c, 0x28, 0xac, 0x4e, 0xf2, + 0xfe, 0x23, 0xcd, 0x01, 0xff, 0xf3, 0x38, 0x25, 0x17, 0xa1, 0xa1, 0x1c, 0x35, 0x51, 0x91, 0x4d, 0x6a, 0xf5, 0x23, 0x0a, 0xd6, 0x0c, 0xd0, 0x97, 0xe8, 0xef, 0xd0, 0xc3, 0xbc, 0x7e, 0x55, 0x41, + 0x7f, 0x57, 0x90, 0x04, 0x2d, 0xb6, 0x77, 0x46, 0x48, 0xa1, 0x83, 0x79, 0x85, 0x1a, 0xb9, 0xbd, 0x55, 0xf4, 0xa5, 0x10, 0x25, 0x48, 0xa7, 0xe2, 0xe1, 0x57, 0x2c, 0xee, 0x15, 0x76, 0x2a, 0x47, + 0x76, 0x0a, 0x94, 0x0b, 0xb7, 0x45, 0xfd, 0xfb, 0xa3, 0x24, 0x54, 0x86, 0xd4, 0x58, 0x02, 0x0f, 0x83, 0xf2, 0x24, 0xb2, 0x09, 0x97, 0x13, 0x09, 0xab, 0x9c, 0x98, 0x83, 0x84, 0x18, 0x11, 0x5d, + 0xc1, 0x25, 0xfa, 0x5d, 0xb1, 0xed, 0xe2, 0xf2, 0x93, 0xa9, 0xa3, 0x48, 0x76, 0xa9, 0xd7, 0x63, 0x20, 0x6e, 0x74, 0xc6, 0xf8, 0x13, 0x8b, 0x16, 0x61, 0x72, 0x6f, 0x0f, 0xd8, 0xb2, 0x49, 0xa2, + 0x96, 0xf9, 0xa2, 0xb6, 0x62, 0xdd, 0xfc, 0x0a, 0xda, 0x99, 0x04, 0x3b, 0x42, 0x0c, 0x26, 0xab, 0x7e, 0x7f, 0x58, 0x26, 0x42, 0x1c, 0x61, 0x31, 0xd5, 0xa4, 0xea, 0x23, 0x52, 0xf8, 0xc6, 0x25, + 0x3d, 0x57, 0x2c, 0x74, 0xcb, 0x3f, 0xbd, 0x62, 0x07, 0x70, 0x11, 0x4c, 0xa0, 0xcd, 0x91, 0xac, 0x7b, 0xbd, 0x1c, 0x5d, 0x7c, 0xd4, 0x80, 0x05, 0x4b, 0x92, 0x73, 0xd0, 0x08, 0x52, 0x46, 0x1e, + 0x85, 0xd8, 0x60, 0xe5, 0x61, 0x89, 0x1b, 0x7e, 0x92, 0x05, 0x7c, 0xda, 0x56, 0x91, 0xce, 0x29, 0x25, 0xc9, 0xf2, 0xbb, 0xd4, 0x6e, 0xfd, 0xc9, 0xe8, 0xb1, 0x16, 0x8b, 0xa6, 0xde, 0xec, 0xd5, + 0xbb, 0x10, 0x5b, 0x22, 0x59, 0x36, 0x67, 0xe6, 0x04, 0x87, 0x2c, 0x7d, 0xc3, 0xdc, 0xe4, 0xbe, 0x03, 0x0a, 0xaa, 0x68, 0xac, 0x38, 0x11, 0x6f, 0x4b, 0xee, 0x0d, 0x16, 0xf9, 0xbc, 0x27, 0x34, + 0x11, 0x57, 0xfa, 0xc0, 0x3b, 0xc4, 0x64, 0x34, 0xa6, 0x6c, 0x2e, 0x06, 0xcc, 0x9f, 0x3c, 0xd5, 0xbd, 0x34, 0xc7, 0x99, 0xc6, 0x87, 0x25, 0x35, 0x78, 0x4a, 0x4a, 0x36, 0x17, 0xba, 0x4d, 0xc1, + 0xe0, 0x93, 0x37, 0x59, 0xdc, 0x24, 0xd8, 0x7e, 0xf8, 0x0f, 0x0a, 0x12, 0xee, 0xff, 0xf3, 0x1c, 0xdf, 0xf5, 0xfe, 0xeb, 0x8f, 0x28, 0xfc, 0x35, 0xea, 0xee, 0x7f, 0x25, 0xec, 0x4e, 0xff, 0x82, + 0xc8, 0xe7, 0x6f, 0x88, 0xcc, 0xb1, 0x2f, 0xeb, 0xfe, 0x65, 0xc8, 0x1d, 0x0f, 0xff, 0x94, 0x94, 0xe1, 0x08, 0x7f, 0xcc, 0x30, 0x06, 0x38, 0xfa, 0xe4, 0xb5, 0xef, 0xbd, 0x01, 0x3f, 0x60, 0xe9, + 0xcf, 0x49, 0x6f, 0xf6, 0x1a, 0x08, 0x4a, 0xe0, 0x23, 0xbf, 0xdb, 0x78, 0xa5, 0x5f, 0xf7, 0x5c, 0xf4, 0xfd, 0x35, 0x36, 0x89, 0x93, 0xbf, 0x07, 0xbd, 0xd1, 0x05, 0xf0, 0x2d, 0xbf, 0x83, 0x3f, + 0x75, 0xce, 0x3f, 0x4c, 0x4e, 0x47, 0x8c, 0xdf, 0xb3, 0xe9, 0xfe, 0x34, 0xf6, 0x4f, 0xb3, 0xfa, 0x32, 0x29, 0xe0, 0x7f, 0x67, 0x56, 0xff, 0x49, 0xa4, 0x9c, 0x61, 0x5e, 0xee, 0x42, 0x91, 0x0e, + 0x48, 0x21, 0xfd, 0x65, 0x91, 0x66, 0x03, 0x85, 0x3e, 0x1f, 0x2a, 0x86, 0x37, 0x8b, 0x09, 0xb5, 0x83, 0xe8, 0xc1, 0x8c, 0x1f, 0x93, 0xe6, 0x00, 0xde, 0x81, 0x31, 0x9f, 0x6e, 0x4a, 0xcf, 0x9f, + 0xc6, 0x8e, 0x0b, 0x6f, 0x9f, 0x12, 0xfd, 0x17, 0x99, 0x55, 0xc1, 0x07, 0x2a, 0xfc, 0xa8, 0x5d, 0xd4, 0x16, 0xbb, 0x5d, 0xbe, 0xb6, 0xad, 0x6a, 0x2e, 0x9d, 0x2e, 0xd4, 0x14, 0x14, 0xe3, 0x78, + 0x1e, 0x36, 0xde, 0x81, 0xc2, 0xa1, 0x72, 0x59, 0x45, 0x3e, 0x8e, 0xae, 0xae, 0xa4, 0x46, 0x77, 0x47, 0x03, 0x8c, 0x40, 0xa5, 0xe5, 0x72, 0xb5, 0x67, 0xb3, 0x4d, 0x36, 0xf3, 0x88, 0x8d, 0xd1, + 0x0b, 0x5d, 0xcb, 0x74, 0xa5, 0xd6, 0x11, 0x65, 0xd6, 0x63, 0x26, 0x41, 0x34, 0xdd, 0x7a, 0xde, 0x7d, 0x8e, 0x9a, 0x22, 0xa7, 0x83, 0x9c, 0xcc, 0x92, 0xe8, 0x17, 0xe5, 0x5c, 0xae, 0x35, 0x66, + 0x1f, 0x12, 0xde, 0x85, 0x97, 0x52, 0x9e, 0x9a, 0x26, 0x69, 0xe2, 0x0e, 0xa8, 0x31, 0xad, 0x5e, 0x41, 0xa4, 0x73, 0x94, 0x09, 0x8b, 0x1b, 0x22, 0x19, 0xc1, 0xa4, 0x3e, 0xe2, 0xf3, 0x66, 0x58, + 0xc9, 0xfe, 0xcc, 0xb0, 0xce, 0x3f, 0x7c, 0xfa, 0x6a, 0xe2, 0xe5, 0x14, 0x17, 0xbd, 0x13, 0x3e, 0x41, 0x67, 0x4c, 0x76, 0xbf, 0x4b, 0xd0, 0xe4, 0xae, 0xbd, 0x9e, 0x78, 0x8a, 0xa9, 0x72, 0xa5, + 0xe4, 0x80, 0x38, 0xeb, 0x3e, 0x6e, 0x60, 0x02, 0xeb, 0xc1, 0xff, 0x6c, 0x81, 0x04, 0x32, 0xa2, 0xb5, 0x36, 0xef, 0xe3, 0x39, 0x25, 0xa7, 0x27, 0xd2, 0x24, 0xdf, 0x24, 0x03, 0xe1, 0x4c, 0x50, + 0x3d, 0xe4, 0xa8, 0x64, 0x3c, 0xab, 0xec, 0x13, 0x62, 0xe3, 0x63, 0x5d, 0x6e, 0x59, 0x88, 0x5f, 0x36, 0x4c, 0x6c, 0x29, 0x15, 0x9c, 0x2c, 0x12, 0x61, 0x09, 0xa4, 0x3d, 0x68, 0x9b, 0xcb, 0x7e, + 0x8f, 0x94, 0x63, 0x69, 0x67, 0xfc, 0x42, 0x3a, 0xe1, 0xbf, 0x89, 0x3c, 0x12, 0x2c, 0x2c, 0x11, 0x74, 0xb7, 0xd4, 0x0d, 0xbc, 0xde, 0x1d, 0x82, 0x35, 0xcb, 0x6b, 0x7e, 0x5d, 0x86, 0x02, 0xe0, + 0x96, 0xf8, 0xcb, 0x94, 0x64, 0xa6, 0x65, 0x19, 0xf8, 0xdb, 0x1d, 0x5c, 0xc9, 0xc8, 0x92, 0xa6, 0xcb, 0x92, 0xac, 0xcb, 0x22, 0x3d, 0x4a, 0x64, 0x55, 0xca, 0x31, 0x99, 0x8a, 0x4e, 0x9d, 0x71, + 0xe3, 0xae, 0xa1, 0xce, 0x94, 0xf5, 0x41, 0x9b, 0x8b, 0xd4, 0x05, 0x14, 0x2e, 0xf1, 0xd6, 0xa2, 0x6f, 0xef, 0x9a, 0xd6, 0x13, 0x5d, 0xce, 0x52, 0x9c, 0xd7, 0x22, 0x5f, 0x56, 0x85, 0x1b, 0x04, + 0x86, 0xaf, 0x78, 0xf2, 0xf1, 0xed, 0x1d, 0xf3, 0x2f, 0xfd, 0x3b, 0xb7, 0x7e, 0x19, 0xd3, 0xaf, 0xaf, 0x7f, 0x66, 0xbe, 0xfe, 0x7f, 0xe3, 0x5f, 0x3a, 0x27, 0x1f, 0x80, 0xce, 0xbd, 0x17, 0xef, + 0x46, 0x7e, 0x5b, 0x52, 0x5f, 0x7e, 0xe8, 0xa0, 0x48, 0xe3, 0xb2, 0x27, 0x67, 0xf9, 0x8e, 0x60, 0xa1, 0x7f, 0x76, 0x83, 0xca, 0xfa, 0x00, 0x4d, 0xd1, 0xef, 0x17, 0xef, 0xfd, 0x39, 0x65, 0x98, + 0x7d, 0xd8, 0x24, 0xc3, 0x8c, 0x1c, 0x28, 0x02, 0x56, 0x58, 0xc3, 0xb9, 0x44, 0x93, 0xda, 0x45, 0x61, 0x39, 0x96, 0x6d, 0x31, 0x8b, 0xc0, 0xdf, 0xca, 0x02, 0x62, 0x8b, 0x23, 0x7b, 0x7f, 0x61, + 0xca, 0xa2, 0xa1, 0xf6, 0x9a, 0x7f, 0x93, 0xdd, 0x97, 0xd9, 0x97, 0x59, 0x0a, 0x54, 0xfb, 0x75, 0x25, 0x20, 0xcf, 0x3b, 0x42, 0x8d, 0x3a, 0xba, 0x95, 0xf2, 0xcb, 0x4a, 0x00, 0x4c, 0x97, 0x68, + 0xb3, 0xfe, 0x97, 0xb2, 0x89, 0x6f, 0x02, 0x6d, 0x09, 0x8c, 0xd0, 0x9b, 0x93, 0x31, 0xd2, 0xcd, 0x4a, 0x57, 0x20, 0x2b, 0x89, 0x33, 0x05, 0x46, 0x99, 0x1a, 0xc6, 0x0d, 0x5e, 0xbc, 0xcd, 0xcc, + 0x9a, 0x36, 0xe9, 0x3c, 0x98, 0xfa, 0xba, 0xd2, 0x03, 0xa8, 0x44, 0x1a, 0xba, 0x16, 0x1c, 0x7a, 0x31, 0x34, 0x49, 0x56, 0xde, 0x99, 0xb1, 0x54, 0xc2, 0x2b, 0xb5, 0xb9, 0x92, 0x05, 0x67, 0x5a, + 0x40, 0x6a, 0x9d, 0x00, 0x07, 0x18, 0x85, 0x56, 0x94, 0x7e, 0x0c, 0x96, 0xa5, 0x4a, 0x85, 0x52, 0x24, 0x46, 0xd3, 0x0e, 0x71, 0xd9, 0xd9, 0x22, 0xe7, 0x1a, 0x8d, 0x04, 0xc2, 0x9a, 0x8b, 0x0b, + 0xd4, 0x04, 0x03, 0x23, 0x06, 0xf9, 0xd8, 0x83, 0x7d, 0xd1, 0x9f, 0x73, 0x4f, 0xd0, 0x65, 0x51, 0x5c, 0xe7, 0x1a, 0xc3, 0x68, 0x53, 0x82, 0xb9, 0x23, 0x5a, 0x6d, 0x78, 0xae, 0xe0, 0xec, 0x96, + 0xf3, 0xfd, 0x16, 0xdf, 0x2d, 0x7a, 0x78, 0x31, 0x81, 0x9c, 0x2f, 0x48, 0x8c, 0xfc, 0xee, 0xf1, 0xd0, 0x21, 0x16, 0x57, 0x6f, 0xd6, 0xff, 0x18, 0xb6, 0x87, 0xbf, 0x14, 0x3e, 0x00, 0x72, 0x0f, + 0x61, 0xa0, 0x4b, 0x2f, 0xc5, 0xac, 0x5e, 0x48, 0x5c, 0xf1, 0x18, 0x35, 0x7d, 0x7b, 0xac, 0x62, 0xb4, 0xaf, 0x8b, 0xbc, 0xbb, 0xf5, 0x7e, 0x88, 0x8e, 0xef, 0x8b, 0x98, 0x33, 0x08, 0xd1, 0x23, + 0xc9, 0x74, 0xf4, 0xc0, 0xaf, 0xa7, 0x25, 0x87, 0x7d, 0x72, 0x8c, 0x3d, 0x57, 0xb0, 0x5e, 0x2f, 0xb2, 0x5b, 0xb9, 0xbc, 0xde, 0x1d, 0x3e, 0xd5, 0x40, 0x44, 0x88, 0x66, 0x3c, 0xc9, 0x4a, 0x7d, + 0xa7, 0x46, 0x43, 0x2c, 0xab, 0xb5, 0xc7, 0x0e, 0x22, 0x70, 0x7e, 0xe8, 0x36, 0x54, 0x05, 0x69, 0xba, 0x2a, 0xad, 0x5e, 0xdd, 0x63, 0x2f, 0x65, 0xac, 0x0f, 0x04, 0xfc, 0x38, 0xb7, 0x47, 0x12, + 0xd7, 0xc2, 0xda, 0x69, 0x37, 0x8b, 0xd1, 0xe0, 0x74, 0x08, 0x72, 0x83, 0x23, 0xf8, 0xf7, 0xa1, 0xa8, 0x7f, 0xcd, 0x13, 0x7c, 0xf0, 0x6f, 0xa8, 0xe2, 0xdf, 0xb0, 0x85, 0xfd, 0x85, 0x2d, 0xae, + 0x3f, 0xb1, 0x05, 0xfc, 0x4b, 0xb6, 0x10, 0xe8, 0xff, 0x9c, 0x2d, 0xd4, 0x96, 0x1e, 0x7f, 0xe0, 0xb2, 0xec, 0xff, 0x33, 0x2e, 0x3b, 0xc1, 0xab, 0xfa, 0xf6, 0x46, 0xfe, 0x96, 0x66, 0xfa, 0x83, + 0x1d, 0xfc, 0xc3, 0xe0, 0xe2, 0x9f, 0x18, 0xe3, 0xdb, 0xd8, 0xff, 0xeb, 0x99, 0xfd, 0x7b, 0x3d, 0x21, 0xad, 0x0c, 0x67, 0xcd, 0x39, 0xc7, 0xd6, 0x80, 0x98, 0xae, 0xb2, 0xe6, 0x1e, 0x1d, 0xfc, + 0xfd, 0x20, 0x9a, 0x5d, 0x19, 0xa8, 0x6a, 0x2a, 0x5d, 0xa0, 0xa8, 0xa6, 0xa1, 0x6b, 0x2b, 0x85, 0xaa, 0x19, 0xb3, 0x73, 0x95, 0xbb, 0x7f, 0x61, 0x89, 0xe0, 0x62, 0x03, 0x53, 0x1e, 0x71, 0x76, + 0xa9, 0x58, 0x3b, 0x55, 0xf4, 0xce, 0x1d, 0xd4, 0xac, 0x0a, 0x0b, 0x48, 0xc5, 0x84, 0xe2, 0x6f, 0xeb, 0x53, 0x3f, 0xdf, 0xe8, 0x58, 0x81, 0x6a, 0x5a, 0x59, 0x6c, 0xae, 0xc3, 0x98, 0x67, 0x21, + 0xaf, 0x55, 0xaa, 0x81, 0xdb, 0x19, 0xa6, 0x47, 0x5d, 0x5b, 0x9e, 0xd0, 0x6c, 0x78, 0xfd, 0x08, 0x39, 0x61, 0x09, 0xc2, 0xb5, 0x22, 0x37, 0xdd, 0x7e, 0xc5, 0xcc, 0xa3, 0xd5, 0x1f, 0x2a, 0xd2, + 0x44, 0xb9, 0xc9, 0x69, 0x50, 0xdc, 0x89, 0x8b, 0xd7, 0xa1, 0x4f, 0x77, 0x84, 0xc8, 0xf8, 0x63, 0x7b, 0xba, 0x50, 0x9c, 0x55, 0xc2, 0xa5, 0x2b, 0x2b, 0x6d, 0x18, 0x95, 0x82, 0x1e, 0xf0, 0x08, + 0x5f, 0x67, 0x85, 0xdf, 0x62, 0xe6, 0xb9, 0x92, 0x57, 0x97, 0x9f, 0x19, 0xdf, 0x9c, 0xd6, 0x39, 0x43, 0x3b, 0xc1, 0x1b, 0x03, 0xc1, 0xb1, 0x67, 0x8d, 0xc5, 0xb0, 0x0b, 0x1b, 0x1a, 0xda, 0x39, + 0xd3, 0x83, 0xe8, 0xa7, 0x71, 0x24, 0xd5, 0x19, 0x93, 0xc4, 0x59, 0xaa, 0x05, 0x8b, 0x05, 0xcd, 0x1a, 0x25, 0x6e, 0x64, 0x3b, 0x93, 0x9d, 0x84, 0x81, 0xc5, 0x7f, 0x55, 0xe3, 0xbe, 0x14, 0x26, + 0xc6, 0xed, 0x6f, 0xa2, 0xa6, 0x5a, 0xc9, 0x0c, 0x9f, 0x4b, 0xb4, 0xd7, 0x11, 0xbb, 0xaa, 0x6e, 0xfa, 0x94, 0x2a, 0x1b, 0x94, 0x54, 0xee, 0xc5, 0x3d, 0x57, 0xb7, 0x42, 0x95, 0xe7, 0x63, 0x5c, + 0xbd, 0x2e, 0x66, 0xa7, 0x80, 0xd4, 0x3e, 0x2f, 0x3b, 0x7a, 0x81, 0x3e, 0xc6, 0x2b, 0xd0, 0xb4, 0xcd, 0x05, 0x46, 0x00, 0x08, 0x22, 0x61, 0x09, 0xf9, 0xc3, 0x93, 0xcc, 0x64, 0x69, 0xd7, 0xfe, + 0xc2, 0x1a, 0xd5, 0xbf, 0x62, 0x0d, 0xc3, 0xf4, 0x9b, 0xf7, 0xd9, 0xf0, 0xd7, 0x18, 0x6b, 0xcb, 0xb5, 0x03, 0xd9, 0x38, 0x51, 0xc6, 0x5a, 0x24, 0x92, 0x71, 0x0e, 0x7f, 0xc5, 0x1a, 0x98, 0xfd, + 0x1b, 0x6b, 0x04, 0xba, 0x2c, 0xb9, 0xba, 0x2c, 0x4a, 0xa3, 0x2c, 0xf2, 0xa3, 0x2c, 0x32, 0xf5, 0x40, 0x2d, 0xb1, 0x28, 0x7c, 0x0d, 0x20, 0x02, 0x62, 0xb1, 0xbb, 0xe2, 0xd0, 0x80, 0x53, 0x4c, + 0x21, 0xb4, 0xfe, 0x07, 0xf6, 0xda, 0x5b, 0xda, 0x07, 0xb0, 0x06, 0x1b, 0xa6, 0xf5, 0xfb, 0x7b, 0xd6, 0xe9, 0xed, 0xb7, 0x33, 0xe6, 0x2f, 0x24, 0xf0, 0xfd, 0xdc, 0xb9, 0xd3, 0x5b, 0xfa, 0x2b, + 0x7b, 0xd8, 0x30, 0xdf, 0x01, 0x7a, 0x4b, 0x5f, 0x5f, 0x19, 0x22, 0x78, 0x7d, 0xf9, 0xc1, 0xa5, 0x73, 0x34, 0xa1, 0xf1, 0x4f, 0xca, 0x61, 0x7f, 0x34, 0x64, 0x7e, 0xa1, 0x98, 0xaf, 0x2f, 0xf3, + 0x62, 0xdf, 0x08, 0xef, 0x78, 0x54, 0xfb, 0x27, 0x3f, 0xbd, 0x48, 0xe9, 0xf2, 0x9e, 0xfa, 0xaa, 0x87, 0x05, 0x52, 0x94, 0x58, 0x92, 0xc8, 0x80, 0x75, 0x3e, 0xa9, 0x1c, 0x95, 0x61, 0xeb, 0x37, + 0xf3, 0x53, 0x6e, 0xd2, 0x4f, 0xb3, 0x45, 0x8d, 0x2b, 0x65, 0xa9, 0xdf, 0xb8, 0x2f, 0xc2, 0xbe, 0x86, 0xa4, 0x97, 0x2f, 0xf4, 0xac, 0x81, 0x0c, 0x33, 0x4a, 0x1d, 0xa1, 0xda, 0x57, 0xf0, 0xbc, + 0x22, 0x34, 0x40, 0xa3, 0x5b, 0x3e, 0x74, 0xee, 0xbd, 0x7d, 0xa1, 0x9c, 0xbf, 0xb1, 0xee, 0x84, 0x1f, 0xd1, 0x9a, 0x58, 0xaa, 0xeb, 0x37, 0xe6, 0x33, 0xe1, 0x23, 0x5f, 0xd2, 0x1e, 0x16, 0x08, + 0x58, 0xd6, 0x58, 0xf8, 0x6e, 0x3a, 0xd7, 0xd0, 0x6b, 0xc2, 0x36, 0xee, 0x44, 0xf4, 0xd7, 0x9b, 0x2d, 0x06, 0xe6, 0x46, 0xfc, 0x74, 0xe5, 0xb8, 0xf8, 0xae, 0x67, 0x90, 0xe9, 0xc4, 0x5e, 0x48, + 0xec, 0xf5, 0xf1, 0x50, 0xb4, 0xfd, 0xa2, 0x47, 0xc5, 0x1f, 0x9c, 0xa9, 0x8d, 0x31, 0xc3, 0xac, 0xdf, 0x18, 0xa2, 0x9e, 0x7c, 0x96, 0xdf, 0xc5, 0x02, 0x13, 0xc0, 0xb0, 0xa8, 0x6b, 0x2b, 0xf1, + 0xf5, 0xb3, 0x9b, 0xe6, 0x99, 0x7a, 0x3e, 0xbd, 0x2e, 0xdc, 0x97, 0xd1, 0xe9, 0x04, 0xb9, 0x27, 0xf2, 0xe7, 0xf2, 0xd1, 0xd3, 0x87, 0x35, 0xa2, 0x98, 0x95, 0xc2, 0x8d, 0xaf, 0xbf, 0xe3, 0x9d, + 0xc0, 0x44, 0x7d, 0x54, 0x13, 0x5e, 0xf4, 0x32, 0xe9, 0x59, 0x19, 0x02, 0xeb, 0x6e, 0x62, 0x1e, 0xdd, 0x65, 0x84, 0x76, 0x11, 0x40, 0x1b, 0xeb, 0x86, 0xaa, 0xf1, 0x25, 0xbf, 0x57, 0x1b, 0x91, + 0xc2, 0x57, 0xb0, 0x82, 0x98, 0x68, 0x51, 0x9c, 0x8d, 0xb0, 0x5b, 0xf1, 0x76, 0x1e, 0x4f, 0xa9, 0x73, 0x10, 0x58, 0xa7, 0x26, 0xca, 0x64, 0x60, 0x88, 0x53, 0xbc, 0xc7, 0x90, 0x9c, 0x53, 0x21, + 0xc2, 0xb2, 0xc6, 0x11, 0xbc, 0xb2, 0x42, 0x33, 0xd7, 0xc4, 0x3c, 0x6e, 0x2a, 0x5b, 0x4e, 0x03, 0x06, 0x9b, 0x20, 0xac, 0x3c, 0x44, 0xac, 0x68, 0xb4, 0x26, 0x9b, 0x23, 0x52, 0x6b, 0x7d, 0xd2, + 0x4f, 0x9b, 0x0f, 0x44, 0x67, 0xe5, 0x3c, 0xca, 0x34, 0x2f, 0x46, 0xc3, 0xe2, 0x4f, 0xa4, 0x06, 0xc7, 0xbe, 0x8f, 0x02, 0xb3, 0xbd, 0x6e, 0x88, 0x1c, 0x90, 0x8a, 0x99, 0x1e, 0x06, 0x72, 0x63, + 0x9e, 0xf6, 0xd1, 0x83, 0x5d, 0x6d, 0x7b, 0x65, 0x0b, 0x76, 0xe0, 0xa0, 0x2e, 0x9c, 0xbe, 0xa4, 0xcf, 0x70, 0xa6, 0xa7, 0x26, 0xb8, 0x7f, 0xeb, 0xc1, 0xcc, 0xd2, 0xff, 0xc5, 0x35, 0x4b, 0x53, + 0x7d, 0xe3, 0x10, 0xe7, 0xbf, 0xcb, 0xd3, 0xff, 0x89, 0x20, 0x84, 0xe4, 0x0b, 0xe0, 0x21, 0xe2, 0xef, 0xd9, 0xd9, 0x8a, 0x8a, 0x37, 0xc6, 0x76, 0x34, 0x8b, 0xd0, 0xfe, 0x9a, 0x28, 0xe4, 0x9f, + 0xba, 0x2a, 0x0d, 0x4d, 0x77, 0xf4, 0x03, 0xf8, 0x83, 0xd7, 0x24, 0x9b, 0xf5, 0x02, 0x9c, 0x44, 0x5f, 0x0a, 0xa6, 0xf8, 0x8f, 0x3e, 0x94, 0x2a, 0x7f, 0x4c, 0x7c, 0x12, 0x19, 0x53, 0x7c, 0x31, + 0xb5, 0x36, 0xe8, 0x9b, 0xee, 0xbc, 0x0f, 0xe1, 0x87, 0xc1, 0xfd, 0xc9, 0x70, 0xb6, 0xcb, 0x7c, 0xfd, 0x39, 0x10, 0xff, 0xb8, 0xa3, 0x11, 0xe4, 0xef, 0x62, 0x74, 0xfe, 0xd2, 0xb9, 0xec, 0x34, + 0x3d, 0x9a, 0xd0, 0x3d, 0xff, 0xfe, 0xe6, 0x90, 0x69, 0xff, 0x3c, 0x76, 0xf8, 0x3f, 0x9d, 0xd3, 0xf8, 0xf0, 0x72, 0x02, 0x7f, 0x32, 0x01, 0x7d, 0x2b, 0xd7, 0x97, 0x35, 0x93, 0xa1, 0x67, 0x9d, + 0xff, 0xc9, 0x20, 0x74, 0xf4, 0xd8, 0xf7, 0x97, 0xf1, 0x6e, 0x90, 0x45, 0x7e, 0xcb, 0x2e, 0xfc, 0x14, 0x3d, 0x3a, 0xfa, 0xd1, 0xc2, 0xc9, 0x7f, 0x21, 0x0a, 0xde, 0x99, 0x80, 0xaf, 0x7f, 0xe1, + 0x7b, 0x17, 0x8f, 0xdf, 0xca, 0xff, 0x41, 0x9c, 0x0f, 0xdb, 0x8c, 0x4f, 0x9b, 0x66, 0xf3, 0x44, 0x88, 0x5c, 0x64, 0x15, 0xac, 0x94, 0x05, 0x0e, 0xcc, 0x2c, 0x8c, 0x4c, 0x39, 0x83, 0x88, 0x64, + 0x40, 0x72, 0x15, 0x7d, 0x93, 0x63, 0x4a, 0xbe, 0xc3, 0x89, 0xcf, 0x4a, 0x84, 0xdc, 0x9d, 0x40, 0xd8, 0x91, 0x0d, 0x54, 0x13, 0xd1, 0x43, 0x05, 0x26, 0x30, 0xcf, 0x93, 0xbe, 0x48, 0xed, 0x95, + 0xbe, 0x38, 0xe5, 0x6b, 0x8f, 0x0d, 0x77, 0x8e, 0x12, 0x43, 0xb2, 0x42, 0x37, 0x25, 0xc3, 0x26, 0x01, 0xce, 0xe5, 0x48, 0xad, 0xc7, 0x07, 0x5c, 0xc6, 0x05, 0xa6, 0x1b, 0xf2, 0x15, 0x38, 0xc3, + 0xb3, 0x15, 0xc1, 0x4f, 0x44, 0x4d, 0xfa, 0xfd, 0x86, 0x39, 0x39, 0xb1, 0x5e, 0x70, 0xeb, 0x7a, 0xc1, 0x94, 0x6a, 0x1e, 0x7d, 0xd0, 0x42, 0x7b, 0x96, 0xe2, 0x82, 0xc9, 0x27, 0x7a, 0xf5, 0x73, + 0xae, 0x9f, 0xd3, 0xe3, 0x1e, 0x89, 0x42, 0xe8, 0x91, 0x55, 0x7b, 0x00, 0xf4, 0xc3, 0x61, 0xe2, 0xec, 0x6d, 0xcf, 0x15, 0x2e, 0xbc, 0x9e, 0x09, 0x9d, 0xf4, 0xef, 0x03, 0xca, 0xb5, 0xed, 0x6d, + 0x3e, 0x0d, 0x85, 0x02, 0xcb, 0x2e, 0xb2, 0x60, 0xdc, 0x8d, 0x92, 0x94, 0x49, 0x0b, 0xdb, 0xab, 0x60, 0x72, 0xdc, 0x9f, 0x70, 0x51, 0xf1, 0x82, 0xc8, 0xaf, 0x76, 0x44, 0x2e, 0x27, 0x96, 0x9b, + 0x17, 0x22, 0xf8, 0x20, 0x42, 0xba, 0x80, 0xc8, 0x2c, 0x7c, 0xd8, 0xb7, 0xe2, 0x95, 0x79, 0xe4, 0x7a, 0x9a, 0x55, 0xaf, 0x65, 0x8e, 0xfa, 0x28, 0xc3, 0xe0, 0x79, 0x3e, 0x87, 0xba, 0x74, 0xae, + 0x2b, 0x02, 0xeb, 0x37, 0xfe, 0xd6, 0xba, 0x97, 0x5e, 0xf0, 0x68, 0x41, 0x3b, 0x6a, 0xaf, 0x92, 0x19, 0x13, 0x87, 0xc4, 0xf3, 0x55, 0xa3, 0x7c, 0x6d, 0x40, 0x9f, 0x43, 0xdc, 0x90, 0xc9, 0xfd, + 0x04, 0x40, 0xf5, 0x34, 0x3c, 0xde, 0x3e, 0x6f, 0xc9, 0xde, 0x2e, 0x67, 0xe2, 0x1c, 0xbb, 0x9d, 0x4d, 0x5b, 0x24, 0x83, 0xb9, 0x84, 0xc4, 0x4e, 0x45, 0xb6, 0x0e, 0x77, 0xcd, 0x32, 0x04, 0x8b, + 0x66, 0xa4, 0x0d, 0x37, 0x44, 0x6e, 0x7c, 0xd8, 0x5c, 0x69, 0xb1, 0xee, 0xa3, 0xb4, 0x66, 0xad, 0x0a, 0x76, 0xd4, 0xd9, 0x2d, 0x03, 0x7b, 0xf1, 0x97, 0xe6, 0x24, 0x00, 0xc1, 0x14, 0xc3, 0x45, + 0x21, 0xa8, 0x44, 0xd1, 0x71, 0xbe, 0x55, 0x0b, 0x93, 0x5a, 0xe1, 0xc0, 0x79, 0xaf, 0x6e, 0x3d, 0xeb, 0x9a, 0xe0, 0x05, 0x82, 0xb7, 0x65, 0xfd, 0x29, 0x25, 0x9b, 0x5d, 0x77, 0x88, 0x4a, 0x5e, + 0x46, 0x85, 0xcd, 0x5b, 0xdb, 0x90, 0x9c, 0x19, 0xa6, 0xc3, 0xb6, 0x19, 0xf1, 0x8a, 0xc6, 0x37, 0x95, 0x28, 0x76, 0xf9, 0xe2, 0x81, 0xf7, 0x38, 0x4e, 0x6a, 0x88, 0xcc, 0x66, 0x7d, 0x0f, 0x79, + 0x04, 0xb3, 0x99, 0xfd, 0xb8, 0x0f, 0xb3, 0xa0, 0xae, 0x73, 0xc8, 0x87, 0xff, 0x1f, 0x77, 0xef, 0xd1, 0x2c, 0xa9, 0x92, 0x04, 0x0b, 0xef, 0xf9, 0x15, 0xb3, 0x67, 0x51, 0x50, 0x50, 0x88, 0x25, + 0x5a, 0x6b, 0xcd, 0x0e, 0x0a, 0xad, 0x0b, 0x0d, 0xbf, 0xfe, 0xb3, 0x16, 0xb7, 0x6f, 0xcf, 0xd5, 0xf3, 0xde, 0x8c, 0x7d, 0x66, 0x6f, 0x85, 0x9d, 0x3c, 0x34, 0x27, 0xab, 0x9a, 0x74, 0x8f, 0xc8, + 0x8c, 0x70, 0x0f, 0x98, 0xeb, 0xe8, 0xe3, 0x72, 0x9d, 0x39, 0x0e, 0x5f, 0x86, 0xbe, 0x9a, 0xfb, 0x24, 0x6e, 0x99, 0xf1, 0x75, 0x8a, 0x6b, 0xe9, 0x79, 0x6c, 0xfd, 0x88, 0x87, 0x20, 0x6f, 0x68, + 0xba, 0x12, 0x48, 0xe4, 0x0d, 0x52, 0x00, 0xd5, 0x92, 0x9d, 0x25, 0x56, 0x6f, 0x1b, 0x66, 0xa5, 0x1e, 0x8c, 0x8a, 0x32, 0xdc, 0x5b, 0x5b, 0xa9, 0xd2, 0x2a, 0x9e, 0x6b, 0xa4, 0x9b, 0xfd, 0xf3, + 0xd1, 0x62, 0xb6, 0x10, 0xab, 0x2f, 0x56, 0xf6, 0x0a, 0xc3, 0x5e, 0x06, 0x55, 0x33, 0x4c, 0x3b, 0xaf, 0x97, 0xc6, 0x72, 0xe0, 0x01, 0xbb, 0x3e, 0x5c, 0x8f, 0x43, 0xe1, 0x38, 0x5a, 0x2a, 0x56, + 0x03, 0x7c, 0xf5, 0x28, 0x5e, 0xec, 0xbb, 0xe0, 0x42, 0x13, 0x6f, 0xa9, 0xa9, 0xb3, 0x30, 0x49, 0x2f, 0xcc, 0x52, 0xa0, 0x7c, 0xef, 0x2e, 0x52, 0x4a, 0xdf, 0x4c, 0x17, 0x9e, 0x3f, 0x3e, 0xe3, + 0x23, 0xc7, 0x93, 0x8b, 0x4e, 0x3c, 0x5c, 0x2c, 0x76, 0x88, 0xce, 0xd7, 0xf0, 0x07, 0x8d, 0xa3, 0xc0, 0x3f, 0x6c, 0x5b, 0xcf, 0xbe, 0x35, 0x89, 0x7e, 0x13, 0xa2, 0x5a, 0xe3, 0x01, 0x9d, 0x71, + 0xc6, 0x23, 0x73, 0xad, 0x84, 0xcb, 0xcf, 0x7a, 0xb7, 0xaf, 0x60, 0x62, 0x5e, 0x1b, 0x60, 0x6d, 0xbf, 0x93, 0x50, 0x53, 0x7f, 0x78, 0xe6, 0x31, 0x91, 0x10, 0x0e, 0xec, 0x10, 0xbb, 0xa6, 0x54, + 0xf6, 0x78, 0x3c, 0xd0, 0x6f, 0x4c, 0x40, 0xa6, 0x7e, 0x29, 0xc5, 0x67, 0xce, 0xae, 0x53, 0x58, 0x3f, 0x3e, 0x0f, 0x08, 0x7f, 0x29, 0x9a, 0x11, 0x29, 0x3d, 0xaf, 0x01, 0x2b, 0x63, 0x39, 0xf5, + 0x00, 0xaf, 0x9c, 0xed, 0x22, 0x83, 0x1a, 0x2a, 0xaf, 0xf9, 0xca, 0x65, 0xf4, 0xa5, 0x09, 0xef, 0x7a, 0xda, 0xc3, 0x99, 0x82, 0xef, 0xc8, 0x48, 0x23, 0xff, 0x4a, 0x3f, 0x8d, 0x30, 0xf6, 0xc8, + 0x13, 0x1c, 0xf4, 0xa6, 0xc0, 0xcf, 0x2d, 0xb7, 0xca, 0xf7, 0x10, 0x7d, 0x0a, 0x61, 0x9c, 0xdc, 0x69, 0xad, 0xf1, 0xa7, 0xeb, 0xfb, 0xc0, 0x62, 0x8b, 0xfc, 0xc7, 0x32, 0x6e, 0xbf, 0xd9, 0x5e, + 0x95, 0xac, 0xd5, 0xe1, 0x80, 0xd3, 0x64, 0x25, 0x3b, 0x35, 0x38, 0x2e, 0x31, 0x7e, 0x83, 0x7a, 0x7b, 0xc3, 0x9b, 0xf6, 0xb0, 0x17, 0xa8, 0x77, 0x0c, 0x52, 0x9b, 0xd8, 0xa9, 0x4d, 0xbb, 0x3d, + 0xab, 0x36, 0x76, 0xe7, 0x14, 0x3c, 0x46, 0x53, 0xd5, 0x6a, 0xd2, 0x07, 0x4b, 0x42, 0xb8, 0x9c, 0x03, 0x99, 0x0d, 0xc6, 0x5d, 0x52, 0x2f, 0xe4, 0x3a, 0x57, 0xa7, 0xcb, 0xe3, 0x20, 0xc9, 0x0b, + 0x0b, 0xa9, 0x10, 0x31, 0x6e, 0xd7, 0xbe, 0x3a, 0xca, 0xe4, 0xd3, 0x38, 0x5a, 0x4c, 0x49, 0xc0, 0xbc, 0x73, 0xd4, 0x71, 0x2d, 0xb9, 0xcf, 0x4e, 0x90, 0x01, 0x1d, 0xe0, 0x27, 0xfd, 0xae, 0x09, + 0x2b, 0xb1, 0xd6, 0x8b, 0x0d, 0x9e, 0x96, 0x71, 0xe1, 0x01, 0x01, 0xc0, 0xed, 0x83, 0x2e, 0xd8, 0x73, 0x6b, 0x6c, 0x7d, 0x05, 0x91, 0x7d, 0xd6, 0x74, 0xf6, 0xed, 0x26, 0x0f, 0x1e, 0x4e, 0x93, + 0xce, 0xe5, 0xd7, 0xf3, 0xca, 0xcb, 0x73, 0xdf, 0x4a, 0x94, 0x6e, 0xeb, 0x4a, 0xd8, 0xd4, 0x0f, 0xb4, 0xa2, 0x8e, 0xe1, 0x97, 0xc9, 0x03, 0xa5, 0x8c, 0x72, 0x08, 0xfb, 0x95, 0x68, 0xc5, 0x94, + 0xc2, 0xf7, 0xc7, 0xdd, 0x9c, 0x40, 0x2f, 0x8a, 0xdc, 0x8a, 0x10, 0x06, 0x9f, 0x51, 0x5d, 0x92, 0x42, 0xf5, 0xe0, 0xec, 0x2b, 0x5d, 0xc4, 0x82, 0x8d, 0xdd, 0xeb, 0x61, 0xb2, 0x9e, 0x01, 0xaa, + 0x0b, 0x3e, 0xc5, 0x69, 0x4b, 0xeb, 0x86, 0xd8, 0x45, 0x18, 0x86, 0xb3, 0x7b, 0x37, 0x6f, 0x81, 0x74, 0x0a, 0x18, 0xd1, 0x1a, 0x42, 0x26, 0x38, 0xfe, 0xc5, 0x54, 0x30, 0x72, 0x42, 0x30, 0xb0, + 0xad, 0x12, 0x52, 0xde, 0x95, 0x6b, 0xb0, 0x11, 0x7e, 0x3f, 0xef, 0x09, 0x0c, 0x16, 0x03, 0x32, 0x17, 0x0e, 0xe3, 0x48, 0x04, 0x7e, 0x7a, 0x74, 0x2e, 0x45, 0x5a, 0xde, 0xa0, 0x55, 0xb4, 0xf3, + 0x8f, 0x08, 0xe1, 0xb4, 0x2b, 0x26, 0xb9, 0x27, 0x56, 0x0e, 0xe3, 0x10, 0x80, 0xe9, 0xc8, 0x81, 0x30, 0xc1, 0xce, 0xc2, 0xab, 0x34, 0xdf, 0xfc, 0x01, 0x01, 0xcb, 0x38, 0x6b, 0x87, 0xe4, 0x45, + 0xd8, 0xf3, 0x85, 0x2d, 0x8f, 0x2c, 0x19, 0xad, 0xfc, 0xf1, 0xf1, 0x14, 0x87, 0x78, 0x52, 0x75, 0x07, 0x5a, 0xde, 0x68, 0xe5, 0xa9, 0x3b, 0xa4, 0x54, 0x33, 0x20, 0xe4, 0xc4, 0x84, 0xa2, 0x0d, + 0x22, 0x0f, 0x11, 0x31, 0x96, 0x5b, 0x33, 0x3a, 0x2c, 0x20, 0x94, 0x66, 0x5a, 0xbb, 0xa3, 0x63, 0xf8, 0x35, 0x31, 0x4a, 0xc0, 0x3b, 0x55, 0xcd, 0x8f, 0xb2, 0x8a, 0x40, 0x85, 0x8d, 0xe3, 0xe2, + 0x6a, 0xf7, 0xac, 0x6a, 0xd3, 0x24, 0x32, 0xd3, 0x48, 0x50, 0x66, 0x43, 0x4c, 0xa4, 0xde, 0x46, 0x7f, 0x43, 0xf5, 0xb5, 0x11, 0xa7, 0x8a, 0x5e, 0x0b, 0x37, 0x23, 0xbb, 0xc5, 0x34, 0x84, 0x12, + 0xe4, 0xc5, 0x52, 0xe9, 0x66, 0x5c, 0xbb, 0x9c, 0x77, 0x0e, 0x93, 0x58, 0xb7, 0x3e, 0x80, 0x83, 0xf1, 0xba, 0x88, 0xc4, 0x1a, 0x3f, 0x90, 0x3b, 0xa5, 0x57, 0xd8, 0xfe, 0x98, 0x9d, 0x53, 0x15, + 0xd3, 0xa4, 0xbf, 0xd5, 0xbf, 0xec, 0x98, 0x60, 0x18, 0xdf, 0xa6, 0xa4, 0x18, 0x06, 0xfe, 0x31, 0x3f, 0x8b, 0xd0, 0xcd, 0x30, 0x74, 0xfa, 0x23, 0x81, 0x93, 0xc2, 0xc5, 0x40, 0xa6, 0x56, 0x7f, + 0x4c, 0x06, 0xf5, 0x87, 0xda, 0x83, 0x56, 0xf3, 0x6b, 0xab, 0x2a, 0x75, 0x1c, 0xb2, 0xe5, 0xe9, 0xac, 0xdf, 0xc9, 0x34, 0xe0, 0xf8, 0xe3, 0xf9, 0x9b, 0x5e, 0x55, 0xcb, 0x81, 0x3a, 0xda, 0x82, + 0xf4, 0x40, 0xb3, 0xa0, 0x83, 0xf9, 0xb1, 0x03, 0x67, 0x7f, 0x1f, 0xfb, 0xad, 0xe9, 0xdd, 0x77, 0x49, 0x10, 0x97, 0x82, 0x81, 0xaf, 0x09, 0x9a, 0xab, 0x21, 0xda, 0x9d, 0xfd, 0xbb, 0x4d, 0xef, + 0xf7, 0x31, 0x8d, 0x93, 0x4e, 0xee, 0xab, 0x6a, 0xc7, 0xb7, 0x1c, 0x8c, 0xf1, 0x78, 0xd6, 0x82, 0x63, 0xc7, 0xf2, 0xba, 0x44, 0x73, 0x39, 0xeb, 0x3b, 0x66, 0x70, 0xcc, 0x71, 0x88, 0x80, 0xc7, + 0xad, 0xdf, 0xa6, 0xd9, 0x70, 0xba, 0x46, 0xfd, 0xa8, 0xf2, 0xe0, 0xbe, 0x8f, 0xfd, 0xd6, 0x89, 0xf8, 0x2f, 0x29, 0x17, 0xf8, 0x0d, 0xe7, 0xa6, 0x9f, 0x64, 0x7b, 0x44, 0xde, 0x27, 0x9c, 0x2f, + 0x30, 0x8c, 0xa7, 0x09, 0x0a, 0x49, 0x36, 0xee, 0x76, 0xc4, 0x44, 0x37, 0xbb, 0xc7, 0x4f, 0xa2, 0xb0, 0x6f, 0x93, 0xb1, 0x15, 0xb3, 0xe8, 0x57, 0xb4, 0x58, 0x7d, 0x37, 0xe3, 0xc3, 0x73, 0xd2, + 0x6d, 0x7e, 0xdf, 0x88, 0x52, 0x03, 0x9a, 0x7e, 0x8c, 0xc4, 0xb5, 0x36, 0x9f, 0x76, 0x42, 0x70, 0x5c, 0xf9, 0x0c, 0x4d, 0xba, 0x59, 0x5e, 0x74, 0x12, 0x32, 0x16, 0x02, 0x63, 0x66, 0x70, 0x1d, + 0xdd, 0xb9, 0x15, 0x1c, 0xfd, 0x1e, 0x9d, 0xa3, 0xc8, 0x56, 0xbd, 0xd4, 0x10, 0x02, 0x7a, 0x3e, 0x64, 0x50, 0xff, 0x3c, 0xd9, 0x51, 0x75, 0xec, 0x28, 0x18, 0x85, 0x67, 0x3d, 0x9a, 0x79, 0x03, + 0x01, 0xb6, 0x70, 0x91, 0xe3, 0x5b, 0x55, 0x29, 0x1c, 0xd3, 0xcc, 0x4a, 0xa3, 0x2a, 0x9d, 0x54, 0x1c, 0x8d, 0x6d, 0xa4, 0x72, 0x1e, 0x31, 0x37, 0x1f, 0x04, 0xee, 0x3a, 0x19, 0x0b, 0x6a, 0xfc, + 0x81, 0xe0, 0xdc, 0xac, 0x0d, 0x2b, 0xba, 0xee, 0x2e, 0x7d, 0xa2, 0x3a, 0xd1, 0x9c, 0xef, 0xf2, 0x15, 0x9a, 0x94, 0x41, 0x1b, 0x13, 0xa4, 0x8c, 0x7e, 0xc6, 0x02, 0x49, 0x72, 0x86, 0x69, 0xd8, + 0x5b, 0xb9, 0x11, 0xc0, 0x2b, 0xbb, 0x47, 0x3b, 0x77, 0xe9, 0x8a, 0x22, 0x0c, 0x23, 0x96, 0x63, 0x54, 0x8b, 0x76, 0x90, 0xf3, 0xd9, 0xf0, 0x04, 0x65, 0xa5, 0xb9, 0x9a, 0x25, 0x8a, 0x38, 0x14, + 0xde, 0xf1, 0x0b, 0x90, 0xdd, 0xee, 0x72, 0xea, 0x87, 0x8c, 0xa7, 0xd4, 0x00, 0xad, 0xe7, 0x17, 0x94, 0x1c, 0x96, 0x17, 0x03, 0x50, 0xff, 0xa0, 0x88, 0xe9, 0x81, 0xe6, 0xb8, 0xc6, 0x58, 0xfb, + 0x6a, 0x7d, 0x6c, 0x68, 0x6d, 0x0f, 0xa2, 0xf9, 0x10, 0x29, 0xcd, 0xbe, 0xd4, 0x07, 0xa4, 0x48, 0x3e, 0xe9, 0x6b, 0xf2, 0xdb, 0xbe, 0x1f, 0xb6, 0x6d, 0x70, 0xaf, 0x3a, 0xce, 0x41, 0x83, 0x91, + 0x44, 0x6a, 0x26, 0xf8, 0x39, 0x19, 0xdf, 0x47, 0x82, 0x12, 0x82, 0xc1, 0x51, 0x1f, 0x56, 0x00, 0x82, 0xed, 0x1e, 0x32, 0x9d, 0x3c, 0xe6, 0x8f, 0xc1, 0xca, 0xf9, 0x1c, 0x9c, 0xaf, 0x5c, 0x6c, + 0xb1, 0x42, 0xa8, 0xc7, 0xf1, 0xee, 0x9e, 0x14, 0xc2, 0xb1, 0x58, 0x68, 0xf6, 0xe8, 0xc4, 0x67, 0x49, 0xc5, 0x92, 0x82, 0xa4, 0xd2, 0x4a, 0x91, 0x62, 0x9f, 0xf6, 0x6c, 0xd5, 0xd9, 0x4a, 0xd4, + 0xa6, 0xf3, 0x4c, 0x97, 0x8a, 0xfc, 0xb5, 0x99, 0x17, 0x1c, 0x20, 0x2e, 0xed, 0x79, 0x3e, 0x50, 0x1c, 0x55, 0xb8, 0x8e, 0x86, 0xea, 0xf9, 0x8a, 0x3a, 0xe8, 0x71, 0xd4, 0x66, 0xa9, 0x3e, 0xa8, + 0xae, 0x0f, 0x6f, 0x7c, 0x3b, 0xd5, 0x44, 0x7d, 0x66, 0xb5, 0xa6, 0x9d, 0x0b, 0xc4, 0x9e, 0x98, 0xf6, 0x78, 0x1a, 0xea, 0xf6, 0x7e, 0xe9, 0xfc, 0x03, 0x36, 0xfc, 0xa8, 0x47, 0x6e, 0x0c, 0x36, + 0x35, 0xa3, 0x47, 0x02, 0x1b, 0x78, 0xa9, 0x93, 0xa3, 0x56, 0x1d, 0x08, 0x15, 0xa1, 0x1e, 0x54, 0x03, 0xb1, 0x95, 0xe9, 0x13, 0x84, 0x95, 0xd1, 0x79, 0xb5, 0x1c, 0x52, 0x34, 0xaf, 0x55, 0x5a, + 0xad, 0x11, 0x7a, 0xd5, 0x75, 0xc1, 0x88, 0xb2, 0xf9, 0x61, 0xad, 0x45, 0x10, 0xc1, 0xd5, 0x5b, 0x15, 0x67, 0x4a, 0xde, 0xe1, 0xd4, 0x26, 0xeb, 0x7b, 0x88, 0x04, 0x4d, 0x7f, 0x12, 0x2f, 0x19, + 0x20, 0x23, 0xa8, 0x68, 0xa5, 0xf6, 0xe2, 0x1f, 0xd5, 0x6d, 0xe1, 0x8d, 0x13, 0x4c, 0x86, 0x10, 0x65, 0x69, 0x95, 0x59, 0xf3, 0x27, 0x0f, 0xe2, 0x67, 0xcd, 0x91, 0x27, 0x76, 0x58, 0x1d, 0x5c, + 0x4e, 0x49, 0x3e, 0x99, 0xdd, 0xe6, 0x2d, 0xa1, 0x45, 0x81, 0xe7, 0x3a, 0x0f, 0x30, 0xd2, 0x3e, 0xde, 0xa8, 0x6a, 0x2c, 0xc6, 0xc9, 0x1f, 0x91, 0x64, 0x2b, 0x80, 0xf5, 0xc4, 0x62, 0x49, 0xa3, + 0xa6, 0xb7, 0x35, 0x53, 0xf1, 0x2f, 0x9c, 0x8b, 0x4a, 0xcc, 0x75, 0x33, 0x0c, 0xb5, 0xbc, 0x8f, 0xc2, 0x8a, 0x24, 0xe5, 0x88, 0x68, 0xda, 0xf2, 0x44, 0xca, 0xe2, 0xb8, 0xb7, 0x4b, 0xef, 0x1a, + 0x77, 0xfc, 0x6a, 0x96, 0x7b, 0x53, 0x3f, 0x92, 0x3e, 0xe0, 0xd7, 0xac, 0x8f, 0x6f, 0x22, 0x24, 0xda, 0xe2, 0x50, 0xdb, 0xe3, 0xbe, 0x5b, 0xe2, 0x80, 0x6f, 0xd3, 0xa0, 0xdb, 0x54, 0x88, 0xbf, + 0xa2, 0x67, 0x35, 0x65, 0x3d, 0x79, 0xab, 0x3f, 0x6f, 0x4a, 0x06, 0xf6, 0xfe, 0xbe, 0xc8, 0x2b, 0x0a, 0x3a, 0x2c, 0x0a, 0xf4, 0x26, 0x6b, 0xb8, 0x0d, 0x88, 0x10, 0x19, 0xd2, 0x68, 0xe2, 0xe7, + 0xbf, 0x44, 0x57, 0xd5, 0xaf, 0xb6, 0xbc, 0xe9, 0x53, 0xbf, 0xdf, 0xcc, 0xab, 0x8a, 0x9e, 0xfa, 0x53, 0xed, 0xfd, 0xfb, 0xdf, 0x0f, 0xae, 0x5c, 0xa7, 0xc2, 0xdd, 0x06, 0xb9, 0xdf, 0x43, 0x0b, + 0x87, 0x4f, 0xc0, 0xdf, 0x3e, 0xf4, 0xcb, 0x4d, 0xb5, 0x86, 0x46, 0x1f, 0xbb, 0xfb, 0x67, 0xbd, 0xd3, 0xdf, 0xf2, 0x7c, 0xe9, 0xb0, 0x22, 0x8d, 0x4e, 0x28, 0x5e, 0x57, 0xc4, 0xd5, 0x30, 0x0b, + 0xfd, 0xca, 0x5d, 0xbf, 0x88, 0x03, 0x6c, 0x14, 0x3b, 0x7d, 0xb9, 0x34, 0x40, 0x6c, 0x40, 0x52, 0x93, 0x24, 0xfa, 0x7d, 0xfc, 0x62, 0x2a, 0x2c, 0xd1, 0x49, 0xc3, 0x30, 0x54, 0x10, 0x1d, 0x65, + 0xc9, 0xd7, 0xbf, 0x1a, 0x0b, 0x4b, 0x74, 0xc0, 0x7e, 0xdd, 0xd5, 0xf9, 0xd9, 0x5c, 0x98, 0xf9, 0x32, 0xce, 0xd3, 0x18, 0x43, 0xd9, 0x14, 0x05, 0x58, 0x16, 0x0d, 0x53, 0xa2, 0x45, 0xa5, 0x07, + 0x7d, 0x51, 0x42, 0x4b, 0xc5, 0x14, 0x5d, 0x51, 0x82, 0x45, 0x49, 0x14, 0xdd, 0x52, 0x82, 0xf7, 0xe5, 0xca, 0x7e, 0xb9, 0xbe, 0x4b, 0x1a, 0xfa, 0xfa, 0xfb, 0x92, 0x9e, 0x28, 0x41, 0xa3, 0x22, + 0x8b, 0x6e, 0xbe, 0xfc, 0x4c, 0x1c, 0xf4, 0x46, 0x31, 0x14, 0xe5, 0x95, 0x74, 0x05, 0x50, 0x06, 0x44, 0xe5, 0x25, 0x55, 0x7e, 0x79, 0x40, 0x6c, 0x7d, 0xb9, 0x1e, 0x54, 0xf4, 0xe5, 0xca, 0x71, + 0x94, 0x75, 0xd0, 0x2c, 0xc5, 0x47, 0x94, 0x44, 0x51, 0xe3, 0x97, 0x9f, 0xe3, 0xaf, 0x86, 0xc2, 0x28, 0x15, 0x1d, 0x5f, 0x1e, 0xc8, 0xfd, 0xfc, 0x07, 0xbd, 0x2f, 0x57, 0x20, 0x3a, 0xbe, 0x39, + 0x12, 0xa7, 0x14, 0xbd, 0x53, 0xc2, 0x9b, 0xc2, 0xad, 0x6f, 0xce, 0xc4, 0xf9, 0xd7, 0x07, 0x7e, 0xb5, 0x34, 0xbe, 0xbe, 0xcc, 0x3c, 0xb1, 0xe8, 0xfe, 0xcb, 0x4c, 0xa2, 0xe3, 0xcb, 0xcc, 0x35, + 0x2a, 0xb1, 0xd8, 0xfb, 0xcb, 0x83, 0x25, 0x8a, 0xe6, 0xbf, 0x4c, 0x20, 0xb6, 0xe8, 0x06, 0xf8, 0x72, 0xe3, 0xbb, 0xfc, 0xf6, 0x8b, 0xe4, 0xeb, 0xd4, 0x39, 0x4a, 0xa5, 0xbe, 0x3d, 0xc8, 0xb1, + 0x68, 0xe1, 0xeb, 0x47, 0xb0, 0x28, 0x88, 0x62, 0xa3, 0xaf, 0x96, 0xc6, 0x14, 0xcb, 0x51, 0xba, 0x45, 0x3d, 0x29, 0xce, 0xa3, 0x14, 0x8b, 0xfa, 0xfa, 0x11, 0xad, 0x83, 0xb6, 0x28, 0x5e, 0xa3, + 0x00, 0x89, 0xfa, 0x36, 0x75, 0x89, 0xa2, 0xc7, 0x2f, 0x0f, 0xce, 0x28, 0xfa, 0xa0, 0xd8, 0x91, 0x52, 0x0f, 0x6a, 0xa7, 0xc4, 0x37, 0x95, 0x1d, 0x34, 0x42, 0x31, 0xe8, 0xf7, 0xef, 0x48, 0xa3, + 0xb2, 0x92, 0xda, 0xbe, 0x7e, 0x87, 0x37, 0x75, 0xfc, 0x9b, 0x49, 0xb3, 0x1d, 0xb5, 0x40, 0x22, 0xda, 0xd0, 0xd7, 0xfd, 0x79, 0x24, 0x43, 0xb2, 0xeb, 0xd7, 0xf7, 0x49, 0x7d, 0x9e, 0x5d, 0xfc, + 0xec, 0xee, 0x54, 0xf8, 0x66, 0x2a, 0x1f, 0x3e, 0xb5, 0x2d, 0x11, 0xed, 0x55, 0xe3, 0xbf, 0xb6, 0xb4, 0x65, 0xe2, 0x61, 0x1b, 0x1a, 0x77, 0x1c, 0xce, 0x87, 0x96, 0x46, 0x2e, 0x11, 0x6c, 0xa1, + 0x82, 0x80, 0x9f, 0x77, 0xce, 0xbf, 0xbe, 0xc9, 0xf5, 0xab, 0x7b, 0x5f, 0x64, 0x9f, 0x04, 0x67, 0x17, 0x05, 0xf6, 0x9a, 0x04, 0xe8, 0x6e, 0x85, 0x72, 0x93, 0x08, 0xdd, 0x33, 0x45, 0xb4, 0x3d, + 0xfa, 0x49, 0x8d, 0x21, 0x16, 0xc8, 0x5b, 0x45, 0xe4, 0x2a, 0x09, 0xa7, 0xaf, 0x93, 0x00, 0x34, 0x9f, 0x6c, 0xe3, 0x50, 0xfa, 0xbe, 0xff, 0xf1, 0x87, 0xa1, 0x6e, 0x48, 0x7f, 0x77, 0xb8, 0xe4, + 0x58, 0xca, 0x28, 0xad, 0xf3, 0xeb, 0x3f, 0xb4, 0x84, 0x1f, 0xcb, 0xef, 0x77, 0xee, 0x64, 0xbf, 0xda, 0x42, 0xcb, 0xef, 0x93, 0x9a, 0x1e, 0xc3, 0xc3, 0xd3, 0x07, 0x87, 0xb3, 0xbc, 0x17, 0xd3, + 0x8b, 0xb8, 0x77, 0x8c, 0xf1, 0xca, 0x98, 0x7a, 0x36, 0xe9, 0x51, 0x9a, 0x29, 0x1d, 0xf4, 0x84, 0x9f, 0x2f, 0xb6, 0xa4, 0x1d, 0xd4, 0x38, 0x87, 0xc1, 0x22, 0xa6, 0x6c, 0x62, 0x71, 0x88, 0x03, + 0x6c, 0xb2, 0x07, 0x9f, 0xb8, 0x37, 0x3d, 0xa7, 0x3d, 0x9e, 0x3f, 0x7d, 0x0c, 0x67, 0x1a, 0xa1, 0xc9, 0x26, 0xdc, 0x24, 0xc2, 0xf8, 0xa0, 0x12, 0xdd, 0x36, 0x5d, 0x85, 0x9f, 0x7c, 0x42, 0x23, + 0xcf, 0xba, 0xc6, 0x4a, 0x04, 0x64, 0x8a, 0x88, 0x71, 0xa0, 0x14, 0x27, 0x4a, 0x4f, 0xbe, 0x98, 0x29, 0xe6, 0xdc, 0x87, 0xba, 0xc6, 0xf0, 0xa7, 0x3f, 0x75, 0x20, 0xe2, 0xa8, 0xd8, 0xf1, 0x74, + 0x2f, 0x22, 0xe7, 0xfa, 0x56, 0xa7, 0xfe, 0xe5, 0x91, 0x5c, 0xde, 0xed, 0x71, 0x32, 0x72, 0xb3, 0xa5, 0xfb, 0x0f, 0xd0, 0xe2, 0x86, 0x80, 0xb9, 0x25, 0xdc, 0xab, 0xed, 0x82, 0x05, 0x7b, 0x4a, + 0x7b, 0x70, 0x4a, 0xa8, 0xd9, 0xfa, 0x8a, 0x09, 0x82, 0x8b, 0x65, 0x78, 0xd5, 0x2b, 0x02, 0x19, 0x1c, 0x78, 0x84, 0x92, 0xc0, 0xc0, 0xcc, 0x14, 0x9b, 0x95, 0x64, 0xbc, 0x69, 0x04, 0x9b, 0x22, + 0x7e, 0xc7, 0xdf, 0x35, 0xfa, 0x79, 0xc3, 0xc2, 0x61, 0x51, 0x64, 0x43, 0x26, 0x4d, 0x3e, 0xb1, 0xbb, 0x0f, 0xca, 0x62, 0x32, 0xd0, 0x8b, 0x76, 0xc5, 0x68, 0x0b, 0x51, 0xcc, 0x3a, 0xcb, 0x32, + 0xbc, 0x0f, 0xdc, 0x8b, 0x7e, 0xbf, 0x4c, 0xef, 0x1e, 0x3b, 0x7f, 0x45, 0x0c, 0x4a, 0x06, 0x5c, 0x07, 0x3c, 0xe5, 0x6e, 0x19, 0x32, 0x8b, 0x92, 0x4f, 0x41, 0x46, 0x14, 0xab, 0x2a, 0x86, 0xae, + 0x5f, 0xd6, 0x01, 0x5b, 0x07, 0xd8, 0x3a, 0xa4, 0xd2, 0xa4, 0xc5, 0x81, 0x6f, 0x1f, 0x7b, 0x8b, 0x32, 0x53, 0x14, 0x21, 0x96, 0xe4, 0xcd, 0x8c, 0xa9, 0xd2, 0xd5, 0x91, 0x4f, 0xe2, 0x53, 0x67, + 0x33, 0x74, 0xb0, 0xf2, 0x7a, 0x7d, 0x56, 0x01, 0x02, 0x2c, 0x8c, 0x99, 0x29, 0x58, 0xe3, 0x3e, 0xeb, 0x40, 0xc4, 0xf3, 0xca, 0xb7, 0xb9, 0xa7, 0x44, 0xb2, 0x31, 0x58, 0xc9, 0x13, 0x3a, 0x9b, + 0x6f, 0xc3, 0x6f, 0x5b, 0x03, 0x6e, 0xb4, 0x0e, 0x1e, 0x6d, 0xcb, 0xea, 0x8f, 0x92, 0xab, 0xa0, 0x0f, 0x9c, 0x62, 0x04, 0x31, 0x30, 0xf4, 0x24, 0xd2, 0xe5, 0x5e, 0x06, 0x70, 0xff, 0x42, 0x39, + 0x5b, 0x7d, 0x55, 0x80, 0x84, 0xdd, 0xd3, 0xe4, 0x38, 0x1a, 0x17, 0x31, 0x5e, 0xf0, 0x51, 0xea, 0xcd, 0x1b, 0x9c, 0x23, 0xbb, 0xed, 0x09, 0x84, 0x4e, 0xce, 0xb9, 0x72, 0x21, 0x49, 0x37, 0xd4, + 0x0f, 0xab, 0xc3, 0x98, 0x4d, 0x36, 0x72, 0x5b, 0x1e, 0xcf, 0xeb, 0x42, 0x09, 0x73, 0xdf, 0xf1, 0x04, 0x7c, 0xb9, 0xa9, 0x0a, 0x3e, 0xa9, 0xe7, 0x72, 0xf9, 0x26, 0x1c, 0x96, 0x80, 0xfe, 0xce, + 0xd1, 0x4a, 0xc5, 0xa0, 0xf0, 0x0d, 0x63, 0xe5, 0xc1, 0x5f, 0xf8, 0x58, 0xf4, 0xe1, 0xf9, 0xdc, 0xd6, 0x28, 0x14, 0xe4, 0xf5, 0xd1, 0x1f, 0xf1, 0x3c, 0x89, 0xa5, 0x2c, 0x0e, 0xd7, 0x67, 0x4c, + 0x93, 0x2e, 0xbd, 0xc1, 0x93, 0xcf, 0x10, 0x30, 0x92, 0x5f, 0xe3, 0x15, 0x3a, 0x73, 0x53, 0x19, 0x38, 0xdf, 0x0b, 0xd1, 0xde, 0xd5, 0x54, 0x06, 0x20, 0x59, 0xc3, 0xca, 0x64, 0x7e, 0x80, 0x05, + 0x1e, 0x17, 0x6f, 0xc4, 0x1a, 0x50, 0x42, 0xe5, 0xf9, 0xca, 0x1e, 0x2e, 0x50, 0x3d, 0xee, 0x72, 0x45, 0xb6, 0xda, 0x84, 0xc7, 0xa7, 0x38, 0x99, 0x7e, 0x60, 0x9d, 0x49, 0xac, 0x9a, 0x4e, 0xeb, + 0xcf, 0x16, 0xb4, 0x09, 0x1c, 0x72, 0xbd, 0xe5, 0xa8, 0xa4, 0xb7, 0xb2, 0xc3, 0x44, 0x22, 0x88, 0x90, 0x09, 0xe0, 0x8a, 0xd4, 0x66, 0xa1, 0xd5, 0xd7, 0xb9, 0xe8, 0x53, 0xa3, 0x11, 0xfe, 0xb7, + 0xa2, 0x33, 0xdf, 0x8a, 0x90, 0xfe, 0xaa, 0x5a, 0xf8, 0xef, 0xc2, 0x5e, 0xfe, 0x6b, 0x09, 0xec, 0xf5, 0xc3, 0x28, 0x9a, 0x61, 0xd5, 0xdf, 0x09, 0xd2, 0x7e, 0x6d, 0xfb, 0xf5, 0x7e, 0xab, 0x82, + 0xc7, 0xbf, 0x7f, 0x0a, 0x3c, 0x47, 0x17, 0x60, 0x7c, 0x9b, 0x76, 0xfc, 0x8c, 0x76, 0x6b, 0x98, 0xb5, 0x7e, 0x8e, 0x3c, 0x4f, 0x4d, 0xfc, 0xb5, 0xde, 0x96, 0x7b, 0x6b, 0xf4, 0xf8, 0x2d, 0x66, + 0x3e, 0x35, 0xd7, 0xe7, 0x33, 0xd6, 0x72, 0x7e, 0xa9, 0xad, 0x39, 0x7e, 0x9c, 0x1a, 0x00, 0x96, 0xfb, 0x3d, 0x06, 0x6e, 0xa8, 0xa7, 0xd6, 0xbc, 0x0f, 0xbd, 0x91, 0x50, 0xed, 0xd6, 0x7f, 0x0e, + 0x81, 0x4f, 0xdd, 0xf5, 0x5e, 0xba, 0xdb, 0x25, 0x1a, 0xcf, 0xfd, 0x66, 0xa3, 0xcc, 0x0e, 0x35, 0x5b, 0x3a, 0xb8, 0x1f, 0xf2, 0x63, 0x47, 0xe7, 0x59, 0x5e, 0x17, 0x5a, 0x1e, 0xba, 0x5a, 0x10, + 0xf7, 0x93, 0x89, 0xcd, 0xe2, 0xd2, 0xf0, 0x77, 0x9d, 0x18, 0x88, 0x3b, 0x45, 0x96, 0x4a, 0x7e, 0x6c, 0x43, 0xc1, 0x76, 0x68, 0x41, 0x5c, 0x69, 0x3f, 0xcf, 0x3d, 0xea, 0xf9, 0xe5, 0x97, 0x9d, + 0x28, 0xc0, 0x82, 0xb8, 0xff, 0x64, 0x2b, 0xea, 0xa0, 0xb3, 0x5d, 0xc2, 0xd0, 0x9b, 0x4b, 0xc7, 0xb1, 0xc2, 0xd1, 0x97, 0x3e, 0x88, 0x9c, 0x22, 0xc2, 0xf2, 0x81, 0x07, 0x4f, 0x06, 0x18, 0xe4, + 0x82, 0x87, 0xa1, 0xd3, 0xb0, 0xbd, 0x41, 0xb5, 0x38, 0x05, 0xe6, 0x1a, 0x7b, 0x11, 0xde, 0x32, 0x34, 0xb1, 0x7c, 0x51, 0x59, 0x4a, 0x88, 0x73, 0xda, 0xcd, 0x74, 0xa6, 0x33, 0x48, 0x97, 0xb1, + 0xe2, 0xd5, 0xeb, 0x79, 0xed, 0x7e, 0xb2, 0x2b, 0x46, 0xbc, 0xb8, 0x9b, 0x72, 0x70, 0x62, 0xbb, 0x3a, 0x37, 0x44, 0xa9, 0x85, 0x67, 0xc6, 0x3e, 0x30, 0x3f, 0x23, 0xe3, 0x02, 0x69, 0x31, 0x62, + 0x88, 0x59, 0x6b, 0x5a, 0xd8, 0x6b, 0xc6, 0xb1, 0x7c, 0x54, 0x38, 0xbf, 0x44, 0xd1, 0x26, 0xa8, 0x81, 0x7d, 0x05, 0xf6, 0xbd, 0x53, 0x31, 0xd7, 0x3e, 0xd7, 0xe8, 0x11, 0xba, 0x26, 0xe2, 0x17, + 0x4a, 0xc1, 0x54, 0x1a, 0x7d, 0x7c, 0x46, 0xb9, 0xee, 0xf9, 0x14, 0xd9, 0x1e, 0x76, 0xfb, 0x24, 0x0c, 0xc5, 0x06, 0x2c, 0xf4, 0x81, 0x5d, 0x6b, 0x64, 0xc9, 0x50, 0xa7, 0xe1, 0x24, 0x42, 0x13, + 0x91, 0x7f, 0xf4, 0xc4, 0xfc, 0xf9, 0xf0, 0x13, 0xfb, 0x10, 0x9e, 0x42, 0x8a, 0x98, 0x93, 0x0e, 0x05, 0x13, 0xc1, 0xa6, 0xe2, 0x2d, 0x55, 0xb0, 0x38, 0xaf, 0x0b, 0xbd, 0x83, 0x69, 0x72, 0xa3, + 0x21, 0x2e, 0x08, 0x9f, 0x77, 0x78, 0x0b, 0x62, 0xa2, 0x22, 0x4e, 0xde, 0xfa, 0xc0, 0xea, 0xde, 0xc1, 0x18, 0x88, 0x30, 0x57, 0xbc, 0xf9, 0xf4, 0x44, 0x48, 0x2e, 0xc5, 0x2d, 0x8d, 0x2a, 0x18, + 0x25, 0xa5, 0x64, 0xb7, 0x4e, 0xdf, 0x28, 0xa6, 0x8c, 0x6d, 0x30, 0x16, 0xc7, 0xc4, 0xf3, 0x35, 0x7f, 0x77, 0xbd, 0x5a, 0x9d, 0x93, 0xed, 0xc5, 0x57, 0x78, 0xc2, 0xdc, 0xfb, 0x3c, 0x32, 0x8e, + 0x58, 0xfb, 0xf3, 0x69, 0xdb, 0x26, 0x1c, 0x00, 0x8a, 0xc2, 0x82, 0x1b, 0x1a, 0x7f, 0x2e, 0x73, 0x7a, 0x33, 0x70, 0xf3, 0x3e, 0xdb, 0xf5, 0x79, 0x29, 0x4b, 0xfd, 0x0c, 0x35, 0x73, 0x2a, 0xec, + 0x84, 0x1a, 0xdb, 0x87, 0xfb, 0x42, 0xeb, 0x72, 0xc3, 0xea, 0x8c, 0xd7, 0x3e, 0xa6, 0xaf, 0x0d, 0x89, 0x0d, 0x2f, 0x4d, 0x23, 0x2d, 0x31, 0x45, 0xf5, 0xd1, 0x93, 0x7b, 0xba, 0x1f, 0x5d, 0x58, + 0x6f, 0x92, 0x04, 0x96, 0xeb, 0xb9, 0xa4, 0x31, 0x53, 0x77, 0x89, 0x6a, 0xdc, 0xe4, 0x87, 0x79, 0x1d, 0x6f, 0x48, 0x88, 0xd3, 0x69, 0x63, 0x84, 0x8f, 0x12, 0x62, 0xbd, 0xa1, 0x62, 0x86, 0xe2, + 0x8d, 0x55, 0x3c, 0xb4, 0xc5, 0x42, 0x18, 0x30, 0x13, 0x14, 0x39, 0xbc, 0x5a, 0xa2, 0xbd, 0x6b, 0x9f, 0xe7, 0x16, 0xd5, 0xfa, 0x93, 0x55, 0xcb, 0x34, 0x32, 0x47, 0xea, 0x31, 0x01, 0x97, 0xec, + 0x3f, 0x76, 0x38, 0xb0, 0xe9, 0x70, 0x36, 0x4d, 0x3b, 0xa4, 0x52, 0x12, 0x95, 0x3b, 0x4a, 0x60, 0xe1, 0xdb, 0x4a, 0x6f, 0x8e, 0xe9, 0x08, 0xb5, 0x4e, 0x63, 0x32, 0x88, 0x5a, 0x77, 0x1b, 0x2a, + 0xb1, 0xf6, 0xe5, 0x8f, 0x9d, 0x30, 0x66, 0x39, 0x67, 0xaa, 0x45, 0xd1, 0xec, 0x5d, 0x6c, 0xb4, 0x63, 0x60, 0x3a, 0x38, 0x35, 0xc1, 0x39, 0x00, 0x6d, 0xa3, 0x65, 0x87, 0x5a, 0x38, 0xb8, 0xac, + 0x4a, 0x7b, 0xd9, 0x3f, 0x54, 0xa6, 0xe5, 0xd3, 0x43, 0x9e, 0x87, 0x0d, 0x24, 0xf6, 0xeb, 0x43, 0x04, 0x04, 0x6d, 0x35, 0x10, 0x7f, 0xbc, 0xa3, 0xfc, 0x72, 0xd3, 0x37, 0xf7, 0x89, 0x9c, 0x46, + 0xfb, 0x80, 0x1b, 0xde, 0x2f, 0x61, 0x8d, 0x2b, 0xe7, 0xa3, 0xbf, 0xab, 0x56, 0xba, 0xa4, 0x8f, 0x9c, 0x49, 0xc0, 0xbd, 0x54, 0xfa, 0xf5, 0xd0, 0x84, 0x1b, 0x26, 0x3f, 0x4c, 0xab, 0x9c, 0x62, + 0xf5, 0x42, 0x54, 0x14, 0x2b, 0x5f, 0x93, 0x64, 0xd0, 0xfb, 0xc1, 0x4b, 0xab, 0xd4, 0xa3, 0x2e, 0x6f, 0x17, 0xae, 0xfa, 0x66, 0x8f, 0xef, 0x61, 0xf1, 0xa5, 0x1d, 0x92, 0xfb, 0x67, 0x32, 0xe5, + 0x7f, 0xac, 0x69, 0xfe, 0xc7, 0x15, 0x52, 0x25, 0x47, 0x85, 0xb7, 0x43, 0x67, 0x1b, 0x18, 0x88, 0x59, 0xd8, 0xad, 0x59, 0xcb, 0x44, 0xa8, 0x15, 0x1c, 0x09, 0x56, 0x02, 0x6f, 0x5e, 0x18, 0x48, + 0xe8, 0x14, 0xf5, 0x77, 0xa9, 0xc2, 0x57, 0x49, 0xd6, 0xa1, 0x18, 0x7f, 0x1a, 0x9d, 0xc6, 0x2a, 0x2b, 0x4d, 0x19, 0x8e, 0x3a, 0x84, 0x93, 0x11, 0x42, 0xac, 0x48, 0xfc, 0xa5, 0xb4, 0x56, 0xb0, + 0x86, 0xd6, 0x99, 0x2b, 0xe4, 0x4c, 0x6d, 0x52, 0x76, 0x9c, 0xb5, 0x66, 0x9b, 0x82, 0x96, 0xeb, 0xad, 0x8f, 0x33, 0x7d, 0x96, 0x01, 0x50, 0xab, 0x49, 0x2f, 0x53, 0x90, 0x83, 0x45, 0x2a, 0x9f, + 0xbd, 0x02, 0x7c, 0x78, 0x9f, 0x4c, 0x03, 0xd9, 0x6b, 0x7b, 0xdb, 0x3c, 0xc3, 0x70, 0xca, 0xb3, 0xef, 0xa6, 0x37, 0x22, 0xe9, 0x7b, 0xe3, 0x82, 0x9d, 0xb4, 0xad, 0xc7, 0x89, 0xc2, 0x30, 0xa6, + 0xb0, 0x38, 0xe8, 0xa1, 0x27, 0x16, 0xf0, 0x22, 0xb6, 0x9b, 0xba, 0x71, 0x3c, 0x14, 0x13, 0xd5, 0x00, 0xc2, 0xcf, 0x05, 0x77, 0xe9, 0x7c, 0xf2, 0xbc, 0xbd, 0xa7, 0xe2, 0x93, 0xf4, 0x30, 0xed, + 0x70, 0x46, 0x58, 0x08, 0xca, 0x1b, 0x52, 0x10, 0x9c, 0xeb, 0xc6, 0x85, 0x79, 0xec, 0xf3, 0xf4, 0xf2, 0x2a, 0x6e, 0xfd, 0x14, 0xea, 0x40, 0x1f, 0x6d, 0xe9, 0xe9, 0x92, 0x82, 0x7d, 0x8c, 0xec, + 0x33, 0x53, 0xa8, 0x90, 0x35, 0x42, 0x06, 0x8d, 0x86, 0xa5, 0x04, 0x1e, 0xb9, 0x9b, 0x62, 0x56, 0x5d, 0x6d, 0x32, 0x4a, 0x32, 0xef, 0xcc, 0x04, 0xaf, 0x1b, 0x6d, 0x91, 0x98, 0x46, 0x3a, 0xb5, + 0x44, 0xfd, 0xc2, 0x19, 0x2c, 0x83, 0xc8, 0x5e, 0x38, 0x38, 0xd4, 0x5d, 0x4e, 0x12, 0xbc, 0x1d, 0xd1, 0x8f, 0xfc, 0x59, 0x6e, 0x97, 0x1a, 0x06, 0x88, 0x05, 0xd5, 0xee, 0xeb, 0x11, 0xbf, 0xce, + 0xd1, 0xce, 0x4a, 0xbe, 0x2b, 0x81, 0xce, 0x3c, 0xd1, 0x5e, 0x22, 0x88, 0x16, 0x16, 0x57, 0x4b, 0xa6, 0x44, 0xe4, 0x69, 0x37, 0xb2, 0xb6, 0x1a, 0x6f, 0x2b, 0xa8, 0xe0, 0x97, 0x95, 0xd4, 0xac, + 0x7a, 0x4a, 0x83, 0x55, 0xcf, 0x9f, 0xa0, 0x7f, 0xd2, 0xf2, 0xe4, 0x0a, 0x4c, 0x43, 0x6d, 0xe8, 0x8c, 0xeb, 0x76, 0xd3, 0x96, 0x6b, 0xbe, 0xd7, 0xe4, 0x33, 0xc1, 0x8c, 0xa7, 0x3c, 0x5f, 0x26, + 0x40, 0x91, 0xa5, 0x42, 0xb4, 0x67, 0x6b, 0xcf, 0xd0, 0x2b, 0xda, 0x82, 0x00, 0xbb, 0xed, 0x86, 0x73, 0x1a, 0xad, 0x2b, 0x84, 0x15, 0x07, 0x1f, 0xef, 0x92, 0xaf, 0x24, 0xcc, 0xdb, 0x50, 0xac, + 0x0f, 0x16, 0xac, 0xb8, 0xa8, 0x35, 0x0d, 0x25, 0xbb, 0xe8, 0x97, 0x23, 0x7e, 0xc4, 0x5b, 0x3e, 0xd5, 0xb5, 0x84, 0x73, 0x84, 0xb7, 0xb1, 0xdc, 0x07, 0xe9, 0x81, 0x1a, 0x75, 0x83, 0x61, 0x51, + 0xe7, 0xf2, 0xac, 0x8b, 0x64, 0x5e, 0x52, 0x59, 0xa0, 0xee, 0xb7, 0x76, 0x2f, 0xe4, 0xad, 0xde, 0xa1, 0xde, 0xbd, 0x8a, 0x1c, 0xcc, 0x27, 0x13, 0x97, 0x25, 0x42, 0x6b, 0xf1, 0x2a, 0x70, 0x16, + 0xf7, 0x69, 0xbb, 0x57, 0x22, 0xec, 0x41, 0x7c, 0xcb, 0xb4, 0xf9, 0x99, 0x94, 0x57, 0x73, 0x24, 0x30, 0x59, 0x51, 0x1a, 0x01, 0x70, 0x62, 0x2d, 0x08, 0xc8, 0xd0, 0x9c, 0xa6, 0x79, 0xd1, 0xb2, + 0x57, 0xce, 0xb5, 0xc1, 0x9c, 0xaa, 0x86, 0x51, 0x82, 0xf2, 0x78, 0x35, 0x51, 0x8b, 0xfa, 0x39, 0x76, 0x9e, 0x98, 0x95, 0x65, 0x7e, 0x61, 0xbe, 0xfc, 0x4a, 0x21, 0x38, 0xfc, 0xce, 0x83, 0x3b, + 0x11, 0x44, 0xcb, 0xae, 0x93, 0x49, 0xf2, 0xe5, 0x49, 0xcd, 0x97, 0xed, 0x04, 0x57, 0x04, 0xb8, 0x3f, 0x11, 0xb6, 0x5a, 0xda, 0xed, 0x22, 0xa9, 0xfd, 0x82, 0x4f, 0x8f, 0xf2, 0x11, 0x35, 0x37, + 0x5d, 0x99, 0x55, 0x1f, 0x26, 0x37, 0xa2, 0xa1, 0xea, 0xe8, 0x63, 0x67, 0xe4, 0xf3, 0xe3, 0xd3, 0x5f, 0xca, 0x91, 0x5a, 0xb4, 0x06, 0xfd, 0x75, 0x21, 0x70, 0xde, 0xd5, 0x89, 0x33, 0x0e, 0xf9, + 0x9c, 0xfc, 0x42, 0xbf, 0xff, 0xda, 0xe1, 0xff, 0x43, 0xdf, 0x0b, 0xde, 0xf8, 0x92, 0x36, 0x5d, 0xcc, 0x2f, 0x24, 0x6c, 0x53, 0x72, 0x00, 0xf2, 0x1f, 0x16, 0x51, 0xdb, 0xf4, 0xcc, 0xef, 0x9e, + 0x79, 0xef, 0x1f, 0xf5, 0x8e, 0xff, 0xd0, 0x1d, 0xe0, 0xd0, 0x6f, 0xce, 0xd3, 0x68, 0xe9, 0x2b, 0xa7, 0x02, 0x4c, 0x79, 0xa8, 0xbe, 0xe0, 0x2f, 0x49, 0xc0, 0xbb, 0xe9, 0xf3, 0xd5, 0xbd, 0x7b, + 0xee, 0xa7, 0x0a, 0x58, 0x4d, 0xe3, 0x3b, 0xbb, 0x4b, 0x85, 0xae, 0xf2, 0x9e, 0xe4, 0x16, 0x87, 0x72, 0xf5, 0x43, 0x26, 0x0d, 0xe2, 0xca, 0xac, 0xf9, 0x45, 0x1c, 0xf3, 0x7d, 0x6a, 0x2c, 0x87, + 0x7e, 0x15, 0xc7, 0xd4, 0x58, 0xef, 0xf8, 0x56, 0xab, 0x2b, 0x7d, 0x1d, 0xfc, 0x31, 0xd6, 0x50, 0xc8, 0x6f, 0xa4, 0x67, 0xbd, 0x38, 0x38, 0xa7, 0xc8, 0xd7, 0xf7, 0xb4, 0xf7, 0xaf, 0xc8, 0xe5, + 0x8a, 0xef, 0x29, 0x2a, 0x47, 0x1d, 0x47, 0x00, 0xfc, 0x66, 0x56, 0xbf, 0xb6, 0xe0, 0x38, 0xf4, 0x53, 0xfb, 0xde, 0x86, 0xf3, 0x8f, 0xba, 0x70, 0x34, 0x05, 0x04, 0xb0, 0xab, 0x38, 0xa4, 0xc4, + 0xbc, 0x13, 0x27, 0xf6, 0x8b, 0x09, 0xe1, 0x7d, 0x3b, 0xb1, 0x43, 0x13, 0xd9, 0xa5, 0x94, 0x74, 0x4b, 0x71, 0x5c, 0xa1, 0x49, 0xd0, 0xa2, 0x5b, 0x3c, 0x70, 0xc6, 0x3d, 0x0e, 0x2c, 0x74, 0xde, + 0xc3, 0x61, 0xa5, 0x85, 0x85, 0xac, 0x60, 0xd8, 0x17, 0xe2, 0xf0, 0x69, 0xd4, 0x80, 0xa9, 0xb1, 0x97, 0xb4, 0x7e, 0x0e, 0x0a, 0x40, 0x04, 0x1f, 0xc6, 0x99, 0x49, 0x0f, 0x09, 0x41, 0x24, 0x1d, + 0xba, 0x53, 0x50, 0x61, 0xb4, 0x6f, 0x4c, 0x96, 0x5e, 0xde, 0xc1, 0x4f, 0xf4, 0x03, 0xe3, 0xdf, 0xa2, 0x63, 0xbc, 0xe3, 0x79, 0x26, 0xf9, 0x18, 0xe7, 0x10, 0xe1, 0x88, 0x3e, 0x8f, 0x15, 0x7f, + 0xcd, 0xe2, 0x93, 0x05, 0x61, 0x0c, 0x7b, 0x49, 0x60, 0x18, 0xe3, 0x2f, 0xb5, 0x19, 0xe1, 0x16, 0xa0, 0xe1, 0x37, 0xea, 0x07, 0x2d, 0xa4, 0x37, 0x90, 0xeb, 0x18, 0xa4, 0x89, 0xae, 0x7a, 0x2f, + 0x7e, 0x5c, 0x53, 0x98, 0xb3, 0x5c, 0x6f, 0x4c, 0x6f, 0xa5, 0x12, 0x52, 0xa0, 0x44, 0x32, 0x43, 0x6d, 0x8b, 0xe2, 0x42, 0xb8, 0xe1, 0x91, 0x51, 0xc2, 0x4f, 0xf0, 0xd1, 0x84, 0x15, 0xee, 0xd3, + 0xf8, 0xc7, 0x65, 0x74, 0x21, 0xd3, 0xe4, 0xa6, 0xaf, 0x06, 0x20, 0x4c, 0x09, 0xa2, 0x3b, 0x2b, 0x77, 0xbb, 0xba, 0xfa, 0x7c, 0x4f, 0xf9, 0x7b, 0x11, 0xc5, 0x6e, 0x75, 0x53, 0x35, 0x61, 0x20, + 0xf1, 0xd9, 0xb2, 0xb8, 0x31, 0xd7, 0x9e, 0xc9, 0x69, 0xa6, 0xc9, 0x2c, 0x04, 0xac, 0xad, 0x04, 0x7d, 0xc3, 0x78, 0x70, 0xbc, 0x8c, 0xd0, 0xa0, 0xf8, 0xa5, 0x72, 0x16, 0xc6, 0xd4, 0x51, 0x16, + 0x7f, 0x23, 0xee, 0x29, 0x02, 0xa3, 0xba, 0xc0, 0xf5, 0xa6, 0x44, 0x89, 0xb4, 0x81, 0xaf, 0x94, 0xbc, 0xf0, 0x55, 0xc5, 0xa6, 0x1c, 0x72, 0xf0, 0xe2, 0x8a, 0x04, 0xa5, 0xed, 0xb3, 0xf5, 0x18, + 0x9d, 0x93, 0x2a, 0x45, 0x5d, 0x7f, 0xf0, 0xc3, 0x7b, 0xc5, 0x03, 0x90, 0x22, 0xa1, 0x1e, 0xf7, 0x8e, 0x00, 0x0f, 0x83, 0x46, 0x84, 0xb5, 0x0a, 0xe6, 0x1b, 0x50, 0x0e, 0xc6, 0x1d, 0x01, 0x78, + 0xa8, 0xf0, 0x5c, 0x53, 0x74, 0xea, 0xb0, 0x05, 0x5d, 0xf7, 0x19, 0x7d, 0x04, 0x31, 0x37, 0x2a, 0xdc, 0x01, 0x79, 0x94, 0x45, 0x35, 0x51, 0x16, 0xa5, 0xdb, 0x6d, 0x3c, 0xc4, 0xed, 0xdc, 0xe4, + 0xd6, 0x61, 0xb2, 0x89, 0x5e, 0xcb, 0xcd, 0x9b, 0xd4, 0x2a, 0xf7, 0xab, 0x5b, 0x48, 0xbd, 0xa6, 0x2d, 0xf2, 0x86, 0xb3, 0x50, 0x45, 0xb1, 0x83, 0x0c, 0x8c, 0x41, 0x53, 0x7b, 0x92, 0xb6, 0x2d, + 0xec, 0x38, 0x13, 0x77, 0x52, 0xce, 0xcc, 0xa3, 0x4d, 0x9f, 0x22, 0xe3, 0x59, 0xed, 0xcb, 0x1c, 0x57, 0x77, 0x4b, 0xd7, 0xe1, 0xb9, 0x9e, 0xee, 0x16, 0xc6, 0xb1, 0x3e, 0xc1, 0xec, 0xcb, 0x61, + 0x4b, 0xd3, 0x95, 0xcb, 0xca, 0x91, 0xed, 0x95, 0x78, 0xdf, 0x1b, 0x09, 0xf9, 0x2a, 0x66, 0xa3, 0x53, 0x99, 0xe1, 0x40, 0xe9, 0x45, 0x4f, 0x5a, 0x4a, 0xb3, 0xdc, 0x0d, 0xc5, 0xce, 0x39, 0xf0, + 0x45, 0xd1, 0x42, 0x3d, 0xf7, 0x6f, 0x11, 0xb7, 0xdf, 0x41, 0xfe, 0x48, 0xb0, 0x8a, 0xee, 0x72, 0x64, 0xb6, 0x8a, 0x17, 0x78, 0xaf, 0xcc, 0x88, 0x18, 0x08, 0xa3, 0xf6, 0xf0, 0xf6, 0x52, 0xf0, + 0x62, 0x59, 0x3a, 0xce, 0xe9, 0x60, 0x6d, 0x0a, 0x56, 0xf7, 0xe0, 0x2a, 0xf6, 0x0d, 0xb8, 0x87, 0x82, 0x73, 0x93, 0xb4, 0x47, 0xab, 0xf5, 0x48, 0x3c, 0x9d, 0x60, 0xb3, 0x94, 0x08, 0x44, 0x8f, + 0xae, 0x65, 0x38, 0xe2, 0xdb, 0x3d, 0xdf, 0x26, 0xf6, 0x61, 0x1f, 0x82, 0x4c, 0xf7, 0xf3, 0x33, 0xc4, 0x15, 0x2b, 0x99, 0x35, 0x66, 0x2a, 0x15, 0x69, 0xc7, 0x75, 0xb1, 0xa8, 0xe7, 0x18, 0x2e, + 0xa6, 0x31, 0x67, 0x7d, 0x9d, 0x2a, 0x35, 0x1a, 0xa0, 0x28, 0xa1, 0x31, 0x6f, 0x8a, 0xfc, 0xb3, 0x02, 0x0b, 0xe6, 0x1b, 0xa7, 0x9a, 0x7f, 0x5c, 0x9a, 0xec, 0x1e, 0x0d, 0xdc, 0xa2, 0x94, 0x6a, + 0xc2, 0xcd, 0xeb, 0x13, 0x00, 0xac, 0x1e, 0xce, 0xe0, 0xb0, 0x7d, 0x78, 0xb0, 0x74, 0xb9, 0xdf, 0x95, 0x26, 0x7b, 0x3f, 0x88, 0x77, 0xdf, 0xec, 0x77, 0xd4, 0xa2, 0x2d, 0x49, 0x1d, 0xd2, 0xe3, + 0xc1, 0xba, 0xac, 0xd0, 0xb4, 0x2d, 0xd4, 0xd6, 0x26, 0x64, 0x0d, 0x29, 0xbe, 0xae, 0xc8, 0xa8, 0xf7, 0xc0, 0xfd, 0x69, 0x34, 0xb6, 0xb8, 0xe1, 0xbe, 0x4c, 0xbb, 0xec, 0x74, 0x6c, 0xec, 0x05, + 0xd3, 0xf9, 0xab, 0xfd, 0x54, 0x46, 0xf8, 0x78, 0x30, 0x22, 0x1d, 0x16, 0x6c, 0x2b, 0xc2, 0x39, 0x92, 0x25, 0x7d, 0x15, 0x1e, 0x52, 0xff, 0x20, 0x0b, 0x91, 0x84, 0xf0, 0xdc, 0x7d, 0x34, 0x88, + 0xc8, 0xa5, 0x54, 0xde, 0x92, 0x94, 0xca, 0x48, 0x30, 0x41, 0xf7, 0x27, 0x00, 0x09, 0xeb, 0xa0, 0xaa, 0xcc, 0x88, 0x6a, 0x34, 0xa5, 0xdf, 0xe1, 0xb3, 0xe2, 0xcf, 0x37, 0x8a, 0x91, 0x4c, 0x6e, + 0x62, 0xc3, 0x65, 0xc1, 0x16, 0x56, 0x3e, 0xb9, 0x6c, 0x8f, 0x6d, 0x1c, 0xd5, 0xdd, 0x73, 0x98, 0x1f, 0x6c, 0x17, 0xcb, 0xea, 0x48, 0x62, 0x70, 0x79, 0xf7, 0x32, 0xec, 0x36, 0xae, 0x35, 0x95, + 0xef, 0x5e, 0xd5, 0x5b, 0xab, 0x08, 0x80, 0x29, 0x7d, 0x48, 0x7d, 0xb0, 0xaf, 0x27, 0x3d, 0xf4, 0x1f, 0xe8, 0xb0, 0x0d, 0xcd, 0xdf, 0xb5, 0x5c, 0xde, 0x9c, 0x77, 0xf9, 0xc8, 0x46, 0xaa, 0xa7, + 0xae, 0x68, 0x42, 0xd9, 0xf4, 0x49, 0xd6, 0xb4, 0x8b, 0x9e, 0xd9, 0xa1, 0xd3, 0x79, 0x16, 0x3d, 0xcb, 0x3c, 0x01, 0x6f, 0xd6, 0x8d, 0x12, 0x94, 0xbb, 0xa9, 0x3d, 0xf4, 0x22, 0xdd, 0x86, 0x4c, + 0x1f, 0x10, 0xb0, 0x29, 0x66, 0xe7, 0xee, 0xdd, 0x58, 0xb1, 0x34, 0x87, 0x8e, 0x18, 0x12, 0x05, 0xa1, 0xf9, 0x36, 0xcd, 0x81, 0xaa, 0x28, 0x59, 0x58, 0x8e, 0xd2, 0xa8, 0x8e, 0xbe, 0x69, 0xdc, + 0x42, 0x03, 0xeb, 0x8c, 0xa6, 0xe8, 0xec, 0x3d, 0x25, 0xe7, 0x8b, 0xeb, 0xac, 0x35, 0x93, 0xca, 0xda, 0xd2, 0x21, 0x51, 0x13, 0x7c, 0x29, 0x7c, 0xe6, 0x4c, 0x6f, 0xe0, 0x8d, 0xc2, 0x6b, 0x7e, + 0x05, 0xf6, 0xb5, 0xbd, 0xf8, 0xb9, 0x8c, 0x55, 0x4a, 0xbb, 0xdd, 0xc5, 0xef, 0xac, 0x67, 0xf3, 0x91, 0x8c, 0xab, 0x63, 0xed, 0x0e, 0x0b, 0x15, 0xd8, 0x35, 0xbc, 0x27, 0xa8, 0x3b, 0x5b, 0x1e, + 0x80, 0x33, 0x79, 0xb2, 0xad, 0xa2, 0x16, 0x26, 0x34, 0x8e, 0x3a, 0x2d, 0x5d, 0xeb, 0xcc, 0x95, 0xde, 0x85, 0x8f, 0x83, 0xe1, 0x02, 0xf2, 0xd2, 0xcc, 0xac, 0x1e, 0xf5, 0xb5, 0x9a, 0x52, 0xb2, + 0x06, 0xe2, 0xbb, 0xbf, 0xcf, 0x59, 0x88, 0x4c, 0x8c, 0x84, 0x09, 0xda, 0x75, 0xbe, 0xb2, 0xa3, 0x9b, 0xa6, 0x68, 0x20, 0x16, 0x84, 0xb1, 0x2a, 0x24, 0x31, 0xa1, 0x4b, 0xc1, 0xad, 0x05, 0x23, + 0xdf, 0xc7, 0x52, 0xca, 0xf5, 0x6c, 0xf5, 0x37, 0x7c, 0x88, 0xb5, 0xbd, 0xdc, 0x51, 0xf6, 0x04, 0x3e, 0x76, 0x1e, 0xac, 0x04, 0xa1, 0xb7, 0xfb, 0x66, 0x08, 0x4a, 0x1f, 0x39, 0x99, 0x90, 0x3f, + 0x7a, 0x9a, 0x7b, 0xd7, 0xc2, 0x4b, 0xc8, 0x11, 0x86, 0x74, 0xc5, 0xd3, 0xf0, 0x6a, 0xa9, 0x65, 0x6c, 0xd8, 0xa7, 0x93, 0xf5, 0xde, 0x5d, 0x34, 0xb1, 0xed, 0xd6, 0x28, 0xb6, 0x66, 0x53, 0xa7, + 0xc3, 0xd2, 0xde, 0x83, 0xa8, 0x3e, 0x38, 0xbf, 0x33, 0x31, 0x20, 0x7a, 0x86, 0x16, 0x71, 0x1e, 0x06, 0xbf, 0xfb, 0x73, 0xd5, 0x55, 0xba, 0xa0, 0xbb, 0x2d, 0x1b, 0x61, 0xdd, 0xe0, 0x6f, 0x36, + 0x22, 0x46, 0xad, 0xc7, 0x3e, 0x04, 0x65, 0xdf, 0xe3, 0xf5, 0x75, 0xc1, 0xf0, 0x96, 0x5a, 0xcf, 0xbc, 0x8c, 0xeb, 0xd3, 0x3f, 0x1d, 0xe5, 0x89, 0x60, 0x6b, 0x15, 0xd7, 0xba, 0x63, 0xed, 0x67, + 0x72, 0x3f, 0xf3, 0x7e, 0x01, 0x82, 0x80, 0xf7, 0x2e, 0xfa, 0xc2, 0xae, 0x45, 0x54, 0xd0, 0xb4, 0x2d, 0x5d, 0x89, 0xc0, 0x5a, 0xb4, 0xef, 0x46, 0xed, 0x7a, 0x40, 0x8f, 0x18, 0x9e, 0xc4, 0x20, + 0x48, 0xfd, 0xe8, 0xff, 0xb4, 0x03, 0xe7, 0xaf, 0x35, 0x03, 0xff, 0x8e, 0x84, 0xff, 0x9f, 0xed, 0xc0, 0x91, 0x7e, 0xd7, 0x81, 0x03, 0x69, 0x2c, 0x07, 0xfd, 0xbf, 0xd2, 0x81, 0x23, 0xfd, 0x47, + 0x1d, 0x38, 0x9f, 0x90, 0x1c, 0xd3, 0x10, 0xac, 0xee, 0x36, 0x0f, 0x93, 0xd0, 0x74, 0xea, 0x57, 0x5b, 0x74, 0xc4, 0xb3, 0xf2, 0x23, 0xca, 0xcb, 0xa8, 0x8f, 0x73, 0xf7, 0xf0, 0x70, 0x8b, 0xe3, + 0x67, 0xd7, 0x15, 0x84, 0x60, 0xdf, 0x6a, 0x0c, 0x38, 0xf4, 0xb0, 0x25, 0xd1, 0x43, 0x96, 0xcc, 0xa3, 0xfa, 0x94, 0xef, 0x18, 0x4f, 0xe9, 0xf7, 0x2c, 0x84, 0x62, 0x08, 0x42, 0x4c, 0x21, 0xae, + 0x84, 0x6a, 0xef, 0xc1, 0x36, 0xf7, 0xd4, 0x51, 0xd5, 0x0c, 0x3f, 0xba, 0x58, 0x3c, 0x53, 0xd2, 0xd9, 0x59, 0x4d, 0x99, 0xbb, 0xfa, 0xe6, 0xb5, 0x0f, 0xb2, 0x25, 0x37, 0x1d, 0x2a, 0x47, 0x83, + 0x7a, 0xf0, 0xc0, 0xbe, 0x65, 0xe3, 0xdb, 0x84, 0x5e, 0x1d, 0x84, 0x38, 0xe7, 0xab, 0xb6, 0x3d, 0x65, 0xe6, 0x6c, 0x55, 0x6b, 0x0a, 0xb7, 0x13, 0x31, 0x5f, 0xae, 0xe1, 0x4a, 0x71, 0xc3, 0xf9, + 0x7d, 0x76, 0xad, 0xc4, 0x83, 0x48, 0x32, 0x88, 0x1f, 0x13, 0x3e, 0xf6, 0x7b, 0xca, 0x17, 0x7f, 0xf9, 0x84, 0xbc, 0x89, 0x2d, 0x2b, 0xba, 0x0b, 0xcc, 0x7e, 0x92, 0x38, 0x04, 0x3c, 0xdf, 0x1b, + 0x58, 0x34, 0x46, 0x97, 0x4e, 0x0e, 0x4b, 0xb0, 0x2e, 0x26, 0x25, 0xfb, 0xa7, 0x19, 0x94, 0xd2, 0xc4, 0xdc, 0x5c, 0xe3, 0xf7, 0xbd, 0x6a, 0xe1, 0x4f, 0xe7, 0xaf, 0xac, 0xad, 0x94, 0x16, 0x6f, + 0xdf, 0x1d, 0xe5, 0x17, 0x7c, 0x6f, 0x8a, 0x3d, 0x5d, 0xd7, 0xf6, 0xa7, 0x66, 0xf9, 0x15, 0xd6, 0x7a, 0xcf, 0x33, 0x2e, 0xe6, 0x14, 0x7c, 0x20, 0x30, 0x44, 0x8a, 0x45, 0xd2, 0xf8, 0x90, 0x60, + 0xa2, 0x2c, 0xf4, 0xeb, 0x2d, 0xbf, 0xf6, 0x47, 0xf5, 0x31, 0x9e, 0x3e, 0x01, 0x9f, 0xb3, 0xbc, 0xeb, 0xe2, 0x05, 0x3a, 0xdc, 0xa3, 0x0e, 0x9a, 0x21, 0x7c, 0xca, 0x30, 0x3a, 0x4c, 0xa0, 0x60, + 0x96, 0x7a, 0x2e, 0x44, 0x2b, 0x37, 0xae, 0xa1, 0xf8, 0xdf, 0xea, 0xc0, 0x79, 0x04, 0x0e, 0xf5, 0xa4, 0xc4, 0xbe, 0x1c, 0x19, 0x79, 0x6e, 0xf4, 0xf0, 0x02, 0xa2, 0x4c, 0x41, 0x55, 0x6d, 0x63, + 0x9c, 0xbf, 0xe8, 0xc0, 0xd1, 0x2c, 0xa3, 0x8e, 0xac, 0xa5, 0xc8, 0x8c, 0xea, 0xd2, 0x97, 0x78, 0x05, 0xbd, 0x67, 0x0e, 0xd6, 0xca, 0x88, 0x46, 0x7c, 0x70, 0x13, 0x4f, 0x7c, 0x00, 0x3f, 0x73, + 0x6b, 0xb7, 0x28, 0x30, 0x63, 0x13, 0xc1, 0x7b, 0xc8, 0xbd, 0x7e, 0x0c, 0x7d, 0x2a, 0x1c, 0x83, 0x6c, 0x9d, 0x69, 0x02, 0xcb, 0xaa, 0x4b, 0x20, 0x90, 0x12, 0xa4, 0xa0, 0x36, 0x29, 0x66, 0xdb, + 0xcf, 0x4a, 0x02, 0xa3, 0xbb, 0xbf, 0x69, 0x2c, 0xb9, 0xe3, 0x3a, 0xc7, 0x20, 0x4e, 0x42, 0xed, 0x28, 0xce, 0xd5, 0x54, 0x41, 0xe7, 0x41, 0xf6, 0x35, 0x24, 0xea, 0xf4, 0x02, 0xd8, 0xf5, 0x91, + 0x8e, 0xea, 0xbe, 0x9e, 0xea, 0xec, 0x7c, 0x35, 0x63, 0x5d, 0x2c, 0xfc, 0x2e, 0xc6, 0xfe, 0x21, 0x71, 0xe3, 0x97, 0x28, 0xea, 0xf3, 0x38, 0x03, 0xea, 0x95, 0xce, 0x61, 0xbe, 0x56, 0x69, 0x16, + 0x1e, 0x7c, 0x5e, 0x77, 0x62, 0xd1, 0x32, 0xa3, 0x66, 0xeb, 0xc8, 0xed, 0x51, 0xf8, 0xca, 0xf3, 0x62, 0x5e, 0xa3, 0x36, 0x0a, 0xbd, 0x6d, 0x00, 0x99, 0xe0, 0x1e, 0x92, 0x76, 0xdf, 0x17, 0x52, + 0xac, 0x84, 0xc3, 0x4f, 0xa1, 0x49, 0x53, 0x6d, 0xef, 0x53, 0x8a, 0x9b, 0x06, 0x5a, 0x06, 0xdc, 0xe5, 0x10, 0x60, 0x2e, 0xf9, 0x75, 0xba, 0x74, 0xc5, 0x11, 0x56, 0x4d, 0xc6, 0x37, 0x94, 0x43, + 0x97, 0x5a, 0xef, 0x0e, 0xf3, 0xa4, 0x1d, 0xc9, 0x1a, 0x76, 0x49, 0x63, 0x07, 0xef, 0x27, 0x6d, 0xe9, 0x00, 0x39, 0x8c, 0xa2, 0x4f, 0xbc, 0xeb, 0xf2, 0xf0, 0x56, 0x53, 0x5e, 0x3a, 0xb9, 0x81, + 0xa2, 0x05, 0xeb, 0xd8, 0x42, 0x6b, 0xa4, 0xcf, 0xd3, 0x31, 0xd9, 0x8f, 0xf1, 0x18, 0xe8, 0x2d, 0xd3, 0xf4, 0x3d, 0x81, 0xe8, 0x76, 0xfb, 0x34, 0xf7, 0x09, 0xde, 0x06, 0x95, 0x6d, 0xae, 0x3e, + 0xdb, 0x9d, 0x49, 0x3b, 0xb9, 0xc1, 0x61, 0xfc, 0x76, 0xfc, 0x8d, 0xbe, 0x10, 0xb5, 0x8e, 0xcb, 0x2f, 0xa6, 0x03, 0x5f, 0x91, 0xf8, 0x09, 0xc1, 0x7f, 0x92, 0x05, 0xfd, 0x2d, 0xfe, 0xfe, 0x46, + 0xb1, 0x55, 0x0a, 0x59, 0x53, 0x8d, 0xea, 0xb3, 0x58, 0xee, 0xdf, 0x65, 0x06, 0x5f, 0x77, 0x24, 0x4d, 0x96, 0xcb, 0x35, 0xfa, 0xf8, 0x25, 0xc5, 0xf0, 0xad, 0xd0, 0xde, 0x7f, 0x85, 0x4c, 0xc1, + 0x6f, 0xbf, 0xa5, 0x18, 0xd4, 0xa5, 0xb1, 0xdc, 0xf9, 0xdb, 0x83, 0xf7, 0x4c, 0x20, 0xef, 0xdf, 0x1c, 0xbc, 0x73, 0xb6, 0xfb, 0xe3, 0xe0, 0x1d, 0xf9, 0x92, 0x04, 0xe9, 0xac, 0x87, 0x02, 0xda, + 0x4d, 0xff, 0xbc, 0xeb, 0x78, 0x69, 0xf7, 0xf7, 0x5d, 0x47, 0xf6, 0x38, 0xc5, 0x86, 0x7a, 0xff, 0xc8, 0xac, 0x3c, 0x1e, 0x4a, 0x11, 0xed, 0x57, 0x7d, 0xfe, 0xef, 0x99, 0x95, 0xd6, 0x7c, 0x81, + 0xdc, 0x6f, 0xe7, 0xed, 0xc0, 0x8f, 0x03, 0xf7, 0x2f, 0x53, 0xbd, 0x7f, 0x87, 0xb3, 0xff, 0x48, 0x8d, 0xfa, 0x3b, 0x90, 0xf9, 0x40, 0xe5, 0x6e, 0x61, 0x7a, 0x8d, 0xb8, 0xda, 0xec, 0xe6, 0xb4, + 0x6b, 0x93, 0x9e, 0xe2, 0xa6, 0xa0, 0x1c, 0xe0, 0x67, 0x1d, 0x50, 0x37, 0xa1, 0x40, 0xa1, 0xcd, 0x5f, 0xbb, 0x3c, 0x17, 0xc4, 0x8e, 0x6b, 0x66, 0x5b, 0x8c, 0xf9, 0x94, 0x32, 0xb2, 0x84, 0xc2, + 0xa4, 0xd2, 0x6a, 0x0f, 0x49, 0x25, 0xd3, 0x37, 0x7f, 0x45, 0x75, 0x4e, 0x62, 0xfd, 0x3e, 0x03, 0x2f, 0x74, 0xd6, 0x7c, 0x16, 0xb3, 0x3c, 0x0d, 0xa4, 0x60, 0x39, 0xc4, 0x31, 0x35, 0x60, 0x60, + 0xda, 0xe5, 0xd7, 0x4f, 0xe7, 0xcb, 0x7e, 0x91, 0x2e, 0x3e, 0xfb, 0x5c, 0x04, 0xba, 0x0d, 0xc2, 0x69, 0xba, 0x0f, 0x03, 0x49, 0x8f, 0x27, 0x78, 0x35, 0xaf, 0x3d, 0x13, 0xd5, 0xcf, 0xa7, 0xa1, + 0x3e, 0xef, 0xa7, 0x02, 0x3a, 0x31, 0x5f, 0x5d, 0xb4, 0x08, 0x02, 0x6c, 0xa9, 0x7d, 0xc8, 0xe7, 0x58, 0x22, 0x94, 0xe4, 0xb3, 0x3e, 0xea, 0x27, 0xfb, 0xdd, 0x94, 0x8b, 0x00, 0x9f, 0x31, 0xdc, + 0x32, 0xc1, 0xd5, 0x04, 0x71, 0x29, 0xca, 0xc4, 0x3b, 0xed, 0xea, 0xb5, 0xca, 0x44, 0x7e, 0xb1, 0x1e, 0x22, 0xa2, 0x47, 0xad, 0x85, 0xca, 0xf8, 0xe2, 0x27, 0x1c, 0x22, 0x7d, 0x14, 0x91, 0xa6, + 0xbc, 0xc5, 0x46, 0x9e, 0x10, 0x20, 0xaa, 0x5d, 0xad, 0x04, 0xd1, 0x78, 0xcd, 0x45, 0xd5, 0x3e, 0x82, 0xb6, 0xa3, 0x8c, 0x78, 0x0b, 0x19, 0x7e, 0xcd, 0x63, 0x09, 0x1b, 0x61, 0xeb, 0xa1, 0x0f, + 0xf9, 0x2d, 0x10, 0x22, 0xbb, 0x42, 0xea, 0x7b, 0x7a, 0x52, 0x1a, 0x1d, 0x89, 0x9d, 0x4b, 0x8c, 0xec, 0x8e, 0xf0, 0x99, 0x47, 0xba, 0xf0, 0xe0, 0x24, 0x2b, 0x63, 0x6d, 0x4d, 0xa9, 0xd8, 0xc0, + 0x8d, 0xa4, 0x7c, 0x7f, 0xbe, 0xfc, 0x4c, 0x3e, 0x51, 0x29, 0x15, 0x0f, 0xb5, 0xe0, 0xd4, 0x81, 0x50, 0xfd, 0xae, 0x2a, 0x0b, 0x82, 0xb7, 0xea, 0x7c, 0x3c, 0x7e, 0x20, 0x59, 0xe1, 0xd2, 0xf8, + 0x6f, 0xc0, 0x69, 0x98, 0xac, 0xe4, 0x54, 0x95, 0x48, 0x8e, 0x0c, 0xdc, 0x06, 0x3a, 0xb0, 0x3b, 0xe6, 0xf9, 0xc0, 0x85, 0xe0, 0x4e, 0xa5, 0x7f, 0x7a, 0xca, 0xaa, 0xe4, 0x1d, 0x3d, 0x73, 0xcb, + 0x54, 0x76, 0x25, 0xbe, 0x0a, 0x21, 0x16, 0x32, 0xdb, 0xce, 0x2e, 0x31, 0x90, 0xea, 0x4b, 0xa5, 0xd1, 0xe5, 0xb7, 0x9b, 0x29, 0xcb, 0xd6, 0x28, 0xe2, 0xcb, 0x5b, 0xaf, 0x7e, 0x3d, 0x8d, 0xa6, + 0x84, 0x43, 0xb5, 0x34, 0x8e, 0xb2, 0xb8, 0x3f, 0x80, 0x50, 0xe1, 0x77, 0x92, 0x76, 0x3f, 0x29, 0xb6, 0x52, 0x7d, 0x76, 0xbb, 0x69, 0xc7, 0xd5, 0x82, 0xd2, 0x0a, 0x99, 0xca, 0xa2, 0x42, 0x2b, + 0xb0, 0x5c, 0xa3, 0x1c, 0xaa, 0xaf, 0x96, 0xc5, 0x16, 0xee, 0x2e, 0x7d, 0x0f, 0x2d, 0xd8, 0xbc, 0xf0, 0xa5, 0x81, 0x0d, 0x3c, 0x26, 0x9a, 0x3d, 0x2e, 0xee, 0x04, 0xbe, 0x77, 0x7c, 0x87, 0xa9, + 0x69, 0x05, 0x2b, 0xa0, 0xc5, 0x38, 0xa5, 0xfa, 0xdc, 0xbb, 0xa4, 0xd3, 0x2f, 0x2a, 0x85, 0x51, 0xf2, 0x1c, 0x22, 0x99, 0xe5, 0x20, 0x9a, 0x12, 0xfa, 0xad, 0x0a, 0x92, 0xe3, 0x2a, 0xde, 0x4f, + 0x8e, 0x30, 0x6f, 0xba, 0x6a, 0x1e, 0xaf, 0xd6, 0x64, 0x27, 0x7e, 0xce, 0xec, 0xb4, 0x92, 0x8a, 0x3b, 0x92, 0x97, 0x4c, 0x5c, 0xb1, 0xd4, 0x0c, 0x44, 0xf9, 0x2c, 0xe6, 0xb9, 0x02, 0xdc, 0xd8, + 0x17, 0x0d, 0xa2, 0xdf, 0xd3, 0x44, 0x80, 0x8e, 0xfc, 0x92, 0xc9, 0xd9, 0x32, 0x0d, 0x35, 0xac, 0x63, 0xfd, 0xe8, 0x6e, 0x2c, 0x4d, 0xb1, 0xd7, 0xf4, 0xee, 0x13, 0x91, 0x67, 0x74, 0x9c, 0x7c, + 0xad, 0xb3, 0x0f, 0x77, 0x13, 0xcf, 0x6a, 0x0e, 0x72, 0xcc, 0x9e, 0x87, 0xe3, 0x96, 0xfd, 0x38, 0x50, 0x7f, 0x2d, 0x42, 0xf8, 0x49, 0x24, 0x24, 0x80, 0xc1, 0x9f, 0x81, 0xe0, 0xa3, 0xfa, 0xe3, + 0x9e, 0x9d, 0xaf, 0x45, 0xfe, 0x47, 0x7d, 0x0a, 0xc3, 0xf2, 0x64, 0xbb, 0xbe, 0xc2, 0xde, 0x91, 0x20, 0xa3, 0xd6, 0x5e, 0x61, 0x15, 0x97, 0x26, 0x54, 0xa3, 0x25, 0x31, 0xbe, 0x0c, 0xad, 0x90, + 0xdb, 0xac, 0xd4, 0xe7, 0x9b, 0x22, 0x32, 0x03, 0x47, 0x62, 0xa0, 0x9d, 0x4c, 0xba, 0x9a, 0x9e, 0x6f, 0x44, 0x00, 0x90, 0x9e, 0x7e, 0x6c, 0x85, 0x6e, 0xda, 0xb2, 0xba, 0x2b, 0xf3, 0x3b, 0x32, + 0x3f, 0xef, 0xf8, 0x69, 0xad, 0xe4, 0xe2, 0x66, 0xb4, 0x35, 0x33, 0x58, 0x44, 0x23, 0xd7, 0xa3, 0x6c, 0xed, 0xc5, 0x64, 0xc4, 0x1c, 0xcb, 0xb3, 0xbf, 0x82, 0x45, 0x6b, 0x1b, 0xfd, 0x24, 0xab, + 0x97, 0x1f, 0x5b, 0x43, 0xf0, 0xbf, 0x84, 0x3f, 0xe9, 0x0f, 0xff, 0x3b, 0x58, 0xe4, 0x23, 0x96, 0x61, 0x28, 0xa8, 0xfe, 0x05, 0x16, 0xbd, 0x9c, 0xaf, 0x0a, 0xf5, 0x03, 0x2d, 0x82, 0xb7, 0x37, + 0xfa, 0xf1, 0x86, 0x75, 0x5a, 0x1b, 0xd7, 0x38, 0xf5, 0xe2, 0x58, 0xfb, 0x43, 0x98, 0x74, 0xbe, 0x3b, 0x93, 0x02, 0xbf, 0x00, 0x8d, 0xd5, 0x42, 0x3f, 0x55, 0xdc, 0x8e, 0x2e, 0xc7, 0xf3, 0x70, + 0x0a, 0xc7, 0x55, 0x2c, 0x74, 0xb7, 0xc4, 0x9d, 0x53, 0x1a, 0x74, 0x50, 0x1c, 0x58, 0x3f, 0xa3, 0x9b, 0xcb, 0xfb, 0x3f, 0xdd, 0xc3, 0xcb, 0x3b, 0xf0, 0xcb, 0xa6, 0x91, 0xe6, 0xd0, 0xa2, 0x76, + 0xff, 0x38, 0xac, 0x39, 0x35, 0x57, 0x3a, 0xf5, 0x5b, 0x42, 0x74, 0xf6, 0xbb, 0x85, 0xd1, 0x6f, 0xc6, 0x34, 0xae, 0xfc, 0x4d, 0x93, 0x89, 0xac, 0x03, 0x3f, 0x55, 0x27, 0x2b, 0xdc, 0x49, 0xdb, + 0x59, 0x40, 0x06, 0x51, 0x60, 0x4f, 0xef, 0x8b, 0xd6, 0x92, 0x00, 0x9e, 0xbe, 0x80, 0xb9, 0x66, 0xa3, 0x87, 0xf8, 0xc3, 0x0f, 0xc5, 0xff, 0xf9, 0x9e, 0x1f, 0x22, 0x33, 0x12, 0xcb, 0x95, 0x80, + 0x7d, 0xff, 0x75, 0xe1, 0xd2, 0x6f, 0x0e, 0x68, 0xca, 0xbd, 0xa3, 0xac, 0x66, 0x1b, 0xae, 0x94, 0x63, 0x20, 0x5a, 0xbe, 0xf8, 0xcd, 0x15, 0x15, 0x84, 0x41, 0x5a, 0x2e, 0x69, 0x39, 0xc0, 0xa4, + 0x57, 0xff, 0xc8, 0xb3, 0x48, 0xa3, 0xa1, 0x76, 0xd5, 0xcc, 0xbd, 0xca, 0x30, 0x4d, 0x35, 0x44, 0xda, 0xcc, 0x40, 0xe6, 0xd5, 0x82, 0xab, 0x8d, 0x66, 0x0b, 0xce, 0xaf, 0xf2, 0xe1, 0xcd, 0xfe, + 0x86, 0x3e, 0x96, 0x0a, 0x3b, 0x1f, 0xe5, 0xf4, 0x11, 0x70, 0x16, 0x62, 0x7b, 0x5f, 0xa2, 0xa1, 0x26, 0xc8, 0x67, 0x7d, 0x3e, 0x3c, 0xa2, 0xeb, 0x01, 0x53, 0x77, 0x16, 0xaa, 0x14, 0x13, 0x59, + 0xd7, 0xf0, 0x0f, 0x25, 0x0b, 0x33, 0x66, 0xbd, 0xd1, 0x47, 0x75, 0x07, 0x62, 0x82, 0x90, 0x25, 0x66, 0xb1, 0x69, 0x78, 0xdc, 0xc4, 0x8d, 0x81, 0xef, 0x58, 0x7b, 0xbd, 0x0d, 0x41, 0xa3, 0x3e, + 0x3a, 0x8f, 0xa0, 0x30, 0x46, 0x84, 0xc5, 0x76, 0x60, 0xef, 0x43, 0x7a, 0x8a, 0x28, 0x5a, 0xa2, 0x55, 0x50, 0x60, 0x80, 0xb9, 0xe4, 0x33, 0x4a, 0x1b, 0x6f, 0xda, 0xae, 0xa3, 0xfb, 0x65, 0xc2, + 0x4b, 0xac, 0x40, 0x0f, 0xc6, 0x74, 0x6f, 0x32, 0xe4, 0x64, 0x68, 0x28, 0x87, 0xe6, 0x4a, 0x19, 0xc5, 0x50, 0x43, 0x67, 0xac, 0x50, 0xf3, 0x78, 0x7d, 0x3a, 0x33, 0x29, 0x42, 0xdc, 0x14, 0xca, + 0xce, 0xdd, 0x79, 0x88, 0xa7, 0x35, 0xb0, 0x72, 0x46, 0x50, 0xcd, 0x46, 0x49, 0x07, 0xc6, 0xa2, 0x71, 0xce, 0xd3, 0x46, 0x82, 0x17, 0xf5, 0xa4, 0x51, 0x21, 0x35, 0xcb, 0x14, 0xf3, 0xba, 0x57, + 0x73, 0x26, 0x11, 0xf5, 0xf8, 0x84, 0x93, 0x57, 0xad, 0xce, 0x1a, 0x4b, 0xaf, 0x77, 0xa9, 0xc9, 0xd1, 0xfc, 0x3c, 0x22, 0x3a, 0xde, 0xa6, 0x15, 0xea, 0x8e, 0x52, 0xef, 0x91, 0x42, 0xe3, 0x20, + 0x8f, 0xad, 0xdd, 0x71, 0x13, 0x48, 0xe1, 0xd1, 0x01, 0x25, 0x46, 0x0d, 0x15, 0x8f, 0x72, 0x47, 0x11, 0x58, 0xbb, 0x4b, 0x91, 0xa7, 0x01, 0x8e, 0x49, 0x7a, 0xa0, 0x3d, 0xe6, 0xb4, 0xdd, 0xca, + 0xd7, 0xcf, 0x7e, 0xa0, 0xa8, 0x38, 0xd9, 0x2e, 0xc2, 0xb6, 0x75, 0x63, 0xd4, 0x3e, 0x3b, 0x51, 0x35, 0x5d, 0x6f, 0x3a, 0xdd, 0xdd, 0x46, 0xf1, 0x67, 0x80, 0xb6, 0xf6, 0x93, 0x4b, 0xb0, 0x6d, + 0xba, 0xa3, 0x0f, 0xe0, 0x1f, 0x39, 0x6e, 0x3e, 0xdd, 0x1b, 0x59, 0xc2, 0x57, 0xcb, 0xa8, 0x5d, 0xcd, 0xf9, 0x27, 0x12, 0x0b, 0x71, 0x2a, 0x7e, 0x0a, 0xd3, 0x7d, 0x46, 0x05, 0x8f, 0x3f, 0xf7, + 0x2a, 0x1e, 0x47, 0x1e, 0xdb, 0x98, 0xcb, 0x24, 0x82, 0x12, 0xfc, 0x48, 0x43, 0xb4, 0x5e, 0x09, 0x67, 0x89, 0xb9, 0xeb, 0xda, 0x8c, 0x61, 0xd5, 0xf2, 0x43, 0x50, 0xb6, 0x34, 0x04, 0xc8, 0xf8, + 0x73, 0x07, 0x34, 0xba, 0x6b, 0x52, 0x2b, 0x09, 0xb0, 0x53, 0xaf, 0x71, 0xd9, 0xe0, 0x54, 0x85, 0x88, 0xb2, 0x9f, 0x45, 0x99, 0xa8, 0xd6, 0xf1, 0x59, 0x8c, 0xed, 0xc7, 0xee, 0x37, 0xa2, 0xfa, + 0xb4, 0x6d, 0xc0, 0x28, 0x35, 0x19, 0x39, 0xe5, 0x79, 0x85, 0xce, 0x5a, 0x15, 0x69, 0x7c, 0xa6, 0x82, 0x0a, 0xe5, 0x9e, 0xa5, 0xb5, 0x70, 0x01, 0xd4, 0x17, 0x85, 0x99, 0x5c, 0x5b, 0x68, 0xa8, + 0x1f, 0xb3, 0xd9, 0xae, 0x32, 0xa1, 0xcf, 0x26, 0xa1, 0x89, 0x27, 0x08, 0x4f, 0x12, 0xfa, 0x83, 0x73, 0x45, 0x44, 0x18, 0x2f, 0x5c, 0xea, 0xc2, 0x41, 0x7d, 0x63, 0x8a, 0xe1, 0xb6, 0x50, 0x0b, + 0xc2, 0x78, 0x4b, 0xab, 0xaf, 0x4b, 0xc0, 0xa2, 0x41, 0xf5, 0xba, 0xa4, 0x0f, 0xe7, 0x30, 0xa4, 0xda, 0x12, 0x58, 0x11, 0xd0, 0xdb, 0xbc, 0xc7, 0xc9, 0xda, 0x67, 0x5e, 0x73, 0x52, 0xca, 0xa5, + 0xc5, 0xd0, 0x66, 0x5b, 0x9e, 0x9a, 0xf6, 0x07, 0x41, 0x0f, 0xa1, 0xa7, 0x8c, 0xf5, 0x66, 0x9a, 0x7d, 0xf2, 0x8a, 0xdb, 0x3b, 0xfe, 0xd8, 0x64, 0xe6, 0x17, 0xda, 0x01, 0xfe, 0x69, 0xad, 0xf0, + 0xf8, 0x2a, 0x02, 0x02, 0xc6, 0x6a, 0xce, 0x10, 0x66, 0x3b, 0x26, 0x08, 0xfe, 0x69, 0x11, 0x78, 0xc9, 0x1f, 0x83, 0x76, 0xfc, 0xae, 0x90, 0xe2, 0xd7, 0x5a, 0x61, 0xba, 0xc1, 0x02, 0x24, 0x24, + 0xcc, 0x61, 0x16, 0x43, 0xa4, 0x10, 0xaf, 0xf5, 0x61, 0x86, 0x84, 0xe6, 0x9c, 0x1c, 0x9d, 0xc1, 0xac, 0xf2, 0xd9, 0x84, 0x39, 0x84, 0x6d, 0xcf, 0xb7, 0xa7, 0xb2, 0x99, 0xf2, 0xc4, 0x0a, 0xce, + 0x3a, 0x76, 0x0d, 0x63, 0xb5, 0x3e, 0x06, 0x03, 0x68, 0x6e, 0x22, 0xdd, 0xf9, 0x80, 0x9f, 0x94, 0x13, 0x38, 0xd2, 0x42, 0x9f, 0x28, 0x44, 0xdf, 0xf0, 0x72, 0xd3, 0x53, 0x2c, 0xc4, 0x83, 0x95, + 0xb9, 0x20, 0x42, 0xaf, 0x73, 0x0f, 0xb1, 0x81, 0xa8, 0x45, 0x08, 0x1e, 0xaa, 0x43, 0xae, 0x75, 0xd5, 0xf1, 0x91, 0x9e, 0xd5, 0x5c, 0xf9, 0xd9, 0xf3, 0xcd, 0x6a, 0xee, 0x63, 0xe3, 0xcd, 0xa9, + 0xd6, 0x11, 0x40, 0x30, 0xc7, 0xa4, 0x31, 0x6a, 0x32, 0x7e, 0x0f, 0xa6, 0xf9, 0x70, 0x65, 0x9e, 0xbc, 0xe7, 0x13, 0xbf, 0x29, 0x9a, 0x41, 0x57, 0xbb, 0x26, 0xa7, 0x78, 0xd1, 0xd2, 0xe6, 0x81, + 0x2f, 0xe6, 0x6a, 0x2a, 0x9d, 0x4a, 0x3e, 0x99, 0xda, 0xd3, 0x3f, 0xe1, 0xc2, 0x88, 0xca, 0x60, 0x19, 0x30, 0xa1, 0x1e, 0x12, 0x87, 0x99, 0x81, 0x5b, 0xed, 0xd8, 0x7b, 0x05, 0xdc, 0x19, 0xd6, + 0x4f, 0xbd, 0x9c, 0xce, 0x5a, 0x8a, 0x20, 0x2d, 0x58, 0xde, 0xa5, 0xc2, 0x98, 0xd8, 0x88, 0x8d, 0xcd, 0x58, 0x77, 0xb7, 0x98, 0x31, 0x82, 0xc9, 0x66, 0xb6, 0xf3, 0x8a, 0x98, 0x72, 0x0d, 0x9e, + 0x4d, 0xc9, 0x7f, 0xba, 0xbe, 0xac, 0x75, 0x9b, 0xcc, 0x57, 0xf7, 0xc9, 0x0a, 0x69, 0x0e, 0xf6, 0xc8, 0xe0, 0xed, 0x73, 0x4d, 0xa7, 0x26, 0x00, 0xfa, 0x10, 0x5a, 0xb7, 0xed, 0xd1, 0x80, 0xc8, + 0x89, 0x9d, 0x03, 0x94, 0x9d, 0xe3, 0x29, 0x70, 0xf0, 0xe0, 0x0b, 0xc7, 0x9e, 0x3e, 0xc3, 0xd7, 0xf3, 0x46, 0x16, 0x29, 0x3f, 0x73, 0xd2, 0x74, 0xd4, 0xab, 0xa7, 0x3b, 0x5f, 0xe7, 0xcf, 0xd8, + 0x74, 0x5f, 0xd3, 0xc7, 0xa0, 0xb5, 0x3b, 0xba, 0xdf, 0x05, 0xd3, 0xe6, 0x3c, 0x69, 0xcc, 0x91, 0x56, 0x01, 0x48, 0x63, 0xcb, 0x4d, 0x5e, 0xc5, 0xb3, 0x8c, 0x5c, 0x59, 0x37, 0x3e, 0x89, 0xca, + 0x84, 0x66, 0x90, 0x92, 0xcf, 0x27, 0xf7, 0x49, 0xcd, 0xa2, 0x1c, 0x12, 0x0c, 0xaf, 0xda, 0x71, 0x4c, 0x2f, 0x7c, 0x5b, 0xc5, 0x41, 0x6f, 0x59, 0x93, 0x5d, 0x90, 0x14, 0x23, 0x0b, 0x7a, 0x19, + 0x2c, 0xc1, 0x02, 0x27, 0xcc, 0x22, 0xa7, 0xf3, 0xba, 0xa1, 0x22, 0x01, 0x8e, 0xf3, 0xd1, 0xea, 0x0e, 0xed, 0x12, 0x9d, 0x6b, 0x23, 0x4f, 0x81, 0x9d, 0x4a, 0xb5, 0x96, 0xdd, 0x26, 0xaf, 0x5c, + 0x69, 0x0d, 0x07, 0xc3, 0xf2, 0x3a, 0x98, 0x39, 0x35, 0x94, 0x74, 0x40, 0xf1, 0x25, 0x44, 0x56, 0x06, 0x27, 0xb2, 0x75, 0x73, 0x22, 0x6e, 0xd9, 0x2e, 0xbb, 0x67, 0xa9, 0x1c, 0x7c, 0xf4, 0x26, + 0x2e, 0x15, 0x6a, 0xb7, 0x3c, 0x0c, 0x30, 0xa0, 0xfc, 0x8d, 0x53, 0x54, 0xef, 0x9a, 0x81, 0xe4, 0xa5, 0xe0, 0x28, 0x21, 0x44, 0x44, 0xe3, 0x94, 0x8a, 0x47, 0x4b, 0x3f, 0x06, 0xae, 0x1b, 0x79, + 0xf3, 0x1c, 0xca, 0x8f, 0x7c, 0xc1, 0xc8, 0x81, 0xc2, 0xb5, 0x02, 0x09, 0xe0, 0x2c, 0x09, 0xaa, 0xe9, 0x03, 0xa3, 0x18, 0x2e, 0x9e, 0xd3, 0xae, 0xbd, 0xf1, 0xca, 0xc3, 0x72, 0x3e, 0xed, 0x21, + 0x80, 0xf7, 0x1e, 0x6c, 0x17, 0x4e, 0x11, 0x4c, 0x74, 0x0b, 0x16, 0x5c, 0x2f, 0xe2, 0xea, 0x9a, 0x70, 0xb6, 0x16, 0x82, 0x81, 0x48, 0xdc, 0x9f, 0x3a, 0x54, 0xe9, 0x52, 0x4b, 0x93, 0xa5, 0x3e, + 0xe2, 0xd7, 0xa1, 0x22, 0x04, 0xa5, 0x39, 0x9c, 0x55, 0x5a, 0xcc, 0x1e, 0x93, 0x5a, 0x42, 0x49, 0x74, 0x78, 0x98, 0x4b, 0x07, 0x8f, 0xdb, 0xae, 0x37, 0x7c, 0xa0, 0xd2, 0x64, 0xe5, 0xb6, 0x8f, + 0x4d, 0x96, 0xde, 0x77, 0x64, 0x84, 0xec, 0x7f, 0xc4, 0xd5, 0xcf, 0xff, 0x1e, 0x57, 0xdb, 0xfc, 0x1b, 0x92, 0xf9, 0x8d, 0xae, 0xe3, 0x05, 0x26, 0x16, 0x0c, 0x55, 0xee, 0x35, 0x9d, 0xae, 0xf4, + 0xc8, 0x9c, 0xf2, 0xff, 0x0f, 0xae, 0xae, 0x7f, 0xcf, 0xd5, 0x06, 0xeb, 0xbd, 0xb4, 0x5b, 0xfe, 0x37, 0xae, 0xfe, 0x65, 0xec, 0x7f, 0xcc, 0xd5, 0xd2, 0x7f, 0xcc, 0xd5, 0xd5, 0x5c, 0x07, 0x17, + 0x65, 0x37, 0x6f, 0x1f, 0x2d, 0x1f, 0xf6, 0xb6, 0xbf, 0x66, 0x50, 0x9d, 0x25, 0x44, 0xac, 0xfb, 0x95, 0xaf, 0x80, 0xb8, 0xe6, 0x8b, 0xcf, 0x87, 0x18, 0xbc, 0xdc, 0xdf, 0x84, 0x33, 0xf5, 0xd4, + 0x10, 0xb6, 0x16, 0x5e, 0x47, 0xf6, 0xb0, 0xc4, 0x22, 0x43, 0x6e, 0xa9, 0x69, 0x25, 0xaa, 0x69, 0x0f, 0x84, 0x11, 0x5b, 0x1f, 0x27, 0xe1, 0x17, 0x64, 0xe0, 0x8b, 0x95, 0xaa, 0xbe, 0x2a, 0x87, + 0xa3, 0x35, 0xb1, 0xd0, 0x67, 0x2d, 0x18, 0xd0, 0xb9, 0xb9, 0xb2, 0x2d, 0x02, 0x74, 0x0d, 0x8f, 0xb4, 0xf3, 0x3d, 0xda, 0xfb, 0x35, 0x5c, 0x05, 0xeb, 0xac, 0xba, 0xaf, 0x33, 0xa1, 0x2c, 0x83, + 0x85, 0x22, 0xa2, 0xd8, 0x90, 0x14, 0x09, 0x4f, 0x26, 0xb8, 0x84, 0xc9, 0x49, 0xb7, 0x7a, 0xad, 0xb3, 0x80, 0xea, 0x6b, 0x03, 0xc9, 0xab, 0x7f, 0xbf, 0x04, 0x2b, 0x4a, 0x22, 0x96, 0x67, 0xd8, + 0xeb, 0x85, 0xe6, 0x4d, 0xad, 0x3c, 0x57, 0x60, 0x94, 0xee, 0xc7, 0x54, 0x2e, 0x9d, 0x57, 0x87, 0x03, 0x5f, 0x8a, 0xfe, 0x85, 0x97, 0x70, 0x69, 0x5d, 0x8d, 0xf1, 0x60, 0x2b, 0xb4, 0x38, 0x93, + 0xf0, 0x8d, 0x51, 0xef, 0x00, 0x41, 0x9d, 0x64, 0x01, 0x0d, 0xfc, 0x83, 0xc2, 0x28, 0x45, 0x83, 0x58, 0x38, 0x07, 0xb8, 0xc9, 0x87, 0x3d, 0xf5, 0xd1, 0x12, 0x66, 0xd7, 0xc1, 0xb2, 0x34, 0x26, + 0x70, 0x04, 0xb4, 0xfa, 0xd0, 0x6e, 0xaa, 0xcd, 0xa0, 0x17, 0x66, 0x84, 0xe9, 0xa9, 0xf5, 0x06, 0xce, 0x0b, 0x7d, 0x85, 0xe3, 0xbc, 0xd1, 0x63, 0xb6, 0x05, 0x8f, 0xe4, 0x43, 0x2f, 0x65, 0x42, + 0x73, 0xcc, 0xe5, 0x4d, 0x9a, 0xc2, 0xc3, 0x99, 0x1b, 0x0c, 0x8e, 0xce, 0xd3, 0x59, 0xde, 0xc5, 0x5c, 0xbc, 0xe8, 0x7e, 0x36, 0xd8, 0xb0, 0x50, 0x38, 0x7f, 0x03, 0x3b, 0xc0, 0x87, 0x4c, 0x43, + 0x49, 0x9e, 0xda, 0x07, 0x0e, 0x1e, 0xa7, 0xb9, 0xa6, 0x54, 0x06, 0x35, 0x52, 0xc2, 0x47, 0x94, 0x84, 0xb3, 0x90, 0x30, 0xba, 0xb8, 0x6d, 0x36, 0x5c, 0xbd, 0x51, 0x88, 0x50, 0xf4, 0x5d, 0xaa, + 0xea, 0x62, 0x2d, 0x6f, 0xca, 0x5e, 0xd1, 0xb0, 0xa9, 0x2a, 0x3c, 0x95, 0xeb, 0x75, 0xe7, 0x39, 0x67, 0x3f, 0xc0, 0x9b, 0x14, 0x8f, 0x80, 0x0a, 0xeb, 0xf9, 0xa2, 0x2b, 0x1f, 0xe9, 0x2d, 0x44, + 0xaf, 0x86, 0x6d, 0x62, 0x38, 0x14, 0xfb, 0x27, 0xb6, 0x08, 0x49, 0xe5, 0x4f, 0xad, 0x27, 0x40, 0x8c, 0x86, 0x3d, 0xc1, 0xb5, 0x0b, 0x9d, 0xd1, 0xe6, 0x0a, 0x0a, 0x77, 0x89, 0x69, 0x25, 0x59, + 0x97, 0x7b, 0xe7, 0xee, 0x83, 0xe2, 0xe7, 0x67, 0xa8, 0xa0, 0x4d, 0x24, 0xf9, 0x37, 0x91, 0x5b, 0x16, 0xb0, 0x38, 0xc1, 0x06, 0xc7, 0x0a, 0xce, 0x11, 0x9c, 0x86, 0xb2, 0x43, 0xb2, 0xb2, 0x5d, + 0xb8, 0x26, 0x0b, 0xfc, 0x19, 0xa4, 0xca, 0x40, 0x35, 0xf8, 0x75, 0x8b, 0x45, 0x5e, 0xf3, 0xdb, 0xc6, 0x4a, 0x52, 0x61, 0x43, 0x57, 0x6b, 0xfb, 0x4a, 0x34, 0xa8, 0x26, 0x8a, 0xe4, 0xd5, 0xae, + 0x7b, 0xb6, 0x80, 0x44, 0x74, 0x7c, 0x34, 0xa5, 0x65, 0xed, 0x2c, 0x80, 0x9d, 0xfe, 0x06, 0x2a, 0x56, 0xfc, 0x4c, 0x94, 0x79, 0x06, 0xa5, 0xc1, 0xeb, 0xa2, 0x99, 0x1a, 0xc7, 0x85, 0x67, 0xdc, + 0xd7, 0x0e, 0x49, 0xcc, 0x7e, 0xa5, 0xd2, 0x39, 0x3e, 0xca, 0xb4, 0xa9, 0x48, 0xef, 0x42, 0x3a, 0x3c, 0xae, 0xef, 0x2e, 0xd0, 0xc7, 0xe2, 0xd1, 0xc2, 0xa4, 0x0e, 0x4a, 0x67, 0x40, 0xc1, 0xed, + 0x42, 0x13, 0x89, 0x7d, 0x56, 0x40, 0x67, 0xa7, 0x16, 0x46, 0xa2, 0xea, 0x7c, 0xa3, 0x1c, 0xc7, 0xf9, 0x5d, 0xc0, 0x53, 0xe8, 0x0c, 0x35, 0x57, 0x90, 0x46, 0x01, 0xd1, 0x1c, 0x7a, 0x4b, 0xa9, + 0xc2, 0x9b, 0x41, 0xe9, 0xd9, 0x3d, 0x7c, 0xf8, 0xbf, 0xc5, 0xd5, 0x78, 0x9e, 0xed, 0x59, 0xf7, 0x79, 0x44, 0xc6, 0x29, 0x07, 0x44, 0xd2, 0x65, 0xf8, 0x7a, 0xf1, 0x83, 0x90, 0x9e, 0x2c, 0xf4, + 0x17, 0x5c, 0x2d, 0x8b, 0x45, 0xc9, 0x92, 0x2c, 0x13, 0xbe, 0xce, 0x63, 0x2f, 0xe6, 0x05, 0xad, 0x4d, 0xd4, 0x17, 0xae, 0x9d, 0x85, 0x61, 0xd0, 0xa9, 0xb2, 0x4b, 0xbd, 0xe2, 0x1e, 0x59, 0xb3, + 0xcf, 0x16, 0x2a, 0xa8, 0x35, 0x23, 0x98, 0xaa, 0xba, 0x03, 0x09, 0x0f, 0x5a, 0x88, 0x61, 0x00, 0x95, 0xcc, 0x62, 0xd2, 0x72, 0x78, 0xab, 0x5b, 0x52, 0xa8, 0xca, 0x65, 0x32, 0xb1, 0xc7, 0xa5, + 0xa1, 0x6c, 0xb4, 0xf7, 0x2a, 0x5e, 0xac, 0x9b, 0xb2, 0x1e, 0x82, 0xeb, 0x1e, 0x13, 0x8b, 0xb6, 0x41, 0xdd, 0x55, 0x9a, 0x43, 0x3d, 0xc6, 0x4a, 0x10, 0x3f, 0xa6, 0xa8, 0xf4, 0x19, 0x68, 0x33, + 0xf3, 0x58, 0x37, 0x16, 0x5c, 0xbd, 0x8a, 0x0f, 0xae, 0x00, 0x93, 0xaf, 0xe9, 0x1f, 0x17, 0x3e, 0x76, 0x87, 0x8a, 0xa3, 0xc4, 0x5e, 0x0c, 0xf3, 0x64, 0xb5, 0x4d, 0xa4, 0xed, 0xc7, 0x03, 0xc5, + 0x4d, 0xce, 0x96, 0x1a, 0x25, 0x18, 0x34, 0xf5, 0x19, 0x3c, 0xfb, 0x20, 0xbf, 0x28, 0xcd, 0x82, 0x84, 0x24, 0x78, 0xc4, 0xb1, 0x10, 0x35, 0xb9, 0x1f, 0x95, 0x88, 0x67, 0xad, 0x68, 0x48, 0x8d, + 0xf9, 0x08, 0xa9, 0x24, 0x70, 0xbe, 0x9e, 0x12, 0x4b, 0xb0, 0x57, 0x4e, 0x49, 0xad, 0x2f, 0x1b, 0x7b, 0x1d, 0xe5, 0xd2, 0xe5, 0x7d, 0x28, 0x31, 0x9f, 0xad, 0xb4, 0x79, 0x55, 0x6a, 0x93, 0xe0, + 0xba, 0x85, 0x0e, 0xdd, 0x0e, 0xf7, 0x3a, 0xbb, 0x56, 0xef, 0xc1, 0x3c, 0xf9, 0xee, 0x14, 0xe9, 0xce, 0x96, 0x29, 0x71, 0x8a, 0xb8, 0x99, 0x52, 0x70, 0x34, 0x24, 0x97, 0xb4, 0xbc, 0x81, 0x2c, + 0xf8, 0xb8, 0x22, 0xad, 0xf6, 0x11, 0xff, 0xda, 0xc5, 0xf0, 0x21, 0x8b, 0x97, 0xa9, 0x56, 0x82, 0x50, 0x88, 0xa3, 0xcc, 0x81, 0x3e, 0xb8, 0x46, 0x9d, 0xd7, 0xf6, 0x9d, 0x12, 0xe1, 0xbe, 0x38, + 0x8c, 0x21, 0x16, 0x1a, 0x5b, 0xb4, 0x8b, 0xa7, 0x98, 0x78, 0x28, 0xb5, 0x54, 0x31, 0x36, 0xeb, 0x36, 0x9b, 0x4a, 0x1d, 0xf9, 0x39, 0x7d, 0x2c, 0x04, 0xbc, 0x87, 0x74, 0x51, 0x65, 0x7b, 0x8c, + 0x70, 0x73, 0xb0, 0x96, 0xe8, 0xbf, 0x97, 0xe4, 0x2c, 0x84, 0x0e, 0x3f, 0x1e, 0xde, 0xd3, 0x7e, 0x9f, 0x55, 0xda, 0xbd, 0xb4, 0x4e, 0xf3, 0xf3, 0x79, 0x2b, 0x8d, 0x70, 0xdc, 0x1e, 0x24, 0x81, + 0x94, 0x78, 0xc2, 0x19, 0xc2, 0x6d, 0x6e, 0x3e, 0xdd, 0x80, 0x2c, 0x8e, 0xef, 0xc5, 0x68, 0xcf, 0x16, 0xa8, 0x1f, 0x40, 0xaf, 0xaf, 0x59, 0x96, 0x4a, 0x7a, 0x60, 0xe5, 0x3c, 0xef, 0x68, 0x2f, + 0x78, 0x17, 0x8b, 0x8f, 0x13, 0x99, 0x70, 0xdb, 0x88, 0x0b, 0x16, 0xd5, 0xa4, 0xab, 0x21, 0xc1, 0xe4, 0x8b, 0x03, 0xb2, 0x61, 0x02, 0xed, 0xef, 0x0f, 0x32, 0xf2, 0x62, 0x49, 0x97, 0xa1, 0x72, + 0x1a, 0xa4, 0x6c, 0x31, 0xf5, 0x40, 0x2f, 0x15, 0x46, 0x6d, 0x96, 0x38, 0x60, 0x81, 0x3b, 0x0a, 0x7a, 0xc4, 0x21, 0xcc, 0xd7, 0x33, 0x73, 0xd2, 0x79, 0xd9, 0xab, 0xf0, 0x86, 0x9d, 0xc1, 0x1c, + 0x4e, 0x17, 0xa7, 0x76, 0x87, 0x73, 0x68, 0xf7, 0x41, 0xac, 0x87, 0x2e, 0x53, 0xdd, 0x2e, 0xc9, 0x79, 0x5a, 0xfb, 0x6c, 0x03, 0xe7, 0x51, 0xae, 0x89, 0xbe, 0x71, 0xb9, 0xa3, 0x8f, 0xd3, 0x4d, + 0x23, 0xaa, 0x66, 0x83, 0x2e, 0xa2, 0xa2, 0x03, 0x72, 0xee, 0x23, 0xde, 0x6e, 0xb1, 0x22, 0x57, 0xf7, 0x1e, 0x0f, 0x4a, 0x12, 0x4b, 0x6f, 0xc4, 0x28, 0xb3, 0x9f, 0xfb, 0x19, 0x56, 0x46, 0xe6, + 0x82, 0x97, 0x48, 0xbb, 0x07, 0x51, 0xf7, 0x63, 0x82, 0x06, 0xce, 0xfc, 0xb4, 0x6f, 0x28, 0xae, 0x19, 0x64, 0xac, 0x72, 0x21, 0xc7, 0x25, 0x4f, 0x4a, 0x66, 0x7e, 0xd1, 0xb5, 0x36, 0xc3, 0xb9, + 0x72, 0x06, 0x0c, 0xa4, 0x59, 0xe3, 0xc5, 0x31, 0xf2, 0xa0, 0x67, 0x91, 0x01, 0xd4, 0xfe, 0x23, 0xae, 0x46, 0xfe, 0x7b, 0x5c, 0xad, 0xee, 0x41, 0x4a, 0xd5, 0xf5, 0xf0, 0x44, 0xe6, 0x07, 0x9c, + 0x18, 0x13, 0x3e, 0x43, 0xec, 0xa8, 0x11, 0x4e, 0x52, 0xfd, 0x61, 0xe3, 0xdc, 0xff, 0x9a, 0xab, 0xaf, 0xdf, 0x71, 0xf5, 0xa5, 0xb1, 0xd2, 0xf3, 0x37, 0x5c, 0xfd, 0x63, 0xec, 0x7f, 0xcc, 0xd5, + 0xda, 0x7f, 0xcc, 0xd5, 0xf7, 0x75, 0xa0, 0x56, 0x8c, 0xe2, 0x1f, 0x5e, 0xce, 0x07, 0xad, 0x1e, 0x15, 0xbf, 0x89, 0x1f, 0x09, 0x77, 0x8b, 0xcb, 0x93, 0xc0, 0x00, 0xe9, 0x74, 0xec, 0xc7, 0xd9, + 0x3d, 0xa6, 0xf7, 0x67, 0xc1, 0x67, 0xfd, 0x39, 0x84, 0xf3, 0x54, 0x9f, 0xdb, 0x9c, 0xdc, 0x62, 0x0a, 0x96, 0xab, 0xeb, 0x2a, 0x0f, 0x7e, 0xb2, 0xa7, 0x97, 0x29, 0x4d, 0xda, 0x03, 0xbb, 0x0b, + 0x39, 0x7b, 0x19, 0xcf, 0x48, 0xba, 0x18, 0xc8, 0xcd, 0xaf, 0x75, 0xd3, 0x66, 0x45, 0xdf, 0xf8, 0x51, 0xc3, 0xa7, 0xde, 0x56, 0x01, 0x6d, 0x1c, 0x70, 0xbe, 0x8a, 0xd0, 0x62, 0x5b, 0x59, 0x74, + 0xd5, 0x21, 0x67, 0x91, 0x6b, 0x66, 0xd0, 0x14, 0xc4, 0xeb, 0x6f, 0x9f, 0x54, 0x0e, 0x66, 0x0c, 0xb2, 0xb7, 0x7b, 0xe7, 0x23, 0xb1, 0x53, 0xda, 0xae, 0xd1, 0x86, 0x43, 0xb3, 0xc2, 0x1d, 0xda, + 0x1e, 0x6e, 0x9c, 0xf8, 0x12, 0xb8, 0x49, 0x24, 0x81, 0xfc, 0xec, 0x8d, 0xf6, 0x47, 0xcc, 0x01, 0x6c, 0x6c, 0x65, 0xdc, 0x33, 0x50, 0xda, 0x4b, 0x94, 0x6a, 0xf7, 0x63, 0x1b, 0x47, 0xd3, 0xf4, + 0xe0, 0x2a, 0x4e, 0x1d, 0xc8, 0x4f, 0x26, 0x8d, 0x57, 0x45, 0xbd, 0x98, 0xf7, 0xe8, 0xea, 0x0b, 0xf8, 0x9e, 0x13, 0x98, 0xca, 0xc4, 0x76, 0xa6, 0x1a, 0x02, 0x7a, 0x3c, 0xc6, 0x32, 0x09, 0x11, + 0x17, 0xef, 0x45, 0x78, 0x9b, 0xcd, 0x41, 0xd3, 0x29, 0x04, 0x90, 0xd0, 0xf8, 0x8a, 0x3c, 0x6f, 0x72, 0xf8, 0x6e, 0x4c, 0x91, 0xbc, 0x57, 0x47, 0x01, 0xa4, 0x21, 0x78, 0x9f, 0x09, 0x9c, 0xb3, + 0x6d, 0xc3, 0xe6, 0x45, 0x4a, 0x68, 0x4e, 0xb0, 0x00, 0xa5, 0x6c, 0x5a, 0x2c, 0x7c, 0x3f, 0xd0, 0x36, 0xc6, 0xc0, 0xf1, 0x1d, 0x15, 0x27, 0x96, 0x4a, 0xf3, 0x1b, 0x2e, 0x35, 0x75, 0xa8, 0x13, + 0x8c, 0x5b, 0x11, 0x0f, 0xf0, 0xd9, 0x7e, 0x96, 0x3f, 0xda, 0x8d, 0x0d, 0x01, 0xfd, 0xac, 0x11, 0x9d, 0x85, 0x1e, 0x2d, 0x45, 0x8a, 0x3b, 0x1f, 0xbf, 0xd3, 0xe4, 0xc5, 0xf2, 0xd4, 0xc4, 0xb8, + 0x71, 0x29, 0x55, 0x8b, 0x57, 0xe4, 0xf5, 0x6b, 0x52, 0x4a, 0xb5, 0xf3, 0x1b, 0x3c, 0xa8, 0x55, 0x82, 0x0d, 0xb4, 0x67, 0x91, 0x14, 0x8b, 0x33, 0xac, 0x94, 0xcd, 0x61, 0x50, 0x81, 0x03, 0xaf, + 0xae, 0x7e, 0x91, 0xc7, 0x7d, 0xe4, 0xd7, 0x76, 0x1e, 0x22, 0x35, 0x1d, 0x10, 0x5d, 0xab, 0xee, 0x2a, 0x25, 0xd9, 0xd1, 0x98, 0x5c, 0x33, 0xe7, 0x47, 0xf7, 0xfa, 0x04, 0x48, 0xf2, 0x61, 0x99, + 0xe8, 0x46, 0xe9, 0x8b, 0x42, 0xeb, 0x3e, 0x80, 0x92, 0xed, 0x3d, 0x74, 0x04, 0x43, 0x69, 0x55, 0x9c, 0x60, 0x08, 0x6a, 0x5f, 0xdd, 0xe2, 0x7c, 0x6a, 0x40, 0xcb, 0x5e, 0x3d, 0x6d, 0x16, 0x54, + 0x66, 0x54, 0x27, 0xb2, 0x13, 0x64, 0xf0, 0xbe, 0x02, 0xb9, 0x52, 0xd4, 0x2a, 0xf6, 0x43, 0xe1, 0xb3, 0xce, 0x99, 0xb5, 0x72, 0xa6, 0xcd, 0x8d, 0xa6, 0xb8, 0x56, 0x2b, 0xa8, 0x98, 0x31, 0xf4, + 0xe8, 0x70, 0xf6, 0xd4, 0x22, 0x89, 0x9e, 0xfc, 0xbb, 0xcc, 0x29, 0x7f, 0xd3, 0xfd, 0xbc, 0x11, 0x11, 0x82, 0xd5, 0x80, 0xec, 0xd2, 0x20, 0x27, 0xf4, 0x09, 0x72, 0x2a, 0x6d, 0xec, 0x42, 0x72, + 0xdc, 0xe3, 0x36, 0x9e, 0xf2, 0x98, 0x02, 0x64, 0x41, 0xc9, 0x58, 0xe0, 0xd7, 0x29, 0x2c, 0xd2, 0xf2, 0x0a, 0xcd, 0x0c, 0x97, 0x35, 0x01, 0xb2, 0x28, 0x34, 0xd4, 0x89, 0x02, 0xd4, 0xf8, 0x39, + 0xa4, 0x97, 0x06, 0x93, 0x52, 0x81, 0x7e, 0xb4, 0x1c, 0xe8, 0x93, 0x8f, 0x68, 0x05, 0x66, 0x8b, 0x7b, 0xd1, 0x87, 0x8b, 0x65, 0x11, 0x4d, 0xee, 0x50, 0x67, 0xe1, 0xf9, 0x43, 0x3e, 0xc5, 0xe3, + 0x8d, 0xa1, 0x34, 0xf8, 0xc4, 0x53, 0x0b, 0xb1, 0x4d, 0xf0, 0xca, 0x8c, 0x37, 0x8c, 0x2b, 0xe1, 0xe7, 0x4f, 0xcc, 0x5b, 0xff, 0x63, 0xae, 0x3e, 0xab, 0xc2, 0xda, 0x95, 0xe6, 0x43, 0xb5, 0xe6, + 0x25, 0x1c, 0x49, 0x1c, 0x3a, 0x9b, 0x25, 0xa9, 0xc3, 0x97, 0xfc, 0xea, 0x2f, 0xb8, 0x9a, 0xb5, 0xab, 0xa7, 0x9f, 0xc0, 0xdc, 0x98, 0xf9, 0x6e, 0xf6, 0x6c, 0x74, 0x97, 0x17, 0x36, 0xcc, 0x12, + 0xdf, 0xf3, 0x59, 0x44, 0x81, 0x3a, 0x4e, 0xc5, 0xa2, 0xea, 0x38, 0x47, 0xac, 0xb3, 0x89, 0x29, 0x31, 0xfc, 0xa0, 0xf6, 0xa0, 0xbd, 0x92, 0xda, 0x5d, 0x91, 0xe9, 0x04, 0x14, 0xa1, 0x37, 0xdf, + 0x20, 0xef, 0xb4, 0xfa, 0xec, 0xef, 0xcd, 0xdc, 0xad, 0x48, 0xfc, 0xf1, 0x47, 0xaa, 0x42, 0x60, 0xa4, 0xc7, 0xdc, 0x4f, 0xfe, 0x72, 0xf1, 0xe7, 0xd8, 0x0f, 0xa2, 0x52, 0x7e, 0x0e, 0x81, 0x2b, + 0xde, 0x92, 0x48, 0x93, 0xde, 0x47, 0x03, 0x83, 0xf0, 0xa6, 0xb7, 0x65, 0x90, 0x78, 0x8f, 0xae, 0xae, 0x41, 0x0d, 0xde, 0xca, 0xed, 0x00, 0xeb, 0x83, 0x7a, 0xbf, 0xa4, 0x68, 0x22, 0x34, 0x7c, + 0x4f, 0x04, 0xd3, 0x5a, 0x1d, 0x46, 0xe1, 0x03, 0x21, 0x29, 0xc6, 0x24, 0x5a, 0xb5, 0x81, 0xc9, 0xf6, 0x5d, 0xdb, 0x1a, 0x2a, 0xb8, 0x15, 0xbd, 0x3a, 0x07, 0xcb, 0x7d, 0x05, 0xfb, 0x3e, 0x9e, + 0xe1, 0x87, 0x7a, 0xa0, 0x6e, 0xfd, 0x74, 0x5b, 0x88, 0x10, 0x1d, 0x4c, 0x72, 0x71, 0x27, 0xe3, 0x2c, 0xc0, 0x0d, 0xbb, 0x1e, 0xc3, 0x66, 0x92, 0x94, 0xa0, 0x53, 0x1c, 0x28, 0x6f, 0xce, 0xee, + 0x3c, 0x3e, 0x75, 0xad, 0xb4, 0xfd, 0x6a, 0x57, 0x8b, 0xb8, 0x0d, 0xb3, 0x53, 0x88, 0xf8, 0x72, 0x7b, 0xd0, 0xd1, 0x94, 0x06, 0x6f, 0xe6, 0x91, 0x9b, 0x52, 0xe7, 0x0d, 0x07, 0xb7, 0xd0, 0xa9, + 0xbb, 0xc5, 0x6c, 0x66, 0x65, 0xfd, 0x53, 0x1f, 0x54, 0x92, 0xdd, 0x00, 0xf6, 0x3d, 0xf5, 0xbb, 0x6c, 0x9b, 0xd3, 0x07, 0x59, 0x1f, 0xc6, 0xab, 0x99, 0xf9, 0xf7, 0x23, 0x76, 0x42, 0x73, 0x19, + 0x13, 0x13, 0xa2, 0x9a, 0xc7, 0x26, 0x46, 0x5e, 0xba, 0xe2, 0x9d, 0x0c, 0x5e, 0x73, 0xae, 0xfa, 0xee, 0x96, 0x46, 0x0f, 0x8c, 0x61, 0x5f, 0xd0, 0xa7, 0x06, 0x23, 0x2f, 0x55, 0x2a, 0xf4, 0xe2, + 0x88, 0xc7, 0x70, 0x8e, 0x42, 0x9d, 0x02, 0x52, 0x85, 0xd1, 0xf2, 0xb4, 0x58, 0xb4, 0xcc, 0x9f, 0x07, 0x15, 0x15, 0x88, 0xc2, 0xba, 0x9b, 0x9f, 0x0c, 0xe8, 0xab, 0x5c, 0x0b, 0xd4, 0xc8, 0x10, + 0xf4, 0x98, 0x07, 0x56, 0x31, 0xb4, 0xc9, 0x3d, 0x28, 0xf7, 0xa8, 0x95, 0x89, 0x64, 0x8f, 0x1a, 0x67, 0x7b, 0xb6, 0x15, 0x0d, 0x71, 0x27, 0xc2, 0x92, 0x66, 0xc4, 0x87, 0x76, 0xc9, 0x43, 0xcf, + 0x02, 0x95, 0x99, 0x76, 0x84, 0xc6, 0xdb, 0xdc, 0x42, 0xa9, 0x62, 0x69, 0x35, 0x2c, 0xef, 0x74, 0x2e, 0x43, 0xca, 0xa7, 0x37, 0xdb, 0x6b, 0xff, 0x2a, 0xd9, 0x60, 0x27, 0x12, 0x74, 0xe3, 0x65, + 0xc1, 0x41, 0x6a, 0x0b, 0x9b, 0x65, 0x2f, 0x4b, 0x4d, 0x8d, 0x04, 0x9d, 0x14, 0x11, 0x31, 0x6b, 0x16, 0x9e, 0x7b, 0x06, 0xb2, 0xd5, 0x5b, 0x82, 0xa0, 0x3a, 0x04, 0x20, 0x51, 0x70, 0x08, 0x8a, + 0x78, 0x99, 0x8d, 0xfd, 0x11, 0x45, 0x24, 0x22, 0x6a, 0x65, 0xdb, 0x9e, 0x03, 0xa4, 0xe1, 0x4e, 0xef, 0xf0, 0xa1, 0xcd, 0x1e, 0x68, 0x8f, 0x19, 0xd7, 0x93, 0xb9, 0x9e, 0x43, 0xe5, 0x86, 0xfa, + 0xc3, 0x1f, 0xa4, 0x81, 0x14, 0x75, 0xb3, 0x1b, 0x27, 0x5d, 0x6d, 0xc9, 0x4a, 0xc3, 0xce, 0x38, 0xb3, 0xe3, 0x36, 0xe6, 0x03, 0x20, 0x73, 0x44, 0x3a, 0x7b, 0xe1, 0xaf, 0x7c, 0xe3, 0xcb, 0x21, + 0x33, 0x56, 0x9a, 0x6e, 0xa0, 0xc2, 0x58, 0xf3, 0x16, 0x25, 0x5d, 0xa7, 0x96, 0x26, 0x90, 0x2b, 0x67, 0xb3, 0x7d, 0x0a, 0x33, 0xbf, 0x3e, 0xae, 0x23, 0x89, 0x83, 0x80, 0x8d, 0x02, 0x21, 0xf0, + 0x1b, 0xcf, 0xb5, 0x49, 0x84, 0x04, 0x65, 0x84, 0x24, 0xe7, 0x91, 0x85, 0x69, 0xe8, 0x7a, 0x02, 0xe6, 0x74, 0x9e, 0xbe, 0xdc, 0x72, 0xce, 0x03, 0x8e, 0xc0, 0xb8, 0x81, 0xfe, 0x52, 0x74, 0xa9, + 0x2e, 0x6b, 0x26, 0x9f, 0xd7, 0x7f, 0x51, 0xcb, 0xb2, 0xcd, 0x79, 0xf6, 0x2f, 0x89, 0xfd, 0x46, 0xdb, 0xc2, 0x5f, 0xd6, 0x69, 0xfc, 0x1d, 0x6f, 0xb3, 0x5d, 0xc3, 0x30, 0xd4, 0x80, 0xfd, 0xc2, + 0xdb, 0x16, 0xf3, 0xd2, 0xde, 0xc6, 0x1a, 0xbd, 0x62, 0x70, 0x1a, 0x24, 0xfc, 0xc1, 0xce, 0xaf, 0x19, 0x72, 0xfe, 0xa8, 0x14, 0x99, 0xa5, 0xbb, 0xdf, 0xfa, 0xcd, 0xfa, 0xde, 0xcd, 0xf9, 0x1a, + 0xfd, 0xc3, 0xed, 0x51, 0xb3, 0x85, 0x6e, 0x48, 0xbe, 0x9a, 0x88, 0x5b, 0xa5, 0x13, 0xbc, 0x9a, 0x9f, 0x18, 0x54, 0xe5, 0x4e, 0xfa, 0x9b, 0x44, 0xd8, 0x97, 0x7b, 0x82, 0xaf, 0xf7, 0x6c, 0xd1, + 0x93, 0x5c, 0x35, 0xc7, 0x3a, 0x00, 0xa9, 0xfc, 0x85, 0x42, 0x57, 0x2e, 0x09, 0xb2, 0xe9, 0xab, 0xef, 0x2c, 0x43, 0xd3, 0x6f, 0x44, 0x87, 0xdf, 0xbd, 0xdf, 0x4a, 0x5c, 0xc7, 0xfd, 0x52, 0x6c, + 0x69, 0xdf, 0xdf, 0x4b, 0x32, 0x5c, 0xed, 0x30, 0xbe, 0x56, 0x64, 0x48, 0x87, 0xc6, 0x52, 0xdf, 0xeb, 0x2c, 0xcb, 0x03, 0xd0, 0x5c, 0x0e, 0xfe, 0x31, 0xd8, 0xfc, 0xfb, 0xb4, 0xff, 0xd3, 0x59, + 0x03, 0x7f, 0x35, 0xed, 0xff, 0x74, 0xd6, 0xc0, 0x3f, 0x3f, 0xa0, 0x64, 0xe3, 0xd7, 0x55, 0xee, 0x5e, 0x43, 0x3c, 0xdf, 0x6d, 0x2f, 0xb5, 0xb7, 0x7b, 0x83, 0xc2, 0x98, 0x6b, 0xbe, 0x43, 0x0d, + 0x18, 0xec, 0x59, 0xa9, 0x2f, 0x02, 0xc8, 0x2b, 0x19, 0x61, 0x05, 0xa4, 0xd4, 0xb4, 0x55, 0x6e, 0x24, 0x24, 0xeb, 0xc4, 0x27, 0x65, 0x73, 0x6e, 0xa4, 0xf2, 0x98, 0x77, 0xd9, 0x0b, 0x99, 0xdb, + 0x78, 0x08, 0x1e, 0x4c, 0xd3, 0x13, 0x45, 0xed, 0xd6, 0xa9, 0x73, 0x26, 0x2a, 0xae, 0xf9, 0xfb, 0x9d, 0xd6, 0xb2, 0xaf, 0x05, 0x41, 0xb8, 0x67, 0x5a, 0x08, 0x55, 0xaf, 0x9a, 0x20, 0xf7, 0x0f, + 0x90, 0xf2, 0x8c, 0x66, 0xa2, 0x96, 0xd6, 0x2d, 0x20, 0x72, 0x1d, 0x66, 0x79, 0xf5, 0xcf, 0x8a, 0xe7, 0x8e, 0xb4, 0xce, 0x90, 0x95, 0x52, 0x69, 0xa7, 0x50, 0x40, 0x3b, 0x55, 0x39, 0x94, 0x23, + 0xc5, 0x89, 0x2b, 0x1b, 0x8a, 0x52, 0xa9, 0xb7, 0x72, 0x8a, 0x49, 0x86, 0x50, 0xcf, 0x1e, 0xc3, 0x8d, 0x3c, 0x2a, 0xde, 0xe5, 0xc0, 0xf6, 0x4c, 0x68, 0x1f, 0x80, 0x1f, 0xf4, 0xfb, 0xf8, 0xac, + 0x8b, 0x9d, 0x7c, 0x3e, 0xf3, 0xd4, 0xbc, 0x86, 0x90, 0x9a, 0xfc, 0xc2, 0x99, 0x1f, 0x2f, 0xbf, 0x22, 0x88, 0x8e, 0x4a, 0x4f, 0xc4, 0xde, 0x27, 0x03, 0x87, 0xd0, 0xf2, 0xb3, 0xbd, 0x9e, 0x8f, + 0x77, 0x37, 0x05, 0x6f, 0x77, 0x79, 0xc0, 0xa6, 0x69, 0x33, 0x3b, 0x3a, 0xe2, 0x98, 0xb9, 0x3d, 0xe3, 0x7e, 0xa7, 0x48, 0xc3, 0x04, 0x22, 0xb5, 0xb8, 0xda, 0x8f, 0x70, 0xee, 0x51, 0x2f, 0x8b, + 0x37, 0xab, 0x1f, 0x58, 0xb4, 0x45, 0x8d, 0xb1, 0xf1, 0xa5, 0x8c, 0xd8, 0xfc, 0x3c, 0x94, 0xd6, 0x48, 0x4c, 0x90, 0xb5, 0xe5, 0x69, 0xf9, 0xa0, 0xd5, 0xf3, 0x3d, 0x4a, 0x45, 0x25, 0x60, 0xa4, + 0xdd, 0x2c, 0xc8, 0xa2, 0x9a, 0x33, 0xfa, 0xe8, 0x91, 0xc3, 0x18, 0xae, 0x4f, 0x0d, 0xda, 0x03, 0xd0, 0xb9, 0x82, 0xfe, 0x4f, 0x34, 0xbd, 0xff, 0xf0, 0x98, 0xf0, 0xdf, 0x0b, 0x0a, 0x0d, 0xe0, + 0x80, 0x3e, 0xaf, 0xde, 0x0f, 0xaf, 0x4d, 0x5f, 0xcb, 0x1d, 0xeb, 0xc0, 0xdd, 0x4f, 0xe0, 0xee, 0x4e, 0x06, 0xf8, 0x2f, 0x2a, 0x2d, 0xae, 0x8f, 0xef, 0x37, 0x86, 0x29, 0x59, 0xc1, 0x6b, 0x92, + 0xb1, 0x0c, 0xe6, 0x72, 0x82, 0xa8, 0x9a, 0x78, 0x07, 0xa0, 0x09, 0x11, 0x72, 0xb6, 0xcc, 0x92, 0x38, 0xa9, 0xdb, 0xbe, 0xdd, 0x0c, 0xe1, 0x4a, 0x0b, 0xcb, 0xf5, 0xea, 0x24, 0x38, 0x35, 0x37, + 0x57, 0x2e, 0x47, 0xd4, 0x3e, 0xcf, 0x5b, 0xaf, 0xcf, 0x2b, 0x81, 0x67, 0x52, 0x82, 0x1a, 0xb9, 0x3f, 0xa2, 0x99, 0x22, 0x2e, 0x02, 0xc3, 0x09, 0xb6, 0x81, 0x65, 0x41, 0x80, 0x7c, 0xb6, 0xa1, + 0xc8, 0xf5, 0x06, 0xb2, 0x27, 0xa9, 0x18, 0xbe, 0xb9, 0x22, 0x75, 0x2a, 0xae, 0xe1, 0x73, 0x57, 0x20, 0xd5, 0xce, 0x02, 0xb5, 0x71, 0xea, 0x85, 0x39, 0x61, 0x5a, 0x45, 0x85, 0xa1, 0xee, 0xfa, + 0xc3, 0xb0, 0x85, 0xc8, 0xb2, 0x25, 0x70, 0xa5, 0xf3, 0x1d, 0xcd, 0x93, 0xab, 0x17, 0xc0, 0x12, 0xd1, 0x65, 0xd8, 0xbd, 0x02, 0xe1, 0x33, 0x76, 0xca, 0xee, 0x0c, 0x54, 0x00, 0x54, 0x8b, 0x84, + 0x5d, 0x2a, 0xe7, 0xbe, 0xd9, 0x34, 0xba, 0x41, 0x1c, 0x62, 0x1a, 0xd7, 0x0f, 0xa0, 0x9b, 0xa4, 0x5f, 0x57, 0xbd, 0xad, 0x2d, 0xfd, 0xee, 0xee, 0xdb, 0x7d, 0x8b, 0x19, 0x3b, 0x73, 0x6f, 0xf6, + 0x6d, 0x37, 0xfb, 0x07, 0x81, 0x78, 0x73, 0x93, 0x71, 0x45, 0xa6, 0xd9, 0xf6, 0xd6, 0x2e, 0x3e, 0xa3, 0x20, 0x01, 0x65, 0x3f, 0x0b, 0xa4, 0x01, 0xcd, 0xd8, 0xc7, 0x7d, 0x70, 0x1f, 0x26, 0xcb, + 0xec, 0x86, 0x4e, 0xee, 0xbb, 0x62, 0x80, 0x8a, 0x43, 0x0d, 0x1f, 0xc4, 0x7d, 0x70, 0x97, 0x8c, 0x22, 0x53, 0xe6, 0xf8, 0x36, 0xc6, 0xae, 0xbe, 0x55, 0x52, 0x20, 0xb6, 0x1d, 0x1c, 0x19, 0x20, + 0x4d, 0xa1, 0x1d, 0x08, 0xf8, 0xa1, 0x99, 0x1c, 0x87, 0x90, 0x1c, 0x8d, 0xd6, 0x25, 0x2c, 0xe4, 0x63, 0x04, 0xa4, 0x4a, 0xbf, 0x53, 0x8d, 0xe8, 0xc9, 0x68, 0x9c, 0x5e, 0x7f, 0x27, 0x76, 0xfa, + 0xa7, 0x78, 0xfa, 0x97, 0xca, 0xd3, 0x7f, 0x87, 0xa7, 0x8c, 0xfd, 0x05, 0x4f, 0xdf, 0xcf, 0x5f, 0xf1, 0x14, 0xe3, 0x13, 0xb0, 0x42, 0x8a, 0x51, 0xf5, 0x65, 0x5b, 0x79, 0xe8, 0xb2, 0x42, 0x2f, + 0x38, 0x4b, 0x29, 0x74, 0x59, 0x7e, 0xaa, 0xb6, 0x31, 0x4c, 0xcb, 0x62, 0xa9, 0xfb, 0xf7, 0xa0, 0x04, 0xfc, 0x27, 0xa8, 0xf4, 0x77, 0xa0, 0x04, 0xfc, 0x73, 0x54, 0xd2, 0xfe, 0x12, 0x4b, 0xbf, + 0x40, 0x29, 0xf0, 0xdf, 0xc2, 0xd2, 0x2f, 0xb3, 0x06, 0xfe, 0x3b, 0x58, 0xaa, 0x1d, 0x59, 0x43, 0x59, 0x00, 0x5d, 0xbe, 0xbf, 0x7f, 0xa9, 0x12, 0x4d, 0x97, 0xde, 0x5c, 0x5a, 0x16, 0x25, 0x95, + 0x7a, 0x4d, 0x51, 0x56, 0xfc, 0xc2, 0xaf, 0xc5, 0x16, 0xc2, 0xf5, 0x4e, 0xcb, 0x47, 0x60, 0x6e, 0xfa, 0xe2, 0xe7, 0x93, 0xcd, 0x40, 0x3c, 0x5f, 0xa8, 0x3b, 0xf3, 0x20, 0xac, 0x4c, 0x06, 0xe1, + 0xa8, 0x93, 0x8b, 0x78, 0x40, 0x8b, 0x57, 0x76, 0xa4, 0x80, 0x1d, 0xb6, 0xea, 0xad, 0xc5, 0x2e, 0x33, 0x3d, 0xf5, 0xd0, 0x52, 0xe3, 0x8f, 0x3f, 0xe4, 0x54, 0x37, 0x3f, 0x3b, 0x67, 0x34, 0x1a, + 0xb7, 0x52, 0xea, 0x76, 0x10, 0x76, 0x2d, 0x62, 0x0d, 0x2a, 0x2b, 0xfc, 0x6c, 0x02, 0x99, 0x00, 0xaf, 0x0b, 0x18, 0xb7, 0x6c, 0x87, 0x32, 0x83, 0x30, 0xb2, 0xe0, 0x0f, 0xd5, 0x12, 0x0c, 0x92, + 0xeb, 0xbb, 0xbc, 0x00, 0x8a, 0xdb, 0xff, 0xdf, 0x02, 0x8c, 0x0a, 0xa9, 0xcf, 0x09, 0x8d, 0x4b, 0x1e, 0xf0, 0x12, 0x5e, 0xd7, 0x31, 0x85, 0xcd, 0xdf, 0x98, 0x2e, 0x3a, 0x73, 0x5b, 0xfd, 0xf6, + 0x7d, 0x3a, 0xf4, 0x81, 0x62, 0xe9, 0x96, 0x6a, 0xa8, 0x6e, 0x92, 0x78, 0x9e, 0xea, 0x17, 0xc7, 0x41, 0x7c, 0xc8, 0x25, 0xca, 0x06, 0x45, 0xd8, 0x2b, 0x0b, 0xd5, 0xbc, 0x90, 0x86, 0xe3, 0x7e, + 0xf1, 0x17, 0x10, 0xc5, 0xaf, 0x9c, 0x93, 0xe5, 0xd8, 0x9f, 0x7b, 0xf6, 0x3c, 0xd9, 0xc1, 0x30, 0xba, 0x48, 0x6e, 0x62, 0x12, 0xce, 0x2d, 0xa8, 0x6a, 0x5a, 0x46, 0x13, 0x8f, 0xa7, 0xf7, 0xa0, + 0x8e, 0x57, 0x20, 0x37, 0xc6, 0x34, 0xd4, 0xeb, 0x47, 0xc3, 0xfb, 0xdb, 0xc5, 0xc4, 0x75, 0xb4, 0xda, 0x81, 0xcf, 0x5b, 0xdb, 0x18, 0x90, 0xc4, 0xde, 0xda, 0xe5, 0xb8, 0x00, 0x78, 0xf7, 0xaa, + 0x78, 0x79, 0xef, 0xd8, 0x14, 0x37, 0x49, 0xef, 0xf3, 0xed, 0xe4, 0xd1, 0x2b, 0xf5, 0x0f, 0x57, 0xe2, 0xcf, 0xed, 0x97, 0x7f, 0x1e, 0xd5, 0xfc, 0xdd, 0x0a, 0x64, 0x9b, 0xaf, 0x11, 0x4d, 0xf2, + 0x63, 0x05, 0x52, 0xf7, 0x7c, 0xbe, 0x3e, 0x6f, 0xfb, 0x93, 0x30, 0xb8, 0x22, 0x38, 0xa7, 0x68, 0x0d, 0xd8, 0xeb, 0x0f, 0x8b, 0x51, 0xe9, 0xea, 0x7f, 0x14, 0xd1, 0x50, 0x07, 0x20, 0xfe, 0x78, + 0x9f, 0xb3, 0x9f, 0xdf, 0xe7, 0xdf, 0xf6, 0x6a, 0x8a, 0x5a, 0xf3, 0x7d, 0x97, 0xe2, 0xa6, 0xd0, 0xaf, 0x95, 0x56, 0x0d, 0x75, 0x68, 0xec, 0xb7, 0xa2, 0xa9, 0x6f, 0x2b, 0xd2, 0x3b, 0x81, 0x5f, + 0x06, 0x35, 0xe1, 0xb7, 0xbd, 0x9a, 0xbe, 0xfb, 0xb3, 0xc6, 0x24, 0x77, 0x9c, 0x3f, 0xff, 0x31, 0x39, 0xed, 0xb5, 0x9f, 0xf6, 0x54, 0x16, 0x97, 0x13, 0x33, 0x04, 0xc8, 0xae, 0x57, 0xfb, 0xe5, + 0xa6, 0xaf, 0xdd, 0xe4, 0xcc, 0xab, 0x49, 0x9f, 0xd0, 0xcf, 0x5e, 0x34, 0x2e, 0x0f, 0xd9, 0x53, 0xfc, 0xec, 0xd8, 0x38, 0x94, 0x21, 0x89, 0xcb, 0x96, 0xf4, 0x29, 0x57, 0x29, 0xf3, 0xcb, 0x76, + 0xc6, 0xfb, 0xd2, 0x24, 0x89, 0xfe, 0xc5, 0x70, 0x15, 0xf8, 0x9d, 0xe3, 0xaa, 0xf5, 0xd5, 0x71, 0x95, 0xfe, 0xea, 0xb8, 0x6a, 0x71, 0xd4, 0x76, 0x17, 0xba, 0xae, 0x9f, 0x78, 0x42, 0xf4, 0x57, + 0x22, 0x33, 0xab, 0x33, 0x84, 0x0f, 0x7b, 0x1e, 0x2b, 0xa6, 0xac, 0x75, 0xd2, 0xee, 0xbc, 0xab, 0xd8, 0xa4, 0xe7, 0xc3, 0xd8, 0x88, 0xe6, 0x23, 0x03, 0xad, 0x7b, 0x62, 0xaf, 0xcf, 0x22, 0x08, + 0xfd, 0x6e, 0xce, 0x0c, 0x32, 0x86, 0x65, 0xdb, 0xda, 0xea, 0x54, 0xf7, 0x03, 0x1e, 0x8c, 0x58, 0x05, 0xa2, 0xbc, 0x0d, 0x4b, 0x54, 0xb0, 0x78, 0x6a, 0xfe, 0x8e, 0xce, 0x69, 0xd1, 0xf4, 0x3b, + 0x11, 0xcf, 0xfe, 0x84, 0x4f, 0x3c, 0x7f, 0x64, 0x45, 0x79, 0xbd, 0x1c, 0x56, 0xc7, 0xf0, 0x45, 0x84, 0x74, 0x03, 0x40, 0xc2, 0x65, 0x81, 0x66, 0x68, 0x9b, 0x9c, 0x47, 0xfb, 0x49, 0xeb, 0xd5, + 0x58, 0x9d, 0x78, 0x52, 0xa3, 0x0e, 0x8b, 0xd7, 0x99, 0x12, 0x18, 0x27, 0x32, 0x49, 0x53, 0xf2, 0xda, 0x88, 0x7c, 0xe6, 0xd6, 0xe7, 0xc9, 0x09, 0x83, 0xf4, 0xb8, 0xb6, 0xad, 0x87, 0xb0, 0x58, + 0xba, 0x12, 0x3c, 0xbc, 0x7d, 0xb0, 0xca, 0x04, 0xe2, 0xa9, 0x89, 0xc9, 0xe6, 0x03, 0xb4, 0xec, 0xcb, 0xc4, 0xed, 0xad, 0xdd, 0xa6, 0xcb, 0x69, 0x06, 0x23, 0xe8, 0x63, 0x95, 0x1d, 0xdc, 0x59, + 0x7c, 0x2b, 0x9f, 0x9a, 0x57, 0x70, 0xaf, 0x8c, 0x81, 0xbb, 0x02, 0xcc, 0x13, 0x66, 0x32, 0x2d, 0x93, 0x77, 0xac, 0x26, 0xac, 0xf9, 0xd1, 0x31, 0x38, 0xdd, 0xdb, 0x2b, 0x24, 0x25, 0xbb, 0x43, + 0xc3, 0x81, 0xce, 0x58, 0xa1, 0xcb, 0x4b, 0x03, 0x3c, 0x5d, 0x30, 0xc5, 0xb2, 0x07, 0x79, 0x4c, 0xec, 0xa5, 0xf7, 0x4c, 0x96, 0xa0, 0x67, 0xed, 0x92, 0xd1, 0x31, 0x8b, 0x3d, 0x28, 0x66, 0x7c, + 0xf3, 0xb4, 0x45, 0xda, 0x43, 0xca, 0x56, 0xa7, 0x23, 0x4b, 0xae, 0xad, 0xcf, 0x07, 0xc9, 0xb3, 0x4a, 0x2c, 0x8f, 0xe9, 0x07, 0x1f, 0xb4, 0xe0, 0xd4, 0x50, 0x6d, 0xaa, 0xbe, 0x67, 0xdb, 0xc0, + 0x9f, 0xa5, 0xdb, 0x7f, 0x96, 0x6d, 0x57, 0xbf, 0xc9, 0xb6, 0xdd, 0x5a, 0xf6, 0x24, 0xba, 0xf6, 0x5f, 0x9b, 0xbe, 0x01, 0xaf, 0xf2, 0x81, 0x81, 0x73, 0xeb, 0xe0, 0x56, 0x14, 0x36, 0x77, 0xfb, + 0xe7, 0x4a, 0xbc, 0x02, 0x3d, 0x28, 0xb2, 0xbd, 0xb3, 0x6d, 0xd5, 0x60, 0xb7, 0x98, 0x61, 0xfd, 0x3b, 0x82, 0xa3, 0x8e, 0x34, 0xb5, 0x40, 0x75, 0x86, 0xc7, 0xb4, 0xaf, 0xcb, 0x0c, 0xf0, 0x24, + 0x78, 0x84, 0x88, 0x8e, 0x28, 0x8d, 0xe4, 0x1a, 0x11, 0x3f, 0x58, 0xa3, 0xd5, 0x10, 0xad, 0x3f, 0xe8, 0xf9, 0x25, 0xed, 0x8f, 0xda, 0x5c, 0x04, 0x4e, 0xd3, 0x15, 0x67, 0x93, 0xb8, 0x8b, 0x3b, + 0xd7, 0x1d, 0xd5, 0x73, 0xfe, 0xf9, 0xcc, 0xc0, 0xde, 0x9a, 0x77, 0xd1, 0xa6, 0x6a, 0xa1, 0xb8, 0x63, 0x48, 0xe6, 0xe7, 0x24, 0xa5, 0x20, 0x0f, 0x08, 0xdc, 0x80, 0x24, 0xda, 0x21, 0x5b, 0xab, + 0x87, 0xbc, 0x1c, 0xb0, 0xa8, 0x34, 0xcf, 0x58, 0xc5, 0xd7, 0xf7, 0x86, 0x87, 0x9e, 0x64, 0x08, 0x71, 0x08, 0xeb, 0x02, 0x9f, 0xad, 0x63, 0xff, 0x60, 0x6f, 0x4d, 0xf7, 0x40, 0x2d, 0x57, 0xf4, + 0x4a, 0xc6, 0x9b, 0x7a, 0x9d, 0x93, 0xae, 0x41, 0x61, 0x0e, 0xf3, 0x0b, 0xc2, 0xec, 0x0e, 0x4f, 0xa4, 0x45, 0xc0, 0xb2, 0xf9, 0x50, 0xf0, 0x70, 0xaa, 0xc1, 0x50, 0xe1, 0x94, 0x3d, 0x97, 0xbf, + 0x88, 0x54, 0x8e, 0x49, 0x98, 0x98, 0x05, 0xa3, 0x4f, 0xf8, 0x9d, 0xc3, 0x79, 0xfa, 0x5d, 0x60, 0x92, 0xb2, 0x54, 0x26, 0xc7, 0xd0, 0x3e, 0xfc, 0xd0, 0x3c, 0x3b, 0x0f, 0x4b, 0xdb, 0x74, 0x3f, + 0xd5, 0xcb, 0xbb, 0xda, 0x03, 0x07, 0x3d, 0x28, 0xc5, 0x54, 0x19, 0x79, 0x00, 0xf5, 0xa5, 0xbc, 0x1c, 0xb2, 0x95, 0xed, 0xc4, 0xcd, 0x27, 0xb5, 0x4e, 0x02, 0x1d, 0x4a, 0x0b, 0x5f, 0x29, 0x9a, + 0xae, 0x63, 0x6b, 0x49, 0x68, 0x87, 0x3a, 0xf5, 0x53, 0x0c, 0xc9, 0xd8, 0x77, 0x84, 0x14, 0x39, 0xc4, 0xb6, 0xd5, 0xde, 0x65, 0x30, 0xf9, 0xc4, 0x9b, 0x4b, 0x3f, 0x79, 0x38, 0x08, 0x30, 0x35, + 0x8e, 0x7b, 0xec, 0xd6, 0xdd, 0xa2, 0x03, 0xb4, 0xf9, 0xaf, 0xcb, 0xf7, 0xff, 0x18, 0x3b, 0xff, 0x34, 0x82, 0xf9, 0x3b, 0xec, 0x64, 0xcc, 0xfb, 0x4b, 0xf4, 0x12, 0xfc, 0xc0, 0x4e, 0xda, 0xf7, + 0x83, 0xdd, 0x94, 0xf3, 0x89, 0xf5, 0xe0, 0x03, 0xb3, 0x4c, 0x38, 0x59, 0xf9, 0x77, 0xf3, 0xbb, 0xe8, 0xa5, 0xfa, 0x1f, 0x45, 0x2f, 0xdf, 0xac, 0xa7, 0x80, 0x7f, 0x84, 0x9b, 0xf7, 0xdf, 0xe3, + 0xe6, 0x57, 0xa5, 0xdc, 0xff, 0x16, 0x6e, 0x7e, 0x81, 0x4d, 0xe0, 0xff, 0x02, 0x37, 0x6f, 0x4d, 0x8c, 0x0e, 0x8e, 0x8a, 0xc4, 0x2f, 0x0b, 0xea, 0x6e, 0xa0, 0xaf, 0x9d, 0xc0, 0xbc, 0x82, 0x72, + 0x1c, 0xc5, 0x48, 0x6c, 0x54, 0x52, 0x1c, 0x92, 0x14, 0xf1, 0x86, 0x7e, 0x50, 0xe6, 0xb1, 0xa8, 0xc5, 0x25, 0x3a, 0x84, 0x8a, 0x81, 0xef, 0x87, 0x76, 0x87, 0xf6, 0x87, 0xd0, 0x8d, 0x39, 0x3f, + 0xa7, 0x8d, 0x80, 0xe4, 0xf0, 0x49, 0x68, 0xb7, 0xc5, 0xe0, 0x53, 0x15, 0xc0, 0xbc, 0x50, 0x4c, 0xe8, 0x3a, 0x80, 0x98, 0x01, 0x44, 0xc7, 0x11, 0xe2, 0x54, 0x76, 0x90, 0x6f, 0x90, 0x53, 0x5b, + 0x86, 0x1d, 0x8c, 0xf2, 0x61, 0x05, 0x10, 0x3e, 0x67, 0x46, 0xcb, 0xf3, 0xed, 0x33, 0x97, 0x21, 0xd6, 0x02, 0x51, 0x8b, 0x7b, 0x9e, 0x17, 0xf2, 0xc1, 0xa4, 0x09, 0xe3, 0xe7, 0xd5, 0x33, 0x8d, + 0x98, 0x3c, 0x9a, 0xc7, 0xa1, 0xbd, 0x47, 0x50, 0x02, 0x7f, 0xc1, 0x12, 0xe0, 0xff, 0x14, 0x4c, 0x16, 0x72, 0x95, 0x26, 0xb3, 0xaf, 0xce, 0xac, 0xde, 0xf4, 0x56, 0xd4, 0xb8, 0x40, 0x9f, 0x80, + 0xa8, 0xee, 0x09, 0x87, 0x88, 0x0e, 0xa6, 0x8c, 0xa4, 0xef, 0x9f, 0x9d, 0xfb, 0xf2, 0x7f, 0x95, 0x50, 0xd4, 0x11, 0x5b, 0xd2, 0x49, 0x29, 0x4f, 0x82, 0xe8, 0x8f, 0x07, 0xd7, 0xce, 0xb6, 0xea, + 0x0e, 0x2c, 0x53, 0xf6, 0xe1, 0xfb, 0xe1, 0x48, 0xfa, 0x78, 0x49, 0x32, 0xbe, 0xf7, 0xb5, 0x04, 0x5b, 0x55, 0x92, 0x35, 0x60, 0x8c, 0x5e, 0x00, 0xd2, 0x27, 0x2e, 0xfb, 0x10, 0xb5, 0xc5, 0xea, + 0x4d, 0x24, 0xb8, 0x66, 0xb0, 0x5f, 0x1f, 0x23, 0x25, 0x1d, 0x46, 0x10, 0xa7, 0x47, 0xef, 0xe8, 0x9b, 0xfc, 0xb2, 0x10, 0xa5, 0xf1, 0x9d, 0x44, 0x5d, 0x4f, 0xf2, 0xb6, 0x9d, 0x90, 0x08, 0xa9, + 0xb4, 0x91, 0xaa, 0x91, 0x34, 0x1a, 0xa9, 0x9c, 0x3f, 0xf2, 0x67, 0xaa, 0x97, 0xd0, 0xa6, 0x54, 0x04, 0x05, 0x7c, 0x43, 0x49, 0x5e, 0xfe, 0x4a, 0x2c, 0xd7, 0x3b, 0xfc, 0x47, 0xab, 0xee, 0x7b, + 0xa9, 0xf6, 0xf7, 0x65, 0x87, 0xfe, 0x69, 0xe2, 0xf0, 0x77, 0xeb, 0x8e, 0x6f, 0x59, 0x86, 0xa1, 0x90, 0xfa, 0xd7, 0x75, 0x17, 0x2f, 0xa9, 0xff, 0xc2, 0x0c, 0xc9, 0x55, 0x6b, 0xc3, 0xca, 0xc9, + 0x09, 0xc9, 0xe0, 0x90, 0xfd, 0x6d, 0xcc, 0x72, 0x7c, 0x89, 0x59, 0xea, 0xff, 0x51, 0xcc, 0xc2, 0x1d, 0x80, 0xf8, 0x43, 0xe2, 0xb4, 0xfa, 0x79, 0x39, 0x78, 0xbf, 0x54, 0x84, 0xff, 0x1a, 0x7f, + 0x5b, 0xff, 0x51, 0xd6, 0x50, 0xff, 0x8f, 0xb2, 0x06, 0xee, 0xf8, 0x4f, 0x66, 0xfc, 0xcb, 0xe9, 0x0b, 0xf0, 0x0f, 0x8e, 0x5f, 0x1e, 0xaf, 0x89, 0xbe, 0x13, 0x1d, 0xc3, 0x5f, 0x3c, 0xac, 0x98, + 0x2c, 0x55, 0x6b, 0x42, 0x7b, 0xe3, 0x9a, 0x32, 0xc8, 0x0e, 0x2e, 0x4b, 0x2e, 0x72, 0xd5, 0x6b, 0x15, 0x1f, 0x1b, 0x37, 0x01, 0xd3, 0x0d, 0x47, 0x1f, 0x24, 0x49, 0xee, 0xe4, 0x85, 0x0b, 0xa8, + 0xa5, 0x9f, 0x2c, 0x55, 0x10, 0xe7, 0xd6, 0x1a, 0x74, 0x3a, 0xfb, 0x4b, 0x12, 0xa6, 0xf6, 0x73, 0x5e, 0x86, 0xe1, 0xba, 0x2a, 0xd1, 0x79, 0xf1, 0x8f, 0x80, 0x76, 0x4f, 0x87, 0x85, 0xa5, 0xe2, + 0x9c, 0x50, 0x7f, 0x0a, 0x31, 0x70, 0xc0, 0xba, 0x90, 0xef, 0x3a, 0xff, 0xfd, 0x21, 0x47, 0xa0, 0x45, 0x58, 0x66, 0x99, 0x27, 0xb8, 0x0f, 0xa6, 0x5b, 0x9b, 0x5c, 0x9b, 0xe3, 0x2c, 0x4b, 0x5d, + 0x41, 0x86, 0x38, 0x72, 0xee, 0x35, 0x58, 0x78, 0x1a, 0x8a, 0xb5, 0x6a, 0x1d, 0x29, 0x5e, 0xb3, 0xfe, 0xe5, 0x50, 0x59, 0x74, 0xb5, 0xeb, 0xbd, 0x9d, 0xb9, 0xbb, 0xd4, 0x2e, 0xc8, 0xf0, 0x55, + 0x7f, 0xbb, 0x33, 0xfd, 0x8e, 0x73, 0x9c, 0x5f, 0x12, 0x60, 0x37, 0x76, 0xf9, 0x26, 0x9e, 0x8b, 0xce, 0xd1, 0xc5, 0x12, 0x4e, 0x3d, 0x3e, 0x14, 0x92, 0xa3, 0x54, 0xbd, 0x0f, 0xe7, 0x85, 0xcf, + 0xd7, 0x06, 0xcb, 0x6c, 0x88, 0x8b, 0xbd, 0x8f, 0xa7, 0x9f, 0x6e, 0xd7, 0xb0, 0x66, 0x28, 0x86, 0xc8, 0x2e, 0x8c, 0x77, 0x7a, 0xfe, 0x3e, 0x2f, 0xf2, 0xe3, 0x86, 0xeb, 0x65, 0x34, 0x28, 0x9b, + 0xac, 0x93, 0x10, 0x01, 0x96, 0x4c, 0xbf, 0x0e, 0xa4, 0x11, 0xd7, 0x59, 0xe4, 0xd6, 0x60, 0x8c, 0x0c, 0x4a, 0xb3, 0x9a, 0xac, 0xf1, 0x74, 0xcc, 0xda, 0xe8, 0xf0, 0x29, 0x91, 0x91, 0x04, 0x72, + 0x32, 0x7f, 0x7c, 0xe0, 0x80, 0xb1, 0x5c, 0x35, 0x7c, 0x1e, 0xf6, 0xad, 0xf4, 0x98, 0x4d, 0x85, 0x47, 0xe5, 0xea, 0x0e, 0x31, 0x57, 0x0b, 0x9b, 0xf9, 0x30, 0x1a, 0xaf, 0x2d, 0x06, 0x68, 0x9e, + 0x93, 0x68, 0x10, 0xf3, 0x60, 0xf4, 0x2c, 0x71, 0x12, 0x97, 0x79, 0x7d, 0xfa, 0x32, 0x26, 0x9f, 0xad, 0x8c, 0x5f, 0x95, 0x7b, 0xf7, 0x30, 0xe7, 0x97, 0x21, 0x79, 0xd9, 0x6f, 0x7b, 0x24, 0x5b, + 0x92, 0xe0, 0xa7, 0x5a, 0x4c, 0xa2, 0xac, 0x81, 0xe3, 0xd0, 0x93, 0x9f, 0x15, 0xda, 0x87, 0x49, 0x38, 0x49, 0x84, 0xc1, 0xd4, 0x5c, 0xb5, 0xf6, 0x40, 0x3f, 0xb8, 0x0a, 0xd2, 0x2e, 0xf9, 0xeb, + 0x78, 0x35, 0xf3, 0x96, 0x7a, 0xf8, 0x4b, 0x71, 0x8c, 0x09, 0x25, 0x11, 0x8a, 0x6d, 0x6d, 0x27, 0x90, 0xd7, 0x69, 0xe2, 0x04, 0x67, 0x05, 0x0f, 0xd9, 0x81, 0xa0, 0x9e, 0x5f, 0xb1, 0xdb, 0x8c, + 0xcf, 0x8c, 0x54, 0x69, 0x8a, 0xd5, 0x0a, 0xfb, 0xf2, 0x0f, 0xf4, 0x81, 0x48, 0xa9, 0x72, 0x71, 0x69, 0x8e, 0x03, 0xc5, 0x43, 0xf5, 0x1b, 0x91, 0x5a, 0xac, 0x80, 0xf9, 0x2c, 0x81, 0x16, 0xd9, + 0xb2, 0x97, 0x64, 0xbd, 0x0c, 0x92, 0x23, 0x73, 0x80, 0x60, 0xd5, 0x4e, 0x8d, 0x69, 0xd7, 0x56, 0x51, 0xed, 0x69, 0xd1, 0x5b, 0x98, 0x15, 0x6d, 0x4a, 0x8c, 0x50, 0x39, 0x67, 0x76, 0xd4, 0x51, + 0x89, 0xa9, 0xec, 0x29, 0x4e, 0x20, 0xa7, 0x86, 0x67, 0x78, 0x1d, 0x2f, 0x02, 0x99, 0x8a, 0xf6, 0xb3, 0x1a, 0xd3, 0x59, 0xf6, 0xc2, 0x66, 0x1e, 0xd4, 0x4d, 0xa2, 0x27, 0x20, 0x88, 0xb3, 0xb9, + 0x6e, 0xef, 0x38, 0x9e, 0x9d, 0xb5, 0x77, 0xa8, 0xbc, 0xab, 0xa8, 0x66, 0x32, 0x92, 0x70, 0x45, 0xef, 0x11, 0x81, 0x47, 0x15, 0x12, 0x56, 0xe9, 0x05, 0xeb, 0xbe, 0x24, 0x9b, 0x50, 0x43, 0x0f, + 0x06, 0x6e, 0xfd, 0x62, 0x70, 0x58, 0x02, 0x18, 0x6d, 0x9c, 0x3f, 0x24, 0xb0, 0x5e, 0x42, 0x54, 0x91, 0xa7, 0x01, 0x7e, 0x09, 0xed, 0xde, 0xd3, 0xd0, 0x4a, 0x66, 0xfd, 0xb4, 0x54, 0x48, 0x27, + 0xfc, 0x4d, 0xa9, 0xc4, 0xcf, 0x10, 0x0e, 0xfc, 0x15, 0x86, 0xe3, 0x7a, 0xd1, 0x94, 0xab, 0x7c, 0x86, 0x81, 0xad, 0x21, 0xd7, 0x6b, 0x30, 0xc1, 0x1c, 0xeb, 0x15, 0xf4, 0xcd, 0x42, 0xc4, 0x6f, + 0xe3, 0x41, 0xed, 0x4b, 0x3c, 0x08, 0x7c, 0x3d, 0x7e, 0x51, 0xd7, 0xea, 0x19, 0x3e, 0xa7, 0x54, 0x45, 0xc3, 0x53, 0xe6, 0xd2, 0x03, 0x13, 0xea, 0xaf, 0xa6, 0xe0, 0x42, 0x69, 0xfa, 0x0b, 0x89, + 0xcc, 0x03, 0xfb, 0x7a, 0xc4, 0x93, 0xd2, 0xa7, 0x83, 0x9c, 0xf3, 0x87, 0xc6, 0xf2, 0x8f, 0xf6, 0x55, 0x59, 0x93, 0x5f, 0x2e, 0x4f, 0xc7, 0x87, 0xb9, 0x08, 0x64, 0xd6, 0x41, 0x8e, 0x22, 0x20, + 0xae, 0x96, 0x86, 0x75, 0xe1, 0x17, 0x16, 0xc0, 0x33, 0xdc, 0xb9, 0x28, 0xd4, 0xdc, 0xb4, 0x05, 0x31, 0x9b, 0xe8, 0xb3, 0xb0, 0xb7, 0x5f, 0x96, 0x81, 0x6f, 0x51, 0x1f, 0x74, 0xf3, 0x49, 0x08, + 0xc3, 0x47, 0xa8, 0x5b, 0x99, 0xbc, 0x32, 0xd0, 0xc9, 0x37, 0x4d, 0x0a, 0x5e, 0x64, 0x9f, 0xe9, 0x46, 0x83, 0x99, 0x81, 0xdb, 0xd6, 0x1e, 0xe4, 0xce, 0xc0, 0xc5, 0x43, 0xec, 0xb5, 0xc1, 0x56, + 0x3e, 0xc0, 0xb5, 0x64, 0x7d, 0xa8, 0x4b, 0xd4, 0x7b, 0x28, 0xa1, 0xf8, 0x88, 0x7f, 0x8c, 0x53, 0xea, 0x0c, 0x33, 0xd6, 0x20, 0xa9, 0x1b, 0xbc, 0x0b, 0xfe, 0xa3, 0xc0, 0x1f, 0x09, 0xed, 0x0b, + 0x1d, 0xad, 0x1f, 0xb6, 0x0e, 0xd5, 0x94, 0x8a, 0x94, 0xee, 0xd6, 0xc8, 0xab, 0x58, 0x86, 0x92, 0x7e, 0xd0, 0xd6, 0x05, 0xe0, 0x37, 0x1d, 0xab, 0x1f, 0xbc, 0x7c, 0x17, 0x72, 0xf0, 0x12, 0x3e, + 0x61, 0xfa, 0x92, 0xad, 0x34, 0x4e, 0xf4, 0x44, 0xfc, 0x24, 0x4b, 0x13, 0x79, 0x79, 0x99, 0x5e, 0xb2, 0xda, 0xca, 0x9c, 0xcf, 0x86, 0x8c, 0x2a, 0xa0, 0x75, 0xf8, 0xe1, 0xa4, 0x27, 0xcf, 0x28, + 0x79, 0xd0, 0xdc, 0x89, 0x54, 0x5a, 0x59, 0x61, 0x0f, 0x82, 0x1b, 0x63, 0x75, 0x52, 0x01, 0xf5, 0xe9, 0x86, 0x2e, 0xdd, 0x5f, 0x1e, 0xc7, 0x9f, 0xa6, 0x4b, 0xea, 0x6f, 0xc6, 0x10, 0x58, 0x6e, + 0x7e, 0x97, 0x99, 0xaa, 0x69, 0x93, 0xc3, 0xb1, 0x56, 0x29, 0x77, 0xe7, 0x69, 0x1e, 0xc6, 0x6b, 0x96, 0x44, 0xeb, 0x80, 0x36, 0xea, 0xa5, 0xd3, 0x0c, 0x2f, 0xd9, 0x1e, 0xcd, 0x18, 0x95, 0xaf, + 0xad, 0xaf, 0xd3, 0xc9, 0xda, 0x91, 0x87, 0x69, 0x1d, 0x78, 0xcd, 0x2f, 0x1d, 0x0a, 0x83, 0x05, 0xd2, 0x66, 0xdc, 0x4a, 0x2b, 0x76, 0x4a, 0x66, 0xf7, 0x38, 0x7c, 0xce, 0xbd, 0x8e, 0x67, 0x0f, + 0xaa, 0x18, 0xda, 0x06, 0xa8, 0x04, 0xeb, 0x0b, 0xdd, 0x93, 0x83, 0x1f, 0x92, 0xc2, 0xea, 0x1d, 0x8f, 0xb4, 0xae, 0x92, 0xdc, 0x49, 0x9d, 0x49, 0xa9, 0xea, 0x8e, 0x94, 0x72, 0x74, 0x83, 0x95, + 0x1a, 0x3f, 0x52, 0xe0, 0xe1, 0x65, 0x0a, 0x9b, 0x91, 0x43, 0x3c, 0x60, 0x57, 0x00, 0x89, 0x96, 0x01, 0xba, 0x90, 0xf1, 0xb0, 0xb8, 0x08, 0x1c, 0xf6, 0xa3, 0xb3, 0x28, 0x2f, 0x61, 0x14, 0x65, + 0x19, 0x8c, 0x5c, 0xbb, 0x7d, 0x6c, 0x7c, 0x73, 0x82, 0x6a, 0x1a, 0x33, 0xd4, 0x4b, 0xf3, 0xc3, 0x70, 0xfa, 0x34, 0xb9, 0x5f, 0x3d, 0x67, 0x42, 0xa3, 0x47, 0xbd, 0x60, 0x2a, 0x01, 0x5e, 0xf4, + 0xe6, 0x0f, 0x76, 0x5f, 0x6d, 0xf1, 0x75, 0xf6, 0x38, 0x47, 0x89, 0xdb, 0xc3, 0x62, 0x21, 0x92, 0x49, 0xb5, 0x56, 0xd9, 0x8d, 0x17, 0x0b, 0x36, 0xd3, 0x39, 0xbd, 0x2b, 0x5d, 0xfe, 0x78, 0xf0, + 0x23, 0xea, 0xb2, 0x5d, 0xf2, 0x6b, 0xd1, 0x55, 0x9d, 0x91, 0x59, 0x3d, 0x3c, 0x9e, 0xc2, 0x23, 0xdb, 0x31, 0x4e, 0x23, 0xe2, 0x15, 0x5d, 0x15, 0x40, 0x40, 0x09, 0x7a, 0xad, 0x73, 0xdf, 0x03, + 0xeb, 0x67, 0x1d, 0xc0, 0xe9, 0x2e, 0x34, 0x9e, 0x04, 0xd6, 0xaa, 0x97, 0xc8, 0x01, 0x58, 0x30, 0x7d, 0xa9, 0xb0, 0x81, 0x38, 0x1b, 0x04, 0x7b, 0x90, 0x6e, 0xe6, 0xf4, 0x1f, 0xac, 0xd2, 0x91, + 0x97, 0x8e, 0x69, 0xa5, 0x23, 0xac, 0xf4, 0x49, 0x8b, 0x5c, 0xf2, 0x14, 0x4d, 0xab, 0xb0, 0xb3, 0xf4, 0x36, 0x01, 0xe2, 0x19, 0x83, 0x7f, 0x29, 0x58, 0x6e, 0x68, 0x06, 0x6b, 0xfc, 0xcb, 0x76, + 0xa8, 0x7f, 0x7d, 0x61, 0xfe, 0xba, 0xa8, 0xdf, 0xc9, 0x5a, 0x8f, 0xc3, 0xbf, 0xa8, 0x6d, 0xad, 0xc6, 0xb9, 0x5e, 0xaf, 0xbf, 0x37, 0xbd, 0xf8, 0xfb, 0x30, 0xe0, 0xf9, 0x25, 0x0c, 0x20, 0x7e, + 0x08, 0x57, 0x58, 0xae, 0x32, 0xbf, 0xae, 0x75, 0x6d, 0x52, 0x90, 0x2a, 0x48, 0x08, 0x8f, 0x82, 0xc3, 0x10, 0x86, 0xdf, 0x6d, 0x5d, 0x1c, 0x5f, 0xfb, 0x68, 0xab, 0x9f, 0x14, 0xa5, 0x80, 0xaf, + 0x1d, 0x50, 0x90, 0x74, 0x0a, 0x37, 0x15, 0x7f, 0x8b, 0x47, 0x4b, 0x97, 0x6b, 0xb3, 0x2b, 0x0e, 0x78, 0x28, 0x0e, 0xa5, 0xd2, 0x0d, 0xf8, 0x2d, 0x7a, 0x56, 0xdd, 0x1b, 0xb1, 0xbb, 0x77, 0xf3, + 0xab, 0xba, 0x14, 0x7d, 0x6a, 0xa2, 0xf7, 0xe4, 0x97, 0xb8, 0x27, 0xaf, 0x98, 0xe5, 0x12, 0x8d, 0x2e, 0xbf, 0xb7, 0x59, 0x55, 0x9a, 0x6d, 0x41, 0xa4, 0xee, 0x42, 0xff, 0x1f, 0x75, 0xff, 0xd1, + 0xec, 0xa8, 0xb6, 0x7c, 0x81, 0x83, 0x73, 0x3e, 0xc5, 0x9b, 0x2b, 0x3a, 0xf0, 0x02, 0x06, 0x3d, 0xc0, 0x3b, 0x01, 0xc2, 0x9b, 0x19, 0xde, 0x83, 0xf0, 0xe6, 0xd3, 0x77, 0x54, 0xd5, 0xad, 0x7a, + 0xf7, 0xd6, 0xf5, 0xfd, 0x7b, 0xdd, 0x11, 0xff, 0x33, 0x52, 0x70, 0xce, 0x91, 0x36, 0x3b, 0x44, 0xae, 0xb5, 0x33, 0x57, 0xae, 0xb4, 0xde, 0x5f, 0x35, 0x0c, 0xbf, 0x52, 0x60, 0xfc, 0xb7, 0x9d, + 0x55, 0x73, 0xe4, 0x56, 0x7f, 0x3b, 0x2e, 0xc5, 0x3b, 0x17, 0x63, 0xbb, 0x10, 0x5f, 0x9a, 0xbf, 0xb2, 0xa8, 0xcb, 0xc4, 0x6e, 0x07, 0x92, 0x9a, 0x61, 0xb2, 0xc0, 0x1a, 0x13, 0x54, 0xf9, 0x64, + 0x52, 0xfb, 0x0b, 0x6f, 0xa0, 0xbf, 0x70, 0x04, 0xfc, 0x0b, 0x3d, 0xf8, 0x89, 0x37, 0x60, 0xbf, 0xee, 0xa5, 0xad, 0x7e, 0x32, 0xcd, 0x02, 0xfe, 0x57, 0xb7, 0xf8, 0xcd, 0xec, 0xe3, 0x7f, 0x74, + 0x8b, 0x5f, 0xee, 0x10, 0xf8, 0xf5, 0x2d, 0xfe, 0x0b, 0x99, 0x87, 0xf5, 0x14, 0x6c, 0x1b, 0x2a, 0x3f, 0xfe, 0x12, 0x1f, 0xba, 0xa2, 0xa3, 0xc2, 0x0d, 0x59, 0x03, 0x90, 0x29, 0xed, 0xac, 0x3f, + 0x75, 0x4a, 0x46, 0x69, 0x3a, 0x4d, 0x4e, 0x07, 0x25, 0x9d, 0xa7, 0x5a, 0xa9, 0x6f, 0x1b, 0x25, 0x4d, 0x6f, 0x46, 0x8a, 0x54, 0x52, 0xd1, 0x30, 0x00, 0x15, 0xfb, 0x20, 0x83, 0xcf, 0x8d, 0x36, + 0x0b, 0x6d, 0x55, 0xc4, 0x4e, 0x5a, 0x1d, 0x59, 0x40, 0x55, 0x83, 0xa9, 0x8f, 0x06, 0x4f, 0x1f, 0xd1, 0xbb, 0xd7, 0xa5, 0x39, 0x02, 0x04, 0x71, 0x1f, 0x86, 0x97, 0x21, 0x8c, 0xb2, 0xf2, 0xcc, + 0x26, 0xea, 0x6c, 0xf5, 0x62, 0x01, 0x4d, 0xf4, 0x39, 0x88, 0xf7, 0x13, 0x25, 0x58, 0x96, 0x62, 0xac, 0xc7, 0x23, 0x21, 0xf8, 0x4f, 0x4d, 0xbd, 0x0b, 0xbc, 0x03, 0xd7, 0xe2, 0x1c, 0x4c, 0x54, + 0xa5, 0x38, 0x9a, 0xf3, 0xeb, 0x7c, 0x9d, 0x5f, 0xfa, 0x7b, 0x6d, 0xf0, 0x32, 0x15, 0xd4, 0xf5, 0x01, 0xe0, 0xb9, 0xbe, 0x81, 0x7a, 0x3d, 0xe2, 0x8a, 0xdc, 0x22, 0xad, 0x3e, 0x87, 0x73, 0xe5, + 0x81, 0xf9, 0xcc, 0xec, 0xe2, 0x85, 0xd4, 0xa0, 0x66, 0x34, 0xd1, 0xdc, 0xf6, 0xc8, 0xf9, 0xe9, 0x8b, 0x0a, 0xb3, 0x39, 0x46, 0x80, 0x63, 0xb4, 0xe2, 0x9c, 0x53, 0x08, 0xdf, 0xc7, 0xd5, 0x75, + 0xfc, 0xb0, 0x8b, 0x05, 0x77, 0xd5, 0x4f, 0x24, 0x7e, 0x7c, 0x44, 0xe0, 0x24, 0xd3, 0x72, 0x7c, 0xf1, 0x45, 0x94, 0xe1, 0x32, 0xfb, 0x9a, 0x5a, 0x67, 0x1a, 0xae, 0x12, 0x0a, 0xd1, 0xca, 0xd8, + 0xc7, 0x5b, 0x16, 0x64, 0x13, 0xc9, 0x8c, 0xb4, 0x9e, 0x92, 0xe0, 0x05, 0x6b, 0xe2, 0x55, 0xab, 0x01, 0xab, 0x10, 0xab, 0xba, 0x85, 0x48, 0x4e, 0x94, 0x6e, 0xf8, 0xe6, 0x58, 0x37, 0x32, 0x12, + 0xe7, 0x19, 0x3d, 0x3e, 0x6e, 0x00, 0x20, 0xc3, 0x71, 0x7b, 0x10, 0x4f, 0x36, 0x9e, 0xb4, 0xb2, 0x44, 0x94, 0xce, 0xd7, 0xd9, 0x88, 0x2b, 0x15, 0x5c, 0xdc, 0x83, 0x7c, 0x7a, 0x28, 0xdf, 0x3f, + 0x29, 0xa1, 0xcf, 0xd5, 0xc6, 0xaf, 0x6d, 0x68, 0x9b, 0x3a, 0xff, 0x9d, 0x52, 0xfb, 0xb4, 0x53, 0x8a, 0xff, 0x22, 0x8e, 0xe9, 0x0d, 0x42, 0x9b, 0x8a, 0x7e, 0x74, 0x70, 0x7b, 0x6e, 0x6f, 0xf3, + 0x05, 0x18, 0xfb, 0x30, 0x9a, 0x90, 0x9c, 0xd7, 0x59, 0xcd, 0x5f, 0xe7, 0xfb, 0x44, 0x92, 0xbd, 0xaa, 0x7d, 0x16, 0x6b, 0xd8, 0xca, 0x9f, 0x19, 0x33, 0x1b, 0xe8, 0x79, 0x48, 0xf3, 0xfd, 0xcd, + 0xad, 0x10, 0x35, 0x45, 0x71, 0x65, 0xbf, 0x20, 0x92, 0x7a, 0x3e, 0x60, 0xce, 0x56, 0xb4, 0x83, 0x11, 0x19, 0x42, 0x08, 0x09, 0x6a, 0x35, 0x6a, 0xac, 0xdb, 0x50, 0x60, 0x29, 0xcd, 0xda, 0xfd, + 0xf8, 0x74, 0x8b, 0x0c, 0x63, 0xd3, 0x9e, 0x1d, 0x19, 0xf1, 0xdc, 0x2b, 0x60, 0x20, 0x7a, 0x9b, 0x5e, 0xd1, 0xe9, 0x7e, 0x62, 0x4f, 0x66, 0x37, 0xaa, 0x28, 0x5c, 0xf1, 0xe3, 0x59, 0xf3, 0xa3, + 0x1c, 0xaf, 0xaa, 0x2a, 0x50, 0xce, 0x3c, 0x9e, 0xea, 0xf4, 0x62, 0xc5, 0xc9, 0x22, 0xb1, 0x71, 0xa0, 0x23, 0x21, 0x9b, 0x1f, 0x2c, 0x20, 0xb2, 0x39, 0x04, 0xc7, 0x4f, 0xe8, 0x82, 0xb9, 0x3e, + 0x06, 0x2d, 0xad, 0x1a, 0xf8, 0xe3, 0x19, 0x27, 0x85, 0x30, 0x26, 0x25, 0xf2, 0xa6, 0x68, 0xb4, 0xd8, 0x4d, 0x73, 0xac, 0xc0, 0xf1, 0xd6, 0x9e, 0xaf, 0xee, 0xc8, 0x4d, 0x4b, 0x64, 0x42, 0x12, + 0x0b, 0x53, 0x7f, 0x99, 0x09, 0x35, 0x56, 0xd7, 0x5b, 0x48, 0x8d, 0xfe, 0x23, 0x61, 0x9a, 0x8e, 0x03, 0x7e, 0x16, 0x96, 0xe2, 0x04, 0x5e, 0xf1, 0xa7, 0x9e, 0xd2, 0xf9, 0x0c, 0xec, 0x55, 0x79, + 0x0d, 0xc9, 0x62, 0x82, 0x2f, 0x46, 0x33, 0xf3, 0x60, 0x95, 0x1c, 0x38, 0x57, 0x15, 0x24, 0xbd, 0x5f, 0x8f, 0xdb, 0xcd, 0xa6, 0xc1, 0x7a, 0xf8, 0xfc, 0x4f, 0xed, 0x13, 0x3f, 0xa8, 0x03, 0xf0, + 0x85, 0x3b, 0x6c, 0x4f, 0xea, 0x41, 0x37, 0xe8, 0xf3, 0xb3, 0xf3, 0x64, 0x25, 0x3f, 0x57, 0xa2, 0xa9, 0x43, 0x42, 0x6f, 0x2f, 0x6d, 0x35, 0xff, 0xb8, 0x79, 0xf9, 0x4f, 0xb2, 0xe3, 0x3f, 0x0f, + 0x43, 0xd3, 0x7e, 0xc8, 0x3c, 0xe8, 0xf9, 0x84, 0xdd, 0x98, 0x5f, 0x9f, 0xb8, 0xb5, 0x21, 0xd7, 0xe5, 0xb8, 0xbc, 0x4b, 0x2b, 0xba, 0x36, 0x68, 0x7b, 0x77, 0x08, 0xce, 0x7b, 0x64, 0x7d, 0x83, + 0xde, 0x07, 0x6a, 0x51, 0x65, 0x9d, 0xb2, 0xd9, 0xf0, 0xcd, 0x68, 0x2b, 0x30, 0x0b, 0x71, 0xbd, 0xe8, 0xd1, 0x83, 0x8f, 0x5e, 0x9f, 0xd7, 0x3c, 0xe5, 0xaf, 0xcf, 0xe7, 0x5a, 0x12, 0x28, 0xb2, + 0xc4, 0xb3, 0xd2, 0x63, 0x35, 0x5e, 0x99, 0xd0, 0x8e, 0xbd, 0x49, 0xc3, 0xb2, 0xf4, 0xf1, 0x61, 0xe6, 0xf1, 0x75, 0xbc, 0xa1, 0xb9, 0xe7, 0x33, 0x9e, 0x59, 0xa6, 0x8f, 0xbc, 0x3e, 0xcf, 0x02, + 0x13, 0x3e, 0x9b, 0x44, 0xc3, 0x4b, 0xf3, 0x00, 0x86, 0xe9, 0xf9, 0x56, 0x89, 0x91, 0xea, 0x8b, 0x26, 0x4c, 0x8f, 0x2e, 0xb4, 0xfa, 0x67, 0x3f, 0xbc, 0x9d, 0x40, 0xa1, 0x0c, 0x0f, 0x69, 0x72, + 0x2e, 0xad, 0x6e, 0x27, 0x7d, 0xb0, 0xb5, 0x85, 0xb7, 0x9c, 0x21, 0xa0, 0x9e, 0x1d, 0xb4, 0xb4, 0x6a, 0xdd, 0x12, 0xa1, 0x2c, 0xa5, 0x44, 0xa7, 0x6d, 0xec, 0x65, 0xd8, 0xd2, 0x0c, 0xa4, 0x31, + 0xda, 0x25, 0xb0, 0x46, 0x27, 0xd9, 0x24, 0xe4, 0xd6, 0x22, 0xf2, 0xb0, 0xde, 0x43, 0x2c, 0x9c, 0xf5, 0xb6, 0x3b, 0x87, 0x12, 0xbf, 0x1f, 0x7c, 0x7f, 0xdf, 0x1e, 0x5c, 0x2e, 0x1c, 0x06, 0xe7, + 0xb9, 0xf0, 0x2e, 0xac, 0x27, 0x04, 0xca, 0x7b, 0x98, 0x36, 0x2b, 0x11, 0x29, 0x26, 0xda, 0x0b, 0xc1, 0x6b, 0x9e, 0xdb, 0x72, 0xab, 0xce, 0xad, 0x1a, 0x27, 0xfe, 0xf0, 0x81, 0xc5, 0x9a, 0x22, + 0x76, 0xab, 0x9c, 0x97, 0xa2, 0x12, 0xa3, 0xd9, 0x86, 0x99, 0x79, 0x76, 0x93, 0xb4, 0xbf, 0x64, 0x22, 0x8d, 0x8f, 0xba, 0x16, 0x8e, 0x73, 0x07, 0x21, 0x76, 0xad, 0x89, 0xa7, 0x45, 0xb0, 0x91, + 0x18, 0x46, 0xd8, 0xe1, 0xd2, 0x29, 0x3c, 0x32, 0xfd, 0xa7, 0x91, 0x03, 0x97, 0x2b, 0xe5, 0x5a, 0x4d, 0x46, 0x49, 0xac, 0x0a, 0xf5, 0x03, 0x7c, 0x58, 0x74, 0xa0, 0x54, 0xb7, 0xe5, 0xf9, 0x9c, + 0xbb, 0x16, 0x14, 0x6a, 0x82, 0x2e, 0x5c, 0xcc, 0x38, 0xc1, 0xcf, 0x71, 0x42, 0x22, 0x88, 0x81, 0x71, 0x8b, 0x22, 0x4c, 0x5d, 0xbd, 0x76, 0x2e, 0x79, 0xaa, 0x2d, 0xf3, 0xde, 0x3d, 0xbf, 0x4f, + 0xdb, 0xbc, 0x69, 0x5b, 0x6a, 0x7b, 0xb8, 0xca, 0x96, 0x33, 0x6f, 0x3b, 0x92, 0x29, 0x61, 0x54, 0x68, 0xe0, 0xd6, 0xce, 0xe8, 0xdc, 0xc2, 0x27, 0x61, 0xc9, 0x5b, 0xec, 0x9c, 0x4b, 0x97, 0x48, + 0xd4, 0x54, 0xc1, 0x44, 0x81, 0xc5, 0x0f, 0xa9, 0xc4, 0x2e, 0x6b, 0xdf, 0x09, 0x1e, 0xa3, 0xe0, 0x02, 0xba, 0x5e, 0x36, 0x14, 0x35, 0x60, 0x49, 0x43, 0xa6, 0xc4, 0x31, 0x07, 0xd1, 0x57, 0x68, + 0x1c, 0x1d, 0x58, 0x69, 0xdf, 0x66, 0x72, 0x7f, 0x4a, 0x45, 0x9a, 0x80, 0x48, 0x39, 0x9f, 0x98, 0x2d, 0x73, 0x53, 0x74, 0x6e, 0xc9, 0x81, 0x77, 0x0e, 0x72, 0x49, 0x15, 0x4c, 0xdc, 0xc9, 0xc4, + 0xe1, 0x59, 0xec, 0x27, 0xa6, 0x51, 0x39, 0x4b, 0x9d, 0x67, 0xf6, 0x3c, 0xd0, 0xd9, 0x25, 0xea, 0x20, 0x56, 0x5c, 0xe8, 0x7c, 0x69, 0xc4, 0x59, 0x14, 0x2b, 0xd4, 0xbe, 0xa0, 0x42, 0xd9, 0x34, + 0x7a, 0x89, 0xb9, 0x16, 0x47, 0x00, 0xc2, 0x92, 0x48, 0x2a, 0xef, 0xfc, 0x65, 0x40, 0xc0, 0x13, 0x81, 0xd4, 0x16, 0xbb, 0x3a, 0x48, 0x63, 0x11, 0x29, 0xc1, 0x9e, 0xce, 0xc7, 0xae, 0x61, 0x04, + 0x5f, 0x58, 0x52, 0x55, 0x8b, 0xf7, 0x58, 0x92, 0xa4, 0xd3, 0xe2, 0x29, 0xa4, 0x4f, 0xda, 0x66, 0xb5, 0xb3, 0x40, 0x56, 0xf9, 0x05, 0x0b, 0x62, 0xd7, 0x73, 0xe3, 0x6b, 0xb8, 0x53, 0x42, 0x06, + 0x5e, 0x71, 0x64, 0x15, 0x97, 0xc4, 0xe8, 0x9e, 0x21, 0x30, 0xed, 0x27, 0x1b, 0x9e, 0x08, 0x21, 0xc2, 0xd4, 0x5f, 0xca, 0x3c, 0x5c, 0x9b, 0xb7, 0xbe, 0x66, 0x15, 0xfe, 0x8f, 0x54, 0xe3, 0x9f, + 0xb0, 0x0d, 0xb4, 0xf9, 0xc2, 0x36, 0x7e, 0x55, 0x28, 0x29, 0xe0, 0x55, 0x7b, 0x5f, 0xcd, 0xd5, 0x89, 0xa3, 0x48, 0x9c, 0x2d, 0xd7, 0xb8, 0xdc, 0xeb, 0x4f, 0xd8, 0x46, 0xcd, 0xfd, 0xc4, 0x36, + 0x3c, 0x4f, 0xfb, 0xd5, 0x50, 0x92, 0xd2, 0x61, 0x5b, 0xbc, 0xcb, 0x2e, 0x46, 0x8d, 0x02, 0xe5, 0x8e, 0x82, 0xf6, 0x14, 0x38, 0xda, 0xfe, 0xf6, 0xbb, 0xd4, 0x61, 0xa1, 0x4f, 0x97, 0x0e, 0x7a, + 0x97, 0xdb, 0x0c, 0x17, 0x07, 0x16, 0xfe, 0x2b, 0xd1, 0xa4, 0x0a, 0xf0, 0xa7, 0xe7, 0xc6, 0xa2, 0x5b, 0x7a, 0x9e, 0x2e, 0xb8, 0xdd, 0xb7, 0x81, 0x76, 0x32, 0x8f, 0x77, 0x99, 0x94, 0xed, 0x69, + 0xbf, 0x9c, 0xaf, 0x86, 0x5e, 0xbe, 0x43, 0xb1, 0xe2, 0x79, 0x8e, 0xe5, 0x29, 0xdf, 0x7d, 0x2f, 0x7e, 0x07, 0xc7, 0xc0, 0x77, 0x3c, 0xfe, 0x43, 0xc6, 0xd1, 0xd0, 0xe7, 0xdf, 0x31, 0x8e, 0xff, + 0x07, 0xdf, 0xe6, 0xbf, 0x60, 0x1d, 0x34, 0xdf, 0xbb, 0x81, 0x5e, 0x12, 0x1c, 0x72, 0xd4, 0x37, 0x00, 0xa9, 0x67, 0xc0, 0x05, 0xc9, 0x7a, 0xdb, 0x85, 0xe3, 0xa8, 0xb0, 0x59, 0x22, 0x52, 0x3d, + 0xd5, 0x8c, 0xce, 0xda, 0x70, 0xcb, 0x66, 0xb7, 0x51, 0x47, 0xa0, 0xf6, 0x8e, 0x87, 0x85, 0x5a, 0x40, 0x06, 0x7d, 0x4b, 0xce, 0x92, 0x45, 0x84, 0x7e, 0x95, 0x96, 0x0a, 0x15, 0xb1, 0x91, 0xc6, + 0xa4, 0x51, 0xf5, 0x50, 0xf0, 0x8c, 0xa9, 0x22, 0x42, 0x1a, 0x20, 0x84, 0x54, 0x24, 0xdb, 0xd5, 0x8f, 0x71, 0x6d, 0xd6, 0xc3, 0x50, 0x76, 0xc8, 0x38, 0x7c, 0x59, 0xa1, 0x95, 0xf7, 0xf6, 0x1a, + 0x33, 0xad, 0x0d, 0x57, 0x45, 0x72, 0xc3, 0xde, 0x49, 0x8a, 0xa7, 0x26, 0x92, 0x61, 0x19, 0xc6, 0x1f, 0xba, 0x7e, 0xbf, 0xee, 0x07, 0x0f, 0xb2, 0x92, 0x20, 0xed, 0x08, 0xce, 0x3c, 0x0c, 0xd8, + 0xb0, 0xac, 0xb3, 0x12, 0x06, 0xc0, 0x2a, 0x2b, 0xeb, 0xc2, 0x42, 0xd7, 0xe3, 0x1e, 0xa4, 0x06, 0xe2, 0x8f, 0x44, 0xb9, 0x41, 0xe1, 0x03, 0x85, 0xbb, 0x27, 0x1a, 0x7a, 0x1c, 0x0f, 0xd1, 0x52, + 0x5d, 0x11, 0xb5, 0x54, 0xd1, 0x2c, 0xb9, 0x3d, 0x5a, 0x72, 0x87, 0x40, 0x3f, 0x9f, 0xda, 0x7d, 0xa0, 0xaf, 0x2b, 0x77, 0xde, 0xcf, 0x9d, 0x89, 0x42, 0x58, 0x82, 0xb3, 0x78, 0x05, 0x41, 0x03, + 0x78, 0x38, 0x08, 0xfa, 0x7a, 0x25, 0x88, 0xa7, 0xa3, 0x32, 0x7e, 0xca, 0x4f, 0x27, 0xc6, 0xb5, 0x7a, 0xce, 0xd2, 0x7e, 0xb6, 0x51, 0x99, 0x43, 0xd5, 0xe2, 0x92, 0xa1, 0x79, 0xc0, 0x88, 0x58, + 0x0c, 0x19, 0xcb, 0x48, 0x19, 0xa7, 0x8d, 0x9c, 0xfe, 0xd6, 0x4b, 0x0a, 0xb7, 0x1f, 0xee, 0x9d, 0x9b, 0x29, 0xf4, 0xbe, 0xb5, 0x45, 0x77, 0x08, 0x6a, 0x9b, 0x00, 0x70, 0xb0, 0x8c, 0x38, 0xcd, + 0xe6, 0x46, 0x64, 0x1d, 0x74, 0x71, 0x24, 0x4e, 0x07, 0x2b, 0x6d, 0x22, 0xb4, 0xf6, 0x5e, 0xad, 0x5c, 0xf1, 0x86, 0xfa, 0x81, 0x51, 0xde, 0x8e, 0x69, 0x90, 0xd8, 0xbe, 0xc5, 0x03, 0xbc, 0x15, + 0x3b, 0x9a, 0x35, 0x04, 0x45, 0x93, 0xb6, 0x78, 0xa6, 0xd0, 0xbb, 0x2b, 0xca, 0x67, 0x17, 0xcd, 0xfc, 0xa7, 0xe0, 0x54, 0x1e, 0x08, 0x61, 0x5f, 0x39, 0x69, 0x94, 0x69, 0x61, 0xf3, 0x10, 0x2d, + 0x63, 0x81, 0x50, 0x08, 0xfd, 0x3c, 0xd6, 0xcc, 0xe8, 0x0f, 0x38, 0xd0, 0x57, 0x06, 0x3e, 0x5f, 0xf1, 0xe4, 0xb6, 0x2f, 0x94, 0xaa, 0xe9, 0xba, 0xec, 0x9d, 0x70, 0x7c, 0xc2, 0xd1, 0x42, 0x76, + 0xb5, 0x86, 0xf0, 0xdb, 0x8b, 0x07, 0x3f, 0x5c, 0xfb, 0x46, 0x4c, 0x35, 0x7f, 0x9e, 0x8a, 0x06, 0x74, 0xc1, 0x7d, 0xc7, 0x87, 0xff, 0x09, 0xaa, 0x98, 0xbb, 0x5f, 0xd5, 0x80, 0x6d, 0xa5, 0x33, + 0xa4, 0x67, 0x52, 0xae, 0xba, 0xb6, 0x3c, 0xe0, 0x04, 0xa4, 0x88, 0x2e, 0x7d, 0x1e, 0x8d, 0x71, 0x41, 0xf4, 0x7e, 0x7b, 0x5e, 0x46, 0x77, 0x0a, 0xc2, 0x77, 0xa1, 0x38, 0x3c, 0x6c, 0x7d, 0x8b, + 0xac, 0xb6, 0x24, 0x6e, 0x65, 0x80, 0x52, 0xc7, 0xca, 0x49, 0xe0, 0xca, 0x4f, 0x4e, 0x59, 0x59, 0xd0, 0xf4, 0x28, 0x7a, 0x72, 0x2d, 0x9e, 0x52, 0x86, 0xc1, 0xc3, 0xf2, 0xdc, 0x65, 0xa8, 0xc0, + 0x53, 0xcb, 0x07, 0x18, 0x58, 0xcd, 0x8b, 0x10, 0xcc, 0xc8, 0x1c, 0x7a, 0x9f, 0x97, 0x37, 0xf3, 0xfc, 0x68, 0xeb, 0x9b, 0xee, 0x2c, 0x78, 0x78, 0x32, 0xcc, 0xd3, 0x81, 0xd9, 0x48, 0xb4, 0x3b, + 0x96, 0x59, 0xd6, 0xe7, 0x03, 0xc8, 0x5f, 0x05, 0x19, 0x9d, 0x41, 0x75, 0x79, 0x39, 0x2f, 0x95, 0x54, 0x03, 0x6f, 0x5d, 0xbd, 0xad, 0x51, 0xe1, 0xd9, 0xc4, 0x14, 0x68, 0xe1, 0xc8, 0xd2, 0x66, + 0x67, 0x24, 0xa5, 0xa1, 0x3e, 0x87, 0xcb, 0x51, 0xd2, 0x94, 0xb9, 0x49, 0xdd, 0xdd, 0x83, 0x95, 0xb8, 0x1e, 0x2c, 0xf7, 0x13, 0xeb, 0x00, 0x7e, 0x9d, 0xb1, 0x70, 0xd1, 0x1e, 0xf4, 0xa7, 0x71, + 0xb6, 0x17, 0xca, 0x2d, 0x0d, 0x29, 0xec, 0x49, 0x36, 0x23, 0x67, 0x99, 0x8b, 0x96, 0xe5, 0x1f, 0xb1, 0x0e, 0xe0, 0x47, 0x51, 0xfe, 0xcf, 0x58, 0x87, 0x70, 0xbb, 0x05, 0x8d, 0xbe, 0xa9, 0x43, + 0xa0, 0xcc, 0xa8, 0xeb, 0x38, 0xe9, 0x2d, 0xb8, 0x1f, 0xf0, 0xf5, 0xd0, 0x1e, 0x11, 0x33, 0x90, 0x09, 0xd2, 0x6a, 0xde, 0x80, 0x63, 0xac, 0xe7, 0xe5, 0x3e, 0x20, 0xbc, 0x05, 0xfb, 0xcd, 0xe6, + 0x52, 0xc7, 0x36, 0xab, 0x74, 0x8f, 0x8c, 0xfe, 0x54, 0x10, 0x50, 0xd0, 0xcd, 0x43, 0xb6, 0x93, 0xb3, 0x5f, 0x8d, 0x6d, 0x3c, 0x2a, 0xe7, 0xa9, 0x1a, 0x9e, 0xaf, 0x5a, 0x24, 0xd2, 0x7a, 0xc8, + 0xeb, 0x92, 0x31, 0xd2, 0x9e, 0x58, 0x10, 0xdd, 0x27, 0xa3, 0x7b, 0x79, 0xf6, 0x28, 0xca, 0x22, 0xec, 0xe5, 0x6c, 0x1b, 0x01, 0x44, 0x47, 0x1e, 0x01, 0xbf, 0xb4, 0xbc, 0x17, 0x80, 0x8a, 0xf2, + 0xd9, 0x82, 0x7a, 0x9c, 0x89, 0x72, 0xd5, 0x07, 0x14, 0x44, 0x69, 0xa7, 0x76, 0x05, 0xc5, 0xe3, 0x98, 0x63, 0x20, 0x42, 0x75, 0xd8, 0x24, 0x75, 0xb1, 0x1b, 0x95, 0x8d, 0x83, 0x29, 0x0f, 0xe3, + 0xae, 0x5b, 0xeb, 0x9b, 0x94, 0x1f, 0x64, 0x63, 0x59, 0x31, 0x19, 0x0a, 0xbe, 0x6d, 0x02, 0x7c, 0x49, 0xdd, 0x2a, 0x4b, 0x08, 0x58, 0x6d, 0x19, 0xa0, 0xd0, 0x2c, 0xe4, 0xdb, 0x12, 0xc0, 0x5a, + 0xbd, 0x9f, 0xd7, 0xc3, 0x80, 0xd6, 0x4e, 0x08, 0xcd, 0x80, 0xe9, 0x90, 0xc7, 0x98, 0x0d, 0xea, 0xbb, 0xc6, 0x0e, 0x64, 0x26, 0x48, 0x9d, 0x49, 0xf1, 0xb3, 0xc9, 0xe3, 0x3e, 0x39, 0xa9, 0xe5, + 0x33, 0x08, 0xf5, 0x99, 0x35, 0x66, 0x89, 0xca, 0x1a, 0x40, 0xfa, 0xa9, 0x55, 0x9b, 0x57, 0xca, 0x43, 0xe7, 0xa5, 0xeb, 0x0f, 0x12, 0x0e, 0xa4, 0x62, 0x1a, 0xa4, 0x0c, 0x4b, 0xba, 0xa5, 0xe1, + 0x0e, 0x3b, 0xf0, 0x83, 0x78, 0xf7, 0x52, 0x7b, 0x6d, 0xf5, 0x19, 0x7c, 0x04, 0xb9, 0xe3, 0x87, 0x96, 0x9b, 0x3e, 0xa2, 0x79, 0x3b, 0x82, 0x75, 0xab, 0xce, 0x36, 0xbc, 0x73, 0xbb, 0x20, 0x32, + 0x3d, 0x10, 0x6b, 0x40, 0xb0, 0x73, 0x57, 0xd2, 0xa8, 0x0a, 0xbb, 0x62, 0x22, 0x79, 0xea, 0x83, 0x62, 0x0b, 0x19, 0xbe, 0x42, 0x19, 0x7b, 0xe1, 0xa3, 0x78, 0x6f, 0xec, 0xfc, 0xb8, 0xb8, 0x08, + 0x0b, 0xdc, 0x5e, 0x10, 0xa0, 0x25, 0xe9, 0xa3, 0x52, 0x1e, 0xc0, 0x02, 0x2d, 0xa3, 0x40, 0xea, 0xd4, 0x90, 0x7d, 0xda, 0xa6, 0x8a, 0x6b, 0xfa, 0x35, 0x2e, 0x57, 0x9a, 0xd5, 0xc0, 0x45, 0xe3, + 0x19, 0x75, 0x47, 0xc9, 0xb5, 0xd1, 0x9d, 0x62, 0x8a, 0x10, 0x6a, 0x8d, 0xd2, 0x20, 0xa5, 0xf4, 0x9b, 0xe2, 0x52, 0x38, 0x3f, 0x28, 0xf8, 0x3d, 0x11, 0x6f, 0xf2, 0x12, 0xe0, 0x9e, 0x02, 0x27, + 0x1b, 0x2d, 0x36, 0xf3, 0x85, 0x52, 0x51, 0x1e, 0xaf, 0x4e, 0x10, 0x1f, 0x48, 0x7e, 0x54, 0xd0, 0xf4, 0x51, 0x15, 0xac, 0x69, 0x76, 0x2a, 0x05, 0x14, 0x64, 0xaf, 0x16, 0x1e, 0xbc, 0x99, 0x07, + 0x46, 0xbf, 0x56, 0x2b, 0xaa, 0xc8, 0xd5, 0x36, 0xa3, 0x60, 0xa2, 0xf8, 0x22, 0x20, 0x7a, 0x8b, 0xf1, 0x82, 0x4b, 0xf7, 0x4d, 0xd5, 0x43, 0x7d, 0x35, 0x3b, 0xe6, 0x61, 0xf3, 0xeb, 0x0a, 0xaa, + 0x54, 0x3f, 0x59, 0x71, 0x4e, 0xe2, 0xe8, 0xa2, 0xa0, 0xc2, 0x16, 0xc9, 0xb8, 0x97, 0xaf, 0x6a, 0xe2, 0x01, 0x2c, 0xf4, 0x5e, 0x0e, 0xfc, 0xcd, 0x49, 0x7a, 0x42, 0x62, 0x48, 0x0f, 0x5b, 0x50, + 0xcc, 0xbc, 0x9e, 0x2a, 0x3b, 0x51, 0x7a, 0x63, 0x49, 0x1c, 0xdf, 0x14, 0xe4, 0xaa, 0x11, 0xd3, 0xda, 0xa0, 0x1b, 0x9c, 0xca, 0xf5, 0xf6, 0xae, 0x86, 0xb7, 0xc9, 0x36, 0x21, 0xa8, 0xd5, 0xe6, + 0x06, 0x23, 0x91, 0xbc, 0x7b, 0x36, 0xde, 0x35, 0x82, 0x84, 0x95, 0x27, 0x60, 0x3e, 0x9e, 0xb2, 0x94, 0x15, 0x62, 0xd3, 0x9c, 0x5c, 0x5c, 0x21, 0x83, 0xa8, 0xe3, 0xd4, 0xdb, 0x4a, 0xce, 0x70, + 0x1f, 0xd4, 0x56, 0x6d, 0xa8, 0x7f, 0xc6, 0x3a, 0x78, 0x96, 0xfd, 0xff, 0x2d, 0xeb, 0x60, 0x9b, 0x9b, 0x65, 0xe9, 0xea, 0xbf, 0x25, 0xc6, 0x40, 0xde, 0xa2, 0xd3, 0x9b, 0xdc, 0x33, 0x53, 0x4e, + 0x6f, 0x25, 0xf4, 0x3a, 0xe4, 0x34, 0xe5, 0x77, 0x25, 0xc6, 0xdf, 0x42, 0xf1, 0xd7, 0xc3, 0xff, 0xff, 0x0a, 0x8a, 0xbf, 0x20, 0x31, 0xf0, 0xff, 0x25, 0x14, 0x0b, 0x26, 0xa4, 0xfd, 0x8b, 0x1c, + 0xc7, 0xbf, 0x64, 0x1c, 0xff, 0x0f, 0xbb, 0xcd, 0xec, 0xab, 0x7f, 0xf9, 0x9f, 0x2a, 0xb0, 0xe2, 0x59, 0xb0, 0xe2, 0xa9, 0xe8, 0x46, 0xf9, 0x91, 0x3d, 0x61, 0xdb, 0xda, 0x5d, 0x32, 0x8a, 0x11, + 0x7e, 0x9b, 0xcf, 0xd5, 0x47, 0x00, 0x28, 0x8f, 0xee, 0x34, 0x26, 0xb2, 0x41, 0x0f, 0xb5, 0xb0, 0x40, 0x93, 0x51, 0x6e, 0xb9, 0x8d, 0x76, 0x5d, 0x42, 0x28, 0x0c, 0xa2, 0x83, 0x40, 0xac, 0x16, + 0xef, 0x7b, 0x2f, 0xdc, 0x7a, 0x18, 0xca, 0x11, 0xd3, 0x1f, 0xaf, 0xa8, 0x30, 0xc3, 0xd4, 0x39, 0xfb, 0xec, 0xe8, 0x5a, 0xdf, 0x98, 0x8b, 0xfb, 0x4b, 0x7c, 0xe5, 0xea, 0xf3, 0xc9, 0xdf, 0xc0, + 0xf0, 0x36, 0xc0, 0x57, 0x77, 0x3a, 0x8b, 0xf7, 0xb8, 0x0b, 0x47, 0x01, 0xeb, 0xc6, 0x69, 0xf2, 0xe0, 0x17, 0x05, 0xd6, 0x6f, 0x54, 0x55, 0xe6, 0x13, 0x33, 0x7b, 0x11, 0xd6, 0xc8, 0xe8, 0xf8, + 0x44, 0x48, 0xc6, 0x77, 0x08, 0x6a, 0xd0, 0xf0, 0xd9, 0xeb, 0x4d, 0xdf, 0x7c, 0x33, 0x6b, 0x06, 0x7e, 0xed, 0xd6, 0xfc, 0x17, 0x66, 0xcd, 0x3f, 0x2b, 0xb0, 0x46, 0x9a, 0x63, 0x3a, 0xba, 0xa1, + 0x91, 0xe8, 0xc9, 0xfb, 0xac, 0x7e, 0xb7, 0xdd, 0xc1, 0x30, 0x80, 0xe4, 0x3e, 0x1f, 0x98, 0xaf, 0x31, 0xf7, 0xbd, 0x4d, 0x66, 0x25, 0xb4, 0xa3, 0x82, 0xb8, 0x86, 0x29, 0x5b, 0xb9, 0x77, 0x12, + 0x52, 0xf1, 0x69, 0xb7, 0x1c, 0xf3, 0xcd, 0xd9, 0x00, 0xeb, 0x45, 0x56, 0x4e, 0xe3, 0x6e, 0x17, 0x17, 0x62, 0x35, 0x93, 0xfb, 0xa8, 0xbd, 0x20, 0x35, 0x82, 0xa2, 0xda, 0x10, 0x16, 0xa6, 0xef, + 0xc4, 0xb7, 0xf4, 0x68, 0x03, 0xa8, 0xd0, 0x78, 0x26, 0x5e, 0x4d, 0x29, 0x7a, 0xe7, 0xdb, 0xc6, 0xbc, 0x9f, 0xaa, 0x22, 0x96, 0x61, 0x35, 0x19, 0x6d, 0x62, 0x4d, 0xd1, 0xaa, 0x5f, 0xbe, 0x14, + 0x43, 0x1e, 0x1c, 0xc4, 0x55, 0xf9, 0x97, 0x2a, 0x82, 0x6f, 0xe2, 0x01, 0xbb, 0x2e, 0x87, 0xaf, 0xcf, 0xff, 0xf7, 0x6e, 0xb0, 0xff, 0xd7, 0x7f, 0x2c, 0xfc, 0xff, 0xa4, 0x85, 0x94, 0xbe, 0x1c, + 0x30, 0x62, 0xfb, 0x87, 0x0f, 0x6f, 0x28, 0x74, 0x0a, 0xc6, 0x86, 0xdb, 0x06, 0x07, 0x38, 0x3b, 0xe4, 0x6a, 0x5a, 0x74, 0x2a, 0x22, 0x1e, 0x3f, 0x57, 0x82, 0x0f, 0x97, 0xe3, 0x5b, 0x8d, 0xfd, + 0xe6, 0xc1, 0xcb, 0x9e, 0x5a, 0x02, 0x7c, 0xb7, 0x8d, 0x77, 0x91, 0x6e, 0x48, 0xea, 0x6f, 0x5f, 0xc7, 0xff, 0x3a, 0xde, 0xd2, 0xab, 0x2c, 0xc8, 0xf0, 0x4f, 0xf3, 0x1a, 0xbf, 0xdb, 0xdb, 0x39, + 0xb1, 0x9f, 0x6d, 0xbf, 0xfa, 0x1d, 0x07, 0xfc, 0xee, 0x97, 0xdf, 0xe7, 0x34, 0x3a, 0xfc, 0xa9, 0xdd, 0xdf, 0x9e, 0xce, 0x6f, 0x73, 0x1a, 0xb5, 0xaf, 0x4a, 0x02, 0xc3, 0xa1, 0x6f, 0xcd, 0x31, + 0x0f, 0x1d, 0x1e, 0xff, 0xff, 0xbd, 0xb2, 0x9f, 0x14, 0x02, 0x3f, 0x0b, 0x04, 0x2c, 0xc8, 0x35, 0xba, 0x7d, 0xa5, 0x82, 0x04, 0xfc, 0x18, 0x19, 0x5f, 0x3d, 0x14, 0xf2, 0xb5, 0xae, 0x1e, 0x21, + 0x7d, 0xe4, 0x27, 0x60, 0x0b, 0x6d, 0x4a, 0x8a, 0xf2, 0xf9, 0x4a, 0x99, 0xa7, 0xfa, 0xc6, 0xe2, 0x0f, 0x7c, 0xdd, 0xeb, 0x72, 0x05, 0x38, 0x14, 0xb8, 0xfe, 0x7b, 0xb6, 0x32, 0x04, 0xe6, 0xc6, + 0x85, 0x95, 0x22, 0xc7, 0x54, 0x25, 0x74, 0xce, 0x9e, 0xf7, 0x71, 0x8f, 0xa9, 0x9f, 0x39, 0xb1, 0xb5, 0x9b, 0x91, 0x8b, 0x15, 0x64, 0x9b, 0x57, 0xc6, 0x6e, 0x0d, 0x6d, 0x6f, 0x03, 0x15, 0x6e, + 0x4b, 0x1c, 0x37, 0x09, 0x76, 0x1f, 0x17, 0x83, 0xd7, 0x3b, 0x4e, 0x94, 0x55, 0xcc, 0x18, 0xa9, 0xbf, 0xf0, 0xaf, 0xdf, 0xb9, 0x9a, 0xff, 0xc5, 0x73, 0xf2, 0x5b, 0xae, 0xf6, 0xce, 0xc3, 0x8f, + 0xad, 0xec, 0x13, 0x43, 0x8e, 0x95, 0xc5, 0x8f, 0x3d, 0xda, 0x13, 0x39, 0x34, 0xbe, 0xcd, 0x01, 0x6e, 0xff, 0x5c, 0x20, 0x60, 0x78, 0x1f, 0x7e, 0xe9, 0x36, 0x84, 0x0c, 0x4f, 0x60, 0x2b, 0x3b, + 0x06, 0x8b, 0x0a, 0xec, 0x01, 0x22, 0x31, 0x36, 0x40, 0xf6, 0x95, 0xc3, 0x64, 0xa4, 0xbf, 0x5f, 0x8c, 0xed, 0xbf, 0xbc, 0xb5, 0x2f, 0x71, 0x18, 0xcf, 0x9c, 0x72, 0xe3, 0x06, 0x61, 0x45, 0xd4, + 0x98, 0x56, 0x94, 0x5a, 0x98, 0xc2, 0x52, 0x3e, 0xd2, 0x4c, 0x85, 0x1b, 0xf8, 0x9e, 0x8c, 0x87, 0x80, 0xb1, 0xa1, 0x3f, 0x66, 0x91, 0x4c, 0x00, 0x97, 0x70, 0x53, 0xb6, 0x41, 0xea, 0x19, 0xab, + 0x8e, 0xac, 0xa1, 0x6c, 0xa7, 0x3b, 0x18, 0xe7, 0x71, 0x91, 0x1f, 0x44, 0xf8, 0x90, 0x45, 0x4a, 0x60, 0xf6, 0xfc, 0x7a, 0xd8, 0xfb, 0x1d, 0x7d, 0x68, 0xf4, 0xaf, 0x1e, 0x28, 0x39, 0xcb, 0x87, + 0x6f, 0x78, 0xca, 0x8e, 0x7d, 0x9f, 0xcf, 0x69, 0xfd, 0xdf, 0xb1, 0x12, 0xff, 0xf9, 0x33, 0x5b, 0xeb, 0x7f, 0xfa, 0x58, 0xfd, 0xdc, 0x6a, 0x69, 0xb2, 0xa5, 0xc0, 0x96, 0x34, 0x4d, 0xd3, 0xae, + 0xdb, 0x5c, 0xbc, 0x0d, 0x7f, 0x79, 0x49, 0xff, 0x91, 0xe6, 0x9c, 0x63, 0xd4, 0x3f, 0x12, 0x0b, 0xfc, 0x98, 0xbb, 0xc6, 0x56, 0x9a, 0x62, 0xfb, 0x56, 0x97, 0x74, 0xdf, 0xe6, 0xeb, 0x6a, 0x76, + 0x7a, 0x28, 0xe6, 0xf7, 0x8a, 0x3a, 0xae, 0x44, 0xa2, 0xb7, 0x7d, 0x33, 0x64, 0x33, 0x4b, 0x13, 0xa1, 0xd6, 0xc4, 0xf7, 0xae, 0x10, 0xe9, 0xbe, 0xaa, 0x5a, 0x80, 0x5f, 0xb9, 0x06, 0xfd, 0x02, + 0x78, 0xe6, 0x17, 0x70, 0x43, 0x34, 0xa7, 0x3c, 0xb5, 0x46, 0xbe, 0xbf, 0x01, 0xde, 0x4f, 0xd7, 0x9a, 0xdf, 0xae, 0xe8, 0xfb, 0x82, 0x80, 0xff, 0xc5, 0x8a, 0xbe, 0x2f, 0x08, 0xf8, 0xb2, 0xa2, + 0x7f, 0x71, 0x1a, 0x1e, 0x5c, 0x66, 0xc8, 0xdf, 0x78, 0x4b, 0xc1, 0x9c, 0x2e, 0x92, 0x3e, 0x65, 0x85, 0xa1, 0x7a, 0x4d, 0xee, 0xe3, 0x1d, 0x61, 0x5d, 0x06, 0x54, 0x7a, 0xe7, 0xa0, 0xe6, 0x31, + 0x22, 0x59, 0x71, 0x80, 0xcf, 0xa7, 0x67, 0xa2, 0x6a, 0xf4, 0x48, 0xbc, 0xac, 0x90, 0x67, 0xc6, 0xdc, 0xf8, 0xd3, 0x95, 0x1c, 0xab, 0x34, 0x61, 0xf2, 0x8e, 0x96, 0x6a, 0x82, 0xde, 0xf5, 0xac, + 0xc2, 0x79, 0xd5, 0x13, 0x37, 0x1b, 0x8e, 0x85, 0xdf, 0xa8, 0xd4, 0xb8, 0x6d, 0xee, 0x23, 0xaf, 0x52, 0x76, 0xbb, 0x41, 0xa0, 0xd7, 0xd5, 0x3d, 0x4d, 0x0c, 0xc8, 0xc5, 0x29, 0xa3, 0x7a, 0x3c, + 0xec, 0xfd, 0x85, 0x2e, 0xce, 0x2d, 0x1f, 0x35, 0xbf, 0x04, 0x41, 0x57, 0xf0, 0x2e, 0xf9, 0x42, 0xe8, 0x4f, 0xae, 0x23, 0xbe, 0x3c, 0xef, 0x97, 0x59, 0x84, 0x23, 0x5a, 0x1c, 0x44, 0xf9, 0xb1, + 0xa1, 0x0e, 0x7b, 0x2b, 0x7a, 0x59, 0xb3, 0x2f, 0xb2, 0xcf, 0x46, 0xe4, 0xd2, 0xd4, 0x1a, 0x80, 0xd9, 0xd3, 0xa5, 0xc5, 0x14, 0x4e, 0x06, 0x03, 0xa4, 0xbb, 0xe6, 0xf8, 0xe8, 0x68, 0xb7, 0xa8, + 0x72, 0x9f, 0x2f, 0x73, 0xa9, 0x4f, 0x6e, 0x24, 0xec, 0x01, 0xb5, 0x3e, 0x1e, 0xdb, 0x1b, 0xe2, 0xe0, 0xc4, 0x1b, 0x79, 0x30, 0xc5, 0xa0, 0xab, 0x76, 0xd2, 0x8c, 0xd5, 0x92, 0xc0, 0xd1, 0x1c, + 0xbe, 0x43, 0x79, 0xda, 0x0e, 0x10, 0x4d, 0x87, 0x58, 0x20, 0x88, 0xc0, 0x12, 0x76, 0x73, 0x6a, 0x35, 0x96, 0x64, 0x4c, 0x56, 0xc5, 0xce, 0xea, 0xc2, 0x3f, 0x5e, 0x77, 0xbd, 0x99, 0x6d, 0x6b, + 0x58, 0xb5, 0x03, 0x81, 0xcc, 0x8c, 0x2d, 0x46, 0xc6, 0xe4, 0x23, 0x14, 0xa8, 0x72, 0x3c, 0x8c, 0x8c, 0x9d, 0x5e, 0x90, 0x35, 0x0c, 0xa2, 0x40, 0x48, 0x71, 0xcf, 0x60, 0x92, 0x5f, 0x7c, 0x60, + 0x39, 0xf4, 0x3a, 0x00, 0x8d, 0x18, 0xff, 0xde, 0xb7, 0xf9, 0xe3, 0xb3, 0xd9, 0xa9, 0xa0, 0xb8, 0x3b, 0xb3, 0xaf, 0x3d, 0x2c, 0xf0, 0xe6, 0x5a, 0x1a, 0xb6, 0xd6, 0x11, 0x03, 0x4c, 0x6f, 0x2c, + 0x6d, 0x69, 0x12, 0x19, 0x70, 0xfb, 0xf9, 0x2a, 0x9d, 0xf9, 0x7c, 0xb4, 0x77, 0xcf, 0x33, 0x60, 0xc6, 0xa7, 0x12, 0xf1, 0x60, 0xe0, 0xb9, 0x5b, 0xe2, 0xdb, 0x12, 0xb5, 0xfb, 0x02, 0xf4, 0xdc, + 0x53, 0x6c, 0xb3, 0x51, 0xbd, 0xa5, 0xa5, 0x1e, 0x07, 0x19, 0x16, 0xe1, 0x42, 0x1c, 0xd6, 0x9b, 0x75, 0x42, 0x50, 0x71, 0x0e, 0x0c, 0x7d, 0x5a, 0x8f, 0x8a, 0xeb, 0xe7, 0x22, 0xac, 0x89, 0x97, + 0x6e, 0x46, 0x56, 0x6e, 0xdf, 0xb2, 0xe2, 0x34, 0xd0, 0xa3, 0xdd, 0x86, 0xda, 0xbb, 0x52, 0x68, 0xd3, 0x74, 0x23, 0x8c, 0xd4, 0x4c, 0xba, 0x3d, 0xc0, 0x0f, 0x0b, 0xf6, 0x0d, 0x61, 0x5a, 0x20, + 0xbc, 0xa0, 0x77, 0x91, 0xd9, 0xe5, 0x2e, 0x4d, 0xe3, 0xf3, 0xa6, 0x6c, 0xc7, 0x8c, 0xd5, 0xb7, 0xce, 0xd4, 0xdc, 0xe8, 0x10, 0x5b, 0x93, 0x83, 0x78, 0x9b, 0x05, 0xc4, 0xfc, 0x7a, 0x32, 0xc4, + 0xb5, 0x79, 0x4c, 0x79, 0x70, 0x92, 0x93, 0x3e, 0x82, 0x7d, 0x9f, 0xb8, 0x55, 0x3b, 0x56, 0x68, 0xaf, 0xe9, 0x12, 0x38, 0xc5, 0x6c, 0x21, 0xe9, 0x92, 0xcb, 0x3b, 0x9f, 0x2e, 0xa0, 0xc8, 0xe8, + 0xa6, 0x02, 0x92, 0x1a, 0xa2, 0xa2, 0xd6, 0x52, 0xc1, 0x1c, 0xbd, 0x55, 0x91, 0x77, 0xa0, 0x75, 0xcf, 0xe2, 0x91, 0x32, 0x04, 0x87, 0x56, 0x7b, 0x47, 0x5c, 0x4e, 0xbf, 0xf7, 0x29, 0xff, 0x61, + 0xb0, 0x7c, 0x64, 0x25, 0x21, 0xcb, 0xae, 0x2f, 0x24, 0x38, 0x93, 0xea, 0x13, 0xd8, 0x36, 0x61, 0x4b, 0x69, 0xfb, 0xe9, 0x3c, 0xd9, 0x67, 0xac, 0xe9, 0x04, 0x78, 0x4b, 0x47, 0x7a, 0x43, 0x54, + 0xc7, 0x4e, 0x27, 0x0b, 0xf1, 0xc6, 0xf8, 0xc6, 0xf5, 0x5a, 0xf4, 0xe6, 0xdc, 0x31, 0xa0, 0x9f, 0x6c, 0x11, 0xfe, 0xd5, 0x8c, 0x89, 0xdf, 0xd6, 0xfa, 0x5d, 0x33, 0x3a, 0xf4, 0xf7, 0xc1, 0x8c, + 0xfb, 0xf6, 0x91, 0xb6, 0x87, 0xb9, 0xa5, 0xbd, 0xa7, 0xd5, 0x86, 0x3e, 0x84, 0x7f, 0xd1, 0x6a, 0x49, 0x23, 0x5b, 0xcb, 0xbd, 0x90, 0x4f, 0xbb, 0x92, 0x96, 0x14, 0x46, 0xa1, 0x85, 0x0d, 0xaa, + 0x06, 0xe7, 0x9e, 0x41, 0x76, 0xbb, 0xa1, 0xc9, 0xed, 0xbb, 0xfd, 0xc0, 0x4f, 0x7c, 0x64, 0x0d, 0xd1, 0xa5, 0x85, 0x66, 0x7f, 0xd5, 0xf8, 0xc3, 0x85, 0x55, 0x6d, 0xed, 0x0e, 0x09, 0x78, 0x8e, + 0xf5, 0xb3, 0x0f, 0x57, 0xb3, 0xd3, 0x73, 0xb6, 0xd4, 0xa9, 0x8a, 0x35, 0x59, 0x67, 0x36, 0x21, 0x17, 0x5f, 0x08, 0x86, 0x6c, 0x72, 0x37, 0x7f, 0x31, 0xc5, 0xf0, 0x32, 0xea, 0x94, 0xa8, 0xdf, + 0x4c, 0xa4, 0x61, 0x77, 0x08, 0x3d, 0x96, 0x57, 0x43, 0x1c, 0xda, 0xe3, 0x24, 0xb7, 0x63, 0x7d, 0x59, 0xbb, 0x46, 0xa8, 0x53, 0xbc, 0x3c, 0x3f, 0x25, 0x50, 0x56, 0xcb, 0x6a, 0x90, 0x06, 0xff, + 0xf6, 0x72, 0xb5, 0xab, 0x9e, 0x69, 0x96, 0x34, 0x8e, 0xa6, 0xc1, 0x25, 0x2b, 0x1b, 0x26, 0x84, 0xe1, 0x2e, 0xe9, 0xc2, 0xfd, 0x21, 0xc0, 0x10, 0x0d, 0xb1, 0x0d, 0x31, 0x7a, 0x8f, 0xa3, 0xa2, + 0xd0, 0x81, 0x4e, 0xc6, 0x23, 0x4e, 0xc3, 0xc0, 0x53, 0x3d, 0x22, 0x1d, 0x32, 0x25, 0xc2, 0xd7, 0xc7, 0x34, 0xac, 0xc0, 0x78, 0x8f, 0x10, 0x24, 0x74, 0x04, 0xb2, 0xc1, 0x26, 0x79, 0xfb, 0x20, + 0x91, 0x2f, 0xae, 0xe3, 0x48, 0x52, 0xf8, 0x76, 0x62, 0x32, 0xcc, 0x53, 0xac, 0x6d, 0xea, 0x73, 0x71, 0xd1, 0xc7, 0x11, 0x9a, 0x8f, 0xc1, 0x8b, 0xa2, 0x46, 0x90, 0xd4, 0xec, 0x83, 0xf4, 0xd5, + 0xfd, 0x29, 0x27, 0x62, 0xef, 0xe7, 0xce, 0xa2, 0xb0, 0xb2, 0xe9, 0xfb, 0xde, 0x03, 0xc2, 0xe6, 0xee, 0xbc, 0x90, 0x46, 0x60, 0xd8, 0x64, 0x41, 0x50, 0xc4, 0x83, 0x94, 0x70, 0x65, 0x04, 0x0c, + 0xad, 0xd0, 0x52, 0x7d, 0x24, 0xd8, 0x6b, 0xf3, 0xce, 0x04, 0x35, 0x2d, 0xaf, 0xb3, 0xee, 0x94, 0xc4, 0xd4, 0x1f, 0xa6, 0x74, 0x8c, 0xeb, 0x0b, 0xa2, 0xb5, 0x0a, 0x6a, 0x26, 0x7e, 0xb2, 0x65, + 0xbc, 0x43, 0xce, 0x37, 0x8f, 0xd5, 0x6e, 0x00, 0x14, 0xf9, 0xf6, 0xa8, 0xe0, 0x25, 0x90, 0x05, 0xcb, 0x6a, 0xa1, 0x8f, 0x43, 0x1f, 0xfb, 0x12, 0xa4, 0xe3, 0x4d, 0xf8, 0x2f, 0xca, 0x4a, 0xd3, + 0xdd, 0xa7, 0xce, 0x70, 0x94, 0x69, 0x1c, 0xdf, 0xe7, 0x00, 0xac, 0x34, 0xf7, 0xb3, 0x41, 0x54, 0xc7, 0x7f, 0xd8, 0x4c, 0x77, 0xb8, 0x0c, 0xee, 0xee, 0x3b, 0xa4, 0xc4, 0xbd, 0x73, 0x31, 0x02, + 0x9c, 0x47, 0xa0, 0x75, 0x5e, 0x53, 0x07, 0x97, 0xbc, 0xbc, 0x62, 0xd8, 0x41, 0x5e, 0x64, 0x92, 0xb6, 0xb7, 0xd1, 0x8f, 0x6a, 0xec, 0x3c, 0xca, 0xcb, 0xf8, 0x5c, 0x0d, 0x76, 0x36, 0x55, 0x6d, + 0x50, 0x89, 0x73, 0xf9, 0xc3, 0x27, 0x28, 0x6d, 0xf7, 0x9a, 0xc6, 0xb9, 0x9d, 0x44, 0xfc, 0x40, 0xca, 0xa0, 0x59, 0x8f, 0x47, 0x25, 0x62, 0x75, 0x14, 0x59, 0x92, 0x9b, 0x03, 0x48, 0xe0, 0x2b, + 0x6e, 0x0a, 0x99, 0x95, 0x02, 0x57, 0xa1, 0xb6, 0x66, 0x8f, 0x28, 0xad, 0x9d, 0xf0, 0x19, 0xe2, 0x9b, 0x0e, 0x52, 0xdd, 0x46, 0xcc, 0x0b, 0xaa, 0xda, 0xa3, 0x30, 0x07, 0xe5, 0x7e, 0xbb, 0xb9, + 0x00, 0xa9, 0x8f, 0xee, 0xa1, 0x3c, 0x8b, 0xa8, 0x77, 0x3b, 0xe3, 0xa1, 0xfa, 0x34, 0x72, 0xb9, 0x6f, 0x49, 0xd4, 0xeb, 0x7a, 0x69, 0x6f, 0x20, 0x42, 0x16, 0x92, 0x97, 0xdf, 0xe2, 0x9c, 0x3d, + 0xc7, 0xdb, 0x8a, 0x8d, 0xa6, 0xa0, 0x25, 0x1d, 0x15, 0x0b, 0x72, 0xda, 0x49, 0xb3, 0x08, 0x98, 0xfa, 0x71, 0xd0, 0x3a, 0x0c, 0x29, 0xb8, 0xfb, 0xa4, 0x09, 0x70, 0x3a, 0x03, 0xae, 0x14, 0x3f, + 0xd6, 0xaa, 0x62, 0xd9, 0x81, 0xbd, 0x9c, 0x3b, 0x9d, 0xce, 0x87, 0x29, 0xae, 0x9e, 0x3a, 0x18, 0x84, 0x05, 0xa4, 0xe2, 0xad, 0x11, 0xbb, 0x15, 0x3c, 0x98, 0xfa, 0x59, 0x89, 0x4f, 0xe9, 0x9f, + 0xa1, 0xf7, 0x7b, 0x4b, 0xba, 0x3a, 0xfd, 0x8f, 0x9d, 0xa7, 0xeb, 0x38, 0xff, 0x63, 0x00, 0xff, 0x27, 0x18, 0x1e, 0x7d, 0xa1, 0xc6, 0xd0, 0xf3, 0x0f, 0x31, 0xfc, 0x86, 0x22, 0xf2, 0x2f, 0x30, + 0x5c, 0xff, 0x97, 0x18, 0x3e, 0x1e, 0xea, 0x77, 0x43, 0x82, 0x4b, 0xf8, 0x0d, 0x62, 0xba, 0x92, 0x57, 0x27, 0x62, 0xd7, 0xc8, 0x82, 0xde, 0x85, 0xa8, 0xb5, 0x03, 0x69, 0xfd, 0x1b, 0xf7, 0xbf, + 0x9f, 0x70, 0x3c, 0x85, 0xb5, 0x5b, 0xbb, 0x7e, 0x8b, 0xe3, 0xbf, 0x5c, 0x6b, 0x7e, 0xbb, 0xaa, 0xef, 0x12, 0xe0, 0xff, 0xc9, 0xaa, 0xbe, 0x2c, 0xea, 0x37, 0xec, 0xe2, 0x5f, 0x60, 0x39, 0x22, + 0x7f, 0x1c, 0xf2, 0xc3, 0xd7, 0xfb, 0x93, 0xcf, 0x66, 0x76, 0x5f, 0x86, 0x6c, 0x73, 0x2e, 0xe0, 0x8d, 0x8d, 0x44, 0xde, 0x8e, 0x8b, 0x66, 0x4f, 0x5a, 0x93, 0xb0, 0x9f, 0xe3, 0x16, 0xe6, 0x49, + 0xca, 0x90, 0x8a, 0x8d, 0x91, 0x59, 0x16, 0x58, 0xce, 0x6c, 0x66, 0xcf, 0xab, 0x89, 0x7c, 0xaf, 0xc9, 0x28, 0x40, 0xaf, 0x51, 0x44, 0x5e, 0x13, 0x5f, 0x7c, 0xc2, 0x21, 0xcc, 0xf9, 0x1c, 0x93, + 0x05, 0x5d, 0xbc, 0x2c, 0x26, 0x81, 0x9e, 0x2b, 0xf7, 0x04, 0xa4, 0x9a, 0xca, 0x11, 0x72, 0xbd, 0xcd, 0xf8, 0x49, 0xd2, 0x2f, 0x46, 0x55, 0x21, 0xf6, 0x9a, 0x0d, 0x9e, 0xb0, 0x49, 0x79, 0x1d, + 0x72, 0xbb, 0xea, 0x1f, 0x47, 0x6c, 0x54, 0xc4, 0xc1, 0xbe, 0xde, 0x26, 0xce, 0x9a, 0x30, 0x83, 0x3f, 0xd2, 0x55, 0xeb, 0xec, 0x24, 0x5b, 0xa4, 0x6b, 0x7c, 0xc0, 0x3e, 0xc8, 0x72, 0x24, 0x04, + 0x4a, 0xaf, 0x38, 0x90, 0x81, 0x39, 0xdd, 0x3c, 0x59, 0x35, 0x4f, 0x55, 0xc8, 0x42, 0x7f, 0xb3, 0x75, 0x11, 0x9f, 0xe6, 0xa1, 0x84, 0x34, 0xb2, 0x1c, 0x6f, 0xc3, 0x96, 0x71, 0xf6, 0x93, 0x6e, + 0x24, 0xac, 0xa3, 0x9b, 0x6b, 0x09, 0x60, 0xe8, 0xbc, 0xf4, 0x9a, 0x65, 0x7c, 0x1b, 0x89, 0x13, 0x04, 0x96, 0x6d, 0x51, 0x52, 0x1d, 0x9d, 0x72, 0xa0, 0x98, 0xb2, 0x77, 0xde, 0x2e, 0x80, 0xe9, + 0xa2, 0xe6, 0x12, 0x7d, 0xed, 0x59, 0xc8, 0xc5, 0x4c, 0xa3, 0x25, 0x41, 0xda, 0xc4, 0x21, 0x19, 0xe9, 0x77, 0x7c, 0xf6, 0x5a, 0x8a, 0x5a, 0x68, 0xf3, 0x94, 0x78, 0x2e, 0xa9, 0xb6, 0xd8, 0x7a, + 0x12, 0x08, 0x63, 0x2e, 0xcb, 0xae, 0x7e, 0xba, 0xa4, 0xd4, 0x9f, 0x8f, 0x59, 0x67, 0x34, 0x5c, 0xc9, 0x4b, 0x3c, 0xda, 0xec, 0x30, 0x9f, 0x46, 0x1b, 0xe8, 0x95, 0x33, 0x8a, 0xc6, 0xf0, 0x31, + 0x17, 0xe2, 0x71, 0x35, 0x98, 0xc8, 0xa1, 0xfb, 0xc1, 0xbb, 0x0b, 0x3a, 0xf2, 0xd6, 0x9a, 0x93, 0xdb, 0xd8, 0x48, 0x12, 0x04, 0x7f, 0x39, 0x97, 0x2e, 0xf7, 0x21, 0xa4, 0xe1, 0x8c, 0x76, 0x7c, + 0xb0, 0x44, 0x99, 0xe6, 0x72, 0xc8, 0xd9, 0x79, 0x1d, 0xc9, 0x04, 0xd0, 0x2a, 0x67, 0x2e, 0xbd, 0x1f, 0xc2, 0x00, 0x8c, 0x1d, 0x4e, 0x7c, 0xba, 0xfb, 0xa2, 0xae, 0xd7, 0xd9, 0xd2, 0x88, 0x83, + 0x3c, 0x3f, 0xbc, 0xeb, 0x27, 0x5a, 0x11, 0x84, 0xdc, 0x13, 0x99, 0x46, 0xb5, 0x29, 0xa3, 0x0e, 0x0d, 0xf5, 0x18, 0xfb, 0x54, 0x8f, 0xe4, 0x46, 0x88, 0x21, 0xa1, 0x52, 0x76, 0xcf, 0x54, 0xe7, + 0xc6, 0xd8, 0x0a, 0x4f, 0xcc, 0xea, 0x7a, 0x79, 0x35, 0xe5, 0x89, 0xe7, 0x55, 0x01, 0xaf, 0x39, 0x90, 0x84, 0x2d, 0xc1, 0xa6, 0xe6, 0xb2, 0x9b, 0xbe, 0x47, 0xe8, 0x54, 0x84, 0xab, 0x0f, 0xa2, + 0x70, 0xc7, 0x82, 0x75, 0x82, 0x33, 0x3e, 0xd7, 0x2b, 0x7f, 0xdb, 0x3e, 0xe9, 0x5e, 0xc9, 0x0a, 0xc7, 0x0b, 0x3e, 0x2d, 0x1e, 0xed, 0x08, 0xf6, 0xbc, 0xcc, 0x4e, 0x84, 0x14, 0x4d, 0x90, 0xae, + 0x4b, 0xba, 0x8b, 0x08, 0x15, 0x79, 0xe0, 0x0e, 0xd4, 0x9c, 0x3b, 0x45, 0x35, 0xb8, 0x51, 0xb3, 0xde, 0x91, 0x9c, 0xa1, 0x17, 0x4a, 0xc5, 0xc4, 0x6e, 0xf8, 0x36, 0xcf, 0xf3, 0xf3, 0xf8, 0x6c, + 0x30, 0x24, 0x0a, 0xd3, 0x9d, 0x7e, 0x5e, 0x88, 0x7b, 0x99, 0xd6, 0xb4, 0x78, 0x7e, 0x2c, 0x48, 0x1e, 0xdb, 0x6e, 0xe5, 0x55, 0x15, 0x92, 0xa6, 0xd6, 0x13, 0x2a, 0x07, 0x34, 0x1d, 0x1b, 0x56, + 0x7e, 0xbd, 0x00, 0xac, 0xd1, 0xa8, 0x82, 0x1a, 0x23, 0xcb, 0xb0, 0xea, 0x74, 0x79, 0x17, 0xf2, 0x92, 0x5c, 0xde, 0xea, 0x64, 0x01, 0xee, 0x5d, 0x84, 0x0f, 0x17, 0x14, 0x54, 0x72, 0x3e, 0x88, + 0x0a, 0xea, 0xc4, 0x21, 0xe9, 0x65, 0xf0, 0x3c, 0xb3, 0x30, 0xf8, 0x9f, 0x60, 0x39, 0xf0, 0x4f, 0x8e, 0x56, 0xbf, 0xc6, 0x72, 0x0c, 0x95, 0xca, 0x61, 0xad, 0x07, 0x73, 0x1d, 0x92, 0x34, 0x12, + 0xe6, 0x4e, 0x79, 0xcf, 0xc7, 0xf3, 0x6d, 0x09, 0xaa, 0xf6, 0xbb, 0x7a, 0xfa, 0x7f, 0xb1, 0x9c, 0x2f, 0x9e, 0xa8, 0x39, 0x1d, 0x7c, 0xc4, 0x63, 0xb3, 0x0b, 0x67, 0xd4, 0xc3, 0x35, 0x3a, 0xd8, + 0x8c, 0xca, 0xb6, 0x96, 0x3c, 0xf9, 0x9a, 0x22, 0x65, 0x08, 0xfd, 0xfd, 0x29, 0xd3, 0xa9, 0x17, 0x7e, 0xa2, 0xfe, 0x94, 0x61, 0xb3, 0x01, 0x56, 0x64, 0xcc, 0x64, 0xa1, 0xe8, 0x68, 0x5f, 0x61, + 0x04, 0x4a, 0x53, 0x10, 0x34, 0x78, 0x25, 0x9d, 0x6d, 0x66, 0x05, 0x16, 0x0f, 0x18, 0xaf, 0x1e, 0x2b, 0x1a, 0x50, 0xc7, 0x60, 0xfa, 0xa8, 0xec, 0xe1, 0x0c, 0xa6, 0xc4, 0x0d, 0x74, 0x93, 0x97, + 0x18, 0xe3, 0x95, 0xf7, 0x98, 0x3d, 0xc9, 0xe3, 0x2c, 0x6e, 0x2d, 0xdc, 0x17, 0xdd, 0x3c, 0x08, 0x1a, 0xe8, 0xcb, 0xc6, 0x33, 0xb3, 0x28, 0xe5, 0x6a, 0xe1, 0x93, 0x8c, 0x4c, 0xc5, 0x55, 0x01, + 0xbd, 0x69, 0xa0, 0x60, 0x5b, 0x8a, 0x7d, 0xbf, 0xb0, 0xe7, 0xad, 0x9b, 0x9b, 0x41, 0x07, 0xb9, 0x5e, 0x40, 0x45, 0x42, 0xd4, 0x74, 0xac, 0x94, 0x94, 0x13, 0x73, 0xaa, 0x29, 0x06, 0x76, 0x8a, + 0xde, 0x70, 0x4d, 0xb5, 0x6a, 0xe7, 0x80, 0xe1, 0xfb, 0xd2, 0x57, 0x40, 0x5c, 0xf9, 0x49, 0x61, 0x86, 0xa8, 0x4a, 0xb4, 0x80, 0x40, 0xab, 0x6d, 0xf2, 0x1a, 0x4b, 0xa6, 0xde, 0x12, 0xff, 0x80, + 0x2f, 0x25, 0xa0, 0xb2, 0x25, 0xd0, 0x0f, 0x48, 0x22, 0xc5, 0xee, 0xe8, 0x79, 0x35, 0x64, 0x2a, 0xa9, 0xf8, 0xe4, 0x20, 0x6a, 0x2c, 0xa3, 0x61, 0x28, 0x1b, 0x73, 0x9e, 0x42, 0x9a, 0xe4, 0x5a, + 0x40, 0xda, 0xa8, 0x21, 0xac, 0x40, 0xff, 0x04, 0x87, 0xa7, 0x42, 0xc1, 0x39, 0x7f, 0xcd, 0x56, 0xb3, 0xc5, 0xf7, 0x4c, 0x0a, 0xa2, 0x00, 0xeb, 0x82, 0x73, 0xf8, 0x7d, 0xd5, 0x99, 0x8c, 0x32, + 0x5d, 0x7d, 0x4f, 0x75, 0x35, 0xac, 0x14, 0x6f, 0xa1, 0xe4, 0x55, 0x36, 0xa0, 0xa3, 0x9e, 0x3f, 0x8b, 0x79, 0x28, 0xb3, 0xa4, 0x8d, 0x27, 0x59, 0xf2, 0xd3, 0x2a, 0xbf, 0x4f, 0x53, 0x3b, 0x01, + 0xdd, 0x12, 0xb0, 0x5c, 0x7d, 0x95, 0x4f, 0x87, 0xd5, 0x0a, 0x8c, 0x2b, 0x7c, 0x9d, 0x24, 0xb7, 0x3a, 0xf7, 0xb1, 0x91, 0x86, 0x92, 0xdc, 0x08, 0x21, 0xc4, 0x1c, 0x66, 0xbe, 0x7a, 0xa8, 0x52, + 0x96, 0x9e, 0xb5, 0x57, 0x29, 0x45, 0x2d, 0x70, 0x62, 0xf0, 0x3c, 0x39, 0x79, 0xff, 0x44, 0xa5, 0x80, 0xbf, 0xcb, 0x57, 0x74, 0x86, 0xfe, 0x39, 0xaa, 0x18, 0xa0, 0x55, 0x03, 0xfe, 0x48, 0x3a, + 0x1c, 0x65, 0x40, 0xfd, 0xf9, 0x7c, 0xcc, 0xdc, 0x0a, 0x25, 0x08, 0x14, 0xb4, 0xf9, 0x96, 0xb2, 0xd8, 0xc7, 0xcb, 0x40, 0x71, 0x38, 0x5c, 0xa4, 0xab, 0xba, 0xc0, 0xc3, 0x59, 0x18, 0xf7, 0xf0, + 0xa6, 0x4c, 0x3b, 0xb5, 0x8b, 0x34, 0x9c, 0x90, 0xd3, 0xc0, 0xc2, 0x0b, 0x58, 0x54, 0xd6, 0xa5, 0x9a, 0x36, 0x8e, 0x93, 0x81, 0xb8, 0x69, 0xb8, 0xe4, 0x43, 0x54, 0xfa, 0x99, 0x4c, 0x8c, 0xaf, + 0x68, 0xfe, 0xa9, 0x48, 0x44, 0x9c, 0x43, 0x0b, 0x5c, 0xf9, 0x27, 0x34, 0xdc, 0xc5, 0xa9, 0x8c, 0xac, 0x23, 0x9c, 0xa4, 0x88, 0x62, 0x4e, 0x5b, 0x10, 0xf0, 0x18, 0x6c, 0xa7, 0x57, 0xd1, 0x62, + 0x6c, 0x66, 0x1f, 0xb0, 0x7b, 0x99, 0x77, 0x91, 0xc6, 0xc2, 0xe7, 0x7d, 0x3f, 0x76, 0x16, 0x88, 0x24, 0x27, 0x5f, 0x99, 0x20, 0xa2, 0x04, 0xcb, 0x15, 0x6b, 0x32, 0x85, 0xf1, 0xec, 0xf4, 0x14, + 0xd6, 0x40, 0x6c, 0x36, 0x73, 0xaf, 0x15, 0x9c, 0x30, 0xb0, 0x7e, 0x36, 0x2c, 0xe9, 0x72, 0xc5, 0x4e, 0xba, 0x39, 0x5c, 0x04, 0xc7, 0xc2, 0x18, 0xe7, 0x38, 0x24, 0x96, 0x62, 0x31, 0x1c, 0x94, + 0xb6, 0x4b, 0x1a, 0x19, 0x05, 0x89, 0xf7, 0x9b, 0x09, 0xa0, 0x7e, 0x47, 0xc5, 0x05, 0x44, 0x7b, 0x93, 0x8f, 0xce, 0xaf, 0x78, 0x5d, 0xc9, 0xf1, 0x41, 0xe7, 0x8f, 0xf4, 0xaf, 0xb0, 0x9c, 0x1f, + 0xd6, 0x6f, 0xd5, 0xf4, 0xaf, 0xd8, 0xfd, 0xc7, 0x89, 0xed, 0xff, 0xfc, 0xbf, 0xfe, 0xc6, 0x44, 0xe1, 0xb7, 0x3f, 0x7f, 0x87, 0xed, 0xfc, 0xfb, 0x0b, 0xb6, 0x5f, 0x3f, 0xea, 0xea, 0xbc, 0xdd, + 0x19, 0x9a, 0xfa, 0x3b, 0xf1, 0xfe, 0xb7, 0xe9, 0x17, 0xfb, 0x4f, 0xe3, 0x21, 0x3c, 0x4f, 0x3b, 0x85, 0x86, 0x76, 0xbf, 0x66, 0x1e, 0x19, 0x7a, 0x74, 0x38, 0xd7, 0xdb, 0xb2, 0x6f, 0xc8, 0xb8, + 0xc8, 0x7c, 0xb7, 0x85, 0x17, 0x76, 0xaa, 0x1c, 0xdd, 0x7f, 0x6f, 0x45, 0x91, 0x60, 0xbd, 0x8b, 0xec, 0x5f, 0x44, 0xfc, 0x3e, 0x0e, 0x7d, 0xcb, 0xd8, 0xe2, 0x5b, 0x14, 0x98, 0x7b, 0x22, 0x7a, + 0x43, 0xe8, 0x1f, 0x6b, 0x26, 0x7a, 0x17, 0x90, 0x04, 0xda, 0x69, 0x38, 0x34, 0xfa, 0xfd, 0x1f, 0x35, 0xb6, 0x6a, 0x54, 0x9b, 0xbe, 0x34, 0x8e, 0xc6, 0x65, 0xfe, 0x77, 0x1f, 0x52, 0xbe, 0x6c, + 0xa6, 0x4f, 0x50, 0xb9, 0x0c, 0x03, 0x0f, 0x8a, 0x45, 0xea, 0x8a, 0x83, 0x4f, 0x17, 0xb1, 0x0c, 0x9c, 0x22, 0x6e, 0x09, 0x24, 0x08, 0xbe, 0xe4, 0x0e, 0xff, 0xe5, 0x9f, 0xbf, 0x2e, 0x9d, 0x3e, + 0xb5, 0x8f, 0xf5, 0xe3, 0xd3, 0x7f, 0x90, 0x88, 0xff, 0xce, 0x68, 0x0e, 0xac, 0x4f, 0x82, 0x60, 0xa5, 0xf9, 0xe3, 0xcd, 0x2c, 0x5c, 0x66, 0xa1, 0x6f, 0x2e, 0x08, 0xdf, 0xe6, 0x69, 0xb4, 0x87, + 0x7e, 0xd3, 0xa8, 0xe6, 0xa4, 0x97, 0xee, 0xb8, 0xbf, 0x8c, 0xd3, 0xa0, 0x4f, 0xad, 0xf9, 0x7a, 0x0d, 0xfe, 0x7a, 0xad, 0xf9, 0xeb, 0xfd, 0xfa, 0x3a, 0x37, 0xf3, 0x7f, 0xb5, 0x5f, 0x5f, 0xb6, + 0x0b, 0xf8, 0x5f, 0xed, 0xd7, 0x97, 0xed, 0x02, 0xfe, 0x57, 0xfb, 0x55, 0x96, 0x7c, 0x0d, 0xfc, 0x33, 0xd7, 0x08, 0xf6, 0x59, 0xbd, 0xa2, 0x0b, 0xc1, 0x31, 0x2d, 0x7e, 0xa8, 0xd1, 0xd3, 0xa1, + 0x99, 0x0f, 0x9a, 0x4c, 0xda, 0x5c, 0x7b, 0xa6, 0x35, 0x2b, 0x48, 0x2f, 0x18, 0xbe, 0xf4, 0x7a, 0x03, 0xe0, 0x1e, 0xb3, 0x79, 0x42, 0xdd, 0xa1, 0x19, 0xaa, 0x1f, 0xbb, 0x08, 0x17, 0x18, 0x74, + 0x2c, 0x17, 0x4b, 0xd3, 0x35, 0x32, 0xb4, 0x5d, 0xb9, 0xea, 0x12, 0x44, 0xcb, 0x73, 0x30, 0xe3, 0x91, 0xa5, 0x69, 0xde, 0xcd, 0x17, 0xad, 0x18, 0xfa, 0x99, 0xb4, 0xbd, 0x2b, 0x4d, 0x47, 0xa4, + 0xdc, 0xd9, 0x31, 0xa7, 0xe2, 0x7e, 0x31, 0x82, 0x3e, 0xb8, 0x01, 0x49, 0x2a, 0x3c, 0x58, 0xf6, 0xf5, 0x94, 0x15, 0xa1, 0xe5, 0x7e, 0x0d, 0xf5, 0xf3, 0xe5, 0x55, 0x4d, 0xcb, 0x2e, 0x49, 0x63, + 0x5b, 0x24, 0xd1, 0x5e, 0xee, 0xc0, 0x1b, 0xcf, 0x22, 0x7f, 0xc0, 0x16, 0xe5, 0x11, 0xc4, 0xf1, 0x14, 0x09, 0x36, 0x4f, 0xe4, 0x27, 0x0b, 0x07, 0xb5, 0xab, 0x94, 0xbe, 0x56, 0xe9, 0xe9, 0x0b, + 0xad, 0xfc, 0x23, 0x55, 0x5d, 0x60, 0x01, 0x95, 0x18, 0x67, 0xf3, 0x78, 0xb8, 0x9c, 0xe0, 0xdc, 0x6e, 0xb3, 0xbf, 0x7c, 0x16, 0x23, 0x6f, 0xf6, 0xe4, 0x03, 0xa1, 0x51, 0xb2, 0x27, 0xd3, 0x2f, + 0x13, 0x1f, 0x3d, 0x3e, 0x6c, 0x8f, 0xcb, 0x06, 0x02, 0x26, 0x30, 0xc3, 0x47, 0xe6, 0x9e, 0xbf, 0x19, 0x02, 0x84, 0x5d, 0xf8, 0x91, 0xbe, 0x77, 0x33, 0x78, 0x19, 0xd1, 0x67, 0xe6, 0xb1, 0x0b, + 0x70, 0x44, 0x05, 0x7d, 0xce, 0xc5, 0x88, 0x27, 0x0b, 0xb4, 0x33, 0xfd, 0x6b, 0xfe, 0x9c, 0x16, 0x4e, 0x64, 0x8f, 0xd5, 0x33, 0x4e, 0xed, 0x7a, 0x75, 0x49, 0x4a, 0x1d, 0x6f, 0x66, 0x7e, 0x62, + 0x9f, 0x75, 0x58, 0xc7, 0x37, 0xd4, 0xc4, 0xfe, 0x1e, 0xb6, 0xa7, 0x8e, 0x09, 0xf5, 0x12, 0x71, 0xa6, 0x4d, 0x83, 0x35, 0xd2, 0x44, 0x56, 0xa3, 0xa8, 0xd6, 0x09, 0xfc, 0xd6, 0x35, 0xe2, 0x0f, + 0x5d, 0x8c, 0xfe, 0xc4, 0xc1, 0xfe, 0xd7, 0xe5, 0x07, 0x6b, 0x4a, 0xeb, 0xe8, 0x09, 0x40, 0x0c, 0xb1, 0x17, 0x79, 0x4a, 0xc4, 0x9e, 0xe4, 0x26, 0x32, 0x52, 0xb4, 0x8c, 0xd2, 0x4f, 0x7f, 0x36, + 0xff, 0xd1, 0xe4, 0xe9, 0x3c, 0x22, 0xb3, 0x6e, 0x89, 0x91, 0xdc, 0x21, 0xeb, 0x26, 0x2c, 0x9c, 0xea, 0xd0, 0xf8, 0x50, 0xfc, 0xcc, 0x7d, 0x8d, 0x47, 0x40, 0x1d, 0x68, 0xd6, 0xcc, 0xbf, 0x2d, + 0xca, 0x7a, 0x83, 0x8d, 0xd3, 0xce, 0xc7, 0x5b, 0xa5, 0x1c, 0x94, 0xd5, 0x26, 0x1b, 0x9c, 0x04, 0xd2, 0x7c, 0x79, 0x0a, 0xe1, 0x8a, 0x78, 0x1c, 0x6a, 0xf7, 0x35, 0xce, 0xbe, 0x5a, 0xd3, 0x52, + 0x3c, 0xfb, 0x7e, 0xb7, 0x31, 0x15, 0xfc, 0x38, 0x5f, 0x1d, 0xdf, 0x44, 0xf5, 0xce, 0xaf, 0x56, 0x85, 0x1c, 0x63, 0x04, 0x58, 0x6d, 0x71, 0x3f, 0xc1, 0xac, 0x39, 0x5c, 0x5a, 0x30, 0xd5, 0xc0, + 0x5e, 0x41, 0x1b, 0xee, 0x9b, 0x18, 0x9c, 0xc2, 0x0a, 0xa9, 0x69, 0xcb, 0x63, 0xd8, 0x2d, 0xad, 0x50, 0x32, 0xd6, 0xef, 0xf3, 0xf1, 0x8a, 0xdd, 0x18, 0xd1, 0x6d, 0x25, 0x58, 0x26, 0x6a, 0xe6, + 0xe0, 0x05, 0x11, 0x91, 0x1d, 0x2e, 0x74, 0x84, 0x23, 0x21, 0xa2, 0xe6, 0xca, 0x1a, 0x18, 0xfc, 0xcb, 0xe9, 0x17, 0x93, 0xda, 0x31, 0x39, 0x89, 0x9c, 0x47, 0xcf, 0xc1, 0xc8, 0x04, 0x1a, 0xfe, + 0x25, 0xa4, 0x13, 0x3c, 0xa7, 0x31, 0xf9, 0xce, 0x58, 0xfe, 0x69, 0x8c, 0x62, 0x3a, 0x33, 0xba, 0xe1, 0x28, 0xd8, 0x7e, 0x63, 0xd6, 0x40, 0x6f, 0xed, 0x10, 0x8d, 0x15, 0x09, 0xb2, 0x09, 0x7b, + 0x33, 0x18, 0x42, 0x4a, 0x69, 0x05, 0xbd, 0x1f, 0xc0, 0x2e, 0x1a, 0xf1, 0xb5, 0x04, 0xac, 0xa4, 0x0d, 0x52, 0x53, 0x90, 0x04, 0xdf, 0x95, 0x32, 0x3e, 0x87, 0x14, 0x21, 0x8d, 0x8b, 0xb3, 0x6f, + 0x5c, 0xb7, 0x60, 0xda, 0x5b, 0xec, 0x25, 0x4f, 0x32, 0xda, 0x94, 0x54, 0x1d, 0x10, 0xe6, 0xcd, 0x99, 0xf1, 0x5c, 0x3a, 0x6b, 0x48, 0x26, 0x11, 0x95, 0x31, 0xa0, 0xa0, 0x12, 0xff, 0x28, 0x30, + 0x75, 0x1a, 0x40, 0x8e, 0x7d, 0xe4, 0x04, 0x5b, 0x05, 0xea, 0x6f, 0x06, 0x74, 0xfc, 0x43, 0x38, 0xe1, 0xd9, 0x7f, 0x70, 0x46, 0xfc, 0xf1, 0xf3, 0x77, 0x80, 0xc2, 0x3e, 0x1c, 0x96, 0xa5, 0xc7, + 0x1f, 0xb2, 0x70, 0x9d, 0x56, 0xe3, 0x57, 0x6e, 0xb7, 0x5f, 0xcf, 0x88, 0xae, 0xce, 0x5a, 0x0f, 0xe7, 0xf7, 0xe5, 0xd2, 0xfd, 0xfe, 0x7d, 0xa0, 0x04, 0x7e, 0x1d, 0x29, 0xff, 0xaf, 0x81, 0x12, + 0xf8, 0x75, 0xa4, 0xfc, 0xe3, 0x40, 0xc9, 0x5f, 0xff, 0x34, 0x50, 0x02, 0xbf, 0x8e, 0x94, 0xb9, 0xc3, 0xdf, 0x1a, 0xc7, 0x7f, 0x0f, 0x94, 0xd3, 0xbf, 0x0d, 0x94, 0xc0, 0xd7, 0x48, 0xe9, 0x6a, + 0xe7, 0x7f, 0x2b, 0x3b, 0xf2, 0x69, 0x70, 0x3c, 0xac, 0x35, 0xee, 0xad, 0x77, 0x5f, 0x2b, 0x3b, 0xe8, 0xf7, 0x6b, 0xba, 0xf3, 0xf5, 0xda, 0x51, 0x26, 0xe4, 0x1f, 0xb4, 0x84, 0x86, 0x07, 0x20, + 0x7c, 0xaf, 0x9f, 0x1e, 0xb0, 0x90, 0x0c, 0xdf, 0x8e, 0xaf, 0xaf, 0x6f, 0x3d, 0xa1, 0x9b, 0x66, 0x97, 0x87, 0x52, 0x7e, 0xef, 0x4b, 0xa3, 0x9c, 0xc8, 0x77, 0xcb, 0x0c, 0xcd, 0xd0, 0x57, 0xff, + 0xe3, 0xb6, 0xb7, 0xa4, 0xf7, 0xa0, 0x6f, 0xd3, 0xe0, 0x85, 0x05, 0x78, 0x05, 0x56, 0x97, 0xf6, 0xf0, 0xad, 0x39, 0xed, 0xa1, 0x7f, 0x6f, 0x68, 0xbb, 0xe9, 0x31, 0xbc, 0xda, 0x6f, 0xa3, 0x4d, + 0x6a, 0xe6, 0x77, 0x1f, 0xf2, 0xe5, 0x6e, 0xa2, 0x9e, 0xba, 0x64, 0x51, 0x80, 0x33, 0xb1, 0xda, 0xd3, 0xbe, 0x7b, 0x46, 0xbe, 0x59, 0x02, 0x59, 0xa0, 0x77, 0xb2, 0x48, 0x6d, 0x89, 0xd4, 0x9e, + 0x5f, 0xb0, 0xf2, 0x7b, 0xf1, 0x56, 0x6d, 0x7f, 0x7c, 0xfa, 0x8f, 0x5a, 0x54, 0x14, 0x28, 0x50, 0xec, 0x47, 0x9f, 0x10, 0x11, 0xa0, 0xd8, 0xa7, 0x36, 0x99, 0xff, 0xf1, 0x66, 0x50, 0x6e, 0xd3, + 0x2b, 0x20, 0xf3, 0x1e, 0xa7, 0x39, 0x0c, 0xf2, 0xe5, 0xc4, 0xce, 0x5c, 0x93, 0x68, 0x6b, 0x18, 0x45, 0x97, 0xbc, 0xc8, 0xd8, 0x1b, 0xc3, 0xd0, 0x74, 0x4d, 0x23, 0x32, 0xcd, 0xc8, 0xa6, 0x73, + 0x65, 0xec, 0x33, 0x71, 0x05, 0x02, 0xeb, 0x6f, 0xf3, 0x09, 0x7b, 0x45, 0x54, 0xca, 0xb1, 0xf2, 0xb6, 0x92, 0xda, 0xef, 0x24, 0x8c, 0x68, 0xd8, 0xa2, 0x90, 0x2e, 0x80, 0x5e, 0xfc, 0x62, 0x7c, + 0x47, 0x09, 0x1c, 0x2e, 0xa2, 0x18, 0x46, 0x6f, 0xf7, 0x64, 0x56, 0xe6, 0x32, 0x87, 0x31, 0xe6, 0x30, 0xd8, 0x4d, 0xa3, 0xd0, 0x3d, 0xa9, 0xeb, 0xa3, 0x0d, 0xcf, 0xc1, 0xd4, 0x08, 0xe4, 0xe1, + 0xb3, 0x05, 0xde, 0x10, 0x12, 0x93, 0xe9, 0x13, 0x3c, 0x64, 0x4f, 0x42, 0x19, 0x82, 0xd3, 0xb3, 0xb8, 0xa9, 0x0e, 0x61, 0xbe, 0x00, 0xa8, 0x5c, 0xaf, 0x61, 0xb5, 0x93, 0x98, 0x9b, 0xd0, 0x64, + 0x55, 0x67, 0x35, 0x9e, 0xfe, 0x47, 0x32, 0x9e, 0xef, 0x2a, 0x1e, 0xc9, 0xfc, 0xfa, 0xb7, 0x06, 0xc3, 0x84, 0x3c, 0x20, 0xbc, 0xb2, 0x06, 0x3f, 0xe7, 0xac, 0xc9, 0x5b, 0xf9, 0xd3, 0xf9, 0xdc, + 0xc7, 0x60, 0x26, 0x97, 0x17, 0x3a, 0xde, 0x55, 0x14, 0x8d, 0x1e, 0x45, 0x96, 0xfd, 0x76, 0xeb, 0x0c, 0xad, 0x71, 0x34, 0x92, 0xd2, 0x9a, 0x68, 0xb2, 0x9a, 0x28, 0xe0, 0x88, 0xe1, 0xb1, 0x16, + 0x45, 0xa6, 0x73, 0x67, 0x44, 0x02, 0x11, 0xed, 0x92, 0x84, 0x56, 0xc0, 0x7e, 0x8a, 0x2e, 0x64, 0x1a, 0x72, 0x96, 0xdb, 0x7a, 0x1d, 0xdb, 0x6a, 0x06, 0x25, 0x79, 0xe2, 0x4b, 0x3b, 0xbd, 0x07, + 0xc4, 0x9a, 0x81, 0x1a, 0xd8, 0x12, 0x20, 0x38, 0x0d, 0xfd, 0xe7, 0x90, 0x0f, 0x1f, 0x1f, 0x82, 0xca, 0x49, 0xc5, 0x35, 0x58, 0x64, 0x30, 0x5f, 0x86, 0x1a, 0x9a, 0xdc, 0x47, 0x2e, 0x3d, 0x3f, + 0x18, 0xd6, 0xb3, 0x46, 0x45, 0x02, 0x6d, 0x5f, 0xad, 0x29, 0x55, 0xed, 0xca, 0x74, 0x54, 0xf4, 0x5c, 0x47, 0xeb, 0x15, 0x31, 0xfe, 0xe5, 0x95, 0xf3, 0xca, 0xc8, 0xe2, 0x86, 0x89, 0x7f, 0xd9, + 0x9d, 0x22, 0xb0, 0xf4, 0x7f, 0x78, 0xef, 0x3f, 0x96, 0x61, 0x38, 0xc0, 0xbf, 0x09, 0x2d, 0x42, 0xf3, 0x25, 0xb4, 0xa0, 0x3f, 0xd4, 0x18, 0xbc, 0xc8, 0xcf, 0xda, 0x1f, 0xfa, 0x15, 0x71, 0x8c, + 0xff, 0x53, 0x86, 0x87, 0x73, 0x1a, 0xfe, 0xd0, 0x58, 0xec, 0x97, 0xee, 0x89, 0xf2, 0x18, 0x4c, 0xa4, 0xfa, 0x24, 0x3d, 0x5f, 0x5a, 0x7d, 0xb7, 0x85, 0x3e, 0xde, 0xc4, 0xbe, 0xb0, 0xfc, 0xdd, + 0xc3, 0xfa, 0xab, 0xb6, 0x6b, 0x8e, 0xa3, 0x4f, 0xce, 0x6a, 0x75, 0xe6, 0xcb, 0x97, 0xd1, 0x97, 0x05, 0xe5, 0xed, 0xc0, 0xdf, 0x1b, 0x4b, 0xe5, 0xc3, 0xe0, 0x68, 0x4c, 0xe3, 0xb4, 0x2f, 0x2c, + 0xf1, 0xfc, 0xca, 0x0e, 0x9b, 0xf6, 0xd4, 0x1a, 0xed, 0xfc, 0x71, 0xad, 0xf9, 0xe3, 0x15, 0x02, 0xdf, 0x97, 0xf8, 0xbf, 0x58, 0x21, 0xf0, 0x7d, 0x89, 0xbf, 0x5e, 0xe1, 0x3f, 0xcf, 0x47, 0x71, + 0x41, 0xe0, 0xef, 0x3a, 0xcf, 0x91, 0x05, 0xe3, 0x0d, 0x1e, 0xc0, 0xb8, 0x10, 0xba, 0x98, 0xc4, 0xd2, 0xb3, 0x9b, 0x21, 0x58, 0xe8, 0xb3, 0x85, 0x96, 0xa0, 0xac, 0x85, 0x93, 0x17, 0x5e, 0x81, + 0xeb, 0x5b, 0x87, 0xb0, 0x28, 0x5e, 0xec, 0x22, 0x86, 0xe0, 0x23, 0xc5, 0x7e, 0x1c, 0xc9, 0xb1, 0xb1, 0x4d, 0x44, 0x85, 0xda, 0xac, 0x91, 0xf5, 0x3c, 0x51, 0xa8, 0xc7, 0x7e, 0x5e, 0x8e, 0xfc, + 0x71, 0xdc, 0x61, 0xe6, 0x00, 0xa2, 0x26, 0xf2, 0x05, 0xe5, 0xbb, 0x23, 0xef, 0xb2, 0x77, 0xfe, 0xac, 0x5e, 0xcf, 0x37, 0xaa, 0x36, 0xb7, 0x22, 0x9f, 0xf0, 0x34, 0x9d, 0x48, 0xf5, 0x01, 0xa5, + 0x9b, 0x50, 0x39, 0xcf, 0xd2, 0x48, 0xef, 0x46, 0xe5, 0x5d, 0xf2, 0x8d, 0xe0, 0xa9, 0x0c, 0x38, 0x18, 0x19, 0xad, 0x27, 0x33, 0x9a, 0xbb, 0x5a, 0xf6, 0x74, 0xe1, 0x0a, 0x8a, 0x73, 0x3a, 0xb0, + 0x09, 0x8f, 0xc7, 0x9b, 0x7a, 0x56, 0x57, 0x0b, 0x95, 0x30, 0x1b, 0x8c, 0x15, 0xdb, 0x39, 0x2b, 0x21, 0xca, 0x12, 0x08, 0x3e, 0x91, 0x0f, 0x5b, 0xb0, 0x53, 0xbb, 0x9a, 0xce, 0xe3, 0x24, 0xad, + 0xf2, 0x43, 0x54, 0x51, 0xf4, 0xe2, 0x2c, 0x45, 0x9c, 0x4a, 0x11, 0x7e, 0xd6, 0x32, 0x54, 0xea, 0x57, 0xde, 0xbc, 0xea, 0x67, 0x5f, 0xe9, 0x49, 0x7d, 0xf9, 0x40, 0x14, 0xec, 0xaa, 0x5f, 0xcc, + 0x17, 0xb6, 0xa2, 0x9b, 0xc6, 0xde, 0xc4, 0xcd, 0xc7, 0xcb, 0x29, 0xbe, 0xe7, 0x04, 0x25, 0x11, 0xf5, 0xb6, 0x6e, 0xfe, 0x63, 0x81, 0x28, 0x79, 0xf4, 0xc3, 0x2e, 0x5c, 0x81, 0xc7, 0x74, 0x7e, + 0x48, 0x7d, 0x16, 0x2c, 0xcb, 0xb5, 0x1e, 0xe4, 0x44, 0x79, 0x82, 0xbb, 0xf0, 0x71, 0xe4, 0x4d, 0x91, 0xfb, 0xad, 0x4b, 0x00, 0xe7, 0x9d, 0x54, 0x04, 0x52, 0x58, 0x46, 0x66, 0x04, 0x3e, 0xaa, + 0xd7, 0xa2, 0x5b, 0xae, 0xd5, 0x79, 0x88, 0x0f, 0xd4, 0x0e, 0x65, 0xbe, 0xbb, 0x49, 0x3a, 0xb0, 0x45, 0x42, 0x2c, 0x47, 0x22, 0x4d, 0x52, 0xdd, 0x90, 0xe3, 0xa4, 0x8b, 0xe1, 0xa6, 0x81, 0xc2, + 0xf5, 0xe8, 0x6a, 0xb4, 0x06, 0x1f, 0x46, 0xf5, 0xd8, 0x84, 0x5b, 0xe9, 0x5c, 0xaa, 0x00, 0x3e, 0x17, 0x82, 0xcb, 0xe2, 0xfe, 0x8e, 0x29, 0x14, 0xe6, 0x0a, 0x9b, 0x5d, 0x41, 0xfb, 0x8a, 0x6a, + 0xcc, 0x54, 0xdf, 0x71, 0xe0, 0x0f, 0x9b, 0x2f, 0x8c, 0x24, 0x23, 0xda, 0xf0, 0x92, 0x0c, 0x24, 0xee, 0xd3, 0x51, 0x5b, 0x1e, 0x22, 0x57, 0x92, 0xba, 0xde, 0xae, 0xd0, 0x75, 0x8e, 0x79, 0xab, + 0x3f, 0x5a, 0xff, 0x9e, 0xc6, 0x35, 0x56, 0x49, 0x15, 0x28, 0x7d, 0xf7, 0x99, 0x6a, 0x62, 0x32, 0xbb, 0xf0, 0xea, 0x69, 0xe3, 0xf4, 0x72, 0x37, 0x41, 0x24, 0x0c, 0x1a, 0x1f, 0x18, 0x81, 0xf3, + 0xd7, 0x5c, 0x2f, 0x18, 0xd0, 0x20, 0xea, 0x14, 0xa7, 0xad, 0xa3, 0xb6, 0xe4, 0xae, 0xa5, 0x46, 0xb5, 0xb7, 0x95, 0x32, 0xee, 0xf5, 0xd2, 0x19, 0x42, 0xb1, 0xe7, 0x9f, 0x54, 0xf9, 0x84, 0x32, + 0x5f, 0x1e, 0x3b, 0xa0, 0xca, 0x5e, 0x52, 0x64, 0x61, 0x6b, 0xb3, 0x24, 0xc5, 0xba, 0x24, 0x55, 0x81, 0x8d, 0xbc, 0x6c, 0xb9, 0x9f, 0xec, 0x4d, 0x3f, 0x06, 0x85, 0xcd, 0x38, 0x96, 0x38, 0xeb, + 0x06, 0x8f, 0xa7, 0xf2, 0x50, 0xa4, 0xa5, 0xf0, 0xde, 0xea, 0x7b, 0xed, 0x48, 0x2d, 0xd7, 0xdf, 0x23, 0xf6, 0x30, 0x4b, 0x03, 0x23, 0x99, 0x4c, 0xc5, 0xde, 0x96, 0xd7, 0xcf, 0x0a, 0xb0, 0x4e, + 0x95, 0xeb, 0x5e, 0x38, 0xa6, 0xf5, 0x29, 0x55, 0x0e, 0x14, 0x04, 0xbd, 0xf7, 0x6a, 0x2d, 0xbd, 0x72, 0x0b, 0xb8, 0xa4, 0x29, 0x77, 0x9c, 0x87, 0xab, 0x3d, 0xf5, 0x69, 0xd3, 0xad, 0x58, 0xfc, + 0x70, 0x79, 0x85, 0x40, 0xe5, 0x22, 0xba, 0x05, 0x0c, 0xc4, 0x43, 0xa1, 0xf9, 0x6e, 0xe3, 0x89, 0x68, 0x47, 0xe8, 0xd0, 0xc5, 0xb7, 0xea, 0xbd, 0xad, 0xf1, 0x22, 0x47, 0xfb, 0x25, 0xe3, 0x34, + 0x60, 0x8d, 0x52, 0xaa, 0x4e, 0xbf, 0xd6, 0x64, 0x42, 0xc6, 0xc5, 0x06, 0x99, 0x69, 0x14, 0x1a, 0xe5, 0x4d, 0xbc, 0xee, 0xbf, 0x37, 0x21, 0x01, 0xfe, 0xcc, 0xf3, 0x13, 0x03, 0xb1, 0x15, 0xb4, + 0x1b, 0x93, 0x25, 0xfc, 0xe7, 0x3a, 0xbd, 0xf8, 0xfd, 0x88, 0x27, 0x26, 0xbc, 0x9c, 0xc7, 0xf5, 0x3b, 0x55, 0xe6, 0x8f, 0xdc, 0x15, 0x40, 0xb3, 0x81, 0xb8, 0xf5, 0xfb, 0x5c, 0x91, 0x7b, 0x5e, + 0x36, 0xbd, 0xff, 0x2e, 0x18, 0xfe, 0x83, 0x6c, 0x7c, 0x7a, 0xbc, 0xf3, 0xc1, 0x5e, 0xdf, 0x5b, 0xcd, 0x80, 0xbb, 0x54, 0x5f, 0x37, 0x9e, 0x1f, 0x22, 0x7e, 0xdf, 0x30, 0xda, 0x6e, 0x94, 0x5b, + 0x23, 0xd0, 0xbe, 0x04, 0xb5, 0x91, 0x38, 0x79, 0x03, 0xae, 0xee, 0xf9, 0x36, 0xb1, 0x9a, 0x9a, 0x80, 0x3c, 0x5d, 0x68, 0xf9, 0x6a, 0x7a, 0xa9, 0xc9, 0x02, 0x3d, 0xec, 0xf9, 0x63, 0x88, 0xde, + 0x3a, 0x17, 0xaf, 0x11, 0xf9, 0x36, 0x4c, 0x33, 0x96, 0xcf, 0xa2, 0xd8, 0x10, 0x66, 0xc2, 0xe0, 0x72, 0x05, 0xdd, 0xf7, 0xc3, 0x99, 0xaa, 0xec, 0xd5, 0x18, 0xf7, 0xea, 0xf6, 0xec, 0xf5, 0xa1, + 0x93, 0xc9, 0xd9, 0x76, 0x28, 0x3e, 0x07, 0xea, 0x09, 0xba, 0x31, 0x80, 0xb1, 0xee, 0xd4, 0xaf, 0xb7, 0x64, 0x3a, 0x09, 0x7a, 0x49, 0xa6, 0x50, 0x71, 0xbd, 0x67, 0x64, 0xe1, 0xcb, 0x78, 0x9a, + 0xc3, 0xa3, 0x6c, 0xc2, 0x80, 0x21, 0x30, 0x46, 0x64, 0x6c, 0xde, 0x2e, 0x47, 0x1a, 0x04, 0x77, 0x17, 0x09, 0xe9, 0x8f, 0x3b, 0x42, 0x42, 0x1f, 0x91, 0xa0, 0xd9, 0xb7, 0xf3, 0x07, 0x1f, 0xc4, + 0x9e, 0x62, 0x58, 0x64, 0x11, 0x01, 0x1e, 0xdf, 0xde, 0xd5, 0xc0, 0x0b, 0x2b, 0xfb, 0xd0, 0x6b, 0x3f, 0xbc, 0xd5, 0x20, 0x72, 0xfb, 0x4a, 0xc2, 0x14, 0x70, 0xba, 0xde, 0xb8, 0x54, 0xde, 0x25, + 0x94, 0x90, 0x37, 0x1d, 0xcf, 0x09, 0x59, 0x07, 0xd6, 0xee, 0xec, 0x97, 0x2b, 0x38, 0xb9, 0x68, 0x8b, 0xc3, 0x23, 0x1a, 0xee, 0x93, 0x6f, 0xc9, 0xd9, 0x35, 0xf9, 0x6e, 0x29, 0xe5, 0x22, 0x00, + 0x18, 0x6e, 0xe6, 0xb4, 0x4e, 0x86, 0xb9, 0x2e, 0xc1, 0x3e, 0x19, 0x4c, 0x9d, 0xf2, 0xa2, 0xf3, 0x16, 0xe5, 0x5c, 0xe7, 0xf3, 0x12, 0x88, 0x68, 0xcc, 0xe0, 0xb9, 0x84, 0xb5, 0x5d, 0x66, 0x9e, + 0x04, 0x6c, 0xd4, 0x4f, 0x43, 0x27, 0x0a, 0x93, 0x76, 0x57, 0x4e, 0x0d, 0x72, 0xcd, 0x88, 0xf2, 0x77, 0xd9, 0xcd, 0x98, 0x9b, 0xfb, 0xca, 0xc8, 0x34, 0x03, 0x10, 0x4b, 0x54, 0xc6, 0xd6, 0x04, + 0x31, 0x42, 0xa9, 0xf1, 0x8e, 0xc3, 0x26, 0x5f, 0x42, 0xe6, 0xc4, 0x40, 0x39, 0x98, 0xa9, 0xb5, 0x14, 0xe2, 0x47, 0x5d, 0xdb, 0x4f, 0xed, 0x31, 0x15, 0x98, 0x23, 0x5b, 0xc3, 0x2e, 0xd9, 0x0e, + 0xc6, 0x21, 0x22, 0xc4, 0xee, 0x86, 0x82, 0x59, 0xae, 0xd4, 0xdd, 0x7c, 0xf5, 0xd2, 0xf1, 0xfe, 0xca, 0x5e, 0x72, 0x75, 0x01, 0x6f, 0x8e, 0x65, 0x98, 0x0f, 0x5f, 0x3f, 0xbb, 0x7e, 0x45, 0xaa, + 0x76, 0x93, 0x17, 0x55, 0xdf, 0xc2, 0x4b, 0xc2, 0xc4, 0x98, 0x4c, 0x2f, 0xbd, 0x90, 0x7d, 0xab, 0x29, 0xf9, 0x06, 0x1e, 0xb9, 0x23, 0x7c, 0x47, 0x8e, 0x6c, 0xf3, 0x7c, 0x66, 0xbe, 0x3e, 0x39, + 0xb8, 0xe3, 0xbe, 0x11, 0x4b, 0xf2, 0x0d, 0x3f, 0x73, 0xd1, 0xb7, 0x44, 0x5e, 0x1f, 0x03, 0xa0, 0x4d, 0x52, 0xa1, 0x54, 0xaf, 0x57, 0x1f, 0x29, 0x14, 0xfe, 0x7c, 0x85, 0xcc, 0xb1, 0x20, 0xca, + 0x23, 0x93, 0x73, 0x9f, 0x55, 0x0f, 0x2a, 0x75, 0x82, 0x77, 0x75, 0x99, 0x3a, 0xa5, 0x5e, 0xe4, 0x23, 0xa2, 0xe9, 0x91, 0x66, 0x4f, 0xd1, 0x43, 0xba, 0x48, 0xa0, 0xb1, 0x52, 0x1d, 0x90, 0xc2, + 0x84, 0x83, 0xfe, 0x9c, 0x64, 0x98, 0x4e, 0x4c, 0x94, 0x05, 0xf2, 0x96, 0x7b, 0x92, 0x30, 0xd5, 0x5a, 0xf8, 0xeb, 0xe5, 0x12, 0x3d, 0xe1, 0xa7, 0xf8, 0x1b, 0xcc, 0x68, 0xcf, 0x3d, 0xa4, 0x10, + 0x7d, 0xec, 0x11, 0x3e, 0x24, 0x3b, 0xc4, 0x1a, 0x84, 0xf1, 0xec, 0xf0, 0x85, 0x72, 0x59, 0x35, 0x45, 0x94, 0x11, 0x0f, 0xdf, 0x76, 0x13, 0x0c, 0x4e, 0xfb, 0xa2, 0xb3, 0x14, 0x92, 0xee, 0x47, + 0xb8, 0x3c, 0xd1, 0x65, 0xfb, 0x2b, 0x54, 0x37, 0x64, 0xdb, 0xe1, 0xff, 0xe3, 0xcb, 0x76, 0xae, 0xe6, 0xd7, 0x6f, 0x1d, 0x5e, 0x98, 0xff, 0xb0, 0xf4, 0xdf, 0x9d, 0x30, 0xfe, 0x0e, 0xfb, 0xb9, + 0xf5, 0x0b, 0xf6, 0x7f, 0xfe, 0x6b, 0x55, 0x97, 0xcd, 0x7c, 0xe9, 0x0e, 0xce, 0x51, 0x85, 0x99, 0xb8, 0x80, 0x65, 0x23, 0xee, 0x09, 0x7b, 0xfc, 0x61, 0xde, 0x8a, 0x59, 0x7f, 0xae, 0x41, 0x71, + 0x36, 0xf7, 0xdf, 0x16, 0x4b, 0xb6, 0xd2, 0x24, 0x0f, 0xea, 0x9c, 0xc8, 0x5d, 0xbb, 0xdc, 0xe1, 0x6b, 0x8d, 0xa5, 0xbf, 0x2b, 0xa6, 0x22, 0x07, 0xea, 0x1c, 0x8f, 0x77, 0x4b, 0xab, 0xa7, 0xe0, + 0xa4, 0xb7, 0xbe, 0x77, 0x4c, 0x0a, 0x49, 0x6f, 0xed, 0xe9, 0xa0, 0x77, 0x40, 0xc4, 0xf1, 0xa3, 0xc6, 0x86, 0xdf, 0xd9, 0x7f, 0xf1, 0xfd, 0x1f, 0x7e, 0xbc, 0xa1, 0xfd, 0x7b, 0xf3, 0x17, 0xb3, + 0x66, 0x38, 0xf3, 0x97, 0x71, 0x83, 0x3a, 0xc7, 0x7f, 0x1d, 0x51, 0xa8, 0x3b, 0xf4, 0x01, 0xfc, 0xe2, 0xef, 0x7d, 0x1b, 0xce, 0xf7, 0x8b, 0xfc, 0xa1, 0xdd, 0x42, 0xac, 0x89, 0xd0, 0x4f, 0xfe, + 0xde, 0xba, 0xac, 0x59, 0xbf, 0xf0, 0xca, 0xaf, 0x64, 0x3f, 0x0b, 0x6c, 0x4f, 0xef, 0x6c, 0xc4, 0xc3, 0x35, 0x5b, 0x3e, 0x64, 0xfa, 0x9b, 0x0d, 0xcd, 0x8b, 0x3f, 0xbb, 0xb7, 0xed, 0xe9, 0xae, + 0x65, 0x33, 0x62, 0x82, 0x7a, 0x5b, 0x24, 0x7e, 0xe7, 0xd3, 0x5f, 0x5e, 0x53, 0x57, 0x8a, 0x78, 0xed, 0xaf, 0x4e, 0x05, 0x1c, 0x7f, 0x52, 0xdf, 0xff, 0xfe, 0xc7, 0x1b, 0xca, 0x7c, 0xb6, 0x00, + 0xbf, 0x75, 0x83, 0xc9, 0x58, 0x99, 0xd7, 0x99, 0x5f, 0x3b, 0x69, 0xfd, 0x9d, 0x91, 0x16, 0xc2, 0xe4, 0xa8, 0xc4, 0x8f, 0xad, 0xba, 0xc6, 0x01, 0xb0, 0xa4, 0x73, 0x2d, 0xed, 0x2b, 0x65, 0x18, + 0x8f, 0x90, 0x4a, 0x64, 0xbc, 0xe7, 0xb1, 0x61, 0x63, 0x84, 0x2c, 0xa7, 0xe4, 0xae, 0x93, 0x6b, 0x56, 0xb0, 0xa3, 0x49, 0xbc, 0x45, 0x62, 0x12, 0x96, 0x4a, 0xb6, 0xf7, 0x90, 0x83, 0x9e, 0x85, + 0xbf, 0x8b, 0xa7, 0xbf, 0x59, 0x38, 0xdc, 0xc8, 0x8d, 0xfa, 0x10, 0x9c, 0x5b, 0xe9, 0x84, 0x40, 0x5a, 0xdf, 0xc0, 0x9c, 0x5c, 0x60, 0x05, 0x8d, 0x2f, 0x1b, 0xcf, 0xe2, 0xe9, 0x1d, 0xc9, 0x84, + 0x04, 0x13, 0x5c, 0x0a, 0x55, 0xcc, 0xfa, 0xc8, 0x85, 0x02, 0x66, 0xea, 0xb6, 0x46, 0xe5, 0xb7, 0x5d, 0xe5, 0xd5, 0x1a, 0xc0, 0x02, 0x6c, 0x82, 0xc4, 0x67, 0x40, 0x58, 0x23, 0x92, 0xc8, 0x12, + 0xc4, 0x28, 0x02, 0x4c, 0xe0, 0x15, 0x5d, 0xfc, 0x75, 0xdb, 0xb4, 0xae, 0x05, 0xa8, 0x87, 0xa4, 0x9a, 0x6e, 0x68, 0xa8, 0x81, 0x64, 0x6e, 0xf6, 0x9b, 0xbc, 0x42, 0xa1, 0x70, 0xf6, 0x6c, 0x47, + 0x89, 0x07, 0x3f, 0x07, 0x7a, 0xbb, 0x11, 0x19, 0xdb, 0xf4, 0x03, 0x02, 0x4b, 0x61, 0x56, 0x7c, 0x90, 0x61, 0x13, 0x72, 0xd5, 0xf5, 0xb3, 0x0b, 0xa6, 0xec, 0x71, 0x53, 0x3c, 0xd7, 0x94, 0x34, + 0x8e, 0xda, 0x66, 0xe8, 0x09, 0x62, 0x23, 0x60, 0x0e, 0x29, 0x38, 0xd8, 0x5a, 0xb2, 0xcc, 0x21, 0x55, 0x32, 0xa6, 0xe4, 0xb0, 0xf8, 0x9b, 0xa2, 0x5c, 0x55, 0x28, 0x11, 0x2a, 0x6a, 0x35, 0xb4, + 0xa8, 0x75, 0x2e, 0x4f, 0x75, 0xba, 0xda, 0x3d, 0x4d, 0xcd, 0x26, 0xa3, 0x9f, 0x20, 0xfd, 0x63, 0xda, 0x52, 0xcd, 0x3c, 0x05, 0xec, 0xd1, 0x39, 0x70, 0xb4, 0xcb, 0xf5, 0xa1, 0x37, 0xb9, 0xb1, + 0x97, 0x80, 0xe8, 0x7e, 0xb6, 0xed, 0xa2, 0x66, 0x0d, 0xb1, 0xc2, 0xf6, 0x09, 0x7f, 0x76, 0x8c, 0x4c, 0x08, 0x4c, 0x91, 0xcf, 0xef, 0x05, 0x18, 0x98, 0x3f, 0x9c, 0x9b, 0x7e, 0xfd, 0x52, 0x80, + 0xf9, 0x56, 0x7b, 0x09, 0xff, 0xb8, 0xf6, 0x02, 0xfc, 0x5c, 0x7c, 0xd1, 0x4d, 0x50, 0xd6, 0x7b, 0x3d, 0xc7, 0xa6, 0xf7, 0xf2, 0x70, 0xd6, 0x5e, 0x48, 0x71, 0xcb, 0xdd, 0x0c, 0xab, 0x6f, 0xa0, + 0x83, 0xa7, 0x43, 0xe5, 0x97, 0x31, 0x84, 0xac, 0x7e, 0xba, 0xcc, 0xb7, 0xa2, 0x0e, 0xfd, 0x67, 0x02, 0x0b, 0x9e, 0xa1, 0x79, 0x46, 0x7b, 0x60, 0xf9, 0xd5, 0x87, 0xa2, 0x59, 0x7c, 0x50, 0x61, + 0x79, 0xd1, 0xfd, 0x1d, 0x56, 0x84, 0x7a, 0xab, 0x7a, 0x32, 0x97, 0x55, 0xea, 0xd5, 0x41, 0x11, 0x63, 0xa8, 0xa0, 0x92, 0x0f, 0x1c, 0xcc, 0x63, 0x6c, 0x40, 0x91, 0x34, 0xaa, 0x23, 0x46, 0xfd, + 0x70, 0x40, 0x26, 0xd5, 0x0d, 0x06, 0x75, 0xd5, 0x7b, 0x30, 0x34, 0x27, 0x72, 0xca, 0x47, 0x20, 0xf1, 0x6b, 0x15, 0x1a, 0x2e, 0x5a, 0x16, 0xf0, 0xa4, 0x4a, 0xaf, 0x43, 0xc6, 0x4b, 0xbb, 0x25, + 0xe7, 0xd3, 0x0f, 0x65, 0x87, 0x7b, 0xa8, 0x0a, 0x4d, 0x37, 0xba, 0x54, 0x5d, 0xe0, 0x27, 0xbf, 0xde, 0x28, 0xc6, 0xf3, 0x21, 0x31, 0x0e, 0x15, 0xdb, 0x5a, 0x19, 0x04, 0x78, 0xe6, 0x9c, 0xbb, + 0x62, 0xa6, 0x47, 0xab, 0x38, 0x80, 0x20, 0x1a, 0x1d, 0x2f, 0x7f, 0x1c, 0xb1, 0xd9, 0x88, 0x76, 0xf7, 0x6d, 0x92, 0xc8, 0xa0, 0xc2, 0x19, 0x11, 0x42, 0xd1, 0x34, 0xd5, 0xb8, 0x8d, 0xbc, 0x9d, + 0x15, 0xf3, 0x91, 0x55, 0x8d, 0x18, 0xcc, 0x7e, 0xcd, 0x95, 0xfc, 0x9c, 0x9a, 0x3a, 0xbf, 0xe0, 0x09, 0x4f, 0xe8, 0x95, 0xdf, 0x6a, 0x40, 0x8a, 0xf2, 0x3c, 0xdf, 0x95, 0xcd, 0x94, 0xa4, 0x22, + 0x7e, 0x0b, 0x9d, 0x93, 0xe2, 0x24, 0x93, 0x51, 0x4e, 0x14, 0xf7, 0x1d, 0xf9, 0x12, 0x03, 0x46, 0xa2, 0x3d, 0xab, 0x34, 0x42, 0x58, 0x57, 0x41, 0xef, 0x65, 0x97, 0xbe, 0x04, 0xdb, 0x09, 0xf5, + 0xf1, 0x95, 0xfe, 0xe5, 0x22, 0xfa, 0xa6, 0x68, 0x3e, 0x99, 0x92, 0xec, 0x8b, 0x85, 0x10, 0x39, 0x05, 0xf4, 0x14, 0xd6, 0x62, 0xcb, 0x73, 0xc5, 0x0f, 0x1b, 0xa2, 0xdb, 0x92, 0x07, 0xe4, 0x07, + 0x3d, 0xc9, 0xcd, 0x78, 0xbb, 0xfa, 0x67, 0x50, 0x3e, 0x21, 0xc4, 0x9a, 0x04, 0x7a, 0xae, 0x74, 0x37, 0x60, 0xf0, 0x1c, 0x4a, 0x92, 0x33, 0x88, 0xcf, 0x9a, 0xd1, 0xfe, 0x32, 0xd9, 0x63, 0x47, + 0xb4, 0x20, 0x5b, 0x5f, 0x0f, 0x55, 0xff, 0x61, 0xe9, 0xdf, 0x55, 0x08, 0xfe, 0x36, 0xbe, 0xa6, 0x0d, 0xcb, 0xd2, 0xdd, 0xf4, 0x63, 0x24, 0xc2, 0x7b, 0xfc, 0x64, 0xcc, 0xe3, 0xf4, 0xa0, 0xe6, + 0xe5, 0xad, 0x0f, 0x03, 0x09, 0x0e, 0x69, 0x7e, 0x65, 0x77, 0x0b, 0x6f, 0xe6, 0x1f, 0x8e, 0x44, 0x70, 0x9d, 0x9f, 0x46, 0x22, 0xb8, 0xfc, 0xf1, 0xab, 0x14, 0xcd, 0xa8, 0x49, 0xd0, 0x7a, 0x85, + 0xfe, 0x67, 0xcf, 0x10, 0xbe, 0xb4, 0x83, 0x4f, 0x1d, 0xda, 0x8c, 0x9d, 0xa0, 0x9f, 0x25, 0xf6, 0xf5, 0x67, 0xe4, 0xe3, 0x9f, 0x04, 0xcd, 0x2a, 0x59, 0xd0, 0x36, 0xd3, 0xc6, 0xce, 0x2f, 0x74, + 0xed, 0x97, 0xa2, 0x82, 0xa6, 0x71, 0xb0, 0x1e, 0x9b, 0x6e, 0xa4, 0xb8, 0x35, 0x63, 0x3b, 0x10, 0xe5, 0x7e, 0x0d, 0x3e, 0xbf, 0x18, 0x0f, 0x7e, 0x0d, 0x91, 0x4e, 0x7b, 0xe8, 0xb7, 0x79, 0x7f, + 0x9f, 0xd6, 0xfa, 0xf3, 0x35, 0x4d, 0xf8, 0xe6, 0x9f, 0x05, 0xfc, 0x37, 0x5b, 0xc2, 0x68, 0xbf, 0x0a, 0x7b, 0x2a, 0xc7, 0x50, 0xaf, 0xb4, 0x17, 0xa6, 0xaf, 0x2b, 0xe0, 0xbb, 0x67, 0xd8, 0xf3, + 0x5f, 0x82, 0xf5, 0x33, 0x11, 0xbb, 0x26, 0xef, 0xbd, 0x2d, 0xf6, 0x29, 0x34, 0xb4, 0x19, 0xe7, 0xd5, 0xf2, 0x9b, 0x66, 0x95, 0x87, 0xf0, 0xdd, 0xe6, 0x8b, 0xa3, 0x29, 0xc7, 0x6f, 0x05, 0xd1, + 0xf6, 0xe4, 0xd2, 0x6d, 0xa9, 0xb7, 0xc7, 0x7e, 0x89, 0xec, 0xbf, 0x1f, 0x4a, 0xfd, 0x17, 0x39, 0x6f, 0x74, 0xe7, 0x70, 0x13, 0x98, 0xf8, 0x5d, 0x37, 0x5f, 0x81, 0x11, 0xe6, 0xb9, 0x7f, 0xcd, + 0x76, 0x85, 0x94, 0x47, 0xbd, 0xbc, 0x27, 0x38, 0x47, 0x43, 0x3a, 0xc3, 0x8e, 0xd7, 0x8d, 0x22, 0x63, 0xb5, 0x1c, 0xbd, 0x9b, 0x9b, 0xe5, 0x3b, 0x74, 0x35, 0xb8, 0x6b, 0x1a, 0x1c, 0x34, 0x27, + 0x51, 0x41, 0x63, 0x28, 0xc6, 0x7a, 0x62, 0x5b, 0x1d, 0xf4, 0x6d, 0x9b, 0x70, 0xa5, 0xab, 0x00, 0xa7, 0xd0, 0xe4, 0x01, 0x3a, 0x31, 0x34, 0x62, 0x7a, 0xdb, 0xcc, 0xe9, 0x92, 0x48, 0xa0, 0xa1, + 0x13, 0xdc, 0x56, 0xc3, 0x45, 0xf9, 0x6a, 0xd9, 0xdd, 0x9d, 0x32, 0xf1, 0x78, 0x40, 0x07, 0xf9, 0x62, 0xa2, 0xe3, 0x9d, 0xa1, 0xcc, 0x96, 0xbe, 0x13, 0xe3, 0x40, 0x4b, 0x3a, 0x9f, 0x38, 0x4b, + 0xda, 0xf0, 0x79, 0x06, 0xcb, 0xc5, 0xdd, 0x9d, 0x98, 0x07, 0x90, 0x12, 0x2a, 0x77, 0xf0, 0x93, 0x5c, 0xcf, 0xd6, 0x97, 0x55, 0x08, 0x0f, 0x0d, 0x6c, 0xcf, 0x92, 0x64, 0xe8, 0xf0, 0x1b, 0x7f, + 0xef, 0xf0, 0xc3, 0xf1, 0x29, 0xfd, 0xf5, 0x78, 0xc8, 0x9c, 0x3f, 0x3f, 0xd1, 0x82, 0xa7, 0x92, 0x9a, 0xed, 0x46, 0x46, 0x85, 0x9c, 0x80, 0xc5, 0xef, 0x35, 0xbb, 0x0c, 0xac, 0x77, 0x3e, 0x18, + 0xcb, 0x4b, 0x6c, 0xa6, 0x00, 0x69, 0xdb, 0xc3, 0xe0, 0xbd, 0x79, 0xc3, 0x22, 0x69, 0x17, 0x2d, 0x2d, 0x4f, 0xfa, 0xa9, 0xb2, 0x9f, 0x64, 0x58, 0x9e, 0xb1, 0x84, 0x67, 0x09, 0xce, 0xd8, 0x8b, + 0xde, 0x41, 0xcc, 0xf1, 0x7e, 0x4d, 0x4b, 0xe6, 0x4d, 0x29, 0xec, 0x22, 0x19, 0x5d, 0xce, 0xb6, 0x8d, 0xaf, 0xbd, 0x0d, 0x85, 0x92, 0x80, 0xf8, 0xeb, 0x80, 0x5c, 0x32, 0xad, 0x1f, 0x35, 0x50, + 0xe7, 0x5c, 0x15, 0xe9, 0xd6, 0xb0, 0x73, 0x02, 0x1e, 0x3a, 0x17, 0x71, 0xb5, 0x92, 0x1e, 0x88, 0x23, 0x7d, 0x71, 0x07, 0xd6, 0x74, 0xf5, 0xfe, 0x6f, 0x9c, 0x92, 0x81, 0x3f, 0x1f, 0x4a, 0x6d, + 0x6e, 0xc2, 0xd4, 0xa9, 0xe2, 0x2b, 0x78, 0xdd, 0x6f, 0x6f, 0x77, 0xdf, 0x5a, 0x13, 0x80, 0x55, 0x86, 0x3f, 0xef, 0xe3, 0xfa, 0x23, 0xb6, 0x41, 0x1b, 0x2c, 0xf0, 0x05, 0xf1, 0xd6, 0xe0, 0x8d, + 0xd1, 0xd4, 0x19, 0xf9, 0x27, 0x8c, 0x3c, 0x63, 0x6d, 0xca, 0x71, 0x7a, 0x5c, 0x5a, 0x94, 0xd6, 0xa0, 0xc7, 0xd4, 0xcf, 0x92, 0xbb, 0x19, 0xe6, 0x00, 0x3e, 0x7b, 0xbf, 0x4f, 0x71, 0x11, 0x13, + 0x61, 0xd2, 0x51, 0x65, 0xec, 0x43, 0x47, 0x07, 0xf9, 0xb6, 0x18, 0x3e, 0x3f, 0x40, 0x0b, 0x83, 0xc0, 0x74, 0x2c, 0x70, 0xc0, 0x00, 0x91, 0x36, 0xb9, 0x56, 0x87, 0x36, 0x38, 0xd0, 0x48, 0xba, + 0x89, 0x39, 0x88, 0x59, 0xb2, 0x6e, 0x64, 0x1c, 0x54, 0xf3, 0xc2, 0x64, 0x8a, 0x0f, 0xd5, 0x17, 0x34, 0x6f, 0x85, 0x3a, 0x91, 0x15, 0xde, 0x1b, 0xe2, 0x10, 0xb4, 0x11, 0x01, 0xe6, 0x04, 0xc7, + 0xf9, 0xe6, 0x81, 0xcd, 0xab, 0x73, 0x80, 0xf0, 0xcd, 0xbc, 0xa2, 0x0f, 0xf7, 0x24, 0x80, 0xf1, 0x7d, 0x94, 0x9d, 0x47, 0xbd, 0x95, 0x9a, 0xb4, 0x64, 0x4c, 0x37, 0x32, 0x33, 0x7d, 0xef, 0xf8, + 0x6e, 0xad, 0x0c, 0xfa, 0xe1, 0x69, 0xe7, 0x71, 0xf5, 0xec, 0x7b, 0x6c, 0x2f, 0x6c, 0x4e, 0xc1, 0xaa, 0xa5, 0x41, 0x7d, 0x2e, 0x67, 0x29, 0x08, 0x36, 0xd4, 0xd5, 0x5f, 0x6e, 0x58, 0xcc, 0x9e, + 0x90, 0xed, 0xc1, 0x80, 0x65, 0x96, 0x67, 0x6c, 0x1d, 0x80, 0x3d, 0x76, 0xa5, 0x8a, 0xe9, 0x4e, 0xe6, 0x0a, 0xa2, 0x59, 0x30, 0x4d, 0x97, 0x9d, 0xea, 0x2d, 0x8b, 0x57, 0x06, 0xe1, 0xdc, 0x27, + 0xac, 0x8a, 0xaa, 0xcf, 0xab, 0x77, 0x1e, 0x43, 0x81, 0x28, 0x22, 0xef, 0x75, 0x7f, 0xac, 0x57, 0x23, 0x8c, 0x65, 0xbe, 0xad, 0xe9, 0xac, 0x36, 0xf6, 0x68, 0x13, 0x78, 0xb1, 0x1e, 0x0d, 0xdb, + 0x5e, 0xf6, 0xe7, 0x09, 0x3c, 0x40, 0x5d, 0x97, 0xcf, 0x2d, 0xd2, 0x6e, 0xbb, 0x7c, 0xed, 0xfe, 0x87, 0xbd, 0x41, 0x37, 0xc8, 0xa5, 0x77, 0xa5, 0x80, 0xb5, 0x98, 0x2a, 0x45, 0xbd, 0x86, 0xa5, + 0xb4, 0xe9, 0xf7, 0xfa, 0x37, 0x4e, 0xc9, 0x6c, 0x3e, 0xaf, 0x5b, 0xff, 0xc3, 0xeb, 0x4c, 0xcf, 0xd7, 0x63, 0x9c, 0xdb, 0xaf, 0xa3, 0xdd, 0xfe, 0x2f, 0xdd, 0x01, 0x02, 0xf4, 0x25, 0x3c, 0x12, + 0x3f, 0xc2, 0xa3, 0x29, 0x67, 0x89, 0x69, 0xb7, 0x64, 0xc7, 0x91, 0xed, 0xa5, 0x83, 0xd7, 0x14, 0x54, 0xaa, 0xfe, 0xfc, 0x5d, 0xfb, 0x31, 0xf4, 0xb5, 0x6c, 0x5a, 0xfe, 0xdc, 0x97, 0xfb, 0x25, + 0x34, 0xca, 0x0d, 0x5d, 0x7e, 0xcf, 0x6e, 0x8b, 0x9e, 0xb7, 0xc5, 0xc1, 0xa7, 0xcb, 0x44, 0xb2, 0xf4, 0x44, 0xaf, 0x89, 0x45, 0x7c, 0x4f, 0x44, 0x6a, 0x88, 0x7d, 0xef, 0xfe, 0x1e, 0x12, 0x95, + 0x9b, 0xee, 0x7e, 0x64, 0xbb, 0xdb, 0xaf, 0x49, 0x20, 0x18, 0x48, 0xec, 0xbf, 0x49, 0x96, 0x3a, 0xff, 0xed, 0x00, 0xa0, 0x4f, 0x2d, 0xf9, 0xda, 0x15, 0x23, 0x79, 0xab, 0x2c, 0x7c, 0xcb, 0xda, + 0x46, 0xbe, 0x59, 0x3a, 0xbd, 0x07, 0x65, 0x08, 0x75, 0x01, 0xf1, 0xf5, 0xb5, 0x0b, 0xe0, 0xd2, 0x58, 0x39, 0xe4, 0x6e, 0xf9, 0xf8, 0xda, 0x62, 0xc0, 0xd1, 0x88, 0xc6, 0x95, 0xb7, 0xe1, 0xb8, + 0x88, 0x5f, 0x95, 0x6f, 0xad, 0xa1, 0x21, 0xbd, 0xe1, 0x0f, 0x8d, 0x0b, 0x0f, 0x83, 0xd3, 0x70, 0xdd, 0x89, 0x62, 0x4d, 0x16, 0xe9, 0x9f, 0x72, 0x59, 0x26, 0xe0, 0x70, 0xbf, 0x62, 0xd2, 0x95, + 0x16, 0x79, 0x3e, 0xfe, 0xc9, 0x7b, 0x0f, 0x4a, 0x2e, 0xc6, 0x8d, 0x7c, 0x7d, 0x4c, 0x7a, 0x6a, 0x49, 0x90, 0xec, 0x13, 0x05, 0x5a, 0xe9, 0x5e, 0x38, 0xf3, 0x6a, 0xf8, 0x41, 0x63, 0xdd, 0xef, + 0xcc, 0x3b, 0xff, 0xb1, 0x52, 0x5e, 0xef, 0x80, 0xbf, 0x4c, 0x78, 0xfd, 0xd6, 0x7e, 0xf9, 0xeb, 0x76, 0x64, 0x3e, 0xf4, 0xdf, 0x59, 0xdc, 0x2c, 0x63, 0x44, 0x81, 0x85, 0x26, 0xa8, 0x32, 0xff, + 0x22, 0xb0, 0x96, 0xff, 0x45, 0x12, 0x8c, 0xa5, 0x1e, 0x41, 0x83, 0xe1, 0xab, 0x4f, 0x73, 0xa2, 0x9d, 0x55, 0xd5, 0xe6, 0x47, 0x62, 0x0a, 0xca, 0xcd, 0x98, 0x67, 0xa6, 0x40, 0x01, 0x04, 0xb8, + 0xa6, 0x11, 0x76, 0x2b, 0xb7, 0x70, 0xce, 0x53, 0x24, 0xf5, 0x9b, 0xfb, 0xea, 0x64, 0x7e, 0x4b, 0x90, 0xcf, 0x4a, 0x6c, 0x51, 0x97, 0x21, 0xd1, 0x46, 0xdb, 0x54, 0xce, 0x9b, 0xec, 0x32, 0x40, + 0x8f, 0xfa, 0xa9, 0xbd, 0x96, 0x07, 0x6b, 0x4d, 0x83, 0x1d, 0x05, 0xbb, 0x0a, 0xd1, 0xed, 0xf1, 0x29, 0xa4, 0xcf, 0xe3, 0x99, 0x28, 0xf9, 0x63, 0x04, 0xd8, 0x92, 0x0d, 0x2a, 0x6f, 0x9a, 0x86, + 0xec, 0xf8, 0x5c, 0xb9, 0x0c, 0x33, 0x8f, 0xf5, 0x70, 0xdc, 0xd9, 0x3f, 0x12, 0xdd, 0xdf, 0x54, 0x81, 0x31, 0x94, 0xdd, 0x7a, 0xdc, 0x02, 0xd8, 0x3c, 0x98, 0x02, 0x4b, 0x78, 0x90, 0xc3, 0x30, + 0xdf, 0xf6, 0xb9, 0x80, 0x19, 0xa1, 0xf0, 0x11, 0x8f, 0x3d, 0xaf, 0x2e, 0x13, 0x44, 0x71, 0x56, 0x84, 0x41, 0x09, 0x60, 0xcd, 0xb8, 0xa4, 0xe9, 0xee, 0x96, 0xae, 0x92, 0x10, 0x52, 0xf3, 0x10, + 0xa2, 0x1d, 0x5f, 0xb4, 0x6b, 0xa3, 0xc8, 0xbd, 0xf8, 0x6a, 0x4c, 0x50, 0x75, 0x4f, 0xbb, 0xbe, 0xa6, 0xe1, 0x30, 0x54, 0x4b, 0x95, 0x7b, 0xfc, 0x10, 0x76, 0x5c, 0xca, 0x86, 0x41, 0x79, 0xa2, + 0x60, 0x5f, 0xaa, 0xc1, 0x91, 0x46, 0x66, 0xfb, 0x59, 0xd8, 0xd7, 0x0b, 0xf9, 0x00, 0x9b, 0x63, 0x45, 0xec, 0xfc, 0xe0, 0xed, 0x1d, 0x2c, 0xc0, 0xd9, 0x28, 0x9e, 0x54, 0x9f, 0x63, 0x4a, 0xd9, + 0x10, 0x6a, 0x34, 0x67, 0x67, 0x38, 0x21, 0xe4, 0xb5, 0x1a, 0xe7, 0xd5, 0x56, 0xd4, 0x29, 0xa6, 0x30, 0x16, 0x85, 0x7d, 0x25, 0x78, 0x0f, 0xdb, 0x2c, 0x5b, 0x95, 0x30, 0xd7, 0xe4, 0x08, 0x73, + 0x8e, 0x19, 0x6f, 0xb8, 0x1f, 0x61, 0x14, 0x02, 0x44, 0xe3, 0x29, 0x5f, 0x21, 0x14, 0x58, 0x76, 0x1f, 0x69, 0x83, 0xcb, 0x6a, 0x39, 0xf6, 0x51, 0x96, 0x6a, 0xa6, 0xb7, 0x18, 0x0e, 0x5b, 0x0f, + 0xd4, 0x4f, 0x2f, 0x96, 0x91, 0x5a, 0x81, 0x39, 0x22, 0x77, 0xea, 0xfc, 0x20, 0x79, 0x5a, 0xdb, 0x79, 0x28, 0xb8, 0x20, 0xa4, 0x5e, 0x4e, 0xc2, 0x64, 0xba, 0x39, 0xa3, 0x3e, 0xef, 0xb7, 0x87, + 0xfa, 0x11, 0x40, 0x15, 0x93, 0x28, 0xf6, 0x19, 0xb6, 0x10, 0x0f, 0x1f, 0x6c, 0x9c, 0x74, 0xcf, 0x33, 0xdb, 0xdb, 0xfc, 0x1b, 0x0f, 0x3c, 0x02, 0x86, 0x44, 0x8b, 0xc9, 0xce, 0x2c, 0xce, 0x0d, + 0x8f, 0x73, 0x0d, 0x1c, 0x94, 0x0d, 0xdf, 0x88, 0x3c, 0x22, 0x91, 0x99, 0xd8, 0x39, 0xf5, 0xeb, 0x5c, 0x33, 0x4a, 0x0d, 0x3e, 0xfc, 0xd6, 0xa9, 0xad, 0xba, 0x7a, 0x0c, 0x60, 0x95, 0x6d, 0x09, + 0xd6, 0x6a, 0xb9, 0x76, 0xcb, 0xd1, 0x24, 0x97, 0xc2, 0xe9, 0x41, 0x90, 0xbe, 0x6b, 0xc9, 0xdd, 0xd1, 0x98, 0x78, 0x9e, 0xd6, 0xab, 0xcc, 0x6f, 0x67, 0x27, 0x4c, 0x36, 0xfb, 0x1c, 0x04, 0xde, + 0x3c, 0xbd, 0x2d, 0x5a, 0x11, 0xc2, 0x0b, 0x6c, 0xea, 0xee, 0x5e, 0xac, 0xeb, 0x5d, 0x0a, 0xb6, 0xe5, 0x3c, 0x81, 0x21, 0x9f, 0x2b, 0x07, 0xaa, 0xfa, 0x56, 0x3d, 0x50, 0x8b, 0xf1, 0xb4, 0xb6, + 0xeb, 0x73, 0x62, 0xbb, 0x61, 0xe6, 0x76, 0x81, 0xb6, 0xe3, 0xac, 0x34, 0xfc, 0x36, 0x7e, 0x19, 0xdb, 0xd2, 0x3f, 0xea, 0xb7, 0xb2, 0xce, 0x2c, 0xb3, 0xb7, 0x32, 0xfd, 0x79, 0x37, 0x3e, 0xd8, + 0xd0, 0xdb, 0x49, 0x29, 0x22, 0xb5, 0xf9, 0x46, 0x56, 0xa0, 0xd7, 0xfd, 0x1a, 0xcc, 0x0a, 0xde, 0x35, 0x80, 0xa9, 0x98, 0x72, 0xc3, 0x34, 0x78, 0x85, 0xf1, 0x01, 0x6d, 0x8b, 0xa5, 0x77, 0x9b, + 0xf3, 0xa3, 0xf2, 0x1e, 0x38, 0x21, 0x5a, 0x38, 0x62, 0xb8, 0xe7, 0x92, 0xb8, 0x30, 0xf7, 0x67, 0x88, 0xa3, 0xe0, 0xfa, 0x8f, 0xe6, 0xce, 0xfd, 0x76, 0xb8, 0x39, 0x32, 0x7a, 0x26, 0x4e, 0x2f, + 0x46, 0xf9, 0xc6, 0x9e, 0xea, 0xfe, 0x9e, 0xdd, 0x07, 0x73, 0xf5, 0x90, 0x33, 0x1a, 0xa0, 0xf3, 0x27, 0xfd, 0x32, 0x3f, 0xf1, 0x7f, 0xfd, 0x87, 0x28, 0x4b, 0x12, 0x3b, 0x6e, 0x21, 0xda, 0x67, + 0x42, 0x82, 0x86, 0xee, 0x2b, 0xfe, 0x62, 0xb2, 0x61, 0xb1, 0x6a, 0xa7, 0x65, 0x06, 0xaf, 0x70, 0x7d, 0xbb, 0xc8, 0x62, 0x0a, 0xe0, 0xd9, 0x55, 0x5a, 0x6a, 0xda, 0x11, 0x97, 0x23, 0x64, 0xda, + 0xb7, 0x58, 0xd9, 0x27, 0x28, 0xe7, 0x03, 0x74, 0x87, 0xe1, 0xe3, 0x3b, 0x7f, 0x4f, 0x78, 0x0c, 0x7f, 0x2c, 0x3d, 0x2d, 0x2d, 0x6b, 0xe5, 0x46, 0x91, 0xe5, 0xad, 0x4d, 0x75, 0x96, 0xe8, 0xfd, + 0xc9, 0xe0, 0x5a, 0x6a, 0x9d, 0x82, 0xf5, 0x06, 0xc8, 0x47, 0xd3, 0x97, 0xfe, 0xe8, 0x5f, 0xb2, 0x96, 0x60, 0x6c, 0x8b, 0x6d, 0x3e, 0x73, 0xcf, 0x1a, 0xc5, 0xbd, 0xab, 0x9e, 0x53, 0x90, 0x7d, + 0xa3, 0x81, 0x17, 0x8e, 0x6b, 0xa1, 0x6c, 0x61, 0x6f, 0x5b, 0x68, 0xe1, 0x7d, 0x65, 0xa4, 0xb3, 0x7c, 0xe3, 0x64, 0x07, 0xa7, 0x09, 0x42, 0x05, 0x3a, 0x06, 0x55, 0x37, 0xce, 0x2c, 0x34, 0x81, + 0x6c, 0x59, 0x08, 0xb2, 0x96, 0xe1, 0x0b, 0x2c, 0x98, 0xf7, 0x15, 0x1c, 0x6f, 0x5e, 0x62, 0xe8, 0xce, 0x74, 0x04, 0x28, 0xa3, 0x07, 0x9b, 0xf6, 0x21, 0x6d, 0x6d, 0x04, 0xd2, 0xae, 0x47, 0x26, + 0x52, 0xd5, 0xa2, 0x3a, 0x4c, 0xb3, 0xeb, 0xe8, 0xb3, 0xc6, 0x7f, 0xa9, 0x6a, 0xf6, 0x19, 0xdf, 0x2d, 0x41, 0xd9, 0xef, 0xac, 0xb2, 0x18, 0xe8, 0x8a, 0x68, 0xce, 0xfb, 0x48, 0xc3, 0x4c, 0x7c, + 0x24, 0x98, 0x51, 0x03, 0xde, 0x7e, 0x35, 0x63, 0xdb, 0xbb, 0x89, 0x91, 0xa3, 0x1d, 0xbf, 0x3d, 0x5f, 0xb1, 0x13, 0x6b, 0xd8, 0xaa, 0x01, 0x9f, 0xd6, 0x01, 0xfd, 0xe6, 0x16, 0x25, 0xdf, 0x09, + 0x57, 0x47, 0x6a, 0x3f, 0xcd, 0xf9, 0x9c, 0x84, 0xf4, 0x85, 0x3c, 0xe0, 0x4a, 0x5c, 0xf6, 0xf3, 0x1e, 0x74, 0x34, 0x7c, 0xda, 0x52, 0x02, 0x9d, 0x96, 0xa1, 0x27, 0x6d, 0x40, 0xe6, 0xc5, 0x3a, + 0xf2, 0x13, 0x2e, 0x7b, 0x72, 0xee, 0x55, 0xb9, 0x01, 0x36, 0x09, 0x3d, 0x2a, 0xc3, 0xe1, 0x0c, 0x09, 0x70, 0xa0, 0xd6, 0xeb, 0xed, 0x84, 0xf9, 0xc3, 0xee, 0x9d, 0x5a, 0xac, 0x92, 0x89, 0x37, + 0x23, 0xb9, 0x60, 0x87, 0xa7, 0xcc, 0xeb, 0x2f, 0xa3, 0x76, 0xf4, 0xd9, 0x44, 0x97, 0x65, 0x3a, 0xc4, 0x2b, 0x7a, 0xf6, 0xb5, 0x5b, 0xf4, 0x9f, 0x89, 0x1e, 0xda, 0x65, 0x7a, 0x83, 0x5b, 0xd3, + 0xef, 0xf8, 0xad, 0x0d, 0x12, 0x3b, 0x2c, 0xd1, 0x85, 0x85, 0x9f, 0x11, 0x50, 0x40, 0xa9, 0xe5, 0x08, 0x87, 0x77, 0x54, 0xaf, 0x6a, 0xc1, 0x3a, 0xe0, 0xe9, 0x74, 0xd2, 0x58, 0xff, 0xb3, 0xa5, + 0xd5, 0xb9, 0x19, 0xd4, 0x78, 0xb3, 0xf0, 0x83, 0xca, 0x99, 0x07, 0x87, 0xa9, 0x63, 0x42, 0xc4, 0xcf, 0x44, 0xd6, 0xb9, 0x8c, 0x44, 0xd4, 0xb6, 0xca, 0xab, 0xa1, 0x5b, 0x31, 0xa1, 0x81, 0x05, + 0xac, 0xd1, 0x2f, 0x34, 0x17, 0x7a, 0xe0, 0xfa, 0x0c, 0xce, 0x95, 0xba, 0x3d, 0x68, 0xc2, 0x23, 0xc3, 0xc7, 0xdb, 0xba, 0xf6, 0x49, 0xf3, 0xc2, 0xa2, 0x7d, 0x96, 0x44, 0xb2, 0x1a, 0x9a, 0x80, + 0x7e, 0xa9, 0x2f, 0xbd, 0xda, 0xed, 0xb2, 0x88, 0x2e, 0x27, 0x88, 0x4d, 0x29, 0xb8, 0x4e, 0x35, 0x8d, 0x12, 0x1c, 0x67, 0x79, 0xa5, 0x82, 0xf1, 0x8f, 0xff, 0x0a, 0x5f, 0xf7, 0x7a, 0x5a, 0xaf, + 0x00, 0xa8, 0x17, 0xc2, 0xeb, 0x85, 0xd3, 0xef, 0xca, 0xb7, 0x40, 0x0c, 0xa9, 0xa8, 0x17, 0xe0, 0x1b, 0x37, 0x30, 0x90, 0x47, 0xa4, 0x0d, 0xa1, 0xc6, 0xb5, 0x2a, 0x38, 0x7d, 0xfe, 0x20, 0x97, + 0x48, 0x77, 0xc2, 0x81, 0xab, 0x55, 0x5a, 0x15, 0xa4, 0x45, 0xc4, 0x25, 0x7b, 0xdd, 0xe7, 0xa9, 0xe3, 0x5c, 0x4c, 0x57, 0x53, 0x70, 0xef, 0x47, 0xd6, 0xbf, 0x09, 0xe0, 0xa6, 0xc3, 0xe5, 0xb3, + 0x24, 0x35, 0x37, 0xfb, 0xf8, 0x5e, 0xdb, 0xef, 0xbf, 0x62, 0x14, 0x52, 0xde, 0x75, 0xf9, 0x50, 0xa7, 0xff, 0xa1, 0xd3, 0x38, 0xcb, 0xfb, 0x3a, 0xfd, 0x4f, 0x3c, 0x64, 0xff, 0xb1, 0xf2, 0x25, + 0x8f, 0xe7, 0xb4, 0xfa, 0x8f, 0x3c, 0x2c, 0x6b, 0xbd, 0x6e, 0x6b, 0x3d, 0x0e, 0xdf, 0x46, 0xd3, 0x7d, 0xa1, 0x1a, 0x10, 0xfc, 0x97, 0xbd, 0x88, 0x7f, 0xf5, 0xf3, 0x77, 0x4c, 0x44, 0x64, 0x6f, + 0x96, 0xa5, 0x41, 0xe3, 0x3b, 0x13, 0x61, 0xe8, 0x3f, 0x11, 0x6b, 0x7d, 0x7e, 0x12, 0x1f, 0x59, 0xb0, 0x7c, 0x72, 0x5f, 0x65, 0x1a, 0xdf, 0xda, 0x6f, 0x01, 0xa6, 0x15, 0xa0, 0x58, 0xf4, 0xb6, + 0xf4, 0x16, 0x78, 0x8d, 0x97, 0xbf, 0x43, 0x35, 0x61, 0x8b, 0xde, 0x92, 0x88, 0x5f, 0x8e, 0x3d, 0x5a, 0x69, 0xfa, 0x7a, 0x15, 0x89, 0xde, 0xfa, 0xe5, 0x75, 0xe8, 0xe3, 0xad, 0x2c, 0x28, 0x5d, + 0x8a, 0x78, 0x55, 0xda, 0xeb, 0xa3, 0xcc, 0x77, 0x5b, 0x8a, 0x5a, 0x9f, 0x4c, 0xf2, 0x20, 0xe0, 0x0b, 0xf3, 0x48, 0xaf, 0x6f, 0x6c, 0xe4, 0xf5, 0xdb, 0x56, 0xdb, 0xd3, 0xe4, 0xe8, 0xc7, 0xf7, + 0x72, 0xaf, 0x0e, 0x55, 0x5d, 0x22, 0x9e, 0x5d, 0xd2, 0x77, 0x8d, 0xcc, 0x0b, 0x4d, 0xe8, 0x5b, 0x5d, 0xe2, 0x77, 0x8d, 0x2c, 0x0a, 0x5b, 0xc4, 0x32, 0x76, 0x14, 0xe8, 0x1d, 0x10, 0x06, 0x4a, + 0x13, 0xb3, 0x8c, 0x92, 0x0c, 0x3a, 0x14, 0x07, 0x16, 0xfc, 0x35, 0xed, 0x36, 0xfc, 0xd2, 0xab, 0xf8, 0x6d, 0x7e, 0xec, 0xa1, 0x39, 0xee, 0x2f, 0xd5, 0x36, 0xf7, 0x17, 0x2d, 0xd6, 0xb7, 0x01, + 0xb6, 0x7e, 0x95, 0xea, 0x3a, 0x47, 0x1f, 0x7a, 0xa3, 0x1d, 0x5f, 0xae, 0x01, 0x5f, 0x2f, 0x36, 0x7f, 0xbf, 0x1f, 0xff, 0x64, 0x3b, 0x80, 0x7f, 0xba, 0x1f, 0xff, 0x64, 0x3b, 0x80, 0x7f, 0xba, + 0x1f, 0xff, 0x64, 0x3b, 0x80, 0x2f, 0xfb, 0xf0, 0xcf, 0x69, 0x0d, 0xc7, 0x3e, 0xd4, 0x16, 0x14, 0xb1, 0x81, 0x7c, 0x73, 0x07, 0x1f, 0x38, 0x88, 0xa9, 0xcf, 0xac, 0x65, 0x0c, 0x2d, 0x19, 0x75, + 0xf3, 0x0e, 0x24, 0x4e, 0xcb, 0xd8, 0xd6, 0x04, 0xad, 0x24, 0x05, 0x3a, 0xb6, 0xee, 0xac, 0x38, 0x4d, 0x63, 0xa7, 0x36, 0xa9, 0x6a, 0x78, 0x92, 0x11, 0x4f, 0x63, 0x57, 0xb3, 0xcc, 0xb5, 0xc0, + 0xdc, 0x15, 0x18, 0x83, 0x01, 0x64, 0xfb, 0x87, 0xc8, 0x71, 0x44, 0x7f, 0x04, 0xf8, 0x50, 0x91, 0x95, 0xca, 0x95, 0x3c, 0x24, 0xbe, 0xd7, 0xc7, 0x32, 0x3f, 0xf2, 0x0a, 0xa8, 0xc5, 0xe5, 0x9c, + 0x41, 0xf6, 0x05, 0x31, 0xe5, 0xbd, 0xe9, 0xab, 0x10, 0x37, 0x0e, 0x44, 0x8f, 0x74, 0xab, 0xd2, 0x23, 0x2b, 0x44, 0x5e, 0x9e, 0xd5, 0xa3, 0xde, 0x3b, 0xa3, 0xeb, 0x83, 0xc9, 0xeb, 0x82, 0x0d, + 0x92, 0x87, 0x20, 0xa6, 0xe6, 0x72, 0x57, 0xb1, 0x56, 0x76, 0x67, 0x5f, 0x61, 0x33, 0x19, 0x7e, 0xd0, 0xcc, 0x91, 0xb6, 0x2e, 0x0f, 0xe0, 0xf9, 0xa6, 0xcd, 0x28, 0x87, 0x21, 0xcc, 0x7e, 0x0c, + 0x85, 0x4a, 0x0e, 0xfa, 0x6b, 0xf9, 0x14, 0xd1, 0x86, 0xdc, 0xc7, 0x20, 0xe3, 0x99, 0xa6, 0x82, 0x72, 0xd5, 0x45, 0x81, 0xa9, 0xa2, 0x92, 0x96, 0x06, 0x1a, 0x4c, 0x2f, 0xd6, 0xed, 0xae, 0xa3, + 0xad, 0x39, 0x02, 0xf7, 0x8e, 0xe5, 0xe7, 0xe8, 0xc7, 0x04, 0xab, 0x40, 0x4f, 0x76, 0x6c, 0x82, 0x0c, 0x10, 0xde, 0x66, 0x01, 0x12, 0x0a, 0x0a, 0x87, 0xe9, 0x3e, 0xf5, 0x38, 0xa5, 0xb0, 0xc5, + 0x70, 0x2e, 0x4b, 0x8f, 0x6f, 0xc1, 0x23, 0x3a, 0xb2, 0x06, 0xe1, 0x5d, 0x1d, 0x75, 0x3e, 0x51, 0xe4, 0x74, 0x61, 0xfe, 0x51, 0xa3, 0xb4, 0x41, 0xd2, 0x4a, 0x78, 0xca, 0x72, 0xd2, 0x78, 0x14, + 0x7b, 0x93, 0x48, 0xc0, 0xd8, 0x0e, 0x5a, 0x63, 0xbb, 0x73, 0xcc, 0x40, 0x8d, 0xfb, 0x21, 0x95, 0xbc, 0xad, 0x58, 0x23, 0x4b, 0x41, 0xc2, 0xb5, 0x40, 0x00, 0x87, 0xfa, 0x11, 0xc0, 0x7a, 0xc8, + 0x47, 0x3a, 0x95, 0x5a, 0xec, 0x2b, 0xeb, 0xf7, 0x55, 0x57, 0xef, 0x51, 0x0f, 0x68, 0x6e, 0xe6, 0xca, 0xa2, 0x0c, 0x2e, 0x5c, 0x46, 0x82, 0x4c, 0x6c, 0x10, 0xc9, 0x4d, 0xb0, 0x70, 0x19, 0x9e, + 0xc3, 0x47, 0x36, 0x0b, 0x58, 0x00, 0x44, 0x33, 0x5e, 0x15, 0xbc, 0x33, 0x8e, 0x80, 0x91, 0xd0, 0xc4, 0x2f, 0x4a, 0x4f, 0xb3, 0xf1, 0x44, 0xd4, 0x6c, 0x01, 0x3a, 0xcd, 0xb3, 0x68, 0x1a, 0x2d, + 0x7a, 0x86, 0x78, 0xf4, 0x52, 0x1d, 0xc6, 0xa8, 0x78, 0xbc, 0x16, 0x3d, 0x8c, 0xbc, 0x3f, 0xb9, 0xf9, 0x09, 0x48, 0xe6, 0x89, 0xa3, 0xe5, 0x43, 0xde, 0x14, 0xd4, 0xf6, 0xc3, 0x77, 0xa4, 0x22, + 0x40, 0xb1, 0x81, 0x11, 0xe9, 0x09, 0x56, 0x61, 0x43, 0xfd, 0x25, 0x76, 0x51, 0x98, 0xb3, 0x4b, 0x3c, 0x97, 0x93, 0x5e, 0xf1, 0x7c, 0xde, 0xb1, 0x94, 0x36, 0xda, 0x8f, 0x17, 0x75, 0x5e, 0x70, + 0x96, 0x66, 0x42, 0x5b, 0xb4, 0x16, 0x12, 0x96, 0x6f, 0xd0, 0xf6, 0xcf, 0xf8, 0x61, 0xd0, 0xc1, 0xd4, 0x71, 0xe8, 0xa7, 0xa5, 0x4c, 0x28, 0xac, 0xa8, 0x7e, 0x03, 0x6a, 0x3d, 0x78, 0x56, 0x1a, + 0xff, 0x3c, 0xc4, 0x76, 0x7c, 0x15, 0xb2, 0x1e, 0x0b, 0xe2, 0x84, 0x3d, 0x3d, 0xf4, 0x9c, 0x6c, 0x93, 0x9b, 0x78, 0xb4, 0xbe, 0xf9, 0xc6, 0x22, 0x79, 0x85, 0x35, 0xd6, 0x8d, 0x42, 0xeb, 0x04, + 0xc6, 0x5e, 0x64, 0xc5, 0xb2, 0x91, 0x6d, 0xf5, 0x08, 0xdf, 0xc6, 0xe7, 0x03, 0xf2, 0x3c, 0x61, 0xea, 0x9b, 0x28, 0xbe, 0x52, 0x80, 0x39, 0xc0, 0x29, 0xa6, 0x8e, 0xe2, 0x55, 0x46, 0x17, 0x21, + 0xc7, 0x32, 0xbf, 0x99, 0x2b, 0x02, 0x93, 0xc2, 0xeb, 0xe1, 0x1c, 0x34, 0xa5, 0xf5, 0xda, 0x23, 0xa7, 0x8f, 0x05, 0x66, 0x47, 0x2b, 0x85, 0xd8, 0x7f, 0x44, 0x6b, 0xfe, 0xc1, 0x88, 0xbe, 0xd4, + 0xf2, 0x86, 0x4b, 0x6b, 0x94, 0x3d, 0xf0, 0xb2, 0x74, 0xa5, 0x31, 0x51, 0x9c, 0x32, 0x12, 0xe5, 0x5b, 0x8f, 0x5e, 0xfe, 0xa2, 0x6f, 0x4c, 0xf2, 0x89, 0xc4, 0xb3, 0x5e, 0x53, 0xc5, 0x84, 0x56, + 0xe3, 0x5c, 0xe1, 0x9a, 0xfa, 0x7a, 0x07, 0xc9, 0xc1, 0xea, 0x2d, 0x97, 0x9c, 0x53, 0x2b, 0x8b, 0x8b, 0x64, 0x23, 0x61, 0x85, 0xf1, 0x61, 0xd7, 0x48, 0xf3, 0xbd, 0xec, 0xaa, 0x38, 0x46, 0x2d, + 0x91, 0x5e, 0x78, 0x00, 0x1c, 0x5c, 0x85, 0x29, 0x62, 0x5d, 0xe7, 0xa3, 0x12, 0x9a, 0xf5, 0xfa, 0x90, 0x75, 0x08, 0x9e, 0x43, 0xaf, 0x2d, 0x9e, 0x26, 0x6b, 0x98, 0x78, 0x78, 0x95, 0xf1, 0xc0, + 0x3b, 0x21, 0x45, 0x94, 0x45, 0x75, 0xa0, 0x2d, 0xf5, 0x3a, 0x8d, 0x7d, 0xba, 0x20, 0xc2, 0xf9, 0xdc, 0xe4, 0xb8, 0x8a, 0xf7, 0x94, 0x8e, 0x44, 0xb6, 0x25, 0x47, 0xbc, 0x67, 0x0d, 0xc8, 0x40, + 0x15, 0x6b, 0xdf, 0xc2, 0x78, 0x82, 0x5d, 0x0c, 0xee, 0xe3, 0x4a, 0xbd, 0x40, 0x85, 0x72, 0xdd, 0xe4, 0x6e, 0x4a, 0x53, 0x6d, 0x72, 0x35, 0x8f, 0x0d, 0x08, 0x3b, 0xba, 0xa5, 0x0a, 0x63, 0x07, + 0xc4, 0x7a, 0x5f, 0x41, 0x6b, 0xa6, 0x41, 0x8a, 0xc6, 0x1a, 0x2c, 0xb7, 0x59, 0x5b, 0x3d, 0xce, 0x15, 0x95, 0xe2, 0x61, 0x88, 0x06, 0x1f, 0x17, 0x90, 0x3d, 0x10, 0x2f, 0xc2, 0x8b, 0x76, 0x49, + 0xfd, 0x79, 0x47, 0xc6, 0xe6, 0xa9, 0xdb, 0x2e, 0xd6, 0x9a, 0x63, 0xb8, 0x58, 0x2f, 0x6c, 0xe7, 0x42, 0xac, 0xee, 0x66, 0x71, 0x60, 0x1e, 0x8a, 0x28, 0x3a, 0x39, 0x44, 0x72, 0x5a, 0xed, 0xea, + 0x96, 0x6d, 0xce, 0xdd, 0x6c, 0x89, 0xf1, 0x4c, 0xa9, 0x2c, 0x98, 0xc7, 0x0d, 0x29, 0x2e, 0xe2, 0xe2, 0x0d, 0x00, 0x89, 0x90, 0x10, 0xb4, 0x7f, 0xee, 0x10, 0xbb, 0x77, 0x61, 0x66, 0xc7, 0x0f, + 0x1f, 0x4e, 0x0f, 0x63, 0xb1, 0x09, 0x49, 0x85, 0x08, 0xb0, 0x9c, 0x8b, 0xf1, 0xb4, 0x0f, 0x79, 0xe3, 0xbd, 0x77, 0xbb, 0xbf, 0x37, 0xdd, 0x9b, 0xf4, 0xb3, 0x5f, 0xb2, 0xa1, 0x0a, 0xa8, 0xfa, + 0x6e, 0x84, 0x16, 0xf2, 0x63, 0x7b, 0x76, 0x90, 0x8b, 0x90, 0xce, 0x26, 0x01, 0xb2, 0x78, 0x0f, 0x2f, 0xfc, 0xa5, 0x77, 0x5c, 0x55, 0x71, 0x65, 0x2a, 0x4a, 0xd0, 0x2a, 0xf2, 0x6f, 0xde, 0xdb, + 0x47, 0x44, 0x08, 0xb8, 0x55, 0x55, 0x31, 0x01, 0xe7, 0x08, 0xeb, 0x33, 0x40, 0x9d, 0xd9, 0x41, 0x28, 0xca, 0x75, 0x51, 0x76, 0x28, 0xde, 0x74, 0x34, 0x09, 0x27, 0x22, 0x8d, 0x42, 0xd9, 0x73, + 0x6a, 0xe1, 0xd3, 0x63, 0x59, 0x08, 0x01, 0x50, 0xf2, 0xe6, 0x49, 0x13, 0x43, 0xfc, 0xb0, 0xa2, 0xad, 0x0d, 0x1d, 0x58, 0x62, 0x1b, 0x19, 0x64, 0x13, 0x0d, 0x3e, 0x2f, 0xd3, 0x9b, 0xb2, 0x22, + 0xb9, 0x47, 0x7e, 0xd7, 0x60, 0xac, 0x36, 0x37, 0x83, 0xbb, 0x1e, 0xcd, 0xd4, 0x3e, 0x6a, 0xf1, 0x94, 0x29, 0xa1, 0xac, 0x68, 0x0e, 0x14, 0x44, 0x47, 0xcf, 0xa7, 0xfc, 0x68, 0x18, 0x76, 0xf7, + 0x56, 0x40, 0xa1, 0x30, 0xb6, 0x21, 0x67, 0x6e, 0xb5, 0x77, 0xf5, 0x99, 0xef, 0xb2, 0xec, 0x69, 0xd8, 0x27, 0x3d, 0x08, 0x44, 0x4a, 0x51, 0x4d, 0x55, 0xde, 0x88, 0x0f, 0x5a, 0x64, 0xcb, 0xae, + 0x66, 0x30, 0x06, 0x67, 0x16, 0xa9, 0x7a, 0xd8, 0xa3, 0x66, 0xe6, 0x91, 0xd5, 0x40, 0x79, 0x4e, 0xa8, 0xab, 0x9f, 0x40, 0x2b, 0x0f, 0x6e, 0xda, 0xdb, 0xb7, 0x18, 0x03, 0x8a, 0x4c, 0x44, 0xcd, + 0x20, 0xa9, 0x39, 0x51, 0x8b, 0xc8, 0xac, 0xbe, 0x7b, 0x07, 0xcb, 0xf8, 0x03, 0xb2, 0xf9, 0x9c, 0x70, 0x27, 0x90, 0xfb, 0x08, 0x41, 0xc8, 0xe2, 0x06, 0x57, 0x4c, 0x35, 0x9d, 0xfb, 0x88, 0x28, + 0x44, 0x3c, 0xfb, 0x69, 0x95, 0x54, 0x9f, 0xbd, 0xb7, 0xed, 0x57, 0x88, 0x14, 0x97, 0x6c, 0x10, 0xf9, 0x2a, 0xb4, 0xf7, 0xd4, 0x04, 0x7c, 0x40, 0x77, 0x31, 0x37, 0xe8, 0x9a, 0x93, 0xb0, 0x1a, + 0xe6, 0x27, 0xf9, 0xbf, 0xa2, 0x35, 0xdf, 0x7d, 0x16, 0xfe, 0x8f, 0xd4, 0xe6, 0xff, 0xfd, 0x0f, 0xe8, 0x0d, 0x7b, 0x7c, 0xa1, 0x37, 0xed, 0xf4, 0x6b, 0x7a, 0xf3, 0x5b, 0xb9, 0x60, 0xc3, 0x32, + 0xd3, 0x3f, 0x80, 0x72, 0xe0, 0xef, 0xb0, 0xfc, 0xdf, 0x40, 0x39, 0xf0, 0x67, 0x58, 0x6e, 0x71, 0x0c, 0xfb, 0x9d, 0xda, 0x18, 0xff, 0x10, 0xca, 0x81, 0x3f, 0xc2, 0x72, 0xcb, 0xd5, 0xb9, 0x6f, + 0x7e, 0xef, 0xd6, 0xb7, 0x24, 0x0c, 0xc7, 0xc3, 0xbf, 0x28, 0x02, 0x61, 0x8d, 0x4b, 0x0f, 0xfd, 0xe6, 0x0f, 0xed, 0x4e, 0x4f, 0xed, 0xab, 0x22, 0xd0, 0x3c, 0x34, 0x2e, 0xbc, 0x35, 0x8e, 0x3f, + 0x80, 0x5f, 0x2e, 0x1e, 0x65, 0x3c, 0xfe, 0x54, 0x24, 0xcc, 0x6c, 0xcd, 0xfc, 0x2a, 0x40, 0xe0, 0x3c, 0xd3, 0x94, 0xf8, 0x23, 0x62, 0x32, 0xb1, 0xea, 0x92, 0x41, 0xfb, 0xd5, 0xaa, 0xc7, 0xdf, + 0xac, 0x1a, 0xf8, 0xb7, 0x0c, 0xe4, 0x9b, 0x63, 0xfd, 0x4f, 0x09, 0x19, 0xd7, 0x3c, 0xcc, 0x1f, 0x83, 0x30, 0xee, 0x55, 0x8e, 0xfc, 0x73, 0x89, 0x7c, 0xfc, 0x13, 0x5e, 0x0c, 0x13, 0x22, 0x42, + 0x1b, 0xf9, 0xf0, 0x97, 0xd7, 0x55, 0xd2, 0x9b, 0xa5, 0xdb, 0x7b, 0x77, 0xe4, 0x0b, 0x57, 0x88, 0x94, 0xa5, 0xed, 0xe3, 0x77, 0x26, 0x76, 0x50, 0xf6, 0x35, 0xcb, 0x83, 0xdf, 0x32, 0xef, 0x71, + 0xe6, 0x2f, 0x93, 0x88, 0x81, 0xaf, 0x73, 0x91, 0x1b, 0xfa, 0xd4, 0xff, 0x4e, 0xf5, 0xa7, 0xa8, 0xa5, 0x99, 0x57, 0xaf, 0x72, 0xb4, 0x52, 0x6c, 0x2f, 0x4f, 0x3e, 0xea, 0xc5, 0x88, 0xc7, 0x14, + 0xc5, 0x7e, 0x64, 0xa6, 0x4d, 0xaa, 0x73, 0xe3, 0xbd, 0x81, 0x4c, 0xf1, 0x2f, 0xd7, 0xb7, 0xe6, 0xc6, 0xdf, 0xfb, 0x37, 0xca, 0x7a, 0x24, 0xed, 0xf1, 0xd6, 0x33, 0xba, 0x0c, 0x81, 0x41, 0x3a, + 0x53, 0x89, 0x9b, 0x09, 0x1b, 0x87, 0xbd, 0x5d, 0x9d, 0xcf, 0xb0, 0xbf, 0xf8, 0x6a, 0x77, 0x58, 0xf7, 0xf3, 0xd4, 0x85, 0xd3, 0xa7, 0xc8, 0xec, 0x08, 0x5c, 0x74, 0xd5, 0x8b, 0x67, 0x8e, 0x7e, + 0xd8, 0x41, 0x1c, 0x55, 0xc0, 0xeb, 0x3e, 0x64, 0x6c, 0x6e, 0x53, 0x49, 0xb7, 0x6d, 0x22, 0x11, 0x8c, 0x35, 0xfd, 0xa2, 0xfa, 0xfb, 0xe3, 0xb6, 0xa7, 0x3f, 0x3c, 0x4d, 0x7f, 0x57, 0xfd, 0x01, + 0x0c, 0x13, 0xf2, 0xc2, 0xcb, 0xac, 0x59, 0x4c, 0x8d, 0x14, 0x9a, 0x37, 0x86, 0xd7, 0xde, 0x72, 0x3b, 0x02, 0x3e, 0xf0, 0xb4, 0x6c, 0xf1, 0x76, 0xfa, 0x49, 0xf5, 0xc7, 0xfe, 0x57, 0xf5, 0x57, + 0x18, 0x42, 0x2f, 0x63, 0xe3, 0x74, 0xd6, 0x56, 0x9c, 0x7f, 0x3a, 0xdb, 0xa1, 0x01, 0xb1, 0xce, 0x53, 0xad, 0xd9, 0xe9, 0x43, 0xf7, 0x9f, 0x53, 0x5e, 0x60, 0x0c, 0xaf, 0x3b, 0x55, 0x8e, 0xdb, + 0x72, 0xf6, 0xcc, 0x28, 0xdb, 0xe7, 0xde, 0x1f, 0x3c, 0xb4, 0x2f, 0x30, 0x88, 0x4e, 0xcd, 0x90, 0x4d, 0xf9, 0x60, 0x72, 0x01, 0xa6, 0x33, 0x7c, 0x24, 0xec, 0xb1, 0x70, 0xdc, 0x43, 0x61, 0x69, + 0x74, 0xb1, 0x9f, 0x70, 0x2b, 0x5c, 0xcd, 0x00, 0x64, 0x29, 0x2e, 0x44, 0x81, 0x5c, 0x09, 0xe4, 0x52, 0x9b, 0xe6, 0x53, 0xe3, 0xf1, 0x12, 0xeb, 0x3b, 0x6b, 0xed, 0xc9, 0xb9, 0x2e, 0x8c, 0x91, + 0xf5, 0x59, 0xd5, 0xfa, 0xcb, 0x3e, 0x55, 0xdb, 0x12, 0xbf, 0xe9, 0x01, 0x02, 0xf8, 0xdf, 0xa9, 0xfe, 0xe2, 0x2f, 0x11, 0x01, 0xfe, 0x71, 0xe0, 0xb1, 0x68, 0x59, 0x36, 0x6f, 0x82, 0xb3, 0x4d, + 0x43, 0x8f, 0x2c, 0xf1, 0x5d, 0x6e, 0x88, 0xc1, 0xd6, 0x07, 0xfd, 0x87, 0x55, 0x29, 0xe7, 0xfe, 0x03, 0x4b, 0x44, 0xd5, 0xa1, 0x87, 0xef, 0x5f, 0xff, 0x2f, 0x4f, 0xfa, 0x57, 0x5d, 0x70, 0xef, + 0x41, 0xdf, 0x7a, 0x38, 0xbd, 0x6f, 0xfd, 0x0b, 0xbf, 0x89, 0x06, 0xd9, 0x95, 0xa0, 0xde, 0xf1, 0x1b, 0x6d, 0x1d, 0x7f, 0x9c, 0x8a, 0x0b, 0x2b, 0xd2, 0xf7, 0x21, 0x0d, 0xfe, 0x8f, 0x0e, 0x54, + 0xf7, 0xd0, 0x1b, 0x1a, 0xd2, 0x1c, 0xfe, 0xd0, 0x39, 0x0d, 0xfb, 0xd6, 0x1b, 0xf2, 0xd3, 0xb5, 0x86, 0x79, 0xff, 0x51, 0x5f, 0xec, 0x47, 0x63, 0xd3, 0xef, 0xb1, 0xea, 0xcb, 0xe3, 0x00, 0x45, + 0x81, 0xb2, 0x45, 0x81, 0x59, 0xba, 0x88, 0xd7, 0x64, 0xc1, 0xd7, 0x90, 0xf3, 0x9b, 0x47, 0xc6, 0x42, 0x95, 0x3d, 0x0b, 0xe8, 0x53, 0x70, 0x68, 0xe7, 0x7b, 0x18, 0x02, 0x38, 0xbe, 0x73, 0xdc, + 0x36, 0xfd, 0xae, 0x37, 0x08, 0x35, 0x87, 0x65, 0xe9, 0x5a, 0xfe, 0x79, 0x7f, 0x98, 0x5f, 0xa8, 0xcd, 0x9b, 0xe6, 0x58, 0x96, 0x2e, 0x47, 0xf6, 0x2b, 0xcd, 0x51, 0xd1, 0x51, 0x91, 0xde, 0x90, + 0xc0, 0x15, 0x77, 0x8f, 0x63, 0x33, 0xe0, 0x5d, 0x65, 0x5a, 0x11, 0x44, 0xba, 0x52, 0x24, 0xd6, 0xca, 0xe7, 0xf6, 0x36, 0xa2, 0x60, 0x94, 0x1a, 0x34, 0x4b, 0xd5, 0x1a, 0xdc, 0xbd, 0x29, 0xd9, + 0x43, 0xda, 0xb9, 0x9a, 0x04, 0xed, 0x6b, 0x31, 0xe1, 0x6d, 0x67, 0x9d, 0x85, 0x06, 0xb4, 0x4c, 0x3b, 0x26, 0xc8, 0x02, 0xda, 0xc6, 0xb3, 0xbf, 0x84, 0x07, 0xe4, 0x68, 0xe4, 0xd6, 0x36, 0x30, + 0x80, 0x06, 0x43, 0xb1, 0x10, 0x0d, 0xc8, 0xef, 0x7c, 0xd5, 0xb7, 0x3b, 0x53, 0x8f, 0xd1, 0x19, 0xbb, 0x9f, 0x3e, 0xea, 0xaf, 0x77, 0xd1, 0x9c, 0xc7, 0xfe, 0x84, 0x3e, 0x72, 0x99, 0xdc, 0xb8, + 0xc6, 0xf5, 0xa5, 0x4a, 0xd4, 0x36, 0xf6, 0x40, 0xfb, 0xe0, 0xe9, 0xd2, 0x38, 0xe8, 0x58, 0x78, 0x46, 0xf6, 0x6e, 0xd9, 0xb8, 0x8f, 0x12, 0x9b, 0x5b, 0x52, 0x05, 0x12, 0x4c, 0xdb, 0x20, 0xb7, + 0x0b, 0x1a, 0x99, 0x81, 0xd6, 0x75, 0xdc, 0x21, 0xae, 0xd6, 0xf3, 0x43, 0x3f, 0x64, 0x6b, 0x85, 0xc9, 0x86, 0x26, 0x1f, 0xe3, 0x63, 0x43, 0xb3, 0x4f, 0x33, 0x3d, 0x16, 0xdf, 0x21, 0x55, 0x83, + 0x77, 0xd7, 0xc7, 0x7d, 0xec, 0x23, 0x48, 0x78, 0xe8, 0x6b, 0xb7, 0xaf, 0x1c, 0x9a, 0x4b, 0x87, 0x91, 0x3b, 0x4e, 0x62, 0x75, 0x80, 0xbe, 0xfa, 0x12, 0xf3, 0xb4, 0x96, 0x60, 0xde, 0x11, 0x51, + 0xf5, 0x20, 0xff, 0xd2, 0xd5, 0x86, 0x7b, 0x28, 0x23, 0x22, 0x58, 0xe8, 0x74, 0x49, 0x0c, 0xee, 0x40, 0x21, 0x2a, 0x2d, 0xaf, 0x4d, 0xd9, 0x7d, 0xbc, 0x66, 0xb0, 0xb0, 0x4b, 0x75, 0xa9, 0x5b, + 0xb2, 0x8d, 0x24, 0x5a, 0x51, 0xc1, 0xf1, 0x75, 0x6b, 0xfb, 0x9a, 0xec, 0xcf, 0x8c, 0x36, 0x01, 0xcc, 0x24, 0x72, 0xc4, 0x62, 0x0d, 0x61, 0xdf, 0x50, 0xea, 0xd9, 0xa0, 0xe7, 0xc3, 0x65, 0x19, + 0xbc, 0x7e, 0xeb, 0x65, 0xed, 0xe1, 0x0f, 0x19, 0xed, 0x4a, 0x08, 0xc9, 0x22, 0x82, 0xe0, 0x06, 0xf5, 0x94, 0xa2, 0x8d, 0xa4, 0xc1, 0x4e, 0x61, 0xb2, 0x9a, 0x41, 0x4d, 0x1f, 0x52, 0xd7, 0x88, + 0x79, 0xc6, 0x07, 0x93, 0x7d, 0x5c, 0x95, 0xa3, 0x9a, 0x02, 0x80, 0x13, 0xc8, 0x96, 0x6e, 0x77, 0x57, 0x99, 0x6c, 0x81, 0x3e, 0x0d, 0x33, 0xd1, 0x5d, 0x9b, 0x21, 0xb8, 0xa4, 0x13, 0xb3, 0x31, + 0x0b, 0x5d, 0x1e, 0x2b, 0x30, 0x98, 0xae, 0xb1, 0x72, 0x9a, 0x11, 0xa3, 0x3a, 0x78, 0xf4, 0x5e, 0xa1, 0x9e, 0xb2, 0x1d, 0x85, 0x8f, 0xb3, 0x78, 0x84, 0x4e, 0x5a, 0x82, 0xe2, 0xaa, 0x4f, 0xfc, + 0xc1, 0xe8, 0x84, 0x0d, 0xa8, 0x9a, 0x2d, 0x2f, 0x02, 0x75, 0xe0, 0x4b, 0x0f, 0xf3, 0x73, 0xe8, 0xe1, 0x06, 0xa5, 0xc7, 0x1e, 0xc6, 0xbb, 0xc9, 0xe8, 0x9d, 0x49, 0xe4, 0x47, 0x0e, 0x8d, 0xa9, + 0x8d, 0x6a, 0x02, 0xbf, 0xdf, 0xe2, 0x73, 0x63, 0x4c, 0x1e, 0x3d, 0xb9, 0x16, 0xb5, 0xef, 0x6b, 0x70, 0x86, 0xa6, 0x22, 0x19, 0x56, 0xa7, 0x0f, 0x58, 0x58, 0x4f, 0x7d, 0x36, 0x25, 0x60, 0x5b, + 0xf8, 0x43, 0x13, 0x4e, 0x79, 0xc5, 0x64, 0xa2, 0x57, 0x23, 0x2a, 0x94, 0xa7, 0x7a, 0xbc, 0x7a, 0xf6, 0x7e, 0x4d, 0x54, 0x79, 0x98, 0xc9, 0x38, 0x6a, 0x9c, 0x19, 0x4b, 0x3e, 0x53, 0xf0, 0xc9, + 0x31, 0x27, 0xc7, 0x24, 0x5d, 0xa2, 0x01, 0xc5, 0xa3, 0xcd, 0x4e, 0x32, 0x2a, 0xc5, 0x71, 0x36, 0x93, 0x45, 0x3c, 0xb9, 0x94, 0x18, 0x82, 0x33, 0x60, 0xbc, 0xf5, 0x16, 0x5d, 0xca, 0x99, 0x33, + 0xc7, 0x11, 0x04, 0x8b, 0x04, 0xab, 0xbc, 0xff, 0x0f, 0x71, 0xff, 0xb1, 0xec, 0x28, 0xf6, 0x7c, 0x8f, 0xa3, 0x73, 0x9e, 0xa2, 0xe7, 0xc4, 0xef, 0x0a, 0x2b, 0x60, 0x88, 0xf7, 0x20, 0xbc, 0x99, + 0x09, 0x23, 0xbc, 0xf7, 0x3c, 0xfd, 0x8d, 0xaa, 0xea, 0x6a, 0x6f, 0xbf, 0x9f, 0x8e, 0xf8, 0x6b, 0x08, 0xe7, 0x48, 0x7b, 0x4b, 0xe4, 0xce, 0x5c, 0x69, 0xd6, 0x62, 0x61, 0x56, 0xb3, 0x14, 0x18, + 0x2d, 0xf3, 0x0f, 0x16, 0xe1, 0x28, 0x2b, 0xcf, 0x1e, 0xd1, 0x21, 0xd1, 0xf2, 0x3c, 0x57, 0xa8, 0xf7, 0x02, 0xe2, 0xb1, 0x8b, 0x2e, 0xac, 0x43, 0xc6, 0xeb, 0xb7, 0xd3, 0x2d, 0xc0, 0xff, 0x71, + 0xbc, 0x05, 0x5f, 0x85, 0xbe, 0xcb, 0x89, 0xa4, 0xc5, 0x69, 0xe1, 0x2e, 0xe8, 0x4a, 0xbe, 0x98, 0x31, 0x02, 0xa8, 0xad, 0x4b, 0x92, 0x3f, 0x13, 0x45, 0x2d, 0x78, 0xda, 0xb7, 0xa9, 0x68, 0x4a, + 0xae, 0x6b, 0x12, 0x38, 0x8b, 0xd3, 0xa4, 0x48, 0xec, 0x9a, 0x42, 0xb9, 0x1a, 0x79, 0x16, 0x05, 0x38, 0x94, 0xc7, 0x0d, 0x94, 0xb5, 0xf6, 0xed, 0x3c, 0x7c, 0xaa, 0x8d, 0x35, 0x60, 0x4b, 0xca, + 0x9b, 0x17, 0x7a, 0x57, 0x8e, 0x33, 0x10, 0x87, 0xce, 0x13, 0x24, 0x34, 0x27, 0x52, 0x21, 0x7c, 0xa2, 0xf7, 0x49, 0xb8, 0x84, 0xa0, 0xfc, 0x08, 0x16, 0xd7, 0xf6, 0xf3, 0xbd, 0x31, 0xf1, 0x33, + 0x99, 0x15, 0x21, 0x07, 0xc5, 0x3e, 0x02, 0xf9, 0xe2, 0x95, 0x34, 0xcf, 0x58, 0xb4, 0x50, 0x26, 0x4f, 0xa2, 0x72, 0x15, 0x48, 0xf1, 0xed, 0x03, 0x50, 0x7f, 0xee, 0xc7, 0x36, 0x10, 0xc4, 0xf9, + 0x78, 0x5d, 0xd4, 0x7b, 0x53, 0x1e, 0xe2, 0xb8, 0xe8, 0xd5, 0xf6, 0x08, 0x61, 0xb0, 0xdb, 0x87, 0x8a, 0x31, 0xf7, 0x07, 0x12, 0x3e, 0xa6, 0xc6, 0x59, 0xaa, 0xc5, 0x4e, 0xcd, 0xfa, 0xa1, 0xaa, + 0x86, 0xb0, 0x46, 0xc8, 0xeb, 0x60, 0x2e, 0xdf, 0xc1, 0x37, 0x36, 0xd1, 0xab, 0xa1, 0xb8, 0x2b, 0xef, 0x58, 0x81, 0x92, 0xbb, 0x58, 0x14, 0x7c, 0x06, 0xfe, 0x11, 0x3c, 0x35, 0x6d, 0x47, 0x4f, + 0xed, 0x23, 0xb9, 0xf5, 0xc6, 0xee, 0xb5, 0x24, 0xcb, 0xbd, 0x71, 0x37, 0xab, 0xc4, 0x16, 0xaa, 0x85, 0x9b, 0x36, 0x7d, 0xcb, 0x98, 0xa2, 0xbf, 0x14, 0x50, 0x5c, 0xda, 0x20, 0x92, 0x12, 0x6c, + 0x2c, 0x87, 0xa3, 0xea, 0x70, 0xa2, 0x7a, 0xdf, 0x6b, 0x68, 0x0e, 0xca, 0x01, 0xb8, 0xd9, 0xa1, 0x9c, 0x58, 0xaf, 0xb1, 0x45, 0x66, 0x24, 0x66, 0x99, 0xd5, 0x4b, 0xbf, 0xdf, 0xd3, 0x2e, 0x6d, + 0x84, 0x37, 0xbb, 0x4d, 0x18, 0x38, 0x2b, 0xdd, 0xdd, 0xa6, 0x7f, 0x5d, 0x45, 0x39, 0x8d, 0x71, 0x58, 0x0b, 0x6f, 0x09, 0x1d, 0x4d, 0x54, 0xd1, 0x04, 0xb0, 0x05, 0x1f, 0xe0, 0xa2, 0xd2, 0xf2, + 0xb6, 0xaf, 0x19, 0xb1, 0x81, 0xc6, 0x09, 0xe4, 0x38, 0x1d, 0x40, 0x47, 0x96, 0xdb, 0xad, 0x41, 0x1a, 0x47, 0xc6, 0xd6, 0xc6, 0x8b, 0x6f, 0xc7, 0xdb, 0xef, 0x12, 0x6f, 0xc2, 0x14, 0xef, 0x5d, + 0xf0, 0xd5, 0xe6, 0x72, 0x8d, 0x74, 0x2f, 0xa7, 0x34, 0x0a, 0xaa, 0xaf, 0x12, 0x13, 0x06, 0x3e, 0x51, 0x47, 0x87, 0x0d, 0x0a, 0xb7, 0x61, 0x23, 0xc9, 0x82, 0x72, 0x49, 0x33, 0x36, 0x01, 0x63, + 0x1a, 0x50, 0x6e, 0x3f, 0x1d, 0xae, 0x0a, 0x65, 0x30, 0xb4, 0xaf, 0x5d, 0xd3, 0xc2, 0x2f, 0xf3, 0x03, 0xc2, 0x6c, 0x9a, 0x07, 0xa7, 0x08, 0x27, 0x96, 0xbf, 0xe0, 0xf1, 0xf6, 0x19, 0x17, 0xbd, + 0xad, 0x27, 0xcc, 0xab, 0xa0, 0x07, 0xdc, 0xee, 0x25, 0x78, 0xd4, 0x6c, 0xf9, 0xc2, 0x9a, 0x49, 0x35, 0x15, 0x64, 0x3a, 0x27, 0xcc, 0x2e, 0xa6, 0xe5, 0x5d, 0x72, 0x40, 0xe4, 0xef, 0xae, 0x44, + 0x1d, 0x44, 0x1d, 0x26, 0x97, 0x96, 0x57, 0x46, 0x96, 0x91, 0xa1, 0x8e, 0x1c, 0x94, 0xf7, 0x58, 0x89, 0x0b, 0x12, 0x3e, 0x0f, 0xea, 0xaa, 0x20, 0x91, 0xc7, 0xb0, 0xf8, 0x8d, 0xcd, 0x02, 0xa2, + 0x19, 0x54, 0x06, 0xc3, 0xee, 0x8b, 0xee, 0x6c, 0x71, 0xeb, 0x3d, 0x89, 0x49, 0xfb, 0x80, 0xdf, 0x0b, 0x85, 0xb1, 0x5a, 0xaa, 0x07, 0x14, 0xbe, 0xf2, 0xa0, 0x78, 0xe9, 0xf7, 0x22, 0x7d, 0x6c, + 0x49, 0xf9, 0x2a, 0x42, 0xdb, 0xc6, 0xc2, 0x09, 0x25, 0x62, 0xa8, 0xc6, 0x66, 0xa2, 0x80, 0x9d, 0x82, 0xe7, 0xef, 0xe3, 0xa4, 0x71, 0x22, 0xcb, 0xbb, 0xeb, 0x75, 0x16, 0x69, 0x74, 0xf6, 0x8f, + 0xdc, 0xc6, 0xb0, 0x87, 0xaa, 0x60, 0x3c, 0xb3, 0x80, 0xad, 0xcf, 0xd9, 0xe8, 0x9e, 0x5f, 0x0a, 0xd0, 0x81, 0x4d, 0x68, 0x51, 0x54, 0x82, 0xc0, 0x0f, 0xb0, 0x2e, 0xf1, 0x70, 0x58, 0x60, 0xba, + 0x0f, 0xf1, 0x4a, 0x5e, 0xe7, 0x5c, 0x64, 0xd3, 0xbf, 0x2c, 0xa1, 0xd2, 0xec, 0x0f, 0x36, 0x2d, 0xc7, 0x3f, 0x08, 0x86, 0xee, 0xfe, 0x3f, 0x9b, 0xd5, 0x7f, 0x17, 0xee, 0xff, 0xad, 0xc7, 0x2e, + 0xbe, 0x78, 0x6c, 0x64, 0xfb, 0xee, 0xb1, 0x5f, 0x61, 0x6c, 0x1a, 0xba, 0x98, 0x22, 0x17, 0x1d, 0x65, 0xe2, 0x92, 0x79, 0xa5, 0xd8, 0x48, 0xbf, 0xcd, 0x53, 0xb1, 0x87, 0x47, 0xeb, 0xdc, 0xf2, + 0xab, 0x18, 0x16, 0xa0, 0x1b, 0xdf, 0xd5, 0x6d, 0xfe, 0x5b, 0x2c, 0x65, 0x59, 0x2a, 0x47, 0x97, 0xa2, 0xdb, 0xc0, 0x9e, 0xe6, 0x2b, 0x9c, 0xeb, 0xf2, 0xb1, 0xce, 0xfc, 0xe8, 0x2f, 0x8f, 0xc3, + 0xb2, 0x3c, 0xbd, 0xf0, 0x1a, 0x41, 0x09, 0x2a, 0xe6, 0x17, 0x7f, 0xf3, 0xb5, 0x4d, 0xe4, 0x30, 0xbf, 0x46, 0xca, 0x75, 0x73, 0x1a, 0xae, 0xf7, 0xb5, 0x66, 0x29, 0x1c, 0xd0, 0xad, 0x73, 0xf4, + 0xf9, 0x25, 0x84, 0xfe, 0x46, 0x72, 0xc8, 0xbc, 0x7f, 0xfb, 0xe9, 0x7f, 0xf5, 0xe1, 0xc0, 0x3f, 0xfb, 0xf4, 0x7f, 0xe6, 0x78, 0x7f, 0x14, 0xa1, 0x19, 0xcf, 0x42, 0x1a, 0xf5, 0xb2, 0xc3, 0x1f, + 0x17, 0x63, 0xac, 0x87, 0x1e, 0x53, 0x12, 0xcd, 0x86, 0xf5, 0x75, 0xe8, 0x32, 0xb1, 0x58, 0x5d, 0xc3, 0x8e, 0xe2, 0x9c, 0x4b, 0xd5, 0xab, 0x4a, 0xfc, 0x6e, 0x26, 0xf0, 0x7e, 0x33, 0x2b, 0x5c, + 0x35, 0xc7, 0xcb, 0xcf, 0x02, 0x5b, 0x4a, 0x8c, 0xea, 0x89, 0x7a, 0x76, 0xfa, 0x01, 0x26, 0xab, 0xf8, 0x30, 0x4c, 0xda, 0x04, 0xea, 0x80, 0x3a, 0x65, 0xfd, 0xc1, 0xdd, 0xde, 0xf3, 0x1f, 0x68, + 0x78, 0x38, 0x97, 0x4d, 0xc7, 0x52, 0x25, 0xaf, 0x16, 0x77, 0x08, 0x35, 0x99, 0x41, 0x9f, 0xa5, 0xbe, 0x71, 0xc8, 0x22, 0xa6, 0xc5, 0x90, 0x61, 0xc3, 0x94, 0xe2, 0xbe, 0x9e, 0x39, 0x39, 0xb9, + 0xe9, 0x3b, 0x90, 0x84, 0x74, 0x7d, 0xf9, 0x33, 0x90, 0xac, 0x16, 0xe3, 0x69, 0x85, 0xfb, 0xe9, 0x4e, 0x75, 0x80, 0x7a, 0x5b, 0x66, 0xfa, 0x6d, 0xd7, 0xe9, 0x51, 0x14, 0x83, 0x1e, 0xdd, 0x89, + 0x1d, 0xb5, 0x26, 0x4b, 0xce, 0xd3, 0x77, 0x8c, 0x2b, 0x2c, 0xaf, 0x94, 0x1f, 0xf7, 0x66, 0xc9, 0x57, 0x79, 0x0a, 0x2b, 0xc3, 0x85, 0x6f, 0x9e, 0xf6, 0x0e, 0x9e, 0x7b, 0xe2, 0x68, 0x1a, 0xe6, + 0x5b, 0xa4, 0x01, 0x35, 0xe2, 0x27, 0x2f, 0xa3, 0x7b, 0x7b, 0xeb, 0x06, 0xef, 0x31, 0x2e, 0xde, 0x37, 0x3a, 0x37, 0x96, 0xc7, 0x1e, 0xca, 0xfb, 0xca, 0x9a, 0xd3, 0xe0, 0x95, 0x88, 0x68, 0xf6, + 0x29, 0xfd, 0x1c, 0x60, 0x8c, 0x12, 0x58, 0x6d, 0x78, 0x5e, 0x4e, 0xb7, 0x37, 0xb8, 0xbe, 0xab, 0xa4, 0x73, 0xc2, 0x77, 0xb8, 0xeb, 0xd5, 0x71, 0xf7, 0x30, 0xce, 0x0e, 0x1b, 0x00, 0x91, 0xd1, + 0xe7, 0x14, 0xaf, 0xe9, 0xb4, 0xcf, 0x89, 0xb6, 0x7c, 0x55, 0xa3, 0x34, 0xe1, 0x78, 0x17, 0x90, 0xd2, 0xc2, 0xdd, 0x98, 0xc9, 0xac, 0xfc, 0x69, 0xa2, 0xf5, 0x48, 0x60, 0x77, 0x6c, 0xf7, 0x49, + 0x5d, 0x75, 0x2f, 0xaf, 0x5f, 0x1e, 0x53, 0x0b, 0x19, 0x59, 0xe0, 0xac, 0x73, 0x2a, 0x4d, 0xad, 0xc6, 0x93, 0xb6, 0x84, 0x02, 0xda, 0x1d, 0x40, 0xb0, 0x84, 0xdd, 0x40, 0xda, 0x71, 0xec, 0xa5, + 0x70, 0x01, 0x3f, 0xc7, 0x27, 0xe7, 0x69, 0x5d, 0xb2, 0x37, 0xb7, 0xc3, 0x89, 0x1d, 0x34, 0x88, 0x66, 0xe2, 0x0f, 0x0f, 0x56, 0x7d, 0x12, 0x6d, 0xa0, 0xab, 0x10, 0x31, 0x91, 0x84, 0x54, 0x3f, + 0xb4, 0x77, 0xdc, 0xad, 0x3e, 0x0b, 0xf6, 0x82, 0xc1, 0xea, 0xa0, 0x24, 0x75, 0xe3, 0xf9, 0xf9, 0xf4, 0x2e, 0xb0, 0x9a, 0x5d, 0x9b, 0x46, 0x02, 0x71, 0x34, 0xb8, 0xd4, 0x4e, 0x21, 0x92, 0x0d, + 0x41, 0xad, 0xca, 0x8f, 0xb1, 0x10, 0x9f, 0x8c, 0xf7, 0xf4, 0xd7, 0x90, 0x28, 0x65, 0x30, 0xd5, 0x70, 0x63, 0x8a, 0x36, 0xe7, 0x03, 0x62, 0xed, 0xa2, 0xea, 0x0c, 0x61, 0x26, 0x95, 0x50, 0x93, + 0xcf, 0x73, 0x49, 0xd1, 0x0a, 0x3e, 0xb0, 0x31, 0x77, 0x74, 0x55, 0x54, 0x00, 0x8c, 0x38, 0xfd, 0x89, 0xfd, 0x04, 0x0e, 0x88, 0x58, 0x73, 0xb4, 0x3f, 0xa3, 0xcb, 0x8f, 0xb5, 0x77, 0x01, 0xa3, + 0xe9, 0x14, 0xea, 0xc4, 0xdd, 0xde, 0x69, 0x9e, 0x41, 0xf9, 0xbd, 0x87, 0x05, 0xae, 0x36, 0x74, 0xd4, 0x45, 0x4f, 0x04, 0x47, 0x5c, 0x6f, 0x65, 0x88, 0x11, 0x89, 0x9d, 0x6b, 0xf1, 0x31, 0x8a, + 0xa2, 0xe8, 0xdc, 0x83, 0x31, 0x9e, 0x05, 0xda, 0x16, 0xa9, 0x19, 0xa8, 0xf7, 0xf3, 0x95, 0x09, 0x41, 0x7b, 0xef, 0x3d, 0x28, 0x86, 0xa7, 0x99, 0xc1, 0xad, 0x65, 0x1d, 0x52, 0xab, 0x1e, 0x23, + 0x0d, 0xc2, 0xdf, 0x29, 0x01, 0xcd, 0xa4, 0x11, 0x58, 0x7a, 0xbe, 0x7a, 0x93, 0xac, 0xe0, 0x22, 0x28, 0xda, 0xd8, 0xf0, 0x79, 0x5e, 0x45, 0x1f, 0x46, 0x7a, 0x31, 0x1f, 0xae, 0x92, 0x08, 0xef, + 0x37, 0x50, 0x41, 0x09, 0xfc, 0xdd, 0xf3, 0x16, 0x91, 0x7e, 0x14, 0xd1, 0xff, 0x0d, 0xf3, 0x7c, 0x9b, 0x74, 0x7a, 0x65, 0xd4, 0xf9, 0x41, 0xf9, 0xa7, 0x32, 0x24, 0x19, 0xe2, 0xf4, 0x94, 0x8d, + 0x14, 0xb7, 0x06, 0x4a, 0x91, 0x32, 0xae, 0x3a, 0xf7, 0x2d, 0xa7, 0x27, 0xd3, 0x16, 0xaa, 0x73, 0xde, 0xa1, 0x1f, 0x11, 0xef, 0xdb, 0x50, 0x41, 0x73, 0xf4, 0xac, 0xb3, 0x8d, 0xc8, 0xb2, 0x8b, + 0x48, 0x5b, 0x9e, 0xc0, 0x1c, 0x32, 0x23, 0x94, 0xf0, 0x00, 0x64, 0x92, 0x7d, 0x98, 0x15, 0xb9, 0x7f, 0x1b, 0x6e, 0xfb, 0xa6, 0xb9, 0x16, 0x77, 0xf8, 0x9a, 0xb1, 0x78, 0x9b, 0x5e, 0x54, 0x93, + 0x8a, 0xc6, 0xad, 0xfd, 0xd9, 0xc0, 0x6a, 0xc1, 0xd3, 0x0c, 0xce, 0xa8, 0xe8, 0x43, 0xaf, 0xdd, 0x9d, 0xe3, 0x80, 0x5e, 0x10, 0xda, 0x0e, 0x3f, 0xaa, 0x61, 0x18, 0xf4, 0xf2, 0x63, 0xdc, 0x6a, + 0xb0, 0x1a, 0x8f, 0x42, 0xaa, 0x26, 0xeb, 0xac, 0xe9, 0x84, 0xe4, 0xe3, 0x67, 0x90, 0x75, 0xc2, 0x83, 0xa2, 0xed, 0xd7, 0x93, 0x50, 0xc6, 0xea, 0x19, 0x25, 0xe0, 0xda, 0x69, 0x4e, 0xd2, 0x5c, + 0x1e, 0x48, 0x32, 0xb0, 0x1d, 0x9e, 0x2d, 0xf7, 0xaa, 0x2e, 0x83, 0x04, 0x17, 0x80, 0x23, 0x41, 0x23, 0x79, 0x34, 0x31, 0x85, 0x3d, 0x16, 0x69, 0x57, 0x8e, 0x7e, 0xe7, 0xd4, 0xcd, 0x04, 0xd1, + 0x07, 0x1a, 0xa1, 0x59, 0xbb, 0x23, 0xc9, 0x50, 0xdf, 0x33, 0x22, 0x5f, 0xf2, 0xa8, 0x1b, 0x66, 0x37, 0x99, 0x82, 0x18, 0xe9, 0x9a, 0x6f, 0x40, 0x3e, 0xe2, 0xe5, 0x70, 0xa2, 0x65, 0x32, 0xc6, + 0x13, 0x63, 0x10, 0xd5, 0x0a, 0x92, 0x2a, 0x40, 0x0d, 0x0a, 0xe8, 0xd4, 0xbc, 0x8c, 0xd8, 0xe7, 0x65, 0xc2, 0x17, 0xa2, 0xc7, 0x16, 0xe1, 0x60, 0xba, 0x4a, 0xa5, 0x6a, 0xf9, 0x64, 0xf8, 0x26, + 0x46, 0xf3, 0xd9, 0x98, 0xa4, 0xfd, 0x21, 0x08, 0xf9, 0x6e, 0x4b, 0x3e, 0x5a, 0xc9, 0xb6, 0xdd, 0xcb, 0xba, 0x1c, 0x9e, 0x6e, 0x0a, 0x96, 0x35, 0x0e, 0x11, 0x87, 0xdb, 0xdd, 0xed, 0xd3, 0xd0, + 0x66, 0x17, 0xb0, 0x3e, 0xfb, 0x53, 0x1f, 0x86, 0x69, 0xbd, 0x36, 0x91, 0x45, 0x3a, 0xce, 0xd4, 0x08, 0xa3, 0xaa, 0x30, 0x2d, 0x55, 0x11, 0x43, 0x19, 0xb5, 0x4d, 0xda, 0x3d, 0x46, 0x3d, 0xe6, + 0x18, 0x1e, 0xf3, 0x24, 0xd9, 0xd8, 0x41, 0xb4, 0x8f, 0xa7, 0x1c, 0x2d, 0xba, 0xd4, 0xb0, 0x2b, 0x0d, 0x7e, 0xb2, 0xb8, 0x27, 0xe0, 0xcd, 0xa1, 0x0d, 0x1a, 0xac, 0x02, 0x00, 0x8c, 0x14, 0x01, + 0xe6, 0xfa, 0x62, 0xa0, 0x99, 0x0c, 0xc6, 0xeb, 0xee, 0x13, 0xe3, 0x7d, 0x4a, 0x9a, 0x6f, 0x75, 0xcf, 0xe7, 0xea, 0xc9, 0x3f, 0x05, 0x93, 0x84, 0x76, 0x41, 0x36, 0xab, 0xb8, 0x7a, 0x33, 0x3c, + 0xcb, 0x4b, 0x21, 0x2e, 0xbc, 0x63, 0x23, 0xbc, 0xb7, 0xdd, 0x04, 0x05, 0x86, 0x74, 0xcf, 0x73, 0x63, 0x78, 0x33, 0x01, 0xb3, 0x88, 0x00, 0xe4, 0xb3, 0x1e, 0x9f, 0x03, 0x61, 0xbb, 0xde, 0xdb, + 0x20, 0xdd, 0xbd, 0x79, 0x2f, 0xd3, 0x13, 0xbc, 0x4c, 0xb4, 0x7b, 0x4c, 0x31, 0xed, 0xb4, 0xef, 0x40, 0x18, 0x56, 0xec, 0xd1, 0x7b, 0x89, 0x85, 0x75, 0x73, 0x2a, 0x6c, 0x86, 0x76, 0x5c, 0x20, + 0x7d, 0x08, 0x60, 0x17, 0xd4, 0xc8, 0xbd, 0xa0, 0xc5, 0xa5, 0x8d, 0xf0, 0x7a, 0x5e, 0xfa, 0x03, 0xce, 0x00, 0xb2, 0x62, 0xa9, 0xac, 0x3e, 0x6a, 0xa4, 0xaa, 0x51, 0xd0, 0xde, 0xe7, 0x20, 0x70, + 0x7d, 0x54, 0xa0, 0xae, 0x4f, 0xc5, 0x91, 0x77, 0xd4, 0xc1, 0x8d, 0x98, 0x19, 0x51, 0x3f, 0x3c, 0xdc, 0x09, 0xca, 0x8e, 0xbb, 0x07, 0xf3, 0xdd, 0x1a, 0x84, 0x95, 0x62, 0xa8, 0xa6, 0xa2, 0x99, + 0x2c, 0x7d, 0x79, 0x61, 0xb7, 0xf0, 0xea, 0xee, 0x11, 0xb4, 0xd1, 0x01, 0x78, 0x37, 0x1d, 0x5b, 0x2d, 0x3a, 0x56, 0xc3, 0x4c, 0x7b, 0x3d, 0xbb, 0xe9, 0x26, 0x4c, 0x06, 0x1c, 0x90, 0x33, 0x83, + 0xf8, 0x2b, 0xd2, 0x96, 0x64, 0x63, 0xda, 0x99, 0xf9, 0x2e, 0xa0, 0x63, 0x68, 0xec, 0x89, 0x97, 0x67, 0x2a, 0x79, 0xdb, 0x76, 0x17, 0xc0, 0x82, 0x9e, 0x05, 0x98, 0x8d, 0x93, 0x3a, 0x87, 0xda, + 0x20, 0xa8, 0xd5, 0xa4, 0x27, 0x02, 0xf3, 0x08, 0xeb, 0xd1, 0x88, 0x3e, 0xec, 0xc2, 0xc5, 0x20, 0xb2, 0x43, 0x78, 0xd6, 0xa7, 0xb3, 0x0f, 0x16, 0x4c, 0x4b, 0xab, 0x46, 0x72, 0xb4, 0x6f, 0x1b, + 0x79, 0x64, 0xa0, 0xed, 0x61, 0x73, 0xc5, 0x77, 0x7e, 0x45, 0x4f, 0xa5, 0xa9, 0x79, 0xee, 0xf8, 0x72, 0x5e, 0x6f, 0x6d, 0x9d, 0xff, 0xba, 0x37, 0x94, 0xee, 0xde, 0xf7, 0xd0, 0xff, 0x05, 0x25, + 0xd4, 0xdf, 0x79, 0x74, 0xce, 0xfa, 0xea, 0xca, 0xba, 0xef, 0x1e, 0xdd, 0x65, 0xba, 0xeb, 0x73, 0xe3, 0xdd, 0xa3, 0xa6, 0x07, 0x1c, 0xdb, 0x19, 0xac, 0x6a, 0x5e, 0x5d, 0x5b, 0xc7, 0xc9, 0xf5, + 0x87, 0xd3, 0x78, 0x34, 0xfe, 0x1d, 0xed, 0x02, 0xbf, 0x20, 0x4e, 0x7c, 0x7d, 0x09, 0x01, 0x7e, 0x44, 0xbb, 0xa2, 0x15, 0xc0, 0x65, 0xde, 0x51, 0xdb, 0x2f, 0xc4, 0x13, 0x39, 0xfe, 0x64, 0x98, + 0x24, 0x10, 0x9e, 0x09, 0x82, 0xfd, 0x92, 0xa6, 0xf4, 0xfb, 0xa4, 0x2c, 0x0c, 0xe8, 0x9c, 0x77, 0x19, 0xf5, 0xef, 0x49, 0x50, 0x8d, 0x9f, 0x89, 0x51, 0x0f, 0xd3, 0xfd, 0xfd, 0x68, 0xf1, 0xcf, + 0xb9, 0xc2, 0xc1, 0x65, 0x1a, 0x61, 0x8d, 0xc2, 0x71, 0x07, 0x92, 0xfa, 0x67, 0x8f, 0x4e, 0x9f, 0xba, 0xf5, 0x7d, 0x45, 0xdf, 0x01, 0xfe, 0xd7, 0x0c, 0xd4, 0x97, 0xaf, 0xc1, 0xf9, 0x33, 0x8f, + 0xce, 0x7f, 0xf3, 0xe8, 0xd6, 0x57, 0x8f, 0xce, 0x33, 0xb4, 0xa6, 0x60, 0x85, 0x24, 0xa9, 0xb9, 0x11, 0xd6, 0xe9, 0x9b, 0x92, 0x0a, 0x81, 0x81, 0x3e, 0x01, 0x11, 0xc1, 0x58, 0x89, 0x50, 0x4a, + 0x3b, 0x50, 0x70, 0x51, 0x46, 0xaf, 0x16, 0x2a, 0x69, 0x7e, 0x9f, 0x69, 0x79, 0x2d, 0x57, 0xb3, 0xb0, 0xd0, 0xd1, 0x5c, 0x26, 0xd7, 0x32, 0xe6, 0x81, 0xd9, 0x07, 0x34, 0x71, 0xf4, 0x42, 0x02, + 0x84, 0x3b, 0xd6, 0x29, 0xf3, 0x29, 0xcb, 0x64, 0x0a, 0x3e, 0xef, 0x0f, 0xbc, 0xda, 0x3d, 0xe6, 0x04, 0xd5, 0x81, 0xae, 0x39, 0x9e, 0xd5, 0x45, 0x16, 0xc5, 0xcf, 0xe6, 0x31, 0xc8, 0xc8, 0x98, + 0xfb, 0xaa, 0xbf, 0xd9, 0x02, 0xf6, 0xe9, 0xa9, 0x95, 0x49, 0x9e, 0x99, 0x31, 0xa5, 0xdd, 0xed, 0xe1, 0xda, 0x63, 0x3a, 0x64, 0x81, 0x16, 0x13, 0x69, 0xb6, 0x80, 0x42, 0x53, 0x3b, 0xf0, 0xfd, + 0x58, 0xec, 0xb3, 0x7b, 0x79, 0x5c, 0x21, 0xa1, 0xaa, 0x2a, 0x99, 0x7e, 0x8d, 0x6d, 0x6b, 0x30, 0x82, 0x5e, 0xd9, 0xeb, 0x4a, 0xb2, 0xb5, 0x52, 0x99, 0x27, 0x58, 0x57, 0x7b, 0x29, 0x7d, 0x94, + 0xdd, 0xbb, 0xb4, 0x83, 0xf7, 0xd3, 0x37, 0xb7, 0xfa, 0xc0, 0x25, 0xdc, 0x31, 0xee, 0x07, 0x94, 0x17, 0x87, 0x16, 0x42, 0x2b, 0x90, 0x49, 0x34, 0x0c, 0x63, 0x45, 0x43, 0xe1, 0x04, 0x1f, 0x04, + 0x4f, 0x22, 0xc5, 0xd2, 0x90, 0xac, 0x15, 0x51, 0xd5, 0x4a, 0x0e, 0x9c, 0xd3, 0x6c, 0x5a, 0x26, 0x88, 0x1c, 0xc9, 0x86, 0xab, 0x60, 0x8d, 0x42, 0x85, 0x34, 0xec, 0xfa, 0xc7, 0x73, 0xf4, 0xd8, + 0xeb, 0xae, 0xd4, 0xb9, 0xa5, 0xb1, 0x84, 0xda, 0x09, 0x2d, 0x90, 0x93, 0x33, 0x4d, 0x73, 0xc0, 0x37, 0x05, 0x14, 0x13, 0x3f, 0x32, 0x87, 0x5f, 0x92, 0x4c, 0x45, 0x0f, 0x8b, 0x65, 0x1e, 0xb2, + 0xcc, 0xf1, 0x05, 0x7f, 0x80, 0xe6, 0x65, 0x75, 0x75, 0xe1, 0x6c, 0x89, 0x32, 0xcb, 0x53, 0x01, 0xb1, 0xf4, 0xc1, 0xd3, 0xf4, 0xfb, 0xcf, 0x13, 0x6d, 0xc0, 0x1f, 0x7a, 0x9d, 0xe8, 0xd7, 0x5e, + 0x47, 0x90, 0xad, 0xe8, 0x96, 0x3d, 0x88, 0xd0, 0x0e, 0xbd, 0x55, 0xac, 0x8d, 0x15, 0xba, 0xf4, 0x24, 0x64, 0xcb, 0x2d, 0x06, 0xf9, 0x97, 0xe1, 0x29, 0xf0, 0x3d, 0x3e, 0xa5, 0xb1, 0xaf, 0x3d, + 0xbb, 0x11, 0x59, 0x67, 0x6f, 0x2b, 0x66, 0x4b, 0x71, 0xf1, 0x11, 0xcf, 0x29, 0x0a, 0xa3, 0xd2, 0xcd, 0x79, 0x8b, 0x86, 0xed, 0x39, 0x63, 0xad, 0x8a, 0xcb, 0x23, 0xc7, 0x3c, 0xc4, 0xc7, 0xd1, + 0xd4, 0xde, 0x06, 0x5d, 0xaa, 0x18, 0x52, 0x73, 0x72, 0xe6, 0x3d, 0x27, 0x7b, 0xf8, 0x4b, 0x07, 0x58, 0xb6, 0xae, 0x3b, 0x36, 0x7c, 0xc9, 0x4f, 0x17, 0x47, 0x2b, 0xc9, 0xfd, 0xc8, 0x9e, 0x32, + 0x7b, 0xcf, 0x77, 0xe6, 0xce, 0x2c, 0x8b, 0x4c, 0x4a, 0x2e, 0xc5, 0xbc, 0x7d, 0x96, 0x6d, 0x22, 0xc3, 0x4c, 0x5d, 0xaf, 0x8f, 0x6e, 0xd9, 0xa1, 0xf5, 0x9d, 0x59, 0xf0, 0xe1, 0x2d, 0x06, 0x58, + 0x70, 0xce, 0x13, 0x1d, 0xa3, 0x37, 0xcd, 0x26, 0x7b, 0x78, 0x01, 0xa4, 0x1e, 0x5c, 0x84, 0xbf, 0xa1, 0xe8, 0x6b, 0xf2, 0x42, 0x29, 0xcf, 0xf9, 0xa7, 0xff, 0xf0, 0x26, 0xc4, 0x27, 0xf7, 0xca, + 0x35, 0xa9, 0xa7, 0x16, 0x0a, 0xbb, 0x1a, 0xb4, 0x4a, 0x12, 0xa9, 0xa4, 0x47, 0x41, 0xfb, 0x3e, 0x3c, 0xb6, 0x8f, 0xa5, 0xf8, 0xab, 0xee, 0xbb, 0xa4, 0xb5, 0xbe, 0x24, 0xbb, 0x24, 0xeb, 0x39, + 0x6b, 0x5e, 0x8e, 0xc4, 0xbe, 0x01, 0x24, 0xf4, 0xb1, 0x34, 0x13, 0x2e, 0xeb, 0xb6, 0xe1, 0xa4, 0xcd, 0xe2, 0xa3, 0x50, 0x52, 0xa5, 0xa3, 0xc7, 0xfb, 0xd2, 0x63, 0x61, 0x78, 0xca, 0xd6, 0x33, + 0xf4, 0x70, 0x7d, 0x91, 0xc1, 0x4b, 0xb7, 0x2d, 0xb0, 0xe4, 0xd4, 0x50, 0xa9, 0x86, 0x77, 0x9b, 0x85, 0x45, 0xed, 0x35, 0xea, 0x13, 0x43, 0x74, 0xcc, 0x3b, 0x56, 0xc6, 0x27, 0x87, 0x04, 0x01, + 0x4e, 0xc5, 0xe0, 0x32, 0x24, 0x2e, 0x0f, 0xad, 0x1f, 0xac, 0x2c, 0x0f, 0x73, 0x91, 0xe6, 0x92, 0x66, 0xbc, 0xe6, 0x29, 0xb4, 0x3f, 0xc9, 0x60, 0xf5, 0x43, 0xbc, 0x88, 0xd8, 0x84, 0x07, 0xee, + 0x0b, 0x7b, 0x92, 0x8e, 0xb5, 0xef, 0x22, 0xfe, 0x2f, 0xce, 0xb0, 0xdf, 0x77, 0x73, 0xfe, 0xdd, 0x19, 0x26, 0x7c, 0x3d, 0xc3, 0xae, 0x5f, 0x9f, 0x61, 0xd0, 0x18, 0xc1, 0xe5, 0x48, 0xaa, 0x1c, + 0x18, 0x88, 0xf9, 0xab, 0x4c, 0x94, 0x79, 0x53, 0x8d, 0xdf, 0x85, 0x06, 0xc7, 0x7f, 0x7e, 0x86, 0x5d, 0x7f, 0x71, 0x86, 0x59, 0xc7, 0x6f, 0xae, 0xfd, 0xc7, 0x67, 0x58, 0xfd, 0x6f, 0x50, 0x89, + 0x8a, 0x04, 0xfd, 0x85, 0xa4, 0x4e, 0x73, 0xaa, 0x45, 0xd8, 0xda, 0x5d, 0x7e, 0xa9, 0x17, 0xb2, 0x16, 0x9e, 0x6d, 0x92, 0x6e, 0x00, 0x89, 0x0f, 0x8d, 0x96, 0xeb, 0x0c, 0x8a, 0x79, 0x71, 0x96, + 0x94, 0xe2, 0x80, 0x11, 0x9d, 0xd9, 0x65, 0xd9, 0x1d, 0x5b, 0x4d, 0x4c, 0x4a, 0xeb, 0xc5, 0x05, 0xd4, 0xaa, 0x3e, 0xf5, 0x1a, 0x03, 0x1a, 0x29, 0x89, 0x03, 0xe8, 0x51, 0xbb, 0x66, 0x21, 0x1a, + 0x0d, 0xaa, 0x77, 0xd3, 0x41, 0x71, 0x0a, 0x3d, 0x37, 0xab, 0x25, 0x8a, 0x01, 0xbb, 0x18, 0x90, 0x8d, 0x97, 0x91, 0xc8, 0xce, 0xfe, 0x80, 0x62, 0x34, 0xaa, 0xf7, 0xef, 0x58, 0xf7, 0xfa, 0x64, + 0xb2, 0x70, 0x04, 0x65, 0x0c, 0xc1, 0xa2, 0xda, 0xb0, 0x80, 0x33, 0xb5, 0x73, 0xa2, 0x70, 0x04, 0x0c, 0xb0, 0x57, 0x3f, 0x13, 0x9e, 0xb6, 0x1e, 0x2c, 0x77, 0x35, 0xb8, 0xc9, 0xc2, 0xb8, 0x56, + 0x4a, 0x18, 0x1b, 0x5a, 0xe9, 0x88, 0x8d, 0x69, 0x2d, 0x1a, 0xb5, 0x30, 0x49, 0x87, 0xe4, 0xda, 0x67, 0x82, 0x4c, 0xeb, 0xf9, 0x62, 0x14, 0x37, 0xda, 0x29, 0x95, 0xec, 0x37, 0xd0, 0xb0, 0x82, + 0x91, 0xaf, 0xdd, 0x9a, 0x44, 0x6c, 0x28, 0xaa, 0x0e, 0x0a, 0xa0, 0xf9, 0xf6, 0xad, 0xbe, 0xb0, 0xcb, 0xd6, 0x36, 0x09, 0x0d, 0xbc, 0x9e, 0xee, 0x79, 0x02, 0x69, 0x66, 0x54, 0xa2, 0x66, 0x83, + 0xba, 0x04, 0xbf, 0xe1, 0xc9, 0x17, 0xa1, 0x3e, 0x59, 0x2c, 0xa6, 0x66, 0xc4, 0x0b, 0xdd, 0xed, 0xc1, 0x7c, 0x4a, 0x10, 0x22, 0x35, 0xae, 0x13, 0x91, 0xfa, 0x91, 0x13, 0x92, 0xe2, 0x3f, 0xd1, + 0xae, 0x9e, 0xb3, 0x3d, 0x03, 0x3e, 0x1a, 0xfb, 0x94, 0x74, 0x82, 0x44, 0x1b, 0x12, 0xce, 0x16, 0xf2, 0x05, 0x4a, 0xc5, 0xe7, 0x5d, 0xc7, 0xb6, 0x5d, 0x65, 0x65, 0x00, 0x76, 0xf9, 0xfd, 0x60, + 0x2b, 0x3f, 0x84, 0x49, 0x25, 0x1a, 0x77, 0x8d, 0x70, 0x85, 0x1b, 0xb3, 0x36, 0xf5, 0x01, 0x19, 0x9e, 0xcd, 0x2c, 0x20, 0x4c, 0x26, 0x3b, 0xb3, 0x82, 0xe7, 0x1b, 0x23, 0x3a, 0x9a, 0x3f, 0x81, + 0x66, 0x27, 0x35, 0xff, 0xe1, 0xbc, 0x97, 0xb9, 0x0d, 0x9f, 0xef, 0x7d, 0xe7, 0xc2, 0xc4, 0x26, 0x4d, 0x02, 0xba, 0x87, 0x77, 0x8f, 0x89, 0xc4, 0xb8, 0x8a, 0x5d, 0x89, 0x22, 0x3d, 0xa2, 0x93, + 0xf1, 0xa8, 0x8d, 0xa9, 0xdb, 0x4f, 0x81, 0xb4, 0x08, 0xa9, 0x55, 0xb8, 0x1f, 0xc5, 0x23, 0x4c, 0xe2, 0xf3, 0x78, 0x3b, 0x50, 0x7c, 0x5b, 0xe2, 0xcb, 0x71, 0x80, 0x64, 0x9d, 0x38, 0xf7, 0x19, + 0xd7, 0x9d, 0x77, 0xb5, 0x20, 0x4c, 0xec, 0x72, 0x60, 0x3f, 0x65, 0x81, 0x5a, 0x62, 0xd9, 0xf3, 0xaf, 0xfb, 0x33, 0x46, 0xc5, 0xa1, 0xa9, 0x65, 0x92, 0xd2, 0x0e, 0x76, 0x21, 0x35, 0xae, 0x51, + 0x31, 0xf6, 0xa4, 0xca, 0x8c, 0x6e, 0x4d, 0x30, 0x6f, 0xac, 0x4a, 0x04, 0x67, 0xbc, 0x9e, 0x84, 0xe1, 0x26, 0xf4, 0x15, 0x02, 0x2c, 0x3c, 0xc4, 0x13, 0xb1, 0x75, 0x8c, 0x25, 0x1d, 0x93, 0xc7, + 0xe9, 0xd3, 0xf0, 0xf1, 0x01, 0x71, 0x90, 0xb2, 0xc1, 0xbd, 0x77, 0xbc, 0xdc, 0x67, 0xa1, 0xa7, 0x22, 0x17, 0xad, 0x82, 0xbd, 0xfc, 0x52, 0xda, 0xc5, 0x87, 0x36, 0x8c, 0x57, 0x32, 0x30, 0xf1, + 0x03, 0x4e, 0x9f, 0x60, 0xe8, 0x5d, 0x03, 0x84, 0x7f, 0x08, 0x13, 0x1a, 0xa2, 0xb5, 0x35, 0x80, 0xf4, 0xa1, 0xe9, 0x85, 0x9d, 0x15, 0x44, 0x8a, 0xce, 0xa8, 0xb1, 0xf5, 0xd7, 0xe2, 0x83, 0xf4, + 0x8c, 0x5e, 0x3e, 0x5d, 0x7a, 0x8f, 0xc4, 0x5a, 0x59, 0xe7, 0x08, 0x7d, 0x7e, 0x8a, 0x20, 0xdf, 0x2d, 0xbd, 0x20, 0x95, 0xa1, 0x0d, 0xde, 0x3e, 0x1d, 0xf9, 0x80, 0x2a, 0x84, 0x09, 0x9c, 0xb6, + 0xbb, 0x70, 0x1a, 0x6f, 0x6d, 0x3e, 0xcf, 0xd8, 0x0f, 0x08, 0xa0, 0xf9, 0xf6, 0xaf, 0x3a, 0xff, 0x7f, 0x6e, 0xfc, 0x17, 0x7f, 0xd3, 0xf8, 0xef, 0x1c, 0x00, 0xf7, 0x62, 0x74, 0xfd, 0x65, 0x09, + 0x01, 0xad, 0xc8, 0x0f, 0xf7, 0xd5, 0x7a, 0x13, 0xa5, 0x95, 0xa6, 0xd1, 0x79, 0xbf, 0x8b, 0x72, 0x8e, 0x9f, 0xc0, 0xc3, 0x34, 0x55, 0x74, 0x7d, 0xe0, 0xd8, 0x00, 0xb2, 0x15, 0xac, 0xa3, 0x1d, + 0x15, 0x97, 0x4f, 0x13, 0x1c, 0x68, 0x80, 0x26, 0xd8, 0x90, 0x1b, 0x4d, 0x32, 0x98, 0x6a, 0x44, 0x93, 0xcf, 0xab, 0x7c, 0x76, 0xe7, 0x43, 0xa2, 0xee, 0x47, 0x60, 0x9c, 0xb9, 0x1a, 0x48, 0x41, + 0x4a, 0x1e, 0x98, 0x05, 0x59, 0x4b, 0x69, 0xbc, 0x93, 0x48, 0x83, 0xdf, 0xdb, 0x9b, 0xee, 0x9f, 0xb4, 0xc0, 0x22, 0x75, 0x63, 0x23, 0xbb, 0xf4, 0x5e, 0x41, 0xe4, 0x11, 0xa6, 0x57, 0xba, 0x79, + 0x11, 0x00, 0x16, 0x3d, 0x34, 0x28, 0xfa, 0x12, 0x66, 0xaa, 0x9e, 0x45, 0x3e, 0x12, 0xc7, 0xb4, 0x4e, 0xa3, 0x1d, 0xaa, 0x3b, 0x46, 0x3d, 0x87, 0x15, 0xc7, 0x46, 0xf1, 0x50, 0xea, 0xf3, 0x03, + 0x4c, 0xc9, 0xae, 0x1b, 0x15, 0x1c, 0x27, 0x61, 0xed, 0xcc, 0xb3, 0x72, 0x3c, 0x3f, 0x1a, 0xf9, 0x6c, 0x9c, 0x06, 0x37, 0xe6, 0x11, 0x2c, 0x76, 0x0f, 0xd7, 0x78, 0x20, 0x12, 0xaa, 0xe3, 0xa6, + 0x15, 0x5b, 0x14, 0x36, 0xa1, 0x0e, 0x94, 0x38, 0x22, 0xde, 0xeb, 0x6a, 0x3c, 0xdf, 0xe0, 0x95, 0xa0, 0x34, 0xfb, 0xa1, 0x43, 0xdf, 0x43, 0x33, 0xa5, 0x57, 0x3c, 0xe9, 0x51, 0x07, 0x0e, 0xce, + 0x63, 0xd7, 0xd1, 0x12, 0xdb, 0xa9, 0xeb, 0x7d, 0x0e, 0xf5, 0xe7, 0x3c, 0x3a, 0x30, 0x54, 0x9c, 0xd9, 0x4c, 0x49, 0x72, 0x1a, 0x00, 0x67, 0xf3, 0x1a, 0x60, 0x6d, 0xe9, 0xba, 0xc6, 0x3f, 0xc2, + 0xa9, 0xd1, 0x0c, 0xf8, 0x55, 0xd9, 0xfd, 0xd2, 0x3f, 0x72, 0x46, 0x24, 0x87, 0x0e, 0xbd, 0x79, 0x15, 0xb9, 0xae, 0xa2, 0x4b, 0xd6, 0xae, 0xbd, 0xdc, 0x59, 0xb6, 0x6c, 0xa3, 0xa0, 0x60, 0x56, + 0x17, 0xde, 0xcf, 0x2b, 0xb1, 0x07, 0x5f, 0x6c, 0x33, 0x0c, 0x1f, 0xe5, 0x09, 0x09, 0x02, 0x0b, 0x28, 0x6a, 0x6a, 0xa1, 0x27, 0x70, 0xe3, 0xeb, 0xa1, 0x6f, 0xeb, 0x88, 0x87, 0x4f, 0xa4, 0x2a, + 0x44, 0x73, 0xec, 0x1e, 0x52, 0xbb, 0xcd, 0x36, 0x29, 0x68, 0x8c, 0x79, 0x25, 0xfc, 0x27, 0x13, 0x48, 0x8c, 0x6a, 0xa5, 0xa9, 0x7b, 0x0c, 0xcb, 0x50, 0x4a, 0xde, 0xe4, 0x40, 0xbd, 0xd8, 0x04, + 0xe7, 0x4c, 0x28, 0x66, 0x6a, 0xa1, 0x74, 0xc0, 0x27, 0x01, 0xf0, 0xb6, 0x12, 0xcd, 0x23, 0xb7, 0xfb, 0xd1, 0xad, 0xcc, 0xed, 0x09, 0xe0, 0xc7, 0x3b, 0x5e, 0x1f, 0x49, 0xc1, 0xf3, 0xb6, 0x37, + 0xc2, 0x66, 0x30, 0x67, 0x65, 0x1b, 0x3b, 0xc9, 0xc0, 0x3f, 0x9a, 0x0b, 0xdd, 0x5a, 0x87, 0x31, 0xc7, 0x75, 0x65, 0xc2, 0x85, 0x9d, 0x08, 0x28, 0x0f, 0x31, 0xdb, 0x53, 0xea, 0x8c, 0xef, 0x48, + 0xfa, 0xa4, 0x98, 0xc1, 0x07, 0xa2, 0xf2, 0x89, 0xf6, 0x04, 0x46, 0x2d, 0x4e, 0xb7, 0xc7, 0x4f, 0xde, 0x21, 0xdb, 0xc2, 0x12, 0x7d, 0x9d, 0xd3, 0x99, 0x0d, 0x13, 0x87, 0x1e, 0xe9, 0x35, 0x24, + 0xa4, 0xb1, 0x67, 0xcd, 0x7e, 0xf4, 0xac, 0xba, 0xa4, 0x73, 0x35, 0x1e, 0x8d, 0x64, 0x88, 0x9f, 0xd8, 0x92, 0xc5, 0x67, 0x7b, 0x07, 0x3c, 0x61, 0xf2, 0xc4, 0x53, 0x6d, 0x43, 0xf9, 0x44, 0x01, + 0xf5, 0x9d, 0x0d, 0x87, 0xb8, 0x6d, 0x96, 0xa1, 0x0e, 0xab, 0x39, 0x1b, 0xa4, 0x0c, 0x6b, 0xa6, 0x72, 0xc4, 0x5d, 0xb9, 0x0c, 0xbe, 0x56, 0x29, 0x8d, 0xf9, 0x50, 0xb3, 0x88, 0x07, 0xa5, 0x5d, + 0x69, 0x14, 0x3d, 0x8d, 0x66, 0x88, 0x78, 0xd8, 0x38, 0x26, 0x51, 0xb5, 0xdf, 0x8e, 0x86, 0xae, 0xfa, 0xfb, 0x03, 0x16, 0x10, 0x7b, 0x21, 0x9e, 0x45, 0x05, 0x28, 0x5e, 0xe7, 0xae, 0x2b, 0x49, + 0x0b, 0xd4, 0x18, 0x7d, 0x5a, 0x74, 0x3b, 0xed, 0xed, 0x80, 0x32, 0xe1, 0x23, 0xdb, 0x9c, 0x04, 0x7e, 0xcc, 0x27, 0x5d, 0x0c, 0x3d, 0x43, 0x86, 0x27, 0xbc, 0x7c, 0x5c, 0xec, 0xb5, 0x28, 0x91, + 0x78, 0xfc, 0x1b, 0xf0, 0x80, 0xfe, 0x6b, 0xc7, 0xcb, 0xac, 0x5f, 0x3c, 0x8e, 0xbf, 0xfd, 0xca, 0xf1, 0xc2, 0xa1, 0x13, 0x1a, 0x5d, 0xf4, 0x30, 0x8f, 0xed, 0x8d, 0xe4, 0x55, 0x9e, 0x15, 0xaf, + 0xcb, 0xf9, 0xad, 0x90, 0x4a, 0xfd, 0xb3, 0xd3, 0xfd, 0x65, 0x99, 0xec, 0xff, 0xea, 0x74, 0xef, 0x9f, 0x0b, 0xea, 0xde, 0x05, 0xfc, 0x57, 0x4e, 0xf7, 0x8b, 0xcf, 0x05, 0xfe, 0xd6, 0xe9, 0xde, + 0x4c, 0xac, 0x33, 0xfa, 0xaf, 0xca, 0xd6, 0xdf, 0xeb, 0xb8, 0xf4, 0xc1, 0x4b, 0x34, 0x24, 0xd3, 0x0c, 0xdb, 0x85, 0x23, 0x19, 0x33, 0xc0, 0x87, 0xa4, 0x8d, 0x0e, 0x2c, 0x18, 0x11, 0x4e, 0x44, + 0xb2, 0x55, 0xdb, 0xad, 0x42, 0x2e, 0x7e, 0xab, 0x1d, 0x6d, 0xfd, 0x3c, 0xaf, 0x34, 0x8c, 0xa6, 0x0e, 0xfa, 0xa4, 0x18, 0x4f, 0x98, 0x78, 0x39, 0x9b, 0xe1, 0x71, 0x8f, 0xa9, 0x6f, 0x96, 0xc3, + 0x93, 0x16, 0x90, 0xb2, 0xb2, 0xfd, 0x8c, 0xb2, 0x85, 0x22, 0x5b, 0xee, 0x4f, 0x1b, 0x1f, 0xf5, 0x0c, 0xc4, 0xeb, 0xf3, 0x7f, 0x3d, 0x08, 0xe7, 0x75, 0xdd, 0x43, 0x66, 0xc4, 0x50, 0x60, 0xe6, + 0x58, 0x91, 0xc1, 0x85, 0xe3, 0xc4, 0x6f, 0x5e, 0x4c, 0x04, 0xec, 0xf8, 0x6d, 0x73, 0x46, 0x61, 0x28, 0x34, 0xc7, 0x88, 0x74, 0xc5, 0xd3, 0x98, 0x1c, 0x38, 0xc3, 0x99, 0xa3, 0xf5, 0xa7, 0x99, + 0x99, 0x29, 0x70, 0x67, 0x66, 0x8a, 0xde, 0xa2, 0x70, 0x81, 0x9b, 0x58, 0x42, 0xaf, 0x25, 0x05, 0x72, 0x91, 0xed, 0x2c, 0xbc, 0x17, 0x36, 0xdd, 0x62, 0x65, 0x8b, 0x4d, 0xe9, 0xed, 0x71, 0xb6, + 0xca, 0x75, 0xb7, 0x7b, 0x3f, 0x9f, 0xd5, 0x8c, 0xad, 0xd5, 0x0d, 0x9a, 0x23, 0xed, 0x09, 0x6b, 0xae, 0x47, 0x97, 0x2d, 0x4b, 0x06, 0x79, 0x7c, 0x32, 0x7f, 0x30, 0xff, 0x66, 0x04, 0xe8, 0x37, + 0x0f, 0x2c, 0xf6, 0xef, 0x1f, 0x58, 0xf2, 0xcb, 0x03, 0x1b, 0x56, 0xbf, 0x7e, 0x60, 0x49, 0x91, 0xe0, 0xf9, 0x63, 0xb4, 0x40, 0xff, 0xcc, 0xd1, 0x65, 0xb9, 0x98, 0x99, 0xe1, 0x7e, 0xa7, 0xfc, + 0xf3, 0xdf, 0x3e, 0xb0, 0xd0, 0xff, 0x77, 0x0f, 0xac, 0xc1, 0xfd, 0x4d, 0x9f, 0x85, 0xa1, 0xce, 0x55, 0x9d, 0xbd, 0x06, 0x58, 0x37, 0x80, 0xc7, 0x22, 0xaa, 0x39, 0xb4, 0x0d, 0x39, 0x14, 0x6b, + 0x11, 0xc1, 0x54, 0x54, 0x05, 0x25, 0xc8, 0x51, 0x9e, 0x72, 0x26, 0xd3, 0x4f, 0xd1, 0xa4, 0xba, 0xea, 0x43, 0x90, 0x5c, 0xbb, 0x85, 0xf9, 0x40, 0x8d, 0x69, 0xc7, 0x4c, 0x93, 0x91, 0xc8, 0x4a, + 0x29, 0x84, 0x76, 0x92, 0x3c, 0xf2, 0xc2, 0x4a, 0x72, 0x33, 0xc5, 0x4c, 0x93, 0x0a, 0x31, 0xbb, 0x02, 0x48, 0x94, 0x69, 0xf4, 0x27, 0xa7, 0x29, 0x2c, 0x75, 0x6c, 0x43, 0x55, 0xaa, 0x13, 0x03, + 0x83, 0xb2, 0xb8, 0x45, 0x45, 0xc2, 0x17, 0xd9, 0x82, 0x27, 0x55, 0x77, 0x48, 0xfb, 0xb0, 0x85, 0xea, 0xdf, 0xf7, 0x59, 0x00, 0x7f, 0x09, 0xff, 0x8c, 0xd7, 0x72, 0xde, 0x63, 0x9b, 0x2c, 0x77, + 0x89, 0xf4, 0xef, 0xb7, 0xbf, 0x6f, 0x29, 0x89, 0xc5, 0xab, 0x0f, 0x06, 0xcc, 0xef, 0xd9, 0x95, 0x0a, 0x1a, 0xd0, 0x45, 0x8f, 0xd5, 0xb9, 0x49, 0x93, 0x3f, 0x22, 0xf5, 0x29, 0xc5, 0x15, 0x32, + 0xa9, 0xa8, 0xad, 0x1e, 0xc1, 0x13, 0x87, 0xc1, 0x46, 0x86, 0xe6, 0x1b, 0x89, 0xfd, 0xe3, 0xba, 0x6b, 0x55, 0x6d, 0x0f, 0xb6, 0x49, 0x4d, 0x92, 0xcb, 0x62, 0x7e, 0x27, 0xd7, 0x2e, 0xb6, 0x06, + 0xb7, 0x1a, 0x5f, 0x86, 0x07, 0xdd, 0x41, 0x21, 0x9f, 0xb4, 0x39, 0xc2, 0x00, 0xcd, 0x63, 0xc4, 0xc9, 0x4d, 0x1e, 0x3f, 0x4a, 0x4a, 0xc0, 0xbf, 0x33, 0xd9, 0x36, 0xae, 0x11, 0xab, 0xd2, 0x6a, + 0xb3, 0x75, 0x67, 0xdd, 0x02, 0x58, 0xbd, 0xb4, 0x37, 0xb2, 0x2a, 0x7c, 0xab, 0xdf, 0x73, 0xf6, 0x69, 0xf6, 0xca, 0x25, 0x57, 0x6b, 0x44, 0x60, 0x35, 0x20, 0x79, 0xfa, 0xaf, 0x2d, 0xc0, 0xf5, + 0x18, 0xd9, 0xa5, 0xd5, 0x1f, 0xd4, 0x77, 0xb7, 0xfd, 0xe0, 0xe8, 0x3f, 0x38, 0x8e, 0xf6, 0x83, 0x3a, 0x34, 0x3f, 0x38, 0xdf, 0x38, 0xe0, 0x9a, 0xf7, 0x52, 0xfd, 0xf0, 0xff, 0x7e, 0x70, 0xb6, + 0x79, 0xeb, 0xfe, 0x09, 0x3f, 0xf8, 0x2f, 0x5f, 0x7f, 0x67, 0x3b, 0x7c, 0x74, 0xb3, 0x2c, 0x0d, 0x6d, 0x3f, 0xf7, 0x6f, 0xfd, 0x6e, 0x28, 0xee, 0x5b, 0x7b, 0x3a, 0xf4, 0x5b, 0x6e, 0x4c, 0x41, + 0xfe, 0x69, 0xec, 0xf7, 0x6b, 0x7b, 0x3a, 0x07, 0x65, 0x6d, 0xd4, 0x8f, 0xad, 0xcc, 0x42, 0x85, 0x83, 0x50, 0x75, 0x14, 0xf8, 0xcb, 0xdb, 0x15, 0xbe, 0xfc, 0xe6, 0xdf, 0x6d, 0x09, 0xf7, 0x25, + 0xff, 0x7a, 0x23, 0x2d, 0x1e, 0x3b, 0x0c, 0xfb, 0x0e, 0xce, 0x31, 0x09, 0x8d, 0x36, 0x61, 0x19, 0x24, 0x76, 0x18, 0x2f, 0x0e, 0xd6, 0x2d, 0x41, 0xce, 0xfd, 0xdd, 0xb5, 0x33, 0x20, 0xf3, 0xc2, + 0x15, 0x85, 0x06, 0xf4, 0x0e, 0x95, 0x35, 0x72, 0x18, 0x2d, 0x0b, 0x15, 0x38, 0x09, 0xbd, 0x42, 0x73, 0x18, 0xcf, 0xf7, 0x14, 0xc5, 0xe7, 0x05, 0x4d, 0x77, 0xa0, 0x43, 0xfd, 0x4e, 0x73, 0x76, + 0xd9, 0x5a, 0x14, 0xc0, 0xb0, 0x2c, 0xfc, 0x44, 0xb7, 0x34, 0x47, 0xa1, 0x81, 0x7f, 0x31, 0x50, 0xc0, 0x0d, 0xbe, 0x7c, 0xaa, 0xff, 0x7c, 0x3b, 0xf4, 0x2a, 0xf3, 0x6b, 0xf9, 0xe5, 0x8d, 0x3c, + 0x08, 0x3a, 0x8d, 0x9a, 0x86, 0xbe, 0x77, 0x61, 0x68, 0xbe, 0xed, 0x5b, 0x4d, 0xeb, 0x59, 0xde, 0x52, 0x38, 0x88, 0xb0, 0x66, 0x0e, 0xe3, 0xba, 0x0e, 0xe3, 0x7a, 0xd0, 0xf1, 0x65, 0x37, 0xf3, + 0xf7, 0x37, 0x06, 0x7e, 0x7c, 0xe7, 0xf1, 0xcb, 0x36, 0x3d, 0xd4, 0xbf, 0xb2, 0x00, 0x2a, 0xf4, 0x1f, 0xd9, 0x21, 0xf4, 0x9b, 0x3f, 0xf5, 0xda, 0x3b, 0x4c, 0x4e, 0x86, 0x0d, 0xd7, 0x7f, 0x0b, + 0x07, 0x04, 0xe9, 0x37, 0x7f, 0xfc, 0xf2, 0x9a, 0x2e, 0x4b, 0xce, 0x6f, 0x91, 0xa9, 0xe7, 0xd5, 0x7c, 0xa4, 0x33, 0xdf, 0x68, 0x29, 0x98, 0x53, 0x7f, 0xd9, 0x88, 0x5f, 0xe5, 0xdd, 0xd7, 0xed, + 0x6a, 0x09, 0x62, 0x94, 0x71, 0x70, 0x8e, 0xba, 0x27, 0x1f, 0xd6, 0x77, 0xba, 0xb8, 0xbb, 0xf5, 0xb2, 0x50, 0x99, 0xdf, 0x61, 0xdb, 0xca, 0xbc, 0x32, 0x26, 0x62, 0xbb, 0x02, 0x29, 0xe2, 0x2f, + 0xb2, 0x14, 0xb7, 0xb2, 0x60, 0xb7, 0x6f, 0xe4, 0xeb, 0x44, 0xe2, 0xf4, 0x0e, 0x96, 0xc2, 0x0a, 0x95, 0x32, 0x45, 0xed, 0x31, 0xed, 0xe0, 0x52, 0xe6, 0x57, 0x38, 0xed, 0xfd, 0x35, 0xfb, 0xaa, + 0x1e, 0xf4, 0xd3, 0x96, 0x4f, 0xcd, 0xa5, 0xe7, 0xef, 0xd3, 0x8a, 0x0a, 0xbf, 0x96, 0xc0, 0xd7, 0xef, 0xe8, 0x27, 0x4d, 0xae, 0xb5, 0x4c, 0xd1, 0xaf, 0x4c, 0x1a, 0x46, 0x1c, 0x2a, 0x73, 0x1c, + 0x8e, 0xe3, 0xb7, 0x5f, 0xf9, 0xc7, 0xef, 0xc9, 0xe5, 0x11, 0x9d, 0xb3, 0xbe, 0x9f, 0x4f, 0xab, 0x2f, 0xf8, 0xac, 0xe3, 0xdb, 0x8c, 0x73, 0x31, 0x5f, 0x7f, 0x14, 0x40, 0x16, 0x0c, 0x43, 0x16, + 0x0c, 0xd7, 0x65, 0xbf, 0x6c, 0x67, 0xf9, 0xf5, 0x1b, 0x23, 0xcd, 0x97, 0x6d, 0xba, 0x5f, 0x7f, 0x61, 0x87, 0x3e, 0xff, 0x8e, 0xa6, 0x02, 0xf8, 0x25, 0x4f, 0xc5, 0x8c, 0x7a, 0x87, 0xfe, 0x9c, + 0x88, 0x37, 0x65, 0xc6, 0x1a, 0x23, 0xa3, 0xa5, 0xd1, 0x19, 0x39, 0x9e, 0xd3, 0x10, 0x42, 0xf4, 0x0f, 0x7c, 0xb5, 0x5a, 0xf7, 0x69, 0xb5, 0x7e, 0xcc, 0xc2, 0x67, 0x4b, 0x2a, 0x83, 0x63, 0x34, + 0xfb, 0xc0, 0x48, 0xee, 0xf0, 0xc2, 0x3a, 0x0b, 0x5b, 0xb1, 0x8b, 0x04, 0x9e, 0x72, 0x8d, 0x57, 0x97, 0x33, 0x6b, 0xd3, 0x0b, 0x36, 0x40, 0x9b, 0xae, 0xcb, 0xa2, 0xcd, 0x23, 0x03, 0x96, 0xee, + 0xfd, 0x91, 0xa8, 0xb5, 0x70, 0xb6, 0x09, 0xb6, 0x9a, 0x88, 0x6a, 0xab, 0xe6, 0x9c, 0xf0, 0x37, 0x29, 0x65, 0x5c, 0x4a, 0x20, 0x15, 0x75, 0x83, 0xce, 0x74, 0xef, 0x8c, 0x4f, 0x3d, 0x65, 0x08, + 0x96, 0x8d, 0xd9, 0x40, 0x8f, 0x14, 0x38, 0xf6, 0x27, 0x4c, 0x83, 0x67, 0x78, 0xcf, 0x17, 0xb4, 0xa6, 0xe1, 0x4a, 0xd3, 0x94, 0x6b, 0x5c, 0xa3, 0x41, 0xf1, 0xa4, 0x5e, 0x3c, 0x36, 0xf1, 0x26, + 0x77, 0xb0, 0xe6, 0x9f, 0x54, 0xf9, 0xe8, 0xfa, 0xea, 0x12, 0xc2, 0x5e, 0x9a, 0x3f, 0x34, 0x92, 0x2b, 0x9a, 0x82, 0x84, 0xd1, 0x3b, 0xb5, 0x36, 0x21, 0xb0, 0x3e, 0x07, 0xb6, 0x2a, 0x77, 0x09, + 0x01, 0x28, 0xf8, 0xa1, 0x90, 0x06, 0x73, 0x30, 0x08, 0xf2, 0xe5, 0x42, 0x93, 0x31, 0x93, 0x23, 0xb9, 0x27, 0xa2, 0xc2, 0x64, 0xeb, 0x79, 0xfa, 0x41, 0x70, 0xe4, 0x10, 0x14, 0xb2, 0x6b, 0x79, + 0x7e, 0xc2, 0xd5, 0x6d, 0xfc, 0xa8, 0x1c, 0xf9, 0xd6, 0xc0, 0xb7, 0xc0, 0xce, 0x48, 0x3b, 0x31, 0x0b, 0x82, 0xae, 0xaf, 0x54, 0x13, 0x21, 0xe2, 0x3c, 0x4d, 0x0a, 0x08, 0x1c, 0x7d, 0xc1, 0xb7, + 0xa0, 0xa1, 0xa8, 0x42, 0x23, 0xf2, 0xc9, 0xb2, 0x78, 0x67, 0x68, 0x93, 0xcd, 0x85, 0x33, 0x96, 0x36, 0xb4, 0x58, 0xcc, 0x69, 0xec, 0x43, 0x2b, 0x86, 0x88, 0xe5, 0xc4, 0x08, 0xe6, 0xe7, 0x4b, + 0xf8, 0x13, 0xdd, 0x6d, 0xa1, 0xb0, 0x3c, 0x20, 0x76, 0x1f, 0x52, 0x35, 0x24, 0xe2, 0xcb, 0x80, 0x48, 0x5f, 0x38, 0x60, 0x90, 0x9b, 0x57, 0xaf, 0x38, 0x25, 0x9f, 0x2c, 0xfe, 0x15, 0x75, 0x1e, + 0x67, 0x45, 0x0a, 0xf0, 0x7b, 0xae, 0x25, 0x9e, 0xa1, 0xd9, 0xe1, 0x81, 0x7d, 0xf8, 0xab, 0x9e, 0x88, 0xb2, 0x13, 0x4e, 0x2d, 0x5c, 0xa8, 0x59, 0xea, 0x06, 0x05, 0xaa, 0xd4, 0x91, 0x5f, 0xb2, + 0xdc, 0x47, 0xe1, 0xdb, 0xef, 0x1c, 0xba, 0x94, 0x26, 0x17, 0xa7, 0x3b, 0x9c, 0xd7, 0x91, 0x8f, 0x5a, 0x7d, 0x4a, 0x80, 0x96, 0x72, 0xd0, 0xd1, 0x0b, 0x78, 0x92, 0xc5, 0x0f, 0xae, 0x15, 0xcb, + 0x15, 0x92, 0xe6, 0x62, 0x28, 0x9a, 0x01, 0xa3, 0xd3, 0x96, 0x79, 0x5a, 0x58, 0x3b, 0x14, 0x25, 0xe9, 0xe3, 0x01, 0x42, 0x9d, 0x10, 0x9f, 0x20, 0x2b, 0x98, 0x6a, 0x20, 0xa3, 0x96, 0x73, 0xd5, + 0x9f, 0x23, 0x79, 0x7d, 0xe4, 0xd7, 0x0b, 0xc7, 0x40, 0xfd, 0x89, 0x92, 0x57, 0x0a, 0xb4, 0x46, 0x69, 0xba, 0xa4, 0x31, 0x0b, 0xc4, 0x07, 0x4d, 0xb7, 0x6a, 0x8d, 0x6b, 0x13, 0x56, 0x7c, 0x73, + 0xc6, 0x5e, 0xa5, 0x3e, 0xc5, 0x28, 0x45, 0x16, 0xc8, 0x73, 0x9e, 0xfb, 0x78, 0x5a, 0xe2, 0x19, 0x8c, 0x4d, 0x62, 0x9e, 0x36, 0xac, 0xbd, 0x0f, 0x4e, 0x9c, 0x47, 0xee, 0x1c, 0xdf, 0xb8, 0x1d, + 0xca, 0xd8, 0xf2, 0xcc, 0xcb, 0xb6, 0x46, 0x6c, 0x20, 0x47, 0x09, 0x5a, 0xf6, 0x0d, 0xbd, 0x04, 0xd1, 0x8b, 0x85, 0x1d, 0xdf, 0x8b, 0x5f, 0xbe, 0x3c, 0x79, 0x46, 0xb5, 0x8b, 0x2e, 0x57, 0xe3, + 0x1e, 0x37, 0x73, 0xd1, 0xe5, 0x11, 0x29, 0x59, 0xf3, 0x97, 0xbf, 0x8d, 0x0d, 0x98, 0x4f, 0x70, 0x6f, 0xc7, 0x9d, 0xd5, 0x6b, 0xf7, 0x87, 0x32, 0x4f, 0xdd, 0x7b, 0x91, 0xa3, 0x8c, 0x85, 0x64, + 0x00, 0xd5, 0xc0, 0x84, 0xdb, 0x1d, 0xa8, 0xa2, 0x04, 0x77, 0x94, 0x9b, 0x52, 0xc1, 0x0f, 0xe1, 0x48, 0x95, 0x65, 0xb8, 0x09, 0x4f, 0x67, 0x3f, 0xed, 0x80, 0xbe, 0xd6, 0x1d, 0xa2, 0x7b, 0x7f, + 0xf0, 0xba, 0x99, 0x64, 0xed, 0x57, 0xc8, 0x1c, 0x23, 0x59, 0x85, 0x93, 0xfc, 0x1a, 0xf2, 0xbf, 0x2e, 0x3b, 0x88, 0x1c, 0x4b, 0x7f, 0x9b, 0xc4, 0xa6, 0x3d, 0x57, 0xfa, 0xc1, 0xc6, 0x7f, 0x4f, + 0xf9, 0xf7, 0xcf, 0x1d, 0x8b, 0x50, 0x71, 0x2c, 0x4b, 0xa3, 0x3f, 0xf1, 0x8a, 0xca, 0x1f, 0xab, 0x0b, 0x1f, 0x3b, 0x23, 0x3d, 0xfb, 0xe1, 0x0f, 0x5b, 0xff, 0xa2, 0xdf, 0x38, 0x18, 0x0b, 0xc2, + 0x4e, 0xbd, 0xa6, 0x8f, 0x1f, 0x69, 0x20, 0x06, 0x5d, 0xf5, 0x32, 0xdf, 0xf2, 0x70, 0x49, 0xe6, 0xed, 0x97, 0xdb, 0xa4, 0x85, 0x05, 0xf9, 0x8e, 0xcf, 0xb7, 0xa2, 0xe3, 0x19, 0x8c, 0xcf, 0x7b, + 0x85, 0xe5, 0xfb, 0x9e, 0xc3, 0x53, 0x8e, 0xe3, 0xdb, 0xb1, 0xcc, 0x1b, 0x2f, 0xad, 0x3a, 0x75, 0x9f, 0xb7, 0x36, 0xdd, 0xfe, 0x91, 0xa6, 0xf1, 0x2b, 0xc5, 0x1e, 0x13, 0x4b, 0x36, 0x6f, 0x30, + 0xdf, 0x27, 0xaa, 0xbf, 0xfe, 0x13, 0xcb, 0x38, 0x86, 0xf3, 0x8d, 0xac, 0xe2, 0xc7, 0x08, 0x0e, 0xd2, 0x5d, 0xfe, 0x4b, 0xb0, 0x06, 0xeb, 0xae, 0x7e, 0x1a, 0xfe, 0x8f, 0x01, 0x9c, 0x2b, 0xdf, + 0xba, 0xcb, 0xc3, 0x86, 0xdb, 0xc0, 0xa6, 0x3f, 0x1c, 0xc0, 0x9f, 0x2d, 0xf9, 0xff, 0xb2, 0x62, 0xe0, 0xcf, 0x96, 0xfc, 0xb7, 0x2b, 0x96, 0x65, 0xf6, 0xb7, 0x07, 0x26, 0xf0, 0xd3, 0x89, 0x59, + 0x7c, 0x25, 0xf6, 0x61, 0xbf, 0x1e, 0x98, 0x05, 0x4f, 0x23, 0x6f, 0x3d, 0x20, 0xf5, 0x12, 0xca, 0xa4, 0x3c, 0x21, 0x6e, 0xdd, 0x30, 0x8f, 0x18, 0xf4, 0x3f, 0x17, 0x1c, 0xc9, 0x14, 0x52, 0x96, + 0x0a, 0xfb, 0xf1, 0xe3, 0xee, 0x35, 0x54, 0x2c, 0x11, 0x2a, 0x35, 0x37, 0x3e, 0x35, 0xd4, 0xb5, 0x16, 0x80, 0x6e, 0x05, 0xfb, 0x38, 0x7b, 0x2a, 0xf0, 0x1d, 0xfe, 0xfa, 0x08, 0xf3, 0x02, 0x5d, + 0xc7, 0x33, 0x2f, 0xc5, 0xd0, 0xad, 0xc5, 0x61, 0x4a, 0x37, 0xde, 0xcf, 0x9f, 0x45, 0x19, 0x54, 0xbd, 0x4c, 0xad, 0x8b, 0xd2, 0xaa, 0xec, 0xae, 0xcd, 0x55, 0xc8, 0xd4, 0x6e, 0xdf, 0xf3, 0x2b, + 0xbc, 0x51, 0x43, 0x8b, 0x9c, 0x64, 0xc3, 0xb3, 0xea, 0x13, 0x19, 0x01, 0x73, 0x7a, 0x2d, 0xb9, 0x35, 0x2f, 0xe1, 0x3d, 0xd7, 0x8f, 0x1c, 0xa4, 0x5f, 0x2a, 0x04, 0x75, 0xe7, 0x34, 0x57, 0x6c, + 0x4c, 0xf8, 0x93, 0xca, 0x96, 0xe5, 0x63, 0x36, 0xa2, 0x8e, 0xfb, 0xc0, 0xe0, 0xa6, 0x7a, 0x18, 0xb5, 0x76, 0xc4, 0x32, 0x2f, 0xd2, 0xa1, 0xe0, 0xdb, 0x86, 0x3d, 0xdc, 0x85, 0x78, 0xe2, 0x0f, + 0x0a, 0x8b, 0xa8, 0xb4, 0x9f, 0x67, 0x60, 0xfc, 0xac, 0xb1, 0x3b, 0x7d, 0xe6, 0x36, 0x3a, 0x2a, 0x33, 0xec, 0x4b, 0xcd, 0xaa, 0x5e, 0xb7, 0x76, 0xd9, 0x1b, 0x2f, 0xa1, 0x82, 0xce, 0xd7, 0x53, + 0x6a, 0xae, 0x5d, 0xe3, 0xf3, 0x0b, 0xa1, 0x85, 0x9a, 0x8e, 0x8a, 0x6a, 0xae, 0x58, 0xbc, 0x8a, 0xa7, 0x17, 0xa6, 0x9a, 0xc2, 0x59, 0x20, 0x9f, 0xf8, 0xd3, 0x55, 0xca, 0x74, 0xb8, 0xae, 0xa5, + 0x00, 0x14, 0x7b, 0xe1, 0x41, 0x17, 0x4d, 0x0b, 0x93, 0x27, 0x7d, 0x89, 0x23, 0xbd, 0x37, 0x76, 0xba, 0x27, 0x7d, 0x5e, 0x8f, 0x5d, 0x60, 0x36, 0x32, 0x59, 0x7b, 0xec, 0x6d, 0xd7, 0x09, 0x1a, + 0x8b, 0x3a, 0x81, 0xdd, 0x4d, 0x24, 0x83, 0x59, 0x9f, 0xd9, 0xae, 0x9f, 0xf9, 0xb9, 0x63, 0x10, 0x08, 0xf8, 0x2e, 0x97, 0xce, 0x7b, 0xc9, 0x88, 0x52, 0xbc, 0x2d, 0xe0, 0x0c, 0x69, 0x26, 0x16, + 0x61, 0x24, 0xde, 0x44, 0x1b, 0x41, 0x30, 0xe9, 0x10, 0x45, 0x5a, 0x9b, 0xe5, 0x4d, 0xc3, 0xce, 0x63, 0xa4, 0x78, 0xe2, 0xa5, 0x99, 0x36, 0x2e, 0x3e, 0x91, 0x93, 0x5b, 0x0f, 0xb2, 0xbb, 0x9c, + 0xf6, 0xe8, 0x0d, 0x1b, 0x85, 0xa2, 0xe3, 0x65, 0x12, 0x7d, 0xf1, 0x08, 0xaa, 0x27, 0x26, 0xad, 0xed, 0xf0, 0xba, 0x8b, 0x45, 0x07, 0xec, 0xe7, 0xa7, 0x7d, 0xcd, 0x15, 0xf5, 0x49, 0xf3, 0xc4, + 0x78, 0x33, 0x65, 0x7b, 0x8f, 0x4c, 0x66, 0x7f, 0x74, 0x15, 0x8f, 0x51, 0x75, 0x94, 0x4b, 0x69, 0xed, 0xfc, 0xac, 0x62, 0xfa, 0xb7, 0x4e, 0x1a, 0x7b, 0xf6, 0x08, 0xa4, 0xa3, 0x9d, 0xba, 0x4d, + 0xd3, 0x53, 0x54, 0x6c, 0x34, 0x14, 0x72, 0x0a, 0x2d, 0x73, 0x75, 0x3e, 0xce, 0x1d, 0xd8, 0x89, 0x01, 0x0e, 0xf9, 0x28, 0x63, 0x5a, 0x5f, 0xb2, 0x2e, 0xb2, 0x84, 0x02, 0xd9, 0x28, 0x29, 0xb3, + 0xe0, 0x39, 0x10, 0x50, 0x0e, 0x15, 0xdd, 0x46, 0xb5, 0xb1, 0x22, 0x5b, 0x9c, 0x33, 0x57, 0x68, 0xcf, 0x9d, 0xa2, 0x98, 0xb3, 0xb5, 0x28, 0xe5, 0x9b, 0x76, 0xdb, 0x1a, 0x7e, 0x13, 0x1c, 0x45, + 0xcf, 0x84, 0xbd, 0x22, 0x5b, 0x6e, 0xe1, 0xfe, 0xa7, 0xc6, 0x80, 0xc1, 0x46, 0xb0, 0x69, 0xa0, 0x69, 0x57, 0xd6, 0xfa, 0xa5, 0x27, 0x95, 0x4d, 0x3b, 0x8e, 0x81, 0x25, 0x0d, 0xca, 0x57, 0xf3, + 0x7a, 0xcf, 0x9d, 0xe5, 0x18, 0x68, 0xc9, 0x62, 0xbc, 0xf6, 0x48, 0x8a, 0xc5, 0xfa, 0xc4, 0xe7, 0x41, 0xa5, 0x71, 0x08, 0x91, 0x89, 0xdf, 0x86, 0xb8, 0x89, 0xb4, 0x75, 0xde, 0xd2, 0x1e, 0x4e, + 0xfa, 0xce, 0x93, 0x39, 0x01, 0xaa, 0x1c, 0x4a, 0x8c, 0x1a, 0x0f, 0xa6, 0x12, 0x22, 0x41, 0xce, 0x85, 0x0c, 0xed, 0xa6, 0xa2, 0x6f, 0x7e, 0x55, 0x3c, 0xfa, 0x15, 0x20, 0x30, 0x35, 0xc5, 0x52, + 0x28, 0xe3, 0xde, 0xaa, 0xf7, 0x10, 0xde, 0x2f, 0xae, 0xa6, 0xda, 0xd3, 0xe9, 0xe4, 0x77, 0xd9, 0xda, 0xc0, 0xbf, 0xc2, 0xcf, 0x7f, 0xd0, 0xdb, 0x44, 0x63, 0x5f, 0xe7, 0xee, 0x6c, 0xc7, 0xff, + 0x14, 0xc0, 0x48, 0x9e, 0x43, 0xa0, 0x0d, 0x0c, 0x77, 0x2d, 0xf1, 0x1d, 0x21, 0x47, 0xe4, 0x05, 0x0b, 0x9f, 0xc3, 0xb5, 0x27, 0xf6, 0x98, 0x84, 0x82, 0xa0, 0x30, 0x3c, 0xa8, 0x3e, 0x5f, 0xb4, + 0xa9, 0x56, 0xa4, 0x6c, 0x55, 0x7a, 0xc5, 0x44, 0xa8, 0x0f, 0xa7, 0x5f, 0xed, 0x35, 0x4b, 0x4c, 0x14, 0x77, 0x9c, 0x9d, 0x51, 0x02, 0xe3, 0x25, 0xb0, 0xb9, 0x53, 0x80, 0x84, 0xcf, 0x48, 0x38, + 0x66, 0xe3, 0x7a, 0x0e, 0xed, 0x48, 0x4f, 0x77, 0xe3, 0x52, 0x1f, 0x63, 0xba, 0x34, 0x42, 0xc8, 0x87, 0xd7, 0x96, 0x33, 0x55, 0x59, 0x86, 0x66, 0xe4, 0x43, 0x62, 0xa3, 0x49, 0x4f, 0x7f, 0x71, + 0x43, 0xec, 0x81, 0xb3, 0x66, 0xe7, 0x64, 0x32, 0x0a, 0xdb, 0x94, 0x3a, 0x9b, 0x54, 0x42, 0xe4, 0x62, 0x6c, 0x1a, 0x3d, 0x8a, 0x03, 0xcf, 0x58, 0x1b, 0x19, 0x83, 0xa0, 0x9c, 0xe0, 0x45, 0x26, + 0x9f, 0xc5, 0x4b, 0x63, 0xa3, 0xd7, 0xa0, 0x4c, 0x5d, 0x89, 0xfe, 0x21, 0x55, 0xe3, 0x9d, 0xf2, 0xd1, 0xb1, 0xc3, 0xf3, 0xa5, 0xa1, 0x5d, 0x8b, 0x45, 0x90, 0x8e, 0x7c, 0xba, 0x2b, 0xba, 0x73, + 0xdd, 0x40, 0x02, 0x21, 0x15, 0xc7, 0x34, 0x38, 0xda, 0x6b, 0x7b, 0xc3, 0xf5, 0x4b, 0x93, 0x32, 0x00, 0x7c, 0x1d, 0xd7, 0x7e, 0xe7, 0x22, 0xae, 0x6d, 0x66, 0xc7, 0x66, 0xe0, 0x56, 0x92, 0x01, + 0x16, 0xd2, 0x36, 0x59, 0xbc, 0x3e, 0x4a, 0x20, 0x5f, 0xca, 0x15, 0x45, 0xfa, 0xe0, 0x7c, 0x1e, 0x07, 0xfd, 0xe4, 0x89, 0xe9, 0xed, 0x7e, 0xec, 0xd7, 0xc6, 0xd8, 0x87, 0x3c, 0x4b, 0xaa, 0x8a, + 0x73, 0xa6, 0x9a, 0x0a, 0x07, 0xc5, 0x82, 0xd9, 0xe7, 0xa1, 0x5a, 0x80, 0xb4, 0xc6, 0x6f, 0x94, 0xc8, 0xc4, 0x87, 0xf9, 0x16, 0xc1, 0x65, 0x2f, 0x64, 0x29, 0x7e, 0x6e, 0x53, 0xa2, 0x51, 0xe1, + 0x9d, 0x47, 0x53, 0x70, 0x56, 0x20, 0x91, 0x17, 0xdd, 0x5b, 0x75, 0xeb, 0xe1, 0x90, 0x6e, 0x90, 0xbe, 0x9e, 0x50, 0xbf, 0x15, 0x67, 0x0e, 0x53, 0xec, 0xe9, 0x2f, 0x23, 0x9a, 0x26, 0x2a, 0x9c, + 0xbd, 0x05, 0x6b, 0xf2, 0x18, 0x0e, 0x10, 0x48, 0x79, 0x40, 0x52, 0xca, 0xa9, 0xe0, 0x5d, 0x8e, 0x28, 0x9b, 0x7d, 0x4d, 0xf4, 0x9d, 0x37, 0xd1, 0x46, 0x1d, 0x43, 0x61, 0xb7, 0x36, 0xf8, 0x6e, + 0xc8, 0x93, 0x8c, 0x04, 0xd0, 0xea, 0x2d, 0x2c, 0x0e, 0xf5, 0x9e, 0x58, 0x62, 0x72, 0x93, 0x89, 0x70, 0x74, 0xe7, 0xb0, 0x53, 0xc5, 0xb4, 0x66, 0x18, 0x1f, 0xa2, 0x56, 0x8d, 0xe0, 0x59, 0x0b, + 0x20, 0x17, 0x78, 0xf3, 0x29, 0xa5, 0xe2, 0xfa, 0x33, 0x6c, 0x08, 0xb1, 0x4f, 0x52, 0x24, 0x2b, 0x88, 0x65, 0xc2, 0xc1, 0x00, 0x31, 0x51, 0x21, 0x9a, 0x3f, 0xa8, 0x6d, 0x27, 0xe7, 0xbb, 0xc9, + 0x71, 0x57, 0x08, 0x1e, 0xae, 0x6d, 0xb5, 0x70, 0x32, 0x4f, 0x56, 0x68, 0x63, 0xfc, 0x7d, 0x7f, 0x3e, 0xd2, 0x54, 0x76, 0x4b, 0x74, 0x77, 0xb2, 0x38, 0xef, 0xc0, 0x83, 0x2f, 0xcd, 0x4c, 0x29, + 0xd9, 0xf9, 0x6a, 0x77, 0xad, 0x9b, 0x25, 0x10, 0x45, 0xed, 0xb8, 0xe6, 0xab, 0x5b, 0x8e, 0xe8, 0x4f, 0xf7, 0xe6, 0x38, 0x5e, 0x83, 0x76, 0xd7, 0x71, 0x8e, 0x73, 0x9e, 0x5c, 0x72, 0x04, 0xd3, + 0x06, 0xd2, 0x52, 0xf9, 0xea, 0x1c, 0x6d, 0xeb, 0x06, 0xdb, 0x45, 0x40, 0xb8, 0xe4, 0x3b, 0xdb, 0xd9, 0xa6, 0x62, 0x73, 0x81, 0xf7, 0x9b, 0x1e, 0x15, 0x6f, 0x6a, 0xaf, 0x6b, 0xcf, 0xaa, 0x2e, + 0x92, 0x84, 0xbe, 0xf0, 0x7d, 0x94, 0x4f, 0x88, 0x97, 0x2f, 0x95, 0x2f, 0x33, 0xd7, 0xdd, 0xec, 0x09, 0x87, 0x64, 0x33, 0xe7, 0x0e, 0xf9, 0xf8, 0xa0, 0x7a, 0x32, 0xbc, 0x06, 0x4e, 0xad, 0x50, + 0x2b, 0x38, 0x24, 0x34, 0x81, 0xc8, 0x72, 0x4c, 0x77, 0xe8, 0x6f, 0x58, 0xc6, 0x1d, 0x47, 0xfb, 0xff, 0xa5, 0x43, 0xf7, 0xd7, 0x2c, 0xe3, 0xb6, 0xf3, 0xb7, 0x0c, 0x80, 0x3f, 0xbd, 0xfe, 0x36, + 0x12, 0x40, 0x5d, 0x96, 0xa5, 0xc9, 0x9f, 0x68, 0x80, 0xe5, 0xfc, 0xba, 0x12, 0xe8, 0x7c, 0xd3, 0xfa, 0xd8, 0xfc, 0x61, 0x24, 0xf0, 0xe1, 0xfe, 0x20, 0x31, 0x52, 0xd3, 0xfa, 0x8f, 0x91, 0x40, + 0xa1, 0x33, 0xbe, 0xdd, 0xe6, 0xa2, 0x70, 0xff, 0x82, 0x54, 0x4f, 0xe2, 0xe8, 0x4c, 0x4e, 0x50, 0xff, 0xce, 0x44, 0xea, 0x27, 0xd2, 0xa7, 0x6f, 0x5d, 0x80, 0xd4, 0x57, 0x10, 0x67, 0x21, 0xd4, + 0x95, 0x8a, 0xd4, 0xf5, 0x23, 0x27, 0xc9, 0x09, 0xe8, 0x2e, 0xbd, 0xff, 0x88, 0xfe, 0x74, 0xf5, 0x2b, 0x38, 0xc1, 0xeb, 0x04, 0x81, 0xfe, 0x21, 0xa9, 0x35, 0xe3, 0x78, 0xd0, 0xf7, 0x01, 0x82, + 0xe8, 0x00, 0xf4, 0x9a, 0xbf, 0x74, 0x37, 0xbd, 0x4d, 0x57, 0xc7, 0xbf, 0x4d, 0x34, 0x7f, 0x41, 0x7d, 0xbf, 0xb8, 0x56, 0x33, 0xe4, 0x1f, 0x68, 0x51, 0x9a, 0x3a, 0x7d, 0x7c, 0x03, 0xc7, 0xf4, + 0x21, 0xf8, 0xa2, 0x8f, 0x45, 0xa1, 0x7e, 0x02, 0xfc, 0x8f, 0xca, 0x3c, 0x0c, 0x9d, 0xea, 0x0c, 0x54, 0xee, 0x5f, 0xbc, 0xfe, 0x97, 0x25, 0xff, 0x0c, 0xb7, 0x07, 0x9d, 0x83, 0xbf, 0xc2, 0x29, + 0x2e, 0x41, 0x95, 0x23, 0x41, 0x95, 0x6f, 0x4c, 0x87, 0x35, 0x7f, 0xea, 0x2c, 0xf9, 0x0d, 0x87, 0x1d, 0xc7, 0xe0, 0xc1, 0x86, 0x0e, 0x68, 0x9d, 0xb1, 0x27, 0xce, 0x3f, 0xe3, 0x36, 0x97, 0x05, + 0xc5, 0xb5, 0xfe, 0xa2, 0x09, 0x12, 0xf8, 0xdd, 0xf8, 0xc1, 0xab, 0x79, 0xa1, 0x6f, 0x7d, 0xfe, 0xa4, 0xbb, 0xa5, 0xee, 0xc4, 0x12, 0x63, 0x41, 0x87, 0x5f, 0x58, 0xb2, 0xf5, 0x9f, 0x12, 0x7b, + 0x04, 0xfb, 0x68, 0xde, 0x4f, 0xa7, 0x45, 0xec, 0x53, 0xc8, 0xa4, 0xf7, 0x59, 0xa2, 0x6f, 0x34, 0xb9, 0x1e, 0xf1, 0xab, 0x79, 0x59, 0x0f, 0x16, 0x10, 0x46, 0x4c, 0x8b, 0x17, 0x23, 0x68, 0x15, + 0x2c, 0x2c, 0xb0, 0xd0, 0xf4, 0xb7, 0xc7, 0x25, 0xec, 0x10, 0x1d, 0xed, 0x5e, 0xc5, 0xfa, 0xee, 0x10, 0xdb, 0x99, 0x69, 0x25, 0x7d, 0xe1, 0x42, 0xef, 0x70, 0x2a, 0x77, 0x79, 0x13, 0xf1, 0x2a, + 0xec, 0xba, 0x33, 0xa4, 0x96, 0x89, 0xee, 0x09, 0x32, 0xd1, 0xe7, 0xdb, 0xca, 0xea, 0x15, 0x32, 0x6b, 0x12, 0x78, 0x21, 0x82, 0x4c, 0x24, 0x34, 0x27, 0x30, 0x90, 0xc5, 0x35, 0x4b, 0x8c, 0x69, + 0xab, 0x49, 0xc8, 0x71, 0xfb, 0xb8, 0x93, 0x3b, 0xec, 0x52, 0x96, 0xc5, 0x11, 0xd1, 0x0f, 0x24, 0x2a, 0xaf, 0xeb, 0xf5, 0xb1, 0xc9, 0x31, 0xad, 0x65, 0xfb, 0xe0, 0x33, 0x55, 0x16, 0x5a, 0xe4, + 0xf0, 0x9a, 0x65, 0x25, 0x56, 0xa1, 0xa4, 0x1f, 0xaa, 0xf3, 0x51, 0xe4, 0xc0, 0x90, 0x9b, 0x17, 0x1a, 0xf3, 0xe7, 0x74, 0x2d, 0x19, 0xf3, 0x02, 0x5b, 0xa7, 0xb0, 0xd0, 0x67, 0x14, 0x34, 0xfa, + 0xb5, 0x53, 0xd8, 0x1a, 0xfb, 0x86, 0x74, 0xc4, 0x23, 0x3f, 0x0e, 0x27, 0xa1, 0x0e, 0x10, 0xf1, 0x51, 0x87, 0xd8, 0x94, 0x9f, 0xa4, 0x18, 0xee, 0xf2, 0x8d, 0x4b, 0x59, 0x53, 0x95, 0xac, 0x0d, + 0x9d, 0x87, 0x45, 0xbd, 0xa7, 0x66, 0x04, 0x1a, 0xf2, 0x9e, 0x37, 0x61, 0x2f, 0x1f, 0x2d, 0xd9, 0x4e, 0xb5, 0x1d, 0x5d, 0x3a, 0x5f, 0xfb, 0x0a, 0x94, 0x74, 0x8c, 0xc4, 0x99, 0xca, 0x09, 0xbe, + 0xa2, 0x78, 0x19, 0x2d, 0x8a, 0x2e, 0xfb, 0x83, 0xa5, 0x84, 0x83, 0x75, 0xaf, 0x5a, 0x9b, 0x7b, 0xf1, 0xc3, 0xdd, 0xb3, 0xac, 0x3f, 0x30, 0x5b, 0x71, 0xc3, 0xe9, 0xa1, 0xcd, 0x42, 0xc4, 0xa1, + 0x31, 0xf0, 0x61, 0x6a, 0x7f, 0x99, 0x7a, 0x37, 0x0b, 0x0b, 0x2e, 0xad, 0x34, 0xd5, 0x5c, 0xf4, 0x0f, 0x71, 0xdd, 0xad, 0x36, 0xf5, 0xcf, 0xbe, 0xba, 0x10, 0xcf, 0x4b, 0xa8, 0xf9, 0x78, 0x05, + 0xcf, 0x8e, 0x19, 0x9e, 0x83, 0x17, 0x18, 0xdd, 0x26, 0x3c, 0x6d, 0x82, 0x5e, 0x28, 0x94, 0x57, 0x8c, 0x8b, 0x56, 0x07, 0x81, 0x49, 0x62, 0x0b, 0xbc, 0x4c, 0x4e, 0x01, 0x0a, 0x8f, 0xa7, 0xfb, + 0xf6, 0xf9, 0xf8, 0x90, 0x9e, 0xdc, 0xa9, 0x72, 0xa4, 0xf1, 0x0a, 0xbd, 0x3c, 0xda, 0xdd, 0x64, 0x33, 0xcd, 0x1d, 0x38, 0xe8, 0x15, 0x09, 0x12, 0x26, 0x97, 0xe4, 0xb3, 0xbc, 0xcd, 0x35, 0xf4, + 0x53, 0xcf, 0xc1, 0x52, 0x15, 0x25, 0xdf, 0x69, 0x55, 0xf7, 0xb4, 0x16, 0xda, 0x99, 0x9e, 0x84, 0xb8, 0x02, 0xae, 0x0c, 0x6e, 0x22, 0x80, 0x77, 0x7b, 0xf0, 0x83, 0xfb, 0x34, 0xc7, 0x23, 0xce, + 0x84, 0x19, 0x2b, 0x53, 0xea, 0xe9, 0xb0, 0x7b, 0x55, 0x44, 0xc8, 0x44, 0xb6, 0xa3, 0x32, 0xbd, 0xf6, 0x8a, 0x8c, 0xfd, 0x20, 0x41, 0x77, 0xcf, 0xa8, 0x9c, 0x88, 0x7f, 0xb0, 0xde, 0x7b, 0xac, + 0xfc, 0xf1, 0x22, 0x95, 0xf5, 0xea, 0xef, 0x2a, 0xf0, 0xc1, 0x70, 0x36, 0xf7, 0x5d, 0x5b, 0x2a, 0x12, 0x80, 0xcf, 0x35, 0x7e, 0xb1, 0xbb, 0x4e, 0x96, 0xbd, 0xdc, 0x20, 0x4b, 0x1f, 0x9d, 0xfd, + 0xeb, 0x61, 0x36, 0x1d, 0xa8, 0x8f, 0x67, 0x87, 0x82, 0xee, 0xa3, 0xb6, 0xfb, 0x92, 0x7f, 0xc6, 0xcf, 0xc7, 0x75, 0xe7, 0x74, 0x73, 0xa7, 0xda, 0xd8, 0x8d, 0x7d, 0xb2, 0x8a, 0xe8, 0x6b, 0x16, + 0x27, 0xcf, 0x38, 0x59, 0xd9, 0x95, 0x15, 0x3b, 0x60, 0x1b, 0x6c, 0x01, 0x12, 0xfe, 0x79, 0x3e, 0x52, 0x30, 0x65, 0x93, 0xa9, 0xd2, 0x41, 0x44, 0xfa, 0x5e, 0x6e, 0x8c, 0x6e, 0xa6, 0xfc, 0x75, + 0xe6, 0xdc, 0xcd, 0x18, 0xba, 0x91, 0x86, 0xdd, 0x7f, 0x7e, 0x7c, 0xc5, 0xe5, 0x47, 0xd5, 0x27, 0xea, 0x8a, 0x56, 0x2c, 0xa4, 0x0b, 0xdc, 0x6f, 0x13, 0x09, 0xc0, 0xef, 0x47, 0x12, 0xbe, 0x85, + 0x19, 0xf2, 0x61, 0x45, 0x3a, 0xf3, 0xa6, 0x05, 0x03, 0xe2, 0x59, 0x2b, 0xaf, 0xa8, 0x70, 0xa4, 0xbc, 0x56, 0x77, 0x9a, 0x31, 0xdc, 0x4c, 0x99, 0x6e, 0xb9, 0x77, 0x1c, 0xff, 0x76, 0xd8, 0x19, + 0xf8, 0x72, 0x20, 0x96, 0x7f, 0x31, 0xaa, 0x20, 0x33, 0x85, 0xdd, 0xb2, 0x3d, 0xa1, 0x8c, 0x50, 0x2a, 0x95, 0xf8, 0x11, 0x7d, 0x44, 0x3f, 0x1d, 0x8d, 0x53, 0x51, 0xe1, 0xa1, 0x81, 0x2b, 0x53, + 0x9f, 0xc8, 0x64, 0x41, 0x69, 0xee, 0xc1, 0x7a, 0x33, 0x90, 0xc9, 0x81, 0xf5, 0x0a, 0xcb, 0x89, 0xd2, 0x3a, 0x6d, 0x8c, 0x53, 0x62, 0xb5, 0x2b, 0x7b, 0x3b, 0x9f, 0x3d, 0xe8, 0x31, 0x49, 0xf3, + 0x69, 0xfd, 0xee, 0x4d, 0xe6, 0x7c, 0xc6, 0xa4, 0xd2, 0x3b, 0xeb, 0x30, 0x42, 0xf4, 0x98, 0xe3, 0xb8, 0xcc, 0x77, 0x32, 0x89, 0x04, 0x83, 0x23, 0x0c, 0x92, 0xa6, 0xbc, 0x5b, 0x57, 0x2b, 0xca, + 0x83, 0xb1, 0xf7, 0x01, 0xaa, 0xba, 0xe4, 0x5e, 0x87, 0x28, 0x8c, 0x5e, 0xde, 0xbf, 0xbc, 0xf7, 0xb5, 0x9b, 0x5e, 0xf5, 0x7e, 0x65, 0x44, 0x6f, 0x14, 0xcb, 0xab, 0x18, 0xca, 0x8b, 0x85, 0xee, + 0x59, 0x7b, 0x08, 0x45, 0xdc, 0x9c, 0x99, 0x2e, 0xc0, 0x69, 0x1a, 0x80, 0xcb, 0x87, 0xae, 0xed, 0x8f, 0x93, 0xbd, 0x1f, 0x47, 0x1c, 0xe1, 0x48, 0xbd, 0xd3, 0xae, 0x28, 0xd2, 0x4b, 0x0b, 0x6c, + 0xb0, 0xa9, 0x70, 0x84, 0x49, 0x7b, 0x06, 0x2e, 0x10, 0x8d, 0xfd, 0x98, 0x70, 0x1b, 0x8b, 0x95, 0xda, 0xa5, 0xaa, 0x3a, 0x2b, 0xa9, 0xf2, 0x88, 0x43, 0x97, 0xe0, 0xe6, 0xc6, 0x7d, 0x3e, 0xd3, + 0x57, 0xf4, 0x6e, 0xae, 0x76, 0xb9, 0xf3, 0x0d, 0x84, 0x6b, 0x97, 0xa9, 0x88, 0xc9, 0xe3, 0xd0, 0x41, 0xb0, 0x37, 0x59, 0x2e, 0xcf, 0xcc, 0xae, 0x27, 0x20, 0x9f, 0x2d, 0x28, 0xdd, 0xe8, 0x5a, + 0x41, 0xb3, 0x74, 0x1d, 0xb9, 0xa9, 0xac, 0x7c, 0x7a, 0x02, 0xc9, 0x9b, 0x23, 0xb7, 0x4f, 0x31, 0x3f, 0x2b, 0xf9, 0xb5, 0x23, 0xab, 0x03, 0xbd, 0xf1, 0x45, 0x15, 0x96, 0xd0, 0x7a, 0x81, 0x64, + 0xd9, 0xd2, 0x93, 0xed, 0xd0, 0xde, 0x27, 0x73, 0x1c, 0x8d, 0xd9, 0xa9, 0x7a, 0x7e, 0x3f, 0x4f, 0x10, 0xdd, 0xce, 0x1a, 0xd0, 0xcf, 0x00, 0x95, 0x8f, 0xea, 0x75, 0x16, 0xa0, 0x61, 0xf9, 0x73, + 0x56, 0x2f, 0x01, 0x5e, 0x83, 0xbe, 0xf0, 0x42, 0xeb, 0x64, 0x5b, 0xe5, 0xc4, 0xd2, 0x24, 0x30, 0xf5, 0xa0, 0x07, 0x26, 0x8b, 0xd5, 0xd6, 0x3e, 0x21, 0x82, 0x09, 0x8b, 0x86, 0x82, 0x64, 0x09, + 0x25, 0x4a, 0x3f, 0x6e, 0x34, 0x39, 0x7b, 0xba, 0x7d, 0x31, 0x13, 0xf8, 0x64, 0x28, 0xc0, 0xee, 0x46, 0xc7, 0x63, 0xcb, 0xd0, 0x65, 0x62, 0xe0, 0x96, 0xf0, 0xd6, 0x22, 0x2a, 0xc2, 0xd8, 0xe1, + 0x50, 0x64, 0xa4, 0xe9, 0x9e, 0x6c, 0x9d, 0x9b, 0xd3, 0x54, 0x23, 0xbc, 0xe1, 0x97, 0xf5, 0x88, 0x54, 0xea, 0x03, 0x2b, 0xdd, 0xad, 0x30, 0xb5, 0x13, 0x08, 0xdb, 0x78, 0x04, 0xf6, 0x70, 0xe5, + 0x61, 0xa3, 0xad, 0x43, 0xf9, 0xe0, 0x60, 0x45, 0x06, 0x5e, 0x09, 0xb5, 0x20, 0xaa, 0xc2, 0x6b, 0xab, 0x60, 0xae, 0xa8, 0x12, 0x41, 0x58, 0xe3, 0xb6, 0x1f, 0x9c, 0x9f, 0x1e, 0x75, 0x58, 0x9d, + 0xeb, 0xd6, 0x6b, 0xc7, 0x32, 0x08, 0xbb, 0xff, 0x2e, 0xd8, 0x3d, 0xbc, 0x3f, 0x25, 0xfc, 0x19, 0x2c, 0x16, 0xaf, 0xd2, 0x72, 0x4b, 0xbb, 0x9a, 0x24, 0x0e, 0x42, 0x7c, 0xaa, 0xfe, 0xb1, 0xd1, + 0x18, 0xf4, 0xbc, 0x80, 0x43, 0x65, 0xea, 0x28, 0x66, 0x9f, 0x7e, 0x50, 0xa0, 0x99, 0x38, 0x21, 0xcd, 0xba, 0x7d, 0x86, 0x28, 0xaa, 0xd6, 0xce, 0xeb, 0xb9, 0xed, 0x42, 0x7a, 0x48, 0x29, 0x70, + 0xf1, 0xc3, 0xae, 0xd9, 0xc8, 0xb0, 0xa4, 0xeb, 0x56, 0x08, 0x9f, 0xec, 0xaf, 0xe1, 0xd3, 0x38, 0x7b, 0x68, 0xd3, 0x59, 0xbe, 0x55, 0xdd, 0x82, 0xa4, 0xe1, 0x48, 0xc0, 0x86, 0x0c, 0x04, 0xdb, + 0x46, 0x93, 0x4e, 0x19, 0xc9, 0x29, 0x72, 0x30, 0x6d, 0x48, 0x28, 0x37, 0xe5, 0x36, 0x12, 0x3b, 0x32, 0x0c, 0x1e, 0x2a, 0x44, 0xf3, 0xbf, 0xc7, 0x1e, 0x3c, 0xcb, 0xfe, 0x67, 0xb1, 0x07, 0xfb, + 0x55, 0x82, 0xa0, 0xfc, 0x49, 0x25, 0x5e, 0xce, 0xf2, 0xe4, 0x73, 0x91, 0xc2, 0x10, 0x3c, 0x8b, 0xdf, 0x48, 0x80, 0xcb, 0x7f, 0x1a, 0x77, 0x30, 0xdf, 0xc8, 0x3f, 0xfe, 0x9b, 0xb8, 0xe3, 0x4b, + 0xd8, 0x01, 0xfc, 0x0f, 0x71, 0x87, 0x60, 0x41, 0xfa, 0x4f, 0x71, 0xc7, 0x97, 0x10, 0x03, 0xd0, 0xdd, 0xe2, 0x34, 0x38, 0xfa, 0xfe, 0x75, 0xdc, 0xf1, 0xe3, 0xb5, 0x7f, 0x11, 0x77, 0x7c, 0x09, + 0x3b, 0x80, 0xff, 0x2a, 0xee, 0xf8, 0x12, 0x76, 0x00, 0xff, 0x38, 0xee, 0xe0, 0x7d, 0xce, 0xba, 0xff, 0xba, 0x80, 0x05, 0x30, 0xbc, 0xbf, 0x4d, 0x3e, 0xc7, 0x8f, 0x95, 0x8e, 0xf4, 0x2d, 0x39, + 0xd4, 0xf6, 0x47, 0x6b, 0x2b, 0xa5, 0x79, 0x51, 0xe7, 0xb3, 0x2e, 0x51, 0x9d, 0xd5, 0xcc, 0x2a, 0x75, 0x9c, 0x67, 0xdd, 0x74, 0x38, 0xc3, 0xac, 0x52, 0xdb, 0x56, 0xb3, 0x16, 0x87, 0x32, 0x11, + 0x63, 0xb2, 0x91, 0x16, 0xfd, 0x13, 0xeb, 0x74, 0x0f, 0xae, 0xe7, 0x68, 0x98, 0x41, 0x80, 0x14, 0x96, 0xd7, 0xfb, 0x16, 0x9c, 0x08, 0xe2, 0x89, 0x2a, 0x45, 0x17, 0x42, 0x7b, 0x1b, 0x62, 0xa6, + 0x43, 0x0c, 0x75, 0x11, 0x67, 0x11, 0x3f, 0x8e, 0x26, 0xf0, 0x09, 0x7d, 0x7d, 0x4c, 0xec, 0xab, 0x60, 0xf3, 0x8e, 0x01, 0x77, 0x43, 0x82, 0x9e, 0x46, 0xad, 0x8b, 0xfc, 0x6f, 0x5a, 0x12, 0x35, + 0x1b, 0x28, 0x43, 0xfd, 0xc0, 0x6f, 0x8f, 0x87, 0x30, 0x8c, 0x6d, 0xf6, 0xbd, 0x1d, 0x0d, 0x89, 0x97, 0xf3, 0xda, 0xf8, 0x53, 0xcd, 0x90, 0x6f, 0x15, 0xb0, 0x9a, 0x61, 0x8a, 0x43, 0x18, 0x68, + 0xaf, 0x58, 0x45, 0x21, 0xbd, 0xb9, 0xde, 0xb0, 0x5c, 0x17, 0xa8, 0x0b, 0xd5, 0x01, 0xc1, 0xa0, 0x81, 0x52, 0xab, 0x7c, 0xea, 0xd0, 0x9f, 0xe0, 0xd5, 0x3f, 0x9b, 0x2a, 0x7e, 0xf4, 0x4f, 0xb8, + 0xb1, 0x47, 0x91, 0x7b, 0x45, 0x09, 0x1b, 0x00, 0x39, 0x08, 0x09, 0xa0, 0x43, 0xba, 0x4d, 0x76, 0xaf, 0xf8, 0xe7, 0xb4, 0xde, 0xa7, 0x20, 0xda, 0xb3, 0x9e, 0xca, 0x16, 0x53, 0x6d, 0x04, 0xc1, + 0xe1, 0x60, 0x6d, 0x30, 0x78, 0x8f, 0x73, 0xd6, 0x9a, 0xa5, 0x35, 0xc1, 0x4f, 0x85, 0x7c, 0x48, 0xc4, 0xf5, 0x64, 0x41, 0xf9, 0x50, 0x5e, 0x2b, 0x99, 0x44, 0x8c, 0xcf, 0x8e, 0x0d, 0x58, 0xd0, + 0xd0, 0x0d, 0xe0, 0xc1, 0xbb, 0x5e, 0x9e, 0x26, 0x31, 0x66, 0x81, 0x56, 0x1f, 0xcd, 0x32, 0xb6, 0x30, 0x88, 0xed, 0xb4, 0xc4, 0x8a, 0xe5, 0x0a, 0xf5, 0xe7, 0x98, 0xb4, 0x8f, 0x0f, 0x1e, 0x8c, + 0xed, 0x3f, 0x39, 0x00, 0x78, 0xff, 0x6f, 0xf1, 0xc7, 0x0f, 0xf6, 0xbf, 0x90, 0xcd, 0xfb, 0xfa, 0xfa, 0xbb, 0xc3, 0x40, 0x78, 0xde, 0x2c, 0x4b, 0x53, 0x3f, 0x4d, 0x26, 0xcb, 0xfe, 0x1c, 0x8d, + 0xb7, 0xeb, 0x90, 0xf9, 0x2b, 0xfa, 0x43, 0x20, 0x52, 0x44, 0xf2, 0xef, 0x65, 0x7b, 0x2c, 0xec, 0x00, 0xb8, 0x6f, 0x75, 0x18, 0x99, 0xa3, 0x7d, 0x2f, 0x0e, 0xcb, 0x32, 0xbd, 0x7f, 0xe6, 0x27, + 0x67, 0x8e, 0x43, 0x72, 0x44, 0x0a, 0x4e, 0x51, 0xfb, 0x8b, 0x65, 0xfc, 0x54, 0xd7, 0x61, 0x8b, 0xe3, 0xf5, 0xc5, 0x32, 0x64, 0xde, 0xd8, 0xd3, 0x9e, 0xd9, 0xd3, 0xee, 0x9b, 0x7d, 0x03, 0xba, + 0x9b, 0x1e, 0xc6, 0xf7, 0x64, 0x1f, 0x8b, 0x7f, 0x39, 0x35, 0xb6, 0x08, 0xa1, 0xd6, 0x1f, 0x55, 0x40, 0xbe, 0x95, 0x78, 0x7f, 0xaa, 0x98, 0x18, 0xdf, 0x49, 0xcd, 0x7f, 0xc9, 0x6b, 0x50, 0x78, + 0xad, 0xc1, 0xc8, 0x82, 0x7c, 0x01, 0x3f, 0xe6, 0x2f, 0x51, 0x9d, 0xf3, 0x6e, 0xdd, 0xe5, 0x31, 0xdd, 0xb5, 0x6e, 0x03, 0xfe, 0x9a, 0xbf, 0xbc, 0xbe, 0x5e, 0xe3, 0x7e, 0xba, 0xf6, 0xa7, 0xdb, + 0xfb, 0xbe, 0x3b, 0xe0, 0xbf, 0xd8, 0xde, 0xf7, 0xdd, 0x01, 0xff, 0xc5, 0xf6, 0xbe, 0xe7, 0x3a, 0x81, 0x3f, 0xac, 0x0e, 0xfd, 0x26, 0xd7, 0x59, 0xdf, 0x71, 0x6b, 0x99, 0x52, 0xe0, 0xa6, 0x5c, + 0xb8, 0x9a, 0xad, 0x88, 0x74, 0xfb, 0xa4, 0x43, 0x1f, 0xc3, 0x7d, 0xb5, 0xd4, 0x27, 0x79, 0x52, 0x9a, 0x8b, 0x1e, 0x08, 0x5a, 0x97, 0x40, 0x39, 0x85, 0xf1, 0x56, 0xb4, 0xe1, 0xdb, 0x84, 0xc3, + 0xd7, 0xc4, 0x59, 0x2c, 0x2f, 0x72, 0xf8, 0x55, 0x32, 0x0a, 0xf3, 0xa8, 0xd3, 0x32, 0xb4, 0x68, 0x7b, 0x26, 0xc2, 0x9e, 0xae, 0x97, 0x65, 0xfb, 0x98, 0xf9, 0xeb, 0x75, 0x7a, 0x84, 0xd8, 0x74, + 0x50, 0x77, 0xf6, 0x1b, 0xb1, 0x50, 0x43, 0xdf, 0x5b, 0x93, 0xf8, 0x8c, 0x78, 0x94, 0xf9, 0x10, 0x07, 0x90, 0x86, 0xd2, 0x72, 0x9c, 0xf7, 0x18, 0x3d, 0xe5, 0x50, 0x50, 0xd0, 0x5d, 0x44, 0x3e, + 0x6e, 0xe9, 0x7b, 0x2c, 0xbd, 0xc6, 0xca, 0x95, 0x9e, 0x6f, 0x2c, 0x91, 0xd0, 0xe4, 0x56, 0x3f, 0x57, 0x66, 0x11, 0x15, 0x2f, 0x0e, 0xbd, 0x86, 0x6a, 0x13, 0xb5, 0xae, 0xf9, 0xd1, 0x7c, 0x86, + 0xe6, 0xbc, 0x1a, 0x63, 0x98, 0xd9, 0xd7, 0xfd, 0x7a, 0x09, 0xae, 0x09, 0xc4, 0x07, 0x38, 0xdc, 0x30, 0x12, 0x88, 0xd6, 0xce, 0x63, 0xa8, 0x36, 0xcf, 0x99, 0x40, 0x49, 0xce, 0x67, 0x6f, 0xb6, + 0xc5, 0xda, 0xe1, 0x7d, 0x36, 0x9f, 0x8f, 0x57, 0x61, 0xa0, 0x0c, 0x34, 0x46, 0x7c, 0x80, 0x8e, 0xe0, 0xa8, 0x36, 0xa4, 0x29, 0xbd, 0x9b, 0x68, 0x78, 0x16, 0xa6, 0x4f, 0x4c, 0x19, 0x49, 0x65, + 0xb4, 0xd0, 0xbd, 0xe2, 0xea, 0x00, 0x01, 0xe6, 0xa9, 0xd6, 0x8c, 0x13, 0xd9, 0xef, 0xf8, 0x33, 0x95, 0x49, 0xfa, 0x6a, 0x8b, 0x55, 0xbb, 0x78, 0xae, 0xf4, 0xb4, 0x61, 0xab, 0x96, 0x1d, 0xe5, + 0xf0, 0xa1, 0xc2, 0x51, 0xf0, 0x6d, 0x9c, 0x2f, 0x83, 0x6c, 0x20, 0xf7, 0x7d, 0x49, 0xf6, 0xa1, 0x1f, 0x15, 0x39, 0x09, 0x22, 0xd5, 0xd8, 0x63, 0xaf, 0x8f, 0xa5, 0x61, 0xa5, 0x74, 0x42, 0xc5, + 0x25, 0xc0, 0x32, 0xd2, 0xb4, 0xcd, 0x35, 0xf2, 0x4c, 0x8c, 0x02, 0xf7, 0x10, 0x9c, 0x50, 0x48, 0x2f, 0x5e, 0xda, 0x30, 0x30, 0x76, 0xa3, 0x44, 0x7a, 0xac, 0x1a, 0x22, 0x87, 0x86, 0xf2, 0x47, + 0x5c, 0x1a, 0xc8, 0x2c, 0x65, 0x94, 0xc1, 0x3a, 0x42, 0x41, 0xa2, 0xe1, 0x34, 0x5e, 0x96, 0x38, 0x92, 0xa5, 0x26, 0x51, 0xd8, 0x8a, 0x38, 0x18, 0x62, 0x56, 0x1d, 0x40, 0x49, 0xd5, 0xed, 0xa7, + 0x1b, 0x0f, 0xd5, 0x1a, 0x9f, 0xab, 0xcf, 0xba, 0x46, 0xa4, 0xec, 0x2e, 0x4a, 0x77, 0xce, 0x2f, 0xf9, 0xc1, 0x84, 0x4d, 0x57, 0xa0, 0x5d, 0x7f, 0x8e, 0xe8, 0xdd, 0x5c, 0xaf, 0x8d, 0xb1, 0xfc, + 0x57, 0xa0, 0xa6, 0x65, 0x5d, 0x88, 0xb4, 0x18, 0x39, 0xb8, 0xd0, 0x22, 0x41, 0xfb, 0xa2, 0xe9, 0xb1, 0xaa, 0x78, 0x76, 0x1d, 0x00, 0x5b, 0xda, 0xcc, 0x3c, 0xc5, 0x6e, 0xa7, 0x7f, 0x4f, 0x01, + 0xc6, 0x07, 0x22, 0x11, 0xa8, 0x88, 0x41, 0xd3, 0x39, 0x8c, 0x57, 0x2b, 0xdd, 0x07, 0x65, 0xa7, 0x9b, 0x63, 0x11, 0xf8, 0x4e, 0x32, 0x0c, 0x15, 0x56, 0xb9, 0x4b, 0x6d, 0xa5, 0x88, 0x6a, 0xfb, + 0xc9, 0x9c, 0xa6, 0x90, 0xf1, 0x8c, 0x7d, 0x77, 0xa9, 0x29, 0x56, 0x2b, 0x40, 0xa7, 0xed, 0x00, 0x65, 0x3b, 0x0a, 0x4f, 0xfa, 0x24, 0x4e, 0xb1, 0xbd, 0xf6, 0xcd, 0x63, 0x23, 0x89, 0x61, 0xc2, + 0xd5, 0xd9, 0x3c, 0xae, 0xa9, 0x04, 0x36, 0xd1, 0x96, 0x7a, 0xbd, 0x33, 0xc1, 0x97, 0x18, 0xb4, 0x63, 0xcc, 0x77, 0x71, 0xf0, 0x90, 0xdb, 0x32, 0xf2, 0xb4, 0xb5, 0xa5, 0xde, 0x5a, 0x05, 0x88, + 0x7b, 0xa4, 0x93, 0x3c, 0x74, 0xb4, 0x91, 0x0c, 0x8c, 0x04, 0xc0, 0x69, 0x0f, 0x98, 0x66, 0xf8, 0xc4, 0xcf, 0x77, 0xa4, 0x33, 0x77, 0xa6, 0x19, 0x7b, 0x2a, 0x2a, 0x7e, 0x18, 0x2f, 0xc9, 0x23, + 0x94, 0xd7, 0x80, 0x0a, 0xd3, 0xef, 0xb9, 0xce, 0xaf, 0x8e, 0xe6, 0x4f, 0x3a, 0x25, 0x3e, 0xdf, 0x80, 0xc8, 0xcf, 0x2a, 0x29, 0x78, 0xa4, 0xed, 0x1e, 0x46, 0x79, 0x10, 0x35, 0xd7, 0x30, 0x33, + 0xd0, 0xed, 0x88, 0xbe, 0x12, 0xbb, 0xeb, 0x86, 0xfe, 0x37, 0x4c, 0x4a, 0x60, 0xc0, 0x12, 0xb0, 0xf9, 0xf2, 0x8d, 0xd7, 0x1b, 0xa3, 0xac, 0x37, 0xad, 0xbc, 0xb3, 0x1b, 0x81, 0xe2, 0x11, 0x98, + 0x14, 0xec, 0x5f, 0x26, 0x46, 0x99, 0x60, 0xc1, 0x08, 0x8d, 0x1d, 0x61, 0xa5, 0x9e, 0xc1, 0xe6, 0x54, 0x44, 0x22, 0x2e, 0x53, 0xc1, 0x8b, 0x4b, 0x18, 0x00, 0x41, 0xdf, 0xd2, 0xa4, 0x29, 0x27, + 0x6d, 0xf7, 0x39, 0x51, 0xa6, 0xfa, 0xda, 0x41, 0x5b, 0x8d, 0xa8, 0xba, 0xa2, 0x2a, 0x68, 0xf2, 0x2d, 0x86, 0x4b, 0x9e, 0x6e, 0x59, 0x3d, 0x70, 0xa7, 0x43, 0xa5, 0x70, 0xf7, 0x43, 0x30, 0x1d, + 0x7d, 0x89, 0x51, 0x41, 0xfb, 0x20, 0x91, 0x33, 0xa3, 0xa6, 0x95, 0x5a, 0xe1, 0xa3, 0x49, 0xdb, 0x0f, 0xd1, 0x9f, 0x40, 0xf4, 0x28, 0x07, 0xcd, 0xf7, 0x78, 0xe8, 0xa3, 0x1a, 0x8b, 0xea, 0xbe, + 0x76, 0xee, 0xcc, 0x25, 0xb4, 0xee, 0xc7, 0x37, 0x5d, 0xa4, 0x1a, 0xcd, 0x9f, 0xc9, 0x07, 0x4d, 0xa7, 0x4f, 0x2e, 0x17, 0x08, 0xa5, 0x5f, 0xbe, 0x58, 0x8b, 0x8e, 0xa3, 0x6c, 0x3a, 0xa8, 0x75, + 0x66, 0x80, 0x8c, 0x9b, 0xfe, 0xfa, 0x14, 0x11, 0x9b, 0xa5, 0xdc, 0x2d, 0x21, 0x22, 0x50, 0x6c, 0x9c, 0xca, 0xd0, 0x99, 0xed, 0x19, 0x9f, 0x47, 0xb3, 0x7a, 0x3a, 0x41, 0x4d, 0x62, 0x8f, 0xf7, + 0xe1, 0x93, 0xc8, 0xf7, 0xb7, 0x29, 0xe3, 0xca, 0xe8, 0x3c, 0xdf, 0x5a, 0xfe, 0x28, 0xa8, 0xd7, 0x94, 0x77, 0x29, 0x15, 0x75, 0xf9, 0xa6, 0xe4, 0xfe, 0xf5, 0x34, 0xb5, 0x86, 0x50, 0x31, 0x87, + 0x6a, 0x96, 0xf9, 0xa5, 0x3c, 0xc6, 0x85, 0xe7, 0x6e, 0xc0, 0x14, 0x9c, 0xfb, 0x91, 0x64, 0xc3, 0x65, 0xcc, 0x62, 0x0d, 0xf3, 0xe4, 0xb2, 0x6f, 0x36, 0xca, 0xdc, 0x7d, 0x87, 0xa3, 0xe5, 0x7a, + 0xc0, 0x57, 0x0d, 0xaa, 0xcd, 0xa9, 0xb6, 0x18, 0x98, 0x2f, 0xde, 0xac, 0xc7, 0x1c, 0x93, 0x2a, 0xad, 0xe9, 0x14, 0x11, 0xbd, 0x98, 0xec, 0x32, 0x42, 0xc2, 0xde, 0x85, 0x6b, 0xdb, 0x52, 0x6d, + 0xc6, 0xdd, 0x04, 0xc0, 0xba, 0xde, 0x96, 0xe3, 0x87, 0xfb, 0xb0, 0x97, 0x57, 0x98, 0x66, 0x6b, 0xe1, 0x8e, 0x01, 0x47, 0x1e, 0x04, 0xf6, 0x26, 0x59, 0xed, 0x52, 0x17, 0x7b, 0x19, 0xc5, 0x97, + 0x4a, 0xa7, 0xae, 0x11, 0xf3, 0xab, 0x80, 0x6d, 0x21, 0xe3, 0x77, 0x6c, 0xce, 0x77, 0xea, 0x87, 0x10, 0xbd, 0x4e, 0x7c, 0x2e, 0xe1, 0xeb, 0x71, 0x1c, 0x57, 0x8a, 0x07, 0xe7, 0x04, 0xb4, 0x1c, + 0xe9, 0x5d, 0x0d, 0x1d, 0xb4, 0x91, 0x7b, 0x07, 0xef, 0x6e, 0x09, 0xa1, 0xb3, 0x6c, 0x10, 0xd4, 0x36, 0xc9, 0xab, 0x6a, 0xad, 0xa3, 0x1a, 0xbb, 0xac, 0xb7, 0xd9, 0x27, 0x8e, 0x64, 0xaa, 0x6a, + 0x25, 0x46, 0xc7, 0xc2, 0x33, 0xf1, 0x71, 0xcc, 0x96, 0x2c, 0xa7, 0xe3, 0x41, 0x3d, 0x93, 0x02, 0xb7, 0x36, 0xc8, 0x7d, 0x7c, 0x9a, 0x39, 0xb7, 0x81, 0xf9, 0xf0, 0x88, 0x38, 0xcd, 0x8b, 0x44, + 0x93, 0x8c, 0xa8, 0xd4, 0xb8, 0x86, 0xd9, 0x6b, 0x25, 0xc5, 0xa0, 0x5d, 0xa4, 0xd0, 0x6c, 0xe6, 0xad, 0xe3, 0x91, 0x0a, 0xe2, 0xc2, 0x05, 0x33, 0x6a, 0x57, 0x0e, 0x93, 0xa1, 0x4d, 0xd7, 0x59, + 0x91, 0x7d, 0xe7, 0x6d, 0xc4, 0x40, 0xbe, 0x4c, 0x46, 0x92, 0xfe, 0xba, 0x69, 0x8a, 0x7d, 0x8c, 0xbc, 0x01, 0x03, 0x65, 0xab, 0x47, 0x79, 0x31, 0x6c, 0xac, 0x7d, 0x20, 0x3d, 0x2e, 0x51, 0xc5, + 0x30, 0x54, 0x0e, 0xc5, 0x9b, 0x1e, 0x1b, 0x66, 0xd7, 0xa1, 0xeb, 0x02, 0xd9, 0x71, 0x34, 0x5d, 0x9a, 0x86, 0x87, 0xa8, 0x15, 0x88, 0x1e, 0xf4, 0x68, 0x77, 0x1a, 0x6f, 0x3f, 0x2e, 0xdc, 0xeb, + 0xdb, 0x32, 0x5f, 0x59, 0x97, 0x5d, 0xd6, 0x9e, 0x0f, 0x93, 0x61, 0x09, 0x01, 0xaa, 0x3c, 0x14, 0x98, 0x85, 0x88, 0x4e, 0xf5, 0x4f, 0x08, 0xb6, 0x5c, 0x24, 0xe0, 0x6e, 0xca, 0x5b, 0x3b, 0xf7, + 0x31, 0x9f, 0x44, 0x45, 0x3b, 0x75, 0xe2, 0x2c, 0x3e, 0x21, 0x08, 0xd1, 0x53, 0x5c, 0xb2, 0xa9, 0x67, 0xc1, 0xbf, 0xe9, 0x43, 0xfb, 0xa7, 0xb1, 0xc9, 0xbf, 0xc1, 0x27, 0xff, 0x20, 0x2a, 0x61, + 0x5b, 0xee, 0x0b, 0x44, 0xf9, 0x89, 0x41, 0x49, 0xd6, 0xd8, 0x2e, 0x0d, 0xce, 0x64, 0x65, 0x62, 0xef, 0xf7, 0x10, 0xe5, 0x0f, 0x84, 0x17, 0xff, 0x73, 0x88, 0x62, 0x70, 0xf4, 0xf5, 0x33, 0x44, + 0x81, 0x7f, 0x86, 0x28, 0xb6, 0x1f, 0xfd, 0x9f, 0x60, 0x0a, 0xf0, 0x13, 0x24, 0x71, 0xe5, 0xdf, 0xc3, 0x94, 0x2f, 0xd7, 0x6a, 0xe6, 0xf1, 0x4f, 0x61, 0xca, 0xff, 0x92, 0x1e, 0x85, 0x74, 0x4e, + 0xfe, 0x0e, 0x53, 0xe6, 0x5f, 0xa6, 0x47, 0x05, 0xbf, 0xfa, 0xdf, 0xa1, 0x0a, 0xf0, 0x53, 0xb3, 0x9d, 0x3a, 0x38, 0x36, 0xce, 0x46, 0xe2, 0x63, 0xdf, 0x0f, 0x88, 0x96, 0x8a, 0x8b, 0x31, 0x49, + 0x97, 0x65, 0x87, 0x22, 0xb1, 0xc9, 0x51, 0x15, 0xa3, 0x8f, 0x86, 0xc8, 0x41, 0xad, 0xd2, 0xba, 0x2b, 0x3d, 0x1b, 0x9d, 0xf6, 0xe5, 0x24, 0x7d, 0xd8, 0x8f, 0x0f, 0xad, 0x95, 0x4c, 0xd4, 0xde, + 0x69, 0xca, 0x44, 0x17, 0x80, 0x96, 0x60, 0x0c, 0xeb, 0xb7, 0xc0, 0x90, 0x85, 0x2c, 0x21, 0x7c, 0xc0, 0xc0, 0x3c, 0xf5, 0xf1, 0x0f, 0xc9, 0x03, 0x75, 0xd8, 0x94, 0xef, 0xcf, 0x1d, 0x3f, 0x62, + 0xad, 0x80, 0xd5, 0xb5, 0x6c, 0xb6, 0xa0, 0x67, 0xde, 0xcc, 0x86, 0x80, 0xa4, 0x2a, 0x1e, 0xd7, 0x4a, 0x2b, 0xea, 0xfb, 0xd7, 0x50, 0xe5, 0x1b, 0x4f, 0x91, 0xb0, 0xab, 0xe1, 0x16, 0xe6, 0xd0, + 0x20, 0x4e, 0xf7, 0xbb, 0x58, 0x63, 0x41, 0x44, 0x90, 0x50, 0x4d, 0x5a, 0x30, 0x7e, 0xfd, 0x53, 0xa8, 0x12, 0x90, 0x63, 0x0e, 0xe0, 0x19, 0xe1, 0x14, 0xef, 0xd9, 0x98, 0x58, 0xb8, 0xf1, 0x92, + 0x24, 0x4e, 0xc7, 0x2d, 0xc4, 0x9b, 0x3f, 0x2b, 0xad, 0xfd, 0x16, 0xaa, 0x14, 0xf4, 0xd7, 0xbe, 0x3c, 0x8b, 0x55, 0xf1, 0x86, 0x55, 0x00, 0x03, 0xdc, 0x47, 0xd8, 0x7e, 0xc5, 0xd7, 0x6a, 0xcf, + 0xca, 0xcb, 0x3c, 0x5e, 0x51, 0x26, 0x06, 0xcc, 0xbc, 0x2c, 0x19, 0xb5, 0x83, 0xf0, 0xfb, 0x99, 0x8a, 0xbb, 0x64, 0xea, 0xf7, 0xb0, 0x44, 0xe7, 0x8b, 0x7b, 0x7c, 0xce, 0x18, 0x8d, 0xcc, 0x82, + 0xa2, 0x73, 0x2f, 0x22, 0x59, 0x9d, 0x43, 0x11, 0xf9, 0x2a, 0x3a, 0x57, 0x8f, 0x8b, 0x12, 0xd7, 0x3b, 0xa0, 0x23, 0x64, 0x58, 0x9a, 0xe7, 0x80, 0xba, 0x6f, 0x5b, 0xd2, 0x89, 0xa7, 0xe2, 0x5e, + 0x9d, 0x38, 0xf0, 0x7e, 0xf0, 0xd0, 0x1d, 0x0e, 0xb9, 0xb7, 0x38, 0x9a, 0x95, 0xf2, 0x59, 0xe3, 0x0c, 0xc8, 0x54, 0xdd, 0x70, 0xa6, 0xce, 0xdf, 0xd4, 0x4a, 0xbe, 0xc9, 0x22, 0x39, 0x55, 0xf1, + 0x73, 0x7b, 0xea, 0xff, 0xfb, 0xc1, 0x7e, 0xfe, 0x99, 0xf9, 0xff, 0x9d, 0xa9, 0xff, 0x96, 0x68, 0xc1, 0xb4, 0xf3, 0x37, 0x41, 0x63, 0xfa, 0x7d, 0x60, 0x7e, 0xeb, 0x98, 0xc9, 0xc3, 0xf6, 0xf9, + 0xdf, 0x02, 0x11, 0xfd, 0x2b, 0x2d, 0x12, 0xc7, 0x17, 0x3a, 0xf3, 0xa3, 0xfe, 0xd1, 0xa9, 0x87, 0x80, 0x8d, 0x9c, 0x7b, 0xd4, 0x09, 0x8b, 0x87, 0xb4, 0x7d, 0xf2, 0xf3, 0xa3, 0xcb, 0x7c, 0xed, + 0x4a, 0xab, 0xa3, 0x93, 0xbf, 0x69, 0xfb, 0x7b, 0x1f, 0x29, 0xdb, 0x64, 0xcb, 0x57, 0x41, 0x20, 0xc1, 0x18, 0x63, 0x04, 0xfb, 0xc5, 0x3d, 0xfd, 0xeb, 0x3d, 0xe0, 0x17, 0x37, 0x7f, 0x34, 0x59, + 0xeb, 0xd4, 0xeb, 0xef, 0x44, 0x0b, 0xf4, 0xf1, 0x8d, 0x12, 0xe9, 0x37, 0xd7, 0x6a, 0x46, 0xd7, 0x1d, 0xfa, 0x90, 0x7e, 0x12, 0x28, 0xcd, 0xbe, 0x0a, 0x27, 0x01, 0x51, 0x70, 0xba, 0xef, 0x20, + 0xfb, 0x55, 0x73, 0xaa, 0xe6, 0x30, 0x8e, 0x51, 0xf3, 0xae, 0xce, 0xf0, 0xdf, 0x5b, 0x01, 0xd5, 0x5f, 0xed, 0xe0, 0x17, 0xf7, 0xe8, 0xf3, 0xe7, 0x7b, 0xc0, 0xb7, 0x9b, 0xff, 0x6c, 0xfe, 0xe9, + 0x6b, 0x3d, 0x42, 0xf1, 0xa4, 0xa7, 0xf4, 0x52, 0xe3, 0xbd, 0x5f, 0x04, 0x7d, 0x24, 0x5e, 0xaf, 0xd4, 0x60, 0x5f, 0x22, 0x64, 0x5b, 0xcb, 0x02, 0x14, 0xb3, 0x2d, 0x9f, 0xdb, 0x9a, 0xbc, 0xd4, + 0x27, 0xb7, 0xf1, 0xa2, 0xa3, 0x9f, 0x4e, 0x93, 0xa0, 0x8f, 0x51, 0x5d, 0x6e, 0x71, 0x91, 0xcb, 0xf9, 0x4c, 0xde, 0x0a, 0x94, 0xbe, 0xaf, 0xc7, 0xe9, 0x9a, 0x9e, 0x6d, 0x95, 0x04, 0x3f, 0x67, + 0x22, 0x3c, 0x8b, 0xf0, 0xf0, 0xd9, 0x5c, 0x77, 0xf0, 0x99, 0x0d, 0x6e, 0xe2, 0x62, 0x73, 0x0a, 0x7d, 0xe4, 0x01, 0xb4, 0x37, 0x3d, 0x77, 0x37, 0xfb, 0x2a, 0xa4, 0x5e, 0xb9, 0xa8, 0xcb, 0x17, + 0xa3, 0x58, 0x89, 0xa7, 0x74, 0x1a, 0x84, 0xe0, 0xb9, 0x53, 0x1a, 0x5e, 0x39, 0xa9, 0xe2, 0xc0, 0xa2, 0x62, 0xc4, 0x9b, 0x9f, 0xc5, 0x51, 0x77, 0xd1, 0xd6, 0x65, 0xfb, 0xe4, 0xde, 0x46, 0x4a, + 0xbd, 0xe4, 0x59, 0x58, 0xba, 0xc4, 0x6f, 0x94, 0x09, 0xd5, 0xad, 0x44, 0x00, 0xf6, 0x4d, 0x59, 0xf5, 0xe2, 0xdd, 0x49, 0x7b, 0x87, 0x3f, 0x9f, 0x53, 0xbd, 0x69, 0x20, 0x58, 0x74, 0x86, 0x05, + 0xbd, 0xe8, 0xa8, 0xca, 0x1e, 0x0d, 0x87, 0xf6, 0xf0, 0x73, 0x92, 0x3f, 0xea, 0xaa, 0x1c, 0x5a, 0xbf, 0xf7, 0xbb, 0x62, 0x12, 0x89, 0xff, 0xaa, 0x1c, 0xe9, 0xd2, 0x79, 0x3a, 0xc5, 0x1e, 0xc8, + 0xfb, 0xca, 0x10, 0x01, 0xc4, 0xcc, 0x49, 0x07, 0x5e, 0xea, 0x04, 0x8d, 0xaf, 0xe4, 0x6e, 0xbd, 0xc1, 0x61, 0x10, 0x94, 0xaa, 0x35, 0x55, 0xb9, 0x29, 0xb6, 0x88, 0xc2, 0x8f, 0x1c, 0x48, 0xce, + 0x01, 0xb3, 0xfa, 0x93, 0x82, 0xa1, 0xe7, 0x35, 0x69, 0x49, 0x6f, 0xf5, 0x79, 0xe8, 0x59, 0x6b, 0xf3, 0x12, 0x99, 0xdb, 0xcf, 0x1d, 0xb0, 0x7f, 0x92, 0x1e, 0x6d, 0xd7, 0x86, 0x41, 0xcd, 0xcd, + 0x59, 0x81, 0xc0, 0xfb, 0x7e, 0x5f, 0x66, 0xee, 0x2c, 0x0a, 0xf7, 0x46, 0x49, 0x13, 0x44, 0x24, 0xc6, 0x08, 0x1b, 0x22, 0xc9, 0x97, 0xbd, 0xae, 0xca, 0x24, 0xbb, 0x87, 0xb9, 0x80, 0xa7, 0x26, + 0xbc, 0x30, 0x05, 0x42, 0x86, 0x80, 0xf2, 0xaa, 0x5d, 0xb8, 0xfc, 0x0e, 0xdb, 0x2a, 0xdd, 0xb7, 0xad, 0xc6, 0xf2, 0x5b, 0xf3, 0x59, 0x9f, 0x6e, 0x15, 0x74, 0x10, 0x6e, 0x02, 0x41, 0xb1, 0x4a, + 0xe4, 0x11, 0x21, 0x4e, 0x98, 0x1e, 0xbb, 0xc4, 0xa3, 0xf8, 0x3b, 0x59, 0x64, 0xab, 0x84, 0x1f, 0x66, 0x5c, 0x0a, 0x35, 0x85, 0xc2, 0x59, 0x67, 0xb7, 0x98, 0xa5, 0x26, 0x86, 0xc5, 0xba, 0xa1, + 0x4b, 0x0b, 0x26, 0x4a, 0x99, 0x9f, 0x8d, 0x23, 0x5b, 0xcc, 0x1b, 0x2c, 0xe7, 0x60, 0xc1, 0x1e, 0x24, 0x86, 0x47, 0x99, 0x14, 0xdb, 0x05, 0xb0, 0x9a, 0x51, 0xc6, 0x45, 0x3b, 0x2d, 0x56, 0xf4, + 0x8c, 0xe3, 0x38, 0x3e, 0x5e, 0x34, 0xfc, 0x48, 0xfb, 0xb7, 0x2a, 0x43, 0x6f, 0x3e, 0xca, 0x8e, 0xc2, 0x9a, 0x86, 0xae, 0xf7, 0xb2, 0xbe, 0x9e, 0x44, 0xc6, 0x62, 0x73, 0x04, 0xe3, 0x02, 0xe5, + 0xd3, 0xa7, 0x4c, 0x8c, 0xf5, 0x81, 0x77, 0x22, 0xa6, 0xbf, 0x4f, 0xe0, 0x3b, 0x28, 0x11, 0x59, 0x7f, 0x01, 0xd0, 0xe7, 0xf1, 0xd1, 0x19, 0x09, 0x2f, 0x53, 0xf2, 0x76, 0x5e, 0xa1, 0x9a, 0x04, + 0x96, 0xa7, 0x49, 0x63, 0xe4, 0x52, 0x86, 0xc6, 0xf2, 0xbd, 0xd0, 0x06, 0xd6, 0x3b, 0x3a, 0x70, 0xfc, 0xf5, 0x09, 0xee, 0x5a, 0x1f, 0xa3, 0x39, 0x3e, 0x59, 0x3b, 0x6c, 0x37, 0x6e, 0x48, 0xe3, + 0x50, 0x70, 0xce, 0x38, 0x79, 0x3f, 0x6a, 0x65, 0x4f, 0x79, 0xb0, 0x31, 0x80, 0x84, 0x28, 0x36, 0x54, 0xcc, 0xb6, 0x2b, 0x5a, 0xec, 0x35, 0xb2, 0xbc, 0xaa, 0xa0, 0xe3, 0x54, 0x36, 0xf0, 0x26, + 0xce, 0x6d, 0x98, 0x19, 0xfa, 0xfd, 0x4e, 0x73, 0xbd, 0xf8, 0x44, 0x82, 0xa8, 0x93, 0x2a, 0x7f, 0xed, 0xbf, 0xaa, 0x47, 0xfc, 0x51, 0x89, 0xe0, 0x9f, 0xd1, 0x21, 0x39, 0x5b, 0x42, 0x07, 0x75, + 0x73, 0xbe, 0xaa, 0x61, 0xfb, 0x54, 0xf0, 0x79, 0x07, 0xe7, 0x83, 0x79, 0x5c, 0x62, 0xe6, 0x0e, 0xdc, 0xef, 0x30, 0xc3, 0x5f, 0xfe, 0xf1, 0x9f, 0xce, 0x4a, 0x15, 0x57, 0xb8, 0x3e, 0x0d, 0x89, + 0x6a, 0x7d, 0xcd, 0x00, 0xfa, 0x85, 0xe6, 0x07, 0x45, 0x18, 0xf1, 0xf6, 0xb6, 0x4a, 0x83, 0x48, 0xe7, 0xb7, 0xf2, 0x7a, 0xf2, 0x19, 0x06, 0x77, 0x41, 0x34, 0xf9, 0xdb, 0xf0, 0x92, 0x33, 0x92, + 0x1e, 0x66, 0x3b, 0x99, 0xd3, 0x20, 0x05, 0xe3, 0xcf, 0x21, 0x38, 0x11, 0x1c, 0x3a, 0xe0, 0x91, 0xa2, 0x15, 0x1f, 0x8b, 0xab, 0x7c, 0x16, 0x14, 0x9a, 0x0b, 0x97, 0xad, 0xbc, 0x21, 0xa0, 0xf5, + 0x09, 0x3a, 0xc7, 0x9e, 0x71, 0xce, 0xc4, 0x1c, 0x0f, 0xc7, 0xe1, 0xf2, 0x54, 0x6f, 0x93, 0xf0, 0x51, 0x94, 0x67, 0xae, 0x59, 0x7d, 0xcd, 0xdd, 0xed, 0x81, 0x8b, 0x55, 0x94, 0x43, 0xfe, 0xe1, + 0xad, 0x3b, 0xc3, 0xf5, 0xf9, 0x09, 0xe3, 0xf8, 0xb1, 0xb8, 0xda, 0xc9, 0xa9, 0x71, 0x67, 0xea, 0x86, 0xb9, 0xc8, 0x39, 0x57, 0x4b, 0x9f, 0x39, 0x02, 0x98, 0xdb, 0x40, 0x7c, 0x9a, 0xae, 0xd4, + 0xb9, 0x35, 0x64, 0x16, 0x3f, 0xde, 0xc6, 0xdc, 0x7a, 0x8f, 0x8b, 0x0b, 0x0d, 0x33, 0x23, 0x77, 0x8a, 0xe7, 0x78, 0xbb, 0x23, 0x57, 0xad, 0xde, 0xbd, 0x88, 0x16, 0x3b, 0x88, 0xdd, 0x2a, 0x3f, + 0xab, 0xdf, 0xfc, 0xe9, 0x65, 0xb0, 0x67, 0x97, 0xa7, 0x81, 0xe0, 0x5d, 0x40, 0x9c, 0x43, 0xca, 0x08, 0x57, 0x07, 0x08, 0x39, 0x85, 0x61, 0x52, 0x0f, 0x86, 0xd9, 0x02, 0x4e, 0xcd, 0xe9, 0x3f, + 0xe2, 0xc1, 0x9f, 0x82, 0x47, 0x39, 0xee, 0xfb, 0x27, 0xe5, 0xb8, 0xf1, 0x00, 0x71, 0xd6, 0xde, 0x50, 0xb6, 0x39, 0x02, 0x05, 0xec, 0xe1, 0x3a, 0xbf, 0x1f, 0x56, 0x1a, 0x09, 0x24, 0x6d, 0x56, + 0xd1, 0x5c, 0xe0, 0x98, 0xa1, 0xeb, 0x2d, 0xf8, 0x24, 0xd5, 0xfe, 0x62, 0x66, 0x00, 0x75, 0x17, 0xb7, 0x3e, 0x55, 0x1d, 0x6b, 0xf8, 0xb7, 0x23, 0x8d, 0xf7, 0x20, 0x65, 0xe3, 0x49, 0xc4, 0xe9, + 0x07, 0xd3, 0x64, 0x69, 0xc7, 0x23, 0xf1, 0x2a, 0xe6, 0x49, 0xbc, 0xd6, 0xb0, 0x43, 0x69, 0x26, 0x53, 0x88, 0x15, 0xdc, 0xe8, 0x47, 0xe5, 0xa1, 0x8f, 0x42, 0x4d, 0xde, 0xea, 0xc9, 0x86, 0xe9, + 0x6b, 0xa3, 0xd2, 0x3b, 0x25, 0x05, 0x06, 0x06, 0xa0, 0x3a, 0x1e, 0x7b, 0x33, 0x26, 0x18, 0x83, 0xda, 0x98, 0xae, 0x43, 0xd0, 0x62, 0x50, 0x1c, 0xa1, 0x93, 0x9e, 0xe8, 0xe2, 0x45, 0xd2, 0xd8, + 0x4c, 0x5d, 0xcb, 0x11, 0xb8, 0x24, 0xb9, 0xe6, 0x11, 0xa1, 0xc1, 0xbd, 0x7b, 0x17, 0xa2, 0x77, 0xb9, 0x90, 0x93, 0xbd, 0x0c, 0xde, 0xb0, 0x2b, 0xef, 0xc1, 0x67, 0x19, 0x69, 0x4a, 0xb7, 0x3f, + 0x0f, 0x17, 0xd8, 0x5c, 0xba, 0x66, 0xa0, 0xeb, 0xc5, 0x6b, 0xa0, 0xd8, 0xae, 0x5d, 0x1c, 0xcc, 0x4e, 0xec, 0x9f, 0x57, 0x73, 0x6b, 0x8b, 0x5f, 0xf9, 0xe6, 0x53, 0xa3, 0xbd, 0x17, 0xae, 0x3b, + 0xb9, 0x98, 0xf0, 0x91, 0x61, 0xf8, 0x7a, 0x9f, 0xcc, 0x2b, 0x75, 0x82, 0xbb, 0xa2, 0x78, 0x7c, 0xae, 0x16, 0xdc, 0x06, 0x3e, 0x19, 0x3c, 0x1b, 0x3f, 0x1f, 0x79, 0x55, 0x81, 0x21, 0x66, 0x20, + 0xe5, 0x9d, 0xdf, 0xaf, 0x66, 0x97, 0x35, 0xe1, 0x4d, 0x9d, 0x64, 0xbd, 0x9b, 0xa6, 0x92, 0x36, 0x3b, 0x83, 0x53, 0xf8, 0xc5, 0x6f, 0xbd, 0xb5, 0x46, 0x16, 0x5f, 0x7c, 0x7a, 0xc2, 0x26, 0x1b, + 0x52, 0x0a, 0x7c, 0x50, 0xd3, 0x3c, 0xc3, 0x79, 0x42, 0x91, 0xde, 0x9a, 0x12, 0x1c, 0x37, 0x19, 0x9e, 0x51, 0xbe, 0x17, 0x9c, 0xe0, 0x0a, 0x28, 0xdc, 0x47, 0xb3, 0xfd, 0xd1, 0x1c, 0x78, 0x5b, + 0xbe, 0x8c, 0xea, 0xe8, 0x52, 0xcf, 0x2f, 0xe9, 0x1e, 0x81, 0x9b, 0x56, 0x39, 0xc4, 0x00, 0xc3, 0xcb, 0xf1, 0x4c, 0x26, 0x76, 0x20, 0x23, 0x6d, 0xb0, 0x5d, 0x7c, 0x81, 0x0b, 0x2d, 0x64, 0xbb, + 0x9c, 0x63, 0xfc, 0x59, 0x19, 0x19, 0xfa, 0x2f, 0xfd, 0xfb, 0x5f, 0x88, 0x20, 0xb2, 0xff, 0x81, 0x08, 0x22, 0xfb, 0x76, 0x59, 0x96, 0xce, 0xc1, 0x9f, 0x55, 0x68, 0x9c, 0x31, 0xe0, 0x54, 0xe2, + 0xcd, 0xa9, 0x2b, 0x6d, 0x27, 0xe4, 0x3c, 0x54, 0xd0, 0xf3, 0xf9, 0xbb, 0xa1, 0x94, 0x5f, 0x0b, 0x20, 0xf2, 0x87, 0xc2, 0x01, 0xff, 0x95, 0x00, 0x62, 0xcc, 0xf1, 0x03, 0xf0, 0xaf, 0x05, 0x10, + 0xaf, 0x5f, 0x08, 0x20, 0xde, 0x34, 0xac, 0x73, 0xcd, 0x61, 0xba, 0x16, 0xa6, 0xdf, 0xf6, 0x1b, 0xf8, 0xda, 0xe3, 0x5e, 0x7f, 0xbf, 0xe8, 0x61, 0xfa, 0x6d, 0xfc, 0x9f, 0x04, 0x10, 0xbf, 0x04, + 0x11, 0xc0, 0x7f, 0x25, 0x80, 0xf8, 0x25, 0xa2, 0x01, 0x7e, 0x21, 0x80, 0xc8, 0x7d, 0xd5, 0x20, 0x93, 0xa2, 0x83, 0xa7, 0x23, 0xe9, 0x47, 0x3c, 0xc5, 0xd2, 0x56, 0x24, 0xa8, 0x18, 0xcf, 0xd3, + 0xac, 0xcc, 0x45, 0x05, 0xcd, 0xbb, 0x66, 0x6b, 0x1d, 0x7a, 0xf4, 0x4a, 0xcb, 0x8a, 0x44, 0x5e, 0xe2, 0x73, 0xc1, 0xfa, 0x2a, 0xf7, 0xa6, 0x5a, 0x98, 0xb2, 0x19, 0xf0, 0x59, 0x37, 0xf1, 0x3e, + 0x8f, 0x89, 0xa2, 0x9b, 0xe6, 0x38, 0x96, 0xaa, 0x27, 0xd7, 0x49, 0xc1, 0x54, 0x86, 0xcb, 0x34, 0x7a, 0xbe, 0xa5, 0x26, 0x93, 0x95, 0xed, 0xaa, 0xc2, 0xb8, 0x96, 0x82, 0x8c, 0xcc, 0x76, 0xab, + 0x9b, 0x14, 0x4d, 0x0e, 0xb1, 0x60, 0x44, 0x4c, 0x0b, 0xaa, 0x7b, 0x6f, 0x89, 0x32, 0x2c, 0x3c, 0xab, 0x80, 0x83, 0xe9, 0x04, 0x30, 0xdc, 0xf4, 0xf5, 0x5e, 0x92, 0x14, 0xb1, 0x0d, 0x63, 0x94, + 0x9f, 0x96, 0x01, 0xbe, 0xa9, 0xe0, 0x16, 0xed, 0x01, 0xb6, 0x0e, 0xaf, 0xfe, 0x13, 0x01, 0x8f, 0x3f, 0x4e, 0x06, 0x65, 0xc0, 0x2f, 0x13, 0x3c, 0x8e, 0x9c, 0x7a, 0xb3, 0xf9, 0xe2, 0xfa, 0x91, + 0x29, 0xcc, 0xf5, 0xa3, 0x56, 0x39, 0xe1, 0xce, 0xd1, 0x05, 0x79, 0x62, 0xf4, 0xa7, 0xca, 0x80, 0xbf, 0x84, 0x98, 0xc0, 0x97, 0xe0, 0xee, 0x4d, 0xd3, 0x47, 0x6c, 0xc9, 0x87, 0xb2, 0x64, 0x63, + 0x40, 0xdd, 0x3e, 0x4e, 0x68, 0xfd, 0x45, 0x5f, 0x7a, 0xad, 0xbf, 0xb2, 0x3c, 0x3a, 0x92, 0x88, 0x0a, 0x15, 0x6f, 0xb4, 0x4d, 0x37, 0x52, 0xd4, 0xf4, 0x7c, 0x5e, 0x85, 0xec, 0x8c, 0x4a, 0xca, + 0xe8, 0x41, 0x07, 0x2b, 0x6a, 0xc0, 0x60, 0x3c, 0xa8, 0x80, 0x8e, 0xb9, 0x36, 0x00, 0x5d, 0xf3, 0x34, 0x72, 0x5b, 0x85, 0x5e, 0xd4, 0x8f, 0xae, 0x69, 0xd8, 0x75, 0xa8, 0x73, 0x41, 0xa5, 0xb2, + 0x44, 0x69, 0xcf, 0xda, 0x1e, 0x1e, 0x15, 0xf5, 0x29, 0x86, 0xfa, 0x2d, 0x4a, 0x74, 0xce, 0x9a, 0x7d, 0xec, 0x3e, 0x52, 0xb5, 0x22, 0x72, 0x8a, 0x58, 0x64, 0xe6, 0x15, 0xd0, 0x94, 0xe6, 0xdd, + 0x1d, 0xf5, 0x57, 0xd6, 0xeb, 0xb1, 0xf4, 0x77, 0x9b, 0x15, 0x91, 0xaf, 0x66, 0xfb, 0x07, 0x06, 0xfb, 0x77, 0x36, 0x2a, 0xd8, 0x5f, 0xe2, 0xcb, 0xeb, 0xf9, 0x93, 0x8d, 0x86, 0x19, 0x78, 0x22, + 0xed, 0x54, 0x13, 0x3e, 0x02, 0x06, 0x9d, 0x57, 0xc4, 0x96, 0x69, 0x11, 0x7f, 0xc4, 0x3e, 0xc4, 0xd1, 0xd4, 0xef, 0x84, 0x4a, 0xdd, 0x9a, 0xb7, 0x7f, 0xc4, 0x52, 0x3c, 0x5b, 0x1c, 0xb2, 0x1f, + 0xe0, 0xe3, 0x37, 0x65, 0x23, 0xeb, 0x14, 0x6f, 0x3a, 0xfe, 0x8e, 0xaa, 0xf9, 0xd6, 0xe7, 0xac, 0x5f, 0x98, 0x9a, 0x7d, 0xcb, 0xdf, 0xcc, 0x8d, 0xfb, 0x66, 0x66, 0x80, 0x51, 0xd3, 0xb7, 0xee, + 0xfe, 0x4c, 0x76, 0xf6, 0xd5, 0xcc, 0x38, 0xfe, 0xfa, 0x3a, 0x4e, 0xf2, 0x13, 0x01, 0xda, 0xef, 0xcc, 0xcc, 0xfc, 0x0d, 0x01, 0x9a, 0x9f, 0x74, 0xad, 0x07, 0xa4, 0xbd, 0x7f, 0x67, 0x1c, 0x9f, + 0xe8, 0x4c, 0xf3, 0x1d, 0xfd, 0x3a, 0xbe, 0x67, 0x30, 0xdf, 0x4d, 0x25, 0x61, 0x19, 0x49, 0xff, 0x11, 0x45, 0xfc, 0x51, 0x3b, 0xf1, 0x2f, 0x33, 0xec, 0xc0, 0x2f, 0x53, 0xec, 0x67, 0x1e, 0xcd, + 0x09, 0x7a, 0xef, 0x4a, 0xe1, 0xf5, 0x03, 0xc6, 0x37, 0x48, 0xf7, 0xd0, 0xe8, 0x4f, 0x17, 0x77, 0x53, 0x73, 0x1d, 0x95, 0x2a, 0x45, 0x9e, 0x68, 0x9b, 0xe4, 0xce, 0xbd, 0x99, 0x45, 0x3c, 0xbd, + 0x6b, 0x54, 0x49, 0xa1, 0x17, 0x2e, 0x39, 0x53, 0x41, 0x14, 0x57, 0xa3, 0xce, 0x05, 0x86, 0xbe, 0xa2, 0x9a, 0x6e, 0x2b, 0x86, 0x03, 0xa9, 0x3e, 0xcb, 0xe4, 0x2e, 0xcf, 0xc4, 0xae, 0xb9, 0xd0, + 0xcf, 0x3e, 0x4d, 0x48, 0x2d, 0x94, 0x70, 0xe6, 0xfe, 0x93, 0x90, 0x72, 0x77, 0x90, 0xc9, 0x7a, 0x2e, 0xb0, 0x37, 0x8d, 0x82, 0x20, 0x6c, 0x70, 0xab, 0xd6, 0x6f, 0xb3, 0x5d, 0x19, 0xc9, 0xe3, + 0xba, 0x3b, 0x5f, 0x9a, 0xbc, 0x83, 0x1d, 0x7c, 0x80, 0xd4, 0x3b, 0x63, 0x91, 0x06, 0x42, 0x31, 0xa5, 0xf0, 0x6d, 0xca, 0xe7, 0x8b, 0x8e, 0x6e, 0x7b, 0x8e, 0x3d, 0xfe, 0xfd, 0x6e, 0xb5, 0x4b, + 0xf1, 0xd4, 0xb6, 0x30, 0x68, 0x4b, 0x3b, 0xc1, 0xd2, 0xb7, 0x63, 0xe4, 0xa6, 0xc1, 0x35, 0x47, 0x44, 0xf4, 0x61, 0xfb, 0x43, 0xb1, 0x8b, 0xf5, 0x64, 0x98, 0xc4, 0xc6, 0xf2, 0x39, 0x23, 0xd1, + 0x06, 0xe3, 0x00, 0xe5, 0x73, 0x27, 0xca, 0x1e, 0x7b, 0x29, 0xe2, 0x4a, 0xf7, 0xae, 0xdd, 0xef, 0x32, 0x2a, 0x69, 0x51, 0xbc, 0xe7, 0xee, 0xd3, 0x9c, 0xdc, 0x23, 0x74, 0x50, 0xf0, 0xe8, 0x72, + 0xf3, 0x48, 0x03, 0x2e, 0x65, 0x1f, 0x7e, 0x73, 0x90, 0x38, 0xb7, 0x8b, 0xf0, 0xb9, 0x65, 0x5a, 0xae, 0xc0, 0x9b, 0xfa, 0x34, 0x6a, 0x71, 0xde, 0x84, 0xf8, 0x93, 0x92, 0x03, 0xa0, 0xb9, 0x01, + 0xd6, 0xfa, 0xd1, 0x9b, 0x4c, 0x94, 0xc8, 0x21, 0x52, 0xc7, 0x20, 0x4b, 0x72, 0x01, 0x61, 0xad, 0x30, 0x45, 0x03, 0xac, 0xe5, 0x7a, 0xed, 0x40, 0xd4, 0x51, 0x3c, 0x79, 0xf1, 0x6c, 0xb3, 0x8c, + 0x8e, 0x27, 0xdd, 0x5a, 0x85, 0x46, 0x81, 0x0f, 0x1f, 0x22, 0x09, 0x73, 0xa4, 0x4b, 0x98, 0xe4, 0x3b, 0xc3, 0xb7, 0x0a, 0x42, 0x4f, 0x1f, 0x80, 0x0d, 0xde, 0x7b, 0x30, 0x53, 0x5a, 0xbe, 0x88, + 0xab, 0x79, 0x66, 0x56, 0x28, 0x6a, 0x11, 0x07, 0xad, 0x2a, 0xca, 0xee, 0xcf, 0x64, 0x3e, 0xef, 0x66, 0x41, 0x97, 0x13, 0xe6, 0x06, 0x2b, 0x4e, 0xc2, 0x29, 0xc4, 0x57, 0xc4, 0x6c, 0xb2, 0x1a, + 0x9b, 0xe0, 0xcd, 0xaf, 0x9c, 0xad, 0x99, 0x1c, 0xf5, 0x38, 0x83, 0x47, 0xc4, 0xcd, 0xec, 0x8b, 0xc9, 0x01, 0x35, 0xc0, 0x12, 0x89, 0xbe, 0xf6, 0x1a, 0x37, 0x95, 0x39, 0xdb, 0xa8, 0x01, 0xc7, + 0xca, 0x6b, 0x68, 0x62, 0xc2, 0x00, 0xe1, 0xe3, 0x9c, 0x67, 0x61, 0xc7, 0x31, 0xa3, 0xb9, 0x83, 0x64, 0xa5, 0x41, 0xe1, 0xbc, 0x2c, 0x01, 0x59, 0xba, 0x6d, 0x5f, 0x9f, 0x1a, 0x41, 0xda, 0x12, + 0x53, 0x98, 0x5a, 0xa8, 0x73, 0xf5, 0x93, 0x6b, 0x8d, 0x37, 0xf3, 0x06, 0xb0, 0xe6, 0x84, 0xa5, 0x50, 0x2a, 0x4d, 0xb7, 0x74, 0x73, 0x9e, 0xd3, 0x0b, 0xfc, 0x15, 0xb2, 0xe3, 0x33, 0x0b, 0x30, + 0x50, 0xc5, 0xcd, 0xb0, 0x70, 0x4c, 0x5b, 0x5e, 0x9a, 0x8f, 0xe1, 0x56, 0x23, 0xac, 0xf6, 0xfb, 0x25, 0xef, 0x89, 0xb2, 0x17, 0x9d, 0xdd, 0xb6, 0xd9, 0xb3, 0x92, 0xab, 0x85, 0xe8, 0xd9, 0x05, + 0xcc, 0x8e, 0x11, 0x3b, 0x8e, 0x14, 0x30, 0x4f, 0xc5, 0xb4, 0x8d, 0x77, 0xef, 0xce, 0x74, 0x77, 0xbd, 0x5e, 0xb1, 0x38, 0xe6, 0xf6, 0xdb, 0x9c, 0xf7, 0xda, 0x8b, 0x44, 0xa8, 0x8d, 0x85, 0x40, + 0x19, 0x48, 0x8e, 0x06, 0xb9, 0x8d, 0xf6, 0xda, 0xe3, 0xee, 0x5f, 0xe6, 0xd3, 0x82, 0xaa, 0x24, 0xc3, 0xf9, 0x8a, 0x92, 0xce, 0x3c, 0x1f, 0x5b, 0xa4, 0x27, 0xc7, 0x3e, 0xeb, 0xd7, 0x8c, 0x22, + 0x00, 0x32, 0x1c, 0x5b, 0x21, 0xb7, 0x4b, 0xbf, 0xf3, 0x7e, 0xcd, 0x45, 0xf3, 0x2f, 0xe6, 0x55, 0x7e, 0x9d, 0x4c, 0x91, 0x25, 0xbe, 0xd6, 0x6f, 0x18, 0xe7, 0xb8, 0xc7, 0x68, 0x1d, 0x72, 0x88, + 0x1d, 0x7e, 0x7c, 0x09, 0x10, 0x9d, 0x3d, 0x3e, 0x7f, 0x9e, 0x35, 0xa7, 0xdd, 0xd8, 0xd1, 0xe0, 0xba, 0xda, 0x56, 0xdb, 0x74, 0xb5, 0x07, 0xd1, 0x0e, 0x00, 0xbe, 0x98, 0xb4, 0xc3, 0x41, 0x7c, + 0xfe, 0x18, 0x6a, 0x0d, 0x9d, 0x57, 0x63, 0x9d, 0xae, 0xbb, 0x43, 0x11, 0x7c, 0x24, 0xda, 0x10, 0xae, 0x5e, 0xd7, 0x9d, 0x5e, 0x43, 0x5a, 0xb6, 0xeb, 0x84, 0x61, 0x2f, 0xd7, 0x4b, 0x5e, 0xf3, + 0x41, 0xac, 0x85, 0x6b, 0xed, 0xaf, 0x56, 0xa1, 0xe2, 0x1d, 0x2d, 0x53, 0x0f, 0x59, 0x97, 0x8d, 0x04, 0xf5, 0x02, 0x07, 0xe0, 0xdc, 0xfe, 0x30, 0x04, 0xe4, 0xfb, 0x4a, 0x06, 0x5d, 0xcb, 0xbc, + 0xba, 0xc4, 0xf4, 0x8c, 0xa5, 0xf7, 0xa7, 0x48, 0x2a, 0xde, 0xf6, 0x5a, 0xbd, 0x0e, 0xc0, 0xea, 0x49, 0x48, 0x3a, 0x94, 0x9a, 0x1e, 0xd2, 0xb8, 0x2c, 0xbe, 0x69, 0x93, 0x68, 0x56, 0x95, 0x74, + 0xa5, 0xc2, 0xb6, 0x7e, 0x5a, 0x78, 0xea, 0x0d, 0x34, 0xa7, 0x90, 0x4e, 0x86, 0x68, 0x80, 0x5b, 0xa0, 0x04, 0x2c, 0x4c, 0xb4, 0x1e, 0x98, 0x88, 0xab, 0xd2, 0x87, 0xb7, 0x6f, 0xde, 0xb0, 0x8c, + 0x79, 0x9c, 0xf6, 0x41, 0x69, 0x4c, 0xb8, 0x11, 0x4a, 0xb7, 0xb2, 0x30, 0xaf, 0x0c, 0x7c, 0x33, 0x0a, 0xa5, 0xa0, 0x26, 0x3e, 0x78, 0x09, 0xda, 0x43, 0xd4, 0xca, 0x95, 0x10, 0xee, 0x3c, 0x21, + 0x21, 0xb3, 0x77, 0x27, 0x15, 0xb8, 0x54, 0xa2, 0x80, 0x8b, 0x91, 0x0f, 0xa2, 0x03, 0x0d, 0xde, 0x59, 0xe4, 0x3e, 0x73, 0xbd, 0x1d, 0x63, 0x04, 0x41, 0x99, 0x64, 0xdb, 0x18, 0x8e, 0xe7, 0xec, + 0xf4, 0x18, 0x48, 0xec, 0x01, 0xa6, 0xf9, 0xaf, 0xf5, 0xbd, 0xe6, 0x8a, 0x96, 0x84, 0xdc, 0x7d, 0x23, 0x2a, 0xfa, 0xdc, 0xc4, 0xf5, 0x71, 0x72, 0xd1, 0xb0, 0x16, 0xb2, 0x5f, 0xb5, 0xd6, 0xd2, + 0x6b, 0x74, 0x08, 0xa4, 0x18, 0x61, 0x19, 0x4f, 0xdd, 0x7b, 0x29, 0x95, 0x4f, 0xd3, 0xc7, 0xc8, 0xf8, 0x5b, 0xee, 0x78, 0xdd, 0x19, 0x92, 0x9f, 0xfa, 0x22, 0xc9, 0x3e, 0x8e, 0x30, 0x58, 0x20, + 0xb2, 0xf0, 0xe2, 0xb8, 0xd8, 0xf2, 0x37, 0x5c, 0xd0, 0x92, 0xe1, 0x28, 0x40, 0x4f, 0x7f, 0xe7, 0x5e, 0xa7, 0x9f, 0xd3, 0x93, 0x08, 0x4b, 0xe5, 0xe1, 0x59, 0x13, 0x2d, 0x0d, 0x40, 0x5d, 0x2a, + 0xd5, 0x53, 0xae, 0xf5, 0x35, 0xa4, 0xc4, 0x96, 0x64, 0x13, 0x5e, 0x8c, 0x30, 0xb1, 0x8e, 0xc5, 0xf0, 0x52, 0x86, 0x57, 0xf6, 0x50, 0xce, 0x52, 0xef, 0x27, 0x58, 0x17, 0x67, 0x55, 0x26, 0xcb, + 0x22, 0x6e, 0x13, 0x42, 0x00, 0x17, 0xa7, 0xe5, 0xbb, 0xc9, 0x7c, 0x3a, 0x41, 0x33, 0xbc, 0xa3, 0x47, 0x88, 0xfb, 0xe0, 0xca, 0xc8, 0x71, 0x03, 0x24, 0xe7, 0x54, 0x70, 0xba, 0x27, 0x47, 0xcb, + 0x93, 0x1e, 0x28, 0xee, 0x26, 0xc4, 0x3a, 0xdf, 0xeb, 0x97, 0x24, 0xc0, 0xeb, 0xa3, 0xd0, 0x6d, 0xdd, 0xd5, 0xc4, 0xae, 0x94, 0x67, 0xce, 0x24, 0x0a, 0xe5, 0xb6, 0x1d, 0x66, 0x2b, 0xeb, 0xda, + 0x17, 0x52, 0xe4, 0xb1, 0x2e, 0xfb, 0x87, 0xcf, 0x4b, 0xb3, 0x7e, 0xc9, 0xa0, 0x5f, 0x10, 0x36, 0x0f, 0x9e, 0xc0, 0x55, 0xa8, 0x0a, 0xa3, 0x44, 0xc3, 0x5b, 0xf7, 0xb5, 0x8d, 0x7d, 0x2b, 0x1b, + 0x15, 0xdd, 0x1a, 0xcc, 0xf9, 0x8f, 0x71, 0x52, 0xb6, 0xb2, 0xb8, 0x9a, 0xd6, 0x15, 0x03, 0x90, 0xcd, 0x40, 0x9f, 0x68, 0x39, 0x47, 0x4d, 0xa8, 0x75, 0xae, 0x2e, 0x56, 0xbc, 0xa2, 0x4a, 0x9c, + 0xca, 0x86, 0xbd, 0xb4, 0xce, 0x75, 0x43, 0xb2, 0xae, 0x3f, 0xa5, 0xd0, 0x03, 0xb6, 0x4d, 0x0a, 0x8f, 0xcd, 0xac, 0x08, 0xc2, 0x1c, 0x96, 0x87, 0x41, 0xd5, 0x8f, 0x42, 0x97, 0x2e, 0xf9, 0xa3, + 0x85, 0x2c, 0xb4, 0xd1, 0x3c, 0x94, 0xd5, 0x34, 0x8d, 0x3b, 0x06, 0x36, 0xc2, 0x49, 0xe8, 0x31, 0xa0, 0x0a, 0x1e, 0x09, 0x7c, 0x94, 0xfd, 0x01, 0xfd, 0xcd, 0xec, 0xea, 0x17, 0x27, 0xcc, 0x9f, + 0x6b, 0xde, 0x67, 0x79, 0xf6, 0x83, 0xff, 0x6e, 0xab, 0xec, 0x5b, 0xbe, 0xfc, 0x4f, 0xdc, 0xf1, 0xbf, 0x70, 0xcc, 0xc1, 0x17, 0xc7, 0x0c, 0xa9, 0x3f, 0x39, 0x66, 0x97, 0x92, 0xe7, 0xfa, 0xe1, + 0x37, 0x17, 0x67, 0xe6, 0xee, 0x6d, 0x47, 0x71, 0x65, 0x1c, 0xd1, 0x1f, 0x2b, 0x88, 0x4b, 0xff, 0xca, 0x31, 0x2b, 0x5f, 0xb0, 0xcf, 0x8f, 0x8e, 0x59, 0x12, 0xbe, 0x3a, 0x66, 0x21, 0x97, 0xec, + 0x36, 0xe9, 0xbe, 0xca, 0x11, 0x06, 0x51, 0x70, 0x8e, 0xdf, 0x23, 0x51, 0xe0, 0xc7, 0xbc, 0xd6, 0x4f, 0xdc, 0xe1, 0xfa, 0xcd, 0xdf, 0xbf, 0x4e, 0x94, 0x15, 0xa7, 0x5e, 0xeb, 0xe7, 0x2f, 0x12, + 0x65, 0xd2, 0x6f, 0xc3, 0xf9, 0xef, 0x8b, 0x01, 0xfe, 0xd7, 0xd5, 0x7c, 0x5f, 0x4c, 0x51, 0xc8, 0x15, 0xf0, 0xcf, 0x94, 0x84, 0xd8, 0x91, 0xb5, 0xd2, 0x81, 0x3f, 0xd4, 0xa3, 0xcb, 0x99, 0x66, + 0x2a, 0x71, 0x4e, 0xe8, 0xc7, 0x7b, 0x89, 0xc5, 0x22, 0x73, 0x9f, 0x03, 0xb8, 0xe9, 0x18, 0x2d, 0xcd, 0x0b, 0x50, 0x05, 0x43, 0xc1, 0x61, 0xbb, 0xb0, 0x28, 0xcb, 0x4d, 0xc3, 0x93, 0x78, 0xb6, + 0x95, 0x08, 0xa7, 0xa2, 0xb0, 0x41, 0x0f, 0xb1, 0xe7, 0x19, 0xe3, 0x9a, 0x89, 0xed, 0x1d, 0xbf, 0xb1, 0x39, 0xe2, 0x8f, 0xae, 0xbf, 0x1c, 0x26, 0x5f, 0x04, 0x15, 0x1f, 0x65, 0x48, 0x2b, 0x91, + 0xd7, 0x98, 0xc8, 0xb2, 0xb6, 0x3b, 0xcb, 0x4b, 0x7c, 0x21, 0xea, 0x29, 0x00, 0xf6, 0x0e, 0x4e, 0x31, 0xc2, 0x42, 0x19, 0x8a, 0x4f, 0xd2, 0x7d, 0xbc, 0xbd, 0x7e, 0xe0, 0x5f, 0x56, 0x4a, 0x96, + 0x16, 0xc2, 0x43, 0x0c, 0x85, 0xb0, 0x7b, 0x36, 0x09, 0x06, 0x75, 0x61, 0xb7, 0x4d, 0xfa, 0x10, 0x1e, 0xd0, 0x2e, 0x8e, 0x93, 0xef, 0x61, 0x34, 0x91, 0xfb, 0x09, 0xca, 0xd4, 0xea, 0xa6, 0x05, + 0x8c, 0x3e, 0x89, 0x19, 0x65, 0xdd, 0x0d, 0xc8, 0xbd, 0xa0, 0x2f, 0x93, 0x48, 0xa8, 0x8c, 0xa7, 0x1c, 0x3a, 0x3e, 0xd9, 0x22, 0x76, 0xcf, 0x66, 0xdd, 0x23, 0x28, 0x3d, 0xa1, 0xdc, 0x75, 0x45, + 0xda, 0xce, 0x48, 0xaf, 0x75, 0x9b, 0x44, 0xb3, 0x66, 0x91, 0xa2, 0x0f, 0xce, 0xd0, 0xb0, 0x70, 0xee, 0x17, 0x37, 0x0b, 0xcb, 0xc8, 0x4e, 0x75, 0xfa, 0x38, 0x14, 0xe9, 0xc4, 0x2e, 0xd1, 0xd7, + 0x6d, 0x00, 0xa7, 0xba, 0x5b, 0x63, 0x71, 0x44, 0x9b, 0xc4, 0x1a, 0xed, 0xf1, 0xa9, 0xa2, 0xfb, 0x81, 0x2c, 0x72, 0x15, 0xd4, 0x34, 0x83, 0x37, 0x3f, 0x55, 0x0a, 0xb1, 0xee, 0x76, 0xd4, 0xf6, + 0x0b, 0x94, 0x48, 0x16, 0x77, 0x6e, 0x25, 0xa7, 0xc8, 0x71, 0xfd, 0xd8, 0x33, 0xfe, 0x78, 0xb4, 0xe3, 0x0c, 0x37, 0xe1, 0x16, 0xb1, 0xe8, 0xc7, 0xfb, 0x6c, 0x85, 0x04, 0x40, 0x9d, 0x0a, 0xb7, + 0x6e, 0x5f, 0x93, 0x0f, 0x61, 0xe5, 0x0e, 0xbc, 0x2d, 0xe5, 0xb1, 0xf6, 0xf5, 0x80, 0x5e, 0x37, 0x36, 0x77, 0x50, 0x58, 0x52, 0xa6, 0x94, 0x61, 0x05, 0xd4, 0xae, 0x14, 0x22, 0x3c, 0x6e, 0x85, + 0x07, 0x07, 0x45, 0x65, 0xbb, 0xd2, 0xfb, 0xdc, 0xa5, 0x4b, 0x93, 0x57, 0x43, 0x73, 0x46, 0xe3, 0xf9, 0x8d, 0x36, 0x60, 0xaa, 0x0d, 0xe4, 0x2d, 0xb1, 0x08, 0x8b, 0x76, 0xab, 0x5b, 0x5c, 0x21, + 0xd5, 0x9c, 0x04, 0x81, 0x6c, 0x29, 0xde, 0x30, 0x15, 0xd6, 0x2a, 0x31, 0x90, 0x2e, 0xa6, 0xf2, 0xc7, 0x01, 0x47, 0xdd, 0x56, 0xc3, 0x51, 0x76, 0xf3, 0xcd, 0x3b, 0x51, 0xc6, 0x98, 0x91, 0x8f, + 0xef, 0x25, 0x22, 0x2d, 0xd3, 0x3c, 0xb3, 0x4a, 0x83, 0x3c, 0x8e, 0xcc, 0xc3, 0xdd, 0xb8, 0x1d, 0x60, 0x20, 0x51, 0x9a, 0x91, 0xa9, 0x0d, 0x87, 0x9d, 0xb8, 0x61, 0xf6, 0xea, 0x5a, 0x67, 0x3f, + 0xb0, 0xee, 0x19, 0xb0, 0x28, 0xac, 0x2b, 0xd5, 0x69, 0xf4, 0x32, 0xfe, 0x69, 0x1a, 0xfe, 0xe1, 0x74, 0xbd, 0x2b, 0xf5, 0x0d, 0xe3, 0x7f, 0x92, 0x56, 0x6b, 0x02, 0x0f, 0x83, 0xc5, 0xe5, 0x44, + 0xfc, 0xc8, 0xcf, 0x82, 0xcf, 0xf3, 0x71, 0x08, 0xed, 0x5a, 0x02, 0x81, 0x48, 0x22, 0x1e, 0xc3, 0x6b, 0x88, 0x7a, 0xcc, 0xad, 0x1d, 0xbd, 0xb9, 0x92, 0x94, 0x6f, 0x37, 0x82, 0x62, 0x9b, 0xa9, + 0xe2, 0x35, 0xa0, 0xc3, 0xd3, 0x2a, 0xc2, 0x0b, 0xd2, 0x07, 0xa9, 0x50, 0xdf, 0x46, 0xb4, 0xc0, 0x60, 0xbb, 0xab, 0x94, 0xa2, 0x32, 0xf1, 0x8b, 0xec, 0x3b, 0x6a, 0x8e, 0xff, 0xff, 0xd4, 0xbd, + 0x47, 0x93, 0xa3, 0x4a, 0xd7, 0x2d, 0x3c, 0xe7, 0x57, 0x3c, 0x73, 0xe2, 0x86, 0x10, 0x9e, 0xc1, 0x37, 0xc0, 0x7b, 0x10, 0xde, 0xcc, 0x70, 0xc2, 0x3b, 0x01, 0xc2, 0xfc, 0xfa, 0x2f, 0xba, 0x4e, + 0xfb, 0xd3, 0x7d, 0xcc, 0x7d, 0xde, 0xb8, 0x11, 0x6f, 0x0d, 0xb3, 0x14, 0x54, 0x26, 0xa5, 0x9d, 0xb9, 0x72, 0xef, 0xb5, 0xd7, 0xba, 0x81, 0x32, 0xe9, 0xe1, 0x5d, 0xe2, 0x4d, 0x0e, 0x60, 0xec, + 0xe1, 0x7c, 0x54, 0x89, 0x01, 0x2d, 0x4e, 0x0c, 0x45, 0xf2, 0xcb, 0x24, 0xc6, 0x7b, 0xfe, 0xcc, 0x6d, 0xcf, 0x6f, 0xae, 0x93, 0x7e, 0xe6, 0x98, 0x66, 0x71, 0xcf, 0xbf, 0xe8, 0x46, 0x85, 0x43, + 0x0b, 0xc7, 0x38, 0x9a, 0xe2, 0x9e, 0x99, 0x03, 0x20, 0x12, 0x96, 0x30, 0x31, 0x59, 0x18, 0xca, 0x0b, 0x41, 0x6d, 0xeb, 0x9f, 0xcb, 0x9b, 0x46, 0x7f, 0xe6, 0xff, 0x00, 0x5f, 0x9d, 0x84, 0xb8, + 0xc4, 0xe8, 0xc8, 0x83, 0x15, 0x02, 0x6b, 0x32, 0xb0, 0xa5, 0xd7, 0x8c, 0x94, 0x78, 0x55, 0xfe, 0xa4, 0x89, 0x4b, 0x22, 0xbe, 0xf3, 0xe7, 0xfa, 0x6e, 0x25, 0x57, 0x18, 0x66, 0x92, 0x1c, 0xe4, + 0x2d, 0x21, 0xf4, 0xad, 0xc6, 0x70, 0x44, 0xe7, 0xee, 0x0b, 0x8b, 0xd0, 0x26, 0x0e, 0x3e, 0x33, 0xda, 0xb3, 0x81, 0x64, 0x22, 0x3b, 0x77, 0xe7, 0xa7, 0xcc, 0x7c, 0x74, 0x9c, 0x29, 0xcd, 0xc1, + 0x70, 0x65, 0x4e, 0xfa, 0x66, 0xa4, 0x7a, 0x66, 0x28, 0x3b, 0xd6, 0xb2, 0x49, 0x92, 0xc7, 0x46, 0xc4, 0xe6, 0xf5, 0x45, 0x0e, 0xf6, 0xed, 0x0a, 0x3d, 0x9a, 0xe5, 0x6f, 0x87, 0x29, 0xd1, 0xa9, + 0xba, 0x1c, 0x8e, 0xe5, 0x33, 0x59, 0xcc, 0x57, 0xaf, 0x43, 0xa2, 0x32, 0x1d, 0x48, 0xfc, 0x17, 0x9c, 0x85, 0x0d, 0xd4, 0x49, 0xb0, 0xcd, 0xa2, 0xc4, 0xd2, 0x0a, 0x8e, 0xf9, 0x16, 0xc1, 0xca, + 0x55, 0xdf, 0x64, 0x2e, 0xba, 0x54, 0x16, 0xbf, 0x50, 0xcb, 0x2a, 0xaa, 0x2b, 0x96, 0xda, 0x87, 0xf2, 0x2a, 0xfb, 0x4b, 0xc6, 0x32, 0x7c, 0x99, 0xef, 0xc1, 0x20, 0x17, 0x0a, 0xdf, 0xeb, 0x21, + 0x52, 0x1f, 0x17, 0x77, 0xdc, 0x18, 0x1b, 0x05, 0xf2, 0x43, 0x36, 0xf9, 0x9b, 0x9b, 0x0b, 0x93, 0x73, 0x73, 0xe0, 0x9c, 0xc8, 0x04, 0x53, 0x38, 0x5f, 0x2c, 0x41, 0x5e, 0x95, 0xa1, 0x29, 0x34, + 0xb6, 0xd3, 0x08, 0x1b, 0x06, 0xef, 0x09, 0xdd, 0x42, 0xbf, 0x96, 0x91, 0x40, 0xd3, 0xc0, 0x97, 0x48, 0xe0, 0x77, 0x55, 0xce, 0x1c, 0x01, 0xb1, 0xb7, 0x9b, 0x84, 0x90, 0x0d, 0xc5, 0x4a, 0xca, + 0x8b, 0x4e, 0x01, 0x90, 0xe8, 0x96, 0x19, 0x54, 0x8b, 0x87, 0x1d, 0x32, 0xe6, 0x89, 0x0d, 0x74, 0x57, 0xdb, 0x03, 0x78, 0x43, 0xad, 0x8a, 0x5c, 0x56, 0xb8, 0xb9, 0xe7, 0x09, 0xf2, 0x58, 0x9f, + 0xe9, 0x8d, 0x0f, 0x11, 0x96, 0x64, 0x9d, 0xee, 0x95, 0x3f, 0xf0, 0x91, 0x3b, 0x27, 0xb0, 0x43, 0xb2, 0x29, 0xe1, 0xde, 0xb6, 0xea, 0x80, 0xf7, 0xad, 0xe9, 0x30, 0xc6, 0x0c, 0x00, 0x01, 0x59, + 0xc4, 0x47, 0xa3, 0xad, 0x07, 0x91, 0xb3, 0x6f, 0x29, 0x69, 0x60, 0xd1, 0x43, 0xd5, 0xab, 0xbc, 0x7b, 0x0e, 0x6f, 0x72, 0x3d, 0xb9, 0x19, 0x8c, 0x41, 0xa3, 0xce, 0x3a, 0x70, 0xe2, 0x5d, 0xb5, + 0x5c, 0x3a, 0x92, 0xef, 0xe3, 0xe9, 0xc7, 0x83, 0x22, 0x80, 0x34, 0x89, 0xbc, 0xd3, 0xa5, 0x48, 0xa0, 0x57, 0xc0, 0xf4, 0xf5, 0xcb, 0xd9, 0x6b, 0x40, 0x9c, 0x02, 0xf3, 0x3d, 0x25, 0x56, 0xe8, + 0x29, 0xe1, 0xf1, 0x68, 0x3d, 0xfa, 0xf2, 0x5e, 0x12, 0x7b, 0xb7, 0xfd, 0xbd, 0x1e, 0xcc, 0x15, 0xbd, 0x61, 0x7a, 0x0d, 0xd1, 0xc8, 0x83, 0xdd, 0x9d, 0x84, 0xde, 0xf6, 0x95, 0x95, 0x70, 0xc8, + 0x78, 0x9d, 0xf1, 0x09, 0x2f, 0x27, 0xb8, 0xe0, 0x26, 0x17, 0xd0, 0x30, 0x7b, 0xd8, 0x94, 0xe8, 0x15, 0x66, 0x06, 0x88, 0xfa, 0x69, 0xf4, 0x28, 0xb2, 0x38, 0xc5, 0x7a, 0xf7, 0x8c, 0x40, 0x57, + 0x85, 0x41, 0xcd, 0x39, 0x37, 0x69, 0xe8, 0xa5, 0x9a, 0x0f, 0x62, 0x16, 0xc1, 0x50, 0xba, 0xd9, 0x1e, 0xb8, 0x33, 0xc5, 0x0c, 0x9e, 0xc6, 0xa6, 0xb4, 0xa9, 0x06, 0xbe, 0xfb, 0x23, 0xeb, 0xd7, + 0xe9, 0x3a, 0x55, 0x9e, 0x85, 0xe5, 0xc7, 0xcb, 0x68, 0x63, 0x5a, 0x71, 0x6a, 0x20, 0x6f, 0x2e, 0x4f, 0x8b, 0x5f, 0x2b, 0xa3, 0xa0, 0x2b, 0xd3, 0xcb, 0x96, 0x71, 0x97, 0xb3, 0x2a, 0x94, 0x53, + 0x05, 0x0c, 0xf5, 0xa3, 0x91, 0x16, 0x03, 0x3c, 0x9a, 0x20, 0x5e, 0x34, 0x29, 0x4c, 0xf5, 0x67, 0xa3, 0x26, 0xb5, 0xe2, 0xc9, 0x46, 0xa7, 0x12, 0xc8, 0x10, 0x3f, 0xf3, 0xb6, 0x53, 0x5e, 0x21, + 0x48, 0xc5, 0x0e, 0x7b, 0x9e, 0x19, 0xff, 0x02, 0xf2, 0xaa, 0x82, 0x87, 0x7b, 0x72, 0xfc, 0xd5, 0x89, 0xfd, 0x51, 0xd7, 0x2e, 0x87, 0xe4, 0x4b, 0x49, 0xeb, 0x5f, 0xeb, 0xad, 0x88, 0xc1, 0xc5, + 0xb2, 0x0c, 0xff, 0x9d, 0xc3, 0x87, 0xfe, 0x9a, 0x44, 0x74, 0x38, 0x7c, 0x4b, 0x37, 0x46, 0x30, 0x66, 0xd2, 0xcc, 0x6d, 0xa6, 0xed, 0x4f, 0xa5, 0xac, 0x0f, 0x4e, 0x5d, 0xd0, 0xfc, 0xe4, 0xf0, + 0x61, 0x77, 0xf2, 0xc1, 0x37, 0xb4, 0xf5, 0xa5, 0x74, 0xcb, 0x7a, 0xf6, 0x98, 0x04, 0x77, 0x2c, 0x45, 0xec, 0x29, 0xbb, 0xf8, 0x4c, 0x67, 0xc6, 0x3f, 0x4e, 0xed, 0x7d, 0x77, 0x3f, 0x0e, 0xd5, + 0x9a, 0x86, 0x4c, 0x8e, 0x87, 0x8c, 0x46, 0xff, 0xd0, 0x09, 0xd7, 0x39, 0xfa, 0x32, 0x7e, 0x90, 0x48, 0xd9, 0x77, 0xeb, 0x33, 0xa1, 0x6c, 0x48, 0xff, 0xb0, 0x86, 0xff, 0x43, 0xa0, 0xe5, 0x9b, + 0x4a, 0xc3, 0xae, 0x73, 0xfc, 0x6e, 0x72, 0xfa, 0xa9, 0x37, 0xf9, 0x1f, 0xda, 0xe2, 0x3f, 0x8d, 0x01, 0xba, 0xf0, 0xb3, 0x3d, 0x4f, 0xec, 0xe8, 0xb6, 0xbc, 0xf3, 0xf4, 0x97, 0xbb, 0x75, 0xc7, + 0x27, 0x62, 0xb7, 0x16, 0x01, 0x05, 0x25, 0xa1, 0x7e, 0x48, 0x1c, 0x9d, 0xfc, 0xf1, 0xd9, 0x45, 0xe7, 0x3f, 0xe4, 0x4c, 0xe5, 0xd2, 0xe0, 0xca, 0xc3, 0xe0, 0xa2, 0x0b, 0xd0, 0xb9, 0xf2, 0x0f, + 0x3c, 0x70, 0x45, 0x87, 0xe8, 0xd2, 0xe1, 0xd7, 0x2c, 0xc0, 0x97, 0x62, 0x33, 0x8c, 0x55, 0xdf, 0xd5, 0xcb, 0xfe, 0xd2, 0x17, 0x10, 0xf8, 0xc9, 0x18, 0xd0, 0x10, 0xb9, 0xae, 0x13, 0xbb, 0xfe, + 0xc0, 0x7b, 0x2b, 0xe0, 0xc6, 0xd3, 0x53, 0x14, 0x9f, 0x2c, 0xa9, 0x87, 0x60, 0x3a, 0x69, 0xc6, 0x99, 0x64, 0xe0, 0xa3, 0x48, 0x08, 0xab, 0x67, 0x63, 0x0d, 0x20, 0x7b, 0x6e, 0x88, 0x11, 0x50, + 0x8b, 0xb9, 0x9e, 0xc8, 0x6a, 0x5b, 0x65, 0x08, 0x2c, 0x6b, 0x7f, 0x9d, 0x54, 0x14, 0x7a, 0x83, 0x3c, 0xc2, 0x28, 0x66, 0x0e, 0xe3, 0x0c, 0xb3, 0xb7, 0xbe, 0xa8, 0x94, 0xc9, 0xc8, 0x57, 0xb4, + 0x56, 0xfd, 0xcb, 0x59, 0x28, 0x59, 0x7c, 0x34, 0x34, 0x36, 0x87, 0x4e, 0xd3, 0x76, 0x51, 0x36, 0x06, 0x94, 0xce, 0xd6, 0xcc, 0x3a, 0x9c, 0x06, 0xbe, 0xea, 0x69, 0xa2, 0x99, 0x56, 0xae, 0x19, + 0xe7, 0x05, 0xa8, 0x06, 0xed, 0x92, 0xed, 0x61, 0xd2, 0x6d, 0x5f, 0xf9, 0x3c, 0x5b, 0x60, 0x9b, 0x27, 0x8c, 0x2c, 0xcc, 0x9f, 0x0f, 0x30, 0x4a, 0x0d, 0xee, 0x55, 0x57, 0x33, 0xcf, 0x32, 0x38, + 0x92, 0xb0, 0x8f, 0x4d, 0xa6, 0xfc, 0xfd, 0xea, 0xef, 0x76, 0x62, 0x73, 0xdb, 0x18, 0xbe, 0x58, 0xc8, 0x91, 0x8f, 0x7d, 0x54, 0x05, 0xe8, 0xad, 0xf8, 0x79, 0xc7, 0x90, 0x80, 0x12, 0xbe, 0x94, + 0x4a, 0xd8, 0xb5, 0x97, 0x71, 0x67, 0xdd, 0xfa, 0x3d, 0x94, 0xb3, 0xdc, 0xd6, 0xd9, 0x66, 0x2d, 0x2b, 0xb7, 0xc9, 0xc4, 0xd4, 0xbb, 0xda, 0x5a, 0x4f, 0x8f, 0xce, 0x0d, 0x7a, 0x9b, 0x78, 0x2a, + 0x0d, 0x3e, 0x42, 0x75, 0xc1, 0x61, 0xc1, 0x36, 0x1d, 0x0d, 0x94, 0x6c, 0xfb, 0x46, 0x43, 0xc1, 0x9b, 0x94, 0x5c, 0x54, 0x5d, 0xee, 0x38, 0x10, 0xe6, 0x22, 0x68, 0xb3, 0xd1, 0xa9, 0x3e, 0xa5, + 0x83, 0x0a, 0x2e, 0xfd, 0x59, 0xca, 0x15, 0x8b, 0x51, 0xef, 0x89, 0x03, 0xc1, 0xc1, 0x7f, 0xd4, 0x17, 0x02, 0x4f, 0x9a, 0x74, 0x44, 0xe2, 0xf4, 0xac, 0x1e, 0x6e, 0x86, 0x88, 0x62, 0x34, 0x42, + 0x2d, 0x27, 0x78, 0xd1, 0xac, 0xef, 0x27, 0x62, 0x7a, 0x68, 0xd9, 0x06, 0xa2, 0xb5, 0x0b, 0x4b, 0x30, 0x03, 0xa8, 0x11, 0xa9, 0x53, 0xcb, 0x3d, 0x8b, 0x47, 0x7a, 0x67, 0xa4, 0x63, 0xe2, 0x51, + 0x87, 0x84, 0x72, 0x71, 0x60, 0x16, 0x92, 0xa1, 0xe0, 0x86, 0x9e, 0x85, 0x82, 0x30, 0x7b, 0x71, 0x65, 0xe4, 0xd3, 0x45, 0x71, 0x84, 0x24, 0x8d, 0x95, 0x4f, 0xfd, 0x21, 0x73, 0xfc, 0x7e, 0x7b, + 0x29, 0x73, 0x6c, 0x34, 0x0c, 0x53, 0x20, 0xd1, 0x25, 0x8f, 0x45, 0x03, 0xec, 0x93, 0x2a, 0xa6, 0xef, 0x6e, 0x27, 0x66, 0x5c, 0xaa, 0x30, 0x2f, 0x3d, 0xa4, 0x99, 0xd2, 0x9f, 0x0f, 0x0f, 0xda, + 0x82, 0xf8, 0x46, 0x60, 0x32, 0x21, 0x85, 0xf7, 0x82, 0x89, 0xf2, 0x69, 0xe0, 0x98, 0xe7, 0xb5, 0xa7, 0x63, 0xac, 0x11, 0x17, 0x59, 0x92, 0xf7, 0x25, 0x70, 0xd9, 0xf1, 0x76, 0xf7, 0xdd, 0x09, + 0xee, 0x32, 0x2c, 0xee, 0xe5, 0x51, 0x01, 0xba, 0x30, 0x3b, 0xfb, 0xd1, 0xc4, 0x35, 0xda, 0xc2, 0x3b, 0x02, 0xf1, 0x34, 0x82, 0x08, 0x53, 0x65, 0xab, 0xcf, 0xe1, 0xbe, 0x2a, 0x4b, 0xe7, 0xdf, + 0xb3, 0x1b, 0x57, 0xf8, 0xb2, 0xcc, 0xc6, 0xad, 0xa4, 0xb0, 0xf7, 0x56, 0x09, 0xb6, 0x5e, 0x0e, 0xfa, 0x34, 0x59, 0xef, 0x90, 0x1b, 0x6c, 0x61, 0xd1, 0x8a, 0xd4, 0x7c, 0x3c, 0xb1, 0x96, 0xc9, + 0x65, 0xa0, 0xb9, 0x52, 0x4c, 0xcb, 0x43, 0x01, 0x06, 0xf1, 0xb9, 0xf2, 0x7c, 0x06, 0x5c, 0x20, 0xdc, 0x4e, 0x85, 0x11, 0x6b, 0x62, 0xbd, 0xc7, 0x98, 0x90, 0x60, 0x4d, 0xac, 0xda, 0x1b, 0xf6, + 0xa0, 0x87, 0xa3, 0x43, 0xa3, 0x59, 0xe5, 0x91, 0x3a, 0xd7, 0xb9, 0xe4, 0x90, 0xaf, 0x14, 0x01, 0xd5, 0x4a, 0xb8, 0x0f, 0xa6, 0x22, 0x74, 0x90, 0x9e, 0x4f, 0x37, 0xe0, 0xe6, 0x32, 0x2b, 0x9c, + 0x5f, 0x55, 0xb2, 0x49, 0x64, 0xf8, 0xe5, 0x38, 0x47, 0x65, 0x46, 0xfc, 0x84, 0xf1, 0xed, 0xdf, 0x66, 0x37, 0x7f, 0x99, 0x09, 0x05, 0x7e, 0x20, 0x60, 0x33, 0xb5, 0xe4, 0x6f, 0xcc, 0x96, 0x83, + 0x68, 0x6b, 0xb8, 0x87, 0x99, 0x61, 0xe3, 0xf3, 0xbe, 0x49, 0x75, 0x11, 0xa2, 0xaf, 0x3f, 0xf5, 0xe6, 0xfc, 0xe2, 0xb3, 0xc0, 0xd7, 0x0f, 0xf3, 0x96, 0xf8, 0x59, 0xb5, 0x9c, 0xd2, 0xb9, 0x65, + 0x37, 0xad, 0xaf, 0xaa, 0xe5, 0x1f, 0xe4, 0xf6, 0x1f, 0x54, 0xcb, 0x6b, 0x63, 0xcc, 0x25, 0x7b, 0xcf, 0xae, 0xf1, 0xad, 0x21, 0x39, 0x92, 0x23, 0xd9, 0x16, 0xc1, 0xfe, 0x09, 0x7c, 0xde, 0x72, + 0xb6, 0x78, 0x90, 0xdf, 0x51, 0xe8, 0x43, 0x1f, 0xfc, 0x55, 0xd1, 0xbf, 0xb4, 0x8b, 0x59, 0xff, 0xa8, 0xe0, 0x91, 0x7c, 0xdc, 0x30, 0xad, 0xce, 0x82, 0xa5, 0x96, 0xd0, 0xaf, 0xaa, 0xee, 0xc6, + 0x2f, 0xea, 0xe7, 0x11, 0xa2, 0x2c, 0x7f, 0xa8, 0x9f, 0xff, 0xb1, 0x21, 0x00, 0x5a, 0x1f, 0x9f, 0x1a, 0xfc, 0x6d, 0x20, 0xfb, 0xb4, 0x8f, 0x89, 0x46, 0xa5, 0xf5, 0xc6, 0x99, 0x72, 0xf4, 0x31, + 0x7e, 0x7a, 0x48, 0x14, 0xbd, 0x12, 0xc9, 0x86, 0x32, 0x6e, 0x7c, 0x6b, 0xb0, 0x71, 0xa6, 0x2c, 0xd6, 0x7e, 0xb7, 0x2d, 0x7d, 0x10, 0x6d, 0x3f, 0x3d, 0x03, 0xf8, 0xcd, 0x43, 0x7e, 0xdb, 0x7a, + 0xd4, 0x69, 0x75, 0xe1, 0xde, 0xb8, 0xa6, 0xb3, 0xca, 0x1a, 0x23, 0xef, 0xa3, 0xf5, 0xcc, 0x32, 0x3f, 0xf7, 0x49, 0xda, 0x94, 0x57, 0xc0, 0x1c, 0xbb, 0x3c, 0xe1, 0xca, 0xb7, 0xe7, 0xc8, 0x9a, + 0x33, 0x22, 0x1a, 0x9e, 0xae, 0xf9, 0xe3, 0xb5, 0x66, 0x8f, 0x94, 0x1f, 0x6f, 0x9b, 0xed, 0xfa, 0xf6, 0xe3, 0x31, 0xc6, 0x74, 0x4a, 0x57, 0xf7, 0x67, 0xdc, 0x46, 0x8a, 0x7e, 0x36, 0x15, 0xe7, + 0x38, 0x61, 0x66, 0xe8, 0x96, 0x04, 0x4e, 0xad, 0x8f, 0x25, 0x44, 0x98, 0xbf, 0x86, 0x43, 0x3e, 0x1e, 0x80, 0x2b, 0xda, 0xa2, 0xe4, 0x9f, 0x12, 0x7a, 0x1f, 0x0a, 0x6b, 0x15, 0xd3, 0x59, 0xc2, + 0xfb, 0x3a, 0x87, 0x1f, 0x92, 0xde, 0xee, 0xe5, 0x06, 0x11, 0x83, 0x8e, 0xd0, 0xb8, 0x3d, 0x94, 0xc9, 0x5a, 0xb2, 0xb9, 0x5b, 0xbc, 0xa8, 0xcb, 0x1a, 0x55, 0x45, 0x3a, 0x19, 0x7a, 0x7a, 0x18, + 0x85, 0x51, 0x2a, 0xa5, 0x84, 0x43, 0x8c, 0xa8, 0x83, 0xb6, 0x30, 0x03, 0xc4, 0x4c, 0x52, 0xfb, 0x9d, 0x73, 0x9b, 0x3b, 0x79, 0x15, 0xee, 0x29, 0xce, 0x92, 0x21, 0xb4, 0xf2, 0x5e, 0xae, 0x83, + 0x72, 0x09, 0xa7, 0x09, 0x32, 0x70, 0xd8, 0x15, 0x8a, 0x6c, 0x6c, 0xa5, 0x44, 0xe3, 0xe8, 0x9e, 0xc5, 0x2f, 0x70, 0xa9, 0x86, 0x8c, 0xe9, 0x68, 0x38, 0xc3, 0xb6, 0x16, 0x6b, 0x6c, 0xb0, 0xf7, + 0xa2, 0x33, 0xe6, 0xb8, 0x0e, 0x01, 0xd0, 0xd4, 0x49, 0xc1, 0xea, 0x18, 0x7c, 0x98, 0x9a, 0x93, 0x11, 0x9f, 0x54, 0xe8, 0x08, 0x8b, 0x70, 0x0a, 0xe5, 0xe5, 0x66, 0x84, 0xb0, 0x21, 0x36, 0xfe, + 0x11, 0x9b, 0x63, 0x8a, 0xea, 0x6d, 0x5e, 0x8f, 0x70, 0x66, 0x88, 0x8a, 0x94, 0x81, 0x78, 0xfc, 0xa2, 0xbc, 0xaa, 0xca, 0x4e, 0x23, 0x6e, 0x4a, 0x75, 0x78, 0xf3, 0xee, 0x4c, 0xf1, 0x7d, 0x0e, + 0x90, 0xbe, 0x1d, 0x81, 0x01, 0xfb, 0x86, 0xab, 0xba, 0xd5, 0xce, 0x4a, 0x40, 0xa4, 0xb9, 0xac, 0xe5, 0x38, 0x27, 0xaf, 0xf7, 0x70, 0x3b, 0xdb, 0x7b, 0xf9, 0x38, 0x5a, 0x0b, 0x73, 0x7b, 0xf4, + 0x38, 0xde, 0xef, 0x19, 0x32, 0xd5, 0xde, 0x8c, 0x55, 0xb2, 0x03, 0xab, 0x67, 0x7c, 0xe0, 0x74, 0xc4, 0x75, 0x4f, 0xa2, 0x68, 0xa0, 0x32, 0x0b, 0x56, 0xc7, 0x01, 0x70, 0xf6, 0xbd, 0x61, 0x97, + 0x94, 0x6e, 0xa5, 0x3d, 0x57, 0x58, 0x33, 0x1c, 0xfe, 0xed, 0xfd, 0x4c, 0xb2, 0x9a, 0xda, 0xa5, 0xc8, 0x7d, 0xf6, 0x0a, 0x44, 0xe3, 0x09, 0xe3, 0xf7, 0xed, 0x30, 0x35, 0x71, 0x7a, 0xbe, 0xd5, + 0x4c, 0xc3, 0xda, 0xbd, 0x0b, 0x1a, 0xca, 0xec, 0xdf, 0x3b, 0x26, 0x4f, 0x88, 0x5c, 0x06, 0x8a, 0xd2, 0x92, 0x8d, 0x93, 0x44, 0xc0, 0xda, 0x6d, 0xc8, 0xa5, 0xe3, 0x88, 0xb1, 0x3f, 0x29, 0x65, + 0xed, 0xa3, 0xca, 0x71, 0x6f, 0x81, 0xa3, 0x73, 0xfd, 0x06, 0xe7, 0x43, 0xd2, 0xb4, 0x61, 0xd3, 0x98, 0xf7, 0xbb, 0x6c, 0xa4, 0x94, 0x7c, 0x4b, 0x53, 0x5e, 0x48, 0xa0, 0xc1, 0xac, 0x27, 0x41, + 0xcc, 0x6e, 0x2e, 0xac, 0xdd, 0xd8, 0x31, 0x43, 0x32, 0x33, 0x4e, 0xce, 0xaa, 0x09, 0x62, 0x07, 0x48, 0x42, 0x4c, 0x4b, 0xe8, 0x4b, 0x92, 0x9a, 0x6c, 0x28, 0xf1, 0x40, 0x3f, 0x76, 0xad, 0x15, + 0xf4, 0xbb, 0x42, 0xa7, 0xcc, 0xb5, 0xdc, 0x10, 0xb1, 0xe5, 0xa6, 0x37, 0xd4, 0x5f, 0xab, 0x09, 0x12, 0x4b, 0x9b, 0xe2, 0xb5, 0x75, 0x87, 0x35, 0x9a, 0x9f, 0x7a, 0xc5, 0xb3, 0x77, 0xa4, 0xa5, + 0x1f, 0xa0, 0xb4, 0xfb, 0x14, 0xae, 0x99, 0x0f, 0x23, 0x2f, 0x00, 0x1e, 0x3d, 0x19, 0xe1, 0x28, 0x43, 0x28, 0x45, 0x8e, 0xfc, 0xa0, 0xf1, 0xbb, 0xe8, 0x61, 0xbb, 0x53, 0x2c, 0xfe, 0xb9, 0x77, + 0xfe, 0x03, 0xac, 0xe1, 0x16, 0x54, 0x23, 0xb7, 0x2b, 0x5e, 0xcd, 0x5d, 0x6d, 0x34, 0xe8, 0x2f, 0xf3, 0x14, 0x45, 0xff, 0x13, 0x8d, 0x47, 0xfc, 0xa5, 0x92, 0xd6, 0xdf, 0x61, 0x1f, 0xee, 0x83, + 0xad, 0x37, 0x9c, 0x5f, 0xb0, 0x8f, 0xaa, 0x3f, 0xc3, 0x36, 0x2a, 0x8f, 0x25, 0x30, 0x91, 0x00, 0xfe, 0x75, 0x36, 0x62, 0xf8, 0xe9, 0xfe, 0xaf, 0xb8, 0x0d, 0xef, 0x02, 0x5f, 0xc9, 0x30, 0x87, + 0xae, 0xc6, 0xc1, 0xfd, 0x33, 0x69, 0x86, 0xd1, 0x1c, 0x97, 0xef, 0x74, 0x56, 0xff, 0x52, 0xea, 0xcb, 0x62, 0xef, 0x7e, 0x8f, 0xc5, 0xea, 0x8c, 0x3e, 0x34, 0xb2, 0x8c, 0x31, 0xed, 0xa9, 0x25, + 0x85, 0xf3, 0x29, 0x0e, 0xf5, 0xd2, 0x15, 0xbb, 0x35, 0x09, 0xed, 0x0e, 0x88, 0xb9, 0x6f, 0x40, 0x89, 0x3e, 0x74, 0xf7, 0xdb, 0x03, 0x7f, 0x60, 0xe1, 0x48, 0x5f, 0x94, 0xaa, 0x4c, 0x8e, 0xfe, + 0x20, 0xdf, 0x99, 0x9c, 0xfe, 0xad, 0xbc, 0x70, 0xfd, 0x31, 0x06, 0x7c, 0x19, 0xd4, 0xc5, 0xec, 0x27, 0x0c, 0xd4, 0x99, 0xba, 0xad, 0xef, 0xbc, 0xf5, 0x99, 0xf3, 0xb3, 0x4f, 0x5d, 0xea, 0x7f, + 0xf0, 0x86, 0x4a, 0x8f, 0x5f, 0x15, 0xdd, 0xf1, 0x76, 0xf9, 0x73, 0xed, 0x81, 0x3f, 0x8e, 0xce, 0x0d, 0xfd, 0x16, 0x48, 0x24, 0xa5, 0x92, 0x05, 0xbb, 0x8b, 0xe0, 0xea, 0x43, 0xde, 0x2b, 0x86, + 0xbb, 0x2e, 0x3b, 0x19, 0x3d, 0x09, 0xee, 0x9f, 0xb6, 0xc6, 0x56, 0xb7, 0xf7, 0x5d, 0xfc, 0x5a, 0xce, 0x33, 0xbe, 0x3d, 0xf0, 0x9b, 0xac, 0xde, 0x2a, 0xf3, 0xd9, 0x87, 0x2e, 0x14, 0xf0, 0x57, + 0xc2, 0x50, 0xdf, 0xeb, 0x42, 0xb5, 0xd0, 0x46, 0xe0, 0x41, 0xa2, 0x12, 0xd3, 0x3d, 0xbd, 0xbb, 0x8e, 0x0b, 0x31, 0x4b, 0xb1, 0x83, 0x45, 0xb1, 0x89, 0xd6, 0xf5, 0x84, 0x0d, 0x34, 0xd1, 0x5c, + 0x03, 0xd0, 0x06, 0xe1, 0x7e, 0xc7, 0x96, 0xf2, 0x68, 0xa1, 0xe9, 0xad, 0xc5, 0x63, 0x24, 0xbf, 0x10, 0x39, 0x9e, 0x02, 0xc3, 0x7f, 0x5d, 0xf9, 0x0b, 0x89, 0xae, 0xf8, 0x75, 0x6b, 0xef, 0xb1, + 0x36, 0xf9, 0xad, 0x38, 0xc6, 0x3a, 0xa4, 0xe6, 0x50, 0x60, 0x48, 0xbe, 0x49, 0x8e, 0x22, 0x74, 0x60, 0xb1, 0xf9, 0xb2, 0x5b, 0xdf, 0x6b, 0x5f, 0xe0, 0x43, 0x62, 0xee, 0x40, 0xa6, 0xc3, 0x6f, + 0x15, 0x5f, 0xfc, 0xbe, 0xd1, 0xc9, 0xf9, 0x65, 0x6a, 0xf3, 0x72, 0xe7, 0x6e, 0xcf, 0x70, 0xce, 0x1e, 0xb7, 0xf5, 0x3a, 0x78, 0xa2, 0xd3, 0x31, 0x53, 0xaf, 0x52, 0x57, 0x86, 0xe8, 0x39, 0x27, + 0xcc, 0xf7, 0x83, 0xe6, 0x97, 0xd4, 0x84, 0x63, 0x4d, 0x7e, 0xc7, 0x6e, 0xdf, 0x47, 0xcb, 0xbb, 0x78, 0x58, 0x29, 0x7d, 0x16, 0xa2, 0x14, 0x00, 0x9c, 0x7f, 0xe3, 0xc0, 0x59, 0xa1, 0xdb, 0xea, + 0x9e, 0x09, 0x60, 0xbc, 0x3f, 0x9a, 0x70, 0x18, 0x5f, 0x4f, 0x36, 0xda, 0xd4, 0xd7, 0xc4, 0x55, 0xfa, 0xea, 0xb6, 0xf7, 0x14, 0x1c, 0xb9, 0xe4, 0x39, 0xe2, 0xbe, 0x58, 0x0b, 0x69, 0x9e, 0x9e, + 0x1a, 0x64, 0xf8, 0xd2, 0xc4, 0x1b, 0xdc, 0xda, 0xf8, 0xc9, 0xec, 0x04, 0x90, 0xad, 0x93, 0x9a, 0x54, 0x59, 0x00, 0xce, 0xcd, 0x0e, 0x54, 0xe5, 0x01, 0xe6, 0x7a, 0x89, 0xc5, 0xec, 0x60, 0xe3, + 0x5c, 0xab, 0x99, 0x53, 0x2c, 0x2a, 0x1b, 0x4c, 0x6e, 0x80, 0xcd, 0x95, 0xa9, 0x62, 0xc4, 0x57, 0x23, 0x0a, 0xb7, 0x9a, 0x4f, 0xb3, 0x1a, 0x26, 0xc5, 0x93, 0x6c, 0xdd, 0x31, 0xb7, 0xb1, 0xe4, + 0xb0, 0x72, 0xd9, 0x4b, 0x13, 0x91, 0x57, 0x9e, 0x93, 0x99, 0xfc, 0x92, 0x80, 0xca, 0xfa, 0xfd, 0x55, 0x1c, 0x04, 0x49, 0xa3, 0x9a, 0xf0, 0x1d, 0xa5, 0xe0, 0x69, 0x7b, 0xf2, 0x95, 0x80, 0x90, + 0xe0, 0xed, 0xc1, 0x20, 0xea, 0x31, 0xfe, 0x32, 0xcf, 0xfe, 0x7b, 0x89, 0x8e, 0x3f, 0x5f, 0x1b, 0xfe, 0xd0, 0x85, 0x12, 0x86, 0x1b, 0x39, 0x5e, 0xf7, 0x0a, 0xb9, 0x1f, 0x8f, 0xc4, 0x7c, 0x8a, + 0xf7, 0xb7, 0x0d, 0xbf, 0x1b, 0x77, 0x10, 0x17, 0x18, 0x78, 0xc7, 0xdb, 0x14, 0x15, 0xef, 0x42, 0xa8, 0x0f, 0xe8, 0x11, 0x13, 0x7d, 0x9e, 0xbf, 0xc2, 0x6d, 0x2e, 0x48, 0xab, 0x7a, 0x0e, 0x8f, + 0x58, 0x7a, 0x61, 0x21, 0x92, 0x3f, 0xa6, 0xeb, 0xb8, 0x30, 0x75, 0x49, 0xf9, 0x46, 0xdf, 0x6b, 0xf9, 0x96, 0xb8, 0x6f, 0x61, 0xad, 0xbc, 0xf7, 0x78, 0x85, 0x62, 0xc2, 0x8e, 0x99, 0x8f, 0x93, + 0x18, 0x81, 0x22, 0x16, 0x60, 0x64, 0x7a, 0xc4, 0x49, 0x0b, 0xed, 0x57, 0x97, 0x51, 0x1f, 0x1d, 0x84, 0xbc, 0xd0, 0x07, 0xbf, 0x71, 0xd6, 0x3c, 0xf3, 0x37, 0xba, 0x71, 0x8e, 0x4c, 0xc7, 0x73, + 0xd1, 0x88, 0x64, 0x7a, 0xef, 0x44, 0xa2, 0xe7, 0xca, 0xe7, 0x2b, 0xe5, 0x1d, 0xcb, 0xb6, 0x9f, 0x21, 0x53, 0xbe, 0xd5, 0xf9, 0xbc, 0x21, 0xdd, 0x59, 0xcc, 0x51, 0xfe, 0xf0, 0xc9, 0x19, 0x00, + 0xf5, 0x57, 0x7d, 0x73, 0x7b, 0xc4, 0x26, 0x86, 0xd7, 0x73, 0x25, 0x79, 0x19, 0xbf, 0xe1, 0x03, 0x1d, 0x49, 0xf8, 0x73, 0x6d, 0x5a, 0x94, 0xa1, 0xd7, 0x2c, 0x5e, 0xd8, 0x86, 0x1f, 0xaf, 0xf2, + 0x7c, 0x5e, 0x84, 0xde, 0x18, 0x11, 0xc3, 0x34, 0xc1, 0xc5, 0x1b, 0xc8, 0xc6, 0x68, 0x28, 0x5b, 0x59, 0xbc, 0x2a, 0xe0, 0x79, 0x8b, 0x36, 0x45, 0x5d, 0x01, 0x1e, 0x09, 0x31, 0x6f, 0x78, 0x18, + 0x83, 0x32, 0x3d, 0x6d, 0x6b, 0xb3, 0xc0, 0x99, 0xa8, 0xde, 0x18, 0x72, 0xbe, 0xba, 0x8c, 0x9c, 0x12, 0xfc, 0xf4, 0xdf, 0x8e, 0x16, 0x7b, 0xdc, 0x74, 0x73, 0x45, 0x46, 0x7b, 0x58, 0x18, 0x9b, + 0x37, 0x5b, 0x82, 0x17, 0xd0, 0x54, 0x41, 0xfe, 0x14, 0x37, 0x08, 0x1d, 0x49, 0x51, 0x15, 0x22, 0x97, 0xe7, 0x1f, 0x07, 0x50, 0x1b, 0x38, 0x7e, 0x31, 0x20, 0xfd, 0x6c, 0xc7, 0x7f, 0xb2, 0x77, + 0x7e, 0xb1, 0x95, 0xfd, 0xbc, 0x7f, 0xfe, 0x59, 0x59, 0xf6, 0x1f, 0xee, 0xa1, 0xac, 0xfb, 0x09, 0xf5, 0xe5, 0x5f, 0xef, 0x8f, 0xea, 0xe3, 0x11, 0x49, 0x73, 0x50, 0xed, 0xdc, 0x3a, 0x6b, 0xd5, + 0xcf, 0x12, 0xa5, 0x17, 0xf3, 0xfa, 0xd5, 0xfe, 0xf9, 0x69, 0xfb, 0x04, 0xfe, 0xa7, 0xf6, 0xcf, 0x98, 0xe3, 0x4b, 0xe0, 0x0b, 0xc1, 0x92, 0x3e, 0xf4, 0xf0, 0xeb, 0x03, 0xbf, 0xf3, 0x34, 0xfd, + 0xc2, 0xaf, 0xb4, 0xaf, 0x2f, 0xcc, 0xe6, 0x72, 0xd7, 0x1b, 0x1e, 0xd5, 0xdd, 0xf2, 0xfa, 0x92, 0xfd, 0x35, 0x3e, 0x6d, 0x9d, 0x0d, 0x8f, 0x02, 0x5f, 0x07, 0x9b, 0xdf, 0x4f, 0xff, 0x9f, 0xce, + 0x1e, 0xf8, 0x27, 0xd3, 0xff, 0xa7, 0xb3, 0x07, 0x3e, 0x4d, 0x3f, 0xff, 0xb8, 0x6f, 0x67, 0x9f, 0x5f, 0xb2, 0xcc, 0x30, 0xa5, 0xf7, 0x2a, 0x2d, 0x8b, 0x96, 0x4b, 0xa3, 0xa6, 0x69, 0xab, 0x99, + 0xac, 0x13, 0xd5, 0x6c, 0xed, 0xae, 0x3e, 0xcc, 0x63, 0x59, 0x91, 0x9a, 0xae, 0x54, 0x7a, 0x68, 0xba, 0xa7, 0xe3, 0xc1, 0xcf, 0xd3, 0xf1, 0xa0, 0x20, 0x74, 0x97, 0x6d, 0x8f, 0x32, 0x00, 0x23, + 0x99, 0xf3, 0x05, 0xd6, 0x9b, 0x06, 0x0a, 0x8c, 0x2f, 0x67, 0xde, 0xcc, 0xcf, 0x27, 0x2e, 0x9d, 0x2c, 0xd6, 0xad, 0xf3, 0x9a, 0x9f, 0x57, 0x9e, 0xe1, 0x1a, 0xb3, 0xb2, 0xa2, 0x4c, 0x50, 0xe2, + 0x3d, 0x42, 0x1f, 0x8f, 0xdd, 0x85, 0xee, 0xc7, 0xe9, 0x3c, 0xdf, 0x49, 0x17, 0x91, 0xda, 0x3d, 0x44, 0xd1, 0xcd, 0xc5, 0xf9, 0x48, 0xb4, 0xe4, 0x17, 0xa0, 0x97, 0x33, 0x1b, 0x4b, 0x50, 0xd0, + 0x52, 0x9f, 0xb5, 0xc0, 0x7f, 0xb4, 0xfb, 0x23, 0x43, 0x4b, 0xe5, 0x79, 0xca, 0xd5, 0xeb, 0x69, 0x63, 0xae, 0x2a, 0xcb, 0xb4, 0xba, 0x2d, 0x06, 0xbe, 0x6a, 0xac, 0x5f, 0x50, 0x26, 0x80, 0xbf, + 0xe0, 0x4c, 0xfc, 0xf8, 0xfd, 0xda, 0x8d, 0x89, 0xe6, 0x98, 0x9e, 0x6e, 0x78, 0xfa, 0xfd, 0x36, 0xaa, 0x6b, 0x97, 0x2d, 0x29, 0x70, 0x7c, 0x86, 0x28, 0xa3, 0x74, 0xac, 0x05, 0xc6, 0x01, 0x39, + 0x80, 0x65, 0x0a, 0xeb, 0xac, 0x40, 0xd5, 0x35, 0x4b, 0x43, 0x44, 0xe6, 0xe3, 0x95, 0x07, 0x0c, 0xeb, 0x3d, 0xdf, 0x26, 0xbe, 0xcb, 0x8c, 0x74, 0x64, 0x7d, 0x2a, 0xad, 0xf6, 0xfe, 0x74, 0x3e, + 0x3d, 0x64, 0x48, 0x27, 0xff, 0xa6, 0x76, 0x2a, 0x6e, 0x22, 0x2b, 0x36, 0x44, 0x8c, 0x35, 0xbc, 0x65, 0x50, 0xe4, 0xe2, 0xc6, 0x17, 0x35, 0xdf, 0x7d, 0x13, 0x40, 0x23, 0xbd, 0x5f, 0xb1, 0x35, + 0x70, 0xa0, 0x92, 0x1a, 0x36, 0x5e, 0xb3, 0x64, 0x15, 0xfb, 0xf9, 0x69, 0x83, 0x7c, 0xc5, 0xfa, 0x0c, 0x7b, 0x36, 0xff, 0x20, 0x12, 0xbf, 0x45, 0x21, 0xfb, 0x7f, 0x87, 0x62, 0xb2, 0x8b, 0x65, + 0xe9, 0xee, 0x2b, 0x11, 0x59, 0xa3, 0x55, 0xe2, 0x41, 0x6b, 0x2f, 0xfe, 0xba, 0x34, 0xd4, 0x22, 0xfe, 0x44, 0xb6, 0xfd, 0xc8, 0xdc, 0xf8, 0x3f, 0x2b, 0x80, 0xfa, 0xfa, 0x01, 0x7c, 0x23, 0x13, + 0x2f, 0x2e, 0xdb, 0xfb, 0xeb, 0x67, 0x42, 0xb2, 0xe5, 0x40, 0xed, 0x21, 0x70, 0xb4, 0xf3, 0x95, 0x84, 0x0c, 0xfb, 0x46, 0x1e, 0xd8, 0x63, 0xd6, 0xf3, 0xa5, 0x13, 0x60, 0xcd, 0xaf, 0x8e, 0x7d, + 0xe0, 0xcf, 0xe7, 0xbe, 0xfe, 0xc5, 0x3c, 0x06, 0xd5, 0x39, 0xf9, 0x30, 0x39, 0x1e, 0xd5, 0xaf, 0xaf, 0x8a, 0xba, 0xd7, 0x4f, 0x63, 0x3f, 0xcc, 0xf0, 0xab, 0x7b, 0xec, 0xff, 0xc4, 0x0c, 0x81, + 0xdf, 0x23, 0x13, 0xfd, 0x6f, 0x15, 0x2b, 0xbf, 0x07, 0x26, 0x17, 0xb8, 0x4d, 0xc0, 0xf6, 0x14, 0x63, 0x26, 0xbb, 0x22, 0x95, 0x15, 0x54, 0x12, 0xd1, 0x21, 0x2f, 0xb2, 0x03, 0xfe, 0x11, 0x94, + 0xee, 0xb9, 0x3b, 0xe8, 0x6d, 0x74, 0xfb, 0xfa, 0x69, 0x5d, 0xb7, 0x0e, 0x13, 0x07, 0xfb, 0x29, 0x85, 0x2d, 0x76, 0x13, 0xde, 0x68, 0x26, 0x13, 0x65, 0xdb, 0x69, 0x08, 0xc6, 0x86, 0x98, 0x2f, + 0x3f, 0x62, 0x29, 0x7f, 0xc8, 0xc1, 0xe8, 0xdd, 0x80, 0x70, 0x29, 0x60, 0x06, 0x44, 0xc1, 0x5d, 0xc7, 0x93, 0x17, 0x7e, 0x04, 0x56, 0x3d, 0x62, 0x4a, 0xc8, 0x05, 0x6f, 0xc2, 0x27, 0x8c, 0x19, + 0x5e, 0xa8, 0xe1, 0x91, 0x5d, 0x79, 0x96, 0xd7, 0xa3, 0xd9, 0x81, 0xe7, 0x66, 0x09, 0x6e, 0xfe, 0x92, 0xd8, 0x58, 0x42, 0xb8, 0x65, 0xf2, 0x27, 0x63, 0x5e, 0x48, 0x61, 0x36, 0x27, 0x88, 0xa2, + 0x32, 0x31, 0x04, 0x4c, 0xa1, 0x14, 0xea, 0x63, 0xb7, 0x51, 0xd0, 0x81, 0x36, 0x01, 0x16, 0xa4, 0xe8, 0x01, 0x16, 0x02, 0xa9, 0xd9, 0x41, 0x19, 0x39, 0xaa, 0x2f, 0x66, 0x97, 0x45, 0xdc, 0xca, + 0x9b, 0x9c, 0xbf, 0xde, 0x92, 0xf8, 0xd0, 0x05, 0x28, 0x4a, 0xaf, 0xaa, 0x40, 0x86, 0x2d, 0x6f, 0xcf, 0x97, 0x1f, 0xc8, 0xd7, 0x9c, 0xc0, 0x6d, 0xca, 0x3c, 0x5e, 0x12, 0xea, 0x03, 0x32, 0x96, + 0xc2, 0x8f, 0x1b, 0x5d, 0x1a, 0x4c, 0x5a, 0xb0, 0x4b, 0xca, 0x33, 0xbc, 0x8f, 0x3d, 0xf1, 0x27, 0xf5, 0x5e, 0xd5, 0x69, 0x4a, 0xc0, 0xec, 0x70, 0xf4, 0x99, 0xba, 0xf6, 0x2a, 0xd5, 0xe0, 0x77, + 0x03, 0x11, 0x82, 0xf9, 0xd2, 0x2e, 0x83, 0xd1, 0x48, 0x04, 0xa5, 0x13, 0x27, 0x71, 0xbd, 0x39, 0x0e, 0x91, 0x61, 0xec, 0x8a, 0x71, 0xec, 0x17, 0xa0, 0xd3, 0xb7, 0x31, 0x51, 0xb6, 0x77, 0xdd, + 0x7b, 0xc3, 0x15, 0x0d, 0x1b, 0x12, 0x9d, 0xf7, 0xe4, 0xec, 0x76, 0x0b, 0x67, 0x26, 0x16, 0x74, 0x30, 0xee, 0x2f, 0x6a, 0x04, 0xb7, 0x59, 0x2a, 0x33, 0x06, 0x9d, 0xe9, 0xab, 0x73, 0x82, 0x56, + 0x05, 0x81, 0x50, 0x11, 0x85, 0xa2, 0xaa, 0x67, 0x37, 0xf5, 0xfe, 0x15, 0x03, 0xe0, 0x57, 0xc0, 0xe4, 0x0f, 0xeb, 0x20, 0x5d, 0x51, 0xfd, 0xf7, 0xe8, 0xcb, 0xe1, 0x32, 0x8e, 0xdb, 0xd0, 0x49, + 0xcf, 0x37, 0xaa, 0x65, 0x16, 0xd6, 0xb5, 0x82, 0x6e, 0x9e, 0xd9, 0x72, 0x88, 0x7b, 0x24, 0x44, 0x9c, 0xf8, 0x52, 0x29, 0x29, 0x70, 0xc8, 0x9e, 0x05, 0x75, 0x78, 0x31, 0x49, 0xe2, 0xd6, 0x9a, + 0xa1, 0xe3, 0xaa, 0x31, 0x5f, 0xf9, 0x29, 0x72, 0xf0, 0x13, 0x70, 0xc3, 0x57, 0x17, 0xd4, 0xde, 0x4c, 0x41, 0x83, 0xcb, 0x20, 0x98, 0x6f, 0x9f, 0xb8, 0x8f, 0x0d, 0x77, 0x9f, 0xf4, 0x1b, 0xdb, + 0x8c, 0xac, 0xd1, 0x98, 0xb0, 0x3d, 0xc8, 0xad, 0xb3, 0xde, 0x43, 0x49, 0xf3, 0xeb, 0x09, 0x6d, 0x67, 0xe3, 0xc1, 0x37, 0x3c, 0x6c, 0x6c, 0x5a, 0x71, 0x2b, 0x39, 0x7e, 0x84, 0xe9, 0x87, 0x82, + 0xc3, 0xe5, 0x22, 0xcf, 0x77, 0xc0, 0x18, 0x26, 0x67, 0x4c, 0xa1, 0x81, 0x62, 0xe9, 0x21, 0xda, 0x2a, 0xa3, 0x63, 0x2d, 0x17, 0xa3, 0x47, 0x1e, 0x77, 0xcf, 0x97, 0xb6, 0x54, 0x1c, 0xeb, 0xbd, + 0xc4, 0xc8, 0x72, 0x3b, 0xc7, 0xb5, 0x41, 0x88, 0x74, 0x65, 0xca, 0xba, 0xd1, 0xf3, 0xd6, 0xe3, 0xbe, 0x40, 0x5c, 0xd1, 0xb9, 0x3e, 0xdc, 0x3b, 0xe7, 0xdd, 0x5e, 0x1d, 0xd1, 0x47, 0x3b, 0x05, + 0xec, 0x2c, 0x4e, 0xd2, 0xf5, 0xdb, 0x3d, 0x78, 0xae, 0xad, 0xcb, 0xec, 0x90, 0xa6, 0xb7, 0xa9, 0x4c, 0xad, 0x0b, 0x1e, 0xd2, 0xdc, 0xd7, 0xb2, 0xce, 0xdb, 0x83, 0x14, 0x56, 0x1b, 0xe3, 0x71, + 0x9c, 0xdc, 0x55, 0xca, 0x86, 0x91, 0x2b, 0xf3, 0xc4, 0x78, 0x62, 0x6c, 0x0b, 0xc4, 0x97, 0xe9, 0x14, 0xa1, 0x39, 0xbd, 0x9f, 0xb8, 0x79, 0x27, 0x0d, 0x0b, 0x60, 0x7a, 0x59, 0xd7, 0x75, 0xda, + 0x77, 0xd4, 0x62, 0x0c, 0xc2, 0xab, 0x7a, 0xd5, 0x6a, 0x8d, 0x96, 0x13, 0xce, 0xdd, 0xa6, 0x7a, 0xbe, 0x2b, 0x3a, 0xfa, 0x94, 0x9e, 0xe7, 0x0b, 0xe7, 0x38, 0x4f, 0xfe, 0xf7, 0xc0, 0x84, 0xfd, + 0xbf, 0x07, 0x26, 0xea, 0xa7, 0x6d, 0x31, 0x15, 0xbf, 0x02, 0x93, 0x02, 0x11, 0xe1, 0xb2, 0x4b, 0x50, 0x7e, 0x38, 0xb3, 0xf9, 0xcf, 0xc0, 0x24, 0xf9, 0x45, 0xcf, 0xd2, 0x5f, 0x02, 0x13, 0x4f, + 0x67, 0xbe, 0x9a, 0xdb, 0x6b, 0xdf, 0x01, 0x13, 0x25, 0xed, 0xf5, 0x43, 0xe6, 0xe8, 0xe2, 0x4b, 0x5f, 0x86, 0x00, 0x7f, 0xdd, 0xa8, 0x04, 0xc0, 0x82, 0xf4, 0x9f, 0x37, 0x9d, 0xeb, 0xdf, 0x6c, + 0x8b, 0x7f, 0x4a, 0xb9, 0xff, 0x57, 0xdb, 0xe2, 0xb7, 0xa6, 0x8f, 0x4f, 0xdb, 0x62, 0xfe, 0x75, 0x5b, 0xfc, 0xe6, 0x88, 0xff, 0xf5, 0xba, 0xc9, 0xe9, 0x7f, 0x23, 0xea, 0xc0, 0x3c, 0xe0, 0x2e, + 0x4a, 0x30, 0x42, 0xa9, 0xe8, 0x1c, 0xc0, 0xd3, 0xac, 0xd6, 0x55, 0x54, 0xa4, 0x64, 0xf1, 0x5a, 0x3c, 0xe5, 0xe8, 0xdc, 0x9e, 0x84, 0xee, 0x5a, 0xf3, 0xc2, 0x6f, 0x18, 0x39, 0x65, 0xf7, 0xb6, + 0x89, 0x45, 0x6e, 0x2c, 0xfc, 0x26, 0x6d, 0xb1, 0x60, 0xeb, 0x09, 0x84, 0xe2, 0xc0, 0x93, 0xce, 0x99, 0x87, 0xb6, 0xfa, 0x29, 0x6a, 0x36, 0xc9, 0x7b, 0xad, 0x17, 0x59, 0x54, 0xe8, 0x81, 0xa1, + 0x00, 0x47, 0xf7, 0x55, 0x14, 0x6c, 0x6b, 0x9f, 0x55, 0x8c, 0x96, 0x58, 0x59, 0x4e, 0xa5, 0x90, 0x81, 0x35, 0xfb, 0x67, 0x9e, 0x57, 0x7c, 0x86, 0x75, 0xc7, 0xad, 0xba, 0xdd, 0xde, 0xe1, 0x39, + 0xff, 0x4a, 0x57, 0xf0, 0xb1, 0x26, 0x8e, 0xc1, 0xd2, 0x32, 0xcf, 0x9d, 0xb3, 0xd9, 0xd2, 0x00, 0x03, 0xb7, 0x71, 0x8e, 0x3f, 0xfb, 0xfd, 0xe6, 0x3e, 0x7e, 0x66, 0xe8, 0xff, 0x25, 0x41, 0xff, + 0xb7, 0xaa, 0xe4, 0x16, 0x0b, 0xc1, 0x2c, 0xc9, 0xd6, 0x4f, 0x18, 0x76, 0x45, 0x15, 0xb7, 0x20, 0xd4, 0xad, 0x24, 0xf5, 0xfe, 0x5a, 0xa1, 0x0c, 0x59, 0x93, 0x3b, 0x22, 0x24, 0x8f, 0x80, 0x67, + 0x12, 0x2d, 0x47, 0x4b, 0x97, 0x55, 0xb9, 0x73, 0x32, 0xc7, 0xe7, 0x86, 0x3a, 0x96, 0xfe, 0x0c, 0x2a, 0xe8, 0x86, 0x22, 0xa8, 0xc7, 0xea, 0xcc, 0xee, 0x01, 0xb1, 0x69, 0x93, 0xdd, 0xa8, 0xdb, + 0x83, 0xc6, 0xd9, 0x41, 0x2f, 0x68, 0x53, 0x49, 0x29, 0xd0, 0xce, 0x91, 0xe3, 0xf3, 0x6a, 0xa7, 0x27, 0x75, 0x7b, 0xe5, 0xd9, 0x0e, 0xe9, 0x39, 0xf2, 0x24, 0x70, 0x86, 0xb9, 0x7b, 0xbb, 0xc7, + 0xd2, 0x1e, 0xe5, 0x67, 0x28, 0x3b, 0x97, 0x87, 0x67, 0xfd, 0x35, 0xb3, 0x43, 0x1a, 0x87, 0xb2, 0x1d, 0x87, 0xf2, 0x3f, 0x8f, 0x71, 0x59, 0xff, 0xc2, 0x4f, 0xe2, 0x1f, 0x06, 0x97, 0x70, 0x7d, + 0x0a, 0x2e, 0xa2, 0xf8, 0x12, 0x5c, 0x1e, 0xcb, 0xc4, 0xcf, 0xba, 0x3d, 0x3b, 0x82, 0xe6, 0x94, 0x16, 0xe2, 0x9e, 0x87, 0x9e, 0x6c, 0x32, 0x51, 0x66, 0xc1, 0x6c, 0xfd, 0x12, 0x7f, 0xa4, 0x9f, + 0x7b, 0x1f, 0x81, 0x2f, 0x00, 0xc4, 0xe1, 0x97, 0xef, 0x2a, 0x47, 0xa5, 0xcb, 0x7a, 0xd5, 0x3b, 0xed, 0xb3, 0xd2, 0x81, 0xa9, 0x2d, 0xbe, 0x78, 0xe7, 0xd3, 0x37, 0x8f, 0xfe, 0x43, 0x51, 0x5b, + 0x71, 0x44, 0x6a, 0x8b, 0x4f, 0x46, 0x4b, 0x61, 0x6c, 0xd0, 0xed, 0x68, 0x17, 0x3e, 0xd7, 0x71, 0x00, 0x7e, 0xbf, 0xcb, 0x9f, 0x06, 0x13, 0xf8, 0xe3, 0x03, 0x56, 0x8a, 0x18, 0xd0, 0xf7, 0xdf, + 0x71, 0xfe, 0xc8, 0xff, 0xf4, 0xfb, 0x1f, 0x9d, 0x22, 0xbe, 0x12, 0xa3, 0x61, 0x40, 0xff, 0x80, 0xff, 0x32, 0x66, 0x70, 0x71, 0xf2, 0x99, 0x18, 0x0d, 0x7f, 0x3f, 0xa6, 0x8b, 0xe4, 0x4f, 0x19, + 0x95, 0x4a, 0xfb, 0xae, 0xaa, 0x24, 0xf3, 0x7b, 0xf7, 0xf1, 0xc7, 0x64, 0x7e, 0x7d, 0x03, 0x69, 0x9f, 0x7d, 0xb7, 0xbc, 0xec, 0xe7, 0xe5, 0x05, 0x3a, 0x63, 0x7d, 0xd9, 0x4b, 0x8c, 0x8f, 0xe5, + 0xc1, 0xeb, 0xc7, 0xef, 0x3d, 0x91, 0xba, 0xf2, 0x9f, 0x6e, 0x04, 0xc0, 0x9f, 0x3e, 0xc0, 0x7e, 0x77, 0x2d, 0xe0, 0xf4, 0xbf, 0x2c, 0x39, 0xfd, 0x44, 0x20, 0xb9, 0x80, 0xda, 0x78, 0xce, 0x57, + 0x49, 0x96, 0xee, 0x8b, 0xe8, 0xef, 0xa5, 0xb1, 0x12, 0xdd, 0x40, 0xee, 0xdd, 0xf3, 0xa9, 0x06, 0x75, 0x55, 0xee, 0x28, 0x98, 0xe8, 0xf9, 0x18, 0x28, 0x7b, 0x16, 0xf1, 0x9b, 0x62, 0xed, 0x27, + 0x76, 0x67, 0x82, 0x93, 0x58, 0x04, 0x33, 0x2f, 0xfa, 0xfb, 0x04, 0xde, 0x3a, 0xdc, 0x0d, 0x62, 0x4c, 0xdf, 0x33, 0x0c, 0x5a, 0x9f, 0x40, 0xe3, 0xea, 0xbb, 0xcc, 0x19, 0x2e, 0x9c, 0x24, 0xc4, + 0xdd, 0x45, 0xdd, 0x66, 0x6b, 0x9f, 0x15, 0xd4, 0xaf, 0x1e, 0x7b, 0xb7, 0xce, 0xaa, 0x06, 0x69, 0xbf, 0xae, 0x79, 0x84, 0x0d, 0x36, 0xb4, 0x97, 0xfd, 0x91, 0xc9, 0x40, 0x0d, 0x5a, 0x1e, 0xa6, + 0xa0, 0xfb, 0x68, 0x4d, 0x40, 0x44, 0xef, 0x13, 0xe4, 0x5b, 0xa2, 0xd6, 0xf1, 0xc8, 0xd9, 0xba, 0x07, 0xb0, 0xce, 0x51, 0x28, 0x8f, 0x3f, 0xce, 0xcd, 0xeb, 0xc5, 0x05, 0x66, 0x51, 0x89, 0x4b, + 0xcc, 0xb3, 0x27, 0xee, 0xd6, 0xe3, 0xde, 0xa7, 0x93, 0x4f, 0x05, 0xae, 0x1d, 0xd1, 0xf8, 0x55, 0x7b, 0x3d, 0x5a, 0xd7, 0xa4, 0x00, 0x8d, 0xb6, 0xa0, 0x4a, 0xe7, 0x23, 0x11, 0x68, 0xa7, 0x78, + 0xec, 0xda, 0xea, 0x3f, 0xb4, 0x7d, 0x2a, 0xb3, 0x4a, 0x35, 0x0b, 0x60, 0xd1, 0xd0, 0x66, 0x32, 0x5e, 0xd9, 0xc9, 0x2e, 0x05, 0xdc, 0x63, 0x82, 0x34, 0xf6, 0x11, 0xfc, 0x6e, 0x69, 0xad, 0x4c, + 0x27, 0x8e, 0x5b, 0xf7, 0xbb, 0x4f, 0x77, 0xb5, 0x32, 0x68, 0x57, 0x68, 0x94, 0x14, 0x15, 0xde, 0x8c, 0xe0, 0x29, 0x8c, 0xe9, 0x51, 0xcc, 0xe4, 0x5d, 0xdd, 0xf8, 0xf0, 0x75, 0x8a, 0x65, 0xc1, + 0x59, 0x90, 0x67, 0x57, 0x5a, 0x03, 0x40, 0xbd, 0x5d, 0xd7, 0xad, 0x1a, 0xbd, 0x35, 0x57, 0x64, 0xe9, 0x06, 0xbd, 0x25, 0x95, 0x1e, 0x2b, 0x07, 0x4c, 0xa7, 0xd0, 0x7b, 0x0e, 0xf6, 0x8b, 0xa3, + 0xca, 0x9b, 0xaa, 0x95, 0x64, 0x62, 0x09, 0x6c, 0x35, 0x60, 0xd3, 0x9e, 0xb5, 0xe2, 0xb9, 0xf9, 0xb8, 0xdd, 0x87, 0xd3, 0xbe, 0xc6, 0x96, 0xe5, 0xa0, 0xb7, 0x15, 0x74, 0xd7, 0xd4, 0x28, 0x6e, + 0x80, 0x52, 0xf2, 0xf6, 0x58, 0x45, 0x93, 0xd3, 0x2f, 0x10, 0x33, 0x71, 0x0b, 0x4f, 0xa9, 0x30, 0x08, 0x4f, 0x30, 0xd4, 0x5c, 0x2b, 0x69, 0x44, 0x2b, 0x52, 0xf0, 0x3e, 0xa1, 0x9a, 0xa9, 0x76, + 0x5e, 0xca, 0xa3, 0x7e, 0xb7, 0x89, 0xfb, 0xbe, 0x65, 0x75, 0x70, 0x18, 0x63, 0x9c, 0x1e, 0x08, 0xf5, 0xaa, 0xef, 0x5e, 0xea, 0x2c, 0x5e, 0x19, 0xb9, 0xf0, 0x06, 0x9c, 0x77, 0xae, 0x62, 0xb9, + 0x19, 0x5c, 0x64, 0xaa, 0xb1, 0x7c, 0x7d, 0x67, 0x85, 0x96, 0xec, 0x99, 0x3b, 0xb2, 0xf5, 0xa6, 0x5d, 0x2c, 0xa3, 0xe5, 0x89, 0xec, 0x8d, 0x34, 0x0a, 0xb2, 0x8b, 0x8a, 0x47, 0x47, 0x86, 0x60, + 0x07, 0x8f, 0x4c, 0xa7, 0x1a, 0x64, 0x80, 0x7a, 0xb9, 0xda, 0xb4, 0x38, 0x24, 0x38, 0x15, 0xe4, 0x76, 0xc7, 0xf0, 0x84, 0x2a, 0x00, 0x4c, 0x7d, 0x82, 0x34, 0xb5, 0x92, 0x1e, 0xa9, 0xad, 0xab, + 0xad, 0x4e, 0x53, 0xe9, 0x42, 0x53, 0x1b, 0xbe, 0x4e, 0x9e, 0x6f, 0x22, 0x6e, 0x45, 0x8d, 0x88, 0x54, 0x97, 0xbf, 0xa5, 0xe3, 0xb2, 0x23, 0xe2, 0x4c, 0x49, 0x95, 0x03, 0xab, 0x21, 0x69, 0x41, + 0x06, 0xbf, 0xd3, 0x37, 0xbb, 0x76, 0xe3, 0xe3, 0x61, 0x1b, 0x60, 0x2c, 0xaf, 0xf2, 0x22, 0x02, 0x87, 0x9f, 0x13, 0x62, 0x14, 0xa9, 0x45, 0xb6, 0xd0, 0xa7, 0xaf, 0xbe, 0xad, 0x37, 0x89, 0x34, + 0xa0, 0xd8, 0x48, 0xc3, 0x48, 0x79, 0xea, 0xda, 0x30, 0x5b, 0xe6, 0xaf, 0x2e, 0x08, 0xdb, 0x6e, 0xe1, 0x19, 0x84, 0x00, 0x92, 0x6d, 0xc3, 0x3d, 0x49, 0xff, 0x7e, 0x9b, 0x0a, 0xc3, 0x8e, 0xc8, + 0x64, 0x3a, 0xa6, 0x53, 0x65, 0x26, 0xfa, 0x13, 0x38, 0x04, 0x3e, 0xd0, 0x21, 0xac, 0xef, 0x91, 0xfb, 0xbb, 0xcd, 0xfa, 0x97, 0x1b, 0xfb, 0x47, 0xe7, 0xd4, 0xb7, 0xc6, 0x29, 0x2b, 0x1c, 0x32, + 0xa8, 0x00, 0x6a, 0x2a, 0xc2, 0x54, 0x84, 0x73, 0x43, 0xc3, 0x29, 0x37, 0x06, 0xdc, 0xe9, 0xc7, 0x25, 0x44, 0xee, 0x8f, 0xb0, 0x53, 0xc0, 0x10, 0x43, 0x1a, 0xdf, 0x81, 0xe9, 0xac, 0x3b, 0x74, + 0xbf, 0xbc, 0x51, 0x2b, 0x9f, 0x0b, 0xcd, 0x91, 0x47, 0xf0, 0x63, 0x65, 0x1c, 0xf8, 0x96, 0xe3, 0x92, 0x19, 0x5a, 0x48, 0xfd, 0x02, 0x26, 0x7a, 0xb9, 0x94, 0x1c, 0x6b, 0x5a, 0xa2, 0xbb, 0x45, + 0x84, 0x71, 0x6d, 0x64, 0xe8, 0x0d, 0x2f, 0x0f, 0x4c, 0x73, 0xf0, 0xd8, 0x59, 0x1d, 0x5c, 0x13, 0x09, 0x46, 0x21, 0x73, 0xc3, 0x97, 0xa1, 0xae, 0xf5, 0xfa, 0x8c, 0x7b, 0x6d, 0xb9, 0xf4, 0xa2, + 0xf8, 0x72, 0x07, 0x02, 0x1c, 0x1e, 0x7c, 0xc4, 0x8c, 0xe7, 0xfc, 0xd1, 0xad, 0x14, 0xbf, 0x05, 0x8e, 0x1d, 0x21, 0x62, 0xb9, 0x69, 0xbd, 0x16, 0x25, 0x9b, 0xbd, 0xb3, 0x27, 0x54, 0x7a, 0x2c, + 0xdb, 0xea, 0x53, 0x68, 0xd3, 0x4a, 0x4d, 0x40, 0x37, 0x04, 0xd1, 0xdf, 0x8a, 0xf2, 0x5a, 0x62, 0x1c, 0xe5, 0x0b, 0x30, 0x5d, 0x08, 0x6d, 0x44, 0x64, 0x5c, 0x0b, 0xba, 0x1c, 0x38, 0xc9, 0x66, + 0xb4, 0xdd, 0xc1, 0x03, 0x5b, 0x8d, 0xe1, 0xbd, 0x03, 0x09, 0x63, 0x8d, 0x48, 0xde, 0x54, 0x64, 0x9b, 0xe1, 0xab, 0x8c, 0xf1, 0xf7, 0xa8, 0xf4, 0xeb, 0x7b, 0x6e, 0x99, 0x78, 0x59, 0x50, 0xc9, + 0xbd, 0x9e, 0xd6, 0x71, 0x83, 0xdc, 0x00, 0x87, 0xb6, 0x2a, 0x17, 0x6f, 0x12, 0x42, 0x55, 0xa8, 0x80, 0x25, 0x25, 0x74, 0x71, 0xb7, 0xf1, 0x0d, 0x80, 0x8c, 0x83, 0x95, 0x9a, 0x91, 0xbb, 0xc9, + 0x1c, 0xa2, 0xcf, 0xa1, 0x15, 0xf5, 0x10, 0xbd, 0xbb, 0xb5, 0xae, 0x34, 0x17, 0x45, 0xd6, 0x4d, 0x4d, 0x74, 0x93, 0x52, 0xb3, 0xd7, 0xb3, 0x70, 0x61, 0x73, 0x98, 0x68, 0xf2, 0xed, 0x09, 0xaa, + 0xb9, 0xde, 0x53, 0x6a, 0x9a, 0xa1, 0xab, 0x21, 0x3b, 0x5d, 0x22, 0xcf, 0x67, 0x22, 0x73, 0x9d, 0xc1, 0x65, 0x40, 0x31, 0x0b, 0x0e, 0xd2, 0xe3, 0x6e, 0x63, 0x97, 0xfd, 0xcd, 0x0f, 0x96, 0x77, + 0x04, 0xa6, 0xd0, 0x02, 0xbe, 0x31, 0x34, 0x5a, 0xce, 0x83, 0x54, 0x52, 0xdc, 0x78, 0xcf, 0x91, 0xeb, 0x65, 0x04, 0x65, 0x8c, 0xa1, 0x95, 0xba, 0xb5, 0x51, 0x92, 0xcb, 0x6e, 0xce, 0x03, 0xd8, + 0x0e, 0xfc, 0xde, 0xcd, 0x9a, 0xd2, 0x9b, 0x57, 0x73, 0x83, 0x63, 0x6b, 0x07, 0xa8, 0x41, 0xe5, 0xdf, 0x7d, 0xe5, 0xf3, 0xf4, 0x4d, 0xcc, 0xce, 0x3d, 0x48, 0x62, 0x5d, 0xba, 0xbd, 0x04, 0x81, + 0x48, 0xb7, 0xda, 0x0f, 0xe6, 0x1d, 0x7e, 0xf9, 0x2a, 0x5d, 0x7b, 0x43, 0x95, 0x17, 0xc8, 0x8a, 0xc6, 0xbc, 0x30, 0x76, 0x4b, 0xc9, 0x2e, 0x60, 0x87, 0xf7, 0xd9, 0x3d, 0xc4, 0x7c, 0x57, 0x4f, + 0x0b, 0xdb, 0xa6, 0x33, 0x7c, 0x6b, 0x09, 0x60, 0xd8, 0x0d, 0x97, 0xd8, 0x30, 0x9c, 0xb6, 0xe4, 0xa0, 0x30, 0xdc, 0x71, 0x7f, 0x61, 0x62, 0x3e, 0x96, 0xee, 0xe3, 0x54, 0x09, 0x87, 0x91, 0x73, + 0xaf, 0x64, 0x21, 0x7a, 0x40, 0x2b, 0xb1, 0xc2, 0x33, 0xe5, 0xe9, 0x5e, 0x0f, 0x1f, 0x2d, 0xa0, 0xea, 0xc2, 0x96, 0x13, 0x86, 0xa9, 0x2b, 0xcf, 0x8e, 0x65, 0xa9, 0xdc, 0x17, 0x87, 0xf4, 0x5e, + 0x16, 0x01, 0x55, 0xc6, 0xbf, 0xb6, 0x2e, 0xd8, 0x98, 0xed, 0x65, 0x31, 0x84, 0x96, 0xcd, 0x14, 0xcb, 0x76, 0x43, 0x68, 0x42, 0x1d, 0x07, 0xf6, 0xc5, 0xf3, 0xa1, 0x61, 0xb7, 0x21, 0x5f, 0x85, + 0x4a, 0x7d, 0x2f, 0xd5, 0x76, 0x49, 0xd6, 0x3c, 0x51, 0xd2, 0xa4, 0xc9, 0xf5, 0x59, 0x45, 0xb8, 0x27, 0x3c, 0xf9, 0x00, 0x32, 0x86, 0x23, 0xf0, 0x6b, 0x1a, 0x6a, 0x19, 0x00, 0x87, 0x1e, 0x31, + 0xfc, 0xa8, 0x8b, 0x57, 0x06, 0x1e, 0xd1, 0x8e, 0x09, 0x94, 0xca, 0x24, 0x9a, 0xb2, 0xac, 0x47, 0x92, 0xd2, 0xaf, 0xa4, 0x92, 0x28, 0x36, 0xd7, 0x4d, 0x1a, 0xda, 0x44, 0xa8, 0x25, 0xbc, 0xb7, + 0x3b, 0xd6, 0xb2, 0xfe, 0xf2, 0xd9, 0xc6, 0x23, 0x1b, 0xdf, 0x59, 0x39, 0x95, 0x8b, 0xfa, 0xae, 0xe5, 0x14, 0x31, 0x1b, 0xb0, 0xe7, 0x0c, 0xe4, 0x4c, 0x4a, 0x49, 0x07, 0x2f, 0xf6, 0xd3, 0x1b, + 0xfa, 0x2b, 0x14, 0xc1, 0x0f, 0xeb, 0x6b, 0xfb, 0x8a, 0x1f, 0x7e, 0x23, 0xa9, 0xf0, 0x7f, 0xfe, 0x23, 0xfe, 0xd9, 0xf6, 0xe7, 0xb7, 0x3f, 0x7f, 0x87, 0x34, 0x44, 0xe7, 0x62, 0x59, 0x86, 0xfb, + 0x8e, 0x9f, 0x62, 0xf4, 0x77, 0x0b, 0x01, 0xdf, 0xb3, 0xdb, 0x3e, 0xe8, 0x4f, 0x3f, 0x82, 0xdf, 0xbd, 0xfc, 0xf2, 0xd7, 0x9a, 0x4f, 0x29, 0xfa, 0xf5, 0x88, 0x06, 0xbe, 0xaa, 0x22, 0x7d, 0x87, + 0x18, 0xf8, 0xfd, 0x2e, 0xa4, 0xc3, 0x1f, 0x5a, 0xec, 0x1a, 0xfb, 0x01, 0xdd, 0xb7, 0xef, 0x7a, 0x92, 0x34, 0xfe, 0xa0, 0xdc, 0x38, 0xf0, 0xca, 0x3f, 0xdc, 0xac, 0xfd, 0x2d, 0xff, 0x83, 0xd7, + 0xb9, 0x01, 0x69, 0xef, 0x43, 0x1a, 0x7c, 0x74, 0x31, 0x2c, 0x2c, 0x5a, 0x68, 0x77, 0x59, 0x7f, 0xbf, 0x74, 0xb7, 0xdd, 0x8d, 0x2f, 0x1e, 0x26, 0x17, 0x3d, 0x46, 0x67, 0x5b, 0xea, 0x0d, 0x7d, + 0x18, 0x0e, 0xf3, 0xa7, 0x3f, 0x22, 0xb3, 0x50, 0x19, 0xf7, 0xd4, 0x29, 0x8b, 0xc2, 0x1d, 0xf8, 0x2c, 0xb5, 0x80, 0xc7, 0x81, 0x55, 0xe6, 0xa1, 0xd1, 0xc9, 0x22, 0xb5, 0xa5, 0x52, 0xfb, 0x9d, + 0xfc, 0xbc, 0xee, 0xaa, 0xde, 0xd7, 0xbf, 0xfe, 0x97, 0xb2, 0x0d, 0xc0, 0x37, 0xdd, 0x86, 0x8f, 0x5a, 0xcb, 0x0f, 0x36, 0x46, 0xc6, 0xc5, 0x1f, 0xba, 0xcb, 0x1f, 0x46, 0xf7, 0xe1, 0xd7, 0x8b, + 0xe8, 0xae, 0xfc, 0x31, 0x66, 0x7c, 0xa4, 0x6d, 0xc6, 0x1f, 0xde, 0xd7, 0xa7, 0xd7, 0x05, 0xfc, 0x4f, 0xbd, 0xaf, 0x4f, 0xaf, 0x0b, 0xf8, 0x9f, 0x7a, 0x5f, 0x9f, 0x56, 0x08, 0xfc, 0x4f, 0xbd, + 0xaf, 0x2f, 0x0f, 0xfb, 0xf6, 0xbe, 0xfe, 0xa6, 0x67, 0xe6, 0xfb, 0x96, 0x99, 0xa5, 0xd8, 0x17, 0x6b, 0x23, 0x6a, 0xc8, 0xe5, 0x6e, 0x53, 0xac, 0x48, 0x68, 0x8d, 0x70, 0xc0, 0xd6, 0x3b, 0x61, + 0x9a, 0xbd, 0x10, 0x2e, 0xf5, 0xe3, 0x3d, 0x7d, 0x68, 0xb3, 0x58, 0xc6, 0xb0, 0x0a, 0xf2, 0xa9, 0xcb, 0xec, 0x61, 0x48, 0x5c, 0xda, 0xaa, 0xb8, 0x7d, 0x21, 0x81, 0xd2, 0x9d, 0x88, 0x1d, 0x95, + 0xca, 0x79, 0x14, 0x49, 0x6f, 0xb0, 0x7e, 0xb9, 0xb9, 0x4e, 0xd3, 0xaf, 0x8b, 0x07, 0x0d, 0x5e, 0x64, 0x15, 0x1b, 0x0b, 0xe4, 0xd1, 0x07, 0x90, 0xba, 0xbf, 0x6e, 0x4f, 0x84, 0x77, 0xc1, 0x7a, + 0x46, 0x67, 0x9a, 0x28, 0x32, 0xf8, 0x96, 0x40, 0xfa, 0x89, 0xe4, 0x1d, 0xc4, 0x6b, 0x03, 0x42, 0x89, 0x8d, 0xb7, 0x51, 0xac, 0x74, 0x4f, 0x26, 0xad, 0xae, 0xa7, 0xb7, 0x5a, 0x3a, 0xf7, 0x65, + 0x4e, 0xa5, 0x51, 0x7a, 0xf5, 0x8e, 0xfa, 0x76, 0x20, 0x7f, 0xd0, 0xef, 0x03, 0xda, 0x60, 0x53, 0xbe, 0x00, 0x24, 0xaf, 0x75, 0x88, 0x20, 0x68, 0x82, 0x27, 0xad, 0x8e, 0xf7, 0x52, 0x90, 0x8a, + 0x0d, 0xef, 0x43, 0xca, 0x10, 0x78, 0x70, 0x37, 0x2a, 0x27, 0x34, 0xf2, 0x0a, 0x95, 0x1b, 0xdf, 0x21, 0x20, 0x93, 0x82, 0xcf, 0x67, 0x1a, 0xf9, 0x09, 0x6b, 0x18, 0x97, 0x56, 0x8b, 0xb4, 0xce, + 0xde, 0x5f, 0x9d, 0x46, 0x4b, 0xa2, 0xaf, 0xde, 0xc2, 0x79, 0xe1, 0x2d, 0xa0, 0xa0, 0x64, 0x21, 0x78, 0x55, 0xf4, 0x30, 0x26, 0xc3, 0x8e, 0xb1, 0x22, 0xdd, 0xc5, 0x0e, 0x1b, 0xce, 0x19, 0x54, + 0x17, 0xac, 0x07, 0x4d, 0x9d, 0xd7, 0xbf, 0xee, 0x0f, 0xb3, 0x18, 0xc9, 0xe9, 0x7c, 0xd7, 0x04, 0xe2, 0x72, 0xab, 0xeb, 0x85, 0x3d, 0x2e, 0x0d, 0xfd, 0x48, 0xd9, 0x36, 0x62, 0x87, 0xf6, 0x1b, + 0xc2, 0xad, 0x79, 0x89, 0x94, 0x81, 0x00, 0xea, 0xd4, 0xbd, 0xf5, 0xec, 0xf5, 0x78, 0x32, 0xc8, 0x44, 0xcf, 0x23, 0xdf, 0x57, 0x38, 0x8a, 0xc8, 0xd5, 0xa6, 0xa4, 0xc6, 0x12, 0xbf, 0x33, 0xb2, + 0x7d, 0x18, 0xe1, 0x9e, 0xea, 0x6f, 0x2a, 0x40, 0x4e, 0x90, 0x9c, 0x2b, 0x90, 0xed, 0x73, 0x7b, 0xdc, 0xae, 0xe4, 0x9d, 0xf6, 0xf1, 0x5e, 0x80, 0x9a, 0x98, 0xa9, 0x6a, 0x45, 0x25, 0x4b, 0x83, + 0x85, 0xc0, 0x61, 0xe8, 0x95, 0x1c, 0x18, 0x9d, 0x37, 0xf1, 0xe9, 0x12, 0xf7, 0x66, 0x11, 0x12, 0x3d, 0x8e, 0x42, 0x34, 0xec, 0xcf, 0x33, 0x3e, 0x3c, 0xc6, 0x49, 0x96, 0x59, 0x1b, 0x4b, 0xc1, + 0x00, 0xc5, 0xbc, 0x28, 0x79, 0xbc, 0x34, 0x68, 0xd9, 0x17, 0x79, 0x69, 0xf2, 0x50, 0x21, 0x65, 0xf7, 0x92, 0xa9, 0xb7, 0x00, 0xdd, 0x99, 0x83, 0x18, 0x77, 0xdf, 0x07, 0x88, 0xd7, 0x6a, 0x98, + 0x97, 0x0a, 0xf6, 0x43, 0xde, 0x0f, 0xf3, 0x31, 0xb5, 0xac, 0x2c, 0x49, 0x30, 0x8f, 0x77, 0x2f, 0xa2, 0xeb, 0xdb, 0x9b, 0xce, 0xb8, 0xfb, 0x18, 0xe4, 0x0f, 0x86, 0x13, 0x9c, 0x31, 0x08, 0x44, + 0xea, 0x94, 0x14, 0x1d, 0x37, 0xce, 0x67, 0x85, 0x80, 0xd4, 0xc0, 0x97, 0x70, 0x38, 0x05, 0x0d, 0xf7, 0x6a, 0x51, 0x45, 0x08, 0x49, 0x20, 0x0f, 0xd2, 0x17, 0xbd, 0xe9, 0xb2, 0xc1, 0x76, 0xea, + 0xb1, 0xe9, 0x2f, 0xed, 0x32, 0x4b, 0x78, 0x36, 0xc5, 0xc9, 0x56, 0xc3, 0x5b, 0x44, 0xbf, 0xe0, 0xca, 0x66, 0x51, 0x4c, 0xa5, 0x1e, 0x6f, 0x25, 0x0f, 0xfb, 0x1c, 0xd2, 0xaa, 0x53, 0xb6, 0xcf, + 0x16, 0x0a, 0x41, 0xf9, 0x9c, 0x95, 0xbd, 0x33, 0xd0, 0x13, 0xef, 0x69, 0x36, 0xac, 0xa1, 0x3e, 0x00, 0xa4, 0x37, 0xd4, 0xd5, 0xf3, 0x95, 0xc1, 0x6b, 0x95, 0xe7, 0x22, 0xd6, 0x2f, 0x0f, 0x8a, + 0x47, 0x70, 0x3e, 0x3a, 0x5e, 0x98, 0xac, 0x5d, 0x85, 0x57, 0x3c, 0x6a, 0xdf, 0x69, 0xa8, 0x1b, 0x7f, 0xc7, 0xf2, 0xe0, 0x79, 0x87, 0xaa, 0xd6, 0x68, 0x32, 0xa8, 0xfd, 0xa5, 0x7d, 0x33, 0xf0, + 0x4f, 0xb8, 0x3a, 0x3f, 0x5c, 0xab, 0x15, 0x12, 0x3d, 0x84, 0xa8, 0xd9, 0xaf, 0x61, 0x1c, 0x25, 0x61, 0xc1, 0x05, 0x5b, 0xc7, 0xcc, 0x12, 0x5f, 0x52, 0x6a, 0xf8, 0x13, 0x79, 0xfd, 0xbb, 0x9e, + 0x19, 0x07, 0xf3, 0xd4, 0xbe, 0x40, 0x97, 0x07, 0x67, 0xda, 0xe2, 0x94, 0xc6, 0xa5, 0x25, 0x17, 0xba, 0x12, 0xe2, 0xeb, 0x26, 0x96, 0x5b, 0x40, 0xc6, 0x74, 0xde, 0xec, 0x1c, 0xa8, 0x77, 0x31, + 0xf5, 0x30, 0x5f, 0xd1, 0x82, 0x5a, 0x40, 0x93, 0xda, 0x49, 0x2c, 0x1f, 0xe3, 0xae, 0x31, 0xa7, 0x75, 0xb9, 0x8e, 0xb8, 0xbf, 0x61, 0x4d, 0x78, 0x38, 0xe7, 0xc4, 0x68, 0x55, 0x9f, 0x92, 0xf3, + 0xa8, 0xd7, 0x94, 0xbc, 0x24, 0xe9, 0x19, 0xcb, 0x2f, 0x29, 0x46, 0x58, 0xed, 0x26, 0xf4, 0xc2, 0x05, 0x29, 0x63, 0x5f, 0x14, 0xa4, 0x89, 0xc5, 0x9c, 0xcc, 0x3c, 0xa9, 0x07, 0x87, 0xf8, 0xd5, + 0x0a, 0x10, 0x9a, 0xf8, 0xaa, 0x04, 0x1f, 0xca, 0x51, 0x8b, 0x57, 0xee, 0xca, 0xab, 0x6a, 0x2f, 0x13, 0x49, 0xbb, 0xee, 0x46, 0xa5, 0x62, 0x38, 0x81, 0x09, 0xaf, 0x74, 0x5a, 0x1e, 0xbc, 0xc0, + 0x64, 0xeb, 0x43, 0xd9, 0x74, 0xdb, 0x7c, 0x78, 0x89, 0x10, 0xeb, 0xcc, 0xad, 0x0e, 0x95, 0xad, 0x36, 0x49, 0xf1, 0x63, 0xbd, 0x31, 0x84, 0xe1, 0x16, 0x9a, 0xa7, 0x02, 0xd1, 0x5b, 0xb9, 0x2c, + 0x12, 0x63, 0x54, 0x54, 0x98, 0xb5, 0xd1, 0x0b, 0x3a, 0xe1, 0xe1, 0x25, 0x77, 0xea, 0x94, 0xe7, 0xd5, 0xd6, 0x3c, 0xcd, 0xa7, 0x95, 0x33, 0x7e, 0x53, 0x38, 0xd1, 0x71, 0x6b, 0x78, 0x8b, 0x5f, + 0xf7, 0x6a, 0x59, 0x03, 0xf3, 0xbe, 0xc9, 0x74, 0xe1, 0x93, 0x2a, 0xbf, 0x70, 0xa0, 0xd7, 0x73, 0x4f, 0x4d, 0xb9, 0x3d, 0xcd, 0xc7, 0x0a, 0x34, 0xb3, 0x70, 0x8b, 0x04, 0xd3, 0xf4, 0xe3, 0xbb, + 0x65, 0x30, 0xf2, 0x63, 0xc5, 0x72, 0x22, 0x95, 0x73, 0xd5, 0x36, 0x9f, 0xf7, 0xb4, 0x38, 0x69, 0xe3, 0xc6, 0x44, 0x62, 0x80, 0xa9, 0x89, 0x94, 0xee, 0x12, 0xa6, 0xb5, 0xf8, 0x2b, 0x70, 0x20, + 0x58, 0xb0, 0x79, 0x7a, 0x5b, 0x27, 0xaa, 0x7b, 0x1e, 0xf7, 0x5b, 0x26, 0xe1, 0x46, 0xd6, 0xa8, 0x02, 0x08, 0xf4, 0x44, 0x51, 0x40, 0xf7, 0xf8, 0x1d, 0x77, 0xa8, 0xd4, 0xd5, 0xdc, 0xca, 0x22, + 0x2e, 0x11, 0xb7, 0xb8, 0xc6, 0xdb, 0xe1, 0x54, 0x7a, 0x1d, 0x98, 0x12, 0x9c, 0xe7, 0x49, 0x64, 0x7d, 0xbf, 0x53, 0x1d, 0x5d, 0xc2, 0x3d, 0x25, 0x7b, 0x05, 0xac, 0xa2, 0xa2, 0x03, 0xcd, 0x03, + 0xd4, 0x08, 0xfd, 0xfe, 0x6e, 0x4c, 0xcc, 0xaa, 0xfb, 0x89, 0x56, 0x03, 0xc0, 0x16, 0xab, 0xf0, 0x30, 0xbc, 0xeb, 0x3a, 0xda, 0xb7, 0xa0, 0x3b, 0x9e, 0x24, 0x6d, 0x2d, 0xfc, 0x64, 0x9f, 0xdc, + 0x4b, 0xa4, 0xd1, 0x55, 0x2c, 0xf8, 0xc0, 0x99, 0x6a, 0x86, 0xc7, 0xf3, 0x51, 0xeb, 0xa2, 0x45, 0xa5, 0x61, 0xd5, 0xe1, 0x88, 0xf8, 0xf1, 0x7e, 0xb2, 0xa0, 0xb5, 0x70, 0x8a, 0xde, 0x55, 0xfe, + 0xe8, 0x08, 0x9a, 0xd7, 0x5b, 0x0d, 0x0d, 0x28, 0x66, 0x99, 0xa1, 0x84, 0xd9, 0xc9, 0x16, 0xee, 0xec, 0x0a, 0xfd, 0xbc, 0x4e, 0xe6, 0x79, 0x36, 0x0b, 0x7a, 0x10, 0xf9, 0x6a, 0xbe, 0x1f, 0xbd, + 0xad, 0x95, 0xa6, 0x1e, 0x6c, 0x72, 0x33, 0x70, 0xaf, 0x81, 0xc9, 0x9d, 0x99, 0x17, 0x3d, 0x6d, 0x2c, 0x60, 0x0c, 0x8f, 0x9c, 0x23, 0x0c, 0x9f, 0x01, 0x49, 0xab, 0xe9, 0xb0, 0xb5, 0x98, 0x80, + 0x8b, 0x00, 0xe8, 0x26, 0x1e, 0x82, 0x3c, 0x39, 0xdc, 0x42, 0x68, 0xf3, 0x29, 0x60, 0x1b, 0x94, 0x98, 0x33, 0x64, 0xc4, 0x0a, 0x91, 0x95, 0xdb, 0xf9, 0x98, 0xfc, 0x96, 0xae, 0x08, 0x8e, 0xa7, + 0xe2, 0x64, 0xe2, 0xc8, 0x06, 0x79, 0x66, 0xbc, 0x5b, 0x6d, 0x2d, 0xd4, 0xf3, 0xdc, 0x16, 0x0d, 0xb7, 0x87, 0xdc, 0x54, 0x0b, 0xea, 0xd7, 0xc2, 0xec, 0xc5, 0x0f, 0x17, 0x68, 0xb3, 0x49, 0x84, + 0xc7, 0x1e, 0x79, 0xf8, 0x26, 0xa7, 0xd1, 0xe5, 0xb3, 0x46, 0x29, 0x17, 0x79, 0x82, 0x8b, 0xf4, 0x37, 0x4a, 0x53, 0x7a, 0x9d, 0xbd, 0xc6, 0x65, 0x7c, 0xae, 0xdf, 0x65, 0x2e, 0xbf, 0x22, 0xa3, + 0xe2, 0x3b, 0x5c, 0x04, 0x43, 0x77, 0xe2, 0x9f, 0xe3, 0xa2, 0xff, 0xef, 0x1f, 0x60, 0x23, 0x36, 0x70, 0x59, 0x96, 0xce, 0xbf, 0xb5, 0xa4, 0xc7, 0x6f, 0x99, 0x7a, 0xa1, 0xcf, 0xa2, 0x26, 0x04, + 0x15, 0x2f, 0x8f, 0x50, 0xb7, 0x24, 0x96, 0xf8, 0x73, 0xaa, 0xb3, 0xfb, 0x39, 0xd5, 0x09, 0x78, 0x17, 0x5f, 0xe8, 0xcc, 0xfe, 0x25, 0x05, 0xe1, 0xbb, 0x41, 0xd7, 0x64, 0x3d, 0x75, 0xa5, 0x70, + 0x0c, 0xfd, 0x59, 0x04, 0x32, 0xda, 0x0d, 0xfa, 0x73, 0x42, 0xe5, 0xbc, 0x1b, 0x49, 0x60, 0x9c, 0x29, 0x62, 0xbc, 0xe3, 0xc1, 0xfa, 0xc8, 0x1b, 0x02, 0xbf, 0x16, 0x82, 0xf4, 0x7e, 0x94, 0x5e, + 0xe2, 0xe4, 0x5d, 0x77, 0xb3, 0xcf, 0xb5, 0xd7, 0x4f, 0x47, 0x37, 0x8f, 0xea, 0x8d, 0xbe, 0x1b, 0x8d, 0x75, 0xff, 0xa3, 0xf6, 0x2a, 0xef, 0xc6, 0xc5, 0xa3, 0x80, 0xde, 0xe8, 0x1f, 0xde, 0x6e, + 0x41, 0xf3, 0xe7, 0x69, 0xff, 0xdb, 0x59, 0x03, 0x7f, 0x35, 0xed, 0x7f, 0x33, 0xeb, 0xbc, 0xa1, 0x2d, 0xe0, 0xf7, 0x35, 0x57, 0xd7, 0x7b, 0x73, 0x10, 0x6b, 0x0d, 0x3e, 0xc3, 0x9f, 0x0f, 0xa3, + 0xa4, 0x1d, 0x91, 0xee, 0xf8, 0x77, 0x32, 0xd7, 0x4c, 0x54, 0xae, 0xdd, 0xf5, 0x48, 0xd5, 0xc1, 0xc6, 0xde, 0x4e, 0x1f, 0xdb, 0x63, 0xf9, 0x88, 0x87, 0x58, 0xc2, 0x81, 0xb5, 0x4a, 0x8e, 0x46, + 0x24, 0x8a, 0xa7, 0x8e, 0xa4, 0x45, 0x12, 0xbd, 0xaf, 0xd7, 0xdb, 0xcc, 0x9c, 0x5b, 0x37, 0x25, 0xcb, 0x48, 0x88, 0x3a, 0x1f, 0x4f, 0x03, 0x0a, 0xbe, 0x55, 0x97, 0xa7, 0xc3, 0xaa, 0x74, 0x2a, + 0x16, 0x25, 0xe3, 0x91, 0x32, 0xa3, 0xb4, 0x12, 0x19, 0xb5, 0x4e, 0x6e, 0x6b, 0x61, 0x91, 0xc4, 0xf5, 0x96, 0x60, 0xfb, 0xe1, 0x31, 0x40, 0xa1, 0xb3, 0x8d, 0xcf, 0x31, 0xce, 0xaf, 0x6e, 0xc1, + 0xd5, 0x3f, 0xd2, 0x1f, 0x71, 0xe5, 0x13, 0xeb, 0xce, 0x4c, 0x90, 0x75, 0x00, 0x34, 0x13, 0x70, 0x29, 0xed, 0x50, 0x75, 0x5e, 0x0f, 0xab, 0xe2, 0x56, 0xc3, 0xa5, 0x2d, 0xa6, 0x6c, 0x5f, 0x4c, + 0xc9, 0xf3, 0x74, 0x24, 0x23, 0x82, 0xc5, 0x7f, 0x3c, 0x98, 0xfe, 0xf9, 0x7b, 0xb6, 0x1b, 0x23, 0xcd, 0x31, 0x1d, 0xdd, 0x30, 0x11, 0xd9, 0x22, 0x33, 0xf7, 0xe8, 0x9e, 0x40, 0xb8, 0x61, 0xa5, + 0x9a, 0x2d, 0x38, 0xb9, 0xbe, 0x03, 0x7d, 0xb4, 0xe2, 0x07, 0x72, 0xf9, 0x1a, 0xa9, 0x1e, 0x97, 0x62, 0x6e, 0x9e, 0xb6, 0x28, 0xfa, 0x92, 0x8a, 0x44, 0x48, 0x28, 0xc6, 0x64, 0x39, 0x98, 0x58, + 0x0b, 0xcc, 0x2c, 0xa7, 0x10, 0x4b, 0xb2, 0xba, 0xc5, 0xc6, 0xb8, 0x9d, 0x40, 0xdc, 0x7b, 0x0a, 0x1c, 0xc3, 0x69, 0x75, 0x26, 0xb1, 0x81, 0xc2, 0x58, 0xbd, 0x46, 0xf4, 0x98, 0x7a, 0xcb, 0xad, + 0x78, 0x91, 0x8f, 0xf5, 0xea, 0xf1, 0x8d, 0x19, 0x6b, 0x06, 0x22, 0xc8, 0xe4, 0x6e, 0x05, 0xf2, 0x83, 0x7c, 0xad, 0x45, 0xae, 0x73, 0x3c, 0xdc, 0xbb, 0xc8, 0x5f, 0xdb, 0x65, 0x7d, 0x8b, 0xe2, + 0x0f, 0xb5, 0xda, 0xff, 0x97, 0x51, 0x2c, 0xcc, 0x1c, 0xcb, 0xd2, 0xd8, 0x57, 0x73, 0x2d, 0x4b, 0x5a, 0xcd, 0x90, 0xf5, 0x6f, 0xd1, 0xaa, 0x19, 0x52, 0xc6, 0xe0, 0xf3, 0x7b, 0xa0, 0x84, 0xe5, + 0x97, 0xbe, 0xf8, 0x3f, 0x86, 0x04, 0xf0, 0x7f, 0x13, 0x13, 0xbf, 0x0b, 0x09, 0xe0, 0x0f, 0x99, 0xd6, 0x7f, 0x1e, 0x13, 0x3f, 0x46, 0xb2, 0x7c, 0xff, 0x74, 0xb7, 0xf8, 0x12, 0xc9, 0xc0, 0xa7, + 0x50, 0xfe, 0x14, 0xde, 0x3a, 0xf7, 0xa1, 0x0f, 0xf7, 0x5f, 0x45, 0x32, 0xf0, 0x57, 0xd3, 0xfe, 0xb7, 0xb3, 0x06, 0xfe, 0x79, 0xae, 0x94, 0x53, 0x03, 0x02, 0xf7, 0x74, 0x74, 0x9f, 0xba, 0x98, + 0x0f, 0xd8, 0x29, 0xa0, 0x6c, 0x58, 0x63, 0xea, 0xa7, 0x19, 0x1b, 0x2b, 0x25, 0xb6, 0x7a, 0xdf, 0x01, 0x44, 0x58, 0xcd, 0x29, 0x54, 0xd8, 0xc9, 0xa3, 0x1c, 0xe2, 0x3b, 0x7d, 0x49, 0x89, 0xd8, + 0x83, 0x20, 0xd7, 0x59, 0xb8, 0xc9, 0xd3, 0x5d, 0xc6, 0x84, 0xf1, 0x21, 0x5b, 0xb2, 0xe2, 0xf2, 0xda, 0x79, 0x3b, 0xae, 0x75, 0x6c, 0xb5, 0x84, 0xd5, 0x8a, 0x10, 0x8a, 0x73, 0x4e, 0x4f, 0xed, + 0x41, 0xef, 0x9e, 0x1d, 0xf1, 0xe2, 0x67, 0xef, 0x65, 0x11, 0x05, 0xe0, 0x40, 0x7a, 0x5e, 0xed, 0x85, 0xc3, 0x63, 0x2c, 0x5d, 0xc2, 0xd6, 0xdd, 0xb4, 0x5c, 0x12, 0x2b, 0xba, 0x65, 0x21, 0xa2, + 0xa7, 0xa7, 0x58, 0x68, 0xec, 0x33, 0x99, 0x00, 0x25, 0xd8, 0x3a, 0x06, 0x77, 0x49, 0xf3, 0x42, 0xdc, 0x88, 0x85, 0x21, 0xaf, 0x4f, 0xe5, 0xc5, 0xa9, 0x87, 0xc4, 0xa8, 0xaf, 0x9e, 0x6d, 0x91, + 0xf4, 0x11, 0x13, 0x8f, 0x9d, 0x00, 0xee, 0x7e, 0x7e, 0xbe, 0xb9, 0x9b, 0x7c, 0xa6, 0x5a, 0xe1, 0xc0, 0x6f, 0x54, 0x86, 0x77, 0x6e, 0xa7, 0x03, 0xaa, 0xcb, 0x9e, 0x46, 0x76, 0xad, 0x7d, 0x29, + 0xba, 0x8d, 0x38, 0xef, 0x1b, 0xe8, 0x65, 0x02, 0x59, 0x26, 0x70, 0x8f, 0x3c, 0xee, 0x05, 0x67, 0xa4, 0x07, 0x2e, 0x11, 0xca, 0x39, 0x57, 0xab, 0x32, 0xdb, 0x8d, 0x22, 0xb9, 0xe6, 0x28, 0x83, + 0x40, 0xde, 0xb2, 0xd0, 0xe5, 0x2b, 0x95, 0x17, 0xd2, 0xe3, 0x83, 0x0c, 0x85, 0xe0, 0xad, 0x29, 0x0d, 0xdf, 0x13, 0x82, 0xb0, 0x1a, 0xe7, 0x83, 0x1a, 0x5c, 0x6f, 0x77, 0xba, 0x19, 0xb9, 0xdf, + 0x86, 0x7a, 0xec, 0xd0, 0x67, 0x78, 0xf3, 0xd1, 0xb2, 0x34, 0xce, 0xca, 0x39, 0x35, 0xe2, 0x2e, 0xf7, 0xeb, 0xb6, 0x60, 0x52, 0x07, 0xe5, 0x7e, 0x81, 0x52, 0x02, 0x70, 0x8a, 0xd9, 0x58, 0x29, + 0x5e, 0x96, 0x70, 0xdc, 0x9b, 0x80, 0x86, 0xd2, 0x08, 0xd7, 0x16, 0xc3, 0xea, 0xbd, 0x33, 0x26, 0xa3, 0x72, 0x17, 0xd0, 0xcf, 0xac, 0xf1, 0x75, 0x7f, 0x5e, 0x43, 0xf5, 0x48, 0xed, 0xba, 0x78, + 0x4a, 0xb3, 0x52, 0xd8, 0xb2, 0xd9, 0x4e, 0xd9, 0xcb, 0xe7, 0x09, 0x43, 0x7b, 0x90, 0x6e, 0xb3, 0x6f, 0x89, 0x18, 0x25, 0xb6, 0x03, 0xe8, 0x5a, 0x87, 0xcb, 0x3c, 0xf5, 0xe6, 0xae, 0xca, 0x3d, + 0x2f, 0x5d, 0xe7, 0xcf, 0xed, 0x71, 0x9f, 0x66, 0x4a, 0x5d, 0xca, 0x75, 0xb1, 0x0f, 0xca, 0xb9, 0x4b, 0xaa, 0x4d, 0x09, 0xb2, 0x82, 0x28, 0x79, 0x05, 0xbe, 0x7d, 0xbb, 0x88, 0xe5, 0x38, 0x86, + 0xdf, 0xde, 0xc4, 0xe2, 0x01, 0x2e, 0x47, 0xb1, 0x9f, 0x39, 0x03, 0x5c, 0x63, 0x77, 0xc6, 0x7f, 0x01, 0x9d, 0x6e, 0x4f, 0xf2, 0xd4, 0x40, 0x3a, 0xc8, 0xad, 0xa0, 0x2f, 0x9a, 0x96, 0xcf, 0x29, + 0x06, 0x4f, 0xc1, 0xad, 0x7a, 0x91, 0xa6, 0x2e, 0x45, 0x68, 0xb8, 0x61, 0x28, 0x68, 0x7a, 0xa8, 0x17, 0x4f, 0xe7, 0x8e, 0xaa, 0x9e, 0xb8, 0xb8, 0xdb, 0xbc, 0x3f, 0x8c, 0xfb, 0x8c, 0xf0, 0xaf, + 0xc0, 0x2a, 0x6d, 0x2c, 0x78, 0x75, 0x59, 0x5d, 0xad, 0x83, 0x02, 0x40, 0xab, 0x14, 0x7a, 0x85, 0xf9, 0x32, 0xc9, 0xd8, 0xbf, 0xd9, 0xa8, 0x09, 0x21, 0x96, 0x0a, 0xe5, 0xf3, 0x8c, 0xf7, 0x3d, + 0xda, 0x9d, 0xf5, 0xc3, 0xd1, 0x2d, 0x09, 0x14, 0x14, 0xce, 0x7c, 0xbb, 0xaa, 0xef, 0x7a, 0xcb, 0xa2, 0xc6, 0xf3, 0xae, 0x5c, 0x18, 0x39, 0x4a, 0x15, 0xdf, 0xbf, 0x68, 0x3b, 0xef, 0x86, 0x85, + 0x24, 0x6e, 0x32, 0xae, 0x2a, 0x00, 0xdb, 0xb9, 0x9e, 0xa0, 0xb5, 0xf3, 0x6c, 0x3c, 0x17, 0x30, 0x79, 0x1b, 0x8a, 0x5f, 0x9e, 0x45, 0x04, 0x5a, 0x01, 0x56, 0x62, 0x07, 0x5d, 0x8a, 0x7b, 0x72, + 0xdc, 0xb8, 0x06, 0xa2, 0xa7, 0x2f, 0x0c, 0xbf, 0xdf, 0x69, 0x91, 0x44, 0xd1, 0x0e, 0xfc, 0x4e, 0x8c, 0xe4, 0xfb, 0xf4, 0x27, 0x9b, 0xad, 0xf1, 0x13, 0x4d, 0xce, 0x4c, 0x26, 0x93, 0xfd, 0x1a, + 0x9a, 0xdd, 0x18, 0xa6, 0x37, 0xb1, 0x1a, 0x4b, 0xad, 0xff, 0xa0, 0x45, 0x02, 0x7c, 0x2f, 0x46, 0xf2, 0x0b, 0xf1, 0xbb, 0x3f, 0xd2, 0xa2, 0xea, 0xf9, 0x7e, 0x74, 0x08, 0xcb, 0xc7, 0x89, 0xd2, + 0xcc, 0x8f, 0xa1, 0x5d, 0x93, 0x50, 0x48, 0x4b, 0x77, 0x9c, 0x63, 0x56, 0x2b, 0x35, 0x43, 0x28, 0xfd, 0x58, 0x21, 0xc7, 0x12, 0xc0, 0xb5, 0x19, 0xc5, 0x99, 0xd7, 0xe2, 0x26, 0x75, 0xe8, 0xcf, + 0x58, 0x67, 0x11, 0xe2, 0x83, 0x56, 0x56, 0xe7, 0xf2, 0x43, 0xc3, 0xbb, 0xba, 0x35, 0x6a, 0x4f, 0x8d, 0xf3, 0x57, 0x52, 0x6b, 0x9d, 0x5b, 0x79, 0xb0, 0x0f, 0xf2, 0x6e, 0xb2, 0xa5, 0x6e, 0x3c, + 0xcc, 0x25, 0xdf, 0x78, 0xf7, 0xd6, 0xa3, 0x47, 0x62, 0x57, 0x8f, 0x75, 0xad, 0x24, 0x12, 0x02, 0x72, 0x15, 0x56, 0x26, 0x12, 0xc7, 0xee, 0x54, 0xf1, 0xac, 0x44, 0xc7, 0x79, 0x4f, 0x41, 0xf5, + 0xb2, 0x3a, 0x57, 0xa7, 0x90, 0x8d, 0xdd, 0x26, 0xd5, 0x8b, 0xb0, 0xb7, 0x9f, 0x6c, 0xf8, 0x1a, 0xdb, 0xe2, 0x6b, 0x3c, 0x6e, 0xb0, 0xaa, 0x58, 0x4a, 0xe0, 0x97, 0x25, 0x9f, 0xa6, 0xfa, 0xee, + 0x6c, 0xa9, 0x16, 0x44, 0xb9, 0x60, 0x75, 0x88, 0xf2, 0x68, 0x01, 0xd0, 0x34, 0x7c, 0xc1, 0x85, 0xd1, 0x34, 0xd3, 0xd5, 0x89, 0xd1, 0x98, 0x24, 0xf2, 0x37, 0x04, 0x76, 0x0f, 0x0f, 0x1b, 0x2a, + 0x67, 0xf0, 0xca, 0x21, 0xf6, 0x1e, 0x98, 0x91, 0x66, 0xf4, 0x4d, 0x88, 0x45, 0xb3, 0x92, 0xea, 0x54, 0x09, 0x83, 0xc9, 0x81, 0xe7, 0xbc, 0x0c, 0xd5, 0x23, 0x57, 0xb0, 0x30, 0xd5, 0x76, 0x3f, + 0x89, 0xcd, 0xa6, 0x38, 0x80, 0x1b, 0xdc, 0x2e, 0x6d, 0x2c, 0xba, 0x68, 0x4e, 0xe9, 0xe3, 0x95, 0xc3, 0x6e, 0x22, 0x3e, 0x41, 0x11, 0x2a, 0xa4, 0xfc, 0x81, 0x13, 0x8f, 0x37, 0x64, 0xdb, 0x90, + 0x9b, 0x66, 0x37, 0x24, 0x28, 0xbc, 0x5a, 0x41, 0xe4, 0x57, 0xf5, 0x36, 0xc2, 0xed, 0xe2, 0x56, 0x85, 0x47, 0xb2, 0xa7, 0x9f, 0x10, 0x23, 0xf1, 0x40, 0x0d, 0xa9, 0x57, 0xf6, 0x82, 0x3b, 0x01, + 0xba, 0x97, 0x90, 0xe9, 0xbd, 0x3f, 0xb6, 0x63, 0x0f, 0x59, 0x1c, 0x63, 0xe0, 0xf0, 0xa4, 0x14, 0xfc, 0x41, 0x69, 0xcd, 0xcb, 0x6e, 0x31, 0xe7, 0xc8, 0x0e, 0xa8, 0xad, 0x71, 0x2a, 0x95, 0xe5, + 0x7e, 0x5d, 0xe1, 0xbc, 0x2f, 0x9e, 0x1e, 0x7e, 0xcc, 0x49, 0xa0, 0xdf, 0x30, 0xb7, 0x5d, 0x2a, 0x71, 0xb1, 0x45, 0xfb, 0x98, 0xba, 0x5b, 0x43, 0x0e, 0x01, 0x10, 0x37, 0x7c, 0x69, 0xd9, 0xac, + 0xa4, 0x59, 0x57, 0xb0, 0x27, 0x24, 0xd4, 0xeb, 0x53, 0x5b, 0xde, 0x16, 0xd7, 0xa7, 0x24, 0x86, 0xe4, 0x0e, 0xbc, 0x51, 0x43, 0xe6, 0x16, 0x7b, 0xd5, 0x28, 0x49, 0x4c, 0x0b, 0xe7, 0x07, 0xbf, + 0xcd, 0x8f, 0x9a, 0x9e, 0x26, 0x31, 0x70, 0x62, 0xf9, 0x9e, 0x12, 0x2f, 0x76, 0xdc, 0x32, 0x0d, 0xeb, 0x0f, 0xfa, 0xe4, 0x01, 0x02, 0x0c, 0x34, 0x12, 0xd3, 0x19, 0x50, 0x9c, 0xad, 0x16, 0xce, + 0xb5, 0xa5, 0xaf, 0x9b, 0x35, 0x50, 0x1f, 0xb8, 0x0b, 0xea, 0x45, 0xb3, 0x16, 0x1c, 0x58, 0xe8, 0x9b, 0x1e, 0x93, 0xc4, 0xf5, 0xa4, 0x72, 0x53, 0x93, 0xdd, 0xcb, 0x38, 0xd1, 0xd8, 0xc2, 0xd2, + 0x14, 0x72, 0x5e, 0x04, 0xaa, 0xbb, 0x03, 0x43, 0x8a, 0x30, 0x68, 0x2c, 0x97, 0xea, 0x02, 0x19, 0x64, 0x05, 0x69, 0xd1, 0x40, 0x14, 0xc8, 0xfa, 0xa5, 0x0c, 0x06, 0xa1, 0x5b, 0xb7, 0x94, 0xfa, + 0x2e, 0xd8, 0x86, 0x95, 0x5a, 0xaa, 0x32, 0x68, 0x49, 0xa8, 0x6d, 0x27, 0xd7, 0xcc, 0x56, 0xe5, 0x03, 0x84, 0xea, 0x56, 0x38, 0x83, 0xbc, 0x1a, 0xce, 0x84, 0x7e, 0x9b, 0x67, 0xa3, 0x22, 0x46, + 0x48, 0xd1, 0xb3, 0x2c, 0xd3, 0xcf, 0x06, 0xe7, 0x00, 0x4c, 0x4d, 0xdf, 0xeb, 0xce, 0xef, 0x61, 0x27, 0x36, 0xc5, 0xd3, 0xdf, 0x93, 0x24, 0x66, 0x6c, 0x1a, 0x14, 0x17, 0xf6, 0xb4, 0x8f, 0x06, + 0x99, 0x5f, 0x25, 0xc8, 0xff, 0x25, 0x73, 0xe1, 0xff, 0x38, 0x57, 0x5d, 0x0e, 0xe3, 0xd7, 0xba, 0xea, 0xef, 0x41, 0xc2, 0xdf, 0x81, 0x01, 0xd6, 0xfa, 0x04, 0x06, 0x8a, 0xaf, 0xfe, 0x5a, 0x3a, + 0xed, 0xdb, 0x32, 0x71, 0x4a, 0x54, 0x77, 0x6f, 0x0d, 0xca, 0xb2, 0xd4, 0x9f, 0x35, 0x38, 0x75, 0x89, 0xff, 0xb9, 0x0a, 0xe9, 0xeb, 0x36, 0xff, 0x39, 0xac, 0x3f, 0x04, 0x63, 0x2b, 0x36, 0x0f, + 0xec, 0x2a, 0x13, 0x3f, 0x74, 0x63, 0xbe, 0x55, 0x1a, 0xcb, 0xdd, 0xf8, 0x72, 0xcc, 0xc6, 0x81, 0x5e, 0xba, 0x92, 0xdd, 0x6a, 0x0d, 0x1f, 0xea, 0x8c, 0xf7, 0xf1, 0xfb, 0xc8, 0xda, 0x4d, 0xbf, + 0x15, 0x3c, 0x47, 0xf0, 0xd6, 0x4f, 0x28, 0xfc, 0x6e, 0x72, 0x16, 0x64, 0xba, 0xd9, 0x21, 0x35, 0x74, 0xf6, 0xa5, 0xe9, 0x4d, 0x08, 0xbc, 0xd5, 0x43, 0xa6, 0x29, 0x86, 0xb1, 0xf7, 0x0f, 0x85, + 0xd4, 0x86, 0x3e, 0x8c, 0x6f, 0xc5, 0xd4, 0x4f, 0x80, 0xe0, 0xd0, 0x1b, 0x1a, 0xd1, 0xb9, 0xf8, 0xab, 0xca, 0xd4, 0x0f, 0x83, 0xbf, 0x5b, 0xc6, 0xdf, 0xad, 0x02, 0xf8, 0x37, 0xcb, 0xf8, 0xbb, + 0x55, 0x00, 0xbf, 0x5e, 0x06, 0x13, 0xeb, 0x8c, 0xfe, 0x03, 0xed, 0xe1, 0xcb, 0x3f, 0x80, 0xde, 0x79, 0x89, 0x86, 0x64, 0x9a, 0x51, 0xd2, 0xec, 0x11, 0xbd, 0xa2, 0x45, 0x5a, 0xdf, 0x47, 0x5d, + 0x80, 0xb6, 0xc2, 0x1e, 0xc0, 0x72, 0x8f, 0xfc, 0x02, 0xc5, 0x38, 0x45, 0x82, 0x92, 0x4a, 0x18, 0xb6, 0x08, 0xae, 0xcf, 0xa3, 0xc3, 0x25, 0x88, 0xf1, 0x65, 0x69, 0xae, 0xad, 0x57, 0x7a, 0x77, + 0xc7, 0xf5, 0x55, 0x98, 0x13, 0xdb, 0x47, 0x02, 0x35, 0xea, 0xaf, 0x40, 0xb4, 0x72, 0x50, 0x0a, 0xce, 0x83, 0x38, 0x9e, 0x18, 0x59, 0xac, 0xf3, 0x67, 0x19, 0xc1, 0x3f, 0xc4, 0x05, 0xfe, 0x81, + 0xfb, 0x21, 0x2f, 0xfe, 0x24, 0x23, 0x28, 0xf1, 0xb6, 0x27, 0x43, 0xc9, 0x8b, 0x29, 0xe8, 0xf3, 0x78, 0x91, 0x84, 0x78, 0xc6, 0xdc, 0x1b, 0x78, 0x5f, 0x34, 0xbf, 0x73, 0x3f, 0x57, 0xc3, 0x7e, + 0xfd, 0xe1, 0xcf, 0x9f, 0xfd, 0x11, 0xda, 0x97, 0x86, 0x42, 0x73, 0x8c, 0x48, 0xd7, 0x3c, 0x0d, 0xac, 0xfe, 0x33, 0xbf, 0xa3, 0x93, 0xcf, 0x5e, 0x69, 0x55, 0xb5, 0x2e, 0x7e, 0x37, 0xba, 0xb1, + 0x49, 0x9b, 0x4c, 0x46, 0x67, 0x95, 0xcb, 0xad, 0xf7, 0xb3, 0x98, 0x2e, 0x42, 0xa3, 0x8c, 0x54, 0x2d, 0x59, 0xd9, 0xe2, 0xb4, 0x29, 0xb5, 0x1c, 0x70, 0x2b, 0xee, 0xb8, 0x4e, 0x81, 0xed, 0xed, + 0xba, 0x8c, 0x88, 0x7a, 0xbb, 0xdd, 0x44, 0xae, 0xda, 0x61, 0x02, 0xcb, 0xfb, 0x38, 0xe7, 0x6e, 0x8d, 0xc1, 0xe2, 0x99, 0xe9, 0x7f, 0x43, 0x69, 0xc8, 0x8a, 0xd7, 0xea, 0xc8, 0xa2, 0xf1, 0x35, + 0xea, 0xc4, 0x5f, 0x7a, 0x4c, 0xfc, 0x5d, 0xc4, 0x09, 0xf6, 0xc5, 0xb2, 0xf4, 0xf9, 0xf5, 0x12, 0xad, 0xf0, 0x16, 0x0d, 0xad, 0x2d, 0x21, 0x1a, 0x35, 0x04, 0xff, 0x2a, 0x93, 0xa5, 0xf3, 0x3f, + 0x7d, 0x55, 0x3b, 0xe5, 0xa1, 0xdb, 0xd6, 0x0e, 0xf0, 0x5f, 0x15, 0xd1, 0x56, 0xce, 0xf6, 0x15, 0xcf, 0x83, 0x3a, 0xc9, 0xad, 0x19, 0xd7, 0x72, 0xbf, 0x6b, 0x7c, 0x3d, 0x74, 0x37, 0xfa, 0x84, + 0x4b, 0x05, 0x43, 0xb1, 0x21, 0xb4, 0xf4, 0x5a, 0xea, 0xe1, 0x7f, 0x50, 0x81, 0x18, 0x49, 0x6f, 0xbe, 0x06, 0xcc, 0x09, 0xe8, 0x5c, 0xb4, 0x9b, 0xae, 0x8c, 0xe8, 0x97, 0xff, 0x85, 0x7d, 0x70, + 0x7e, 0x3f, 0xf6, 0xbb, 0x59, 0xfc, 0x6a, 0x12, 0xc0, 0xbf, 0x9b, 0xc5, 0x5f, 0x4b, 0xb4, 0x02, 0x3f, 0x68, 0xb4, 0xea, 0x9c, 0x90, 0xdb, 0xbd, 0xfd, 0xf4, 0x6c, 0x28, 0x97, 0x9f, 0x20, 0xd7, + 0x6c, 0x01, 0x62, 0x94, 0x8c, 0xb0, 0x5c, 0x5b, 0x84, 0x49, 0x03, 0x0b, 0xdf, 0x4c, 0x73, 0x9f, 0x26, 0x71, 0xb8, 0x58, 0x14, 0x07, 0xd9, 0x66, 0x4c, 0xc3, 0x70, 0xa4, 0x42, 0x9c, 0xd2, 0xab, + 0xe0, 0x09, 0x61, 0x80, 0x01, 0xc9, 0xfb, 0xbb, 0xe3, 0xe6, 0xb5, 0x04, 0xa7, 0xda, 0x28, 0x37, 0x2d, 0x68, 0x2b, 0x8c, 0xe2, 0x11, 0x91, 0xc7, 0xa8, 0x36, 0xf7, 0x82, 0x10, 0x5e, 0x53, 0x5a, + 0x97, 0x31, 0x6b, 0x87, 0xe0, 0xca, 0x57, 0x31, 0x0f, 0xf6, 0x1e, 0x92, 0xa7, 0x75, 0x0d, 0x49, 0x0a, 0x10, 0x48, 0x64, 0x1c, 0xf3, 0x8a, 0x37, 0x79, 0x45, 0xe5, 0xfe, 0xd9, 0x02, 0x49, 0xca, + 0x8c, 0x87, 0x7b, 0xb5, 0xa9, 0x30, 0x89, 0x18, 0x89, 0x48, 0xe0, 0x76, 0xe3, 0x09, 0x7e, 0xa3, 0x92, 0xd9, 0x59, 0x6e, 0xd9, 0x3e, 0x7a, 0x05, 0xe8, 0xac, 0x6c, 0xff, 0x9a, 0xaf, 0x20, 0x71, + 0x4d, 0x97, 0x67, 0xf5, 0xa8, 0xbf, 0x1e, 0xd5, 0x34, 0x80, 0x4e, 0x46, 0xb2, 0x83, 0x1b, 0x3e, 0x06, 0x51, 0xa8, 0x83, 0x42, 0x26, 0xf5, 0x12, 0xd8, 0x5d, 0xe8, 0xf1, 0xb8, 0x2a, 0x7a, 0x79, + 0xe0, 0xac, 0xcd, 0xd5, 0x73, 0x50, 0xcd, 0x6a, 0x02, 0x1b, 0x91, 0xa9, 0x59, 0x3e, 0x44, 0x44, 0x76, 0x12, 0x2e, 0x85, 0x6f, 0xe2, 0xba, 0x58, 0xab, 0x4b, 0x36, 0x65, 0x37, 0xf9, 0xde, 0xa7, + 0xa7, 0xa3, 0xf2, 0xbb, 0x95, 0x3f, 0x2e, 0xe9, 0x56, 0xfb, 0xe4, 0xe8, 0x64, 0xda, 0xd6, 0xc7, 0x4f, 0x63, 0x02, 0xf2, 0xc0, 0xa4, 0xba, 0xe7, 0x92, 0x76, 0x24, 0xd2, 0xce, 0xea, 0x0d, 0x86, + 0x3c, 0x7c, 0x84, 0xa3, 0xe9, 0x50, 0x74, 0x08, 0x7e, 0xa4, 0x67, 0x70, 0x3c, 0x84, 0x65, 0x4e, 0x88, 0xee, 0xda, 0xef, 0x9b, 0x4a, 0xc3, 0x3b, 0xf7, 0x0a, 0x55, 0x2f, 0x5c, 0x51, 0x41, 0xd7, + 0x4b, 0x0d, 0xb9, 0x11, 0x82, 0x10, 0x56, 0x7c, 0x3c, 0x50, 0x77, 0x6b, 0xae, 0x80, 0xa1, 0xd4, 0x9a, 0xa8, 0xbb, 0xbd, 0x0c, 0x6f, 0x59, 0x36, 0x49, 0x1b, 0x1f, 0xcd, 0xfd, 0xf1, 0x62, 0x4f, + 0x42, 0x1b, 0xd3, 0x7a, 0x44, 0x92, 0x07, 0x16, 0xeb, 0xf3, 0x85, 0x07, 0xaf, 0x53, 0x38, 0x0d, 0x67, 0x4f, 0x6f, 0x7c, 0x9b, 0x2c, 0x85, 0xbe, 0x78, 0xcc, 0x15, 0x96, 0x73, 0x0e, 0x6a, 0x78, + 0x42, 0xfa, 0xee, 0x91, 0x28, 0x01, 0x81, 0xc0, 0x40, 0x93, 0xc5, 0xf1, 0x6b, 0xac, 0x05, 0x6e, 0x11, 0x15, 0xfc, 0xa0, 0x86, 0xc3, 0x0b, 0xcc, 0x1b, 0x0c, 0x21, 0x46, 0xbd, 0xa2, 0xf1, 0x68, + 0xda, 0x9e, 0xb3, 0x50, 0xb7, 0xbb, 0x80, 0xe4, 0xbd, 0x5a, 0x11, 0x62, 0x06, 0x3e, 0x46, 0x91, 0x43, 0x85, 0x64, 0xf2, 0x18, 0xf2, 0x59, 0x4c, 0xfd, 0x2b, 0x22, 0x40, 0x5e, 0x40, 0x9e, 0x07, + 0xe7, 0xbe, 0x9f, 0x00, 0x85, 0x1d, 0xd5, 0x72, 0x05, 0x51, 0xdd, 0xcc, 0x27, 0xc1, 0xed, 0x89, 0x71, 0x51, 0x60, 0x83, 0x69, 0x0f, 0xd8, 0x96, 0xbd, 0xd8, 0x18, 0x2d, 0xba, 0xf2, 0x99, 0x1b, + 0x74, 0xe3, 0xf1, 0xe3, 0x6c, 0xce, 0xe7, 0x1c, 0x53, 0x50, 0x3a, 0xa1, 0x76, 0x13, 0x2f, 0x69, 0x79, 0x6a, 0xd9, 0xe2, 0x71, 0x02, 0x17, 0x95, 0x70, 0xc0, 0x11, 0xaf, 0x2e, 0x03, 0x2e, 0x72, + 0x11, 0x82, 0xf6, 0xc2, 0xc5, 0x38, 0x7f, 0xdd, 0x3b, 0xc8, 0x85, 0x48, 0x25, 0xf3, 0xb5, 0xfd, 0xcc, 0x70, 0x06, 0xa5, 0x9e, 0xc2, 0x2a, 0x2d, 0xdb, 0x73, 0x4a, 0x92, 0xa7, 0xbc, 0x5e, 0xb6, + 0x17, 0xe3, 0x6c, 0x11, 0xd8, 0xa5, 0x6a, 0xeb, 0xe0, 0x78, 0xbb, 0x3f, 0xb2, 0x7e, 0x7e, 0xa1, 0xab, 0xdb, 0x6d, 0xac, 0xed, 0x6b, 0xbc, 0xad, 0x01, 0xf5, 0x58, 0xf1, 0x83, 0x3e, 0xf3, 0xd0, + 0x39, 0x12, 0x5f, 0x34, 0x5a, 0x3f, 0x68, 0xe9, 0xff, 0xd8, 0x59, 0xf6, 0xdb, 0xde, 0x0a, 0x7c, 0xde, 0x5c, 0x59, 0xd9, 0xb9, 0xf7, 0xc7, 0x5a, 0x94, 0x28, 0x13, 0xbe, 0xae, 0x76, 0x57, 0x72, + 0xd2, 0x2e, 0x87, 0xce, 0xde, 0xe8, 0x5f, 0x29, 0xcc, 0x7d, 0xee, 0xc5, 0x8c, 0x0c, 0x34, 0xd9, 0xcc, 0xe7, 0x19, 0xc9, 0x9a, 0x4f, 0x5f, 0x26, 0x03, 0x9c, 0x7b, 0xa2, 0x92, 0x8e, 0xa2, 0xe0, + 0x45, 0x33, 0xb7, 0xe1, 0x4d, 0xd4, 0xef, 0xd8, 0x28, 0x5a, 0xa6, 0x68, 0x42, 0x3a, 0x73, 0xed, 0xf9, 0x8e, 0xd1, 0x65, 0x11, 0x47, 0x81, 0x8d, 0x55, 0x7c, 0xbd, 0xde, 0x3c, 0x56, 0x46, 0xf1, + 0x6d, 0xb3, 0x31, 0x4a, 0x42, 0xb0, 0x05, 0x7b, 0x41, 0xdd, 0x3d, 0xf6, 0x12, 0xb2, 0x0c, 0xfa, 0x17, 0xea, 0xb1, 0x40, 0x8a, 0x13, 0xe8, 0xbd, 0x91, 0x6e, 0x4a, 0xd6, 0xa9, 0xa7, 0x5e, 0xa8, + 0x73, 0xde, 0x3f, 0x1d, 0xa8, 0x4f, 0x79, 0xbf, 0x88, 0xdb, 0x56, 0xb7, 0x91, 0x57, 0x74, 0x4d, 0xfa, 0x15, 0x36, 0x81, 0x4d, 0xdd, 0x75, 0x88, 0x54, 0xd9, 0x13, 0xea, 0xa7, 0x74, 0x76, 0x9f, + 0x21, 0x6f, 0xeb, 0x56, 0x37, 0xd7, 0x2c, 0x0d, 0xb3, 0x9d, 0x4f, 0x81, 0x0c, 0x03, 0xdc, 0xe8, 0xa8, 0xbf, 0x11, 0x2d, 0x4c, 0x79, 0xba, 0x47, 0xc3, 0x31, 0x8a, 0xda, 0xe2, 0x01, 0xd7, 0xcc, + 0xd3, 0x2e, 0x19, 0x94, 0x66, 0xc5, 0x4e, 0x2a, 0xe9, 0x31, 0x0a, 0xab, 0xf7, 0x4c, 0xf3, 0x4c, 0x83, 0x41, 0x50, 0xff, 0xbe, 0x41, 0xa6, 0xc2, 0x11, 0x9b, 0x21, 0x5e, 0x59, 0x99, 0x2a, 0x59, + 0x91, 0x30, 0x47, 0x38, 0xac, 0x2c, 0x1e, 0x63, 0x00, 0x59, 0xe9, 0xda, 0xf0, 0xc8, 0x73, 0x6e, 0x58, 0xda, 0x96, 0xb0, 0x65, 0x18, 0x8d, 0x9f, 0x48, 0xc7, 0x8a, 0x85, 0x99, 0xd3, 0x58, 0x23, + 0x8e, 0xad, 0x14, 0xef, 0x51, 0x02, 0x66, 0xc6, 0xb9, 0xdb, 0x6b, 0xa4, 0x22, 0xf3, 0x8c, 0xb6, 0x86, 0xb0, 0x9e, 0x9c, 0xd8, 0x1a, 0x97, 0xdf, 0x3f, 0xa9, 0x41, 0x7c, 0x0f, 0xf4, 0xdb, 0x66, + 0x9b, 0x06, 0x03, 0x98, 0x5a, 0xe5, 0xbc, 0xd3, 0xd3, 0x6f, 0x82, 0xc4, 0x63, 0x2f, 0xa2, 0x36, 0x63, 0x4f, 0x53, 0x54, 0xf8, 0x0d, 0xc5, 0x61, 0xdb, 0xad, 0x39, 0x14, 0x8b, 0xeb, 0xe1, 0x96, + 0x32, 0x39, 0x8f, 0xe1, 0x25, 0xab, 0x06, 0x67, 0x86, 0x71, 0x9a, 0x0a, 0x1c, 0xd8, 0x4f, 0xbb, 0x27, 0xf5, 0x9e, 0x57, 0x57, 0x01, 0x35, 0xa2, 0x8a, 0x10, 0xb4, 0x5d, 0x00, 0x24, 0xab, 0x9a, + 0x2d, 0x81, 0x7e, 0x62, 0x81, 0x54, 0x7a, 0xa7, 0x6c, 0x4e, 0xfb, 0xa4, 0xe0, 0xcb, 0x0a, 0x4a, 0x78, 0x53, 0x47, 0x23, 0x07, 0xf3, 0xbc, 0xef, 0xf4, 0x74, 0x14, 0x21, 0x73, 0x68, 0x68, 0x08, + 0x38, 0xdf, 0xcd, 0x16, 0x64, 0x25, 0x6d, 0x91, 0x77, 0x9d, 0x7d, 0xa8, 0xc9, 0x0c, 0x6b, 0xc7, 0x90, 0x73, 0x90, 0x27, 0xdc, 0x56, 0x0f, 0x70, 0x8e, 0x67, 0x03, 0x21, 0x2d, 0x95, 0x06, 0xab, + 0x72, 0x3a, 0xa5, 0xa9, 0x0d, 0xb6, 0xf5, 0xde, 0xaf, 0xd8, 0x6e, 0x46, 0xab, 0x5a, 0xfa, 0xe1, 0x01, 0xf6, 0x25, 0x21, 0xdd, 0x5e, 0x53, 0x98, 0x47, 0x49, 0x28, 0xf5, 0xe5, 0x3e, 0x22, 0xe4, + 0x18, 0x2b, 0xc9, 0x0b, 0xc3, 0x58, 0x85, 0x83, 0xe9, 0x2a, 0x6e, 0x1f, 0x5b, 0x98, 0xb8, 0x12, 0xaa, 0x03, 0x86, 0x3e, 0x60, 0x21, 0x91, 0x5c, 0xaa, 0x20, 0x0e, 0xd3, 0xb9, 0xcd, 0xce, 0x73, + 0x36, 0x62, 0xa7, 0x33, 0x51, 0x78, 0x71, 0x27, 0xcc, 0x69, 0x34, 0x5f, 0x58, 0x0b, 0xfa, 0xe0, 0x4f, 0xea, 0x56, 0xb0, 0xe2, 0xcd, 0x1c, 0x61, 0xe7, 0x05, 0x61, 0x01, 0x7f, 0xd7, 0x3a, 0xc7, + 0x97, 0x14, 0xa2, 0xab, 0x43, 0xfd, 0x2d, 0x0e, 0x8d, 0x23, 0xa2, 0x06, 0x00, 0xe9, 0x45, 0xae, 0x60, 0xf3, 0x0c, 0x32, 0xa6, 0x83, 0xd8, 0xc4, 0x33, 0xc2, 0xc8, 0xfb, 0x6c, 0x47, 0x30, 0x21, + 0x9f, 0x68, 0x79, 0xb3, 0xa8, 0x3a, 0xba, 0x19, 0x2b, 0x93, 0x17, 0x77, 0x42, 0x0f, 0x2d, 0x9b, 0xc9, 0x15, 0xc4, 0x28, 0x2b, 0x3f, 0x57, 0xe4, 0x32, 0xfb, 0xcb, 0x63, 0xf8, 0xc3, 0x63, 0x7e, + 0x4f, 0xde, 0xc5, 0x17, 0xf9, 0xc6, 0xdf, 0xf0, 0x02, 0xfe, 0x71, 0xd2, 0xec, 0x6f, 0x0f, 0x6c, 0xf8, 0xd3, 0x09, 0x45, 0x7e, 0xd5, 0x92, 0xd2, 0x99, 0x67, 0x66, 0x56, 0xeb, 0xa4, 0x90, 0x50, + 0x74, 0xd7, 0x5e, 0xf3, 0xf9, 0xcb, 0x43, 0x5b, 0x16, 0xe5, 0x5f, 0x65, 0xbd, 0xbf, 0xe9, 0x48, 0xd1, 0xbb, 0xec, 0x04, 0xc7, 0x92, 0x04, 0xd8, 0x3b, 0xf9, 0x6c, 0xa0, 0xf6, 0x99, 0xac, 0xa7, + 0x33, 0x90, 0x31, 0x26, 0x81, 0x51, 0xc5, 0x30, 0x79, 0xc8, 0xee, 0x1f, 0xb8, 0x89, 0xa1, 0x47, 0x5d, 0xfc, 0xec, 0xe2, 0x9e, 0xc3, 0x02, 0x0c, 0xc4, 0x0e, 0x23, 0xa7, 0xf0, 0xd1, 0x26, 0x01, + 0x36, 0x64, 0xe7, 0xfe, 0xc1, 0xaf, 0xd5, 0x7e, 0x32, 0x53, 0xfb, 0x43, 0x16, 0xca, 0x46, 0xa2, 0x30, 0xee, 0xbe, 0xd3, 0x6b, 0xfc, 0x53, 0x61, 0x1a, 0xf8, 0xc1, 0x80, 0xc1, 0xfd, 0x1e, 0x47, + 0xeb, 0x87, 0xe9, 0xea, 0x90, 0xee, 0x2a, 0xc9, 0x37, 0x18, 0xfd, 0x6d, 0xec, 0x7f, 0xf5, 0x32, 0xff, 0x85, 0x34, 0xbc, 0xd6, 0xe5, 0x9e, 0x53, 0x69, 0x0f, 0xae, 0x70, 0xa0, 0x48, 0x33, 0xdf, + 0x36, 0x4c, 0x01, 0x57, 0x0e, 0xa3, 0x33, 0x49, 0xaa, 0x8f, 0x4d, 0xc8, 0xb1, 0xfc, 0x9c, 0xd9, 0xb4, 0x0b, 0xe9, 0x86, 0xe8, 0x23, 0x58, 0x7a, 0x92, 0x25, 0xc8, 0x46, 0x38, 0xde, 0x50, 0xf8, + 0x71, 0x41, 0xe1, 0x35, 0x2c, 0xfb, 0xf6, 0x66, 0x69, 0x5a, 0x09, 0xc2, 0x9b, 0xa1, 0x3a, 0xb3, 0xdc, 0xa2, 0x59, 0x28, 0xca, 0xdc, 0x5a, 0x6b, 0x2a, 0xb4, 0x56, 0xf4, 0x13, 0xd0, 0xf2, 0xf8, + 0xe9, 0x27, 0xb2, 0x1b, 0xe6, 0x92, 0x88, 0xef, 0x71, 0x50, 0x47, 0x0d, 0xf8, 0xe2, 0xd4, 0xfc, 0xe6, 0x5f, 0x1c, 0x93, 0xe5, 0x1b, 0x31, 0x26, 0xca, 0x36, 0x96, 0xdc, 0x10, 0xca, 0x55, 0x35, + 0xb1, 0x5b, 0xb3, 0x9b, 0x1d, 0xa2, 0x80, 0xb2, 0xaa, 0x6f, 0x4d, 0xdb, 0xb6, 0x0f, 0xc2, 0xa0, 0x1f, 0x68, 0x7f, 0xe7, 0x5d, 0x94, 0x99, 0x81, 0x65, 0x75, 0x87, 0x91, 0x9e, 0x5c, 0x3a, 0x9d, + 0xcd, 0x0e, 0x13, 0xe0, 0xf4, 0x75, 0x91, 0xf7, 0x60, 0x81, 0xb1, 0x96, 0x95, 0xef, 0xc3, 0xf2, 0x0e, 0xf7, 0x70, 0xd4, 0x44, 0xc8, 0x26, 0xc1, 0xe2, 0x7c, 0x4f, 0x0a, 0xef, 0x1a, 0x6a, 0x38, + 0x3d, 0x08, 0x27, 0x1b, 0x05, 0x8e, 0xc1, 0xae, 0x89, 0x77, 0x89, 0x7b, 0x7d, 0x4c, 0xf1, 0xd3, 0xa6, 0x46, 0x20, 0x30, 0x20, 0x9e, 0x66, 0xcf, 0x80, 0x84, 0xcc, 0xeb, 0x39, 0x95, 0x71, 0x6e, + 0xf4, 0x59, 0x46, 0xb5, 0xd1, 0xbb, 0x95, 0x24, 0x43, 0x1a, 0x62, 0x4a, 0xd4, 0x58, 0x8b, 0xe8, 0x2f, 0x85, 0xa0, 0xeb, 0xf3, 0xd6, 0x52, 0xde, 0x92, 0xed, 0x36, 0xf1, 0x50, 0x1e, 0xaf, 0x6a, + 0x46, 0xb7, 0xe7, 0x58, 0x86, 0x4c, 0x61, 0x8d, 0xeb, 0x43, 0x99, 0x43, 0x10, 0x30, 0x17, 0xb9, 0x4c, 0x5f, 0x6f, 0x54, 0x18, 0x09, 0x83, 0x53, 0x7b, 0x48, 0x84, 0x0f, 0x98, 0x37, 0x85, 0xa8, + 0xf0, 0x22, 0xd0, 0xd7, 0x71, 0x7a, 0x16, 0x32, 0xc5, 0x38, 0xdb, 0xb4, 0xb7, 0xcd, 0x07, 0xa7, 0x37, 0x81, 0xc6, 0x5c, 0x04, 0x53, 0x94, 0x72, 0xe7, 0xde, 0x3b, 0x7b, 0xbd, 0xb6, 0x2b, 0x18, + 0x6a, 0x37, 0x02, 0x25, 0x95, 0x47, 0x21, 0x80, 0xbd, 0x88, 0x87, 0x60, 0xf4, 0x04, 0x92, 0xc6, 0x56, 0x3f, 0xdf, 0x91, 0x3b, 0x33, 0x04, 0x70, 0x35, 0xcb, 0x27, 0x8f, 0xa6, 0x0a, 0x12, 0x46, + 0x4b, 0xd9, 0x1c, 0xaf, 0x51, 0xdf, 0x37, 0x9b, 0x37, 0xaf, 0xe8, 0xb9, 0x57, 0x32, 0xe4, 0x67, 0xc3, 0x59, 0x11, 0xe4, 0x75, 0xd6, 0xa2, 0x88, 0x53, 0x62, 0x4f, 0x70, 0xf2, 0xae, 0xe5, 0x7e, + 0xc6, 0x03, 0x1b, 0x8f, 0xce, 0x02, 0x8b, 0x52, 0xdc, 0xb1, 0x17, 0xfa, 0x1c, 0xd7, 0xc6, 0x86, 0xf5, 0x68, 0xad, 0xa2, 0x8c, 0xc7, 0x34, 0x3c, 0xab, 0x5d, 0xfa, 0x71, 0x87, 0xb2, 0x71, 0x5c, + 0x28, 0xb7, 0x9d, 0x46, 0xe3, 0x31, 0x88, 0x28, 0xcb, 0x6b, 0x99, 0x47, 0xa1, 0x10, 0x7c, 0xdc, 0xec, 0xe9, 0xbd, 0xf5, 0x9e, 0x64, 0xde, 0x9b, 0xc5, 0x6a, 0xbd, 0x1e, 0x00, 0xa9, 0x26, 0x51, + 0x42, 0x8d, 0xa7, 0x4a, 0xf6, 0x90, 0x87, 0x9e, 0x42, 0x91, 0x23, 0x8e, 0xda, 0x39, 0x63, 0x02, 0x92, 0xba, 0xb6, 0x34, 0xb0, 0x61, 0x33, 0x3e, 0x6a, 0xfb, 0x9d, 0x55, 0x9a, 0xfc, 0x92, 0x40, + 0x6b, 0xa5, 0x37, 0x3b, 0x33, 0x6b, 0x04, 0xab, 0x22, 0x2b, 0xb3, 0x9f, 0x26, 0x52, 0xc6, 0x0f, 0x87, 0x17, 0x28, 0xc3, 0x9b, 0x1b, 0xa0, 0x7e, 0x6a, 0x8a, 0x83, 0xac, 0x0c, 0x1f, 0xdc, 0x87, + 0x75, 0xaf, 0x23, 0xd7, 0xf4, 0x6c, 0x31, 0xc1, 0xd8, 0xd2, 0xb8, 0x88, 0x96, 0x0e, 0x3d, 0x50, 0xe0, 0xd4, 0xf7, 0xe6, 0xac, 0x07, 0xa9, 0x7a, 0xf7, 0x23, 0xc9, 0xb1, 0xaa, 0x78, 0xbc, 0xae, + 0xf4, 0x97, 0xb0, 0x03, 0xf8, 0x9d, 0x2e, 0xe5, 0x1f, 0x35, 0xf6, 0xa1, 0x14, 0x83, 0xcc, 0x88, 0xd6, 0x15, 0x5e, 0xa8, 0x91, 0xda, 0x84, 0xf7, 0x78, 0xf3, 0x34, 0x47, 0xb7, 0x70, 0xe9, 0x57, + 0xa5, 0x1d, 0x80, 0xf9, 0x0b, 0xfb, 0xd9, 0x5e, 0x32, 0x76, 0xf4, 0xc5, 0xb9, 0x84, 0x3b, 0x2c, 0xae, 0xc8, 0xc5, 0xb3, 0xad, 0x8a, 0xc2, 0x81, 0x07, 0x90, 0x59, 0x79, 0x2a, 0xb7, 0xb6, 0x9a, + 0x23, 0xf6, 0xa0, 0x72, 0x0f, 0x78, 0x78, 0x92, 0x1f, 0xde, 0x4d, 0x02, 0x1e, 0xf5, 0x90, 0xa6, 0x7e, 0xcd, 0xf9, 0x1c, 0x2c, 0x3d, 0x1d, 0x5d, 0xb8, 0x9b, 0x56, 0x86, 0x98, 0x25, 0x1a, 0x47, + 0xa9, 0x90, 0x27, 0x79, 0x02, 0x5f, 0x9e, 0xf0, 0x0e, 0x9f, 0xc5, 0x76, 0xb6, 0x88, 0x45, 0x7b, 0xd2, 0x8e, 0xd9, 0xce, 0x40, 0x4e, 0x2d, 0xf2, 0xe4, 0x53, 0x95, 0x3a, 0x44, 0xb6, 0xa2, 0x59, + 0xfd, 0x79, 0x57, 0x13, 0x1a, 0x92, 0x80, 0x58, 0xe1, 0x7a, 0xe9, 0xed, 0xcd, 0x63, 0x52, 0x13, 0x0f, 0x01, 0xc1, 0xc6, 0xbd, 0xd4, 0x78, 0xeb, 0x3a, 0x1e, 0x27, 0x64, 0x75, 0xe2, 0x0d, 0x44, + 0x1b, 0x47, 0x2a, 0xa9, 0xf4, 0x81, 0xd9, 0xcb, 0x3d, 0xcd, 0x65, 0x0e, 0x4d, 0x69, 0x63, 0x56, 0xd9, 0xd9, 0xae, 0x0b, 0xd6, 0x98, 0x33, 0x7f, 0x2d, 0xeb, 0xde, 0xea, 0xec, 0x70, 0x9d, 0xba, + 0x04, 0x40, 0xcb, 0x15, 0x6b, 0x8d, 0x3c, 0xe4, 0x3b, 0xfe, 0x2e, 0x46, 0x15, 0x93, 0xb0, 0xa1, 0x67, 0x1c, 0x05, 0x2f, 0x3c, 0x17, 0x26, 0x5b, 0x4f, 0x1f, 0xe9, 0xe4, 0x5e, 0x56, 0xca, 0x1e, + 0x1d, 0xd2, 0xbb, 0x02, 0xdf, 0x70, 0x9a, 0x5b, 0xd5, 0x28, 0x6f, 0x8d, 0xf3, 0x2e, 0xba, 0xea, 0x1b, 0x0a, 0x98, 0x29, 0x19, 0x64, 0x6c, 0x6c, 0x9c, 0x07, 0x66, 0x03, 0xef, 0x34, 0xe5, 0x17, + 0x4d, 0xf0, 0xae, 0x15, 0x5b, 0xac, 0x04, 0x0a, 0x62, 0x84, 0x48, 0x6f, 0x6e, 0x63, 0x6c, 0x6e, 0x65, 0x2e, 0x8b, 0x50, 0x9e, 0x18, 0x14, 0x22, 0xf7, 0xba, 0x28, 0x7a, 0xf5, 0x54, 0x46, 0x0a, + 0xea, 0xe2, 0x77, 0x1b, 0x1c, 0x88, 0xc3, 0x51, 0x70, 0x24, 0x29, 0x6b, 0xbc, 0x39, 0x0f, 0x57, 0x4f, 0xd8, 0xfe, 0x76, 0x35, 0x39, 0x70, 0x9d, 0xcc, 0x03, 0xf7, 0xab, 0xc0, 0xec, 0x9f, 0x1c, + 0xf4, 0x4c, 0xe2, 0x3e, 0x86, 0x71, 0xe3, 0x95, 0xd0, 0x1a, 0x5a, 0x49, 0x2e, 0x9a, 0xdc, 0x6c, 0x6e, 0xa6, 0x31, 0x2e, 0xcb, 0xa6, 0xd7, 0x6b, 0xee, 0xb0, 0xd2, 0x86, 0x64, 0xbb, 0xb6, 0x61, + 0xab, 0x98, 0x37, 0x8c, 0x7e, 0x5f, 0xce, 0x31, 0xc8, 0x94, 0x89, 0x3e, 0x55, 0xc7, 0x3d, 0x40, 0x13, 0x20, 0x31, 0x3c, 0x44, 0xde, 0x66, 0x5f, 0x04, 0xb3, 0x92, 0x79, 0x94, 0xa6, 0x1c, 0xb9, + 0x7c, 0xdb, 0x2e, 0xc8, 0xa3, 0xa9, 0x87, 0x13, 0x22, 0xba, 0x5d, 0x98, 0x54, 0xd1, 0x72, 0x82, 0x95, 0x1f, 0x95, 0x5f, 0x67, 0x62, 0x52, 0xf8, 0xa7, 0x15, 0x49, 0xee, 0x5a, 0x8a, 0xca, 0xc8, + 0x92, 0x78, 0x36, 0x0c, 0xa0, 0xd9, 0xb0, 0x37, 0xab, 0xb8, 0x24, 0x20, 0x6a, 0x70, 0xdb, 0x21, 0x9f, 0xb1, 0x1e, 0xc6, 0x2c, 0xf8, 0xcc, 0xc8, 0x08, 0xdc, 0xfb, 0x46, 0xd2, 0xf5, 0xa7, 0x3d, + 0xe6, 0xf8, 0x5c, 0x91, 0x15, 0xde, 0xb0, 0x0a, 0x72, 0x55, 0x3a, 0xc4, 0x3f, 0x2e, 0xf2, 0x46, 0xd2, 0x2a, 0x5d, 0x97, 0x0a, 0xa6, 0x4e, 0x30, 0x49, 0x2f, 0xbc, 0x20, 0xac, 0xa7, 0xa6, 0x26, + 0x7c, 0x23, 0x58, 0xb3, 0xba, 0x01, 0x88, 0x8d, 0x9c, 0xa8, 0x88, 0x99, 0x8c, 0x5f, 0x1f, 0xbb, 0x42, 0x07, 0xea, 0x6c, 0x51, 0x3c, 0xcf, 0x82, 0x0d, 0xac, 0x34, 0x25, 0xde, 0x67, 0xe5, 0x00, + 0xad, 0xf4, 0xd6, 0x73, 0xba, 0x74, 0x69, 0x0a, 0x39, 0x50, 0x52, 0x1f, 0xd1, 0x0b, 0x4b, 0xb8, 0xb2, 0x03, 0x9a, 0xfa, 0x11, 0x2f, 0xbd, 0x09, 0x59, 0x33, 0xfd, 0x0c, 0x2e, 0xe5, 0xf1, 0x00, + 0x60, 0x4a, 0x98, 0x24, 0xd3, 0x55, 0xcf, 0x82, 0x85, 0x07, 0x73, 0x30, 0xb3, 0x50, 0x2a, 0x52, 0x8e, 0x0c, 0x26, 0xe9, 0xaf, 0xed, 0x67, 0xff, 0x84, 0x3b, 0x78, 0x96, 0xfd, 0xcf, 0x03, 0xc6, + 0xf0, 0xff, 0x1a, 0x80, 0x7c, 0xfd, 0xf9, 0x3b, 0x24, 0xc2, 0x46, 0x1f, 0x67, 0xd2, 0xd7, 0x2e, 0x08, 0x9d, 0x0b, 0xa6, 0x27, 0xcb, 0x91, 0x63, 0xc8, 0x61, 0x76, 0x97, 0x53, 0xf9, 0x9f, 0x92, + 0x75, 0xb2, 0x68, 0xff, 0xa2, 0xf4, 0x65, 0x03, 0x5f, 0x8f, 0x67, 0x46, 0xff, 0xdd, 0xf1, 0xec, 0xfe, 0xe6, 0x78, 0x76, 0xbf, 0x3f, 0x9e, 0x3f, 0x9d, 0xce, 0xc0, 0x2f, 0x8e, 0x67, 0x5c, 0xe7, + 0xca, 0x2f, 0xfd, 0x03, 0xc7, 0x6f, 0x8e, 0x67, 0xe1, 0xa3, 0x35, 0x89, 0x93, 0xef, 0x46, 0xfd, 0xed, 0xa8, 0x06, 0x7e, 0x69, 0x09, 0xf5, 0x67, 0x44, 0x72, 0xd7, 0x5d, 0xe6, 0x67, 0x44, 0xf2, + 0x31, 0xf6, 0xfd, 0x92, 0x81, 0xef, 0xd7, 0xfc, 0xdf, 0x2e, 0x19, 0xf8, 0x7e, 0xcd, 0xff, 0xed, 0x92, 0x81, 0xef, 0xd7, 0xfc, 0xeb, 0x25, 0xff, 0x83, 0x2c, 0xa0, 0x44, 0x10, 0xa9, 0x19, 0x35, + 0x00, 0x8a, 0xe8, 0x27, 0xab, 0x4f, 0x25, 0xd6, 0x99, 0xd9, 0x36, 0x38, 0x86, 0xa8, 0x31, 0x68, 0x2b, 0xa8, 0x34, 0xe2, 0x36, 0xb4, 0x53, 0x21, 0xf6, 0xac, 0x9f, 0xee, 0xa4, 0x64, 0xa2, 0xa9, + 0x8f, 0x86, 0x10, 0x68, 0x62, 0x53, 0xf2, 0x73, 0x1c, 0xc3, 0x33, 0x72, 0x39, 0xb6, 0x36, 0x4a, 0x0c, 0xc6, 0x99, 0x8e, 0x9e, 0xb9, 0x14, 0xeb, 0xce, 0x3d, 0xf0, 0xc0, 0xe1, 0xc6, 0xba, 0x18, + 0xe6, 0xb7, 0x37, 0xd5, 0xfd, 0xfb, 0x9b, 0xaa, 0xc7, 0xd1, 0x7b, 0x26, 0xd2, 0x3f, 0x35, 0x4d, 0x8e, 0x10, 0x2f, 0xbe, 0x14, 0x66, 0x05, 0x20, 0xef, 0xf5, 0xca, 0x13, 0x5f, 0xe5, 0x95, 0xfe, + 0x5a, 0x12, 0x51, 0x73, 0xde, 0xd9, 0xcf, 0xb6, 0x64, 0x9c, 0xbd, 0xd3, 0xbb, 0x4d, 0xcb, 0x25, 0x03, 0xc6, 0x1e, 0x5c, 0xe2, 0x65, 0xf0, 0x52, 0x37, 0x3e, 0x06, 0xa5, 0x23, 0x4d, 0x6f, 0x49, + 0x8e, 0x76, 0xef, 0x77, 0x5d, 0xae, 0x7b, 0x73, 0x01, 0xb6, 0x8e, 0xce, 0xc8, 0x5e, 0x56, 0x1c, 0x97, 0xb1, 0x32, 0x0b, 0xf5, 0x34, 0x4e, 0x0b, 0xef, 0xe0, 0x6d, 0x53, 0xdd, 0x85, 0xc6, 0xd9, + 0x29, 0xa6, 0xa9, 0x99, 0x19, 0x7c, 0xd5, 0x54, 0xf4, 0x20, 0x34, 0x61, 0x96, 0xa0, 0xcb, 0x99, 0xa1, 0xa1, 0x4d, 0xfc, 0xfb, 0xa8, 0x46, 0x48, 0xf4, 0xff, 0x61, 0x54, 0x0f, 0x1f, 0x48, 0xf4, + 0xab, 0xcd, 0xb4, 0xce, 0x6a, 0xb0, 0xd0, 0xc1, 0x67, 0xac, 0xe0, 0x0e, 0x9d, 0xf0, 0x19, 0xf1, 0x73, 0x27, 0xd8, 0xff, 0x86, 0xa8, 0xd6, 0x51, 0x83, 0xfd, 0xf7, 0x51, 0x0d, 0x1b, 0x9c, 0xf1, + 0x73, 0x54, 0x7f, 0x8c, 0xfd, 0x6f, 0x88, 0x6a, 0x1d, 0x05, 0x8c, 0xbf, 0xf3, 0xb6, 0x73, 0xff, 0xa6, 0xa5, 0x51, 0x7c, 0x27, 0x5c, 0xe8, 0xdd, 0x59, 0x4e, 0x90, 0x00, 0x26, 0xc1, 0x84, 0xde, + 0x0f, 0x0f, 0xde, 0xd6, 0x37, 0xe7, 0x5d, 0x5a, 0xba, 0x63, 0x36, 0xcf, 0xf1, 0xe1, 0x3e, 0xcf, 0x52, 0x36, 0xeb, 0x28, 0x31, 0x17, 0x30, 0x2c, 0x2b, 0x90, 0x5e, 0xcf, 0x4c, 0x69, 0x28, 0xd1, + 0xd4, 0x75, 0x4b, 0xed, 0x77, 0x7c, 0x09, 0x68, 0xe7, 0x45, 0x5d, 0x31, 0xd5, 0xb1, 0x66, 0xdb, 0xef, 0xb3, 0x5a, 0xe3, 0xef, 0x17, 0x70, 0x73, 0xdb, 0x2e, 0x7e, 0x0b, 0xc5, 0x6d, 0x3c, 0xb7, + 0xc6, 0x13, 0xb0, 0xc1, 0xea, 0xca, 0xab, 0xae, 0x27, 0x08, 0x9d, 0x56, 0x92, 0x8a, 0x85, 0xfb, 0x43, 0x8d, 0x2a, 0xae, 0xea, 0x46, 0xd5, 0xe0, 0x74, 0xfe, 0xb7, 0xf6, 0xa1, 0x1f, 0x54, 0x1e, + 0xe0, 0x6b, 0x49, 0xd7, 0xd2, 0x39, 0x66, 0x8f, 0x7e, 0xd6, 0x5a, 0xf0, 0xe7, 0xc8, 0x51, 0xa0, 0x85, 0x3f, 0xdf, 0x76, 0xa3, 0xa5, 0x6a, 0x24, 0xb9, 0x4b, 0x33, 0x0c, 0x29, 0xce, 0xb6, 0x7f, + 0xa6, 0xec, 0x0c, 0x00, 0xcd, 0x31, 0x2d, 0xdd, 0xd0, 0x08, 0x1d, 0xab, 0xa1, 0x6d, 0x2b, 0xe0, 0xf8, 0xd0, 0xc1, 0x97, 0xdd, 0xe2, 0xd9, 0x8a, 0x40, 0x9e, 0xa2, 0x73, 0xfc, 0x0b, 0xe3, 0xa1, + 0x96, 0x62, 0x26, 0xf9, 0xcc, 0x06, 0x1b, 0x6c, 0xa8, 0x45, 0x75, 0x30, 0xa8, 0xf4, 0x6e, 0x2d, 0x9e, 0x4e, 0xb1, 0x10, 0xbe, 0x96, 0x08, 0xc9, 0x5e, 0x0b, 0xab, 0x8b, 0x59, 0x07, 0xb0, 0x2f, + 0x5e, 0x0f, 0x37, 0x7c, 0x8a, 0x30, 0xe5, 0x8d, 0xc5, 0xb4, 0x76, 0xeb, 0xa3, 0xfa, 0x6c, 0x9f, 0x54, 0xdd, 0x48, 0x48, 0x79, 0xc3, 0xf0, 0xf7, 0xc1, 0x82, 0x22, 0xbb, 0x14, 0xcd, 0x2d, 0x9a, + 0xa4, 0xc9, 0x8e, 0x09, 0x14, 0xad, 0x0c, 0x72, 0xb5, 0x7b, 0xd5, 0xdf, 0x9c, 0xbf, 0x21, 0xde, 0x19, 0xb4, 0xcf, 0xdb, 0x3f, 0xf8, 0xbc, 0xfc, 0xd7, 0x5b, 0xc4, 0xdf, 0x6d, 0x0d, 0xc2, 0xd8, + 0xb0, 0x2c, 0x8d, 0x7e, 0xb5, 0x77, 0xf4, 0xe8, 0xd8, 0xda, 0xa5, 0x59, 0xd6, 0x90, 0x67, 0x28, 0xe8, 0xe7, 0x7c, 0x58, 0x90, 0x7d, 0x80, 0x46, 0x6c, 0xb9, 0x16, 0xf4, 0x4b, 0xef, 0xb7, 0xc4, + 0xfd, 0xb9, 0xed, 0xf1, 0x2e, 0x1f, 0x4a, 0x43, 0xb7, 0x5f, 0xee, 0xda, 0x92, 0x87, 0x31, 0x7e, 0xeb, 0x3b, 0x32, 0xaf, 0xf8, 0x1e, 0xd4, 0x99, 0xb6, 0x6f, 0xb8, 0xb2, 0xc0, 0xe8, 0x96, 0x6f, + 0x8b, 0xee, 0x5d, 0x31, 0xfe, 0x20, 0xc3, 0xd0, 0x9b, 0xee, 0xca, 0xbb, 0xfe, 0x99, 0x03, 0x03, 0x70, 0x6c, 0x67, 0x5a, 0x7e, 0x2c, 0x78, 0xf5, 0x9f, 0xfc, 0x5e, 0xfe, 0xe6, 0xeb, 0xff, 0x5d, + 0xc4, 0xbb, 0xe5, 0x6e, 0x72, 0x1e, 0x0a, 0x18, 0xdc, 0x47, 0x6a, 0xe1, 0xfa, 0x3c, 0x78, 0xea, 0x97, 0x87, 0x19, 0x6e, 0x97, 0xe8, 0x62, 0xfb, 0x53, 0x85, 0x6e, 0x75, 0x74, 0x27, 0xda, 0x95, + 0x2f, 0x22, 0x9a, 0xcc, 0xfd, 0xcb, 0x24, 0x58, 0xdf, 0x37, 0x14, 0xb7, 0xf5, 0x5d, 0xc0, 0x3b, 0x19, 0xcb, 0xe5, 0x05, 0xcf, 0x6e, 0x29, 0xc7, 0x75, 0xfe, 0xb0, 0x70, 0xd4, 0x1a, 0xfe, 0xd4, + 0x39, 0xfa, 0x4b, 0xb6, 0x60, 0x72, 0x5b, 0x21, 0xb0, 0x7d, 0xb9, 0xfc, 0x62, 0x14, 0xf7, 0x3b, 0x1f, 0x69, 0xe0, 0x27, 0x23, 0xe9, 0x7f, 0xd3, 0xe6, 0x08, 0xdf, 0x1f, 0xa2, 0x1b, 0x6a, 0x3e, + 0x5d, 0x5b, 0xf3, 0x8b, 0x8b, 0x99, 0x14, 0xf0, 0x44, 0x73, 0x6b, 0x15, 0x1b, 0x12, 0x20, 0xff, 0xbc, 0x0f, 0x6b, 0x17, 0xd4, 0x9d, 0x36, 0xdd, 0x93, 0xd2, 0x21, 0xca, 0xb7, 0x35, 0x84, 0x13, + 0x1c, 0x2e, 0x6d, 0xd0, 0x08, 0xdd, 0x7c, 0x64, 0x21, 0xe4, 0xea, 0x38, 0x6c, 0x4b, 0x99, 0xc5, 0x25, 0x12, 0x42, 0xe6, 0x33, 0xee, 0xc4, 0x45, 0x10, 0x4d, 0x08, 0x0a, 0x56, 0xf2, 0xc0, 0xf1, + 0x01, 0x00, 0x36, 0xb8, 0xbd, 0x64, 0x2f, 0x65, 0x04, 0xd5, 0xe7, 0x55, 0x0b, 0xee, 0xb8, 0xcb, 0xb0, 0xae, 0xaf, 0x0e, 0xbd, 0x85, 0x89, 0xde, 0x21, 0xdc, 0x51, 0xa4, 0x18, 0x51, 0x49, 0x52, + 0x4d, 0x76, 0xbc, 0x34, 0x3a, 0xae, 0xc8, 0xcf, 0xd0, 0x00, 0x7a, 0x4e, 0x2c, 0x0e, 0x96, 0x32, 0xfa, 0x35, 0x9d, 0xa6, 0x0a, 0x5d, 0xc1, 0x60, 0x79, 0x17, 0x09, 0x20, 0x34, 0x5e, 0xe8, 0xcb, + 0xf6, 0xe7, 0xfe, 0x59, 0x38, 0xfe, 0x23, 0x83, 0x02, 0xb0, 0xbf, 0xe1, 0x75, 0xcf, 0xf0, 0xab, 0xed, 0xb6, 0x71, 0x72, 0xb5, 0xfe, 0x2b, 0xbf, 0x4d, 0xcc, 0xa5, 0x3e, 0x96, 0xdd, 0x7e, 0x85, + 0x2a, 0x4b, 0x3f, 0xa5, 0x2c, 0xd4, 0x94, 0x78, 0xd5, 0xa1, 0xee, 0x96, 0xe8, 0x14, 0x53, 0xa9, 0x68, 0x4e, 0x53, 0x41, 0x1b, 0xc0, 0x40, 0x92, 0x64, 0x13, 0x78, 0x3e, 0xcc, 0xda, 0x28, 0x9d, + 0x81, 0x66, 0xe4, 0x59, 0x8d, 0x1e, 0xcb, 0xb5, 0x39, 0x4d, 0xc8, 0x9b, 0xb9, 0x1e, 0x68, 0x27, 0x7f, 0x61, 0x94, 0xb2, 0x99, 0x1b, 0x77, 0x4c, 0x44, 0x40, 0x12, 0x1e, 0x4b, 0x45, 0x44, 0xe6, + 0xec, 0x10, 0xb3, 0xa7, 0x49, 0x79, 0xd5, 0x6f, 0xde, 0x99, 0x61, 0x1d, 0xf2, 0xc2, 0xd8, 0x46, 0x81, 0x28, 0x25, 0xcd, 0x74, 0x1d, 0xe7, 0x37, 0x4b, 0xea, 0x2c, 0x22, 0xf6, 0xcb, 0x11, 0xdd, + 0x06, 0x33, 0xc5, 0x2e, 0x85, 0x72, 0x8d, 0x42, 0xe6, 0x46, 0x95, 0x8e, 0xde, 0xc4, 0xfb, 0x78, 0xbf, 0xdd, 0xa0, 0x91, 0x33, 0xc3, 0x7a, 0x67, 0xe2, 0xf6, 0x14, 0x56, 0xc2, 0x72, 0xbc, 0xf9, + 0x81, 0xc3, 0xd0, 0x9e, 0x8a, 0x96, 0x28, 0x3d, 0x87, 0x18, 0xb9, 0x00, 0x5f, 0x4a, 0x4d, 0xef, 0x1a, 0x99, 0x69, 0x52, 0x18, 0x82, 0x76, 0x9a, 0x66, 0x87, 0xeb, 0xbb, 0x35, 0xa8, 0xf7, 0x65, + 0x4b, 0xc8, 0x82, 0xe2, 0xc2, 0x8c, 0x7d, 0x4d, 0x9e, 0xf4, 0x08, 0x05, 0x63, 0xcf, 0xf4, 0x5e, 0x9e, 0x6a, 0xc4, 0x4b, 0x60, 0xe1, 0xf2, 0xd8, 0x44, 0x8c, 0x2c, 0xec, 0x29, 0x92, 0xf2, 0x0b, + 0x1d, 0x2f, 0x7f, 0xc3, 0x10, 0x06, 0xa0, 0x21, 0x15, 0xef, 0x8c, 0xe9, 0x39, 0xa7, 0x9c, 0x7a, 0xf1, 0x90, 0x4a, 0x40, 0xf9, 0x44, 0x9f, 0x64, 0x0d, 0xde, 0xf8, 0xf1, 0x7a, 0x51, 0xb9, 0x27, + 0x06, 0x63, 0x2b, 0xc2, 0x57, 0xae, 0xd1, 0xf2, 0x81, 0x9f, 0x23, 0x54, 0x2c, 0xe0, 0xf0, 0x38, 0x72, 0x71, 0xd4, 0x37, 0x95, 0xdc, 0xee, 0x24, 0xe4, 0xe4, 0xe6, 0x9c, 0x85, 0x51, 0x9c, 0xd4, + 0x40, 0x96, 0x1b, 0x7b, 0x57, 0xf9, 0xc6, 0x0a, 0x1d, 0x17, 0x51, 0x75, 0xd9, 0xe1, 0x2f, 0xa0, 0xf5, 0xc4, 0x97, 0x3c, 0xa0, 0x09, 0x11, 0x7e, 0x98, 0xb4, 0x81, 0x24, 0xac, 0xc2, 0xd4, 0xab, + 0xe9, 0xad, 0x44, 0x5b, 0x0f, 0xc9, 0x51, 0xc4, 0xbe, 0x86, 0x4b, 0xce, 0x66, 0x4e, 0x61, 0x69, 0xeb, 0xf8, 0xc1, 0xac, 0xbe, 0x91, 0xbe, 0xc9, 0xa2, 0x39, 0x81, 0xa8, 0x4a, 0xb5, 0x52, 0x7c, + 0xaf, 0x8f, 0x02, 0xb9, 0x4b, 0x17, 0xdb, 0xbd, 0xda, 0xb7, 0xc2, 0x83, 0xb0, 0x4a, 0x5b, 0x92, 0xb2, 0x09, 0x42, 0xb4, 0x8b, 0x11, 0xbe, 0x04, 0xb1, 0x76, 0x18, 0xde, 0x41, 0xf7, 0xda, 0x94, + 0xcb, 0x96, 0x0e, 0x43, 0x77, 0x51, 0xfb, 0x85, 0x38, 0x17, 0xf0, 0x05, 0xcf, 0x41, 0x13, 0x28, 0x23, 0xb8, 0x64, 0x68, 0x1a, 0xb2, 0x50, 0xee, 0xc2, 0xd0, 0xb1, 0x7e, 0x29, 0x84, 0xf6, 0x8a, + 0xf8, 0xe5, 0x1f, 0x6b, 0x60, 0x00, 0xbf, 0x10, 0xc1, 0xf8, 0x46, 0xd1, 0xe1, 0x34, 0xb5, 0xd4, 0xcc, 0xfc, 0xe1, 0x5b, 0x22, 0x92, 0x6b, 0x8e, 0xf6, 0x66, 0x5b, 0xda, 0xe1, 0xb5, 0x18, 0x6a, + 0xd4, 0x34, 0x22, 0xca, 0x53, 0x1d, 0x8d, 0x79, 0x84, 0x2a, 0x1f, 0xbd, 0x89, 0x8f, 0xe1, 0xa5, 0x02, 0xf0, 0x5d, 0xf2, 0xbc, 0xd7, 0xc3, 0xeb, 0x46, 0xa7, 0x0b, 0x44, 0xe6, 0x86, 0x59, 0x9b, + 0x29, 0xdd, 0xc2, 0x8c, 0xad, 0x02, 0x06, 0x73, 0x37, 0x78, 0x3d, 0xe5, 0x37, 0x1b, 0xef, 0xae, 0xf0, 0x12, 0x16, 0x8e, 0xf3, 0xe4, 0x34, 0x59, 0x9b, 0x6c, 0x43, 0xb2, 0xf7, 0x76, 0x49, 0x3e, + 0x18, 0xed, 0xb2, 0x24, 0x05, 0xf7, 0x83, 0x63, 0xf8, 0xbb, 0xc7, 0x00, 0x0d, 0x3b, 0x71, 0x18, 0x2f, 0x1d, 0xd7, 0x35, 0xe1, 0x1e, 0xa6, 0x99, 0x63, 0xa9, 0x0b, 0x9c, 0xdb, 0x3c, 0xe9, 0xd7, + 0x62, 0x69, 0x6b, 0x4b, 0x40, 0xd3, 0x8a, 0xef, 0xaa, 0xd8, 0x83, 0x9a, 0x77, 0x60, 0x6f, 0xfb, 0x7e, 0xa6, 0x9d, 0xdb, 0x87, 0xbe, 0x24, 0x77, 0xa3, 0x27, 0x64, 0x39, 0x2a, 0x12, 0x49, 0x8e, + 0x5b, 0x17, 0x2a, 0x22, 0xe9, 0x01, 0x54, 0x91, 0x5b, 0x8c, 0xf9, 0xe8, 0x10, 0xb8, 0x5b, 0xf3, 0x4a, 0x8e, 0x17, 0x06, 0xaa, 0x7b, 0x71, 0x31, 0xca, 0x1e, 0xab, 0x55, 0x2f, 0xc8, 0x20, 0x05, + 0xcc, 0x74, 0xae, 0x84, 0x30, 0x4f, 0xfa, 0x59, 0xb7, 0x4a, 0x80, 0x5a, 0x4b, 0xf2, 0x46, 0xde, 0x96, 0xdc, 0xea, 0x8b, 0x2d, 0x5f, 0x04, 0xe6, 0xcc, 0x50, 0xca, 0xec, 0xd9, 0x36, 0xb9, 0x25, + 0xc0, 0x23, 0x68, 0x85, 0x4d, 0x2f, 0xf6, 0x24, 0x7d, 0x36, 0xd6, 0xac, 0xa2, 0x93, 0x16, 0x59, 0xc9, 0xaa, 0xe3, 0x92, 0x73, 0xc1, 0x47, 0x43, 0x77, 0x38, 0xbb, 0x5a, 0x1e, 0x0d, 0xbb, 0xdb, + 0xe9, 0xa8, 0x43, 0xf2, 0xb9, 0x57, 0x34, 0xe5, 0x29, 0x32, 0x0b, 0x02, 0x1f, 0x94, 0xb3, 0xd9, 0xbb, 0xab, 0xab, 0xc5, 0xc6, 0x20, 0x08, 0xc4, 0xb9, 0x12, 0xc0, 0x91, 0x17, 0x31, 0xdd, 0x48, + 0xee, 0x3d, 0xdf, 0xf7, 0xd6, 0x18, 0x35, 0x24, 0xab, 0xd6, 0xee, 0x0e, 0x26, 0xcf, 0xbd, 0x3d, 0xad, 0x27, 0x62, 0x8c, 0xcb, 0x91, 0xa4, 0xde, 0x75, 0xce, 0xed, 0x00, 0xc6, 0xef, 0x66, 0x82, + 0xb9, 0xf0, 0xc5, 0xd5, 0x65, 0x41, 0xb4, 0xe5, 0xdb, 0x5c, 0x19, 0x8c, 0x75, 0x2b, 0x72, 0xaa, 0x55, 0xb6, 0xc5, 0x42, 0x0b, 0xa0, 0x09, 0x1c, 0xa4, 0x67, 0x5a, 0x40, 0x1c, 0xba, 0x46, 0x61, + 0x32, 0xaf, 0x39, 0xbb, 0x3c, 0xb6, 0x48, 0xdd, 0xac, 0xee, 0xce, 0xde, 0x68, 0x09, 0x17, 0xfb, 0xc0, 0xc8, 0x9e, 0x84, 0x8c, 0x8a, 0xa6, 0xc9, 0xf5, 0xa8, 0xed, 0xac, 0x5c, 0xa1, 0x6a, 0xb6, + 0xc6, 0xb8, 0x37, 0xce, 0xa9, 0xce, 0x6c, 0x0a, 0xd2, 0xb0, 0x1c, 0xd2, 0xda, 0x73, 0x22, 0x60, 0x9e, 0x05, 0x65, 0x43, 0x04, 0x87, 0x7c, 0xdd, 0xe0, 0xdb, 0x59, 0x54, 0xc6, 0x0c, 0xa2, 0xeb, + 0x50, 0xc8, 0x88, 0x3b, 0xb7, 0x69, 0xbc, 0x40, 0xad, 0xb1, 0x7b, 0xa1, 0xcb, 0xde, 0x56, 0x70, 0x09, 0x31, 0xb9, 0x40, 0xb2, 0x9c, 0xad, 0xee, 0x48, 0xe6, 0xdf, 0x79, 0x2d, 0x24, 0xdf, 0xfa, + 0xd1, 0xfb, 0x70, 0x8a, 0xd8, 0xf1, 0xfa, 0x00, 0x47, 0x11, 0x90, 0x6f, 0x95, 0x38, 0xd6, 0xda, 0xda, 0xde, 0xd2, 0xbc, 0xdf, 0xa2, 0xb9, 0x22, 0xc4, 0xc8, 0x7f, 0xf0, 0x35, 0x05, 0xaf, 0x02, + 0x0a, 0xaa, 0x66, 0x5e, 0xc1, 0x49, 0x93, 0x59, 0x62, 0xe3, 0x26, 0x88, 0xf0, 0x30, 0x73, 0x5f, 0xec, 0x91, 0xa6, 0xb9, 0xfc, 0x49, 0x84, 0xdd, 0x32, 0x2d, 0x56, 0xea, 0x75, 0x6f, 0x0b, 0x52, + 0x53, 0x12, 0xae, 0x2f, 0x81, 0x76, 0xba, 0x0c, 0x43, 0x4e, 0xec, 0xf6, 0x31, 0xb5, 0x5e, 0x8c, 0x80, 0xb7, 0x6d, 0xeb, 0xa8, 0x30, 0x2c, 0xea, 0x67, 0x7e, 0xfe, 0x15, 0x58, 0xa0, 0xd9, 0xff, + 0xd8, 0xb4, 0x1c, 0xff, 0x47, 0x30, 0x74, 0xf7, 0xff, 0xd8, 0xac, 0xfe, 0x1f, 0x87, 0xb7, 0x7d, 0x99, 0x33, 0x6d, 0xde, 0xf9, 0x8f, 0xc3, 0x8b, 0x9e, 0x6d, 0x3a, 0xff, 0x04, 0x26, 0xfc, 0x1d, + 0x40, 0x60, 0x3f, 0x0c, 0x4e, 0x9f, 0x5f, 0xbb, 0x15, 0xad, 0xe8, 0x1d, 0x9d, 0xa9, 0x19, 0xf2, 0x28, 0x5c, 0x65, 0x22, 0xac, 0xe5, 0x03, 0x8b, 0xe7, 0x9d, 0xfb, 0x27, 0x46, 0x3e, 0xfa, 0xd3, + 0xfd, 0x41, 0xf8, 0x31, 0x69, 0x5f, 0xee, 0xb2, 0xdd, 0x62, 0x86, 0xcf, 0xde, 0x1d, 0x0b, 0x82, 0xbe, 0x9a, 0x44, 0x33, 0xf4, 0xa2, 0x33, 0x9e, 0xd1, 0x65, 0xbd, 0x7f, 0x7d, 0xf3, 0x82, 0xb6, + 0x2b, 0x8e, 0xa6, 0x02, 0xcb, 0xb7, 0x05, 0xef, 0xbc, 0xdb, 0x7a, 0x53, 0x9e, 0x80, 0xd1, 0xd0, 0xbb, 0xc1, 0x8f, 0x87, 0xc6, 0xd1, 0xf3, 0x17, 0xd2, 0x8b, 0x0c, 0x09, 0x9c, 0x2c, 0x28, 0x8c, + 0xe3, 0x8f, 0xe5, 0x77, 0x0f, 0x2f, 0x3d, 0xc8, 0x77, 0xfc, 0xb6, 0xe3, 0xdd, 0xbb, 0x22, 0x78, 0x27, 0xe3, 0xda, 0x5e, 0xee, 0x7b, 0x2d, 0xe5, 0x7e, 0x11, 0x29, 0x01, 0x74, 0x57, 0xfe, 0x74, + 0x7e, 0x63, 0xfa, 0x95, 0x5d, 0xfa, 0xfd, 0xb3, 0x4a, 0xc9, 0x8f, 0x63, 0x7b, 0xc1, 0xfd, 0x28, 0x2f, 0x65, 0xfb, 0xfa, 0xc1, 0x7f, 0xee, 0xd5, 0xfe, 0xd0, 0x05, 0xe7, 0x63, 0xd3, 0xf5, 0xad, + 0x15, 0xf0, 0x5a, 0xc3, 0xd0, 0x2d, 0x74, 0xe7, 0x3e, 0xbb, 0xc6, 0x71, 0xb4, 0xff, 0x09, 0xb2, 0x74, 0xd9, 0xc5, 0x47, 0x3a, 0x13, 0x7d, 0xa1, 0xf0, 0x3c, 0xfc, 0x56, 0xf0, 0x6c, 0x5f, 0x5f, + 0x3d, 0x57, 0x46, 0xf5, 0x26, 0xda, 0x75, 0xce, 0x56, 0x75, 0x67, 0xdf, 0xd5, 0xcf, 0xca, 0x0e, 0x1c, 0x6b, 0x30, 0x80, 0x75, 0x32, 0x8e, 0xe5, 0x75, 0x89, 0xfc, 0xf9, 0xe9, 0x9f, 0x1e, 0x2e, + 0x0b, 0x86, 0xe0, 0x75, 0xb1, 0x62, 0xf3, 0x94, 0x63, 0xfb, 0xfa, 0xa7, 0xe5, 0x49, 0xbe, 0xaf, 0x3c, 0xbc, 0xbf, 0x51, 0x33, 0x01, 0x98, 0x47, 0x82, 0xfb, 0xf7, 0x87, 0x7c, 0xce, 0xef, 0xa7, + 0xd1, 0x4e, 0x8e, 0x5c, 0x38, 0x21, 0x34, 0x1a, 0xc3, 0xf0, 0x66, 0x3a, 0x2f, 0x67, 0x8a, 0x8a, 0xcc, 0xa5, 0xc5, 0x1f, 0x4e, 0x1f, 0x2a, 0x52, 0x9a, 0x56, 0x5d, 0x9b, 0xc9, 0x27, 0x18, 0xd2, + 0xa4, 0x25, 0x95, 0x71, 0x91, 0xc6, 0xa1, 0x30, 0x3a, 0xaf, 0xb8, 0x83, 0x2b, 0xe3, 0xd1, 0xc2, 0x80, 0xc6, 0x0f, 0x29, 0x09, 0xa5, 0xe4, 0x02, 0xd9, 0x93, 0xcd, 0x18, 0xfd, 0x2d, 0x7f, 0x0a, + 0xb7, 0x84, 0x84, 0xdd, 0x0c, 0xe5, 0x5c, 0x2b, 0x3f, 0x2e, 0x9c, 0x9a, 0x99, 0x5c, 0xad, 0xad, 0xfb, 0xa8, 0x7a, 0x3d, 0xc9, 0xd0, 0x10, 0x6e, 0xd6, 0xf8, 0x8f, 0x3d, 0x5a, 0x5f, 0xa0, 0x3f, + 0xf0, 0x8f, 0x7b, 0xb4, 0x68, 0x11, 0xd3, 0x40, 0xf0, 0xc6, 0x47, 0x71, 0x49, 0xb6, 0x37, 0xeb, 0xff, 0x67, 0xed, 0x3b, 0xba, 0xa0, 0x46, 0x92, 0xad, 0xf7, 0xfa, 0x15, 0xb3, 0xaf, 0xf3, 0x1d, + 0x99, 0x92, 0x54, 0xd2, 0x52, 0xde, 0x94, 0xbc, 0x97, 0x76, 0xf2, 0x25, 0xef, 0xed, 0xaf, 0xff, 0x0e, 0xd0, 0x30, 0xdd, 0x34, 0xdd, 0x3d, 0xf3, 0xde, 0x63, 0x03, 0x27, 0x4b, 0x14, 0x99, 0xa0, + 0x20, 0x6e, 0x46, 0xdc, 0xb8, 0xd7, 0xf4, 0xf1, 0x39, 0x3d, 0xc1, 0x1e, 0xea, 0x30, 0xf9, 0xfb, 0x1d, 0x16, 0xf8, 0xb7, 0x9c, 0x49, 0x43, 0xa9, 0x42, 0xc8, 0xa8, 0x26, 0xb3, 0xd9, 0x9b, 0x3a, + 0x9b, 0xaa, 0x06, 0x71, 0xc5, 0xdb, 0x9b, 0xad, 0xb0, 0x7e, 0x36, 0xa8, 0x2a, 0x6c, 0x51, 0x36, 0xda, 0x56, 0x1e, 0x43, 0xd6, 0x0b, 0x64, 0xeb, 0xca, 0x21, 0xb6, 0xd4, 0xb2, 0x52, 0xcb, 0xa1, + 0xcd, 0x5e, 0x6e, 0x5d, 0x2c, 0x73, 0x07, 0x16, 0xb8, 0x69, 0xdd, 0xec, 0x31, 0x89, 0x51, 0x4d, 0x16, 0xb7, 0xbb, 0xb3, 0xac, 0x44, 0xe3, 0x7e, 0xcd, 0x55, 0x18, 0x4e, 0xbd, 0xfe, 0x26, 0x94, + 0xa8, 0x9a, 0xa2, 0x43, 0xb5, 0x90, 0x7d, 0x91, 0x2d, 0x15, 0x87, 0x40, 0x01, 0x25, 0xc5, 0x3b, 0x9c, 0x52, 0x02, 0xc4, 0xd4, 0x8d, 0x86, 0x4f, 0x99, 0xf2, 0xb3, 0x91, 0x2b, 0xe5, 0x6b, 0x7f, + 0xfc, 0x7d, 0xcf, 0xf1, 0x67, 0x2b, 0x67, 0x0b, 0xfd, 0xa5, 0x8d, 0xf3, 0x3f, 0x45, 0xeb, 0xcf, 0xae, 0x34, 0x36, 0x97, 0xbd, 0x5f, 0x5b, 0x96, 0xd6, 0x82, 0x8c, 0x51, 0xc1, 0x31, 0x65, 0x4a, + 0xc6, 0x16, 0xb2, 0x5f, 0x58, 0x3f, 0xa3, 0x4c, 0x96, 0x72, 0x29, 0x95, 0x0b, 0x7f, 0x9a, 0x2d, 0x6e, 0x64, 0x5e, 0xb5, 0x9a, 0x83, 0xff, 0xa1, 0x9a, 0xfa, 0x1d, 0x8d, 0xff, 0x66, 0xa2, 0x2c, + 0x60, 0x88, 0x12, 0x68, 0x9f, 0x9f, 0xd4, 0xd2, 0xfe, 0xf8, 0x0c, 0x2f, 0xef, 0xc0, 0x17, 0xf0, 0xeb, 0xd6, 0x26, 0xf2, 0x5b, 0xc4, 0x61, 0x2a, 0xab, 0x5e, 0xdf, 0x1d, 0x68, 0x7e, 0x93, 0x05, + 0x42, 0x7e, 0x5a, 0x3b, 0xac, 0x9f, 0xf4, 0xdc, 0xcc, 0xc6, 0xfd, 0xaa, 0x4e, 0x0f, 0x7c, 0xbf, 0x5c, 0x73, 0xdc, 0x1f, 0x8c, 0xa3, 0xcb, 0xa4, 0x0f, 0xd7, 0x14, 0xe1, 0x7e, 0xa7, 0x75, 0xaf, + 0x3a, 0x1c, 0xf4, 0xc7, 0x67, 0x7e, 0xbb, 0x43, 0xd8, 0x1a, 0x1b, 0xfe, 0x57, 0xae, 0x34, 0xcb, 0x2c, 0x9a, 0x17, 0xae, 0x68, 0x2d, 0x96, 0xcc, 0xab, 0x79, 0x85, 0xd9, 0x38, 0x34, 0x9a, 0x95, + 0x0c, 0x63, 0xa5, 0xbc, 0x1b, 0xd1, 0x37, 0x32, 0x88, 0xe0, 0x16, 0x80, 0xf1, 0x72, 0x59, 0x8f, 0x79, 0x0f, 0xf7, 0x53, 0x28, 0x3b, 0xce, 0x0d, 0xe3, 0xdd, 0xcc, 0xad, 0x02, 0x9b, 0x43, 0xd6, + 0x1c, 0xb5, 0x90, 0x71, 0x7d, 0x22, 0xb2, 0xda, 0x12, 0x5a, 0x3f, 0x12, 0x4b, 0xde, 0x69, 0xa5, 0x49, 0x3f, 0xba, 0x45, 0x89, 0xd0, 0x1a, 0x6b, 0xdd, 0xb6, 0xfc, 0x84, 0xf3, 0x66, 0x0a, 0xbb, + 0x20, 0xf1, 0xd4, 0x27, 0x06, 0x81, 0x19, 0x2f, 0x6b, 0xea, 0x15, 0xbb, 0xec, 0xeb, 0xdc, 0x12, 0x55, 0x51, 0xe0, 0x38, 0x7e, 0xb1, 0x7a, 0x8f, 0x1c, 0xa6, 0xf2, 0x92, 0x32, 0xac, 0x7b, 0x5a, + 0xf9, 0x9c, 0x71, 0xca, 0x4e, 0x88, 0xe6, 0x2e, 0x17, 0xce, 0x14, 0xc3, 0x5e, 0xd2, 0x68, 0x5b, 0xf6, 0x84, 0x71, 0x91, 0x69, 0xd8, 0xd7, 0x6c, 0xb5, 0xf3, 0x03, 0x2c, 0xde, 0xa1, 0x54, 0xe7, + 0x00, 0xb2, 0x08, 0x06, 0x3c, 0xbd, 0xbc, 0x82, 0x34, 0x89, 0xf2, 0xf1, 0x0a, 0xf8, 0xe6, 0x62, 0x2d, 0x47, 0x9b, 0x65, 0x92, 0x11, 0x20, 0xfa, 0x58, 0x63, 0x50, 0x9f, 0x8b, 0x42, 0xe0, 0xa7, + 0xc2, 0x1d, 0xa0, 0xe9, 0xb9, 0x13, 0xa8, 0xa5, 0x88, 0x52, 0x41, 0x70, 0xb8, 0x8a, 0xa7, 0x93, 0x1c, 0x73, 0xf6, 0xee, 0xcb, 0x4f, 0xae, 0x7f, 0x85, 0xdc, 0x0a, 0x24, 0x7e, 0x4c, 0x37, 0x43, + 0x0e, 0x09, 0xf0, 0x07, 0xbf, 0x59, 0xe2, 0xfd, 0x68, 0x22, 0xc3, 0x09, 0x3e, 0xe9, 0x83, 0x59, 0x25, 0xf4, 0xb0, 0xb9, 0x0b, 0x7e, 0x22, 0xab, 0x30, 0xdd, 0x51, 0x71, 0x32, 0x7d, 0xcb, 0x75, + 0xd2, 0xc5, 0x2a, 0x86, 0xe5, 0x60, 0x65, 0x0e, 0xb7, 0x7c, 0x49, 0x1b, 0x42, 0x67, 0x07, 0x51, 0x59, 0x1b, 0xb5, 0xb8, 0xd7, 0xc0, 0x9b, 0x60, 0xb2, 0x87, 0xe5, 0x5c, 0x02, 0xc8, 0xfb, 0xf1, + 0x27, 0x06, 0x15, 0xc9, 0xe7, 0xef, 0xa0, 0x44, 0xbb, 0x6d, 0x65, 0xe2, 0x52, 0x82, 0x04, 0x49, 0x0d, 0x9c, 0xd1, 0xf2, 0x1f, 0x4a, 0xcc, 0xac, 0x85, 0xee, 0x3f, 0x9d, 0xe7, 0xbd, 0xf7, 0x44, + 0x99, 0xdd, 0xd8, 0x4b, 0xb0, 0xb5, 0x59, 0xd1, 0xac, 0x2b, 0x85, 0xb4, 0xa0, 0xc8, 0x59, 0x14, 0x80, 0x91, 0xd6, 0xe0, 0xef, 0x90, 0x7b, 0xa4, 0x5f, 0x32, 0x4f, 0xc6, 0x3f, 0xb7, 0x50, 0x45, + 0x44, 0x5b, 0x9b, 0xc7, 0xab, 0x4a, 0x02, 0x2b, 0x33, 0x67, 0x54, 0x20, 0xb3, 0xb6, 0x49, 0x4a, 0xc9, 0x9c, 0xa5, 0xee, 0x70, 0xd8, 0x45, 0x74, 0x5c, 0xfa, 0x21, 0xab, 0xfe, 0xbb, 0x93, 0x64, + 0xac, 0x9e, 0xec, 0xbe, 0xac, 0x18, 0x4d, 0x02, 0x87, 0x1e, 0x48, 0xd3, 0xbe, 0x38, 0x1b, 0x1e, 0x1a, 0xb8, 0x27, 0xd2, 0x58, 0x49, 0x6a, 0x0d, 0x67, 0xf1, 0xf6, 0xd5, 0xd3, 0x0f, 0x38, 0x15, + 0x11, 0x40, 0x66, 0xad, 0x65, 0xf2, 0xf1, 0x88, 0x32, 0x17, 0x8f, 0x1e, 0x7c, 0x71, 0xbd, 0xb2, 0xe0, 0xcc, 0x5e, 0x46, 0x8d, 0xf0, 0xe7, 0xbd, 0x9c, 0xc8, 0x12, 0x5d, 0xa0, 0xf6, 0x22, 0x98, + 0x45, 0x1c, 0xb3, 0x76, 0x01, 0x72, 0xcf, 0x42, 0x12, 0x19, 0x4a, 0xc7, 0x0e, 0xd5, 0xf1, 0xa0, 0x51, 0x27, 0x46, 0x9b, 0x06, 0x92, 0x48, 0x54, 0x56, 0x28, 0x16, 0xcf, 0x7a, 0x81, 0xdd, 0xac, + 0x44, 0xd3, 0x9c, 0x46, 0x19, 0x53, 0xf5, 0xcd, 0x14, 0xd3, 0x17, 0x3f, 0x97, 0x21, 0x98, 0x9c, 0x7c, 0x8f, 0x3f, 0x2b, 0x85, 0xa2, 0xe5, 0xbb, 0x9e, 0xda, 0x05, 0x69, 0x1e, 0x25, 0x09, 0xec, + 0xc1, 0xf4, 0xe9, 0xcd, 0x15, 0x59, 0xcc, 0x5d, 0xec, 0x8b, 0xa7, 0xd1, 0xbd, 0x4b, 0xe1, 0xd8, 0xcb, 0x69, 0xc0, 0x05, 0x76, 0x50, 0xd2, 0x36, 0x9d, 0x5c, 0x06, 0xfd, 0xa3, 0xe2, 0xdc, 0xaf, + 0x4d, 0x65, 0x8e, 0x90, 0x05, 0xfe, 0x89, 0x28, 0x4f, 0xc1, 0xd7, 0x9c, 0xa2, 0x82, 0x38, 0xa9, 0xd7, 0x31, 0xae, 0xbe, 0x8b, 0xd6, 0xb1, 0x6f, 0x17, 0x04, 0xdf, 0xd9, 0xc7, 0x9f, 0xc0, 0xf6, + 0xbf, 0x5d, 0x69, 0xc4, 0x13, 0x7d, 0x19, 0x21, 0xa3, 0x28, 0x6b, 0x52, 0x8c, 0xd2, 0x1c, 0x38, 0x7d, 0xba, 0xaf, 0x65, 0x36, 0x34, 0xd2, 0xed, 0x14, 0xfd, 0x3e, 0x32, 0xc3, 0xcb, 0x12, 0x9a, + 0x7c, 0xd6, 0x5a, 0x7e, 0x80, 0x50, 0x62, 0x24, 0xcb, 0xc6, 0x4d, 0x64, 0x57, 0x94, 0x35, 0xfd, 0xd4, 0xc9, 0x57, 0x83, 0x7a, 0x25, 0x20, 0x6f, 0x83, 0x6c, 0xeb, 0x2c, 0xbc, 0x11, 0xc5, 0x18, + 0x6b, 0xef, 0x57, 0x5c, 0xf3, 0xe7, 0x2d, 0x76, 0x1b, 0x17, 0xd7, 0x47, 0x57, 0x3c, 0x5b, 0xf1, 0x75, 0xec, 0x93, 0x7a, 0x06, 0xf8, 0x33, 0xe1, 0xa4, 0x38, 0x12, 0x5d, 0xd8, 0xd3, 0x62, 0x85, + 0xe0, 0x47, 0xfd, 0x15, 0xc8, 0xd3, 0x5a, 0x21, 0x8d, 0xfa, 0xb4, 0x1f, 0x8a, 0xb0, 0xe6, 0xfe, 0x05, 0x94, 0x67, 0x83, 0x9f, 0xa4, 0x91, 0x38, 0x11, 0x2a, 0xe5, 0xbb, 0xb1, 0xdd, 0x37, 0x56, + 0x3d, 0xf0, 0x7b, 0x08, 0xd5, 0xdb, 0x3a, 0x71, 0x3e, 0x2d, 0xa1, 0x80, 0xb3, 0xd2, 0xfb, 0xe6, 0x91, 0xc5, 0xbd, 0x4c, 0x93, 0x31, 0x56, 0xa9, 0x19, 0xfb, 0x7e, 0x14, 0x17, 0xbc, 0xc2, 0x08, + 0x3e, 0xe2, 0x23, 0x22, 0x43, 0x9b, 0x2d, 0x36, 0x46, 0x12, 0x01, 0x18, 0x06, 0x9e, 0x11, 0x65, 0x0c, 0x78, 0x6d, 0x62, 0xf1, 0x1d, 0x57, 0xbd, 0xbc, 0x37, 0x9d, 0xa9, 0x57, 0xb3, 0x5b, 0x38, + 0x2d, 0x9a, 0xc7, 0x03, 0x85, 0x7b, 0x40, 0xa7, 0xc5, 0xf3, 0xd6, 0xa7, 0x92, 0x69, 0xc3, 0xbe, 0xa0, 0xa7, 0x1e, 0x48, 0x06, 0xad, 0xed, 0x92, 0xb9, 0x9a, 0xb8, 0x94, 0x24, 0xf5, 0xc7, 0x1b, + 0x1f, 0xf2, 0x73, 0x8c, 0x3a, 0x40, 0x77, 0xb3, 0x46, 0x11, 0x30, 0x6d, 0xee, 0xe4, 0xd7, 0x8e, 0xd0, 0x90, 0x90, 0x7c, 0xfc, 0x59, 0x7e, 0x2f, 0x7c, 0xad, 0xac, 0xb3, 0xff, 0xf1, 0xc0, 0xb1, + 0xc2, 0xa1, 0xdb, 0xc9, 0x49, 0xb5, 0xfd, 0x1c, 0x07, 0x2e, 0x90, 0xcd, 0xc6, 0x85, 0x3a, 0xaa, 0xe5, 0x2f, 0xf7, 0xf2, 0xc5, 0xce, 0xf2, 0xec, 0x8b, 0x36, 0x5f, 0x1a, 0x24, 0x3e, 0xa7, 0x09, + 0x90, 0x23, 0x34, 0x83, 0x71, 0x41, 0xd9, 0x52, 0x98, 0x51, 0x4a, 0xbb, 0x89, 0x06, 0x4d, 0xab, 0x1c, 0x1f, 0x49, 0xde, 0x25, 0x62, 0xf7, 0xcd, 0x27, 0x67, 0x14, 0xd3, 0x9c, 0x6f, 0xcb, 0x64, + 0x05, 0x73, 0x48, 0x50, 0xee, 0x26, 0xc6, 0xfe, 0x55, 0x04, 0x47, 0xa9, 0x69, 0xe5, 0x15, 0xaa, 0x93, 0x54, 0x06, 0x26, 0x7d, 0xaf, 0xf6, 0x7e, 0x5c, 0x39, 0x30, 0x55, 0x3b, 0xb6, 0x3d, 0xc2, + 0xa2, 0xbe, 0x7c, 0xfc, 0x13, 0x42, 0x81, 0x58, 0x2a, 0x8f, 0xc0, 0xa3, 0x38, 0x8f, 0x00, 0x1f, 0x4a, 0x72, 0xef, 0x81, 0x4a, 0xc5, 0xd3, 0x2b, 0x2e, 0x64, 0x35, 0x29, 0x52, 0xe4, 0x23, 0x35, + 0xcc, 0xe1, 0x92, 0x2c, 0x69, 0x0b, 0x9b, 0x63, 0x5f, 0xa7, 0xc3, 0x86, 0x7e, 0x6f, 0xa0, 0x7b, 0x13, 0x9e, 0xc9, 0x70, 0x03, 0xfd, 0x69, 0xd7, 0x34, 0x8f, 0x60, 0x69, 0x91, 0xc3, 0xad, 0x56, + 0x23, 0x2a, 0xc1, 0xc7, 0x87, 0x63, 0x2b, 0x85, 0xbc, 0x67, 0xcd, 0x3d, 0xf7, 0x1c, 0x2e, 0x1f, 0x61, 0xf4, 0xd8, 0xeb, 0xc7, 0x1e, 0x9e, 0x41, 0x80, 0xaa, 0x48, 0xe2, 0x66, 0x42, 0x8a, 0x6b, + 0xcf, 0x3c, 0xc5, 0x48, 0xa4, 0x61, 0x9f, 0x11, 0x1b, 0x0d, 0x23, 0x4b, 0x8c, 0xe0, 0x0b, 0x60, 0x39, 0x19, 0x0d, 0x49, 0xb1, 0x62, 0x11, 0xf2, 0x05, 0xbf, 0x39, 0x32, 0x93, 0x73, 0x7e, 0x85, + 0x4a, 0xcc, 0xcc, 0xc2, 0x12, 0xd4, 0x28, 0x7c, 0x01, 0xe7, 0x21, 0x21, 0xec, 0xf7, 0xd6, 0x73, 0xcf, 0x7d, 0xd8, 0x82, 0x25, 0x28, 0x4f, 0xe7, 0x65, 0xf4, 0x6b, 0xa9, 0x3a, 0x77, 0x6b, 0x67, + 0x73, 0xe5, 0x45, 0xb7, 0x48, 0xc0, 0xc1, 0x51, 0x3f, 0x01, 0x93, 0x73, 0xcf, 0x9c, 0x19, 0xf1, 0xff, 0x26, 0x3f, 0x73, 0xff, 0xb3, 0xfc, 0xcc, 0x30, 0x37, 0xc3, 0x50, 0x91, 0xf0, 0xc7, 0xfc, + 0x5c, 0x6b, 0x1b, 0xac, 0xdc, 0x9d, 0x2c, 0xd4, 0x3c, 0x1b, 0x9a, 0x59, 0xa7, 0x7f, 0xd8, 0x3f, 0x55, 0xe4, 0x7f, 0x97, 0x9b, 0xbf, 0xe9, 0x58, 0xfc, 0x1f, 0xe5, 0xe6, 0x2f, 0xa9, 0x19, 0xb0, + 0x9c, 0xff, 0x9b, 0xdc, 0xfc, 0x1b, 0x72, 0xf8, 0x5f, 0xe5, 0x66, 0xfe, 0x4b, 0x6e, 0xfe, 0xae, 0x00, 0x0c, 0xfc, 0x7a, 0x1c, 0xd5, 0x4e, 0xd9, 0x59, 0x34, 0xd6, 0x47, 0x95, 0xbb, 0x7d, 0x06, + 0x6b, 0xc6, 0xd4, 0x5a, 0x53, 0xbe, 0xaa, 0x9f, 0xe6, 0x5a, 0xa9, 0x7c, 0x94, 0x89, 0xc9, 0xdd, 0x8e, 0xdb, 0x66, 0x3e, 0xac, 0x88, 0x0c, 0xdd, 0xd1, 0x1e, 0xe7, 0xc1, 0x1d, 0x0d, 0x0d, 0xd4, + 0x6b, 0x3d, 0x59, 0x8f, 0xe9, 0xb1, 0x0c, 0xd4, 0x7c, 0x17, 0xc7, 0xc0, 0x66, 0xdb, 0xb2, 0xbf, 0x6d, 0x41, 0x7b, 0xc0, 0x07, 0x43, 0xd1, 0x30, 0x3e, 0xaa, 0x4a, 0x7e, 0x61, 0x76, 0xcf, 0x68, + 0x83, 0x74, 0x44, 0xec, 0x4b, 0x96, 0x76, 0x17, 0x75, 0x92, 0x07, 0x94, 0xba, 0xf4, 0xe3, 0x53, 0xb4, 0x42, 0x96, 0x5d, 0xc1, 0x44, 0x1b, 0x0c, 0x53, 0x03, 0xdf, 0x48, 0x0f, 0xff, 0xd3, 0x71, + 0x54, 0xf3, 0x64, 0x46, 0xc6, 0x58, 0x97, 0x38, 0x83, 0x1a, 0x4b, 0x01, 0x4a, 0xc5, 0xaf, 0xb0, 0xcf, 0xe3, 0xe4, 0x1a, 0x22, 0xf9, 0xd3, 0x65, 0xea, 0xc7, 0xd8, 0x29, 0x47, 0x3d, 0x61, 0xdb, + 0x7c, 0x45, 0xfb, 0x5e, 0x61, 0x26, 0xd3, 0x9c, 0x39, 0xd3, 0x25, 0xf8, 0xdd, 0x57, 0x37, 0xc2, 0x60, 0x82, 0xda, 0x43, 0x83, 0xbb, 0x14, 0x51, 0x03, 0xec, 0xca, 0x3a, 0xb8, 0x96, 0xaa, 0x52, + 0x60, 0xea, 0x55, 0xa8, 0x55, 0x6e, 0xe1, 0x0e, 0xba, 0xc3, 0xab, 0xaf, 0x95, 0x23, 0xa5, 0x6a, 0x8a, 0x78, 0x58, 0xa2, 0x5b, 0x73, 0x2f, 0xea, 0xf0, 0x45, 0x86, 0x77, 0xaf, 0x69, 0x3a, 0x21, + 0x45, 0xf5, 0x88, 0x97, 0xa8, 0x4b, 0x54, 0x0b, 0x99, 0x27, 0xb6, 0x63, 0x77, 0x5b, 0x81, 0x71, 0xbb, 0x1a, 0x0f, 0x80, 0xa1, 0xf2, 0x5b, 0x93, 0x3a, 0x82, 0x8e, 0xc0, 0xa7, 0x38, 0x24, 0x5b, + 0xf5, 0xfc, 0x7b, 0xcf, 0x72, 0x41, 0xd1, 0x69, 0x4a, 0x71, 0x2c, 0xd7, 0x76, 0xfe, 0x85, 0x40, 0x08, 0xf4, 0x5f, 0xdb, 0x37, 0xf1, 0xe5, 0x17, 0x08, 0x8b, 0xfc, 0xa8, 0x48, 0x2b, 0x7e, 0xb3, + 0x91, 0xfe, 0xbe, 0x1a, 0x55, 0xbb, 0xe3, 0x51, 0xee, 0xfe, 0x52, 0x16, 0xc7, 0x71, 0x7e, 0x7a, 0x21, 0x3d, 0xf3, 0x04, 0xa4, 0x9b, 0xfa, 0xfc, 0xe8, 0xc4, 0x74, 0xee, 0x1a, 0x22, 0xe4, 0x9a, + 0xf8, 0xde, 0x15, 0x22, 0x6e, 0x99, 0xf8, 0xe4, 0x16, 0x07, 0xd6, 0x9e, 0x76, 0xed, 0x16, 0x5d, 0xb4, 0x98, 0xf8, 0xb2, 0xf4, 0xbb, 0x70, 0x62, 0xbf, 0x84, 0x93, 0xc3, 0x91, 0x8c, 0xe9, 0x9e, + 0xae, 0xdb, 0x7a, 0x0e, 0xe0, 0x31, 0xd4, 0xa5, 0xb2, 0xd2, 0xf1, 0x2d, 0x4c, 0xa4, 0x43, 0x65, 0xa5, 0xf3, 0xa7, 0x30, 0x39, 0x54, 0x36, 0xfc, 0xfd, 0xda, 0x2f, 0x77, 0xf5, 0x65, 0x53, 0xc0, + 0xff, 0xd5, 0xae, 0xbe, 0x6c, 0x0a, 0xf8, 0xba, 0xab, 0xff, 0x42, 0xe2, 0x65, 0xae, 0x30, 0x7f, 0xb6, 0x96, 0xf4, 0x05, 0xc6, 0x5e, 0x8d, 0xd3, 0x4f, 0xe1, 0xda, 0x9d, 0x10, 0x7d, 0x70, 0x8e, + 0xeb, 0x57, 0x00, 0x8b, 0x91, 0x89, 0x15, 0xaf, 0x51, 0x0e, 0x73, 0xd0, 0x23, 0xbf, 0x94, 0xaa, 0xaf, 0xf9, 0xa7, 0xbf, 0xed, 0x7b, 0xea, 0x14, 0x0d, 0xe4, 0xe6, 0x3b, 0xc6, 0xa1, 0x0c, 0x8e, + 0xea, 0xfc, 0x96, 0xd1, 0x29, 0x58, 0x27, 0x1b, 0x29, 0xa0, 0x6e, 0xce, 0x2a, 0xe5, 0xbd, 0xde, 0xba, 0x80, 0x3d, 0xab, 0x92, 0x8c, 0xc2, 0x2b, 0xd1, 0xc6, 0x6b, 0xd6, 0x01, 0xcf, 0xd8, 0x50, + 0x74, 0xa1, 0x09, 0x8b, 0xc0, 0xca, 0x82, 0x7d, 0x5c, 0x29, 0xa8, 0x50, 0x42, 0x12, 0xbf, 0x9b, 0x21, 0x85, 0xd9, 0x88, 0x1a, 0x86, 0xcd, 0xf4, 0x68, 0x41, 0x7d, 0x6c, 0x13, 0xb8, 0x15, 0xfc, + 0x4b, 0x1d, 0x87, 0xd5, 0x5c, 0xea, 0xfa, 0x69, 0xfa, 0xc6, 0xfb, 0xde, 0xc9, 0xb1, 0x46, 0x4a, 0xbd, 0x75, 0x92, 0xf6, 0x56, 0x3a, 0x15, 0x60, 0xd2, 0x51, 0x79, 0x3a, 0x82, 0xd9, 0x2e, 0xb5, + 0x2a, 0x82, 0xb0, 0xdf, 0xd6, 0x4e, 0x52, 0x7f, 0xee, 0x49, 0x51, 0x70, 0x5e, 0xe9, 0x8c, 0x6c, 0x9a, 0x3a, 0x0f, 0x02, 0xa1, 0xb1, 0xb5, 0x8c, 0xe3, 0x92, 0x2b, 0x07, 0xb1, 0x21, 0xdf, 0xc2, + 0x28, 0xab, 0xc4, 0x25, 0x5c, 0x9a, 0xa4, 0xc1, 0xc3, 0x95, 0x19, 0x5c, 0x18, 0xf5, 0xfd, 0x66, 0x3a, 0xa0, 0xc8, 0xd3, 0xc9, 0xac, 0x37, 0xa6, 0x14, 0xf4, 0x36, 0x3c, 0x89, 0xe8, 0x16, 0xaf, + 0x2b, 0x9a, 0x6a, 0x06, 0x42, 0xa0, 0x67, 0xf2, 0x90, 0x1f, 0x74, 0x2b, 0x46, 0x56, 0x68, 0x16, 0xdc, 0x82, 0x36, 0x6e, 0x67, 0xf3, 0x0c, 0x54, 0x51, 0xce, 0x90, 0x9f, 0x52, 0x25, 0x1d, 0xd3, + 0xb6, 0x6d, 0xfb, 0x46, 0x31, 0x28, 0xc7, 0x0e, 0x0b, 0xf7, 0xa6, 0x00, 0x0a, 0x16, 0xa6, 0x55, 0xc4, 0x27, 0x4b, 0xcb, 0xd8, 0xb0, 0xd0, 0xab, 0xf8, 0x8c, 0x65, 0x3b, 0xb6, 0xeb, 0x91, 0xd9, + 0xde, 0xd4, 0x62, 0xa1, 0xa4, 0x50, 0xbd, 0x8f, 0xdc, 0xc2, 0xb5, 0x99, 0xdf, 0x05, 0x2c, 0x4c, 0x32, 0xa8, 0xd3, 0x60, 0xb5, 0x11, 0xd2, 0x01, 0x34, 0xdc, 0x87, 0x91, 0xf2, 0xa8, 0x5b, 0xda, + 0xeb, 0x15, 0xca, 0xa4, 0x6e, 0x01, 0x72, 0xb5, 0x8a, 0x62, 0xd7, 0x88, 0x33, 0x89, 0x57, 0x98, 0xee, 0xb8, 0xf1, 0xb1, 0xdd, 0x41, 0x7f, 0xbb, 0xb2, 0x44, 0x8b, 0x6f, 0xbf, 0x79, 0x25, 0x5b, + 0xb5, 0x80, 0x2e, 0x3b, 0x23, 0x3a, 0x7c, 0xa6, 0xf6, 0x7e, 0xe1, 0x7c, 0x99, 0xe1, 0x90, 0x10, 0x48, 0x8b, 0x5b, 0xc0, 0x6c, 0x6f, 0xca, 0xe8, 0x43, 0x44, 0xcf, 0x1a, 0x42, 0xdf, 0xad, 0x00, + 0xb0, 0x85, 0x07, 0xe9, 0x83, 0xb4, 0x41, 0x02, 0xba, 0x34, 0xb1, 0x7a, 0x06, 0xec, 0x2a, 0xe0, 0xfd, 0xc2, 0x71, 0x7c, 0x94, 0x97, 0xf4, 0x13, 0x1e, 0xfd, 0x60, 0x28, 0xf7, 0xbb, 0xa2, 0xd1, + 0xb3, 0xb2, 0x0a, 0xb7, 0x7c, 0x36, 0xd1, 0xf1, 0x99, 0x04, 0xa2, 0x21, 0xd5, 0x3c, 0x7b, 0x47, 0xcb, 0xc2, 0xdc, 0x4f, 0xea, 0xb8, 0x24, 0x56, 0xdd, 0x5d, 0x20, 0x6d, 0x75, 0x61, 0x17, 0x68, + 0x81, 0xc0, 0x3e, 0xd3, 0xb1, 0x0b, 0xa0, 0x09, 0xb6, 0x87, 0x24, 0x16, 0x6f, 0x0d, 0xe2, 0x31, 0xcf, 0x93, 0xeb, 0xda, 0x5b, 0xec, 0x9e, 0xf0, 0x86, 0x53, 0xaa, 0xb2, 0xd9, 0x90, 0x8e, 0xe9, + 0x95, 0xd7, 0x6a, 0x94, 0xf5, 0x73, 0x48, 0x04, 0x2c, 0x72, 0x8b, 0xe9, 0x03, 0x6a, 0x5a, 0x61, 0x97, 0x4a, 0x6c, 0x36, 0x81, 0xae, 0xce, 0x64, 0xfa, 0xbd, 0x9d, 0xfc, 0xf2, 0x59, 0x6c, 0xb7, + 0x59, 0x27, 0x5c, 0x34, 0x6b, 0x59, 0xb9, 0x4c, 0x77, 0xc4, 0x24, 0x3b, 0x48, 0x42, 0x32, 0x47, 0xfa, 0x77, 0xf6, 0x30, 0xbb, 0xfe, 0xa5, 0x77, 0xea, 0x77, 0x89, 0x97, 0x5a, 0x15, 0xfe, 0xdc, + 0x39, 0xfc, 0xcf, 0xcb, 0x07, 0xda, 0xb1, 0x89, 0x24, 0xff, 0xd1, 0x9e, 0x7d, 0x33, 0x91, 0x81, 0xb7, 0x9c, 0xf2, 0x19, 0xb3, 0xf0, 0x14, 0xcb, 0x47, 0xf5, 0xdd, 0x8d, 0x09, 0xf8, 0x61, 0xc7, + 0xf4, 0x77, 0x0f, 0xff, 0xa5, 0x1c, 0x0c, 0x63, 0x11, 0x9c, 0xc4, 0xc4, 0x1c, 0xbb, 0x1d, 0x48, 0x4d, 0x01, 0x1e, 0x03, 0x16, 0x2f, 0x41, 0x61, 0x0f, 0x0c, 0x7f, 0x0f, 0x2c, 0x37, 0x4c, 0x83, + 0xae, 0x8f, 0x7c, 0xec, 0x73, 0x1f, 0x46, 0xf0, 0xe6, 0x29, 0x48, 0x57, 0xd9, 0x55, 0xc5, 0x6b, 0x15, 0x32, 0x37, 0x8b, 0x05, 0xf0, 0xc5, 0x73, 0x4a, 0x58, 0x9b, 0xaf, 0x7b, 0xcd, 0x84, 0x16, + 0x3d, 0x64, 0x26, 0x58, 0xef, 0xc1, 0x6a, 0x4b, 0x51, 0x33, 0xa5, 0x03, 0x40, 0x95, 0x13, 0xb2, 0x17, 0x9e, 0x7d, 0xef, 0x60, 0x22, 0xac, 0xcc, 0x31, 0x23, 0x37, 0x0b, 0xa6, 0xdb, 0x4d, 0x06, + 0xe4, 0x4a, 0x5d, 0x58, 0xe4, 0x8d, 0xd0, 0xaa, 0x38, 0xbe, 0xba, 0xac, 0x11, 0xcb, 0x5f, 0x97, 0xcd, 0x2c, 0x6b, 0x86, 0x4b, 0x87, 0x61, 0x3f, 0x69, 0x16, 0x92, 0x14, 0x70, 0x52, 0x2f, 0x70, + 0x94, 0x1d, 0x6a, 0x1f, 0x72, 0x12, 0xa8, 0x36, 0xdd, 0xc9, 0x89, 0xd8, 0xe8, 0xce, 0x38, 0x93, 0x11, 0x9f, 0xc8, 0x17, 0x8f, 0x29, 0xbb, 0x33, 0xa5, 0x49, 0x66, 0x3c, 0xc2, 0x4f, 0x69, 0xe9, + 0x5d, 0xf8, 0xb1, 0xa2, 0xe2, 0x21, 0x81, 0x6f, 0xca, 0x62, 0x75, 0x39, 0x35, 0xb0, 0x90, 0xde, 0xca, 0x33, 0x2a, 0x58, 0xe8, 0xba, 0x24, 0x35, 0x7e, 0x93, 0xaa, 0x7e, 0x9b, 0x90, 0x4a, 0xd9, + 0x00, 0x91, 0x72, 0x18, 0xfa, 0x08, 0xe0, 0x87, 0x16, 0xbd, 0x9f, 0x8e, 0xa3, 0x3d, 0x10, 0x90, 0x76, 0x1e, 0x2a, 0x55, 0xc1, 0x49, 0xd5, 0xec, 0xe9, 0xb0, 0x34, 0xf2, 0x33, 0xad, 0xb4, 0xfe, + 0xbc, 0x09, 0x8b, 0x4f, 0x14, 0x8e, 0x3a, 0xfc, 0xc7, 0x76, 0xf2, 0x2f, 0x66, 0x7e, 0x0c, 0xc9, 0x56, 0x80, 0x3e, 0x67, 0x18, 0x1d, 0x92, 0x97, 0x25, 0x95, 0x23, 0x80, 0x98, 0x4e, 0x6b, 0x92, + 0x8f, 0x34, 0x17, 0xa0, 0x6b, 0x26, 0x1b, 0xaf, 0x63, 0xbe, 0x1e, 0xae, 0xeb, 0xf0, 0x2f, 0xa4, 0x6c, 0x65, 0x94, 0xad, 0xaf, 0x37, 0xeb, 0x72, 0xdb, 0x1d, 0x8d, 0x4e, 0x9a, 0x69, 0xcf, 0x0b, + 0x6a, 0xd2, 0x39, 0x86, 0x15, 0xc1, 0x2f, 0x73, 0x72, 0x08, 0xc4, 0xd0, 0xb4, 0x63, 0xf2, 0x31, 0x3a, 0x39, 0xb5, 0x58, 0xa7, 0x0d, 0xec, 0x8e, 0x4e, 0x3b, 0x12, 0x88, 0x3d, 0xfd, 0x20, 0xe2, + 0x55, 0xe4, 0x2d, 0x7b, 0x35, 0x84, 0x2e, 0x3e, 0x3b, 0x9a, 0x9d, 0x09, 0x0b, 0x87, 0x1b, 0xbe, 0x3c, 0xea, 0xf9, 0xd8, 0x29, 0x50, 0xb5, 0xc2, 0xa2, 0x84, 0x5c, 0x7e, 0xc8, 0x5c, 0x19, 0xc1, + 0x7c, 0x4c, 0x64, 0xb8, 0x4d, 0x38, 0x2e, 0xae, 0xc7, 0x19, 0xd5, 0xd5, 0x1f, 0x30, 0x09, 0x13, 0xc0, 0x10, 0x23, 0x1b, 0x3c, 0x2d, 0x25, 0xb7, 0x11, 0xef, 0xe3, 0x64, 0x54, 0x3b, 0x0a, 0xe1, + 0x27, 0xb5, 0xc2, 0xc1, 0xcc, 0x1b, 0xb0, 0x4b, 0x40, 0xec, 0x87, 0x2b, 0xe9, 0xa7, 0xc7, 0x5a, 0x79, 0x57, 0x73, 0xd9, 0xb4, 0x0c, 0x58, 0xcf, 0xac, 0x7d, 0xd3, 0xa3, 0x73, 0xbf, 0x5f, 0xba, + 0x82, 0x68, 0x76, 0x8b, 0x67, 0xc6, 0xcc, 0x17, 0xa8, 0xc4, 0x03, 0xe1, 0x14, 0xbe, 0xf1, 0xae, 0xba, 0x72, 0x37, 0x15, 0x92, 0x5d, 0x0e, 0x26, 0xda, 0xbd, 0xcf, 0x3d, 0x43, 0xed, 0x1a, 0x66, + 0x72, 0x64, 0x7d, 0x80, 0x7b, 0x26, 0xe0, 0xab, 0x38, 0xd7, 0xdb, 0x43, 0x8a, 0xf9, 0x7d, 0x38, 0xb2, 0xf6, 0x2c, 0x76, 0xb8, 0x79, 0x81, 0x64, 0x6f, 0xa1, 0x9f, 0x50, 0xb6, 0x89, 0xc7, 0xa7, + 0xcc, 0xc9, 0x07, 0x5e, 0xb7, 0x40, 0x39, 0x55, 0xcb, 0x98, 0x69, 0xa3, 0x49, 0x40, 0x67, 0xc5, 0x75, 0x9c, 0x8b, 0x29, 0xd4, 0xe2, 0x34, 0x89, 0x1e, 0xaa, 0xb4, 0xaa, 0x3a, 0xd7, 0x54, 0xcc, + 0x26, 0xf5, 0x82, 0x2f, 0x0d, 0xa1, 0x7d, 0xf1, 0x8e, 0x88, 0xdd, 0xe9, 0x2c, 0xd2, 0x87, 0xb4, 0xfd, 0xb9, 0x07, 0x4d, 0xf9, 0xf7, 0x5d, 0x69, 0x4a, 0xe3, 0xff, 0x65, 0xe7, 0xe9, 0x36, 0xe7, + 0xff, 0xb2, 0xf3, 0x79, 0xcf, 0xe7, 0xbf, 0x74, 0x66, 0xfc, 0xcf, 0x73, 0xfc, 0xeb, 0x0b, 0x0c, 0x26, 0x7f, 0xd0, 0xcc, 0x24, 0x36, 0x33, 0xea, 0x5d, 0xb8, 0xb1, 0xf8, 0xf5, 0x6b, 0x5b, 0xc6, + 0x32, 0x34, 0x7f, 0x27, 0x36, 0xeb, 0x3a, 0x8c, 0x9b, 0x22, 0xea, 0x2d, 0xa1, 0x80, 0x76, 0xbb, 0xa7, 0xfa, 0x8b, 0xd2, 0xac, 0x7c, 0x53, 0xed, 0xf7, 0x2c, 0x2b, 0x36, 0xbc, 0x6e, 0x7d, 0xeb, + 0xb4, 0x7e, 0xc9, 0xac, 0x4d, 0xe8, 0x9b, 0x65, 0x24, 0xb8, 0x7f, 0x68, 0xc7, 0x86, 0x48, 0xbb, 0x03, 0x49, 0xfd, 0x3b, 0x09, 0xec, 0x53, 0x55, 0x4c, 0x17, 0x13, 0xbe, 0x2a, 0xd0, 0xf2, 0xf2, + 0x27, 0x0e, 0x86, 0x53, 0xaa, 0xa9, 0xf2, 0x3b, 0x7a, 0x15, 0xdc, 0xaf, 0x5f, 0xea, 0x44, 0xbe, 0x06, 0xa7, 0x9d, 0x5b, 0xba, 0x5f, 0xbe, 0xac, 0xf3, 0xae, 0x1f, 0x98, 0xda, 0x84, 0xb8, 0xef, + 0x0a, 0x12, 0x87, 0xee, 0x50, 0x90, 0xea, 0x7c, 0x01, 0x06, 0x2a, 0xfa, 0xcd, 0x85, 0xb9, 0x39, 0xbe, 0xda, 0x18, 0x7d, 0x5f, 0xab, 0x19, 0xfa, 0xc3, 0xfe, 0x4e, 0x12, 0xd8, 0x52, 0x65, 0xeb, + 0x0e, 0x6f, 0xb5, 0x2e, 0x9f, 0x9a, 0xc3, 0x1d, 0xc0, 0xcf, 0xc5, 0x74, 0xf7, 0xe6, 0x7a, 0x95, 0xf9, 0x36, 0x0f, 0xca, 0x7c, 0xd4, 0xfc, 0xdb, 0x4e, 0x79, 0x38, 0x13, 0xc8, 0x2b, 0xf6, 0xad, + 0x4f, 0xc4, 0xd0, 0x4d, 0x64, 0xff, 0xa1, 0x57, 0x5e, 0x7f, 0xd5, 0xc7, 0xf8, 0xdd, 0x54, 0x9f, 0xc2, 0x1d, 0x2b, 0xed, 0x34, 0xe1, 0xd7, 0xb9, 0x50, 0xb7, 0xe3, 0xc7, 0xbc, 0xe6, 0x2a, 0x95, + 0xa1, 0xbe, 0x93, 0x51, 0xa2, 0xaf, 0x5f, 0xca, 0x6b, 0x6d, 0xf8, 0xf4, 0xae, 0xc8, 0xa6, 0x9d, 0x28, 0x90, 0x91, 0x28, 0x90, 0x7e, 0xe7, 0x58, 0xc9, 0x30, 0xc0, 0x7f, 0x4c, 0x70, 0xd7, 0xf6, + 0x39, 0xbe, 0xf6, 0x2e, 0xe2, 0x6d, 0xaf, 0x1c, 0x99, 0x3a, 0x9d, 0xcc, 0x88, 0x8a, 0x90, 0x94, 0x41, 0xf9, 0x22, 0x85, 0x3a, 0x7c, 0xc4, 0xef, 0x1b, 0xa0, 0x39, 0xec, 0xd5, 0x96, 0xfb, 0xc2, + 0xe5, 0x74, 0x32, 0x7e, 0x6e, 0x5d, 0x20, 0x25, 0xad, 0x3c, 0x8f, 0x79, 0x93, 0xd1, 0xac, 0x68, 0xdc, 0x2b, 0xa4, 0x08, 0x11, 0x0f, 0xb2, 0xb0, 0x18, 0xc9, 0xe9, 0x12, 0x78, 0x7d, 0xad, 0x12, + 0xda, 0x91, 0x9e, 0xa0, 0xa3, 0x13, 0xd0, 0xf2, 0x21, 0x5b, 0x44, 0x69, 0x51, 0x32, 0x46, 0xc6, 0x34, 0xe9, 0x77, 0xc0, 0x81, 0xcb, 0x6c, 0xcc, 0x30, 0x48, 0x92, 0xf3, 0xcf, 0xcb, 0xff, 0xa8, + 0xcf, 0x51, 0x0a, 0xec, 0xd7, 0x35, 0x83, 0x88, 0x1f, 0xf7, 0xfb, 0x2a, 0x22, 0x5e, 0x76, 0x11, 0x47, 0xf7, 0x99, 0xfb, 0x88, 0xe3, 0x10, 0x3c, 0x55, 0x5c, 0x13, 0xdb, 0x8d, 0x5e, 0xd4, 0x71, + 0x2b, 0x34, 0x5c, 0x81, 0x5c, 0x55, 0x59, 0x1e, 0x88, 0x52, 0x83, 0xc6, 0x74, 0x07, 0x68, 0xc4, 0xb3, 0xa9, 0x77, 0xb6, 0x5d, 0x6f, 0x72, 0x78, 0x19, 0xa6, 0xdb, 0xce, 0x51, 0x20, 0xc2, 0x09, + 0xab, 0x47, 0xc4, 0x9c, 0xe4, 0xce, 0x6d, 0xec, 0x21, 0x1c, 0x69, 0x83, 0x2a, 0xbe, 0x05, 0xce, 0xbe, 0x48, 0xc5, 0x7e, 0x48, 0x8b, 0x2c, 0xc3, 0x6b, 0x03, 0xb1, 0xf3, 0x6a, 0xeb, 0xba, 0xba, + 0x8c, 0xbb, 0x95, 0xe9, 0x43, 0x15, 0x2c, 0x39, 0x70, 0x9f, 0x2f, 0xdc, 0x87, 0x74, 0xe5, 0x4e, 0x91, 0x81, 0x45, 0xe6, 0x37, 0xcb, 0xe3, 0x58, 0xdf, 0xe4, 0x06, 0xa1, 0x75, 0x08, 0x53, 0xae, + 0x61, 0x64, 0xa5, 0xf7, 0x66, 0x1b, 0x4d, 0x76, 0xb6, 0xe4, 0x05, 0x0d, 0x5b, 0xd3, 0xaf, 0x86, 0x72, 0xd2, 0xcf, 0x25, 0x84, 0xf6, 0x58, 0x3e, 0xab, 0x5b, 0xa7, 0xcd, 0x87, 0x7e, 0x59, 0x23, + 0x6c, 0xa9, 0x80, 0x77, 0xf4, 0x5e, 0xd6, 0x19, 0x3c, 0x2e, 0xb8, 0xf9, 0xab, 0x83, 0xa7, 0xfb, 0xe8, 0xb2, 0x47, 0x7f, 0x1a, 0xb3, 0x4f, 0x49, 0xa0, 0x17, 0x47, 0xec, 0xe9, 0x2e, 0x39, 0xde, + 0x51, 0x13, 0x7a, 0x7e, 0x6a, 0x68, 0x10, 0xb3, 0x46, 0xc9, 0x8d, 0xc2, 0xc9, 0x96, 0xca, 0xbc, 0xfd, 0x57, 0x05, 0x0f, 0x90, 0x23, 0xcf, 0x22, 0xf9, 0x34, 0x68, 0xa8, 0x06, 0x5e, 0xd2, 0x7b, + 0x1c, 0x37, 0x45, 0xa2, 0x9b, 0x83, 0x01, 0xa7, 0x33, 0xed, 0xa2, 0x46, 0x51, 0x4e, 0xe6, 0x3d, 0xee, 0x16, 0x08, 0x87, 0x19, 0xc4, 0x7a, 0xad, 0x6c, 0x15, 0xc9, 0x91, 0x7a, 0x07, 0xf6, 0xce, + 0x62, 0xd0, 0xae, 0x74, 0x85, 0xf4, 0x08, 0x3a, 0x24, 0xdf, 0x62, 0x7a, 0x55, 0xb0, 0x7d, 0xcc, 0xf0, 0xe3, 0xbd, 0x31, 0x8a, 0x88, 0xdd, 0x80, 0xec, 0x48, 0x19, 0x83, 0xa8, 0x6f, 0x1e, 0xe5, + 0x28, 0xf0, 0x15, 0x21, 0xc1, 0x96, 0x43, 0x8b, 0xcb, 0xbe, 0xa5, 0x64, 0xf7, 0x4a, 0x5e, 0x6c, 0x6d, 0x5e, 0xee, 0x15, 0x4d, 0xfe, 0x54, 0x66, 0xaa, 0xb1, 0x04, 0xc6, 0x64, 0x04, 0xcd, 0xa5, + 0xd8, 0xc9, 0xb9, 0x6f, 0x36, 0xe1, 0xa8, 0x61, 0x6d, 0xad, 0x8b, 0x9e, 0x1f, 0x66, 0x8a, 0x59, 0x66, 0x0e, 0x10, 0x4e, 0x44, 0x53, 0xa6, 0xb4, 0x17, 0x81, 0xde, 0x3f, 0x1b, 0x45, 0x75, 0xf4, + 0x4e, 0x66, 0xbd, 0xe4, 0xd9, 0x63, 0xa2, 0x4b, 0x11, 0xd1, 0x72, 0x85, 0x60, 0x82, 0xd0, 0x77, 0x69, 0xca, 0x9f, 0x2c, 0x1a, 0xbb, 0xb0, 0x14, 0xd0, 0x15, 0x3c, 0x44, 0xfe, 0x5e, 0x56, 0x41, + 0xc4, 0x0f, 0xe6, 0x6c, 0x8c, 0x6e, 0x9e, 0xde, 0x9c, 0xa1, 0x7a, 0x3a, 0x20, 0xd6, 0xf0, 0x7a, 0x59, 0x96, 0x8a, 0x5e, 0x18, 0xbd, 0x11, 0x03, 0xb6, 0xdf, 0x21, 0xf1, 0xfe, 0x74, 0x93, 0x19, + 0x66, 0xfa, 0x98, 0x62, 0x8a, 0xda, 0xf7, 0x59, 0xc3, 0xb5, 0xe0, 0x77, 0x82, 0xfb, 0xd7, 0xa1, 0xe5, 0x9f, 0xed, 0x1a, 0xe5, 0xb3, 0x80, 0x84, 0xb3, 0x06, 0x06, 0xf8, 0xe1, 0x5c, 0xa3, 0x1e, + 0x32, 0x6f, 0x44, 0xfd, 0xe0, 0xee, 0x12, 0xa8, 0xdc, 0xf3, 0xa7, 0xa1, 0xe5, 0x34, 0x20, 0xe9, 0x25, 0xc4, 0xb5, 0xa2, 0x21, 0x26, 0xa7, 0xa3, 0xaa, 0xb5, 0x96, 0xf2, 0x56, 0xe1, 0x6f, 0x5a, + 0xfb, 0x09, 0xb5, 0x00, 0xbf, 0x2f, 0xcd, 0xfd, 0xa2, 0x32, 0xf7, 0x97, 0x64, 0x78, 0xe7, 0x83, 0x63, 0xd5, 0x12, 0x97, 0x1d, 0x4b, 0x6e, 0x07, 0xd2, 0x53, 0x71, 0x7b, 0xca, 0x80, 0x3b, 0xdd, + 0xca, 0x1b, 0x86, 0x51, 0x5d, 0x15, 0x3d, 0x4f, 0xb2, 0x8b, 0x06, 0x64, 0x44, 0xc1, 0x81, 0x96, 0x68, 0xe8, 0x67, 0xd6, 0x55, 0x88, 0xdb, 0xa0, 0xe1, 0x8f, 0xf3, 0x50, 0x48, 0x89, 0xce, 0xf2, + 0xdc, 0x0d, 0xa2, 0x17, 0x04, 0x97, 0x9b, 0x72, 0x19, 0x12, 0x46, 0xfa, 0x77, 0xa2, 0xf8, 0x03, 0x45, 0xbd, 0x0b, 0x45, 0x7f, 0x5f, 0xf7, 0x09, 0xd4, 0xf8, 0xb8, 0xd2, 0x91, 0xb6, 0xa4, 0x4b, + 0xe6, 0xe3, 0x24, 0x69, 0x4a, 0x57, 0xdd, 0x5a, 0x16, 0x45, 0xe2, 0x42, 0x5e, 0xcf, 0x07, 0xe6, 0xb1, 0x18, 0x25, 0x87, 0x1b, 0xa9, 0xf8, 0xb1, 0x82, 0xb8, 0xa0, 0x48, 0x69, 0xb9, 0xb9, 0x1f, + 0xb6, 0x4d, 0xe6, 0x36, 0xa9, 0x4b, 0x8c, 0xf4, 0x02, 0xad, 0xa1, 0x5c, 0xde, 0xa6, 0xae, 0x88, 0xec, 0x0a, 0x64, 0xec, 0x03, 0xe5, 0x30, 0x57, 0x70, 0xd3, 0x7a, 0xf8, 0x5c, 0xc9, 0x7b, 0xe4, + 0xd7, 0x89, 0xaf, 0x04, 0xfb, 0x19, 0x68, 0x65, 0xff, 0xa1, 0xc2, 0x67, 0x7d, 0xd1, 0xf8, 0x56, 0x86, 0xc7, 0xf3, 0x92, 0x89, 0x61, 0x35, 0x8d, 0x19, 0xb2, 0xd0, 0x8f, 0xcb, 0x4e, 0x6c, 0x44, + 0xaa, 0x07, 0xbf, 0xd8, 0x74, 0x10, 0x54, 0x32, 0x13, 0xd1, 0x6a, 0xa0, 0x02, 0x58, 0x59, 0x40, 0xbb, 0x61, 0x9b, 0x2f, 0xcb, 0xa8, 0xf0, 0x61, 0x67, 0x6b, 0x5c, 0xbd, 0x59, 0x82, 0x1b, 0x1d, + 0x5a, 0xd3, 0x91, 0x8f, 0xe7, 0xa7, 0x81, 0x76, 0x95, 0x2d, 0x8b, 0x74, 0xb5, 0x46, 0x0c, 0xb3, 0x30, 0x08, 0xb5, 0x05, 0x45, 0xde, 0xad, 0x43, 0xf9, 0x36, 0xbb, 0x0f, 0x2a, 0x2e, 0xb5, 0x7a, + 0xd2, 0x9b, 0xbe, 0x91, 0x6b, 0x26, 0x01, 0x30, 0xeb, 0x7a, 0x4f, 0xef, 0xc6, 0x53, 0x87, 0x38, 0x6a, 0xca, 0xc1, 0x94, 0xe0, 0xd0, 0x46, 0x8d, 0x44, 0x77, 0xf4, 0xf7, 0x6b, 0x5f, 0x37, 0xad, + 0xe9, 0x55, 0x3a, 0xaa, 0xc8, 0xca, 0x98, 0xe5, 0x4b, 0x86, 0x5c, 0xe4, 0xe5, 0xc2, 0x3e, 0x8a, 0xe5, 0x11, 0x78, 0x0f, 0xb0, 0x31, 0x79, 0xae, 0xdd, 0xca, 0x91, 0x8d, 0xb0, 0xc9, 0x6b, 0xc7, + 0x50, 0x80, 0x0b, 0xc8, 0xf7, 0x93, 0xb6, 0xb0, 0x50, 0x89, 0xe6, 0x88, 0x32, 0x12, 0x3e, 0x34, 0x3e, 0xc3, 0xfc, 0x42, 0x24, 0x2c, 0x33, 0x09, 0xaa, 0xb9, 0xb5, 0x29, 0x3b, 0xdb, 0x2a, 0xb8, + 0x37, 0x57, 0x26, 0x91, 0xbb, 0x04, 0x15, 0xbe, 0x5a, 0x70, 0x4e, 0xf9, 0xb0, 0x6b, 0xed, 0xe8, 0xd0, 0xb1, 0x95, 0x5b, 0xc7, 0x2a, 0xdd, 0x72, 0x22, 0x19, 0x2c, 0x02, 0x9f, 0x86, 0x5c, 0x5b, + 0x8c, 0xdb, 0x9c, 0x87, 0x34, 0xa4, 0x8e, 0xeb, 0x43, 0x85, 0x7c, 0x83, 0x95, 0x3b, 0xd3, 0x50, 0xda, 0x84, 0x57, 0x21, 0x3d, 0x8c, 0x24, 0x8a, 0xc1, 0xc3, 0x56, 0xbd, 0x50, 0x3a, 0x78, 0x8d, + 0x99, 0xb1, 0xdb, 0x54, 0x9f, 0x2f, 0x82, 0xde, 0xa9, 0xd3, 0xa2, 0x54, 0x97, 0xf0, 0xea, 0x89, 0xe8, 0x06, 0x6d, 0xb2, 0x84, 0x0b, 0x28, 0x5f, 0x2f, 0x5e, 0x98, 0x09, 0x11, 0x6f, 0xfb, 0x74, + 0x40, 0x4b, 0xf8, 0x85, 0x9d, 0x88, 0x5a, 0x9f, 0x1a, 0x5d, 0x29, 0x3a, 0x9f, 0x07, 0x59, 0xbf, 0x56, 0x06, 0xb2, 0xbe, 0xec, 0x93, 0xed, 0x5b, 0x1e, 0x15, 0x0d, 0x9d, 0x2b, 0xe6, 0x02, 0xfd, + 0xac, 0xbe, 0xb5, 0x17, 0x3d, 0x24, 0xb9, 0x73, 0xff, 0x32, 0x26, 0x85, 0xee, 0xa2, 0x6c, 0x78, 0x02, 0x33, 0xf6, 0x98, 0x8c, 0x7c, 0x18, 0xd6, 0xf5, 0xe5, 0xa9, 0x5e, 0xe9, 0x97, 0xed, 0x3e, + 0x6d, 0x67, 0x0b, 0x53, 0xbd, 0x1a, 0x5f, 0x4d, 0x19, 0x4b, 0x91, 0x6e, 0x32, 0x03, 0xee, 0x7c, 0xde, 0x19, 0xa9, 0x5f, 0x6a, 0xd8, 0x0c, 0x5d, 0x59, 0xc7, 0xc7, 0xdf, 0xa2, 0x0e, 0x26, 0x9f, + 0xd7, 0xad, 0xfb, 0x17, 0xc7, 0xfc, 0xbf, 0xaf, 0x54, 0xd9, 0xff, 0xde, 0x06, 0x9a, 0x89, 0x1c, 0x86, 0xa1, 0xf2, 0x1f, 0x26, 0x42, 0x66, 0x2e, 0x11, 0x7d, 0x20, 0x71, 0xb6, 0x5b, 0x31, 0x2d, + 0xad, 0x51, 0xeb, 0x33, 0x19, 0x6f, 0xf2, 0xcf, 0x52, 0x72, 0xd0, 0x4f, 0xb9, 0xd6, 0x04, 0x1c, 0x96, 0xfb, 0x1e, 0xfd, 0x5f, 0x92, 0x6d, 0x68, 0x06, 0xda, 0x1d, 0xf9, 0xda, 0x2e, 0x71, 0xd6, + 0x27, 0x13, 0xb8, 0xd2, 0x7d, 0xb6, 0x77, 0x26, 0x78, 0x6b, 0x7a, 0xd1, 0x8e, 0xd2, 0x70, 0x9b, 0x6a, 0xa7, 0x87, 0xfc, 0xdd, 0x84, 0xf0, 0xc4, 0xbe, 0x26, 0xe1, 0xcc, 0x87, 0xbe, 0xe2, 0x0d, + 0xe0, 0xf7, 0xfc, 0xaf, 0x9f, 0xe8, 0x5f, 0xbf, 0x37, 0x5f, 0x76, 0x7e, 0x33, 0x5f, 0x86, 0x13, 0x9b, 0xe6, 0xcd, 0x0b, 0xba, 0x75, 0xf6, 0x9b, 0xf9, 0xf2, 0x0f, 0x6b, 0xaf, 0x5b, 0x42, 0x00, + 0x95, 0x4d, 0x2f, 0x8d, 0x75, 0xa1, 0x1f, 0xde, 0x5e, 0xb7, 0x84, 0xfc, 0x58, 0xab, 0xff, 0x7c, 0x94, 0xbf, 0x3b, 0x09, 0xf0, 0xdf, 0x1e, 0xe5, 0xef, 0x4e, 0x02, 0xfc, 0x27, 0x47, 0xf9, 0x7b, + 0x9b, 0x2f, 0x87, 0x7b, 0x4b, 0xf8, 0x2c, 0xf0, 0xeb, 0x04, 0xec, 0x1d, 0xd6, 0x68, 0x88, 0xd1, 0xdc, 0xf9, 0x35, 0xeb, 0x7b, 0xa1, 0x0e, 0x49, 0xa9, 0x97, 0x4d, 0x1f, 0x7c, 0xaa, 0xae, 0x18, + 0x22, 0xe7, 0x42, 0x11, 0x1a, 0xed, 0x24, 0x1e, 0xa5, 0x9b, 0xe7, 0xf5, 0x92, 0x07, 0xdd, 0x43, 0x18, 0xb6, 0x7f, 0x39, 0x1d, 0x7f, 0x11, 0xf1, 0x02, 0x43, 0x8c, 0x8f, 0x36, 0xb5, 0xa1, 0x4a, + 0x16, 0x6d, 0x4f, 0x3d, 0x50, 0xd1, 0x6a, 0x48, 0xc0, 0x0c, 0x07, 0xbf, 0x20, 0x48, 0x61, 0x72, 0xd9, 0x2b, 0x40, 0xdd, 0xd1, 0x8b, 0x62, 0xfc, 0x10, 0xc3, 0x69, 0xd0, 0xee, 0xf1, 0x6a, 0x89, + 0x15, 0xd6, 0x57, 0x9c, 0x78, 0xff, 0xed, 0x3c, 0xb5, 0x68, 0x7e, 0x6b, 0x9e, 0x7c, 0xbb, 0x59, 0x4a, 0x90, 0x10, 0xf5, 0x66, 0x93, 0xd5, 0xf3, 0x5d, 0x15, 0x39, 0x01, 0xcf, 0xb0, 0x58, 0xd8, + 0x0f, 0x82, 0xe3, 0x49, 0xe5, 0x2f, 0x94, 0xdb, 0xff, 0x54, 0xe3, 0x03, 0xbe, 0x15, 0xf9, 0x28, 0xd6, 0xb3, 0x91, 0x0e, 0xfb, 0xd4, 0x5c, 0xa1, 0x83, 0xb2, 0x2b, 0xbc, 0x68, 0xf9, 0x78, 0xa4, + 0x1f, 0x9c, 0xdc, 0x60, 0x6b, 0x91, 0x04, 0x05, 0xb1, 0xdf, 0xa9, 0xb8, 0xb7, 0x32, 0x8f, 0x42, 0xf5, 0x90, 0x7a, 0x61, 0x5b, 0x61, 0xd6, 0x22, 0x8b, 0xf3, 0xd8, 0xc4, 0x20, 0x8f, 0xac, 0x9a, + 0xf9, 0xd5, 0xbe, 0x03, 0x30, 0x07, 0x3b, 0x02, 0xf1, 0xbd, 0xef, 0xf7, 0xcd, 0x6a, 0xaf, 0x2c, 0x7b, 0x2a, 0x74, 0xa2, 0x8a, 0xa2, 0x1e, 0xd4, 0x65, 0x1c, 0xaf, 0x4d, 0x8b, 0x3d, 0xe6, 0x67, + 0x18, 0xc9, 0xfe, 0x43, 0x9f, 0x63, 0x6d, 0x79, 0x8b, 0x51, 0x14, 0x6e, 0x69, 0xe5, 0xee, 0x05, 0x09, 0xb2, 0x1c, 0xf1, 0xf7, 0x83, 0x2a, 0xbf, 0xc5, 0xe6, 0x57, 0x66, 0x7b, 0x9e, 0xfd, 0xc3, + 0x75, 0xe0, 0x9f, 0xe2, 0x94, 0x3f, 0xbe, 0xa0, 0x44, 0xbc, 0xfa, 0xb7, 0x58, 0xdc, 0x4c, 0x46, 0xae, 0x52, 0xcb, 0x25, 0x9b, 0xa9, 0xf4, 0x5e, 0xcc, 0x9e, 0xfb, 0x80, 0x5f, 0xce, 0xcf, 0xa9, + 0x0f, 0xe2, 0x29, 0x96, 0xc6, 0x7f, 0x16, 0x8b, 0xfb, 0xdb, 0x37, 0xfc, 0xbf, 0x79, 0xc1, 0x81, 0x7f, 0x7a, 0xc3, 0xc5, 0xdf, 0xda, 0x64, 0x5f, 0xed, 0x70, 0x9a, 0x1f, 0x2f, 0xb8, 0x9b, 0xf6, + 0xde, 0x97, 0x3f, 0xa0, 0xf9, 0xbd, 0x61, 0x3a, 0xf0, 0xef, 0xa0, 0xe5, 0x10, 0xd5, 0x91, 0xbe, 0xdc, 0x58, 0xee, 0x7f, 0xc7, 0xec, 0xef, 0xd6, 0xea, 0x3f, 0x1e, 0xe9, 0x57, 0x27, 0x02, 0xfe, + 0xa7, 0x47, 0xfa, 0xd5, 0x89, 0x80, 0xff, 0xe9, 0x91, 0x7e, 0xc5, 0x54, 0x05, 0xfe, 0x42, 0x65, 0xce, 0x52, 0x42, 0xfc, 0xb5, 0xde, 0xc9, 0x94, 0x38, 0xb9, 0xd5, 0x43, 0xb8, 0x33, 0x1e, 0x41, + 0xf3, 0x36, 0xd5, 0xf6, 0xfe, 0x5c, 0x0c, 0xf9, 0xbc, 0xa2, 0x1e, 0xe2, 0x84, 0x3b, 0x47, 0xea, 0x6d, 0x61, 0x13, 0xc6, 0xbe, 0xe9, 0x42, 0x23, 0x46, 0xa0, 0x68, 0xd6, 0x56, 0xc1, 0xf4, 0x1e, + 0xa6, 0xf8, 0x99, 0xba, 0xca, 0x70, 0x20, 0xab, 0x8c, 0x4e, 0xb9, 0x09, 0xe1, 0x82, 0xb3, 0xc9, 0x5e, 0x85, 0x4e, 0x32, 0x14, 0x35, 0xdc, 0x86, 0x4e, 0x81, 0xd3, 0x08, 0x9f, 0x28, 0x17, 0x3b, + 0xf4, 0x25, 0x79, 0xa9, 0x9c, 0x19, 0xce, 0xb2, 0xa5, 0xed, 0x7d, 0xf2, 0x6e, 0x8b, 0x2f, 0xf0, 0x41, 0x63, 0x08, 0x20, 0xea, 0x04, 0xe5, 0x62, 0x04, 0xf6, 0xa4, 0xed, 0x56, 0x61, 0xa4, 0x76, + 0x79, 0xca, 0x17, 0x28, 0x21, 0x37, 0xe6, 0xa0, 0x92, 0xf8, 0x31, 0x27, 0xed, 0xd8, 0x24, 0x43, 0x9d, 0x0e, 0x52, 0xad, 0x99, 0x21, 0xc6, 0x89, 0x23, 0x41, 0xc7, 0x08, 0x0e, 0x2a, 0xf0, 0x0d, + 0x47, 0x81, 0x81, 0x93, 0xde, 0x75, 0x1d, 0x8d, 0xf4, 0x64, 0x5e, 0x4e, 0x8e, 0x00, 0x85, 0xdc, 0x49, 0x6b, 0xe6, 0xb2, 0x5d, 0x0d, 0x79, 0xac, 0x03, 0xe1, 0xd3, 0xfb, 0xc3, 0x13, 0xb2, 0xa7, + 0xcb, 0x5e, 0x93, 0xdd, 0xd1, 0x67, 0xdc, 0x48, 0x43, 0x55, 0x97, 0x4e, 0x7b, 0xa1, 0xe2, 0x63, 0x0e, 0x10, 0x79, 0x7b, 0x8d, 0x25, 0x47, 0x8c, 0x6d, 0xeb, 0xe7, 0x25, 0x71, 0xf6, 0x08, 0x05, + 0x27, 0x6e, 0xbc, 0xaa, 0x3d, 0x3a, 0x09, 0x2b, 0x50, 0x82, 0xf4, 0x9b, 0xab, 0xe4, 0xa7, 0x48, 0x79, 0x37, 0xfa, 0x69, 0x4f, 0x73, 0x61, 0x97, 0xcc, 0x8d, 0xe3, 0x86, 0xaf, 0xcb, 0x78, 0x40, + 0xe7, 0xd1, 0x0d, 0x0f, 0x5a, 0x42, 0xa3, 0xe5, 0x53, 0xd4, 0xfb, 0xd4, 0xe1, 0x05, 0x9c, 0x9c, 0x32, 0x65, 0x04, 0x4b, 0xc5, 0x0d, 0x59, 0x89, 0x22, 0x2a, 0x77, 0x62, 0xb0, 0x2b, 0xc4, 0xdd, + 0x54, 0xa1, 0x80, 0x96, 0x0c, 0xaa, 0xbe, 0xcb, 0x9c, 0x70, 0x31, 0x12, 0x49, 0xb8, 0x2d, 0x7c, 0x3f, 0x05, 0xf4, 0xc6, 0xd8, 0x67, 0x58, 0x3c, 0x4e, 0x7d, 0x86, 0xdd, 0x1b, 0x53, 0xa3, 0x82, + 0x78, 0xd9, 0xcb, 0x8a, 0xfa, 0xdd, 0x12, 0x04, 0xc7, 0x53, 0x3c, 0x20, 0x52, 0xef, 0xaa, 0xa9, 0x7a, 0x79, 0x99, 0x26, 0x6d, 0xb2, 0xd0, 0xd5, 0x84, 0xd1, 0x38, 0x66, 0x03, 0x14, 0x5e, 0x50, + 0xd7, 0xb2, 0xfb, 0x84, 0xce, 0xf9, 0x60, 0xec, 0x65, 0x81, 0x96, 0x4e, 0x5b, 0x29, 0x88, 0x9a, 0x90, 0x74, 0x7c, 0x6b, 0x25, 0x4d, 0x5a, 0x0d, 0xb7, 0x7e, 0x90, 0x47, 0xb6, 0x63, 0x57, 0xa0, + 0xda, 0xfc, 0xb5, 0xbe, 0x29, 0x33, 0x23, 0xf8, 0xe9, 0x6d, 0x78, 0x1f, 0x99, 0x36, 0x18, 0xd0, 0x28, 0x0d, 0x6c, 0x89, 0xa0, 0x3a, 0x97, 0x01, 0x03, 0x94, 0x5f, 0xee, 0xe7, 0x52, 0xc9, 0x4d, + 0x7c, 0x1a, 0x54, 0x1e, 0xd4, 0x14, 0x5e, 0xf9, 0x21, 0xa7, 0x2e, 0x23, 0x45, 0x42, 0x0f, 0x2d, 0xb2, 0x36, 0xc8, 0x98, 0xe2, 0x22, 0x2f, 0x85, 0x35, 0x9e, 0xca, 0x1c, 0x11, 0xd2, 0x8d, 0xf0, + 0x40, 0x3d, 0x90, 0x82, 0x41, 0x5d, 0xec, 0x15, 0x32, 0xb6, 0x3d, 0x1e, 0x91, 0x74, 0x75, 0x54, 0x3b, 0x04, 0xfa, 0x3a, 0x94, 0xb3, 0x2e, 0xea, 0x40, 0x7a, 0x00, 0xf1, 0xe6, 0xe3, 0x8a, 0x0a, + 0x7a, 0xec, 0x21, 0x6d, 0xee, 0xcf, 0x0b, 0xbe, 0x4b, 0x16, 0x61, 0x05, 0x31, 0xc2, 0x2e, 0x93, 0x45, 0x75, 0x95, 0x2e, 0x4d, 0x9c, 0x44, 0x24, 0x17, 0xaa, 0x14, 0xe4, 0xd2, 0xa6, 0xcf, 0x2b, + 0xa0, 0xea, 0xd6, 0x92, 0x18, 0x35, 0x01, 0xcb, 0x1d, 0xb6, 0xc5, 0x37, 0x20, 0x5a, 0xb7, 0xf9, 0x20, 0x6c, 0xf8, 0x43, 0x72, 0xb8, 0xb3, 0x64, 0xc8, 0xea, 0x78, 0xd2, 0xfa, 0x47, 0xaa, 0xea, + 0x7f, 0xd0, 0xcf, 0xb1, 0xd5, 0xc7, 0x79, 0xc2, 0xc0, 0x4e, 0x29, 0x4e, 0x0f, 0xa1, 0x9b, 0xad, 0xf5, 0x58, 0xc8, 0xdb, 0xd3, 0xa9, 0x68, 0xc6, 0xe3, 0x57, 0x32, 0x75, 0x66, 0xf8, 0xf3, 0xad, + 0x59, 0xfb, 0xd1, 0x3b, 0xe7, 0xaa, 0x0a, 0x36, 0x29, 0x05, 0x50, 0x56, 0x0a, 0xdc, 0xe9, 0xdb, 0x5b, 0x3d, 0x4b, 0x16, 0xdb, 0x71, 0x26, 0x75, 0xe7, 0x42, 0x39, 0xea, 0x89, 0xaa, 0x87, 0x9b, + 0xbf, 0x7a, 0xf9, 0x51, 0xfb, 0x70, 0x66, 0xe5, 0x4e, 0x5c, 0x7a, 0xe3, 0x27, 0xba, 0x35, 0xe7, 0x6c, 0x51, 0xff, 0xec, 0x68, 0x02, 0x51, 0x1f, 0x07, 0x81, 0x25, 0x35, 0xe8, 0xee, 0x41, 0xc9, + 0x23, 0xdc, 0x4d, 0x2c, 0x00, 0xa5, 0xf4, 0x5a, 0xdb, 0x4a, 0x98, 0xed, 0x43, 0x9c, 0xb3, 0x04, 0x23, 0x8b, 0x86, 0x1a, 0x5a, 0x4c, 0x77, 0x80, 0x4a, 0x36, 0xe1, 0xcc, 0x7a, 0x54, 0x86, 0x8d, + 0xc6, 0xec, 0xc3, 0xad, 0xce, 0x7d, 0x9c, 0x5d, 0x62, 0x9f, 0x4a, 0x10, 0xfc, 0xec, 0x2d, 0xe8, 0x99, 0xa3, 0x53, 0xdb, 0x86, 0xe0, 0x08, 0x75, 0x8f, 0xba, 0x12, 0x8c, 0x11, 0x79, 0x03, 0x1f, + 0xc4, 0x0a, 0x30, 0x2b, 0xc5, 0xd1, 0xbd, 0xd3, 0xb6, 0x5c, 0xbd, 0x73, 0x55, 0x30, 0x11, 0xa5, 0xce, 0x56, 0x54, 0xb3, 0x30, 0xd5, 0x51, 0x25, 0xd2, 0x15, 0x0a, 0x3d, 0xb2, 0x20, 0x02, 0x82, + 0xd4, 0x94, 0x45, 0xac, 0x79, 0x51, 0xe6, 0xe2, 0x20, 0x39, 0xca, 0x9d, 0x74, 0x68, 0xb2, 0xe4, 0x1c, 0x57, 0x61, 0xc9, 0x16, 0x4b, 0x66, 0x22, 0x00, 0x26, 0xbc, 0x26, 0xfd, 0xa3, 0x15, 0x38, + 0x6b, 0x61, 0xae, 0xca, 0x99, 0x42, 0xd1, 0x3b, 0x6f, 0xfa, 0xe5, 0x42, 0x1e, 0x77, 0xbc, 0x13, 0x7d, 0x6b, 0x84, 0xc2, 0x17, 0x8f, 0xb1, 0x5e, 0x52, 0x7f, 0x3c, 0x1b, 0xe9, 0x0c, 0xcf, 0xdc, + 0x7d, 0x21, 0xbd, 0xa2, 0x80, 0x93, 0xca, 0x8b, 0x4f, 0xce, 0x3c, 0x2b, 0x19, 0x29, 0xa8, 0xcb, 0xd4, 0x63, 0x0a, 0x40, 0x9b, 0xa8, 0xc0, 0x72, 0x83, 0xa6, 0xf8, 0x6e, 0x78, 0xe4, 0x65, 0xb9, + 0x4b, 0xcd, 0xc2, 0x36, 0x29, 0xc4, 0x3c, 0xc6, 0xe0, 0x68, 0x55, 0x04, 0x7c, 0x17, 0xee, 0x7c, 0x8b, 0x1a, 0x58, 0x2a, 0x6d, 0x56, 0x4c, 0x98, 0x7c, 0xf4, 0x18, 0x01, 0xba, 0xaf, 0xab, 0x47, + 0x8a, 0xc9, 0x56, 0x94, 0x4a, 0xed, 0x26, 0xc8, 0x4d, 0x49, 0xad, 0xcf, 0x07, 0xc0, 0xf7, 0xad, 0x59, 0x26, 0xc0, 0x5d, 0x26, 0xc4, 0x5a, 0x56, 0x7c, 0x81, 0xc4, 0xb1, 0x87, 0xda, 0x20, 0x47, + 0xee, 0xd7, 0x96, 0x9e, 0x57, 0xa6, 0xaf, 0xea, 0xec, 0x4e, 0x11, 0x0b, 0x3c, 0x16, 0xf3, 0x5d, 0xde, 0x1f, 0x49, 0x2d, 0xe2, 0xf5, 0x7e, 0xb1, 0xc6, 0x8b, 0xd8, 0x9f, 0xac, 0xdd, 0x3c, 0xae, + 0xe5, 0x73, 0xfb, 0xb9, 0x61, 0x83, 0x4e, 0x0d, 0xe0, 0xab, 0x09, 0x62, 0xd0, 0x03, 0xdf, 0x62, 0xdf, 0xb1, 0xac, 0xb3, 0x13, 0x2f, 0x11, 0x8f, 0x78, 0x6c, 0x47, 0xc5, 0xd8, 0x55, 0x97, 0x15, + 0x26, 0xfd, 0x57, 0x4b, 0x0e, 0xa0, 0xb8, 0xbd, 0x1d, 0x75, 0x92, 0x23, 0x32, 0x32, 0x96, 0xc6, 0x6f, 0x06, 0x36, 0x11, 0x16, 0xf4, 0xdc, 0x4a, 0xd6, 0xc4, 0xe6, 0xa7, 0xf7, 0xea, 0xee, 0xb7, + 0xdf, 0x39, 0x80, 0x6e, 0x98, 0x2c, 0x31, 0xef, 0xaf, 0xb2, 0x5b, 0x44, 0x49, 0xe3, 0x6d, 0x11, 0x1b, 0x1b, 0xaa, 0xdf, 0xc2, 0x68, 0x5d, 0x53, 0xc7, 0x1b, 0x0c, 0x48, 0xb2, 0xbd, 0x81, 0x3d, + 0x5c, 0xf3, 0x48, 0xde, 0xd7, 0xba, 0xa1, 0xa6, 0x93, 0xc4, 0x71, 0x63, 0xf5, 0x1f, 0xfc, 0xb1, 0xa3, 0x90, 0x6b, 0xf1, 0x7e, 0x23, 0x2d, 0x33, 0xea, 0xeb, 0x51, 0xda, 0x00, 0xc9, 0x29, 0xf3, + 0x90, 0x9f, 0x65, 0x4c, 0x5c, 0xcb, 0x7c, 0x36, 0xe3, 0xd0, 0x14, 0x15, 0x1c, 0xc2, 0x15, 0x3b, 0xea, 0x2f, 0xeb, 0x1b, 0x59, 0xe9, 0xc8, 0x94, 0xca, 0x13, 0x83, 0x79, 0x52, 0x3b, 0x75, 0x4c, + 0x33, 0x25, 0xb8, 0x2b, 0x5f, 0xce, 0x65, 0x79, 0x32, 0x8c, 0x50, 0x6a, 0xc0, 0x6e, 0x6c, 0x9d, 0xfc, 0xed, 0x04, 0xdc, 0xd6, 0x3b, 0xbf, 0x33, 0xd9, 0xf8, 0xef, 0xa1, 0x3c, 0xbf, 0xdc, 0x0c, + 0x43, 0x61, 0x3f, 0xa0, 0xbc, 0xcb, 0x1d, 0x8a, 0x87, 0x36, 0xb4, 0xda, 0x34, 0xb1, 0xc0, 0x77, 0x59, 0xb6, 0x2a, 0xdb, 0x6b, 0xe9, 0x96, 0x07, 0x48, 0xab, 0xbf, 0x2c, 0x1f, 0x86, 0x3f, 0x0f, + 0xa9, 0x78, 0x1c, 0x7a, 0x6a, 0x37, 0x05, 0x7f, 0x67, 0x6f, 0x2a, 0x0d, 0xdf, 0x47, 0x3e, 0x56, 0x47, 0x36, 0xad, 0x87, 0x81, 0x35, 0x26, 0x08, 0xf6, 0x49, 0x04, 0xf7, 0x4f, 0x65, 0xc2, 0xdf, + 0xf2, 0x26, 0x9f, 0x08, 0x5e, 0x0d, 0x64, 0xa2, 0xbc, 0x27, 0x5d, 0x7b, 0x66, 0xbe, 0xfb, 0x7b, 0xe8, 0xae, 0x72, 0xbc, 0x05, 0x27, 0xed, 0xb7, 0x61, 0xb7, 0xdf, 0xe7, 0xcc, 0xef, 0xd5, 0x40, + 0x8d, 0xfd, 0x82, 0xd2, 0x4b, 0x58, 0xbb, 0x5d, 0xe4, 0x1b, 0x0a, 0x30, 0x0f, 0xe0, 0x0f, 0x8b, 0x35, 0xfd, 0xf9, 0x09, 0x06, 0xb8, 0x4e, 0xcd, 0x3d, 0x55, 0xd6, 0xfd, 0xce, 0x9e, 0xdd, 0x4c, + 0x3f, 0x6b, 0x93, 0x4e, 0x6b, 0x25, 0x0e, 0xfb, 0xb6, 0xab, 0x8e, 0x5f, 0x22, 0xfb, 0x5b, 0xd5, 0x0f, 0xf8, 0xf3, 0x88, 0x8c, 0xb7, 0x44, 0xbe, 0x06, 0xa5, 0x1d, 0xb9, 0xc5, 0x01, 0x0f, 0x47, + 0x0e, 0x17, 0xa9, 0x74, 0xfa, 0x7d, 0x60, 0xc5, 0xf4, 0x44, 0x6f, 0xf3, 0x7e, 0xb2, 0x96, 0x30, 0x7f, 0x53, 0xaf, 0x00, 0xfe, 0xa3, 0xea, 0x9e, 0x6a, 0x68, 0x10, 0x78, 0x91, 0x34, 0x6f, 0x64, + 0x2c, 0x43, 0xe1, 0x70, 0x58, 0x6e, 0xb4, 0xbb, 0xd2, 0x64, 0xa8, 0x33, 0xc5, 0x9e, 0x45, 0x3d, 0x86, 0xe7, 0xe1, 0xe3, 0x73, 0x03, 0xc8, 0x1e, 0x0a, 0x93, 0x4b, 0x14, 0xab, 0xd1, 0x28, 0xe2, + 0xdd, 0xa9, 0x5d, 0xc5, 0x9a, 0x45, 0x99, 0xb8, 0x2f, 0xd6, 0x89, 0x3e, 0xf3, 0x09, 0xfb, 0x68, 0x2e, 0x11, 0x9a, 0x12, 0xc1, 0x6f, 0xf5, 0xbd, 0x74, 0x47, 0x82, 0x43, 0xcd, 0x62, 0x4c, 0x67, + 0x86, 0xc8, 0x26, 0x3b, 0xe8, 0x07, 0x84, 0x39, 0x2c, 0xa7, 0x05, 0xcf, 0x97, 0xdc, 0x40, 0x09, 0x90, 0xd4, 0xb4, 0x8b, 0x18, 0x3e, 0x65, 0x45, 0x07, 0x36, 0x47, 0xb7, 0x2c, 0x9b, 0x96, 0xd6, + 0x8d, 0xd4, 0xc3, 0x69, 0xe8, 0xad, 0xea, 0x76, 0xed, 0xed, 0x17, 0xc2, 0xcd, 0x3c, 0xcb, 0x4c, 0x2f, 0x79, 0xef, 0x18, 0x25, 0xd7, 0x18, 0x71, 0x93, 0x1c, 0x1f, 0x2f, 0x7e, 0x8b, 0xd9, 0x4e, + 0x46, 0xc0, 0x6d, 0xca, 0xc4, 0xd0, 0xbb, 0x5e, 0xb4, 0xf0, 0x02, 0xb4, 0xbc, 0x2c, 0xe4, 0x17, 0x48, 0x0f, 0x69, 0xfe, 0xb2, 0xe9, 0x24, 0xf3, 0xd6, 0x42, 0x75, 0x26, 0xf6, 0xb3, 0xc5, 0x77, + 0x02, 0x87, 0x6a, 0x24, 0x0c, 0x81, 0xd5, 0xca, 0x45, 0x70, 0x4d, 0x5a, 0xcb, 0x80, 0x2a, 0xfa, 0x30, 0xdf, 0xdb, 0xb3, 0x88, 0xfa, 0x9b, 0x68, 0x40, 0x32, 0x1c, 0x16, 0xeb, 0x9c, 0xa2, 0xe4, + 0x70, 0x35, 0x30, 0xa3, 0x32, 0xa0, 0xac, 0x45, 0xe2, 0x9d, 0x1e, 0x94, 0x2f, 0xe7, 0x96, 0x23, 0x51, 0x94, 0xc8, 0xea, 0x7c, 0x5b, 0x81, 0x8a, 0x99, 0xbe, 0x15, 0x4e, 0x72, 0x58, 0xc6, 0xb6, + 0x65, 0xf1, 0xe5, 0x1a, 0x48, 0xd6, 0x3e, 0xad, 0xb3, 0xb2, 0x5b, 0x81, 0x4e, 0x4f, 0xac, 0x61, 0x0d, 0xe3, 0xf5, 0x6c, 0xe3, 0x8c, 0x74, 0xdf, 0x02, 0x75, 0x4c, 0x1d, 0x3b, 0x7b, 0x95, 0x0f, + 0x78, 0xb6, 0x98, 0x7c, 0xda, 0xde, 0x9d, 0x89, 0x98, 0x78, 0x86, 0xfc, 0x46, 0x93, 0x6b, 0x19, 0xee, 0xaf, 0x85, 0x13, 0x5e, 0x71, 0x4c, 0x89, 0x50, 0x79, 0x6e, 0xa3, 0x31, 0xc9, 0x89, 0x44, + 0x66, 0xcd, 0xb9, 0x82, 0xe9, 0xd0, 0x3f, 0x43, 0xfb, 0x35, 0x31, 0x50, 0x2b, 0xa2, 0xd1, 0x4c, 0x08, 0xd6, 0x66, 0x61, 0xef, 0x2a, 0x44, 0xf2, 0x90, 0x28, 0x00, 0x67, 0x6c, 0xb2, 0x65, 0x20, + 0x54, 0xf6, 0x73, 0x83, 0x97, 0xf7, 0xa4, 0xc0, 0x88, 0x32, 0xc7, 0x99, 0x7b, 0x12, 0x04, 0x84, 0xcb, 0x02, 0x0e, 0x7d, 0x22, 0x06, 0x2c, 0x95, 0x46, 0xad, 0x35, 0x3f, 0x81, 0x97, 0xfa, 0xf4, + 0x6a, 0x22, 0x2e, 0xa5, 0x16, 0x9f, 0x72, 0x29, 0x51, 0x5b, 0x6e, 0x31, 0x76, 0xa5, 0xc8, 0xc1, 0x28, 0xcb, 0xab, 0x26, 0x02, 0xea, 0x2d, 0x90, 0x76, 0x27, 0x3a, 0x2b, 0x18, 0x56, 0x8f, 0x0f, + 0x04, 0xce, 0x5e, 0x55, 0xdd, 0x37, 0x7c, 0x38, 0x71, 0x64, 0x76, 0x4c, 0x90, 0x4a, 0x60, 0x87, 0xfa, 0x1c, 0x27, 0xa5, 0x09, 0x69, 0x6c, 0x92, 0x5d, 0xd6, 0x07, 0xed, 0xf2, 0xc5, 0x65, 0x25, + 0x5e, 0xd5, 0xb7, 0xf5, 0x3e, 0xdb, 0x58, 0xd8, 0xdf, 0xfe, 0x56, 0x0d, 0x61, 0xbc, 0x00, 0x6c, 0x70, 0xba, 0x58, 0x17, 0xa9, 0x51, 0xfb, 0x30, 0xf7, 0x4a, 0x88, 0xa9, 0x26, 0x5c, 0x31, 0xc9, + 0x60, 0x4a, 0xa5, 0x37, 0xec, 0xfb, 0x35, 0x14, 0xf7, 0x41, 0xbf, 0x24, 0x32, 0xbf, 0x03, 0xd0, 0x7e, 0x73, 0x12, 0xdd, 0x86, 0x73, 0xd5, 0xde, 0x90, 0x29, 0x05, 0x4f, 0xa4, 0xb7, 0x6e, 0x5e, + 0x7b, 0x8b, 0x8b, 0x42, 0xa1, 0x6f, 0xb7, 0x3a, 0x6c, 0xc0, 0x0b, 0xa8, 0xc6, 0x48, 0x77, 0x86, 0x67, 0x3d, 0x36, 0xb0, 0x33, 0x7d, 0x5f, 0x18, 0x72, 0xea, 0x2f, 0x1f, 0x03, 0xaf, 0x3c, 0x8c, + 0x61, 0x0e, 0x3a, 0x98, 0xe0, 0x8f, 0xd5, 0xbd, 0x3f, 0xb0, 0x33, 0x84, 0x6e, 0x5c, 0x0a, 0xf7, 0xf9, 0x3c, 0xc9, 0xd8, 0x91, 0x00, 0x08, 0x0d, 0x1f, 0x43, 0xa0, 0x45, 0xab, 0x91, 0x71, 0xd2, + 0x5f, 0xf9, 0x73, 0xfd, 0x5c, 0x1e, 0xa4, 0xe2, 0xb8, 0x3b, 0x49, 0xa7, 0x28, 0x44, 0x78, 0x54, 0x6b, 0xe7, 0x53, 0xe3, 0x9f, 0x14, 0xee, 0x20, 0x80, 0x84, 0xcc, 0xcf, 0x5f, 0x5c, 0x09, 0xff, + 0xb2, 0xba, 0x37, 0x95, 0xde, 0xb6, 0xae, 0x90, 0x77, 0x25, 0x8f, 0xfb, 0xac, 0x58, 0x84, 0x6e, 0xf2, 0xe3, 0x33, 0xaa, 0x2d, 0x00, 0xa1, 0x08, 0x76, 0x51, 0x14, 0xd8, 0x82, 0x9e, 0x2d, 0xa3, + 0x9f, 0xf3, 0x0a, 0x1c, 0x12, 0x27, 0xc6, 0x06, 0x81, 0xf7, 0x5d, 0x6c, 0x11, 0x7c, 0x27, 0xc5, 0xf9, 0xd5, 0x9e, 0xe3, 0xf6, 0x49, 0x24, 0xe2, 0xd5, 0x19, 0xd0, 0x1d, 0x6e, 0x26, 0xd7, 0x88, + 0xac, 0xd7, 0xe7, 0xd5, 0xc9, 0x1c, 0xb6, 0x19, 0x54, 0x20, 0xc6, 0x81, 0xf6, 0xab, 0xc8, 0x00, 0x6a, 0x78, 0xa1, 0xa5, 0xfd, 0x49, 0x6f, 0xed, 0x5c, 0x67, 0x98, 0x70, 0x7b, 0x11, 0x0e, 0x73, + 0xea, 0x89, 0x94, 0x54, 0x87, 0xe1, 0x26, 0x1e, 0xbc, 0xad, 0x0e, 0x5d, 0x1f, 0x3b, 0xca, 0x2f, 0xab, 0xc7, 0x6d, 0x8e, 0x50, 0x24, 0x3b, 0xf7, 0x32, 0x2a, 0x58, 0xe4, 0xd0, 0x47, 0xf4, 0x02, + 0xf9, 0xe0, 0x5c, 0xd7, 0xc4, 0x4d, 0x87, 0xa9, 0xb4, 0x42, 0x20, 0xcc, 0x22, 0x64, 0xbf, 0x64, 0x10, 0xa2, 0xb2, 0x69, 0x44, 0x2c, 0x87, 0x90, 0x73, 0xad, 0x0f, 0x29, 0x70, 0x23, 0x38, 0x11, + 0x41, 0xfc, 0x1d, 0x1b, 0x97, 0xab, 0x5b, 0x34, 0xb7, 0x21, 0xcc, 0x94, 0x51, 0x35, 0xee, 0xf1, 0x5c, 0x6b, 0xce, 0x35, 0xac, 0xf8, 0x33, 0x7e, 0xe2, 0xbe, 0x5d, 0x1b, 0x8e, 0x18, 0xeb, 0x26, + 0xe5, 0x0f, 0x4b, 0x1e, 0x81, 0x38, 0x4b, 0x04, 0xad, 0x16, 0x3f, 0xa0, 0x31, 0x51, 0x5b, 0x7b, 0x1a, 0xa7, 0xbe, 0x3d, 0xd5, 0xe9, 0x46, 0x33, 0x9f, 0x0b, 0xe0, 0x93, 0x8a, 0xb6, 0x42, 0xb4, + 0x99, 0x9c, 0xc4, 0xcd, 0x11, 0x4e, 0xfc, 0x72, 0x77, 0xcf, 0xd1, 0xd3, 0xdf, 0xcb, 0x0b, 0xa4, 0xc9, 0xcc, 0x28, 0x3e, 0xa5, 0x50, 0x19, 0x5c, 0xb4, 0x66, 0x5d, 0xb8, 0xe1, 0xd8, 0x09, 0x9c, + 0xf4, 0xdd, 0x67, 0x7c, 0x1b, 0xbe, 0x8e, 0x4b, 0xbe, 0xd1, 0xa5, 0xc8, 0x22, 0x35, 0xa6, 0x69, 0xdb, 0xb6, 0x79, 0x66, 0xc4, 0xe1, 0x74, 0xa4, 0xe8, 0xa4, 0xd6, 0x3e, 0xb7, 0xf4, 0x50, 0xc0, + 0x43, 0x25, 0x3d, 0x9a, 0x25, 0x1c, 0xd5, 0xd0, 0x9e, 0xa3, 0x0a, 0xa9, 0x74, 0x63, 0x51, 0xb3, 0xb8, 0x0a, 0x58, 0x90, 0x42, 0x97, 0x10, 0x6e, 0x06, 0x50, 0x33, 0xf4, 0x13, 0xbe, 0x14, 0xce, + 0x5c, 0x2f, 0x8e, 0x1f, 0x97, 0x36, 0xc9, 0x2b, 0xc8, 0x0b, 0x78, 0x70, 0x11, 0xaf, 0x1b, 0x7a, 0xf2, 0xf2, 0x96, 0x92, 0xf6, 0x48, 0x99, 0xe0, 0x93, 0x45, 0xca, 0x0d, 0x27, 0xee, 0xbe, 0x1c, + 0x8e, 0x50, 0x7a, 0x25, 0xbd, 0x87, 0xb8, 0x93, 0x02, 0x97, 0x18, 0xf2, 0xa6, 0xb2, 0x41, 0x60, 0x59, 0xe9, 0x56, 0x01, 0x95, 0x8b, 0x64, 0xb4, 0xbc, 0xed, 0xe9, 0x0d, 0xce, 0x61, 0x20, 0xee, + 0xd8, 0x25, 0x57, 0x53, 0x91, 0xa5, 0x91, 0x70, 0x15, 0xfc, 0x70, 0xf6, 0x5a, 0x95, 0xf1, 0xa4, 0xd9, 0xbe, 0x76, 0x30, 0x34, 0x99, 0x5d, 0x38, 0x6a, 0xcf, 0x62, 0x6b, 0xca, 0xc6, 0x87, 0x1b, + 0xdc, 0xd1, 0x3a, 0x10, 0x1f, 0x81, 0x53, 0x26, 0xb7, 0x45, 0x43, 0x0a, 0x79, 0x03, 0x91, 0x97, 0x96, 0x8f, 0x68, 0xed, 0xf3, 0x2e, 0x1a, 0x64, 0x0e, 0xa7, 0xa2, 0x04, 0x32, 0x3b, 0x33, 0x8a, + 0x88, 0xce, 0xdf, 0x37, 0x35, 0x12, 0x37, 0x10, 0x31, 0x73, 0x69, 0xa5, 0xd3, 0x0b, 0xdf, 0x3d, 0x0b, 0x4c, 0x75, 0x4c, 0xbe, 0x92, 0xc1, 0x71, 0x20, 0x81, 0x57, 0xd9, 0xf4, 0x44, 0xbc, 0x87, + 0xb4, 0x7e, 0x6c, 0xc9, 0xd3, 0xca, 0xe7, 0x0c, 0x50, 0xd1, 0x73, 0x46, 0xf4, 0x9d, 0xfb, 0xc8, 0xfd, 0xeb, 0xa0, 0x6e, 0x55, 0xdd, 0xea, 0x3a, 0x23, 0x27, 0xd6, 0x92, 0xb6, 0xdc, 0xb3, 0x6b, + 0xaa, 0x82, 0x6b, 0xa7, 0x61, 0x31, 0x5d, 0x38, 0xd8, 0x93, 0x8f, 0x11, 0xf6, 0x8d, 0xfd, 0xbd, 0x65, 0xbf, 0x48, 0x59, 0x12, 0x43, 0xfd, 0xcb, 0x51, 0xec, 0xdf, 0xa9, 0xd3, 0x53, 0xff, 0x42, + 0x20, 0xe4, 0x97, 0x86, 0xe1, 0xff, 0x31, 0x50, 0x18, 0xbf, 0xe4, 0x24, 0xf4, 0xfa, 0x51, 0x4b, 0xd0, 0xd3, 0xc9, 0x11, 0x75, 0x92, 0x25, 0x88, 0x58, 0x6f, 0x88, 0x02, 0x8a, 0xa4, 0x06, 0x2d, + 0x7e, 0x15, 0x68, 0x2c, 0xbd, 0xfc, 0x5c, 0x4b, 0x10, 0xdd, 0x9f, 0x52, 0xae, 0x2d, 0x78, 0x4b, 0x22, 0x78, 0x5b, 0xec, 0xab, 0xa5, 0xe9, 0x6b, 0x9f, 0x48, 0xf0, 0xd6, 0x2f, 0xbf, 0x0e, 0x7d, + 0xec, 0xcb, 0xdd, 0xb8, 0x4d, 0x11, 0xef, 0x93, 0x76, 0xda, 0x20, 0x71, 0xed, 0x96, 0x3e, 0xad, 0x31, 0x13, 0xbd, 0x6f, 0xa2, 0x50, 0xe9, 0xf5, 0x25, 0x9d, 0x72, 0x8d, 0xca, 0x48, 0xdf, 0x53, + 0x6e, 0x62, 0x73, 0xbc, 0x6d, 0xbb, 0x1a, 0x2d, 0xf1, 0x96, 0xea, 0x5e, 0xb4, 0xed, 0x7e, 0x6d, 0xc2, 0xfd, 0x70, 0xd1, 0xbd, 0xbe, 0xf2, 0x8b, 0xbe, 0x71, 0x8d, 0xce, 0xaf, 0x8e, 0xb9, 0x0e, + 0x77, 0x68, 0x8e, 0x7b, 0x03, 0xfa, 0x37, 0xb2, 0x11, 0xfc, 0xf5, 0x81, 0xfb, 0xdb, 0xa2, 0x06, 0x0f, 0x47, 0xf2, 0x73, 0x17, 0x14, 0x96, 0x7e, 0x82, 0x38, 0x9f, 0x36, 0x11, 0xce, 0x36, 0xe9, + 0xda, 0x5a, 0xe2, 0xf8, 0x3a, 0xf4, 0xad, 0x16, 0x48, 0xfc, 0xb6, 0x96, 0x04, 0x7e, 0x8b, 0x18, 0xda, 0x8e, 0x02, 0xad, 0x0d, 0x03, 0xb9, 0x8e, 0x19, 0x5a, 0x4e, 0x7a, 0x0d, 0x8a, 0x03, 0x0b, + 0xfe, 0x8a, 0x2c, 0x7a, 0xf5, 0x0b, 0x7c, 0x39, 0x65, 0x96, 0xaa, 0xbe, 0x43, 0x1c, 0x01, 0xfa, 0xd0, 0x6e, 0xd3, 0xb2, 0xa6, 0x4d, 0xbb, 0x0e, 0xaf, 0x7e, 0x15, 0xa9, 0x07, 0x7e, 0xd2, 0x99, + 0xbd, 0xd4, 0xff, 0x46, 0xff, 0x4a, 0xda, 0x19, 0x0c, 0x27, 0xdb, 0xee, 0xf0, 0xfa, 0x76, 0x69, 0x34, 0x40, 0x56, 0x7a, 0x93, 0xed, 0x1c, 0xe2, 0xde, 0xa4, 0x46, 0x60, 0x2e, 0xae, 0x78, 0x66, + 0xd6, 0x75, 0x98, 0x96, 0x36, 0x7f, 0xf2, 0x97, 0xdf, 0x9e, 0x23, 0xf6, 0x6a, 0x64, 0xb3, 0x0b, 0x22, 0x82, 0x17, 0x8f, 0xe5, 0x61, 0xf1, 0x75, 0x54, 0x19, 0x4e, 0xc9, 0xa1, 0x9e, 0xc0, 0x80, + 0xf8, 0x6d, 0xaf, 0x42, 0x9f, 0x29, 0xdb, 0x61, 0x0d, 0x50, 0xb0, 0x01, 0x31, 0xb2, 0xbc, 0x1c, 0xe5, 0xa1, 0xd6, 0xb1, 0x99, 0xf7, 0x96, 0x80, 0xe1, 0x4e, 0x8d, 0xe5, 0x25, 0xaa, 0x76, 0xba, + 0x54, 0x8b, 0x19, 0xaf, 0x87, 0xa4, 0xd3, 0x6f, 0x1c, 0xcf, 0x3d, 0x90, 0x6d, 0x8f, 0xc9, 0xa1, 0x80, 0x08, 0xdf, 0xaa, 0xf8, 0xad, 0xa9, 0x22, 0xc5, 0x2a, 0xf3, 0x58, 0xd5, 0xbd, 0xaa, 0x84, + 0xbb, 0x96, 0x9d, 0x62, 0x24, 0x04, 0xdc, 0xf6, 0xb3, 0x21, 0xc7, 0xfc, 0x8a, 0x09, 0x72, 0x78, 0x6c, 0x7a, 0x13, 0xd4, 0x23, 0x9f, 0x62, 0xa5, 0x88, 0xb7, 0x04, 0x93, 0xae, 0xa8, 0x3a, 0x26, + 0x7a, 0x31, 0x4f, 0x4d, 0xb6, 0x9e, 0xc8, 0x0d, 0x4a, 0x63, 0x84, 0x21, 0xd8, 0x15, 0xc5, 0x4f, 0x58, 0x95, 0xcd, 0x9a, 0x06, 0x75, 0x86, 0x6f, 0x16, 0xb8, 0x93, 0x4f, 0x67, 0xbb, 0xc0, 0x37, + 0x80, 0xf1, 0x73, 0x74, 0xa2, 0x50, 0x06, 0xca, 0x55, 0xf4, 0xb8, 0xae, 0xa6, 0xec, 0xf6, 0xe3, 0xfd, 0x79, 0xe8, 0x0c, 0x4c, 0x9e, 0x01, 0x7f, 0x6d, 0x66, 0xbf, 0x8c, 0x55, 0x28, 0x2a, 0x14, + 0xae, 0x47, 0xd7, 0x50, 0xe5, 0x0c, 0x44, 0xc9, 0xa6, 0x63, 0x24, 0x58, 0xfb, 0xc1, 0xc1, 0x18, 0x8f, 0x52, 0x95, 0x8e, 0x59, 0x32, 0x74, 0x3e, 0x3d, 0xb7, 0x03, 0x59, 0xd7, 0x13, 0x8d, 0xf6, + 0x4c, 0x14, 0xff, 0x65, 0x11, 0xe3, 0x0e, 0x0b, 0xdd, 0x96, 0x27, 0xa7, 0xaf, 0xe6, 0x3b, 0xad, 0xbc, 0xdf, 0x54, 0xa5, 0x4b, 0x54, 0x93, 0xb0, 0x71, 0xa3, 0x83, 0xd2, 0xd1, 0x14, 0x1a, 0xca, + 0x11, 0x20, 0x6d, 0xdc, 0xfe, 0x4c, 0x58, 0x90, 0x25, 0xbd, 0x3c, 0x56, 0x1a, 0x51, 0xba, 0x99, 0xd3, 0x90, 0xda, 0x5c, 0x0b, 0x80, 0x42, 0x25, 0xe1, 0x4d, 0x56, 0x0d, 0x9d, 0x82, 0x7e, 0xf7, + 0x57, 0x8c, 0x66, 0x0c, 0xbe, 0xc0, 0xb4, 0xf0, 0x1a, 0xde, 0x4b, 0xef, 0x88, 0xe8, 0xe3, 0x32, 0x2a, 0xea, 0xa0, 0xa5, 0xf4, 0xad, 0xca, 0x72, 0xdf, 0x78, 0x2e, 0xc2, 0xde, 0x3a, 0x7f, 0xad, + 0xba, 0x3e, 0xd1, 0x94, 0xa0, 0xba, 0x9b, 0xa3, 0xe5, 0x4f, 0x73, 0x4f, 0x06, 0xce, 0x15, 0x01, 0xa1, 0x56, 0xe5, 0x07, 0x87, 0x40, 0xe3, 0xf1, 0xee, 0xe2, 0xc2, 0x61, 0x7c, 0xd3, 0x97, 0xa2, + 0xd0, 0xf3, 0xe7, 0x66, 0x57, 0x50, 0x0d, 0x25, 0x0a, 0x1b, 0x8a, 0x2f, 0xbd, 0x7f, 0x89, 0xb8, 0xf6, 0xb1, 0xd7, 0x70, 0xe2, 0x70, 0xf8, 0xe9, 0xd0, 0x43, 0xd8, 0x61, 0x9c, 0xe1, 0x6b, 0xa5, + 0xe0, 0xa9, 0x7e, 0xf0, 0x78, 0x0f, 0xa0, 0x24, 0x4d, 0x1d, 0xf0, 0x89, 0xa3, 0x27, 0x39, 0x25, 0x84, 0xa8, 0x2b, 0x5b, 0x32, 0x9a, 0xf7, 0x7b, 0xd0, 0xcc, 0x0f, 0x35, 0xb7, 0x0e, 0x9a, 0xa0, + 0x2e, 0xe7, 0xa1, 0x94, 0x24, 0xce, 0x3e, 0x52, 0xd7, 0xf2, 0xf0, 0x54, 0x73, 0xf8, 0xb4, 0x48, 0xda, 0x5c, 0x4c, 0x05, 0x8d, 0x43, 0x1a, 0xc6, 0xd3, 0x8e, 0xcb, 0x44, 0x44, 0x5d, 0xab, 0xf7, + 0xac, 0x0f, 0x8d, 0x6f, 0x02, 0x8c, 0x71, 0xce, 0xfb, 0xac, 0x99, 0xef, 0x76, 0x26, 0x27, 0xae, 0x0c, 0xad, 0x35, 0x36, 0x4d, 0xf9, 0x6d, 0x32, 0x83, 0x95, 0xc7, 0xac, 0x88, 0xe2, 0x0f, 0x48, + 0x83, 0xce, 0xa7, 0x50, 0x44, 0x4d, 0xe8, 0x79, 0x61, 0x1f, 0xd9, 0xb8, 0x66, 0xa5, 0x6e, 0xf3, 0x52, 0x5f, 0xf5, 0xcf, 0xfa, 0x57, 0xbf, 0xd4, 0x34, 0xfe, 0xe3, 0xfc, 0xd2, 0x28, 0x49, 0x78, + 0x54, 0x8e, 0xb2, 0xf4, 0x56, 0x1f, 0x93, 0xe3, 0x13, 0x5e, 0x80, 0x57, 0x9e, 0xb6, 0x5b, 0xca, 0xf6, 0x33, 0x26, 0x00, 0x7e, 0x23, 0x93, 0xfe, 0x25, 0x28, 0x30, 0x46, 0x5a, 0x9a, 0x3a, 0xac, + 0xe2, 0x6d, 0xaf, 0xcb, 0x8f, 0xdb, 0xab, 0xa5, 0x4d, 0xee, 0xb3, 0x62, 0x75, 0xca, 0x62, 0xef, 0x35, 0xca, 0x0d, 0x60, 0xcc, 0xdc, 0xfd, 0xca, 0x6f, 0xde, 0xa6, 0x0b, 0x70, 0xf1, 0x38, 0x24, + 0x66, 0x03, 0xeb, 0x2e, 0x25, 0x23, 0xbb, 0x29, 0x2b, 0xac, 0xdd, 0xe6, 0x70, 0xc7, 0xd9, 0x76, 0x17, 0x64, 0x6a, 0x29, 0x8a, 0x4d, 0xb6, 0x12, 0x0b, 0x9a, 0xba, 0x4c, 0x52, 0xf7, 0x35, 0x4c, + 0xb9, 0x37, 0xf8, 0x2c, 0xb0, 0x08, 0xe1, 0x54, 0x4f, 0x18, 0x33, 0xaa, 0xb4, 0x61, 0x16, 0xd2, 0x9c, 0x25, 0x24, 0x79, 0x6f, 0x02, 0x4c, 0x6b, 0x15, 0xe9, 0xae, 0x24, 0xb6, 0xa3, 0x91, 0xc2, + 0xb5, 0x2d, 0x3c, 0xf7, 0x3d, 0xcd, 0xbc, 0xce, 0xcf, 0xb2, 0xe7, 0x6b, 0x6d, 0x3c, 0x63, 0x94, 0xaf, 0x9e, 0x71, 0x1d, 0x8b, 0xb8, 0x36, 0xee, 0x9e, 0x6a, 0x9c, 0x06, 0x98, 0x5e, 0x9b, 0xf6, + 0x20, 0x9a, 0x4b, 0xfa, 0x34, 0x99, 0x20, 0xec, 0x2a, 0x45, 0x86, 0x8c, 0x35, 0xac, 0x27, 0x0b, 0x98, 0xa3, 0x9d, 0x48, 0x06, 0x6b, 0xdd, 0x89, 0x32, 0x2b, 0xbc, 0xc1, 0xb8, 0xcf, 0xcf, 0xdb, + 0x39, 0x6c, 0xd7, 0x8c, 0x26, 0x43, 0xbe, 0x15, 0x1a, 0x73, 0x9b, 0x68, 0x07, 0xc5, 0xeb, 0x18, 0xb6, 0x81, 0xa9, 0x9b, 0xf3, 0xad, 0x58, 0x64, 0x58, 0x87, 0x8b, 0x93, 0x1f, 0x85, 0xfa, 0x8a, + 0x1e, 0x19, 0x02, 0x3f, 0x5c, 0x83, 0x29, 0xd8, 0x35, 0xb5, 0x80, 0x9a, 0x20, 0xc2, 0x33, 0x57, 0x7b, 0xb0, 0x4a, 0x76, 0x3a, 0x7a, 0x1a, 0xf7, 0x5d, 0xf0, 0x90, 0xb8, 0xc7, 0xfa, 0x8b, 0xf2, + 0x3f, 0xd4, 0x81, 0x37, 0x64, 0xfc, 0xe0, 0xc9, 0xc5, 0x30, 0x4a, 0x34, 0xca, 0xa9, 0x5e, 0x9c, 0x4c, 0xf9, 0x92, 0x9a, 0xfd, 0xa9, 0x3d, 0x63, 0x3c, 0x4b, 0x6d, 0x9e, 0x82, 0xc7, 0x1a, 0x4e, + 0x78, 0x98, 0x4e, 0xdf, 0x18, 0xb0, 0x47, 0xf6, 0x5a, 0xd3, 0x7e, 0x34, 0x62, 0x1a, 0x49, 0x2e, 0xc1, 0x3d, 0xf5, 0x8e, 0x41, 0x4b, 0xbe, 0xdb, 0x51, 0x2c, 0x84, 0xee, 0xfd, 0x5b, 0x16, 0x7c, + 0x10, 0x15, 0xde, 0xfb, 0xa5, 0x06, 0xf8, 0xb2, 0x74, 0xb9, 0xd7, 0xd4, 0x71, 0x5e, 0x20, 0x7e, 0xf6, 0xf1, 0x1f, 0x03, 0x8a, 0xf9, 0xa7, 0xa2, 0x42, 0xa0, 0x82, 0x89, 0xa4, 0x2a, 0x40, 0xc0, + 0x64, 0xdc, 0x9e, 0x2a, 0x7d, 0x86, 0xd7, 0xb2, 0x6d, 0x97, 0x6f, 0x70, 0xd9, 0x8c, 0x2f, 0x3a, 0x5d, 0x7f, 0x82, 0xf6, 0x36, 0xe6, 0x7a, 0xa8, 0xdc, 0x7c, 0xb7, 0xaa, 0x97, 0x71, 0xbf, 0x6f, + 0x55, 0xf4, 0xa4, 0x02, 0x5f, 0x15, 0xc9, 0xc9, 0x5f, 0xa3, 0x43, 0x0b, 0x12, 0xdd, 0x17, 0x22, 0xe5, 0x3c, 0x5e, 0x1f, 0x7d, 0xb5, 0x15, 0x89, 0x66, 0x71, 0x80, 0x6a, 0x8b, 0xee, 0x45, 0x70, + 0xca, 0x8a, 0xd1, 0x42, 0x4f, 0x37, 0x63, 0xad, 0x9d, 0xfb, 0xc0, 0x8d, 0x63, 0x1c, 0xd9, 0x4f, 0x59, 0xf0, 0x4b, 0x10, 0x3f, 0xc0, 0xbb, 0x14, 0x5f, 0x92, 0xfd, 0x22, 0x63, 0xa3, 0x4a, 0x88, + 0x29, 0x30, 0x54, 0xe7, 0x93, 0xf2, 0xf1, 0xdc, 0xb5, 0x07, 0x4b, 0x3f, 0xe1, 0xa9, 0x1d, 0xef, 0x6e, 0xc2, 0x43, 0x0b, 0x04, 0x0c, 0x5e, 0x18, 0xf4, 0xb5, 0x73, 0x7d, 0xf4, 0x02, 0x9d, 0xe3, + 0x73, 0x62, 0xd9, 0x36, 0x04, 0x9a, 0x63, 0x8f, 0x3b, 0x4a, 0x0d, 0x44, 0xe8, 0x9f, 0x07, 0x38, 0x94, 0x2a, 0x9a, 0xbe, 0x05, 0x0b, 0x12, 0xcc, 0xda, 0x31, 0x37, 0x43, 0xa7, 0x78, 0x18, 0x5c, + 0xb2, 0xc3, 0x59, 0x74, 0x8e, 0xbf, 0x48, 0xae, 0x9c, 0x86, 0x08, 0xea, 0xeb, 0xbe, 0x07, 0x9a, 0xe2, 0x09, 0xfa, 0x64, 0xf2, 0x9c, 0xe3, 0x70, 0xa7, 0x8e, 0x75, 0x45, 0xe1, 0xcc, 0xc5, 0x9f, + 0x91, 0x23, 0x48, 0x90, 0xd5, 0x29, 0xff, 0x31, 0x28, 0xf8, 0xbd, 0x65, 0xfe, 0xff, 0x16, 0x14, 0x30, 0xde, 0x97, 0x3c, 0x93, 0xfd, 0xbb, 0x11, 0x18, 0x3d, 0xed, 0xac, 0x0e, 0x8a, 0x50, 0x47, + 0xe6, 0x44, 0xda, 0x1d, 0xd0, 0xcf, 0xdf, 0xe0, 0xfd, 0x73, 0x43, 0xe6, 0xfe, 0x23, 0x20, 0xf8, 0x82, 0x07, 0x80, 0xff, 0x2b, 0x40, 0xf0, 0x05, 0x0f, 0x00, 0xff, 0x00, 0x08, 0xf8, 0x9f, 0x6c, + 0xf5, 0x7f, 0x05, 0x08, 0x4e, 0x95, 0xe5, 0x4e, 0x95, 0x1f, 0x02, 0xe0, 0x77, 0x80, 0xe0, 0xcb, 0xe2, 0xa1, 0x7b, 0xff, 0x33, 0x40, 0xf0, 0x05, 0x0f, 0x00, 0xff, 0x17, 0x80, 0xe0, 0xbb, 0xff, + 0x14, 0xf0, 0x47, 0x40, 0xf0, 0x0f, 0xe2, 0x34, 0x6c, 0x29, 0x81, 0xb3, 0x50, 0xb6, 0xab, 0x8c, 0xcf, 0x6f, 0x52, 0xd6, 0x57, 0x96, 0x42, 0x55, 0xf5, 0xf5, 0x7e, 0xcf, 0x67, 0xda, 0xc1, 0x2d, + 0x40, 0x71, 0xb9, 0xf4, 0x31, 0xae, 0x58, 0xee, 0xb6, 0xc9, 0x7e, 0x8d, 0x0b, 0x4d, 0x4d, 0x52, 0xf0, 0x29, 0x2e, 0x2f, 0x2c, 0x08, 0x55, 0xa1, 0x20, 0xb4, 0xb6, 0x42, 0xef, 0x9c, 0x38, 0xf7, + 0xd1, 0x1c, 0x48, 0xdc, 0x5f, 0x6d, 0xef, 0xb0, 0xae, 0x45, 0x86, 0xb6, 0x23, 0xaa, 0x1d, 0x87, 0x95, 0x5c, 0x98, 0xc1, 0xd0, 0xf3, 0xed, 0x36, 0xdc, 0x23, 0x01, 0x38, 0xc6, 0x9d, 0x26, 0xb1, + 0x5c, 0xf7, 0x91, 0xa6, 0x7d, 0x99, 0xf2, 0xd2, 0x29, 0xff, 0xac, 0x7f, 0x31, 0xa1, 0xfa, 0xab, 0xc1, 0xa8, 0xcb, 0x5a, 0x9d, 0xd2, 0x52, 0x1e, 0xb4, 0xe6, 0xfa, 0x00, 0x14, 0x4f, 0x44, 0xd7, + 0x3d, 0x9e, 0x83, 0xec, 0x46, 0xc9, 0x32, 0xfc, 0x42, 0xb3, 0x40, 0x10, 0xfe, 0xec, 0xb7, 0x9f, 0x52, 0xaa, 0x60, 0x32, 0x2a, 0x2d, 0xe6, 0xf3, 0x5e, 0xa7, 0xce, 0x50, 0x1d, 0x53, 0x41, 0x55, + 0xc0, 0x9c, 0xca, 0x96, 0xa9, 0x93, 0x65, 0x6a, 0x3f, 0xb7, 0xfa, 0x50, 0xb8, 0xc0, 0xd4, 0x0e, 0x3b, 0xb6, 0x6d, 0x7c, 0x71, 0xdd, 0x4a, 0x64, 0x3a, 0xe8, 0x40, 0x8e, 0x69, 0x19, 0x16, 0x53, + 0xbe, 0x5f, 0x78, 0x28, 0x6f, 0x5d, 0x29, 0x1d, 0x6f, 0x28, 0x8f, 0x69, 0x22, 0xb1, 0x8e, 0x81, 0x27, 0xae, 0x72, 0xf3, 0x05, 0x8e, 0x4b, 0x06, 0xd0, 0x3c, 0x00, 0x26, 0xc2, 0x61, 0xe9, 0x2a, + 0xb5, 0xfe, 0xb4, 0x11, 0x83, 0xd7, 0x2b, 0x87, 0x8a, 0xc6, 0xa2, 0x18, 0x97, 0x26, 0x0d, 0x27, 0xdb, 0x0d, 0xba, 0x97, 0x92, 0x3a, 0xa8, 0x33, 0x2e, 0x7f, 0x4b, 0x01, 0xdc, 0xd6, 0x61, 0xae, + 0xb2, 0x38, 0xfb, 0x57, 0x96, 0xff, 0x5b, 0x93, 0x26, 0xad, 0x86, 0xfe, 0x5f, 0x7c, 0x35, 0x77, 0xf1, 0x38, 0x0f, 0x45, 0xbe, 0x54, 0x43, 0x1f, 0xb7, 0xff, 0x62, 0x24, 0xfe, 0x5f, 0x14, 0x8e, + 0xe0, 0x4f, 0x14, 0xc2, 0x89, 0xff, 0x64, 0x02, 0xfd, 0xd7, 0x3f, 0xfe, 0x29, 0xaa, 0x05, 0xfe, 0x4b, 0x54, 0x83, 0x3f, 0xa0, 0xbe, 0x24, 0x3c, 0xd9, 0x11, 0xda, 0x1f, 0x5b, 0x22, 0xfe, 0x9a, + 0x42, 0xe8, 0x3a, 0x7f, 0x66, 0x09, 0x7e, 0x49, 0xdc, 0xc0, 0xf7, 0x57, 0x58, 0x77, 0xff, 0x99, 0x3f, 0x27, 0x71, 0xd1, 0x98, 0x76, 0xf0, 0x27, 0x15, 0xe5, 0x3d, 0xea, 0xbc, 0xfb, 0xcb, 0x5a, + 0xe8, 0x1f, 0xa5, 0x09, 0xb5, 0x82, 0xc4, 0x71, 0x08, 0xa0, 0xd6, 0xe1, 0xad, 0xb1, 0x14, 0xa2, 0xb3, 0xbf, 0x09, 0xd1, 0xb0, 0x14, 0xf6, 0xd5, 0xf0, 0xed, 0xeb, 0x38, 0x79, 0xf6, 0x4d, 0x87, + 0xa6, 0xa6, 0x60, 0x95, 0x75, 0x7f, 0xac, 0xa9, 0xfc, 0xcf, 0x4e, 0x11, 0x9e, 0xa3, 0xba, 0xd2, 0x01, 0x98, 0xbf, 0xc9, 0xe1, 0xb0, 0x6c, 0xfb, 0x8f, 0xe4, 0xc5, 0xa4, 0xa2, 0x85, 0x38, 0x90, + 0xd7, 0x30, 0xa0, 0xaf, 0x04, 0x89, 0xda, 0x14, 0xf9, 0x56, 0x13, 0x94, 0x38, 0x4d, 0xb6, 0x2a, 0x9a, 0x06, 0xb4, 0x5a, 0x42, 0xd4, 0xdb, 0x3c, 0xb4, 0xba, 0xfc, 0x2f, 0x74, 0x66, 0xd8, 0x77, + 0xdb, 0x6d, 0x3a, 0xbe, 0xd7, 0x2f, 0x22, 0x96, 0x60, 0x54, 0x24, 0x55, 0x64, 0x63, 0x59, 0xc0, 0x5d, 0x33, 0x72, 0xfd, 0xb0, 0x12, 0xd5, 0xe2, 0xb7, 0x79, 0xcd, 0x9c, 0x83, 0x4c, 0xd7, 0xf5, + 0x39, 0xb3, 0xb7, 0x3c, 0xa2, 0x9c, 0x35, 0x8e, 0xbe, 0x97, 0xef, 0xab, 0x4d, 0x33, 0x98, 0xb4, 0x18, 0xd8, 0x4a, 0x26, 0x63, 0xa9, 0xdb, 0x0a, 0xe8, 0x5a, 0x98, 0xa0, 0x04, 0x6a, 0xcf, 0xa1, + 0x88, 0x69, 0xaa, 0x69, 0xbc, 0x90, 0x6e, 0x80, 0x1a, 0x00, 0x4d, 0x92, 0x35, 0xed, 0xdd, 0xe3, 0x8e, 0x59, 0xfb, 0x61, 0x77, 0xcc, 0xa1, 0x38, 0xb1, 0x9b, 0xb0, 0xb4, 0xa1, 0x6c, 0xab, 0x06, + 0x8d, 0xe9, 0xb5, 0xf3, 0x8a, 0x56, 0xa2, 0xcd, 0xf4, 0x02, 0xd9, 0x8f, 0x58, 0x90, 0x13, 0xcf, 0x42, 0x4b, 0x5e, 0x08, 0x0a, 0x29, 0xad, 0x7e, 0x08, 0xe3, 0x4c, 0x83, 0xfb, 0xb1, 0x27, 0x31, + 0x53, 0x1d, 0x87, 0xc0, 0xcb, 0xb8, 0x71, 0x5e, 0x52, 0x55, 0xed, 0x04, 0xe5, 0xa6, 0xce, 0x40, 0x18, 0xe5, 0x56, 0x2c, 0xb5, 0x31, 0x94, 0x45, 0x21, 0xb0, 0x2b, 0x20, 0xa3, 0x4b, 0x2c, 0x08, + 0xb4, 0xa8, 0x1b, 0xc6, 0x2a, 0x8d, 0x22, 0x0f, 0xba, 0x46, 0x4b, 0x81, 0x9f, 0x75, 0xf2, 0x29, 0x25, 0xb2, 0x7f, 0x39, 0x19, 0x6d, 0x3b, 0xc3, 0x53, 0x3f, 0xd9, 0x69, 0x12, 0x01, 0x8e, 0xd1, + 0xa2, 0xe0, 0xa2, 0x78, 0xc1, 0x2d, 0xd6, 0x58, 0xc2, 0x6d, 0x6e, 0x19, 0x33, 0x50, 0x0b, 0xe7, 0x65, 0x94, 0x08, 0x49, 0x05, 0x3f, 0x01, 0x4e, 0x94, 0xfb, 0x44, 0x23, 0xc5, 0x33, 0x69, 0x5f, + 0xf4, 0x24, 0x84, 0x8e, 0xfa, 0xc0, 0x9e, 0x1b, 0x64, 0xe0, 0x94, 0x51, 0x4f, 0x6f, 0x2c, 0xee, 0x1e, 0xd8, 0xe7, 0x8a, 0x76, 0xd3, 0xbf, 0x24, 0x60, 0x6c, 0x59, 0x32, 0xee, 0x54, 0x85, 0x8c, + 0x54, 0x5f, 0x38, 0x3b, 0x63, 0xd9, 0x90, 0xa4, 0x23, 0x3a, 0x93, 0x34, 0x39, 0xf5, 0x79, 0x36, 0x24, 0x7b, 0xa3, 0xa8, 0x44, 0x34, 0x7b, 0x7d, 0xdc, 0x16, 0xb5, 0xa3, 0x89, 0x97, 0x45, 0x3a, + 0x24, 0x41, 0xc4, 0x0c, 0x3d, 0x1a, 0x02, 0xc4, 0xf7, 0xf7, 0xaa, 0xf2, 0x7d, 0xd0, 0x48, 0x43, 0xba, 0x06, 0x80, 0x9a, 0xd8, 0xe9, 0x25, 0x33, 0x57, 0x04, 0x9a, 0x21, 0x3f, 0xaa, 0x38, 0xc8, + 0x15, 0x21, 0x14, 0x54, 0xbe, 0x6a, 0x3d, 0xf0, 0xf7, 0x71, 0x16, 0x41, 0xd4, 0xad, 0x21, 0xda, 0xc6, 0x32, 0x43, 0x23, 0x88, 0x06, 0x92, 0x13, 0x84, 0x77, 0xd2, 0x34, 0x65, 0xc1, 0x16, 0xf6, + 0x55, 0x0f, 0x0f, 0xef, 0xd8, 0xe8, 0xab, 0xb9, 0x8e, 0xb9, 0x64, 0x09, 0x00, 0x25, 0xea, 0x32, 0xee, 0xb2, 0x04, 0x92, 0x08, 0x2a, 0x44, 0x7e, 0xe8, 0x05, 0x91, 0x1b, 0x99, 0x00, 0xc7, 0xcb, + 0xf6, 0xb9, 0xc8, 0xf8, 0xde, 0x64, 0x9a, 0x59, 0x95, 0xd3, 0x89, 0xc1, 0x0b, 0x89, 0xad, 0x9e, 0x17, 0xf7, 0x46, 0x29, 0xb6, 0x43, 0x4c, 0x48, 0x11, 0x74, 0xde, 0x12, 0x71, 0xfa, 0xde, 0xee, + 0x5c, 0xe6, 0xbb, 0x5b, 0x79, 0xe5, 0x0d, 0x24, 0x63, 0xf1, 0x32, 0x09, 0x57, 0x92, 0xbb, 0xc7, 0x9b, 0x54, 0x76, 0xb2, 0xbf, 0xaa, 0x89, 0xcd, 0x3c, 0x9e, 0x38, 0x55, 0x5c, 0xcc, 0x6a, 0x2a, + 0x97, 0x48, 0x3a, 0xba, 0x8f, 0xbc, 0x15, 0xec, 0x2d, 0x3f, 0x76, 0x1e, 0xd7, 0x1a, 0xba, 0x62, 0x9b, 0xb8, 0x45, 0xa3, 0xc6, 0xcc, 0xdc, 0xd7, 0xe7, 0x38, 0xb7, 0x47, 0x09, 0x0a, 0xbb, 0x5b, + 0xba, 0xc0, 0x7e, 0xb7, 0x1a, 0x2c, 0x63, 0xf4, 0x3a, 0x3c, 0x7c, 0xd1, 0xd7, 0xfd, 0x86, 0xec, 0x3c, 0xba, 0x2f, 0xcf, 0x58, 0x46, 0x9f, 0x74, 0xbd, 0x51, 0x95, 0xeb, 0x7d, 0x74, 0xdb, 0x10, + 0x05, 0xc8, 0xae, 0xf9, 0xdc, 0x4d, 0x1f, 0xb2, 0x74, 0x6c, 0xdf, 0x27, 0x5f, 0x51, 0x71, 0x57, 0x25, 0x71, 0xf9, 0x49, 0xe4, 0xde, 0x6a, 0xef, 0x7c, 0x9b, 0x35, 0x0b, 0xa5, 0x8c, 0xfe, 0xe5, + 0x65, 0x2a, 0x95, 0xae, 0xa2, 0x26, 0xb2, 0x9f, 0xb1, 0x51, 0x6e, 0xca, 0xfe, 0x7d, 0x69, 0x8f, 0x61, 0x29, 0xe1, 0xcb, 0xff, 0xdf, 0x54, 0xc9, 0xd1, 0xaa, 0x24, 0x74, 0x5f, 0x3f, 0xb3, 0x29, + 0xae, 0x8c, 0xd0, 0x03, 0x28, 0xa3, 0xe5, 0x28, 0xa3, 0x52, 0xa0, 0x79, 0x37, 0x93, 0x28, 0xea, 0x28, 0x43, 0xe2, 0x50, 0x8e, 0x50, 0xfa, 0xea, 0x1b, 0x65, 0xba, 0x22, 0x55, 0x72, 0xbe, 0x84, + 0x7c, 0xa0, 0x4c, 0xa4, 0x70, 0xe5, 0x22, 0x9f, 0xd9, 0x33, 0xdd, 0xa2, 0xae, 0xbd, 0x12, 0x9f, 0x3f, 0xd2, 0x8e, 0xec, 0xa2, 0x40, 0xfb, 0xd6, 0x65, 0x60, 0xb0, 0x1a, 0x48, 0x10, 0x68, 0x0f, + 0x9f, 0xf4, 0xad, 0xf2, 0x87, 0xc0, 0x30, 0x8b, 0x40, 0x99, 0x2e, 0x4f, 0x1f, 0x12, 0xa3, 0xf2, 0x54, 0xee, 0x94, 0xb4, 0x49, 0x09, 0x1c, 0x95, 0x1e, 0x74, 0x4b, 0x09, 0x04, 0x25, 0x51, 0x74, + 0x43, 0x09, 0xee, 0x97, 0x9f, 0x97, 0x2f, 0xeb, 0x12, 0x45, 0x33, 0x5f, 0xd6, 0x93, 0x92, 0xfe, 0x50, 0x02, 0x4a, 0x01, 0xc9, 0x41, 0x23, 0xdf, 0x3e, 0xa0, 0x20, 0x8a, 0x4d, 0x7f, 0x7b, 0x80, + 0xa3, 0xd2, 0x92, 0xae, 0xbf, 0xfc, 0xc6, 0x84, 0xa2, 0xf7, 0x2f, 0x0f, 0x86, 0x26, 0x55, 0x52, 0x2c, 0x45, 0xe9, 0x14, 0x75, 0x50, 0x2c, 0x47, 0xfd, 0xcc, 0x45, 0xa4, 0x29, 0x95, 0x01, 0x7e, + 0xd1, 0xa8, 0x54, 0xfe, 0x3d, 0xe4, 0x6b, 0x8b, 0x6f, 0x4a, 0x9a, 0xb3, 0x93, 0xec, 0x2a, 0xdf, 0x59, 0xeb, 0xa7, 0xb9, 0x59, 0x9f, 0xeb, 0x35, 0x19, 0x35, 0xca, 0x9c, 0x08, 0xbb, 0xd6, 0x53, + 0x8f, 0x73, 0xfe, 0x9b, 0x7e, 0x15, 0xa5, 0x51, 0xb1, 0x0a, 0x80, 0x9a, 0x75, 0xc2, 0x1d, 0x35, 0xfa, 0x7e, 0x73, 0xf0, 0x32, 0x30, 0x37, 0x03, 0x8b, 0x14, 0x04, 0xc7, 0x71, 0xed, 0x68, 0xbc, + 0x1d, 0x93, 0x32, 0xa1, 0x53, 0x24, 0xfd, 0x1c, 0x79, 0x0e, 0x9e, 0xc1, 0x4b, 0x2e, 0x42, 0xe8, 0x2c, 0x97, 0x22, 0x4a, 0xd0, 0x67, 0x2c, 0xb7, 0xe6, 0x93, 0x71, 0x1a, 0xda, 0xc7, 0x1b, 0x0d, + 0x1c, 0x84, 0x84, 0x4d, 0x00, 0x45, 0x1a, 0x4b, 0xf6, 0x95, 0xed, 0x2d, 0x95, 0xe6, 0x62, 0x9c, 0xc8, 0x9f, 0x22, 0x26, 0x35, 0xe3, 0x43, 0xe5, 0x82, 0x64, 0xa6, 0xec, 0xf4, 0x28, 0xdc, 0x05, + 0x2b, 0xe3, 0xc6, 0x84, 0xe5, 0x88, 0xde, 0xc0, 0x4f, 0x21, 0x52, 0x4b, 0xc6, 0x18, 0xef, 0x73, 0x91, 0x5a, 0x9c, 0xd8, 0xbf, 0xdc, 0xfe, 0x6d, 0xa3, 0x7a, 0x56, 0xb0, 0x0e, 0x57, 0x2d, 0x20, + 0xa1, 0x98, 0xe1, 0x15, 0x28, 0xa2, 0x3f, 0x28, 0x75, 0x25, 0x86, 0x49, 0xe5, 0xb8, 0x72, 0x95, 0x58, 0x6d, 0xde, 0x4f, 0x24, 0xea, 0xf5, 0x61, 0xee, 0x5e, 0x9f, 0x42, 0x1b, 0x58, 0x5c, 0x36, + 0x4b, 0xac, 0x7a, 0xd7, 0x10, 0xfd, 0x30, 0x03, 0x9b, 0x76, 0x78, 0x26, 0x0a, 0x90, 0xd6, 0x0e, 0x9e, 0x67, 0xc4, 0x71, 0x14, 0x97, 0x57, 0x42, 0x6c, 0x00, 0x69, 0x5d, 0x39, 0x4f, 0x9b, 0x79, + 0x6a, 0xca, 0x2b, 0x20, 0x72, 0xac, 0xae, 0x9b, 0x0c, 0x7b, 0x53, 0x09, 0x41, 0xc0, 0x2d, 0x2f, 0xfb, 0x54, 0xa5, 0x9e, 0x5b, 0x1d, 0xe0, 0x15, 0xfe, 0x5e, 0x87, 0xd8, 0x48, 0x61, 0x0a, 0x1f, + 0xee, 0x8d, 0xb6, 0x7c, 0x0f, 0x8e, 0xdd, 0x45, 0x62, 0x1e, 0x7d, 0xc7, 0xd4, 0x9b, 0x55, 0xdc, 0xe7, 0x26, 0x95, 0x14, 0xa0, 0x48, 0x24, 0x83, 0xb4, 0xa2, 0xd7, 0xeb, 0xae, 0x13, 0x8b, 0x3c, + 0x6f, 0xa2, 0x5b, 0xce, 0x5c, 0x1c, 0x61, 0xc3, 0x07, 0xff, 0xa4, 0xa7, 0xa2, 0x93, 0x5e, 0xf1, 0x6e, 0xbf, 0xf3, 0x74, 0x41, 0x56, 0x66, 0xd9, 0xd5, 0x01, 0xc9, 0x93, 0xb7, 0xe8, 0x70, 0x1d, + 0x99, 0xc6, 0x06, 0x65, 0x85, 0xe3, 0xf0, 0xce, 0xe6, 0x34, 0x7b, 0x25, 0xe0, 0x83, 0x02, 0xda, 0xad, 0x47, 0x6b, 0x7f, 0x22, 0x05, 0x99, 0xca, 0x40, 0xa8, 0x89, 0x1b, 0x5e, 0x7a, 0x36, 0x17, + 0x41, 0x50, 0x2d, 0xc2, 0x64, 0xe5, 0x6a, 0x61, 0x67, 0x22, 0x7a, 0x60, 0x89, 0x3e, 0xe2, 0x42, 0xeb, 0x2e, 0xd9, 0x7d, 0x21, 0xfa, 0xc1, 0xfb, 0xb0, 0x13, 0x99, 0xda, 0x3b, 0x68, 0xa6, 0x72, + 0x99, 0x72, 0xdd, 0x36, 0xe9, 0x48, 0xd7, 0x02, 0x11, 0x20, 0x25, 0xba, 0x21, 0x7d, 0xdc, 0x73, 0x95, 0xd2, 0x2a, 0x3e, 0xde, 0xa1, 0x73, 0xd3, 0x51, 0x90, 0x2c, 0xa7, 0xf6, 0x2c, 0x25, 0x14, + 0xa0, 0xac, 0x33, 0x90, 0xab, 0x08, 0x09, 0x64, 0x36, 0x4e, 0xe7, 0x05, 0x61, 0x52, 0xd2, 0x5e, 0x00, 0x12, 0x4c, 0x3f, 0xe2, 0x03, 0x36, 0xad, 0xb5, 0x93, 0x6a, 0xd4, 0xb6, 0x6d, 0x9b, 0x1b, + 0xef, 0x63, 0x01, 0x68, 0x52, 0xd2, 0x87, 0x73, 0x40, 0x56, 0x3b, 0x75, 0x7c, 0x22, 0x47, 0x9e, 0x2f, 0x93, 0x51, 0x10, 0xd0, 0x7f, 0xfa, 0xc5, 0x03, 0x7d, 0xd1, 0x9e, 0x73, 0xd8, 0xa1, 0x83, + 0x5b, 0xb4, 0xb7, 0xbd, 0x1d, 0x48, 0x98, 0x07, 0x78, 0x37, 0x5e, 0x51, 0xce, 0xea, 0x59, 0x6a, 0x9e, 0xbe, 0x79, 0x6f, 0xe5, 0x52, 0xaa, 0x21, 0xab, 0xbd, 0x85, 0x64, 0xe2, 0x80, 0xe8, 0x4a, + 0x8d, 0x9d, 0x93, 0xb3, 0xdd, 0xb6, 0x5c, 0x36, 0x3f, 0xb2, 0x94, 0x8a, 0x8a, 0x51, 0xb9, 0x71, 0x49, 0x3c, 0xbd, 0xbf, 0x83, 0x39, 0xbb, 0x33, 0x6f, 0xcb, 0xef, 0xef, 0x1e, 0x7f, 0x86, 0x2f, + 0xff, 0x04, 0x4b, 0x18, 0xf6, 0xeb, 0x80, 0xef, 0x0f, 0xb7, 0x2b, 0x37, 0xe9, 0x26, 0xc2, 0x8f, 0x47, 0x67, 0x1f, 0x4b, 0x2c, 0xc2, 0x15, 0x3b, 0xc6, 0xcd, 0x17, 0xd6, 0x41, 0x29, 0xbc, 0x0e, + 0x3f, 0xe9, 0x94, 0xaa, 0x87, 0x75, 0xff, 0x1b, 0xa2, 0x00, 0x5f, 0x07, 0x06, 0x21, 0xf4, 0x77, 0x23, 0xb3, 0x83, 0xc3, 0x21, 0xed, 0x57, 0x36, 0x8e, 0x89, 0x7c, 0xc6, 0xa4, 0xe3, 0x4a, 0x13, + 0x21, 0x36, 0x85, 0x3b, 0xa1, 0x88, 0x41, 0x4f, 0xa1, 0xa6, 0xc2, 0x1f, 0x8c, 0xbb, 0x20, 0xfa, 0xfa, 0x9c, 0xc4, 0x79, 0xac, 0x79, 0xd1, 0x36, 0x90, 0x20, 0x24, 0x24, 0x71, 0x1a, 0xfd, 0x5d, + 0xf2, 0x46, 0x65, 0xd3, 0x5b, 0x75, 0xa8, 0xa7, 0x5a, 0x87, 0x90, 0xc6, 0xff, 0xa6, 0x78, 0xf3, 0xc7, 0xb5, 0x3f, 0xec, 0xe6, 0xf7, 0x9b, 0x01, 0xfe, 0xb7, 0xbb, 0xf9, 0xb1, 0x19, 0x31, 0x3c, + 0x00, 0x8e, 0x0a, 0xc5, 0xdf, 0xfe, 0x0e, 0x18, 0xca, 0x0c, 0xf9, 0x37, 0xca, 0x71, 0x14, 0x23, 0xb1, 0x61, 0x49, 0x71, 0x91, 0x47, 0xbf, 0xe7, 0xe1, 0xc4, 0xda, 0x66, 0x9a, 0x44, 0xaa, 0x66, + 0x07, 0x5c, 0xd1, 0xc0, 0xb6, 0xf5, 0xcd, 0xa0, 0x20, 0xe5, 0xd1, 0x62, 0xb6, 0xf3, 0xa9, 0x31, 0xda, 0x7a, 0x2f, 0xed, 0x0a, 0x13, 0xc4, 0x23, 0x05, 0x9c, 0x41, 0x81, 0x76, 0xf0, 0xf3, 0x91, + 0x07, 0x6f, 0x81, 0x07, 0x2f, 0x49, 0x7b, 0xd6, 0x06, 0xb3, 0xb5, 0x5a, 0x35, 0xd2, 0xa9, 0x5e, 0xc8, 0x69, 0xf1, 0x9f, 0xca, 0x2c, 0x7b, 0xf1, 0xd1, 0x93, 0x09, 0xa7, 0x17, 0x0f, 0xd3, 0x78, + 0x52, 0x88, 0xaa, 0xce, 0xea, 0x96, 0x1d, 0xe3, 0x9c, 0x77, 0x12, 0xef, 0x66, 0x39, 0x4a, 0x67, 0x36, 0x4a, 0xf6, 0x80, 0x63, 0x70, 0xe6, 0xef, 0xb5, 0xca, 0xbe, 0xe3, 0xfe, 0x8e, 0xed, 0xb5, + 0x7d, 0xad, 0xae, 0xda, 0xc8, 0xaf, 0xe9, 0x21, 0xac, 0xf2, 0x9b, 0x7c, 0x15, 0x6f, 0x31, 0x11, 0x09, 0xe2, 0xaf, 0xee, 0x0d, 0x3a, 0xf0, 0x2b, 0x02, 0xc8, 0x4f, 0xff, 0xfc, 0x6c, 0x4c, 0x51, + 0x47, 0x64, 0x4a, 0x87, 0x87, 0x3d, 0x33, 0x6f, 0x17, 0x45, 0xf4, 0xd1, 0xa1, 0xb6, 0x47, 0xcf, 0x1d, 0xd2, 0xb3, 0xc9, 0xe3, 0x66, 0x0b, 0x3b, 0x68, 0x3c, 0xcc, 0x75, 0x00, 0x53, 0x5e, 0x6d, + 0xe8, 0xde, 0x6f, 0x93, 0xee, 0x08, 0x79, 0x49, 0x57, 0x7a, 0xc4, 0xe1, 0xfc, 0x8e, 0x0b, 0xd2, 0x0e, 0xdc, 0x10, 0x59, 0x28, 0xaa, 0xe6, 0x28, 0x3c, 0x33, 0x84, 0xbe, 0x8d, 0xe3, 0xf7, 0x72, + 0x7d, 0x90, 0x1a, 0x94, 0xa2, 0x6a, 0x77, 0x7c, 0xf9, 0x28, 0x3f, 0xc5, 0x34, 0x37, 0xe1, 0x78, 0xa4, 0x34, 0x87, 0x86, 0x82, 0xa9, 0x00, 0x61, 0xd9, 0x59, 0x3e, 0xc5, 0x62, 0x4e, 0xb1, 0x40, + 0xb1, 0x36, 0xc8, 0xb3, 0xcd, 0x09, 0x82, 0xec, 0xe8, 0xff, 0x1c, 0x28, 0xbf, 0x0c, 0x92, 0x7f, 0x0a, 0x10, 0xde, 0xab, 0x19, 0x86, 0xba, 0xf1, 0x1f, 0x01, 0x62, 0x3e, 0xb4, 0x93, 0x23, 0xab, + 0xdb, 0xb7, 0xac, 0x6c, 0x25, 0x70, 0x15, 0x74, 0x02, 0x32, 0x79, 0x1d, 0x7c, 0xed, 0xfe, 0x7a, 0xd4, 0xd7, 0xbc, 0x7f, 0xea, 0xe5, 0xff, 0x37, 0x41, 0xc2, 0xd7, 0x94, 0xfb, 0xfd, 0xb5, 0x64, + 0xbf, 0xbf, 0x96, 0xbf, 0xbb, 0xa6, 0xfe, 0xa0, 0xd7, 0x6a, 0xb7, 0x7a, 0x7e, 0x63, 0xd2, 0x52, 0xf0, 0x77, 0xa6, 0xde, 0x1f, 0xd6, 0x6a, 0x9a, 0xfd, 0xa9, 0x3e, 0xc0, 0x3a, 0xf5, 0x37, 0x3f, + 0x2a, 0xe0, 0x37, 0xaa, 0x9e, 0x13, 0x7b, 0x5f, 0x49, 0x00, 0x6c, 0x2c, 0xb4, 0x5b, 0x68, 0xd3, 0x6c, 0x72, 0xa1, 0xcb, 0x6f, 0x6e, 0x6e, 0x3f, 0xec, 0xde, 0xa8, 0x53, 0xd5, 0xb2, 0xaf, 0x64, + 0x01, 0xf5, 0x4f, 0xad, 0xf7, 0x2f, 0xc7, 0x07, 0xfe, 0xb1, 0x72, 0xae, 0xc0, 0x5e, 0x21, 0x88, 0xce, 0x46, 0x43, 0x5c, 0x58, 0xfa, 0xe5, 0xdc, 0x5d, 0xcf, 0x54, 0xb1, 0x68, 0xbc, 0x59, 0xd8, + 0xe0, 0x43, 0x81, 0x0d, 0x3f, 0xa4, 0xd5, 0xbd, 0x1d, 0xd1, 0xb0, 0x2e, 0x80, 0xfd, 0x0e, 0x53, 0x69, 0x9e, 0x3d, 0x53, 0x56, 0x36, 0xf5, 0x25, 0xd5, 0x7e, 0xda, 0xe9, 0x3b, 0x5f, 0xc7, 0x15, + 0xf6, 0x32, 0x85, 0x42, 0xda, 0xfd, 0x34, 0x56, 0x43, 0x78, 0xc2, 0x7b, 0x5c, 0x55, 0x16, 0x45, 0x8f, 0x03, 0x65, 0xb0, 0x36, 0x5a, 0x19, 0x59, 0x65, 0x37, 0x92, 0xee, 0xa2, 0x3e, 0x57, 0xe3, + 0x52, 0xd7, 0xa5, 0xc9, 0xf2, 0x2c, 0x01, 0x91, 0xa4, 0xc3, 0xf1, 0x74, 0x38, 0x0a, 0x6b, 0x9c, 0x3d, 0x79, 0x2c, 0xa1, 0x73, 0xc4, 0xc6, 0x93, 0xf6, 0x3a, 0x1c, 0xa2, 0xdc, 0x1e, 0x34, 0x68, + 0xa5, 0x7f, 0x68, 0xfb, 0x94, 0x1e, 0x74, 0xbc, 0x85, 0x3b, 0xee, 0x3b, 0x9c, 0xf6, 0xf0, 0x2c, 0xfb, 0x21, 0xcc, 0x86, 0x9d, 0xa4, 0xef, 0x3d, 0xeb, 0x62, 0x2f, 0xbe, 0xa6, 0xa3, 0x15, 0x73, + 0x1e, 0x08, 0x4a, 0xd3, 0x08, 0x3f, 0x70, 0x9d, 0x15, 0xd9, 0x8c, 0x11, 0x6b, 0xd2, 0xf5, 0xec, 0x62, 0x74, 0x29, 0x4f, 0x18, 0xa8, 0xc8, 0x48, 0xac, 0xf1, 0xd6, 0x16, 0xfe, 0xfc, 0x98, 0xbd, + 0x82, 0x46, 0x24, 0xc1, 0x14, 0x39, 0xf8, 0x88, 0x1e, 0x2a, 0x54, 0xf7, 0xcc, 0x89, 0x85, 0x90, 0x9d, 0xce, 0xee, 0x81, 0x05, 0x76, 0x17, 0x04, 0x0f, 0xfc, 0x4d, 0x01, 0xa1, 0x71, 0xaa, 0x3b, + 0xeb, 0x39, 0x94, 0x3f, 0x05, 0xe9, 0xf0, 0xde, 0x09, 0x0b, 0x3e, 0x70, 0xf9, 0x86, 0x5f, 0xf0, 0x8b, 0x49, 0xd4, 0x4c, 0x2c, 0xda, 0xc9, 0xfd, 0xd8, 0x91, 0xa6, 0xbf, 0xe6, 0xd9, 0xd1, 0xab, + 0x83, 0x49, 0xe5, 0xf6, 0x18, 0x91, 0x8c, 0x89, 0x56, 0x7d, 0x8d, 0x52, 0x7e, 0x36, 0x5c, 0x61, 0x30, 0x52, 0x84, 0x0e, 0x5e, 0x10, 0xd0, 0x28, 0xf2, 0x7c, 0x2a, 0x0e, 0x16, 0xe9, 0xf3, 0x28, + 0x94, 0xb3, 0xc4, 0xc6, 0xf5, 0x2a, 0x13, 0xbd, 0x8b, 0xbd, 0x74, 0x6c, 0x42, 0xa5, 0xaa, 0x61, 0x52, 0xf2, 0xbd, 0x7d, 0x88, 0x46, 0x7f, 0x10, 0x0e, 0xf8, 0xac, 0x98, 0xca, 0xee, 0x9f, 0x9d, + 0xdb, 0x8c, 0xfc, 0x73, 0x3a, 0xc4, 0xf0, 0x80, 0x9e, 0x99, 0xf9, 0xa0, 0x20, 0xae, 0xc3, 0x4c, 0x04, 0xa0, 0x02, 0xe3, 0x4d, 0xb7, 0x55, 0x07, 0xdd, 0x7b, 0xfa, 0x28, 0x2d, 0x81, 0x83, 0xfd, + 0xf7, 0xe5, 0x5a, 0xe2, 0xc6, 0x73, 0x98, 0x50, 0xbd, 0x06, 0x4d, 0x97, 0xb1, 0x0b, 0x6e, 0xdf, 0x4c, 0xff, 0x20, 0xc6, 0x8d, 0x28, 0x28, 0x24, 0x9b, 0x7c, 0x7b, 0x69, 0xc3, 0xd1, 0x88, 0xdc, + 0xb3, 0xed, 0x0c, 0x26, 0xab, 0xde, 0x61, 0xa4, 0x8d, 0xc2, 0xbe, 0x01, 0x20, 0x69, 0xe9, 0xdb, 0xea, 0x43, 0xe8, 0x80, 0x49, 0x7e, 0x49, 0x45, 0x4c, 0xc1, 0xf1, 0x48, 0x8a, 0x5b, 0x4b, 0x51, + 0xcc, 0xb8, 0xd3, 0x1a, 0x64, 0x47, 0x70, 0x26, 0x36, 0x7a, 0xa4, 0x83, 0xf2, 0xbc, 0x82, 0x80, 0x0b, 0xdc, 0x41, 0x88, 0x84, 0xde, 0x9f, 0xb7, 0x6e, 0xba, 0xd3, 0x74, 0x53, 0xa3, 0x57, 0x3e, + 0xcc, 0x53, 0x8d, 0x8d, 0x7e, 0x03, 0x60, 0x2b, 0xd5, 0x1e, 0x22, 0x1f, 0xac, 0x76, 0xd0, 0xbc, 0x73, 0xac, 0x0d, 0x62, 0xd0, 0x7a, 0xd5, 0x47, 0xc0, 0xc0, 0x23, 0x7b, 0xc6, 0xbe, 0x80, 0x57, + 0x76, 0x8e, 0x96, 0xae, 0xf8, 0x64, 0x2d, 0x86, 0x1b, 0x45, 0x5f, 0x0f, 0xec, 0xcd, 0xe1, 0x04, 0x06, 0x01, 0xdf, 0x9d, 0xad, 0x09, 0x77, 0x07, 0xaa, 0xf7, 0xb4, 0xeb, 0xdd, 0xa1, 0x7a, 0x3a, + 0x40, 0x16, 0x76, 0x96, 0x75, 0x46, 0x47, 0x2d, 0x61, 0x65, 0x13, 0x82, 0x67, 0xc0, 0x74, 0xa3, 0xf0, 0x4e, 0xbb, 0xee, 0x14, 0xf1, 0x4e, 0xc9, 0xe0, 0x0f, 0x95, 0xf3, 0x3f, 0x6a, 0xfb, 0xba, + 0x61, 0x4f, 0xd7, 0x44, 0xe0, 0x73, 0x26, 0x5c, 0xe9, 0x90, 0x15, 0x96, 0xc0, 0x92, 0xc6, 0x8b, 0x30, 0xdf, 0x48, 0xf5, 0x57, 0xad, 0xf7, 0xff, 0xa2, 0x9b, 0x0e, 0x50, 0x25, 0x47, 0xbd, 0x93, + 0xc9, 0xb6, 0xe3, 0x7c, 0x25, 0x0c, 0xfe, 0x38, 0x1e, 0x76, 0x40, 0xc8, 0x8f, 0x51, 0xce, 0xbc, 0xb9, 0xaf, 0x9d, 0x07, 0xf6, 0x19, 0x1b, 0xb2, 0x1e, 0x67, 0x77, 0x96, 0xcc, 0x9c, 0x9e, 0x0a, + 0x47, 0x9b, 0xde, 0xc8, 0x76, 0xa4, 0x1a, 0xac, 0x94, 0x66, 0xb3, 0xbf, 0x12, 0x31, 0x79, 0xcb, 0xd4, 0x82, 0x71, 0x1f, 0x3f, 0x03, 0xfa, 0x93, 0x5b, 0x41, 0xb1, 0x6d, 0x9e, 0x3a, 0x5b, 0x92, + 0xd9, 0xb3, 0xf4, 0x88, 0xae, 0x5d, 0xfa, 0xe8, 0x70, 0xdf, 0xce, 0x63, 0x3d, 0xc6, 0x03, 0x8e, 0x29, 0x88, 0x08, 0x82, 0xc0, 0x71, 0x3b, 0x9c, 0xcb, 0x84, 0x1b, 0xd1, 0x2f, 0x06, 0x7c, 0x2c, + 0xfa, 0xa9, 0x90, 0x8d, 0x12, 0xc0, 0x75, 0xf2, 0xc9, 0xd0, 0x17, 0x0f, 0x13, 0x95, 0x5a, 0xcf, 0x40, 0xdd, 0x66, 0x08, 0xe2, 0x35, 0xdc, 0x63, 0x3e, 0x6d, 0x11, 0xf2, 0x17, 0x42, 0x9c, 0xa8, + 0x97, 0x7e, 0xee, 0xd9, 0x84, 0x5b, 0xc8, 0xc9, 0xe8, 0xb4, 0x76, 0xd9, 0x4f, 0x9c, 0x45, 0xb0, 0x09, 0x93, 0x21, 0x82, 0x5f, 0xb8, 0xcf, 0xae, 0xbe, 0xe3, 0x19, 0x63, 0xde, 0x41, 0xa5, 0x9d, + 0xce, 0x7b, 0x49, 0x3e, 0xdd, 0xeb, 0x9c, 0x18, 0xcc, 0x60, 0x51, 0x80, 0x88, 0x53, 0x3f, 0x4e, 0x8a, 0x64, 0xf2, 0x39, 0xa2, 0x07, 0xdd, 0xf3, 0x7a, 0x98, 0x94, 0xb5, 0x48, 0x7b, 0xa6, 0x08, + 0x27, 0x8c, 0x8a, 0xdb, 0xc4, 0xc4, 0xde, 0x2e, 0x55, 0xbb, 0xc3, 0xba, 0xe2, 0xbb, 0x54, 0xde, 0x39, 0x6d, 0xad, 0xd6, 0xb5, 0x52, 0xde, 0xd6, 0x2b, 0xef, 0x8e, 0xf9, 0x44, 0x87, 0x5e, 0xde, + 0xc3, 0x45, 0x2c, 0xa2, 0xdc, 0x03, 0x27, 0x2b, 0xea, 0xc8, 0xed, 0xb4, 0xb2, 0xa9, 0x95, 0x72, 0xb0, 0x9e, 0x9d, 0xee, 0x50, 0xc2, 0xb5, 0x16, 0x19, 0xa7, 0xd8, 0x36, 0xe1, 0x45, 0x0c, 0x95, + 0x8b, 0xfb, 0x12, 0xb0, 0xc5, 0x23, 0xf7, 0x91, 0x5c, 0x4c, 0xdf, 0x72, 0xe1, 0xd7, 0x47, 0x50, 0x93, 0xd1, 0xaa, 0x5f, 0x1f, 0xd8, 0xb4, 0x0e, 0xcf, 0x59, 0xd4, 0x01, 0xc3, 0x50, 0xbf, 0x04, + 0xaa, 0x94, 0xe3, 0xf5, 0x83, 0x7b, 0x42, 0x37, 0x29, 0xa3, 0x7d, 0x31, 0x4b, 0x44, 0x25, 0x45, 0xf5, 0x42, 0xea, 0x41, 0xf8, 0xb1, 0x76, 0x71, 0x09, 0x2e, 0x1d, 0xc5, 0x71, 0xb9, 0xcb, 0x02, + 0x87, 0x36, 0x8d, 0x22, 0x8c, 0xe5, 0xc9, 0x41, 0x2b, 0x64, 0x54, 0x66, 0x28, 0x1d, 0xce, 0x97, 0x94, 0xa9, 0x71, 0xa3, 0x04, 0x43, 0x39, 0xdd, 0x1b, 0x0a, 0x2c, 0x5c, 0x42, 0x26, 0x24, 0x5c, + 0xb8, 0xad, 0x07, 0x87, 0x3b, 0x13, 0x0c, 0xe2, 0x1d, 0xe8, 0x06, 0xd4, 0x3e, 0x09, 0xa4, 0xec, 0x4e, 0xd6, 0xa8, 0x5e, 0x25, 0x1a, 0xb4, 0x2f, 0x7e, 0x7d, 0x87, 0x8c, 0x36, 0x71, 0x79, 0x70, + 0xde, 0x06, 0x3a, 0xc6, 0xd9, 0x3b, 0x9e, 0xc9, 0xee, 0x8d, 0xd9, 0x68, 0xa1, 0xd1, 0xee, 0xbe, 0x8d, 0x4a, 0xff, 0xf6, 0x81, 0xfe, 0x2a, 0xea, 0xa9, 0xd7, 0xc8, 0x07, 0x3d, 0xd4, 0x51, 0xbf, + 0xbc, 0x26, 0xc4, 0x3f, 0xd4, 0x92, 0x57, 0x78, 0x07, 0x25, 0x87, 0x86, 0x50, 0xdf, 0xb7, 0x5f, 0x9d, 0x6b, 0xdb, 0x73, 0xb5, 0x7b, 0xdc, 0x41, 0xb8, 0xf1, 0xb3, 0x1e, 0xf5, 0x0d, 0x6c, 0x38, + 0x15, 0xf4, 0xd2, 0x38, 0xe3, 0xd3, 0x95, 0xa8, 0x36, 0x0a, 0x71, 0xb0, 0xad, 0x52, 0x0a, 0xd8, 0xcd, 0xb1, 0xbc, 0x87, 0x4d, 0x29, 0x5d, 0xf2, 0x14, 0xa6, 0x3e, 0x0b, 0xc4, 0xf5, 0xc5, 0xa8, + 0x2e, 0xc5, 0x3a, 0x19, 0x85, 0x3e, 0xcf, 0x97, 0xc7, 0x13, 0xfb, 0xc7, 0x23, 0x11, 0x72, 0xcf, 0xfb, 0x85, 0x3e, 0x03, 0x6f, 0xe1, 0x2f, 0xfc, 0x8d, 0x54, 0x33, 0x0a, 0xdd, 0x76, 0x32, 0x14, + 0xd5, 0x7a, 0x77, 0x99, 0x78, 0x96, 0x9f, 0xee, 0x21, 0x02, 0xed, 0x73, 0xf9, 0xdb, 0xca, 0xb9, 0x64, 0x5b, 0xc2, 0xb7, 0x74, 0x1c, 0xfc, 0xd1, 0x31, 0xf2, 0x9f, 0xb2, 0x31, 0x23, 0x7c, 0x81, + 0xab, 0xf1, 0x0f, 0x3d, 0x1a, 0xd3, 0xcc, 0xde, 0x19, 0x14, 0x28, 0xd3, 0x6b, 0xca, 0xa9, 0xc3, 0x3e, 0x17, 0xdc, 0x7e, 0x88, 0xee, 0x9f, 0x6b, 0xe3, 0xc6, 0xaf, 0x2c, 0x99, 0x46, 0x95, 0x49, + 0xbf, 0xd3, 0xd4, 0x4b, 0xdb, 0xc7, 0xa0, 0x28, 0x90, 0xb7, 0x28, 0x30, 0x4b, 0x17, 0xf1, 0xea, 0x2c, 0xf8, 0x4a, 0x32, 0x2f, 0xdd, 0xce, 0xbb, 0x23, 0x9f, 0xbf, 0x42, 0xa4, 0x2c, 0xad, 0xa7, + 0xbc, 0x67, 0x01, 0x75, 0xf2, 0x0e, 0xe5, 0xfc, 0xc8, 0xca, 0x5c, 0xeb, 0x00, 0x6e, 0x93, 0x7e, 0x4f, 0x86, 0xe1, 0x6f, 0x1e, 0x92, 0xdf, 0xc4, 0x18, 0x59, 0xf3, 0x9b, 0xb8, 0x06, 0xfb, 0x9b, + 0x35, 0xc3, 0x97, 0x35, 0x27, 0x3d, 0xb5, 0xfa, 0xdb, 0x9a, 0xca, 0x11, 0x3f, 0x59, 0x48, 0x7a, 0x0e, 0xa0, 0xda, 0xcd, 0x21, 0x7f, 0x57, 0xc9, 0xb9, 0x68, 0x39, 0xe9, 0xad, 0x36, 0xed, 0xb0, + 0x36, 0x63, 0xbe, 0x4f, 0xef, 0xb6, 0x50, 0x6e, 0xff, 0xa1, 0xdc, 0x2d, 0xa6, 0x1d, 0x09, 0xa7, 0x2c, 0xe7, 0xa9, 0xb4, 0xfa, 0x3d, 0x4b, 0xab, 0xb6, 0xa7, 0xd9, 0x80, 0xf5, 0x1d, 0xbf, 0xf2, + 0xe5, 0xf5, 0x05, 0xbf, 0xfe, 0x1d, 0x7c, 0xbd, 0xa3, 0xdd, 0xeb, 0x51, 0x86, 0x65, 0xb6, 0x43, 0xb6, 0x77, 0xd5, 0xb7, 0x6b, 0x2c, 0xbd, 0x9f, 0xf9, 0xf2, 0xec, 0x52, 0x9e, 0xb5, 0x20, 0x11, + 0x58, 0xd7, 0xc3, 0x7f, 0xc0, 0x93, 0xc2, 0x6b, 0x7b, 0x95, 0xfa, 0x2c, 0xb7, 0x35, 0xbe, 0xc7, 0x85, 0x9d, 0x8e, 0x97, 0x49, 0x41, 0x5e, 0x83, 0x2f, 0xbe, 0x6d, 0xec, 0x4c, 0xdd, 0x0b, 0xa5, + 0x8c, 0x52, 0x1c, 0xa4, 0x50, 0x97, 0xf6, 0xc0, 0xca, 0xca, 0x77, 0xdc, 0xbd, 0x3a, 0x4a, 0x2c, 0x5e, 0x54, 0xcb, 0x93, 0xd2, 0x5a, 0xbe, 0x93, 0x71, 0x4c, 0x80, 0x8c, 0x04, 0x8f, 0x47, 0x23, + 0x2e, 0x7a, 0x76, 0xc2, 0x57, 0x57, 0x8a, 0x2c, 0x0d, 0x4e, 0x7f, 0x29, 0xfe, 0x65, 0xfe, 0xe5, 0x84, 0xe1, 0x1f, 0x65, 0x79, 0x0b, 0xee, 0xed, 0xcf, 0x2b, 0xa6, 0xd8, 0xec, 0x8e, 0x37, 0x7b, + 0x95, 0xd7, 0x2a, 0xb9, 0x56, 0x78, 0x7b, 0x69, 0x98, 0xfb, 0x97, 0xf0, 0x35, 0x7f, 0xb6, 0xba, 0xd5, 0x32, 0xdc, 0xd1, 0xd8, 0xa2, 0xf5, 0x59, 0x79, 0x20, 0x35, 0xc8, 0xb0, 0xcb, 0x5e, 0x10, + 0x18, 0x3b, 0xb6, 0x17, 0x87, 0xa5, 0x12, 0x38, 0xbe, 0xa6, 0x9c, 0xf4, 0x00, 0xd3, 0x05, 0x65, 0x67, 0xfe, 0xaa, 0xa0, 0x7d, 0x66, 0xc6, 0x3b, 0x57, 0x61, 0x70, 0x27, 0x3d, 0x89, 0x2f, 0xf0, + 0xb5, 0x02, 0xbd, 0x67, 0xa2, 0x39, 0x52, 0x14, 0xcf, 0x25, 0x73, 0xdd, 0x1b, 0x2f, 0x43, 0xbd, 0x86, 0x3b, 0x18, 0xe0, 0xe2, 0x9e, 0x85, 0x31, 0x1d, 0x0b, 0x83, 0x95, 0xa9, 0x7a, 0x2b, 0xd3, + 0x1f, 0x33, 0x0c, 0x4e, 0x28, 0x15, 0xeb, 0xb9, 0x6a, 0x9b, 0x0f, 0x24, 0x81, 0xd7, 0x84, 0x2f, 0x94, 0xfe, 0x6f, 0x1b, 0x4d, 0x95, 0xf1, 0x96, 0x7e, 0xf4, 0x97, 0xfe, 0xdf, 0xbf, 0x84, 0x5f, + 0xf5, 0x97, 0xfe, 0x29, 0x74, 0xf8, 0xf8, 0x0b, 0x90, 0x85, 0x7f, 0x48, 0x2d, 0x9a, 0x4a, 0x86, 0x2c, 0x77, 0xf7, 0x0e, 0xda, 0x37, 0xcf, 0xe2, 0x0a, 0xab, 0x65, 0xdd, 0x98, 0x87, 0xec, 0x2f, + 0xb9, 0x26, 0xc6, 0xcf, 0x5c, 0x13, 0xd7, 0xbb, 0xb9, 0x5a, 0x65, 0xb8, 0xef, 0xad, 0xa5, 0xd8, 0x44, 0x3e, 0x70, 0xd2, 0x65, 0x43, 0x86, 0x70, 0xa5, 0x27, 0x7c, 0x65, 0x6f, 0xee, 0xc9, 0x6f, + 0x10, 0x52, 0xfa, 0x7e, 0xc7, 0xba, 0xa9, 0xe8, 0x07, 0xe7, 0xb4, 0xf9, 0x8c, 0x2e, 0xb7, 0xca, 0x7f, 0x20, 0x61, 0x28, 0x36, 0x2d, 0xaa, 0xbf, 0x29, 0xa2, 0xeb, 0x0e, 0x75, 0xa9, 0xb5, 0x74, + 0xe8, 0x5f, 0xe5, 0x9c, 0xac, 0xdf, 0x04, 0xd1, 0xb9, 0x4b, 0xbd, 0xb9, 0x53, 0x73, 0x7e, 0x13, 0x44, 0xff, 0x29, 0x7c, 0x00, 0xaa, 0xb5, 0x02, 0xd5, 0x56, 0x0f, 0xc9, 0xfc, 0xae, 0x88, 0x3e, + 0xb2, 0xb1, 0xe8, 0x6d, 0x11, 0xf2, 0x79, 0x86, 0x36, 0xed, 0x46, 0xfe, 0xd9, 0x86, 0x08, 0xb9, 0x4a, 0x9c, 0xb6, 0x2b, 0xd5, 0xf1, 0xdd, 0xaa, 0x38, 0x51, 0xe9, 0xe6, 0x7b, 0x5f, 0xcb, 0xb6, + 0x85, 0xd6, 0xb4, 0xa1, 0xa6, 0x04, 0x7e, 0xd7, 0xcc, 0x5a, 0x25, 0x2e, 0x3d, 0xff, 0x1b, 0xcd, 0x1a, 0x92, 0xc6, 0x40, 0xb7, 0x57, 0x2f, 0x56, 0x34, 0x9a, 0xdd, 0xd2, 0x20, 0x60, 0x20, 0xcd, + 0x63, 0xd2, 0x98, 0xcd, 0x26, 0x2b, 0xe4, 0xf9, 0xf4, 0xc4, 0x68, 0xb7, 0x08, 0xec, 0x6e, 0x38, 0xb1, 0x1b, 0x0f, 0x49, 0x93, 0x63, 0xeb, 0x29, 0xf7, 0x5e, 0x61, 0xb7, 0xb8, 0xfc, 0xf4, 0xc4, + 0x4a, 0xf8, 0x10, 0x42, 0x8e, 0xdf, 0x0c, 0x3f, 0xec, 0x8d, 0xe5, 0xec, 0xe8, 0x13, 0x43, 0xd7, 0x63, 0xf7, 0xd2, 0xf2, 0x69, 0x9c, 0x8f, 0x06, 0x38, 0xe4, 0xeb, 0xc6, 0xc4, 0x2c, 0x1d, 0xb8, + 0xe4, 0x91, 0x81, 0x43, 0x3c, 0xb0, 0xf5, 0xf4, 0x8a, 0xc6, 0xeb, 0x59, 0x6d, 0x64, 0xcb, 0xa7, 0xf8, 0xb6, 0x9d, 0x18, 0x06, 0x93, 0xa4, 0xd9, 0x99, 0x58, 0x5e, 0x85, 0x08, 0x79, 0x39, 0x07, + 0x6c, 0x3f, 0xf0, 0x36, 0x2a, 0xad, 0x68, 0x42, 0x02, 0x2d, 0x8b, 0x60, 0x2a, 0x64, 0xcb, 0x19, 0xb4, 0x39, 0x20, 0x0c, 0x0f, 0x4d, 0x6c, 0x49, 0xe2, 0x83, 0x45, 0xb9, 0x19, 0x83, 0xf3, 0xe7, + 0x31, 0xa3, 0x41, 0xc1, 0x6d, 0x15, 0xe5, 0x3e, 0x1c, 0xe6, 0xfd, 0x42, 0x3e, 0xc4, 0xf4, 0xf4, 0x64, 0x21, 0x62, 0xfb, 0xdb, 0x5c, 0x5e, 0x51, 0x5f, 0x5e, 0xf7, 0x22, 0xe6, 0x41, 0x24, 0xdf, + 0x14, 0xf9, 0x56, 0x37, 0x11, 0x73, 0xc5, 0x85, 0x2e, 0x0a, 0x55, 0x5b, 0x28, 0x40, 0x90, 0x23, 0x75, 0x08, 0x79, 0xe5, 0x69, 0x5a, 0xab, 0x8b, 0xab, 0x24, 0x48, 0xe5, 0x0b, 0xac, 0xba, 0xcf, + 0x72, 0xdb, 0x9b, 0xd6, 0x2c, 0xa3, 0xb7, 0xa4, 0xd8, 0x66, 0x3d, 0xd5, 0x08, 0x6f, 0x2c, 0x79, 0xd8, 0x96, 0xb6, 0xc0, 0x4a, 0xe9, 0x28, 0x9b, 0x4f, 0x4a, 0x37, 0xca, 0xfb, 0x71, 0x99, 0x6d, + 0x16, 0x23, 0xc8, 0x3c, 0x72, 0x51, 0x91, 0x01, 0x1f, 0xbb, 0x22, 0x54, 0xee, 0x9a, 0x51, 0xe2, 0x7d, 0x5a, 0xae, 0x25, 0x8a, 0x0f, 0xe6, 0xcd, 0x97, 0xb9, 0x0f, 0x55, 0x9c, 0xe1, 0x12, 0xec, + 0x3a, 0x05, 0x2f, 0xd7, 0xd9, 0xae, 0x84, 0xc9, 0xaf, 0xdd, 0x9c, 0x8e, 0x03, 0x9e, 0x41, 0x8b, 0xe3, 0x82, 0x72, 0xfc, 0xc4, 0xd7, 0x98, 0x06, 0x8e, 0xf3, 0xd4, 0x5d, 0xf5, 0xc9, 0x31, 0x83, + 0x3f, 0xd5, 0x00, 0x5c, 0xeb, 0x81, 0x73, 0xf1, 0xb5, 0xd8, 0x6e, 0x06, 0x92, 0xf2, 0xb9, 0x15, 0xf0, 0x4f, 0x16, 0xe5, 0xb3, 0xe0, 0x12, 0xe2, 0x39, 0x34, 0xd4, 0x47, 0xfb, 0xf2, 0x6b, 0x5b, + 0x2b, 0x84, 0x1b, 0xa6, 0xe7, 0x8b, 0x86, 0xa3, 0x76, 0x7c, 0x93, 0x23, 0xf8, 0x9a, 0xce, 0xfa, 0x99, 0xa6, 0x0c, 0x22, 0x3a, 0xe2, 0xa2, 0x5f, 0xec, 0x7c, 0x3d, 0xde, 0x28, 0x40, 0xc6, 0xb8, + 0xbd, 0xec, 0xc5, 0xe7, 0xc3, 0xed, 0xd7, 0xb0, 0xbf, 0x9d, 0xae, 0x7a, 0xe7, 0xd0, 0x69, 0xed, 0x5a, 0x6b, 0x93, 0x22, 0x8c, 0x45, 0x7c, 0xd2, 0xde, 0x93, 0xca, 0x13, 0xc9, 0x73, 0xad, 0x70, + 0x2b, 0x5a, 0x2c, 0x78, 0x6c, 0x89, 0x03, 0xb5, 0x3a, 0x28, 0x89, 0x40, 0xff, 0x99, 0xc2, 0xe3, 0x4d, 0xad, 0x22, 0xd2, 0x2e, 0x1a, 0x04, 0x02, 0x5e, 0xf7, 0xf8, 0x3c, 0x8a, 0xa4, 0xe1, 0x9a, + 0x9a, 0xa4, 0x7b, 0xc2, 0xf6, 0x5e, 0xf1, 0x28, 0x41, 0x64, 0x42, 0x11, 0x46, 0x99, 0xda, 0x43, 0xbd, 0x82, 0xf9, 0xb1, 0x38, 0x1b, 0xd1, 0x29, 0x4f, 0xbf, 0x7b, 0x97, 0x6a, 0x0c, 0xc6, 0x3a, + 0xd7, 0xe5, 0x1d, 0x31, 0xcb, 0x21, 0x46, 0x49, 0x32, 0x77, 0x5f, 0xe3, 0x76, 0x32, 0x10, 0x54, 0xd3, 0x3c, 0x40, 0xe4, 0xf7, 0x93, 0xa2, 0xc5, 0x22, 0x2a, 0xea, 0xf4, 0x0d, 0x69, 0xde, 0x7e, + 0xc6, 0xc1, 0x49, 0x81, 0x9e, 0x22, 0x08, 0xdc, 0xd4, 0xbf, 0x05, 0x70, 0x0b, 0xf1, 0x62, 0x91, 0xc0, 0x22, 0x7f, 0x11, 0xca, 0x69, 0x3e, 0xb0, 0x21, 0xc8, 0x5c, 0xe1, 0xf1, 0xb4, 0x73, 0xe8, + 0xbb, 0x66, 0xcd, 0x8f, 0x86, 0xe2, 0x3f, 0x4a, 0x2d, 0x12, 0x7d, 0x1a, 0x3c, 0x5a, 0x7c, 0x00, 0xf7, 0x90, 0x4c, 0x33, 0x6f, 0xd8, 0x96, 0x56, 0x60, 0xd9, 0x3a, 0x9c, 0x5f, 0xd4, 0x9f, 0x1a, + 0x8a, 0xc0, 0xb7, 0x8e, 0xe2, 0x5f, 0xe9, 0xd0, 0xd0, 0xa6, 0x5b, 0xd0, 0xf0, 0x53, 0xa4, 0x38, 0x14, 0x7c, 0x4c, 0x59, 0x66, 0x9d, 0xc3, 0xb2, 0xe5, 0x35, 0x5e, 0x8d, 0x10, 0x4e, 0xc2, 0x27, + 0xec, 0x18, 0xfa, 0xe7, 0xe0, 0x3a, 0xfb, 0xbd, 0x9c, 0xb4, 0x58, 0x01, 0xaf, 0x5b, 0x7b, 0x8f, 0x95, 0x9a, 0xb1, 0x25, 0x2c, 0x22, 0x6c, 0x21, 0x26, 0x38, 0x01, 0x15, 0xd0, 0x83, 0x8e, 0x6f, + 0xcf, 0xc0, 0x83, 0x77, 0xab, 0xe6, 0x32, 0x8a, 0x81, 0x99, 0xde, 0xd2, 0x9f, 0xc4, 0x14, 0x9f, 0x46, 0x7c, 0xf1, 0xee, 0x67, 0x8b, 0xbd, 0x7c, 0xdf, 0x85, 0x6b, 0x9b, 0x52, 0x9b, 0xc3, 0x02, + 0xc6, 0x83, 0xf6, 0xd9, 0xb0, 0x5b, 0x60, 0x95, 0xd3, 0xdb, 0xd7, 0xfc, 0x25, 0x8f, 0x7b, 0x35, 0x00, 0x3b, 0xfe, 0xd1, 0x2a, 0x7c, 0x5d, 0x54, 0x16, 0xaf, 0x2f, 0x38, 0x6b, 0x15, 0xa6, 0xbb, + 0xc8, 0x2f, 0x94, 0x90, 0xef, 0xba, 0x89, 0x50, 0xba, 0x2e, 0x17, 0x9c, 0xbf, 0xe3, 0x68, 0x71, 0xa0, 0xd1, 0xa0, 0x7d, 0xc1, 0x51, 0x47, 0xbf, 0xf3, 0x6d, 0xda, 0xcd, 0x04, 0x7b, 0xda, 0x38, + 0xe0, 0x38, 0xd1, 0x7e, 0xb0, 0x08, 0xab, 0x19, 0x9b, 0x3e, 0x8b, 0x54, 0x63, 0x67, 0xc3, 0x57, 0x0b, 0xe7, 0x86, 0xdc, 0x2e, 0xea, 0x86, 0x1d, 0x06, 0x2c, 0xa0, 0x07, 0x4d, 0x3a, 0x69, 0x70, + 0x47, 0x43, 0x54, 0x77, 0x6c, 0x5b, 0xa5, 0x5d, 0xb5, 0xd4, 0x9c, 0x5e, 0xe0, 0xb1, 0xe4, 0x83, 0x5e, 0x3a, 0x24, 0x63, 0x81, 0x28, 0x6d, 0x0b, 0xbd, 0x4c, 0x40, 0xd6, 0x68, 0x6a, 0xd1, 0x68, + 0x98, 0x91, 0x70, 0x32, 0xd6, 0x51, 0x09, 0x46, 0x30, 0x82, 0x13, 0x69, 0x41, 0x78, 0xde, 0x65, 0xa5, 0xbc, 0xf3, 0x74, 0x88, 0x23, 0x2a, 0xd7, 0xc1, 0x1e, 0x6a, 0xa2, 0x95, 0xf1, 0x1f, 0x5e, + 0xe7, 0x6f, 0x3c, 0x62, 0xb4, 0xe2, 0x0a, 0x0e, 0x20, 0x94, 0xb7, 0xfb, 0x83, 0xeb, 0xe8, 0xd0, 0x69, 0x16, 0x95, 0xd9, 0x01, 0xec, 0xa8, 0xfe, 0x3f, 0x73, 0xff, 0xb1, 0xfc, 0x36, 0xb6, 0x64, + 0x8b, 0xc3, 0x73, 0x3c, 0x45, 0xcf, 0x19, 0x37, 0x00, 0xc2, 0x63, 0x08, 0xef, 0xbd, 0xe7, 0x0c, 0xde, 0x10, 0x8e, 0xf0, 0xc0, 0xd3, 0x7f, 0x21, 0x55, 0x49, 0x47, 0xa5, 0xd2, 0xa9, 0xaa, 0xee, + 0xd3, 0xf7, 0x7e, 0xff, 0x99, 0xb4, 0xc9, 0x20, 0x77, 0xfc, 0x88, 0xcc, 0x95, 0xb9, 0xf7, 0xca, 0xb5, 0x5e, 0x1f, 0xfa, 0x2c, 0x94, 0x91, 0x11, 0x9e, 0x56, 0x3d, 0x6a, 0x58, 0x62, 0xcd, 0x9b, + 0xa2, 0x4a, 0xca, 0x11, 0x72, 0x8c, 0xb1, 0x9b, 0x72, 0x09, 0x6f, 0x64, 0x05, 0x45, 0x98, 0xcc, 0xf9, 0x51, 0x77, 0x4c, 0x2b, 0xa8, 0x51, 0xaf, 0xce, 0x28, 0xb2, 0xa7, 0xb9, 0x0b, 0x45, 0x69, + 0x43, 0xd8, 0xac, 0x35, 0x4b, 0xfc, 0x10, 0xa7, 0x1b, 0x68, 0xb5, 0x59, 0x30, 0x0a, 0x12, 0x4b, 0xde, 0x7c, 0x71, 0x23, 0xe2, 0x38, 0xce, 0xaa, 0xc8, 0x3c, 0x17, 0xfc, 0x2a, 0xa4, 0xdd, 0x82, + 0x7d, 0xbe, 0xe2, 0xb3, 0xcb, 0x91, 0xd8, 0xc0, 0x6b, 0x85, 0x21, 0x19, 0x9c, 0x94, 0xe7, 0x83, 0x27, 0x3e, 0xb3, 0x25, 0x64, 0xc6, 0x4f, 0xf0, 0x8d, 0x97, 0x0d, 0x79, 0xcc, 0xef, 0x77, 0x90, + 0xa6, 0x4d, 0x50, 0x01, 0xb5, 0x9f, 0x1a, 0x50, 0xf2, 0x39, 0xf2, 0x3e, 0xf1, 0x72, 0x2c, 0x79, 0x54, 0x04, 0x8a, 0xae, 0x8d, 0x63, 0x2a, 0xd5, 0xae, 0x13, 0xd1, 0x14, 0x8a, 0x1b, 0x37, 0x85, + 0xcb, 0xeb, 0x3d, 0xfb, 0x27, 0x4e, 0xf3, 0x35, 0xaf, 0x11, 0x1d, 0xbd, 0x9d, 0xfa, 0x63, 0xaf, 0x03, 0x74, 0x88, 0x43, 0xc6, 0x6d, 0xa6, 0x08, 0x59, 0xfd, 0x97, 0x4d, 0xcd, 0x29, 0x70, 0x75, + 0xab, 0x54, 0x8f, 0xba, 0x66, 0x11, 0xb1, 0x91, 0x0f, 0xf5, 0x5d, 0xb8, 0x4a, 0xb1, 0xc4, 0x74, 0x79, 0x13, 0x84, 0x63, 0x3d, 0x63, 0xbb, 0x67, 0xb7, 0xa0, 0xc6, 0xf9, 0x72, 0x08, 0x6d, 0x3f, + 0xe6, 0xde, 0xcb, 0x72, 0x30, 0x81, 0xb6, 0x79, 0xcf, 0xe5, 0xc0, 0xa2, 0x53, 0x11, 0x18, 0x5a, 0x39, 0x40, 0x5c, 0x8d, 0x4a, 0x7c, 0x4f, 0x41, 0xe0, 0xb2, 0xd8, 0x35, 0x0d, 0xd4, 0x51, 0xc0, + 0xb7, 0x34, 0x2e, 0x0f, 0xd7, 0xf7, 0xa2, 0xb7, 0x52, 0xc2, 0xfb, 0xa7, 0xff, 0x88, 0xe6, 0xdf, 0xb8, 0xa3, 0xff, 0x20, 0xc1, 0xf8, 0x23, 0x3d, 0xe4, 0xff, 0xfc, 0x97, 0x83, 0xfe, 0x27, 0xf4, + 0x10, 0x06, 0xe1, 0x58, 0x96, 0x8e, 0xbf, 0x0b, 0x9c, 0x1b, 0x74, 0x65, 0x75, 0xe5, 0xee, 0x83, 0x6f, 0x10, 0xee, 0x58, 0x57, 0xbc, 0xa6, 0x9f, 0xcb, 0xdf, 0x96, 0xb1, 0x75, 0xd7, 0x3e, 0xe4, + 0x6f, 0x32, 0x2a, 0xe7, 0xfa, 0x55, 0x55, 0x11, 0xf8, 0x2e, 0xab, 0xf8, 0xd3, 0x39, 0xa7, 0xcc, 0x42, 0x95, 0xdf, 0xda, 0x27, 0x7f, 0xd3, 0xce, 0xb7, 0x43, 0x2a, 0xf6, 0xfd, 0x07, 0xf1, 0xc3, + 0x1f, 0x5e, 0xd3, 0xbf, 0xbe, 0x06, 0xfc, 0xf0, 0xe2, 0xef, 0x87, 0x52, 0xf2, 0xa9, 0x7b, 0xfc, 0xfd, 0x4d, 0x5f, 0xee, 0x37, 0x19, 0x99, 0xea, 0xd0, 0x7f, 0x93, 0x6c, 0x3c, 0x0d, 0x8e, 0x46, + 0xc2, 0xff, 0xe7, 0x3b, 0x0b, 0xbf, 0x56, 0xee, 0x3f, 0x8e, 0x70, 0x7f, 0xfb, 0x3b, 0xe9, 0x0c, 0x73, 0x18, 0x2c, 0x4d, 0xbb, 0xe8, 0x39, 0x0c, 0x5e, 0x0b, 0x1f, 0x1d, 0x37, 0x91, 0x9b, 0xe9, + 0xbc, 0x33, 0x1a, 0x77, 0xb7, 0x7e, 0xf3, 0x31, 0xe6, 0x78, 0x87, 0xc0, 0xd5, 0x9b, 0xe7, 0x16, 0xa7, 0x68, 0xd3, 0x95, 0x4c, 0x40, 0x62, 0xec, 0x63, 0x30, 0x6b, 0x0a, 0x0e, 0x58, 0xf0, 0x24, + 0x18, 0x5a, 0x53, 0xb6, 0xec, 0x20, 0xc0, 0xf3, 0x92, 0x3a, 0x51, 0x75, 0x3f, 0x70, 0xc4, 0x83, 0x1f, 0xc3, 0xc5, 0xee, 0xf1, 0xc8, 0x7f, 0x55, 0xd9, 0xfe, 0x9d, 0x78, 0xc6, 0x1f, 0x72, 0x6d, + 0xa0, 0x31, 0xc4, 0xec, 0x87, 0x28, 0xfa, 0x66, 0xc0, 0xc7, 0x31, 0x6d, 0x0f, 0x02, 0xbd, 0x2f, 0xef, 0x6a, 0x6b, 0xe3, 0xb7, 0xca, 0x16, 0xf8, 0x95, 0x81, 0x98, 0xfc, 0xa6, 0xa0, 0x6c, 0xee, + 0xaa, 0x19, 0x94, 0xfa, 0x41, 0xa5, 0x43, 0x26, 0x60, 0xca, 0xe3, 0x89, 0x12, 0x69, 0x2f, 0x40, 0x04, 0x81, 0x32, 0xa7, 0x86, 0xc6, 0xae, 0xd0, 0xd5, 0x55, 0x2b, 0xb3, 0x32, 0x9b, 0xe4, 0x81, + 0x68, 0xd0, 0x48, 0x9b, 0x57, 0x80, 0xaf, 0x83, 0x32, 0x6c, 0xc2, 0x79, 0xf5, 0x41, 0x91, 0x5e, 0xbb, 0xda, 0x16, 0x3a, 0xf5, 0x8f, 0x67, 0xcf, 0xa9, 0x09, 0x12, 0xdd, 0x6b, 0xe9, 0xff, 0xf2, + 0xb9, 0xf7, 0xdc, 0xdf, 0x35, 0xc1, 0xff, 0x50, 0xa6, 0xfe, 0xdd, 0x73, 0x2d, 0x04, 0x5f, 0x5a, 0xbb, 0xfb, 0xf1, 0x87, 0xe7, 0xfa, 0x0d, 0x93, 0xe7, 0xc2, 0x18, 0x4a, 0x23, 0x6e, 0x8d, 0xf0, + 0x27, 0x39, 0x91, 0xe3, 0x4b, 0x6d, 0x2a, 0xfd, 0xaa, 0xb5, 0xfb, 0xae, 0x0b, 0xc4, 0xd6, 0xfa, 0xcb, 0x81, 0xa9, 0xfd, 0x05, 0x9f, 0x9d, 0x2c, 0x7c, 0x9b, 0x71, 0x32, 0xba, 0x6c, 0x78, 0x4d, + 0x31, 0x1c, 0xdc, 0x32, 0x7f, 0xea, 0xf6, 0xfd, 0x2f, 0x19, 0x25, 0xfa, 0xd4, 0x35, 0xe7, 0xf9, 0x65, 0x77, 0xbf, 0xcb, 0x22, 0xf9, 0xed, 0xb7, 0x43, 0xd6, 0xf8, 0x30, 0x5a, 0xf9, 0xfa, 0xe3, + 0xf3, 0xfc, 0xd3, 0x5a, 0xfb, 0xe7, 0xdd, 0xfc, 0xb8, 0x19, 0xe0, 0x3f, 0xdd, 0xcd, 0x97, 0xcd, 0x7c, 0xe3, 0x42, 0x00, 0x7f, 0x4f, 0x86, 0x60, 0x61, 0xde, 0x56, 0x35, 0x69, 0x33, 0xeb, 0x1c, + 0x5b, 0x08, 0x44, 0x7b, 0xf8, 0xd6, 0x5c, 0x04, 0x13, 0x44, 0x93, 0x63, 0x09, 0xb3, 0x8f, 0x08, 0xba, 0x98, 0x51, 0x39, 0xa9, 0x3d, 0xd1, 0x81, 0x12, 0xdc, 0x47, 0x98, 0x38, 0x3f, 0xda, 0x54, + 0x44, 0x23, 0x7a, 0x6a, 0x0f, 0x77, 0x87, 0x97, 0x72, 0x30, 0x6b, 0x06, 0x3e, 0x1f, 0x59, 0x18, 0x21, 0xdb, 0x03, 0x23, 0x3f, 0xd6, 0xb4, 0x33, 0xaa, 0x12, 0x7d, 0x8a, 0x8f, 0xff, 0xd9, 0x51, + 0xf9, 0x2a, 0xb5, 0x49, 0x13, 0xb3, 0x98, 0xda, 0xa3, 0x3e, 0x22, 0x0e, 0xb6, 0x23, 0xe6, 0x44, 0x4d, 0x21, 0xe0, 0xec, 0x26, 0x89, 0xf3, 0x21, 0x5b, 0x7f, 0x18, 0xe6, 0xe2, 0x98, 0xed, 0xc5, + 0xd4, 0x8b, 0xfb, 0xb8, 0x49, 0xf6, 0xc5, 0x7d, 0x49, 0xbb, 0x93, 0xe2, 0xea, 0xd2, 0x98, 0x7a, 0xae, 0xe5, 0x62, 0x15, 0xaa, 0x83, 0x2e, 0x1b, 0x17, 0xc4, 0xed, 0xb7, 0x87, 0x97, 0x69, 0x6c, + 0x31, 0x36, 0xea, 0x46, 0xcc, 0x56, 0xe8, 0x0c, 0xe1, 0x8c, 0x3e, 0x0e, 0x80, 0x21, 0xd8, 0x42, 0x2f, 0x45, 0xf6, 0xc8, 0xb8, 0x52, 0xfb, 0xbc, 0xd6, 0x94, 0x79, 0x9b, 0x6b, 0x5e, 0x3f, 0x94, + 0x7a, 0x12, 0xe8, 0x1b, 0x3e, 0x8a, 0xc4, 0xf5, 0x55, 0x15, 0xb2, 0xca, 0x2b, 0xed, 0x3e, 0x74, 0xfb, 0xe8, 0xb6, 0x8a, 0x4c, 0x14, 0xc7, 0x23, 0x46, 0x1d, 0x6f, 0xd8, 0x25, 0xe8, 0xaa, 0xfe, + 0x42, 0xa5, 0x8f, 0xae, 0x0d, 0x51, 0x08, 0x0c, 0xe6, 0x36, 0x04, 0xbd, 0x6b, 0x75, 0x6f, 0x6a, 0x9c, 0x5b, 0x38, 0x3a, 0x46, 0xd7, 0x3a, 0xb4, 0x93, 0x3e, 0xe8, 0x35, 0xdb, 0xcb, 0x44, 0x5a, + 0xee, 0x60, 0x99, 0x99, 0xda, 0x2e, 0x51, 0xaf, 0xf2, 0x74, 0xd8, 0x85, 0x2e, 0x6e, 0xd2, 0x89, 0xd3, 0xed, 0x13, 0xf2, 0x5a, 0xdd, 0xfe, 0x56, 0xdc, 0x0f, 0xe4, 0x5a, 0xdd, 0x85, 0x66, 0xd3, + 0x1b, 0xa0, 0x1e, 0x09, 0xcb, 0xcb, 0xc8, 0x38, 0x64, 0xaa, 0xda, 0x58, 0x23, 0xfa, 0x1a, 0x67, 0x32, 0x06, 0xdf, 0xcc, 0x23, 0x6a, 0xa9, 0xe2, 0x79, 0x22, 0x8f, 0x21, 0x91, 0x1e, 0xdb, 0x5d, + 0x2e, 0x36, 0x86, 0x75, 0x41, 0x01, 0xed, 0x6e, 0xba, 0x3f, 0x2b, 0xc9, 0xc1, 0xcf, 0x58, 0xdd, 0x50, 0x54, 0x5b, 0xb3, 0x48, 0x68, 0xba, 0x70, 0x86, 0xf0, 0xfb, 0x03, 0xbc, 0xfd, 0x65, 0xba, + 0x99, 0xfe, 0xad, 0x37, 0x81, 0xa9, 0xee, 0x42, 0xe7, 0x18, 0x34, 0x7b, 0x7f, 0x66, 0xd3, 0x4d, 0xbd, 0xcf, 0x80, 0x5c, 0xdc, 0xc2, 0x33, 0x04, 0x06, 0x99, 0xf3, 0x04, 0x5f, 0x6d, 0x8b, 0xc0, + 0x4a, 0x55, 0x4e, 0xfa, 0x54, 0x82, 0x41, 0xbb, 0x58, 0xa6, 0xfb, 0x60, 0x9f, 0xb0, 0x66, 0x9a, 0x4e, 0x46, 0xc1, 0x87, 0xf9, 0xa4, 0x01, 0x15, 0x7c, 0x7a, 0x1c, 0xc1, 0x0e, 0x4f, 0x6f, 0x31, + 0x96, 0xf8, 0xd3, 0xd0, 0x14, 0x7a, 0xce, 0xd9, 0x89, 0xe0, 0x3d, 0x45, 0x58, 0x6b, 0x5a, 0xbe, 0x5d, 0xd9, 0xc5, 0x66, 0x02, 0x87, 0x39, 0x8d, 0xe4, 0x45, 0xdd, 0xf7, 0x23, 0xad, 0x88, 0xf2, + 0x38, 0x7c, 0x13, 0xd0, 0x94, 0x70, 0xd6, 0x6e, 0xf6, 0xe9, 0xc2, 0xa0, 0x63, 0x8f, 0x9c, 0x56, 0x04, 0x04, 0x70, 0x80, 0x2a, 0x14, 0x56, 0xb8, 0x8e, 0x4d, 0x8f, 0x15, 0x03, 0xf6, 0x9f, 0xaa, + 0x5e, 0x3f, 0xfd, 0xd9, 0xa5, 0x6c, 0xb7, 0xd9, 0x50, 0xc8, 0xe7, 0xb3, 0x94, 0xf2, 0x15, 0x69, 0x9b, 0xcc, 0x83, 0x0b, 0x66, 0x23, 0x68, 0x6f, 0xa7, 0x3b, 0x42, 0xec, 0x82, 0xf6, 0xd5, 0xf4, + 0xb7, 0xec, 0xe4, 0x40, 0x37, 0x70, 0x8c, 0x4d, 0xd1, 0xb8, 0x10, 0xc8, 0xca, 0x19, 0x3a, 0xd2, 0x59, 0x27, 0x9c, 0xfd, 0x09, 0x8e, 0x02, 0x03, 0xd3, 0x6c, 0x6c, 0x79, 0xb3, 0x3c, 0x0f, 0x9f, + 0xd8, 0x38, 0x2b, 0xa1, 0xb3, 0xff, 0x99, 0x0c, 0xf8, 0x97, 0x74, 0x09, 0xfc, 0x55, 0xbe, 0xc4, 0x54, 0x72, 0x56, 0x06, 0x3e, 0x51, 0xa1, 0x6a, 0xa8, 0x5d, 0xca, 0x7d, 0x35, 0xf7, 0x4e, 0xca, + 0x6f, 0x2f, 0xf3, 0xd0, 0x5f, 0x7a, 0xee, 0x00, 0x5f, 0xef, 0x26, 0x94, 0xc7, 0xc7, 0x6e, 0xd2, 0x94, 0xc5, 0xb6, 0x07, 0x78, 0xe2, 0xe1, 0xbb, 0x41, 0x1f, 0x63, 0x1f, 0xa8, 0xc9, 0xd4, 0xe0, + 0xf2, 0xb2, 0x52, 0x87, 0x37, 0xc7, 0x55, 0x35, 0x8a, 0xe7, 0x9e, 0x74, 0xc8, 0xc2, 0x98, 0x35, 0xfc, 0xc2, 0xc6, 0xb2, 0xef, 0x43, 0xe5, 0xfa, 0x3c, 0xd2, 0xa8, 0x8f, 0xcd, 0xb2, 0xc2, 0x35, + 0xbe, 0x00, 0xec, 0x37, 0x7f, 0xb3, 0x77, 0x46, 0xdd, 0x63, 0x77, 0x08, 0xd9, 0xe7, 0xa9, 0xa8, 0xad, 0x95, 0x10, 0x91, 0x6b, 0xb3, 0x62, 0x7c, 0x5f, 0x32, 0x74, 0xdf, 0xbb, 0x20, 0x8f, 0x5e, + 0x75, 0xda, 0xb8, 0x5a, 0x0a, 0xb0, 0x8c, 0x71, 0xfe, 0xfb, 0x9e, 0x96, 0x87, 0xd8, 0xd9, 0x45, 0xba, 0x6e, 0x57, 0x8d, 0x97, 0x24, 0x09, 0x7e, 0x98, 0xc0, 0x71, 0x1a, 0x80, 0xed, 0xfa, 0x49, + 0xae, 0xfc, 0xd3, 0x1a, 0xb5, 0x90, 0x58, 0xd7, 0xc8, 0xd0, 0x8e, 0xbb, 0xcb, 0xf5, 0x48, 0x7c, 0x54, 0xc3, 0x38, 0xae, 0x84, 0xd7, 0xc4, 0x49, 0xd1, 0x4d, 0xef, 0x75, 0x15, 0x17, 0x03, 0x94, + 0xa8, 0xd1, 0xd2, 0x51, 0x42, 0xd2, 0x0e, 0x3e, 0x0a, 0xf3, 0xeb, 0x76, 0xdc, 0xb6, 0x78, 0xc1, 0xc9, 0x59, 0x8a, 0x08, 0x9a, 0xcc, 0x80, 0x82, 0x62, 0x8a, 0x8a, 0x04, 0x7d, 0xe5, 0xd0, 0xf5, + 0xb4, 0x8d, 0x0f, 0x4a, 0x45, 0x3b, 0x10, 0x39, 0x02, 0x64, 0xc1, 0x75, 0xc5, 0x03, 0xd5, 0x78, 0xa0, 0x55, 0xea, 0x22, 0x95, 0x57, 0x55, 0xca, 0xd6, 0x79, 0x93, 0xa4, 0xb1, 0x0a, 0xba, 0x41, + 0x35, 0x8d, 0x2e, 0x3e, 0x39, 0x0c, 0xe1, 0x06, 0x68, 0x2e, 0xc2, 0xa0, 0x93, 0xce, 0x38, 0x6b, 0x00, 0x63, 0x4b, 0xd8, 0xe9, 0x01, 0xa9, 0x5b, 0x21, 0x4b, 0xa3, 0xfc, 0x24, 0x8a, 0xf7, 0x48, + 0x66, 0xb9, 0xd6, 0xd0, 0x38, 0x5f, 0xea, 0x55, 0x99, 0x8b, 0x0f, 0x87, 0xbd, 0xab, 0x83, 0x76, 0x42, 0x91, 0x5e, 0xed, 0xa5, 0x0a, 0xdd, 0x0e, 0xdd, 0xcb, 0x2e, 0xb8, 0x60, 0x4b, 0xb0, 0xf8, + 0x1b, 0x5a, 0x77, 0x30, 0x4d, 0x3a, 0xf2, 0x4c, 0xb0, 0xbe, 0x00, 0x34, 0x5d, 0x98, 0x7d, 0xd5, 0x8b, 0xb0, 0xba, 0xf2, 0xf7, 0xd8, 0x07, 0x5f, 0xf8, 0x2a, 0x0e, 0x38, 0x07, 0xda, 0x9f, 0x0c, + 0x2f, 0x9f, 0xb7, 0x16, 0xa5, 0xcc, 0x21, 0xb9, 0x0b, 0x44, 0xe5, 0x0e, 0xcc, 0xda, 0xf7, 0x5c, 0xf0, 0xe7, 0x8b, 0x29, 0xf5, 0xdb, 0x5e, 0x8c, 0x5a, 0x70, 0xe8, 0x34, 0x87, 0x10, 0x53, 0x1e, + 0x6f, 0xbf, 0x2e, 0x15, 0x01, 0x28, 0xd3, 0xdc, 0xc3, 0x37, 0x8a, 0x0e, 0x27, 0x5b, 0x8d, 0x58, 0xa6, 0xf4, 0xde, 0x4c, 0x1e, 0x37, 0x0a, 0x8c, 0x80, 0xa0, 0x19, 0xa7, 0xb0, 0x2e, 0x23, 0xad, + 0x6b, 0x1c, 0x5a, 0xd5, 0xae, 0x84, 0xc3, 0x7b, 0x85, 0x42, 0xcd, 0xe0, 0xea, 0xda, 0x79, 0x33, 0x4f, 0xda, 0x62, 0x33, 0x9f, 0x5d, 0xa0, 0x87, 0x17, 0xc4, 0xe3, 0xd7, 0xb8, 0x17, 0x0f, 0x80, + 0xd8, 0x88, 0x18, 0xa4, 0x8e, 0x44, 0xcb, 0x71, 0xd4, 0x18, 0xa4, 0x06, 0x94, 0x7a, 0xa4, 0x63, 0x23, 0xc7, 0x95, 0x8c, 0x74, 0xf4, 0xa2, 0x61, 0xc1, 0xba, 0x21, 0xcf, 0xf8, 0x97, 0xd9, 0xac, + 0x92, 0xb7, 0x1a, 0x6c, 0xbb, 0x43, 0xe7, 0xc5, 0xbc, 0x7a, 0x78, 0x95, 0x75, 0xcb, 0xd8, 0xee, 0x76, 0xe9, 0x6b, 0x2e, 0xa6, 0xad, 0xe2, 0x7c, 0x21, 0x80, 0xa0, 0x81, 0x20, 0x7c, 0xf4, 0xfe, + 0x32, 0x99, 0xa4, 0x2c, 0x54, 0x01, 0x9e, 0xaf, 0xa7, 0x0d, 0x5a, 0x05, 0xaf, 0xeb, 0x34, 0xa2, 0x56, 0x9f, 0x2e, 0x4d, 0xd9, 0x67, 0xfb, 0xb0, 0x13, 0x24, 0x4d, 0x53, 0x0b, 0xd7, 0x77, 0x4b, + 0x39, 0x0c, 0xfb, 0xce, 0x7a, 0xe7, 0xfd, 0x44, 0x8c, 0x52, 0x76, 0x7a, 0x2b, 0x30, 0x06, 0x71, 0x0b, 0xc0, 0x0d, 0x01, 0xaa, 0x1e, 0xc9, 0xfe, 0x19, 0x16, 0xc3, 0xff, 0x31, 0x16, 0xcf, 0x4b, + 0x68, 0x30, 0xac, 0x9f, 0x7c, 0x4e, 0xbe, 0xfb, 0xfc, 0xe9, 0x1c, 0xe4, 0xff, 0x0d, 0x16, 0xcb, 0xff, 0x5f, 0xc2, 0x62, 0xf9, 0xbf, 0x83, 0xc5, 0x9c, 0x89, 0xec, 0x70, 0xff, 0x78, 0xdc, 0x8b, + 0xc0, 0xd9, 0x24, 0x73, 0xbc, 0x92, 0x54, 0x18, 0x10, 0xd1, 0x8b, 0x72, 0x8a, 0x14, 0xf3, 0x20, 0x99, 0xbd, 0xdb, 0xdb, 0xde, 0x6f, 0x44, 0xdb, 0x01, 0x76, 0x9f, 0xd6, 0xa1, 0x4c, 0x8f, 0x3a, + 0x66, 0xd2, 0xd1, 0xaf, 0xdd, 0xe1, 0x1e, 0x84, 0xf5, 0x81, 0x8e, 0xb3, 0x09, 0x6a, 0x79, 0x5f, 0xf9, 0x5b, 0xfe, 0x58, 0xe9, 0xf0, 0x7a, 0x49, 0xa4, 0xdd, 0x48, 0x2f, 0xf0, 0x91, 0x0d, 0x65, + 0xa5, 0x09, 0xdb, 0x8e, 0xd1, 0x2e, 0xe8, 0x21, 0x6a, 0x25, 0xb6, 0x6e, 0x8c, 0x73, 0xdd, 0x48, 0x28, 0x7e, 0x07, 0x14, 0x48, 0x52, 0x63, 0x7d, 0x8f, 0xd5, 0x4e, 0x4f, 0x35, 0xf1, 0xfd, 0x98, + 0x0b, 0x08, 0xc6, 0x07, 0x93, 0x04, 0x51, 0xab, 0xb9, 0x10, 0x84, 0x81, 0x16, 0x4c, 0x5d, 0x50, 0x48, 0x18, 0xc6, 0x55, 0x79, 0x53, 0x20, 0x13, 0x52, 0xcc, 0x16, 0xed, 0xf4, 0xa6, 0xb3, 0x38, + 0x0b, 0x5a, 0x1f, 0x72, 0x65, 0x32, 0xd5, 0x35, 0x43, 0xb9, 0x27, 0xc3, 0x14, 0x48, 0x28, 0xfc, 0xb8, 0x66, 0x9b, 0x23, 0x8d, 0x19, 0x7a, 0x6b, 0x75, 0xf7, 0xb2, 0xf2, 0xcc, 0x53, 0x91, 0xb1, + 0xec, 0x5f, 0x45, 0x9f, 0x17, 0xe8, 0xd1, 0x12, 0x32, 0xc4, 0x98, 0xf9, 0x5c, 0x10, 0x6f, 0x27, 0xda, 0x94, 0xa0, 0x2c, 0x54, 0x09, 0x56, 0xdc, 0x9a, 0x51, 0xef, 0xe3, 0xcd, 0x46, 0x28, 0x3a, + 0x96, 0x0e, 0x26, 0xf6, 0xb9, 0x30, 0xbb, 0xc0, 0x43, 0x13, 0x5a, 0x95, 0x61, 0xd1, 0xe5, 0xe8, 0xd1, 0x60, 0xc8, 0xe9, 0xb1, 0x49, 0xe2, 0x22, 0x4b, 0x1f, 0xc8, 0x15, 0x6d, 0xd6, 0x16, 0x56, + 0x25, 0xe5, 0xd4, 0xdc, 0x53, 0xd0, 0x2c, 0xee, 0xa1, 0xc3, 0x9b, 0x70, 0xe4, 0x46, 0xcb, 0x26, 0xaa, 0x84, 0x1d, 0xf6, 0x3d, 0x8d, 0x85, 0x02, 0x6e, 0x4f, 0x9f, 0xcc, 0xab, 0x74, 0x4b, 0xde, + 0x84, 0x0e, 0xbc, 0xc7, 0xea, 0xf0, 0x5e, 0x1f, 0xca, 0x3b, 0x56, 0xb9, 0x1f, 0xdd, 0x67, 0xaf, 0x5a, 0xc1, 0x03, 0xb1, 0x98, 0x00, 0x96, 0x72, 0x55, 0x78, 0x3d, 0x79, 0x1c, 0x97, 0xda, 0x2d, + 0xd3, 0x7d, 0xfb, 0x6d, 0xe7, 0x71, 0xad, 0xef, 0x32, 0x82, 0x15, 0xf7, 0xed, 0xcb, 0xef, 0xaa, 0x54, 0xd7, 0x7b, 0x4e, 0x88, 0x95, 0x5f, 0xb2, 0xe5, 0xce, 0x3c, 0x45, 0x04, 0x66, 0xfc, 0xa9, + 0x92, 0xf1, 0x3d, 0xe6, 0xdc, 0x67, 0xc1, 0xce, 0xb1, 0xc9, 0x50, 0xce, 0xd5, 0xad, 0xac, 0xb3, 0x97, 0xac, 0x31, 0xef, 0xc5, 0x9d, 0x5f, 0xf1, 0x76, 0x2e, 0x06, 0xcc, 0xe0, 0x63, 0xb5, 0xde, + 0x81, 0x12, 0x3c, 0x7a, 0xd7, 0x2d, 0x6a, 0x58, 0x18, 0xe4, 0xf3, 0x75, 0x6d, 0x61, 0x39, 0x7e, 0xda, 0x13, 0x73, 0x42, 0x79, 0xa6, 0x3e, 0x80, 0x8b, 0xa0, 0x8c, 0x9c, 0xca, 0xad, 0xbe, 0x82, + 0xef, 0xfe, 0xed, 0xac, 0x61, 0xb0, 0xe6, 0x94, 0xcd, 0x56, 0x92, 0xb2, 0x8b, 0x85, 0x52, 0x18, 0x6f, 0xeb, 0x91, 0x5e, 0xea, 0x07, 0x9a, 0x4f, 0xc1, 0x31, 0x03, 0xe2, 0xf5, 0x80, 0x8b, 0xf5, + 0x19, 0x2c, 0xce, 0xe0, 0xa9, 0x89, 0x48, 0x20, 0xc1, 0xd6, 0x6d, 0xdd, 0x95, 0x2d, 0x5d, 0x12, 0x18, 0x01, 0xa0, 0x3c, 0xef, 0xea, 0x6a, 0x53, 0xad, 0x11, 0x25, 0x42, 0x9a, 0x4b, 0xfb, 0x7a, + 0xa0, 0xe1, 0x83, 0x32, 0x7b, 0xcf, 0xc0, 0xdd, 0x29, 0xf7, 0x1a, 0x04, 0xf4, 0xc5, 0xc0, 0x40, 0xb7, 0xc1, 0xdf, 0xa0, 0xf7, 0xcd, 0x7e, 0xaa, 0x8c, 0xc8, 0xc5, 0xf5, 0x74, 0xb2, 0xe3, 0x69, + 0x65, 0xe6, 0xd0, 0xad, 0x75, 0x5c, 0x8b, 0x51, 0x7f, 0x61, 0xe3, 0x5b, 0x03, 0xf2, 0xd0, 0x53, 0x9f, 0xc9, 0x46, 0xb2, 0x19, 0x1f, 0x8f, 0x25, 0xe8, 0x07, 0xaa, 0x28, 0x58, 0x16, 0xe4, 0x2b, + 0xb4, 0x79, 0xd5, 0x94, 0xf9, 0x5e, 0xff, 0xa1, 0x25, 0xc7, 0xdf, 0x62, 0xf1, 0x06, 0x82, 0x6a, 0xdb, 0x98, 0xa5, 0x87, 0x0d, 0x2a, 0xfc, 0x50, 0xc6, 0xe9, 0xe3, 0x07, 0xca, 0x99, 0x15, 0xb0, + 0xfd, 0x57, 0x58, 0xcc, 0x80, 0xea, 0xbd, 0x22, 0xd2, 0xfe, 0x11, 0x4b, 0xd8, 0xcd, 0x75, 0x96, 0x3a, 0xa2, 0x9e, 0x11, 0x3e, 0x8d, 0x81, 0x52, 0xd8, 0x20, 0x84, 0xd9, 0xac, 0x16, 0xe2, 0x1b, + 0xcf, 0x9e, 0xee, 0x16, 0x2b, 0x02, 0x9c, 0x26, 0xc8, 0x76, 0xe8, 0xa8, 0xac, 0xec, 0x39, 0xd9, 0x39, 0xdb, 0x27, 0x1e, 0xe6, 0x38, 0x05, 0x47, 0x9d, 0x04, 0xa0, 0x5e, 0xa9, 0x0f, 0xdb, 0x5b, + 0xef, 0x8d, 0x13, 0xae, 0xac, 0xf2, 0xf8, 0x67, 0x34, 0x7c, 0x44, 0x73, 0x6d, 0xa5, 0x85, 0x01, 0x87, 0xec, 0x40, 0x33, 0x6c, 0xec, 0x8f, 0x08, 0xe5, 0x37, 0x0c, 0xd3, 0x13, 0x86, 0x71, 0x3c, + 0x7f, 0x64, 0x07, 0xf1, 0xad, 0xf0, 0x0f, 0x1d, 0xe1, 0x2e, 0x96, 0x79, 0x52, 0x3d, 0x22, 0x41, 0x36, 0x58, 0x9d, 0x35, 0xb0, 0x1c, 0x61, 0x40, 0x6c, 0xe2, 0x56, 0xd9, 0x8f, 0xf1, 0xa1, 0x17, + 0x96, 0x97, 0x54, 0x2d, 0xdd, 0xbc, 0x66, 0x29, 0x36, 0xdc, 0x20, 0xc3, 0x9f, 0xda, 0xc1, 0xa9, 0x15, 0xcf, 0x55, 0x68, 0xe4, 0x2e, 0xb1, 0x15, 0x4a, 0x95, 0x02, 0x6f, 0x46, 0xef, 0x3a, 0x51, + 0xca, 0x8c, 0xa2, 0xf9, 0x51, 0xe3, 0xac, 0x43, 0x3e, 0x4a, 0xc9, 0x5f, 0x59, 0xd1, 0x01, 0xa0, 0x10, 0x68, 0x24, 0xc8, 0x80, 0x5b, 0xe8, 0x53, 0x0a, 0xdc, 0xda, 0xb7, 0xb8, 0xe3, 0x3e, 0x86, + 0xd4, 0x6f, 0x67, 0x56, 0x22, 0xe7, 0x13, 0xa6, 0x9e, 0x2a, 0x11, 0xb6, 0x5e, 0x5d, 0xb4, 0x66, 0x86, 0x33, 0xf1, 0xc2, 0x77, 0xf8, 0xf2, 0x32, 0x7b, 0x17, 0x29, 0xaa, 0x2c, 0xf6, 0x08, 0x6d, + 0xc8, 0x74, 0xd3, 0xbd, 0xb1, 0xf3, 0x83, 0x60, 0x00, 0xda, 0xd0, 0xbe, 0x8a, 0x47, 0x5f, 0x1c, 0xa8, 0x8a, 0xab, 0x0d, 0x32, 0x49, 0xb3, 0x57, 0xb9, 0x74, 0xd2, 0x80, 0x62, 0xb1, 0x4b, 0x97, + 0xcc, 0x66, 0xe0, 0x52, 0xb1, 0x9f, 0x47, 0x1e, 0xf0, 0x5b, 0x7d, 0x97, 0x54, 0xe5, 0x10, 0x34, 0x18, 0x15, 0x64, 0x1a, 0xcc, 0x70, 0x24, 0xbf, 0xe2, 0x95, 0x5d, 0x85, 0x62, 0xf0, 0x2a, 0xd6, + 0x81, 0x2f, 0x0c, 0xa0, 0xac, 0xb8, 0x55, 0xd2, 0xa6, 0x4a, 0xa6, 0x71, 0xce, 0x8f, 0x16, 0x3f, 0x35, 0x7e, 0x7c, 0xb3, 0xaf, 0x98, 0xe5, 0xee, 0xa6, 0xfc, 0xcc, 0x91, 0x15, 0x3e, 0x70, 0x3d, + 0xae, 0x54, 0xa6, 0x58, 0x86, 0x35, 0x11, 0x14, 0xe2, 0xc3, 0x08, 0x81, 0xb4, 0xf7, 0x0a, 0x1c, 0xbe, 0x64, 0x56, 0x1c, 0x47, 0xe2, 0x26, 0x44, 0x25, 0x21, 0xfc, 0x9e, 0xd4, 0x01, 0x22, 0x36, + 0x1c, 0xcf, 0xec, 0x5e, 0x68, 0xc3, 0x54, 0x67, 0xa6, 0x74, 0xef, 0x51, 0xd5, 0xc9, 0x93, 0x2e, 0xb9, 0xf1, 0x13, 0xed, 0x43, 0xc1, 0xa6, 0xde, 0xc3, 0x92, 0x02, 0x98, 0x74, 0xdd, 0x82, 0xba, + 0x79, 0xd2, 0x42, 0x33, 0x0c, 0xae, 0x2b, 0xbb, 0x3d, 0x33, 0x56, 0xe7, 0xbb, 0x9d, 0x82, 0x51, 0xb7, 0x52, 0x2c, 0x41, 0x06, 0x61, 0x87, 0x04, 0x20, 0x0d, 0xcb, 0x84, 0x55, 0xda, 0xfb, 0x04, + 0xa1, 0x25, 0x70, 0xd7, 0xe6, 0xf9, 0x40, 0xe5, 0x2a, 0xee, 0x5f, 0xc6, 0x9c, 0x74, 0x07, 0x0a, 0xaa, 0x4c, 0xc0, 0x7f, 0x78, 0x92, 0xbe, 0x76, 0x36, 0xb9, 0x75, 0x0a, 0x4a, 0x66, 0xfb, 0x61, + 0x99, 0x5b, 0x40, 0x68, 0x91, 0x17, 0xae, 0x0d, 0xd3, 0x17, 0x1d, 0x27, 0x72, 0xe5, 0xbc, 0x10, 0xbb, 0x03, 0x84, 0xa2, 0xc2, 0x90, 0x70, 0xea, 0xb6, 0xf8, 0x84, 0x76, 0x81, 0x5d, 0x1d, 0xcf, + 0x71, 0xcb, 0xd9, 0x3d, 0x80, 0x52, 0x34, 0x4e, 0x32, 0x76, 0x79, 0x26, 0x9e, 0x65, 0xa6, 0x93, 0x53, 0xd3, 0x46, 0x87, 0x87, 0x1a, 0x1d, 0xef, 0x44, 0xec, 0x05, 0x61, 0x88, 0xae, 0xb4, 0xf3, + 0x78, 0x57, 0x10, 0x5f, 0x5c, 0x05, 0x61, 0xfb, 0x39, 0xa6, 0xb7, 0x21, 0x20, 0xc5, 0xa9, 0xf6, 0xcf, 0xb0, 0x18, 0xf9, 0xef, 0x60, 0x31, 0xcb, 0x7a, 0x2c, 0x4b, 0xc7, 0xf8, 0x1f, 0xb0, 0x78, + 0x93, 0xb5, 0x59, 0xb6, 0xaa, 0x4e, 0x81, 0x21, 0xea, 0xf5, 0xe7, 0xeb, 0xce, 0x5f, 0x22, 0x1f, 0xf0, 0xbf, 0x85, 0xc3, 0x7e, 0xab, 0x7f, 0x93, 0x08, 0xfb, 0xcf, 0x71, 0xf8, 0xcb, 0x66, 0x80, + 0xff, 0x74, 0x37, 0x3f, 0x2a, 0xf3, 0x01, 0x7f, 0x96, 0xe6, 0xb3, 0x4b, 0xef, 0x36, 0x25, 0xfd, 0xea, 0xd5, 0x31, 0xf6, 0x8a, 0x8b, 0xcc, 0xea, 0x90, 0x17, 0x15, 0xbc, 0x4b, 0x72, 0x15, 0xda, + 0x84, 0xb3, 0x7e, 0xea, 0x0a, 0x71, 0x82, 0x4a, 0x27, 0x5c, 0xe9, 0x43, 0x2d, 0x9f, 0x1f, 0x4b, 0xbd, 0x79, 0xdf, 0x77, 0xc6, 0x6d, 0x05, 0x08, 0x04, 0x17, 0x5b, 0xf3, 0x3a, 0xcb, 0x06, 0x04, + 0x3f, 0x91, 0x98, 0x8b, 0xb2, 0x23, 0x30, 0xbc, 0x10, 0xa4, 0xcd, 0xfe, 0x51, 0x86, 0x07, 0xf1, 0xa6, 0xa5, 0xd6, 0x3d, 0x7b, 0x1c, 0x13, 0xdc, 0xd0, 0xb1, 0xfb, 0xf3, 0x19, 0x5e, 0x8e, 0xa3, + 0xc2, 0x3c, 0x8f, 0xe2, 0x49, 0x4b, 0xc3, 0x34, 0xc7, 0x69, 0x30, 0xca, 0x16, 0x5f, 0x89, 0x23, 0xc0, 0xff, 0xdc, 0x7e, 0xc3, 0x63, 0x48, 0x37, 0xc1, 0x47, 0x16, 0xde, 0xea, 0x58, 0xb2, 0x20, + 0x90, 0xff, 0x00, 0xfc, 0x0c, 0xa3, 0x6c, 0x5f, 0x52, 0xfb, 0x9f, 0x2d, 0xa4, 0x27, 0x9a, 0x63, 0x7a, 0xba, 0xe5, 0x69, 0x6a, 0xe3, 0xab, 0xce, 0x71, 0x88, 0x40, 0x35, 0x6d, 0xa1, 0x16, 0xc1, + 0x5a, 0x6f, 0x3f, 0x29, 0xbc, 0x44, 0x43, 0x8d, 0x89, 0x3d, 0xcb, 0xa6, 0x03, 0xa5, 0x1b, 0x70, 0x72, 0x7b, 0x80, 0x46, 0x3e, 0xc9, 0x87, 0xb0, 0x6c, 0x41, 0xba, 0x81, 0xc8, 0x4b, 0x43, 0x26, + 0xfa, 0xce, 0xf4, 0x42, 0x6c, 0xbe, 0x7c, 0x08, 0xa8, 0xe4, 0xfd, 0x6b, 0x0b, 0x38, 0xa1, 0x36, 0x39, 0x24, 0x2b, 0x4b, 0x8d, 0x40, 0x7d, 0xd3, 0x84, 0x98, 0x7b, 0xe6, 0x23, 0xb1, 0x16, 0x9e, + 0x78, 0x0a, 0x71, 0xed, 0xf5, 0x7a, 0xd4, 0x66, 0xa4, 0xc4, 0x6a, 0x12, 0x00, 0xcf, 0xa7, 0xf3, 0x5a, 0x1f, 0x99, 0xa3, 0xc9, 0x83, 0xbf, 0x15, 0x68, 0xf4, 0xcf, 0x82, 0x02, 0xfd, 0x8f, 0x83, + 0xe2, 0x10, 0xdb, 0x3d, 0x3e, 0x3f, 0x59, 0x36, 0x31, 0xf6, 0x2f, 0x38, 0x00, 0xff, 0xb7, 0x83, 0xc2, 0xfe, 0xff, 0x54, 0x50, 0xd8, 0x7f, 0x17, 0x14, 0xde, 0x9d, 0x4b, 0xe6, 0x90, 0xc8, 0x6b, + 0x35, 0xbf, 0x4d, 0xd4, 0xc8, 0x42, 0x46, 0x97, 0x56, 0xcd, 0x7d, 0x21, 0xc4, 0x11, 0x4a, 0x26, 0xb6, 0x62, 0xe2, 0x1e, 0xee, 0x41, 0xec, 0x54, 0xcf, 0xf9, 0xcd, 0xe5, 0x19, 0x58, 0x28, 0x6f, + 0x8f, 0x49, 0xf0, 0xfb, 0xde, 0x80, 0x3a, 0xba, 0x1a, 0x5b, 0x8a, 0x89, 0x4f, 0x96, 0xa0, 0x0e, 0x55, 0x7d, 0x30, 0x4c, 0x75, 0x92, 0xc1, 0x9a, 0x96, 0x48, 0xc6, 0x86, 0xab, 0x2f, 0xc7, 0xa9, + 0xf5, 0xa2, 0x27, 0x16, 0xd7, 0xbd, 0x6f, 0x8d, 0xb1, 0xd3, 0x31, 0xab, 0x94, 0x35, 0xe4, 0x20, 0x65, 0x64, 0xa3, 0x27, 0x0d, 0xd8, 0x9d, 0xea, 0xee, 0x48, 0xf1, 0xe7, 0x3f, 0x0d, 0x0a, 0x97, + 0xf6, 0x8c, 0x74, 0xce, 0x2d, 0x4a, 0x31, 0x3e, 0x56, 0x00, 0x5b, 0xd7, 0x13, 0xb0, 0x96, 0xe0, 0x43, 0x2a, 0x76, 0xde, 0xfe, 0x45, 0x50, 0xe0, 0x3c, 0x07, 0x56, 0x14, 0xca, 0x51, 0xca, 0x63, + 0x93, 0xa2, 0xcf, 0xa0, 0xcd, 0xfd, 0xee, 0x81, 0x09, 0x27, 0xd9, 0xe8, 0x5a, 0xdb, 0x7c, 0x0e, 0xe5, 0xdd, 0x87, 0xa0, 0x41, 0x16, 0x98, 0xc9, 0xbc, 0x08, 0x3a, 0x2c, 0x7b, 0x3a, 0x67, 0x2c, + 0x37, 0x95, 0x46, 0xdd, 0x2c, 0xac, 0x11, 0xc2, 0xd7, 0xfb, 0x7e, 0x52, 0xe4, 0xc9, 0x09, 0x74, 0xab, 0x6a, 0xd3, 0xeb, 0x67, 0x6c, 0xe7, 0x19, 0x9a, 0x64, 0x5a, 0x02, 0xaa, 0x86, 0xb2, 0x9f, + 0x03, 0xf1, 0x6e, 0x8d, 0x4d, 0x25, 0x63, 0xda, 0xcc, 0x2b, 0xcd, 0x4c, 0x82, 0xa5, 0xad, 0x01, 0x74, 0x5e, 0xfc, 0x22, 0x9b, 0x0d, 0x39, 0x77, 0xfd, 0xd5, 0xef, 0xb8, 0xbf, 0x14, 0xa0, 0x2a, + 0xba, 0x26, 0xf9, 0x7e, 0x61, 0xb0, 0xc3, 0xff, 0x7d, 0x01, 0xaa, 0x9c, 0x63, 0x59, 0xfa, 0xf9, 0x7d, 0xd8, 0xcc, 0xa2, 0xc3, 0xbc, 0x54, 0xa8, 0xf4, 0x51, 0x6c, 0xd6, 0x7b, 0xd6, 0x50, 0x25, + 0x3c, 0xc2, 0xe2, 0x57, 0x97, 0x71, 0x3a, 0x6f, 0xff, 0x6c, 0xdb, 0xf4, 0x52, 0x74, 0x67, 0x3c, 0xc4, 0xef, 0x1e, 0xe3, 0x82, 0xff, 0x0a, 0xcf, 0x29, 0x76, 0x19, 0x31, 0x09, 0xb1, 0xe5, 0xeb, + 0xe8, 0x28, 0x4f, 0x61, 0x49, 0xfb, 0x93, 0x42, 0x93, 0x18, 0x2c, 0x49, 0xf8, 0xa3, 0x44, 0x04, 0x03, 0x03, 0xbf, 0x53, 0x63, 0x4e, 0x93, 0xe3, 0x4f, 0xbd, 0x7d, 0x9f, 0xba, 0xe7, 0x3f, 0x0d, + 0xcf, 0xf9, 0x8d, 0x1a, 0x73, 0xff, 0x71, 0xed, 0xe7, 0x9d, 0xfc, 0xbc, 0x11, 0xe0, 0x3f, 0xd9, 0x89, 0xde, 0xfe, 0x51, 0xe9, 0x01, 0xf8, 0x6b, 0xc2, 0xaa, 0x66, 0x5b, 0x47, 0x41, 0xa2, 0xc3, + 0x6e, 0x27, 0xd8, 0x80, 0xa2, 0x43, 0x3e, 0x61, 0x24, 0x9e, 0x4f, 0xb4, 0x49, 0x56, 0x3d, 0x5c, 0x83, 0xa3, 0xd0, 0x49, 0xd0, 0x31, 0xcc, 0x32, 0x4a, 0x6f, 0xf5, 0x8b, 0x00, 0xf0, 0x9b, 0xf9, + 0xd0, 0x3a, 0x7b, 0xe7, 0x62, 0xfd, 0x58, 0x3e, 0xa0, 0xf4, 0x0c, 0xd5, 0xbb, 0x68, 0x29, 0xfb, 0x1a, 0x0f, 0xd8, 0x61, 0x9d, 0x16, 0x6a, 0xd3, 0x89, 0x93, 0x23, 0xd8, 0x46, 0xd2, 0xc0, 0x53, + 0x85, 0x2a, 0xeb, 0xcb, 0x46, 0xe5, 0xcc, 0xee, 0xba, 0x45, 0xd4, 0x6c, 0xe4, 0xd6, 0xd0, 0x6a, 0x6a, 0x0f, 0xe2, 0xc6, 0x56, 0x90, 0x0f, 0x40, 0x49, 0x0b, 0x37, 0x87, 0x2d, 0xb9, 0x8c, 0x82, + 0xd5, 0x1b, 0x0c, 0x84, 0x8f, 0x48, 0x57, 0x66, 0xcf, 0xf6, 0xc0, 0x2d, 0x18, 0x99, 0x34, 0x36, 0x64, 0x86, 0xaa, 0x9b, 0x77, 0xe1, 0x54, 0xdf, 0xd4, 0x14, 0xb9, 0x21, 0xf8, 0x01, 0xb1, 0x26, + 0xf9, 0x50, 0x9d, 0x93, 0xfb, 0xb0, 0x54, 0xf3, 0xa4, 0x7d, 0x22, 0xc2, 0x4b, 0xab, 0x7a, 0x5e, 0x1d, 0x80, 0xc9, 0x48, 0x3e, 0xb2, 0xa2, 0x19, 0x47, 0xc2, 0xde, 0xdd, 0x2c, 0xe3, 0x35, 0xaf, + 0x1a, 0x65, 0x1e, 0x06, 0x98, 0x91, 0xa6, 0x78, 0xa8, 0xf1, 0xa1, 0x66, 0x60, 0x67, 0x7c, 0x7b, 0x86, 0x67, 0x72, 0x03, 0x12, 0xd6, 0x7e, 0x93, 0xd7, 0xa6, 0x25, 0xbc, 0xac, 0x18, 0xb3, 0x51, + 0xed, 0x89, 0x59, 0x66, 0xbe, 0x74, 0x3b, 0x56, 0xc0, 0xb6, 0xd2, 0x01, 0xab, 0x8c, 0x65, 0x10, 0xc3, 0x43, 0xc8, 0x13, 0x06, 0xfd, 0x4f, 0xc1, 0xd0, 0xba, 0x01, 0xf6, 0x7e, 0xf8, 0x12, 0x72, + 0x3f, 0xba, 0xe8, 0xc9, 0x23, 0x44, 0xeb, 0xee, 0x23, 0x44, 0x4f, 0x1c, 0x55, 0x3c, 0xea, 0xf2, 0xa0, 0x5f, 0x38, 0x58, 0x6b, 0xb7, 0xe3, 0x2f, 0x4b, 0xfa, 0xee, 0x53, 0x73, 0x12, 0xac, 0x6e, + 0x4c, 0x41, 0x1e, 0x3e, 0x86, 0x10, 0xc0, 0xc6, 0x2e, 0x54, 0xc9, 0xb6, 0x2d, 0x0d, 0xa2, 0x05, 0xd1, 0xa1, 0x33, 0x42, 0x74, 0xc4, 0xc5, 0x43, 0x93, 0x9f, 0xe2, 0xa4, 0xd8, 0xd1, 0xec, 0x5a, + 0x6d, 0xbe, 0x64, 0x33, 0x9e, 0xd2, 0xb5, 0x43, 0x10, 0x59, 0x9c, 0xf2, 0x9e, 0xaa, 0x6c, 0xc2, 0x7d, 0x8e, 0x6f, 0xb1, 0x2a, 0x42, 0x75, 0xd6, 0xb8, 0x46, 0xcd, 0x12, 0x4c, 0xd1, 0x8c, 0x19, + 0x70, 0x18, 0x09, 0x9a, 0x7c, 0x8b, 0xf5, 0x78, 0xab, 0xcb, 0xb8, 0x44, 0x5f, 0x5b, 0x23, 0x2a, 0x26, 0x7f, 0xab, 0x3e, 0x1c, 0x14, 0x31, 0xec, 0x1d, 0xc7, 0x16, 0x4c, 0x57, 0xa1, 0xa8, 0x0d, + 0xc7, 0x9a, 0x1a, 0x07, 0xe7, 0xf4, 0xe8, 0xf3, 0x4d, 0x05, 0x78, 0xe7, 0x82, 0x85, 0x6c, 0xd4, 0x69, 0x39, 0xb9, 0x36, 0x23, 0x7e, 0xf0, 0xd0, 0x83, 0x78, 0x80, 0x89, 0xc2, 0xdc, 0xc0, 0x65, + 0x53, 0x6b, 0x91, 0xf9, 0x48, 0x1c, 0xb7, 0x02, 0x09, 0x3b, 0xa1, 0x9c, 0xbe, 0x5d, 0x6f, 0x11, 0x77, 0x14, 0x53, 0x72, 0xa7, 0xe8, 0x53, 0xb3, 0x64, 0x29, 0xe0, 0x6c, 0x99, 0x24, 0xfd, 0x55, + 0xca, 0xeb, 0x56, 0xfa, 0x91, 0x82, 0x23, 0x0e, 0x37, 0x76, 0xbe, 0x8a, 0x45, 0xf8, 0xa1, 0x42, 0x79, 0xcf, 0x38, 0x28, 0xa0, 0x43, 0xaa, 0xc8, 0x7e, 0xba, 0x7b, 0x2d, 0x57, 0x88, 0x4b, 0xb3, + 0x54, 0x67, 0x06, 0x3e, 0xac, 0xd0, 0x4c, 0x21, 0xca, 0x44, 0x34, 0x38, 0xb0, 0x59, 0x2a, 0x61, 0xdb, 0xc5, 0x8f, 0xa4, 0xca, 0xc8, 0xfa, 0x78, 0xc9, 0x13, 0x1f, 0x2f, 0x9d, 0xf9, 0x19, 0xf3, + 0x5e, 0x91, 0x9a, 0x93, 0xf1, 0x18, 0xa8, 0x8e, 0x52, 0x53, 0x75, 0xbd, 0x34, 0xd9, 0x00, 0x26, 0xdb, 0xb3, 0xc3, 0x9f, 0x8a, 0x16, 0x3f, 0x28, 0xd1, 0x27, 0x58, 0x22, 0x64, 0x9e, 0x2a, 0xb5, + 0x33, 0xd7, 0x5b, 0x0b, 0xfe, 0x52, 0x09, 0x5e, 0x52, 0x17, 0x8c, 0x33, 0xb0, 0xcf, 0x3b, 0x94, 0xa8, 0x1d, 0x5e, 0xa4, 0x17, 0x11, 0x02, 0xe7, 0xf5, 0x10, 0x61, 0xd6, 0xc6, 0x7e, 0x62, 0xb7, + 0x5e, 0xb3, 0x69, 0xdf, 0x45, 0x32, 0x09, 0x35, 0x98, 0x52, 0x33, 0x03, 0x17, 0xcf, 0x25, 0xdb, 0xeb, 0xb5, 0x7a, 0x9b, 0xde, 0xbf, 0xa7, 0x69, 0xfd, 0x8a, 0x38, 0xf0, 0x6f, 0x65, 0x21, 0x46, + 0x6e, 0x7d, 0x4d, 0x47, 0xef, 0x5b, 0x6d, 0xc2, 0x43, 0x03, 0xba, 0x9b, 0x49, 0x18, 0x76, 0xe0, 0xe8, 0xcc, 0xe5, 0x39, 0x90, 0x08, 0xaf, 0x00, 0xe4, 0xac, 0x2a, 0xb5, 0x98, 0xf3, 0x33, 0x31, + 0xec, 0xc4, 0x2b, 0x5d, 0x06, 0xd1, 0x4b, 0xf5, 0x96, 0xd9, 0x5f, 0xd8, 0x67, 0x29, 0xbb, 0xc7, 0xf5, 0x39, 0x78, 0xb8, 0x1c, 0x25, 0x1c, 0x93, 0x9d, 0x02, 0xfa, 0x1c, 0x30, 0x2a, 0xae, 0xcd, + 0x19, 0x3d, 0x35, 0x6e, 0x54, 0x56, 0x68, 0x78, 0x35, 0x50, 0x89, 0x47, 0x0f, 0x85, 0x3c, 0x4a, 0xa6, 0xc5, 0x80, 0x55, 0x50, 0x90, 0xaa, 0x7e, 0xc2, 0x30, 0xa5, 0xe7, 0x9f, 0x92, 0x63, 0xfa, + 0x8a, 0xa5, 0xd2, 0x28, 0x8a, 0xcb, 0xa2, 0xc4, 0xcf, 0xbb, 0x69, 0x07, 0x89, 0x1b, 0x9d, 0xe1, 0xcd, 0xcd, 0x17, 0x06, 0xc1, 0x48, 0x84, 0xa6, 0x9d, 0xae, 0xd3, 0x64, 0xf3, 0x12, 0xc7, 0xf7, + 0x53, 0xf4, 0x6e, 0xef, 0x0a, 0x1c, 0xf2, 0x63, 0xd1, 0x0b, 0xd6, 0xa3, 0x12, 0x50, 0x84, 0xd4, 0x07, 0x2d, 0xd2, 0xcf, 0x3b, 0x56, 0x26, 0xb6, 0x46, 0xb8, 0xb2, 0xeb, 0x9b, 0xa1, 0x5f, 0x45, + 0xe1, 0x55, 0xa7, 0x10, 0x4e, 0x89, 0x52, 0xa8, 0xc9, 0xf7, 0xc8, 0xb8, 0xae, 0xc3, 0x83, 0x97, 0x6d, 0xbb, 0xc7, 0x69, 0x90, 0xd6, 0xbd, 0xa9, 0xdd, 0xba, 0x90, 0x23, 0x83, 0xaa, 0xab, 0xbc, + 0xfa, 0x4b, 0xe3, 0x0c, 0x5c, 0xf1, 0x60, 0x81, 0x8b, 0x40, 0xc9, 0x32, 0x97, 0x9a, 0x12, 0x47, 0xc3, 0x67, 0xf7, 0x8a, 0xb7, 0x7c, 0xac, 0x96, 0x58, 0x0f, 0xc6, 0xe2, 0xa1, 0x7a, 0x9e, 0xb2, + 0xdb, 0x2e, 0xe9, 0xf9, 0xa3, 0xea, 0x3f, 0xcf, 0x99, 0x29, 0x54, 0xc5, 0x41, 0xdc, 0xf5, 0x48, 0xd3, 0x2c, 0x79, 0x94, 0xc5, 0x81, 0x8a, 0x45, 0x14, 0xac, 0x2b, 0x19, 0x07, 0xba, 0x42, 0x5f, + 0x15, 0x0b, 0xd8, 0x7a, 0x71, 0xc3, 0x16, 0x9c, 0x65, 0xe2, 0x2c, 0xaa, 0xba, 0x29, 0xe0, 0x85, 0xb6, 0x8a, 0x93, 0x59, 0x21, 0xef, 0x2d, 0x1e, 0x47, 0xfb, 0xc1, 0x44, 0x19, 0xd3, 0xb5, 0x08, + 0xb1, 0xb2, 0xb4, 0x35, 0x48, 0x32, 0x5b, 0xd4, 0xf2, 0xfe, 0x4c, 0x4c, 0xdc, 0x8f, 0x9a, 0x5d, 0x6d, 0x56, 0xfe, 0xe5, 0xe3, 0x4f, 0xd0, 0x9e, 0xc7, 0x23, 0x7b, 0x62, 0x40, 0x0d, 0xf3, 0x33, + 0x32, 0x32, 0x91, 0x93, 0x52, 0x03, 0xf9, 0xda, 0x9c, 0xe8, 0x13, 0xbe, 0x09, 0xa1, 0x93, 0x79, 0x1a, 0x42, 0x4f, 0x82, 0xc3, 0x0f, 0xc8, 0x59, 0x19, 0x2b, 0x40, 0x7d, 0xe6, 0x72, 0xbb, 0x6e, + 0x4f, 0xa8, 0xb4, 0xda, 0xb6, 0x6e, 0xb7, 0xb0, 0x92, 0xf9, 0x0c, 0xfe, 0xb2, 0x87, 0x92, 0xbe, 0x7a, 0x17, 0xc2, 0x4b, 0x1c, 0x01, 0x01, 0xcb, 0xfd, 0x98, 0x05, 0x1b, 0x25, 0x44, 0x5f, 0x54, + 0x27, 0x5d, 0x88, 0xf8, 0xfe, 0x75, 0x7a, 0xd6, 0xe4, 0xa1, 0xcf, 0x72, 0x8e, 0x27, 0x5f, 0x19, 0x3a, 0x2f, 0x87, 0x32, 0x99, 0x0c, 0xee, 0x8b, 0x32, 0x55, 0x38, 0x7e, 0x69, 0x05, 0x4a, 0x63, + 0x93, 0x17, 0xf4, 0x4c, 0xbe, 0x50, 0x35, 0x2b, 0x3e, 0xbf, 0xf4, 0xa2, 0x63, 0x86, 0x3f, 0x56, 0x0a, 0x38, 0x87, 0x69, 0x3a, 0xaf, 0x1c, 0x9c, 0xac, 0x46, 0x23, 0x37, 0xd7, 0x7f, 0x8d, 0xb9, + 0x86, 0xbf, 0x6c, 0x89, 0x75, 0x14, 0xac, 0x99, 0xb5, 0x39, 0xa7, 0xbd, 0xec, 0xde, 0x1d, 0x3e, 0x2c, 0xe8, 0xf0, 0x5a, 0xfc, 0x25, 0x34, 0x32, 0xb2, 0x20, 0xa9, 0xa6, 0xee, 0x27, 0xbb, 0xf4, + 0x7c, 0xf8, 0xf5, 0x29, 0x09, 0xe3, 0x91, 0x8d, 0x27, 0xd5, 0xda, 0xc0, 0x9c, 0x04, 0x53, 0x27, 0x83, 0xe3, 0x91, 0x93, 0xef, 0x07, 0xb3, 0x48, 0x7a, 0x5c, 0x30, 0xb0, 0x80, 0xc0, 0x38, 0xdb, + 0xc6, 0x6e, 0xa7, 0xd2, 0x33, 0x63, 0x6d, 0x3e, 0x63, 0x17, 0xbd, 0xfe, 0xd7, 0xd6, 0xc8, 0xdc, 0xff, 0xf9, 0xcd, 0x4d, 0x8e, 0x71, 0xbe, 0x43, 0xf8, 0xf3, 0xd7, 0xd6, 0x72, 0xff, 0x18, 0xcf, + 0x59, 0xf8, 0x66, 0x59, 0xba, 0x67, 0xbf, 0x73, 0xf7, 0x4a, 0xbd, 0xb7, 0x54, 0xd4, 0x8b, 0x90, 0xc7, 0x68, 0x5d, 0x61, 0x98, 0x40, 0xd0, 0x6a, 0x74, 0x7f, 0x2e, 0x79, 0xe5, 0x9f, 0x8a, 0x4c, + 0x1e, 0x70, 0xbc, 0x7f, 0x91, 0x44, 0xd9, 0x5a, 0xd7, 0x1d, 0xf6, 0xf9, 0x9b, 0x5e, 0x32, 0xfb, 0xbb, 0x7b, 0x9b, 0x2b, 0x1f, 0xf2, 0xef, 0x63, 0xdc, 0xfc, 0xd9, 0xf1, 0x5a, 0xe0, 0xb8, 0x41, + 0x60, 0xf8, 0x32, 0xaf, 0xb8, 0x7f, 0xd0, 0x4b, 0x72, 0xbf, 0x39, 0xb9, 0xfd, 0xe8, 0x2f, 0xe7, 0xd1, 0x98, 0xc1, 0xf9, 0xbf, 0xfb, 0xcb, 0xe9, 0xcf, 0x7f, 0xad, 0xd9, 0x4f, 0x33, 0x18, 0x0f, + 0xf7, 0x67, 0x85, 0x07, 0xde, 0xff, 0xce, 0xa5, 0xfd, 0x6a, 0xc3, 0xc8, 0xf1, 0xf6, 0xfa, 0x4d, 0xd7, 0xd1, 0x81, 0x9f, 0x8d, 0xcb, 0xfd, 0xd1, 0xe1, 0xe5, 0xcb, 0x6e, 0x7f, 0xf3, 0x91, 0x63, + 0x58, 0xbf, 0xf9, 0x81, 0x17, 0xc0, 0xfd, 0x2e, 0xd8, 0xc0, 0xfd, 0x26, 0xd8, 0x00, 0xfc, 0x5b, 0xc5, 0x06, 0x3d, 0xd5, 0xce, 0xab, 0x75, 0x1e, 0xa8, 0xf7, 0xec, 0x37, 0x8a, 0x15, 0x58, 0xae, + 0xb6, 0xe1, 0x75, 0xcb, 0x13, 0x84, 0x54, 0x0f, 0x93, 0x7f, 0x4a, 0x89, 0xa7, 0xe4, 0xf9, 0xcb, 0x84, 0x84, 0x2e, 0x39, 0x89, 0xde, 0x60, 0x3f, 0x04, 0x90, 0x5b, 0xb1, 0x7b, 0x6f, 0xf5, 0x8a, + 0xe1, 0xfb, 0xdb, 0xe2, 0x51, 0xd0, 0xa1, 0x1b, 0xed, 0x76, 0x5e, 0xe7, 0x45, 0x3c, 0xdc, 0xbe, 0x74, 0xdf, 0xcf, 0xfb, 0xb4, 0x03, 0x41, 0xb5, 0xeb, 0xd8, 0x40, 0x3b, 0x31, 0x1f, 0xc6, 0xf3, + 0x50, 0x44, 0xef, 0xf9, 0x34, 0xe4, 0xa8, 0x20, 0x42, 0x86, 0x3a, 0x8f, 0x0b, 0xb2, 0x03, 0x15, 0x4b, 0xb7, 0x68, 0x03, 0xec, 0x8f, 0xc9, 0xd2, 0x36, 0x74, 0x54, 0x15, 0xaf, 0xfc, 0x95, 0x54, + 0xfb, 0x77, 0x09, 0x1e, 0xc9, 0x74, 0x78, 0x75, 0x07, 0x83, 0xd4, 0x48, 0x4a, 0xfa, 0xdd, 0x3d, 0x53, 0x15, 0x67, 0x55, 0x66, 0xfe, 0x9c, 0xd4, 0xfa, 0xcb, 0xda, 0x99, 0x69, 0x59, 0xe6, 0xfc, + 0x8d, 0x7c, 0x55, 0x32, 0xb2, 0xf8, 0xd0, 0x65, 0x91, 0xd0, 0x39, 0xbc, 0xb2, 0x54, 0x1a, 0xaf, 0xdb, 0x7a, 0xcc, 0x25, 0xe7, 0x30, 0x1b, 0x72, 0x8f, 0x11, 0x65, 0xd1, 0x7a, 0x7b, 0xcd, 0x7f, + 0xfb, 0x7b, 0x6f, 0x40, 0xda, 0x07, 0x90, 0x06, 0x1b, 0x57, 0xca, 0x52, 0x6f, 0x2d, 0xfa, 0xad, 0xe7, 0x88, 0x60, 0xe5, 0x8a, 0x90, 0x2f, 0x3f, 0xbb, 0x53, 0xc6, 0xb0, 0x50, 0xea, 0x01, 0xf9, + 0xd5, 0x55, 0x50, 0xeb, 0x8d, 0x2b, 0xe5, 0x18, 0x6c, 0x94, 0x8a, 0x2a, 0x8f, 0x5f, 0x77, 0x2a, 0x3a, 0x75, 0xc6, 0x8d, 0xbb, 0x06, 0x3b, 0x53, 0xd6, 0x07, 0x2d, 0x90, 0x8b, 0xd4, 0x55, 0xb8, + 0xd8, 0xf7, 0x0f, 0xd2, 0xbe, 0x12, 0x98, 0x29, 0xce, 0x6b, 0x9f, 0xdf, 0x9f, 0x29, 0xc5, 0x93, 0x0f, 0xbb, 0x93, 0x3b, 0xbd, 0xfd, 0xed, 0x97, 0xfc, 0xfa, 0x7f, 0x88, 0xef, 0xf4, 0x96, 0x3e, + 0xbf, 0xfc, 0xfb, 0xeb, 0x2f, 0xca, 0x9e, 0x16, 0x60, 0xf9, 0xdf, 0x1f, 0x8b, 0x2f, 0x6f, 0xfe, 0xfa, 0xa0, 0x6a, 0xbc, 0x4e, 0x39, 0xbc, 0x0f, 0xc6, 0x7f, 0x50, 0x3b, 0x0d, 0xae, 0x57, 0xf4, + 0xda, 0xbf, 0xc9, 0x88, 0xa6, 0x62, 0x77, 0xe7, 0x3f, 0x75, 0x02, 0xc0, 0x8f, 0xad, 0x40, 0xa7, 0xd0, 0x2b, 0x0f, 0xce, 0x75, 0x0c, 0xd6, 0x75, 0xfc, 0x68, 0xd6, 0x3a, 0xaa, 0xfd, 0xf7, 0xeb, + 0x42, 0xdf, 0x77, 0xf5, 0x10, 0xdf, 0x52, 0x62, 0x33, 0x2f, 0xcf, 0xae, 0x5a, 0x55, 0x43, 0x89, 0xd3, 0x1a, 0x85, 0xf0, 0x50, 0xe7, 0x98, 0x70, 0x5a, 0x7e, 0x51, 0x09, 0xc8, 0xda, 0xc7, 0x1e, + 0xf8, 0xda, 0x0a, 0x5c, 0x6d, 0x73, 0xae, 0xcb, 0xdc, 0x97, 0x1b, 0xe2, 0xa7, 0xd5, 0x7b, 0xc4, 0x5d, 0xbf, 0xa8, 0x47, 0x10, 0x6b, 0xd3, 0x86, 0x7e, 0x66, 0x77, 0xd3, 0x72, 0x5a, 0xb5, 0x94, + 0xa1, 0xc0, 0x48, 0x41, 0x1e, 0x1a, 0xa9, 0xa0, 0x84, 0x99, 0x74, 0x48, 0x16, 0x6c, 0x04, 0xd7, 0x74, 0x90, 0xc4, 0x3f, 0xc9, 0x25, 0x7c, 0xf0, 0x7f, 0x2f, 0x97, 0x44, 0x87, 0xc2, 0x3c, 0x91, + 0x8f, 0x54, 0xf2, 0x07, 0x37, 0xe2, 0x57, 0xd8, 0x96, 0x3b, 0x08, 0xfd, 0xd9, 0x67, 0xe2, 0x7f, 0x33, 0x97, 0x04, 0xe1, 0x3f, 0xc8, 0x25, 0xfc, 0x0f, 0x5e, 0x95, 0x3f, 0xe4, 0x12, 0xef, 0xfd, + 0xbf, 0x9e, 0x4b, 0x84, 0xe0, 0x7f, 0x94, 0x4b, 0x2c, 0x5e, 0x43, 0xe2, 0x17, 0x27, 0x33, 0x43, 0xd9, 0xa1, 0xd1, 0x28, 0xbf, 0x3f, 0xe9, 0x8d, 0xc1, 0xf1, 0x4e, 0xd8, 0x82, 0xb2, 0x0c, 0x1a, + 0x8a, 0xa7, 0x6e, 0x4b, 0x86, 0x45, 0x21, 0x2d, 0x67, 0x93, 0xf4, 0xca, 0xec, 0x66, 0x24, 0xf0, 0x72, 0x58, 0x16, 0x34, 0x40, 0x6e, 0xf0, 0x89, 0x43, 0xbf, 0x2c, 0x1e, 0x6a, 0xb5, 0xa7, 0xa4, + 0x71, 0xa5, 0x7e, 0xe6, 0xf9, 0x59, 0xb2, 0x67, 0xb3, 0x0f, 0xfb, 0x96, 0x66, 0xfe, 0xd5, 0x74, 0xea, 0x51, 0x3d, 0xa6, 0x12, 0x09, 0x3a, 0xd7, 0x1d, 0x8f, 0x17, 0xe8, 0xbc, 0x29, 0x2a, 0x4e, + 0x72, 0x6a, 0xe6, 0x8e, 0x29, 0xaf, 0xed, 0x61, 0x55, 0x80, 0x39, 0xf9, 0xef, 0xe6, 0x12, 0xd2, 0xa6, 0x9d, 0x18, 0x31, 0x3f, 0xf6, 0x88, 0x09, 0x1c, 0x3a, 0x59, 0xe5, 0x92, 0xdc, 0x2a, 0x0c, + 0x6e, 0xbd, 0xf6, 0xff, 0x22, 0x97, 0x04, 0xf0, 0xff, 0xd5, 0x5c, 0xe2, 0x04, 0xf1, 0xff, 0x1f, 0x73, 0xc9, 0xd5, 0xde, 0xa2, 0x3a, 0x44, 0x6c, 0x34, 0x04, 0x8d, 0xe9, 0xc5, 0x74, 0x2c, 0x7c, + 0xb4, 0xe3, 0x65, 0xbe, 0x6e, 0x63, 0x48, 0x6d, 0x6f, 0x21, 0x6a, 0xec, 0x1d, 0x99, 0x54, 0xa4, 0x7b, 0xe4, 0xd8, 0x50, 0x38, 0x4b, 0x5f, 0x60, 0x0f, 0x2d, 0xce, 0x1a, 0x52, 0x91, 0xe6, 0x82, + 0xcc, 0xe0, 0x7c, 0xcd, 0x25, 0xef, 0x32, 0x3b, 0xde, 0x37, 0x69, 0x3b, 0xcd, 0x7a, 0x4e, 0x06, 0x4d, 0x38, 0xca, 0x4e, 0xab, 0xb6, 0x2c, 0x2c, 0x6f, 0x01, 0xf1, 0x4b, 0x03, 0x0b, 0x27, 0xdc, + 0x14, 0x54, 0xc6, 0xb4, 0x57, 0x25, 0xad, 0x4a, 0x1d, 0x4a, 0x2a, 0x6b, 0x90, 0xdb, 0xda, 0x0e, 0x1f, 0xd0, 0xcb, 0x83, 0xf4, 0xf0, 0x2f, 0x73, 0x49, 0x53, 0x35, 0x6c, 0x31, 0xaf, 0xdf, 0x05, + 0xab, 0x2c, 0x84, 0x44, 0x7f, 0x4b, 0x2b, 0x22, 0xf6, 0xd7, 0xc2, 0x37, 0x7f, 0x9b, 0x53, 0x44, 0x8f, 0x65, 0xe9, 0xd7, 0xf7, 0xfb, 0x62, 0x9b, 0x2d, 0x58, 0xef, 0x95, 0xdc, 0x08, 0x9c, 0x35, + 0x98, 0x55, 0x1f, 0x1a, 0xc3, 0x8e, 0x1b, 0x79, 0xff, 0x29, 0xa7, 0x98, 0xbf, 0xba, 0x2f, 0x8e, 0x74, 0xe6, 0xbb, 0x51, 0x9c, 0xe9, 0x88, 0xdd, 0x90, 0xf8, 0x46, 0x97, 0x0d, 0xf6, 0x22, 0xf3, + 0xdd, 0x16, 0x5f, 0xe8, 0xa9, 0xb4, 0xf4, 0xfb, 0x1b, 0xc3, 0x4f, 0xf2, 0x9d, 0xe9, 0x05, 0x77, 0x5f, 0x85, 0x6f, 0xfe, 0xa0, 0x44, 0xc5, 0xe9, 0x28, 0x60, 0xb0, 0xdf, 0xc2, 0x3a, 0x7b, 0xfe, + 0x4b, 0x8a, 0x8a, 0x3f, 0x0d, 0xef, 0x67, 0xbb, 0x68, 0xfe, 0x34, 0x38, 0xf9, 0xfe, 0x96, 0x5b, 0xbc, 0x9f, 0xec, 0xa2, 0x83, 0x40, 0x3f, 0x01, 0xe1, 0xa6, 0x83, 0x6f, 0x9c, 0x43, 0xee, 0xfd, + 0xaf, 0x6f, 0xd5, 0x58, 0x46, 0x49, 0x7b, 0x7d, 0xd3, 0xdd, 0xf8, 0x50, 0xbe, 0x67, 0xbb, 0x27, 0x9f, 0x84, 0xf9, 0xf4, 0x55, 0xf4, 0x86, 0xfd, 0x51, 0x61, 0x8a, 0xfe, 0xea, 0x26, 0xf3, 0x6d, + 0xb6, 0x40, 0x32, 0xfe, 0x4e, 0x61, 0x4a, 0x17, 0xf8, 0x31, 0x23, 0x9d, 0xee, 0xc9, 0x26, 0x48, 0x63, 0xb2, 0x86, 0x5d, 0x1a, 0x90, 0xbe, 0xc4, 0x43, 0xae, 0x9d, 0x25, 0x92, 0x3d, 0xbd, 0x7b, + 0xcf, 0x81, 0x4e, 0x52, 0x5c, 0x22, 0x93, 0x89, 0x87, 0x79, 0xe3, 0x05, 0xbc, 0xc6, 0xb2, 0x79, 0xbd, 0xe6, 0x65, 0x20, 0x13, 0xcd, 0x78, 0x6e, 0xf9, 0xa2, 0x10, 0x7a, 0xe5, 0x51, 0x3e, 0x21, + 0xb2, 0xf5, 0xb3, 0xd7, 0xf9, 0x8b, 0x90, 0xa0, 0x4c, 0xb5, 0x44, 0xde, 0xb6, 0x9b, 0x8e, 0x9c, 0xec, 0xca, 0x44, 0x59, 0x6d, 0x82, 0xee, 0x60, 0xbc, 0xa7, 0xb5, 0x05, 0x06, 0xd4, 0x7d, 0xf6, + 0xfe, 0x33, 0x1e, 0x65, 0xe2, 0x19, 0x98, 0x45, 0x70, 0xfd, 0x4e, 0x08, 0xff, 0x43, 0x1e, 0xd1, 0x05, 0xc7, 0x09, 0x98, 0xd7, 0xe7, 0x26, 0x06, 0x4d, 0x98, 0x71, 0x99, 0x95, 0x5d, 0x06, 0x65, + 0xe5, 0x92, 0x11, 0x3e, 0x3f, 0xa6, 0x11, 0xe0, 0x6f, 0xcf, 0xf3, 0xfe, 0xa4, 0x30, 0x55, 0xd1, 0xba, 0xe8, 0xb3, 0xba, 0xcd, 0x2a, 0xc9, 0xf8, 0x94, 0xb0, 0xc7, 0x4d, 0xa6, 0x9d, 0xcf, 0xc1, + 0x61, 0xbe, 0x00, 0xca, 0x1b, 0xe7, 0xce, 0x1d, 0x51, 0x1e, 0xd7, 0xe2, 0xed, 0x5a, 0x8e, 0xb7, 0x9a, 0xd3, 0x41, 0x7d, 0x37, 0xc5, 0xa7, 0xd1, 0x9a, 0xd7, 0xcb, 0xd6, 0x2a, 0xb1, 0x2e, 0xec, + 0xc4, 0x19, 0xfc, 0x06, 0x3c, 0x66, 0x94, 0xd5, 0xf9, 0x92, 0x13, 0xa2, 0xed, 0x1c, 0x15, 0xf1, 0xe5, 0xbe, 0xcc, 0xd1, 0x92, 0xee, 0xd1, 0xa9, 0x12, 0x4d, 0xb3, 0xe4, 0x13, 0xa0, 0x15, 0x37, + 0x8f, 0x97, 0x46, 0xd9, 0x9d, 0x9e, 0x17, 0xcc, 0xbe, 0x7b, 0x1c, 0x22, 0xca, 0x45, 0x2f, 0xae, 0x65, 0x31, 0xef, 0x42, 0xee, 0x92, 0x63, 0x8a, 0xd0, 0xa7, 0xff, 0x9a, 0xe0, 0xfb, 0x87, 0x80, + 0x72, 0x5c, 0x1a, 0x85, 0x28, 0xfc, 0x1f, 0xc5, 0xd3, 0xdf, 0x85, 0x93, 0xf0, 0x6a, 0x59, 0x96, 0x86, 0xf0, 0x7f, 0x85, 0x93, 0xd5, 0x43, 0x85, 0xda, 0xe2, 0xe5, 0x3a, 0x7d, 0xf4, 0xbb, 0x50, + 0x90, 0xe1, 0xb6, 0x9a, 0x5f, 0x53, 0x30, 0x8c, 0x9f, 0x47, 0x75, 0x82, 0x7f, 0x14, 0x52, 0x1e, 0xdd, 0x7e, 0x0f, 0x29, 0xfe, 0x4f, 0x21, 0xe5, 0xfa, 0x10, 0x0f, 0x01, 0x3a, 0xf7, 0x86, 0xbf, + 0xe1, 0xb6, 0x73, 0xfb, 0xbf, 0x51, 0x31, 0x5a, 0xfe, 0xd0, 0x3d, 0xfe, 0xf9, 0xe3, 0x69, 0xb7, 0xc1, 0xc5, 0x5f, 0xd6, 0x20, 0xbd, 0xd5, 0x9f, 0xa6, 0xe7, 0x63, 0x61, 0xfb, 0xc7, 0x5d, 0xfd, + 0xf3, 0x40, 0xff, 0x07, 0xbb, 0xfa, 0xb2, 0x29, 0xe0, 0xc7, 0x5d, 0xfd, 0x73, 0xad, 0x28, 0xf6, 0x86, 0x2c, 0x4f, 0x29, 0x1c, 0x31, 0x07, 0xcb, 0xb3, 0xaf, 0x8a, 0x52, 0x7f, 0x16, 0x2e, 0x09, + 0x10, 0x32, 0xff, 0x48, 0xda, 0xd0, 0xd4, 0xe6, 0x72, 0x40, 0x3e, 0x20, 0xc6, 0x40, 0x88, 0xa5, 0x2b, 0xc8, 0x87, 0xb5, 0xb7, 0xd7, 0x1e, 0x9e, 0x11, 0x5c, 0xd7, 0xea, 0x26, 0x35, 0x8b, 0xd9, + 0xf6, 0xe3, 0xf4, 0x6e, 0x16, 0x6d, 0xd0, 0xba, 0xbd, 0xd8, 0x4f, 0x71, 0x41, 0x86, 0x89, 0x36, 0x27, 0xeb, 0x14, 0x21, 0x98, 0x7d, 0x28, 0xc2, 0xbe, 0xf9, 0x00, 0xed, 0xc1, 0x84, 0x06, 0x56, + 0x1e, 0x93, 0x08, 0xa8, 0x24, 0xa3, 0x23, 0xca, 0x47, 0x55, 0x05, 0x3a, 0x2f, 0x11, 0x0b, 0xef, 0x79, 0x40, 0x39, 0xa7, 0x08, 0x1f, 0xc7, 0x5b, 0x7b, 0x10, 0xbb, 0x4c, 0xae, 0xa3, 0xef, 0xf5, + 0x9c, 0x9a, 0x0b, 0x9f, 0x6a, 0x3a, 0xaa, 0x25, 0x33, 0x8d, 0xab, 0xd4, 0xa3, 0x3c, 0xdb, 0xaf, 0xa2, 0x05, 0xd9, 0x62, 0x01, 0xd6, 0x6b, 0xa3, 0x72, 0x65, 0x89, 0xb4, 0x52, 0x65, 0xe0, 0x0e, + 0x3e, 0x50, 0x57, 0x8f, 0xac, 0xb1, 0x56, 0xf9, 0xc6, 0xb2, 0xf1, 0xe5, 0x91, 0x23, 0x95, 0x1e, 0x2d, 0xbe, 0xa2, 0x8e, 0xcc, 0x4b, 0x9f, 0x44, 0xd8, 0xc3, 0x3d, 0x12, 0x27, 0xda, 0x89, 0x1c, + 0x82, 0x26, 0xa7, 0x78, 0xdc, 0x02, 0xb9, 0xa5, 0xbd, 0x44, 0x18, 0x45, 0xab, 0x28, 0x01, 0x6e, 0x73, 0x5f, 0x8e, 0x5b, 0x82, 0x9e, 0x78, 0x36, 0x05, 0x32, 0x67, 0x39, 0xc2, 0xaa, 0xa7, 0x37, + 0x5b, 0x90, 0xe4, 0x9d, 0x4b, 0x98, 0xc3, 0x0d, 0xfe, 0x13, 0xcc, 0x24, 0xda, 0x78, 0x72, 0xb3, 0x63, 0x80, 0xcc, 0x32, 0xbc, 0x76, 0x5a, 0x50, 0x8c, 0x98, 0x20, 0x9f, 0x8c, 0x29, 0x85, 0x24, + 0x7f, 0x98, 0x41, 0x29, 0x81, 0x6d, 0x64, 0x0e, 0x01, 0xc0, 0xe5, 0x51, 0x53, 0x32, 0x4c, 0xf3, 0xe9, 0xf7, 0xc3, 0x8a, 0xd2, 0xdb, 0xc2, 0xad, 0x71, 0xd1, 0x25, 0x8a, 0xc0, 0xa7, 0xc8, 0x4b, + 0x2e, 0x71, 0x3a, 0x1b, 0x48, 0xcd, 0xf8, 0x85, 0x9b, 0xa9, 0xf7, 0xde, 0xf4, 0x3a, 0x4c, 0xcb, 0xeb, 0x1d, 0x1c, 0x3b, 0x39, 0x80, 0xbb, 0x50, 0xda, 0xba, 0x90, 0x1c, 0xea, 0x62, 0x49, 0x1e, + 0xe7, 0x53, 0x1f, 0xc0, 0x8b, 0x8a, 0x88, 0x4e, 0xb8, 0xf3, 0x35, 0x17, 0xc8, 0xbd, 0x81, 0x26, 0x61, 0x5e, 0x5d, 0x9e, 0x7d, 0x16, 0xf4, 0x21, 0xb4, 0x14, 0xd1, 0xd4, 0x8c, 0xde, 0x90, 0xc5, + 0x4d, 0xe5, 0x9a, 0x13, 0x37, 0xc1, 0xf6, 0x94, 0xdd, 0x12, 0x1f, 0x34, 0xe4, 0x7d, 0x28, 0xaf, 0x0d, 0x4f, 0x2e, 0x08, 0x1c, 0xbc, 0x9d, 0x17, 0x1e, 0x59, 0xae, 0xed, 0xfb, 0x05, 0xdc, 0x78, + 0x4a, 0xa2, 0xa7, 0xbd, 0x74, 0x53, 0x55, 0xb7, 0x9a, 0xeb, 0xe0, 0x4e, 0x57, 0x55, 0xa0, 0x7c, 0xa8, 0xc7, 0xeb, 0xf6, 0x8d, 0x30, 0x36, 0x8f, 0x74, 0x3a, 0xd1, 0x51, 0x8f, 0xe5, 0x63, 0x7c, + 0x08, 0x6a, 0x9a, 0x6e, 0x12, 0xec, 0xa5, 0x8b, 0xa8, 0x28, 0x7b, 0xa4, 0x5e, 0x31, 0x08, 0xba, 0xe3, 0x9e, 0x95, 0x51, 0xa8, 0x68, 0x18, 0x08, 0xe8, 0x2f, 0xd4, 0x4a, 0x8b, 0xc6, 0xf2, 0x20, + 0xb8, 0xb5, 0x40, 0xf2, 0x89, 0xaf, 0x94, 0x12, 0xbd, 0x45, 0xab, 0xde, 0x87, 0x33, 0x47, 0x3a, 0x4d, 0x24, 0xdc, 0x36, 0x6a, 0x40, 0xc2, 0xa9, 0x34, 0xfb, 0x55, 0x1b, 0x45, 0x34, 0x06, 0xd6, + 0xbd, 0xd6, 0x47, 0x23, 0xed, 0x26, 0x9d, 0x86, 0x61, 0x47, 0x95, 0x46, 0x59, 0xc2, 0xec, 0x43, 0x97, 0xdf, 0xc0, 0x91, 0x8d, 0x8c, 0xe9, 0x3f, 0x8c, 0x71, 0xe1, 0x7d, 0x9b, 0x79, 0x64, 0xaf, + 0xd5, 0xd7, 0x59, 0x3f, 0x0d, 0xc9, 0x95, 0x73, 0x5c, 0xe9, 0x15, 0x9a, 0x6f, 0x4b, 0x5b, 0xab, 0xd1, 0x31, 0xd3, 0x8f, 0xce, 0xc3, 0x87, 0xb8, 0xbe, 0x08, 0x0b, 0xff, 0x23, 0x25, 0xe3, 0x3b, + 0xcb, 0x02, 0x10, 0x2a, 0xdb, 0xf7, 0x3d, 0x3d, 0x23, 0xbc, 0x17, 0x3d, 0x9f, 0xa5, 0xa7, 0x64, 0xcf, 0x29, 0xb1, 0xd4, 0xdd, 0x6b, 0xf4, 0xc7, 0x02, 0xf1, 0xff, 0x46, 0xdf, 0xef, 0xd7, 0x25, + 0xe3, 0xcf, 0x0e, 0x0a, 0xfa, 0x77, 0x01, 0x25, 0x91, 0xed, 0xe7, 0xe7, 0x5a, 0x06, 0xd4, 0x47, 0x81, 0xa1, 0xd5, 0xfe, 0x64, 0x76, 0x6b, 0xb8, 0x12, 0x08, 0x89, 0xfc, 0x51, 0x2b, 0x22, 0x62, + 0x9d, 0x9c, 0xa5, 0xc4, 0x84, 0xb2, 0x43, 0x31, 0x04, 0x67, 0x7c, 0xad, 0xd4, 0xe7, 0x01, 0x88, 0x91, 0x5c, 0x8c, 0x64, 0x2f, 0x81, 0x9f, 0x8e, 0x7b, 0x29, 0x31, 0x7e, 0x09, 0x3a, 0xcf, 0xce, + 0x2f, 0x66, 0x23, 0x1d, 0x89, 0x36, 0xfa, 0x52, 0x64, 0x2a, 0x62, 0xa9, 0x88, 0xdb, 0x30, 0xc7, 0x37, 0x45, 0xc1, 0xbb, 0x2c, 0xb2, 0xdb, 0xbb, 0xa9, 0x4b, 0x63, 0xcb, 0x73, 0xcc, 0x20, 0x24, + 0xcb, 0x58, 0x6d, 0x33, 0x81, 0x09, 0xcb, 0xad, 0x0d, 0xa0, 0x1b, 0x4e, 0xf8, 0xec, 0x76, 0xe8, 0xc8, 0x17, 0x7f, 0x4a, 0x96, 0x57, 0x5c, 0x65, 0xb1, 0x2d, 0x3c, 0xa2, 0x77, 0x7e, 0x65, 0x27, + 0xbe, 0x3d, 0x7d, 0x1b, 0xe9, 0x93, 0xc0, 0x08, 0x6e, 0xae, 0xa3, 0xe0, 0xc5, 0x77, 0x82, 0x48, 0x13, 0x4c, 0x74, 0x53, 0x1e, 0x9c, 0xbd, 0x4e, 0x4c, 0xd9, 0x09, 0x8f, 0xe4, 0x55, 0x7a, 0xac, + 0x2c, 0x7b, 0xa5, 0x01, 0xe8, 0x4c, 0x46, 0x6d, 0x96, 0x4a, 0x7e, 0xa4, 0xb0, 0xb2, 0xa9, 0xe3, 0xd1, 0xf8, 0x9b, 0x3d, 0xf7, 0x10, 0x87, 0x32, 0x57, 0x3b, 0x2a, 0xb1, 0xb2, 0x21, 0x70, 0xbb, + 0x5e, 0xa3, 0xed, 0xf0, 0xab, 0xc8, 0xdc, 0x4e, 0x4b, 0x78, 0x22, 0xc6, 0x98, 0x78, 0xdb, 0x63, 0x9f, 0x0d, 0x6b, 0x05, 0x94, 0x32, 0xc7, 0x77, 0xec, 0x6d, 0x73, 0x28, 0x7a, 0x20, 0xb0, 0xa1, + 0xd9, 0x10, 0x37, 0x21, 0x83, 0x50, 0x57, 0xad, 0x81, 0xe9, 0x3a, 0x81, 0x14, 0xde, 0x3e, 0xf9, 0x4d, 0xb7, 0x9a, 0x37, 0x9d, 0xab, 0x82, 0x19, 0x90, 0x4c, 0xff, 0x7a, 0xed, 0x61, 0xb7, 0x1e, + 0xa2, 0x9f, 0x3e, 0xea, 0x9e, 0x7e, 0xcc, 0x31, 0x6d, 0xb3, 0x39, 0x84, 0x29, 0x2e, 0x15, 0x97, 0xc4, 0xee, 0xe6, 0x16, 0x87, 0x38, 0x35, 0x25, 0x02, 0xa6, 0x3f, 0xc7, 0x3e, 0xc5, 0xdd, 0x5a, + 0xbb, 0x9e, 0x53, 0xee, 0xec, 0xa0, 0x65, 0x0c, 0x18, 0x5d, 0x58, 0x88, 0x1b, 0xbf, 0xd0, 0xf8, 0x99, 0x3e, 0x3e, 0xa6, 0xc7, 0xbf, 0xf6, 0xe9, 0xe2, 0x66, 0x2e, 0x08, 0x9b, 0xe4, 0xbd, 0x09, + 0x6e, 0xde, 0xb6, 0x23, 0x9a, 0x7e, 0xa8, 0x07, 0x04, 0x06, 0x04, 0x61, 0x0d, 0xae, 0xac, 0x9f, 0xa4, 0x2c, 0xd7, 0x00, 0x4a, 0x24, 0x8f, 0x09, 0x5f, 0x77, 0x02, 0x03, 0x4b, 0x4f, 0x27, 0x99, + 0x4d, 0x54, 0x3e, 0xf2, 0x8d, 0x0c, 0xac, 0x0f, 0xd3, 0x22, 0xb2, 0x1c, 0x93, 0x6e, 0xe5, 0x0c, 0x42, 0x42, 0xfb, 0xc7, 0xee, 0x97, 0xfd, 0xc5, 0xe0, 0xf4, 0x3b, 0x47, 0x2f, 0x36, 0xfe, 0xb4, + 0xb9, 0x05, 0x82, 0xe5, 0x89, 0x36, 0xdd, 0xa1, 0xfb, 0x19, 0x98, 0x1b, 0xb4, 0x0f, 0x08, 0xfb, 0x58, 0x37, 0x95, 0x16, 0x34, 0x55, 0xef, 0xe7, 0x17, 0x71, 0x85, 0x6e, 0xa3, 0x95, 0x02, 0xeb, + 0xb2, 0xfd, 0x0b, 0x35, 0x65, 0xe3, 0x79, 0x6a, 0x41, 0xf2, 0x61, 0x24, 0x11, 0xcb, 0xc4, 0xfc, 0xd5, 0x45, 0x96, 0x4f, 0xba, 0xfb, 0x13, 0x09, 0x85, 0x8f, 0x2f, 0x7b, 0xc1, 0x76, 0xd4, 0x39, + 0x2a, 0x7a, 0x61, 0x75, 0x7f, 0xba, 0xb5, 0x53, 0x80, 0xeb, 0xc3, 0xcb, 0xe4, 0x94, 0x11, 0xe9, 0x6b, 0xe1, 0x45, 0xd6, 0xe1, 0xdb, 0xe1, 0x60, 0xc8, 0xf5, 0xe8, 0x60, 0x01, 0x17, 0xfb, 0x99, + 0xc7, 0x60, 0x30, 0x74, 0xf4, 0x7e, 0x76, 0xa6, 0x81, 0x55, 0xc7, 0xbd, 0x2c, 0x26, 0x3e, 0x14, 0x94, 0x4f, 0x55, 0xb4, 0x02, 0x34, 0x85, 0x64, 0xad, 0xc1, 0xca, 0xf4, 0xa1, 0x9f, 0xd8, 0x41, + 0x8e, 0x81, 0x05, 0xa4, 0xfc, 0x3a, 0x6a, 0xe4, 0xe4, 0x53, 0xe3, 0x9d, 0xe8, 0x3b, 0xc1, 0x25, 0xa8, 0x0e, 0x9a, 0xfa, 0xeb, 0xf1, 0x57, 0x08, 0xfe, 0x05, 0xbd, 0x93, 0x66, 0xe8, 0xae, 0x5f, + 0x0d, 0x2c, 0xfc, 0x43, 0xac, 0x76, 0xbe, 0xb4, 0xd3, 0xd7, 0xf7, 0xd2, 0xd7, 0xa1, 0x65, 0xd4, 0x7a, 0xf8, 0x9b, 0x9d, 0x85, 0x75, 0xa7, 0x3f, 0x3d, 0xe8, 0xc9, 0xdb, 0xd8, 0xfa, 0xa0, 0x7f, + 0xa9, 0x0d, 0x63, 0x79, 0x3f, 0x09, 0x28, 0x7d, 0xa9, 0x34, 0xff, 0xe5, 0x1b, 0x3d, 0x7a, 0xec, 0x57, 0x44, 0x74, 0xea, 0x24, 0xc4, 0x96, 0xc2, 0xe3, 0x13, 0x9d, 0xa9, 0xbe, 0x35, 0xb0, 0xce, + 0x6f, 0x8a, 0x8a, 0xc2, 0x94, 0xf6, 0x27, 0xf6, 0xe3, 0x80, 0xc0, 0x17, 0x58, 0x06, 0xbe, 0xe0, 0xb2, 0xc1, 0xd1, 0xe7, 0xcf, 0xb8, 0xfc, 0x87, 0xb5, 0x96, 0xa6, 0x7e, 0x71, 0x0b, 0xfd, 0xdd, + 0xd5, 0x99, 0xad, 0x75, 0xe5, 0x77, 0x0f, 0xc8, 0xdf, 0xbe, 0xe5, 0x87, 0xfb, 0x37, 0x8e, 0x3f, 0x85, 0xaf, 0x58, 0x1c, 0x87, 0xdd, 0x96, 0x7e, 0x9d, 0x93, 0xff, 0x5a, 0xd1, 0xba, 0x7f, 0x27, + 0xa2, 0x0e, 0xfc, 0xd1, 0x64, 0x99, 0x86, 0x9f, 0x0c, 0xf8, 0x41, 0x92, 0xfd, 0x0d, 0xa5, 0x69, 0xff, 0xb8, 0x34, 0x1a, 0x71, 0x74, 0x23, 0x19, 0x96, 0x86, 0x3f, 0xaf, 0xc8, 0x12, 0xeb, 0xf6, + 0xd5, 0xaa, 0x19, 0x4d, 0x84, 0xc6, 0x24, 0x8b, 0x1c, 0x3c, 0x54, 0x07, 0x9f, 0x81, 0xd9, 0xd2, 0x6c, 0x8f, 0xf7, 0xfc, 0x30, 0x01, 0x4c, 0xb7, 0xbd, 0xfd, 0xe3, 0x8c, 0x9e, 0x31, 0xb2, 0x09, + 0xf3, 0x82, 0xf6, 0x59, 0xcb, 0x19, 0xd3, 0x99, 0xd5, 0x15, 0x42, 0x24, 0x98, 0x5e, 0x60, 0x30, 0x42, 0xc6, 0xe8, 0x0a, 0xd6, 0xe3, 0x3c, 0xea, 0x86, 0x38, 0xcd, 0x8d, 0x72, 0x29, 0xf2, 0xf6, + 0x7a, 0xb0, 0xd7, 0xf6, 0x8a, 0x28, 0xf5, 0xb4, 0xc8, 0x13, 0xe1, 0x72, 0xa7, 0x3d, 0xea, 0x00, 0xf2, 0x18, 0xa1, 0xb5, 0xa4, 0x88, 0x71, 0x73, 0xa5, 0x31, 0x4b, 0x76, 0xe1, 0xe0, 0x76, 0x1a, + 0x93, 0xd6, 0x8f, 0x73, 0x9a, 0x99, 0x87, 0xb8, 0x0d, 0x7c, 0x29, 0x94, 0xd4, 0x88, 0x58, 0x3f, 0x29, 0xa3, 0x8e, 0x3f, 0xa1, 0x99, 0x9d, 0x7b, 0x30, 0x85, 0x9e, 0x2c, 0xd1, 0x66, 0xfb, 0x1b, + 0x3e, 0xb7, 0x25, 0x58, 0xaf, 0x50, 0x37, 0xf7, 0xa3, 0x03, 0xb8, 0x54, 0x6f, 0xb2, 0x4b, 0x80, 0x2e, 0xfe, 0x13, 0xc6, 0x2f, 0xed, 0xa9, 0x1d, 0x4b, 0x3c, 0x95, 0xee, 0x8a, 0x6e, 0x18, 0xb3, + 0xdb, 0x02, 0xf6, 0x98, 0x12, 0xbd, 0x75, 0x32, 0x56, 0xd7, 0x3c, 0x6c, 0x46, 0xaa, 0xa4, 0xd5, 0x6c, 0x98, 0x67, 0x68, 0x89, 0x89, 0x38, 0x9b, 0xe2, 0x44, 0xbb, 0xe9, 0x24, 0xa1, 0x6e, 0x5e, + 0xd8, 0x52, 0x8b, 0x32, 0x10, 0x2d, 0xd1, 0xc1, 0x76, 0x9e, 0xe1, 0x26, 0x09, 0x48, 0x4f, 0xb7, 0xeb, 0xa8, 0xe5, 0x8a, 0x22, 0xed, 0xee, 0x74, 0xd8, 0x9a, 0xe5, 0x02, 0x96, 0x31, 0xa7, 0x18, + 0x3d, 0xa5, 0xe9, 0xf2, 0xca, 0x2c, 0x42, 0xb0, 0xa9, 0x80, 0xa4, 0xd2, 0xe0, 0xa3, 0xca, 0x44, 0x3d, 0x68, 0x8c, 0x47, 0xd5, 0x98, 0x50, 0xe4, 0x16, 0x15, 0x17, 0x8d, 0xdf, 0x06, 0xa0, 0x5a, + 0x1d, 0x2e, 0x13, 0xbc, 0x61, 0x79, 0x70, 0x02, 0xbe, 0x60, 0x86, 0xb8, 0x2e, 0xfb, 0x90, 0x56, 0xde, 0x9b, 0x57, 0x05, 0xa5, 0x31, 0x35, 0x98, 0x54, 0xf2, 0x22, 0xa2, 0xbc, 0x70, 0x0a, 0xe5, + 0x9d, 0x63, 0x75, 0x13, 0xb9, 0xee, 0xc7, 0xd4, 0xaf, 0x3a, 0xc5, 0xcc, 0x3a, 0x71, 0xb4, 0x30, 0x5b, 0xe6, 0x33, 0x6a, 0xcc, 0x2c, 0xf0, 0x6c, 0x80, 0x6e, 0x8b, 0x57, 0x6b, 0x06, 0x0a, 0xbe, + 0x31, 0x7e, 0xf6, 0xb1, 0x1d, 0xa6, 0x21, 0xb5, 0x56, 0x17, 0xd2, 0x7d, 0x0e, 0xeb, 0x45, 0x30, 0xb6, 0x41, 0xab, 0xab, 0xb7, 0x43, 0xbd, 0x12, 0xf0, 0xbd, 0x52, 0x8a, 0xad, 0x76, 0x44, 0xb4, + 0x9c, 0x51, 0xcc, 0x05, 0xcc, 0xda, 0xf9, 0xf3, 0xa4, 0xbf, 0xbb, 0x97, 0x63, 0x24, 0x0c, 0x0d, 0xb3, 0x43, 0x0a, 0xcc, 0x9d, 0x02, 0x9b, 0x17, 0x74, 0xd8, 0xca, 0xa6, 0x42, 0xbc, 0x12, 0xae, + 0x5a, 0x21, 0xd3, 0x89, 0x2b, 0x99, 0x4f, 0x33, 0xbc, 0x13, 0x3d, 0x6c, 0x41, 0xa3, 0xff, 0xd4, 0xc5, 0x79, 0xc2, 0x5c, 0x75, 0xf8, 0xba, 0xc0, 0x99, 0x78, 0x1a, 0xc2, 0xcc, 0xce, 0x74, 0x97, + 0x14, 0x5e, 0x25, 0x66, 0x33, 0x62, 0x31, 0x70, 0x16, 0xb3, 0x3e, 0xfc, 0x27, 0x10, 0x1c, 0x01, 0xa8, 0x90, 0x68, 0x24, 0xcb, 0x47, 0x06, 0x5a, 0x12, 0x01, 0xb7, 0xfc, 0xe4, 0x16, 0xc8, 0x93, + 0x45, 0xdd, 0xc1, 0x23, 0x25, 0xd8, 0x5b, 0xe4, 0x71, 0xb0, 0xe6, 0x0d, 0x55, 0x49, 0xe9, 0x71, 0xeb, 0x4e, 0xd1, 0x08, 0x16, 0x7b, 0xf1, 0xf6, 0xfa, 0xa6, 0xf1, 0xcf, 0x25, 0xe3, 0x8c, 0x72, + 0x69, 0x3d, 0xea, 0x8a, 0xd9, 0x34, 0xbb, 0xc0, 0x84, 0x47, 0xfc, 0x2a, 0x85, 0xce, 0xc7, 0x5d, 0x7e, 0x52, 0x51, 0xff, 0xa5, 0x94, 0xcb, 0x5f, 0x92, 0x17, 0x7e, 0xd7, 0x75, 0xf4, 0xaa, 0x4f, + 0x4b, 0x76, 0xed, 0x8b, 0xe2, 0x23, 0x9d, 0xc7, 0x71, 0x16, 0xdf, 0x72, 0xe8, 0xe2, 0xad, 0x3e, 0xd3, 0xa9, 0x5f, 0x0d, 0xe1, 0xff, 0x7e, 0x5b, 0xb6, 0x05, 0xc5, 0xbe, 0x31, 0x5a, 0x12, 0xa0, + 0xa6, 0x95, 0xd0, 0xcb, 0x0d, 0x48, 0xb6, 0xe1, 0x05, 0xa5, 0x1b, 0x64, 0xa6, 0x3d, 0x5b, 0x29, 0x8d, 0xe1, 0xe0, 0x47, 0x89, 0x77, 0x04, 0x79, 0xd6, 0x15, 0xaf, 0x5d, 0x3c, 0x84, 0x94, 0xc2, + 0x48, 0x1a, 0x61, 0x18, 0xae, 0x04, 0x5b, 0xa9, 0x16, 0xd3, 0x66, 0xaf, 0x0f, 0xf5, 0xec, 0x90, 0xb9, 0x0e, 0xde, 0xf7, 0x73, 0xc5, 0x98, 0x28, 0xef, 0xf1, 0xf1, 0xf6, 0x92, 0x03, 0xc9, 0x01, + 0x32, 0x78, 0x2f, 0x87, 0x67, 0x76, 0xba, 0x4c, 0x07, 0x8e, 0x9d, 0x0b, 0x62, 0xcb, 0x37, 0xeb, 0x24, 0xd3, 0x1f, 0xac, 0x33, 0xcc, 0x91, 0x42, 0x66, 0xfc, 0xdd, 0x5c, 0x0d, 0xd5, 0x5e, 0x75, + 0x14, 0x9e, 0x64, 0x7a, 0x58, 0xe1, 0x4d, 0x4a, 0x34, 0x1c, 0xf3, 0xa2, 0x58, 0xf0, 0x89, 0xdc, 0x3c, 0x8f, 0xf9, 0x7a, 0x47, 0xd3, 0x6c, 0xda, 0xe8, 0x0e, 0xe8, 0xba, 0x0e, 0xbb, 0x2f, 0xb0, + 0xc2, 0x6d, 0x92, 0x75, 0x04, 0x1a, 0xe9, 0x84, 0x80, 0xc2, 0x27, 0x10, 0x36, 0x89, 0x8f, 0x3f, 0xf9, 0xf7, 0xb4, 0x73, 0x98, 0xb3, 0x9a, 0xad, 0xfa, 0x6e, 0x5f, 0x7e, 0x1a, 0x1c, 0x9d, 0x6a, + 0xcc, 0xf9, 0xec, 0x78, 0x14, 0xf4, 0x20, 0x1a, 0xb9, 0x8a, 0x66, 0xc8, 0x52, 0x91, 0x84, 0xd1, 0xa2, 0x70, 0x9c, 0x18, 0x40, 0x5c, 0x12, 0x77, 0x0a, 0x46, 0x22, 0x86, 0x02, 0x6b, 0x7f, 0xf0, + 0x78, 0x7e, 0xc9, 0x7b, 0xa4, 0x51, 0xe2, 0x23, 0x18, 0xb9, 0xda, 0x31, 0xd8, 0x88, 0x9c, 0x0b, 0x9f, 0xca, 0x9b, 0x35, 0x89, 0x9f, 0x8c, 0xae, 0x48, 0x20, 0x36, 0x50, 0xb5, 0x41, 0x65, 0xf7, + 0xd6, 0x15, 0x15, 0x5b, 0x33, 0xe4, 0x80, 0x0c, 0xd2, 0xc4, 0xc5, 0x1e, 0x12, 0x3f, 0x80, 0xaa, 0x3d, 0x0c, 0x50, 0xf5, 0xb9, 0xc7, 0xb0, 0x24, 0xb0, 0xef, 0x17, 0xb1, 0x31, 0xf3, 0xed, 0x3e, + 0x90, 0x2a, 0xd9, 0x11, 0x5d, 0xe6, 0x7f, 0x40, 0xfc, 0xa3, 0x20, 0xa8, 0x7c, 0x72, 0x88, 0x06, 0x72, 0x6c, 0x19, 0xb1, 0x35, 0x16, 0xd2, 0x02, 0x5d, 0x70, 0x0a, 0xc7, 0x74, 0x73, 0x14, 0x0b, + 0x72, 0x48, 0x4c, 0x07, 0x14, 0x1e, 0x65, 0x25, 0x01, 0x0a, 0xb3, 0xe1, 0x75, 0xc2, 0x27, 0x8c, 0xdd, 0xd3, 0xdb, 0x14, 0xb4, 0x97, 0x37, 0x2f, 0xca, 0x8b, 0x02, 0x87, 0xf4, 0xf3, 0x76, 0xce, + 0x30, 0x75, 0x24, 0xee, 0x4c, 0xde, 0x7b, 0x68, 0x0a, 0x18, 0x47, 0x9e, 0xf5, 0xc3, 0x17, 0x89, 0x29, 0x6c, 0xda, 0xfe, 0x55, 0xbc, 0x10, 0xf1, 0x9e, 0x29, 0x29, 0x45, 0x39, 0xe5, 0x63, 0xa5, + 0x4f, 0x53, 0x24, 0x80, 0x72, 0x8a, 0x07, 0xf5, 0x44, 0xb6, 0xc9, 0xda, 0x13, 0x25, 0xb0, 0x3d, 0x9a, 0x42, 0xb1, 0x73, 0xd1, 0x4b, 0xef, 0xc5, 0x2d, 0xed, 0xb9, 0xaa, 0x50, 0x7d, 0xaf, 0xf5, + 0xcb, 0x47, 0x7d, 0xa9, 0x13, 0x9f, 0x8b, 0x68, 0xfb, 0x9c, 0x38, 0x45, 0xca, 0xb4, 0x49, 0xa5, 0x7f, 0x07, 0xe3, 0x36, 0xf4, 0xb9, 0x76, 0x5d, 0xec, 0x71, 0xbf, 0x31, 0xf9, 0x00, 0x4e, 0x08, + 0xd7, 0x5f, 0x9e, 0x6e, 0xbf, 0x98, 0x92, 0x52, 0x98, 0x22, 0x84, 0x62, 0x84, 0x35, 0xfb, 0x71, 0xc6, 0x4f, 0x53, 0x73, 0x2c, 0xb9, 0x26, 0xa1, 0x31, 0x59, 0x91, 0xbc, 0x7c, 0x3e, 0x60, 0x79, + 0x92, 0xb4, 0xce, 0x74, 0x1e, 0xc1, 0x90, 0x62, 0xc3, 0x11, 0xd1, 0x8e, 0x95, 0xee, 0xd0, 0x83, 0xef, 0x11, 0xf4, 0x4a, 0x22, 0x73, 0x02, 0x5d, 0x20, 0x42, 0x6e, 0xe2, 0x50, 0x3a, 0xd2, 0x74, + 0x87, 0xaa, 0x38, 0x61, 0x90, 0x4b, 0x0a, 0x0b, 0x6a, 0xde, 0x50, 0xda, 0xd8, 0xc1, 0x45, 0xe1, 0x76, 0x34, 0x93, 0xc9, 0x29, 0xa6, 0x9f, 0x63, 0x4b, 0x70, 0x33, 0x78, 0xa8, 0x7d, 0xd2, 0x31, + 0xa1, 0x5d, 0x1c, 0x9a, 0x4a, 0xfe, 0xad, 0x37, 0xeb, 0x0f, 0x10, 0xcc, 0xff, 0x0f, 0x20, 0x98, 0xa1, 0xbe, 0x40, 0x70, 0x04, 0x7f, 0x6f, 0x97, 0x99, 0xc6, 0xbf, 0x17, 0x3f, 0xe3, 0xf4, 0x2b, + 0xcf, 0x1e, 0x31, 0x9c, 0x6c, 0x29, 0xa8, 0x3f, 0xfe, 0x74, 0xa2, 0xfd, 0x67, 0xf0, 0x03, 0x7e, 0x85, 0x7e, 0xff, 0x0d, 0xf0, 0x13, 0x7e, 0x17, 0xaf, 0xb8, 0x74, 0x8f, 0xfe, 0xd2, 0x2e, 0xf3, + 0x7f, 0x10, 0x7f, 0x31, 0x5a, 0x1a, 0xfa, 0x71, 0x4d, 0xe7, 0xa0, 0x3f, 0x89, 0xbf, 0xe8, 0x8e, 0x7c, 0xf0, 0xbf, 0x33, 0x5c, 0xf8, 0xa3, 0xfb, 0xfe, 0x25, 0x40, 0x2a, 0xbd, 0xff, 0xa8, 0x51, + 0xf8, 0x63, 0x61, 0xe0, 0x7e, 0x3b, 0xe6, 0xf2, 0xcf, 0xbf, 0xd3, 0x78, 0x41, 0x7a, 0x10, 0x05, 0xca, 0xf3, 0x2e, 0x89, 0xb2, 0x93, 0x6a, 0x34, 0x39, 0x27, 0x9d, 0x55, 0x1f, 0xb2, 0x1a, 0x55, + 0xe6, 0xc7, 0xba, 0xf8, 0xa9, 0x50, 0x07, 0x58, 0x4e, 0xd4, 0x8c, 0x89, 0x6b, 0xd7, 0x51, 0xa4, 0x29, 0x1b, 0x3e, 0x7a, 0x54, 0xc6, 0x1f, 0x51, 0xf6, 0xec, 0xd8, 0x67, 0x16, 0x1b, 0x59, 0x69, + 0xc4, 0xbd, 0x52, 0x49, 0x0c, 0x59, 0x1a, 0xf7, 0x5c, 0x0a, 0x88, 0x99, 0x37, 0x6c, 0x1b, 0xf1, 0x54, 0x1f, 0x6f, 0xf2, 0x1d, 0xcd, 0xf0, 0xce, 0xe8, 0x2d, 0x12, 0x74, 0x26, 0x23, 0x10, 0xd6, + 0x45, 0xcb, 0x99, 0x28, 0x58, 0x8c, 0x9e, 0xb7, 0x89, 0x6c, 0x76, 0x7c, 0x5b, 0x38, 0xf0, 0x5f, 0x69, 0xbc, 0x00, 0xff, 0x64, 0x12, 0x96, 0xbc, 0xaa, 0xf8, 0x82, 0x9d, 0x27, 0xd1, 0xbc, 0x3f, + 0xf8, 0x03, 0xde, 0xe4, 0x67, 0x85, 0xd6, 0xc5, 0x2e, 0xcb, 0x55, 0xf6, 0x07, 0x8d, 0x17, 0xe0, 0x07, 0x91, 0x97, 0x93, 0xd6, 0x44, 0x33, 0x6c, 0x38, 0x6e, 0xa9, 0xbb, 0xc6, 0xcb, 0xf1, 0xc3, + 0xa3, 0xa8, 0x0d, 0x1a, 0x58, 0x95, 0x7c, 0x51, 0x8f, 0x64, 0xbc, 0xfb, 0x6d, 0xc5, 0xb9, 0x24, 0x9b, 0xa6, 0x05, 0x7f, 0x0b, 0xeb, 0x2b, 0x71, 0x05, 0xb4, 0x64, 0xa1, 0x6d, 0xb6, 0x0b, 0x92, + 0x88, 0xed, 0x60, 0x25, 0x81, 0xb9, 0x92, 0x0f, 0x67, 0x25, 0x3e, 0xd7, 0x13, 0x4e, 0x08, 0x4e, 0x63, 0x5f, 0x4e, 0x72, 0x78, 0x1c, 0x93, 0xe9, 0x96, 0x95, 0x78, 0x83, 0x29, 0x32, 0x6b, 0x6b, + 0x36, 0xb6, 0x23, 0x1b, 0x77, 0x89, 0x22, 0x9e, 0xe1, 0x0c, 0x11, 0xbb, 0x17, 0xcf, 0x28, 0xa6, 0x5d, 0x8c, 0x62, 0x42, 0xdb, 0xac, 0xe7, 0xc6, 0xf9, 0xab, 0x38, 0xe0, 0xff, 0x8f, 0xb7, 0x55, + 0x73, 0xf2, 0x5f, 0xbf, 0x4d, 0x8d, 0x7f, 0xbf, 0xed, 0x71, 0x5c, 0xfa, 0xbf, 0x76, 0xe4, 0x3f, 0x3b, 0x9d, 0x15, 0xc8, 0x2f, 0xf1, 0x41, 0xfd, 0xcb, 0x8e, 0x90, 0xf3, 0x11, 0xe1, 0x76, 0xe2, + 0xa6, 0x7b, 0xc5, 0x72, 0x39, 0x57, 0x5a, 0x79, 0xfa, 0xa2, 0x61, 0xad, 0x18, 0xcf, 0xd9, 0xbf, 0x2c, 0x53, 0xab, 0x98, 0xfe, 0xfa, 0xa4, 0x02, 0xff, 0x7a, 0x54, 0x1d, 0x57, 0xb7, 0xc9, 0x2f, + 0x6f, 0xfe, 0xf2, 0xa8, 0x4a, 0xfc, 0xf1, 0x62, 0xd2, 0x7e, 0xad, 0xb3, 0x9e, 0xff, 0xc1, 0x59, 0x70, 0xf4, 0x78, 0xde, 0x5f, 0x03, 0x29, 0x18, 0xb2, 0x9e, 0xaf, 0x1c, 0x5f, 0x91, 0x64, 0x9e, + 0xdf, 0xfc, 0x0b, 0x3d, 0x25, 0x8f, 0x4e, 0x7f, 0xff, 0xb0, 0xc5, 0x13, 0x7e, 0x78, 0xd3, 0xb7, 0x0b, 0x1b, 0x1b, 0x0e, 0xb6, 0x5c, 0x0c, 0xae, 0x9f, 0x0e, 0x55, 0x05, 0x2d, 0x70, 0x9e, 0x2f, + 0x44, 0xa9, 0x65, 0xfe, 0xf7, 0xa1, 0xef, 0xdf, 0x4f, 0x78, 0x81, 0xaf, 0x37, 0x37, 0x82, 0xe2, 0x7d, 0x65, 0x77, 0xdd, 0xdf, 0x15, 0x98, 0x6e, 0xdd, 0xab, 0x0e, 0xd3, 0xa3, 0x11, 0xdd, 0xcb, + 0x7f, 0x0b, 0x42, 0xef, 0xcb, 0x9a, 0xfc, 0x7d, 0x4d, 0x97, 0x45, 0xfa, 0x67, 0xeb, 0x42, 0xc0, 0x6f, 0x79, 0x4b, 0xa7, 0xa1, 0xdf, 0xce, 0x7f, 0x4f, 0x5d, 0xb4, 0x43, 0x6c, 0x8e, 0x23, 0xa5, + 0xd6, 0x9d, 0xf7, 0x21, 0x7c, 0x53, 0x66, 0x3a, 0x99, 0x1f, 0x76, 0x13, 0xb0, 0xce, 0xc5, 0x30, 0x5a, 0xa7, 0x6f, 0xba, 0x03, 0x1d, 0xe2, 0xf1, 0x6d, 0x9e, 0xdd, 0x11, 0x80, 0xef, 0x6f, 0xfa, + 0x46, 0xe3, 0xe4, 0x8d, 0xee, 0xab, 0xa4, 0x53, 0xcb, 0xf7, 0x3a, 0xfb, 0x5d, 0x54, 0x31, 0x77, 0xdc, 0xa7, 0x9f, 0x87, 0xf9, 0x15, 0xbb, 0xcc, 0xd7, 0x21, 0xf8, 0x38, 0x3c, 0x7e, 0xe4, 0xac, + 0x7d, 0x35, 0x5c, 0x02, 0xf2, 0x56, 0xff, 0xef, 0x1c, 0x70, 0x35, 0xaf, 0x9d, 0x55, 0x56, 0x44, 0x21, 0x88, 0x6a, 0x50, 0x62, 0x4a, 0xf3, 0x6c, 0xea, 0x59, 0x1c, 0x78, 0xc2, 0x9b, 0xfc, 0x7c, + 0x02, 0x6d, 0x2c, 0x12, 0x82, 0xf6, 0x94, 0x70, 0x9e, 0x8e, 0xc8, 0x1b, 0xe1, 0x0a, 0x3e, 0xb8, 0xa6, 0x06, 0xb7, 0x91, 0x69, 0xc4, 0x9f, 0x2c, 0x73, 0x5e, 0xf3, 0x55, 0x4a, 0xfe, 0x16, 0xb1, + 0x4b, 0x76, 0x6e, 0x2d, 0x11, 0x81, 0x4d, 0x38, 0xa9, 0x23, 0x0a, 0x53, 0x06, 0xbf, 0x9f, 0x44, 0x31, 0x45, 0x9e, 0x95, 0xe9, 0x12, 0x87, 0xda, 0xe2, 0xa9, 0x01, 0xcb, 0x27, 0x3e, 0xe3, 0x9c, + 0x87, 0x2c, 0x0e, 0x3a, 0x8b, 0xa5, 0xd8, 0x4f, 0xb5, 0x18, 0x6a, 0x53, 0x8c, 0x26, 0xb3, 0xd6, 0xa8, 0x3a, 0x27, 0x89, 0xf6, 0x90, 0x88, 0x42, 0x55, 0x03, 0xea, 0x82, 0x1f, 0x60, 0xcd, 0x29, + 0x01, 0xf7, 0x51, 0x50, 0x71, 0xac, 0xe7, 0xcb, 0xf2, 0xdf, 0x9f, 0xd0, 0xec, 0xe9, 0xa4, 0x9b, 0x77, 0x2a, 0x03, 0x5d, 0x01, 0x00, 0x63, 0x8b, 0x2a, 0x51, 0x67, 0x35, 0xc4, 0x13, 0x4c, 0xe6, + 0x5c, 0xa3, 0x6d, 0x13, 0x9c, 0xc3, 0x1e, 0x79, 0xde, 0xda, 0x8b, 0x0a, 0xf2, 0x0f, 0x1e, 0x27, 0xac, 0xf5, 0x09, 0x7a, 0x3d, 0xd5, 0x43, 0x2b, 0xd3, 0x6e, 0xa5, 0xa7, 0x2f, 0xe8, 0x29, 0x17, + 0x8b, 0x78, 0xbd, 0x8d, 0x9b, 0x80, 0xa8, 0x04, 0x9c, 0xd1, 0xfc, 0x41, 0x33, 0x0b, 0xf9, 0x01, 0xec, 0x22, 0xef, 0xd9, 0x42, 0xd0, 0xba, 0x47, 0x8e, 0xec, 0xae, 0xb0, 0xaa, 0xe9, 0x6b, 0x38, + 0xae, 0xe7, 0x83, 0xc8, 0x5f, 0xd8, 0x2b, 0x97, 0x2c, 0x73, 0x4e, 0x9d, 0x25, 0xc0, 0xc2, 0x38, 0x60, 0xf0, 0x70, 0xc1, 0x4c, 0x9f, 0x13, 0x69, 0x1a, 0xab, 0x25, 0xec, 0x61, 0xc7, 0x25, 0xef, + 0x24, 0xe7, 0xc7, 0xbd, 0x4d, 0x32, 0x15, 0x8f, 0x7b, 0x3e, 0x80, 0x54, 0x37, 0xb5, 0x4b, 0x75, 0x1d, 0xa6, 0xb4, 0x9e, 0x70, 0x9a, 0x7c, 0x98, 0x8f, 0x88, 0x7c, 0x1e, 0xee, 0x89, 0x37, 0xbc, + 0x1f, 0xc9, 0xe6, 0x1b, 0xb4, 0x1e, 0xb0, 0x6f, 0x98, 0x3a, 0xdf, 0x24, 0xaf, 0x7c, 0xe0, 0xa6, 0x83, 0x7e, 0xf4, 0xb9, 0x75, 0x11, 0x10, 0xb3, 0xa2, 0xf7, 0xa0, 0xba, 0x68, 0xd3, 0x64, 0xbb, + 0x99, 0x4e, 0x6c, 0x5e, 0xe1, 0x00, 0x84, 0x0e, 0xfd, 0xde, 0x60, 0x08, 0x72, 0xf0, 0x6a, 0x8a, 0xa5, 0x30, 0x16, 0x43, 0xa4, 0x17, 0x28, 0xb0, 0xd8, 0xa5, 0x75, 0x86, 0xa0, 0xd1, 0xcc, 0xc1, + 0x6b, 0xaa, 0x1a, 0x2e, 0x5f, 0xd7, 0x07, 0x36, 0x32, 0xa6, 0x0e, 0x2a, 0x0f, 0xa5, 0x55, 0x17, 0x26, 0x86, 0xd0, 0xc9, 0x7c, 0xc1, 0x96, 0x42, 0xda, 0x89, 0x8d, 0xad, 0x43, 0xae, 0x31, 0x40, + 0xe1, 0x32, 0x73, 0x48, 0x92, 0x77, 0x9b, 0x8b, 0x7e, 0xde, 0x46, 0x43, 0x14, 0x44, 0xd2, 0x8a, 0x1f, 0xe3, 0x07, 0x4a, 0x75, 0xec, 0x5e, 0xea, 0xd5, 0x1e, 0x55, 0x8c, 0x9f, 0x5e, 0x88, 0xcc, + 0x3f, 0x5d, 0xc8, 0x0d, 0xf8, 0x6a, 0x1a, 0xa6, 0x44, 0x02, 0xc3, 0x83, 0x96, 0xa0, 0x85, 0xd3, 0x1f, 0x1e, 0x48, 0x0e, 0xb7, 0x75, 0xd1, 0x56, 0xa3, 0x03, 0xa9, 0x5c, 0xe4, 0x4c, 0x83, 0x9c, + 0xc4, 0xc3, 0xea, 0x99, 0x7d, 0x16, 0x5e, 0xb5, 0x91, 0x82, 0x02, 0x2d, 0x0d, 0x83, 0x28, 0x2e, 0xeb, 0xb4, 0xe7, 0x1c, 0x67, 0xbd, 0x9f, 0xd6, 0x88, 0xb0, 0x5a, 0x88, 0x34, 0x74, 0x19, 0xc7, + 0x70, 0xab, 0x7d, 0x0c, 0x54, 0x9f, 0x98, 0x05, 0x51, 0x8f, 0x6b, 0xb5, 0xa3, 0x37, 0xe5, 0x1d, 0x37, 0x97, 0xa7, 0x15, 0x50, 0x23, 0x59, 0xe4, 0x29, 0xf0, 0x01, 0xd3, 0xfd, 0xc8, 0x05, 0x25, + 0xe2, 0xc8, 0xd1, 0x71, 0xd1, 0xee, 0x23, 0x12, 0x9e, 0x09, 0x7a, 0x16, 0x66, 0x20, 0x1a, 0x53, 0x09, 0x75, 0xd0, 0x8b, 0x0e, 0xf5, 0xf1, 0xdb, 0x01, 0x17, 0xac, 0x1f, 0xf1, 0x2f, 0xf4, 0x13, + 0x81, 0x5f, 0x7a, 0x17, 0x6a, 0x2a, 0x34, 0x6f, 0xf1, 0x4a, 0x5d, 0x69, 0xf0, 0x19, 0xfc, 0x35, 0x7f, 0xef, 0xb4, 0xf8, 0xd4, 0x6b, 0x88, 0x6f, 0xf7, 0x9f, 0x28, 0xc3, 0xd7, 0xaa, 0x12, 0xbd, + 0x56, 0x66, 0xfd, 0x33, 0x99, 0x9e, 0x80, 0x16, 0xbd, 0xb4, 0x83, 0x59, 0x3d, 0x39, 0x67, 0x64, 0xe2, 0x17, 0x72, 0xe2, 0x7f, 0xa9, 0x26, 0x2e, 0xf7, 0x63, 0x36, 0x3c, 0x74, 0x9c, 0x44, 0x37, + 0x51, 0xb7, 0x6d, 0xa0, 0x62, 0x21, 0x9b, 0xb3, 0x40, 0x42, 0xd0, 0x21, 0x1e, 0x65, 0x6c, 0xd2, 0x9b, 0x66, 0x62, 0xb8, 0x7a, 0x50, 0x9e, 0xb0, 0x68, 0x8b, 0x95, 0x9b, 0xef, 0xf5, 0x7e, 0xcd, + 0x2e, 0x1b, 0xcf, 0xe5, 0x8f, 0x5a, 0xe0, 0x99, 0x96, 0x1d, 0x4b, 0x9f, 0x62, 0x82, 0xf2, 0x70, 0xcf, 0xac, 0x40, 0xde, 0xa6, 0xe2, 0x9f, 0x76, 0xa9, 0x50, 0x45, 0x6f, 0xa0, 0x00, 0x42, 0x8e, + 0xb0, 0xd0, 0x3c, 0xd8, 0x46, 0x79, 0x90, 0xbc, 0x9f, 0x5b, 0xf9, 0x1b, 0x91, 0xb5, 0x98, 0x98, 0x91, 0xeb, 0x49, 0x7a, 0xed, 0x9e, 0xcc, 0x7b, 0xda, 0xc2, 0x1d, 0xe4, 0x4f, 0x1f, 0x62, 0xac, + 0x7d, 0x37, 0x67, 0x7a, 0xdc, 0x7c, 0x3c, 0x28, 0xdc, 0xed, 0xc7, 0x55, 0xbd, 0xaa, 0x18, 0x9c, 0x1f, 0xb6, 0x26, 0xf9, 0xe1, 0x70, 0x80, 0x1f, 0xa0, 0x1b, 0x20, 0x81, 0x98, 0x16, 0x6f, 0xf2, + 0x9d, 0xe5, 0x41, 0x5b, 0x36, 0xe2, 0x5a, 0x35, 0x68, 0xeb, 0x2e, 0x5f, 0xb5, 0x90, 0xc8, 0xb9, 0x37, 0xca, 0x65, 0x5a, 0x7e, 0xf2, 0x8c, 0xab, 0x51, 0xf5, 0xaa, 0x45, 0xa8, 0x98, 0x0f, 0x9a, + 0x57, 0x7c, 0xda, 0xd6, 0x04, 0x29, 0x92, 0x4e, 0x9e, 0xe9, 0x4b, 0x83, 0xdc, 0x5e, 0xb0, 0x6b, 0x13, 0x59, 0x00, 0x37, 0xb7, 0xde, 0x7b, 0xdf, 0xf6, 0xda, 0xa6, 0x9f, 0xec, 0xd3, 0xd6, 0xc4, + 0x49, 0x0b, 0xab, 0xb5, 0x81, 0xc7, 0xde, 0x27, 0x5f, 0x95, 0x87, 0x05, 0xf9, 0xb4, 0x3c, 0xa8, 0xed, 0x29, 0x88, 0x2f, 0xa3, 0x93, 0x75, 0xe2, 0x76, 0xf0, 0x5e, 0x25, 0xb4, 0x47, 0x0e, 0xb1, + 0xe2, 0xe7, 0x51, 0x96, 0xec, 0x32, 0x50, 0xd4, 0x0a, 0x4b, 0x41, 0xdd, 0xc6, 0xc0, 0xc2, 0x9e, 0x41, 0xac, 0xa4, 0x38, 0x2b, 0x61, 0xee, 0xdb, 0x0a, 0xb4, 0xa9, 0xc1, 0xa5, 0x52, 0x5f, 0x2a, + 0xf8, 0x88, 0x1f, 0xa3, 0x00, 0x71, 0x39, 0x02, 0x37, 0x16, 0xa3, 0xa7, 0x6a, 0x22, 0x7b, 0x41, 0x42, 0x53, 0x02, 0xab, 0xee, 0x29, 0xd1, 0xda, 0x7d, 0xbd, 0x5e, 0x88, 0xed, 0x33, 0x6d, 0xfc, + 0xaa, 0x76, 0xdc, 0x19, 0x88, 0x39, 0xec, 0x00, 0x2e, 0x17, 0x40, 0xac, 0x1e, 0xe7, 0xb8, 0x4f, 0x39, 0x86, 0x98, 0x87, 0x91, 0xaf, 0x32, 0x53, 0xb7, 0x26, 0xa7, 0xdc, 0x86, 0x12, 0xbc, 0x57, + 0xba, 0xaf, 0x92, 0x6b, 0xc8, 0xdc, 0x1c, 0x8f, 0xe9, 0xc0, 0xad, 0x7c, 0xc2, 0x48, 0x25, 0xfe, 0x23, 0xa7, 0x2f, 0x5f, 0x9b, 0xde, 0x45, 0xab, 0x59, 0x63, 0xa1, 0x04, 0x02, 0xf2, 0x9a, 0x31, + 0x38, 0x02, 0x06, 0x71, 0x18, 0xd8, 0x9d, 0xb4, 0xc2, 0xa1, 0xd1, 0xe2, 0x6b, 0xd2, 0x4b, 0xbf, 0xf0, 0x2d, 0x0a, 0xd3, 0xf0, 0xc0, 0xb2, 0x75, 0x4b, 0x12, 0xa8, 0x09, 0x53, 0x90, 0x7b, 0xab, + 0xde, 0x89, 0xd9, 0x82, 0xcb, 0x33, 0xbe, 0xcd, 0xb9, 0x9c, 0x61, 0x72, 0x34, 0x71, 0x66, 0xea, 0x51, 0x70, 0x99, 0x55, 0x74, 0x0e, 0x14, 0x38, 0x65, 0x34, 0x41, 0x02, 0x64, 0xf5, 0x11, 0xf2, + 0x2d, 0xd6, 0x76, 0x0c, 0xc4, 0x63, 0x17, 0x4e, 0xd4, 0x4b, 0xa6, 0xf7, 0x63, 0x03, 0xe6, 0xef, 0x72, 0xa7, 0x08, 0x5a, 0xeb, 0xe0, 0xd4, 0x75, 0x74, 0xaa, 0xf2, 0xab, 0xb2, 0x7e, 0xba, 0xa7, + 0x6a, 0x36, 0x79, 0x9d, 0x93, 0x73, 0xd4, 0x3e, 0x0a, 0x89, 0x6b, 0x39, 0x90, 0xd3, 0x16, 0x1e, 0xed, 0x25, 0x6e, 0x5c, 0x9a, 0x08, 0x88, 0x63, 0x1c, 0xd2, 0xc5, 0x91, 0x4c, 0x33, 0x59, 0x8a, + 0xa0, 0xe9, 0xd6, 0x6e, 0x10, 0x13, 0xc6, 0x91, 0x79, 0x6d, 0x0f, 0xfc, 0x9d, 0x4d, 0x6e, 0x80, 0x6c, 0xdb, 0xd3, 0x8c, 0x2d, 0xc4, 0x5e, 0xf1, 0x12, 0xdd, 0x0a, 0xa5, 0xe1, 0x2c, 0xf3, 0xf1, + 0x60, 0xb2, 0xd8, 0x78, 0xfd, 0x0f, 0x2a, 0x10, 0x9e, 0x65, 0xff, 0xe3, 0x0a, 0x84, 0x9d, 0xbe, 0x9e, 0x0a, 0x7d, 0xbe, 0x57, 0x20, 0xca, 0x3b, 0x7e, 0xe5, 0xb7, 0x54, 0x7b, 0x30, 0x39, 0x1a, + 0x2b, 0x8a, 0xf9, 0x71, 0xda, 0x3f, 0x95, 0x42, 0x96, 0x17, 0xfe, 0x4f, 0x2a, 0xe3, 0xdf, 0xaa, 0x8f, 0xdf, 0x99, 0x1d, 0xff, 0x3b, 0xd5, 0xc7, 0xef, 0x1f, 0xf6, 0xbf, 0x53, 0x7d, 0x7c, 0x29, + 0x3e, 0x80, 0xdf, 0xb5, 0x6a, 0x7e, 0x51, 0x7d, 0xd8, 0xb0, 0xe1, 0xd5, 0x3f, 0x55, 0x1f, 0xbf, 0xad, 0xfd, 0xaa, 0xfa, 0xf8, 0x52, 0x7c, 0x00, 0xff, 0x5b, 0xd5, 0xc7, 0x97, 0xf7, 0x00, 0xff, + 0x0b, 0xd5, 0xc7, 0xd7, 0x3b, 0xf5, 0x2f, 0xc5, 0x07, 0xf0, 0xe3, 0x54, 0xc9, 0x9f, 0x87, 0x4a, 0x5c, 0xb3, 0x67, 0x7b, 0xf0, 0x3c, 0xe9, 0x42, 0xa1, 0xb6, 0x99, 0x26, 0x8f, 0x51, 0x33, 0xea, + 0xc2, 0x65, 0xde, 0xb6, 0x9a, 0xdd, 0x5a, 0x18, 0x4b, 0x7a, 0xab, 0x35, 0xae, 0x80, 0xf6, 0x9c, 0x3a, 0x69, 0x30, 0x70, 0xe0, 0x76, 0xee, 0x89, 0x5a, 0x30, 0x50, 0x49, 0xe5, 0xac, 0x47, 0xb6, + 0x4b, 0x29, 0x83, 0x42, 0xa5, 0x1d, 0x9e, 0x56, 0x82, 0xe1, 0xe1, 0xfd, 0x7a, 0xb7, 0x83, 0xfc, 0x9a, 0x54, 0x0f, 0x8d, 0xd5, 0x32, 0xbc, 0x3f, 0x9e, 0xa7, 0xd2, 0xec, 0xac, 0xe0, 0xec, 0x6b, + 0x9d, 0x5c, 0xac, 0x61, 0xd0, 0x86, 0x58, 0xe8, 0x81, 0x0d, 0x25, 0x10, 0x79, 0x02, 0xce, 0x42, 0xa8, 0x88, 0xac, 0xfe, 0x46, 0x79, 0xfe, 0x77, 0x6c, 0x98, 0xdf, 0xfa, 0x8b, 0x96, 0x61, 0xaa, + 0x43, 0x18, 0x69, 0x1f, 0x44, 0xe5, 0x33, 0x6b, 0x09, 0xec, 0x14, 0x5f, 0xcb, 0xec, 0x35, 0x05, 0x94, 0x32, 0x4e, 0xa3, 0x86, 0x36, 0x70, 0x5b, 0xfe, 0x1f, 0xaf, 0xbc, 0xad, 0x07, 0xab, 0x47, + 0xf2, 0xe3, 0x91, 0x39, 0x7d, 0xaa, 0x42, 0xe8, 0xb0, 0x8a, 0x87, 0x1f, 0x37, 0xdd, 0x5b, 0xbf, 0x9f, 0xff, 0xe6, 0x10, 0xe8, 0x7b, 0xbb, 0x09, 0xfc, 0x3c, 0x81, 0x82, 0x55, 0x41, 0x9c, 0x84, + 0x52, 0xa7, 0x65, 0xa3, 0x71, 0x81, 0xfc, 0x8b, 0xd5, 0x90, 0x10, 0x0c, 0x44, 0x57, 0x1c, 0xb0, 0x36, 0xa0, 0x5d, 0xfb, 0xfd, 0x1a, 0x9f, 0x6f, 0xaf, 0x7f, 0x3d, 0xaa, 0x62, 0x7a, 0x4d, 0x26, + 0x7e, 0x89, 0xad, 0xdf, 0xb4, 0x20, 0x4e, 0x84, 0x68, 0x08, 0xd0, 0x4d, 0x81, 0x7c, 0xf9, 0x10, 0x24, 0x18, 0x23, 0x15, 0x89, 0xf3, 0x97, 0xaf, 0x86, 0xd3, 0xe7, 0xcc, 0x9b, 0xa1, 0x0b, 0x61, + 0x79, 0x4c, 0x11, 0x6c, 0x2e, 0x22, 0x32, 0xb7, 0x5b, 0x42, 0x48, 0x33, 0xfb, 0xe8, 0x11, 0x78, 0xa2, 0x69, 0xf3, 0xb8, 0xdf, 0xae, 0x70, 0xee, 0x7d, 0xfb, 0x96, 0x71, 0xef, 0x35, 0x27, 0x3c, + 0xf2, 0x57, 0xa9, 0xc0, 0x2d, 0xb2, 0x6d, 0x6e, 0xd6, 0xeb, 0xbf, 0xd8, 0xb1, 0xef, 0xb7, 0xa1, 0xc9, 0x92, 0xb5, 0x19, 0x87, 0xaf, 0x29, 0x81, 0xa5, 0xff, 0x26, 0x17, 0xfc, 0x6d, 0x32, 0x10, + 0xca, 0x2f, 0xed, 0x08, 0x5c, 0x7c, 0x4b, 0x06, 0x0a, 0x6d, 0x0a, 0xa4, 0x01, 0x71, 0x94, 0x08, 0x62, 0xc3, 0xcf, 0x85, 0x2d, 0x47, 0xfb, 0xb4, 0x2e, 0xfc, 0xd4, 0x28, 0xbf, 0x27, 0x5b, 0x77, + 0xfd, 0x03, 0x90, 0xbf, 0x47, 0xc3, 0xe9, 0x39, 0xbe, 0x61, 0x79, 0x2e, 0xf3, 0x8d, 0x80, 0xe6, 0x15, 0x91, 0x01, 0xbd, 0xc2, 0xe7, 0x2d, 0xf3, 0x86, 0xa5, 0x35, 0xa7, 0x1e, 0xf0, 0xf6, 0xa6, + 0xbb, 0xd9, 0xa1, 0xd8, 0xdf, 0xe2, 0x19, 0xfb, 0x51, 0x4d, 0x95, 0x03, 0x52, 0xf8, 0xb9, 0xe6, 0x21, 0xf6, 0x2f, 0x0f, 0xf2, 0xaf, 0x47, 0xea, 0x0e, 0x67, 0x7b, 0xfa, 0x0f, 0xa2, 0x03, 0x3c, + 0xac, 0x73, 0xf1, 0x69, 0xdc, 0x3c, 0xfc, 0x83, 0xa0, 0x15, 0xfa, 0x7d, 0xad, 0x65, 0xf2, 0x2f, 0xf1, 0x0c, 0xfc, 0x10, 0xd0, 0xaa, 0xcf, 0xf1, 0x9d, 0xce, 0x7e, 0xa7, 0xc9, 0x65, 0x3e, 0x14, + 0x70, 0x1e, 0x04, 0x7d, 0xcf, 0x36, 0x3e, 0xd2, 0xdd, 0xb9, 0x18, 0xac, 0xd9, 0xc5, 0x70, 0xde, 0x85, 0x2e, 0x9e, 0xe0, 0xf0, 0x5a, 0xcb, 0x0f, 0x3a, 0xfb, 0xdb, 0xed, 0x38, 0x40, 0x9f, 0x7a, + 0xf1, 0xa3, 0x24, 0xad, 0x0d, 0x53, 0x6b, 0x1a, 0x05, 0xdb, 0x0f, 0x06, 0xef, 0x5f, 0xd3, 0x90, 0x0d, 0xf1, 0xf7, 0xdf, 0x89, 0x54, 0x02, 0x3f, 0xaa, 0x54, 0xa2, 0x64, 0x77, 0xb9, 0x65, 0x76, + 0x20, 0x55, 0x47, 0x7e, 0x7c, 0x96, 0x09, 0x0d, 0x13, 0x32, 0x57, 0x18, 0x8f, 0xed, 0x87, 0xe7, 0x8b, 0xd8, 0x64, 0x71, 0x11, 0x4b, 0x74, 0xeb, 0xfd, 0x66, 0xd6, 0xc1, 0x63, 0xa5, 0x25, 0xba, + 0x43, 0xc2, 0xf4, 0xd0, 0x99, 0xed, 0xb9, 0x7d, 0x83, 0xa1, 0x19, 0xa8, 0xf7, 0xf5, 0x1c, 0x97, 0x66, 0xc1, 0x84, 0xc4, 0x7f, 0x64, 0xfd, 0xbe, 0x44, 0x9a, 0x2f, 0xab, 0x27, 0x04, 0xcd, 0x55, + 0x30, 0x07, 0xd2, 0xa3, 0x8e, 0xdc, 0x7a, 0x73, 0xb8, 0x07, 0x13, 0x73, 0x98, 0x3f, 0x99, 0xb7, 0xcd, 0x3d, 0x9f, 0xbc, 0x7a, 0xd3, 0xdd, 0x5c, 0x0c, 0xe5, 0x90, 0x90, 0xe8, 0xb9, 0xba, 0x62, + 0x86, 0x3a, 0xd2, 0xb1, 0xf0, 0x80, 0x61, 0x45, 0x31, 0x15, 0xbe, 0xc9, 0x1c, 0x34, 0xde, 0x14, 0x0d, 0x7f, 0xea, 0x9c, 0xa8, 0xd8, 0x80, 0xe6, 0x05, 0x2c, 0xe1, 0x57, 0xb2, 0x51, 0x77, 0xfe, + 0x79, 0x81, 0xcc, 0x45, 0xdc, 0xa0, 0x2e, 0x7a, 0x65, 0x5f, 0xbe, 0xac, 0xfc, 0x31, 0xf5, 0x89, 0x68, 0x44, 0x92, 0xcc, 0xc7, 0x8c, 0x7e, 0x44, 0x02, 0x1d, 0x32, 0xf8, 0x63, 0x94, 0x2c, 0x18, + 0x00, 0x39, 0xcc, 0x46, 0x0b, 0x7a, 0x57, 0xda, 0xe7, 0x23, 0x62, 0xcd, 0x67, 0x11, 0x71, 0xc5, 0x63, 0xe3, 0x9c, 0x29, 0x8f, 0x75, 0x3b, 0x12, 0x08, 0xea, 0xf1, 0xd1, 0x25, 0xb9, 0x95, 0x08, + 0x79, 0x7f, 0x42, 0x2e, 0x15, 0x74, 0xef, 0x17, 0x19, 0xb6, 0x6b, 0x6c, 0x82, 0x1b, 0x0e, 0xb3, 0xf0, 0x53, 0xc9, 0x27, 0xdc, 0x5b, 0x28, 0x7e, 0x6e, 0xc4, 0x1e, 0x18, 0xa6, 0x56, 0x95, 0x45, + 0x8c, 0xdc, 0xd0, 0x46, 0x08, 0xc1, 0x9d, 0xe6, 0x45, 0x95, 0x20, 0xf7, 0xf7, 0xe0, 0x3c, 0x40, 0xa7, 0xf1, 0x3a, 0xee, 0x34, 0xc0, 0x02, 0xf5, 0x45, 0x30, 0x90, 0xf4, 0xaa, 0xbb, 0x9e, 0x0b, + 0xbc, 0x5b, 0x3e, 0x83, 0x5b, 0xfd, 0x96, 0xd7, 0xfb, 0xbc, 0x5f, 0xba, 0xe8, 0x12, 0xde, 0x0b, 0xce, 0xe6, 0x2e, 0x5f, 0x63, 0x20, 0xd2, 0x82, 0x0f, 0xbd, 0x9b, 0x68, 0xf5, 0xc4, 0xa1, 0x84, + 0xc0, 0x98, 0xb2, 0xcb, 0x94, 0xdc, 0x77, 0xec, 0x20, 0x7b, 0x26, 0x7c, 0xc8, 0xd7, 0x6c, 0x2f, 0xb1, 0x9f, 0xb8, 0xa5, 0x78, 0xe2, 0x58, 0x1b, 0x17, 0x34, 0xe2, 0x82, 0x0d, 0xf6, 0xe5, 0xf3, + 0x2c, 0x1e, 0x02, 0x61, 0x88, 0x99, 0x26, 0x11, 0xb1, 0x7e, 0x22, 0x47, 0x21, 0x06, 0x96, 0x0a, 0x4c, 0x84, 0xa0, 0x0a, 0x2e, 0x13, 0x0a, 0x12, 0x4d, 0xa9, 0xa8, 0xbc, 0x70, 0x18, 0x14, 0x48, + 0x7e, 0x41, 0x3b, 0x20, 0x85, 0xf6, 0x36, 0x7a, 0xce, 0x30, 0xf9, 0x68, 0x1f, 0xb0, 0x98, 0x38, 0x18, 0x21, 0xca, 0x95, 0xbf, 0x2c, 0x1a, 0x59, 0xb5, 0xfa, 0x36, 0xf0, 0xcb, 0xfa, 0x40, 0x68, + 0x22, 0x4b, 0xc6, 0xb9, 0xb8, 0xe2, 0x81, 0x3c, 0x67, 0x16, 0x40, 0xac, 0x25, 0xda, 0x54, 0xe9, 0x73, 0xe1, 0x2c, 0x34, 0xaf, 0xa6, 0x5f, 0x0e, 0xb3, 0xfd, 0x21, 0xad, 0xc5, 0x64, 0x21, 0x47, + 0x1b, 0x1b, 0xf0, 0xc9, 0x3d, 0x56, 0xbe, 0x5d, 0xd9, 0x59, 0x26, 0xd9, 0x74, 0x40, 0x74, 0x28, 0xa0, 0xea, 0xfd, 0x23, 0x92, 0x66, 0x3f, 0xc9, 0x78, 0xf3, 0x0a, 0xe4, 0xfa, 0x95, 0x47, 0x07, + 0x02, 0x2a, 0xb7, 0x59, 0x02, 0x22, 0x6d, 0x40, 0x4d, 0xb7, 0xba, 0x32, 0x9f, 0xcf, 0x8e, 0x0f, 0x35, 0x39, 0x7a, 0x06, 0x0a, 0xc8, 0xee, 0xd2, 0x78, 0x2b, 0xd5, 0xa5, 0xf8, 0x2b, 0x36, 0xdb, + 0x1e, 0x35, 0x98, 0xa0, 0xf1, 0xde, 0x24, 0x25, 0x1e, 0x17, 0x5b, 0xf3, 0x68, 0x02, 0xea, 0xfc, 0xfa, 0x80, 0x5e, 0x6f, 0xb2, 0xfd, 0x80, 0x0e, 0x52, 0x4d, 0x71, 0x0e, 0x05, 0xd9, 0x01, 0xb0, + 0x0c, 0x2f, 0x80, 0x41, 0xe9, 0xc0, 0x59, 0xf6, 0x07, 0x95, 0xca, 0x3f, 0x64, 0x68, 0xd1, 0xf6, 0x4b, 0xeb, 0x8c, 0xb3, 0x3a, 0xe9, 0xd9, 0xe6, 0x0d, 0x09, 0x21, 0xf9, 0xb9, 0x88, 0x9b, 0x9c, + 0xf1, 0x66, 0xfe, 0x25, 0x29, 0xe9, 0xdf, 0x9e, 0xd3, 0xff, 0x22, 0x05, 0xfd, 0x26, 0x52, 0xc9, 0x65, 0x74, 0xa3, 0xcb, 0xe8, 0x46, 0xd6, 0xe6, 0x92, 0x19, 0xeb, 0x95, 0xba, 0x40, 0x3c, 0x99, + 0xc3, 0xe4, 0x1a, 0x17, 0x73, 0xb1, 0x6c, 0x6c, 0x90, 0xf1, 0xf3, 0xe9, 0xae, 0x89, 0x1b, 0xba, 0xc3, 0xfa, 0xf6, 0x6f, 0xac, 0xc7, 0xfc, 0x51, 0xb2, 0xe6, 0xfe, 0x52, 0xcd, 0xe7, 0x88, 0x5d, + 0xe2, 0xc1, 0xd8, 0xa4, 0xdc, 0xa4, 0xb6, 0x76, 0xc4, 0xcb, 0xd3, 0x8c, 0x21, 0x8b, 0x16, 0x8c, 0x19, 0x8a, 0x41, 0xee, 0x43, 0x49, 0xd2, 0x06, 0x78, 0x63, 0xd9, 0x66, 0xc9, 0x00, 0x5d, 0x41, + 0xd9, 0x69, 0x1d, 0x99, 0x15, 0xe9, 0xd2, 0x7e, 0xc6, 0x9c, 0x0f, 0x1e, 0x3d, 0x65, 0xf8, 0x4f, 0x66, 0x83, 0x96, 0x71, 0xc4, 0x9a, 0x4b, 0xa4, 0xde, 0x9a, 0x70, 0x94, 0x1d, 0xf5, 0xf8, 0xe4, + 0x54, 0x94, 0x46, 0x3b, 0xe9, 0xc2, 0x55, 0xd0, 0x82, 0x97, 0x45, 0xbd, 0x93, 0x50, 0xc1, 0xe6, 0x10, 0x35, 0x01, 0x09, 0x01, 0x37, 0x29, 0x1c, 0xba, 0x15, 0x51, 0xce, 0x05, 0xc4, 0x3b, 0xda, + 0x0b, 0xfd, 0x80, 0xdd, 0x69, 0xbf, 0x87, 0xad, 0x20, 0xf3, 0x14, 0x68, 0x6e, 0xb5, 0xab, 0xb5, 0x65, 0x3f, 0x0e, 0x2b, 0x2a, 0xbd, 0x20, 0xe1, 0xd9, 0x7e, 0xd8, 0xee, 0xc4, 0xf7, 0xd0, 0x12, + 0xcd, 0x06, 0x04, 0xbb, 0xf7, 0xfb, 0x55, 0x9b, 0xd3, 0x00, 0xd3, 0xee, 0x09, 0xc4, 0xa5, 0x4d, 0x87, 0xd0, 0x07, 0x19, 0x24, 0x1e, 0x11, 0xe3, 0x00, 0xdb, 0x51, 0xf1, 0x38, 0x4f, 0xdd, 0xcc, + 0x07, 0xfe, 0x61, 0x8e, 0xb4, 0x38, 0x57, 0x71, 0x38, 0xa1, 0xf0, 0xf3, 0x58, 0x3c, 0x0d, 0x84, 0xd8, 0x2e, 0x92, 0xe1, 0xee, 0xf2, 0xe6, 0x35, 0x1b, 0x25, 0x35, 0x52, 0x2a, 0x12, 0x6a, 0x6d, + 0x2e, 0x3f, 0x5a, 0x8a, 0x64, 0xbb, 0x17, 0x10, 0xb9, 0xbc, 0x7c, 0xc2, 0x2c, 0x38, 0x49, 0x02, 0xb1, 0x19, 0xef, 0xa2, 0x9a, 0x51, 0x65, 0x86, 0x83, 0x5d, 0x55, 0x37, 0xd0, 0x25, 0xa2, 0xcd, + 0xaa, 0x6a, 0x49, 0xc1, 0x69, 0x2b, 0x3d, 0x1e, 0x9a, 0x85, 0x5f, 0x81, 0x68, 0x99, 0x18, 0xb7, 0x9e, 0x43, 0x10, 0x62, 0xcd, 0xf0, 0x8e, 0x4d, 0xc8, 0x76, 0xd0, 0x6b, 0x50, 0xb7, 0x7c, 0xed, + 0x3b, 0xe0, 0xa1, 0x69, 0x65, 0x43, 0x77, 0x75, 0xf3, 0x20, 0xdf, 0xde, 0x2a, 0xbc, 0xac, 0xe7, 0xec, 0x5b, 0x59, 0xef, 0x59, 0xec, 0xfa, 0xa6, 0x62, 0xde, 0x10, 0xa6, 0x14, 0x79, 0x2f, 0xd6, + 0x43, 0x0f, 0xc1, 0x51, 0x6d, 0x15, 0x88, 0xdb, 0x1d, 0xbd, 0xe7, 0xc7, 0x98, 0x6b, 0x19, 0xff, 0x99, 0x45, 0xf3, 0xae, 0xfb, 0xc1, 0xb0, 0x35, 0x2f, 0xb9, 0x58, 0x06, 0x40, 0x3d, 0xde, 0x2a, + 0x0c, 0x4a, 0x7d, 0xc6, 0xd4, 0xe1, 0x76, 0xdc, 0xef, 0x7d, 0x1f, 0x46, 0x5e, 0xb5, 0xbd, 0xf7, 0x5c, 0x65, 0xa8, 0xb1, 0x0e, 0x52, 0xa0, 0x73, 0x13, 0xab, 0x0e, 0x88, 0x00, 0xbb, 0x3c, 0x77, + 0x7f, 0x40, 0xf0, 0x48, 0x79, 0x66, 0xe6, 0x60, 0x83, 0xcd, 0x86, 0x30, 0xd2, 0x20, 0x76, 0x19, 0x74, 0x5b, 0x2f, 0x8c, 0x8d, 0xa7, 0x80, 0x7c, 0xf0, 0x75, 0x10, 0xf2, 0xfb, 0x2d, 0x7f, 0x3a, + 0x3b, 0x6b, 0x49, 0x11, 0xd5, 0xc6, 0xf5, 0xc9, 0xd0, 0x7c, 0x05, 0x51, 0x26, 0x57, 0x0e, 0x0e, 0x77, 0xc4, 0x87, 0xa0, 0x2b, 0x2f, 0x19, 0x04, 0x9f, 0xaf, 0x4f, 0x5f, 0x4a, 0xf4, 0x96, 0x3d, + 0xfd, 0x1a, 0x37, 0x40, 0xb0, 0x22, 0xde, 0xb9, 0xd5, 0xca, 0xc5, 0xf3, 0xf3, 0xa2, 0x34, 0x4b, 0xe8, 0x01, 0x3c, 0x38, 0xf2, 0x09, 0xb7, 0xcc, 0xa8, 0xf1, 0x2f, 0xf5, 0x61, 0x06, 0x33, 0x3b, + 0x4a, 0xf7, 0x6c, 0x8f, 0x85, 0x1c, 0x93, 0x5a, 0x92, 0xe4, 0x5e, 0xae, 0x40, 0xba, 0xf1, 0x7c, 0xfb, 0x4e, 0x94, 0x56, 0xa8, 0xe1, 0x3c, 0x71, 0x90, 0xd2, 0xb1, 0xa7, 0xf1, 0xaa, 0xfe, 0x9a, + 0xc3, 0xf6, 0x6f, 0x90, 0xfe, 0x9b, 0x60, 0x25, 0x4b, 0xff, 0xa5, 0x95, 0xe9, 0x3f, 0x44, 0x7c, 0xd6, 0xe4, 0x58, 0x96, 0x4e, 0xf1, 0x7f, 0x21, 0xbe, 0xf1, 0xca, 0x7b, 0xc2, 0x40, 0x2b, 0x97, + 0x98, 0x7f, 0xe6, 0x00, 0xea, 0xe2, 0xcf, 0xee, 0x82, 0xbf, 0xa1, 0xbd, 0xfc, 0x75, 0xb0, 0xec, 0xbf, 0x85, 0xf6, 0xcb, 0xa1, 0x7e, 0x43, 0xfb, 0x4b, 0xf9, 0x03, 0xda, 0x7f, 0x01, 0x7b, 0xe0, + 0x0f, 0x68, 0xff, 0x83, 0xd2, 0xa4, 0x0d, 0xf1, 0xbf, 0x3b, 0x97, 0xfe, 0x8e, 0xf6, 0x2d, 0xfd, 0xd4, 0x3d, 0xff, 0xfa, 0xcd, 0xc9, 0x5c, 0x47, 0x75, 0x8e, 0x3f, 0x4d, 0xee, 0xfb, 0xda, 0x11, + 0x7b, 0xbc, 0x06, 0xfc, 0xc8, 0x17, 0x75, 0x3b, 0xfa, 0x07, 0xee, 0xda, 0xe8, 0x49, 0x82, 0x21, 0xd8, 0x10, 0x65, 0xfc, 0x30, 0xc9, 0x8d, 0x65, 0x88, 0xd3, 0xa5, 0x91, 0x5e, 0xd9, 0xd0, 0x57, + 0xb7, 0x17, 0xdf, 0x61, 0xd1, 0x53, 0xbd, 0xe9, 0xe9, 0xf7, 0xc6, 0x44, 0xf7, 0xe4, 0xce, 0xe8, 0x62, 0x24, 0xb8, 0x92, 0xc8, 0xc1, 0x64, 0xde, 0xd8, 0xd3, 0xf0, 0xf9, 0x4c, 0xfb, 0xae, 0x8d, + 0x23, 0x67, 0x4a, 0x61, 0xf4, 0xbb, 0x63, 0xe9, 0x6f, 0x35, 0x0a, 0x7f, 0xfc, 0xbb, 0xc2, 0x1c, 0xf8, 0xbd, 0x32, 0x7f, 0x4f, 0x21, 0x55, 0xd1, 0x87, 0xc5, 0xed, 0x9e, 0x04, 0x41, 0x67, 0x91, + 0xa9, 0xa8, 0xf3, 0x9c, 0xcd, 0x88, 0xb2, 0x82, 0x7c, 0x7b, 0xc2, 0x26, 0x88, 0x55, 0xae, 0xf2, 0x1e, 0x71, 0x66, 0x30, 0xad, 0xc9, 0x81, 0x09, 0xf5, 0xcd, 0x68, 0x32, 0xff, 0x60, 0x87, 0xa1, + 0xcc, 0xbb, 0x9c, 0xa1, 0x16, 0x5e, 0xd3, 0x46, 0x00, 0x33, 0x87, 0x3d, 0x8d, 0xfd, 0xab, 0xf7, 0xdd, 0x33, 0xda, 0x11, 0x3d, 0xaf, 0xb9, 0x38, 0x24, 0xe0, 0xe6, 0xdc, 0x87, 0xd0, 0xde, 0x9c, + 0x28, 0x5f, 0x2f, 0xfb, 0x68, 0xc3, 0xc9, 0x45, 0x2b, 0x92, 0x7f, 0xe7, 0x6b, 0x64, 0x51, 0x8a, 0x77, 0x4e, 0xaa, 0xaf, 0xfd, 0xd9, 0x3c, 0x03, 0x60, 0x18, 0x57, 0x94, 0xcc, 0xf2, 0xa1, 0x25, + 0x81, 0xda, 0x1c, 0xed, 0x43, 0x65, 0x24, 0x7c, 0xff, 0x18, 0xfd, 0x43, 0x64, 0x5e, 0xda, 0xbf, 0x3b, 0x8e, 0xf9, 0xf5, 0x0d, 0x81, 0x0a, 0xfc, 0x34, 0xee, 0x3d, 0xd2, 0x1c, 0xd3, 0xd1, 0x2d, + 0x1d, 0x44, 0xbe, 0x4c, 0x81, 0x5a, 0xba, 0x51, 0xf7, 0x76, 0x1a, 0x5b, 0x53, 0x50, 0x8b, 0x23, 0xaa, 0xfc, 0xfb, 0x86, 0x84, 0x9a, 0x53, 0x7b, 0x7d, 0xba, 0x79, 0xf8, 0x5c, 0xa5, 0x4f, 0xb3, + 0xd9, 0x10, 0x3a, 0x05, 0x4f, 0x59, 0xdd, 0x11, 0x0d, 0x58, 0x06, 0x23, 0x1f, 0xd1, 0x4a, 0x3e, 0x8f, 0x83, 0xd5, 0x6d, 0x8e, 0xfe, 0x5c, 0x90, 0x99, 0x16, 0x50, 0x3c, 0xae, 0xab, 0x87, 0xbb, + 0x51, 0x1a, 0xd8, 0x6d, 0xe5, 0xeb, 0x77, 0xe9, 0x88, 0x7c, 0x58, 0x7d, 0x56, 0x65, 0xd1, 0x54, 0x86, 0x90, 0x4c, 0xa9, 0xd0, 0x1c, 0x7d, 0xe9, 0xe5, 0x94, 0xdf, 0xc7, 0xd0, 0x73, 0x03, 0x2d, + 0x26, 0xa0, 0x02, 0x30, 0xa8, 0xf7, 0x5f, 0xc6, 0x20, 0xa3, 0xb0, 0xf4, 0x4f, 0x5d, 0xf7, 0xaf, 0xa3, 0xee, 0xef, 0xe2, 0xec, 0xe7, 0xb1, 0x6f, 0x3b, 0x08, 0xa9, 0x0e, 0x25, 0xbc, 0xd7, 0x5b, + 0x1c, 0x53, 0x36, 0x17, 0x16, 0x6b, 0x61, 0x16, 0xf9, 0xd7, 0x12, 0xef, 0xfe, 0xcf, 0xbc, 0x51, 0xce, 0xfb, 0xa1, 0x45, 0x64, 0xab, 0x23, 0xb7, 0xdf, 0x81, 0xe2, 0xbe, 0x3b, 0xd3, 0xb9, 0x18, + 0xce, 0x09, 0x14, 0xdf, 0xf5, 0x5f, 0x8a, 0x0d, 0x09, 0xbe, 0xe3, 0x32, 0x4c, 0x10, 0x38, 0xb2, 0xf7, 0x54, 0x94, 0x40, 0x78, 0x7f, 0x6f, 0xaf, 0x19, 0x5a, 0xd7, 0x05, 0x5e, 0x51, 0x01, 0x1b, + 0xe2, 0x2b, 0x07, 0x3e, 0xf7, 0xb8, 0x17, 0x96, 0x1f, 0xe6, 0x3e, 0xbe, 0xc5, 0x18, 0xa6, 0x7b, 0xf2, 0x69, 0x7e, 0xed, 0x8c, 0xe3, 0xd3, 0x78, 0x7e, 0xa5, 0x64, 0x43, 0x5f, 0xe5, 0x63, 0xdb, + 0xef, 0x6b, 0x47, 0xc0, 0xfd, 0xc2, 0x45, 0xe9, 0x5f, 0x44, 0xf0, 0x51, 0x97, 0x7c, 0x45, 0x70, 0xfd, 0x49, 0xf1, 0xde, 0x59, 0x65, 0x43, 0x81, 0x1b, 0xf0, 0x9d, 0xe8, 0xfa, 0x06, 0x13, 0xf0, + 0x7e, 0x65, 0x07, 0x81, 0xef, 0xf2, 0x94, 0xeb, 0x06, 0xce, 0xeb, 0x87, 0x0e, 0x99, 0x03, 0x38, 0xc6, 0x61, 0xdd, 0xb7, 0xc1, 0xfc, 0xaa, 0xa1, 0xff, 0x3b, 0x22, 0xcb, 0x1f, 0x78, 0x2c, 0x5f, + 0x52, 0x34, 0xab, 0x21, 0xaf, 0xd3, 0x09, 0xea, 0x0b, 0xb5, 0x79, 0x3b, 0x09, 0x26, 0x03, 0xc9, 0xf2, 0x23, 0x65, 0x88, 0xc7, 0x62, 0x20, 0xae, 0x42, 0x7b, 0x59, 0xef, 0x39, 0x9b, 0x74, 0xd9, + 0xc6, 0x0b, 0x8a, 0x8b, 0xb8, 0x6d, 0xbb, 0x83, 0x27, 0x1d, 0x54, 0xba, 0xb8, 0x8f, 0x1a, 0x73, 0x2f, 0x14, 0x34, 0x1e, 0xf4, 0x6b, 0x99, 0xb8, 0xcb, 0xa9, 0x2f, 0x17, 0x58, 0xbc, 0xa9, 0xbe, + 0xf7, 0x0f, 0xe2, 0x4c, 0x28, 0x57, 0xaf, 0xd9, 0x9d, 0x6e, 0x08, 0xe2, 0xc4, 0x27, 0x6c, 0x50, 0xd8, 0xd6, 0x4d, 0x12, 0xf2, 0x44, 0xd0, 0xb9, 0x3e, 0xcb, 0xa0, 0xb9, 0xa3, 0xad, 0x56, 0x84, + 0x2b, 0xa0, 0xce, 0xea, 0x20, 0x4d, 0x0c, 0x23, 0xf3, 0x41, 0x61, 0x0d, 0x2b, 0x3e, 0xa6, 0x96, 0xea, 0x5f, 0x94, 0xfb, 0x0c, 0x07, 0xc0, 0x42, 0xea, 0xb7, 0x1b, 0xbe, 0xdd, 0xee, 0xc1, 0xe8, + 0x5c, 0xae, 0x2b, 0x23, 0x27, 0x1f, 0xe6, 0xfe, 0x29, 0x0f, 0x4b, 0xcd, 0x4e, 0x47, 0xfe, 0x68, 0xf5, 0xf5, 0x64, 0x38, 0x2b, 0x99, 0xb8, 0xca, 0x49, 0x56, 0x42, 0x14, 0xad, 0x97, 0x64, 0x36, + 0x0a, 0x53, 0x5f, 0x1a, 0x79, 0xca, 0xef, 0x31, 0x30, 0x1a, 0x7d, 0xf2, 0x68, 0xf5, 0xc1, 0x64, 0x21, 0x70, 0x7d, 0x0e, 0x04, 0x8c, 0xfa, 0xe1, 0xed, 0xe4, 0xa8, 0xa9, 0xf4, 0x6b, 0x68, 0xc2, + 0x17, 0xb2, 0x5c, 0x4a, 0x69, 0x9b, 0xd9, 0x82, 0x76, 0x1d, 0xf6, 0xd0, 0x89, 0xc5, 0x55, 0xc5, 0xf6, 0x78, 0xad, 0x05, 0x5d, 0x52, 0x6f, 0x47, 0x01, 0x17, 0x71, 0xc9, 0x1a, 0x1b, 0xc1, 0x36, + 0x7d, 0x85, 0xc2, 0xa3, 0x64, 0x2f, 0xcb, 0x7e, 0x42, 0xa1, 0xd3, 0x02, 0xc5, 0xd6, 0x6d, 0x7d, 0xd3, 0x86, 0xba, 0x86, 0xf4, 0x22, 0x05, 0x05, 0x33, 0xea, 0x7d, 0x06, 0xbd, 0x54, 0x29, 0x9b, + 0xf8, 0x90, 0x1d, 0x34, 0xd5, 0x28, 0x35, 0x65, 0x77, 0xff, 0xd0, 0x1a, 0x67, 0x77, 0x5c, 0x71, 0x39, 0x73, 0x67, 0x52, 0xec, 0x84, 0x9b, 0xa3, 0x49, 0xae, 0x1d, 0x7d, 0xe1, 0xec, 0x04, 0x4d, + 0xa5, 0x2e, 0x04, 0x55, 0x63, 0x00, 0xf4, 0x51, 0x7a, 0x06, 0x78, 0xa4, 0x06, 0x90, 0x32, 0xe1, 0xc1, 0xf1, 0x8e, 0x0b, 0xb0, 0xd1, 0x99, 0xda, 0x74, 0x94, 0x3a, 0x48, 0x91, 0x99, 0x7d, 0x53, + 0xd5, 0x6b, 0x5d, 0x31, 0xd2, 0x41, 0x47, 0xc7, 0x7b, 0x77, 0x12, 0x7c, 0x35, 0x3e, 0x5d, 0x6d, 0xbe, 0xdb, 0xdc, 0x18, 0xbf, 0x32, 0x16, 0xce, 0x09, 0x8f, 0x54, 0xfa, 0x80, 0x53, 0xfb, 0x48, + 0x01, 0xd3, 0x83, 0x58, 0xe1, 0xa3, 0xc7, 0x0b, 0x5c, 0x2c, 0xe1, 0x4d, 0x2e, 0xd5, 0xb5, 0x0e, 0x66, 0x2c, 0x64, 0x5b, 0x84, 0xfb, 0xcf, 0xd0, 0xcb, 0x87, 0x91, 0xda, 0xe6, 0xad, 0x26, 0x43, + 0xc2, 0x8b, 0x92, 0x77, 0x2e, 0x3f, 0x11, 0xfc, 0x7e, 0xb2, 0xb0, 0x19, 0x0c, 0x2f, 0xf3, 0x86, 0x87, 0x33, 0x7d, 0x3b, 0xcb, 0x93, 0xf5, 0x3e, 0xad, 0xeb, 0xd6, 0x80, 0xa8, 0x3d, 0xa8, 0x00, + 0xc4, 0xa7, 0xde, 0x0b, 0x9f, 0xf0, 0xc9, 0x20, 0x1b, 0xf7, 0x94, 0xb7, 0x35, 0x65, 0x30, 0x90, 0x6f, 0xad, 0xb5, 0x2c, 0xeb, 0x17, 0x34, 0x58, 0x86, 0x43, 0xef, 0xf6, 0xa8, 0xef, 0x65, 0x34, + 0xb4, 0x6e, 0x14, 0x56, 0x91, 0x2b, 0x39, 0xab, 0x3d, 0xe5, 0x89, 0xc2, 0xa6, 0x56, 0x7e, 0x37, 0x45, 0x4e, 0xed, 0xc8, 0xa4, 0x02, 0x12, 0xa5, 0x37, 0x97, 0x13, 0x04, 0x37, 0x45, 0xed, 0xa5, + 0x10, 0xd9, 0x93, 0xbc, 0x48, 0xbc, 0x97, 0x97, 0x15, 0x1e, 0xf7, 0x01, 0x1e, 0x33, 0x21, 0x42, 0x3c, 0x42, 0xb1, 0x92, 0x3e, 0x45, 0x87, 0xc3, 0xe9, 0x30, 0x82, 0x4f, 0xba, 0xfc, 0x90, 0x2a, + 0x74, 0xe8, 0xc4, 0x88, 0xef, 0x90, 0xb5, 0xc7, 0x4f, 0x63, 0xd3, 0xce, 0x93, 0xae, 0x74, 0x06, 0xf8, 0xb5, 0xa9, 0x91, 0x27, 0x10, 0x0f, 0x44, 0x87, 0x65, 0xa8, 0x3e, 0xdf, 0xed, 0x1b, 0xa5, + 0x32, 0x5f, 0xfb, 0x64, 0xe1, 0xfb, 0x11, 0xc6, 0xf4, 0x5f, 0x78, 0x1a, 0x01, 0xff, 0xd4, 0xd4, 0xe8, 0x4b, 0xef, 0xe9, 0x8f, 0xea, 0x22, 0x7b, 0x76, 0x29, 0x83, 0x6a, 0x03, 0x5b, 0x3d, 0x3a, + 0xdf, 0x19, 0x2c, 0xcb, 0x83, 0x63, 0x1c, 0x56, 0x98, 0xbc, 0x1e, 0x28, 0x10, 0x3b, 0x2c, 0x3e, 0xb6, 0x62, 0x1c, 0xfa, 0xe5, 0x08, 0xd9, 0x50, 0x27, 0xd5, 0x01, 0xc3, 0x99, 0xf4, 0x27, 0xc8, + 0x83, 0xc8, 0x5f, 0x76, 0x14, 0xd3, 0xf3, 0x69, 0x3c, 0x9f, 0x46, 0x66, 0x2b, 0x45, 0x74, 0x09, 0x42, 0xcc, 0xd7, 0x19, 0x1b, 0x63, 0x0a, 0xaf, 0xf3, 0x3c, 0xa2, 0x76, 0x4d, 0x72, 0x68, 0x87, + 0x4d, 0xd6, 0xe6, 0xe0, 0xd5, 0x0a, 0x90, 0xeb, 0xef, 0x2b, 0x13, 0x9c, 0xf5, 0xf0, 0x4b, 0xb2, 0x9d, 0x6d, 0x78, 0x58, 0xdd, 0x6c, 0xcf, 0xa1, 0xea, 0xd9, 0x59, 0x8a, 0xa8, 0xf6, 0xcf, 0x60, + 0xee, 0xe0, 0x06, 0x0b, 0x86, 0xd7, 0x86, 0x53, 0xbd, 0x85, 0x6f, 0x04, 0x81, 0x6d, 0x0f, 0x98, 0x83, 0xc1, 0x60, 0x10, 0xd5, 0x7a, 0x01, 0x65, 0xe8, 0xe3, 0x2b, 0x1c, 0x3d, 0x5c, 0x72, 0x4f, + 0x02, 0x38, 0x64, 0xbf, 0xfb, 0x65, 0xa1, 0xf6, 0x37, 0x18, 0x14, 0x0b, 0x6e, 0x0a, 0xe4, 0xda, 0x1c, 0xf9, 0x50, 0x48, 0x15, 0x86, 0x83, 0x90, 0x29, 0x1a, 0x82, 0x4a, 0xc6, 0x1e, 0x49, 0x46, + 0xc4, 0xfe, 0xca, 0x67, 0xc7, 0xdb, 0x95, 0xe2, 0x06, 0xc7, 0x49, 0xe7, 0x1b, 0x74, 0x26, 0xa9, 0xd2, 0x44, 0x13, 0x0d, 0x44, 0xa2, 0xf5, 0x78, 0xdc, 0x5b, 0x0d, 0x78, 0x89, 0xd3, 0xd2, 0x3b, + 0x84, 0x76, 0x98, 0x0f, 0x32, 0x11, 0x5b, 0x25, 0x14, 0xd5, 0x54, 0xbe, 0xa9, 0xad, 0xc2, 0xdb, 0x70, 0xc7, 0xd3, 0x1f, 0xf4, 0x90, 0xa8, 0x5e, 0xa0, 0x51, 0x26, 0xd1, 0xce, 0x5e, 0x7e, 0x61, + 0x36, 0x5c, 0x2a, 0x59, 0x47, 0xd9, 0x8b, 0x19, 0xcb, 0xae, 0xce, 0xed, 0x30, 0x56, 0xea, 0xc7, 0x76, 0x12, 0xd8, 0x46, 0x08, 0xa0, 0x34, 0xf3, 0xc8, 0xe9, 0x14, 0x34, 0x75, 0xe7, 0x92, 0x72, + 0x73, 0xb4, 0xe0, 0xea, 0x8c, 0x72, 0x5d, 0x39, 0x2f, 0x5c, 0x0f, 0x61, 0xab, 0xc2, 0x8d, 0xa3, 0x80, 0xb6, 0xb3, 0x96, 0x76, 0xad, 0xc0, 0x0a, 0x10, 0xee, 0xa3, 0x57, 0xa5, 0x39, 0xb8, 0x9f, + 0x0d, 0x92, 0xc8, 0x5e, 0xe3, 0x75, 0x62, 0x8a, 0xf9, 0xf4, 0xd3, 0x48, 0x2a, 0xfb, 0x09, 0x10, 0xed, 0x59, 0x7e, 0x4c, 0x91, 0x99, 0xba, 0x66, 0xfc, 0xa9, 0x16, 0x74, 0x7e, 0x4d, 0x21, 0x17, + 0x3e, 0x0c, 0xd2, 0xe3, 0xe9, 0x46, 0xe7, 0xa3, 0x41, 0x87, 0x5e, 0x46, 0x1b, 0x3d, 0x82, 0xc0, 0xac, 0x50, 0xee, 0xb8, 0x23, 0xec, 0x55, 0xa0, 0xad, 0x36, 0x21, 0xb7, 0x49, 0x30, 0xef, 0xcf, + 0x04, 0xcb, 0xce, 0x7d, 0x0f, 0xa5, 0x7b, 0x7e, 0xce, 0x13, 0x40, 0x83, 0xab, 0x95, 0xec, 0x8b, 0x60, 0x57, 0xaa, 0x44, 0x3f, 0xc6, 0x09, 0x1b, 0x23, 0x12, 0x7e, 0x18, 0x54, 0x05, 0x3d, 0xbf, + 0x2c, 0x56, 0x98, 0x28, 0x95, 0x3a, 0x53, 0x83, 0xae, 0x5f, 0x4d, 0xc5, 0x60, 0x9a, 0xf9, 0x81, 0xc8, 0x8f, 0x27, 0x61, 0x53, 0x45, 0x70, 0xc7, 0x12, 0xce, 0xdf, 0x05, 0xd5, 0xb3, 0x3e, 0x7d, + 0x79, 0x02, 0x3e, 0x2d, 0x00, 0xa2, 0xab, 0xec, 0x76, 0x28, 0x91, 0xf1, 0x79, 0xc4, 0xca, 0x35, 0x62, 0xbe, 0x29, 0x1e, 0x4d, 0xe9, 0x77, 0x1d, 0x82, 0x49, 0x09, 0xc3, 0x42, 0x84, 0x64, 0xa9, + 0x0b, 0x56, 0x3a, 0x8a, 0x71, 0xc3, 0xf1, 0x87, 0x1e, 0x21, 0x22, 0x6c, 0x37, 0xd1, 0x45, 0x1a, 0x51, 0x61, 0x6f, 0xec, 0xe9, 0xdd, 0xaf, 0xfe, 0xf1, 0x12, 0x1b, 0xcb, 0x3b, 0x51, 0x17, 0x70, + 0xad, 0xd2, 0x55, 0x33, 0x33, 0x56, 0xf5, 0xf9, 0xd2, 0xab, 0xcd, 0x6b, 0xd9, 0xce, 0xb2, 0x44, 0xfa, 0xba, 0xed, 0x30, 0x8c, 0x8b, 0xfb, 0x9a, 0x41, 0xfc, 0xce, 0xd8, 0xe3, 0xff, 0xc7, 0xda, + 0x9d, 0x2c, 0xb7, 0x09, 0x03, 0x60, 0x00, 0xbe, 0xeb, 0x55, 0x38, 0x00, 0x31, 0x4d, 0xd0, 0x11, 0xb1, 0x99, 0xcd, 0x6c, 0x11, 0x24, 0xbe, 0x99, 0xb0, 0xc8, 0x82, 0x64, 0x20, 0x6c, 0x82, 0xa7, + 0xef, 0xb8, 0xd3, 0x69, 0x3b, 0xc1, 0xee, 0x32, 0xcd, 0x55, 0x2f, 0xf0, 0x8d, 0xfe, 0xd1, 0xaf, 0x7f, 0x6c, 0x27, 0xeb, 0x5f, 0x15, 0xdf, 0x7e, 0xdc, 0xf2, 0x37, 0x8a, 0xab, 0xf6, 0x45, 0x9e, + 0xd3, 0xcf, 0xfd, 0x7f, 0x17, 0xbd, 0x58, 0x65, 0x1a, 0x76, 0x73, 0x70, 0x6f, 0x98, 0x46, 0x6d, 0xae, 0x0f, 0x91, 0x73, 0xbf, 0x2d, 0x53, 0xe1, 0x8f, 0xfb, 0x7e, 0xe0, 0xb3, 0x04, 0xbf, 0x00, + 0x0e, 0xae, 0x08, 0xbe, 0x6c, 0x05, 0xaf, 0x16, 0x2f, 0xf9, 0x28, 0xf8, 0xb7, 0xb3, 0x1f, 0x82, 0x2b, 0xbf, 0x8e, 0x85, 0xfe, 0xaf, 0xe0, 0x17, 0xc0, 0xc1, 0x4d, 0xc1, 0xe9, 0x1f, 0xca, 0x55, + 0xf6, 0xce, 0xad, 0x6c, 0xf3, 0x80, 0xef, 0x0a, 0x71, 0x4c, 0x54, 0xa6, 0xf0, 0xb4, 0x01, 0x71, 0x04, 0x91, 0x55, 0xbd, 0xce, 0x38, 0xb1, 0x9f, 0xc5, 0x73, 0x2f, 0x50, 0x19, 0xc7, 0x11, 0x79, + 0x34, 0xce, 0x8b, 0xdc, 0x93, 0x40, 0xee, 0xb3, 0x8e, 0x26, 0x72, 0xf8, 0x46, 0x95, 0x45, 0xc7, 0x4c, 0xf7, 0x60, 0xe9, 0xe9, 0x3d, 0xd3, 0x87, 0x2e, 0xee, 0x77, 0x2d, 0xe1, 0x10, 0x84, 0x67, + 0x87, 0xe3, 0xea, 0x36, 0x1a, 0x35, 0xd5, 0x01, 0x7c, 0xb1, 0x2f, 0x4c, 0x64, 0x39, 0xb0, 0x2e, 0x76, 0x5f, 0x58, 0xc1, 0xdb, 0xd2, 0x3b, 0x0e, 0xf1, 0x92, 0x06, 0xa6, 0x9a, 0xce, 0xa5, 0x90, + 0xec, 0x9d, 0x2b, 0x39, 0xc6, 0xc1, 0x76, 0xfa, 0xc4, 0xe0, 0xd1, 0xa4, 0x45, 0x15, 0x81, 0x7e, 0xd6, 0x70, 0xef, 0x15, 0xcf, 0x2c, 0x20, 0xba, 0x6a, 0x74, 0x2b, 0xd7, 0xde, 0x3e, 0xef, 0xd7, + 0xaf, 0xcc, 0xf7, 0x7f, 0x2f, 0x57, 0xa1, 0x4e, 0x06, 0x29, 0x2c, 0xb9, 0x2e, 0xb7, 0xb1, 0x56, 0xb7, 0xb9, 0xf0, 0x7a, 0xc7, 0xc2, 0xc3, 0x2a, 0x84, 0xf0, 0x29, 0x8e, 0xdb, 0xfa, 0xa8, 0x37, + 0x27, 0x05, 0x4a, 0x9e, 0x20, 0x3d, 0x26, 0x7e, 0x6c, 0x0a, 0xba, 0x26, 0xbe, 0x30, 0x4f, 0x53, 0x86, 0xfe, 0xd4, 0xe5, 0xca, 0x4a, 0x33, 0x54, 0x59, 0x4c, 0xf1, 0x26, 0x8f, 0x88, 0x81, 0x5b, + 0x0c, 0x72, 0x05, 0xf0, 0x93, 0x1f, 0xce, 0x0e, 0xc9, 0x9e, 0x73, 0xcd, 0xc0, 0xda, 0x1b, 0x24, 0xe5, 0x03, 0x92, 0x76, 0x54, 0x6a, 0x87, 0xa3, 0x3b, 0x1d, 0xc7, 0x3d, 0x9d, 0xf9, 0x46, 0x6c, + 0xfc, 0xb4, 0x5b, 0x57, 0x2b, 0x3c, 0xb4, 0x04, 0x8a, 0x3e, 0x85, 0xf3, 0x6f, 0x2f, 0xa6, 0x5f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb9, 0x24, 0x7d, 0x75, 0xbd, 0xdf, 0x01, + 0x00, 0x5e, 0x4b, 0x03, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x54, + 0x92, 0xcf, 0x6e, 0xdb, 0x3c, 0x10, 0xc4, 0xef, 0x7c, 0x8a, 0xf9, 0x9c, 0x83, 0x63, 0xe0, 0x93, 0x94, 0xdc, 0x02, 0x5d, 0xd3, 0xa4, 0xbd, 0x14, 0x2d, 0xd0, 0x00, 0x6d, 0x91, 0x06, 0x15, 0x4d, + 0xae, 0x2d, 0x26, 0xd4, 0xae, 0xc0, 0x3f, 0x4e, 0x8d, 0xa2, 0xef, 0x5e, 0x90, 0x8e, 0x1b, 0xe7, 0xc8, 0xd9, 0xe5, 0xce, 0x8f, 0xc3, 0x3d, 0xc3, 0x7b, 0xc1, 0xb5, 0x97, 0x6c, 0x71, 0xb3, 0x23, + 0x4e, 0x11, 0xb7, 0x99, 0x4d, 0x72, 0xc2, 0x4a, 0x7d, 0x25, 0x6f, 0x64, 0x22, 0x24, 0xc1, 0x5e, 0x72, 0x00, 0xd3, 0x73, 0xe9, 0x3e, 0x36, 0xfc, 0x87, 0xbb, 0x91, 0xb0, 0x16, 0xe7, 0x29, 0xcc, + 0x5e, 0x27, 0xc2, 0xe6, 0xa5, 0x02, 0x23, 0x96, 0x60, 0x34, 0x63, 0x4d, 0xd8, 0x48, 0x66, 0x0b, 0xc7, 0xb8, 0x1f, 0x8e, 0xf5, 0x76, 0x2b, 0xc3, 0xc3, 0xf9, 0xc9, 0x69, 0xd5, 0xe2, 0x6e, 0x74, + 0xaf, 0xde, 0x08, 0x14, 0x67, 0x61, 0x1b, 0x8b, 0xf7, 0xfd, 0x29, 0xde, 0xc3, 0xf9, 0x98, 0xd2, 0x1c, 0xfb, 0xae, 0x33, 0x45, 0xa5, 0x2a, 0xb6, 0x4e, 0xba, 0x55, 0xab, 0xd4, 0xd9, 0x19, 0xde, + 0xd1, 0x8e, 0xbc, 0xcc, 0x13, 0x71, 0x52, 0xea, 0xe5, 0x50, 0xc1, 0x37, 0xa4, 0x53, 0x0e, 0x14, 0xb1, 0xde, 0x43, 0x5b, 0xeb, 0x78, 0x0b, 0x8d, 0x44, 0x31, 0x55, 0x8b, 0x7f, 0x68, 0x3f, 0x8b, + 0xf4, 0x96, 0xef, 0x28, 0xad, 0xb0, 0x91, 0x00, 0xd2, 0x66, 0x3c, 0x0e, 0xfb, 0x1f, 0x9a, 0x2d, 0x8c, 0xf0, 0xc6, 0x85, 0x09, 0x2e, 0xe1, 0x59, 0xc2, 0x53, 0xc4, 0xb3, 0x4b, 0x23, 0x86, 0xad, + 0xd4, 0xf1, 0x43, 0x5b, 0x38, 0x66, 0x2f, 0xfb, 0x43, 0x88, 0x66, 0xd4, 0xbc, 0xa5, 0x88, 0x1c, 0x0b, 0x42, 0xf5, 0x85, 0xad, 0xf5, 0xa1, 0x05, 0xbe, 0x4b, 0xae, 0xb9, 0x69, 0x1f, 0x05, 0x8e, + 0x77, 0xf2, 0x44, 0x87, 0x6b, 0x47, 0x18, 0x65, 0x5d, 0x20, 0x93, 0xfc, 0xbe, 0xbc, 0x23, 0x64, 0xe6, 0x32, 0xa5, 0x38, 0x57, 0xcf, 0x3a, 0x2d, 0x64, 0x1e, 0x2a, 0x58, 0x1a, 0x89, 0x8f, 0x3e, + 0x26, 0x07, 0x3f, 0xf4, 0x4a, 0x0d, 0xc3, 0x60, 0x84, 0xa3, 0x78, 0x52, 0x45, 0x42, 0xb3, 0x43, 0xf3, 0x0d, 0x9f, 0x3f, 0x7d, 0xb9, 0x43, 0x63, 0xb1, 0xfc, 0xbd, 0x98, 0x28, 0x46, 0xbd, 0xa5, + 0x45, 0x8f, 0xc5, 0x48, 0xde, 0xcb, 0xe2, 0xcf, 0x12, 0x3f, 0x14, 0xd0, 0x7c, 0x58, 0x5e, 0x0b, 0x27, 0xe2, 0xd4, 0xa4, 0xfd, 0x4c, 0x3d, 0xf4, 0x3c, 0x7b, 0x67, 0x74, 0x81, 0xea, 0x1e, 0xa3, + 0xf0, 0x6b, 0x1b, 0x35, 0xce, 0xf6, 0xb8, 0x3c, 0x15, 0xa2, 0xe4, 0x60, 0xa8, 0x47, 0xfd, 0xb4, 0xa6, 0xfe, 0x5a, 0x43, 0xbf, 0xf4, 0x34, 0x7b, 0x7a, 0xd3, 0x96, 0xd7, 0x8f, 0x64, 0x52, 0x8f, + 0x1b, 0x33, 0x4a, 0x09, 0xb6, 0xf8, 0x9d, 0x36, 0x1c, 0xac, 0x3f, 0xee, 0xeb, 0x32, 0xbc, 0xb9, 0x39, 0x93, 0xd9, 0x51, 0x88, 0x4e, 0xb8, 0xc7, 0x65, 0x7b, 0x71, 0xa8, 0x95, 0x5d, 0xe9, 0xbb, + 0xce, 0x8b, 0xd1, 0x7e, 0x94, 0x98, 0xfa, 0xab, 0x8b, 0xab, 0x8b, 0xae, 0x84, 0xa0, 0xd4, 0xad, 0x04, 0x4c, 0x52, 0x3e, 0x31, 0x12, 0xe1, 0x3e, 0x8d, 0x04, 0x23, 0x05, 0x28, 0x11, 0xac, 0x98, + 0x5c, 0x56, 0xa8, 0xbe, 0xee, 0xe1, 0x7c, 0x79, 0xdc, 0xb9, 0xad, 0x4b, 0x63, 0x5e, 0xb7, 0x46, 0xa6, 0xee, 0x89, 0x75, 0x72, 0x3b, 0xea, 0x4a, 0xe4, 0x5d, 0x0a, 0x44, 0xdd, 0xa4, 0x1d, 0x77, + 0x56, 0x4c, 0x5c, 0xae, 0x94, 0xfa, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x27, 0x80, 0x38, 0xa2, 0xec, 0x01, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6f, 0xac, 0x55, + 0x41, 0x6f, 0xe3, 0x36, 0x13, 0x3d, 0x5b, 0xbf, 0x62, 0xa0, 0xc3, 0xf7, 0xd9, 0x81, 0x2b, 0x01, 0x3d, 0xee, 0x6d, 0x9b, 0xcd, 0x62, 0x7b, 0xe8, 0xa6, 0x48, 0xd3, 0x43, 0x4f, 0x0d, 0x43, 0x8e, + 0x25, 0x62, 0x29, 0x8e, 0x4a, 0x8e, 0xec, 0x18, 0x41, 0xfe, 0x7b, 0x31, 0xa4, 0x2c, 0x2b, 0xce, 0xda, 0x9b, 0x43, 0x4f, 0x12, 0x87, 0xc3, 0x79, 0x8f, 0xc3, 0xc7, 0xc7, 0xba, 0x86, 0x5e, 0xe9, + 0x6f, 0xaa, 0x41, 0xd8, 0x0c, 0x5e, 0xb3, 0x25, 0x0f, 0x36, 0x82, 0xf2, 0x80, 0x4f, 0xaa, 0xeb, 0x1d, 0x02, 0x6d, 0x40, 0xc1, 0xe7, 0x69, 0x4e, 0x62, 0x1d, 0x7a, 0x56, 0x69, 0xb8, 0x6b, 0xad, + 0x6e, 0x8b, 0xba, 0x86, 0x80, 0xb1, 0x27, 0x6f, 0x22, 0x30, 0xc1, 0xb5, 0xa3, 0xc1, 0xdc, 0x6c, 0xd1, 0x73, 0xac, 0x8a, 0xba, 0x96, 0xe9, 0xfb, 0xd6, 0xc6, 0x09, 0xc8, 0xab, 0x0e, 0x41, 0x2b, + 0x0f, 0x8f, 0x08, 0xba, 0x55, 0xbe, 0x41, 0x03, 0xbb, 0x16, 0x3d, 0x0c, 0xd1, 0xfa, 0x06, 0xb8, 0x45, 0x28, 0x5b, 0x8a, 0x5c, 0xc2, 0xe3, 0x60, 0x9d, 0xc1, 0x20, 0x15, 0x96, 0x2a, 0xa6, 0x35, + 0x32, 0xdb, 0x91, 0x19, 0x1c, 0x82, 0xf5, 0xd0, 0x50, 0xd5, 0x91, 0x59, 0x15, 0xa7, 0x7b, 0x28, 0x0a, 0xdb, 0xf5, 0x14, 0x18, 0x96, 0xc5, 0xa2, 0xd4, 0xe4, 0x19, 0x9f, 0xb8, 0x2c, 0x16, 0xe5, + 0xa6, 0xe3, 0xb2, 0x28, 0x16, 0x65, 0x63, 0xb9, 0x1d, 0x1e, 0x2b, 0x4d, 0x5d, 0xad, 0x85, 0x2d, 0x26, 0xb6, 0x75, 0x34, 0xdf, 0x7e, 0x6a, 0xa8, 0xde, 0xfe, 0x5c, 0xa7, 0x40, 0x59, 0xac, 0x0a, + 0xc1, 0xfe, 0x6d, 0xff, 0x79, 0xd6, 0x9b, 0x3d, 0x0d, 0x61, 0x02, 0xfa, 0x7f, 0x3c, 0x69, 0x49, 0x35, 0x6d, 0x37, 0x72, 0x18, 0xf2, 0xa2, 0xef, 0x6c, 0xb8, 0x2a, 0x78, 0xdf, 0xe3, 0xbc, 0x72, + 0x4e, 0x7f, 0x7e, 0x49, 0x88, 0x5f, 0x71, 0x07, 0x9a, 0x7c, 0x8e, 0xa5, 0xe3, 0xb0, 0x3e, 0xb2, 0xf2, 0x3a, 0x9d, 0xc7, 0x2b, 0x06, 0x15, 0xc0, 0xaf, 0x2c, 0xbc, 0xb4, 0x72, 0x0e, 0x0d, 0xa0, + 0xd2, 0x2d, 0xb0, 0xed, 0x10, 0x94, 0x54, 0xf2, 0xb8, 0x3b, 0x9e, 0x6c, 0xc4, 0xb0, 0xb5, 0x1a, 0x53, 0x76, 0x40, 0xc5, 0x68, 0x2a, 0xc8, 0x64, 0xa7, 0x94, 0x6e, 0x88, 0x2c, 0x3c, 0x85, 0xb3, + 0x81, 0xf2, 0x2b, 0xee, 0xca, 0x35, 0x28, 0xad, 0xb1, 0xe7, 0x54, 0x8e, 0x40, 0x85, 0x66, 0x90, 0xed, 0x0a, 0x2d, 0x03, 0x01, 0x79, 0x08, 0xfe, 0x94, 0xa1, 0x1a, 0xb7, 0x33, 0x04, 0xcc, 0x1a, + 0x01, 0x7c, 0x92, 0xf3, 0x88, 0x40, 0x3e, 0x25, 0x70, 0x8b, 0x52, 0x2e, 0x0e, 0xbd, 0x84, 0xd1, 0xc0, 0x17, 0xe5, 0x8d, 0x43, 0x88, 0xb6, 0xf1, 0x4a, 0x96, 0xc5, 0xaa, 0x10, 0x4e, 0xd2, 0x89, + 0xe5, 0x0a, 0xae, 0x66, 0x8d, 0x7a, 0x2e, 0x16, 0x23, 0xe8, 0xff, 0x8e, 0xd1, 0xe7, 0x97, 0x22, 0x77, 0x6e, 0xac, 0xa3, 0x20, 0xe0, 0x3f, 0x03, 0x46, 0x1e, 0x45, 0xf5, 0xaa, 0x65, 0x13, 0xd5, + 0x83, 0x3c, 0x6f, 0x27, 0x52, 0xb0, 0x21, 0xe7, 0x68, 0x27, 0x4b, 0x3a, 0xe4, 0x96, 0xcc, 0x8c, 0x11, 0x78, 0xc4, 0xac, 0xf0, 0x47, 0x3c, 0x9e, 0x3a, 0x1a, 0xd8, 0x50, 0x48, 0x00, 0x52, 0x6a, + 0xc2, 0x60, 0x82, 0xc8, 0x2a, 0xf0, 0x87, 0x8c, 0xb1, 0xc8, 0xc4, 0x96, 0xab, 0xf9, 0x3f, 0x60, 0x08, 0x14, 0x66, 0x91, 0x51, 0xaa, 0xd5, 0x75, 0xfe, 0xae, 0x2e, 0x4c, 0xbd, 0x59, 0x9b, 0x24, + 0x5b, 0xa5, 0x7b, 0xb7, 0x3a, 0x13, 0xfe, 0x11, 0xde, 0x1a, 0xce, 0x14, 0xb9, 0x98, 0x77, 0x91, 0x09, 0x5c, 0xcd, 0x46, 0xe7, 0x72, 0x96, 0xf3, 0xa4, 0x75, 0xae, 0xf7, 0x7e, 0xf8, 0x33, 0x08, + 0x97, 0x17, 0x9d, 0x83, 0x7c, 0x2d, 0x87, 0x38, 0xb3, 0xc5, 0x99, 0x10, 0x0e, 0x97, 0xe4, 0x7b, 0x22, 0x38, 0x7a, 0x50, 0x5d, 0x4f, 0x22, 0x18, 0xc5, 0xbc, 0xdc, 0xcc, 0x95, 0xbc, 0x82, 0x03, + 0x53, 0x7e, 0x82, 0xb7, 0x6c, 0xdf, 0xc1, 0x57, 0xee, 0x42, 0x7d, 0x55, 0x2c, 0xe0, 0x0a, 0xfe, 0xba, 0xfd, 0xf3, 0x0e, 0xae, 0x6f, 0x3f, 0xdd, 0xc0, 0x97, 0x9b, 0xbb, 0x1b, 0x09, 0xa5, 0xf0, + 0x7d, 0xd8, 0x43, 0x18, 0xbc, 0x17, 0x41, 0x3f, 0x34, 0x04, 0x8c, 0x91, 0x1f, 0x2a, 0x80, 0x8f, 0xc6, 0x40, 0x47, 0x01, 0x53, 0x00, 0x54, 0x72, 0x35, 0xd0, 0x64, 0x92, 0xab, 0x3e, 0xb4, 0x89, + 0xd7, 0xdf, 0x32, 0x57, 0x35, 0xf4, 0x50, 0x49, 0xa9, 0xba, 0x28, 0x16, 0x9b, 0x8e, 0xab, 0xdf, 0x83, 0xf5, 0xec, 0xfc, 0xb2, 0xbc, 0x43, 0x8d, 0x76, 0x2b, 0x8e, 0x93, 0xbc, 0x72, 0xf5, 0x7a, + 0x1a, 0x57, 0x50, 0xd7, 0x80, 0xba, 0x25, 0x69, 0x82, 0x23, 0xad, 0x1c, 0xd0, 0xc0, 0xfd, 0xc0, 0xc7, 0xeb, 0x8b, 0x6b, 0xf0, 0xd6, 0xcd, 0xf3, 0x92, 0x87, 0x85, 0xf1, 0x2a, 0xdf, 0xdf, 0x7e, + 0xba, 0xfd, 0x00, 0x7f, 0x48, 0xff, 0xe6, 0x43, 0xea, 0x8f, 0xa3, 0x8f, 0xce, 0x6e, 0xf1, 0x38, 0xbc, 0x43, 0x65, 0xf6, 0x73, 0x1b, 0xc8, 0x4f, 0x19, 0xf5, 0xd2, 0x6e, 0xe5, 0x0e, 0x57, 0x3a, + 0x3b, 0xd2, 0x68, 0xc8, 0x43, 0x44, 0x23, 0xd0, 0xd3, 0x59, 0x42, 0x4c, 0xbf, 0xf3, 0xcb, 0x1c, 0x61, 0x67, 0xb9, 0x05, 0x67, 0x99, 0xe5, 0x45, 0x0c, 0x62, 0x83, 0x91, 0x15, 0x63, 0xb2, 0xc0, + 0xce, 0x7a, 0xdb, 0x29, 0x97, 0x5a, 0x29, 0x7d, 0x16, 0xe7, 0xb1, 0x21, 0xd5, 0x8a, 0x15, 0xc0, 0x2f, 0x7b, 0x29, 0x25, 0x96, 0x83, 0xca, 0x80, 0x6e, 0x89, 0xc6, 0x67, 0x6e, 0xf6, 0x24, 0x4a, + 0x31, 0xab, 0x27, 0xbc, 0x75, 0xb2, 0x49, 0x21, 0xb8, 0xa1, 0x80, 0x72, 0x6c, 0xd9, 0x2e, 0xa7, 0x27, 0x81, 0x42, 0x42, 0xce, 0x03, 0xe9, 0xab, 0xb3, 0x1e, 0x0d, 0xa8, 0x47, 0xda, 0x62, 0xb2, + 0x74, 0x84, 0x28, 0x8f, 0xce, 0x5b, 0x0f, 0x53, 0xe1, 0xc4, 0x78, 0x5b, 0x0c, 0x28, 0x02, 0xd8, 0xa1, 0x73, 0xeb, 0xbc, 0xf7, 0x7d, 0xda, 0x2e, 0x0d, 0xdc, 0x26, 0x4b, 0x1c, 0x51, 0x7a, 0xb2, + 0x9e, 0x31, 0x40, 0xc8, 0xe7, 0x1e, 0x0e, 0xe6, 0x99, 0x94, 0xfd, 0x1f, 0x28, 0x39, 0x57, 0x83, 0xfa, 0x54, 0xcb, 0x22, 0xbd, 0x6c, 0xa1, 0x97, 0xe5, 0x27, 0x8b, 0xdf, 0xa9, 0x40, 0x49, 0xfd, + 0xa1, 0x08, 0xeb, 0x1a, 0x5e, 0x8a, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xcf, 0xe8, 0xdf, 0xc0, 0x6e, 0x03, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, + 0x74, 0x2e, 0x67, 0x6f, 0x5c, 0x90, 0x41, 0x8b, 0xdb, 0x30, 0x10, 0x85, 0xcf, 0x9a, 0x5f, 0x31, 0x15, 0x94, 0x48, 0xc5, 0xb5, 0xa0, 0xc7, 0x42, 0x0e, 0x6d, 0x77, 0x4b, 0x7b, 0xe9, 0x65, 0xf3, + 0x07, 0x14, 0x69, 0x62, 0x8b, 0x38, 0x92, 0x91, 0xc6, 0xd9, 0x5d, 0xca, 0xfe, 0xf7, 0x32, 0x4e, 0x1a, 0xc2, 0x9e, 0x6c, 0x3f, 0x3f, 0xbe, 0x79, 0xef, 0xcd, 0x3e, 0x1c, 0xfd, 0x40, 0x78, 0x58, + 0x72, 0xe0, 0x54, 0x32, 0x40, 0x3a, 0xcd, 0xa5, 0x32, 0x1a, 0x50, 0x3a, 0x94, 0xcc, 0xf4, 0xc2, 0x1a, 0x94, 0x66, 0x6a, 0x9c, 0xf2, 0xa0, 0x01, 0x94, 0x1e, 0x12, 0x8f, 0xcb, 0xbe, 0x0f, 0xe5, + 0xe4, 0xc2, 0x54, 0x96, 0x48, 0x67, 0xca, 0xdc, 0x5c, 0x8b, 0xc7, 0xcf, 0x43, 0x71, 0xe7, 0x2f, 0x6e, 0x15, 0x34, 0x58, 0x00, 0xe7, 0x70, 0x47, 0x8d, 0x7f, 0xf9, 0x1c, 0x27, 0x42, 0xca, 0x6d, + 0xa9, 0xd4, 0x90, 0x47, 0xcf, 0x78, 0xd5, 0x7c, 0x08, 0x34, 0x73, 0x43, 0x8f, 0x67, 0x3f, 0xa5, 0x88, 0x3f, 0x84, 0xf8, 0x28, 0x00, 0x7c, 0x4e, 0x3c, 0x96, 0x85, 0x91, 0x6a, 0x2d, 0xb5, 0x07, + 0x89, 0x78, 0x47, 0x33, 0x8c, 0x9f, 0xae, 0xa9, 0xfa, 0x9d, 0xc5, 0xbf, 0xa0, 0x9c, 0xc3, 0x6f, 0xad, 0xd1, 0x69, 0x3f, 0x11, 0x28, 0xc2, 0xaf, 0x5b, 0x5c, 0x83, 0xf4, 0x7f, 0xe8, 0xd9, 0x58, + 0x50, 0xd4, 0x3f, 0x11, 0xff, 0x7e, 0x30, 0x3a, 0x45, 0xfd, 0xff, 0x73, 0xf7, 0x3a, 0x93, 0xd1, 0xfc, 0x3a, 0xd3, 0x4d, 0x7a, 0x2a, 0x4b, 0x0d, 0x64, 0x74, 0x5b, 0x9f, 0x37, 0xf9, 0xc1, 0xb3, + 0x37, 0x5a, 0xe6, 0x70, 0xf3, 0xe4, 0x53, 0xd6, 0x1d, 0xea, 0xe8, 0xd9, 0x6b, 0x0b, 0x97, 0xcb, 0x81, 0x41, 0x51, 0x18, 0x4b, 0x27, 0x79, 0xe5, 0xf8, 0x35, 0xe6, 0x75, 0xc4, 0xfe, 0xbb, 0x0f, + 0xc7, 0xa1, 0x96, 0x25, 0x47, 0x63, 0x3b, 0x24, 0x0b, 0x2a, 0x1d, 0x56, 0xeb, 0x87, 0x2d, 0xe6, 0x34, 0x49, 0x01, 0xc5, 0xfd, 0x4f, 0xcf, 0x7e, 0x32, 0x54, 0xab, 0x05, 0xf5, 0x06, 0xb7, 0x4e, + 0x95, 0x2f, 0xf6, 0x30, 0x16, 0xdc, 0xde, 0xfb, 0x1f, 0x65, 0x9b, 0x83, 0xd1, 0x95, 0x02, 0xa5, 0x33, 0xc5, 0xf5, 0xd7, 0x65, 0x7f, 0x8b, 0xce, 0xe1, 0xc1, 0xa7, 0x09, 0x4b, 0x16, 0x59, 0x80, + 0x02, 0x69, 0x5c, 0x53, 0x1e, 0x8c, 0xb0, 0xfa, 0xb5, 0x95, 0xb5, 0x92, 0xe1, 0xd2, 0xe6, 0x1d, 0x96, 0x47, 0xc2, 0x1b, 0x7a, 0xc5, 0x22, 0xbd, 0xcc, 0x14, 0x98, 0x22, 0x8a, 0x1f, 0xb9, 0xe0, + 0x9e, 0x70, 0x23, 0xef, 0x9b, 0x0e, 0x87, 0xc2, 0xb8, 0xf9, 0xd8, 0x36, 0xba, 0xc3, 0x7b, 0xbc, 0x5c, 0x7e, 0x83, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x4a, 0xc6, + 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x04, 0xc0, 0xd1, 0x11, 0xc2, 0x30, 0x08, 0x00, 0xd0, 0x7f, 0xa6, 0x60, 0x01, 0x83, 0xa9, 0x4e, 0x24, 0x60, 0xe4, 0x6c, 0xe1, 0x4c, 0x20, 0xf3, 0xfb, + 0xae, 0x90, 0x3a, 0x15, 0xdf, 0xe5, 0x9c, 0x16, 0x0e, 0x30, 0x02, 0x7b, 0xeb, 0x4f, 0x80, 0xa9, 0xbf, 0xb2, 0xa9, 0x38, 0x2c, 0x3f, 0xf5, 0x6a, 0x1c, 0x17, 0xf1, 0x19, 0x25, 0xba, 0xd5, 0x73, + 0xd1, 0x92, 0xef, 0x6d, 0x04, 0xed, 0x03, 0xf7, 0xd1, 0xfa, 0xa3, 0xdd, 0x91, 0x08, 0xcd, 0xc5, 0xa6, 0x72, 0xc2, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa3, 0xb7, 0x09, 0xae, + 0x51, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, + 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, + 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, + 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, + 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, + 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, + 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, + 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x54, 0x90, 0x41, 0x6f, 0xd3, 0x40, 0x10, 0x85, 0xef, 0xfb, 0x2b, 0x1e, 0xca, + 0xa1, 0x8d, 0x94, 0xda, 0x77, 0x38, 0x82, 0x0a, 0x95, 0x90, 0xe0, 0x10, 0x89, 0x43, 0x55, 0xe1, 0xcd, 0xee, 0x38, 0x5e, 0x75, 0x3d, 0x63, 0x76, 0xc6, 0x89, 0xf2, 0xef, 0xd1, 0x9a, 0xb8, 0xa1, + 0x37, 0xcf, 0xf3, 0xf8, 0xf3, 0x37, 0x6f, 0x83, 0x6f, 0xfb, 0xfd, 0x4f, 0x3c, 0xce, 0x1c, 0x2c, 0x09, 0xe3, 0x89, 0xd5, 0x3c, 0x07, 0x72, 0xee, 0x17, 0xe5, 0x20, 0x23, 0xc1, 0x04, 0x17, 0x99, + 0x0b, 0x98, 0xce, 0xf8, 0x2a, 0x6f, 0x9b, 0x1f, 0xb0, 0x1f, 0x08, 0x07, 0x49, 0x99, 0xca, 0x94, 0xbd, 0x11, 0xfa, 0x95, 0x11, 0x24, 0x12, 0x82, 0x67, 0x1c, 0x08, 0xbd, 0xcc, 0x1c, 0x91, 0xd8, + 0x3d, 0x77, 0xeb, 0xfb, 0xe6, 0x28, 0xdd, 0xcb, 0xfd, 0x7f, 0xd3, 0xb6, 0xc1, 0x7e, 0x48, 0x7a, 0x93, 0x28, 0xa4, 0x93, 0x70, 0xd4, 0xfa, 0xef, 0x45, 0xaf, 0xd0, 0x9f, 0x99, 0xd4, 0xb4, 0x71, + 0x6e, 0xb3, 0xc1, 0x17, 0x3a, 0x51, 0x96, 0x69, 0x24, 0x36, 0xe7, 0xae, 0xc3, 0xa2, 0xd7, 0x93, 0xb7, 0xb9, 0x90, 0xe2, 0x70, 0x81, 0x8f, 0x31, 0xf1, 0x11, 0x1e, 0x46, 0x6a, 0x15, 0x74, 0x13, + 0xf8, 0x5d, 0xa3, 0xf7, 0x16, 0x6b, 0xb4, 0x45, 0x2f, 0xc5, 0x91, 0x0f, 0xc3, 0x0a, 0xdb, 0xc1, 0x73, 0x44, 0x10, 0xee, 0x53, 0x19, 0x91, 0x0c, 0x67, 0x29, 0xaf, 0x8a, 0x73, 0xb2, 0x01, 0xdd, + 0x51, 0x16, 0x7c, 0xd7, 0x38, 0xf7, 0x83, 0x03, 0xfd, 0x2b, 0xea, 0xad, 0x87, 0xa4, 0x98, 0xbc, 0x6a, 0xd5, 0xa8, 0x5b, 0xba, 0x43, 0xa4, 0x29, 0xcb, 0xa5, 0x52, 0xe6, 0x25, 0x5e, 0x94, 0xae, + 0x69, 0xd7, 0xa0, 0x56, 0xea, 0x96, 0xac, 0xc3, 0xe7, 0xef, 0x4f, 0xf0, 0x59, 0x05, 0xd2, 0xf7, 0x54, 0x14, 0x4a, 0x27, 0x2a, 0x3e, 0x43, 0x6c, 0xa0, 0xb2, 0xf0, 0x96, 0xf3, 0x38, 0x22, 0xde, + 0xea, 0x40, 0x90, 0x71, 0xf4, 0x1c, 0xf5, 0x13, 0x94, 0xae, 0x28, 0x3c, 0x3c, 0x0c, 0x94, 0xa7, 0xae, 0x5e, 0x86, 0x51, 0x0a, 0x35, 0xce, 0x3d, 0x5e, 0x1f, 0x77, 0x75, 0x0d, 0xcf, 0x36, 0x50, + 0xfd, 0x72, 0xca, 0x64, 0x84, 0x28, 0x61, 0xae, 0x2c, 0x5f, 0x6f, 0x78, 0xb9, 0xbf, 0x1b, 0xcc, 0x26, 0xfd, 0xd8, 0xb6, 0xc7, 0x64, 0xc3, 0x7c, 0x68, 0x82, 0x8c, 0xed, 0x2b, 0x7b, 0x4b, 0x27, + 0x6a, 0x2b, 0xbe, 0xb5, 0x42, 0xd4, 0x8e, 0x3e, 0x71, 0x1b, 0x25, 0xe8, 0xdd, 0xd6, 0x39, 0xf7, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x32, 0xa2, 0x9d, 0xb2, 0x62, 0x01, 0x00, + 0x00, 0x55, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, + 0x6f, 0xac, 0x56, 0xcf, 0x6e, 0x1b, 0xbf, 0x11, 0x3e, 0x47, 0x4f, 0x31, 0xd0, 0xa1, 0x95, 0x0c, 0x41, 0x7a, 0x86, 0x5f, 0x03, 0x18, 0xe9, 0xa1, 0x41, 0x90, 0x14, 0x28, 0x8a, 0xb6, 0x87, 0x59, + 0x72, 0x76, 0x97, 0x08, 0x97, 0xb3, 0x19, 0x92, 0x92, 0x05, 0x23, 0xef, 0x5e, 0x0c, 0x49, 0xad, 0xd6, 0xb1, 0xe1, 0xdf, 0x25, 0x27, 0x5b, 0x4b, 0x72, 0xfe, 0x7d, 0xdf, 0x7c, 0x33, 0xa7, 0x13, + 0xcc, 0x68, 0xbe, 0xe3, 0x40, 0xd0, 0xe7, 0x60, 0x92, 0xe3, 0x00, 0x2e, 0x02, 0x06, 0xa0, 0x27, 0x9c, 0x66, 0x4f, 0xc0, 0x3d, 0x20, 0x3c, 0x2e, 0x67, 0xfa, 0x6d, 0xa2, 0x90, 0x50, 0x7f, 0x1e, + 0x37, 0xa7, 0xd3, 0xe6, 0x74, 0x82, 0x7f, 0x8e, 0x2e, 0x2e, 0x76, 0x02, 0x4e, 0x04, 0x06, 0x03, 0x74, 0x04, 0x66, 0xc4, 0x30, 0x90, 0x85, 0xcb, 0x48, 0x01, 0x72, 0x74, 0x61, 0x80, 0x34, 0x12, + 0x6c, 0x47, 0x8e, 0x69, 0x0b, 0x5d, 0x76, 0xde, 0x92, 0xa8, 0x85, 0x1d, 0xc6, 0xf2, 0x46, 0x4f, 0x27, 0xb6, 0xd9, 0x37, 0x3b, 0x2e, 0xc0, 0xc0, 0xc7, 0x89, 0xed, 0x7e, 0xf3, 0x6b, 0x9c, 0x9b, + 0x8d, 0x9b, 0x66, 0x96, 0x04, 0xbb, 0xcd, 0x87, 0xad, 0xe1, 0x90, 0xe8, 0x29, 0x6d, 0x37, 0x1f, 0xb6, 0xfd, 0x54, 0xfe, 0x04, 0x4a, 0xa7, 0x31, 0xa5, 0x79, 0xbb, 0xd9, 0x6f, 0xd4, 0xc3, 0x3f, + 0xae, 0x8f, 0xab, 0x04, 0xd5, 0xcf, 0x92, 0xf0, 0x2c, 0x7c, 0x76, 0x96, 0x2c, 0x74, 0x57, 0x48, 0x9a, 0x8a, 0x77, 0x9d, 0xa0, 0x5c, 0x8f, 0x4b, 0x6e, 0x31, 0x49, 0x36, 0x29, 0xcb, 0x9b, 0xd9, + 0x1d, 0x37, 0xe9, 0x3a, 0xd3, 0xda, 0x41, 0xbd, 0xfe, 0xfc, 0xb3, 0x38, 0xfe, 0x4c, 0x17, 0x30, 0x1c, 0xea, 0xb7, 0x52, 0x5a, 0x17, 0x62, 0xc2, 0x60, 0x4a, 0x6d, 0xaf, 0x9c, 0x65, 0x89, 0xe4, + 0x08, 0xf0, 0xf7, 0xa4, 0xe1, 0x19, 0xf4, 0x9e, 0x2c, 0x10, 0x9a, 0x11, 0x92, 0x9b, 0x08, 0x10, 0x02, 0x5d, 0xd4, 0xda, 0xfa, 0xed, 0x8b, 0x24, 0x22, 0xc9, 0xd9, 0x19, 0x2a, 0xaf, 0x85, 0x30, + 0x91, 0x3d, 0x42, 0x0d, 0x7e, 0xb9, 0x32, 0xe5, 0x98, 0x34, 0x6e, 0xcd, 0xc1, 0xaa, 0xb1, 0xed, 0x67, 0xba, 0x6c, 0x0f, 0x80, 0xc6, 0xd0, 0x9c, 0x20, 0x30, 0xa0, 0x0c, 0x59, 0xd1, 0x8d, 0x07, + 0xc0, 0x60, 0x41, 0x28, 0x65, 0x09, 0x80, 0xab, 0xfc, 0x2f, 0xa3, 0x33, 0x23, 0xd0, 0x93, 0x56, 0x3e, 0x02, 0x26, 0xf0, 0x84, 0x31, 0xa9, 0x31, 0x84, 0x4f, 0x18, 0xac, 0x27, 0x98, 0x28, 0x8d, + 0x6c, 0x61, 0xa7, 0x16, 0x78, 0x56, 0xcf, 0xe8, 0xfd, 0x15, 0x30, 0x5c, 0x6f, 0x41, 0xa3, 0xb5, 0xae, 0x7e, 0x6f, 0x97, 0x23, 0x58, 0x8a, 0x46, 0x5c, 0x57, 0xe3, 0x72, 0x95, 0x08, 0x86, 0xa7, + 0x12, 0x0c, 0x74, 0xe4, 0xf9, 0xb2, 0x3f, 0x6e, 0x34, 0x13, 0xad, 0xe7, 0x6e, 0x0f, 0x0f, 0xab, 0x72, 0x3f, 0x6f, 0x3e, 0xb4, 0x48, 0xff, 0x72, 0xff, 0xfa, 0xfc, 0x73, 0x53, 0xeb, 0xdf, 0xa2, + 0x42, 0x10, 0xfa, 0x91, 0x29, 0xa6, 0xc6, 0xc3, 0x17, 0x85, 0x5f, 0xca, 0xda, 0x7c, 0xec, 0xfa, 0xb5, 0x83, 0x7d, 0xb3, 0xb1, 0x33, 0xe9, 0x09, 0x1a, 0xd3, 0x8e, 0x1f, 0xeb, 0xdf, 0x03, 0x08, + 0x45, 0x50, 0xa2, 0x1d, 0xbf, 0x52, 0x9c, 0x39, 0x44, 0xfa, 0x97, 0xb8, 0x44, 0xa2, 0x07, 0x3f, 0xe0, 0xa1, 0x9d, 0x14, 0xcf, 0x7b, 0x8d, 0xb4, 0x9f, 0xd2, 0xf1, 0x8b, 0xb8, 0x90, 0x7c, 0xd8, + 0x6d, 0xdb, 0x01, 0x08, 0x19, 0x72, 0x67, 0xb2, 0xdb, 0x7d, 0xbd, 0xf0, 0x38, 0xeb, 0x8d, 0x7e, 0x27, 0x14, 0x0f, 0xf0, 0xea, 0xd6, 0x7f, 0xc3, 0x76, 0xdf, 0x92, 0xfb, 0x96, 0x50, 0xd6, 0x8c, + 0xd1, 0x46, 0xa3, 0x33, 0x09, 0xe0, 0xeb, 0xdc, 0xa0, 0x10, 0x19, 0x45, 0xa9, 0xd1, 0x1a, 0xf7, 0xcb, 0x8d, 0xf9, 0x89, 0x2b, 0xf3, 0xcb, 0xf9, 0x0d, 0x41, 0x14, 0x02, 0xf4, 0xfe, 0xce, 0x8a, + 0x42, 0x0a, 0x0a, 0x67, 0x27, 0x1c, 0xf4, 0x03, 0x9c, 0x51, 0x1c, 0x76, 0x9e, 0xa2, 0x1a, 0xab, 0xd4, 0xc0, 0x79, 0xf6, 0xd7, 0xc5, 0xde, 0x8a, 0xd9, 0x8f, 0x2c, 0xd0, 0x51, 0x4a, 0xb4, 0x2a, + 0xbb, 0xb2, 0x08, 0x3b, 0xe7, 0x5d, 0xba, 0x1e, 0x20, 0x51, 0xbc, 0xfd, 0x28, 0x7c, 0x52, 0x02, 0x72, 0x97, 0x63, 0x0a, 0x14, 0xe3, 0x01, 0x5c, 0xc9, 0x93, 0x82, 0xe1, 0x2c, 0x38, 0xd4, 0x98, + 0x73, 0xa4, 0xea, 0xa7, 0x45, 0xdc, 0xb3, 0x14, 0x36, 0xc7, 0x02, 0xf1, 0xa2, 0x14, 0xa7, 0x93, 0xc2, 0xd6, 0xbb, 0x21, 0x4b, 0xd1, 0x2d, 0x10, 0x4c, 0x23, 0x09, 0xa4, 0x11, 0x03, 0x78, 0xe6, + 0xef, 0xe5, 0x36, 0xcb, 0xdb, 0xb9, 0x01, 0x0b, 0xf4, 0x1e, 0x87, 0x58, 0xf4, 0xe0, 0x4d, 0x7e, 0x14, 0x18, 0xde, 0xa6, 0x07, 0xca, 0x10, 0x61, 0xc2, 0xf9, 0x3f, 0x31, 0x89, 0x0b, 0xc3, 0xff, + 0xea, 0x9f, 0x3d, 0x90, 0x08, 0x0b, 0x3c, 0xab, 0x49, 0x80, 0x17, 0xa4, 0x58, 0x78, 0xfd, 0xad, 0x82, 0xb5, 0xdd, 0xd7, 0x4b, 0x8d, 0xe3, 0xc1, 0x79, 0xfd, 0x7d, 0xc3, 0x9f, 0xe7, 0x3f, 0x83, + 0x5f, 0x51, 0xe5, 0x79, 0xbe, 0xa3, 0x5e, 0x54, 0x61, 0xc2, 0x2b, 0x8c, 0x38, 0xcf, 0x14, 0x4a, 0xe6, 0x42, 0x18, 0x39, 0x44, 0x88, 0x59, 0x31, 0xd4, 0x96, 0xd3, 0x9a, 0x08, 0x45, 0x33, 0x92, + 0xca, 0xb1, 0x05, 0x0e, 0x89, 0x01, 0xc1, 0xba, 0xbe, 0x27, 0xd1, 0x02, 0x05, 0xb6, 0x74, 0x50, 0x7b, 0xf5, 0x6e, 0x9e, 0xad, 0xaa, 0x0e, 0x5c, 0x5c, 0x1a, 0xab, 0x5e, 0x91, 0xc0, 0x99, 0x24, + 0x3a, 0x0e, 0x07, 0xad, 0xa1, 0xab, 0xcd, 0x1f, 0xf2, 0xd4, 0x91, 0xa8, 0x14, 0xbc, 0x62, 0x68, 0xa1, 0x91, 0xbb, 0x39, 0x8f, 0x06, 0xd5, 0xaf, 0xe5, 0x4b, 0x00, 0x9b, 0x49, 0xf1, 0xf6, 0x7c, + 0x01, 0xcf, 0xb8, 0x48, 0x9b, 0x8e, 0x2a, 0x18, 0x98, 0x2d, 0xcc, 0x1e, 0x4d, 0xb9, 0x62, 0x3c, 0x61, 0xc8, 0xb3, 0xd2, 0x47, 0xad, 0x09, 0xa1, 0x2a, 0x14, 0x15, 0xf9, 0x11, 0x8a, 0x9c, 0xc5, + 0x50, 0xbc, 0xcb, 0x18, 0x99, 0xa4, 0xaf, 0x3a, 0x82, 0x09, 0x43, 0x2e, 0x42, 0x25, 0x54, 0x5e, 0x2c, 0xe5, 0x5a, 0x10, 0x5f, 0xe3, 0xcd, 0xf3, 0x5b, 0x70, 0x2f, 0xb0, 0xae, 0xc0, 0x6a, 0x48, + 0xfd, 0xe1, 0xdd, 0x99, 0xda, 0x6c, 0xbd, 0xa9, 0xe2, 0x8d, 0xb6, 0xad, 0x73, 0xbc, 0xe7, 0x4b, 0x54, 0x61, 0xd2, 0x88, 0x26, 0x16, 0x02, 0x4b, 0xa4, 0xdd, 0xe4, 0x82, 0x75, 0x06, 0x93, 0x72, + 0x1d, 0x8b, 0xd6, 0xfe, 0x22, 0x5e, 0x11, 0x50, 0xad, 0x97, 0xaa, 0xe8, 0xa3, 0x1e, 0xb3, 0x4f, 0xa0, 0x9f, 0xb4, 0x75, 0x7e, 0x19, 0xda, 0x2d, 0xb4, 0x08, 0x49, 0x32, 0x95, 0x82, 0xf7, 0xaf, + 0xc6, 0xa1, 0x29, 0xcf, 0x22, 0x04, 0x4e, 0x60, 0x09, 0xad, 0x67, 0xf3, 0x9d, 0x6c, 0x69, 0x49, 0x6d, 0x09, 0x8d, 0x4f, 0x8a, 0xda, 0x29, 0x12, 0x7f, 0x80, 0xc9, 0x31, 0xf1, 0x54, 0x6c, 0xbd, + 0x74, 0x55, 0xf4, 0xfe, 0xde, 0x9e, 0xca, 0xb9, 0x8e, 0xb4, 0x6b, 0xfb, 0xec, 0xeb, 0x52, 0xb0, 0x22, 0x6a, 0x1c, 0x39, 0x7b, 0x5b, 0x7c, 0x76, 0xd4, 0x7a, 0x36, 0x3a, 0x4b, 0xa2, 0x9e, 0x6b, + 0xf5, 0xfa, 0x02, 0xa3, 0xa5, 0x99, 0x82, 0x55, 0x0a, 0xb6, 0xa1, 0x17, 0x9b, 0x54, 0xb9, 0x33, 0x15, 0xa6, 0x71, 0xe9, 0x6e, 0xad, 0x60, 0x35, 0xa3, 0x41, 0x3d, 0x81, 0xe7, 0xc1, 0x99, 0x77, + 0x40, 0x2d, 0x08, 0xbd, 0x8d, 0xea, 0xae, 0x63, 0xf6, 0x87, 0x0a, 0xee, 0xfe, 0xd6, 0xb4, 0x0d, 0x62, 0x2d, 0xe3, 0xe1, 0x65, 0x57, 0x7e, 0x25, 0xb4, 0xd7, 0xf7, 0xb0, 0x3e, 0xd4, 0xe4, 0x97, + 0x6a, 0x91, 0x3d, 0xc0, 0xc5, 0x79, 0x0f, 0x14, 0xa2, 0x4e, 0xd9, 0x1b, 0xce, 0x6d, 0x64, 0xd5, 0xfc, 0xb4, 0x30, 0x13, 0x5a, 0xaa, 0xe2, 0x4a, 0xcb, 0x52, 0xf6, 0xd7, 0xb8, 0x8c, 0xb6, 0xb1, + 0xcc, 0x29, 0x81, 0x1c, 0x92, 0xf3, 0xeb, 0xd2, 0x57, 0x63, 0x75, 0x68, 0x6b, 0xc0, 0xef, 0x94, 0xa1, 0x04, 0xff, 0x5b, 0xca, 0xd0, 0x26, 0xef, 0x7b, 0x9c, 0x6f, 0x9b, 0x54, 0x8e, 0x55, 0xcf, + 0x97, 0x82, 0x40, 0x2c, 0xff, 0x2e, 0xe4, 0xa8, 0x03, 0x46, 0x95, 0xc5, 0xbb, 0x94, 0x74, 0x2d, 0x15, 0xdd, 0x57, 0x62, 0xc2, 0x44, 0x75, 0x57, 0x99, 0x5c, 0x70, 0x13, 0xfa, 0x32, 0x45, 0xaa, + 0x74, 0xfd, 0xc8, 0x4e, 0x8a, 0xb1, 0x78, 0x04, 0xf8, 0xdb, 0xf5, 0x6e, 0xdc, 0x85, 0x41, 0xcd, 0xa5, 0xf5, 0xd6, 0xaa, 0x96, 0x9c, 0x59, 0xfc, 0x1d, 0x80, 0x43, 0xdd, 0xf3, 0x7a, 0x16, 0x1a, + 0xb8, 0xed, 0x23, 0x6d, 0x8b, 0xd3, 0x29, 0x13, 0x6c, 0xdb, 0x8a, 0xd4, 0x14, 0xe7, 0xe4, 0x5d, 0x50, 0x9e, 0x76, 0x5c, 0xfa, 0xf0, 0x33, 0xb7, 0x6e, 0xad, 0xdd, 0x75, 0x6f, 0x01, 0xa7, 0xab, + 0x4e, 0xaf, 0x77, 0x0f, 0xc5, 0x66, 0xbc, 0xc6, 0x44, 0x53, 0x05, 0xdf, 0x0d, 0xa1, 0x51, 0x56, 0x4f, 0x6e, 0xa2, 0x68, 0xef, 0x1d, 0xb2, 0x0e, 0xc0, 0xf5, 0x6d, 0x22, 0x36, 0x73, 0x2f, 0x10, + 0xfd, 0x7d, 0xfb, 0x4a, 0x81, 0xf8, 0xf4, 0x00, 0xff, 0x56, 0xc5, 0xf9, 0x56, 0x8b, 0xf4, 0xa9, 0xb1, 0xec, 0x23, 0x5b, 0x82, 0x4f, 0x24, 0x04, 0x0f, 0xa7, 0x8a, 0xfa, 0xff, 0x03, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc8, 0x9d, 0xa7, 0x1e, 0x01, 0x05, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x64, 0x90, 0xcd, 0xae, 0xdb, 0x20, 0x10, 0x46, 0xd7, 0xcc, 0x53, 0x4c, 0x91, + 0x2a, 0xc1, 0x95, 0x85, 0xa3, 0x2e, 0x23, 0x65, 0x93, 0xa8, 0x3f, 0xab, 0x2c, 0xd2, 0xbc, 0x00, 0x85, 0x71, 0xec, 0xc6, 0x01, 0x07, 0x86, 0x38, 0x55, 0x95, 0x77, 0xaf, 0x70, 0x53, 0x29, 0xea, + 0xdd, 0x00, 0x62, 0x3e, 0x0e, 0x67, 0x66, 0xb2, 0xee, 0x6c, 0x4f, 0x84, 0x5d, 0x09, 0x8e, 0x87, 0x18, 0x00, 0x86, 0xcb, 0x14, 0x13, 0xa3, 0x02, 0x21, 0x5d, 0x0c, 0x4c, 0x77, 0x96, 0x20, 0x64, + 0x20, 0x6e, 0x7b, 0xe6, 0xe9, 0xf5, 0xbc, 0x2c, 0x4c, 0x79, 0x09, 0xd4, 0x7d, 0x08, 0x27, 0x09, 0x1a, 0xa0, 0x6d, 0xf1, 0x48, 0x99, 0xbf, 0xd9, 0xe0, 0x47, 0x42, 0x0a, 0xb9, 0x24, 0xca, 0xc8, + 0xbd, 0x65, 0xe4, 0x9e, 0xd0, 0xc5, 0x90, 0x39, 0x15, 0xc7, 0x31, 0x61, 0x22, 0x2e, 0x29, 0x64, 0xb4, 0x01, 0xe3, 0x8f, 0x9f, 0xe4, 0x18, 0xe7, 0x7e, 0x70, 0x3d, 0xf6, 0xcb, 0xdb, 0x0c, 0xd5, + 0xeb, 0x05, 0xa6, 0x18, 0xdf, 0x9e, 0x3f, 0x99, 0xa3, 0xc6, 0xdf, 0x20, 0x6e, 0x36, 0x55, 0x57, 0x31, 0x23, 0xe2, 0x06, 0xff, 0x19, 0x99, 0x3d, 0xcd, 0x07, 0x72, 0x31, 0x79, 0x4a, 0x4a, 0x83, + 0x10, 0x89, 0xae, 0xef, 0xca, 0xd7, 0x42, 0x99, 0x95, 0xfc, 0xfa, 0xf9, 0x28, 0x1b, 0x94, 0xb5, 0xb6, 0x6e, 0x5b, 0xba, 0xdb, 0xcb, 0x34, 0x92, 0x71, 0xf1, 0xd2, 0x2e, 0xbd, 0x35, 0x18, 0x86, + 0xf1, 0x2f, 0x22, 0xe3, 0x5b, 0x4d, 0x99, 0x03, 0xe5, 0x29, 0x86, 0x4c, 0x20, 0x34, 0x80, 0xd8, 0xd3, 0xac, 0xb4, 0x79, 0xfa, 0x3d, 0x47, 0x66, 0xb6, 0xd6, 0x9d, 0x4f, 0x29, 0x96, 0xe0, 0x95, + 0x6e, 0x70, 0x6e, 0x30, 0xd1, 0x55, 0xc3, 0xc2, 0xd8, 0xe0, 0x5c, 0x09, 0x65, 0xe4, 0x6a, 0xe6, 0xa9, 0xa3, 0x3a, 0x86, 0x6c, 0xb6, 0xd1, 0xff, 0x32, 0xbb, 0x31, 0x66, 0x52, 0x15, 0x3b, 0x74, + 0xcb, 0xed, 0x77, 0xb6, 0x5c, 0xf2, 0x2e, 0x7a, 0xc2, 0x0f, 0x1b, 0xfc, 0xb4, 0x5a, 0xd5, 0xa6, 0x05, 0x9b, 0x2f, 0x96, 0xed, 0xd8, 0x29, 0x59, 0x02, 0xdd, 0x27, 0x72, 0x4c, 0xbe, 0xc6, 0x17, + 0x2d, 0x74, 0xd1, 0xd3, 0x1a, 0x3f, 0xde, 0x64, 0xf3, 0x1f, 0x42, 0x83, 0x78, 0xc0, 0x03, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x41, 0x39, 0xf1, 0xa6, 0x42, 0x01, 0x00, + 0x00, 0xf5, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0xca, 0xcd, 0x4f, 0x29, + 0xcd, 0x49, 0x55, 0x48, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xe3, 0xe2, 0x4a, 0xcf, 0x57, 0x30, 0xd4, 0x33, 0x34, 0xe1, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, + 0xe0, 0x7c, 0xeb, 0x1f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x54, 0x52, 0x5d, 0x4f, 0xe3, 0x48, 0x10, 0x7c, 0x9f, 0x5f, 0x51, 0x17, 0x1e, 0x42, 0x24, 0x1c, 0xc3, 0x1b, + 0xf2, 0x2b, 0x07, 0xc7, 0x49, 0x77, 0x3a, 0xa4, 0xcb, 0xe9, 0x56, 0x62, 0xd1, 0x7a, 0x32, 0xee, 0xc4, 0x43, 0xc6, 0xdd, 0xde, 0xf9, 0x30, 0x44, 0xab, 0xfd, 0xef, 0xab, 0x19, 0x12, 0x08, 0x6f, + 0x76, 0x75, 0xf7, 0x54, 0x75, 0x75, 0x9d, 0xe1, 0x0f, 0xc1, 0x8d, 0x93, 0xd4, 0xe1, 0x76, 0x22, 0x8e, 0x01, 0x77, 0x89, 0x4d, 0xb4, 0xc2, 0x4a, 0xfd, 0x4f, 0xce, 0xc8, 0x40, 0x88, 0x82, 0xbd, + 0x24, 0x0f, 0xa6, 0x97, 0xdc, 0x7d, 0x6c, 0xf8, 0x0d, 0xab, 0x9e, 0xb0, 0x16, 0xeb, 0xc8, 0x8f, 0x4e, 0x47, 0xc2, 0xe6, 0x50, 0x81, 0x91, 0x8e, 0x60, 0x34, 0x63, 0x4d, 0xd8, 0x48, 0xe2, 0x0e, + 0x96, 0xf1, 0xd8, 0xf6, 0x9a, 0x3b, 0x47, 0xcb, 0xad, 0xb4, 0x4f, 0xe7, 0xef, 0xdf, 0x8b, 0x25, 0x56, 0xbd, 0xfd, 0xe0, 0x85, 0x0d, 0x18, 0x48, 0x73, 0xcc, 0xbc, 0x9e, 0xc2, 0x28, 0xdc, 0x81, + 0x5e, 0x8d, 0x4b, 0xc1, 0x4e, 0xe4, 0xf6, 0x19, 0x7e, 0x3c, 0x55, 0xfc, 0x74, 0xde, 0xc7, 0x38, 0x86, 0xa6, 0xae, 0x4d, 0x46, 0xa9, 0x80, 0x4b, 0x2b, 0xf5, 0xe2, 0x02, 0xeb, 0x14, 0xb3, 0xf6, + 0xa2, 0xc5, 0xd3, 0x20, 0x13, 0x21, 0xf6, 0x04, 0xd3, 0x93, 0xd9, 0x61, 0x23, 0x1e, 0x31, 0x53, 0x5b, 0x2e, 0xe8, 0xbb, 0x7c, 0x9d, 0x05, 0x47, 0xbc, 0x58, 0xe7, 0xde, 0x15, 0x3c, 0xa7, 0x10, + 0xb1, 0xb1, 0x5c, 0xec, 0x18, 0x9d, 0xb6, 0x8c, 0x49, 0xb3, 0x75, 0x4e, 0xc3, 0xb2, 0x91, 0xc1, 0xf2, 0x16, 0xf7, 0xab, 0xd5, 0x03, 0x3c, 0x7d, 0x4f, 0x14, 0x62, 0x58, 0x2a, 0x75, 0x76, 0x86, + 0xdf, 0x69, 0x22, 0x27, 0xe3, 0x40, 0x1c, 0x95, 0x3a, 0xfc, 0x14, 0x23, 0x37, 0xa4, 0x63, 0xf2, 0x14, 0xb0, 0xde, 0x43, 0x77, 0x5d, 0x1e, 0xd7, 0x88, 0x14, 0xca, 0xda, 0x47, 0xab, 0xbe, 0x65, + 0xe0, 0xd4, 0xaf, 0x23, 0xb0, 0x28, 0xe2, 0x49, 0x9b, 0xfe, 0xf8, 0xd0, 0x45, 0x51, 0x6d, 0x84, 0x37, 0xd6, 0x0f, 0x45, 0xbd, 0xf8, 0x5d, 0xc0, 0x8b, 0x8d, 0x3d, 0xda, 0xad, 0x94, 0xa7, 0xdb, + 0xa5, 0x52, 0xff, 0x8d, 0x5d, 0x3e, 0x55, 0xde, 0xd7, 0x27, 0xe6, 0xc2, 0xcb, 0xda, 0xc9, 0x16, 0xb2, 0xf9, 0xec, 0x42, 0x0a, 0xb9, 0x98, 0xa1, 0x36, 0x63, 0x2d, 0x6e, 0xfe, 0xfa, 0x13, 0xe2, + 0x61, 0x9c, 0x25, 0x8e, 0x70, 0x76, 0xed, 0xb5, 0xdf, 0x5f, 0x1c, 0xdd, 0x3a, 0x9c, 0xdb, 0xf2, 0x24, 0x3b, 0xea, 0x0e, 0xd3, 0x1a, 0x83, 0xe6, 0xa4, 0x9d, 0xdb, 0x57, 0xc6, 0x93, 0x8e, 0xd4, + 0xbd, 0x85, 0xad, 0x5c, 0xae, 0x51, 0xaa, 0x6d, 0x5b, 0x23, 0x1c, 0xc4, 0x91, 0x32, 0xc9, 0x3b, 0x54, 0x13, 0xaa, 0x2f, 0x78, 0xf8, 0xe7, 0xdf, 0x15, 0xaa, 0x0e, 0xf3, 0x1f, 0xb3, 0x81, 0x42, + 0xd0, 0x5b, 0x9a, 0x35, 0x98, 0xf5, 0xe4, 0x9c, 0xcc, 0x7e, 0xce, 0xf1, 0x55, 0x01, 0xd5, 0xfd, 0xfc, 0x46, 0x38, 0x12, 0xc7, 0x2a, 0xee, 0x47, 0x6a, 0xa0, 0xc7, 0xd1, 0x59, 0xa3, 0xb3, 0xf2, + 0xfa, 0x39, 0x08, 0x7f, 0xb4, 0x51, 0x65, 0xbb, 0x06, 0x57, 0xa7, 0x40, 0x90, 0xe4, 0x0d, 0x35, 0x28, 0x81, 0xa9, 0x4a, 0x62, 0x2a, 0x7a, 0xd5, 0xc3, 0xe8, 0xe8, 0x53, 0x5b, 0x5a, 0x3f, 0x93, + 0x89, 0x0d, 0x6e, 0x4d, 0x2f, 0xd9, 0xdb, 0xcc, 0x77, 0xda, 0xf0, 0x46, 0xfd, 0xf7, 0xbe, 0xac, 0xf3, 0x69, 0x72, 0x24, 0x33, 0x91, 0x0f, 0x56, 0xb8, 0xc1, 0xd5, 0xf2, 0xf2, 0xad, 0x96, 0x73, + 0xda, 0xd4, 0xb5, 0x13, 0xa3, 0x5d, 0x2f, 0x21, 0x36, 0xd7, 0x97, 0xd7, 0x97, 0x75, 0x36, 0x41, 0xa9, 0x3b, 0xf1, 0x18, 0x24, 0xdf, 0x31, 0x10, 0xe1, 0xb1, 0xa4, 0x54, 0xb2, 0xa0, 0x48, 0xe8, + 0xc4, 0xa4, 0x9c, 0xa0, 0xb2, 0xdd, 0xd3, 0xf9, 0xfc, 0x98, 0xf7, 0xad, 0x8d, 0x7d, 0x5a, 0x2f, 0x8d, 0x0c, 0xf5, 0x8e, 0x75, 0xb4, 0x13, 0xd5, 0xf9, 0x52, 0x75, 0xf4, 0x44, 0xf5, 0xa0, 0x2d, + 0xd7, 0x9d, 0x98, 0x30, 0x5f, 0x28, 0xf5, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc2, 0x4a, 0x3e, 0xd9, 0x3e, 0x02, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x04, 0xc0, 0xd1, 0x11, 0x80, 0x20, 0x08, 0x00, 0xd0, 0x7f, 0xa6, 0x60, 0x81, 0x30, 0xbd, 0x5a, 0x28, + 0x25, 0xf3, 0x52, 0xb9, 0x54, 0x98, 0xbf, 0xd7, 0x24, 0x69, 0x65, 0xbc, 0xb5, 0xc7, 0x55, 0xa4, 0x03, 0x64, 0x41, 0x4f, 0xfe, 0x00, 0x18, 0xfc, 0x69, 0x19, 0x8c, 0xb9, 0xac, 0x47, 0x2f, 0x8a, + 0xd2, 0x5c, 0xac, 0xa2, 0x89, 0x8d, 0xfb, 0x9a, 0x6e, 0xa6, 0x77, 0xcb, 0xe2, 0x2c, 0xa0, 0x05, 0x3a, 0x69, 0x87, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9a, 0xe7, 0x37, 0x3e, + 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x8c, 0x52, + 0xc1, 0x8a, 0xdb, 0x40, 0x0c, 0x3d, 0x5b, 0x5f, 0xf1, 0xf0, 0xa1, 0xc4, 0x26, 0xf5, 0x40, 0x8f, 0xbd, 0x95, 0x6d, 0x60, 0x6f, 0x29, 0xa1, 0x3d, 0xf4, 0xd4, 0xb8, 0x33, 0x8a, 0x33, 0xec, 0x78, + 0x14, 0xc6, 0x9a, 0xb0, 0x4b, 0xe9, 0xbf, 0x17, 0x3b, 0x61, 0x9b, 0x06, 0xd7, 0xec, 0xc5, 0x1e, 0x3d, 0x3d, 0xe9, 0x89, 0x27, 0x9d, 0x5a, 0xfb, 0xd4, 0x76, 0x8c, 0x43, 0x8e, 0x56, 0xbd, 0x44, + 0x22, 0xdf, 0x9f, 0x24, 0x29, 0x56, 0x54, 0x94, 0x56, 0xa2, 0xf2, 0xb3, 0x96, 0x54, 0x94, 0x87, 0x5e, 0x4b, 0xa2, 0xa2, 0xec, 0xbc, 0x1e, 0xf3, 0xcf, 0xc6, 0x4a, 0x6f, 0x6c, 0x90, 0xec, 0xf8, + 0xcc, 0x51, 0x07, 0x33, 0xb8, 0xa7, 0xf7, 0x9d, 0x98, 0xf3, 0x07, 0x33, 0x01, 0x25, 0x55, 0x44, 0xc6, 0xe0, 0xb1, 0x8d, 0x2e, 0x30, 0xda, 0x88, 0x09, 0x6e, 0x68, 0x94, 0xb9, 0xa2, 0x2b, 0xab, + 0xcf, 0xb8, 0x2a, 0x34, 0x0f, 0x97, 0xff, 0x1a, 0x7c, 0x65, 0x6e, 0xc6, 0x6f, 0x85, 0x55, 0x7d, 0x13, 0xae, 0xc1, 0x29, 0x49, 0xaa, 0xf0, 0x8b, 0x0a, 0x53, 0x53, 0x81, 0x1a, 0xdf, 0xb7, 0xdf, + 0x76, 0x78, 0xd8, 0x7e, 0xde, 0xe0, 0x71, 0xb3, 0xdb, 0x8c, 0xd0, 0x04, 0x7f, 0x4d, 0x2f, 0x48, 0x39, 0x46, 0x1f, 0x3b, 0xec, 0x3b, 0x81, 0xf2, 0xa0, 0xfb, 0x06, 0xf8, 0xe4, 0x1c, 0x7a, 0x49, + 0x3c, 0x01, 0x68, 0x07, 0xbc, 0x48, 0x86, 0x15, 0xc7, 0xf0, 0x11, 0xfb, 0xe3, 0x34, 0xd7, 0x8f, 0x31, 0xd7, 0x74, 0xb2, 0x6f, 0xc6, 0x56, 0x86, 0xa8, 0x38, 0xf4, 0xda, 0x7c, 0x49, 0x3e, 0x6a, + 0x88, 0xab, 0x72, 0xc7, 0x96, 0xfd, 0x99, 0xdd, 0x65, 0xce, 0xb2, 0xfa, 0x37, 0xcd, 0x15, 0x8c, 0x01, 0xdb, 0xa3, 0x40, 0x05, 0x41, 0x6c, 0x1b, 0x20, 0x59, 0x4f, 0x59, 0xa9, 0x48, 0xac, 0x39, + 0x45, 0xbc, 0xe3, 0x35, 0xa2, 0x0f, 0xb7, 0x3c, 0xdb, 0x86, 0xc0, 0x89, 0x7e, 0x13, 0x99, 0x9a, 0xb6, 0x7a, 0xe4, 0x84, 0x21, 0x9f, 0xc6, 0x35, 0xb0, 0x7b, 0xdd, 0x0c, 0x06, 0xdf, 0xc5, 0x56, + 0x73, 0xe2, 0xe1, 0x23, 0x51, 0x71, 0x35, 0xb1, 0xfa, 0xfb, 0xba, 0xb8, 0xf3, 0x1a, 0xdf, 0x59, 0x5b, 0xfd, 0x37, 0x71, 0x57, 0x77, 0xeb, 0xff, 0x2c, 0xb8, 0xac, 0xb3, 0xc6, 0x6c, 0x83, 0x45, + 0xd6, 0xc2, 0x04, 0xb8, 0x3d, 0x80, 0x79, 0xc6, 0xec, 0x8d, 0xbc, 0x51, 0x78, 0xb6, 0xfb, 0x72, 0xc9, 0xbc, 0x1c, 0xd5, 0x86, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, + 0xa7, 0xe7, 0x98, 0x5d, 0x01, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, + 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x5c, 0x90, 0x41, 0x8b, 0xdb, 0x30, 0x10, 0x85, 0xcf, 0x9a, 0x5f, 0x31, 0x15, 0x94, 0x48, 0xc5, 0xb5, 0xa0, 0xc7, 0x42, 0x0e, 0x6d, 0x77, 0x4b, 0x7b, 0xe9, + 0x65, 0xf3, 0x07, 0x14, 0x69, 0x62, 0x8b, 0x38, 0x92, 0x91, 0xc6, 0xd9, 0x5d, 0xca, 0xfe, 0xf7, 0x32, 0x4e, 0x1a, 0xc2, 0x9e, 0x6c, 0x3f, 0x3f, 0xbe, 0x79, 0xef, 0xcd, 0x3e, 0x1c, 0xfd, 0x40, + 0x78, 0x58, 0x72, 0xe0, 0x54, 0x32, 0x40, 0x3a, 0xcd, 0xa5, 0x32, 0x1a, 0x50, 0x3a, 0x94, 0xcc, 0xf4, 0xc2, 0x1a, 0x94, 0x66, 0x6a, 0x9c, 0xf2, 0xa0, 0x01, 0x94, 0x1e, 0x12, 0x8f, 0xcb, 0xbe, + 0x0f, 0xe5, 0xe4, 0xc2, 0x54, 0x96, 0x48, 0x67, 0xca, 0xdc, 0x5c, 0x8b, 0xc7, 0xcf, 0x43, 0x71, 0xe7, 0x2f, 0x6e, 0x15, 0x34, 0x58, 0x00, 0xe7, 0x70, 0x47, 0x8d, 0x7f, 0xf9, 0x1c, 0x27, 0x42, + 0xca, 0x6d, 0xa9, 0xd4, 0x90, 0x47, 0xcf, 0x78, 0xd5, 0x7c, 0x08, 0x34, 0x73, 0x43, 0x8f, 0x67, 0x3f, 0xa5, 0x88, 0x3f, 0x84, 0xf8, 0x28, 0x00, 0x7c, 0x4e, 0x3c, 0x96, 0x85, 0x91, 0x6a, 0x2d, + 0xb5, 0x07, 0x89, 0x78, 0x47, 0x33, 0x8c, 0x9f, 0xae, 0xa9, 0xfa, 0x9d, 0xc5, 0xbf, 0xa0, 0x9c, 0xc3, 0x6f, 0xad, 0xd1, 0x69, 0x3f, 0x11, 0x28, 0xc2, 0xaf, 0x5b, 0x5c, 0x83, 0xf4, 0x7f, 0xe8, + 0xd9, 0x58, 0x50, 0xd4, 0x3f, 0x11, 0xff, 0x7e, 0x30, 0x3a, 0x45, 0xfd, 0xff, 0x73, 0xf7, 0x3a, 0x93, 0xd1, 0xfc, 0x3a, 0xd3, 0x4d, 0x7a, 0x2a, 0x4b, 0x0d, 0x64, 0x74, 0x5b, 0x9f, 0x37, 0xf9, + 0xc1, 0xb3, 0x37, 0x5a, 0xe6, 0x70, 0xf3, 0xe4, 0x53, 0xd6, 0x1d, 0xea, 0xe8, 0xd9, 0x6b, 0x0b, 0x97, 0xcb, 0x81, 0x41, 0x51, 0x18, 0x4b, 0x27, 0x79, 0xe5, 0xf8, 0x35, 0xe6, 0x75, 0xc4, 0xfe, + 0xbb, 0x0f, 0xc7, 0xa1, 0x96, 0x25, 0x47, 0x63, 0x3b, 0x24, 0x0b, 0x2a, 0x1d, 0x56, 0xeb, 0x87, 0x2d, 0xe6, 0x34, 0x49, 0x01, 0xc5, 0xfd, 0x4f, 0xcf, 0x7e, 0x32, 0x54, 0xab, 0x05, 0xf5, 0x06, + 0xb7, 0x4e, 0x95, 0x2f, 0xf6, 0x30, 0x16, 0xdc, 0xde, 0xfb, 0x1f, 0x65, 0x9b, 0x83, 0xd1, 0x95, 0x02, 0xa5, 0x33, 0xc5, 0xf5, 0xd7, 0x65, 0x7f, 0x8b, 0xce, 0xe1, 0xc1, 0xa7, 0x09, 0x4b, 0x16, + 0x59, 0x80, 0x02, 0x69, 0x5c, 0x53, 0x1e, 0x8c, 0xb0, 0xfa, 0xb5, 0x95, 0xb5, 0x92, 0xe1, 0xd2, 0xe6, 0x1d, 0x96, 0x47, 0xc2, 0x1b, 0x7a, 0xc5, 0x22, 0xbd, 0xcc, 0x14, 0x98, 0x22, 0x8a, 0x1f, + 0xb9, 0xe0, 0x9e, 0x70, 0x23, 0xef, 0x9b, 0x0e, 0x87, 0xc2, 0xb8, 0xf9, 0xd8, 0x36, 0xba, 0xc3, 0x7b, 0xbc, 0x5c, 0x7e, 0x83, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, + 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, + 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, + 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, + 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, + 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, + 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, + 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x67, 0x6f, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x4c, 0x91, 0x3f, 0x8f, 0xdb, 0x30, 0x0c, 0xc5, 0x77, 0x7d, 0x8a, + 0x57, 0x64, 0xb8, 0x0b, 0x50, 0xd8, 0x7b, 0xd6, 0x16, 0xd7, 0x16, 0xe8, 0xd0, 0x21, 0x45, 0x87, 0xc3, 0xa1, 0x96, 0x25, 0x3a, 0x16, 0x22, 0x91, 0xae, 0xfe, 0x24, 0xcd, 0xb7, 0x2f, 0xe8, 0x8b, + 0x83, 0x6e, 0xf6, 0x23, 0xf9, 0x7b, 0x8f, 0xd4, 0x0e, 0x5f, 0x04, 0x5f, 0x8f, 0xc7, 0x1f, 0x78, 0x69, 0xec, 0x6a, 0x10, 0x36, 0xe6, 0x17, 0x45, 0x27, 0x89, 0x50, 0x05, 0x37, 0x69, 0x19, 0x4c, + 0x57, 0xed, 0xda, 0x1a, 0x3e, 0xe0, 0x38, 0x13, 0x46, 0x09, 0x91, 0xf2, 0x12, 0x6d, 0x25, 0x4c, 0xf7, 0x0a, 0x9c, 0x78, 0x82, 0xb3, 0x8c, 0x91, 0x30, 0x49, 0x63, 0x8f, 0xc0, 0xe6, 0x75, 0x98, + 0x2d, 0xfb, 0x48, 0xdd, 0x49, 0x86, 0xb7, 0xe7, 0xc7, 0xf7, 0xbe, 0xc3, 0x71, 0x0e, 0xe5, 0x81, 0x45, 0xa6, 0xb2, 0x08, 0xfb, 0xa2, 0xbe, 0x6b, 0xa2, 0x4c, 0x7f, 0x1a, 0x95, 0x5a, 0x3a, 0x63, + 0x76, 0x3b, 0x7c, 0xa6, 0x0b, 0x45, 0x59, 0x12, 0x71, 0x35, 0xe6, 0xfe, 0xb3, 0x46, 0x9b, 0xc8, 0xd6, 0x96, 0xa9, 0x60, 0xbc, 0xc1, 0x7a, 0x1f, 0xf8, 0x04, 0x8b, 0x4a, 0xa5, 0x2a, 0x68, 0x33, + 0xff, 0xad, 0xc2, 0xff, 0x09, 0x36, 0x61, 0x8f, 0x49, 0xb2, 0x21, 0xeb, 0xe6, 0x0d, 0xf4, 0x11, 0x96, 0x3d, 0x9c, 0xf0, 0x14, 0x72, 0x42, 0xa8, 0xb8, 0x4a, 0x3e, 0x17, 0x5c, 0x43, 0x9d, 0x31, + 0x9c, 0x64, 0x45, 0x0f, 0x9d, 0x31, 0x3f, 0x17, 0xaf, 0xcb, 0xd7, 0x99, 0x90, 0x1b, 0xf3, 0xea, 0xcb, 0x36, 0xca, 0x09, 0x32, 0xad, 0xea, 0xe3, 0x2c, 0xad, 0x68, 0x51, 0xa5, 0x41, 0xb5, 0x01, + 0x9f, 0xbe, 0x7f, 0x83, 0x64, 0xb8, 0x18, 0x74, 0x9b, 0x18, 0xc6, 0x6c, 0xf3, 0xed, 0xdd, 0x37, 0xd4, 0xed, 0x80, 0x81, 0x2f, 0x72, 0x26, 0x8f, 0x29, 0x4b, 0x7a, 0x7f, 0x88, 0x31, 0xcb, 0xb5, + 0x50, 0xd6, 0xd1, 0x55, 0x54, 0xa2, 0x93, 0x94, 0x74, 0x2e, 0x06, 0xa6, 0x83, 0x31, 0xc3, 0x30, 0x38, 0xe1, 0x22, 0x91, 0x8c, 0x6b, 0x39, 0x62, 0xae, 0x75, 0x39, 0xf4, 0x7d, 0xba, 0x6d, 0x61, + 0x3a, 0xfa, 0x6b, 0xd3, 0x12, 0xa9, 0x73, 0x92, 0x7a, 0x6d, 0x37, 0xe6, 0x45, 0x32, 0x92, 0xe8, 0xe2, 0x85, 0x08, 0xaf, 0x77, 0xea, 0x12, 0xa9, 0x12, 0xbc, 0xb8, 0xa6, 0x27, 0xb7, 0x3a, 0xfb, + 0xf6, 0xfc, 0xa4, 0xbc, 0x72, 0xe8, 0xfb, 0x53, 0xa8, 0x73, 0x1b, 0x57, 0xc8, 0x99, 0x6d, 0x0d, 0x17, 0xea, 0xd5, 0xa1, 0xaf, 0x99, 0xa8, 0x4f, 0x36, 0x70, 0xef, 0xc5, 0x95, 0xa7, 0xbd, 0x31, + 0xe6, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc2, 0xdb, 0xa3, 0x12, 0x72, 0x01, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, + 0x6d, 0x6f, 0x64, 0xca, 0xcd, 0x4f, 0x29, 0xcd, 0x49, 0x55, 0x48, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xe3, 0xe2, 0x4a, 0xcf, 0x57, 0x30, 0xd4, 0x33, 0x34, 0xe1, 0x02, 0x04, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0xe0, 0x7c, 0xeb, 0x1f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, + 0x6f, 0x94, 0x91, 0xd1, 0x6b, 0xe2, 0x40, 0x10, 0xc6, 0x9f, 0xb3, 0x7f, 0xc5, 0x47, 0xa0, 0x47, 0x22, 0x92, 0xbc, 0x0b, 0x3e, 0x5c, 0x7b, 0x16, 0x1f, 0xee, 0x50, 0x52, 0xcb, 0x71, 0x70, 0x50, + 0x63, 0x32, 0xc6, 0x60, 0xdc, 0x8d, 0xb3, 0x93, 0x50, 0x29, 0xfe, 0xef, 0xc7, 0x6e, 0x2c, 0xa7, 0xed, 0x53, 0x45, 0xd8, 0xc9, 0x7c, 0x33, 0xdf, 0xfe, 0xf8, 0xb6, 0xcd, 0x8b, 0x7d, 0x5e, 0x11, + 0xb6, 0x9d, 0x2e, 0xa4, 0x36, 0x5a, 0xa9, 0xfa, 0xd0, 0x1a, 0x16, 0x44, 0x2a, 0x08, 0x0b, 0xa3, 0x85, 0x5e, 0x25, 0x54, 0x41, 0xb8, 0x3d, 0xf8, 0x43, 0x93, 0xa4, 0x3b, 0x91, 0xd6, 0xd5, 0x56, + 0xb8, 0xd6, 0x95, 0x0d, 0x55, 0xac, 0x54, 0x9a, 0x62, 0x9e, 0xeb, 0xb2, 0x21, 0xe4, 0x1a, 0xf3, 0xd5, 0x6a, 0x89, 0x8c, 0x8e, 0x1d, 0x59, 0x49, 0x94, 0x73, 0xbe, 0x88, 0x51, 0x21, 0xaf, 0xb8, + 0x98, 0x26, 0x0f, 0xc3, 0x39, 0x06, 0x93, 0x85, 0xf3, 0x4c, 0x32, 0xb2, 0xad, 0xd1, 0x96, 0x7e, 0x73, 0x2d, 0xc4, 0x4e, 0x38, 0x62, 0x74, 0x51, 0xbc, 0x59, 0x8c, 0x37, 0x15, 0xa4, 0x23, 0x15, + 0x60, 0x84, 0x3f, 0x8b, 0xe7, 0x0c, 0x0f, 0x8b, 0x1f, 0x33, 0xcc, 0x67, 0xd9, 0xcc, 0xb5, 0x7c, 0x7b, 0xc5, 0x27, 0x70, 0xa7, 0x75, 0xad, 0x2b, 0xac, 0x2b, 0x03, 0x21, 0x2b, 0xeb, 0x04, 0xf8, + 0x5e, 0x96, 0x38, 0x18, 0x26, 0xdf, 0x40, 0x6e, 0x71, 0x32, 0x1d, 0x0a, 0x53, 0x12, 0x6a, 0x8d, 0xf5, 0xce, 0xe3, 0xbd, 0x38, 0x2d, 0xa9, 0xcc, 0x3a, 0x71, 0x56, 0xa9, 0x52, 0xc1, 0xf6, 0x20, + 0xc9, 0x92, 0x6b, 0x2d, 0x8d, 0x8e, 0xc2, 0x8c, 0x0a, 0xaa, 0x7b, 0x2a, 0x1d, 0x97, 0xa3, 0x09, 0xe3, 0xdb, 0x81, 0x96, 0x49, 0xe4, 0xe4, 0xbf, 0x22, 0xa6, 0x63, 0x1c, 0xc3, 0xff, 0xd2, 0x14, + 0x54, 0xec, 0x0c, 0xc4, 0xa0, 0x31, 0x45, 0xde, 0xc0, 0x74, 0xd2, 0x76, 0x32, 0xec, 0x3e, 0xb6, 0x6e, 0x7c, 0x1b, 0x31, 0xd9, 0x31, 0x3e, 0x1b, 0x5c, 0xed, 0x16, 0x79, 0xd3, 0x10, 0xab, 0xb3, + 0x1a, 0x02, 0xfd, 0x30, 0xfb, 0x31, 0xa7, 0xe1, 0x6d, 0x5c, 0x5c, 0x1b, 0x4c, 0xa6, 0xf8, 0x76, 0x79, 0xab, 0xe4, 0xbe, 0xab, 0x9b, 0x92, 0xf8, 0xed, 0x7c, 0x7b, 0xfd, 0x66, 0x8c, 0xf0, 0xae, + 0xc7, 0xfb, 0xff, 0xaf, 0x0e, 0x7d, 0xfa, 0xc9, 0x2f, 0x92, 0x9d, 0x29, 0x87, 0xfa, 0x39, 0xfb, 0x39, 0x14, 0x4b, 0x36, 0x62, 0x86, 0x72, 0x6e, 0xac, 0xb8, 0x14, 0x0c, 0x63, 0x3f, 0x46, 0xdf, + 0xbb, 0xbb, 0x38, 0xd7, 0x15, 0x0d, 0x2a, 0xe5, 0x25, 0xb1, 0x83, 0xf0, 0x13, 0x2f, 0x63, 0x5c, 0x0d, 0xf4, 0xbd, 0x17, 0x3e, 0x61, 0x00, 0x77, 0xfd, 0xe4, 0x9d, 0xc1, 0x99, 0xc6, 0x2a, 0x08, + 0xce, 0x2a, 0x38, 0x2b, 0x15, 0xd4, 0xdb, 0x2b, 0x2a, 0x4c, 0xa7, 0x08, 0x97, 0x8b, 0xa7, 0x55, 0xe8, 0x8d, 0x3c, 0x59, 0xce, 0x96, 0x1e, 0x0d, 0x1f, 0x22, 0xb7, 0xf4, 0xdf, 0xb9, 0xd1, 0xde, + 0xfa, 0xde, 0x94, 0xa7, 0x49, 0x18, 0x5f, 0x70, 0xf6, 0x37, 0x38, 0x6e, 0xdd, 0x6d, 0x7e, 0x1d, 0x8a, 0x49, 0x3a, 0xd6, 0xd8, 0x24, 0x4f, 0x3e, 0xe3, 0x28, 0x56, 0x67, 0xf5, 0x2f, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x66, 0xb8, 0x89, 0xe0, 0xc1, 0x01, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, + 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x64, 0x90, 0xc1, 0x8a, 0xdb, 0x30, 0x10, 0x86, 0xcf, 0x9a, 0xa7, 0x98, 0x0a, 0x0a, 0xf6, 0x62, 0xe4, 0xa5, 0xc7, 0x85, 0x5c, 0x76, 0x69, 0xbb, 0xa7, 0x52, + 0xb6, 0x7e, 0x01, 0x21, 0x8d, 0x13, 0x11, 0x47, 0x72, 0xa4, 0x51, 0xec, 0x12, 0xf2, 0xee, 0x45, 0x4a, 0x02, 0xa1, 0x7b, 0xb1, 0xc5, 0xcc, 0xfc, 0xff, 0xfc, 0xf3, 0xcd, 0xda, 0xec, 0xf5, 0x96, + 0x70, 0xcc, 0xde, 0xb0, 0x0b, 0x1e, 0xc0, 0x1d, 0xe6, 0x10, 0x19, 0x1b, 0x10, 0xd2, 0x04, 0xcf, 0xb4, 0xb2, 0x04, 0x21, 0x3d, 0x71, 0xbf, 0x63, 0x9e, 0x1f, 0xdf, 0xf5, 0xc3, 0x94, 0xea, 0x40, + 0xf9, 0x3b, 0xbf, 0x95, 0xd0, 0x02, 0xf4, 0x3d, 0x0e, 0x94, 0xf8, 0x5d, 0x7b, 0x3b, 0x11, 0x92, 0x4f, 0x39, 0x52, 0x42, 0xde, 0x69, 0xc6, 0x7b, 0x6d, 0x25, 0x93, 0x99, 0x12, 0x2e, 0x8e, 0x77, + 0x21, 0x33, 0x52, 0x8c, 0x21, 0xa2, 0xf6, 0x16, 0x23, 0x71, 0x8e, 0xbe, 0x8c, 0x53, 0x31, 0x7a, 0x1f, 0x86, 0xdf, 0xf8, 0xed, 0xf9, 0x19, 0x13, 0x6b, 0xce, 0x09, 0x4d, 0xb0, 0x84, 0xce, 0x5b, + 0x67, 0x74, 0xd9, 0x87, 0x3e, 0x5c, 0xb5, 0x49, 0x41, 0xb9, 0xe1, 0x61, 0x71, 0xc3, 0xf8, 0x74, 0x4b, 0xa5, 0x86, 0x16, 0xcf, 0x20, 0x4e, 0x3a, 0x96, 0xbb, 0xc4, 0x82, 0x88, 0x1b, 0xbc, 0xa7, + 0x57, 0xbf, 0x68, 0xf9, 0x20, 0x13, 0xa2, 0xa5, 0xd8, 0xb4, 0x20, 0x44, 0xa4, 0xe3, 0xa7, 0xf6, 0x31, 0x53, 0xe2, 0x46, 0xfe, 0xfc, 0x3e, 0xc8, 0x0e, 0x65, 0xe9, 0xbd, 0xf4, 0x3d, 0xad, 0xfa, + 0x30, 0x4f, 0xa4, 0x4c, 0x38, 0xf4, 0x95, 0x43, 0x87, 0xde, 0x4d, 0x57, 0x8b, 0x84, 0x4f, 0x65, 0x4a, 0x7d, 0x50, 0x9a, 0x83, 0x4f, 0x04, 0xa2, 0x05, 0x10, 0xb7, 0x64, 0x37, 0xb0, 0xea, 0x55, + 0x9b, 0xfd, 0x36, 0x86, 0xec, 0x6d, 0xd3, 0x76, 0xb8, 0x74, 0x18, 0xe9, 0xd8, 0x42, 0x55, 0x6f, 0x70, 0x29, 0xda, 0x3c, 0x71, 0xc9, 0x64, 0x69, 0xa4, 0x88, 0x91, 0x92, 0x7a, 0x0d, 0xf6, 0xaf, + 0x7a, 0x9b, 0x42, 0xa2, 0xa6, 0x18, 0xba, 0xb1, 0x56, 0xff, 0x54, 0x38, 0x6f, 0x85, 0xcd, 0x97, 0x4d, 0xc5, 0x75, 0x06, 0x21, 0x58, 0xfd, 0xd0, 0xac, 0xa7, 0xb1, 0x91, 0xd9, 0xd3, 0x3a, 0x93, + 0x61, 0x2a, 0x7c, 0xaf, 0x81, 0x2a, 0xc9, 0x17, 0xfc, 0x7a, 0x92, 0xdd, 0x7f, 0x16, 0x2d, 0x88, 0x0b, 0x5c, 0xe0, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x97, 0xcc, 0x0b, + 0x00, 0x53, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, + 0x6e, 0x67, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x4c, 0x90, 0xb1, 0x6e, 0xeb, 0x30, 0x0c, 0x45, 0x77, 0x7d, 0x05, 0x81, 0xb7, 0x24, 0x40, 0x5e, 0x7e, 0xa3, 0x63, 0x87, + 0x76, 0x0b, 0x32, 0x08, 0xd2, 0xb5, 0x4d, 0xc4, 0x22, 0x5d, 0x91, 0x4a, 0x9a, 0x7e, 0x7d, 0x21, 0xa7, 0xa9, 0xbb, 0x89, 0x94, 0x78, 0x78, 0x8f, 0xfe, 0xd1, 0x8b, 0xd2, 0x5b, 0x8a, 0xc3, 0xa0, + 0x73, 0x66, 0x19, 0x43, 0x78, 0xad, 0x63, 0x14, 0xfe, 0x42, 0x26, 0x16, 0x57, 0xca, 0x5c, 0x91, 0x5c, 0x2b, 0xc3, 0x28, 0xa9, 0x0c, 0x5a, 0x0b, 0xcb, 0x48, 0xae, 0xe4, 0x13, 0x48, 0xe2, 0x5a, + 0x25, 0x95, 0x2b, 0xc4, 0x59, 0x25, 0x9c, 0x8c, 0x47, 0x89, 0xde, 0x2a, 0xce, 0xff, 0x4f, 0x2c, 0x57, 0x4d, 0xb1, 0xf7, 0xcf, 0x74, 0x9b, 0x50, 0x41, 0xbf, 0xb7, 0xc4, 0xb6, 0x12, 0x0a, 0x7c, + 0xd2, 0xfc, 0xa7, 0x3f, 0x56, 0x6d, 0x0b, 0xe1, 0x73, 0x41, 0x72, 0xe4, 0xb0, 0x33, 0x8f, 0xce, 0xe9, 0x40, 0x2c, 0xe6, 0x51, 0x12, 0x32, 0xc1, 0xd3, 0x9e, 0xa2, 0xe4, 0x75, 0x7e, 0x5b, 0xf1, + 0x24, 0x4e, 0x2c, 0x4e, 0x3a, 0xd0, 0x6d, 0x8a, 0x4e, 0x17, 0x96, 0xdc, 0x8b, 0x8a, 0x8f, 0x06, 0x73, 0x0b, 0xfd, 0xc5, 0xd0, 0x24, 0xad, 0x13, 0x8f, 0x2d, 0x76, 0x0c, 0xe1, 0x5d, 0x47, 0xf8, + 0x84, 0x7a, 0xe8, 0x08, 0x43, 0x37, 0x32, 0x67, 0x6f, 0x0e, 0x8a, 0x94, 0xb4, 0x2c, 0xda, 0x24, 0xd3, 0x52, 0xb9, 0xc4, 0x7a, 0xa7, 0x0b, 0xee, 0x1d, 0xda, 0x59, 0x7e, 0x5f, 0xd0, 0xcf, 0x0f, + 0x8f, 0xb0, 0x79, 0xec, 0xb4, 0x6e, 0x56, 0xb6, 0xff, 0x09, 0x9b, 0xe6, 0x96, 0xfb, 0xd7, 0x96, 0x65, 0x46, 0x81, 0xf8, 0x23, 0x79, 0x34, 0x6b, 0x05, 0xf6, 0x64, 0xce, 0x2c, 0x17, 0x64, 0x1a, + 0xc2, 0xae, 0x19, 0xea, 0x16, 0xd7, 0xb4, 0xd5, 0xd4, 0xb3, 0x65, 0xec, 0x8f, 0xe1, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x28, 0x45, 0x34, 0x36, 0x07, 0x01, 0x00, 0x00, 0xbb, + 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0x07, 0xa1, 0xcc, 0xbc, 0xe2, 0x92, 0xc4, 0xbc, 0xe4, 0xd4, 0x14, 0xdd, 0xe4, 0x9c, 0xfc, 0xd2, 0x94, 0xd4, 0xb2, + 0xd4, 0xbc, 0x92, 0x62, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x7b, 0x34, 0xf6, 0xd2, 0x20, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, + 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, + 0x6d, 0x6f, 0x64, 0x8c, 0x90, 0xcb, 0x6e, 0xc3, 0x20, 0x10, 0x45, 0xd7, 0xe1, 0x2b, 0x58, 0x36, 0x0b, 0x86, 0x47, 0xa2, 0x34, 0x59, 0xb4, 0xff, 0x82, 0x61, 0x4c, 0x69, 0x6c, 0x26, 0x1d, 0x83, + 0x55, 0xf5, 0xeb, 0x2b, 0x47, 0xaa, 0xe4, 0xa4, 0xea, 0x63, 0x58, 0x72, 0xee, 0xd5, 0x99, 0x19, 0x29, 0xb6, 0x01, 0xe5, 0x24, 0x04, 0xe3, 0x65, 0xf0, 0x01, 0x65, 0x2f, 0x9f, 0x9e, 0x25, 0xe8, + 0x5e, 0x88, 0x44, 0xd2, 0x82, 0x3d, 0x2d, 0x5f, 0x6f, 0x2d, 0x33, 0xca, 0x07, 0xb1, 0xe9, 0xe5, 0x6c, 0xc0, 0x80, 0x51, 0xc6, 0x18, 0x7b, 0x7d, 0xd7, 0x51, 0x66, 0x35, 0x62, 0x93, 0x72, 0x7d, + 0x69, 0x1d, 0x04, 0x1a, 0xf5, 0xb9, 0xf8, 0x9a, 0x67, 0x54, 0x93, 0x2f, 0xb1, 0xa3, 0x77, 0xdd, 0xb7, 0x12, 0x54, 0xa2, 0xa5, 0xc6, 0x1e, 0xc1, 0x89, 0xed, 0x4d, 0xfd, 0x2a, 0x18, 0x06, 0x6a, + 0x11, 0x67, 0x2c, 0x75, 0xd2, 0x53, 0x3c, 0xab, 0x44, 0x7a, 0x76, 0x72, 0x76, 0x60, 0xf7, 0x60, 0xa4, 0xd6, 0x32, 0x97, 0x98, 0x19, 0x43, 0xbd, 0x49, 0x25, 0xa2, 0x34, 0xa0, 0x6e, 0x2d, 0x47, + 0x39, 0x5b, 0xd8, 0xfd, 0x82, 0xbe, 0x4e, 0x54, 0x54, 0xae, 0xc8, 0xbe, 0x12, 0xeb, 0x45, 0xc9, 0x82, 0x05, 0xeb, 0x7e, 0x0c, 0x8c, 0x14, 0x91, 0xcb, 0x22, 0x12, 0xa8, 0x84, 0xc6, 0x8c, 0xa5, + 0x7e, 0x9d, 0xc3, 0x19, 0x7b, 0x34, 0x3b, 0x73, 0x30, 0xd6, 0x1d, 0xf6, 0x7b, 0xd5, 0xf9, 0x10, 0x4f, 0xe1, 0x11, 0x7b, 0x1b, 0xe3, 0x3f, 0xfa, 0x18, 0xfb, 0x01, 0x43, 0x75, 0x8b, 0x82, 0x81, + 0x7b, 0x03, 0x82, 0xd6, 0x21, 0x03, 0x71, 0xd2, 0xbe, 0xd2, 0x98, 0xc3, 0xd5, 0xd4, 0x7e, 0x5b, 0x6d, 0xc5, 0x8d, 0x6d, 0xa8, 0x19, 0x99, 0xff, 0x26, 0x3f, 0xfc, 0x65, 0x81, 0xdc, 0xfd, 0x51, + 0xb7, 0xe2, 0x33, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf4, 0xb0, 0xa9, 0x9c, 0x04, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, + 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, + 0xac, 0x98, 0xd9, 0xb2, 0xaa, 0x48, 0xb7, 0x85, 0xef, 0xcf, 0x53, 0xd4, 0xbd, 0xb1, 0x16, 0x99, 0x49, 0x7f, 0x22, 0xce, 0x85, 0x20, 0x2a, 0x08, 0x2a, 0x2a, 0xa0, 0xde, 0xd1, 0x24, 0x48, 0x9b, + 0xf4, 0xdd, 0xd3, 0x9f, 0x58, 0x6b, 0xef, 0x3f, 0x4a, 0xab, 0x76, 0x57, 0xf5, 0xef, 0x17, 0xf8, 0xc6, 0x98, 0x23, 0x67, 0xce, 0x9c, 0x10, 0xc5, 0xed, 0xa3, 0xf3, 0xde, 0x7d, 0x92, 0x53, 0x1e, + 0x2e, 0xbc, 0x84, 0x3c, 0x8a, 0x86, 0x14, 0x94, 0x9f, 0x11, 0x3f, 0xfd, 0xa3, 0x87, 0xef, 0xf0, 0x1d, 0xfc, 0xf1, 0x80, 0xff, 0x6b, 0x8a, 0x28, 0xed, 0x9a, 0x53, 0x25, 0xc3, 0xab, 0x8d, 0x8c, + 0x24, 0x75, 0x94, 0xcb, 0xb1, 0x4f, 0x34, 0xbb, 0xda, 0xe1, 0x76, 0x86, 0x87, 0x79, 0xbc, 0x4b, 0x7c, 0xbe, 0xd5, 0xf4, 0xa4, 0x13, 0xfe, 0xef, 0x7f, 0x9e, 0x98, 0x7e, 0x46, 0xba, 0x00, 0xf7, + 0xb8, 0x68, 0x1b, 0xaa, 0x09, 0xd2, 0xb7, 0x88, 0x50, 0x3d, 0xfa, 0xa3, 0x47, 0xef, 0x90, 0x7e, 0x07, 0x54, 0x44, 0xde, 0x73, 0x12, 0x7c, 0xf0, 0xc7, 0x55, 0xbe, 0x0b, 0xe7, 0x7d, 0x62, 0x08, + 0x91, 0xd4, 0x27, 0xee, 0x5a, 0x88, 0x93, 0x75, 0x62, 0x40, 0xfb, 0x76, 0xb0, 0x2d, 0x05, 0x5b, 0xa1, 0x5b, 0x6e, 0x0d, 0xeb, 0x0a, 0x2f, 0xec, 0x85, 0xfc, 0x22, 0x9f, 0xf9, 0x62, 0x7c, 0x5f, + 0x13, 0x8f, 0x59, 0x0f, 0x76, 0x14, 0xb3, 0x3a, 0xd3, 0xda, 0x62, 0xf6, 0x48, 0xe6, 0xbb, 0x9f, 0xdc, 0xaa, 0xb5, 0x3d, 0x69, 0x73, 0xb3, 0x64, 0x39, 0x79, 0x38, 0xba, 0xc7, 0xb0, 0xe7, 0x9a, + 0x5f, 0x07, 0xff, 0x0e, 0xe3, 0x35, 0x76, 0xfd, 0x94, 0x2a, 0xdb, 0xe9, 0x4b, 0xca, 0xe2, 0x13, 0x93, 0xec, 0xee, 0x4a, 0x87, 0xd7, 0x29, 0x2b, 0xef, 0xb6, 0xbd, 0xfa, 0xd8, 0x9f, 0x58, 0xc3, + 0x4a, 0x63, 0x40, 0x5f, 0x65, 0xc5, 0x5a, 0x98, 0x9c, 0xbd, 0xba, 0xc6, 0xc5, 0xbd, 0xdb, 0x68, 0x34, 0xad, 0xbc, 0x30, 0x03, 0xb7, 0xc7, 0x7e, 0xf4, 0xa0, 0x22, 0xf2, 0xd6, 0x94, 0x78, 0xf8, + 0x7a, 0x7c, 0x4f, 0x60, 0x8d, 0xbf, 0x09, 0x37, 0xdf, 0x41, 0xfb, 0xf8, 0xd1, 0x44, 0xb9, 0x4d, 0xa8, 0xbc, 0xa7, 0xb3, 0xe5, 0x90, 0x51, 0x4d, 0x7a, 0xd8, 0x33, 0xb1, 0xbe, 0x4d, 0xce, 0x8d, + 0xba, 0xf0, 0xd9, 0x2d, 0x2d, 0xfc, 0x1c, 0x0c, 0x3f, 0x88, 0x7d, 0x22, 0x26, 0x54, 0x07, 0xbd, 0xaa, 0xe8, 0x65, 0x25, 0xd4, 0x0e, 0x83, 0xf5, 0x68, 0xb3, 0xc3, 0xf2, 0x54, 0x35, 0xf4, 0xa2, + 0x4e, 0xb7, 0xb7, 0x1b, 0xa4, 0x93, 0x9b, 0x73, 0xb1, 0x44, 0xde, 0xff, 0x05, 0xe2, 0x6f, 0xb0, 0x1a, 0x11, 0x12, 0x65, 0xf8, 0x83, 0xeb, 0xe7, 0xe5, 0x1f, 0x3d, 0x78, 0x67, 0xbf, 0xf4, 0x01, + 0x65, 0xba, 0xc6, 0x56, 0x0a, 0xee, 0x88, 0x93, 0x24, 0xfa, 0x7c, 0x6e, 0x5a, 0xa0, 0x0e, 0x19, 0x04, 0x4a, 0xe9, 0x2f, 0xc6, 0xc7, 0xa5, 0xea, 0x48, 0xee, 0x5c, 0x01, 0xb9, 0x2b, 0x12, 0x37, + 0xfc, 0x94, 0xf7, 0x64, 0xb3, 0x17, 0x82, 0x4b, 0xa0, 0x7b, 0xc6, 0x06, 0xa5, 0xaa, 0x4f, 0xf5, 0x5a, 0x9f, 0x2d, 0x42, 0x8e, 0xb5, 0x11, 0x0a, 0xbc, 0xf4, 0xea, 0x91, 0x41, 0xe1, 0x92, 0xe8, + 0x42, 0x45, 0x7b, 0x69, 0x54, 0xbe, 0x8d, 0x0d, 0xbb, 0x79, 0xfe, 0xa8, 0x1e, 0xbc, 0x60, 0x03, 0x29, 0x03, 0x52, 0xe9, 0x70, 0xbd, 0x4d, 0x2d, 0xf2, 0xdb, 0xd1, 0x62, 0x8e, 0x84, 0x2e, 0x73, + 0x2b, 0x19, 0x53, 0x6e, 0x6d, 0x1e, 0xb3, 0xa0, 0xed, 0xd4, 0x20, 0xa3, 0x0c, 0x8e, 0x55, 0xa2, 0x6f, 0x61, 0xbb, 0x2e, 0x0e, 0xfe, 0x1e, 0xe9, 0x45, 0x9d, 0x8e, 0x77, 0xcc, 0x18, 0x51, 0xd5, + 0x87, 0xf8, 0xb6, 0x92, 0xd6, 0x38, 0x30, 0xc8, 0x66, 0x53, 0x2a, 0x03, 0xa5, 0x57, 0x07, 0xec, 0x1e, 0x2e, 0x8b, 0xe2, 0x31, 0x5a, 0x8b, 0x69, 0x4b, 0x7e, 0x04, 0xa5, 0xbf, 0x04, 0xda, 0x72, + 0x5a, 0x7c, 0x8d, 0xf2, 0xe1, 0x6a, 0x24, 0x4a, 0x23, 0xd8, 0x5d, 0x73, 0x55, 0xb5, 0x14, 0x49, 0xd7, 0x6d, 0x53, 0x2c, 0x86, 0x51, 0x90, 0xee, 0xc1, 0xc5, 0x25, 0x77, 0x36, 0xec, 0x78, 0xf5, + 0x27, 0xb4, 0xdf, 0x60, 0x31, 0x69, 0x48, 0xf1, 0x16, 0xb7, 0xb8, 0x76, 0x5b, 0x52, 0x53, 0x11, 0xf9, 0x5a, 0xfc, 0x33, 0x7a, 0x17, 0x98, 0x96, 0xdc, 0xf3, 0x62, 0x4e, 0xb1, 0x68, 0xd7, 0x87, + 0xc2, 0xd2, 0x41, 0xfd, 0x0e, 0xda, 0x82, 0x9b, 0x1a, 0x5d, 0x0a, 0xcd, 0x64, 0x47, 0x75, 0x87, 0x60, 0x7b, 0xf5, 0x96, 0x84, 0xf9, 0x15, 0x34, 0xfa, 0x60, 0x1e, 0x6d, 0xa1, 0xc4, 0x2a, 0xe3, + 0x82, 0xa9, 0x29, 0xfc, 0xb9, 0x8e, 0x16, 0x7a, 0x3b, 0x4e, 0xe9, 0x4a, 0xd0, 0xc3, 0xdd, 0x4d, 0x34, 0x74, 0xae, 0x43, 0x49, 0x31, 0xba, 0x4a, 0x51, 0x17, 0xc6, 0x2f, 0x31, 0x9f, 0xec, 0x62, + 0x1a, 0xe8, 0xe7, 0x6a, 0x20, 0xe4, 0xee, 0x62, 0xca, 0x1a, 0x32, 0xc5, 0x3b, 0x21, 0x81, 0x45, 0x9b, 0x40, 0x78, 0x24, 0x66, 0xaf, 0x91, 0x6d, 0x7e, 0x61, 0x2e, 0xc5, 0x63, 0xbf, 0x91, 0x5e, + 0x93, 0x48, 0x0b, 0xb7, 0x8d, 0x7b, 0xfc, 0xd6, 0xb8, 0x45, 0xe0, 0x91, 0x91, 0x0a, 0xbb, 0xc2, 0x7f, 0xfb, 0x50, 0x00, 0xef, 0x50, 0xf8, 0x72, 0x67, 0x8f, 0xe9, 0xa1, 0x71, 0xf2, 0x08, 0x87, + 0x2a, 0xa4, 0x41, 0xae, 0x49, 0x39, 0x99, 0xd7, 0xa9, 0x5b, 0x48, 0xf9, 0x76, 0xd3, 0x42, 0xc5, 0xcd, 0x39, 0x79, 0xbc, 0xee, 0x99, 0x4d, 0xad, 0xe6, 0xe6, 0x3f, 0x41, 0x3f, 0x99, 0x37, 0x57, + 0xbb, 0xb0, 0xe2, 0x24, 0xd2, 0x1a, 0xa9, 0xae, 0x53, 0x79, 0x59, 0x06, 0x76, 0x38, 0x6c, 0x8a, 0xfb, 0x7c, 0x9f, 0x99, 0x75, 0x3f, 0x86, 0xf3, 0xb9, 0xd2, 0x5c, 0x06, 0x32, 0x8d, 0xc4, 0xfc, + 0x03, 0x85, 0xcf, 0xc8, 0xbb, 0x61, 0x53, 0x97, 0xeb, 0xab, 0xef, 0x3f, 0x94, 0x36, 0xac, 0x91, 0xac, 0x6f, 0xd5, 0xeb, 0x6d, 0x5b, 0xd4, 0x03, 0xdd, 0xab, 0xd3, 0xd6, 0x49, 0xd4, 0x86, 0x32, + 0xcf, 0x57, 0x34, 0x0f, 0x9e, 0xff, 0x4f, 0xd0, 0xbf, 0xc3, 0x7c, 0xfd, 0xe7, 0x34, 0x7f, 0x0e, 0xa3, 0x5c, 0x9b, 0xb7, 0x82, 0xe3, 0x9c, 0x6d, 0x7d, 0x28, 0x8f, 0xb7, 0x7d, 0x96, 0x0c, 0x07, + 0xa3, 0x22, 0x10, 0x5c, 0xd2, 0xdb, 0x03, 0x86, 0x13, 0xed, 0xdf, 0x62, 0x82, 0x32, 0xda, 0x93, 0x1b, 0xf3, 0xaf, 0xbc, 0x16, 0x8f, 0xed, 0xa7, 0xc3, 0x97, 0x4b, 0xc2, 0x68, 0x5e, 0xbf, 0x58, + 0x69, 0x0e, 0x6d, 0x5d, 0x28, 0x3d, 0x3e, 0x0c, 0x1a, 0xbe, 0x99, 0x18, 0xe2, 0xb0, 0x6a, 0xad, 0x91, 0x8a, 0xed, 0x87, 0x9b, 0x53, 0x4c, 0x1f, 0x06, 0xcb, 0x7a, 0xaf, 0x7e, 0x0f, 0x88, 0x5e, + 0x80, 0x58, 0xc7, 0x35, 0x8f, 0xd0, 0x05, 0xa7, 0xf1, 0xa6, 0x33, 0xd2, 0x38, 0x30, 0x46, 0x99, 0x2a, 0x0d, 0xc0, 0x64, 0x8e, 0x82, 0x6b, 0x77, 0x6b, 0x59, 0xb9, 0x34, 0x08, 0x19, 0x8a, 0xea, + 0xd7, 0x21, 0x96, 0x93, 0x00, 0xd7, 0xc5, 0xc7, 0xd3, 0xe8, 0x93, 0xc2, 0xef, 0xea, 0x1a, 0x17, 0x9f, 0x74, 0xf0, 0x0e, 0xde, 0x10, 0x80, 0x02, 0x40, 0x48, 0x00, 0x1c, 0x64, 0x58, 0xf1, 0x0d, + 0x03, 0x97, 0x16, 0x5d, 0xc6, 0xf7, 0x18, 0xf4, 0x9c, 0x0d, 0x17, 0x68, 0x32, 0xc8, 0x97, 0x47, 0x26, 0x4e, 0x6f, 0xaa, 0xd7, 0x4f, 0x3e, 0x1f, 0xc6, 0x49, 0xe2, 0x68, 0x41, 0x60, 0x4e, 0x7a, + 0x21, 0xa8, 0x11, 0xad, 0x49, 0xac, 0x5c, 0x11, 0x49, 0x34, 0xff, 0x99, 0x32, 0x0d, 0x38, 0x00, 0x11, 0xc7, 0x30, 0x6f, 0x9e, 0xeb, 0x07, 0xa2, 0xcf, 0xe3, 0x10, 0x06, 0x5f, 0x46, 0xcc, 0x49, + 0x77, 0xef, 0xa2, 0xbf, 0xa2, 0x06, 0xe1, 0x68, 0x3f, 0x44, 0xba, 0x68, 0x8e, 0x57, 0x17, 0xda, 0xb5, 0xc9, 0x25, 0xd9, 0xa0, 0xb3, 0x64, 0x2f, 0x64, 0x90, 0x31, 0x33, 0x7f, 0x1f, 0x46, 0xbf, + 0x43, 0xf2, 0xb7, 0x16, 0x5b, 0xe3, 0x30, 0xc3, 0x7e, 0x8b, 0x5e, 0x74, 0x79, 0x00, 0x01, 0xa2, 0x19, 0x04, 0xde, 0x18, 0x8f, 0x77, 0x5d, 0x86, 0xf6, 0x39, 0x9e, 0x79, 0x6e, 0x68, 0x6f, 0x44, + 0xd9, 0xbe, 0x48, 0x07, 0x5b, 0xee, 0x2a, 0x49, 0x1d, 0xd7, 0x49, 0x98, 0x39, 0x9a, 0xe3, 0x16, 0x57, 0xd5, 0xa3, 0x4f, 0x59, 0x96, 0x7b, 0xf2, 0x94, 0x4d, 0x46, 0xdd, 0x47, 0x3d, 0xf8, 0xa9, + 0xee, 0xc7, 0x43, 0xf5, 0x79, 0x0f, 0x47, 0xc9, 0x8d, 0x88, 0xde, 0xae, 0x1b, 0x91, 0x91, 0xa5, 0xa2, 0x1d, 0xb3, 0x6e, 0x87, 0x5d, 0x27, 0xba, 0x18, 0x65, 0xaf, 0x8f, 0x32, 0xd3, 0xd5, 0x74, + 0x61, 0xb8, 0xb2, 0xb8, 0x99, 0x81, 0xf1, 0x6b, 0xd0, 0x27, 0xc3, 0x93, 0xd3, 0xe1, 0xbe, 0x88, 0x8c, 0x83, 0x56, 0xca, 0x13, 0x8b, 0xd6, 0x8e, 0x63, 0xf4, 0x96, 0x2c, 0x0c, 0x0d, 0x9f, 0x53, + 0xba, 0xd6, 0x24, 0xb7, 0x79, 0xe5, 0x02, 0xaa, 0x16, 0xb2, 0x2e, 0x7d, 0x61, 0x17, 0x31, 0xce, 0xf1, 0x84, 0x6b, 0xaa, 0xac, 0x71, 0xfb, 0x71, 0x15, 0xff, 0x93, 0x12, 0x02, 0x00, 0x21, 0x1e, + 0x22, 0x46, 0x60, 0xd0, 0x9b, 0x0b, 0x01, 0xe6, 0x7d, 0x17, 0x87, 0x81, 0x80, 0x9f, 0x44, 0xe7, 0x15, 0xcc, 0x4f, 0x07, 0x7d, 0xb9, 0xbf, 0xfb, 0x23, 0x3c, 0xda, 0x27, 0xf9, 0x0c, 0xaa, 0xf4, + 0xc2, 0x97, 0x83, 0x9e, 0x6e, 0xc2, 0x41, 0x23, 0xcc, 0x9c, 0xf8, 0x7b, 0xea, 0x32, 0x35, 0xc5, 0xeb, 0xc0, 0x2d, 0xd3, 0x88, 0xc2, 0x75, 0x4d, 0xea, 0xe6, 0x43, 0x4f, 0xfc, 0x32, 0x62, 0xd7, + 0x8a, 0xa4, 0x8f, 0x70, 0x3e, 0x23, 0xc8, 0x90, 0xa1, 0x4c, 0x26, 0xbe, 0x6a, 0x24, 0x1c, 0x8f, 0x9e, 0x75, 0x4a, 0xbb, 0x87, 0xb9, 0x1c, 0xea, 0x1d, 0x6b, 0x0d, 0xfa, 0xe6, 0x32, 0xb4, 0xcc, + 0x8f, 0x61, 0xcf, 0xc7, 0x38, 0xb8, 0xc3, 0x18, 0x6e, 0xa5, 0xf5, 0xde, 0x5e, 0xe8, 0xe8, 0x61, 0x95, 0xb0, 0xde, 0x2e, 0x57, 0x5d, 0x68, 0xd3, 0xaa, 0xd1, 0x16, 0xab, 0x53, 0x10, 0xc2, 0x9a, + 0xdd, 0xab, 0x7b, 0x25, 0x7b, 0x3d, 0xc6, 0x32, 0xc7, 0xb3, 0x5b, 0x7f, 0x34, 0xe2, 0x5b, 0x10, 0x87, 0x61, 0x16, 0x7b, 0x5f, 0xf7, 0x8d, 0xcf, 0x59, 0xb2, 0x92, 0x86, 0x95, 0x02, 0xf6, 0x9b, + 0xc9, 0x24, 0xd2, 0xd6, 0xd3, 0xcd, 0xdb, 0x71, 0x38, 0x5b, 0x47, 0x22, 0x1b, 0xce, 0x89, 0x95, 0x94, 0x59, 0x4d, 0xa9, 0x10, 0x66, 0x77, 0x6f, 0x69, 0x1a, 0xbf, 0x06, 0x7d, 0x32, 0x1c, 0xef, + 0xb6, 0x3c, 0x9f, 0x92, 0xf5, 0xe3, 0x36, 0x5e, 0x76, 0xb0, 0xf4, 0x4f, 0x45, 0xba, 0x4b, 0xab, 0xf0, 0x42, 0xa2, 0xc6, 0x8b, 0xf8, 0xe8, 0xbe, 0xb7, 0x6f, 0x4c, 0x73, 0x5a, 0xdd, 0xee, 0xd4, + 0x6b, 0x08, 0x4d, 0x5b, 0xe3, 0xd6, 0x7f, 0xd4, 0x14, 0xf1, 0x92, 0xf1, 0xef, 0xe3, 0x6f, 0xbb, 0x4e, 0x6f, 0x22, 0xe4, 0xd4, 0xf5, 0xa2, 0x1e, 0x82, 0x55, 0x68, 0x2c, 0x53, 0x9b, 0x3f, 0xb4, + 0x43, 0x57, 0x49, 0xf6, 0x5c, 0x2b, 0xc2, 0xe6, 0xc4, 0x6d, 0xd6, 0xe3, 0x62, 0x50, 0x46, 0x43, 0xf9, 0x31, 0xf6, 0x75, 0x91, 0xbf, 0xf5, 0x5b, 0x15, 0x24, 0x13, 0x7a, 0x10, 0x23, 0x91, 0x16, + 0x96, 0x33, 0xf4, 0x3c, 0xb4, 0x35, 0x53, 0x8c, 0x9b, 0xb3, 0xbf, 0xbb, 0x50, 0x97, 0x4a, 0x9b, 0xed, 0xf3, 0xb9, 0x15, 0xc4, 0xdb, 0xf0, 0x6d, 0x6c, 0x8b, 0x9b, 0x36, 0x0e, 0xa7, 0xbf, 0x2f, + 0x35, 0x06, 0xeb, 0xa8, 0x93, 0xb8, 0x7a, 0x20, 0xa8, 0x2a, 0x6a, 0x58, 0x6c, 0xe4, 0xe1, 0xba, 0xf1, 0x59, 0xef, 0x1e, 0xee, 0xf6, 0x5a, 0x1b, 0x6e, 0x73, 0x68, 0xd9, 0x56, 0x74, 0x2f, 0x16, + 0xa2, 0xa2, 0xfe, 0x94, 0xcc, 0xbf, 0xb4, 0x04, 0xb7, 0xae, 0x04, 0x72, 0xf2, 0x4f, 0x2c, 0x5d, 0xd7, 0x93, 0x08, 0xc0, 0x6c, 0x54, 0x5a, 0x72, 0x3a, 0xc5, 0x63, 0x3d, 0x5c, 0xe9, 0xdd, 0x55, + 0xe4, 0x10, 0xf5, 0xa0, 0x9c, 0x21, 0x69, 0x71, 0xf4, 0x53, 0xb2, 0xf0, 0xa5, 0x21, 0xca, 0x73, 0x14, 0xbb, 0xc6, 0x3d, 0xbb, 0x86, 0xed, 0xb6, 0xcc, 0x59, 0x9d, 0xb7, 0xe1, 0xa2, 0xb6, 0xa5, + 0xc5, 0xf2, 0xae, 0x4d, 0xc1, 0xae, 0x31, 0xc6, 0xc6, 0x94, 0x54, 0x6d, 0x60, 0x8e, 0xbb, 0xf4, 0x57, 0x90, 0xcf, 0xb7, 0x7a, 0x9f, 0x6c, 0x23, 0xc6, 0x22, 0x45, 0x9c, 0x35, 0x8d, 0x73, 0x17, + 0x62, 0xf7, 0x9c, 0xc0, 0x83, 0x5c, 0x53, 0xfd, 0xb6, 0xc0, 0xe9, 0xf1, 0x94, 0x92, 0xc3, 0x22, 0x0d, 0x0c, 0x6b, 0x61, 0x58, 0x2f, 0xe4, 0xde, 0xcd, 0x26, 0x37, 0x73, 0x29, 0x6f, 0x6a, 0xb1, + 0xd7, 0x85, 0x21, 0xae, 0x4b, 0x42, 0xb2, 0xa7, 0x1e, 0xde, 0x54, 0x4b, 0xf6, 0x22, 0x53, 0x00, 0x20, 0x78, 0xa3, 0x3c, 0x71, 0xbd, 0x61, 0x0e, 0xb1, 0x68, 0xd4, 0x74, 0xc5, 0x5f, 0x6f, 0x23, + 0xb7, 0xcb, 0xb2, 0xd9, 0x1d, 0xd6, 0xea, 0xc3, 0x0f, 0x8e, 0xc3, 0xaf, 0x83, 0x9f, 0x53, 0xf6, 0x24, 0xdf, 0x58, 0xd6, 0xc3, 0xa4, 0xb1, 0x3b, 0x6a, 0x99, 0xcb, 0xa9, 0xd3, 0xc3, 0xa4, 0xe5, + 0xf9, 0xd4, 0x76, 0x26, 0x59, 0xe3, 0xb6, 0xe5, 0xa1, 0x53, 0x0a, 0x7e, 0x06, 0x72, 0xf3, 0xb1, 0x72, 0x90, 0xf7, 0xce, 0xc3, 0xf5, 0x3b, 0xa9, 0x23, 0xca, 0x6d, 0x49, 0x1e, 0xfb, 0x1f, 0xc0, + 0xd7, 0x56, 0x8b, 0x56, 0x68, 0x8b, 0x89, 0x7f, 0xa5, 0x17, 0xd3, 0x66, 0x31, 0x45, 0xfa, 0xdd, 0xaf, 0x67, 0x53, 0x73, 0xab, 0xdc, 0x49, 0xc4, 0xa5, 0x9a, 0xf3, 0x05, 0x10, 0x86, 0x8c, 0xaa, + 0x1c, 0xea, 0xa8, 0x7c, 0x0f, 0x08, 0xbf, 0x7e, 0x97, 0xdf, 0xfb, 0xe1, 0x0c, 0x4e, 0x0b, 0x96, 0xc3, 0x47, 0x67, 0xb4, 0xf6, 0xf1, 0x62, 0xd9, 0x16, 0x62, 0xe0, 0x1c, 0xf6, 0xd2, 0xb1, 0xa4, + 0x96, 0x96, 0x72, 0xb9, 0x66, 0x5b, 0x07, 0xac, 0xc6, 0x73, 0xf2, 0x43, 0xd4, 0x93, 0x39, 0xdd, 0x1a, 0x3d, 0x75, 0xf6, 0x0e, 0x45, 0x7c, 0xc8, 0x8c, 0x5d, 0xa2, 0x25, 0xd3, 0x31, 0x2c, 0x33, + 0xa6, 0x5f, 0x1c, 0x77, 0x3b, 0xe4, 0xef, 0xb5, 0x42, 0x84, 0x07, 0xd3, 0x7b, 0x10, 0x4d, 0x05, 0xaf, 0xc4, 0x88, 0x64, 0xd8, 0xfd, 0xfa, 0xcf, 0x00, 0x7e, 0x4e, 0xc1, 0x61, 0x42, 0x42, 0x75, + 0x3b, 0xed, 0xee, 0x51, 0xa1, 0x5d, 0xc6, 0xcd, 0xd8, 0x4f, 0x98, 0xa5, 0x86, 0xc8, 0xa9, 0xa1, 0xb2, 0x4b, 0x72, 0x6b, 0xb5, 0xb9, 0x91, 0x91, 0xcd, 0x37, 0xd9, 0x29, 0x53, 0x5f, 0x51, 0x79, + 0x97, 0xb5, 0x31, 0xae, 0xeb, 0xbf, 0x7f, 0xc1, 0x0e, 0x27, 0x36, 0x25, 0x41, 0xbe, 0x5c, 0x9b, 0xc0, 0xda, 0x09, 0x66, 0xe6, 0x0d, 0x49, 0x76, 0xde, 0x4f, 0xe0, 0xce, 0x09, 0x91, 0xf6, 0x58, + 0x69, 0xd6, 0x86, 0x6d, 0x92, 0x93, 0xc8, 0x54, 0x14, 0xf8, 0x01, 0xf2, 0x6b, 0x78, 0x5e, 0x76, 0xbd, 0x6a, 0xe9, 0x79, 0x3c, 0x9f, 0x43, 0xc9, 0x96, 0x32, 0x99, 0xe7, 0xca, 0xb1, 0xc2, 0x87, + 0x85, 0xbe, 0xa7, 0xdd, 0x55, 0xa8, 0x9b, 0x64, 0x41, 0x03, 0x71, 0xd4, 0x9a, 0xf6, 0xf0, 0x13, 0xd8, 0x93, 0x41, 0x04, 0x16, 0x66, 0x1b, 0xeb, 0xd5, 0x04, 0xf6, 0x01, 0xb7, 0x0e, 0x4c, 0x49, + 0xbc, 0xe8, 0x57, 0x37, 0x82, 0x68, 0xd5, 0x98, 0x69, 0xed, 0x35, 0xf4, 0xa3, 0x35, 0xd6, 0xe1, 0x6a, 0x2f, 0x80, 0xdb, 0x2b, 0x73, 0x76, 0xcb, 0x4f, 0xdc, 0x6b, 0xef, 0xf5, 0x43, 0x4c, 0xdd, + 0x5d, 0x79, 0xe9, 0x5a, 0xbe, 0x94, 0x4e, 0xfe, 0xb6, 0xc9, 0xc6, 0x95, 0x28, 0xa1, 0x39, 0x66, 0xac, 0xcb, 0xf5, 0xb1, 0xe6, 0x40, 0xc3, 0x9d, 0x9d, 0xb2, 0x5b, 0xad, 0x81, 0xf9, 0x4d, 0x1c, + 0xfa, 0xfa, 0x1b, 0x64, 0x1d, 0x6b, 0x01, 0x9b, 0x41, 0xeb, 0xa0, 0x27, 0x60, 0x90, 0x23, 0xef, 0xac, 0x80, 0x7a, 0x18, 0xae, 0xdb, 0x59, 0x09, 0x96, 0xf7, 0x33, 0xf7, 0x88, 0xe3, 0x73, 0x31, + 0x6a, 0x7b, 0x6a, 0xc5, 0x81, 0xef, 0x72, 0x9e, 0xab, 0x4c, 0x8d, 0xe3, 0xc2, 0x71, 0x4c, 0xc1, 0x25, 0x6b, 0x82, 0x83, 0x2d, 0x7d, 0x41, 0x4d, 0xc5, 0xc5, 0x1a, 0x9a, 0x56, 0x4e, 0xb9, 0xf5, + 0x8e, 0x20, 0xe4, 0x0c, 0xd3, 0x3b, 0x8b, 0x9b, 0xf4, 0x63, 0xf0, 0x90, 0xcc, 0x2d, 0xa2, 0x4f, 0xda, 0x48, 0x35, 0x53, 0xe1, 0x3f, 0xad, 0x2f, 0x22, 0x10, 0x21, 0x84, 0x02, 0x0b, 0x01, 0x78, + 0xf3, 0x03, 0x36, 0x10, 0x59, 0x97, 0xa1, 0x5d, 0xee, 0xf9, 0x61, 0x3e, 0x8d, 0x46, 0x84, 0x07, 0xd6, 0xd6, 0xc6, 0xb9, 0xc3, 0x2c, 0x95, 0x68, 0x17, 0x85, 0xed, 0x70, 0x52, 0x26, 0x76, 0x76, + 0xc0, 0x54, 0x3c, 0xd7, 0x12, 0x0f, 0x34, 0x12, 0xf2, 0xc8, 0x35, 0xfe, 0xa2, 0xd5, 0xc6, 0x39, 0x7e, 0x5a, 0x02, 0x20, 0xe0, 0x11, 0x0d, 0x68, 0x84, 0x10, 0xff, 0x06, 0x43, 0x86, 0xf7, 0x05, + 0x0e, 0xba, 0xa2, 0xeb, 0x7f, 0x88, 0xf0, 0x73, 0x3a, 0xf3, 0x92, 0xd5, 0x0e, 0xfb, 0xf5, 0xba, 0xf2, 0xc9, 0xa0, 0x2d, 0x4e, 0x6a, 0xd4, 0x21, 0xc3, 0xb5, 0x29, 0xc3, 0x2d, 0x95, 0x53, 0xba, + 0x52, 0xa7, 0x45, 0x3e, 0x1c, 0xa7, 0xa4, 0xf9, 0x77, 0x22, 0x4f, 0x05, 0xb5, 0x27, 0x6d, 0x7f, 0x8c, 0x27, 0xd9, 0x04, 0x71, 0x71, 0xea, 0x6f, 0xa3, 0xb7, 0x17, 0x93, 0x94, 0x55, 0x17, 0x7d, + 0xef, 0x50, 0x87, 0xeb, 0xd9, 0x7c, 0x5c, 0x56, 0x67, 0xa2, 0x30, 0x34, 0x54, 0xcd, 0xbf, 0x68, 0x8d, 0x7f, 0xee, 0x06, 0xff, 0xc9, 0x0f, 0x22, 0xc0, 0x40, 0x11, 0xb0, 0x34, 0xf7, 0x26, 0x7a, + 0x41, 0xe8, 0x7a, 0x98, 0x13, 0x58, 0x86, 0xfe, 0xd0, 0x51, 0xf8, 0x68, 0x21, 0x6e, 0xd4, 0x4b, 0x05, 0xf8, 0x47, 0x19, 0xd6, 0xa7, 0x8e, 0xe3, 0x54, 0x7b, 0x85, 0x47, 0xc3, 0x4d, 0xc3, 0x9e, + 0x45, 0x58, 0xbf, 0x23, 0xf9, 0x2a, 0x39, 0xf1, 0xae, 0x66, 0xfe, 0xb5, 0xce, 0x53, 0x59, 0x2a, 0xc5, 0xce, 0x9c, 0x28, 0x34, 0x85, 0xb8, 0x73, 0x85, 0x0b, 0xd6, 0x7c, 0xd1, 0xd8, 0xd5, 0xc4, + 0xb2, 0xc2, 0x4a, 0x92, 0xdc, 0xce, 0x49, 0xcc, 0x4a, 0xd7, 0xd0, 0xe1, 0x18, 0xe6, 0xb7, 0xcf, 0x16, 0x2b, 0xd3, 0xe8, 0x3d, 0x2e, 0x28, 0xff, 0x81, 0xfd, 0xf4, 0xbd, 0x87, 0x4f, 0x5a, 0x1c, + 0x44, 0x40, 0x80, 0x02, 0xa4, 0x11, 0xfb, 0x86, 0x40, 0x80, 0x58, 0x8c, 0x04, 0xc0, 0x00, 0xf6, 0x49, 0x4b, 0x26, 0x5c, 0xec, 0xd9, 0xda, 0x72, 0x2e, 0x96, 0xae, 0x9a, 0x56, 0xa5, 0xf0, 0xe8, + 0x2e, 0x43, 0xa6, 0x99, 0xf2, 0x1d, 0x40, 0x2e, 0x21, 0x21, 0xe5, 0x7b, 0x7b, 0xc6, 0x76, 0xd8, 0xdb, 0xfc, 0x6d, 0x2d, 0xf8, 0x97, 0xc5, 0x90, 0x45, 0x2c, 0xf3, 0x26, 0x84, 0x2e, 0xc3, 0x89, + 0x88, 0x0f, 0x3d, 0x26, 0xfc, 0xaf, 0xb5, 0x26, 0x37, 0xcf, 0xde, 0x7b, 0xfa, 0x8f, 0x9e, 0xfe, 0x53, 0x8a, 0x86, 0x34, 0x04, 0x08, 0xb0, 0xf0, 0x4d, 0x0c, 0x11, 0xc7, 0x61, 0x57, 0xc4, 0x3c, + 0xff, 0xdc, 0x19, 0x3b, 0xa6, 0x9b, 0x52, 0x7e, 0xe6, 0x25, 0x59, 0x39, 0x56, 0x1d, 0xa7, 0x2c, 0x64, 0x8e, 0xb9, 0x85, 0x3d, 0xf4, 0x4d, 0x3e, 0x9d, 0xf9, 0x5a, 0xbd, 0xf7, 0xb1, 0x95, 0xef, + 0x17, 0x4a, 0xa4, 0x18, 0xdf, 0x93, 0xfa, 0x1c, 0xbc, 0xe1, 0x68, 0xe7, 0xd4, 0x66, 0x5e, 0xce, 0x8a, 0x53, 0xe9, 0xdb, 0xae, 0xf7, 0x5b, 0x55, 0x84, 0xbb, 0xb3, 0xf8, 0x78, 0xec, 0xf3, 0xdc, + 0x39, 0x10, 0xa7, 0x03, 0xd7, 0xcb, 0x4d, 0x3b, 0xf3, 0xf2, 0xf2, 0xbb, 0x9c, 0x7f, 0x6b, 0xeb, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, 0x2a, 0xcc, 0xf1, 0x76, 0x0a, + 0x00, 0x00, 0x51, 0x16, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x1c, 0xcd, 0x31, 0x6e, 0xc3, 0x30, 0x0c, 0x85, 0xe1, 0x59, 0x3c, 0x05, 0xab, 0x49, 0x02, 0x1a, + 0x19, 0x5d, 0x5b, 0x64, 0x4c, 0xc7, 0x2e, 0x39, 0x81, 0x22, 0x53, 0xae, 0x10, 0x4b, 0x34, 0x28, 0x3a, 0x0d, 0x50, 0xf8, 0xee, 0x81, 0x3d, 0xff, 0xdf, 0xc3, 0x5b, 0x62, 0xba, 0xc7, 0x89, 0xb0, + 0xc6, 0xd2, 0x00, 0x4a, 0x5d, 0x58, 0x14, 0x1d, 0x18, 0x9b, 0xab, 0x5a, 0x30, 0x96, 0xbb, 0x05, 0x30, 0x89, 0xd0, 0x4e, 0x45, 0x7f, 0xd7, 0x5b, 0x48, 0x5c, 0x87, 0x7b, 0x8b, 0x5a, 0x1e, 0x74, + 0xea, 0xb1, 0x8d, 0x37, 0x7e, 0x0e, 0x79, 0x6d, 0xe9, 0x34, 0xf1, 0x90, 0x66, 0x5e, 0x47, 0x7a, 0x50, 0xd3, 0x63, 0x95, 0xd1, 0x66, 0x0b, 0x1e, 0x60, 0xef, 0xc7, 0x83, 0xf3, 0xf8, 0x0f, 0xa6, + 0x64, 0x24, 0x11, 0xfc, 0x3c, 0x63, 0xa2, 0x70, 0xd5, 0x28, 0xea, 0x72, 0xf8, 0xa1, 0x3f, 0xe7, 0xfd, 0xd7, 0x51, 0xde, 0xce, 0xd8, 0xca, 0xbc, 0x53, 0x93, 0xab, 0x86, 0xef, 0x45, 0x4a, 0xd3, + 0xb9, 0x39, 0xee, 0xe1, 0xaa, 0x23, 0x89, 0xbc, 0xef, 0x2c, 0x5c, 0x44, 0x58, 0x9c, 0xf7, 0x60, 0x0c, 0xf7, 0x70, 0x79, 0x16, 0x75, 0x1f, 0x1e, 0xcc, 0x06, 0x1b, 0xbc, 0x02, 0x00, 0x00, 0xff, + 0xff, 0x50, 0x4b, 0x07, 0x08, 0x56, 0xb6, 0x33, 0x1f, 0xb1, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0x07, 0xa1, 0xcc, 0xbc, 0xe2, 0x92, 0xc4, 0xbc, 0xe4, 0xd4, 0x14, 0xdd, 0x8c, 0x92, 0x92, 0x02, 0x40, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xeb, 0x1c, 0x44, 0x4e, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x74, 0x8e, 0x41, 0x52, 0xc3, 0x30, 0x0c, 0x45, 0xd7, 0xf5, 0x29, + 0xb4, 0xa4, 0x0b, 0x4b, 0x72, 0xd9, 0x90, 0x05, 0xdc, 0xc5, 0x71, 0x14, 0xe3, 0xc1, 0xb1, 0xc0, 0x76, 0x32, 0x2d, 0xa7, 0x67, 0x1a, 0x36, 0x2d, 0x43, 0xbf, 0x96, 0x7a, 0xef, 0xcf, 0x5f, 0x74, + 0x5a, 0xb3, 0x40, 0x33, 0xa6, 0xca, 0x67, 0xf6, 0x41, 0x60, 0x86, 0xd7, 0x37, 0x40, 0x9a, 0x8d, 0x89, 0x0a, 0x0e, 0xdd, 0x70, 0x7d, 0x7d, 0xad, 0xa9, 0x0a, 0x3c, 0x99, 0xc3, 0x0c, 0x1b, 0x23, + 0x23, 0x5b, 0x66, 0x76, 0xfb, 0xed, 0xb1, 0x7c, 0x13, 0x73, 0x88, 0xa9, 0xbf, 0xaf, 0x23, 0x06, 0x5d, 0xe8, 0xa3, 0xf8, 0x9e, 0x36, 0xb1, 0xcd, 0x97, 0x69, 0xd4, 0x33, 0xcd, 0x6b, 0x09, 0x36, + 0xea, 0xb5, 0xc6, 0xbd, 0xe0, 0xc9, 0x1c, 0xef, 0xea, 0x6f, 0xc4, 0xc5, 0xf7, 0x5e, 0x28, 0xaa, 0x0d, 0x9a, 0xb5, 0xfa, 0x31, 0xcb, 0xee, 0xa0, 0x7b, 0x06, 0x22, 0x48, 0x65, 0x4a, 0x55, 0x42, + 0xff, 0x5f, 0x49, 0xcd, 0xf7, 0x7e, 0xf9, 0x9d, 0xea, 0x86, 0x87, 0x7c, 0x6d, 0xf4, 0x2d, 0x55, 0xb3, 0x46, 0xd8, 0x1c, 0x9e, 0x06, 0x74, 0x7f, 0x50, 0xcd, 0xbe, 0x44, 0xd4, 0x1a, 0xe9, 0x4c, + 0xed, 0xd2, 0xf6, 0x01, 0x8c, 0x7c, 0x47, 0x1d, 0xcd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x01, 0x3e, 0x2e, 0x0a, 0xba, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, + 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, + 0x6d, 0xb4, 0xd4, 0xcb, 0xb2, 0xa2, 0xc8, 0x16, 0x06, 0xe0, 0x79, 0x3d, 0xc5, 0x9e, 0x1b, 0x42, 0x26, 0x57, 0x39, 0x11, 0x35, 0x40, 0x44, 0xae, 0x2a, 0x72, 0x51, 0x74, 0x06, 0x09, 0x09, 0x8a, + 0x90, 0x08, 0x08, 0xe8, 0xd3, 0x9f, 0xb0, 0x6a, 0xa2, 0x1d, 0xbd, 0xa3, 0xaa, 0xba, 0x77, 0x4f, 0x18, 0x7e, 0xff, 0x1f, 0x8b, 0x95, 0x2b, 0x3b, 0x75, 0xf9, 0x2d, 0xa6, 0x10, 0x29, 0x69, 0x44, + 0x9a, 0x94, 0xb4, 0x74, 0x46, 0xa6, 0xed, 0xbd, 0xed, 0xd2, 0x32, 0xa1, 0x7b, 0x86, 0xf9, 0xe8, 0x19, 0x86, 0xe2, 0x29, 0x40, 0x67, 0x84, 0x2a, 0x49, 0xf2, 0x91, 0xc3, 0xff, 0x1d, 0xf8, 0x19, + 0xb9, 0x9f, 0x59, 0xd9, 0xe7, 0x5c, 0x25, 0xad, 0x0c, 0xfa, 0xe2, 0xf5, 0xf9, 0x90, 0x8e, 0x99, 0x32, 0x59, 0x7b, 0x3b, 0xdf, 0x30, 0xd9, 0x36, 0x3d, 0xf6, 0x8c, 0x86, 0xd4, 0x0a, 0x7d, 0xff, + 0xf6, 0xe2, 0x67, 0x24, 0x89, 0x6f, 0x2d, 0xfd, 0xe3, 0xd3, 0xf3, 0x1f, 0x3d, 0x4f, 0x01, 0x8a, 0x7b, 0x71, 0xc7, 0x7c, 0x8f, 0xc1, 0x72, 0xbd, 0x73, 0x32, 0x5e, 0x74, 0xc5, 0x23, 0x08, 0x62, + 0x4b, 0x8f, 0x4d, 0x5c, 0xa8, 0xf7, 0xa1, 0x29, 0xcf, 0x66, 0x85, 0xc5, 0x81, 0x1f, 0x9b, 0x65, 0x6d, 0x61, 0xf9, 0xcd, 0x2d, 0xaa, 0xa8, 0x3b, 0xf5, 0xe9, 0xb4, 0x8d, 0xaa, 0x24, 0x26, 0x23, + 0x8d, 0x6f, 0x15, 0x9a, 0x66, 0xe4, 0xa3, 0x07, 0x14, 0x9c, 0x51, 0xf0, 0x49, 0x3b, 0xc5, 0xa6, 0xdd, 0x97, 0x59, 0x8a, 0x0d, 0xc8, 0x82, 0xd2, 0x9c, 0x97, 0xe4, 0xb1, 0x2c, 0xa2, 0x6a, 0x5e, + 0xea, 0x5a, 0x07, 0xd5, 0xa8, 0x14, 0x94, 0x31, 0x5c, 0x73, 0x5a, 0x63, 0x94, 0xdb, 0x3f, 0xa1, 0x5f, 0xca, 0x6f, 0x17, 0x16, 0xbe, 0x0a, 0x73, 0xd2, 0xad, 0x0a, 0xdb, 0xa6, 0xcb, 0xba, 0x4e, + 0x76, 0x78, 0xd0, 0xaa, 0xe3, 0xe3, 0xf8, 0xe0, 0x96, 0xfd, 0x88, 0x1f, 0xde, 0xd5, 0x8c, 0x38, 0xc8, 0xb5, 0x73, 0xee, 0x0f, 0x12, 0x98, 0x27, 0x7d, 0x1b, 0xb4, 0xa6, 0x5e, 0x86, 0x08, 0xe5, + 0x6a, 0x87, 0x1b, 0x46, 0xb1, 0x75, 0x23, 0x3c, 0xe8, 0x55, 0x33, 0xb0, 0xbd, 0x71, 0xd7, 0xf7, 0x67, 0xa3, 0xa5, 0xb7, 0x5e, 0xc8, 0x3c, 0x86, 0x18, 0xfd, 0x09, 0xfd, 0x05, 0xe5, 0xcb, 0xa8, + 0xeb, 0xaa, 0xe7, 0xc2, 0x20, 0x72, 0x21, 0x4d, 0x14, 0x5f, 0xd2, 0x1f, 0x38, 0x05, 0x5f, 0xf1, 0x1b, 0xaf, 0xc3, 0xc3, 0x7a, 0x3e, 0xd6, 0x57, 0x37, 0x1a, 0xdb, 0x83, 0x79, 0xf0, 0x8a, 0x93, + 0xb2, 0xb7, 0x1e, 0x2a, 0x3e, 0xc9, 0x31, 0xd4, 0x62, 0x9e, 0x01, 0xd6, 0xee, 0xce, 0x8f, 0xe3, 0xe5, 0x37, 0x71, 0xf6, 0xa9, 0xe2, 0xa5, 0xcc, 0xed, 0x8f, 0x63, 0xa2, 0x2e, 0xb9, 0x2e, 0x74, + 0x8e, 0x3b, 0x6b, 0x65, 0x0f, 0x8b, 0x19, 0x09, 0x2a, 0xc5, 0xf7, 0x09, 0x98, 0x25, 0xb7, 0x40, 0x1c, 0xc6, 0x14, 0x25, 0x6a, 0x2f, 0xff, 0xa6, 0xfa, 0x52, 0x59, 0xf4, 0x24, 0x3a, 0xed, 0x41, + 0x71, 0xc9, 0xe6, 0x0b, 0x97, 0xd3, 0xba, 0xd0, 0x0f, 0xc3, 0x59, 0xc4, 0xf6, 0x86, 0x66, 0xd6, 0x2b, 0xd2, 0x17, 0xf3, 0x59, 0xbf, 0x45, 0x41, 0x1c, 0x85, 0x7a, 0xf6, 0xf7, 0xf8, 0xa9, 0x8d, + 0xba, 0xee, 0xfe, 0x94, 0x01, 0x05, 0x5f, 0x77, 0x5c, 0xd4, 0x34, 0xa3, 0x0f, 0x4e, 0x01, 0x51, 0x57, 0xbb, 0x5d, 0x39, 0x62, 0x9a, 0xab, 0x4e, 0x44, 0x0f, 0xcf, 0xa2, 0x74, 0xda, 0xea, 0x56, + 0x12, 0x30, 0x62, 0x61, 0x0a, 0x79, 0xab, 0x69, 0xd2, 0x27, 0xc3, 0x78, 0x93, 0x85, 0x17, 0xb9, 0x38, 0x68, 0x59, 0xb4, 0xc5, 0x75, 0xca, 0x57, 0x25, 0x3e, 0x1c, 0xf5, 0x89, 0x67, 0x39, 0xed, + 0x06, 0x31, 0x29, 0xe7, 0x35, 0x06, 0xde, 0x5c, 0x98, 0x94, 0xbe, 0x2f, 0x43, 0xaf, 0x77, 0xed, 0xd5, 0x6f, 0xc8, 0xd2, 0x93, 0x34, 0x0d, 0xff, 0x16, 0x6f, 0x31, 0x58, 0x6d, 0xec, 0xe4, 0xa2, + 0xb9, 0x37, 0xf7, 0x3a, 0x39, 0x77, 0xed, 0xe2, 0x92, 0x16, 0xc9, 0xc1, 0x39, 0x45, 0xd2, 0x71, 0xd9, 0xce, 0x67, 0x39, 0x2d, 0x3b, 0xce, 0x27, 0x33, 0x7e, 0x27, 0x5f, 0xca, 0xee, 0x27, 0xbb, + 0x99, 0x73, 0xe9, 0x7c, 0x7f, 0xb5, 0xe9, 0xad, 0x5e, 0x4e, 0x4d, 0x5d, 0x34, 0x6e, 0x37, 0xe4, 0x49, 0x9c, 0xc7, 0x28, 0xc2, 0x19, 0x5b, 0xf4, 0x42, 0x4c, 0x7c, 0xc5, 0x27, 0xec, 0xe1, 0x4d, + 0xae, 0x8b, 0x8c, 0x4e, 0x9b, 0x86, 0x34, 0xed, 0x13, 0x95, 0xde, 0x5e, 0x60, 0x3c, 0x44, 0xc3, 0x88, 0xf5, 0xf9, 0x72, 0xbd, 0x9b, 0xd8, 0x4c, 0x1e, 0xd4, 0xb0, 0xd1, 0xe5, 0xc5, 0x0d, 0xef, + 0x58, 0x63, 0xd5, 0x55, 0x0b, 0x37, 0xc1, 0xb0, 0xe1, 0xd7, 0xc6, 0x5a, 0xbd, 0x80, 0x37, 0xb3, 0x69, 0xe9, 0xf1, 0x94, 0x7c, 0xf4, 0x90, 0xe2, 0xde, 0xce, 0x5c, 0xd7, 0x34, 0x57, 0xc9, 0xb3, + 0xca, 0x34, 0x0b, 0xef, 0x2d, 0x1b, 0xa5, 0xb2, 0x15, 0xae, 0x02, 0x3f, 0x31, 0xdb, 0x43, 0xb8, 0x1b, 0xb4, 0x03, 0xeb, 0xda, 0x08, 0x67, 0xd7, 0x34, 0xc3, 0x71, 0xf6, 0x57, 0xef, 0x91, 0x36, + 0xe4, 0x42, 0xb2, 0xa7, 0xc9, 0x48, 0x3f, 0x2f, 0x10, 0xda, 0x4c, 0x12, 0x01, 0x28, 0x7a, 0x51, 0x54, 0x4a, 0xdc, 0x3f, 0xd4, 0xfd, 0xe8, 0x00, 0x4f, 0xb2, 0x04, 0xeb, 0x7a, 0xf7, 0xcf, 0x8d, + 0xb2, 0x0e, 0xee, 0xd0, 0x4e, 0xb6, 0xb6, 0xa2, 0x39, 0xe8, 0x17, 0xda, 0x4b, 0x45, 0x3b, 0x15, 0x54, 0x2f, 0x76, 0xc5, 0x1c, 0x4d, 0x16, 0x8e, 0x60, 0x77, 0xd0, 0xd7, 0x4f, 0xbb, 0x99, 0xb2, + 0xf5, 0x92, 0xa2, 0x58, 0x37, 0x09, 0xeb, 0x82, 0x30, 0x56, 0xb3, 0x9a, 0x3d, 0xce, 0x83, 0xef, 0xdf, 0x32, 0x72, 0x89, 0xaa, 0x8c, 0x22, 0x4d, 0x46, 0x8f, 0x74, 0x7b, 0x6f, 0x7f, 0xfe, 0x16, + 0x30, 0x65, 0x00, 0x03, 0x81, 0xc0, 0x02, 0x00, 0x78, 0x86, 0x05, 0x53, 0x80, 0x25, 0x1c, 0x31, 0x42, 0x84, 0x67, 0x22, 0x7a, 0x89, 0x22, 0x4e, 0x91, 0xd7, 0x70, 0x65, 0x36, 0xb9, 0x58, 0x05, + 0x69, 0xad, 0xcc, 0x51, 0xc1, 0x4f, 0x4a, 0xf9, 0x81, 0x37, 0x92, 0xd9, 0xc4, 0x72, 0xbd, 0x5e, 0x67, 0x91, 0x9f, 0x68, 0x0b, 0xc3, 0xcf, 0x7e, 0x11, 0x25, 0x31, 0x22, 0x90, 0x38, 0xc0, 0xf3, + 0x53, 0x56, 0x42, 0x08, 0xc3, 0x24, 0x11, 0x70, 0x24, 0xfc, 0x07, 0x51, 0x0c, 0x98, 0x41, 0x08, 0x45, 0xc8, 0x70, 0xc2, 0x14, 0xc7, 0x48, 0x4c, 0x40, 0xc4, 0x4a, 0xb3, 0x28, 0xfe, 0xca, 0x28, + 0xe1, 0x6d, 0x65, 0xfe, 0x35, 0x27, 0x51, 0xe0, 0xe9, 0x58, 0x1e, 0xed, 0xb2, 0x5d, 0x9f, 0x3b, 0xd7, 0xde, 0xec, 0x07, 0x64, 0xe1, 0x6a, 0xae, 0x9b, 0xc3, 0xd0, 0xe5, 0x1e, 0x84, 0xb6, 0x9b, + 0x97, 0x2b, 0x7e, 0xc1, 0x4b, 0xa9, 0x1a, 0x46, 0xa0, 0xfd, 0xd4, 0xf9, 0xca, 0x5a, 0x10, 0xfc, 0xec, 0xe5, 0x5d, 0x57, 0xcb, 0x5a, 0x0a, 0xd0, 0xd6, 0x3c, 0x46, 0x93, 0xba, 0x3c, 0xdc, 0x64, + 0xeb, 0x9c, 0x48, 0xe3, 0x15, 0x62, 0x70, 0xe6, 0x1b, 0x1b, 0x2d, 0x8c, 0x02, 0x94, 0x67, 0xee, 0x2a, 0xb7, 0xf2, 0xe7, 0xd0, 0x3f, 0x2d, 0xf6, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, + 0x07, 0x08, 0x47, 0xcb, 0xed, 0xf8, 0xdd, 0x03, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x1c, 0xcc, 0xb1, 0x6e, 0x02, 0x31, 0x0c, 0x80, 0xe1, 0xd9, 0x7e, 0x0a, 0x37, 0x53, 0x22, + 0x95, 0x9c, 0xba, 0xb6, 0x62, 0xa4, 0x63, 0x17, 0x9e, 0x20, 0x1c, 0xc9, 0x61, 0x41, 0xe2, 0x93, 0x63, 0x5a, 0xa4, 0x8a, 0x77, 0x47, 0xb9, 0xf9, 0xff, 0xf4, 0xaf, 0x69, 0xbe, 0xa6, 0x25, 0x53, + 0x4d, 0xdc, 0x10, 0xb9, 0xae, 0xa2, 0x46, 0x1e, 0xc1, 0x95, 0x6a, 0x0e, 0xc1, 0x49, 0x77, 0x88, 0xe0, 0x16, 0xb6, 0xcb, 0xfd, 0x14, 0x67, 0xa9, 0xd3, 0xb5, 0x25, 0xe3, 0xdf, 0xbc, 0xeb, 0xa9, + 0x9d, 0x4f, 0xf2, 0x98, 0xca, 0xbd, 0xcd, 0xbb, 0x45, 0xa6, 0x8b, 0xd9, 0x3a, 0x6c, 0x21, 0x57, 0x1c, 0x06, 0xc4, 0x11, 0xb6, 0xaf, 0x0f, 0xf4, 0x8f, 0xc0, 0x85, 0xb2, 0x2a, 0x7d, 0xee, 0x69, + 0xc8, 0x78, 0xb4, 0xa4, 0xe6, 0x4b, 0xfc, 0xc9, 0x7f, 0x3e, 0x84, 0xaf, 0xad, 0xbd, 0xed, 0xa9, 0xf1, 0x6d, 0x60, 0x28, 0xd5, 0xe2, 0xf7, 0xaa, 0xdc, 0xec, 0xd6, 0xbc, 0xf4, 0x78, 0xb4, 0x73, + 0x56, 0x7d, 0x1f, 0x2c, 0x1e, 0x54, 0x45, 0x7d, 0x08, 0x08, 0x20, 0x3d, 0x1e, 0x1e, 0x6c, 0xfe, 0x23, 0x20, 0x3c, 0xf1, 0x89, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfc, + 0xde, 0x7b, 0x4c, 0xaa, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, - 0x64, 0x54, 0x52, 0x5d, 0x4f, 0xe3, 0x48, 0x10, 0x7c, 0x9f, 0x5f, 0x51, 0x17, 0x1e, 0x42, 0x24, 0x1c, 0xc3, 0x1b, 0xf2, 0x2b, 0x07, 0xc7, 0x49, 0x77, 0x3a, 0xa4, 0xcb, 0xe9, 0x56, 0x62, 0xd1, - 0x7a, 0x32, 0xee, 0xc4, 0x43, 0xc6, 0xdd, 0xde, 0xf9, 0x30, 0x44, 0xab, 0xfd, 0xef, 0xab, 0x19, 0x12, 0x08, 0x6f, 0x76, 0x75, 0xf7, 0x54, 0x75, 0x75, 0x9d, 0xe1, 0x0f, 0xc1, 0x8d, 0x93, 0xd4, - 0xe1, 0x76, 0x22, 0x8e, 0x01, 0x77, 0x89, 0x4d, 0xb4, 0xc2, 0x4a, 0xfd, 0x4f, 0xce, 0xc8, 0x40, 0x88, 0x82, 0xbd, 0x24, 0x0f, 0xa6, 0x97, 0xdc, 0x7d, 0x6c, 0xf8, 0x0d, 0xab, 0x9e, 0xb0, 0x16, - 0xeb, 0xc8, 0x8f, 0x4e, 0x47, 0xc2, 0xe6, 0x50, 0x81, 0x91, 0x8e, 0x60, 0x34, 0x63, 0x4d, 0xd8, 0x48, 0xe2, 0x0e, 0x96, 0xf1, 0xd8, 0xf6, 0x9a, 0x3b, 0x47, 0xcb, 0xad, 0xb4, 0x4f, 0xe7, 0xef, - 0xdf, 0x8b, 0x25, 0x56, 0xbd, 0xfd, 0xe0, 0x85, 0x0d, 0x18, 0x48, 0x73, 0xcc, 0xbc, 0x9e, 0xc2, 0x28, 0xdc, 0x81, 0x5e, 0x8d, 0x4b, 0xc1, 0x4e, 0xe4, 0xf6, 0x19, 0x7e, 0x3c, 0x55, 0xfc, 0x74, - 0xde, 0xc7, 0x38, 0x86, 0xa6, 0xae, 0x4d, 0x46, 0xa9, 0x80, 0x4b, 0x2b, 0xf5, 0xe2, 0x02, 0xeb, 0x14, 0xb3, 0xf6, 0xa2, 0xc5, 0xd3, 0x20, 0x13, 0x21, 0xf6, 0x04, 0xd3, 0x93, 0xd9, 0x61, 0x23, - 0x1e, 0x31, 0x53, 0x5b, 0x2e, 0xe8, 0xbb, 0x7c, 0x9d, 0x05, 0x47, 0xbc, 0x58, 0xe7, 0xde, 0x15, 0x3c, 0xa7, 0x10, 0xb1, 0xb1, 0x5c, 0xec, 0x18, 0x9d, 0xb6, 0x8c, 0x49, 0xb3, 0x75, 0x4e, 0xc3, - 0xb2, 0x91, 0xc1, 0xf2, 0x16, 0xf7, 0xab, 0xd5, 0x03, 0x3c, 0x7d, 0x4f, 0x14, 0x62, 0x58, 0x2a, 0x75, 0x76, 0x86, 0xdf, 0x69, 0x22, 0x27, 0xe3, 0x40, 0x1c, 0x95, 0x3a, 0xfc, 0x14, 0x23, 0x37, - 0xa4, 0x63, 0xf2, 0x14, 0xb0, 0xde, 0x43, 0x77, 0x5d, 0x1e, 0xd7, 0x88, 0x14, 0xca, 0xda, 0x47, 0xab, 0xbe, 0x65, 0xe0, 0xd4, 0xaf, 0x23, 0xb0, 0x28, 0xe2, 0x49, 0x9b, 0xfe, 0xf8, 0xd0, 0x45, - 0x51, 0x6d, 0x84, 0x37, 0xd6, 0x0f, 0x45, 0xbd, 0xf8, 0x5d, 0xc0, 0x8b, 0x8d, 0x3d, 0xda, 0xad, 0x94, 0xa7, 0xdb, 0xa5, 0x52, 0xff, 0x8d, 0x5d, 0x3e, 0x55, 0xde, 0xd7, 0x27, 0xe6, 0xc2, 0xcb, - 0xda, 0xc9, 0x16, 0xb2, 0xf9, 0xec, 0x42, 0x0a, 0xb9, 0x98, 0xa1, 0x36, 0x63, 0x2d, 0x6e, 0xfe, 0xfa, 0x13, 0xe2, 0x61, 0x9c, 0x25, 0x8e, 0x70, 0x76, 0xed, 0xb5, 0xdf, 0x5f, 0x1c, 0xdd, 0x3a, - 0x9c, 0xdb, 0xf2, 0x24, 0x3b, 0xea, 0x0e, 0xd3, 0x1a, 0x83, 0xe6, 0xa4, 0x9d, 0xdb, 0x57, 0xc6, 0x93, 0x8e, 0xd4, 0xbd, 0x85, 0xad, 0x5c, 0xae, 0x51, 0xaa, 0x6d, 0x5b, 0x23, 0x1c, 0xc4, 0x91, - 0x32, 0xc9, 0x3b, 0x54, 0x13, 0xaa, 0x2f, 0x78, 0xf8, 0xe7, 0xdf, 0x15, 0xaa, 0x0e, 0xf3, 0x1f, 0xb3, 0x81, 0x42, 0xd0, 0x5b, 0x9a, 0x35, 0x98, 0xf5, 0xe4, 0x9c, 0xcc, 0x7e, 0xce, 0xf1, 0x55, - 0x01, 0xd5, 0xfd, 0xfc, 0x46, 0x38, 0x12, 0xc7, 0x2a, 0xee, 0x47, 0x6a, 0xa0, 0xc7, 0xd1, 0x59, 0xa3, 0xb3, 0xf2, 0xfa, 0x39, 0x08, 0x7f, 0xb4, 0x51, 0x65, 0xbb, 0x06, 0x57, 0xa7, 0x40, 0x90, - 0xe4, 0x0d, 0x35, 0x28, 0x81, 0xa9, 0x4a, 0x62, 0x2a, 0x7a, 0xd5, 0xc3, 0xe8, 0xe8, 0x53, 0x5b, 0x5a, 0x3f, 0x93, 0x89, 0x0d, 0x6e, 0x4d, 0x2f, 0xd9, 0xdb, 0xcc, 0x77, 0xda, 0xf0, 0x46, 0xfd, - 0xf7, 0xbe, 0xac, 0xf3, 0x69, 0x72, 0x24, 0x33, 0x91, 0x0f, 0x56, 0xb8, 0xc1, 0xd5, 0xf2, 0xf2, 0xad, 0x96, 0x73, 0xda, 0xd4, 0xb5, 0x13, 0xa3, 0x5d, 0x2f, 0x21, 0x36, 0xd7, 0x97, 0xd7, 0x97, - 0x75, 0x36, 0x41, 0xa9, 0x3b, 0xf1, 0x18, 0x24, 0xdf, 0x31, 0x10, 0xe1, 0xb1, 0xa4, 0x54, 0xb2, 0xa0, 0x48, 0xe8, 0xc4, 0xa4, 0x9c, 0xa0, 0xb2, 0xdd, 0xd3, 0xf9, 0xfc, 0x98, 0xf7, 0xad, 0x8d, - 0x7d, 0x5a, 0x2f, 0x8d, 0x0c, 0xf5, 0x8e, 0x75, 0xb4, 0x13, 0xd5, 0xf9, 0x52, 0x75, 0xf4, 0x44, 0xf5, 0xa0, 0x2d, 0xd7, 0x9d, 0x98, 0x30, 0x5f, 0x28, 0xf5, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x50, - 0x4b, 0x07, 0x08, 0xc2, 0x4a, 0x3e, 0xd9, 0x3e, 0x02, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, - 0x6f, 0x64, 0x04, 0xc0, 0xd1, 0x11, 0x80, 0x20, 0x08, 0x00, 0xd0, 0x7f, 0xa6, 0x60, 0x81, 0x30, 0xbd, 0x5a, 0x28, 0x25, 0xf3, 0x52, 0xb9, 0x54, 0x98, 0xbf, 0xd7, 0x24, 0x69, 0x65, 0xbc, 0xb5, - 0xc7, 0x55, 0xa4, 0x03, 0x64, 0x41, 0x4f, 0xfe, 0x00, 0x18, 0xfc, 0x69, 0x19, 0x8c, 0xb9, 0xac, 0x47, 0x2f, 0x8a, 0xd2, 0x5c, 0xac, 0xa2, 0x89, 0x8d, 0xfb, 0x9a, 0x6e, 0xa6, 0x77, 0xcb, 0xe2, - 0x2c, 0xa0, 0x05, 0x3a, 0x69, 0x87, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9a, 0xe7, 0x37, 0x3e, 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x8c, 0x52, 0xc1, 0x8a, 0xdb, 0x40, 0x0c, 0x3d, 0x5b, 0x5f, 0xf1, 0xf0, 0xa1, 0xc4, 0x26, - 0xf5, 0x40, 0x8f, 0xbd, 0x95, 0x6d, 0x60, 0x6f, 0x29, 0xa1, 0x3d, 0xf4, 0xd4, 0xb8, 0x33, 0x8a, 0x33, 0xec, 0x78, 0x14, 0xc6, 0x9a, 0xb0, 0x4b, 0xe9, 0xbf, 0x17, 0x3b, 0x61, 0x9b, 0x06, 0xd7, - 0xec, 0xc5, 0x1e, 0x3d, 0x3d, 0xe9, 0x89, 0x27, 0x9d, 0x5a, 0xfb, 0xd4, 0x76, 0x8c, 0x43, 0x8e, 0x56, 0xbd, 0x44, 0x22, 0xdf, 0x9f, 0x24, 0x29, 0x56, 0x54, 0x94, 0x56, 0xa2, 0xf2, 0xb3, 0x96, - 0x54, 0x94, 0x87, 0x5e, 0x4b, 0xa2, 0xa2, 0xec, 0xbc, 0x1e, 0xf3, 0xcf, 0xc6, 0x4a, 0x6f, 0x6c, 0x90, 0xec, 0xf8, 0xcc, 0x51, 0x07, 0x33, 0xb8, 0xa7, 0xf7, 0x9d, 0x98, 0xf3, 0x07, 0x33, 0x01, - 0x25, 0x55, 0x44, 0xc6, 0xe0, 0xb1, 0x8d, 0x2e, 0x30, 0xda, 0x88, 0x09, 0x6e, 0x68, 0x94, 0xb9, 0xa2, 0x2b, 0xab, 0xcf, 0xb8, 0x2a, 0x34, 0x0f, 0x97, 0xff, 0x1a, 0x7c, 0x65, 0x6e, 0xc6, 0x6f, - 0x85, 0x55, 0x7d, 0x13, 0xae, 0xc1, 0x29, 0x49, 0xaa, 0xf0, 0x8b, 0x0a, 0x53, 0x53, 0x81, 0x1a, 0xdf, 0xb7, 0xdf, 0x76, 0x78, 0xd8, 0x7e, 0xde, 0xe0, 0x71, 0xb3, 0xdb, 0x8c, 0xd0, 0x04, 0x7f, - 0x4d, 0x2f, 0x48, 0x39, 0x46, 0x1f, 0x3b, 0xec, 0x3b, 0x81, 0xf2, 0xa0, 0xfb, 0x06, 0xf8, 0xe4, 0x1c, 0x7a, 0x49, 0x3c, 0x01, 0x68, 0x07, 0xbc, 0x48, 0x86, 0x15, 0xc7, 0xf0, 0x11, 0xfb, 0xe3, - 0x34, 0xd7, 0x8f, 0x31, 0xd7, 0x74, 0xb2, 0x6f, 0xc6, 0x56, 0x86, 0xa8, 0x38, 0xf4, 0xda, 0x7c, 0x49, 0x3e, 0x6a, 0x88, 0xab, 0x72, 0xc7, 0x96, 0xfd, 0x99, 0xdd, 0x65, 0xce, 0xb2, 0xfa, 0x37, - 0xcd, 0x15, 0x8c, 0x01, 0xdb, 0xa3, 0x40, 0x05, 0x41, 0x6c, 0x1b, 0x20, 0x59, 0x4f, 0x59, 0xa9, 0x48, 0xac, 0x39, 0x45, 0xbc, 0xe3, 0x35, 0xa2, 0x0f, 0xb7, 0x3c, 0xdb, 0x86, 0xc0, 0x89, 0x7e, - 0x13, 0x99, 0x9a, 0xb6, 0x7a, 0xe4, 0x84, 0x21, 0x9f, 0xc6, 0x35, 0xb0, 0x7b, 0xdd, 0x0c, 0x06, 0xdf, 0xc5, 0x56, 0x73, 0xe2, 0xe1, 0x23, 0x51, 0x71, 0x35, 0xb1, 0xfa, 0xfb, 0xba, 0xb8, 0xf3, - 0x1a, 0xdf, 0x59, 0x5b, 0xfd, 0x37, 0x71, 0x57, 0x77, 0xeb, 0xff, 0x2c, 0xb8, 0xac, 0xb3, 0xc6, 0x6c, 0x83, 0x45, 0xd6, 0xc2, 0x04, 0xb8, 0x3d, 0x80, 0x79, 0xc6, 0xec, 0x8d, 0xbc, 0x51, 0x78, - 0xb6, 0xfb, 0x72, 0xc9, 0xbc, 0x1c, 0xd5, 0x86, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, 0xa7, 0xe7, 0x98, 0x5d, 0x01, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x5c, 0x90, 0x41, 0x8b, 0xdb, 0x30, 0x10, - 0x85, 0xcf, 0x9a, 0x5f, 0x31, 0x15, 0x94, 0x48, 0xc5, 0xb5, 0xa0, 0xc7, 0x42, 0x0e, 0x6d, 0x77, 0x4b, 0x7b, 0xe9, 0x65, 0xf3, 0x07, 0x14, 0x69, 0x62, 0x8b, 0x38, 0x92, 0x91, 0xc6, 0xd9, 0x5d, - 0xca, 0xfe, 0xf7, 0x32, 0x4e, 0x1a, 0xc2, 0x9e, 0x6c, 0x3f, 0x3f, 0xbe, 0x79, 0xef, 0xcd, 0x3e, 0x1c, 0xfd, 0x40, 0x78, 0x58, 0x72, 0xe0, 0x54, 0x32, 0x40, 0x3a, 0xcd, 0xa5, 0x32, 0x1a, 0x50, - 0x3a, 0x94, 0xcc, 0xf4, 0xc2, 0x1a, 0x94, 0x66, 0x6a, 0x9c, 0xf2, 0xa0, 0x01, 0x94, 0x1e, 0x12, 0x8f, 0xcb, 0xbe, 0x0f, 0xe5, 0xe4, 0xc2, 0x54, 0x96, 0x48, 0x67, 0xca, 0xdc, 0x5c, 0x8b, 0xc7, - 0xcf, 0x43, 0x71, 0xe7, 0x2f, 0x6e, 0x15, 0x34, 0x58, 0x00, 0xe7, 0x70, 0x47, 0x8d, 0x7f, 0xf9, 0x1c, 0x27, 0x42, 0xca, 0x6d, 0xa9, 0xd4, 0x90, 0x47, 0xcf, 0x78, 0xd5, 0x7c, 0x08, 0x34, 0x73, - 0x43, 0x8f, 0x67, 0x3f, 0xa5, 0x88, 0x3f, 0x84, 0xf8, 0x28, 0x00, 0x7c, 0x4e, 0x3c, 0x96, 0x85, 0x91, 0x6a, 0x2d, 0xb5, 0x07, 0x89, 0x78, 0x47, 0x33, 0x8c, 0x9f, 0xae, 0xa9, 0xfa, 0x9d, 0xc5, - 0xbf, 0xa0, 0x9c, 0xc3, 0x6f, 0xad, 0xd1, 0x69, 0x3f, 0x11, 0x28, 0xc2, 0xaf, 0x5b, 0x5c, 0x83, 0xf4, 0x7f, 0xe8, 0xd9, 0x58, 0x50, 0xd4, 0x3f, 0x11, 0xff, 0x7e, 0x30, 0x3a, 0x45, 0xfd, 0xff, - 0x73, 0xf7, 0x3a, 0x93, 0xd1, 0xfc, 0x3a, 0xd3, 0x4d, 0x7a, 0x2a, 0x4b, 0x0d, 0x64, 0x74, 0x5b, 0x9f, 0x37, 0xf9, 0xc1, 0xb3, 0x37, 0x5a, 0xe6, 0x70, 0xf3, 0xe4, 0x53, 0xd6, 0x1d, 0xea, 0xe8, - 0xd9, 0x6b, 0x0b, 0x97, 0xcb, 0x81, 0x41, 0x51, 0x18, 0x4b, 0x27, 0x79, 0xe5, 0xf8, 0x35, 0xe6, 0x75, 0xc4, 0xfe, 0xbb, 0x0f, 0xc7, 0xa1, 0x96, 0x25, 0x47, 0x63, 0x3b, 0x24, 0x0b, 0x2a, 0x1d, - 0x56, 0xeb, 0x87, 0x2d, 0xe6, 0x34, 0x49, 0x01, 0xc5, 0xfd, 0x4f, 0xcf, 0x7e, 0x32, 0x54, 0xab, 0x05, 0xf5, 0x06, 0xb7, 0x4e, 0x95, 0x2f, 0xf6, 0x30, 0x16, 0xdc, 0xde, 0xfb, 0x1f, 0x65, 0x9b, - 0x83, 0xd1, 0x95, 0x02, 0xa5, 0x33, 0xc5, 0xf5, 0xd7, 0x65, 0x7f, 0x8b, 0xce, 0xe1, 0xc1, 0xa7, 0x09, 0x4b, 0x16, 0x59, 0x80, 0x02, 0x69, 0x5c, 0x53, 0x1e, 0x8c, 0xb0, 0xfa, 0xb5, 0x95, 0xb5, - 0x92, 0xe1, 0xd2, 0xe6, 0x1d, 0x96, 0x47, 0xc2, 0x1b, 0x7a, 0xc5, 0x22, 0xbd, 0xcc, 0x14, 0x98, 0x22, 0x8a, 0x1f, 0xb9, 0xe0, 0x9e, 0x70, 0x23, 0xef, 0x9b, 0x0e, 0x87, 0xc2, 0xb8, 0xf9, 0xd8, - 0x36, 0xba, 0xc3, 0x7b, 0xbc, 0x5c, 0x7e, 0x83, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, - 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, - 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, - 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, - 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, - 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, - 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, - 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, - 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x4c, 0x91, 0x3f, 0x8f, 0xdb, 0x30, 0x0c, 0xc5, 0x77, 0x7d, 0x8a, 0x57, 0x64, 0xb8, 0x0b, 0x50, 0xd8, 0x7b, 0xd6, 0x16, 0xd7, 0x16, 0xe8, 0xd0, - 0x21, 0x45, 0x87, 0xc3, 0xa1, 0x96, 0x25, 0x3a, 0x16, 0x22, 0x91, 0xae, 0xfe, 0x24, 0xcd, 0xb7, 0x2f, 0xe8, 0x8b, 0x83, 0x6e, 0xf6, 0x23, 0xf9, 0x7b, 0x8f, 0xd4, 0x0e, 0x5f, 0x04, 0x5f, 0x8f, - 0xc7, 0x1f, 0x78, 0x69, 0xec, 0x6a, 0x10, 0x36, 0xe6, 0x17, 0x45, 0x27, 0x89, 0x50, 0x05, 0x37, 0x69, 0x19, 0x4c, 0x57, 0xed, 0xda, 0x1a, 0x3e, 0xe0, 0x38, 0x13, 0x46, 0x09, 0x91, 0xf2, 0x12, - 0x6d, 0x25, 0x4c, 0xf7, 0x0a, 0x9c, 0x78, 0x82, 0xb3, 0x8c, 0x91, 0x30, 0x49, 0x63, 0x8f, 0xc0, 0xe6, 0x75, 0x98, 0x2d, 0xfb, 0x48, 0xdd, 0x49, 0x86, 0xb7, 0xe7, 0xc7, 0xf7, 0xbe, 0xc3, 0x71, - 0x0e, 0xe5, 0x81, 0x45, 0xa6, 0xb2, 0x08, 0xfb, 0xa2, 0xbe, 0x6b, 0xa2, 0x4c, 0x7f, 0x1a, 0x95, 0x5a, 0x3a, 0x63, 0x76, 0x3b, 0x7c, 0xa6, 0x0b, 0x45, 0x59, 0x12, 0x71, 0x35, 0xe6, 0xfe, 0xb3, - 0x46, 0x9b, 0xc8, 0xd6, 0x96, 0xa9, 0x60, 0xbc, 0xc1, 0x7a, 0x1f, 0xf8, 0x04, 0x8b, 0x4a, 0xa5, 0x2a, 0x68, 0x33, 0xff, 0xad, 0xc2, 0xff, 0x09, 0x36, 0x61, 0x8f, 0x49, 0xb2, 0x21, 0xeb, 0xe6, - 0x0d, 0xf4, 0x11, 0x96, 0x3d, 0x9c, 0xf0, 0x14, 0x72, 0x42, 0xa8, 0xb8, 0x4a, 0x3e, 0x17, 0x5c, 0x43, 0x9d, 0x31, 0x9c, 0x64, 0x45, 0x0f, 0x9d, 0x31, 0x3f, 0x17, 0xaf, 0xcb, 0xd7, 0x99, 0x90, - 0x1b, 0xf3, 0xea, 0xcb, 0x36, 0xca, 0x09, 0x32, 0xad, 0xea, 0xe3, 0x2c, 0xad, 0x68, 0x51, 0xa5, 0x41, 0xb5, 0x01, 0x9f, 0xbe, 0x7f, 0x83, 0x64, 0xb8, 0x18, 0x74, 0x9b, 0x18, 0xc6, 0x6c, 0xf3, - 0xed, 0xdd, 0x37, 0xd4, 0xed, 0x80, 0x81, 0x2f, 0x72, 0x26, 0x8f, 0x29, 0x4b, 0x7a, 0x7f, 0x88, 0x31, 0xcb, 0xb5, 0x50, 0xd6, 0xd1, 0x55, 0x54, 0xa2, 0x93, 0x94, 0x74, 0x2e, 0x06, 0xa6, 0x83, - 0x31, 0xc3, 0x30, 0x38, 0xe1, 0x22, 0x91, 0x8c, 0x6b, 0x39, 0x62, 0xae, 0x75, 0x39, 0xf4, 0x7d, 0xba, 0x6d, 0x61, 0x3a, 0xfa, 0x6b, 0xd3, 0x12, 0xa9, 0x73, 0x92, 0x7a, 0x6d, 0x37, 0xe6, 0x45, - 0x32, 0x92, 0xe8, 0xe2, 0x85, 0x08, 0xaf, 0x77, 0xea, 0x12, 0xa9, 0x12, 0xbc, 0xb8, 0xa6, 0x27, 0xb7, 0x3a, 0xfb, 0xf6, 0xfc, 0xa4, 0xbc, 0x72, 0xe8, 0xfb, 0x53, 0xa8, 0x73, 0x1b, 0x57, 0xc8, - 0x99, 0x6d, 0x0d, 0x17, 0xea, 0xd5, 0xa1, 0xaf, 0x99, 0xa8, 0x4f, 0x36, 0x70, 0xef, 0xc5, 0x95, 0xa7, 0xbd, 0x31, 0xe6, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc2, 0xdb, - 0xa3, 0x12, 0x72, 0x01, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0xca, 0xcd, 0x4f, 0x29, 0xcd, 0x49, 0x55, 0x48, 0x2b, 0xcd, - 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xe3, 0xe2, 0x4a, 0xcf, 0x57, 0x30, 0xd4, 0x33, 0x34, 0xe1, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0xe0, 0x7c, 0xeb, 0x1f, 0x00, 0x00, - 0x00, 0x19, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, - 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x94, 0x91, 0xd1, 0x6b, 0xe2, 0x40, 0x10, 0xc6, 0x9f, 0xb3, 0x7f, 0xc5, - 0x47, 0xa0, 0x47, 0x22, 0x92, 0xbc, 0x0b, 0x3e, 0x5c, 0x7b, 0x16, 0x1f, 0xee, 0x50, 0x52, 0xcb, 0x71, 0x70, 0x50, 0x63, 0x32, 0xc6, 0x60, 0xdc, 0x8d, 0xb3, 0x93, 0x50, 0x29, 0xfe, 0xef, 0xc7, - 0x6e, 0x2c, 0xa7, 0xed, 0x53, 0x45, 0xd8, 0xc9, 0x7c, 0x33, 0xdf, 0xfe, 0xf8, 0xb6, 0xcd, 0x8b, 0x7d, 0x5e, 0x11, 0xb6, 0x9d, 0x2e, 0xa4, 0x36, 0x5a, 0xa9, 0xfa, 0xd0, 0x1a, 0x16, 0x44, 0x2a, - 0x08, 0x0b, 0xa3, 0x85, 0x5e, 0x25, 0x54, 0x41, 0xb8, 0x3d, 0xf8, 0x43, 0x93, 0xa4, 0x3b, 0x91, 0xd6, 0xd5, 0x56, 0xb8, 0xd6, 0x95, 0x0d, 0x55, 0xac, 0x54, 0x9a, 0x62, 0x9e, 0xeb, 0xb2, 0x21, - 0xe4, 0x1a, 0xf3, 0xd5, 0x6a, 0x89, 0x8c, 0x8e, 0x1d, 0x59, 0x49, 0x94, 0x73, 0xbe, 0x88, 0x51, 0x21, 0xaf, 0xb8, 0x98, 0x26, 0x0f, 0xc3, 0x39, 0x06, 0x93, 0x85, 0xf3, 0x4c, 0x32, 0xb2, 0xad, - 0xd1, 0x96, 0x7e, 0x73, 0x2d, 0xc4, 0x4e, 0x38, 0x62, 0x74, 0x51, 0xbc, 0x59, 0x8c, 0x37, 0x15, 0xa4, 0x23, 0x15, 0x60, 0x84, 0x3f, 0x8b, 0xe7, 0x0c, 0x0f, 0x8b, 0x1f, 0x33, 0xcc, 0x67, 0xd9, - 0xcc, 0xb5, 0x7c, 0x7b, 0xc5, 0x27, 0x70, 0xa7, 0x75, 0xad, 0x2b, 0xac, 0x2b, 0x03, 0x21, 0x2b, 0xeb, 0x04, 0xf8, 0x5e, 0x96, 0x38, 0x18, 0x26, 0xdf, 0x40, 0x6e, 0x71, 0x32, 0x1d, 0x0a, 0x53, - 0x12, 0x6a, 0x8d, 0xf5, 0xce, 0xe3, 0xbd, 0x38, 0x2d, 0xa9, 0xcc, 0x3a, 0x71, 0x56, 0xa9, 0x52, 0xc1, 0xf6, 0x20, 0xc9, 0x92, 0x6b, 0x2d, 0x8d, 0x8e, 0xc2, 0x8c, 0x0a, 0xaa, 0x7b, 0x2a, 0x1d, - 0x97, 0xa3, 0x09, 0xe3, 0xdb, 0x81, 0x96, 0x49, 0xe4, 0xe4, 0xbf, 0x22, 0xa6, 0x63, 0x1c, 0xc3, 0xff, 0xd2, 0x14, 0x54, 0xec, 0x0c, 0xc4, 0xa0, 0x31, 0x45, 0xde, 0xc0, 0x74, 0xd2, 0x76, 0x32, - 0xec, 0x3e, 0xb6, 0x6e, 0x7c, 0x1b, 0x31, 0xd9, 0x31, 0x3e, 0x1b, 0x5c, 0xed, 0x16, 0x79, 0xd3, 0x10, 0xab, 0xb3, 0x1a, 0x02, 0xfd, 0x30, 0xfb, 0x31, 0xa7, 0xe1, 0x6d, 0x5c, 0x5c, 0x1b, 0x4c, - 0xa6, 0xf8, 0x76, 0x79, 0xab, 0xe4, 0xbe, 0xab, 0x9b, 0x92, 0xf8, 0xed, 0x7c, 0x7b, 0xfd, 0x66, 0x8c, 0xf0, 0xae, 0xc7, 0xfb, 0xff, 0xaf, 0x0e, 0x7d, 0xfa, 0xc9, 0x2f, 0x92, 0x9d, 0x29, 0x87, - 0xfa, 0x39, 0xfb, 0x39, 0x14, 0x4b, 0x36, 0x62, 0x86, 0x72, 0x6e, 0xac, 0xb8, 0x14, 0x0c, 0x63, 0x3f, 0x46, 0xdf, 0xbb, 0xbb, 0x38, 0xd7, 0x15, 0x0d, 0x2a, 0xe5, 0x25, 0xb1, 0x83, 0xf0, 0x13, - 0x2f, 0x63, 0x5c, 0x0d, 0xf4, 0xbd, 0x17, 0x3e, 0x61, 0x00, 0x77, 0xfd, 0xe4, 0x9d, 0xc1, 0x99, 0xc6, 0x2a, 0x08, 0xce, 0x2a, 0x38, 0x2b, 0x15, 0xd4, 0xdb, 0x2b, 0x2a, 0x4c, 0xa7, 0x08, 0x97, - 0x8b, 0xa7, 0x55, 0xe8, 0x8d, 0x3c, 0x59, 0xce, 0x96, 0x1e, 0x0d, 0x1f, 0x22, 0xb7, 0xf4, 0xdf, 0xb9, 0xd1, 0xde, 0xfa, 0xde, 0x94, 0xa7, 0x49, 0x18, 0x5f, 0x70, 0xf6, 0x37, 0x38, 0x6e, 0xdd, - 0x6d, 0x7e, 0x1d, 0x8a, 0x49, 0x3a, 0xd6, 0xd8, 0x24, 0x4f, 0x3e, 0xe3, 0x28, 0x56, 0x67, 0xf5, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x66, 0xb8, 0x89, 0xe0, 0xc1, 0x01, 0x00, - 0x00, 0x56, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x64, 0x90, 0xc1, 0x8a, 0xdb, 0x30, 0x10, - 0x86, 0xcf, 0x9a, 0xa7, 0x98, 0x0a, 0x0a, 0xf6, 0x62, 0xe4, 0xa5, 0xc7, 0x85, 0x5c, 0x76, 0x69, 0xbb, 0xa7, 0x52, 0xb6, 0x7e, 0x01, 0x21, 0x8d, 0x13, 0x11, 0x47, 0x72, 0xa4, 0x51, 0xec, 0x12, - 0xf2, 0xee, 0x45, 0x4a, 0x02, 0xa1, 0x7b, 0xb1, 0xc5, 0xcc, 0xfc, 0xff, 0xfc, 0xf3, 0xcd, 0xda, 0xec, 0xf5, 0x96, 0x70, 0xcc, 0xde, 0xb0, 0x0b, 0x1e, 0xc0, 0x1d, 0xe6, 0x10, 0x19, 0x1b, 0x10, - 0xd2, 0x04, 0xcf, 0xb4, 0xb2, 0x04, 0x21, 0x3d, 0x71, 0xbf, 0x63, 0x9e, 0x1f, 0xdf, 0xf5, 0xc3, 0x94, 0xea, 0x40, 0xf9, 0x3b, 0xbf, 0x95, 0xd0, 0x02, 0xf4, 0x3d, 0x0e, 0x94, 0xf8, 0x5d, 0x7b, - 0x3b, 0x11, 0x92, 0x4f, 0x39, 0x52, 0x42, 0xde, 0x69, 0xc6, 0x7b, 0x6d, 0x25, 0x93, 0x99, 0x12, 0x2e, 0x8e, 0x77, 0x21, 0x33, 0x52, 0x8c, 0x21, 0xa2, 0xf6, 0x16, 0x23, 0x71, 0x8e, 0xbe, 0x8c, - 0x53, 0x31, 0x7a, 0x1f, 0x86, 0xdf, 0xf8, 0xed, 0xf9, 0x19, 0x13, 0x6b, 0xce, 0x09, 0x4d, 0xb0, 0x84, 0xce, 0x5b, 0x67, 0x74, 0xd9, 0x87, 0x3e, 0x5c, 0xb5, 0x49, 0x41, 0xb9, 0xe1, 0x61, 0x71, - 0xc3, 0xf8, 0x74, 0x4b, 0xa5, 0x86, 0x16, 0xcf, 0x20, 0x4e, 0x3a, 0x96, 0xbb, 0xc4, 0x82, 0x88, 0x1b, 0xbc, 0xa7, 0x57, 0xbf, 0x68, 0xf9, 0x20, 0x13, 0xa2, 0xa5, 0xd8, 0xb4, 0x20, 0x44, 0xa4, - 0xe3, 0xa7, 0xf6, 0x31, 0x53, 0xe2, 0x46, 0xfe, 0xfc, 0x3e, 0xc8, 0x0e, 0x65, 0xe9, 0xbd, 0xf4, 0x3d, 0xad, 0xfa, 0x30, 0x4f, 0xa4, 0x4c, 0x38, 0xf4, 0x95, 0x43, 0x87, 0xde, 0x4d, 0x57, 0x8b, - 0x84, 0x4f, 0x65, 0x4a, 0x7d, 0x50, 0x9a, 0x83, 0x4f, 0x04, 0xa2, 0x05, 0x10, 0xb7, 0x64, 0x37, 0xb0, 0xea, 0x55, 0x9b, 0xfd, 0x36, 0x86, 0xec, 0x6d, 0xd3, 0x76, 0xb8, 0x74, 0x18, 0xe9, 0xd8, - 0x42, 0x55, 0x6f, 0x70, 0x29, 0xda, 0x3c, 0x71, 0xc9, 0x64, 0x69, 0xa4, 0x88, 0x91, 0x92, 0x7a, 0x0d, 0xf6, 0xaf, 0x7a, 0x9b, 0x42, 0xa2, 0xa6, 0x18, 0xba, 0xb1, 0x56, 0xff, 0x54, 0x38, 0x6f, - 0x85, 0xcd, 0x97, 0x4d, 0xc5, 0x75, 0x06, 0x21, 0x58, 0xfd, 0xd0, 0xac, 0xa7, 0xb1, 0x91, 0xd9, 0xd3, 0x3a, 0x93, 0x61, 0x2a, 0x7c, 0xaf, 0x81, 0x2a, 0xc9, 0x17, 0xfc, 0x7a, 0x92, 0xdd, 0x7f, - 0x16, 0x2d, 0x88, 0x0b, 0x5c, 0xe0, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x97, 0xcc, 0x0b, 0x00, 0x53, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x6d, 0x61, 0x6e, - 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x44, 0x8d, 0xb1, 0x6e, 0xc5, 0x20, 0x0c, 0x45, 0x77, 0xbe, 0xe2, 0x4a, 0x6f, 0xe8, 0xc4, 0x7b, 0x7b, 0xc6, 0x0e, 0x5d, 0xfb, 0x0d, - 0x06, 0x1c, 0xe2, 0x86, 0x62, 0x14, 0x8c, 0xfa, 0xfb, 0x15, 0x51, 0xda, 0x8c, 0x5c, 0xce, 0xf1, 0x79, 0xe0, 0xb3, 0x99, 0x68, 0xa5, 0x82, 0x22, 0xdd, 0xa0, 0x2b, 0x28, 0x25, 0xb9, 0xa6, 0xf7, - 0x21, 0x25, 0x35, 0x8a, 0x7b, 0x87, 0x29, 0x02, 0x83, 0x5a, 0x2b, 0xc2, 0x69, 0xbe, 0x6c, 0x63, 0x14, 0xaa, 0x79, 0x50, 0x66, 0x4c, 0xe6, 0xad, 0xbb, 0x07, 0xc2, 0x34, 0xf8, 0x80, 0x7c, 0xcf, - 0xf9, 0x67, 0xe3, 0x7a, 0x82, 0x1f, 0xa3, 0xc6, 0x79, 0x13, 0xd2, 0x4f, 0xc4, 0x30, 0xba, 0xd4, 0x0c, 0xba, 0x13, 0x7f, 0xea, 0xd3, 0x85, 0xff, 0xea, 0xe2, 0x00, 0x8f, 0x46, 0x3b, 0x9b, 0xfa, - 0x7b, 0x7e, 0x65, 0xf5, 0x49, 0xba, 0x9d, 0xbf, 0x79, 0x8b, 0xc7, 0x53, 0xf4, 0x15, 0xb4, 0x6b, 0xf5, 0xed, 0xd0, 0x2f, 0x8e, 0x36, 0x89, 0xf5, 0x6a, 0xde, 0xe2, 0x62, 0xd2, 0xdc, 0x6f, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x70, 0x91, 0x18, 0x39, 0x9a, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, - 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x4c, 0x90, 0xb1, 0x6e, 0xeb, 0x30, 0x0c, 0x45, 0x77, - 0x7d, 0x05, 0x81, 0xb7, 0x24, 0x40, 0x5e, 0x7e, 0xa3, 0x63, 0x87, 0x76, 0x0b, 0x32, 0x08, 0xd2, 0xb5, 0x4d, 0xc4, 0x22, 0x5d, 0x91, 0x4a, 0x9a, 0x7e, 0x7d, 0x21, 0xa7, 0xa9, 0xbb, 0x89, 0x94, - 0x78, 0x78, 0x8f, 0xfe, 0xd1, 0x8b, 0xd2, 0x5b, 0x8a, 0xc3, 0xa0, 0x73, 0x66, 0x19, 0x43, 0x78, 0xad, 0x63, 0x14, 0xfe, 0x42, 0x26, 0x16, 0x57, 0xca, 0x5c, 0x91, 0x5c, 0x2b, 0xc3, 0x28, 0xa9, - 0x0c, 0x5a, 0x0b, 0xcb, 0x48, 0xae, 0xe4, 0x13, 0x48, 0xe2, 0x5a, 0x25, 0x95, 0x2b, 0xc4, 0x59, 0x25, 0x9c, 0x8c, 0x47, 0x89, 0xde, 0x2a, 0xce, 0xff, 0x4f, 0x2c, 0x57, 0x4d, 0xb1, 0xf7, 0xcf, - 0x74, 0x9b, 0x50, 0x41, 0xbf, 0xb7, 0xc4, 0xb6, 0x12, 0x0a, 0x7c, 0xd2, 0xfc, 0xa7, 0x3f, 0x56, 0x6d, 0x0b, 0xe1, 0x73, 0x41, 0x72, 0xe4, 0xb0, 0x33, 0x8f, 0xce, 0xe9, 0x40, 0x2c, 0xe6, 0x51, - 0x12, 0x32, 0xc1, 0xd3, 0x9e, 0xa2, 0xe4, 0x75, 0x7e, 0x5b, 0xf1, 0x24, 0x4e, 0x2c, 0x4e, 0x3a, 0xd0, 0x6d, 0x8a, 0x4e, 0x17, 0x96, 0xdc, 0x8b, 0x8a, 0x8f, 0x06, 0x73, 0x0b, 0xfd, 0xc5, 0xd0, - 0x24, 0xad, 0x13, 0x8f, 0x2d, 0x76, 0x0c, 0xe1, 0x5d, 0x47, 0xf8, 0x84, 0x7a, 0xe8, 0x08, 0x43, 0x37, 0x32, 0x67, 0x6f, 0x0e, 0x8a, 0x94, 0xb4, 0x2c, 0xda, 0x24, 0xd3, 0x52, 0xb9, 0xc4, 0x7a, - 0xa7, 0x0b, 0xee, 0x1d, 0xda, 0x59, 0x7e, 0x5f, 0xd0, 0xcf, 0x0f, 0x8f, 0xb0, 0x79, 0xec, 0xb4, 0x6e, 0x56, 0xb6, 0xff, 0x09, 0x9b, 0xe6, 0x96, 0xfb, 0xd7, 0x96, 0x65, 0x46, 0x81, 0xf8, 0x23, - 0x79, 0x34, 0x6b, 0x05, 0xf6, 0x64, 0xce, 0x2c, 0x17, 0x64, 0x1a, 0xc2, 0xae, 0x19, 0xea, 0x16, 0xd7, 0xb4, 0xd5, 0xd4, 0xb3, 0x65, 0xec, 0x8f, 0xe1, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, - 0x07, 0x08, 0x28, 0x45, 0x34, 0x36, 0x07, 0x01, 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0x07, 0xa1, 0xcc, 0xbc, 0xe2, 0x92, 0xc4, 0xbc, 0xe4, 0xd4, - 0x14, 0xdd, 0xe4, 0x9c, 0xfc, 0xd2, 0x94, 0xd4, 0xb2, 0xd4, 0xbc, 0x12, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x73, 0xf6, 0xdb, 0xf4, 0x1f, 0x00, 0x00, 0x00, 0x1b, 0x00, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x7c, 0x90, 0xbb, 0x12, 0xdb, 0x20, 0x10, 0x45, 0x6b, 0xf3, 0x15, 0x94, 0x71, 0x01, 0x2c, 0x0f, 0x59, 0x76, 0x91, 0xfc, 0x0b, 0x82, - 0x15, 0x21, 0x46, 0xe0, 0x20, 0x50, 0x91, 0xaf, 0xcf, 0x58, 0x99, 0x8c, 0x1f, 0x19, 0x67, 0x29, 0x39, 0x1c, 0xee, 0xdd, 0xa5, 0xf8, 0x9e, 0x90, 0xae, 0x84, 0x54, 0xbc, 0x25, 0xeb, 0x90, 0xce, - 0xf4, 0xeb, 0x37, 0xca, 0xc5, 0x4c, 0x48, 0x28, 0x54, 0x72, 0x79, 0xb9, 0x5f, 0xfd, 0xec, 0xb1, 0x22, 0xfd, 0x42, 0x0e, 0x33, 0xdd, 0x80, 0x03, 0x07, 0x06, 0x00, 0x72, 0x3f, 0xfb, 0x30, 0x78, - 0x1a, 0x72, 0x08, 0xb1, 0x7d, 0xef, 0x13, 0x77, 0x65, 0x11, 0xe9, 0x1a, 0x73, 0x48, 0x36, 0x7b, 0x31, 0xf7, 0xec, 0x58, 0xed, 0xb9, 0xc5, 0x05, 0x57, 0x11, 0xca, 0x5f, 0x93, 0x02, 0xa5, 0xc1, - 0x80, 0x86, 0xc1, 0x8c, 0x66, 0x64, 0xc3, 0x3c, 0xa1, 0x53, 0xa0, 0xa5, 0xf6, 0x03, 0x39, 0xbe, 0x7c, 0xfe, 0xa4, 0x75, 0xa9, 0x74, 0x8f, 0x1b, 0xe6, 0xb6, 0x8a, 0xd5, 0x5f, 0x59, 0x28, 0x62, - 0x53, 0x74, 0x53, 0x5c, 0x6a, 0x0e, 0x54, 0x08, 0x1a, 0xb3, 0x8f, 0x15, 0x5d, 0x7b, 0x79, 0x15, 0x4a, 0x09, 0x09, 0x45, 0xef, 0xd1, 0xd3, 0x4d, 0x72, 0xc9, 0xe5, 0x47, 0xf4, 0xc7, 0x5a, 0x32, - 0x8b, 0x0d, 0xab, 0x6d, 0xa5, 0xee, 0x69, 0x77, 0xfe, 0xb3, 0x7b, 0x29, 0x1e, 0x6b, 0xbe, 0x07, 0x71, 0x25, 0xbb, 0x5e, 0x2b, 0xe6, 0xf6, 0xa8, 0x28, 0xcf, 0xa0, 0xd4, 0x19, 0x4e, 0xd2, 0x0c, - 0x17, 0x86, 0x60, 0xf5, 0xc5, 0x1a, 0x37, 0x19, 0xf5, 0x39, 0xc0, 0xc3, 0x57, 0x71, 0x4e, 0xe8, 0x9a, 0x7a, 0xb1, 0x8d, 0x20, 0x41, 0x69, 0xa3, 0x80, 0x99, 0x69, 0xb4, 0xd6, 0x68, 0x77, 0x1a, - 0x8d, 0x7a, 0xb3, 0x15, 0xde, 0x27, 0xac, 0xbc, 0xd4, 0x20, 0x6c, 0x2b, 0x4b, 0x74, 0xf7, 0x16, 0xe6, 0x9f, 0x05, 0x3d, 0x61, 0x4b, 0x4f, 0x2d, 0x62, 0xad, 0x7f, 0xea, 0xfe, 0x07, 0xfc, 0x65, - 0x6f, 0x3b, 0x03, 0x6f, 0xd0, 0x91, 0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xef, 0x6f, 0x3c, 0x70, 0x22, 0x01, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, - 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, - 0x2e, 0x73, 0x75, 0x6d, 0xac, 0x97, 0xd9, 0xb2, 0xa3, 0x56, 0x93, 0x85, 0xef, 0xff, 0xa7, 0xa8, 0x7b, 0xc5, 0x39, 0xec, 0xbd, 0x99, 0x3b, 0xc2, 0x17, 0x20, 0x01, 0x02, 0x09, 0x24, 0x24, 0x40, - 0x42, 0x77, 0xcc, 0xf3, 0x3c, 0xf3, 0xf4, 0x1d, 0x3a, 0xe5, 0x6e, 0x4b, 0xee, 0xb2, 0xab, 0xa2, 0xed, 0x17, 0xf8, 0xd6, 0xca, 0x9d, 0xc9, 0xca, 0x24, 0x4a, 0xfa, 0x78, 0x70, 0x3f, 0xbd, 0xaa, - 0xc0, 0xbc, 0xbc, 0x1a, 0xfc, 0x60, 0x0c, 0xca, 0xbe, 0xc3, 0x3a, 0x3f, 0xfb, 0x88, 0x2a, 0x6c, 0x44, 0xdf, 0x46, 0xf4, 0x49, 0x7e, 0x02, 0x2c, 0xaa, 0x3e, 0x8b, 0xca, 0xff, 0x16, 0xc3, 0xff, - 0x2a, 0xf3, 0x7b, 0x1c, 0x89, 0x59, 0x08, 0x06, 0xa3, 0xaa, 0xe7, 0xe2, 0x72, 0x77, 0xf2, 0x45, 0x9d, 0xae, 0xe8, 0x28, 0xd1, 0xc0, 0xbb, 0x48, 0xe7, 0x76, 0x5e, 0x8b, 0x54, 0x89, 0xae, 0x12, - 0x30, 0x7f, 0xfb, 0xcf, 0xaf, 0xe0, 0x21, 0xfe, 0x09, 0x9e, 0x60, 0xb4, 0xce, 0xbb, 0x2b, 0x73, 0x59, 0x6c, 0x88, 0x4d, 0xd6, 0xd9, 0x3c, 0x4a, 0x92, 0xeb, 0x47, 0x65, 0x22, 0xdd, 0xaf, 0xeb, - 0xd1, 0xb9, 0x28, 0x56, 0x0e, 0x71, 0x2a, 0x3c, 0xde, 0xa5, 0xce, 0x9e, 0x7e, 0x1d, 0xfc, 0x62, 0x7c, 0xde, 0x15, 0x87, 0x70, 0xd5, 0x52, 0x95, 0x89, 0xf8, 0x31, 0x75, 0x44, 0x26, 0x49, 0xc5, - 0x54, 0x85, 0x96, 0x7d, 0xb2, 0x4c, 0x21, 0x30, 0x43, 0xa7, 0xde, 0xab, 0xe6, 0x1d, 0x1a, 0xa4, 0x51, 0xbd, 0xf3, 0xdb, 0xc0, 0xf1, 0x32, 0xac, 0xee, 0x97, 0x6f, 0x23, 0xfc, 0x84, 0x9f, 0xec, - 0x0b, 0xb3, 0x3a, 0x3c, 0x84, 0x21, 0x10, 0x33, 0x72, 0x7b, 0xd8, 0x8f, 0x72, 0xac, 0x5d, 0x48, 0xd5, 0xcc, 0x12, 0x80, 0xdf, 0xb7, 0x82, 0xb9, 0xd1, 0x29, 0x6b, 0x77, 0x4f, 0xca, 0xc7, 0x20, - 0x29, 0x38, 0x2e, 0xbc, 0x31, 0x7d, 0x67, 0x0c, 0xbc, 0x28, 0xc6, 0xa2, 0xea, 0xa3, 0xab, 0x83, 0xe9, 0x3b, 0xf8, 0xd5, 0xac, 0x42, 0xdb, 0x8c, 0xed, 0xdd, 0x90, 0x96, 0xc4, 0x5d, 0x54, 0x58, - 0x15, 0x56, 0x8c, 0x78, 0xce, 0x4d, 0x39, 0xd6, 0x65, 0x27, 0x8d, 0x48, 0x8e, 0xfb, 0xf4, 0xda, 0xc9, 0x1b, 0x8f, 0xdc, 0xe3, 0xcc, 0xcf, 0xc1, 0xf0, 0x49, 0x1c, 0x53, 0x36, 0xc5, 0x06, 0xe8, - 0x36, 0xe5, 0xb8, 0x15, 0x42, 0xe5, 0x34, 0x99, 0x71, 0x9f, 0x9f, 0xb8, 0x4b, 0xd3, 0xe1, 0x9b, 0x36, 0xdb, 0xdb, 0x36, 0xc4, 0x53, 0xfb, 0x66, 0x98, 0x2c, 0xed, 0xfd, 0x02, 0xf1, 0x5f, 0xb0, - 0x1a, 0x55, 0x55, 0x94, 0x07, 0x4f, 0xae, 0x57, 0xd4, 0xdf, 0x46, 0xf0, 0x9c, 0xb3, 0x27, 0x0f, 0xd3, 0x1d, 0x75, 0xcf, 0xfb, 0x0f, 0x44, 0xf1, 0x3c, 0x7e, 0xbd, 0x76, 0x3d, 0x90, 0xa7, 0x1c, - 0x02, 0xa1, 0xf6, 0x36, 0x73, 0x6c, 0x34, 0x43, 0x55, 0xdc, 0xee, 0xa0, 0x7a, 0x08, 0x3c, 0x35, 0xfd, 0x94, 0xf7, 0x62, 0x73, 0x64, 0x7c, 0xc3, 0x3f, 0xba, 0xaa, 0x84, 0x32, 0xd9, 0xc3, 0x46, - 0x65, 0xcc, 0x37, 0x21, 0x45, 0x5a, 0x08, 0xf9, 0x6e, 0x76, 0x77, 0xab, 0x49, 0xa0, 0xd2, 0xc8, 0xc0, 0x22, 0x8d, 0x9f, 0x85, 0x1f, 0x63, 0xc3, 0x61, 0x5d, 0x9f, 0xd5, 0x83, 0x37, 0xac, 0xcf, - 0xe7, 0x80, 0xaf, 0x6f, 0xd4, 0x68, 0x61, 0x9b, 0xc2, 0x3e, 0x9b, 0xc4, 0xb9, 0xc2, 0xeb, 0xc2, 0x4c, 0xe7, 0x8c, 0x12, 0xf5, 0x73, 0xee, 0xf7, 0x83, 0xec, 0xe7, 0x98, 0x4a, 0x91, 0x42, 0xf4, - 0x23, 0xec, 0x30, 0x24, 0xfe, 0x4b, 0x93, 0xa4, 0xcc, 0xf5, 0xba, 0x18, 0x93, 0xdc, 0xfa, 0xbe, 0xd2, 0xf9, 0x39, 0xec, 0x8f, 0x1c, 0x7e, 0xa6, 0x0c, 0x5b, 0x9d, 0xd2, 0xed, 0xd1, 0x2e, 0x18, - 0x3c, 0x4d, 0x44, 0xfd, 0x21, 0x62, 0x78, 0x64, 0xff, 0x84, 0xf6, 0x62, 0xd1, 0x90, 0x97, 0xf3, 0x23, 0x20, 0xd4, 0xa8, 0x19, 0xc3, 0xc0, 0xde, 0xf1, 0x62, 0xe0, 0xab, 0x95, 0x24, 0xd5, 0xc2, - 0x84, 0x1d, 0x9b, 0x53, 0xe0, 0x9c, 0x8c, 0x4d, 0x19, 0xcf, 0xe6, 0x66, 0xd9, 0xbf, 0x0f, 0x7e, 0xda, 0x55, 0xe5, 0x47, 0xd2, 0x07, 0xad, 0xd3, 0x57, 0x2d, 0x16, 0x55, 0xbf, 0x93, 0xbf, 0x9a, - 0x74, 0x58, 0xa9, 0xed, 0x58, 0x8e, 0x23, 0x9a, 0x24, 0xdf, 0x91, 0x30, 0x8b, 0x59, 0xd4, 0x31, 0xcc, 0x0a, 0x2d, 0xb9, 0x37, 0xac, 0xed, 0xa0, 0x83, 0x39, 0x12, 0x6d, 0x35, 0x28, 0x4a, 0x4b, - 0x31, 0xbf, 0xc4, 0x7c, 0xb1, 0x7b, 0xf0, 0x75, 0x73, 0x3b, 0xd2, 0x6c, 0x81, 0x91, 0xe8, 0x30, 0x86, 0x0c, 0x77, 0x43, 0xe3, 0x01, 0x5a, 0x8c, 0x93, 0xa9, 0x43, 0x06, 0xf5, 0xf4, 0x80, 0x0d, - 0x27, 0x7f, 0x7f, 0x77, 0xb9, 0x8a, 0x78, 0x43, 0x67, 0xed, 0x1f, 0xdf, 0xe8, 0x6b, 0xf9, 0xb5, 0xa8, 0xdb, 0x25, 0x45, 0xdd, 0xf6, 0xed, 0xa9, 0x3e, 0xdb, 0x5a, 0x9e, 0x4e, 0x27, 0xb5, 0xa9, - 0x20, 0x30, 0x32, 0x3b, 0x86, 0xe1, 0x82, 0x7b, 0x76, 0x52, 0xa1, 0x1c, 0x77, 0xb7, 0x9d, 0xfe, 0x67, 0x5e, 0x1f, 0xcc, 0xfd, 0x73, 0x92, 0xde, 0xbf, 0x4d, 0x42, 0x71, 0xc7, 0xcd, 0x4e, 0xb9, - 0xe1, 0xa6, 0x81, 0x1d, 0x93, 0xd3, 0xa4, 0x04, 0xb6, 0x1e, 0xc0, 0x20, 0x6c, 0x7a, 0x73, 0xc6, 0x12, 0x2b, 0x76, 0x0a, 0x8c, 0x18, 0x43, 0x9f, 0x6b, 0x35, 0xf9, 0xaf, 0x80, 0xe8, 0x0d, 0x18, - 0x1c, 0x83, 0x96, 0x46, 0xc8, 0x08, 0xb2, 0x44, 0x1a, 0xd4, 0x2c, 0xf1, 0xd5, 0x79, 0x8b, 0xd5, 0x2a, 0x20, 0xf2, 0x9b, 0x10, 0xb4, 0xce, 0xde, 0x34, 0x0b, 0x7e, 0x62, 0x72, 0x14, 0xb5, 0xef, - 0xa3, 0x99, 0x67, 0x49, 0x19, 0xe5, 0x4e, 0xe9, 0x63, 0xe1, 0x50, 0x7a, 0x1f, 0xed, 0x50, 0xf6, 0x49, 0x11, 0x74, 0x5f, 0xcf, 0x0a, 0x9e, 0x73, 0xfa, 0x81, 0x00, 0xc2, 0x01, 0x01, 0x70, 0x40, - 0x12, 0x34, 0x41, 0x7f, 0x90, 0xa1, 0x1b, 0x78, 0x08, 0xe0, 0x10, 0xf7, 0xc9, 0xa7, 0xf0, 0xe9, 0x28, 0xef, 0xc3, 0xf9, 0x32, 0x38, 0x79, 0xf3, 0x10, 0x7c, 0x2e, 0xeb, 0xc5, 0x78, 0x9f, 0x9b, - 0x40, 0xae, 0x0e, 0x96, 0xd6, 0x68, 0x93, 0xb1, 0x3d, 0xa1, 0x3b, 0x0c, 0xe2, 0x9e, 0x22, 0xa3, 0x7f, 0x4f, 0xf8, 0xa5, 0x70, 0x1c, 0x67, 0xcf, 0x04, 0xef, 0x60, 0x8f, 0x2d, 0x63, 0xce, 0x36, - 0xb3, 0xd8, 0xd5, 0xe6, 0x9e, 0x35, 0xe3, 0x58, 0x8a, 0x9a, 0x1d, 0x1f, 0x7b, 0x0d, 0x71, 0x78, 0x5c, 0x1f, 0x3a, 0xe9, 0x71, 0xe7, 0xde, 0xf4, 0x8b, 0xca, 0x0f, 0xda, 0xf2, 0x99, 0xf4, 0x5e, - 0x55, 0x7a, 0x43, 0xdb, 0x06, 0x65, 0xff, 0x87, 0x32, 0x64, 0x00, 0x42, 0x0c, 0xa0, 0x20, 0x41, 0xb2, 0x1f, 0x01, 0x70, 0x70, 0xd6, 0x21, 0x3c, 0x97, 0x40, 0x5f, 0x5f, 0xd8, 0xa3, 0x09, 0x6c, - 0x2d, 0x36, 0xf1, 0xd3, 0xfe, 0xb8, 0xc7, 0x0b, 0xe9, 0xb0, 0xdf, 0x79, 0xa9, 0x72, 0x11, 0xc5, 0x4b, 0xab, 0x38, 0x54, 0xc0, 0xa9, 0xe4, 0x7e, 0xb3, 0xed, 0x77, 0xfe, 0xa9, 0x3b, 0x7b, 0xff, - 0x86, 0xe4, 0x4b, 0xb1, 0x94, 0xaf, 0x6c, 0x41, 0xc1, 0x9d, 0x89, 0x24, 0xb3, 0x65, 0x77, 0x5c, 0x3c, 0x3a, 0x4c, 0xd2, 0xf4, 0xa6, 0xf8, 0xbe, 0xbe, 0x1c, 0x4b, 0x46, 0x8e, 0x70, 0x85, 0x27, - 0xb7, 0x4d, 0xc5, 0xb3, 0xfa, 0x5f, 0x28, 0xb7, 0x41, 0x98, 0x07, 0x5e, 0x8f, 0xde, 0x74, 0x69, 0x00, 0x01, 0xc2, 0x09, 0x04, 0x3e, 0x08, 0x97, 0x76, 0x1c, 0x02, 0xf7, 0x28, 0x9a, 0x40, 0x4f, - 0x41, 0xa1, 0x73, 0x42, 0x1f, 0x02, 0x82, 0xda, 0x1d, 0x77, 0x3a, 0xb8, 0x41, 0x3b, 0xb5, 0x3b, 0xfe, 0xb6, 0xa9, 0x19, 0x13, 0x0d, 0xf4, 0xb8, 0x46, 0x37, 0x74, 0xd5, 0xad, 0x22, 0xd7, 0x9c, - 0x35, 0xfa, 0xe7, 0x82, 0x2f, 0x85, 0xba, 0x33, 0xca, 0xb5, 0x32, 0x9b, 0xac, 0xed, 0xd0, 0xf0, 0xf2, 0x2c, 0xa6, 0x61, 0x7e, 0x53, 0x6e, 0x4e, 0x79, 0x97, 0x5d, 0xfc, 0x92, 0xe7, 0x85, 0xbb, - 0x5d, 0xf2, 0x45, 0x6d, 0xc7, 0x68, 0x04, 0x6f, 0xba, 0x65, 0x12, 0x14, 0xc1, 0x12, 0xb4, 0x58, 0xdd, 0x06, 0xfd, 0xf3, 0x4b, 0xfe, 0xdf, 0x51, 0x02, 0x00, 0x21, 0x1a, 0x22, 0x82, 0x21, 0xd0, - 0x87, 0x03, 0x41, 0x40, 0x7b, 0x4e, 0x10, 0xfa, 0x4c, 0xf0, 0x22, 0xba, 0xee, 0x60, 0x71, 0x39, 0x1d, 0x39, 0xed, 0xe1, 0xcd, 0xf0, 0x6c, 0x5d, 0xb6, 0x57, 0xd0, 0x64, 0x06, 0x5d, 0x4f, 0xc7, - 0x4c, 0x0a, 0x27, 0xa5, 0x22, 0xd6, 0xd4, 0xd3, 0x30, 0x63, 0xe9, 0xca, 0xf7, 0x90, 0xab, 0xb3, 0x08, 0x0b, 0xda, 0xb6, 0x6a, 0xbb, 0xa7, 0x1e, 0xfb, 0x3d, 0x86, 0x45, 0x81, 0x3f, 0xce, 0x70, - 0xbd, 0x22, 0x48, 0x54, 0x53, 0x9d, 0x2e, 0x74, 0xd3, 0xf1, 0x41, 0x32, 0xbb, 0xe6, 0x25, 0x1b, 0x62, 0x9d, 0x9b, 0xda, 0x03, 0x69, 0x4e, 0x47, 0xc9, 0x98, 0x7a, 0xe2, 0xef, 0x61, 0xaf, 0xaf, - 0x32, 0x39, 0xd3, 0x1c, 0xee, 0x79, 0x51, 0xb3, 0x36, 0x47, 0x14, 0x9b, 0x35, 0x6c, 0xf7, 0xdc, 0x6e, 0x08, 0x2d, 0x5c, 0x56, 0xfb, 0x72, 0x77, 0xf1, 0x43, 0xd8, 0x92, 0x9a, 0xac, 0x09, 0xf9, - 0xfb, 0xab, 0xd4, 0x45, 0xb0, 0x3a, 0xad, 0xff, 0xdc, 0x6b, 0x7e, 0x12, 0x86, 0x79, 0xe2, 0xfe, 0xbe, 0x84, 0xbe, 0xa2, 0x68, 0xc7, 0x4f, 0x3b, 0x01, 0x68, 0xd2, 0xa2, 0x57, 0xfc, 0xde, 0x3d, - 0xea, 0xf6, 0x79, 0xba, 0x9a, 0xe7, 0x6a, 0xab, 0xde, 0x2e, 0x24, 0x2f, 0xac, 0x72, 0x86, 0x85, 0x30, 0x7f, 0xb8, 0x9c, 0xae, 0xfe, 0x1a, 0xf4, 0xc5, 0x70, 0x72, 0xd8, 0xd3, 0x74, 0x56, 0x89, - 0xb1, 0x3d, 0x1b, 0x07, 0x58, 0x7b, 0x97, 0x32, 0x3b, 0x64, 0x4d, 0x68, 0x54, 0x51, 0xe7, 0x46, 0x74, 0xf4, 0xd0, 0x2c, 0x9b, 0xe8, 0x2e, 0x3b, 0xfb, 0x81, 0xbd, 0x3f, 0x42, 0xd7, 0xb7, 0x41, - 0xef, 0xc5, 0x2d, 0x56, 0xb9, 0xe9, 0xfc, 0x7f, 0xd3, 0x73, 0x2f, 0x66, 0x36, 0x0b, 0x29, 0x59, 0xdc, 0xb4, 0x93, 0xbf, 0x0b, 0x55, 0x2e, 0xb3, 0xe8, 0x53, 0x3f, 0x0d, 0x0d, 0x6f, 0xad, 0xad, - 0xc0, 0x48, 0x17, 0x4a, 0x12, 0xe7, 0xcd, 0x24, 0xcc, 0xaa, 0xf0, 0x63, 0x6c, 0x1f, 0x74, 0x7d, 0x12, 0x7e, 0x05, 0xfd, 0xfb, 0x81, 0xa7, 0x92, 0x37, 0x79, 0x61, 0x77, 0x31, 0x82, 0xb2, 0x20, - 0x87, 0xa5, 0xb4, 0x9d, 0xee, 0x92, 0x47, 0xba, 0x8f, 0xf0, 0xa0, 0x29, 0x7d, 0xb8, 0x2f, 0xa0, 0x69, 0x99, 0xd1, 0xa3, 0xdc, 0xb0, 0x82, 0xfc, 0x53, 0x32, 0xf9, 0xd6, 0x3b, 0xf2, 0x86, 0xe6, - 0x1d, 0xbc, 0x74, 0xb5, 0xb0, 0x23, 0x2b, 0xc6, 0xee, 0x6e, 0xfa, 0xdd, 0xda, 0x0e, 0x81, 0x0f, 0xda, 0xf1, 0xaa, 0x6f, 0x0a, 0x63, 0x23, 0x93, 0xde, 0xec, 0x15, 0xea, 0xd8, 0x73, 0x3f, 0x25, - 0x33, 0xdf, 0x3b, 0x57, 0x5f, 0xa3, 0xc4, 0x51, 0x1f, 0xf9, 0x3d, 0xec, 0xf7, 0x75, 0x41, 0x1e, 0x69, 0x0b, 0x6e, 0x5a, 0x8b, 0xdf, 0x70, 0x0f, 0x65, 0xf1, 0x0f, 0x9d, 0x3a, 0x77, 0x3a, 0x2f, - 0x2b, 0x13, 0x71, 0x3e, 0x64, 0x6f, 0xc8, 0xd1, 0xc9, 0x17, 0x27, 0x77, 0x30, 0x77, 0xe9, 0x03, 0x77, 0x08, 0xc3, 0xa0, 0xad, 0xab, 0x2a, 0x7f, 0x19, 0x09, 0xa9, 0xe1, 0x48, 0x63, 0x8b, 0x01, - 0x80, 0xa0, 0x8d, 0xb9, 0xac, 0x28, 0x11, 0xa7, 0x84, 0x55, 0x5b, 0xbc, 0xa1, 0xef, 0xf6, 0x4c, 0x1d, 0xf2, 0x7c, 0x75, 0x26, 0x51, 0x8e, 0x3d, 0xff, 0x3c, 0xfd, 0x3a, 0xf8, 0x35, 0xc6, 0x5c, - 0xde, 0x53, 0xb9, 0x76, 0x5a, 0x14, 0xf2, 0x80, 0x71, 0xc5, 0x36, 0xbb, 0x8d, 0x30, 0xed, 0x69, 0x3a, 0xb3, 0x6e, 0xcb, 0x56, 0xa1, 0xf6, 0xf5, 0x69, 0x10, 0x4a, 0x7a, 0x05, 0xdb, 0xee, 0x19, - 0xa0, 0xd5, 0xe7, 0xe0, 0x06, 0xed, 0x67, 0xd5, 0x46, 0x98, 0xd3, 0x57, 0x45, 0xe2, 0x3d, 0x81, 0xc4, 0x77, 0xa7, 0xde, 0xbc, 0xca, 0x56, 0x25, 0x18, 0x4e, 0xad, 0x0b, 0xcd, 0x2e, 0xd6, 0x07, - 0x5c, 0x0f, 0xcb, 0xf1, 0xce, 0x59, 0x04, 0x97, 0xaf, 0xde, 0x68, 0x6e, 0xe7, 0xcc, 0x32, 0xc5, 0x09, 0xdf, 0x08, 0xe6, 0xdf, 0x90, 0x5e, 0xac, 0x45, 0x3b, 0xb4, 0x0f, 0x2a, 0xef, 0x8e, 0x6f, - 0x16, 0x69, 0xb3, 0x44, 0xc7, 0x87, 0xd7, 0xae, 0xba, 0xe2, 0x34, 0xc5, 0x2d, 0x65, 0x39, 0xb9, 0xa0, 0x4b, 0xc0, 0x4c, 0x39, 0xd6, 0xdc, 0xb0, 0xb3, 0xf0, 0x0e, 0x2c, 0x86, 0xbc, 0x4f, 0x82, - 0xb6, 0xfd, 0xfd, 0x0e, 0xff, 0x1a, 0xd3, 0x4a, 0x28, 0x2e, 0x7b, 0xfd, 0x6c, 0x5d, 0x9b, 0xc1, 0xa5, 0x26, 0xb4, 0x22, 0x1f, 0x09, 0x27, 0xab, 0x43, 0x61, 0xba, 0x88, 0x17, 0x69, 0xa9, 0xc2, - 0xf8, 0x30, 0x2c, 0xbb, 0x06, 0xe8, 0xf2, 0xdf, 0xb2, 0x5e, 0xec, 0x4d, 0x17, 0x32, 0xab, 0xfc, 0x82, 0x13, 0x75, 0x60, 0x1e, 0x18, 0x3d, 0x77, 0xa7, 0x34, 0xbf, 0x6a, 0x0b, 0x78, 0x50, 0x4c, - 0xa4, 0xc4, 0x3b, 0xc5, 0x94, 0xc8, 0x2e, 0xbd, 0xb0, 0x44, 0x83, 0x81, 0x77, 0xe4, 0xea, 0xd4, 0x5f, 0xb4, 0xdf, 0x3b, 0x7c, 0xba, 0xcc, 0x0c, 0x59, 0xba, 0x46, 0x92, 0x6a, 0x2b, 0x93, 0xa7, - 0x6b, 0x39, 0x6e, 0xd5, 0x0b, 0x7c, 0xf0, 0xf2, 0xf9, 0x20, 0x96, 0x78, 0xaa, 0xb7, 0x4e, 0x04, 0xc1, 0x1d, 0x71, 0xdd, 0xa0, 0xfe, 0x25, 0xe7, 0xf5, 0x30, 0x9e, 0x12, 0xec, 0xe1, 0x6c, 0x39, - 0xc7, 0xf4, 0xf8, 0x6c, 0xf1, 0xf6, 0x5d, 0x3e, 0xef, 0x58, 0x1e, 0xad, 0x09, 0x61, 0x1a, 0xf7, 0x58, 0xa4, 0x40, 0x47, 0x5d, 0x6f, 0xf5, 0xb0, 0x13, 0xc1, 0x73, 0x2f, 0x55, 0xb9, 0x53, 0x46, - 0x5f, 0xb4, 0x19, 0xeb, 0x96, 0xd2, 0x7b, 0x59, 0x0d, 0x2c, 0x60, 0x21, 0x84, 0x0c, 0x09, 0x01, 0xf8, 0xf0, 0x7c, 0xd2, 0x67, 0x49, 0x87, 0xc0, 0x1d, 0xea, 0x35, 0xa5, 0x2f, 0xb3, 0x1a, 0x05, - 0x13, 0x69, 0x29, 0xf3, 0x3a, 0x04, 0x24, 0x96, 0x2a, 0x86, 0x40, 0x0e, 0x41, 0x5a, 0xa7, 0x56, 0x7e, 0x0a, 0xb0, 0x64, 0x6d, 0x79, 0x1a, 0x28, 0x55, 0x48, 0x23, 0x47, 0xfd, 0x93, 0xd6, 0xf3, - 0xc0, 0x78, 0xd9, 0x08, 0x10, 0xd0, 0x08, 0x07, 0x38, 0x42, 0x88, 0xfe, 0x80, 0x21, 0x41, 0x7b, 0x0c, 0x05, 0x1d, 0xd6, 0xf1, 0x9e, 0x22, 0xf4, 0x9a, 0xad, 0x34, 0x6f, 0xf6, 0x93, 0x26, 0x8a, - 0x8d, 0x57, 0x4d, 0xca, 0xe6, 0x22, 0x47, 0x03, 0x52, 0x1d, 0x0b, 0x53, 0x9d, 0x5a, 0xb8, 0x64, 0x3b, 0x79, 0xd9, 0x14, 0xd3, 0x79, 0x49, 0xbb, 0x3f, 0x89, 0xcc, 0x7f, 0x84, 0xf7, 0xff, 0xd4, - 0x04, 0x11, 0x20, 0x20, 0x0b, 0x48, 0x9c, 0xfa, 0x60, 0x5d, 0x3f, 0x74, 0xdc, 0x80, 0x62, 0x48, 0x02, 0xff, 0xda, 0xaf, 0x74, 0xb4, 0x61, 0x25, 0xd9, 0x68, 0x00, 0x1d, 0xd7, 0x61, 0x7b, 0x19, - 0x28, 0x4a, 0xb6, 0x76, 0xc1, 0xac, 0x3a, 0x59, 0x38, 0x92, 0x28, 0x38, 0x3e, 0xd0, 0xf6, 0xce, 0xdf, 0x92, 0x43, 0x4b, 0xfc, 0xbf, 0x75, 0x5e, 0xde, 0x4e, 0xc6, 0xc8, 0x95, 0x62, 0x99, 0xae, - 0x64, 0x0f, 0x0e, 0x63, 0x04, 0x8a, 0xc7, 0xaa, 0x87, 0xb6, 0x32, 0xcd, 0xb0, 0xe1, 0x79, 0x67, 0xb8, 0xa5, 0x7a, 0x73, 0x54, 0xd0, 0xe9, 0x1c, 0x16, 0xf6, 0xd7, 0xf8, 0xd4, 0x59, 0xf4, 0x99, - 0x94, 0x98, 0x17, 0x07, 0x5e, 0xf6, 0x39, 0xc2, 0x17, 0x2d, 0x0a, 0x22, 0xc0, 0x40, 0x06, 0xe2, 0x88, 0xfc, 0x40, 0xc0, 0x47, 0x64, 0x80, 0x18, 0x40, 0x80, 0xd7, 0xc3, 0x6c, 0x5b, 0x51, 0x89, - 0x6b, 0x29, 0xdc, 0x5a, 0x72, 0x8e, 0x9c, 0x35, 0x35, 0x13, 0x0f, 0xc6, 0x94, 0x2b, 0xfa, 0xf6, 0x01, 0x20, 0x95, 0x56, 0x21, 0xe6, 0xb9, 0x1a, 0x61, 0xdd, 0x48, 0x7b, 0xfd, 0xb1, 0x16, 0xfc, - 0xd3, 0xe6, 0x26, 0x11, 0x49, 0x7c, 0x30, 0xa1, 0x43, 0x50, 0x2c, 0xa2, 0x43, 0x97, 0x08, 0xff, 0xb1, 0xd6, 0xe2, 0x14, 0xf9, 0xe7, 0xf7, 0xff, 0x7c, 0xf4, 0xf9, 0x7a, 0x7d, 0xc4, 0x32, 0x8b, - 0xdf, 0xf9, 0xa2, 0x31, 0x92, 0x8e, 0x17, 0x55, 0xd3, 0x28, 0x80, 0xcb, 0x88, 0xc5, 0x26, 0x6d, 0xf1, 0x5d, 0x04, 0x35, 0x6d, 0x6e, 0xa6, 0x7a, 0x43, 0x72, 0xd0, 0x92, 0x06, 0xf9, 0xc7, 0xb8, - 0xf7, 0xa5, 0xf2, 0x4f, 0x70, 0xf8, 0xb7, 0x11, 0xff, 0x04, 0xdf, 0x4f, 0x8a, 0x70, 0xb6, 0x0a, 0x4c, 0x5a, 0xb9, 0x55, 0xb8, 0x35, 0xc7, 0xfd, 0x30, 0x7a, 0xbd, 0xcc, 0xc2, 0xc3, 0x95, 0x8d, - 0x63, 0xad, 0x28, 0x6e, 0xa7, 0xea, 0x36, 0x80, 0xbb, 0x61, 0x2b, 0x57, 0x7a, 0xcb, 0xfd, 0xf6, 0x9f, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfb, 0x93, 0x93, 0x55, 0xd3, - 0x08, 0x00, 0x00, 0x96, 0x11, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2b, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x1c, 0xcd, 0xb1, 0x4e, 0xec, 0x30, 0x10, 0x85, 0xe1, 0xda, 0xf3, 0x14, 0x73, 0x5d, 0xd9, 0xd2, - 0xc5, 0x11, 0x2d, 0x68, 0xcb, 0xa5, 0xa4, 0xd9, 0x27, 0x30, 0xce, 0x38, 0x8c, 0xd6, 0x1e, 0x47, 0x93, 0x09, 0x20, 0xa1, 0x7d, 0x77, 0x94, 0xd4, 0xe7, 0x3b, 0xfa, 0xd7, 0x5c, 0xee, 0x79, 0x21, - 0xec, 0x99, 0x05, 0x80, 0xfb, 0x3a, 0xd4, 0x30, 0x80, 0xf3, 0xb5, 0x9b, 0x07, 0xe7, 0xc7, 0xe6, 0x01, 0x5c, 0x21, 0xf4, 0x0b, 0xdb, 0xe7, 0xfe, 0x91, 0xca, 0xe8, 0x53, 0xbb, 0xb3, 0x2c, 0x2d, - 0xcb, 0x3c, 0xd5, 0x5d, 0xca, 0x93, 0xee, 0x62, 0xdc, 0x69, 0x9b, 0x96, 0x31, 0x95, 0x36, 0xf6, 0x99, 0xbe, 0x48, 0xec, 0x3c, 0x56, 0xf4, 0xd5, 0x43, 0x04, 0x38, 0xe0, 0x19, 0x09, 0x11, 0x7f, - 0xc1, 0x71, 0x45, 0x52, 0xc5, 0x97, 0x0b, 0x16, 0x4a, 0x37, 0xcb, 0x6a, 0xa1, 0xa6, 0x77, 0xfa, 0x0e, 0x31, 0xbe, 0x9e, 0xcb, 0xbf, 0x0b, 0x0a, 0xb7, 0x83, 0xba, 0xda, 0x2d, 0xbd, 0xad, 0xca, - 0x62, 0x4d, 0xc2, 0xd8, 0xd2, 0xcd, 0x66, 0x52, 0xfd, 0x7f, 0xb0, 0x74, 0x55, 0x1d, 0x1a, 0x62, 0x04, 0xe7, 0xc6, 0x96, 0xae, 0x3f, 0x6c, 0xe1, 0x39, 0x82, 0x7b, 0xc0, 0x03, 0xfe, 0x02, 0x00, - 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf4, 0x75, 0x3a, 0x5a, 0xb3, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0x07, 0xa1, 0xcc, 0xbc, 0xe2, 0x92, 0xc4, 0xbc, 0xe4, 0xd4, 0x14, 0xdd, 0x8c, 0x92, 0x92, 0x02, 0x40, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xeb, 0x1c, 0x44, 0x4e, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, - 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x4c, 0x8c, 0x4b, 0xce, 0xc2, 0x20, 0x18, 0x45, 0xe7, - 0xac, 0x82, 0x0d, 0x00, 0x97, 0x47, 0x93, 0xbf, 0x83, 0xdf, 0xbd, 0x54, 0x0a, 0x48, 0xe4, 0xa1, 0xb4, 0x9f, 0xeb, 0x37, 0x6d, 0x62, 0xf4, 0xdc, 0xe1, 0xb9, 0x39, 0xb5, 0xaf, 0x54, 0x02, 0xdf, - 0x18, 0x1b, 0xe1, 0x51, 0x16, 0x1f, 0x78, 0xe4, 0xff, 0x17, 0x2e, 0x55, 0x64, 0x2c, 0x75, 0xae, 0xa5, 0x9e, 0x0f, 0xf5, 0xa4, 0x3c, 0x0e, 0xf5, 0x82, 0x84, 0x84, 0x00, 0xa0, 0xcf, 0x9d, 0x08, - 0xfc, 0xf0, 0x7d, 0xa7, 0xbc, 0xdf, 0xe8, 0x2a, 0x7d, 0xaf, 0xaa, 0xdc, 0x73, 0x4b, 0x65, 0x69, 0xab, 0x8a, 0xd4, 0xbc, 0x18, 0xd4, 0xf6, 0x5c, 0xc3, 0xa6, 0x52, 0xff, 0x14, 0x0d, 0x8c, 0x85, - 0x83, 0xd3, 0x7a, 0x9a, 0xdc, 0x2c, 0x62, 0x30, 0xd6, 0xd9, 0x3f, 0x63, 0xbc, 0xf5, 0xec, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x0f, 0xc9, 0xa2, 0x64, 0x7d, 0x00, 0x00, 0x00, - 0xa4, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, - 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0xac, 0xd1, 0xcb, 0x6e, 0xa2, 0x50, 0x00, 0x80, 0xe1, 0xfd, 0x3c, 0x45, 0xf7, 0x06, 0xcf, 0x15, 0xe5, 0x4c, 0x32, 0x0b, 0x6b, 0x29, 0xd3, 0x82, 0xa8, 0x14, - 0x0c, 0xb0, 0x83, 0x03, 0x1c, 0x28, 0x97, 0x43, 0xe5, 0x6a, 0x9f, 0x7e, 0xe2, 0x6e, 0x16, 0x5d, 0x11, 0x9f, 0xe0, 0xcb, 0x9f, 0x5f, 0x14, 0x7d, 0x3e, 0xc4, 0x6b, 0x2e, 0x6b, 0x50, 0x95, 0x45, - 0x23, 0xaa, 0xa8, 0x49, 0x40, 0x36, 0x34, 0x5c, 0xb9, 0x0e, 0x4d, 0x5f, 0xd4, 0x69, 0x07, 0x84, 0x7c, 0x1a, 0xe1, 0x1a, 0xae, 0xa1, 0x82, 0x21, 0x26, 0x90, 0x10, 0x04, 0x31, 0xa2, 0x64, 0xab, - 0x44, 0x1a, 0x57, 0xe3, 0x2c, 0x4e, 0xb7, 0x2a, 0x8f, 0x9f, 0x72, 0xf4, 0x5b, 0x5e, 0x2b, 0x77, 0x9e, 0x6f, 0x17, 0xf4, 0xcc, 0xcc, 0x69, 0xea, 0x0f, 0xf9, 0x5f, 0xe7, 0xd3, 0x38, 0xb5, 0xd7, - 0x9e, 0x51, 0x52, 0x38, 0x89, 0x31, 0xcc, 0xc6, 0x8a, 0x41, 0x8f, 0xf4, 0xd1, 0xdb, 0x9f, 0x5f, 0x8f, 0x82, 0x81, 0x90, 0xeb, 0x5a, 0x26, 0x77, 0x5f, 0xb7, 0x6c, 0xda, 0xb6, 0x51, 0x77, 0x71, - 0xbf, 0xb4, 0xd5, 0x34, 0xbe, 0x6c, 0xf8, 0x2c, 0x04, 0x2c, 0xd8, 0xae, 0xca, 0x0e, 0xf4, 0x78, 0x30, 0x3f, 0x61, 0xbf, 0x2f, 0xeb, 0xe4, 0xe8, 0x87, 0x62, 0xa9, 0xbf, 0xc1, 0x10, 0xa9, 0x0a, - 0xc2, 0x1a, 0xcd, 0x18, 0x83, 0x29, 0xe2, 0xd9, 0x1d, 0x76, 0x3d, 0x5d, 0x0e, 0x22, 0xb2, 0x43, 0xea, 0x9d, 0xdd, 0xf6, 0xfc, 0x01, 0x8c, 0xe9, 0x9d, 0x80, 0xd3, 0xc5, 0xd7, 0xca, 0xb0, 0xee, - 0x12, 0x66, 0x5a, 0x65, 0x8a, 0x5f, 0x12, 0x5d, 0x1c, 0xcb, 0xc7, 0xc1, 0xff, 0x85, 0x13, 0xc2, 0x4e, 0xf4, 0x39, 0x02, 0xe1, 0x5e, 0xf3, 0xe6, 0x40, 0xbb, 0x05, 0x72, 0xe5, 0x97, 0x5f, 0xe3, - 0xd8, 0xbc, 0xda, 0x41, 0x6e, 0xf5, 0x36, 0xde, 0x91, 0xbc, 0x35, 0x3b, 0x23, 0xf4, 0x77, 0x4b, 0x7c, 0x0a, 0x29, 0x42, 0xaa, 0x4a, 0x99, 0x92, 0xa5, 0x98, 0x50, 0xa2, 0x61, 0xcc, 0x09, 0xbf, - 0xc3, 0x4e, 0x7a, 0xde, 0x6f, 0x5e, 0x8d, 0x18, 0x38, 0x73, 0xb0, 0xdd, 0xdf, 0x2c, 0x60, 0xfb, 0xa8, 0x92, 0xfe, 0xf6, 0x1b, 0x54, 0xdd, 0x7b, 0x18, 0x90, 0x7a, 0x68, 0x3e, 0xfc, 0x6f, 0x5d, - 0xaf, 0xdf, 0x16, 0x1d, 0xff, 0x19, 0x5e, 0x1a, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x97, 0x5a, 0x0e, 0x5b, 0x48, 0x01, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, - 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, - 0x6f, 0x1c, 0xcc, 0x31, 0x6e, 0xc3, 0x30, 0x0c, 0x40, 0xd1, 0x99, 0x3c, 0x05, 0xab, 0x49, 0x02, 0x5a, 0x19, 0x5d, 0x5b, 0x64, 0x4c, 0xc7, 0x2e, 0x39, 0x81, 0xea, 0x48, 0x0e, 0x11, 0x8b, 0x32, - 0x28, 0x1a, 0x2d, 0x50, 0xe4, 0xee, 0x81, 0x3c, 0xff, 0x87, 0xbf, 0xa5, 0xf9, 0x9e, 0x96, 0x4c, 0x35, 0xb1, 0x20, 0x72, 0xdd, 0x9a, 0x1a, 0x79, 0x04, 0x57, 0xaa, 0x39, 0x04, 0xd7, 0xba, 0x43, - 0x04, 0xb7, 0xb0, 0xdd, 0xf6, 0x9f, 0x38, 0xb7, 0x3a, 0xad, 0x77, 0x96, 0x65, 0x4d, 0x72, 0x9d, 0xca, 0x2e, 0xf3, 0x9b, 0xee, 0x62, 0x5c, 0x73, 0x9f, 0x96, 0x36, 0xdd, 0xcc, 0xb6, 0xc1, 0x0b, - 0xb9, 0xe2, 0x30, 0x20, 0x0e, 0x71, 0xac, 0x7d, 0xa0, 0x7f, 0x04, 0x2e, 0x94, 0x55, 0xe9, 0xe3, 0x44, 0x43, 0xc6, 0x8b, 0x25, 0x35, 0x5f, 0xe2, 0x77, 0xfe, 0xf5, 0x21, 0x7c, 0x1e, 0xed, 0xe5, - 0x44, 0xc2, 0xeb, 0xc0, 0x50, 0xaa, 0xc5, 0xaf, 0x4d, 0x59, 0x6c, 0x15, 0xdf, 0x7a, 0xbc, 0xd8, 0x35, 0xab, 0xbe, 0x0e, 0x16, 0xcf, 0xaa, 0x4d, 0x7d, 0x08, 0x08, 0xd0, 0x7a, 0x3c, 0xff, 0xb1, - 0xf9, 0xf7, 0x80, 0xf0, 0xc0, 0x07, 0x3e, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa9, 0xe5, 0x9d, 0xa9, 0xab, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, - 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, - 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0xd7, 0xd3, - 0xd3, 0x4f, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, 0xcd, 0x2b, 0x29, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc9, 0x3e, 0x61, 0x90, 0x17, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 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, 0x23, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0xd7, 0xd3, 0xd3, 0x4f, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, 0xcd, 0x2b, 0x29, 0x06, 0x04, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc9, 0x3e, 0x61, 0x90, 0x17, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x8c, 0x90, 0xcb, 0x6e, 0xc3, 0x20, 0x10, + 0x45, 0xd7, 0xe1, 0x2b, 0x58, 0x36, 0x0b, 0x86, 0x47, 0xa2, 0x34, 0x59, 0xb4, 0xff, 0x82, 0x61, 0x4c, 0x69, 0x6c, 0x26, 0x1d, 0x83, 0x55, 0xf5, 0xeb, 0x2b, 0x47, 0xaa, 0xe4, 0xa4, 0xea, 0x63, + 0x58, 0x72, 0xee, 0xd5, 0x99, 0x19, 0x29, 0xb6, 0x01, 0xe5, 0x24, 0x04, 0xe3, 0x65, 0xf0, 0x01, 0x65, 0x2f, 0x9f, 0x9e, 0x25, 0xe8, 0x5e, 0x88, 0x44, 0xd2, 0x82, 0x3d, 0x2d, 0x5f, 0x6f, 0x2d, + 0x33, 0xca, 0x07, 0xb1, 0xe9, 0xe5, 0x6c, 0xc0, 0x80, 0x51, 0xc6, 0x18, 0x7b, 0x7d, 0xd7, 0x51, 0x66, 0x35, 0x62, 0x93, 0x72, 0x7d, 0x69, 0x1d, 0x04, 0x1a, 0xf5, 0xb9, 0xf8, 0x9a, 0x67, 0x54, + 0x93, 0x2f, 0xb1, 0xa3, 0x77, 0xdd, 0xb7, 0x12, 0x54, 0xa2, 0xa5, 0xc6, 0x1e, 0xc1, 0x89, 0xed, 0x4d, 0xfd, 0x2a, 0x18, 0x06, 0x6a, 0x11, 0x67, 0x2c, 0x75, 0xd2, 0x53, 0x3c, 0xab, 0x44, 0x7a, + 0x76, 0x72, 0x76, 0x60, 0xf7, 0x60, 0xa4, 0xd6, 0x32, 0x97, 0x98, 0x19, 0x43, 0xbd, 0x49, 0x25, 0xa2, 0x34, 0xa0, 0x6e, 0x2d, 0x47, 0x39, 0x5b, 0xd8, 0xfd, 0x82, 0xbe, 0x4e, 0x54, 0x54, 0xae, + 0xc8, 0xbe, 0x12, 0xeb, 0x45, 0xc9, 0x82, 0x05, 0xeb, 0x7e, 0x0c, 0x8c, 0x14, 0x91, 0xcb, 0x22, 0x12, 0xa8, 0x84, 0xc6, 0x8c, 0xa5, 0x7e, 0x9d, 0xc3, 0x19, 0x7b, 0x34, 0x3b, 0x73, 0x30, 0xd6, + 0x1d, 0xf6, 0x7b, 0xd5, 0xf9, 0x10, 0x4f, 0xe1, 0x11, 0x7b, 0x1b, 0xe3, 0x3f, 0xfa, 0x18, 0xfb, 0x01, 0x43, 0x75, 0x8b, 0x82, 0x81, 0x7b, 0x03, 0x82, 0xd6, 0x21, 0x03, 0x71, 0xd2, 0xbe, 0xd2, + 0x98, 0xc3, 0xd5, 0xd4, 0x7e, 0x5b, 0x6d, 0xc5, 0x8d, 0x6d, 0xa8, 0x19, 0x99, 0xff, 0x26, 0x3f, 0xfc, 0x65, 0x81, 0xdc, 0xfd, 0x51, 0xb7, 0xe2, 0x33, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0xf4, 0xb0, 0xa9, 0x9c, 0x04, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0xac, 0x98, 0xd9, 0xd2, 0xda, 0x48, 0xf6, 0xed, 0xef, 0xfb, 0x29, 0x7c, 0x4f, + 0x7c, 0x9f, 0x32, 0x53, 0xf3, 0x89, 0xe8, 0x0b, 0x04, 0x02, 0x24, 0x24, 0x40, 0xa0, 0x01, 0xb8, 0xd3, 0x90, 0x12, 0x1a, 0x53, 0xf3, 0xf4, 0xf4, 0x27, 0xb0, 0xdd, 0xd1, 0x50, 0xe5, 0x2a, 0xbb, + 0xfe, 0xed, 0x17, 0xf8, 0xad, 0x95, 0x6b, 0x67, 0xee, 0xbd, 0xa5, 0x28, 0x6e, 0x1f, 0x9d, 0xf7, 0xe9, 0x93, 0x9c, 0xf2, 0x70, 0xe1, 0x25, 0xe4, 0x51, 0x34, 0xa4, 0xa0, 0xfc, 0x8c, 0xf8, 0xe9, + 0x97, 0x1e, 0x7e, 0xc2, 0x4f, 0xf0, 0xe5, 0x01, 0xff, 0x9f, 0x21, 0xa2, 0xb4, 0x6b, 0xce, 0xd5, 0x0a, 0x5e, 0x6d, 0xa4, 0x27, 0xa9, 0x23, 0x9b, 0xa7, 0x3e, 0x51, 0xed, 0x6a, 0x8f, 0xdb, 0x19, + 0x1e, 0xe7, 0xf1, 0x2e, 0xf1, 0xf9, 0x4e, 0xd5, 0x92, 0x4e, 0xf8, 0xf7, 0xbf, 0x5e, 0x98, 0x7e, 0x46, 0xba, 0x00, 0xf7, 0xb8, 0x68, 0x1b, 0xaa, 0x09, 0xd2, 0x8f, 0x88, 0x50, 0x3d, 0xfa, 0xd2, + 0xa3, 0x4f, 0xf6, 0x13, 0x50, 0x11, 0xf9, 0xcc, 0x49, 0xf0, 0xc4, 0x17, 0xd9, 0xf5, 0x11, 0x6d, 0xd2, 0x10, 0x74, 0x26, 0x29, 0xc7, 0xfc, 0x7c, 0x75, 0xb3, 0x49, 0x1f, 0x2e, 0x48, 0xdb, 0xf2, + 0xc0, 0x3f, 0x6f, 0x4f, 0xf5, 0x38, 0xe7, 0x89, 0x1a, 0x5d, 0xb6, 0xc0, 0xfa, 0x35, 0x3c, 0x64, 0xbe, 0xf9, 0x3e, 0xd4, 0xc4, 0x63, 0x36, 0x83, 0x1d, 0xc5, 0xac, 0xc6, 0xb4, 0xb6, 0x98, 0x3d, + 0x92, 0xf9, 0xee, 0x27, 0xb7, 0x6a, 0x63, 0x4f, 0xea, 0xdc, 0x2c, 0x59, 0x6e, 0x35, 0x9c, 0xdc, 0x53, 0xd8, 0x73, 0xcd, 0xaf, 0x83, 0x5f, 0x8c, 0x8f, 0xeb, 0x7c, 0x1f, 0xce, 0x87, 0x44, 0x17, + 0x22, 0xa9, 0x4f, 0xdc, 0x8d, 0x10, 0x27, 0x9b, 0x44, 0x87, 0xf6, 0xed, 0x68, 0x5b, 0x32, 0xb6, 0x42, 0xb7, 0xdc, 0xe9, 0xd6, 0x15, 0x9a, 0xac, 0x49, 0xde, 0xf9, 0x35, 0x76, 0xfd, 0x94, 0x2a, + 0xdb, 0xe9, 0x5b, 0xc8, 0xe2, 0x0b, 0x93, 0xec, 0xef, 0x72, 0x87, 0x37, 0x29, 0xbb, 0xda, 0xef, 0x7a, 0xe5, 0x71, 0x38, 0xb3, 0xba, 0x95, 0xc6, 0x80, 0xbe, 0xae, 0x64, 0x6b, 0x61, 0x70, 0xf6, + 0xfa, 0x1a, 0x17, 0xf7, 0x6e, 0xab, 0xd2, 0xb4, 0xfc, 0xc6, 0x0c, 0xdc, 0x1e, 0xfb, 0xd1, 0x83, 0x8a, 0xc8, 0x47, 0x53, 0xe2, 0xe1, 0x7b, 0xf5, 0x5e, 0xc0, 0x2a, 0x7f, 0x13, 0x6e, 0xbe, 0x83, + 0x0e, 0xf1, 0xa3, 0x89, 0x72, 0x9b, 0x50, 0x79, 0x4f, 0x67, 0xcb, 0x21, 0xa3, 0x9a, 0xf4, 0x78, 0x60, 0x62, 0x6d, 0x97, 0x5c, 0x1a, 0x65, 0xe1, 0xb3, 0x3b, 0x5a, 0xf8, 0x39, 0x18, 0x3e, 0x89, + 0x7d, 0x22, 0x26, 0x54, 0x07, 0xbd, 0xaa, 0xe8, 0x57, 0x72, 0xa8, 0x1e, 0x07, 0xeb, 0xd1, 0x66, 0xc7, 0xe5, 0xb9, 0x6a, 0xe8, 0x45, 0x9d, 0xee, 0x6e, 0x37, 0x48, 0x27, 0x37, 0xc7, 0xb4, 0x44, + 0xde, 0xff, 0x05, 0xe2, 0x6f, 0xb0, 0x1a, 0x11, 0x12, 0x65, 0xf8, 0xc9, 0xf5, 0xf3, 0xf2, 0x4b, 0x0f, 0x9e, 0xf7, 0xec, 0xc9, 0xa3, 0x0c, 0x57, 0xdf, 0x49, 0xc1, 0x1d, 0x71, 0x92, 0x44, 0x5f, + 0x2e, 0x4d, 0x0b, 0x94, 0x21, 0x83, 0x40, 0x2e, 0xfd, 0xc5, 0xf8, 0x30, 0xab, 0x8e, 0xe4, 0xce, 0x15, 0x90, 0xbb, 0x2c, 0x71, 0xc3, 0x4f, 0x79, 0x2f, 0x36, 0x7b, 0x21, 0x30, 0x03, 0xcd, 0xd3, + 0xb7, 0x28, 0x55, 0x7c, 0xaa, 0x57, 0xfb, 0x6c, 0x11, 0x72, 0xac, 0x8d, 0x50, 0xe0, 0xa5, 0x57, 0x8f, 0x0c, 0x32, 0x97, 0x44, 0x26, 0x15, 0x1d, 0xa4, 0x51, 0xfe, 0x31, 0x36, 0xec, 0xe6, 0xf9, + 0x79, 0x7a, 0xf0, 0x86, 0x0d, 0xa4, 0x0c, 0x48, 0xa5, 0xc3, 0xf5, 0x36, 0xb5, 0xc8, 0x6f, 0x27, 0x8b, 0x39, 0x11, 0xba, 0xcc, 0xad, 0x64, 0x4c, 0xb9, 0x8d, 0x71, 0xca, 0x82, 0xb6, 0x53, 0x82, + 0x8c, 0xd2, 0x39, 0x56, 0x8e, 0x7e, 0x84, 0xed, 0xba, 0x38, 0xf8, 0x73, 0xa4, 0xa6, 0x32, 0x9d, 0xee, 0x98, 0xd1, 0xa3, 0xaa, 0x0f, 0xf1, 0x6d, 0x2d, 0x6d, 0x70, 0xa0, 0x93, 0xed, 0xb6, 0x94, + 0x07, 0x4a, 0xab, 0x8e, 0xd8, 0x3d, 0x9a, 0x8b, 0xe2, 0x31, 0x5a, 0x8b, 0x69, 0x47, 0xfe, 0x0e, 0x4a, 0x7f, 0x0b, 0xb4, 0xe5, 0xd4, 0xf8, 0x1a, 0xe5, 0xc3, 0x55, 0x4f, 0xe4, 0x46, 0xb0, 0xbb, + 0xe6, 0xaa, 0xa8, 0x29, 0x92, 0xae, 0xbb, 0xa6, 0x58, 0x0c, 0xa3, 0x20, 0xdd, 0x03, 0xd3, 0x25, 0x77, 0x36, 0xec, 0x78, 0xe5, 0x27, 0xb4, 0xdf, 0x60, 0x31, 0x69, 0x48, 0xf1, 0x11, 0xb7, 0xb8, + 0x76, 0x5b, 0x52, 0x53, 0x11, 0xf9, 0x7e, 0xf8, 0x57, 0xf4, 0x3e, 0x30, 0xac, 0x55, 0xcf, 0x8b, 0x39, 0xc5, 0xa2, 0x7d, 0x1f, 0x0a, 0x4b, 0x07, 0xf5, 0x7b, 0x68, 0x0b, 0x6e, 0xaa, 0x77, 0x29, + 0x34, 0x92, 0x3d, 0xd5, 0x1d, 0x83, 0xdd, 0xd5, 0x5b, 0x12, 0xe6, 0x57, 0xd0, 0xe8, 0xc9, 0x3c, 0xd9, 0x42, 0x89, 0x15, 0xc6, 0x05, 0x53, 0x53, 0xf8, 0x73, 0x1d, 0x2d, 0xb4, 0x76, 0x9c, 0xd2, + 0xb5, 0xa0, 0x85, 0xfb, 0x9b, 0xa8, 0x6b, 0x5c, 0x87, 0x92, 0x62, 0x74, 0xe5, 0xa2, 0x2e, 0xf4, 0x5f, 0x62, 0xbe, 0xd8, 0xc5, 0x34, 0xd0, 0x2e, 0xd5, 0x40, 0xc8, 0xdd, 0xc5, 0x94, 0x35, 0x64, + 0xb2, 0x77, 0x46, 0x02, 0x8b, 0xb6, 0x81, 0xf0, 0x48, 0x8c, 0x5e, 0x25, 0xbb, 0xdc, 0x64, 0xcc, 0xe2, 0x71, 0xd8, 0x4a, 0xef, 0x49, 0xa4, 0x85, 0xdb, 0xc6, 0x3d, 0xfe, 0x68, 0xdc, 0x22, 0xf0, + 0xc8, 0x48, 0x85, 0x5d, 0xe1, 0x7f, 0x3c, 0x15, 0xc0, 0x27, 0x14, 0xbe, 0xbd, 0xd9, 0x53, 0x7a, 0x6c, 0x9c, 0x3c, 0xc2, 0xa1, 0x02, 0x69, 0x90, 0xab, 0x52, 0x4e, 0xe6, 0x4d, 0xea, 0x16, 0x52, + 0xbe, 0xdb, 0xb6, 0x50, 0x76, 0x73, 0x6e, 0x35, 0x5e, 0x0f, 0xcc, 0xb6, 0x56, 0x72, 0xe3, 0x9f, 0xa0, 0x5f, 0xcc, 0x1b, 0xeb, 0x7d, 0x58, 0x71, 0x12, 0x69, 0xf5, 0x54, 0xd3, 0xa8, 0xbc, 0x2c, + 0x03, 0x3b, 0x1c, 0xb6, 0xc5, 0x7d, 0xbe, 0xcf, 0xcc, 0xa6, 0x1f, 0xc3, 0xf9, 0x52, 0xa9, 0x2e, 0x03, 0x99, 0x46, 0x62, 0xfe, 0x81, 0xc2, 0xd7, 0xc8, 0xbb, 0x61, 0x5b, 0x97, 0x9b, 0xab, 0xef, + 0x3f, 0xe4, 0x36, 0xac, 0xd1, 0x4a, 0xdb, 0x29, 0xd7, 0xdb, 0xae, 0xa8, 0x07, 0xba, 0x57, 0xa6, 0x9d, 0x93, 0x28, 0x0d, 0x65, 0x5c, 0xae, 0x68, 0x1e, 0x3c, 0xff, 0x9f, 0xa0, 0x7f, 0x87, 0xf9, + 0xfa, 0xbf, 0xdd, 0xfc, 0x35, 0x8c, 0x72, 0x63, 0xdc, 0x0a, 0x8e, 0x73, 0x76, 0xf5, 0xb1, 0x3c, 0xdd, 0x0e, 0x59, 0x32, 0x1c, 0xf5, 0x8a, 0x40, 0x60, 0xa6, 0xb7, 0x07, 0x0c, 0x27, 0xda, 0xbf, + 0xc5, 0x04, 0x65, 0xb4, 0xb7, 0x6a, 0x8c, 0x3f, 0xf2, 0x5a, 0x3c, 0xb6, 0x5f, 0x1d, 0xbe, 0x3d, 0x12, 0x46, 0xf5, 0xfa, 0xc5, 0x5a, 0x75, 0x68, 0xcb, 0xa4, 0xb4, 0xf8, 0x38, 0xa8, 0xf8, 0x66, + 0x60, 0x88, 0xc3, 0xaa, 0xb5, 0x46, 0x2a, 0xb6, 0x1f, 0x6e, 0x4e, 0x31, 0x7d, 0x18, 0x2c, 0xeb, 0x83, 0xf2, 0x57, 0x40, 0xf4, 0x06, 0xc4, 0x1a, 0xae, 0x79, 0x84, 0x4c, 0x9c, 0xc6, 0xdb, 0x4e, + 0x4f, 0xe3, 0x40, 0x1f, 0x57, 0x54, 0xa9, 0x03, 0x26, 0x73, 0x64, 0x5c, 0xbb, 0x3b, 0xcb, 0xca, 0xa5, 0x41, 0xc8, 0x50, 0x54, 0xbf, 0x37, 0xb1, 0x9c, 0x04, 0xb8, 0x2e, 0x9e, 0xa3, 0xd1, 0x27, + 0x85, 0xdf, 0xd5, 0x35, 0x2e, 0xbe, 0xd2, 0xc1, 0x27, 0xf8, 0x40, 0x00, 0x0a, 0x00, 0x21, 0x01, 0x70, 0x90, 0x61, 0xc5, 0x0f, 0x0c, 0x5c, 0x5a, 0x74, 0x19, 0xdf, 0x63, 0xd0, 0x6b, 0x36, 0x5c, + 0xa0, 0xae, 0x40, 0xbe, 0x3c, 0x31, 0x71, 0x7a, 0x53, 0xbc, 0x7e, 0xf2, 0xf9, 0x30, 0x4e, 0x12, 0x47, 0x0d, 0x02, 0x63, 0xd2, 0x0a, 0x41, 0x89, 0x68, 0x55, 0x62, 0x57, 0x15, 0x91, 0x44, 0xe3, + 0x9f, 0x29, 0xd3, 0x80, 0x03, 0x10, 0x71, 0x0c, 0xf3, 0xe1, 0xb9, 0x7e, 0x20, 0xfa, 0x3c, 0x0e, 0x61, 0xf0, 0xad, 0xc5, 0x9c, 0x35, 0xf7, 0x2e, 0xfa, 0x6b, 0x6a, 0x10, 0x4e, 0xf6, 0x43, 0xa4, + 0x8b, 0xe6, 0x74, 0x75, 0xa1, 0x5d, 0x1b, 0x5c, 0x92, 0x0d, 0x1a, 0x4b, 0x0e, 0x42, 0x06, 0x19, 0x23, 0xf3, 0x0f, 0x61, 0xf4, 0x3b, 0x24, 0x7f, 0xeb, 0x61, 0x6b, 0x1c, 0x66, 0xd8, 0x6f, 0xd1, + 0x9b, 0x2e, 0x0f, 0x20, 0x40, 0x34, 0x83, 0xc0, 0x07, 0xe3, 0xf1, 0xae, 0xcb, 0xd0, 0x3e, 0xc7, 0x33, 0xaf, 0x17, 0xda, 0x1b, 0x51, 0x76, 0x28, 0xd2, 0xc1, 0x5e, 0x75, 0x95, 0xa4, 0x8c, 0x9b, + 0x24, 0xcc, 0x1c, 0xd5, 0x71, 0x8b, 0xab, 0xe2, 0xd1, 0xe7, 0x2c, 0xcb, 0xbd, 0xd5, 0x94, 0x4d, 0x7a, 0xdd, 0x47, 0x3d, 0xf8, 0xa9, 0xee, 0x73, 0x50, 0x7d, 0x7d, 0x87, 0xa3, 0xe4, 0x46, 0x44, + 0x6b, 0x37, 0x8d, 0xc8, 0xac, 0xa4, 0xa2, 0x1d, 0xb3, 0x6e, 0x8f, 0x5d, 0x27, 0x32, 0xf5, 0xb2, 0xd7, 0xc6, 0x15, 0xd3, 0xd5, 0x74, 0xa1, 0xbb, 0x2b, 0x71, 0x3b, 0x03, 0xfd, 0xd7, 0xa0, 0x2f, + 0x86, 0x27, 0xa7, 0xc3, 0x7d, 0x11, 0xe9, 0x47, 0xb5, 0x5c, 0x4d, 0x2c, 0xda, 0x38, 0x8e, 0xde, 0x5b, 0x2b, 0x61, 0x68, 0xf8, 0x9c, 0xd2, 0xd4, 0x26, 0xb9, 0xcd, 0x6b, 0x17, 0x50, 0xb5, 0x90, + 0x75, 0xe9, 0x1b, 0xbb, 0x88, 0x71, 0x8e, 0x27, 0x5c, 0x53, 0x65, 0x8d, 0xdb, 0xe7, 0x53, 0xfc, 0x4f, 0x4a, 0x08, 0x00, 0x84, 0x78, 0x88, 0x18, 0x81, 0x41, 0x1f, 0x2e, 0x04, 0x98, 0xf7, 0x5d, + 0x1c, 0x06, 0x02, 0x7e, 0x11, 0x9d, 0xd7, 0x30, 0x3f, 0x1f, 0xb5, 0xe5, 0xe1, 0xee, 0x8f, 0xf0, 0x64, 0x9f, 0x57, 0x17, 0x50, 0xa5, 0x26, 0x5f, 0x0e, 0x5a, 0xba, 0x0d, 0x07, 0x95, 0x30, 0x73, + 0xe2, 0x1f, 0x28, 0x73, 0x6a, 0x8a, 0xf7, 0x86, 0x5b, 0xa6, 0x11, 0x85, 0xeb, 0x9a, 0xd4, 0xcd, 0x53, 0x4f, 0xfc, 0xd6, 0x62, 0x37, 0xb2, 0xa4, 0x8d, 0x70, 0xbe, 0x20, 0xc8, 0x90, 0xa1, 0x4c, + 0x26, 0xbe, 0x6a, 0x24, 0x1c, 0x8f, 0x9e, 0x75, 0x4e, 0xbb, 0x87, 0xb1, 0x1c, 0xea, 0x3d, 0x6b, 0x0d, 0xda, 0xd6, 0x1c, 0x5a, 0xe6, 0xef, 0x61, 0xaf, 0x65, 0x1c, 0xdc, 0x61, 0x0c, 0x77, 0xd2, + 0xe6, 0x60, 0x2f, 0x34, 0xf4, 0xb0, 0x4a, 0x58, 0xef, 0x96, 0xeb, 0x2e, 0xb4, 0x69, 0x45, 0x6f, 0x8b, 0xf5, 0x39, 0x08, 0x61, 0xcd, 0x1e, 0x94, 0x83, 0x9c, 0xbd, 0x97, 0xb1, 0xcc, 0xf1, 0xec, + 0xd6, 0xcf, 0x8b, 0xf8, 0x11, 0xc4, 0x61, 0x98, 0xc5, 0xde, 0xf7, 0x7d, 0xe3, 0x6b, 0x2f, 0x59, 0x4b, 0xc3, 0x5a, 0x06, 0x87, 0xed, 0x64, 0x10, 0x69, 0xe7, 0x69, 0xc6, 0xed, 0x34, 0x5c, 0xac, + 0x13, 0x59, 0xe9, 0xce, 0x99, 0x95, 0xe4, 0x59, 0x49, 0xa9, 0x10, 0x66, 0x77, 0x6f, 0x69, 0xe8, 0xbf, 0x06, 0x7d, 0x31, 0x1c, 0xef, 0x77, 0x3c, 0x9f, 0x92, 0xcd, 0xe3, 0x36, 0x9a, 0x7b, 0x58, + 0xfa, 0xe7, 0x22, 0xdd, 0xa7, 0x55, 0x68, 0x92, 0xa8, 0xf1, 0x22, 0x3e, 0xba, 0x1f, 0xec, 0x1b, 0xd3, 0x9c, 0xd7, 0xb7, 0x3b, 0xf5, 0x1e, 0x42, 0xd3, 0xd6, 0xb8, 0xf5, 0x1f, 0x35, 0x45, 0xbc, + 0x64, 0xfc, 0x73, 0xfb, 0xdb, 0x6d, 0xd2, 0x9b, 0x08, 0x39, 0x65, 0xb3, 0xa8, 0x87, 0x60, 0x1d, 0xea, 0xcb, 0xd4, 0xe6, 0x8f, 0xed, 0xd0, 0x55, 0x92, 0x3d, 0xd7, 0xb2, 0xb0, 0x3d, 0x73, 0xdb, + 0xcd, 0xb8, 0x18, 0xe4, 0x51, 0x97, 0x7f, 0x8c, 0x6d, 0x71, 0xd3, 0xc6, 0xe1, 0xf4, 0xe7, 0xed, 0x43, 0x67, 0x1d, 0x65, 0x12, 0xd7, 0x0f, 0x04, 0x15, 0x59, 0x09, 0x8b, 0xed, 0x6a, 0xb8, 0x6e, + 0x7d, 0xd6, 0xbb, 0x87, 0xfb, 0x83, 0xda, 0x86, 0xbb, 0x1c, 0x5a, 0xb6, 0x15, 0xdd, 0x8b, 0x85, 0x28, 0x2b, 0x3f, 0x25, 0xb3, 0x6f, 0xb5, 0x63, 0x1d, 0x34, 0xae, 0xe1, 0xb9, 0x29, 0xe5, 0x35, + 0x4b, 0x84, 0x5b, 0xe3, 0x18, 0x57, 0x7b, 0xd5, 0xe1, 0x00, 0xd4, 0xfd, 0xc5, 0x58, 0xe4, 0xe6, 0x42, 0x61, 0xfd, 0xd1, 0xcf, 0xf5, 0xbe, 0x5d, 0xfe, 0x94, 0x2c, 0x7c, 0xab, 0x5c, 0x79, 0x89, + 0x62, 0x57, 0xbf, 0x67, 0xd7, 0xb0, 0xdd, 0x95, 0x39, 0xab, 0xf1, 0x36, 0x5c, 0xd4, 0xb6, 0xb4, 0x58, 0xde, 0xd5, 0x29, 0xd8, 0x37, 0xfa, 0xd8, 0x18, 0x92, 0xa2, 0x0e, 0xcc, 0x69, 0xff, 0xfe, + 0x48, 0x7a, 0x37, 0x9b, 0xdc, 0xcc, 0xa5, 0xbc, 0xa9, 0xc5, 0x5e, 0x17, 0x86, 0xb8, 0x2e, 0x09, 0xc9, 0x5e, 0xae, 0xc4, 0xb6, 0x5a, 0xb2, 0xe6, 0x8a, 0x02, 0x00, 0xc1, 0x1b, 0xe5, 0x89, 0x9b, + 0x2d, 0x73, 0x8c, 0x45, 0xbd, 0xa6, 0x2b, 0xfe, 0x7a, 0x1b, 0xb9, 0x7d, 0x96, 0xcd, 0xee, 0xb0, 0x51, 0x1e, 0x7e, 0x70, 0x1a, 0x7e, 0x1d, 0xfc, 0xda, 0x06, 0x3d, 0xc9, 0xd7, 0x97, 0xf5, 0x30, + 0xa9, 0xec, 0x9e, 0x5a, 0xe6, 0xab, 0xd4, 0xe9, 0x61, 0xd2, 0xf2, 0x7c, 0x6a, 0x3b, 0xd3, 0x4a, 0xe5, 0x76, 0xe5, 0xb1, 0x93, 0x0b, 0x7e, 0x06, 0xab, 0xe6, 0x39, 0xc1, 0xc9, 0x67, 0xe7, 0xe1, + 0xfa, 0x93, 0xd4, 0x11, 0xe5, 0xb6, 0x24, 0x8f, 0xfd, 0x27, 0xf0, 0xfd, 0x13, 0x2c, 0x5a, 0xa3, 0x1d, 0x26, 0xfe, 0x95, 0x5e, 0x4c, 0xdb, 0xc5, 0x14, 0x69, 0x77, 0xbf, 0x9e, 0x0d, 0xd5, 0xad, + 0x72, 0x27, 0x11, 0x97, 0x4a, 0xce, 0x17, 0x40, 0x18, 0x32, 0xaa, 0x72, 0xa8, 0x93, 0xfc, 0x57, 0x40, 0xf8, 0xfd, 0x2b, 0xf7, 0xde, 0x0f, 0x17, 0x70, 0x5e, 0xb0, 0x1c, 0x3e, 0x39, 0xa3, 0x75, + 0x88, 0x17, 0xcb, 0xb6, 0x10, 0x03, 0xe7, 0x78, 0x90, 0x4e, 0x25, 0xb5, 0xb4, 0x64, 0xf3, 0x9a, 0xed, 0x1c, 0xb0, 0x1e, 0x2f, 0xc9, 0xdf, 0xa2, 0x5e, 0xcc, 0x69, 0xd6, 0xe8, 0x29, 0xb3, 0x77, + 0x2c, 0xe2, 0x63, 0xa6, 0xef, 0x13, 0x35, 0x99, 0x4e, 0x61, 0x99, 0x31, 0xfd, 0xe2, 0xb4, 0xdf, 0x23, 0xff, 0xa0, 0x16, 0x22, 0x3c, 0x1a, 0xde, 0x83, 0xa8, 0x0a, 0x78, 0x27, 0x46, 0x24, 0xc3, + 0xee, 0xf7, 0x2f, 0x70, 0xf8, 0xb5, 0xa9, 0x0c, 0x13, 0x12, 0xaa, 0xdb, 0x79, 0x7f, 0x8f, 0x0a, 0xd5, 0x1c, 0xb7, 0x63, 0x3f, 0x61, 0x96, 0x1a, 0x22, 0xa7, 0x86, 0xf2, 0x3e, 0xc9, 0xad, 0xf5, + 0xf6, 0x46, 0x46, 0x36, 0xdf, 0x66, 0xe7, 0x4c, 0x79, 0x47, 0xe5, 0x5d, 0xd6, 0xc6, 0xb8, 0xae, 0xff, 0xfc, 0x41, 0x38, 0x9c, 0xd9, 0x94, 0x04, 0xf9, 0x72, 0x63, 0x00, 0x6b, 0x2f, 0x18, 0x99, + 0x37, 0x24, 0xd9, 0xe5, 0x30, 0x81, 0x3b, 0x27, 0x44, 0xea, 0x63, 0xad, 0x5a, 0x5b, 0xb6, 0x49, 0xce, 0x22, 0x53, 0x51, 0xe0, 0x6f, 0x90, 0xdf, 0xc3, 0xf3, 0xb2, 0xeb, 0x55, 0x4d, 0x2f, 0xe3, + 0xe5, 0x12, 0x4a, 0xb6, 0x94, 0xad, 0x78, 0xae, 0x1c, 0x2b, 0x7c, 0x5c, 0x68, 0x07, 0xda, 0x5d, 0x87, 0x9a, 0x41, 0x16, 0x34, 0x10, 0x47, 0xb5, 0x69, 0x8f, 0x3f, 0x81, 0xbd, 0x18, 0x44, 0x60, + 0x61, 0xb4, 0xb1, 0x56, 0x4d, 0xe0, 0x10, 0x70, 0x9b, 0xc0, 0x90, 0x44, 0x53, 0xbb, 0xba, 0x11, 0x44, 0xeb, 0xc6, 0x48, 0x6b, 0xaf, 0xa1, 0x1f, 0xad, 0xbe, 0x09, 0xd7, 0x07, 0x01, 0xdc, 0xde, + 0x99, 0xb3, 0x5b, 0x7e, 0xc5, 0xbd, 0xdf, 0xbd, 0x7e, 0x88, 0xa9, 0xbb, 0xbb, 0x5a, 0xba, 0x96, 0x2f, 0xa5, 0x93, 0xbf, 0x6b, 0xb2, 0x71, 0x2d, 0x4a, 0x68, 0x8e, 0x19, 0xcb, 0xbc, 0x3e, 0x36, + 0x1c, 0x68, 0xb8, 0x8b, 0x53, 0x76, 0xeb, 0x0d, 0x30, 0x7e, 0x88, 0x43, 0xdf, 0xff, 0x2a, 0x6c, 0x62, 0x35, 0x60, 0x33, 0x68, 0x1d, 0xb5, 0x04, 0x0c, 0xab, 0xc8, 0xbb, 0xc8, 0xa0, 0x1e, 0x86, + 0xeb, 0x6e, 0x96, 0x83, 0xe5, 0xfd, 0xc2, 0x3d, 0xe2, 0xf8, 0x52, 0x8c, 0xea, 0x81, 0x5a, 0x73, 0xe0, 0x2f, 0x39, 0xaf, 0xa7, 0x4c, 0xf5, 0xd3, 0xc2, 0x71, 0x0c, 0xc1, 0x25, 0x1b, 0x82, 0x83, + 0x1d, 0x6d, 0xa2, 0xa6, 0xe2, 0x62, 0x15, 0x4d, 0x6b, 0xa7, 0xdc, 0x79, 0x27, 0x10, 0x72, 0xba, 0xe1, 0x5d, 0xc4, 0x6d, 0xfa, 0xdc, 0x49, 0x48, 0xe6, 0x16, 0xd1, 0x57, 0xda, 0x48, 0x35, 0x53, + 0xe1, 0xbf, 0x6c, 0x03, 0x22, 0x10, 0x21, 0x84, 0x02, 0x0b, 0x01, 0xf8, 0xf0, 0x03, 0x36, 0x10, 0x59, 0x97, 0xa1, 0x5d, 0xee, 0x75, 0xce, 0x9d, 0x47, 0x3d, 0xc2, 0x03, 0x6b, 0xab, 0xe3, 0xdc, + 0x61, 0x96, 0x4a, 0x54, 0x53, 0x66, 0x3b, 0x9c, 0x94, 0x89, 0x9d, 0x1d, 0x31, 0x15, 0xcf, 0xb5, 0xc4, 0x03, 0x95, 0x84, 0x3c, 0x72, 0xf5, 0x3f, 0x68, 0xb5, 0x71, 0x8e, 0x5f, 0x66, 0x2a, 0x04, + 0x3c, 0xa2, 0x01, 0x8d, 0x10, 0xe2, 0x3f, 0x60, 0xc8, 0xf0, 0xbe, 0xc0, 0x41, 0x57, 0x74, 0xfd, 0xa7, 0x08, 0x3f, 0xa7, 0x33, 0x2f, 0x59, 0xed, 0x70, 0xd8, 0x6c, 0x2a, 0x9f, 0x0c, 0xea, 0xe2, + 0xac, 0x44, 0x1d, 0xd2, 0x5d, 0x9b, 0xd2, 0xdd, 0x52, 0x3e, 0xa7, 0x6b, 0x65, 0x5a, 0xe4, 0xc3, 0x69, 0x4a, 0x9a, 0x3f, 0x88, 0x8c, 0xff, 0x1d, 0x7f, 0xff, 0x39, 0x13, 0x44, 0x80, 0x81, 0x22, + 0x60, 0x69, 0xee, 0x43, 0xf4, 0x82, 0xd0, 0xf5, 0x30, 0x27, 0xb0, 0x0c, 0xfd, 0xd4, 0x91, 0xf9, 0x68, 0x21, 0x6e, 0x15, 0xb3, 0x02, 0xfc, 0xa3, 0x0c, 0xeb, 0x73, 0xc7, 0x71, 0x8a, 0xbd, 0xc6, + 0xa3, 0xee, 0xa6, 0x61, 0xcf, 0x22, 0xac, 0xdd, 0xd1, 0xea, 0x2a, 0x39, 0xf1, 0xbe, 0x66, 0xfe, 0xcf, 0x3a, 0x2f, 0xd9, 0x29, 0x14, 0x3b, 0x73, 0xa2, 0xd0, 0x14, 0xe2, 0xde, 0x15, 0x4c, 0xac, + 0xfa, 0xa2, 0xbe, 0xaf, 0x89, 0x65, 0x85, 0x95, 0x24, 0xb9, 0x9d, 0x93, 0x18, 0x95, 0xa6, 0xa2, 0xe3, 0x29, 0xcc, 0x6f, 0x5f, 0xcb, 0x5e, 0xa6, 0xd1, 0x67, 0x5c, 0x50, 0xfe, 0x03, 0xfb, 0xe9, + 0x67, 0x0f, 0x5f, 0xb4, 0x38, 0x88, 0x80, 0x00, 0x05, 0x48, 0x23, 0xf6, 0x03, 0x81, 0x00, 0xb1, 0x18, 0x09, 0x80, 0x01, 0xec, 0x8b, 0xd6, 0x8a, 0x70, 0xb1, 0x67, 0xab, 0xcb, 0xb9, 0x58, 0xba, + 0x4a, 0x5a, 0x95, 0xc2, 0xa3, 0x33, 0x87, 0x4c, 0x35, 0x56, 0x77, 0x00, 0xb9, 0x84, 0x84, 0x94, 0xef, 0x1d, 0x18, 0xdb, 0x61, 0x6f, 0xf3, 0x8f, 0xb5, 0xe0, 0x1f, 0x76, 0x1f, 0x16, 0xb1, 0xcc, + 0x87, 0x10, 0xba, 0x0c, 0x27, 0x22, 0x3e, 0xf4, 0x98, 0xf0, 0x7f, 0xd6, 0x9a, 0xdc, 0x3c, 0xfb, 0xfc, 0xf6, 0x53, 0x0c, 0xbd, 0xed, 0x6f, 0x0f, 0x45, 0xa4, 0xaf, 0x52, 0x5e, 0x99, 0x71, 0x23, + 0x6d, 0x74, 0xcb, 0xcc, 0x81, 0x27, 0x6c, 0xf2, 0x45, 0x52, 0xd3, 0xeb, 0x08, 0x1e, 0x0e, 0x63, 0x35, 0x94, 0x0b, 0x76, 0x09, 0xed, 0x6d, 0xa7, 0xfc, 0x18, 0xf7, 0x3e, 0x96, 0xff, 0x17, 0x1c, + 0xfd, 0xa5, 0xa7, 0x3f, 0xc1, 0xb7, 0xa5, 0x2c, 0x1c, 0xed, 0x9c, 0xda, 0xce, 0xcb, 0x59, 0x76, 0x2a, 0x6d, 0xd7, 0xf5, 0x7e, 0xab, 0x88, 0x70, 0x7f, 0x11, 0x1f, 0x8f, 0x43, 0x9e, 0x3b, 0x47, + 0xe2, 0x74, 0xe0, 0x6a, 0xde, 0xd4, 0x0b, 0xbf, 0x5a, 0xfe, 0xfb, 0x5f, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe5, 0x3b, 0xe6, 0xce, 0x1f, 0x0a, 0x00, 0x00, 0x17, 0x15, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x7c, 0x90, 0xbb, 0x12, 0xdb, 0x20, 0x10, 0x45, 0x6b, 0xf3, 0x15, 0x94, 0x71, 0x01, 0x2c, 0x0f, 0x59, 0x76, 0x91, 0xfc, 0x0b, 0x82, 0x15, 0x21, 0x46, - 0xe0, 0x20, 0x50, 0x91, 0xaf, 0xcf, 0x58, 0x99, 0x8c, 0x1f, 0x19, 0x67, 0x29, 0x39, 0x1c, 0xee, 0xdd, 0xa5, 0xf8, 0x9e, 0x90, 0xae, 0x84, 0x54, 0xbc, 0x25, 0xeb, 0x90, 0xce, 0xf4, 0xeb, 0x37, - 0xca, 0xc5, 0x4c, 0x48, 0x28, 0x54, 0x72, 0x79, 0xb9, 0x5f, 0xfd, 0xec, 0xb1, 0x22, 0xfd, 0x42, 0x0e, 0x33, 0xdd, 0x80, 0x03, 0x07, 0x06, 0x00, 0x72, 0x3f, 0xfb, 0x30, 0x78, 0x1a, 0x72, 0x08, - 0xb1, 0x7d, 0xef, 0x13, 0x77, 0x65, 0x11, 0xe9, 0x1a, 0x73, 0x48, 0x36, 0x7b, 0x31, 0xf7, 0xec, 0x58, 0xed, 0xb9, 0xc5, 0x05, 0x57, 0x11, 0xca, 0x5f, 0x93, 0x02, 0xa5, 0xc1, 0x80, 0x86, 0xc1, - 0x8c, 0x66, 0x64, 0xc3, 0x3c, 0xa1, 0x53, 0xa0, 0xa5, 0xf6, 0x03, 0x39, 0xbe, 0x7c, 0xfe, 0xa4, 0x75, 0xa9, 0x74, 0x8f, 0x1b, 0xe6, 0xb6, 0x8a, 0xd5, 0x5f, 0x59, 0x28, 0x62, 0x53, 0x74, 0x53, - 0x5c, 0x6a, 0x0e, 0x54, 0x08, 0x1a, 0xb3, 0x8f, 0x15, 0x5d, 0x7b, 0x79, 0x15, 0x4a, 0x09, 0x09, 0x45, 0xef, 0xd1, 0xd3, 0x4d, 0x72, 0xc9, 0xe5, 0x47, 0xf4, 0xc7, 0x5a, 0x32, 0x8b, 0x0d, 0xab, - 0x6d, 0xa5, 0xee, 0x69, 0x77, 0xfe, 0xb3, 0x7b, 0x29, 0x1e, 0x6b, 0xbe, 0x07, 0x71, 0x25, 0xbb, 0x5e, 0x2b, 0xe6, 0xf6, 0xa8, 0x28, 0xcf, 0xa0, 0xd4, 0x19, 0x4e, 0xd2, 0x0c, 0x17, 0x86, 0x60, - 0xf5, 0xc5, 0x1a, 0x37, 0x19, 0xf5, 0x39, 0xc0, 0xc3, 0x57, 0x71, 0x4e, 0xe8, 0x9a, 0x7a, 0xb1, 0x8d, 0x20, 0x41, 0x69, 0xa3, 0x80, 0x99, 0x69, 0xb4, 0xd6, 0x68, 0x77, 0x1a, 0x8d, 0x7a, 0xb3, - 0x15, 0xde, 0x27, 0xac, 0xbc, 0xd4, 0x20, 0x6c, 0x2b, 0x4b, 0x74, 0xf7, 0x16, 0xe6, 0x9f, 0x05, 0x3d, 0x61, 0x4b, 0x4f, 0x2d, 0x62, 0xad, 0x7f, 0xea, 0xfe, 0x07, 0xfc, 0x65, 0x6f, 0x3b, 0x03, - 0x6f, 0xd0, 0x91, 0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xef, 0x6f, 0x3c, 0x70, 0x22, 0x01, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0xac, 0x98, - 0xd9, 0xb6, 0xa2, 0xd8, 0xb2, 0x86, 0xef, 0xcf, 0x53, 0xd4, 0xbd, 0x63, 0x2d, 0xe6, 0x9c, 0xf4, 0x67, 0x8c, 0x73, 0x21, 0x08, 0x0a, 0x0a, 0x0a, 0x02, 0x8a, 0x77, 0xf4, 0x7d, 0xdf, 0xf3, 0xf4, - 0x67, 0xb8, 0xb2, 0xf6, 0x2e, 0xcd, 0x5d, 0x59, 0x99, 0xa3, 0x76, 0xbd, 0xc0, 0xf7, 0xff, 0x11, 0xfc, 0x33, 0x22, 0x34, 0x4a, 0xfa, 0x78, 0x70, 0x3f, 0xbd, 0xaa, 0xc0, 0xbc, 0xbc, 0x1a, 0xfc, - 0x60, 0x0c, 0xca, 0xbe, 0xc3, 0x3a, 0x3f, 0xfb, 0x88, 0x2a, 0x6c, 0x44, 0xbf, 0x8d, 0xe8, 0x13, 0xe2, 0x9f, 0xe0, 0xb7, 0x18, 0xfe, 0x2f, 0x5a, 0xe7, 0xdd, 0x95, 0xd1, 0x17, 0x1b, 0x62, 0x93, - 0x75, 0x31, 0x4f, 0xfb, 0xbd, 0xeb, 0x47, 0x65, 0xb2, 0xbf, 0x5f, 0xd7, 0x93, 0xa3, 0xcb, 0x56, 0x0e, 0x71, 0x2a, 0x3c, 0xdd, 0xf7, 0x9d, 0x3d, 0xfd, 0xdf, 0xff, 0xfc, 0x2a, 0x18, 0x8b, 0xaa, - 0xcf, 0xa2, 0xf2, 0x9f, 0xfc, 0x79, 0x57, 0x1c, 0xc3, 0x55, 0x4d, 0x15, 0x26, 0xe2, 0xc6, 0xd4, 0x11, 0x99, 0x24, 0x15, 0x53, 0x05, 0x5a, 0xf6, 0xd9, 0x32, 0x85, 0xc0, 0x0c, 0x9d, 0xfa, 0xa0, - 0x98, 0x77, 0x68, 0x90, 0x46, 0xf5, 0xce, 0x6f, 0x03, 0xc7, 0xcb, 0xb0, 0xba, 0x5f, 0x7e, 0x1b, 0xe1, 0x27, 0xfc, 0x64, 0x5f, 0x98, 0xd5, 0xf1, 0x21, 0x0c, 0x81, 0x98, 0x91, 0xfc, 0xf1, 0x30, - 0x4a, 0xb1, 0xaa, 0x93, 0x8a, 0x99, 0x25, 0x00, 0xbf, 0xf3, 0x82, 0xb9, 0xd1, 0x28, 0x6b, 0x77, 0x4f, 0xca, 0xc7, 0xb0, 0x97, 0x71, 0x5c, 0x78, 0x63, 0xfa, 0xce, 0x18, 0x78, 0x51, 0x8c, 0x45, - 0xd5, 0x47, 0x57, 0x07, 0xd3, 0x37, 0xf0, 0xab, 0x59, 0x99, 0xb6, 0x19, 0xdb, 0xbb, 0x21, 0x35, 0x89, 0xbb, 0xa8, 0xb0, 0x2a, 0xac, 0x18, 0xf1, 0x7c, 0x3b, 0xe5, 0x58, 0x97, 0x9d, 0x55, 0x22, - 0x39, 0x1d, 0xd2, 0x6b, 0x27, 0x6d, 0x3c, 0xf2, 0x80, 0x33, 0x3f, 0x07, 0xc3, 0x27, 0x71, 0x4c, 0xd9, 0x14, 0x1b, 0xa0, 0xdb, 0x94, 0x23, 0x2f, 0x84, 0xf2, 0x79, 0x32, 0xe3, 0x3e, 0x3f, 0x6f, - 0xf5, 0xa6, 0xc3, 0x37, 0x6d, 0x76, 0xb0, 0x6d, 0x88, 0xa7, 0xf6, 0xcd, 0x30, 0x59, 0xda, 0xfb, 0x05, 0xe2, 0x3f, 0x60, 0x35, 0xaa, 0xaa, 0x28, 0x0f, 0x9e, 0x5c, 0xaf, 0xa8, 0x7f, 0x1b, 0xc1, - 0x27, 0xf9, 0x2d, 0x07, 0x98, 0xe6, 0x28, 0x07, 0xce, 0x7f, 0x20, 0x8a, 0xe3, 0xf0, 0xeb, 0xb5, 0xeb, 0x81, 0x34, 0xe5, 0x10, 0x08, 0xb5, 0xb7, 0x99, 0x63, 0xa3, 0x19, 0xaa, 0xe2, 0x76, 0x07, - 0xd5, 0x43, 0xe0, 0xa8, 0xe9, 0xa7, 0xbc, 0x17, 0x9b, 0x23, 0xe3, 0x1b, 0xfe, 0xc9, 0x55, 0xf6, 0x28, 0x93, 0x3c, 0x6c, 0x94, 0xc7, 0x7c, 0x13, 0x52, 0xa4, 0x85, 0x90, 0xef, 0x66, 0x77, 0xb7, - 0x9a, 0x04, 0x2a, 0x8d, 0x0c, 0x2c, 0x52, 0xb9, 0x59, 0xf8, 0x73, 0x6c, 0x38, 0xac, 0xeb, 0xb3, 0x7a, 0xf0, 0x86, 0xf5, 0xb9, 0x1c, 0x70, 0xf5, 0x8d, 0x1a, 0x2d, 0x6c, 0x53, 0xd8, 0x17, 0x93, - 0xb8, 0x54, 0x78, 0x5d, 0x98, 0xe9, 0x9c, 0x51, 0xa2, 0x76, 0xc9, 0xfd, 0x7e, 0x90, 0xfc, 0x1c, 0x53, 0x28, 0x52, 0x88, 0xfe, 0x0c, 0x3b, 0x0c, 0x89, 0xff, 0xf2, 0x91, 0xf6, 0x99, 0xeb, 0x75, - 0x31, 0xb6, 0x77, 0xeb, 0xfb, 0x4a, 0xe7, 0x97, 0xb0, 0x3f, 0x6d, 0xf1, 0x0b, 0x65, 0xd8, 0xca, 0x94, 0xf2, 0x27, 0xbb, 0x60, 0xf0, 0x34, 0x11, 0xb5, 0x87, 0x88, 0xe1, 0x91, 0xfd, 0x13, 0xda, - 0x8b, 0x45, 0x43, 0x5a, 0x2e, 0x8f, 0x80, 0x50, 0xa2, 0x66, 0x0c, 0x03, 0x7b, 0xc7, 0x89, 0x81, 0xaf, 0x54, 0xfb, 0x7d, 0x2d, 0x4c, 0xd8, 0xa9, 0x39, 0x07, 0xce, 0xd9, 0xd8, 0x94, 0xf1, 0x6c, - 0x6e, 0x96, 0xc3, 0x7b, 0xf0, 0xd3, 0xae, 0x2a, 0x3f, 0x92, 0x3e, 0x68, 0x9d, 0xbe, 0x6a, 0xb1, 0xa8, 0xfa, 0x9d, 0xfc, 0xf5, 0x91, 0x8e, 0x2b, 0xc5, 0x8f, 0xe5, 0x38, 0xa2, 0x69, 0xef, 0x3b, - 0x7b, 0xcc, 0x62, 0x16, 0x65, 0x0c, 0xb3, 0x42, 0x4d, 0xee, 0x0d, 0x6b, 0x3b, 0xe8, 0x68, 0x8e, 0x44, 0x5b, 0x0d, 0xb2, 0xdc, 0x52, 0xcc, 0x2f, 0x31, 0x5f, 0xec, 0x1e, 0x7d, 0xcd, 0xe4, 0x47, - 0x9a, 0x2d, 0x30, 0x12, 0x1d, 0xc7, 0x90, 0xd9, 0xde, 0xd0, 0x78, 0x84, 0x16, 0xe3, 0x64, 0xca, 0x90, 0x41, 0x2d, 0x3d, 0x62, 0xc3, 0xd9, 0x3f, 0xdc, 0xdd, 0x6d, 0x45, 0xbc, 0xa1, 0xb3, 0xf6, - 0x8f, 0x37, 0xfa, 0x5a, 0x7e, 0x2d, 0x6a, 0x76, 0x49, 0x51, 0xb7, 0x43, 0x7b, 0xae, 0x2f, 0xb6, 0x9a, 0xa7, 0xd3, 0x59, 0x69, 0x2a, 0x08, 0x8c, 0xcc, 0x8e, 0x61, 0xb8, 0xe0, 0x9e, 0x9d, 0x54, - 0x28, 0xc7, 0x5d, 0xbe, 0xd3, 0xbe, 0xe7, 0xf5, 0xc1, 0xdc, 0x3f, 0x93, 0xf4, 0xfe, 0x36, 0x09, 0xd9, 0x1d, 0x37, 0x3b, 0xf9, 0x86, 0x9b, 0x06, 0x76, 0x4a, 0xce, 0x93, 0x1c, 0xd8, 0x5a, 0x00, - 0x83, 0xb0, 0xe9, 0xcd, 0x19, 0x4b, 0xac, 0xd8, 0x29, 0x30, 0x62, 0x0c, 0xfd, 0x6d, 0xab, 0x4a, 0x3f, 0x02, 0xa2, 0x37, 0x60, 0x70, 0x0a, 0x5a, 0x1a, 0x21, 0x23, 0xc8, 0x92, 0xfd, 0xa0, 0x64, - 0x89, 0xaf, 0xcc, 0x3c, 0x56, 0x2b, 0x80, 0xc8, 0x6f, 0x42, 0xd0, 0x3a, 0x07, 0xd3, 0x2c, 0xb8, 0x89, 0xc9, 0x51, 0xd4, 0xbe, 0x47, 0x33, 0xcf, 0x92, 0x32, 0xca, 0x9d, 0xd2, 0xc7, 0xc2, 0xa1, - 0xf4, 0x3e, 0xda, 0xa1, 0xec, 0x93, 0x22, 0xe8, 0xbe, 0xda, 0x0a, 0x9e, 0x39, 0xfd, 0x40, 0x00, 0xe1, 0x80, 0x00, 0x38, 0x20, 0x09, 0x9a, 0xa0, 0x3f, 0xc8, 0xd0, 0x0d, 0x3c, 0x04, 0x70, 0x88, - 0xfb, 0xe4, 0x53, 0xf8, 0x7c, 0x92, 0x0e, 0xe1, 0xac, 0x0f, 0x4e, 0xde, 0x3c, 0x04, 0x7f, 0x9b, 0xf5, 0x62, 0x7c, 0xc8, 0x4d, 0x20, 0x55, 0x47, 0x4b, 0x6d, 0xd4, 0xc9, 0xe0, 0xcf, 0xe8, 0x0e, - 0x83, 0xb8, 0xa7, 0xc8, 0xe8, 0x9f, 0x13, 0x7e, 0x29, 0x1c, 0xc7, 0xd9, 0x0b, 0xc1, 0x39, 0xd8, 0x83, 0x67, 0xcc, 0xd9, 0x66, 0x16, 0xbb, 0xda, 0xdc, 0xb3, 0x66, 0x1c, 0x4b, 0x51, 0xb5, 0xe3, - 0x53, 0xaf, 0xa2, 0x2d, 0x1e, 0xd7, 0xc7, 0x6e, 0xff, 0xb8, 0x6f, 0xdf, 0xf4, 0x8b, 0xca, 0x0f, 0xda, 0xf2, 0x39, 0xe9, 0xbd, 0xaa, 0xf4, 0x86, 0xb6, 0x0d, 0xca, 0xfe, 0x0f, 0x65, 0xc8, 0x00, - 0x84, 0x18, 0x40, 0x41, 0x82, 0x64, 0x3f, 0x02, 0xe0, 0xe0, 0xac, 0x43, 0x78, 0x2e, 0x81, 0xbe, 0x5e, 0xd8, 0xa3, 0x09, 0x6c, 0x35, 0x36, 0xf1, 0xf3, 0xe1, 0x74, 0xc0, 0x8b, 0xfd, 0xf1, 0xb0, - 0xf3, 0x52, 0x59, 0x17, 0x45, 0xbd, 0x95, 0x1d, 0x2a, 0xd8, 0x2a, 0xe4, 0x61, 0xc3, 0xf7, 0x3b, 0xff, 0xdc, 0x5d, 0xbc, 0x7f, 0x42, 0xf2, 0xa5, 0x58, 0xca, 0x97, 0x79, 0x50, 0x6c, 0x2f, 0x44, - 0x92, 0xd9, 0x92, 0x3b, 0x2e, 0x1e, 0x1d, 0x26, 0x69, 0x7a, 0x93, 0x7d, 0x5f, 0x5b, 0x4e, 0x25, 0x23, 0x45, 0xb8, 0xcc, 0x91, 0x7c, 0x53, 0x71, 0xac, 0xf6, 0x03, 0xe5, 0x36, 0x08, 0xf3, 0xc0, - 0xeb, 0xd1, 0x9b, 0x2e, 0x0d, 0x20, 0x40, 0x38, 0x81, 0xc0, 0x07, 0xe1, 0xd2, 0x8e, 0x43, 0xe0, 0x1e, 0x45, 0x13, 0xe8, 0x29, 0x28, 0x74, 0x4e, 0xe8, 0x43, 0x40, 0x50, 0xbb, 0xd3, 0x4e, 0x03, - 0x37, 0x68, 0xa7, 0x76, 0xc7, 0xdd, 0x36, 0x35, 0x63, 0xa2, 0x81, 0x1e, 0xd7, 0xe8, 0x86, 0xae, 0x9a, 0x55, 0xe4, 0xaa, 0xb3, 0x46, 0xff, 0xbd, 0xe0, 0x4b, 0xa1, 0xee, 0x8c, 0x72, 0xb5, 0xcc, - 0x26, 0x8b, 0x1f, 0x1a, 0x4e, 0x9a, 0xc5, 0x34, 0xcc, 0x6f, 0xf2, 0xcd, 0x29, 0xef, 0x92, 0x8b, 0xeb, 0x79, 0x5e, 0xb8, 0xfc, 0x92, 0x2f, 0x4a, 0x3b, 0x46, 0x23, 0x78, 0xd3, 0x2d, 0x93, 0xa0, - 0x08, 0x96, 0xa0, 0xc5, 0xea, 0x36, 0xe8, 0x9f, 0x2f, 0xf9, 0xdf, 0x51, 0x02, 0x00, 0x21, 0x1a, 0x22, 0x82, 0x21, 0xd0, 0x87, 0x03, 0x41, 0x40, 0x7b, 0x4e, 0x10, 0xfa, 0x4c, 0xf0, 0x22, 0xba, - 0xee, 0x60, 0xa1, 0x9f, 0x4f, 0x5b, 0xf5, 0xe1, 0xcd, 0xf0, 0x62, 0xe9, 0xfc, 0x15, 0x34, 0x99, 0x41, 0xd7, 0xd3, 0x29, 0xdb, 0x87, 0x93, 0x5c, 0x11, 0x6b, 0xea, 0xa9, 0x98, 0xb1, 0x74, 0xe5, - 0xfb, 0x90, 0xab, 0xb3, 0x08, 0x0b, 0xda, 0xb6, 0x6a, 0xbb, 0xa7, 0x1e, 0xfb, 0x6d, 0x0c, 0x8b, 0x02, 0x77, 0x9a, 0xe1, 0x7a, 0x45, 0x90, 0xa8, 0xa6, 0x3a, 0x5d, 0xe8, 0xa6, 0xe3, 0x82, 0x64, - 0x76, 0x4d, 0x3d, 0x1b, 0x62, 0x6d, 0x3b, 0xb5, 0x47, 0xd2, 0x9c, 0x4e, 0x7b, 0x63, 0xea, 0x89, 0xbf, 0x86, 0xbd, 0x76, 0x65, 0x72, 0xa6, 0x39, 0x3c, 0x70, 0xa2, 0x6a, 0x6d, 0x4e, 0x28, 0x36, - 0x6b, 0xd8, 0x1e, 0xb6, 0xbb, 0x21, 0xb4, 0x70, 0x49, 0xe9, 0xcb, 0x9d, 0xee, 0x87, 0xb0, 0x25, 0x55, 0x49, 0x15, 0xf2, 0xf7, 0xae, 0xd4, 0x45, 0xb0, 0x3a, 0xad, 0xff, 0xdc, 0x6b, 0x7e, 0x12, - 0x86, 0x79, 0xe2, 0xfe, 0xbe, 0x84, 0xbe, 0x46, 0xd1, 0x8e, 0x9b, 0x76, 0x02, 0x50, 0xf7, 0x8b, 0x56, 0x71, 0x07, 0xf7, 0xa4, 0xd9, 0x97, 0xe9, 0x6a, 0x5e, 0x2a, 0x5e, 0xb9, 0xe9, 0x24, 0x27, - 0xac, 0x52, 0x86, 0x85, 0x30, 0x7f, 0xb8, 0x5b, 0x4d, 0xf9, 0x35, 0xe8, 0x8b, 0xe1, 0xe4, 0x78, 0xa0, 0xe9, 0xac, 0x12, 0x63, 0x7b, 0x36, 0x8e, 0xb0, 0xf6, 0xf4, 0x32, 0x3b, 0x66, 0x4d, 0x68, - 0x54, 0x51, 0xe7, 0x46, 0x74, 0xf4, 0x50, 0x2d, 0x9b, 0xe8, 0xf4, 0x9d, 0xfd, 0xc0, 0xde, 0x9b, 0xd0, 0xf5, 0x6d, 0xd0, 0x7b, 0x71, 0x8b, 0x55, 0x6e, 0x3a, 0xff, 0xe7, 0xf4, 0x3c, 0x88, 0x99, - 0xcd, 0x42, 0x4a, 0x12, 0x37, 0xed, 0xe4, 0xef, 0x42, 0x65, 0x9b, 0x59, 0xf4, 0xb9, 0x9f, 0x86, 0x86, 0xb3, 0xd6, 0x56, 0x60, 0xf6, 0x3a, 0xb5, 0x17, 0xe7, 0xcd, 0x24, 0xcc, 0x8a, 0xf0, 0xd7, - 0x58, 0xe2, 0x0d, 0x6b, 0x8f, 0x07, 0x09, 0xa4, 0x0b, 0x8a, 0x2b, 0x25, 0xe5, 0x36, 0xe6, 0x6d, 0x1a, 0x69, 0x68, 0xc9, 0x1a, 0x9b, 0x74, 0x57, 0xef, 0x68, 0x60, 0x46, 0x23, 0xaf, 0xd6, 0xf5, - 0xda, 0x33, 0xec, 0x77, 0xd7, 0xe3, 0xbf, 0xb1, 0x7d, 0xd0, 0xf5, 0x49, 0xf8, 0xb5, 0x3f, 0xde, 0xef, 0x46, 0x85, 0xbc, 0x49, 0x0b, 0xbb, 0x8b, 0x11, 0x94, 0x04, 0x29, 0x2c, 0xf7, 0xfc, 0x74, - 0xdf, 0x7b, 0xa4, 0xfb, 0x08, 0x8f, 0xaa, 0xdc, 0x87, 0x87, 0x02, 0x9a, 0x96, 0x19, 0x3d, 0xca, 0x0d, 0x2b, 0x48, 0x3f, 0x25, 0xd3, 0x6f, 0x91, 0xa0, 0xc4, 0x86, 0xa9, 0x74, 0x4f, 0x27, 0xf1, - 0xb6, 0x5d, 0x58, 0x00, 0x56, 0xa5, 0x91, 0x53, 0x5d, 0x4f, 0xe6, 0x76, 0xba, 0xe3, 0xc7, 0x3b, 0x4b, 0x21, 0x2c, 0xc6, 0x6e, 0x53, 0xda, 0x07, 0xd1, 0x4f, 0xc9, 0xcc, 0xb7, 0x40, 0xd4, 0xd7, - 0x28, 0x71, 0x94, 0x47, 0x7e, 0x0f, 0xfb, 0x43, 0x5d, 0x90, 0x27, 0xda, 0x82, 0x9b, 0xd6, 0xe2, 0x36, 0xdb, 0x87, 0xbc, 0xf8, 0xc7, 0x4e, 0x99, 0x3b, 0x8d, 0x93, 0xe4, 0x89, 0xb8, 0x1c, 0xb3, - 0x5f, 0x41, 0xbe, 0x98, 0x5d, 0xd4, 0xf4, 0x10, 0x11, 0x66, 0x55, 0x26, 0x79, 0xd7, 0xdd, 0x1e, 0x4c, 0xe2, 0x5c, 0x53, 0x78, 0xe6, 0x5b, 0x6c, 0x3c, 0x94, 0x41, 0x76, 0xd1, 0xb3, 0xea, 0xbc, - 0xc9, 0x7c, 0xc5, 0xdc, 0x28, 0xe6, 0x1b, 0x79, 0x74, 0xf2, 0xc5, 0xc9, 0x1d, 0xcc, 0x5d, 0xfa, 0xc0, 0x1d, 0xc2, 0x30, 0x68, 0xeb, 0xaa, 0xca, 0x5f, 0x32, 0xbc, 0x6f, 0xb6, 0xa4, 0xc1, 0x63, - 0x00, 0x20, 0x68, 0x63, 0x2e, 0x2b, 0xee, 0x89, 0x73, 0xc2, 0x2a, 0x2d, 0xde, 0xd0, 0x77, 0x7b, 0xa6, 0x8e, 0x79, 0xbe, 0x3a, 0x93, 0x28, 0xc5, 0x9e, 0x7f, 0x99, 0x7e, 0x1d, 0xfc, 0xda, 0x65, - 0x97, 0xf3, 0x94, 0x6d, 0x3b, 0x2d, 0x32, 0x79, 0xc4, 0xb6, 0x05, 0x9f, 0xdd, 0x46, 0x98, 0xf6, 0x34, 0x9d, 0x59, 0xb7, 0x85, 0x97, 0xa9, 0x43, 0x7d, 0x1e, 0x84, 0x92, 0x5e, 0x01, 0xdf, 0x3d, - 0x27, 0x7e, 0xf5, 0x39, 0xb8, 0x41, 0xfb, 0x59, 0xb5, 0x11, 0xe6, 0xf4, 0x55, 0x91, 0x78, 0x4f, 0x20, 0xf1, 0xcd, 0xa9, 0x37, 0xaf, 0x92, 0x55, 0x09, 0x86, 0x53, 0x6b, 0x42, 0xb3, 0x8b, 0xb5, - 0x01, 0xd7, 0xc2, 0x72, 0xbc, 0x6f, 0x2d, 0x62, 0x9b, 0xaf, 0xde, 0x68, 0xf2, 0x73, 0x66, 0x99, 0xe2, 0x84, 0x6f, 0x04, 0xf3, 0x2f, 0x48, 0x2f, 0xd6, 0xa2, 0x1d, 0x3a, 0x04, 0x95, 0x77, 0xc7, - 0x37, 0xcb, 0x7e, 0xb3, 0x44, 0xa7, 0x87, 0xd7, 0xae, 0x9a, 0xec, 0x34, 0xc5, 0x2d, 0x65, 0xb7, 0x52, 0x41, 0x97, 0x80, 0x99, 0x72, 0xac, 0xb9, 0x61, 0x17, 0xe1, 0x1d, 0x58, 0x0c, 0x79, 0x9f, - 0x04, 0x6d, 0xfb, 0xfb, 0x0f, 0x87, 0xaf, 0x77, 0x55, 0x09, 0x85, 0x7e, 0xd0, 0x2e, 0xd6, 0xb5, 0x19, 0x5c, 0x6a, 0x42, 0x2b, 0xf2, 0x91, 0x70, 0xb6, 0x3a, 0x14, 0xa6, 0x8b, 0xa8, 0xef, 0x97, - 0x2a, 0x8c, 0x8f, 0xc3, 0xb2, 0x6b, 0x80, 0x26, 0xfd, 0x25, 0xeb, 0xc5, 0xde, 0xa4, 0x93, 0x59, 0xe5, 0x17, 0x5b, 0x51, 0x03, 0xe6, 0x91, 0xd1, 0x72, 0x77, 0x4a, 0xf3, 0xab, 0xba, 0x80, 0x07, - 0xc5, 0x44, 0x72, 0xbc, 0x93, 0xcd, 0x3d, 0xd9, 0xa5, 0x3a, 0x4b, 0x34, 0x18, 0x78, 0x47, 0xae, 0x4e, 0xfd, 0x45, 0xfb, 0xfd, 0x0b, 0x9f, 0xf5, 0x99, 0x21, 0x4b, 0xd7, 0x48, 0x52, 0x75, 0x65, - 0xf2, 0x74, 0x2d, 0x47, 0x5e, 0xd1, 0xe1, 0x83, 0x93, 0x2e, 0x47, 0xb1, 0xc4, 0x53, 0xad, 0x75, 0x22, 0x08, 0xee, 0x68, 0xdb, 0x0d, 0xca, 0x0f, 0x39, 0xaf, 0x97, 0xfc, 0x94, 0x60, 0x0f, 0x87, - 0xdf, 0x3a, 0xa6, 0xc7, 0x65, 0x8b, 0x77, 0xe8, 0xf2, 0x79, 0xc7, 0x72, 0x68, 0x4d, 0x08, 0xd3, 0xb8, 0xc7, 0x22, 0x05, 0x3a, 0xea, 0x7a, 0xab, 0x87, 0x9d, 0x08, 0x9e, 0x8b, 0xb4, 0xca, 0x9d, - 0x32, 0xfa, 0xa2, 0xcd, 0x58, 0xb7, 0x94, 0xde, 0xcb, 0x2e, 0x63, 0x01, 0x0b, 0x21, 0x64, 0x48, 0x08, 0xc0, 0x87, 0xe7, 0x93, 0x3e, 0x4b, 0x3a, 0x04, 0xee, 0x50, 0xaf, 0x6b, 0x45, 0x9f, 0x95, - 0x28, 0x98, 0x48, 0x4b, 0x9e, 0xd7, 0x21, 0x20, 0xb1, 0x54, 0x36, 0x04, 0x72, 0x08, 0xd2, 0x3a, 0xb5, 0xf2, 0x73, 0x80, 0x25, 0x6b, 0xcb, 0xd1, 0x40, 0xae, 0x42, 0x1a, 0x39, 0xca, 0x77, 0x5a, - 0xcf, 0x8b, 0xe8, 0x65, 0x85, 0x41, 0x40, 0x23, 0x1c, 0xe0, 0x08, 0x21, 0xfa, 0x03, 0x86, 0x04, 0xed, 0x31, 0x14, 0x74, 0x58, 0xc7, 0x7b, 0x8a, 0xd0, 0x6b, 0xb6, 0xd2, 0x9c, 0xd9, 0x4f, 0xaa, - 0x28, 0x36, 0x5e, 0x35, 0xc9, 0x1b, 0x5d, 0x8a, 0x06, 0xa4, 0x38, 0x16, 0xa6, 0x38, 0xb5, 0xa0, 0x67, 0x3b, 0x69, 0xd9, 0x14, 0xd3, 0x65, 0x49, 0xbb, 0xbf, 0x27, 0xf2, 0x52, 0x50, 0xaf, 0xcb, - 0xea, 0x25, 0x59, 0x78, 0x0d, 0x24, 0xa5, 0x3e, 0xda, 0xb3, 0xab, 0xb2, 0x69, 0x46, 0x4a, 0x9b, 0x71, 0xbc, 0x61, 0xe7, 0xfb, 0x55, 0x8b, 0x8d, 0xdd, 0xb5, 0x12, 0x08, 0x1c, 0x4a, 0xdf, 0x37, - 0x6f, 0xfe, 0x63, 0xb3, 0xfd, 0xab, 0x7f, 0x10, 0x01, 0x02, 0xb2, 0x80, 0xc4, 0xa9, 0x0f, 0xd6, 0xf5, 0x43, 0xc7, 0x0d, 0x28, 0x86, 0x24, 0xf0, 0xaf, 0xe3, 0x83, 0x8e, 0x36, 0xec, 0x5e, 0x32, - 0x1a, 0x40, 0xc7, 0x75, 0xd8, 0xea, 0x03, 0x45, 0x49, 0xd6, 0x2e, 0x98, 0x15, 0x27, 0x0b, 0x47, 0x12, 0x05, 0xa7, 0x07, 0xe2, 0xef, 0xdc, 0x2d, 0x39, 0xb6, 0xc4, 0xdf, 0xd6, 0x79, 0x29, 0x4b, - 0xc2, 0xc8, 0x95, 0x62, 0x99, 0xae, 0x64, 0x8f, 0x0e, 0x63, 0x04, 0xb2, 0xc7, 0x2a, 0xc7, 0xb6, 0x32, 0xcd, 0xb0, 0xe1, 0x38, 0x67, 0xb8, 0xa5, 0x5a, 0x73, 0x92, 0xd1, 0xf9, 0x12, 0x16, 0xf6, - 0x57, 0x54, 0xeb, 0x2c, 0xfa, 0x4c, 0x4a, 0xcc, 0x8b, 0x03, 0x2f, 0xfb, 0x1c, 0xe1, 0x8b, 0x16, 0x05, 0x11, 0x60, 0x20, 0x03, 0x71, 0x44, 0x7e, 0x20, 0xe0, 0x23, 0x32, 0x40, 0x0c, 0x20, 0xc0, - 0xeb, 0xd5, 0xca, 0x57, 0x54, 0xe2, 0x5a, 0xf2, 0x76, 0x2d, 0xb7, 0x8e, 0x94, 0x35, 0x35, 0x13, 0x0f, 0xc6, 0x94, 0xcb, 0x1a, 0xff, 0x00, 0x90, 0x4a, 0xab, 0x10, 0xf3, 0x5c, 0x95, 0xb0, 0x6e, - 0xa4, 0xbd, 0xfe, 0xb9, 0x16, 0xfc, 0xee, 0xac, 0x21, 0x11, 0x49, 0x7c, 0x30, 0xa1, 0x43, 0x50, 0x2c, 0xa2, 0x43, 0x97, 0x08, 0xff, 0x6b, 0xad, 0xc5, 0x29, 0xf2, 0xcf, 0x6f, 0x7f, 0x82, 0xbc, - 0xef, 0xb2, 0x58, 0x62, 0xf1, 0x3b, 0x57, 0x34, 0x46, 0xd2, 0x71, 0xa2, 0x62, 0x1a, 0x05, 0x70, 0x19, 0xb1, 0xd8, 0xa4, 0x2d, 0xbe, 0x8b, 0xa0, 0xaa, 0xce, 0xcd, 0x54, 0x6f, 0xc8, 0x2d, 0xb4, - 0xf6, 0x83, 0xf4, 0x1f, 0x38, 0xfc, 0xb7, 0x11, 0xff, 0xc3, 0x39, 0x0e, 0x71, 0x08, 0x10, 0x20, 0xe1, 0x07, 0x1b, 0x22, 0x8a, 0x0a, 0x1c, 0x36, 0xa0, 0xe9, 0xd7, 0xa0, 0x1d, 0x89, 0x61, 0xc9, - 0xe8, 0x95, 0xe6, 0x78, 0xe1, 0xd2, 0x0c, 0x94, 0xb0, 0xe1, 0x29, 0xc2, 0x0e, 0x47, 0xe8, 0x69, 0x74, 0xb6, 0xd2, 0xad, 0xf4, 0x18, 0x13, 0xb3, 0x50, 0x37, 0x42, 0x24, 0x28, 0x3f, 0x92, 0xfa, - 0xba, 0xc5, 0xc2, 0xd9, 0x2a, 0xb0, 0xfd, 0xba, 0x5d, 0x85, 0x5b, 0x73, 0x3a, 0x0c, 0xa3, 0xd7, 0x4b, 0x2c, 0x3c, 0x5e, 0xd9, 0x38, 0x56, 0x8b, 0xe2, 0x76, 0xae, 0x6e, 0x03, 0xb8, 0x1b, 0xb6, - 0x7c, 0xa5, 0xf9, 0xed, 0x0f, 0x39, 0x7f, 0xd7, 0xd6, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa2, 0x71, 0x71, 0x33, 0x51, 0x09, 0x00, 0x00, 0xbf, 0x12, 0x00, 0x00, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, - 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x61, - 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x24, 0xcd, 0xb1, 0x4e, 0xec, 0x30, 0x10, 0x85, 0xe1, 0xda, 0xf3, 0x14, 0xbe, 0xae, 0x6c, 0xe9, 0xe2, 0x88, 0x16, 0xb4, 0x1d, 0x8b, 0xe8, 0xf7, 0x09, 0x8c, 0x33, - 0x0e, 0xa3, 0xb5, 0xc7, 0xd1, 0x64, 0x8c, 0x90, 0x56, 0x79, 0x77, 0x94, 0xd0, 0x9d, 0xe2, 0xfb, 0x75, 0xd6, 0x94, 0xef, 0x69, 0x41, 0xdb, 0x12, 0x31, 0x00, 0xb5, 0xb5, 0x8b, 0x5a, 0x0f, 0xc6, - 0x95, 0xa6, 0x0e, 0x8c, 0xeb, 0x9b, 0x03, 0x30, 0x19, 0xad, 0x5b, 0x48, 0xbf, 0xc6, 0x67, 0xcc, 0xbd, 0x4d, 0xf5, 0x4e, 0xbc, 0xd4, 0xc4, 0xf3, 0x54, 0x06, 0xe7, 0x27, 0x19, 0xac, 0xd4, 0x70, - 0x9b, 0x96, 0x3e, 0xe5, 0xda, 0xc7, 0x8c, 0xdf, 0xc8, 0x7a, 0x86, 0xc5, 0xba, 0xe2, 0x20, 0x00, 0x1c, 0xf0, 0x3c, 0xf1, 0xc1, 0x3e, 0xc0, 0x50, 0xb1, 0x28, 0x62, 0x5f, 0x2e, 0x36, 0x63, 0xbc, - 0x69, 0x12, 0xf5, 0x19, 0xe3, 0x1b, 0x96, 0x34, 0xaa, 0x7e, 0x24, 0x9e, 0x2b, 0xca, 0xa3, 0xc4, 0xbf, 0xb5, 0x87, 0xd7, 0x53, 0xff, 0xbb, 0x58, 0xa6, 0x7a, 0xe4, 0xa6, 0x34, 0x8d, 0xef, 0xab, - 0x10, 0x6b, 0x65, 0xdf, 0xb7, 0x78, 0xd3, 0x19, 0x45, 0xfe, 0x1f, 0x2c, 0x5e, 0x45, 0xba, 0xf8, 0x10, 0xc0, 0x98, 0xbe, 0xc5, 0xeb, 0x0f, 0xa9, 0x7f, 0x0e, 0x60, 0x76, 0xd8, 0xe1, 0x37, 0x00, - 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x91, 0xf7, 0x08, 0x22, 0xbe, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, - 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0xd7, 0xd3, 0xd3, 0xcf, 0x28, 0x29, 0x29, 0x00, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x22, 0x3e, 0xf2, 0x8f, 0x10, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, - 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x4c, 0x8c, 0x4b, 0xce, 0xc2, 0x20, 0x18, 0x45, 0xe7, 0xac, 0x82, 0x0d, 0x00, 0x97, 0x47, 0x93, 0xbf, 0x83, 0xdf, 0xbd, 0x54, 0x0a, 0x48, 0xe4, 0xa1, 0xb4, 0x9f, - 0xeb, 0x37, 0x6d, 0x62, 0xf4, 0xdc, 0xe1, 0xb9, 0x39, 0xb5, 0xaf, 0x54, 0x02, 0xdf, 0x18, 0x1b, 0xe1, 0x51, 0x16, 0x1f, 0x78, 0xe4, 0xff, 0x17, 0x2e, 0x55, 0x64, 0x2c, 0x75, 0xae, 0xa5, 0x9e, - 0x0f, 0xf5, 0xa4, 0x3c, 0x0e, 0xf5, 0x82, 0x84, 0x84, 0x00, 0xa0, 0xcf, 0x9d, 0x08, 0xfc, 0xf0, 0x7d, 0xa7, 0xbc, 0xdf, 0xe8, 0x2a, 0x7d, 0xaf, 0xaa, 0xdc, 0x73, 0x4b, 0x65, 0x69, 0xab, 0x8a, - 0xd4, 0xbc, 0x18, 0xd4, 0xf6, 0x5c, 0xc3, 0xa6, 0x52, 0xff, 0x14, 0x0d, 0x8c, 0x85, 0x83, 0xd3, 0x7a, 0x9a, 0xdc, 0x2c, 0x62, 0x30, 0xd6, 0xd9, 0x3f, 0x63, 0xbc, 0xf5, 0xec, 0x1d, 0x00, 0x00, - 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x0f, 0xc9, 0xa2, 0x64, 0x7d, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0xac, 0xd1, 0xcb, 0x6e, 0xa2, 0x50, 0x00, 0x80, 0xe1, 0xfd, 0x3c, 0x45, 0xf7, 0x06, 0xcf, - 0x15, 0xe5, 0x4c, 0x32, 0x0b, 0x6b, 0x29, 0xd3, 0x82, 0xa8, 0x14, 0x0c, 0xb0, 0x83, 0x03, 0x1c, 0x28, 0x97, 0x43, 0xe5, 0x6a, 0x9f, 0x7e, 0xe2, 0x6e, 0x16, 0x5d, 0x11, 0x9f, 0xe0, 0xcb, 0x9f, - 0x5f, 0x14, 0x7d, 0x3e, 0xc4, 0x6b, 0x2e, 0x6b, 0x50, 0x95, 0x45, 0x23, 0xaa, 0xa8, 0x49, 0x40, 0x36, 0x34, 0x5c, 0xb9, 0x0e, 0x4d, 0x5f, 0xd4, 0x69, 0x07, 0x84, 0x7c, 0x1a, 0xe1, 0x1a, 0xae, - 0xa1, 0x82, 0x21, 0x26, 0x90, 0x10, 0x04, 0x31, 0xa2, 0x64, 0xab, 0x44, 0x1a, 0x57, 0xe3, 0x2c, 0x4e, 0xb7, 0x2a, 0x8f, 0x9f, 0x72, 0xf4, 0x5b, 0x5e, 0x2b, 0x77, 0x9e, 0x6f, 0x17, 0xf4, 0xcc, - 0xcc, 0x69, 0xea, 0x0f, 0xf9, 0x5f, 0xe7, 0xd3, 0x38, 0xb5, 0xd7, 0x9e, 0x51, 0x52, 0x38, 0x89, 0x31, 0xcc, 0xc6, 0x8a, 0x41, 0x8f, 0xf4, 0xd1, 0xdb, 0x9f, 0x5f, 0x8f, 0x82, 0x81, 0x90, 0xeb, - 0x5a, 0x26, 0x77, 0x5f, 0xb7, 0x6c, 0xda, 0xb6, 0x51, 0x77, 0x71, 0xbf, 0xb4, 0xd5, 0x34, 0xbe, 0x6c, 0xf8, 0x2c, 0x04, 0x2c, 0xd8, 0xae, 0xca, 0x0e, 0xf4, 0x78, 0x30, 0x3f, 0x61, 0xbf, 0x2f, - 0xeb, 0xe4, 0xe8, 0x87, 0x62, 0xa9, 0xbf, 0xc1, 0x10, 0xa9, 0x0a, 0xc2, 0x1a, 0xcd, 0x18, 0x83, 0x29, 0xe2, 0xd9, 0x1d, 0x76, 0x3d, 0x5d, 0x0e, 0x22, 0xb2, 0x43, 0xea, 0x9d, 0xdd, 0xf6, 0xfc, - 0x01, 0x8c, 0xe9, 0x9d, 0x80, 0xd3, 0xc5, 0xd7, 0xca, 0xb0, 0xee, 0x12, 0x66, 0x5a, 0x65, 0x8a, 0x5f, 0x12, 0x5d, 0x1c, 0xcb, 0xc7, 0xc1, 0xff, 0x85, 0x13, 0xc2, 0x4e, 0xf4, 0x39, 0x02, 0xe1, - 0x5e, 0xf3, 0xe6, 0x40, 0xbb, 0x05, 0x72, 0xe5, 0x97, 0x5f, 0xe3, 0xd8, 0xbc, 0xda, 0x41, 0x6e, 0xf5, 0x36, 0xde, 0x91, 0xbc, 0x35, 0x3b, 0x23, 0xf4, 0x77, 0x4b, 0x7c, 0x0a, 0x29, 0x42, 0xaa, - 0x4a, 0x99, 0x92, 0xa5, 0x98, 0x50, 0xa2, 0x61, 0xcc, 0x09, 0xbf, 0xc3, 0x4e, 0x7a, 0xde, 0x6f, 0x5e, 0x8d, 0x18, 0x38, 0x73, 0xb0, 0xdd, 0xdf, 0x2c, 0x60, 0xfb, 0xa8, 0x92, 0xfe, 0xf6, 0x1b, - 0x54, 0xdd, 0x7b, 0x18, 0x90, 0x7a, 0x68, 0x3e, 0xfc, 0x6f, 0x5d, 0xaf, 0xdf, 0x16, 0x1d, 0xff, 0x19, 0x5e, 0x1a, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x97, 0x5a, 0x0e, - 0x5b, 0x48, 0x01, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, - 0x70, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x24, 0xcc, 0x31, 0x6a, 0xc4, 0x30, 0x10, 0x85, 0xe1, 0x5a, 0x73, 0x0a, 0x45, 0x95, 0x04, 0x89, 0x4c, 0xda, 0x84, 0xed, 0xb2, 0x21, 0xfd, - 0x9e, 0x40, 0xb1, 0x35, 0xde, 0x61, 0xa5, 0x91, 0x19, 0x8f, 0x21, 0x60, 0x7c, 0xf7, 0x20, 0x6f, 0xf7, 0x8a, 0xef, 0xfd, 0x4b, 0x1a, 0x1f, 0x69, 0xce, 0xb6, 0x26, 0x62, 0x00, 0xaa, 0x4b, 0x13, - 0xb5, 0x1e, 0x8c, 0xc3, 0xaa, 0x0e, 0x8c, 0x6b, 0xab, 0x03, 0x30, 0x6e, 0x26, 0xbd, 0x6f, 0xbf, 0x71, 0x6c, 0x75, 0x28, 0x0f, 0xe2, 0xb9, 0x24, 0x9e, 0x06, 0xdc, 0x78, 0x7c, 0x93, 0x8d, 0x95, - 0x6a, 0x5e, 0x87, 0xb9, 0x0d, 0x77, 0xd5, 0xa5, 0x73, 0xb4, 0x0e, 0x1d, 0x04, 0x80, 0x2e, 0xce, 0xb4, 0x0f, 0x76, 0x07, 0x43, 0x68, 0xb3, 0x88, 0xfd, 0xb8, 0xd8, 0x2e, 0xe3, 0x4d, 0x93, 0xa8, - 0x3f, 0xe7, 0x57, 0xc6, 0xb4, 0x15, 0xfd, 0x49, 0x3c, 0x95, 0x2c, 0x3b, 0xc6, 0xe7, 0x3a, 0xc2, 0xe7, 0xf9, 0x78, 0xb9, 0x58, 0xa6, 0xd2, 0x13, 0x06, 0xab, 0xc6, 0xef, 0x45, 0x88, 0xb5, 0xb0, - 0x6f, 0x6b, 0xbc, 0xe9, 0x94, 0x45, 0x5e, 0x3b, 0x8b, 0x57, 0x91, 0x26, 0x3e, 0x04, 0x30, 0xa6, 0xad, 0xf1, 0xfa, 0x47, 0xea, 0xdf, 0x03, 0x98, 0x03, 0x0e, 0xf8, 0x0f, 0x00, 0x00, 0xff, 0xff, - 0x50, 0x4b, 0x07, 0x08, 0x12, 0x31, 0x0b, 0x58, 0xb7, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x54, 0x8e, 0xc1, 0xaa, 0xc2, - 0x30, 0x14, 0x44, 0xf7, 0xf9, 0x8a, 0x81, 0x6e, 0x1f, 0xa5, 0x6f, 0xdb, 0xef, 0x50, 0x70, 0x27, 0x97, 0x66, 0xd2, 0x04, 0x9b, 0x9b, 0x92, 0x9b, 0x2a, 0xfd, 0x7b, 0xd1, 0xea, 0xc2, 0xed, 0x70, - 0x66, 0xe6, 0xd8, 0x14, 0x99, 0xe5, 0x7a, 0x67, 0xb5, 0x54, 0x74, 0xc4, 0xd0, 0x0f, 0xfd, 0x3f, 0x3a, 0x9c, 0x22, 0xf1, 0x09, 0x11, 0x4a, 0x45, 0x16, 0x4d, 0x81, 0xd6, 0xfa, 0x5d, 0xf2, 0x82, - 0xa3, 0xe5, 0xdc, 0xc1, 0xa9, 0x64, 0x62, 0x33, 0xfa, 0x37, 0xd9, 0x62, 0x32, 0x2c, 0xa2, 0xf3, 0x26, 0x33, 0xb1, 0xca, 0x74, 0x43, 0xe5, 0x5a, 0x2c, 0xb5, 0x52, 0x77, 0x3c, 0x22, 0x15, 0x95, - 0x81, 0x95, 0x3a, 0xd1, 0xbb, 0x0e, 0x49, 0xd1, 0x22, 0x71, 0xbe, 0xfc, 0x41, 0xd4, 0x23, 0x35, 0xfb, 0x1e, 0xbb, 0xd7, 0xf0, 0x08, 0xcf, 0x20, 0xdb, 0xd2, 0xdc, 0xaf, 0xa3, 0x7b, 0x06, 0x00, - 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4a, 0xc6, 0x88, 0x52, 0x88, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, - 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xac, 0x58, 0x6d, - 0x53, 0x1c, 0xb9, 0x11, 0xfe, 0x3e, 0xbf, 0xa2, 0x03, 0x1f, 0x0c, 0xd4, 0x32, 0x8b, 0x7d, 0xb9, 0xc4, 0x59, 0xdf, 0x99, 0xb2, 0x89, 0x53, 0x70, 0xa1, 0x6c, 0x17, 0x70, 0x71, 0x52, 0x84, 0xca, - 0x68, 0x47, 0xbd, 0x8c, 0x40, 0x23, 0x4d, 0x24, 0xcd, 0xae, 0x27, 0xe7, 0xfb, 0xef, 0xa9, 0x6e, 0xcd, 0xdb, 0xbe, 0x70, 0x17, 0x57, 0xee, 0x13, 0x8b, 0xd4, 0x6a, 0x3d, 0xdd, 0xfd, 0xf4, 0x8b, - 0x66, 0x1f, 0xde, 0x5b, 0x89, 0xe9, 0x83, 0x87, 0x33, 0x6d, 0x6b, 0x09, 0xef, 0x96, 0x68, 0x82, 0x87, 0xbf, 0xd4, 0x26, 0x0f, 0xca, 0x9a, 0x24, 0xf9, 0x84, 0x3a, 0xb7, 0x25, 0x42, 0xb0, 0xd0, - 0xd8, 0xda, 0x81, 0xc1, 0x55, 0x7f, 0x64, 0xd1, 0x4a, 0x41, 0xe5, 0xec, 0x03, 0xe6, 0xe1, 0x77, 0x70, 0x53, 0x20, 0xcc, 0xad, 0xd2, 0xe8, 0x2a, 0x2d, 0x02, 0xf6, 0x12, 0x49, 0x6e, 0x25, 0x42, - 0x2e, 0x0c, 0xcc, 0x11, 0x16, 0xb6, 0x36, 0x12, 0x94, 0x81, 0xdb, 0x4c, 0x19, 0x89, 0x9f, 0xd3, 0x07, 0x9f, 0xdd, 0x1d, 0xa4, 0xd3, 0xee, 0x9f, 0xc3, 0x14, 0x6e, 0x0a, 0x35, 0x52, 0xaf, 0x3c, - 0x94, 0x28, 0x4c, 0x48, 0x82, 0x05, 0x87, 0xbe, 0xb2, 0x46, 0x12, 0x9e, 0xdb, 0x31, 0xe4, 0xbb, 0x83, 0x22, 0x84, 0xca, 0xcf, 0xa6, 0xd3, 0x9c, 0x56, 0x91, 0x17, 0x53, 0x65, 0xa7, 0x87, 0x69, - 0x92, 0xec, 0xef, 0xc3, 0xa5, 0xcd, 0x85, 0x06, 0xfc, 0x8c, 0x79, 0x1d, 0x0d, 0x7b, 0xb3, 0x08, 0xe8, 0xba, 0x05, 0x73, 0x0f, 0x99, 0xa9, 0x4a, 0x50, 0xc6, 0x07, 0xa1, 0x75, 0x36, 0x21, 0x63, - 0x19, 0xaf, 0xab, 0x0d, 0x84, 0x35, 0x34, 0x9a, 0x34, 0xe9, 0x06, 0xe6, 0xcd, 0x70, 0x3a, 0xe1, 0xd3, 0x24, 0xcb, 0xbb, 0x59, 0x9a, 0x24, 0xe4, 0x0a, 0x57, 0x9b, 0xa0, 0x4a, 0x84, 0x95, 0xd2, - 0x74, 0x77, 0x65, 0x3d, 0x42, 0x28, 0x1c, 0x22, 0xa0, 0x91, 0x95, 0x55, 0x04, 0x31, 0x49, 0x00, 0x8e, 0x20, 0x9b, 0x66, 0xec, 0xbc, 0x6e, 0x1d, 0x16, 0xd6, 0x45, 0x87, 0x77, 0xf7, 0xa6, 0xad, - 0x5c, 0x81, 0x42, 0x87, 0x62, 0xea, 0x50, 0x48, 0x65, 0xd0, 0xfb, 0x1d, 0xe7, 0x04, 0xf4, 0xbb, 0x10, 0xc5, 0x21, 0x2f, 0x30, 0x7f, 0x5c, 0xd7, 0xa0, 0xd5, 0x12, 0x9f, 0x54, 0xd0, 0x6d, 0xae, - 0x9f, 0x67, 0xa3, 0xc6, 0x2b, 0xbe, 0x8b, 0xa9, 0xc8, 0x73, 0xf4, 0x1e, 0x39, 0xac, 0x0c, 0x7b, 0xee, 0xec, 0xca, 0xa3, 0x03, 0x11, 0x92, 0x5b, 0x8a, 0xcc, 0x6c, 0x3a, 0x65, 0xd7, 0x14, 0xd6, - 0x87, 0xd9, 0xcb, 0x93, 0x97, 0x27, 0x5b, 0x86, 0xdc, 0x1d, 0x1c, 0x82, 0x30, 0xf2, 0x57, 0xc4, 0x3b, 0x60, 0x77, 0x07, 0x87, 0x29, 0xfc, 0xa3, 0x0d, 0x52, 0xed, 0x11, 0xb2, 0xbc, 0x76, 0x3a, - 0x23, 0x5e, 0x64, 0x1f, 0x3f, 0x5c, 0xdf, 0x64, 0x20, 0x0c, 0x30, 0x0b, 0x88, 0x35, 0xa1, 0x18, 0xb8, 0xd8, 0x9b, 0x3a, 0x4b, 0x92, 0x2c, 0xcb, 0x72, 0x6b, 0xbc, 0xd5, 0x98, 0xd0, 0x71, 0x38, - 0xfe, 0x3b, 0xd0, 0x61, 0x38, 0x96, 0xf0, 0xec, 0xa7, 0x3d, 0x23, 0x4a, 0xdc, 0x9b, 0xc1, 0xde, 0x8d, 0xba, 0x47, 0xb7, 0x37, 0x81, 0xbd, 0xbc, 0xf6, 0xc1, 0x96, 0xe8, 0x2e, 0x24, 0x2d, 0x9f, - 0x3c, 0x7f, 0xf1, 0xcd, 0xef, 0xbf, 0xfd, 0xc3, 0x1f, 0x5f, 0xfe, 0x69, 0xef, 0xe7, 0x67, 0xf0, 0xcf, 0x04, 0xe0, 0xf8, 0xfc, 0xd9, 0x99, 0x35, 0x01, 0x4d, 0x38, 0x0e, 0x4d, 0x85, 0x33, 0x10, - 0x55, 0xa5, 0x55, 0x2e, 0xe8, 0xda, 0xe9, 0x83, 0xb7, 0x66, 0x10, 0xc3, 0x63, 0x25, 0x67, 0xf0, 0x7c, 0xbc, 0xe0, 0x6d, 0xed, 0x72, 0x9c, 0x01, 0x13, 0xf8, 0x98, 0xb1, 0x1f, 0xe3, 0x67, 0x51, - 0x56, 0x1a, 0xc7, 0x62, 0x51, 0xb3, 0xc4, 0x65, 0xfa, 0x68, 0x44, 0x50, 0x4b, 0x4c, 0x77, 0x08, 0xf9, 0x0a, 0xf3, 0x25, 0x3a, 0xaf, 0xac, 0x99, 0xc1, 0xf3, 0xf4, 0x24, 0xee, 0xed, 0xf4, 0x2c, - 0x39, 0xa1, 0xa5, 0x6b, 0xcf, 0x1a, 0x61, 0xe4, 0x40, 0x81, 0x9e, 0xab, 0xe4, 0xe7, 0xe4, 0xd6, 0x2e, 0xd1, 0x69, 0x2b, 0xe4, 0x71, 0xe5, 0x6c, 0x40, 0x76, 0xe9, 0x90, 0x7c, 0xab, 0xd5, 0x2a, - 0x35, 0x55, 0xf9, 0xe0, 0xd3, 0xdc, 0x96, 0xd3, 0x4a, 0xe4, 0x8f, 0xe2, 0x1e, 0xa7, 0x3b, 0x8e, 0xc4, 0x58, 0x73, 0x62, 0x74, 0x29, 0xbd, 0x52, 0xa1, 0x80, 0xec, 0xfc, 0xe6, 0xe6, 0x23, 0x7c, - 0x7b, 0xf2, 0x0d, 0x5c, 0xa3, 0x5b, 0xaa, 0x1c, 0xe1, 0x47, 0x23, 0x96, 0x42, 0x69, 0x31, 0xd7, 0x98, 0x45, 0x19, 0x01, 0xd9, 0x99, 0x56, 0xe4, 0x9e, 0x2b, 0x0c, 0xae, 0xc9, 0x88, 0x92, 0x12, - 0x1d, 0xa8, 0x45, 0xb2, 0x96, 0x32, 0x54, 0x38, 0x24, 0x06, 0x74, 0xa5, 0x32, 0xc8, 0x25, 0x63, 0x8e, 0xd0, 0x61, 0x41, 0x39, 0x81, 0xb9, 0x20, 0xca, 0x5a, 0xc3, 0xfc, 0x28, 0xb1, 0xb4, 0xae, - 0x81, 0xda, 0x8b, 0x7b, 0x64, 0x70, 0x1c, 0x01, 0xd0, 0xd6, 0x56, 0x20, 0x51, 0x8b, 0x26, 0x16, 0x12, 0x72, 0x54, 0x57, 0x1e, 0xe1, 0xc2, 0x04, 0x74, 0x0b, 0x91, 0x63, 0x74, 0xe0, 0x50, 0xcf, - 0x60, 0xa1, 0x34, 0x42, 0x29, 0x1a, 0x4e, 0x7b, 0x17, 0x40, 0x80, 0x57, 0xe6, 0x5e, 0x8f, 0x68, 0xc8, 0x79, 0x96, 0x75, 0xaa, 0xb2, 0xc4, 0xce, 0xa9, 0x86, 0xa6, 0x7c, 0xc1, 0xb0, 0x0c, 0x71, - 0x19, 0x84, 0xd6, 0x76, 0x45, 0xe6, 0x2c, 0x51, 0xdb, 0x0a, 0x9d, 0x27, 0x73, 0x84, 0xa4, 0x30, 0x2d, 0x30, 0x6f, 0x72, 0x8d, 0x50, 0x58, 0xfb, 0xe8, 0x29, 0x7f, 0x13, 0x65, 0x54, 0x50, 0x42, - 0xab, 0xff, 0x30, 0xf3, 0x38, 0x9a, 0xbe, 0xa8, 0x83, 0xb4, 0x2b, 0x33, 0x01, 0xe1, 0x61, 0x85, 0x5a, 0xd3, 0xdf, 0xca, 0xd9, 0xa5, 0x92, 0x54, 0xfd, 0x04, 0xac, 0x44, 0x43, 0x2a, 0x15, 0x31, - 0xa9, 0x24, 0xc3, 0x23, 0xd9, 0x93, 0xb5, 0x74, 0x6f, 0xeb, 0xda, 0x08, 0x9e, 0xea, 0x3c, 0x10, 0x9d, 0xbd, 0x60, 0x4f, 0x0b, 0x1f, 0x73, 0x8b, 0xa8, 0xea, 0x73, 0xa7, 0xaa, 0x90, 0xb4, 0x6e, - 0x18, 0xc4, 0x7b, 0x1f, 0xfe, 0x94, 0x00, 0x4c, 0xa7, 0x6c, 0xf6, 0x06, 0xee, 0xce, 0x55, 0x13, 0xa0, 0x8a, 0x8b, 0x12, 0xe6, 0xb8, 0xb0, 0x0e, 0x39, 0x5a, 0x1e, 0xdd, 0x92, 0x42, 0xee, 0xc1, - 0x07, 0xe1, 0x02, 0xca, 0x4e, 0xcb, 0x46, 0xe3, 0xb0, 0x15, 0xfd, 0x12, 0xba, 0x75, 0x82, 0xad, 0x35, 0xa9, 0x01, 0xdf, 0x98, 0xbc, 0x70, 0xd6, 0xd8, 0xda, 0x53, 0x61, 0xa5, 0x8b, 0x4f, 0x67, - 0x70, 0x70, 0x08, 0xdf, 0xbf, 0x06, 0x61, 0x9a, 0x57, 0xc9, 0x00, 0xaa, 0xf3, 0xdc, 0x36, 0x1c, 0xc1, 0x2d, 0x64, 0x13, 0x8d, 0xad, 0xaa, 0xff, 0x13, 0x4d, 0x77, 0xe3, 0x53, 0x88, 0xfa, 0xcc, - 0xdc, 0x42, 0x14, 0x6c, 0x0c, 0x14, 0xa8, 0xc5, 0x06, 0x2e, 0x41, 0x87, 0xbe, 0x02, 0x95, 0xc3, 0x50, 0x3b, 0x03, 0x2f, 0x4e, 0x4e, 0xa6, 0x1f, 0xfe, 0xfa, 0x84, 0x3a, 0xc2, 0xda, 0x61, 0x39, - 0x9d, 0xc1, 0x39, 0x33, 0xe5, 0x8c, 0xee, 0x1f, 0xa3, 0x1d, 0xaa, 0xca, 0x57, 0xc0, 0xa5, 0x43, 0xcc, 0x47, 0x6a, 0x2c, 0x55, 0x00, 0x87, 0xff, 0xae, 0xd1, 0x07, 0xff, 0xdb, 0x59, 0xc0, 0x37, - 0x90, 0x05, 0x3d, 0xbe, 0x1d, 0x26, 0x68, 0x7b, 0x7f, 0x49, 0x19, 0x77, 0x3a, 0x83, 0xcb, 0xf6, 0xe7, 0xd8, 0xb4, 0x1e, 0x42, 0xb0, 0x50, 0x08, 0x23, 0x35, 0x02, 0x97, 0xaf, 0x11, 0xda, 0xb8, - 0x3c, 0x8b, 0xe3, 0x15, 0x8f, 0x2a, 0x3d, 0xf1, 0xbf, 0xb0, 0x70, 0xf7, 0xef, 0xab, 0xe4, 0xe7, 0x58, 0x89, 0xf7, 0xf7, 0xe1, 0x3c, 0xea, 0xba, 0x56, 0xf7, 0x46, 0x84, 0xda, 0x61, 0x92, 0x0c, - 0xc7, 0xfb, 0x4b, 0x3d, 0x08, 0x87, 0x54, 0x92, 0xb9, 0xe9, 0xa2, 0x59, 0x2a, 0x67, 0x4d, 0xc9, 0xe3, 0xdb, 0xaa, 0xc0, 0x36, 0x4d, 0x94, 0xc9, 0x6d, 0x49, 0x09, 0x3e, 0xc6, 0xc5, 0x01, 0x1c, - 0x21, 0x4a, 0xd7, 0x8d, 0xf1, 0xdd, 0xb5, 0xa0, 0xb6, 0xf3, 0x78, 0x48, 0xe0, 0x1d, 0x16, 0x51, 0x2a, 0x1f, 0xe4, 0xd4, 0x01, 0x3f, 0x87, 0x19, 0x9c, 0xc5, 0x1f, 0x93, 0xd8, 0x86, 0xc7, 0x2e, - 0x38, 0xdc, 0xe5, 0x8f, 0x2b, 0x8e, 0x57, 0xef, 0x86, 0x4f, 0xbd, 0x0d, 0x6d, 0x20, 0x09, 0xc4, 0xaf, 0x14, 0x19, 0x16, 0x79, 0x4a, 0x33, 0x7c, 0x0f, 0x1f, 0x9d, 0x2d, 0x95, 0xc7, 0xef, 0x06, - 0x91, 0xd7, 0xf0, 0x65, 0x74, 0x60, 0x23, 0x24, 0x1d, 0x22, 0x56, 0xbb, 0xbd, 0x31, 0x52, 0x78, 0x1d, 0x5c, 0x9d, 0x93, 0xcb, 0x64, 0xdc, 0x22, 0xb5, 0x9b, 0x6b, 0xf0, 0x05, 0xae, 0xb8, 0xd3, - 0x79, 0x7c, 0x6b, 0x65, 0x03, 0x5f, 0x60, 0x69, 0x95, 0x7c, 0x35, 0xb4, 0xdf, 0x3e, 0x00, 0x63, 0x83, 0xbb, 0xf9, 0xca, 0x34, 0xa1, 0xa0, 0x38, 0x86, 0x42, 0xc4, 0x66, 0x42, 0x75, 0x3a, 0x46, - 0xb5, 0x3f, 0xc7, 0xf3, 0x6a, 0x3c, 0xcb, 0xcd, 0x65, 0x1c, 0xe1, 0x4f, 0x85, 0x08, 0xd8, 0x53, 0x9f, 0x64, 0xa8, 0x01, 0xaa, 0x10, 0x67, 0x53, 0xaa, 0x41, 0x64, 0xff, 0x5c, 0xe4, 0x8f, 0xd0, - 0xce, 0x4b, 0x9c, 0xa3, 0x8e, 0xda, 0x84, 0x68, 0x5b, 0xb4, 0xc7, 0x74, 0x1c, 0x97, 0x6c, 0xd3, 0xc2, 0x2c, 0x12, 0xeb, 0x07, 0xb1, 0x14, 0xd7, 0x1c, 0x90, 0xae, 0x79, 0x71, 0xd7, 0xe6, 0x19, - 0xcc, 0x52, 0x1b, 0x23, 0x3b, 0x2a, 0x47, 0x5d, 0x2c, 0x28, 0xfc, 0x25, 0x8a, 0x6d, 0xb9, 0x90, 0x08, 0xe6, 0x83, 0x08, 0xb5, 0x3f, 0xb3, 0x12, 0x4f, 0x67, 0x60, 0xea, 0x72, 0x8e, 0xee, 0x15, - 0x25, 0x1a, 0xcf, 0x00, 0x94, 0xc4, 0x57, 0x98, 0x5b, 0x27, 0xbf, 0xf3, 0xc1, 0x29, 0x73, 0x3f, 0x81, 0xf8, 0xf7, 0x35, 0xc9, 0xcc, 0xad, 0x6c, 0x58, 0x60, 0x08, 0x43, 0xcf, 0xb7, 0x8b, 0xc5, - 0xfa, 0x94, 0x18, 0x9d, 0x44, 0xf6, 0xec, 0xb0, 0x33, 0xda, 0x35, 0xa1, 0x13, 0x71, 0x78, 0xc8, 0x06, 0x54, 0x19, 0x17, 0xa1, 0xac, 0xc5, 0x93, 0x8d, 0x2c, 0x1d, 0x12, 0x96, 0x0a, 0x9f, 0x35, - 0x9e, 0xf5, 0xf2, 0xf9, 0x36, 0x3d, 0x5b, 0x2f, 0x43, 0x0b, 0x26, 0x23, 0xc0, 0xbd, 0x86, 0x86, 0xdc, 0x5b, 0x39, 0xa4, 0x48, 0x71, 0xe8, 0x94, 0x8f, 0xda, 0x84, 0x6f, 0xf3, 0x24, 0x1e, 0x67, - 0x33, 0x7b, 0x1d, 0x5b, 0x06, 0x65, 0x44, 0xbb, 0x8c, 0x18, 0x92, 0xd5, 0xa6, 0x4d, 0xa6, 0x6c, 0x64, 0xca, 0x9a, 0x1a, 0xba, 0x03, 0xcb, 0x2a, 0x34, 0x5d, 0xe7, 0x1f, 0xfb, 0x8e, 0xe3, 0x8d, - 0x2a, 0x14, 0x44, 0x13, 0xe8, 0xfc, 0xbd, 0x83, 0x00, 0x93, 0xc8, 0xc7, 0xb7, 0xf5, 0x62, 0x81, 0x2e, 0xdd, 0xde, 0xf7, 0x23, 0x16, 0x3a, 0x1e, 0x00, 0xa2, 0x55, 0x3f, 0x5c, 0x7f, 0x78, 0x9f, - 0xb6, 0xc7, 0xfc, 0x3a, 0x53, 0x85, 0x87, 0xb9, 0x32, 0xc2, 0x35, 0x20, 0x45, 0x10, 0x3c, 0x9a, 0xed, 0xb7, 0xe5, 0x1b, 0xb8, 0x7e, 0xfb, 0x5f, 0x18, 0x55, 0x84, 0xf6, 0xb6, 0x9b, 0xa8, 0xe8, - 0xbd, 0x43, 0x66, 0x0b, 0x29, 0x15, 0xfb, 0xc9, 0x2e, 0x28, 0xe6, 0xc3, 0xeb, 0x88, 0xa3, 0x39, 0x7a, 0x6e, 0xf5, 0x0f, 0x32, 0xaa, 0x9a, 0x1e, 0x77, 0xd5, 0xe3, 0xb5, 0x39, 0x6a, 0xfd, 0xbd, - 0xd4, 0x5d, 0xb7, 0xa6, 0x65, 0x7c, 0xdd, 0xb8, 0xad, 0x3d, 0xd1, 0x26, 0xc7, 0x22, 0xb1, 0x11, 0x47, 0x25, 0x3b, 0x40, 0xfe, 0x8f, 0x5a, 0x9e, 0x6a, 0xb7, 0xcc, 0xa2, 0x36, 0xc2, 0x96, 0x8f, - 0xad, 0x19, 0x3c, 0xe4, 0x88, 0xb1, 0xe6, 0xf8, 0xc5, 0xc9, 0x49, 0x9b, 0x9c, 0x40, 0xcf, 0xfd, 0x11, 0xa5, 0xd6, 0xd0, 0x58, 0xe3, 0x95, 0x44, 0x87, 0x12, 0x6a, 0x13, 0x7d, 0x43, 0xe4, 0x7a, - 0xb3, 0xe6, 0xa7, 0x8d, 0x11, 0xfe, 0xc9, 0x82, 0x3f, 0x3d, 0x3a, 0x4a, 0xe0, 0x88, 0xad, 0x1f, 0xb5, 0xee, 0x51, 0xa4, 0x25, 0x4b, 0xce, 0x29, 0xf7, 0x76, 0x5f, 0x30, 0xa1, 0xf3, 0xca, 0xe4, - 0xba, 0x96, 0xb1, 0xbc, 0xe2, 0x30, 0x4c, 0x54, 0x82, 0xca, 0x96, 0x85, 0x55, 0xa1, 0xf2, 0x82, 0x12, 0x6e, 0x98, 0xd8, 0xe6, 0xb6, 0x36, 0x32, 0x4d, 0xe0, 0x68, 0xba, 0x3d, 0xd9, 0x8e, 0x91, - 0x70, 0x47, 0x6c, 0xbd, 0x39, 0x83, 0xf3, 0x10, 0xaa, 0x17, 0xd7, 0x3c, 0x82, 0x5c, 0xc5, 0xb5, 0x09, 0x38, 0xac, 0x74, 0xb3, 0xb1, 0x15, 0x53, 0xec, 0x70, 0x16, 0x07, 0x3f, 0x60, 0x20, 0xa7, - 0xb3, 0x36, 0xc3, 0xfa, 0x8a, 0xf5, 0xb6, 0x21, 0xd7, 0x88, 0x5a, 0xc7, 0x42, 0xb4, 0x41, 0x34, 0x22, 0x23, 0xa3, 0xec, 0xea, 0xf9, 0x8e, 0x87, 0x3f, 0x53, 0x7b, 0xc7, 0x17, 0x05, 0xba, 0xcf, - 0x0f, 0xcf, 0x6b, 0x7a, 0x32, 0x39, 0x25, 0x31, 0x7e, 0x08, 0x99, 0x37, 0xe0, 0x31, 0x84, 0xce, 0x5b, 0x19, 0x09, 0x8f, 0x6a, 0x54, 0xfb, 0x9a, 0xca, 0x46, 0x5e, 0xc8, 0xc6, 0x65, 0x60, 0xf3, - 0xf8, 0xe5, 0xc5, 0xdf, 0xde, 0xbd, 0x7f, 0x77, 0x7d, 0xfd, 0xaf, 0x1f, 0xaf, 0x2e, 0x5b, 0x44, 0x57, 0xef, 0xde, 0xfc, 0xf9, 0x62, 0x58, 0x1b, 0x8d, 0x36, 0xb0, 0x14, 0x4e, 0xd1, 0x4b, 0xd0, - 0xb7, 0x8f, 0x31, 0xf4, 0xfc, 0xf9, 0x25, 0x59, 0x9f, 0x08, 0xdb, 0xef, 0x51, 0x6d, 0x5c, 0x39, 0xf8, 0xb7, 0xb5, 0x51, 0x01, 0x02, 0xfa, 0x70, 0x77, 0x90, 0x4e, 0xe9, 0xef, 0x94, 0x56, 0xd2, - 0x07, 0xcf, 0x2f, 0x51, 0x10, 0x26, 0xb9, 0xa5, 0x10, 0xde, 0xbb, 0xf8, 0xf6, 0x58, 0x93, 0x1c, 0x6d, 0xc4, 0xef, 0x53, 0x6f, 0xb4, 0x86, 0xac, 0x7f, 0xe7, 0x79, 0x1a, 0xc0, 0xc8, 0x18, 0x12, - 0x06, 0xa9, 0x1c, 0xe6, 0xc1, 0xba, 0x26, 0xa1, 0x10, 0xb8, 0xda, 0xa4, 0x6b, 0xdf, 0x19, 0x4c, 0x55, 0xb2, 0x1c, 0xc7, 0xf0, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd2, - 0x2f, 0x9b, 0xc5, 0x5e, 0x07, 0x00, 0x00, 0x7f, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, - 0x6a, 0x73, 0x8c, 0x53, 0x41, 0x6f, 0xdb, 0x3c, 0x0c, 0xbd, 0xfb, 0x57, 0x3c, 0xf4, 0x3b, 0x38, 0x29, 0x5c, 0xfb, 0x9e, 0x20, 0x1f, 0x06, 0x74, 0x01, 0xba, 0x53, 0x87, 0xae, 0x1b, 0xd0, 0xa3, - 0x22, 0x31, 0x91, 0x5a, 0x5b, 0x74, 0x25, 0x39, 0x69, 0x16, 0xe4, 0xbf, 0x0f, 0xb2, 0x1c, 0x2f, 0xc1, 0x86, 0x60, 0x27, 0x1b, 0x8f, 0x7c, 0x8f, 0x8f, 0x22, 0x29, 0xd9, 0xfa, 0x80, 0x03, 0xee, - 0x6b, 0xee, 0xd4, 0x72, 0x4b, 0x36, 0xe0, 0x88, 0x05, 0x1c, 0xbd, 0x77, 0xc6, 0xd1, 0x24, 0x97, 0x11, 0xa7, 0x88, 0xfb, 0x7c, 0x3a, 0xcf, 0xb2, 0xea, 0xf6, 0x36, 0xc3, 0x2d, 0x5e, 0xb8, 0x73, - 0xe7, 0x1c, 0x2d, 0xac, 0xaa, 0x8d, 0xdd, 0x60, 0xdd, 0x59, 0x19, 0x0c, 0xdb, 0x02, 0xc6, 0x6e, 0xf9, 0x8d, 0x14, 0x76, 0x26, 0x68, 0x90, 0x90, 0xba, 0x17, 0x25, 0x1f, 0xca, 0x28, 0xf0, 0xac, - 0x8d, 0x07, 0x7d, 0x88, 0xa6, 0xad, 0x69, 0x24, 0xa1, 0xe6, 0x8d, 0x87, 0x09, 0x1e, 0xc6, 0xb6, 0x5d, 0x28, 0x20, 0xac, 0x82, 0x23, 0xdf, 0xb2, 0x55, 0x3e, 0x09, 0x89, 0xb3, 0xaa, 0x51, 0x67, - 0xa7, 0x8d, 0xd4, 0x20, 0xa9, 0x99, 0x3c, 0x82, 0x26, 0x18, 0x2b, 0xb9, 0x89, 0x4e, 0x7a, 0xd3, 0x50, 0x22, 0x88, 0x0c, 0xbd, 0xe7, 0x2f, 0x01, 0x52, 0x58, 0xac, 0xe8, 0xd2, 0x5a, 0x1e, 0xab, - 0x0f, 0x50, 0x7e, 0x99, 0x17, 0xc8, 0x87, 0x31, 0xcd, 0xb6, 0x4d, 0x0f, 0xe4, 0x83, 0xdc, 0xa7, 0x56, 0x38, 0xd1, 0xe0, 0x70, 0xcf, 0x36, 0xd0, 0x47, 0x38, 0x42, 0xa6, 0x1f, 0x88, 0xf1, 0x8f, - 0x57, 0xaf, 0x24, 0x53, 0xbf, 0xa7, 0xec, 0x04, 0x8d, 0xc9, 0xe5, 0x8a, 0xd5, 0xbe, 0xf7, 0x3d, 0x3c, 0x0e, 0x7a, 0xc0, 0xac, 0x21, 0xec, 0xfe, 0x1a, 0xef, 0xbd, 0x23, 0x97, 0x88, 0xe9, 0xcf, - 0x07, 0x17, 0x9b, 0x56, 0xe4, 0xc9, 0x19, 0x51, 0xff, 0x24, 0x05, 0xe1, 0x21, 0xec, 0xe0, 0xa1, 0xf8, 0x07, 0xc9, 0x9a, 0x37, 0x71, 0x00, 0x9b, 0xa8, 0x93, 0x62, 0xa9, 0xf3, 0x86, 0x82, 0x66, - 0xe5, 0xb1, 0x66, 0x87, 0xdc, 0xd8, 0x35, 0xe7, 0x05, 0xf2, 0x9d, 0x70, 0x36, 0x7e, 0xc9, 0x39, 0x76, 0x79, 0x01, 0x0a, 0xf2, 0x6a, 0x9f, 0x9a, 0x84, 0x22, 0x97, 0x46, 0xf4, 0xf0, 0xfc, 0xfc, - 0x75, 0xec, 0x77, 0x08, 0x9c, 0x73, 0x53, 0x2f, 0xbf, 0xb9, 0xc9, 0xc0, 0x9f, 0xd4, 0x84, 0x5f, 0x63, 0xea, 0x10, 0xda, 0x1f, 0xe4, 0x7c, 0xdc, 0xad, 0x91, 0xde, 0x3a, 0x0e, 0x2c, 0xb9, 0xc6, - 0x36, 0x45, 0xa2, 0xc0, 0x37, 0xa2, 0x19, 0x62, 0xb6, 0x9f, 0x55, 0xd5, 0xc6, 0x04, 0xdd, 0xad, 0x4a, 0xc9, 0x4d, 0xf5, 0x66, 0x45, 0x30, 0x5b, 0xaa, 0xe2, 0x8e, 0x54, 0xab, 0x9a, 0x57, 0x55, - 0x23, 0x8c, 0xad, 0x14, 0x4b, 0x5f, 0x9d, 0xb6, 0xf6, 0x2e, 0xde, 0x47, 0xcd, 0x2d, 0x39, 0x5f, 0x59, 0x56, 0xf4, 0xea, 0xcb, 0x46, 0xfd, 0x17, 0x34, 0xdd, 0x0d, 0x36, 0xee, 0xd2, 0x63, 0x5c, - 0x2c, 0xcd, 0xb8, 0xc4, 0xc7, 0x61, 0x51, 0xa3, 0xbd, 0x8b, 0xd5, 0xae, 0xb2, 0x74, 0x9b, 0xfd, 0x69, 0x11, 0x16, 0x10, 0x7e, 0x6f, 0x25, 0x26, 0x83, 0x68, 0x91, 0x78, 0x53, 0x2c, 0xfe, 0xc7, - 0x21, 0x03, 0xaa, 0x0a, 0x2f, 0x8f, 0xdf, 0x9f, 0x70, 0xff, 0xf8, 0x79, 0x89, 0x87, 0xe5, 0xd3, 0x32, 0xc3, 0xf9, 0x64, 0xcb, 0x38, 0xb8, 0xc9, 0xcd, 0x80, 0xdc, 0x14, 0xa7, 0xd8, 0x74, 0xfe, - 0xd7, 0xbc, 0x5e, 0xfb, 0xe6, 0x54, 0x63, 0x9e, 0x65, 0x80, 0xa3, 0xd0, 0x39, 0x0b, 0x4b, 0xbb, 0x33, 0x9f, 0x93, 0x58, 0x1a, 0xf0, 0xdc, 0x39, 0x49, 0x33, 0xe4, 0x7d, 0x7e, 0x99, 0x2c, 0xbb, - 0xbc, 0xe8, 0x83, 0x61, 0xdf, 0xf6, 0x21, 0xa9, 0x79, 0x40, 0xe2, 0x51, 0xce, 0x92, 0x76, 0x99, 0x0e, 0x14, 0xc7, 0xe9, 0x3c, 0x3b, 0xce, 0xb3, 0xac, 0x61, 0xd5, 0xd5, 0x54, 0xd2, 0x47, 0xcb, - 0x2e, 0x78, 0x2c, 0x70, 0x38, 0x3d, 0xc0, 0x71, 0x9e, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x18, 0x36, 0x8b, 0x30, 0x2d, 0x02, 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, - 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, - 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, - 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, - 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, - 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, - 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, - 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, - 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xbd, 0x57, 0x73, 0xfb, 0xda, 0xb2, 0x1f, 0xf8, 0xee, - 0x4f, 0xb1, 0xeb, 0xff, 0x68, 0x98, 0x7f, 0x22, 0x03, 0xbc, 0x35, 0xf7, 0xd6, 0x80, 0x04, 0x48, 0x30, 0x02, 0x20, 0x32, 0xa6, 0xbc, 0xa7, 0x90, 0x03, 0x91, 0x13, 0x49, 0x8c, 0x7d, 0x3e, 0xfb, - 0x14, 0x83, 0x24, 0x52, 0xa2, 0x24, 0x88, 0x7b, 0xdb, 0xc7, 0xc7, 0xe5, 0x27, 0x21, 0xf1, 0x07, 0xa1, 0xbb, 0x57, 0xaf, 0x4e, 0xab, 0xd7, 0xff, 0xf7, 0x9f, 0xfe, 0xf8, 0xe3, 0x57, 0x6a, 0x26, - 0xee, 0xaf, 0x7f, 0xfb, 0xe3, 0x97, 0xdb, 0xba, 0x69, 0x3d, 0x08, 0xcc, 0xd4, 0x89, 0xdd, 0xf2, 0xd7, 0x7f, 0x39, 0xdd, 0x6a, 0xdd, 0xb2, 0x0a, 0xb3, 0xf4, 0x74, 0x17, 0xfc, 0x0d, 0xfd, 0x06, - 0x2f, 0x57, 0xe3, 0xcc, 0xde, 0x79, 0x61, 0xec, 0x2a, 0xaf, 0x77, 0xe1, 0xf3, 0xf5, 0xd2, 0x2d, 0x9a, 0xb0, 0x74, 0xab, 0x5f, 0xff, 0xf6, 0x47, 0x5d, 0x36, 0xee, 0xf9, 0x5a, 0x6e, 0xda, 0x3b, - 0xd3, 0x3f, 0x5f, 0x3b, 0xbd, 0xec, 0x8f, 0x3f, 0x7e, 0xbd, 0x1e, 0x7d, 0xf9, 0xea, 0xf3, 0xed, 0x87, 0xaf, 0x3f, 0xdf, 0x89, 0x43, 0xdb, 0x4d, 0xab, 0xf3, 0x6f, 0xa9, 0xdc, 0xb4, 0x03, 0x77, - 0x00, 0xdf, 0xde, 0x76, 0xdc, 0xdc, 0x4d, 0x1d, 0x37, 0xb5, 0xc3, 0x9b, 0x37, 0x9f, 0xef, 0xd8, 0x71, 0xd6, 0x38, 0xe7, 0xd7, 0x9d, 0x6e, 0xfc, 0xfa, 0x13, 0xff, 0x0d, 0xfe, 0x46, 0x5f, 0x7f, - 0xf8, 0xc7, 0x1f, 0xbf, 0x3c, 0xd3, 0xac, 0x06, 0x51, 0x35, 0x28, 0x9b, 0xb4, 0x0e, 0x2f, 0xff, 0xdd, 0x9f, 0xd0, 0xf9, 0xe5, 0xd7, 0x67, 0xfe, 0xfb, 0xcd, 0x5b, 0x5a, 0xfa, 0xd3, 0x17, 0xa5, - 0x99, 0xe3, 0x26, 0x97, 0xff, 0xfd, 0x4f, 0xf8, 0xfd, 0x4b, 0xaa, 0x26, 0x77, 0xcb, 0xda, 0xad, 0xea, 0xeb, 0xff, 0x80, 0xfc, 0x86, 0x6e, 0x6f, 0xd7, 0x66, 0x7e, 0x79, 0x31, 0xfa, 0x1b, 0x42, - 0x6e, 0xde, 0xfc, 0x9f, 0x6e, 0xde, 0x7f, 0x7e, 0xc1, 0xff, 0x9b, 0x64, 0x4e, 0x13, 0xbb, 0xd5, 0xf0, 0xff, 0xf6, 0xcc, 0xaa, 0x0e, 0xbd, 0xe3, 0xd0, 0x8c, 0xda, 0x81, 0x9d, 0x25, 0x79, 0x78, - 0x22, 0xe4, 0x0d, 0xa5, 0x6f, 0x48, 0x89, 0xfc, 0xc6, 0x6e, 0x69, 0x55, 0xba, 0x55, 0x16, 0xb7, 0xae, 0x73, 0xba, 0x15, 0xd4, 0x75, 0x5e, 0xfd, 0xdb, 0x70, 0x58, 0xba, 0x7e, 0x58, 0xd5, 0xe5, - 0xf1, 0x77, 0x9a, 0x27, 0x51, 0xf5, 0x3b, 0x2b, 0xfd, 0xc7, 0x6f, 0x18, 0x0e, 0xee, 0x4e, 0x07, 0x67, 0xe8, 0xdf, 0xb5, 0xdf, 0xbd, 0xc1, 0x87, 0x69, 0xed, 0xfa, 0x65, 0x58, 0x1f, 0x4f, 0xf8, - 0x55, 0x60, 0x62, 0x10, 0x3c, 0x70, 0x2d, 0x8b, 0xa9, 0xe3, 0x39, 0xe1, 0x1c, 0xb4, 0x29, 0xd6, 0x85, 0x1b, 0xa7, 0x04, 0xb1, 0x84, 0xd3, 0xc9, 0x4d, 0x4a, 0x87, 0xfc, 0x18, 0xd2, 0x5a, 0x2a, - 0x5e, 0xb1, 0x76, 0xbd, 0xad, 0x87, 0x5b, 0x1b, 0x98, 0x20, 0xab, 0x09, 0xa7, 0xa8, 0x58, 0x98, 0xc8, 0x8a, 0x06, 0x24, 0x41, 0x2b, 0x07, 0xe9, 0xa6, 0x4b, 0xf8, 0x31, 0xeb, 0xee, 0xe5, 0x1d, - 0x37, 0xf5, 0x67, 0xf1, 0xe4, 0xe0, 0x3b, 0x14, 0xf5, 0xef, 0xff, 0xde, 0x47, 0x00, 0xcc, 0xa8, 0x3d, 0x93, 0x96, 0xfc, 0x0d, 0xdd, 0x4a, 0xd4, 0xe5, 0xce, 0xc0, 0xcb, 0xca, 0xc4, 0xbc, 0x8a, - 0x06, 0xfc, 0x1b, 0xba, 0x67, 0xcb, 0x89, 0x02, 0x83, 0xa6, 0x0c, 0x5f, 0x79, 0xfa, 0x23, 0xce, 0x38, 0xae, 0x9b, 0x27, 0x6e, 0xe9, 0xbb, 0x9f, 0xb0, 0x05, 0xfa, 0x8d, 0xfc, 0x15, 0xb6, 0xbc, - 0xc2, 0x0f, 0x07, 0x6f, 0xc7, 0x83, 0x33, 0xe8, 0xf7, 0x0c, 0x59, 0x90, 0x12, 0x27, 0x8e, 0x0b, 0x44, 0xcc, 0x0c, 0x8b, 0x0e, 0xd6, 0x23, 0x60, 0x3b, 0x6c, 0x08, 0x22, 0xe0, 0x47, 0x88, 0xdf, - 0x0d, 0x4b, 0x33, 0x12, 0x29, 0x60, 0x09, 0xef, 0x66, 0xc7, 0x30, 0xe2, 0x73, 0x6e, 0xcb, 0xab, 0xb2, 0xc6, 0xca, 0xb9, 0x64, 0xc6, 0x6e, 0x16, 0x01, 0x23, 0x98, 0xaa, 0x40, 0x71, 0xd4, 0xf0, - 0x5b, 0x9e, 0xe0, 0x42, 0x72, 0x5e, 0xac, 0x3d, 0xb0, 0x01, 0xca, 0x0c, 0x3f, 0x31, 0xa4, 0x07, 0x5d, 0xdc, 0xb2, 0xcc, 0x3e, 0x17, 0x55, 0xf8, 0xaf, 0xd0, 0xe4, 0x0c, 0x3d, 0x1c, 0x5c, 0xfe, - 0x0e, 0xce, 0x60, 0xdf, 0xd3, 0x62, 0x49, 0x79, 0xf6, 0xca, 0x04, 0x26, 0xe9, 0x2e, 0xdd, 0x2b, 0x21, 0xe6, 0xa9, 0x99, 0x5f, 0xae, 0x34, 0x3f, 0x74, 0x56, 0xa1, 0x0d, 0xcc, 0xb4, 0x74, 0x15, - 0x85, 0x91, 0xe6, 0xe4, 0x31, 0x99, 0xb7, 0xbb, 0xd6, 0xd2, 0x64, 0x6c, 0x3c, 0x33, 0x11, 0x22, 0x34, 0xb8, 0xd1, 0x74, 0xd6, 0x56, 0xc1, 0xc8, 0x58, 0xa1, 0x47, 0x20, 0x9b, 0x86, 0x98, 0x6d, - 0xb1, 0xe3, 0x04, 0x93, 0xb9, 0x19, 0xe0, 0x24, 0x42, 0x3f, 0x5a, 0x9c, 0x25, 0x2c, 0xaa, 0xb2, 0x74, 0x50, 0xd5, 0x65, 0x98, 0xfa, 0xa1, 0x77, 0xfc, 0x6e, 0x34, 0xa3, 0x7f, 0x8d, 0x44, 0x5f, - 0xbd, 0x71, 0x38, 0xf8, 0xf2, 0xf6, 0x00, 0xed, 0x47, 0xd0, 0x63, 0x6e, 0x1c, 0xd3, 0x6d, 0xab, 0x51, 0x88, 0x13, 0x5a, 0x1e, 0x7f, 0xdc, 0x09, 0x1b, 0x64, 0x3b, 0xc6, 0xf6, 0x63, 0x87, 0x91, - 0x7d, 0x71, 0xe6, 0xa7, 0x47, 0x52, 0xb0, 0xf1, 0x1d, 0x84, 0x23, 0x7b, 0x9d, 0x5f, 0xd1, 0x68, 0xc2, 0xcc, 0x18, 0x7a, 0x47, 0x4d, 0x72, 0x00, 0x04, 0xf5, 0xa4, 0xd8, 0xcd, 0xda, 0x79, 0x42, - 0xd2, 0xc3, 0x83, 0x9e, 0xb1, 0x66, 0xb4, 0x3f, 0x32, 0x8e, 0x4a, 0x0f, 0x5d, 0xbf, 0xdf, 0x68, 0x7f, 0xf0, 0xff, 0x9f, 0x47, 0x2f, 0xd6, 0x73, 0xf4, 0x9a, 0x96, 0x55, 0xba, 0xed, 0xa7, 0x23, - 0xf6, 0x56, 0x41, 0xf4, 0x25, 0xfd, 0x05, 0xf2, 0xa4, 0x39, 0xcf, 0x07, 0x83, 0x33, 0xca, 0xf7, 0x54, 0x4c, 0x53, 0x77, 0x34, 0x9c, 0x87, 0xc2, 0x30, 0xe8, 0xe6, 0x81, 0x8e, 0xe7, 0x0e, 0x9d, - 0x5a, 0xe3, 0xba, 0x23, 0xe8, 0x88, 0x97, 0x96, 0xa5, 0x0e, 0x82, 0xfc, 0xb0, 0x6b, 0x79, 0x31, 0xc1, 0x72, 0x6e, 0xba, 0x8b, 0xf1, 0x43, 0x33, 0x2b, 0x67, 0xa9, 0x96, 0x0e, 0x95, 0x5a, 0xda, - 0x6c, 0xbc, 0x4d, 0x4d, 0x79, 0xc6, 0x68, 0x08, 0x6d, 0x6b, 0x37, 0xd8, 0x55, 0x9d, 0x3c, 0x2a, 0x6c, 0x29, 0x0c, 0x41, 0xe1, 0x9e, 0x8a, 0xed, 0x75, 0xe6, 0xfe, 0x8a, 0x1e, 0x59, 0x59, 0x0f, - 0xec, 0x2c, 0xad, 0xcb, 0x2c, 0xfe, 0x6a, 0x8a, 0x01, 0x9f, 0x10, 0xca, 0xf7, 0xe0, 0x67, 0x1a, 0xdd, 0x5f, 0x1a, 0x9c, 0x91, 0xbf, 0xa7, 0x56, 0x40, 0xc6, 0x02, 0x59, 0x9b, 0xb6, 0xa1, 0xa7, - 0x5b, 0xa4, 0xdd, 0x08, 0x92, 0x1f, 0x5a, 0x11, 0x50, 0x73, 0x34, 0x3b, 0xc7, 0x86, 0x40, 0x0c, 0xe2, 0x54, 0x03, 0xf3, 0x76, 0x19, 0xb6, 0xc3, 0x59, 0xe2, 0xd6, 0xa0, 0x6b, 0x46, 0xa8, 0xb4, - 0x57, 0x59, 0x14, 0xaa, 0xb8, 0xd1, 0x3e, 0x65, 0xe9, 0x50, 0xa8, 0x98, 0x08, 0x1a, 0x15, 0xa0, 0x53, 0x76, 0x8e, 0xea, 0xb8, 0x14, 0x5b, 0xef, 0xfb, 0xca, 0xdc, 0xc5, 0x98, 0xa9, 0xcd, 0xd2, - 0x77, 0xeb, 0x41, 0x15, 0x84, 0xc9, 0x03, 0x89, 0x7b, 0x85, 0x71, 0x53, 0x3f, 0x4c, 0x1f, 0xd9, 0x0e, 0xa7, 0x1f, 0xfd, 0xc7, 0xbf, 0xe3, 0xbf, 0xb1, 0x5e, 0x52, 0x5a, 0xd5, 0xa5, 0x69, 0xd7, - 0x83, 0x38, 0xf3, 0xfd, 0x30, 0xf5, 0x3f, 0xe1, 0xca, 0x69, 0xb4, 0x3e, 0x23, 0xaf, 0xf7, 0xe0, 0x67, 0xae, 0xdc, 0x5f, 0x1a, 0x9c, 0x91, 0xbf, 0xe7, 0x0a, 0x3c, 0x8e, 0xb6, 0x92, 0x71, 0x90, - 0xf8, 0x36, 0x70, 0xb9, 0x76, 0x66, 0x8d, 0xab, 0x78, 0x2a, 0xea, 0x9c, 0xbc, 0x2b, 0x01, 0x31, 0xe2, 0x6b, 0x2e, 0x2d, 0x57, 0x3c, 0x82, 0x78, 0x80, 0x32, 0x57, 0x57, 0x9d, 0xdb, 0x09, 0xb9, - 0x61, 0x17, 0x8a, 0x4f, 0x44, 0x26, 0xb2, 0x42, 0x9d, 0xb1, 0x96, 0x74, 0x9d, 0xbf, 0x97, 0x00, 0x13, 0x84, 0x47, 0xd1, 0xf6, 0x80, 0xf1, 0x93, 0x10, 0x59, 0x34, 0xe1, 0xd7, 0xd3, 0xcc, 0x65, - 0xba, 0x7f, 0x44, 0x8d, 0x77, 0x06, 0x40, 0x6f, 0x72, 0x44, 0xed, 0xd5, 0xea, 0xb9, 0x00, 0x7c, 0xff, 0xd5, 0xfb, 0x99, 0x9f, 0x97, 0xce, 0xa4, 0x5d, 0x9b, 0xf1, 0x04, 0x1c, 0x77, 0xb5, 0xd6, - 0x86, 0x35, 0x0d, 0x07, 0x13, 0x10, 0xd5, 0x3d, 0x8f, 0x6a, 0xeb, 0x4a, 0x4e, 0x47, 0xc8, 0xc2, 0x9a, 0x69, 0xfa, 0x8a, 0xaa, 0x27, 0x32, 0x87, 0x1e, 0x1c, 0x88, 0x48, 0x26, 0x13, 0x43, 0x38, - 0xc8, 0xdc, 0xbc, 0x0e, 0xc7, 0x7b, 0xa3, 0x5d, 0x88, 0xb6, 0x9a, 0x91, 0x9b, 0x79, 0x2b, 0xac, 0x05, 0x02, 0x2a, 0x9d, 0xbc, 0xa7, 0x2c, 0x9e, 0xf5, 0xdf, 0xc9, 0x1c, 0x18, 0xb8, 0x45, 0x63, - 0xc6, 0x67, 0x49, 0x44, 0xde, 0xdb, 0x35, 0x17, 0xfd, 0x68, 0x07, 0x6e, 0x62, 0x0e, 0xea, 0xd2, 0x3c, 0xd1, 0xe8, 0xc5, 0xee, 0x05, 0xef, 0x4d, 0xa4, 0xab, 0x85, 0x3f, 0xf0, 0xca, 0x2c, 0xb9, - 0x6a, 0xd4, 0x57, 0x63, 0x08, 0xbe, 0x7d, 0xb0, 0x29, 0xc3, 0x41, 0x74, 0x31, 0xa3, 0x4e, 0xb3, 0x04, 0xfc, 0x51, 0xf0, 0xbd, 0x26, 0x75, 0xee, 0x45, 0xf5, 0x64, 0xf8, 0x1e, 0x2f, 0x86, 0xaf, - 0x1f, 0xd6, 0x41, 0x63, 0xdd, 0x03, 0xc6, 0xb7, 0x8c, 0xb9, 0x3c, 0xf0, 0xdb, 0xce, 0x92, 0x61, 0x95, 0x67, 0x69, 0x95, 0x95, 0xd5, 0xd0, 0xcd, 0x33, 0xcb, 0x2d, 0xdd, 0x6e, 0x17, 0xa6, 0x7d, - 0xc6, 0xcc, 0x9d, 0xb5, 0xf7, 0x78, 0xb8, 0x3c, 0xa5, 0xde, 0xdf, 0x70, 0xaf, 0x72, 0x72, 0x3d, 0x1b, 0xc0, 0xfd, 0x14, 0xbd, 0x7a, 0x00, 0x97, 0x07, 0x0c, 0x0e, 0x0e, 0x0c, 0x31, 0x81, 0xc8, - 0x60, 0xb7, 0x66, 0x7c, 0x5f, 0x8f, 0x99, 0xd0, 0x2b, 0x54, 0xa3, 0xd6, 0xcd, 0xad, 0x9f, 0x35, 0x8b, 0xac, 0x04, 0xd4, 0xb5, 0xc3, 0xa7, 0xc2, 0x91, 0x59, 0x42, 0x48, 0xeb, 0x33, 0xea, 0x51, - 0xd9, 0x34, 0x39, 0x21, 0x66, 0xae, 0x9b, 0xad, 0xd6, 0x55, 0x89, 0xee, 0x3c, 0x2c, 0xc0, 0x1d, 0x4e, 0x85, 0xa0, 0x39, 0x84, 0xad, 0xe5, 0x1f, 0x1b, 0xc7, 0x0f, 0x95, 0x55, 0xee, 0xba, 0xe5, - 0xe7, 0x1e, 0xcf, 0x0f, 0x7f, 0xbc, 0x76, 0x6b, 0xf3, 0x11, 0xc0, 0xdb, 0x85, 0x3f, 0xfe, 0xf8, 0x95, 0xe5, 0x75, 0x98, 0xa5, 0x67, 0xc1, 0x7d, 0x9d, 0x98, 0xfe, 0x78, 0x65, 0xec, 0xd7, 0x0c, - 0x4e, 0x8f, 0x89, 0x59, 0xdb, 0xc1, 0xa7, 0x53, 0x14, 0x74, 0x23, 0xb2, 0xbd, 0xb9, 0x7b, 0x05, 0x3d, 0xb1, 0xf6, 0x7a, 0x38, 0x38, 0x23, 0x7d, 0xcf, 0x57, 0x1e, 0x45, 0x5c, 0xde, 0xe3, 0xa8, - 0x79, 0x93, 0xef, 0xfc, 0x86, 0x95, 0x8f, 0x76, 0x69, 0xa3, 0xc5, 0x62, 0xb4, 0xeb, 0x48, 0x23, 0x6c, 0x38, 0x39, 0x8c, 0x4c, 0x46, 0xda, 0x6b, 0x84, 0xc4, 0xd6, 0xa0, 0x3e, 0x9c, 0x6d, 0x96, - 0x44, 0x0b, 0x9a, 0x26, 0x59, 0xea, 0x24, 0x84, 0x1f, 0xd4, 0xc8, 0x20, 0xca, 0x85, 0x43, 0x61, 0x9a, 0xb3, 0xb6, 0x73, 0x65, 0x2a, 0x2d, 0xd7, 0x05, 0xb0, 0x6d, 0x55, 0xff, 0xf1, 0x04, 0xde, - 0x83, 0xd5, 0xe9, 0x49, 0x2a, 0xe3, 0xb0, 0x73, 0x07, 0xb9, 0x59, 0x07, 0x57, 0xc5, 0xf0, 0x6e, 0xb8, 0xe7, 0xa1, 0x9d, 0xbd, 0xd0, 0xf0, 0xc5, 0x8b, 0xfd, 0xc0, 0xd7, 0x6f, 0x66, 0xb0, 0x3f, - 0xc8, 0x3e, 0x83, 0xb1, 0xb4, 0x83, 0xe3, 0xa7, 0x56, 0xd6, 0x53, 0xb6, 0xc4, 0x09, 0xf1, 0xc4, 0xa5, 0xd3, 0xdf, 0x01, 0xd4, 0xcf, 0x6a, 0xd0, 0x7c, 0x60, 0xb4, 0xdd, 0x4f, 0xfc, 0x21, 0x98, - 0x23, 0x70, 0xed, 0x2e, 0x9d, 0xd9, 0x9a, 0x97, 0xf8, 0x54, 0xd1, 0x96, 0x34, 0xb8, 0x47, 0x68, 0x8f, 0x4d, 0xa7, 0x92, 0x17, 0xda, 0x59, 0x57, 0x51, 0x7e, 0xd5, 0x16, 0xb0, 0xe6, 0xa6, 0xfc, - 0xa2, 0x18, 0xae, 0xf5, 0xbc, 0xeb, 0x84, 0x61, 0x4b, 0x76, 0x25, 0x77, 0x5c, 0xa4, 0x38, 0x5d, 0x21, 0x23, 0x85, 0x42, 0x17, 0x73, 0x7a, 0x3f, 0xf5, 0x8a, 0xfd, 0xd7, 0xf3, 0x53, 0xe9, 0xe7, - 0xe6, 0x45, 0xdf, 0xfe, 0x8d, 0x53, 0xf6, 0x15, 0xf4, 0xfc, 0xfd, 0x97, 0xc3, 0xbe, 0x53, 0x34, 0x09, 0x8c, 0xd4, 0xc2, 0xb5, 0xac, 0x69, 0x97, 0x6b, 0x23, 0x6e, 0x0b, 0xa8, 0x26, 0xce, 0xc1, - 0x23, 0xb3, 0x9a, 0x67, 0xbe, 0xbb, 0x5d, 0x77, 0xf6, 0xac, 0xa6, 0xe6, 0x1b, 0x27, 0x5f, 0xb3, 0xec, 0x91, 0xf2, 0x21, 0xd0, 0x03, 0x31, 0x53, 0x9c, 0x2a, 0x63, 0xcb, 0x66, 0x8a, 0x99, 0x37, - 0xe4, 0xb5, 0x3d, 0xc4, 0x44, 0x94, 0x01, 0x14, 0xf0, 0xd0, 0x62, 0xc6, 0x3e, 0x42, 0xb7, 0x4d, 0xb9, 0x44, 0xbe, 0xf6, 0x7e, 0xcc, 0xca, 0xcc, 0xbf, 0xf8, 0x7c, 0xfc, 0xe7, 0x9f, 0x5f, 0x99, - 0xf9, 0xe9, 0xd3, 0x2b, 0x33, 0x3f, 0x7f, 0x36, 0xfe, 0xfd, 0x67, 0x8f, 0x45, 0x56, 0xf5, 0x69, 0x91, 0x0a, 0x97, 0x15, 0x06, 0x66, 0xf0, 0xd6, 0x25, 0xf3, 0xbc, 0xcd, 0x91, 0xca, 0x55, 0x58, - 0x4d, 0xdc, 0xae, 0x51, 0xd4, 0x76, 0xc4, 0x4a, 0x1a, 0x4d, 0xbd, 0x0d, 0x23, 0xcb, 0xc6, 0x8a, 0x9b, 0xa9, 0xca, 0xa4, 0x0a, 0x55, 0x73, 0xcb, 0xab, 0x6b, 0xc8, 0x48, 0x53, 0x20, 0x29, 0x0c, - 0x88, 0xf3, 0x14, 0x03, 0xe9, 0x10, 0x5a, 0x65, 0x3a, 0x31, 0x27, 0x82, 0x2d, 0xf5, 0x63, 0xeb, 0xba, 0x3a, 0xa6, 0xf6, 0x2e, 0xac, 0x3f, 0xa1, 0x06, 0xf8, 0x1b, 0x7d, 0x66, 0x24, 0x5c, 0x41, - 0xcf, 0x14, 0xb9, 0x1c, 0x0e, 0xce, 0x48, 0xdf, 0x53, 0x85, 0x73, 0xc3, 0x11, 0xc7, 0xa2, 0xf5, 0x36, 0x00, 0xf5, 0x42, 0x46, 0x66, 0x87, 0x40, 0x23, 0x46, 0xce, 0x7a, 0x98, 0xec, 0x15, 0xbf, - 0xb5, 0x8c, 0x85, 0x29, 0x6e, 0xcc, 0xed, 0x0e, 0xb0, 0xaa, 0x60, 0x17, 0x81, 0x22, 0x66, 0x7b, 0xac, 0xed, 0xeb, 0xe6, 0xae, 0x74, 0xc7, 0x51, 0xc9, 0xee, 0xcd, 0x5a, 0x5b, 0x5a, 0x1d, 0x30, - 0xcf, 0xe6, 0x8e, 0xbe, 0x3a, 0x94, 0xcb, 0x30, 0x81, 0xd7, 0x91, 0xfa, 0x84, 0xcf, 0x51, 0x67, 0x49, 0x68, 0x0f, 0xaa, 0xd8, 0x75, 0x3f, 0x93, 0x93, 0x27, 0x75, 0xc4, 0x0d, 0xf0, 0x89, 0x3a, - 0x37, 0xa7, 0x7d, 0x35, 0xc6, 0x6e, 0xc3, 0x45, 0x74, 0x41, 0x05, 0x44, 0x7e, 0x00, 0x35, 0x75, 0x33, 0x07, 0x50, 0xc1, 0xea, 0xb2, 0x70, 0x3b, 0x4c, 0xa5, 0x1d, 0x4b, 0xa9, 0x9b, 0xc6, 0x81, - 0x9b, 0x36, 0x5d, 0x14, 0x0d, 0x0d, 0x0d, 0x0f, 0x98, 0x49, 0x30, 0x82, 0xb1, 0x5e, 0x48, 0x20, 0x65, 0x77, 0xc5, 0x12, 0x14, 0x52, 0x9c, 0xc8, 0xf4, 0xa1, 0x24, 0x09, 0xd0, 0xca, 0x92, 0x97, - 0x66, 0x64, 0xe4, 0x39, 0x32, 0x1f, 0xd5, 0x77, 0x14, 0xfa, 0x46, 0xbd, 0x92, 0x7d, 0x1d, 0xd9, 0xd6, 0x0c, 0x63, 0xd3, 0x8a, 0xdd, 0xc1, 0xc9, 0xc6, 0x72, 0x06, 0x66, 0x59, 0x9a, 0xc7, 0xcf, - 0x2c, 0x9f, 0xd3, 0xc7, 0x63, 0x3f, 0x27, 0xe7, 0xc3, 0x57, 0x9c, 0x08, 0xfb, 0xf0, 0xc6, 0x99, 0xc4, 0xd8, 0xf7, 0x24, 0xa6, 0xd7, 0x34, 0xb8, 0x0c, 0x37, 0x28, 0xee, 0x86, 0xb9, 0xdb, 0x85, - 0xa2, 0x04, 0xad, 0x78, 0x7e, 0x28, 0x4a, 0x1e, 0x2d, 0x83, 0x55, 0xe3, 0xcd, 0x45, 0x2d, 0x89, 0x44, 0xbf, 0x55, 0xaa, 0x4c, 0x86, 0xeb, 0xe2, 0x60, 0xd7, 0x82, 0x4b, 0x89, 0x6e, 0xa4, 0xda, - 0xde, 0xa6, 0x3e, 0xe8, 0xcb, 0x82, 0x91, 0xd6, 0x90, 0x7c, 0x10, 0xc8, 0x2a, 0x87, 0xb9, 0x52, 0x1c, 0xab, 0x39, 0xab, 0xe3, 0xd5, 0xfe, 0x07, 0x24, 0xfe, 0xe3, 0xe1, 0xb4, 0xf7, 0xd0, 0x7e, - 0xed, 0x61, 0xa5, 0xc6, 0x51, 0x60, 0x96, 0x56, 0x2f, 0x8e, 0xb5, 0x61, 0xf6, 0xa9, 0xef, 0x02, 0x3f, 0x33, 0x2d, 0x9c, 0x10, 0xcf, 0xfc, 0x68, 0xc3, 0x6c, 0x70, 0xc6, 0xf8, 0x9e, 0xfc, 0x12, - 0x15, 0xaf, 0xf5, 0x96, 0x6b, 0xf6, 0xb3, 0xe3, 0x6a, 0x89, 0xf0, 0xde, 0xd8, 0xc2, 0xd4, 0xe5, 0x58, 0x33, 0x12, 0xad, 0x83, 0x3d, 0x65, 0xe2, 0xb7, 0x30, 0xe2, 0xe0, 0x9d, 0x31, 0x75, 0x62, - 0x77, 0x58, 0x20, 0x3e, 0x1f, 0x25, 0x87, 0xb1, 0xe9, 0x36, 0x13, 0x30, 0xd7, 0x41, 0xba, 0xab, 0x30, 0x5e, 0x5d, 0x8b, 0xbe, 0x57, 0x14, 0x8c, 0xb1, 0x2b, 0x8f, 0x2e, 0x34, 0x9a, 0xc5, 0xb4, - 0xe4, 0xef, 0x7b, 0x9a, 0xa3, 0x57, 0xb3, 0xe0, 0x81, 0x27, 0xe2, 0xb8, 0x56, 0x73, 0xf1, 0x3d, 0xd0, 0xf7, 0xb7, 0x4e, 0x3e, 0x4f, 0x71, 0xfd, 0x15, 0xfe, 0x1b, 0xea, 0x41, 0x6a, 0xcb, 0x8c, - 0xcd, 0xd4, 0x76, 0x9d, 0xc1, 0x57, 0x06, 0x23, 0x74, 0xe7, 0xe3, 0xf4, 0xa5, 0xf9, 0x3d, 0xf4, 0x70, 0xf0, 0xee, 0xc2, 0x79, 0x10, 0xf4, 0x30, 0x1e, 0x91, 0x4c, 0x74, 0x65, 0x0e, 0x94, 0xd6, - 0x0a, 0x4e, 0x04, 0x1b, 0x88, 0x4a, 0x2c, 0xad, 0x5a, 0xa2, 0x47, 0xb3, 0x90, 0x89, 0x3a, 0x0a, 0xd9, 0xd8, 0x3a, 0x6c, 0x69, 0x83, 0xcb, 0x59, 0x70, 0xa9, 0x8e, 0x80, 0x89, 0xab, 0xa1, 0xd6, - 0x96, 0x32, 0x35, 0x90, 0x4a, 0x0f, 0x35, 0x58, 0x1f, 0xe0, 0x75, 0x99, 0x6f, 0x73, 0x75, 0x2f, 0x98, 0xfc, 0x7e, 0x1e, 0xcf, 0x45, 0x66, 0x11, 0xe8, 0x32, 0xc6, 0xef, 0x7f, 0xaa, 0x89, 0x2d, - 0xb3, 0x72, 0x71, 0xf4, 0xe2, 0xd8, 0x3d, 0x26, 0x11, 0xf6, 0x84, 0x58, 0xbe, 0xa2, 0x9e, 0xa9, 0x73, 0x3d, 0x1e, 0x9c, 0xb1, 0xbe, 0x27, 0x0c, 0xb5, 0xcc, 0x4d, 0x3d, 0x66, 0x53, 0xb2, 0x46, - 0x45, 0xc5, 0xe2, 0xd8, 0xc9, 0x11, 0xb0, 0x30, 0x60, 0xb9, 0xf4, 0xdb, 0x2d, 0xda, 0x96, 0x15, 0x4d, 0xb6, 0x56, 0x5b, 0x5a, 0xa1, 0xb0, 0xc8, 0x2b, 0xc2, 0x5b, 0xd2, 0xd2, 0x2e, 0xda, 0xd1, - 0xe5, 0x11, 0x8f, 0x42, 0xb0, 0x94, 0x17, 0xd1, 0x04, 0xdc, 0x75, 0xd6, 0xc6, 0xe5, 0x57, 0xfb, 0xee, 0x50, 0x90, 0xe1, 0x31, 0xcf, 0x50, 0xa8, 0x70, 0xd5, 0xbb, 0x89, 0xfb, 0x6d, 0xa0, 0xff, - 0x3f, 0xaf, 0x32, 0x76, 0xe7, 0xa3, 0x7c, 0xea, 0xb4, 0xf6, 0x53, 0x08, 0x9e, 0x5b, 0x66, 0x55, 0xf5, 0xeb, 0xf5, 0x57, 0xff, 0xfd, 0xbf, 0x7c, 0xfd, 0x9a, 0xdc, 0xac, 0x4b, 0x37, 0x4b, 0xbf, - 0x7c, 0xcf, 0x7e, 0xbf, 0xff, 0x7d, 0x7d, 0xee, 0xfc, 0xb2, 0x9f, 0xbe, 0xc3, 0xce, 0xd2, 0xaa, 0x89, 0xeb, 0xd3, 0x67, 0x7f, 0xf5, 0x9a, 0x0b, 0xec, 0x99, 0x89, 0x55, 0x93, 0xe7, 0x59, 0x59, - 0xdf, 0xbc, 0xe2, 0x7a, 0xf4, 0x5f, 0xbf, 0x10, 0xa7, 0x30, 0x35, 0xcb, 0xe3, 0xc0, 0x3d, 0xd4, 0x6e, 0x7a, 0x12, 0xa1, 0xcf, 0x1d, 0xf1, 0x67, 0x42, 0xdc, 0x1f, 0xd0, 0x4f, 0xe2, 0xf5, 0xfe, - 0xda, 0x00, 0xee, 0x17, 0xc3, 0x8e, 0x68, 0xbb, 0x5e, 0x0c, 0xe7, 0x8a, 0x60, 0x19, 0xd9, 0xe2, 0xb8, 0xcb, 0x5c, 0xd6, 0x0a, 0xb4, 0x9c, 0x8b, 0x37, 0xe3, 0x62, 0xb6, 0xb1, 0xf7, 0xda, 0x62, - 0xb9, 0xc8, 0x7c, 0x14, 0x66, 0x30, 0x96, 0xe6, 0xe5, 0xbd, 0x20, 0x89, 0x4e, 0x34, 0x61, 0x9d, 0x30, 0x88, 0x22, 0x90, 0x8e, 0xd3, 0xc0, 0x15, 0x08, 0x2b, 0xb6, 0x24, 0xdc, 0x61, 0x39, 0xd3, - 0xdb, 0x50, 0xa1, 0x48, 0x66, 0x99, 0xb0, 0xfc, 0xc4, 0x3e, 0xec, 0x3b, 0x2f, 0xf5, 0x71, 0xac, 0xac, 0x30, 0xad, 0x4b, 0xd7, 0xfd, 0x6a, 0xa2, 0x7f, 0x42, 0xa7, 0x5d, 0x41, 0x2f, 0x04, 0x3d, - 0x1f, 0xf6, 0xd5, 0x63, 0x0a, 0xb7, 0xf6, 0xa5, 0xf5, 0x3e, 0xa2, 0x4c, 0x79, 0x86, 0x91, 0xa0, 0xa8, 0xa5, 0xc8, 0xca, 0xb4, 0x15, 0x3f, 0x6a, 0xca, 0xd2, 0x5a, 0x27, 0x2e, 0x61, 0x18, 0x1b, - 0x7d, 0x26, 0x8a, 0x0a, 0x91, 0x24, 0xb5, 0x8e, 0x0b, 0xc2, 0x36, 0x00, 0x19, 0x1f, 0xc9, 0xf7, 0x73, 0x3b, 0xad, 0x05, 0x82, 0xa0, 0x99, 0x72, 0x09, 0xad, 0xc0, 0xcd, 0x61, 0x67, 0xb9, 0x75, - 0x64, 0x67, 0x5a, 0xa7, 0xec, 0x97, 0x5f, 0x7b, 0x58, 0x56, 0x69, 0xda, 0xee, 0xc0, 0x3d, 0xe4, 0x66, 0x7a, 0xfd, 0xec, 0xc7, 0x94, 0x80, 0x7e, 0x43, 0x4f, 0xe8, 0xae, 0x7b, 0xf0, 0x13, 0x45, - 0xee, 0xaf, 0x5c, 0xc2, 0xfb, 0x3d, 0x14, 0x59, 0x38, 0x69, 0x78, 0x96, 0x9e, 0xfa, 0x25, 0xab, 0x11, 0x2c, 0xdc, 0x32, 0xf3, 0x21, 0x76, 0xc8, 0x3b, 0x90, 0xe8, 0x44, 0x76, 0x0c, 0x82, 0x52, - 0xde, 0xf8, 0x45, 0x90, 0xe8, 0xb5, 0x92, 0xac, 0x39, 0x1c, 0x83, 0xc8, 0x64, 0xd2, 0x6c, 0xd7, 0x19, 0xa7, 0x4f, 0x63, 0x87, 0x19, 0xc7, 0xa0, 0x0f, 0x91, 0x44, 0xe3, 0x65, 0x9d, 0x63, 0xb2, - 0xbe, 0xba, 0xb4, 0xf5, 0xa9, 0x85, 0x43, 0xc5, 0x2c, 0xfc, 0x4e, 0xc2, 0x3e, 0x9f, 0x7a, 0x3f, 0x4c, 0x89, 0x0f, 0xe6, 0x60, 0x3b, 0x4b, 0x6d, 0xb3, 0x1e, 0x24, 0x67, 0xf7, 0xed, 0x17, 0x78, - 0x76, 0x55, 0x7b, 0x88, 0xe4, 0x89, 0x40, 0x9f, 0x09, 0x24, 0xf2, 0x9c, 0x40, 0x9e, 0x21, 0x5f, 0x88, 0x5f, 0x9d, 0x93, 0x04, 0x3d, 0x84, 0xd1, 0x22, 0x9b, 0x04, 0x58, 0x41, 0xdb, 0x6e, 0x8d, - 0xa8, 0xb4, 0xd8, 0xb5, 0x41, 0x82, 0xfb, 0xf3, 0x0e, 0x3a, 0x7a, 0x92, 0x35, 0xae, 0x71, 0x5d, 0x8a, 0x6d, 0x66, 0x49, 0xb5, 0x55, 0x52, 0x4c, 0x0c, 0x63, 0xba, 0x47, 0xf1, 0x0e, 0x87, 0xf1, - 0x58, 0x89, 0x46, 0x11, 0x74, 0x64, 0x78, 0x15, 0x41, 0x58, 0x8c, 0x05, 0xe2, 0xb1, 0x90, 0x1b, 0x6b, 0x1e, 0xda, 0x91, 0x31, 0x40, 0x90, 0xac, 0x09, 0x3e, 0x4f, 0x72, 0x2f, 0x8c, 0xe3, 0x41, - 0x69, 0xa6, 0xfe, 0x25, 0xf8, 0x4a, 0xdc, 0xd1, 0xf3, 0x6f, 0x55, 0x0a, 0x8d, 0xe7, 0x7d, 0x9a, 0xba, 0xc1, 0x7f, 0x83, 0xbf, 0x91, 0x9f, 0x73, 0xe0, 0x0c, 0x79, 0xe2, 0xc0, 0xf9, 0x60, 0x70, - 0x46, 0xf9, 0x9e, 0x03, 0x53, 0x29, 0x9c, 0xe4, 0x9b, 0x43, 0xbd, 0x0f, 0x0d, 0x83, 0x65, 0x0c, 0xcb, 0xb6, 0xa4, 0xb9, 0x6d, 0x44, 0xcc, 0x56, 0x99, 0x4f, 0xd2, 0xd1, 0xb1, 0x18, 0xe6, 0xf4, - 0x74, 0x27, 0xc5, 0x23, 0x6c, 0x48, 0x1d, 0x3a, 0x1a, 0x4a, 0xcd, 0xb1, 0x5d, 0x6f, 0x08, 0x9d, 0xc3, 0xc9, 0x32, 0x5c, 0x0f, 0xfd, 0x95, 0x48, 0xeb, 0x44, 0xe5, 0x94, 0x6b, 0xeb, 0x48, 0x06, - 0x99, 0x47, 0xd1, 0x7a, 0xd3, 0x14, 0xdc, 0xff, 0x99, 0xbd, 0xff, 0xc6, 0xd9, 0xbb, 0x87, 0xdc, 0xde, 0x5a, 0x85, 0x27, 0x2d, 0xf1, 0xae, 0x98, 0x25, 0x74, 0x5d, 0x97, 0xc0, 0xd0, 0xeb, 0x4d, - 0xb8, 0x97, 0x8e, 0xb0, 0xcd, 0x38, 0x1e, 0x58, 0x61, 0xea, 0xfc, 0xad, 0xf3, 0xd6, 0x2b, 0xea, 0x70, 0xf0, 0x76, 0xdc, 0x77, 0xe6, 0x22, 0x38, 0x60, 0x6a, 0x4d, 0xc2, 0xa0, 0x1c, 0x63, 0xea, - 0xcc, 0x9a, 0xea, 0x6e, 0x65, 0xd7, 0xfb, 0x44, 0x5a, 0x9a, 0x2e, 0x5e, 0x72, 0xe1, 0xbc, 0x4b, 0x3a, 0x28, 0xb4, 0x4b, 0x57, 0x5d, 0x00, 0xa0, 0x49, 0x11, 0xab, 0x85, 0xd7, 0x14, 0x01, 0x53, - 0x65, 0xb0, 0x34, 0x4a, 0xed, 0xdc, 0x9e, 0xd6, 0xdd, 0x5a, 0xa8, 0x3b, 0xcd, 0x83, 0x85, 0xd9, 0xac, 0x71, 0xd5, 0xc5, 0x4c, 0xd2, 0xab, 0xa2, 0xec, 0x19, 0x96, 0xf7, 0x9a, 0xd4, 0xae, 0x4f, - 0x93, 0xc9, 0x95, 0x24, 0x97, 0x8a, 0xa4, 0x3b, 0x2a, 0xfb, 0x6e, 0x3d, 0x38, 0xcd, 0xc5, 0x61, 0x5a, 0x85, 0xf6, 0xab, 0xba, 0xee, 0x9b, 0x77, 0xe9, 0x21, 0xe8, 0xbd, 0xfd, 0x56, 0x3b, 0xc8, - 0x76, 0xa1, 0x63, 0x7e, 0x55, 0x7d, 0xf4, 0x73, 0xfd, 0xf2, 0x02, 0x7a, 0xe2, 0xdc, 0xf5, 0xf0, 0x5c, 0x6c, 0xd4, 0x43, 0xc7, 0xd0, 0x25, 0x52, 0x79, 0xcb, 0x2d, 0x8f, 0x67, 0x92, 0x1d, 0x79, - 0xf0, 0x22, 0x91, 0x93, 0xe9, 0xc2, 0x73, 0x95, 0x75, 0xab, 0x8d, 0x1d, 0xd7, 0x3f, 0x8c, 0xc1, 0x50, 0x11, 0x30, 0xd7, 0x82, 0x15, 0x08, 0x6c, 0xa6, 0x0b, 0x79, 0x42, 0x89, 0x24, 0x37, 0x3e, - 0x1a, 0x8e, 0x42, 0x1d, 0x15, 0x8b, 0x3c, 0x68, 0x9b, 0x0e, 0x99, 0x45, 0x91, 0xe4, 0x47, 0xa3, 0xdd, 0x4a, 0xad, 0x0c, 0xa9, 0x60, 0xf0, 0xdd, 0x27, 0xae, 0xd3, 0xcf, 0xd5, 0x4e, 0x98, 0x3a, - 0x61, 0x1b, 0x3a, 0x8d, 0x19, 0x7f, 0x39, 0x56, 0x73, 0xb3, 0x89, 0x93, 0x30, 0x8e, 0xcb, 0x8b, 0x42, 0xb8, 0xa0, 0x0f, 0x9f, 0x1b, 0xaf, 0x37, 0x89, 0x91, 0x5f, 0xff, 0xb8, 0x4f, 0x83, 0x9c, - 0x46, 0xf3, 0xcb, 0xf4, 0x7c, 0xba, 0xf7, 0x2e, 0xab, 0xe7, 0xc7, 0x99, 0x35, 0xc8, 0xcd, 0xd2, 0x4d, 0xcf, 0x85, 0x6b, 0xff, 0xc0, 0xde, 0xff, 0x38, 0xac, 0x06, 0x57, 0x13, 0xfb, 0x25, 0xa9, - 0xf0, 0x0f, 0xf8, 0xf7, 0xbb, 0x32, 0xab, 0xb0, 0x1a, 0x9c, 0x70, 0xce, 0x37, 0xd1, 0xbb, 0xf0, 0xf6, 0xc3, 0xac, 0xc4, 0x3f, 0x3e, 0x64, 0x25, 0x4a, 0xd7, 0x74, 0x9c, 0xb0, 0xcc, 0xaf, 0x77, - 0xf1, 0x27, 0xd2, 0xea, 0x7f, 0x90, 0xbf, 0xa1, 0x87, 0x49, 0xaa, 0x97, 0x7c, 0xd3, 0xe7, 0x59, 0x2e, 0xaf, 0x7a, 0xab, 0x1e, 0xfc, 0x07, 0xfc, 0x1b, 0xb9, 0x19, 0x63, 0x5f, 0x8c, 0x89, 0xbb, - 0xaa, 0xc3, 0xcf, 0xa6, 0x5d, 0xf4, 0xe7, 0xc3, 0xe2, 0x0d, 0xf7, 0x34, 0x32, 0xde, 0xce, 0xce, 0x13, 0x30, 0xfa, 0xfd, 0xe0, 0x50, 0xcc, 0x23, 0x09, 0x59, 0x52, 0xd5, 0xd4, 0xd3, 0x9d, 0x71, - 0x60, 0xd3, 0x35, 0xbc, 0x04, 0x4b, 0xb7, 0x1d, 0x61, 0x0e, 0x78, 0x20, 0x4c, 0xc9, 0x40, 0x66, 0xc0, 0x38, 0x49, 0xc8, 0xe1, 0x2c, 0x9d, 0x77, 0x95, 0x52, 0xcf, 0x3c, 0x77, 0xbc, 0x5b, 0xd9, - 0xda, 0x94, 0x46, 0xed, 0xce, 0x00, 0xc9, 0x6d, 0xc6, 0xa5, 0x38, 0xcf, 0x2d, 0x63, 0xa0, 0x9c, 0x6b, 0xe6, 0x58, 0x04, 0xb4, 0x14, 0x88, 0xe6, 0x3d, 0xb5, 0xda, 0x5f, 0xa8, 0xc4, 0xcb, 0xcb, - 0xcc, 0x76, 0xab, 0xcb, 0x4d, 0xf0, 0xf4, 0x73, 0xe8, 0xee, 0xf7, 0x4d, 0x1d, 0xc6, 0x2f, 0xf7, 0xe0, 0xfb, 0xca, 0xcb, 0xa6, 0x09, 0x9d, 0xeb, 0x5b, 0x91, 0x47, 0xea, 0xf1, 0x1b, 0xc1, 0x81, - 0xe0, 0x3f, 0xfe, 0x2f, 0x18, 0xec, 0x19, 0x73, 0xb5, 0xb3, 0xc4, 0x0a, 0x53, 0xd7, 0x19, 0x54, 0x75, 0xe9, 0x9a, 0xc9, 0x17, 0x73, 0x19, 0xf9, 0x73, 0xce, 0xdf, 0x63, 0x9f, 0xb8, 0x7f, 0x7f, - 0xe5, 0x3c, 0xaf, 0x91, 0xdf, 0x4b, 0xc0, 0x54, 0xd8, 0xa0, 0xeb, 0xad, 0xd7, 0x2c, 0x5c, 0xd6, 0x23, 0xec, 0xb1, 0x35, 0x5e, 0x2f, 0xa6, 0x5a, 0xb0, 0x14, 0xe9, 0x02, 0x80, 0x77, 0x14, 0x55, - 0x8e, 0xe3, 0x64, 0x3b, 0x6e, 0xed, 0x76, 0xca, 0x60, 0xe3, 0x31, 0xc4, 0x1a, 0x4b, 0xad, 0x16, 0xa7, 0x94, 0x48, 0x07, 0x4e, 0xdc, 0x8d, 0x3a, 0x4e, 0xdf, 0x1f, 0x02, 0x32, 0xa6, 0x9d, 0xb4, - 0x4d, 0xd6, 0x9c, 0x3b, 0x04, 0x30, 0xdb, 0xc9, 0x18, 0xe7, 0xf9, 0xb4, 0xa4, 0xe3, 0xc6, 0xe6, 0xf1, 0x96, 0x64, 0xbf, 0xfe, 0x01, 0x3d, 0x55, 0x39, 0xf3, 0xc7, 0x89, 0xaa, 0xbd, 0x78, 0x94, - 0x98, 0xa9, 0xf3, 0xa9, 0x39, 0x0c, 0x81, 0x4f, 0xa5, 0x16, 0x5e, 0x61, 0x2f, 0x8c, 0xb9, 0x1c, 0x0f, 0x2e, 0x60, 0xdf, 0xf3, 0xa4, 0x13, 0x31, 0x3e, 0x95, 0xe6, 0x30, 0x3c, 0x9d, 0x6f, 0xd7, - 0xf8, 0x31, 0xde, 0xa8, 0xe4, 0x0c, 0xa5, 0x72, 0x70, 0xce, 0x70, 0xc7, 0x1d, 0x0e, 0x7b, 0xc1, 0x4a, 0xa4, 0x41, 0xa0, 0x61, 0xb7, 0xd2, 0x68, 0x6d, 0x6f, 0x27, 0xab, 0x59, 0xbe, 0x53, 0x36, - 0xad, 0x99, 0xa1, 0x56, 0x14, 0x26, 0xf9, 0x72, 0x38, 0x13, 0x83, 0x63, 0x7a, 0x14, 0x76, 0xd3, 0xe9, 0x81, 0x0d, 0xf6, 0x6b, 0x9b, 0x91, 0x12, 0xa7, 0xa1, 0x7e, 0x10, 0xf2, 0x86, 0xd0, 0x7e, - 0xa4, 0xcb, 0xb3, 0xd4, 0x4d, 0xeb, 0x81, 0x9b, 0x84, 0x75, 0xfd, 0x39, 0x09, 0x9f, 0x2a, 0x6c, 0xfd, 0x80, 0x7e, 0xa1, 0xe4, 0xfd, 0xb5, 0xbe, 0xf5, 0xad, 0x5b, 0x07, 0xa9, 0x5c, 0x5c, 0x18, - 0x03, 0x15, 0x07, 0x49, 0xfb, 0xc2, 0x88, 0x2a, 0x5b, 0x28, 0x9b, 0x32, 0x67, 0xf8, 0xb9, 0xc7, 0x81, 0xc3, 0xa3, 0x9e, 0x8a, 0x61, 0x8a, 0x0b, 0xc3, 0x92, 0x46, 0x12, 0xae, 0xa9, 0xd9, 0x56, - 0x2e, 0x27, 0x54, 0xb0, 0x68, 0x2c, 0xa4, 0x1c, 0x81, 0xcd, 0xc6, 0x02, 0x44, 0x46, 0x1c, 0x37, 0x0c, 0x28, 0xe8, 0xd9, 0x78, 0x04, 0xea, 0x8e, 0x67, 0xd6, 0xd5, 0xf6, 0x13, 0x21, 0xff, 0x8a, - 0x60, 0x37, 0xfe, 0xf2, 0x23, 0x4a, 0x81, 0x4f, 0x65, 0x7b, 0xdf, 0x60, 0xcf, 0x24, 0x7a, 0x39, 0x19, 0x80, 0xfd, 0x32, 0xbe, 0x43, 0xb1, 0x6c, 0x51, 0xa7, 0xda, 0x1f, 0x85, 0xcd, 0xd8, 0xcb, - 0x82, 0x59, 0xde, 0x8d, 0x32, 0x5c, 0xb7, 0x90, 0x59, 0x87, 0x88, 0xa5, 0x4c, 0x17, 0x63, 0x16, 0x2b, 0xa5, 0x26, 0x98, 0x6d, 0x09, 0x33, 0xa8, 0x63, 0x4b, 0x5f, 0xa6, 0xca, 0x61, 0x0f, 0x5b, - 0x93, 0xe9, 0x7a, 0x1b, 0x47, 0x26, 0x45, 0x30, 0x1a, 0x6b, 0x6a, 0x06, 0xb9, 0xaf, 0x58, 0x27, 0x73, 0xa6, 0xad, 0xb5, 0x0b, 0x96, 0x49, 0xf1, 0x04, 0x6d, 0xb2, 0x5d, 0xf8, 0x59, 0x16, 0x1c, - 0x7c, 0xaa, 0x62, 0xfd, 0x02, 0x79, 0xa6, 0xc9, 0xe9, 0x60, 0x00, 0xf6, 0x2b, 0x4e, 0xd7, 0x0d, 0x64, 0x26, 0x1f, 0xd3, 0x61, 0x46, 0xfa, 0xde, 0x72, 0x11, 0xa7, 0xb1, 0x46, 0xf8, 0xc4, 0xa1, - 0x40, 0xfd, 0x23, 0x87, 0x73, 0x62, 0x13, 0xcc, 0xf8, 0xa5, 0x69, 0xce, 0xaa, 0x6a, 0x36, 0x86, 0x0b, 0x9f, 0x96, 0x45, 0xd0, 0xe7, 0xfd, 0x5a, 0x6a, 0xb3, 0xa3, 0xb1, 0x92, 0xea, 0x11, 0x65, - 0xe1, 0xce, 0x04, 0x0d, 0x3c, 0x7b, 0xe4, 0x28, 0x98, 0x59, 0xee, 0x5a, 0x7b, 0xc8, 0x4d, 0x92, 0xf2, 0x87, 0xf9, 0x26, 0xbc, 0xd7, 0xf0, 0x3b, 0x7d, 0x55, 0xf4, 0xa9, 0xa1, 0x7d, 0x9a, 0x34, - 0x9f, 0xb0, 0x28, 0x5e, 0x50, 0x5f, 0xe9, 0x16, 0x99, 0xe5, 0xb9, 0x74, 0xa9, 0x87, 0x35, 0xb1, 0xa2, 0x0f, 0x78, 0xc6, 0x96, 0x4b, 0x80, 0x0f, 0xba, 0xd5, 0x72, 0x21, 0x8f, 0x22, 0x4c, 0x24, - 0x86, 0x3a, 0x12, 0xad, 0x87, 0x89, 0xcc, 0xb6, 0xf4, 0x90, 0x76, 0xe7, 0x90, 0x2a, 0x24, 0x8b, 0x14, 0xc7, 0xe0, 0x90, 0x9f, 0x60, 0x3a, 0x2a, 0x8d, 0xbb, 0xc9, 0x28, 0x06, 0x30, 0x6e, 0xcd, - 0x69, 0xf1, 0x51, 0x92, 0x28, 0x40, 0x4c, 0x14, 0x99, 0x4f, 0x40, 0x56, 0x90, 0xf7, 0x39, 0x8d, 0x2d, 0x8a, 0x1f, 0x67, 0x29, 0x1c, 0xf7, 0x62, 0x3a, 0x7e, 0x16, 0xe6, 0xfb, 0xb9, 0x24, 0x9d, - 0x11, 0xcf, 0x75, 0xf5, 0x66, 0x1d, 0x9c, 0x23, 0x7a, 0xdf, 0xc8, 0x11, 0x34, 0xa0, 0xcc, 0xc2, 0x16, 0xc6, 0x84, 0xb3, 0x4b, 0xe5, 0xe9, 0x94, 0xb1, 0x57, 0x7e, 0xa2, 0x63, 0xf4, 0xcc, 0x9a, - 0xd9, 0x07, 0xff, 0xab, 0x60, 0xe5, 0x4b, 0x5a, 0xeb, 0xd1, 0xff, 0x8e, 0xfe, 0x46, 0x9e, 0x60, 0xe8, 0x19, 0xf1, 0xfc, 0xbf, 0x5b, 0x8d, 0x3f, 0x38, 0x63, 0x7c, 0xcf, 0x48, 0x7e, 0xab, 0x4e, - 0xd9, 0x46, 0x94, 0x11, 0x97, 0xae, 0x85, 0x05, 0xdf, 0xa6, 0x1b, 0x9d, 0x58, 0xd8, 0x3b, 0xb7, 0x86, 0x22, 0xb0, 0xc6, 0xb8, 0x86, 0xab, 0xa6, 0x1d, 0xcf, 0x77, 0x95, 0xbb, 0xa3, 0x31, 0xd8, - 0x88, 0xc9, 0x42, 0xf6, 0xa6, 0x73, 0x9e, 0x09, 0xab, 0xbd, 0x56, 0xcc, 0x5b, 0x56, 0x9d, 0x29, 0x2c, 0xe7, 0x6b, 0x00, 0x31, 0x1b, 0xb6, 0x93, 0xcd, 0x26, 0x70, 0x83, 0xfd, 0xc1, 0xdb, 0x09, - 0xfd, 0xcc, 0xc2, 0xa4, 0x7a, 0x91, 0xde, 0x9f, 0x9b, 0x67, 0x0f, 0x7d, 0x81, 0xef, 0x0b, 0xcf, 0xae, 0xe1, 0x8f, 0x6a, 0x60, 0x67, 0xf1, 0xdd, 0x5a, 0x84, 0xf3, 0xdd, 0xbf, 0x50, 0x83, 0x76, - 0x57, 0x79, 0xf9, 0x99, 0x3c, 0xfe, 0x5c, 0xe3, 0xbf, 0xc1, 0x5e, 0x17, 0x7b, 0x5c, 0x4e, 0xfa, 0x96, 0x92, 0x1f, 0x9d, 0x91, 0x8d, 0x51, 0x4e, 0x58, 0x28, 0xf6, 0x16, 0x58, 0x44, 0xf6, 0x5e, - 0x16, 0xac, 0x11, 0xbd, 0x0b, 0x16, 0x36, 0x99, 0xfa, 0x9b, 0x12, 0x5c, 0x9b, 0x01, 0x33, 0x9e, 0xb5, 0x74, 0xb8, 0xd8, 0x93, 0x79, 0xa3, 0x9a, 0x16, 0x7c, 0x34, 0xe2, 0x00, 0x48, 0x77, 0x66, - 0xc5, 0xa5, 0x06, 0x0f, 0x30, 0x33, 0x89, 0xe2, 0xf1, 0x72, 0x9b, 0xc3, 0x8b, 0x6e, 0x11, 0x2c, 0x8c, 0xae, 0xdd, 0x4c, 0xc9, 0xe7, 0x4d, 0xbe, 0xb0, 0x1a, 0x98, 0xa5, 0xdf, 0x24, 0xaf, 0x6b, - 0xb2, 0xa0, 0xf7, 0xcb, 0xa5, 0xc2, 0x6a, 0xe0, 0x98, 0xb5, 0x3b, 0xc8, 0xac, 0xc8, 0xb5, 0xeb, 0xd7, 0x67, 0xa0, 0x77, 0xcf, 0x94, 0xae, 0xef, 0x1e, 0x1e, 0x23, 0x5c, 0x7e, 0x39, 0x08, 0xab, - 0xc7, 0x3f, 0xbe, 0xde, 0xde, 0xb9, 0xc7, 0x97, 0x07, 0xde, 0x39, 0x1c, 0x67, 0xe8, 0xfc, 0x77, 0x5e, 0x66, 0x75, 0x76, 0x72, 0xdd, 0x7f, 0x7b, 0xb1, 0xe9, 0xbf, 0x3c, 0x0b, 0x3f, 0x92, 0xba, - 0xff, 0xe1, 0x71, 0x16, 0xc7, 0xf5, 0xc2, 0xd4, 0x1d, 0xe4, 0x65, 0x96, 0xbb, 0x65, 0x1d, 0x7e, 0x91, 0xe3, 0x81, 0x9e, 0x08, 0xb8, 0x7c, 0x40, 0x3f, 0x4b, 0xda, 0xbb, 0x6b, 0x67, 0x81, 0xeb, - 0x11, 0x82, 0x41, 0xd6, 0x85, 0xa7, 0x2f, 0x23, 0x38, 0x5e, 0x75, 0xce, 0x5a, 0xf4, 0x48, 0x63, 0x6e, 0x30, 0x43, 0x05, 0x30, 0x9a, 0x23, 0x30, 0xf6, 0x69, 0xdc, 0x83, 0x70, 0xd4, 0x25, 0x97, - 0xf0, 0x9e, 0x70, 0xfc, 0x34, 0x5f, 0x52, 0xe5, 0x98, 0x76, 0xcb, 0x99, 0x9e, 0xaf, 0x51, 0x7c, 0xae, 0xeb, 0x76, 0x94, 0xee, 0x1c, 0x7e, 0xb3, 0x8e, 0xf8, 0xdd, 0x88, 0xc2, 0x95, 0xe9, 0x98, - 0x04, 0x10, 0x71, 0x19, 0x6b, 0x3d, 0xd5, 0xc9, 0x47, 0xd6, 0x9e, 0x9c, 0xc2, 0x1f, 0x6b, 0x96, 0xbb, 0x22, 0x90, 0xef, 0x98, 0xf2, 0x55, 0xd8, 0xf2, 0x99, 0xd9, 0xe7, 0x8c, 0xf9, 0xca, 0x00, - 0xa7, 0x4f, 0x71, 0x12, 0x34, 0x38, 0xea, 0xb0, 0xd5, 0xb5, 0x8e, 0xea, 0x8c, 0x43, 0x8e, 0x11, 0xe2, 0x7c, 0xba, 0x9d, 0x19, 0x28, 0x56, 0x79, 0x79, 0xbe, 0xfe, 0xf1, 0x84, 0xfa, 0xce, 0x27, - 0xfb, 0x3b, 0xbf, 0xed, 0x16, 0xfa, 0xfc, 0x89, 0xb7, 0x17, 0xfa, 0x7c, 0xe9, 0x49, 0xc0, 0x8c, 0xa3, 0x48, 0x13, 0x1b, 0x6f, 0x04, 0x99, 0xab, 0x31, 0xb8, 0x3d, 0xac, 0xd0, 0xe5, 0xac, 0x5c, - 0xb2, 0x63, 0x2d, 0x26, 0x18, 0xa7, 0x82, 0x68, 0x2a, 0x61, 0x1c, 0x3b, 0x53, 0xcc, 0xbd, 0x96, 0xae, 0x68, 0x42, 0xa4, 0x83, 0x7c, 0xe3, 0xd7, 0xcd, 0x7c, 0x0e, 0x9b, 0xd4, 0xce, 0x27, 0x4c, - 0x42, 0x10, 0x51, 0x28, 0x3a, 0xf0, 0xa2, 0x01, 0x11, 0x39, 0xaa, 0x38, 0xb3, 0x74, 0xcd, 0xee, 0x90, 0xf5, 0x27, 0x85, 0x6a, 0x7d, 0x25, 0xe6, 0x52, 0xad, 0xd7, 0x47, 0x64, 0x3a, 0x33, 0xf6, - 0x3f, 0xab, 0xf4, 0x81, 0x9e, 0x8a, 0x0b, 0x5d, 0x31, 0xcf, 0xf4, 0x3c, 0x1f, 0x9d, 0x09, 0xd9, 0x63, 0xe2, 0x2f, 0x35, 0x91, 0x07, 0x2d, 0x0f, 0xc0, 0x52, 0x50, 0xc8, 0xd2, 0xca, 0x02, 0x44, - 0x45, 0xf1, 0x36, 0xde, 0xbc, 0x0a, 0x13, 0x0e, 0x65, 0x99, 0x3a, 0x49, 0xe7, 0x39, 0xcf, 0xea, 0xa4, 0x00, 0xc9, 0x93, 0x6e, 0x19, 0x0b, 0x25, 0xbd, 0xf6, 0x9c, 0xcc, 0x2a, 0xc9, 0x74, 0xc1, - 0x71, 0xd5, 0xd6, 0x57, 0x27, 0xc7, 0xf5, 0xb6, 0x70, 0xc5, 0xb1, 0xd0, 0x25, 0xaa, 0xbc, 0x2e, 0x88, 0xae, 0x55, 0xc2, 0xe7, 0xa7, 0x86, 0x6b, 0x69, 0xe8, 0xcb, 0x6a, 0xcb, 0x1b, 0x85, 0xbc, - 0x2f, 0xcd, 0x3c, 0x3f, 0xff, 0xe7, 0x7d, 0xf2, 0x09, 0x4e, 0x56, 0x87, 0x7e, 0x9a, 0x95, 0x9f, 0x3b, 0x18, 0xcf, 0x14, 0x83, 0xbf, 0xa2, 0x9e, 0xe8, 0xfc, 0x72, 0x3c, 0x00, 0xfb, 0x95, 0x83, - 0xcb, 0xb3, 0xd9, 0x4c, 0xf5, 0x44, 0xb3, 0x69, 0x2a, 0x53, 0x59, 0x4c, 0x00, 0xd2, 0xf3, 0x15, 0x60, 0xa3, 0xb4, 0x63, 0x6d, 0x37, 0x91, 0x12, 0xa5, 0x25, 0xaa, 0x1d, 0x9e, 0x66, 0x11, 0x6d, - 0x18, 0x6d, 0xc3, 0xc9, 0x9b, 0x99, 0x7c, 0x04, 0x8d, 0x1d, 0x2a, 0xe7, 0xac, 0x40, 0xe3, 0x0c, 0x1d, 0x89, 0x60, 0x94, 0x8f, 0xf7, 0x36, 0x35, 0x69, 0x59, 0xd4, 0xcd, 0xbc, 0xf6, 0xd8, 0x8d, - 0xed, 0x2d, 0xfd, 0x5d, 0x58, 0xfa, 0x0b, 0xab, 0x2b, 0x4c, 0xc3, 0xb7, 0x54, 0x2f, 0xf2, 0xb8, 0xd4, 0xdb, 0x0a, 0xd3, 0x77, 0x53, 0xf7, 0xf9, 0x93, 0xcf, 0x74, 0xb2, 0xc2, 0x74, 0xf8, 0x72, - 0xfa, 0x3d, 0x43, 0xdc, 0x6a, 0xf0, 0xb2, 0x88, 0xe8, 0xf3, 0x69, 0x6b, 0xf4, 0x44, 0x11, 0xe2, 0x0d, 0xf0, 0x70, 0x70, 0x7b, 0x36, 0xb8, 0x00, 0x7e, 0xcf, 0x18, 0xca, 0x84, 0x67, 0x30, 0xb0, - 0x75, 0x10, 0x0b, 0xdf, 0x1d, 0x18, 0x79, 0x29, 0x4d, 0x51, 0xc9, 0x54, 0x71, 0xc2, 0xee, 0xc6, 0xab, 0x23, 0xd5, 0x22, 0x1d, 0xa1, 0x70, 0x81, 0xbe, 0x95, 0x31, 0x50, 0x1f, 0x1f, 0x00, 0xcb, - 0xaa, 0x74, 0x63, 0x74, 0x10, 0x78, 0x34, 0x5e, 0x6f, 0xcc, 0xce, 0xe5, 0x9b, 0x69, 0x7c, 0xb4, 0xb4, 0x39, 0xa8, 0xa0, 0xeb, 0xb2, 0xe1, 0xb3, 0x8a, 0x28, 0xe4, 0x0c, 0xf3, 0x7a, 0x86, 0x44, - 0x6f, 0xf3, 0x5e, 0x2f, 0x19, 0x9c, 0x1b, 0xa1, 0x77, 0xab, 0x41, 0x9d, 0x0d, 0xf2, 0x32, 0x4c, 0xc2, 0x3a, 0x6c, 0xdd, 0x5f, 0x6f, 0x29, 0xb5, 0x9b, 0x87, 0x9e, 0x4c, 0x16, 0x3d, 0x78, 0xa4, - 0x3a, 0x26, 0x56, 0x16, 0x0f, 0x1c, 0xb7, 0xb2, 0xcb, 0xf0, 0x6c, 0x04, 0xff, 0x7a, 0x58, 0x07, 0x10, 0x98, 0x6f, 0x53, 0x2b, 0xf2, 0xee, 0xc6, 0x15, 0xe4, 0x93, 0x07, 0x4e, 0xf4, 0x2f, 0x53, - 0x33, 0x1e, 0x54, 0x71, 0x56, 0x7f, 0xf2, 0x48, 0x35, 0x38, 0x51, 0xc5, 0xb4, 0xe2, 0xb7, 0xef, 0x7d, 0x6f, 0x1c, 0xa6, 0xae, 0x6f, 0x9e, 0x08, 0x32, 0xe8, 0xdc, 0x32, 0x7b, 0xd5, 0x17, 0xef, - 0x33, 0x13, 0xb7, 0xe6, 0x21, 0xf4, 0x01, 0xa3, 0x0a, 0xcc, 0xf2, 0xa5, 0x36, 0x75, 0xf0, 0x9a, 0x21, 0x7f, 0xc0, 0x84, 0xd3, 0xb3, 0x6f, 0x2b, 0x9f, 0x4e, 0xb7, 0x89, 0x77, 0xb7, 0xf7, 0xae, - 0xb9, 0x2b, 0x5d, 0xef, 0xf1, 0xcf, 0x5f, 0x2c, 0xd1, 0xb4, 0xca, 0xdf, 0x6c, 0x59, 0x08, 0xbe, 0xa7, 0xe8, 0xb7, 0xf6, 0xe8, 0xe5, 0x81, 0xdf, 0x66, 0x55, 0x85, 0xfe, 0x85, 0x2b, 0xe8, 0xfb, - 0x5c, 0xcc, 0xe5, 0x9f, 0xbc, 0x31, 0x59, 0xeb, 0x32, 0x4c, 0xdc, 0x1b, 0xd1, 0x42, 0xbf, 0x7d, 0xba, 0xaa, 0xcd, 0xb2, 0x7e, 0xfc, 0x7c, 0x93, 0x5a, 0xd9, 0xe1, 0x83, 0x28, 0x3e, 0x53, 0xb1, - 0xf0, 0x4f, 0x2a, 0xaf, 0xbd, 0x55, 0x14, 0x77, 0x37, 0x6e, 0x24, 0xe5, 0x33, 0x73, 0xfa, 0xe7, 0x13, 0xf2, 0x0b, 0xe8, 0x70, 0xf0, 0x7a, 0x78, 0x36, 0x9e, 0x7b, 0x4c, 0xc9, 0xbb, 0x76, 0xeb, - 0x1c, 0xe8, 0xea, 0x60, 0x44, 0x41, 0x27, 0x6b, 0x20, 0x61, 0xa4, 0xab, 0xa3, 0xd3, 0x89, 0x90, 0x24, 0x0f, 0xa5, 0x45, 0x2c, 0xc9, 0x2c, 0xab, 0xa3, 0xfa, 0x6a, 0x45, 0x12, 0x2e, 0x42, 0x64, - 0x32, 0x85, 0x8e, 0x68, 0x6f, 0xb7, 0x2a, 0xfc, 0x23, 0xa0, 0x44, 0xd3, 0xcc, 0xce, 0xf6, 0x47, 0x78, 0x64, 0x2f, 0x5b, 0x5b, 0x0c, 0x1b, 0x60, 0x37, 0x6f, 0x09, 0x98, 0x8c, 0x24, 0x49, 0xe9, - 0xb9, 0x7c, 0xf0, 0x1b, 0x7d, 0x74, 0x1a, 0xdf, 0x75, 0x76, 0x11, 0x9d, 0xda, 0xf4, 0x6f, 0xb4, 0xc3, 0xbf, 0x8e, 0x10, 0xbc, 0x53, 0xa8, 0x8f, 0x59, 0xfe, 0x4c, 0xb5, 0xf5, 0x3b, 0xec, 0xcb, - 0x6c, 0x74, 0x7b, 0x65, 0x00, 0xf5, 0xab, 0xc0, 0x16, 0x26, 0x5c, 0x1c, 0xfb, 0xc6, 0xa2, 0x36, 0xe5, 0x6c, 0x94, 0x84, 0xfa, 0xd8, 0x5e, 0x4d, 0x02, 0x49, 0x36, 0xd9, 0x4d, 0xb4, 0x98, 0x22, - 0xbc, 0x5e, 0x41, 0x4a, 0xe8, 0xd0, 0x04, 0xb5, 0x0f, 0x99, 0x08, 0xda, 0xe9, 0x87, 0xa5, 0x2b, 0x48, 0x76, 0xbd, 0xa2, 0xdc, 0x8e, 0xe2, 0x58, 0xcc, 0x58, 0x6e, 0x59, 0xd0, 0x87, 0xe7, 0x3e, - 0x9f, 0xe2, 0xcb, 0xfd, 0x18, 0x9d, 0x4b, 0x64, 0xb8, 0xcd, 0xdb, 0x9e, 0x13, 0xd2, 0x47, 0xed, 0xfb, 0x51, 0x73, 0xf6, 0x71, 0xcd, 0x2f, 0xb3, 0xc0, 0x8d, 0x14, 0xfd, 0xab, 0x08, 0xc8, 0x83, - 0xb5, 0xdc, 0x8f, 0x44, 0x04, 0x7b, 0x2a, 0x72, 0xff, 0x01, 0xfd, 0x24, 0x24, 0xef, 0xaf, 0x0d, 0xb0, 0x7e, 0x71, 0xfc, 0x70, 0x08, 0x6b, 0x56, 0x2a, 0x76, 0xc3, 0xe6, 0xb0, 0x9d, 0xc8, 0x38, - 0xb0, 0x71, 0x94, 0x85, 0xbf, 0x54, 0x69, 0x69, 0x8d, 0xc2, 0x04, 0xb0, 0x2e, 0x74, 0x6b, 0x27, 0x74, 0x34, 0x02, 0x43, 0x74, 0x33, 0x11, 0x16, 0x72, 0xc1, 0x35, 0x8b, 0xe5, 0x9c, 0x02, 0xe7, - 0x6b, 0x18, 0x50, 0xe1, 0x43, 0xad, 0xb3, 0xce, 0x92, 0x4b, 0x0c, 0xd4, 0xd9, 0xe2, 0x1e, 0x73, 0xa8, 0x1c, 0x54, 0xd4, 0x56, 0x80, 0xfa, 0x93, 0xa5, 0x28, 0x7d, 0x82, 0xd6, 0x5f, 0xe6, 0xc0, - 0x91, 0xa7, 0x12, 0x45, 0xaf, 0xe9, 0xef, 0x6b, 0xe6, 0x1b, 0xe9, 0x97, 0x12, 0x4a, 0x84, 0x3d, 0x00, 0x7b, 0x3b, 0xc1, 0xa2, 0x56, 0x9d, 0x40, 0x28, 0xe0, 0x5a, 0x07, 0xe7, 0x85, 0x93, 0x6a, - 0x1b, 0xce, 0x95, 0x6a, 0x1e, 0x2d, 0xc1, 0x78, 0x33, 0xea, 0x08, 0x8a, 0x32, 0xf7, 0x13, 0xcd, 0x2f, 0x5c, 0x93, 0xb0, 0xe8, 0x30, 0x84, 0x41, 0x4a, 0x2f, 0xe7, 0xe3, 0x72, 0xea, 0x0c, 0xd9, - 0x03, 0xb8, 0x86, 0x39, 0xbb, 0xc3, 0x45, 0x08, 0x82, 0x26, 0xe6, 0x74, 0x27, 0xdb, 0x16, 0xf8, 0x13, 0x72, 0x81, 0xbf, 0xc9, 0xdf, 0x87, 0x1e, 0x24, 0xfb, 0xd8, 0x90, 0xe8, 0xb3, 0x69, 0xe9, - 0xe7, 0xb4, 0x7b, 0x87, 0x7d, 0x6e, 0xf8, 0x71, 0x77, 0xa5, 0x4f, 0xb0, 0xfb, 0x44, 0x4d, 0xc6, 0xaf, 0x74, 0x46, 0x9c, 0x52, 0x2c, 0xbb, 0x0c, 0x94, 0x38, 0x55, 0xa7, 0x2c, 0x94, 0x59, 0x2d, - 0x5a, 0x70, 0xa6, 0x86, 0xae, 0xa7, 0x21, 0xa3, 0x6c, 0xe7, 0x91, 0x25, 0xea, 0x09, 0x56, 0x8d, 0x2b, 0x60, 0x1b, 0x58, 0x46, 0x97, 0x48, 0x7b, 0x69, 0x8f, 0xe5, 0xeb, 0x72, 0x53, 0x94, 0x7e, - 0x9d, 0xa6, 0x4b, 0x08, 0xe3, 0x09, 0xb2, 0x25, 0xb7, 0xb8, 0xbc, 0xe8, 0xa4, 0x64, 0xec, 0x2d, 0xc5, 0x9e, 0xab, 0x44, 0xbe, 0x6d, 0xe9, 0x74, 0x9b, 0xe3, 0xfd, 0xf5, 0xe7, 0xbb, 0x8c, 0xee, - 0x19, 0xfa, 0x65, 0x05, 0x2c, 0xf4, 0xbe, 0x58, 0xe5, 0xda, 0x26, 0xe5, 0xd7, 0xd5, 0xc2, 0xc2, 0xee, 0xef, 0x46, 0xd5, 0xe0, 0x68, 0x26, 0xf1, 0xcb, 0xdd, 0xfb, 0x9b, 0x27, 0x26, 0x0e, 0xb2, - 0x6a, 0xd0, 0xd4, 0xe1, 0xab, 0xf9, 0x8b, 0xdc, 0xdb, 0x8a, 0x59, 0xeb, 0x96, 0x71, 0x66, 0x3a, 0x83, 0x93, 0xd9, 0xe5, 0xda, 0x37, 0x16, 0x36, 0x7c, 0x6f, 0x04, 0xe7, 0x65, 0x96, 0x0c, 0xec, - 0x38, 0xbc, 0x16, 0xde, 0xfc, 0x09, 0xa1, 0xef, 0x0d, 0xc2, 0xe2, 0xe5, 0xdb, 0x21, 0xe8, 0x91, 0x0d, 0xf6, 0xc1, 0x73, 0x7b, 0xd0, 0xe6, 0xea, 0xe4, 0xc1, 0xd9, 0x71, 0xf8, 0x3b, 0xaa, 0x7e, - 0xa8, 0x9d, 0xff, 0x84, 0xc8, 0x3f, 0xfe, 0xdb, 0x7f, 0xfb, 0xe3, 0x4f, 0x08, 0xbf, 0xfc, 0xe9, 0x13, 0x28, 0x3b, 0x37, 0x26, 0xb0, 0xb3, 0xb4, 0x3e, 0x6b, 0xbb, 0x63, 0xee, 0x0e, 0xbe, 0x5a, - 0x06, 0xfb, 0x5c, 0x70, 0xe9, 0x93, 0x77, 0xbc, 0xb4, 0xb5, 0xf9, 0x78, 0xa7, 0x6f, 0xb8, 0x49, 0xb3, 0x6c, 0x54, 0xb3, 0x8f, 0x95, 0xac, 0xd9, 0x15, 0x8f, 0x99, 0xac, 0x2c, 0x13, 0x9b, 0x02, - 0xe1, 0xf6, 0x2d, 0x5b, 0x8c, 0x88, 0x09, 0xa0, 0xa6, 0xd6, 0xce, 0x9d, 0xbb, 0x5e, 0xee, 0xea, 0x2b, 0x0d, 0x28, 0x8f, 0xdd, 0x74, 0x11, 0xcb, 0x38, 0x27, 0xd6, 0xd3, 0x45, 0x50, 0xe1, 0x5c, - 0x0c, 0xae, 0x76, 0xf2, 0x2c, 0xb7, 0x97, 0xc0, 0x7e, 0x05, 0x2e, 0xf6, 0xde, 0x1a, 0x98, 0x4e, 0x64, 0x6c, 0xfe, 0x75, 0x1f, 0x8b, 0x6b, 0x23, 0x07, 0xfb, 0x24, 0x54, 0x4d, 0x19, 0x0e, 0x5e, - 0x53, 0xe1, 0x5f, 0x50, 0xec, 0xe7, 0x13, 0xd2, 0xa7, 0x6f, 0x79, 0xa1, 0xd9, 0xa3, 0x7b, 0x67, 0xaa, 0xf5, 0x98, 0xa0, 0xd4, 0xa5, 0xbf, 0x54, 0x7d, 0xcc, 0x95, 0x0f, 0xed, 0xd6, 0x98, 0xed, - 0x55, 0x72, 0xda, 0x7a, 0x96, 0xc9, 0x12, 0x94, 0x26, 0x06, 0xb0, 0xbd, 0x02, 0x90, 0x08, 0xf3, 0xd6, 0xb3, 0x4e, 0x5e, 0x4f, 0x0e, 0xea, 0x78, 0x81, 0x38, 0x0a, 0x62, 0x12, 0x6a, 0x47, 0x1e, - 0x61, 0x6f, 0xd8, 0x08, 0xa0, 0x8b, 0x8c, 0x71, 0x35, 0xc9, 0x1c, 0x1a, 0xc9, 0x44, 0x0c, 0x8d, 0x24, 0x61, 0xc4, 0x2a, 0xd2, 0x7c, 0xee, 0xf7, 0xa1, 0xda, 0x37, 0x49, 0x18, 0xe4, 0xa9, 0x08, - 0xf9, 0x3b, 0xec, 0x37, 0x0a, 0xbd, 0xa6, 0x63, 0x90, 0x7e, 0xd1, 0x71, 0x0f, 0x29, 0x84, 0x51, 0x26, 0x1c, 0x47, 0x11, 0x4c, 0x05, 0x63, 0x77, 0xc8, 0x8e, 0x94, 0xc9, 0x08, 0xda, 0xaf, 0x92, - 0xe5, 0x78, 0x32, 0x91, 0x87, 0x3e, 0xcd, 0xa5, 0xcb, 0x0d, 0xa5, 0xcf, 0xb0, 0xa0, 0xda, 0x73, 0xc4, 0x78, 0xb5, 0x8c, 0xc0, 0x11, 0x6b, 0x63, 0xac, 0xbe, 0xe9, 0x46, 0xf6, 0x6c, 0x0e, 0x00, - 0x87, 0x38, 0xa7, 0x27, 0x73, 0x9f, 0x36, 0xc3, 0x5a, 0xa9, 0x40, 0x84, 0x92, 0xb6, 0x24, 0xfa, 0xf5, 0x92, 0xeb, 0xc7, 0x6d, 0x91, 0x1e, 0x1b, 0x36, 0xc4, 0xb3, 0x23, 0xef, 0x1e, 0xff, 0x93, - 0x66, 0x52, 0x67, 0xfc, 0xef, 0x69, 0x54, 0x8d, 0x15, 0x5e, 0xf2, 0x53, 0xca, 0xa8, 0xdc, 0x55, 0x03, 0x09, 0x7e, 0x84, 0xc7, 0xb2, 0x25, 0x80, 0xac, 0x17, 0x4d, 0x03, 0x43, 0xd5, 0xa8, 0x24, - 0x37, 0x30, 0xca, 0x14, 0x67, 0xbb, 0xe3, 0x2a, 0xc0, 0x7c, 0x4a, 0x1b, 0xfb, 0xe6, 0xb0, 0xe1, 0x17, 0x91, 0xc0, 0xb3, 0x39, 0x3d, 0x8d, 0x26, 0x23, 0xd3, 0x51, 0xe7, 0xb9, 0xc3, 0xd9, 0x93, - 0x95, 0x48, 0x4b, 0x7e, 0x69, 0x10, 0x55, 0x9a, 0xf5, 0xcc, 0x20, 0x3c, 0xec, 0xe0, 0xf6, 0x20, 0x0c, 0x72, 0x53, 0xcf, 0xf6, 0xf1, 0x4e, 0x8f, 0xce, 0x72, 0x0f, 0xda, 0xb4, 0x20, 0x1f, 0x1e, - 0x7a, 0x6b, 0x3f, 0xf7, 0x6e, 0xba, 0x29, 0x3d, 0xc7, 0x7e, 0x9d, 0x3c, 0xfa, 0xc4, 0x9d, 0xcf, 0x70, 0x45, 0xe3, 0x96, 0xc7, 0xd7, 0x70, 0xc6, 0x67, 0x86, 0xc5, 0x93, 0x8a, 0xe4, 0x06, 0xfc, - 0x85, 0xfb, 0x37, 0x97, 0xfa, 0x66, 0x2b, 0x8b, 0x2d, 0x5c, 0x02, 0x2e, 0xc2, 0xb6, 0x01, 0x33, 0x4d, 0x72, 0x87, 0x5d, 0xb7, 0xc3, 0xa1, 0x4c, 0x4e, 0xd3, 0x69, 0x9c, 0xea, 0x91, 0x39, 0xc1, - 0x85, 0x25, 0xdd, 0x98, 0x1a, 0xb5, 0xa2, 0x77, 0x7b, 0x78, 0xd7, 0xb2, 0x1c, 0xa9, 0xd2, 0xd1, 0x81, 0x05, 0xbc, 0x61, 0xc9, 0xce, 0xb6, 0xe8, 0xda, 0x45, 0xf3, 0x74, 0x47, 0xe6, 0xa3, 0x05, - 0xb5, 0xdb, 0x6e, 0xa4, 0x48, 0x67, 0xa9, 0xe5, 0x36, 0x85, 0x7b, 0xb2, 0xfe, 0x2b, 0xad, 0xfb, 0x3e, 0xde, 0xf1, 0x0d, 0xa5, 0x4b, 0xd7, 0xf9, 0x3c, 0xd8, 0xf9, 0x5c, 0x33, 0x92, 0x1b, 0xdc, - 0x17, 0xfa, 0x5e, 0xce, 0xfa, 0xb6, 0x24, 0x01, 0x40, 0x37, 0x01, 0xe6, 0x47, 0x73, 0xe4, 0x2d, 0x67, 0x1e, 0x23, 0xcc, 0x6c, 0x07, 0x87, 0xf5, 0x16, 0xcf, 0xd2, 0x68, 0x9c, 0x24, 0x81, 0x02, - 0x35, 0x01, 0x89, 0x6b, 0x8a, 0xc7, 0xc9, 0xa4, 0xb2, 0xa7, 0x5c, 0x7c, 0x67, 0x4e, 0x1d, 0x61, 0xa2, 0xce, 0x47, 0x15, 0x38, 0xdc, 0xa4, 0x8d, 0x7f, 0xc0, 0x14, 0x67, 0x54, 0x3b, 0x96, 0x41, - 0xb8, 0xb8, 0xcf, 0xc0, 0xf5, 0x76, 0xe4, 0x74, 0x9a, 0xf3, 0x93, 0x52, 0x97, 0x3e, 0x2e, 0xc3, 0xf9, 0xbb, 0x2a, 0xd3, 0x73, 0xbf, 0xd5, 0x55, 0xcf, 0x35, 0xec, 0x79, 0x80, 0xff, 0x42, 0xcd, - 0xfb, 0xab, 0xbd, 0x1b, 0xf8, 0x00, 0xcb, 0x85, 0x0d, 0x3b, 0xc9, 0x7c, 0x15, 0xf3, 0x79, 0x4c, 0x0f, 0x59, 0x74, 0x39, 0x8a, 0x47, 0x2b, 0x9b, 0x62, 0x29, 0x8f, 0xaf, 0x79, 0x7c, 0xac, 0x93, - 0x68, 0xa3, 0xac, 0x34, 0x01, 0x67, 0x5a, 0xbb, 0x1b, 0xad, 0x6c, 0x1f, 0x41, 0x74, 0xb8, 0x83, 0xe6, 0x8a, 0x15, 0x4b, 0xf8, 0xc1, 0xd1, 0x31, 0x94, 0xd7, 0x74, 0x85, 0x65, 0x5a, 0x00, 0x54, - 0xf3, 0x82, 0x9c, 0x67, 0x78, 0xb7, 0xfb, 0x71, 0x2f, 0x89, 0x1b, 0x6d, 0xf1, 0x98, 0x56, 0xcf, 0xac, 0xa9, 0x7c, 0x01, 0x7d, 0x21, 0xd0, 0x69, 0x4c, 0xf4, 0x5c, 0x41, 0x69, 0xcf, 0x9b, 0x6a, - 0x39, 0x9e, 0xd7, 0xc3, 0xed, 0x30, 0x9b, 0xe3, 0xdd, 0x10, 0x4a, 0x8f, 0x9e, 0x0b, 0x4f, 0xdb, 0xd9, 0x52, 0x91, 0xb2, 0x40, 0xd9, 0x7a, 0xed, 0x8e, 0x0b, 0xda, 0x03, 0x98, 0x4e, 0x18, 0x15, - 0x38, 0x78, 0xd8, 0x26, 0x9b, 0x68, 0x11, 0xc5, 0xda, 0x6a, 0x3e, 0x42, 0x1a, 0x4e, 0x1e, 0xdb, 0x41, 0xa7, 0xdb, 0x55, 0xcb, 0xc7, 0xa5, 0x99, 0x53, 0x8e, 0x06, 0x35, 0x2a, 0xa0, 0xcf, 0xbe, - 0x9f, 0xfd, 0x3f, 0x97, 0x96, 0x77, 0xe6, 0xfc, 0x4f, 0x48, 0xf0, 0x26, 0x22, 0x27, 0xb1, 0xb8, 0x00, 0x7d, 0x4f, 0x81, 0x64, 0x38, 0x31, 0xb7, 0x1b, 0x32, 0xf5, 0xb0, 0xe6, 0xa8, 0x3b, 0x25, - 0xed, 0xc2, 0x45, 0x51, 0x00, 0x60, 0x87, 0x64, 0xb3, 0x23, 0x03, 0x50, 0x00, 0x50, 0xc4, 0x4b, 0x21, 0x5b, 0x2d, 0xa4, 0x39, 0xaa, 0xce, 0xc1, 0x54, 0x5d, 0x8e, 0x68, 0x7c, 0x8b, 0x4c, 0x0f, - 0x9a, 0x80, 0xac, 0x95, 0x7d, 0x3d, 0x4c, 0x9c, 0x11, 0x41, 0xcc, 0xd6, 0x5b, 0x74, 0x8a, 0x22, 0x39, 0x33, 0xca, 0x8a, 0x52, 0x84, 0xbb, 0x9e, 0x3e, 0xd2, 0x67, 0xfd, 0x61, 0x4f, 0xd3, 0xcc, - 0x3b, 0xa7, 0xe6, 0x43, 0x63, 0xce, 0x07, 0x8d, 0x81, 0x7a, 0xb5, 0x8f, 0xfc, 0xf5, 0x6f, 0xd7, 0xee, 0x5f, 0xf7, 0x73, 0xe1, 0xc7, 0x5e, 0x75, 0x97, 0x70, 0xfd, 0xdd, 0x84, 0xf8, 0xd2, 0xfc, - 0xe0, 0x34, 0x9b, 0xc2, 0x1f, 0x5d, 0xb2, 0xc7, 0x9e, 0xc3, 0x83, 0x39, 0xd9, 0x0b, 0x53, 0x67, 0x90, 0x1c, 0x07, 0x7b, 0xf3, 0xe2, 0xc3, 0x11, 0xe7, 0xe5, 0x02, 0x37, 0x0f, 0xc4, 0xa1, 0x1f, - 0xd4, 0xa7, 0x27, 0x4a, 0xb7, 0x68, 0x5e, 0x1a, 0xf2, 0x62, 0xe7, 0xbe, 0x01, 0x37, 0x4f, 0xe5, 0x61, 0xfa, 0xf2, 0xdf, 0xbc, 0xa3, 0xd6, 0xb5, 0x12, 0x7d, 0xb0, 0x37, 0xcb, 0xf4, 0xf6, 0x6b, - 0xde, 0x3f, 0x74, 0x38, 0x0e, 0x4c, 0xc7, 0x29, 0x5f, 0xef, 0x13, 0x9f, 0xcc, 0xdd, 0xc8, 0xfd, 0x2f, 0x2b, 0xd7, 0x6e, 0x4a, 0xf7, 0x42, 0xe1, 0xb7, 0xcf, 0x84, 0xdf, 0xff, 0x17, 0x95, 0x9b, - 0xb4, 0x57, 0x82, 0x13, 0xef, 0x9d, 0xcc, 0x3a, 0x4c, 0x8f, 0x83, 0xb8, 0x6c, 0x7e, 0xdd, 0x38, 0xbf, 0xd7, 0xbb, 0xdf, 0x68, 0xdd, 0xe2, 0x73, 0x93, 0xe0, 0xd9, 0x91, 0x53, 0x5c, 0xc7, 0x4d, - 0x31, 0x80, 0x7a, 0x8e, 0x9a, 0xfd, 0xb8, 0xcc, 0x6c, 0x19, 0x5e, 0x4d, 0x34, 0xcd, 0x04, 0x62, 0x75, 0x5c, 0x93, 0xdb, 0x6c, 0xbe, 0xa5, 0xc9, 0xd1, 0x34, 0x24, 0x39, 0x87, 0x1a, 0x73, 0xb4, - 0x39, 0xdc, 0x31, 0xe9, 0xd1, 0x3d, 0x46, 0x22, 0x66, 0x1a, 0x1c, 0x36, 0x9c, 0x6d, 0xda, 0x39, 0x56, 0x31, 0xf3, 0x0d, 0x45, 0x17, 0xfc, 0x30, 0x20, 0xd7, 0xf0, 0x48, 0x66, 0x25, 0x56, 0xb6, - 0x30, 0xa4, 0x92, 0x1b, 0x6c, 0x1e, 0x14, 0x4e, 0xcf, 0x51, 0x53, 0xba, 0x4d, 0xf5, 0xe2, 0xfd, 0x43, 0xbf, 0xfb, 0x55, 0x80, 0xdc, 0xad, 0xe2, 0x7c, 0x44, 0x3d, 0xe2, 0x39, 0xcf, 0xec, 0x15, - 0xf6, 0x44, 0xc1, 0xd7, 0x93, 0x01, 0xd1, 0xcf, 0xf7, 0x2a, 0xb8, 0x6c, 0x34, 0x05, 0x9c, 0xb5, 0x9c, 0x4c, 0xe0, 0x95, 0x6d, 0xa1, 0x63, 0x4b, 0x69, 0xd3, 0xe5, 0xe2, 0x20, 0xf1, 0xd1, 0x24, - 0x01, 0xb6, 0xdb, 0xdc, 0x45, 0x7d, 0xba, 0x99, 0x95, 0xdd, 0x6e, 0x45, 0x24, 0x8c, 0x12, 0x0f, 0x9d, 0x48, 0x17, 0x1b, 0x98, 0x73, 0x04, 0x98, 0x37, 0x11, 0x10, 0xde, 0xa0, 0x59, 0xb1, 0x13, - 0xfd, 0x51, 0x58, 0xe2, 0x91, 0xb9, 0x52, 0x17, 0xb0, 0x2c, 0x2a, 0xf9, 0x77, 0x05, 0x12, 0x9f, 0x13, 0xb6, 0xce, 0xae, 0x39, 0x90, 0xb7, 0xe5, 0xae, 0xd8, 0x53, 0xc9, 0xa3, 0x3e, 0x25, 0xfe, - 0xf7, 0x3a, 0xe0, 0x31, 0x4b, 0xf0, 0x67, 0xe4, 0xf9, 0x0d, 0xf7, 0xcc, 0x93, 0xd7, 0xb3, 0xc1, 0x19, 0xef, 0x7b, 0xa6, 0xb0, 0x84, 0xe5, 0x96, 0xaa, 0xc3, 0x2e, 0x00, 0x6c, 0xb2, 0x51, 0x4a, - 0x34, 0x8c, 0x57, 0x2a, 0x6f, 0x86, 0x68, 0x12, 0x13, 0x3a, 0x5c, 0x50, 0xd5, 0x21, 0xda, 0x23, 0xb9, 0xe7, 0x8e, 0x0f, 0x7c, 0xe8, 0x1b, 0x89, 0x49, 0x4b, 0xdd, 0x14, 0xdc, 0x47, 0x8b, 0x55, - 0x34, 0x02, 0x0f, 0xdb, 0x49, 0x32, 0xb3, 0x55, 0xdd, 0x3e, 0xd6, 0x20, 0x06, 0x1e, 0x37, 0x00, 0x82, 0x72, 0x06, 0xbd, 0x48, 0x20, 0xf7, 0x67, 0x96, 0x6d, 0x0f, 0x8f, 0xe3, 0xde, 0x45, 0x78, - 0xa0, 0x63, 0xcf, 0x56, 0xd2, 0x99, 0x9d, 0xf0, 0x8d, 0xfa, 0xfb, 0x29, 0x27, 0xfb, 0x45, 0x8d, 0xb2, 0x72, 0xe0, 0x9a, 0x9f, 0xb6, 0x68, 0x01, 0x7f, 0x23, 0xcf, 0x38, 0xf2, 0x57, 0xd0, 0x13, - 0x13, 0xaf, 0x87, 0x83, 0x33, 0xd2, 0xf7, 0x1c, 0x8c, 0x0a, 0xdd, 0x5b, 0xe5, 0x44, 0x92, 0x8d, 0xda, 0xf9, 0x51, 0xf0, 0xc8, 0xe3, 0x4e, 0x85, 0x5b, 0x82, 0x02, 0xe0, 0x0d, 0x2a, 0x44, 0xee, - 0xc4, 0x9d, 0x63, 0x00, 0xdd, 0x8d, 0xb4, 0xd2, 0x0c, 0x39, 0x28, 0xf4, 0x53, 0x12, 0xda, 0x47, 0x21, 0x4b, 0x4c, 0xad, 0x51, 0x2b, 0x72, 0x6a, 0x2b, 0x78, 0x9b, 0x3a, 0x11, 0x4d, 0x94, 0x85, - 0xb7, 0x99, 0x20, 0x95, 0xa5, 0x16, 0xb6, 0x8e, 0x6c, 0x24, 0xcf, 0x17, 0x71, 0x3c, 0xca, 0xd6, 0x20, 0xfd, 0xc8, 0xfa, 0x05, 0x55, 0xe1, 0xa7, 0xba, 0x41, 0x5d, 0x31, 0x2f, 0x44, 0x3d, 0xd3, - 0x14, 0xfe, 0xbe, 0xdf, 0x13, 0x34, 0x98, 0x00, 0x28, 0x25, 0x8f, 0xc3, 0xa6, 0x4a, 0x68, 0x21, 0xc3, 0x49, 0x1c, 0x8b, 0x23, 0x87, 0x92, 0xac, 0x6a, 0x86, 0xed, 0xbe, 0x34, 0xf5, 0xb2, 0x32, - 0x19, 0x38, 0xe6, 0x5d, 0x61, 0xef, 0xbd, 0xb1, 0xf7, 0x54, 0x00, 0xf1, 0x05, 0xf5, 0xf2, 0x15, 0x97, 0xe3, 0x01, 0xda, 0x2f, 0x48, 0xc8, 0x48, 0xcc, 0x2e, 0x16, 0x67, 0x21, 0x56, 0x83, 0xc2, - 0xda, 0x68, 0x42, 0x2d, 0xa3, 0x86, 0x02, 0xde, 0xda, 0xe9, 0xc1, 0x5e, 0x09, 0x3c, 0xd6, 0x3a, 0x8d, 0x2f, 0xe6, 0x0d, 0x75, 0x0c, 0x71, 0x51, 0x99, 0x85, 0xb0, 0x1d, 0xf3, 0x7c, 0x0e, 0x1c, - 0x7c, 0x26, 0x68, 0xd6, 0x26, 0x3b, 0x01, 0xba, 0x99, 0x9f, 0x22, 0xd0, 0xd2, 0x81, 0x11, 0x4c, 0x45, 0x30, 0x8f, 0x60, 0x8f, 0xbb, 0x9d, 0xb9, 0x7f, 0x5e, 0x36, 0x6e, 0x7a, 0xcb, 0xfd, 0xfa, - 0xf3, 0xbe, 0x93, 0xdc, 0x25, 0x44, 0xfe, 0x6e, 0xa9, 0xda, 0x65, 0xa0, 0x93, 0xb7, 0x0f, 0x25, 0x61, 0x72, 0x69, 0xe1, 0x75, 0x13, 0xc5, 0x78, 0x22, 0x93, 0xd7, 0xcb, 0xe9, 0xcb, 0xca, 0x24, - 0x74, 0xae, 0x82, 0xfc, 0x37, 0xfa, 0x7a, 0xaf, 0xb0, 0x57, 0x8e, 0x5e, 0x4e, 0xfa, 0x7a, 0x76, 0x20, 0x63, 0x8b, 0xa3, 0xfd, 0x64, 0xca, 0x74, 0xab, 0xd6, 0x0b, 0x77, 0x15, 0x91, 0x25, 0x0b, - 0x40, 0x0c, 0xf5, 0x05, 0x15, 0xd2, 0x80, 0xd4, 0x2d, 0x51, 0xde, 0xde, 0x43, 0x72, 0x2c, 0x67, 0xb3, 0x34, 0x90, 0x0f, 0xb4, 0xbd, 0x5e, 0x46, 0x35, 0xc8, 0x13, 0x07, 0x72, 0xcf, 0x58, 0x60, - 0x83, 0x73, 0x6c, 0x43, 0x6e, 0xac, 0x11, 0xa9, 0xce, 0x90, 0xf4, 0x50, 0xc7, 0x53, 0x6c, 0x42, 0x58, 0xad, 0xfc, 0xfc, 0x2c, 0xfa, 0x56, 0x39, 0xf8, 0xa0, 0x40, 0x23, 0x70, 0x0f, 0x59, 0xe8, - 0x3c, 0xd6, 0xd8, 0x59, 0x6a, 0xbf, 0x28, 0x88, 0x77, 0x72, 0x70, 0x9b, 0x46, 0x78, 0xb2, 0xa8, 0x79, 0x97, 0x0d, 0xbc, 0xf0, 0x9c, 0x6e, 0xad, 0x9b, 0x34, 0xb5, 0x77, 0xd9, 0x24, 0x2b, 0xdd, - 0xf3, 0x22, 0xb8, 0xb0, 0xaa, 0xce, 0x5d, 0x7e, 0x7a, 0xb1, 0x7f, 0x6f, 0x96, 0xce, 0xa7, 0x85, 0xb4, 0xe0, 0x73, 0xde, 0xeb, 0x0b, 0xea, 0x85, 0xf9, 0x97, 0xe3, 0x01, 0xd8, 0xcf, 0x7f, 0xb5, - 0x9a, 0xed, 0x0c, 0xf4, 0xf2, 0x71, 0xbd, 0x65, 0x45, 0x69, 0xc2, 0x51, 0xa2, 0x8b, 0x07, 0x34, 0x8c, 0x91, 0x35, 0xd3, 0x58, 0xd3, 0x6c, 0xbb, 0xb2, 0x50, 0x63, 0x43, 0xe1, 0x9b, 0xc3, 0x5a, - 0x61, 0x37, 0x7b, 0xd8, 0xe7, 0xec, 0x3d, 0x9b, 0x8d, 0xf6, 0x47, 0xd3, 0x8a, 0xbb, 0x75, 0xc7, 0x51, 0x58, 0x37, 0x3a, 0x50, 0xa3, 0x15, 0xb4, 0xdc, 0x44, 0xbb, 0xe1, 0xa6, 0xc6, 0xd7, 0xd2, - 0xc8, 0xd4, 0xb3, 0x9f, 0xc4, 0x4a, 0x7a, 0x2e, 0x0b, 0xf2, 0xaa, 0xdf, 0xa5, 0x6b, 0xc6, 0xf9, 0x57, 0x6b, 0x60, 0x9e, 0xd2, 0x85, 0x6f, 0xb8, 0x27, 0xf2, 0xbd, 0x9d, 0xf5, 0x49, 0x9a, 0x40, - 0x83, 0xa9, 0x20, 0xd6, 0x0b, 0x71, 0xad, 0x44, 0xcb, 0x9c, 0x82, 0xc1, 0x2c, 0x0d, 0xc8, 0x6a, 0x2c, 0x6c, 0x13, 0x19, 0xdf, 0x91, 0x3f, 0x0d, 0x6c, 0x54, 0x5f, 0x26, 0x91, 0x2f, 0x4b, 0xb2, - 0x7f, 0xfe, 0x75, 0xaf, 0x69, 0xe4, 0x97, 0xc3, 0xc1, 0x19, 0xe9, 0x7b, 0xc1, 0x38, 0x84, 0xc5, 0x5a, 0xd8, 0xa2, 0x07, 0xca, 0x65, 0xa5, 0x66, 0x3c, 0x6a, 0xd4, 0x04, 0xf0, 0xa6, 0x5b, 0x7b, - 0xce, 0xf9, 0xcb, 0xf1, 0x3a, 0xe4, 0xc6, 0x3c, 0xe0, 0x6a, 0xe1, 0x51, 0x22, 0xa2, 0xca, 0x57, 0x26, 0x05, 0x64, 0xed, 0x94, 0xa3, 0x5f, 0x83, 0x60, 0x46, 0x89, 0xd9, 0x7e, 0x4c, 0x30, 0x4e, - 0x9d, 0x73, 0xac, 0x69, 0xf2, 0xfe, 0xb2, 0x26, 0x21, 0x98, 0x1f, 0x99, 0x16, 0x40, 0xd3, 0xdf, 0xb6, 0x86, 0x0a, 0xcc, 0x6a, 0x9e, 0x56, 0xb5, 0x19, 0xc7, 0xe2, 0xb9, 0x36, 0xef, 0xfd, 0xfd, - 0x77, 0x6b, 0x56, 0xde, 0xae, 0x57, 0x77, 0x2d, 0x09, 0x7e, 0x39, 0x66, 0xb9, 0x7f, 0x6b, 0x97, 0xfd, 0x5f, 0xfb, 0xc9, 0xe2, 0x9f, 0xe4, 0x6f, 0x08, 0xff, 0x0d, 0x5e, 0x92, 0x7d, 0xe0, 0xef, - 0xeb, 0xe1, 0x7f, 0xfc, 0x3b, 0x04, 0xf5, 0x75, 0x2e, 0xdf, 0x95, 0x28, 0xfe, 0x8d, 0x71, 0xe7, 0x5b, 0xe4, 0x13, 0x33, 0x6f, 0xcf, 0xfb, 0x46, 0x9c, 0x8f, 0xf3, 0xac, 0xa5, 0xba, 0xb5, 0x86, - 0x8e, 0xaa, 0x29, 0xa9, 0xc7, 0x18, 0xe9, 0x89, 0x13, 0x75, 0x81, 0x55, 0xad, 0xb8, 0x6a, 0xcc, 0xd0, 0xe2, 0x0f, 0x9a, 0xb0, 0x98, 0xae, 0x92, 0x31, 0x67, 0x49, 0xcd, 0xa4, 0x04, 0xd7, 0x1e, - 0xb4, 0x0c, 0xf9, 0x2c, 0x9f, 0xad, 0x47, 0x9b, 0x70, 0x1a, 0x85, 0xfa, 0x78, 0x62, 0x79, 0xa6, 0x09, 0x4f, 0x03, 0xdc, 0x2a, 0x5d, 0x01, 0xa7, 0x36, 0x8a, 0x34, 0x07, 0xbf, 0x4e, 0xef, 0xbd, - 0xaf, 0xc8, 0xfc, 0xfb, 0x28, 0x72, 0x87, 0x3c, 0x1c, 0xdc, 0x9f, 0xf7, 0xa5, 0xc8, 0x4e, 0x35, 0xca, 0x54, 0x59, 0xa3, 0xb0, 0x30, 0x09, 0x19, 0x0a, 0x9e, 0xfb, 0x90, 0x35, 0x23, 0xbb, 0x28, - 0x9b, 0xaf, 0x39, 0xff, 0xa0, 0xee, 0xf5, 0x09, 0xe3, 0x6e, 0x9c, 0xbd, 0x8e, 0x4b, 0xed, 0xd0, 0xe6, 0x44, 0x77, 0x96, 0xdb, 0x99, 0x86, 0xe6, 0x1a, 0xeb, 0x2d, 0xe5, 0xc3, 0x66, 0xa9, 0x64, - 0x54, 0x99, 0x96, 0x4c, 0x09, 0xbb, 0xa3, 0xaa, 0x4c, 0xa9, 0xc3, 0x61, 0x36, 0x2f, 0x4d, 0x71, 0xd4, 0xd7, 0x53, 0xf9, 0xbe, 0x9e, 0xf5, 0x47, 0x05, 0xa8, 0x0f, 0x9c, 0xcc, 0x3e, 0xd3, 0xda, - 0x5f, 0x2a, 0x23, 0xfa, 0xb4, 0x9a, 0xf6, 0xef, 0xd3, 0xcf, 0x8f, 0x5f, 0x71, 0x65, 0xf8, 0xc7, 0x1b, 0x7d, 0xb4, 0xf6, 0x89, 0xf3, 0x30, 0x93, 0x38, 0x2c, 0xa4, 0xb7, 0x73, 0x21, 0x34, 0xf2, - 0xb8, 0x9e, 0x6c, 0xfc, 0x5d, 0x13, 0xca, 0xe9, 0xb1, 0xd9, 0x75, 0x87, 0xf5, 0x70, 0x8b, 0x6f, 0xe8, 0x85, 0x86, 0x40, 0x4b, 0x17, 0x19, 0xcf, 0xa0, 0x4d, 0x81, 0x59, 0xa0, 0x08, 0xf3, 0x81, - 0x86, 0x8d, 0xe4, 0x65, 0x38, 0x6a, 0x8d, 0x9c, 0xa7, 0x05, 0xc5, 0x29, 0x52, 0x00, 0x9a, 0xdb, 0x26, 0xb5, 0x4f, 0x3b, 0x49, 0xc2, 0xda, 0x49, 0xd4, 0x33, 0xfc, 0xf2, 0x4d, 0xf5, 0xe1, 0x67, - 0x55, 0xcc, 0x1f, 0xd8, 0xfb, 0xfd, 0xc4, 0xfa, 0xcf, 0x28, 0x2d, 0xbb, 0x36, 0x41, 0x79, 0x1c, 0x8f, 0x80, 0x6e, 0x62, 0x78, 0xbd, 0x25, 0x20, 0xce, 0xac, 0x13, 0xbf, 0xe3, 0xcc, 0x1a, 0x9c, - 0x11, 0xbe, 0xe7, 0x2e, 0xd7, 0xd2, 0x23, 0x66, 0xd3, 0xf1, 0x2b, 0xcb, 0xf5, 0x99, 0x4d, 0xaa, 0xf3, 0x98, 0x2c, 0x7b, 0x8b, 0x79, 0x58, 0x4a, 0x3e, 0x0a, 0x68, 0xfb, 0xb5, 0x3a, 0x33, 0x05, - 0x4f, 0x90, 0x74, 0x70, 0xe1, 0xa6, 0x87, 0x4d, 0xdb, 0xce, 0x97, 0x3c, 0x22, 0x23, 0xc3, 0x9a, 0x12, 0x44, 0x7e, 0xde, 0x0c, 0x63, 0xf6, 0xa0, 0xe9, 0xa2, 0x91, 0xe4, 0x5a, 0x2c, 0xb3, 0x6e, - 0x41, 0xcd, 0x9d, 0x65, 0x37, 0x5e, 0x3d, 0x6f, 0xd0, 0xde, 0xdb, 0x2e, 0x0f, 0x0c, 0xd7, 0x30, 0xf5, 0xce, 0x01, 0xdb, 0x5f, 0x0f, 0x4d, 0xde, 0x30, 0x0d, 0xdc, 0x32, 0xbc, 0xe4, 0x58, 0xe1, - 0x7b, 0xc7, 0xe5, 0xe3, 0xe2, 0x86, 0x9b, 0xdb, 0x37, 0xe6, 0xf0, 0xbb, 0xf0, 0xeb, 0xd9, 0xbe, 0x09, 0xcf, 0x95, 0xc2, 0x59, 0xdc, 0xd4, 0xb7, 0x41, 0xe6, 0x9f, 0x49, 0xd9, 0x7f, 0xfe, 0xfb, - 0x04, 0x2c, 0xac, 0x4c, 0xd3, 0xee, 0x63, 0x44, 0xdf, 0x77, 0xeb, 0x79, 0x24, 0x67, 0xd8, 0x53, 0x69, 0xc7, 0x1b, 0xdc, 0x17, 0x71, 0xbb, 0x9c, 0x0d, 0xb0, 0x7e, 0x69, 0x47, 0x8a, 0x9b, 0xfb, - 0xa2, 0x30, 0x71, 0xf3, 0x70, 0xa1, 0xef, 0x79, 0x84, 0xda, 0xa6, 0xb3, 0x03, 0x80, 0x29, 0xa9, 0xd4, 0xc0, 0xec, 0x58, 0x77, 0x3a, 0x6b, 0xc6, 0xa3, 0x98, 0xbb, 0xda, 0x43, 0x6d, 0x89, 0x74, - 0x63, 0xa4, 0x35, 0x56, 0xee, 0xd1, 0x75, 0xa0, 0x6a, 0x32, 0x0a, 0x52, 0xcb, 0xe6, 0xec, 0xd1, 0x50, 0x2c, 0xd7, 0xc7, 0x35, 0xb6, 0xe5, 0x85, 0x72, 0x37, 0xeb, 0x50, 0x53, 0x1c, 0x19, 0xd9, - 0xf3, 0x9e, 0xf1, 0x4d, 0x43, 0xa2, 0x3f, 0xd1, 0xa7, 0xa2, 0x90, 0xbd, 0x5c, 0xda, 0xcb, 0x24, 0xf5, 0x99, 0xc2, 0xff, 0x79, 0xd8, 0x2a, 0x30, 0x4f, 0xd6, 0xea, 0x69, 0x86, 0x83, 0xfa, 0x35, - 0xdb, 0xf3, 0x60, 0xa7, 0xe5, 0x40, 0x45, 0xc6, 0x39, 0x37, 0x22, 0xb6, 0x3b, 0x75, 0x31, 0x2b, 0xdd, 0x20, 0xb2, 0xba, 0x35, 0x15, 0x4d, 0x73, 0x6c, 0xa8, 0x2c, 0xf9, 0x1c, 0xab, 0xa5, 0x5c, - 0x9d, 0x2b, 0xe8, 0x82, 0x65, 0x8d, 0x25, 0x34, 0x1c, 0x1f, 0xac, 0xe9, 0xb6, 0xf6, 0x86, 0x55, 0x48, 0xc1, 0xa2, 0x2a, 0xb9, 0xe0, 0xc8, 0x36, 0xe9, 0x44, 0xa9, 0x75, 0xbd, 0x53, 0x99, 0xb9, - 0x35, 0x16, 0xd1, 0xbe, 0xf9, 0xa7, 0xcf, 0x26, 0xf1, 0x1f, 0x53, 0xba, 0xef, 0xaa, 0xba, 0x13, 0x5d, 0xac, 0xd0, 0x0f, 0x3f, 0x77, 0x14, 0x9e, 0xab, 0x90, 0xba, 0xc1, 0xbd, 0x52, 0xff, 0x7a, - 0xd6, 0xb7, 0x0a, 0x6a, 0x25, 0x8e, 0x45, 0x78, 0x15, 0x59, 0x9b, 0xb1, 0xe4, 0xe1, 0x30, 0x49, 0x2c, 0x18, 0x8b, 0xe9, 0xda, 0x85, 0xef, 0xd5, 0xbb, 0x29, 0x56, 0x4c, 0x77, 0xc9, 0x24, 0x1b, - 0x05, 0xf4, 0x36, 0xa7, 0xba, 0x65, 0x20, 0x73, 0xf1, 0x02, 0x08, 0x0e, 0xa4, 0xe3, 0xa0, 0xb2, 0x58, 0x81, 0xa0, 0xe8, 0x57, 0xf2, 0x66, 0x6f, 0xa3, 0x38, 0x44, 0x2c, 0x46, 0xbb, 0x10, 0xd3, - 0x6b, 0x66, 0x12, 0xaf, 0x61, 0xcf, 0xfb, 0xa4, 0xe5, 0xe1, 0xcf, 0x14, 0x4b, 0xef, 0x99, 0xeb, 0xde, 0xaa, 0xfa, 0x5b, 0x25, 0xfa, 0x05, 0xf7, 0x4a, 0xdb, 0xeb, 0x59, 0x5f, 0x09, 0x8f, 0x91, - 0xd5, 0xa4, 0x99, 0xe2, 0x6b, 0x9f, 0xde, 0xec, 0x25, 0x7a, 0xb9, 0x73, 0xf4, 0x19, 0x13, 0x06, 0x7a, 0x54, 0x63, 0xf9, 0x96, 0xb7, 0x18, 0x1f, 0xc5, 0xcb, 0x3a, 0x4e, 0x52, 0x91, 0x8f, 0x65, - 0xcb, 0x4f, 0xc6, 0xe4, 0x8a, 0x9b, 0x97, 0xcb, 0x85, 0xa5, 0xeb, 0xd3, 0xb1, 0x68, 0xa5, 0xbc, 0xb9, 0x70, 0x0f, 0xeb, 0x65, 0x1d, 0xf2, 0x1c, 0x19, 0x24, 0xee, 0x36, 0xda, 0x76, 0xb0, 0xe4, - 0x00, 0x3f, 0xe9, 0x9b, 0xf3, 0x4f, 0x32, 0x25, 0x3e, 0xae, 0xc3, 0xf8, 0xfb, 0xec, 0xca, 0x77, 0xd8, 0x57, 0xc6, 0xdc, 0x5c, 0xe9, 0x6b, 0x49, 0xee, 0xa6, 0x91, 0x2d, 0x6e, 0x82, 0x34, 0x9e, - 0x29, 0xd0, 0xee, 0x98, 0xcd, 0x76, 0x04, 0xa7, 0x2d, 0x45, 0x73, 0xcf, 0x62, 0x0b, 0xce, 0x1a, 0xae, 0x3a, 0xd9, 0xc6, 0xf6, 0xa3, 0x31, 0x08, 0x07, 0x9c, 0xc4, 0x81, 0x8e, 0x37, 0xdd, 0x46, - 0x16, 0x2b, 0x2c, 0x5b, 0x1f, 0x72, 0x70, 0xdb, 0x43, 0x58, 0xcb, 0x95, 0x93, 0x5a, 0x1e, 0x29, 0x96, 0xa5, 0x20, 0x45, 0x67, 0xc0, 0x92, 0x1b, 0x8c, 0x08, 0xb5, 0xa7, 0x0f, 0xf1, 0xc8, 0x0f, - 0x78, 0x22, 0x72, 0xf9, 0x4f, 0xe2, 0xee, 0x4b, 0x24, 0xef, 0x6f, 0x64, 0xea, 0x19, 0xf2, 0xc4, 0xcb, 0xf3, 0x41, 0x5f, 0x16, 0x0a, 0xd3, 0x95, 0x02, 0xd6, 0xa6, 0x2a, 0x70, 0x46, 0xdd, 0xce, - 0xb7, 0x73, 0xca, 0x19, 0x4f, 0x02, 0xb7, 0x4a, 0x32, 0xdf, 0x28, 0xeb, 0x46, 0x6b, 0x15, 0xb5, 0x9a, 0xb2, 0x86, 0xb4, 0x83, 0x45, 0x19, 0x30, 0xd3, 0x2a, 0x2f, 0x0c, 0xb8, 0x5d, 0xa7, 0xd9, - 0xca, 0x27, 0xe6, 0x0c, 0x04, 0xc8, 0x3b, 0x08, 0xdf, 0x40, 0x23, 0x8a, 0x0f, 0x6d, 0x68, 0xdc, 0x4c, 0x49, 0x6b, 0x42, 0xda, 0x70, 0x82, 0x7d, 0xb7, 0x3a, 0xf8, 0x6f, 0xc8, 0x00, 0xbe, 0xb5, - 0x20, 0x7d, 0x4c, 0xc2, 0x67, 0x96, 0xf7, 0x5c, 0x31, 0x87, 0x83, 0x97, 0xa3, 0xbe, 0xcb, 0x79, 0x1c, 0xfb, 0x58, 0x04, 0x74, 0xab, 0x41, 0x13, 0x14, 0x8f, 0x35, 0xc3, 0x56, 0x8a, 0x49, 0xbe, - 0x04, 0xa6, 0xf5, 0x7a, 0x2b, 0x28, 0xce, 0x7c, 0xbd, 0xc1, 0x87, 0xb4, 0x87, 0x45, 0x15, 0xdc, 0x65, 0x8d, 0x5c, 0x15, 0x33, 0x62, 0x8e, 0x57, 0xd3, 0x43, 0x58, 0xcf, 0x27, 0x00, 0xb1, 0xd4, - 0x97, 0xf0, 0x68, 0xe9, 0x68, 0xdc, 0x8a, 0x75, 0x9a, 0x51, 0xb7, 0x42, 0xab, 0x69, 0x9a, 0x29, 0x42, 0x5a, 0x98, 0xff, 0xa7, 0xe7, 0xed, 0xdf, 0xd8, 0xf3, 0xf6, 0x0b, 0x41, 0xba, 0x2c, 0xf1, - 0xb6, 0x8e, 0x03, 0xc7, 0xf5, 0xcc, 0x26, 0xfe, 0x7b, 0xab, 0xaf, 0x3f, 0xa0, 0x9f, 0x84, 0xeb, 0xfd, 0xb5, 0x3e, 0x76, 0x06, 0x34, 0x10, 0xd7, 0x79, 0x6d, 0xb7, 0xd6, 0x2c, 0xc3, 0x49, 0xaa, - 0x30, 0xa1, 0x25, 0x96, 0x39, 0x25, 0x8a, 0x86, 0xee, 0x72, 0xbf, 0xfb, 0x61, 0xb8, 0xf5, 0xc6, 0xe5, 0xfa, 0xec, 0x4b, 0x7f, 0xbe, 0x43, 0xd3, 0x0b, 0xe8, 0xe9, 0x03, 0xaf, 0x87, 0xe7, 0xef, - 0xfa, 0x66, 0xa7, 0x26, 0x68, 0x20, 0x5a, 0x50, 0xb4, 0x76, 0x3c, 0x61, 0x25, 0xec, 0x17, 0xed, 0x82, 0x59, 0x32, 0xac, 0x8a, 0xfb, 0xaa, 0x0a, 0x59, 0xde, 0xe3, 0xef, 0xea, 0x31, 0x37, 0x7c, - 0xee, 0xfd, 0xfd, 0xac, 0xc7, 0xc0, 0x8d, 0xf7, 0xf9, 0x88, 0x50, 0xf0, 0x53, 0x8d, 0x1c, 0x5e, 0x40, 0xcf, 0x84, 0xba, 0x1c, 0x9e, 0xf3, 0xa8, 0x7d, 0xd6, 0x8d, 0x0e, 0xdb, 0x99, 0xa9, 0xa1, - 0x43, 0x3d, 0x36, 0x11, 0xb5, 0x3b, 0xae, 0x27, 0xad, 0x24, 0x70, 0x9a, 0xee, 0xce, 0xd9, 0xb6, 0xe0, 0x96, 0x75, 0x5a, 0x8c, 0x9d, 0xa6, 0x93, 0xd8, 0xbc, 0xcb, 0x05, 0xa3, 0xa3, 0xaa, 0xdd, - 0x72, 0x1d, 0x18, 0xf0, 0x12, 0x60, 0xd2, 0x71, 0x28, 0xae, 0x47, 0xdd, 0x4c, 0xcc, 0xe6, 0x53, 0x77, 0x9d, 0x6b, 0xcb, 0x83, 0x89, 0x3a, 0xba, 0x6b, 0xcc, 0x85, 0xc2, 0xdd, 0x7f, 0x5d, 0x56, - 0x1e, 0xbe, 0x5b, 0xce, 0xfd, 0xf7, 0x99, 0x86, 0x77, 0xc8, 0x67, 0x62, 0xdc, 0x9c, 0xf7, 0x35, 0x0f, 0x39, 0x90, 0x1e, 0x43, 0x8b, 0xc9, 0xb0, 0xe2, 0x8f, 0x46, 0x4c, 0xd8, 0xf3, 0x8c, 0x20, - 0x53, 0xcc, 0xd9, 0x12, 0xae, 0x2c, 0xee, 0xf7, 0xb9, 0xce, 0x87, 0xda, 0x36, 0x90, 0xba, 0xcd, 0xc1, 0x50, 0xa8, 0xb5, 0xdc, 0x8c, 0xc9, 0x36, 0x4e, 0xb7, 0xd3, 0xe3, 0xea, 0xe0, 0x94, 0x8a, - 0x94, 0xed, 0x2a, 0x5c, 0xe3, 0x57, 0x4a, 0x3a, 0xf5, 0xac, 0xce, 0x54, 0x1c, 0x4c, 0x5d, 0x45, 0x81, 0xef, 0x03, 0x7d, 0x17, 0x52, 0x3e, 0x0e, 0x56, 0xdd, 0x89, 0xdb, 0xa7, 0x51, 0xcc, 0x2a, - 0x74, 0xdc, 0x81, 0x1d, 0x98, 0x69, 0xea, 0xbe, 0x2d, 0xa1, 0x7c, 0x62, 0x27, 0xbe, 0x7e, 0x05, 0x4c, 0x61, 0x6e, 0x3a, 0x4e, 0xf9, 0xfb, 0x8b, 0x4d, 0x5e, 0x46, 0xcf, 0xe8, 0xb6, 0x17, 0xd4, - 0x13, 0xf3, 0x5e, 0x8e, 0x07, 0x67, 0xac, 0xef, 0x19, 0x07, 0x2e, 0xe7, 0x43, 0x1c, 0x24, 0x0e, 0xd9, 0x41, 0x94, 0x32, 0x96, 0x98, 0x45, 0x1b, 0x68, 0xea, 0x89, 0xd6, 0x2a, 0x93, 0x41, 0xc0, - 0xaa, 0xa5, 0xd0, 0x8e, 0x2a, 0x41, 0x54, 0x85, 0x38, 0x18, 0x06, 0xc6, 0x71, 0xb7, 0x21, 0x97, 0x79, 0xb2, 0xf6, 0x88, 0x46, 0xdf, 0xf3, 0x2a, 0xb2, 0x05, 0xcc, 0x9d, 0x81, 0x6f, 0x87, 0x7b, - 0x88, 0x34, 0x62, 0x4d, 0x64, 0xc7, 0xba, 0x16, 0xea, 0x32, 0xcf, 0x21, 0xfe, 0xcf, 0xec, 0x7a, 0xa8, 0x8f, 0xd7, 0xf9, 0xae, 0x95, 0xd5, 0x63, 0xf2, 0x3d, 0xb3, 0x50, 0xef, 0x16, 0xf8, 0xb2, - 0x86, 0xfc, 0xf5, 0xb4, 0xef, 0x12, 0x3d, 0x68, 0x1e, 0xa1, 0x31, 0xb7, 0xe6, 0xe3, 0xe1, 0x61, 0x8c, 0xed, 0xc6, 0x74, 0x4a, 0xcc, 0x01, 0x0b, 0xae, 0x6b, 0x7e, 0xbd, 0x34, 0xc9, 0xaa, 0x0b, - 0x98, 0x79, 0xa9, 0xd1, 0x8d, 0x26, 0xd0, 0xc3, 0xcc, 0x45, 0xd8, 0xc5, 0x4a, 0x5a, 0x05, 0x45, 0xe0, 0xcf, 0xaa, 0x7c, 0xef, 0x1f, 0x67, 0x0e, 0xbe, 0xe6, 0x8e, 0xfb, 0xb1, 0x5c, 0x28, 0xad, - 0x1e, 0xda, 0x53, 0x02, 0x8e, 0x77, 0x3e, 0x9d, 0xce, 0xd9, 0xa7, 0xd7, 0x91, 0xff, 0x34, 0x80, 0xf6, 0x4f, 0xb3, 0xbe, 0xc3, 0x17, 0x0f, 0xff, 0x0b, 0x7d, 0xf6, 0xf3, 0x18, 0xda, 0x2b, 0xea, - 0x85, 0x99, 0x97, 0xe3, 0xbe, 0xad, 0xe8, 0xc1, 0x85, 0x82, 0x01, 0x22, 0x37, 0x11, 0x76, 0x73, 0xa7, 0x8b, 0xc6, 0xcb, 0x91, 0xd5, 0x50, 0x5b, 0x5b, 0x21, 0x41, 0x94, 0x76, 0x1a, 0x82, 0x02, - 0x05, 0xb7, 0xc6, 0x2b, 0x36, 0x44, 0xa6, 0x61, 0xc2, 0x8c, 0x52, 0x17, 0x4f, 0xd0, 0xf1, 0x4c, 0x30, 0xbc, 0x6d, 0x0a, 0x6c, 0x8c, 0x50, 0xb3, 0xc6, 0x3b, 0x74, 0x8a, 0x6a, 0x09, 0xeb, 0xd1, - 0xc6, 0x3c, 0xcc, 0x57, 0xd1, 0x28, 0xd7, 0x48, 0x47, 0xfc, 0x9f, 0x1b, 0x42, 0xf8, 0xd0, 0x28, 0xfc, 0xf1, 0x94, 0xf9, 0xe4, 0x50, 0xb9, 0x81, 0x7e, 0xa1, 0xef, 0xeb, 0x85, 0x73, 0xad, 0x47, - 0x8f, 0xe1, 0x62, 0xac, 0x99, 0xad, 0xee, 0x56, 0x78, 0x4e, 0x1f, 0x9d, 0x63, 0x33, 0x0b, 0x9d, 0xca, 0x25, 0xb8, 0x8a, 0x3d, 0xd4, 0xd6, 0x9c, 0x50, 0x15, 0x57, 0x66, 0xb2, 0xce, 0xdf, 0x0e, - 0x7d, 0xa2, 0x74, 0xc0, 0x83, 0x1c, 0x26, 0xfa, 0x26, 0x6e, 0x8d, 0x2d, 0x33, 0x5c, 0xc2, 0x6b, 0xdf, 0x90, 0x22, 0xf5, 0x48, 0xc0, 0xd8, 0xdc, 0x73, 0xe3, 0x95, 0xab, 0xd8, 0xcc, 0x7a, 0x44, - 0x24, 0x49, 0xbd, 0x9d, 0x69, 0xcf, 0x07, 0x29, 0x1f, 0xed, 0x95, 0xf4, 0x6c, 0xa9, 0x5d, 0x2f, 0x97, 0xa9, 0x1a, 0x58, 0x59, 0x16, 0xbb, 0x66, 0xfa, 0xb6, 0xb4, 0xff, 0x33, 0x75, 0xf6, 0xc4, - 0x6c, 0xf0, 0x1e, 0xfd, 0xca, 0xa6, 0xbb, 0x6b, 0x7d, 0x93, 0x93, 0x96, 0xe6, 0x08, 0xea, 0x8e, 0x99, 0x8c, 0xe5, 0x39, 0x65, 0x4f, 0x76, 0x2e, 0x0b, 0x35, 0xe9, 0x7e, 0xb1, 0x9a, 0xe7, 0x86, - 0x6e, 0x9a, 0x98, 0xd2, 0x36, 0x47, 0x5f, 0x3c, 0x8a, 0x43, 0x1b, 0x8e, 0x3d, 0x02, 0x1a, 0x25, 0xd2, 0xd2, 0xa0, 0x65, 0x4c, 0x76, 0xe8, 0x6d, 0x9c, 0x3b, 0x20, 0x24, 0x47, 0x14, 0xed, 0x27, - 0x2a, 0xb9, 0xf5, 0x0a, 0x93, 0x07, 0x92, 0xad, 0xa9, 0xf0, 0x4e, 0x39, 0xdc, 0x3c, 0xad, 0xd8, 0xfe, 0x65, 0xc2, 0x0a, 0xf7, 0xc5, 0x82, 0x9f, 0x39, 0xc6, 0x4f, 0x98, 0xac, 0x6f, 0xb8, 0x17, - 0xae, 0xbe, 0x9c, 0x9d, 0x1d, 0xe4, 0x1e, 0x86, 0x6b, 0x5a, 0x35, 0xfb, 0xfa, 0x60, 0x78, 0x6b, 0x0d, 0x27, 0xb8, 0xf2, 0x18, 0x8f, 0x56, 0x13, 0x01, 0x68, 0xf2, 0x74, 0x02, 0x1a, 0xe0, 0xd8, - 0xcf, 0xf7, 0x69, 0x9d, 0x8b, 0xe4, 0x28, 0x81, 0xd8, 0xa1, 0xb4, 0x9a, 0x82, 0xdd, 0xc6, 0xeb, 0xbc, 0xd5, 0x5a, 0x19, 0x8e, 0x54, 0x73, 0x88, 0xaf, 0x8d, 0x2a, 0x02, 0x4d, 0x3b, 0x67, 0x22, - 0x8a, 0x03, 0x97, 0x53, 0xe8, 0x20, 0xe1, 0x86, 0xb3, 0x8a, 0x47, 0xd8, 0x0f, 0x2b, 0x6d, 0xfe, 0x49, 0x0c, 0xb9, 0x6f, 0xa5, 0xf1, 0xd9, 0x74, 0xf3, 0x14, 0x4f, 0x6e, 0xa0, 0x2f, 0x6c, 0xb9, - 0xb9, 0xd0, 0xb7, 0x3b, 0xdc, 0xd0, 0x42, 0x0d, 0xa5, 0x9a, 0x11, 0x06, 0xa6, 0x29, 0xf5, 0xfc, 0x50, 0x0d, 0x83, 0x91, 0x4a, 0xa6, 0xad, 0xb7, 0xf2, 0x45, 0xea, 0xb8, 0xd4, 0x9d, 0x7a, 0xa6, - 0x0a, 0x2b, 0xab, 0x38, 0xe2, 0x11, 0x05, 0x85, 0x76, 0xe2, 0x47, 0x1e, 0xa9, 0x4e, 0x32, 0x69, 0xe9, 0xbb, 0x22, 0xba, 0x3f, 0x62, 0xb5, 0x6e, 0xf2, 0x2e, 0x9f, 0x35, 0xdd, 0x74, 0x4d, 0x6d, - 0xac, 0x34, 0x1a, 0xa1, 0x36, 0x6c, 0xfc, 0x2b, 0xc4, 0x57, 0xc3, 0xea, 0xa4, 0x78, 0xbf, 0x48, 0xd8, 0x3e, 0x57, 0x8d, 0xf8, 0x06, 0x7b, 0xe1, 0xc8, 0xf5, 0xa4, 0x6f, 0x35, 0xa2, 0x68, 0x2d, - 0x2d, 0x6a, 0xb3, 0xdb, 0xe0, 0x20, 0xa2, 0x84, 0x68, 0xc4, 0x18, 0x2d, 0x3a, 0x5a, 0xb9, 0xca, 0x62, 0x9d, 0xa2, 0xc7, 0xd9, 0xbe, 0xb2, 0x3a, 0x63, 0x9f, 0x95, 0x4c, 0x76, 0x64, 0xc2, 0xa6, - 0xae, 0x36, 0x48, 0xba, 0xd0, 0x1d, 0x8b, 0x43, 0xf0, 0xce, 0x0b, 0x66, 0x0b, 0x5c, 0x60, 0xe8, 0x9c, 0x33, 0xe6, 0xd3, 0x1d, 0x5d, 0xa7, 0x05, 0xb6, 0xd8, 0x1e, 0x92, 0x36, 0x46, 0xa2, 0xea, - 0xfd, 0x9a, 0xd8, 0x9f, 0x46, 0xe3, 0xc0, 0xfb, 0x7d, 0x35, 0xbe, 0x24, 0xa9, 0xef, 0xa6, 0x6e, 0x69, 0xd6, 0x59, 0x39, 0x78, 0xc9, 0x0e, 0x7d, 0x15, 0x4d, 0x79, 0xca, 0x10, 0xf8, 0xf8, 0x8a, - 0x0b, 0xa5, 0x3f, 0x5e, 0xbf, 0x84, 0x55, 0x7a, 0xd8, 0x05, 0x51, 0xc5, 0x44, 0xc7, 0x51, 0x8c, 0x1c, 0x43, 0x8d, 0x11, 0x00, 0xbe, 0xd2, 0x9c, 0x64, 0xbc, 0x67, 0x78, 0x9b, 0x3b, 0x98, 0x9a, - 0xba, 0xaa, 0xf2, 0xa5, 0x93, 0xc7, 0x53, 0x59, 0x99, 0x8f, 0xda, 0x02, 0x0a, 0x0d, 0x7f, 0xee, 0xee, 0xdc, 0x09, 0xb8, 0x82, 0x70, 0xa2, 0x70, 0x1b, 0x12, 0xb7, 0x3b, 0xc1, 0x3c, 0xb8, 0x0e, - 0x52, 0x0c, 0xe5, 0xae, 0xd9, 0x83, 0xd5, 0x7e, 0x05, 0x86, 0xe5, 0x8a, 0xec, 0xe9, 0x44, 0xfe, 0xcb, 0xf7, 0x5b, 0x7a, 0x4b, 0xb5, 0x3e, 0xe2, 0x33, 0xfa, 0x5c, 0x68, 0xe0, 0x82, 0x79, 0x65, - 0xec, 0x69, 0xfc, 0xa0, 0xfd, 0xc2, 0x01, 0x07, 0x37, 0x16, 0xcd, 0x23, 0xcb, 0x22, 0xb8, 0xe1, 0x33, 0x84, 0xa1, 0x06, 0x71, 0x48, 0xe4, 0x2a, 0x82, 0x06, 0x1b, 0x6b, 0x13, 0x93, 0x5c, 0xd4, - 0x62, 0x4b, 0x25, 0xd9, 0x2d, 0x68, 0x34, 0x18, 0x3b, 0x34, 0x52, 0x07, 0xa4, 0xe4, 0xed, 0x46, 0xad, 0x6e, 0x56, 0xab, 0x35, 0x90, 0x68, 0x2a, 0x67, 0x04, 0xd3, 0x9d, 0x6f, 0x78, 0x87, 0x60, - 0x25, 0xa6, 0xe5, 0x7e, 0x5b, 0xa2, 0x6e, 0x2c, 0x8a, 0xdf, 0x45, 0xb3, 0xbf, 0x4c, 0x43, 0xbf, 0x29, 0x99, 0x97, 0x35, 0xe2, 0x3f, 0xe5, 0xeb, 0x4f, 0xc6, 0xdf, 0xfb, 0xae, 0x79, 0x8f, 0x15, - 0xdb, 0x93, 0xde, 0xcd, 0x1d, 0xf8, 0x85, 0x37, 0x77, 0x97, 0xce, 0x51, 0xac, 0x1e, 0xbe, 0x8e, 0x53, 0x2c, 0x5a, 0xb3, 0x5c, 0x99, 0x7b, 0xad, 0x9a, 0x5a, 0x1b, 0xda, 0x5d, 0xa8, 0x44, 0x47, - 0x75, 0xe4, 0xbc, 0x5e, 0x8c, 0x6c, 0x07, 0x26, 0xf5, 0xc6, 0x6b, 0x9a, 0x69, 0x17, 0x80, 0x33, 0x32, 0xdf, 0xb0, 0xd1, 0x62, 0x9d, 0xea, 0x20, 0x49, 0xb7, 0x44, 0xa5, 0x6b, 0x70, 0x33, 0xc5, - 0xe4, 0x5c, 0xe0, 0xf6, 0xa1, 0x4b, 0xb9, 0x1c, 0x73, 0x60, 0x74, 0x4a, 0x55, 0xbd, 0x86, 0x30, 0x0c, 0xf9, 0x5f, 0x63, 0xca, 0x49, 0x9b, 0xc4, 0xfa, 0x74, 0x53, 0x0d, 0xe2, 0xa9, 0xbc, 0xcf, - 0x2b, 0xea, 0x95, 0x23, 0xe7, 0xe3, 0xf3, 0x1a, 0xb2, 0x1e, 0x9a, 0x0f, 0x85, 0x26, 0xa1, 0xb7, 0xf3, 0x71, 0x97, 0x94, 0x8e, 0xb1, 0x98, 0x3b, 0xb5, 0x94, 0xbb, 0x2b, 0x65, 0x5d, 0xb4, 0xe2, - 0x98, 0x51, 0x3a, 0xa9, 0xae, 0xd9, 0x96, 0xd9, 0xd2, 0x04, 0x0a, 0x01, 0x79, 0x6a, 0x90, 0xd4, 0xa6, 0x05, 0x41, 0x10, 0x5d, 0x6f, 0x57, 0x28, 0x22, 0x2c, 0x79, 0x3a, 0x5e, 0x8e, 0xec, 0x59, - 0xbb, 0xc9, 0xf1, 0x8d, 0xa1, 0x1a, 0xf2, 0x38, 0xb6, 0x66, 0x9a, 0x7e, 0x38, 0xa4, 0xdf, 0x8d, 0x97, 0xef, 0xe5, 0xbd, 0x5f, 0xb7, 0x83, 0xb7, 0xaf, 0xfd, 0xd6, 0xbc, 0xfa, 0xf9, 0x5a, 0x97, - 0xf7, 0xe0, 0x77, 0xd4, 0xbd, 0x31, 0xb1, 0x7a, 0x74, 0x1f, 0xdd, 0xca, 0x60, 0x3c, 0x1f, 0xa6, 0x23, 0x2c, 0x5f, 0x67, 0xf2, 0xb2, 0x19, 0xb5, 0xd0, 0xd8, 0xe0, 0xb1, 0xf5, 0xd8, 0x36, 0x9a, - 0x8d, 0xa8, 0x2c, 0x76, 0xeb, 0x1d, 0x35, 0x83, 0x9d, 0x45, 0x31, 0x41, 0x3b, 0x78, 0x16, 0xef, 0x66, 0xf2, 0xc6, 0x65, 0x71, 0x52, 0x6c, 0xd8, 0x66, 0xbc, 0x1c, 0xd3, 0x43, 0x6d, 0xea, 0x02, - 0x2b, 0xd6, 0x00, 0xbc, 0xd1, 0x78, 0xb9, 0x5b, 0x31, 0x12, 0x0e, 0x6e, 0x42, 0xf7, 0x47, 0x4b, 0xf2, 0xff, 0x79, 0xf2, 0xfe, 0x75, 0xd7, 0xc5, 0x27, 0xf9, 0xf2, 0xa0, 0xeb, 0x62, 0x2f, 0x3e, - 0xb4, 0xf1, 0x52, 0x85, 0x08, 0x71, 0x53, 0xa0, 0x68, 0xb6, 0x6f, 0x31, 0x4a, 0xd8, 0x22, 0x93, 0x02, 0xb4, 0x04, 0x9e, 0xb1, 0x48, 0x60, 0x37, 0x45, 0xe4, 0xa5, 0x01, 0x7b, 0xa1, 0xb1, 0xe1, - 0xd4, 0xba, 0xab, 0x75, 0x06, 0x0b, 0xc1, 0x49, 0x37, 0x31, 0x0e, 0x53, 0x7a, 0xcf, 0x61, 0x64, 0x41, 0x71, 0x6a, 0x7d, 0x70, 0xc6, 0x5b, 0x85, 0x1b, 0x2a, 0x98, 0x10, 0xa6, 0xd0, 0x3e, 0x9a, - 0x14, 0x53, 0xfd, 0x3b, 0xe3, 0xea, 0xcb, 0x99, 0xff, 0xd7, 0x5b, 0x6c, 0xf8, 0x03, 0x7b, 0xfe, 0x97, 0xe5, 0xe9, 0xe3, 0xae, 0xaa, 0x9f, 0x71, 0xf8, 0xa9, 0x99, 0xe6, 0xc1, 0x2b, 0x2e, 0xfc, - 0x7e, 0x70, 0xa3, 0x6f, 0x84, 0xad, 0x2a, 0x36, 0xb0, 0x4c, 0x37, 0xd0, 0x10, 0x3c, 0xe2, 0x4d, 0xab, 0x1d, 0xc5, 0x7a, 0xc2, 0x75, 0xc7, 0x80, 0x8a, 0x26, 0x62, 0xcc, 0xda, 0xee, 0x34, 0x5b, - 0x2f, 0x17, 0x2a, 0xa9, 0x8e, 0x18, 0x79, 0x64, 0xb7, 0xa1, 0x3d, 0x14, 0x9c, 0xca, 0x00, 0x77, 0x8c, 0x3c, 0x42, 0x58, 0xe6, 0x88, 0xcc, 0x65, 0x66, 0x6a, 0xcc, 0x43, 0x76, 0x88, 0xec, 0x01, - 0x8a, 0x1d, 0xca, 0x82, 0xc5, 0xb3, 0x1b, 0x27, 0xe8, 0x69, 0xe4, 0xf5, 0x0a, 0x29, 0xfc, 0x4f, 0xe1, 0xdd, 0xd7, 0x6d, 0x61, 0xc0, 0x27, 0x4a, 0x54, 0x5f, 0x51, 0xaf, 0x1c, 0x7a, 0x69, 0x04, - 0x03, 0xf6, 0x29, 0x56, 0xad, 0x19, 0x58, 0xd6, 0xba, 0xb0, 0x8d, 0x5c, 0x3c, 0xf3, 0x78, 0x95, 0x88, 0x61, 0xc4, 0x8e, 0x68, 0x6e, 0x6d, 0x82, 0x23, 0xdf, 0x22, 0x0e, 0x31, 0x55, 0xcc, 0xf0, - 0x68, 0x86, 0xb9, 0x11, 0xde, 0xf0, 0x0a, 0x02, 0x4b, 0xb1, 0xca, 0x23, 0x9b, 0x25, 0x1f, 0xfa, 0xb5, 0x39, 0x73, 0xd9, 0x4d, 0x33, 0xf2, 0xb2, 0xc0, 0xb6, 0xb7, 0x7a, 0x3b, 0x0f, 0x8d, 0xb5, - 0xc7, 0x71, 0x29, 0xa7, 0xcb, 0x75, 0xcf, 0x38, 0xcf, 0xff, 0x0e, 0x96, 0xf7, 0x6b, 0x0f, 0xce, 0xbf, 0x35, 0xae, 0x70, 0x41, 0xbd, 0xf2, 0xf3, 0x52, 0x66, 0xde, 0x33, 0x9a, 0x30, 0x19, 0x4e, - 0xf8, 0x71, 0xb1, 0x54, 0xd3, 0xd6, 0xb1, 0x0f, 0xc5, 0x9c, 0xda, 0x1e, 0x8e, 0x5c, 0x80, 0xb6, 0x90, 0x2c, 0x33, 0xdc, 0x84, 0xcd, 0x7d, 0xda, 0x04, 0x55, 0xdd, 0xcf, 0x97, 0xf4, 0x74, 0x5d, - 0x75, 0x76, 0xc9, 0xdb, 0x9e, 0xe7, 0x63, 0x4d, 0xb0, 0x17, 0x7d, 0x7e, 0xb2, 0xa2, 0x61, 0x55, 0x3d, 0x24, 0x05, 0x1e, 0x56, 0x61, 0xd5, 0x91, 0x44, 0xdd, 0x49, 0x20, 0x54, 0x37, 0xb3, 0xe0, - 0x07, 0xfc, 0xfc, 0x97, 0x2d, 0x08, 0x0a, 0xab, 0xf3, 0x2a, 0xcc, 0xab, 0x6a, 0xfb, 0x94, 0xa1, 0xd0, 0x13, 0xdb, 0x0a, 0xde, 0x43, 0x5f, 0xb8, 0x7a, 0x73, 0xe1, 0x1c, 0x92, 0xed, 0xb1, 0xa9, - 0x20, 0x5b, 0xb0, 0x28, 0x24, 0x6d, 0x8c, 0x02, 0xf6, 0xfc, 0x7a, 0x26, 0x91, 0x2a, 0xab, 0x4c, 0x95, 0x45, 0x30, 0x56, 0x66, 0x8d, 0x8e, 0x50, 0x29, 0x8f, 0x08, 0x08, 0xbe, 0x24, 0x17, 0x4b, - 0x4d, 0x3e, 0x88, 0x87, 0xad, 0xbf, 0x1b, 0x3a, 0x00, 0xb1, 0x89, 0x92, 0xfd, 0x0c, 0x6e, 0x33, 0x38, 0xd1, 0x13, 0x6d, 0x49, 0xca, 0xba, 0xb1, 0x6c, 0xc0, 0x82, 0x25, 0x2d, 0x85, 0xc7, 0x7c, - 0x26, 0xac, 0xa2, 0x9e, 0xfa, 0xd3, 0x6c, 0xcd, 0xf0, 0x12, 0x6f, 0xbc, 0xf9, 0xc7, 0xdf, 0xb8, 0xfc, 0x66, 0x45, 0x7c, 0xbf, 0xc2, 0xe0, 0xbe, 0x4b, 0xfd, 0x39, 0x65, 0x4b, 0xde, 0x03, 0xbc, - 0xad, 0x9c, 0xbe, 0x04, 0xe3, 0xef, 0x6e, 0xfe, 0xef, 0xa0, 0x34, 0xde, 0x7a, 0x99, 0xff, 0xad, 0x93, 0xf6, 0x15, 0xf6, 0x22, 0x60, 0xd7, 0x93, 0xbe, 0x93, 0x73, 0x61, 0xd7, 0x55, 0xb3, 0x32, - 0x92, 0xb9, 0x00, 0x02, 0xad, 0x28, 0xae, 0xbd, 0x4c, 0x69, 0x8f, 0x53, 0x17, 0x06, 0x66, 0x22, 0xd3, 0xa6, 0x89, 0x01, 0xbb, 0x9d, 0xd4, 0xe4, 0x90, 0x38, 0xae, 0xdc, 0x11, 0x50, 0xef, 0x27, - 0x13, 0x37, 0x34, 0x63, 0x9c, 0x61, 0x42, 0x64, 0x63, 0xc3, 0xcb, 0xa9, 0xed, 0xe1, 0x40, 0xd1, 0xc1, 0xd3, 0x31, 0x9f, 0x46, 0x5a, 0xb5, 0x23, 0x0f, 0xc1, 0x52, 0x34, 0xf9, 0x9e, 0x85, 0x84, - 0xff, 0x6b, 0x4c, 0xce, 0x6f, 0x7d, 0x47, 0x1f, 0x31, 0x05, 0x7d, 0x2a, 0x6d, 0x76, 0xc5, 0x1c, 0x0e, 0x5e, 0x8e, 0x06, 0x68, 0xbf, 0x44, 0xd9, 0x3e, 0x3f, 0x18, 0xd5, 0x68, 0x93, 0x1d, 0x0c, - 0x73, 0xc1, 0x88, 0x8b, 0xd9, 0xdc, 0x90, 0x8e, 0x34, 0x63, 0xea, 0x79, 0x0c, 0x4e, 0x97, 0x22, 0x05, 0x4c, 0xc7, 0x23, 0x73, 0x11, 0x1e, 0xdd, 0x64, 0x19, 0xac, 0xf7, 0xbb, 0x83, 0xe0, 0xe3, - 0x48, 0x80, 0x4a, 0xd0, 0x72, 0xe1, 0xcb, 0x33, 0x36, 0x97, 0x0a, 0x9e, 0xde, 0x6c, 0xed, 0x24, 0xd1, 0x57, 0x8d, 0x5f, 0x6e, 0xa3, 0x45, 0x3c, 0xae, 0xd5, 0x76, 0xdb, 0x77, 0xac, 0x97, 0xfe, - 0x6d, 0x57, 0x9c, 0x87, 0xb5, 0xfb, 0x1f, 0x5a, 0x9f, 0xde, 0x74, 0x6d, 0xb5, 0xc2, 0xf4, 0xe5, 0x73, 0x6f, 0xdb, 0x9e, 0x7e, 0x45, 0xf9, 0x2c, 0x1d, 0x54, 0x76, 0xe0, 0x26, 0xe6, 0xa0, 0x2e, - 0xcd, 0x13, 0xd5, 0x3f, 0xcf, 0x9e, 0x3c, 0xe3, 0xa1, 0x3f, 0x7a, 0xc1, 0x99, 0x27, 0x1f, 0x2f, 0xf7, 0xad, 0xda, 0xdc, 0xac, 0xc9, 0x21, 0x3f, 0x4a, 0x11, 0x2d, 0xd2, 0x82, 0xb9, 0x91, 0x42, - 0xf1, 0x2a, 0xd8, 0x4d, 0x4d, 0x6a, 0x22, 0x71, 0xf2, 0x56, 0xd0, 0x22, 0x35, 0x50, 0xd0, 0x31, 0x35, 0xdc, 0xa6, 0x5c, 0x4b, 0x1e, 0x5a, 0xbf, 0xa8, 0x8b, 0x9c, 0xd2, 0x46, 0x73, 0x0e, 0x4d, - 0xb6, 0xc2, 0x41, 0x3c, 0x40, 0xdb, 0x38, 0x43, 0xeb, 0xa2, 0x73, 0x0b, 0x0b, 0xac, 0xb8, 0xb8, 0x6c, 0x4c, 0xee, 0x88, 0x38, 0xcd, 0xd7, 0x9d, 0xb7, 0x1e, 0x74, 0x55, 0x7a, 0x44, 0x22, 0xec, - 0xa9, 0x52, 0x92, 0xf7, 0xe0, 0xc3, 0xc1, 0x87, 0x4b, 0x03, 0xac, 0x5f, 0x61, 0x89, 0x2c, 0x11, 0xb9, 0xbc, 0x23, 0xa3, 0xcd, 0x64, 0x0b, 0xed, 0xb7, 0xc4, 0x1e, 0x09, 0x55, 0x6f, 0x1e, 0x1d, - 0x10, 0x98, 0x0e, 0xc7, 0xb0, 0x87, 0x04, 0x53, 0x47, 0x10, 0xb9, 0xfd, 0x11, 0x19, 0x32, 0xbc, 0x80, 0xa4, 0x88, 0x92, 0xd9, 0xc7, 0x30, 0x97, 0x0f, 0xf6, 0x71, 0x6b, 0x6c, 0x41, 0x33, 0xc8, - 0xdc, 0x16, 0xf0, 0x76, 0x47, 0x7c, 0xd4, 0x50, 0xc0, 0xcc, 0x8d, 0x78, 0x73, 0xb4, 0x6c, 0xd8, 0x65, 0x4f, 0x13, 0xc4, 0x7e, 0xd9, 0xf1, 0xf2, 0xd7, 0x9f, 0xe0, 0x53, 0x5d, 0xa5, 0x2a, 0xb7, - 0x1e, 0x5c, 0x40, 0x2e, 0xad, 0xa1, 0x5e, 0x9a, 0x4b, 0xa1, 0xbd, 0x9a, 0x12, 0xc6, 0x59, 0x96, 0x5b, 0x6e, 0xfa, 0x69, 0xd7, 0x0f, 0xe8, 0xa9, 0x25, 0xf6, 0xaf, 0xa8, 0x27, 0xa6, 0xbc, 0x1c, - 0x9f, 0x13, 0x7f, 0x3d, 0x04, 0xd5, 0xab, 0x61, 0x3e, 0x69, 0x8c, 0x94, 0xde, 0x03, 0xf4, 0x42, 0xf0, 0x24, 0x2c, 0xc9, 0x19, 0xb5, 0x71, 0x98, 0xf1, 0xb6, 0x8b, 0xf3, 0x79, 0x12, 0x10, 0x89, - 0x4c, 0x70, 0x36, 0x3f, 0x4b, 0x5c, 0xaf, 0x5a, 0xc6, 0x2a, 0x39, 0xd9, 0x81, 0x32, 0x9e, 0x96, 0x93, 0x89, 0x63, 0xef, 0xf5, 0x29, 0xd0, 0x8d, 0x3a, 0x1b, 0x14, 0x95, 0x71, 0x37, 0x33, 0x28, - 0x68, 0x0a, 0xf9, 0xb2, 0xc7, 0x1a, 0xcd, 0xa2, 0xe7, 0x02, 0x95, 0x43, 0xfd, 0xb2, 0x35, 0x06, 0xda, 0xb3, 0xab, 0x63, 0x5c, 0x36, 0x03, 0xdb, 0xb4, 0x83, 0xcf, 0xc6, 0x3f, 0xfe, 0xd4, 0xf8, - 0x7f, 0x45, 0x3d, 0x11, 0xf0, 0xe5, 0xf8, 0xbc, 0x9b, 0x77, 0x0f, 0x02, 0x2e, 0x32, 0xdc, 0x59, 0x80, 0xe8, 0x24, 0x11, 0xa3, 0xa6, 0x4b, 0xf7, 0x0b, 0x51, 0x44, 0x72, 0xd9, 0x55, 0x13, 0x67, - 0xc8, 0x82, 0x9e, 0x27, 0xc5, 0x3b, 0x4d, 0xf3, 0xf7, 0x46, 0x08, 0xb8, 0x05, 0x24, 0x4f, 0x92, 0x42, 0xd8, 0x4f, 0x02, 0xc0, 0x5d, 0x55, 0x3a, 0xa7, 0x4f, 0xf6, 0xfa, 0x68, 0x04, 0x85, 0xf0, - 0xd4, 0x0c, 0xd0, 0x00, 0x1a, 0x33, 0xeb, 0xc9, 0x01, 0x2d, 0xa4, 0x60, 0x66, 0x55, 0x61, 0x4f, 0x55, 0x7c, 0x34, 0xe3, 0x38, 0xbc, 0xf6, 0x4f, 0x43, 0x9f, 0x32, 0x72, 0x7a, 0x55, 0x58, 0x25, - 0x6e, 0x1d, 0x64, 0x4e, 0xf5, 0x85, 0xd1, 0xfb, 0x73, 0x7b, 0xe4, 0x8a, 0x39, 0x1c, 0xbc, 0x1c, 0x9d, 0xcd, 0xdc, 0x1e, 0x96, 0x48, 0x68, 0xc7, 0x14, 0xeb, 0x6e, 0x8a, 0x4d, 0x82, 0x93, 0xdd, - 0xb4, 0x4e, 0x0d, 0xd0, 0x05, 0xa0, 0x15, 0x7c, 0x94, 0xe7, 0x4e, 0xdb, 0x6d, 0x32, 0xb3, 0x59, 0xca, 0xa8, 0x3a, 0xa6, 0x10, 0xa5, 0x65, 0x87, 0x2d, 0x3f, 0x0d, 0xdd, 0x29, 0x51, 0x78, 0xdb, - 0x78, 0x2f, 0x1b, 0x32, 0x40, 0x53, 0x23, 0x7e, 0x64, 0xf1, 0xda, 0x5c, 0x1c, 0x81, 0x4d, 0x7c, 0xc8, 0xe4, 0x6c, 0xc2, 0xc2, 0x48, 0xa5, 0xc0, 0xdf, 0xd5, 0x88, 0x7c, 0x6f, 0x2a, 0xf6, 0x59, - 0x8d, 0x96, 0x7c, 0xde, 0x4a, 0x1e, 0x7e, 0xaa, 0x1b, 0x56, 0x72, 0xe9, 0x1f, 0x7f, 0xee, 0x11, 0x03, 0xf7, 0xeb, 0x7f, 0x25, 0x8b, 0xfc, 0x6e, 0xed, 0x32, 0x12, 0x02, 0x95, 0xdc, 0x3a, 0x34, - 0xcb, 0x6a, 0xbc, 0x99, 0xb3, 0xc6, 0x72, 0x35, 0xf3, 0xdb, 0xa5, 0x3d, 0x5c, 0x95, 0x51, 0xe6, 0x51, 0xe9, 0x38, 0xe6, 0xea, 0xda, 0xc3, 0xcc, 0x68, 0xdb, 0x16, 0xe1, 0x96, 0x22, 0x85, 0xca, - 0x4d, 0x2d, 0x3b, 0xcb, 0xec, 0x7a, 0x89, 0x3b, 0xb8, 0x54, 0xe1, 0x66, 0x61, 0x68, 0x63, 0x0a, 0xd0, 0xac, 0xdd, 0xb2, 0x0e, 0x42, 0xe1, 0xbb, 0x80, 0xf2, 0x07, 0x73, 0xe0, 0x4a, 0x89, 0x5f, - 0x4f, 0xb5, 0x3e, 0xff, 0x8f, 0x7f, 0x47, 0x7b, 0xf6, 0x3c, 0x38, 0x13, 0xc6, 0xf9, 0x2c, 0xf5, 0x05, 0xfd, 0xc6, 0x9e, 0x51, 0xb7, 0x57, 0xd0, 0x17, 0xba, 0x3b, 0xd6, 0xe0, 0x02, 0xf4, 0x3d, - 0xed, 0x2b, 0x5e, 0x46, 0x1b, 0x85, 0x70, 0xf4, 0xb8, 0xad, 0xd5, 0xc5, 0x61, 0xbf, 0x3f, 0xb0, 0x34, 0xc8, 0x37, 0x61, 0xa0, 0x6c, 0x42, 0x86, 0x90, 0x8e, 0x94, 0x25, 0x60, 0xa2, 0x7a, 0xa0, - 0x27, 0xe3, 0x51, 0x22, 0xeb, 0x2d, 0xe7, 0x97, 0x99, 0xc0, 0xed, 0x75, 0x41, 0xe0, 0x96, 0xfc, 0x82, 0x9c, 0xcc, 0x2d, 0x06, 0x80, 0x18, 0x49, 0x89, 0xb9, 0x6c, 0x09, 0xc9, 0x13, 0x38, 0x95, - 0x11, 0x5f, 0x6f, 0xbf, 0xa3, 0xfd, 0xdf, 0x27, 0xba, 0xaf, 0x6d, 0x88, 0x1e, 0x0b, 0x30, 0xf4, 0x1b, 0xf9, 0x79, 0xb4, 0xf8, 0x0d, 0xf7, 0x85, 0x9e, 0xe7, 0x93, 0xc1, 0x05, 0xee, 0x7b, 0x92, - 0x1a, 0xb4, 0x0e, 0x58, 0x7c, 0x82, 0x75, 0x92, 0x34, 0x05, 0xf4, 0x7c, 0x52, 0x52, 0xf2, 0x28, 0x5d, 0x82, 0xb2, 0x3f, 0x9f, 0xe8, 0xbc, 0x04, 0x0a, 0xb5, 0x04, 0x6d, 0x0c, 0x75, 0xda, 0xa2, - 0x15, 0x00, 0x48, 0x9b, 0x9d, 0xed, 0x2b, 0xa6, 0x04, 0xfa, 0x38, 0x80, 0x6e, 0xe1, 0x66, 0x8e, 0xae, 0x23, 0x21, 0xea, 0x8e, 0x15, 0x3b, 0x86, 0xba, 0x43, 0xa3, 0xae, 0x30, 0x30, 0xe8, 0x4c, - 0x57, 0x0b, 0xbf, 0xd3, 0x06, 0x9f, 0x2b, 0xe4, 0x37, 0x81, 0x7b, 0x91, 0xae, 0x9f, 0x8a, 0x76, 0x6f, 0x7e, 0xbc, 0xad, 0xae, 0x7e, 0xc4, 0x8e, 0xe7, 0x9a, 0x1b, 0xbf, 0xa2, 0x9e, 0x99, 0x71, - 0x3d, 0xee, 0xdb, 0xd8, 0x78, 0x41, 0xe4, 0x38, 0x12, 0x6c, 0x43, 0x2a, 0xda, 0x43, 0x1b, 0x9a, 0xd9, 0xef, 0x21, 0x95, 0x08, 0x11, 0x02, 0x18, 0x1f, 0xe7, 0x25, 0xa7, 0x72, 0x98, 0x26, 0x08, - 0x54, 0x67, 0x20, 0x0a, 0x67, 0xaf, 0x40, 0x7e, 0x73, 0xb4, 0xf6, 0xb9, 0x97, 0x28, 0xc3, 0x0d, 0x88, 0x75, 0x53, 0xaa, 0xdb, 0x0b, 0x23, 0x59, 0x3c, 0x32, 0xb6, 0x86, 0xd7, 0x88, 0xcc, 0x01, - 0x4b, 0xcc, 0x2c, 0xc6, 0x02, 0x37, 0x67, 0x9f, 0x67, 0x85, 0x55, 0x9a, 0xb6, 0x3b, 0x70, 0x0f, 0xb9, 0x99, 0xbe, 0x10, 0xe5, 0x5c, 0xfe, 0x4d, 0xfc, 0x90, 0x25, 0xff, 0xb9, 0x2f, 0x37, 0xc2, - 0x4f, 0x4d, 0xee, 0x13, 0xf9, 0x7e, 0xbe, 0x5e, 0xe3, 0x05, 0xf4, 0x85, 0x17, 0x61, 0x55, 0x9f, 0x8d, 0xba, 0x6f, 0xd6, 0x6b, 0x9c, 0x59, 0x51, 0x45, 0xe9, 0x0e, 0xb5, 0xf6, 0x88, 0xbe, 0x28, - 0xf4, 0xce, 0x72, 0x8e, 0xe3, 0x70, 0x53, 0xf1, 0x2a, 0xcb, 0x7b, 0x1c, 0x00, 0xc8, 0xb3, 0x19, 0x81, 0x8e, 0x26, 0x87, 0x0a, 0xcf, 0xdd, 0x49, 0x83, 0x69, 0x3e, 0x9a, 0x96, 0x6e, 0x6a, 0xe2, - 0x9c, 0x72, 0xe0, 0xf4, 0x43, 0x29, 0x48, 0xc5, 0x7e, 0x0f, 0x2e, 0x92, 0x7d, 0x0d, 0x6c, 0x5d, 0x8f, 0x2c, 0x7d, 0xbf, 0x49, 0x76, 0xd2, 0xaa, 0x7b, 0xdf, 0x3a, 0xe4, 0xfb, 0x55, 0x2c, 0xc9, - 0x57, 0xba, 0xe2, 0x09, 0xe1, 0x3c, 0xab, 0x88, 0x8b, 0x6a, 0xe8, 0x21, 0x8e, 0xd5, 0x6c, 0xc7, 0x1f, 0x00, 0x25, 0x5a, 0xd7, 0x09, 0x85, 0xaf, 0x35, 0x98, 0xc8, 0x28, 0x74, 0x3a, 0x9e, 0x32, - 0xab, 0xe9, 0xc4, 0x30, 0x50, 0x11, 0xd5, 0x0a, 0x77, 0xc6, 0x69, 0x93, 0x16, 0x27, 0x6b, 0x09, 0x88, 0x2c, 0xa4, 0xdd, 0x0d, 0xb7, 0x47, 0x73, 0xa9, 0xf2, 0x20, 0x2f, 0x2d, 0x8f, 0x6a, 0x9d, - 0xac, 0xc4, 0x35, 0x68, 0x01, 0xa6, 0x23, 0x4b, 0x4c, 0x6b, 0x55, 0x10, 0xcf, 0x98, 0xec, 0xd9, 0x4e, 0xf8, 0xfc, 0x83, 0xd3, 0x77, 0xbb, 0x8f, 0x3c, 0x96, 0x05, 0xe4, 0x89, 0x18, 0xfe, 0x1d, - 0xf2, 0x70, 0x70, 0x7f, 0x3e, 0x38, 0x63, 0x7e, 0x4f, 0x11, 0xaf, 0x4d, 0xb5, 0x51, 0x6d, 0x58, 0x5b, 0x42, 0xf5, 0x26, 0x33, 0x6c, 0x4c, 0x1d, 0x91, 0x23, 0x37, 0x4c, 0x27, 0xab, 0x63, 0xa4, - 0xa8, 0x34, 0xbe, 0xf6, 0x03, 0xa6, 0x00, 0x3b, 0x6c, 0x4a, 0x7b, 0x1b, 0xc0, 0xd0, 0xf2, 0x95, 0xba, 0x99, 0x4b, 0x63, 0xc7, 0x0a, 0xbd, 0x83, 0xb0, 0x13, 0x60, 0xcc, 0xb5, 0x4a, 0x08, 0x9f, - 0x81, 0x1b, 0xc2, 0xdd, 0xaa, 0x8b, 0xb0, 0xe2, 0xec, 0x35, 0xc3, 0xce, 0x90, 0xaf, 0x17, 0xa7, 0x9c, 0x4e, 0x92, 0x4f, 0x6b, 0x8c, 0xce, 0xc1, 0x83, 0xd1, 0x53, 0xc4, 0x48, 0xce, 0x55, 0x45, - 0xd7, 0xa3, 0xc1, 0x05, 0xe8, 0x7b, 0x0a, 0xa0, 0x79, 0x0b, 0x79, 0xb0, 0xb5, 0xa6, 0x23, 0x90, 0x71, 0xfd, 0xe1, 0x3a, 0x98, 0x15, 0x87, 0xb2, 0x6e, 0x5d, 0x57, 0xc0, 0x86, 0xb3, 0xa1, 0xac, - 0xb8, 0xa3, 0x90, 0xc3, 0x1b, 0xc9, 0xe8, 0xa2, 0x74, 0x1b, 0x37, 0x22, 0x85, 0xf2, 0x8a, 0xea, 0x91, 0x13, 0x75, 0x34, 0x5a, 0xc9, 0xfc, 0x7e, 0x36, 0x46, 0xdc, 0xcd, 0x9c, 0x22, 0x3a, 0x79, - 0x9a, 0xf1, 0x04, 0xa1, 0x37, 0x73, 0x22, 0xe0, 0x6c, 0xf0, 0xaf, 0xb6, 0x8d, 0xfa, 0xc2, 0x5b, 0x0d, 0xb2, 0x5d, 0xe8, 0x98, 0x6f, 0x3d, 0xa3, 0xef, 0x02, 0xa5, 0x2f, 0xdb, 0xd6, 0x9f, 0x6e, - 0xc1, 0xef, 0xf6, 0x43, 0x7c, 0xb0, 0x64, 0xee, 0xd7, 0xc7, 0x3d, 0xc2, 0xbe, 0x69, 0xd1, 0x91, 0x57, 0x75, 0xe9, 0xba, 0xbf, 0x4b, 0x37, 0x39, 0xbe, 0x6a, 0xcf, 0xbb, 0xde, 0x84, 0x37, 0x1d, - 0x90, 0xb1, 0xdf, 0xc4, 0x3d, 0x76, 0x15, 0x26, 0x79, 0xec, 0x0e, 0x9a, 0xfc, 0x5c, 0xf2, 0x98, 0x66, 0x75, 0xe8, 0x85, 0x37, 0xbb, 0x3b, 0xde, 0xfd, 0xbb, 0x1f, 0xb6, 0x82, 0x3f, 0xe1, 0xbd, - 0xf3, 0xce, 0xeb, 0xac, 0x79, 0xfd, 0x3f, 0xdf, 0xad, 0xe1, 0x69, 0x52, 0xc7, 0xf5, 0x2a, 0xd3, 0x7b, 0x8b, 0x48, 0x61, 0x3d, 0x22, 0x52, 0x6f, 0xa2, 0x79, 0x8e, 0x48, 0x5d, 0x4f, 0x9f, 0xb1, - 0x46, 0xc9, 0xfb, 0xfa, 0x9f, 0xd7, 0x9f, 0x3d, 0x0c, 0x49, 0xbe, 0xac, 0x9d, 0xcc, 0x72, 0x37, 0xb5, 0xb3, 0x38, 0x76, 0xed, 0xf3, 0x26, 0x78, 0xb7, 0x9f, 0x73, 0x1f, 0xb4, 0xbc, 0x7f, 0xf0, - 0x1c, 0xbc, 0x7c, 0xf9, 0xd7, 0x5f, 0xde, 0xf8, 0xed, 0xf8, 0xbb, 0xdf, 0x6c, 0xf1, 0x45, 0x70, 0x1e, 0xdb, 0x0d, 0xf0, 0x13, 0xea, 0xe9, 0x8c, 0x78, 0xde, 0xf8, 0xd8, 0x6a, 0xfc, 0xc1, 0x19, - 0xe3, 0xfb, 0xc1, 0x38, 0x99, 0x46, 0x9d, 0xae, 0x53, 0x21, 0x2a, 0x05, 0x5e, 0x28, 0xb4, 0x61, 0x57, 0x4e, 0x05, 0xb7, 0x95, 0x24, 0x8d, 0xad, 0xd3, 0x49, 0xa1, 0x7a, 0x2e, 0x71, 0x80, 0xa8, - 0xc0, 0x67, 0x2a, 0x5b, 0xea, 0x70, 0xc3, 0x5a, 0x59, 0x5e, 0xb6, 0xda, 0xae, 0xf8, 0xc6, 0x97, 0x84, 0xe3, 0xb8, 0x0e, 0x70, 0x8f, 0x34, 0x98, 0xad, 0x22, 0x8b, 0x47, 0x95, 0x9d, 0xd2, 0x43, - 0x42, 0x6d, 0xd0, 0x1a, 0x7a, 0xbf, 0x41, 0xf9, 0x0f, 0xec, 0x85, 0xa4, 0xfa, 0xf5, 0xb1, 0x04, 0xec, 0x87, 0x94, 0x0d, 0xcc, 0x6a, 0xe0, 0xc5, 0x9f, 0x36, 0x03, 0x40, 0x9e, 0x8a, 0x4e, 0xbc, - 0x80, 0x5e, 0xbb, 0x00, 0x9c, 0x0e, 0x07, 0xc8, 0xf7, 0xb1, 0x09, 0x68, 0x50, 0x3b, 0x5b, 0x19, 0x99, 0xcc, 0x8c, 0x32, 0x5c, 0xa8, 0x89, 0xb7, 0x99, 0x79, 0x71, 0xc6, 0x92, 0x44, 0xac, 0x34, - 0x2d, 0xf8, 0x97, 0x5c, 0x86, 0x3e, 0x0b, 0xda, 0x1e, 0x92, 0xe7, 0x4b, 0x83, 0xe0, 0xe7, 0x45, 0x88, 0xb7, 0x06, 0x41, 0x8f, 0xd2, 0x43, 0x7c, 0x1a, 0x77, 0x8d, 0x25, 0xad, 0x8c, 0x19, 0xb2, - 0x80, 0xcd, 0xe1, 0x46, 0x99, 0x50, 0xb1, 0xcb, 0x04, 0x51, 0x57, 0x60, 0xd9, 0xc1, 0x67, 0x8f, 0xe6, 0x44, 0x1e, 0x1d, 0x75, 0xad, 0xb5, 0x57, 0x55, 0x9b, 0x29, 0x26, 0xbb, 0x28, 0x86, 0x15, - 0x76, 0xd0, 0xe6, 0xf8, 0x50, 0xd3, 0x78, 0xbc, 0xee, 0x88, 0xed, 0xe8, 0x40, 0x71, 0x35, 0x9b, 0x8a, 0xdc, 0xb0, 0xd6, 0xea, 0x29, 0xa2, 0x6e, 0xa5, 0xf8, 0xc7, 0x5b, 0x44, 0x3c, 0x24, 0xcc, - 0xab, 0x22, 0x7d, 0x44, 0x9c, 0x7b, 0xd5, 0xda, 0x97, 0x38, 0x17, 0xc8, 0xe1, 0xe0, 0x7a, 0x70, 0xde, 0xf3, 0xa7, 0x47, 0x70, 0xb6, 0x32, 0x1b, 0x93, 0xf6, 0x86, 0xbc, 0xe1, 0x28, 0x7e, 0xb9, - 0x92, 0x36, 0x3a, 0xbb, 0xad, 0x73, 0xcd, 0x84, 0xc2, 0x6d, 0xb8, 0xb4, 0x4d, 0xd7, 0x0a, 0x97, 0x02, 0x34, 0x5e, 0x38, 0xb9, 0x10, 0xab, 0x2c, 0x1c, 0x4f, 0x5a, 0xf7, 0x20, 0x38, 0x1a, 0x86, - 0x55, 0x29, 0x3f, 0x3d, 0x2e, 0x09, 0xa1, 0xcb, 0x1b, 0xa7, 0xb0, 0x26, 0x73, 0xb0, 0xd0, 0xa6, 0x1e, 0x67, 0x56, 0xac, 0x73, 0xdc, 0xd0, 0xb3, 0xef, 0x06, 0xe5, 0x07, 0xdd, 0xfc, 0x36, 0xb1, - 0x9c, 0x54, 0xf3, 0xf5, 0xec, 0x49, 0xa1, 0xfb, 0x30, 0xb9, 0x3c, 0xa6, 0xf1, 0x33, 0xcd, 0xf5, 0xef, 0xa1, 0x4f, 0xb4, 0xbe, 0xbb, 0x30, 0x38, 0xa3, 0x7e, 0x4f, 0x73, 0x21, 0x52, 0xa2, 0xbd, - 0xa3, 0xcd, 0x6b, 0x14, 0x24, 0xd7, 0xf3, 0x90, 0x2a, 0x26, 0x1a, 0x9a, 0xc9, 0xcb, 0xca, 0x97, 0x61, 0xa6, 0xa0, 0x66, 0x5d, 0x05, 0xf3, 0xf9, 0x2e, 0x41, 0x4d, 0x41, 0xb7, 0xa2, 0x04, 0x30, - 0x18, 0x95, 0xb1, 0x55, 0x54, 0xf4, 0xa6, 0x1b, 0xa9, 0x44, 0x9b, 0xf5, 0xc6, 0x48, 0x4c, 0xd0, 0x3d, 0xa2, 0x1e, 0x16, 0xfb, 0xab, 0x72, 0x37, 0x06, 0x4d, 0x0d, 0x14, 0xd6, 0x7f, 0xa1, 0x35, - 0xd3, 0x8d, 0x12, 0x7b, 0xd9, 0x85, 0xe2, 0x85, 0xf4, 0x7f, 0xaf, 0x86, 0xc8, 0xbf, 0x5c, 0xc9, 0xff, 0x73, 0x76, 0x9c, 0x10, 0xcf, 0x46, 0x61, 0x5e, 0xf7, 0xaa, 0x2c, 0x87, 0x06, 0x96, 0x03, - 0x06, 0xad, 0x98, 0x1d, 0x04, 0xad, 0x11, 0xed, 0x14, 0x51, 0x02, 0x2f, 0x4c, 0x48, 0x44, 0x9f, 0xe3, 0x00, 0xfa, 0x2c, 0xf5, 0x4c, 0xcb, 0x2a, 0xcf, 0xcf, 0xff, 0xea, 0x93, 0x16, 0xbb, 0x12, - 0xe1, 0x6a, 0x81, 0xe4, 0xf5, 0xcf, 0xcd, 0x8f, 0x3e, 0xee, 0x69, 0x9a, 0x95, 0x89, 0x19, 0x87, 0x9d, 0xfb, 0xd5, 0xc2, 0xbf, 0xe7, 0x26, 0xa7, 0x7b, 0xe8, 0x33, 0xf5, 0x6f, 0x2f, 0xf4, 0x99, - 0xa8, 0xce, 0xba, 0xd9, 0x35, 0x2a, 0x6c, 0x55, 0x21, 0x6a, 0x3d, 0x09, 0x2b, 0x56, 0xcd, 0x47, 0x22, 0x3c, 0x93, 0x8f, 0xa4, 0x53, 0xec, 0xf2, 0x59, 0x88, 0x8e, 0x15, 0xb1, 0x43, 0x66, 0x66, - 0x11, 0x32, 0xb8, 0xdb, 0x35, 0x16, 0x88, 0x41, 0x30, 0x23, 0x76, 0xb5, 0x26, 0xef, 0xe5, 0x31, 0x3e, 0xc1, 0xe7, 0x4b, 0x4b, 0xd8, 0xe9, 0x30, 0x9f, 0x5a, 0xc3, 0x84, 0x46, 0x55, 0x3d, 0x8b, - 0x26, 0xdb, 0xbd, 0xbd, 0x5f, 0x7d, 0x67, 0x98, 0x7f, 0x5f, 0xe6, 0xda, 0x2f, 0xca, 0xf8, 0x61, 0x77, 0xf1, 0xc7, 0x32, 0x0d, 0x3d, 0x13, 0x6c, 0xbc, 0xc7, 0x1e, 0x0e, 0xde, 0x5d, 0x18, 0x5c, - 0x60, 0xbf, 0x27, 0x30, 0x9b, 0xc1, 0x1d, 0x09, 0x5a, 0xca, 0xbc, 0x5d, 0xc4, 0x19, 0x0b, 0xe8, 0xdd, 0x36, 0xc9, 0x0d, 0x45, 0x70, 0x49, 0x02, 0x28, 0x28, 0x31, 0x19, 0xcb, 0x4b, 0x83, 0x56, - 0xfd, 0xc3, 0xc8, 0x6e, 0x80, 0x25, 0x5d, 0x6a, 0xb0, 0x41, 0xb3, 0x43, 0xa4, 0x5e, 0x1f, 0x01, 0x5f, 0xb3, 0x0c, 0x46, 0x52, 0x66, 0x15, 0xbc, 0x26, 0x75, 0xe7, 0xc0, 0x59, 0x5c, 0x40, 0x68, - 0x54, 0x1d, 0x26, 0x23, 0x1d, 0xbc, 0x0b, 0x3d, 0xfe, 0x0f, 0x4f, 0xc0, 0xbf, 0x7c, 0xf9, 0x57, 0x79, 0x88, 0x9f, 0x07, 0x20, 0x5f, 0x51, 0x6f, 0x68, 0x7b, 0xc9, 0x45, 0xf4, 0x88, 0x3e, 0x22, - 0xf6, 0x91, 0xae, 0x8e, 0xac, 0x5f, 0x27, 0x21, 0x31, 0x27, 0x68, 0x4f, 0x14, 0xe7, 0xf0, 0x8a, 0xce, 0x71, 0x71, 0x09, 0xc7, 0xfb, 0xb6, 0xb6, 0x7c, 0x30, 0x07, 0xb7, 0x90, 0x0b, 0x6e, 0x5b, - 0xa9, 0x98, 0x62, 0xb6, 0x3b, 0x3b, 0x00, 0x4b, 0xd8, 0xf1, 0xc4, 0x28, 0x81, 0xac, 0x25, 0xbd, 0x56, 0x26, 0x53, 0x86, 0xa6, 0x84, 0xf6, 0x08, 0x64, 0xa4, 0x8d, 0x9b, 0x84, 0xd2, 0x44, 0x9c, - 0xf3, 0x7e, 0x9f, 0x94, 0x1f, 0xe8, 0x9e, 0x6f, 0x2a, 0x6b, 0x1c, 0xd7, 0x0b, 0x53, 0x77, 0x90, 0x97, 0x59, 0xee, 0x96, 0xf5, 0xe5, 0xd7, 0xbf, 0xde, 0xed, 0x57, 0xd0, 0x77, 0x70, 0xfc, 0x93, - 0x8a, 0x63, 0xee, 0xf7, 0xe8, 0xff, 0x4c, 0x0a, 0x7e, 0x6e, 0x2d, 0xdd, 0xe0, 0xbe, 0xc9, 0xc1, 0xe9, 0xac, 0xef, 0x7a, 0xd8, 0x4d, 0x43, 0x31, 0xa2, 0xcc, 0xc9, 0xeb, 0x32, 0x9e, 0x6b, 0x9c, - 0xc7, 0x2e, 0x3b, 0x1a, 0xb7, 0x72, 0xbe, 0x41, 0x6a, 0xbd, 0x46, 0x0e, 0x6d, 0xb4, 0x71, 0xb6, 0x73, 0x01, 0x98, 0xba, 0x12, 0x18, 0x6f, 0x2c, 0x74, 0x49, 0xaa, 0x5b, 0x02, 0x9c, 0x98, 0xf4, - 0x21, 0x68, 0x36, 0x7e, 0x23, 0xc2, 0xda, 0x0c, 0x98, 0x45, 0xbb, 0xe3, 0x7a, 0xcf, 0x75, 0xd5, 0x06, 0x33, 0x76, 0xf5, 0x3c, 0xf1, 0x82, 0xd5, 0xd3, 0x4b, 0x26, 0xbe, 0x23, 0xe0, 0x6f, 0xb3, - 0xaa, 0x42, 0xff, 0xb3, 0xb0, 0x0c, 0xfa, 0x54, 0x78, 0xee, 0x0e, 0xf9, 0x95, 0x88, 0xd7, 0xf3, 0x73, 0x5d, 0x4b, 0x8f, 0xa0, 0x5d, 0x78, 0x90, 0xe0, 0x15, 0x26, 0xb1, 0x5a, 0x45, 0xe5, 0xc7, - 0x50, 0xe6, 0xf5, 0x65, 0xa2, 0x02, 0x30, 0xc3, 0xe6, 0x9a, 0xe6, 0x62, 0xf3, 0x10, 0x59, 0x03, 0x1e, 0xea, 0x02, 0xe6, 0x62, 0x4a, 0xb1, 0x66, 0x86, 0x99, 0xc9, 0x74, 0xab, 0xe2, 0x0b, 0x90, - 0xe3, 0x70, 0x7b, 0xb8, 0x92, 0xc9, 0xb1, 0x8b, 0x12, 0x4d, 0x3d, 0x39, 0xc0, 0xb3, 0x15, 0x39, 0x0a, 0x0e, 0xb3, 0x31, 0xae, 0x89, 0xc9, 0xb2, 0x79, 0xba, 0xcc, 0x08, 0xec, 0x3b, 0x7a, 0x6e, - 0x1e, 0x7b, 0xdc, 0xfd, 0xf8, 0xe6, 0x81, 0x7b, 0x11, 0xfe, 0x2b, 0x3d, 0x19, 0xff, 0x19, 0xe3, 0x2f, 0x1d, 0xb8, 0x87, 0xb0, 0x1e, 0xc4, 0xae, 0xb9, 0x1b, 0x78, 0xa5, 0xfb, 0x79, 0x3a, 0xf3, - 0x99, 0x72, 0xa8, 0x0f, 0xe8, 0x27, 0x31, 0x7a, 0x7f, 0xad, 0x6f, 0x2f, 0x01, 0xa5, 0x99, 0x98, 0x86, 0x41, 0x45, 0x5b, 0xd7, 0x40, 0x5a, 0x79, 0xef, 0x73, 0x63, 0x72, 0x75, 0xa0, 0xb2, 0x6a, - 0xde, 0x94, 0x74, 0x48, 0xa9, 0x60, 0x05, 0x21, 0xe5, 0x1c, 0xd2, 0xf7, 0x89, 0xc9, 0x03, 0x40, 0xd4, 0xda, 0x07, 0x9e, 0x20, 0x28, 0x35, 0x13, 0x5a, 0x37, 0x35, 0x5c, 0x2b, 0x9f, 0x50, 0x70, - 0x42, 0xaa, 0x13, 0x68, 0xc8, 0x64, 0x15, 0xaf, 0xf3, 0xeb, 0x28, 0xdd, 0x52, 0xf9, 0xf0, 0xeb, 0xf8, 0xef, 0xb5, 0xab, 0xd1, 0x63, 0xb5, 0x84, 0x3e, 0x45, 0x10, 0xfb, 0x42, 0x03, 0xdb, 0x1d, - 0x9c, 0x11, 0xbe, 0x33, 0x68, 0x55, 0xba, 0x32, 0x73, 0x44, 0x55, 0x59, 0xb9, 0xda, 0x72, 0xd5, 0x74, 0x94, 0x4e, 0x27, 0x38, 0x81, 0x21, 0x9a, 0x39, 0x62, 0x9e, 0x9d, 0x54, 0x7e, 0xd6, 0x90, - 0xe9, 0xf1, 0xee, 0xda, 0x8f, 0x29, 0x02, 0x3f, 0xe1, 0xf3, 0x3f, 0xc0, 0x3f, 0x11, 0xe8, 0xe3, 0xd5, 0x73, 0xaa, 0xa4, 0x47, 0x54, 0xc0, 0x22, 0x34, 0xc3, 0x4a, 0x82, 0x26, 0x4a, 0x8b, 0x4d, - 0xb6, 0x04, 0x0d, 0x7c, 0xc3, 0x77, 0xd4, 0x30, 0x0d, 0x3c, 0x21, 0x65, 0x40, 0xd2, 0x90, 0x58, 0xb1, 0xeb, 0x22, 0x69, 0xbd, 0x77, 0x7d, 0x0b, 0xdb, 0x8c, 0xb2, 0x31, 0x45, 0x51, 0xf9, 0x01, - 0xf1, 0x46, 0x0d, 0xbc, 0x1d, 0x7a, 0x88, 0x32, 0x33, 0xa9, 0x89, 0x24, 0x44, 0xb8, 0xb0, 0x48, 0x67, 0xb2, 0xa7, 0x41, 0xd9, 0xb4, 0xae, 0x0b, 0xaf, 0x67, 0x35, 0xd2, 0x6d, 0x39, 0xd0, 0xaf, - 0xde, 0x7b, 0xc8, 0x3e, 0xe8, 0x8f, 0xfc, 0xa9, 0x13, 0xf5, 0x63, 0xfa, 0xbe, 0x07, 0x1f, 0x0e, 0x3e, 0x5c, 0xea, 0xd7, 0x0c, 0x6d, 0x0a, 0x36, 0xa2, 0xc9, 0x6e, 0x94, 0x0d, 0x0f, 0x90, 0x6e, - 0x85, 0x95, 0x23, 0x29, 0x37, 0xd3, 0xa0, 0xb6, 0x35, 0xe8, 0xf1, 0xde, 0x13, 0x7d, 0x15, 0x5f, 0x6f, 0xab, 0xfc, 0xfc, 0x6f, 0x7f, 0xb7, 0xbf, 0xf9, 0xcf, 0x43, 0x9d, 0x6f, 0xb0, 0x2f, 0xa4, - 0x79, 0xdb, 0xc5, 0xbc, 0x47, 0xd0, 0x73, 0x45, 0x2f, 0x3a, 0x5e, 0x61, 0x18, 0x86, 0xdf, 0x02, 0x47, 0x94, 0xec, 0x46, 0x08, 0x05, 0x32, 0x0e, 0x78, 0xd4, 0x2c, 0x32, 0xa7, 0xc6, 0xc7, 0x99, - 0x9a, 0x0d, 0x77, 0x98, 0xae, 0x3b, 0xba, 0x9f, 0xeb, 0xf0, 0x10, 0x66, 0x2a, 0xae, 0xda, 0x55, 0x8b, 0xb2, 0x20, 0x62, 0x8e, 0x3d, 0x94, 0xc7, 0x52, 0xe1, 0x52, 0xc8, 0x8d, 0x66, 0x78, 0x46, - 0xe5, 0xa4, 0x19, 0xb4, 0xdc, 0x5c, 0xa0, 0xc9, 0xea, 0x13, 0x8b, 0xf1, 0x0b, 0xda, 0x84, 0x76, 0xf6, 0x55, 0xf6, 0xf8, 0x34, 0x72, 0x9e, 0x90, 0x9d, 0x17, 0xd4, 0x13, 0x65, 0x5e, 0x8e, 0xcf, - 0x3b, 0x7a, 0xf4, 0x30, 0xa0, 0x16, 0x32, 0x52, 0xbb, 0xac, 0xb4, 0x89, 0x12, 0x06, 0x56, 0x26, 0xb3, 0x69, 0xd7, 0xe8, 0x24, 0xa3, 0x75, 0x13, 0x5a, 0xd9, 0x33, 0xc5, 0x18, 0x36, 0x49, 0xaf, - 0x9a, 0xb7, 0x7b, 0x53, 0xac, 0xd9, 0x80, 0x52, 0x17, 0x8c, 0xab, 0x38, 0x50, 0x06, 0x09, 0x34, 0x09, 0x4e, 0x64, 0x1c, 0x30, 0x1c, 0x46, 0xd3, 0xc4, 0x95, 0x25, 0x56, 0xcd, 0x6a, 0xbf, 0x88, - 0x76, 0x93, 0xb1, 0x5a, 0x6c, 0x05, 0x59, 0xf9, 0x8b, 0x1e, 0x20, 0x79, 0x93, 0x8a, 0xff, 0xcb, 0x73, 0x6c, 0x94, 0xa5, 0x95, 0x1d, 0xc4, 0x61, 0xba, 0x73, 0xdf, 0x1a, 0x20, 0x7e, 0x25, 0xbf, - 0x97, 0xed, 0x2f, 0x1f, 0xb1, 0x87, 0xbc, 0xec, 0x14, 0xf4, 0x73, 0xfe, 0xa4, 0xd9, 0x99, 0x35, 0x69, 0x36, 0xb8, 0x40, 0x7c, 0xcf, 0x16, 0x03, 0x76, 0x97, 0x62, 0x1b, 0x97, 0x31, 0x5c, 0xb2, - 0x64, 0x8e, 0xb9, 0xad, 0xbb, 0x91, 0x53, 0xc9, 0x71, 0x50, 0x2a, 0x5a, 0xec, 0xc8, 0x9a, 0xaa, 0x56, 0x3b, 0x56, 0x37, 0x84, 0xe5, 0x8c, 0xe5, 0x51, 0x55, 0x0a, 0xe0, 0x59, 0x08, 0xd9, 0x9c, - 0xc8, 0x55, 0x88, 0xab, 0xf2, 0x85, 0x19, 0x01, 0x69, 0x28, 0x22, 0x7e, 0x84, 0xca, 0xbb, 0xac, 0x74, 0x33, 0x53, 0xf5, 0xa7, 0x88, 0xa1, 0xea, 0x3d, 0xd5, 0xa3, 0x59, 0x67, 0x49, 0x68, 0x0f, - 0xaa, 0xd8, 0x75, 0xf3, 0xc7, 0x36, 0xd9, 0xfd, 0x26, 0xcf, 0x97, 0xd4, 0xd0, 0xbd, 0xb1, 0xf5, 0xc0, 0x5e, 0x79, 0xb0, 0x8f, 0xf7, 0x99, 0x24, 0xaf, 0x9b, 0xa4, 0xd6, 0xa5, 0x99, 0x56, 0xe7, - 0x36, 0x95, 0xff, 0xf6, 0xc7, 0xaf, 0xf6, 0xc3, 0x4b, 0xcf, 0x0f, 0x57, 0xb5, 0x33, 0xa8, 0xdc, 0x32, 0x3c, 0x87, 0x3a, 0xca, 0x8b, 0x25, 0x87, 0x7f, 0x78, 0xb2, 0x4f, 0x45, 0x69, 0xd1, 0x84, - 0xf6, 0xee, 0xba, 0x53, 0xf9, 0xa0, 0x49, 0xdd, 0xca, 0x36, 0x73, 0xf7, 0xad, 0x2a, 0xf2, 0xce, 0xb8, 0x2c, 0x5d, 0x33, 0x3e, 0x97, 0xdb, 0x86, 0xe5, 0x4b, 0x11, 0xeb, 0xbb, 0x8d, 0x5a, 0xaf, - 0xbb, 0x27, 0x9f, 0x97, 0x62, 0xdc, 0x6e, 0xdd, 0x7c, 0x7a, 0x31, 0xf2, 0x2e, 0x43, 0x97, 0xa5, 0xa1, 0x3d, 0xb0, 0xb2, 0x2c, 0xf9, 0xf5, 0x30, 0xad, 0x56, 0x07, 0xa5, 0x6b, 0xde, 0x6d, 0x4e, - 0xf6, 0x49, 0xe7, 0xa3, 0x0f, 0x51, 0xad, 0x97, 0x9d, 0x5b, 0xad, 0x30, 0xed, 0x57, 0xe1, 0xfd, 0x39, 0xfd, 0x3f, 0x53, 0xdc, 0xcf, 0x49, 0xff, 0x83, 0x77, 0xbc, 0x0c, 0x88, 0x8f, 0x77, 0xfa, - 0x96, 0x7a, 0xdb, 0x44, 0x9b, 0x61, 0x5c, 0xae, 0xa2, 0xfb, 0xb9, 0x88, 0xc2, 0x81, 0xac, 0xd8, 0x12, 0xb6, 0x65, 0xaa, 0x15, 0x69, 0xc4, 0x51, 0x25, 0x7b, 0xe3, 0xa8, 0x50, 0x86, 0x2e, 0x5c, - 0x4d, 0x0f, 0xc9, 0x94, 0x99, 0x1a, 0x61, 0x01, 0x69, 0x2b, 0x39, 0xc7, 0x18, 0x7d, 0x55, 0x37, 0x34, 0x8b, 0xf3, 0x0c, 0x5b, 0x8c, 0x54, 0xc8, 0xf5, 0xd5, 0x62, 0x6b, 0xa5, 0x2b, 0x99, 0xc7, - 0xa6, 0x8d, 0x91, 0x70, 0x3d, 0x0b, 0x40, 0x4f, 0x1c, 0x7a, 0xe1, 0xf5, 0x0b, 0x97, 0xd0, 0x0f, 0x35, 0xcb, 0x79, 0x1c, 0xd6, 0xf0, 0xaf, 0x8f, 0x45, 0xa2, 0xdf, 0x30, 0xe4, 0xa3, 0x8c, 0x3f, - 0xe2, 0x06, 0xfe, 0x54, 0xcd, 0xf2, 0xa3, 0x17, 0xbc, 0xb0, 0xe2, 0xdd, 0xe5, 0x01, 0xde, 0xaf, 0x92, 0x79, 0xae, 0xfa, 0x62, 0x27, 0xaf, 0x48, 0x0d, 0xda, 0xa3, 0xe3, 0xb9, 0x2a, 0xed, 0x99, - 0x72, 0xeb, 0xd7, 0x0a, 0xc9, 0x1f, 0xb9, 0x19, 0xc7, 0x85, 0x38, 0xd8, 0x14, 0x2d, 0x98, 0x2d, 0x1b, 0x71, 0xe8, 0x71, 0x14, 0xb9, 0xb1, 0xb3, 0x21, 0xe7, 0xce, 0xf1, 0x78, 0xdc, 0xd8, 0xa8, - 0x73, 0xe4, 0xc9, 0xf5, 0xda, 0x73, 0xa6, 0xfb, 0x23, 0x5b, 0x48, 0x6b, 0x7b, 0x3c, 0xa7, 0x88, 0x94, 0x0e, 0x0b, 0xa6, 0xf8, 0x7a, 0x07, 0xa1, 0xeb, 0x00, 0xff, 0x84, 0x32, 0xe0, 0x49, 0xc7, - 0x3e, 0x11, 0xc7, 0xbe, 0xa2, 0x9e, 0xc8, 0x71, 0x55, 0x20, 0x57, 0xa4, 0xef, 0x69, 0x60, 0x3b, 0x33, 0xd7, 0x1b, 0x3a, 0xa5, 0x3a, 0xcd, 0x8e, 0x0e, 0x0d, 0x2d, 0xaa, 0x75, 0xd7, 0x4c, 0x3d, - 0x12, 0x02, 0xc1, 0xd4, 0x88, 0x81, 0x99, 0x04, 0x1c, 0x4d, 0xdb, 0x86, 0x2d, 0xc6, 0x76, 0x1d, 0xcc, 0x1b, 0x6d, 0xa3, 0x1d, 0xda, 0x01, 0x6a, 0x3d, 0x95, 0xa5, 0x71, 0x33, 0xe2, 0x03, 0x2e, - 0x1c, 0x45, 0xc3, 0xc8, 0x4b, 0xc6, 0x7c, 0x03, 0x26, 0x6b, 0x46, 0x47, 0xf7, 0x73, 0x87, 0x9a, 0x92, 0x3f, 0x0c, 0x43, 0xe0, 0xfd, 0x24, 0xec, 0x83, 0x6e, 0x7c, 0x6c, 0x88, 0x3c, 0x25, 0x5c, - 0xf7, 0xd8, 0x37, 0x84, 0xbc, 0x5e, 0xe9, 0xbb, 0x7f, 0xfa, 0x10, 0x52, 0x0d, 0x12, 0x50, 0x84, 0x68, 0x8b, 0x9b, 0xad, 0xca, 0xf9, 0xac, 0xcb, 0xf0, 0x0e, 0x21, 0xd2, 0x42, 0x32, 0x15, 0xa0, - 0x31, 0x96, 0x4c, 0x20, 0x77, 0xab, 0x55, 0x93, 0x04, 0x93, 0xcc, 0x32, 0xde, 0x24, 0x87, 0xe1, 0x7e, 0x52, 0x99, 0xd8, 0x8c, 0x31, 0x0f, 0xb3, 0x04, 0xc4, 0xc6, 0xdc, 0x76, 0x5b, 0x1f, 0x67, - 0x43, 0xe6, 0x30, 0x44, 0x0e, 0x05, 0x22, 0x35, 0xdb, 0xb6, 0xc0, 0x88, 0xe2, 0xeb, 0x55, 0x1c, 0x79, 0x99, 0x25, 0x03, 0x3b, 0x0e, 0x3f, 0xdf, 0x40, 0x04, 0x42, 0x9f, 0x0a, 0x71, 0xdd, 0x00, - 0x5f, 0x08, 0xf2, 0x72, 0x36, 0xb8, 0x00, 0x7e, 0x4f, 0x8d, 0x60, 0x2a, 0x23, 0x70, 0x41, 0xc8, 0x86, 0x80, 0x8d, 0x2c, 0x65, 0x21, 0xcc, 0xe4, 0x3a, 0x41, 0xe6, 0x30, 0x5f, 0x2e, 0x10, 0x5f, - 0x6d, 0xb3, 0xc9, 0x2e, 0x8c, 0xb5, 0x51, 0x35, 0x85, 0x70, 0x6c, 0x57, 0x41, 0x85, 0x17, 0x07, 0x8d, 0xaf, 0x4c, 0xdc, 0x25, 0x20, 0x42, 0x8b, 0x68, 0xa1, 0xb3, 0xed, 0xb1, 0x46, 0x32, 0x6c, - 0x17, 0xe1, 0x24, 0x50, 0x20, 0x96, 0x1d, 0x64, 0x65, 0x12, 0xa5, 0x7d, 0xf7, 0xb2, 0xa8, 0x9d, 0xd0, 0x7f, 0xd9, 0x29, 0x1c, 0x7c, 0x2a, 0x62, 0xd2, 0xab, 0xd2, 0xfd, 0x6e, 0xd3, 0xf0, 0xc7, - 0x02, 0xf9, 0x94, 0xd3, 0xf0, 0x0a, 0x7b, 0x21, 0xfd, 0xf5, 0xe4, 0x5c, 0xb7, 0xd4, 0xc3, 0x69, 0x88, 0x63, 0xa1, 0x5a, 0xaf, 0x44, 0x99, 0x96, 0x79, 0x09, 0x45, 0x23, 0xa7, 0x94, 0x87, 0x1c, - 0x42, 0x14, 0x71, 0x1a, 0x7a, 0x61, 0x4d, 0xf3, 0x80, 0xb1, 0x2f, 0x93, 0xc4, 0xb0, 0x33, 0x71, 0x79, 0x5c, 0x2d, 0xdb, 0xda, 0x38, 0xe4, 0x47, 0x05, 0x4c, 0xe1, 0xa1, 0x45, 0x0f, 0x37, 0x68, - 0x3d, 0xa6, 0x28, 0x63, 0xe8, 0x2f, 0x18, 0xc7, 0x90, 0x89, 0xe5, 0xba, 0x34, 0xb3, 0x25, 0x04, 0x68, 0x3a, 0xd5, 0xd3, 0x08, 0xbb, 0xdd, 0x15, 0xf2, 0xd7, 0x07, 0x73, 0xe3, 0xb6, 0x6f, 0xed, - 0xb5, 0x49, 0xed, 0x4f, 0xf9, 0xd2, 0xb7, 0xcd, 0xeb, 0x7d, 0x35, 0xd2, 0x67, 0xa1, 0xdf, 0x9f, 0xaf, 0xbe, 0xbd, 0xc1, 0x3d, 0x31, 0xe7, 0xed, 0xac, 0xef, 0xba, 0x5b, 0x82, 0xa0, 0x8d, 0xfd, - 0x41, 0x48, 0x0e, 0xcb, 0xb4, 0x41, 0xcc, 0x2d, 0x86, 0xc2, 0x32, 0xa0, 0x91, 0xd3, 0x63, 0xbe, 0xe9, 0x2c, 0x6f, 0x01, 0x4c, 0x30, 0x4d, 0xa0, 0x77, 0x48, 0xa3, 0x46, 0xea, 0x21, 0xc5, 0x21, - 0x0c, 0x32, 0xe7, 0xeb, 0x59, 0x1d, 0xa8, 0xfa, 0x56, 0x93, 0x0a, 0x09, 0x62, 0xb0, 0x6c, 0xd1, 0xfa, 0x40, 0x1c, 0x99, 0x26, 0xcc, 0x2d, 0x42, 0x40, 0xf1, 0xda, 0x09, 0x27, 0x90, 0x3f, 0x77, - 0xe9, 0x9a, 0xf4, 0x68, 0x5f, 0x88, 0xfa, 0x59, 0x40, 0xee, 0x09, 0x9d, 0x71, 0x05, 0x3d, 0x11, 0xe6, 0x7a, 0xd8, 0xb7, 0x51, 0x9a, 0xb6, 0xad, 0xb6, 0x91, 0xe3, 0x01, 0x11, 0x96, 0xc4, 0xc0, - 0x71, 0x88, 0xcf, 0x96, 0x2c, 0x6f, 0x58, 0xe5, 0x74, 0x48, 0xe6, 0xb0, 0xee, 0x9b, 0xe0, 0x82, 0xaf, 0x9d, 0x42, 0x9a, 0xeb, 0xb0, 0xe6, 0x62, 0x59, 0xb0, 0xe0, 0xe9, 0x51, 0x65, 0xd2, 0x8b, - 0xc5, 0x8a, 0x6f, 0xf3, 0x11, 0xb0, 0x11, 0xc7, 0x79, 0xa9, 0xb4, 0x6e, 0xeb, 0x68, 0xc6, 0xd1, 0x4a, 0x23, 0xd8, 0x6e, 0x49, 0x8e, 0x71, 0xc0, 0x9f, 0xcc, 0x44, 0x7d, 0xaa, 0xa8, 0x8b, 0xcf, - 0x8d, 0x1a, 0xe8, 0x19, 0x7a, 0x15, 0xa7, 0x49, 0xbb, 0x38, 0x59, 0x2c, 0x50, 0x2f, 0x22, 0x81, 0xfb, 0xaa, 0xec, 0x7c, 0xa9, 0x1b, 0xee, 0x28, 0x65, 0xee, 0x36, 0x07, 0x31, 0x4a, 0xf3, 0xd9, - 0x04, 0xc3, 0xcb, 0x4e, 0xaf, 0x4b, 0x7c, 0x21, 0x0d, 0xe1, 0xf1, 0x9e, 0x69, 0xd7, 0x26, 0x1f, 0x4c, 0xe7, 0x99, 0x6e, 0x42, 0xe6, 0x8c, 0x23, 0x57, 0x56, 0xd7, 0xc8, 0xd0, 0x16, 0x6c, 0x64, - 0x5d, 0xd8, 0xad, 0x72, 0x75, 0x2c, 0x71, 0x11, 0x18, 0x0f, 0x27, 0x2b, 0x6a, 0x31, 0xc6, 0xd1, 0x05, 0x9e, 0xf6, 0x0c, 0x77, 0xff, 0x4d, 0x0d, 0xae, 0xc1, 0xbf, 0xd3, 0x47, 0xee, 0x1d, 0x87, - 0xfe, 0xd4, 0x69, 0x7a, 0xc4, 0x4c, 0xf4, 0xa9, 0x36, 0x0b, 0x8f, 0x5f, 0x71, 0xe2, 0xef, 0xc3, 0x1b, 0xe7, 0x06, 0x68, 0x3d, 0x1a, 0x30, 0xd4, 0xfa, 0x04, 0x12, 0xa0, 0xc0, 0x3f, 0x6e, 0x1b, - 0xd6, 0x8f, 0x33, 0x65, 0xa8, 0x6b, 0x15, 0xbc, 0x87, 0xb0, 0x26, 0xe5, 0x95, 0x80, 0x2c, 0xbc, 0x66, 0x58, 0x4c, 0x24, 0x2f, 0x90, 0x74, 0x33, 0x31, 0xf7, 0x84, 0x77, 0x0c, 0x9a, 0x64, 0x69, - 0xc2, 0xc7, 0x59, 0xee, 0x88, 0x19, 0x49, 0xb4, 0x3a, 0x02, 0x97, 0x73, 0x3b, 0x8e, 0x00, 0xd4, 0x53, 0x75, 0x41, 0x93, 0xd7, 0xd5, 0x88, 0x61, 0xdb, 0xaf, 0x4d, 0x8a, 0x8f, 0x4e, 0xc2, 0x63, - 0x2a, 0x21, 0x4f, 0x98, 0x5a, 0xef, 0xb0, 0x87, 0x83, 0xf7, 0x57, 0x06, 0x67, 0xdc, 0xef, 0xe9, 0xb2, 0x6e, 0x98, 0x94, 0x02, 0x63, 0x4b, 0x0c, 0x89, 0x85, 0x48, 0x6a, 0x6b, 0x40, 0xdd, 0x2c, - 0x62, 0xd5, 0xd8, 0xb1, 0x14, 0xe5, 0x24, 0x84, 0xcf, 0x48, 0xac, 0x33, 0x5d, 0x0e, 0x87, 0xc2, 0x30, 0x99, 0x04, 0xb3, 0x63, 0x04, 0x9b, 0x3b, 0x66, 0x5a, 0x3b, 0x2b, 0x23, 0x40, 0xe0, 0x48, - 0x74, 0x76, 0xea, 0xcc, 0xda, 0xee, 0x27, 0xea, 0x28, 0x4f, 0x71, 0x1f, 0x59, 0xa9, 0xb4, 0x43, 0xbb, 0x46, 0x3a, 0xee, 0x39, 0x14, 0x4c, 0xeb, 0xe4, 0xee, 0xd9, 0x59, 0x5a, 0x97, 0x59, 0x1c, - 0xbb, 0x2f, 0xf5, 0xb6, 0xef, 0xdc, 0xa8, 0xd7, 0x4e, 0x3a, 0x17, 0x4f, 0xff, 0xce, 0x31, 0x7f, 0xdd, 0x1d, 0xf7, 0xf4, 0xbb, 0xf7, 0xfb, 0xd9, 0xbd, 0x3a, 0x09, 0x67, 0xd3, 0x05, 0xba, 0x9d, - 0xee, 0xfa, 0x8d, 0xb2, 0x3f, 0x21, 0xf8, 0x37, 0x0c, 0xbf, 0x6c, 0xfe, 0x8a, 0xfe, 0x86, 0x88, 0xd7, 0xdd, 0x5f, 0xf1, 0x9e, 0x0e, 0xdd, 0x89, 0x2b, 0x4e, 0x58, 0xe6, 0x9f, 0x30, 0x1f, 0x79, - 0x6a, 0xf9, 0xd9, 0x0b, 0xe8, 0x95, 0xeb, 0xa7, 0xc3, 0x01, 0xd2, 0x6f, 0x19, 0x5a, 0xc0, 0x89, 0x20, 0x39, 0xca, 0x52, 0x72, 0xeb, 0x34, 0x85, 0x63, 0x05, 0xad, 0x80, 0x19, 0x08, 0x41, 0x81, - 0x8c, 0x18, 0x55, 0x45, 0x87, 0x17, 0xe9, 0xd6, 0xf6, 0xbc, 0x6a, 0x2d, 0x23, 0xe8, 0x08, 0x9b, 0x36, 0x92, 0x53, 0x88, 0x09, 0x40, 0x58, 0xc1, 0x02, 0x1e, 0x2d, 0xda, 0x39, 0x57, 0x8d, 0x69, - 0x86, 0x49, 0xcd, 0x14, 0xa3, 0xf9, 0x66, 0x54, 0x23, 0x52, 0x36, 0x52, 0xb6, 0xf1, 0xba, 0xfb, 0x2e, 0xdc, 0xf7, 0xb9, 0x04, 0xdc, 0x06, 0x44, 0x7f, 0xfd, 0x09, 0x9f, 0x37, 0xa7, 0xf9, 0x19, - 0x8f, 0x3e, 0x94, 0x01, 0x7f, 0xc9, 0x8b, 0xdb, 0x28, 0xce, 0x63, 0xd7, 0xf1, 0x19, 0xbf, 0xe7, 0x16, 0xf8, 0xc2, 0x93, 0xd7, 0xd3, 0xbe, 0x3b, 0x6e, 0x63, 0x84, 0x57, 0x96, 0xb3, 0xf5, 0x90, - 0x9b, 0x48, 0xab, 0x62, 0xc5, 0x51, 0x01, 0x98, 0x04, 0x0a, 0x35, 0x52, 0xc6, 0x6b, 0xd6, 0x01, 0x46, 0x32, 0x61, 0x58, 0xb0, 0xc4, 0xae, 0x67, 0xce, 0x58, 0xce, 0x0c, 0x85, 0xab, 0x67, 0xd6, - 0xa2, 0x8b, 0x0e, 0x95, 0x3e, 0xa3, 0x17, 0x08, 0x35, 0xa2, 0x74, 0x7d, 0xc2, 0xa3, 0x41, 0x8a, 0x1f, 0x21, 0x49, 0xb1, 0x4c, 0xce, 0xeb, 0xd4, 0x3a, 0xc1, 0x66, 0xd3, 0x1f, 0x75, 0xfd, 0x87, - 0xe0, 0xdf, 0x10, 0xd2, 0x93, 0x8e, 0xbe, 0x7b, 0xc8, 0x7f, 0xe7, 0x65, 0x56, 0x67, 0xf5, 0x31, 0x77, 0x7f, 0x7b, 0xb1, 0xe9, 0x7f, 0x36, 0xa3, 0x43, 0x4f, 0x85, 0xb4, 0x1f, 0xbf, 0xe2, 0x4c, - 0xdb, 0x47, 0x37, 0xce, 0x2b, 0x31, 0x7a, 0xcc, 0xfb, 0x8b, 0x70, 0xec, 0x6c, 0xc7, 0xc5, 0x08, 0x52, 0x63, 0x9d, 0x68, 0xb6, 0x0b, 0xd0, 0xa9, 0x88, 0x2d, 0xe0, 0xc8, 0x20, 0x1c, 0xe2, 0xab, - 0x65, 0x48, 0x96, 0xc8, 0xb8, 0x11, 0x82, 0x8d, 0x96, 0x02, 0xbb, 0xc4, 0x5d, 0x6d, 0x00, 0xc6, 0x63, 0x03, 0x2f, 0x2a, 0xd6, 0xdb, 0xb0, 0x82, 0xba, 0xc5, 0x21, 0x8d, 0x1b, 0x92, 0x0c, 0x8a, - 0x21, 0xea, 0x1c, 0x40, 0x1e, 0xe6, 0x78, 0x84, 0xe2, 0xb7, 0xd2, 0xfb, 0x90, 0xd1, 0x0f, 0xa4, 0xff, 0x7f, 0xff, 0xba, 0x91, 0x97, 0x51, 0xe0, 0x9d, 0xdc, 0xde, 0x2f, 0x7b, 0x6c, 0x3d, 0xd7, - 0x7c, 0xf3, 0x01, 0xfe, 0x59, 0x48, 0x3e, 0x5c, 0xed, 0xdb, 0x82, 0x53, 0xf3, 0xc0, 0x54, 0x75, 0xf1, 0x6d, 0xe5, 0x76, 0xe1, 0x74, 0xdd, 0x00, 0x54, 0x3e, 0xb2, 0xc2, 0x50, 0xb6, 0x92, 0x3c, - 0x2e, 0x70, 0x71, 0x34, 0xcc, 0x01, 0x62, 0x4f, 0xe8, 0x1a, 0x3f, 0x5c, 0x8c, 0xd9, 0xa0, 0x94, 0x69, 0x5a, 0x0e, 0xf6, 0x26, 0xd0, 0x52, 0x9b, 0x63, 0x63, 0x35, 0x85, 0x67, 0xa8, 0x52, 0xeb, - 0xca, 0xc3, 0x21, 0xad, 0x2b, 0xb3, 0x8a, 0x9e, 0x11, 0xdb, 0xe5, 0x6a, 0xd8, 0x32, 0x3f, 0x69, 0x49, 0xd8, 0x3b, 0xcf, 0x76, 0xa5, 0xd0, 0xe7, 0x3e, 0x19, 0xf1, 0x94, 0x26, 0x3b, 0x3f, 0x76, - 0xa6, 0xe1, 0xf9, 0x68, 0x70, 0x01, 0xfa, 0x9e, 0x70, 0xa1, 0x0d, 0x10, 0x0b, 0x3d, 0x54, 0x48, 0x25, 0x84, 0x8f, 0x9d, 0x30, 0x9b, 0xaa, 0xdc, 0x2e, 0x34, 0x68, 0xcc, 0x18, 0x75, 0x04, 0x07, - 0x1b, 0x41, 0x32, 0xd2, 0xd6, 0xa6, 0x74, 0x70, 0x16, 0xcc, 0x61, 0x69, 0x56, 0xa1, 0x3b, 0x9d, 0x94, 0xc0, 0x51, 0x33, 0x86, 0x6a, 0xa2, 0x55, 0xf6, 0x8e, 0x0d, 0x97, 0x31, 0x04, 0x9b, 0x25, - 0x78, 0xc4, 0xb5, 0x50, 0xa3, 0x0f, 0x48, 0x82, 0x6e, 0xd9, 0x14, 0x7a, 0xbe, 0x24, 0xeb, 0x2e, 0x0b, 0x79, 0x19, 0x5b, 0xff, 0x0c, 0x7b, 0xb9, 0x74, 0xab, 0x26, 0xf9, 0xb4, 0xc2, 0x1c, 0x7c, - 0x2a, 0xa0, 0x7e, 0xc5, 0xbc, 0xf0, 0xe8, 0x74, 0x34, 0x00, 0xbf, 0x0f, 0x98, 0x43, 0x03, 0xd2, 0x8d, 0x40, 0xdd, 0x15, 0x66, 0x22, 0xce, 0xb9, 0x7e, 0x41, 0x92, 0xc8, 0xa4, 0x58, 0x87, 0x12, - 0xc8, 0x1a, 0xd0, 0xd3, 0xbb, 0x49, 0xd5, 0x41, 0x99, 0x35, 0xfe, 0x79, 0xee, 0xfe, 0x07, 0xfc, 0x1b, 0xe9, 0x55, 0x08, 0x55, 0xba, 0x9f, 0xc5, 0xd7, 0x4e, 0xe3, 0xf3, 0x19, 0x0d, 0x50, 0x9f, - 0x29, 0x51, 0x9f, 0x67, 0xda, 0x1e, 0x23, 0x7c, 0x0d, 0x5a, 0x88, 0xae, 0x0a, 0x15, 0xb1, 0x45, 0x8c, 0x11, 0x44, 0xa8, 0x5b, 0xe1, 0x08, 0xb1, 0x2c, 0x45, 0x8c, 0x4d, 0x82, 0x26, 0x83, 0xd6, - 0xf0, 0x71, 0x99, 0xc1, 0x92, 0xd5, 0x71, 0xb7, 0x38, 0x08, 0x0a, 0x03, 0x47, 0x0d, 0x38, 0xd7, 0xac, 0x59, 0x6c, 0xb2, 0x3c, 0x1f, 0xef, 0x74, 0x40, 0xdd, 0x10, 0xfb, 0x29, 0x0f, 0xec, 0xe5, - 0xb5, 0x96, 0x8c, 0xa7, 0x14, 0x68, 0x2a, 0x78, 0xab, 0xdf, 0x57, 0xda, 0xff, 0x0d, 0x45, 0xda, 0xa5, 0xdb, 0x54, 0x97, 0x04, 0xd2, 0xe3, 0xc1, 0xfd, 0x8c, 0x63, 0x75, 0xc5, 0x3c, 0x53, 0xeb, - 0x7c, 0xd4, 0xb7, 0x77, 0x9d, 0x3c, 0x4a, 0x59, 0x92, 0x34, 0x11, 0xcf, 0x1e, 0xba, 0xbb, 0xc9, 0x14, 0x8a, 0xc1, 0xa1, 0xcc, 0x43, 0xf3, 0xac, 0x0a, 0x9b, 0x79, 0x74, 0x94, 0x02, 0x22, 0x18, - 0xb7, 0x9a, 0xb2, 0x66, 0x75, 0x5f, 0xb1, 0xbd, 0x59, 0x5b, 0x93, 0x23, 0x42, 0xf3, 0x9b, 0x08, 0x96, 0xb9, 0x15, 0xed, 0xce, 0xb1, 0xf1, 0x0c, 0x4e, 0x88, 0x61, 0xb3, 0x3f, 0x9a, 0x2b, 0x45, - 0xc2, 0x3d, 0xab, 0x9e, 0xec, 0xa5, 0x63, 0xf7, 0xbd, 0x4e, 0x0c, 0xb3, 0x4b, 0x78, 0xeb, 0x3f, 0xfe, 0xfd, 0x43, 0x2a, 0xf0, 0x19, 0x75, 0xe9, 0x39, 0xf6, 0x17, 0x26, 0xca, 0x13, 0xc3, 0xd0, - 0x73, 0xec, 0x13, 0x2d, 0x3d, 0xc7, 0x3e, 0x9b, 0x1f, 0x3d, 0x74, 0xa4, 0x02, 0x07, 0x59, 0xeb, 0x74, 0x53, 0x8b, 0x0b, 0x09, 0x62, 0xa8, 0x9a, 0x91, 0x29, 0xae, 0xb5, 0x1d, 0xcc, 0xad, 0x12, - 0xe0, 0xb0, 0x99, 0xbb, 0x82, 0xb3, 0x5e, 0x37, 0x63, 0x22, 0xb4, 0x23, 0xc2, 0xda, 0xe1, 0x5d, 0x08, 0x4f, 0xc9, 0xd9, 0x8c, 0x3a, 0x84, 0xbe, 0x9d, 0xd2, 0xd3, 0x7c, 0xc1, 0x5a, 0x9b, 0xe3, - 0xc6, 0xf6, 0x8f, 0x0b, 0x3a, 0xe4, 0x01, 0x32, 0xe5, 0x4a, 0x1d, 0xb3, 0x8d, 0x59, 0xf9, 0x75, 0xa6, 0xe4, 0x9c, 0x97, 0xfc, 0xb2, 0x17, 0x29, 0xf6, 0xd4, 0x8e, 0x90, 0x37, 0xb8, 0xc3, 0xc1, - 0xed, 0xd9, 0x00, 0xeb, 0xb7, 0x33, 0x64, 0x99, 0x23, 0x62, 0x06, 0x12, 0x4b, 0xdb, 0x49, 0x92, 0xa5, 0x35, 0x6b, 0x7d, 0x73, 0x73, 0x10, 0xc4, 0x45, 0x49, 0x58, 0x33, 0x45, 0x54, 0x76, 0x98, - 0x38, 0x62, 0x0a, 0x68, 0x0a, 0xe4, 0xb9, 0xb5, 0xcd, 0x08, 0x10, 0xd0, 0x5d, 0x93, 0x3e, 0xec, 0xf6, 0x18, 0xed, 0x90, 0x1b, 0x7e, 0x03, 0xcc, 0x68, 0xdc, 0x8a, 0x52, 0x3d, 0x81, 0x95, 0x86, - 0x6f, 0x26, 0x5a, 0x92, 0x37, 0x7a, 0x9b, 0x4c, 0xee, 0x57, 0xa1, 0xfd, 0x9f, 0x9d, 0x21, 0x3f, 0x7d, 0xcd, 0x5f, 0xdc, 0x19, 0xf2, 0xcc, 0xee, 0xb3, 0x25, 0x0e, 0x7f, 0x61, 0xcd, 0xfd, 0x7c, - 0x48, 0xdd, 0xe0, 0xbe, 0x08, 0xd5, 0xe5, 0xec, 0x6c, 0xbd, 0xf5, 0x18, 0x60, 0xbc, 0x29, 0x8b, 0xd3, 0x4a, 0x36, 0x37, 0x9b, 0x66, 0xb9, 0xdf, 0x8d, 0xc3, 0x28, 0xa3, 0x78, 0x96, 0x5a, 0xe2, - 0x43, 0x77, 0x8d, 0x2b, 0x61, 0xd9, 0x1e, 0x79, 0x35, 0x36, 0x88, 0xf1, 0xff, 0x4f, 0xdd, 0x9f, 0x35, 0xa9, 0xaa, 0x74, 0xff, 0xa2, 0xf0, 0xfd, 0xfe, 0x14, 0x2b, 0xd6, 0x2d, 0xe1, 0x92, 0x1e, - 0x79, 0xe3, 0xbd, 0x38, 0x28, 0x2a, 0x8a, 0x0a, 0x08, 0x48, 0x73, 0xf1, 0x44, 0xd0, 0x37, 0xd2, 0xf7, 0x10, 0x71, 0x9e, 0xcf, 0x7e, 0xa2, 0xb4, 0xaa, 0x66, 0x59, 0xea, 0x2c, 0xa6, 0x7b, 0x9d, - 0xf8, 0xef, 0x73, 0x55, 0x90, 0x50, 0x03, 0xf3, 0x97, 0x99, 0x23, 0x47, 0x8e, 0x96, 0x12, 0x7a, 0x94, 0x06, 0xfc, 0x45, 0xe3, 0xa3, 0x73, 0x3c, 0xda, 0xac, 0x81, 0x84, 0xb7, 0x7d, 0x73, 0xe5, - 0x6e, 0x4c, 0x1e, 0xf0, 0xa4, 0xf5, 0xdc, 0x2a, 0xec, 0x92, 0x33, 0xe4, 0x12, 0x5c, 0x01, 0xfa, 0x9c, 0x1b, 0xa9, 0xcc, 0xb8, 0x6e, 0x6c, 0x7f, 0xff, 0x17, 0x1c, 0xe9, 0x4e, 0xf6, 0xcc, 0x63, - 0xe0, 0x31, 0x9c, 0xe8, 0x0b, 0x3e, 0x7b, 0x0f, 0xbf, 0xf0, 0x01, 0xec, 0xf7, 0xf6, 0xc9, 0xe5, 0x1b, 0x3f, 0x43, 0xec, 0xc0, 0x26, 0x4d, 0xc1, 0xca, 0x56, 0x02, 0xdb, 0xae, 0x74, 0x4e, 0x36, - 0x1a, 0x95, 0x34, 0x8f, 0x02, 0x08, 0x77, 0x50, 0x71, 0x26, 0xdb, 0xab, 0x82, 0x01, 0xe9, 0xfe, 0x4a, 0x20, 0x44, 0x19, 0x58, 0x87, 0x0d, 0x77, 0x5c, 0xc4, 0xa2, 0x6f, 0x2e, 0xf6, 0x51, 0x55, - 0x54, 0x1b, 0xda, 0x3d, 0x6b, 0xfe, 0x89, 0x29, 0x38, 0x8b, 0xaf, 0x42, 0x80, 0xf5, 0x63, 0x7a, 0x6e, 0xf3, 0xb6, 0x4e, 0x43, 0x7f, 0x72, 0x50, 0x1d, 0x65, 0xb4, 0x28, 0x1d, 0xab, 0x2e, 0x9c, - 0xc9, 0x25, 0x93, 0xdc, 0xef, 0x7c, 0xd1, 0xe0, 0x7f, 0x5e, 0x91, 0x92, 0xef, 0xa8, 0x5f, 0xc2, 0xfd, 0xbe, 0xb5, 0x4d, 0x2e, 0xb4, 0x7f, 0x06, 0x14, 0x37, 0x64, 0xe0, 0xd8, 0x96, 0xce, 0xd0, - 0x12, 0xa7, 0xe3, 0x6c, 0x9a, 0xf4, 0x0d, 0x2b, 0x75, 0x33, 0x21, 0x53, 0x18, 0x72, 0x55, 0x58, 0x5a, 0xa0, 0xaa, 0x51, 0xbe, 0x40, 0x07, 0xcc, 0xc6, 0x54, 0x61, 0x4e, 0x1f, 0xf3, 0xca, 0x74, - 0xcb, 0x63, 0x98, 0xb4, 0xeb, 0x3e, 0x37, 0x03, 0xc4, 0xb3, 0xed, 0x43, 0xa5, 0x30, 0xf5, 0xf2, 0x4c, 0x72, 0xd4, 0x41, 0x4e, 0xab, 0x1d, 0x8c, 0xe7, 0xac, 0xfc, 0x7b, 0x7f, 0xd9, 0xdf, 0x86, - 0x3d, 0x12, 0xff, 0x20, 0x2f, 0x58, 0x73, 0xbe, 0x87, 0x3d, 0x5e, 0xa8, 0xfc, 0xdc, 0xf9, 0xc3, 0x1c, 0xb2, 0xaa, 0xf5, 0x0e, 0x2b, 0x22, 0xa6, 0xe0, 0xb7, 0xd5, 0x8a, 0x3e, 0x6d, 0x4e, 0x83, - 0xd4, 0x0b, 0x7d, 0xb4, 0xdf, 0xd5, 0xe4, 0x81, 0x3c, 0x6d, 0x16, 0x14, 0xce, 0x88, 0xab, 0x6d, 0x3a, 0xdb, 0x2f, 0xd6, 0x27, 0x69, 0xaf, 0xe0, 0x9e, 0x9b, 0x05, 0x56, 0xcb, 0xc6, 0x31, 0x3b, - 0xb5, 0xa9, 0x50, 0xe2, 0x8a, 0xbc, 0xc6, 0x22, 0x1c, 0xd9, 0x6e, 0xb9, 0x8c, 0x16, 0x0b, 0x2a, 0x28, 0x91, 0x91, 0x3e, 0x1c, 0x5f, 0x73, 0x9a, 0x7d, 0x38, 0x11, 0x7d, 0xcc, 0xac, 0xcf, 0x7f, - 0x1f, 0x15, 0x22, 0xf9, 0xe7, 0xd1, 0x63, 0xa3, 0xa7, 0xf1, 0x7d, 0xd6, 0xbb, 0xc7, 0xd3, 0xf8, 0x15, 0x35, 0xe2, 0x1d, 0xf5, 0xcb, 0xf0, 0x7d, 0x6b, 0x1b, 0x9b, 0xdf, 0xea, 0x78, 0x4a, 0x4e, - 0x42, 0x27, 0xa9, 0xb5, 0x53, 0x9c, 0x71, 0x0c, 0x51, 0xdd, 0x3a, 0x0a, 0xb8, 0x6e, 0xce, 0xcf, 0x20, 0xd1, 0x05, 0x81, 0xdc, 0x15, 0x96, 0x04, 0xb2, 0xdb, 0x68, 0xac, 0xd5, 0xef, 0x35, 0x66, - 0x4d, 0xa2, 0x54, 0xcd, 0x80, 0x67, 0xaf, 0x10, 0xb2, 0x23, 0x5d, 0x4b, 0x7a, 0x22, 0xc6, 0x61, 0xd6, 0x97, 0x4c, 0x3c, 0x74, 0x5b, 0x95, 0x3d, 0xb8, 0x06, 0xce, 0x87, 0x2b, 0xbf, 0xff, 0x7d, - 0x92, 0x8b, 0x6f, 0x96, 0x94, 0x7f, 0x4f, 0x52, 0xfe, 0x4a, 0xf8, 0x0d, 0x93, 0x2f, 0xb7, 0x63, 0x65, 0xe6, 0x1c, 0x53, 0xf9, 0xbe, 0xca, 0x57, 0xcb, 0x0d, 0xcb, 0x9c, 0xd7, 0x76, 0xb0, 0xdf, - 0x14, 0x1a, 0x04, 0xc6, 0xcd, 0xee, 0xd8, 0x24, 0x82, 0x8f, 0xc2, 0x53, 0x60, 0x9d, 0xce, 0xa3, 0x95, 0x82, 0x98, 0xf0, 0x4e, 0xdd, 0x2d, 0xe1, 0xae, 0xdb, 0x66, 0xfa, 0xca, 0x8e, 0x49, 0xb4, - 0x75, 0xc0, 0xb9, 0x91, 0x9e, 0x90, 0x63, 0xbb, 0xed, 0xd7, 0xb9, 0x87, 0xb5, 0x22, 0xe1, 0x64, 0x9d, 0xd4, 0x80, 0x7a, 0x33, 0xd2, 0x66, 0xff, 0x43, 0x40, 0xc5, 0xa3, 0xea, 0xac, 0xdf, 0x34, - 0x4f, 0x77, 0x91, 0x75, 0x6f, 0xef, 0x90, 0xa3, 0x73, 0x2d, 0x8c, 0x10, 0x9e, 0x46, 0x9f, 0xa0, 0x9f, 0xe6, 0xb3, 0x78, 0x36, 0xdc, 0x7f, 0xee, 0x25, 0xf0, 0xf8, 0x13, 0x97, 0x81, 0x7f, 0xf4, - 0x60, 0xac, 0xcb, 0xf1, 0x7c, 0xce, 0x7a, 0xc7, 0x19, 0x3a, 0xdf, 0x0a, 0xdb, 0x18, 0x57, 0x42, 0x65, 0xb5, 0x67, 0xbc, 0xdd, 0xa9, 0x4e, 0x71, 0x68, 0x35, 0xa7, 0xc5, 0x10, 0x1a, 0xa6, 0x9d, - 0xb8, 0x92, 0x37, 0xe9, 0x90, 0x73, 0x78, 0xcb, 0x11, 0x41, 0x00, 0x6e, 0xbb, 0x45, 0x1e, 0x6d, 0x6a, 0x9b, 0x58, 0x26, 0xc5, 0x14, 0xd8, 0xf9, 0x91, 0x79, 0xd8, 0x80, 0xad, 0xbf, 0x2c, 0x72, - 0x12, 0xe7, 0xe1, 0x9c, 0x39, 0x28, 0xce, 0xeb, 0x1a, 0x91, 0x5f, 0x8c, 0xeb, 0xbf, 0xc4, 0x4b, 0xc1, 0xc5, 0xa3, 0xf5, 0xec, 0x4f, 0xf0, 0xfc, 0x93, 0x2d, 0xe8, 0x25, 0xe9, 0xf1, 0x6e, 0x0b, - 0x1a, 0x25, 0x33, 0x02, 0xeb, 0x39, 0x3e, 0x9c, 0x28, 0x72, 0xa7, 0xf8, 0xf8, 0x90, 0x36, 0x9a, 0xb0, 0xa3, 0x76, 0x4c, 0xdb, 0x60, 0x85, 0x09, 0xf3, 0xcc, 0x3a, 0xda, 0x06, 0x48, 0xe4, 0x06, - 0xf9, 0x86, 0xe9, 0x8e, 0x60, 0x5d, 0xb7, 0x0b, 0xcf, 0x71, 0x2d, 0x6e, 0x6b, 0x61, 0x64, 0x43, 0xba, 0x0d, 0xd4, 0xce, 0xd6, 0xa6, 0x58, 0xb5, 0x5d, 0x5d, 0xe7, 0x39, 0x15, 0x6e, 0xc8, 0xc3, - 0x9e, 0xe2, 0x38, 0x2f, 0x87, 0x7e, 0xd2, 0x09, 0xff, 0xf1, 0xb6, 0xf2, 0x1b, 0xb4, 0xbf, 0xba, 0x93, 0x3e, 0x42, 0x13, 0x79, 0xe9, 0x78, 0xfb, 0x8b, 0xec, 0x1b, 0xa2, 0x9f, 0x37, 0x13, 0x64, - 0xdc, 0x51, 0x77, 0xa7, 0x75, 0x19, 0x82, 0xb2, 0x91, 0x0e, 0x19, 0xf0, 0xd6, 0x9c, 0xe9, 0x82, 0xb7, 0x5a, 0xb0, 0x48, 0x12, 0x6c, 0x98, 0x21, 0x30, 0xed, 0xb6, 0x6a, 0x0f, 0xb2, 0xc2, 0x7a, - 0x60, 0x2e, 0x1c, 0x87, 0x92, 0x4e, 0xb7, 0xc8, 0xda, 0xf5, 0xce, 0xee, 0x8c, 0xb5, 0xe7, 0xd2, 0x4a, 0x46, 0xc4, 0xb3, 0x13, 0xd2, 0xcb, 0x4d, 0xa4, 0xb4, 0x89, 0x98, 0x64, 0x27, 0x9b, 0xd3, - 0x37, 0xfe, 0x6a, 0x1f, 0x4d, 0x47, 0xba, 0xce, 0x3c, 0xf1, 0x5f, 0x1e, 0x01, 0xe5, 0x87, 0xc3, 0xe6, 0x23, 0x18, 0xd1, 0x97, 0x4c, 0x43, 0x57, 0x92, 0x6f, 0x10, 0x5e, 0x2e, 0x26, 0xe8, 0x38, - 0x73, 0x90, 0x6c, 0x85, 0xd6, 0x96, 0x53, 0xce, 0x49, 0x71, 0x38, 0xaf, 0x70, 0x7e, 0xa7, 0xce, 0x90, 0xdc, 0x62, 0xf6, 0x38, 0xcb, 0x78, 0x27, 0xf6, 0x70, 0x3e, 0xe1, 0xb0, 0x36, 0x33, 0xb0, - 0x5a, 0xa3, 0x4f, 0x0d, 0xd9, 0xdb, 0x6b, 0xe1, 0xd4, 0x52, 0xcc, 0x9e, 0xcd, 0x19, 0x7b, 0x1b, 0x3a, 0xd0, 0x49, 0x52, 0xb2, 0x28, 0x5c, 0x83, 0x8a, 0x96, 0x2d, 0x68, 0xbf, 0x58, 0xd8, 0x14, - 0xa7, 0x31, 0xa8, 0xa4, 0xfc, 0x89, 0x94, 0xfd, 0x17, 0x04, 0xfe, 0xd3, 0x8d, 0x81, 0xec, 0x72, 0x7e, 0xf8, 0x62, 0x8f, 0xa9, 0x8a, 0xe0, 0xd9, 0x44, 0x7c, 0xad, 0xc4, 0xe6, 0xc3, 0x2f, 0xbc, - 0x01, 0xfa, 0xa8, 0x7d, 0x6c, 0xd9, 0x4d, 0x5f, 0x59, 0x9c, 0xa7, 0x41, 0xee, 0x12, 0x51, 0x06, 0x4e, 0x29, 0x4f, 0x5a, 0x11, 0x53, 0xdb, 0xe6, 0xa0, 0x8d, 0x52, 0x89, 0x07, 0x9e, 0x12, 0xc3, - 0x68, 0x58, 0x04, 0xd6, 0x09, 0x0b, 0x0a, 0xea, 0x64, 0x2f, 0x21, 0xaf, 0x08, 0xcb, 0xc4, 0x61, 0x61, 0x5c, 0x5b, 0xe3, 0x1d, 0xb5, 0xd8, 0xcf, 0x97, 0xf6, 0xa2, 0xe1, 0x66, 0xae, 0x2c, 0x4a, - 0xa0, 0x3c, 0xd0, 0x7b, 0x7f, 0x0a, 0x0b, 0x3d, 0xf0, 0x2c, 0x51, 0xdb, 0x88, 0x19, 0xfb, 0xbf, 0x61, 0x08, 0xfa, 0xf2, 0xda, 0xc3, 0x0c, 0xfe, 0xe0, 0x24, 0x71, 0xba, 0xea, 0xff, 0x3b, 0xf5, - 0x1e, 0x1e, 0x0e, 0xeb, 0x35, 0x5d, 0xf1, 0xbf, 0x28, 0xe0, 0x3d, 0xf9, 0xc8, 0xb3, 0x69, 0xe5, 0x24, 0xf6, 0x58, 0xc1, 0xaf, 0x27, 0xbb, 0x45, 0xd8, 0x42, 0x3c, 0x8c, 0x50, 0xed, 0x79, 0xb6, - 0x6c, 0xa4, 0xcc, 0xea, 0x77, 0xf0, 0x61, 0x53, 0x40, 0x21, 0xd1, 0x6e, 0x11, 0xd2, 0x05, 0xce, 0x78, 0xd4, 0x1c, 0x13, 0x71, 0x3f, 0x00, 0xf1, 0x40, 0x2e, 0xd6, 0x03, 0x79, 0xd0, 0x78, 0x27, - 0xa2, 0xcf, 0x28, 0x7c, 0xe6, 0x06, 0x1c, 0xc8, 0xa3, 0x59, 0x17, 0xba, 0xec, 0x2c, 0xd5, 0x86, 0x1e, 0x09, 0x29, 0x1e, 0x13, 0x64, 0x6c, 0xe4, 0x89, 0xe6, 0x7f, 0x63, 0x1a, 0xfd, 0x1f, 0x32, - 0xd0, 0x65, 0x65, 0xfc, 0x36, 0xfc, 0xe0, 0x5f, 0x1a, 0xea, 0xcb, 0x67, 0x9e, 0x0d, 0xf6, 0xe5, 0xe1, 0xd8, 0xe1, 0x0e, 0x7d, 0xdc, 0x21, 0x67, 0x28, 0x37, 0x77, 0x9b, 0x4e, 0xc4, 0xc0, 0xca, - 0xd6, 0xe0, 0xe4, 0xa8, 0x27, 0xe9, 0x02, 0x9b, 0xc6, 0xbb, 0x15, 0xcb, 0x1d, 0x97, 0x82, 0xdb, 0xce, 0x2a, 0xac, 0xef, 0xab, 0x73, 0x2a, 0x97, 0xdb, 0xe3, 0xa1, 0x6b, 0x36, 0xd3, 0x25, 0x42, - 0xe6, 0x35, 0x54, 0xd2, 0x20, 0x57, 0x29, 0x1b, 0x84, 0x5b, 0x80, 0xaa, 0xc7, 0x8a, 0xb1, 0xa5, 0xb4, 0x43, 0xd0, 0x6a, 0xb5, 0xfe, 0xb2, 0x9c, 0xff, 0x7f, 0xf2, 0x70, 0xd7, 0x99, 0x53, 0x18, - 0xde, 0x73, 0xf7, 0xea, 0xd9, 0x4b, 0x05, 0x31, 0x7f, 0x91, 0xbd, 0xa6, 0x01, 0x7a, 0xbf, 0x99, 0xcc, 0xc6, 0x95, 0xc5, 0x4c, 0xe7, 0x0b, 0xc0, 0x38, 0x94, 0x8b, 0x70, 0x18, 0xc2, 0x98, 0xc3, - 0x28, 0x8e, 0x9f, 0xf3, 0x2b, 0x11, 0xd0, 0x09, 0x86, 0x1f, 0xa2, 0x0e, 0xa0, 0x85, 0x62, 0x6a, 0x30, 0xed, 0x1e, 0x9c, 0x9d, 0x37, 0xc0, 0x11, 0x46, 0xbd, 0x92, 0x8e, 0x29, 0x11, 0xda, 0xed, - 0xdd, 0xc1, 0x80, 0x5c, 0x16, 0xe0, 0x01, 0x91, 0x8d, 0x24, 0x2a, 0x3d, 0xe8, 0x19, 0xd7, 0xa4, 0xe9, 0x72, 0x9a, 0x1d, 0x39, 0x88, 0xf9, 0x49, 0xf8, 0xfb, 0x5d, 0x9a, 0xfc, 0x38, 0x4b, 0x93, - 0xb7, 0xdf, 0xef, 0xc4, 0x41, 0x55, 0x7d, 0xe6, 0xed, 0xfb, 0xe6, 0xd9, 0x74, 0x3d, 0xa0, 0x87, 0xc6, 0x47, 0x12, 0xfc, 0x6f, 0xfb, 0xc0, 0xaf, 0x04, 0x85, 0xe8, 0xc5, 0x28, 0xf7, 0xe5, 0xd1, - 0x25, 0x70, 0xeb, 0x5d, 0xff, 0x77, 0x1b, 0xa4, 0xf4, 0x2d, 0x80, 0xcb, 0x4d, 0x8b, 0x78, 0x62, 0x1b, 0x95, 0xf1, 0xf7, 0xc3, 0xd0, 0x96, 0xb7, 0xc7, 0x81, 0xfd, 0x5e, 0x4e, 0xfb, 0xa3, 0x1a, - 0xc5, 0x97, 0xe7, 0xbf, 0x32, 0x97, 0x5f, 0x67, 0xdc, 0xcd, 0xc4, 0xfc, 0x48, 0x42, 0x7d, 0xab, 0xb5, 0xf8, 0xeb, 0xaf, 0xbf, 0xf3, 0xeb, 0x3f, 0xe0, 0xb7, 0x61, 0x76, 0xb7, 0x09, 0x0f, 0xaf, - 0xea, 0xa9, 0xbb, 0xf9, 0xfb, 0x93, 0x53, 0xea, 0x3f, 0xe8, 0x3f, 0xe0, 0x5f, 0xff, 0x7f, 0x08, 0x79, 0x77, 0xdf, 0x1a, 0x63, 0x83, 0xbb, 0xcc, 0xa6, 0xea, 0x79, 0x41, 0x07, 0xfc, 0x25, 0xcf, - 0x96, 0x4f, 0xaa, 0x1f, 0xf3, 0xf5, 0xed, 0x7a, 0x82, 0x8f, 0xf3, 0x5f, 0xf1, 0x8f, 0xa9, 0x7f, 0x70, 0x36, 0xee, 0x79, 0x6a, 0x51, 0xe8, 0x6c, 0xd1, 0x65, 0xc6, 0xb4, 0x45, 0x67, 0xfe, 0xb9, - 0xe2, 0x71, 0xdd, 0x38, 0xe6, 0xaa, 0x09, 0x0a, 0x27, 0xac, 0xd8, 0x35, 0x0a, 0xb8, 0x20, 0x32, 0xe3, 0x58, 0xce, 0x65, 0x44, 0xc0, 0x86, 0xde, 0x1e, 0xb4, 0xa2, 0x8c, 0xb8, 0x6d, 0x15, 0x4e, - 0x3d, 0x1b, 0x9d, 0xe5, 0x1d, 0x86, 0x82, 0x21, 0x5b, 0x59, 0x25, 0xde, 0xac, 0x21, 0xf7, 0x75, 0xb1, 0xe5, 0xb7, 0xa3, 0x7c, 0xb3, 0xe0, 0xff, 0xfe, 0xcf, 0xec, 0xa5, 0x62, 0x7e, 0x97, 0x71, - 0x1b, 0x31, 0x56, 0x95, 0x91, 0x3d, 0x53, 0xf1, 0xa2, 0xff, 0x40, 0xc8, 0x0b, 0x8c, 0xe5, 0x8d, 0xe2, 0x74, 0x72, 0xf9, 0x33, 0xb9, 0x92, 0xf8, 0x79, 0x78, 0xc0, 0xa9, 0x06, 0x83, 0x7c, 0x7b, - 0xdc, 0xc8, 0x67, 0xc1, 0x92, 0x16, 0x62, 0x80, 0x52, 0x94, 0x58, 0x02, 0x1c, 0x75, 0xd0, 0xf5, 0x36, 0xe7, 0x59, 0x23, 0xc8, 0xd6, 0x8b, 0x65, 0x9b, 0x41, 0xa0, 0x2d, 0xec, 0x83, 0xec, 0xd4, - 0x88, 0x7a, 0x2b, 0xcb, 0x8b, 0x00, 0x84, 0xb4, 0x29, 0x77, 0x8e, 0x36, 0xeb, 0x9e, 0x61, 0x57, 0xfe, 0xc6, 0x0a, 0x53, 0xeb, 0x0c, 0xd0, 0x6c, 0x32, 0x77, 0x77, 0xd4, 0xea, 0xf5, 0x13, 0xbf, - 0xed, 0x38, 0xd9, 0xc4, 0xc9, 0x6b, 0xe3, 0xc2, 0xc5, 0xff, 0x0b, 0x7d, 0x5f, 0xe3, 0xd7, 0x0d, 0xc2, 0x7e, 0x7f, 0xf8, 0x3d, 0xed, 0x46, 0x5a, 0x5d, 0xb3, 0x99, 0xfe, 0x7d, 0x35, 0x6a, 0x7c, - 0x1b, 0x5d, 0x37, 0x2d, 0x26, 0x1f, 0xc5, 0xa0, 0xfe, 0xfb, 0xc6, 0x6a, 0x6f, 0x38, 0xd0, 0x67, 0xa1, 0xe9, 0x8f, 0xdd, 0xe9, 0xfe, 0xe3, 0x1f, 0xb5, 0x7f, 0xff, 0x4b, 0xfc, 0x03, 0x7d, 0x49, - 0xd2, 0xfc, 0xab, 0xfc, 0xe3, 0xe5, 0x27, 0xdd, 0x50, 0x0d, 0x12, 0xdf, 0x29, 0x82, 0xab, 0xbb, 0xe7, 0x7f, 0xe1, 0xef, 0x59, 0x53, 0xbf, 0x14, 0xd5, 0xbc, 0xfe, 0x2f, 0x76, 0xcb, 0x73, 0x3e, - 0x33, 0x45, 0xbf, 0x3d, 0x85, 0x6f, 0x9f, 0xde, 0xeb, 0xbb, 0xfe, 0x0b, 0xdd, 0x58, 0x06, 0x7e, 0xcd, 0x9b, 0x8f, 0xde, 0xdc, 0x3f, 0x7d, 0x77, 0xf4, 0x78, 0x83, 0xe3, 0x7b, 0x20, 0xe0, 0x93, - 0x43, 0xd2, 0xf5, 0x97, 0xdc, 0xc0, 0xf2, 0xdd, 0xa5, 0xe2, 0x01, 0xab, 0xbb, 0xd3, 0x1d, 0xbc, 0x4f, 0xfe, 0x8b, 0xe6, 0xe0, 0x72, 0x3d, 0x6e, 0xbd, 0xdc, 0x2a, 0x64, 0x46, 0x26, 0xd3, 0x7a, - 0xc5, 0x5c, 0xf2, 0x73, 0x2e, 0xad, 0x51, 0x86, 0x12, 0x83, 0xc8, 0x96, 0x8c, 0xed, 0x43, 0x1d, 0xbb, 0xa1, 0x3c, 0xa9, 0x17, 0xe5, 0xb5, 0xb7, 0xdb, 0x77, 0xd3, 0xae, 0xa5, 0xf5, 0xf2, 0x7c, - 0x80, 0x64, 0x1b, 0x77, 0x3c, 0x4d, 0x3b, 0x20, 0x4b, 0xfb, 0xa8, 0xa0, 0xfa, 0x9e, 0x3f, 0x2c, 0x69, 0x59, 0x5a, 0x01, 0x7e, 0xdb, 0xc3, 0x3b, 0x79, 0x01, 0xcc, 0x23, 0x40, 0xec, 0x77, 0x2a, - 0x75, 0x48, 0xda, 0x61, 0x1a, 0xf6, 0xfe, 0x34, 0xaf, 0xab, 0xab, 0xa1, 0xe4, 0x77, 0xab, 0xeb, 0xff, 0x75, 0xb9, 0xe8, 0x57, 0x80, 0xd5, 0x23, 0xc0, 0xc1, 0x97, 0x52, 0x02, 0xbd, 0xd3, 0x7c, - 0x63, 0x5f, 0xd7, 0xab, 0x09, 0x38, 0x2e, 0x0d, 0x10, 0xb0, 0x06, 0x77, 0x3b, 0x2f, 0x0c, 0x53, 0x72, 0xae, 0xab, 0xf0, 0xde, 0xb5, 0x1b, 0xde, 0x65, 0x80, 0x3d, 0xbb, 0x5b, 0x14, 0x5d, 0xa4, - 0x8a, 0x9a, 0x63, 0x61, 0xb4, 0xc1, 0x6b, 0x3c, 0xe4, 0x3a, 0xf8, 0xa6, 0xf7, 0x5d, 0x70, 0xea, 0x8a, 0xf1, 0x16, 0x34, 0x57, 0x81, 0x0e, 0xad, 0x66, 0x73, 0x09, 0xb7, 0xd6, 0x6a, 0x04, 0xef, - 0xb2, 0xa8, 0x12, 0xb2, 0x6a, 0x08, 0x55, 0x56, 0x59, 0x9e, 0xd9, 0x91, 0x87, 0x17, 0x33, 0x48, 0xaa, 0xc2, 0xb9, 0x4a, 0xa9, 0xd0, 0x4d, 0xad, 0xb1, 0xdf, 0x80, 0xf7, 0x2d, 0x54, 0xfa, 0x11, - 0x84, 0xf0, 0x4b, 0xea, 0xaf, 0x1b, 0xca, 0x6f, 0x40, 0x7e, 0xbd, 0xbf, 0xe4, 0x56, 0x18, 0x31, 0x63, 0xcf, 0x06, 0x9d, 0xc7, 0x10, 0xbd, 0x94, 0xc8, 0x2c, 0x43, 0x0e, 0x6a, 0x7b, 0x9c, 0x21, - 0x33, 0x58, 0x61, 0xcc, 0x24, 0x53, 0x93, 0xe3, 0xf9, 0x40, 0x76, 0xeb, 0x03, 0x69, 0x0b, 0x15, 0x32, 0x87, 0x01, 0x3b, 0x56, 0x03, 0x65, 0xa6, 0x42, 0x22, 0xd7, 0xc6, 0x2b, 0xae, 0xa3, 0x96, - 0xc5, 0x52, 0x40, 0x09, 0xce, 0xf4, 0x75, 0x12, 0xdf, 0xe2, 0xbd, 0xaf, 0x1f, 0xd4, 0xba, 0x5f, 0x70, 0x3b, 0x62, 0x2c, 0x9c, 0x4f, 0x42, 0xd6, 0x47, 0x61, 0xfa, 0xce, 0x81, 0x9e, 0xa1, 0xf9, - 0xe7, 0xd6, 0xc1, 0x77, 0x9a, 0x57, 0x1c, 0xdf, 0xae, 0x2e, 0x08, 0xfe, 0x60, 0x1f, 0x84, 0x26, 0xb4, 0x2d, 0x6d, 0xa7, 0x78, 0x3e, 0x3b, 0xa8, 0x91, 0x57, 0x9a, 0xd6, 0x79, 0x79, 0x82, 0x00, - 0x3a, 0x35, 0x02, 0xd4, 0x95, 0xff, 0x30, 0x4a, 0xab, 0x0a, 0x92, 0x7e, 0x12, 0x15, 0xf5, 0x33, 0xbe, 0x06, 0x5e, 0x0a, 0x49, 0xfd, 0x71, 0xb7, 0xde, 0xa9, 0xbe, 0xf5, 0xeb, 0xfd, 0x72, 0x72, - 0x25, 0xf5, 0xf3, 0xdc, 0x30, 0xeb, 0xdd, 0x66, 0x68, 0x89, 0x2c, 0xcb, 0xfb, 0xb8, 0xe6, 0x90, 0xac, 0x82, 0xc0, 0x90, 0x39, 0x4f, 0x71, 0x61, 0xef, 0xe8, 0x3b, 0x33, 0xb0, 0x03, 0x7f, 0x2f, - 0xc8, 0xc0, 0x01, 0x2f, 0x53, 0x6f, 0x85, 0x2f, 0x93, 0xf9, 0xb0, 0x06, 0xf3, 0x8a, 0x56, 0x36, 0x4c, 0xed, 0xb7, 0x50, 0x87, 0xd8, 0xfd, 0xc1, 0x3b, 0xed, 0xa6, 0xac, 0xb4, 0xde, 0xe8, 0xa5, - 0xc4, 0xce, 0x20, 0xa0, 0x5f, 0x0c, 0xbb, 0x3f, 0xd1, 0xf0, 0x41, 0xa3, 0x16, 0x58, 0xfa, 0x5e, 0x49, 0xba, 0x30, 0x12, 0xef, 0x99, 0x84, 0x85, 0xbd, 0x94, 0xf1, 0xe6, 0x96, 0xf4, 0x1b, 0x84, - 0x37, 0x0d, 0x13, 0xec, 0xe7, 0x6c, 0x37, 0x17, 0xf3, 0x39, 0xc6, 0x13, 0xc1, 0x80, 0xab, 0x58, 0xbf, 0x2c, 0x20, 0xab, 0xb5, 0xbc, 0x46, 0xe8, 0x4c, 0x73, 0xd3, 0x12, 0xf2, 0x19, 0xf1, 0xb8, - 0x1e, 0xb3, 0x37, 0x76, 0xa5, 0xa3, 0x05, 0xdd, 0x38, 0xbb, 0xdc, 0x2f, 0xec, 0x2d, 0x0f, 0xec, 0x82, 0x29, 0xd3, 0xe1, 0x55, 0xcf, 0x82, 0x87, 0xa5, 0x09, 0xc0, 0xeb, 0x45, 0x9f, 0x38, 0x8b, - 0xfd, 0x36, 0x58, 0xe7, 0x05, 0x45, 0x2f, 0xc4, 0xc3, 0x79, 0x56, 0xbe, 0x2e, 0x12, 0x7f, 0x2d, 0x65, 0xff, 0x76, 0x58, 0x79, 0xcd, 0xd0, 0x32, 0x6a, 0x9d, 0xbe, 0x27, 0x66, 0x7f, 0x34, 0x22, - 0xc8, 0x4b, 0x69, 0xc0, 0x2e, 0x14, 0x2f, 0x03, 0x51, 0xbf, 0x57, 0x1f, 0x19, 0xc1, 0xe3, 0x94, 0x79, 0x37, 0x93, 0x7b, 0x4c, 0xda, 0x55, 0x9c, 0x78, 0xac, 0x36, 0x39, 0xb0, 0x07, 0x91, 0x69, - 0xc9, 0xd2, 0x85, 0xba, 0xd8, 0x31, 0x5d, 0x4b, 0x5b, 0x79, 0x2d, 0xf2, 0xb0, 0x85, 0x22, 0x3b, 0x07, 0x44, 0xa6, 0x64, 0xe9, 0x14, 0xa1, 0x30, 0xdf, 0x0c, 0x55, 0x78, 0x1c, 0xf0, 0xd5, 0x79, - 0xeb, 0x0c, 0x24, 0x3d, 0xf5, 0x23, 0xa7, 0xa7, 0x54, 0x69, 0xbe, 0xde, 0xb5, 0xad, 0x2e, 0xb7, 0xe4, 0xb3, 0xec, 0xce, 0x23, 0xf0, 0xff, 0x48, 0xec, 0x7a, 0x91, 0x00, 0x1f, 0x05, 0xfc, 0x3c, - 0xcc, 0x47, 0xff, 0x99, 0xe4, 0xfe, 0x23, 0x23, 0xfd, 0xa5, 0x61, 0x9c, 0xfd, 0xa5, 0x4e, 0xcc, 0xb4, 0x9b, 0x64, 0x45, 0x10, 0x07, 0x97, 0x8c, 0xf2, 0xcf, 0x95, 0x57, 0x7f, 0xbe, 0x46, 0xbe, - 0xd1, 0x9e, 0x4e, 0xbe, 0xb7, 0x8c, 0xc9, 0x09, 0xf5, 0x36, 0x4a, 0x95, 0x2e, 0x4f, 0x91, 0x43, 0xce, 0x22, 0x36, 0x85, 0x79, 0xd9, 0x12, 0x62, 0xab, 0x3e, 0xd8, 0xca, 0xc5, 0x72, 0x0e, 0x46, - 0x5d, 0xb2, 0x3e, 0xef, 0x57, 0x4c, 0x56, 0x6d, 0x89, 0x1c, 0x77, 0x5a, 0x5b, 0x9f, 0x95, 0x10, 0x2c, 0x14, 0x1c, 0xdd, 0x1e, 0x4c, 0x7f, 0xb3, 0x15, 0xab, 0x78, 0x7b, 0xb6, 0x21, 0x81, 0x56, - 0x0d, 0xe8, 0x70, 0xa4, 0x66, 0xc6, 0x0a, 0xa6, 0xa0, 0xe1, 0x3c, 0xd5, 0xb2, 0x7e, 0xa4, 0x9a, 0xea, 0xee, 0x30, 0xf0, 0x9f, 0xbb, 0xc3, 0x80, 0x6f, 0x94, 0x13, 0x33, 0xf0, 0x82, 0x8f, 0x58, - 0x2e, 0xe8, 0xbb, 0x3e, 0xe1, 0x71, 0x09, 0xe3, 0x2f, 0x2f, 0xb4, 0x7e, 0x60, 0xf9, 0x13, 0x33, 0xed, 0x1c, 0xfb, 0x66, 0x2c, 0xfe, 0xfe, 0x1f, 0xab, 0x5b, 0xfa, 0xb5, 0x3a, 0xc2, 0xe3, 0x9d, - 0xf4, 0x95, 0x2a, 0xff, 0x9f, 0x54, 0x2f, 0x73, 0xe1, 0xfd, 0xfa, 0xe2, 0x1e, 0x37, 0x22, 0x6d, 0xaa, 0xd2, 0x71, 0x87, 0x45, 0x51, 0x96, 0xf3, 0xfd, 0x4c, 0x12, 0xf9, 0x63, 0x7e, 0xc0, 0x96, - 0x71, 0x19, 0x9e, 0x8a, 0xb2, 0x41, 0xa9, 0x99, 0x0a, 0xc1, 0x5b, 0x94, 0x2a, 0xe6, 0x41, 0x60, 0xf4, 0x0d, 0x42, 0xf7, 0xfd, 0x1a, 0xd1, 0xa3, 0x8d, 0x87, 0xf7, 0x7d, 0x59, 0xd7, 0xa2, 0x66, - 0xeb, 0xe5, 0x69, 0x40, 0x24, 0xd6, 0x92, 0x3c, 0xd8, 0xb5, 0xa7, 0x53, 0x39, 0xb4, 0xd1, 0x05, 0x73, 0x82, 0xbe, 0x97, 0xcc, 0xfb, 0x79, 0x2f, 0xae, 0x8b, 0x60, 0x12, 0x96, 0x4f, 0x4f, 0xeb, - 0xaf, 0x6c, 0xc4, 0x57, 0x92, 0x6f, 0x90, 0x5c, 0x2e, 0x26, 0xe8, 0xb8, 0x3d, 0x98, 0x28, 0x58, 0xb9, 0xef, 0x11, 0x44, 0x80, 0x7a, 0x8b, 0x9c, 0x65, 0x02, 0x44, 0x53, 0xf1, 0xae, 0x6a, 0x55, - 0x08, 0x24, 0x57, 0x84, 0xb4, 0x71, 0x95, 0x48, 0x81, 0x34, 0x3b, 0x9d, 0x29, 0x11, 0x14, 0x04, 0x90, 0xe8, 0x30, 0x81, 0xe3, 0xf8, 0x20, 0xc3, 0xb8, 0xbc, 0xb3, 0x83, 0xdd, 0xbd, 0xca, 0xe2, - 0x03, 0x58, 0xce, 0x1c, 0x8b, 0x2d, 0x49, 0xb7, 0x58, 0xd4, 0xbb, 0x6d, 0x93, 0xd8, 0xf3, 0x91, 0x46, 0xca, 0x2f, 0x71, 0xe3, 0x1f, 0x89, 0x91, 0x46, 0xcc, 0xa9, 0x2a, 0x78, 0xe6, 0xe9, 0x02, - 0xfe, 0x03, 0xbd, 0x62, 0x5d, 0x7b, 0xa3, 0xf8, 0x86, 0x5b, 0x15, 0x44, 0x93, 0x2b, 0x89, 0x9f, 0x61, 0x33, 0x3b, 0x9d, 0xcc, 0x2b, 0x31, 0x5a, 0xcb, 0x8a, 0xc8, 0xf5, 0xa4, 0x60, 0x90, 0xaa, - 0x77, 0x86, 0xa0, 0xb3, 0x58, 0x46, 0x59, 0xad, 0xb7, 0x46, 0xb7, 0xf0, 0xd0, 0xf2, 0xb0, 0xa1, 0x43, 0x7c, 0xb5, 0xab, 0x2d, 0xda, 0x30, 0xe1, 0x6d, 0x97, 0x30, 0x6d, 0x7f, 0x90, 0x16, 0x19, - 0xb3, 0xaf, 0x58, 0x68, 0x1f, 0xa6, 0x42, 0xa0, 0x08, 0x38, 0x1d, 0xc8, 0x7b, 0x5d, 0x33, 0xc5, 0x82, 0x03, 0xc4, 0x91, 0xcc, 0xe4, 0xab, 0x0e, 0xe0, 0xa2, 0x76, 0xbc, 0xd5, 0x10, 0x94, 0x13, - 0xa3, 0xf0, 0xea, 0xd8, 0xf9, 0xca, 0x48, 0xbe, 0x6b, 0x09, 0x3c, 0x27, 0x71, 0x0a, 0xa3, 0x4a, 0x8b, 0xc9, 0x07, 0x67, 0xfa, 0x7c, 0x95, 0xf8, 0xf6, 0xea, 0x6d, 0xe5, 0xf1, 0x07, 0x26, 0xb7, - 0x5b, 0xf7, 0xea, 0xbf, 0xff, 0x83, 0x7d, 0xd7, 0x93, 0x5c, 0xf9, 0xd2, 0x23, 0x3a, 0x63, 0xc4, 0xaf, 0xba, 0x0e, 0x9e, 0x19, 0xbe, 0x66, 0xff, 0x20, 0x2f, 0x9c, 0x0c, 0xdf, 0x08, 0xbe, 0x0d, - 0x77, 0x1d, 0xd8, 0x93, 0x0b, 0x85, 0x9f, 0x47, 0x1b, 0x38, 0x68, 0x25, 0x2c, 0x38, 0x7b, 0xa5, 0x07, 0xd6, 0xca, 0x8a, 0x5b, 0xc6, 0x64, 0x97, 0x24, 0x38, 0xb3, 0xa0, 0x33, 0x30, 0x22, 0x84, - 0x39, 0x4d, 0xc4, 0xd1, 0x6c, 0xd8, 0xc9, 0xf1, 0x16, 0x20, 0x11, 0x01, 0x3b, 0xac, 0xc0, 0x43, 0x6a, 0x2d, 0x8b, 0xa4, 0x3d, 0x4b, 0x67, 0xf5, 0xb4, 0x3a, 0x04, 0x2a, 0x32, 0x75, 0xb3, 0x05, - 0x6e, 0xb8, 0xe2, 0x8c, 0xf6, 0xcd, 0xa9, 0x37, 0x10, 0x47, 0xc2, 0xb9, 0x59, 0x24, 0x77, 0x5b, 0xf2, 0x7b, 0xb7, 0xff, 0xb6, 0x83, 0xb2, 0x9a, 0xbe, 0x6d, 0xc9, 0x97, 0x86, 0x9f, 0xe1, 0x7a, - 0xb6, 0x09, 0x3c, 0xdb, 0x90, 0xff, 0x1c, 0xbf, 0x87, 0x5f, 0x98, 0x4e, 0x1e, 0xb7, 0x8f, 0xad, 0xf1, 0x6d, 0xb6, 0xba, 0xdd, 0x80, 0x14, 0xbb, 0xcb, 0xb2, 0x68, 0xa5, 0xc1, 0xac, 0x7e, 0x54, - 0x71, 0xa9, 0xe9, 0xeb, 0x03, 0x91, 0x86, 0x61, 0x41, 0x44, 0xed, 0xd9, 0xc3, 0xe3, 0x08, 0x2c, 0xd2, 0x4d, 0x4f, 0x6a, 0x4e, 0x2d, 0x16, 0xc4, 0x56, 0x44, 0x08, 0x38, 0x8f, 0x0e, 0x0a, 0x34, - 0x93, 0x05, 0x6d, 0xf0, 0x34, 0x96, 0x1c, 0x82, 0xb5, 0xe5, 0x14, 0x4a, 0xae, 0x73, 0xf1, 0x32, 0x21, 0x4f, 0x87, 0x91, 0x6c, 0x28, 0xf8, 0xd8, 0x78, 0x1f, 0xef, 0xbb, 0x6f, 0x8f, 0xd3, 0x34, - 0x72, 0x8c, 0x64, 0x72, 0x55, 0xda, 0x7c, 0x4e, 0x5f, 0xf0, 0xdb, 0x6b, 0x57, 0xa9, 0xf7, 0xf6, 0xad, 0xfb, 0xb5, 0xf7, 0x19, 0x02, 0xf8, 0xf7, 0x7d, 0x7d, 0xfa, 0xe0, 0x63, 0x8b, 0xff, 0x7c, - 0xfc, 0x3f, 0x61, 0xa7, 0x7a, 0xb4, 0x60, 0x1f, 0xcf, 0x1f, 0xe8, 0x05, 0x57, 0xb3, 0x3b, 0xea, 0x9f, 0x73, 0xe7, 0x4b, 0xdb, 0x25, 0x01, 0xca, 0x08, 0x07, 0xb3, 0x26, 0xec, 0x8c, 0x39, 0x9a, - 0xb8, 0x74, 0xde, 0xb2, 0x1b, 0xb0, 0x2d, 0x89, 0x56, 0xcf, 0xba, 0x4d, 0x64, 0x3b, 0x90, 0x5a, 0xec, 0x54, 0xac, 0x9e, 0x83, 0x7a, 0x98, 0xb9, 0xa5, 0xef, 0xc5, 0x46, 0xb6, 0xdd, 0xd3, 0x44, - 0xb8, 0x55, 0x7c, 0x7d, 0x03, 0xf4, 0x52, 0xba, 0x95, 0x72, 0x63, 0x35, 0xef, 0x57, 0xa0, 0x73, 0x98, 0x5b, 0x5a, 0x67, 0x86, 0xf1, 0x62, 0x48, 0x8f, 0x3c, 0xb1, 0x70, 0x97, 0x23, 0xf9, 0xb0, - 0xd1, 0x18, 0x41, 0x74, 0xf1, 0x20, 0xff, 0xf2, 0xc3, 0xcb, 0xc7, 0x03, 0xfb, 0x83, 0x9d, 0xf2, 0xa1, 0xdb, 0xc2, 0x0d, 0x01, 0x37, 0x2d, 0x3e, 0x74, 0xcd, 0xff, 0x81, 0xbf, 0x53, 0x7f, 0x13, - 0x0d, 0xab, 0xf4, 0x3a, 0xb1, 0x2a, 0xe3, 0xd7, 0xdc, 0xfa, 0x3e, 0x41, 0x1f, 0xf1, 0xe0, 0x3f, 0xad, 0x49, 0xf8, 0x3f, 0xe6, 0x15, 0xf1, 0x99, 0x0c, 0xf8, 0x5f, 0x64, 0x65, 0x17, 0x92, 0x6f, - 0xf3, 0xef, 0x72, 0x31, 0x86, 0x59, 0x41, 0x93, 0x4a, 0x14, 0xc8, 0x70, 0x20, 0xe6, 0x79, 0xa8, 0x76, 0x87, 0xb3, 0xb6, 0x6a, 0x28, 0x50, 0x38, 0xd4, 0x7b, 0xb6, 0xca, 0x1e, 0x67, 0x97, 0x7d, - 0xde, 0xa3, 0x8f, 0x1a, 0xd4, 0x8f, 0x85, 0xc0, 0x57, 0x3a, 0x74, 0xa1, 0x38, 0x9d, 0x5c, 0xff, 0x5e, 0xd2, 0x82, 0x8c, 0xe0, 0xbd, 0x3b, 0x56, 0x93, 0xa1, 0x80, 0x52, 0xb7, 0xaa, 0xec, 0x51, - 0x6a, 0x42, 0xca, 0xc7, 0x30, 0xa8, 0x81, 0xbd, 0xe2, 0xf7, 0xb2, 0xca, 0x94, 0x8d, 0x9b, 0x11, 0xb1, 0x55, 0x6b, 0x31, 0x69, 0x8b, 0x32, 0xcb, 0x82, 0xd3, 0x45, 0x58, 0x15, 0x72, 0xbb, 0xa2, - 0x3a, 0x7a, 0x06, 0x4f, 0xe3, 0x85, 0x62, 0x56, 0xbb, 0x72, 0x1d, 0xae, 0x36, 0x86, 0x0d, 0xb6, 0x9b, 0x32, 0xb5, 0xd1, 0xa1, 0x90, 0xa8, 0xe5, 0x9f, 0x44, 0x03, 0x8e, 0x4b, 0x1f, 0xff, 0xab, - 0xe0, 0xf4, 0x33, 0xbc, 0xfe, 0xfc, 0xb8, 0xff, 0x4e, 0x73, 0x3a, 0xf9, 0xb8, 0xba, 0x60, 0x36, 0xe2, 0xc8, 0x8f, 0xb4, 0xf6, 0x3a, 0xb0, 0xf5, 0x3e, 0xc7, 0xf8, 0x39, 0x38, 0x43, 0xd5, 0xdd, - 0x52, 0xc4, 0xa4, 0x8c, 0x13, 0x8f, 0x14, 0xd2, 0x86, 0x2a, 0x15, 0x6d, 0x94, 0xbd, 0x5f, 0xc7, 0xf0, 0xf9, 0x68, 0x35, 0x53, 0x14, 0x12, 0x13, 0xd8, 0x89, 0x05, 0xd0, 0xee, 0x2d, 0x41, 0x41, - 0x6b, 0x5d, 0xdd, 0x39, 0x61, 0xcb, 0x36, 0x1e, 0xbe, 0x2c, 0x1b, 0xd3, 0x8e, 0x4e, 0x3b, 0x60, 0xa5, 0x2d, 0xad, 0x8a, 0xf8, 0x15, 0xc6, 0xf6, 0xbf, 0xde, 0x31, 0x78, 0xcc, 0x7d, 0xfe, 0xfe, - 0xbf, 0x5c, 0xa3, 0xac, 0x02, 0xb7, 0x9f, 0x1a, 0x61, 0x33, 0xb1, 0xd2, 0x38, 0x0b, 0xa2, 0xa7, 0x8e, 0xa4, 0xc8, 0x4b, 0xe5, 0x85, 0x1e, 0x7e, 0x61, 0x3a, 0xb9, 0xb9, 0x9d, 0x20, 0xe3, 0x6a, - 0x0c, 0x39, 0xa6, 0xb9, 0xac, 0xa2, 0x0d, 0x61, 0x77, 0xea, 0x0a, 0x1b, 0x82, 0x83, 0x5d, 0x80, 0x58, 0xcc, 0x69, 0xb3, 0x43, 0x42, 0x07, 0xfc, 0x1c, 0x52, 0x1b, 0x2a, 0xda, 0x31, 0x56, 0x75, - 0xac, 0xa6, 0x47, 0x0b, 0x58, 0x20, 0xbb, 0x05, 0x77, 0x52, 0xb0, 0x20, 0x96, 0x4f, 0x2a, 0x10, 0xfb, 0x8d, 0xec, 0x27, 0x87, 0x21, 0xe6, 0xe7, 0x8c, 0xd3, 0xca, 0x67, 0x6e, 0xe5, 0xad, 0xa3, - 0x45, 0xe7, 0xd9, 0xd4, 0xcd, 0x91, 0xeb, 0x5d, 0xc7, 0xfb, 0x9d, 0x3f, 0x87, 0x97, 0x5a, 0x38, 0xff, 0x99, 0xdd, 0xd9, 0xd2, 0xdf, 0x7a, 0x71, 0x4d, 0xa2, 0xf3, 0x21, 0x44, 0x7f, 0x37, 0xfd, - 0x1b, 0x65, 0x35, 0xa9, 0x8b, 0xe0, 0x93, 0xdd, 0x3e, 0x39, 0x99, 0x7c, 0xc2, 0x64, 0x3b, 0x4e, 0x16, 0x3b, 0xc5, 0x53, 0xfd, 0xe0, 0x6b, 0xf1, 0x95, 0xf7, 0xe4, 0x2f, 0x85, 0xee, 0xde, 0xaf, - 0xc7, 0x86, 0x5c, 0x6e, 0x67, 0x12, 0x27, 0xce, 0x73, 0x44, 0x4c, 0x75, 0x93, 0xf6, 0xf7, 0x24, 0x70, 0x9c, 0xd6, 0x04, 0xe1, 0xf3, 0x24, 0xe2, 0x0d, 0xd3, 0xc2, 0x08, 0x45, 0x0a, 0x60, 0xe1, - 0xf3, 0xba, 0x0f, 0x42, 0x3e, 0xe3, 0x8e, 0xbc, 0x22, 0xab, 0x8c, 0x9c, 0x49, 0x46, 0xe4, 0xa4, 0x21, 0x40, 0xc2, 0x54, 0x09, 0x8a, 0x64, 0xcd, 0x1f, 0x79, 0x82, 0x0b, 0x66, 0x9b, 0x7c, 0xef, - 0x82, 0x35, 0x50, 0xa4, 0xf8, 0x5d, 0xc8, 0xe5, 0xe7, 0x6f, 0x75, 0x8a, 0xe2, 0x69, 0xad, 0x2b, 0xe4, 0x25, 0x07, 0xd2, 0x5b, 0xd2, 0xd3, 0xc9, 0xf5, 0xef, 0xa5, 0xd6, 0xdf, 0x88, 0xee, 0xb3, - 0x94, 0x6b, 0xed, 0x0c, 0x60, 0x91, 0x9c, 0x93, 0xf6, 0x14, 0x60, 0xae, 0x92, 0x7a, 0xc5, 0x4e, 0xf5, 0x02, 0x7b, 0x17, 0x58, 0xc0, 0x5a, 0x4d, 0x76, 0x61, 0x10, 0xaa, 0x76, 0x16, 0xcd, 0xb2, - 0xe6, 0xdc, 0x98, 0xaa, 0x8c, 0xcd, 0xd7, 0x06, 0x42, 0x04, 0x3a, 0x47, 0xae, 0xd6, 0x4d, 0xe9, 0x93, 0xfa, 0x0e, 0xed, 0x81, 0x74, 0x15, 0x60, 0x96, 0xc9, 0xcc, 0x63, 0x4c, 0xe6, 0xd6, 0x80, - 0x1d, 0xdf, 0x45, 0x65, 0x7c, 0xfe, 0xc6, 0xcb, 0xd4, 0xb9, 0x84, 0x40, 0xfd, 0x8a, 0x2b, 0xfb, 0x61, 0x89, 0xbe, 0xe6, 0x56, 0x3b, 0xea, 0x8b, 0xd3, 0xc9, 0x6f, 0x1f, 0x8f, 0xf5, 0xc5, 0xed, - 0x33, 0xbd, 0x4f, 0x8e, 0x8d, 0x4a, 0x21, 0x76, 0x60, 0xba, 0x7c, 0x7f, 0x16, 0x0e, 0xc8, 0x71, 0x8e, 0xb5, 0x73, 0x7b, 0x29, 0x7b, 0xe2, 0xda, 0x4b, 0xfa, 0x99, 0x60, 0xe1, 0x67, 0x08, 0x47, - 0x5a, 0x8d, 0xdf, 0xd1, 0x68, 0xbc, 0x5c, 0x2f, 0xe9, 0x33, 0xb5, 0xc8, 0x00, 0x10, 0xd4, 0xe2, 0xfc, 0xbc, 0x6e, 0x36, 0xf1, 0x8c, 0x9e, 0x76, 0x5a, 0xca, 0x18, 0x61, 0xdb, 0x2f, 0x6d, 0x85, - 0x9e, 0xde, 0x1e, 0x80, 0x1e, 0x2f, 0xe1, 0x07, 0xbf, 0xfd, 0xef, 0xeb, 0x19, 0xf3, 0xe9, 0x92, 0xfc, 0x2c, 0x82, 0xf5, 0x4c, 0x62, 0xfd, 0x73, 0xd5, 0xca, 0x95, 0xe4, 0x1b, 0xf7, 0xbb, 0x5c, - 0x8c, 0xad, 0xcb, 0x92, 0x24, 0x0e, 0x39, 0xdd, 0x04, 0xc2, 0xd4, 0x1f, 0x36, 0xbe, 0x86, 0x67, 0x36, 0x9d, 0x98, 0xf3, 0x6a, 0x20, 0xe8, 0x90, 0x97, 0xd8, 0x42, 0x03, 0x41, 0x7e, 0x3a, 0x34, - 0xbc, 0x18, 0x63, 0x19, 0xb7, 0x3a, 0x47, 0x78, 0x57, 0xaf, 0x8b, 0x75, 0xa2, 0x26, 0xd3, 0x53, 0x25, 0x1d, 0x0e, 0xee, 0xa1, 0xa2, 0x5c, 0x9d, 0x9c, 0x42, 0xc7, 0xca, 0xf1, 0xcf, 0xe5, 0x20, - 0x93, 0xb9, 0x25, 0x05, 0x01, 0x38, 0xa6, 0x12, 0xf2, 0x83, 0x9c, 0x52, 0x8f, 0x17, 0xe3, 0x2b, 0x5b, 0xe6, 0x77, 0xe2, 0x17, 0x58, 0x6e, 0x9b, 0xc6, 0x56, 0xde, 0xf2, 0x67, 0x91, 0x30, 0xab, - 0x0c, 0x4b, 0xd7, 0x92, 0x23, 0xd2, 0x1c, 0x04, 0xc9, 0x0b, 0xcc, 0x10, 0xa8, 0x38, 0x9a, 0xd9, 0x60, 0x53, 0x20, 0x02, 0x71, 0xaa, 0x86, 0x79, 0xab, 0x08, 0x9a, 0xe9, 0x3a, 0x76, 0x2a, 0xd0, - 0x31, 0x42, 0x54, 0x6a, 0x15, 0x06, 0x85, 0x4a, 0x8e, 0x6c, 0x13, 0x86, 0x0e, 0x84, 0x72, 0x19, 0x42, 0x64, 0x0e, 0xda, 0xc5, 0x60, 0x2b, 0xb6, 0x43, 0x31, 0x55, 0x3b, 0x66, 0x56, 0x5d, 0x32, - 0x66, 0x4d, 0x2a, 0xa3, 0xf0, 0x9c, 0x6a, 0x52, 0xfa, 0x57, 0x3f, 0x84, 0xdf, 0xcf, 0xa9, 0xf7, 0x04, 0xcd, 0x51, 0xea, 0x79, 0xbf, 0xcf, 0xdf, 0xf2, 0xca, 0xec, 0xba, 0x25, 0x7e, 0x01, 0xf4, - 0xb6, 0xe9, 0x5a, 0x64, 0xf8, 0x67, 0x40, 0xe1, 0x79, 0x78, 0x94, 0xf4, 0x4e, 0xe2, 0x1b, 0xdf, 0xe1, 0x9a, 0xb5, 0x39, 0x2f, 0xa3, 0x95, 0xa8, 0x71, 0xf2, 0xb9, 0x00, 0xc4, 0x90, 0xaf, 0xb8, - 0xa4, 0xd8, 0xf1, 0x08, 0xe2, 0x02, 0xa7, 0x8d, 0xb2, 0x1b, 0x9c, 0x41, 0xc8, 0x74, 0x2b, 0x3f, 0x79, 0x44, 0x68, 0x20, 0x3b, 0xd4, 0x9e, 0xab, 0xf1, 0x30, 0x78, 0xad, 0x04, 0x18, 0x20, 0x4c, - 0x86, 0xc7, 0x0e, 0xe3, 0x17, 0x01, 0xb2, 0xad, 0x83, 0x3b, 0x4e, 0x7f, 0xdd, 0x57, 0x1f, 0x2b, 0x64, 0x5e, 0x4a, 0x0e, 0x6f, 0x84, 0xcd, 0xbb, 0x68, 0x31, 0x36, 0x35, 0x7c, 0xbb, 0xf6, 0xb2, - 0xc2, 0x5e, 0x34, 0x7b, 0x23, 0x5a, 0x80, 0xf3, 0xa1, 0x52, 0x9b, 0xa0, 0xa2, 0x61, 0x7f, 0x01, 0xa2, 0x9a, 0xeb, 0x52, 0x4d, 0x55, 0xca, 0x09, 0x89, 0x6c, 0xcd, 0xb5, 0xaa, 0xed, 0xa8, 0x6a, - 0x21, 0x73, 0x68, 0x67, 0x43, 0x44, 0xbc, 0x58, 0xe8, 0x42, 0x27, 0x73, 0x9b, 0x2a, 0x98, 0xb7, 0x7a, 0xb3, 0x15, 0x2d, 0x25, 0x9d, 0x1d, 0x36, 0x8d, 0xb0, 0x17, 0x08, 0xa8, 0xb0, 0xb3, 0x11, - 0x33, 0xe7, 0xc2, 0x8f, 0x6e, 0x7d, 0x8a, 0xee, 0x13, 0xbf, 0x5f, 0xf9, 0x95, 0xe5, 0x3b, 0xb1, 0x31, 0xa9, 0x0a, 0xe3, 0x0d, 0x9f, 0x5f, 0x6a, 0xf8, 0x6f, 0x1e, 0x33, 0x8f, 0x52, 0x03, 0x5d, - 0x25, 0x8e, 0x9b, 0xf3, 0xe1, 0xa7, 0xbe, 0xf8, 0xef, 0xff, 0xa0, 0x97, 0x14, 0x21, 0x8f, 0xa7, 0xe9, 0x8d, 0x58, 0xf3, 0x78, 0x86, 0xbe, 0xc4, 0xff, 0x7e, 0xd1, 0x7d, 0x1f, 0xa7, 0xf7, 0xbb, - 0xb1, 0x09, 0x39, 0x95, 0x0e, 0x64, 0x3b, 0x0c, 0xf6, 0xbb, 0x25, 0xb1, 0x80, 0x66, 0xfe, 0x79, 0xbf, 0xf4, 0x3c, 0x2d, 0x5a, 0x06, 0x6e, 0xae, 0xe8, 0x95, 0x66, 0x1c, 0xbd, 0xb4, 0xde, 0xa6, - 0x05, 0xa0, 0xec, 0x6d, 0x3e, 0x11, 0xfa, 0x25, 0x0b, 0x21, 0x8d, 0xb7, 0x54, 0xfa, 0xd3, 0xa1, 0xce, 0x08, 0x31, 0x75, 0x9c, 0x74, 0xb7, 0x2f, 0x0b, 0xf4, 0xec, 0x62, 0x3e, 0x6e, 0x73, 0x0a, - 0x04, 0x6d, 0x20, 0x6c, 0x2f, 0xff, 0x91, 0x04, 0xf8, 0x7c, 0x69, 0x27, 0xfd, 0xef, 0xaa, 0x51, 0x20, 0x2f, 0x39, 0x9f, 0x7c, 0x10, 0x7d, 0x43, 0xeb, 0xfd, 0xf2, 0x62, 0x4b, 0x1c, 0x71, 0x18, - 0xe3, 0x51, 0xc4, 0xe1, 0x5d, 0x8e, 0xda, 0xd4, 0xd9, 0xd9, 0xab, 0x19, 0xb9, 0xb7, 0x0a, 0x0b, 0xcd, 0xb7, 0xe4, 0x79, 0x98, 0xe9, 0x41, 0xcd, 0xc9, 0x41, 0x68, 0x2c, 0xa5, 0x56, 0x25, 0x24, - 0xa6, 0x02, 0xb5, 0xe9, 0xfa, 0xc0, 0x12, 0x0d, 0x68, 0x18, 0xb3, 0x42, 0x9b, 0x41, 0x78, 0xa7, 0x84, 0x3a, 0x51, 0x6c, 0x6d, 0x0a, 0x53, 0xed, 0xbd, 0x95, 0x9d, 0x56, 0x12, 0xbb, 0xcf, 0x81, - 0x63, 0xa3, 0x78, 0x3f, 0xd8, 0x12, 0x1f, 0xa3, 0x77, 0x57, 0xba, 0xf1, 0x41, 0x62, 0xc2, 0xef, 0xc9, 0xeb, 0x9e, 0x1e, 0xe5, 0x8c, 0xc2, 0xf2, 0x7f, 0x77, 0x78, 0x7f, 0x81, 0x6b, 0xbc, 0x51, - 0x7c, 0x43, 0xf8, 0xed, 0xef, 0xd8, 0x84, 0xf9, 0xaa, 0x07, 0x90, 0xc7, 0x76, 0xe1, 0x4d, 0xc1, 0x0c, 0x81, 0x2b, 0x87, 0xb5, 0xd7, 0x7b, 0x5e, 0xe2, 0x93, 0x93, 0xca, 0xd2, 0x60, 0x8b, 0xd0, - 0x2e, 0x93, 0xac, 0x24, 0x37, 0xb0, 0xd2, 0xa1, 0xa4, 0xbc, 0xb2, 0xc9, 0x61, 0xd5, 0x49, 0xf8, 0x6d, 0x3e, 0xdd, 0x6b, 0xd9, 0x30, 0x08, 0xd3, 0x66, 0x36, 0x14, 0x5c, 0xbf, 0x4d, 0x70, 0xba, - 0x44, 0xc8, 0x13, 0x85, 0x6e, 0x37, 0x74, 0xbb, 0x72, 0xf3, 0xbb, 0x48, 0x73, 0xa3, 0xf0, 0x7e, 0x1f, 0x71, 0xff, 0xd2, 0x3e, 0xf1, 0x4e, 0xf4, 0xd2, 0x65, 0xef, 0x23, 0xbe, 0x7e, 0xd4, 0xbe, - 0x30, 0x03, 0x48, 0x25, 0x77, 0x4c, 0x73, 0x35, 0x64, 0x2a, 0xc9, 0x1d, 0x01, 0xc5, 0xc0, 0x39, 0x98, 0x34, 0xca, 0x4d, 0xea, 0x39, 0xc7, 0xfd, 0x60, 0xad, 0x2b, 0x6a, 0x73, 0xb0, 0xb3, 0x3d, - 0xc3, 0xf4, 0x94, 0x07, 0x81, 0x2e, 0x88, 0x19, 0xe2, 0xea, 0x34, 0x37, 0xad, 0x65, 0xbe, 0x76, 0xa7, 0xbc, 0xda, 0x42, 0xcb, 0x90, 0xd2, 0x81, 0x1c, 0x9e, 0x9a, 0xcb, 0xb9, 0x87, 0xd0, 0x4d, - 0x5d, 0xb0, 0xf7, 0xd5, 0xf7, 0x8d, 0xd2, 0x78, 0x96, 0xe3, 0x11, 0xbe, 0xe4, 0x9e, 0xfa, 0xe3, 0x1e, 0x97, 0x46, 0xf6, 0xd6, 0xdb, 0xd2, 0xc8, 0x2e, 0x3d, 0xc5, 0x7f, 0xee, 0xe9, 0x5c, 0x64, - 0x14, 0x8f, 0x16, 0xa9, 0x80, 0x2d, 0x31, 0x30, 0x85, 0x8f, 0xce, 0x2c, 0xcb, 0x9a, 0x0c, 0x29, 0x9d, 0x13, 0xa3, 0x8a, 0xc7, 0x3d, 0x8a, 0x5a, 0xb6, 0x58, 0x4a, 0xe4, 0xca, 0x3d, 0x2c, 0x65, - 0x59, 0xdf, 0x71, 0x6b, 0xe5, 0xb4, 0x28, 0x03, 0xc5, 0x38, 0xf2, 0xca, 0x1e, 0xd2, 0x93, 0x04, 0x88, 0x73, 0x1d, 0xe2, 0xdc, 0x93, 0x8e, 0x0c, 0x08, 0xad, 0x2c, 0x07, 0x31, 0x23, 0xfc, 0xe3, - 0x18, 0xf3, 0x9e, 0x51, 0xf6, 0x89, 0x75, 0x0e, 0x9e, 0x3b, 0xb1, 0xbd, 0x52, 0x83, 0xeb, 0x83, 0xe8, 0x05, 0x84, 0xeb, 0xe5, 0x04, 0xfc, 0xb9, 0x16, 0xd7, 0x1b, 0x10, 0x9c, 0x13, 0x90, 0x1c, - 0x83, 0x56, 0x47, 0x1f, 0xd4, 0x72, 0x19, 0x59, 0x77, 0xbe, 0x4a, 0x90, 0xf6, 0x7e, 0x1a, 0xb7, 0x27, 0xaf, 0x31, 0xf5, 0xad, 0x21, 0x1e, 0x8c, 0xe3, 0x19, 0x30, 0x4b, 0xff, 0x1c, 0x82, 0x22, - 0x66, 0xb9, 0x8c, 0xe5, 0x69, 0xc6, 0xb9, 0x70, 0xe6, 0x61, 0xc1, 0xb4, 0x46, 0xa5, 0xb2, 0xe6, 0x00, 0x6c, 0xd2, 0x8d, 0xad, 0xed, 0xba, 0x82, 0x0d, 0x62, 0x78, 0x1f, 0x2a, 0xe3, 0x84, 0xcf, - 0xdb, 0xc8, 0xc3, 0x7f, 0x71, 0xbd, 0x7f, 0x21, 0xfc, 0x06, 0xc8, 0x97, 0xdb, 0xb1, 0xab, 0xff, 0x7c, 0xe0, 0x42, 0x3a, 0xa7, 0x7c, 0x22, 0xeb, 0x40, 0x55, 0x39, 0x6c, 0x00, 0x54, 0x30, 0x87, - 0x34, 0x38, 0x4e, 0x13, 0xe9, 0xcc, 0x50, 0xca, 0xa1, 0xb6, 0xe1, 0xba, 0x49, 0xb6, 0x79, 0x4d, 0x43, 0xd3, 0x0e, 0x33, 0x88, 0xa5, 0xa0, 0xef, 0xb7, 0x12, 0x48, 0x59, 0x43, 0xce, 0x82, 0x42, - 0x82, 0x13, 0xa9, 0x36, 0x95, 0x24, 0x01, 0xda, 0x99, 0x32, 0x6b, 0x84, 0x7a, 0x96, 0x21, 0x1b, 0xb2, 0xba, 0x5f, 0x07, 0xcf, 0xf4, 0xc2, 0xcf, 0xb0, 0xf8, 0x73, 0x13, 0xf8, 0xe3, 0x4f, 0xbc, - 0xa1, 0xf2, 0xf0, 0xc1, 0x05, 0x9f, 0x11, 0xc6, 0x71, 0x7a, 0x4f, 0x83, 0x6c, 0x70, 0x40, 0x71, 0x27, 0xc8, 0x9c, 0x21, 0x10, 0x25, 0x68, 0xc7, 0xf3, 0x53, 0x51, 0x72, 0x69, 0x19, 0x2c, 0x6b, - 0x77, 0x23, 0xaa, 0x71, 0x28, 0x7a, 0xcd, 0xa9, 0x4c, 0x65, 0xb8, 0xca, 0x3b, 0xab, 0x12, 0x1c, 0x4a, 0x74, 0x42, 0xc5, 0x72, 0x0f, 0x55, 0xa7, 0xb1, 0xf9, 0x52, 0xda, 0x43, 0x72, 0x27, 0xcc, - 0xca, 0x0c, 0xe6, 0x0a, 0x71, 0xae, 0x64, 0x8c, 0x86, 0x97, 0xf7, 0xdc, 0xb1, 0x69, 0x82, 0xe7, 0xe5, 0x85, 0x5e, 0xc9, 0xc4, 0x74, 0xa1, 0x78, 0xe9, 0x7d, 0x13, 0xa4, 0x93, 0xd9, 0xb8, 0xec, - 0x4b, 0x12, 0x15, 0xed, 0xb5, 0x86, 0xab, 0xdb, 0x75, 0xbf, 0x63, 0x11, 0xde, 0x9d, 0x9b, 0x98, 0xc2, 0xce, 0x55, 0x3d, 0x56, 0x07, 0xd8, 0x3d, 0x2d, 0xbc, 0x06, 0x46, 0x6c, 0x7c, 0xd0, 0x57, - 0x76, 0xe4, 0x4c, 0x73, 0xc4, 0xe3, 0xc3, 0xb8, 0x9b, 0x1b, 0x4e, 0xbd, 0x00, 0x33, 0x0d, 0xa4, 0x87, 0x12, 0xe3, 0x95, 0xbd, 0xe8, 0xb9, 0x79, 0xbe, 0xd4, 0xcf, 0x45, 0xef, 0x40, 0xe4, 0x3a, - 0xa2, 0x25, 0xaf, 0x1d, 0x21, 0x94, 0xbc, 0xef, 0x84, 0x0f, 0xe4, 0xc1, 0xaf, 0x51, 0x2b, 0xdf, 0xa3, 0x4d, 0x8c, 0xb2, 0xca, 0xdf, 0xff, 0x0b, 0xff, 0xe7, 0x49, 0x39, 0x3c, 0xd3, 0x88, 0x8c, - 0xc4, 0x72, 0xec, 0xc9, 0xef, 0x44, 0x9a, 0xd7, 0x54, 0xe5, 0xb7, 0xa4, 0xa7, 0x93, 0x6f, 0x0d, 0x63, 0x54, 0xe7, 0x17, 0xbd, 0x69, 0x2a, 0x3a, 0x32, 0x07, 0x4a, 0xfb, 0x13, 0x4e, 0xf8, 0x07, - 0x88, 0x8a, 0x4d, 0xb5, 0x64, 0xd1, 0xde, 0xc8, 0x65, 0xa2, 0x0a, 0x03, 0x26, 0x32, 0xbb, 0x23, 0xad, 0x73, 0x19, 0x03, 0xb2, 0x0a, 0x09, 0x2c, 0x1c, 0x15, 0x35, 0x8f, 0x94, 0xa1, 0x82, 0x54, - 0xd2, 0x55, 0x60, 0xd5, 0xc1, 0xfb, 0x22, 0x3b, 0x66, 0x4a, 0x2b, 0x18, 0x7c, 0xbb, 0x89, 0x36, 0xe2, 0x72, 0xeb, 0x6b, 0x32, 0xc6, 0x8f, 0x49, 0x58, 0x6f, 0x1a, 0xa5, 0x83, 0xa3, 0xcf, 0x9d, - 0x2e, 0xa0, 0x7f, 0xb0, 0x17, 0x26, 0xde, 0x27, 0xd5, 0x0b, 0x20, 0xef, 0xd7, 0x93, 0x0b, 0xad, 0x9f, 0xb1, 0xa0, 0xd8, 0xcc, 0xd0, 0x22, 0x26, 0x99, 0x55, 0xa8, 0x78, 0x32, 0x39, 0x66, 0xd1, - 0x03, 0x26, 0x06, 0xb0, 0xac, 0xd7, 0x1c, 0xd1, 0xa6, 0x28, 0xe9, 0x59, 0x63, 0x36, 0x85, 0x19, 0x08, 0xdb, 0xac, 0x24, 0x5c, 0x96, 0x96, 0xce, 0xe1, 0x99, 0x2e, 0x7a, 0x3c, 0x0c, 0xc0, 0x42, - 0xde, 0x86, 0x0b, 0xf0, 0x3c, 0x98, 0x07, 0x87, 0xdf, 0xb5, 0x43, 0x97, 0xcf, 0x82, 0x3e, 0x4b, 0x51, 0x28, 0x77, 0x94, 0xbb, 0xd3, 0x9a, 0x19, 0x24, 0x46, 0xd1, 0x4f, 0x9c, 0xae, 0x72, 0x92, - 0xb7, 0xce, 0x3e, 0x3f, 0x1a, 0xbc, 0xa2, 0x84, 0xba, 0xa3, 0xfe, 0x06, 0xc4, 0xf7, 0xb6, 0xb1, 0x25, 0x4f, 0x42, 0xda, 0xaa, 0xb6, 0xd3, 0xcd, 0x49, 0x30, 0xf5, 0x74, 0xdb, 0x9f, 0x53, 0x87, - 0x31, 0x7d, 0x35, 0xe3, 0xa2, 0xc3, 0x3c, 0x5f, 0x1f, 0xac, 0x56, 0xdd, 0xb2, 0xdb, 0xd4, 0x43, 0xe1, 0x25, 0xc6, 0xd0, 0xbc, 0xdc, 0x0a, 0x92, 0x68, 0x87, 0x0b, 0xc6, 0x0e, 0xfc, 0x30, 0x04, - 0xe9, 0x28, 0xf1, 0x1d, 0x81, 0x30, 0x23, 0x53, 0xc2, 0x6d, 0x86, 0x33, 0xdc, 0x03, 0x15, 0x88, 0xb3, 0x34, 0x15, 0xbe, 0xfb, 0x0a, 0x3f, 0x9e, 0x1c, 0xbf, 0xfc, 0xae, 0xff, 0xc5, 0x15, 0xf3, - 0x4e, 0xf4, 0x8a, 0xc8, 0xe5, 0x72, 0xec, 0x2a, 0x39, 0x71, 0x7b, 0x4f, 0xda, 0xb7, 0x21, 0x65, 0xc8, 0x6b, 0x6c, 0x06, 0x8a, 0x6a, 0x82, 0xec, 0x0c, 0xeb, 0xe4, 0x85, 0x75, 0x51, 0x98, 0xfb, - 0xd8, 0x21, 0x74, 0xfd, 0xa0, 0xad, 0x45, 0xf1, 0x44, 0xc4, 0x71, 0xa5, 0xe1, 0x82, 0x70, 0xf4, 0xc1, 0xa5, 0x87, 0x64, 0xed, 0xc6, 0x4a, 0x2a, 0x81, 0x20, 0xe8, 0x65, 0xc1, 0x42, 0x3b, 0xf0, - 0xd0, 0x9d, 0x4d, 0xa7, 0x0a, 0xad, 0x54, 0x1d, 0x4e, 0x2d, 0x7b, 0xc7, 0x87, 0xcd, 0xc2, 0xb0, 0x9c, 0x89, 0xd3, 0x65, 0x46, 0xf2, 0xde, 0xd3, 0xa7, 0x2a, 0xb3, 0x17, 0x56, 0xc6, 0x2d, 0xf1, - 0x37, 0x10, 0x6e, 0x5b, 0xae, 0x5a, 0xb4, 0x11, 0xcb, 0x24, 0x58, 0xd4, 0x3c, 0x43, 0xaf, 0xbc, 0x82, 0x51, 0x09, 0x06, 0x6e, 0x96, 0x9b, 0x29, 0xd6, 0x65, 0x03, 0x48, 0x0c, 0x22, 0x33, 0x07, - 0x41, 0x29, 0xab, 0xbd, 0xdc, 0x8f, 0xb5, 0xea, 0x14, 0xef, 0x39, 0x1c, 0x83, 0x66, 0xf1, 0xa2, 0x3e, 0xee, 0x53, 0x4e, 0x5b, 0x45, 0xf6, 0x72, 0x1e, 0x81, 0x1e, 0x34, 0x23, 0x6a, 0x37, 0x1d, - 0x6c, 0x83, 0xf1, 0x14, 0xd6, 0xd2, 0x56, 0x26, 0x0e, 0xe5, 0xeb, 0x67, 0x1e, 0x5b, 0x3f, 0xb0, 0xee, 0x3b, 0xfe, 0xfa, 0x80, 0x87, 0x5b, 0x69, 0x62, 0x19, 0xd5, 0x24, 0xbe, 0xc8, 0xc2, 0x97, - 0xf4, 0xa6, 0xcf, 0x98, 0xf5, 0x1b, 0x1e, 0xcf, 0xa6, 0x1c, 0xf2, 0xda, 0x94, 0xbb, 0x90, 0xfc, 0xc0, 0xba, 0xbc, 0xe8, 0xe1, 0x46, 0x4c, 0x37, 0x73, 0x56, 0xc7, 0xc0, 0x0e, 0x3a, 0x0e, 0x7b, - 0x44, 0xa1, 0xc5, 0xa1, 0xf1, 0x63, 0xdc, 0xdb, 0x0c, 0x50, 0xef, 0x4a, 0xe6, 0xbc, 0xc2, 0x35, 0x29, 0xb2, 0x96, 0x2c, 0xd5, 0x94, 0x71, 0xbe, 0xd0, 0xf5, 0x55, 0x8b, 0xe2, 0x03, 0x0e, 0xe3, - 0xd1, 0x29, 0x24, 0x43, 0xa8, 0x5f, 0xf2, 0x0a, 0x82, 0x30, 0x18, 0x03, 0x44, 0x73, 0x21, 0xd3, 0xf7, 0x3c, 0x74, 0x9e, 0x45, 0x00, 0x31, 0x63, 0x0c, 0xf0, 0x35, 0x84, 0xdd, 0x20, 0x8a, 0x3e, - 0x1d, 0xad, 0xaf, 0xce, 0xc3, 0xcf, 0xe0, 0xfb, 0x5d, 0x42, 0x47, 0xfc, 0xa5, 0x40, 0xda, 0xcf, 0x5c, 0x8e, 0xef, 0x69, 0x1c, 0xf1, 0x71, 0x01, 0xb4, 0x2b, 0x29, 0x58, 0x64, 0x87, 0xae, 0x6a, - 0x03, 0x5d, 0x67, 0x96, 0xba, 0x69, 0x99, 0xd2, 0xc6, 0xd2, 0xc3, 0xe5, 0xf1, 0xb4, 0x59, 0x24, 0x64, 0x9f, 0x4f, 0x33, 0x7a, 0x75, 0x96, 0x22, 0x12, 0x9b, 0x52, 0xdd, 0x40, 0x43, 0x89, 0x31, - 0xb7, 0xaa, 0x03, 0xa1, 0x71, 0xf8, 0xac, 0x08, 0xf6, 0x53, 0x6f, 0x27, 0xd2, 0x1a, 0x51, 0xda, 0xc5, 0xde, 0xec, 0x67, 0x7e, 0xea, 0x52, 0xb4, 0x56, 0xd7, 0x39, 0x37, 0x42, 0xbb, 0xf1, 0x75, - 0x4b, 0xbb, 0x46, 0xc8, 0xde, 0xfa, 0xad, 0x38, 0x8e, 0x43, 0x60, 0xe8, 0xfb, 0x43, 0xf8, 0x19, 0x8e, 0x5f, 0x3d, 0x13, 0xfe, 0x3d, 0xe6, 0xf7, 0x49, 0x75, 0x3a, 0xf9, 0x75, 0x3d, 0x96, 0xfd, - 0x11, 0x1c, 0xb0, 0x32, 0x17, 0x81, 0x5f, 0xcc, 0x31, 0x65, 0x6d, 0xae, 0x34, 0xa7, 0xb4, 0xaa, 0x36, 0x96, 0x58, 0xc3, 0xc1, 0x0b, 0x2e, 0xd8, 0x0c, 0xf1, 0x00, 0x05, 0x56, 0xe1, 0x28, 0x5b, - 0x00, 0x34, 0x28, 0x62, 0xb7, 0x75, 0xeb, 0xdc, 0x5f, 0x96, 0x29, 0x2c, 0x91, 0x89, 0x95, 0x59, 0xab, 0x6a, 0xd8, 0x0b, 0xd5, 0xa0, 0xba, 0xb0, 0xb0, 0x5e, 0xd7, 0x8e, 0xb2, 0x5d, 0x4b, 0x5a, - 0x99, 0x17, 0x23, 0x00, 0x1d, 0xe1, 0xa5, 0xfb, 0x2c, 0x71, 0xd4, 0x63, 0x68, 0xfd, 0xf4, 0x1c, 0xd8, 0xc6, 0xef, 0x2c, 0xb3, 0x7f, 0x3e, 0x49, 0x3f, 0x88, 0xbe, 0x01, 0xfb, 0x7e, 0x79, 0x31, - 0xc4, 0x8e, 0x98, 0xa8, 0x74, 0x81, 0x94, 0x2e, 0x7b, 0xe4, 0xf1, 0x54, 0xb2, 0x42, 0x17, 0xde, 0xc6, 0x72, 0xbc, 0xda, 0xba, 0xce, 0x69, 0xdf, 0xa8, 0x73, 0xdb, 0xf1, 0xba, 0x39, 0x18, 0x9c, - 0x04, 0xcc, 0x31, 0xe1, 0x13, 0x04, 0xd6, 0xab, 0xad, 0xbc, 0xa0, 0xc4, 0x19, 0x37, 0xef, 0x75, 0xfb, 0x44, 0xf5, 0x27, 0x73, 0xd6, 0xa9, 0x87, 0x01, 0x59, 0x87, 0xa1, 0xe4, 0x85, 0xe4, 0x79, - 0xa7, 0x94, 0xba, 0x94, 0x2f, 0xf1, 0xf3, 0x4f, 0xd1, 0x63, 0x4f, 0x84, 0xe0, 0x5f, 0x6a, 0xb7, 0xbf, 0xff, 0x8b, 0x7c, 0xf7, 0x18, 0xfc, 0x64, 0x8d, 0x6f, 0xcf, 0xbe, 0xa9, 0x42, 0xdd, 0xf2, - 0x57, 0xc1, 0x8b, 0x4b, 0x78, 0xe0, 0xcd, 0x53, 0x2f, 0x4a, 0xcd, 0x49, 0x66, 0x14, 0xef, 0x21, 0xb7, 0xff, 0xbd, 0x73, 0x46, 0xbc, 0x38, 0x7b, 0x5d, 0xe4, 0x93, 0x0f, 0xa5, 0xd6, 0x7f, 0xef, - 0x4a, 0x72, 0x06, 0xe5, 0xe4, 0x33, 0x34, 0x13, 0xfd, 0xee, 0x0e, 0x76, 0xaf, 0x15, 0xfb, 0xef, 0x9d, 0x56, 0xec, 0x4b, 0xc5, 0x8b, 0xb7, 0xa7, 0x4f, 0xab, 0xd2, 0x59, 0x51, 0x5a, 0xdb, 0x9f, - 0xdd, 0x79, 0xc6, 0xc8, 0xfe, 0xdc, 0xa3, 0xf5, 0x0b, 0xdd, 0xb7, 0x69, 0xf2, 0xeb, 0xee, 0xc2, 0xd2, 0x46, 0xb8, 0xb7, 0x9e, 0x8c, 0x7e, 0x06, 0x99, 0x52, 0x59, 0x57, 0xab, 0xb3, 0xde, 0x31, - 0xc9, 0x1e, 0x66, 0xc1, 0xc2, 0x69, 0x48, 0xcc, 0x06, 0x3b, 0xc2, 0x90, 0x74, 0x64, 0x0d, 0xcc, 0xe3, 0x78, 0x36, 0x5d, 0x27, 0x9b, 0xa1, 0x3c, 0x55, 0x6b, 0xd7, 0x99, 0x9f, 0x77, 0x96, 0xba, - 0xa2, 0x51, 0x6b, 0xd0, 0xc1, 0xd9, 0x31, 0xe5, 0x12, 0x9c, 0xe7, 0xd8, 0x08, 0x28, 0x36, 0xaa, 0x31, 0x17, 0x01, 0x35, 0x01, 0xc2, 0xcd, 0x88, 0x15, 0xf8, 0xbf, 0x61, 0xb2, 0x7f, 0x54, 0xea, - 0xe4, 0xcb, 0xe3, 0x77, 0xb7, 0xe1, 0xcb, 0x33, 0xf8, 0xd6, 0x27, 0xef, 0xc3, 0xd5, 0xf2, 0x3f, 0x57, 0x7f, 0xd2, 0xc7, 0x23, 0x95, 0xc6, 0x66, 0x90, 0x38, 0x3f, 0xc4, 0xd9, 0xbd, 0xf1, 0x82, - 0x3f, 0x8f, 0x0c, 0xfb, 0x46, 0xfb, 0x6d, 0xc4, 0x6e, 0x5b, 0x2e, 0x7c, 0x73, 0x44, 0x26, 0xc9, 0x95, 0x70, 0x40, 0xf7, 0x47, 0xb7, 0xde, 0x3a, 0x8c, 0x4b, 0x58, 0x73, 0x73, 0xbe, 0xdf, 0xae, - 0x54, 0x9f, 0x15, 0xe9, 0x1c, 0x80, 0xcf, 0x14, 0x55, 0xcc, 0xa3, 0xf8, 0x38, 0x6f, 0xac, 0x66, 0xb5, 0xc4, 0xe6, 0x73, 0x88, 0xd1, 0x59, 0xb5, 0x12, 0x57, 0x94, 0x48, 0xfb, 0x76, 0x34, 0x90, - 0x03, 0xa7, 0xb5, 0x9d, 0x3f, 0x8b, 0x68, 0x3b, 0x69, 0xe2, 0x3d, 0xe7, 0x4c, 0x01, 0xcc, 0xb2, 0xd3, 0xa5, 0xfd, 0x9a, 0xee, 0xd8, 0x76, 0x22, 0xa3, 0xff, 0x0a, 0xd7, 0x47, 0x78, 0xf5, 0x33, - 0x74, 0x63, 0x23, 0xb1, 0x9f, 0xe7, 0xb4, 0x7b, 0x2d, 0x4b, 0xfc, 0x27, 0xd9, 0x2b, 0xa4, 0xd7, 0xeb, 0x09, 0x34, 0x22, 0x55, 0xfc, 0x1b, 0x9a, 0x83, 0x88, 0xf1, 0x89, 0xb4, 0x81, 0xe1, 0xd5, - 0xe6, 0xb8, 0xc7, 0xfb, 0xe8, 0xa0, 0xcc, 0xd6, 0x28, 0x95, 0x81, 0x9b, 0x25, 0xd7, 0x9f, 0x71, 0xd8, 0xf5, 0x77, 0x22, 0x0d, 0x02, 0x35, 0x73, 0x94, 0xc8, 0xbd, 0x75, 0x5c, 0xec, 0xd6, 0xd9, - 0xf9, 0x74, 0x68, 0x8c, 0x14, 0x35, 0xc3, 0x20, 0xce, 0xd8, 0xe9, 0x5a, 0xf4, 0xfb, 0xa4, 0x17, 0xce, 0xab, 0x55, 0xc7, 0xf8, 0xed, 0xde, 0x5a, 0x4a, 0xb1, 0x5d, 0xdf, 0x1d, 0xcf, 0x1e, 0xa5, - 0xbb, 0x78, 0x3c, 0xb5, 0x5e, 0x71, 0x20, 0xb9, 0xa3, 0x7e, 0x45, 0xe2, 0xb6, 0x6d, 0xac, 0x1f, 0xc9, 0xd1, 0x46, 0x4a, 0x07, 0x17, 0xe6, 0x40, 0xc9, 0x41, 0x52, 0x9b, 0xeb, 0x61, 0x69, 0x09, - 0x45, 0x5d, 0x64, 0x4b, 0x7e, 0xe3, 0x72, 0xe0, 0xb4, 0xd7, 0x12, 0x31, 0x48, 0x70, 0x61, 0x5a, 0xd0, 0x48, 0xcc, 0xd5, 0x15, 0xd3, 0xc8, 0xc5, 0x82, 0xf2, 0xb7, 0xb5, 0x89, 0x14, 0x24, 0x58, - 0x1f, 0x4c, 0x40, 0x5c, 0x8a, 0xf3, 0x7a, 0x09, 0x0a, 0x5a, 0x3a, 0x27, 0x41, 0xcd, 0x76, 0x8d, 0xaa, 0x3c, 0x3e, 0x99, 0x5e, 0xdf, 0x30, 0xfa, 0x22, 0x52, 0x3f, 0xd6, 0xae, 0xbe, 0xa2, 0x50, - 0xff, 0x45, 0xf6, 0x82, 0xca, 0xc7, 0xcd, 0xa5, 0x94, 0xc0, 0x88, 0x73, 0xc9, 0x54, 0x2c, 0x1a, 0xd4, 0x2e, 0xdb, 0x5e, 0x38, 0xcc, 0xdd, 0xd4, 0x5f, 0x67, 0x03, 0x99, 0xe2, 0x9a, 0x89, 0xac, - 0x07, 0x44, 0x2c, 0x64, 0x3a, 0x9f, 0x33, 0x58, 0x21, 0xd5, 0xfe, 0xfa, 0x48, 0x18, 0x7e, 0x15, 0x99, 0x1a, 0x9b, 0x9c, 0xba, 0x16, 0x36, 0x17, 0xab, 0xfd, 0x31, 0x0a, 0x0d, 0x8a, 0x58, 0xaa, - 0x8c, 0xa1, 0xea, 0xb3, 0xb6, 0x64, 0xec, 0xd4, 0x5e, 0x35, 0xe6, 0xd9, 0x67, 0xe3, 0x7c, 0x1c, 0x1c, 0xe9, 0x39, 0x78, 0x66, 0x5b, 0x00, 0x5f, 0x72, 0xf7, 0xba, 0x92, 0xbc, 0xc0, 0x70, 0xc9, - 0x7b, 0x0a, 0x8e, 0xf3, 0xec, 0xd2, 0x74, 0x64, 0x2d, 0xf7, 0xc9, 0x34, 0x9d, 0x79, 0x2e, 0xbb, 0x8d, 0x92, 0x48, 0x25, 0x3c, 0xa2, 0xcb, 0x51, 0xaf, 0xe7, 0x70, 0x4e, 0xac, 0xfd, 0x35, 0xcf, - 0x1a, 0xc6, 0xba, 0x2c, 0xd7, 0x73, 0x38, 0xf7, 0x68, 0x59, 0x04, 0x3d, 0xde, 0xab, 0xa4, 0x26, 0xed, 0xf5, 0x9d, 0x54, 0x91, 0x94, 0x89, 0xdb, 0x0b, 0xd4, 0x77, 0x2d, 0xd2, 0x3e, 0x61, 0x46, - 0x71, 0x6e, 0xac, 0x29, 0xb7, 0x88, 0x8b, 0xbb, 0x73, 0xaa, 0xf5, 0x25, 0xd5, 0xcb, 0x63, 0xcd, 0x05, 0xf4, 0xca, 0x1e, 0xf9, 0x41, 0xf5, 0xb3, 0xd7, 0xa1, 0x51, 0x5c, 0x0c, 0x9a, 0x23, 0xf6, - 0xc7, 0x1d, 0xdd, 0xe1, 0x29, 0x53, 0xb0, 0x00, 0xef, 0x0f, 0x3b, 0x76, 0x2b, 0x93, 0x21, 0x26, 0x12, 0x53, 0x0d, 0x09, 0xf7, 0xd3, 0x58, 0x66, 0x1a, 0x7a, 0x4a, 0x3b, 0x1b, 0x48, 0x11, 0xe2, - 0x6d, 0x82, 0x63, 0x70, 0xc0, 0x2f, 0x30, 0x0d, 0x95, 0xe6, 0xc3, 0x82, 0x8c, 0x00, 0x8c, 0xdb, 0x73, 0x6a, 0xd4, 0x4b, 0x12, 0x05, 0x88, 0xf1, 0x49, 0xe6, 0x63, 0x90, 0x11, 0xe4, 0x36, 0xa3, - 0xb1, 0x6d, 0x3e, 0x46, 0x8d, 0x65, 0x3b, 0x57, 0xa1, 0xe3, 0xd9, 0x49, 0xfd, 0xcf, 0x87, 0xfe, 0x42, 0xf1, 0xe2, 0x56, 0x66, 0x54, 0xfe, 0xe5, 0x50, 0xfe, 0x63, 0x19, 0x0d, 0xca, 0xc8, 0x2d, - 0x61, 0x4e, 0xd8, 0xe7, 0x44, 0x5e, 0xad, 0x96, 0xd6, 0xce, 0x8b, 0x35, 0x8c, 0x5e, 0x9b, 0x6b, 0xab, 0xf3, 0xbe, 0x0d, 0xdd, 0x87, 0x42, 0xf3, 0xd1, 0xcf, 0xbd, 0x4d, 0xcc, 0x33, 0xfe, 0xe7, - 0x9a, 0xb5, 0x77, 0xf9, 0xb9, 0x66, 0xed, 0x5d, 0x0a, 0xbc, 0x8d, 0x18, 0x2e, 0xfe, 0xa8, 0xac, 0x98, 0x5a, 0x94, 0x11, 0x87, 0xae, 0x84, 0x2d, 0xdf, 0x24, 0x07, 0x8d, 0xd8, 0x5a, 0x67, 0xa7, - 0x82, 0x42, 0xb0, 0xc2, 0xb8, 0x9a, 0x2b, 0x57, 0x03, 0xcf, 0x0f, 0xa5, 0x73, 0xa6, 0x31, 0x58, 0x8f, 0x66, 0xb9, 0xec, 0xae, 0x36, 0xfc, 0x32, 0x28, 0x5b, 0x35, 0xdf, 0x34, 0x8c, 0xb2, 0x3e, - 0x31, 0x9c, 0xa7, 0x02, 0xc4, 0x7a, 0xda, 0x2c, 0x0e, 0x07, 0xdf, 0xf1, 0xdb, 0xce, 0x3d, 0x0b, 0x3f, 0x8b, 0x33, 0x71, 0xf9, 0x31, 0x3f, 0x9f, 0x88, 0x15, 0x37, 0xae, 0x04, 0x4f, 0xb5, 0x2f, - 0x2f, 0x80, 0xf4, 0x41, 0xf6, 0xdd, 0x5f, 0xf0, 0x7a, 0x33, 0xd6, 0x71, 0xa9, 0xb7, 0x49, 0x0b, 0xa3, 0xec, 0x20, 0x3f, 0x59, 0x47, 0x60, 0x1b, 0x5a, 0xad, 0x2c, 0x98, 0x24, 0x7d, 0xf6, 0xb7, - 0xd6, 0x2c, 0xf1, 0x0e, 0x05, 0xb8, 0x37, 0xfc, 0xe5, 0x7c, 0xdd, 0xd0, 0xc1, 0xb6, 0x9d, 0x65, 0xb5, 0x62, 0x98, 0x70, 0xaf, 0x47, 0x3e, 0x90, 0x9c, 0x8d, 0x92, 0x4b, 0x74, 0x1e, 0x58, 0xae, - 0x25, 0x8a, 0xc7, 0x8b, 0x63, 0x06, 0x6f, 0x87, 0xad, 0xbf, 0xd5, 0x87, 0xe6, 0xb0, 0x9a, 0xbd, 0x26, 0x47, 0x8c, 0x8a, 0x66, 0xba, 0xe4, 0x58, 0xfd, 0x16, 0x75, 0xf1, 0x3d, 0x84, 0xe3, 0x33, - 0x2f, 0xca, 0x3d, 0x85, 0x8f, 0x54, 0x1c, 0xe5, 0xe3, 0x7f, 0x7e, 0x7f, 0x7c, 0x76, 0x3e, 0x7d, 0xfb, 0xbf, 0x49, 0x9e, 0x4f, 0x6b, 0x81, 0x5d, 0xcf, 0xdd, 0x4f, 0x64, 0x9e, 0x47, 0xa9, 0xc9, - 0x9e, 0xcd, 0x80, 0x3f, 0x3f, 0x25, 0xde, 0x51, 0xbf, 0x4c, 0x84, 0x6f, 0x6d, 0x97, 0xf9, 0x30, 0xe2, 0xdc, 0x88, 0xec, 0x73, 0x57, 0x63, 0x43, 0x38, 0xda, 0x0d, 0xf6, 0x5e, 0x74, 0x67, 0xfa, - 0x46, 0x5f, 0x4e, 0x4f, 0x80, 0x5e, 0xf7, 0xc0, 0xdc, 0xa3, 0x71, 0x17, 0xc2, 0x51, 0x67, 0xc6, 0xc2, 0x2d, 0x61, 0x7b, 0x49, 0xc6, 0x52, 0xc5, 0x9c, 0x76, 0x8a, 0xb5, 0x96, 0xed, 0x51, 0x7c, - 0xa3, 0x69, 0x56, 0x98, 0x9c, 0x6d, 0xfe, 0xb0, 0x0f, 0xf9, 0x33, 0x49, 0xe1, 0xa7, 0xd5, 0x7c, 0x06, 0x20, 0x22, 0x1b, 0xa9, 0x23, 0x96, 0xcf, 0x3d, 0xf2, 0x6f, 0xc2, 0xfb, 0xef, 0xe0, 0xfc, - 0x9d, 0x12, 0xe3, 0x15, 0xd6, 0x78, 0xa1, 0xf9, 0x09, 0x9d, 0x3d, 0xc6, 0xce, 0x08, 0x4d, 0x7a, 0x0d, 0x36, 0x87, 0xc6, 0x56, 0xec, 0x79, 0xc0, 0x2d, 0x85, 0x28, 0x5b, 0x1d, 0xd7, 0x3a, 0x8a, - 0x95, 0x6e, 0x96, 0xed, 0xc7, 0x30, 0xf8, 0x6f, 0x82, 0xf3, 0xbf, 0xd9, 0x9d, 0xaf, 0xa4, 0x2f, 0xbd, 0xfa, 0xda, 0x30, 0xa6, 0x73, 0x6f, 0xb3, 0x41, 0xef, 0x45, 0x9a, 0x38, 0xb8, 0x24, 0x64, - 0xec, 0xe6, 0xe0, 0xb1, 0xdb, 0xa1, 0xec, 0xba, 0x60, 0x99, 0xb9, 0x1a, 0x11, 0x4b, 0xbb, 0x84, 0x68, 0x2a, 0x5e, 0xda, 0x56, 0x7a, 0x32, 0x5a, 0x35, 0xd9, 0xd1, 0x84, 0x48, 0xfb, 0xd9, 0xc1, - 0xab, 0xea, 0xcd, 0x06, 0x36, 0xa8, 0xb3, 0x47, 0x18, 0x84, 0x20, 0xa2, 0x50, 0xd8, 0xf1, 0xa2, 0x0e, 0x11, 0x19, 0x7a, 0xb2, 0xd7, 0xc9, 0x9e, 0x39, 0x23, 0xfb, 0x31, 0x96, 0x65, 0xdb, 0x19, - 0x8c, 0xc8, 0x7b, 0x66, 0x39, 0x84, 0x5e, 0x3a, 0x29, 0xbf, 0xd3, 0xbc, 0x80, 0x71, 0xb9, 0x1a, 0x9b, 0xf4, 0xb0, 0x50, 0x45, 0x1e, 0x34, 0x5d, 0x00, 0x4b, 0x40, 0x21, 0x4d, 0x4a, 0x13, 0x10, - 0x4f, 0x27, 0xf7, 0xe0, 0x6e, 0xca, 0x20, 0xe6, 0x50, 0x66, 0x59, 0xc5, 0xc9, 0x26, 0xe3, 0x19, 0x6d, 0x26, 0x40, 0xf2, 0x62, 0x60, 0x23, 0xa1, 0xa0, 0xf7, 0xae, 0x9d, 0x9a, 0xc5, 0x2c, 0xd9, - 0x72, 0x5c, 0x79, 0xf4, 0x94, 0x45, 0xbf, 0x3f, 0xe6, 0x8e, 0x38, 0x17, 0x86, 0x58, 0x91, 0xf7, 0x39, 0x31, 0x34, 0xa7, 0xe0, 0x35, 0x1e, 0xf9, 0xee, 0x77, 0xf1, 0xe1, 0xa8, 0xfe, 0x85, 0x33, - 0x7d, 0x86, 0xcc, 0xfc, 0xfd, 0x44, 0xf9, 0xf7, 0x35, 0xc3, 0xd5, 0x63, 0x69, 0xf2, 0x15, 0xf7, 0xa7, 0x4f, 0xaa, 0x6f, 0xb0, 0x7e, 0x5c, 0x8f, 0xcd, 0xbf, 0x23, 0xaf, 0xd7, 0x6b, 0xc5, 0x15, - 0x8d, 0xba, 0x2e, 0x8d, 0xd3, 0x76, 0x01, 0xcc, 0x5c, 0xef, 0x04, 0x1c, 0x4e, 0xcd, 0x5c, 0x3d, 0x2f, 0xa4, 0xf8, 0xd4, 0x10, 0xe5, 0x19, 0x4f, 0xd2, 0x90, 0xd6, 0xf5, 0xa6, 0xe6, 0xe4, 0xc3, - 0x5a, 0xee, 0x41, 0xfd, 0x8c, 0xca, 0x19, 0x23, 0xd0, 0xf8, 0x92, 0x0e, 0x45, 0x30, 0xcc, 0xe6, 0xad, 0x45, 0x2d, 0x1a, 0x06, 0x75, 0x52, 0xb7, 0xe9, 0x87, 0xb9, 0x75, 0xa4, 0x5f, 0x53, 0x52, - 0x5d, 0x12, 0x66, 0x7d, 0x6a, 0xfa, 0x91, 0xe7, 0xce, 0x4d, 0xb7, 0xe1, 0x5b, 0x4f, 0xb8, 0x38, 0xf9, 0x82, 0x9d, 0xff, 0x0b, 0xe1, 0xe9, 0xe4, 0xeb, 0xdd, 0xe4, 0x4a, 0xf0, 0x67, 0x38, 0x29, - 0x03, 0x5e, 0xc3, 0xc0, 0xd1, 0x46, 0x4c, 0xfc, 0xdc, 0x2d, 0x65, 0x56, 0x5a, 0xa1, 0x92, 0xa1, 0xe0, 0x84, 0x35, 0xcc, 0x77, 0x3d, 0xd5, 0x20, 0x03, 0x71, 0xe2, 0x7c, 0xed, 0x28, 0x63, 0xa0, - 0x36, 0xef, 0x00, 0xd3, 0x2c, 0x35, 0x9d, 0xec, 0x04, 0x1e, 0x8d, 0xf6, 0x07, 0x63, 0x70, 0xf8, 0x7a, 0x15, 0xf5, 0xa6, 0xba, 0x01, 0x4f, 0xe8, 0xbe, 0xa8, 0xf9, 0xb4, 0x24, 0x72, 0x39, 0xc5, - 0xdc, 0x11, 0x9a, 0x9c, 0x9f, 0x03, 0xde, 0xaa, 0xf4, 0x2e, 0x4b, 0xc1, 0xb7, 0x44, 0x60, 0x2f, 0xea, 0x63, 0x1f, 0xbc, 0x72, 0x0d, 0xaa, 0x9c, 0xd8, 0x4e, 0x69, 0x15, 0x41, 0x76, 0x13, 0xef, - 0x7c, 0xb3, 0x60, 0xde, 0xf3, 0xae, 0xbd, 0x47, 0x5e, 0xde, 0x3e, 0xb8, 0x4b, 0xbe, 0xf0, 0x2d, 0x31, 0x5b, 0xe5, 0x14, 0x89, 0x11, 0x4d, 0xca, 0x28, 0xad, 0x9e, 0xbc, 0x52, 0x4e, 0xde, 0x50, - 0xf9, 0xcc, 0x18, 0x79, 0x9b, 0x0b, 0xfa, 0xfa, 0x42, 0xe2, 0x78, 0xc6, 0x25, 0x6e, 0x76, 0x70, 0x8a, 0xf4, 0x73, 0x51, 0x7f, 0xd7, 0x60, 0x7e, 0x15, 0x66, 0xa0, 0xfb, 0x00, 0x53, 0xdf, 0x28, - 0x3e, 0xe3, 0x28, 0xbf, 0x04, 0x66, 0xdf, 0x0d, 0xc2, 0x7d, 0x30, 0xea, 0xf7, 0xe0, 0xef, 0xd6, 0x31, 0xce, 0x85, 0xe3, 0x3e, 0xfe, 0xf7, 0x87, 0x15, 0x12, 0xa0, 0x6f, 0x55, 0xfa, 0x7f, 0x94, - 0x9e, 0xae, 0x2f, 0xfc, 0x63, 0x94, 0x65, 0xe0, 0x5d, 0x47, 0x05, 0xbd, 0x4b, 0xa3, 0xf8, 0x3c, 0x1f, 0xf2, 0x03, 0x71, 0xee, 0xb7, 0x49, 0x75, 0x1f, 0xbc, 0x7f, 0x9f, 0xbc, 0xe4, 0x43, 0x08, - 0xfc, 0x58, 0xeb, 0x5f, 0x38, 0xc7, 0x6f, 0x62, 0x88, 0x3f, 0x06, 0xe5, 0x57, 0xeb, 0xbd, 0x20, 0xf7, 0xf5, 0xc3, 0xe3, 0xb9, 0xc0, 0x07, 0xf1, 0xe9, 0xe4, 0xf3, 0xf2, 0x22, 0xba, 0xdd, 0x6e, - 0x53, 0x7f, 0x3d, 0x63, 0x01, 0xe7, 0xe6, 0x68, 0x77, 0x74, 0xd9, 0xe9, 0xa1, 0x3f, 0xc8, 0x2a, 0x48, 0xe8, 0xc9, 0xae, 0xb7, 0x07, 0x11, 0x92, 0xe4, 0xa9, 0xb4, 0x8d, 0x24, 0x99, 0x61, 0x34, - 0x54, 0xdb, 0xed, 0x66, 0x84, 0x83, 0x10, 0xa9, 0x4c, 0xa1, 0x24, 0xed, 0x9e, 0x77, 0xb9, 0xd7, 0x03, 0xa7, 0x70, 0x95, 0x5a, 0x69, 0xdb, 0xc3, 0xa4, 0xc5, 0x36, 0x96, 0x18, 0xd4, 0xc0, 0x79, - 0xd3, 0x10, 0xf0, 0x2c, 0x94, 0xa4, 0xd3, 0xd7, 0xad, 0xea, 0xaf, 0xa7, 0x6c, 0xe0, 0xaf, 0x9f, 0x59, 0xc1, 0x5f, 0x7f, 0xfd, 0x36, 0x80, 0xf5, 0xcb, 0x7b, 0xff, 0xf7, 0xff, 0xfa, 0x7e, 0x75, - 0xc7, 0x85, 0xbf, 0xf1, 0x94, 0xc7, 0x9c, 0xf8, 0x15, 0x0f, 0xa3, 0x6f, 0xb4, 0xaf, 0xcc, 0xf8, 0x6b, 0xcb, 0x25, 0xeb, 0xfa, 0x88, 0xb3, 0x95, 0xb0, 0xe0, 0xa2, 0xc8, 0xd3, 0xb7, 0x95, 0x21, - 0xa7, 0x64, 0x1c, 0x68, 0x73, 0x6b, 0xb7, 0xf0, 0x25, 0xd9, 0x60, 0x0e, 0xe1, 0x76, 0x85, 0xf0, 0x5a, 0x09, 0x9d, 0x02, 0x9b, 0x26, 0xa8, 0x36, 0x58, 0x86, 0xd0, 0x59, 0xeb, 0x58, 0x47, 0x90, - 0xac, 0x6a, 0x47, 0x39, 0x03, 0xc5, 0x31, 0x98, 0xce, 0x1e, 0x19, 0xd0, 0x83, 0x37, 0x1e, 0x9f, 0xe0, 0x6c, 0x3b, 0x47, 0x37, 0xd2, 0x2c, 0x38, 0x66, 0xcd, 0x08, 0x7e, 0x7c, 0xcf, 0x7c, 0xee, - 0x19, 0xc7, 0x98, 0x73, 0xd4, 0xb7, 0xf0, 0xf4, 0x27, 0xd2, 0xf8, 0xa3, 0x08, 0x8b, 0x47, 0x83, 0xf1, 0x5a, 0xda, 0xac, 0x3b, 0xea, 0x6f, 0xc3, 0xf1, 0xbd, 0x6d, 0x6c, 0xf2, 0xac, 0x60, 0x0a, - 0xab, 0x66, 0x22, 0x0e, 0xd3, 0xba, 0x3b, 0x2e, 0x64, 0x1c, 0x38, 0xd8, 0xa7, 0xad, 0xc7, 0x2a, 0xb4, 0xb4, 0x47, 0x61, 0x02, 0xd8, 0xe7, 0x9a, 0x79, 0x16, 0x06, 0x1a, 0x81, 0x21, 0xba, 0x5e, - 0x08, 0x5b, 0x39, 0xe7, 0xea, 0x2d, 0xbb, 0xa1, 0xc0, 0xcd, 0x1e, 0x06, 0x14, 0xb8, 0xab, 0x34, 0xc6, 0x66, 0xb9, 0x58, 0x47, 0xed, 0x23, 0xee, 0x2e, 0xbb, 0xd2, 0x46, 0x45, 0x75, 0x07, 0x28, - 0x77, 0x3e, 0x81, 0xbf, 0x35, 0xf2, 0xbc, 0x56, 0x9d, 0xe2, 0xd3, 0xbe, 0xf3, 0x6e, 0xda, 0x19, 0x59, 0x95, 0x22, 0x16, 0x5a, 0x00, 0x76, 0xcf, 0x82, 0x49, 0xed, 0x06, 0x81, 0x38, 0x81, 0x7b, - 0x0d, 0xdc, 0xe4, 0x76, 0xa2, 0x1e, 0x38, 0x47, 0xaa, 0x78, 0xb4, 0x00, 0xa3, 0x03, 0x39, 0x10, 0x14, 0x65, 0xb4, 0x0b, 0xd5, 0xcb, 0x1d, 0x83, 0x30, 0xe9, 0x20, 0x80, 0x41, 0x4a, 0x2b, 0x36, - 0xf3, 0x62, 0x65, 0x4f, 0x99, 0x0e, 0xdc, 0xc3, 0x9c, 0x35, 0xe0, 0x22, 0x04, 0x41, 0x0b, 0x63, 0x75, 0x96, 0x2d, 0x13, 0xbc, 0xeb, 0xaf, 0x6b, 0x18, 0xe5, 0x24, 0x2c, 0x27, 0x45, 0x9d, 0x54, - 0xd7, 0x54, 0xc7, 0xff, 0x9e, 0xc6, 0xea, 0x1b, 0xed, 0x4b, 0x88, 0xdb, 0x4d, 0xcb, 0x18, 0x2d, 0xd6, 0x1b, 0x14, 0x4b, 0xaf, 0xd4, 0x96, 0xe2, 0x8a, 0x62, 0x18, 0xd6, 0x3f, 0x45, 0x89, 0xb2, - 0x62, 0xa0, 0xd4, 0x6c, 0xd0, 0x9c, 0x33, 0x54, 0x74, 0xbf, 0x0a, 0x96, 0xa7, 0xe3, 0x26, 0x34, 0x45, 0x2d, 0xc6, 0xca, 0x79, 0x09, 0x1c, 0x7d, 0x53, 0x1f, 0x62, 0xa9, 0x95, 0x5a, 0x2c, 0xdb, - 0x17, 0x87, 0xbc, 0xf0, 0xaa, 0x24, 0x61, 0x21, 0x8c, 0x27, 0x66, 0xcd, 0xec, 0x88, 0xcb, 0xdb, 0x41, 0x8a, 0xe7, 0x2e, 0x2b, 0x8e, 0xf0, 0x00, 0xbc, 0x35, 0xfb, 0x5d, 0xeb, 0x6e, 0xdd, 0xac, - 0xc5, 0xaf, 0xf6, 0x90, 0xbf, 0xff, 0x03, 0xdd, 0x25, 0x53, 0xfd, 0xd0, 0x02, 0xfe, 0x7d, 0x9f, 0x86, 0xe2, 0x3d, 0x28, 0xf0, 0x63, 0x23, 0xc5, 0x6e, 0x9f, 0x86, 0xe5, 0xa4, 0x37, 0xe2, 0xe8, - 0x73, 0x9b, 0xbd, 0x79, 0x98, 0xa4, 0xb6, 0x33, 0x49, 0xcb, 0x49, 0x5d, 0x05, 0xd1, 0x2f, 0x9f, 0x82, 0x1b, 0x91, 0x20, 0x6d, 0x9c, 0x22, 0x4a, 0x0d, 0x7b, 0xf2, 0xb6, 0xbb, 0x3a, 0x5f, 0x13, - 0xc7, 0xc0, 0xb7, 0xb2, 0x4e, 0x56, 0xa4, 0xf1, 0xc4, 0x8a, 0x82, 0x8f, 0xd4, 0xc7, 0x10, 0xfa, 0x7d, 0xdf, 0xff, 0x9a, 0xe8, 0xfa, 0xc9, 0xe9, 0xe4, 0x12, 0x6d, 0x63, 0xa5, 0x49, 0x75, 0x59, - 0xda, 0x7d, 0xe6, 0xfc, 0xb6, 0x8e, 0xdd, 0x6b, 0x87, 0xe2, 0x27, 0xdf, 0xf8, 0x88, 0x9b, 0xbc, 0x7f, 0x32, 0xf6, 0x98, 0xac, 0x9a, 0x16, 0xaa, 0x5a, 0x7d, 0x29, 0xab, 0x56, 0xc9, 0x63, 0x06, - 0x23, 0xcb, 0xc4, 0x21, 0x47, 0xb8, 0xb6, 0x61, 0x72, 0x92, 0x58, 0x00, 0x4a, 0x62, 0x9e, 0x9d, 0x8d, 0xe3, 0x66, 0x8e, 0xb6, 0x53, 0x81, 0xa2, 0x1f, 0x56, 0xdb, 0x48, 0xc6, 0x39, 0xb1, 0x5a, - 0x6d, 0xfd, 0x12, 0xe7, 0x22, 0x70, 0x77, 0x96, 0xd7, 0x99, 0xc5, 0x02, 0xed, 0x0e, 0xdc, 0xb6, 0xee, 0x1e, 0x58, 0x2d, 0x64, 0x6c, 0x73, 0x67, 0x3e, 0x7a, 0x0f, 0x48, 0xb2, 0xde, 0x86, 0xae, - 0x2e, 0x82, 0xc9, 0xa7, 0x71, 0xe7, 0x37, 0x20, 0xfd, 0x39, 0xc3, 0x7d, 0xfa, 0x95, 0x0f, 0x98, 0x1e, 0x3d, 0x1b, 0x9b, 0x97, 0x4d, 0x61, 0x3d, 0x56, 0xf1, 0x30, 0x47, 0xee, 0x9a, 0xa3, 0xbe, - 0x6e, 0x95, 0xd9, 0xaa, 0x71, 0x4d, 0x83, 0x21, 0x28, 0x55, 0xf4, 0x61, 0x6b, 0x07, 0x20, 0x21, 0xe6, 0xee, 0xd7, 0x83, 0xbc, 0x5f, 0x74, 0xca, 0x7c, 0x8b, 0xd8, 0x27, 0xc4, 0x20, 0x94, 0x61, - 0xd6, 0xc3, 0xee, 0xb4, 0x16, 0x40, 0x07, 0x99, 0xe3, 0x4a, 0x9c, 0xda, 0x34, 0x92, 0x8a, 0x18, 0x1a, 0x4a, 0x02, 0xc9, 0x9c, 0xa4, 0xcd, 0xc6, 0x7b, 0x02, 0xd4, 0x0f, 0xea, 0x56, 0xe4, 0x25, - 0x65, 0xdb, 0x37, 0xda, 0xbf, 0x40, 0xf9, 0x54, 0xbc, 0x22, 0xe3, 0x14, 0x6d, 0x2e, 0x92, 0x0b, 0x64, 0x2a, 0xf4, 0x64, 0x08, 0x53, 0xfe, 0xdc, 0x99, 0x32, 0xe4, 0x69, 0x41, 0x42, 0xed, 0x2e, - 0x66, 0xe7, 0x8b, 0x85, 0x3c, 0xf5, 0x68, 0x2e, 0x61, 0x0f, 0x94, 0xb6, 0xc6, 0xfc, 0xb2, 0xe5, 0x88, 0xf9, 0x8e, 0x0d, 0x41, 0x92, 0xb1, 0x30, 0x46, 0x3b, 0x0c, 0xa4, 0xb5, 0xde, 0x00, 0x40, - 0x17, 0x65, 0xf4, 0x62, 0xe3, 0xd1, 0x46, 0x50, 0x9d, 0x4a, 0x10, 0xa1, 0xa4, 0xe3, 0x0c, 0x7d, 0xc0, 0x9b, 0x1f, 0x05, 0xd5, 0x3e, 0xde, 0x9e, 0x5f, 0xc9, 0x75, 0xfc, 0x80, 0xfe, 0x93, 0x30, - 0x64, 0x6c, 0x5c, 0xd6, 0xe3, 0x72, 0x7e, 0xe2, 0x25, 0x2f, 0xa1, 0xf4, 0xd2, 0xd9, 0xd5, 0x90, 0xe0, 0x85, 0x78, 0x24, 0x9b, 0x02, 0xc8, 0xb8, 0xe1, 0xca, 0xd7, 0x15, 0x95, 0x8a, 0x33, 0x1d, - 0xa3, 0x0c, 0x71, 0x7d, 0xee, 0x77, 0x3e, 0xe6, 0x51, 0xea, 0xdc, 0x33, 0xa6, 0x35, 0xbf, 0x0d, 0x05, 0x9e, 0xc9, 0xe8, 0x55, 0xb8, 0x20, 0x0d, 0x5b, 0xd9, 0x64, 0x36, 0x67, 0x2d, 0x76, 0x22, - 0x2d, 0x79, 0x85, 0x4e, 0x94, 0x49, 0x3a, 0x42, 0xff, 0xf8, 0x30, 0xba, 0xff, 0xc1, 0xa9, 0xf1, 0x8b, 0xd7, 0xc2, 0xfd, 0x93, 0x11, 0x89, 0x06, 0x1e, 0x04, 0x14, 0x22, 0x77, 0x2f, 0xfd, 0xca, - 0x46, 0xf0, 0x8d, 0x6d, 0xbf, 0x57, 0x75, 0xfe, 0xad, 0xb2, 0xf9, 0x42, 0x21, 0xaf, 0x9d, 0xa2, 0xff, 0x3c, 0xf0, 0xfd, 0x7b, 0xd6, 0x86, 0xef, 0xc4, 0x3f, 0x06, 0xfb, 0x4b, 0xd3, 0x58, 0xcb, - 0x43, 0x7e, 0x84, 0x0b, 0xc0, 0x41, 0x98, 0xc6, 0x5f, 0xae, 0xe2, 0xcc, 0x66, 0xf6, 0xcd, 0x74, 0x2a, 0xcf, 0x56, 0xc9, 0x2a, 0x4a, 0xb4, 0xd0, 0x58, 0xe0, 0x02, 0x4b, 0xd7, 0x86, 0x4a, 0xed, - 0xe8, 0x73, 0x0b, 0x9f, 0x1b, 0x86, 0x9b, 0x29, 0x74, 0xd8, 0x31, 0x80, 0x3b, 0x2d, 0x98, 0xf5, 0x11, 0xdd, 0x3b, 0x68, 0x96, 0x9c, 0x67, 0x19, 0xb9, 0xa5, 0xce, 0xc7, 0x83, 0x14, 0x6a, 0x0c, - 0xc5, 0x1e, 0x13, 0x78, 0xc4, 0x48, 0xff, 0x8e, 0x8d, 0x7e, 0x3f, 0x0d, 0xde, 0x03, 0x5b, 0x38, 0xf6, 0x73, 0xcd, 0xcf, 0x6b, 0x11, 0x84, 0x5f, 0xe8, 0x7e, 0xc0, 0x79, 0xbd, 0x1b, 0x1b, 0x47, - 0x08, 0x80, 0x4e, 0x0c, 0x6c, 0x7a, 0x83, 0x74, 0xd9, 0xb5, 0xbb, 0x14, 0xd6, 0x96, 0x8d, 0xc3, 0x5a, 0x83, 0xa7, 0x49, 0x38, 0x8f, 0x63, 0xff, 0x04, 0xd5, 0xfe, 0x0c, 0x57, 0x4f, 0x2e, 0x27, - 0xcf, 0x4e, 0x2d, 0xe5, 0xe0, 0x67, 0x63, 0x65, 0x0b, 0x0b, 0x65, 0x43, 0x96, 0xe0, 0xf4, 0x90, 0xd4, 0x5e, 0x87, 0x9d, 0x6c, 0xb2, 0xb2, 0x4d, 0x9d, 0x70, 0x70, 0x6f, 0x09, 0x57, 0x47, 0xd2, - 0x1e, 0x54, 0xfb, 0xce, 0x34, 0xeb, 0x3e, 0xac, 0xa5, 0xf1, 0x08, 0x86, 0xd7, 0x22, 0x4f, 0x1f, 0xd0, 0xff, 0x80, 0xe3, 0xb6, 0x75, 0x74, 0x24, 0x2a, 0xc0, 0x6e, 0x2d, 0xd8, 0x8e, 0x37, 0xbb, - 0x88, 0xcf, 0x22, 0x7a, 0xca, 0xa0, 0x2c, 0x19, 0x91, 0x3b, 0x8b, 0x62, 0x28, 0x97, 0xaf, 0x78, 0x7c, 0xae, 0xcd, 0xd0, 0xfa, 0xb4, 0x53, 0x05, 0x7c, 0xd9, 0x58, 0x03, 0xb9, 0xb3, 0x3c, 0x04, - 0xd1, 0xe0, 0x01, 0xda, 0x9c, 0xcc, 0x48, 0xc2, 0x3b, 0x5b, 0xc3, 0x50, 0x5e, 0xd5, 0x4e, 0xcc, 0xb2, 0x01, 0x40, 0x25, 0xcb, 0x67, 0x9b, 0x14, 0x1f, 0xce, 0x63, 0x5c, 0xcc, 0xbf, 0xac, 0xe1, - 0xc7, 0xf0, 0xbc, 0xe2, 0x7d, 0xff, 0x41, 0xf4, 0x03, 0x93, 0xb7, 0xa9, 0x3b, 0xd2, 0xd7, 0xde, 0xda, 0xd4, 0x25, 0x3b, 0xdf, 0x54, 0xd3, 0xe3, 0x34, 0xdd, 0xe0, 0xc3, 0x14, 0x4a, 0x7a, 0xd7, - 0x81, 0x57, 0xcd, 0x9a, 0x3d, 0x49, 0xa9, 0x7f, 0x3a, 0xba, 0xcd, 0x99, 0xf3, 0x9b, 0x0e, 0x4c, 0x16, 0x4b, 0x05, 0xe8, 0x5c, 0xec, 0x90, 0x2e, 0xd4, 0x90, 0x62, 0x2c, 0x25, 0x23, 0x91, 0x9a, - 0x93, 0xe7, 0x96, 0x3f, 0x68, 0x56, 0xd9, 0xf0, 0x51, 0x61, 0x64, 0x94, 0xad, 0x42, 0xb5, 0x02, 0x68, 0xeb, 0x87, 0xbb, 0xee, 0xf3, 0x39, 0xf1, 0x4d, 0x3e, 0xfd, 0x93, 0x5e, 0xff, 0x9a, 0x08, - 0x6f, 0x83, 0x7f, 0x25, 0xf4, 0x73, 0xa7, 0xe3, 0xe9, 0xc2, 0x38, 0x1e, 0x66, 0x89, 0x8b, 0xd5, 0xbd, 0x66, 0x17, 0xb4, 0x03, 0xe7, 0x79, 0x0e, 0x80, 0x03, 0x92, 0xae, 0xfb, 0x25, 0x40, 0x01, - 0x40, 0x1e, 0xb1, 0x42, 0xba, 0xdb, 0x4a, 0x1b, 0x54, 0xd9, 0x80, 0x89, 0xc2, 0x92, 0x34, 0x7e, 0x44, 0x56, 0x9d, 0x2a, 0x20, 0xfb, 0x53, 0x5b, 0x4d, 0x63, 0x9b, 0x24, 0x88, 0xf5, 0xfe, 0x88, - 0xae, 0x50, 0x24, 0x5b, 0x92, 0x69, 0x5e, 0x88, 0xf0, 0x30, 0x42, 0xe0, 0x7f, 0x96, 0xaf, 0xe7, 0x8d, 0xd7, 0x7f, 0x93, 0xd0, 0xef, 0xd2, 0xa8, 0x3c, 0x08, 0xba, 0x1d, 0x95, 0xf9, 0xe3, 0xef, - 0xff, 0xdf, 0x7b, 0xb0, 0xf8, 0xed, 0x86, 0x74, 0x9f, 0xc9, 0xe0, 0x41, 0xe9, 0x9a, 0x8f, 0x08, 0xad, 0xb7, 0x2d, 0x0d, 0xbe, 0x3f, 0x5f, 0x3c, 0x96, 0xc9, 0x1f, 0x6c, 0x8c, 0x6e, 0x90, 0xd8, - 0x93, 0xb8, 0x9f, 0xb4, 0xef, 0xf9, 0xc6, 0x88, 0xef, 0xd5, 0x6e, 0xa2, 0xc0, 0xf3, 0xab, 0xb7, 0x37, 0xde, 0x70, 0xbb, 0x96, 0x00, 0xf8, 0xfb, 0x3f, 0xd8, 0x25, 0xc0, 0xe9, 0xcb, 0x5b, 0x59, - 0x90, 0x7c, 0xfc, 0x9a, 0x6f, 0x68, 0xbd, 0x3b, 0xfd, 0x4d, 0x5a, 0xa3, 0x48, 0xbe, 0xf6, 0xe6, 0xfb, 0x4b, 0x5d, 0x3f, 0x31, 0x6c, 0xbb, 0xf8, 0x7c, 0x4e, 0x3c, 0xd9, 0x40, 0xbf, 0x15, 0x19, - 0x7a, 0x54, 0x42, 0xfb, 0x8d, 0x00, 0xf6, 0xfd, 0xb5, 0x9b, 0xd2, 0x3c, 0x37, 0xc4, 0xbf, 0x64, 0x5d, 0xff, 0x3c, 0xc9, 0xbd, 0x3f, 0xbd, 0xdf, 0x49, 0xf2, 0xe7, 0xfb, 0xf2, 0xab, 0x0b, 0x25, - 0x7f, 0x5f, 0x26, 0xf9, 0x04, 0x1a, 0xb9, 0x48, 0xda, 0x79, 0x91, 0x5a, 0x32, 0xbc, 0x5b, 0xa8, 0xaa, 0x01, 0x44, 0xca, 0xbc, 0x9a, 0x1d, 0xd3, 0xcd, 0x91, 0x9e, 0x91, 0xab, 0x60, 0xc6, 0xd9, - 0xd4, 0x9c, 0xa3, 0x8d, 0xe9, 0x79, 0x99, 0xf4, 0x4e, 0x1f, 0x8a, 0x98, 0xa1, 0x73, 0xd8, 0x74, 0x7d, 0x68, 0x36, 0x58, 0xb9, 0xdc, 0x1c, 0x28, 0x3a, 0xe7, 0xa7, 0xfe, 0x6c, 0x0f, 0x93, 0x32, - 0x23, 0x31, 0xb2, 0x89, 0x21, 0xa5, 0x5c, 0x63, 0x1b, 0x3f, 0xb7, 0x47, 0x2c, 0x92, 0xc2, 0xa9, 0xcb, 0x8f, 0x93, 0x2b, 0xf4, 0xdc, 0xd6, 0x72, 0x13, 0x21, 0xf0, 0x08, 0x2c, 0xe2, 0xb5, 0x23, - 0xce, 0x27, 0xd9, 0x37, 0xc0, 0x3e, 0x6f, 0x2e, 0x15, 0x54, 0x47, 0xec, 0x2b, 0x39, 0x97, 0x92, 0x2b, 0xc0, 0xde, 0xcb, 0xf1, 0x02, 0xde, 0x59, 0x26, 0x3a, 0x37, 0x4f, 0x4d, 0xc2, 0x6e, 0x3b, - 0x89, 0x0f, 0x17, 0x31, 0x70, 0x3c, 0x66, 0x0e, 0xea, 0xd1, 0xf5, 0xba, 0x18, 0xce, 0x3b, 0x22, 0x5e, 0x9e, 0xa2, 0xa9, 0x1d, 0x6a, 0x62, 0x0d, 0x73, 0xb6, 0x00, 0xf3, 0x06, 0x02, 0xc2, 0x07, - 0x34, 0xcd, 0xcf, 0xa2, 0x47, 0x06, 0x05, 0x1e, 0x1a, 0x3b, 0x65, 0x0b, 0xcb, 0xe2, 0x29, 0xfb, 0x29, 0x05, 0xfb, 0x63, 0x1c, 0xef, 0xf2, 0xd5, 0x5f, 0x53, 0x9b, 0x3c, 0x13, 0x60, 0x6e, 0x96, - 0xe8, 0x63, 0x3c, 0x5f, 0x29, 0xac, 0xfd, 0x85, 0xee, 0x05, 0xd0, 0xcf, 0xbb, 0x09, 0x31, 0xae, 0x98, 0x36, 0x43, 0x98, 0x4e, 0xa1, 0xd8, 0xcc, 0x16, 0xc0, 0x16, 0x87, 0x53, 0x81, 0x06, 0xd1, - 0x4e, 0xe1, 0x8d, 0x00, 0x8d, 0x23, 0x42, 0x83, 0x73, 0xaa, 0xec, 0xc2, 0x16, 0xc9, 0x5c, 0x67, 0xde, 0xf1, 0x81, 0xa7, 0xc7, 0x06, 0x2d, 0x0d, 0x2b, 0xb0, 0x0d, 0xb7, 0xbb, 0x90, 0x04, 0xbb, - 0xe3, 0x22, 0x5e, 0x5b, 0x8a, 0x66, 0xf5, 0x15, 0x88, 0x81, 0xfd, 0x01, 0x40, 0x50, 0x4e, 0xa7, 0xb7, 0x31, 0xe4, 0x8c, 0x17, 0x05, 0x47, 0x48, 0xe4, 0xb7, 0xf2, 0xf4, 0x03, 0xf6, 0x77, 0x11, - 0x51, 0x2e, 0x63, 0x01, 0x7f, 0xe1, 0x4c, 0x8f, 0x87, 0xe1, 0x57, 0x2d, 0xa1, 0xc7, 0x76, 0xd8, 0x57, 0xea, 0x37, 0x7d, 0x10, 0x7d, 0x1b, 0x80, 0xf7, 0xcb, 0xc9, 0x85, 0xd2, 0xcf, 0xe8, 0x87, - 0xb9, 0xe6, 0xee, 0x32, 0x22, 0x4e, 0xc9, 0x66, 0xd3, 0x0b, 0xee, 0xac, 0x3f, 0x2b, 0x70, 0x43, 0x50, 0x00, 0x7c, 0x40, 0x85, 0xd0, 0x59, 0x38, 0x1b, 0x0c, 0xa0, 0x07, 0x52, 0x2d, 0x8c, 0x80, - 0x83, 0x02, 0x2f, 0x99, 0x41, 0x6d, 0x18, 0x30, 0xc4, 0xca, 0x24, 0x1b, 0x91, 0x53, 0x1a, 0xc1, 0x3d, 0x54, 0xb1, 0x68, 0xa0, 0x0c, 0x7c, 0x4c, 0x05, 0xa9, 0x28, 0xd4, 0xa0, 0xb1, 0x65, 0x3d, - 0x7e, 0xcd, 0x0a, 0xfb, 0x48, 0x73, 0x8d, 0x3c, 0x45, 0xf1, 0x37, 0x20, 0xbe, 0x96, 0x6d, 0xfc, 0x9d, 0xe6, 0x15, 0xc3, 0x0b, 0x84, 0x23, 0x32, 0x8d, 0x43, 0x93, 0x05, 0x80, 0x52, 0xf2, 0x3c, - 0xa8, 0xcb, 0x98, 0x16, 0x52, 0x7c, 0x86, 0x63, 0x51, 0x68, 0x53, 0x92, 0x59, 0xae, 0xb1, 0xf3, 0x77, 0x19, 0xe9, 0x4b, 0x99, 0xb9, 0xc7, 0x52, 0xd2, 0x4b, 0x7a, 0xad, 0x0f, 0xaa, 0xd7, 0x1f, - 0x7e, 0xbd, 0x1e, 0x9b, 0xdd, 0x70, 0x29, 0x2d, 0xcf, 0x91, 0xb8, 0x0e, 0xb0, 0x0a, 0x14, 0xf6, 0x7a, 0x1d, 0xa8, 0x29, 0x35, 0x15, 0xf0, 0xc6, 0x4a, 0x3a, 0x6b, 0x27, 0xf0, 0x58, 0x63, 0xd7, - 0x9e, 0x98, 0xd5, 0x54, 0x1f, 0xe0, 0xe2, 0x69, 0x1d, 0xc0, 0x56, 0xc4, 0xf3, 0x19, 0xd0, 0x79, 0x4b, 0xbf, 0xde, 0x1b, 0xcc, 0x02, 0x18, 0xd6, 0x5e, 0x82, 0x40, 0xac, 0x0d, 0x23, 0x98, 0x82, - 0x60, 0x2e, 0xc1, 0xf4, 0xe7, 0xb3, 0xd1, 0xbe, 0x36, 0xfa, 0x5f, 0xf2, 0x2a, 0xfc, 0xfd, 0x9f, 0xdb, 0x2c, 0x0a, 0x0f, 0xdd, 0xf2, 0xaf, 0xcb, 0x70, 0xf6, 0xf5, 0xa5, 0x38, 0x88, 0xaf, 0xe1, - 0xf0, 0x5f, 0xce, 0xe0, 0x4f, 0xec, 0x16, 0x37, 0x35, 0xfd, 0xfe, 0xc5, 0x63, 0xcc, 0x27, 0xd9, 0xf7, 0xd1, 0xb8, 0xde, 0x8c, 0x3d, 0xb4, 0x80, 0x4b, 0x4b, 0x24, 0xdb, 0xc5, 0x6a, 0x39, 0xec, - 0x1a, 0x37, 0x38, 0x97, 0x44, 0x1a, 0x6f, 0x01, 0x31, 0xd0, 0xb6, 0x54, 0x40, 0x03, 0xd2, 0xc0, 0xa2, 0xbc, 0xd5, 0x42, 0x72, 0x24, 0xa7, 0xeb, 0xc4, 0x97, 0x3b, 0xda, 0xda, 0xb3, 0x61, 0x05, - 0xf2, 0x44, 0x37, 0x6b, 0x97, 0x26, 0x58, 0xe3, 0x1c, 0x53, 0xcf, 0x0e, 0x26, 0x39, 0x53, 0xd6, 0x48, 0xd2, 0x55, 0xd1, 0x0a, 0x5b, 0x10, 0x66, 0x23, 0xbf, 0xb6, 0xb9, 0xfc, 0xf2, 0xc1, 0x79, - 0x60, 0x49, 0xf5, 0x9d, 0x2e, 0x0d, 0xec, 0xc7, 0xbc, 0x30, 0x4d, 0xac, 0x8f, 0xe5, 0xfb, 0x6d, 0x0c, 0x6f, 0x2b, 0x1e, 0x3e, 0x1b, 0x96, 0xd6, 0x28, 0xec, 0xa7, 0xee, 0x5d, 0xe0, 0x6b, 0xa7, - 0xa7, 0x0f, 0xaa, 0xd7, 0x41, 0xb9, 0x5e, 0x4f, 0xc0, 0x71, 0xe7, 0x27, 0xb3, 0x3e, 0xae, 0x41, 0x37, 0x9b, 0x57, 0x47, 0x46, 0x94, 0x16, 0x1c, 0x25, 0x3a, 0xb8, 0x4f, 0xc3, 0xd8, 0xac, 0x5a, - 0xd6, 0xe6, 0x2a, 0x3d, 0xee, 0x4c, 0x54, 0x3f, 0x50, 0xf8, 0xa1, 0xdb, 0x9f, 0x98, 0x43, 0x0b, 0x7b, 0x9c, 0xd5, 0x32, 0x29, 0xd9, 0xf6, 0x86, 0x19, 0x0d, 0xfb, 0x81, 0xa3, 0xb0, 0x81, 0xec, - 0x28, 0x72, 0x07, 0xb1, 0x87, 0xf0, 0x3c, 0x3d, 0x54, 0xf8, 0x5e, 0x22, 0x0d, 0x2d, 0xbd, 0x3f, 0x5f, 0x97, 0xff, 0x14, 0x8e, 0x11, 0x65, 0xbf, 0x73, 0xfa, 0x7d, 0x89, 0x3b, 0xfc, 0xa2, 0xfb, - 0xd6, 0xf9, 0x5f, 0x77, 0x63, 0xb4, 0xdb, 0xd0, 0x64, 0x25, 0x88, 0xd5, 0x56, 0xdc, 0x9f, 0x42, 0x36, 0xa3, 0x60, 0x30, 0x4d, 0xfc, 0x59, 0x39, 0x17, 0x8e, 0xb1, 0x8c, 0x9f, 0x47, 0xa4, 0xc0, - 0xfd, 0x12, 0xc0, 0xf5, 0x78, 0x85, 0xbd, 0x92, 0xd4, 0xfd, 0x83, 0xe8, 0xa5, 0x37, 0xef, 0x06, 0x31, 0x78, 0x5c, 0x72, 0xf7, 0x2e, 0xc8, 0xf7, 0xc2, 0x11, 0xed, 0x28, 0x87, 0x91, 0xea, 0x39, - 0x59, 0x2b, 0x31, 0xe0, 0xae, 0x8e, 0xd6, 0x86, 0xf3, 0xd8, 0xf9, 0x3e, 0xe0, 0xe6, 0x3c, 0xe0, 0xa8, 0x41, 0x2f, 0x11, 0x61, 0xe9, 0x9d, 0x16, 0x39, 0x64, 0x9e, 0x4f, 0xbd, 0x57, 0x81, 0x60, - 0x4a, 0x89, 0x69, 0x3b, 0x27, 0x96, 0x76, 0x95, 0x71, 0x8c, 0x61, 0xf0, 0x1e, 0x5b, 0xcd, 0x20, 0x98, 0x27, 0x0d, 0x13, 0xa0, 0xe9, 0x67, 0x51, 0xe7, 0x9f, 0x4d, 0xe9, 0xc5, 0x09, 0xe5, 0x22, - 0x5e, 0xdc, 0x03, 0xf4, 0xcd, 0xed, 0xe5, 0x5f, 0xd4, 0xd4, 0x7d, 0xa5, 0xfc, 0x06, 0xd5, 0xd7, 0xfb, 0xb1, 0x3a, 0xba, 0x7e, 0x93, 0x36, 0xd4, 0xb0, 0x57, 0x51, 0xb2, 0x5c, 0xcd, 0xb4, 0x08, - 0x9b, 0xb9, 0xe2, 0x42, 0xd9, 0x62, 0x65, 0x23, 0xee, 0x6a, 0x23, 0x30, 0xf9, 0x4e, 0x15, 0xb6, 0xab, 0x5d, 0x3c, 0xe7, 0x4c, 0xa9, 0x5e, 0x14, 0xe0, 0xde, 0x85, 0xd8, 0x80, 0x4f, 0xb3, 0xf5, - 0x9e, 0x3c, 0x04, 0xab, 0x30, 0xd0, 0xe6, 0x0b, 0xd3, 0x35, 0x0c, 0x78, 0xe5, 0xe3, 0x66, 0xe1, 0x08, 0x38, 0x75, 0x38, 0x49, 0x1b, 0xf0, 0xce, 0xb0, 0xf1, 0xdd, 0xb1, 0xe7, 0xdf, 0x03, 0xe1, - 0x86, 0xf2, 0x74, 0x72, 0x7b, 0x3f, 0x16, 0x84, 0xb3, 0xa2, 0x17, 0xc9, 0x69, 0x8f, 0xc2, 0xc2, 0x22, 0x58, 0x52, 0xf0, 0xc6, 0x83, 0xcc, 0xf5, 0x6c, 0x08, 0xd3, 0xcd, 0x9e, 0xf3, 0x3a, 0xa5, - 0xd5, 0x16, 0x4b, 0xe7, 0x60, 0xb7, 0x1a, 0x2e, 0x35, 0x53, 0x8b, 0x13, 0x9d, 0x75, 0x66, 0xa5, 0x2a, 0x9a, 0xa9, 0x8c, 0xcb, 0xca, 0xdd, 0x81, 0x3d, 0xa5, 0x54, 0x91, 0x14, 0xcb, 0x02, 0x76, - 0xc8, 0xb2, 0x48, 0xa8, 0xae, 0x5b, 0x6f, 0x0a, 0x43, 0x24, 0xc7, 0x48, 0xa7, 0x3f, 0xbb, 0x44, 0xfd, 0x91, 0x0f, 0xd3, 0x93, 0x53, 0xc1, 0x53, 0x9f, 0xa9, 0x7f, 0x8f, 0x05, 0x3d, 0xfe, 0xc4, - 0xfb, 0x78, 0xdc, 0x3f, 0x18, 0xc3, 0x98, 0xde, 0x06, 0x06, 0x5e, 0xc6, 0x36, 0x03, 0x69, 0xcd, 0x46, 0x08, 0xf4, 0x2c, 0xaa, 0x16, 0x07, 0xef, 0x5c, 0x07, 0x72, 0xd2, 0xd7, 0xe7, 0xa1, 0xdb, - 0x4f, 0x8f, 0xf8, 0x81, 0xde, 0xaa, 0x08, 0xc4, 0x3a, 0xc8, 0x7c, 0x0d, 0x1d, 0x72, 0xcc, 0x04, 0x45, 0x98, 0xf7, 0x55, 0x8c, 0x94, 0xd9, 0x80, 0x6c, 0xf4, 0x8c, 0xa7, 0x85, 0x93, 0x9d, 0x27, - 0x00, 0xb4, 0xb1, 0x0c, 0xaa, 0x4d, 0x06, 0x49, 0xc2, 0x9a, 0x45, 0x38, 0xe2, 0xf4, 0xfa, 0x83, 0xbf, 0xdb, 0x33, 0x3f, 0xb5, 0xc7, 0xe8, 0x5f, 0x83, 0x4f, 0x1f, 0x1f, 0xc6, 0x5e, 0x49, 0xb9, - 0xff, 0x46, 0xf0, 0x0d, 0xd9, 0x28, 0x35, 0x27, 0xc4, 0xb8, 0xc4, 0xfa, 0x5c, 0x43, 0x93, 0xcb, 0xc3, 0xc0, 0xef, 0x4c, 0xc7, 0x5b, 0x1e, 0x12, 0x8d, 0xc7, 0x64, 0xd9, 0xdd, 0x6e, 0x82, 0x42, - 0xf2, 0x50, 0x40, 0x6d, 0xf7, 0xca, 0xda, 0x10, 0x5c, 0x41, 0xd2, 0xc0, 0xad, 0x93, 0x74, 0x87, 0xa6, 0xd9, 0xb0, 0x3c, 0x22, 0x23, 0xd3, 0x8a, 0x12, 0x44, 0x7e, 0x53, 0x4f, 0x23, 0xa6, 0x53, - 0x35, 0x51, 0x8f, 0x33, 0x35, 0x92, 0x19, 0x27, 0xa7, 0x36, 0x36, 0x3b, 0xcc, 0x77, 0xaf, 0xc9, 0x1c, 0xb7, 0x9b, 0xe0, 0x03, 0xd9, 0x22, 0x48, 0xdc, 0x8b, 0x22, 0xe9, 0xb1, 0x54, 0xf2, 0xb5, - 0x5c, 0xca, 0xb7, 0x1a, 0xcc, 0xf7, 0xee, 0x9d, 0x5f, 0x1e, 0x7f, 0x91, 0x58, 0xbe, 0xa9, 0x85, 0x2e, 0x1b, 0x65, 0x70, 0x71, 0xc6, 0x4c, 0xa3, 0xba, 0xfa, 0xaa, 0xfc, 0x7a, 0x3a, 0x9e, 0xbf, - 0x82, 0x92, 0x1f, 0x1b, 0xda, 0x5e, 0x31, 0x12, 0x7c, 0xa1, 0xfb, 0x31, 0xba, 0xd7, 0xbb, 0x09, 0x36, 0xce, 0x48, 0x40, 0x71, 0x1b, 0x4f, 0x14, 0x16, 0x4e, 0x16, 0x6c, 0xb5, 0x96, 0x47, 0xa8, - 0x63, 0xb2, 0xee, 0x00, 0xec, 0x94, 0x48, 0x35, 0xcc, 0xcc, 0x35, 0x7b, 0x30, 0xd7, 0x3c, 0x8a, 0x39, 0xbb, 0x16, 0x6a, 0x0a, 0x64, 0x98, 0x23, 0x8d, 0xbe, 0x73, 0x7a, 0xc7, 0x86, 0xca, 0x05, - 0xe9, 0x27, 0xa6, 0xc5, 0x59, 0xe4, 0x54, 0x2c, 0xf6, 0xfd, 0x1e, 0x3b, 0xf2, 0x42, 0x71, 0x5e, 0x0f, 0xa8, 0x21, 0x92, 0x7a, 0xfa, 0x9a, 0x9c, 0xff, 0x25, 0xe6, 0xfa, 0x3f, 0xe8, 0x73, 0xc6, - 0x74, 0x65, 0x6e, 0xcf, 0xb8, 0xd0, 0x9f, 0x1f, 0x91, 0x7d, 0xe3, 0x4d, 0x64, 0x78, 0xe3, 0x8c, 0xd0, 0xb8, 0x64, 0x0f, 0x2e, 0x6c, 0x37, 0x1c, 0x78, 0x92, 0x71, 0xce, 0x09, 0x89, 0xe3, 0x59, - 0xd9, 0xae, 0x0b, 0xc7, 0x0f, 0xcd, 0x61, 0x4f, 0x85, 0xab, 0x0c, 0x9b, 0x9e, 0x58, 0x3e, 0xc3, 0x2a, 0x29, 0x53, 0x36, 0x27, 0x74, 0xcb, 0x30, 0x3a, 0x0b, 0x4d, 0xe7, 0x9d, 0xb9, 0x3a, 0x56, - 0xee, 0xb4, 0x0c, 0x28, 0x58, 0x54, 0x24, 0x07, 0x24, 0x2d, 0x83, 0x8e, 0x4f, 0x95, 0xa6, 0x0d, 0xca, 0x72, 0x63, 0xce, 0x45, 0x74, 0x8c, 0x0a, 0xf9, 0x19, 0xe3, 0x7f, 0x86, 0xd2, 0x97, 0x5a, - 0x62, 0xcf, 0xd0, 0xfa, 0xf3, 0xad, 0xf3, 0x0b, 0xdd, 0x77, 0xd4, 0xde, 0xef, 0xc6, 0xda, 0xfa, 0x77, 0xe2, 0x5c, 0x84, 0x77, 0xa1, 0x79, 0x98, 0x4b, 0x2e, 0x0e, 0xcf, 0x88, 0xed, 0xd2, 0x5c, - 0x0e, 0xcd, 0xd6, 0x73, 0xab, 0xf3, 0x0a, 0xcb, 0x57, 0xe7, 0x78, 0x91, 0x92, 0x3e, 0x7d, 0xcc, 0xa8, 0x81, 0xf5, 0x65, 0x2e, 0xda, 0x02, 0x7e, 0x37, 0xb3, 0x6d, 0x54, 0x16, 0x4b, 0x10, 0x14, - 0xbd, 0x52, 0x3e, 0xb4, 0x16, 0x8a, 0x43, 0xc4, 0x96, 0x3c, 0x07, 0x98, 0x56, 0x2d, 0x17, 0xd1, 0x1e, 0x76, 0xdd, 0x3b, 0xd9, 0xe1, 0x76, 0xa3, 0xfb, 0x57, 0x27, 0xcb, 0x07, 0xdd, 0xf7, 0xee, - 0xbf, 0xdf, 0x8d, 0x9d, 0x3c, 0x11, 0xb2, 0x5b, 0xd4, 0x2b, 0x7c, 0xef, 0xd1, 0x87, 0x56, 0xa2, 0xd9, 0xb3, 0xad, 0xad, 0x97, 0x81, 0xaf, 0x85, 0x15, 0x96, 0x1d, 0x79, 0x73, 0xe9, 0xa1, 0x78, - 0x51, 0x45, 0x71, 0x22, 0xf2, 0x91, 0x6c, 0x7a, 0xf1, 0x7c, 0xb6, 0xe3, 0x36, 0x05, 0xbb, 0x35, 0x35, 0x6d, 0x35, 0x17, 0xcd, 0x84, 0x37, 0xb6, 0x4e, 0xb7, 0x67, 0xab, 0x80, 0xe7, 0x66, 0x7e, - 0xec, 0x1c, 0xc3, 0xe3, 0x00, 0x4b, 0x36, 0xf0, 0xb0, 0xfb, 0xb7, 0xce, 0x94, 0xff, 0xde, 0xae, 0xfd, 0x8d, 0xf6, 0x3b, 0x0c, 0x5f, 0x5a, 0xc6, 0xee, 0xd3, 0xe7, 0x55, 0x68, 0x89, 0x07, 0x3f, - 0x89, 0xd6, 0x27, 0xe8, 0xdc, 0xa7, 0xeb, 0x33, 0xc1, 0xa9, 0xac, 0x68, 0xb4, 0x0c, 0xb6, 0xe5, 0xcc, 0xe9, 0x6e, 0x90, 0x2d, 0xac, 0x25, 0xe7, 0x20, 0xec, 0x73, 0x12, 0x07, 0xda, 0xee, 0xea, - 0x18, 0x9a, 0x8c, 0xc0, 0x36, 0x1e, 0x64, 0xe3, 0x96, 0x8b, 0x30, 0xa6, 0x23, 0xc7, 0x95, 0x4c, 0x9e, 0x4c, 0xf3, 0x84, 0xe4, 0x83, 0x0e, 0x4b, 0x8e, 0x4f, 0x12, 0xca, 0x08, 0x01, 0xea, 0x71, - 0x15, 0xbd, 0xc7, 0xab, 0xe8, 0xe3, 0x38, 0xfb, 0x2f, 0xc2, 0x77, 0x21, 0xf9, 0x86, 0xda, 0xe5, 0x62, 0x2c, 0x58, 0xc2, 0x6a, 0x77, 0x02, 0x2b, 0x43, 0x11, 0x38, 0xbd, 0x6a, 0x36, 0xc7, 0x0d, - 0x65, 0xcf, 0x17, 0xbe, 0x53, 0xc6, 0xa9, 0xa7, 0x17, 0x55, 0xad, 0x36, 0x27, 0xa5, 0x5c, 0x31, 0xba, 0x74, 0x86, 0x45, 0x19, 0x30, 0x92, 0x32, 0xcb, 0x75, 0xb8, 0xd9, 0x27, 0xe9, 0xce, 0x23, - 0x36, 0x4b, 0x08, 0x90, 0xcf, 0x10, 0x7e, 0x80, 0x48, 0x8a, 0x0f, 0x2c, 0x68, 0x5e, 0xaf, 0x66, 0xe6, 0x62, 0x66, 0xc1, 0x31, 0x36, 0x26, 0xd4, 0xf8, 0x57, 0x0e, 0x99, 0xc7, 0x18, 0xbc, 0xe2, - 0x4a, 0xfb, 0x4e, 0x73, 0x3a, 0xf9, 0xb8, 0x1a, 0xeb, 0x3a, 0x6b, 0x5b, 0x7d, 0xee, 0xd3, 0x8d, 0x0a, 0x2d, 0x50, 0x3c, 0x52, 0x75, 0xeb, 0x94, 0x2f, 0x32, 0x16, 0x58, 0x55, 0xfb, 0xa3, 0x70, - 0xb2, 0x37, 0xfb, 0x03, 0x3e, 0xa5, 0x5d, 0x2c, 0x2c, 0xe1, 0x21, 0xad, 0xe5, 0x32, 0x5f, 0x13, 0x1b, 0xbc, 0x5c, 0x75, 0x41, 0xb5, 0x59, 0x00, 0x04, 0xab, 0xb1, 0x30, 0xc9, 0xda, 0x2a, 0xb7, - 0x63, 0xec, 0x9a, 0x1c, 0x76, 0x68, 0xb9, 0x4a, 0xd2, 0x93, 0x90, 0xe4, 0xc6, 0xdd, 0xea, 0x79, 0x8f, 0x56, 0x31, 0xfb, 0x89, 0xed, 0xb8, 0x46, 0x1d, 0xfd, 0xbb, 0x9e, 0x54, 0x77, 0xd4, 0xdf, - 0x60, 0xf8, 0xde, 0x36, 0x86, 0x9b, 0x42, 0x13, 0x71, 0x9f, 0x55, 0x56, 0x63, 0xae, 0x53, 0x7c, 0x46, 0xe5, 0x06, 0xc4, 0x62, 0xa9, 0x5d, 0xa0, 0x68, 0xe0, 0xb0, 0xed, 0x79, 0xc4, 0xc0, 0xfe, - 0x12, 0x99, 0x9e, 0x75, 0xee, 0xcf, 0xf3, 0xb5, 0x7e, 0x10, 0x7d, 0xeb, 0xd3, 0xfb, 0xe5, 0xa5, 0x2b, 0x3f, 0xe4, 0x6d, 0x85, 0x26, 0xa2, 0x09, 0x85, 0x7b, 0xdb, 0x15, 0x76, 0x42, 0xbb, 0x6d, - 0xb6, 0x4b, 0x76, 0xc9, 0x28, 0xb8, 0xa7, 0x28, 0x90, 0xe9, 0x3e, 0xee, 0xca, 0x0f, 0x6b, 0xfc, 0xb9, 0xe4, 0xf6, 0x63, 0x40, 0xd4, 0x17, 0x61, 0xf1, 0x99, 0x0a, 0xf9, 0xcf, 0x83, 0xcc, 0x3e, - 0x88, 0x5e, 0x70, 0xb9, 0x5e, 0x5e, 0x94, 0xc8, 0x23, 0xc2, 0xcc, 0xce, 0xd3, 0x66, 0x6d, 0xa8, 0xe8, 0x54, 0x8b, 0x0c, 0x44, 0x19, 0xfa, 0xfd, 0xa2, 0x91, 0x04, 0x4e, 0xd5, 0x9c, 0x0d, 0xd3, - 0xe4, 0x1c, 0x5b, 0x25, 0xf9, 0xdc, 0xae, 0x07, 0x89, 0xc9, 0x86, 0x4c, 0xd0, 0x07, 0xaa, 0x3c, 0xb3, 0x7b, 0x5f, 0x87, 0x59, 0x60, 0x99, 0xcc, 0x03, 0x71, 0x4f, 0x0e, 0x6b, 0x31, 0xdd, 0xac, - 0x9c, 0x7d, 0xa6, 0xb2, 0x9d, 0x81, 0xda, 0x9a, 0xa3, 0x6f, 0x84, 0xdc, 0x69, 0xef, 0x3c, 0xc2, 0x82, 0x6f, 0xc1, 0x2b, 0xff, 0xde, 0x96, 0x79, 0x43, 0xf9, 0xd2, 0xff, 0x2f, 0xf7, 0x63, 0xb7, - 0x4d, 0x0e, 0xa4, 0xe7, 0xd0, 0x76, 0x31, 0x2d, 0xf9, 0x5e, 0x8f, 0x08, 0x6b, 0x93, 0x12, 0xb3, 0x04, 0xb3, 0x8f, 0x84, 0x23, 0x8b, 0x6d, 0x9b, 0x69, 0x7c, 0xa0, 0x1e, 0x7d, 0x69, 0x38, 0x74, - 0xfa, 0x89, 0xda, 0xcb, 0xf5, 0x7c, 0xd6, 0x44, 0xc9, 0x71, 0xd5, 0xef, 0x3a, 0xbb, 0x38, 0x49, 0xe9, 0xb9, 0xc4, 0x55, 0x7e, 0x77, 0x4a, 0x56, 0xae, 0x39, 0x18, 0x27, 0x1b, 0x53, 0x76, 0xa1, - 0xef, 0x79, 0xc0, 0x18, 0x9f, 0xf9, 0xc7, 0x87, 0xb6, 0x9b, 0x09, 0xf5, 0xf4, 0xb0, 0x5d, 0x06, 0xb6, 0x33, 0xb1, 0x7c, 0x23, 0x49, 0x9c, 0x5f, 0xde, 0xf2, 0x4f, 0x4c, 0x9a, 0x41, 0x66, 0xd8, - 0x76, 0xf1, 0xcf, 0x6f, 0x72, 0x53, 0x92, 0xaf, 0xb0, 0x9a, 0x0f, 0xaa, 0x6f, 0xb0, 0x7f, 0x5c, 0x4f, 0x2e, 0xb4, 0x7e, 0x86, 0x1c, 0x64, 0x37, 0x53, 0x1c, 0x24, 0xba, 0xb4, 0x13, 0xa5, 0x94, - 0x21, 0xd6, 0xe1, 0x01, 0x5a, 0xb9, 0xa2, 0xb9, 0x4b, 0x65, 0x10, 0x30, 0x2b, 0x29, 0xb0, 0xc2, 0x52, 0x10, 0x15, 0x21, 0xf2, 0xa7, 0xbe, 0xde, 0x9f, 0x0f, 0x33, 0x36, 0x8b, 0xf7, 0x2e, 0x51, - 0x6b, 0x2d, 0xaf, 0x20, 0x47, 0xc0, 0x38, 0xeb, 0xf8, 0x71, 0xda, 0x42, 0x33, 0x3d, 0x52, 0x45, 0x66, 0xae, 0xa9, 0x81, 0x26, 0xf3, 0x1c, 0x72, 0xe7, 0x1e, 0xf2, 0x2d, 0xba, 0xfb, 0x99, 0x8e, - 0xe7, 0xcf, 0xf7, 0xd9, 0xaf, 0x84, 0xaf, 0x51, 0x33, 0x9f, 0xb7, 0x63, 0x9d, 0xc3, 0xa1, 0x4d, 0x88, 0x46, 0xdc, 0x9e, 0x8f, 0xa6, 0xdd, 0x1c, 0x3b, 0xcf, 0xe9, 0x84, 0xd8, 0x00, 0x26, 0x5c, - 0x55, 0xfc, 0x9e, 0x35, 0x66, 0xe5, 0xe0, 0x2f, 0x37, 0x85, 0x4a, 0xd7, 0xaa, 0x40, 0x4f, 0x53, 0x07, 0x61, 0xb6, 0x3b, 0x69, 0xe7, 0xe7, 0xbe, 0xb7, 0x2e, 0xb3, 0xd6, 0xeb, 0xd7, 0x36, 0xbe, - 0xe7, 0xfa, 0x76, 0x2e, 0xe7, 0xa7, 0x46, 0x0b, 0xac, 0x15, 0x01, 0x47, 0x67, 0x8f, 0x4e, 0x36, 0xcc, 0x88, 0x12, 0x03, 0xf7, 0x8a, 0x84, 0x27, 0xa7, 0xca, 0xaf, 0x65, 0x0b, 0x9f, 0x2d, 0xd8, - 0x3f, 0x3f, 0x53, 0x7e, 0x52, 0xbd, 0xc2, 0x76, 0xbd, 0x1e, 0x9b, 0xb8, 0x0d, 0xdc, 0x9e, 0x30, 0x40, 0xe4, 0x16, 0xc2, 0x79, 0x63, 0x0f, 0xe1, 0x9c, 0x25, 0xcd, 0x9a, 0x3a, 0x5a, 0xa7, 0x19, - 0x88, 0xd2, 0x76, 0x4d, 0x50, 0xa0, 0xe0, 0x54, 0x78, 0xc9, 0x04, 0xc8, 0x2a, 0x88, 0x97, 0x64, 0xe2, 0xe0, 0x31, 0x3a, 0x5f, 0x0b, 0xba, 0x7b, 0x4c, 0x80, 0x83, 0x1e, 0xa8, 0xe6, 0xfc, 0x8c, - 0xae, 0x50, 0x35, 0x66, 0x5c, 0x5a, 0xdf, 0x04, 0xd9, 0x2e, 0x24, 0x33, 0x75, 0x66, 0x8b, 0xf7, 0x3b, 0xf4, 0xf7, 0x14, 0x5e, 0xcf, 0x0c, 0x35, 0x2f, 0xcd, 0x9b, 0x2f, 0xa4, 0x3f, 0x20, 0xf8, - 0x6c, 0xb8, 0x18, 0x6c, 0x46, 0xcc, 0x1d, 0x7d, 0xbf, 0x3c, 0x6a, 0x4e, 0x89, 0x67, 0x74, 0x6f, 0xf7, 0xf5, 0x3a, 0xb0, 0x4b, 0x87, 0xe0, 0x4a, 0xa6, 0xab, 0xcc, 0x0d, 0xa1, 0x9c, 0x1c, 0x79, - 0x99, 0x0e, 0xde, 0x71, 0xea, 0x11, 0x85, 0x0d, 0x76, 0x72, 0x10, 0x6b, 0x87, 0xa8, 0xd1, 0x8f, 0xcb, 0x29, 0x0b, 0xef, 0x3d, 0x5d, 0x0a, 0x95, 0x9e, 0x80, 0xb1, 0x8d, 0xeb, 0x44, 0x3b, 0xe7, - 0x64, 0x2d, 0xf7, 0x24, 0x11, 0xc7, 0xd5, 0x71, 0xad, 0xbe, 0x76, 0xae, 0x7e, 0x94, 0xfe, 0xf5, 0xb7, 0x96, 0xe8, 0x47, 0xe5, 0x2e, 0xff, 0x3d, 0xe5, 0xeb, 0x1d, 0xf5, 0x77, 0x8c, 0x6f, 0xda, - 0xc6, 0x2a, 0x61, 0x4d, 0xd5, 0x16, 0x94, 0xf3, 0x72, 0x31, 0x97, 0x37, 0x94, 0xb5, 0x38, 0x3b, 0x0c, 0x54, 0x27, 0xed, 0x76, 0xb7, 0xc9, 0x74, 0xcd, 0x30, 0xb0, 0x53, 0x53, 0xf7, 0x9e, 0xd8, - 0x8b, 0x53, 0x0b, 0x8e, 0x5c, 0x02, 0x22, 0x63, 0x89, 0xd5, 0x69, 0x19, 0x93, 0x6d, 0xfa, 0x18, 0x65, 0x36, 0x08, 0xc9, 0x21, 0x45, 0x7b, 0xb1, 0x32, 0x3b, 0xba, 0xb9, 0xc1, 0x03, 0xf1, 0xd1, - 0x38, 0xf1, 0x76, 0x31, 0x3d, 0xbc, 0xb4, 0x44, 0x9f, 0x9c, 0x20, 0x6e, 0x4d, 0xd7, 0xcf, 0x44, 0xe8, 0x17, 0x04, 0x8a, 0x5f, 0x74, 0xaf, 0xf8, 0x7d, 0xdc, 0x5d, 0x44, 0xe9, 0x11, 0x62, 0x45, - 0x52, 0xd6, 0x6d, 0xd5, 0xe9, 0xee, 0x5e, 0xc5, 0x09, 0xae, 0xe8, 0x23, 0x72, 0xb7, 0x10, 0x80, 0x3a, 0x4b, 0x16, 0xa0, 0x0e, 0xce, 0xbd, 0xac, 0x4d, 0xaa, 0x4c, 0x9c, 0x91, 0x31, 0xc4, 0x4c, - 0xa5, 0xdd, 0x0a, 0x1c, 0x0e, 0xee, 0xe0, 0xee, 0xf6, 0xa7, 0x29, 0xa9, 0x18, 0x53, 0x7c, 0xaf, 0x97, 0x21, 0x68, 0x58, 0xd9, 0x32, 0xa4, 0x38, 0x90, 0x5d, 0x41, 0x9d, 0x84, 0xeb, 0xf6, 0x2e, - 0x22, 0xb1, 0x3b, 0xeb, 0xd5, 0x5d, 0x48, 0xd9, 0x33, 0x36, 0xf5, 0x12, 0x02, 0x5f, 0x48, 0x5f, 0x41, 0xf8, 0xd2, 0x30, 0x36, 0x8a, 0x7f, 0x6a, 0xa2, 0xfa, 0xa9, 0x5c, 0x13, 0x3a, 0xa6, 0x9e, - 0xaa, 0x4d, 0x57, 0x4e, 0x7d, 0x52, 0x99, 0x25, 0x8d, 0xbb, 0xf3, 0x44, 0xaa, 0x67, 0x35, 0xbb, 0x5a, 0x2b, 0xc2, 0xce, 0xcc, 0x7b, 0x3c, 0xa4, 0xa0, 0xc0, 0x8a, 0xbd, 0xd0, 0x9d, 0x29, 0x8b, - 0x54, 0x62, 0x3d, 0x47, 0x44, 0xdb, 0x1e, 0xab, 0x34, 0x83, 0x77, 0xf8, 0xb4, 0x1e, 0x56, 0x7b, 0xea, 0x60, 0x26, 0x21, 0x89, 0x5a, 0xb0, 0x7e, 0x7f, 0x20, 0x0f, 0xca, 0xb7, 0xf5, 0xf7, 0x1b, - 0xad, 0xee, 0x6b, 0x56, 0xe5, 0x5f, 0x64, 0xaf, 0xfd, 0x7f, 0xbf, 0x19, 0x6b, 0x55, 0x16, 0x4d, 0xd6, 0xa4, 0x0e, 0xe7, 0x03, 0x0e, 0x22, 0xa7, 0x00, 0x0d, 0x97, 0x7a, 0x83, 0x92, 0x3b, 0xe7, - 0xb4, 0xdd, 0x27, 0x68, 0xbf, 0x6e, 0x4b, 0x73, 0xd0, 0xdb, 0xb4, 0x58, 0xa6, 0xfd, 0x32, 0xa8, 0xab, 0xf2, 0x80, 0x24, 0x5b, 0xcd, 0x36, 0x39, 0x04, 0x1f, 0x5c, 0x7f, 0xbd, 0xc5, 0x85, 0x25, - 0x9d, 0x71, 0xfa, 0x66, 0x75, 0xa6, 0xab, 0x24, 0xc7, 0xb6, 0xc7, 0x2e, 0x6e, 0x22, 0x24, 0x2c, 0xd3, 0x31, 0x79, 0x1c, 0x9e, 0xd5, 0x9f, 0x7e, 0x7a, 0xca, 0x7a, 0x89, 0x8f, 0xdf, 0x7f, 0xe2, - 0x8a, 0xd2, 0x7d, 0xfb, 0xf5, 0xb8, 0x35, 0x82, 0xad, 0x87, 0xe5, 0x32, 0xec, 0xc9, 0x08, 0xe9, 0x03, 0x75, 0x29, 0x00, 0x7c, 0xa9, 0xda, 0xf1, 0xbc, 0x5d, 0xf2, 0x16, 0xd7, 0x19, 0xaa, 0xb2, - 0x2b, 0x33, 0xd6, 0xce, 0xa2, 0x95, 0x7c, 0xda, 0x90, 0x4d, 0x0e, 0x05, 0xba, 0xb7, 0x71, 0xce, 0xce, 0x02, 0xdc, 0x41, 0x38, 0x91, 0x3b, 0xf5, 0x0c, 0xb7, 0x06, 0xc1, 0xe8, 0x1c, 0x1b, 0xc9, - 0xa7, 0xf2, 0x50, 0xb7, 0x60, 0xd9, 0xee, 0xc0, 0xa0, 0xd8, 0xcd, 0x46, 0xc8, 0xa1, 0x3f, 0x46, 0xc7, 0xde, 0x71, 0x9d, 0xdf, 0xcc, 0x35, 0xf4, 0x35, 0x39, 0xfe, 0x4a, 0xf3, 0x1d, 0xc2, 0xb7, - 0x59, 0x86, 0x8e, 0x93, 0xdd, 0x3b, 0x27, 0x12, 0x8d, 0x9e, 0x61, 0x10, 0x5c, 0xf7, 0x96, 0x84, 0xae, 0xf8, 0x51, 0x40, 0x64, 0x0a, 0x82, 0xfa, 0x07, 0xf3, 0x10, 0xcd, 0xb8, 0xb0, 0xc1, 0xd8, - 0x53, 0x7c, 0xde, 0xd2, 0xa8, 0x3f, 0xb7, 0x69, 0xa4, 0xf2, 0x67, 0x92, 0x7b, 0x26, 0x1b, 0xcd, 0x28, 0x77, 0x7b, 0x20, 0x56, 0x15, 0x4e, 0xf7, 0x57, 0x67, 0x4f, 0x77, 0x3b, 0x7f, 0x27, 0x26, - 0x45, 0x7b, 0x2c, 0x50, 0x27, 0x12, 0xc5, 0xd7, 0xf2, 0x64, 0xdc, 0x2c, 0xc3, 0x8f, 0x58, 0x8c, 0x67, 0x08, 0x7e, 0x0f, 0xc4, 0x7f, 0x76, 0x1a, 0x7c, 0x49, 0xc2, 0xba, 0x21, 0x7e, 0xc5, 0xf4, - 0xa6, 0xe9, 0x72, 0x3a, 0x1c, 0x21, 0x6f, 0xd9, 0xf9, 0xb6, 0x31, 0x8a, 0x9d, 0xd1, 0xaa, 0xe5, 0xca, 0x3c, 0xd0, 0xce, 0x56, 0x21, 0x06, 0x6a, 0x98, 0x6d, 0xaa, 0x2d, 0x69, 0xd9, 0xf0, 0x4c, - 0xab, 0xdd, 0xba, 0x5e, 0x0d, 0x3e, 0xb8, 0x9e, 0x65, 0x07, 0x26, 0xdc, 0xee, 0x13, 0x0d, 0x9c, 0xd1, 0x0d, 0x51, 0x6a, 0x2a, 0x5c, 0xaf, 0x30, 0x39, 0x13, 0xb8, 0x36, 0x70, 0x28, 0x87, 0x5b, - 0x76, 0x4b, 0x8d, 0x52, 0x14, 0xb7, 0x26, 0x74, 0x5d, 0x7e, 0xc4, 0xbe, 0xae, 0x95, 0xad, 0x9f, 0xc0, 0x40, 0xbc, 0xa4, 0x0a, 0xfb, 0xa4, 0xfa, 0xde, 0xff, 0x6b, 0xed, 0x6c, 0x62, 0x9c, 0x42, - 0x0c, 0x85, 0x16, 0x81, 0x7b, 0xf6, 0x70, 0x67, 0x26, 0xf5, 0x91, 0x98, 0xd9, 0x95, 0x94, 0x39, 0xbb, 0xd3, 0x3e, 0x6f, 0xc4, 0xf9, 0xf2, 0x34, 0x48, 0x55, 0xc5, 0x34, 0xcb, 0x23, 0x4d, 0xa0, - 0x10, 0x90, 0x25, 0xfa, 0x8c, 0x3a, 0x34, 0x20, 0x08, 0xa2, 0xfb, 0xe3, 0x0e, 0x45, 0x04, 0x96, 0xa7, 0x23, 0x96, 0xb4, 0xd6, 0xcd, 0x21, 0xc3, 0x0f, 0xba, 0xa2, 0xcb, 0xf3, 0xc8, 0x5c, 0xab, - 0x5a, 0xd7, 0x25, 0xa3, 0x14, 0x62, 0xf7, 0x55, 0xbe, 0x9f, 0xb1, 0xad, 0x3f, 0x77, 0x35, 0xfb, 0x4e, 0xfc, 0x06, 0x99, 0x2f, 0x1b, 0xdb, 0x88, 0xb4, 0x1f, 0x47, 0x19, 0x8c, 0x36, 0xd3, 0x84, - 0xc4, 0xb2, 0x7d, 0x2a, 0xb3, 0x35, 0xd9, 0x40, 0x73, 0x9d, 0xc7, 0xf6, 0x73, 0x4b, 0xaf, 0x0f, 0xe2, 0x69, 0x7b, 0xde, 0x9f, 0xa9, 0x35, 0x6c, 0x6f, 0xf3, 0x05, 0x3a, 0xc0, 0xeb, 0xe8, 0xbc, - 0x96, 0x0f, 0x0e, 0x83, 0xcf, 0xc4, 0x9a, 0xa9, 0xe7, 0xec, 0x9c, 0x9e, 0xaa, 0x2b, 0x07, 0xd8, 0x31, 0x3a, 0xe0, 0x92, 0x73, 0xf6, 0xbc, 0x5b, 0x4a, 0x38, 0x78, 0x08, 0x9c, 0xfb, 0xf0, 0x8f, - 0xe0, 0x3e, 0xeb, 0xc1, 0xbf, 0x82, 0xc2, 0x83, 0x6c, 0x07, 0xa3, 0x7a, 0xdd, 0x44, 0xac, 0x02, 0x11, 0xe2, 0x21, 0x47, 0xd1, 0xb4, 0x6d, 0x30, 0x4a, 0x38, 0x22, 0x8b, 0x1c, 0x34, 0x05, 0x7e, - 0x69, 0xce, 0x80, 0xf3, 0x0a, 0x91, 0x59, 0x1d, 0x76, 0x03, 0xfd, 0xc0, 0x29, 0xd5, 0x50, 0x69, 0x4b, 0x2c, 0x00, 0x17, 0xc3, 0x42, 0xef, 0x56, 0x74, 0xcb, 0x61, 0xb3, 0x9c, 0xe2, 0x94, 0xaa, - 0xb3, 0xe7, 0xc7, 0x13, 0x37, 0x3d, 0x61, 0x42, 0x90, 0x40, 0x6d, 0xb8, 0xc8, 0x57, 0xda, 0x6b, 0x46, 0xcb, 0x5b, 0xc5, 0xc0, 0x33, 0x2e, 0xf3, 0x38, 0x55, 0xc7, 0xbf, 0x7a, 0x9a, 0x7b, 0xf0, - 0x89, 0x2b, 0xb2, 0x0f, 0x1e, 0x8c, 0x3d, 0xe7, 0x95, 0xf9, 0x01, 0x96, 0xe9, 0x1a, 0x9a, 0x82, 0x3d, 0x5e, 0x37, 0x6a, 0x2f, 0x56, 0x0b, 0x6e, 0xe8, 0x7d, 0x2a, 0x5c, 0x88, 0x11, 0x63, 0x39, - 0xab, 0x74, 0xcf, 0x6e, 0x95, 0x99, 0x42, 0x2e, 0x65, 0xd2, 0x6a, 0x02, 0x6b, 0x2a, 0xd8, 0xa5, 0x0e, 0x9e, 0x97, 0x32, 0x89, 0x30, 0xcb, 0x1e, 0xd9, 0xc8, 0xcb, 0x95, 0xbe, 0x09, 0x98, 0x29, - 0xd2, 0x02, 0x14, 0x33, 0x95, 0x05, 0x93, 0x67, 0x0e, 0xb6, 0x3f, 0x62, 0x23, 0xfc, 0x13, 0xc1, 0xfb, 0x87, 0x40, 0x37, 0xf0, 0x05, 0x33, 0xfa, 0x27, 0xd5, 0x77, 0x00, 0x3f, 0x42, 0xdb, 0xc0, - 0x31, 0x06, 0xf5, 0x6a, 0x09, 0xcb, 0xea, 0x10, 0x34, 0xa1, 0x83, 0xa7, 0x2e, 0xaf, 0x10, 0x11, 0x8c, 0x58, 0x21, 0xcd, 0xed, 0x0d, 0x90, 0xf4, 0x4c, 0xa2, 0x8b, 0xa8, 0x7c, 0x8d, 0x87, 0x6b, - 0xcc, 0x09, 0xf1, 0x9a, 0x3f, 0x21, 0xb0, 0x14, 0x29, 0x3c, 0x72, 0x60, 0xf9, 0xc0, 0xab, 0x8c, 0xb5, 0xc3, 0x1c, 0x6a, 0xd2, 0x4d, 0x7d, 0xcb, 0x3a, 0x6a, 0xcd, 0x26, 0xd0, 0xf7, 0x2e, 0xc7, - 0x25, 0x9c, 0x26, 0x57, 0x23, 0x0e, 0x2b, 0x7f, 0x2e, 0x3c, 0x7c, 0xa6, 0x78, 0xf8, 0x57, 0xc5, 0xf5, 0x2b, 0xd5, 0x77, 0xe4, 0xae, 0xee, 0x1d, 0x23, 0x85, 0xf4, 0xc5, 0x74, 0xc1, 0xcf, 0x73, - 0x56, 0x49, 0x1a, 0xdb, 0xea, 0xf2, 0x0d, 0x75, 0xec, 0x7a, 0xce, 0x47, 0x1b, 0x48, 0x96, 0x97, 0xdc, 0x82, 0xc9, 0x3c, 0xda, 0x00, 0x15, 0xcd, 0xcb, 0x58, 0x7a, 0xb5, 0x2f, 0x07, 0xab, 0xe0, - 0x2d, 0xd7, 0xf5, 0xb0, 0xda, 0x6f, 0x45, 0x8f, 0x5f, 0xec, 0x68, 0x58, 0x51, 0xba, 0x38, 0xc7, 0x83, 0x32, 0x28, 0x87, 0x19, 0x51, 0x0d, 0x12, 0x08, 0x55, 0xf5, 0xda, 0x1f, 0x89, 0xdc, 0x48, - 0x53, 0xd1, 0x5d, 0x6d, 0xfd, 0x67, 0x27, 0xe6, 0x3f, 0xcf, 0x0e, 0x7d, 0x4b, 0xfa, 0x8a, 0xdf, 0x97, 0x86, 0xcb, 0x59, 0x79, 0x44, 0x6e, 0x68, 0x26, 0x67, 0x50, 0x48, 0x3a, 0xe8, 0x39, 0xec, - 0x7a, 0xd5, 0x5a, 0x9a, 0x29, 0xcc, 0x69, 0x75, 0xda, 0xfa, 0xf3, 0xd3, 0xba, 0xd6, 0x10, 0x2a, 0xe1, 0x11, 0x01, 0xc1, 0xd9, 0xd9, 0x96, 0x55, 0xe5, 0x4e, 0xec, 0x8e, 0xde, 0x79, 0x6a, 0x03, - 0xc4, 0x21, 0x8c, 0xdb, 0x35, 0xdc, 0xa4, 0x70, 0xac, 0xc5, 0x2a, 0x3b, 0x93, 0x35, 0x9d, 0xad, 0xc1, 0x9c, 0x99, 0x99, 0x27, 0x1e, 0xf3, 0x96, 0x41, 0x19, 0x8e, 0x58, 0xb2, 0x4f, 0x8b, 0x61, - 0x5d, 0xf1, 0xfc, 0xb5, 0x3d, 0xfc, 0xec, 0x43, 0x73, 0x9b, 0x65, 0xeb, 0xa2, 0x8c, 0x9d, 0xdd, 0x12, 0xf8, 0xe5, 0xff, 0x7d, 0x55, 0x71, 0xdc, 0x3c, 0xfc, 0xf3, 0x85, 0xf0, 0x2b, 0xfb, 0xd1, - 0xbf, 0xca, 0x91, 0xdf, 0xc9, 0x5e, 0x87, 0xf2, 0xfd, 0x66, 0x2c, 0xe7, 0xcd, 0xad, 0xaa, 0xac, 0x77, 0x7a, 0xbc, 0x11, 0x40, 0xa0, 0x11, 0xc5, 0xbd, 0x9b, 0x9e, 0x9a, 0x7e, 0xe5, 0xc0, 0xc0, - 0x5a, 0x5c, 0x36, 0x49, 0xac, 0xc3, 0xce, 0x20, 0xd5, 0x19, 0x24, 0xce, 0x4b, 0x87, 0x04, 0xaa, 0x76, 0xb1, 0x70, 0x02, 0x23, 0xc2, 0x97, 0xcb, 0x00, 0x39, 0x58, 0x30, 0xbb, 0xb2, 0x5c, 0x1c, - 0xc8, 0x07, 0x78, 0x35, 0xe7, 0x93, 0x50, 0x2d, 0xcf, 0xb3, 0xce, 0x67, 0x45, 0x83, 0x1f, 0x61, 0x36, 0x1d, 0xcd, 0x79, 0x7f, 0x65, 0x98, 0x78, 0x7c, 0xf8, 0x78, 0x45, 0x2b, 0xf7, 0x4e, 0x73, - 0x3a, 0xf9, 0xb8, 0x9a, 0xa0, 0xe3, 0xf4, 0x70, 0x6d, 0xd6, 0xe9, 0x25, 0x79, 0x48, 0x3b, 0xdd, 0xd8, 0x2e, 0xc5, 0xed, 0x7a, 0xa3, 0x4b, 0x3d, 0xbd, 0x34, 0xb4, 0x2c, 0x02, 0x57, 0xac, 0x48, - 0x01, 0xab, 0x39, 0x69, 0x6c, 0x83, 0xde, 0x89, 0x59, 0x7f, 0xdf, 0x9e, 0x3b, 0xc1, 0xc3, 0x11, 0x1f, 0x95, 0x20, 0x76, 0xeb, 0xc9, 0x6b, 0x26, 0x93, 0x72, 0x9e, 0x3e, 0x1c, 0xad, 0x38, 0xd6, - 0x76, 0xb5, 0x57, 0x1c, 0xc3, 0x6d, 0x34, 0xaf, 0x94, 0xe6, 0x38, 0x66, 0xd2, 0xff, 0xaa, 0xff, 0xf8, 0x11, 0x5d, 0xf7, 0x04, 0xac, 0x87, 0x95, 0x62, 0x9f, 0xcd, 0xb6, 0x57, 0x90, 0xbb, 0xff, - 0xc0, 0x05, 0xc6, 0xfb, 0xe6, 0xb1, 0xb6, 0xe8, 0xc3, 0x7e, 0x36, 0xe5, 0xc9, 0x04, 0x51, 0x43, 0xd5, 0xdf, 0xe8, 0x09, 0x14, 0xed, 0xfc, 0xf3, 0xca, 0xa0, 0x16, 0x12, 0x27, 0x1f, 0x05, 0x35, - 0x54, 0xfc, 0x13, 0x3a, 0xa7, 0xa6, 0xc7, 0x84, 0x6b, 0x66, 0x5d, 0xe3, 0xe5, 0x55, 0x9e, 0x51, 0x2a, 0xb9, 0xe1, 0xd0, 0xf8, 0x28, 0x74, 0x62, 0x07, 0x1d, 0xa3, 0x14, 0xad, 0xf2, 0xc1, 0xc9, - 0x4d, 0xb0, 0xe4, 0xa2, 0xa2, 0x36, 0xb8, 0x1e, 0xb1, 0xeb, 0x3b, 0xcb, 0xc0, 0x83, 0xc0, 0xc0, 0x47, 0xa8, 0x60, 0x2f, 0x59, 0x46, 0xbe, 0x13, 0x9f, 0x4e, 0xee, 0x9a, 0x26, 0xd8, 0x38, 0x3b, - 0x89, 0x2c, 0x11, 0x99, 0x7c, 0x9e, 0x85, 0x87, 0xc5, 0x11, 0x6a, 0x8f, 0x44, 0x8b, 0x04, 0x8a, 0xbb, 0x09, 0x3b, 0x04, 0xa6, 0x83, 0x39, 0xec, 0x22, 0xfe, 0xca, 0x16, 0x44, 0xae, 0xed, 0x91, - 0xe9, 0x92, 0x17, 0x90, 0x04, 0x39, 0xa5, 0x56, 0x1f, 0x64, 0x72, 0x67, 0xf5, 0x47, 0xfd, 0x08, 0x1a, 0x7e, 0xea, 0x34, 0x80, 0x7b, 0xee, 0x71, 0xb2, 0xa6, 0x80, 0xb5, 0x13, 0xf2, 0x06, 0xc9, - 0xd6, 0x0c, 0x3b, 0x62, 0x6f, 0xb2, 0x3e, 0x72, 0x80, 0xff, 0xfd, 0x1f, 0xf0, 0xa5, 0xa0, 0xc8, 0xd2, 0xa9, 0x26, 0x57, 0x22, 0xd7, 0xc8, 0xc6, 0x8f, 0xd8, 0x48, 0xf4, 0xd9, 0x5c, 0x8d, 0xd2, - 0x34, 0x33, 0x9d, 0xe4, 0x37, 0x65, 0xe5, 0x5e, 0xf1, 0xc1, 0xff, 0xa4, 0xfa, 0x36, 0x06, 0x1f, 0xd7, 0x17, 0x2d, 0xe6, 0x88, 0xa9, 0xe8, 0x56, 0x30, 0x1f, 0xd7, 0x7a, 0x42, 0xb7, 0x00, 0xbd, - 0x15, 0x5c, 0x09, 0x8b, 0xb3, 0xa5, 0x52, 0xdb, 0xcb, 0xf9, 0x71, 0x88, 0xb2, 0x4d, 0xec, 0x13, 0xb1, 0x4c, 0x70, 0x16, 0xbf, 0x8e, 0x1d, 0xb7, 0x64, 0x23, 0x65, 0xb6, 0x38, 0x83, 0x32, 0x9e, - 0x14, 0x8b, 0x85, 0x6d, 0xb5, 0xda, 0x0a, 0x18, 0xc8, 0xc1, 0x02, 0xc5, 0xd3, 0x7c, 0x58, 0xeb, 0x14, 0xb4, 0x82, 0x3c, 0xd9, 0x65, 0xf4, 0x7a, 0x3b, 0xc2, 0x17, 0xab, 0xab, 0x3e, 0x92, 0xcf, - 0xfd, 0xc6, 0x53, 0x2d, 0x2a, 0xea, 0x89, 0x65, 0x58, 0xfe, 0xb3, 0x05, 0x8d, 0xbf, 0xb4, 0xa0, 0x3f, 0xa9, 0xbe, 0xe1, 0xf5, 0x71, 0x7d, 0xa9, 0xea, 0x31, 0x02, 0xaf, 0x6d, 0x8a, 0xdb, 0x5b, - 0x10, 0x5d, 0xc4, 0x62, 0x58, 0x0f, 0x49, 0xbb, 0x15, 0x45, 0x24, 0x93, 0x1d, 0x25, 0xb6, 0xa7, 0x0c, 0xe8, 0xba, 0x52, 0x74, 0x56, 0x55, 0xaf, 0xd5, 0x03, 0xc0, 0xc9, 0x21, 0x79, 0x11, 0xe7, - 0x42, 0xbb, 0xf0, 0x01, 0x67, 0x57, 0x6a, 0x9c, 0xb6, 0x68, 0x35, 0x92, 0x84, 0x02, 0x78, 0x65, 0xf8, 0xa8, 0x0f, 0xcd, 0x97, 0xfb, 0x45, 0x87, 0xe6, 0x92, 0xbf, 0x36, 0xcb, 0x60, 0x04, 0x3b, - 0xec, 0x8d, 0x28, 0x0a, 0xde, 0x83, 0x7b, 0xd1, 0xe7, 0x3b, 0x6e, 0xec, 0x54, 0x7e, 0x6a, 0xff, 0xce, 0x10, 0xf8, 0xe7, 0xdb, 0xed, 0x3b, 0xcd, 0xe9, 0xe4, 0xe3, 0xea, 0x22, 0x2f, 0x8d, 0xd8, - 0x68, 0x03, 0x2b, 0xa2, 0x18, 0xe7, 0x90, 0x1f, 0x62, 0x7c, 0x36, 0xac, 0xaa, 0x44, 0x07, 0x1d, 0x00, 0xda, 0xc1, 0xbd, 0xbc, 0xb1, 0x9b, 0xe1, 0x90, 0x1a, 0x35, 0x2b, 0xa3, 0xca, 0x9c, 0x42, - 0x4e, 0x0d, 0x33, 0x6d, 0xf8, 0x55, 0xe0, 0xac, 0x88, 0xdc, 0x3d, 0x46, 0xad, 0xac, 0xcb, 0x00, 0x4d, 0x91, 0x3c, 0x69, 0xf2, 0xea, 0x46, 0x24, 0xc1, 0x3a, 0xea, 0x52, 0x39, 0x5d, 0x30, 0x30, - 0x52, 0x9e, 0xe0, 0x31, 0x19, 0xde, 0xe3, 0xe7, 0xe9, 0xb2, 0xe0, 0x97, 0x22, 0x31, 0xe3, 0x6b, 0x8e, 0xac, 0x4b, 0x14, 0x14, 0x3c, 0x2e, 0xf6, 0x52, 0x16, 0xf9, 0xf3, 0xde, 0x59, 0x4a, 0x08, - 0x54, 0x70, 0xfb, 0xc0, 0x28, 0xca, 0xf9, 0x61, 0xc3, 0xe8, 0xec, 0x6e, 0xed, 0x35, 0xac, 0x35, 0xdd, 0x15, 0x61, 0xea, 0x52, 0xc9, 0x3c, 0xe2, 0xaa, 0xca, 0xc5, 0x8c, 0xf0, 0xd8, 0xe4, 0xc1, - 0x91, 0x9a, 0x09, 0xa5, 0x93, 0x98, 0x56, 0x9a, 0x5a, 0x15, 0x8b, 0xdb, 0xb8, 0x54, 0xe2, 0x46, 0xae, 0xab, 0x73, 0x0a, 0x50, 0xcd, 0x33, 0x5b, 0xf9, 0x81, 0x30, 0x46, 0xbd, 0x72, 0xf9, 0x91, - 0xf6, 0x33, 0xd5, 0x25, 0xf4, 0x0f, 0xf6, 0x0a, 0x8f, 0x79, 0x27, 0xfa, 0x81, 0x81, 0x6d, 0x4e, 0xae, 0x84, 0x7e, 0xc6, 0xa1, 0xe4, 0x65, 0xb4, 0x3e, 0x11, 0xb6, 0x16, 0x35, 0x95, 0xb2, 0xed, - 0xda, 0xb6, 0x63, 0x68, 0x90, 0xaf, 0x03, 0xff, 0x74, 0x08, 0x96, 0x84, 0xd4, 0x53, 0xa6, 0x80, 0x89, 0x4a, 0x47, 0x2f, 0xe6, 0x64, 0x2c, 0x6b, 0x0d, 0xe7, 0x15, 0xa9, 0xc0, 0xb5, 0x9a, 0x20, - 0x70, 0x2c, 0xbf, 0x9d, 0x2d, 0x36, 0xe6, 0x12, 0x80, 0x96, 0xd2, 0x29, 0xe2, 0x52, 0x16, 0x92, 0x17, 0x70, 0x22, 0x23, 0x9e, 0xd6, 0x8c, 0xc6, 0xe1, 0x23, 0x64, 0xed, 0x99, 0xc5, 0x00, 0xf9, - 0x73, 0xdd, 0xca, 0x2f, 0xba, 0x1f, 0x68, 0x5c, 0x6e, 0x26, 0x57, 0x72, 0x3f, 0x03, 0xa2, 0xd3, 0x1a, 0x60, 0xf2, 0x31, 0x36, 0x48, 0xd2, 0x0a, 0xd0, 0xb2, 0x45, 0x41, 0xc9, 0x64, 0xc2, 0x82, - 0xb2, 0xb7, 0x59, 0x68, 0xbc, 0x04, 0x0a, 0x95, 0x04, 0x1d, 0x74, 0x65, 0xd5, 0xa0, 0x25, 0x00, 0x48, 0x87, 0xb3, 0xe5, 0x9d, 0x0c, 0x09, 0xf4, 0x70, 0x00, 0x3d, 0xc2, 0xf5, 0x06, 0xdd, 0x87, - 0x42, 0x38, 0xf4, 0x25, 0x33, 0x87, 0x86, 0xae, 0x56, 0x76, 0x18, 0xe8, 0x0f, 0x86, 0xa3, 0x06, 0xaf, 0x19, 0x36, 0x7f, 0x4d, 0x95, 0x8f, 0x79, 0xf1, 0x98, 0xa9, 0x7c, 0x71, 0xf2, 0x7e, 0x04, - 0xe4, 0x6b, 0xe9, 0x59, 0x3e, 0xa9, 0x5e, 0x60, 0x7c, 0xbf, 0x1e, 0x9b, 0x9a, 0x65, 0x4b, 0x64, 0x38, 0xe2, 0x1f, 0x03, 0x2a, 0x6c, 0xa1, 0x03, 0xbd, 0x6c, 0x5b, 0x48, 0x21, 0x02, 0x84, 0x00, - 0xe6, 0xfd, 0xa6, 0xe0, 0x14, 0x0e, 0x53, 0x05, 0x81, 0x1a, 0x74, 0xe4, 0xc4, 0x59, 0x3b, 0x90, 0x3f, 0xf4, 0x66, 0x9b, 0xb9, 0xf1, 0x69, 0x7a, 0x00, 0xb1, 0x61, 0x45, 0x0d, 0xad, 0x40, 0xca, - 0x62, 0xbf, 0xb4, 0x54, 0xbc, 0x42, 0x64, 0x0e, 0x60, 0x31, 0x23, 0x9f, 0x0b, 0xdc, 0x86, 0x79, 0x0d, 0xc4, 0xfb, 0x12, 0x90, 0x57, 0x1f, 0x17, 0xe2, 0x37, 0x60, 0x06, 0x4f, 0xa5, 0xb1, 0xb7, - 0xde, 0xff, 0xb9, 0xd7, 0xd8, 0x07, 0xd1, 0x0f, 0x28, 0x83, 0xb2, 0xba, 0x08, 0x00, 0x23, 0xaa, 0x7d, 0x6f, 0xcb, 0x30, 0x39, 0xa3, 0x66, 0x8b, 0x68, 0xdb, 0x5c, 0x1b, 0x4c, 0xbb, 0x9f, 0x07, - 0x87, 0x92, 0x57, 0x18, 0xde, 0xe5, 0x00, 0x40, 0x5e, 0xaf, 0x09, 0x94, 0x5c, 0x74, 0x25, 0x9e, 0x39, 0x8b, 0x1a, 0x53, 0x3d, 0x34, 0x29, 0x9c, 0xc4, 0xc0, 0xb9, 0x53, 0xc7, 0x69, 0x5d, 0x21, - 0x48, 0x79, 0xdb, 0x82, 0xdb, 0xb8, 0xad, 0x80, 0xa3, 0xe3, 0xce, 0x0a, 0xcf, 0xab, 0xe3, 0xb3, 0xb4, 0x1b, 0xc8, 0x31, 0x26, 0xac, 0xf8, 0x77, 0xeb, 0xf2, 0x85, 0xe9, 0x74, 0x59, 0x8e, 0xd7, - 0x65, 0x38, 0x62, 0x02, 0x95, 0xeb, 0x33, 0xdf, 0x01, 0xa7, 0x70, 0x5f, 0xc5, 0x14, 0xbe, 0x57, 0x61, 0x22, 0xa5, 0xd0, 0xd5, 0x7c, 0xb5, 0xdc, 0xad, 0x16, 0xba, 0x8e, 0x8a, 0xa8, 0x9a, 0x3b, - 0x6b, 0x4e, 0x5d, 0x34, 0xf8, 0xac, 0x92, 0x80, 0xd0, 0x44, 0x9a, 0xf3, 0xf4, 0xd8, 0x1b, 0xac, 0xc2, 0x83, 0xbc, 0xc4, 0xf6, 0x4a, 0x15, 0xef, 0xc4, 0x3d, 0x68, 0x02, 0x86, 0x2d, 0x4b, 0xcb, - 0xc6, 0x2c, 0x21, 0x7e, 0x69, 0x30, 0xf0, 0x9d, 0x72, 0xf7, 0x7b, 0x3a, 0xc0, 0xc7, 0x23, 0x8e, 0xbc, 0xa0, 0x47, 0xbb, 0xa1, 0x3c, 0x9d, 0xdc, 0xde, 0x5f, 0xaa, 0x11, 0x8d, 0xd0, 0xa7, 0xb9, - 0x4d, 0xa2, 0x92, 0x95, 0x6e, 0x1e, 0x09, 0xc5, 0x5d, 0xac, 0xb1, 0x39, 0xd5, 0x23, 0x3d, 0x37, 0x4d, 0x16, 0xbb, 0x3e, 0x3c, 0x29, 0x34, 0xbe, 0xf7, 0xfc, 0x65, 0x0e, 0x0e, 0xd8, 0x8a, 0x76, - 0x0f, 0x80, 0xae, 0x66, 0x3b, 0xe5, 0xb0, 0x91, 0xe6, 0xb6, 0x19, 0xb8, 0x9d, 0x70, 0x16, 0x60, 0xcc, 0x31, 0x0b, 0x08, 0x5f, 0x83, 0x07, 0xc2, 0x39, 0x2a, 0xdb, 0xa0, 0xe4, 0xac, 0xfd, 0x92, - 0x59, 0xdf, 0xd7, 0xb4, 0x7f, 0xfb, 0x69, 0xf1, 0x53, 0xeb, 0xe4, 0xe5, 0x68, 0x47, 0xbe, 0xd4, 0xff, 0xf8, 0x62, 0x8f, 0x7c, 0xbf, 0xba, 0xd6, 0xf1, 0x27, 0x7f, 0xee, 0x34, 0x9a, 0x35, 0x90, - 0x0b, 0x9b, 0x7b, 0x3a, 0x04, 0x97, 0x8e, 0x37, 0xdd, 0xfb, 0xeb, 0xbc, 0x2b, 0xaa, 0xc6, 0x71, 0x04, 0x6c, 0xba, 0x9e, 0xca, 0x27, 0x87, 0x0c, 0x38, 0xbc, 0x96, 0xf4, 0x21, 0x4c, 0x8e, 0x51, - 0x2d, 0x52, 0x28, 0x7f, 0x52, 0xdc, 0xd9, 0x42, 0x21, 0xc9, 0x9d, 0xcc, 0xb7, 0xeb, 0x39, 0xe2, 0x1c, 0x36, 0x14, 0x31, 0xc8, 0xab, 0x94, 0x27, 0x08, 0xad, 0xde, 0x10, 0x3e, 0x67, 0xbd, 0x58, - 0xa9, 0xf3, 0x4b, 0x71, 0xc3, 0x6b, 0x1a, 0x9b, 0x1b, 0x5d, 0xcd, 0xaf, 0x4a, 0xd6, 0xc8, 0x3f, 0xf0, 0xb7, 0xb4, 0xd2, 0x0f, 0x1c, 0x6c, 0xff, 0xbe, 0xcf, 0x35, 0xfb, 0x43, 0x74, 0x4e, 0x56, - 0x56, 0x85, 0xe3, 0xfc, 0x53, 0x38, 0x71, 0xff, 0xc9, 0xb5, 0x6e, 0xa2, 0xbe, 0xbf, 0x24, 0x65, 0xc1, 0xfe, 0x21, 0x6e, 0x69, 0x97, 0x41, 0x9c, 0x45, 0xce, 0xa4, 0xce, 0x2e, 0x2e, 0x03, 0x49, - 0x5a, 0x05, 0x6e, 0xf0, 0x25, 0x49, 0xf6, 0xcd, 0xcf, 0x2d, 0xeb, 0x2c, 0x4b, 0x8b, 0xaa, 0x9c, 0x58, 0x69, 0x94, 0x7e, 0xd0, 0xfb, 0x76, 0xe2, 0xaa, 0xd2, 0xfa, 0xf3, 0x77, 0x7e, 0x73, 0x10, - 0xac, 0x13, 0xdb, 0x71, 0x4b, 0xc3, 0xfd, 0xa5, 0x0b, 0xc0, 0x3e, 0x79, 0xeb, 0x17, 0xd0, 0x9f, 0xe5, 0x95, 0xfe, 0x5e, 0x40, 0xe7, 0xaf, 0xbf, 0xbe, 0x6f, 0x5f, 0xb7, 0xe8, 0x8e, 0x9f, 0x84, - 0xb7, 0x85, 0x74, 0x2e, 0x74, 0x6e, 0xe6, 0xdf, 0x5f, 0xcf, 0xe6, 0xe0, 0x62, 0x15, 0x0e, 0x9a, 0x46, 0x05, 0xa8, 0xe4, 0xbb, 0x81, 0xd0, 0x04, 0x43, 0xb1, 0x12, 0x9c, 0x46, 0x92, 0x54, 0xa6, - 0x4a, 0x16, 0xb9, 0xe2, 0x3a, 0x44, 0x07, 0x51, 0xbe, 0xb7, 0x2c, 0x2d, 0x69, 0xc0, 0x75, 0x73, 0x67, 0xba, 0xe9, 0xee, 0xb8, 0xe3, 0x6b, 0x4f, 0x12, 0xfa, 0x79, 0xe5, 0xe3, 0xee, 0x4c, 0x5f, - 0x1e, 0x4f, 0xb2, 0xd8, 0x2b, 0xcc, 0x8a, 0x9e, 0x12, 0x4a, 0x8d, 0x56, 0xd0, 0x4d, 0x35, 0x90, 0xbf, 0x1e, 0xcf, 0xc3, 0xbf, 0x9e, 0xce, 0xc5, 0xbf, 0x3e, 0x59, 0xf2, 0x37, 0xab, 0xee, 0x5f, - 0x9f, 0x3b, 0xd8, 0x5f, 0x5f, 0xf1, 0x7e, 0x57, 0x06, 0xba, 0x91, 0xf1, 0x7b, 0x68, 0x6f, 0x8f, 0xcc, 0xe3, 0xa1, 0xfd, 0x20, 0xfe, 0x1e, 0x1d, 0xf1, 0x76, 0x79, 0x29, 0xc5, 0x0b, 0xfe, 0x0c, - 0x30, 0x34, 0xa9, 0xec, 0xa3, 0x8c, 0x2c, 0xd6, 0x7a, 0x11, 0x6c, 0x95, 0xd8, 0x3d, 0xac, 0xdd, 0x28, 0x65, 0x66, 0x44, 0x74, 0xaa, 0x1b, 0xf0, 0x29, 0x44, 0x0f, 0xbb, 0x18, 0x7f, 0x07, 0xe9, - 0x4e, 0x7e, 0x7c, 0xa9, 0x73, 0x5f, 0xf7, 0x2a, 0xe4, 0xe7, 0x0e, 0xbd, 0xcd, 0x18, 0x7c, 0x15, 0x0d, 0xb5, 0x29, 0xed, 0xf4, 0x35, 0xb2, 0x85, 0x8d, 0xe9, 0xe1, 0xb4, 0xa0, 0x22, 0x67, 0xe9, - 0x87, 0x43, 0x8e, 0xa5, 0x9d, 0xc7, 0xf4, 0xc6, 0x42, 0x26, 0x7b, 0x4d, 0x6d, 0xac, 0x5d, 0xd9, 0xa4, 0x27, 0x83, 0xd9, 0xe6, 0xd3, 0x12, 0xeb, 0xd4, 0x0d, 0x3e, 0x55, 0x55, 0x1e, 0xaf, 0x06, - 0xe2, 0x48, 0x76, 0x14, 0x57, 0x31, 0x89, 0xc8, 0x4d, 0x2b, 0xb5, 0x5a, 0x21, 0xca, 0x51, 0x8a, 0xa8, 0xe7, 0x33, 0xe6, 0x21, 0x1c, 0x9f, 0xfc, 0xe0, 0x19, 0x24, 0xdf, 0xb9, 0xc4, 0x78, 0x48, - 0xae, 0xa4, 0xa7, 0x93, 0xf7, 0x8b, 0x4b, 0x5a, 0x4b, 0x68, 0x1c, 0x34, 0xa5, 0x51, 0x1b, 0xb4, 0x3b, 0xe5, 0x75, 0xfb, 0xe4, 0x15, 0x3b, 0xe9, 0xa0, 0x31, 0xc7, 0x2a, 0x53, 0x0d, 0x28, 0x38, - 0x06, 0xac, 0x65, 0x38, 0x66, 0xc0, 0x0a, 0xd0, 0x7c, 0x6b, 0x67, 0x42, 0xa4, 0x30, 0x70, 0xb4, 0x68, 0x9c, 0x4e, 0xb0, 0x55, 0x0c, 0x2b, 0x13, 0x7e, 0xd5, 0xb3, 0x84, 0x30, 0x64, 0xb5, 0x9d, - 0x9b, 0x8b, 0x0d, 0x98, 0xab, 0x2b, 0x97, 0x33, 0x4a, 0xc6, 0xee, 0x0f, 0xf4, 0xfa, 0x37, 0x8b, 0xe9, 0x31, 0x34, 0xdf, 0x59, 0xdc, 0x73, 0x88, 0xb0, 0x17, 0x97, 0xc4, 0xed, 0x27, 0xde, 0xa0, - 0xba, 0x69, 0x98, 0x60, 0x77, 0x05, 0xe7, 0xfe, 0x7a, 0x06, 0x99, 0x10, 0x9e, 0xc2, 0xd6, 0x56, 0x37, 0x15, 0x0a, 0xce, 0xf6, 0x9b, 0x80, 0xca, 0x17, 0x2a, 0x9a, 0xca, 0x6c, 0xe9, 0xc9, 0xf0, - 0x32, 0xa7, 0xd6, 0x43, 0x09, 0xf3, 0xd9, 0x39, 0x46, 0x0d, 0x41, 0x33, 0xc3, 0x18, 0xd0, 0x97, 0xca, 0xd2, 0x52, 0x50, 0xd1, 0x5d, 0x1d, 0xa4, 0x02, 0xad, 0xf7, 0x07, 0x3d, 0x36, 0x40, 0xa7, - 0x47, 0x5d, 0x2c, 0xf2, 0x76, 0xc5, 0x79, 0x0e, 0x1a, 0x2a, 0x28, 0xec, 0x6f, 0x82, 0x16, 0xff, 0x7a, 0x89, 0xff, 0x7c, 0xe1, 0x28, 0x1f, 0x29, 0xdb, 0x1e, 0x73, 0xa1, 0xff, 0xf5, 0xf5, 0xef, - 0x2f, 0x39, 0x23, 0xfb, 0x6d, 0xa0, 0xc9, 0x9f, 0x9f, 0x7a, 0xdf, 0x28, 0x5e, 0x24, 0x8c, 0xac, 0x1a, 0xe5, 0xe0, 0x04, 0x4d, 0x4c, 0x1b, 0xf4, 0x1b, 0x31, 0xed, 0x04, 0xb5, 0x16, 0xad, 0x04, - 0x39, 0xf9, 0x6e, 0x10, 0xcf, 0x10, 0x6d, 0x83, 0x03, 0xe8, 0x2b, 0x02, 0x82, 0x61, 0x9a, 0xc5, 0xe5, 0xdd, 0x67, 0xb1, 0x16, 0x77, 0x95, 0x74, 0x1f, 0x9f, 0xcf, 0x5e, 0x51, 0x93, 0xdd, 0x92, - 0xbe, 0xc0, 0xf0, 0xb5, 0xe1, 0x01, 0x37, 0x7e, 0xcc, 0xb8, 0x1c, 0xbd, 0xc4, 0x76, 0x25, 0xa2, 0x54, 0x8b, 0xa0, 0x64, 0x94, 0x8c, 0x14, 0xe1, 0xb5, 0xdc, 0xcf, 0xec, 0xfc, 0x9c, 0xad, 0x03, - 0x74, 0x7e, 0x12, 0x07, 0x64, 0x6d, 0xe4, 0xc1, 0x12, 0x77, 0x86, 0xda, 0x04, 0x31, 0x08, 0x5e, 0x8a, 0x43, 0xa5, 0xca, 0xad, 0x3c, 0xc7, 0x17, 0xf8, 0x86, 0x35, 0x85, 0xb3, 0x06, 0xf3, 0x89, - 0x39, 0x8d, 0x69, 0x54, 0xd1, 0xd2, 0x70, 0x71, 0x6c, 0xad, 0x76, 0x37, 0x26, 0x5b, 0xe4, 0x5d, 0x69, 0x8d, 0x27, 0x1a, 0xb1, 0x57, 0xd4, 0x21, 0xb7, 0xb4, 0xa7, 0x93, 0x6f, 0x0d, 0x93, 0x2b, - 0xd9, 0x9f, 0xc1, 0x61, 0x52, 0x78, 0x98, 0x81, 0xe6, 0x69, 0xd3, 0x6c, 0xa3, 0x94, 0x01, 0xb4, 0xe1, 0x18, 0x67, 0xfa, 0x49, 0x70, 0x66, 0x04, 0x90, 0x53, 0x62, 0x3c, 0x97, 0x59, 0x9d, 0x56, - 0xbc, 0x8e, 0xb4, 0x6a, 0x80, 0xa5, 0x0b, 0x15, 0xd6, 0x69, 0x66, 0x8a, 0x54, 0xfb, 0x1e, 0xf0, 0x54, 0x53, 0x5f, 0x4a, 0xa7, 0x75, 0x09, 0xef, 0x67, 0x9a, 0xdd, 0x71, 0x26, 0xe7, 0x13, 0x2a, - 0x55, 0x05, 0x31, 0xa9, 0x81, 0x77, 0x86, 0x80, 0xaf, 0xc5, 0xd9, 0x9e, 0xa9, 0x05, 0xff, 0x5c, 0x0f, 0xf2, 0x49, 0xf5, 0x4b, 0xf7, 0xaf, 0xaa, 0xc1, 0x11, 0x4a, 0x10, 0xc4, 0xea, 0xe9, 0xb2, - 0x67, 0xbc, 0x2a, 0x0e, 0x88, 0x0d, 0x41, 0xbb, 0xa2, 0xb8, 0x81, 0x77, 0x74, 0x86, 0x8b, 0x2c, 0x1c, 0xb5, 0x4d, 0x65, 0x7a, 0x60, 0x06, 0x1e, 0x21, 0x07, 0x3c, 0x36, 0x52, 0xbe, 0xc2, 0x2c, - 0x67, 0xdd, 0x01, 0x2c, 0x6c, 0xbb, 0x62, 0x18, 0x43, 0x26, 0x4b, 0xef, 0x4f, 0x8b, 0xd5, 0x92, 0xa6, 0x84, 0xa6, 0x07, 0xd2, 0x99, 0x85, 0x1b, 0xc4, 0xa9, 0x0e, 0x39, 0xdb, 0x7e, 0xed, 0xfc, - 0xfe, 0x83, 0xc5, 0xf4, 0x51, 0x8d, 0xb9, 0xbf, 0x7f, 0x97, 0x40, 0xeb, 0xb6, 0x5a, 0xcb, 0x33, 0xbc, 0xff, 0xdc, 0xe2, 0xf2, 0x85, 0xee, 0x2f, 0xc4, 0xdf, 0xee, 0xc6, 0xba, 0x7a, 0x1f, 0x6a, - 0x6a, 0x29, 0xca, 0x9c, 0xbc, 0x2f, 0xa2, 0x8d, 0xca, 0xb9, 0x0c, 0x3b, 0xd0, 0xb8, 0x99, 0xf1, 0x35, 0x52, 0x69, 0x15, 0xd2, 0x35, 0xe1, 0xc1, 0x3e, 0x6e, 0x04, 0x60, 0xe5, 0x48, 0x60, 0x74, - 0x30, 0x51, 0x76, 0xa6, 0x1c, 0x09, 0x70, 0x61, 0xd0, 0x9d, 0x5f, 0x1f, 0xbc, 0x5a, 0x84, 0xd5, 0x35, 0xb0, 0x0e, 0xcf, 0xfd, 0xbe, 0xe5, 0x86, 0xf2, 0x80, 0xe9, 0xe7, 0x6a, 0x13, 0xbb, 0xfe, - 0xee, 0xce, 0xd3, 0xed, 0x7b, 0x2d, 0x9a, 0x47, 0x00, 0xa0, 0x2f, 0x9d, 0xf0, 0x6f, 0x28, 0x7f, 0x42, 0xf0, 0x7e, 0x7f, 0x31, 0x67, 0x8e, 0x38, 0xf7, 0x07, 0x9d, 0x04, 0xef, 0x30, 0x89, 0x51, - 0x4b, 0x2a, 0xeb, 0x03, 0x99, 0xd7, 0xd8, 0x58, 0x01, 0xe0, 0x25, 0x93, 0xa9, 0xaa, 0x83, 0x6d, 0x02, 0x64, 0x0f, 0xb8, 0xa8, 0x03, 0x18, 0xdb, 0x15, 0xc5, 0x18, 0x29, 0x66, 0xc4, 0xab, 0xa3, - 0x82, 0x6f, 0x41, 0x8e, 0xc3, 0xad, 0xe9, 0x4e, 0x9e, 0xcd, 0x1d, 0x94, 0xa8, 0xab, 0x45, 0x07, 0xaf, 0x77, 0x33, 0xd2, 0xef, 0xd6, 0x73, 0x5c, 0x15, 0x63, 0xb6, 0x7e, 0xc9, 0xf8, 0x0b, 0x8e, - 0x9d, 0x65, 0x5f, 0x5e, 0x7b, 0x9c, 0x7e, 0xe4, 0xcb, 0x0b, 0x8f, 0x4b, 0x05, 0x3d, 0x9e, 0xa7, 0xc9, 0xc4, 0xe9, 0x82, 0x6a, 0x12, 0x39, 0xc6, 0x79, 0xe2, 0x16, 0xce, 0xef, 0xd2, 0x75, 0xbd, - 0xc0, 0x21, 0xbf, 0x53, 0x7f, 0x1b, 0xb0, 0xef, 0x6d, 0x63, 0x63, 0x41, 0x4e, 0xf5, 0xc2, 0xd0, 0x75, 0x2a, 0x3c, 0x3a, 0x3a, 0xd2, 0xc8, 0xad, 0xc7, 0xcd, 0x67, 0xbb, 0x8e, 0x4a, 0xcb, 0x4d, - 0x5d, 0xd0, 0x01, 0xa5, 0x80, 0x25, 0x84, 0x14, 0x1b, 0x48, 0x6b, 0x63, 0x83, 0x07, 0x80, 0xb0, 0xb1, 0x3a, 0x9e, 0x20, 0x28, 0x25, 0x15, 0x1a, 0x27, 0xd1, 0x1d, 0x33, 0x5b, 0x50, 0x70, 0x3c, - 0x53, 0x16, 0xd0, 0x74, 0x99, 0x96, 0xbc, 0xc6, 0xef, 0xc3, 0xe4, 0x48, 0x65, 0xd3, 0x3b, 0x65, 0xcd, 0x7b, 0xc8, 0xe3, 0xe3, 0x15, 0x8b, 0xbe, 0x84, 0x81, 0x75, 0xed, 0xb6, 0xe5, 0x4c, 0x2e, - 0x14, 0x7e, 0x92, 0x1e, 0x14, 0xba, 0x34, 0x32, 0x44, 0x51, 0x18, 0xb9, 0x3c, 0x72, 0xe5, 0x8a, 0x4c, 0x56, 0x0b, 0x9c, 0xc0, 0x10, 0xd5, 0x20, 0x97, 0xaf, 0x70, 0xb6, 0x1f, 0x23, 0x35, 0x1f, - 0x97, 0xa2, 0x78, 0xa6, 0x96, 0xfc, 0x73, 0x8f, 0xe7, 0x07, 0xf4, 0xdf, 0xf0, 0xb8, 0x6f, 0xbd, 0x28, 0x2b, 0x47, 0x78, 0x42, 0x9b, 0x84, 0xaa, 0x9b, 0xb1, 0x5f, 0x87, 0x49, 0x7e, 0x48, 0x59, - 0x50, 0xc7, 0x0f, 0xfc, 0x40, 0x4d, 0x13, 0xdf, 0x15, 0x92, 0x25, 0x38, 0xd3, 0x25, 0x46, 0x1c, 0x86, 0x50, 0xda, 0xb7, 0x8e, 0x67, 0x62, 0x07, 0x32, 0x9d, 0x53, 0x14, 0x95, 0x75, 0x88, 0x4b, - 0xd6, 0xf0, 0x71, 0xea, 0x22, 0xa7, 0xb5, 0x41, 0x2d, 0x24, 0x21, 0xc4, 0x85, 0x6d, 0xb2, 0x96, 0x5d, 0x15, 0x4a, 0x57, 0x55, 0x95, 0xbb, 0x23, 0x4c, 0xc5, 0x5f, 0x0d, 0xb7, 0x7f, 0xff, 0x2e, - 0x49, 0xfc, 0x83, 0xb4, 0x26, 0x4f, 0xe5, 0xd1, 0x3f, 0x86, 0xf3, 0x3b, 0xf1, 0xe9, 0xe4, 0xae, 0x69, 0x5c, 0xd8, 0xf3, 0x0a, 0xac, 0x45, 0x83, 0x39, 0x9c, 0x0e, 0x3c, 0x30, 0x73, 0x4a, 0xac, - 0x20, 0xa5, 0xcc, 0x48, 0xfc, 0xca, 0x52, 0xa1, 0x11, 0xb9, 0xc7, 0x2e, 0x9f, 0xfc, 0xa9, 0x88, 0xc8, 0x9f, 0x2b, 0x34, 0x7f, 0x91, 0xfd, 0xe8, 0xd6, 0xaf, 0x52, 0x21, 0x23, 0x54, 0x99, 0x3b, - 0x7a, 0x3b, 0xf0, 0xa7, 0xe5, 0x72, 0xc9, 0x1f, 0x81, 0x1e, 0x9d, 0x0d, 0x24, 0x42, 0x81, 0x4b, 0x1b, 0xec, 0x55, 0x73, 0x96, 0x51, 0xf3, 0x7e, 0xad, 0xa4, 0xd3, 0x33, 0xa6, 0x69, 0xb6, 0xe6, - 0x65, 0x1a, 0x3c, 0x85, 0x97, 0x25, 0x57, 0x9e, 0xcb, 0x6d, 0x91, 0x13, 0x11, 0xc7, 0x74, 0x45, 0x5f, 0x9c, 0xb8, 0x04, 0x72, 0xc2, 0x35, 0x9e, 0x52, 0xd9, 0xcc, 0xf0, 0x1b, 0x6e, 0x23, 0xd0, - 0xb3, 0x72, 0x8c, 0xad, 0x31, 0x0b, 0xac, 0xf4, 0x77, 0xc6, 0x91, 0xb7, 0x79, 0xfd, 0xc2, 0x50, 0x7f, 0x50, 0x7d, 0x03, 0xe3, 0xe3, 0xfa, 0x92, 0x8d, 0x6d, 0xc4, 0x46, 0xbf, 0x95, 0x91, 0xca, - 0x61, 0xa4, 0x43, 0x18, 0x2f, 0xe1, 0xd3, 0x62, 0xbd, 0x1a, 0x6a, 0x6d, 0xb6, 0x54, 0x87, 0x05, 0x7d, 0x6a, 0x97, 0xf9, 0x1c, 0x36, 0x66, 0x6e, 0xb9, 0x69, 0x5a, 0x43, 0xac, 0x18, 0x9f, 0x52, - 0xb6, 0x4b, 0xe7, 0x64, 0x43, 0x29, 0x24, 0xd0, 0x33, 0x70, 0x21, 0xe3, 0x80, 0x6e, 0x2f, 0x55, 0x55, 0xdc, 0x99, 0x62, 0x59, 0xef, 0xda, 0x6d, 0x78, 0x5e, 0xcc, 0x95, 0xfc, 0x28, 0xc8, 0xa7, - 0x31, 0x22, 0xf7, 0x7b, 0x92, 0xe9, 0x47, 0x30, 0xcc, 0xae, 0xa9, 0x09, 0xff, 0x1c, 0x87, 0x24, 0xbd, 0x40, 0x90, 0xa4, 0x93, 0x2b, 0x89, 0x9f, 0xbb, 0xaf, 0xc3, 0x0e, 0x2b, 0x36, 0x51, 0x11, - 0xc1, 0x05, 0x33, 0xcb, 0x30, 0xa7, 0x71, 0x0e, 0x72, 0x22, 0xd9, 0x36, 0x4a, 0x85, 0xdb, 0xf3, 0xac, 0xa2, 0xca, 0xdd, 0x99, 0xd1, 0x74, 0x81, 0x5d, 0x33, 0x3c, 0xaa, 0x48, 0x3e, 0xbc, 0x0e, - 0x20, 0x8b, 0x13, 0xb9, 0x12, 0x71, 0x14, 0x3e, 0x37, 0x42, 0x20, 0x09, 0x44, 0xc4, 0x0b, 0x51, 0xf9, 0x9c, 0x16, 0x4e, 0x6a, 0x28, 0xde, 0x0a, 0xd1, 0x15, 0x6d, 0x04, 0x93, 0x30, 0xaa, 0x34, - 0x0e, 0xac, 0x49, 0x19, 0x39, 0x4e, 0xf6, 0x78, 0x97, 0xbf, 0xad, 0x74, 0x70, 0xd5, 0x74, 0xde, 0x6e, 0xdf, 0x0f, 0xf6, 0xe4, 0x07, 0xe5, 0x2a, 0x2e, 0x70, 0x7c, 0xa6, 0x21, 0xaf, 0x0a, 0x23, - 0x29, 0xb3, 0xf4, 0x5a, 0x9b, 0xaf, 0xb9, 0xfb, 0xe8, 0xe5, 0xe5, 0xb2, 0xb2, 0x27, 0xa5, 0x53, 0x04, 0x97, 0xf3, 0x5b, 0x71, 0x95, 0x0d, 0xf0, 0xbb, 0x37, 0xc7, 0x38, 0xbd, 0xe4, 0x75, 0x60, - 0x9d, 0xdf, 0x0b, 0x72, 0x4c, 0xea, 0xc4, 0x29, 0x2d, 0x23, 0x73, 0x7e, 0x79, 0x72, 0xdc, 0x88, 0x2b, 0x85, 0x63, 0x44, 0x93, 0x77, 0xb0, 0xfe, 0xbe, 0xfa, 0xd9, 0x7c, 0x4b, 0x85, 0xfe, 0x5e, - 0x81, 0xe0, 0xe2, 0xdc, 0xf8, 0xb5, 0xfc, 0xc1, 0xdb, 0x87, 0x91, 0x6f, 0x0a, 0xe7, 0x34, 0x09, 0xac, 0x89, 0x99, 0xa6, 0xf1, 0xdf, 0x0f, 0xb5, 0xc4, 0x95, 0x5f, 0x38, 0xc6, 0x4d, 0x16, 0xd3, - 0xdf, 0x44, 0x68, 0x3e, 0x47, 0xf0, 0x19, 0x47, 0x7b, 0x6d, 0xee, 0x3e, 0xf8, 0xc6, 0xc7, 0x74, 0xbe, 0x7f, 0x32, 0xd6, 0x7d, 0xcc, 0x22, 0x9a, 0x14, 0xe3, 0x32, 0x05, 0x6d, 0x37, 0x22, 0x0a, - 0xfb, 0xf2, 0xc9, 0x92, 0xb0, 0xe3, 0xb2, 0xfc, 0x7f, 0xa8, 0xfb, 0x92, 0x26, 0x45, 0xbd, 0x66, 0xef, 0xfd, 0xfd, 0x14, 0x4f, 0xf4, 0x96, 0xf0, 0xcf, 0x24, 0xd3, 0x92, 0x41, 0x50, 0x40, 0x06, - 0x11, 0x19, 0x16, 0x4f, 0x04, 0xca, 0x2c, 0x20, 0xa3, 0x80, 0x11, 0x6f, 0x7f, 0xf6, 0x37, 0xb4, 0xaa, 0xba, 0xad, 0x52, 0xbb, 0x6c, 0xef, 0x7f, 0x73, 0x17, 0x1d, 0x75, 0x18, 0x3a, 0xf1, 0x64, - 0x9e, 0x21, 0x33, 0x4f, 0xe6, 0x2f, 0x65, 0xd2, 0xcd, 0xd2, 0xc6, 0x0c, 0x99, 0xb4, 0xda, 0x80, 0x01, 0xd2, 0xf0, 0x43, 0xce, 0xcf, 0x78, 0x37, 0xa9, 0x60, 0x5b, 0x36, 0x4b, 0x6c, 0xe6, 0xc8, - 0x6d, 0xc7, 0xcd, 0x71, 0x6d, 0x36, 0xaf, 0x28, 0x0b, 0x0e, 0x22, 0xab, 0x5a, 0x6d, 0x0b, 0xd9, 0xd4, 0x30, 0xbe, 0x73, 0x73, 0xf5, 0x89, 0x18, 0x94, 0x33, 0x7f, 0x3f, 0x24, 0xf5, 0xc1, 0xe3, - 0xe9, 0x4d, 0x50, 0x54, 0x99, 0x25, 0x2d, 0xf2, 0xe3, 0x9b, 0x38, 0x95, 0x07, 0x83, 0xf2, 0x1e, 0xf3, 0xf1, 0x97, 0x82, 0xa2, 0xee, 0x7d, 0xe0, 0x83, 0xf3, 0x5f, 0x6e, 0x4f, 0xf0, 0xe7, 0x42, - 0xa5, 0x16, 0x56, 0x64, 0x9c, 0x4c, 0x99, 0xb4, 0xe1, 0x7e, 0xca, 0x2c, 0xac, 0x75, 0x3f, 0xab, 0x57, 0x51, 0xbb, 0x21, 0xb5, 0x51, 0x15, 0x54, 0x35, 0xc1, 0xa1, 0xae, 0x3a, 0x42, 0x07, 0xa9, - 0x33, 0xc0, 0x50, 0xa5, 0x49, 0x65, 0x77, 0x00, 0xd5, 0x60, 0x81, 0x67, 0x4c, 0xb7, 0x9b, 0xfa, 0xa3, 0x46, 0x2e, 0x97, 0xa1, 0xcf, 0xf7, 0xe3, 0xbc, 0x5a, 0x2f, 0x77, 0xcc, 0x82, 0x26, 0x0a, - 0x2e, 0xa9, 0x66, 0xd5, 0x8d, 0xfd, 0xf4, 0x3e, 0x09, 0x1f, 0x30, 0x03, 0xba, 0x94, 0xfa, 0x7a, 0x81, 0x1d, 0x6f, 0x54, 0xcf, 0x1c, 0x78, 0x9f, 0xe4, 0xef, 0x94, 0xbe, 0xef, 0xf6, 0xce, 0x17, - 0x82, 0x10, 0xf4, 0x6b, 0x8b, 0x3f, 0x8c, 0x3e, 0x07, 0x8b, 0xcd, 0xf2, 0xd4, 0xf1, 0x21, 0x09, 0x43, 0x50, 0xe1, 0x66, 0x80, 0xb0, 0x06, 0x46, 0x6f, 0xb7, 0x43, 0xb6, 0xb3, 0x5d, 0xe0, 0x63, - 0x21, 0xb5, 0x4a, 0xf7, 0xd3, 0x13, 0x60, 0xb5, 0xbc, 0xb9, 0x66, 0x3a, 0x4a, 0x8b, 0xd5, 0x84, 0x4a, 0xc1, 0x34, 0xcc, 0x19, 0xad, 0x83, 0xf2, 0xe5, 0xcc, 0x99, 0xf6, 0x0b, 0x9f, 0xe6, 0xc9, - 0x47, 0xdd, 0xbe, 0x5a, 0x7b, 0xee, 0x6f, 0xa6, 0x2f, 0x8d, 0x85, 0xcf, 0xb4, 0xaf, 0x98, 0xf0, 0x7e, 0xe7, 0xd9, 0x82, 0x1f, 0x20, 0x6c, 0xb9, 0x24, 0xb0, 0xd1, 0xd3, 0x15, 0xee, 0x1d, 0x2d, - 0x35, 0x9a, 0x07, 0x33, 0xcd, 0x27, 0x0c, 0x4e, 0xcf, 0x79, 0x1d, 0x66, 0xb0, 0x9c, 0x85, 0x83, 0x95, 0xdd, 0xb0, 0x39, 0xb6, 0xf6, 0xea, 0x4c, 0xc9, 0x07, 0xb0, 0x67, 0x1b, 0x0f, 0x13, 0x66, - 0xde, 0x20, 0xe4, 0x10, 0xc6, 0xa8, 0xab, 0x55, 0x3b, 0x0a, 0xe0, 0x6c, 0x00, 0xd1, 0xa1, 0x42, 0xd7, 0xdd, 0xea, 0x58, 0x61, 0x44, 0x75, 0xe3, 0xae, 0xf9, 0x5c, 0xf7, 0xed, 0xee, 0x7a, 0x34, - 0x7d, 0xc9, 0x83, 0x70, 0x45, 0xf8, 0x8d, 0x07, 0x1f, 0x57, 0x93, 0x37, 0x82, 0xdf, 0x33, 0x20, 0xe6, 0x4d, 0x14, 0xa9, 0x08, 0xd3, 0xd5, 0x31, 0x6a, 0xbb, 0x11, 0x75, 0xc1, 0x6c, 0x73, 0x74, - 0x81, 0x68, 0xb5, 0x88, 0x46, 0xd6, 0xf1, 0xc0, 0xee, 0x93, 0xcc, 0xa6, 0x1a, 0x1e, 0xc6, 0xb1, 0x7d, 0x03, 0x57, 0x61, 0x16, 0x77, 0xd1, 0x86, 0x0d, 0x24, 0xc0, 0x80, 0xc5, 0x54, 0x74, 0xe6, - 0xc7, 0xb1, 0x45, 0x0f, 0xd8, 0x3e, 0xc5, 0x49, 0xa0, 0x42, 0xb7, 0xbb, 0xf8, 0x50, 0xe7, 0x69, 0xf1, 0x0c, 0x72, 0x5b, 0xeb, 0x27, 0xd1, 0x47, 0x69, 0x0b, 0xe8, 0xb1, 0x49, 0xfb, 0xa9, 0x4a, - 0xc5, 0xfd, 0xf1, 0xf3, 0x92, 0x6a, 0xfa, 0x8b, 0xec, 0x1b, 0xdb, 0xde, 0x2f, 0x2e, 0x27, 0xce, 0x4f, 0xa8, 0xa6, 0x59, 0xa6, 0x37, 0x4b, 0xd9, 0x30, 0x39, 0x53, 0x5b, 0x4f, 0xa7, 0xa9, 0x5f, - 0x9b, 0xa0, 0x8a, 0x12, 0x55, 0x56, 0x24, 0x61, 0xd2, 0x72, 0x1a, 0xe0, 0xf6, 0x75, 0x9e, 0xbb, 0xbb, 0x83, 0x21, 0x8d, 0xb2, 0x74, 0x6c, 0xdd, 0xa1, 0x1c, 0x37, 0x50, 0x81, 0x80, 0x5b, 0x0e, - 0x54, 0xa6, 0x2d, 0x43, 0xd3, 0x2e, 0x18, 0x89, 0x33, 0xdf, 0x35, 0x09, 0x69, 0x59, 0x7b, 0x07, 0x09, 0x06, 0x6c, 0x87, 0x7e, 0x42, 0x1f, 0xb9, 0x46, 0x7c, 0xfe, 0x71, 0xb3, 0xf3, 0x5e, 0x03, - 0xa6, 0xbc, 0xa3, 0xa3, 0xdc, 0xe7, 0xe9, 0xa7, 0x43, 0xe2, 0x47, 0xee, 0xac, 0xbf, 0xcf, 0xc9, 0xb8, 0xa2, 0x7b, 0xe6, 0xea, 0xef, 0xab, 0x67, 0xb3, 0x31, 0x08, 0x82, 0x73, 0xfb, 0x41, 0xcf, - 0x07, 0xa9, 0xe8, 0x50, 0x6f, 0x85, 0x4d, 0x11, 0x13, 0xb0, 0x49, 0x7e, 0x2c, 0x95, 0xd3, 0x36, 0x14, 0x01, 0x16, 0xb3, 0x75, 0x6e, 0x8f, 0x76, 0x56, 0x6a, 0x0d, 0x05, 0x0e, 0x63, 0xb0, 0xb7, - 0x58, 0x0a, 0x6d, 0x6c, 0x39, 0x2b, 0x7b, 0x5d, 0xad, 0xe1, 0x19, 0x76, 0x10, 0x8f, 0x11, 0x90, 0xa5, 0x9e, 0x87, 0xa8, 0x62, 0x02, 0x6c, 0xc2, 0x23, 0xab, 0xea, 0xe4, 0x53, 0x1a, 0x7f, 0x57, - 0x8c, 0xbb, 0x83, 0xff, 0xef, 0xc2, 0x9b, 0x7f, 0x10, 0x3d, 0xf3, 0xe2, 0xbd, 0xf9, 0x6c, 0x12, 0xba, 0xbd, 0x6a, 0x56, 0xa9, 0x1f, 0x02, 0x29, 0x96, 0x67, 0xc0, 0x08, 0xe2, 0x82, 0x34, 0xd7, - 0xdc, 0x6d, 0xcd, 0x83, 0x64, 0x89, 0x38, 0x91, 0x07, 0x89, 0x5a, 0xeb, 0x57, 0xeb, 0x85, 0x83, 0xd8, 0x01, 0x76, 0x88, 0x45, 0x8d, 0xa3, 0x1a, 0x8f, 0x13, 0x45, 0x59, 0x3b, 0x96, 0x14, 0xa0, - 0x18, 0x4c, 0x59, 0x6f, 0x8e, 0xc1, 0xd1, 0xb7, 0xdd, 0x71, 0x5b, 0xa4, 0xc8, 0xee, 0x48, 0xaa, 0x33, 0xff, 0x16, 0x4c, 0xb8, 0x7a, 0xbc, 0x3f, 0xc3, 0xaf, 0x74, 0xb8, 0x3a, 0x6f, 0x46, 0xd5, - 0x79, 0xf3, 0x85, 0x9f, 0xea, 0x25, 0xd4, 0x37, 0xf5, 0x29, 0x5a, 0x9f, 0xc0, 0x3d, 0xbd, 0x59, 0x04, 0xdd, 0x60, 0xa4, 0x45, 0x29, 0xb0, 0x18, 0x5e, 0x9f, 0x9c, 0xb6, 0xc6, 0xc5, 0x35, 0x88, - 0x30, 0xfd, 0xec, 0xb8, 0xf4, 0xb4, 0x98, 0x5f, 0x1c, 0x1c, 0x0f, 0xf6, 0x04, 0x95, 0x94, 0xb7, 0xa7, 0xce, 0x84, 0x57, 0x50, 0x67, 0x3a, 0xfa, 0x5e, 0x2e, 0x2d, 0x66, 0xad, 0xa6, 0x50, 0x06, - 0xb2, 0x32, 0x2d, 0x32, 0xf8, 0x54, 0xc4, 0x8b, 0x27, 0x1c, 0x77, 0x7f, 0x03, 0x42, 0xf4, 0x50, 0x37, 0xbe, 0xef, 0x04, 0x7d, 0x25, 0x0b, 0xec, 0xfe, 0x27, 0xce, 0xac, 0xbc, 0xfb, 0xe0, 0x92, - 0x62, 0xfe, 0x44, 0x7e, 0x58, 0xeb, 0xb0, 0xb0, 0x0e, 0xc7, 0xd1, 0xb8, 0xea, 0xe6, 0x51, 0x76, 0xd8, 0x80, 0x8e, 0xdd, 0x20, 0x3d, 0x8c, 0x75, 0x85, 0xb6, 0x89, 0xc9, 0x2a, 0xec, 0xc0, 0x8a, - 0x5d, 0x87, 0xf1, 0xda, 0xf1, 0x72, 0xaf, 0x27, 0xc2, 0x31, 0xee, 0x72, 0xc9, 0x43, 0x46, 0xa1, 0xf4, 0x8d, 0x03, 0x49, 0x1c, 0x1d, 0x14, 0xa9, 0x17, 0xbb, 0x2c, 0x05, 0xa6, 0xa1, 0xe5, 0xe8, - 0xb6, 0xb9, 0x6c, 0xa8, 0xd9, 0xfc, 0x78, 0xb3, 0xb3, 0xdd, 0x2a, 0x90, 0xf7, 0x19, 0xf3, 0x4a, 0x29, 0xdf, 0x2f, 0xb4, 0xc1, 0xc9, 0xd7, 0x3b, 0x93, 0xe9, 0x73, 0xc5, 0x7d, 0x97, 0xdd, 0xac, - 0xa0, 0xa1, 0x6c, 0x6b, 0x24, 0x84, 0x68, 0x90, 0xf6, 0x12, 0xb0, 0x14, 0x31, 0xb3, 0xdc, 0xfd, 0x9c, 0xa6, 0xfd, 0x9c, 0x88, 0x66, 0xeb, 0xb9, 0xcf, 0x4b, 0x20, 0xa8, 0x83, 0x39, 0x1b, 0x0b, - 0x63, 0x8a, 0x78, 0xfb, 0x19, 0xdf, 0xfa, 0xb2, 0x1b, 0xa3, 0x48, 0x6a, 0xf8, 0x7b, 0x4b, 0xd8, 0xae, 0x7a, 0xd6, 0xa2, 0xca, 0x02, 0x8f, 0x50, 0xd9, 0xe2, 0x7c, 0x2e, 0x70, 0x0b, 0xe6, 0x89, - 0x81, 0xe6, 0x6d, 0xcf, 0x26, 0xc0, 0xee, 0x50, 0xb4, 0xf5, 0x21, 0xfb, 0x5d, 0xdb, 0xea, 0x8b, 0x7a, 0x7d, 0x55, 0x8b, 0x1e, 0xff, 0x6a, 0x6e, 0x5d, 0x95, 0xc3, 0x45, 0x6f, 0xf0, 0x76, 0x7f, - 0xa9, 0x95, 0x97, 0x1d, 0xf4, 0xa2, 0x44, 0xde, 0x1d, 0xc3, 0x67, 0xae, 0xf9, 0x49, 0x5d, 0x3e, 0x10, 0x0e, 0xfa, 0x52, 0xfc, 0xf4, 0x07, 0xd1, 0x77, 0xa9, 0x9c, 0x9b, 0x13, 0xf4, 0xb9, 0x38, - 0xea, 0x58, 0x35, 0x20, 0x92, 0x3a, 0x14, 0xe4, 0xca, 0xef, 0x2a, 0x7f, 0x1b, 0x1f, 0x75, 0xcc, 0x45, 0x09, 0x1a, 0x9a, 0x19, 0x69, 0x53, 0x9d, 0xf0, 0xaa, 0x58, 0xed, 0xc2, 0xb0, 0x59, 0x9a, - 0xe8, 0x94, 0xc2, 0xf8, 0x6e, 0xed, 0x57, 0x46, 0x0e, 0x10, 0xdb, 0x58, 0x44, 0x28, 0xf1, 0xb8, 0x50, 0x1b, 0x86, 0x9b, 0xcd, 0x0a, 0xaf, 0xc0, 0x38, 0xad, 0xa3, 0x5a, 0x74, 0x7d, 0xa0, 0x36, - 0xab, 0x6c, 0x79, 0x7a, 0x2d, 0x5c, 0xeb, 0xda, 0xd5, 0x73, 0xb6, 0x2e, 0x91, 0x47, 0x7b, 0xe6, 0x17, 0xbb, 0xf7, 0xbe, 0x22, 0xff, 0x8a, 0x26, 0x7b, 0x4d, 0xf8, 0x8d, 0x97, 0xbf, 0x2e, 0x9f, - 0x2d, 0xba, 0x80, 0x11, 0x61, 0x5d, 0x0b, 0x4b, 0x50, 0x65, 0xd7, 0x72, 0x25, 0xab, 0x74, 0x0c, 0xe5, 0xf1, 0x86, 0xa6, 0x36, 0xcc, 0x72, 0xee, 0x03, 0x94, 0x49, 0xb8, 0x5b, 0x64, 0x3d, 0x5f, - 0x0a, 0x3e, 0x63, 0x1e, 0xdc, 0x8d, 0xda, 0x0a, 0x5b, 0xf1, 0x94, 0x0e, 0x8d, 0x23, 0x70, 0x22, 0x4a, 0x53, 0xb4, 0xe3, 0xb0, 0xda, 0x34, 0x2e, 0xf0, 0x11, 0x5e, 0x6f, 0xb6, 0x9e, 0x1a, 0x9e, - 0xac, 0x36, 0xc7, 0x04, 0xfe, 0xce, 0x4c, 0x8f, 0x82, 0xa1, 0xfc, 0xa7, 0xac, 0x0f, 0xed, 0xa1, 0x1d, 0xcb, 0xe0, 0x9f, 0x30, 0xf3, 0xa2, 0x3f, 0x45, 0x40, 0xfe, 0xfd, 0x06, 0x72, 0xff, 0x13, - 0x17, 0xae, 0xdc, 0x7b, 0x70, 0x89, 0x89, 0x7c, 0x62, 0x9f, 0x11, 0x13, 0xc6, 0x5f, 0x31, 0x15, 0x05, 0x5b, 0x99, 0x43, 0x74, 0x2b, 0x11, 0xf2, 0x1b, 0x62, 0x05, 0xf8, 0x26, 0x84, 0x24, 0xb8, - 0x2c, 0x25, 0x64, 0x8d, 0x32, 0x9d, 0x1e, 0x2b, 0x76, 0x01, 0xec, 0xf3, 0x40, 0x56, 0x80, 0x59, 0x38, 0x8f, 0xc3, 0xb4, 0x5a, 0xae, 0x92, 0x06, 0x3e, 0x89, 0x43, 0x91, 0x75, 0x24, 0x19, 0x57, - 0xe0, 0xd4, 0x1f, 0x20, 0x0d, 0x51, 0x35, 0x94, 0xd6, 0x56, 0x6b, 0xf5, 0xb5, 0xf1, 0xf6, 0x6f, 0x9f, 0x4c, 0x7e, 0x8c, 0x94, 0xf0, 0xac, 0xf9, 0xff, 0x31, 0xb7, 0xfb, 0x35, 0x54, 0x8e, 0x3b, - 0xf4, 0x2f, 0xe2, 0xb8, 0xb9, 0xfb, 0x2c, 0x36, 0x87, 0x1d, 0x42, 0x85, 0x15, 0xe0, 0xab, 0x26, 0x38, 0x25, 0xfc, 0xb2, 0x03, 0xe8, 0x92, 0xda, 0x26, 0x89, 0xb9, 0xcd, 0xcb, 0xac, 0xc2, 0x0d, - 0x0a, 0x2c, 0x01, 0xa2, 0x27, 0x1c, 0x5b, 0x03, 0x45, 0x66, 0x1e, 0xd7, 0x26, 0xc7, 0x99, 0x71, 0xef, 0x01, 0x47, 0x5a, 0x19, 0xbb, 0x6d, 0x57, 0x85, 0xae, 0xb5, 0x3e, 0x06, 0x26, 0x08, 0x72, - 0xce, 0x46, 0x68, 0x38, 0x81, 0x58, 0x49, 0x32, 0x78, 0x9c, 0xdd, 0x9c, 0xfb, 0xbc, 0xf7, 0xee, 0xb1, 0x76, 0xfb, 0x4a, 0x01, 0xdf, 0xf7, 0xd7, 0x2e, 0xfd, 0xbf, 0xb4, 0x26, 0x6f, 0x84, 0xbe, - 0xef, 0x74, 0xb2, 0x03, 0x08, 0xd1, 0x49, 0x36, 0xe4, 0x26, 0x41, 0xc6, 0x93, 0x2e, 0xf0, 0x96, 0xba, 0x4f, 0x5c, 0x0e, 0x73, 0xa9, 0x13, 0xa1, 0x22, 0x6e, 0x9c, 0x53, 0xf6, 0xd2, 0x5b, 0x0f, - 0xbe, 0x38, 0x1b, 0x24, 0xaf, 0x49, 0x02, 0x9e, 0xad, 0x81, 0xd1, 0x76, 0x41, 0x2b, 0xb7, 0x9b, 0xdd, 0x7e, 0x9e, 0x48, 0x19, 0x8c, 0x78, 0x35, 0x34, 0xe2, 0x76, 0x62, 0x73, 0x03, 0x9a, 0x4f, - 0x57, 0xf3, 0x02, 0x7e, 0xed, 0x68, 0xfc, 0x93, 0xab, 0xff, 0x6d, 0x04, 0xe2, 0x8f, 0x86, 0x56, 0xd3, 0xe5, 0x0f, 0x81, 0x17, 0xa0, 0x97, 0xfc, 0x67, 0xef, 0x34, 0xdf, 0x58, 0x78, 0x6e, 0x4d, - 0xa0, 0xef, 0xfd, 0x63, 0xf0, 0x84, 0x0c, 0x52, 0xc8, 0x09, 0x74, 0xc1, 0xc0, 0xd5, 0x20, 0xaa, 0x48, 0x12, 0x65, 0xab, 0x65, 0xb2, 0x86, 0xe6, 0x2e, 0xfc, 0x12, 0x10, 0x6a, 0x1b, 0xd7, 0x87, - 0x2e, 0xba, 0x2c, 0xf9, 0x3f, 0x91, 0x7f, 0xd0, 0x47, 0xaa, 0x5f, 0x1d, 0x3c, 0x32, 0xd6, 0xcf, 0x23, 0xfd, 0x95, 0xb9, 0xd4, 0x5e, 0x3a, 0xde, 0x5e, 0xd6, 0xf5, 0x27, 0xe6, 0xca, 0x12, 0xda, - 0xa2, 0x8e, 0xa5, 0x37, 0xc4, 0x0a, 0x75, 0x29, 0x98, 0xb0, 0x56, 0xfa, 0x08, 0xcf, 0xe7, 0x34, 0xc1, 0x78, 0x04, 0x47, 0xc6, 0x47, 0x37, 0xc2, 0xcd, 0x19, 0x96, 0xcb, 0xe3, 0x5e, 0x1c, 0xf4, - 0xcd, 0x0c, 0x49, 0x3b, 0x68, 0x61, 0x6f, 0x85, 0xcc, 0x9b, 0x6b, 0x5a, 0xb6, 0x77, 0x00, 0x4b, 0x21, 0x7a, 0x5e, 0x03, 0x7a, 0x73, 0x69, 0xe7, 0x0c, 0x4f, 0x43, 0xde, 0x06, 0x3f, 0x3a, 0xc2, - 0x4d, 0x2c, 0xf7, 0xef, 0x02, 0x83, 0x8f, 0xfc, 0xa4, 0x7f, 0xaf, 0xd2, 0xbe, 0xd3, 0xbc, 0x74, 0xf7, 0xd2, 0x7a, 0x16, 0xd4, 0xc0, 0xa4, 0x8a, 0x39, 0x49, 0x7a, 0x68, 0xb8, 0x03, 0x83, 0x3d, - 0xcb, 0xc3, 0x19, 0x04, 0x9a, 0x1a, 0xbc, 0x38, 0x34, 0x49, 0xb7, 0x48, 0xc7, 0x75, 0x4c, 0xc4, 0xcc, 0xd1, 0xde, 0x2c, 0xe7, 0x4e, 0xb4, 0xd9, 0x85, 0xc2, 0xb1, 0x25, 0x29, 0xc2, 0x8e, 0xba, - 0x14, 0x31, 0x55, 0x99, 0x0b, 0x16, 0x18, 0x23, 0x20, 0x39, 0x01, 0x76, 0xfd, 0xe8, 0xc9, 0x9b, 0x35, 0x1e, 0x6e, 0x5b, 0xb6, 0x5f, 0x8f, 0xa7, 0xdb, 0xe5, 0xe1, 0xad, 0xb4, 0xe5, 0xa3, 0x8d, - 0xeb, 0x85, 0x71, 0x1d, 0xfa, 0xbb, 0x73, 0x67, 0x43, 0x7f, 0x77, 0xd9, 0x94, 0x9e, 0x58, 0x13, 0x36, 0x48, 0x7c, 0x38, 0xfa, 0x27, 0x7e, 0xab, 0x26, 0x04, 0x01, 0x5a, 0x5e, 0xea, 0x19, 0x4b, - 0x7b, 0x8f, 0xa8, 0x72, 0x0e, 0x0c, 0xca, 0x22, 0xd0, 0xfd, 0xe5, 0xb2, 0x63, 0x88, 0x64, 0x97, 0x12, 0xdb, 0x3d, 0x7e, 0x4a, 0x10, 0x9e, 0x14, 0x04, 0x7a, 0x48, 0xa2, 0x5d, 0xc1, 0xf1, 0xa5, - 0x38, 0xdf, 0x2a, 0xa3, 0xb2, 0x8b, 0x46, 0x91, 0x4b, 0x34, 0x80, 0x2c, 0xd4, 0xda, 0xc1, 0x76, 0xae, 0x50, 0xdf, 0x98, 0x78, 0x17, 0x67, 0xfc, 0x1f, 0x11, 0x54, 0xb0, 0x97, 0xd0, 0xaa, 0xaf, - 0xe8, 0x82, 0x93, 0xeb, 0xab, 0x09, 0xf6, 0x1c, 0x6a, 0x75, 0x5d, 0xa2, 0xc6, 0x01, 0x22, 0xa4, 0x9d, 0x9f, 0xe7, 0xd2, 0x56, 0x38, 0x46, 0x9e, 0x32, 0xe8, 0x86, 0x58, 0x13, 0x5b, 0x61, 0x63, - 0x6c, 0xf6, 0x98, 0x41, 0xcd, 0x2a, 0x98, 0x07, 0xca, 0x72, 0xbb, 0x3a, 0x10, 0x10, 0xe0, 0x04, 0x1e, 0x37, 0xec, 0x7b, 0x8c, 0xf3, 0x49, 0x45, 0x53, 0x00, 0x81, 0xc3, 0xb7, 0x69, 0xe1, 0xe4, - 0xc8, 0xa6, 0xd3, 0x3a, 0xd6, 0xce, 0xcb, 0xce, 0x39, 0xe6, 0xac, 0x7d, 0x33, 0xb6, 0x3f, 0x97, 0x1a, 0x7c, 0xb4, 0x2d, 0xfe, 0xbd, 0xbc, 0xaf, 0xe8, 0x7e, 0x74, 0xff, 0xed, 0xea, 0xb2, 0x0d, - 0x3e, 0x21, 0x7d, 0xcd, 0x33, 0x0d, 0xbe, 0x31, 0x3d, 0x45, 0xe9, 0xa4, 0x7e, 0xcf, 0x24, 0xe9, 0x81, 0xd6, 0xe6, 0xb4, 0x84, 0x83, 0xc1, 0x12, 0xdf, 0x24, 0xf5, 0x71, 0xd4, 0xac, 0xcc, 0x25, - 0x18, 0x5a, 0x1f, 0xa7, 0x1c, 0x10, 0xb3, 0xc7, 0x78, 0xca, 0xe0, 0xd9, 0x42, 0x00, 0x0a, 0xcd, 0x8f, 0xb7, 0x7c, 0xb8, 0xd8, 0x6a, 0x40, 0xb4, 0x16, 0x98, 0x5d, 0xed, 0x37, 0xaa, 0x67, 0x36, - 0x10, 0x0f, 0xb8, 0x8c, 0xfa, 0x84, 0x45, 0xf2, 0xb6, 0xa6, 0xfd, 0xf8, 0x09, 0x3d, 0x3e, 0xef, 0x7e, 0x74, 0x7e, 0x73, 0x9f, 0x7b, 0xd3, 0x17, 0x62, 0x08, 0xee, 0x7e, 0xe1, 0x83, 0x8f, 0x5f, - 0xef, 0x4f, 0x2e, 0xdf, 0xf8, 0x9e, 0xa3, 0x01, 0xb2, 0xe5, 0x68, 0xc4, 0x12, 0xd7, 0x50, 0x3f, 0x34, 0xc1, 0xc6, 0x9f, 0x66, 0x0d, 0xa7, 0x4d, 0x01, 0x54, 0x55, 0x6c, 0x7c, 0x5e, 0x2e, 0x6d, - 0xdd, 0x83, 0xdd, 0x98, 0xd7, 0x09, 0xc3, 0x04, 0x84, 0xf4, 0xa8, 0xae, 0xd8, 0xdc, 0x88, 0xb7, 0xec, 0x32, 0x6b, 0xeb, 0x76, 0xc1, 0x85, 0x7b, 0x27, 0xde, 0xcc, 0x6b, 0x75, 0xa7, 0xb5, 0x29, - 0x20, 0xc5, 0x39, 0xc7, 0xf8, 0x9a, 0xef, 0x72, 0xf0, 0x8d, 0x12, 0x7c, 0xaf, 0xf4, 0xed, 0x7d, 0xc6, 0xbc, 0xa2, 0x61, 0xdc, 0x50, 0xbf, 0x04, 0x4f, 0x7f, 0xb9, 0x37, 0xb9, 0xd0, 0xfe, 0x9e, - 0x21, 0xb8, 0x67, 0x02, 0xab, 0xbe, 0x09, 0x4e, 0x3d, 0xb1, 0x59, 0x91, 0x60, 0x31, 0x1e, 0xa5, 0xf5, 0x40, 0xea, 0xa5, 0x35, 0xa7, 0xf8, 0x7a, 0xe7, 0x24, 0xb6, 0x9d, 0x55, 0xec, 0xf4, 0x84, - 0xf9, 0x98, 0xad, 0x33, 0xdc, 0xaa, 0x6a, 0xb7, 0x61, 0xb3, 0x4a, 0x8b, 0x5e, 0x18, 0xab, 0x6d, 0x82, 0x46, 0xbe, 0xaf, 0xb4, 0xd6, 0xbc, 0x9b, 0xed, 0x29, 0x95, 0x56, 0xcc, 0x43, 0x2b, 0x23, - 0x78, 0x25, 0x99, 0x37, 0x4b, 0xe9, 0x4d, 0xfc, 0xf8, 0x35, 0x17, 0x88, 0x7f, 0xd0, 0x17, 0xdc, 0x88, 0x5f, 0xe3, 0xc6, 0x2f, 0x54, 0xbe, 0xef, 0xaf, 0xc2, 0xc0, 0xbb, 0x56, 0x90, 0xb1, 0x3a, - 0x9b, 0xd7, 0x9a, 0xd8, 0xf2, 0xdc, 0x66, 0xb1, 0x39, 0xad, 0x47, 0x7d, 0xcc, 0x96, 0x72, 0x47, 0x29, 0xd4, 0x66, 0xc1, 0xd2, 0xf8, 0xdc, 0xe0, 0xc5, 0x03, 0xb9, 0x64, 0x85, 0xcd, 0x7a, 0x69, - 0xe1, 0x51, 0x58, 0x26, 0xbb, 0x5e, 0xca, 0x73, 0x09, 0xf4, 0xe9, 0x74, 0xad, 0xd6, 0x55, 0x87, 0x65, 0x38, 0x2a, 0x8a, 0x6a, 0xc9, 0x19, 0x35, 0x9d, 0x34, 0xe8, 0x13, 0x47, 0x68, 0xd7, 0x19, - 0xed, 0x1f, 0x27, 0xb0, 0xf7, 0x27, 0xd6, 0x1d, 0x6c, 0x81, 0xfb, 0x63, 0xe7, 0x15, 0x7b, 0xfc, 0x86, 0xfa, 0x85, 0x81, 0x5f, 0xee, 0x3d, 0x9b, 0xe9, 0xbc, 0xda, 0x14, 0x1b, 0x7d, 0x58, 0xdb, - 0x5d, 0x50, 0xef, 0x71, 0x0c, 0xb5, 0xc3, 0x2e, 0x4b, 0xd4, 0x81, 0xd1, 0x48, 0xd8, 0x08, 0x21, 0xa0, 0x0a, 0xf5, 0x19, 0x81, 0xca, 0x0b, 0x47, 0xda, 0x8d, 0x4b, 0x67, 0x2e, 0x50, 0x53, 0xba, - 0x9b, 0x43, 0xfb, 0xa8, 0xd6, 0xcb, 0x15, 0xd7, 0xad, 0xdd, 0xc2, 0xc8, 0xd3, 0x72, 0x6c, 0xe6, 0xf9, 0x69, 0x10, 0x6d, 0x49, 0x09, 0x3d, 0x5c, 0x4b, 0xf9, 0x78, 0xbc, 0x5d, 0x9d, 0x3f, 0xfb, - 0xe1, 0xfe, 0x3d, 0xf5, 0xe3, 0x9a, 0xf0, 0x99, 0x0d, 0x57, 0x97, 0xcf, 0x2a, 0x22, 0x15, 0x66, 0x6b, 0x63, 0x5b, 0xf1, 0xb3, 0x85, 0x34, 0xdf, 0x0b, 0x7e, 0xb2, 0x5c, 0xd4, 0x0e, 0x0c, 0xe5, - 0x47, 0x79, 0x75, 0x2c, 0xf4, 0x78, 0x8a, 0x80, 0x80, 0x70, 0x60, 0x32, 0xde, 0x42, 0xb7, 0x88, 0x6c, 0xcb, 0x33, 0x64, 0x18, 0xc4, 0xd2, 0xe5, 0xfd, 0x9c, 0x9a, 0xf6, 0x01, 0xc4, 0x78, 0x87, - 0x0d, 0xba, 0xea, 0xc5, 0x51, 0xa8, 0x22, 0xac, 0x37, 0x88, 0xa0, 0x1c, 0xd6, 0x47, 0xc8, 0x3d, 0x3e, 0x71, 0x2c, 0xf2, 0x4d, 0x50, 0xe1, 0x3d, 0xec, 0xf5, 0x2f, 0x36, 0xe4, 0x4d, 0x90, 0xf4, - 0xf9, 0x1d, 0xea, 0xe1, 0xa0, 0x7c, 0x94, 0xf3, 0xf5, 0x48, 0x1a, 0x7f, 0x7f, 0xd6, 0x72, 0xff, 0x13, 0x17, 0xb9, 0xdc, 0x7b, 0xf0, 0x6c, 0x78, 0x10, 0xc3, 0x48, 0xd1, 0x8a, 0x9c, 0x32, 0xa2, - 0x2e, 0xe6, 0xb8, 0x95, 0x5a, 0xfc, 0x72, 0x1e, 0xc9, 0x9b, 0xee, 0x80, 0xc3, 0x3c, 0xc3, 0x19, 0x29, 0x7c, 0x02, 0x07, 0x83, 0x37, 0x17, 0x87, 0x53, 0xa5, 0xe2, 0xbd, 0x4a, 0x24, 0x09, 0x24, - 0x0e, 0x6c, 0x95, 0x2d, 0x3a, 0x9f, 0x98, 0x15, 0x35, 0x08, 0xc8, 0x71, 0xb6, 0x55, 0x16, 0x50, 0x1f, 0xcf, 0xea, 0x8a, 0xc2, 0x35, 0xa4, 0x9a, 0x2b, 0x56, 0xf0, 0x9a, 0x51, 0xf5, 0x3b, 0xa9, - 0xee, 0x27, 0xf1, 0x69, 0xfe, 0x5f, 0x91, 0x7a, 0x94, 0xca, 0xf6, 0x6d, 0x02, 0x0e, 0xf1, 0x72, 0xc2, 0xd5, 0xed, 0x42, 0xfa, 0x54, 0xb2, 0xd5, 0x99, 0xb9, 0x80, 0xc0, 0xe0, 0xa7, 0x0d, 0x4d, - 0xc9, 0x56, 0x8c, 0x9f, 0x0e, 0x47, 0x47, 0x97, 0x69, 0x79, 0xde, 0x1f, 0xb1, 0x7a, 0x8b, 0x68, 0x73, 0x21, 0x13, 0x13, 0x34, 0x0b, 0x93, 0x6a, 0x31, 0x1f, 0x56, 0x50, 0xd7, 0xf5, 0x6c, 0x14, - 0x84, 0x3b, 0x55, 0xdc, 0x61, 0xd4, 0x91, 0x0a, 0x8f, 0x70, 0x4f, 0x0a, 0x5b, 0xa3, 0xed, 0x87, 0xae, 0xab, 0x2a, 0x3a, 0x5d, 0x50, 0xca, 0x92, 0x56, 0xd5, 0xa8, 0x82, 0x9f, 0xca, 0x4d, 0xba, - 0x3f, 0x4a, 0xaf, 0x03, 0x45, 0xee, 0xfb, 0x30, 0x5f, 0x51, 0xdb, 0x7f, 0x93, 0x3d, 0x33, 0xe9, 0xd7, 0xc5, 0x04, 0x7d, 0x4e, 0x85, 0x97, 0x9d, 0xa1, 0x44, 0xa7, 0x52, 0xe6, 0xc2, 0x1e, 0x22, - 0x6e, 0x49, 0x57, 0x8f, 0x78, 0x56, 0x42, 0x8b, 0x64, 0x31, 0x3f, 0x25, 0x5b, 0xbf, 0x6f, 0x7b, 0xc5, 0xb4, 0xa4, 0x08, 0xaa, 0xf4, 0xd5, 0xa9, 0xe1, 0x0e, 0x22, 0x2a, 0x84, 0xd1, 0x3e, 0x24, - 0x25, 0x9f, 0x59, 0xf3, 0x26, 0x6a, 0xec, 0x83, 0x94, 0x9b, 0x2d, 0x32, 0xab, 0x2f, 0x8c, 0xa2, 0xdc, 0xf8, 0xaa, 0xbb, 0x88, 0xf9, 0x65, 0x06, 0x3e, 0x71, 0x0a, 0xf8, 0x20, 0x2a, 0xe9, 0x3e, - 0xe7, 0x3e, 0x62, 0x37, 0xee, 0xbb, 0xe5, 0x5f, 0xf1, 0x58, 0xbe, 0x91, 0x3c, 0x73, 0xec, 0xd2, 0x98, 0x4c, 0x9f, 0xf3, 0x52, 0x9a, 0xbb, 0x74, 0x27, 0xaa, 0xd6, 0xbe, 0xa8, 0x95, 0x3d, 0x8f, - 0x6b, 0xb2, 0x4d, 0xa2, 0xd5, 0x6e, 0xbe, 0xc4, 0xa5, 0x79, 0xb4, 0x91, 0x94, 0xfd, 0x06, 0x47, 0x1c, 0xd2, 0xc3, 0x3a, 0x87, 0xdb, 0x1c, 0xa9, 0xd1, 0x17, 0xf4, 0x4d, 0x4f, 0xcf, 0x97, 0x52, - 0x35, 0xf7, 0xc5, 0x34, 0x80, 0x37, 0x6b, 0xab, 0xcc, 0x52, 0x01, 0xb2, 0x9c, 0x92, 0xe5, 0xe2, 0x9a, 0xf5, 0x69, 0xd5, 0x99, 0x4f, 0xd7, 0xd6, 0xad, 0x82, 0x76, 0xd1, 0x1b, 0xaf, 0x3c, 0x85, - 0x6d, 0x9d, 0x3c, 0x1a, 0x34, 0xaf, 0xa1, 0x8c, 0xdf, 0xfd, 0xc2, 0x99, 0x1b, 0xf7, 0xee, 0x3f, 0x8b, 0x3c, 0x1e, 0x5b, 0xec, 0x1e, 0x4c, 0xaa, 0x90, 0xc8, 0x4a, 0x08, 0xa4, 0xa3, 0x35, 0x4f, - 0x80, 0xbe, 0xaf, 0xc2, 0x0b, 0xab, 0x35, 0x14, 0x8d, 0x36, 0xd2, 0xec, 0xc4, 0x26, 0xbb, 0x0d, 0x96, 0xd4, 0xf4, 0xc6, 0x9f, 0xc1, 0x51, 0x9d, 0x36, 0x45, 0x20, 0x21, 0xb8, 0x23, 0xe0, 0x03, - 0xcd, 0x2e, 0x99, 0x99, 0xcf, 0x1e, 0x55, 0x32, 0x34, 0x8d, 0x35, 0x64, 0x9e, 0xb8, 0x65, 0x0c, 0x22, 0xfa, 0x08, 0x3c, 0x4a, 0xd9, 0xff, 0xeb, 0x1d, 0xe8, 0x69, 0x17, 0xe5, 0xd5, 0x6b, 0x77, - 0x51, 0xe9, 0xa0, 0x49, 0x11, 0x0c, 0xed, 0x23, 0x8c, 0xb4, 0xbb, 0x0c, 0x0c, 0xfe, 0x50, 0xeb, 0xf5, 0x25, 0xd5, 0xe0, 0xc1, 0x47, 0x1e, 0x09, 0x30, 0x28, 0xfc, 0x67, 0x55, 0x86, 0x91, 0x1a, - 0xd8, 0xb4, 0x87, 0x35, 0x04, 0xa5, 0xfb, 0x3d, 0x39, 0x3b, 0xae, 0xcb, 0xdd, 0x28, 0x23, 0xca, 0xa2, 0x86, 0x53, 0xa2, 0x17, 0x51, 0x2a, 0x04, 0xf6, 0x78, 0x76, 0x5c, 0x15, 0xc6, 0xf2, 0x04, - 0xe4, 0x27, 0x8a, 0x15, 0x4e, 0x94, 0xe2, 0x68, 0x41, 0xc6, 0xed, 0xa7, 0xc8, 0x5e, 0x3d, 0xe1, 0x40, 0x95, 0x91, 0x43, 0x1a, 0x4a, 0xe4, 0xc1, 0x39, 0x8d, 0x68, 0x4a, 0x6b, 0x98, 0x6e, 0x62, - 0x4f, 0x28, 0xa0, 0xff, 0x0b, 0x81, 0x3d, 0x2f, 0x87, 0xa6, 0xf5, 0xfe, 0x18, 0x4b, 0xf7, 0x2f, 0x49, 0xe2, 0xf2, 0x99, 0x47, 0xb2, 0xb8, 0x3c, 0x7c, 0x56, 0x1a, 0x69, 0x8c, 0x07, 0x14, 0x39, - 0x55, 0x99, 0xf0, 0x38, 0x18, 0x18, 0xd4, 0xfa, 0x0e, 0x52, 0xac, 0xdc, 0xe2, 0xc0, 0x62, 0x60, 0x2e, 0xf3, 0x92, 0xba, 0x9a, 0xe9, 0x61, 0x4f, 0xb6, 0xd8, 0x38, 0xb6, 0xfb, 0x83, 0xd9, 0x88, - 0x2b, 0x65, 0x38, 0x2e, 0xc0, 0x19, 0x4a, 0x55, 0x1d, 0xdc, 0x70, 0x90, 0xda, 0x5a, 0x0b, 0x54, 0x65, 0x21, 0x3b, 0x92, 0x8c, 0x7c, 0x67, 0xf5, 0xa7, 0xa4, 0x77, 0x3a, 0xf7, 0x25, 0x05, 0xee, - 0x7f, 0x29, 0x8d, 0xae, 0x0c, 0x6a, 0x2f, 0x7a, 0x1c, 0x39, 0x44, 0xbe, 0x84, 0x5c, 0xfe, 0x9b, 0xec, 0x5b, 0xd6, 0xe9, 0xfb, 0xc5, 0x84, 0x7c, 0x0e, 0xbf, 0xfc, 0xc0, 0xb0, 0x80, 0xa7, 0x34, - 0x6c, 0x7a, 0x3a, 0xa5, 0xb9, 0x8a, 0xd1, 0xaa, 0xc6, 0x68, 0xbc, 0x01, 0xb8, 0xc4, 0x5c, 0x3b, 0x65, 0x03, 0xc0, 0xe9, 0x35, 0xe8, 0xcd, 0xfb, 0x25, 0x44, 0xee, 0x17, 0xc0, 0x0a, 0x99, 0x46, - 0x0d, 0x97, 0xd3, 0x06, 0x2c, 0x2f, 0xc3, 0x93, 0x07, 0x87, 0x12, 0xa0, 0x01, 0x86, 0x94, 0xad, 0xe9, 0x83, 0xe2, 0x96, 0xea, 0xf1, 0x70, 0x98, 0x81, 0xe5, 0x4a, 0x85, 0xe7, 0x2f, 0x1e, 0xa9, - 0x1c, 0xf2, 0xf2, 0x50, 0x9c, 0x7f, 0x7b, 0x90, 0x27, 0x6d, 0xfb, 0x0b, 0xb0, 0xe0, 0xcb, 0x69, 0xe9, 0x9b, 0x1d, 0x94, 0x7a, 0x1f, 0x88, 0x6e, 0x5f, 0xd6, 0xab, 0xdf, 0xc8, 0x0c, 0xd3, 0x8b, - 0x47, 0xf8, 0xea, 0xd1, 0x25, 0xc4, 0xf7, 0xdd, 0x37, 0xf1, 0x39, 0x9c, 0xf5, 0x4b, 0xa8, 0x6f, 0x78, 0xa8, 0xf3, 0x89, 0xef, 0xb5, 0xde, 0x8f, 0xbb, 0x61, 0x94, 0x9f, 0xaa, 0xe8, 0x7f, 0x00, - 0x20, 0x5e, 0x3d, 0xff, 0x0d, 0xf4, 0xf5, 0x36, 0x20, 0xbe, 0x54, 0x65, 0xbd, 0xe0, 0x5f, 0x7d, 0x31, 0x0e, 0x6f, 0xea, 0xc4, 0x5f, 0x3d, 0xb8, 0x42, 0x7a, 0x78, 0xb3, 0xc3, 0x1f, 0x0f, 0xaf, - 0xf6, 0x31, 0x94, 0x20, 0xfe, 0xd2, 0x41, 0xde, 0x2f, 0xaa, 0x1f, 0x83, 0xeb, 0xdc, 0x9e, 0xe0, 0xcf, 0x1d, 0xd7, 0xc5, 0xab, 0x43, 0xac, 0x04, 0x8b, 0x70, 0x0f, 0xee, 0xe8, 0x29, 0xc9, 0x0e, - 0xa5, 0x07, 0xf6, 0x53, 0x32, 0xde, 0xb7, 0x1a, 0xee, 0x7a, 0xab, 0xca, 0xde, 0x42, 0xfa, 0x06, 0xab, 0xe5, 0xa3, 0x05, 0xb1, 0x44, 0xe9, 0xad, 0x1a, 0xc6, 0x44, 0x75, 0xec, 0x34, 0xfa, 0x27, - 0xa7, 0x6e, 0x32, 0x55, 0x6c, 0x53, 0x30, 0xf2, 0xa7, 0x64, 0x35, 0x60, 0x53, 0x28, 0x95, 0xda, 0x5d, 0x83, 0x1f, 0x05, 0x38, 0x7c, 0x6d, 0x2f, 0xfc, 0xa3, 0x48, 0x3e, 0xcd, 0xcc, 0x1f, 0xff, - 0x25, 0x1f, 0x43, 0x5a, 0xb7, 0x5e, 0xf9, 0xc8, 0x51, 0x34, 0xfd, 0x07, 0x46, 0x5f, 0x98, 0xbe, 0x67, 0x8a, 0xe0, 0xe4, 0xf2, 0x67, 0xf2, 0x46, 0xe2, 0x7b, 0xbe, 0x42, 0xa0, 0x83, 0x40, 0x5a, - 0xbf, 0x5a, 0x98, 0x7b, 0x7d, 0xb7, 0x66, 0x8d, 0x64, 0x4a, 0xd3, 0x46, 0x03, 0xa8, 0xb4, 0xe2, 0xba, 0x7d, 0xa5, 0x49, 0x5e, 0x52, 0x0a, 0xec, 0xac, 0x2f, 0x61, 0xc8, 0xd7, 0x97, 0x49, 0xb9, - 0x39, 0x1a, 0x6e, 0x6f, 0x9a, 0x6c, 0x02, 0xc1, 0x0e, 0xa8, 0xee, 0xb3, 0x85, 0x30, 0xce, 0x25, 0x3e, 0x5e, 0xec, 0xd2, 0xc3, 0x6e, 0x0f, 0x70, 0x52, 0xc1, 0x84, 0x32, 0xcd, 0xbf, 0x66, 0x30, - 0xf9, 0x41, 0x50, 0x4e, 0x82, 0xaa, 0xbb, 0x54, 0x7a, 0xff, 0xf1, 0x13, 0xfe, 0x3a, 0x93, 0xde, 0x56, 0x49, 0xff, 0xfd, 0xe1, 0xd7, 0xc4, 0xba, 0x43, 0xfb, 0x06, 0x96, 0xf2, 0xe3, 0xcd, 0x93, - 0xf9, 0x45, 0x2c, 0xe1, 0xa1, 0x9e, 0x7c, 0xc0, 0xdd, 0xfe, 0x3c, 0x2f, 0x66, 0x9f, 0xe6, 0xf9, 0x4d, 0xc1, 0xd8, 0xdb, 0x8f, 0x7f, 0x94, 0x42, 0xf8, 0x49, 0xfc, 0x03, 0x5f, 0x01, 0x37, 0xfd, - 0x46, 0x2f, 0xbf, 0xfc, 0xa4, 0x4f, 0x54, 0xaf, 0x8b, 0x29, 0xff, 0x44, 0x6e, 0x4a, 0x2d, 0xff, 0xc6, 0x83, 0x7f, 0xfb, 0xbf, 0xd8, 0xe7, 0x99, 0xfd, 0x0b, 0x3d, 0xea, 0xfc, 0x14, 0xf9, 0xfc, - 0xf4, 0xd6, 0x9a, 0xff, 0x09, 0x7f, 0xf2, 0x2d, 0xfe, 0x1e, 0x33, 0x1f, 0xbd, 0xb9, 0x7d, 0xfa, 0x7e, 0x8e, 0x77, 0x66, 0xc7, 0xd7, 0xd0, 0xee, 0x07, 0xea, 0xf2, 0xdb, 0x2f, 0xf9, 0xc4, 0x96, - 0xaf, 0xa7, 0x66, 0xe4, 0xdf, 0x58, 0xb9, 0x0f, 0x33, 0xb7, 0xff, 0xf3, 0x9f, 0xaf, 0xba, 0x04, 0xf1, 0xa2, 0xb5, 0xfb, 0x7d, 0x02, 0xf7, 0x57, 0xb7, 0xe9, 0x7f, 0x1e, 0xcd, 0x14, 0x8f, 0x28, - 0x67, 0x73, 0x3f, 0x86, 0x07, 0x69, 0x41, 0x47, 0xeb, 0xd1, 0x30, 0x85, 0x48, 0x5e, 0x0e, 0xe0, 0xd0, 0x73, 0x6e, 0xb3, 0x57, 0x60, 0xd3, 0xc7, 0x83, 0xc8, 0x71, 0x14, 0x74, 0xe6, 0xaf, 0xac, - 0xa9, 0xbb, 0xd4, 0x94, 0x19, 0x67, 0xae, 0x79, 0x20, 0xee, 0x47, 0x44, 0x36, 0x59, 0x80, 0xc9, 0x00, 0x63, 0x94, 0x6d, 0x5a, 0x29, 0xfa, 0x13, 0x98, 0x8e, 0x31, 0x58, 0x75, 0xed, 0x9b, 0xeb, - 0xf4, 0xd3, 0x97, 0x9f, 0xb6, 0x7e, 0x7f, 0x87, 0xca, 0xde, 0x5b, 0x41, 0xa0, 0x97, 0x32, 0x6f, 0xdf, 0x69, 0x9e, 0xd7, 0x90, 0xb7, 0xd6, 0x04, 0x7a, 0x2e, 0xdb, 0x16, 0x10, 0x20, 0x59, 0x8e, - 0xd2, 0xf4, 0x40, 0x31, 0xae, 0x8d, 0x2c, 0x43, 0xff, 0xa8, 0x85, 0x73, 0x60, 0x29, 0xc9, 0x6c, 0x3d, 0x64, 0xb6, 0xe1, 0x04, 0x3b, 0x8c, 0xf3, 0x34, 0x47, 0x83, 0xc3, 0x00, 0x5f, 0x8c, 0x71, - 0x08, 0x81, 0xa1, 0x91, 0x8b, 0xd0, 0x96, 0x4f, 0x5c, 0x98, 0x27, 0x99, 0x35, 0xbe, 0x13, 0xec, 0x0c, 0x91, 0xcb, 0xac, 0xd5, 0xcb, 0xf6, 0x94, 0xda, 0x92, 0x35, 0xdb, 0x4b, 0x4f, 0x68, 0xb9, - 0xdb, 0xa4, 0x68, 0xeb, 0xe0, 0x4d, 0x5f, 0x82, 0x1f, 0x03, 0x2d, 0x7f, 0x4d, 0x19, 0xb9, 0xef, 0x60, 0x7d, 0xc5, 0x59, 0xf0, 0x89, 0xf2, 0x99, 0x6f, 0xd7, 0xd7, 0x97, 0x3c, 0xae, 0x27, 0x8c, - 0xe0, 0xbd, 0xc7, 0x55, 0x39, 0xcc, 0xcd, 0xd6, 0x54, 0x59, 0xa2, 0x8a, 0xdd, 0xaf, 0x48, 0x94, 0x44, 0xac, 0xf9, 0xb6, 0x28, 0xed, 0x62, 0xb5, 0x57, 0xa8, 0x41, 0x50, 0x28, 0x5f, 0x6f, 0x51, - 0x06, 0x01, 0xfc, 0xdc, 0x4e, 0x2c, 0xd2, 0x86, 0x0d, 0xb5, 0xcf, 0x79, 0x75, 0xa0, 0x67, 0xf5, 0x4c, 0x9f, 0x12, 0xea, 0x36, 0x76, 0x29, 0x5c, 0xc4, 0xc7, 0xd8, 0x55, 0xec, 0x6e, 0x64, 0x55, - 0x99, 0x78, 0x86, 0x7b, 0x0f, 0xd2, 0x76, 0x1e, 0xb1, 0xf0, 0x7d, 0xa2, 0x3f, 0x62, 0xde, 0xdf, 0xfb, 0xf4, 0xdf, 0x69, 0xbe, 0xb1, 0xed, 0xdc, 0xba, 0x30, 0xec, 0x1b, 0xaf, 0x3e, 0x3c, 0xe1, - 0xfc, 0xb5, 0x08, 0xe2, 0x15, 0xa9, 0xd8, 0x59, 0xd4, 0x6c, 0x77, 0xfb, 0xd9, 0x06, 0x06, 0xb8, 0x83, 0x97, 0x4c, 0x43, 0xf3, 0xfb, 0xa0, 0xde, 0x36, 0x29, 0xc6, 0x49, 0x56, 0x77, 0x8f, 0xac, - 0x16, 0xe8, 0x82, 0xea, 0xfb, 0xd7, 0x3d, 0x79, 0xa7, 0x7a, 0xee, 0xca, 0x7b, 0x73, 0xf2, 0x46, 0xea, 0x7b, 0xe9, 0x6f, 0x3b, 0x79, 0x71, 0xea, 0x89, 0xb2, 0xac, 0xc6, 0xbc, 0x53, 0xd1, 0xb2, - 0x85, 0xa1, 0x74, 0xbe, 0x07, 0x71, 0x7d, 0x19, 0xb8, 0xf2, 0x36, 0xf1, 0x93, 0x78, 0xa9, 0x9b, 0x80, 0x82, 0x37, 0x87, 0x88, 0xc7, 0x67, 0x05, 0x73, 0x12, 0xa0, 0xaa, 0xe5, 0xac, 0xc5, 0xbc, - 0x8b, 0x7b, 0x78, 0x40, 0xfd, 0x51, 0x89, 0x36, 0x32, 0x28, 0xad, 0x85, 0x85, 0xdb, 0xac, 0x25, 0x12, 0x06, 0x46, 0xf6, 0x24, 0xdf, 0xb8, 0x40, 0xda, 0xc3, 0x7b, 0x79, 0x90, 0xda, 0x2b, 0xa2, - 0x47, 0x7a, 0x07, 0xf6, 0x52, 0xba, 0xea, 0x67, 0xd2, 0x67, 0x16, 0x7c, 0xba, 0x31, 0xc1, 0xbe, 0x4f, 0x55, 0xbd, 0x1c, 0x4d, 0x61, 0x1a, 0x91, 0x9c, 0x70, 0x1b, 0x1b, 0x67, 0x35, 0xbc, 0xeb, - 0x77, 0xd1, 0x51, 0x1f, 0xb6, 0xdb, 0x45, 0x4f, 0x98, 0x7b, 0x34, 0x52, 0x47, 0xcc, 0x5f, 0xf8, 0xad, 0x3b, 0xad, 0xb9, 0x63, 0x20, 0x57, 0x71, 0xed, 0x8b, 0x1a, 0x20, 0x27, 0xe0, 0x7c, 0xc0, - 0xdb, 0x51, 0x82, 0x94, 0xd9, 0x16, 0x40, 0x04, 0x76, 0x2c, 0x02, 0x76, 0x29, 0x26, 0x42, 0x55, 0xd3, 0x1c, 0x6b, 0x28, 0x7b, 0xb2, 0x79, 0x4d, 0xc3, 0xbb, 0xae, 0xe2, 0x73, 0x56, 0x94, 0x1f, - 0x3a, 0xd2, 0x3e, 0xc0, 0xcc, 0xee, 0x7b, 0x1f, 0x5f, 0x49, 0x84, 0xbc, 0x50, 0xbc, 0xf0, 0xb0, 0x7b, 0x47, 0xc9, 0x7c, 0x62, 0x01, 0xb1, 0x98, 0x81, 0x34, 0x47, 0x6c, 0x2d, 0xb7, 0xaa, 0xb1, - 0x6a, 0x17, 0x15, 0xb0, 0x84, 0x50, 0xb0, 0x91, 0xb8, 0xda, 0x66, 0xe5, 0xf9, 0xd0, 0x73, 0xbb, 0xaa, 0x33, 0x34, 0x64, 0x37, 0x45, 0xe5, 0x00, 0x42, 0x41, 0xaa, 0x09, 0xea, 0x54, 0x67, 0x16, - 0xa7, 0x36, 0x5d, 0x9d, 0x70, 0x7e, 0x2f, 0x06, 0x27, 0x8a, 0x03, 0xe3, 0x2c, 0x18, 0x69, 0x7b, 0xcd, 0x08, 0x72, 0xdf, 0xbb, 0x66, 0x4f, 0x65, 0xaf, 0x19, 0x5e, 0xef, 0xe0, 0x3c, 0x6f, 0x2a, - 0xcd, 0xa3, 0xd8, 0xd3, 0xae, 0xd8, 0x1e, 0x86, 0x49, 0x59, 0x27, 0x79, 0xd2, 0x26, 0x7f, 0x88, 0xc8, 0x7a, 0x65, 0x34, 0x7e, 0xa1, 0x0d, 0x4e, 0xbe, 0xde, 0x79, 0x26, 0x75, 0xfa, 0xcc, 0xd4, - 0xd6, 0x35, 0x41, 0x54, 0xa9, 0x24, 0xd4, 0xa7, 0xb1, 0xa8, 0x9c, 0xc1, 0x52, 0x3b, 0x26, 0xa2, 0x59, 0xcf, 0x18, 0x28, 0x1b, 0x0a, 0x61, 0xbf, 0xe4, 0xe7, 0x65, 0x2b, 0x12, 0x15, 0x1e, 0xf4, - 0xbe, 0x4b, 0x36, 0x30, 0xa2, 0xd7, 0x2a, 0xd7, 0x2b, 0xdb, 0x78, 0x21, 0x1a, 0x6d, 0x2e, 0xee, 0x7d, 0x58, 0xe7, 0x6c, 0x0f, 0x56, 0x56, 0x34, 0xe9, 0xf1, 0x08, 0x0d, 0x9f, 0xf6, 0xa0, 0x53, - 0x8e, 0x4f, 0xf8, 0x0a, 0x6e, 0x94, 0xd1, 0xff, 0xde, 0x28, 0xa3, 0xb1, 0xf7, 0x51, 0x6d, 0xf4, 0xc3, 0x0a, 0x81, 0x6e, 0x5f, 0xb8, 0x2d, 0xc7, 0x71, 0xf5, 0x42, 0x1f, 0x27, 0xbb, 0x78, 0xb2, - 0x3d, 0x0c, 0x81, 0xff, 0x49, 0x0e, 0x3f, 0xfe, 0x54, 0xaf, 0xe0, 0x1a, 0x9f, 0xef, 0xfe, 0x2e, 0xf0, 0x4a, 0x0d, 0xa3, 0x5f, 0x54, 0x2f, 0xa2, 0x7a, 0x6f, 0x5f, 0x42, 0x26, 0x9e, 0xc0, 0x97, - 0xb1, 0x06, 0x55, 0x61, 0xeb, 0xa6, 0x61, 0x96, 0xe4, 0xda, 0xd0, 0x56, 0x95, 0x82, 0xcd, 0xf2, 0x26, 0xdd, 0xd4, 0xcd, 0x71, 0x4a, 0x93, 0x36, 0x8c, 0x88, 0x53, 0xba, 0x66, 0x92, 0xc4, 0x1b, - 0x8f, 0x28, 0x37, 0x8e, 0x02, 0xea, 0x66, 0x8b, 0x08, 0x1f, 0xc7, 0xa6, 0xeb, 0x0c, 0xc7, 0x77, 0x9b, 0xcd, 0x09, 0x5d, 0x4b, 0xbb, 0x75, 0x84, 0x84, 0x3e, 0x08, 0x9a, 0xa9, 0x3f, 0x65, 0xe7, - 0x1b, 0x38, 0x79, 0x26, 0x05, 0xba, 0xab, 0x93, 0xc9, 0xc3, 0x22, 0xc4, 0xd3, 0x97, 0x36, 0x91, 0x37, 0x92, 0x67, 0x2e, 0x5c, 0x1a, 0x93, 0xe9, 0x73, 0xfb, 0x07, 0x51, 0x4b, 0xe6, 0x38, 0xa2, - 0xa8, 0x0e, 0x8f, 0x3b, 0x8a, 0x2c, 0x75, 0x98, 0xa3, 0x73, 0xb9, 0xed, 0x6d, 0x18, 0xa2, 0x78, 0x62, 0xbd, 0x08, 0xad, 0xcc, 0x82, 0x1d, 0xff, 0x40, 0x5a, 0x19, 0x9c, 0x24, 0xb0, 0x11, 0xcc, - 0x93, 0x20, 0x88, 0xa1, 0xf9, 0x3c, 0xd4, 0x02, 0x19, 0x09, 0x97, 0xb6, 0x84, 0x9f, 0xa0, 0x86, 0x0c, 0x76, 0x52, 0x43, 0x85, 0x35, 0xdb, 0xc9, 0xe2, 0xb1, 0xf0, 0x99, 0x27, 0x0e, 0x1c, 0xae, - 0xd2, 0x63, 0x3e, 0x52, 0x97, 0xef, 0x8f, 0x9a, 0x36, 0x79, 0x74, 0x90, 0x0b, 0xfd, 0x03, 0xbf, 0xe2, 0x6c, 0x3f, 0x53, 0x3c, 0xb3, 0xa9, 0x4d, 0xb2, 0xc9, 0x1b, 0x89, 0xef, 0xb9, 0xb4, 0x1d, - 0x5c, 0xaa, 0x6a, 0x8d, 0x4c, 0x30, 0x2d, 0x43, 0x1d, 0x29, 0xdd, 0xa3, 0xec, 0x68, 0x0f, 0xc3, 0x7b, 0xa3, 0xc9, 0xca, 0xce, 0xed, 0xbd, 0x81, 0x8d, 0xa6, 0x8d, 0xb2, 0xe0, 0x52, 0x9c, 0x97, - 0xbb, 0x1d, 0xe7, 0x6d, 0x11, 0x71, 0x28, 0xe6, 0xfd, 0xa8, 0xac, 0xd9, 0x72, 0xbe, 0x6c, 0x25, 0x78, 0x99, 0x1e, 0xf4, 0xc4, 0xd2, 0x71, 0x2e, 0x31, 0x97, 0xae, 0xb3, 0x35, 0x6a, 0x15, 0x30, - 0x9e, 0x98, 0xcd, 0xd7, 0x46, 0xe0, 0xc5, 0xbb, 0xf3, 0xd9, 0x44, 0xfc, 0x5c, 0xd4, 0xf9, 0x23, 0xe9, 0xe4, 0xf3, 0x1b, 0x77, 0x0b, 0x40, 0xde, 0x41, 0xdf, 0xbc, 0x29, 0xac, 0x73, 0xc7, 0x03, - 0xff, 0x39, 0xf4, 0xeb, 0xc7, 0x7f, 0xb1, 0xaf, 0x86, 0xf2, 0xdb, 0xc2, 0x70, 0x8f, 0xce, 0xa3, 0x45, 0xa1, 0x4b, 0x1e, 0x39, 0xe3, 0xc9, 0x7f, 0xd0, 0x17, 0x8c, 0x90, 0x33, 0xc1, 0xb3, 0x74, - 0xbb, 0xc4, 0x9f, 0x5c, 0x28, 0x7c, 0x2f, 0x5c, 0x40, 0x71, 0x1a, 0x44, 0x0f, 0x96, 0xd6, 0x08, 0x08, 0x16, 0xaf, 0xce, 0x72, 0x6a, 0x28, 0x0a, 0x7c, 0xce, 0x72, 0x25, 0x94, 0x11, 0x3a, 0xc3, - 0x11, 0x79, 0x46, 0x9e, 0x64, 0x33, 0x17, 0x01, 0x0a, 0xd5, 0x31, 0x85, 0x87, 0x94, 0xc3, 0x6e, 0x56, 0x17, 0xfd, 0x7e, 0xbd, 0xb7, 0x37, 0xbc, 0x92, 0xd8, 0x28, 0x18, 0x96, 0x2c, 0xee, 0x85, - 0x06, 0xc9, 0xc5, 0x5b, 0x30, 0x3a, 0x11, 0x2b, 0x22, 0xb8, 0x51, 0xa1, 0x1e, 0xad, 0x99, 0x8f, 0xf6, 0xae, 0xbf, 0xef, 0xfa, 0xdd, 0x2f, 0x80, 0x93, 0xfb, 0xf7, 0x9f, 0x2d, 0x83, 0xb3, 0xed, - 0x5d, 0xff, 0x08, 0xd1, 0x92, 0x5c, 0x96, 0x19, 0xef, 0x20, 0x92, 0xbb, 0xb2, 0xf1, 0xf5, 0x71, 0xec, 0x14, 0xe2, 0x90, 0xa6, 0x35, 0x91, 0xf5, 0xfb, 0x08, 0xcf, 0x33, 0xa8, 0x3e, 0x2c, 0x46, - 0xca, 0x09, 0x3a, 0xa3, 0x26, 0x44, 0x03, 0x25, 0x90, 0x2a, 0x53, 0x2c, 0x98, 0x34, 0x75, 0xe7, 0x14, 0x39, 0x12, 0x75, 0x4a, 0x84, 0x5d, 0x50, 0x5b, 0x95, 0xab, 0xe6, 0xb3, 0x82, 0xda, 0x3c, - 0x53, 0xf9, 0xf7, 0xba, 0xe6, 0xf6, 0x9d, 0x2d, 0xea, 0x5e, 0xed, 0xe4, 0x1f, 0xb7, 0x45, 0xe3, 0xef, 0x14, 0x11, 0xbc, 0x3f, 0x4b, 0x7e, 0xc5, 0xb9, 0xff, 0xb8, 0x2d, 0x96, 0x74, 0x5d, 0xa8, - 0xeb, 0xc7, 0x9f, 0xca, 0xcc, 0xdd, 0x1b, 0xfd, 0xf7, 0xc5, 0x0b, 0xbf, 0x10, 0xf3, 0x70, 0x43, 0xfd, 0x97, 0x68, 0xbf, 0x16, 0xa9, 0x7a, 0x22, 0xd2, 0xe1, 0x98, 0x0e, 0x1e, 0x33, 0x2d, 0x42, - 0xae, 0xea, 0xa5, 0x05, 0xd4, 0x37, 0x44, 0xef, 0x96, 0xc3, 0x22, 0xf3, 0x03, 0xd8, 0xae, 0x65, 0x1b, 0xeb, 0x18, 0xc8, 0x4d, 0xcb, 0xb0, 0x89, 0xa3, 0xdc, 0x2b, 0xc5, 0x25, 0x47, 0xa4, 0xa2, - 0x15, 0xbb, 0x0b, 0x60, 0x5c, 0x1f, 0xc4, 0x75, 0xe5, 0xf1, 0xcc, 0xc8, 0x43, 0x81, 0xc2, 0xec, 0x9c, 0x61, 0x9b, 0xe6, 0xec, 0xe9, 0xb0, 0xd2, 0x08, 0x36, 0x9c, 0x3d, 0xb1, 0xa0, 0xfd, 0x5f, - 0x28, 0x52, 0xf5, 0xfd, 0xa2, 0xf8, 0x00, 0xb4, 0xfd, 0x17, 0x92, 0xd2, 0xbf, 0x38, 0xa7, 0x2f, 0x24, 0xcf, 0x92, 0xbe, 0x34, 0x9e, 0x99, 0xb5, 0xf0, 0xa4, 0x35, 0x74, 0x2a, 0x3d, 0x11, 0x4c, - 0x95, 0xda, 0x83, 0xb2, 0x77, 0xf8, 0x23, 0x0d, 0xe9, 0x4a, 0xb7, 0x94, 0xda, 0xf2, 0x09, 0xe0, 0x9e, 0x8f, 0x92, 0x2b, 0xf7, 0x35, 0x93, 0x57, 0xfa, 0x70, 0xa1, 0x08, 0x4e, 0xde, 0xfe, 0x5e, - 0x52, 0x0d, 0x9f, 0x58, 0x77, 0x64, 0xc9, 0x31, 0xe1, 0x84, 0xb6, 0x45, 0xdb, 0x8c, 0x68, 0xbb, 0xa0, 0xcc, 0x55, 0x9a, 0x74, 0xc0, 0xd2, 0x8a, 0x47, 0xd3, 0x9e, 0x37, 0xc7, 0xb0, 0x24, 0xf2, - 0x5d, 0xe7, 0xe4, 0x94, 0x6f, 0x98, 0x92, 0x04, 0x81, 0x6c, 0xda, 0xd6, 0x66, 0xcf, 0xd3, 0x03, 0x47, 0x22, 0x60, 0xce, 0x5a, 0xdb, 0x56, 0x6e, 0x84, 0x94, 0x5f, 0x78, 0x3e, 0xd4, 0x2f, 0x9a, - 0x83, 0x3f, 0x3d, 0xd5, 0x6b, 0x7a, 0x76, 0x13, 0x2e, 0xf6, 0xbb, 0x5e, 0xca, 0xa3, 0xee, 0xfe, 0xbd, 0x0d, 0xf6, 0x4e, 0x13, 0x9c, 0x7c, 0xb4, 0x2e, 0x5d, 0x7e, 0xc2, 0x0e, 0x43, 0x7b, 0x5f, - 0x48, 0x7c, 0x77, 0xac, 0x30, 0x8d, 0x81, 0xc8, 0xa9, 0x2d, 0xcf, 0x0c, 0x6c, 0x5d, 0xaa, 0xc6, 0x8a, 0x46, 0xfb, 0xd4, 0xa6, 0xb3, 0x85, 0xb5, 0x8c, 0xbb, 0x1c, 0xd9, 0xaf, 0x76, 0x47, 0x70, - 0x0a, 0x1b, 0x05, 0x12, 0xe4, 0x3a, 0xe4, 0x8f, 0x3b, 0xdd, 0x9a, 0x76, 0xae, 0x2d, 0x07, 0x69, 0x2f, 0x1d, 0x23, 0x7c, 0xd6, 0x1c, 0xb7, 0x7e, 0xb6, 0x91, 0x01, 0xde, 0x99, 0xed, 0x5a, 0xe2, - 0x77, 0xf8, 0xf6, 0xff, 0x9c, 0xff, 0xfd, 0xbf, 0xff, 0xf9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x58, 0xb5, 0x1c, 0xf7, 0x1a, 0x97, 0x00, 0x00, 0x99, 0x0c, 0x02, 0x00, - 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, - 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x6c, 0x92, 0x3f, 0x6f, 0xea, - 0x30, 0x10, 0xc0, 0xf7, 0x7c, 0x8a, 0x93, 0x07, 0xa6, 0x17, 0x27, 0x01, 0xf4, 0x06, 0xa4, 0x37, 0x3c, 0x51, 0xda, 0x0e, 0x88, 0x4e, 0xed, 0x08, 0x32, 0xf1, 0x01, 0x46, 0xc9, 0x39, 0xb2, 0x1d, - 0x54, 0x54, 0xf1, 0xdd, 0xab, 0x33, 0x84, 0x5a, 0xa8, 0x63, 0xee, 0xcf, 0xef, 0x77, 0xe7, 0xdc, 0x57, 0x06, 0x20, 0x48, 0xb5, 0x28, 0x66, 0x20, 0xf0, 0x84, 0x14, 0xf2, 0x83, 0x22, 0xdd, 0xa0, - 0x13, 0x7f, 0x38, 0x75, 0x42, 0xe7, 0x8d, 0x25, 0xce, 0x96, 0xb2, 0x92, 0xe5, 0x35, 0xaa, 0xd1, 0xd7, 0xce, 0x74, 0xe1, 0x96, 0x59, 0x59, 0x8d, 0xf2, 0xe8, 0x61, 0xde, 0xd8, 0x5e, 0x2f, 0x18, - 0x02, 0xaf, 0x29, 0xa4, 0x31, 0x35, 0x92, 0x8f, 0x8a, 0xff, 0x9d, 0xaa, 0x0f, 0x98, 0x8f, 0x07, 0x92, 0xc3, 0xce, 0x7a, 0x13, 0xac, 0x3b, 0x8b, 0x19, 0xf0, 0x30, 0x00, 0x22, 0x9c, 0xbb, 0x58, - 0xbb, 0x37, 0x21, 0x16, 0x01, 0x88, 0xde, 0x35, 0x1c, 0x11, 0x19, 0xc0, 0x25, 0xf6, 0x5d, 0xfd, 0x3e, 0x69, 0x42, 0x1f, 0xb8, 0x84, 0xac, 0x46, 0xe0, 0x8f, 0xa2, 0x27, 0x13, 0x78, 0xaa, 0xd1, - 0x08, 0x7e, 0x82, 0x86, 0x02, 0xee, 0x9d, 0xe2, 0xc9, 0xe5, 0xd1, 0x0f, 0x78, 0x1f, 0x94, 0x8b, 0xdd, 0xcf, 0xef, 0xab, 0xf9, 0x66, 0xf9, 0xf6, 0xb2, 0x59, 0x2e, 0x3e, 0x16, 0xcb, 0x7f, 0x86, - 0x76, 0x16, 0x76, 0x4a, 0xf9, 0xfc, 0xe8, 0x73, 0xd7, 0x53, 0x30, 0x2d, 0x82, 0x2c, 0x0c, 0x69, 0xfc, 0x4c, 0xda, 0x35, 0x6e, 0xfb, 0xfd, 0x20, 0x6f, 0x2d, 0x41, 0x9e, 0x1b, 0xf2, 0x1d, 0xd6, - 0x01, 0x64, 0xc1, 0xb1, 0x4d, 0x6b, 0x75, 0xdf, 0xa0, 0x2f, 0x1e, 0x58, 0xc5, 0xd6, 0x50, 0x51, 0x37, 0x86, 0xc7, 0x4c, 0xb0, 0xf7, 0x2d, 0x35, 0x9e, 0x9e, 0xb0, 0x43, 0xd2, 0x48, 0xb5, 0xc1, - 0x64, 0xdb, 0x9b, 0x88, 0x9d, 0xeb, 0xb1, 0x2c, 0xe5, 0xf4, 0xbe, 0x49, 0xdf, 0xa1, 0x1b, 0xde, 0x62, 0xfd, 0x57, 0x4e, 0x64, 0x35, 0xa4, 0x82, 0xba, 0x3e, 0xeb, 0x7a, 0x2a, 0xab, 0x89, 0x2c, - 0x53, 0xcb, 0x6f, 0x8a, 0x9a, 0x7f, 0x66, 0xbc, 0x08, 0x7f, 0x63, 0x25, 0x9a, 0x87, 0x3d, 0x62, 0x41, 0x15, 0xef, 0x83, 0xa9, 0xd9, 0x25, 0xfb, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, - 0x08, 0xc3, 0x71, 0x47, 0x37, 0x42, 0x01, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, - 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x6e, - 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x6a, 0x73, 0x8c, 0x52, 0xc1, 0x6e, 0xdb, 0x30, 0x0c, 0xbd, 0xfb, 0x2b, 0x78, 0x93, 0x0c, 0x38, 0x4a, 0xd6, 0x6d, 0x40, 0x91, 0x22, 0xbb, 0x14, 0x05, 0xda, 0xcb, 0xb0, 0x43, 0x6e, 0xc3, - 0x0e, 0xaa, 0xcc, 0xc6, 0xee, 0x6c, 0xc9, 0x15, 0xe9, 0xac, 0x41, 0xe1, 0x7f, 0x1f, 0x28, 0x3b, 0x8e, 0x97, 0xd3, 0x4e, 0x89, 0x1f, 0x1f, 0x49, 0xbd, 0xf7, 0xa8, 0x7a, 0x42, 0x20, 0x8e, 0xb5, - 0x63, 0x75, 0x97, 0xb9, 0xe0, 0x89, 0xe1, 0x03, 0x1e, 0xf7, 0xfb, 0x1f, 0x05, 0xdc, 0x37, 0xa1, 0x2f, 0x1f, 0x8e, 0xe8, 0x19, 0x06, 0xd8, 0x41, 0xc4, 0xb7, 0xbe, 0x8e, 0xa8, 0x95, 0x13, 0x1c, - 0x05, 0x27, 0x95, 0x5f, 0x9a, 0x88, 0x6d, 0xbc, 0x62, 0xbe, 0x58, 0x4b, 0xab, 0x57, 0x5a, 0xc5, 0xde, 0x73, 0xdd, 0xe2, 0x85, 0x2d, 0x0c, 0x24, 0x5e, 0x72, 0xa9, 0xef, 0x30, 0x32, 0x12, 0x0b, - 0x6b, 0xa2, 0xbd, 0xf4, 0xde, 0x2d, 0x39, 0xc6, 0xa8, 0xdc, 0x54, 0xd6, 0x97, 0x0d, 0x9e, 0x27, 0xf1, 0xd5, 0x18, 0xb6, 0x1d, 0x2e, 0x26, 0x94, 0x96, 0x2d, 0xec, 0xe0, 0x23, 0x03, 0xf0, 0xb6, - 0xc5, 0x2d, 0x28, 0xae, 0x0f, 0x18, 0x55, 0x91, 0x01, 0xb8, 0x9e, 0x38, 0xb4, 0x18, 0x9f, 0xca, 0x2d, 0xa8, 0xcd, 0xa7, 0x9b, 0xcf, 0x5f, 0x54, 0x36, 0x9c, 0x1b, 0x31, 0xc6, 0xc7, 0xb4, 0x28, - 0xc2, 0x0e, 0x18, 0x76, 0xdf, 0x04, 0x91, 0x1f, 0x19, 0xc5, 0x06, 0x63, 0x0c, 0x51, 0x63, 0x8c, 0xf9, 0xdd, 0xf8, 0xed, 0x4b, 0x9d, 0xdf, 0x65, 0xc3, 0xbc, 0xb8, 0x45, 0x22, 0x7b, 0x40, 0xd8, - 0x25, 0x33, 0xcd, 0x73, 0xed, 0x6d, 0x3c, 0x69, 0x8f, 0x7f, 0x16, 0xb6, 0xea, 0x34, 0xeb, 0xd4, 0xc9, 0xb3, 0x5c, 0x68, 0x0d, 0xbe, 0xdb, 0xb6, 0x6b, 0xd0, 0x24, 0x17, 0xe4, 0x85, 0x14, 0xfa, - 0xe8, 0xa4, 0x5a, 0x31, 0x77, 0xdb, 0xf5, 0xba, 0x09, 0xce, 0x36, 0x55, 0x20, 0xde, 0xde, 0x6e, 0x6e, 0x37, 0x89, 0x22, 0x02, 0xb3, 0x21, 0x17, 0xc5, 0xd2, 0xa6, 0xd5, 0x93, 0x67, 0x3c, 0x44, - 0xcb, 0x75, 0xf0, 0x5b, 0x18, 0xbd, 0x22, 0xb0, 0x70, 0xb4, 0x4d, 0x5d, 0x42, 0x4a, 0x4d, 0x15, 0xa3, 0x20, 0xd9, 0x9e, 0x42, 0xd3, 0xe2, 0x73, 0x6e, 0xb8, 0x42, 0xaf, 0x09, 0xe3, 0x11, 0x67, - 0xa1, 0x22, 0xad, 0x6b, 0xac, 0xd7, 0x5f, 0x93, 0x4e, 0x38, 0x07, 0x37, 0xd1, 0xf2, 0x84, 0x01, 0x98, 0x2e, 0xc8, 0xea, 0xb5, 0x9a, 0x01, 0x12, 0x43, 0x26, 0x0f, 0xcc, 0x73, 0x28, 0x4f, 0x8b, - 0x0a, 0xcf, 0x85, 0x0a, 0x6d, 0x89, 0x91, 0xe6, 0x1a, 0xbe, 0x77, 0xe8, 0x58, 0xdf, 0x6c, 0x36, 0xd7, 0x90, 0xba, 0x0f, 0x9e, 0xd1, 0xf3, 0x6a, 0x7f, 0xea, 0x50, 0x15, 0xb0, 0x7e, 0xa5, 0xe0, - 0xd7, 0x17, 0x96, 0x2f, 0xb5, 0xa4, 0x51, 0x40, 0x44, 0xea, 0x1b, 0xce, 0x2f, 0x02, 0x46, 0x11, 0x73, 0x5e, 0x05, 0xa8, 0xef, 0x01, 0xd2, 0xa7, 0x9a, 0x34, 0x8d, 0x8c, 0xf0, 0x5b, 0x4f, 0xbd, - 0x4b, 0xb4, 0x44, 0xec, 0x1e, 0xde, 0x7a, 0xdb, 0x4c, 0xc5, 0xa4, 0xa5, 0x48, 0xae, 0xff, 0xc3, 0xc3, 0x25, 0x67, 0x92, 0xf5, 0x53, 0x39, 0x5c, 0x49, 0xbc, 0xea, 0x57, 0x01, 0x0a, 0x5d, 0x15, - 0xd4, 0xff, 0xf5, 0x8c, 0xb1, 0x8f, 0x5d, 0x12, 0xd8, 0x74, 0xf2, 0x57, 0x0f, 0x9e, 0x4e, 0xee, 0x0c, 0x8c, 0x89, 0x18, 0xd7, 0x04, 0xc2, 0x0b, 0x3e, 0xa4, 0x7f, 0x43, 0xb1, 0xb8, 0x67, 0xcd, - 0x72, 0x2d, 0x52, 0xf8, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4c, 0x78, 0x33, 0xb8, 0xe6, 0x01, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x6c, 0x52, 0xcb, 0x6e, 0x23, 0x21, 0x10, 0xbc, 0xf3, 0x15, 0x75, 0x63, - 0x2c, 0x8d, 0xf0, 0x3e, 0x72, 0x1a, 0xcb, 0x2b, 0xad, 0x56, 0x39, 0xe4, 0x03, 0xf6, 0x1c, 0x21, 0xe8, 0x64, 0x50, 0x18, 0x70, 0xa0, 0xf1, 0xac, 0x65, 0xf9, 0xdf, 0x57, 0x30, 0x8e, 0x3d, 0x91, - 0x72, 0xa4, 0xba, 0x44, 0xd7, 0xa3, 0x65, 0xc9, 0x84, 0xcc, 0xc9, 0x19, 0x96, 0x3b, 0x21, 0x4c, 0x0c, 0x99, 0xf1, 0x52, 0x82, 0xc1, 0x1e, 0x89, 0xde, 0x8b, 0x4b, 0xd4, 0x49, 0xa5, 0xe4, 0x46, - 0x8d, 0x3a, 0x58, 0x4f, 0xbb, 0x2b, 0x85, 0x29, 0xf3, 0x9a, 0xc2, 0xfa, 0x40, 0x72, 0xf3, 0x31, 0x3d, 0xe3, 0x8f, 0x8f, 0xc5, 0x3e, 0x1e, 0x29, 0x30, 0x2e, 0x6b, 0x9e, 0xa9, 0x38, 0x55, 0x3c, - 0x57, 0xba, 0xd8, 0x6e, 0xf1, 0x18, 0x72, 0x49, 0x04, 0x1e, 0x35, 0x83, 0x47, 0x6a, 0xdb, 0xd9, 0xc5, 0x00, 0x13, 0xa7, 0x83, 0x27, 0xa6, 0x0c, 0xe3, 0x49, 0x07, 0x7f, 0xc2, 0x3c, 0x52, 0xc0, - 0x41, 0xe7, 0x4c, 0x16, 0x1a, 0x47, 0xed, 0x9d, 0x45, 0xfb, 0x4c, 0x89, 0x2a, 0xa8, 0x93, 0x7f, 0x83, 0xe3, 0x01, 0x8b, 0xd4, 0xfc, 0x99, 0x22, 0x7b, 0xe8, 0x7c, 0x0a, 0x06, 0x8c, 0xfd, 0x2f, - 0x9c, 0x05, 0xc0, 0xea, 0xe0, 0x75, 0xe8, 0x1e, 0x36, 0x3b, 0x01, 0x2c, 0xc2, 0xad, 0x66, 0x8d, 0x7d, 0x9b, 0x02, 0x41, 0x4f, 0x34, 0x40, 0xb2, 0x7b, 0xa5, 0x24, 0xfb, 0x06, 0x99, 0x92, 0x39, - 0x4e, 0x94, 0x9e, 0xec, 0x00, 0xf9, 0xed, 0xfb, 0x8f, 0x9f, 0x0f, 0x52, 0x00, 0x17, 0x21, 0x80, 0xed, 0x16, 0xbf, 0xd7, 0xfb, 0xe0, 0x82, 0xf1, 0xc5, 0x52, 0x86, 0xb3, 0x3d, 0xf8, 0x74, 0x20, - 0xe8, 0x60, 0x91, 0x63, 0x49, 0x86, 0xa0, 0x19, 0x1a, 0x93, 0x0b, 0x6e, 0x2a, 0x93, 0xba, 0xad, 0xbf, 0xa7, 0x83, 0x3d, 0x02, 0xcd, 0xab, 0x18, 0xbb, 0x45, 0x93, 0xbb, 0x2f, 0x5e, 0x14, 0xd5, - 0x8f, 0x07, 0x48, 0x13, 0x27, 0x45, 0xff, 0x74, 0x0d, 0x4c, 0xad, 0x32, 0x56, 0x35, 0x96, 0x2b, 0x73, 0xd9, 0x3c, 0x40, 0x6e, 0x57, 0x60, 0x35, 0x5c, 0x1d, 0xd4, 0x2e, 0x9a, 0x87, 0xa7, 0x70, - 0x8c, 0x6f, 0xf4, 0xb9, 0x88, 0xd9, 0xf1, 0xd8, 0x90, 0x95, 0xbd, 0x1e, 0xf3, 0xe8, 0xcc, 0x88, 0x3c, 0xc6, 0xe2, 0xed, 0xad, 0xab, 0xc6, 0x8d, 0x85, 0x41, 0x29, 0xc5, 0x74, 0x77, 0x96, 0x28, - 0x17, 0x5f, 0x5d, 0xe9, 0x59, 0xbb, 0xe5, 0xc2, 0xba, 0x33, 0x7c, 0x7c, 0x1d, 0x70, 0x86, 0x0b, 0x2f, 0x71, 0x40, 0xf7, 0xbc, 0xa9, 0xcd, 0x3c, 0xe3, 0x82, 0x4b, 0xbf, 0x8a, 0xa2, 0xd5, 0xc3, - 0x2a, 0xbe, 0x75, 0xcb, 0x27, 0xd7, 0x37, 0xbd, 0x17, 0xed, 0xaf, 0x90, 0xaa, 0x36, 0xfa, 0x66, 0xe6, 0xab, 0x69, 0xcd, 0xa8, 0x87, 0x24, 0x33, 0x46, 0xf9, 0xd5, 0x7c, 0x49, 0xa6, 0x32, 0xda, - 0x2d, 0x2d, 0xe7, 0x93, 0x6e, 0xd4, 0x60, 0xbb, 0xcd, 0x4e, 0xd4, 0x88, 0xfe, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa3, 0xd1, 0x71, 0xb2, 0x9e, 0x01, 0x00, 0x00, 0x2e, 0x03, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xac, 0x58, 0x6d, 0x6f, 0x1c, - 0xb7, 0x11, 0xfe, 0xbe, 0xbf, 0x62, 0x6a, 0x7d, 0x88, 0x64, 0x9c, 0xf6, 0x04, 0x17, 0x05, 0x82, 0x53, 0x6c, 0xc1, 0x76, 0xd5, 0x4a, 0xa9, 0x60, 0x1b, 0x92, 0x92, 0xb4, 0x50, 0x85, 0x92, 0xb7, - 0x9c, 0xbb, 0xa5, 0xcc, 0x25, 0x37, 0x24, 0xf7, 0x4e, 0xdb, 0x38, 0xff, 0xbd, 0x18, 0x92, 0xfb, 0xa6, 0x3b, 0xb9, 0x09, 0xda, 0x4f, 0xd2, 0x91, 0xc3, 0xe1, 0x33, 0x33, 0xcf, 0xbc, 0x70, 0x0f, - 0xe0, 0x83, 0x11, 0x98, 0x3f, 0x38, 0xb8, 0xb8, 0xbd, 0xfd, 0x04, 0x7f, 0x69, 0x74, 0xe1, 0xa5, 0xd1, 0x59, 0xf6, 0x13, 0xaa, 0xc2, 0x54, 0x08, 0xde, 0x40, 0x6b, 0x1a, 0x0b, 0x1a, 0xb7, 0xbd, - 0xe8, 0x2a, 0x49, 0x41, 0x6d, 0xcd, 0x03, 0x16, 0xfe, 0x0f, 0x70, 0x5b, 0x22, 0x2c, 0x8d, 0x54, 0x68, 0x6b, 0xc5, 0x3d, 0x0e, 0x12, 0x85, 0x11, 0x08, 0x05, 0xd7, 0xb0, 0x44, 0x58, 0x99, 0x46, - 0x0b, 0x90, 0x1a, 0xee, 0x98, 0xd4, 0x02, 0x1f, 0xf3, 0x07, 0xc7, 0xee, 0x0f, 0xf3, 0x79, 0xf7, 0xe3, 0x28, 0x87, 0xdb, 0x52, 0x8e, 0xd4, 0x6f, 0xa5, 0x52, 0x60, 0xd1, 0xd5, 0x46, 0x0b, 0x02, - 0x22, 0x75, 0x61, 0x2a, 0xa9, 0xd7, 0x11, 0xeb, 0x5f, 0xcf, 0x6f, 0x81, 0x6b, 0x01, 0x9f, 0x3e, 0xde, 0xdc, 0x82, 0xc5, 0x9f, 0x1b, 0x74, 0xde, 0x25, 0x15, 0xf8, 0xc8, 0xab, 0x5a, 0x8d, 0x70, - 0x48, 0x07, 0x5b, 0x2b, 0xbd, 0x47, 0x0d, 0xae, 0xd5, 0x45, 0x69, 0x8d, 0x36, 0x8d, 0x53, 0xed, 0x0c, 0x2c, 0xfa, 0xc6, 0x6a, 0xd2, 0xca, 0xc1, 0xf2, 0x2d, 0x6c, 0xb8, 0x6a, 0x30, 0x87, 0xcb, - 0x55, 0xb4, 0x7b, 0xb0, 0x15, 0xed, 0xca, 0xd8, 0xca, 0x01, 0xd7, 0x2d, 0xf0, 0x91, 0x12, 0xc0, 0x47, 0x2c, 0x1a, 0x92, 0x99, 0xd1, 0x91, 0x60, 0xad, 0xe3, 0x2b, 0x54, 0x2d, 0x70, 0x21, 0xc0, - 0x97, 0x08, 0x2c, 0xc8, 0x33, 0xf8, 0x8c, 0xed, 0xd6, 0xd8, 0x60, 0x0b, 0x2d, 0x77, 0xba, 0x67, 0xc1, 0x8e, 0x08, 0x04, 0x38, 0xb0, 0x4f, 0xd6, 0x54, 0xd2, 0x21, 0xcb, 0xb3, 0xec, 0xe0, 0x00, - 0xae, 0x4c, 0xc1, 0xd5, 0x70, 0x49, 0x96, 0xbd, 0x5d, 0x79, 0xb4, 0xdd, 0x82, 0x5e, 0x03, 0xd3, 0x75, 0x05, 0x52, 0x3b, 0xcf, 0x95, 0x62, 0x03, 0x06, 0xdb, 0x68, 0xf0, 0x13, 0x7f, 0x2a, 0xd2, - 0xa4, 0x5a, 0x58, 0xb6, 0x4f, 0x4f, 0x93, 0x6c, 0xd8, 0xa5, 0x3b, 0x29, 0x98, 0xb6, 0xd1, 0x5e, 0x56, 0x18, 0x43, 0x80, 0x8f, 0xb5, 0x71, 0x08, 0xbe, 0xb4, 0x88, 0x80, 0x5a, 0xd4, 0x46, 0x6a, - 0xef, 0xf2, 0x2c, 0x03, 0x78, 0x09, 0x6c, 0xce, 0x42, 0xf8, 0xbb, 0x75, 0x58, 0x19, 0x3b, 0x75, 0x5d, 0x9e, 0xe4, 0x4a, 0xe4, 0xca, 0x97, 0x73, 0x8b, 0x5c, 0x48, 0x8d, 0xce, 0xed, 0x39, 0xc7, - 0xa1, 0xdf, 0x85, 0x28, 0x0e, 0x45, 0x89, 0xc5, 0xe7, 0xa9, 0x06, 0x25, 0x37, 0xf8, 0xac, 0x82, 0x6e, 0x73, 0x7a, 0x3e, 0x18, 0x55, 0x73, 0xcb, 0x2b, 0x24, 0xe7, 0xd5, 0xd6, 0x6c, 0xa4, 0xc0, - 0x9d, 0x48, 0x0c, 0xca, 0xb8, 0x07, 0xa9, 0x37, 0xa6, 0xe0, 0x1d, 0x7d, 0x38, 0xb0, 0xf7, 0x46, 0x7b, 0x7c, 0xf4, 0x0c, 0xcc, 0x92, 0x68, 0x0f, 0x85, 0xd1, 0x9e, 0x4b, 0xdd, 0x33, 0x32, 0x91, - 0x10, 0xa4, 0x26, 0xa6, 0xf0, 0x68, 0x7b, 0xc6, 0x18, 0x7b, 0x70, 0x59, 0x7f, 0x43, 0xc9, 0xb5, 0x50, 0x78, 0x1d, 0x45, 0x0f, 0x8b, 0xa8, 0xf2, 0x08, 0x7e, 0xc9, 0x80, 0xf4, 0x39, 0x0f, 0xca, - 0xac, 0xe1, 0x35, 0xa4, 0x8d, 0x5c, 0x99, 0xf5, 0x69, 0x06, 0xb4, 0x98, 0x93, 0xda, 0xee, 0x40, 0x5e, 0x7a, 0x5f, 0xff, 0x88, 0xd6, 0x49, 0xa3, 0x8f, 0xf6, 0x0a, 0x54, 0xe8, 0x4b, 0x23, 0x8e, - 0x4e, 0x61, 0x3e, 0x0f, 0x26, 0x4e, 0x10, 0xc6, 0x4d, 0x38, 0x34, 0x5a, 0xb5, 0x21, 0x91, 0x8c, 0x8d, 0x79, 0xe4, 0x9a, 0xba, 0x36, 0xd6, 0xa3, 0x38, 0xda, 0xa7, 0xf3, 0xe7, 0x06, 0x6d, 0x1b, - 0x55, 0xca, 0x15, 0x84, 0x5f, 0x83, 0x53, 0x1d, 0x70, 0x8b, 0x83, 0x67, 0x25, 0x51, 0x99, 0x54, 0xa7, 0x3b, 0xf7, 0xe9, 0x5b, 0x1a, 0x91, 0xd4, 0x25, 0x57, 0xba, 0x00, 0xb5, 0x43, 0x49, 0xdb, - 0x29, 0xaa, 0xe3, 0x24, 0xdf, 0xeb, 0x0e, 0xe4, 0x02, 0xad, 0x8b, 0xca, 0xb8, 0x52, 0xd1, 0xdc, 0xb4, 0x0a, 0x0e, 0xb5, 0x87, 0xad, 0xf4, 0x65, 0x50, 0x8f, 0x1b, 0xd4, 0x3e, 0xfb, 0x95, 0x02, - 0x13, 0x79, 0x31, 0x66, 0x8a, 0xeb, 0xaa, 0x15, 0x2f, 0x0a, 0x74, 0x2e, 0x1a, 0x12, 0xe8, 0xbc, 0xb4, 0x66, 0xeb, 0xd0, 0x12, 0x33, 0xee, 0xc8, 0xfb, 0x8b, 0xf9, 0x3c, 0xa4, 0x4c, 0x69, 0x9c, - 0x5f, 0x7c, 0x7b, 0xf2, 0xed, 0xc9, 0x0e, 0xc1, 0xef, 0x0f, 0x8f, 0x42, 0x66, 0x7f, 0x5d, 0xbc, 0x23, 0xec, 0xfd, 0xe1, 0x51, 0x0e, 0xff, 0x48, 0xc9, 0xdb, 0x38, 0x04, 0x56, 0x34, 0x56, 0x31, - 0xa2, 0x28, 0x23, 0xf3, 0x19, 0x70, 0x1d, 0xb1, 0x3f, 0xcb, 0xda, 0x45, 0x60, 0x1b, 0xd1, 0xc8, 0x28, 0xcc, 0xe8, 0x38, 0x1c, 0xff, 0x3d, 0xfa, 0xee, 0x58, 0xc0, 0x37, 0xbf, 0xbc, 0x28, 0x51, - 0x29, 0xf3, 0x62, 0x01, 0x2f, 0xb6, 0xc6, 0x2a, 0xf1, 0xe2, 0xd7, 0x6f, 0xe0, 0x9f, 0x19, 0xc0, 0xf1, 0xc5, 0x37, 0x81, 0xda, 0xda, 0x1f, 0xfb, 0xb6, 0xc6, 0x05, 0xf0, 0xba, 0x56, 0x32, 0x52, - 0x7f, 0xfe, 0xe0, 0x8c, 0x8e, 0x62, 0x7b, 0xad, 0x18, 0xbc, 0x38, 0x64, 0x2e, 0xd9, 0xdc, 0xa7, 0x61, 0x5f, 0x2f, 0x82, 0x4d, 0x77, 0x66, 0x83, 0x56, 0x19, 0x2e, 0x8e, 0x6b, 0x6b, 0x3c, 0x06, - 0xf8, 0xf7, 0x87, 0xa4, 0xd9, 0x2d, 0xe6, 0xf3, 0xed, 0x76, 0x9b, 0xeb, 0xba, 0x7a, 0x70, 0x79, 0x61, 0xaa, 0x79, 0xcd, 0x8b, 0xcf, 0x7c, 0x8d, 0xf3, 0x3d, 0x47, 0xa2, 0x5f, 0x27, 0xfd, 0x21, - 0x84, 0x97, 0x85, 0xb0, 0xff, 0xe9, 0xe4, 0x8f, 0x70, 0x83, 0x76, 0x23, 0x0b, 0x84, 0x1f, 0x34, 0xdf, 0x70, 0xa9, 0xf8, 0x52, 0x21, 0x8b, 0x32, 0x94, 0xc8, 0x4a, 0x92, 0xb1, 0xd7, 0xe8, 0x6d, - 0xcb, 0x12, 0x4b, 0x88, 0xd1, 0xd3, 0x8a, 0x2f, 0x1d, 0x08, 0x22, 0x76, 0x25, 0x75, 0xac, 0x14, 0x4b, 0x84, 0x0e, 0x0b, 0x8a, 0x19, 0x2c, 0x39, 0xd1, 0xc3, 0xe8, 0x10, 0x8b, 0x0a, 0x2b, 0x63, - 0x5b, 0x68, 0x1c, 0x5f, 0x63, 0x00, 0x17, 0x23, 0xa5, 0x8c, 0xa9, 0x41, 0xa0, 0xe2, 0x6d, 0x2c, 0xe6, 0xe4, 0xa8, 0xae, 0xc9, 0xc2, 0xa5, 0xf6, 0x68, 0x57, 0xbc, 0xc0, 0xe8, 0xc0, 0xa1, 0x2b, - 0xc2, 0x4a, 0x2a, 0x84, 0x8a, 0xb7, 0xa1, 0xf4, 0x5a, 0x0f, 0x1c, 0x9c, 0xd4, 0xeb, 0x71, 0x43, 0x0b, 0x59, 0xc1, 0x3a, 0x55, 0x2c, 0x8b, 0x25, 0x29, 0x0f, 0x17, 0x0c, 0xcb, 0x5d, 0xa5, 0xe2, - 0x4a, 0x99, 0x2d, 0x99, 0xb3, 0x41, 0x65, 0x6a, 0x4a, 0x09, 0x6f, 0x42, 0x77, 0x52, 0x72, 0x85, 0x45, 0x5b, 0x28, 0x84, 0xd2, 0x98, 0xcf, 0x8e, 0xb2, 0x2d, 0x93, 0x5a, 0x7a, 0xc9, 0x95, 0xfc, - 0x77, 0xac, 0x7d, 0x64, 0x8c, 0x2b, 0x1b, 0x2f, 0xcc, 0x96, 0x3a, 0x95, 0x83, 0x2d, 0x2a, 0x45, 0x7f, 0x63, 0xaa, 0xc7, 0xce, 0xb9, 0xe5, 0x6d, 0xe8, 0xd0, 0xd4, 0x75, 0x2b, 0x32, 0xbc, 0x68, - 0x9c, 0x37, 0x55, 0x36, 0x49, 0xad, 0xd4, 0x5b, 0x46, 0xf0, 0x64, 0xe7, 0x81, 0xe8, 0xec, 0x55, 0xf0, 0x34, 0x77, 0x91, 0xc7, 0xc4, 0x45, 0x57, 0x58, 0x59, 0xfb, 0x2c, 0xb9, 0x61, 0x10, 0xef, - 0x7d, 0x48, 0x75, 0x73, 0x3e, 0x0f, 0x66, 0x3f, 0xc1, 0x3d, 0x74, 0x57, 0xea, 0x7a, 0x28, 0x60, 0x89, 0x2b, 0x63, 0x31, 0x44, 0xcb, 0xa1, 0xdd, 0x50, 0xc8, 0x1d, 0x38, 0xcf, 0xa9, 0xdc, 0x75, - 0x5a, 0xc6, 0xed, 0x52, 0x3a, 0x30, 0x35, 0xfd, 0xc7, 0x55, 0x72, 0x82, 0x69, 0x14, 0xa9, 0x19, 0x8f, 0x10, 0xd4, 0xdc, 0xe8, 0xe2, 0xb3, 0x05, 0x1c, 0x1e, 0xc1, 0xeb, 0x37, 0x34, 0x1e, 0x9c, - 0x66, 0x03, 0xa8, 0xce, 0x73, 0xbb, 0x70, 0x78, 0x68, 0xe3, 0x4f, 0xd1, 0x98, 0xba, 0xfe, 0x1f, 0xd1, 0x74, 0x37, 0x3e, 0x87, 0xa8, 0xcf, 0xcc, 0x1d, 0x44, 0xde, 0xc4, 0x40, 0x51, 0x2a, 0x4c, - 0x71, 0x71, 0x3a, 0xf4, 0x3b, 0x50, 0xa5, 0x59, 0xe6, 0xd5, 0xc9, 0xc9, 0xfc, 0xe3, 0xdf, 0x9e, 0x51, 0x47, 0x58, 0x3b, 0x2c, 0x67, 0x0b, 0xb8, 0x08, 0x4c, 0x79, 0x4f, 0xf7, 0x8f, 0xd1, 0x0e, - 0x55, 0xe5, 0x77, 0xc0, 0xa5, 0x43, 0x81, 0x8f, 0x54, 0xc4, 0x6b, 0xdf, 0x4f, 0x87, 0xff, 0x3f, 0x0b, 0xc2, 0x0d, 0x64, 0x41, 0x8f, 0x6f, 0x8f, 0x09, 0xca, 0xac, 0xaf, 0x28, 0xe3, 0xce, 0x16, - 0x70, 0x95, 0xfe, 0x1d, 0x9b, 0xd6, 0x43, 0xf0, 0x26, 0x4d, 0x05, 0x93, 0x26, 0x4d, 0x68, 0xe3, 0xf2, 0x02, 0xde, 0x2b, 0xd3, 0x88, 0x73, 0xaa, 0x28, 0x3d, 0xf1, 0xbf, 0x04, 0xe1, 0xee, 0xe7, - 0x69, 0xd7, 0xcf, 0x0e, 0x0e, 0xe0, 0x22, 0xea, 0xba, 0x91, 0x6b, 0xcd, 0x7d, 0x63, 0x53, 0x75, 0x09, 0xaa, 0x07, 0xab, 0x7f, 0x63, 0xe2, 0x0d, 0x72, 0xe3, 0xdb, 0x42, 0xd6, 0x75, 0xbd, 0x77, - 0x01, 0x69, 0x2e, 0x9a, 0x85, 0x86, 0x7d, 0xb6, 0x80, 0xcb, 0x34, 0xa7, 0xbf, 0xa3, 0xf6, 0xbe, 0x98, 0x9c, 0xbc, 0x0e, 0x6e, 0xed, 0xd1, 0xfe, 0x54, 0x62, 0xca, 0x48, 0x36, 0x3e, 0xc4, 0x08, - 0x15, 0x4a, 0x5f, 0x52, 0xbb, 0x05, 0xe7, 0xad, 0xd4, 0xeb, 0x19, 0x70, 0x78, 0xd7, 0xac, 0x56, 0x68, 0xe9, 0xbf, 0xef, 0xf9, 0x86, 0xdf, 0x04, 0x88, 0xa9, 0xc4, 0xcd, 0xa8, 0x22, 0x36, 0x3a, - 0x99, 0x32, 0x03, 0x81, 0x35, 0xea, 0x50, 0x9c, 0xe8, 0x21, 0x51, 0x72, 0x0f, 0x5b, 0xee, 0xc2, 0x78, 0xa3, 0x64, 0x6c, 0xea, 0xfd, 0x50, 0x14, 0xfa, 0x63, 0x85, 0x2e, 0x94, 0x6e, 0x32, 0x21, - 0x55, 0xd1, 0x8b, 0xdb, 0x1d, 0xe0, 0x0c, 0xc8, 0x37, 0xff, 0xc5, 0x67, 0x41, 0x64, 0xd7, 0x68, 0x78, 0x0d, 0x69, 0xb0, 0xff, 0xee, 0xc6, 0xdb, 0xa6, 0xa0, 0xd0, 0x88, 0xb8, 0xf5, 0x06, 0xbe, - 0xc0, 0xd3, 0x35, 0xf8, 0x02, 0xd7, 0xa1, 0xb5, 0x39, 0x24, 0x97, 0xc0, 0x17, 0xd8, 0x18, 0x29, 0x4e, 0x77, 0xfc, 0xf6, 0xf4, 0x1c, 0x8b, 0xc3, 0xea, 0x8e, 0x83, 0x86, 0xf9, 0x67, 0x65, 0xa8, - 0x1b, 0x90, 0x6b, 0x6a, 0x4b, 0xcd, 0xc0, 0x4b, 0xfc, 0x5a, 0xe0, 0x77, 0x80, 0x51, 0xf0, 0x9d, 0xe7, 0xbe, 0x71, 0xef, 0x8d, 0xc0, 0xb3, 0x05, 0xe8, 0xa6, 0x5a, 0xa2, 0xa5, 0x29, 0x34, 0x0d, - 0x5c, 0x67, 0x0b, 0xb8, 0xc6, 0xc2, 0x58, 0xf1, 0x5d, 0x17, 0xbb, 0xf8, 0xf7, 0x0d, 0xc9, 0x24, 0x92, 0x8c, 0x8d, 0xeb, 0xf9, 0x70, 0xb9, 0x9a, 0x0e, 0x36, 0x31, 0x0b, 0xc3, 0xf0, 0xbd, 0x6b, - 0x67, 0x17, 0x78, 0x5f, 0x62, 0x8c, 0x26, 0x1b, 0x50, 0xb1, 0x90, 0xcb, 0x2c, 0xe1, 0x61, 0x23, 0x4b, 0xc3, 0x94, 0xda, 0xb8, 0x54, 0x3f, 0x68, 0xe2, 0x26, 0xbd, 0xe3, 0x11, 0x39, 0xe2, 0x0a, - 0x4f, 0xc0, 0xa0, 0x75, 0x19, 0x18, 0x99, 0x34, 0xb4, 0xe4, 0xde, 0xda, 0x22, 0x8d, 0x94, 0x33, 0x90, 0x9e, 0x7e, 0x06, 0x6d, 0xbc, 0x9b, 0x5d, 0xe3, 0xf1, 0x44, 0xa4, 0xe7, 0x0c, 0x62, 0x14, - 0x4c, 0x46, 0x9c, 0x65, 0x3d, 0x69, 0xd9, 0xc8, 0x94, 0x89, 0x9a, 0x90, 0x0d, 0x55, 0xed, 0xdb, 0xae, 0x81, 0x8e, 0x7d, 0xf7, 0x5c, 0xae, 0xec, 0xcf, 0x90, 0x2e, 0x87, 0xf2, 0xdd, 0x7d, 0x17, - 0xe7, 0xa9, 0x65, 0x28, 0x73, 0xa1, 0x8f, 0x46, 0xab, 0xbe, 0xbf, 0xf9, 0xf8, 0x21, 0x4f, 0xc7, 0xc6, 0x32, 0xf4, 0x48, 0x72, 0xb0, 0x94, 0x9a, 0xdb, 0x16, 0x04, 0xf7, 0x3c, 0x4c, 0x38, 0x07, - 0xa9, 0x0a, 0x42, 0x28, 0x83, 0xee, 0x2b, 0x1d, 0x9f, 0x2b, 0x67, 0xba, 0xc1, 0x84, 0x86, 0x7c, 0x32, 0x9b, 0x0b, 0x21, 0xe3, 0x78, 0xb3, 0xa2, 0x98, 0x0f, 0x0f, 0xbd, 0x10, 0xcd, 0xd1, 0xcb, - 0xb1, 0x7f, 0x5b, 0x52, 0xaa, 0xba, 0xc1, 0xc1, 0xd3, 0xf0, 0x0e, 0xe3, 0xc8, 0x74, 0xc4, 0xef, 0xae, 0x9b, 0x68, 0x19, 0x5f, 0x37, 0xee, 0x0e, 0xcf, 0x74, 0x9b, 0xb1, 0x48, 0xec, 0x67, 0x51, - 0xc9, 0x1e, 0x90, 0xbf, 0x51, 0xcb, 0x73, 0x5d, 0x2b, 0xb0, 0x28, 0x45, 0xd8, 0x84, 0x63, 0x13, 0x83, 0x87, 0x1c, 0xd1, 0x46, 0x1f, 0xbf, 0x3a, 0x39, 0x49, 0xc9, 0x19, 0xbe, 0xbd, 0x8c, 0x28, - 0x35, 0x41, 0x63, 0xb4, 0x93, 0x02, 0x2d, 0x0a, 0x68, 0x74, 0xf4, 0x0d, 0x91, 0xeb, 0xed, 0xc4, 0x4f, 0x4f, 0x26, 0xe1, 0x67, 0xeb, 0xdd, 0xfc, 0xe5, 0xcb, 0x0c, 0x5e, 0x06, 0xeb, 0x47, 0x1d, - 0x70, 0x14, 0x69, 0x11, 0x24, 0x97, 0x94, 0x7b, 0xfb, 0x2f, 0x98, 0xd1, 0x79, 0xa9, 0x0b, 0xd5, 0x84, 0x8a, 0x4d, 0x68, 0xfb, 0x9e, 0x5c, 0x73, 0x2a, 0x5b, 0x06, 0xb6, 0xa5, 0x2c, 0x4a, 0x4a, - 0xb8, 0x61, 0xf0, 0x59, 0x9a, 0x46, 0x8b, 0x3c, 0x83, 0x97, 0xf3, 0xdd, 0x01, 0x71, 0x8c, 0x24, 0x74, 0xab, 0xe4, 0xcd, 0x05, 0x5c, 0x78, 0x5f, 0xbf, 0xba, 0x09, 0x9d, 0x3c, 0xbd, 0xc2, 0x67, - 0x60, 0xb1, 0x56, 0xed, 0x93, 0xad, 0x98, 0x62, 0x47, 0x8b, 0x38, 0x3f, 0x41, 0x00, 0x72, 0xb6, 0x48, 0x19, 0xd6, 0x57, 0xac, 0x77, 0x2d, 0xb9, 0x86, 0x37, 0x2a, 0x16, 0xa2, 0x27, 0x44, 0x23, - 0x32, 0x06, 0x94, 0xdd, 0x93, 0x6d, 0xcf, 0x37, 0x8c, 0x40, 0xed, 0x3d, 0x1f, 0x47, 0xe8, 0x3e, 0x37, 0xbc, 0x08, 0xe9, 0xe5, 0x61, 0xa5, 0xc0, 0xf8, 0x4d, 0x67, 0xd9, 0x82, 0x43, 0xef, 0x3b, - 0x6f, 0x31, 0x12, 0x1e, 0xd5, 0xa8, 0xf4, 0x28, 0x61, 0x23, 0x2f, 0xb0, 0x71, 0x19, 0x78, 0x7a, 0xfc, 0xea, 0xf2, 0xc7, 0xf3, 0x0f, 0xe7, 0x37, 0x37, 0xff, 0xfa, 0xe1, 0xfa, 0x2a, 0x21, 0xba, - 0x3e, 0x7f, 0xfb, 0xe7, 0xcb, 0x61, 0x0d, 0xf5, 0x46, 0x5a, 0xa3, 0x43, 0x32, 0x6d, 0xb8, 0x95, 0xf4, 0xa0, 0x72, 0x79, 0x78, 0xd2, 0xa0, 0x23, 0x45, 0x94, 0xe9, 0x72, 0xf7, 0xdb, 0x60, 0x0a, - 0x6b, 0x88, 0xfd, 0x5d, 0xa3, 0xa5, 0x07, 0x8f, 0xce, 0xdf, 0x1f, 0xe6, 0x73, 0xfa, 0x3b, 0xa7, 0x95, 0xfc, 0xc1, 0xc5, 0xf7, 0x1c, 0xd7, 0x70, 0x47, 0x11, 0x5c, 0xdb, 0x38, 0xc1, 0x4f, 0x24, - 0x47, 0x1b, 0xf1, 0x5b, 0xe1, 0x5b, 0xa5, 0x80, 0xf5, 0xaf, 0x25, 0xd7, 0xb5, 0x74, 0x12, 0x06, 0x21, 0x2d, 0x16, 0x9e, 0x1e, 0x64, 0x14, 0x01, 0xdb, 0xa4, 0xef, 0x30, 0xdd, 0xcb, 0x58, 0xd7, - 0x55, 0x90, 0x0b, 0x21, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdf, 0x4e, 0x60, 0x45, 0xd0, 0x07, 0x00, 0x00, 0x03, 0x15, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x8c, 0x53, 0xc1, 0x6e, 0xdb, 0x38, 0x10, 0xbd, 0xeb, 0x2b, 0x1e, 0xb2, 0x07, 0x25, 0x81, 0x22, 0xed, 0x61, 0xf7, 0xe2, 0xc0, - 0x8b, 0x05, 0xb2, 0x46, 0xda, 0x43, 0x91, 0xa2, 0xf5, 0x2e, 0xd0, 0x23, 0x2d, 0x8e, 0x2d, 0xb6, 0x14, 0x47, 0x25, 0x47, 0x89, 0xb3, 0x86, 0xff, 0x7d, 0x41, 0x52, 0x76, 0xe2, 0xb6, 0x6b, 0xf4, - 0x24, 0x6a, 0x38, 0x6f, 0xf8, 0xde, 0xcc, 0x9b, 0xe6, 0xfa, 0xba, 0xc0, 0x35, 0x3e, 0xf1, 0xe8, 0xf1, 0x66, 0xb9, 0x7c, 0x8f, 0x4e, 0x39, 0x6d, 0x8d, 0xdb, 0x60, 0x3d, 0xba, 0x56, 0x0c, 0xbb, - 0x0a, 0xc6, 0x3d, 0xf2, 0x17, 0xd2, 0x78, 0x32, 0xd2, 0x81, 0x54, 0xdb, 0xc1, 0xd3, 0xd7, 0x91, 0x82, 0xd4, 0x58, 0x76, 0x26, 0xc0, 0x04, 0x28, 0x07, 0xda, 0xaa, 0x7e, 0xb0, 0x14, 0xab, 0x1d, - 0xa0, 0x90, 0x4e, 0x09, 0xa8, 0xed, 0x98, 0x02, 0x8c, 0x04, 0x18, 0x37, 0x8c, 0x02, 0x61, 0x48, 0x47, 0x68, 0x95, 0xb5, 0xe4, 0x2b, 0x28, 0xa7, 0xe1, 0x49, 0x46, 0xef, 0x72, 0x1d, 0xef, 0xd9, - 0xc3, 0xac, 0x63, 0xa1, 0x98, 0x66, 0x5c, 0xcb, 0x7d, 0x24, 0x34, 0x3d, 0x1a, 0x9f, 0x0b, 0xdc, 0x93, 0x74, 0x31, 0xc8, 0xd2, 0x91, 0x8f, 0xef, 0xb8, 0x88, 0x4d, 0x0a, 0xde, 0x3f, 0x7c, 0x5c, - 0x82, 0x3d, 0xee, 0x17, 0xcb, 0xba, 0x40, 0x92, 0xf7, 0xd6, 0xa1, 0x55, 0x0e, 0x2b, 0x3a, 0xd5, 0x52, 0x46, 0xa2, 0x53, 0xa8, 0x4c, 0x79, 0x72, 0xc8, 0x13, 0x0a, 0x72, 0x4c, 0x73, 0x43, 0x9f, - 0x02, 0xe5, 0x54, 0xee, 0xcf, 0x41, 0x79, 0xd5, 0x63, 0x77, 0xc7, 0x4e, 0x68, 0x2b, 0x7b, 0xb4, 0xf9, 0x00, 0x75, 0x3c, 0xf1, 0xea, 0x33, 0xb5, 0x52, 0xbf, 0xce, 0xce, 0xa1, 0x63, 0x72, 0xbd, - 0x62, 0xfd, 0x9c, 0x14, 0x1e, 0x84, 0xa5, 0x80, 0x59, 0x43, 0xb9, 0xe7, 0x73, 0xb8, 0xaf, 0x23, 0xf9, 0x0c, 0xcc, 0xa7, 0x20, 0x3e, 0x76, 0x42, 0x53, 0x20, 0x6f, 0x94, 0x35, 0xff, 0x92, 0x86, - 0x4a, 0xad, 0xcc, 0xc8, 0xea, 0x27, 0x6a, 0x5a, 0xde, 0xc0, 0xf2, 0x66, 0x93, 0x5a, 0x9a, 0xee, 0xb2, 0xf4, 0xd8, 0x66, 0xd6, 0x01, 0x6b, 0xf6, 0x28, 0x8d, 0x5b, 0x73, 0x59, 0xa1, 0x7c, 0x52, - 0xde, 0xc5, 0x6f, 0x9a, 0x54, 0x59, 0x81, 0xa4, 0x3d, 0x2b, 0xb4, 0x23, 0xa5, 0xc9, 0x87, 0x44, 0x39, 0x4d, 0xe8, 0x20, 0x78, 0xba, 0x78, 0x8d, 0xcd, 0x62, 0x5e, 0xb0, 0x99, 0xc0, 0xf7, 0xd0, - 0x1c, 0x3f, 0x87, 0xec, 0x44, 0x86, 0x7f, 0xc8, 0x87, 0xec, 0xc3, 0x09, 0x3e, 0x78, 0x16, 0x6e, 0xd9, 0xe2, 0x31, 0xdf, 0xc4, 0x02, 0x1f, 0x89, 0x66, 0x88, 0xd9, 0x61, 0xd6, 0x34, 0x1b, 0x23, - 0xdd, 0xb8, 0xaa, 0x5b, 0xee, 0x9b, 0x2f, 0x4e, 0x89, 0x79, 0xa4, 0x26, 0x9a, 0xa4, 0x59, 0x59, 0x5e, 0x35, 0xbd, 0x32, 0xae, 0xd1, 0xdc, 0x86, 0xe6, 0xe0, 0xf0, 0x1b, 0x4d, 0x8f, 0x64, 0x79, - 0x20, 0x1f, 0x1a, 0xc7, 0x9a, 0x3e, 0x87, 0xba, 0xd7, 0xbf, 0x48, 0x47, 0x37, 0x13, 0x8d, 0x9b, 0xdc, 0x8c, 0x02, 0xd7, 0x4d, 0xd1, 0xb2, 0x8b, 0xa2, 0xe3, 0x82, 0x11, 0xe6, 0x50, 0xe1, 0xd9, - 0xb5, 0xb8, 0x9c, 0x12, 0xab, 0x34, 0xfe, 0x2b, 0xcc, 0xff, 0xc0, 0xae, 0x00, 0x9a, 0x06, 0x9f, 0x1e, 0xfe, 0xfe, 0x80, 0xbb, 0x87, 0xbf, 0x16, 0x78, 0xb3, 0xf8, 0xb0, 0x28, 0xf0, 0x7a, 0x58, - 0x75, 0x9c, 0xc5, 0xe5, 0x45, 0x32, 0xc0, 0x45, 0x75, 0x6a, 0x8d, 0xab, 0xdb, 0x1f, 0xe6, 0xc6, 0xf2, 0x17, 0xd3, 0x2b, 0xb7, 0x45, 0x7e, 0xe2, 0xed, 0xfa, 0xc4, 0x80, 0x79, 0x91, 0x8f, 0x4b, - 0x54, 0xe5, 0x35, 0x9d, 0x1c, 0xfd, 0x64, 0xac, 0x4d, 0x3f, 0xca, 0xb8, 0xef, 0x6c, 0x5b, 0x20, 0x9a, 0xec, 0xf2, 0x9b, 0xa9, 0xcd, 0xe7, 0x73, 0x94, 0xb1, 0x52, 0x79, 0x95, 0x44, 0x61, 0xda, - 0x73, 0xec, 0xb2, 0xd7, 0xf7, 0x91, 0xe9, 0x1e, 0x64, 0x03, 0xfd, 0x2f, 0xfc, 0x7e, 0xf1, 0x82, 0x3e, 0xcb, 0xf8, 0x7e, 0xf1, 0x23, 0xc2, 0xc6, 0xb5, 0x76, 0xd4, 0x04, 0x75, 0xb2, 0x2c, 0x69, - 0x25, 0x8c, 0x80, 0xb6, 0x26, 0x48, 0x38, 0x61, 0x96, 0x7e, 0x90, 0xb3, 0x67, 0xa7, 0x8d, 0xad, 0xd2, 0xdd, 0xfe, 0x85, 0xf3, 0x37, 0x9a, 0x82, 0x28, 0x19, 0xc3, 0x1d, 0x6b, 0x9a, 0xe1, 0xb7, - 0x5f, 0x7f, 0xaf, 0xa6, 0xc0, 0x3b, 0x0a, 0x41, 0x6d, 0x68, 0x86, 0xf2, 0x5d, 0xd6, 0xe5, 0x58, 0xa0, 0xac, 0xe5, 0x27, 0xd2, 0xe5, 0xd4, 0x83, 0x62, 0x5f, 0x14, 0x4d, 0x83, 0xc5, 0x76, 0x60, - 0x2f, 0x49, 0xc5, 0xc1, 0x61, 0x45, 0xcf, 0x7a, 0xb4, 0x54, 0x53, 0xba, 0x0a, 0x98, 0x63, 0x77, 0xb0, 0xd0, 0xfe, 0xb6, 0xf8, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x1b, 0x16, - 0x16, 0xd4, 0x8f, 0x02, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, - 0x73, 0x6f, 0x6e, 0xec, 0xfd, 0x57, 0x73, 0xf3, 0xca, 0xb2, 0x26, 0x08, 0xdf, 0xf7, 0xaf, 0x58, 0xf1, 0x5e, 0x36, 0x9a, 0x82, 0x37, 0x3c, 0xf1, 0x9d, 0x13, 0x1f, 0x48, 0x90, 0x00, 0x2d, 0x3c, - 0x61, 0x26, 0x7a, 0x4d, 0xc0, 0x1b, 0xc2, 0x11, 0x8e, 0x24, 0xa6, 0x7b, 0xff, 0xf6, 0x09, 0x1a, 0xe9, 0x25, 0x25, 0x4a, 0x82, 0xb8, 0x57, 0x9f, 0xd5, 0x7b, 0xa2, 0xaf, 0x54, 0x28, 0x40, 0x09, - 0xe2, 0xc9, 0xaa, 0xac, 0x74, 0x95, 0xf5, 0xff, 0xfc, 0x97, 0x3f, 0xfe, 0xf8, 0x95, 0x59, 0xa9, 0xf7, 0xeb, 0xdf, 0xfe, 0xf8, 0x15, 0xd6, 0x75, 0x31, 0x08, 0xad, 0xcc, 0x4d, 0xbc, 0xf2, 0xd7, - 0x7f, 0x3b, 0xdd, 0x69, 0xbd, 0xb2, 0x8a, 0xf2, 0xec, 0x74, 0x13, 0x7a, 0x81, 0x5f, 0xa0, 0x4b, 0x6f, 0x92, 0x3b, 0x5b, 0x3f, 0x4a, 0xbc, 0xcd, 0xdb, 0x5d, 0xe4, 0xdc, 0x5f, 0x7a, 0xbb, 0x26, - 0x2a, 0xbd, 0xea, 0xd7, 0xbf, 0xfd, 0x51, 0x97, 0x8d, 0x77, 0xee, 0x2b, 0x2c, 0x67, 0x6b, 0x05, 0xe7, 0xbe, 0xd3, 0xbb, 0xfe, 0xf8, 0xe3, 0xd7, 0x5b, 0xeb, 0xab, 0x37, 0x9f, 0xef, 0x3e, 0x7c, - 0xfb, 0xf9, 0x4e, 0x12, 0x39, 0x5e, 0x56, 0x9d, 0xff, 0x95, 0x2e, 0x2c, 0x27, 0xf4, 0x06, 0xc8, 0xed, 0x6d, 0xd7, 0x2b, 0xbc, 0xcc, 0xf5, 0x32, 0x27, 0xba, 0x79, 0xf1, 0xf9, 0x8e, 0x6f, 0x59, - 0xd5, 0x20, 0xae, 0x06, 0x65, 0x93, 0xd5, 0xd1, 0xe5, 0xdd, 0x7f, 0xc2, 0x67, 0xda, 0xd7, 0x67, 0xfe, 0xe7, 0x0d, 0x91, 0x96, 0xf9, 0x94, 0x4e, 0x96, 0xbb, 0x5e, 0x7a, 0xf9, 0x69, 0x7f, 0x22, - 0x2f, 0xd0, 0x0b, 0xf6, 0xf6, 0xf2, 0x3f, 0xfe, 0xf8, 0x55, 0x35, 0x85, 0x57, 0xd6, 0x5e, 0x55, 0x9f, 0x6f, 0x13, 0x2f, 0xe8, 0x0b, 0x7c, 0x7b, 0xbb, 0xb6, 0x8a, 0xcb, 0x8b, 0xf1, 0x17, 0xe8, - 0x05, 0x7e, 0x7b, 0xf1, 0x7f, 0xb9, 0x79, 0xfd, 0x99, 0xfe, 0xff, 0x9d, 0xe6, 0x6e, 0x93, 0x78, 0x15, 0xf8, 0xff, 0xf7, 0xad, 0xaa, 0x8e, 0xfc, 0x23, 0x68, 0xc5, 0xed, 0xc0, 0xc9, 0xd3, 0x22, - 0x3a, 0xc1, 0x74, 0x03, 0xe3, 0x0d, 0x50, 0xe8, 0x0b, 0x7e, 0x8b, 0x44, 0xe9, 0x55, 0x79, 0xd2, 0x7a, 0xee, 0x2b, 0xc8, 0xd5, 0xbf, 0x81, 0x60, 0xe9, 0x05, 0x51, 0x55, 0x97, 0xc7, 0x97, 0xac, - 0x48, 0xe3, 0xea, 0x25, 0x2f, 0x83, 0xc7, 0x6f, 0x00, 0x07, 0x77, 0x97, 0x83, 0x33, 0xe9, 0x97, 0x3a, 0xe8, 0x7e, 0x93, 0x8f, 0xb2, 0xda, 0x0b, 0xca, 0xa8, 0x3e, 0x9e, 0xe8, 0x57, 0xa1, 0x85, - 0xc3, 0xc8, 0xc0, 0xb3, 0xed, 0x49, 0x9d, 0xcc, 0x48, 0xf7, 0xa0, 0x4f, 0xf1, 0x2e, 0x5a, 0xbb, 0x25, 0x84, 0xa7, 0xbc, 0x41, 0xad, 0x33, 0x26, 0x12, 0x46, 0xb0, 0xde, 0xd2, 0xc9, 0x92, 0x73, - 0x6a, 0xa9, 0x06, 0x25, 0x07, 0x18, 0xa3, 0xcb, 0x31, 0xbf, 0xd1, 0xf0, 0x28, 0x55, 0x37, 0x3a, 0x90, 0x86, 0xad, 0x1a, 0x66, 0xeb, 0x2e, 0x15, 0x46, 0x9c, 0xb7, 0x57, 0xb7, 0xfc, 0x34, 0x60, - 0x93, 0xf1, 0x21, 0x70, 0x69, 0xfa, 0xdf, 0xff, 0xbd, 0x0f, 0x7b, 0xad, 0xb8, 0x3d, 0x23, 0x4b, 0xbd, 0xc0, 0xb7, 0xe3, 0xe5, 0x72, 0x67, 0xe0, 0xe7, 0x65, 0x6a, 0xd5, 0xd5, 0x95, 0x69, 0xf0, - 0x3d, 0x57, 0x4e, 0x08, 0x0c, 0x9a, 0x32, 0x7a, 0x63, 0x29, 0xf4, 0x13, 0xce, 0xb8, 0x9e, 0x57, 0xa4, 0x5e, 0x19, 0x78, 0x9f, 0xb0, 0x05, 0x7e, 0x41, 0xff, 0x19, 0xb6, 0xbc, 0x91, 0x07, 0x07, - 0xbf, 0xdb, 0x83, 0x33, 0xd1, 0xef, 0x19, 0x32, 0xa7, 0x14, 0x5e, 0x1e, 0xed, 0x50, 0x39, 0x37, 0x6d, 0x26, 0x5c, 0x0d, 0x01, 0x09, 0x6c, 0x48, 0x32, 0x14, 0x86, 0x68, 0xd0, 0x81, 0xa5, 0x15, - 0xcb, 0x34, 0xb0, 0x40, 0xb6, 0xec, 0x31, 0x8a, 0x85, 0x82, 0x97, 0x04, 0x4d, 0xd5, 0x39, 0xb5, 0x50, 0xac, 0xc4, 0xcb, 0x63, 0x60, 0x88, 0xd0, 0x15, 0x24, 0x0f, 0x1b, 0x41, 0x12, 0x48, 0x3e, - 0xa2, 0x66, 0xbb, 0x95, 0x0f, 0x35, 0x40, 0x99, 0x13, 0x27, 0x86, 0xf4, 0xc0, 0xc5, 0x2b, 0xcb, 0xfc, 0xf3, 0xa1, 0x8a, 0xfc, 0x33, 0x98, 0x9c, 0x49, 0x83, 0x83, 0xcb, 0xdf, 0xc1, 0x99, 0xd8, - 0xf7, 0x58, 0x2c, 0x68, 0xdf, 0x59, 0x5a, 0xc0, 0x38, 0xdb, 0x66, 0xfb, 0x4d, 0x84, 0xfb, 0x5a, 0x1e, 0x94, 0x4b, 0x3d, 0x88, 0xdc, 0x65, 0xe4, 0x00, 0xac, 0x9e, 0x2d, 0xe3, 0x28, 0xd6, 0xdd, - 0x22, 0xa1, 0x8a, 0x76, 0xdb, 0xda, 0xba, 0x8a, 0x8f, 0x58, 0x0b, 0x25, 0x23, 0x93, 0x1f, 0x4e, 0xd9, 0xb6, 0x0a, 0x87, 0xe6, 0x12, 0x3b, 0x02, 0xf9, 0x34, 0xc2, 0x1d, 0x9b, 0x1b, 0xa5, 0xb8, - 0xca, 0xb3, 0x80, 0x9b, 0x8a, 0xfd, 0xb0, 0x38, 0x8f, 0xb0, 0xb8, 0xca, 0xb3, 0x41, 0x55, 0x97, 0x51, 0x16, 0x44, 0xfe, 0xf1, 0xbb, 0xd9, 0x8c, 0xfd, 0x73, 0x10, 0x7d, 0xf5, 0x46, 0x70, 0xf0, - 0xe5, 0xed, 0x01, 0xd6, 0x0f, 0xd0, 0x63, 0x61, 0x1e, 0x33, 0xa9, 0xd5, 0x69, 0xd4, 0x8d, 0x6c, 0x5f, 0x38, 0x6e, 0xc5, 0x35, 0x2a, 0x8d, 0xf0, 0xfd, 0xc8, 0x9d, 0xa8, 0x81, 0xcc, 0x06, 0xd9, - 0x91, 0x12, 0x1d, 0x62, 0x0b, 0x13, 0xe8, 0xde, 0x10, 0x96, 0x0c, 0x96, 0x4e, 0xd8, 0x09, 0xb3, 0xa5, 0xc7, 0x05, 0x00, 0x41, 0x46, 0xba, 0xdb, 0xb2, 0xed, 0x2c, 0xa5, 0x18, 0xf0, 0x60, 0xe4, - 0x9c, 0x15, 0xef, 0x8f, 0x13, 0x57, 0x63, 0x40, 0x2f, 0xe8, 0x37, 0xdb, 0x1f, 0xfc, 0xfe, 0x37, 0xb9, 0xda, 0x67, 0xf6, 0x5a, 0xb6, 0x5d, 0x7a, 0xed, 0xa7, 0x33, 0xf6, 0x56, 0x40, 0xf4, 0x85, - 0xfe, 0x42, 0xf2, 0x24, 0x39, 0xcf, 0x8d, 0xc1, 0x99, 0xca, 0xf7, 0x28, 0x66, 0x99, 0x37, 0x04, 0x67, 0x91, 0x08, 0x86, 0xdd, 0x2c, 0x34, 0x88, 0xc2, 0x65, 0x32, 0x7b, 0x54, 0x77, 0x24, 0x13, - 0x0b, 0xca, 0xa2, 0x34, 0x20, 0x48, 0x00, 0xbb, 0x56, 0x90, 0x53, 0xbc, 0xe0, 0xa7, 0xdb, 0x84, 0x38, 0x34, 0x6c, 0xc9, 0x66, 0x7a, 0x06, 0x6e, 0x6a, 0x65, 0xbd, 0xf6, 0xd7, 0x35, 0xed, 0x9b, - 0x43, 0x10, 0x96, 0x6a, 0x2f, 0xdc, 0x56, 0x9d, 0x3a, 0xdc, 0x39, 0x4a, 0x14, 0x41, 0xe2, 0x3d, 0x8a, 0xed, 0x75, 0x59, 0xfe, 0x0a, 0x8f, 0xbc, 0xac, 0x07, 0x4e, 0x9e, 0xd5, 0x65, 0x9e, 0x7c, - 0xb5, 0xc4, 0x40, 0x4f, 0x0c, 0xca, 0xf7, 0xc4, 0xcf, 0x18, 0xdd, 0x77, 0x0d, 0xce, 0x94, 0xbf, 0x47, 0x2b, 0xa4, 0x12, 0x91, 0xaa, 0x2d, 0xc7, 0x34, 0x32, 0x09, 0x6d, 0xd7, 0xa2, 0x12, 0x44, - 0x76, 0x0c, 0xd4, 0x3c, 0xc3, 0xcd, 0x70, 0x10, 0x48, 0x20, 0x82, 0x6e, 0x10, 0xc1, 0x29, 0xa3, 0x16, 0x64, 0x53, 0xaf, 0x86, 0x3c, 0x2b, 0xc6, 0x94, 0xbd, 0xc6, 0x61, 0x70, 0xc5, 0x0f, 0xf7, - 0x19, 0xc7, 0x44, 0x62, 0x35, 0x89, 0xe1, 0xe1, 0x0e, 0x72, 0xcb, 0xce, 0xd5, 0x5c, 0x8f, 0xe6, 0xea, 0x7d, 0xdf, 0x31, 0xe7, 0xb5, 0x5e, 0x56, 0x0f, 0x6a, 0xab, 0x0c, 0xbc, 0x7a, 0x50, 0x85, - 0x51, 0xfa, 0x60, 0xc4, 0xbd, 0x91, 0xf1, 0xb2, 0x20, 0xca, 0x1e, 0xa9, 0x0e, 0xa7, 0x7f, 0xfa, 0x8f, 0x7f, 0x27, 0x5e, 0xf0, 0x5e, 0xa3, 0xb4, 0xaa, 0x4b, 0xcb, 0xa9, 0x07, 0x49, 0x1e, 0x04, - 0x51, 0x16, 0x7c, 0xc2, 0x15, 0xe4, 0xac, 0x4c, 0xfc, 0x9c, 0x2b, 0xf7, 0xc4, 0xcf, 0x5c, 0xb9, 0xef, 0x1a, 0x9c, 0x29, 0x7f, 0xcf, 0x15, 0x64, 0x14, 0x4b, 0x8a, 0x79, 0x50, 0x84, 0x36, 0xf4, - 0xf8, 0x96, 0xb5, 0x47, 0x55, 0x32, 0x95, 0x0d, 0x5e, 0xdd, 0x96, 0x80, 0x1c, 0x0b, 0x35, 0x9f, 0x95, 0x4b, 0x01, 0x45, 0x7d, 0x60, 0x33, 0xd3, 0x96, 0x9d, 0xd7, 0x89, 0x85, 0xe9, 0xec, 0x36, - 0x01, 0x19, 0x5b, 0xe8, 0x12, 0x73, 0x47, 0x7a, 0xda, 0x75, 0xc1, 0x5e, 0x01, 0x2c, 0x08, 0x19, 0xc6, 0xd2, 0x01, 0x17, 0xc6, 0x11, 0x3a, 0x6f, 0xa2, 0xaf, 0x97, 0x99, 0xcb, 0x72, 0xff, 0x08, - 0x0d, 0xea, 0x05, 0x7e, 0x46, 0x72, 0x5a, 0x71, 0x7b, 0xd5, 0x7a, 0x2e, 0x04, 0xbe, 0xff, 0xea, 0x4a, 0x6a, 0xe0, 0x6d, 0xe1, 0xf0, 0xc3, 0xe3, 0xb2, 0x36, 0x0e, 0xa3, 0x45, 0xbb, 0xf3, 0x15, - 0x2f, 0x1c, 0x2e, 0x3a, 0x73, 0xb2, 0xe7, 0x51, 0x59, 0x39, 0xea, 0x30, 0xa7, 0x00, 0xd8, 0xd8, 0x62, 0xba, 0x31, 0xc1, 0x15, 0x0a, 0x6b, 0x84, 0xb3, 0x50, 0x98, 0x75, 0xf1, 0x50, 0x6f, 0x16, - 0x2a, 0xb9, 0x30, 0x98, 0x7d, 0x66, 0x79, 0x21, 0x1e, 0x3a, 0xfc, 0x3e, 0x3e, 0xc2, 0x62, 0x33, 0xef, 0x46, 0x42, 0x4f, 0x6d, 0xe7, 0x2c, 0xff, 0x4e, 0xea, 0xc0, 0xc0, 0xdb, 0x35, 0x56, 0x72, - 0x1e, 0x89, 0xe8, 0x7b, 0xbd, 0xe6, 0x22, 0x1f, 0x9d, 0xd0, 0x4b, 0xad, 0x41, 0x5d, 0x5a, 0x27, 0x8c, 0x5e, 0xd5, 0x5e, 0xe8, 0x5e, 0x45, 0xba, 0xaa, 0xef, 0x03, 0xbf, 0xcc, 0xd3, 0xab, 0x44, - 0x7d, 0x53, 0x86, 0x90, 0xdb, 0x07, 0x9b, 0x32, 0x1a, 0xc4, 0x17, 0x35, 0xea, 0xb4, 0x4a, 0x20, 0x1f, 0x07, 0xbe, 0xdf, 0x64, 0xee, 0xfd, 0x50, 0x3d, 0xe9, 0xbd, 0xc7, 0x8b, 0xde, 0x1b, 0x44, - 0x75, 0xd8, 0xd8, 0xf7, 0x04, 0x93, 0x5b, 0xc6, 0x5c, 0x1e, 0x78, 0x71, 0xf2, 0x14, 0xac, 0x8a, 0x3c, 0xab, 0xf2, 0xb2, 0x02, 0xbd, 0x22, 0xb7, 0xbd, 0xd2, 0xeb, 0xb6, 0x51, 0xd6, 0x67, 0xce, - 0xdc, 0x69, 0x7b, 0x8f, 0xa7, 0xcb, 0x53, 0xe2, 0xfd, 0x37, 0xdd, 0xeb, 0x38, 0xb9, 0x5e, 0x0d, 0x90, 0x7e, 0x82, 0x5e, 0x3b, 0x40, 0x8b, 0x03, 0x8e, 0x84, 0x87, 0x09, 0x39, 0x86, 0xa9, 0x70, - 0xbb, 0x9a, 0x04, 0x81, 0x91, 0x4c, 0x22, 0x7f, 0xa7, 0x99, 0xb5, 0x61, 0x49, 0x41, 0xde, 0xcc, 0xf3, 0x12, 0xd0, 0x56, 0xae, 0x90, 0x89, 0xc7, 0xc9, 0x02, 0x46, 0xdb, 0x60, 0xa2, 0x1d, 0x37, - 0xeb, 0xa6, 0x20, 0xe5, 0xdc, 0xf3, 0xf2, 0xe5, 0xaa, 0x2a, 0xb1, 0xad, 0x8f, 0x87, 0x84, 0xcb, 0x6b, 0x30, 0x3c, 0x83, 0xf1, 0x95, 0xda, 0x73, 0xb8, 0xfc, 0x56, 0x8e, 0x1f, 0x0a, 0xab, 0xc2, - 0xf3, 0xca, 0xcf, 0x0d, 0x9e, 0x1f, 0xfe, 0xf3, 0xca, 0xab, 0xad, 0x47, 0x04, 0x7e, 0x77, 0xfc, 0xf1, 0xc7, 0xaf, 0xbc, 0xa8, 0xa3, 0x3c, 0x3b, 0x0f, 0xdc, 0xb7, 0x85, 0xe9, 0x8f, 0x37, 0xc6, - 0x7e, 0xcd, 0xe0, 0xec, 0x98, 0x5a, 0xb5, 0x13, 0x7e, 0xba, 0x44, 0xc1, 0x37, 0x43, 0xb6, 0x37, 0x77, 0xaf, 0x44, 0x4f, 0xac, 0xbd, 0x36, 0x07, 0x67, 0x4a, 0xdf, 0xf3, 0x55, 0xc0, 0x50, 0x4f, - 0xf0, 0x79, 0x7a, 0xd6, 0x14, 0xdb, 0xa0, 0xe1, 0xd4, 0xa3, 0x53, 0x3a, 0xd8, 0x6e, 0x3e, 0xdc, 0x76, 0x94, 0x19, 0x35, 0xbc, 0x1a, 0xc5, 0xd6, 0x44, 0xd9, 0xeb, 0xa4, 0xc2, 0xd5, 0x90, 0x01, - 0xb2, 0xeb, 0x05, 0xd9, 0x42, 0x96, 0x45, 0x95, 0x06, 0x05, 0x13, 0x07, 0x2d, 0x36, 0xc9, 0x72, 0xee, 0xd2, 0xb8, 0xee, 0xae, 0x9c, 0x62, 0x33, 0x55, 0x16, 0xab, 0x1d, 0x20, 0xb5, 0x5a, 0xf0, - 0x78, 0x01, 0xef, 0xc1, 0xea, 0xec, 0x34, 0x2a, 0x93, 0xa8, 0xf3, 0x06, 0x85, 0x55, 0x87, 0x57, 0xc1, 0xf0, 0x6e, 0xba, 0x17, 0x91, 0x93, 0xbf, 0x62, 0xf8, 0x6a, 0xc4, 0x7e, 0xe0, 0xeb, 0x37, - 0x2b, 0xd8, 0x1f, 0x54, 0x9f, 0xc9, 0x58, 0x3a, 0xe1, 0xf1, 0x53, 0x2d, 0xeb, 0x29, 0x5d, 0xe2, 0x44, 0xf1, 0xc4, 0xa5, 0xd3, 0xdf, 0x01, 0xdc, 0x4f, 0x6b, 0xd0, 0x03, 0x60, 0x28, 0xed, 0xc7, - 0x01, 0x08, 0x15, 0x28, 0x52, 0x7b, 0x0b, 0x97, 0x5d, 0x09, 0x8a, 0x90, 0x6d, 0xf4, 0x05, 0x03, 0xed, 0x51, 0xc6, 0xe7, 0xb2, 0xa9, 0xe2, 0x47, 0x4e, 0xde, 0x55, 0x74, 0x50, 0xb5, 0x3b, 0x44, - 0xf7, 0x32, 0x61, 0xbe, 0x03, 0x57, 0x46, 0xd1, 0x75, 0x22, 0xd8, 0x52, 0x5d, 0xc9, 0x1f, 0xe7, 0x19, 0xc1, 0x54, 0xe8, 0x70, 0x43, 0x63, 0xf3, 0x19, 0xb3, 0x9f, 0xfa, 0xbb, 0xfd, 0xd7, 0xeb, - 0x53, 0x19, 0x14, 0xd6, 0x45, 0xde, 0xfe, 0x85, 0x4b, 0xf6, 0x95, 0xe8, 0xf9, 0xfb, 0x2f, 0xcd, 0xbe, 0x4b, 0x34, 0x05, 0x0c, 0xb5, 0x9d, 0x67, 0xdb, 0xd3, 0xae, 0xd0, 0x87, 0xbc, 0x04, 0x68, - 0x16, 0xc1, 0x23, 0x43, 0xab, 0x9a, 0xe5, 0x81, 0x27, 0xad, 0x3a, 0x87, 0xad, 0xe9, 0xd9, 0xda, 0x2d, 0x56, 0x1c, 0x77, 0xa4, 0x03, 0x18, 0xf2, 0x21, 0xdc, 0x92, 0xa7, 0x9b, 0x91, 0xed, 0x4c, - 0x76, 0xac, 0x0f, 0x0a, 0xfa, 0x1e, 0x9e, 0xc4, 0xb4, 0x09, 0xec, 0x10, 0xd0, 0x9e, 0x8c, 0x02, 0x94, 0x69, 0x9b, 0x72, 0x81, 0x7e, 0x6d, 0xfd, 0x58, 0x95, 0x55, 0x7c, 0xf1, 0xf9, 0xc4, 0xcf, - 0x3f, 0xbf, 0xb2, 0x8a, 0xd3, 0xa7, 0x57, 0x56, 0x71, 0xfe, 0x6c, 0xe2, 0xfb, 0xcf, 0x1e, 0xc9, 0x9c, 0x16, 0x30, 0x32, 0x1d, 0x2d, 0x2a, 0x1c, 0xca, 0x11, 0xc9, 0xa3, 0x8a, 0xa2, 0x2d, 0xd0, - 0xca, 0xdb, 0x70, 0xba, 0x2c, 0xad, 0x30, 0xcc, 0x71, 0xe5, 0x4a, 0x19, 0x4e, 0xfd, 0xf5, 0x44, 0x55, 0xcd, 0x25, 0xcf, 0x6a, 0x9b, 0x71, 0x15, 0x69, 0x96, 0x24, 0x68, 0x2b, 0xd8, 0xcc, 0x32, - 0x20, 0xdd, 0x99, 0x30, 0xef, 0x6f, 0x4c, 0xb4, 0x43, 0x19, 0x6d, 0xd2, 0xc9, 0x05, 0x19, 0x4a, 0xf4, 0x8f, 0xb5, 0xeb, 0xea, 0x98, 0x39, 0xdb, 0xa8, 0xfe, 0x04, 0x0d, 0xe8, 0x05, 0x7b, 0x66, - 0x26, 0x5c, 0x89, 0x9e, 0x11, 0xb9, 0x34, 0x07, 0x67, 0x4a, 0xdf, 0xa3, 0xc2, 0x7b, 0xd1, 0x90, 0xe7, 0xb0, 0x5a, 0x0a, 0x21, 0x63, 0xa7, 0xa2, 0xec, 0x21, 0xd4, 0xc9, 0xa1, 0xbb, 0x02, 0xd3, - 0xfd, 0x26, 0x68, 0x6d, 0x73, 0x6e, 0xc9, 0x6b, 0x4b, 0xda, 0x02, 0x76, 0x15, 0x6e, 0x63, 0x48, 0xc6, 0x1d, 0x9f, 0x73, 0x02, 0xc3, 0xda, 0x96, 0xde, 0x28, 0x2e, 0xb9, 0xbd, 0x55, 0xeb, 0x0b, - 0xbb, 0x03, 0x66, 0xf9, 0xcc, 0x35, 0x96, 0x87, 0x72, 0x11, 0xa5, 0xc8, 0x2a, 0xd6, 0x9e, 0xb0, 0x39, 0xea, 0x3c, 0x8d, 0x9c, 0x41, 0x95, 0x78, 0xde, 0x67, 0xe3, 0xe4, 0x49, 0x19, 0x71, 0x43, - 0xf8, 0x84, 0xce, 0xcd, 0x65, 0x5f, 0x89, 0xb1, 0x5d, 0xf3, 0x31, 0xb3, 0xa3, 0x43, 0xb2, 0x38, 0x40, 0xba, 0xb6, 0x9e, 0x01, 0x98, 0x68, 0x77, 0x79, 0x24, 0x81, 0x99, 0xb2, 0xe5, 0x68, 0x6d, - 0xdd, 0xb8, 0x48, 0xd3, 0x66, 0xf3, 0x5d, 0xc3, 0xc0, 0xe0, 0x01, 0xb7, 0xc8, 0x89, 0x68, 0xae, 0xe6, 0x0a, 0x44, 0x3b, 0xdd, 0x6e, 0x01, 0x89, 0x19, 0x41, 0xe6, 0x06, 0xa8, 0x28, 0x22, 0xbc, - 0xb4, 0xd5, 0x85, 0x15, 0x9b, 0x45, 0x81, 0xce, 0x86, 0xf5, 0x1d, 0x42, 0xdf, 0x88, 0x57, 0xaa, 0xaf, 0x21, 0xdb, 0x5a, 0x51, 0x62, 0xd9, 0x89, 0x37, 0x38, 0xe9, 0x58, 0xee, 0xc0, 0x2a, 0x4b, - 0xeb, 0xf8, 0x99, 0xe6, 0x03, 0xdf, 0xb9, 0x2b, 0x7b, 0xc3, 0xf9, 0xf0, 0x15, 0x27, 0x60, 0x1f, 0xde, 0x38, 0x43, 0x8c, 0x7d, 0x0f, 0xb1, 0x4c, 0xe3, 0xa9, 0x3e, 0xd7, 0xca, 0x99, 0x0b, 0x2b, - 0x96, 0x18, 0xfb, 0x07, 0xd5, 0x08, 0x42, 0x7b, 0x27, 0x82, 0xa1, 0x11, 0xe5, 0x8b, 0x74, 0x39, 0x6f, 0x85, 0xf9, 0x91, 0x69, 0x0c, 0xa9, 0xd6, 0x75, 0x2f, 0x9b, 0xae, 0x57, 0x71, 0x8c, 0x85, - 0xb2, 0x5c, 0xc3, 0x63, 0x1f, 0x3e, 0x54, 0x8d, 0x2e, 0xeb, 0x65, 0x7d, 0x28, 0x37, 0x63, 0x9c, 0xaf, 0x31, 0x4f, 0x25, 0x1c, 0xbe, 0x1e, 0x31, 0x2e, 0xfd, 0x03, 0x88, 0xff, 0x78, 0xb8, 0xec, - 0x3d, 0xd4, 0x5f, 0x7b, 0x68, 0xa9, 0x49, 0x1c, 0x5a, 0xa5, 0xdd, 0x8b, 0x63, 0x6d, 0x94, 0x7f, 0x6a, 0xbb, 0x20, 0xcf, 0x2c, 0x0b, 0x27, 0x8a, 0x67, 0x7e, 0xb4, 0x51, 0x3e, 0x38, 0xd3, 0xf8, - 0x1e, 0x7e, 0x85, 0x4e, 0x56, 0x46, 0xcb, 0x37, 0x7b, 0xf6, 0xb8, 0x5c, 0xa0, 0x82, 0x3f, 0xb2, 0x71, 0x6d, 0x31, 0xd2, 0xcd, 0x54, 0xef, 0x10, 0x7f, 0x33, 0x0e, 0x5a, 0x04, 0x75, 0x89, 0xce, - 0x9c, 0xba, 0x89, 0x07, 0xee, 0xd0, 0x40, 0x88, 0xd3, 0xc3, 0xc8, 0xf2, 0x9a, 0x31, 0x54, 0x18, 0x10, 0xd3, 0x55, 0xb8, 0xa0, 0xad, 0xe4, 0xc0, 0xdf, 0xed, 0x26, 0xe6, 0xb6, 0x3c, 0x7a, 0xf0, - 0x90, 0x4d, 0x18, 0x25, 0xd8, 0xf7, 0x54, 0x47, 0xaf, 0x6a, 0xc1, 0x03, 0x4b, 0xc4, 0xf5, 0xec, 0xe6, 0x62, 0x7b, 0x60, 0xef, 0x6f, 0x9d, 0x6c, 0x9e, 0xdd, 0xf5, 0xbf, 0x88, 0x5e, 0xde, 0x73, - 0xdb, 0x4a, 0xac, 0xcc, 0xf1, 0xdc, 0xc1, 0x57, 0x0a, 0x23, 0x7c, 0x67, 0xe3, 0xf4, 0xc5, 0xfc, 0x9e, 0x34, 0x38, 0x78, 0xd7, 0x71, 0x9e, 0x04, 0x3d, 0x94, 0x47, 0x34, 0x97, 0x3d, 0x95, 0x87, - 0x94, 0xd5, 0x86, 0x20, 0xc3, 0x35, 0x4c, 0xa7, 0xb6, 0x5e, 0x2d, 0xb0, 0xa3, 0xb5, 0x53, 0xc9, 0x3a, 0x8e, 0xb8, 0xc4, 0x3e, 0x48, 0x8c, 0xc9, 0x17, 0x1c, 0xb4, 0xd0, 0x86, 0xc0, 0xd8, 0xd3, - 0x31, 0x5b, 0xa2, 0x2d, 0x1d, 0xa2, 0xb3, 0x43, 0x0d, 0xd5, 0x07, 0x64, 0x55, 0x16, 0x52, 0xa1, 0xed, 0x45, 0x4b, 0xd8, 0xcf, 0x92, 0x99, 0x3c, 0x99, 0x87, 0x86, 0x8a, 0x0b, 0xfb, 0x9f, 0x4a, - 0x62, 0xdb, 0xaa, 0x3c, 0x02, 0xbb, 0x18, 0x76, 0x8f, 0x21, 0xc2, 0x9f, 0x18, 0x96, 0x6f, 0x54, 0xcf, 0xe8, 0x5c, 0xdb, 0x83, 0x33, 0xad, 0xef, 0x81, 0xa1, 0x17, 0x85, 0x65, 0x24, 0x5c, 0x46, - 0xd5, 0x98, 0xbc, 0xb1, 0x79, 0x6e, 0x7c, 0x04, 0x6c, 0x1c, 0x58, 0x2c, 0x82, 0x56, 0xc2, 0xda, 0xb2, 0x62, 0xa8, 0xd6, 0x6e, 0x4b, 0x3b, 0x12, 0xe7, 0x45, 0x45, 0xfa, 0x0b, 0x46, 0xd9, 0xc6, - 0x5b, 0xa6, 0x3c, 0x12, 0x71, 0x04, 0x95, 0xea, 0x3c, 0x1e, 0x43, 0xdb, 0xce, 0x5e, 0x7b, 0xc2, 0x72, 0xdf, 0x1d, 0x76, 0x54, 0x74, 0x2c, 0x72, 0x0c, 0xde, 0x79, 0xda, 0x9d, 0x74, 0xf8, 0x3d, - 0xd1, 0xff, 0xaf, 0xb7, 0x31, 0x76, 0x67, 0xa3, 0x7c, 0x6a, 0xb4, 0xf6, 0x13, 0x08, 0xbe, 0x57, 0xe6, 0x55, 0xf5, 0xeb, 0xed, 0xbf, 0xfe, 0xe7, 0x7f, 0xfb, 0xfa, 0x35, 0x85, 0x55, 0x97, 0x5e, - 0x9e, 0x7d, 0xf9, 0x9e, 0xfd, 0x7e, 0xff, 0x72, 0x7d, 0xee, 0xfc, 0xb2, 0x9f, 0xbe, 0xc3, 0xc9, 0xb3, 0xaa, 0x49, 0xea, 0xd3, 0x67, 0x7f, 0xf5, 0x9a, 0x0b, 0xd9, 0x33, 0x13, 0xab, 0xa6, 0x28, - 0xf2, 0xb2, 0xbe, 0x79, 0xc5, 0xb5, 0xf5, 0xdf, 0xbf, 0x18, 0x4e, 0x51, 0x66, 0x95, 0xc7, 0x81, 0x77, 0xa8, 0xbd, 0xec, 0x34, 0x84, 0x3e, 0x37, 0xc4, 0x9f, 0x71, 0xd4, 0x7c, 0xa0, 0x7e, 0x1a, - 0x5e, 0xef, 0xfb, 0x06, 0x48, 0x3f, 0x1f, 0x76, 0xcc, 0x38, 0xf5, 0x1c, 0x9c, 0x6d, 0x44, 0xdb, 0xcc, 0xe7, 0xc7, 0x6d, 0xee, 0x71, 0x76, 0xa8, 0x17, 0x7c, 0xb2, 0x1e, 0xed, 0xd8, 0xb5, 0xb3, - 0xd7, 0xe7, 0x8b, 0x79, 0x1e, 0x60, 0xc8, 0x04, 0xe7, 0x18, 0x41, 0xdd, 0x8b, 0x8a, 0xec, 0xc6, 0x63, 0xce, 0x8d, 0xc2, 0x38, 0x86, 0x98, 0x24, 0x0b, 0x3d, 0x91, 0xb4, 0x13, 0x5b, 0x21, 0x5c, - 0x8e, 0xb7, 0xfc, 0x35, 0x1d, 0xc9, 0x54, 0x9e, 0x8b, 0x8b, 0x4f, 0xf4, 0xc3, 0xbe, 0xeb, 0x52, 0x1f, 0xc3, 0xca, 0x8e, 0xb2, 0xba, 0xf4, 0xbc, 0xaf, 0x16, 0xfa, 0x27, 0x64, 0xda, 0x95, 0xe8, - 0x05, 0xd0, 0x73, 0xb3, 0xaf, 0x1c, 0xdb, 0xf0, 0xab, 0x40, 0x59, 0xed, 0x63, 0xda, 0x52, 0x59, 0x9c, 0x82, 0x64, 0x3d, 0x43, 0x97, 0x96, 0xb3, 0x09, 0xe2, 0xa6, 0x2c, 0xed, 0x55, 0xea, 0x91, - 0xa6, 0xb9, 0x36, 0x58, 0x59, 0xde, 0x90, 0x69, 0x5a, 0x1b, 0x84, 0x28, 0x4a, 0x21, 0x34, 0x09, 0xd0, 0x62, 0x3f, 0x73, 0xb2, 0x5a, 0x24, 0x49, 0x66, 0x52, 0x2e, 0xe0, 0x25, 0xb4, 0x3e, 0x6c, - 0x6d, 0xaf, 0x8e, 0x9d, 0x5c, 0xef, 0x36, 0xfb, 0xc5, 0xd7, 0x16, 0x96, 0x5d, 0x5a, 0x8e, 0x37, 0xf0, 0x0e, 0x85, 0x95, 0x5d, 0x3f, 0xfb, 0x31, 0x12, 0xf0, 0x0b, 0xfc, 0x84, 0xec, 0xba, 0x27, - 0x7e, 0x42, 0xe4, 0xbe, 0xe7, 0xe2, 0xde, 0xef, 0x21, 0xc8, 0xa2, 0x71, 0x23, 0x70, 0xcc, 0x34, 0x28, 0x39, 0x9d, 0xe4, 0x90, 0x76, 0x32, 0x03, 0xf1, 0x43, 0xd1, 0x41, 0x64, 0x27, 0x73, 0x23, - 0x08, 0x52, 0x8a, 0x26, 0xd8, 0x85, 0xa9, 0x51, 0x6f, 0xd2, 0x15, 0x4f, 0xe0, 0x30, 0x95, 0x8e, 0x1b, 0x69, 0x95, 0xf3, 0xc6, 0x34, 0x71, 0x27, 0xa3, 0x04, 0x0a, 0x60, 0x8a, 0x6c, 0xfc, 0xbc, - 0x73, 0x2d, 0x2e, 0xd0, 0x16, 0x8e, 0x31, 0xb5, 0x09, 0x78, 0xc7, 0x46, 0xdf, 0x8d, 0xb0, 0xcf, 0x97, 0xde, 0x0f, 0x4b, 0xe2, 0x83, 0x35, 0xd8, 0xc9, 0x33, 0xc7, 0xaa, 0x07, 0xe9, 0xd9, 0x7c, - 0xfb, 0x05, 0xf5, 0x0c, 0x55, 0x9f, 0x01, 0xfa, 0x6c, 0x40, 0xa2, 0xcf, 0x0d, 0xc8, 0x33, 0xc9, 0x57, 0xf0, 0xab, 0x73, 0x90, 0xa0, 0xc7, 0x60, 0xb4, 0xa9, 0x26, 0x05, 0x96, 0xb0, 0xd4, 0xad, - 0x50, 0x8d, 0x91, 0xbb, 0x36, 0x4c, 0x89, 0x60, 0xd6, 0xc1, 0x47, 0x5f, 0xb1, 0x47, 0x35, 0x61, 0x28, 0x89, 0x33, 0x59, 0xd0, 0x6d, 0x95, 0xee, 0xc6, 0xa6, 0x39, 0xdd, 0x63, 0x44, 0x47, 0x20, - 0x44, 0xb2, 0x89, 0x87, 0x31, 0x7c, 0x9c, 0x08, 0x1a, 0x8a, 0x72, 0x38, 0x07, 0x24, 0x23, 0xb1, 0x30, 0x57, 0x02, 0xbc, 0xa5, 0x12, 0x80, 0xa4, 0x38, 0x0b, 0x7a, 0x1e, 0x72, 0x3f, 0x4a, 0x92, - 0x41, 0x69, 0x65, 0xc1, 0xc5, 0xf9, 0x4a, 0xde, 0xe1, 0xf9, 0x97, 0x0a, 0x85, 0xc6, 0xf7, 0x3f, 0x0d, 0xdd, 0x10, 0x2f, 0xd0, 0x0b, 0xfa, 0x73, 0x0e, 0x9c, 0x49, 0x9e, 0x38, 0x70, 0x6e, 0x0c, - 0xce, 0x54, 0xbe, 0xe7, 0xc0, 0x54, 0x89, 0xc6, 0xc5, 0xfa, 0x50, 0xef, 0x23, 0xd3, 0xe4, 0x26, 0xa6, 0xed, 0xd8, 0xca, 0xcc, 0x31, 0xe3, 0x89, 0xb4, 0x99, 0x8d, 0xb3, 0xe1, 0x71, 0x07, 0x16, - 0xcc, 0x74, 0xab, 0x24, 0x43, 0x1c, 0xa4, 0x0f, 0x1d, 0x03, 0x67, 0xd6, 0xc8, 0xa9, 0xd7, 0xa4, 0xc1, 0x13, 0x54, 0x19, 0xad, 0xc0, 0x60, 0x29, 0x33, 0x06, 0x59, 0xb9, 0xe5, 0xca, 0x3e, 0x52, - 0x61, 0xee, 0xd3, 0x8c, 0xd1, 0x34, 0x3b, 0xfe, 0xff, 0xac, 0xde, 0x7f, 0xe1, 0xea, 0xdd, 0x63, 0xdc, 0xde, 0x6a, 0x85, 0x27, 0x29, 0xf1, 0x2e, 0x97, 0x25, 0xf2, 0x3c, 0x8f, 0xc4, 0xb1, 0xeb, - 0x4d, 0xa4, 0x97, 0x8c, 0x70, 0xac, 0x24, 0x19, 0xd8, 0x51, 0xe6, 0xfe, 0xa5, 0xeb, 0xd6, 0x1b, 0x55, 0x70, 0xf0, 0xbb, 0xdd, 0x77, 0xe5, 0x22, 0x79, 0x60, 0x6a, 0x8f, 0xa3, 0xb0, 0x1c, 0xe1, - 0x1a, 0x6b, 0x4f, 0x0d, 0xaf, 0x72, 0xea, 0x7d, 0xaa, 0x2c, 0x2c, 0x8f, 0x28, 0xf9, 0x68, 0xd6, 0xa5, 0x1d, 0x1c, 0x39, 0xa5, 0xa7, 0xcd, 0x01, 0xc8, 0xa2, 0xc9, 0xe5, 0xdc, 0x6f, 0x76, 0xe1, - 0xa4, 0xca, 0x11, 0x65, 0x98, 0x39, 0x85, 0x33, 0xad, 0xbb, 0x95, 0x58, 0x77, 0xba, 0x8f, 0x88, 0x2c, 0xdb, 0x78, 0xda, 0x9c, 0x55, 0x8c, 0x6a, 0x57, 0xf6, 0x74, 0xcb, 0xfb, 0x4d, 0xe6, 0xd4, - 0xa7, 0xc5, 0xe4, 0x0a, 0xc9, 0x25, 0x21, 0xe9, 0x0e, 0xe5, 0xc0, 0xab, 0x07, 0xa7, 0xb5, 0x38, 0xca, 0xaa, 0xc8, 0x79, 0x13, 0xd7, 0x7d, 0xe3, 0x2e, 0x3d, 0x06, 0x7a, 0x6f, 0xbb, 0xd5, 0x09, - 0xf3, 0x6d, 0xe4, 0x5a, 0x5f, 0x65, 0x1f, 0xfd, 0x5c, 0xbe, 0xbc, 0x12, 0x3d, 0x71, 0xee, 0xda, 0x3c, 0x27, 0x1b, 0xf5, 0x90, 0x31, 0x4c, 0x89, 0x56, 0xfe, 0x42, 0x12, 0x88, 0x5c, 0x71, 0x62, - 0x1f, 0x99, 0xa7, 0x6a, 0x3a, 0x9d, 0xfb, 0xde, 0x66, 0xd5, 0xea, 0x23, 0xd7, 0x0b, 0x0e, 0x23, 0x28, 0xda, 0x88, 0xb8, 0x67, 0x23, 0x1b, 0x18, 0x6a, 0xa6, 0x73, 0x75, 0x4c, 0xcb, 0x14, 0x3f, - 0x3a, 0x9a, 0xee, 0x86, 0x3e, 0x6e, 0x6c, 0xea, 0xa0, 0xaf, 0x3b, 0x94, 0x8d, 0x63, 0x25, 0x88, 0x87, 0xdb, 0xa5, 0x56, 0x99, 0xca, 0x6e, 0x42, 0x6c, 0x3f, 0x31, 0x9d, 0x7e, 0x2e, 0x76, 0xa2, - 0xcc, 0x8d, 0xda, 0xc8, 0x6d, 0xac, 0xe4, 0xcb, 0xb9, 0x5a, 0x58, 0x4d, 0x92, 0x46, 0x49, 0x52, 0x5e, 0x04, 0xc2, 0x85, 0x3a, 0xf8, 0xdc, 0x7c, 0xbd, 0x09, 0x8c, 0xfc, 0xfa, 0xc7, 0x7d, 0x18, - 0xe4, 0x34, 0x9b, 0x5f, 0x97, 0xe7, 0xd3, 0xbd, 0x77, 0x51, 0xbd, 0x20, 0xc9, 0xed, 0x41, 0x61, 0x95, 0x5e, 0x76, 0xce, 0x5b, 0xfb, 0x07, 0xfe, 0xfe, 0x9f, 0xa3, 0x6a, 0x70, 0x55, 0xb1, 0x5f, - 0x83, 0x0a, 0xff, 0x40, 0x5e, 0xde, 0xa5, 0x59, 0x45, 0xd5, 0xe0, 0x44, 0xe7, 0x7c, 0x13, 0xbb, 0x73, 0x6f, 0x3f, 0x8c, 0x4a, 0xfc, 0xe3, 0x43, 0x54, 0xa2, 0xf4, 0x2c, 0xd7, 0x8d, 0xca, 0xe2, - 0x7a, 0x97, 0x78, 0x22, 0xac, 0xfe, 0x07, 0xf5, 0x02, 0x3f, 0x0c, 0x52, 0xbd, 0xc6, 0x9b, 0x3e, 0x8f, 0x72, 0xf9, 0xd5, 0x39, 0xbe, 0x5f, 0x5d, 0x3f, 0x0e, 0xbd, 0x99, 0x63, 0x5f, 0xcc, 0x89, - 0x24, 0x6f, 0xdc, 0xb7, 0xff, 0xfb, 0x6c, 0xd9, 0xfd, 0xb9, 0xcb, 0xed, 0x86, 0xee, 0x69, 0x66, 0xfc, 0xbe, 0x3a, 0x2f, 0xc0, 0x3d, 0x9c, 0x6b, 0x1b, 0xeb, 0x48, 0xc1, 0xb6, 0x52, 0x35, 0xf5, - 0x74, 0x6b, 0x1e, 0xb8, 0x6c, 0x85, 0x2c, 0xa0, 0xd2, 0x6b, 0x87, 0xb8, 0x0b, 0x1d, 0x48, 0x4b, 0x31, 0x51, 0x16, 0x18, 0xa5, 0x29, 0x05, 0xb2, 0xd9, 0xac, 0xab, 0x36, 0x35, 0xeb, 0x7b, 0xa3, - 0xed, 0xd2, 0xd1, 0xa7, 0x0c, 0xe6, 0x74, 0x26, 0x44, 0x49, 0x39, 0x9f, 0x11, 0x02, 0xbf, 0x48, 0x80, 0x72, 0xa6, 0x5b, 0x23, 0x19, 0xd0, 0x33, 0x20, 0x9e, 0xf5, 0x94, 0x6a, 0xff, 0x44, 0x26, - 0x5e, 0x51, 0xe6, 0x8e, 0x57, 0x5d, 0x6e, 0x42, 0xa7, 0x7f, 0x87, 0xef, 0xfe, 0xbf, 0xa9, 0xa3, 0xe4, 0xf5, 0x1e, 0x72, 0x9f, 0x78, 0xd9, 0x34, 0x91, 0x7b, 0x7d, 0x2b, 0xfa, 0x48, 0x3c, 0x7e, - 0x33, 0x70, 0x60, 0xe4, 0x8f, 0xff, 0x1f, 0x02, 0xf5, 0xf4, 0xb9, 0x3a, 0x79, 0x6a, 0x47, 0x99, 0xe7, 0x0e, 0xaa, 0xba, 0xf4, 0xac, 0xf4, 0x8b, 0xb5, 0x8c, 0xfa, 0x39, 0xe7, 0xef, 0x69, 0x9f, - 0xb8, 0x7f, 0xdf, 0x73, 0x5e, 0xd7, 0xa8, 0xef, 0x47, 0xc0, 0x54, 0x5c, 0x63, 0x2b, 0xc9, 0x6f, 0xe6, 0x1e, 0xe7, 0x93, 0xce, 0xc8, 0x1e, 0xad, 0xe6, 0x53, 0x3d, 0x5c, 0xc8, 0xcc, 0x0e, 0x40, - 0xb6, 0x34, 0x5d, 0x8e, 0x92, 0x54, 0x1a, 0xb5, 0x4e, 0x3b, 0x9d, 0xe0, 0xa3, 0x11, 0xcc, 0x99, 0x0b, 0xbd, 0x96, 0xa7, 0xb4, 0xcc, 0x84, 0x6e, 0xd2, 0x0d, 0x3b, 0xde, 0xd8, 0x1f, 0x42, 0x2a, - 0x61, 0xdc, 0xac, 0x4d, 0x57, 0xbc, 0x07, 0x02, 0xb8, 0xe3, 0xe6, 0x13, 0xf7, 0xf9, 0xb0, 0xa4, 0xeb, 0x25, 0xd6, 0xf1, 0x16, 0xb2, 0x5f, 0xff, 0x80, 0x9f, 0xca, 0x9c, 0xf9, 0xe3, 0x84, 0x6a, - 0x2f, 0x1e, 0xa5, 0x56, 0xe6, 0x7e, 0xaa, 0x0e, 0xc3, 0xd0, 0x53, 0xa1, 0x85, 0x37, 0xb2, 0x17, 0xc6, 0x5c, 0xda, 0x83, 0x0b, 0xb1, 0xef, 0x79, 0xd2, 0xc9, 0xb8, 0x90, 0x29, 0x33, 0x04, 0x99, - 0xce, 0xa4, 0x15, 0x71, 0x4c, 0xd6, 0x1a, 0xc5, 0x62, 0x74, 0x01, 0xcd, 0x26, 0xfc, 0x71, 0x4b, 0x20, 0x7e, 0xb8, 0x94, 0x19, 0x08, 0x68, 0x38, 0x49, 0x19, 0xae, 0x1c, 0x69, 0xbc, 0x64, 0x8b, - 0xed, 0x66, 0xdd, 0x5a, 0x39, 0x66, 0xc7, 0x51, 0x5a, 0x2c, 0x40, 0x56, 0x0e, 0x8f, 0xd9, 0x51, 0xdc, 0x4e, 0xa7, 0x07, 0x2e, 0xdc, 0xaf, 0x9c, 0x89, 0x92, 0xba, 0xcd, 0x4f, 0x5c, 0xde, 0x30, - 0xd6, 0x0f, 0xba, 0x22, 0xcf, 0xbc, 0xac, 0x1e, 0x78, 0x69, 0x54, 0xd7, 0x9f, 0x43, 0xf8, 0x54, 0x62, 0xeb, 0x07, 0xea, 0x17, 0x24, 0xef, 0xfb, 0xfa, 0xe6, 0xb7, 0x4a, 0x2e, 0x5a, 0x79, 0x84, - 0x38, 0x02, 0x2a, 0x1e, 0x56, 0xf6, 0x3b, 0x33, 0xae, 0x1c, 0xb1, 0x6c, 0xca, 0x62, 0x22, 0xcc, 0x7c, 0x1e, 0x02, 0x8f, 0x46, 0x26, 0x47, 0x19, 0x21, 0x82, 0x25, 0x83, 0xa6, 0x7c, 0x53, 0x73, - 0xad, 0x5a, 0x8e, 0xe9, 0x70, 0xde, 0xd8, 0x68, 0x39, 0x84, 0x9a, 0xb5, 0x0d, 0xc8, 0x13, 0x79, 0xd4, 0x4c, 0x20, 0xd1, 0xc8, 0x47, 0x43, 0xc8, 0x70, 0x7d, 0xab, 0xae, 0xa4, 0x4f, 0x06, 0xf9, - 0x57, 0x80, 0xdd, 0xd8, 0xcb, 0x8f, 0x90, 0x82, 0x9e, 0x8a, 0xf6, 0xfe, 0x26, 0x7b, 0x86, 0xe8, 0xf5, 0x62, 0x00, 0xf5, 0x8b, 0xf8, 0x82, 0x72, 0xd9, 0x62, 0x6e, 0xb5, 0x3f, 0x8a, 0xeb, 0x91, - 0x9f, 0x87, 0x6c, 0xd1, 0x0d, 0x73, 0xc2, 0xb0, 0x51, 0xb6, 0x43, 0xe5, 0x52, 0x65, 0x76, 0x23, 0x0e, 0x2f, 0x95, 0x26, 0x64, 0x25, 0xd2, 0x0a, 0xeb, 0xc4, 0x36, 0x16, 0xd9, 0xe6, 0xb0, 0x47, - 0xec, 0xf1, 0x74, 0x25, 0x25, 0xb1, 0x45, 0x93, 0x13, 0x9d, 0xb3, 0x74, 0x93, 0xda, 0x57, 0x9c, 0x9b, 0xbb, 0xd3, 0xd6, 0xde, 0x86, 0x8b, 0x74, 0xf7, 0x04, 0x36, 0xf9, 0x36, 0xfa, 0x2c, 0x0a, - 0x0e, 0x3d, 0x95, 0xb1, 0x7e, 0x21, 0x79, 0xc6, 0xe4, 0xd4, 0x18, 0x40, 0xfd, 0x92, 0xd3, 0x0d, 0x13, 0x65, 0xd5, 0x63, 0x06, 0xe6, 0x54, 0xe0, 0x2f, 0xe6, 0x49, 0x96, 0xe8, 0x64, 0x40, 0x1e, - 0x76, 0x58, 0x70, 0xe4, 0x09, 0x5e, 0x6e, 0x42, 0x56, 0x58, 0x58, 0x16, 0x5b, 0x55, 0xec, 0x08, 0xd9, 0x05, 0x8c, 0x2a, 0x43, 0x81, 0x10, 0xd4, 0x4a, 0x9b, 0x1f, 0xcd, 0xa5, 0x52, 0x0f, 0x69, - 0x9b, 0x70, 0xc7, 0x58, 0xe8, 0x3b, 0x43, 0x77, 0x83, 0x5b, 0xe5, 0xb6, 0x75, 0x40, 0x7e, 0x9c, 0x96, 0xfb, 0x1f, 0x4c, 0xbe, 0x3f, 0xa0, 0x17, 0xa2, 0xd7, 0xf4, 0x3b, 0x7d, 0x55, 0xfc, 0xa9, - 0xa2, 0x7d, 0x5a, 0x34, 0x9f, 0xd0, 0x28, 0x5e, 0xa9, 0xbe, 0xe1, 0x16, 0x5b, 0xe5, 0x39, 0x75, 0xa9, 0x87, 0x36, 0xb1, 0x64, 0x0e, 0x44, 0xce, 0x95, 0x0b, 0x40, 0x08, 0xbb, 0xe5, 0x62, 0xae, - 0x0e, 0x63, 0x5c, 0x26, 0x41, 0x03, 0x8d, 0x57, 0x60, 0xaa, 0x72, 0x2d, 0x03, 0x32, 0xde, 0x0c, 0xd6, 0xc4, 0x74, 0x9e, 0x11, 0x38, 0x12, 0x09, 0x63, 0xdc, 0xc0, 0x94, 0x51, 0x37, 0x1e, 0x26, - 0x00, 0xce, 0xaf, 0x78, 0x3d, 0x39, 0x2a, 0x0a, 0x0d, 0xc8, 0xe9, 0x46, 0x15, 0x52, 0x88, 0x13, 0xd5, 0x7d, 0xc1, 0xe0, 0xf3, 0xdd, 0x8f, 0xa3, 0x14, 0xae, 0x77, 0x51, 0x1d, 0x3f, 0x73, 0xf3, - 0xfd, 0x7c, 0x24, 0x9d, 0x29, 0x9e, 0xf3, 0xea, 0xad, 0x3a, 0x3c, 0x7b, 0xf4, 0xbe, 0x19, 0x47, 0xf0, 0x80, 0xb6, 0x76, 0x8e, 0x38, 0x22, 0xdd, 0x6d, 0xa6, 0x4e, 0xa7, 0x13, 0x67, 0x19, 0xa4, - 0x06, 0xce, 0xb0, 0x36, 0xeb, 0x1c, 0x82, 0xaf, 0x9c, 0x95, 0xaf, 0x61, 0xad, 0x47, 0xbf, 0x1d, 0x7b, 0x41, 0x9f, 0x60, 0xe8, 0x99, 0xe2, 0xf9, 0xb7, 0xdb, 0x4d, 0x30, 0x38, 0xd3, 0xf8, 0x9e, - 0x91, 0x82, 0xa4, 0x4d, 0xb9, 0x46, 0x56, 0x51, 0x8f, 0xa9, 0xc5, 0xb9, 0xd0, 0x66, 0x6b, 0x83, 0x9c, 0x3b, 0x5b, 0xaf, 0x86, 0x63, 0xa8, 0xc6, 0xf9, 0x86, 0xaf, 0xa6, 0x9d, 0x20, 0x74, 0x95, - 0xb7, 0x65, 0x70, 0xc4, 0x4c, 0xa8, 0x9d, 0xea, 0x4f, 0x67, 0xc2, 0x24, 0xaa, 0xf6, 0xfa, 0x6e, 0xd6, 0x72, 0x1a, 0xbb, 0xe1, 0xf8, 0x40, 0x07, 0x48, 0x16, 0x6c, 0xc7, 0xeb, 0x75, 0xe8, 0x85, - 0xfb, 0x83, 0xbf, 0x15, 0xfb, 0xa9, 0x85, 0x69, 0xf5, 0x3a, 0x7a, 0x7f, 0xae, 0x9e, 0x3d, 0xb4, 0x05, 0xbe, 0x4f, 0x3c, 0xbb, 0xba, 0x3f, 0xaa, 0x81, 0x93, 0x27, 0x77, 0x7b, 0x11, 0xce, 0x77, - 0xff, 0x89, 0x1c, 0xb4, 0xbb, 0xcc, 0xcb, 0xc7, 0x93, 0x14, 0x7a, 0xc1, 0x9f, 0xe0, 0xe9, 0x2b, 0xd9, 0xeb, 0x66, 0x8f, 0xcb, 0xc5, 0x39, 0xd9, 0x05, 0xff, 0x9e, 0xbb, 0x99, 0x10, 0x49, 0x41, - 0x6a, 0xd3, 0x75, 0x0a, 0x5b, 0xe8, 0xbc, 0xca, 0x96, 0x63, 0x9f, 0x00, 0xe5, 0xa5, 0xaf, 0x3b, 0xf1, 0x71, 0x8d, 0xb7, 0xd4, 0x12, 0x56, 0xf4, 0xce, 0x1d, 0xa7, 0x5c, 0xa9, 0xcf, 0xb1, 0xf0, - 0x00, 0x04, 0x1a, 0xb8, 0x87, 0x8d, 0xb1, 0x93, 0x91, 0x1d, 0x15, 0xcc, 0x6b, 0x39, 0x62, 0xe8, 0xd2, 0x1c, 0x07, 0x46, 0x6d, 0x5b, 0x39, 0x2a, 0xee, 0x96, 0x29, 0xb8, 0x86, 0xe5, 0xef, 0x2c, - 0xe2, 0xcf, 0x19, 0x7e, 0xeb, 0xec, 0x79, 0xe0, 0x65, 0xf6, 0xaa, 0xc1, 0xd9, 0xb9, 0x51, 0x7b, 0xa5, 0x55, 0x9f, 0xb9, 0xd3, 0xdb, 0xfd, 0x71, 0xef, 0x87, 0xaa, 0x06, 0x56, 0x19, 0x34, 0xe9, - 0xab, 0xf1, 0xf6, 0x27, 0xfc, 0x7e, 0x53, 0x56, 0x54, 0x0d, 0x5c, 0xab, 0xf6, 0x06, 0xb9, 0x1d, 0x7b, 0x4e, 0xfd, 0xeb, 0xb7, 0x13, 0xe5, 0xfe, 0x99, 0xd2, 0x0b, 0xbc, 0xc3, 0xe3, 0x9f, 0x11, - 0x55, 0xe7, 0xdc, 0x86, 0x5f, 0xaf, 0xe9, 0x72, 0xf8, 0xed, 0xcd, 0x0b, 0xd9, 0x41, 0x54, 0xbd, 0xfd, 0x2f, 0xf6, 0xe0, 0xf6, 0xd6, 0x3b, 0x56, 0x8f, 0x89, 0x5f, 0x1e, 0x78, 0xb1, 0xaa, 0x2a, - 0x0a, 0xce, 0x83, 0xe7, 0x4f, 0xec, 0xbd, 0xfd, 0x7d, 0xfe, 0x69, 0xc5, 0x4b, 0x51, 0xe6, 0x75, 0x5e, 0x1f, 0x0b, 0xef, 0xc5, 0x4f, 0xac, 0xe0, 0xb7, 0x5f, 0xee, 0x0e, 0xd7, 0x2a, 0x72, 0xbd, - 0x81, 0x13, 0x5a, 0x59, 0xe6, 0x25, 0x6f, 0xdf, 0x8a, 0xde, 0x3e, 0xb1, 0x0f, 0x23, 0x27, 0x1c, 0xd8, 0xf9, 0xc1, 0x73, 0x07, 0x45, 0x19, 0xa5, 0x51, 0x1d, 0xb5, 0xde, 0x63, 0x70, 0x2f, 0x8f, - 0x3a, 0x79, 0x92, 0x78, 0x67, 0x4f, 0xd5, 0x57, 0x4f, 0xdd, 0x24, 0x81, 0xbc, 0x7d, 0xe8, 0xdf, 0xe1, 0xa8, 0xba, 0x99, 0x45, 0x77, 0xfd, 0xbf, 0x99, 0xf8, 0xd7, 0xcd, 0xd8, 0x2b, 0x4d, 0x70, - 0xf0, 0xda, 0xea, 0x3b, 0x57, 0x0f, 0x5c, 0x1c, 0x32, 0x25, 0xea, 0xac, 0x47, 0x0b, 0x68, 0xd4, 0xb9, 0xea, 0x5c, 0x16, 0x74, 0x33, 0xab, 0x45, 0xf5, 0x00, 0xa6, 0xfb, 0x95, 0x8c, 0x4b, 0x7b, - 0x8c, 0x26, 0x13, 0x61, 0x3e, 0x84, 0x74, 0x96, 0xe6, 0x89, 0x99, 0x2c, 0x80, 0x9e, 0xc0, 0xac, 0x9b, 0x1c, 0x6a, 0xc3, 0x1d, 0x6f, 0xaa, 0x80, 0xca, 0xe0, 0xf3, 0x3c, 0x77, 0xf7, 0x63, 0x9a, - 0xce, 0x4d, 0xd1, 0x45, 0xa7, 0x1e, 0xbd, 0x78, 0x62, 0x49, 0xf5, 0xa3, 0xcc, 0x1b, 0x14, 0x65, 0x5e, 0x78, 0x65, 0x1d, 0x7d, 0x11, 0x4f, 0x84, 0x9f, 0x70, 0xee, 0x7d, 0xa0, 0x7e, 0x96, 0x6a, - 0xef, 0xfa, 0xce, 0xcb, 0x6e, 0x0f, 0x77, 0x1f, 0xba, 0xda, 0xf9, 0xc6, 0x22, 0x46, 0x92, 0x65, 0xe7, 0xae, 0x64, 0x9f, 0x32, 0x67, 0xe6, 0x04, 0xdc, 0x00, 0x66, 0x73, 0x04, 0x46, 0x01, 0x43, - 0xf8, 0x30, 0x81, 0x79, 0xd4, 0x02, 0xd9, 0x93, 0x6e, 0x90, 0x15, 0x0b, 0xba, 0x1c, 0x31, 0x5e, 0xc9, 0x1a, 0xc5, 0x0a, 0x23, 0x66, 0x86, 0xe1, 0xc4, 0xd9, 0xd6, 0x15, 0xd6, 0xab, 0x58, 0xd8, - 0x0e, 0x69, 0x62, 0x33, 0x1d, 0x51, 0x00, 0x2a, 0x2f, 0x12, 0xbd, 0xe7, 0xd2, 0xf5, 0x71, 0x0a, 0x43, 0x2f, 0xf0, 0xcf, 0x57, 0xb1, 0xbb, 0x84, 0xa3, 0xef, 0x98, 0xf2, 0x95, 0x8b, 0xfc, 0x19, - 0x4d, 0xe7, 0x4c, 0xf3, 0x8d, 0x01, 0x6e, 0x9f, 0x44, 0x38, 0x78, 0x70, 0x34, 0x10, 0xbb, 0x6b, 0x5d, 0xcd, 0x1d, 0x45, 0xfc, 0x44, 0x4c, 0x8a, 0xa9, 0xc4, 0x9a, 0x18, 0x5e, 0xf9, 0x45, 0xb1, - 0xfa, 0xf1, 0x48, 0x7b, 0x67, 0xff, 0xff, 0x95, 0xdf, 0x76, 0x4b, 0xfa, 0xfc, 0x89, 0xb7, 0x1d, 0x7d, 0xbe, 0xf4, 0x34, 0xc0, 0xcc, 0xa3, 0xcc, 0x90, 0x6b, 0x7f, 0x08, 0x5b, 0xcb, 0x11, 0x24, - 0x1d, 0x96, 0xd8, 0x82, 0x2d, 0x17, 0xdc, 0x48, 0x4f, 0xc8, 0x89, 0x5b, 0xc1, 0x0c, 0x9d, 0x4e, 0x5c, 0x27, 0xdf, 0x58, 0x7b, 0x3d, 0x5b, 0x32, 0xa4, 0xcc, 0x84, 0xc5, 0x3a, 0xa8, 0x9b, 0xd9, - 0x0c, 0xb1, 0xe8, 0x6d, 0x40, 0x5a, 0xa4, 0x28, 0x63, 0x70, 0x7c, 0x10, 0x64, 0x13, 0x26, 0x0b, 0x6c, 0xe3, 0xb2, 0xd9, 0x8a, 0xdb, 0xa2, 0xab, 0x4f, 0x92, 0x22, 0xfb, 0x8e, 0x98, 0x4b, 0x66, - 0x68, 0x9f, 0x21, 0xd3, 0x59, 0x49, 0xf0, 0x59, 0x56, 0xd9, 0x73, 0x69, 0x7f, 0x57, 0x9a, 0x67, 0x3c, 0xcf, 0xad, 0xbe, 0x89, 0x7d, 0xa5, 0x2e, 0x0b, 0x90, 0xed, 0x03, 0x78, 0x06, 0x89, 0x79, - 0x56, 0xd9, 0x80, 0xbc, 0xd9, 0xf8, 0x6b, 0x7f, 0x56, 0x45, 0x29, 0x8f, 0x71, 0x93, 0x3a, 0xcd, 0x66, 0x85, 0xc0, 0x19, 0x94, 0x08, 0xab, 0xe3, 0x6e, 0x91, 0x88, 0x25, 0xb3, 0xf2, 0xdd, 0xdc, - 0x2e, 0xa9, 0x6c, 0xce, 0xf3, 0x95, 0x14, 0x68, 0xe3, 0xe3, 0x4a, 0xda, 0x79, 0xf2, 0x48, 0xec, 0x52, 0x4d, 0x5d, 0xed, 0xc8, 0xae, 0xdd, 0x44, 0xcf, 0x7b, 0x9e, 0xae, 0x69, 0xc8, 0xaf, 0x3b, - 0x7b, 0x6f, 0x97, 0xad, 0xd2, 0x2a, 0x8a, 0xf3, 0x2f, 0xef, 0x13, 0xbb, 0x72, 0xf3, 0x3a, 0x0a, 0xb2, 0xbc, 0xfc, 0xdc, 0x98, 0x7d, 0x66, 0xe3, 0xc1, 0x1b, 0xd5, 0x13, 0xce, 0xaf, 0xed, 0x01, - 0xd4, 0x6f, 0xeb, 0x81, 0xca, 0xb2, 0xac, 0xe6, 0xcb, 0x56, 0xd3, 0x54, 0xd6, 0x66, 0x3e, 0x06, 0x28, 0x3f, 0xd8, 0x00, 0xeb, 0x4d, 0x3b, 0xd2, 0xb7, 0x63, 0x25, 0xdd, 0xb4, 0x64, 0xb5, 0x25, - 0xb2, 0x3c, 0x66, 0x4c, 0xb3, 0x6d, 0x78, 0x75, 0xcd, 0xaa, 0x47, 0xc8, 0xdc, 0x62, 0x6a, 0xc1, 0x89, 0x0c, 0x31, 0x61, 0x62, 0x19, 0x8a, 0x8b, 0xd1, 0xde, 0xa1, 0xc7, 0x2d, 0x87, 0x79, 0xb9, - 0xdf, 0x1e, 0xbb, 0x91, 0x23, 0x31, 0xcf, 0x2b, 0x7c, 0x69, 0x94, 0x45, 0xbf, 0xd3, 0x0a, 0xd0, 0xc7, 0xdb, 0x0a, 0xec, 0x28, 0xbb, 0xff, 0xaf, 0xcb, 0x27, 0x9f, 0x71, 0xb2, 0xa3, 0x0c, 0x7c, - 0xbd, 0xfc, 0x9e, 0x21, 0x5e, 0x35, 0x78, 0xdd, 0xb0, 0xf6, 0xf9, 0xb2, 0x45, 0x3d, 0x21, 0x50, 0x6e, 0x08, 0x83, 0x83, 0xdb, 0xab, 0xc1, 0x85, 0xe0, 0xf7, 0x8c, 0x59, 0xce, 0xbb, 0x05, 0xb9, - 0x2a, 0x45, 0x8b, 0x52, 0x64, 0x28, 0xb6, 0x90, 0x3d, 0x6a, 0xac, 0x97, 0x9d, 0x1a, 0xcc, 0xc7, 0xac, 0xe0, 0x0a, 0xfc, 0x06, 0x3e, 0x6e, 0x5a, 0xaf, 0x8b, 0xd7, 0x99, 0x4c, 0x0d, 0x19, 0x60, - 0x23, 0x41, 0x14, 0x20, 0x77, 0x35, 0x92, 0x76, 0xa8, 0x31, 0x42, 0x18, 0x67, 0x0b, 0x02, 0x7b, 0xbc, 0xf6, 0x67, 0x3b, 0x50, 0xca, 0x55, 0x7a, 0xba, 0x9b, 0xcf, 0xd9, 0x15, 0x72, 0xec, 0x99, - 0x5c, 0xf9, 0x51, 0xed, 0xbe, 0x53, 0x25, 0xbd, 0x6a, 0x50, 0xe7, 0x1f, 0xd4, 0x3e, 0xe4, 0xdd, 0x8e, 0xf8, 0xe7, 0x02, 0x93, 0xef, 0x1e, 0x09, 0xad, 0xdf, 0xcb, 0x25, 0xfa, 0xee, 0xc6, 0xa0, - 0x3a, 0xa6, 0x76, 0x9e, 0x54, 0x8f, 0x7f, 0x64, 0x54, 0x0d, 0x4e, 0x9f, 0x61, 0xd9, 0xc9, 0xef, 0x1f, 0x88, 0xbe, 0x7b, 0x20, 0xf3, 0x02, 0xeb, 0xf4, 0x05, 0x83, 0xce, 0x2b, 0xf3, 0xb7, 0x09, - 0xfe, 0xde, 0x34, 0xb8, 0x57, 0xea, 0xdf, 0xbf, 0xe4, 0x66, 0xab, 0x1b, 0xfc, 0x99, 0x5a, 0x9f, 0x55, 0xc5, 0x6f, 0xab, 0x61, 0x78, 0x2f, 0x41, 0xfe, 0x0a, 0xdd, 0xfe, 0xf2, 0x1b, 0x6e, 0x74, - 0xfb, 0xba, 0x8c, 0x52, 0xef, 0x86, 0x7d, 0xd8, 0xb7, 0x4f, 0x57, 0xb5, 0x55, 0xd6, 0x8f, 0x9f, 0x6f, 0x32, 0x3b, 0x3f, 0x3c, 0xd0, 0xf2, 0x9f, 0x72, 0xbc, 0xff, 0x1d, 0xe9, 0xd2, 0x1f, 0xcd, - 0xc4, 0xcf, 0x14, 0xd4, 0x9f, 0x0b, 0xdf, 0x77, 0xb4, 0x2f, 0x93, 0xfd, 0xb6, 0xe7, 0xac, 0x9c, 0xf6, 0x10, 0xc4, 0x00, 0xa3, 0xf0, 0x14, 0x6b, 0xec, 0xed, 0xd5, 0x78, 0x6f, 0x1f, 0xf7, 0x71, - 0x94, 0xee, 0xcd, 0x15, 0x57, 0x50, 0x74, 0x63, 0xe8, 0xbc, 0x8c, 0xcc, 0xcd, 0xa9, 0x96, 0x47, 0x08, 0x9d, 0x08, 0xbc, 0x8c, 0x7a, 0x76, 0x36, 0x9b, 0x0d, 0xf7, 0xe0, 0x7a, 0x59, 0xac, 0xcd, - 0x9a, 0x26, 0x69, 0xc8, 0x58, 0x5a, 0x1b, 0x66, 0x0f, 0xf0, 0xe4, 0x62, 0x3a, 0xf6, 0xf2, 0xd9, 0x86, 0xe4, 0x85, 0x76, 0x45, 0x86, 0xdf, 0xe9, 0x0e, 0x4f, 0x8b, 0x80, 0xc7, 0x53, 0x17, 0xfa, - 0x6e, 0x86, 0x7e, 0x67, 0x75, 0x7f, 0x8c, 0x07, 0xa7, 0x37, 0x2b, 0xef, 0x87, 0xa9, 0xe7, 0xd5, 0x9f, 0xdf, 0xfb, 0x62, 0x5a, 0x7e, 0x34, 0xc5, 0xff, 0xf6, 0x31, 0xf9, 0x7f, 0xcc, 0xcc, 0x6f, - 0x94, 0xff, 0x8f, 0x6b, 0xce, 0xe3, 0x39, 0xfc, 0xcc, 0xe6, 0x87, 0x77, 0xb4, 0x2f, 0x73, 0xf8, 0xb6, 0x67, 0x00, 0xf7, 0xdb, 0x10, 0x21, 0x8e, 0xf9, 0x24, 0x09, 0xcc, 0x79, 0x6d, 0xa9, 0xf9, - 0x30, 0x8d, 0x8c, 0x91, 0xb3, 0x1c, 0x87, 0x8a, 0x6a, 0x71, 0xeb, 0x78, 0x3e, 0x45, 0x05, 0xa3, 0x82, 0x37, 0x91, 0xcb, 0x90, 0xf4, 0x3e, 0x9a, 0xc4, 0xf0, 0xd6, 0x38, 0x2c, 0x3c, 0x51, 0x71, - 0xea, 0x25, 0xed, 0x75, 0x34, 0xcf, 0xe1, 0xe6, 0x42, 0xe2, 0xa0, 0x00, 0x99, 0x05, 0x42, 0x46, 0x2c, 0xf6, 0x23, 0x6c, 0xa6, 0x50, 0x91, 0x54, 0xb4, 0x3d, 0x43, 0xe6, 0x1f, 0xd7, 0x3b, 0xb8, - 0x97, 0x0b, 0xeb, 0xfd, 0x94, 0xbc, 0x4c, 0xd9, 0x9b, 0x59, 0xff, 0x61, 0x6e, 0xfc, 0x6f, 0x2a, 0xe4, 0x1f, 0x94, 0x56, 0x78, 0x34, 0x44, 0xf0, 0xa7, 0x02, 0x69, 0x1f, 0xa8, 0x9f, 0x06, 0xc9, - 0xfb, 0xbe, 0x01, 0xde, 0x2f, 0xac, 0x16, 0x81, 0x88, 0x6e, 0x67, 0x72, 0x07, 0x36, 0x07, 0x69, 0xac, 0x12, 0xc0, 0xda, 0xdd, 0xcc, 0x83, 0x85, 0xc6, 0x28, 0x2b, 0x0c, 0x21, 0x81, 0xd5, 0xce, - 0xb0, 0xb7, 0x62, 0xc7, 0xa0, 0x08, 0xcc, 0x34, 0x63, 0x71, 0xae, 0xee, 0xf8, 0x66, 0xbe, 0x98, 0xd1, 0xd0, 0x6c, 0x85, 0x00, 0x1a, 0x72, 0xa8, 0x0d, 0xce, 0x5d, 0xf0, 0xa9, 0x89, 0xb9, 0x12, - 0xe1, 0x4f, 0x0e, 0x95, 0x8b, 0xc9, 0xfa, 0x12, 0xd0, 0x7e, 0xb2, 0x33, 0xac, 0x4f, 0x0c, 0xe9, 0xcb, 0x94, 0x14, 0xf4, 0xa9, 0xb8, 0xed, 0x5b, 0x36, 0xca, 0x35, 0x11, 0x05, 0xed, 0x17, 0xa1, - 0x4d, 0xc5, 0x3d, 0x80, 0xf8, 0x5b, 0xd1, 0xa6, 0x97, 0x9d, 0x48, 0x6e, 0xa0, 0x95, 0x01, 0xcd, 0x76, 0x6e, 0xa6, 0xaf, 0x79, 0x4f, 0xa9, 0x05, 0xac, 0x84, 0x92, 0xf5, 0xb0, 0x23, 0x69, 0xda, - 0xda, 0x8f, 0xf5, 0x60, 0xe7, 0x59, 0xa4, 0xcd, 0x44, 0x11, 0x02, 0xd1, 0x46, 0x39, 0x1b, 0x95, 0x53, 0x17, 0xe4, 0x0e, 0xd0, 0x0a, 0xe1, 0x9d, 0x8e, 0x90, 0x61, 0x18, 0x1e, 0x5b, 0xd3, 0xad, - 0xea, 0xd8, 0xd0, 0x4f, 0xe0, 0x82, 0x5e, 0xa8, 0x97, 0x43, 0x0f, 0xc8, 0x3e, 0x96, 0x07, 0xfb, 0x4c, 0xcf, 0xf8, 0x39, 0x76, 0xef, 0x68, 0x9f, 0xeb, 0xef, 0xdc, 0xf5, 0xf4, 0x89, 0x3d, 0x9d, - 0xd0, 0x9c, 0x04, 0x95, 0x31, 0x91, 0xa7, 0x34, 0xc7, 0x2d, 0xc2, 0x4d, 0x92, 0x69, 0x53, 0x0e, 0xce, 0xed, 0x16, 0xdb, 0xf1, 0x96, 0x8e, 0xad, 0xa6, 0xd1, 0x64, 0x23, 0xcd, 0x62, 0x5b, 0x36, - 0x52, 0xbc, 0x1a, 0x55, 0x80, 0x14, 0xda, 0x66, 0x97, 0x2a, 0x7b, 0x65, 0x8f, 0x17, 0xab, 0x72, 0xbd, 0x2b, 0x83, 0x3a, 0xcb, 0x16, 0x30, 0x2e, 0x90, 0x54, 0x4b, 0x49, 0x84, 0x3a, 0xef, 0x94, - 0x74, 0xe4, 0x2f, 0xde, 0x7b, 0xf8, 0x3f, 0x55, 0x2a, 0xee, 0x72, 0x9d, 0x7e, 0xfd, 0x49, 0xbc, 0x57, 0x35, 0x6f, 0x53, 0x2e, 0x7e, 0xfd, 0xf9, 0x2e, 0xc1, 0xe2, 0x4c, 0xfa, 0x75, 0x43, 0xfa, - 0x07, 0x5d, 0xe1, 0x5a, 0xb5, 0xe8, 0xd7, 0x55, 0x41, 0xc6, 0xef, 0xef, 0xc6, 0xd5, 0xe0, 0x68, 0xa5, 0xc9, 0xeb, 0xdd, 0xfb, 0x9b, 0x27, 0x26, 0x0e, 0xf2, 0x6a, 0xd0, 0xd4, 0x51, 0xf2, 0xdb, - 0x23, 0x4e, 0xde, 0x3e, 0x92, 0xb7, 0x5e, 0x99, 0xe4, 0x96, 0x3b, 0x38, 0x69, 0xcd, 0x77, 0x7e, 0xec, 0x77, 0x56, 0x45, 0x51, 0xe6, 0xe9, 0xc0, 0x49, 0xa2, 0x6b, 0x1e, 0xdc, 0x9f, 0x30, 0xf6, - 0x5e, 0x9f, 0xdf, 0xbd, 0x7e, 0x3b, 0x0c, 0x3f, 0x4a, 0xe2, 0xfe, 0x60, 0xdc, 0x3e, 0x28, 0x3a, 0x77, 0x32, 0x72, 0x9d, 0x24, 0x7a, 0x89, 0xab, 0x1f, 0x4a, 0xe7, 0x3f, 0x61, 0xea, 0x8f, 0xff, - 0xf1, 0x3f, 0xfe, 0xf8, 0x13, 0x26, 0x2e, 0x7f, 0xfa, 0xf8, 0x12, 0xcf, 0x75, 0x42, 0x9c, 0x3c, 0xab, 0xcf, 0xd2, 0xee, 0x58, 0x78, 0x83, 0xaf, 0x76, 0xa5, 0x3f, 0xe7, 0x7f, 0xfb, 0xe4, 0x1d, - 0xaf, 0x55, 0xa6, 0x3e, 0xde, 0xe9, 0xeb, 0x91, 0xd3, 0x6d, 0x07, 0xd3, 0x9d, 0x63, 0xa5, 0xea, 0x4e, 0x25, 0xe0, 0x16, 0xa7, 0xaa, 0xe4, 0x7a, 0x87, 0xf2, 0xfb, 0x96, 0xdb, 0x0d, 0xc9, 0x31, - 0xa0, 0x65, 0xf6, 0xd6, 0x9b, 0x79, 0x7e, 0xe1, 0x19, 0x4b, 0x1d, 0x28, 0x8f, 0xdd, 0x74, 0x9e, 0xa8, 0x04, 0x2f, 0xd7, 0xd3, 0x79, 0x58, 0x11, 0x7c, 0x02, 0x2d, 0xb7, 0x2a, 0x5b, 0x38, 0x0b, - 0x60, 0xbf, 0x84, 0xe6, 0x7b, 0x7f, 0x05, 0x4c, 0xc7, 0x2a, 0x3e, 0xfb, 0xba, 0xac, 0xcc, 0xb5, 0xae, 0x8a, 0x73, 0x1a, 0x54, 0x4d, 0x19, 0x0d, 0xde, 0x32, 0x53, 0xbe, 0x40, 0xec, 0xe7, 0x0b, - 0xd2, 0xa7, 0x6f, 0x79, 0xc5, 0xec, 0xd1, 0xbd, 0x33, 0x6a, 0x3d, 0x16, 0x28, 0x6d, 0x11, 0x2c, 0xb4, 0x00, 0xf7, 0xd4, 0x43, 0x2b, 0x99, 0xec, 0x5e, 0xa3, 0xa6, 0xad, 0x6f, 0x5b, 0x1c, 0x49, - 0xeb, 0x72, 0x88, 0x38, 0x4b, 0x00, 0x8d, 0x71, 0x7f, 0xc5, 0x76, 0xea, 0x6a, 0x7c, 0xd0, 0x46, 0x73, 0xd4, 0xdd, 0xa0, 0x16, 0xa9, 0x75, 0xd4, 0x11, 0xf1, 0xc1, 0x46, 0x84, 0x3c, 0x74, 0x44, - 0x68, 0x69, 0xee, 0x32, 0x68, 0x2e, 0xe3, 0x58, 0xac, 0x88, 0x43, 0x6e, 0xa3, 0xcc, 0x66, 0x41, 0x1f, 0xd4, 0xbe, 0x89, 0x89, 0xa2, 0x4f, 0x05, 0x11, 0xde, 0xd1, 0xfe, 0x8d, 0xd0, 0x5b, 0x74, - 0x14, 0xed, 0x17, 0x40, 0xf0, 0xd1, 0x9d, 0x38, 0xcc, 0xc5, 0xe3, 0x30, 0x46, 0xe8, 0x70, 0xe4, 0x81, 0xdc, 0x70, 0x33, 0x1e, 0xc2, 0xfb, 0x65, 0xba, 0x18, 0x8d, 0xc7, 0x2a, 0x18, 0x30, 0x7c, - 0xb6, 0x58, 0xd3, 0x06, 0x8b, 0x87, 0xd5, 0x9e, 0x27, 0x47, 0xcb, 0x45, 0x0c, 0x0d, 0x39, 0x07, 0xe7, 0x8c, 0x75, 0x37, 0x74, 0xd8, 0x19, 0x00, 0x1c, 0x92, 0x82, 0x19, 0xcf, 0x02, 0xc6, 0x8a, - 0xea, 0x4d, 0x05, 0xa1, 0xb4, 0x22, 0x51, 0xd8, 0xd7, 0x15, 0x10, 0x1e, 0x57, 0x29, 0x7b, 0xac, 0xd8, 0x90, 0xcf, 0xce, 0xbc, 0x7b, 0xfa, 0x9f, 0xd4, 0x76, 0x3b, 0xd3, 0xff, 0x1e, 0xa3, 0x6a, - 0xb4, 0x11, 0x94, 0x20, 0xa3, 0xcd, 0xca, 0x5b, 0x36, 0xb0, 0x18, 0xc4, 0x44, 0xa2, 0xda, 0x22, 0xc4, 0xf9, 0xf1, 0x34, 0x34, 0x35, 0x9d, 0x4e, 0x0b, 0x13, 0xa7, 0x2d, 0x99, 0xdd, 0x1e, 0x97, - 0x21, 0x1e, 0xd0, 0xfa, 0x28, 0xb0, 0xc0, 0x46, 0x98, 0xc7, 0xa2, 0xc0, 0x15, 0xcc, 0x34, 0x1e, 0x0f, 0x2d, 0x57, 0x9b, 0x15, 0x2e, 0xef, 0x8c, 0x97, 0x32, 0xa3, 0x04, 0xa5, 0x49, 0x56, 0x59, - 0xde, 0x33, 0xc8, 0xf2, 0xb0, 0xa0, 0xe2, 0xaf, 0x8f, 0x71, 0xe3, 0x9b, 0xf4, 0xd2, 0x8f, 0x77, 0x7a, 0x14, 0x7a, 0x7c, 0x50, 0x35, 0x09, 0xfd, 0xf0, 0xd0, 0xef, 0x6a, 0x90, 0xef, 0x96, 0x9b, - 0xd2, 0x77, 0x9d, 0xb7, 0xc5, 0xa3, 0x8f, 0x6b, 0xfe, 0x4c, 0x6e, 0xd7, 0x78, 0xe5, 0xf1, 0xcd, 0xaa, 0xfd, 0x4c, 0xb1, 0x78, 0x52, 0x90, 0xdc, 0x10, 0x7f, 0xe5, 0xfe, 0x4d, 0x57, 0xdf, 0x3a, - 0x74, 0x3b, 0x09, 0x29, 0x01, 0x0f, 0xe5, 0xda, 0x70, 0x32, 0x4d, 0x0b, 0x97, 0x5b, 0xb5, 0x20, 0xa8, 0x52, 0xd3, 0x6c, 0x9a, 0x64, 0x46, 0x6c, 0x8d, 0x09, 0x71, 0xc1, 0x34, 0x96, 0x4e, 0x2f, - 0x99, 0xed, 0x1e, 0xd9, 0xb6, 0x1c, 0x4f, 0x69, 0x4c, 0x7c, 0xe0, 0x00, 0x1f, 0x2c, 0x39, 0x56, 0xc2, 0x56, 0x1e, 0x56, 0x64, 0x5b, 0xaa, 0x18, 0xce, 0xe9, 0xad, 0xb4, 0x56, 0x62, 0x83, 0xa3, - 0x17, 0x52, 0x86, 0xf4, 0x64, 0xfd, 0x57, 0x52, 0xf7, 0xd5, 0xd0, 0xe9, 0x89, 0x74, 0xe9, 0xb9, 0x9f, 0xfb, 0x83, 0x9f, 0xab, 0x0d, 0x74, 0x43, 0xf7, 0x15, 0xdf, 0xcb, 0x55, 0xdf, 0x0a, 0x41, - 0x00, 0xe4, 0xa5, 0xc0, 0xec, 0x68, 0x0d, 0xfd, 0x05, 0xeb, 0x4f, 0x44, 0xd6, 0x71, 0x09, 0xc4, 0x68, 0x89, 0x3c, 0x8b, 0x47, 0x69, 0x1a, 0x6e, 0xe0, 0x26, 0xa4, 0x08, 0x7d, 0xe3, 0xf3, 0x2a, - 0xb5, 0xd9, 0xd3, 0x1e, 0xb1, 0xb5, 0xa6, 0xae, 0x38, 0xd6, 0x66, 0xc3, 0x0a, 0x02, 0xd7, 0x59, 0x13, 0x1c, 0xf0, 0x8d, 0x3b, 0xac, 0x5d, 0xdb, 0x24, 0x3d, 0x22, 0x98, 0x20, 0xb5, 0x34, 0x74, - 0x3b, 0xdd, 0xfd, 0x49, 0xe6, 0x59, 0x1f, 0x93, 0xe1, 0xfc, 0x5d, 0x95, 0xe5, 0x7b, 0xdf, 0xca, 0xaa, 0xe7, 0xea, 0x67, 0x3d, 0xa0, 0xff, 0x8a, 0xe6, 0x7d, 0x6f, 0xef, 0x7a, 0x5a, 0xc0, 0x62, - 0xee, 0x20, 0x6e, 0x3a, 0x5b, 0x26, 0x42, 0x91, 0x30, 0x20, 0x87, 0x2d, 0x86, 0xc9, 0x70, 0xe9, 0xd0, 0x1c, 0xed, 0x0b, 0xb5, 0x40, 0x8c, 0x0c, 0x0a, 0x6b, 0x36, 0x4b, 0x5d, 0x24, 0x26, 0xad, - 0xd3, 0x0d, 0x97, 0x4e, 0x80, 0xa2, 0x06, 0xd2, 0xc1, 0xb3, 0x8d, 0x9d, 0x28, 0xc4, 0xc1, 0x35, 0x70, 0x4c, 0xd0, 0x8d, 0x0d, 0x37, 0x69, 0x01, 0x48, 0x2b, 0x76, 0xd4, 0x2c, 0x27, 0xba, 0xed, - 0x8f, 0x4b, 0xbb, 0xdc, 0x48, 0x8b, 0xc7, 0x58, 0x3d, 0xb3, 0xc5, 0xf9, 0x95, 0xe8, 0x2b, 0x40, 0xa7, 0x39, 0xd1, 0x73, 0x43, 0xb3, 0x33, 0x6b, 0xaa, 0xc5, 0x68, 0x56, 0x83, 0x12, 0x98, 0xcf, - 0x88, 0x0e, 0x84, 0xb3, 0xa3, 0xef, 0x21, 0xd3, 0x96, 0x5d, 0x6c, 0x94, 0x3c, 0xdc, 0x48, 0x7e, 0xbb, 0xe5, 0xc3, 0xf6, 0x00, 0x65, 0xe3, 0x89, 0x06, 0x1c, 0x7c, 0x7c, 0x9d, 0x8f, 0xf5, 0x98, - 0xe6, 0x1c, 0xad, 0x18, 0xa2, 0x0d, 0xaf, 0x8e, 0x9c, 0xb0, 0x33, 0x9c, 0xaa, 0x15, 0x92, 0xd2, 0x2a, 0x68, 0x57, 0x87, 0x1b, 0x0d, 0x30, 0xd8, 0xef, 0x57, 0xff, 0xcf, 0x47, 0xcb, 0x3b, 0x75, - 0xfe, 0x27, 0x10, 0xfc, 0x1e, 0x22, 0xa7, 0x61, 0x71, 0x21, 0xf4, 0x3d, 0x02, 0x29, 0x38, 0xb6, 0xa4, 0x35, 0x95, 0xf9, 0x78, 0x73, 0x34, 0xdc, 0x92, 0xf1, 0x90, 0xdd, 0x6e, 0x07, 0x40, 0x1d, - 0x9a, 0xb3, 0xc7, 0x09, 0x40, 0x03, 0xc0, 0x2e, 0x59, 0x88, 0xf9, 0x72, 0xae, 0xcc, 0x30, 0x6d, 0x06, 0x65, 0xda, 0x62, 0xc8, 0x10, 0x12, 0x3a, 0x3d, 0xe8, 0x22, 0xba, 0xda, 0xec, 0x6b, 0x30, - 0x75, 0x87, 0x24, 0xc9, 0xae, 0x24, 0x6c, 0x8a, 0xa1, 0xc5, 0x64, 0x98, 0xef, 0x4a, 0x19, 0xe9, 0x7a, 0xda, 0x48, 0x9f, 0x95, 0x6b, 0x3e, 0x2d, 0x33, 0xef, 0x8c, 0x9a, 0x0f, 0x75, 0x72, 0x1f, - 0xd4, 0xe9, 0xea, 0x55, 0xcd, 0xf5, 0xd7, 0xbf, 0x5d, 0x8b, 0xf1, 0xdd, 0xaf, 0x85, 0x1f, 0x4b, 0x47, 0x3e, 0x08, 0x90, 0xbc, 0xd6, 0x22, 0x39, 0xad, 0xa6, 0xc8, 0x47, 0x93, 0xec, 0xb1, 0xe5, - 0xf0, 0x60, 0x4d, 0xf6, 0xa3, 0xcc, 0x1d, 0xa4, 0xc7, 0xc1, 0xfe, 0xea, 0x98, 0x25, 0xcf, 0xbb, 0x77, 0x6e, 0x1e, 0x48, 0xa2, 0x20, 0xac, 0x4f, 0x4f, 0x94, 0xde, 0xae, 0x79, 0x2d, 0x8f, 0x8d, - 0x9f, 0xcb, 0x78, 0xdc, 0x3c, 0x55, 0x44, 0xd9, 0xeb, 0xaf, 0x79, 0x87, 0xd6, 0x75, 0x63, 0xc8, 0x60, 0x6f, 0x95, 0xd9, 0xed, 0xd7, 0xbc, 0x7f, 0xe8, 0x70, 0x1c, 0x58, 0xae, 0x5b, 0xbe, 0xdd, - 0x27, 0x3f, 0x59, 0xbb, 0xdf, 0xe7, 0x4c, 0x79, 0x4e, 0x53, 0x7a, 0x17, 0x84, 0x7f, 0x7f, 0x26, 0xf2, 0xfe, 0x57, 0x54, 0x5e, 0xda, 0x5e, 0x01, 0x27, 0xdf, 0x1b, 0x99, 0x75, 0x94, 0x1d, 0x07, - 0x49, 0xd9, 0xfc, 0xba, 0x31, 0x7e, 0xaf, 0x77, 0xbf, 0x91, 0xba, 0xbb, 0xcf, 0x55, 0x82, 0x67, 0x67, 0xce, 0xee, 0x3a, 0x6f, 0x76, 0x03, 0xb8, 0xe7, 0xac, 0xd9, 0x8f, 0xca, 0xdc, 0x51, 0x91, - 0xe5, 0x58, 0xd7, 0x2d, 0x20, 0xd1, 0x46, 0x35, 0x25, 0xe5, 0x33, 0x89, 0xa1, 0x86, 0xd3, 0x88, 0xe2, 0x5d, 0x7a, 0xc4, 0x33, 0x16, 0xb8, 0x9d, 0x64, 0x47, 0xef, 0x18, 0xcb, 0xb8, 0x65, 0xf2, - 0x38, 0xc8, 0xae, 0xdb, 0x19, 0x5e, 0x4d, 0x66, 0x6b, 0x9a, 0xd9, 0x09, 0x60, 0x48, 0xad, 0x90, 0xa1, 0xca, 0x29, 0x9c, 0x6a, 0xe3, 0x68, 0xa5, 0x36, 0xf8, 0x2c, 0xdc, 0xb9, 0x3d, 0x67, 0x4d, - 0xe9, 0x35, 0xd5, 0xab, 0xf5, 0x0f, 0xbf, 0xf4, 0x4b, 0x92, 0xb9, 0xdb, 0x54, 0xfd, 0x08, 0x3d, 0xf2, 0x39, 0xcb, 0xec, 0x8d, 0xec, 0x09, 0xc1, 0xb7, 0x8b, 0x01, 0xd9, 0xcf, 0xf6, 0xda, 0xf1, - 0xf9, 0x70, 0x0a, 0xb8, 0x2b, 0x35, 0x1d, 0x23, 0x4b, 0xc7, 0xc6, 0x46, 0xf6, 0xa6, 0xcd, 0x16, 0xf3, 0x83, 0x22, 0xc4, 0xe3, 0x14, 0x90, 0xa4, 0xc2, 0xc3, 0x02, 0xa6, 0x61, 0xcb, 0x6e, 0xbb, - 0x24, 0xd3, 0xc9, 0x26, 0x01, 0xdd, 0xd8, 0x90, 0x1b, 0x84, 0x77, 0x45, 0x44, 0xb0, 0x50, 0x08, 0x59, 0x63, 0xf9, 0x6e, 0x2b, 0x07, 0xc3, 0xa8, 0x24, 0x62, 0x6b, 0xa9, 0xcd, 0x11, 0x55, 0xde, - 0x14, 0xcf, 0xc7, 0x81, 0xea, 0xfc, 0x12, 0xff, 0xbc, 0xd9, 0x7d, 0x8e, 0xff, 0x2f, 0xdb, 0x7d, 0x7e, 0x2f, 0x03, 0x1e, 0xb3, 0x84, 0x78, 0x66, 0x3c, 0xff, 0xa6, 0x7b, 0xe6, 0xc9, 0xdb, 0xd5, - 0xe0, 0x4c, 0xef, 0x7b, 0xa6, 0x70, 0xa4, 0xed, 0x95, 0x9a, 0xcb, 0xcd, 0x01, 0x7c, 0xbc, 0xde, 0x94, 0x58, 0x94, 0x2c, 0x35, 0xc1, 0x8a, 0xb0, 0x34, 0x21, 0x0d, 0x64, 0x47, 0x57, 0x87, 0x78, - 0x8f, 0x16, 0xbe, 0x37, 0x3a, 0x08, 0x51, 0x60, 0xa6, 0x16, 0xa3, 0x74, 0x53, 0x68, 0x1f, 0xcf, 0x97, 0xf1, 0x10, 0x3a, 0x48, 0xe3, 0x94, 0x75, 0x34, 0xc3, 0x39, 0xd6, 0x10, 0x0e, 0x1d, 0xd7, - 0x00, 0x8a, 0xf1, 0x26, 0x33, 0x4f, 0x61, 0xef, 0x67, 0x9a, 0x6d, 0x0f, 0x8b, 0xe3, 0xde, 0x44, 0x78, 0x20, 0x63, 0xcf, 0x5a, 0xd2, 0x99, 0x9d, 0xc8, 0x8d, 0xf8, 0xfb, 0x29, 0x27, 0xfb, 0x79, - 0x8d, 0xf2, 0x72, 0xe0, 0x59, 0x9f, 0x56, 0x4c, 0x82, 0x5e, 0xd0, 0x67, 0x0c, 0xf9, 0x2b, 0xd1, 0x13, 0x13, 0xaf, 0xcd, 0xc1, 0x99, 0xd2, 0xf7, 0x1c, 0x8c, 0x77, 0x86, 0xbf, 0x2c, 0xc8, 0x34, - 0x1f, 0xb6, 0xb3, 0xa3, 0xe8, 0x53, 0xc7, 0xad, 0x86, 0xb4, 0x24, 0x0d, 0x20, 0x6b, 0x4c, 0x8c, 0xbd, 0xb1, 0x37, 0xc3, 0x01, 0xa6, 0x1b, 0xea, 0xa5, 0x15, 0xf1, 0x70, 0x14, 0x64, 0x14, 0xbc, - 0x8f, 0x23, 0x8e, 0x9c, 0xda, 0xc3, 0x56, 0xe6, 0xb5, 0x56, 0xf4, 0xd7, 0x75, 0x2a, 0x5b, 0x18, 0x87, 0x48, 0xb9, 0xa8, 0x94, 0xa5, 0x1e, 0xb5, 0xae, 0x6a, 0xa6, 0xcf, 0xe7, 0xb9, 0x3c, 0x8a, - 0xd6, 0xa0, 0xfd, 0x60, 0xfd, 0x02, 0xd5, 0xe7, 0x22, 0x83, 0x57, 0x9a, 0x17, 0x50, 0xcf, 0x98, 0xf6, 0x88, 0x0c, 0xc2, 0x83, 0x31, 0x80, 0xd1, 0xea, 0x28, 0x6a, 0xaa, 0x94, 0x11, 0x73, 0x82, - 0x22, 0xf0, 0x24, 0x76, 0x69, 0xc5, 0xae, 0x58, 0x7c, 0xfb, 0xa5, 0xaa, 0x97, 0x97, 0xe9, 0xc0, 0xb5, 0xee, 0xf2, 0xec, 0xef, 0x95, 0xbd, 0xa7, 0x1c, 0x88, 0xaf, 0x54, 0x2f, 0x5f, 0x71, 0x69, - 0x0f, 0xb0, 0x7e, 0x4e, 0xc2, 0x89, 0x32, 0xd9, 0x26, 0x32, 0x1b, 0xe1, 0x35, 0x24, 0xae, 0xcc, 0x26, 0xd2, 0x73, 0x1a, 0x14, 0x89, 0xd6, 0xc9, 0x0e, 0xce, 0x52, 0x14, 0xf0, 0xd6, 0x6d, 0x02, - 0xb9, 0x68, 0xe8, 0x63, 0x44, 0xc8, 0x1b, 0x36, 0x42, 0x9c, 0x44, 0x10, 0x0a, 0xe0, 0x10, 0x4c, 0xc2, 0x66, 0x65, 0x71, 0x63, 0xa0, 0x63, 0x83, 0x0c, 0x85, 0x17, 0x2e, 0x82, 0xe2, 0x1a, 0x8a, - 0xfb, 0x24, 0x77, 0xdc, 0x6e, 0xad, 0xfd, 0xf3, 0x63, 0xe3, 0xa6, 0xd4, 0xe3, 0xaf, 0x3f, 0xef, 0x0b, 0x3b, 0x5e, 0x5c, 0xe4, 0xef, 0x76, 0x8e, 0x5e, 0x26, 0x3a, 0x75, 0xfb, 0x50, 0x1a, 0xa5, - 0x97, 0x8a, 0x7a, 0x37, 0x5e, 0x8c, 0x27, 0x22, 0x79, 0xbd, 0x8c, 0xbe, 0xbc, 0x4c, 0x23, 0xf7, 0x3a, 0x90, 0xff, 0x42, 0x5b, 0xef, 0x8d, 0xec, 0x95, 0xa3, 0x97, 0x8b, 0xbe, 0x96, 0x1d, 0x34, - 0x71, 0xe4, 0xe1, 0x7e, 0x3c, 0x9d, 0x74, 0xcb, 0xd6, 0x8f, 0xb6, 0x15, 0x99, 0xa7, 0x73, 0x40, 0x8e, 0x8c, 0x39, 0x1d, 0x31, 0x80, 0xd2, 0x2d, 0x30, 0xc1, 0xd9, 0xc3, 0x6a, 0xa2, 0xe6, 0x6c, - 0x16, 0xaa, 0x07, 0xc6, 0x59, 0x2d, 0xe2, 0x1a, 0x12, 0xc8, 0x03, 0xb5, 0x9f, 0xd8, 0x50, 0x43, 0xf0, 0x5c, 0x43, 0xad, 0xed, 0x21, 0xa5, 0xb1, 0x68, 0x76, 0xa8, 0x93, 0x29, 0x3e, 0x26, 0xed, - 0x56, 0x7d, 0x7e, 0x15, 0xfd, 0x9d, 0x5c, 0xf9, 0x20, 0xbf, 0x26, 0xf4, 0x0e, 0x79, 0xe4, 0x3e, 0x96, 0xd8, 0x79, 0xe6, 0xbc, 0x0a, 0x88, 0x77, 0xe3, 0xe0, 0x36, 0x8c, 0xf0, 0x40, 0x86, 0xf7, - 0x89, 0xb7, 0x6e, 0xf3, 0x81, 0x1f, 0x9d, 0xc3, 0xad, 0x75, 0x93, 0x65, 0xce, 0x36, 0x1f, 0xe7, 0xa5, 0x77, 0xde, 0x93, 0x1a, 0x55, 0xd5, 0xb9, 0xe8, 0x56, 0x2f, 0xf6, 0xef, 0xad, 0xd2, 0xfd, - 0x34, 0xd7, 0x18, 0x7a, 0xce, 0x7a, 0x7d, 0xa5, 0x7a, 0x61, 0xfe, 0xa5, 0x3d, 0x80, 0xfa, 0xd9, 0xaf, 0x76, 0x23, 0xb1, 0x90, 0x5f, 0x8c, 0x6a, 0x89, 0x93, 0x95, 0x31, 0x4f, 0xcb, 0x1e, 0x11, - 0x32, 0x08, 0x4e, 0xd5, 0x93, 0xc6, 0x9e, 0xe6, 0xd2, 0xd2, 0xc6, 0xcc, 0x35, 0x4d, 0xac, 0x0f, 0xab, 0x0d, 0xb7, 0xde, 0x23, 0x01, 0xef, 0xec, 0xb9, 0x7c, 0xb8, 0x3f, 0x5a, 0x76, 0xd2, 0xad, - 0x3a, 0x9e, 0xc6, 0xbb, 0xe1, 0x81, 0x1e, 0x2e, 0xe1, 0xc5, 0x3a, 0xde, 0x82, 0xeb, 0x9a, 0x58, 0x29, 0x43, 0xcb, 0xc8, 0x7f, 0xe2, 0x2b, 0xe9, 0xb9, 0x4b, 0xcf, 0xaf, 0x5e, 0x4a, 0xcf, 0x4a, - 0x8a, 0xaf, 0xb6, 0xa4, 0x3d, 0x25, 0x0b, 0x7f, 0xd3, 0x3d, 0xc1, 0xf7, 0xfb, 0xaa, 0x4f, 0xd0, 0x04, 0x1e, 0x4c, 0x45, 0xb9, 0x9e, 0xcb, 0xab, 0x4d, 0xbc, 0x28, 0x68, 0x04, 0xca, 0xb3, 0x90, - 0xaa, 0x46, 0xa2, 0x94, 0xaa, 0xc4, 0x96, 0xfa, 0xa9, 0x63, 0xa3, 0xfa, 0x32, 0x88, 0x7c, 0xa9, 0x90, 0xf0, 0xf3, 0xaf, 0x7b, 0x0b, 0x23, 0xbf, 0x36, 0x07, 0x67, 0x4a, 0xdf, 0x0f, 0x8c, 0x43, - 0xb4, 0x5b, 0x89, 0x12, 0x76, 0xa0, 0x3d, 0x4e, 0x69, 0x46, 0xc3, 0x46, 0x4b, 0x01, 0x7f, 0x2a, 0x39, 0x33, 0x3e, 0x58, 0x8c, 0x56, 0x11, 0x3f, 0x12, 0x00, 0x4f, 0x8f, 0x8e, 0x0a, 0x19, 0x57, - 0xc1, 0x66, 0xbc, 0x83, 0xed, 0xed, 0xe6, 0x18, 0xd4, 0x10, 0x94, 0xd3, 0x72, 0xbe, 0x1f, 0x91, 0x13, 0xb7, 0x2e, 0x78, 0xce, 0xb2, 0x84, 0x60, 0x51, 0x53, 0x30, 0x22, 0x0c, 0x2d, 0x1b, 0x60, - 0x98, 0x6f, 0x2b, 0xb5, 0x85, 0x56, 0x35, 0xcb, 0xaa, 0xda, 0x4a, 0x12, 0xd9, 0x29, 0xa3, 0xa2, 0x7e, 0x7f, 0xff, 0xdd, 0x16, 0xb2, 0xdf, 0xfd, 0xd5, 0x5d, 0x85, 0x90, 0x5f, 0xae, 0x55, 0xee, - 0x7f, 0x57, 0xaf, 0xff, 0xef, 0xfd, 0xc6, 0xe2, 0x9f, 0xd4, 0x0b, 0x4c, 0xbc, 0x40, 0x97, 0x60, 0x1f, 0xf4, 0x72, 0x6d, 0xfe, 0xc7, 0xbf, 0xc3, 0x70, 0x5f, 0xe3, 0xf2, 0x5d, 0x16, 0xe7, 0x5f, - 0xe8, 0x77, 0xbe, 0xa5, 0x7c, 0x62, 0xe6, 0xed, 0x75, 0x5f, 0x8f, 0xf3, 0x71, 0x96, 0xb7, 0x74, 0xb7, 0xd2, 0xb1, 0x61, 0x35, 0xa5, 0x8c, 0x04, 0xa7, 0x7c, 0x79, 0xac, 0xcd, 0xf1, 0xaa, 0x95, - 0x97, 0x8d, 0x15, 0xd9, 0xc2, 0x41, 0x17, 0xe7, 0xd3, 0x65, 0x3a, 0xe2, 0x6d, 0xa5, 0x19, 0x97, 0xd0, 0xca, 0x87, 0x17, 0x91, 0x90, 0x17, 0xec, 0x6a, 0xb8, 0x8e, 0xa6, 0x71, 0x64, 0x8c, 0xc6, - 0xb6, 0x6f, 0x59, 0xc8, 0x34, 0x24, 0xec, 0xd2, 0x13, 0x09, 0x7a, 0xbd, 0x51, 0x66, 0xd0, 0xd7, 0xe1, 0xbd, 0xf7, 0x99, 0x6f, 0x7f, 0x1d, 0x22, 0x77, 0x94, 0xc1, 0xc1, 0xfd, 0x75, 0x5f, 0x44, - 0xb6, 0x9a, 0x59, 0x66, 0x9b, 0x15, 0x86, 0x88, 0xe3, 0x68, 0x42, 0x23, 0xb3, 0x00, 0xb6, 0x59, 0xaa, 0x8b, 0xf3, 0xd9, 0x8a, 0x0f, 0x0e, 0xda, 0xde, 0x18, 0x4f, 0xbc, 0xb5, 0xbb, 0x37, 0x08, - 0xa5, 0x05, 0x1d, 0x5e, 0xf6, 0xd8, 0xc2, 0xc9, 0x75, 0xac, 0xd0, 0x39, 0x7f, 0xa1, 0x1e, 0xd6, 0x8b, 0x4d, 0x4e, 0x97, 0x59, 0x39, 0x29, 0x11, 0x6f, 0x58, 0x95, 0x19, 0x7d, 0x38, 0xb0, 0xb3, - 0xd2, 0x92, 0x87, 0x7d, 0x2d, 0x95, 0xef, 0x53, 0x7e, 0x7f, 0x94, 0xcf, 0xfb, 0xc0, 0xc8, 0xec, 0xb3, 0xac, 0xfd, 0x53, 0x69, 0x44, 0xd7, 0xfa, 0x33, 0x8f, 0x6d, 0x4f, 0xf8, 0xc6, 0x5f, 0xd3, - 0x9b, 0xab, 0x49, 0x6e, 0x9f, 0x98, 0x99, 0xe4, 0xf6, 0xe0, 0x4c, 0xe1, 0x7b, 0x1e, 0xf2, 0x2d, 0x33, 0x9c, 0xac, 0x3b, 0x61, 0x69, 0x7b, 0xc1, 0x64, 0x9d, 0x19, 0x02, 0xae, 0xaa, 0xfe, 0x7c, - 0x16, 0x95, 0x4a, 0x80, 0x01, 0xfa, 0x7e, 0xa5, 0xb1, 0x96, 0xe8, 0x8b, 0x8a, 0x01, 0xcd, 0xbd, 0xec, 0xb0, 0x6e, 0xdb, 0xd9, 0x42, 0x40, 0x55, 0x14, 0xac, 0x69, 0x51, 0x16, 0x66, 0x0d, 0x98, - 0x70, 0x07, 0xdd, 0x90, 0xcd, 0xb4, 0xd0, 0x13, 0x95, 0xf3, 0x76, 0xf4, 0xcc, 0x5d, 0x74, 0xa3, 0xe5, 0xf3, 0xca, 0xcb, 0xfd, 0x3a, 0xf5, 0x40, 0x49, 0x89, 0x32, 0xff, 0xec, 0x9c, 0x7b, 0xac, - 0xde, 0x44, 0x59, 0xe8, 0x95, 0xd1, 0x25, 0x9e, 0x86, 0xdc, 0x2b, 0xa9, 0x1f, 0x73, 0xfd, 0x6f, 0x6e, 0xdf, 0xa8, 0x3e, 0xef, 0x5c, 0x6d, 0xe7, 0xb5, 0x2c, 0x3a, 0xe7, 0xd4, 0xe7, 0x49, 0x53, - 0x3f, 0x9f, 0x91, 0xfc, 0x5f, 0xff, 0xba, 0x01, 0x16, 0x55, 0x96, 0xe5, 0xf4, 0x51, 0x98, 0xee, 0x0b, 0x25, 0x3d, 0x1a, 0x67, 0xf8, 0x53, 0x21, 0xa6, 0x1b, 0xba, 0xaf, 0xc3, 0xed, 0x72, 0x35, - 0xc0, 0xfb, 0x85, 0x98, 0x68, 0x7e, 0x16, 0xc8, 0xe2, 0xd8, 0x2b, 0xa2, 0xb9, 0xb1, 0x17, 0x50, 0x5a, 0xca, 0xd8, 0x03, 0x80, 0x6f, 0x32, 0xa5, 0x41, 0xb8, 0x91, 0xe1, 0x76, 0x36, 0x2b, 0x60, - 0xb8, 0xb7, 0xdc, 0xc3, 0x6d, 0x89, 0x76, 0x23, 0xb4, 0x35, 0x97, 0xde, 0xd1, 0x73, 0xe1, 0x6a, 0x3c, 0x0c, 0x33, 0xdb, 0xe1, 0x9d, 0x21, 0x28, 0x97, 0xab, 0xe3, 0x0a, 0x97, 0x04, 0xb1, 0xdc, - 0xb2, 0x1d, 0x66, 0xc9, 0x43, 0x33, 0x7f, 0xde, 0x0a, 0xba, 0xa9, 0x05, 0xf5, 0x27, 0xf6, 0x94, 0xc7, 0xa9, 0x97, 0xf9, 0x72, 0x11, 0x48, 0x9f, 0x29, 0x5f, 0x3f, 0x77, 0x51, 0x84, 0xd6, 0x49, - 0x33, 0x39, 0x49, 0x33, 0xb8, 0x5f, 0x9d, 0x43, 0x1f, 0x71, 0x5b, 0x1e, 0xda, 0xa8, 0x04, 0xef, 0xc5, 0xa4, 0xb4, 0xd5, 0xe6, 0x6c, 0xe9, 0x85, 0xb1, 0xdd, 0xad, 0xe8, 0x78, 0x5a, 0xe0, 0xe0, - 0x66, 0x21, 0x14, 0x78, 0xad, 0x14, 0xda, 0x6c, 0x83, 0xcd, 0x39, 0xce, 0x5c, 0xc0, 0xe0, 0xe8, 0x60, 0x4f, 0xa5, 0xda, 0x07, 0xab, 0x88, 0x46, 0x64, 0x4d, 0xf1, 0xa0, 0xa1, 0x63, 0x31, 0xe9, - 0xa6, 0x36, 0x8c, 0x4e, 0x9b, 0xcc, 0xec, 0x91, 0x8c, 0xf5, 0x8d, 0x35, 0x7c, 0x26, 0xb0, 0x7f, 0x8c, 0x74, 0xdf, 0x4d, 0x66, 0x27, 0x5c, 0xec, 0x28, 0x88, 0x3e, 0x57, 0x0a, 0x9f, 0xcb, 0x86, - 0xb9, 0xa1, 0x7b, 0x45, 0xff, 0x7a, 0xd5, 0x37, 0xe3, 0x65, 0x29, 0x8f, 0x64, 0x64, 0x19, 0xdb, 0xeb, 0x91, 0xe2, 0x13, 0x08, 0x45, 0xce, 0x27, 0xf6, 0xa4, 0x6b, 0xe7, 0x81, 0x5f, 0x6f, 0xa7, - 0xf8, 0x6e, 0xba, 0x4d, 0xc7, 0xf9, 0x30, 0x64, 0xa4, 0x82, 0xee, 0x16, 0xa1, 0xca, 0x27, 0x73, 0x20, 0x3c, 0x50, 0xae, 0x8b, 0xa9, 0x72, 0x05, 0x41, 0x72, 0x50, 0xa9, 0xeb, 0xbd, 0x83, 0x11, - 0x30, 0x39, 0x1f, 0x6e, 0x23, 0xdc, 0xa8, 0x27, 0xe3, 0x64, 0x85, 0xf8, 0xfe, 0x27, 0xd5, 0x26, 0x7f, 0x26, 0x58, 0x7a, 0xaf, 0x5c, 0xf7, 0x2b, 0xe8, 0x67, 0xd8, 0xfe, 0x5c, 0xb0, 0xdc, 0xd0, - 0xbd, 0x62, 0x7b, 0xbd, 0xea, 0x5b, 0x1e, 0xd1, 0x09, 0x75, 0x8b, 0x1c, 0x96, 0x4b, 0x50, 0x1d, 0x23, 0x8b, 0x44, 0x87, 0xc9, 0x38, 0x47, 0x5b, 0x89, 0xed, 0x20, 0xab, 0xb3, 0xb4, 0xc9, 0x01, - 0xaf, 0xd9, 0x9d, 0x19, 0xe0, 0x05, 0x8f, 0xae, 0xd5, 0xe3, 0x64, 0xbe, 0x19, 0xc1, 0xa4, 0xbb, 0x2a, 0x1b, 0x31, 0xe9, 0xc6, 0x63, 0xde, 0x57, 0xdb, 0x49, 0x12, 0x84, 0x0b, 0x27, 0xc5, 0xe1, - 0x21, 0x06, 0x8c, 0xc6, 0x52, 0x1b, 0x21, 0x52, 0x0b, 0xb2, 0x3f, 0xb4, 0xc7, 0xfe, 0x8e, 0x8c, 0xe4, 0x13, 0x54, 0x75, 0x7e, 0xf1, 0xc7, 0xd6, 0xd6, 0xe7, 0x59, 0x1b, 0xcf, 0xd8, 0x78, 0xef, - 0x68, 0x5f, 0x19, 0x73, 0xd3, 0xd3, 0xc7, 0xd6, 0x3b, 0xeb, 0x8b, 0xd3, 0xd8, 0x91, 0xd7, 0x61, 0x96, 0xb0, 0x1b, 0x78, 0x7b, 0xcc, 0xd9, 0x2d, 0xc9, 0xeb, 0x0b, 0xd9, 0xda, 0x73, 0xf8, 0x9c, - 0xb7, 0xc1, 0x65, 0xa7, 0x3a, 0xf8, 0x7e, 0x38, 0x82, 0x90, 0x90, 0x57, 0x78, 0xc8, 0xf5, 0xa7, 0x52, 0x6c, 0x73, 0xe2, 0xa2, 0x0d, 0x60, 0x97, 0x70, 0x7c, 0x94, 0xb3, 0x3d, 0x35, 0xad, 0xd5, - 0xe1, 0xc6, 0xb6, 0x37, 0xe8, 0xae, 0x33, 0x11, 0xc5, 0x0b, 0x87, 0xa4, 0xd6, 0x53, 0x5f, 0x7c, 0xbc, 0x87, 0xeb, 0x19, 0xe1, 0xf3, 0x77, 0x70, 0xf7, 0xd5, 0x6b, 0xf3, 0x17, 0x32, 0xf5, 0x4c, - 0xf2, 0xc4, 0xcb, 0x73, 0xa3, 0x2f, 0x0b, 0xc5, 0xe9, 0x72, 0x03, 0xd5, 0x96, 0x26, 0xf2, 0x66, 0xdd, 0xce, 0xa4, 0x19, 0xed, 0x8e, 0xc6, 0xa1, 0x57, 0xa5, 0x79, 0x60, 0x96, 0x75, 0xa3, 0xb7, - 0x1b, 0xad, 0x9a, 0x72, 0xa6, 0xb2, 0x45, 0x64, 0x15, 0xb0, 0xb2, 0xaa, 0xd8, 0x99, 0x48, 0xbb, 0xca, 0xf2, 0x65, 0x40, 0xce, 0x26, 0x30, 0xa0, 0x6e, 0x61, 0x62, 0x0d, 0x0f, 0x69, 0x21, 0x72, - 0xe0, 0x51, 0x33, 0xa5, 0xec, 0x31, 0xe5, 0x20, 0x29, 0xfe, 0xdd, 0x66, 0xd9, 0xbf, 0x20, 0xda, 0xf3, 0xbb, 0xfa, 0xeb, 0x63, 0x08, 0x9f, 0xd9, 0xca, 0x71, 0xa5, 0x09, 0x0e, 0x5e, 0x5b, 0x7d, - 0xb7, 0x6e, 0xb8, 0xce, 0x71, 0x17, 0x32, 0xad, 0x0e, 0x8f, 0x31, 0x22, 0xd1, 0x4d, 0x67, 0xb3, 0x1b, 0x17, 0x0b, 0x60, 0x5a, 0xaf, 0x24, 0x71, 0xe3, 0xce, 0x56, 0x6b, 0x02, 0x64, 0x7c, 0x3c, - 0xae, 0x90, 0x2e, 0x6f, 0xd4, 0x6a, 0xc7, 0x92, 0x33, 0xa2, 0x9a, 0x1e, 0xa2, 0x7a, 0x36, 0x06, 0xc8, 0x85, 0xb1, 0x40, 0x86, 0x0b, 0x57, 0xe7, 0x97, 0x9c, 0xdb, 0x0c, 0xbb, 0x25, 0x56, 0x4d, - 0xb3, 0x7c, 0x23, 0x66, 0x3b, 0xeb, 0xff, 0x94, 0x1b, 0xfe, 0x0b, 0xcb, 0x0d, 0x7f, 0x31, 0x90, 0x2e, 0x3b, 0x9e, 0xed, 0xe3, 0xc0, 0xf5, 0x7c, 0xab, 0x49, 0xfe, 0xda, 0x4c, 0xdb, 0x0f, 0xd4, - 0x4f, 0x83, 0xeb, 0x7d, 0x5f, 0x1f, 0x3d, 0x03, 0x1e, 0xc8, 0xab, 0xa2, 0x76, 0x5a, 0x9b, 0xcd, 0x09, 0x8a, 0xde, 0x59, 0xf0, 0x02, 0xcf, 0xdd, 0x12, 0xc3, 0x22, 0x6f, 0xb1, 0xdf, 0xfe, 0xd0, - 0xb5, 0x76, 0x63, 0x72, 0x7d, 0xf6, 0xa5, 0x3f, 0x3f, 0x1c, 0xeb, 0x95, 0xe8, 0xe9, 0x03, 0xaf, 0xcd, 0xf3, 0x77, 0x7d, 0x73, 0x48, 0x16, 0x3c, 0x90, 0x6d, 0x38, 0x5e, 0xb9, 0xbe, 0xb8, 0x14, - 0xf7, 0xf3, 0x76, 0x3e, 0x59, 0x4c, 0x38, 0x8d, 0x08, 0x34, 0x0d, 0xb6, 0xfd, 0xc7, 0xdf, 0xd5, 0x63, 0x6d, 0xf8, 0xdc, 0xfa, 0xfb, 0xd9, 0x96, 0xfb, 0x1b, 0xeb, 0xf3, 0x11, 0x50, 0xc8, 0x53, - 0x75, 0x0d, 0x5e, 0x89, 0x9e, 0x81, 0xba, 0x34, 0xcf, 0x31, 0xb3, 0x1e, 0x95, 0x0d, 0xb6, 0x60, 0xcb, 0x5a, 0x3a, 0x06, 0x1a, 0x89, 0x85, 0x6a, 0xdd, 0x71, 0x35, 0x6e, 0x15, 0x91, 0xd7, 0x0d, - 0x6f, 0xc6, 0xb5, 0x3b, 0x7e, 0x51, 0x67, 0xbb, 0x91, 0xdb, 0x74, 0x0a, 0x57, 0x74, 0x85, 0x68, 0x76, 0x74, 0xb5, 0x5d, 0xac, 0x42, 0x13, 0x59, 0x00, 0x93, 0x6c, 0x14, 0xc9, 0xab, 0x61, 0xc7, - 0xca, 0xf9, 0x6c, 0xea, 0xad, 0x0a, 0x7d, 0x71, 0xb0, 0x30, 0xd7, 0xf0, 0xcc, 0x99, 0xb8, 0xf3, 0xf6, 0x5f, 0xa7, 0x10, 0x47, 0x85, 0xe5, 0xba, 0xe5, 0xcb, 0x17, 0x47, 0xb3, 0x0c, 0x9f, 0x99, - 0x16, 0xaf, 0x54, 0x4f, 0x20, 0xbc, 0xb6, 0x07, 0x67, 0x5a, 0xdf, 0xa3, 0x00, 0x2d, 0x66, 0x20, 0x01, 0x91, 0x87, 0xfc, 0x20, 0x2b, 0x39, 0x47, 0xb2, 0xf1, 0x1a, 0x9e, 0xfa, 0xb2, 0xbd, 0xcc, - 0x55, 0x08, 0xb0, 0x6b, 0x25, 0x72, 0xe2, 0x4a, 0x94, 0x35, 0x31, 0x09, 0xc1, 0xd0, 0x3c, 0x6e, 0xd7, 0xd4, 0xa2, 0x48, 0x57, 0x3e, 0xd9, 0x18, 0x7b, 0x41, 0x43, 0x25, 0xc0, 0xda, 0x9a, 0x84, - 0x04, 0xee, 0x61, 0xca, 0x4c, 0x74, 0x99, 0x1b, 0x19, 0x7a, 0x64, 0xa8, 0x02, 0x8f, 0x06, 0x3f, 0x53, 0x09, 0xe1, 0x3e, 0x06, 0xcb, 0xbb, 0x3d, 0xaa, 0x8f, 0xe1, 0x7b, 0x66, 0x3f, 0xcf, 0x2d, - 0xe1, 0xf3, 0x9e, 0xcc, 0xdf, 0x97, 0x7d, 0x77, 0xf2, 0xc0, 0xb3, 0x18, 0x4b, 0xf8, 0x95, 0x90, 0x80, 0x87, 0x11, 0xbe, 0x1d, 0x31, 0x19, 0x39, 0x03, 0x6c, 0xa4, 0xae, 0x85, 0xd5, 0xc2, 0xa2, - 0xaa, 0x2e, 0x9c, 0xcc, 0x4a, 0x9d, 0x69, 0x74, 0x91, 0x01, 0x73, 0x0f, 0xe5, 0xe6, 0x4b, 0x65, 0x19, 0xee, 0xc2, 0x80, 0xad, 0x8a, 0x7d, 0x70, 0x64, 0x5d, 0x62, 0xc5, 0x1f, 0xf7, 0x23, 0x75, - 0xb7, 0x69, 0x8d, 0xc8, 0x99, 0x92, 0x48, 0xb2, 0x0d, 0x98, 0x6c, 0xc6, 0xf5, 0x3c, 0xc8, 0xf8, 0x51, 0x61, 0xae, 0x57, 0x34, 0x7f, 0xc0, 0x83, 0xbf, 0x43, 0x71, 0x8b, 0x5e, 0x8d, 0xc3, 0xbf, - 0xd4, 0x4a, 0x7a, 0xa3, 0x7a, 0x61, 0xe6, 0xa5, 0xdd, 0xd7, 0x42, 0x82, 0xe6, 0x1b, 0x1c, 0x90, 0xf9, 0xb1, 0xb8, 0x9d, 0xb9, 0x5d, 0x3c, 0x5a, 0x0c, 0xed, 0x86, 0x96, 0x9c, 0x0d, 0x05, 0x61, - 0x8c, 0xdb, 0x90, 0x34, 0x24, 0x7a, 0x35, 0x51, 0x71, 0x11, 0x3a, 0x8d, 0xd2, 0xc9, 0x30, 0xf3, 0x88, 0x14, 0x1b, 0xb1, 0xa2, 0xe9, 0x4b, 0x19, 0xb0, 0x36, 0x23, 0xdd, 0x1e, 0x6d, 0xb1, 0x29, - 0xa6, 0xa7, 0x9c, 0xcf, 0x98, 0xb3, 0xa8, 0x58, 0xc6, 0xc3, 0x42, 0xa7, 0x5c, 0xf9, 0x3f, 0xd7, 0xfa, 0xfc, 0x50, 0xde, 0xfb, 0xb1, 0xb4, 0x7d, 0x72, 0xaa, 0xdc, 0x90, 0x7e, 0xc5, 0xf7, 0xad, - 0xe3, 0x1c, 0x12, 0xee, 0x31, 0x5d, 0xcc, 0xd5, 0x44, 0x32, 0xbc, 0x8a, 0x28, 0x98, 0xa3, 0x7b, 0x6c, 0xd8, 0xc8, 0xad, 0x3c, 0x92, 0xaf, 0xb8, 0x43, 0x6d, 0xcf, 0x48, 0x6d, 0xe3, 0xa9, 0x93, - 0xbc, 0x0b, 0x24, 0x30, 0x20, 0x4b, 0x17, 0x3a, 0xa8, 0x51, 0x6a, 0xac, 0x93, 0xd6, 0x94, 0x26, 0xe0, 0x02, 0x59, 0x05, 0xa6, 0x12, 0x6b, 0x47, 0x12, 0xc1, 0x67, 0xbe, 0x97, 0x2c, 0xbd, 0x8d, - 0x33, 0x59, 0x0d, 0xc9, 0x34, 0xad, 0x25, 0x56, 0x7f, 0xde, 0xbf, 0xf5, 0xe8, 0x84, 0xa3, 0x67, 0x33, 0x72, 0x7a, 0x69, 0xdb, 0xd5, 0xc0, 0xce, 0xf3, 0xc4, 0xb3, 0xb2, 0xdf, 0x3b, 0x80, 0x3f, - 0x13, 0x67, 0x4f, 0xac, 0x06, 0xef, 0xa9, 0x5f, 0xd9, 0x74, 0xd7, 0xd7, 0x37, 0x86, 0x61, 0xeb, 0xae, 0xa8, 0x6d, 0x27, 0xe3, 0x91, 0x3a, 0xa3, 0x9d, 0xf1, 0xd6, 0xe3, 0xe0, 0x26, 0xdb, 0xcf, - 0x97, 0xb3, 0xc2, 0x34, 0x2c, 0x0b, 0xdf, 0xb4, 0xcd, 0x31, 0x90, 0x8f, 0x32, 0xe8, 0x20, 0x89, 0x4f, 0xc2, 0xc3, 0x54, 0x59, 0x98, 0x8c, 0x8a, 0xab, 0x2e, 0x23, 0x25, 0x85, 0x0b, 0xc1, 0x6a, - 0x4c, 0x33, 0x41, 0xaa, 0x51, 0x92, 0xbf, 0xb3, 0x04, 0x20, 0x95, 0xac, 0x8d, 0xe0, 0x96, 0xe0, 0xfa, 0x69, 0xc1, 0xf6, 0x2f, 0x63, 0x91, 0xde, 0xe7, 0x14, 0x7d, 0x66, 0x53, 0xfd, 0xdc, 0xa5, - 0x79, 0x43, 0xf7, 0xc2, 0xd5, 0xd7, 0xab, 0xb3, 0x6d, 0xd5, 0xc3, 0xc5, 0x39, 0x87, 0x19, 0x67, 0xe5, 0x51, 0xaa, 0xa1, 0x8c, 0xe4, 0x72, 0xe1, 0x75, 0xcd, 0x4c, 0x55, 0xd4, 0x7d, 0xac, 0x57, - 0x61, 0x8e, 0x0c, 0x89, 0x21, 0xda, 0x64, 0xfa, 0x0a, 0x31, 0xc2, 0xb9, 0xaa, 0x48, 0x48, 0x7d, 0x58, 0x80, 0x1e, 0x8b, 0x91, 0x76, 0xbb, 0xb6, 0xc0, 0x7d, 0x54, 0x08, 0xd3, 0xd4, 0x9c, 0x06, - 0x25, 0xb8, 0x26, 0x7c, 0x98, 0xa5, 0x09, 0xc2, 0x6d, 0xa1, 0x74, 0x72, 0x54, 0x66, 0xc7, 0x9f, 0x6c, 0xe0, 0xfd, 0x1b, 0x19, 0x72, 0x32, 0x13, 0x2e, 0xd7, 0x9f, 0xca, 0xc4, 0x67, 0x4e, 0x6e, - 0xbd, 0x27, 0x7d, 0x65, 0xcb, 0xef, 0x8e, 0x01, 0xd2, 0xef, 0x14, 0x57, 0x82, 0x46, 0xfc, 0xad, 0xbf, 0x83, 0x4b, 0xdf, 0x13, 0xcd, 0xf8, 0x50, 0x9a, 0x73, 0xd6, 0x2b, 0x8b, 0xe5, 0x58, 0xe1, - 0xa4, 0xf5, 0x64, 0x14, 0xc9, 0x41, 0xd6, 0x40, 0x40, 0x6e, 0x7b, 0xf3, 0x62, 0x22, 0x98, 0x92, 0x9a, 0xe7, 0x5c, 0x50, 0x45, 0x5d, 0xdb, 0xb5, 0x90, 0x19, 0xcf, 0xf7, 0x7c, 0x87, 0x46, 0xda, - 0x8c, 0x73, 0xe7, 0xf5, 0x46, 0x9b, 0x83, 0x75, 0x2a, 0x94, 0x28, 0x83, 0xc0, 0xe0, 0x77, 0x11, 0xf1, 0x2f, 0x1d, 0x42, 0xbf, 0x7e, 0x47, 0x07, 0xff, 0x16, 0x86, 0xdd, 0x97, 0x48, 0xf8, 0x4c, - 0x3f, 0x78, 0xc2, 0x64, 0xb8, 0x23, 0x7d, 0x61, 0xd8, 0x4d, 0x47, 0xdf, 0xc2, 0x68, 0xa0, 0x8d, 0x99, 0x9b, 0x8a, 0x25, 0x4d, 0x5c, 0xdf, 0xd4, 0xb3, 0x43, 0x05, 0x86, 0x43, 0x8d, 0xca, 0x5a, - 0x7f, 0x19, 0xc8, 0xf4, 0x71, 0x61, 0xb8, 0x35, 0xab, 0x89, 0x4b, 0x7b, 0x77, 0x24, 0x62, 0x1a, 0x8e, 0x9c, 0x34, 0x88, 0x7d, 0x4a, 0x1b, 0xe7, 0xca, 0x22, 0xf0, 0x64, 0x6c, 0x7f, 0xc4, 0x6b, - 0xc3, 0x12, 0x3c, 0x21, 0x6f, 0xba, 0xe9, 0x8a, 0x5e, 0xdb, 0x59, 0x3c, 0xc4, 0x1c, 0xc4, 0x04, 0x7e, 0x52, 0xfe, 0xfd, 0xef, 0x9b, 0x4a, 0xde, 0xa1, 0xfe, 0x22, 0x38, 0xfb, 0x5c, 0x96, 0xd9, - 0x6f, 0xb2, 0x17, 0x8e, 0x5c, 0x2f, 0xfa, 0x66, 0x99, 0xc9, 0xf6, 0xc2, 0xa6, 0xd7, 0xdb, 0x35, 0x01, 0xa1, 0x9b, 0x08, 0x8b, 0x27, 0x66, 0x8b, 0x0d, 0x97, 0xde, 0x66, 0xbe, 0xca, 0xb0, 0x23, - 0xbb, 0xaf, 0xec, 0xce, 0xdc, 0xe7, 0xe5, 0x24, 0x3f, 0x4e, 0xa2, 0xa6, 0xae, 0xd6, 0x68, 0x36, 0x37, 0x5c, 0x9b, 0x47, 0x89, 0xce, 0x0f, 0xd9, 0x39, 0x21, 0x4e, 0x98, 0x82, 0x37, 0x67, 0xd3, - 0x2d, 0x53, 0x67, 0x3b, 0x7c, 0x2e, 0x1d, 0xd2, 0x36, 0x41, 0xe3, 0xea, 0xfd, 0x5e, 0xc7, 0x9f, 0x7a, 0xde, 0xa0, 0xfb, 0xe3, 0x4b, 0xbe, 0x84, 0x34, 0xf0, 0xb2, 0x6b, 0x91, 0xa2, 0xd7, 0x48, - 0xd0, 0x57, 0x9e, 0x93, 0xa7, 0xa4, 0xd4, 0xc7, 0x57, 0x5c, 0x90, 0xfe, 0xd8, 0x7f, 0x71, 0xa1, 0xf4, 0x10, 0x5a, 0x71, 0x35, 0x89, 0x8f, 0xc3, 0x04, 0x3d, 0x46, 0xfa, 0x44, 0x04, 0x84, 0x4a, - 0x77, 0xd3, 0xd1, 0x7e, 0x22, 0x38, 0xfc, 0xc1, 0xd2, 0xb5, 0x65, 0x55, 0x2c, 0xdc, 0x22, 0x99, 0xaa, 0x9b, 0xd9, 0xb0, 0xdd, 0xc1, 0x91, 0x19, 0xcc, 0xbc, 0xad, 0x37, 0x86, 0x96, 0x30, 0x41, - 0xee, 0xbc, 0x86, 0x22, 0x9c, 0x4e, 0xb4, 0x0e, 0x9e, 0x8b, 0xee, 0x40, 0xb5, 0x6b, 0xf6, 0x50, 0xb5, 0x5f, 0x42, 0x51, 0xb9, 0xa4, 0x7a, 0x56, 0x59, 0xf9, 0xe8, 0xd3, 0xff, 0xd7, 0xb3, 0x7e, - 0xbe, 0x98, 0x45, 0xd8, 0x53, 0x31, 0xcf, 0x2b, 0xcd, 0x2b, 0x63, 0x4f, 0xf3, 0x07, 0xeb, 0x17, 0xfb, 0x3c, 0x78, 0x89, 0x6c, 0x1d, 0x39, 0x0e, 0x25, 0xcc, 0x60, 0x42, 0x9a, 0x5a, 0x98, 0x44, - 0x64, 0xa1, 0xa1, 0x58, 0xb8, 0xb6, 0xd7, 0x09, 0xc5, 0xc7, 0x2d, 0xbe, 0xd8, 0xa4, 0xdb, 0x39, 0x83, 0x85, 0x23, 0x97, 0x41, 0xeb, 0x90, 0x52, 0xfc, 0xed, 0xb0, 0x35, 0xac, 0x6a, 0xb9, 0x02, - 0x52, 0x5d, 0xe3, 0xcd, 0x70, 0xba, 0x0d, 0x4c, 0xff, 0x10, 0x2e, 0xe5, 0xac, 0xdc, 0x4b, 0x25, 0xe6, 0x25, 0xb2, 0xfc, 0x9d, 0xe7, 0xfa, 0xcb, 0x90, 0xf3, 0x6f, 0x21, 0xf3, 0xba, 0xf7, 0xf7, - 0xa7, 0x7c, 0xfd, 0xc9, 0xfc, 0xfb, 0xfc, 0xb8, 0x07, 0xe4, 0x59, 0x23, 0xf4, 0x72, 0xd4, 0xc3, 0xa5, 0x71, 0xf6, 0x49, 0xf5, 0x30, 0x3f, 0x1d, 0xde, 0x9c, 0x8a, 0x62, 0xde, 0x29, 0xa1, 0x05, - 0xfb, 0xd8, 0xea, 0xb0, 0x9c, 0x76, 0x49, 0xb0, 0x30, 0x04, 0xe5, 0x18, 0x23, 0x44, 0x11, 0x39, 0xae, 0xa9, 0x1c, 0x28, 0x24, 0xb4, 0x1d, 0x50, 0xf7, 0xb1, 0x05, 0x58, 0x9b, 0x3c, 0xaf, 0xcb, - 0xe3, 0xed, 0xaa, 0x55, 0xb1, 0x62, 0x11, 0xe5, 0x92, 0xce, 0x32, 0xcb, 0xb9, 0x94, 0x41, 0xec, 0x8a, 0x54, 0x0b, 0x8f, 0xdc, 0x4a, 0x24, 0x02, 0x1f, 0xbf, 0x63, 0xc3, 0x7f, 0xc6, 0x48, 0x7f, - 0x5f, 0xdf, 0xef, 0x33, 0xa4, 0x9f, 0x5a, 0x38, 0xee, 0x88, 0x5f, 0x30, 0xbf, 0xeb, 0x3a, 0xa3, 0xdf, 0x63, 0x11, 0x41, 0x3a, 0x62, 0xde, 0x89, 0xad, 0x29, 0x59, 0x43, 0x1a, 0x31, 0xc8, 0xc3, - 0x98, 0x70, 0x45, 0x31, 0xc5, 0xa6, 0xb2, 0x22, 0x2b, 0x6b, 0x2d, 0x5e, 0xcc, 0x0c, 0x43, 0xa9, 0x31, 0x04, 0x23, 0xbc, 0x95, 0x32, 0x4f, 0x67, 0x39, 0x24, 0x02, 0xe6, 0x91, 0xaf, 0x54, 0x82, - 0xd0, 0xa9, 0xe4, 0xb0, 0x80, 0x69, 0x7b, 0x34, 0x44, 0xdc, 0xa9, 0x17, 0x24, 0xc2, 0xb2, 0x0c, 0xf7, 0x85, 0x27, 0x2d, 0x78, 0xe2, 0x5f, 0x20, 0x3c, 0x7a, 0xc2, 0xab, 0x49, 0xed, 0x4f, 0xcf, - 0x86, 0x21, 0x9f, 0x8a, 0xa1, 0xbd, 0x51, 0xbd, 0x72, 0xe4, 0xdc, 0x3e, 0xef, 0xbd, 0xea, 0xb1, 0xb2, 0x60, 0xf0, 0x38, 0xf2, 0xb7, 0x01, 0xe1, 0x51, 0xca, 0x31, 0x91, 0x0b, 0xb7, 0x56, 0x0a, - 0x6f, 0xb9, 0x59, 0xed, 0x5a, 0x79, 0x34, 0xd9, 0x74, 0x4a, 0x5d, 0x73, 0xed, 0x44, 0x62, 0x48, 0x0c, 0x06, 0x8a, 0xcc, 0xa4, 0xe8, 0x75, 0x0b, 0x41, 0x10, 0xb6, 0x92, 0x96, 0x18, 0x2a, 0x2e, - 0x04, 0x26, 0x59, 0x0c, 0x1d, 0xb6, 0x5d, 0x17, 0xc4, 0xda, 0xd4, 0x4c, 0x75, 0x94, 0xd8, 0xac, 0x6e, 0x1c, 0x0e, 0xd9, 0x77, 0x13, 0xe1, 0x7b, 0x79, 0xd2, 0xaf, 0x4a, 0xc0, 0xef, 0xaf, 0xfd, - 0x56, 0x7d, 0xfd, 0xf9, 0x1e, 0x91, 0xf7, 0xc4, 0xef, 0xd0, 0xbd, 0x51, 0x61, 0x7b, 0xd4, 0x93, 0x93, 0x54, 0x28, 0x99, 0x81, 0xd9, 0x10, 0x2f, 0x56, 0xb9, 0xba, 0x68, 0x86, 0x2d, 0x3c, 0x32, - 0x05, 0x7c, 0x35, 0x72, 0xcc, 0x66, 0x2d, 0x6f, 0xe6, 0xdb, 0xd5, 0x96, 0x66, 0x11, 0x77, 0xbe, 0x1b, 0x63, 0x1d, 0xc2, 0x26, 0x5b, 0x56, 0x5d, 0x7b, 0x1c, 0x41, 0xc9, 0x0d, 0xd7, 0x8c, 0x16, - 0x23, 0x06, 0xd4, 0xa7, 0x1e, 0xb0, 0xe4, 0x4c, 0xc0, 0x1f, 0x8e, 0x16, 0xdb, 0xe5, 0x44, 0x21, 0xa0, 0x75, 0xe4, 0xfd, 0x68, 0x2b, 0xfb, 0xdf, 0x37, 0xde, 0x5f, 0x2b, 0x89, 0x7e, 0xe6, 0x77, - 0x79, 0x6a, 0xe9, 0x3d, 0x13, 0xbd, 0xf0, 0xe3, 0xb2, 0x53, 0x0f, 0xee, 0x57, 0xcc, 0x64, 0x27, 0x6f, 0xf4, 0x69, 0x87, 0x50, 0xdc, 0x8a, 0x3c, 0x02, 0x33, 0x4d, 0x27, 0xda, 0xe5, 0xb8, 0xf2, - 0x0e, 0x6e, 0xd2, 0x76, 0x0a, 0x2c, 0xcc, 0xd7, 0x53, 0x79, 0xd4, 0x58, 0xe2, 0x52, 0xc4, 0x73, 0x68, 0x36, 0xd9, 0x53, 0x2a, 0x63, 0x68, 0x04, 0x88, 0x00, 0xde, 0x78, 0xb5, 0x39, 0xce, 0x2a, - 0x7b, 0x45, 0x8d, 0xd7, 0x4b, 0x1d, 0xb1, 0x40, 0x51, 0x4b, 0xe5, 0xe2, 0x78, 0x30, 0x26, 0x9c, 0x41, 0x8e, 0x7b, 0x46, 0xfe, 0xbf, 0xa9, 0x2e, 0xf9, 0x2f, 0x9d, 0x18, 0xf0, 0x56, 0x98, 0xf2, - 0x2f, 0x5d, 0xd7, 0x2b, 0xef, 0x3a, 0xe7, 0x2a, 0xaf, 0xee, 0xbb, 0xae, 0x03, 0x88, 0x93, 0x29, 0x13, 0xd3, 0x33, 0xf0, 0x0e, 0x8c, 0x74, 0xd6, 0x5e, 0x86, 0x42, 0xc9, 0xd3, 0xd6, 0x02, 0x5c, - 0x59, 0x0d, 0xbe, 0xc5, 0x3d, 0x7d, 0x37, 0x8c, 0x61, 0x6c, 0x5c, 0x48, 0x8a, 0x5f, 0xef, 0xa0, 0x82, 0x9e, 0x37, 0xc8, 0x6a, 0xbf, 0x91, 0x64, 0x33, 0x3c, 0x9a, 0xda, 0xa8, 0x3b, 0xa0, 0x39, - 0xa1, 0x93, 0x43, 0x7c, 0xd9, 0x11, 0xa3, 0xc2, 0x26, 0x24, 0x88, 0x5d, 0xf8, 0x28, 0xf9, 0x9d, 0x38, 0xfb, 0x4f, 0xc1, 0xf7, 0xeb, 0x32, 0x28, 0x4f, 0xc5, 0x3e, 0x5f, 0xa9, 0x5e, 0x51, 0x7e, - 0x2d, 0x7c, 0xf2, 0x6d, 0xf4, 0xf3, 0xbc, 0x84, 0x07, 0x6e, 0x67, 0x2f, 0xd4, 0x66, 0x57, 0x8b, 0x68, 0x62, 0xac, 0x4b, 0x55, 0x11, 0x8d, 0x7c, 0x9c, 0x08, 0x61, 0x4a, 0xe6, 0x62, 0x83, 0xa9, - 0x6e, 0x21, 0x9b, 0xab, 0x02, 0x06, 0x19, 0x36, 0xd8, 0x72, 0x23, 0x85, 0x9a, 0x20, 0x26, 0x9c, 0x40, 0xc7, 0x95, 0x6b, 0x13, 0x0c, 0xd6, 0xad, 0xe9, 0xc3, 0x9e, 0x89, 0x56, 0x2d, 0xb5, 0x72, - 0x9b, 0x64, 0x21, 0xf1, 0x73, 0x76, 0x9d, 0x40, 0x22, 0xf4, 0xaf, 0x21, 0xd2, 0xde, 0xca, 0x45, 0xfe, 0xa5, 0xae, 0x92, 0x0b, 0xd5, 0x2b, 0x2b, 0xce, 0xed, 0xbe, 0x0e, 0x92, 0x31, 0x38, 0x16, - 0x46, 0xbb, 0x85, 0x96, 0xb5, 0xae, 0x73, 0xd8, 0xcd, 0x68, 0xe9, 0x70, 0xe4, 0x43, 0xac, 0x85, 0x55, 0x75, 0xc2, 0x8f, 0xb9, 0x22, 0x60, 0x2c, 0x48, 0x33, 0x82, 0x62, 0xc1, 0x4c, 0x57, 0x55, - 0xe7, 0x94, 0x82, 0xe3, 0xfb, 0x01, 0xde, 0x84, 0x7b, 0x39, 0x10, 0xc6, 0x4b, 0x06, 0xd1, 0xb4, 0x43, 0xba, 0x23, 0xa2, 0x2a, 0xaa, 0x3a, 0x8a, 0xac, 0x3b, 0x05, 0x82, 0xeb, 0x86, 0x0d, 0x7b, - 0xfa, 0x8e, 0xff, 0xd5, 0xc5, 0xd6, 0xfd, 0xe9, 0x2b, 0x9f, 0x2d, 0x52, 0x4f, 0x29, 0x0f, 0x37, 0xa4, 0x2f, 0x5c, 0xbd, 0xe9, 0x38, 0x2f, 0x58, 0x3d, 0x14, 0x07, 0x19, 0x60, 0x25, 0x26, 0x98, - 0x27, 0x12, 0x2a, 0x1c, 0x27, 0x76, 0xa5, 0x83, 0xd3, 0xdc, 0x76, 0x87, 0xce, 0xae, 0x30, 0x47, 0x4d, 0xab, 0xca, 0x00, 0x65, 0x55, 0xd2, 0xce, 0x60, 0x56, 0xcb, 0xb1, 0x8d, 0xec, 0x56, 0x5d, - 0x0d, 0xe7, 0x1d, 0x9e, 0xe2, 0xf9, 0x41, 0x1c, 0x1f, 0xf8, 0x40, 0x65, 0x0e, 0x91, 0x56, 0xf1, 0x9b, 0x75, 0x84, 0x1d, 0xad, 0x29, 0x00, 0x36, 0xad, 0x9b, 0x70, 0x89, 0xd1, 0xf4, 0x64, 0xad, - 0xd5, 0x5a, 0xd1, 0xc5, 0xe7, 0x7d, 0xf3, 0xc3, 0xab, 0xc7, 0xab, 0xd7, 0xf7, 0xd5, 0xd3, 0x6f, 0x6a, 0xce, 0x9f, 0x53, 0x6e, 0xa9, 0x17, 0x68, 0x90, 0x79, 0x87, 0xfa, 0xfe, 0xc1, 0xdf, 0x7b, - 0x7d, 0x1f, 0x9c, 0x18, 0xd4, 0x73, 0xbf, 0xc4, 0xff, 0xb6, 0x63, 0x6d, 0xef, 0x59, 0xdb, 0xaf, 0xcd, 0xdf, 0xa7, 0x8c, 0xb2, 0x2b, 0xd9, 0xcb, 0x18, 0xbb, 0x5e, 0xf4, 0x35, 0xc4, 0xd6, 0xf2, - 0x48, 0xc2, 0xb6, 0x1c, 0x9e, 0x6f, 0x62, 0x58, 0xdd, 0xb7, 0xed, 0x90, 0x84, 0xca, 0x46, 0xdd, 0x8e, 0x37, 0x24, 0x0f, 0xa7, 0x5d, 0xb0, 0x99, 0xf2, 0x18, 0x58, 0x7a, 0x2d, 0xe2, 0x2c, 0x25, - 0xd7, 0x1a, 0x2a, 0xe9, 0x90, 0x2b, 0x97, 0x24, 0x64, 0x0a, 0x4d, 0x8d, 0x95, 0x3c, 0x17, 0x18, 0xd0, 0x74, 0x5d, 0xaa, 0xcd, 0x70, 0x34, 0xb6, 0x75, 0x1a, 0xa9, 0x5c, 0x11, 0x38, 0x40, 0x4e, - 0xf8, 0x9d, 0x33, 0xfc, 0x3f, 0x0b, 0xeb, 0xaf, 0x55, 0x92, 0xa7, 0xb1, 0x7e, 0x53, 0x4b, 0xae, 0x17, 0x7d, 0xb1, 0x2e, 0x22, 0xac, 0x0d, 0xed, 0x70, 0xc3, 0xb1, 0xcb, 0x43, 0x1e, 0xaa, 0x7b, - 0x52, 0x08, 0xd9, 0xaa, 0xf1, 0x14, 0xac, 0x95, 0xd8, 0x69, 0xae, 0x87, 0x02, 0x09, 0x48, 0xec, 0x1a, 0x8a, 0x17, 0xb3, 0x76, 0x08, 0x50, 0x82, 0x66, 0x8c, 0x45, 0x65, 0x57, 0xd3, 0x4c, 0x16, - 0x94, 0x07, 0x3e, 0x45, 0x02, 0x8c, 0x08, 0x73, 0x0e, 0x02, 0x02, 0xaa, 0x31, 0xcd, 0x51, 0xb7, 0x2a, 0xdb, 0x0d, 0xcb, 0x7c, 0xbb, 0x1d, 0xff, 0x7f, 0x39, 0xd6, 0xbf, 0xab, 0x8c, 0x3e, 0x02, - 0x1a, 0x7b, 0x2a, 0xfa, 0x7d, 0xa5, 0x09, 0x0e, 0x5e, 0x5b, 0x03, 0xac, 0x5f, 0xbc, 0x7b, 0x5f, 0x1c, 0xcc, 0x6a, 0xb8, 0xce, 0x0f, 0xa6, 0x35, 0x9f, 0xc8, 0x73, 0x76, 0x66, 0x2a, 0x47, 0x66, - 0x62, 0x19, 0x45, 0x02, 0x4d, 0x17, 0x32, 0x0d, 0x4c, 0x47, 0x43, 0x6b, 0x1e, 0x1d, 0xbd, 0x74, 0x11, 0xae, 0xf6, 0xdb, 0x83, 0x18, 0x10, 0x68, 0x88, 0x29, 0xf0, 0x62, 0x1e, 0xa8, 0x2c, 0x57, - 0x28, 0x3b, 0x81, 0x59, 0x4b, 0x4e, 0x9a, 0x1a, 0xcb, 0x26, 0x28, 0xa5, 0x78, 0x9e, 0x8c, 0x6a, 0xad, 0x95, 0x7a, 0xba, 0x49, 0xad, 0x32, 0xb8, 0xad, 0x81, 0xf3, 0x50, 0x34, 0x7d, 0x28, 0x74, - 0x7a, 0x53, 0xa3, 0xd5, 0x8e, 0xb2, 0xd7, 0xcf, 0xbd, 0x2d, 0x72, 0xfa, 0x15, 0xf2, 0x79, 0x36, 0xa8, 0x9c, 0xd0, 0x4b, 0xad, 0x41, 0x5d, 0x5a, 0x27, 0xd4, 0x3f, 0x0f, 0x82, 0x3e, 0xe3, 0x57, - 0x78, 0xf4, 0x82, 0x33, 0x4f, 0x3e, 0x76, 0xf7, 0xcd, 0xdb, 0x5d, 0xaf, 0x28, 0x50, 0x18, 0x66, 0xa8, 0x1e, 0xeb, 0xe1, 0xcc, 0xcc, 0xe0, 0x64, 0x19, 0x6e, 0xa7, 0x16, 0x3d, 0x56, 0x78, 0x55, - 0x12, 0xf5, 0x58, 0x0b, 0x37, 0xd8, 0x88, 0x06, 0xa5, 0x8c, 0x6f, 0xa9, 0x43, 0x1b, 0xec, 0xea, 0x5d, 0x41, 0xeb, 0xc3, 0x19, 0x8f, 0xa5, 0x92, 0x78, 0x90, 0x0f, 0xb0, 0x94, 0xe4, 0x58, 0xbd, - 0xeb, 0xbc, 0x9d, 0x0d, 0x55, 0x7c, 0x52, 0x36, 0x16, 0x7f, 0x44, 0xdd, 0xe6, 0xeb, 0x3a, 0x5b, 0x0f, 0x6a, 0x28, 0x3d, 0x82, 0x08, 0x7f, 0x2a, 0x23, 0xec, 0x3d, 0x71, 0x70, 0xf0, 0xa1, 0x6b, - 0x80, 0xf7, 0xcb, 0x0f, 0x53, 0x15, 0xb2, 0x50, 0xb7, 0x54, 0xbc, 0x1e, 0x4b, 0xf0, 0x5e, 0x22, 0xf7, 0x68, 0xa4, 0xf9, 0xb3, 0xf8, 0x80, 0x22, 0x4c, 0x34, 0x42, 0x7c, 0x34, 0x9c, 0xba, 0xa2, - 0xcc, 0xef, 0x8f, 0x28, 0x38, 0x11, 0x44, 0x34, 0x43, 0x37, 0xb9, 0x73, 0x8c, 0x0a, 0xf5, 0xe0, 0x1c, 0x25, 0x53, 0x82, 0xac, 0x30, 0xf7, 0x5a, 0xc0, 0xdf, 0x1e, 0x89, 0x61, 0x43, 0x03, 0xac, - 0x17, 0x0b, 0xd6, 0x70, 0xd1, 0x70, 0x8b, 0x9e, 0x4b, 0xbd, 0xf3, 0x7a, 0xdc, 0xec, 0xaf, 0x3f, 0xa1, 0xa7, 0x6a, 0x48, 0x9d, 0xc4, 0xe0, 0x85, 0xc8, 0xa5, 0x10, 0xd4, 0x6b, 0x29, 0x29, 0xac, - 0x57, 0x09, 0xc2, 0x24, 0xcf, 0x0b, 0xdb, 0xcb, 0x3e, 0xad, 0xf1, 0x01, 0x3f, 0xb5, 0xa1, 0xfe, 0x8d, 0xea, 0x89, 0x29, 0xaf, 0xed, 0x73, 0xfc, 0xbe, 0xc7, 0x40, 0xf5, 0x6b, 0x44, 0x48, 0x1b, - 0x33, 0x63, 0xf6, 0x00, 0x33, 0x17, 0x7d, 0x05, 0x4f, 0x8b, 0x89, 0xd6, 0xb8, 0x93, 0x91, 0xd4, 0x25, 0xc5, 0x2c, 0x0d, 0xc9, 0x54, 0x25, 0x79, 0x47, 0x60, 0x53, 0xcf, 0xaf, 0x16, 0x89, 0x46, - 0x8d, 0xb7, 0x90, 0x4a, 0x64, 0xe5, 0x78, 0xec, 0x3a, 0x7b, 0x63, 0x0a, 0x74, 0xc3, 0xce, 0x81, 0xe4, 0xcd, 0xa8, 0x63, 0x4d, 0x1a, 0x9e, 0xc2, 0x81, 0xea, 0x73, 0x66, 0x33, 0xef, 0xb9, 0x45, - 0xe9, 0x50, 0xbf, 0x9e, 0x63, 0x82, 0xf5, 0xac, 0xe1, 0x98, 0x94, 0xcd, 0xc0, 0xb1, 0x9c, 0xf0, 0xb3, 0xf9, 0x4f, 0x3c, 0x35, 0xff, 0xdf, 0xa8, 0x9e, 0x00, 0x7c, 0x6d, 0x9f, 0x8f, 0xd2, 0xef, - 0x01, 0xe0, 0x3c, 0x27, 0xdc, 0x39, 0x84, 0x8d, 0x53, 0x39, 0x6e, 0xba, 0x6c, 0x3f, 0x97, 0x65, 0xb4, 0x50, 0x3d, 0x2d, 0x75, 0x41, 0x0e, 0xf2, 0x7d, 0x25, 0xd9, 0xea, 0x7a, 0xb0, 0x37, 0x23, - 0xc0, 0xdb, 0xc1, 0xea, 0x38, 0xdd, 0x89, 0xfb, 0x71, 0x08, 0x78, 0xcb, 0xca, 0xe0, 0x8d, 0xf1, 0xde, 0x18, 0x0e, 0xe1, 0x08, 0x99, 0x5a, 0x21, 0x16, 0xc2, 0xa3, 0xc9, 0x6a, 0x7c, 0xc0, 0x76, - 0x4a, 0xc8, 0xda, 0x55, 0xd4, 0x53, 0x14, 0x1f, 0xad, 0x24, 0x89, 0xae, 0xd5, 0xd2, 0xb0, 0xa7, 0x22, 0x55, 0xbd, 0x12, 0x25, 0x53, 0xaf, 0x0e, 0x73, 0xb7, 0xfa, 0xc2, 0x6e, 0xf8, 0xb9, 0xdb, - 0xe3, 0x4a, 0x13, 0x1c, 0xbc, 0xb6, 0xfa, 0x9e, 0xa5, 0x12, 0x39, 0x09, 0xcd, 0x79, 0xeb, 0xdd, 0x3a, 0x25, 0xa8, 0x6e, 0x5a, 0x67, 0x26, 0xe4, 0x01, 0xf0, 0x12, 0x39, 0xaa, 0x33, 0xb7, 0xed, - 0xd6, 0xb9, 0xd5, 0x2c, 0x54, 0x4c, 0x1b, 0xd1, 0xe8, 0xa6, 0xe5, 0xc0, 0x56, 0x98, 0x46, 0xde, 0x94, 0xdc, 0xf9, 0x52, 0xb2, 0x57, 0x4d, 0x15, 0x60, 0xe8, 0xa1, 0x30, 0xb4, 0x05, 0x7d, 0x26, - 0x0f, 0xa1, 0x26, 0x39, 0xe4, 0x6a, 0x3e, 0xe6, 0x10, 0xb4, 0xda, 0x20, 0xdf, 0x69, 0x17, 0xdf, 0xab, 0xda, 0x7d, 0xf6, 0x23, 0xa6, 0x9f, 0x17, 0x8e, 0x47, 0x9e, 0xaa, 0x7d, 0x95, 0x5e, 0xaa, - 0xc5, 0x9f, 0x2b, 0xc2, 0x20, 0xfd, 0xaa, 0x5d, 0xa9, 0xb2, 0xb0, 0x5d, 0x79, 0x13, 0x05, 0x85, 0x4b, 0x7e, 0x15, 0x59, 0x65, 0x35, 0x5a, 0xcf, 0x38, 0x73, 0xb1, 0x64, 0x83, 0x76, 0xe1, 0x80, - 0xcb, 0x32, 0xce, 0x7d, 0x3a, 0x1b, 0x25, 0x7c, 0x5d, 0xfb, 0xb8, 0x15, 0x4b, 0xed, 0x2e, 0x92, 0x68, 0x4a, 0xac, 0xbc, 0xcc, 0x76, 0xf2, 0xdc, 0xa9, 0x17, 0x84, 0x4b, 0x28, 0x15, 0x61, 0xed, - 0x4c, 0x7d, 0x44, 0x03, 0xba, 0xbd, 0x5d, 0xd4, 0x61, 0x24, 0x7e, 0xe7, 0x37, 0xfa, 0xa0, 0x0e, 0x5c, 0x91, 0xf8, 0xf5, 0x54, 0xa1, 0xf3, 0xff, 0xf8, 0x77, 0xac, 0x67, 0x85, 0x83, 0x33, 0x30, - 0xee, 0x67, 0x01, 0x51, 0xf8, 0x05, 0x7f, 0x46, 0xdc, 0x5e, 0x89, 0xbe, 0xe2, 0xee, 0xda, 0x83, 0x0b, 0xa1, 0xef, 0xb1, 0xaf, 0x04, 0x15, 0x6b, 0x36, 0xa4, 0x6b, 0x24, 0x6d, 0xad, 0xcd, 0x0f, - 0xfb, 0xfd, 0x81, 0x63, 0x20, 0xa1, 0x89, 0xc2, 0xcd, 0x3a, 0x9a, 0x90, 0xca, 0x91, 0xb6, 0x45, 0x5c, 0xd6, 0x0e, 0xcc, 0x78, 0x34, 0x4c, 0x55, 0xa3, 0xe5, 0x83, 0x32, 0x17, 0xf9, 0xbd, 0x21, - 0x8a, 0xfc, 0x42, 0x98, 0x53, 0xe3, 0x99, 0x3d, 0x01, 0xe0, 0x89, 0xb2, 0x49, 0xf8, 0x7c, 0x01, 0xab, 0x63, 0x24, 0x53, 0xd1, 0xc0, 0x68, 0xbf, 0xc3, 0xfe, 0xaf, 0x1b, 0xba, 0x6f, 0x45, 0x87, - 0x1e, 0x0f, 0x60, 0xf8, 0x05, 0xfd, 0xb9, 0xfb, 0xe0, 0x37, 0xdd, 0x57, 0x3c, 0xcf, 0x17, 0x83, 0x0b, 0xb9, 0xef, 0x21, 0x35, 0x19, 0x03, 0xb0, 0x85, 0x14, 0xef, 0x14, 0x65, 0x0a, 0x18, 0xc5, - 0xb8, 0xa4, 0xd5, 0x61, 0xb6, 0x80, 0xd4, 0x60, 0x36, 0x36, 0x04, 0x05, 0x12, 0x6b, 0x05, 0x5e, 0x9b, 0xda, 0xb4, 0xc5, 0x2a, 0x00, 0x50, 0xd6, 0x5b, 0x27, 0xd8, 0x58, 0x0a, 0x14, 0x10, 0x00, - 0x26, 0x21, 0xcd, 0x0c, 0x5b, 0xc5, 0x62, 0xdc, 0x1d, 0x2b, 0x6e, 0x04, 0x77, 0x87, 0x46, 0x5b, 0xe2, 0x50, 0xd8, 0x59, 0x9e, 0x1e, 0x7d, 0x27, 0x0d, 0x3e, 0x17, 0xc8, 0xbf, 0x07, 0xdc, 0xeb, - 0xe8, 0xfa, 0xe9, 0xd0, 0xee, 0xcd, 0x8f, 0xdf, 0xfb, 0xeb, 0x1f, 0xb1, 0xe3, 0xb9, 0x52, 0xc6, 0x6f, 0x54, 0xcf, 0xcc, 0xb8, 0xb6, 0xfb, 0x96, 0x31, 0x9e, 0x93, 0x05, 0x81, 0x86, 0x52, 0x44, - 0xc7, 0x7b, 0x78, 0xcd, 0x4c, 0xf6, 0x7b, 0x58, 0x23, 0x23, 0x94, 0x04, 0x46, 0xc7, 0x59, 0xc9, 0x6b, 0x3c, 0xae, 0x8b, 0x22, 0xdd, 0x99, 0xe8, 0x86, 0x77, 0x96, 0x90, 0xb0, 0x3e, 0xda, 0xfb, - 0xc2, 0x4f, 0x37, 0xe0, 0x1a, 0xc2, 0xbb, 0x29, 0xdd, 0xed, 0xc5, 0xa1, 0x2a, 0x1f, 0x27, 0x8e, 0x4e, 0xd4, 0xa8, 0xca, 0x03, 0x0b, 0xdc, 0xda, 0x8d, 0x44, 0x7e, 0xc6, 0x3d, 0xcf, 0x0a, 0xbb, - 0xb4, 0x1c, 0x6f, 0xe0, 0x1d, 0x0a, 0x2b, 0x7b, 0x05, 0xe5, 0xbc, 0x03, 0x9a, 0xfc, 0x21, 0x4b, 0xfe, 0x6b, 0x5f, 0x6e, 0x44, 0x9f, 0xaa, 0xdc, 0x27, 0xf8, 0x7e, 0xee, 0xb5, 0x7e, 0x25, 0xfa, - 0xca, 0x8b, 0xa8, 0xaa, 0xcf, 0x4a, 0x5d, 0x0f, 0x9f, 0xf5, 0xbc, 0x8a, 0xb3, 0x2d, 0x66, 0xef, 0x51, 0x63, 0xbe, 0x33, 0x3a, 0xdb, 0x3d, 0x8e, 0xa2, 0x75, 0x25, 0x68, 0x9c, 0xe0, 0xf3, 0x00, - 0xa0, 0xb2, 0x2c, 0x89, 0x0d, 0xc7, 0x87, 0x8a, 0x28, 0xbc, 0x71, 0x83, 0xeb, 0x01, 0x96, 0x95, 0x5e, 0x66, 0x11, 0xfc, 0xe6, 0xc0, 0x1b, 0x87, 0x52, 0x54, 0x76, 0xfb, 0x3d, 0x34, 0x4f, 0xf7, - 0x35, 0x20, 0x79, 0x3e, 0x55, 0x06, 0x41, 0x93, 0x6e, 0x95, 0x65, 0xf7, 0xbe, 0x50, 0xc8, 0xf7, 0xfb, 0x98, 0xd2, 0xaf, 0x64, 0xc5, 0x13, 0x83, 0xf3, 0x2c, 0x22, 0x2e, 0xa2, 0xa1, 0xc7, 0x70, - 0xac, 0xd8, 0xad, 0x70, 0x00, 0x36, 0xf1, 0xaa, 0x4e, 0x69, 0x62, 0xa5, 0x23, 0x64, 0x4e, 0x63, 0xd3, 0xd1, 0x74, 0xb2, 0x9c, 0x8e, 0x4d, 0x13, 0x93, 0x31, 0x7d, 0xe7, 0xb1, 0xbc, 0x3e, 0x6e, - 0x09, 0xaa, 0x56, 0x80, 0xd8, 0x46, 0xdb, 0x2d, 0x28, 0x1d, 0xad, 0x85, 0x26, 0x40, 0x82, 0xb2, 0x38, 0x6a, 0x75, 0xba, 0x94, 0x57, 0x90, 0x0d, 0x58, 0xae, 0xaa, 0x4c, 0x5a, 0xbb, 0x82, 0x85, - 0x89, 0xc5, 0x9d, 0xf5, 0x84, 0xcf, 0x3f, 0x38, 0x7b, 0x77, 0xd6, 0xc8, 0xe3, 0xb1, 0x80, 0x3e, 0x51, 0x68, 0xe4, 0x8e, 0x32, 0x38, 0xb8, 0xbf, 0x1e, 0x9c, 0x69, 0x7e, 0x8f, 0x88, 0xdf, 0x66, - 0xfa, 0xb0, 0x36, 0x6d, 0x89, 0xd4, 0xfc, 0x31, 0x8b, 0x8f, 0xe8, 0x23, 0x7a, 0xe4, 0xc1, 0x6c, 0xbc, 0x3c, 0xc6, 0x1b, 0x8d, 0x21, 0x56, 0x41, 0x38, 0xd9, 0x41, 0x1d, 0x3e, 0x65, 0xfc, 0x35, - 0x60, 0xea, 0xc5, 0x52, 0x5b, 0xcf, 0x94, 0x91, 0x6b, 0x47, 0xfe, 0x41, 0xdc, 0x8a, 0x08, 0xee, 0xd9, 0x25, 0x4c, 0xb0, 0xd0, 0x9a, 0xf4, 0x24, 0x6d, 0x1e, 0x55, 0xbc, 0xb3, 0x9a, 0x70, 0x2c, - 0xfa, 0xf5, 0xf6, 0xa4, 0xd3, 0x45, 0xfa, 0x69, 0xe6, 0xd9, 0xd9, 0x79, 0x30, 0x7c, 0x0a, 0x8c, 0xf4, 0x9c, 0x6b, 0x76, 0x6d, 0x5d, 0x1c, 0x53, 0xc3, 0xef, 0x11, 0xc0, 0x8a, 0x16, 0xf6, 0x11, - 0x7b, 0xc5, 0xc4, 0xd0, 0xc4, 0x0b, 0xc0, 0x55, 0xc8, 0xee, 0x0e, 0x65, 0xdd, 0x7a, 0x9e, 0x88, 0x83, 0x2c, 0xa8, 0x6e, 0xbc, 0x61, 0xc4, 0x13, 0x8d, 0x62, 0x76, 0x71, 0x26, 0x25, 0x8d, 0x4c, - 0x63, 0xc2, 0x46, 0xf3, 0xa9, 0xb1, 0x36, 0x1c, 0x2e, 0x55, 0x61, 0xcf, 0x8e, 0x50, 0x6f, 0x3d, 0xa3, 0xc9, 0x4e, 0x9d, 0xe6, 0x02, 0x49, 0x1a, 0xcd, 0x8c, 0x0c, 0x79, 0x07, 0xfa, 0xce, 0x0b, - 0xf8, 0x5d, 0x91, 0xa8, 0x2f, 0xac, 0xd5, 0x30, 0xdf, 0x46, 0xae, 0xf5, 0xbb, 0x42, 0xf4, 0x9d, 0x0b, 0xd9, 0xf5, 0xec, 0x26, 0xb8, 0xde, 0x42, 0xee, 0x8b, 0x0d, 0x3f, 0xda, 0x34, 0xf9, 0xeb, - 0xe3, 0x89, 0x60, 0xdf, 0x14, 0x69, 0x29, 0xaa, 0xba, 0xf4, 0xbc, 0x97, 0xd2, 0x4b, 0x8f, 0x6f, 0xd2, 0xf3, 0xae, 0x12, 0xe1, 0x4d, 0xbd, 0x63, 0xfc, 0x85, 0xbc, 0xa7, 0x5d, 0x45, 0x69, 0x91, - 0x78, 0x83, 0xa6, 0x38, 0x27, 0xc2, 0x66, 0x79, 0x1d, 0xf9, 0xd1, 0xeb, 0xd1, 0x3f, 0xef, 0x0b, 0x2f, 0x5f, 0xf7, 0x85, 0x56, 0x03, 0x27, 0x4f, 0xf2, 0x57, 0x7a, 0xef, 0xac, 0xf3, 0x3a, 0x6f, - 0xde, 0x7e, 0xe7, 0xbb, 0x33, 0x17, 0x9a, 0xcc, 0xf5, 0xfc, 0xca, 0xf2, 0x7f, 0x7b, 0xa4, 0x1e, 0x1c, 0xfa, 0xf7, 0x41, 0x05, 0xfd, 0x3d, 0x34, 0xcf, 0x1e, 0xa9, 0xeb, 0xe5, 0x33, 0xda, 0x28, - 0x75, 0x9f, 0x15, 0xf6, 0xf6, 0x6f, 0x0f, 0x5d, 0x92, 0xaf, 0xbb, 0x67, 0xf3, 0xc2, 0xcb, 0x5e, 0xcf, 0xcd, 0x6f, 0xbd, 0xbb, 0xcf, 0xb9, 0x77, 0x5a, 0xde, 0x3f, 0x78, 0x76, 0x5e, 0xbe, 0xfe, - 0xf4, 0xd7, 0x37, 0x7e, 0x3b, 0xff, 0xee, 0x4f, 0x20, 0x7c, 0x1d, 0x38, 0x8f, 0xf5, 0x06, 0xe4, 0x09, 0xf1, 0x74, 0xa6, 0x78, 0x3e, 0x09, 0xda, 0x6e, 0x82, 0xc1, 0x99, 0xc6, 0xf7, 0x93, 0x71, - 0x3c, 0x8d, 0x3b, 0xc3, 0xa0, 0x23, 0x4c, 0x09, 0xfd, 0x48, 0x6c, 0xa3, 0xae, 0x9c, 0x8a, 0x5e, 0xab, 0x28, 0x3a, 0x57, 0x67, 0xe3, 0x9d, 0xe6, 0x7b, 0xe4, 0x01, 0xa6, 0xc3, 0x60, 0x52, 0x39, - 0x4a, 0x47, 0x98, 0xf6, 0xd2, 0xf6, 0xf3, 0xa5, 0xb4, 0x14, 0x9a, 0x40, 0x11, 0x8f, 0xa3, 0x3a, 0x24, 0x7c, 0xca, 0x9c, 0x48, 0x1b, 0x55, 0x3e, 0x6a, 0xdc, 0x94, 0x01, 0x49, 0xad, 0xc1, 0x6a, - 0xf8, 0xfd, 0x89, 0xed, 0x3f, 0xd0, 0x17, 0xd2, 0xea, 0xd7, 0xc7, 0xc4, 0xc0, 0x1f, 0x22, 0x1b, 0x5a, 0xd5, 0xc0, 0x4f, 0x3e, 0x2d, 0x07, 0x81, 0x3e, 0xe5, 0x9d, 0x78, 0x25, 0x7a, 0xad, 0x03, - 0x71, 0x6a, 0x0e, 0xd0, 0xef, 0x7d, 0x13, 0xf0, 0xa0, 0x76, 0x25, 0x15, 0x1d, 0xb3, 0x66, 0x19, 0xcd, 0xb5, 0xd4, 0x5f, 0xb3, 0x7e, 0x92, 0x73, 0x14, 0x99, 0x6c, 0x9a, 0x16, 0xfa, 0xa7, 0x4c, - 0x86, 0x3e, 0x25, 0x82, 0x1f, 0xc2, 0xf3, 0x26, 0x2f, 0x1e, 0xfb, 0x25, 0xc9, 0x27, 0xfc, 0x92, 0x17, 0x92, 0xe0, 0xe0, 0xda, 0x38, 0x1f, 0x64, 0xd3, 0xc3, 0x07, 0x59, 0x59, 0x8d, 0xc5, 0xf8, - 0xa0, 0x60, 0xba, 0x9b, 0xa0, 0x5c, 0x2a, 0x6b, 0x83, 0x93, 0xea, 0x42, 0xb7, 0xe0, 0x48, 0x8a, 0x16, 0x8e, 0xe5, 0xd9, 0xd1, 0x42, 0x84, 0x47, 0x73, 0xb7, 0x10, 0x13, 0x8d, 0x43, 0x92, 0x71, - 0xeb, 0x1d, 0x44, 0x57, 0xc7, 0xf1, 0x2a, 0x13, 0xa6, 0xc7, 0x05, 0x29, 0x76, 0x45, 0xe3, 0xee, 0xec, 0xf1, 0x0c, 0xda, 0xe9, 0x53, 0x9f, 0xb7, 0x2a, 0xce, 0x3d, 0xae, 0x19, 0xf6, 0xbb, 0xb1, - 0xf7, 0x41, 0x04, 0xfd, 0x96, 0x9f, 0x27, 0x09, 0x74, 0xbd, 0x7a, 0x16, 0xdb, 0xf7, 0x32, 0xf4, 0x31, 0xc6, 0xcf, 0x54, 0x8c, 0xbf, 0x27, 0x7d, 0xc2, 0xfa, 0xae, 0x63, 0x70, 0xa6, 0xfa, 0x3d, - 0xe6, 0x62, 0xbc, 0x89, 0xf7, 0xae, 0x3e, 0xab, 0x31, 0x88, 0x5a, 0xcd, 0x22, 0x7a, 0x37, 0xd6, 0xb1, 0x5c, 0x5d, 0x54, 0x81, 0x8a, 0x4c, 0x76, 0x34, 0xdb, 0x55, 0x88, 0x50, 0x6c, 0x53, 0xcc, - 0x12, 0x0d, 0x3b, 0x4e, 0x01, 0x73, 0xa2, 0x4d, 0x1c, 0x0d, 0x93, 0xfd, 0xe9, 0x5a, 0x29, 0xb1, 0x66, 0xb5, 0x36, 0x53, 0x0b, 0xf2, 0x8e, 0x98, 0x8f, 0x27, 0xc1, 0xb2, 0xdc, 0x8e, 0x20, 0x4b, - 0x87, 0xc4, 0xd5, 0x3f, 0x51, 0x83, 0xea, 0x66, 0xae, 0xbe, 0x1e, 0xad, 0xf0, 0x0a, 0xfd, 0x5f, 0x3b, 0x11, 0x8a, 0x2f, 0x4b, 0x16, 0xfc, 0x9c, 0x1d, 0x27, 0x8a, 0x67, 0xdd, 0xa7, 0xa8, 0x7b, - 0xa5, 0xd5, 0xc3, 0x03, 0xdb, 0x85, 0xc2, 0x56, 0xce, 0x0f, 0xa2, 0xde, 0xc8, 0x4e, 0x86, 0x6e, 0x42, 0x3f, 0x4a, 0x29, 0xd4, 0x98, 0x11, 0x00, 0xf6, 0x2c, 0x7a, 0x96, 0x6d, 0x97, 0xe7, 0xe7, - 0x7f, 0xf5, 0x89, 0xfe, 0x5c, 0x41, 0xb8, 0x2e, 0xb4, 0x45, 0xfd, 0xf3, 0x55, 0xb6, 0x8f, 0x15, 0x96, 0xe5, 0x65, 0x6a, 0x25, 0x51, 0xe7, 0x7d, 0xb5, 0x4d, 0xf5, 0x39, 0x19, 0x7c, 0x4f, 0xfa, - 0x8c, 0xfe, 0x6d, 0x47, 0x1f, 0x79, 0x7c, 0x9a, 0x02, 0x84, 0x67, 0x56, 0xf8, 0xb2, 0x42, 0xb5, 0x7a, 0x1c, 0x55, 0x9c, 0x56, 0x0c, 0x65, 0x84, 0x55, 0x8f, 0x94, 0xbb, 0xdb, 0x16, 0x6c, 0x84, - 0x8d, 0x36, 0x72, 0x87, 0xb2, 0xd6, 0x2e, 0x9a, 0x10, 0x5e, 0xd7, 0xd8, 0x10, 0x0e, 0x23, 0x13, 0xb9, 0xab, 0x75, 0x75, 0xaf, 0x8e, 0x88, 0x31, 0x31, 0x5b, 0xd8, 0xe2, 0xd6, 0x40, 0x84, 0xcc, - 0x06, 0x53, 0x06, 0xd3, 0x8c, 0x3c, 0x1e, 0x4b, 0x7b, 0x67, 0xbf, 0xfc, 0x4e, 0xff, 0xfc, 0x3e, 0x07, 0xb5, 0x9f, 0x33, 0xed, 0xc3, 0x81, 0xe7, 0x8f, 0xc7, 0x34, 0xfc, 0xcc, 0x2e, 0x83, 0x7b, - 0xda, 0xe0, 0xe0, 0x5d, 0xc7, 0xe0, 0x42, 0xf6, 0x7b, 0x80, 0x3d, 0x3c, 0x1d, 0xcf, 0x13, 0x99, 0x23, 0x8b, 0x9c, 0x5e, 0xfb, 0x63, 0xaa, 0xa3, 0xe4, 0x61, 0x35, 0x94, 0x91, 0xd9, 0x1a, 0x07, - 0x31, 0xd3, 0x46, 0x2d, 0x13, 0x45, 0x7d, 0xbc, 0xa2, 0x8c, 0x5d, 0x6e, 0x75, 0xe3, 0x69, 0xb7, 0x5e, 0x26, 0xf9, 0x52, 0xa5, 0x4a, 0x7c, 0x33, 0x66, 0x01, 0x96, 0xd4, 0xf2, 0xdd, 0xb2, 0xa5, - 0x69, 0x33, 0xdf, 0xac, 0x9c, 0x23, 0x5a, 0x17, 0x20, 0xaa, 0x43, 0x42, 0x72, 0x27, 0x63, 0xfe, 0x97, 0xc7, 0x99, 0x5f, 0xbf, 0xfc, 0x2b, 0x77, 0xfb, 0xcf, 0xfd, 0x6c, 0x6f, 0x54, 0x6f, 0xb0, - 0xad, 0xfa, 0x26, 0xe7, 0xa0, 0xce, 0x91, 0xa9, 0x8e, 0x5c, 0x50, 0xa7, 0x11, 0x39, 0x23, 0x19, 0x5f, 0x96, 0x67, 0xc8, 0x92, 0x29, 0x08, 0x79, 0x81, 0x24, 0xfb, 0xb6, 0xb6, 0x03, 0xa8, 0x80, - 0x24, 0xd8, 0x83, 0xa4, 0x56, 0xd9, 0x4d, 0x71, 0xc7, 0x63, 0x0f, 0xc0, 0x02, 0x71, 0x7d, 0x39, 0x4e, 0x61, 0x7b, 0xc1, 0xac, 0x36, 0xe3, 0xe9, 0x84, 0xa1, 0xc5, 0xf6, 0x08, 0xe4, 0x94, 0x43, - 0x58, 0xe4, 0xa6, 0x89, 0x79, 0xf7, 0xfd, 0xe1, 0x1f, 0x3f, 0x90, 0x3d, 0xdf, 0xe4, 0xe0, 0xb8, 0x9e, 0x1f, 0x65, 0xde, 0xa0, 0x28, 0xf3, 0xc2, 0x2b, 0xeb, 0xcb, 0x7f, 0xbf, 0x2f, 0xc2, 0xdf, - 0x77, 0x72, 0xfc, 0x4d, 0x39, 0x34, 0x57, 0x0e, 0x6d, 0xbd, 0xe3, 0x57, 0xa3, 0xe0, 0xe7, 0xda, 0xd2, 0x0d, 0xdd, 0xdf, 0xe3, 0xe0, 0x74, 0xd5, 0x77, 0xf7, 0xf6, 0xba, 0xa1, 0x27, 0xb2, 0xca, - 0xab, 0xab, 0x32, 0x99, 0xe9, 0xbc, 0xcf, 0x2d, 0x3a, 0x86, 0xb0, 0x0b, 0xa1, 0x41, 0x6b, 0xa3, 0x46, 0x0f, 0x6d, 0xbc, 0x76, 0xa5, 0x99, 0x08, 0x4c, 0x3d, 0x05, 0x4a, 0xd6, 0x36, 0xb6, 0xa0, - 0x34, 0x89, 0x84, 0xc6, 0x16, 0x73, 0x08, 0x9b, 0x75, 0xd0, 0xc8, 0x88, 0xce, 0x02, 0x6c, 0xbc, 0x3d, 0xae, 0xf6, 0x7c, 0x57, 0xad, 0x71, 0x73, 0x5b, 0xcf, 0x52, 0x3f, 0x5c, 0x3e, 0xbd, 0x45, - 0xf1, 0x3b, 0x00, 0x5f, 0xac, 0xaa, 0x8a, 0x82, 0xcf, 0xbc, 0x0f, 0xd8, 0x53, 0x5e, 0xa8, 0x3b, 0xca, 0x6f, 0x20, 0x5e, 0xaf, 0xcf, 0xe9, 0x1b, 0x3d, 0x7c, 0x53, 0xd1, 0x41, 0x41, 0x96, 0xb8, - 0xc2, 0xe9, 0x15, 0x5d, 0x1c, 0x23, 0x55, 0x30, 0x16, 0xa9, 0x06, 0x20, 0x13, 0xae, 0xd0, 0x75, 0x0f, 0x9f, 0x45, 0xe8, 0x0a, 0xf0, 0x31, 0x0f, 0xb0, 0xe6, 0x53, 0x9a, 0xb3, 0x72, 0xdc, 0x4a, - 0xa7, 0x92, 0x46, 0xcc, 0x21, 0x9e, 0x27, 0x1c, 0x70, 0xa9, 0x52, 0x23, 0x0f, 0x23, 0x9b, 0x7a, 0x7c, 0x40, 0xd8, 0x25, 0x35, 0x0c, 0x0f, 0xec, 0x88, 0xd0, 0xe5, 0x74, 0xd1, 0x3c, 0x9d, 0x9e, - 0x0d, 0xf5, 0x9d, 0x3d, 0x37, 0x8f, 0x3d, 0x4e, 0x51, 0xbb, 0x79, 0xe0, 0x7e, 0x08, 0xff, 0x33, 0xc5, 0x27, 0xff, 0x8e, 0xf9, 0x97, 0x0d, 0xbc, 0x43, 0x54, 0x0f, 0x12, 0xcf, 0xda, 0x0e, 0xfc, - 0xd2, 0xfb, 0x3c, 0x6a, 0xf7, 0x4c, 0xd6, 0xcf, 0x07, 0xea, 0xa7, 0x61, 0xf4, 0xbe, 0xaf, 0x6f, 0xe5, 0x8b, 0x4d, 0x33, 0xb6, 0x4c, 0x93, 0x8e, 0x25, 0xcf, 0x44, 0x5b, 0x75, 0x1f, 0xf0, 0x23, - 0x6a, 0x79, 0xa0, 0xf3, 0x6a, 0xd6, 0x94, 0x4c, 0x44, 0x6b, 0x50, 0x05, 0xa3, 0xe5, 0x0c, 0x36, 0xf6, 0xa9, 0x25, 0x00, 0x40, 0xdc, 0x3a, 0x07, 0x81, 0x24, 0x69, 0x2d, 0x17, 0x5b, 0x2f, 0x33, - 0x3d, 0xbb, 0x18, 0xd3, 0x48, 0x4a, 0x69, 0x63, 0x18, 0x9c, 0xe4, 0x95, 0x60, 0x08, 0xab, 0x38, 0x93, 0xe8, 0x02, 0xfc, 0xda, 0xcd, 0x79, 0x2d, 0xdf, 0xf4, 0x58, 0x2c, 0x3d, 0xb3, 0xe1, 0xfd, - 0x44, 0xf0, 0x8c, 0x81, 0xe3, 0x0d, 0xe0, 0xef, 0x37, 0xb7, 0xc3, 0x03, 0x8d, 0xa9, 0xac, 0x02, 0xd5, 0x34, 0x4e, 0xad, 0x24, 0xbe, 0x9a, 0x0e, 0xb3, 0xe9, 0x98, 0x20, 0x71, 0x54, 0xb7, 0x86, - 0x93, 0x67, 0x17, 0x95, 0x9f, 0x55, 0x9e, 0x7a, 0x7c, 0x64, 0xf4, 0x63, 0x44, 0x9e, 0x29, 0xcb, 0xf0, 0x80, 0xfe, 0x09, 0xa0, 0x8f, 0xbd, 0x7d, 0xcb, 0x34, 0xd8, 0xa4, 0x6e, 0xda, 0x69, 0xd8, - 0xc4, 0xd9, 0x6e, 0x9d, 0x2f, 0x20, 0x93, 0x58, 0x0b, 0x1d, 0x0d, 0x66, 0xa1, 0x2f, 0x66, 0x13, 0x88, 0x32, 0x15, 0x4e, 0xee, 0xba, 0x58, 0x59, 0xed, 0xbd, 0xc0, 0xc6, 0xd7, 0xc3, 0x7c, 0x44, - 0xd3, 0x74, 0x71, 0x40, 0xfd, 0x61, 0x83, 0x48, 0xa0, 0x8f, 0x6e, 0x58, 0x8b, 0x1e, 0x2b, 0x62, 0x4c, 0x88, 0xf3, 0x8c, 0x55, 0x7d, 0x1d, 0xce, 0xa7, 0x75, 0xbd, 0xf3, 0x7b, 0x26, 0xdd, 0xdc, - 0x66, 0xbd, 0xfc, 0xea, 0x7d, 0x30, 0xea, 0x83, 0x42, 0xd0, 0x9f, 0x1a, 0x51, 0x3f, 0xc6, 0xf7, 0x3d, 0x71, 0x70, 0xf0, 0xa1, 0xab, 0x5f, 0xd5, 0xb7, 0x29, 0xd4, 0xc8, 0x16, 0xb7, 0xde, 0xac, - 0x05, 0x80, 0xf2, 0x2a, 0xbc, 0x1c, 0x2a, 0x85, 0x95, 0x85, 0xb5, 0xa3, 0xc3, 0x8f, 0x0f, 0x54, 0xe8, 0x2b, 0xf8, 0x7a, 0x6b, 0xe5, 0xe7, 0x9f, 0xfd, 0xdd, 0xa1, 0xdd, 0x3f, 0xf7, 0xe8, 0xfd, - 0x26, 0xfb, 0x0a, 0xcd, 0xef, 0xa3, 0xb9, 0x7b, 0xf8, 0xf6, 0x96, 0xcc, 0xbc, 0x13, 0x36, 0x93, 0xc9, 0x44, 0x90, 0x80, 0x23, 0x46, 0x75, 0x43, 0x94, 0x86, 0x26, 0x2e, 0x74, 0xd4, 0x6d, 0xaa, - 0xa0, 0x47, 0x47, 0x56, 0xcb, 0xc1, 0x2d, 0x6e, 0x18, 0xae, 0x11, 0x14, 0x06, 0x02, 0x22, 0x93, 0x8a, 0xaf, 0xb6, 0xd5, 0xbc, 0xdc, 0x91, 0x09, 0xcf, 0x1d, 0xca, 0x63, 0xb9, 0xe1, 0x33, 0xd8, - 0x8b, 0x59, 0x22, 0xa7, 0x0b, 0xca, 0x0a, 0x5b, 0x7e, 0x26, 0x32, 0x54, 0xf5, 0x89, 0xc6, 0xf8, 0x05, 0x36, 0x91, 0x93, 0x7f, 0x15, 0x24, 0x3d, 0xcd, 0x9c, 0x27, 0xc6, 0xce, 0x2b, 0xd5, 0x13, - 0x32, 0xaf, 0xed, 0xf3, 0x31, 0x15, 0x3d, 0x14, 0xa8, 0xb9, 0x8a, 0xd6, 0x1e, 0xa7, 0xac, 0xe3, 0x74, 0x82, 0x6c, 0xc6, 0xec, 0xb4, 0x6b, 0x0c, 0x6a, 0xa2, 0x77, 0x63, 0x66, 0xb3, 0x9f, 0xec, - 0x46, 0x88, 0x45, 0xf9, 0xd5, 0xac, 0xdd, 0x5b, 0x72, 0xcd, 0x85, 0xb4, 0x36, 0x9f, 0x78, 0x1b, 0x17, 0xce, 0x61, 0x91, 0xa1, 0xa0, 0xb1, 0x4a, 0x00, 0xa6, 0x3b, 0xd1, 0x75, 0x79, 0x69, 0xcb, - 0x55, 0xb3, 0xdc, 0xcf, 0xe3, 0xed, 0x78, 0xa4, 0xed, 0x24, 0x51, 0xdd, 0xfc, 0x93, 0x16, 0x20, 0x75, 0x13, 0x71, 0xfe, 0xa7, 0xd7, 0xd8, 0x38, 0xcf, 0x2a, 0x27, 0x4c, 0xa2, 0x6c, 0xeb, 0xfd, - 0xae, 0xf4, 0xf8, 0xd5, 0xf8, 0xbd, 0x9c, 0xe9, 0xf8, 0x88, 0x3d, 0xd4, 0xe5, 0xf8, 0x9b, 0x9f, 0xf3, 0x27, 0xcb, 0xcf, 0xac, 0xc9, 0xf2, 0xc1, 0x85, 0xc4, 0xf7, 0x6c, 0x31, 0x11, 0x6f, 0x21, - 0xb7, 0x49, 0x99, 0x20, 0x25, 0x47, 0x15, 0xb8, 0xd7, 0x7a, 0x6b, 0x35, 0x53, 0x5c, 0x17, 0xa3, 0xe3, 0xf9, 0x96, 0xaa, 0xe9, 0x6a, 0xb9, 0xe5, 0x0c, 0x53, 0x5c, 0xb0, 0x9c, 0x80, 0x69, 0x4a, - 0x88, 0xb0, 0x11, 0xec, 0xf0, 0x32, 0x5f, 0xa1, 0x9e, 0x26, 0xec, 0xac, 0x18, 0xc8, 0x22, 0x19, 0x0d, 0x62, 0x4c, 0xdd, 0xe6, 0xa5, 0x97, 0x5b, 0x5a, 0x30, 0x45, 0x4d, 0xcd, 0xe8, 0x29, 0x1e, - 0xad, 0x3a, 0x4f, 0x23, 0x67, 0x50, 0x25, 0x9e, 0x57, 0x3c, 0xd6, 0xc9, 0xee, 0x4f, 0x2e, 0xbe, 0x44, 0x40, 0xee, 0x95, 0xad, 0x07, 0xfa, 0xca, 0x83, 0xc3, 0xa9, 0xcf, 0x90, 0xbc, 0x9d, 0xfc, - 0x59, 0x97, 0x56, 0x56, 0x9d, 0xeb, 0x71, 0xfe, 0xdb, 0x1f, 0xbf, 0xda, 0x0f, 0x2f, 0x3d, 0x3f, 0x5c, 0xd5, 0xee, 0xa0, 0xf2, 0xca, 0xe8, 0xec, 0xea, 0x28, 0x2f, 0x9a, 0x1c, 0xf1, 0xe1, 0xc9, - 0x3e, 0x89, 0x93, 0xbb, 0x26, 0x72, 0xb6, 0xd7, 0xe3, 0xb7, 0x07, 0x4d, 0xe6, 0x55, 0x8e, 0x55, 0x78, 0xbf, 0x93, 0xff, 0xee, 0x94, 0xcb, 0xd2, 0xb3, 0x92, 0x73, 0x56, 0x69, 0x54, 0xbe, 0xe6, - 0x6a, 0xbe, 0x3b, 0x7d, 0xf4, 0x7a, 0x24, 0xf0, 0x79, 0xd3, 0xc6, 0xed, 0x79, 0xc4, 0xa7, 0x17, 0xa3, 0xef, 0x02, 0x51, 0x79, 0x16, 0x39, 0x03, 0x3b, 0xcf, 0xd3, 0x5f, 0x0f, 0xa3, 0x47, 0x75, - 0x58, 0x7a, 0xd6, 0xdd, 0x89, 0x5b, 0x9f, 0xd4, 0xe9, 0xfa, 0xe0, 0xd5, 0x7a, 0x3d, 0x8e, 0xd4, 0x8e, 0xb2, 0x7e, 0x89, 0xcc, 0x9f, 0xe3, 0xff, 0x99, 0xe0, 0x7e, 0x6e, 0xf4, 0x3f, 0x78, 0xc7, - 0xeb, 0x84, 0xf8, 0x78, 0xa7, 0x6f, 0x46, 0xb3, 0x43, 0xb6, 0x39, 0xce, 0x17, 0x1a, 0xb6, 0x9f, 0xc9, 0x18, 0x12, 0xaa, 0x1b, 0x47, 0xc1, 0xa5, 0x49, 0xb5, 0xa4, 0xcc, 0x24, 0xae, 0x54, 0x7f, - 0x14, 0xef, 0x36, 0xa0, 0x87, 0x54, 0xd3, 0x43, 0x3a, 0x9d, 0x4c, 0xcd, 0x68, 0x07, 0xeb, 0x4b, 0xb5, 0xc0, 0x27, 0xc6, 0xb2, 0x6e, 0x18, 0x8e, 0x10, 0x26, 0xdc, 0x6e, 0xa8, 0xc1, 0x5e, 0xa0, - 0xed, 0x24, 0x3b, 0x5b, 0xaa, 0x02, 0x3e, 0x6d, 0xcc, 0x94, 0xef, 0x99, 0xe7, 0x78, 0xe2, 0xd0, 0x2b, 0xaf, 0x5f, 0xb9, 0x84, 0x7d, 0x48, 0xcd, 0x2d, 0x92, 0xa8, 0x46, 0x7e, 0x7d, 0xcc, 0x85, - 0xfc, 0x86, 0x21, 0x1f, 0xc7, 0xf8, 0x23, 0x6e, 0x10, 0x4f, 0xa5, 0xe6, 0x3e, 0x7a, 0xc1, 0x2b, 0x2b, 0xde, 0x75, 0x0f, 0x88, 0x7e, 0x09, 0xbb, 0x33, 0x2d, 0x90, 0x3b, 0x75, 0x49, 0xe9, 0xf0, - 0x1e, 0x1b, 0xcd, 0x34, 0x65, 0x3f, 0x29, 0xa5, 0xa0, 0xde, 0x50, 0xc2, 0x91, 0x67, 0x79, 0x3e, 0x22, 0xa0, 0x66, 0xd7, 0x42, 0xf9, 0xa2, 0x91, 0x41, 0x9f, 0xa7, 0xa9, 0xb5, 0x93, 0x83, 0xbc, - 0x37, 0x23, 0x92, 0x51, 0xe3, 0x60, 0xee, 0x51, 0xa0, 0x56, 0x2b, 0xdf, 0x9d, 0xee, 0x8f, 0xdc, 0x4e, 0x59, 0x39, 0xa3, 0x19, 0x4d, 0x66, 0x4c, 0xb4, 0x9b, 0xec, 0xbe, 0x3e, 0x16, 0xe7, 0x3a, - 0xc1, 0x3f, 0x41, 0x06, 0x3a, 0xc9, 0xd8, 0x27, 0xfc, 0xd8, 0x57, 0xaa, 0x27, 0x38, 0xae, 0x02, 0xe4, 0x4a, 0xe9, 0x7b, 0x0c, 0x1c, 0x97, 0xf5, 0x7c, 0xd0, 0x2d, 0xb5, 0x69, 0x7e, 0x74, 0x19, - 0x78, 0x5e, 0xad, 0xba, 0x66, 0xea, 0x53, 0x30, 0x04, 0x65, 0x66, 0x02, 0xb0, 0x0a, 0x70, 0xb4, 0x1c, 0x07, 0xb1, 0x27, 0x8e, 0xe7, 0xe2, 0xfe, 0x50, 0x8a, 0xb7, 0x58, 0x07, 0x68, 0xf5, 0x54, - 0x55, 0x46, 0xcd, 0x50, 0x08, 0xf9, 0x68, 0x18, 0x83, 0xb1, 0x9f, 0x8e, 0x84, 0x06, 0x4a, 0x57, 0x13, 0x03, 0xdb, 0xcf, 0x5c, 0x7a, 0x4a, 0xfd, 0xd0, 0x0d, 0x41, 0xf4, 0x1b, 0x61, 0x1f, 0x64, - 0xe3, 0x63, 0x45, 0xe4, 0xa9, 0xc1, 0x75, 0x4f, 0xfb, 0x06, 0xc8, 0x6b, 0x4f, 0xdf, 0x43, 0xc1, 0x41, 0x58, 0x33, 0x29, 0x60, 0x23, 0xc6, 0x12, 0x61, 0xb5, 0x1a, 0x1f, 0x70, 0xde, 0x44, 0x70, - 0x49, 0x99, 0x11, 0xd3, 0xa9, 0x08, 0x8f, 0xf0, 0x74, 0x0c, 0x7b, 0x92, 0x5e, 0x8d, 0x53, 0x5c, 0xb1, 0xca, 0x64, 0x9d, 0x1e, 0xc0, 0xfd, 0xb8, 0xb2, 0x70, 0x76, 0x62, 0x1d, 0xd8, 0x14, 0xc2, - 0x47, 0xbc, 0x24, 0xd5, 0x47, 0x16, 0x9c, 0x1c, 0x40, 0xf4, 0xb0, 0x43, 0x95, 0x46, 0x6a, 0x77, 0x38, 0xb9, 0xfb, 0x7a, 0xb3, 0x42, 0x51, 0xe6, 0xe9, 0xc0, 0x49, 0xa2, 0xcf, 0x4f, 0x4a, 0x81, - 0xb1, 0xa7, 0x5c, 0x5c, 0x37, 0x84, 0x2f, 0x80, 0xbc, 0x5e, 0x0d, 0x2e, 0x04, 0xbf, 0x47, 0x23, 0x9c, 0xaa, 0x28, 0xb2, 0x23, 0x55, 0x53, 0xc4, 0x87, 0xf6, 0x66, 0x2e, 0xb2, 0x6a, 0x9d, 0xa2, - 0x33, 0x44, 0x28, 0xe7, 0x68, 0xa0, 0xb5, 0xf9, 0x78, 0x1b, 0x25, 0xfa, 0xb0, 0x9a, 0xc2, 0x04, 0xbe, 0xad, 0xe0, 0x9d, 0x9f, 0x84, 0x4d, 0xb0, 0x19, 0x7b, 0x0b, 0x40, 0x86, 0xe7, 0xf1, 0xdc, - 0xe0, 0xda, 0x63, 0x8d, 0xe6, 0xf8, 0x36, 0x26, 0x28, 0x60, 0x87, 0xda, 0x4e, 0x98, 0x97, 0x69, 0x9c, 0xf5, 0x3d, 0xb4, 0xa3, 0x76, 0xa3, 0xe0, 0xf5, 0xf8, 0x6b, 0xe8, 0x29, 0x8f, 0x49, 0xaf, - 0x84, 0xee, 0xbb, 0x93, 0xb0, 0x1f, 0x0f, 0xc8, 0xa7, 0x8c, 0x86, 0x37, 0xb2, 0x17, 0xe8, 0xaf, 0x17, 0xe7, 0xf4, 0x9c, 0x1e, 0x46, 0x43, 0x92, 0x88, 0xd5, 0x6a, 0x29, 0xab, 0x8c, 0x2a, 0x28, - 0x18, 0x16, 0xbb, 0xa5, 0x0a, 0xf2, 0x28, 0xb9, 0x4b, 0xb2, 0xc8, 0x8f, 0x6a, 0x46, 0x00, 0xcc, 0x7d, 0x99, 0xa6, 0xa6, 0x93, 0xcb, 0x8b, 0xe3, 0x72, 0xd1, 0xd6, 0xe6, 0xa1, 0x38, 0x6e, 0xa0, - 0x0c, 0x01, 0x6d, 0x06, 0x5c, 0x63, 0xf5, 0x88, 0xa6, 0x4d, 0x30, 0x98, 0x4f, 0x5c, 0x53, 0x25, 0x17, 0xab, 0xd2, 0xca, 0x17, 0x30, 0xa0, 0x1b, 0x74, 0x4f, 0x25, 0xec, 0xf6, 0xa8, 0xc3, 0x5f, - 0x1f, 0xd4, 0x8d, 0xdb, 0x2a, 0xcb, 0xd7, 0x92, 0xca, 0x3f, 0xe5, 0x4b, 0xdf, 0xa2, 0xc4, 0xf7, 0x49, 0x37, 0x9f, 0xb9, 0x7e, 0xa9, 0x9f, 0xf3, 0xe6, 0x37, 0xdd, 0x13, 0x73, 0x7e, 0x5f, 0x9d, - 0x5d, 0xbf, 0xd4, 0xf7, 0xdc, 0x21, 0x49, 0xc6, 0xdc, 0x1f, 0xc4, 0xf4, 0xb0, 0xc8, 0x1a, 0xd4, 0x92, 0x70, 0x0c, 0x51, 0x01, 0x9d, 0x9a, 0x1e, 0x8b, 0x75, 0x67, 0xfb, 0x73, 0x60, 0x8c, 0xeb, - 0x22, 0xb3, 0x45, 0x1b, 0x2d, 0xd6, 0x0e, 0x19, 0x01, 0xe3, 0xb0, 0x35, 0x5b, 0xb1, 0x75, 0xa8, 0x19, 0x92, 0xae, 0xec, 0x14, 0x78, 0x82, 0xe7, 0xf3, 0x36, 0x00, 0x92, 0xd8, 0xb2, 0x10, 0x7e, - 0x1e, 0x01, 0x1b, 0xbf, 0x1d, 0xf3, 0x22, 0xf5, 0x73, 0x93, 0xae, 0xc9, 0x8e, 0xce, 0x05, 0xd4, 0xcf, 0x2c, 0xba, 0x27, 0x04, 0xe9, 0x95, 0xe8, 0x09, 0x98, 0x6b, 0xf3, 0x6c, 0xcf, 0xf5, 0x10, - 0x9d, 0xa5, 0xb4, 0x01, 0x3a, 0x91, 0xa1, 0xea, 0xcd, 0xf4, 0x58, 0x21, 0x44, 0x42, 0xb3, 0xd2, 0x50, 0x53, 0x1b, 0x19, 0x8b, 0x54, 0x3a, 0x0b, 0xe6, 0xb2, 0xb3, 0x02, 0x4c, 0x49, 0x5e, 0xd4, - 0x6d, 0x82, 0xd7, 0x0b, 0xcf, 0x44, 0x6a, 0xdc, 0x6e, 0xdd, 0xf5, 0xd4, 0x5d, 0x73, 0x23, 0x6d, 0x38, 0xd5, 0x24, 0x2c, 0x68, 0x58, 0x2e, 0x09, 0xd2, 0xca, 0x84, 0x59, 0x72, 0x24, 0xa7, 0xc8, - 0x5e, 0xb1, 0x9b, 0x9f, 0xac, 0x44, 0x7d, 0x92, 0x85, 0x77, 0x9f, 0x2b, 0x35, 0xf0, 0x33, 0x32, 0x76, 0x77, 0x5a, 0xb4, 0x77, 0x27, 0x8d, 0x05, 0xee, 0x25, 0x51, 0xa1, 0x7d, 0x55, 0x76, 0x81, - 0xd2, 0x81, 0x5b, 0x7a, 0x33, 0xf3, 0x9a, 0x83, 0x1c, 0x67, 0x05, 0x3b, 0xc6, 0x89, 0xb2, 0x33, 0xea, 0x92, 0x98, 0x2b, 0x20, 0x32, 0xda, 0x4f, 0xda, 0x95, 0x25, 0x84, 0xd3, 0x59, 0x6e, 0x58, - 0xb0, 0xc5, 0xf2, 0xd4, 0xd2, 0xee, 0x1a, 0x15, 0x96, 0xa0, 0x46, 0x35, 0xc4, 0xed, 0xb2, 0xd0, 0x46, 0x0a, 0x1f, 0x43, 0x09, 0x38, 0x5e, 0xd2, 0xf3, 0x11, 0x81, 0xcd, 0x89, 0xac, 0xa7, 0xbb, - 0xbb, 0x8a, 0x5c, 0x6f, 0xe0, 0x84, 0x56, 0x96, 0x79, 0x67, 0xdb, 0xf5, 0xdd, 0x09, 0xf2, 0x7d, 0x61, 0x86, 0xfe, 0x4a, 0x1b, 0xb9, 0xb7, 0x1f, 0xfa, 0x53, 0xa3, 0xe9, 0x11, 0x33, 0xb1, 0xa7, - 0x0a, 0x32, 0x3c, 0x7e, 0xc5, 0x89, 0xbf, 0x0f, 0x6f, 0x9c, 0xab, 0xbf, 0xf5, 0x28, 0xd5, 0x50, 0x1b, 0x63, 0x58, 0x84, 0xc3, 0xe0, 0x28, 0x35, 0x5c, 0x90, 0xe4, 0x1b, 0xd0, 0xd0, 0x2b, 0x64, - 0x0f, 0xe3, 0x4d, 0x26, 0x6c, 0x42, 0x6a, 0xe7, 0x37, 0xe0, 0x6e, 0xac, 0xf8, 0xa1, 0x62, 0x58, 0xa9, 0xb5, 0x27, 0xfd, 0x63, 0xd8, 0xa4, 0x0b, 0x0b, 0x39, 0xb2, 0x85, 0x2b, 0xe7, 0x14, 0xd9, - 0x1a, 0x28, 0x52, 0xce, 0x9c, 0x24, 0x06, 0x30, 0x5f, 0x33, 0x44, 0x5d, 0x5d, 0x55, 0xc3, 0x09, 0xd7, 0x7e, 0xad, 0x52, 0x7c, 0x34, 0x12, 0x1e, 0xa3, 0xf4, 0x8c, 0x84, 0x78, 0x47, 0x1b, 0x1c, - 0xbc, 0xef, 0x19, 0x60, 0xfd, 0xe4, 0xc5, 0xaa, 0x99, 0x64, 0x34, 0x94, 0xd8, 0x72, 0x44, 0xce, 0x65, 0x4a, 0x5f, 0x01, 0xda, 0x7a, 0x9e, 0x68, 0xe6, 0x96, 0xa3, 0x69, 0x37, 0x25, 0x83, 0x89, - 0xc2, 0xb9, 0xd3, 0x05, 0x08, 0x8a, 0x60, 0x3a, 0x0e, 0xd9, 0x63, 0x8c, 0x58, 0xdb, 0xc9, 0xb4, 0x76, 0x97, 0x66, 0x88, 0x22, 0xb1, 0xec, 0x6e, 0x35, 0xd6, 0x96, 0xf6, 0x63, 0x6d, 0x58, 0x64, - 0x44, 0x80, 0x2e, 0x35, 0xc6, 0x65, 0x3c, 0x33, 0x1b, 0xf5, 0x9c, 0x0a, 0x96, 0x7d, 0x32, 0xf7, 0x9c, 0x3c, 0xab, 0xcb, 0x3c, 0x49, 0xbc, 0xd7, 0xb4, 0xd2, 0x77, 0x66, 0x94, 0xdd, 0xf8, 0xfe, - 0xf5, 0x1e, 0xf1, 0xde, 0x30, 0x7f, 0x3b, 0xf2, 0xf5, 0xf4, 0x7f, 0xef, 0x0f, 0xee, 0x7b, 0x33, 0x12, 0xce, 0xaa, 0x0b, 0x7c, 0xbb, 0xdc, 0xf5, 0x9b, 0x65, 0x7f, 0xc2, 0xc8, 0x0b, 0x82, 0xbc, - 0x9e, 0x68, 0x8a, 0xbd, 0xc0, 0xe4, 0xdb, 0x91, 0xa6, 0x44, 0x4f, 0x83, 0xee, 0xc4, 0x15, 0x37, 0x2a, 0x3f, 0x2b, 0x3d, 0x80, 0x3e, 0xb5, 0xcb, 0xea, 0x95, 0xe8, 0x95, 0xeb, 0xa7, 0xe6, 0x00, - 0xed, 0xb7, 0xdb, 0x2a, 0xe4, 0x65, 0x88, 0x1a, 0xe6, 0x19, 0x25, 0xb9, 0xcd, 0xce, 0xb5, 0xc3, 0x56, 0xc4, 0x4d, 0x94, 0xa4, 0xa1, 0x89, 0x1c, 0x57, 0xbb, 0x8e, 0xd8, 0x65, 0x92, 0xe3, 0xfb, - 0xd5, 0x4a, 0x45, 0xb1, 0x21, 0x3e, 0x6d, 0x14, 0x77, 0x27, 0xa7, 0x00, 0x69, 0x87, 0x73, 0x64, 0x38, 0x6f, 0x67, 0x7c, 0x35, 0x62, 0x26, 0x93, 0xcc, 0xca, 0x70, 0x46, 0x68, 0x86, 0x35, 0xaa, - 0xe4, 0xc3, 0x8d, 0x94, 0xac, 0xba, 0xef, 0xdc, 0x7d, 0x9f, 0x8f, 0x80, 0x5b, 0x87, 0xe8, 0xaf, 0x3f, 0x91, 0xf3, 0x29, 0x3c, 0x3f, 0xe3, 0xd1, 0x87, 0x6c, 0xd7, 0x2f, 0x79, 0x71, 0xeb, 0xc5, - 0x79, 0x6c, 0x3a, 0x3e, 0x63, 0xf7, 0xdc, 0x12, 0xbe, 0xf0, 0xe4, 0xed, 0xb2, 0xef, 0x31, 0xd2, 0x38, 0xe9, 0x97, 0x25, 0xbb, 0x02, 0xf9, 0xb1, 0xb2, 0xdc, 0x2d, 0x79, 0x3a, 0x84, 0xd2, 0x70, - 0x43, 0x0f, 0x37, 0xa3, 0x15, 0xe7, 0x02, 0x43, 0x95, 0x34, 0x6d, 0x44, 0xe1, 0x56, 0xac, 0x3b, 0x52, 0x73, 0x73, 0xc3, 0xd7, 0xac, 0x3d, 0xef, 0xe2, 0x43, 0x65, 0xb0, 0xcc, 0x1c, 0xa5, 0x87, - 0xb4, 0x61, 0x8c, 0x05, 0x2c, 0xcc, 0x88, 0x23, 0xac, 0x6c, 0x6c, 0x8b, 0xf7, 0x3b, 0xad, 0x4e, 0x71, 0x76, 0xfa, 0xa3, 0x33, 0x2a, 0x60, 0xe4, 0x05, 0x46, 0x7b, 0xe2, 0x18, 0x78, 0x87, 0xe2, - 0xa5, 0x28, 0xf3, 0x3a, 0xaf, 0x8f, 0x85, 0xf7, 0xe2, 0x27, 0x56, 0xf0, 0xd9, 0x8a, 0x0e, 0x3f, 0xe5, 0xd2, 0x7e, 0xfc, 0x8a, 0x33, 0xb6, 0x8f, 0x6e, 0x9c, 0x37, 0x1c, 0xf4, 0x58, 0xf7, 0xe7, - 0xd1, 0xc8, 0x95, 0x46, 0xbb, 0x21, 0xac, 0x25, 0x06, 0xd9, 0x48, 0x73, 0xc8, 0xad, 0x48, 0x09, 0x70, 0x55, 0x08, 0x89, 0x88, 0xe5, 0x22, 0xa2, 0x4a, 0x74, 0xd4, 0x88, 0xe1, 0x5a, 0xcf, 0x80, - 0x6d, 0xea, 0x2d, 0xd7, 0xc0, 0xc4, 0xe7, 0x42, 0x3f, 0xde, 0xad, 0xa4, 0xa8, 0x82, 0xbb, 0xf9, 0x21, 0x4b, 0x1a, 0x8a, 0x0a, 0x77, 0x20, 0xe6, 0x1e, 0x20, 0x01, 0xe1, 0x05, 0x94, 0x16, 0x24, - 0xe5, 0xbd, 0xcb, 0xe8, 0x07, 0xa3, 0xff, 0xff, 0xfb, 0x79, 0x23, 0xaf, 0xb3, 0xc0, 0x3f, 0x99, 0xbd, 0x5f, 0x16, 0xd2, 0x7a, 0xae, 0x56, 0xd9, 0x03, 0xfa, 0xe7, 0x41, 0xf2, 0xa1, 0xb7, 0x6f, - 0x15, 0x33, 0xdd, 0x87, 0x32, 0xcd, 0x23, 0xa4, 0xca, 0xeb, 0xa2, 0xe9, 0xaa, 0x01, 0xe8, 0x62, 0x68, 0x47, 0x91, 0x6a, 0xa7, 0x45, 0xb2, 0x23, 0xe4, 0x21, 0x58, 0x00, 0xe4, 0x9e, 0x34, 0x74, - 0x01, 0x9c, 0x8f, 0xb8, 0xb0, 0x54, 0x19, 0x46, 0x0d, 0xf7, 0x16, 0xd0, 0xd2, 0xeb, 0x63, 0x63, 0x37, 0x3b, 0xdf, 0xd4, 0x94, 0xd6, 0x53, 0x41, 0x90, 0x31, 0x36, 0x6c, 0xc5, 0xb0, 0xa4, 0xb4, - 0x58, 0x82, 0xed, 0xe4, 0x27, 0xc5, 0xb5, 0x7a, 0xc7, 0xd9, 0xae, 0x08, 0x7d, 0x01, 0xe7, 0xb5, 0xcc, 0xcf, 0xcf, 0x83, 0xbd, 0xd7, 0xc7, 0xce, 0x48, 0x9e, 0x5b, 0x83, 0x5b, 0x72, 0xdf, 0x83, - 0xa8, 0x51, 0xcb, 0xc6, 0x91, 0x8f, 0xd9, 0x42, 0x9d, 0x31, 0xcd, 0xf0, 0x98, 0x94, 0x96, 0x45, 0x36, 0xde, 0xc6, 0x24, 0x43, 0x07, 0x6a, 0xe8, 0x60, 0x3e, 0x3a, 0x6c, 0x2a, 0x51, 0x5e, 0xf0, - 0x3a, 0x7f, 0x4c, 0x3c, 0xca, 0x1a, 0xa2, 0x3b, 0x3d, 0x74, 0x3a, 0x40, 0xa7, 0x75, 0x93, 0xb2, 0x67, 0x3b, 0xc4, 0x25, 0x22, 0x6c, 0x12, 0xba, 0x6e, 0x46, 0x4c, 0xda, 0x1a, 0x80, 0x40, 0x75, - 0xbf, 0xd8, 0x12, 0xdf, 0x25, 0x33, 0x7f, 0x59, 0x69, 0xf7, 0xbe, 0x32, 0xfe, 0x65, 0xa5, 0xb9, 0x57, 0x16, 0x6e, 0xa3, 0x96, 0x97, 0xb9, 0xf8, 0x77, 0xe8, 0xd7, 0xa5, 0x57, 0x35, 0xe9, 0xa7, - 0x19, 0xe9, 0xd0, 0x53, 0x0e, 0xf8, 0x2b, 0xcd, 0x0b, 0x37, 0x4f, 0xad, 0x01, 0xf4, 0xbd, 0x83, 0x1d, 0x1e, 0x50, 0x5e, 0x0c, 0x19, 0x9e, 0xc8, 0xca, 0x04, 0xef, 0x05, 0x3b, 0x8a, 0x42, 0xc7, - 0xbb, 0x55, 0xa4, 0x40, 0x9c, 0x09, 0x3f, 0x7d, 0xcc, 0x56, 0x1d, 0x96, 0x79, 0x13, 0x9c, 0xd7, 0xfa, 0x7f, 0x9c, 0xcc, 0xd9, 0x3e, 0x89, 0x53, 0xe5, 0xa7, 0xa5, 0x84, 0x4e, 0xf3, 0xf9, 0x19, - 0x89, 0x51, 0x9f, 0x91, 0xa8, 0xcf, 0x2b, 0x73, 0x0f, 0x89, 0xb0, 0x82, 0x6c, 0xd4, 0xd0, 0xc4, 0x8a, 0x94, 0x50, 0x73, 0x08, 0x93, 0x9a, 0x24, 0x1e, 0x61, 0x8e, 0xa3, 0xc9, 0x91, 0x45, 0x32, - 0x54, 0xd8, 0x9a, 0x01, 0xa1, 0x4e, 0xf0, 0x74, 0x79, 0xdc, 0xce, 0x0f, 0xe2, 0x66, 0x82, 0xc4, 0x0d, 0x34, 0xd3, 0x6d, 0x36, 0xb1, 0x38, 0x41, 0x48, 0xb6, 0x06, 0xa0, 0xad, 0xc9, 0xfd, 0x54, - 0x00, 0xf6, 0xea, 0x4a, 0x4f, 0x47, 0x53, 0x1a, 0xb2, 0x36, 0x44, 0x6b, 0xb0, 0x3f, 0x39, 0x4f, 0xa2, 0x1f, 0x4a, 0x4d, 0x75, 0x09, 0x38, 0x3d, 0x5e, 0x83, 0x9f, 0x31, 0xc4, 0xae, 0x34, 0xcf, - 0x68, 0x9d, 0x5b, 0x7d, 0xab, 0xe2, 0xa9, 0xc3, 0x8c, 0xa3, 0x28, 0x0b, 0xf5, 0x1d, 0xd0, 0xdb, 0x8e, 0xa7, 0x70, 0x02, 0x81, 0xaa, 0x00, 0xcf, 0xf2, 0x2a, 0x6a, 0x66, 0xf1, 0x51, 0x09, 0xc9, - 0x70, 0xd4, 0xea, 0x9b, 0x15, 0x67, 0x04, 0x1b, 0xc7, 0x67, 0xdb, 0x9a, 0x1a, 0x92, 0x7a, 0xd0, 0xc4, 0x88, 0xca, 0x2f, 0x19, 0x6f, 0x86, 0x8f, 0x58, 0x24, 0x25, 0xc1, 0x66, 0x7f, 0xb4, 0x96, - 0x1b, 0x85, 0xf0, 0xed, 0x7a, 0xbc, 0x57, 0x8e, 0xdd, 0xf7, 0x32, 0x34, 0xca, 0x2f, 0xee, 0xb0, 0xff, 0xf8, 0xf7, 0x0f, 0xa1, 0xc3, 0x67, 0xc4, 0xab, 0xef, 0x7e, 0x7e, 0xe0, 0xfe, 0x53, 0x16, - 0x9b, 0xef, 0x3a, 0x27, 0x2c, 0x7d, 0xd7, 0x39, 0xab, 0x2b, 0x3d, 0x94, 0xc2, 0x0d, 0x12, 0xe6, 0xad, 0xdb, 0x4d, 0x6d, 0x3e, 0x22, 0x49, 0x50, 0xb3, 0x62, 0x4b, 0x5e, 0xe9, 0x5b, 0x84, 0x5f, - 0xa6, 0xc0, 0x61, 0x3d, 0xf3, 0x44, 0x77, 0xb5, 0x6a, 0x46, 0x64, 0xe4, 0xc4, 0xa4, 0xbd, 0x25, 0xba, 0x08, 0x99, 0x52, 0x2c, 0x4b, 0x1f, 0xa2, 0xc0, 0xc9, 0x98, 0x69, 0x31, 0xe7, 0xec, 0xf5, - 0x71, 0xed, 0x04, 0xc7, 0x39, 0x13, 0x09, 0x00, 0x95, 0xf1, 0xa5, 0x81, 0x3b, 0x26, 0x5b, 0x7e, 0x1d, 0x59, 0x39, 0xc7, 0x31, 0xcf, 0x4a, 0x16, 0xf2, 0xd5, 0xca, 0xf2, 0xe3, 0xaf, 0xff, 0x7f, - 0xd9, 0xfb, 0x8f, 0x26, 0xf5, 0x95, 0xe7, 0x5f, 0x10, 0xde, 0xdf, 0x57, 0x71, 0xe2, 0x6c, 0x15, 0x1c, 0xe4, 0x85, 0x9e, 0x78, 0x16, 0x23, 0x03, 0x12, 0x08, 0x90, 0x47, 0x66, 0xf1, 0x8b, 0x90, - 0x47, 0x42, 0x0e, 0x59, 0xa4, 0xc5, 0xef, 0xb5, 0x4f, 0x34, 0x6d, 0xbe, 0x6d, 0xa0, 0x5b, 0xcd, 0xff, 0xcc, 0xdc, 0xbb, 0x98, 0x55, 0xcb, 0xd0, 0x09, 0x95, 0x55, 0x95, 0x95, 0xf6, 0x93, 0xef, - 0xe8, 0xce, 0x67, 0xef, 0xef, 0x9e, 0x8f, 0x96, 0x9f, 0x79, 0x21, 0x39, 0xba, 0xba, 0xaa, 0x75, 0x67, 0xbf, 0x6f, 0x85, 0xfe, 0x44, 0xc7, 0x49, 0x41, 0x49, 0x3c, 0x25, 0xe0, 0xf3, 0x60, 0x87, - 0x1f, 0xe2, 0xaa, 0x1b, 0x24, 0x23, 0xb5, 0x09, 0x9a, 0x92, 0x07, 0x94, 0x05, 0x8e, 0x4c, 0x77, 0x44, 0x69, 0x3c, 0x5d, 0x73, 0x40, 0x2e, 0xf9, 0x47, 0x77, 0x15, 0xae, 0x5d, 0x09, 0x88, 0x34, - 0x8e, 0xf6, 0x2a, 0xbf, 0x16, 0x1d, 0xbd, 0x06, 0x57, 0x80, 0x4d, 0x8b, 0x13, 0xed, 0xd4, 0x67, 0x19, 0xf4, 0xf7, 0x7f, 0xc1, 0x89, 0x99, 0x42, 0xf7, 0x82, 0xc1, 0xb7, 0xd9, 0x89, 0x3e, 0x70, - 0x42, 0xdf, 0xfc, 0x86, 0x57, 0xc6, 0x7e, 0x7e, 0x7e, 0xed, 0xcf, 0x32, 0xe1, 0xd8, 0x0e, 0x60, 0x97, 0xa5, 0x60, 0x63, 0xa3, 0x81, 0xfd, 0xa5, 0x0e, 0x0e, 0x3e, 0x9a, 0xd6, 0xac, 0x84, 0x02, - 0x88, 0xb8, 0x37, 0x71, 0xbe, 0xdc, 0x99, 0xb2, 0x03, 0xd9, 0xc7, 0x95, 0x4c, 0xa8, 0x3a, 0xc0, 0x25, 0x9d, 0xa8, 0x30, 0x99, 0x7a, 0x74, 0x99, 0x5d, 0xda, 0x54, 0xcd, 0x9a, 0x0d, 0x4f, 0xd6, - 0xf1, 0xc0, 0x57, 0xa2, 0x27, 0x35, 0x09, 0x20, 0x1c, 0x33, 0x96, 0xf6, 0x25, 0xdf, 0x66, 0xa1, 0xdf, 0xd8, 0x20, 0x93, 0xfc, 0xd1, 0x75, 0xe0, 0xb5, 0x55, 0x30, 0xbb, 0x62, 0x61, 0x7d, 0x97, - 0x66, 0x04, 0xff, 0x43, 0x3c, 0xb2, 0x4e, 0x3f, 0x53, 0xbf, 0x56, 0x72, 0x7d, 0x7a, 0x36, 0xbb, 0xd2, 0xfe, 0x99, 0xa1, 0xb8, 0xa3, 0x03, 0x4a, 0x5f, 0x07, 0x63, 0x4f, 0x1c, 0x94, 0xc5, 0x3c, - 0x1f, 0x3a, 0x41, 0xbb, 0x2c, 0xe4, 0xd2, 0xe0, 0xc9, 0x55, 0xe5, 0x59, 0xb1, 0x69, 0xa6, 0x67, 0x06, 0x1d, 0x31, 0x1f, 0x33, 0x65, 0x9a, 0x55, 0xce, 0x8d, 0x1b, 0xd6, 0x4a, 0x92, 0xf7, 0xdc, - 0x70, 0x76, 0x63, 0x24, 0xf2, 0xfd, 0x7d, 0x63, 0xf0, 0xed, 0xf2, 0x44, 0x8a, 0xd4, 0x5e, 0x2f, 0x9a, 0x2d, 0x8c, 0x9f, 0x05, 0xfd, 0xfb, 0x54, 0xc8, 0x6f, 0x2b, 0xda, 0x88, 0x7f, 0x90, 0x07, - 0x1c, 0xf5, 0x9f, 0x2b, 0xda, 0xae, 0x54, 0x7e, 0x1e, 0xfc, 0x9e, 0x86, 0xbc, 0x86, 0xdb, 0x62, 0x55, 0xca, 0x57, 0xd2, 0xa6, 0x59, 0xb1, 0x87, 0xf5, 0x61, 0xd4, 0x06, 0x79, 0x48, 0x77, 0xdb, - 0x96, 0xdc, 0x93, 0x87, 0x35, 0x43, 0xe1, 0xbc, 0xba, 0xda, 0x14, 0x8b, 0x1d, 0xc3, 0x1d, 0xb4, 0x9d, 0x81, 0x47, 0x61, 0x19, 0x7b, 0xbd, 0x90, 0x65, 0xc2, 0xdc, 0xa7, 0x12, 0x4d, 0xac, 0xce, - 0x2d, 0x96, 0xe2, 0xc8, 0x66, 0x23, 0x96, 0xac, 0x5a, 0x51, 0x71, 0x8d, 0x4c, 0x0c, 0xcf, 0xbf, 0x47, 0x65, 0x7a, 0xcd, 0x0f, 0x79, 0x5d, 0x59, 0x6f, 0xff, 0x3e, 0xa9, 0xfa, 0xed, 0xf7, 0x85, - 0x41, 0x93, 0x97, 0xf1, 0x57, 0xdc, 0xae, 0xdb, 0xcb, 0xf8, 0x11, 0x0f, 0xd1, 0x17, 0xea, 0xd7, 0xe9, 0xfb, 0xf4, 0x6c, 0x2a, 0x42, 0x8f, 0x72, 0xc8, 0x0f, 0xf2, 0x45, 0x33, 0xdb, 0xa0, 0x3a, - 0xe1, 0x18, 0x62, 0x86, 0x6d, 0x1a, 0x8b, 0x17, 0x5a, 0x5a, 0x40, 0x6a, 0x08, 0x02, 0xe7, 0x50, 0x5e, 0x12, 0xc8, 0x76, 0x6d, 0x09, 0xde, 0xb0, 0xb3, 0x78, 0x8e, 0x44, 0xa9, 0x96, 0x07, 0x4f, - 0x51, 0x25, 0x97, 0x0a, 0xdb, 0x6a, 0x76, 0xae, 0x66, 0x49, 0x39, 0xd4, 0x7c, 0x36, 0x5e, 0x36, 0xa6, 0xb0, 0x0f, 0x1d, 0x5c, 0x4a, 0x56, 0xc7, 0xe1, 0xfb, 0x32, 0xfd, 0x4f, 0x4e, 0xf2, 0x7f, - 0x4f, 0xa9, 0x79, 0x4f, 0xf8, 0x89, 0x27, 0xef, 0x6e, 0xa7, 0xaa, 0x37, 0x67, 0xcc, 0x94, 0x86, 0xe6, 0xbc, 0x5a, 0xae, 0x05, 0xfe, 0xc4, 0xf9, 0xf1, 0x6e, 0x5d, 0x59, 0x10, 0x98, 0x75, 0x5b, - 0xa5, 0xcb, 0xe5, 0x23, 0x0a, 0xcf, 0x01, 0xae, 0xa0, 0xd3, 0x95, 0x81, 0xb8, 0xf0, 0xd6, 0xdc, 0x2e, 0xe1, 0xcb, 0x65, 0x53, 0xda, 0x2b, 0x3f, 0x23, 0xd1, 0x3e, 0x00, 0x69, 0xa7, 0x38, 0x20, - 0x4a, 0xbf, 0x19, 0xb8, 0x73, 0x84, 0xf5, 0x2a, 0x11, 0x94, 0x17, 0xad, 0x03, 0xed, 0x6e, 0x62, 0x38, 0xf6, 0x87, 0x5c, 0xf9, 0x28, 0x68, 0x66, 0x71, 0xfe, 0x24, 0xf7, 0xeb, 0xd8, 0xfb, 0xfb, - 0xa6, 0x53, 0xe1, 0x4b, 0xd1, 0xd4, 0xd3, 0x67, 0xc8, 0xc9, 0xd5, 0xe2, 0xff, 0xa6, 0xb1, 0x73, 0xb7, 0x22, 0xff, 0xde, 0x74, 0xff, 0x3e, 0x00, 0x7c, 0xfb, 0x2b, 0xae, 0x13, 0x7f, 0xeb, 0xc5, - 0xd4, 0x6c, 0x52, 0x9a, 0x16, 0x22, 0x65, 0x81, 0xd2, 0x1b, 0x79, 0x93, 0xe1, 0x46, 0x62, 0xac, 0x76, 0x7c, 0xb4, 0x3d, 0xb4, 0x05, 0x0e, 0xad, 0x68, 0x56, 0x4d, 0xa0, 0x71, 0x7e, 0x51, 0x57, - 0xfa, 0xba, 0x18, 0xcf, 0x22, 0xde, 0x8b, 0x44, 0x1c, 0x83, 0x9b, 0x0b, 0x73, 0x4e, 0xd7, 0xad, 0x4f, 0x2c, 0xf3, 0x6a, 0x0e, 0x6c, 0x8f, 0xa9, 0xbb, 0x5f, 0x83, 0xfd, 0x71, 0x59, 0x9d, 0x49, - 0x5c, 0x82, 0xcf, 0xfc, 0xde, 0x08, 0x1e, 0xaf, 0x3f, 0xfa, 0x23, 0xb8, 0xfe, 0x4b, 0x3c, 0x54, 0x37, 0x3a, 0xd9, 0x85, 0x7a, 0x87, 0x9f, 0xbf, 0x39, 0x82, 0x1e, 0xd2, 0x1e, 0xbf, 0x1c, 0x41, - 0x93, 0x74, 0x46, 0x80, 0xa3, 0xf1, 0xf1, 0x40, 0x91, 0x5b, 0xe3, 0x88, 0x8f, 0x45, 0x67, 0xc9, 0x5b, 0x6a, 0xcb, 0xf7, 0x1d, 0x56, 0xb9, 0xb0, 0xc4, 0x73, 0xe9, 0x26, 0x46, 0xd2, 0x30, 0x3e, - 0xaf, 0xf9, 0x8b, 0x02, 0xb6, 0x6d, 0xcf, 0x44, 0x41, 0xe8, 0x89, 0x1b, 0x0f, 0x23, 0x3b, 0x32, 0xec, 0xa0, 0x7e, 0xc1, 0xb9, 0x6a, 0xd3, 0x5f, 0xda, 0xf6, 0x7c, 0xa6, 0x92, 0x35, 0xb9, 0xdf, - 0x51, 0xa2, 0x18, 0x9d, 0xa1, 0x9f, 0xdc, 0x7d, 0xbf, 0x3e, 0x56, 0xbe, 0xe1, 0xf6, 0xfb, 0x4c, 0xc1, 0x5b, 0xdc, 0x44, 0x1e, 0xb2, 0x44, 0xfe, 0x90, 0x7d, 0xe2, 0xe8, 0xdb, 0xcd, 0x0c, 0x99, - 0x66, 0x95, 0x6c, 0xad, 0x4b, 0x89, 0xa0, 0x42, 0x6a, 0x43, 0x0e, 0xbc, 0x71, 0x17, 0xb6, 0x1c, 0xad, 0x18, 0x01, 0xc9, 0xe3, 0x35, 0x3f, 0xc6, 0xae, 0xdf, 0x37, 0xfd, 0x5e, 0x37, 0x84, 0x08, - 0x3c, 0xcb, 0xca, 0x58, 0xb3, 0xc5, 0x06, 0xe1, 0xc2, 0xe8, 0x14, 0x2e, 0x04, 0x9f, 0xd6, 0x56, 0x3a, 0xa2, 0x9e, 0x82, 0x84, 0x5d, 0xae, 0x53, 0xa3, 0xcf, 0xd5, 0xbc, 0x3c, 0xf8, 0xa2, 0xbd, - 0x3e, 0xae, 0x76, 0xe9, 0x7c, 0x62, 0x56, 0xc4, 0x9d, 0xd4, 0xd4, 0x09, 0xac, 0x7c, 0xcd, 0xc5, 0xbb, 0xc5, 0x46, 0xf4, 0x21, 0xaf, 0xff, 0x33, 0xc9, 0x27, 0x16, 0x5e, 0x2f, 0x66, 0xe8, 0x34, - 0x4f, 0xbf, 0xee, 0x25, 0xde, 0x46, 0x34, 0x4e, 0x79, 0xb5, 0x3f, 0xad, 0x70, 0x69, 0x6b, 0x2e, 0x90, 0xb3, 0xc7, 0xef, 0x70, 0x81, 0x8f, 0x0e, 0xc2, 0xfe, 0x74, 0xc0, 0x61, 0x6b, 0xe1, 0x60, - 0xad, 0xc5, 0x1e, 0x3a, 0x72, 0xf0, 0x39, 0xf9, 0xd0, 0x53, 0xfc, 0x4e, 0x38, 0xf3, 0xfe, 0x26, 0x09, 0xa0, 0x83, 0x66, 0x94, 0x69, 0xc2, 0x81, 0x86, 0x55, 0x32, 0xec, 0xb1, 0x62, 0x7c, 0x4a, - 0xb4, 0x78, 0x54, 0x33, 0x7e, 0xa3, 0x65, 0xff, 0x05, 0x81, 0xff, 0x5c, 0xa6, 0xb0, 0xec, 0x6a, 0x3f, 0xbc, 0x73, 0xb5, 0x37, 0x55, 0x7c, 0x6f, 0x21, 0x42, 0xff, 0xc0, 0x8f, 0x1c, 0xc6, 0xb7, - 0xbe, 0xe1, 0x89, 0xa1, 0xb7, 0x9e, 0x5f, 0x0b, 0x4b, 0x26, 0x1c, 0xcf, 0x47, 0x83, 0x39, 0xcd, 0xe3, 0x73, 0x48, 0xa4, 0x25, 0x38, 0xa7, 0x22, 0x6d, 0x45, 0xcc, 0x7d, 0x5f, 0x84, 0xd6, 0x46, - 0xa3, 0xee, 0x25, 0x4a, 0x4d, 0xd2, 0x91, 0x89, 0xbd, 0x03, 0x16, 0x57, 0xd4, 0xc1, 0x5f, 0x42, 0x51, 0x95, 0xd4, 0x79, 0x20, 0xc0, 0xb8, 0xc5, 0xe1, 0x17, 0x8a, 0xd9, 0xd1, 0x4b, 0x9f, 0xe9, - 0xc4, 0x45, 0xa8, 0xab, 0x1a, 0xa8, 0x8f, 0xec, 0xee, 0x38, 0x87, 0xe5, 0x01, 0xb8, 0x07, 0x35, 0x35, 0x61, 0xc5, 0xfe, 0x0f, 0x7c, 0xfc, 0xef, 0x3e, 0xf6, 0x3d, 0x8c, 0xfb, 0xeb, 0x5c, 0x4e, - 0x5e, 0x01, 0xff, 0x7b, 0x82, 0x01, 0x37, 0xa7, 0xf5, 0x19, 0x70, 0xf5, 0x5f, 0x54, 0xf0, 0xee, 0x7c, 0xc9, 0xbd, 0x65, 0x15, 0xe4, 0xfe, 0x54, 0xc5, 0x6f, 0x20, 0x2f, 0x4c, 0xd2, 0x43, 0x12, - 0x8c, 0x50, 0xfd, 0x69, 0xb1, 0xec, 0xb4, 0xd2, 0x1b, 0xb6, 0xf0, 0x7e, 0x5d, 0x41, 0x09, 0xd1, 0x6f, 0x10, 0x32, 0x04, 0x4e, 0x78, 0xda, 0x29, 0xb9, 0xba, 0x1b, 0x81, 0x6c, 0x24, 0x19, 0x6e, - 0x24, 0xf7, 0x96, 0x14, 0xa4, 0xec, 0x09, 0x85, 0x4f, 0xe2, 0x88, 0x03, 0xe7, 0x74, 0x71, 0x49, 0x42, 0x61, 0x51, 0x58, 0xe3, 0x80, 0x24, 0x94, 0x84, 0xc9, 0x3a, 0x36, 0xd1, 0xa2, 0xf9, 0x1f, - 0x2c, 0xa3, 0xff, 0x43, 0x26, 0xba, 0x6e, 0x9c, 0x6f, 0x33, 0xcb, 0xff, 0xa5, 0xa9, 0xbe, 0x7e, 0xcd, 0xbd, 0xc9, 0xbe, 0xbe, 0x9c, 0x3a, 0xdd, 0xc9, 0x11, 0x0f, 0xc8, 0x05, 0x2a, 0xd2, 0x61, - 0x77, 0x51, 0x31, 0xb0, 0xf1, 0x2d, 0x38, 0x57, 0xec, 0xbc, 0x60, 0xb0, 0x79, 0xb6, 0x5d, 0x09, 0xa2, 0xb2, 0x94, 0xc3, 0x7e, 0xd1, 0x60, 0xc3, 0xd0, 0x9c, 0x0a, 0xbd, 0xde, 0x28, 0xfb, 0x4b, - 0xb7, 0x9e, 0x2f, 0x11, 0xf2, 0xdc, 0x42, 0x35, 0x0b, 0x8a, 0x8d, 0xb1, 0x46, 0x44, 0x06, 0x34, 0x23, 0x41, 0xcd, 0x3c, 0xa3, 0x1f, 0xe3, 0xde, 0x6a, 0xed, 0x87, 0xf5, 0xfc, 0xff, 0x93, 0xa7, - 0xbb, 0x2d, 0x83, 0xca, 0x89, 0xee, 0x67, 0xce, 0x2e, 0x1e, 0x6a, 0xf4, 0xf8, 0x87, 0xec, 0x33, 0xc2, 0xcb, 0xcb, 0xcd, 0x6c, 0x31, 0xad, 0xdd, 0x63, 0x41, 0x33, 0x80, 0xb3, 0xaf, 0x99, 0x64, - 0x1c, 0x93, 0x4c, 0xc4, 0x28, 0x51, 0xa2, 0xa5, 0x95, 0x0a, 0xd8, 0x04, 0x2f, 0x8d, 0xe9, 0x05, 0x60, 0xe5, 0x6a, 0xee, 0xf0, 0xfd, 0x0e, 0x5c, 0x9c, 0xd6, 0x80, 0x02, 0xa3, 0x51, 0xcd, 0x66, - 0x94, 0x0a, 0x6d, 0x77, 0xe1, 0xe8, 0x40, 0xa1, 0x00, 0x48, 0x80, 0x2a, 0xa4, 0x1a, 0x55, 0xec, 0xed, 0x52, 0xec, 0x8a, 0x62, 0x39, 0x2f, 0x15, 0x11, 0xe2, 0x7f, 0x52, 0xfe, 0xbe, 0x03, 0xfa, - 0xce, 0xca, 0x22, 0x7f, 0xfa, 0xfd, 0x41, 0x16, 0x37, 0xcd, 0x1b, 0xf2, 0xd8, 0xa7, 0xa4, 0x95, 0x67, 0x03, 0x3d, 0x71, 0x5e, 0x61, 0xbc, 0x3f, 0x9d, 0x03, 0x7f, 0x20, 0xd6, 0xd0, 0x6b, 0xfc, - 0xe4, 0xdd, 0xab, 0x6b, 0x4d, 0xce, 0x8b, 0xff, 0xef, 0x63, 0xfd, 0xc9, 0xa7, 0xda, 0x9c, 0xb0, 0xa8, 0xb2, 0x99, 0xef, 0x34, 0xce, 0xdf, 0x37, 0xab, 0x16, 0x9e, 0x5e, 0xc7, 0xfe, 0x4b, 0x5f, - 0xef, 0x57, 0x3c, 0xfd, 0x77, 0xef, 0xff, 0x60, 0x2f, 0x3f, 0xaf, 0xb8, 0x0f, 0x0b, 0xf3, 0x15, 0x46, 0xf7, 0xa3, 0xd7, 0xe2, 0xaf, 0xbf, 0xfe, 0x3e, 0x3f, 0xff, 0x03, 0xfe, 0xb1, 0x82, 0xea, - 0x23, 0x64, 0xdb, 0xb3, 0x7b, 0xea, 0xcb, 0xfa, 0xfd, 0x29, 0xdf, 0xf0, 0x1f, 0xf4, 0x1f, 0xf0, 0xaf, 0xff, 0x3f, 0x84, 0xbc, 0x64, 0xe6, 0x4c, 0x09, 0x97, 0x5c, 0x57, 0x53, 0x73, 0x1f, 0x92, - 0x1e, 0x7f, 0x28, 0x69, 0xe1, 0x8d, 0xea, 0xeb, 0x7a, 0x7d, 0xba, 0x9e, 0xe1, 0xd3, 0x52, 0x13, 0x8e, 0x4a, 0x71, 0xdc, 0x07, 0xeb, 0xf0, 0x34, 0xf7, 0x28, 0x74, 0xc1, 0x5c, 0x4a, 0x67, 0xde, - 0xa3, 0x8b, 0xe3, 0xa9, 0x91, 0x70, 0xdb, 0x51, 0xce, 0xa6, 0x0b, 0xca, 0x07, 0xac, 0xda, 0x76, 0x06, 0xc8, 0x10, 0xa5, 0xa3, 0xd4, 0xb4, 0x8e, 0xc8, 0xd8, 0x38, 0xf8, 0xa3, 0x55, 0xd5, 0xa9, - 0xb8, 0x69, 0x92, 0x79, 0xe4, 0xa3, 0x8b, 0xf3, 0x05, 0x43, 0xc1, 0x44, 0x68, 0xbc, 0x1a, 0xef, 0x38, 0x28, 0x7c, 0x5c, 0x6d, 0xf9, 0x76, 0x96, 0x3f, 0x6c, 0xf8, 0xbf, 0xff, 0xb3, 0xb8, 0xdd, - 0x40, 0x7b, 0xca, 0xbc, 0x4d, 0x98, 0xab, 0xc6, 0x29, 0xef, 0xb9, 0x78, 0xb1, 0x87, 0x22, 0x80, 0x4f, 0x04, 0xe7, 0xb3, 0xeb, 0x9f, 0x19, 0x36, 0x2d, 0x06, 0x18, 0x55, 0x66, 0x35, 0x4a, 0x0c, - 0x94, 0x0e, 0xf0, 0x69, 0xd0, 0x76, 0x82, 0x7f, 0xbe, 0x1c, 0x31, 0x2e, 0xde, 0x96, 0x2e, 0x48, 0x97, 0x7b, 0xaf, 0x61, 0xda, 0xc0, 0xd3, 0x68, 0xb0, 0xac, 0x79, 0x13, 0xe5, 0x5a, 0x30, 0xf7, - 0x80, 0xf6, 0x62, 0x28, 0xe8, 0x45, 0x48, 0xb4, 0xe3, 0x1c, 0x65, 0x42, 0x39, 0xe5, 0xd1, 0xf1, 0xd8, 0x69, 0x3b, 0x78, 0xbe, 0x34, 0x33, 0xde, 0x2c, 0xf1, 0x6e, 0xde, 0xfe, 0x0f, 0x64, 0xc9, - 0x4f, 0xa7, 0x43, 0x50, 0xce, 0x82, 0x73, 0xeb, 0xa4, 0x6f, 0x3b, 0x18, 0xfb, 0x7a, 0x7a, 0xdc, 0x71, 0x21, 0xf9, 0x45, 0xf3, 0x0c, 0xd6, 0x78, 0x7d, 0x0d, 0x7e, 0x9e, 0xfa, 0xb0, 0xa8, 0x66, - 0x6f, 0x7d, 0x82, 0x9e, 0xe4, 0xf0, 0x07, 0xf1, 0xf4, 0xd6, 0xcd, 0x96, 0xf8, 0x07, 0x7a, 0x07, 0x30, 0xfb, 0xa5, 0xd9, 0xfa, 0xbb, 0x17, 0x71, 0x7e, 0x0c, 0xaa, 0xf8, 0x25, 0x87, 0x0f, 0xfe, - 0x8c, 0xf8, 0xf8, 0xae, 0x8d, 0xe1, 0x4d, 0x69, 0xf3, 0x86, 0x72, 0xfb, 0x5c, 0xc6, 0xfd, 0x61, 0x98, 0x77, 0x3d, 0x5d, 0x37, 0x3e, 0xf3, 0x67, 0xa1, 0xdf, 0x20, 0xf1, 0x07, 0xb5, 0xe3, 0x49, - 0x5c, 0x7e, 0xfa, 0x0d, 0x7f, 0xd2, 0x30, 0x5e, 0xea, 0xf4, 0x3e, 0x27, 0x5d, 0x3c, 0x7f, 0xe6, 0x25, 0xaa, 0xff, 0xc4, 0xb3, 0xcf, 0x55, 0x62, 0x77, 0xcc, 0xac, 0xe7, 0x11, 0x7d, 0xe0, 0xc6, - 0xbb, 0xf8, 0xf9, 0xb5, 0xac, 0xf0, 0x86, 0xb0, 0xfc, 0xe2, 0x7d, 0x78, 0xd9, 0x3e, 0x57, 0xdf, 0xc3, 0xf5, 0x7a, 0xc2, 0x8e, 0x7b, 0xab, 0xf9, 0xb8, 0xb5, 0xe9, 0xc0, 0x87, 0x50, 0x4a, 0x5e, - 0x68, 0x3e, 0xed, 0xbb, 0xe7, 0xab, 0x19, 0x38, 0x0d, 0x99, 0x04, 0xe0, 0xc0, 0xed, 0x36, 0x4a, 0x92, 0x82, 0xa4, 0x6d, 0x13, 0xde, 0x85, 0x7e, 0x27, 0x85, 0x3c, 0xb0, 0x13, 0xb6, 0x4c, 0x75, - 0x49, 0x4d, 0xd5, 0x0a, 0x3c, 0x8c, 0x75, 0x24, 0x4b, 0x82, 0xc2, 0x00, 0x5f, 0x0f, 0xc7, 0x10, 0x9c, 0x87, 0x6a, 0xb6, 0x01, 0xdd, 0x55, 0x6c, 0x43, 0xab, 0x05, 0xad, 0xe1, 0x1e, 0x67, 0xa6, - 0xf0, 0xb6, 0x4c, 0x1b, 0xb9, 0x6c, 0xc6, 0xc4, 0x14, 0x8c, 0xe5, 0x49, 0x98, 0xa8, 0x74, 0xbb, 0x71, 0xde, 0x54, 0xc1, 0xb3, 0x76, 0x05, 0x7d, 0x68, 0xaf, 0xf6, 0x0d, 0xf3, 0x3e, 0x55, 0x6f, - 0xde, 0x62, 0xe1, 0x63, 0x45, 0x01, 0x1f, 0x28, 0x3f, 0x31, 0xf2, 0xfd, 0xfd, 0xd4, 0xf2, 0x80, 0x93, 0xc3, 0x9e, 0x33, 0x88, 0x5d, 0x6a, 0x64, 0x59, 0x22, 0x7b, 0xb3, 0x57, 0x16, 0xc8, 0x02, - 0x36, 0x78, 0x37, 0x2f, 0xcd, 0x5c, 0x39, 0xed, 0xc9, 0x0b, 0xb7, 0x27, 0x7d, 0xb9, 0x41, 0x68, 0x18, 0xf0, 0x33, 0x33, 0x36, 0x16, 0x26, 0xa4, 0x8a, 0x7d, 0xb6, 0x12, 0x2f, 0xd4, 0xb2, 0x5a, - 0xca, 0x28, 0x21, 0xba, 0x47, 0x9b, 0xc4, 0x37, 0xf8, 0x70, 0xb4, 0xf7, 0x66, 0x3b, 0x30, 0xe2, 0x96, 0x98, 0xca, 0xce, 0x3b, 0x55, 0xb4, 0x93, 0x78, 0xfa, 0xb2, 0xee, 0xef, 0x71, 0xf3, 0xf7, - 0x51, 0xad, 0x17, 0x9a, 0xcf, 0x7c, 0x7c, 0xba, 0xba, 0x72, 0xf0, 0x87, 0xb8, 0x16, 0x34, 0x63, 0x7d, 0x6d, 0x33, 0xc7, 0xcf, 0x8b, 0xbd, 0x99, 0x46, 0xb5, 0xeb, 0x9d, 0x96, 0x07, 0x08, 0x60, - 0x0b, 0x27, 0x46, 0x43, 0xfd, 0x97, 0x85, 0x23, 0x4d, 0x9c, 0x0f, 0xb3, 0xb4, 0x6a, 0xef, 0x99, 0x44, 0xe0, 0xb5, 0x85, 0xcb, 0xaf, 0x87, 0xf5, 0x42, 0xf5, 0x69, 0x5c, 0x2f, 0x97, 0xb3, 0x67, - 0x52, 0x3f, 0xaf, 0x0d, 0xb7, 0xdd, 0xae, 0xc7, 0x9e, 0x28, 0xcb, 0xf3, 0x90, 0xb5, 0x22, 0x52, 0x36, 0x10, 0x98, 0xf0, 0xa7, 0x39, 0x2e, 0xef, 0x02, 0x7b, 0xeb, 0xc6, 0x7e, 0x7c, 0xdc, 0xc9, - 0x3a, 0xb0, 0xc7, 0xeb, 0x22, 0x5a, 0xe1, 0xcb, 0x9c, 0x1e, 0x39, 0xf0, 0xdc, 0xb0, 0xc6, 0x9a, 0x6f, 0x8f, 0x3d, 0x74, 0x41, 0xfc, 0x61, 0x1f, 0x1d, 0xb6, 0x73, 0x41, 0xe3, 0xd6, 0x76, 0xad, - 0x09, 0x0b, 0x08, 0x18, 0x98, 0x71, 0xfb, 0x1b, 0xcf, 0x14, 0x34, 0x69, 0x83, 0x15, 0x2f, 0x9d, 0x67, 0x2b, 0x27, 0x8f, 0xee, 0x6b, 0x06, 0x8f, 0x80, 0x70, 0x7c, 0x24, 0xfd, 0xc4, 0xc2, 0x0f, - 0x0f, 0x66, 0xd8, 0xcf, 0x00, 0x1c, 0xd7, 0xb0, 0x2f, 0x26, 0x11, 0xf1, 0x88, 0x9b, 0xd8, 0xb0, 0xac, 0x20, 0xaf, 0xf7, 0xa2, 0x4e, 0xbe, 0xb8, 0xee, 0xba, 0x27, 0xf4, 0x13, 0x12, 0x89, 0x03, - 0xe6, 0xaf, 0xfd, 0xc6, 0x46, 0x2b, 0xb6, 0x0b, 0xb6, 0xe7, 0x63, 0xe5, 0x6f, 0x24, 0x60, 0x1b, 0xcf, 0xf9, 0x0b, 0xde, 0x0c, 0x02, 0xb8, 0x5f, 0xba, 0x00, 0xcc, 0x31, 0x43, 0x1e, 0x30, 0xbb, - 0x4d, 0xcc, 0x9d, 0x2b, 0x8a, 0x65, 0xd4, 0xfd, 0x69, 0x51, 0x3f, 0xae, 0xca, 0xbd, 0x6f, 0x7d, 0xfd, 0x74, 0x32, 0x3f, 0x16, 0x20, 0x98, 0xb4, 0x4f, 0x5f, 0x20, 0x91, 0x6f, 0xcd, 0x08, 0xf2, - 0x10, 0x32, 0xd1, 0x95, 0xe2, 0x75, 0x22, 0xda, 0x17, 0xdc, 0xff, 0x09, 0x32, 0xce, 0xa0, 0x2f, 0x0b, 0x7d, 0xc0, 0xb4, 0x6d, 0x23, 0xaa, 0x4a, 0xb3, 0x3e, 0x03, 0x3b, 0x10, 0x99, 0xd7, 0x02, - 0x5b, 0x99, 0xcc, 0x96, 0xbf, 0xf4, 0xac, 0x77, 0x6e, 0x55, 0x09, 0xf6, 0x50, 0x64, 0x1b, 0x80, 0xc8, 0x9c, 0xac, 0x83, 0x2a, 0x91, 0xe9, 0xf5, 0xd8, 0x24, 0xca, 0x88, 0xaf, 0x4e, 0x9b, 0x60, - 0x24, 0xd9, 0xf9, 0x31, 0x0d, 0x06, 0xca, 0xd4, 0x68, 0x6e, 0xdb, 0xf7, 0xb6, 0xde, 0x93, 0xe9, 0xe3, 0xda, 0xda, 0x2b, 0xd6, 0xe4, 0x7f, 0xa1, 0x7f, 0xc0, 0x9b, 0x35, 0x08, 0x37, 0x91, 0xa0, - 0xdf, 0xe0, 0xa5, 0x5f, 0xb1, 0xa0, 0xaf, 0x0f, 0xa6, 0xc5, 0x0d, 0xda, 0xdc, 0x2d, 0x2e, 0xb3, 0xb2, 0x8a, 0xb3, 0xf8, 0x8a, 0xe5, 0x7c, 0xdf, 0xe9, 0xf2, 0xfb, 0x3d, 0xf2, 0x89, 0xf6, 0x7c, - 0xf6, 0xf9, 0xc9, 0x14, 0x98, 0x9a, 0x6b, 0x41, 0x8e, 0xad, 0xcf, 0x91, 0xfd, 0x59, 0x40, 0x7c, 0x0a, 0x8b, 0xca, 0x25, 0x24, 0x34, 0x43, 0xbc, 0xd1, 0xab, 0x25, 0x0d, 0xa6, 0x97, 0x9c, 0x3b, - 0xed, 0x56, 0x7c, 0xd9, 0x6c, 0x88, 0x33, 0x1e, 0xf4, 0xbe, 0xbd, 0xa8, 0x21, 0x58, 0xae, 0x44, 0xb6, 0xdf, 0xbb, 0xc7, 0xf5, 0x46, 0x6d, 0xb2, 0xcd, 0xc9, 0x87, 0x64, 0xd6, 0x74, 0xa0, 0xbd, - 0x42, 0x2d, 0x9c, 0x15, 0x4c, 0x41, 0xe3, 0x69, 0x6e, 0x95, 0xc3, 0x44, 0xf7, 0x4a, 0xd8, 0xe6, 0xcf, 0x60, 0x45, 0xef, 0x94, 0xe8, 0x4f, 0x56, 0xf2, 0xd1, 0xa9, 0x67, 0x6e, 0x1c, 0xc5, 0xaf, - 0xe5, 0x25, 0xd0, 0x67, 0x3b, 0xf8, 0x76, 0xff, 0xd5, 0x77, 0x1f, 0xe8, 0x8f, 0xb1, 0x77, 0x9c, 0xb9, 0xc5, 0x25, 0xf0, 0x3f, 0xcc, 0xc5, 0xdf, 0xf7, 0x5a, 0xb5, 0xfe, 0x3f, 0xee, 0xa8, 0x79, - 0x8f, 0x4b, 0x7e, 0xfb, 0x24, 0x7d, 0xa4, 0x5b, 0xfb, 0x1b, 0xd5, 0xeb, 0x5a, 0x78, 0xb9, 0xbe, 0xa6, 0x75, 0x4d, 0x40, 0x72, 0x34, 0x2e, 0xe2, 0x9e, 0xa9, 0xea, 0x9a, 0xde, 0x2d, 0x34, 0x55, - 0x52, 0xce, 0x7b, 0x6c, 0x99, 0xd5, 0xc9, 0xa1, 0xaa, 0x3b, 0x94, 0x5a, 0x98, 0x10, 0xbc, 0x41, 0xa9, 0x8a, 0x8e, 0x63, 0x67, 0xe8, 0x10, 0x76, 0x18, 0x38, 0xc4, 0x4e, 0xd7, 0x11, 0x3e, 0x0c, - 0x75, 0xdb, 0xaa, 0x96, 0x6f, 0xd7, 0x87, 0x11, 0xd1, 0x04, 0x4f, 0x8b, 0xe0, 0xd0, 0x9f, 0xcf, 0xf5, 0xc4, 0x47, 0x19, 0xfe, 0x00, 0x7d, 0x6e, 0x56, 0xf5, 0xf3, 0x59, 0xdc, 0x56, 0xf1, 0x2c, - 0xa9, 0xef, 0x70, 0x05, 0x7d, 0xe8, 0x20, 0x7e, 0x26, 0xf9, 0xc4, 0x92, 0xeb, 0xc5, 0x0c, 0x9d, 0x76, 0x06, 0x13, 0x95, 0xa0, 0x0f, 0x03, 0x82, 0xc8, 0xd0, 0xe0, 0x91, 0x8b, 0x52, 0x86, 0x58, - 0x2a, 0xdb, 0x36, 0xbd, 0x09, 0x81, 0xe4, 0x8a, 0xd0, 0xd6, 0xa1, 0x91, 0x1a, 0x90, 0xe5, 0x17, 0x0b, 0x23, 0x85, 0xe2, 0x18, 0x52, 0x03, 0x3e, 0x0e, 0x82, 0x23, 0xc8, 0xf3, 0xa1, 0x14, 0x6c, - 0xe1, 0x70, 0x67, 0x0a, 0xf8, 0x08, 0xd6, 0x8b, 0xc0, 0x13, 0x6a, 0x32, 0xac, 0x98, 0x76, 0xbb, 0xe9, 0x72, 0x9f, 0x9e, 0x18, 0x5c, 0x7b, 0x57, 0xca, 0xfa, 0x8a, 0xd5, 0x32, 0x61, 0x4d, 0x35, - 0xf1, 0xbd, 0x0c, 0x0d, 0xf0, 0x1f, 0x08, 0x7e, 0x64, 0x3d, 0x35, 0x71, 0xfa, 0xc4, 0xb7, 0x26, 0x4e, 0x67, 0xcf, 0x24, 0x7e, 0x66, 0xdb, 0xc9, 0x0e, 0xe7, 0x02, 0x7e, 0x5c, 0xae, 0x2b, 0x83, - 0x5f, 0xe3, 0xe6, 0x59, 0x5c, 0xe9, 0x71, 0xbc, 0x73, 0x00, 0x82, 0xec, 0x97, 0x73, 0x76, 0x21, 0x03, 0x7b, 0x66, 0x4f, 0x19, 0x5e, 0x7a, 0x1a, 0x22, 0xc4, 0x45, 0x7d, 0xf8, 0x44, 0xd4, 0xa0, - 0xcc, 0x05, 0xe5, 0x3e, 0x89, 0x29, 0xda, 0x03, 0x1c, 0x05, 0xd9, 0x43, 0x12, 0x35, 0xf0, 0x5b, 0xa2, 0xc4, 0x75, 0x6f, 0x6b, 0xe1, 0xdb, 0xac, 0xca, 0x27, 0xaa, 0xb5, 0x5f, 0x2c, 0xd8, 0x8f, - 0xf6, 0x6d, 0x3d, 0x73, 0xaa, 0xa8, 0xcd, 0x82, 0xf7, 0x82, 0xe4, 0xb3, 0x8d, 0x1b, 0x05, 0x79, 0x50, 0x39, 0x4d, 0x51, 0xcd, 0x5e, 0x25, 0xd3, 0xdb, 0x47, 0x89, 0x4f, 0x1f, 0xfd, 0xd8, 0x36, - 0xf9, 0x46, 0xa8, 0xe8, 0x59, 0xec, 0xdc, 0xfa, 0xd8, 0x14, 0xed, 0xaa, 0x6d, 0xe3, 0x7b, 0xf1, 0x98, 0xc5, 0x3f, 0xc8, 0x03, 0x86, 0xdf, 0x13, 0xc1, 0xa7, 0xd9, 0x6c, 0x63, 0x7f, 0x76, 0xa5, - 0xf0, 0xf3, 0x64, 0x02, 0x7b, 0xab, 0x86, 0xe5, 0x60, 0x67, 0x0c, 0x00, 0x67, 0xac, 0xc4, 0x65, 0x46, 0x5e, 0xf2, 0x1c, 0xe7, 0x19, 0xb6, 0x04, 0x53, 0x42, 0xa6, 0x59, 0x22, 0x4b, 0x17, 0xe3, - 0x56, 0xcf, 0x36, 0x00, 0x89, 0xc8, 0xd8, 0x7e, 0x05, 0xee, 0x0b, 0x6f, 0x59, 0xe5, 0xfd, 0x49, 0x3b, 0x99, 0x87, 0xd5, 0x3e, 0x36, 0x91, 0x79, 0x58, 0x32, 0xb8, 0x13, 0xaa, 0x0b, 0xf6, 0xe8, - 0xce, 0xa3, 0x91, 0x50, 0x88, 0xe0, 0xc3, 0x1e, 0xf8, 0x72, 0xe2, 0xbe, 0x0c, 0xfb, 0x6f, 0x3f, 0xae, 0x9b, 0xf9, 0xd3, 0x89, 0x7b, 0x7d, 0xf0, 0x33, 0xbb, 0xee, 0xc9, 0xf8, 0x7b, 0xe7, 0xed, - 0xef, 0xf9, 0x77, 0xf3, 0x1b, 0xe6, 0xb3, 0xdb, 0xcf, 0xaf, 0x67, 0xef, 0x04, 0x0e, 0xbb, 0xbd, 0xed, 0x77, 0x20, 0x25, 0x6c, 0xcb, 0x32, 0x5d, 0x59, 0xb0, 0x60, 0x2b, 0x26, 0xae, 0x75, 0x43, - 0xbb, 0x27, 0x8a, 0x24, 0xa9, 0x88, 0xb4, 0x3f, 0x45, 0x78, 0x96, 0x82, 0x55, 0xb1, 0x1e, 0x48, 0x2b, 0x68, 0xd5, 0x8a, 0xd8, 0xa8, 0x08, 0x01, 0x9f, 0xd3, 0xbd, 0x01, 0x2d, 0x74, 0xd9, 0x1a, - 0x23, 0x4b, 0x20, 0xc7, 0x98, 0xf3, 0x82, 0xca, 0x38, 0xdb, 0x62, 0xb6, 0xcc, 0xc9, 0xc3, 0x7e, 0xa2, 0x94, 0x89, 0x5f, 0xcf, 0xd5, 0xdb, 0xc7, 0xea, 0xd3, 0xeb, 0xa2, 0x48, 0x03, 0x27, 0x9f, - 0x3d, 0x7b, 0x5f, 0xde, 0x96, 0x2f, 0xf8, 0xe9, 0x63, 0xcf, 0x4a, 0xed, 0xc7, 0x4f, 0x7d, 0xdd, 0x5a, 0x6f, 0x45, 0x47, 0xcf, 0xaf, 0xb1, 0xcf, 0xaf, 0x5f, 0x3b, 0xca, 0xbf, 0xba, 0xa6, 0x5e, - 0xe7, 0xfc, 0xff, 0xbd, 0x53, 0xf9, 0x79, 0x26, 0x5f, 0x3b, 0x6a, 0x14, 0xf9, 0xbf, 0xaa, 0xae, 0x7d, 0x26, 0xfe, 0xb6, 0x72, 0xfe, 0x3c, 0x9a, 0xaa, 0xb0, 0x19, 0x8b, 0x4b, 0xa0, 0xe9, 0xbd, - 0x93, 0xe6, 0x8b, 0x18, 0x11, 0xe6, 0x9e, 0x05, 0xe5, 0x9c, 0x39, 0xfa, 0xf9, 0xc1, 0x4e, 0x63, 0x9f, 0xf6, 0x9c, 0x68, 0xd8, 0xaf, 0x1a, 0xda, 0x67, 0xb1, 0xd3, 0x25, 0x77, 0x51, 0xad, 0xe3, - 0x04, 0x85, 0x58, 0x85, 0xea, 0x5a, 0x45, 0x32, 0xab, 0xec, 0x0d, 0x15, 0x92, 0x75, 0xa6, 0x6d, 0x42, 0x61, 0x5c, 0xac, 0xad, 0x85, 0x92, 0x84, 0x0d, 0x0d, 0x02, 0x3f, 0x66, 0xd3, 0x7c, 0xbb, - 0x8e, 0x9e, 0x5b, 0x7a, 0xdf, 0x88, 0x51, 0x3c, 0x4d, 0xec, 0x73, 0xce, 0xf6, 0xcd, 0x77, 0x7f, 0xda, 0x81, 0xdf, 0x7f, 0xff, 0xf1, 0xff, 0xff, 0x77, 0xad, 0x8a, 0x69, 0x4d, 0xf2, 0x7f, 0x1f, - 0x3a, 0xfd, 0x42, 0xfd, 0x6d, 0x5d, 0x7c, 0x6e, 0x95, 0x3f, 0x21, 0x50, 0x8a, 0x92, 0x4b, 0x50, 0x2d, 0xf5, 0x80, 0x04, 0xbd, 0xa4, 0x2c, 0x3c, 0x82, 0x16, 0x37, 0xfd, 0x20, 0xf1, 0xca, 0x59, - 0xa5, 0x7c, 0x08, 0xf6, 0x20, 0x50, 0xce, 0x60, 0x27, 0xf3, 0x97, 0x76, 0xb5, 0x91, 0x18, 0x0b, 0xde, 0xb3, 0x17, 0xc7, 0x00, 0xa1, 0x91, 0x5f, 0x6b, 0x55, 0x90, 0x01, 0x55, 0xbe, 0xd4, 0x2c, - 0xc4, 0xef, 0x2b, 0x97, 0x47, 0x74, 0xbd, 0xd2, 0x7b, 0x27, 0x0a, 0x19, 0x8b, 0x9d, 0x78, 0xf8, 0xfe, 0xcf, 0x5a, 0xe5, 0x7f, 0x10, 0x29, 0xdf, 0xe5, 0x58, 0x7c, 0x0e, 0xa0, 0xdd, 0x6f, 0x95, - 0x3f, 0xd1, 0xb4, 0xf8, 0x16, 0xaa, 0xf8, 0xee, 0x31, 0xff, 0x65, 0x19, 0xfe, 0x9f, 0x99, 0xe8, 0xf1, 0x06, 0x5d, 0xfb, 0x2f, 0x1e, 0x83, 0x57, 0x92, 0x4f, 0xab, 0xf4, 0x7a, 0x31, 0xe5, 0xa0, - 0x83, 0x66, 0x8d, 0x2a, 0x93, 0xc9, 0x48, 0xd0, 0xe7, 0xc4, 0xbc, 0xec, 0x4f, 0xd6, 0xaa, 0xa3, 0x40, 0x79, 0xdf, 0xee, 0x84, 0xa6, 0xbc, 0x8d, 0x85, 0x7a, 0x7f, 0x44, 0xaf, 0x8d, 0x81, 0x6f, - 0xdb, 0x07, 0x8f, 0x0c, 0xe8, 0x4a, 0x71, 0x3e, 0x7b, 0xfe, 0x7b, 0x05, 0xb1, 0x98, 0x70, 0x6e, 0x6f, 0x05, 0x4b, 0x87, 0x62, 0xca, 0xdc, 0x98, 0x7a, 0x44, 0x99, 0x39, 0xa9, 0x2b, 0x49, 0xdc, - 0x02, 0x3b, 0xe3, 0x38, 0xe8, 0x26, 0x5f, 0x77, 0x61, 0x49, 0x64, 0x5e, 0x6b, 0x65, 0xa4, 0xaf, 0xea, 0x82, 0x00, 0xce, 0x99, 0xa4, 0xa9, 0xf4, 0x7e, 0x45, 0x5d, 0xd8, 0x05, 0x3c, 0xcf, 0x18, - 0xc3, 0x6d, 0xb6, 0x35, 0x97, 0xac, 0xd6, 0x8e, 0x0f, 0xf6, 0xeb, 0xba, 0xf0, 0xd1, 0xb1, 0xd2, 0xa8, 0xe5, 0x6f, 0x6a, 0xd1, 0xa6, 0x81, 0x9d, 0xff, 0xe9, 0x02, 0x7c, 0x8f, 0x5f, 0xbf, 0xf7, - 0x04, 0xbd, 0xd0, 0x9c, 0xcf, 0x5e, 0xaf, 0xae, 0x3c, 0x9b, 0xe0, 0x0d, 0x42, 0x7a, 0x9f, 0x8b, 0x7d, 0x7b, 0x38, 0x63, 0x12, 0x0d, 0x2e, 0x50, 0x73, 0xbb, 0x54, 0x31, 0xad, 0x14, 0x55, 0x85, - 0x42, 0xfa, 0xc4, 0xa4, 0xd2, 0xb5, 0xb1, 0x3b, 0xb6, 0x19, 0x7c, 0x52, 0xbc, 0x6e, 0x8e, 0x42, 0x6a, 0x0e, 0x07, 0x99, 0x0c, 0xfa, 0x83, 0x27, 0x1b, 0x68, 0x6b, 0x9b, 0xdb, 0x20, 0xe9, 0x85, - 0x2e, 0xc2, 0x97, 0x75, 0xe7, 0xfa, 0xe9, 0x61, 0x0b, 0xac, 0xac, 0xa5, 0xd7, 0x10, 0x7f, 0x8a, 0xa8, 0xfe, 0xd7, 0x0b, 0x0f, 0x6e, 0xcb, 0xa8, 0xbf, 0xff, 0xaf, 0xd0, 0xa9, 0x9b, 0x38, 0x1c, - 0xe6, 0x4e, 0xd2, 0xcd, 0xbc, 0x22, 0x2b, 0xe3, 0xf4, 0x6e, 0x6e, 0x2c, 0xf2, 0x50, 0x33, 0x9c, 0x9b, 0xdf, 0x30, 0x9f, 0x7d, 0xb8, 0x9d, 0x21, 0xd3, 0x3a, 0xe2, 0x04, 0xae, 0xbb, 0x6c, 0xd2, - 0x35, 0xe1, 0x5f, 0xcc, 0x15, 0x36, 0xc6, 0x7b, 0xbf, 0x02, 0xb1, 0x4c, 0xb4, 0x16, 0xfb, 0x9c, 0x8d, 0x25, 0x1a, 0x32, 0x3b, 0x2a, 0xdd, 0xf2, 0x5e, 0xa3, 0x34, 0x73, 0xc5, 0x03, 0x18, 0x64, - 0xcb, 0x88, 0x07, 0x03, 0x8b, 0x33, 0xfd, 0x60, 0x02, 0xd9, 0xb1, 0xd3, 0x8f, 0xf9, 0x7e, 0xcc, 0x24, 0x9a, 0x0f, 0x7a, 0xfd, 0x24, 0xae, 0x22, 0x2e, 0x65, 0x2e, 0x91, 0x4f, 0x7d, 0x90, 0xe4, - 0x2f, 0xee, 0xff, 0xcf, 0x52, 0x3c, 0xb9, 0x76, 0x6e, 0xf9, 0xcf, 0xe2, 0x4b, 0x7a, 0xc0, 0xd3, 0x28, 0x9e, 0x21, 0x5f, 0x5e, 0xed, 0xab, 0xcf, 0xd9, 0x0c, 0x4e, 0xdd, 0xcc, 0xda, 0x2a, 0x7e, - 0x93, 0xc6, 0x77, 0x8c, 0xd6, 0x37, 0x36, 0xf9, 0x41, 0x50, 0x66, 0x41, 0x75, 0xd7, 0x75, 0xfc, 0x58, 0x75, 0xdf, 0x57, 0xf2, 0xd7, 0xee, 0x63, 0x2f, 0xd7, 0x53, 0x0b, 0xfe, 0x36, 0x0b, 0x4d, - 0x54, 0xe9, 0x33, 0xa2, 0x16, 0xb6, 0xcb, 0x1e, 0x77, 0x24, 0xa0, 0xcc, 0x5b, 0x82, 0x38, 0x4a, 0x24, 0x12, 0x8d, 0xf3, 0xca, 0x49, 0x54, 0x0a, 0x10, 0xe0, 0x13, 0x37, 0xc4, 0x89, 0x54, 0x8a, - 0x8a, 0x64, 0xe8, 0x26, 0xaf, 0x97, 0x9a, 0x93, 0x06, 0x45, 0x02, 0x90, 0x30, 0x55, 0x83, 0x2a, 0xd9, 0x4a, 0x8a, 0x44, 0x88, 0xf1, 0x62, 0x7d, 0xde, 0x85, 0x60, 0x0b, 0x54, 0x05, 0xfe, 0xa5, - 0xe0, 0xef, 0xed, 0xb7, 0x06, 0x55, 0x75, 0xb7, 0x33, 0x13, 0xf2, 0x50, 0x4e, 0xec, 0x47, 0xd2, 0xf3, 0xd9, 0xf3, 0xdf, 0x6b, 0x03, 0xb6, 0x09, 0xc3, 0x17, 0xa8, 0xd0, 0xdb, 0x3a, 0x00, 0x93, - 0x9f, 0xf2, 0xfe, 0x10, 0x63, 0xa1, 0x51, 0x44, 0xd5, 0xd6, 0x8c, 0x62, 0x7f, 0x1b, 0x7b, 0x00, 0x67, 0xe6, 0xdb, 0x24, 0x4e, 0x4c, 0xbf, 0x4c, 0x17, 0x65, 0x77, 0xea, 0x5c, 0x53, 0xc7, 0x68, - 0xce, 0x41, 0x88, 0xd8, 0x16, 0xc9, 0x15, 0xd7, 0xd5, 0x47, 0xd2, 0xde, 0xa2, 0x03, 0x50, 0xac, 0x62, 0xcc, 0x73, 0x79, 0x3a, 0xc3, 0x74, 0x91, 0x03, 0xfc, 0xec, 0x4b, 0xa1, 0xc9, 0xdb, 0x6f, - 0xbc, 0x2e, 0x9d, 0x6b, 0x55, 0xd7, 0x9f, 0x52, 0xb9, 0x1f, 0xb6, 0xe8, 0x63, 0x99, 0xc2, 0x93, 0xbe, 0x71, 0x3e, 0xfb, 0xf6, 0xf5, 0xd4, 0xf4, 0xe2, 0xa1, 0xb4, 0x87, 0x5c, 0xe9, 0x4c, 0x0a, - 0xf1, 0x63, 0x37, 0x94, 0x86, 0x93, 0xbc, 0x47, 0x14, 0x1a, 0xeb, 0x69, 0x7f, 0xa9, 0x47, 0x2a, 0x17, 0xe5, 0xc3, 0x42, 0xf6, 0xf0, 0x13, 0x84, 0x23, 0xbd, 0x25, 0x6d, 0x59, 0x34, 0x5b, 0x72, - 0x4b, 0xf6, 0x44, 0x31, 0x25, 0x00, 0x82, 0x56, 0x76, 0x3e, 0x71, 0xdd, 0x3a, 0x5b, 0xb0, 0xf3, 0x8b, 0x55, 0xf0, 0x4e, 0xd2, 0x0f, 0x4b, 0xdf, 0x60, 0xe7, 0x1f, 0x8d, 0xe7, 0xdb, 0x5b, 0xf8, - 0xc6, 0x6f, 0xbf, 0x6e, 0x49, 0xec, 0xfe, 0x96, 0x7c, 0x6b, 0xd9, 0x74, 0x4f, 0xaf, 0xfd, 0xbd, 0xb9, 0xf3, 0x4c, 0xf2, 0x49, 0xfa, 0x5d, 0x2f, 0xa6, 0x76, 0x11, 0xc9, 0xf3, 0x80, 0x9c, 0xaf, - 0x63, 0x79, 0x7e, 0x1c, 0xd7, 0x47, 0x0b, 0x2f, 0x7d, 0x36, 0x77, 0xe9, 0x66, 0x24, 0xd8, 0x44, 0xd2, 0x84, 0xca, 0x02, 0x41, 0x69, 0x3e, 0x76, 0x92, 0x9a, 0x61, 0xa5, 0xb8, 0x3a, 0xa5, 0xf8, - 0xa5, 0xe5, 0x2a, 0x2e, 0x37, 0xf3, 0xf9, 0xa1, 0xd1, 0xf6, 0xfb, 0x70, 0xdf, 0x50, 0xa1, 0x4d, 0xce, 0x21, 0xa5, 0x09, 0x8e, 0xa7, 0x7a, 0xd4, 0xc9, 0xb3, 0xa7, 0xc5, 0x31, 0x38, 0xa5, 0x3d, - 0xed, 0x0d, 0x04, 0xa4, 0xdb, 0x9b, 0xf1, 0x91, 0x23, 0xf3, 0x33, 0xf1, 0x2b, 0x5b, 0x3e, 0x3e, 0x9a, 0xda, 0x27, 0xea, 0xb8, 0x48, 0xe5, 0x45, 0xe3, 0x78, 0xb6, 0x95, 0x2b, 0x48, 0xb7, 0x97, - 0xb5, 0x28, 0x76, 0x13, 0xa0, 0x11, 0x59, 0x7e, 0x8d, 0xcd, 0x81, 0x14, 0xc4, 0xa9, 0x16, 0x96, 0xbc, 0x2a, 0xee, 0xe6, 0x5c, 0x16, 0x34, 0x60, 0xe0, 0x24, 0xa8, 0xd6, 0x1b, 0x3c, 0x0a, 0xd5, - 0x22, 0xd9, 0xe7, 0x3c, 0x1b, 0xcb, 0xf5, 0x32, 0x81, 0xc8, 0x33, 0xe8, 0x57, 0xa3, 0x6f, 0xf8, 0x01, 0xc5, 0x37, 0xfd, 0x94, 0x55, 0x75, 0xc5, 0x77, 0x9a, 0x35, 0x4e, 0x15, 0x05, 0xcd, 0xac, - 0x3e, 0xbe, 0x24, 0x46, 0x7c, 0xbb, 0xa6, 0x5e, 0xe0, 0x84, 0xd3, 0x22, 0x8a, 0xbe, 0x47, 0x1b, 0x79, 0x64, 0x75, 0x7d, 0x24, 0x7e, 0x65, 0xe8, 0xc7, 0x47, 0xcf, 0x9d, 0x5f, 0x7f, 0x66, 0x28, - 0x4c, 0x27, 0x8a, 0x66, 0x5f, 0x34, 0xa9, 0x3b, 0x06, 0x62, 0xc7, 0xb9, 0x74, 0x9d, 0xae, 0x54, 0x4b, 0xd4, 0x4f, 0x15, 0xa0, 0x26, 0x52, 0x23, 0xe6, 0xd5, 0x56, 0x42, 0x90, 0x10, 0x38, 0xac, - 0x8d, 0xed, 0x18, 0x8c, 0x72, 0x69, 0x7b, 0xe7, 0x43, 0x44, 0x24, 0x0e, 0xb2, 0x45, 0x7d, 0xda, 0xcc, 0xc6, 0x31, 0xea, 0x35, 0xc0, 0x01, 0x61, 0x32, 0x51, 0x2e, 0x98, 0xc4, 0xc4, 0xc8, 0xa6, - 0x8d, 0xbf, 0x48, 0xfa, 0xe7, 0x73, 0xf5, 0xb6, 0x33, 0x0f, 0x7a, 0x44, 0x92, 0x39, 0x49, 0xf7, 0xa2, 0x5a, 0x3c, 0x13, 0xf8, 0x79, 0xa0, 0xb5, 0xd2, 0x42, 0xa7, 0xd2, 0x13, 0xc9, 0x61, 0xdb, - 0x58, 0x17, 0x5a, 0xe8, 0xce, 0xa1, 0x16, 0x1c, 0x49, 0x61, 0xb4, 0x97, 0xbd, 0x88, 0xa8, 0xda, 0x60, 0x42, 0xbc, 0x06, 0xa0, 0x8c, 0xc3, 0x8e, 0x0c, 0xce, 0x97, 0x1a, 0x67, 0x1d, 0xd7, 0x47, - 0x69, 0x3d, 0x26, 0xa4, 0xd9, 0x0a, 0x3a, 0x21, 0x58, 0x6c, 0x9f, 0x3b, 0xc1, 0x11, 0x3b, 0x7a, 0x62, 0x9f, 0x0c, 0x90, 0xdc, 0x6e, 0x46, 0x5a, 0x9a, 0xa0, 0x52, 0x5c, 0xe5, 0xd1, 0xa7, 0x4c, - 0xa8, 0x2f, 0x30, 0xe5, 0xcf, 0xf2, 0xca, 0x3b, 0x06, 0x99, 0x33, 0x6b, 0x2a, 0xe7, 0x89, 0x3f, 0x7f, 0x22, 0x34, 0x1f, 0xf4, 0x90, 0xdb, 0x40, 0x36, 0xcf, 0x1a, 0xc7, 0x07, 0x23, 0xf3, 0x2d, - 0x94, 0xf0, 0xf7, 0x7f, 0xd0, 0x6b, 0x7a, 0xda, 0xed, 0x65, 0xfa, 0x41, 0xad, 0xb9, 0xbd, 0x42, 0x1f, 0x92, 0x7f, 0x7f, 0xe8, 0xbe, 0xcc, 0xd3, 0xcb, 0xdd, 0xb5, 0x7b, 0xcb, 0x84, 0x75, 0x69, - 0x5c, 0x40, 0xe1, 0x82, 0xc1, 0xc7, 0xcb, 0x92, 0x60, 0xa0, 0xc5, 0xf1, 0xb4, 0x5b, 0x46, 0x91, 0x95, 0x2e, 0xe3, 0xf0, 0x6c, 0xd8, 0x8d, 0xe5, 0x28, 0x51, 0xd1, 0x6e, 0x8a, 0x0a, 0x30, 0x76, - 0xbe, 0x94, 0xcb, 0xc3, 0x52, 0x80, 0x90, 0x2e, 0x5a, 0x1a, 0xc3, 0x61, 0xdf, 0x96, 0x84, 0x5a, 0x04, 0x41, 0xb1, 0xdd, 0xd5, 0x15, 0x7a, 0x0a, 0xb1, 0x23, 0xee, 0x8b, 0x06, 0x04, 0xad, 0x21, - 0x6c, 0xa7, 0x4f, 0x98, 0xae, 0x3f, 0x1a, 0xe0, 0xfd, 0xad, 0x9d, 0x0f, 0xff, 0x7e, 0x83, 0xf9, 0x57, 0xa2, 0x4f, 0xdc, 0x7a, 0xb9, 0x9c, 0xda, 0x5e, 0x5e, 0x42, 0x91, 0x40, 0x0a, 0x45, 0x6a, - 0xdd, 0x96, 0xa7, 0xa8, 0xe5, 0xf5, 0xc1, 0xab, 0x3c, 0xf4, 0xbc, 0x21, 0x4f, 0xe3, 0xc2, 0x8e, 0x5b, 0x51, 0x8f, 0x13, 0x67, 0xa9, 0xf5, 0x26, 0xa1, 0xf1, 0x0d, 0x68, 0xcd, 0xb9, 0xbd, 0x40, - 0x74, 0xa0, 0xe3, 0x2c, 0x2a, 0x6b, 0x01, 0xe1, 0x17, 0x23, 0xb1, 0x89, 0x6a, 0xe3, 0x53, 0x98, 0xe9, 0xef, 0xbc, 0xf2, 0xb0, 0xd2, 0x84, 0xdd, 0x19, 0x50, 0x3a, 0x23, 0xfa, 0xc1, 0x1f, 0x76, - 0x9b, 0x7b, 0x5f, 0x1a, 0x0d, 0xde, 0x80, 0xd1, 0xfb, 0x0c, 0xb5, 0x76, 0xd7, 0x94, 0x73, 0x2a, 0xef, 0xf8, 0x9d, 0xf1, 0xfe, 0x80, 0xd4, 0x78, 0xa2, 0xf8, 0xc4, 0xe1, 0xa7, 0xbf, 0x53, 0xe1, - 0xdd, 0xcd, 0x08, 0x20, 0x95, 0x9e, 0x89, 0xe6, 0x60, 0x89, 0xc0, 0x4d, 0x20, 0xf8, 0xdc, 0x4e, 0xd2, 0xa4, 0xfc, 0x60, 0x0a, 0x2c, 0xd8, 0x23, 0x6c, 0xc8, 0xe7, 0x2b, 0x2d, 0x8c, 0xbd, 0x62, - 0xac, 0xa9, 0xa8, 0xee, 0xce, 0xb0, 0x19, 0xe4, 0xd2, 0xe6, 0x3c, 0xdf, 0x59, 0xe5, 0x38, 0xca, 0xf3, 0x6e, 0x31, 0x56, 0xe2, 0xb0, 0xc9, 0x71, 0xb6, 0x46, 0xc8, 0x03, 0x85, 0x6e, 0xd6, 0x6c, - 0xbf, 0x0a, 0xcf, 0x5f, 0x8a, 0xe7, 0x9d, 0x2a, 0xfa, 0x1e, 0x44, 0xe0, 0xa1, 0x73, 0xe2, 0x85, 0xe8, 0x75, 0xc8, 0xd1, 0x2b, 0x64, 0xc0, 0xa4, 0x73, 0x61, 0x01, 0x90, 0xc6, 0x39, 0x70, 0xdd, - 0xd5, 0x58, 0x9a, 0xa4, 0xa8, 0x00, 0x86, 0x83, 0x8b, 0x30, 0xe9, 0xd4, 0xeb, 0x22, 0x0a, 0x94, 0xdd, 0xe8, 0x71, 0x0d, 0xb5, 0xde, 0xfb, 0xe5, 0x8e, 0xe7, 0x07, 0x2a, 0x82, 0xc0, 0x10, 0xc4, - 0x1c, 0x75, 0x75, 0xa0, 0x5d, 0x6f, 0x79, 0xe6, 0xc2, 0xb9, 0x64, 0xf6, 0xd0, 0x32, 0xa1, 0x6c, 0xe0, 0x0c, 0xcf, 0xdd, 0x25, 0x1d, 0x21, 0x6c, 0xd7, 0x56, 0xc2, 0xd7, 0x96, 0xe8, 0x4e, 0xed, - 0xdc, 0x43, 0x24, 0x84, 0xaf, 0xc8, 0x47, 0xbf, 0x1e, 0x71, 0xed, 0x94, 0x4f, 0xa3, 0xad, 0x9d, 0xf2, 0x3a, 0x52, 0xfc, 0xe7, 0x91, 0xd2, 0x2a, 0x6f, 0x44, 0xac, 0x4a, 0xc5, 0x42, 0x8d, 0x81, - 0x05, 0xac, 0x04, 0x8b, 0xb2, 0xec, 0x4a, 0xa4, 0x0e, 0x0e, 0xbc, 0xa9, 0x2a, 0x3b, 0x14, 0xf5, 0x7c, 0xb5, 0xd6, 0xc8, 0x55, 0xb8, 0x5f, 0xea, 0xba, 0xbd, 0x15, 0x39, 0xe3, 0xc0, 0xd4, 0xb1, - 0xe1, 0x28, 0x92, 0xb1, 0x83, 0xec, 0x3c, 0x07, 0xb2, 0xb3, 0x0d, 0x89, 0xe1, 0xc1, 0x46, 0x46, 0x84, 0x35, 0x96, 0xa3, 0x5a, 0x12, 0x47, 0x65, 0x4a, 0xe4, 0xd7, 0xa9, 0x87, 0xdc, 0x3b, 0xc5, - 0xf7, 0xf3, 0x1b, 0x1f, 0xe9, 0x18, 0xf5, 0x4a, 0xf4, 0xca, 0x84, 0xe7, 0xcb, 0x19, 0xf8, 0x73, 0xe7, 0xa8, 0x27, 0x46, 0x88, 0x41, 0x4c, 0x8a, 0x3c, 0xda, 0x28, 0x47, 0xd0, 0x3a, 0xeb, 0x08, - 0x77, 0x39, 0x9a, 0x04, 0xe9, 0xef, 0xe6, 0x59, 0x7f, 0x88, 0x3a, 0xd7, 0xde, 0x38, 0xea, 0xde, 0x51, 0x4e, 0x80, 0x5b, 0x1f, 0x4f, 0x09, 0xa8, 0x62, 0x5e, 0xc8, 0x7b, 0x91, 0xe5, 0x9c, 0xaa, - 0x80, 0x4e, 0x2a, 0xbe, 0x77, 0x1a, 0x53, 0x70, 0x47, 0x60, 0x5d, 0xac, 0x7d, 0x6b, 0x7b, 0xa9, 0x84, 0x38, 0x83, 0x77, 0x89, 0x31, 0x4d, 0xf9, 0xfc, 0x58, 0x4c, 0xf9, 0x2f, 0xee, 0xf7, 0x77, - 0x84, 0x9f, 0x18, 0xf2, 0xee, 0x76, 0xea, 0xee, 0x3f, 0xed, 0xc5, 0x84, 0x3d, 0x53, 0x47, 0xa2, 0xbc, 0x80, 0xa6, 0xb1, 0x5f, 0x03, 0xa8, 0xec, 0x8e, 0x45, 0xac, 0xcc, 0x73, 0xed, 0xc4, 0x53, - 0xc6, 0xbe, 0xf5, 0xe1, 0xb6, 0xcb, 0x37, 0xe7, 0x96, 0x85, 0xe6, 0x17, 0xcc, 0x21, 0x96, 0xb2, 0xbd, 0xdb, 0x68, 0x20, 0xe5, 0x8d, 0x67, 0x01, 0x94, 0x73, 0x9c, 0x28, 0xac, 0xb9, 0xa6, 0xc9, - 0xd0, 0xd6, 0xd5, 0x05, 0x27, 0xb1, 0xcb, 0x12, 0x59, 0x93, 0xcd, 0xd7, 0x7d, 0x70, 0xcf, 0x7b, 0x7c, 0x8f, 0x17, 0xbf, 0xf7, 0xb4, 0xdf, 0xfe, 0x8a, 0x27, 0xae, 0xdc, 0x7c, 0x31, 0xb5, 0x38, - 0x49, 0xa5, 0xb0, 0xcc, 0xdc, 0x18, 0xd5, 0xda, 0x87, 0x34, 0x47, 0x4e, 0xc2, 0x8b, 0x6e, 0x45, 0x47, 0xf7, 0x2c, 0xcf, 0x8f, 0x56, 0x5c, 0x08, 0xd9, 0x76, 0xd3, 0x49, 0x9b, 0x81, 0x6d, 0x2d, - 0xa5, 0x31, 0xcd, 0x20, 0x5f, 0xed, 0x77, 0x49, 0x82, 0x1e, 0x55, 0xb5, 0x81, 0x98, 0x10, 0xba, 0xd4, 0xad, 0xa9, 0x9a, 0x55, 0x73, 0xa9, 0x0e, 0x0c, 0x26, 0x36, 0x68, 0xa0, 0xe3, 0x9e, 0xd8, - 0xd0, 0xac, 0xff, 0x55, 0x7f, 0xec, 0xba, 0xf8, 0x7e, 0x33, 0x1c, 0xf8, 0x11, 0xd1, 0xf8, 0x44, 0xf1, 0x3a, 0xfa, 0x2e, 0x2e, 0x66, 0x57, 0x1a, 0x3f, 0x0f, 0x56, 0xa3, 0xd2, 0x9d, 0xd5, 0x89, - 0x6d, 0xcf, 0x0d, 0x5b, 0x01, 0x91, 0x42, 0xda, 0xc5, 0x0c, 0x81, 0x36, 0xed, 0xcc, 0x1c, 0xe1, 0xf0, 0xc0, 0x44, 0x1d, 0x8c, 0xf8, 0xf8, 0x68, 0xaf, 0xfc, 0x34, 0x98, 0x9f, 0x91, 0x48, 0x4a, - 0xb2, 0x0b, 0xed, 0x04, 0x2d, 0x03, 0x96, 0x16, 0xc8, 0x8e, 0x35, 0x26, 0x19, 0x3b, 0x35, 0x0a, 0xcf, 0xe7, 0xa5, 0x7d, 0xaa, 0x86, 0x00, 0x22, 0xb9, 0x94, 0xd5, 0xa2, 0x7e, 0x82, 0x52, 0xf2, - 0x72, 0x12, 0xde, 0x4a, 0x93, 0x7f, 0x57, 0x88, 0xf3, 0xb9, 0x80, 0xc6, 0xa9, 0x9b, 0xf3, 0xcb, 0x7f, 0xe1, 0xf7, 0x5a, 0xb7, 0xbb, 0x4e, 0xea, 0xe4, 0x5e, 0xe0, 0xcf, 0xbe, 0x53, 0x69, 0x1e, - 0x73, 0x95, 0x7f, 0x24, 0x3d, 0x9f, 0x7d, 0x7a, 0x30, 0xc5, 0x75, 0x7e, 0xf5, 0x9b, 0x16, 0x6a, 0xa0, 0x8b, 0xa0, 0xb6, 0x3b, 0xe0, 0xc4, 0x71, 0x0f, 0x51, 0x99, 0x6b, 0xd6, 0x02, 0x3a, 0x38, - 0x67, 0x9d, 0x68, 0x92, 0x98, 0x4f, 0xdd, 0x8b, 0xc2, 0xda, 0x62, 0xc9, 0x83, 0x82, 0x41, 0x02, 0x4c, 0x60, 0xa2, 0xae, 0x42, 0x39, 0x26, 0x48, 0xe5, 0x97, 0x06, 0x6c, 0x2e, 0xf0, 0xae, 0x2a, - 0x95, 0xd2, 0xe8, 0x65, 0x47, 0xea, 0xd7, 0xe9, 0x5a, 0x5d, 0x6e, 0x8e, 0x96, 0x8e, 0x49, 0x53, 0xe0, 0xd5, 0x5d, 0xa7, 0x0e, 0x70, 0xf4, 0x7e, 0x3e, 0x0e, 0xf4, 0x0f, 0xf6, 0xc0, 0xc2, 0x7b, - 0xa3, 0x7a, 0x65, 0xc8, 0xcb, 0xf5, 0xec, 0x4a, 0xeb, 0x67, 0x5e, 0x50, 0x42, 0xe9, 0x58, 0x29, 0x9f, 0x2f, 0x1a, 0x54, 0x3d, 0xb8, 0x22, 0xcf, 0x0c, 0x80, 0x8b, 0x01, 0x82, 0x10, 0x75, 0x0a, - 0xda, 0x55, 0x35, 0xbb, 0xe8, 0xdc, 0xae, 0x72, 0x63, 0x79, 0x53, 0xd6, 0x44, 0x28, 0xb0, 0xda, 0x29, 0x39, 0xb1, 0xd5, 0x80, 0x27, 0x31, 0x58, 0xe9, 0x9b, 0x84, 0x01, 0x4f, 0xa3, 0xbb, 0x0f, - 0xa4, 0x6d, 0x3f, 0x5e, 0xce, 0x8b, 0x78, 0x28, 0x0b, 0x14, 0x3a, 0x07, 0xc6, 0x97, 0xdd, 0xe6, 0xc6, 0xb9, 0x53, 0x0d, 0xb3, 0xe0, 0xd2, 0x04, 0xf9, 0xd3, 0x60, 0xef, 0x9b, 0x06, 0x8f, 0x98, - 0x6e, 0x5f, 0xa8, 0x3f, 0x31, 0xe2, 0xf3, 0xb3, 0xa9, 0x0d, 0x3a, 0x12, 0xd6, 0x6b, 0x36, 0xf3, 0xf5, 0x41, 0x76, 0xed, 0x62, 0x33, 0x9c, 0x8a, 0x80, 0x77, 0x8f, 0x66, 0x29, 0xa6, 0x7b, 0xfa, - 0xcc, 0xed, 0xbd, 0xde, 0xdc, 0x08, 0x9b, 0x22, 0x42, 0xe1, 0x25, 0xc6, 0xb3, 0x92, 0xde, 0xcb, 0x9a, 0xea, 0x27, 0x0c, 0xef, 0xc7, 0xc7, 0x24, 0x01, 0xd9, 0x34, 0x3f, 0x06, 0x32, 0xe1, 0xa6, - 0xae, 0x86, 0xfb, 0xbc, 0xe8, 0x84, 0x7b, 0x2a, 0x56, 0x17, 0x45, 0x21, 0x7f, 0x4e, 0x23, 0xbf, 0xbd, 0x38, 0xfe, 0xa4, 0xe4, 0xff, 0x8b, 0x3b, 0xe6, 0x85, 0xe8, 0x33, 0x47, 0xae, 0x97, 0x53, - 0x77, 0xc9, 0x41, 0xdc, 0x45, 0xda, 0xae, 0x4f, 0x28, 0x47, 0xe7, 0xb0, 0x05, 0xa8, 0x9a, 0x39, 0xb2, 0x75, 0xbc, 0x43, 0x94, 0xb4, 0x55, 0xe5, 0xee, 0xb2, 0x80, 0xb0, 0xed, 0xbd, 0xc5, 0xa9, - 0xea, 0x81, 0xc8, 0xb2, 0xc6, 0xc2, 0x65, 0x59, 0x39, 0x82, 0xcb, 0x08, 0x29, 0xfb, 0xb5, 0x97, 0x37, 0x32, 0x41, 0xb0, 0xcb, 0x4a, 0x80, 0xb6, 0xe0, 0xfe, 0x72, 0x72, 0x83, 0x26, 0xf1, 0x0a, - 0x73, 0x3c, 0xf4, 0xc2, 0x17, 0x2d, 0xd5, 0xad, 0x1c, 0x2f, 0x98, 0x05, 0x97, 0xd2, 0xc9, 0xeb, 0xef, 0x32, 0x04, 0xa0, 0x7f, 0xa0, 0x07, 0x76, 0xc6, 0x47, 0xe2, 0x4f, 0x4c, 0xf8, 0xf8, 0xe4, - 0xd9, 0x8b, 0x36, 0x61, 0x9b, 0xc4, 0x4c, 0x2b, 0xf1, 0xec, 0x2a, 0xaa, 0x78, 0x93, 0xe0, 0xe1, 0x6e, 0xb9, 0x9e, 0x63, 0x97, 0x72, 0x04, 0x89, 0x51, 0xe5, 0x69, 0x10, 0xd4, 0xca, 0x36, 0x3a, - 0x1f, 0x33, 0xab, 0x39, 0x64, 0x3b, 0x11, 0xc7, 0xa0, 0x45, 0xc6, 0xb4, 0xca, 0xae, 0x10, 0xad, 0x55, 0xea, 0x2f, 0xe9, 0x14, 0x8c, 0xa0, 0x05, 0xd1, 0x86, 0xc5, 0xe8, 0x3b, 0x7c, 0x64, 0x08, - 0x9e, 0xb5, 0x72, 0x71, 0xe8, 0xcc, 0xdd, 0x4b, 0xe6, 0xfb, 0x41, 0x74, 0x7f, 0x91, 0xaf, 0x37, 0x64, 0xb8, 0x57, 0xe4, 0x9e, 0xd3, 0xbc, 0x66, 0x11, 0x80, 0x1f, 0x02, 0xfd, 0x5f, 0xd9, 0x7f, - 0x6f, 0xc9, 0x21, 0x8f, 0x2d, 0xb9, 0x2b, 0xc9, 0x57, 0x5e, 0xd7, 0x57, 0x3f, 0xdc, 0x84, 0xe5, 0xe6, 0x2e, 0xda, 0x0c, 0xd8, 0x42, 0xca, 0xb8, 0x43, 0x0c, 0x56, 0x1d, 0xbb, 0x63, 0x86, 0x47, - 0xeb, 0x11, 0x1a, 0x42, 0xcd, 0xa5, 0x1b, 0xdc, 0xd2, 0x52, 0x6f, 0x29, 0x50, 0x5d, 0x9d, 0x9d, 0x19, 0xdb, 0x5e, 0xf5, 0x28, 0x3e, 0xe2, 0x30, 0x9e, 0x1e, 0x12, 0x32, 0x81, 0x86, 0xa5, 0x64, - 0x20, 0x08, 0x8f, 0xf1, 0x40, 0x4a, 0xcb, 0xa5, 0xbd, 0x93, 0xa0, 0xd3, 0x22, 0x05, 0x88, 0x05, 0xef, 0x80, 0x8f, 0x71, 0x38, 0x8c, 0xd3, 0xf4, 0x2d, 0x07, 0xff, 0x39, 0xaf, 0xfc, 0x1e, 0xfb, - 0x5e, 0x01, 0xdc, 0x6f, 0xb1, 0x0f, 0x7f, 0xa8, 0x36, 0xf8, 0x99, 0xe4, 0x13, 0xfb, 0xae, 0x17, 0x33, 0x7c, 0x5a, 0x4d, 0xf0, 0x4a, 0x8b, 0x99, 0x72, 0x7f, 0x69, 0xfa, 0xd8, 0xb6, 0xf9, 0xa5, - 0xed, 0x7a, 0xae, 0xb6, 0xf6, 0xec, 0x64, 0xa9, 0x1c, 0xd6, 0x4c, 0x4e, 0x0e, 0xe7, 0x79, 0xc9, 0xae, 0x4e, 0x5a, 0x4a, 0x62, 0x73, 0xea, 0x32, 0xb2, 0x50, 0xee, 0xd0, 0x5e, 0xb3, 0x27, 0x2c, - 0x11, 0x5f, 0x54, 0xf1, 0x6e, 0x1e, 0x6d, 0x55, 0xd6, 0x22, 0x6a, 0xbf, 0xda, 0xb9, 0xc3, 0xe2, 0x58, 0x84, 0x14, 0x6b, 0xb5, 0xed, 0x59, 0x9c, 0xe0, 0xdd, 0x78, 0x7f, 0xa4, 0xfd, 0xfd, 0x1f, - 0xe8, 0x73, 0x47, 0xb8, 0x38, 0x08, 0x02, 0x02, 0x43, 0x5f, 0x5e, 0xc2, 0xf7, 0xf8, 0xf8, 0x3e, 0x7f, 0xe1, 0xdf, 0x13, 0x7e, 0x6f, 0x54, 0xe7, 0xb3, 0x3f, 0xd7, 0x53, 0xc5, 0x1f, 0x21, 0x02, - 0x2b, 0x97, 0x89, 0x8f, 0x15, 0x8d, 0x19, 0x9c, 0xbb, 0xb2, 0x82, 0xda, 0x6b, 0xfa, 0x4c, 0x13, 0x9c, 0x00, 0xaf, 0xc4, 0x78, 0x3d, 0x66, 0x23, 0x14, 0x7b, 0x55, 0x60, 0x6c, 0x00, 0xd0, 0xa1, - 0x88, 0xed, 0x26, 0x6c, 0xcf, 0xc7, 0x65, 0x5d, 0xc0, 0x1a, 0x99, 0x7b, 0xa5, 0xb7, 0x6a, 0xc6, 0x9d, 0xdc, 0x8c, 0x66, 0x08, 0xcb, 0x1c, 0xd7, 0x06, 0xc6, 0x86, 0xd3, 0xac, 0xfa, 0x5c, 0x4d, - 0x60, 0xe8, 0x84, 0x2c, 0x8b, 0x7b, 0x58, 0x58, 0xb7, 0x59, 0x7b, 0x2c, 0x4e, 0xb1, 0xef, 0x7c, 0x17, 0x99, 0xfd, 0xfd, 0x22, 0x7d, 0x25, 0xfa, 0xc4, 0xd8, 0x97, 0xcb, 0x6b, 0x20, 0x76, 0xc2, - 0x42, 0x65, 0x2b, 0xa4, 0x0e, 0x05, 0x45, 0xc2, 0x0b, 0xcd, 0x4b, 0x42, 0x78, 0x93, 0xe9, 0xd9, 0x6a, 0x13, 0x06, 0x87, 0x5d, 0x67, 0xd2, 0x7e, 0x10, 0x5d, 0x68, 0x30, 0x3e, 0xc8, 0x58, 0xe0, - 0xc2, 0x07, 0x08, 0x6c, 0x57, 0x1b, 0x9d, 0xa1, 0xd4, 0x85, 0x48, 0x0f, 0xb6, 0x7f, 0xa0, 0x86, 0x83, 0xbb, 0xb8, 0x98, 0xfb, 0x11, 0xe1, 0x92, 0x44, 0x8b, 0x12, 0xf2, 0xb4, 0x35, 0x6a, 0x5b, - 0x3b, 0x2f, 0xf1, 0xd3, 0x4f, 0x00, 0x53, 0x77, 0x94, 0xe0, 0x3f, 0x6e, 0xb7, 0xbf, 0xff, 0x8b, 0x7c, 0x2e, 0x7f, 0x7c, 0x13, 0x8d, 0x4f, 0xef, 0x3e, 0xb9, 0x42, 0xc3, 0xfa, 0x4f, 0x7b, 0x86, - 0x2b, 0xde, 0xef, 0x87, 0xb7, 0x51, 0x5a, 0xb8, 0xb3, 0xd2, 0xa9, 0x5e, 0xaa, 0x88, 0xff, 0x8b, 0x7d, 0x26, 0x7d, 0x4d, 0x14, 0xbc, 0xea, 0x27, 0xaf, 0x4e, 0xad, 0xff, 0x7e, 0x69, 0x20, 0x19, - 0xd7, 0xb3, 0xd7, 0x9a, 0xd3, 0xff, 0xa2, 0x9f, 0xd3, 0x68, 0xbe, 0x7a, 0xc5, 0xfe, 0xfb, 0xc5, 0x2b, 0xf6, 0xae, 0x3f, 0xc3, 0xd3, 0xdb, 0xbb, 0x3d, 0xd4, 0xbc, 0xb4, 0x68, 0xfd, 0xb7, 0xe1, - 0xdc, 0x13, 0x64, 0xbf, 0x37, 0x0f, 0xdf, 0xd1, 0x7d, 0x5a, 0x26, 0x7f, 0xee, 0xae, 0x22, 0x6d, 0x82, 0x21, 0x78, 0x70, 0x86, 0x05, 0xe4, 0x6a, 0x75, 0xdb, 0xac, 0x4e, 0xf6, 0x85, 0xcf, 0x77, - 0xb0, 0x00, 0x56, 0x41, 0x47, 0x62, 0x3e, 0x78, 0x21, 0x1c, 0xcd, 0x46, 0x38, 0x80, 0xce, 0xb2, 0xc5, 0x9c, 0xcb, 0xd7, 0x63, 0x7d, 0x68, 0xb8, 0x30, 0xa0, 0x4f, 0x5b, 0xcf, 0x5c, 0xb1, 0xa8, - 0x37, 0xda, 0xe0, 0x42, 0x29, 0xc4, 0x1c, 0x97, 0x44, 0x21, 0x05, 0xaa, 0xb5, 0xe9, 0xd0, 0x2a, 0x60, 0xe6, 0x40, 0xb2, 0x9e, 0xb0, 0x03, 0xff, 0x07, 0x21, 0xfb, 0x5b, 0x8d, 0x39, 0xde, 0xbd, - 0x7e, 0xc9, 0x28, 0xbf, 0xbe, 0xfb, 0x54, 0x00, 0xfb, 0x9a, 0xa6, 0xfb, 0x9f, 0xe7, 0x5c, 0xe4, 0xdb, 0x33, 0x55, 0x64, 0x6e, 0x9c, 0x07, 0x3f, 0x94, 0x60, 0x3e, 0xc9, 0x82, 0xdf, 0x17, 0x0d, - 0x7e, 0xa2, 0xfd, 0x34, 0x63, 0x1f, 0x9f, 0x5c, 0xe5, 0xe6, 0x04, 0x70, 0xcc, 0x95, 0xbc, 0x47, 0x77, 0x4a, 0xd8, 0x6e, 0x02, 0x3e, 0x24, 0x3c, 0xda, 0xa5, 0x77, 0x9b, 0x95, 0x79, 0x14, 0x54, - 0xf6, 0x0c, 0xc0, 0x27, 0x8a, 0xaa, 0xe8, 0x34, 0x53, 0xe8, 0xce, 0xeb, 0x56, 0x4b, 0x8c, 0xa6, 0x21, 0xde, 0x16, 0xcc, 0x46, 0x5d, 0x51, 0x2a, 0x7b, 0xf4, 0xd3, 0x91, 0x1c, 0x45, 0xab, 0xbf, - 0x1c, 0x17, 0x29, 0xeb, 0xe7, 0x5d, 0xb6, 0x13, 0x83, 0x39, 0x80, 0x79, 0x7e, 0xb1, 0xf4, 0x1f, 0xf3, 0x1d, 0xfb, 0x41, 0xea, 0x0c, 0xef, 0xd9, 0xf5, 0x5c, 0xa8, 0x74, 0x6f, 0x1f, 0x14, 0x59, - 0xe6, 0xe4, 0xfe, 0x7d, 0x98, 0xbe, 0xc7, 0x30, 0xca, 0xdf, 0xc8, 0x3e, 0xb3, 0xf4, 0xf9, 0x7a, 0x06, 0x4d, 0x00, 0x2a, 0x7f, 0xe2, 0xe6, 0xa8, 0x62, 0x52, 0xae, 0xad, 0x61, 0x78, 0xb5, 0x56, - 0x76, 0xf8, 0x90, 0xee, 0x8d, 0x05, 0x87, 0x52, 0x25, 0xb8, 0x5e, 0x8a, 0xc3, 0x09, 0x87, 0xc3, 0xe3, 0x56, 0x65, 0x41, 0xa0, 0xe5, 0x15, 0x8d, 0xdc, 0x79, 0x0a, 0xb3, 0xe5, 0xca, 0xd3, 0x61, - 0xdf, 0x39, 0x05, 0xea, 0x26, 0x71, 0x56, 0x0a, 0x73, 0x4e, 0x3d, 0x0e, 0xf9, 0x20, 0x9f, 0x56, 0xab, 0x0b, 0x7f, 0xec, 0x77, 0xde, 0x52, 0xcb, 0xfc, 0xf6, 0x8b, 0x79, 0x76, 0x0b, 0xc1, 0xe3, - 0xf6, 0xd2, 0x7a, 0x24, 0x81, 0xe4, 0x0b, 0xf5, 0x67, 0x4e, 0x7c, 0x7c, 0x36, 0x35, 0x8f, 0x44, 0xf1, 0x91, 0x3a, 0xc0, 0x65, 0x1a, 0xa8, 0x45, 0x48, 0xeb, 0xcf, 0x76, 0x52, 0x7b, 0x72, 0xd5, - 0x56, 0xe5, 0x52, 0x5a, 0x87, 0x22, 0x38, 0x1f, 0xac, 0x5c, 0x8d, 0x73, 0x5c, 0x9e, 0x57, 0x2c, 0x92, 0x89, 0x6d, 0xc3, 0x77, 0x7a, 0xc5, 0x50, 0xc7, 0x4d, 0xeb, 0x22, 0x15, 0x09, 0xb6, 0x7b, - 0x17, 0x50, 0x97, 0x2a, 0xdd, 0x2e, 0x41, 0xd9, 0x2a, 0x68, 0x12, 0xb4, 0xfc, 0xd0, 0x69, 0x6a, 0xe5, 0xce, 0xf2, 0xfa, 0xc4, 0xa3, 0x77, 0x2a, 0xf5, 0x6d, 0xef, 0xea, 0x23, 0x0e, 0xf5, 0x3f, - 0x64, 0xaf, 0x5c, 0x79, 0xbd, 0xb9, 0x02, 0xd9, 0x4f, 0xb0, 0x4b, 0xe6, 0x6a, 0xd5, 0xa1, 0x7e, 0xdd, 0x0f, 0xf2, 0x9e, 0x0e, 0x8b, 0x23, 0x57, 0x8e, 0x64, 0x81, 0x5b, 0x2e, 0xc2, 0x8d, 0x88, - 0x5a, 0xe9, 0xec, 0x99, 0xe6, 0xb1, 0x4a, 0x6b, 0x8f, 0x9c, 0x42, 0x38, 0xc7, 0x26, 0x75, 0x2d, 0x21, 0x3f, 0x5c, 0x7a, 0xd8, 0x65, 0x56, 0x3b, 0x25, 0x4d, 0x1c, 0x8a, 0x58, 0x9a, 0xbc, 0x63, - 0xda, 0x8b, 0xbe, 0xe6, 0xfd, 0xc2, 0x5f, 0x75, 0xee, 0xe9, 0x28, 0x64, 0xe7, 0x69, 0xec, 0x28, 0x4e, 0xf1, 0xbd, 0xd8, 0x02, 0xf8, 0x50, 0xba, 0xd7, 0x33, 0xc9, 0x2b, 0x1b, 0xae, 0x50, 0xae, - 0xe0, 0xb4, 0xcc, 0x2e, 0xcb, 0x46, 0x38, 0x7d, 0xc8, 0xe7, 0xc5, 0x22, 0x0a, 0x85, 0x4d, 0x9a, 0xa7, 0x26, 0x11, 0x11, 0x97, 0x33, 0x1a, 0x0d, 0x22, 0x2e, 0xaa, 0xed, 0x91, 0x93, 0x04, 0xc7, - 0xe1, 0xea, 0x9a, 0xa3, 0xe1, 0x73, 0xc4, 0xea, 0x2a, 0x18, 0x49, 0x51, 0xa3, 0x75, 0xc5, 0x60, 0x6f, 0xb5, 0x86, 0xa4, 0x5c, 0xdc, 0x67, 0xd0, 0x63, 0xe8, 0x91, 0xfe, 0x01, 0x73, 0xaa, 0x53, - 0xe7, 0xcd, 0x45, 0x26, 0xab, 0xbe, 0xd8, 0xa9, 0xde, 0x3b, 0xf4, 0x9a, 0xdb, 0x9e, 0x8b, 0x47, 0x92, 0x95, 0xdf, 0xa8, 0xbe, 0x8d, 0x3a, 0x71, 0xaa, 0x6b, 0x40, 0x73, 0xc2, 0xf9, 0xb8, 0x65, - 0x2f, 0x78, 0xc1, 0x57, 0x02, 0x20, 0x1d, 0xc7, 0xad, 0xb0, 0xd1, 0xc9, 0x04, 0x53, 0x89, 0xb9, 0x85, 0x24, 0xbb, 0x79, 0xa6, 0xf3, 0x1d, 0x3b, 0x67, 0x83, 0x35, 0x64, 0xc8, 0xd9, 0x26, 0xc7, - 0x31, 0x38, 0x96, 0x18, 0xcc, 0x42, 0x35, 0x7a, 0x64, 0xc8, 0x14, 0xc0, 0xc4, 0x9d, 0x68, 0xa6, 0x83, 0xa6, 0x51, 0x80, 0x9a, 0x1d, 0x74, 0x29, 0x03, 0x79, 0x59, 0xef, 0x4b, 0x16, 0xdb, 0x9c, - 0xa7, 0xb8, 0xb1, 0xfc, 0xe0, 0x59, 0xe9, 0xb8, 0x67, 0xa9, 0xff, 0x7e, 0xea, 0xaf, 0x14, 0xaf, 0x69, 0x65, 0x4e, 0x73, 0xbc, 0x1a, 0xe5, 0x3f, 0x36, 0x71, 0xa0, 0x9c, 0xb3, 0x27, 0xd3, 0x84, - 0x7f, 0xca, 0xf5, 0xd5, 0x6a, 0xe9, 0x6d, 0xa3, 0xcc, 0xc2, 0x58, 0xce, 0xe5, 0xbc, 0x4b, 0xf4, 0x69, 0xea, 0x5e, 0x1d, 0x9a, 0xb7, 0x7e, 0xee, 0x47, 0xac, 0xa1, 0xe9, 0x3f, 0xd7, 0x6d, 0xa3, - 0xeb, 0xcf, 0x75, 0xdb, 0xe8, 0xda, 0x8e, 0x6c, 0xc2, 0x74, 0x49, 0x8a, 0xb1, 0xe2, 0x5b, 0x55, 0x47, 0x02, 0xb6, 0x91, 0x37, 0x52, 0x97, 0xef, 0x2d, 0x62, 0xe3, 0x9d, 0x82, 0x06, 0x4a, 0xc0, - 0x06, 0x13, 0x5b, 0xb1, 0x5e, 0x8d, 0x92, 0x34, 0xd6, 0xc1, 0x89, 0xc5, 0x60, 0x3b, 0x5d, 0x9c, 0xf5, 0x70, 0xb5, 0x96, 0x96, 0x71, 0xdd, 0x9b, 0xe7, 0x75, 0xc7, 0x1b, 0xdc, 0x81, 0x17, 0x23, - 0x13, 0x20, 0xb8, 0x79, 0xc7, 0xec, 0xf7, 0xc7, 0xe0, 0xd8, 0x5f, 0xc2, 0x93, 0xfc, 0xb3, 0x3a, 0x93, 0xd5, 0xaf, 0xeb, 0xf3, 0x8e, 0x5a, 0xf1, 0x21, 0x95, 0xe0, 0x5e, 0xe0, 0xec, 0xf7, 0xc5, - 0x6e, 0x7f, 0xc8, 0xbe, 0xe4, 0x0b, 0x3e, 0xdf, 0x4c, 0x2d, 0x9f, 0xcc, 0xa5, 0x58, 0x89, 0x32, 0x97, 0x6a, 0x32, 0xc8, 0x41, 0x36, 0x75, 0xbe, 0x65, 0x42, 0x7c, 0xae, 0x6e, 0x43, 0xd3, 0x4b, - 0x86, 0x3d, 0xd6, 0x2d, 0xb6, 0x90, 0x66, 0x8e, 0x3e, 0x93, 0xf1, 0x95, 0xb9, 0x41, 0x8f, 0x17, 0x20, 0x32, 0xe6, 0x3d, 0x64, 0x31, 0x5e, 0x4e, 0x8c, 0x8b, 0x68, 0xd3, 0xa8, 0x31, 0x4b, 0x55, - 0x36, 0x13, 0x59, 0x8d, 0xeb, 0x14, 0x88, 0x7c, 0xde, 0x66, 0xf3, 0x3d, 0xa4, 0x3e, 0x66, 0x27, 0xfc, 0x9c, 0x5d, 0x7f, 0xb5, 0xc8, 0x9a, 0xe7, 0x42, 0xb7, 0xbf, 0x7f, 0x61, 0xb3, 0x7d, 0xce, - 0x8d, 0xff, 0xb9, 0x9e, 0xee, 0x8a, 0x4e, 0xfb, 0xa9, 0x30, 0xe8, 0xb3, 0x6d, 0xf1, 0x11, 0x57, 0xe6, 0xd3, 0x77, 0xfc, 0x49, 0xbc, 0xff, 0x92, 0xe0, 0xff, 0x15, 0x32, 0x06, 0xbd, 0xf1, 0xfa, - 0x14, 0x0c, 0xf5, 0x6d, 0xe2, 0x93, 0x30, 0x65, 0xee, 0x34, 0xd8, 0xfa, 0xfb, 0x2b, 0x60, 0xd8, 0xcd, 0x76, 0x92, 0x37, 0x0a, 0x02, 0xef, 0xd5, 0x21, 0x43, 0x5f, 0x3f, 0xfa, 0xa1, 0x14, 0xe9, - 0xee, 0xa7, 0xbe, 0xaf, 0x30, 0x7c, 0xb7, 0x7e, 0xee, 0x17, 0xf0, 0x7c, 0xae, 0x6b, 0xf9, 0xeb, 0xdb, 0x2d, 0xf5, 0xd7, 0x2f, 0xb6, 0xd5, 0x0b, 0xed, 0xf9, 0xec, 0xf5, 0xea, 0xc6, 0x86, 0xfa, - 0xeb, 0xde, 0xa6, 0xba, 0xf0, 0xc9, 0x91, 0xad, 0x10, 0x6f, 0x4f, 0x0b, 0x20, 0x3d, 0xfa, 0xfa, 0x46, 0x95, 0x4c, 0x3b, 0x6f, 0x64, 0xfd, 0x32, 0xcf, 0xfa, 0x9d, 0x8a, 0x29, 0x3d, 0x4a, 0x11, - 0xa9, 0xb4, 0x21, 0x41, 0x93, 0xa3, 0x44, 0x7c, 0xad, 0x4a, 0xf3, 0x40, 0x62, 0xf7, 0x6d, 0x01, 0x76, 0xc7, 0xb3, 0x68, 0xeb, 0x80, 0xce, 0x62, 0x9b, 0xa2, 0xf0, 0x7b, 0x86, 0xa2, 0x0a, 0x5b, - 0xf6, 0x91, 0x55, 0x40, 0x09, 0xef, 0x37, 0xd5, 0x5f, 0x7f, 0x7d, 0x3d, 0x36, 0xfe, 0x7a, 0x93, 0x38, 0x5f, 0x25, 0xcf, 0x57, 0xb0, 0xbf, 0x7b, 0x87, 0xca, 0xef, 0x9d, 0x14, 0x5f, 0xa8, 0x5f, - 0xe5, 0xd0, 0xa7, 0x67, 0xd7, 0xc3, 0x66, 0x82, 0xdb, 0x02, 0xd9, 0x9d, 0x43, 0x4b, 0x48, 0xe0, 0x74, 0x3b, 0xfa, 0x3b, 0x35, 0x5c, 0xd8, 0x6b, 0x7b, 0x39, 0x3f, 0x00, 0x76, 0x3b, 0x00, 0x74, - 0xc4, 0xe2, 0x21, 0x84, 0xa3, 0xc1, 0x42, 0x80, 0x7b, 0xc2, 0x8f, 0xf2, 0x52, 0xa0, 0x2a, 0x9a, 0x0d, 0x2a, 0xce, 0x2a, 0x77, 0x28, 0xbe, 0xb6, 0x2c, 0x2f, 0xc9, 0x4f, 0xbe, 0xb4, 0xdf, 0x25, - 0xd2, 0x89, 0xa4, 0xf0, 0xc3, 0x8a, 0x5e, 0x00, 0x88, 0x2a, 0xa4, 0xe6, 0x04, 0xe9, 0xfd, 0x75, 0xd3, 0x3d, 0xd9, 0x8e, 0xf7, 0x04, 0xf9, 0x2b, 0xfa, 0xd5, 0x3d, 0xbb, 0xf0, 0x91, 0x93, 0xf9, - 0x4a, 0xf3, 0x8d, 0x75, 0xfe, 0x94, 0x30, 0x37, 0x34, 0x1b, 0x2c, 0xd8, 0x1d, 0x3b, 0xdf, 0xf0, 0xe9, 0x58, 0x5c, 0xca, 0x69, 0xb9, 0x52, 0x38, 0x1b, 0xc5, 0xea, 0xb0, 0x2c, 0x77, 0x53, 0xf4, - 0x8b, 0x4f, 0x76, 0xdb, 0xbf, 0x39, 0x9c, 0xf7, 0xa4, 0xaf, 0xa3, 0x7a, 0xff, 0x60, 0xca, 0xe0, 0x9e, 0x56, 0x83, 0x3d, 0xa8, 0x2c, 0xb1, 0x0f, 0x49, 0xc8, 0xd9, 0xd2, 0xa0, 0x72, 0xd9, 0xa2, - 0x02, 0x57, 0x09, 0x3c, 0x6d, 0xa6, 0xc4, 0xd2, 0xaf, 0x21, 0x96, 0xca, 0x96, 0xbe, 0x57, 0x1c, 0x9c, 0xde, 0xcc, 0xb7, 0x2c, 0xa1, 0xb2, 0xc7, 0x72, 0x1f, 0x35, 0xed, 0x7a, 0x0d, 0x3b, 0xd4, - 0x29, 0x22, 0x1c, 0x42, 0x56, 0x51, 0x28, 0xb9, 0x48, 0xaa, 0x0d, 0x11, 0x25, 0x7a, 0xf0, 0xb9, 0x7c, 0xc7, 0x9f, 0x90, 0xdd, 0x94, 0xc4, 0x06, 0x3f, 0x18, 0x9d, 0x34, 0xba, 0x17, 0xb8, 0x7e, - 0x2c, 0x8e, 0xff, 0x42, 0xf3, 0xca, 0x8c, 0xeb, 0xd5, 0xd4, 0x48, 0x7d, 0x65, 0xaa, 0x12, 0xe8, 0x86, 0x00, 0x96, 0x83, 0x72, 0x91, 0xd7, 0x2e, 0xa0, 0x1e, 0x0e, 0xe1, 0x3e, 0x5c, 0xd7, 0x71, - 0x26, 0xa2, 0xfc, 0xb2, 0xc9, 0xf2, 0x75, 0x29, 0xf1, 0xd6, 0x42, 0x86, 0x74, 0x66, 0x14, 0x52, 0xb9, 0x62, 0x77, 0xa1, 0x5f, 0xb8, 0xd5, 0x22, 0xdf, 0x88, 0x62, 0xad, 0x44, 0x06, 0x33, 0xec, - 0x94, 0x73, 0xa0, 0xd2, 0xf2, 0x98, 0x19, 0xfa, 0xee, 0x4c, 0x8c, 0xdd, 0x21, 0x7e, 0xcc, 0xd4, 0x7f, 0x49, 0xfb, 0x79, 0xad, 0x93, 0x78, 0x2f, 0xd2, 0x5f, 0x2b, 0xb6, 0xfe, 0xbe, 0xe3, 0x7b, - 0x7e, 0x0f, 0x0b, 0x77, 0xdb, 0x98, 0x79, 0x24, 0xfb, 0xee, 0x8d, 0xea, 0x13, 0x5b, 0x5f, 0xaf, 0xa7, 0x22, 0x83, 0xe9, 0x1c, 0xc7, 0x19, 0xa1, 0xea, 0xb4, 0x6d, 0xed, 0x1c, 0x36, 0x0c, 0xb0, - 0x08, 0xa3, 0x03, 0xb0, 0x3f, 0x74, 0xb4, 0x79, 0x62, 0xb4, 0xec, 0xd0, 0x11, 0xf5, 0x09, 0xcf, 0x8b, 0x84, 0xb5, 0xed, 0xae, 0x15, 0xf5, 0x3d, 0xa7, 0x0f, 0xa0, 0x7d, 0x42, 0xf5, 0x92, 0x97, - 0x59, 0x7c, 0xc9, 0x26, 0x2a, 0x98, 0x94, 0x74, 0xef, 0x51, 0x4c, 0xc7, 0xa3, 0x41, 0x11, 0x76, 0xc3, 0x48, 0x7b, 0x0a, 0xfb, 0x98, 0xee, 0x73, 0x05, 0xa2, 0x7b, 0x0b, 0x34, 0x21, 0xf7, 0x73, - 0xeb, 0x3e, 0xd6, 0x18, 0xde, 0x91, 0xe2, 0x8b, 0x07, 0xb6, 0xec, 0x3b, 0xc2, 0xf3, 0xd9, 0xfb, 0xbb, 0xd9, 0x33, 0xc1, 0x9f, 0xd9, 0xb9, 0xdd, 0x8c, 0x02, 0xb1, 0xab, 0x64, 0x67, 0xa1, 0xa9, - 0x60, 0xe2, 0xc0, 0x3d, 0x62, 0xed, 0xb7, 0xa3, 0x1e, 0x6d, 0x18, 0x4e, 0xf2, 0x25, 0xf1, 0x00, 0x0d, 0x87, 0x2e, 0x18, 0x93, 0x7d, 0xae, 0x2e, 0x48, 0x16, 0x38, 0x28, 0xe0, 0x02, 0x50, 0xc7, - 0x06, 0xce, 0x46, 0xc4, 0xa2, 0x61, 0xd6, 0x3b, 0xcd, 0x81, 0x1e, 0x6b, 0xc2, 0xf5, 0x79, 0xae, 0x14, 0x3a, 0xb5, 0x3a, 0x6f, 0x36, 0xdc, 0x0e, 0x1e, 0x26, 0x24, 0x59, 0xfc, 0x00, 0x66, 0x18, - 0xd4, 0xb3, 0xa6, 0xf8, 0xa2, 0xb7, 0xc0, 0x9f, 0x8a, 0x80, 0x1e, 0x0b, 0x07, 0x7c, 0xad, 0xcb, 0xfc, 0xfb, 0xa6, 0x06, 0xf5, 0x23, 0xd4, 0x4b, 0x5c, 0xcf, 0x9e, 0x86, 0xf1, 0x06, 0x9a, 0xfa, - 0xf4, 0x03, 0x3f, 0xa3, 0x40, 0xe4, 0x41, 0xe4, 0x5c, 0x6b, 0xf4, 0xc7, 0xa0, 0x2a, 0xde, 0x76, 0xe1, 0x67, 0xdd, 0xf6, 0x1b, 0xb4, 0xc3, 0x1f, 0x8a, 0xd9, 0x7f, 0x01, 0x77, 0xf8, 0x3f, 0x52, - 0x4e, 0xbf, 0x41, 0xf1, 0xbe, 0xa1, 0x8c, 0x7f, 0x0b, 0x05, 0x7d, 0xe3, 0xf3, 0x5f, 0xa1, 0x8b, 0x5e, 0x6d, 0x89, 0x7b, 0xfb, 0xe9, 0x93, 0x55, 0x71, 0x4f, 0x33, 0xfa, 0xbd, 0x70, 0xfa, 0x44, - 0xfb, 0x79, 0x5b, 0xbd, 0x7f, 0x72, 0xd5, 0x8a, 0x26, 0x08, 0x2a, 0x80, 0xd5, 0xc4, 0x05, 0x67, 0xf5, 0xee, 0x8e, 0xe9, 0xdd, 0xa1, 0x4f, 0xe2, 0xac, 0xb7, 0x77, 0x7c, 0xb9, 0xa0, 0x5a, 0xcb, - 0x14, 0x55, 0x78, 0x63, 0xaf, 0x8c, 0x22, 0x86, 0xa9, 0x54, 0x12, 0x55, 0x24, 0x70, 0xf3, 0xf5, 0x9a, 0xec, 0xe7, 0xfb, 0x6d, 0xb9, 0xb7, 0x1b, 0x8a, 0xa0, 0x40, 0x6b, 0xeb, 0x1c, 0xd8, 0x1e, - 0x10, 0x09, 0x61, 0xc5, 0x04, 0xc5, 0xfa, 0x40, 0x88, 0x52, 0xb7, 0x23, 0x8e, 0x3f, 0xe1, 0x81, 0x3d, 0xb4, 0xd9, 0x6e, 0x6f, 0x12, 0xf0, 0xa7, 0xbd, 0xf0, 0x93, 0x81, 0xf6, 0x35, 0x68, 0xf3, - 0xbe, 0xfa, 0xfe, 0xcb, 0x22, 0x7f, 0x57, 0x79, 0xff, 0x9b, 0x0d, 0xf0, 0xd5, 0x6a, 0x7b, 0x5d, 0x32, 0xef, 0xf8, 0xf4, 0xff, 0x19, 0x23, 0xff, 0x33, 0x63, 0xe4, 0xab, 0x38, 0xbe, 0xbd, 0xe1, - 0x1e, 0xc9, 0x0d, 0xfc, 0x44, 0xfb, 0x79, 0xc3, 0xbd, 0x7f, 0x72, 0x6d, 0x01, 0x31, 0xc1, 0xdf, 0x2b, 0x33, 0x62, 0x9a, 0x46, 0xf6, 0xa6, 0x71, 0xf4, 0x82, 0xcc, 0x62, 0x8b, 0xf6, 0xb6, 0xcc, - 0x51, 0xd3, 0x1d, 0x7e, 0x9f, 0x6c, 0x56, 0x88, 0x64, 0xd5, 0xd0, 0x21, 0xf6, 0x59, 0x82, 0xea, 0xe3, 0x65, 0x02, 0x9d, 0xac, 0x8b, 0x10, 0xc8, 0x9a, 0xd7, 0x6c, 0xa9, 0x60, 0xa4, 0x44, 0x1e, - 0xb3, 0x05, 0x85, 0x07, 0x23, 0x78, 0x1d, 0x49, 0x39, 0x2e, 0xf4, 0x34, 0xba, 0xd6, 0x16, 0xb1, 0x52, 0x76, 0x13, 0x62, 0x62, 0x5f, 0x8f, 0x01, 0x68, 0x92, 0x6b, 0xe2, 0xf3, 0xfe, 0xf9, 0x04, - 0x4a, 0x72, 0xc7, 0x90, 0xb9, 0x55, 0x1b, 0x75, 0x6b, 0x32, 0x1e, 0xc3, 0x42, 0xfc, 0x42, 0xfd, 0x69, 0x3a, 0x3e, 0x3f, 0x9b, 0x8a, 0x88, 0x18, 0xcf, 0x61, 0xd3, 0xcd, 0xd5, 0x71, 0xde, 0x5e, - 0x14, 0x46, 0xc7, 0x81, 0xbd, 0x7f, 0xd8, 0x44, 0x82, 0xc1, 0x6a, 0x3b, 0x14, 0x26, 0x80, 0xdd, 0xd9, 0x72, 0x4f, 0xf2, 0xc8, 0x22, 0x30, 0xc4, 0xb6, 0x8c, 0xbc, 0xd1, 0xcf, 0x62, 0xbb, 0x11, - 0xd6, 0x14, 0xb8, 0xde, 0xc1, 0x80, 0x01, 0x5f, 0x1a, 0x8b, 0xf7, 0x05, 0x31, 0xb3, 0x51, 0x5f, 0xc1, 0xc3, 0xe5, 0xa5, 0xf6, 0x51, 0xd5, 0xdc, 0x02, 0xc6, 0x97, 0x6c, 0xde, 0x6f, 0xc3, 0xb3, - 0x8f, 0xb5, 0xca, 0x79, 0x8b, 0xcc, 0xbe, 0x04, 0x65, 0x27, 0xb6, 0xc8, 0xc9, 0xe4, 0x1e, 0x80, 0xc3, 0x93, 0xec, 0x52, 0xdb, 0x51, 0x26, 0x0e, 0xe0, 0xce, 0x02, 0xd7, 0x67, 0x3f, 0x37, 0xf7, - 0x62, 0xa0, 0x35, 0x12, 0x5a, 0x81, 0xe9, 0x9e, 0x1c, 0x09, 0x8a, 0x72, 0x7a, 0xc6, 0x8c, 0xce, 0x81, 0x43, 0xb8, 0x6c, 0x1c, 0xc3, 0x20, 0x65, 0x55, 0x6b, 0xba, 0x5a, 0xf9, 0x73, 0xfe, 0x02, - 0xee, 0x60, 0xd1, 0x1b, 0x71, 0x15, 0x82, 0x20, 0xc6, 0x59, 0x9d, 0x74, 0xcf, 0x05, 0xbf, 0x8c, 0x37, 0x74, 0x9c, 0x7a, 0x96, 0xd4, 0xb3, 0xaa, 0xcd, 0x9b, 0x67, 0xdc, 0xf5, 0x7f, 0xcf, 0xd7, - 0xfc, 0x89, 0xf6, 0xb5, 0x38, 0xf5, 0xc3, 0x93, 0x29, 0xfe, 0xe7, 0x27, 0x56, 0x2c, 0xa3, 0xda, 0x5a, 0xaa, 0x2b, 0x8a, 0xe7, 0x85, 0xe3, 0x21, 0xcd, 0x8d, 0x15, 0x0f, 0x15, 0x6e, 0x87, 0x9e, - 0x45, 0xc7, 0x44, 0x77, 0xab, 0x78, 0x79, 0x50, 0xd6, 0x89, 0xab, 0x5a, 0x19, 0x56, 0xd3, 0x35, 0xa0, 0x1c, 0x5d, 0x7b, 0xcc, 0xb4, 0x5e, 0xeb, 0xb1, 0x72, 0x57, 0xed, 0xcf, 0x55, 0xd4, 0xe4, - 0xb9, 0x00, 0x61, 0x12, 0xb1, 0xe8, 0x16, 0x0a, 0xae, 0x6f, 0x46, 0x2d, 0xa3, 0x43, 0x41, 0x9d, 0xa2, 0x56, 0x7e, 0x08, 0xd8, 0x3f, 0x37, 0x01, 0xfc, 0xb0, 0x17, 0xdf, 0x47, 0x32, 0xff, 0xfe, - 0x0f, 0xf4, 0x05, 0x97, 0xf9, 0xd5, 0x7f, 0x7f, 0xe3, 0x00, 0x7b, 0x29, 0xe7, 0xfd, 0xfb, 0x45, 0x3f, 0xc2, 0x3e, 0xbe, 0x4d, 0xea, 0xd9, 0xe0, 0x64, 0xe9, 0xeb, 0xdb, 0x8f, 0x2f, 0xf3, 0xc2, - 0x0f, 0x66, 0x45, 0x3d, 0x6b, 0x9b, 0x38, 0xfd, 0xe3, 0xd1, 0xfb, 0x00, 0xf2, 0x55, 0x74, 0x41, 0x95, 0x16, 0x8e, 0x3f, 0x7b, 0x52, 0x9a, 0x3e, 0xf8, 0xe1, 0x3e, 0x29, 0x95, 0x65, 0x55, 0x64, - 0x33, 0x2f, 0x8d, 0x5f, 0x71, 0xd8, 0x21, 0xf4, 0xb3, 0x3a, 0xf7, 0x1e, 0x75, 0xff, 0x8e, 0x61, 0x77, 0xad, 0x93, 0xf3, 0x8a, 0xbc, 0xb9, 0x6e, 0xed, 0xa1, 0x0c, 0xbe, 0x6d, 0xaa, 0xf9, 0x98, - 0x3f, 0xe1, 0xce, 0x77, 0xbc, 0x56, 0x3c, 0x7f, 0x7d, 0x33, 0xd5, 0xc3, 0x60, 0xba, 0x1e, 0x6a, 0x7a, 0x43, 0xad, 0x9b, 0x5e, 0x2d, 0x61, 0x0e, 0xaf, 0xeb, 0xc4, 0xfe, 0x8c, 0x88, 0x7d, 0xc7, - 0x9f, 0x49, 0x82, 0x01, 0x8c, 0xdc, 0x3d, 0x05, 0xeb, 0x20, 0x2c, 0x03, 0x6b, 0x6b, 0x02, 0xd5, 0x30, 0xae, 0x36, 0xa9, 0x8e, 0x8b, 0x6a, 0xb3, 0xda, 0x1c, 0x6b, 0x5c, 0x4c, 0xc1, 0xed, 0x49, - 0xe7, 0x4a, 0x4f, 0x00, 0xfa, 0x2d, 0xb8, 0xe9, 0xc3, 0x1d, 0xb0, 0x62, 0x74, 0x6c, 0xfd, 0x25, 0xf0, 0xfb, 0x52, 0x4a, 0xe8, 0x3d, 0x4d, 0x5d, 0x5b, 0xc5, 0xb3, 0xb7, 0xb0, 0xec, 0x37, 0x4c, - 0xfa, 0xbd, 0xc0, 0xbd, 0xfb, 0x2d, 0xaf, 0x6c, 0xba, 0xf5, 0x6e, 0x32, 0x76, 0x93, 0x10, 0x09, 0x46, 0x84, 0x05, 0xfa, 0xa5, 0x53, 0x6c, 0xae, 0x37, 0x16, 0xab, 0x2e, 0x74, 0x1d, 0x9e, 0xa0, - 0x4c, 0xf5, 0x08, 0x7b, 0x5b, 0x00, 0x49, 0xb0, 0x70, 0xc7, 0x8d, 0xfa, 0x8e, 0xb9, 0x18, 0xf4, 0x06, 0xf1, 0x0f, 0x88, 0x43, 0x18, 0xe3, 0x62, 0x80, 0xc3, 0x79, 0x2b, 0x83, 0x01, 0x42, 0xe3, - 0x46, 0x56, 0xf8, 0x2c, 0x52, 0xa8, 0x18, 0x9a, 0x68, 0x32, 0xc9, 0x1f, 0xb4, 0xf5, 0x3a, 0xba, 0xc3, 0xa8, 0x1f, 0x02, 0x25, 0xc8, 0x43, 0x7e, 0xca, 0x4f, 0xb4, 0xff, 0x30, 0xe5, 0x2d, 0x64, - 0x82, 0x4c, 0xf3, 0x51, 0x86, 0xc8, 0x59, 0x26, 0x0b, 0x79, 0x20, 0x13, 0x98, 0x3a, 0xd2, 0xc1, 0x9c, 0x27, 0x0f, 0x0c, 0x09, 0xf5, 0xdb, 0x4c, 0xa0, 0x19, 0x46, 0x9f, 0x47, 0xac, 0x98, 0x0b, - 0x7b, 0xca, 0xe2, 0xb0, 0x63, 0xdd, 0x8b, 0x04, 0xbd, 0x15, 0x12, 0x90, 0xe4, 0x3d, 0x8c, 0xb7, 0xf6, 0x23, 0xe9, 0x71, 0x6b, 0x00, 0xb8, 0xa4, 0x25, 0xcb, 0xac, 0x23, 0xd6, 0x89, 0x9b, 0x43, - 0x0d, 0x22, 0x94, 0xa6, 0x2c, 0xd0, 0x1b, 0xb2, 0xf9, 0x56, 0x39, 0xfc, 0xed, 0xe3, 0xf9, 0x91, 0x3e, 0xb5, 0x37, 0xe8, 0xdf, 0x01, 0x10, 0xc0, 0xa6, 0xf5, 0xaa, 0xad, 0xe9, 0x83, 0xa4, 0x45, - 0x39, 0x65, 0xd7, 0xc1, 0xb6, 0x85, 0xe4, 0x28, 0xc1, 0x53, 0xdd, 0x95, 0x41, 0x3e, 0x4c, 0x56, 0x47, 0xdb, 0x30, 0xa9, 0xac, 0xb4, 0x31, 0xca, 0x51, 0xb9, 0xd3, 0xb0, 0x3d, 0x62, 0x11, 0x65, - 0xd2, 0x91, 0x33, 0x6f, 0xa5, 0x4d, 0x22, 0x4b, 0x7c, 0xc9, 0xae, 0x12, 0x86, 0x74, 0x7c, 0x63, 0x5d, 0xfa, 0xa2, 0xc7, 0x6c, 0x55, 0x56, 0x8b, 0x2a, 0x9b, 0xa8, 0xf3, 0x62, 0x82, 0xeb, 0xf6, - 0x26, 0x2e, 0xc7, 0xdf, 0x5f, 0xe3, 0x47, 0xef, 0xf2, 0x8d, 0xbe, 0xbe, 0x99, 0x00, 0x11, 0x72, 0xa3, 0x14, 0x18, 0xf9, 0xf2, 0xa1, 0x3f, 0x38, 0x22, 0x9f, 0xc4, 0xf6, 0x4b, 0x37, 0xf0, 0x67, - 0x21, 0x7c, 0xc7, 0x16, 0xbd, 0x52, 0x38, 0xb7, 0x41, 0x35, 0xbc, 0x59, 0x29, 0xf7, 0xce, 0xe3, 0x07, 0xa5, 0xc3, 0x3b, 0xe2, 0xaf, 0x93, 0xfd, 0xee, 0xd1, 0x54, 0xb0, 0x83, 0xb3, 0x02, 0x57, - 0x40, 0x80, 0xf0, 0xdd, 0x71, 0xb9, 0xca, 0x4a, 0x9f, 0xdf, 0x75, 0xf3, 0xb9, 0xbe, 0x58, 0xe5, 0xab, 0x34, 0xb7, 0x12, 0x87, 0xc1, 0x65, 0x81, 0x6d, 0x1d, 0x93, 0xda, 0xb2, 0xa7, 0x1e, 0x3e, - 0x75, 0xbc, 0xb8, 0x30, 0xd8, 0xe4, 0xc2, 0x03, 0xe1, 0xbc, 0xe2, 0x39, 0x05, 0xdd, 0x05, 0x68, 0x99, 0x9f, 0x16, 0x25, 0xb9, 0xa1, 0x4e, 0xca, 0x5e, 0x4b, 0x2c, 0x9e, 0x12, 0x94, 0x1c, 0x9e, - 0x30, 0xd3, 0xdf, 0x89, 0xd1, 0x57, 0x3d, 0xf8, 0x3e, 0x63, 0xab, 0xc0, 0xbf, 0xef, 0x34, 0x7b, 0xac, 0xf6, 0xf7, 0x1d, 0xdd, 0x57, 0x76, 0x3e, 0xdf, 0x4d, 0xad, 0x00, 0x06, 0xc0, 0x20, 0x03, - 0xd6, 0x83, 0x43, 0x86, 0x02, 0x17, 0x2e, 0x65, 0xce, 0xf3, 0x71, 0xd8, 0xea, 0xf0, 0x22, 0x4f, 0xe8, 0x2c, 0x3b, 0x1e, 0xa0, 0xf6, 0xb8, 0xc0, 0xcd, 0x43, 0x28, 0xea, 0x8b, 0x43, 0x4f, 0x05, - 0xf8, 0xc9, 0x59, 0xf9, 0x32, 0x63, 0xac, 0xc9, 0x1a, 0x9c, 0xef, 0xf3, 0x36, 0xba, 0x60, 0x07, 0x9f, 0x6c, 0x7c, 0xd7, 0x26, 0x02, 0x3c, 0x5a, 0xc2, 0x8d, 0x42, 0xfa, 0xa3, 0xe9, 0x7f, 0x49, - 0xaa, 0x08, 0x6f, 0x36, 0xf6, 0xb9, 0x1d, 0x82, 0x7e, 0x78, 0x69, 0x7d, 0xa4, 0xff, 0xca, 0x8e, 0x8f, 0x4f, 0x27, 0xd7, 0x90, 0x03, 0xc2, 0xc6, 0x83, 0xfd, 0x6c, 0xbd, 0x4d, 0xa5, 0x32, 0x65, - 0xe7, 0x3c, 0x2a, 0x90, 0x29, 0xb9, 0xf5, 0x28, 0x9e, 0x0a, 0xa5, 0x46, 0xc2, 0x69, 0x6b, 0x81, 0xb6, 0x87, 0xad, 0x29, 0xe3, 0xcb, 0xce, 0x1b, 0xc9, 0xad, 0x17, 0x21, 0x88, 0x05, 0x8f, 0xd0, - 0xfa, 0xe0, 0xa6, 0x1a, 0x7e, 0xf1, 0x2d, 0x0c, 0x95, 0x4c, 0xeb, 0xc0, 0x2f, 0x3b, 0x00, 0x34, 0xca, 0xf3, 0x62, 0x5d, 0xe0, 0xe3, 0x69, 0x4a, 0x71, 0xc8, 0xbb, 0x3d, 0x7c, 0x9b, 0x3d, 0x8f, - 0xd4, 0xcd, 0xbc, 0x12, 0x7d, 0xe5, 0xc9, 0xd3, 0xd2, 0x9d, 0x58, 0x25, 0xe3, 0xad, 0xdb, 0x5a, 0xa0, 0xd7, 0xcd, 0x5c, 0x99, 0x17, 0x6b, 0x7c, 0x9c, 0x43, 0xf9, 0x10, 0x06, 0xf0, 0xaa, 0xe3, - 0x84, 0x83, 0x56, 0x1c, 0x0f, 0x4a, 0xd8, 0x9d, 0xc4, 0x63, 0x77, 0x01, 0x73, 0x66, 0x69, 0x00, 0x97, 0x10, 0xdb, 0x17, 0x8c, 0x99, 0x50, 0xbc, 0x67, 0x94, 0x24, 0xd2, 0x8a, 0x3a, 0xed, 0x1d, - 0x47, 0xcb, 0xab, 0x3b, 0x29, 0xad, 0x9c, 0x92, 0xf2, 0x4d, 0xa8, 0x35, 0x00, 0x8b, 0xbb, 0x79, 0xea, 0xde, 0x5f, 0x13, 0x9f, 0xf4, 0xd3, 0xdf, 0x8c, 0xfa, 0xcf, 0x42, 0x78, 0x9a, 0xfc, 0x67, - 0x42, 0x3f, 0x0f, 0x3a, 0x9b, 0x33, 0x8e, 0xb2, 0x5f, 0xe4, 0x21, 0xd6, 0x0e, 0x96, 0x5f, 0xb1, 0x01, 0x7c, 0x3e, 0x9f, 0x01, 0x70, 0x44, 0x0a, 0x6e, 0x58, 0x02, 0x14, 0x00, 0x9c, 0x53, 0x41, - 0x2e, 0xb6, 0x1b, 0x6d, 0x8d, 0x1a, 0x6b, 0x30, 0x37, 0x04, 0x92, 0xc5, 0x15, 0x64, 0x75, 0x31, 0x65, 0x64, 0x77, 0xe8, 0x9b, 0x79, 0xe6, 0x93, 0x04, 0xc1, 0xed, 0x14, 0x74, 0x85, 0x22, 0xe5, - 0x92, 0x2c, 0xce, 0x95, 0x0a, 0x8f, 0x13, 0x14, 0xfe, 0x7b, 0x48, 0x5b, 0x4f, 0xb2, 0xfe, 0x93, 0x86, 0xfe, 0x05, 0x00, 0xe9, 0x46, 0xb9, 0xfc, 0x24, 0xcc, 0x9e, 0xbf, 0xff, 0x7f, 0x2f, 0x30, - 0x0f, 0x1f, 0x0f, 0xa4, 0xaf, 0x18, 0x24, 0x37, 0x9c, 0xbd, 0xaf, 0xb5, 0x95, 0x4f, 0x47, 0x1a, 0xfc, 0xd5, 0xbe, 0xb8, 0xad, 0x93, 0xdf, 0x38, 0x18, 0xc3, 0x38, 0xf7, 0x67, 0xd9, 0x30, 0xeb, - 0x5f, 0x5c, 0x5f, 0xc4, 0xe7, 0xd6, 0x5b, 0x69, 0x1c, 0x1d, 0x9b, 0xa7, 0x4f, 0x3c, 0xf1, 0x2d, 0x78, 0xe9, 0x96, 0x83, 0x5d, 0x4b, 0x13, 0xdf, 0x7d, 0xaa, 0x8c, 0xf3, 0xd7, 0x5f, 0xf3, 0x89, - 0x5b, 0x2f, 0xe9, 0xba, 0xb3, 0xde, 0xa9, 0xf2, 0xf7, 0xa3, 0xf9, 0xfc, 0xa1, 0xcb, 0x30, 0x73, 0x7c, 0xbf, 0x7a, 0x7b, 0x4f, 0xdc, 0x39, 0x40, 0x3f, 0x27, 0x30, 0xdc, 0xe8, 0xe7, 0xff, 0x44, - 0x00, 0xfb, 0xfc, 0xb1, 0x0f, 0x7d, 0xc2, 0x3e, 0x10, 0x7f, 0xd7, 0x4a, 0xe3, 0xcd, 0x92, 0x7b, 0x79, 0xfb, 0xf5, 0x24, 0x39, 0xdf, 0x3f, 0x97, 0x1f, 0xdd, 0x28, 0xe7, 0x97, 0x6d, 0x72, 0x9e, - 0x41, 0x13, 0x37, 0x49, 0x4f, 0x57, 0x85, 0xa7, 0xc3, 0x5b, 0xc6, 0x34, 0x1d, 0x20, 0x35, 0xe8, 0x66, 0xa1, 0x14, 0x6b, 0x85, 0x5d, 0x90, 0xab, 0x78, 0x21, 0xfa, 0x14, 0x2d, 0xb2, 0xce, 0xfc, - 0xb4, 0xcc, 0x87, 0x60, 0x48, 0x54, 0xcc, 0xb1, 0x45, 0x6c, 0xce, 0xed, 0xbb, 0x35, 0x56, 0x2f, 0xd7, 0x7b, 0x8a, 0x3d, 0x4b, 0xf3, 0xe3, 0x62, 0x07, 0x93, 0x3a, 0xaf, 0xf1, 0xba, 0x8b, 0x21, - 0xb5, 0xde, 0x62, 0xeb, 0xe3, 0xd9, 0x9f, 0xb0, 0x49, 0xaa, 0xa0, 0xad, 0x5f, 0x2d, 0x57, 0xe8, 0x7e, 0x98, 0xea, 0x43, 0x6d, 0xcf, 0x2d, 0x66, 0x11, 0x8f, 0x99, 0x38, 0x6f, 0x64, 0x9f, 0x18, - 0xf6, 0x76, 0x73, 0x6d, 0xe7, 0x3c, 0xe1, 0x5c, 0x39, 0x8b, 0x05, 0xb9, 0x02, 0xfc, 0x9d, 0x9e, 0x31, 0xf0, 0xd6, 0x73, 0x51, 0xda, 0x3d, 0x74, 0xb9, 0xb0, 0xb9, 0x68, 0x52, 0xc2, 0x64, 0x80, - 0xa2, 0x94, 0x01, 0x1a, 0xb1, 0x2d, 0x57, 0x8d, 0xa7, 0x2d, 0x91, 0x2d, 0x0f, 0xe9, 0xdc, 0x4f, 0x2c, 0xb5, 0x85, 0x45, 0x5f, 0x86, 0x25, 0x07, 0x01, 0xe1, 0x3d, 0x5a, 0x9c, 0x4f, 0x6a, 0x44, - 0xc6, 0x15, 0x9e, 0x38, 0x5b, 0x63, 0x03, 0xeb, 0xea, 0xa1, 0x7c, 0xcc, 0x8f, 0xfe, 0xa5, 0x09, 0xc9, 0x33, 0x28, 0xd1, 0x3d, 0x05, 0xe6, 0xc3, 0x16, 0xbd, 0xcd, 0xcf, 0x47, 0xba, 0xfc, 0xbf, - 0xa3, 0x7b, 0x65, 0xe8, 0xdb, 0xdd, 0x8c, 0x98, 0xd6, 0xd9, 0x9f, 0x27, 0xdc, 0xa0, 0x32, 0x7c, 0x7e, 0x03, 0x60, 0xcc, 0xfe, 0x50, 0xa1, 0x71, 0xba, 0x35, 0x24, 0x27, 0x46, 0xb3, 0x94, 0xb0, - 0xe0, 0x33, 0x55, 0x5f, 0x92, 0x1e, 0x29, 0xc3, 0x80, 0xbe, 0x48, 0x71, 0x64, 0x67, 0x0e, 0xab, 0x8d, 0x2b, 0xb0, 0x4f, 0x36, 0xdb, 0x84, 0x04, 0x2f, 0x0a, 0x93, 0x71, 0x9e, 0x61, 0x79, 0x43, - 0x03, 0x62, 0xe0, 0xb0, 0x07, 0x10, 0x54, 0xb4, 0xd9, 0x4d, 0x06, 0x05, 0xd3, 0x55, 0xc1, 0x09, 0x1a, 0xf9, 0x47, 0x7d, 0xfa, 0x86, 0xf8, 0xbb, 0xaa, 0x28, 0xd7, 0xb9, 0x80, 0xdf, 0x49, 0xa6, - 0xdb, 0xd3, 0xf0, 0xa7, 0x77, 0xd9, 0xed, 0x10, 0x36, 0xf2, 0x88, 0x5d, 0xfa, 0x42, 0xf4, 0x69, 0x02, 0x5e, 0x2e, 0x67, 0x57, 0x4a, 0x3f, 0x73, 0x3f, 0x39, 0x5b, 0xe1, 0xb6, 0x24, 0xb2, 0x82, - 0xec, 0xd6, 0x83, 0x1c, 0x2e, 0x86, 0x93, 0x01, 0x77, 0x04, 0x05, 0xc0, 0x7b, 0x54, 0x4e, 0x02, 0x26, 0x58, 0x63, 0x00, 0x3b, 0x92, 0x66, 0xe5, 0xc4, 0x22, 0x14, 0x47, 0xf9, 0x02, 0xea, 0x93, - 0x98, 0x27, 0x56, 0x2e, 0xd9, 0xa9, 0xa2, 0xd1, 0xc9, 0xe1, 0xbe, 0xc9, 0x54, 0x07, 0xe5, 0x61, 0xa5, 0x90, 0xb5, 0xaa, 0x32, 0xe3, 0xce, 0xd7, 0xed, 0xec, 0xb1, 0x00, 0xf6, 0x2d, 0xcf, 0x35, - 0x72, 0x97, 0x8b, 0xdf, 0x30, 0xf1, 0xb1, 0x2c, 0xc8, 0x17, 0x9a, 0xcf, 0x3c, 0xbc, 0xb2, 0x70, 0x42, 0xfe, 0x23, 0x34, 0x63, 0x00, 0x94, 0xd2, 0xe9, 0xb8, 0xad, 0x33, 0x56, 0x2e, 0xf0, 0x05, - 0x8e, 0xa5, 0x89, 0x4f, 0x69, 0x6e, 0xcd, 0x61, 0xa7, 0xcf, 0x3a, 0xd2, 0xbb, 0x9e, 0x97, 0xb7, 0xb5, 0xa4, 0x87, 0xfc, 0x5a, 0xaf, 0x54, 0x9f, 0x7f, 0xf8, 0xf3, 0xf5, 0x54, 0x5c, 0xd2, 0xa5, - 0xb6, 0x3c, 0xa5, 0x2a, 0x17, 0x63, 0x0d, 0x28, 0xef, 0xec, 0x36, 0x36, 0x0b, 0x6a, 0x2e, 0xe3, 0x9d, 0x97, 0x5f, 0xbc, 0xad, 0x2c, 0x61, 0x9d, 0xdf, 0x46, 0x6a, 0xd9, 0x52, 0x43, 0x8c, 0xab, - 0x07, 0x2e, 0x86, 0xbd, 0x54, 0x92, 0x4a, 0xe0, 0x12, 0x2d, 0x8f, 0xed, 0xce, 0xe1, 0x19, 0x60, 0xe4, 0xa2, 0x1c, 0x81, 0x04, 0x1f, 0x46, 0x30, 0x03, 0xc1, 0x42, 0x82, 0x1f, 0x4e, 0x27, 0xa7, - 0x7f, 0x6c, 0xf6, 0xdf, 0x21, 0xa2, 0xfc, 0xfd, 0x9f, 0x8f, 0xf8, 0x27, 0x37, 0x0b, 0x6a, 0x9e, 0xb7, 0xe1, 0xe2, 0xfd, 0x87, 0xb2, 0x38, 0x7b, 0x06, 0xb2, 0x78, 0x67, 0x83, 0xdf, 0x89, 0x5b, - 0x7c, 0x68, 0x30, 0xfa, 0x2f, 0x9a, 0x31, 0x6f, 0x64, 0x5f, 0x66, 0xe3, 0xf9, 0x66, 0xaa, 0xd1, 0x02, 0x2e, 0x3d, 0x95, 0xec, 0x99, 0xd5, 0x72, 0xdc, 0x76, 0x61, 0x7c, 0xaa, 0x89, 0x22, 0xdb, - 0x00, 0x6a, 0x6c, 0x6d, 0xa8, 0x98, 0x05, 0xb4, 0x51, 0x40, 0x25, 0xaf, 0x87, 0xf4, 0x54, 0x2f, 0xb8, 0xfc, 0xa8, 0x5f, 0x58, 0x6f, 0x27, 0x24, 0x0d, 0x28, 0x11, 0x97, 0x45, 0xbf, 0x74, 0xc1, - 0x16, 0x17, 0xf9, 0x76, 0xb1, 0x77, 0xc9, 0x85, 0xc1, 0x21, 0xf9, 0xa5, 0x49, 0x57, 0x18, 0x43, 0xb8, 0x9d, 0xfe, 0xd8, 0xe1, 0xf2, 0x27, 0x7d, 0xe9, 0x46, 0x80, 0xfc, 0x18, 0x5c, 0x8a, 0xd8, - 0xbf, 0x2d, 0x0b, 0x8b, 0xdc, 0x7b, 0xdd, 0xbe, 0x9f, 0xe6, 0xf0, 0x63, 0xfb, 0xd5, 0x7b, 0xd3, 0xd2, 0x3b, 0x95, 0x7f, 0x37, 0x33, 0x0e, 0x7c, 0xcc, 0x7a, 0x7a, 0xa5, 0xfa, 0x3c, 0x29, 0xcf, - 0xd7, 0x33, 0x70, 0x9a, 0xfd, 0xe4, 0xb6, 0x0a, 0x07, 0x86, 0x25, 0xdd, 0x28, 0xbc, 0xaa, 0x31, 0x22, 0xa5, 0x06, 0xf8, 0x91, 0x85, 0xb1, 0x45, 0xb3, 0x6c, 0xdd, 0x55, 0xa1, 0x6c, 0x5d, 0xd4, - 0xde, 0x53, 0xf8, 0xfe, 0xb2, 0x3b, 0xf0, 0xfb, 0x1e, 0x8e, 0x44, 0xaf, 0xe7, 0x0b, 0xb2, 0x1f, 0x1c, 0x37, 0x1d, 0x77, 0xa3, 0x48, 0x61, 0x23, 0x79, 0xa1, 0xc8, 0x2d, 0x24, 0xec, 0x93, 0xd3, - 0x7c, 0xdf, 0xe0, 0x3b, 0x8d, 0x74, 0xac, 0xe2, 0xab, 0x7d, 0x5d, 0xff, 0x53, 0x05, 0x4e, 0x5a, 0x7e, 0x97, 0xae, 0xff, 0x90, 0x74, 0xf8, 0x43, 0xf7, 0x69, 0xf0, 0x7f, 0xee, 0xa6, 0x78, 0xb7, - 0xa1, 0xd9, 0x4a, 0x56, 0x9b, 0x8d, 0xba, 0x3b, 0x24, 0x42, 0x49, 0xc1, 0x60, 0x91, 0x1f, 0x17, 0x35, 0x2d, 0x2b, 0x99, 0x8e, 0x9f, 0x26, 0x80, 0x57, 0xbf, 0x2b, 0xbd, 0xbc, 0xbd, 0xc3, 0x1e, - 0x69, 0xe5, 0xf1, 0x4a, 0xf4, 0x3a, 0x9a, 0x97, 0x80, 0x18, 0x3c, 0xad, 0xa5, 0xc7, 0x25, 0x3e, 0xef, 0x64, 0x05, 0xbd, 0x50, 0x01, 0xaf, 0xb5, 0x34, 0xd9, 0x1a, 0x19, 0x10, 0xae, 0x14, 0x6f, - 0x2d, 0x46, 0x02, 0xbd, 0x8b, 0x45, 0x5a, 0x02, 0x02, 0x33, 0x1e, 0x34, 0x22, 0xa9, 0xa3, 0x03, 0x73, 0x86, 0xdc, 0xd3, 0x61, 0x88, 0x1a, 0x10, 0x2c, 0x28, 0xb5, 0xe8, 0x69, 0x62, 0xe9, 0x37, - 0xa5, 0xc8, 0x3b, 0x8e, 0x14, 0x09, 0xcd, 0x02, 0x82, 0x25, 0xd2, 0x71, 0x01, 0x96, 0xbd, 0x87, 0x17, 0xf1, 0xf6, 0xa8, 0x28, 0x9b, 0xb8, 0xc8, 0xaf, 0xea, 0xc5, 0x57, 0x06, 0x7d, 0xca, 0x18, - 0xfa, 0x17, 0x3d, 0x75, 0xef, 0x29, 0x3f, 0xb1, 0xea, 0xfd, 0xfd, 0x54, 0x1f, 0xdd, 0xb0, 0x2e, 0x3a, 0x6a, 0xdc, 0x99, 0x28, 0x59, 0xaf, 0x16, 0x56, 0x8a, 0x2d, 0x42, 0x95, 0x31, 0x36, 0x58, - 0xdd, 0xa9, 0xdb, 0xd6, 0x89, 0x5d, 0xe9, 0x62, 0xca, 0x9b, 0xd5, 0x36, 0xa3, 0x45, 0x57, 0x6b, 0x99, 0x0a, 0xdc, 0x85, 0x90, 0x10, 0x4b, 0x45, 0xc9, 0xed, 0xc8, 0x7d, 0xbc, 0x4a, 0x62, 0x8b, - 0x66, 0xdc, 0xd0, 0x71, 0xe0, 0xd5, 0x11, 0x77, 0xab, 0x40, 0xc6, 0xa9, 0xfd, 0x41, 0x5b, 0x83, 0x5f, 0x02, 0x1b, 0x9f, 0xd3, 0x3d, 0xfe, 0x3d, 0x26, 0x7c, 0xa0, 0x3c, 0x9f, 0x7d, 0xbc, 0x9f, - 0xca, 0x84, 0x93, 0x61, 0x57, 0xf9, 0x61, 0x87, 0xc2, 0x32, 0x13, 0x2f, 0x29, 0x78, 0x1d, 0x41, 0x2e, 0xb7, 0x18, 0x93, 0x62, 0xbd, 0x13, 0xa3, 0x8b, 0xd1, 0x5b, 0xcc, 0x32, 0xd8, 0xfb, 0xbd, - 0x85, 0x6b, 0xdd, 0xdc, 0x13, 0xd5, 0x80, 0x2b, 0xbd, 0xc2, 0x44, 0x4b, 0x93, 0x0f, 0x05, 0xfd, 0xb2, 0x17, 0x0e, 0x05, 0x55, 0xe5, 0xd5, 0xb2, 0x82, 0x03, 0xb2, 0xae, 0x72, 0xea, 0x72, 0xe1, - 0xd6, 0x95, 0xa3, 0x92, 0x53, 0xb4, 0xd3, 0x9f, 0xb3, 0xc9, 0x7e, 0x95, 0x2a, 0x76, 0xc7, 0x2a, 0x78, 0x29, 0x5c, 0xbe, 0x6d, 0x0e, 0x40, 0xef, 0x2c, 0xdc, 0xc9, 0x4c, 0x4f, 0x0b, 0xf7, 0x89, - 0xd7, 0x69, 0xe1, 0xce, 0xae, 0x14, 0x7e, 0x66, 0xb1, 0xd8, 0xb1, 0xe4, 0x72, 0x3f, 0x4a, 0x5b, 0x37, 0x88, 0x96, 0xfb, 0xdc, 0x92, 0x30, 0x5d, 0x0f, 0x37, 0xeb, 0xb8, 0xd2, 0x22, 0x14, 0x30, - 0xfb, 0x9d, 0xc1, 0x39, 0x72, 0x28, 0x6b, 0x16, 0xb8, 0x09, 0xf2, 0xcb, 0xbe, 0xeb, 0xd6, 0x82, 0x84, 0xe8, 0xc8, 0xbc, 0xa1, 0x64, 0x55, 0x5a, 0xb7, 0xf3, 0x94, 0xbf, 0x98, 0x96, 0x6a, 0x67, - 0xa5, 0x99, 0xea, 0x7c, 0x70, 0xa6, 0xd6, 0xbe, 0x30, 0xd2, 0xdb, 0xc7, 0x4e, 0xbd, 0x8f, 0x62, 0xf8, 0xc6, 0xe9, 0x16, 0xe7, 0xe1, 0xd5, 0x95, 0x71, 0xfb, 0x5c, 0x7c, 0xdf, 0x85, 0xe9, 0x6b, - 0x93, 0xe0, 0x4f, 0xb9, 0x99, 0xb7, 0xcf, 0xcc, 0x4f, 0x8e, 0x89, 0xab, 0xa8, 0x8e, 0xaf, 0x99, 0x94, 0x45, 0xda, 0x36, 0x3f, 0xe6, 0xa2, 0x7d, 0x2c, 0x68, 0xbf, 0x1d, 0xea, 0x79, 0xc4, 0x4d, - 0xfd, 0x8e, 0xee, 0xeb, 0xec, 0x3e, 0xdf, 0xcd, 0xb0, 0x69, 0x6e, 0x6a, 0x4a, 0x5c, 0x47, 0xaa, 0xcc, 0x04, 0x65, 0xbc, 0xb1, 0x7a, 0x09, 0xa1, 0x94, 0x9c, 0xbb, 0x00, 0xd8, 0x21, 0xd7, 0x5a, - 0x98, 0xa7, 0x2d, 0x7f, 0x74, 0x39, 0x09, 0xc5, 0x82, 0x6d, 0x0f, 0x75, 0x15, 0x32, 0xd2, 0x48, 0x67, 0x6f, 0x83, 0x21, 0xf0, 0xa1, 0x9a, 0x21, 0x8f, 0xb9, 0xeb, 0x89, 0x1e, 0x39, 0x57, 0xab, - 0xdd, 0xb0, 0xc3, 0x14, 0x49, 0xae, 0x4e, 0xdc, 0x88, 0x3a, 0x2a, 0x69, 0x17, 0x8f, 0x69, 0x9a, 0xef, 0xea, 0xf5, 0xff, 0x83, 0xde, 0xdf, 0x1a, 0xcf, 0xdb, 0xeb, 0xde, 0x51, 0xfc, 0x7b, 0x23, - 0xed, 0xe8, 0x3c, 0x1d, 0x5a, 0x4f, 0x7b, 0x13, 0x9a, 0x06, 0x14, 0x12, 0xc2, 0x7e, 0x27, 0x82, 0x07, 0x1d, 0x17, 0x83, 0x84, 0x50, 0x4e, 0xc6, 0x86, 0xab, 0x82, 0x63, 0xe2, 0x8e, 0x3b, 0x2a, - 0x59, 0x95, 0xd8, 0xfc, 0x20, 0x48, 0x25, 0xd6, 0x68, 0xa5, 0xb1, 0x3e, 0xa0, 0x1b, 0x9e, 0xb7, 0x05, 0x68, 0x4e, 0x5f, 0xdc, 0x95, 0xd2, 0x84, 0xf3, 0x3a, 0xa6, 0x60, 0xd5, 0xd0, 0x02, 0x90, - 0xf4, 0x1c, 0x36, 0x3b, 0x34, 0x96, 0x35, 0x1a, 0xcb, 0xb5, 0x4b, 0xab, 0xe8, 0x14, 0x27, 0xe6, 0x3d, 0xd1, 0x73, 0x8f, 0x4b, 0xef, 0x5a, 0x14, 0xde, 0xe3, 0xd6, 0xef, 0x85, 0xf7, 0x3b, 0xba, - 0x2f, 0x5c, 0x7b, 0xb9, 0x9b, 0x1a, 0x6d, 0xde, 0xaa, 0xb4, 0x0a, 0x6f, 0x13, 0x77, 0x4f, 0x6b, 0x21, 0x0e, 0x2f, 0x88, 0xcd, 0xd2, 0x5d, 0x8e, 0xdd, 0x26, 0x0a, 0x9b, 0xd3, 0x0a, 0x3b, 0xaf, - 0x4e, 0x19, 0x53, 0x90, 0x47, 0x56, 0x29, 0xa9, 0x51, 0x38, 0xea, 0x62, 0xba, 0x01, 0x8e, 0x97, 0x85, 0xef, 0xa3, 0xba, 0x5a, 0x83, 0xa0, 0x1a, 0xd5, 0xfa, 0xbe, 0xf7, 0x50, 0x1c, 0x22, 0x36, - 0xe4, 0x29, 0xc6, 0xac, 0x66, 0xc9, 0xa4, 0x3b, 0x38, 0x0c, 0xbf, 0x9c, 0x5e, 0x1f, 0x45, 0xed, 0xbd, 0xe1, 0xff, 0x7e, 0xbf, 0xbd, 0xa3, 0xfb, 0x32, 0xfc, 0x97, 0xbb, 0xa9, 0xa0, 0x28, 0xde, - 0xd1, 0x74, 0x08, 0xb2, 0xda, 0xce, 0x75, 0x06, 0x16, 0x52, 0x13, 0x22, 0x92, 0x02, 0xe9, 0x14, 0x6e, 0x04, 0x9d, 0xd1, 0x31, 0x96, 0x17, 0xac, 0xe1, 0xce, 0x76, 0x84, 0x95, 0x22, 0xb2, 0xd7, - 0x87, 0xe5, 0xe6, 0x40, 0x43, 0x84, 0xbf, 0xab, 0x5a, 0x39, 0x1d, 0x19, 0x46, 0x0c, 0xf5, 0x6e, 0x99, 0x46, 0x47, 0xc1, 0xcb, 0x30, 0x88, 0x44, 0x01, 0x9a, 0x51, 0xba, 0x18, 0x56, 0xba, 0x39, - 0xf7, 0x45, 0x6d, 0x7d, 0xfa, 0x61, 0x4d, 0xf1, 0xec, 0x1a, 0x69, 0x9c, 0xfb, 0xd1, 0xc6, 0x47, 0x54, 0xd7, 0x4f, 0xb4, 0x5f, 0xd8, 0xf0, 0xee, 0xc9, 0x14, 0x15, 0xf6, 0x7a, 0x84, 0xaf, 0x12, - 0x4f, 0xdd, 0x1f, 0xf3, 0x94, 0x3b, 0x40, 0xa7, 0xa1, 0xe0, 0x4e, 0x84, 0x68, 0x0a, 0xaa, 0xd3, 0xf3, 0xd8, 0x46, 0x74, 0xe7, 0xdb, 0x51, 0xf7, 0xb0, 0x9e, 0xa4, 0x41, 0xf8, 0x28, 0x6a, 0x22, - 0xe8, 0x87, 0x2b, 0x25, 0x71, 0x79, 0x59, 0xe8, 0x22, 0xc8, 0xc7, 0xbd, 0x10, 0xe1, 0xdd, 0x40, 0xcf, 0x1a, 0x9d, 0x3c, 0xb8, 0xee, 0x01, 0x39, 0x8f, 0x36, 0xac, 0x05, 0x47, 0x92, 0x30, 0x26, - 0x1c, 0xe1, 0xb7, 0x33, 0xb6, 0x6f, 0xef, 0xa2, 0x57, 0x83, 0xea, 0x5f, 0x64, 0xdf, 0x95, 0xe4, 0x13, 0xd7, 0xae, 0x17, 0x53, 0x99, 0x25, 0xaf, 0xb6, 0x07, 0xb0, 0x71, 0x0c, 0x59, 0xb4, 0x9b, - 0x6e, 0xad, 0xac, 0x29, 0x9f, 0x66, 0x8e, 0x41, 0x9d, 0x15, 0x91, 0x5d, 0x35, 0xad, 0xd9, 0x1d, 0x8c, 0x7a, 0xc5, 0xdb, 0xda, 0x09, 0x56, 0x75, 0xc0, 0xc9, 0xeb, 0xf2, 0x6c, 0xc3, 0xdd, 0x2e, - 0x2f, 0xb6, 0x11, 0xb1, 0x5e, 0x42, 0x80, 0x7e, 0x82, 0xf0, 0x3d, 0x44, 0x52, 0x52, 0xec, 0x41, 0x74, 0xbb, 0x5a, 0xb8, 0xcc, 0xc2, 0x83, 0x33, 0x6c, 0x4a, 0x99, 0xfa, 0x1f, 0xfc, 0xa1, 0xdb, - 0x3c, 0x78, 0x24, 0x99, 0xf3, 0x85, 0xe6, 0x7c, 0xf6, 0x7a, 0x35, 0x35, 0x79, 0xd3, 0xf7, 0x86, 0xf3, 0x91, 0xed, 0x4c, 0x88, 0x41, 0xf1, 0xd4, 0xb4, 0xbd, 0xc3, 0x99, 0x29, 0x05, 0x60, 0xd5, - 0xec, 0x14, 0xf9, 0xe0, 0xaf, 0x77, 0x7b, 0x7c, 0xce, 0x86, 0x58, 0x52, 0xc3, 0x63, 0xd1, 0xea, 0xf5, 0x99, 0x23, 0xd6, 0x78, 0xbd, 0xba, 0xc4, 0xcd, 0x9a, 0x01, 0x08, 0xc1, 0x12, 0x60, 0x52, - 0xf0, 0x4d, 0x71, 0xcb, 0xfb, 0x2d, 0x39, 0x6e, 0xd1, 0x7a, 0x95, 0x17, 0x07, 0x39, 0x3f, 0x3b, 0x5f, 0x84, 0xc7, 0x4b, 0xa9, 0x89, 0x3b, 0xcc, 0xfc, 0x20, 0x74, 0xda, 0xf4, 0xdf, 0xcd, 0xe5, - 0xf9, 0x42, 0xfd, 0x89, 0x0d, 0x9f, 0x9f, 0x4d, 0x91, 0xa6, 0xd0, 0x4c, 0xdd, 0x95, 0x8d, 0xd7, 0xb9, 0x5c, 0x81, 0x2f, 0xa8, 0xb3, 0x03, 0x09, 0x58, 0xe1, 0x57, 0x28, 0x1a, 0x07, 0x42, 0x7f, - 0x9a, 0x30, 0xb1, 0x7f, 0x54, 0xa6, 0x7b, 0x83, 0xfb, 0x3d, 0xd6, 0xef, 0x2b, 0xd1, 0xa7, 0x31, 0xbd, 0x5c, 0x5e, 0x87, 0xf2, 0x03, 0xe6, 0x2f, 0x34, 0x53, 0x5d, 0x28, 0xd9, 0xf9, 0xa1, 0xbc, - 0x95, 0xfb, 0x4d, 0xb7, 0x59, 0x0a, 0x4b, 0xde, 0xc0, 0x23, 0xc3, 0x80, 0xdc, 0xf0, 0xf6, 0x50, 0x7e, 0xd8, 0xe3, 0xf7, 0x35, 0xb7, 0x1f, 0xab, 0x99, 0xde, 0x29, 0x8b, 0xf7, 0x9c, 0x98, 0xbf, - 0xaf, 0x10, 0x7b, 0x25, 0x7a, 0xe5, 0xcb, 0xf3, 0xe5, 0xd5, 0x8d, 0x39, 0xa1, 0x46, 0xec, 0x34, 0xef, 0x38, 0xc7, 0x44, 0xe7, 0x56, 0xea, 0x20, 0xc6, 0x38, 0xec, 0x98, 0x4e, 0x93, 0x45, 0xd3, - 0x0a, 0xd6, 0x7c, 0x77, 0x16, 0x85, 0x26, 0x3f, 0xd3, 0x7e, 0x3b, 0x6a, 0x7c, 0x39, 0x96, 0xb2, 0x3d, 0x52, 0xf5, 0x49, 0xd8, 0x1d, 0x6d, 0x58, 0x00, 0x96, 0x39, 0x1d, 0xab, 0x3b, 0x72, 0xe4, - 0xd4, 0x62, 0xbd, 0x0a, 0x76, 0xa5, 0x29, 0x5c, 0x1c, 0xd4, 0xb7, 0x02, 0x7b, 0x2d, 0x9f, 0x83, 0xfe, 0x4b, 0x4e, 0x52, 0x5c, 0x3a, 0xbe, 0x5f, 0xfd, 0xf3, 0x0d, 0xb0, 0x26, 0xf9, 0xc8, 0x5a, - 0x7f, 0xa5, 0xfa, 0x34, 0xee, 0xd7, 0xeb, 0xd9, 0x95, 0xd6, 0xcf, 0x03, 0x07, 0x85, 0xf5, 0x1c, 0x07, 0x89, 0x4b, 0x71, 0x51, 0xb5, 0x82, 0x27, 0xb8, 0x64, 0x0f, 0xad, 0x42, 0xd5, 0xdd, 0x16, - 0x3a, 0x08, 0xb8, 0x8d, 0x16, 0x7b, 0x49, 0x2d, 0xab, 0x86, 0x9c, 0x1e, 0xe7, 0x47, 0x7b, 0x38, 0xed, 0x17, 0x42, 0x99, 0xed, 0x42, 0xa2, 0xb5, 0x7a, 0xc9, 0x40, 0x14, 0xc0, 0x39, 0xd9, 0xb8, - 0x32, 0xef, 0xa1, 0x85, 0x9d, 0x9a, 0x2a, 0x4f, 0x5b, 0x66, 0x6c, 0xe9, 0x92, 0x88, 0x7c, 0x89, 0x90, 0x7f, 0x2a, 0x49, 0xb8, 0x67, 0xe6, 0xfe, 0x5e, 0xd0, 0xbf, 0x27, 0x7c, 0x4d, 0xef, 0xff, - 0x73, 0x3b, 0x35, 0x3f, 0x16, 0x5a, 0x27, 0x68, 0x2a, 0xee, 0xa4, 0x74, 0x7e, 0xa1, 0xb1, 0x13, 0xcd, 0xe6, 0xc4, 0x1a, 0x70, 0xe1, 0xa6, 0x91, 0x76, 0x82, 0xb3, 0xa8, 0xc7, 0xe3, 0x72, 0x5d, - 0x99, 0x6c, 0x6b, 0xca, 0xec, 0xbc, 0x08, 0x10, 0x7e, 0xb3, 0xd5, 0xb6, 0xc7, 0xf3, 0x31, 0xe2, 0xea, 0xb2, 0x8f, 0x06, 0xce, 0xc7, 0x77, 0xe2, 0xd0, 0xd3, 0xfa, 0xf9, 0xd0, 0x59, 0xb1, 0xb7, - 0x22, 0xe0, 0xf4, 0x14, 0xb1, 0xf9, 0x9a, 0x9f, 0xd0, 0x59, 0xe3, 0x56, 0xb9, 0xfe, 0xed, 0xbd, 0xf2, 0xae, 0x5f, 0xe7, 0xbf, 0xa7, 0x64, 0xbd, 0x51, 0x7d, 0x66, 0xdb, 0xf3, 0xf5, 0x54, 0x05, - 0x0b, 0xdc, 0x1c, 0x30, 0x40, 0x15, 0x19, 0xf9, 0xb4, 0xf6, 0xc7, 0x84, 0x16, 0x48, 0xb7, 0xa5, 0x14, 0xef, 0xb0, 0x00, 0x51, 0xd6, 0x6f, 0x09, 0x0a, 0x94, 0x83, 0x06, 0xaf, 0xf9, 0x18, 0x59, - 0xc5, 0xd9, 0x92, 0xcc, 0x03, 0x3c, 0x43, 0x69, 0x4e, 0xb6, 0x43, 0x25, 0x07, 0xf6, 0x76, 0x6c, 0xba, 0xf4, 0x09, 0x5d, 0xa1, 0x66, 0xc6, 0x87, 0xac, 0xbd, 0x8e, 0xcb, 0x6d, 0x42, 0x96, 0xe6, - 0xc2, 0x57, 0xbf, 0x1e, 0x11, 0x9f, 0xf1, 0xc7, 0xee, 0xf9, 0xaa, 0x1f, 0x5a, 0x37, 0xef, 0x48, 0xbf, 0xb2, 0xe0, 0xed, 0xc1, 0xd5, 0x67, 0x3d, 0x61, 0xed, 0xd8, 0xbb, 0xa5, 0x62, 0x05, 0x35, - 0x5e, 0xb2, 0x83, 0x3f, 0xb4, 0x5c, 0xec, 0xd7, 0x01, 0x21, 0xd6, 0xfc, 0xa5, 0x71, 0xd7, 0x84, 0x71, 0x08, 0xf4, 0x65, 0x31, 0x46, 0xca, 0x3c, 0x22, 0x2a, 0x1f, 0xbc, 0xe8, 0x71, 0x66, 0xed, - 0xd3, 0xce, 0x56, 0x96, 0x73, 0x01, 0xde, 0x45, 0xb6, 0x96, 0x18, 0x03, 0x01, 0x63, 0xeb, 0x30, 0x48, 0xb7, 0xc1, 0xc1, 0x5b, 0xee, 0x48, 0x22, 0xcb, 0x1a, 0x85, 0x33, 0x1f, 0x33, 0xec, 0x6e, - 0x61, 0xd7, 0x7e, 0x1b, 0x8c, 0xbb, 0xd5, 0xe7, 0xf5, 0xdf, 0xf3, 0x3f, 0x7d, 0xa1, 0xfe, 0xc2, 0xe3, 0x0f, 0xcf, 0xa6, 0xfa, 0xa1, 0x5c, 0xd3, 0x97, 0x8d, 0xd3, 0x92, 0xa1, 0xf5, 0x35, 0xe5, - 0x31, 0xa7, 0x80, 0x87, 0xda, 0xbc, 0xdf, 0x6c, 0xd7, 0xa5, 0x6d, 0x39, 0x0e, 0x76, 0xe8, 0xda, 0x21, 0x52, 0x07, 0x75, 0xee, 0xc1, 0x69, 0x48, 0x40, 0x64, 0xa6, 0x09, 0x36, 0xab, 0x63, 0xba, - 0xcf, 0x2a, 0x69, 0xe9, 0x83, 0x90, 0x9e, 0x50, 0x6c, 0x94, 0x19, 0x0b, 0x25, 0x3c, 0x3b, 0x12, 0x90, 0x29, 0xce, 0x41, 0xf2, 0xab, 0xf9, 0xfe, 0xa1, 0x2d, 0x7a, 0x47, 0x85, 0xfd, 0x18, 0xbd, - 0xbb, 0xa7, 0xc3, 0xfd, 0xde, 0x6c, 0x7e, 0x47, 0xf7, 0x99, 0x7f, 0xaf, 0x77, 0x57, 0x5d, 0x6e, 0x82, 0x19, 0xbd, 0x81, 0x58, 0x6f, 0x17, 0x2c, 0x74, 0x4b, 0xa3, 0xd5, 0x4a, 0x08, 0xc6, 0x76, - 0xad, 0x6b, 0x7a, 0x9f, 0x98, 0xf5, 0xb1, 0x80, 0x49, 0x9c, 0x44, 0xda, 0xdc, 0xdc, 0xc1, 0xd6, 0x71, 0xa3, 0x6b, 0x0a, 0xdc, 0x5c, 0x84, 0x79, 0xc0, 0xa1, 0x84, 0xdb, 0xed, 0x9d, 0x79, 0x1f, - 0x97, 0xd2, 0x2a, 0xb3, 0x57, 0x51, 0x35, 0xdf, 0xe3, 0x21, 0xc4, 0x51, 0x38, 0xee, 0x77, 0x60, 0xb6, 0x1c, 0xb4, 0xf5, 0xf0, 0xf5, 0x5c, 0xab, 0x67, 0xde, 0x93, 0x6a, 0xf5, 0xdc, 0x7e, 0xf0, - 0xee, 0x46, 0x7d, 0x04, 0xd6, 0xff, 0x23, 0xe9, 0x17, 0x26, 0xfc, 0x79, 0x30, 0x83, 0xa7, 0x41, 0xfc, 0xe3, 0x14, 0x1c, 0x9e, 0xc2, 0x33, 0x54, 0x85, 0x81, 0x6c, 0x27, 0x97, 0xca, 0xde, 0x70, - 0x41, 0x55, 0x6e, 0x19, 0x8d, 0x57, 0xf6, 0x4b, 0x3a, 0x56, 0xa3, 0xbc, 0x05, 0x81, 0xc2, 0x0d, 0x36, 0xe5, 0x52, 0xb2, 0x15, 0xbd, 0x28, 0xf8, 0xa8, 0x8e, 0xc7, 0x6e, 0xec, 0x40, 0x3b, 0xd9, - 0xf4, 0xe2, 0x88, 0xc4, 0xc6, 0x9a, 0xf7, 0x37, 0xcd, 0xc1, 0xd8, 0xcc, 0x9b, 0x4c, 0xaa, 0x10, 0x16, 0x86, 0xe6, 0x3f, 0xb9, 0xbf, 0xef, 0x5a, 0x46, 0x7f, 0xff, 0xf1, 0x5c, 0xde, 0x5b, 0x4e, - 0x1f, 0xab, 0x94, 0xee, 0x89, 0xfd, 0x07, 0x74, 0xa4, 0x0f, 0xa4, 0x9f, 0xf9, 0xf9, 0xee, 0xc1, 0xd4, 0x9a, 0xfa, 0xb9, 0x8b, 0xda, 0x87, 0x9a, 0x23, 0x6c, 0xcc, 0x3c, 0x34, 0xeb, 0x4b, 0x3d, - 0x3f, 0x92, 0xc6, 0x22, 0xef, 0xc2, 0x6d, 0xa4, 0x52, 0x83, 0x60, 0xf9, 0x0d, 0x67, 0xc8, 0x5b, 0xf7, 0x3c, 0xe0, 0x09, 0x05, 0xc5, 0x5e, 0x16, 0x25, 0xe1, 0xc2, 0x60, 0x0a, 0x4d, 0x88, 0x02, - 0x15, 0xed, 0x07, 0xac, 0xb1, 0x1c, 0x29, 0x90, 0x8a, 0x76, 0x5c, 0xed, 0xa8, 0xbd, 0x9b, 0x27, 0x24, 0xea, 0xc1, 0x36, 0x70, 0xeb, 0x00, 0x08, 0x2e, 0xcd, 0x37, 0x6e, 0xda, 0xc7, 0x02, 0x95, - 0x7f, 0xc8, 0x3e, 0x8f, 0xff, 0xe5, 0x66, 0x6a, 0xa0, 0x52, 0x75, 0x05, 0x97, 0xda, 0x9f, 0xf6, 0x38, 0x88, 0x1c, 0x62, 0x34, 0x59, 0xda, 0x1d, 0x4a, 0x6e, 0x83, 0xc3, 0x66, 0x97, 0xa3, 0x03, - 0xd7, 0xd7, 0xee, 0x68, 0xf7, 0x45, 0xb5, 0x2c, 0x86, 0x65, 0xdc, 0x36, 0xf5, 0x1e, 0xc9, 0x37, 0x96, 0xef, 0x8a, 0x08, 0x3e, 0x86, 0x47, 0x6e, 0x83, 0xcb, 0x4b, 0xb6, 0x14, 0xed, 0xf5, 0xea, - 0xc4, 0x36, 0xf9, 0x19, 0xdb, 0x28, 0x97, 0xac, 0x4b, 0x91, 0xa4, 0x2e, 0xa6, 0xa0, 0x2a, 0xdc, 0xeb, 0x53, 0x7f, 0xd7, 0x6c, 0x7a, 0x68, 0xbb, 0x7d, 0xfd, 0x8a, 0x67, 0x2e, 0x7d, 0x7d, 0xfe, - 0x6c, 0x3f, 0x4d, 0xd8, 0x7d, 0x49, 0xbd, 0x4c, 0x06, 0x32, 0x45, 0x86, 0xd8, 0x5c, 0xca, 0x80, 0x54, 0x9b, 0x7e, 0x46, 0xf7, 0x4b, 0xc9, 0x13, 0x2f, 0x8e, 0x69, 0x6c, 0xeb, 0x52, 0xf0, 0xcb, - 0x74, 0xa5, 0x1f, 0xd6, 0x64, 0x77, 0x86, 0x62, 0x3b, 0x5a, 0x07, 0xa7, 0x80, 0x01, 0xb7, 0x10, 0x4e, 0x9c, 0x83, 0x76, 0x81, 0x7b, 0xa3, 0xec, 0x5c, 0x02, 0x1f, 0x39, 0xcf, 0xf5, 0xb1, 0xed, - 0xc1, 0xba, 0xdf, 0x82, 0x71, 0xb5, 0x5d, 0x4c, 0x28, 0x07, 0xfc, 0xea, 0xa1, 0xf9, 0x49, 0xd1, 0xfa, 0x66, 0xad, 0xa1, 0x0f, 0x39, 0x3e, 0x5f, 0x68, 0xbe, 0xb0, 0xf0, 0x69, 0x95, 0xa1, 0xd3, - 0x1c, 0xa0, 0x97, 0x20, 0x55, 0x9d, 0x81, 0xe7, 0x11, 0xdc, 0x8e, 0x96, 0x84, 0x6d, 0x1c, 0xd3, 0x98, 0x28, 0x0d, 0x04, 0x3d, 0xee, 0xdd, 0x7d, 0xba, 0x10, 0x93, 0x0e, 0x13, 0x0e, 0xd9, 0x69, - 0xc3, 0xa2, 0x47, 0xda, 0x67, 0x91, 0xe6, 0xb8, 0xd0, 0xc2, 0x13, 0xd9, 0x59, 0x4e, 0xbd, 0xdd, 0x01, 0x99, 0x69, 0x88, 0xf6, 0x71, 0x75, 0x8a, 0xec, 0xf0, 0x72, 0xdc, 0xaa, 0x79, 0xd5, 0x2b, - 0x15, 0x1a, 0xa4, 0xaa, 0xfa, 0x18, 0x6a, 0xc5, 0x87, 0x6d, 0xf8, 0x9a, 0xde, 0x7f, 0x8f, 0x83, 0xf7, 0x91, 0x07, 0xe1, 0x47, 0xf5, 0xd4, 0x67, 0xd4, 0xc1, 0xe7, 0x8b, 0xab, 0x41, 0x37, 0x41, - 0x43, 0xf5, 0x44, 0x7b, 0x25, 0xcb, 0xc5, 0xa8, 0x1d, 0x1d, 0x28, 0x44, 0x77, 0x97, 0xed, 0x6a, 0x4c, 0x23, 0xc1, 0x92, 0xb4, 0x21, 0x81, 0xf1, 0x32, 0xf6, 0x7c, 0x5b, 0xbb, 0x2c, 0xe0, 0xa3, - 0xeb, 0xcd, 0xcd, 0x10, 0x15, 0xe6, 0x8d, 0x2d, 0x8a, 0xa6, 0xca, 0x9c, 0x76, 0x9d, 0x8e, 0x96, 0x42, 0x5c, 0x28, 0x26, 0xc7, 0x6e, 0x37, 0x4a, 0x0e, 0x72, 0x3b, 0x42, 0x2f, 0x03, 0xe2, 0xa4, - 0x10, 0x30, 0x34, 0x4c, 0x72, 0xe5, 0x7c, 0x05, 0x1a, 0xb8, 0xc7, 0x8c, 0x87, 0x24, 0xd7, 0x07, 0xe2, 0xcf, 0x6c, 0xf9, 0xf0, 0x68, 0x6a, 0x9f, 0x23, 0x78, 0xc4, 0x37, 0xa3, 0xdc, 0xd9, 0x8a, - 0x43, 0x52, 0xb0, 0x45, 0x5c, 0x18, 0xdc, 0x97, 0xe5, 0x0c, 0x5d, 0xa9, 0x9a, 0xaa, 0xed, 0x8d, 0x44, 0x58, 0x5b, 0x96, 0xd6, 0xa0, 0x30, 0x8a, 0x07, 0x3b, 0x6d, 0x93, 0xad, 0x0b, 0x50, 0x06, - 0xec, 0x41, 0xac, 0x75, 0x1c, 0x37, 0x17, 0xe9, 0x45, 0x80, 0x28, 0x97, 0x26, 0x61, 0x7f, 0x15, 0x44, 0xa9, 0xb4, 0xad, 0x8e, 0x7d, 0x19, 0x28, 0x82, 0x88, 0x7f, 0xf1, 0x91, 0x3e, 0xfd, 0xba, - 0x36, 0x73, 0xef, 0x42, 0x75, 0x12, 0x0f, 0xb9, 0xf7, 0xde, 0xa8, 0xbe, 0x8c, 0xff, 0x7a, 0x7d, 0x4d, 0x62, 0x9c, 0x20, 0x8c, 0x50, 0x88, 0x89, 0xc3, 0x53, 0x84, 0x07, 0x0b, 0x6d, 0x48, 0xd5, - 0xd2, 0x6f, 0xb4, 0x32, 0xd8, 0x1e, 0x76, 0xe7, 0x4e, 0xa5, 0x97, 0x87, 0x51, 0x6b, 0x1a, 0xbe, 0x5b, 0x2a, 0x2c, 0x81, 0x42, 0x40, 0x99, 0xdb, 0x0b, 0x6a, 0xdf, 0x81, 0x20, 0x88, 0xee, 0x94, - 0x2d, 0x8a, 0xc8, 0x82, 0xc4, 0xa6, 0x02, 0xe9, 0x71, 0xdd, 0xbe, 0xc4, 0xf7, 0xb6, 0x61, 0xeb, 0x74, 0xea, 0x72, 0xa6, 0x75, 0xb9, 0xe4, 0x53, 0x57, 0xc6, 0xf3, 0x2f, 0xfd, 0xf1, 0x5c, 0xff, - 0x7d, 0x02, 0xd7, 0x67, 0xe2, 0x1f, 0x38, 0xf3, 0xee, 0x6c, 0x9f, 0x00, 0x69, 0xa7, 0xe8, 0x60, 0xba, 0x9e, 0xe7, 0x24, 0x56, 0xee, 0x0a, 0x5d, 0x68, 0xc9, 0x0e, 0xa2, 0x6d, 0x09, 0xdb, 0xd1, - 0x9e, 0xdd, 0xee, 0xd5, 0xc3, 0xe6, 0xb4, 0x3b, 0x51, 0x1c, 0xec, 0x6f, 0xce, 0x0c, 0x3a, 0xc2, 0x5c, 0x7a, 0xe2, 0xf4, 0x7d, 0xc0, 0xe3, 0x0b, 0xb5, 0xe5, 0x5b, 0x5a, 0xa0, 0xd9, 0xb9, 0xb9, - 0x0a, 0x80, 0x2d, 0x6f, 0x03, 0x21, 0x49, 0x0b, 0xa7, 0xed, 0x52, 0xc3, 0xc1, 0x7d, 0x1c, 0x7c, 0x2d, 0xaa, 0x88, 0xff, 0x40, 0x6d, 0xdc, 0xb3, 0x3a, 0x1e, 0x92, 0xb6, 0x57, 0xa2, 0xcf, 0xa3, - 0x7f, 0x4e, 0x10, 0x85, 0xa6, 0x55, 0xa5, 0x9d, 0xd5, 0x83, 0xb9, 0x1a, 0xe1, 0x05, 0xbf, 0x23, 0x06, 0x60, 0x6d, 0x98, 0x78, 0xb7, 0x65, 0xea, 0xe0, 0xe2, 0xa7, 0xdd, 0xa8, 0x41, 0xd2, 0x66, - 0xbf, 0x52, 0xe9, 0xd6, 0x91, 0xb7, 0x32, 0x56, 0x80, 0xeb, 0x65, 0xbf, 0xd0, 0x59, 0xcb, 0xc0, 0xe7, 0x30, 0x10, 0x30, 0xbb, 0xc3, 0xb0, 0xae, 0xdd, 0xdd, 0x82, 0xd9, 0x6f, 0x4d, 0xd8, 0x99, - 0xcb, 0x46, 0xa6, 0x96, 0xc3, 0xc5, 0x5a, 0xf2, 0x16, 0xc1, 0x4c, 0x70, 0x94, 0xff, 0x00, 0x08, 0xf1, 0x0b, 0x3f, 0xfa, 0x1b, 0x72, 0xc3, 0xbf, 0x2a, 0x7c, 0xeb, 0xe0, 0x65, 0x2d, 0xd5, 0x41, - 0x33, 0x55, 0xf8, 0x02, 0xb0, 0x97, 0x6b, 0x4b, 0x3b, 0xb0, 0xb0, 0x71, 0x1e, 0x9b, 0x9c, 0xbb, 0x3d, 0x4a, 0x95, 0x48, 0x39, 0xc2, 0x7c, 0xe7, 0xb4, 0xd8, 0x09, 0x0b, 0xcc, 0x33, 0x99, 0x40, - 0x28, 0x53, 0x2a, 0x5a, 0xd8, 0x9c, 0xc1, 0x92, 0xda, 0xb4, 0xf0, 0xae, 0x3f, 0x28, 0xaa, 0x7d, 0x1c, 0x6c, 0x83, 0x1e, 0x2f, 0x48, 0x81, 0x9b, 0x04, 0x89, 0x6d, 0x47, 0x9c, 0x2e, 0x5d, 0x5c, - 0x01, 0x39, 0x21, 0x44, 0x88, 0x89, 0x5b, 0xec, 0x87, 0xd2, 0xaf, 0x87, 0xfc, 0xad, 0xaf, 0x54, 0x5f, 0x18, 0xf1, 0x5a, 0xec, 0xf5, 0xa3, 0xc7, 0xf5, 0x2a, 0x67, 0x23, 0x7f, 0x74, 0x05, 0xbd, - 0x3d, 0x37, 0x32, 0x92, 0x5a, 0xfb, 0x4a, 0xd7, 0x64, 0xab, 0x60, 0x52, 0xe9, 0x98, 0x11, 0x85, 0xdc, 0xa2, 0xba, 0x5f, 0xaa, 0xf6, 0xae, 0x84, 0xe6, 0x2c, 0x17, 0x9d, 0x78, 0x5a, 0x5b, 0x2c, - 0x61, 0x1b, 0x4a, 0xc1, 0x61, 0xe7, 0xbb, 0x38, 0x8b, 0x8e, 0x7b, 0xea, 0xd2, 0xb3, 0xf1, 0xae, 0x5b, 0xec, 0xfc, 0x36, 0x15, 0x14, 0x71, 0xc3, 0xed, 0x53, 0x50, 0x06, 0x6f, 0xed, 0xa6, 0x37, - 0xcc, 0x82, 0x7f, 0xd5, 0x58, 0x78, 0xa6, 0xfa, 0x32, 0xf0, 0xeb, 0xf5, 0x54, 0x13, 0x81, 0x99, 0x33, 0x12, 0x7d, 0x16, 0x8c, 0xbc, 0xf3, 0xbd, 0xcb, 0x79, 0x4d, 0x29, 0x97, 0x41, 0x3c, 0xa2, - 0x1d, 0xa4, 0xeb, 0x4b, 0x91, 0xe1, 0xcb, 0x88, 0x75, 0x40, 0xc3, 0x8a, 0x4a, 0x81, 0x5d, 0xed, 0xea, 0xd1, 0xab, 0x24, 0x2f, 0x0c, 0x23, 0xac, 0x3d, 0xf6, 0x6a, 0x24, 0x31, 0x5b, 0x16, 0x36, - 0x8c, 0x4b, 0x76, 0xc6, 0xe3, 0x3a, 0xae, 0xc7, 0x05, 0xd1, 0x8c, 0x1a, 0x08, 0x35, 0x2d, 0x77, 0x9c, 0x60, 0xb4, 0xff, 0x6e, 0xc7, 0x7c, 0x04, 0x51, 0xbc, 0x27, 0x89, 0x1e, 0x92, 0xc7, 0xef, - 0x48, 0x3f, 0xf3, 0xef, 0xdd, 0x83, 0xab, 0x54, 0x9a, 0x20, 0x8b, 0x55, 0x80, 0x53, 0xd8, 0x68, 0x93, 0x2a, 0x88, 0x34, 0x2c, 0xdd, 0xda, 0x9c, 0xaf, 0x0a, 0xd7, 0x27, 0xbd, 0x73, 0x69, 0xd3, - 0x6d, 0xa7, 0xab, 0xc0, 0xc2, 0xa9, 0x95, 0xb3, 0xc5, 0xee, 0xb6, 0x8c, 0x0b, 0x9f, 0x77, 0x63, 0x03, 0x15, 0x23, 0x96, 0x61, 0xc5, 0x45, 0x66, 0x2e, 0x62, 0xa4, 0xb3, 0x97, 0xd8, 0xa8, 0xc5, - 0xc3, 0x3e, 0x46, 0x07, 0x67, 0x05, 0xcc, 0xdb, 0xce, 0x4f, 0xf9, 0xd4, 0x6a, 0x27, 0x30, 0xf1, 0x6e, 0x5f, 0xb6, 0x1b, 0x22, 0xea, 0x67, 0xfc, 0xa8, 0x77, 0x88, 0x5b, 0xd7, 0x78, 0xfa, 0xe2, - 0x1f, 0x70, 0x96, 0x07, 0x97, 0xe6, 0x53, 0xb7, 0x82, 0xb7, 0xbc, 0xe6, 0x1b, 0xa0, 0x9f, 0xbf, 0x48, 0xeb, 0x89, 0xeb, 0x59, 0x1f, 0x38, 0xa7, 0xef, 0x15, 0xd1, 0x87, 0x74, 0xaf, 0x17, 0xb2, - 0xcf, 0xb3, 0xf9, 0x72, 0x33, 0x55, 0xdf, 0xda, 0xab, 0xb4, 0x82, 0x9e, 0x78, 0xac, 0x38, 0x24, 0x90, 0xde, 0x77, 0x1d, 0x49, 0x80, 0x55, 0xab, 0x9f, 0x98, 0x03, 0x21, 0x42, 0xd9, 0x18, 0x1d, - 0x56, 0x22, 0x3a, 0xaf, 0x82, 0x0e, 0xf6, 0xb6, 0x8a, 0xef, 0x90, 0x5a, 0x46, 0xf2, 0xd5, 0x96, 0x00, 0x6d, 0xa9, 0x6d, 0xd0, 0x4a, 0xe4, 0x23, 0x0b, 0x5c, 0xed, 0x2b, 0xbd, 0x25, 0x69, 0xc6, - 0x35, 0x29, 0xb8, 0xf6, 0x65, 0xe0, 0x02, 0x7a, 0xc7, 0x29, 0x35, 0x79, 0x2f, 0x3f, 0xf5, 0xfb, 0xa3, 0xe1, 0x61, 0x76, 0xbc, 0x1d, 0x0f, 0x2f, 0x37, 0x53, 0xd9, 0x51, 0xc6, 0x68, 0x77, 0x74, - 0x8f, 0x07, 0x9e, 0xdb, 0x5e, 0x8a, 0xa3, 0xde, 0x13, 0xd2, 0x91, 0xab, 0xdb, 0x40, 0x43, 0x3b, 0x85, 0x5b, 0x15, 0xe6, 0x51, 0x22, 0x00, 0x85, 0xdb, 0x83, 0x89, 0xb0, 0xee, 0x48, 0x60, 0x21, - 0x19, 0x16, 0x23, 0x6b, 0xe7, 0x86, 0x62, 0xf3, 0xa8, 0xba, 0x88, 0x19, 0x1c, 0xa1, 0xf8, 0xb1, 0xe0, 0x41, 0x20, 0x5a, 0xb4, 0xb6, 0x4d, 0x8f, 0xbb, 0xaa, 0x3b, 0x70, 0xec, 0xbd, 0xd4, 0xfb, - 0x0f, 0xec, 0xf8, 0x03, 0x0e, 0x71, 0xdb, 0xc8, 0x7b, 0xc4, 0x9b, 0xfc, 0x42, 0x73, 0x3e, 0x7b, 0xbd, 0x9a, 0xa1, 0xd3, 0xfc, 0xc7, 0x7d, 0x79, 0xb1, 0x6b, 0x72, 0x5f, 0x5c, 0x6c, 0x67, 0xb3, - 0x54, 0x37, 0xdc, 0xda, 0xd6, 0x06, 0x76, 0xe9, 0x58, 0x65, 0x0a, 0xae, 0x04, 0x95, 0x02, 0x56, 0x34, 0xe9, 0x6c, 0xe2, 0x21, 0xc8, 0x84, 0xe3, 0xae, 0x3f, 0x5d, 0xe4, 0x08, 0x47, 0x8e, 0xa8, - 0x06, 0x09, 0x9b, 0x48, 0xe7, 0xf8, 0x52, 0x3b, 0x4b, 0xec, 0x5e, 0xf1, 0xb2, 0xcc, 0xda, 0xb6, 0x51, 0xa5, 0x24, 0x9b, 0x94, 0x6e, 0x8c, 0x4e, 0x99, 0x60, 0x18, 0xbf, 0x6b, 0xba, 0xfa, 0x5a, - 0x18, 0x77, 0x73, 0x2b, 0xdd, 0x69, 0xcf, 0x7c, 0xef, 0x84, 0x79, 0x84, 0x73, 0x5f, 0xbf, 0xe0, 0xca, 0xc6, 0xaf, 0x8f, 0xa7, 0x06, 0xf1, 0xf7, 0xbb, 0xc5, 0x5c, 0x22, 0x73, 0xc4, 0x4c, 0xcc, - 0xe3, 0xda, 0xce, 0xa1, 0x74, 0x7b, 0x3c, 0xad, 0x1c, 0x8a, 0xd1, 0x44, 0x5d, 0x91, 0xcd, 0xc4, 0x38, 0x1e, 0x50, 0x9a, 0x9a, 0x2b, 0xb9, 0xd8, 0x2d, 0x2e, 0x5d, 0x74, 0x6e, 0xce, 0x25, 0x65, - 0x92, 0x6b, 0x11, 0xcd, 0x14, 0xf9, 0xa2, 0x5e, 0x20, 0x25, 0x2d, 0xd0, 0xe6, 0x3c, 0x06, 0x67, 0x17, 0xac, 0xc5, 0xb4, 0x6a, 0x1d, 0x71, 0x40, 0xfc, 0xf6, 0x4b, 0x44, 0xeb, 0x46, 0x4d, 0xdf, - 0x2d, 0xae, 0x60, 0x0f, 0x45, 0xf4, 0x3e, 0x13, 0x9f, 0xcf, 0xbe, 0x3c, 0x9a, 0x61, 0xd3, 0xe2, 0x7b, 0xba, 0x46, 0x94, 0xfa, 0x69, 0x91, 0xec, 0x19, 0x05, 0xea, 0x15, 0xa2, 0x47, 0x62, 0x23, - 0x5c, 0x27, 0x17, 0x04, 0x66, 0x63, 0x1a, 0x0e, 0x91, 0xe3, 0xca, 0x97, 0x55, 0xb1, 0x1f, 0x90, 0xf9, 0x52, 0x92, 0x91, 0x1c, 0x39, 0x14, 0xde, 0x10, 0x97, 0xfa, 0xc5, 0x1b, 0x14, 0x5b, 0x01, - 0x9d, 0x63, 0x11, 0x74, 0x40, 0x78, 0x1a, 0x70, 0xb2, 0xa5, 0x00, 0x2e, 0x48, 0x24, 0x87, 0x14, 0x5a, 0x5e, 0x98, 0x70, 0x80, 0x78, 0xaf, 0xc0, 0xfb, 0x7f, 0xff, 0x07, 0x7c, 0xa8, 0x9e, 0xf1, - 0x49, 0x96, 0x3c, 0x13, 0x79, 0x2e, 0x4a, 0x7c, 0x2d, 0x6b, 0x44, 0xef, 0xad, 0xd5, 0xb4, 0x28, 0x4a, 0x37, 0xc8, 0xbf, 0xe9, 0xe5, 0xf8, 0x48, 0xfa, 0xfc, 0x1b, 0xd5, 0xa7, 0x39, 0x78, 0xbd, - 0xbe, 0x7a, 0xdf, 0x27, 0x2c, 0xc5, 0xb0, 0x81, 0xa5, 0xac, 0xb5, 0x73, 0xb6, 0x07, 0xd8, 0x8d, 0x1c, 0x6a, 0x58, 0x56, 0x2e, 0x8d, 0xd6, 0x5f, 0xd2, 0xca, 0x98, 0x96, 0xeb, 0xec, 0x48, 0x64, - 0x3a, 0x21, 0x7a, 0x12, 0x97, 0x05, 0x61, 0x2d, 0xa4, 0xc6, 0x82, 0x39, 0x81, 0x3a, 0x9e, 0x57, 0x0c, 0xe3, 0x7b, 0xbd, 0xb5, 0x02, 0x46, 0x72, 0xf4, 0x40, 0xf5, 0x40, 0x8f, 0x9c, 0x4d, 0x41, - 0x2b, 0x28, 0xd2, 0x43, 0xde, 0x6e, 0x37, 0x13, 0x92, 0xd8, 0x2e, 0xcd, 0x2b, 0x1c, 0xe0, 0x37, 0x29, 0x7e, 0x69, 0xd5, 0xce, 0x3c, 0xc7, 0x3b, 0xde, 0xdb, 0xd0, 0xf8, 0x43, 0x1b, 0xfa, 0x8d, - 0xea, 0x13, 0xbf, 0x5e, 0xaf, 0xaf, 0xad, 0x74, 0x26, 0xf0, 0x6b, 0x53, 0xe0, 0xfe, 0x06, 0x44, 0x99, 0x4c, 0x4d, 0xda, 0x31, 0xef, 0x37, 0xaa, 0x8a, 0x94, 0x7a, 0x60, 0x64, 0xfe, 0x9c, 0x07, - 0xc3, 0x50, 0x4b, 0x4f, 0xa6, 0x19, 0xf5, 0x76, 0x0c, 0x04, 0x67, 0x48, 0x67, 0xb2, 0xb3, 0xdc, 0x33, 0x47, 0x20, 0xd8, 0xd6, 0x96, 0x68, 0x31, 0xbd, 0x45, 0x92, 0x50, 0x0c, 0xaf, 0x9c, 0x23, - 0x7a, 0x84, 0xe8, 0xe5, 0x8e, 0xb9, 0xa0, 0x67, 0xed, 0xc8, 0xb9, 0x75, 0x3c, 0x41, 0x1c, 0x0e, 0x4e, 0x9a, 0xc6, 0x2f, 0x75, 0xb9, 0xe8, 0x7d, 0xff, 0x60, 0x16, 0x34, 0xc7, 0xc2, 0xff, 0x2e, - 0x80, 0xfd, 0x7b, 0x0b, 0xeb, 0x85, 0xe6, 0x7c, 0xf6, 0x7a, 0x35, 0x15, 0xd3, 0x30, 0xf6, 0x52, 0x8a, 0x0f, 0xf6, 0xe7, 0x7d, 0x86, 0x2f, 0xc6, 0x55, 0x93, 0xdb, 0x60, 0x00, 0x40, 0x5b, 0x78, - 0xd0, 0xd7, 0x7e, 0x37, 0xee, 0x0b, 0xa7, 0x15, 0x74, 0xd4, 0xa0, 0x29, 0xe4, 0xd0, 0xf1, 0xf3, 0x4e, 0x5a, 0xc5, 0xc1, 0x8a, 0x38, 0x87, 0x4a, 0xda, 0xeb, 0xb6, 0x0e, 0xb0, 0x14, 0x29, 0x91, - 0xae, 0x64, 0xae, 0x55, 0x12, 0x6c, 0xd3, 0x4b, 0xa1, 0x17, 0x0c, 0x0f, 0x23, 0xf5, 0x01, 0x9e, 0x72, 0x80, 0x66, 0xf7, 0x91, 0xae, 0xe0, 0x87, 0x8a, 0x28, 0xb3, 0x67, 0x78, 0xab, 0x6b, 0x01, - 0x13, 0x3c, 0xad, 0x6c, 0x52, 0x57, 0xa5, 0xd3, 0x2e, 0x58, 0x6a, 0x08, 0x54, 0x89, 0xbb, 0xd8, 0xa9, 0x6a, 0x7a, 0xbf, 0xe6, 0x6d, 0x61, 0xcb, 0x45, 0x9d, 0xe0, 0xcd, 0xb7, 0x55, 0x52, 0x84, - 0x54, 0x4e, 0xa7, 0x62, 0xd3, 0x84, 0x98, 0x93, 0x28, 0xdd, 0x39, 0x56, 0xa8, 0x85, 0x5c, 0x07, 0xb9, 0xeb, 0x15, 0x85, 0xd7, 0x08, 0xb8, 0x8f, 0x6b, 0x35, 0xee, 0x9c, 0x6d, 0x93, 0xa6, 0x00, - 0xd3, 0x3d, 0x09, 0xcd, 0x31, 0x96, 0xa7, 0x18, 0x98, 0xd7, 0x1f, 0xe9, 0xdf, 0x73, 0x11, 0x43, 0xff, 0x60, 0x8f, 0xc8, 0x98, 0x17, 0xa2, 0xaf, 0x3c, 0xf0, 0xdd, 0xd9, 0x33, 0xa1, 0x9f, 0xf9, - 0x50, 0x4b, 0x3a, 0xda, 0x1e, 0x08, 0xdf, 0x4a, 0xbb, 0xc6, 0xd8, 0x5c, 0xfa, 0xfe, 0xc2, 0xb3, 0xa0, 0xd4, 0xc6, 0xc7, 0xc3, 0x3e, 0x5e, 0x12, 0xda, 0x40, 0xb9, 0x32, 0xa6, 0x1a, 0x17, 0x96, - 0xa1, 0xc9, 0x4c, 0xb7, 0x3a, 0x31, 0xaa, 0x0a, 0x59, 0xec, 0x2d, 0x59, 0x16, 0x05, 0x69, 0xb3, 0x60, 0xd6, 0xee, 0x12, 0x80, 0x96, 0xda, 0x21, 0x15, 0x0b, 0x01, 0xd2, 0x19, 0x38, 0xd7, 0x91, - 0xc8, 0xea, 0x26, 0xf3, 0xe1, 0xb5, 0xda, 0xec, 0x5e, 0x64, 0x06, 0xf9, 0xbd, 0xd9, 0xf4, 0x87, 0xee, 0x2b, 0x37, 0xae, 0x37, 0xb3, 0x67, 0x72, 0x3f, 0x33, 0xc4, 0x66, 0x2d, 0xc0, 0x95, 0x32, - 0x6c, 0xd4, 0xb4, 0x15, 0x60, 0x95, 0x4c, 0x45, 0xe9, 0x64, 0x2e, 0x80, 0x7a, 0xb4, 0x66, 0x2c, 0x49, 0x03, 0xe5, 0x46, 0x83, 0xf6, 0xb6, 0xb1, 0xea, 0xd0, 0x1a, 0x00, 0xb4, 0xfd, 0xc9, 0x8b, - 0x0e, 0x8e, 0x06, 0x46, 0x38, 0x80, 0x2a, 0x70, 0xbb, 0x46, 0x77, 0x89, 0x9c, 0x8c, 0x43, 0xcd, 0xd3, 0xd0, 0x78, 0x69, 0x8d, 0x2d, 0x06, 0x1e, 0x47, 0x27, 0x30, 0xe3, 0xc7, 0x02, 0xf2, 0x7f, - 0x96, 0xca, 0xeb, 0xba, 0xb8, 0x2d, 0x54, 0xde, 0x65, 0xc7, 0xdf, 0x62, 0xe4, 0x63, 0xc8, 0x2a, 0x6f, 0x54, 0xaf, 0x6c, 0x7c, 0xb9, 0x9e, 0x8a, 0xaa, 0xb2, 0x21, 0x4a, 0x1c, 0x39, 0x2a, 0x31, - 0x95, 0xf4, 0xd0, 0x9e, 0x5d, 0xf6, 0x3d, 0x64, 0x10, 0x31, 0x42, 0x00, 0xf4, 0xb0, 0xae, 0x44, 0x43, 0xc4, 0x4c, 0x59, 0xa6, 0x46, 0x1b, 0x39, 0x88, 0xde, 0x16, 0x94, 0xf6, 0x83, 0xdb, 0x97, - 0x61, 0x76, 0x98, 0xef, 0x41, 0x6c, 0x5c, 0x51, 0x63, 0x2f, 0x93, 0xba, 0x3a, 0x2c, 0x3d, 0x13, 0x6f, 0x10, 0x5d, 0x04, 0x04, 0xcc, 0x39, 0xd3, 0xb2, 0xb8, 0xe6, 0x1f, 0x63, 0xe2, 0xd7, 0xbe, - 0xab, 0xcf, 0x09, 0xd9, 0xc4, 0x37, 0xcc, 0x8c, 0xef, 0x6a, 0x63, 0x4f, 0xa3, 0xff, 0xbd, 0xfb, 0xe7, 0x95, 0xe8, 0x2b, 0x2b, 0xe3, 0xba, 0xb9, 0x2a, 0x00, 0x13, 0x9c, 0x3f, 0x9b, 0x3a, 0xc9, - 0x4f, 0xa8, 0xdb, 0x23, 0xd6, 0xe6, 0x6c, 0x8d, 0xae, 0x3f, 0xd0, 0xf1, 0xbe, 0x96, 0x0c, 0x5e, 0x0a, 0x45, 0x00, 0xd0, 0x39, 0x8e, 0x40, 0x49, 0xe6, 0x52, 0xe3, 0x65, 0xc0, 0xb4, 0x98, 0x19, - 0xa1, 0x79, 0x15, 0xe4, 0x0e, 0x2e, 0x1e, 0x2e, 0xa2, 0x75, 0xa9, 0x64, 0xed, 0xdc, 0xf7, 0xe0, 0x26, 0xeb, 0x1b, 0x40, 0x09, 0xc2, 0x45, 0x15, 0x45, 0x6d, 0x76, 0xd2, 0xb6, 0x23, 0x39, 0x25, - 0x54, 0x98, 0x7d, 0xb7, 0x2f, 0x1f, 0x58, 0x4e, 0xd7, 0xed, 0xf8, 0xbc, 0x0d, 0x27, 0x2c, 0xa0, 0x9a, 0x3b, 0x49, 0x17, 0xe0, 0x90, 0xec, 0x9a, 0x8c, 0xc2, 0x77, 0x26, 0x4c, 0x14, 0x14, 0xba, - 0xa2, 0x57, 0xcb, 0xed, 0x8a, 0xb1, 0x6d, 0x54, 0x45, 0xcd, 0x73, 0xc0, 0x89, 0x26, 0xd3, 0xe1, 0x8b, 0x46, 0x03, 0x12, 0x17, 0xe9, 0x4e, 0x73, 0x65, 0x70, 0x04, 0x43, 0x02, 0x25, 0x4d, 0x18, - 0x8c, 0x26, 0xdb, 0xaa, 0x3b, 0xd0, 0x05, 0x1c, 0x5f, 0xd7, 0x96, 0x9d, 0x5b, 0x43, 0xd2, 0xd2, 0xe1, 0xe1, 0x2f, 0x3e, 0xaf, 0xcf, 0x48, 0x7e, 0xb7, 0x67, 0x1c, 0x79, 0xa0, 0x8e, 0xe7, 0x03, - 0xe5, 0xf9, 0xec, 0xe3, 0xfd, 0xb5, 0x05, 0xd8, 0x84, 0xca, 0x9e, 0xb0, 0xcb, 0x4d, 0xb2, 0xb1, 0x5d, 0x85, 0x30, 0x42, 0x86, 0xc3, 0x68, 0x6a, 0x40, 0x06, 0x71, 0x9e, 0x33, 0xdb, 0x21, 0x39, - 0x18, 0x2c, 0xbe, 0x8b, 0x8e, 0xcb, 0x33, 0x38, 0x62, 0x2b, 0x36, 0xdc, 0x03, 0xb6, 0x59, 0x6e, 0x8d, 0xfd, 0x5a, 0xa3, 0x7d, 0x37, 0x0e, 0x2f, 0xf2, 0x49, 0x86, 0xb1, 0xc0, 0xad, 0x20, 0x9c, - 0x03, 0xf7, 0x44, 0xa0, 0x18, 0x9b, 0xb8, 0x16, 0xbd, 0xdd, 0x92, 0xe7, 0x90, 0x2f, 0xa9, 0x17, 0x4f, 0x3f, 0x2d, 0xbb, 0x1b, 0x05, 0xbe, 0x9a, 0x76, 0xe4, 0x43, 0xe3, 0xcf, 0xae, 0x71, 0xdf, - 0x97, 0xab, 0x67, 0xab, 0x9e, 0xfc, 0x79, 0xd0, 0x68, 0xd9, 0x41, 0x21, 0xec, 0xee, 0xd8, 0x04, 0x5c, 0x06, 0xd1, 0x7c, 0x77, 0xe4, 0xce, 0x97, 0xaa, 0xe9, 0x82, 0x40, 0xc6, 0xe6, 0xdc, 0x5c, - 0x3f, 0x04, 0x64, 0x2c, 0xe2, 0xad, 0x66, 0x8f, 0x49, 0xae, 0xa4, 0xad, 0x4a, 0xa1, 0xd2, 0xc1, 0x08, 0x17, 0x8c, 0x41, 0x92, 0x5b, 0x5d, 0xea, 0x39, 0x1a, 0x09, 0xf6, 0x6b, 0x8a, 0x18, 0xf5, - 0x55, 0x21, 0x11, 0x84, 0xd5, 0xae, 0x89, 0xa3, 0xe8, 0x3d, 0xd8, 0x1e, 0xf7, 0x5d, 0x47, 0xd1, 0x67, 0x04, 0x9a, 0x0f, 0xce, 0xa6, 0x3f, 0xed, 0xe3, 0x91, 0x7f, 0xe0, 0x8f, 0x60, 0x26, 0xb7, - 0x32, 0x93, 0xff, 0xfe, 0x0a, 0x13, 0xfb, 0x43, 0x59, 0x53, 0x59, 0x37, 0x55, 0x10, 0xfc, 0x53, 0x05, 0xd9, 0xf0, 0x26, 0xb5, 0x3e, 0x14, 0x6c, 0xbf, 0xc3, 0x53, 0xc1, 0xfe, 0x21, 0x3e, 0xd2, - 0xae, 0xe3, 0xac, 0x4c, 0x83, 0x59, 0x5b, 0x5e, 0x53, 0x33, 0xf2, 0xa2, 0x89, 0xc3, 0xf8, 0x15, 0x27, 0xf3, 0x33, 0xb0, 0x4b, 0xdd, 0x96, 0x65, 0x51, 0x35, 0xf5, 0xcc, 0x2b, 0xd2, 0xe2, 0x95, - 0xde, 0x27, 0x8b, 0xab, 0x29, 0xda, 0xb7, 0xdf, 0xf9, 0x09, 0x58, 0xad, 0xcd, 0xfd, 0x20, 0xac, 0x9d, 0xf0, 0x8f, 0x2f, 0xe0, 0x57, 0xb0, 0xcd, 0x9f, 0xbb, 0x56, 0xfd, 0xf5, 0xd7, 0xe7, 0xe3, - 0xeb, 0x23, 0x77, 0xa7, 0x2f, 0xc2, 0x8f, 0xdd, 0xab, 0xae, 0x74, 0x3e, 0xac, 0xbf, 0xbf, 0xee, 0xad, 0x41, 0x66, 0x95, 0x8c, 0x96, 0x45, 0xc5, 0xa8, 0x76, 0x0c, 0x63, 0xb9, 0x8b, 0xc7, 0x6a, - 0x25, 0x07, 0x9d, 0xa6, 0x99, 0x7c, 0x93, 0x33, 0x67, 0x23, 0x0c, 0x88, 0x0b, 0x44, 0x1d, 0xa3, 0x65, 0xed, 0x69, 0x23, 0x6e, 0xbb, 0x5b, 0x37, 0x2c, 0xb6, 0xca, 0x56, 0x6a, 0x23, 0x4d, 0x1e, - 0xe8, 0xe6, 0x88, 0x87, 0x0b, 0x7b, 0xa9, 0x1c, 0x74, 0x75, 0x30, 0xf8, 0x15, 0x3b, 0x27, 0x8c, 0x16, 0x6d, 0xa0, 0x0f, 0x3d, 0x50, 0xfe, 0xba, 0xbd, 0x0e, 0xff, 0xba, 0xbb, 0x16, 0xff, 0x7a, - 0x13, 0xc9, 0x9f, 0xa2, 0xe7, 0x7f, 0xbd, 0x9d, 0x60, 0x7f, 0xbd, 0xe7, 0xf7, 0x8b, 0xbf, 0x33, 0x4c, 0x9d, 0xef, 0x59, 0xfb, 0xd1, 0x64, 0x9e, 0xce, 0xda, 0x57, 0xe2, 0x2f, 0x65, 0x25, 0x4f, - 0x97, 0xd7, 0xfe, 0xd7, 0xe0, 0xcf, 0x0c, 0x86, 0x66, 0x8d, 0xaf, 0xe8, 0x08, 0xc3, 0xd9, 0x55, 0xbc, 0x31, 0xb2, 0x70, 0xcf, 0x85, 0x69, 0xc1, 0x2f, 0x88, 0xf4, 0xd0, 0x76, 0xe0, 0x5d, 0x16, - 0xdd, 0x1c, 0xe2, 0xdb, 0x06, 0xb8, 0x37, 0xc0, 0xcf, 0xdb, 0x62, 0xfa, 0x00, 0x9f, 0x49, 0xcf, 0x67, 0x2f, 0x17, 0x57, 0x08, 0x46, 0xe8, 0xe7, 0xc1, 0x5d, 0xcf, 0x2e, 0xa7, 0x75, 0xd8, 0x70, - 0x2e, 0xd9, 0xfe, 0x21, 0xaa, 0xb6, 0xda, 0xde, 0xe2, 0x95, 0xa6, 0x34, 0x1d, 0x28, 0x56, 0x62, 0xc1, 0x73, 0x02, 0x37, 0x16, 0x64, 0x88, 0xde, 0xf8, 0xa5, 0x9c, 0x1a, 0x3c, 0x9c, 0x32, 0x5d, - 0x70, 0x91, 0x7d, 0x13, 0xc3, 0xea, 0x5c, 0x5a, 0x0d, 0x02, 0x21, 0x8f, 0x65, 0xeb, 0x9f, 0x5d, 0x66, 0x0d, 0x9e, 0xcd, 0x55, 0x28, 0x3a, 0x35, 0xef, 0x0f, 0x7b, 0x96, 0xfb, 0x66, 0xf5, 0xdc, - 0x66, 0xcd, 0xe7, 0x3d, 0x7d, 0x9f, 0x45, 0xd8, 0x83, 0x6b, 0xe0, 0xe3, 0x57, 0x3c, 0xb1, 0xea, 0xc3, 0x83, 0x19, 0xf6, 0xa5, 0xad, 0xe1, 0x5f, 0xf7, 0x58, 0x26, 0x27, 0x87, 0xa4, 0xf7, 0xcd, - 0x75, 0x83, 0x82, 0x8b, 0xdd, 0x3a, 0xa6, 0xce, 0x8c, 0x89, 0x16, 0xba, 0x50, 0x47, 0x3a, 0xbc, 0x3c, 0x53, 0xdc, 0x58, 0xc3, 0x52, 0x79, 0xca, 0x50, 0x47, 0xb6, 0xdc, 0x24, 0x03, 0xec, 0xa5, - 0xb1, 0xf4, 0x0c, 0x54, 0x0d, 0x57, 0x7b, 0xad, 0x42, 0xdb, 0xdd, 0xde, 0xce, 0x1c, 0x30, 0x18, 0xd0, 0x10, 0x4b, 0xa3, 0x6d, 0x75, 0xa2, 0x41, 0xc7, 0x04, 0xe5, 0x5d, 0xf1, 0x0d, 0x42, 0xfa, - 0xc4, 0x0d, 0xf7, 0x6e, 0x0b, 0xbd, 0xc2, 0x8b, 0xdd, 0xde, 0x76, 0xff, 0xeb, 0xfd, 0xdf, 0x3f, 0x07, 0x6b, 0xf9, 0x6d, 0x49, 0xca, 0xef, 0xcd, 0xbc, 0x27, 0x8a, 0xd7, 0x23, 0xb5, 0x6c, 0x26, - 0x65, 0x4e, 0x41, 0x33, 0xd7, 0x07, 0x8f, 0x9d, 0x5a, 0x5c, 0x64, 0xb3, 0x55, 0xbd, 0x1c, 0x39, 0x1c, 0xc3, 0x38, 0x5b, 0x20, 0xd6, 0x1a, 0x07, 0xd0, 0x47, 0x4e, 0x44, 0xc7, 0x75, 0xab, 0xeb, - 0x67, 0xef, 0x55, 0x65, 0x7c, 0xe9, 0xd7, 0x7c, 0xdb, 0x20, 0x79, 0xc4, 0x2f, 0xf4, 0x91, 0xf4, 0x95, 0x0d, 0xef, 0x1f, 0xdc, 0x10, 0x3f, 0x37, 0x97, 0x1a, 0x1e, 0xd8, 0x35, 0xb6, 0xad, 0x11, - 0xa3, 0x61, 0xe2, 0x9a, 0x37, 0x4a, 0x52, 0x85, 0x39, 0x7d, 0x58, 0xf8, 0xe7, 0x53, 0xc9, 0xc5, 0x28, 0x7d, 0x50, 0x47, 0x84, 0x73, 0xce, 0xf1, 0x12, 0x0f, 0xc6, 0xd6, 0x05, 0x31, 0x08, 0x5e, - 0xaa, 0x63, 0x63, 0xea, 0xbd, 0x4e, 0xe3, 0x0c, 0xbe, 0x16, 0x5c, 0xf9, 0x64, 0xc1, 0x52, 0xee, 0xce, 0x33, 0x16, 0x35, 0xac, 0x22, 0x61, 0x94, 0xde, 0xeb, 0xb7, 0x53, 0xa2, 0x28, 0x5f, 0x9a, - 0x7b, 0xdc, 0x71, 0x01, 0x3d, 0x92, 0x23, 0xf6, 0x91, 0xf6, 0x7c, 0xf6, 0xe9, 0xc1, 0xec, 0x99, 0xec, 0xcf, 0xcc, 0x09, 0xb0, 0x8c, 0xd9, 0xa4, 0x2a, 0x4f, 0x94, 0x05, 0xb5, 0x0f, 0x99, 0xc5, - 0xb8, 0x50, 0xc9, 0x9a, 0x54, 0xe1, 0xf5, 0x1e, 0x9b, 0xa3, 0xb6, 0x8b, 0x38, 0x36, 0x82, 0x84, 0x58, 0xbd, 0xb0, 0xce, 0x85, 0x33, 0x32, 0xab, 0x71, 0xbf, 0x4d, 0x8b, 0xad, 0xbe, 0xa8, 0xb0, - 0x03, 0xc3, 0x01, 0x1c, 0x61, 0x14, 0xe7, 0x6d, 0x47, 0x51, 0x76, 0x71, 0xd8, 0x79, 0x03, 0xd2, 0x94, 0x73, 0xc4, 0x04, 0xa5, 0xf4, 0x8b, 0xda, 0xfd, 0xbe, 0xfd, 0xde, 0x3d, 0x3f, 0xd8, 0xef, - 0x0d, 0xff, 0x37, 0xaa, 0xef, 0x86, 0x5f, 0x4f, 0x8d, 0x92, 0x22, 0xde, 0xc0, 0xd6, 0x03, 0x1f, 0x35, 0x59, 0x4c, 0xac, 0x09, 0x36, 0x54, 0xd5, 0x35, 0xbc, 0x65, 0x4b, 0x5c, 0x15, 0xe0, 0xb4, - 0xef, 0x1a, 0x37, 0x02, 0x4b, 0x50, 0x81, 0x02, 0x50, 0xe9, 0xb4, 0xf3, 0x0a, 0xf3, 0x02, 0xee, 0x02, 0x08, 0xb0, 0x1f, 0xaa, 0x49, 0x06, 0xb9, 0x02, 0xbb, 0x3b, 0x30, 0xab, 0x25, 0x4b, 0xc9, - 0xdd, 0x00, 0x14, 0x0b, 0x0f, 0x77, 0x88, 0x43, 0x9b, 0x88, 0xbe, 0xff, 0x98, 0xc1, 0xfa, 0x43, 0x30, 0xf4, 0x56, 0x2b, 0xb9, 0x6f, 0xc1, 0x9e, 0x3e, 0x36, 0x8c, 0xb9, 0xc7, 0xef, 0xdf, 0x87, - 0x18, 0xde, 0xd1, 0xfd, 0xc3, 0xf1, 0xa7, 0xbb, 0xa9, 0x39, 0xf9, 0xfb, 0x96, 0x5a, 0xaa, 0xba, 0xa8, 0xef, 0xaa, 0x74, 0x6d, 0x8a, 0x21, 0x2f, 0x8c, 0x2c, 0xee, 0x96, 0x52, 0x8b, 0x34, 0x56, - 0x83, 0x5c, 0xba, 0x64, 0xef, 0x2b, 0x6b, 0x19, 0x58, 0x05, 0x1a, 0x98, 0xee, 0x5d, 0x54, 0x58, 0x18, 0x0a, 0x01, 0x32, 0x0e, 0x7b, 0x39, 0xb6, 0xfb, 0xa8, 0x55, 0x61, 0x93, 0x03, 0xb8, 0xe4, - 0x34, 0xec, 0x7a, 0x71, 0xac, 0xf7, 0x98, 0x7d, 0x6a, 0xd6, 0x59, 0x78, 0xdc, 0x7e, 0xc9, 0x00, 0xfe, 0xdc, 0x0e, 0xe7, 0x16, 0x03, 0xd0, 0x87, 0x4c, 0xda, 0x0f, 0x94, 0xdf, 0x58, 0xf0, 0x72, - 0x7f, 0x8d, 0xdf, 0x4d, 0x30, 0x74, 0xe3, 0x8b, 0x06, 0x6f, 0x31, 0x8d, 0x37, 0x6b, 0xaa, 0x1c, 0x62, 0x5d, 0xb2, 0x84, 0xcc, 0x00, 0xe0, 0x25, 0x5f, 0x9a, 0x66, 0x80, 0xad, 0x63, 0x64, 0x07, - 0x84, 0x68, 0x00, 0x38, 0x9b, 0x15, 0xc5, 0x3b, 0x05, 0xe6, 0x64, 0x2b, 0xc5, 0xc0, 0x37, 0xa0, 0x28, 0xe2, 0xde, 0x7c, 0xab, 0x2f, 0xe8, 0x00, 0x25, 0xda, 0x86, 0xb9, 0xc0, 0xdc, 0x76, 0x41, - 0x1e, 0x2f, 0x1c, 0x8d, 0x9b, 0x6a, 0x26, 0xb4, 0x0f, 0x25, 0x0d, 0x81, 0x53, 0x57, 0xd9, 0xbb, 0x8f, 0xfd, 0xd8, 0x49, 0xe6, 0x76, 0xb7, 0xa2, 0xdb, 0xeb, 0x34, 0x9f, 0x05, 0x97, 0xb8, 0x99, - 0xa5, 0x81, 0x73, 0x9a, 0x85, 0x55, 0xf0, 0x1d, 0xb4, 0xd4, 0xef, 0x4f, 0x8f, 0x2f, 0xd4, 0x9f, 0x26, 0xec, 0xf3, 0xb3, 0xa9, 0x45, 0x3b, 0x87, 0x96, 0x71, 0x6c, 0x9b, 0x4a, 0x94, 0xc0, 0x46, - 0x3a, 0xbd, 0x8f, 0x44, 0x7a, 0xb1, 0xbd, 0x50, 0x45, 0xbd, 0x6e, 0x2b, 0x36, 0xa6, 0x0c, 0xb0, 0x86, 0x90, 0x6a, 0x0d, 0x59, 0x7d, 0xe6, 0x48, 0x00, 0x90, 0x74, 0xde, 0x45, 0x22, 0x08, 0xca, - 0x28, 0xe4, 0x2e, 0xc8, 0xed, 0xc0, 0x2d, 0x19, 0x0a, 0xce, 0x16, 0x06, 0x03, 0xcd, 0x97, 0x45, 0x2d, 0x59, 0xd2, 0x2e, 0xc9, 0x15, 0xaa, 0x9c, 0x7f, 0x15, 0x93, 0xcf, 0xc5, 0x91, 0xb7, 0x77, - 0xec, 0x23, 0x95, 0x10, 0x4f, 0x04, 0xaf, 0xc3, 0xf6, 0x82, 0x19, 0xf4, 0x73, 0xd5, 0x03, 0x34, 0x33, 0xd8, 0xda, 0x29, 0x11, 0xc3, 0xe0, 0xf5, 0x5a, 0x11, 0xeb, 0x15, 0x99, 0xaf, 0x18, 0x9c, - 0xc0, 0x10, 0xd3, 0x21, 0x97, 0x8f, 0x48, 0xb6, 0x1f, 0x6b, 0x3a, 0x6f, 0xb7, 0x4d, 0xb8, 0xe7, 0x87, 0x7b, 0xe0, 0x98, 0xfc, 0x4a, 0xff, 0x89, 0x1f, 0x5f, 0x9f, 0x4e, 0x2d, 0x8e, 0x71, 0x09, - 0xd3, 0x76, 0xb3, 0x63, 0x9b, 0xe4, 0xe7, 0x7d, 0x21, 0x80, 0x36, 0xbe, 0x97, 0x46, 0x6a, 0x9e, 0x1f, 0x43, 0x39, 0x5f, 0x82, 0x0b, 0x5b, 0xe3, 0xd5, 0x71, 0x4c, 0xb4, 0x5d, 0x1f, 0x44, 0x2e, - 0xb6, 0x27, 0x0b, 0x9a, 0xa2, 0xa8, 0xf2, 0x82, 0x84, 0x64, 0x0b, 0x2b, 0xf3, 0x10, 0x39, 0x70, 0x0e, 0xc5, 0x68, 0x72, 0x82, 0xcb, 0x9b, 0x9c, 0xd3, 0x43, 0x13, 0x2a, 0x56, 0x4d, 0x73, 0x0e, - 0x27, 0xc4, 0x46, 0xdf, 0x47, 0x2a, 0xff, 0xfe, 0x0e, 0xd0, 0xfc, 0x06, 0x00, 0xca, 0x5d, 0x7d, 0xf4, 0xd7, 0xec, 0xfc, 0x4c, 0x7c, 0x3e, 0xfb, 0xf2, 0x68, 0x5a, 0x81, 0xf4, 0x0a, 0x6c, 0x55, - 0x87, 0xdf, 0x1f, 0xf6, 0x12, 0xb0, 0x08, 0x6a, 0xac, 0x22, 0xb5, 0xd2, 0xc9, 0x8f, 0x8d, 0x67, 0x42, 0x13, 0x70, 0xb2, 0xae, 0x5f, 0xf9, 0x53, 0xc3, 0x8b, 0xdf, 0x7b, 0xf0, 0xfe, 0x90, 0x7d, - 0x1d, 0xd6, 0x9f, 0xb6, 0x16, 0x13, 0x7c, 0x77, 0x5b, 0x76, 0x33, 0x4a, 0x87, 0xe5, 0x72, 0x29, 0x29, 0xc0, 0x80, 0x2e, 0x46, 0x12, 0xa1, 0xc0, 0xa5, 0x0f, 0x0e, 0xa6, 0xbb, 0x28, 0x29, 0x7a, - 0xe0, 0x8c, 0x62, 0x7e, 0xc2, 0x2c, 0xcb, 0xb7, 0xa2, 0xd2, 0x82, 0xe7, 0xf0, 0xb2, 0x16, 0xeb, 0x53, 0xbd, 0xa9, 0xce, 0x44, 0x2a, 0xf2, 0x97, 0x6a, 0xa8, 0x0e, 0x62, 0x0e, 0x05, 0x09, 0x87, - 0x17, 0x54, 0xb9, 0x70, 0x8e, 0x9d, 0xb8, 0x96, 0xd9, 0x45, 0x3d, 0x25, 0xb8, 0x56, 0xc6, 0x5e, 0xf1, 0x5d, 0x34, 0xe0, 0x69, 0x5d, 0x3f, 0x30, 0xd5, 0xaf, 0x54, 0x9f, 0x98, 0xf1, 0x7a, 0x7d, - 0x45, 0x0e, 0x9b, 0x70, 0xd0, 0x6f, 0x74, 0xa4, 0x09, 0x78, 0x6d, 0x9f, 0x64, 0x4b, 0xf8, 0xc0, 0x70, 0xab, 0xb1, 0xb5, 0x16, 0x4b, 0x73, 0x64, 0xd8, 0x43, 0xbf, 0x3c, 0xd3, 0xb0, 0xb3, 0x08, - 0xeb, 0x75, 0xd7, 0x3b, 0x6a, 0xc3, 0x1f, 0x29, 0x63, 0xb3, 0x0c, 0x0e, 0x3e, 0x54, 0x40, 0x32, 0xbb, 0x00, 0x19, 0x1d, 0x07, 0x6c, 0x7f, 0x69, 0x9a, 0xea, 0xd6, 0x55, 0xeb, 0x76, 0xdb, 0x6f, - 0x92, 0x13, 0x43, 0x1b, 0x67, 0x45, 0xd6, 0x0f, 0x53, 0x54, 0xee, 0x17, 0x40, 0xe4, 0x5b, 0x6c, 0x58, 0x3c, 0xc3, 0xe8, 0xfd, 0x9e, 0x0f, 0x79, 0x71, 0x65, 0x41, 0x5e, 0xcc, 0x9e, 0x49, 0xfc, - 0x3c, 0x7c, 0x1b, 0x0e, 0x04, 0xb5, 0x4b, 0xab, 0x14, 0xae, 0xf8, 0x45, 0x89, 0x05, 0x5d, 0xb0, 0xd7, 0x73, 0xcd, 0xf7, 0x51, 0x2a, 0xd9, 0x9c, 0x16, 0x0d, 0x55, 0x6f, 0x4f, 0xbc, 0x65, 0xcb, - 0x02, 0xc7, 0x4b, 0xa8, 0xa1, 0x1d, 0x61, 0x2e, 0x86, 0x3c, 0x51, 0x15, 0x6b, 0x24, 0x30, 0xa4, 0xb3, 0x93, 0x00, 0x79, 0xac, 0x22, 0x51, 0x82, 0xea, 0xa7, 0xa2, 0x0a, 0x0a, 0xc7, 0x88, 0x56, - 0x88, 0x6d, 0x58, 0xff, 0x37, 0x6b, 0x5f, 0xd6, 0xa4, 0x28, 0xb3, 0xfc, 0x7d, 0x7f, 0x3e, 0xc6, 0xdc, 0x12, 0x3e, 0x6c, 0xb2, 0x5d, 0x82, 0x08, 0x28, 0x28, 0xb2, 0x09, 0x7a, 0xf1, 0x46, 0x20, - 0x3b, 0x02, 0xb2, 0x8a, 0x10, 0xf1, 0x9e, 0xcf, 0xfe, 0x0f, 0x97, 0x9e, 0xb6, 0x5b, 0x9d, 0x66, 0x3c, 0xcf, 0xc5, 0x44, 0x17, 0xcb, 0x24, 0x56, 0x56, 0x56, 0x65, 0x56, 0x56, 0x66, 0xfe, 0x06, - 0x2c, 0x12, 0x76, 0x7d, 0x48, 0x23, 0x67, 0x54, 0x25, 0x9e, 0x97, 0x3f, 0xd7, 0xf2, 0x5f, 0xab, 0xf2, 0x5f, 0x5d, 0x7b, 0x5f, 0xd5, 0xf7, 0x13, 0x9d, 0xfc, 0x04, 0x5a, 0xe1, 0xc2, 0x8e, 0xdf, - 0x25, 0xb3, 0xeb, 0xd2, 0xce, 0xaa, 0xfc, 0x70, 0x85, 0x07, 0x3c, 0x3e, 0x7c, 0xf4, 0xf2, 0x72, 0x55, 0xbb, 0xa3, 0xca, 0x2b, 0xa3, 0xcb, 0xfe, 0xad, 0xbc, 0xda, 0x06, 0xf8, 0xc3, 0x9b, 0x43, - 0xa2, 0x3c, 0x8a, 0x26, 0x72, 0xf6, 0x37, 0xf0, 0x88, 0x51, 0x93, 0x79, 0x95, 0x63, 0xe7, 0xde, 0x67, 0xe8, 0xc2, 0x17, 0x73, 0xa5, 0xf4, 0xec, 0x64, 0x74, 0x63, 0xd6, 0xaf, 0x6b, 0x60, 0xc9, - 0xb7, 0xb2, 0xdd, 0xb7, 0x6a, 0xf9, 0x97, 0xb8, 0xc5, 0xfb, 0x52, 0xfd, 0xe7, 0x0f, 0xa3, 0xdf, 0x3c, 0xac, 0x87, 0x2c, 0x72, 0x46, 0xbb, 0xc3, 0x21, 0xfd, 0xf5, 0xd4, 0x2d, 0x5a, 0x87, 0xa5, - 0x67, 0x7f, 0xa9, 0xb8, 0xf9, 0x87, 0x54, 0xda, 0xd7, 0x1c, 0x7c, 0xb5, 0xa2, 0xbd, 0x27, 0xbb, 0x4f, 0xbe, 0xf1, 0x21, 0xce, 0x8f, 0x4f, 0x86, 0xc6, 0x4b, 0x39, 0xc4, 0xf1, 0x80, 0xc9, 0xb9, - 0x39, 0x6e, 0x67, 0xda, 0x18, 0x09, 0x8d, 0xb5, 0xa3, 0x63, 0xea, 0xb4, 0x92, 0xc8, 0x6d, 0x12, 0x57, 0x86, 0xcf, 0xc4, 0xc5, 0x1a, 0xf4, 0x90, 0x8a, 0x3b, 0xa5, 0xdc, 0x94, 0xdb, 0x46, 0x05, - 0x6c, 0x49, 0x46, 0x8e, 0x4d, 0x37, 0x52, 0xdd, 0xb0, 0x02, 0xbe, 0x9a, 0x0a, 0x05, 0x65, 0xc2, 0x5e, 0x60, 0x16, 0xea, 0x2e, 0x93, 0x8c, 0x15, 0xc6, 0x35, 0xdb, 0x54, 0x1e, 0x10, 0x74, 0x71, - 0xe6, 0xef, 0xc7, 0x48, 0x7d, 0xf0, 0x78, 0xfc, 0x10, 0x05, 0x94, 0x27, 0x51, 0x8d, 0xfc, 0xfa, 0x21, 0x30, 0xe3, 0x85, 0x50, 0x3e, 0x63, 0x3e, 0xfe, 0x56, 0x14, 0xd0, 0xb3, 0x0f, 0x7c, 0x70, - 0xfe, 0xdb, 0xed, 0x11, 0x3e, 0x2c, 0x36, 0x68, 0x66, 0x06, 0x5a, 0x6f, 0x48, 0xa4, 0x05, 0xb7, 0x63, 0x66, 0x66, 0xea, 0xed, 0xb4, 0x54, 0x83, 0x7a, 0x4d, 0xae, 0x3a, 0x99, 0x97, 0xe5, 0x08, - 0x87, 0x9a, 0xe2, 0x08, 0x1d, 0xc4, 0x46, 0x03, 0x7d, 0x99, 0x26, 0x97, 0xce, 0x01, 0x94, 0xbd, 0x19, 0x9e, 0x30, 0x8d, 0x33, 0x76, 0xbb, 0x15, 0xb9, 0x58, 0xf8, 0x2e, 0xd7, 0x76, 0x42, 0xa1, - 0x2f, 0x1c, 0x66, 0x46, 0x13, 0x19, 0x1b, 0x15, 0xd3, 0xe2, 0x61, 0xff, 0x74, 0x9b, 0x84, 0x2f, 0x98, 0x01, 0x5d, 0x60, 0xa9, 0xde, 0x60, 0xc7, 0x95, 0xea, 0x99, 0x03, 0xb7, 0x49, 0x7e, 0xa3, - 0xf4, 0x73, 0xb7, 0x1d, 0x97, 0xf7, 0x7c, 0xd0, 0x2d, 0x4d, 0xee, 0xd0, 0xb9, 0x2c, 0x3c, 0xaf, 0x16, 0x7d, 0xc3, 0xf9, 0x24, 0x0c, 0x41, 0xd9, 0x36, 0x01, 0x78, 0x1d, 0xe8, 0x6c, 0xc7, 0x41, - 0x76, 0x53, 0xc7, 0x73, 0x31, 0x9f, 0x52, 0xe3, 0xfd, 0xb8, 0x07, 0xcc, 0x9a, 0x33, 0x74, 0xa6, 0xa1, 0x56, 0xa1, 0x1c, 0x51, 0x31, 0x18, 0xfb, 0x29, 0xb3, 0x6a, 0xa0, 0x74, 0x31, 0xdd, 0x8c, - 0xdb, 0x99, 0x4b, 0x73, 0xe4, 0xab, 0x6e, 0xdf, 0xad, 0x3d, 0xcf, 0x95, 0xe9, 0x5b, 0xb2, 0xf0, 0x95, 0xf6, 0x1d, 0x13, 0x6e, 0x77, 0x86, 0x82, 0x53, 0x80, 0xb0, 0xb9, 0x25, 0x81, 0xb5, 0x12, - 0xab, 0xb8, 0x7d, 0x34, 0xe5, 0x40, 0xf0, 0xa6, 0x2b, 0x97, 0xd0, 0x58, 0x25, 0xe5, 0x14, 0x98, 0xc1, 0xd2, 0x09, 0xec, 0xa9, 0x56, 0x35, 0x49, 0x31, 0xdd, 0x2e, 0x93, 0x65, 0x7a, 0x02, 0xdb, - 0x49, 0x65, 0x63, 0xfc, 0xd4, 0x3e, 0xf1, 0x29, 0x84, 0x31, 0xb2, 0xaa, 0xd6, 0x1d, 0x0f, 0x4e, 0x4f, 0x20, 0x7a, 0x2a, 0x50, 0xbd, 0x51, 0x8f, 0x05, 0x46, 0x14, 0x0f, 0x81, 0x8a, 0x5f, 0x31, - 0xca, 0x9e, 0xae, 0x47, 0xe3, 0xb7, 0x3c, 0x08, 0x77, 0x84, 0xaf, 0x3c, 0xf8, 0xb8, 0x1a, 0x5d, 0x09, 0xfe, 0xcc, 0x80, 0x90, 0x33, 0x50, 0xa4, 0x20, 0x8c, 0xad, 0x82, 0x51, 0xbb, 0xf5, 0x5c, - 0xe1, 0x8d, 0x3a, 0x45, 0x67, 0xc8, 0xaa, 0x9c, 0xa3, 0x81, 0x79, 0x3c, 0x4c, 0xf6, 0x51, 0x62, 0x51, 0x15, 0x07, 0xe3, 0xd8, 0xbe, 0x82, 0x0b, 0x3f, 0x09, 0x9b, 0x60, 0x3d, 0xf1, 0x44, 0x40, - 0x83, 0xe7, 0xf1, 0x7c, 0x23, 0x1c, 0xbb, 0x1a, 0x3d, 0x60, 0xfb, 0x18, 0x27, 0x81, 0x02, 0xdd, 0x39, 0xe1, 0xa1, 0x4c, 0xe3, 0x6c, 0x48, 0x8d, 0xb7, 0xda, 0x8d, 0x82, 0x0f, 0x18, 0x06, 0xe8, - 0xf5, 0x96, 0xf6, 0x0b, 0xa2, 0xc2, 0x73, 0xf9, 0x79, 0xcb, 0x34, 0xfd, 0x4d, 0xf6, 0xca, 0xb6, 0xdb, 0xc5, 0xe5, 0x88, 0x75, 0x80, 0x69, 0x9a, 0x24, 0x4a, 0xb5, 0x90, 0x34, 0x83, 0x35, 0x56, - 0xfa, 0x78, 0x1c, 0xbb, 0xa5, 0x01, 0xca, 0x28, 0x51, 0x24, 0x59, 0xe4, 0x47, 0x35, 0xbb, 0x02, 0xb6, 0x6d, 0x99, 0xa6, 0x5b, 0xe7, 0xa0, 0x89, 0x9d, 0x24, 0x1e, 0xeb, 0xed, 0x29, 0xef, 0xd6, - 0x50, 0x86, 0x80, 0x3b, 0x16, 0x5c, 0x8e, 0x6b, 0x86, 0xa6, 0xb7, 0x60, 0x30, 0x9f, 0xba, 0x5b, 0x83, 0x10, 0x17, 0xa5, 0x7d, 0x10, 0x61, 0xc0, 0xda, 0xd0, 0x03, 0xec, 0x91, 0xfb, 0xea, 0xc4, - 0xbf, 0x1e, 0x34, 0xef, 0x7d, 0x65, 0x9b, 0x5b, 0x19, 0x9b, 0xe7, 0x3c, 0xfd, 0x72, 0x2a, 0xfa, 0xca, 0x9d, 0x45, 0xfe, 0x3d, 0x53, 0x3f, 0xe9, 0x9e, 0xb9, 0xfa, 0x79, 0x75, 0x71, 0x67, 0x91, - 0x3f, 0xb3, 0x95, 0x20, 0xd8, 0x6d, 0x7b, 0x52, 0xd2, 0x93, 0x98, 0x35, 0xa8, 0xad, 0x62, 0x63, 0xc4, 0x00, 0x2c, 0x92, 0xeb, 0xf2, 0x65, 0xbf, 0xf3, 0xe7, 0xc0, 0x04, 0xb3, 0x14, 0x76, 0x8f, - 0x36, 0x66, 0x6c, 0x9e, 0x32, 0x1c, 0xc6, 0x60, 0x7b, 0xb6, 0xe0, 0xeb, 0xd0, 0xdc, 0xa8, 0x96, 0x5e, 0xe8, 0xf0, 0x14, 0x3b, 0xcc, 0x8f, 0x01, 0x90, 0xc4, 0xb6, 0x8d, 0xc8, 0xf3, 0x08, 0x58, - 0xfb, 0xc7, 0x89, 0xac, 0x90, 0x83, 0x2c, 0xfe, 0x26, 0xeb, 0x9c, 0x83, 0xfb, 0xda, 0x5f, 0xf2, 0x0e, 0x6a, 0xe6, 0x07, 0xd1, 0x33, 0x2f, 0x6e, 0xcd, 0x8b, 0xb9, 0x3f, 0x60, 0x55, 0x2a, 0xd5, - 0x35, 0xd0, 0x2b, 0x2c, 0x59, 0xaf, 0xb9, 0xae, 0x42, 0xf0, 0x84, 0xe6, 0x55, 0xca, 0x34, 0x1a, 0x6d, 0x1c, 0x19, 0x74, 0x16, 0xcc, 0x35, 0x67, 0x01, 0x6c, 0x55, 0x4d, 0xac, 0x8f, 0x09, 0x56, - 0x8b, 0xde, 0x16, 0xa9, 0xb1, 0xdd, 0xd1, 0x5d, 0x72, 0xee, 0x52, 0x60, 0x4c, 0x8a, 0x33, 0xd5, 0x71, 0xd0, 0xf0, 0x42, 0x12, 0xa4, 0xd5, 0x16, 0xe6, 0x09, 0x46, 0x4b, 0x91, 0x56, 0xdf, 0x35, - 0x0f, 0x0b, 0x74, 0xf1, 0x5a, 0x3f, 0xc3, 0xef, 0x2c, 0x46, 0xc5, 0x59, 0x19, 0x15, 0x67, 0xe5, 0x0b, 0x0f, 0x5a, 0x7a, 0xa0, 0xb6, 0x2a, 0xfb, 0x40, 0xef, 0xc1, 0x3d, 0xbd, 0x9e, 0x79, 0xcd, - 0x49, 0x8b, 0xb3, 0x9c, 0x9f, 0x60, 0x78, 0xd9, 0x6f, 0xea, 0x12, 0x9f, 0xeb, 0x20, 0xc2, 0xb4, 0xd3, 0xe3, 0xc2, 0x5e, 0x85, 0xdc, 0xec, 0xb0, 0xb1, 0x61, 0x9b, 0x97, 0x49, 0x69, 0xd7, 0x37, - 0x06, 0xac, 0x42, 0x8d, 0xb1, 0x51, 0xf6, 0x52, 0x6e, 0x32, 0xba, 0x1c, 0x43, 0x09, 0x38, 0x91, 0xe8, 0x39, 0x83, 0x8f, 0xe7, 0x78, 0x36, 0xc0, 0x71, 0x57, 0x45, 0xae, 0x37, 0x72, 0x42, 0x3b, - 0xcb, 0xbc, 0x4f, 0x78, 0xd9, 0x17, 0x18, 0x20, 0x2f, 0x6d, 0xe3, 0xe7, 0x4e, 0xd0, 0x77, 0x12, 0xbc, 0x9e, 0x7f, 0xe2, 0xcc, 0xca, 0xa7, 0x0f, 0x2e, 0xb9, 0xeb, 0x03, 0x52, 0xbf, 0xea, 0xcd, - 0x04, 0x56, 0xe0, 0x30, 0xe8, 0xd4, 0x46, 0x08, 0x92, 0xc3, 0x1a, 0xdc, 0x58, 0x15, 0xd2, 0xc2, 0x58, 0x93, 0xad, 0xd6, 0x21, 0x59, 0xf8, 0x0d, 0x58, 0x4c, 0x74, 0x3f, 0xd4, 0x37, 0x76, 0x6a, - 0xb7, 0x84, 0xdf, 0x85, 0x4d, 0x2a, 0xda, 0x48, 0xc7, 0xe7, 0xae, 0x76, 0x20, 0x89, 0xe3, 0x06, 0x45, 0xca, 0x99, 0x93, 0xc4, 0xc0, 0xd8, 0x37, 0x37, 0x8a, 0x65, 0x2c, 0x2a, 0x6a, 0x2a, 0x1c, - 0x1f, 0x34, 0xdb, 0xa3, 0x01, 0xf9, 0x9c, 0x31, 0xef, 0x4c, 0xa0, 0x6f, 0xb4, 0xc1, 0xd1, 0xf7, 0x3b, 0xa3, 0xf1, 0xb0, 0xe9, 0xb4, 0x68, 0xa6, 0x19, 0x0d, 0x25, 0x3b, 0x2d, 0x22, 0xe6, 0x1a, - 0x69, 0x2d, 0x00, 0x73, 0x39, 0x4f, 0xcc, 0xed, 0x5e, 0xa0, 0x69, 0x37, 0x25, 0x82, 0xa9, 0x2e, 0xb8, 0x9c, 0x08, 0x82, 0x0a, 0x98, 0x4e, 0x42, 0xbe, 0x8b, 0x11, 0x7b, 0x3f, 0xe5, 0x6a, 0x57, - 0xda, 0x86, 0x28, 0x12, 0x6b, 0xee, 0xde, 0xe4, 0x77, 0x6a, 0x3b, 0x31, 0xa9, 0x3c, 0xc3, 0x03, 0x54, 0x32, 0x59, 0x97, 0xf5, 0xb6, 0x19, 0x33, 0x40, 0xd0, 0xec, 0xdd, 0x79, 0x0b, 0xe0, 0x1c, - 0xb2, 0xba, 0x3c, 0x24, 0x9f, 0x38, 0x4c, 0xdf, 0xcc, 0xeb, 0x5d, 0xe3, 0xfb, 0xb7, 0x67, 0xf8, 0xf7, 0xed, 0xd6, 0x1d, 0x74, 0x2b, 0xfa, 0x50, 0x99, 0xf7, 0xb7, 0x59, 0x79, 0xd1, 0xa0, 0x17, - 0x23, 0xf2, 0xa9, 0x0c, 0x9f, 0xb9, 0xe6, 0x46, 0xe5, 0xab, 0x4c, 0x2c, 0xf4, 0xad, 0x80, 0xe1, 0x0f, 0xa2, 0xb7, 0x51, 0x39, 0x37, 0x47, 0xe8, 0xb0, 0xc0, 0xe1, 0x50, 0xd6, 0x20, 0x92, 0x3a, - 0x64, 0xa4, 0xea, 0x36, 0x85, 0xbb, 0x0b, 0x8f, 0x0a, 0xb6, 0x45, 0x09, 0x1a, 0x9a, 0x6a, 0x71, 0x55, 0xf4, 0x78, 0x91, 0xa9, 0x8e, 0xef, 0x57, 0x0b, 0x03, 0x1d, 0x53, 0x18, 0xd7, 0xe8, 0x6e, - 0xa1, 0xa5, 0x00, 0xb1, 0x0b, 0xe7, 0x08, 0x35, 0x3f, 0xce, 0xe4, 0x8a, 0x61, 0xa7, 0xd3, 0xcc, 0xce, 0x30, 0x76, 0xd5, 0x50, 0x35, 0xaa, 0x1f, 0xa8, 0xb5, 0x9a, 0x2c, 0xfa, 0xf7, 0xe2, 0x93, - 0xee, 0x5d, 0x3d, 0xe7, 0xdd, 0x25, 0xf2, 0x4a, 0x67, 0x7e, 0xdb, 0xf7, 0x3e, 0x37, 0xe4, 0xdf, 0xb1, 0x64, 0xef, 0x09, 0x5f, 0x79, 0xf9, 0xfb, 0x72, 0x28, 0x40, 0x00, 0x46, 0xf8, 0x65, 0xc9, - 0x2f, 0x40, 0x79, 0xa2, 0x4b, 0x85, 0x24, 0xd3, 0x21, 0x94, 0x86, 0x6b, 0x9a, 0x5a, 0x33, 0x0b, 0xc1, 0x05, 0x28, 0x83, 0xd8, 0xee, 0x10, 0x5d, 0x58, 0xf0, 0x2e, 0x63, 0x1c, 0xb6, 0x6b, 0xb9, - 0xe6, 0x77, 0xf3, 0x3e, 0x3e, 0x55, 0x1b, 0x9e, 0x9d, 0xa3, 0x34, 0x45, 0x6f, 0x36, 0x93, 0xd5, 0x38, 0xcc, 0xf0, 0x0e, 0xd6, 0xd7, 0x3b, 0x5b, 0xf6, 0x7b, 0xb3, 0x4e, 0x31, 0x9e, 0x7b, 0x32, - 0xd3, 0x03, 0xef, 0x94, 0xff, 0x93, 0x97, 0x87, 0xfa, 0x50, 0x77, 0xb9, 0xf7, 0x8f, 0x9f, 0xd8, 0xc1, 0x9f, 0x42, 0xfe, 0xfe, 0x5e, 0x81, 0x3c, 0xff, 0xc4, 0x85, 0x2b, 0xcf, 0x1e, 0x5c, 0x82, - 0x00, 0x07, 0xe8, 0x99, 0x79, 0xc4, 0xb8, 0x2a, 0x53, 0x50, 0xb0, 0x99, 0x6c, 0x88, 0x46, 0x9d, 0x43, 0x6e, 0x45, 0xa8, 0x80, 0x6b, 0x40, 0x48, 0x84, 0x4b, 0x62, 0x44, 0x96, 0x28, 0xd3, 0x28, - 0xe1, 0xd2, 0xca, 0x80, 0x7d, 0xea, 0x49, 0x4b, 0x60, 0xea, 0x0b, 0xa1, 0x1f, 0x17, 0x0b, 0x35, 0xaa, 0xe0, 0x7e, 0x7e, 0xca, 0x92, 0x86, 0x24, 0xc3, 0x02, 0x1c, 0xbb, 0x27, 0x68, 0x85, 0xc8, - 0x2b, 0x94, 0x5e, 0xa9, 0xba, 0xfc, 0x9e, 0xbc, 0xfd, 0xdb, 0x27, 0x93, 0x1f, 0x92, 0xe2, 0x9f, 0x2d, 0xff, 0x3f, 0x66, 0x5d, 0xbf, 0x97, 0x7b, 0xfe, 0x84, 0xfe, 0x65, 0x38, 0x1e, 0xee, 0x0e, - 0xcd, 0x4a, 0xb7, 0x7c, 0x28, 0x33, 0x3d, 0x5c, 0xad, 0xbc, 0x3e, 0xe2, 0x16, 0x0d, 0x40, 0xe7, 0xd4, 0x2e, 0x8a, 0x8c, 0x5d, 0x9a, 0x27, 0x05, 0xae, 0x51, 0x60, 0x0e, 0x10, 0x2d, 0xb1, 0xb1, - 0x56, 0xe0, 0x9c, 0x11, 0xc2, 0xd2, 0x60, 0x59, 0x23, 0x6c, 0x6d, 0xe0, 0x48, 0x2f, 0xbb, 0x66, 0xd7, 0x14, 0xfe, 0xd6, 0xd4, 0x8f, 0x9e, 0x01, 0x82, 0xec, 0x66, 0xcd, 0x57, 0x2c, 0x4f, 0xa8, - 0xa2, 0x04, 0x1e, 0xa7, 0x0f, 0xe7, 0x3e, 0xb7, 0xde, 0xfd, 0x81, 0x15, 0xb7, 0xdc, 0xd7, 0xbf, 0x3f, 0x00, 0xb9, 0xbd, 0x76, 0xe1, 0xc2, 0xa5, 0x35, 0xba, 0x27, 0xf7, 0x33, 0x03, 0x4c, 0x52, - 0x6a, 0x1c, 0xad, 0xcb, 0x44, 0x63, 0xc6, 0x36, 0x54, 0x97, 0x94, 0xb6, 0x4d, 0x34, 0xde, 0x7a, 0x4b, 0x84, 0x0e, 0xd4, 0xd0, 0xc1, 0x9c, 0x39, 0xad, 0x2b, 0x45, 0x13, 0x65, 0x4b, 0xee, 0x12, - 0x8f, 0xb4, 0x29, 0xb4, 0xb0, 0x42, 0xa7, 0x07, 0x2c, 0xda, 0xda, 0x92, 0xbb, 0x59, 0x81, 0xb8, 0x78, 0x34, 0x9e, 0x86, 0xae, 0x9b, 0xe1, 0xd3, 0x63, 0x0d, 0x40, 0xa0, 0xd1, 0x8a, 0x7b, 0xfc, - 0xbd, 0x5a, 0xf3, 0x0f, 0x15, 0xc3, 0xae, 0x2b, 0xe0, 0x57, 0x25, 0x73, 0x7f, 0x34, 0x70, 0x95, 0x58, 0xfc, 0x95, 0x28, 0x56, 0x4d, 0xfa, 0xb2, 0xc6, 0x08, 0xf4, 0x96, 0xbf, 0xed, 0x46, 0xf3, - 0xca, 0xec, 0x73, 0x6b, 0x04, 0xfd, 0xec, 0x4f, 0x83, 0x47, 0xa4, 0x17, 0x43, 0x1b, 0x4f, 0xe1, 0x35, 0x5c, 0xf6, 0x82, 0x82, 0x24, 0xd1, 0x49, 0xb1, 0x88, 0x74, 0x48, 0xd8, 0xc2, 0x6f, 0x95, - 0x58, 0xad, 0xc3, 0xf2, 0xd0, 0x04, 0x17, 0x15, 0xf1, 0xdf, 0xb3, 0x01, 0xff, 0xc2, 0x54, 0x2c, 0x5f, 0x26, 0xf7, 0x9e, 0x67, 0xc6, 0x3b, 0x73, 0xaf, 0xbe, 0x74, 0xbc, 0xbe, 0xe8, 0x81, 0x01, - 0x73, 0x6b, 0x01, 0xed, 0xd0, 0x8d, 0xa9, 0x54, 0x84, 0x8a, 0x6e, 0x29, 0x98, 0x30, 0x55, 0xa5, 0x83, 0x05, 0x81, 0x26, 0x18, 0x9b, 0x60, 0xc9, 0xf0, 0xb8, 0x0d, 0x70, 0x63, 0x8a, 0xa5, 0x52, - 0xb7, 0x9f, 0x9f, 0x94, 0xf5, 0x14, 0x89, 0x1b, 0x68, 0x66, 0xed, 0xf8, 0xc4, 0x16, 0x56, 0xab, 0x64, 0xbf, 0x01, 0xcc, 0x25, 0xd1, 0x72, 0x2b, 0xa0, 0x35, 0x16, 0x56, 0xca, 0x70, 0x34, 0x64, - 0xaf, 0xf1, 0xe3, 0x86, 0x7f, 0x08, 0x76, 0xfe, 0x04, 0xcf, 0x7b, 0xe5, 0x57, 0xfd, 0x7b, 0x13, 0xf8, 0x46, 0xf3, 0xd2, 0xdd, 0x4b, 0x6b, 0x68, 0x7d, 0x03, 0x83, 0xca, 0x04, 0x92, 0xb4, 0x51, - 0xdf, 0x01, 0xbd, 0xfd, 0x84, 0x83, 0x13, 0x08, 0x34, 0x56, 0xf0, 0xec, 0x50, 0x45, 0xcd, 0x2c, 0xee, 0xf4, 0x90, 0x08, 0x99, 0xa3, 0xb5, 0x5e, 0x08, 0x9b, 0x60, 0xed, 0xf8, 0xfc, 0xb1, 0x26, - 0x29, 0xc2, 0x0a, 0x9a, 0x18, 0x31, 0x64, 0x89, 0xf5, 0x66, 0x18, 0xc3, 0x23, 0x29, 0x01, 0x36, 0x6d, 0x67, 0x4b, 0x6b, 0x1d, 0xf7, 0x77, 0xf5, 0xa4, 0xd5, 0xbb, 0xfe, 0x71, 0x39, 0xb9, 0xc2, - 0x36, 0xbe, 0x52, 0x74, 0x6f, 0xc8, 0xb5, 0xef, 0x3a, 0xe7, 0xce, 0xfa, 0xae, 0x73, 0x51, 0x62, 0x03, 0x94, 0xfc, 0x1a, 0x09, 0x0f, 0x47, 0xb7, 0xe7, 0x76, 0x72, 0x44, 0x10, 0xa0, 0x69, 0xc7, - 0xb6, 0xb6, 0xb0, 0xf6, 0x88, 0x2c, 0xa5, 0xc0, 0x69, 0x39, 0xf3, 0x14, 0x77, 0xb1, 0x68, 0x18, 0x22, 0x72, 0x62, 0x62, 0xb7, 0xc7, 0xfb, 0x08, 0xe1, 0x48, 0x9e, 0xa7, 0x4f, 0x51, 0xe0, 0x64, - 0x2c, 0x97, 0xcf, 0x85, 0xdd, 0xb2, 0x5b, 0x3a, 0x41, 0x37, 0x67, 0xa3, 0x15, 0x40, 0x66, 0x72, 0xb9, 0xc1, 0x9c, 0x2d, 0x5f, 0x3e, 0x6c, 0x09, 0xbf, 0xe2, 0xc8, 0xbd, 0x5c, 0x3c, 0xff, 0xba, - 0xc3, 0x77, 0x74, 0xc1, 0xd1, 0xfd, 0xd5, 0x75, 0xf5, 0xfc, 0xb9, 0xfb, 0x2b, 0xdb, 0xd0, 0xb8, 0xca, 0xb0, 0x97, 0xcb, 0x46, 0x6c, 0xf7, 0x4c, 0x14, 0x1f, 0xe8, 0x95, 0x40, 0x8b, 0x38, 0xe8, - 0x2d, 0xf0, 0x75, 0x54, 0x1e, 0xbb, 0x95, 0x99, 0x6c, 0x09, 0x86, 0x56, 0xba, 0x31, 0x0b, 0x84, 0x93, 0x63, 0x38, 0x66, 0xf0, 0x64, 0xc6, 0x03, 0xd9, 0xca, 0x0d, 0x77, 0x9c, 0x3f, 0xdb, 0xad, - 0x80, 0x40, 0xe7, 0x19, 0xa7, 0x74, 0x2b, 0xd9, 0x36, 0x2a, 0x88, 0x03, 0xb6, 0x8c, 0x3c, 0xc0, 0x84, 0xbf, 0x4e, 0xea, 0x5f, 0xff, 0x85, 0x5e, 0x1f, 0x10, 0xbf, 0x3a, 0xf0, 0x78, 0xce, 0xbd, - 0xf1, 0x1b, 0x3a, 0xe7, 0xe9, 0x17, 0x3e, 0xf8, 0xf8, 0xfd, 0xfe, 0xa5, 0x1a, 0xe3, 0x00, 0x45, 0xe4, 0x21, 0x3b, 0x96, 0x46, 0xcc, 0xb9, 0x0e, 0xb5, 0xa7, 0xca, 0x5b, 0xbb, 0xe3, 0xa4, 0x62, - 0x57, 0x63, 0x00, 0x95, 0x97, 0x16, 0x2e, 0xe4, 0x0b, 0x4b, 0xb1, 0xe1, 0x6d, 0xc8, 0x29, 0x84, 0x66, 0x00, 0x7c, 0x7c, 0x94, 0xd5, 0x49, 0xaa, 0x85, 0xbb, 0xc9, 0x22, 0xa9, 0xcb, 0x7a, 0xc6, - 0xfa, 0xfb, 0x4d, 0xb8, 0x16, 0x4a, 0xd9, 0x59, 0xd5, 0x31, 0x20, 0x86, 0x29, 0xcb, 0xb8, 0x2b, 0x77, 0xcb, 0xc2, 0x0f, 0x56, 0xe3, 0x33, 0x5c, 0xd3, 0xe7, 0x8c, 0x79, 0x07, 0xff, 0xfd, 0x81, - 0xfa, 0x25, 0xda, 0xf8, 0xdb, 0xbd, 0x11, 0x32, 0x0c, 0xfb, 0x1d, 0xb7, 0x0d, 0x40, 0x6d, 0x2b, 0xaf, 0x6f, 0x89, 0xb5, 0x4a, 0x82, 0x59, 0x77, 0x14, 0xf5, 0x13, 0xa9, 0xe4, 0xa6, 0x40, 0x71, - 0xa5, 0xb3, 0x89, 0x2c, 0x2b, 0x29, 0x26, 0xe3, 0x1e, 0x73, 0x31, 0x4b, 0x61, 0x58, 0xb5, 0xa8, 0x77, 0x7e, 0xa5, 0xc6, 0x59, 0xcb, 0x77, 0xc5, 0x2e, 0x42, 0x03, 0xd7, 0x5d, 0xd6, 0xa6, 0xd0, - 0x4c, 0xf7, 0x94, 0x4c, 0x2f, 0x8d, 0x43, 0x2d, 0x21, 0x78, 0x21, 0x1a, 0x0f, 0x6b, 0xc9, 0x43, 0xc0, 0xf5, 0x3d, 0x17, 0x88, 0x7f, 0xd0, 0x37, 0xfc, 0x6e, 0xdf, 0x03, 0xad, 0x2f, 0x54, 0x7e, - 0xee, 0xef, 0x92, 0x81, 0x9d, 0x9a, 0x97, 0xb0, 0x32, 0x11, 0xca, 0xd5, 0xbc, 0xe6, 0xd8, 0xf5, 0x6c, 0xdd, 0xeb, 0x9d, 0xd2, 0x25, 0x0b, 0xa9, 0xa1, 0x96, 0xd4, 0x7a, 0x36, 0xa1, 0x71, 0x41, - 0xe3, 0xe6, 0x07, 0x72, 0x31, 0xe1, 0xd7, 0xfa, 0xc2, 0xc4, 0x03, 0x3f, 0x8f, 0x9c, 0x56, 0x4c, 0x53, 0x11, 0x74, 0xe9, 0x58, 0x97, 0xcb, 0xa2, 0xc1, 0x12, 0x1c, 0x9d, 0xcf, 0xe5, 0x9c, 0xd5, - 0x4a, 0x3a, 0xaa, 0xd0, 0x01, 0x67, 0x4e, 0xf7, 0x39, 0xcf, 0x1f, 0x47, 0x96, 0xcf, 0x27, 0xd6, 0x93, 0xec, 0xf3, 0xe7, 0xb2, 0xf3, 0xce, 0x06, 0xf6, 0x81, 0xfa, 0x85, 0x81, 0xdf, 0xee, 0x0d, - 0xcd, 0x85, 0x55, 0xd7, 0xd9, 0x5a, 0x39, 0xe9, 0x56, 0xe3, 0x95, 0x7b, 0x1c, 0x43, 0x2d, 0xbf, 0x49, 0x22, 0xf9, 0xc4, 0xac, 0x48, 0x58, 0xf3, 0x21, 0xa0, 0xf0, 0x95, 0x29, 0x81, 0x4a, 0xb3, - 0x8d, 0xe8, 0x74, 0x8b, 0x8d, 0xc0, 0x53, 0x63, 0xba, 0x11, 0xa0, 0x7d, 0x50, 0x2a, 0xb9, 0xca, 0x36, 0xfa, 0x36, 0xd3, 0xd2, 0x38, 0xef, 0x2a, 0x21, 0xed, 0x4f, 0x73, 0x4b, 0x5c, 0xfa, 0x36, - 0xbe, 0x8a, 0xb9, 0xf0, 0xb1, 0xc4, 0xeb, 0x37, 0xc7, 0xd5, 0xbf, 0xa7, 0x7f, 0xef, 0x09, 0x9f, 0xd9, 0x70, 0x77, 0x39, 0x54, 0x13, 0x17, 0x98, 0xb5, 0xea, 0xea, 0x82, 0x9b, 0xce, 0x44, 0x61, - 0xcf, 0xbb, 0xd1, 0x62, 0x56, 0x6e, 0x60, 0x28, 0x3d, 0x4a, 0xea, 0x31, 0x53, 0xc2, 0x31, 0x02, 0x02, 0xfc, 0x81, 0x49, 0x38, 0x13, 0xdd, 0x21, 0x92, 0x25, 0x4d, 0x91, 0xd3, 0x69, 0x9e, 0x6f, - 0x39, 0x37, 0xa5, 0xc6, 0xad, 0x07, 0x31, 0xf6, 0x61, 0x8d, 0xaa, 0xed, 0xbc, 0xe3, 0x8b, 0x00, 0x6b, 0x35, 0xc2, 0xcb, 0x4f, 0xfa, 0x11, 0xda, 0x1e, 0x07, 0x9c, 0x23, 0xfc, 0x10, 0x85, 0xf7, - 0x1d, 0xdc, 0xeb, 0xc9, 0xa6, 0xeb, 0x21, 0xaa, 0xf8, 0xfc, 0x0e, 0xf5, 0x52, 0x28, 0x5f, 0x65, 0x05, 0xbd, 0x1a, 0x8d, 0xbf, 0x3f, 0x9c, 0x78, 0xfe, 0x89, 0xcb, 0xb8, 0x3c, 0x7b, 0x30, 0x34, - 0x9e, 0x86, 0x61, 0xc4, 0x40, 0x25, 0xc7, 0xcc, 0x5c, 0x99, 0xa7, 0xb8, 0x19, 0x9b, 0xdc, 0x42, 0x08, 0xa4, 0x75, 0x73, 0xc0, 0x61, 0x8e, 0x61, 0xb5, 0x18, 0xee, 0xc1, 0x93, 0xc6, 0x19, 0xb3, - 0x43, 0x5f, 0xc8, 0x78, 0x2b, 0x13, 0x51, 0x04, 0xcd, 0x4f, 0x93, 0x22, 0x99, 0x35, 0x2e, 0x31, 0xcd, 0x4a, 0x10, 0x90, 0xc2, 0x64, 0xb7, 0x9c, 0x41, 0x6d, 0x38, 0x2d, 0x0b, 0x0a, 0x5f, 0x21, - 0x85, 0xb0, 0x34, 0xbd, 0xf7, 0x02, 0x74, 0x3f, 0xd3, 0xae, 0xfe, 0x4b, 0x7c, 0x99, 0xff, 0x77, 0xa4, 0x5e, 0x25, 0x3b, 0xfd, 0x98, 0xb1, 0x42, 0xbc, 0x9d, 0x92, 0xf3, 0xb8, 0x90, 0x0e, 0x4a, - 0xc7, 0x39, 0x33, 0x17, 0xe0, 0x19, 0xbc, 0x5f, 0xd3, 0x94, 0x64, 0x86, 0x78, 0x7f, 0x38, 0x6e, 0x14, 0x89, 0x96, 0x84, 0xf6, 0x88, 0x95, 0x3b, 0x64, 0x25, 0xf0, 0xc9, 0x3c, 0x42, 0x13, 0x3f, - 0x2a, 0x66, 0xc2, 0x49, 0x85, 0x9a, 0xa6, 0x9d, 0x04, 0x9e, 0xef, 0xc8, 0x73, 0x07, 0xa3, 0x8e, 0x94, 0x7f, 0x84, 0x5b, 0x92, 0xdf, 0x69, 0x75, 0x7b, 0x6a, 0x9a, 0xa2, 0xa0, 0xe3, 0x19, 0xb5, - 0x5c, 0xd0, 0xb2, 0x1c, 0x14, 0x30, 0x3d, 0x24, 0x63, 0xe5, 0xb9, 0x94, 0xde, 0x47, 0x56, 0x3c, 0x77, 0xfa, 0xbd, 0x63, 0xb7, 0x7e, 0x92, 0x3d, 0x33, 0xe9, 0xf7, 0xc5, 0x08, 0x1d, 0x66, 0xc3, - 0x4a, 0x9b, 0x53, 0x8e, 0x8e, 0xc5, 0x64, 0x0b, 0xdb, 0xc8, 0x7c, 0x47, 0x6e, 0x95, 0x80, 0x9b, 0x88, 0x68, 0x16, 0xcd, 0x84, 0x3e, 0xda, 0xb9, 0x6d, 0xdd, 0x2e, 0x0d, 0x53, 0x0c, 0xa0, 0x42, - 0x51, 0xfb, 0x8a, 0x3d, 0xcc, 0x51, 0xde, 0x0f, 0xf6, 0x3e, 0x29, 0xba, 0x8c, 0xce, 0x19, 0xa8, 0xb6, 0xf7, 0x62, 0x76, 0x3a, 0x4b, 0xcc, 0x36, 0xd3, 0xb2, 0x7c, 0xed, 0xca, 0xdb, 0x59, 0xc8, - 0x2d, 0x12, 0x70, 0xc0, 0xb1, 0xd9, 0x8b, 0x30, 0x9e, 0xe7, 0x9c, 0xfb, 0x08, 0x76, 0x78, 0xee, 0xc7, 0x7e, 0xc7, 0xc5, 0x77, 0x25, 0x79, 0xe6, 0xd8, 0xa5, 0x31, 0x1a, 0x0f, 0x73, 0xeb, 0x19, - 0x4e, 0xec, 0xcc, 0x65, 0x73, 0x9f, 0x95, 0xcb, 0x3d, 0x87, 0xaf, 0x24, 0x8b, 0x44, 0x0b, 0x47, 0x58, 0xe0, 0xa2, 0x10, 0xac, 0xc5, 0xe5, 0x7e, 0x8d, 0x23, 0x1b, 0xd2, 0xc6, 0x9a, 0x0d, 0xbb, - 0x3e, 0x52, 0x9d, 0xcb, 0x2b, 0xeb, 0x96, 0x16, 0x16, 0x62, 0x21, 0xb8, 0xf3, 0xd8, 0x83, 0xd7, 0xba, 0x99, 0x27, 0x31, 0x0f, 0x99, 0x9b, 0x7c, 0xc2, 0x86, 0xe5, 0xc4, 0xa5, 0xe5, 0x8d, 0x30, - 0xd6, 0xcd, 0x47, 0x03, 0xed, 0x62, 0x37, 0xde, 0xb9, 0xd6, 0xea, 0x32, 0x7a, 0x25, 0x34, 0xf0, 0x3f, 0xc8, 0x3b, 0xca, 0xe5, 0xd9, 0x17, 0xce, 0xdc, 0x78, 0x76, 0xff, 0x12, 0x36, 0x3a, 0x40, - 0xdd, 0x84, 0xe6, 0x64, 0x0f, 0x46, 0x85, 0x4f, 0x24, 0x39, 0x04, 0xd2, 0x81, 0xce, 0x11, 0xa0, 0xeb, 0xca, 0xf0, 0xcc, 0xac, 0xb5, 0xe5, 0x8a, 0xd6, 0xe2, 0xa4, 0x9f, 0x44, 0xce, 0x1a, 0x8b, - 0x4a, 0x7a, 0xed, 0x4e, 0xe1, 0xa0, 0x8c, 0xab, 0xcc, 0x13, 0x11, 0x7c, 0xc3, 0xe3, 0x27, 0x7a, 0xb2, 0x60, 0xa6, 0xee, 0xe4, 0x28, 0x93, 0xbe, 0xa1, 0xe9, 0x90, 0xd1, 0xb3, 0x8b, 0x10, 0x44, - 0x94, 0x0e, 0x78, 0x95, 0xd4, 0xfd, 0xd7, 0x1a, 0x68, 0xb0, 0x4f, 0xef, 0xee, 0xb5, 0x3f, 0x57, 0x68, 0x7b, 0x2e, 0xaa, 0xcf, 0x18, 0xe8, 0xfd, 0x01, 0xc8, 0xf3, 0x2d, 0xd3, 0xe0, 0xc5, 0x47, - 0x5e, 0x0d, 0xa0, 0x97, 0xb9, 0x43, 0x4d, 0x86, 0x8e, 0x3a, 0x4d, 0xe2, 0x16, 0x5e, 0x21, 0x28, 0xdd, 0xee, 0xc9, 0xe9, 0x51, 0xcf, 0x9d, 0x4e, 0x42, 0x96, 0xb3, 0x12, 0x8e, 0x89, 0x76, 0x8e, - 0x52, 0x3e, 0xb0, 0xc7, 0x93, 0xa3, 0x9a, 0x69, 0x8b, 0x1e, 0x48, 0x7b, 0x6a, 0xc2, 0xf7, 0xd4, 0x72, 0xb3, 0xf2, 0x12, 0x76, 0x3f, 0x46, 0xf6, 0x72, 0x8f, 0x03, 0x45, 0x42, 0x9e, 0x62, 0x5f, - 0x24, 0x0f, 0x9b, 0xbe, 0x43, 0x63, 0x7a, 0x85, 0x29, 0x06, 0x36, 0xc0, 0x00, 0xfd, 0x1f, 0x06, 0x6c, 0xf8, 0x38, 0x54, 0xb5, 0xfd, 0xc7, 0xe0, 0xb3, 0x7f, 0x69, 0x24, 0x2e, 0x9f, 0x79, 0x35, - 0x16, 0x97, 0x87, 0x43, 0x47, 0x23, 0x0e, 0x71, 0x8f, 0x22, 0xc7, 0x32, 0xe3, 0x1f, 0x4f, 0x1a, 0x06, 0xd5, 0xee, 0x06, 0xc9, 0xd4, 0x6d, 0x76, 0x98, 0x60, 0x60, 0x2a, 0x71, 0xa2, 0xac, 0x4e, - 0x15, 0xbf, 0x25, 0x6b, 0xac, 0xeb, 0xea, 0xfd, 0xc1, 0xa8, 0xe6, 0xea, 0xf2, 0x74, 0x9c, 0x81, 0x53, 0x94, 0x2a, 0x1a, 0xb8, 0x62, 0x21, 0xb9, 0x36, 0x67, 0xa8, 0x3c, 0x81, 0xac, 0x40, 0xd4, - 0x52, 0xc7, 0x6c, 0xfb, 0xa8, 0xdd, 0x34, 0xdb, 0xb7, 0x0c, 0xb8, 0xff, 0x71, 0x34, 0x9a, 0xdc, 0x2b, 0xed, 0xe0, 0x75, 0xa8, 0x0d, 0xf9, 0x56, 0x0d, 0xf1, 0x4f, 0xb2, 0xd7, 0x34, 0xcd, 0xdb, - 0xc5, 0x88, 0x1c, 0x56, 0x49, 0xfc, 0xc0, 0x4c, 0x00, 0x7b, 0x59, 0x4d, 0xe2, 0xbe, 0x8f, 0x53, 0x19, 0xa3, 0xe5, 0x15, 0xb3, 0xe2, 0x34, 0x60, 0x4b, 0x08, 0xab, 0x3e, 0x39, 0x01, 0xac, 0x52, - 0x82, 0xb6, 0xd0, 0x2e, 0x20, 0x72, 0x3f, 0x03, 0x54, 0x64, 0x1c, 0x54, 0x6c, 0x4a, 0x6b, 0xb0, 0xb4, 0xf0, 0x7b, 0x1b, 0xf6, 0x45, 0x60, 0x05, 0x68, 0x62, 0xa2, 0xd3, 0x87, 0xe5, 0x36, 0x97, - 0x8f, 0x87, 0xc3, 0x14, 0xcc, 0x55, 0x19, 0x16, 0xde, 0x3c, 0x83, 0x38, 0xa4, 0xf9, 0x21, 0x3b, 0xff, 0x76, 0x2f, 0x8d, 0xea, 0xfa, 0x77, 0x4a, 0xfb, 0xb7, 0xe3, 0xc5, 0xeb, 0x3e, 0x28, 0xb6, - 0x3f, 0x6a, 0x7e, 0x7d, 0x5b, 0xaf, 0x3e, 0x73, 0xf7, 0xc7, 0x17, 0x97, 0xe8, 0xdd, 0xa3, 0x4b, 0x4c, 0xec, 0xcd, 0x37, 0xf1, 0x35, 0xfe, 0xf3, 0x5b, 0x6c, 0xec, 0x3d, 0x1e, 0xfd, 0x93, 0xb8, - 0xc3, 0x2f, 0x10, 0xe9, 0x1f, 0x25, 0xf2, 0xee, 0x9e, 0x7f, 0x96, 0x82, 0xba, 0x0a, 0xc4, 0x37, 0xc0, 0xd3, 0x4b, 0x85, 0xa4, 0x6f, 0x9b, 0xc3, 0x07, 0x10, 0xf0, 0xbb, 0x07, 0x77, 0xb5, 0x00, - 0xae, 0xfb, 0xf0, 0xd7, 0xe2, 0x55, 0xbf, 0x2e, 0x36, 0x87, 0xbf, 0x75, 0xf2, 0xf5, 0x9b, 0xea, 0x87, 0x70, 0x9d, 0xdb, 0x23, 0x7c, 0xd8, 0xf9, 0x56, 0xa8, 0x1e, 0xc2, 0xa5, 0x37, 0xf3, 0xf7, - 0xa0, 0x43, 0x8f, 0xc9, 0xc9, 0x29, 0xb7, 0xc1, 0x76, 0x4c, 0x86, 0xfb, 0x7a, 0x85, 0x6f, 0x6d, 0xb5, 0xb0, 0x76, 0x90, 0xb2, 0xc6, 0x4a, 0xe9, 0x68, 0x42, 0x13, 0x22, 0xb7, 0xd5, 0x8a, 0x31, - 0x50, 0x05, 0xeb, 0x3b, 0xb7, 0xdf, 0x94, 0x55, 0x22, 0xcf, 0xeb, 0x18, 0x0c, 0xdc, 0x31, 0x59, 0x9c, 0xb0, 0x31, 0x14, 0x8b, 0xb5, 0x53, 0xe1, 0x47, 0x1e, 0xf6, 0xdf, 0xd3, 0x85, 0x7f, 0x1c, - 0x92, 0x2f, 0x33, 0xf3, 0xd7, 0xff, 0x23, 0x5f, 0x63, 0x6f, 0xd4, 0x76, 0xfe, 0xca, 0x51, 0x84, 0xbd, 0xe5, 0x4b, 0x3f, 0x13, 0x04, 0x47, 0x97, 0x3f, 0x23, 0x6c, 0x98, 0x37, 0x3d, 0x28, 0xad, - 0xb2, 0x5f, 0x4d, 0xe0, 0xa4, 0x43, 0xf6, 0x9d, 0xbe, 0x10, 0xdd, 0xe2, 0x14, 0x62, 0x7c, 0x24, 0xe5, 0x3b, 0x88, 0xc9, 0x97, 0x4e, 0x3d, 0x69, 0x3c, 0x47, 0x67, 0xa0, 0xbc, 0x12, 0xac, 0x31, - 0xdf, 0x40, 0x99, 0x03, 0x34, 0x27, 0x53, 0x1d, 0x9f, 0xc4, 0x58, 0x0f, 0xc1, 0xf1, 0xc4, 0x57, 0x12, 0x61, 0xdc, 0x87, 0x47, 0x7d, 0x81, 0x80, 0x53, 0x2b, 0x15, 0xac, 0x1c, 0x3f, 0x82, 0xcd, - 0x9b, 0x33, 0xf6, 0xa7, 0x25, 0xd2, 0xcb, 0x47, 0x5e, 0xd1, 0xd8, 0xc9, 0xef, 0x79, 0x82, 0x3d, 0x2e, 0xa1, 0x2f, 0x36, 0xc8, 0xee, 0xa1, 0xbe, 0xd6, 0xda, 0xf8, 0x75, 0x8b, 0x23, 0x78, 0xa8, - 0x07, 0x3b, 0xfa, 0x5d, 0x10, 0xf6, 0xbc, 0xd2, 0x7d, 0x59, 0x04, 0x7e, 0xc3, 0x11, 0x10, 0xff, 0xc0, 0x77, 0x45, 0x7d, 0xfe, 0x04, 0x0d, 0x7d, 0x8f, 0x50, 0x7c, 0xf9, 0xa9, 0x5f, 0xf1, 0x8b, - 0x3f, 0x0b, 0x92, 0x3f, 0x9d, 0xd3, 0xbf, 0x2b, 0x0b, 0x5d, 0x53, 0x76, 0xbe, 0x74, 0xf3, 0xe5, 0x3e, 0xfe, 0xc9, 0x3b, 0x9f, 0x12, 0xfa, 0x84, 0xc4, 0x67, 0xa6, 0xe3, 0x79, 0x51, 0xfa, 0xf6, - 0x1b, 0x3e, 0x8f, 0x16, 0x6f, 0xd1, 0xe8, 0xdf, 0x0f, 0x12, 0xaf, 0xef, 0xdc, 0x8e, 0xc2, 0xce, 0x3c, 0xfb, 0x1e, 0x4d, 0xfd, 0xc2, 0xe0, 0xbe, 0xf6, 0xe8, 0x0b, 0x37, 0xee, 0x0e, 0x9e, 0x2e, - 0xc1, 0xf3, 0x2f, 0x96, 0xa4, 0xcf, 0x50, 0xca, 0xe7, 0x87, 0x4f, 0xef, 0x64, 0x66, 0xde, 0x68, 0x9e, 0xe7, 0xcc, 0xb5, 0x35, 0x82, 0x86, 0x65, 0x63, 0x02, 0x3c, 0x24, 0x49, 0x41, 0x1c, 0x1f, - 0x28, 0x66, 0x6b, 0x21, 0x0b, 0xdf, 0x3d, 0xae, 0x7c, 0x01, 0x58, 0x88, 0xd2, 0xa4, 0x3c, 0x25, 0x96, 0xb6, 0xf1, 0x1c, 0x8c, 0xb5, 0x57, 0x9b, 0x15, 0xec, 0x7b, 0xf8, 0xac, 0x0b, 0x7d, 0x08, - 0xf4, 0xb5, 0x74, 0x0e, 0xed, 0xb8, 0x68, 0x0b, 0x73, 0x24, 0xa3, 0xe3, 0x0e, 0x6f, 0x25, 0x88, 0x94, 0x27, 0xb5, 0x92, 0xd7, 0x7d, 0x6c, 0x89, 0xe6, 0x74, 0x2f, 0x0e, 0x30, 0xea, 0x76, 0x51, - 0x56, 0x97, 0xde, 0xd5, 0x3c, 0x80, 0x5f, 0x57, 0x9b, 0xfe, 0x9e, 0x52, 0xf0, 0xdc, 0x9f, 0xf8, 0xce, 0xde, 0xf8, 0x0b, 0xe5, 0x33, 0xdf, 0xee, 0xaf, 0x87, 0x06, 0xfe, 0xed, 0x6d, 0xb6, 0x48, - 0x61, 0x76, 0xaa, 0x53, 0x79, 0x8e, 0x2e, 0xad, 0x56, 0x25, 0x51, 0x12, 0x31, 0x85, 0x5d, 0x96, 0x5b, 0x99, 0xba, 0x5f, 0x52, 0x27, 0x7e, 0x49, 0xb9, 0x4a, 0x8d, 0x32, 0x08, 0xe0, 0xa6, 0x56, - 0x64, 0x92, 0x16, 0xac, 0xc9, 0x6d, 0xca, 0xc9, 0x27, 0x7a, 0x5a, 0x4e, 0x95, 0x31, 0x21, 0xef, 0xc2, 0x2d, 0x85, 0xcf, 0xf1, 0x2e, 0xdc, 0x2e, 0xad, 0xa6, 0x9b, 0xc8, 0x12, 0x31, 0x84, 0x7b, - 0x2f, 0xd2, 0x3a, 0x5e, 0xb1, 0xf0, 0x26, 0x95, 0xaf, 0x98, 0xf7, 0xf7, 0x2e, 0xec, 0x1b, 0xcd, 0x2b, 0xdb, 0xce, 0xad, 0x0b, 0xc3, 0x7e, 0x70, 0x62, 0xc3, 0x23, 0xd6, 0xd5, 0xe7, 0x20, 0x5e, - 0x90, 0x4b, 0x2b, 0x09, 0xaa, 0x9d, 0xb3, 0x9f, 0xae, 0x61, 0x80, 0x3d, 0xd8, 0xd1, 0xd8, 0x37, 0x7e, 0x0e, 0xfa, 0xac, 0xa3, 0xac, 0x1b, 0x25, 0x65, 0xf3, 0xca, 0x48, 0x87, 0x2e, 0x65, 0x4e, - 0xff, 0xba, 0x27, 0x37, 0xaa, 0xe7, 0xae, 0xdc, 0x9a, 0xa3, 0x2b, 0xa9, 0x9f, 0x47, 0x7f, 0xd7, 0x48, 0xb3, 0xbe, 0x25, 0xf2, 0xbc, 0xe8, 0xd2, 0x46, 0x46, 0xf3, 0x1a, 0x86, 0x62, 0x61, 0x0f, - 0xe2, 0xca, 0xc2, 0xdb, 0x4a, 0xbb, 0xc8, 0x8d, 0xc2, 0x85, 0x62, 0x00, 0x4b, 0xbc, 0x3a, 0x04, 0x1c, 0x3e, 0xcd, 0x98, 0x9e, 0x87, 0x8a, 0x9a, 0x35, 0x67, 0x42, 0x13, 0xb6, 0xf0, 0x09, 0x75, - 0xbb, 0x65, 0xb0, 0x96, 0x40, 0x51, 0xe7, 0x67, 0xdb, 0x4a, 0x17, 0x49, 0x18, 0xe8, 0x26, 0xbd, 0xf4, 0xb0, 0xe3, 0xaf, 0x0f, 0x37, 0x50, 0x86, 0xd2, 0xce, 0x82, 0xd7, 0x6a, 0xf6, 0x9d, 0x74, - 0xc6, 0xaf, 0xa4, 0xcf, 0x2c, 0xf8, 0x72, 0x63, 0x84, 0xfd, 0x9c, 0xca, 0x78, 0x39, 0x89, 0xc1, 0x56, 0x44, 0xd4, 0xe3, 0x16, 0xd6, 0x4d, 0x4b, 0xd8, 0x69, 0x9d, 0xe0, 0xa8, 0x9c, 0x76, 0xbb, - 0x59, 0x4b, 0x18, 0x7b, 0x34, 0x90, 0x3b, 0xcc, 0x9d, 0xb9, 0xf5, 0x76, 0x5c, 0xb2, 0x47, 0x4f, 0x2a, 0xc2, 0xd2, 0x9d, 0xaf, 0x00, 0x29, 0x02, 0x85, 0x13, 0x5e, 0x77, 0x22, 0xb4, 0x9c, 0xee, - 0x00, 0x84, 0x9f, 0x74, 0x99, 0x37, 0x59, 0xcc, 0x23, 0xbe, 0x28, 0x69, 0x76, 0xa2, 0x2d, 0xf7, 0x64, 0xf5, 0x9e, 0x41, 0x73, 0x8f, 0x9d, 0x72, 0x56, 0x73, 0x2f, 0xfd, 0x46, 0x1f, 0xd5, 0x9d, - 0x9e, 0x3b, 0xdb, 0xde, 0x49, 0x94, 0xbb, 0x50, 0xbc, 0xf0, 0xb0, 0xb9, 0x95, 0x0d, 0x1c, 0xb0, 0x80, 0x98, 0xcc, 0x89, 0x34, 0x3a, 0x4c, 0x97, 0x6a, 0x59, 0x53, 0xeb, 0x59, 0x01, 0x2c, 0x20, - 0x14, 0xac, 0x44, 0xb6, 0xb4, 0x26, 0x92, 0x70, 0x6a, 0x59, 0xa7, 0x68, 0xb4, 0x15, 0xe2, 0x8c, 0x51, 0xc9, 0x83, 0x50, 0x90, 0xaa, 0xbc, 0x32, 0x56, 0x98, 0x59, 0x5f, 0xc7, 0x6a, 0x8f, 0x73, - 0xfb, 0xb9, 0xd7, 0x53, 0x2c, 0x18, 0x26, 0x5e, 0x47, 0x5b, 0x3a, 0xc3, 0x4b, 0x6d, 0xbb, 0x35, 0x5a, 0x2a, 0x79, 0xcf, 0x6a, 0xb9, 0x15, 0x6f, 0xf9, 0xf5, 0x5f, 0xf8, 0x5a, 0xaa, 0xe5, 0x29, - 0xdb, 0x9a, 0x6c, 0x77, 0x38, 0x8d, 0xf2, 0x32, 0x4a, 0xa3, 0x3a, 0x7a, 0x19, 0xb1, 0x03, 0xbf, 0x25, 0x8d, 0xdf, 0x68, 0x83, 0xa3, 0xef, 0x77, 0x86, 0xa4, 0xd6, 0x5e, 0x42, 0x69, 0xb7, 0x06, - 0x88, 0x2e, 0x0b, 0x11, 0x75, 0x69, 0x2c, 0xc8, 0xa7, 0xb0, 0x58, 0x77, 0xd1, 0xdc, 0x28, 0xa7, 0x0c, 0x94, 0x9c, 0x32, 0x7e, 0xbf, 0xe0, 0x84, 0xbc, 0x9e, 0x13, 0x05, 0xee, 0xb5, 0xee, 0x96, - 0xac, 0x60, 0x44, 0x29, 0x65, 0xb6, 0x5d, 0xee, 0xc2, 0xd9, 0x5c, 0xab, 0xd3, 0xf9, 0xde, 0x85, 0x15, 0xd6, 0xb2, 0xe1, 0xa5, 0x4a, 0x93, 0x36, 0x87, 0xd0, 0x70, 0xbf, 0x07, 0x37, 0x79, 0x37, - 0x60, 0x6b, 0xfc, 0x0a, 0x07, 0xff, 0xce, 0x44, 0xf8, 0x8a, 0x7e, 0xff, 0xa4, 0x7c, 0xc0, 0x73, 0x24, 0x86, 0xbb, 0x17, 0xda, 0x30, 0x72, 0xc2, 0xd1, 0xee, 0x70, 0xf2, 0xdc, 0x2f, 0xe3, 0xf0, - 0xeb, 0x4f, 0xa0, 0x0d, 0xf7, 0x05, 0xcb, 0x9e, 0x6b, 0x81, 0x77, 0xf0, 0x73, 0x7e, 0x53, 0xbd, 0x0c, 0xd5, 0xad, 0x7d, 0x89, 0x10, 0x18, 0x50, 0x7f, 0xc4, 0x3c, 0xc9, 0xcb, 0x49, 0x59, 0x55, - 0xcc, 0x82, 0xd4, 0xb5, 0x95, 0x5a, 0x2c, 0xb1, 0x69, 0x5a, 0xc5, 0xeb, 0xb2, 0x3a, 0x8e, 0x69, 0xd2, 0x82, 0x91, 0xf9, 0x98, 0x2e, 0x99, 0x28, 0xb2, 0xbb, 0x23, 0xca, 0x76, 0x1d, 0x8f, 0x6e, - 0x93, 0x59, 0x80, 0x77, 0x5d, 0xd5, 0x34, 0xda, 0xc6, 0xdd, 0x56, 0xeb, 0x1e, 0xd5, 0x45, 0x47, 0x0f, 0x10, 0xdf, 0x05, 0x41, 0x23, 0x76, 0xc7, 0x13, 0x61, 0x0d, 0x47, 0x43, 0x52, 0x64, 0x9b, - 0x32, 0x1a, 0xbd, 0x44, 0x13, 0x1e, 0xbf, 0xa5, 0x44, 0xae, 0x24, 0xcf, 0x5c, 0xb8, 0x34, 0x46, 0xe3, 0x61, 0xfa, 0x83, 0x28, 0x45, 0xa3, 0xeb, 0x50, 0x54, 0x81, 0x3b, 0x87, 0x22, 0x73, 0x05, - 0x66, 0xe9, 0x54, 0xaa, 0x5b, 0x0b, 0x86, 0x28, 0x8e, 0xd0, 0x67, 0xbe, 0x99, 0x98, 0xf0, 0xc6, 0x3d, 0x90, 0x66, 0x02, 0x47, 0x11, 0xac, 0x79, 0x42, 0xe4, 0x79, 0x21, 0x24, 0x08, 0xfe, 0xca, - 0x93, 0x10, 0x7f, 0x61, 0x89, 0x78, 0x0f, 0x55, 0xa4, 0xe7, 0x88, 0x15, 0xe5, 0x97, 0x93, 0x46, 0x9a, 0x1f, 0x33, 0x97, 0x19, 0xe0, 0x5f, 0xbf, 0x4b, 0x9f, 0xf8, 0x48, 0x6d, 0x7d, 0x2e, 0x35, - 0x75, 0xf4, 0xea, 0xdc, 0x12, 0xfa, 0x07, 0x46, 0xde, 0x91, 0x98, 0x3a, 0x4a, 0xce, 0x6c, 0xaa, 0xa3, 0x64, 0x74, 0x25, 0xf1, 0x33, 0x97, 0xf6, 0x5b, 0x1f, 0x14, 0xf1, 0x70, 0x3a, 0x2b, 0x4d, - 0x61, 0x86, 0x5b, 0x85, 0xcc, 0x19, 0x51, 0xb4, 0xb0, 0x01, 0x82, 0x6a, 0xa7, 0x20, 0x4b, 0x2a, 0xc0, 0x72, 0xb2, 0xa4, 0x4d, 0x27, 0xd9, 0x77, 0x01, 0xba, 0x1b, 0xbb, 0xc8, 0x9e, 0xa8, 0x20, - 0x85, 0xf7, 0xf2, 0x65, 0x1c, 0xd1, 0x8c, 0x03, 0xd8, 0x2a, 0xba, 0x84, 0x57, 0x74, 0x27, 0x48, 0x44, 0x8e, 0x1b, 0x8e, 0xb4, 0xc1, 0xa5, 0xb4, 0xcc, 0x06, 0xd8, 0x58, 0x0f, 0x3b, 0x9f, 0xaf, - 0xfb, 0xa2, 0xaf, 0xe8, 0xcc, 0x1f, 0x49, 0x09, 0x5f, 0xdf, 0x78, 0x8a, 0x3c, 0xf8, 0xeb, 0xb1, 0x1c, 0xe1, 0x03, 0xa6, 0xca, 0x13, 0x87, 0xf3, 0x75, 0xde, 0x3f, 0x7b, 0xed, 0xd5, 0x9c, 0x6f, - 0xa2, 0x57, 0xae, 0x65, 0xf2, 0x1f, 0xf4, 0x8d, 0x3d, 0xc6, 0x99, 0xe0, 0x79, 0xf0, 0x9a, 0xc8, 0x1d, 0x5d, 0x28, 0xfc, 0x3c, 0x76, 0xc0, 0x72, 0x53, 0x21, 0x8a, 0xb7, 0x30, 0x3b, 0x80, 0x37, - 0x39, 0x79, 0x9a, 0x52, 0xa7, 0x2c, 0xc3, 0x85, 0x09, 0x9b, 0x43, 0x09, 0xa1, 0x30, 0x2c, 0x91, 0x26, 0x64, 0x2f, 0x19, 0xe9, 0x1c, 0xa0, 0x50, 0x05, 0x5b, 0x72, 0xd0, 0xf2, 0xe0, 0x4c, 0xcb, - 0xac, 0xdd, 0xeb, 0x7b, 0x6b, 0xcd, 0x2d, 0x23, 0x0b, 0x05, 0xfd, 0x7c, 0x82, 0xdb, 0xbe, 0x46, 0xb2, 0xe1, 0x0e, 0x0c, 0x7a, 0x42, 0x25, 0xbc, 0x07, 0x0b, 0xe9, 0xd5, 0x92, 0xf8, 0x4a, 0x35, - 0xfd, 0x7d, 0xd7, 0x9f, 0x7e, 0x01, 0x1c, 0x3d, 0xbf, 0x3f, 0x14, 0x10, 0x7a, 0xd7, 0x6e, 0xdd, 0x23, 0x44, 0x8b, 0x52, 0x9e, 0x27, 0xdc, 0x06, 0x11, 0xb7, 0xaa, 0x85, 0xeb, 0xc7, 0xae, 0x59, - 0x12, 0x87, 0x38, 0x2e, 0x89, 0xa4, 0xdd, 0x07, 0x78, 0x9a, 0x40, 0xe5, 0x61, 0xd6, 0x51, 0x1b, 0xaf, 0xd1, 0x4a, 0x62, 0xae, 0xa1, 0x04, 0x52, 0x24, 0x4b, 0x13, 0x26, 0x0d, 0x65, 0xd3, 0x07, - 0x1b, 0x91, 0xea, 0x23, 0xde, 0xf1, 0x4a, 0xb3, 0xd8, 0xca, 0xe9, 0x34, 0xa3, 0xd6, 0x43, 0x10, 0x7a, 0xef, 0xb1, 0xb1, 0x9f, 0x68, 0xa0, 0x67, 0x18, 0xc7, 0x57, 0x41, 0x83, 0xbe, 0xbd, 0xf6, - 0x1d, 0x99, 0xed, 0xf9, 0x24, 0xf8, 0x1d, 0xe6, 0x7c, 0x7d, 0x8c, 0x7d, 0x7f, 0xfc, 0x01, 0xc1, 0xf4, 0xe1, 0x7c, 0x78, 0x2a, 0xcc, 0x57, 0x46, 0x3b, 0x87, 0x24, 0xf9, 0xa1, 0x48, 0xca, 0x3b, - 0x86, 0xc7, 0x77, 0xe2, 0xbf, 0x07, 0xf6, 0xf3, 0xd6, 0x50, 0xd3, 0xc3, 0x24, 0x4f, 0x9e, 0x6e, 0xb4, 0x76, 0x92, 0x91, 0x11, 0x2a, 0x82, 0xce, 0x06, 0xce, 0x78, 0xab, 0x77, 0xb3, 0xf5, 0x36, - 0x89, 0x5c, 0xc6, 0xb1, 0x83, 0x6e, 0xc9, 0xd5, 0x8c, 0xcb, 0x62, 0xfb, 0x53, 0xb6, 0x1b, 0xeb, 0x47, 0x5e, 0x54, 0x09, 0xce, 0xd7, 0x66, 0x1a, 0x9a, 0x6e, 0xf2, 0xd6, 0xd4, 0x60, 0xc5, 0x98, - 0x34, 0xb5, 0x2f, 0xf6, 0xe4, 0x6c, 0x43, 0xaa, 0xb1, 0x5f, 0x33, 0x10, 0x00, 0xbf, 0x67, 0xcf, 0xfd, 0xc6, 0x95, 0x7c, 0xe2, 0x8a, 0xfd, 0x0d, 0x7b, 0xf6, 0xfc, 0xd9, 0x27, 0x14, 0xd0, 0xeb, - 0xe7, 0x5f, 0xff, 0xff, 0x1f, 0x06, 0x6d, 0x18, 0x5a, 0xd4, 0xdf, 0x9f, 0xaf, 0x3c, 0x50, 0xff, 0x3d, 0x6c, 0xdf, 0x31, 0xa3, 0x06, 0x9c, 0xa6, 0x8c, 0xa9, 0x29, 0xa4, 0xe5, 0x86, 0x47, 0x41, - 0x4e, 0x9c, 0x1f, 0x1c, 0x82, 0x91, 0xe7, 0x6d, 0xb7, 0x12, 0xd4, 0x42, 0xa3, 0x5d, 0x18, 0x71, 0x60, 0x48, 0x49, 0x11, 0x3b, 0x75, 0xa7, 0xdb, 0x72, 0xbe, 0x9a, 0x6c, 0x90, 0x25, 0x7b, 0xb2, - 0x4d, 0x08, 0xee, 0x85, 0x99, 0x5e, 0x7a, 0x29, 0x50, 0x66, 0x53, 0x7d, 0x83, 0xba, 0x6d, 0xb9, 0x13, 0x50, 0xc3, 0x28, 0x8d, 0xd6, 0x0e, 0xfc, 0xc9, 0x86, 0x1d, 0xa0, 0x64, 0xfe, 0x37, 0xcc, - 0xa8, 0x2f, 0x13, 0xf2, 0x4f, 0x27, 0x92, 0xdf, 0xdd, 0xf8, 0xaf, 0x31, 0xa3, 0x06, 0xda, 0xb0, 0x7f, 0x2c, 0x81, 0xf5, 0x52, 0x9d, 0x3d, 0x97, 0x92, 0x8f, 0x1a, 0x49, 0xff, 0xe2, 0x72, 0x7d, - 0x21, 0x79, 0x96, 0x87, 0x4b, 0x63, 0xc8, 0x82, 0x0c, 0x8f, 0x6a, 0x4d, 0xa1, 0xe2, 0x9e, 0x60, 0x8a, 0xd8, 0x3a, 0x2d, 0xf7, 0x1b, 0xee, 0x48, 0x43, 0xca, 0xb2, 0x59, 0x88, 0x75, 0x3e, 0xa0, - 0x24, 0xcf, 0x07, 0x7a, 0xc8, 0x73, 0x9b, 0xf2, 0x9d, 0x3e, 0x5c, 0x28, 0x82, 0xa3, 0xeb, 0xdf, 0x4b, 0x12, 0xe1, 0x00, 0x95, 0x22, 0x89, 0x1b, 0x03, 0x8e, 0x68, 0x6b, 0x6e, 0x19, 0x01, 0x6d, - 0x65, 0x94, 0xa1, 0xc6, 0x51, 0x03, 0x2c, 0xcc, 0xb0, 0x33, 0x2c, 0xa1, 0x3a, 0xfa, 0x39, 0x91, 0x3a, 0xcd, 0x26, 0xa5, 0x5c, 0xcd, 0x10, 0x45, 0x08, 0x9c, 0xc4, 0x75, 0x69, 0xb4, 0x1c, 0x7d, - 0x62, 0x49, 0x04, 0x4c, 0x27, 0xe6, 0xae, 0x96, 0x2a, 0x3e, 0xe6, 0x66, 0xb6, 0x0b, 0xb5, 0xb3, 0xea, 0xe0, 0x8e, 0xfb, 0x52, 0xa7, 0xa7, 0x0f, 0x71, 0x6d, 0x9f, 0xd0, 0x1f, 0xaf, 0xba, 0xfb, - 0xf7, 0xbb, 0xe7, 0x1b, 0x4d, 0x70, 0xf4, 0xd1, 0xba, 0x74, 0x79, 0xc0, 0x0e, 0x1a, 0x6d, 0x5d, 0x3e, 0x72, 0xb7, 0x5d, 0x81, 0xad, 0x18, 0x88, 0x1c, 0x5b, 0xd2, 0x54, 0xc3, 0xf4, 0x5c, 0xd6, - 0x54, 0x1a, 0x6d, 0x63, 0x8b, 0x4e, 0x66, 0xe6, 0x22, 0x6c, 0x52, 0x64, 0xaf, 0x3a, 0x47, 0x70, 0x0c, 0x6b, 0x19, 0xe2, 0xa5, 0x0a, 0xe4, 0x76, 0x8e, 0x62, 0x8e, 0x9b, 0xad, 0x25, 0x79, 0x71, - 0x2b, 0x1e, 0x03, 0x7c, 0x5a, 0x1d, 0x77, 0x6e, 0xb2, 0x96, 0x00, 0x6e, 0x33, 0x75, 0x6a, 0xe2, 0x33, 0xd0, 0xfa, 0x3f, 0xe7, 0x7f, 0xff, 0xff, 0x3f, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x50, - 0x4b, 0x07, 0x08, 0x0d, 0x43, 0x2b, 0xc0, 0x5c, 0x97, 0x00, 0x00, 0xc7, 0x0f, 0x02, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, - 0x73, 0x6f, 0x6e, 0x6c, 0x51, 0x4d, 0x8f, 0xda, 0x30, 0x10, 0xbd, 0xe7, 0x57, 0x8c, 0x72, 0xe0, 0xd4, 0x38, 0x09, 0xfd, 0x38, 0x20, 0xf5, 0x80, 0x5a, 0xda, 0x1e, 0x50, 0xdb, 0x03, 0xed, 0x65, - 0xb5, 0x20, 0x63, 0x0f, 0xc4, 0x6c, 0x32, 0xf6, 0xfa, 0x03, 0x76, 0xb5, 0xe2, 0xbf, 0xaf, 0xec, 0x10, 0x60, 0xd1, 0x1e, 0xfd, 0xc6, 0xef, 0xbd, 0x79, 0x6f, 0x5e, 0x32, 0x80, 0x9c, 0x78, 0x87, - 0xf9, 0x04, 0xf2, 0xc6, 0x7b, 0x53, 0x34, 0x9c, 0x64, 0x8b, 0x36, 0xff, 0x10, 0x27, 0x7b, 0xb4, 0x4e, 0x69, 0x8a, 0xc3, 0x8a, 0xd5, 0xac, 0xea, 0x51, 0x89, 0x4e, 0x58, 0x65, 0xfc, 0x69, 0x32, - 0x85, 0x4d, 0x20, 0x11, 0x5f, 0x70, 0x68, 0x94, 0x68, 0xc0, 0xa2, 0x33, 0x9a, 0xa4, 0x03, 0xaf, 0xe1, 0xd7, 0x62, 0xf1, 0x17, 0x2c, 0x3e, 0x06, 0x74, 0xde, 0xf5, 0xf4, 0x8e, 0xab, 0xc4, 0x53, - 0x24, 0xf1, 0x89, 0xed, 0x4e, 0x68, 0x2f, 0xe9, 0xf2, 0x09, 0xc4, 0x9d, 0x00, 0x72, 0x8f, 0xce, 0xc7, 0x6f, 0xa4, 0x25, 0x42, 0x7c, 0x94, 0x81, 0x94, 0x67, 0x3b, 0x07, 0xa3, 0x11, 0x5c, 0x40, - 0x45, 0x1e, 0xb7, 0x96, 0x47, 0xfb, 0x41, 0x2b, 0xaa, 0x79, 0x6e, 0x13, 0xfb, 0xc7, 0xbf, 0xdf, 0xdf, 0x56, 0xf3, 0x3f, 0x3f, 0x57, 0xf3, 0xd9, 0xff, 0xd9, 0xfc, 0xab, 0xa2, 0x8d, 0x86, 0x0d, - 0xe7, 0xae, 0xd8, 0xb9, 0xc2, 0x06, 0xf2, 0xaa, 0x43, 0x60, 0xe5, 0x9b, 0x55, 0x52, 0xc2, 0x75, 0xd8, 0x0e, 0xe6, 0x9d, 0x26, 0x28, 0x0a, 0x45, 0xce, 0xa0, 0xf0, 0xc0, 0xca, 0x88, 0xad, 0x3a, - 0x2d, 0x43, 0x8b, 0xae, 0xbc, 0xd1, 0x2a, 0xd7, 0x8a, 0x4a, 0xd1, 0xaa, 0xb8, 0xe6, 0x95, 0x6c, 0x06, 0x70, 0x4c, 0x29, 0x1f, 0xf0, 0xf9, 0xa0, 0xad, 0x8c, 0x31, 0xef, 0xee, 0x13, 0xc2, 0x83, - 0x6f, 0xb4, 0x8d, 0x5e, 0x7d, 0x0f, 0xad, 0x12, 0x48, 0x2e, 0xdd, 0x63, 0x6a, 0xb8, 0x68, 0xb0, 0x18, 0x5f, 0x7a, 0x37, 0x48, 0x12, 0x49, 0x28, 0xbc, 0xea, 0xe9, 0x66, 0x83, 0x48, 0x5c, 0xd6, - 0xe9, 0x58, 0x67, 0x57, 0x89, 0xfb, 0xef, 0xef, 0x72, 0x4f, 0xf1, 0x12, 0x67, 0xcc, 0x2a, 0xf6, 0xe9, 0xdc, 0x5f, 0x30, 0x68, 0x87, 0x0b, 0x2c, 0xbf, 0xb0, 0x8f, 0xac, 0x1e, 0x46, 0x9e, 0x9b, - 0xde, 0xe4, 0x33, 0xab, 0x58, 0x9d, 0x4c, 0xb2, 0x63, 0xf6, 0x1a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xad, 0x92, 0x2a, 0x0b, 0x4c, 0x01, 0x00, 0x00, 0x49, 0x02, 0x00, 0x00, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, - 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0xcc, 0x93, 0xcf, 0x8e, 0xd3, 0x30, 0x10, 0xc6, 0xef, 0x79, 0x8a, 0xb9, 0xd9, 0x91, 0xd2, 0xb4, 0xac, 0xf6, 0x94, 0xa8, 0x70, 0x58, 0x2d, 0x2c, 0x17, - 0xa8, 0x20, 0x3c, 0x80, 0x49, 0xa6, 0x6d, 0x56, 0xad, 0x9d, 0xce, 0x8c, 0x81, 0xaa, 0xca, 0xbb, 0x23, 0xc7, 0xe9, 0x1f, 0x0a, 0x12, 0x08, 0xed, 0x4a, 0x7b, 0x8a, 0x3c, 0xf9, 0xfc, 0xcd, 0x37, - 0xf3, 0x93, 0x95, 0x67, 0x04, 0x16, 0x6a, 0x6b, 0x51, 0x65, 0x92, 0xd4, 0xce, 0xb2, 0xc0, 0x01, 0x58, 0x0c, 0x09, 0xf4, 0x30, 0x07, 0xc2, 0x9d, 0x6f, 0x09, 0xb5, 0x5a, 0x1a, 0xc3, 0x93, 0x47, - 0x9e, 0x90, 0xb7, 0xd2, 0x6e, 0x51, 0xa5, 0xe5, 0xa8, 0x0e, 0x0a, 0x64, 0xb9, 0xd4, 0xb2, 0xef, 0x90, 0x04, 0x59, 0x82, 0x6a, 0x94, 0x2d, 0xbd, 0xad, 0x2f, 0x35, 0x79, 0xae, 0xd2, 0x7c, 0x6d, - 0x6c, 0xb3, 0xc1, 0xa3, 0x93, 0x5c, 0xd9, 0x88, 0xe9, 0xf0, 0xc2, 0x01, 0x89, 0x1e, 0x06, 0x3d, 0xc1, 0x1c, 0x04, 0xe6, 0xaf, 0x43, 0x25, 0x7c, 0x0e, 0x09, 0x80, 0xe4, 0x48, 0xe4, 0x48, 0x23, - 0x51, 0x5a, 0xc6, 0xb3, 0x6d, 0x74, 0x5a, 0x26, 0x7d, 0x99, 0x24, 0xc1, 0x58, 0xab, 0xf7, 0x56, 0x70, 0x45, 0x46, 0x5a, 0x67, 0x0b, 0x88, 0x9d, 0x19, 0x8c, 0x85, 0x87, 0xaa, 0x5a, 0xc0, 0xbb, - 0xfb, 0x4a, 0x65, 0xd1, 0x35, 0xd8, 0x0d, 0x0b, 0xd0, 0x21, 0x73, 0x9a, 0xcb, 0x1a, 0xad, 0x66, 0xa4, 0x6f, 0x78, 0xea, 0x16, 0xfc, 0xbb, 0x8d, 0xb1, 0xfa, 0x66, 0x68, 0x06, 0xc7, 0x25, 0x8c, - 0xb2, 0x74, 0xa8, 0x01, 0xe4, 0x2b, 0x14, 0xad, 0xa6, 0x6f, 0xac, 0xd9, 0xe2, 0x5c, 0xda, 0x15, 0x92, 0x3a, 0xfd, 0xc2, 0x1f, 0x1d, 0xd6, 0xa2, 0x6f, 0x66, 0xb3, 0xeb, 0x92, 0xba, 0x73, 0x56, - 0xd0, 0xca, 0xa4, 0xda, 0x77, 0xa8, 0x32, 0x98, 0x3e, 0xb2, 0xb3, 0xd3, 0xb3, 0xca, 0x36, 0x3a, 0x8c, 0x99, 0x01, 0x21, 0xa7, 0xe7, 0x44, 0x31, 0xd5, 0x69, 0x0b, 0x19, 0xa8, 0x0f, 0x0e, 0x86, - 0xa3, 0x1a, 0x43, 0x46, 0x45, 0x83, 0xd8, 0xdd, 0xef, 0xbc, 0xd9, 0x68, 0x42, 0xce, 0xbf, 0xba, 0x66, 0x9f, 0xc1, 0x01, 0x76, 0x1e, 0x69, 0x5f, 0xc0, 0x01, 0x42, 0xd6, 0x02, 0x54, 0x4c, 0x0b, - 0x3d, 0xf4, 0xbf, 0x5c, 0x1e, 0x97, 0x7a, 0x2c, 0xc4, 0x71, 0xf3, 0x7a, 0xe3, 0x18, 0xcf, 0xf5, 0x78, 0xa5, 0xcf, 0x2e, 0x88, 0x69, 0x49, 0x03, 0x8b, 0xf4, 0xdf, 0x60, 0x2c, 0x3e, 0x7e, 0x7e, - 0x0e, 0x1a, 0x9d, 0x0b, 0x9d, 0xa7, 0x67, 0x06, 0x1c, 0xc6, 0xf9, 0x6d, 0xe4, 0x97, 0x8a, 0xe8, 0x3a, 0xe6, 0xf3, 0x73, 0x21, 0xe4, 0xce, 0xd9, 0x86, 0xe1, 0x7b, 0x2b, 0xeb, 0x18, 0x14, 0x6a, - 0xd7, 0x20, 0xb4, 0x4b, 0xb0, 0xd8, 0xca, 0x1a, 0x29, 0x3c, 0x1c, 0x70, 0xf4, 0xdf, 0xc8, 0x5e, 0xfd, 0x05, 0x99, 0x7f, 0x09, 0xc4, 0xfe, 0xcc, 0x63, 0x8b, 0xcc, 0x66, 0x15, 0x72, 0x7c, 0x72, - 0x5e, 0x10, 0x16, 0x5f, 0xaa, 0x62, 0x0a, 0xd6, 0x09, 0x2c, 0x9d, 0xb7, 0x8d, 0xca, 0xe2, 0xc6, 0x8a, 0x40, 0x59, 0xe0, 0xed, 0x58, 0x63, 0x31, 0xe2, 0xf9, 0xce, 0x35, 0x58, 0xc0, 0xed, 0xec, - 0xf6, 0xc9, 0x39, 0xfe, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x3b, 0xa7, 0x29, 0xe2, 0xc2, 0x01, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, - 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0xc4, 0x92, 0xc1, 0x8e, 0xd3, 0x30, 0x10, 0x86, 0xef, 0x79, 0x8a, 0xff, 0xe6, 0x54, 0x8a, 0xbc, 0x20, 0xc1, 0x25, - 0x51, 0xb9, 0xa0, 0x15, 0x70, 0x58, 0xb1, 0x12, 0xe5, 0x01, 0x4c, 0x3c, 0x6d, 0x2c, 0x5c, 0x4f, 0x6a, 0x8f, 0x29, 0x55, 0xd4, 0x77, 0x47, 0x89, 0x23, 0x81, 0xd0, 0xaa, 0xe5, 0xc6, 0x29, 0x8a, - 0x3d, 0x9e, 0xf9, 0xbe, 0xdf, 0x56, 0x39, 0x11, 0x92, 0x44, 0xd7, 0x8b, 0xea, 0xaa, 0xaa, 0xe7, 0x90, 0x04, 0xfb, 0x1c, 0x7a, 0x6c, 0x11, 0xe9, 0x94, 0x5d, 0xa4, 0x5a, 0x69, 0xad, 0x36, 0x7a, - 0x30, 0xc1, 0x7a, 0xea, 0xd6, 0x12, 0xa1, 0x24, 0x7f, 0x96, 0x88, 0x19, 0x49, 0x6d, 0x7e, 0x77, 0x70, 0x3f, 0x25, 0x47, 0xc2, 0x16, 0x13, 0x3c, 0x1f, 0x5a, 0x4c, 0x70, 0x61, 0xcf, 0x2d, 0xe6, - 0x6d, 0xf6, 0xa4, 0x3d, 0x1f, 0x70, 0xc5, 0xb5, 0xab, 0xaa, 0xb9, 0x53, 0xad, 0xbe, 0x06, 0x27, 0x2d, 0xca, 0x8c, 0x04, 0x13, 0xf0, 0x71, 0xb7, 0x7b, 0xc6, 0x87, 0xc7, 0x9d, 0x6a, 0x60, 0xd2, - 0x25, 0xf4, 0x10, 0x6c, 0xdf, 0x61, 0xaa, 0x00, 0xd1, 0xa3, 0x37, 0xa1, 0x7e, 0xbd, 0xe9, 0x2a, 0xe0, 0xe1, 0x01, 0x9f, 0xc2, 0x0f, 0xfe, 0x4e, 0x90, 0x81, 0x16, 0x70, 0x71, 0x1c, 0x1a, 0x9c, - 0x07, 0xd7, 0x0f, 0x48, 0x03, 0x67, 0x6f, 0xd1, 0xf3, 0x71, 0xf4, 0x24, 0x84, 0xb3, 0x93, 0x81, 0xb3, 0x80, 0x62, 0xe4, 0xa8, 0x2b, 0xa0, 0xd0, 0x46, 0x4a, 0xd9, 0xcf, 0x3a, 0xe6, 0x6c, 0x5c, - 0xd1, 0xaf, 0x27, 0x68, 0xad, 0x57, 0x8d, 0x06, 0x47, 0x92, 0x81, 0x6d, 0x0b, 0x55, 0x88, 0x4e, 0x99, 0xe2, 0x65, 0x96, 0x0a, 0xe6, 0x48, 0x2d, 0x94, 0xb8, 0x03, 0x45, 0x35, 0x0b, 0x2d, 0x50, - 0xa2, 0x2d, 0xd1, 0xf8, 0x78, 0xca, 0xc6, 0xd7, 0xa5, 0x77, 0x83, 0xe9, 0xfe, 0x21, 0x0a, 0xb6, 0xde, 0x74, 0xd5, 0xfc, 0x7b, 0x33, 0x95, 0xe7, 0xcf, 0x5f, 0xee, 0xc5, 0x52, 0xbc, 0xbe, 0xb1, - 0xbd, 0x2c, 0x57, 0xf0, 0xd7, 0xc4, 0xff, 0x11, 0xdc, 0x0a, 0xbd, 0x20, 0x5d, 0xcb, 0xf7, 0x46, 0x56, 0xa5, 0xec, 0x4e, 0x2e, 0x91, 0xd2, 0xc8, 0xc1, 0xa6, 0x85, 0xae, 0xa0, 0xa1, 0x67, 0x4b, - 0x70, 0x7b, 0x04, 0x72, 0x32, 0x50, 0x9c, 0x5f, 0x10, 0x38, 0xfe, 0x7b, 0x64, 0x2f, 0x19, 0xad, 0x32, 0x37, 0x70, 0x93, 0x18, 0xc9, 0xe9, 0x3d, 0x5b, 0x6a, 0xf1, 0xe6, 0xd5, 0xdb, 0x66, 0x5d, - 0x78, 0xa2, 0x94, 0xcc, 0x61, 0x4e, 0xfe, 0x69, 0x89, 0x01, 0x81, 0x05, 0xc6, 0x7b, 0x3e, 0x93, 0x55, 0x2f, 0xe9, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x14, 0xca, 0x4c, - 0x74, 0x6c, 0x01, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, - 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0x28, 0xa8, 0x2c, - 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0xd0, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x90, 0x4d, - 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, - 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x53, 0xcd, 0x8e, 0xdb, 0x3c, 0x0c, 0xbc, 0xeb, 0x29, 0xe6, 0xc3, 0x5e, 0xb2, 0xdf, 0xc1, 0xde, 0xe3, 0x62, 0xaf, 0xc5, 0xf6, 0x5c, 0x14, 0x29, 0x8a, 0x22, 0x08, - 0x6a, 0x45, 0x62, 0x62, 0x75, 0xb5, 0xa4, 0x21, 0xd2, 0x49, 0xf3, 0xf6, 0x85, 0x9c, 0x38, 0x3f, 0x68, 0x8b, 0x9e, 0x12, 0x90, 0x43, 0x6a, 0x38, 0x33, 0x7e, 0xc0, 0xa7, 0xa3, 0xf5, 0xc2, 0xf8, - 0x90, 0x65, 0x8c, 0xaf, 0x7b, 0x62, 0x53, 0x7c, 0x1c, 0x39, 0x58, 0x12, 0x76, 0xee, 0x2b, 0xe5, 0x20, 0xef, 0x04, 0x13, 0x1c, 0x65, 0x2c, 0x60, 0x3a, 0xcc, 0x03, 0xdb, 0x33, 0x08, 0x43, 0x91, - 0x1f, 0x14, 0xec, 0x3f, 0x2c, 0x7b, 0xc2, 0x46, 0x52, 0xa6, 0x32, 0x64, 0x6f, 0x74, 0x41, 0xb8, 0x20, 0x91, 0x10, 0x3c, 0x63, 0x43, 0xd8, 0xca, 0xc8, 0x11, 0x89, 0xb1, 0xea, 0x6a, 0xbf, 0x19, - 0x8e, 0xdd, 0x7a, 0xd1, 0xb4, 0xe7, 0xff, 0x8f, 0x0d, 0x96, 0x7d, 0xd2, 0xeb, 0xf2, 0xa4, 0x78, 0x27, 0xcf, 0xe6, 0x4c, 0x50, 0x48, 0x07, 0xe1, 0x58, 0xc9, 0xac, 0x26, 0xba, 0x38, 0xf1, 0x5d, - 0x2f, 0x7a, 0xb3, 0x41, 0x5f, 0xda, 0x36, 0xd4, 0x2a, 0x4d, 0xc5, 0x26, 0x49, 0xfb, 0xd8, 0x38, 0xf7, 0xf0, 0x80, 0x57, 0x8e, 0x83, 0x24, 0x36, 0x75, 0xee, 0xf3, 0xc8, 0x9c, 0x78, 0x07, 0xbb, - 0x7b, 0xe4, 0x90, 0x72, 0x06, 0xfd, 0x1c, 0x44, 0x09, 0xd6, 0x17, 0x22, 0xd0, 0x3c, 0xd2, 0x38, 0x07, 0xfc, 0x8f, 0xae, 0xed, 0xa6, 0xf3, 0xe6, 0x3a, 0xb6, 0x52, 0x4e, 0x8a, 0xcc, 0x4b, 0x9a, - 0x33, 0xae, 0x27, 0x9f, 0xad, 0x6f, 0x0b, 0xf9, 0x98, 0x98, 0x54, 0xff, 0x30, 0xe7, 0x71, 0xe9, 0xe2, 0x04, 0x47, 0xe8, 0x29, 0xbc, 0xdd, 0x6f, 0xc8, 0x69, 0x4f, 0x7f, 0x5d, 0x30, 0x37, 0xef, - 0xe7, 0x5d, 0x45, 0xde, 0x56, 0x74, 0x56, 0xdd, 0x87, 0x40, 0xaa, 0x34, 0x09, 0x3f, 0xd1, 0xde, 0x14, 0x39, 0x28, 0x15, 0x78, 0x73, 0xab, 0xaa, 0xde, 0x4b, 0xdb, 0x66, 0x09, 0x3e, 0xf7, 0xa2, - 0xf6, 0xf2, 0xfc, 0xf4, 0xfc, 0xf4, 0xdb, 0x21, 0xeb, 0xc5, 0x23, 0x3c, 0xc7, 0x7f, 0xc0, 0x67, 0x62, 0xeb, 0x45, 0x15, 0xff, 0x9b, 0x8c, 0x13, 0x83, 0x51, 0x09, 0x93, 0xdd, 0x48, 0xbc, 0x97, - 0x37, 0xea, 0xaa, 0x87, 0x4a, 0x1c, 0xe1, 0x19, 0x93, 0x5f, 0xb5, 0x60, 0xfd, 0x35, 0x33, 0x97, 0x83, 0x1b, 0x37, 0x79, 0xb8, 0x24, 0xb5, 0xc4, 0xbb, 0x7a, 0xe2, 0xad, 0x73, 0xe7, 0xec, 0x21, - 0x71, 0xc8, 0x63, 0x24, 0x85, 0xc7, 0x6a, 0xe4, 0x64, 0x30, 0x52, 0xab, 0xb9, 0xaa, 0xbf, 0xdf, 0xaf, 0xe1, 0xfa, 0x32, 0xc4, 0x9a, 0xcc, 0x6a, 0xbf, 0xf3, 0x5a, 0xa5, 0x80, 0x8f, 0x11, 0x9b, - 0x51, 0x4f, 0x76, 0x64, 0xd9, 0xa5, 0x70, 0x49, 0xfb, 0x35, 0x85, 0x0c, 0x29, 0x91, 0xca, 0xc4, 0x92, 0xd4, 0x90, 0x4c, 0xb1, 0xa1, 0xde, 0xef, 0x93, 0x94, 0xc6, 0xb9, 0xae, 0xeb, 0x82, 0xb0, - 0x4a, 0x26, 0x37, 0x9c, 0xbe, 0x8e, 0xdb, 0x77, 0x6b, 0xdb, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x70, 0x13, 0x6b, 0x58, 0xac, 0x01, 0x00, 0x00, 0x69, 0x03, 0x00, 0x00, - 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x70, 0x79, - 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x68, 0x52, 0x56, 0xd4, 0x4f, 0xca, 0xcc, 0xd3, 0x2f, 0xce, - 0xe0, 0xe2, 0x4a, 0xad, 0x48, 0x4d, 0x56, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0x50, 0x52, 0xd1, 0x48, - 0xc9, 0x2c, 0xca, 0x4b, 0xcc, 0x4d, 0x55, 0x50, 0x52, 0x31, 0x50, 0xd2, 0x54, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa7, 0x6e, 0xed, 0xb6, 0x3d, 0x00, 0x00, 0x00, - 0x37, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, - 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, 0x90, 0xc1, 0x4e, - 0xc3, 0x30, 0x10, 0x44, 0xef, 0xf9, 0x8a, 0x51, 0x7b, 0x01, 0x09, 0xf5, 0x03, 0x7a, 0x02, 0x55, 0xf4, 0x0b, 0x7a, 0x47, 0x9b, 0x78, 0x42, 0x96, 0x3a, 0x76, 0xb0, 0xd7, 0x29, 0xfd, 0x7b, 0x14, - 0x37, 0x41, 0xe2, 0x94, 0xd5, 0x66, 0xde, 0xce, 0x78, 0xfa, 0x14, 0x47, 0x4c, 0x92, 0xbc, 0xca, 0xc8, 0x60, 0xd0, 0x71, 0x8a, 0xc9, 0x70, 0x8a, 0xc1, 0xf8, 0x63, 0x2f, 0xe0, 0xcc, 0x60, 0x4d, - 0xd3, 0xbc, 0x3e, 0x06, 0xc7, 0x1e, 0xa3, 0x68, 0x78, 0xea, 0x1e, 0x82, 0xe3, 0xa6, 0x7c, 0x3e, 0x36, 0x00, 0xb0, 0xdb, 0xed, 0xea, 0xf7, 0x5c, 0x42, 0x67, 0x1a, 0x03, 0x8c, 0xe3, 0xe4, 0xc5, - 0x58, 0xb7, 0x97, 0x81, 0x58, 0xc1, 0xc5, 0x53, 0x46, 0x1a, 0x53, 0xdd, 0x88, 0x86, 0x0c, 0x1b, 0x88, 0xb3, 0x97, 0x7c, 0x45, 0xe2, 0x77, 0x61, 0x36, 0xc4, 0xf6, 0x8b, 0x9d, 0x41, 0x82, 0x83, - 0x84, 0x7b, 0xbd, 0x71, 0xf2, 0xb1, 0xb8, 0xf7, 0x25, 0x0c, 0x12, 0x3b, 0xea, 0x4c, 0x87, 0x9b, 0xda, 0x50, 0xe9, 0x95, 0x3b, 0xfc, 0x65, 0xa9, 0xc3, 0x1e, 0x6f, 0xce, 0xe1, 0x1e, 0x4b, 0x42, - 0x5b, 0xb2, 0x06, 0xe6, 0x0c, 0x1f, 0x3f, 0xb5, 0xc3, 0xc0, 0xc4, 0x4d, 0x73, 0xa9, 0xbc, 0x95, 0x14, 0x30, 0x8b, 0x2f, 0xac, 0x3f, 0x71, 0x53, 0xef, 0xd1, 0x12, 0x32, 0x4d, 0x5e, 0xe9, 0x20, - 0x8f, 0x98, 0x4e, 0x4c, 0x20, 0x66, 0x49, 0xdb, 0xb2, 0x3e, 0x6e, 0x8f, 0xd8, 0x43, 0xfe, 0xe7, 0x5b, 0xae, 0xd1, 0xc1, 0x62, 0x85, 0xfa, 0xad, 0x14, 0x0d, 0x73, 0xbc, 0x32, 0x55, 0x6c, 0xb5, - 0x5c, 0x6b, 0x39, 0x74, 0x0b, 0xfe, 0x51, 0xcb, 0x3e, 0x2c, 0x26, 0xcd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x87, 0x81, 0xa6, 0x27, 0xf6, 0x00, 0x00, 0x00, 0xa1, 0x01, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, - 0xca, 0xcc, 0x2b, 0xcb, 0xcf, 0x4e, 0xb5, 0x52, 0x50, 0x4a, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x09, - 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x2a, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0xd1, 0x4d, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x2b, - 0xb6, 0xb5, 0x35, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, - 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, 0x52, 0xc1, 0x8e, 0xdb, - 0x3a, 0x0c, 0xbc, 0xeb, 0x2b, 0xf8, 0xf4, 0x2e, 0x36, 0x90, 0x2a, 0xed, 0x35, 0x80, 0x4f, 0xc1, 0x16, 0x3d, 0xf5, 0xb4, 0x40, 0x8f, 0x02, 0xd7, 0xa2, 0x37, 0x42, 0x65, 0xc9, 0x2b, 0xd2, 0x46, - 0x83, 0xa2, 0xff, 0x5e, 0x50, 0x4e, 0x76, 0x53, 0x1f, 0x6c, 0x6b, 0x38, 0x33, 0x1c, 0x89, 0x9a, 0x6a, 0x99, 0x61, 0x4c, 0x65, 0x0d, 0xb4, 0x51, 0x16, 0x76, 0x17, 0x91, 0x05, 0xe2, 0xbc, 0x94, - 0x2a, 0x70, 0x56, 0xfc, 0x49, 0x71, 0xd3, 0x78, 0x0b, 0xd6, 0x14, 0x71, 0xa6, 0x2c, 0xef, 0x8c, 0x92, 0x85, 0x7e, 0x89, 0x31, 0xb7, 0xf5, 0x9a, 0xa3, 0x08, 0xb1, 0x18, 0x33, 0xad, 0x79, 0x84, - 0x01, 0xbc, 0xdf, 0x2b, 0xde, 0x77, 0x56, 0x21, 0xdb, 0x1b, 0x33, 0x26, 0x64, 0x86, 0x67, 0x62, 0xf9, 0xba, 0xe6, 0xb1, 0xbb, 0x6b, 0x9c, 0x22, 0x67, 0x64, 0xea, 0x4f, 0xc6, 0x00, 0x04, 0x9a, - 0x40, 0x61, 0xaf, 0xb2, 0x8e, 0x29, 0x4d, 0xfd, 0xc9, 0x00, 0x00, 0xfc, 0x0f, 0xe7, 0x4a, 0x28, 0x04, 0xf8, 0x18, 0x70, 0xaf, 0x7c, 0x82, 0xe7, 0x0b, 0x3d, 0xc0, 0x60, 0x63, 0xb0, 0x10, 0x19, - 0x5e, 0x29, 0x53, 0x45, 0xa1, 0x00, 0x71, 0x82, 0x32, 0x6b, 0xc7, 0xe0, 0xc0, 0xf2, 0x42, 0xe3, 0x46, 0x95, 0x63, 0xc9, 0x56, 0x3b, 0xe2, 0x9a, 0x84, 0x41, 0x0a, 0xd8, 0x2f, 0xee, 0xb3, 0x75, - 0xcd, 0x15, 0x45, 0x6a, 0x7c, 0x59, 0x85, 0x18, 0x06, 0xf8, 0xdd, 0x20, 0x7d, 0xac, 0x5c, 0x17, 0xb2, 0x27, 0xb0, 0x81, 0x36, 0xf7, 0x33, 0xa3, 0xc4, 0x8d, 0x9c, 0x66, 0x15, 0x35, 0x3b, 0x7c, - 0xf0, 0xb8, 0xac, 0x75, 0x6c, 0x4c, 0x3d, 0x5b, 0x3e, 0x1d, 0x8f, 0x77, 0x76, 0xa0, 0xed, 0xb8, 0x5c, 0xe5, 0x52, 0xb2, 0x6b, 0xa7, 0x7f, 0x53, 0xfd, 0x69, 0xef, 0x80, 0x82, 0xda, 0xd0, 0xce, - 0xc4, 0x8c, 0xaf, 0xcd, 0xe0, 0x1b, 0xa5, 0x54, 0xe0, 0x47, 0xa9, 0x29, 0xfc, 0x67, 0x77, 0x5a, 0x13, 0xc2, 0xf0, 0xb0, 0xe7, 0xee, 0x23, 0xf0, 0xa1, 0xb9, 0xf4, 0x8d, 0x38, 0xee, 0xa3, 0x52, - 0xea, 0xfe, 0xd7, 0x55, 0x7a, 0x1b, 0xbe, 0x97, 0x4c, 0xff, 0xd4, 0x5d, 0xbb, 0x0c, 0xfe, 0x6e, 0xdb, 0xbe, 0xa6, 0x11, 0x5e, 0x4a, 0xb8, 0xc2, 0x00, 0xba, 0x45, 0x37, 0x63, 0xcc, 0xdd, 0x4d, - 0xb1, 0xcb, 0x75, 0x40, 0x0e, 0x99, 0xa9, 0xca, 0xd3, 0xdb, 0x8a, 0xa9, 0x53, 0xba, 0xd3, 0xf6, 0x87, 0x5b, 0x48, 0xb7, 0x67, 0x31, 0x71, 0x02, 0xef, 0x33, 0xce, 0xe4, 0x3d, 0x0c, 0x03, 0x58, - 0xef, 0xd5, 0xcd, 0x7b, 0xab, 0xe3, 0x7d, 0xbf, 0x0c, 0xad, 0x43, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdf, 0xc1, 0x82, 0x54, 0x76, 0x01, 0x00, 0x00, 0x9f, 0x02, 0x00, - 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x70, - 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x1c, - 0xc1, 0x51, 0x0a, 0x80, 0x20, 0x0c, 0x06, 0xe0, 0xf7, 0x4e, 0xb1, 0x0b, 0xfc, 0xe1, 0xa3, 0x08, 0x1e, 0x46, 0x97, 0xca, 0x60, 0x6c, 0x92, 0x49, 0xd7, 0x0f, 0xe2, 0x7b, 0x5b, 0x4d, 0x34, 0xb6, - 0x09, 0xfb, 0x6d, 0xd4, 0xb7, 0x71, 0x2a, 0x73, 0xaa, 0x70, 0x79, 0xc4, 0x8d, 0x80, 0x2a, 0x76, 0xe5, 0x70, 0xfe, 0x52, 0x0c, 0x31, 0x10, 0x50, 0x98, 0xdb, 0x5a, 0x50, 0x1f, 0x5d, 0xb4, 0x65, - 0x1c, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfe, 0x63, 0x36, 0x9f, 0x48, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, - 0x6b, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, 0x8d, 0x41, 0x0a, 0xc2, 0x30, 0x10, 0x45, 0xf7, 0x73, 0x8a, 0xef, 0x6a, 0x92, 0x8d, 0xee, 0x85, 0x82, 0x2b, 0xf1, 0x06, 0x2e, 0x87, - 0x68, 0x13, 0x0c, 0x26, 0x99, 0x32, 0xa6, 0xf7, 0x97, 0xb6, 0x08, 0x75, 0xf9, 0x1f, 0x9f, 0xf7, 0x92, 0x69, 0x45, 0x2a, 0xe1, 0xf3, 0x46, 0xae, 0x93, 0x5a, 0xc7, 0x75, 0x19, 0x44, 0x61, 0x9a, - 0x4a, 0x7e, 0x86, 0x9e, 0xb5, 0x61, 0xd8, 0xa0, 0x13, 0x69, 0xa1, 0x46, 0x11, 0x4f, 0x44, 0x97, 0xdd, 0xe1, 0x68, 0x3a, 0xf7, 0xe8, 0xf8, 0xc4, 0x9e, 0xc6, 0x98, 0xf0, 0x8a, 0xa5, 0xa8, 0xf3, - 0x67, 0x02, 0x00, 0x8b, 0x7d, 0xb6, 0x86, 0x07, 0xdf, 0x16, 0x8a, 0xbb, 0x5a, 0x19, 0xb1, 0x66, 0x57, 0x29, 0x76, 0x9e, 0x03, 0x13, 0x51, 0x4e, 0xf8, 0x75, 0x30, 0x0c, 0x60, 0x91, 0x1a, 0x72, - 0x13, 0xe1, 0x4d, 0xf7, 0x97, 0x9d, 0x9b, 0xf3, 0xf4, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb1, 0x1c, 0x26, 0x1d, 0x85, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, - 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x2a, 0x2a, 0xcd, 0x73, 0xcd, 0x2b, 0x2b, 0xb6, 0xe2, 0x52, - 0x50, 0xd0, 0x55, 0xc8, 0x4b, 0xcc, 0x4d, 0xb5, 0x52, 0x70, 0x0c, 0x08, 0x88, 0xf7, 0xf5, 0x77, 0x09, 0xf5, 0x71, 0xe5, 0x52, 0x50, 0x50, 0x50, 0x28, 0x4b, 0xcc, 0x29, 0x4d, 0xb5, 0x52, 0x50, - 0x4a, 0x2b, 0xcd, 0x4b, 0xb6, 0x4a, 0x2c, 0x28, 0xc8, 0xc9, 0x4c, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0x53, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x8b, 0x77, 0xf1, 0x5e, - 0x42, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x74, 0x78, 0x74, 0x4a, 0x2f, 0xcd, 0xcb, 0x4c, 0xce, 0x2f, 0xca, 0xb3, 0xb5, 0x35, 0x32, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x72, 0xcb, 0x49, 0x2c, 0xce, 0xb6, 0xb5, 0x35, 0xd2, 0x33, 0xd2, 0x33, - 0xe6, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x49, 0x05, 0x73, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, - 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x70, - 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, - 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0xd0, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, - 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x93, 0xc1, 0x8e, 0x1a, 0x31, 0x0c, 0x86, - 0xef, 0x79, 0x0a, 0x57, 0x5c, 0xa0, 0x87, 0x61, 0x8f, 0xab, 0xbd, 0x6f, 0xdb, 0x5b, 0x51, 0x3b, 0x55, 0x55, 0x21, 0xd4, 0x09, 0x89, 0x21, 0xe9, 0x66, 0xed, 0x69, 0xec, 0x40, 0x79, 0xfb, 0x2a, - 0xc3, 0x0c, 0xb0, 0xda, 0x56, 0x7b, 0x02, 0xd9, 0xbf, 0x9d, 0xdf, 0xf6, 0x37, 0x33, 0x58, 0x9d, 0x34, 0x30, 0xc1, 0xa7, 0xb6, 0x5d, 0xc1, 0x87, 0x42, 0x4e, 0x23, 0x93, 0x31, 0xdf, 0x31, 0x39, - 0x7e, 0x46, 0x50, 0x86, 0x13, 0x97, 0x0c, 0x84, 0xc7, 0x49, 0xb9, 0x1b, 0x45, 0xd0, 0x67, 0xfe, 0x85, 0x4e, 0xdf, 0x41, 0x1b, 0x10, 0xb6, 0x1c, 0x13, 0xe6, 0x3e, 0x59, 0xc5, 0x8b, 0xc2, 0x38, - 0xf6, 0x08, 0xce, 0x12, 0x6c, 0x11, 0x76, 0x5c, 0xc8, 0x43, 0x24, 0x58, 0x77, 0x35, 0xdf, 0xf4, 0xa7, 0x6e, 0x33, 0x6f, 0x96, 0xe3, 0xff, 0x45, 0x03, 0x6d, 0x88, 0x72, 0x6d, 0x7e, 0x8c, 0x29, - 0x41, 0x46, 0xe9, 0x99, 0xbc, 0x51, 0x86, 0x48, 0x8e, 0x9f, 0x23, 0xed, 0xcf, 0x46, 0x3f, 0x3e, 0xb6, 0x60, 0xc9, 0xc3, 0xea, 0xf3, 0xd7, 0x16, 0x32, 0xfe, 0x2e, 0x28, 0x2a, 0x8d, 0x31, 0xb3, - 0x19, 0x3c, 0x92, 0xef, 0x39, 0x92, 0x8a, 0x31, 0x5f, 0x0a, 0x51, 0x2d, 0xd1, 0xd7, 0x9d, 0xf1, 0x4f, 0xcf, 0x82, 0xa0, 0x21, 0x23, 0x02, 0x4e, 0x25, 0x8d, 0x31, 0x00, 0xef, 0xa1, 0x5b, 0x76, - 0xc3, 0x4c, 0x53, 0x1c, 0x76, 0x9c, 0xcf, 0x6b, 0x98, 0x9a, 0x34, 0xa3, 0x2e, 0xa0, 0x4d, 0x1a, 0x96, 0x19, 0xad, 0x8f, 0x84, 0x22, 0xff, 0xa8, 0xb3, 0x70, 0xc9, 0xc2, 0x59, 0x0e, 0x2e, 0xa0, - 0x7b, 0x7a, 0xd9, 0x21, 0xc5, 0x03, 0xfe, 0xb7, 0xc1, 0x94, 0x7c, 0x59, 0x6f, 0xaa, 0xf2, 0x36, 0x22, 0xd3, 0xaa, 0xad, 0x73, 0x28, 0x82, 0xc3, 0xb6, 0x07, 0xdb, 0xdb, 0xcc, 0x47, 0xc1, 0x0c, - 0x56, 0xcd, 0x3a, 0xa8, 0xf6, 0x0f, 0xcb, 0x65, 0x62, 0x67, 0x53, 0x60, 0xd1, 0x87, 0xfb, 0xbb, 0xfb, 0xbb, 0x57, 0x83, 0x6c, 0xe6, 0x8b, 0xba, 0xe0, 0x37, 0xe4, 0x93, 0xb1, 0xcd, 0x7c, 0xd1, - 0x18, 0xf3, 0x83, 0xcb, 0xe0, 0xa0, 0x08, 0xc2, 0x70, 0x63, 0x88, 0x74, 0xe0, 0x27, 0xec, 0x2a, 0x45, 0x82, 0xe4, 0xc1, 0x8e, 0x9c, 0x8d, 0x17, 0xab, 0x71, 0x0d, 0x57, 0x5e, 0x2e, 0x73, 0x37, - 0x66, 0x38, 0x65, 0x8b, 0xa2, 0x91, 0xf6, 0x75, 0xd2, 0xdb, 0x03, 0x8e, 0xdc, 0x55, 0x24, 0x52, 0xf1, 0x28, 0x60, 0x61, 0x5d, 0x28, 0x2a, 0x28, 0x8a, 0x56, 0xa6, 0xea, 0xef, 0xcf, 0x2b, 0x58, - 0xdf, 0x7a, 0x5f, 0xa9, 0xac, 0x14, 0x18, 0x2b, 0x75, 0x23, 0x60, 0xbd, 0x87, 0x6d, 0x91, 0xf3, 0x55, 0x12, 0xef, 0xa3, 0xbb, 0x90, 0x7e, 0x79, 0x26, 0x12, 0x70, 0xf6, 0x98, 0x07, 0x97, 0xd5, - 0x6d, 0x54, 0x81, 0x2d, 0x06, 0x7b, 0x88, 0x9c, 0x1b, 0x63, 0xba, 0xae, 0x73, 0x4c, 0xc2, 0x09, 0x4d, 0x7f, 0xfe, 0x32, 0x6e, 0xdf, 0xad, 0x69, 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, - 0x07, 0x08, 0x65, 0x8d, 0x58, 0xbb, 0xa6, 0x01, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x68, 0x52, 0x56, - 0xd4, 0x4f, 0xca, 0xcc, 0xd3, 0x2f, 0xce, 0xe0, 0xe2, 0x4a, 0xad, 0x48, 0x4d, 0x56, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, - 0xcd, 0x2b, 0x51, 0x50, 0x52, 0xd1, 0x48, 0xc9, 0x2c, 0xca, 0x4b, 0xcc, 0x4d, 0x55, 0x50, 0x52, 0x31, 0x50, 0xd2, 0x54, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa7, - 0x6e, 0xed, 0xb6, 0x3d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x9c, 0x54, 0x4d, 0x4f, - 0xdb, 0x40, 0x10, 0xbd, 0xfb, 0x57, 0x3c, 0x2d, 0x07, 0xc7, 0x4a, 0x88, 0x10, 0x47, 0x4b, 0x41, 0xaa, 0x28, 0xf4, 0xd2, 0xaa, 0x6d, 0xa0, 0x27, 0xa8, 0xd0, 0x12, 0x4f, 0xf0, 0x12, 0x7b, 0x37, - 0xec, 0x8e, 0x69, 0x2d, 0xc4, 0x7f, 0xaf, 0x76, 0xed, 0xcd, 0x27, 0x14, 0x44, 0x4e, 0xf1, 0xec, 0xcc, 0x9b, 0x7d, 0x6f, 0xdf, 0xcc, 0xdc, 0x9a, 0x1a, 0x4b, 0x69, 0x2b, 0x25, 0x6b, 0xd2, 0x0c, - 0x55, 0x2f, 0x8d, 0x65, 0x9c, 0x1a, 0xcd, 0xf4, 0x97, 0x93, 0x70, 0x3c, 0xaf, 0xa4, 0x5b, 0xc4, 0x93, 0x29, 0x3d, 0x34, 0xe4, 0x38, 0xe9, 0x3f, 0xef, 0x9d, 0xd1, 0x49, 0x92, 0x1c, 0x78, 0x0c, - 0x47, 0xb0, 0xdd, 0x29, 0x6e, 0x4d, 0xd1, 0x8e, 0xc2, 0x21, 0x0a, 0xc9, 0x12, 0xc6, 0xe2, 0xd7, 0xf4, 0x2b, 0x1e, 0x1a, 0xb2, 0xad, 0x4f, 0x95, 0x35, 0x31, 0x59, 0x97, 0x14, 0x34, 0xc7, 0x52, - 0xb6, 0x95, 0x91, 0xc5, 0xcd, 0xd2, 0x2a, 0xcd, 0x03, 0x4b, 0x0f, 0x79, 0x6c, 0x92, 0xe1, 0xf0, 0x04, 0x8e, 0x6d, 0x9e, 0x00, 0x80, 0x9a, 0x7b, 0xf8, 0x71, 0x4d, 0x5c, 0x9a, 0x02, 0x93, 0x09, - 0xc4, 0x8f, 0xef, 0x17, 0x97, 0xa2, 0x3b, 0xdc, 0x48, 0x50, 0xee, 0xc6, 0x37, 0x5e, 0xc7, 0xfd, 0xcf, 0x12, 0x37, 0x56, 0x87, 0x1b, 0x8d, 0x8b, 0xa6, 0x5e, 0x3a, 0xdf, 0x68, 0xec, 0x3f, 0x33, - 0x0c, 0x21, 0xae, 0xb5, 0x58, 0xa5, 0x53, 0xe5, 0x68, 0xbb, 0xf8, 0x00, 0xdf, 0x9a, 0x8a, 0xd5, 0x67, 0x35, 0x63, 0x68, 0xa2, 0xc2, 0xc1, 0x99, 0x9a, 0xa0, 0x98, 0xac, 0x64, 0x65, 0xf4, 0x6e, - 0x27, 0x4c, 0x20, 0x9e, 0x44, 0xb2, 0x15, 0x9e, 0x1b, 0x8b, 0x05, 0xb5, 0x50, 0x3a, 0x5c, 0x72, 0x6e, 0x6c, 0x3d, 0x5e, 0x50, 0xeb, 0x06, 0xd9, 0x76, 0xaf, 0x08, 0x31, 0x9c, 0x20, 0x15, 0x29, - 0x86, 0xa1, 0x68, 0x88, 0x54, 0xe4, 0x10, 0xe9, 0x70, 0x55, 0x7b, 0xb5, 0xa0, 0xf6, 0x77, 0x88, 0x8f, 0x90, 0x26, 0x2f, 0x51, 0xb5, 0xc4, 0x57, 0xf9, 0xe1, 0xb1, 0x4f, 0x12, 0xcf, 0xd7, 0x5a, - 0x78, 0x79, 0x2a, 0xd2, 0x03, 0x4b, 0x9c, 0xe1, 0x04, 0xc7, 0x81, 0x27, 0xc4, 0xd3, 0x73, 0x7f, 0x51, 0xaa, 0xf6, 0x05, 0xfe, 0x72, 0xb6, 0xa9, 0xef, 0xbb, 0x65, 0x78, 0x41, 0x82, 0x1d, 0xfa, - 0xd2, 0xde, 0xb9, 0x17, 0xe9, 0xbf, 0x4a, 0x1d, 0xc3, 0x55, 0xe1, 0x2b, 0xdc, 0x3f, 0xc0, 0xdb, 0xfb, 0xd6, 0x12, 0x73, 0x8b, 0x60, 0x3e, 0x70, 0xb9, 0xb6, 0x30, 0x1b, 0x38, 0x2e, 0x4c, 0xc3, - 0x50, 0xda, 0xb1, 0xd4, 0x2c, 0x35, 0x99, 0xc6, 0x55, 0x6d, 0x67, 0xda, 0x50, 0xf6, 0xa6, 0x67, 0x3b, 0x25, 0x1c, 0xdb, 0xc1, 0x5a, 0x59, 0x6f, 0xb8, 0x14, 0x9e, 0x50, 0x8c, 0x37, 0xb6, 0xda, - 0x0f, 0x96, 0xc6, 0x83, 0x0d, 0x91, 0x5e, 0xeb, 0x34, 0x89, 0x12, 0x0e, 0x4a, 0x92, 0x05, 0xd9, 0x11, 0x1e, 0x65, 0xd5, 0x90, 0xcb, 0xa2, 0x9e, 0x5d, 0xd8, 0xe5, 0xc9, 0x8e, 0x8e, 0x02, 0x10, - 0x3d, 0x66, 0x97, 0x12, 0xdc, 0x9e, 0x87, 0x60, 0x07, 0x11, 0x3b, 0xbc, 0x6f, 0xc4, 0x22, 0xec, 0x74, 0x63, 0xce, 0xf3, 0xcd, 0xe1, 0xd9, 0xee, 0xbb, 0x37, 0xda, 0xd9, 0x56, 0xbb, 0xb7, 0x2d, - 0x17, 0xe1, 0xfc, 0xf2, 0xf8, 0x19, 0x96, 0xc7, 0x05, 0x5b, 0xa5, 0xef, 0x3e, 0xde, 0x73, 0xed, 0x92, 0x24, 0x41, 0x78, 0xca, 0x5a, 0x2a, 0x3d, 0x98, 0x75, 0x0b, 0x2f, 0x8f, 0x9b, 0xaf, 0xb7, - 0xa5, 0x10, 0x02, 0xe1, 0xcf, 0x79, 0xa3, 0x67, 0xde, 0xe3, 0x60, 0xaa, 0x97, 0x95, 0x64, 0x0a, 0xd1, 0xcb, 0x92, 0xd0, 0x57, 0xae, 0xb7, 0x5a, 0x88, 0x48, 0xa5, 0x5d, 0xb0, 0xd3, 0x79, 0x58, - 0x9e, 0xd1, 0x54, 0xe6, 0xf6, 0x9e, 0x66, 0x0c, 0xa9, 0x0b, 0x48, 0xdd, 0x06, 0x8c, 0xd3, 0xca, 0x34, 0xc5, 0xd9, 0xa3, 0x5f, 0xbe, 0x96, 0x66, 0xa4, 0x1e, 0xa9, 0xc0, 0x1f, 0xc5, 0xe5, 0xa6, - 0x19, 0xc7, 0xf1, 0x32, 0x1d, 0x87, 0x03, 0x7c, 0x2a, 0x0a, 0xb4, 0xa6, 0xb1, 0xb8, 0x6d, 0x9c, 0xd2, 0xe4, 0x1c, 0x2a, 0x73, 0xa7, 0x66, 0x28, 0xc9, 0x76, 0x37, 0xeb, 0xd8, 0x8b, 0x69, 0x44, - 0xec, 0x81, 0x44, 0xb6, 0x7a, 0xe8, 0xb4, 0x0f, 0xa5, 0xde, 0x43, 0x3d, 0x89, 0xbd, 0x91, 0xec, 0xfc, 0xbb, 0x65, 0xf6, 0x98, 0xda, 0x97, 0x67, 0xab, 0xdc, 0x28, 0x38, 0x8f, 0x30, 0xaf, 0x1a, - 0x57, 0x4e, 0x2e, 0x6d, 0x43, 0xd9, 0xee, 0x78, 0x6e, 0x3f, 0xcf, 0x2e, 0xd8, 0x08, 0xc7, 0x47, 0x47, 0xbd, 0x37, 0x36, 0xb7, 0x70, 0x4f, 0xe7, 0xac, 0x5e, 0x72, 0xbb, 0xe2, 0xf2, 0xdf, 0x3e, - 0x7e, 0xc0, 0x3b, 0xb4, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x00, 0xeb, 0x02, 0xc0, 0x8e, 0x02, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x2a, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0xd1, 0x4d, - 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x2b, 0xb6, 0xb5, 0x35, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, - 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x74, 0x8e, 0xb1, 0x6a, - 0x03, 0x31, 0x10, 0x44, 0xfb, 0xfd, 0x8a, 0x41, 0x95, 0x04, 0xe6, 0x30, 0x29, 0x0d, 0x57, 0x85, 0xe4, 0x0b, 0xd2, 0x2f, 0xe2, 0xbc, 0x07, 0x82, 0x93, 0x7c, 0xd6, 0xae, 0x8a, 0x60, 0xfc, 0xef, - 0x61, 0x7d, 0x24, 0x5d, 0xda, 0xb7, 0x6f, 0x66, 0xb6, 0xd4, 0xfd, 0xd6, 0x0d, 0xa3, 0x15, 0x33, 0x51, 0x23, 0x5a, 0x47, 0x5b, 0x30, 0x83, 0xf9, 0xb8, 0x30, 0xc7, 0xe0, 0x28, 0x24, 0xa2, 0x65, - 0xcb, 0xaa, 0xf8, 0x12, 0xb5, 0xcf, 0xd1, 0x96, 0xf8, 0x9b, 0x99, 0x9c, 0xbc, 0x67, 0x95, 0x74, 0x21, 0x02, 0xae, 0xb2, 0xc2, 0x31, 0x7b, 0x8c, 0xa5, 0xee, 0xf6, 0xcd, 0x5d, 0xee, 0x43, 0xd4, - 0xa2, 0xca, 0xb6, 0xa6, 0x0b, 0x01, 0x40, 0x17, 0xdd, 0x4f, 0x58, 0x6e, 0x57, 0xc1, 0x0c, 0x57, 0xa7, 0x9a, 0x4b, 0x8b, 0x8f, 0x67, 0x7a, 0x9d, 0xdd, 0x9c, 0xb2, 0xaa, 0x74, 0xfb, 0xb8, 0x8f, - 0xbc, 0xc5, 0xc3, 0x0f, 0x8f, 0x67, 0xf8, 0x47, 0xf0, 0xaa, 0x13, 0xde, 0xce, 0xe7, 0x44, 0x54, 0x56, 0x30, 0xb7, 0x5c, 0x85, 0x19, 0xf3, 0x8c, 0xc0, 0xec, 0xe5, 0xcc, 0xc1, 0xb7, 0xff, 0xfe, - 0x7e, 0x0d, 0xa6, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x40, 0xff, 0x24, 0xad, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, - 0x67, 0x69, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0x48, 0x2f, 0xcd, 0xcb, 0x4c, 0xce, - 0x2f, 0xca, 0x53, 0x48, 0x2b, 0xcd, 0x4b, 0xb6, 0xca, 0x4d, 0xcc, 0xcc, 0x53, 0xd0, 0xd5, 0x4d, 0xca, 0xcc, 0x4b, 0xb1, 0x35, 0xd0, 0x03, 0x43, 0x2b, 0x0b, 0x03, 0x0b, 0x03, 0x05, 0x5d, 0xdd, - 0xc4, 0xe4, 0xe4, 0xd4, 0xe2, 0x62, 0xdd, 0x9c, 0xfc, 0xf4, 0xb4, 0xcc, 0x9c, 0x54, 0x5b, 0x5d, 0x2e, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, 0x10, 0x21, 0xc7, 0x42, - 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x5c, 0xcb, 0xb1, 0xaa, 0xc2, 0x40, 0x10, 0x05, - 0xd0, 0x3e, 0x5f, 0x71, 0x5f, 0x9a, 0x49, 0x20, 0x0f, 0x83, 0xa5, 0xad, 0x85, 0x8a, 0x85, 0x85, 0x82, 0x45, 0x08, 0xb2, 0xea, 0x04, 0x16, 0x36, 0x33, 0xcb, 0xec, 0x28, 0xfa, 0xf7, 0x82, 0xa5, - 0xed, 0x81, 0x73, 0xe7, 0x09, 0x73, 0x88, 0xd2, 0xb0, 0x3c, 0xa3, 0xa9, 0x74, 0x28, 0x1e, 0xcc, 0x2f, 0xc6, 0x25, 0xab, 0x14, 0x6e, 0x57, 0x15, 0x80, 0x1f, 0x6c, 0x68, 0xd9, 0xf7, 0x38, 0xec, - 0xa9, 0xc3, 0xd0, 0xd0, 0x5a, 0xc5, 0x59, 0xfc, 0xff, 0xf4, 0xce, 0x4c, 0x1d, 0xc8, 0xf9, 0xe5, 0x8b, 0x9c, 0x42, 0x14, 0x6a, 0xc7, 0xf6, 0xdb, 0x8d, 0xfd, 0x61, 0x82, 0xe1, 0x5a, 0x6f, 0x39, - 0x25, 0xc5, 0x64, 0x3a, 0xe3, 0x7c, 0xdc, 0xec, 0x10, 0x72, 0x4e, 0xf1, 0x16, 0x3c, 0xaa, 0xfc, 0xd5, 0x63, 0xf5, 0x09, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9d, 0xd3, 0xa1, 0x9f, - 0x80, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x2a, - 0x2a, 0xcd, 0x73, 0xcd, 0x2b, 0x2b, 0xb6, 0xe2, 0x52, 0x50, 0xd0, 0x55, 0xc8, 0x4b, 0xcc, 0x4d, 0xb5, 0x52, 0x70, 0x0c, 0x08, 0x88, 0xf7, 0xf5, 0x77, 0x09, 0xf5, 0x71, 0xe5, 0x52, 0x50, 0x50, - 0x50, 0x28, 0x4b, 0xcc, 0x29, 0x4d, 0xb5, 0x52, 0x50, 0x4a, 0x2b, 0xcd, 0x4b, 0xb6, 0xca, 0x4d, 0xcc, 0xcc, 0x53, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x0e, 0x15, - 0xdf, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x74, 0x78, 0x74, 0x4a, 0x2f, 0xcd, 0xcb, 0x4c, 0xce, 0x2f, 0xca, 0xb3, 0xb5, 0x35, 0x32, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x49, - 0x6b, 0xe8, 0xf3, 0x17, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x3c, - 0x90, 0xc1, 0x6a, 0xeb, 0x40, 0x0c, 0x45, 0xf7, 0xfa, 0x0a, 0x43, 0x76, 0x86, 0xa7, 0xfc, 0x43, 0x5e, 0xbb, 0x68, 0xa1, 0xed, 0xc2, 0x50, 0xba, 0x2b, 0xca, 0x58, 0x71, 0x94, 0x8e, 0x47, 0x83, - 0x24, 0x3b, 0xed, 0xdf, 0x97, 0x71, 0x43, 0x36, 0x57, 0xe2, 0x70, 0xc4, 0x05, 0xed, 0xba, 0xc7, 0x94, 0xa5, 0x3a, 0x03, 0x56, 0xd3, 0x0b, 0xa7, 0x00, 0x4c, 0x99, 0xdc, 0x2b, 0xc5, 0x19, 0xd0, - 0x39, 0x42, 0xca, 0xe4, 0x7b, 0x38, 0x4a, 0xd9, 0x03, 0xec, 0xba, 0xa7, 0x12, 0x9c, 0xb3, 0x3c, 0x03, 0xca, 0xc8, 0x04, 0x3d, 0x4a, 0xb5, 0x96, 0x73, 0x6e, 0x79, 0xf5, 0xe6, 0xbc, 0x72, 0x1c, - 0x98, 0x8a, 0x43, 0x39, 0xfe, 0x4b, 0x5a, 0x4e, 0x32, 0x2d, 0x46, 0x21, 0x5a, 0xf0, 0x7b, 0xce, 0x4d, 0x78, 0x17, 0x5f, 0x28, 0x77, 0x43, 0x2c, 0xa3, 0x68, 0xf7, 0x5f, 0x47, 0x06, 0x5c, 0x3d, - 0x6d, 0xf3, 0x44, 0x29, 0xd4, 0x7e, 0xb6, 0x7e, 0xd8, 0x75, 0x6f, 0xc3, 0x07, 0xe0, 0xc3, 0xf0, 0x39, 0x84, 0x1a, 0xff, 0xdd, 0xce, 0xd0, 0xa3, 0x5f, 0xeb, 0x96, 0xda, 0x50, 0xa5, 0x48, 0x67, - 0xe8, 0x51, 0x4d, 0x26, 0xe8, 0xd1, 0xf8, 0xd2, 0xe8, 0x0b, 0xad, 0x5c, 0x20, 0xc8, 0x26, 0x8e, 0x3d, 0x54, 0x9d, 0x5b, 0x3b, 0x06, 0x4d, 0xf7, 0xdd, 0x38, 0x33, 0x39, 0x1f, 0x28, 0x7d, 0x2d, - 0xf5, 0x4e, 0x57, 0x36, 0x17, 0x2d, 0x7e, 0xc3, 0x37, 0xa9, 0xbd, 0xa7, 0xb2, 0x85, 0xb0, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, - 0x00, 0x34, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, - 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, - 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, - 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, - 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, - 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x44, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, - 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0xdd, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, - 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, - 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, - 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, - 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x57, 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, - 0xb4, 0x1d, 0x89, 0xd6, 0xf9, 0xe7, 0xc1, 0xa0, 0x2c, 0x4b, 0x9f, 0x59, 0xc4, 0xbe, 0xa4, 0xf5, 0x20, 0xad, 0xf6, 0xaa, 0xc1, 0xdd, 0xf8, 0x76, 0x34, 0x99, 0x8f, 0x2e, 0x3f, 0xf9, 0x57, 0xee, - 0xd4, 0x42, 0xa4, 0xa8, 0x14, 0x10, 0xfe, 0xaf, 0xe0, 0x84, 0x31, 0x2c, 0xb7, 0xc0, 0xf2, 0x3c, 0xe5, 0x11, 0x5b, 0xa6, 0x08, 0x29, 0x2b, 0x2d, 0x3d, 0x6b, 0x42, 0x8c, 0x41, 0x4b, 0x83, 0xba, - 0x24, 0xae, 0xb9, 0x58, 0xf7, 0x41, 0xc9, 0x95, 0x2e, 0x19, 0xa1, 0x31, 0x13, 0x73, 0xa5, 0x89, 0x2f, 0x0b, 0x7d, 0x40, 0x5a, 0x8d, 0x91, 0xab, 0x83, 0x0d, 0x52, 0x00, 0x13, 0xd0, 0x0d, 0xe6, - 0x30, 0x9e, 0x77, 0xe1, 0x97, 0x60, 0x3e, 0x9e, 0xf7, 0x8d, 0x91, 0xa7, 0xf1, 0xc3, 0xaf, 0xd3, 0xc5, 0x03, 0x3c, 0x05, 0x61, 0x18, 0x4c, 0x1e, 0xc6, 0xa3, 0x39, 0x4c, 0x43, 0xb8, 0x9d, 0x4e, - 0x86, 0xe3, 0x87, 0xf1, 0x74, 0x32, 0x87, 0xe9, 0x17, 0x08, 0x26, 0x5f, 0xe1, 0x3f, 0xe3, 0xc9, 0xb0, 0x0f, 0xc8, 0x75, 0x82, 0x04, 0xf8, 0x62, 0x72, 0xab, 0x0c, 0x4c, 0x6e, 0xe8, 0xc4, 0xd8, - 0x72, 0x37, 0x47, 0x3c, 0x80, 0xb0, 0x92, 0x15, 0x24, 0x95, 0x63, 0xc4, 0x57, 0x3c, 0x82, 0x94, 0x89, 0x75, 0xc1, 0xd6, 0x08, 0x6b, 0xb9, 0x41, 0x12, 0x5c, 0xac, 0x21, 0x47, 0xca, 0xb8, 0x32, - 0x69, 0x55, 0xc0, 0x44, 0x6c, 0xcc, 0xa4, 0x3c, 0xe3, 0x9a, 0x69, 0x3b, 0x75, 0x12, 0x97, 0x71, 0x34, 0xe8, 0xf0, 0x2c, 0x97, 0xa4, 0xe1, 0x77, 0xb6, 0x61, 0xbe, 0x40, 0xed, 0x5f, 0x5c, 0x1f, - 0x4c, 0x71, 0x79, 0x3c, 0x23, 0xb8, 0xf4, 0xa3, 0x84, 0x09, 0x81, 0xa9, 0x3a, 0x5e, 0x2b, 0x34, 0x4f, 0xfd, 0x19, 0xc9, 0x1c, 0x49, 0x73, 0x54, 0xd7, 0x9d, 0x4e, 0x5e, 0x2c, 0x53, 0x1e, 0x41, - 0x94, 0x32, 0xa5, 0xe0, 0x9e, 0x6d, 0x50, 0x3c, 0x11, 0xcb, 0x73, 0xa4, 0xa1, 0x2c, 0x45, 0x2a, 0x99, 0xc1, 0xf4, 0xa3, 0xd3, 0x31, 0xc9, 0xcf, 0x89, 0x6f, 0x98, 0x46, 0x50, 0x06, 0x71, 0x04, - 0x2b, 0x5b, 0xe4, 0x73, 0x4d, 0x26, 0xb6, 0xa7, 0x30, 0x98, 0xcd, 0x46, 0xe1, 0xf3, 0xe3, 0x28, 0x9c, 0x8f, 0xa7, 0x13, 0xb8, 0x81, 0xee, 0x95, 0xff, 0x77, 0xff, 0x1f, 0xdd, 0x6b, 0x7b, 0x74, - 0x70, 0x71, 0x61, 0xff, 0x87, 0x0b, 0x18, 0xe2, 0x8a, 0x15, 0xa9, 0x86, 0x45, 0x78, 0x67, 0x32, 0x1e, 0x3b, 0x37, 0x36, 0xf0, 0xcc, 0xf8, 0xbf, 0x2c, 0x2b, 0x00, 0xfe, 0xef, 0x8c, 0x60, 0x45, - 0x32, 0xeb, 0x03, 0x5f, 0x81, 0x90, 0xf0, 0xa1, 0xde, 0xbb, 0xa0, 0xf4, 0x83, 0x49, 0x7a, 0x4e, 0x72, 0xc3, 0x63, 0x9b, 0x11, 0x6b, 0x7b, 0xf0, 0x87, 0x30, 0x87, 0xa3, 0x2f, 0xc1, 0xe2, 0xee, - 0xe1, 0x79, 0x38, 0x7d, 0x9a, 0xdc, 0x4d, 0x83, 0xe1, 0xb3, 0x41, 0x71, 0x03, 0x5d, 0x53, 0xd7, 0xea, 0xf3, 0x60, 0x40, 0x98, 0x4b, 0xdf, 0xa2, 0x68, 0xd6, 0xb7, 0x9d, 0xf8, 0x34, 0xe0, 0x72, - 0xa0, 0xd9, 0x77, 0x46, 0x7c, 0x70, 0x80, 0x73, 0xd0, 0xad, 0xdc, 0x03, 0xc0, 0xc7, 0x13, 0x1e, 0x3e, 0x42, 0xf7, 0x70, 0xf7, 0x65, 0xb7, 0x7d, 0x97, 0x89, 0xb6, 0x7b, 0xdd, 0x39, 0x66, 0x6b, - 0xc6, 0x4c, 0xe3, 0xca, 0x16, 0x76, 0xf2, 0x5d, 0x16, 0x6d, 0xdf, 0xf7, 0xa1, 0x4c, 0x78, 0x94, 0x40, 0x66, 0x45, 0x29, 0x92, 0xc2, 0xf5, 0x74, 0x83, 0x33, 0x70, 0x47, 0xb6, 0xa0, 0x65, 0x6d, - 0xdf, 0x68, 0x07, 0x17, 0x4a, 0x23, 0x8b, 0xeb, 0xce, 0x8f, 0x5d, 0x82, 0xa4, 0xc0, 0xf7, 0x13, 0x7b, 0x1f, 0x3c, 0x8e, 0x26, 0xcf, 0x75, 0x5c, 0xb3, 0x70, 0x3a, 0x1b, 0x85, 0xa6, 0xc3, 0x9e, - 0x67, 0xc1, 0xc3, 0xaf, 0x70, 0xb3, 0x63, 0xc8, 0x8c, 0xae, 0x9f, 0x6d, 0xc4, 0xa0, 0x66, 0xef, 0x5c, 0x54, 0xe7, 0xc8, 0x28, 0x13, 0x24, 0x3c, 0x53, 0x2d, 0x25, 0x4f, 0x53, 0x58, 0x22, 0x28, - 0xb6, 0xb1, 0x7a, 0xf2, 0x57, 0xf1, 0xff, 0x3b, 0x08, 0xff, 0x2c, 0xf0, 0xf6, 0xf4, 0x4d, 0x58, 0x86, 0x35, 0xaf, 0x3b, 0xf6, 0xab, 0x44, 0xa9, 0x44, 0x16, 0x69, 0x6c, 0xd0, 0x16, 0xaa, 0x12, - 0x3f, 0x23, 0x14, 0xc4, 0x63, 0x3c, 0xc8, 0xc2, 0xae, 0x3f, 0x0a, 0x4a, 0x77, 0x2a, 0x53, 0x3b, 0x7d, 0x77, 0x78, 0x2e, 0x21, 0x5f, 0x9f, 0x27, 0xc1, 0xfd, 0x68, 0x17, 0xa6, 0x2b, 0x7e, 0x67, - 0x6d, 0x41, 0x69, 0x1d, 0x81, 0x13, 0x05, 0x67, 0x69, 0x23, 0x79, 0x0c, 0x19, 0xe3, 0xc2, 0x73, 0xd6, 0x18, 0xad, 0xd5, 0x6f, 0xdf, 0x7a, 0xf0, 0x63, 0xc7, 0xce, 0x7c, 0xab, 0x34, 0x66, 0xbe, - 0x2c, 0xb4, 0x9f, 0x13, 0x17, 0x3a, 0x15, 0x5e, 0xf7, 0x12, 0x1a, 0x12, 0xa2, 0x34, 0x23, 0x8d, 0xb1, 0xbd, 0xbd, 0xdc, 0xf8, 0x62, 0x6e, 0xab, 0x25, 0x53, 0x38, 0xe4, 0x84, 0x91, 0x96, 0xb4, - 0x85, 0x1b, 0x10, 0x58, 0xda, 0x05, 0xcf, 0xfa, 0xb8, 0xfa, 0xd6, 0xd8, 0xdf, 0xee, 0x63, 0xa1, 0x0c, 0x22, 0x63, 0x06, 0xe2, 0xda, 0xce, 0x67, 0x30, 0x4d, 0x76, 0x60, 0xda, 0x5f, 0xa3, 0x0e, - 0x96, 0x4a, 0xa6, 0x85, 0x46, 0x53, 0x46, 0x5e, 0xaf, 0xe7, 0x62, 0xb5, 0x19, 0x1b, 0xc0, 0x78, 0xf5, 0x76, 0x8f, 0xe1, 0x0b, 0x57, 0x5a, 0xf5, 0x81, 0x4c, 0xa7, 0x70, 0x6d, 0x04, 0x1c, 0xa2, - 0x04, 0xa3, 0xef, 0x46, 0x9c, 0xf8, 0xae, 0xe3, 0x94, 0xb9, 0x46, 0x0b, 0xa5, 0x65, 0xd6, 0x34, 0xbe, 0x67, 0x18, 0x72, 0x46, 0x2c, 0x43, 0xbd, 0x4b, 0x5e, 0x4d, 0x44, 0xd6, 0x90, 0x5e, 0x27, - 0xd0, 0x5b, 0xbb, 0xd0, 0xe0, 0xe4, 0x20, 0xa2, 0xfe, 0xdb, 0x3d, 0xd7, 0x24, 0xae, 0xca, 0x9a, 0x29, 0xa0, 0x9b, 0x56, 0x05, 0xdc, 0x6f, 0xe5, 0x2b, 0xef, 0x1c, 0x10, 0xbf, 0x62, 0xc0, 0xeb, - 0x35, 0xf3, 0x5e, 0xc3, 0x1f, 0x8b, 0xbc, 0xd0, 0x73, 0x4d, 0xc8, 0xb2, 0xb3, 0x91, 0x34, 0xf7, 0xdc, 0x80, 0x28, 0xd2, 0xf4, 0xfa, 0xc0, 0x8e, 0xa6, 0xed, 0x91, 0x65, 0x33, 0xde, 0x69, 0xcd, - 0x51, 0xd4, 0x98, 0x3d, 0x1b, 0x48, 0xef, 0xfa, 0xc4, 0xc9, 0xfe, 0x46, 0x6c, 0xf3, 0x67, 0xa6, 0x2b, 0x17, 0xfb, 0x09, 0xaf, 0xc5, 0x4a, 0xfb, 0x51, 0xdf, 0x74, 0xc0, 0x59, 0x30, 0x0d, 0xc0, - 0x2d, 0x16, 0xab, 0x94, 0x9d, 0xb1, 0xbb, 0x46, 0x5d, 0x5b, 0xf2, 0xce, 0xf6, 0x77, 0xdf, 0xd8, 0x38, 0xb2, 0xfc, 0x0a, 0x11, 0xd3, 0x51, 0x02, 0xde, 0x78, 0x3a, 0xb2, 0x8f, 0x45, 0xf3, 0xd0, - 0xc4, 0xe3, 0xb4, 0xc2, 0xd9, 0x96, 0x1b, 0x85, 0xe1, 0x34, 0x04, 0x13, 0x96, 0x29, 0xab, 0x0f, 0xa6, 0xd7, 0xde, 0x96, 0xff, 0x8f, 0xd0, 0xfd, 0xd0, 0x3d, 0x01, 0x61, 0x05, 0x2a, 0x6d, 0xcb, - 0x79, 0x7b, 0x25, 0xc0, 0xdb, 0xf5, 0xd9, 0x2c, 0x88, 0x9f, 0xaa, 0xfa, 0x6a, 0x0b, 0xa9, 0x1e, 0xef, 0x30, 0xe3, 0x47, 0xa9, 0x54, 0xd8, 0x96, 0x69, 0x33, 0x5e, 0x4f, 0x66, 0xdf, 0xcf, 0x2b, - 0x38, 0xcd, 0x59, 0x0b, 0x49, 0x08, 0xbe, 0xef, 0x9f, 0xda, 0xea, 0xb4, 0xff, 0xf5, 0xfa, 0x4e, 0xc9, 0x35, 0x99, 0x31, 0x6f, 0xa7, 0x4a, 0x0a, 0xab, 0x1a, 0x38, 0x14, 0x1c, 0x59, 0xe8, 0xbc, - 0xd0, 0x6f, 0x4a, 0xcc, 0xa9, 0x68, 0x1e, 0x8b, 0x4e, 0x7d, 0x51, 0xf6, 0x0e, 0x24, 0xe4, 0xa7, 0xbd, 0x6d, 0x5b, 0xa5, 0x8c, 0x50, 0xd8, 0xbf, 0xbc, 0xde, 0x59, 0x15, 0xf9, 0x83, 0x63, 0xd9, - 0xf7, 0x98, 0x53, 0xcb, 0xb1, 0x33, 0x4c, 0x9c, 0x4d, 0xfb, 0xae, 0x7c, 0x23, 0x42, 0x66, 0xbe, 0x33, 0x1c, 0x0f, 0xfb, 0xcb, 0xa3, 0x2a, 0xe8, 0x37, 0xa0, 0x9c, 0x90, 0xd2, 0x5e, 0xdf, 0x7f, - 0x29, 0x65, 0x5a, 0x56, 0x09, 0x3b, 0x74, 0x7f, 0x72, 0x71, 0xd5, 0x06, 0x4f, 0x1b, 0xa5, 0x7e, 0x2e, 0x98, 0xa3, 0x5f, 0x48, 0x66, 0x8b, 0xf0, 0xce, 0x2b, 0x28, 0xed, 0x37, 0x2c, 0x1e, 0x01, - 0x6d, 0x03, 0x35, 0x94, 0x02, 0x8f, 0x03, 0x72, 0xfb, 0xf0, 0x85, 0x6b, 0xef, 0xaa, 0xb1, 0xb6, 0xab, 0xfa, 0x87, 0x84, 0x64, 0x69, 0x3f, 0xeb, 0x4e, 0x6a, 0xfe, 0x8c, 0x8e, 0x10, 0x49, 0xda, - 0x21, 0xe6, 0x62, 0x7d, 0xec, 0x12, 0xab, 0xdd, 0x73, 0xcd, 0xa2, 0xef, 0x0f, 0xc4, 0xa2, 0x93, 0x5e, 0x6c, 0x62, 0xfa, 0x5b, 0x13, 0x53, 0xa7, 0xfa, 0xd7, 0xfe, 0x77, 0xf4, 0x2e, 0xb2, 0xaf, - 0x99, 0x36, 0x9a, 0xf6, 0xd7, 0x64, 0xf5, 0xab, 0x5f, 0xf5, 0x49, 0x8c, 0x4a, 0x73, 0x61, 0xbf, 0xd1, 0x7a, 0xa0, 0x4d, 0x8c, 0x0a, 0xf6, 0xed, 0xfd, 0xa3, 0x51, 0xf7, 0xe0, 0x39, 0x3c, 0x6b, - 0xd4, 0x28, 0x36, 0x5e, 0xf7, 0xfe, 0x71, 0xf2, 0xf4, 0xbc, 0x98, 0x8f, 0x42, 0xa3, 0xca, 0xdd, 0x5e, 0x2d, 0x4b, 0xf0, 0xf3, 0xcf, 0xd0, 0xb6, 0x73, 0x16, 0xcc, 0xe7, 0x4f, 0xd3, 0x70, 0xb8, - 0xdf, 0x79, 0xc2, 0xa3, 0x83, 0xa8, 0x90, 0x84, 0x79, 0x59, 0xde, 0xb4, 0xda, 0xd9, 0x7b, 0x3c, 0x64, 0x2b, 0x4a, 0x18, 0xfd, 0xf6, 0x0d, 0x72, 0xa6, 0x54, 0x29, 0x29, 0x3e, 0x73, 0x7a, 0x8f, - 0xc2, 0xd7, 0xf2, 0x36, 0x61, 0x14, 0x10, 0xb1, 0xed, 0x31, 0xf3, 0x41, 0xa1, 0x13, 0x14, 0x9a, 0x47, 0x4c, 0x4b, 0xf2, 0x15, 0x6a, 0xf7, 0x59, 0xe7, 0x19, 0x25, 0x39, 0x58, 0xf4, 0xda, 0x5a, - 0xf6, 0x5f, 0x53, 0xf7, 0xd6, 0x3d, 0x59, 0xc9, 0x49, 0x6a, 0x8c, 0xcc, 0x67, 0xfc, 0xcc, 0xe1, 0x6c, 0x58, 0x33, 0x8c, 0xdb, 0x76, 0x6c, 0x5b, 0x69, 0x75, 0x64, 0x06, 0xa1, 0x2e, 0x48, 0x54, - 0x17, 0x78, 0xfb, 0xc9, 0x9a, 0xd0, 0xfe, 0x8e, 0x9c, 0x16, 0xd1, 0x3f, 0x92, 0xe4, 0x93, 0x72, 0x33, 0xc3, 0xbc, 0xa8, 0x4b, 0x5c, 0x2a, 0xae, 0x6b, 0x55, 0x75, 0x0d, 0x58, 0x65, 0xae, 0x71, - 0x26, 0x44, 0x16, 0x9b, 0x66, 0xf9, 0x65, 0xab, 0xf1, 0xb6, 0xfa, 0x5a, 0x07, 0x5a, 0x46, 0xfb, 0x0d, 0xb4, 0x8c, 0xe0, 0x06, 0x6e, 0xeb, 0x0f, 0x79, 0x81, 0xa5, 0xfb, 0xed, 0x39, 0x07, 0xbe, - 0xcc, 0x51, 0xb8, 0xb7, 0x4e, 0xef, 0xe8, 0x5d, 0x3d, 0xb5, 0xdd, 0xee, 0x6e, 0xc3, 0x95, 0x54, 0x0d, 0x89, 0x6f, 0x2e, 0x79, 0xcd, 0xe2, 0xde, 0x5b, 0x58, 0x49, 0xfb, 0xba, 0xa8, 0xfd, 0xf5, - 0x7c, 0x4d, 0x4c, 0xa8, 0x15, 0x92, 0x69, 0x15, 0x8f, 0x96, 0x51, 0x1f, 0xae, 0xfa, 0x70, 0x27, 0xc5, 0xda, 0xbf, 0x0f, 0xfe, 0xfb, 0xfc, 0x18, 0xdc, 0x2d, 0x46, 0x47, 0xc7, 0x4f, 0xae, 0x4e, - 0x5a, 0x46, 0x87, 0x93, 0xaf, 0x9d, 0xce, 0x6b, 0xe7, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, - 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, - 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, 0xf1, 0x7d, - 0xef, 0x92, 0x17, 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, 0x21, 0x8d, 0x0a, 0x9e, 0x5e, 0x9c, 0xe9, 0xa6, 0x3b, 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, 0xce, 0xe1, - 0x3a, 0x3e, 0x43, 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, 0x0f, 0x79, 0xa5, 0x0c, 0x31, 0x39, 0x4d, 0x09, 0xc5, 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, 0x69, 0x93, - 0x25, 0xa8, 0x45, 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, 0x2e, 0x66, 0xc9, 0xff, 0x9e, 0xd3, 0xc2, 0x21, 0x37, 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, 0xb0, 0xc3, - 0xb0, 0x36, 0xaa, 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, - 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x94, 0x55, 0x59, 0x6f, 0xdb, 0x38, 0x10, 0x7e, 0xe7, - 0xaf, 0x98, 0x95, 0x0b, 0xf4, 0x40, 0x2d, 0x27, 0x0f, 0x05, 0x0a, 0x01, 0x29, 0x90, 0xc3, 0x69, 0xd5, 0x75, 0xb2, 0x5d, 0x47, 0xee, 0xa2, 0x80, 0x01, 0x8b, 0xa6, 0xc6, 0x12, 0x6d, 0x8a, 0xd4, - 0xf2, 0x90, 0x6b, 0x14, 0xdd, 0xdf, 0xbe, 0xa0, 0x24, 0x5f, 0x49, 0xbc, 0xc7, 0x9b, 0xc4, 0xf9, 0x66, 0x38, 0xf3, 0xcd, 0x37, 0xc3, 0x1e, 0xdc, 0x3a, 0xc9, 0x2c, 0x57, 0x12, 0x2a, 0xad, 0x96, - 0xc8, 0x2c, 0x21, 0x7f, 0xa0, 0x60, 0xaa, 0x44, 0xb0, 0x0a, 0x36, 0xca, 0x69, 0x90, 0xb8, 0x86, 0xdf, 0x1d, 0xd5, 0x2b, 0x67, 0x60, 0xf1, 0x08, 0xfd, 0x0b, 0x21, 0x49, 0xc1, 0x0d, 0x18, 0x5a, - 0x56, 0x02, 0xb7, 0xa7, 0xc0, 0x94, 0xb4, 0x94, 0x4b, 0x03, 0x14, 0x0c, 0x97, 0xb9, 0xc0, 0x9d, 0x63, 0x04, 0xe9, 0xf6, 0xd3, 0x84, 0xdb, 0xbb, 0xc3, 0xed, 0xd1, 0xab, 0xd7, 0xe9, 0x5b, 0x62, - 0x8b, 0x3d, 0x1c, 0x96, 0xce, 0x58, 0xd0, 0x68, 0x9d, 0x96, 0x06, 0xb8, 0x35, 0x40, 0x75, 0xee, 0x4a, 0x94, 0x36, 0x24, 0xa4, 0xd7, 0x83, 0x91, 0x62, 0x54, 0x00, 0x7e, 0x47, 0xe6, 0x3c, 0x9c, - 0xdc, 0xd1, 0x15, 0x82, 0x71, 0x1a, 0xc1, 0x16, 0xd4, 0x42, 0xfa, 0x99, 0xd6, 0x14, 0xce, 0xcf, 0xe1, 0xe1, 0xe6, 0xd7, 0x14, 0xb8, 0x01, 0x2e, 0x8d, 0xa5, 0x42, 0x60, 0x16, 0x12, 0x92, 0x28, - 0x30, 0x96, 0x6a, 0x0b, 0x06, 0x75, 0x8d, 0x1a, 0x84, 0x8f, 0x25, 0x36, 0xa0, 0x9d, 0x84, 0x34, 0x1c, 0x94, 0xb5, 0x5c, 0xc3, 0x9f, 0x6d, 0xdd, 0x51, 0x86, 0x75, 0x1a, 0x92, 0xa4, 0x40, 0x60, - 0xaa, 0x2c, 0xa9, 0xcc, 0x5a, 0x57, 0x03, 0x85, 0xb5, 0xd5, 0x36, 0x80, 0x3f, 0xa6, 0xce, 0xaa, 0x92, 0x5a, 0xde, 0x86, 0x5a, 0x53, 0xcb, 0x0a, 0x34, 0xb0, 0x50, 0x1a, 0x58, 0x41, 0x65, 0x8e, - 0x06, 0xd4, 0x02, 0x8c, 0x72, 0x9a, 0xf9, 0x50, 0x19, 0x86, 0x24, 0x3e, 0xfa, 0xdf, 0xc1, 0x3c, 0x0b, 0xed, 0x37, 0xac, 0xb9, 0x10, 0x30, 0x6f, 0xd8, 0xad, 0x68, 0x4e, 0x2d, 0x66, 0xbe, 0x37, - 0xda, 0x49, 0xc9, 0x65, 0xde, 0x5d, 0x1e, 0x42, 0x6c, 0x81, 0x0a, 0xa3, 0x40, 0x55, 0x28, 0x0d, 0x64, 0x38, 0x77, 0x79, 0xee, 0xed, 0x95, 0xd2, 0x16, 0xd2, 0x77, 0x67, 0x67, 0xef, 0x52, 0x62, - 0x54, 0x67, 0x40, 0x0d, 0x8c, 0x4a, 0x1f, 0x94, 0x5a, 0x4b, 0x59, 0x81, 0x19, 0xf0, 0x05, 0x48, 0xc4, 0x6c, 0x4b, 0x8d, 0x67, 0xc1, 0xa2, 0xb1, 0xcf, 0xd2, 0xe2, 0x0d, 0x69, 0xdb, 0x01, 0xcf, - 0x49, 0xd3, 0xd2, 0x14, 0xae, 0x47, 0x31, 0x21, 0xb1, 0x7d, 0x69, 0x40, 0xa3, 0xa7, 0x09, 0x65, 0xd6, 0xa6, 0x6a, 0xd0, 0x42, 0x7a, 0x3b, 0xb9, 0xbf, 0x9e, 0x8d, 0x87, 0x1f, 0xe3, 0x87, 0x64, - 0xfc, 0x2d, 0x05, 0x94, 0x35, 0xd7, 0x4a, 0xfa, 0x56, 0x42, 0x4d, 0x35, 0xa7, 0x73, 0x81, 0x21, 0x49, 0xd3, 0xd4, 0x14, 0x28, 0x04, 0x18, 0xa6, 0x79, 0x65, 0x49, 0x0f, 0x34, 0x56, 0x82, 0x32, - 0x84, 0xbf, 0x06, 0xe1, 0x9c, 0x9a, 0x42, 0x33, 0x98, 0x6f, 0x5a, 0x5d, 0xb6, 0x40, 0xcd, 0x60, 0xc1, 0x05, 0x1e, 0x20, 0x33, 0xc5, 0x56, 0xa8, 0x43, 0xae, 0x06, 0x4b, 0x55, 0xc8, 0x4c, 0x79, - 0x02, 0x6d, 0xd1, 0xfa, 0x68, 0xcc, 0xb9, 0xb1, 0x7a, 0x43, 0xf0, 0x7b, 0xc3, 0xcb, 0x51, 0x52, 0x17, 0x4f, 0x3c, 0x09, 0xb2, 0x42, 0x41, 0xf0, 0xdf, 0xc0, 0x01, 0x7c, 0xf8, 0x70, 0x90, 0xa6, - 0xaf, 0xc5, 0x33, 0xd4, 0x83, 0x2b, 0xc7, 0x45, 0xc6, 0x65, 0xde, 0xcd, 0xca, 0x56, 0x41, 0x73, 0x7f, 0x6c, 0xe0, 0xb7, 0xeb, 0x18, 0x78, 0x49, 0x73, 0x6c, 0x54, 0x72, 0x28, 0xfe, 0x90, 0x3c, - 0xe1, 0xc3, 0x9b, 0x5a, 0xc7, 0x36, 0xfc, 0xd5, 0x06, 0x32, 0x5c, 0x50, 0x27, 0xec, 0x5b, 0xf8, 0xfc, 0xf5, 0xae, 0x35, 0x79, 0xa1, 0x3b, 0xe3, 0x1b, 0x99, 0x28, 0x40, 0xe9, 0x99, 0x05, 0x49, - 0x2d, 0xaf, 0xb1, 0xb3, 0xfb, 0x7e, 0x2c, 0x94, 0x10, 0x6a, 0xed, 0x05, 0xf2, 0x5c, 0x27, 0x8c, 0x6f, 0x5b, 0xd3, 0xd6, 0x70, 0x43, 0x4b, 0x91, 0x46, 0xfe, 0x3a, 0xff, 0x45, 0x9a, 0x08, 0x43, - 0x59, 0x9b, 0x88, 0x00, 0xf4, 0x41, 0xd2, 0x12, 0x23, 0xb8, 0xfa, 0x32, 0xbb, 0xbf, 0x4c, 0xe2, 0xaf, 0xc3, 0x59, 0x7c, 0x77, 0xf9, 0x71, 0x48, 0x00, 0x00, 0x6a, 0x2a, 0x1c, 0x46, 0x10, 0x58, - 0xed, 0x30, 0x38, 0xc6, 0xde, 0x5d, 0x7e, 0x1d, 0xde, 0xcf, 0xae, 0x26, 0xf1, 0x28, 0x99, 0x5d, 0x8e, 0x93, 0xf8, 0xf6, 0xf2, 0x3a, 0x39, 0xf4, 0xd9, 0xdd, 0x0b, 0x96, 0xea, 0x1c, 0xed, 0xa0, - 0xcd, 0xbe, 0xdf, 0xce, 0x89, 0x19, 0xbc, 0x39, 0x15, 0xee, 0x66, 0x76, 0x39, 0xfe, 0x38, 0xb9, 0x1b, 0xde, 0x27, 0x0f, 0x87, 0xf1, 0x2a, 0xca, 0x56, 0x9e, 0xe0, 0xfe, 0x8d, 0x59, 0xf1, 0x2a, - 0x41, 0x63, 0xcd, 0x85, 0x4f, 0x0b, 0xfa, 0x37, 0x25, 0xad, 0x51, 0x86, 0x4b, 0x5a, 0xd3, 0x4c, 0xb1, 0xd0, 0x9b, 0xb7, 0x96, 0x6e, 0xf4, 0xc3, 0xce, 0x39, 0xb4, 0x9b, 0x0a, 0x2f, 0x8e, 0x13, - 0x39, 0xcd, 0xc0, 0xe3, 0x6c, 0x66, 0xb7, 0xf1, 0xe8, 0x88, 0x96, 0x2e, 0x50, 0xd3, 0xf8, 0x90, 0xea, 0xfc, 0xdf, 0x62, 0x3d, 0x4f, 0xd4, 0xcb, 0x37, 0x7d, 0xbf, 0x06, 0x50, 0x87, 0x4b, 0xaa, - 0x5f, 0xee, 0x15, 0x37, 0x6e, 0x77, 0xc3, 0x23, 0xc1, 0x69, 0x27, 0xcd, 0x91, 0xc0, 0x76, 0xb3, 0xcd, 0x25, 0xd0, 0xed, 0xd2, 0x46, 0x4d, 0x9c, 0x5f, 0xda, 0x0d, 0xb2, 0x15, 0x26, 0xd3, 0xd8, - 0x6c, 0x1d, 0x3a, 0x57, 0xf5, 0x33, 0x43, 0xda, 0x88, 0x52, 0x3b, 0xb9, 0xbf, 0xff, 0x06, 0x2b, 0xa1, 0x36, 0x4f, 0x32, 0x30, 0xdd, 0x2a, 0x6b, 0x44, 0xe8, 0x33, 0xca, 0x1a, 0xdc, 0x71, 0x4e, - 0x5c, 0x5a, 0x05, 0x4c, 0x38, 0x63, 0x51, 0x9f, 0x9a, 0x80, 0xce, 0xaf, 0xd7, 0x6e, 0x3c, 0xab, 0xb9, 0xdf, 0x68, 0xe6, 0x70, 0x30, 0x7a, 0x07, 0x2f, 0x1b, 0x97, 0xb5, 0x62, 0xb4, 0x79, 0x1f, - 0xc8, 0x8d, 0x02, 0xa9, 0xbc, 0xfa, 0xbd, 0xae, 0x76, 0xbb, 0x69, 0x32, 0x1e, 0xa5, 0x3b, 0xed, 0xfb, 0x53, 0x9f, 0x91, 0x56, 0xce, 0xa2, 0x5f, 0xd7, 0xcd, 0xe6, 0x38, 0x18, 0xca, 0x6f, 0xca, - 0x41, 0xe3, 0xbd, 0x03, 0xcd, 0x37, 0x07, 0xf3, 0xd4, 0x15, 0x7b, 0x82, 0x27, 0x2e, 0x17, 0x6a, 0x4f, 0x14, 0x9b, 0x8c, 0x47, 0x4f, 0x6b, 0x9c, 0x8c, 0x47, 0x17, 0xfe, 0x61, 0x89, 0x06, 0x83, - 0xa6, 0x43, 0x85, 0x32, 0x36, 0x7a, 0x7f, 0xf6, 0xfe, 0x6c, 0x40, 0x98, 0xd3, 0x02, 0xfa, 0x35, 0xbc, 0xf8, 0x31, 0x19, 0x8f, 0x7e, 0xc2, 0xd4, 0xcb, 0xe6, 0x13, 0x04, 0xd7, 0x4a, 0x5a, 0x94, - 0xb6, 0x9f, 0x6c, 0x2a, 0x8c, 0x68, 0x55, 0x09, 0xde, 0x16, 0x3c, 0x58, 0x1a, 0x25, 0x83, 0x3d, 0x0c, 0xfb, 0x71, 0x16, 0x9d, 0x1f, 0x1d, 0x3c, 0x34, 0x5a, 0x8e, 0x98, 0x50, 0x2e, 0xeb, 0x63, - 0xed, 0xa3, 0xe0, 0xf7, 0xe6, 0x39, 0x3f, 0x82, 0x35, 0x91, 0x33, 0xac, 0xc3, 0x55, 0x2b, 0xdd, 0xf0, 0x39, 0xd0, 0x43, 0x85, 0xac, 0x46, 0x6d, 0xfc, 0x43, 0x7f, 0x1e, 0x9e, 0x75, 0xb6, 0x0c, - 0x82, 0x1f, 0xd3, 0xa0, 0x44, 0x63, 0x68, 0x8e, 0xd3, 0x20, 0x82, 0x69, 0xf0, 0xe2, 0xd5, 0xba, 0x50, 0xb4, 0xe4, 0xaf, 0xa7, 0xc1, 0xcf, 0x69, 0x10, 0xec, 0x09, 0xf9, 0x94, 0x24, 0x5f, 0x38, - 0xfe, 0x2f, 0x4a, 0x9a, 0x27, 0xf8, 0x98, 0x92, 0x7f, 0xa4, 0xa3, 0x45, 0xb4, 0x4c, 0x6c, 0xbf, 0x4f, 0x93, 0xb0, 0x45, 0x9c, 0xaa, 0x7f, 0x17, 0xe1, 0xb8, 0xf4, 0xe6, 0xb8, 0x2b, 0xf9, 0x62, - 0x57, 0x6d, 0x53, 0xe7, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0x10, 0x26, 0x83, 0x33, 0x04, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0xca, 0xcc, 0x2b, 0xcb, 0xcf, 0x4e, 0xb5, - 0x52, 0x50, 0x4a, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6b, 0x93, 0x1a, 0xb7, - 0x96, 0xdf, 0xfb, 0x57, 0x9c, 0x34, 0xac, 0x01, 0x17, 0xdd, 0xd8, 0xbe, 0x75, 0x73, 0xb3, 0x33, 0x4b, 0x6a, 0x31, 0xc3, 0xd8, 0x38, 0xf3, 0x5a, 0x98, 0xf1, 0x38, 0x95, 0xc9, 0x4e, 0x89, 0x6e, - 0x01, 0xf2, 0x34, 0x52, 0x47, 0x52, 0x83, 0xb9, 0xb1, 0xff, 0xfb, 0xd6, 0x91, 0xd4, 0x2f, 0xc0, 0x8e, 0xb3, 0x1e, 0x4f, 0x2a, 0x65, 0x5a, 0x7d, 0x74, 0x74, 0xde, 0x2f, 0x75, 0xe3, 0x87, 0xde, - 0x8c, 0xf1, 0x9e, 0x5a, 0x7a, 0x0d, 0x08, 0x1e, 0xf1, 0xcf, 0x6b, 0xc0, 0x19, 0x8b, 0x28, 0x57, 0x34, 0x06, 0x2d, 0x40, 0x2f, 0x29, 0x0c, 0x52, 0x12, 0x2d, 0x29, 0x4c, 0xc5, 0x5c, 0x6f, 0x88, - 0xa4, 0x70, 0x2a, 0x32, 0x1e, 0x13, 0xcd, 0x04, 0x87, 0xf6, 0x60, 0x7a, 0xda, 0x81, 0x8c, 0xc7, 0x54, 0x82, 0xe0, 0xd4, 0x6b, 0x80, 0x90, 0xb0, 0x12, 0x92, 0x42, 0x24, 0xb8, 0x96, 0x6c, 0x96, - 0x69, 0x21, 0x21, 0xb1, 0x08, 0x81, 0x2c, 0x24, 0xa5, 0x2b, 0xca, 0xb5, 0x0a, 0x01, 0xa6, 0x94, 0x1a, 0xec, 0x17, 0x97, 0xd7, 0xe3, 0xe1, 0x08, 0xe6, 0x2c, 0xc1, 0xed, 0x31, 0x53, 0x76, 0x1b, - 0x8d, 0x61, 0xc3, 0xf4, 0x12, 0xf4, 0x92, 0x29, 0xd8, 0x08, 0xf9, 0x00, 0x73, 0x21, 0x81, 0xc4, 0x31, 0xc3, 0x83, 0x49, 0x02, 0x8c, 0xcf, 0x85, 0x5c, 0x19, 0x32, 0xbc, 0x06, 0x48, 0xba, 0x20, - 0x32, 0x66, 0x7c, 0x01, 0x91, 0x48, 0xb7, 0x92, 0x2d, 0x96, 0x1a, 0xc4, 0x86, 0x53, 0xa9, 0x96, 0x2c, 0x0d, 0x01, 0xae, 0x91, 0x8f, 0xe9, 0x69, 0x4e, 0x8a, 0xb2, 0x78, 0xdd, 0xa1, 0x5a, 0xc0, - 0x56, 0x64, 0x8e, 0x8d, 0x0a, 0xc7, 0x4e, 0x10, 0x5d, 0x78, 0x4b, 0xa5, 0x42, 0x76, 0x5f, 0x84, 0xcf, 0xa0, 0xad, 0x97, 0xb8, 0xc7, 0x77, 0x2f, 0xfd, 0xce, 0xb1, 0xd9, 0xbc, 0x22, 0x5b, 0xe0, - 0x42, 0x43, 0xa6, 0x68, 0x89, 0x1b, 0xe8, 0x87, 0x88, 0xa6, 0x1a, 0x18, 0x87, 0x48, 0xac, 0xd2, 0x84, 0x11, 0x1e, 0xe1, 0x66, 0xc7, 0x59, 0x71, 0x42, 0x08, 0xf0, 0xab, 0xc3, 0x21, 0x66, 0x9a, - 0x30, 0x0e, 0xc4, 0xf0, 0x01, 0x62, 0x5e, 0x05, 0x03, 0xa2, 0xbd, 0x86, 0xd7, 0x00, 0x00, 0x58, 0x6a, 0x9d, 0x1e, 0xf5, 0x7a, 0x9b, 0xcd, 0x26, 0x24, 0x86, 0xd8, 0x50, 0xc8, 0x45, 0x2f, 0xe7, - 0xae, 0x77, 0x36, 0x1e, 0x8e, 0x2e, 0xa6, 0xa3, 0xe0, 0x45, 0xf8, 0xcc, 0xec, 0xb8, 0xe1, 0x09, 0x55, 0x0a, 0x24, 0xfd, 0x23, 0x63, 0x92, 0xc6, 0x30, 0xdb, 0x02, 0x49, 0xd3, 0x84, 0x45, 0x64, - 0x96, 0x50, 0x48, 0xc8, 0x06, 0xf5, 0x66, 0xd4, 0x63, 0xb4, 0xce, 0x38, 0x6c, 0x24, 0xd3, 0x8c, 0x2f, 0xba, 0x5e, 0x03, 0x54, 0xae, 0xf8, 0xaa, 0x72, 0x4a, 0x61, 0xe5, 0xc4, 0x31, 0x55, 0x03, - 0x10, 0x1c, 0x08, 0x6a, 0xc6, 0x1f, 0x4c, 0x61, 0x3c, 0xf5, 0xe1, 0xe5, 0x60, 0x3a, 0x9e, 0x76, 0xe1, 0x76, 0x7c, 0xfd, 0xfa, 0xf2, 0xe6, 0x1a, 0x6e, 0x07, 0x93, 0xc9, 0xe0, 0xe2, 0x7a, 0x3c, - 0x9a, 0xc2, 0xe5, 0x04, 0x86, 0x97, 0x17, 0x27, 0xe3, 0xeb, 0xf1, 0xe5, 0xc5, 0x14, 0x2e, 0x4f, 0x61, 0x70, 0xf1, 0xab, 0xd7, 0x80, 0x5f, 0xc6, 0x17, 0x27, 0x5d, 0xa0, 0x4c, 0x2f, 0xa9, 0x04, - 0xfa, 0x21, 0x95, 0xc8, 0x81, 0x90, 0xc0, 0x50, 0x90, 0x34, 0xae, 0x98, 0x50, 0x4e, 0x01, 0x5a, 0x88, 0xd5, 0x8e, 0x4a, 0x69, 0xc4, 0xe6, 0x2c, 0x82, 0x84, 0xf0, 0x45, 0x46, 0x16, 0x14, 0x16, - 0x62, 0x4d, 0x25, 0x47, 0x03, 0x49, 0xa9, 0x5c, 0x31, 0x85, 0xfa, 0x54, 0x40, 0x78, 0x0c, 0x09, 0x5b, 0x31, 0x6d, 0xec, 0x48, 0x79, 0x8d, 0x7d, 0xbe, 0xc2, 0xc7, 0x76, 0xb0, 0xc7, 0xc6, 0xd7, - 0xc8, 0xcd, 0xf5, 0x9c, 0xac, 0x29, 0x87, 0x5b, 0x49, 0xd2, 0x94, 0x4a, 0x50, 0x9a, 0x48, 0x9d, 0xa5, 0x30, 0x23, 0x3a, 0x5a, 0x82, 0x8a, 0x24, 0x4b, 0x75, 0x17, 0xd6, 0xce, 0x92, 0xff, 0x11, - 0xe6, 0xa6, 0x31, 0xc9, 0x6d, 0x62, 0x74, 0xf1, 0x16, 0xd6, 0x44, 0xaa, 0xa3, 0x83, 0x04, 0x1a, 0xb3, 0x7b, 0x33, 0x78, 0x3b, 0xb8, 0x7f, 0x7d, 0x79, 0x3e, 0x82, 0x00, 0x12, 0x11, 0xd9, 0x18, - 0x20, 0xe6, 0x40, 0xe0, 0xcd, 0xc9, 0x2f, 0xb0, 0x14, 0x2b, 0xb4, 0x11, 0x69, 0xd0, 0x5e, 0xa6, 0xce, 0x4f, 0x73, 0xb4, 0x87, 0xb0, 0x1a, 0xa4, 0xe7, 0x83, 0xb7, 0xa3, 0x8b, 0xfb, 0xcb, 0xab, - 0xeb, 0x29, 0x04, 0x90, 0x12, 0x49, 0x56, 0x54, 0x53, 0xa9, 0x20, 0x25, 0xaa, 0x12, 0x84, 0xde, 0x90, 0x35, 0x81, 0xb7, 0xe7, 0xb0, 0x59, 0x52, 0x0e, 0x32, 0xe3, 0x46, 0x95, 0x86, 0x63, 0xeb, - 0x10, 0x40, 0xc3, 0x45, 0x88, 0xc0, 0x31, 0x9d, 0x65, 0xee, 0x0d, 0x30, 0xad, 0x68, 0x32, 0xef, 0xa2, 0x53, 0x3a, 0x28, 0x00, 0x45, 0x75, 0xe5, 0xc8, 0x7e, 0xf0, 0xce, 0x6e, 0x08, 0xde, 0xc9, - 0x8c, 0xbf, 0x8f, 0x37, 0xe9, 0x91, 0x96, 0x84, 0xab, 0x54, 0x48, 0xdd, 0x8f, 0xf5, 0xbd, 0x12, 0xd1, 0x03, 0xd5, 0x5d, 0x45, 0xe5, 0x9a, 0xca, 0xfe, 0xb6, 0xab, 0x32, 0x95, 0x52, 0x1e, 0xf7, - 0xb7, 0x5d, 0x12, 0xc7, 0x68, 0x91, 0xfd, 0x9f, 0x9e, 0x3d, 0x7b, 0x56, 0xe1, 0x63, 0xfa, 0xcb, 0xf8, 0xea, 0x7e, 0x32, 0x84, 0x00, 0xe6, 0x09, 0x59, 0x18, 0x82, 0x98, 0xb2, 0x5e, 0x26, 0x88, - 0x09, 0x50, 0x62, 0x0e, 0x2b, 0xa4, 0x4e, 0x46, 0x26, 0x46, 0x1c, 0x14, 0xcc, 0x37, 0xfc, 0x79, 0x1e, 0x9b, 0xc3, 0x6f, 0x10, 0xfc, 0x1b, 0xfc, 0x66, 0x8d, 0x24, 0x1f, 0x7e, 0x87, 0x63, 0x94, - 0x25, 0xf7, 0x3c, 0x00, 0x0b, 0x34, 0x87, 0x5e, 0xa6, 0x64, 0x0f, 0x75, 0x99, 0xf4, 0xa8, 0x8e, 0x7a, 0x39, 0x65, 0x05, 0x28, 0x8a, 0x2c, 0xfc, 0x0c, 0x94, 0x07, 0x30, 0x67, 0x35, 0x64, 0x5f, - 0x42, 0xf1, 0xa5, 0x8d, 0x7e, 0x13, 0xad, 0xaa, 0x17, 0xba, 0xf7, 0xfe, 0xee, 0xe6, 0xdd, 0xf7, 0x0e, 0x01, 0xfe, 0xdf, 0x80, 0xcb, 0x69, 0xe9, 0xef, 0x2a, 0x4b, 0x51, 0x75, 0x21, 0x40, 0x73, - 0x4d, 0x24, 0xdc, 0xaf, 0x32, 0xa5, 0xef, 0x61, 0x46, 0x8d, 0xda, 0xb5, 0xc8, 0xc3, 0x89, 0x96, 0x19, 0xc5, 0x58, 0x32, 0x27, 0x09, 0x7a, 0x78, 0xb4, 0x5d, 0x6c, 0x18, 0xef, 0x9b, 0xa7, 0x63, - 0x2f, 0x26, 0xb2, 0xf2, 0xb4, 0x62, 0x7c, 0xb1, 0xb1, 0x0f, 0x5e, 0x44, 0x14, 0x05, 0xbf, 0xd9, 0xce, 0x38, 0x59, 0xd1, 0x8e, 0x0f, 0x0c, 0xe9, 0x1b, 0xfe, 0xfa, 0xea, 0x76, 0x7c, 0xf1, 0xb4, - 0x03, 0x0e, 0x8b, 0xc1, 0x7d, 0x7c, 0xec, 0x01, 0x9c, 0x8f, 0x2f, 0x5e, 0xdd, 0x3e, 0xed, 0x80, 0x45, 0x81, 0xeb, 0x66, 0xf9, 0xc4, 0xe0, 0x7f, 0xda, 0x01, 0x77, 0x10, 0xbe, 0x30, 0x7c, 0x36, - 0xe0, 0x46, 0x51, 0x27, 0x6b, 0x36, 0xa3, 0x1f, 0x68, 0xd4, 0x7b, 0x4f, 0xd6, 0xe4, 0xde, 0x38, 0x16, 0x9b, 0x03, 0x59, 0x13, 0x96, 0xa0, 0x2d, 0x75, 0x41, 0x20, 0x1b, 0x1b, 0x86, 0x41, 0x8f, - 0x24, 0x09, 0xcc, 0x48, 0xf4, 0x80, 0xec, 0xf5, 0xce, 0xd8, 0x4c, 0x12, 0xb9, 0xed, 0xa1, 0xbb, 0xf4, 0x5e, 0x8b, 0x55, 0x8e, 0x18, 0x43, 0x25, 0xe6, 0x0c, 0x75, 0xd4, 0xeb, 0xc5, 0x74, 0x4d, - 0x13, 0x91, 0x52, 0x19, 0x62, 0x0e, 0xa0, 0x61, 0x24, 0x56, 0x78, 0x9e, 0xd9, 0xb7, 0x22, 0x51, 0xef, 0x0f, 0xd2, 0xfb, 0x83, 0x3c, 0x7f, 0xfe, 0xaf, 0x67, 0xbd, 0x7b, 0xc6, 0x63, 0xfa, 0x21, - 0x5c, 0xea, 0x55, 0x62, 0xf0, 0x94, 0x96, 0x55, 0x44, 0x02, 0x1f, 0x7e, 0xaf, 0x68, 0x2a, 0x07, 0xf9, 0x00, 0xfe, 0x61, 0x36, 0x76, 0xc1, 0x2b, 0x31, 0xa5, 0xef, 0x37, 0xdb, 0x87, 0x37, 0x75, - 0xfc, 0x63, 0x4c, 0x00, 0x42, 0xea, 0x12, 0xda, 0xed, 0xa7, 0xa8, 0x96, 0x03, 0xa8, 0xf6, 0x05, 0xf1, 0x79, 0x1c, 0x73, 0xe6, 0x55, 0xfe, 0x39, 0x3e, 0xf6, 0xa8, 0x22, 0x51, 0xd5, 0x8d, 0xaa, - 0xcc, 0x96, 0x76, 0x69, 0xdf, 0x4b, 0x6b, 0xd8, 0x0b, 0xca, 0xb5, 0x10, 0x81, 0xa4, 0x09, 0x45, 0x1b, 0xa9, 0x99, 0x6f, 0x49, 0x56, 0xb3, 0x8d, 0x3c, 0x05, 0x91, 0xe0, 0x73, 0xb6, 0x80, 0x20, - 0x78, 0x2f, 0x69, 0x60, 0x18, 0xb4, 0xf6, 0x6c, 0xcd, 0xf9, 0x54, 0x48, 0x18, 0x1a, 0x53, 0xea, 0x02, 0xe5, 0x2a, 0x93, 0x14, 0x52, 0xa2, 0x97, 0x0a, 0x30, 0x05, 0x33, 0x0e, 0x37, 0x17, 0xe3, - 0x77, 0x60, 0x6b, 0x1f, 0x98, 0xd1, 0x39, 0x16, 0x5b, 0x84, 0x6f, 0xf5, 0x12, 0x63, 0x0b, 0x53, 0xa0, 0x45, 0x16, 0x2d, 0x69, 0x8c, 0xe4, 0x37, 0xad, 0x45, 0x96, 0xb4, 0xfc, 0x06, 0x01, 0xdf, - 0xe5, 0xe7, 0xc9, 0x93, 0x3d, 0x22, 0xa3, 0xed, 0x02, 0x4f, 0x84, 0x20, 0xc8, 0x38, 0xfb, 0x50, 0xdb, 0xd0, 0x29, 0xb1, 0x0c, 0xcf, 0x06, 0xd3, 0xe9, 0xd5, 0xe0, 0xfa, 0x75, 0x05, 0x4b, 0xb1, - 0x56, 0xc3, 0x52, 0x47, 0x56, 0xee, 0xeb, 0x54, 0x38, 0x3e, 0x47, 0x1f, 0xf9, 0x66, 0x86, 0x8d, 0xa7, 0xfd, 0x15, 0xbf, 0xb8, 0x1c, 0xff, 0xa5, 0x18, 0xfc, 0x66, 0x3b, 0xda, 0x81, 0xfa, 0xf8, - 0x11, 0xda, 0x34, 0x5a, 0x0a, 0xf0, 0x23, 0xc2, 0xb1, 0xd8, 0x8b, 0x62, 0x60, 0x5c, 0x0b, 0x28, 0x81, 0x42, 0x63, 0x66, 0x4c, 0xc3, 0xf3, 0xce, 0x31, 0xa4, 0x9b, 0xb8, 0xe3, 0x1b, 0x1e, 0xff, - 0xc2, 0x71, 0xd0, 0x2a, 0x46, 0x1f, 0x68, 0x94, 0x69, 0xf4, 0x6e, 0x3c, 0x7a, 0xb3, 0x64, 0xd1, 0xd2, 0xac, 0x47, 0x1d, 0xbf, 0x30, 0x36, 0x64, 0xa6, 0x0e, 0xeb, 0x38, 0xfa, 0x01, 0x7e, 0xc3, - 0xb8, 0x84, 0x55, 0x12, 0xf8, 0x77, 0xbb, 0x40, 0x77, 0xbe, 0x0f, 0x47, 0xd0, 0xba, 0x6b, 0xff, 0xf6, 0xbf, 0xf0, 0xfb, 0xd3, 0xbb, 0x4e, 0xab, 0xe3, 0x43, 0x1f, 0x7c, 0x2e, 0xea, 0xde, 0x88, - 0x55, 0x34, 0x89, 0x13, 0xc6, 0x1f, 0xda, 0xcf, 0x3b, 0x28, 0x59, 0x64, 0xb1, 0x88, 0x39, 0x40, 0x14, 0xd6, 0x14, 0x3c, 0x26, 0xd2, 0x14, 0x77, 0x53, 0x91, 0x10, 0xc9, 0x14, 0x3c, 0x7f, 0x16, - 0x9a, 0xdd, 0xb8, 0xf7, 0x8c, 0xf1, 0x87, 0x7e, 0x4e, 0x7c, 0x8e, 0xac, 0x53, 0x86, 0x8e, 0x1f, 0x4a, 0x22, 0x9b, 0x39, 0xfc, 0x57, 0x91, 0x66, 0xf6, 0x37, 0x6d, 0xbc, 0x84, 0x9d, 0x00, 0x82, - 0xbc, 0xa2, 0x83, 0xa3, 0xd8, 0x62, 0x26, 0x31, 0x34, 0x1f, 0x96, 0x81, 0x11, 0x64, 0xb9, 0xa7, 0x2e, 0x70, 0xd4, 0xb5, 0xdb, 0x84, 0xc8, 0x50, 0x64, 0x4f, 0x9e, 0xa0, 0x06, 0x21, 0xb8, 0xea, - 0x98, 0x50, 0x14, 0xf9, 0x87, 0x62, 0xce, 0x3e, 0xa6, 0x9c, 0x6f, 0x93, 0xd7, 0xbe, 0x48, 0x87, 0x8b, 0x38, 0xff, 0x1f, 0x16, 0x8a, 0x1d, 0x85, 0x3c, 0xf3, 0x15, 0x27, 0xcf, 0xf0, 0xe9, 0x5d, - 0x07, 0x3b, 0xc4, 0x56, 0xc7, 0xed, 0xa8, 0x5a, 0x76, 0x01, 0x9b, 0x73, 0x74, 0x28, 0x30, 0x1a, 0xea, 0x5c, 0x54, 0xaa, 0xdb, 0xef, 0xf0, 0xfc, 0xe4, 0x40, 0x24, 0xdc, 0xf1, 0xb4, 0x7a, 0x0c, - 0x2c, 0xd2, 0x42, 0x09, 0xd2, 0x7b, 0x2f, 0x69, 0x4f, 0x2d, 0x8d, 0x6c, 0x77, 0x12, 0x3e, 0xda, 0xe2, 0xf8, 0xe5, 0x79, 0x4b, 0x99, 0xba, 0x52, 0x70, 0x18, 0x8c, 0xdf, 0x61, 0x11, 0x87, 0x16, - 0x28, 0x09, 0x5f, 0xd0, 0xa2, 0xfa, 0x54, 0x79, 0xd1, 0x0f, 0xb4, 0x90, 0x93, 0xaa, 0x70, 0x3c, 0x3c, 0x3f, 0xe9, 0x7f, 0xee, 0x4c, 0x6f, 0x47, 0x99, 0x87, 0xe0, 0xb1, 0xc7, 0x2e, 0x81, 0x8d, - 0x48, 0x8a, 0x1d, 0x25, 0x7c, 0xfb, 0x2e, 0xe3, 0x58, 0x60, 0x04, 0x73, 0xec, 0xf3, 0x56, 0xd8, 0x55, 0xbc, 0xf8, 0x19, 0xf3, 0x6c, 0x8f, 0x67, 0x49, 0x72, 0x0c, 0x77, 0xf9, 0x6a, 0xb0, 0x36, - 0x9a, 0xeb, 0xf8, 0x3b, 0xa2, 0xfd, 0xa1, 0x94, 0xcd, 0xae, 0x70, 0x6d, 0xc0, 0x19, 0x49, 0x29, 0xe4, 0x51, 0xa5, 0x00, 0x77, 0xee, 0x19, 0xd3, 0x39, 0xe3, 0x34, 0x86, 0x48, 0x48, 0x49, 0x23, - 0x9d, 0x6c, 0x43, 0x1f, 0x7e, 0x7e, 0xf2, 0xa2, 0xd8, 0x07, 0x70, 0x4b, 0xc1, 0x45, 0x2b, 0x2b, 0x21, 0x0a, 0xe5, 0x31, 0x0e, 0xd2, 0xc4, 0xab, 0x2f, 0xc4, 0xa9, 0x5d, 0x62, 0x6e, 0x89, 0xe9, - 0xa4, 0xaa, 0xe4, 0x50, 0xbe, 0x66, 0x52, 0x70, 0x6c, 0xee, 0xb1, 0xda, 0x67, 0x26, 0x62, 0x38, 0x1a, 0x15, 0xd5, 0xa1, 0xef, 0x42, 0xbd, 0x96, 0x04, 0x5b, 0x10, 0x8a, 0xbd, 0x22, 0x12, 0x2c, - 0xe4, 0x16, 0x75, 0x9a, 0x45, 0x1a, 0xc3, 0xfe, 0x5c, 0x8a, 0x15, 0xa4, 0x52, 0x44, 0xd8, 0xea, 0x99, 0xa6, 0xbf, 0x84, 0xd2, 0xc2, 0x96, 0xcb, 0x5b, 0xa5, 0xe9, 0x0a, 0xa4, 0x10, 0xda, 0x6b, - 0xc0, 0x9c, 0x49, 0xa5, 0x2b, 0x40, 0xa6, 0xb1, 0x0e, 0x57, 0x6b, 0x0e, 0x2a, 0x9b, 0x95, 0xcb, 0x4c, 0x41, 0x24, 0xb8, 0x62, 0x31, 0xc5, 0x46, 0x27, 0x95, 0xe2, 0x3d, 0x8d, 0x34, 0xcc, 0x30, - 0x53, 0x17, 0x40, 0xde, 0x9c, 0xf1, 0xf8, 0xde, 0x14, 0x98, 0xf7, 0xf8, 0x26, 0x66, 0xb2, 0xdd, 0x81, 0x3f, 0xbd, 0x6a, 0xd5, 0xf3, 0xdc, 0x87, 0xdf, 0x3d, 0x28, 0xed, 0xd4, 0x8a, 0xe3, 0x0a, - 0xd3, 0x9b, 0x61, 0xd4, 0x56, 0xa1, 0xb6, 0x69, 0xd9, 0x47, 0xe7, 0xbb, 0x38, 0xa9, 0x33, 0xc9, 0xe1, 0x79, 0x51, 0x03, 0xbb, 0xb7, 0x7d, 0x44, 0xef, 0x01, 0x6c, 0xaa, 0xbf, 0x97, 0x2c, 0xa1, - 0x26, 0xb4, 0xe3, 0xaa, 0x0f, 0x3f, 0xf4, 0xa1, 0xd5, 0x6b, 0x19, 0x85, 0xc4, 0xa2, 0xe2, 0x57, 0x71, 0x0e, 0xd1, 0x33, 0xbc, 0xef, 0xf8, 0x52, 0x7e, 0x80, 0x01, 0xc9, 0xd7, 0x24, 0x25, 0x0f, - 0xd5, 0xb2, 0xa7, 0x61, 0xe4, 0x4d, 0xa4, 0xc8, 0x78, 0x6c, 0x7c, 0xea, 0xcd, 0xcb, 0xd1, 0xe0, 0x2a, 0xf8, 0xe9, 0x3f, 0xff, 0xf1, 0x2f, 0x68, 0xd7, 0xc2, 0x7d, 0x6f, 0x9a, 0x12, 0x19, 0x75, - 0x76, 0x8e, 0xff, 0x13, 0x91, 0x7f, 0xda, 0x8d, 0xda, 0x86, 0x19, 0x97, 0x48, 0xf1, 0x77, 0x2f, 0x0c, 0x4d, 0x1a, 0xb5, 0x26, 0x67, 0x33, 0x64, 0x9d, 0x0a, 0xca, 0x63, 0xec, 0x90, 0x4a, 0x62, - 0x3c, 0x80, 0x58, 0x70, 0xf4, 0xb8, 0x54, 0x32, 0xae, 0xe7, 0xd0, 0xfa, 0x0f, 0xd5, 0x82, 0x3c, 0x3b, 0xe7, 0xa2, 0xdd, 0x45, 0xea, 0x7b, 0x9f, 0xd0, 0xdc, 0x22, 0xc1, 0x23, 0xa2, 0x29, 0x27, - 0x9a, 0x2a, 0xc0, 0x42, 0x39, 0x61, 0x9c, 0x2a, 0xdb, 0xb2, 0x9a, 0xe1, 0x8f, 0x05, 0xb8, 0x37, 0xcb, 0x35, 0x75, 0xcf, 0x9d, 0xba, 0x6b, 0xf9, 0x71, 0x42, 0x57, 0x62, 0x4d, 0xe1, 0x4e, 0x9a, - 0x89, 0x0e, 0x9a, 0xcf, 0x86, 0x62, 0x33, 0x8a, 0x21, 0xea, 0x96, 0xf1, 0x58, 0x6c, 0x94, 0x31, 0x41, 0xc6, 0xe1, 0x15, 0xd3, 0xf0, 0x92, 0xa8, 0xa5, 0xdb, 0x89, 0xce, 0x1f, 0x2d, 0x69, 0xf4, - 0x00, 0x22, 0xd3, 0x26, 0x5e, 0x49, 0x9a, 0x0a, 0xc5, 0x4a, 0xab, 0x25, 0x99, 0x16, 0x30, 0x9c, 0x9c, 0x9d, 0xc2, 0x8a, 0x70, 0xb2, 0x30, 0x73, 0xb2, 0x42, 0x26, 0xe8, 0x4e, 0x71, 0x08, 0x97, - 0x79, 0xd5, 0xdf, 0xc5, 0x83, 0x57, 0x64, 0x6b, 0x92, 0xac, 0x63, 0x4a, 0x2f, 0x89, 0x36, 0x25, 0x53, 0x4c, 0xcd, 0x48, 0xc3, 0x4d, 0xd0, 0x1c, 0x8e, 0x3b, 0x79, 0xc7, 0x0d, 0x15, 0xa9, 0x14, - 0x71, 0x16, 0x51, 0x68, 0xb6, 0x82, 0x77, 0x44, 0x2e, 0xee, 0x64, 0x0b, 0x24, 0xb1, 0x4d, 0xd1, 0x92, 0x70, 0x30, 0x8b, 0x10, 0x67, 0x14, 0x6d, 0x78, 0x23, 0x64, 0xec, 0xf6, 0xab, 0x34, 0x61, - 0x5a, 0x63, 0xc9, 0x25, 0xb3, 0x84, 0x2a, 0x9b, 0xf3, 0xb5, 0x84, 0x40, 0x41, 0x0b, 0x71, 0xb7, 0x00, 0xff, 0xfb, 0x2f, 0x70, 0x96, 0x3b, 0x67, 0xa8, 0x80, 0x44, 0x2c, 0xaa, 0x42, 0xf5, 0x9b, - 0xe7, 0x6f, 0x2f, 0x6e, 0xef, 0xdf, 0x8e, 0x26, 0x2f, 0x2f, 0xa7, 0x23, 0x4c, 0xf4, 0xa6, 0x57, 0xaa, 0xca, 0xb8, 0xd4, 0x31, 0xa2, 0xac, 0x21, 0x7b, 0x39, 0x98, 0x8e, 0xee, 0x4f, 0xc6, 0x93, - 0x7e, 0xb3, 0xbd, 0xef, 0x5b, 0x50, 0xcd, 0x9c, 0xcd, 0x67, 0x7e, 0xc7, 0xef, 0x54, 0x82, 0x59, 0xbe, 0xb5, 0xaa, 0x4f, 0x67, 0x2d, 0x26, 0x2e, 0xd9, 0x3e, 0xf9, 0x6a, 0x72, 0xf9, 0x66, 0x34, - 0xbc, 0x46, 0x60, 0x73, 0xcc, 0x9f, 0x76, 0xd9, 0x3d, 0x1f, 0x05, 0x15, 0x3c, 0x9f, 0x8a, 0x66, 0xe2, 0xd0, 0x56, 0xe4, 0xbb, 0xe8, 0xbe, 0xeb, 0xaf, 0x7c, 0xcf, 0x6b, 0x7c, 0xb7, 0x3f, 0xaf, - 0x01, 0xa3, 0x0f, 0x9a, 0x72, 0x33, 0xe1, 0xd1, 0x02, 0x0d, 0x5e, 0x6c, 0x8c, 0x61, 0xad, 0x88, 0x66, 0x11, 0x49, 0x92, 0x2d, 0xc4, 0x62, 0xc3, 0xf3, 0x49, 0x04, 0x9a, 0xa1, 0x91, 0x62, 0xb0, - 0xb1, 0x43, 0xa3, 0xf0, 0x3d, 0x91, 0x36, 0x08, 0x9b, 0xf9, 0x49, 0x10, 0x51, 0xae, 0x25, 0x49, 0xbc, 0x06, 0x5c, 0x2f, 0x99, 0xb2, 0xf8, 0x14, 0x64, 0xaa, 0xb6, 0x19, 0xdc, 0x66, 0xf4, 0x09, - 0x17, 0x5a, 0x9d, 0x31, 0xa6, 0x52, 0x2c, 0xd9, 0x8c, 0x69, 0x6b, 0xf9, 0xa6, 0x5c, 0xe7, 0x30, 0x63, 0x9c, 0xc8, 0x2d, 0xc4, 0x44, 0x93, 0xf0, 0x7b, 0xca, 0xc2, 0x51, 0xf5, 0x86, 0x48, 0x8c, - 0xcf, 0xfd, 0xc3, 0xea, 0x30, 0xf1, 0xb2, 0xe7, 0x40, 0x7b, 0x7b, 0xb2, 0xf0, 0xbd, 0xbc, 0xc9, 0xf3, 0x9b, 0x75, 0x7c, 0xf5, 0xc8, 0x60, 0xf4, 0x6d, 0xc6, 0xe2, 0xb0, 0x0b, 0xe7, 0x15, 0xe5, - 0x82, 0x01, 0x1a, 0x8a, 0x2c, 0x89, 0x79, 0x4b, 0x9b, 0xf4, 0xb0, 0x0b, 0xdc, 0xad, 0x69, 0x87, 0x69, 0x08, 0xc3, 0xd0, 0xf7, 0x2a, 0x81, 0x96, 0xe7, 0x2e, 0x34, 0x19, 0x5d, 0x5d, 0xde, 0x4c, - 0xce, 0xf6, 0xc2, 0xad, 0x45, 0x77, 0x23, 0x93, 0x7e, 0x1d, 0xb0, 0x27, 0xe4, 0xa2, 0x67, 0x07, 0xc5, 0x96, 0xcb, 0xc3, 0x3c, 0xf7, 0xcc, 0x58, 0xb0, 0xbe, 0x16, 0x98, 0x35, 0x2b, 0x0d, 0xa8, - 0x17, 0x4c, 0xd5, 0xe3, 0xf2, 0xe1, 0x02, 0x86, 0x35, 0x3b, 0xa6, 0xa9, 0x0e, 0xa6, 0xcd, 0xc2, 0x8b, 0x47, 0xa4, 0xc2, 0xe5, 0x0b, 0x9b, 0x20, 0xc7, 0xa7, 0xd3, 0xbe, 0xdf, 0xf7, 0x6d, 0x30, - 0x0c, 0x24, 0x3c, 0xd0, 0x2d, 0xac, 0x49, 0x92, 0xd1, 0x22, 0x4d, 0x56, 0x82, 0x77, 0x0b, 0x23, 0x9e, 0xb1, 0x71, 0x03, 0x52, 0xfa, 0x49, 0xa6, 0xc8, 0x82, 0x62, 0x24, 0xdf, 0xb8, 0x48, 0x4e, - 0x14, 0x62, 0x86, 0x58, 0x50, 0x5b, 0xc7, 0xe4, 0x25, 0x84, 0x45, 0x41, 0x14, 0x10, 0x50, 0x34, 0x25, 0x92, 0x68, 0x21, 0xa1, 0x5d, 0xbc, 0x56, 0xa0, 0x52, 0x12, 0xd1, 0x2e, 0x68, 0x32, 0xeb, - 0x02, 0xa7, 0x1b, 0x13, 0x9f, 0xa1, 0xdd, 0xba, 0xe3, 0xad, 0x4e, 0xd7, 0x66, 0x82, 0x4c, 0x69, 0xb1, 0x82, 0x56, 0xbf, 0x05, 0x79, 0x79, 0xae, 0xc8, 0x9c, 0xbe, 0x45, 0x82, 0xb0, 0xa2, 0x37, - 0x65, 0x45, 0xd3, 0xd0, 0xe7, 0xc3, 0x47, 0x13, 0x66, 0x63, 0x73, 0x6a, 0x0e, 0xed, 0x06, 0x51, 0x0f, 0x74, 0xeb, 0xa3, 0x4f, 0xb5, 0x4b, 0x4d, 0x74, 0xea, 0x46, 0x50, 0xa0, 0xf5, 0x8f, 0x6d, - 0xce, 0xb7, 0x93, 0x29, 0xa3, 0x48, 0x45, 0x22, 0xf3, 0x13, 0xd3, 0xab, 0x89, 0xdc, 0x7f, 0xd7, 0x43, 0x52, 0x29, 0x52, 0x2a, 0x35, 0xa3, 0xca, 0x2f, 0x2d, 0xfc, 0xa4, 0x62, 0xc2, 0x28, 0xe6, - 0xa3, 0xc2, 0xca, 0x6f, 0x64, 0x52, 0x5a, 0xb3, 0x9b, 0x4d, 0x1c, 0x32, 0xdf, 0xdc, 0x65, 0x0f, 0x8c, 0x10, 0x72, 0xd5, 0xec, 0xb9, 0x63, 0x51, 0x45, 0xe4, 0xf8, 0x2b, 0x15, 0xf7, 0x66, 0x41, - 0x35, 0xfc, 0x0c, 0x95, 0x7a, 0xbc, 0xd6, 0x3f, 0x56, 0x9c, 0xd7, 0x40, 0x86, 0x61, 0xe8, 0x42, 0x1c, 0x3e, 0x96, 0x3d, 0xe3, 0xe7, 0xf3, 0x17, 0x76, 0x8a, 0xff, 0x73, 0x33, 0x1e, 0x5d, 0xf7, - 0x7d, 0x53, 0x88, 0xb8, 0xdf, 0x41, 0xf0, 0x47, 0xc6, 0xaa, 0x18, 0x2a, 0x83, 0x59, 0xc4, 0x73, 0x33, 0x1d, 0x4d, 0x2e, 0x06, 0xb6, 0xc2, 0xfe, 0xf8, 0xb1, 0xf6, 0xea, 0x6a, 0x30, 0x9d, 0xde, - 0x5e, 0x4e, 0x4e, 0xf6, 0xc7, 0x65, 0x46, 0x4e, 0x48, 0x66, 0xd3, 0x9c, 0x52, 0x4a, 0x02, 0xa5, 0x0b, 0xc1, 0xe5, 0x81, 0x48, 0xf5, 0xf1, 0x23, 0xc8, 0x95, 0xad, 0x68, 0x76, 0x83, 0x53, 0x8e, - 0xb1, 0xd6, 0xd2, 0xee, 0x1e, 0x11, 0x04, 0xe8, 0xdc, 0x41, 0xa6, 0xa8, 0xec, 0xef, 0x91, 0xee, 0x5e, 0xa6, 0x44, 0x29, 0xac, 0x16, 0xfa, 0x7b, 0x0c, 0x3c, 0x0e, 0x81, 0xce, 0xdf, 0x69, 0x52, - 0x57, 0x6d, 0x94, 0xc9, 0xe4, 0xeb, 0x54, 0x6b, 0x20, 0x4b, 0xd5, 0xe2, 0xe3, 0x37, 0xa9, 0x56, 0xb1, 0x84, 0xf2, 0xef, 0xa0, 0x5b, 0x43, 0x67, 0x2e, 0x78, 0x71, 0x40, 0x58, 0x3b, 0xf2, 0x9c, - 0x43, 0x70, 0xf6, 0x35, 0x02, 0xdc, 0xd3, 0x70, 0xed, 0x20, 0xa3, 0xdc, 0x5d, 0xda, 0x8f, 0x76, 0xe9, 0x7d, 0x4c, 0x7a, 0x0a, 0x85, 0x56, 0xc8, 0xb2, 0xea, 0x22, 0x49, 0x82, 0x1a, 0xca, 0x47, - 0xda, 0x56, 0x5f, 0xe6, 0xfa, 0x47, 0x8b, 0x22, 0x41, 0xd6, 0x47, 0x39, 0x53, 0x91, 0xc9, 0x88, 0x7e, 0x55, 0x8e, 0x37, 0x85, 0x8d, 0xbb, 0x23, 0xcb, 0x43, 0x95, 0x49, 0xf6, 0x79, 0x8f, 0x9f, - 0xe3, 0x1c, 0x26, 0x44, 0xa9, 0x6f, 0x41, 0x19, 0x21, 0x82, 0x12, 0x67, 0x7d, 0xb0, 0xab, 0x36, 0x4c, 0x47, 0x4b, 0x37, 0xe7, 0xd4, 0xa2, 0xe8, 0x1e, 0xea, 0x63, 0xce, 0xfc, 0x9e, 0xcb, 0x8c, - 0x9f, 0xaa, 0xa6, 0x76, 0x28, 0x7a, 0xee, 0x08, 0xe3, 0x8b, 0xd1, 0xb3, 0x84, 0xf3, 0x3b, 0x3b, 0xdb, 0x2d, 0xdf, 0x7f, 0xb9, 0xdb, 0x80, 0x55, 0x36, 0x17, 0xb3, 0xac, 0xdc, 0x15, 0x68, 0xfd, - 0x98, 0x83, 0xc6, 0x9e, 0xcf, 0x3e, 0x68, 0x0d, 0xe9, 0x41, 0x50, 0xc8, 0xed, 0x03, 0x02, 0x18, 0x8a, 0x55, 0xca, 0x92, 0xe2, 0x02, 0xf0, 0xb0, 0x36, 0x6d, 0xf1, 0xb4, 0x8b, 0xa2, 0x7d, 0x68, - 0xb8, 0x13, 0xf9, 0x9f, 0x17, 0x49, 0x8d, 0x33, 0xd8, 0xe3, 0xee, 0x2b, 0x29, 0x9e, 0x54, 0x2f, 0x2c, 0xbf, 0x99, 0x5e, 0x1f, 0x82, 0x28, 0x85, 0xaa, 0x0d, 0x7e, 0x06, 0xf1, 0x8e, 0x73, 0xee, - 0x67, 0xcd, 0xaf, 0xf1, 0x54, 0xa8, 0xcb, 0xa0, 0xbc, 0x2d, 0x99, 0xb3, 0xef, 0x59, 0xbf, 0x37, 0x60, 0x64, 0x47, 0x01, 0x34, 0x6f, 0x69, 0xbe, 0xe7, 0x69, 0x5e, 0x03, 0xc6, 0xf3, 0x72, 0x80, - 0xd3, 0xc5, 0xe2, 0x90, 0xc5, 0x44, 0xdb, 0x0f, 0x0c, 0xa6, 0xaf, 0x07, 0xc1, 0x8b, 0x7f, 0xfe, 0x08, 0x2a, 0x5b, 0xe5, 0x9f, 0x64, 0x9c, 0xd7, 0x5a, 0x1f, 0xd3, 0x37, 0xb1, 0x84, 0xe6, 0x5d, - 0xc7, 0x74, 0x49, 0x5e, 0xfc, 0xf3, 0xc7, 0x69, 0xb6, 0xea, 0xfb, 0xbe, 0xf7, 0x75, 0x45, 0xea, 0x67, 0x4a, 0xba, 0x02, 0x53, 0x51, 0xd8, 0x95, 0xb8, 0x9b, 0x6e, 0x7f, 0xa5, 0xb0, 0x33, 0x45, - 0xdd, 0xa3, 0x14, 0x74, 0x65, 0xc7, 0xb1, 0x7b, 0x6e, 0xd5, 0xdc, 0x6b, 0xef, 0x26, 0x54, 0x65, 0x89, 0x76, 0x77, 0xa5, 0xbb, 0x55, 0x98, 0x32, 0x20, 0x28, 0xc1, 0xc3, 0xf9, 0x9a, 0xcd, 0xdd, - 0x38, 0x6d, 0xef, 0x3c, 0xd8, 0x6b, 0xaa, 0xe0, 0x63, 0x05, 0x5d, 0x10, 0x55, 0x31, 0xc2, 0x8b, 0x9f, 0x9f, 0x3c, 0x3f, 0x54, 0x55, 0xd6, 0x48, 0x2c, 0xae, 0x5c, 0xdd, 0x44, 0x77, 0x8f, 0xd4, - 0xc7, 0xa4, 0xd3, 0x10, 0x49, 0x00, 0x0d, 0xe8, 0x31, 0x68, 0x75, 0x09, 0xd3, 0x12, 0x31, 0xc4, 0xce, 0x1a, 0x0f, 0x70, 0xf6, 0x8a, 0x9d, 0xff, 0x86, 0xd8, 0x2f, 0x7d, 0xa8, 0xd2, 0x34, 0x86, - 0x59, 0xa6, 0x81, 0xbb, 0x6b, 0xef, 0x56, 0x21, 0xb5, 0x16, 0x08, 0xfb, 0x68, 0x7e, 0x13, 0x49, 0xcb, 0x8b, 0x1e, 0x17, 0x85, 0xdc, 0x6c, 0xd3, 0xde, 0x67, 0x32, 0xae, 0x34, 0x49, 0x92, 0xfc, - 0xfa, 0xdc, 0xc9, 0xaa, 0x8b, 0x48, 0xf2, 0xcf, 0x1b, 0x2a, 0x04, 0xcc, 0xb6, 0x20, 0xb1, 0xd9, 0xc2, 0x88, 0xd7, 0xda, 0x95, 0x92, 0x6b, 0xbe, 0xb6, 0x22, 0x93, 0xf0, 0x39, 0xeb, 0xcb, 0x49, - 0xb0, 0x83, 0x69, 0xc7, 0xb9, 0x31, 0xc8, 0xe6, 0x01, 0x09, 0x41, 0xdf, 0xde, 0xe3, 0xd7, 0xa2, 0x70, 0x6d, 0x6c, 0x7e, 0x4a, 0x58, 0x62, 0xa7, 0xb2, 0x85, 0x5b, 0xd7, 0xfd, 0xd7, 0x39, 0x78, - 0xd7, 0x92, 0x55, 0x7f, 0xb7, 0x32, 0x1f, 0x93, 0xcd, 0xa8, 0xf9, 0x84, 0x4b, 0x8a, 0x15, 0x53, 0x34, 0x2e, 0xa6, 0xec, 0xf9, 0x41, 0x63, 0xbe, 0xa6, 0x4a, 0xb3, 0x05, 0xa2, 0x46, 0xa1, 0xd0, - 0x84, 0x6a, 0xba, 0x6b, 0x0f, 0xa6, 0xd7, 0xd4, 0x9a, 0xae, 0x52, 0x0d, 0x04, 0xa2, 0x84, 0x12, 0x5e, 0x14, 0x34, 0xfb, 0x18, 0xe7, 0xf6, 0xa3, 0xb4, 0x14, 0xc9, 0x8d, 0xab, 0x84, 0xb9, 0x6f, - 0x78, 0x0c, 0xb1, 0xc0, 0xdd, 0x27, 0x5b, 0x16, 0xce, 0x84, 0xa6, 0x72, 0x0c, 0xbd, 0x67, 0xa1, 0x4e, 0xc4, 0xdb, 0xea, 0x69, 0x15, 0x21, 0x97, 0xb3, 0x30, 0xf3, 0x6d, 0x8c, 0xdf, 0x6c, 0x57, - 0xe7, 0xa3, 0x5f, 0x0c, 0x28, 0xef, 0xd7, 0xab, 0xd0, 0xde, 0x6b, 0xfb, 0x1d, 0x68, 0x96, 0x48, 0xfc, 0xdd, 0x2b, 0xed, 0xbf, 0x5f, 0xf9, 0x78, 0x07, 0x0a, 0x9e, 0xbf, 0x7d, 0x93, 0xbd, 0x57, - 0xc4, 0x3c, 0xce, 0x9d, 0x76, 0x89, 0xaf, 0x7a, 0xad, 0x5d, 0xe0, 0x3b, 0x38, 0x02, 0x2c, 0x51, 0x1f, 0x9e, 0x3b, 0x7e, 0xe9, 0x94, 0x83, 0x08, 0xf3, 0x7b, 0xf4, 0x2b, 0x29, 0xd6, 0x2c, 0xa6, - 0x40, 0xc0, 0xcf, 0x6f, 0x6a, 0xd9, 0xbf, 0x69, 0xec, 0xc3, 0x86, 0x98, 0xfb, 0x13, 0x49, 0xb5, 0x64, 0x74, 0x6d, 0xad, 0x64, 0x78, 0x36, 0x06, 0x22, 0x17, 0x6e, 0x54, 0xb7, 0x61, 0x49, 0xe2, - 0xd9, 0x3b, 0x00, 0x3b, 0x8e, 0x9e, 0x09, 0xbd, 0x2c, 0x74, 0x83, 0x71, 0x91, 0x0b, 0x1e, 0xe4, 0xcf, 0xf6, 0x26, 0x89, 0x09, 0xae, 0x42, 0x67, 0x2f, 0xc3, 0xf3, 0x93, 0xfb, 0xb3, 0xf1, 0xc5, - 0xe8, 0x7e, 0x30, 0x79, 0x35, 0x2d, 0xaa, 0xe6, 0xe1, 0xe5, 0xc5, 0xe9, 0xf8, 0x15, 0x34, 0x9f, 0xfa, 0x5e, 0x6d, 0x5c, 0x5a, 0x83, 0xf6, 0xbc, 0xdb, 0xc9, 0xe0, 0xea, 0x6a, 0x34, 0xb9, 0x3f, - 0x1b, 0xdc, 0x5c, 0x0c, 0x5f, 0x8f, 0x26, 0x7d, 0x21, 0x17, 0xf9, 0xf4, 0xc8, 0x8e, 0x92, 0xf2, 0x10, 0x51, 0x2d, 0x73, 0xce, 0x09, 0xe3, 0xc8, 0xb5, 0x5a, 0xd2, 0x24, 0xb1, 0xb3, 0x75, 0x17, - 0x8b, 0xfa, 0xd3, 0xe1, 0x8b, 0x67, 0x3f, 0xfd, 0x08, 0x0d, 0x33, 0x55, 0x31, 0x5c, 0x7a, 0x48, 0x72, 0xf5, 0x86, 0xed, 0xce, 0x83, 0xaa, 0x99, 0x56, 0x9f, 0x4f, 0x46, 0x2f, 0x6f, 0x5e, 0x95, - 0xab, 0x81, 0x29, 0xe4, 0x8d, 0x26, 0xfe, 0x7e, 0x46, 0x7d, 0x4f, 0xa4, 0x3d, 0xcb, 0x0f, 0x4e, 0x2c, 0x2b, 0xab, 0x2c, 0xd1, 0xec, 0x5c, 0xc4, 0x59, 0x42, 0xaf, 0xec, 0xb4, 0xf4, 0x24, 0xbf, - 0x82, 0x2a, 0x46, 0xce, 0x75, 0xfc, 0x9f, 0x1c, 0xb5, 0x7f, 0xee, 0xca, 0xe9, 0x13, 0xd4, 0xe5, 0xec, 0x37, 0xff, 0xdb, 0xf7, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x8b, - 0x2b, 0xc6, 0x07, 0x61, 0x0e, 0x00, 0x00, 0x19, 0x2c, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, - 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x59, 0x7d, 0x6f, 0xda, 0x48, 0xb7, 0xff, 0xfb, 0xf1, 0xa7, 0x38, 0x8f, 0xb5, 0xde, 0x24, 0x2b, 0x70, 0xda, 0x5c, 0xb5, 0xba, 0xa2, 0xf2, 0x55, 0x1d, 0x70, - 0x1a, 0xba, 0x09, 0x20, 0x4c, 0x92, 0xae, 0xb6, 0x7b, 0xd1, 0x60, 0x1f, 0x60, 0x1a, 0x7b, 0xc6, 0x3b, 0x33, 0x40, 0xb8, 0x57, 0xfb, 0xdd, 0x1f, 0xcd, 0x8b, 0xc1, 0xe4, 0xa5, 0xed, 0x4a, 0xbb, - 0xd2, 0xf6, 0x8f, 0x02, 0x33, 0xe7, 0xfd, 0xfc, 0xe6, 0xcc, 0x99, 0x93, 0xf7, 0xe3, 0xe4, 0x1a, 0xda, 0x7f, 0xe1, 0x3f, 0xcf, 0x48, 0xbc, 0xa2, 0x19, 0x32, 0x89, 0x39, 0x28, 0x0e, 0x6a, 0x89, - 0x10, 0x57, 0x24, 0x5b, 0x22, 0xa4, 0x7c, 0xae, 0x36, 0x44, 0x20, 0x5c, 0xf0, 0x15, 0xcb, 0x89, 0xa2, 0x9c, 0xc1, 0x71, 0x9c, 0x5e, 0x9c, 0xc0, 0x8a, 0xe5, 0x28, 0x80, 0x33, 0xb4, 0xfc, 0x5c, - 0x40, 0xc9, 0x05, 0x42, 0xc6, 0x99, 0x12, 0x74, 0xb6, 0x52, 0x5c, 0x40, 0x61, 0x65, 0x02, 0x59, 0x08, 0xc4, 0x12, 0x99, 0x92, 0x21, 0x40, 0x8a, 0x68, 0x14, 0x0c, 0x86, 0x93, 0x7e, 0x37, 0x81, - 0x39, 0x2d, 0x9c, 0x84, 0x9c, 0x4a, 0xcb, 0x89, 0x39, 0x6c, 0xa8, 0x5a, 0x82, 0x5a, 0x52, 0x09, 0x1b, 0x2e, 0xee, 0x61, 0xce, 0x05, 0x90, 0x3c, 0xa7, 0x5a, 0x3d, 0x29, 0x80, 0xb2, 0x39, 0x17, - 0xa5, 0x31, 0xc6, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x53, 0xb6, 0x80, 0x8c, 0x57, 0x5b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xc3, 0x50, 0xc8, 0x25, 0xad, 0x42, 0x80, 0x89, 0x76, 0x28, 0xbd, 0xa8, 0x0d, - 0x92, 0x56, 0xf4, 0x5e, 0xb5, 0xe2, 0xb0, 0xe5, 0x2b, 0xe7, 0x52, 0xc3, 0x7b, 0x17, 0x94, 0x16, 0xdc, 0xa2, 0x90, 0xda, 0xf5, 0xb3, 0xf0, 0x15, 0x1c, 0xab, 0xa5, 0x63, 0xf3, 0xdd, 0xbe, 0x7f, - 0xf2, 0xce, 0xf0, 0x97, 0x64, 0x0b, 0x8c, 0x2b, 0x58, 0x49, 0xdc, 0x6b, 0x00, 0x7c, 0xc8, 0xb0, 0x52, 0x40, 0x19, 0x64, 0xbc, 0xac, 0x0a, 0x4a, 0x58, 0xe6, 0xf8, 0x9d, 0x97, 0x3b, 0x3d, 0x21, - 0xc0, 0x2f, 0x4e, 0x0c, 0x9f, 0x29, 0x42, 0x19, 0x10, 0xe3, 0x10, 0xf0, 0x79, 0x93, 0x0c, 0x88, 0x32, 0xfc, 0x56, 0x08, 0x00, 0x2c, 0x95, 0xaa, 0x3a, 0xa7, 0xa7, 0x9b, 0xcd, 0x26, 0x24, 0xc6, - 0xf0, 0x90, 0x8b, 0xc5, 0x69, 0xed, 0xec, 0xe9, 0x55, 0xbf, 0x9b, 0x0c, 0xd2, 0xa4, 0x7d, 0x16, 0xbe, 0x6a, 0xf0, 0xdd, 0xb0, 0x02, 0xa5, 0x04, 0x81, 0xbf, 0xaf, 0xa8, 0xc0, 0x1c, 0x66, 0x5b, - 0x20, 0x55, 0x55, 0xd0, 0x8c, 0xcc, 0x0a, 0x84, 0x82, 0x6c, 0x74, 0x4a, 0x4d, 0xe6, 0x0c, 0x26, 0x28, 0x83, 0x8d, 0xa0, 0x8a, 0xb2, 0x45, 0xcb, 0xf2, 0xcb, 0x1a, 0x19, 0xcd, 0xbc, 0xed, 0x23, - 0x58, 0xdb, 0x4a, 0xe5, 0x01, 0x01, 0x67, 0x40, 0x5c, 0xd2, 0xfc, 0x38, 0x85, 0x7e, 0xea, 0xc3, 0x79, 0x9c, 0xf6, 0xd3, 0x16, 0xdc, 0xf5, 0x27, 0x97, 0xc3, 0x9b, 0x09, 0xdc, 0xc5, 0xe3, 0x71, - 0x3c, 0x98, 0xf4, 0x93, 0x14, 0x86, 0x63, 0xe8, 0x0e, 0x07, 0xbd, 0xfe, 0xa4, 0x3f, 0x1c, 0xa4, 0x30, 0xbc, 0x80, 0x78, 0xf0, 0x8b, 0xe5, 0xfd, 0xb9, 0x3f, 0xe8, 0xb5, 0x00, 0xa9, 0x5a, 0xa2, - 0x00, 0x7c, 0xa8, 0x84, 0x76, 0x85, 0x0b, 0xa0, 0x3a, 0xc0, 0x98, 0x37, 0x60, 0x56, 0xdb, 0xa1, 0x21, 0xb4, 0x4b, 0x9c, 0xac, 0x30, 0xa3, 0x73, 0x9a, 0x41, 0x41, 0xd8, 0x62, 0x45, 0x16, 0x08, - 0x0b, 0xbe, 0x46, 0xc1, 0x34, 0x82, 0x2a, 0x14, 0x25, 0x95, 0x3a, 0xdb, 0x12, 0x08, 0xcb, 0xa1, 0xa0, 0x25, 0x55, 0x06, 0x6b, 0xd2, 0x32, 0x3f, 0xf1, 0x31, 0xf4, 0xfe, 0xfa, 0x33, 0xf9, 0x37, - 0x88, 0x34, 0x12, 0x1d, 0xb0, 0xaf, 0xc9, 0x1a, 0x19, 0xdc, 0x09, 0x52, 0x55, 0x28, 0x40, 0x2a, 0x22, 0xd4, 0xaa, 0x82, 0x19, 0x51, 0xd9, 0x12, 0x64, 0x26, 0x68, 0xa5, 0x5a, 0xb0, 0x76, 0x98, - 0xff, 0xaf, 0xf0, 0x10, 0x38, 0xe3, 0x1a, 0x31, 0xc9, 0xe0, 0x16, 0xd6, 0x44, 0xc8, 0x8e, 0x5d, 0xff, 0x18, 0xdf, 0xc6, 0xd3, 0xcb, 0xe1, 0x75, 0x02, 0x6d, 0x28, 0x78, 0x66, 0x6b, 0x05, 0x9f, - 0x03, 0x81, 0x8f, 0xbd, 0x9f, 0x61, 0xc9, 0x4b, 0x0d, 0x15, 0xd1, 0x10, 0x34, 0xac, 0xdc, 0x79, 0xae, 0x05, 0xd9, 0xe5, 0xeb, 0xf8, 0x36, 0x19, 0x4c, 0xcf, 0xe3, 0x49, 0xf7, 0x72, 0x9a, 0x74, - 0x2f, 0x87, 0xd0, 0x06, 0x89, 0x4a, 0x63, 0xf0, 0x88, 0xb3, 0x23, 0xfd, 0x89, 0xcc, 0x60, 0x54, 0xa7, 0x00, 0xb3, 0x25, 0xd7, 0x59, 0x73, 0x27, 0xc4, 0x7a, 0x90, 0xf1, 0xb2, 0x24, 0x2c, 0x7f, - 0x46, 0xde, 0x28, 0xbe, 0x49, 0x93, 0xa7, 0x02, 0x37, 0x84, 0x2a, 0x5b, 0x64, 0xe0, 0x1e, 0xb7, 0x52, 0x09, 0x7e, 0x8f, 0x30, 0xc3, 0xb9, 0x2e, 0x68, 0xc8, 0x74, 0x61, 0x69, 0x8a, 0x1a, 0x8e, - 0x26, 0x29, 0xb4, 0xa1, 0x22, 0x82, 0x94, 0xa8, 0x50, 0x48, 0xa8, 0x88, 0x6c, 0x94, 0xce, 0x8f, 0x64, 0x4d, 0xe0, 0xf6, 0x1a, 0x36, 0x4b, 0x64, 0x20, 0x56, 0xcc, 0xc0, 0xca, 0x44, 0x7c, 0x77, - 0x62, 0x01, 0xc3, 0x45, 0xa8, 0xe9, 0x73, 0x9c, 0xad, 0xdc, 0x26, 0x50, 0x25, 0xb1, 0x98, 0xb7, 0x74, 0xf9, 0x70, 0x30, 0x45, 0xd5, 0x50, 0x19, 0xb5, 0x3f, 0x59, 0xea, 0xf6, 0x27, 0xb1, 0x62, - 0x5f, 0xf2, 0x4d, 0xd5, 0x51, 0x82, 0x30, 0x59, 0x71, 0xa1, 0xa2, 0x5c, 0x4d, 0x25, 0xcf, 0xee, 0x51, 0xb5, 0x24, 0x8a, 0x35, 0x8a, 0x68, 0xdb, 0x92, 0x2b, 0x59, 0x21, 0xcb, 0xa3, 0x6d, 0x8b, - 0xe4, 0xb9, 0x3e, 0x20, 0xd1, 0x7f, 0xbf, 0x7a, 0xf5, 0xaa, 0xe9, 0x48, 0xfa, 0x73, 0x7f, 0x34, 0x1d, 0x77, 0xa1, 0x0d, 0xf3, 0x82, 0x2c, 0x8c, 0x39, 0x54, 0xda, 0xe3, 0xcf, 0x49, 0xee, 0xc2, - 0x5a, 0x6a, 0xdb, 0x44, 0x66, 0x6a, 0x99, 0xfc, 0x1b, 0x60, 0x69, 0x45, 0x9e, 0xe3, 0x42, 0x97, 0xbb, 0xa2, 0x00, 0xfd, 0xab, 0xa0, 0x0c, 0xa5, 0x2d, 0x8f, 0x47, 0xef, 0x8f, 0x4c, 0xe9, 0x24, - 0x12, 0x9f, 0x22, 0x83, 0x4a, 0x93, 0x42, 0xef, 0xbd, 0x86, 0x01, 0xf0, 0xf9, 0x7c, 0x1f, 0x37, 0x45, 0x55, 0x81, 0xda, 0x7e, 0x07, 0x06, 0xd8, 0x50, 0x96, 0xf3, 0x8d, 0x67, 0xd7, 0x03, 0x17, - 0x07, 0x87, 0xa4, 0x1a, 0x45, 0xb3, 0xad, 0xe6, 0x55, 0x26, 0x5f, 0x8f, 0x75, 0x39, 0xb8, 0x78, 0xef, 0xe9, 0x1c, 0xfc, 0xe0, 0xf1, 0x76, 0xe0, 0x43, 0x14, 0x81, 0xcf, 0x99, 0x0f, 0x46, 0x1a, - 0x3c, 0xa5, 0xf0, 0xf6, 0xc6, 0x05, 0xfa, 0x98, 0x04, 0x06, 0xca, 0xbf, 0xaf, 0xe8, 0x9a, 0x14, 0xc8, 0x94, 0xb6, 0xf5, 0x07, 0xbd, 0xee, 0x19, 0x05, 0x86, 0xc2, 0x0a, 0xf5, 0xe1, 0x58, 0x33, - 0xf9, 0x7a, 0x29, 0x32, 0x1b, 0xbd, 0x71, 0xff, 0x36, 0x09, 0xcc, 0xd7, 0x51, 0x3c, 0xb9, 0x0c, 0xfc, 0x13, 0x27, 0x3c, 0x79, 0xc0, 0x6c, 0xa5, 0x10, 0x88, 0x06, 0x91, 0x80, 0x1c, 0xe7, 0x94, - 0x61, 0xee, 0x8e, 0x74, 0x8d, 0x68, 0x73, 0x35, 0xe9, 0x8b, 0x9b, 0xce, 0xcd, 0x75, 0x55, 0x7b, 0xe3, 0xe0, 0xb0, 0xd3, 0xba, 0xe0, 0x8a, 0x83, 0xbc, 0xa7, 0xd5, 0x38, 0x1b, 0x09, 0x07, 0xc9, - 0x6c, 0x89, 0x99, 0xbd, 0x8f, 0x2b, 0x81, 0xbb, 0x52, 0xc1, 0x59, 0x86, 0x36, 0x5d, 0x05, 0x2e, 0x48, 0xb6, 0x85, 0x70, 0x46, 0x94, 0x3b, 0x39, 0xa6, 0x88, 0xee, 0x09, 0xc2, 0xac, 0xcc, 0xeb, - 0x33, 0x45, 0xe7, 0x80, 0x0f, 0x54, 0x6a, 0x0b, 0x6e, 0xd2, 0x64, 0x3c, 0x1a, 0x0f, 0x2f, 0xfa, 0x57, 0x49, 0xf0, 0xd9, 0x41, 0x6e, 0x5a, 0x09, 0xd4, 0x82, 0x7c, 0xc8, 0x34, 0x30, 0xbe, 0x45, - 0x14, 0xfc, 0xf4, 0x5d, 0x02, 0xb3, 0x32, 0xff, 0xb6, 0x40, 0x43, 0x14, 0xfc, 0xe4, 0x75, 0xf6, 0xee, 0x7b, 0xef, 0x25, 0x2a, 0x5d, 0xd7, 0x0a, 0xcf, 0xd3, 0xe9, 0x48, 0xc6, 0xe3, 0xe1, 0x78, - 0xda, 0x1d, 0xf6, 0x92, 0xe8, 0x95, 0x8b, 0xfe, 0x84, 0x03, 0x95, 0xbc, 0x20, 0x0a, 0x81, 0x32, 0x85, 0x42, 0xd7, 0xb6, 0x35, 0x11, 0x54, 0x63, 0x4c, 0xc2, 0x5c, 0xf0, 0x12, 0x2a, 0x2e, 0x25, - 0xd5, 0x90, 0xab, 0xb8, 0x54, 0x2e, 0x7e, 0xb2, 0x05, 0x1b, 0x34, 0x4d, 0x03, 0x61, 0xdc, 0xdc, 0x68, 0x3b, 0x4d, 0x0d, 0x9d, 0x46, 0x43, 0x14, 0x45, 0x11, 0xa4, 0x93, 0x78, 0x3c, 0x81, 0xdb, - 0xf8, 0xaa, 0xdf, 0x8b, 0xf5, 0xd5, 0x68, 0x56, 0xf7, 0xc9, 0xdc, 0xd5, 0xe1, 0xc3, 0x44, 0x0e, 0xef, 0x3f, 0x5e, 0xf2, 0x12, 0x3d, 0x4f, 0xc3, 0x33, 0x34, 0xff, 0x43, 0x22, 0x04, 0x17, 0x9d, - 0x46, 0xe5, 0xd6, 0x12, 0xe6, 0xba, 0xd3, 0xd3, 0x67, 0x6e, 0xcb, 0x57, 0x02, 0x90, 0xad, 0xa9, 0xe0, 0x4c, 0x77, 0x6f, 0x21, 0xfc, 0xcf, 0x8f, 0x67, 0x96, 0x71, 0x54, 0xa0, 0x3e, 0x90, 0xe6, - 0xa0, 0xe9, 0x8a, 0xb7, 0x13, 0x50, 0xbb, 0xfb, 0x1c, 0xbf, 0xc6, 0x7b, 0x69, 0x0a, 0xb4, 0xe6, 0xd9, 0xc9, 0x6a, 0xde, 0x15, 0x86, 0xc5, 0xd4, 0x4f, 0xca, 0xa4, 0x22, 0x45, 0x61, 0x76, 0xf6, - 0x8a, 0x43, 0xcf, 0xf8, 0x82, 0xda, 0x6e, 0xcf, 0xeb, 0xd4, 0x3e, 0x35, 0xf2, 0xbe, 0xf7, 0xfe, 0xf3, 0x8c, 0xb2, 0xcf, 0x5f, 0xc8, 0x9a, 0x84, 0xf8, 0x80, 0x2e, 0x08, 0x94, 0x51, 0xf5, 0xf5, - 0x08, 0x50, 0x59, 0x5f, 0x0e, 0x84, 0x01, 0x65, 0x6b, 0x52, 0xd0, 0x5c, 0xdf, 0x5b, 0x98, 0x29, 0x2e, 0xb6, 0x8d, 0x10, 0xec, 0x59, 0xa2, 0x47, 0x41, 0xff, 0x87, 0x45, 0x69, 0x0f, 0x9c, 0x64, - 0xd0, 0x7b, 0x02, 0x1b, 0xaf, 0x63, 0x63, 0x62, 0xa8, 0x2e, 0x28, 0xcb, 0x8d, 0xda, 0x4a, 0xf0, 0x2f, 0x98, 0x29, 0x98, 0x69, 0xfb, 0x73, 0x2a, 0x5a, 0x40, 0x43, 0x0c, 0xcd, 0xd6, 0x2e, 0x16, - 0xa0, 0x96, 0x44, 0x99, 0x7e, 0x9f, 0x50, 0x26, 0xcd, 0xde, 0x9c, 0x17, 0xba, 0x37, 0xf2, 0xc3, 0x72, 0xcd, 0x7c, 0xd7, 0x16, 0x5d, 0x90, 0xa2, 0x98, 0x91, 0xec, 0x5e, 0xfb, 0x95, 0xad, 0x84, - 0xd0, 0x2e, 0xea, 0xa6, 0x5e, 0x97, 0x86, 0xbd, 0x2c, 0x87, 0x5e, 0x83, 0xbd, 0xd0, 0x1e, 0x30, 0x5b, 0x94, 0x46, 0xe3, 0xe1, 0xc7, 0xa4, 0x3b, 0x39, 0x8f, 0xd3, 0xa4, 0xd7, 0x1f, 0x47, 0xbb, - 0xb2, 0x6a, 0x7e, 0x06, 0x5e, 0xff, 0x42, 0x3f, 0x24, 0x76, 0x25, 0xec, 0x90, 0x3a, 0xf0, 0xa3, 0xa8, 0x86, 0x3f, 0xb2, 0xbc, 0x87, 0x0a, 0x33, 0x75, 0x4e, 0x24, 0xf6, 0xa8, 0x70, 0x87, 0xf8, - 0x53, 0xd2, 0x9d, 0x1a, 0xb9, 0xdd, 0x5e, 0x60, 0x56, 0xee, 0xcc, 0xaf, 0x7a, 0x3d, 0xf0, 0x3a, 0x73, 0xca, 0xf2, 0x9a, 0xa7, 0x7f, 0x01, 0xc9, 0xa7, 0x7e, 0xaa, 0xf5, 0xdd, 0x19, 0xf9, 0x9f, - 0xb5, 0xa7, 0x56, 0xc1, 0xcc, 0xd2, 0x98, 0x77, 0x92, 0x97, 0xe5, 0x10, 0x86, 0x9a, 0xbc, 0x26, 0x8c, 0x22, 0x5f, 0xab, 0xf0, 0x0f, 0x68, 0x07, 0x5c, 0x59, 0xf2, 0xbd, 0x62, 0x6d, 0x86, 0x21, - 0x69, 0xaa, 0xf5, 0x3a, 0x07, 0xc2, 0x5f, 0x0e, 0x8e, 0xd1, 0xa5, 0x95, 0xfb, 0x7b, 0x0f, 0x7c, 0xef, 0x05, 0xff, 0x3b, 0xcf, 0x59, 0xf1, 0xbc, 0xdc, 0x7d, 0x38, 0x1e, 0xcb, 0xf6, 0x3a, 0x4f, - 0x05, 0xbb, 0x9c, 0xd4, 0x91, 0x7a, 0x36, 0x33, 0x26, 0x70, 0x9f, 0xbf, 0xac, 0xcb, 0x30, 0xe3, 0x6c, 0x4e, 0x17, 0xfb, 0x2c, 0x8d, 0x91, 0xe4, 0xf1, 0xee, 0xad, 0xd7, 0x35, 0xbb, 0x8d, 0xe2, - 0x0b, 0x89, 0xb9, 0xb2, 0x93, 0x07, 0x85, 0xcc, 0x36, 0xe9, 0x76, 0xa1, 0x87, 0x05, 0xd9, 0x62, 0x9e, 0x3c, 0x54, 0xc4, 0xac, 0x7b, 0xfa, 0x8e, 0x3a, 0xbd, 0x00, 0x7f, 0x25, 0x51, 0xc3, 0xef, - 0x77, 0xc8, 0xb1, 0xa0, 0xa5, 0x8c, 0x7c, 0x08, 0x02, 0x7d, 0x70, 0xe0, 0xf8, 0x7b, 0x4d, 0x3b, 0x81, 0x9c, 0x9b, 0x43, 0xfc, 0xf1, 0xf6, 0x7a, 0xda, 0x1d, 0x0e, 0x2e, 0xfa, 0x1f, 0xa6, 0x3b, - 0xce, 0x51, 0x1a, 0xfd, 0xfb, 0xf9, 0xf5, 0x7f, 0x6b, 0x45, 0xde, 0x7b, 0x64, 0xb9, 0x35, 0xfc, 0xc7, 0xaf, 0xc9, 0x08, 0x9e, 0x5f, 0x0f, 0x6c, 0x80, 0x9f, 0x8f, 0x49, 0x9a, 0x4c, 0x5c, 0xbe, - 0x4c, 0x65, 0x49, 0x3e, 0x25, 0xd1, 0xcb, 0xf5, 0xcf, 0x62, 0x6c, 0x1c, 0x8f, 0x46, 0xc9, 0x78, 0xfa, 0x31, 0x1e, 0x47, 0x5f, 0xf5, 0x7e, 0x63, 0x5f, 0x06, 0xf6, 0x4e, 0x6c, 0xbb, 0x5f, 0xe1, - 0x17, 0x22, 0x0e, 0xe5, 0x5c, 0xc5, 0x37, 0x83, 0xee, 0x65, 0x32, 0x8e, 0xb8, 0x58, 0xd4, 0x4f, 0x4f, 0xc3, 0x12, 0xd6, 0x2c, 0xa6, 0xb3, 0x75, 0xef, 0x8c, 0x6b, 0x42, 0x99, 0x77, 0xc0, 0x7f, - 0x33, 0xbe, 0x8a, 0x7c, 0xfd, 0x7a, 0x95, 0x9d, 0xd3, 0x53, 0x81, 0x15, 0x77, 0xdc, 0x8d, 0x57, 0xac, 0x59, 0x38, 0x3b, 0xd5, 0x5f, 0xed, 0xaa, 0x5d, 0x39, 0x75, 0x0a, 0x4e, 0x0f, 0x2c, 0x3c, - 0x35, 0x6f, 0x95, 0xc3, 0xb5, 0xb6, 0x59, 0xb3, 0xb6, 0x7b, 0x17, 0xc3, 0xf1, 0x21, 0x28, 0x14, 0xbf, 0x47, 0x26, 0xa3, 0xd7, 0xad, 0xb3, 0x1a, 0x1f, 0x06, 0x20, 0x31, 0xf4, 0x07, 0xdf, 0x00, - 0xc8, 0xf3, 0x21, 0xaa, 0x04, 0xaf, 0x50, 0x28, 0x8a, 0xd2, 0x3f, 0x81, 0xde, 0x10, 0x8e, 0x3d, 0xdd, 0xed, 0x9b, 0x42, 0x10, 0xc4, 0xba, 0x0a, 0x38, 0xc2, 0x1b, 0x51, 0xf8, 0xa0, 0x13, 0xd8, - 0x0c, 0x45, 0x10, 0x9c, 0x7b, 0xfb, 0x4e, 0xce, 0x01, 0xdc, 0x5c, 0x45, 0x45, 0xc1, 0x37, 0x40, 0x56, 0x8a, 0x97, 0x44, 0x51, 0xdd, 0xbc, 0x6c, 0x21, 0xe7, 0x1b, 0x56, 0xb7, 0xe9, 0xba, 0xf6, - 0x3e, 0x49, 0x95, 0x6d, 0x38, 0x4c, 0x02, 0xda, 0x19, 0x32, 0x25, 0x74, 0x3f, 0x61, 0xda, 0x14, 0xdd, 0xff, 0x19, 0x91, 0x12, 0x56, 0xf2, 0x80, 0x1f, 0x1c, 0xbf, 0x3e, 0x1f, 0xee, 0x0e, 0x90, - 0xb6, 0xce, 0x57, 0x82, 0x2f, 0xe9, 0x8c, 0x2a, 0xdb, 0x01, 0x6a, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, 0x5b, 0xc8, 0x89, 0x22, 0xe1, 0xfe, 0x12, 0x0e, 0x1a, 0x30, 0x0b, 0x5c, 0x04, 0x6c, 0xd3, - 0x7c, 0x3b, 0xb8, 0x9b, 0xde, 0x26, 0xe3, 0xf3, 0x61, 0x5a, 0x37, 0x27, 0x4a, 0xac, 0xd0, 0x77, 0x34, 0xe6, 0x5d, 0xa4, 0xef, 0x3a, 0x53, 0x8e, 0x0e, 0xc5, 0x18, 0x82, 0x13, 0xef, 0x04, 0xb0, - 0x90, 0xb8, 0x97, 0xe9, 0xda, 0x57, 0x2d, 0x77, 0x9c, 0x8c, 0x86, 0x37, 0xe3, 0xab, 0x7d, 0xcf, 0xbc, 0x93, 0xf9, 0x38, 0xcc, 0x8f, 0x18, 0xfe, 0x22, 0x6c, 0x59, 0x03, 0xff, 0xb4, 0xaf, 0x5d, - 0xbe, 0x2a, 0x72, 0x76, 0xa4, 0x4c, 0xc1, 0x3f, 0xf4, 0xb9, 0x75, 0x90, 0x63, 0xaa, 0x20, 0x0c, 0xc3, 0x43, 0xe6, 0x5e, 0x63, 0x5f, 0x67, 0xbb, 0xb3, 0x17, 0xa0, 0x3d, 0x73, 0x36, 0x99, 0x8f, - 0x8a, 0x6f, 0x50, 0xc8, 0x25, 0x16, 0x05, 0xb4, 0xbb, 0xee, 0x49, 0xe4, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0x7a, 0xff, 0xfa, 0x97, 0xff, 0xc3, 0x06, 0x67, 0x59, 0x41, 0xf5, 0xd5, 0x1c, 0x01, 0xc3, - 0x4d, 0x9b, 0xcf, 0xcc, 0xf5, 0x9f, 0x6e, 0xa5, 0xc2, 0x32, 0x1c, 0xa0, 0x0a, 0xef, 0x70, 0xd6, 0x35, 0x14, 0xef, 0x2c, 0x0b, 0x9d, 0xc3, 0x71, 0x5b, 0x87, 0xff, 0xf8, 0x57, 0xa9, 0x04, 0x65, - 0x8b, 0xdf, 0x3a, 0x9d, 0xbe, 0x1c, 0xac, 0x8a, 0x62, 0x28, 0x92, 0xb2, 0x52, 0xdb, 0xe3, 0x23, 0x1b, 0x03, 0xdd, 0x63, 0x0f, 0xe2, 0xeb, 0x24, 0x38, 0x3a, 0x81, 0xb6, 0xd6, 0xfa, 0x0d, 0xfa, - 0x51, 0x9c, 0xa6, 0x77, 0xc3, 0x71, 0x2f, 0x38, 0x3a, 0x39, 0x39, 0x81, 0x27, 0x06, 0x86, 0x5d, 0x81, 0x39, 0x32, 0x45, 0x49, 0x21, 0x5f, 0x34, 0x76, 0x80, 0x4a, 0xb7, 0x18, 0x7b, 0xd2, 0xa7, - 0xc6, 0xb4, 0xe0, 0xa9, 0x3e, 0xe7, 0xda, 0x1f, 0xf6, 0xe3, 0x57, 0x2d, 0x29, 0x45, 0xb1, 0xa6, 0x19, 0x8e, 0x38, 0x65, 0xea, 0x9a, 0x30, 0xb2, 0x40, 0xf1, 0x5b, 0xa7, 0x93, 0x62, 0xb6, 0x12, - 0x54, 0x6d, 0x47, 0x82, 0x2b, 0x9e, 0xf1, 0x02, 0x22, 0x70, 0xd4, 0x87, 0xeb, 0x93, 0x6d, 0x85, 0xbf, 0x75, 0x3a, 0x93, 0x42, 0xbe, 0x3e, 0x7b, 0x07, 0x0d, 0x27, 0xea, 0xc4, 0x5d, 0xd0, 0x02, - 0x8f, 0x8f, 0x0e, 0x92, 0x66, 0x2c, 0x6b, 0xc2, 0xe0, 0xe8, 0xa4, 0x36, 0xeb, 0xcf, 0xa3, 0xeb, 0x82, 0x32, 0x2a, 0x97, 0x98, 0x1f, 0x20, 0xe9, 0xd9, 0x83, 0xe5, 0xaa, 0x8e, 0x7e, 0xab, 0xe9, - 0x73, 0xec, 0x8a, 0x8f, 0x2b, 0x46, 0xfd, 0x79, 0x3d, 0x32, 0xc3, 0xbc, 0x05, 0xa6, 0x27, 0xd6, 0x8f, 0x1c, 0x5d, 0x36, 0xd2, 0xcb, 0xb8, 0x7d, 0xf6, 0xe6, 0x2d, 0xc8, 0x55, 0x59, 0x0f, 0x61, - 0xae, 0x0f, 0x2a, 0x89, 0xa9, 0x44, 0xb4, 0x40, 0xaf, 0x79, 0x0c, 0xd3, 0xcb, 0x78, 0x7a, 0xf6, 0xe6, 0xed, 0x34, 0xbd, 0xb9, 0x8e, 0x7c, 0xff, 0x9f, 0x53, 0x96, 0xd3, 0x25, 0x39, 0x7b, 0xf3, - 0x36, 0x5d, 0x95, 0x87, 0xc5, 0xb9, 0x69, 0xae, 0x2d, 0xd2, 0xae, 0xc7, 0x09, 0x9e, 0xa1, 0x08, 0x4c, 0xd3, 0x79, 0xfc, 0x8d, 0x53, 0xe7, 0xb2, 0xe4, 0xff, 0xb0, 0x24, 0x72, 0x09, 0x11, 0x1c, - 0x7f, 0x40, 0xd5, 0xd6, 0x70, 0xb8, 0xd4, 0xbf, 0x3f, 0xfb, 0x07, 0x49, 0xfa, 0xec, 0x43, 0x3b, 0x2e, 0x16, 0x5c, 0x50, 0xb5, 0x2c, 0x75, 0xc8, 0xcf, 0xde, 0xbc, 0x3d, 0x09, 0x35, 0x65, 0x38, - 0xe1, 0x57, 0x5a, 0xc7, 0xb1, 0x01, 0x6f, 0x2d, 0xb4, 0x3f, 0x6f, 0x80, 0xaa, 0x69, 0xda, 0x11, 0xb4, 0x19, 0x82, 0xd1, 0x79, 0xd2, 0xb4, 0x02, 0xe0, 0x4e, 0x50, 0x85, 0xed, 0xe1, 0x4a, 0x55, - 0x2b, 0x05, 0x47, 0xee, 0x59, 0x74, 0x41, 0x68, 0x61, 0xe7, 0x5a, 0xbb, 0x9c, 0x1f, 0x26, 0xd7, 0x65, 0xbf, 0x65, 0x9f, 0x24, 0x87, 0x7b, 0xa5, 0x19, 0xc3, 0xcf, 0xd0, 0x8c, 0xbd, 0x05, 0x2f, - 0xa9, 0xc4, 0x3c, 0x3c, 0x7a, 0xf7, 0x15, 0xad, 0x7d, 0xb6, 0x46, 0xa9, 0xe8, 0x42, 0xeb, 0xe1, 0x42, 0x67, 0x1e, 0x15, 0x3e, 0xba, 0x4e, 0xf4, 0x6d, 0xa8, 0x14, 0x96, 0x95, 0x02, 0x02, 0x59, - 0x81, 0x84, 0xed, 0xb0, 0xfd, 0x0d, 0xe1, 0x73, 0x3b, 0xe3, 0xaf, 0xb4, 0x1b, 0x79, 0xd3, 0x60, 0x37, 0xe8, 0x34, 0x4e, 0x00, 0x73, 0xf3, 0x6e, 0x4b, 0x67, 0xf0, 0xbc, 0x83, 0x3e, 0x3c, 0x46, - 0x09, 0x38, 0x5c, 0x6d, 0x1f, 0xab, 0xc6, 0x07, 0xaa, 0xe0, 0x75, 0x73, 0xed, 0x8f, 0x83, 0xef, 0xf5, 0x49, 0x36, 0x43, 0x84, 0xab, 0xe4, 0x36, 0xb9, 0x82, 0xd7, 0xd0, 0x78, 0xb4, 0xd5, 0x5d, - 0xc0, 0x48, 0xf0, 0x35, 0xcd, 0x11, 0x08, 0xf8, 0x52, 0x11, 0x96, 0x13, 0x91, 0xd3, 0xff, 0xc3, 0xdc, 0x87, 0x0d, 0xd9, 0x6a, 0x2b, 0x05, 0x2a, 0x41, 0x71, 0x6d, 0xed, 0xec, 0x5e, 0xf5, 0x81, - 0x88, 0x85, 0xbb, 0xb0, 0x37, 0xb4, 0x70, 0xf7, 0xbd, 0xf9, 0x13, 0x8a, 0x19, 0xbe, 0xcc, 0xb8, 0x5a, 0xc2, 0x9d, 0x19, 0x84, 0xd9, 0xe1, 0x36, 0xe3, 0xac, 0x5d, 0xff, 0x46, 0x33, 0x3b, 0xd2, - 0x2d, 0x75, 0xd8, 0x78, 0x0a, 0x74, 0xaf, 0x7b, 0xd3, 0xab, 0xfe, 0x20, 0x99, 0xc6, 0xe3, 0x0f, 0x69, 0x14, 0xfc, 0xe4, 0x79, 0xc1, 0x61, 0xcf, 0x19, 0x80, 0x76, 0xec, 0xa5, 0xfe, 0xd5, 0x6e, - 0xee, 0x87, 0x98, 0x07, 0x0b, 0xbd, 0xe4, 0xfc, 0xe6, 0x43, 0x63, 0xb9, 0x9d, 0x15, 0x44, 0xca, 0x8a, 0xa8, 0xe5, 0xa3, 0xa4, 0xeb, 0x4d, 0xbf, 0xdd, 0xb3, 0xcd, 0x61, 0xb9, 0x2a, 0x14, 0xbd, - 0xe6, 0xf9, 0xaa, 0xc0, 0x91, 0x6d, 0x51, 0x7a, 0xf5, 0x33, 0x32, 0x7a, 0xe1, 0x19, 0x68, 0x95, 0x3e, 0xee, 0x5a, 0x83, 0xda, 0x0e, 0x6b, 0x77, 0xe0, 0x26, 0x48, 0x2f, 0xe5, 0xa4, 0x7e, 0xa0, - 0xe8, 0x96, 0xdc, 0x2c, 0x3c, 0x9a, 0x02, 0xbd, 0xb6, 0xbd, 0xfa, 0x93, 0x8e, 0xbf, 0x41, 0x12, 0xec, 0xbf, 0x07, 0xde, 0x8b, 0xe3, 0xb7, 0xfd, 0xa3, 0xd5, 0x4d, 0x9f, 0xb8, 0x54, 0x4f, 0xa6, - 0x6f, 0xfb, 0xf1, 0xd1, 0xdf, 0x37, 0x7e, 0xe3, 0x52, 0x7d, 0xc7, 0xfc, 0xad, 0xa6, 0xfa, 0x3e, 0x79, 0xdf, 0x1e, 0xbf, 0xd5, 0x54, 0xbb, 0xe1, 0x9b, 0x76, 0xdf, 0xfa, 0x5f, 0x11, 0xfb, 0xa7, - 0xb5, 0x7a, 0xf2, 0xa8, 0x8f, 0xd0, 0xd3, 0xf1, 0xfe, 0x7e, 0x84, 0x63, 0x06, 0xb6, 0x4f, 0xe6, 0xb5, 0x86, 0xca, 0x84, 0x99, 0x33, 0xdf, 0xca, 0xf4, 0x9a, 0x54, 0x93, 0x64, 0x7c, 0xdd, 0x1f, - 0xc4, 0x93, 0x44, 0x83, 0x7f, 0x47, 0x67, 0x8e, 0xf4, 0x61, 0x02, 0x75, 0x2c, 0x4f, 0xbb, 0x76, 0xe7, 0xf4, 0xfc, 0x70, 0xf3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x68, - 0x33, 0xee, 0xa3, 0xf6, 0x0a, 0x00, 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, - 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x57, 0x51, 0x6f, 0xdc, 0x28, 0x10, 0x7e, 0xdf, 0x5f, 0x61, 0x45, 0x79, 0x35, 0xec, 0x5e, 0xee, 0x74, 0x55, 0xc4, 0x51, 0xf5, 0xe1, 0xaa, 0x8b, 0x94, 0xb4, 0x91, - 0x92, 0xab, 0xee, 0x95, 0xe0, 0xb1, 0x97, 0xc4, 0x80, 0x0b, 0x78, 0xb3, 0xab, 0x68, 0xff, 0xfb, 0x09, 0xb0, 0xbd, 0xb6, 0xd7, 0x4e, 0xd2, 0x28, 0xed, 0x9b, 0x99, 0xf9, 0x18, 0x86, 0x6f, 0x3e, - 0xc3, 0x40, 0x3e, 0x6e, 0x65, 0x99, 0x6c, 0xc0, 0x58, 0xa1, 0xd5, 0x5f, 0x27, 0x2b, 0xb4, 0x3c, 0xf9, 0x48, 0x17, 0xa4, 0x32, 0xfa, 0x1e, 0xb8, 0x4b, 0xb6, 0x56, 0x9c, 0x5b, 0xbe, 0x06, 0xc9, - 0x2e, 0x35, 0x67, 0x2e, 0x60, 0xd6, 0xce, 0x55, 0xe7, 0x18, 0x4b, 0xb6, 0x01, 0x85, 0x58, 0xc5, 0xf8, 0x1a, 0x90, 0x36, 0x05, 0xbe, 0xfe, 0x7a, 0x85, 0x7f, 0x47, 0x4b, 0xb4, 0x4c, 0x3c, 0xc2, - 0x4e, 0x41, 0xb6, 0x36, 0x8b, 0xc6, 0x34, 0x00, 0xd1, 0xd6, 0x66, 0x27, 0xc9, 0x56, 0x96, 0xca, 0xbe, 0x22, 0xec, 0xc9, 0x22, 0x49, 0x92, 0x88, 0x3e, 0xdf, 0x5a, 0xd1, 0xcd, 0x78, 0x7c, 0x7c, - 0x44, 0x8f, 0x67, 0x01, 0xfb, 0xdb, 0x72, 0xb9, 0xc2, 0xff, 0x5d, 0x5d, 0xde, 0x84, 0x94, 0x53, 0xa1, 0xac, 0x63, 0x8a, 0xc3, 0x09, 0x5d, 0x24, 0x09, 0x91, 0x3a, 0x83, 0xf2, 0x5b, 0xdc, 0x29, - 0x0d, 0x11, 0x09, 0x1e, 0xd8, 0x3c, 0xa8, 0x30, 0xba, 0xae, 0x2e, 0x32, 0xaa, 0x4d, 0x81, 0x18, 0x97, 0x40, 0x70, 0x6b, 0xf1, 0x5e, 0x66, 0x9c, 0xc8, 0x19, 0x77, 0x17, 0x19, 0xcd, 0x6b, 0xc5, - 0x3d, 0x1f, 0x04, 0xf7, 0x8c, 0x1e, 0xd3, 0x70, 0x49, 0x57, 0x7e, 0x85, 0xf4, 0xe6, 0xcb, 0xa7, 0xeb, 0x9b, 0x7f, 0xbe, 0xde, 0x12, 0xbc, 0xe9, 0xad, 0x52, 0x19, 0x5d, 0x81, 0x71, 0x02, 0x2c, - 0x0d, 0x9b, 0x22, 0x5c, 0xcb, 0x4a, 0x94, 0x60, 0xd2, 0xaa, 0xac, 0x0b, 0xa1, 0x50, 0x0b, 0x3e, 0x43, 0x1f, 0xd0, 0x8a, 0xe0, 0x39, 0x77, 0x9c, 0x1c, 0x29, 0x6b, 0x31, 0xc8, 0x40, 0x09, 0xcc, - 0x02, 0x5d, 0xad, 0x08, 0x9e, 0x71, 0xc5, 0x79, 0x4d, 0x91, 0xd1, 0x5d, 0x2d, 0xca, 0x0c, 0x59, 0x5d, 0x1b, 0x0e, 0x7f, 0x2b, 0xae, 0x33, 0xa1, 0x0a, 0xfa, 0xef, 0xed, 0xe7, 0xf4, 0x03, 0xc1, - 0xcf, 0x62, 0x86, 0x61, 0x0c, 0x54, 0xda, 0x38, 0xa1, 0x0a, 0xa4, 0x6b, 0x57, 0xd5, 0x6e, 0x2e, 0xd4, 0x2c, 0x2e, 0x86, 0xfb, 0x5e, 0x33, 0xf3, 0x50, 0x5b, 0x54, 0x95, 0xcc, 0xe5, 0xda, 0x48, - 0xd4, 0xf2, 0x9b, 0x8a, 0x8c, 0x36, 0xce, 0xf4, 0x4e, 0x4b, 0x82, 0x9f, 0x45, 0xce, 0x04, 0x0b, 0xd5, 0xf4, 0x7e, 0xa1, 0xd1, 0xd8, 0x39, 0x11, 0xb1, 0x83, 0xcf, 0x84, 0x3b, 0xd4, 0x69, 0x89, - 0xce, 0xd0, 0x67, 0xa1, 0x58, 0x39, 0x11, 0x65, 0x58, 0x2e, 0xfb, 0x20, 0xaa, 0x8b, 0x5b, 0x4b, 0x9d, 0xa9, 0x81, 0xe0, 0x76, 0xd4, 0xf8, 0x6a, 0x03, 0xb9, 0x30, 0x70, 0xac, 0x03, 0x2f, 0xa6, - 0xab, 0x3f, 0x09, 0x9e, 0x43, 0x78, 0x59, 0xe1, 0xa1, 0xae, 0x48, 0x06, 0x15, 0xa8, 0x0c, 0x14, 0xdf, 0x5d, 0x31, 0xc5, 0x0a, 0x90, 0xa0, 0x5c, 0xb3, 0x50, 0xe7, 0xea, 0x34, 0x38, 0xc0, 0xb7, - 0xa6, 0xde, 0x1f, 0x71, 0xfa, 0x34, 0xcb, 0xce, 0x7e, 0xf0, 0x97, 0x34, 0xf3, 0x7a, 0xbf, 0xc5, 0xc4, 0xd4, 0x5e, 0xa9, 0xf6, 0xe3, 0x5f, 0xa8, 0x09, 0xd0, 0xee, 0x6c, 0x62, 0x76, 0xe3, 0xda, - 0x0f, 0xfe, 0xaa, 0x66, 0x9a, 0xdb, 0x55, 0x40, 0x2b, 0xaf, 0x8f, 0xf0, 0x75, 0x70, 0x58, 0xae, 0x2b, 0xa0, 0x42, 0x7a, 0xf5, 0x11, 0x1c, 0x47, 0xed, 0xce, 0xf1, 0x78, 0xeb, 0x3d, 0x4b, 0xcb, - 0x26, 0x9e, 0xa3, 0x73, 0x82, 0xcc, 0x09, 0x2a, 0x3b, 0x22, 0x0f, 0xca, 0x3b, 0xa2, 0xad, 0x4f, 0x5a, 0x2b, 0xf5, 0xbc, 0x56, 0xdf, 0x77, 0xe9, 0x83, 0x62, 0x4e, 0x6c, 0x20, 0x85, 0x0d, 0x28, - 0x67, 0x8f, 0x19, 0x9b, 0xd8, 0xc1, 0xfb, 0xa5, 0x60, 0x25, 0x2b, 0x4b, 0xb3, 0x83, 0x74, 0x0d, 0xac, 0x74, 0xeb, 0x5f, 0xbc, 0x3a, 0x33, 0xfc, 0x17, 0xaf, 0x78, 0x5f, 0x2b, 0xe1, 0xfe, 0x98, - 0x92, 0x65, 0x23, 0x22, 0x07, 0x76, 0x28, 0xa1, 0x1f, 0x4e, 0xc7, 0x80, 0x75, 0x29, 0xb3, 0xfe, 0x6f, 0xce, 0x9e, 0xcd, 0x69, 0x08, 0x7c, 0x7b, 0x46, 0x13, 0x82, 0x0e, 0x67, 0x7a, 0x83, 0x8e, - 0xa7, 0xc9, 0xe1, 0x28, 0x88, 0x63, 0xfa, 0xae, 0xc7, 0x40, 0x4b, 0x6f, 0xec, 0x00, 0xe2, 0x0a, 0xef, 0xfb, 0xef, 0xc3, 0xd6, 0x81, 0xf2, 0xb6, 0xf6, 0x74, 0xed, 0x19, 0xfa, 0x28, 0xe0, 0xb5, - 0x1b, 0x1a, 0xfb, 0xe6, 0xbe, 0xd5, 0xef, 0x5c, 0xb3, 0xd2, 0x0e, 0x6d, 0x8d, 0x95, 0x06, 0x06, 0x09, 0x0e, 0xdf, 0x93, 0x80, 0x02, 0x14, 0x18, 0xe6, 0x20, 0xe5, 0x3a, 0x83, 0x57, 0x03, 0x53, - 0x5f, 0x4d, 0x3b, 0x05, 0x8f, 0xb6, 0x61, 0xde, 0x78, 0x22, 0xf1, 0x9e, 0xf1, 0x50, 0x53, 0x3c, 0x2c, 0xea, 0x71, 0x8d, 0x7b, 0xa5, 0x88, 0x35, 0x1a, 0xf5, 0x1d, 0x2f, 0x16, 0x6b, 0xa6, 0x4f, - 0x99, 0xac, 0x15, 0xd7, 0x2a, 0x17, 0x45, 0x6d, 0xd8, 0x98, 0xf2, 0xae, 0x19, 0xfa, 0x64, 0x8a, 0x11, 0xef, 0x84, 0x99, 0x82, 0xa6, 0x15, 0x33, 0x4c, 0x82, 0x03, 0x13, 0xce, 0xc1, 0x62, 0x48, - 0xc6, 0xf4, 0x64, 0x6f, 0x9f, 0x58, 0xee, 0x0d, 0x94, 0x8c, 0xee, 0xdf, 0x17, 0x29, 0x99, 0xb9, 0xaf, 0x7f, 0x90, 0x12, 0xbb, 0xb3, 0x0e, 0xe4, 0x75, 0xbc, 0xde, 0x77, 0xdf, 0x98, 0x11, 0xec, - 0xae, 0x84, 0x31, 0x3b, 0xf7, 0x6c, 0xc3, 0x50, 0xed, 0x44, 0x89, 0x4a, 0x5d, 0x14, 0xbe, 0xc3, 0x92, 0xe1, 0xa2, 0x32, 0xa1, 0x9d, 0xbd, 0xbf, 0xd3, 0xd6, 0x7a, 0x4f, 0x63, 0x44, 0x97, 0xba, - 0x88, 0x17, 0x99, 0x21, 0x78, 0x7e, 0xea, 0x70, 0x89, 0xd8, 0x50, 0xae, 0xb5, 0x04, 0x7a, 0xfa, 0x74, 0x18, 0xec, 0xdb, 0x56, 0x33, 0x78, 0x06, 0x05, 0x79, 0x31, 0xf5, 0xf7, 0xab, 0x4d, 0xce, - 0x44, 0x69, 0x59, 0xfe, 0x53, 0x6a, 0xf3, 0x7e, 0x87, 0x86, 0x50, 0x0e, 0x8a, 0xb8, 0xd7, 0x34, 0x1e, 0xdb, 0xf3, 0xc7, 0xc2, 0x06, 0x8c, 0xc8, 0x77, 0xaf, 0x3c, 0x09, 0x9e, 0x53, 0x50, 0xf2, - 0x6a, 0x15, 0x05, 0x64, 0xec, 0x36, 0x90, 0x90, 0xac, 0x00, 0x54, 0x31, 0xb7, 0xa6, 0xa7, 0x4f, 0xc3, 0xa7, 0x40, 0x26, 0x0c, 0x70, 0xa7, 0xcd, 0x6e, 0x8f, 0xc7, 0xae, 0xdc, 0xb7, 0xc1, 0x5f, - 0x98, 0x84, 0x7d, 0x6a, 0x6a, 0xa5, 0xbc, 0xbc, 0x8e, 0xe3, 0x1d, 0xaf, 0xf9, 0xf3, 0xd5, 0x9b, 0xbc, 0x45, 0xc1, 0xc9, 0xeb, 0x54, 0x9c, 0xcc, 0x2b, 0x39, 0xba, 0xde, 0x74, 0x4a, 0xb7, 0xa3, - 0xa6, 0x03, 0xed, 0x6e, 0x6c, 0xff, 0xe8, 0xca, 0x45, 0x97, 0x40, 0x3b, 0xec, 0x82, 0x88, 0x8c, 0x46, 0xca, 0x09, 0x16, 0xbd, 0xb6, 0x82, 0x3b, 0xb1, 0x19, 0xa5, 0xd6, 0xbe, 0x45, 0x77, 0x83, - 0x6c, 0x15, 0x93, 0xd0, 0x45, 0x08, 0x83, 0x5e, 0xd2, 0xe3, 0x19, 0x04, 0x1f, 0x07, 0x3e, 0x7a, 0xe2, 0x06, 0x63, 0xfb, 0xd8, 0xc9, 0x59, 0x69, 0xc7, 0x6f, 0x9f, 0x00, 0xe8, 0x6e, 0x7b, 0xc6, - 0x1f, 0xbc, 0x54, 0x42, 0x0b, 0xdf, 0xe6, 0x31, 0xe9, 0x5c, 0x8c, 0xb2, 0x3a, 0xb4, 0xe0, 0xb8, 0x47, 0x4a, 0x37, 0xb0, 0x74, 0xd1, 0xbd, 0x44, 0xe9, 0xe2, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x50, 0x4b, 0x07, 0x08, 0x4a, 0x79, 0x94, 0xb6, 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, - 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x71, - 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, - 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x71, - 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, - 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, - 0x76, 0x61, 0x9c, 0x91, 0xbf, 0x6e, 0xdb, 0x30, 0x10, 0xc6, 0x77, 0x3e, 0xc5, 0x8d, 0x92, 0x06, 0xea, 0x01, 0xd4, 0x16, 0x6e, 0x8b, 0x1a, 0xe8, 0x50, 0x14, 0x45, 0x93, 0x21, 0x23, 0x2d, 0x9d, - 0x25, 0xc2, 0x14, 0x49, 0xf1, 0x8e, 0x8e, 0x85, 0xc0, 0xef, 0x1e, 0x50, 0x7f, 0x2c, 0x03, 0x49, 0x96, 0x68, 0x21, 0x71, 0xbf, 0xef, 0x3b, 0xde, 0x7d, 0xf2, 0xaa, 0x3e, 0xa9, 0x16, 0xe1, 0x18, - 0x6d, 0xcd, 0xda, 0x59, 0xaa, 0x84, 0xd0, 0xbd, 0x77, 0x81, 0x41, 0x3b, 0x39, 0x44, 0x15, 0x4e, 0x91, 0xe4, 0x31, 0xda, 0x61, 0x94, 0xfb, 0x68, 0x87, 0xea, 0x43, 0x7a, 0xb2, 0x8a, 0xf5, 0x19, - 0x25, 0x9e, 0xd1, 0x32, 0xc9, 0x9f, 0xc6, 0xc5, 0xe6, 0x57, 0xba, 0x7f, 0xc2, 0xf2, 0x23, 0x6a, 0xd3, 0x60, 0xa8, 0x84, 0x28, 0x8b, 0x42, 0x40, 0x01, 0x4f, 0x2e, 0x06, 0xd8, 0x2f, 0x33, 0x42, - 0x6d, 0x14, 0x91, 0x80, 0xa2, 0x14, 0x3e, 0x1e, 0x8c, 0xae, 0xe7, 0xc2, 0xc6, 0x5f, 0x84, 0x00, 0x00, 0x98, 0xbc, 0xe9, 0x2b, 0xe0, 0x91, 0x10, 0xb8, 0x43, 0xf8, 0x37, 0xbf, 0x9f, 0xa4, 0x03, - 0xe0, 0x85, 0xd1, 0x52, 0x32, 0x1c, 0x5d, 0x98, 0xf0, 0x9a, 0x82, 0x84, 0x87, 0x4e, 0x13, 0xe0, 0x45, 0xf5, 0xde, 0xe0, 0xda, 0x64, 0xa5, 0x40, 0xba, 0xf7, 0x66, 0x04, 0xac, 0x3b, 0x87, 0x04, - 0x9a, 0x09, 0xb4, 0xf5, 0x91, 0xa1, 0x51, 0xac, 0xe4, 0xaa, 0xde, 0x79, 0x15, 0x54, 0xbf, 0x10, 0x05, 0xdb, 0x72, 0x37, 0x41, 0x40, 0x8e, 0xc1, 0xbe, 0xc7, 0xca, 0xe9, 0xdc, 0xa5, 0x29, 0xa7, - 0xdb, 0xb2, 0xe6, 0xa6, 0xfb, 0xf2, 0x37, 0xb2, 0x8f, 0xfc, 0xed, 0x36, 0x53, 0x76, 0xc7, 0x7e, 0xdb, 0x09, 0x4d, 0x2f, 0xe7, 0x6b, 0x18, 0x53, 0x20, 0x25, 0x7c, 0x6f, 0x1a, 0x18, 0x53, 0x98, - 0x87, 0x48, 0xda, 0x22, 0x11, 0x18, 0xd7, 0xea, 0x1a, 0x3a, 0x0c, 0xb8, 0x09, 0xff, 0x8f, 0xc4, 0xd8, 0x4b, 0x17, 0x59, 0xfa, 0xa0, 0x2d, 0x1b, 0x9b, 0xcd, 0xdd, 0xaa, 0x9b, 0x64, 0x1e, 0x00, - 0xdc, 0x7c, 0x7c, 0x05, 0x8b, 0xcf, 0x4b, 0x6d, 0x96, 0xca, 0x14, 0x46, 0x96, 0xcb, 0x16, 0xf9, 0x0f, 0x12, 0xa9, 0x16, 0xb3, 0xfc, 0xce, 0xbe, 0xec, 0xfe, 0xe6, 0x97, 0xcb, 0x3a, 0xa0, 0x62, - 0xcc, 0x72, 0x79, 0x48, 0x85, 0x6c, 0xee, 0xbf, 0x18, 0xaf, 0x42, 0x5c, 0xc5, 0x6b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x29, 0x16, 0x23, 0x9b, 0x51, 0x01, 0x00, 0x00, 0xb2, - 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, + 0x73, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x2c, 0x8d, 0xc1, 0x6a, 0xc3, 0x30, 0x10, 0x44, 0xcf, 0xda, 0xaf, 0xd8, 0xea, 0x24, 0x41, 0x23, 0xd3, 0x6b, 0x4a, 0x6e, 0x4d, 0xe9, 0x3d, + 0x5f, 0xa0, 0xc8, 0x2b, 0x57, 0xc4, 0xd2, 0x9a, 0xf5, 0x3a, 0x04, 0x82, 0xff, 0xbd, 0xd8, 0xcd, 0x69, 0x06, 0x66, 0xde, 0xcc, 0x14, 0xd3, 0x2d, 0x0e, 0x84, 0x35, 0x96, 0x06, 0x50, 0xea, 0xc4, + 0xa2, 0xe8, 0xc0, 0xd8, 0x5c, 0xd5, 0x82, 0xb1, 0x3c, 0x5b, 0x00, 0x93, 0x08, 0xed, 0x50, 0xf4, 0x77, 0xb9, 0x86, 0xc4, 0xb5, 0xbb, 0xb5, 0xa8, 0xe5, 0x4e, 0x87, 0x39, 0xb6, 0xfe, 0xca, 0x8f, + 0x2e, 0x2f, 0x2d, 0x1d, 0x06, 0xee, 0xd2, 0xc8, 0x4b, 0x4f, 0x77, 0x6a, 0xba, 0x53, 0x19, 0x6d, 0xb6, 0xe0, 0x01, 0xb6, 0x7c, 0x7f, 0x70, 0x1e, 0x9f, 0x60, 0x4a, 0x46, 0x12, 0xc1, 0xe3, 0x09, + 0x13, 0x85, 0x8b, 0x46, 0x51, 0x97, 0x28, 0x7c, 0x51, 0x8e, 0xcb, 0xa8, 0x3f, 0xb1, 0xf5, 0x23, 0xc9, 0xf3, 0xa5, 0x47, 0xcc, 0xe1, 0xdf, 0xae, 0xfe, 0x73, 0xc7, 0xde, 0x4e, 0xd8, 0xca, 0xb8, + 0xed, 0x98, 0x5c, 0x35, 0x7c, 0x4f, 0x52, 0x9a, 0x8e, 0xcd, 0xf1, 0x1c, 0x2e, 0xda, 0x93, 0xc8, 0xfb, 0x56, 0x0b, 0x67, 0x11, 0x16, 0xe7, 0x3d, 0x18, 0xc3, 0x73, 0x38, 0x3f, 0x8a, 0xba, 0x0f, + 0x0f, 0x66, 0x85, 0x15, 0xfe, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x34, 0x7f, 0x10, 0xe4, 0xc1, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, + 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0xd2, 0xd3, 0xd3, 0xd7, 0xd3, 0xd3, 0xcf, 0x28, 0x29, 0x29, 0x00, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x22, 0x3e, 0xf2, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x74, 0x8e, 0x41, 0x52, 0xc3, 0x30, 0x0c, 0x45, 0xd7, 0xf5, 0x29, 0xb4, 0xa4, 0x0b, 0x4b, 0x72, 0xd9, 0x90, 0x05, 0xdc, + 0xc5, 0x71, 0x14, 0xe3, 0xc1, 0xb1, 0xc0, 0x76, 0x32, 0x2d, 0xa7, 0x67, 0x1a, 0x36, 0x2d, 0x43, 0xbf, 0x96, 0x7a, 0xef, 0xcf, 0x5f, 0x74, 0x5a, 0xb3, 0x40, 0x33, 0xa6, 0xca, 0x67, 0xf6, 0x41, + 0x60, 0x86, 0xd7, 0x37, 0x40, 0x9a, 0x8d, 0x89, 0x0a, 0x0e, 0xdd, 0x70, 0x7d, 0x7d, 0xad, 0xa9, 0x0a, 0x3c, 0x99, 0xc3, 0x0c, 0x1b, 0x23, 0x23, 0x5b, 0x66, 0x76, 0xfb, 0xed, 0xb1, 0x7c, 0x13, + 0x73, 0x88, 0xa9, 0xbf, 0xaf, 0x23, 0x06, 0x5d, 0xe8, 0xa3, 0xf8, 0x9e, 0x36, 0xb1, 0xcd, 0x97, 0x69, 0xd4, 0x33, 0xcd, 0x6b, 0x09, 0x36, 0xea, 0xb5, 0xc6, 0xbd, 0xe0, 0xc9, 0x1c, 0xef, 0xea, + 0x6f, 0xc4, 0xc5, 0xf7, 0x5e, 0x28, 0xaa, 0x0d, 0x9a, 0xb5, 0xfa, 0x31, 0xcb, 0xee, 0xa0, 0x7b, 0x06, 0x22, 0x48, 0x65, 0x4a, 0x55, 0x42, 0xff, 0x5f, 0x49, 0xcd, 0xf7, 0x7e, 0xf9, 0x9d, 0xea, + 0x86, 0x87, 0x7c, 0x6d, 0xf4, 0x2d, 0x55, 0xb3, 0x46, 0xd8, 0x1c, 0x9e, 0x06, 0x74, 0x7f, 0x50, 0xcd, 0xbe, 0x44, 0xd4, 0x1a, 0xe9, 0x4c, 0xed, 0xd2, 0xf6, 0x01, 0x8c, 0x7c, 0x47, 0x1d, 0xcd, + 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x01, 0x3e, 0x2e, 0x0a, 0xba, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, + 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0xb4, 0xd4, 0xcb, 0xb2, 0xa2, 0xc8, 0x16, 0x06, 0xe0, 0x79, 0x3d, + 0xc5, 0x9e, 0x1b, 0x42, 0x26, 0x57, 0x39, 0x11, 0x35, 0x40, 0x44, 0xae, 0x2a, 0x72, 0x51, 0x74, 0x06, 0x09, 0x09, 0x8a, 0x90, 0x08, 0x08, 0xe8, 0xd3, 0x9f, 0xb0, 0x6a, 0xa2, 0x1d, 0xbd, 0xa3, + 0xaa, 0xba, 0x77, 0x4f, 0x18, 0x7e, 0xff, 0x1f, 0x8b, 0x95, 0x2b, 0x3b, 0x75, 0xf9, 0x2d, 0xa6, 0x10, 0x29, 0x69, 0x44, 0x9a, 0x94, 0xb4, 0x74, 0x46, 0xa6, 0xed, 0xbd, 0xed, 0xd2, 0x32, 0xa1, + 0x7b, 0x86, 0xf9, 0xe8, 0x19, 0x86, 0xe2, 0x29, 0x40, 0x67, 0x84, 0x2a, 0x49, 0xf2, 0x91, 0xc3, 0xff, 0x1d, 0xf8, 0x19, 0xb9, 0x9f, 0x59, 0xd9, 0xe7, 0x5c, 0x25, 0xad, 0x0c, 0xfa, 0xe2, 0xf5, + 0xf9, 0x90, 0x8e, 0x99, 0x32, 0x59, 0x7b, 0x3b, 0xdf, 0x30, 0xd9, 0x36, 0x3d, 0xf6, 0x8c, 0x86, 0xd4, 0x0a, 0x7d, 0xff, 0xf6, 0xe2, 0x67, 0x24, 0x89, 0x6f, 0x2d, 0xfd, 0xe3, 0xd3, 0xf3, 0x1f, + 0x3d, 0x4f, 0x01, 0x8a, 0x7b, 0x71, 0xc7, 0x7c, 0x8f, 0xc1, 0x72, 0xbd, 0x73, 0x32, 0x5e, 0x74, 0xc5, 0x23, 0x08, 0x62, 0x4b, 0x8f, 0x4d, 0x5c, 0xa8, 0xf7, 0xa1, 0x29, 0xcf, 0x66, 0x85, 0xc5, + 0x81, 0x1f, 0x9b, 0x65, 0x6d, 0x61, 0xf9, 0xcd, 0x2d, 0xaa, 0xa8, 0x3b, 0xf5, 0xe9, 0xb4, 0x8d, 0xaa, 0x24, 0x26, 0x23, 0x8d, 0x6f, 0x15, 0x9a, 0x66, 0xe4, 0xa3, 0x07, 0x14, 0x9c, 0x51, 0xf0, + 0x49, 0x3b, 0xc5, 0xa6, 0xdd, 0x97, 0x59, 0x8a, 0x0d, 0xc8, 0x82, 0xd2, 0x9c, 0x97, 0xe4, 0xb1, 0x2c, 0xa2, 0x6a, 0x5e, 0xea, 0x5a, 0x07, 0xd5, 0xa8, 0x14, 0x94, 0x31, 0x5c, 0x73, 0x5a, 0x63, + 0x94, 0xdb, 0x3f, 0xa1, 0x5f, 0xca, 0x6f, 0x17, 0x16, 0xbe, 0x0a, 0x73, 0xd2, 0xad, 0x0a, 0xdb, 0xa6, 0xcb, 0xba, 0x4e, 0x76, 0x78, 0xd0, 0xaa, 0xe3, 0xe3, 0xf8, 0xe0, 0x96, 0xfd, 0x88, 0x1f, + 0xde, 0xd5, 0x8c, 0x38, 0xc8, 0xb5, 0x73, 0xee, 0x0f, 0x12, 0x98, 0x27, 0x7d, 0x1b, 0xb4, 0xa6, 0x5e, 0x86, 0x08, 0xe5, 0x6a, 0x87, 0x1b, 0x46, 0xb1, 0x75, 0x23, 0x3c, 0xe8, 0x55, 0x33, 0xb0, + 0xbd, 0x71, 0xd7, 0xf7, 0x67, 0xa3, 0xa5, 0xb7, 0x5e, 0xc8, 0x3c, 0x86, 0x18, 0xfd, 0x09, 0xfd, 0x05, 0xe5, 0xcb, 0xa8, 0xeb, 0xaa, 0xe7, 0xc2, 0x20, 0x72, 0x21, 0x4d, 0x14, 0x5f, 0xd2, 0x1f, + 0x38, 0x05, 0x5f, 0xf1, 0x1b, 0xaf, 0xc3, 0xc3, 0x7a, 0x3e, 0xd6, 0x57, 0x37, 0x1a, 0xdb, 0x83, 0x79, 0xf0, 0x8a, 0x93, 0xb2, 0xb7, 0x1e, 0x2a, 0x3e, 0xc9, 0x31, 0xd4, 0x62, 0x9e, 0x01, 0xd6, + 0xee, 0xce, 0x8f, 0xe3, 0xe5, 0x37, 0x71, 0xf6, 0xa9, 0xe2, 0xa5, 0xcc, 0xed, 0x8f, 0x63, 0xa2, 0x2e, 0xb9, 0x2e, 0x74, 0x8e, 0x3b, 0x6b, 0x65, 0x0f, 0x8b, 0x19, 0x09, 0x2a, 0xc5, 0xf7, 0x09, + 0x98, 0x25, 0xb7, 0x40, 0x1c, 0xc6, 0x14, 0x25, 0x6a, 0x2f, 0xff, 0xa6, 0xfa, 0x52, 0x59, 0xf4, 0x24, 0x3a, 0xed, 0x41, 0x71, 0xc9, 0xe6, 0x0b, 0x97, 0xd3, 0xba, 0xd0, 0x0f, 0xc3, 0x59, 0xc4, + 0xf6, 0x86, 0x66, 0xd6, 0x2b, 0xd2, 0x17, 0xf3, 0x59, 0xbf, 0x45, 0x41, 0x1c, 0x85, 0x7a, 0xf6, 0xf7, 0xf8, 0xa9, 0x8d, 0xba, 0xee, 0xfe, 0x94, 0x01, 0x05, 0x5f, 0x77, 0x5c, 0xd4, 0x34, 0xa3, + 0x0f, 0x4e, 0x01, 0x51, 0x57, 0xbb, 0x5d, 0x39, 0x62, 0x9a, 0xab, 0x4e, 0x44, 0x0f, 0xcf, 0xa2, 0x74, 0xda, 0xea, 0x56, 0x12, 0x30, 0x62, 0x61, 0x0a, 0x79, 0xab, 0x69, 0xd2, 0x27, 0xc3, 0x78, + 0x93, 0x85, 0x17, 0xb9, 0x38, 0x68, 0x59, 0xb4, 0xc5, 0x75, 0xca, 0x57, 0x25, 0x3e, 0x1c, 0xf5, 0x89, 0x67, 0x39, 0xed, 0x06, 0x31, 0x29, 0xe7, 0x35, 0x06, 0xde, 0x5c, 0x98, 0x94, 0xbe, 0x2f, + 0x43, 0xaf, 0x77, 0xed, 0xd5, 0x6f, 0xc8, 0xd2, 0x93, 0x34, 0x0d, 0xff, 0x16, 0x6f, 0x31, 0x58, 0x6d, 0xec, 0xe4, 0xa2, 0xb9, 0x37, 0xf7, 0x3a, 0x39, 0x77, 0xed, 0xe2, 0x92, 0x16, 0xc9, 0xc1, + 0x39, 0x45, 0xd2, 0x71, 0xd9, 0xce, 0x67, 0x39, 0x2d, 0x3b, 0xce, 0x27, 0x33, 0x7e, 0x27, 0x5f, 0xca, 0xee, 0x27, 0xbb, 0x99, 0x73, 0xe9, 0x7c, 0x7f, 0xb5, 0xe9, 0xad, 0x5e, 0x4e, 0x4d, 0x5d, + 0x34, 0x6e, 0x37, 0xe4, 0x49, 0x9c, 0xc7, 0x28, 0xc2, 0x19, 0x5b, 0xf4, 0x42, 0x4c, 0x7c, 0xc5, 0x27, 0xec, 0xe1, 0x4d, 0xae, 0x8b, 0x8c, 0x4e, 0x9b, 0x86, 0x34, 0xed, 0x13, 0x95, 0xde, 0x5e, + 0x60, 0x3c, 0x44, 0xc3, 0x88, 0xf5, 0xf9, 0x72, 0xbd, 0x9b, 0xd8, 0x4c, 0x1e, 0xd4, 0xb0, 0xd1, 0xe5, 0xc5, 0x0d, 0xef, 0x58, 0x63, 0xd5, 0x55, 0x0b, 0x37, 0xc1, 0xb0, 0xe1, 0xd7, 0xc6, 0x5a, + 0xbd, 0x80, 0x37, 0xb3, 0x69, 0xe9, 0xf1, 0x94, 0x7c, 0xf4, 0x90, 0xe2, 0xde, 0xce, 0x5c, 0xd7, 0x34, 0x57, 0xc9, 0xb3, 0xca, 0x34, 0x0b, 0xef, 0x2d, 0x1b, 0xa5, 0xb2, 0x15, 0xae, 0x02, 0x3f, + 0x31, 0xdb, 0x43, 0xb8, 0x1b, 0xb4, 0x03, 0xeb, 0xda, 0x08, 0x67, 0xd7, 0x34, 0xc3, 0x71, 0xf6, 0x57, 0xef, 0x91, 0x36, 0xe4, 0x42, 0xb2, 0xa7, 0xc9, 0x48, 0x3f, 0x2f, 0x10, 0xda, 0x4c, 0x12, + 0x01, 0x28, 0x7a, 0x51, 0x54, 0x4a, 0xdc, 0x3f, 0xd4, 0xfd, 0xe8, 0x00, 0x4f, 0xb2, 0x04, 0xeb, 0x7a, 0xf7, 0xcf, 0x8d, 0xb2, 0x0e, 0xee, 0xd0, 0x4e, 0xb6, 0xb6, 0xa2, 0x39, 0xe8, 0x17, 0xda, + 0x4b, 0x45, 0x3b, 0x15, 0x54, 0x2f, 0x76, 0xc5, 0x1c, 0x4d, 0x16, 0x8e, 0x60, 0x77, 0xd0, 0xd7, 0x4f, 0xbb, 0x99, 0xb2, 0xf5, 0x92, 0xa2, 0x58, 0x37, 0x09, 0xeb, 0x82, 0x30, 0x56, 0xb3, 0x9a, + 0x3d, 0xce, 0x83, 0xef, 0xdf, 0x32, 0x72, 0x89, 0xaa, 0x8c, 0x22, 0x4d, 0x46, 0x8f, 0x74, 0x7b, 0x6f, 0x7f, 0xfe, 0x16, 0x30, 0x65, 0x00, 0x03, 0x81, 0xc0, 0x02, 0x00, 0x78, 0x86, 0x05, 0x53, + 0x80, 0x25, 0x1c, 0x31, 0x42, 0x84, 0x67, 0x22, 0x7a, 0x89, 0x22, 0x4e, 0x91, 0xd7, 0x70, 0x65, 0x36, 0xb9, 0x58, 0x05, 0x69, 0xad, 0xcc, 0x51, 0xc1, 0x4f, 0x4a, 0xf9, 0x81, 0x37, 0x92, 0xd9, + 0xc4, 0x72, 0xbd, 0x5e, 0x67, 0x91, 0x9f, 0x68, 0x0b, 0xc3, 0xcf, 0x7e, 0x11, 0x25, 0x31, 0x22, 0x90, 0x38, 0xc0, 0xf3, 0x53, 0x56, 0x42, 0x08, 0xc3, 0x24, 0x11, 0x70, 0x24, 0xfc, 0x07, 0x51, + 0x0c, 0x98, 0x41, 0x08, 0x45, 0xc8, 0x70, 0xc2, 0x14, 0xc7, 0x48, 0x4c, 0x40, 0xc4, 0x4a, 0xb3, 0x28, 0xfe, 0xca, 0x28, 0xe1, 0x6d, 0x65, 0xfe, 0x35, 0x27, 0x51, 0xe0, 0xe9, 0x58, 0x1e, 0xed, + 0xb2, 0x5d, 0x9f, 0x3b, 0xd7, 0xde, 0xec, 0x07, 0x64, 0xe1, 0x6a, 0xae, 0x9b, 0xc3, 0xd0, 0xe5, 0x1e, 0x84, 0xb6, 0x9b, 0x97, 0x2b, 0x7e, 0xc1, 0x4b, 0xa9, 0x1a, 0x46, 0xa0, 0xfd, 0xd4, 0xf9, + 0xca, 0x5a, 0x10, 0xfc, 0xec, 0xe5, 0x5d, 0x57, 0xcb, 0x5a, 0x0a, 0xd0, 0xd6, 0x3c, 0x46, 0x93, 0xba, 0x3c, 0xdc, 0x64, 0xeb, 0x9c, 0x48, 0xe3, 0x15, 0x62, 0x70, 0xe6, 0x1b, 0x1b, 0x2d, 0x8c, + 0x02, 0x94, 0x67, 0xee, 0x2a, 0xb7, 0xf2, 0xe7, 0xd0, 0x3f, 0x2d, 0xf6, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x47, 0xcb, 0xed, 0xf8, 0xdd, 0x03, 0x00, 0x00, 0xaa, 0x08, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, + 0x67, 0x6f, 0x2c, 0x8c, 0xc1, 0x6a, 0xc3, 0x30, 0x0c, 0x86, 0xcf, 0xd6, 0x53, 0x68, 0x3e, 0xd9, 0xb0, 0x3a, 0xec, 0xda, 0xd1, 0xdb, 0x3a, 0x76, 0xef, 0x13, 0xb8, 0x89, 0x9d, 0x9a, 0xc6, 0x52, + 0x50, 0x94, 0x51, 0x28, 0x79, 0xf7, 0xe1, 0xac, 0x27, 0x7d, 0xa0, 0xef, 0xff, 0xe6, 0xd8, 0xdf, 0xe3, 0x98, 0xb0, 0xc6, 0x42, 0x00, 0xa5, 0xce, 0x2c, 0x8a, 0x0e, 0x8c, 0xcd, 0x55, 0x2d, 0x18, + 0xcb, 0x8b, 0x05, 0x30, 0x76, 0x2c, 0x7a, 0x5b, 0xaf, 0xa1, 0xe7, 0xda, 0xdd, 0x29, 0x6a, 0xf9, 0x4d, 0x87, 0x25, 0xd2, 0x70, 0xe5, 0x47, 0x97, 0x57, 0xea, 0x0f, 0x23, 0x77, 0x37, 0xd5, 0xb9, + 0xb9, 0x19, 0x6d, 0xb6, 0xe0, 0x01, 0xda, 0x63, 0xef, 0x3a, 0x8f, 0x4f, 0x30, 0x25, 0x63, 0x12, 0xc1, 0xe3, 0x09, 0x9b, 0x19, 0x2e, 0x1a, 0x45, 0xdd, 0x8e, 0x5f, 0x29, 0xc7, 0x75, 0xd2, 0x9f, + 0x48, 0xc3, 0x94, 0xe4, 0xf9, 0xba, 0x47, 0xcc, 0xe1, 0x1f, 0x37, 0xff, 0xb9, 0x4f, 0xdf, 0x4e, 0x48, 0x65, 0x6a, 0x2d, 0x93, 0xab, 0x86, 0xef, 0x59, 0x0a, 0xe9, 0x44, 0x8e, 0x97, 0x70, 0xd1, + 0x21, 0x89, 0xbc, 0x37, 0x2d, 0x9c, 0x45, 0x58, 0x9c, 0xf7, 0x60, 0x0c, 0x2f, 0xe1, 0xfc, 0x28, 0xea, 0x3e, 0x3c, 0x98, 0x0d, 0x36, 0xf8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, + 0x25, 0xd3, 0x2c, 0x12, 0xba, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x54, 0x8e, 0xc1, 0xaa, 0xc2, 0x30, 0x14, 0x44, 0xf7, + 0xf9, 0x8a, 0x81, 0x6e, 0x1f, 0xa5, 0x6f, 0xdb, 0xef, 0x50, 0x70, 0x27, 0x97, 0x66, 0xd2, 0x04, 0x9b, 0x9b, 0x92, 0x9b, 0x2a, 0xfd, 0x7b, 0xd1, 0xea, 0xc2, 0xed, 0x70, 0x66, 0xe6, 0xd8, 0x14, + 0x99, 0xe5, 0x7a, 0x67, 0xb5, 0x54, 0x74, 0xc4, 0xd0, 0x0f, 0xfd, 0x3f, 0x3a, 0x9c, 0x22, 0xf1, 0x09, 0x11, 0x4a, 0x45, 0x16, 0x4d, 0x81, 0xd6, 0xfa, 0x5d, 0xf2, 0x82, 0xa3, 0xe5, 0xdc, 0xc1, + 0xa9, 0x64, 0x62, 0x33, 0xfa, 0x37, 0xd9, 0x62, 0x32, 0x2c, 0xa2, 0xf3, 0x26, 0x33, 0xb1, 0xca, 0x74, 0x43, 0xe5, 0x5a, 0x2c, 0xb5, 0x52, 0x77, 0x3c, 0x22, 0x15, 0x95, 0x81, 0x95, 0x3a, 0xd1, + 0xbb, 0x0e, 0x49, 0xd1, 0x22, 0x71, 0xbe, 0xfc, 0x41, 0xd4, 0x23, 0x35, 0xfb, 0x1e, 0xbb, 0xd7, 0xf0, 0x08, 0xcf, 0x20, 0xdb, 0xd2, 0xdc, 0xaf, 0xa3, 0x7b, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0x4a, 0xc6, 0x88, 0x52, 0x88, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x6e, + 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xac, 0x58, 0x6d, 0x53, 0x1c, 0xb9, 0x11, + 0xfe, 0x3e, 0xbf, 0xa2, 0x03, 0x1f, 0x0c, 0xd4, 0x32, 0x8b, 0x7d, 0xb9, 0xc4, 0x59, 0xdf, 0x99, 0xb2, 0x89, 0x53, 0x70, 0xa1, 0x6c, 0x17, 0x70, 0x71, 0x52, 0x84, 0xca, 0x68, 0x47, 0xbd, 0x8c, + 0x40, 0x23, 0x4d, 0x24, 0xcd, 0xae, 0x27, 0xe7, 0xfb, 0xef, 0xa9, 0x6e, 0xcd, 0xdb, 0xbe, 0x70, 0x17, 0x57, 0xee, 0x13, 0x8b, 0xd4, 0x6a, 0x3d, 0xdd, 0xfd, 0xf4, 0x8b, 0x66, 0x1f, 0xde, 0x5b, + 0x89, 0xe9, 0x83, 0x87, 0x33, 0x6d, 0x6b, 0x09, 0xef, 0x96, 0x68, 0x82, 0x87, 0xbf, 0xd4, 0x26, 0x0f, 0xca, 0x9a, 0x24, 0xf9, 0x84, 0x3a, 0xb7, 0x25, 0x42, 0xb0, 0xd0, 0xd8, 0xda, 0x81, 0xc1, + 0x55, 0x7f, 0x64, 0xd1, 0x4a, 0x41, 0xe5, 0xec, 0x03, 0xe6, 0xe1, 0x77, 0x70, 0x53, 0x20, 0xcc, 0xad, 0xd2, 0xe8, 0x2a, 0x2d, 0x02, 0xf6, 0x12, 0x49, 0x6e, 0x25, 0x42, 0x2e, 0x0c, 0xcc, 0x11, + 0x16, 0xb6, 0x36, 0x12, 0x94, 0x81, 0xdb, 0x4c, 0x19, 0x89, 0x9f, 0xd3, 0x07, 0x9f, 0xdd, 0x1d, 0xa4, 0xd3, 0xee, 0x9f, 0xc3, 0x14, 0x6e, 0x0a, 0x35, 0x52, 0xaf, 0x3c, 0x94, 0x28, 0x4c, 0x48, + 0x82, 0x05, 0x87, 0xbe, 0xb2, 0x46, 0x12, 0x9e, 0xdb, 0x31, 0xe4, 0xbb, 0x83, 0x22, 0x84, 0xca, 0xcf, 0xa6, 0xd3, 0x9c, 0x56, 0x91, 0x17, 0x53, 0x65, 0xa7, 0x87, 0x69, 0x92, 0xec, 0xef, 0xc3, + 0xa5, 0xcd, 0x85, 0x06, 0xfc, 0x8c, 0x79, 0x1d, 0x0d, 0x7b, 0xb3, 0x08, 0xe8, 0xba, 0x05, 0x73, 0x0f, 0x99, 0xa9, 0x4a, 0x50, 0xc6, 0x07, 0xa1, 0x75, 0x36, 0x21, 0x63, 0x19, 0xaf, 0xab, 0x0d, + 0x84, 0x35, 0x34, 0x9a, 0x34, 0xe9, 0x06, 0xe6, 0xcd, 0x70, 0x3a, 0xe1, 0xd3, 0x24, 0xcb, 0xbb, 0x59, 0x9a, 0x24, 0xe4, 0x0a, 0x57, 0x9b, 0xa0, 0x4a, 0x84, 0x95, 0xd2, 0x74, 0x77, 0x65, 0x3d, + 0x42, 0x28, 0x1c, 0x22, 0xa0, 0x91, 0x95, 0x55, 0x04, 0x31, 0x49, 0x00, 0x8e, 0x20, 0x9b, 0x66, 0xec, 0xbc, 0x6e, 0x1d, 0x16, 0xd6, 0x45, 0x87, 0x77, 0xf7, 0xa6, 0xad, 0x5c, 0x81, 0x42, 0x87, + 0x62, 0xea, 0x50, 0x48, 0x65, 0xd0, 0xfb, 0x1d, 0xe7, 0x04, 0xf4, 0xbb, 0x10, 0xc5, 0x21, 0x2f, 0x30, 0x7f, 0x5c, 0xd7, 0xa0, 0xd5, 0x12, 0x9f, 0x54, 0xd0, 0x6d, 0xae, 0x9f, 0x67, 0xa3, 0xc6, + 0x2b, 0xbe, 0x8b, 0xa9, 0xc8, 0x73, 0xf4, 0x1e, 0x39, 0xac, 0x0c, 0x7b, 0xee, 0xec, 0xca, 0xa3, 0x03, 0x11, 0x92, 0x5b, 0x8a, 0xcc, 0x6c, 0x3a, 0x65, 0xd7, 0x14, 0xd6, 0x87, 0xd9, 0xcb, 0x93, + 0x97, 0x27, 0x5b, 0x86, 0xdc, 0x1d, 0x1c, 0x82, 0x30, 0xf2, 0x57, 0xc4, 0x3b, 0x60, 0x77, 0x07, 0x87, 0x29, 0xfc, 0xa3, 0x0d, 0x52, 0xed, 0x11, 0xb2, 0xbc, 0x76, 0x3a, 0x23, 0x5e, 0x64, 0x1f, + 0x3f, 0x5c, 0xdf, 0x64, 0x20, 0x0c, 0x30, 0x0b, 0x88, 0x35, 0xa1, 0x18, 0xb8, 0xd8, 0x9b, 0x3a, 0x4b, 0x92, 0x2c, 0xcb, 0x72, 0x6b, 0xbc, 0xd5, 0x98, 0xd0, 0x71, 0x38, 0xfe, 0x3b, 0xd0, 0x61, + 0x38, 0x96, 0xf0, 0xec, 0xa7, 0x3d, 0x23, 0x4a, 0xdc, 0x9b, 0xc1, 0xde, 0x8d, 0xba, 0x47, 0xb7, 0x37, 0x81, 0xbd, 0xbc, 0xf6, 0xc1, 0x96, 0xe8, 0x2e, 0x24, 0x2d, 0x9f, 0x3c, 0x7f, 0xf1, 0xcd, + 0xef, 0xbf, 0xfd, 0xc3, 0x1f, 0x5f, 0xfe, 0x69, 0xef, 0xe7, 0x67, 0xf0, 0xcf, 0x04, 0xe0, 0xf8, 0xfc, 0xd9, 0x99, 0x35, 0x01, 0x4d, 0x38, 0x0e, 0x4d, 0x85, 0x33, 0x10, 0x55, 0xa5, 0x55, 0x2e, + 0xe8, 0xda, 0xe9, 0x83, 0xb7, 0x66, 0x10, 0xc3, 0x63, 0x25, 0x67, 0xf0, 0x7c, 0xbc, 0xe0, 0x6d, 0xed, 0x72, 0x9c, 0x01, 0x13, 0xf8, 0x98, 0xb1, 0x1f, 0xe3, 0x67, 0x51, 0x56, 0x1a, 0xc7, 0x62, + 0x51, 0xb3, 0xc4, 0x65, 0xfa, 0x68, 0x44, 0x50, 0x4b, 0x4c, 0x77, 0x08, 0xf9, 0x0a, 0xf3, 0x25, 0x3a, 0xaf, 0xac, 0x99, 0xc1, 0xf3, 0xf4, 0x24, 0xee, 0xed, 0xf4, 0x2c, 0x39, 0xa1, 0xa5, 0x6b, + 0xcf, 0x1a, 0x61, 0xe4, 0x40, 0x81, 0x9e, 0xab, 0xe4, 0xe7, 0xe4, 0xd6, 0x2e, 0xd1, 0x69, 0x2b, 0xe4, 0x71, 0xe5, 0x6c, 0x40, 0x76, 0xe9, 0x90, 0x7c, 0xab, 0xd5, 0x2a, 0x35, 0x55, 0xf9, 0xe0, + 0xd3, 0xdc, 0x96, 0xd3, 0x4a, 0xe4, 0x8f, 0xe2, 0x1e, 0xa7, 0x3b, 0x8e, 0xc4, 0x58, 0x73, 0x62, 0x74, 0x29, 0xbd, 0x52, 0xa1, 0x80, 0xec, 0xfc, 0xe6, 0xe6, 0x23, 0x7c, 0x7b, 0xf2, 0x0d, 0x5c, + 0xa3, 0x5b, 0xaa, 0x1c, 0xe1, 0x47, 0x23, 0x96, 0x42, 0x69, 0x31, 0xd7, 0x98, 0x45, 0x19, 0x01, 0xd9, 0x99, 0x56, 0xe4, 0x9e, 0x2b, 0x0c, 0xae, 0xc9, 0x88, 0x92, 0x12, 0x1d, 0xa8, 0x45, 0xb2, + 0x96, 0x32, 0x54, 0x38, 0x24, 0x06, 0x74, 0xa5, 0x32, 0xc8, 0x25, 0x63, 0x8e, 0xd0, 0x61, 0x41, 0x39, 0x81, 0xb9, 0x20, 0xca, 0x5a, 0xc3, 0xfc, 0x28, 0xb1, 0xb4, 0xae, 0x81, 0xda, 0x8b, 0x7b, + 0x64, 0x70, 0x1c, 0x01, 0xd0, 0xd6, 0x56, 0x20, 0x51, 0x8b, 0x26, 0x16, 0x12, 0x72, 0x54, 0x57, 0x1e, 0xe1, 0xc2, 0x04, 0x74, 0x0b, 0x91, 0x63, 0x74, 0xe0, 0x50, 0xcf, 0x60, 0xa1, 0x34, 0x42, + 0x29, 0x1a, 0x4e, 0x7b, 0x17, 0x40, 0x80, 0x57, 0xe6, 0x5e, 0x8f, 0x68, 0xc8, 0x79, 0x96, 0x75, 0xaa, 0xb2, 0xc4, 0xce, 0xa9, 0x86, 0xa6, 0x7c, 0xc1, 0xb0, 0x0c, 0x71, 0x19, 0x84, 0xd6, 0x76, + 0x45, 0xe6, 0x2c, 0x51, 0xdb, 0x0a, 0x9d, 0x27, 0x73, 0x84, 0xa4, 0x30, 0x2d, 0x30, 0x6f, 0x72, 0x8d, 0x50, 0x58, 0xfb, 0xe8, 0x29, 0x7f, 0x13, 0x65, 0x54, 0x50, 0x42, 0xab, 0xff, 0x30, 0xf3, + 0x38, 0x9a, 0xbe, 0xa8, 0x83, 0xb4, 0x2b, 0x33, 0x01, 0xe1, 0x61, 0x85, 0x5a, 0xd3, 0xdf, 0xca, 0xd9, 0xa5, 0x92, 0x54, 0xfd, 0x04, 0xac, 0x44, 0x43, 0x2a, 0x15, 0x31, 0xa9, 0x24, 0xc3, 0x23, + 0xd9, 0x93, 0xb5, 0x74, 0x6f, 0xeb, 0xda, 0x08, 0x9e, 0xea, 0x3c, 0x10, 0x9d, 0xbd, 0x60, 0x4f, 0x0b, 0x1f, 0x73, 0x8b, 0xa8, 0xea, 0x73, 0xa7, 0xaa, 0x90, 0xb4, 0x6e, 0x18, 0xc4, 0x7b, 0x1f, + 0xfe, 0x94, 0x00, 0x4c, 0xa7, 0x6c, 0xf6, 0x06, 0xee, 0xce, 0x55, 0x13, 0xa0, 0x8a, 0x8b, 0x12, 0xe6, 0xb8, 0xb0, 0x0e, 0x39, 0x5a, 0x1e, 0xdd, 0x92, 0x42, 0xee, 0xc1, 0x07, 0xe1, 0x02, 0xca, + 0x4e, 0xcb, 0x46, 0xe3, 0xb0, 0x15, 0xfd, 0x12, 0xba, 0x75, 0x82, 0xad, 0x35, 0xa9, 0x01, 0xdf, 0x98, 0xbc, 0x70, 0xd6, 0xd8, 0xda, 0x53, 0x61, 0xa5, 0x8b, 0x4f, 0x67, 0x70, 0x70, 0x08, 0xdf, + 0xbf, 0x06, 0x61, 0x9a, 0x57, 0xc9, 0x00, 0xaa, 0xf3, 0xdc, 0x36, 0x1c, 0xc1, 0x2d, 0x64, 0x13, 0x8d, 0xad, 0xaa, 0xff, 0x13, 0x4d, 0x77, 0xe3, 0x53, 0x88, 0xfa, 0xcc, 0xdc, 0x42, 0x14, 0x6c, + 0x0c, 0x14, 0xa8, 0xc5, 0x06, 0x2e, 0x41, 0x87, 0xbe, 0x02, 0x95, 0xc3, 0x50, 0x3b, 0x03, 0x2f, 0x4e, 0x4e, 0xa6, 0x1f, 0xfe, 0xfa, 0x84, 0x3a, 0xc2, 0xda, 0x61, 0x39, 0x9d, 0xc1, 0x39, 0x33, + 0xe5, 0x8c, 0xee, 0x1f, 0xa3, 0x1d, 0xaa, 0xca, 0x57, 0xc0, 0xa5, 0x43, 0xcc, 0x47, 0x6a, 0x2c, 0x55, 0x00, 0x87, 0xff, 0xae, 0xd1, 0x07, 0xff, 0xdb, 0x59, 0xc0, 0x37, 0x90, 0x05, 0x3d, 0xbe, + 0x1d, 0x26, 0x68, 0x7b, 0x7f, 0x49, 0x19, 0x77, 0x3a, 0x83, 0xcb, 0xf6, 0xe7, 0xd8, 0xb4, 0x1e, 0x42, 0xb0, 0x50, 0x08, 0x23, 0x35, 0x02, 0x97, 0xaf, 0x11, 0xda, 0xb8, 0x3c, 0x8b, 0xe3, 0x15, + 0x8f, 0x2a, 0x3d, 0xf1, 0xbf, 0xb0, 0x70, 0xf7, 0xef, 0xab, 0xe4, 0xe7, 0x58, 0x89, 0xf7, 0xf7, 0xe1, 0x3c, 0xea, 0xba, 0x56, 0xf7, 0x46, 0x84, 0xda, 0x61, 0x92, 0x0c, 0xc7, 0xfb, 0x4b, 0x3d, + 0x08, 0x87, 0x54, 0x92, 0xb9, 0xe9, 0xa2, 0x59, 0x2a, 0x67, 0x4d, 0xc9, 0xe3, 0xdb, 0xaa, 0xc0, 0x36, 0x4d, 0x94, 0xc9, 0x6d, 0x49, 0x09, 0x3e, 0xc6, 0xc5, 0x01, 0x1c, 0x21, 0x4a, 0xd7, 0x8d, + 0xf1, 0xdd, 0xb5, 0xa0, 0xb6, 0xf3, 0x78, 0x48, 0xe0, 0x1d, 0x16, 0x51, 0x2a, 0x1f, 0xe4, 0xd4, 0x01, 0x3f, 0x87, 0x19, 0x9c, 0xc5, 0x1f, 0x93, 0xd8, 0x86, 0xc7, 0x2e, 0x38, 0xdc, 0xe5, 0x8f, + 0x2b, 0x8e, 0x57, 0xef, 0x86, 0x4f, 0xbd, 0x0d, 0x6d, 0x20, 0x09, 0xc4, 0xaf, 0x14, 0x19, 0x16, 0x79, 0x4a, 0x33, 0x7c, 0x0f, 0x1f, 0x9d, 0x2d, 0x95, 0xc7, 0xef, 0x06, 0x91, 0xd7, 0xf0, 0x65, + 0x74, 0x60, 0x23, 0x24, 0x1d, 0x22, 0x56, 0xbb, 0xbd, 0x31, 0x52, 0x78, 0x1d, 0x5c, 0x9d, 0x93, 0xcb, 0x64, 0xdc, 0x22, 0xb5, 0x9b, 0x6b, 0xf0, 0x05, 0xae, 0xb8, 0xd3, 0x79, 0x7c, 0x6b, 0x65, + 0x03, 0x5f, 0x60, 0x69, 0x95, 0x7c, 0x35, 0xb4, 0xdf, 0x3e, 0x00, 0x63, 0x83, 0xbb, 0xf9, 0xca, 0x34, 0xa1, 0xa0, 0x38, 0x86, 0x42, 0xc4, 0x66, 0x42, 0x75, 0x3a, 0x46, 0xb5, 0x3f, 0xc7, 0xf3, + 0x6a, 0x3c, 0xcb, 0xcd, 0x65, 0x1c, 0xe1, 0x4f, 0x85, 0x08, 0xd8, 0x53, 0x9f, 0x64, 0xa8, 0x01, 0xaa, 0x10, 0x67, 0x53, 0xaa, 0x41, 0x64, 0xff, 0x5c, 0xe4, 0x8f, 0xd0, 0xce, 0x4b, 0x9c, 0xa3, + 0x8e, 0xda, 0x84, 0x68, 0x5b, 0xb4, 0xc7, 0x74, 0x1c, 0x97, 0x6c, 0xd3, 0xc2, 0x2c, 0x12, 0xeb, 0x07, 0xb1, 0x14, 0xd7, 0x1c, 0x90, 0xae, 0x79, 0x71, 0xd7, 0xe6, 0x19, 0xcc, 0x52, 0x1b, 0x23, + 0x3b, 0x2a, 0x47, 0x5d, 0x2c, 0x28, 0xfc, 0x25, 0x8a, 0x6d, 0xb9, 0x90, 0x08, 0xe6, 0x83, 0x08, 0xb5, 0x3f, 0xb3, 0x12, 0x4f, 0x67, 0x60, 0xea, 0x72, 0x8e, 0xee, 0x15, 0x25, 0x1a, 0xcf, 0x00, + 0x94, 0xc4, 0x57, 0x98, 0x5b, 0x27, 0xbf, 0xf3, 0xc1, 0x29, 0x73, 0x3f, 0x81, 0xf8, 0xf7, 0x35, 0xc9, 0xcc, 0xad, 0x6c, 0x58, 0x60, 0x08, 0x43, 0xcf, 0xb7, 0x8b, 0xc5, 0xfa, 0x94, 0x18, 0x9d, + 0x44, 0xf6, 0xec, 0xb0, 0x33, 0xda, 0x35, 0xa1, 0x13, 0x71, 0x78, 0xc8, 0x06, 0x54, 0x19, 0x17, 0xa1, 0xac, 0xc5, 0x93, 0x8d, 0x2c, 0x1d, 0x12, 0x96, 0x0a, 0x9f, 0x35, 0x9e, 0xf5, 0xf2, 0xf9, + 0x36, 0x3d, 0x5b, 0x2f, 0x43, 0x0b, 0x26, 0x23, 0xc0, 0xbd, 0x86, 0x86, 0xdc, 0x5b, 0x39, 0xa4, 0x48, 0x71, 0xe8, 0x94, 0x8f, 0xda, 0x84, 0x6f, 0xf3, 0x24, 0x1e, 0x67, 0x33, 0x7b, 0x1d, 0x5b, + 0x06, 0x65, 0x44, 0xbb, 0x8c, 0x18, 0x92, 0xd5, 0xa6, 0x4d, 0xa6, 0x6c, 0x64, 0xca, 0x9a, 0x1a, 0xba, 0x03, 0xcb, 0x2a, 0x34, 0x5d, 0xe7, 0x1f, 0xfb, 0x8e, 0xe3, 0x8d, 0x2a, 0x14, 0x44, 0x13, + 0xe8, 0xfc, 0xbd, 0x83, 0x00, 0x93, 0xc8, 0xc7, 0xb7, 0xf5, 0x62, 0x81, 0x2e, 0xdd, 0xde, 0xf7, 0x23, 0x16, 0x3a, 0x1e, 0x00, 0xa2, 0x55, 0x3f, 0x5c, 0x7f, 0x78, 0x9f, 0xb6, 0xc7, 0xfc, 0x3a, + 0x53, 0x85, 0x87, 0xb9, 0x32, 0xc2, 0x35, 0x20, 0x45, 0x10, 0x3c, 0x9a, 0xed, 0xb7, 0xe5, 0x1b, 0xb8, 0x7e, 0xfb, 0x5f, 0x18, 0x55, 0x84, 0xf6, 0xb6, 0x9b, 0xa8, 0xe8, 0xbd, 0x43, 0x66, 0x0b, + 0x29, 0x15, 0xfb, 0xc9, 0x2e, 0x28, 0xe6, 0xc3, 0xeb, 0x88, 0xa3, 0x39, 0x7a, 0x6e, 0xf5, 0x0f, 0x32, 0xaa, 0x9a, 0x1e, 0x77, 0xd5, 0xe3, 0xb5, 0x39, 0x6a, 0xfd, 0xbd, 0xd4, 0x5d, 0xb7, 0xa6, + 0x65, 0x7c, 0xdd, 0xb8, 0xad, 0x3d, 0xd1, 0x26, 0xc7, 0x22, 0xb1, 0x11, 0x47, 0x25, 0x3b, 0x40, 0xfe, 0x8f, 0x5a, 0x9e, 0x6a, 0xb7, 0xcc, 0xa2, 0x36, 0xc2, 0x96, 0x8f, 0xad, 0x19, 0x3c, 0xe4, + 0x88, 0xb1, 0xe6, 0xf8, 0xc5, 0xc9, 0x49, 0x9b, 0x9c, 0x40, 0xcf, 0xfd, 0x11, 0xa5, 0xd6, 0xd0, 0x58, 0xe3, 0x95, 0x44, 0x87, 0x12, 0x6a, 0x13, 0x7d, 0x43, 0xe4, 0x7a, 0xb3, 0xe6, 0xa7, 0x8d, + 0x11, 0xfe, 0xc9, 0x82, 0x3f, 0x3d, 0x3a, 0x4a, 0xe0, 0x88, 0xad, 0x1f, 0xb5, 0xee, 0x51, 0xa4, 0x25, 0x4b, 0xce, 0x29, 0xf7, 0x76, 0x5f, 0x30, 0xa1, 0xf3, 0xca, 0xe4, 0xba, 0x96, 0xb1, 0xbc, + 0xe2, 0x30, 0x4c, 0x54, 0x82, 0xca, 0x96, 0x85, 0x55, 0xa1, 0xf2, 0x82, 0x12, 0x6e, 0x98, 0xd8, 0xe6, 0xb6, 0x36, 0x32, 0x4d, 0xe0, 0x68, 0xba, 0x3d, 0xd9, 0x8e, 0x91, 0x70, 0x47, 0x6c, 0xbd, + 0x39, 0x83, 0xf3, 0x10, 0xaa, 0x17, 0xd7, 0x3c, 0x82, 0x5c, 0xc5, 0xb5, 0x09, 0x38, 0xac, 0x74, 0xb3, 0xb1, 0x15, 0x53, 0xec, 0x70, 0x16, 0x07, 0x3f, 0x60, 0x20, 0xa7, 0xb3, 0x36, 0xc3, 0xfa, + 0x8a, 0xf5, 0xb6, 0x21, 0xd7, 0x88, 0x5a, 0xc7, 0x42, 0xb4, 0x41, 0x34, 0x22, 0x23, 0xa3, 0xec, 0xea, 0xf9, 0x8e, 0x87, 0x3f, 0x53, 0x7b, 0xc7, 0x17, 0x05, 0xba, 0xcf, 0x0f, 0xcf, 0x6b, 0x7a, + 0x32, 0x39, 0x25, 0x31, 0x7e, 0x08, 0x99, 0x37, 0xe0, 0x31, 0x84, 0xce, 0x5b, 0x19, 0x09, 0x8f, 0x6a, 0x54, 0xfb, 0x9a, 0xca, 0x46, 0x5e, 0xc8, 0xc6, 0x65, 0x60, 0xf3, 0xf8, 0xe5, 0xc5, 0xdf, + 0xde, 0xbd, 0x7f, 0x77, 0x7d, 0xfd, 0xaf, 0x1f, 0xaf, 0x2e, 0x5b, 0x44, 0x57, 0xef, 0xde, 0xfc, 0xf9, 0x62, 0x58, 0x1b, 0x8d, 0x36, 0xb0, 0x14, 0x4e, 0xd1, 0x4b, 0xd0, 0xb7, 0x8f, 0x31, 0xf4, + 0xfc, 0xf9, 0x25, 0x59, 0x9f, 0x08, 0xdb, 0xef, 0x51, 0x6d, 0x5c, 0x39, 0xf8, 0xb7, 0xb5, 0x51, 0x01, 0x02, 0xfa, 0x70, 0x77, 0x90, 0x4e, 0xe9, 0xef, 0x94, 0x56, 0xd2, 0x07, 0xcf, 0x2f, 0x51, + 0x10, 0x26, 0xb9, 0xa5, 0x10, 0xde, 0xbb, 0xf8, 0xf6, 0x58, 0x93, 0x1c, 0x6d, 0xc4, 0xef, 0x53, 0x6f, 0xb4, 0x86, 0xac, 0x7f, 0xe7, 0x79, 0x1a, 0xc0, 0xc8, 0x18, 0x12, 0x06, 0xa9, 0x1c, 0xe6, + 0xc1, 0xba, 0x26, 0xa1, 0x10, 0xb8, 0xda, 0xa4, 0x6b, 0xdf, 0x19, 0x4c, 0x55, 0xb2, 0x1c, 0xc7, 0xf0, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd2, 0x2f, 0x9b, 0xc5, 0x5e, + 0x07, 0x00, 0x00, 0x7f, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x8c, 0x53, + 0x41, 0x6f, 0xdb, 0x3c, 0x0c, 0xbd, 0xfb, 0x57, 0x3c, 0xf4, 0x3b, 0x38, 0x29, 0x5c, 0xfb, 0x9e, 0x20, 0x1f, 0x06, 0x74, 0x01, 0xba, 0x53, 0x87, 0xae, 0x1b, 0xd0, 0xa3, 0x22, 0x31, 0x91, 0x5a, + 0x5b, 0x74, 0x25, 0x39, 0x69, 0x16, 0xe4, 0xbf, 0x0f, 0xb2, 0x1c, 0x2f, 0xc1, 0x86, 0x60, 0x27, 0x1b, 0x8f, 0x7c, 0x8f, 0x8f, 0x22, 0x29, 0xd9, 0xfa, 0x80, 0x03, 0xee, 0x6b, 0xee, 0xd4, 0x72, + 0x4b, 0x36, 0xe0, 0x88, 0x05, 0x1c, 0xbd, 0x77, 0xc6, 0xd1, 0x24, 0x97, 0x11, 0xa7, 0x88, 0xfb, 0x7c, 0x3a, 0xcf, 0xb2, 0xea, 0xf6, 0x36, 0xc3, 0x2d, 0x5e, 0xb8, 0x73, 0xe7, 0x1c, 0x2d, 0xac, + 0xaa, 0x8d, 0xdd, 0x60, 0xdd, 0x59, 0x19, 0x0c, 0xdb, 0x02, 0xc6, 0x6e, 0xf9, 0x8d, 0x14, 0x76, 0x26, 0x68, 0x90, 0x90, 0xba, 0x17, 0x25, 0x1f, 0xca, 0x28, 0xf0, 0xac, 0x8d, 0x07, 0x7d, 0x88, + 0xa6, 0xad, 0x69, 0x24, 0xa1, 0xe6, 0x8d, 0x87, 0x09, 0x1e, 0xc6, 0xb6, 0x5d, 0x28, 0x20, 0xac, 0x82, 0x23, 0xdf, 0xb2, 0x55, 0x3e, 0x09, 0x89, 0xb3, 0xaa, 0x51, 0x67, 0xa7, 0x8d, 0xd4, 0x20, + 0xa9, 0x99, 0x3c, 0x82, 0x26, 0x18, 0x2b, 0xb9, 0x89, 0x4e, 0x7a, 0xd3, 0x50, 0x22, 0x88, 0x0c, 0xbd, 0xe7, 0x2f, 0x01, 0x52, 0x58, 0xac, 0xe8, 0xd2, 0x5a, 0x1e, 0xab, 0x0f, 0x50, 0x7e, 0x99, + 0x17, 0xc8, 0x87, 0x31, 0xcd, 0xb6, 0x4d, 0x0f, 0xe4, 0x83, 0xdc, 0xa7, 0x56, 0x38, 0xd1, 0xe0, 0x70, 0xcf, 0x36, 0xd0, 0x47, 0x38, 0x42, 0xa6, 0x1f, 0x88, 0xf1, 0x8f, 0x57, 0xaf, 0x24, 0x53, + 0xbf, 0xa7, 0xec, 0x04, 0x8d, 0xc9, 0xe5, 0x8a, 0xd5, 0xbe, 0xf7, 0x3d, 0x3c, 0x0e, 0x7a, 0xc0, 0xac, 0x21, 0xec, 0xfe, 0x1a, 0xef, 0xbd, 0x23, 0x97, 0x88, 0xe9, 0xcf, 0x07, 0x17, 0x9b, 0x56, + 0xe4, 0xc9, 0x19, 0x51, 0xff, 0x24, 0x05, 0xe1, 0x21, 0xec, 0xe0, 0xa1, 0xf8, 0x07, 0xc9, 0x9a, 0x37, 0x71, 0x00, 0x9b, 0xa8, 0x93, 0x62, 0xa9, 0xf3, 0x86, 0x82, 0x66, 0xe5, 0xb1, 0x66, 0x87, + 0xdc, 0xd8, 0x35, 0xe7, 0x05, 0xf2, 0x9d, 0x70, 0x36, 0x7e, 0xc9, 0x39, 0x76, 0x79, 0x01, 0x0a, 0xf2, 0x6a, 0x9f, 0x9a, 0x84, 0x22, 0x97, 0x46, 0xf4, 0xf0, 0xfc, 0xfc, 0x75, 0xec, 0x77, 0x08, + 0x9c, 0x73, 0x53, 0x2f, 0xbf, 0xb9, 0xc9, 0xc0, 0x9f, 0xd4, 0x84, 0x5f, 0x63, 0xea, 0x10, 0xda, 0x1f, 0xe4, 0x7c, 0xdc, 0xad, 0x91, 0xde, 0x3a, 0x0e, 0x2c, 0xb9, 0xc6, 0x36, 0x45, 0xa2, 0xc0, + 0x37, 0xa2, 0x19, 0x62, 0xb6, 0x9f, 0x55, 0xd5, 0xc6, 0x04, 0xdd, 0xad, 0x4a, 0xc9, 0x4d, 0xf5, 0x66, 0x45, 0x30, 0x5b, 0xaa, 0xe2, 0x8e, 0x54, 0xab, 0x9a, 0x57, 0x55, 0x23, 0x8c, 0xad, 0x14, + 0x4b, 0x5f, 0x9d, 0xb6, 0xf6, 0x2e, 0xde, 0x47, 0xcd, 0x2d, 0x39, 0x5f, 0x59, 0x56, 0xf4, 0xea, 0xcb, 0x46, 0xfd, 0x17, 0x34, 0xdd, 0x0d, 0x36, 0xee, 0xd2, 0x63, 0x5c, 0x2c, 0xcd, 0xb8, 0xc4, + 0xc7, 0x61, 0x51, 0xa3, 0xbd, 0x8b, 0xd5, 0xae, 0xb2, 0x74, 0x9b, 0xfd, 0x69, 0x11, 0x16, 0x10, 0x7e, 0x6f, 0x25, 0x26, 0x83, 0x68, 0x91, 0x78, 0x53, 0x2c, 0xfe, 0xc7, 0x21, 0x03, 0xaa, 0x0a, + 0x2f, 0x8f, 0xdf, 0x9f, 0x70, 0xff, 0xf8, 0x79, 0x89, 0x87, 0xe5, 0xd3, 0x32, 0xc3, 0xf9, 0x64, 0xcb, 0x38, 0xb8, 0xc9, 0xcd, 0x80, 0xdc, 0x14, 0xa7, 0xd8, 0x74, 0xfe, 0xd7, 0xbc, 0x5e, 0xfb, + 0xe6, 0x54, 0x63, 0x9e, 0x65, 0x80, 0xa3, 0xd0, 0x39, 0x0b, 0x4b, 0xbb, 0x33, 0x9f, 0x93, 0x58, 0x1a, 0xf0, 0xdc, 0x39, 0x49, 0x33, 0xe4, 0x7d, 0x7e, 0x99, 0x2c, 0xbb, 0xbc, 0xe8, 0x83, 0x61, + 0xdf, 0xf6, 0x21, 0xa9, 0x79, 0x40, 0xe2, 0x51, 0xce, 0x92, 0x76, 0x99, 0x0e, 0x14, 0xc7, 0xe9, 0x3c, 0x3b, 0xce, 0xb3, 0xac, 0x61, 0xd5, 0xd5, 0x54, 0xd2, 0x47, 0xcb, 0x2e, 0x78, 0x2c, 0x70, + 0x38, 0x3d, 0xc0, 0x71, 0x9e, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x18, 0x36, 0x8b, 0x30, 0x2d, 0x02, 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, + 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, + 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, + 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, + 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, + 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, + 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xbd, 0x59, 0x93, 0xbb, 0xca, 0xb2, 0x1f, 0xfa, 0xee, 0x4f, 0xb1, 0xe2, 0xff, + 0x78, 0x38, 0x6a, 0x31, 0x83, 0x4e, 0x78, 0xef, 0x7b, 0x11, 0x42, 0x42, 0x23, 0x20, 0x40, 0x0c, 0x37, 0xbc, 0x1c, 0xcc, 0x83, 0x98, 0x27, 0x09, 0xae, 0xbd, 0x3f, 0xbb, 0x43, 0x52, 0x4f, 0xea, + 0x96, 0xba, 0x69, 0xad, 0xbf, 0xbd, 0xbd, 0x1d, 0x7e, 0x6a, 0xa8, 0xa2, 0x7f, 0x88, 0xcc, 0xac, 0xac, 0xcc, 0xac, 0xac, 0xac, 0xff, 0xff, 0x3f, 0xfd, 0xf1, 0xc7, 0xaf, 0xc4, 0x88, 0x9d, 0x5f, + 0xff, 0xf1, 0xc7, 0x2f, 0xa7, 0x71, 0x92, 0x6a, 0xe0, 0x1b, 0x89, 0x1d, 0x39, 0xc5, 0xaf, 0x7f, 0x3f, 0x75, 0x35, 0x4e, 0x51, 0x06, 0x69, 0x72, 0xea, 0x05, 0x9f, 0xa0, 0x27, 0xf0, 0xd2, 0x1a, + 0xa5, 0xd6, 0xde, 0x0d, 0x22, 0x67, 0xf7, 0xda, 0x0b, 0x9f, 0xdb, 0x0b, 0x27, 0xaf, 0x83, 0xc2, 0x29, 0x7f, 0xfd, 0xc7, 0x1f, 0x55, 0x51, 0x3b, 0xe7, 0xb6, 0xcc, 0xb0, 0xf6, 0x86, 0x77, 0x6e, + 0x3b, 0xbd, 0xec, 0x8f, 0x3f, 0x7e, 0xbd, 0x5e, 0x7d, 0xf9, 0xea, 0x73, 0xf7, 0xcd, 0xd7, 0x9f, 0x7b, 0xa2, 0xc0, 0x72, 0x92, 0xf2, 0xfc, 0xbf, 0x54, 0x66, 0x58, 0xbe, 0x33, 0x80, 0xdf, 0x77, + 0xdb, 0x4e, 0xe6, 0x24, 0xb6, 0x93, 0x58, 0xc1, 0xbb, 0x37, 0x9f, 0x7b, 0xac, 0x28, 0xad, 0xed, 0xf3, 0xeb, 0x4e, 0x1d, 0xbf, 0xfe, 0x24, 0x9e, 0xc0, 0x27, 0xe8, 0xf5, 0x1f, 0xff, 0xf8, 0xe3, + 0x97, 0x6b, 0x18, 0xe5, 0x20, 0x2c, 0x07, 0x45, 0x9d, 0x54, 0xc1, 0xe5, 0xd7, 0xfd, 0x09, 0x3f, 0xc1, 0x4f, 0xf0, 0xaf, 0xe7, 0x67, 0xfe, 0xfb, 0xbb, 0xb7, 0x34, 0x93, 0xbb, 0x2f, 0x4a, 0x52, + 0xdb, 0x89, 0x2f, 0xbf, 0xfd, 0x4f, 0xe4, 0xe3, 0x4b, 0xca, 0x3a, 0x73, 0x8a, 0xca, 0x29, 0xab, 0x73, 0x37, 0xfe, 0x84, 0x5c, 0x77, 0x57, 0x46, 0x76, 0x79, 0x31, 0xfa, 0x04, 0x21, 0x4f, 0xe0, + 0xeb, 0x9b, 0xff, 0xd3, 0xbb, 0xf7, 0x9f, 0x5f, 0xf0, 0x5f, 0xe3, 0xd4, 0xae, 0x23, 0xa7, 0x1c, 0xfe, 0xbf, 0xae, 0x51, 0x56, 0x81, 0xdb, 0x0e, 0x8d, 0xb0, 0x19, 0x58, 0x69, 0x9c, 0x05, 0x27, + 0x42, 0xbe, 0xa3, 0xf4, 0x3b, 0x52, 0x22, 0x4f, 0xd8, 0x7b, 0x5a, 0x15, 0x4e, 0x99, 0x46, 0x8d, 0x63, 0x9f, 0xba, 0xfc, 0xaa, 0xca, 0xca, 0xff, 0x18, 0x0e, 0x0b, 0xc7, 0x0b, 0xca, 0xaa, 0x68, + 0x9f, 0x92, 0x2c, 0x0e, 0xcb, 0xa7, 0xb4, 0xf0, 0x6e, 0xbf, 0x61, 0x38, 0xb8, 0xba, 0x1d, 0x9c, 0xa1, 0x9f, 0x2a, 0xaf, 0x7b, 0x83, 0x0f, 0x92, 0xca, 0xf1, 0x8a, 0xa0, 0x6a, 0x4f, 0xf8, 0xa5, + 0x6f, 0x60, 0x10, 0x3c, 0x70, 0x4c, 0x93, 0xa9, 0xa2, 0x39, 0x61, 0x1f, 0xd5, 0x29, 0xd6, 0x05, 0x1b, 0xbb, 0x00, 0xb1, 0x98, 0xd3, 0xc8, 0x4d, 0x32, 0x09, 0xf8, 0x31, 0xa4, 0x36, 0x54, 0xb4, + 0x62, 0xad, 0x6a, 0x5b, 0x0d, 0xb7, 0x16, 0x40, 0x23, 0x2b, 0x9a, 0xdb, 0x29, 0x58, 0x10, 0xcb, 0x3b, 0x15, 0x88, 0xfd, 0x46, 0xf6, 0x93, 0x4d, 0x17, 0xf3, 0x63, 0xd6, 0x39, 0xc8, 0x7b, 0x6e, + 0xea, 0xcd, 0x22, 0xfa, 0xe8, 0xd9, 0x14, 0xf5, 0xb7, 0xbf, 0xf5, 0x11, 0x00, 0x23, 0x6c, 0xce, 0xa4, 0x25, 0x9f, 0xa0, 0xf7, 0x12, 0x75, 0xe9, 0x19, 0xb8, 0x69, 0x11, 0x1b, 0xcf, 0xa2, 0x01, + 0x3f, 0x41, 0x1f, 0x45, 0xa3, 0xac, 0x06, 0x75, 0x11, 0x3c, 0xf7, 0x82, 0x3f, 0xe3, 0x8c, 0xed, 0x38, 0x59, 0xec, 0x14, 0x9e, 0x73, 0x87, 0x2d, 0xd0, 0x13, 0xf2, 0x57, 0xd8, 0xf2, 0x0a, 0x3f, + 0x1c, 0xbc, 0x5d, 0x0f, 0xce, 0xa0, 0xdf, 0x33, 0x64, 0x41, 0x4a, 0x9c, 0x38, 0xce, 0x11, 0x31, 0xd5, 0xcd, 0x89, 0xbf, 0x1e, 0x01, 0xdb, 0x61, 0x4d, 0x10, 0x3e, 0x3f, 0x42, 0xbc, 0x6e, 0x58, + 0x18, 0xa1, 0x48, 0x01, 0x4b, 0x78, 0x3f, 0x6b, 0x83, 0x90, 0xcf, 0xb8, 0x2d, 0xaf, 0xc8, 0x2a, 0x2b, 0x67, 0x92, 0x11, 0x39, 0x69, 0x08, 0x8c, 0x60, 0xaa, 0x04, 0xc5, 0x51, 0xcd, 0x6f, 0x79, + 0x82, 0x0b, 0xc8, 0x79, 0xbe, 0x76, 0xc1, 0x1a, 0x28, 0x52, 0xfc, 0xc4, 0x90, 0x1e, 0x74, 0x71, 0x8a, 0x22, 0xbd, 0x2f, 0xaa, 0x7f, 0x89, 0x26, 0x67, 0xe8, 0xe1, 0xe0, 0xf2, 0x77, 0x80, 0xf4, + 0xa3, 0x85, 0x1d, 0x12, 0x4d, 0x38, 0x4f, 0x20, 0xaa, 0x20, 0xcb, 0x9d, 0x1a, 0xc2, 0x2d, 0xa5, 0x06, 0xeb, 0x0d, 0xbd, 0x98, 0xc4, 0xe2, 0x68, 0x2d, 0x8c, 0xd4, 0x75, 0x34, 0x77, 0x2c, 0x15, + 0xb6, 0xe7, 0x5d, 0xe7, 0x87, 0x22, 0x4b, 0xb7, 0xcb, 0x14, 0x9d, 0xd8, 0x6a, 0xa8, 0xae, 0x4b, 0xe2, 0xb0, 0x54, 0xe0, 0x7d, 0x88, 0xb7, 0xcd, 0x6e, 0x2b, 0x66, 0xb5, 0x10, 0x72, 0x3a, 0xa2, + 0xad, 0x0a, 0x1f, 0xc3, 0x0f, 0xfd, 0x68, 0x71, 0x96, 0xb0, 0xb0, 0x4c, 0x93, 0x41, 0x59, 0x15, 0x41, 0xe2, 0x05, 0x6e, 0xfb, 0xdd, 0x68, 0x46, 0xff, 0x1a, 0x89, 0xbe, 0x7a, 0xe3, 0x70, 0xf0, + 0x65, 0xf7, 0x00, 0xed, 0x47, 0x50, 0x43, 0xa7, 0xd4, 0x99, 0x96, 0xe2, 0x31, 0x0c, 0x4f, 0xf7, 0x50, 0xa7, 0x77, 0x8c, 0xbc, 0x1c, 0x37, 0x75, 0x35, 0xa4, 0xe7, 0x73, 0xc1, 0x19, 0x8e, 0x8d, + 0x8c, 0xe1, 0xb6, 0xc9, 0x31, 0x98, 0x60, 0x42, 0x01, 0xee, 0x79, 0x36, 0xcf, 0xe7, 0xf8, 0x68, 0x53, 0x31, 0x6b, 0x3a, 0x76, 0x08, 0xd4, 0x07, 0x8c, 0x8a, 0x80, 0x4b, 0xde, 0x37, 0xf7, 0x26, + 0xaa, 0x17, 0x2b, 0x1b, 0x52, 0x90, 0xe5, 0x76, 0xd5, 0x73, 0xb4, 0xdf, 0xf8, 0xfd, 0xe7, 0xd1, 0x8b, 0x3d, 0x11, 0xbd, 0x46, 0xaf, 0x61, 0x9a, 0x85, 0xd3, 0xdc, 0x1d, 0xb1, 0xef, 0x15, 0x44, + 0x5f, 0xd2, 0x5f, 0x20, 0x4f, 0x9a, 0xf3, 0x7c, 0x31, 0x38, 0xa3, 0x7c, 0x4f, 0xc5, 0x24, 0x71, 0x46, 0xc3, 0x79, 0x20, 0x0c, 0xfd, 0x6e, 0xee, 0x6b, 0x78, 0x66, 0x4f, 0x12, 0x73, 0x5c, 0x75, + 0xc4, 0x24, 0xe4, 0xa5, 0x65, 0xa1, 0x81, 0x20, 0x3f, 0xec, 0x1a, 0x5e, 0x8c, 0xb1, 0x8c, 0x9b, 0xee, 0x23, 0xfc, 0x58, 0xcf, 0x8a, 0x59, 0xa2, 0x26, 0xc3, 0x5d, 0x25, 0x6d, 0x36, 0xee, 0xa6, + 0xa2, 0x5c, 0x7d, 0x34, 0x84, 0xb6, 0x95, 0xe3, 0xef, 0xcb, 0x4e, 0x1e, 0xe5, 0x96, 0x14, 0x04, 0xa0, 0x70, 0x4d, 0xc5, 0xe6, 0x79, 0xe6, 0xfe, 0x8a, 0x1e, 0x69, 0x51, 0x0d, 0xac, 0x34, 0xa9, + 0x8a, 0x34, 0xfa, 0x6a, 0x8a, 0x01, 0x1f, 0x10, 0xca, 0x8f, 0xe0, 0x67, 0x1a, 0x5d, 0x37, 0x0d, 0xce, 0xc8, 0xdf, 0x53, 0xcb, 0x27, 0x23, 0x81, 0xac, 0x0c, 0x4b, 0xd7, 0x92, 0x2d, 0xd2, 0x6c, + 0x04, 0xc9, 0x0b, 0xcc, 0x10, 0xa8, 0xb8, 0x09, 0x3b, 0xc7, 0x86, 0x40, 0x04, 0xe2, 0x54, 0x0d, 0xf3, 0x56, 0x11, 0x34, 0xc3, 0x59, 0xec, 0x54, 0xa0, 0x63, 0x84, 0xa8, 0x74, 0x50, 0x58, 0x14, + 0x2a, 0xb9, 0xd1, 0x21, 0x61, 0x27, 0x81, 0x50, 0x32, 0x21, 0x34, 0xca, 0x41, 0xbb, 0xe8, 0x6c, 0xc5, 0x76, 0x28, 0xb6, 0x3a, 0x38, 0x5e, 0x3f, 0x99, 0xbb, 0x18, 0x33, 0x95, 0x51, 0x78, 0x4e, + 0x35, 0x28, 0xfd, 0x20, 0x7e, 0x96, 0xb8, 0xf7, 0xf3, 0xc5, 0x2b, 0x8c, 0x93, 0x78, 0x41, 0x72, 0xcb, 0x76, 0x38, 0xfd, 0xd3, 0xdf, 0xff, 0x86, 0x3f, 0x61, 0xbd, 0xa4, 0xb4, 0xac, 0x0a, 0xc3, + 0xaa, 0x06, 0x51, 0xea, 0x79, 0x41, 0xe2, 0xdd, 0xe1, 0x0a, 0x7c, 0x65, 0x86, 0xf4, 0xe7, 0xca, 0x35, 0xf8, 0x99, 0x2b, 0xd7, 0x4d, 0x83, 0x33, 0xf2, 0xf7, 0x5c, 0x81, 0xc7, 0xe1, 0x56, 0xd2, + 0x8f, 0x12, 0xdf, 0xf8, 0x0e, 0xd7, 0xcc, 0xcc, 0x71, 0x19, 0x4d, 0x45, 0x8d, 0x93, 0xf7, 0x05, 0x20, 0x86, 0x7c, 0xc5, 0x25, 0xc5, 0x8a, 0x47, 0x10, 0x17, 0xd8, 0xcd, 0x95, 0x55, 0xe7, 0x74, + 0x42, 0xa6, 0x5b, 0xf9, 0xce, 0x23, 0x42, 0x03, 0x59, 0xa1, 0xf6, 0x58, 0x8d, 0xbb, 0xce, 0x3b, 0x48, 0x80, 0x01, 0xc2, 0xa3, 0x70, 0x7b, 0xc4, 0x78, 0x3a, 0x40, 0x16, 0x75, 0xf0, 0xf5, 0x34, + 0x73, 0x99, 0xee, 0x6f, 0x51, 0xe3, 0x83, 0x01, 0xd0, 0x9b, 0x1c, 0x61, 0xf3, 0x6c, 0xf5, 0x5c, 0x00, 0xbe, 0xff, 0xea, 0xc3, 0xcc, 0xcb, 0x0a, 0x9b, 0x6e, 0xd6, 0x46, 0x44, 0x83, 0xe3, 0xae, + 0x52, 0x9b, 0xa0, 0x9a, 0xc0, 0x3e, 0x0d, 0xa2, 0x9a, 0xeb, 0x52, 0x4d, 0x55, 0xca, 0xc9, 0x08, 0x59, 0x98, 0x33, 0x55, 0x5b, 0x51, 0x15, 0x2d, 0x73, 0xe8, 0xd1, 0x86, 0x88, 0x98, 0xa6, 0x75, + 0xe1, 0x28, 0x73, 0xf3, 0x2a, 0x18, 0x1f, 0xf4, 0x66, 0x21, 0x5a, 0x4a, 0x4a, 0x6e, 0xe6, 0x8d, 0xb0, 0x16, 0x08, 0xa8, 0xb0, 0xb3, 0x9e, 0xb2, 0x78, 0xd6, 0x7f, 0x27, 0x73, 0x60, 0xe0, 0xe4, + 0xb5, 0x11, 0xfd, 0xba, 0x58, 0xa3, 0x1f, 0xec, 0x9a, 0x8b, 0x7e, 0xb4, 0x7c, 0x27, 0x36, 0x06, 0x55, 0x61, 0x9c, 0x68, 0x74, 0x31, 0x3f, 0xa1, 0xab, 0x61, 0xfc, 0x66, 0xe1, 0x0f, 0xdc, 0x22, + 0x8d, 0x9f, 0x35, 0xea, 0xab, 0x31, 0x04, 0xbf, 0x7f, 0xb0, 0x2e, 0x82, 0x41, 0x78, 0x31, 0xa3, 0xd0, 0xdb, 0xc6, 0xb3, 0x5b, 0x27, 0xf6, 0xb5, 0xa8, 0x9e, 0x0c, 0xdf, 0xf6, 0x62, 0xf8, 0x7a, + 0x41, 0xe5, 0xd7, 0xe6, 0x35, 0x60, 0xf4, 0x9e, 0x31, 0x97, 0x07, 0x9e, 0xac, 0x34, 0x1e, 0x96, 0x59, 0x9a, 0x94, 0x69, 0x51, 0x0e, 0x9d, 0x2c, 0x35, 0x9d, 0xc2, 0xe9, 0xf6, 0x41, 0xd2, 0x67, + 0xcc, 0x5c, 0x59, 0x7b, 0xb7, 0x87, 0xcb, 0x43, 0xea, 0xfd, 0x0d, 0xf7, 0x59, 0x4e, 0x9e, 0xef, 0x06, 0x70, 0x3f, 0x45, 0xaf, 0x1c, 0xc1, 0xe5, 0x11, 0x83, 0xfd, 0x23, 0x43, 0xd0, 0x10, 0xe9, + 0xef, 0xd7, 0x8c, 0xe7, 0x69, 0x11, 0x13, 0xb8, 0xb9, 0xa2, 0x57, 0x9a, 0xb1, 0xf5, 0xd2, 0x7a, 0x91, 0x16, 0x80, 0xb2, 0xb6, 0xf9, 0x44, 0x68, 0x99, 0x25, 0x84, 0x34, 0x1e, 0xa3, 0xb4, 0xbb, + 0x4d, 0x9d, 0x11, 0x62, 0xea, 0x38, 0xe9, 0x6a, 0x5d, 0x16, 0xe8, 0xde, 0xc5, 0x7c, 0xdc, 0xe6, 0x14, 0x08, 0x9a, 0x43, 0xd8, 0x5a, 0xee, 0x39, 0x5d, 0xbe, 0x19, 0xc7, 0x37, 0x95, 0x55, 0xe6, + 0x38, 0xc5, 0x7d, 0x8f, 0xe7, 0x87, 0xff, 0xbc, 0x76, 0x2a, 0xe3, 0x16, 0xc0, 0x5b, 0xc3, 0x1f, 0x7f, 0xfc, 0x4a, 0xb3, 0x2a, 0x48, 0x93, 0xb3, 0xe0, 0xbe, 0x4e, 0x4c, 0x7f, 0xbc, 0x32, 0xf6, + 0x6b, 0x06, 0x27, 0x6d, 0x6c, 0x54, 0x96, 0x7f, 0x77, 0x8a, 0x82, 0xde, 0x89, 0x6c, 0x6f, 0xee, 0x3e, 0x83, 0x9e, 0x58, 0xfb, 0x7c, 0x39, 0x38, 0x23, 0x7d, 0xcf, 0x57, 0x1e, 0x45, 0x1c, 0xde, + 0xe5, 0xa8, 0x79, 0x9d, 0xed, 0xbd, 0x9a, 0x95, 0x5b, 0xab, 0xb0, 0xd0, 0x7c, 0x31, 0xda, 0x77, 0xa4, 0x1e, 0xd4, 0x9c, 0x1c, 0x84, 0x06, 0x23, 0x1d, 0x54, 0x42, 0x62, 0x2b, 0x50, 0x1b, 0xce, + 0x36, 0x4b, 0xa2, 0x01, 0x0d, 0x83, 0x2c, 0x34, 0x12, 0xc2, 0x8f, 0x4a, 0xa8, 0x13, 0xc5, 0xc2, 0xa6, 0x30, 0xd5, 0x5e, 0x5b, 0xd9, 0x6e, 0x2a, 0x2d, 0xd7, 0x39, 0xb0, 0x6d, 0x14, 0xef, 0xf6, + 0x04, 0xde, 0x83, 0xd5, 0xc9, 0x49, 0x2a, 0xa3, 0xa0, 0x73, 0x06, 0x99, 0x51, 0xf9, 0xbf, 0x5e, 0xdc, 0xd4, 0xab, 0xe1, 0x9e, 0x05, 0x56, 0xfa, 0x42, 0xc3, 0xcb, 0x20, 0x47, 0x7f, 0x3c, 0x83, + 0xfd, 0x41, 0xf6, 0x19, 0x8c, 0x85, 0xe5, 0xb7, 0x77, 0xad, 0xac, 0x87, 0x6c, 0x89, 0x13, 0xe2, 0x89, 0x4b, 0xa7, 0xbf, 0x03, 0xa8, 0x9f, 0xd5, 0xa0, 0x7a, 0xc0, 0x68, 0x7b, 0xa0, 0xbd, 0x21, + 0x98, 0x21, 0x70, 0xe5, 0x2c, 0xed, 0xd9, 0x9a, 0x97, 0xf8, 0x64, 0xa7, 0x2e, 0x27, 0xe0, 0x01, 0x99, 0xb8, 0x6c, 0x32, 0x95, 0xdc, 0xc0, 0x4a, 0xbb, 0x92, 0xf2, 0xca, 0x26, 0x87, 0x55, 0x27, + 0xe1, 0x17, 0xf9, 0x70, 0xad, 0x65, 0x5d, 0x27, 0x0c, 0x1b, 0xb2, 0x2b, 0xb8, 0x76, 0x91, 0xe0, 0x93, 0x12, 0x19, 0xed, 0x28, 0x74, 0x31, 0x9f, 0x1c, 0xa6, 0x6e, 0xfe, 0xb5, 0xe9, 0x6f, 0x14, + 0x5e, 0x66, 0x5c, 0xf4, 0xed, 0x6f, 0x9c, 0xb2, 0x9f, 0x41, 0xcf, 0xdf, 0x7f, 0xb9, 0xec, 0x3b, 0x45, 0x93, 0xc0, 0x48, 0xc9, 0x1d, 0xd3, 0x9c, 0x76, 0x99, 0x3a, 0xe2, 0xb6, 0x80, 0x62, 0xe0, + 0x1c, 0x3c, 0x32, 0xca, 0x79, 0xea, 0x39, 0xdb, 0x75, 0x67, 0xcd, 0x2a, 0x6a, 0xbe, 0xb1, 0xb3, 0x35, 0xcb, 0xb6, 0x94, 0x07, 0x81, 0x2e, 0x88, 0x19, 0xe2, 0x74, 0x37, 0x36, 0x2d, 0x26, 0x9f, + 0xb9, 0x43, 0x5e, 0x3d, 0x40, 0x4c, 0x48, 0xe9, 0x40, 0x0e, 0x0f, 0x4d, 0x66, 0xec, 0x21, 0x93, 0xa6, 0x2e, 0x96, 0x88, 0xf0, 0x35, 0x09, 0x4a, 0x23, 0xfb, 0xe2, 0xf3, 0xf1, 0x9f, 0x7f, 0x7e, + 0x69, 0x64, 0xa7, 0x4f, 0x2f, 0x8d, 0xec, 0xfc, 0xd9, 0xf8, 0xf7, 0x9f, 0x3d, 0x16, 0x59, 0xc5, 0x9b, 0x88, 0x54, 0xb0, 0x2c, 0x31, 0x30, 0x85, 0xb7, 0x0e, 0x99, 0x65, 0x4d, 0x86, 0x94, 0xce, + 0x8e, 0x55, 0xc5, 0xed, 0x1a, 0x45, 0x2d, 0x5b, 0x2c, 0xa5, 0xd1, 0xd4, 0xdd, 0x30, 0xb2, 0xac, 0xaf, 0xb8, 0x99, 0xb2, 0xa3, 0xcb, 0x40, 0x31, 0xb6, 0xbc, 0xb2, 0x86, 0xf4, 0x24, 0x01, 0xe2, + 0x5c, 0x87, 0x38, 0x77, 0xa7, 0x23, 0x1d, 0x32, 0x51, 0x98, 0x4e, 0xcc, 0x08, 0x7f, 0x4b, 0xfd, 0xd8, 0xba, 0x2e, 0xdb, 0xc4, 0xda, 0x07, 0xd5, 0x1d, 0x6a, 0x80, 0x4f, 0xe8, 0x23, 0x23, 0xe1, + 0x19, 0xf4, 0x4c, 0x91, 0xcb, 0xe5, 0xe0, 0x8c, 0xf4, 0x3d, 0x55, 0x38, 0x27, 0x18, 0x71, 0x2c, 0x5a, 0x6d, 0x7d, 0x50, 0xcb, 0x65, 0x64, 0x76, 0xf4, 0x55, 0x62, 0x64, 0xaf, 0x87, 0xf1, 0x61, + 0xe7, 0x35, 0xa6, 0xbe, 0x30, 0xc4, 0x8d, 0xb1, 0xdd, 0x03, 0x66, 0xe9, 0xef, 0x43, 0x50, 0xc4, 0x2c, 0x97, 0xb5, 0x3c, 0xcd, 0xd8, 0x17, 0xce, 0x38, 0x2c, 0xd8, 0x83, 0x51, 0xa9, 0x4b, 0xb3, + 0x03, 0xe6, 0xe9, 0xdc, 0xd6, 0x56, 0xc7, 0x62, 0x19, 0xc4, 0xf0, 0x3a, 0x54, 0x1e, 0xf0, 0x39, 0xaa, 0x34, 0x0e, 0xac, 0x41, 0x19, 0x39, 0xce, 0x3d, 0x39, 0x79, 0x50, 0x47, 0xbc, 0x03, 0x3e, + 0x51, 0xe7, 0xdd, 0x6d, 0x5f, 0x8d, 0xb1, 0xdf, 0x70, 0xe1, 0x24, 0xa7, 0x7c, 0x22, 0x3b, 0x82, 0xaa, 0xb2, 0x99, 0x03, 0xa8, 0x60, 0x76, 0x69, 0xb0, 0x1d, 0x26, 0xd2, 0x9e, 0xa5, 0x94, 0x4d, + 0x6d, 0xc3, 0x75, 0x93, 0x2c, 0xf2, 0x7a, 0x02, 0x0d, 0x8f, 0x98, 0x41, 0x30, 0x82, 0xbe, 0x5e, 0x48, 0x20, 0x65, 0x75, 0xf9, 0x12, 0x14, 0x12, 0x9c, 0x48, 0xb5, 0xa1, 0x24, 0x09, 0xd0, 0xca, + 0x94, 0x97, 0x46, 0xa8, 0x67, 0x19, 0x32, 0x1f, 0x55, 0x57, 0x14, 0xfa, 0x46, 0xbd, 0x92, 0x3d, 0xc3, 0x50, 0x46, 0x63, 0x04, 0x91, 0x61, 0x46, 0xce, 0xe0, 0x64, 0x63, 0xd9, 0x03, 0xa3, 0x28, + 0x8c, 0xf6, 0x9e, 0xe5, 0x73, 0xfa, 0x78, 0xec, 0xe7, 0xe4, 0xbc, 0xf9, 0x8a, 0x13, 0x61, 0x6f, 0x76, 0x9c, 0x49, 0x8c, 0x7d, 0x4f, 0xe2, 0xc9, 0x7a, 0x02, 0x2e, 0x83, 0x0d, 0x8a, 0x3b, 0x41, + 0xe6, 0x74, 0x81, 0x28, 0x41, 0x2b, 0x9e, 0x1f, 0x8a, 0x92, 0x3b, 0x91, 0xc1, 0xb2, 0x76, 0xe7, 0xa2, 0x1a, 0x87, 0xa2, 0xd7, 0xec, 0xca, 0x54, 0x86, 0xab, 0xfc, 0x68, 0x55, 0x82, 0x43, 0x89, + 0x4e, 0xa8, 0x58, 0xee, 0xa6, 0x3a, 0x6a, 0xcb, 0x9c, 0x91, 0xd6, 0x90, 0x7c, 0x14, 0xc8, 0x32, 0x83, 0xb9, 0x42, 0x1c, 0x2b, 0x19, 0xab, 0xe1, 0xe5, 0xe1, 0x07, 0x24, 0xfe, 0xe3, 0xe6, 0xb4, + 0x77, 0xd3, 0x7e, 0xed, 0x61, 0xa5, 0x46, 0xa1, 0x6f, 0x14, 0x66, 0x2f, 0x8e, 0x35, 0x41, 0x7a, 0xd7, 0x77, 0x81, 0x1f, 0x99, 0x16, 0x4e, 0x88, 0x67, 0x7e, 0x34, 0x41, 0x3a, 0x38, 0x63, 0x7c, + 0x4f, 0x7e, 0x89, 0x8a, 0xd6, 0x5a, 0xc3, 0xd5, 0x87, 0x59, 0xbb, 0x5a, 0x22, 0xbc, 0x3b, 0x36, 0x31, 0x65, 0x39, 0x56, 0xf5, 0x58, 0xed, 0x60, 0x77, 0x47, 0x7b, 0x0d, 0x8c, 0xd8, 0x78, 0xa7, + 0x4f, 0xed, 0xc8, 0x19, 0xe6, 0x88, 0xc7, 0x87, 0xf1, 0x71, 0x6c, 0x38, 0x35, 0x0d, 0x66, 0x1a, 0x38, 0xe9, 0x4a, 0x8c, 0x57, 0xd6, 0xa2, 0xe7, 0xe6, 0x39, 0xa3, 0xef, 0x8b, 0xd6, 0x81, 0x46, + 0xb3, 0x68, 0x22, 0x79, 0x87, 0x9e, 0xe6, 0xe8, 0xb3, 0x59, 0x70, 0xc3, 0x13, 0xb1, 0x1d, 0xb3, 0xbe, 0xf8, 0x1e, 0xe8, 0xc7, 0xae, 0x93, 0xcf, 0x93, 0x3f, 0xff, 0x17, 0xfe, 0x04, 0xf5, 0x20, + 0xb5, 0x69, 0x44, 0x46, 0x62, 0x39, 0xf6, 0xe0, 0x2b, 0x83, 0x11, 0xba, 0xf2, 0x71, 0xfa, 0xd2, 0xfc, 0x1a, 0x7a, 0x38, 0xf8, 0xd0, 0x70, 0x1e, 0x04, 0x3d, 0x8c, 0x47, 0x24, 0x15, 0x1d, 0x99, + 0x03, 0xa5, 0xf5, 0x0e, 0x27, 0xfc, 0x0d, 0x44, 0xc5, 0xa6, 0x5a, 0x2e, 0xd1, 0xd6, 0xc8, 0x65, 0xa2, 0x0a, 0x03, 0x36, 0x32, 0x8f, 0xdb, 0x89, 0xce, 0x65, 0x2c, 0xb8, 0x54, 0x46, 0x00, 0xed, + 0xa8, 0xa8, 0xb9, 0xa5, 0x0c, 0x15, 0xa4, 0x92, 0x63, 0x05, 0x56, 0x47, 0x78, 0x5d, 0x64, 0xdb, 0x4c, 0x39, 0x08, 0x06, 0x7f, 0x98, 0x47, 0x73, 0x91, 0x59, 0xf8, 0x9a, 0x8c, 0xf1, 0x87, 0x9f, + 0x6a, 0x62, 0xd3, 0x28, 0x1d, 0x1c, 0xbd, 0x38, 0x76, 0xb7, 0x49, 0x84, 0x3d, 0x20, 0x96, 0xaf, 0xa8, 0x67, 0xea, 0x3c, 0x5f, 0x0f, 0xce, 0x58, 0xdf, 0x13, 0x86, 0x5a, 0x66, 0x86, 0x16, 0xb1, + 0x09, 0x59, 0xa1, 0xe2, 0xce, 0xe4, 0x58, 0xba, 0x05, 0x4c, 0x0c, 0x58, 0x2e, 0xbd, 0x66, 0x8b, 0x36, 0x45, 0x39, 0x21, 0x1b, 0xb3, 0x29, 0xcc, 0x40, 0x58, 0x64, 0x25, 0xe1, 0x2e, 0x27, 0xd2, + 0x3e, 0xdc, 0x4f, 0x8a, 0x16, 0x0f, 0x03, 0xb0, 0x90, 0x17, 0x21, 0x0d, 0xee, 0x3b, 0x73, 0xe3, 0xf0, 0xab, 0x43, 0x77, 0xcc, 0xc9, 0xa0, 0xcd, 0x52, 0x14, 0xca, 0x1d, 0xe5, 0x6a, 0xe2, 0x7e, + 0x1b, 0xe8, 0xff, 0xdf, 0xab, 0x8c, 0x5d, 0xf9, 0x28, 0x77, 0x9d, 0xd6, 0x7e, 0x0a, 0xc1, 0x75, 0x8a, 0xb4, 0x2c, 0x7f, 0xbd, 0xfe, 0xd7, 0x7f, 0xff, 0xf7, 0xaf, 0x5f, 0x93, 0x19, 0x55, 0xe1, + 0xa4, 0xc9, 0x97, 0xef, 0x39, 0x1c, 0x0e, 0x4f, 0xcf, 0xcf, 0x9d, 0x5f, 0xf6, 0xd3, 0x77, 0x58, 0x69, 0x52, 0xd6, 0x51, 0x75, 0xfa, 0xec, 0xaf, 0x5e, 0x73, 0x81, 0x3d, 0x33, 0xb1, 0xac, 0xb3, + 0x2c, 0x2d, 0xaa, 0x77, 0xaf, 0x78, 0xbe, 0xfa, 0x2f, 0x5f, 0x88, 0x53, 0xe0, 0x25, 0x75, 0x6c, 0x3a, 0xc5, 0xd3, 0x5d, 0x89, 0x1a, 0x3d, 0xe4, 0x83, 0xbf, 0x07, 0x3e, 0x09, 0xd5, 0xbb, 0xdb, + 0xc1, 0xa8, 0x9f, 0x17, 0x9e, 0xb1, 0x31, 0xba, 0x2a, 0xd7, 0x0b, 0x3c, 0xea, 0xbc, 0xcd, 0x6c, 0xe7, 0xea, 0x6c, 0xb8, 0x4e, 0x39, 0xb2, 0xb4, 0xd3, 0xad, 0xcf, 0x75, 0x1c, 0x8b, 0xae, 0x57, + 0xb1, 0x86, 0x63, 0x0b, 0x8f, 0x00, 0xcd, 0xec, 0x48, 0x2f, 0x6b, 0x2c, 0xe0, 0xd8, 0xcd, 0xa2, 0x75, 0xa7, 0x38, 0xd7, 0x36, 0xda, 0x81, 0xa8, 0xc8, 0x69, 0xe6, 0x22, 0xd8, 0xb6, 0xee, 0xe4, + 0x36, 0x4f, 0x84, 0x32, 0x24, 0x77, 0x81, 0xd7, 0x7b, 0xd6, 0xf9, 0xb7, 0x3e, 0x5a, 0x2b, 0x48, 0x8c, 0xa2, 0x1d, 0x38, 0xc7, 0xca, 0x49, 0x4e, 0xf4, 0xba, 0x1f, 0xc7, 0x80, 0x1f, 0x30, 0x8e, + 0x3e, 0xa1, 0x9f, 0x09, 0xf9, 0xa1, 0x6d, 0x70, 0xc6, 0xfe, 0x9e, 0x9a, 0xe1, 0xc4, 0xaa, 0x16, 0xc3, 0xf9, 0x4e, 0x30, 0xf5, 0x74, 0xd1, 0xee, 0x53, 0x87, 0x35, 0x7d, 0x35, 0xe3, 0xa2, 0xcd, + 0x38, 0x9f, 0x6d, 0xac, 0x83, 0xba, 0x58, 0x2e, 0x52, 0x0f, 0x85, 0x19, 0x8c, 0x9d, 0xf0, 0xf2, 0x41, 0x90, 0x44, 0x3b, 0xa4, 0x59, 0x3b, 0xf0, 0xc3, 0x10, 0x9c, 0x44, 0x89, 0xef, 0x08, 0x84, + 0x19, 0x99, 0x12, 0x6e, 0xb3, 0x9c, 0xe1, 0x6e, 0xa8, 0x40, 0x24, 0xd3, 0x54, 0x58, 0xde, 0x31, 0xaf, 0xfb, 0x11, 0xf8, 0xef, 0x7f, 0xeb, 0xe3, 0x97, 0x9a, 0x41, 0x52, 0x15, 0x8e, 0xf3, 0x95, + 0x9d, 0xf4, 0xc0, 0x94, 0xf0, 0x0c, 0x7a, 0x21, 0xe8, 0xf9, 0xb2, 0xef, 0x34, 0xb0, 0xe3, 0xd6, 0x9e, 0xb4, 0x3e, 0x84, 0x94, 0x21, 0xcf, 0x30, 0x12, 0x14, 0xd5, 0x04, 0x59, 0x19, 0xd6, 0xce, + 0x0b, 0xeb, 0xa2, 0x30, 0xd7, 0xb1, 0x43, 0xe8, 0xfa, 0x46, 0x9b, 0x89, 0xe2, 0x8e, 0x88, 0xe3, 0x4a, 0xc3, 0x05, 0x61, 0xeb, 0x83, 0x8c, 0x87, 0x64, 0x87, 0xb9, 0x95, 0x54, 0x02, 0x41, 0x4c, + 0x98, 0x62, 0x09, 0xad, 0xc0, 0xcd, 0x71, 0x6f, 0x3a, 0x55, 0x68, 0xa5, 0x6a, 0xb7, 0x3b, 0x2c, 0xbf, 0x76, 0x50, 0xcd, 0xc2, 0xb0, 0x9c, 0x81, 0x73, 0xcc, 0x8c, 0xe4, 0xf9, 0xb3, 0x6f, 0x53, + 0x02, 0x7a, 0x82, 0x1e, 0x18, 0xa8, 0xd7, 0xe0, 0x27, 0x8a, 0x5c, 0xb7, 0x5c, 0x56, 0x47, 0x7a, 0x8c, 0xd7, 0x80, 0xae, 0x79, 0x76, 0x32, 0xf5, 0x0a, 0x56, 0x25, 0x58, 0xb8, 0x61, 0xe6, 0x43, + 0xec, 0x98, 0x75, 0x20, 0xd1, 0x89, 0xec, 0x18, 0x04, 0xa5, 0xac, 0xf6, 0x72, 0x3f, 0xd6, 0xaa, 0x5d, 0xbc, 0xe6, 0x70, 0x0c, 0x22, 0x63, 0xba, 0xde, 0xae, 0x53, 0x4e, 0x9b, 0x46, 0x36, 0x33, + 0x8e, 0x40, 0x0f, 0x22, 0x89, 0xda, 0x4d, 0x3b, 0xdb, 0x60, 0x3d, 0x65, 0x69, 0x69, 0x53, 0x13, 0x87, 0xf2, 0x59, 0xf0, 0x9d, 0x84, 0xdd, 0xb7, 0x5c, 0x3e, 0x59, 0x14, 0x37, 0x4c, 0x18, 0x2b, + 0x4d, 0x2c, 0xa3, 0x1a, 0xc4, 0x67, 0xef, 0xf7, 0x17, 0x78, 0xf6, 0xf4, 0x7b, 0x88, 0xe4, 0x89, 0x40, 0xf7, 0x04, 0x12, 0x79, 0x4c, 0x20, 0xcf, 0x90, 0x2f, 0xc4, 0x2f, 0xcf, 0x6b, 0x2c, 0x3d, + 0x84, 0xd1, 0x24, 0xeb, 0x18, 0x58, 0x41, 0xdb, 0x6e, 0x8d, 0x28, 0x13, 0xb1, 0x6b, 0xfc, 0x18, 0xf7, 0xe6, 0x1d, 0xd4, 0xba, 0x92, 0x39, 0xae, 0x70, 0x4d, 0x8a, 0x2c, 0x66, 0x49, 0x35, 0x65, + 0x9c, 0xd3, 0xba, 0x3e, 0x3d, 0xa0, 0x78, 0x87, 0xc3, 0x78, 0xb4, 0x0b, 0x47, 0x21, 0xd4, 0x32, 0xbc, 0x82, 0x20, 0x2c, 0xc6, 0x02, 0xd1, 0x58, 0xc8, 0xf4, 0x35, 0x0f, 0xed, 0xc9, 0x08, 0x20, + 0x48, 0xd6, 0x00, 0x1f, 0x27, 0xb9, 0x1b, 0x44, 0xd1, 0xa0, 0x30, 0x12, 0xef, 0x12, 0xbb, 0x26, 0xae, 0xe8, 0xf9, 0x5b, 0x95, 0x42, 0xed, 0xba, 0x77, 0x57, 0xbe, 0xf0, 0x27, 0xf0, 0x09, 0xf9, + 0x39, 0x07, 0xce, 0x90, 0x27, 0x0e, 0x9c, 0x2f, 0x06, 0x67, 0x94, 0xef, 0x39, 0x30, 0x95, 0x02, 0x3a, 0xdb, 0x1c, 0xab, 0x43, 0xa0, 0xeb, 0x2c, 0xa3, 0x9b, 0x96, 0x29, 0xcd, 0x2d, 0x3d, 0x64, + 0xb6, 0xbb, 0x39, 0x9d, 0x8c, 0xda, 0x7c, 0x98, 0x4d, 0xa6, 0x7b, 0x29, 0x1a, 0x61, 0x43, 0xea, 0xd8, 0x4d, 0xa0, 0xc4, 0x18, 0x5b, 0xd5, 0x86, 0xd0, 0x38, 0x9c, 0x2c, 0x82, 0xf5, 0xd0, 0x5b, + 0x89, 0x13, 0x8d, 0x28, 0xed, 0x62, 0x6d, 0xb6, 0xa4, 0x9f, 0xba, 0xd4, 0x44, 0xab, 0xeb, 0x9c, 0xfb, 0xbf, 0xc6, 0xcf, 0x6f, 0x34, 0x7e, 0x7a, 0xc8, 0xed, 0x7b, 0xa3, 0xfa, 0xa4, 0x25, 0x3e, + 0xe4, 0x02, 0x05, 0x8e, 0xe3, 0x10, 0x18, 0xfa, 0xdc, 0x09, 0xf7, 0xd3, 0x11, 0x6d, 0xf5, 0x85, 0x8a, 0x78, 0x24, 0xee, 0x7d, 0x46, 0x3c, 0xc9, 0xe7, 0xe9, 0x6f, 0xdf, 0x88, 0xf7, 0x70, 0xe3, + 0x12, 0x52, 0xdb, 0x49, 0x47, 0x5c, 0x44, 0xda, 0xed, 0x82, 0x33, 0x39, 0x6a, 0x47, 0x8c, 0x30, 0xbc, 0x20, 0xad, 0x02, 0x06, 0xb8, 0x90, 0xa4, 0x68, 0xcc, 0xae, 0xc8, 0x83, 0xc8, 0x23, 0x63, + 0x81, 0x4a, 0x1d, 0x15, 0x23, 0x37, 0x29, 0xdb, 0xd2, 0x32, 0xc9, 0x93, 0xdd, 0x6c, 0xbf, 0x51, 0xc5, 0x2a, 0x94, 0xc4, 0x00, 0x77, 0x3b, 0x0e, 0x9f, 0x82, 0xd9, 0xd8, 0xb6, 0x34, 0x93, 0xe9, + 0x6f, 0x43, 0x9d, 0x3d, 0xf7, 0x3e, 0x03, 0xda, 0x32, 0xa2, 0x68, 0x60, 0x06, 0x89, 0xfd, 0x5b, 0xa7, 0xf9, 0x57, 0xd4, 0xe1, 0xe0, 0xed, 0xba, 0xef, 0x44, 0x4f, 0x70, 0xc0, 0xd4, 0xa4, 0x03, + 0xbf, 0x18, 0x63, 0xca, 0xcc, 0x9c, 0x6a, 0x4e, 0x69, 0x55, 0x87, 0x58, 0x5a, 0x1a, 0x0e, 0x5e, 0x70, 0xc1, 0xbc, 0x8b, 0x3b, 0x28, 0xb0, 0x0a, 0x47, 0x59, 0x00, 0xa0, 0x41, 0x11, 0xab, 0x85, + 0x5b, 0xe7, 0x3e, 0x53, 0xa6, 0xb0, 0x34, 0x4a, 0xac, 0xcc, 0x9a, 0x56, 0xdd, 0x5a, 0xa8, 0x3a, 0xd5, 0x85, 0x85, 0xd9, 0xac, 0x76, 0x94, 0xc5, 0x4c, 0xd2, 0xca, 0xbc, 0xe8, 0xb9, 0x08, 0xe4, + 0xd6, 0x89, 0x55, 0x9d, 0xe6, 0xde, 0x67, 0x92, 0x9c, 0xe4, 0xee, 0xc3, 0x8a, 0xa1, 0xe7, 0x54, 0x83, 0x93, 0xe9, 0x12, 0x24, 0x65, 0x60, 0xbd, 0xce, 0x6e, 0x7d, 0x57, 0xf9, 0x7a, 0xe8, 0x85, + 0xde, 0x51, 0x12, 0xcb, 0x4f, 0xf7, 0x81, 0x6d, 0x7c, 0x95, 0xeb, 0xf6, 0x73, 0x75, 0xfc, 0x02, 0x7a, 0xe2, 0xdc, 0xf3, 0xe5, 0x39, 0xb5, 0xad, 0x87, 0x4a, 0x9e, 0x14, 0x48, 0xe9, 0x2e, 0xb7, + 0x3c, 0x9e, 0x4a, 0x56, 0xe8, 0xc2, 0x8b, 0x58, 0x8e, 0xa7, 0x0b, 0xd7, 0xd9, 0xad, 0x1b, 0x75, 0x6c, 0x3b, 0xde, 0x71, 0x0c, 0x06, 0x3b, 0x01, 0x73, 0x4c, 0x78, 0x07, 0x81, 0xf5, 0x74, 0x21, + 0xd3, 0x94, 0x48, 0x72, 0xe3, 0x56, 0xb7, 0x77, 0x54, 0xbb, 0x33, 0xc9, 0xa3, 0xba, 0xe9, 0x90, 0x59, 0x18, 0x4a, 0x5e, 0x38, 0xda, 0xaf, 0x94, 0x52, 0x97, 0x72, 0x06, 0xdf, 0xdf, 0x71, 0xd4, + 0x7f, 0xae, 0xa5, 0x83, 0xc4, 0x0e, 0x9a, 0xc0, 0xae, 0x8d, 0xe8, 0x4b, 0xd5, 0x96, 0x19, 0x75, 0x14, 0x07, 0x51, 0x54, 0x5c, 0xf4, 0xe7, 0x05, 0x7d, 0xf8, 0x98, 0x7a, 0x7b, 0xb7, 0x0c, 0xf7, + 0xeb, 0x1f, 0xd7, 0xca, 0xe7, 0xa4, 0xfc, 0x5e, 0xac, 0x99, 0x53, 0xdf, 0x87, 0x35, 0x64, 0x2f, 0x4a, 0xcd, 0x41, 0x66, 0x14, 0x4e, 0x72, 0x4e, 0x93, 0xfc, 0x07, 0xf6, 0xf1, 0x9f, 0x83, 0x72, + 0xf0, 0xec, 0x91, 0xbc, 0x2c, 0x61, 0xfd, 0x03, 0x7e, 0xfa, 0x90, 0xd4, 0x17, 0x94, 0x83, 0x13, 0xce, 0xb9, 0x13, 0xfd, 0x98, 0x86, 0xf9, 0x79, 0x0d, 0xec, 0x1f, 0x9f, 0xd6, 0xc0, 0x0a, 0xc7, + 0xb0, 0xed, 0xa0, 0xc8, 0x9e, 0x7b, 0xf1, 0x07, 0x92, 0x38, 0xfe, 0x20, 0x9f, 0xa0, 0x9b, 0x4b, 0xa2, 0x2f, 0xab, 0x9b, 0xf7, 0xd7, 0x54, 0xdd, 0xf2, 0x2d, 0x57, 0xf5, 0x1f, 0xf0, 0x13, 0xf2, + 0x6e, 0x8c, 0x7d, 0x31, 0x26, 0xae, 0x72, 0x5c, 0x6f, 0x0d, 0x0b, 0xe2, 0x31, 0x8d, 0xf6, 0x86, 0x7b, 0x1a, 0x19, 0x6f, 0x77, 0x03, 0xa2, 0x9f, 0x56, 0x53, 0x02, 0x2e, 0x57, 0xca, 0xcd, 0x7e, + 0xad, 0xc7, 0xeb, 0xb5, 0x8e, 0x1f, 0x0d, 0x64, 0xdf, 0x1d, 0x87, 0x6b, 0x0a, 0x20, 0x81, 0x1d, 0x60, 0x61, 0xce, 0x6c, 0x2f, 0x56, 0xfa, 0xdc, 0x0a, 0xf6, 0x00, 0x7f, 0x84, 0x8f, 0x74, 0x6a, + 0xc6, 0x9d, 0x65, 0x58, 0x07, 0x88, 0xe1, 0x66, 0xad, 0xeb, 0x73, 0x13, 0x43, 0x58, 0xee, 0xe7, 0x0d, 0x29, 0x1d, 0x55, 0x8e, 0x5b, 0x75, 0x3b, 0x7c, 0x94, 0xaa, 0xd3, 0xbc, 0xa7, 0x56, 0xfb, + 0x0b, 0x79, 0x9f, 0xe7, 0xfc, 0x08, 0x33, 0xf0, 0x82, 0x8b, 0x20, 0x7e, 0xb6, 0xe4, 0xb3, 0x22, 0xb5, 0x9c, 0xf2, 0xf2, 0xdf, 0xe0, 0x09, 0x1f, 0xba, 0xea, 0xae, 0xab, 0x20, 0x7a, 0xe9, 0x83, + 0x9f, 0xd0, 0xab, 0xae, 0x3a, 0xb0, 0x9f, 0x7f, 0x16, 0x72, 0x4b, 0x7f, 0x7e, 0x23, 0x59, 0x10, 0xfe, 0xc7, 0x7f, 0xfe, 0x1b, 0xdc, 0x27, 0xfe, 0x6f, 0xa5, 0xb1, 0x19, 0x24, 0x8e, 0x3d, 0x28, + 0xab, 0xc2, 0x31, 0xe2, 0x2f, 0x66, 0x3a, 0xf2, 0xe7, 0x72, 0x71, 0x8d, 0x7d, 0x92, 0x8d, 0xeb, 0x96, 0xf3, 0xac, 0x47, 0x7e, 0x2f, 0x1f, 0x53, 0x61, 0x83, 0xae, 0xb7, 0x6e, 0xbd, 0x70, 0x58, + 0x97, 0xb0, 0xc6, 0xe6, 0x78, 0xbd, 0x98, 0xaa, 0xfe, 0x52, 0x9c, 0xe4, 0x00, 0xbc, 0xa7, 0xa8, 0x62, 0x1c, 0xc5, 0xdb, 0x71, 0x63, 0x35, 0x53, 0x06, 0x1b, 0x8f, 0x21, 0x56, 0x5f, 0xaa, 0x95, + 0x38, 0xa5, 0xc4, 0x89, 0x6f, 0x47, 0xdd, 0xa8, 0xe3, 0xb4, 0xc3, 0xd1, 0x27, 0xa3, 0x89, 0x9d, 0x34, 0xf1, 0x9a, 0x73, 0x86, 0x00, 0x66, 0xd9, 0x29, 0x63, 0x3f, 0xbe, 0x44, 0x6e, 0x3b, 0x91, + 0xd1, 0xbe, 0x27, 0xd9, 0xaf, 0x7f, 0x40, 0x0f, 0x65, 0x71, 0xf5, 0xb5, 0x43, 0xd2, 0x38, 0x36, 0x12, 0xfb, 0xae, 0x6f, 0x01, 0x3d, 0xb6, 0xcc, 0xf5, 0x0a, 0x7b, 0x61, 0xcc, 0xe5, 0x7a, 0x00, + 0xf5, 0x5c, 0xe1, 0x1a, 0xb1, 0xeb, 0x48, 0xad, 0xaa, 0xe1, 0x78, 0x93, 0x6a, 0x05, 0x99, 0xa6, 0x6d, 0x18, 0x6e, 0xb6, 0xf6, 0x3c, 0x88, 0x38, 0x69, 0xbf, 0x5b, 0xa8, 0x63, 0x60, 0xe6, 0x1f, + 0xd7, 0x52, 0xc5, 0x2d, 0x0f, 0x7b, 0x70, 0x8b, 0x86, 0x68, 0x24, 0xa2, 0x9b, 0x2c, 0xac, 0xf3, 0x78, 0x7b, 0x2c, 0xd2, 0xb1, 0x9b, 0xb8, 0x92, 0xc8, 0x0a, 0x73, 0x56, 0x18, 0x13, 0x87, 0xa2, + 0x65, 0x7d, 0xd5, 0x28, 0x36, 0x61, 0xfc, 0x93, 0x15, 0x2e, 0x08, 0xef, 0x47, 0xba, 0x2c, 0x4d, 0x9c, 0xa4, 0x1a, 0x38, 0x71, 0x50, 0x55, 0xf7, 0x49, 0xf8, 0x50, 0xb6, 0xec, 0x27, 0xf4, 0x0b, + 0x25, 0xaf, 0xdb, 0xfa, 0xe6, 0x5a, 0x6f, 0x6d, 0xa4, 0x74, 0x70, 0x61, 0x0c, 0x94, 0x1c, 0x24, 0x1d, 0x72, 0x3d, 0x2c, 0x2d, 0xa1, 0xa8, 0x8b, 0x8c, 0xe1, 0xe7, 0x2e, 0x07, 0x0e, 0x5b, 0x2d, + 0x11, 0x83, 0x04, 0x17, 0x86, 0xc5, 0x04, 0x89, 0xb9, 0xba, 0x62, 0x1b, 0xb9, 0xa0, 0x29, 0x7f, 0x51, 0x9b, 0x48, 0x31, 0x02, 0xeb, 0x8d, 0x09, 0x88, 0x8c, 0x38, 0xae, 0x19, 0x50, 0xd0, 0xd2, + 0xf1, 0x08, 0xd4, 0x6c, 0xd7, 0xa8, 0xca, 0xed, 0x1d, 0x21, 0xff, 0x8a, 0x60, 0xef, 0x82, 0x0f, 0xb7, 0x28, 0x05, 0x3e, 0x94, 0x79, 0xf0, 0x06, 0x7b, 0x26, 0xd1, 0xcb, 0xcd, 0x00, 0xec, 0x97, + 0x7d, 0x30, 0x14, 0x8b, 0x06, 0xb5, 0xcb, 0x43, 0x2b, 0x6c, 0xc6, 0x6e, 0xea, 0xcf, 0xb2, 0x6e, 0x94, 0xe2, 0x9a, 0x89, 0xcc, 0x3a, 0x44, 0x2c, 0xe4, 0x49, 0x3e, 0x66, 0xb1, 0x42, 0xaa, 0xfd, + 0xd9, 0x96, 0x30, 0xfc, 0x2a, 0x32, 0xb5, 0x65, 0xb2, 0x3b, 0x1e, 0x60, 0x93, 0x9e, 0xae, 0xb7, 0x51, 0x68, 0x50, 0x04, 0xa3, 0xb2, 0x86, 0xaa, 0x93, 0x87, 0x92, 0xb5, 0x53, 0x7b, 0xda, 0x98, + 0x7b, 0x7f, 0x19, 0xe7, 0x0f, 0xd0, 0x26, 0xdd, 0x07, 0xf7, 0x32, 0x32, 0xc0, 0x87, 0x76, 0x4f, 0x5c, 0x20, 0xcf, 0x34, 0x39, 0x5d, 0x0c, 0xc0, 0x7e, 0x1b, 0x25, 0x34, 0x1d, 0x99, 0xc9, 0x6d, + 0x32, 0x4c, 0x49, 0xcf, 0x5d, 0x2e, 0xa2, 0x24, 0x52, 0x09, 0x8f, 0x38, 0xe6, 0xa8, 0xd7, 0x72, 0x38, 0x27, 0xd6, 0xfe, 0x8c, 0x5f, 0x1a, 0xc6, 0xac, 0x2c, 0x67, 0x63, 0x38, 0xf7, 0x26, 0xb2, + 0x08, 0x7a, 0xbc, 0x57, 0x49, 0x4d, 0xda, 0xea, 0x2b, 0xa9, 0x1a, 0x51, 0x26, 0x6e, 0xd3, 0xa8, 0xef, 0x5a, 0x23, 0x7b, 0x87, 0x19, 0xc5, 0xbe, 0xb1, 0x86, 0x1c, 0x1d, 0x17, 0x3f, 0x5c, 0xfb, + 0xec, 0x37, 0xfc, 0x4e, 0x5f, 0x15, 0xde, 0x35, 0xc3, 0x4f, 0x53, 0x2a, 0xfa, 0x20, 0xd1, 0xc2, 0x8b, 0x1d, 0xfe, 0x72, 0x7d, 0x4e, 0xa3, 0x43, 0xbf, 0x27, 0xdd, 0x6a, 0x72, 0xc4, 0x53, 0xb6, + 0x58, 0x02, 0xbc, 0xdf, 0xad, 0x96, 0x0b, 0x79, 0x14, 0x62, 0x22, 0x31, 0xd4, 0x90, 0x70, 0x3d, 0x8c, 0x65, 0xb6, 0x99, 0x0c, 0x27, 0xce, 0x1c, 0x52, 0x84, 0x78, 0x91, 0xe0, 0x18, 0x1c, 0xf0, + 0x34, 0xa6, 0xa1, 0xd2, 0xb8, 0xa3, 0x47, 0x11, 0x80, 0x71, 0x6b, 0x4e, 0x8d, 0x5a, 0x49, 0xa2, 0x00, 0x31, 0xde, 0xc9, 0x7c, 0x0c, 0xb2, 0x82, 0x7c, 0xc8, 0x26, 0xd8, 0x22, 0xff, 0xf1, 0x8a, + 0x99, 0xed, 0x5c, 0x0c, 0xcb, 0xdb, 0xba, 0xe8, 0x91, 0xfc, 0xd3, 0x33, 0xe2, 0x79, 0x8f, 0x87, 0x51, 0xf9, 0xe7, 0xf0, 0xe8, 0x37, 0x72, 0x04, 0x0d, 0x28, 0x23, 0xb7, 0x84, 0x31, 0x61, 0xef, + 0x13, 0x79, 0x3a, 0x65, 0xac, 0x95, 0x17, 0x6b, 0xd8, 0x64, 0x66, 0xce, 0xac, 0xa3, 0xf7, 0x55, 0xe4, 0xf7, 0x65, 0x89, 0xf5, 0xd6, 0x6f, 0x47, 0x9f, 0x90, 0x07, 0x18, 0x7a, 0x46, 0x3c, 0xff, + 0x76, 0xb3, 0xf6, 0xce, 0xdb, 0x07, 0x7a, 0x30, 0x92, 0xdf, 0x2a, 0x53, 0xb6, 0x16, 0x65, 0xc4, 0x99, 0x54, 0xc2, 0x82, 0x6f, 0x92, 0x8d, 0x46, 0x2c, 0xac, 0xbd, 0x53, 0x41, 0x21, 0x58, 0x61, + 0x5c, 0xcd, 0x95, 0xd3, 0x8e, 0xe7, 0xbb, 0xd2, 0xd9, 0x4f, 0x30, 0x58, 0x8f, 0xc8, 0x5c, 0x76, 0xa7, 0x73, 0x9e, 0x09, 0xca, 0x83, 0x9a, 0xcf, 0x1b, 0x56, 0x99, 0xed, 0x58, 0xce, 0x53, 0x01, + 0x62, 0x36, 0x6c, 0xe8, 0xcd, 0xc6, 0x77, 0xfc, 0xc3, 0xd1, 0xdd, 0x0b, 0xfd, 0x8c, 0xc6, 0xb8, 0x7c, 0x91, 0xde, 0x9f, 0xdb, 0x66, 0x37, 0x3d, 0x85, 0xef, 0x93, 0x20, 0x9f, 0x63, 0x49, 0xe5, + 0xc0, 0x4a, 0xa3, 0xab, 0x7d, 0x31, 0xe7, 0xde, 0xbf, 0x90, 0x0f, 0x79, 0x95, 0x05, 0x7c, 0x4f, 0x1e, 0x7f, 0xae, 0xf1, 0xdf, 0x60, 0x9f, 0x37, 0x1e, 0x5d, 0x6e, 0xfa, 0x6e, 0x6b, 0x68, 0xed, + 0x91, 0x85, 0x51, 0x76, 0x90, 0xef, 0xac, 0x2d, 0xb0, 0x08, 0xad, 0x83, 0x2c, 0x98, 0xa3, 0xc9, 0xde, 0x5f, 0x58, 0x64, 0xe2, 0x6d, 0x0a, 0x70, 0x6d, 0xf8, 0xcc, 0x78, 0xd6, 0x4c, 0x82, 0xc5, + 0x81, 0xcc, 0x6a, 0xc5, 0x30, 0xe1, 0x56, 0x8f, 0x7c, 0x20, 0xd9, 0x1b, 0x25, 0x97, 0xe8, 0x3c, 0xc0, 0xcc, 0x24, 0x8a, 0xc7, 0x8b, 0x6d, 0x06, 0x2f, 0xba, 0x85, 0xbf, 0xd0, 0xbb, 0x66, 0x33, + 0x25, 0x1f, 0x37, 0xf9, 0x82, 0x72, 0x60, 0x14, 0x5e, 0x1d, 0xbf, 0xee, 0x0f, 0x84, 0xce, 0x49, 0x8f, 0xff, 0x7e, 0xf5, 0x84, 0x6d, 0x54, 0xce, 0x20, 0x35, 0x43, 0xc7, 0x7a, 0xf3, 0x07, 0xa0, + 0x0f, 0xcf, 0x14, 0x8e, 0xe7, 0x1c, 0x6f, 0x23, 0x5c, 0xfe, 0x73, 0x10, 0x94, 0xb7, 0xff, 0xf9, 0xb9, 0x7b, 0xef, 0xb4, 0x2f, 0x0f, 0x7c, 0x70, 0x47, 0xce, 0xd0, 0xd9, 0x53, 0x56, 0xa4, 0x55, + 0x7a, 0x72, 0xec, 0x9f, 0xdc, 0xc8, 0xf0, 0x5e, 0x9e, 0x85, 0x6f, 0x49, 0xdd, 0xff, 0xf4, 0x28, 0x8c, 0xed, 0xb8, 0x41, 0xe2, 0x0c, 0xb2, 0x22, 0xcd, 0x9c, 0xa2, 0x0a, 0xbe, 0x58, 0x30, 0x83, + 0x1e, 0x08, 0xc7, 0x7c, 0x42, 0x3f, 0x4b, 0xda, 0x87, 0xb6, 0xb3, 0xc0, 0xf5, 0x08, 0xd0, 0x20, 0xeb, 0xdc, 0xd5, 0x96, 0x21, 0x1c, 0xad, 0x3a, 0x7b, 0x2d, 0xba, 0xa4, 0x3e, 0xd7, 0x99, 0xe1, + 0x0e, 0xd0, 0xeb, 0x16, 0x18, 0x7b, 0x13, 0xdc, 0x85, 0x70, 0xd4, 0x21, 0x97, 0xf0, 0x81, 0xb0, 0xbd, 0x24, 0x5b, 0x52, 0xc5, 0x78, 0xe2, 0x14, 0x33, 0x2d, 0x5b, 0xa3, 0xf8, 0x5c, 0xd3, 0xac, + 0x30, 0xd9, 0xdb, 0xfc, 0x66, 0x1d, 0xf2, 0xfb, 0x11, 0x85, 0xef, 0xa6, 0x63, 0x12, 0x40, 0xc4, 0x65, 0xa4, 0xf6, 0x54, 0x27, 0x9f, 0x59, 0x7b, 0xf2, 0x08, 0x7f, 0xac, 0x59, 0xae, 0x12, 0x92, + 0xbe, 0x63, 0xca, 0x57, 0x41, 0xcd, 0x47, 0x66, 0x9f, 0x33, 0xe6, 0x2b, 0x03, 0xec, 0x3e, 0x89, 0x72, 0xd0, 0xa0, 0xd5, 0x60, 0xb3, 0x6b, 0x6c, 0xc5, 0x1e, 0x07, 0x1c, 0x23, 0x44, 0xd9, 0x74, + 0x3b, 0xd3, 0x51, 0xac, 0x74, 0xb3, 0x6c, 0xfd, 0xe3, 0x09, 0xf5, 0x83, 0x4f, 0xf6, 0x3b, 0xbf, 0xed, 0x3d, 0xf4, 0xf9, 0x13, 0xdf, 0x37, 0xf4, 0xf9, 0xd2, 0x93, 0x80, 0xe9, 0xad, 0x38, 0x21, + 0x36, 0xee, 0x08, 0x32, 0x56, 0x63, 0x70, 0x7b, 0x5c, 0xa1, 0xcb, 0x59, 0xb1, 0x64, 0xc7, 0x6a, 0x44, 0x30, 0x76, 0x09, 0x4d, 0xa8, 0x98, 0xb1, 0xad, 0x74, 0x67, 0x1c, 0xd4, 0x64, 0x35, 0x21, + 0xc4, 0x89, 0x9f, 0x6d, 0xbc, 0xaa, 0x9e, 0xcf, 0x61, 0x83, 0xda, 0x7b, 0x84, 0x41, 0x08, 0x22, 0x0a, 0x85, 0x47, 0x5e, 0xd4, 0x21, 0x22, 0x43, 0x77, 0xf6, 0x2c, 0x59, 0xb3, 0x7b, 0x64, 0x7d, + 0x27, 0x69, 0xb2, 0xaf, 0xc4, 0x5c, 0x32, 0x47, 0xfb, 0x88, 0x4c, 0x76, 0x4f, 0x5e, 0xe0, 0x07, 0x69, 0x9a, 0x5d, 0x84, 0x25, 0xb3, 0xcf, 0xa9, 0xb8, 0x3d, 0xe8, 0xe7, 0x11, 0x09, 0x8b, 0xf3, + 0xb8, 0xdd, 0x4e, 0x82, 0x74, 0x91, 0x7a, 0x14, 0x35, 0xcb, 0x8a, 0x59, 0x46, 0x57, 0xbb, 0x79, 0xbc, 0xf0, 0x33, 0x7e, 0x3f, 0x2c, 0x52, 0xba, 0xb3, 0x4d, 0xc4, 0x9d, 0xfb, 0x38, 0x34, 0x2c, + 0x87, 0x09, 0x5f, 0xba, 0x5b, 0x3c, 0x4d, 0xda, 0xf5, 0x61, 0x4f, 0x53, 0xdb, 0x21, 0x17, 0xd1, 0x48, 0x3b, 0xa6, 0xc1, 0x88, 0x11, 0x1b, 0x39, 0x15, 0x18, 0xaa, 0x2c, 0xe7, 0x3f, 0xb5, 0x79, + 0xfb, 0x78, 0xeb, 0xb6, 0xd3, 0x19, 0x91, 0x77, 0x2f, 0x43, 0xef, 0x5a, 0xeb, 0xf7, 0x27, 0xd7, 0x19, 0xf3, 0x4c, 0xb1, 0xf3, 0xd5, 0x59, 0xe8, 0x7a, 0x18, 0x49, 0x85, 0x2a, 0xf2, 0xa0, 0xe9, + 0x02, 0x58, 0x02, 0x0a, 0x69, 0x52, 0x9a, 0x80, 0xb8, 0xdb, 0xb9, 0x1b, 0x77, 0x5e, 0x06, 0x31, 0x87, 0xb2, 0x4c, 0x15, 0x27, 0xf3, 0x8c, 0x67, 0x35, 0x52, 0x80, 0x64, 0xba, 0x5b, 0x46, 0x42, + 0x31, 0x59, 0xbb, 0x76, 0x6a, 0x16, 0x64, 0xb2, 0xe0, 0xb8, 0x72, 0xeb, 0x29, 0x74, 0xbb, 0xde, 0xe6, 0x8e, 0x38, 0x16, 0xba, 0x58, 0x91, 0xd7, 0x39, 0xd1, 0x35, 0x1f, 0xd2, 0x55, 0x7e, 0x34, + 0x8d, 0x3e, 0xa7, 0x74, 0xbf, 0xec, 0x92, 0x7e, 0x37, 0x79, 0x1d, 0x0a, 0x23, 0xcb, 0xce, 0xbf, 0xbc, 0xcf, 0x42, 0x96, 0x9d, 0x56, 0x81, 0x97, 0xa4, 0xc5, 0x7d, 0x67, 0xec, 0x91, 0xc5, 0xac, + 0x57, 0xd4, 0x13, 0x9d, 0x5f, 0xae, 0x07, 0x60, 0xbf, 0x45, 0x2d, 0x79, 0x36, 0x9b, 0x29, 0xae, 0x68, 0xd4, 0x75, 0x69, 0xec, 0x16, 0x34, 0x40, 0xba, 0xde, 0x0e, 0xd8, 0xec, 0x9a, 0xb1, 0xba, + 0xa7, 0xa5, 0x78, 0xd7, 0x10, 0xe5, 0x1e, 0x4f, 0xd2, 0x70, 0xa2, 0xeb, 0x4d, 0xcd, 0xc9, 0x9b, 0x99, 0xdc, 0x82, 0xfa, 0x1e, 0x95, 0x33, 0x56, 0x98, 0xe0, 0xcc, 0x24, 0x14, 0xc1, 0x30, 0x1b, + 0x1f, 0x2c, 0x8a, 0x6e, 0x58, 0xd4, 0x49, 0xdd, 0xa6, 0xed, 0xc6, 0xd6, 0x76, 0xf2, 0x5d, 0x80, 0xff, 0x0b, 0x0b, 0x35, 0x48, 0x82, 0xb7, 0x1c, 0x03, 0xe4, 0xf6, 0x16, 0x0d, 0x33, 0x48, 0x3e, + 0x98, 0x39, 0xe7, 0x4f, 0x3e, 0xd3, 0xc9, 0x0c, 0x92, 0xe1, 0xcb, 0xed, 0xf7, 0x0c, 0x71, 0xca, 0xc1, 0xcb, 0xe6, 0xbf, 0xfb, 0x53, 0xfc, 0xe8, 0x81, 0xe4, 0xe1, 0x77, 0xc0, 0xc3, 0xc1, 0xfb, + 0xbb, 0xc1, 0x05, 0xf0, 0x7b, 0xc6, 0x50, 0x06, 0x3c, 0x83, 0x81, 0xad, 0x8d, 0x98, 0xf8, 0xfe, 0xc8, 0xc8, 0x4b, 0x69, 0x8a, 0x4a, 0x86, 0x82, 0x13, 0x56, 0x37, 0x5e, 0xb5, 0x54, 0x83, 0x74, + 0xc4, 0x8e, 0xf3, 0xb5, 0xad, 0x8c, 0x81, 0xda, 0xf8, 0x08, 0x98, 0x66, 0xa9, 0xe9, 0xa3, 0xa3, 0xc0, 0xa3, 0xd1, 0x7a, 0x63, 0x74, 0x0e, 0x5f, 0x4f, 0xa3, 0xd6, 0x54, 0xe7, 0xe0, 0x0e, 0x5d, + 0x17, 0x35, 0x9f, 0x96, 0x44, 0x2e, 0xa7, 0x98, 0xdb, 0x33, 0xb8, 0xfc, 0x7e, 0x05, 0xf1, 0x65, 0x2d, 0xec, 0x9d, 0xd0, 0x3b, 0xe5, 0xa0, 0x4a, 0x07, 0x59, 0x11, 0xc4, 0x41, 0x15, 0x34, 0xce, + 0xaf, 0xb7, 0xb5, 0xdc, 0x77, 0x0f, 0x3d, 0xb8, 0xec, 0x76, 0xe3, 0x91, 0xb2, 0x8d, 0xcd, 0x34, 0x1a, 0xd8, 0x4e, 0x69, 0x15, 0xc1, 0xd9, 0x61, 0xf8, 0x75, 0x33, 0x6c, 0xed, 0x1b, 0x6f, 0x66, + 0x08, 0xf2, 0xa1, 0xe3, 0x19, 0xe4, 0xce, 0x03, 0x27, 0xfa, 0x17, 0x89, 0x11, 0x0d, 0xca, 0x28, 0xad, 0xee, 0x3c, 0x52, 0x0e, 0x4e, 0x54, 0x31, 0xcc, 0xe8, 0xed, 0x7b, 0x3f, 0x1a, 0xd2, 0x89, + 0xe3, 0x19, 0x27, 0x82, 0x0c, 0x3a, 0xa7, 0x48, 0x5f, 0xf5, 0xc5, 0xc7, 0x35, 0x9e, 0xf7, 0xa6, 0x34, 0xf4, 0x09, 0xa3, 0xf4, 0x8d, 0xe2, 0x25, 0xa7, 0x7c, 0xf0, 0x9a, 0x9a, 0x71, 0x83, 0x09, + 0xa7, 0x67, 0xdf, 0x76, 0x2c, 0x9e, 0xba, 0x89, 0x0f, 0xdd, 0x07, 0xc7, 0xd8, 0x17, 0x8e, 0x7b, 0xfb, 0xdf, 0x5f, 0xac, 0xf6, 0xa4, 0xcc, 0xde, 0xec, 0x7e, 0x08, 0xbe, 0xa6, 0xe8, 0xb7, 0xb6, + 0xfb, 0xe5, 0x81, 0x27, 0xa3, 0x2c, 0x03, 0xef, 0xc2, 0x15, 0xf4, 0xe3, 0xaa, 0xd6, 0xe5, 0x47, 0xbe, 0x33, 0xef, 0xab, 0x22, 0x88, 0x9d, 0x77, 0xa2, 0x85, 0x7e, 0xfb, 0x74, 0x59, 0x19, 0x45, + 0x75, 0xfb, 0xf9, 0x3a, 0x31, 0xd3, 0xe3, 0x27, 0x51, 0x7c, 0x24, 0x55, 0xe6, 0x9f, 0x94, 0x16, 0xff, 0x5e, 0x51, 0x5c, 0x75, 0xbc, 0x93, 0x94, 0x7b, 0xae, 0xc7, 0xcf, 0x27, 0xe4, 0x17, 0xd0, + 0xe1, 0xe0, 0xf5, 0xf2, 0xec, 0x68, 0xf4, 0x98, 0x92, 0xf7, 0xcd, 0xd6, 0x3e, 0x4e, 0xca, 0xa3, 0x1e, 0xfa, 0x9d, 0xac, 0x82, 0x84, 0x9e, 0xac, 0x5a, 0xbb, 0x13, 0x21, 0x49, 0x1e, 0x4a, 0x8b, + 0x48, 0x92, 0x59, 0x56, 0x43, 0xb5, 0xd5, 0x8a, 0x24, 0x1c, 0x84, 0x48, 0x65, 0x0a, 0x1d, 0x4d, 0xdc, 0xfd, 0x2a, 0xf7, 0x5a, 0x60, 0x17, 0x4e, 0x53, 0x2b, 0x3d, 0xb4, 0xf0, 0xc8, 0x5a, 0x36, + 0x96, 0x18, 0xd4, 0xc0, 0x7e, 0xde, 0x10, 0x30, 0x19, 0x4a, 0xd2, 0xae, 0xe7, 0xb6, 0xdf, 0x6f, 0xf4, 0xd1, 0x69, 0x7c, 0x57, 0xe9, 0x45, 0x74, 0x2a, 0xc3, 0x7b, 0xa7, 0x1d, 0xfe, 0x75, 0x84, + 0xe0, 0x83, 0x42, 0xbd, 0xcd, 0xf2, 0x47, 0x76, 0x49, 0x7c, 0xc0, 0xbe, 0xcc, 0x46, 0xef, 0x5b, 0x06, 0x50, 0xbf, 0x9d, 0x13, 0x02, 0xcd, 0x45, 0x91, 0xa7, 0x2f, 0x2a, 0x43, 0x4e, 0x47, 0x71, + 0xa0, 0x8d, 0xad, 0x15, 0xed, 0x4b, 0xb2, 0xc1, 0x6e, 0xc2, 0xc5, 0x14, 0xe1, 0xb5, 0x12, 0xda, 0x05, 0xf6, 0x84, 0xa0, 0x0e, 0x01, 0x13, 0x42, 0x7b, 0xed, 0xb8, 0x74, 0x04, 0xc9, 0xaa, 0x56, + 0x94, 0xd3, 0x51, 0x1c, 0x8b, 0xe9, 0xcb, 0x2d, 0x0b, 0x7a, 0xf0, 0xdc, 0xe3, 0x13, 0x7c, 0x79, 0x18, 0xa3, 0x73, 0x89, 0x0c, 0xb6, 0x59, 0xd3, 0x73, 0x42, 0xfa, 0xac, 0x7d, 0x3f, 0x6b, 0xce, + 0x3e, 0x61, 0x8c, 0xcb, 0x2c, 0xf0, 0x4e, 0x8a, 0xfe, 0x55, 0x04, 0xe4, 0x46, 0x0d, 0x86, 0x5b, 0x22, 0x82, 0x3d, 0xb4, 0xca, 0xf1, 0x09, 0xfd, 0x24, 0x24, 0x1f, 0xdb, 0x06, 0x58, 0xbf, 0x35, + 0x8f, 0x60, 0x08, 0xab, 0x66, 0x22, 0x76, 0xc3, 0xfa, 0xb8, 0xa5, 0x65, 0x1c, 0xd8, 0xd8, 0xbb, 0x85, 0xb7, 0x54, 0x26, 0xd2, 0x1a, 0x85, 0x09, 0x60, 0x9d, 0x6b, 0xe6, 0x5e, 0xe8, 0x26, 0x08, + 0x0c, 0x4d, 0x6a, 0x5a, 0x58, 0xc8, 0x39, 0x57, 0x2f, 0x96, 0x73, 0x0a, 0x9c, 0xaf, 0x61, 0x40, 0x81, 0x8f, 0x95, 0xc6, 0xda, 0x4b, 0x2e, 0xd6, 0x51, 0x7b, 0x8b, 0xbb, 0xcc, 0xb1, 0xb4, 0x51, + 0x51, 0x5d, 0x01, 0xca, 0x4f, 0x16, 0xd8, 0xfa, 0x04, 0xf8, 0xbf, 0xcc, 0x26, 0x78, 0xac, 0x4a, 0xcf, 0x6b, 0x22, 0xc1, 0x73, 0x0e, 0x41, 0xcf, 0xf2, 0x3c, 0xb1, 0x70, 0x00, 0x60, 0x77, 0x2f, + 0x98, 0xd4, 0xaa, 0x13, 0x88, 0x1d, 0xb8, 0xd6, 0xc0, 0x79, 0x6e, 0x27, 0xea, 0x86, 0x73, 0xa4, 0x8a, 0x47, 0x0b, 0x30, 0xda, 0x8c, 0x3a, 0x82, 0xa2, 0x8c, 0x03, 0xad, 0x7a, 0xb9, 0x63, 0x10, + 0xe6, 0x24, 0x08, 0x60, 0x90, 0xd2, 0x8a, 0xf9, 0xb8, 0x98, 0xda, 0x43, 0xf6, 0x08, 0xae, 0x61, 0xce, 0xea, 0x70, 0x11, 0x82, 0x20, 0xda, 0x98, 0xee, 0x65, 0xcb, 0x04, 0x7f, 0x42, 0x2e, 0xf0, + 0x89, 0x7c, 0x3a, 0xf6, 0x20, 0xd9, 0xe7, 0x42, 0x62, 0xb7, 0xdd, 0x6a, 0xf8, 0x01, 0x0f, 0xe6, 0x03, 0xf6, 0xb9, 0x50, 0xcf, 0x55, 0xcb, 0x39, 0x31, 0xbf, 0x87, 0x37, 0xe3, 0x0a, 0xc9, 0xd8, + 0x39, 0xd4, 0x15, 0x6c, 0x00, 0xe6, 0x48, 0x85, 0x10, 0x59, 0xf3, 0xc3, 0x63, 0x91, 0xaf, 0x45, 0x83, 0xc4, 0x23, 0x04, 0x5c, 0x5b, 0xa4, 0x50, 0x4e, 0x17, 0xd1, 0x88, 0x07, 0x88, 0x72, 0x39, + 0xae, 0x0d, 0xbd, 0x3a, 0xaa, 0xeb, 0x03, 0x0f, 0xcf, 0x94, 0x39, 0xb1, 0x84, 0x39, 0x2a, 0xb3, 0x63, 0xfc, 0x38, 0x87, 0xd6, 0xf0, 0x84, 0x2f, 0xed, 0x4e, 0x5b, 0x91, 0xb0, 0xbd, 0x9a, 0xf6, + 0xd4, 0x51, 0xdf, 0x96, 0x62, 0x7b, 0xbf, 0x1e, 0xfe, 0xeb, 0x4f, 0xe8, 0x93, 0xfd, 0xfa, 0xb2, 0xb8, 0x72, 0x51, 0x6f, 0x9f, 0xf6, 0x80, 0xbd, 0xd4, 0xfa, 0x41, 0x9f, 0x20, 0xf2, 0x66, 0xef, + 0xa0, 0x30, 0x0e, 0x03, 0x33, 0xb5, 0x5f, 0x1e, 0xfb, 0x60, 0xcc, 0x85, 0xe5, 0xa0, 0x35, 0xe2, 0xe8, 0x05, 0xe3, 0xba, 0xf3, 0xc4, 0xea, 0x41, 0x5a, 0x0e, 0xea, 0x2a, 0x78, 0x35, 0x92, 0x91, + 0x6b, 0x8b, 0x32, 0x6d, 0x9c, 0x22, 0x4a, 0x0d, 0x7b, 0x70, 0x32, 0xce, 0x1c, 0xeb, 0x9d, 0x1d, 0x0e, 0x5f, 0x9b, 0xca, 0x59, 0x91, 0xc6, 0x03, 0x2b, 0x0a, 0x9c, 0x97, 0xfc, 0x12, 0xf4, 0xa3, + 0xd9, 0x98, 0x5f, 0x5e, 0x81, 0x3f, 0x41, 0x37, 0x57, 0x22, 0x3e, 0xf9, 0x77, 0x37, 0x8a, 0xd8, 0x9d, 0xfc, 0x3c, 0x2b, 0x0a, 0x9e, 0xc2, 0xf2, 0x87, 0x3a, 0xfc, 0x4f, 0x18, 0xfc, 0xe3, 0xbf, + 0xfd, 0xb7, 0x3f, 0xfe, 0x84, 0xc8, 0xcb, 0x9f, 0x3e, 0xea, 0xe2, 0x5c, 0x76, 0xc4, 0x4a, 0x93, 0xea, 0xac, 0x13, 0xdb, 0xcc, 0x19, 0x7c, 0xb5, 0xc9, 0xfd, 0xb1, 0x70, 0xdd, 0x9d, 0x77, 0xbc, + 0x14, 0xad, 0xfa, 0xdc, 0xd3, 0x37, 0x80, 0xa7, 0x9a, 0x16, 0xaa, 0x5a, 0x6d, 0x29, 0xab, 0x56, 0xc9, 0x63, 0x06, 0x2b, 0xcb, 0xc4, 0x26, 0x47, 0xb8, 0x43, 0xc3, 0xe6, 0x23, 0x82, 0x06, 0x94, + 0xc4, 0xdc, 0x3b, 0x73, 0xc7, 0xcd, 0x1c, 0x6d, 0xa5, 0x02, 0x45, 0xdb, 0x4d, 0x17, 0x91, 0x8c, 0x73, 0x62, 0x35, 0x5d, 0xf8, 0x25, 0xce, 0x45, 0xe0, 0x6a, 0x2f, 0xcf, 0x32, 0x6b, 0x09, 0x1c, + 0x56, 0xe0, 0xe2, 0xe0, 0xae, 0x81, 0x29, 0x2d, 0x63, 0xf3, 0xaf, 0xab, 0xd4, 0x3c, 0x97, 0x69, 0xb1, 0x4e, 0x42, 0x55, 0x17, 0xc1, 0xe0, 0x35, 0xb9, 0xe0, 0x0b, 0x8a, 0xfd, 0x7c, 0xda, 0xba, + 0xfb, 0x96, 0x17, 0x9a, 0xdd, 0xea, 0x3b, 0x53, 0xad, 0xc7, 0x34, 0xa6, 0x2c, 0xbd, 0xa5, 0xe2, 0x61, 0x8e, 0x7c, 0x6c, 0xb6, 0xfa, 0xec, 0xa0, 0x90, 0xd3, 0xc6, 0x35, 0x0d, 0x96, 0xa0, 0x54, + 0xd1, 0x87, 0xad, 0x15, 0x80, 0x84, 0x98, 0xbb, 0x9e, 0x75, 0xf2, 0x9a, 0x3e, 0x2a, 0xe3, 0x05, 0x62, 0xef, 0x10, 0x83, 0x50, 0x3a, 0xb2, 0x85, 0xdd, 0x61, 0x2d, 0x80, 0x0e, 0x32, 0xc6, 0x95, + 0x38, 0xb5, 0x27, 0x48, 0x2a, 0x62, 0x68, 0x28, 0x09, 0x23, 0x76, 0x27, 0xcd, 0xe7, 0x5e, 0x1f, 0xaa, 0x7d, 0xb3, 0xac, 0x85, 0x3c, 0xb4, 0xe6, 0xf0, 0x01, 0xfb, 0x8d, 0x42, 0xaf, 0x0b, 0x5c, + 0x48, 0xbf, 0xf5, 0x06, 0x17, 0xc9, 0x85, 0x51, 0x2a, 0xb4, 0xa3, 0x10, 0xa6, 0xfc, 0xb1, 0x33, 0x64, 0x47, 0x3b, 0x7a, 0x04, 0x1d, 0x56, 0xf1, 0x72, 0x4c, 0xd3, 0xf2, 0xd0, 0x9b, 0x70, 0xc9, + 0x72, 0x43, 0x69, 0x33, 0xcc, 0x2f, 0x0f, 0x1c, 0x31, 0x5e, 0x2d, 0x43, 0x70, 0xc4, 0x5a, 0x18, 0xab, 0x6d, 0xba, 0x91, 0x35, 0x9b, 0x03, 0xc0, 0x31, 0xca, 0x26, 0xf4, 0xdc, 0x9b, 0x18, 0x41, + 0xb5, 0x2b, 0x41, 0x84, 0x92, 0xb6, 0x24, 0xfa, 0x75, 0x41, 0x85, 0xdb, 0x45, 0xcf, 0x6e, 0x9b, 0x3f, 0xc4, 0xa3, 0x23, 0xef, 0x1a, 0xff, 0x4e, 0xa9, 0xb8, 0x33, 0xfe, 0xf7, 0x34, 0x2a, 0xc7, + 0x3b, 0x5e, 0xf2, 0x12, 0x4a, 0x2f, 0x9d, 0x55, 0x0d, 0x09, 0x5e, 0x88, 0x47, 0xb2, 0x29, 0x80, 0xac, 0x1b, 0x4e, 0x7d, 0x5d, 0x51, 0xa9, 0x38, 0xd3, 0x31, 0xca, 0x10, 0x67, 0xfb, 0x76, 0xe5, + 0x63, 0x1e, 0xa5, 0x8e, 0x3d, 0x63, 0x58, 0xf3, 0x8b, 0x50, 0xe0, 0xd9, 0x6c, 0x32, 0x0d, 0xe9, 0x91, 0x61, 0x2b, 0xf3, 0xcc, 0xe6, 0x2c, 0x7a, 0x25, 0x4e, 0x24, 0xaf, 0xd0, 0x89, 0x32, 0x49, + 0x7b, 0xae, 0xc9, 0xdc, 0xac, 0xcf, 0x78, 0x23, 0x58, 0xf2, 0x2e, 0x7f, 0xf0, 0x73, 0x4f, 0x8f, 0xba, 0x91, 0x37, 0x8a, 0x30, 0x21, 0x9f, 0x1e, 0x7a, 0x2b, 0x2e, 0xf9, 0x61, 0xba, 0x29, 0x5c, + 0xdb, 0x7a, 0x9d, 0x3c, 0xfa, 0x44, 0xf2, 0xcf, 0x70, 0x79, 0xed, 0x14, 0xed, 0x6b, 0xd0, 0xe3, 0x9e, 0x57, 0xfc, 0x88, 0xf9, 0x71, 0x0d, 0xfe, 0xc2, 0xfd, 0x77, 0x4d, 0x67, 0x2f, 0xb9, 0x87, + 0x01, 0xe2, 0xe1, 0xcb, 0x7a, 0xa9, 0xc4, 0x53, 0xd5, 0x02, 0xdd, 0xf9, 0x84, 0x54, 0x14, 0x16, 0x0c, 0x83, 0x0a, 0xf5, 0x40, 0x6a, 0x36, 0x4e, 0x17, 0x3e, 0xbd, 0x5f, 0xac, 0x4d, 0x68, 0x1b, + 0x9b, 0xa5, 0xc8, 0xc8, 0x9b, 0x46, 0x00, 0x74, 0x9a, 0x9c, 0xe0, 0xb4, 0xac, 0x03, 0xb3, 0x6a, 0x4a, 0x26, 0xeb, 0x4e, 0xe4, 0xd5, 0xc4, 0x0f, 0x1c, 0xbe, 0x6d, 0xf3, 0x3c, 0xc8, 0xba, 0xcd, + 0x86, 0x49, 0xd8, 0xb0, 0xa7, 0x97, 0xfc, 0x95, 0xd6, 0xfd, 0x18, 0x15, 0xf9, 0x86, 0xd2, 0x85, 0x63, 0xdf, 0x0f, 0x89, 0x22, 0x0f, 0x6d, 0xc0, 0x7c, 0x87, 0xfb, 0x42, 0xdf, 0xcb, 0xdd, 0x00, + 0xe9, 0xb7, 0xe9, 0xb2, 0x33, 0x24, 0xc3, 0xa6, 0xfd, 0x02, 0xd8, 0x38, 0xfb, 0xb6, 0x33, 0xa2, 0x88, 0x5a, 0xab, 0x94, 0xa4, 0xae, 0xb8, 0x2d, 0xb9, 0xde, 0x1c, 0x91, 0x2e, 0xcf, 0x74, 0x70, + 0x2d, 0x4f, 0x61, 0x63, 0xe6, 0xa2, 0x8c, 0x51, 0xf9, 0xc9, 0x0c, 0x74, 0x11, 0x78, 0xb7, 0xe2, 0x26, 0x9b, 0x48, 0x23, 0xe7, 0xf5, 0x4c, 0x43, 0xd8, 0x74, 0xcb, 0xc1, 0x2b, 0x7c, 0x88, 0xbb, + 0x62, 0xb7, 0x29, 0x57, 0x06, 0x3b, 0xff, 0xc9, 0x42, 0x4a, 0x6f, 0x4b, 0xa1, 0x34, 0x5c, 0xe7, 0x5b, 0x5d, 0xf5, 0x58, 0x39, 0xae, 0x1b, 0xf8, 0x2f, 0xd4, 0xbc, 0x6e, 0xed, 0x5d, 0x9e, 0x0b, + 0x58, 0x2e, 0x2c, 0xd8, 0x8e, 0xe7, 0xab, 0x88, 0xcf, 0xa2, 0xc9, 0x90, 0x45, 0x97, 0xa3, 0x68, 0xb4, 0xb2, 0x28, 0x96, 0x72, 0xf9, 0x8a, 0xc7, 0xc7, 0x1a, 0x89, 0xd6, 0xbb, 0x95, 0x2a, 0xe0, + 0x4c, 0x63, 0x75, 0xa3, 0x95, 0xe5, 0x21, 0x88, 0x06, 0x77, 0xd0, 0x7c, 0x67, 0x46, 0x12, 0x7e, 0xb4, 0x35, 0x0c, 0xe5, 0x55, 0x6d, 0xc7, 0x32, 0x0d, 0x00, 0x2a, 0x59, 0x4e, 0xce, 0x53, 0xbc, + 0xdb, 0xff, 0xb8, 0x52, 0xcc, 0x3b, 0x6d, 0x71, 0xcf, 0xab, 0x78, 0x50, 0xe2, 0xea, 0x22, 0x78, 0x21, 0xd0, 0x69, 0x4c, 0xf4, 0xdc, 0xe0, 0x6b, 0xcd, 0xeb, 0x72, 0x39, 0x9e, 0x57, 0xc3, 0xed, + 0x30, 0x9d, 0xe3, 0xdd, 0x10, 0x4a, 0x5a, 0xd7, 0x81, 0xa7, 0xcd, 0x6c, 0xb9, 0x93, 0x52, 0x7f, 0xb7, 0x75, 0x9b, 0x3d, 0xe7, 0x37, 0x47, 0x30, 0xa1, 0x19, 0x05, 0x38, 0xba, 0xd8, 0x26, 0xa5, + 0xd5, 0x90, 0x62, 0x2d, 0x25, 0x1b, 0x21, 0x35, 0x27, 0x8f, 0x2d, 0xbf, 0xd3, 0xac, 0xb2, 0xe1, 0xa3, 0xc2, 0xc8, 0x28, 0x5b, 0x85, 0x6a, 0x05, 0xd0, 0x66, 0xdf, 0xcf, 0xfe, 0xf7, 0xa5, 0x05, + 0x7d, 0x82, 0x1f, 0x35, 0x2a, 0xdf, 0x44, 0xe4, 0x24, 0x16, 0x17, 0xa0, 0xef, 0x29, 0xd0, 0x29, 0x4a, 0x80, 0x2d, 0x67, 0x94, 0x09, 0x69, 0x3a, 0xee, 0xb6, 0x45, 0x32, 0x4d, 0x28, 0x88, 0xa6, + 0x20, 0x46, 0x67, 0xf7, 0xb3, 0x35, 0xae, 0xd5, 0xcc, 0xca, 0x1b, 0x23, 0x42, 0x26, 0x22, 0x11, 0x1a, 0xad, 0xb6, 0x2d, 0x84, 0x2a, 0x90, 0x65, 0x41, 0xb8, 0x89, 0x2e, 0x67, 0x3c, 0x3b, 0xec, + 0x84, 0x11, 0xa9, 0xd0, 0xa2, 0x2d, 0x02, 0x12, 0x0a, 0x2d, 0xf6, 0xac, 0x86, 0x38, 0x39, 0x94, 0xf6, 0xf4, 0xa4, 0xee, 0x55, 0x7f, 0x3e, 0x4d, 0x33, 0xd8, 0xf5, 0x44, 0xf2, 0xa9, 0xec, 0xee, + 0xe9, 0x19, 0xf8, 0xce, 0x33, 0xb7, 0xa6, 0xf4, 0x2b, 0xf8, 0xeb, 0xe2, 0xb3, 0xa7, 0xb9, 0xf0, 0x73, 0x25, 0xca, 0x4b, 0x50, 0xff, 0x6a, 0x42, 0x7c, 0x29, 0x6d, 0x72, 0x9a, 0x4d, 0x3f, 0xae, + 0x82, 0xdc, 0xf5, 0x1c, 0x6e, 0xcc, 0xc9, 0xb7, 0x0d, 0x9d, 0x97, 0xea, 0xae, 0xef, 0x1f, 0x0c, 0x12, 0x7b, 0x10, 0xb7, 0x83, 0x83, 0x71, 0x79, 0x80, 0x38, 0xef, 0xe3, 0x78, 0xf7, 0x40, 0x14, + 0x78, 0x7e, 0x75, 0x7a, 0xa2, 0x70, 0xf2, 0xfa, 0xa5, 0x2e, 0x37, 0xf6, 0x34, 0xba, 0xfe, 0x71, 0x59, 0x90, 0xbc, 0xfc, 0xec, 0x8f, 0x91, 0xff, 0xe7, 0x2d, 0x00, 0x83, 0x83, 0x51, 0x24, 0x6f, + 0xdf, 0xfd, 0xf9, 0xa1, 0x63, 0x3b, 0x30, 0x6c, 0xbb, 0x78, 0xa5, 0x0b, 0x71, 0x67, 0x96, 0xff, 0x40, 0xd7, 0xd2, 0xb1, 0xea, 0xc2, 0xb9, 0x7c, 0xeb, 0x1b, 0x41, 0xe0, 0x8f, 0xdc, 0x2d, 0x9d, + 0xb8, 0x79, 0x66, 0x0d, 0xf1, 0xb1, 0xaf, 0x0a, 0x92, 0x76, 0x10, 0x15, 0xf5, 0xaf, 0x57, 0x67, 0xba, 0xef, 0xec, 0x76, 0x62, 0x7b, 0x16, 0xd5, 0xde, 0x95, 0x97, 0x79, 0x3d, 0xd8, 0x1e, 0xc9, + 0x89, 0xbd, 0x86, 0x7e, 0x37, 0xe4, 0x2e, 0x0d, 0x03, 0xb4, 0x5f, 0x8e, 0x2c, 0x31, 0x32, 0xf6, 0xe0, 0xe2, 0x68, 0xdb, 0x1c, 0x58, 0x57, 0x94, 0x4a, 0x09, 0x98, 0x65, 0x2d, 0xfd, 0xa6, 0xc4, + 0x1b, 0x15, 0x5e, 0xcf, 0x5a, 0x96, 0x5d, 0xaf, 0xcb, 0x58, 0xdf, 0x8f, 0xa9, 0x4d, 0x91, 0x23, 0xbe, 0x6a, 0x41, 0x34, 0xdb, 0x35, 0x1b, 0x9e, 0xe5, 0xac, 0x46, 0x2a, 0x77, 0x6b, 0x86, 0x8f, + 0xb0, 0x39, 0xb0, 0x91, 0x80, 0x2d, 0x87, 0x6a, 0xcb, 0xf5, 0xcc, 0xf1, 0x39, 0x57, 0xec, 0xe1, 0x78, 0x7c, 0x88, 0x1f, 0xdc, 0xd1, 0x41, 0x0f, 0xce, 0x58, 0xef, 0xc1, 0xdf, 0x11, 0xe6, 0xa5, + 0x69, 0x80, 0xf6, 0x8b, 0x40, 0x8f, 0x76, 0xbb, 0x59, 0x44, 0xd0, 0x30, 0x20, 0x43, 0x6a, 0x30, 0xe2, 0xe1, 0x94, 0x93, 0x58, 0xa5, 0x5a, 0xb4, 0x90, 0xce, 0xed, 0x3b, 0x7b, 0xc2, 0x85, 0xb6, + 0x18, 0xec, 0xc4, 0xa4, 0xf3, 0x40, 0xca, 0x1d, 0x92, 0x07, 0xcf, 0x2e, 0x33, 0x6f, 0x77, 0x5c, 0xaa, 0x89, 0x36, 0x76, 0x5a, 0x9e, 0x64, 0x67, 0x89, 0xb5, 0xc4, 0xc4, 0xa1, 0xa9, 0x2d, 0x26, + 0x39, 0x1e, 0xc1, 0x14, 0xa8, 0x71, 0xe9, 0xb8, 0xa7, 0x5d, 0xfd, 0x49, 0x70, 0x6e, 0x54, 0xea, 0xb9, 0x8a, 0xbf, 0xc0, 0x57, 0xc5, 0x63, 0xbe, 0x90, 0x79, 0xf4, 0x91, 0x75, 0x0a, 0xe8, 0xaf, + 0xa7, 0xc5, 0x31, 0x69, 0x1c, 0x7f, 0x62, 0xc5, 0xff, 0xf3, 0x1c, 0x9b, 0xfe, 0x5b, 0xdf, 0xc1, 0x94, 0xdf, 0xb7, 0xc4, 0x1f, 0x1d, 0x44, 0xf9, 0xb3, 0x88, 0xe4, 0x83, 0x0b, 0xc8, 0xf7, 0x82, + 0x71, 0x18, 0x17, 0xa9, 0x25, 0xc3, 0x2b, 0x5a, 0x55, 0x0d, 0x20, 0x52, 0xc6, 0x15, 0xb9, 0x4d, 0xe7, 0xdb, 0x09, 0x39, 0x9a, 0x06, 0x24, 0x67, 0x53, 0x63, 0x6e, 0x62, 0x0c, 0xf7, 0x4c, 0xd2, + 0x3a, 0x6d, 0x28, 0x62, 0x86, 0xce, 0x61, 0xc3, 0xd9, 0xa6, 0x99, 0x63, 0x25, 0x33, 0xdf, 0x50, 0x93, 0x9c, 0x1f, 0xfa, 0xe4, 0x1a, 0x1e, 0xc9, 0xac, 0xc4, 0xca, 0x26, 0x86, 0x94, 0x72, 0x8d, + 0xcd, 0xfd, 0xdc, 0xee, 0x59, 0xd4, 0xa9, 0x70, 0xea, 0xf2, 0x45, 0x51, 0x43, 0x4f, 0xfd, 0x52, 0xd9, 0xae, 0xf6, 0xf6, 0xdf, 0xa2, 0x1e, 0xf1, 0x58, 0x40, 0xe4, 0x15, 0xf6, 0x44, 0xc1, 0xd7, + 0x9b, 0xf3, 0x76, 0xb6, 0x1e, 0xc3, 0x2b, 0xe7, 0xd2, 0xd1, 0x14, 0xb0, 0xd7, 0x72, 0x4c, 0xc3, 0x2b, 0xcb, 0x44, 0xc7, 0xe6, 0xae, 0x49, 0x96, 0x8b, 0xa3, 0xc4, 0x87, 0x74, 0x0c, 0x6c, 0xb7, + 0x99, 0x83, 0x7a, 0x93, 0x7a, 0x56, 0x74, 0xfb, 0x15, 0x11, 0x33, 0xbb, 0x68, 0x68, 0x87, 0x9a, 0x58, 0xc3, 0x9c, 0x2d, 0xc0, 0xbc, 0x81, 0x80, 0xf0, 0x06, 0x4d, 0xf3, 0xbd, 0xe8, 0x8d, 0x82, + 0x02, 0x0f, 0x8d, 0x95, 0xb2, 0x80, 0x65, 0x71, 0x97, 0x7d, 0x97, 0xe9, 0x75, 0x9f, 0xb0, 0x55, 0xfa, 0xbc, 0x40, 0xf9, 0x56, 0x04, 0x01, 0x7b, 0x68, 0x65, 0xb7, 0x4f, 0xf6, 0xd3, 0xf5, 0x8c, + 0x7a, 0x9b, 0x25, 0xf8, 0x23, 0xae, 0xe5, 0x1b, 0xee, 0x99, 0x27, 0xaf, 0x77, 0x83, 0x33, 0xde, 0xf7, 0x4c, 0x01, 0xb9, 0x90, 0x4d, 0x20, 0x13, 0x4a, 0x68, 0x15, 0x71, 0x76, 0x66, 0x3c, 0x1a, + 0xb7, 0x0e, 0xc3, 0x06, 0xa5, 0xc5, 0x6b, 0x01, 0xbb, 0x72, 0x7d, 0x27, 0x80, 0x0e, 0x9c, 0x2c, 0x8f, 0x72, 0xd7, 0x15, 0xf6, 0xfb, 0x11, 0x79, 0x60, 0xc0, 0x55, 0x4a, 0xee, 0x8a, 0x9d, 0xe6, + 0x8a, 0xb3, 0xb5, 0x97, 0x88, 0xc9, 0xc4, 0x27, 0xf1, 0xc9, 0xd1, 0xb1, 0xed, 0x9a, 0x4a, 0xc6, 0x2e, 0x9a, 0x1c, 0x64, 0xa6, 0xa7, 0x68, 0xbb, 0xbd, 0x1d, 0xfd, 0x6b, 0xcf, 0xfc, 0x86, 0x69, + 0x73, 0x76, 0x4e, 0xce, 0xec, 0x84, 0x5f, 0x6d, 0x85, 0x9f, 0xab, 0x3d, 0xa8, 0xd7, 0xe0, 0x4a, 0x8b, 0x81, 0x63, 0xdc, 0xad, 0x7b, 0x06, 0x3e, 0x21, 0x8f, 0xc4, 0xcf, 0x9e, 0x41, 0x4f, 0x4c, + 0x7c, 0xbe, 0x1c, 0x9c, 0x91, 0xbe, 0xe7, 0x60, 0x98, 0x6b, 0xee, 0x2a, 0x23, 0xe2, 0x74, 0xd4, 0xcc, 0x5b, 0xc1, 0x25, 0xdb, 0xbd, 0x02, 0x37, 0x04, 0x05, 0xc0, 0x1b, 0x54, 0x08, 0x1d, 0xda, + 0x99, 0x63, 0xc0, 0xa4, 0x1b, 0xa9, 0x85, 0x11, 0x70, 0x50, 0xe0, 0x25, 0x24, 0x74, 0x08, 0x03, 0x96, 0x98, 0x9a, 0xa3, 0x46, 0xe4, 0x94, 0x46, 0x70, 0x37, 0x55, 0x2c, 0x1a, 0x28, 0x0b, 0x6f, + 0x53, 0x41, 0x2a, 0x0a, 0x35, 0x68, 0x6c, 0x59, 0x8f, 0x1f, 0xcf, 0xb0, 0xba, 0xb5, 0x94, 0x8a, 0xf4, 0x23, 0xeb, 0x17, 0x54, 0x85, 0x1f, 0x2a, 0xb1, 0xf8, 0x8c, 0x79, 0x21, 0xea, 0x99, 0xa6, + 0xf0, 0xf7, 0x45, 0x14, 0xa1, 0x01, 0x0d, 0xa0, 0x94, 0x3c, 0x0e, 0xea, 0x32, 0x9e, 0x08, 0x29, 0x4e, 0xe2, 0x58, 0x14, 0xda, 0x94, 0x64, 0x96, 0x33, 0x6c, 0xff, 0xa5, 0x99, 0x93, 0x16, 0xf1, + 0xc0, 0x36, 0xae, 0x76, 0x28, 0x5c, 0xdb, 0x37, 0x0f, 0xb9, 0x58, 0x2f, 0xa8, 0x97, 0xaf, 0xb8, 0x5c, 0x0f, 0xd0, 0x7e, 0xb1, 0x79, 0x46, 0x62, 0xf6, 0x91, 0x38, 0x0b, 0xb0, 0x0a, 0x14, 0xd6, + 0x7a, 0x1d, 0xa8, 0x29, 0x35, 0x14, 0xf0, 0xc6, 0x4a, 0x8e, 0xd6, 0x4a, 0xe0, 0xb1, 0xc6, 0xae, 0x3d, 0x31, 0xab, 0xa9, 0x36, 0xc0, 0xc5, 0xdd, 0x2c, 0x80, 0xad, 0x88, 0xe7, 0x33, 0xe0, 0xe8, + 0x31, 0x7e, 0xbd, 0x36, 0x58, 0x1a, 0xe8, 0x66, 0x5e, 0x82, 0x40, 0x4b, 0x1b, 0x46, 0x30, 0x05, 0xc1, 0x5c, 0x82, 0x6d, 0xf7, 0x7b, 0xe3, 0xf0, 0xb8, 0x6c, 0xbc, 0x2b, 0xd8, 0xfa, 0xeb, 0xcf, + 0xeb, 0xf2, 0xac, 0x97, 0xf5, 0xab, 0x0f, 0x7b, 0x6e, 0x2f, 0x03, 0x9d, 0x7c, 0xff, 0x50, 0x1c, 0xc4, 0x97, 0xba, 0x98, 0xef, 0x82, 0x87, 0x0f, 0x2c, 0xb3, 0xf7, 0x8a, 0xb5, 0xa4, 0x45, 0x1c, + 0xd8, 0xcf, 0x82, 0xfc, 0x1b, 0x43, 0x2c, 0xaf, 0xb0, 0xcf, 0x1c, 0xbd, 0xdc, 0xf4, 0x0d, 0xa8, 0x80, 0x8c, 0x25, 0x8e, 0x0e, 0xf4, 0x94, 0xe9, 0x56, 0x8d, 0x1b, 0xec, 0x4b, 0x22, 0x8d, 0x17, + 0x80, 0x18, 0x68, 0x0b, 0x2a, 0x98, 0x00, 0x52, 0xb7, 0x44, 0x79, 0xeb, 0x00, 0xc9, 0x91, 0x9c, 0xce, 0x12, 0x5f, 0x3e, 0x4e, 0xac, 0xf5, 0x32, 0xac, 0x40, 0x9e, 0x38, 0x92, 0x07, 0xc6, 0x04, + 0x6b, 0x9c, 0x63, 0x6b, 0x72, 0x63, 0x8e, 0x48, 0x65, 0x86, 0x24, 0xc7, 0x2a, 0x9a, 0x62, 0x34, 0x61, 0x36, 0xf2, 0xe3, 0xb3, 0xe8, 0x5b, 0x5a, 0xef, 0x8d, 0xec, 0x29, 0xdf, 0x39, 0xa6, 0x81, + 0x7d, 0x5b, 0x63, 0xa7, 0x89, 0xf5, 0xa2, 0x20, 0x3e, 0xc8, 0xc1, 0xfb, 0xd5, 0xbb, 0x07, 0xcd, 0xd0, 0x7d, 0x3a, 0x70, 0x83, 0xb3, 0x15, 0x5a, 0xd5, 0x49, 0x62, 0xed, 0x53, 0x3a, 0x2d, 0x9c, + 0xf3, 0x6e, 0xde, 0xa0, 0x2c, 0xcf, 0xb5, 0xdf, 0x7a, 0xb1, 0xff, 0x60, 0x14, 0xf6, 0xdd, 0x1d, 0x01, 0xe0, 0x63, 0x41, 0xa3, 0x17, 0xd4, 0x0b, 0xf3, 0x2f, 0xd7, 0x03, 0xb0, 0x5f, 0xd8, 0xc8, + 0xac, 0xb7, 0x33, 0xd0, 0xcd, 0xc6, 0xd5, 0x96, 0x15, 0x25, 0x9a, 0xa3, 0x44, 0x07, 0xf7, 0x27, 0x30, 0x46, 0x56, 0x4c, 0x6d, 0x4e, 0xd3, 0xed, 0xca, 0x44, 0xf5, 0x0d, 0x85, 0x6f, 0x8e, 0xeb, + 0x1d, 0xbb, 0x39, 0xc0, 0x1e, 0x67, 0x1d, 0xd8, 0x74, 0x74, 0x68, 0x0d, 0x33, 0xea, 0xd6, 0x1d, 0x47, 0x61, 0xdd, 0xe8, 0x48, 0x8d, 0x56, 0xd0, 0x72, 0x13, 0xee, 0x87, 0x9b, 0x0a, 0x5f, 0x4b, + 0x23, 0x43, 0x4b, 0x7f, 0x12, 0xa2, 0xec, 0xb9, 0xbf, 0xd1, 0x2d, 0x9f, 0x0a, 0xc7, 0x88, 0xb2, 0xaf, 0x36, 0xf3, 0x3d, 0xa4, 0x0b, 0xdf, 0x70, 0x4f, 0xe4, 0x7b, 0xbb, 0xeb, 0xb3, 0x56, 0x09, + 0x0d, 0xa6, 0x82, 0x58, 0x2d, 0xc4, 0xf5, 0x2e, 0x5c, 0x66, 0x14, 0x0c, 0xa6, 0x89, 0x4f, 0x96, 0x63, 0x61, 0x1b, 0xcb, 0xf8, 0x9e, 0xfc, 0x69, 0x3c, 0xb1, 0xfc, 0x32, 0xc3, 0xe3, 0x52, 0x79, + 0xe2, 0xe7, 0x5f, 0xf7, 0x9a, 0xe3, 0xf1, 0x72, 0x39, 0x38, 0x23, 0x7d, 0x2f, 0x18, 0xc7, 0x20, 0x5f, 0x0b, 0x5b, 0xf4, 0x48, 0x39, 0xac, 0x54, 0x8f, 0x47, 0xb5, 0x12, 0x03, 0xee, 0x74, 0x6b, + 0xcd, 0x39, 0x6f, 0x39, 0x5e, 0x07, 0xdc, 0x98, 0x07, 0x1c, 0x35, 0x68, 0x25, 0x22, 0x2c, 0xbd, 0x1d, 0x9d, 0x43, 0xe6, 0x7e, 0xd7, 0x7a, 0x15, 0x08, 0xa6, 0x94, 0x98, 0x1e, 0xc6, 0x04, 0x63, + 0x57, 0x19, 0xc7, 0x1a, 0x06, 0xef, 0x2d, 0x2b, 0x12, 0x82, 0xf9, 0x91, 0x61, 0x02, 0x93, 0xc9, 0xb7, 0x05, 0x03, 0x7d, 0xa3, 0x9c, 0x27, 0x65, 0x65, 0x44, 0x91, 0x78, 0x4e, 0x9c, 0xfd, 0xd8, + 0xff, 0x61, 0xf3, 0xdd, 0x5b, 0x7b, 0x79, 0x55, 0x79, 0xe5, 0x97, 0x6d, 0x14, 0x87, 0xb7, 0x33, 0x28, 0xfe, 0x4b, 0x3f, 0x59, 0xfc, 0x93, 0x7c, 0x82, 0xf0, 0xa7, 0xe7, 0xa5, 0x76, 0xf0, 0xe9, + 0xf9, 0xf2, 0xef, 0x7f, 0x83, 0xa0, 0x9e, 0x15, 0x9e, 0x3f, 0xe6, 0x0f, 0xdf, 0x71, 0x32, 0x1f, 0x51, 0xf0, 0xef, 0x91, 0x4f, 0xcc, 0x7c, 0x7f, 0xdf, 0x7b, 0xa3, 0xdf, 0x3c, 0x6d, 0xa8, 0x6e, + 0xad, 0xa2, 0xa3, 0x72, 0x4a, 0x6a, 0x11, 0x46, 0xba, 0x22, 0xad, 0x2c, 0xb0, 0xb2, 0x11, 0x57, 0xb5, 0x11, 0x98, 0xfc, 0x51, 0x15, 0x16, 0xd3, 0x55, 0x3c, 0xe6, 0x4c, 0xa9, 0xa6, 0x0b, 0x70, + 0xed, 0x42, 0xcb, 0x80, 0x4f, 0xb3, 0xd9, 0x7a, 0xb4, 0x09, 0xa6, 0x61, 0xa0, 0x8d, 0x69, 0xd3, 0x35, 0x0c, 0x78, 0xea, 0xe3, 0x66, 0xe1, 0x08, 0x38, 0xb5, 0xd9, 0x49, 0x73, 0xf0, 0xeb, 0x55, + 0xf5, 0x8f, 0xe9, 0xd2, 0xbf, 0x8f, 0x22, 0x57, 0xc8, 0xc3, 0xc1, 0xf5, 0x7d, 0x5f, 0x8a, 0xec, 0x15, 0xbd, 0x48, 0x76, 0x6b, 0x14, 0x16, 0xe8, 0x80, 0xa1, 0xe0, 0xb9, 0x07, 0x99, 0x33, 0xb2, + 0x0b, 0xd3, 0xf9, 0x9a, 0xf3, 0x8e, 0xca, 0x41, 0xa3, 0x19, 0x67, 0x63, 0x1f, 0x34, 0x5c, 0x6a, 0x86, 0x16, 0x27, 0x3a, 0xb3, 0xcc, 0x4a, 0x55, 0x34, 0x53, 0x59, 0x77, 0x29, 0x1f, 0x37, 0xcb, + 0x5d, 0x4a, 0x15, 0x49, 0xc1, 0x14, 0xb0, 0x33, 0x2a, 0x8b, 0x84, 0x3a, 0x1e, 0x67, 0xf3, 0xc2, 0x10, 0x47, 0x7d, 0xa3, 0x33, 0xdf, 0x27, 0x9b, 0xff, 0x28, 0x3b, 0xfc, 0x86, 0x93, 0xd9, 0x67, + 0x5a, 0xfb, 0x4b, 0x39, 0x7e, 0x77, 0x53, 0xdd, 0x7f, 0x9f, 0x7e, 0xbe, 0xfd, 0x8a, 0x67, 0x86, 0x7f, 0xee, 0xe8, 0xa3, 0xb5, 0x4f, 0x9c, 0x87, 0x99, 0xd8, 0x66, 0x21, 0xad, 0x99, 0x0b, 0x81, + 0x9e, 0x45, 0x15, 0xbd, 0xf1, 0xf6, 0x75, 0x20, 0x27, 0x6d, 0xbd, 0xef, 0x8e, 0xeb, 0xe1, 0x16, 0xdf, 0x4c, 0x16, 0x2a, 0x02, 0x2d, 0x1d, 0x64, 0x3c, 0x83, 0x36, 0x39, 0x66, 0x82, 0x22, 0xcc, + 0xfb, 0x2a, 0x36, 0x92, 0x97, 0xc1, 0xa8, 0xd1, 0x33, 0x7e, 0x22, 0xec, 0xec, 0x3c, 0x01, 0xa0, 0xb9, 0x65, 0x50, 0x87, 0xa4, 0x93, 0x24, 0xac, 0xa1, 0xc3, 0x9e, 0x3e, 0xea, 0x37, 0xa9, 0xc1, + 0xf7, 0xb6, 0x18, 0x7c, 0x62, 0xef, 0xf7, 0x13, 0xeb, 0x3f, 0x23, 0xef, 0xf3, 0xb9, 0xd6, 0xd3, 0xed, 0x78, 0x04, 0xf4, 0x2e, 0xda, 0xde, 0x5b, 0x02, 0xa2, 0xd4, 0x3c, 0xf1, 0x3b, 0x4a, 0xcd, + 0xc1, 0x19, 0xe1, 0x7b, 0xee, 0x72, 0xcd, 0x64, 0xc4, 0x6c, 0x3a, 0x7e, 0x65, 0x3a, 0x1e, 0xb3, 0x49, 0x34, 0x1e, 0x93, 0x65, 0x77, 0x31, 0x0f, 0x0a, 0xc9, 0x43, 0x01, 0xf5, 0xb0, 0x56, 0x66, + 0x86, 0xe0, 0x0a, 0x92, 0x06, 0x2e, 0x9c, 0xe4, 0xb8, 0x69, 0x9a, 0xf9, 0x92, 0x47, 0x64, 0x64, 0x58, 0x51, 0x82, 0xc8, 0xcf, 0xeb, 0x61, 0xc4, 0x1e, 0x55, 0x4d, 0xd4, 0xe3, 0x4c, 0x8d, 0x64, + 0xd6, 0xc9, 0xa9, 0xb9, 0xbd, 0xec, 0xc6, 0xab, 0xc7, 0x0d, 0xda, 0x6b, 0xdb, 0xe5, 0x86, 0xe1, 0x1a, 0x24, 0xee, 0x79, 0xf9, 0xe3, 0xd7, 0x4d, 0x93, 0x37, 0x48, 0x7c, 0xa7, 0x08, 0x2e, 0xa9, + 0x0d, 0xf0, 0xb5, 0xe3, 0xf2, 0x79, 0xe7, 0xd1, 0xbb, 0xee, 0x77, 0xe6, 0xf0, 0x87, 0xb5, 0x8c, 0xb3, 0x7d, 0x13, 0x9c, 0xd3, 0xf8, 0xd3, 0xa8, 0xae, 0xde, 0xaf, 0xed, 0xfc, 0x4c, 0xca, 0xfe, + 0xed, 0xf7, 0x09, 0x58, 0x50, 0x1a, 0x86, 0xd5, 0xc7, 0x88, 0xbe, 0x2e, 0x4a, 0x76, 0x4b, 0xce, 0xb0, 0x87, 0x52, 0x2a, 0xde, 0xe1, 0xbe, 0x88, 0xdb, 0xe5, 0x6e, 0x80, 0xf5, 0x4b, 0xa4, 0xa0, + 0xb8, 0xb9, 0x27, 0x0a, 0xb4, 0x93, 0x05, 0x0b, 0xed, 0xc0, 0x23, 0xd4, 0x36, 0x99, 0x1d, 0x01, 0x6c, 0x97, 0x48, 0x35, 0xcc, 0x8e, 0x35, 0xbb, 0x33, 0x67, 0x3c, 0x8a, 0x39, 0xab, 0x03, 0xd4, + 0x14, 0x48, 0x37, 0x46, 0x1a, 0x7d, 0xe5, 0xb4, 0x8e, 0x0d, 0x95, 0xf4, 0xc8, 0x4f, 0x4c, 0x8b, 0xb3, 0x46, 0x43, 0xb1, 0x58, 0xb7, 0x6b, 0x6c, 0xcb, 0x0b, 0xc5, 0x7e, 0xd6, 0xa1, 0x86, 0x38, + 0xd2, 0xd3, 0xc7, 0x3d, 0xe3, 0x77, 0x75, 0xd7, 0xfe, 0x44, 0x1f, 0x8a, 0x42, 0xf6, 0x72, 0x69, 0x2f, 0x93, 0xd4, 0x3d, 0x85, 0xff, 0xf3, 0xb0, 0x95, 0x6f, 0x9c, 0xac, 0xd5, 0xd3, 0x0c, 0x07, + 0xf5, 0x2b, 0xc1, 0xea, 0xc2, 0x76, 0xc3, 0x81, 0x3b, 0x19, 0xe7, 0x9c, 0x90, 0xd8, 0xee, 0x95, 0xc5, 0xac, 0x70, 0xfc, 0xd0, 0xec, 0xd6, 0x54, 0x38, 0xcd, 0xb0, 0xe1, 0x6e, 0xc9, 0x67, 0x58, + 0x25, 0x65, 0xca, 0x7c, 0x87, 0x2e, 0x58, 0x56, 0x5f, 0x42, 0xc3, 0xf1, 0xd1, 0x9c, 0x6e, 0x2b, 0x77, 0x58, 0x06, 0x14, 0x2c, 0x2a, 0x92, 0x03, 0x8e, 0x2c, 0x63, 0x12, 0xef, 0x2a, 0x4d, 0xeb, + 0x14, 0x66, 0x6e, 0x8e, 0x45, 0xb4, 0xeb, 0xa9, 0xca, 0xef, 0x4d, 0xe2, 0x3f, 0xa6, 0x74, 0xdf, 0xed, 0xc1, 0x27, 0xba, 0x5c, 0xea, 0xa0, 0x7d, 0x45, 0xf5, 0x9f, 0x9b, 0x53, 0xef, 0x70, 0x9f, + 0xa9, 0xff, 0x7c, 0xd7, 0x37, 0xf9, 0x70, 0x25, 0x8e, 0x45, 0x78, 0x15, 0x9a, 0x9b, 0xb1, 0xe4, 0xe2, 0x30, 0x49, 0x2c, 0x18, 0x93, 0xe9, 0x9a, 0x85, 0xe7, 0x56, 0xfb, 0x29, 0x96, 0x4f, 0xf7, + 0x31, 0x9d, 0x8e, 0xfc, 0xc9, 0x36, 0xa3, 0xba, 0xa5, 0x2f, 0x73, 0xd1, 0x02, 0xf0, 0x8f, 0xa4, 0x6d, 0xa3, 0xb2, 0x58, 0x82, 0xa0, 0xe8, 0x95, 0xf2, 0xe6, 0x60, 0xa1, 0x38, 0x44, 0x2c, 0x46, + 0xfb, 0x00, 0xd3, 0x2a, 0x86, 0x8e, 0xd6, 0xb0, 0xeb, 0xde, 0x29, 0x84, 0xfb, 0x33, 0xc5, 0xd2, 0x7b, 0xe6, 0xba, 0xb6, 0xaa, 0x7e, 0xab, 0x44, 0xbf, 0xe0, 0x3e, 0xd3, 0xf6, 0xf9, 0xae, 0xaf, + 0x84, 0x47, 0xc8, 0x8a, 0xae, 0xa7, 0xf8, 0xda, 0x9b, 0x6c, 0x0e, 0xd2, 0x64, 0xb9, 0xb7, 0xb5, 0x19, 0x13, 0xf8, 0x5a, 0x58, 0x61, 0xd9, 0x96, 0x37, 0x19, 0x0f, 0xc5, 0x8b, 0x2a, 0x8a, 0x13, + 0x91, 0x8f, 0x64, 0xd3, 0x8b, 0xc7, 0xe4, 0x8a, 0x9b, 0x17, 0xcb, 0x85, 0xa9, 0x69, 0xd3, 0xb1, 0x68, 0x26, 0xbc, 0xb1, 0x70, 0x8e, 0xeb, 0x65, 0x15, 0xf0, 0x1c, 0xe9, 0xc7, 0xce, 0x36, 0xdc, + 0x76, 0xb0, 0x64, 0x03, 0xd4, 0xcf, 0x7c, 0xf4, 0x7f, 0x86, 0x29, 0xf1, 0x79, 0x93, 0xd4, 0xef, 0xb3, 0x2b, 0x3f, 0x60, 0x3f, 0x33, 0xe6, 0x5d, 0x4b, 0x5f, 0x4b, 0x72, 0x3f, 0x0d, 0x2d, 0x71, + 0xe3, 0x27, 0xd1, 0x6c, 0x07, 0xed, 0xdb, 0x74, 0xb6, 0x27, 0x38, 0x75, 0x29, 0x1a, 0x07, 0x16, 0x5b, 0x70, 0xe6, 0x70, 0xd5, 0xc9, 0x16, 0x76, 0x18, 0x8d, 0x41, 0xd8, 0xe7, 0x24, 0x0e, 0xb4, + 0xdd, 0xe9, 0x36, 0x34, 0x59, 0x61, 0xd9, 0x78, 0x90, 0x8d, 0x5b, 0x2e, 0xc2, 0x9a, 0x8e, 0x1c, 0x57, 0xf2, 0x68, 0x67, 0x9a, 0x3b, 0x24, 0xef, 0x74, 0x58, 0x72, 0xfc, 0x11, 0xa1, 0xf4, 0xf4, + 0x21, 0x6e, 0xf9, 0x01, 0x0f, 0x44, 0x2e, 0xff, 0x49, 0xdc, 0x7d, 0x89, 0xe4, 0xfd, 0x46, 0xa6, 0x9e, 0x21, 0x4f, 0xbc, 0x3c, 0x5f, 0xf4, 0x65, 0xa1, 0x30, 0x5d, 0xed, 0xc0, 0xca, 0x50, 0x04, + 0x4e, 0xaf, 0x9a, 0xf9, 0x76, 0x4e, 0xd9, 0x63, 0xda, 0x77, 0xca, 0x38, 0xf5, 0xf4, 0xa2, 0xaa, 0xd5, 0x66, 0xa7, 0x94, 0x53, 0x56, 0x97, 0xf6, 0xb0, 0x28, 0x03, 0x46, 0x52, 0x66, 0xb9, 0x0e, + 0x37, 0xeb, 0x24, 0x5d, 0x79, 0xc4, 0x9c, 0x81, 0x00, 0x79, 0x0f, 0xe1, 0x1b, 0x68, 0x44, 0xf1, 0x81, 0x05, 0x8d, 0xeb, 0x29, 0x69, 0xd2, 0xa4, 0x05, 0xc7, 0xd8, 0x77, 0x5b, 0xf7, 0x7f, 0xc3, + 0x0a, 0xe0, 0x89, 0x12, 0x83, 0x73, 0x16, 0xd1, 0xfd, 0xa8, 0xd1, 0x43, 0x64, 0x7c, 0xc3, 0x3d, 0xd1, 0xf2, 0xed, 0xae, 0x6f, 0x01, 0x89, 0x69, 0x75, 0x28, 0x66, 0x43, 0xa7, 0x1e, 0x77, 0x06, + 0x13, 0x6a, 0xce, 0x36, 0xe7, 0xbc, 0xa8, 0x25, 0x66, 0x60, 0xde, 0x04, 0x81, 0x9a, 0x2e, 0x94, 0xa4, 0x61, 0x58, 0x58, 0x87, 0xb2, 0x68, 0x6c, 0xab, 0x9e, 0xd9, 0x86, 0x0d, 0x82, 0x66, 0xac, + 0x24, 0x9a, 0xa3, 0x2e, 0x75, 0xd8, 0x75, 0x3b, 0x69, 0x11, 0x04, 0x98, 0x28, 0x2d, 0xa6, 0x54, 0x23, 0x25, 0x05, 0x24, 0x79, 0x5b, 0x71, 0x9a, 0xd8, 0x73, 0x4c, 0x3c, 0x17, 0xd0, 0xf8, 0xf5, + 0xa9, 0xee, 0xc1, 0x95, 0x19, 0xfd, 0x69, 0x13, 0xaf, 0x53, 0xbd, 0x6e, 0xe0, 0x4d, 0xdd, 0x5f, 0xcf, 0x5b, 0x17, 0xaf, 0xd7, 0x03, 0x2b, 0xa3, 0xaa, 0x4b, 0xe7, 0xf5, 0xff, 0xaf, 0x5c, 0xf5, + 0x2a, 0x0d, 0x6c, 0x27, 0xa9, 0x02, 0x37, 0xb8, 0x24, 0xff, 0xdc, 0xf1, 0xc8, 0xbf, 0x1f, 0x89, 0x7d, 0xf8, 0x1e, 0x58, 0x69, 0xd2, 0x0c, 0xa2, 0xa0, 0xba, 0xb7, 0x8a, 0x70, 0xb2, 0x26, 0xe0, + 0x07, 0xb6, 0xda, 0xbe, 0xe2, 0x0e, 0x07, 0xef, 0x6e, 0x06, 0x17, 0xb8, 0xef, 0xd9, 0xde, 0x20, 0x6b, 0x35, 0xd1, 0x29, 0xab, 0x49, 0xda, 0xc3, 0x5e, 0x92, 0x19, 0x3d, 0x8d, 0xe7, 0x94, 0x55, + 0x45, 0x0e, 0xb1, 0x55, 0x55, 0xc7, 0xb1, 0xb9, 0x2d, 0x02, 0x1d, 0x0e, 0x11, 0xb1, 0x8b, 0xda, 0x54, 0xe5, 0x50, 0x21, 0x18, 0x19, 0x45, 0x23, 0x3a, 0xc9, 0x46, 0x50, 0x12, 0x07, 0x92, 0xac, + 0xed, 0xc1, 0xa7, 0x57, 0x10, 0x7b, 0x58, 0xcd, 0x61, 0xc8, 0x64, 0x72, 0x3b, 0x0b, 0xc9, 0x61, 0xdf, 0x92, 0xd9, 0xa5, 0xe1, 0x3a, 0xc5, 0xbb, 0xdd, 0xe7, 0x7f, 0xff, 0xdb, 0x1f, 0xe7, 0xa2, + 0x61, 0x7f, 0xfc, 0xe7, 0x3f, 0x90, 0x1f, 0xf3, 0x01, 0xbc, 0xae, 0x16, 0xfc, 0x05, 0x27, 0x5e, 0x4b, 0xc3, 0xdf, 0x56, 0x62, 0x8f, 0x64, 0x1f, 0x3d, 0x63, 0x9e, 0x58, 0x70, 0xb9, 0xea, 0xbb, + 0xdb, 0xd5, 0xb6, 0xda, 0xdc, 0x9f, 0x34, 0x2a, 0x44, 0xa3, 0x78, 0xa4, 0xea, 0xd6, 0x2e, 0xa7, 0xb3, 0x25, 0x30, 0xad, 0xd6, 0x5b, 0x61, 0x67, 0xcf, 0xd7, 0x1b, 0x7c, 0x38, 0x71, 0xb1, 0xb0, + 0x84, 0xbb, 0xb4, 0x96, 0xcb, 0x7c, 0x46, 0xcc, 0xf1, 0x72, 0x7a, 0x0c, 0xaa, 0x39, 0x0d, 0x10, 0x4b, 0x6d, 0x09, 0x8f, 0x96, 0xb6, 0xca, 0xad, 0x58, 0xbb, 0x1e, 0x75, 0x2b, 0xb4, 0x9c, 0x26, + 0xe9, 0x4e, 0x48, 0x72, 0xe3, 0xff, 0x9e, 0x45, 0xf0, 0x1b, 0xcf, 0x22, 0xf8, 0x42, 0x90, 0x2e, 0x15, 0x50, 0xcc, 0x76, 0x60, 0x3b, 0xae, 0x51, 0x47, 0xbf, 0x77, 0xdb, 0xd1, 0x27, 0xf4, 0x93, + 0x70, 0x7d, 0x6c, 0xeb, 0x63, 0xe9, 0x43, 0x03, 0x71, 0x9d, 0x55, 0x56, 0x63, 0xce, 0x52, 0x9c, 0xa4, 0x72, 0x03, 0x5a, 0x62, 0xa9, 0x5d, 0xa0, 0x68, 0xe0, 0x2c, 0x0f, 0xfb, 0x1f, 0x2e, 0x78, + 0xbc, 0x0b, 0x7a, 0xdc, 0xfb, 0xd2, 0x9f, 0x1f, 0x3c, 0xfa, 0x02, 0x7a, 0xfa, 0xc0, 0xe7, 0xcb, 0xf3, 0x77, 0x7d, 0x73, 0x00, 0x29, 0x34, 0x10, 0x4d, 0x28, 0x5c, 0xdb, 0xae, 0xb0, 0x12, 0x0e, + 0x8b, 0x66, 0xc1, 0x2c, 0x19, 0x56, 0xc1, 0x3d, 0x45, 0x81, 0x4c, 0xf7, 0xf6, 0x77, 0xf5, 0x50, 0x49, 0xf7, 0xe3, 0x2f, 0x3f, 0x2b, 0xc1, 0xf3, 0x6e, 0xe2, 0xba, 0x37, 0xc7, 0x3f, 0xa0, 0xeb, + 0x9f, 0x41, 0xcf, 0x84, 0xba, 0x5c, 0x9e, 0x67, 0xf7, 0x1e, 0x6a, 0x7e, 0x3f, 0x6c, 0x66, 0x86, 0x8a, 0x0e, 0xb5, 0xc8, 0x40, 0x94, 0xae, 0x5d, 0xd3, 0x8d, 0x24, 0x70, 0xaa, 0xe6, 0xcc, 0xd9, + 0x26, 0xe7, 0x96, 0x55, 0x92, 0x8f, 0xed, 0xba, 0x93, 0xd8, 0xac, 0xcb, 0x04, 0xbd, 0xa3, 0xca, 0xfd, 0x72, 0xed, 0xeb, 0xf0, 0x12, 0x60, 0x92, 0x71, 0x20, 0xae, 0x47, 0xdd, 0x4c, 0x4c, 0xe7, + 0x53, 0x67, 0x9d, 0xa9, 0xcb, 0xa3, 0x81, 0xda, 0x9a, 0xa3, 0xcf, 0x85, 0xdc, 0x39, 0x7c, 0xbd, 0x9f, 0x2a, 0xf8, 0x50, 0xed, 0xe4, 0xf7, 0x39, 0x67, 0x57, 0xc8, 0x67, 0x62, 0xbc, 0xbb, 0xef, + 0xeb, 0xa0, 0x71, 0xe0, 0x64, 0x0c, 0x2d, 0xe8, 0x61, 0xc9, 0xb7, 0x7a, 0x44, 0x58, 0xf3, 0x94, 0x20, 0x13, 0xcc, 0xde, 0x12, 0x8e, 0x2c, 0x1e, 0x0e, 0x99, 0xc6, 0x07, 0xea, 0xd6, 0x97, 0xba, + 0xcd, 0x51, 0xdf, 0x51, 0x6b, 0xb9, 0x1e, 0x93, 0x4d, 0x94, 0x6c, 0xa7, 0xed, 0xea, 0x68, 0x17, 0x3b, 0x29, 0xdd, 0x97, 0xb8, 0xca, 0xaf, 0x76, 0xc9, 0xd4, 0x35, 0x3b, 0x63, 0x67, 0x63, 0xca, + 0x2a, 0xf4, 0x3d, 0x0f, 0xe8, 0x5b, 0x67, 0xe0, 0x76, 0xb8, 0xf8, 0x4a, 0xdc, 0xee, 0xae, 0x23, 0x94, 0x81, 0xed, 0x0c, 0x2c, 0xdf, 0x48, 0x12, 0xe7, 0xad, 0xc2, 0xc0, 0x03, 0x07, 0x4c, 0xf7, + 0x4b, 0x21, 0x0c, 0x32, 0xc3, 0xb6, 0xbf, 0x38, 0x69, 0x0e, 0xba, 0x4a, 0xf6, 0xee, 0xcd, 0xc0, 0x17, 0xd4, 0x13, 0xf3, 0x5e, 0xae, 0x07, 0x67, 0xac, 0xef, 0x19, 0x07, 0x2e, 0xe7, 0x43, 0x1c, + 0x24, 0x8e, 0xe9, 0x51, 0x94, 0x52, 0x96, 0x98, 0x85, 0x1b, 0x68, 0xea, 0x8a, 0xe6, 0x2a, 0x95, 0x41, 0xc0, 0xac, 0xa4, 0xc0, 0x0a, 0x4b, 0x41, 0x54, 0x84, 0xc8, 0x1f, 0xfa, 0x7a, 0xbb, 0xdf, + 0x90, 0xcb, 0x2c, 0x5e, 0xbb, 0x44, 0xad, 0x1d, 0x78, 0x05, 0xd9, 0x02, 0xc6, 0x5e, 0xc7, 0xb7, 0xc3, 0x03, 0x44, 0xea, 0x91, 0x2a, 0xb2, 0x63, 0x4d, 0x0d, 0x34, 0x99, 0xe7, 0x90, 0x1f, 0x9e, + 0x8f, 0x02, 0xf5, 0x32, 0x34, 0xae, 0xab, 0x62, 0xde, 0x26, 0xdf, 0x23, 0xc5, 0x6c, 0xdf, 0x03, 0x5f, 0x4a, 0xac, 0xbc, 0xde, 0xf6, 0x29, 0x6d, 0x7b, 0x22, 0x22, 0x34, 0x0f, 0xd1, 0x88, 0x5b, + 0xf3, 0xd1, 0xf0, 0x38, 0xc6, 0xf6, 0xe3, 0x49, 0x42, 0xcc, 0x01, 0x13, 0xae, 0x2a, 0x7e, 0xbd, 0x34, 0xc8, 0xb2, 0xf3, 0x99, 0x79, 0xa1, 0x4e, 0x6a, 0x55, 0x98, 0x0c, 0x53, 0x07, 0x61, 0x17, + 0x2b, 0x69, 0xe5, 0xe7, 0xbe, 0x37, 0x2b, 0xb3, 0x83, 0xd7, 0xce, 0x6c, 0x7c, 0xcd, 0xb5, 0x87, 0xb1, 0x9c, 0xef, 0x1a, 0x2d, 0xb0, 0xa6, 0x04, 0x1c, 0xed, 0xbd, 0x49, 0x32, 0x67, 0x7b, 0x6e, + 0x20, 0xfb, 0xbc, 0x96, 0xf2, 0xd3, 0x10, 0xf6, 0x3f, 0xcd, 0xff, 0x0d, 0xca, 0xb7, 0x13, 0x0d, 0xee, 0xe9, 0xb3, 0x9f, 0x47, 0xb1, 0x5f, 0x51, 0x2f, 0xcc, 0xbc, 0x5c, 0xf7, 0x3d, 0xf3, 0x06, + 0x5c, 0xec, 0x30, 0x40, 0xe4, 0x68, 0x61, 0x3f, 0xb7, 0xbb, 0x70, 0xbc, 0x1c, 0x99, 0x35, 0xb5, 0xb5, 0x76, 0x24, 0x88, 0x4e, 0xec, 0x9a, 0xa0, 0x40, 0xc1, 0xa9, 0xf0, 0x92, 0x0d, 0x90, 0x69, + 0x10, 0x33, 0xa3, 0xc4, 0xc1, 0x63, 0x74, 0x3c, 0x13, 0x74, 0x77, 0x9b, 0x00, 0x1b, 0x3d, 0x50, 0xcd, 0xf1, 0x1e, 0x9d, 0xa2, 0x6a, 0xcc, 0xba, 0x13, 0x7d, 0x1e, 0x64, 0xab, 0x70, 0x94, 0xa9, + 0xa4, 0x2d, 0xfe, 0xaf, 0x0d, 0xe2, 0x7d, 0x3a, 0x91, 0xe4, 0xf6, 0x94, 0xf9, 0xe0, 0x50, 0x79, 0x07, 0xfd, 0x42, 0xdf, 0xd7, 0x86, 0x73, 0xb6, 0x55, 0x8f, 0xe1, 0xa2, 0xaf, 0x99, 0xad, 0xe6, + 0x94, 0x78, 0x36, 0x69, 0xed, 0xb6, 0x9e, 0x05, 0x76, 0xe9, 0x10, 0x5c, 0xc9, 0x1e, 0x2b, 0x73, 0x4e, 0x28, 0x3b, 0x47, 0x66, 0xd2, 0xce, 0xdb, 0x0e, 0x3d, 0xa2, 0xb0, 0xc1, 0xa3, 0x1c, 0xc4, + 0xda, 0x26, 0x6a, 0xf4, 0x2d, 0x33, 0x5c, 0xc2, 0x6b, 0x4f, 0x97, 0x42, 0xa5, 0x25, 0x60, 0x6c, 0xee, 0x3a, 0xd1, 0xca, 0xd9, 0x59, 0xcc, 0x7a, 0x44, 0xc4, 0x71, 0xb5, 0x9d, 0xa9, 0x8f, 0x2f, + 0x13, 0xdc, 0x3a, 0xc3, 0xf2, 0xd1, 0x64, 0xd7, 0x5e, 0xce, 0x6b, 0x39, 0x30, 0xd3, 0x34, 0x72, 0x8c, 0xe4, 0xad, 0xf2, 0xcd, 0x3d, 0x75, 0xf6, 0xc0, 0x6c, 0xf0, 0x11, 0xfd, 0x99, 0x4d, 0x57, + 0x6d, 0x7d, 0xd3, 0x03, 0x4c, 0xd5, 0x16, 0x94, 0x3d, 0x43, 0x8f, 0xe5, 0x39, 0x65, 0xd1, 0x7b, 0x87, 0x85, 0xea, 0xe4, 0xb0, 0x58, 0xcd, 0x33, 0x5d, 0x33, 0x0c, 0x6c, 0xd7, 0xd4, 0xad, 0x27, + 0xb6, 0xe2, 0xd0, 0x82, 0x23, 0x97, 0x80, 0x46, 0xb1, 0xb4, 0xd4, 0x27, 0x32, 0x26, 0xdb, 0x93, 0x6d, 0x94, 0xd9, 0x20, 0x24, 0x87, 0xd4, 0xc4, 0x8b, 0x15, 0x72, 0xeb, 0xe6, 0x06, 0x0f, 0xc4, + 0x5b, 0x63, 0xc7, 0xdb, 0xc5, 0x70, 0xf3, 0xb0, 0x62, 0xfb, 0x97, 0x09, 0xec, 0x5d, 0xa7, 0xeb, 0xde, 0x73, 0x8c, 0x1f, 0x30, 0x59, 0xdf, 0x70, 0x2f, 0x5c, 0x7d, 0xb9, 0x3b, 0x3b, 0xc8, 0x3d, + 0x0c, 0xd7, 0xa4, 0xac, 0x0f, 0xd5, 0x51, 0x77, 0xd7, 0x2a, 0x4e, 0x70, 0x45, 0x1b, 0x8d, 0x56, 0xb4, 0x00, 0xd4, 0x59, 0x42, 0x83, 0x3a, 0x38, 0xf6, 0xb2, 0x43, 0x52, 0x65, 0x22, 0x39, 0x8a, + 0x21, 0x76, 0x28, 0xad, 0xa6, 0x60, 0xb7, 0x71, 0x3b, 0x77, 0xb5, 0xde, 0x0d, 0x47, 0x8a, 0x31, 0xc4, 0xd7, 0x7a, 0x19, 0x82, 0x86, 0x95, 0x31, 0x21, 0xc5, 0x81, 0xcb, 0x29, 0x74, 0x94, 0x70, + 0xdd, 0x5e, 0x45, 0x23, 0xec, 0x87, 0xb9, 0x6e, 0xff, 0x24, 0x86, 0x5c, 0x57, 0x9a, 0xba, 0x37, 0xdd, 0x3c, 0xc4, 0x93, 0x77, 0xd0, 0x17, 0xb6, 0xbc, 0x6b, 0xe8, 0x5b, 0x3c, 0x75, 0x68, 0xa2, + 0xfa, 0xae, 0x9c, 0x11, 0x3a, 0xa6, 0xee, 0xaa, 0xf9, 0xb1, 0x1c, 0xfa, 0x23, 0x85, 0x4c, 0x1a, 0x77, 0xe5, 0x89, 0x54, 0xbb, 0xd4, 0xec, 0x6a, 0xa6, 0x08, 0x2b, 0x33, 0x6f, 0xf1, 0x90, 0x82, + 0x02, 0x2b, 0xf6, 0x42, 0x97, 0x54, 0xe8, 0x54, 0x5a, 0x7a, 0x8e, 0x88, 0x1e, 0x5a, 0xac, 0xd2, 0x0c, 0xde, 0xe1, 0xd3, 0xba, 0x9b, 0xae, 0xa9, 0x8d, 0x99, 0x84, 0x23, 0xd4, 0x82, 0xf5, 0x7f, + 0x85, 0x15, 0x8e, 0xa0, 0x3c, 0x29, 0xde, 0x2f, 0x52, 0x26, 0x1e, 0xcb, 0x07, 0x7e, 0x83, 0xbd, 0x70, 0xe4, 0xf9, 0xa6, 0x6f, 0x3e, 0xb0, 0x68, 0x2e, 0x4d, 0x6a, 0xb3, 0xdf, 0xe0, 0x20, 0xb2, + 0x0b, 0xd0, 0x90, 0xd1, 0x1b, 0x74, 0xb4, 0x72, 0x76, 0x8b, 0x75, 0x82, 0xb6, 0xb3, 0x43, 0x69, 0x76, 0xfa, 0x21, 0x2d, 0x98, 0xb4, 0x65, 0x82, 0xba, 0x2a, 0x37, 0x48, 0xb2, 0xd0, 0x6c, 0x93, + 0x43, 0xf0, 0xce, 0xf5, 0x67, 0x0b, 0x5c, 0x60, 0x26, 0x19, 0xa7, 0xcf, 0xa7, 0xfb, 0x49, 0x95, 0xe4, 0xd8, 0x62, 0x7b, 0x8c, 0x9b, 0x08, 0x09, 0xcb, 0x8f, 0xc5, 0x20, 0x7e, 0x1a, 0x0f, 0xef, + 0x1f, 0x92, 0x2b, 0x07, 0x9e, 0x93, 0x38, 0x85, 0x51, 0xa5, 0xc5, 0xe0, 0x65, 0x7d, 0xf6, 0xab, 0x68, 0xca, 0x43, 0x86, 0xc0, 0xe7, 0x57, 0x5c, 0x28, 0xfd, 0xb9, 0xfd, 0x12, 0x56, 0xe9, 0x61, + 0x17, 0x84, 0x25, 0x13, 0xb6, 0xa3, 0x08, 0x69, 0x03, 0x95, 0x11, 0x00, 0xbe, 0x54, 0xed, 0x78, 0x7c, 0x60, 0x78, 0x8b, 0x3b, 0x1a, 0xaa, 0xb2, 0x2a, 0xb3, 0xa5, 0x9d, 0x45, 0x53, 0x79, 0x37, + 0x1f, 0x35, 0x39, 0x14, 0xe8, 0xde, 0xdc, 0xd9, 0x3b, 0x34, 0xb8, 0x82, 0x70, 0x22, 0x77, 0x6a, 0x12, 0xb7, 0x3a, 0xc1, 0x38, 0x3a, 0x36, 0x92, 0x0f, 0xe5, 0xae, 0x3e, 0x80, 0xe5, 0x61, 0x05, + 0x06, 0xc5, 0x8a, 0xec, 0xe9, 0x44, 0xfe, 0xcb, 0x97, 0x23, 0x7c, 0x4b, 0x76, 0xb8, 0xc5, 0x67, 0xf4, 0xb1, 0xd0, 0xc0, 0x05, 0xf3, 0x99, 0xb1, 0xa7, 0xf1, 0x83, 0xf6, 0x0b, 0x07, 0x1c, 0x9d, + 0x48, 0x34, 0x5a, 0x96, 0x45, 0x70, 0xdd, 0x63, 0x08, 0x5d, 0xf1, 0xa3, 0x80, 0xc8, 0x14, 0x04, 0xf5, 0x37, 0xe6, 0x26, 0x22, 0xb9, 0xb0, 0xc1, 0x96, 0xbb, 0x78, 0xbf, 0x98, 0xa0, 0xfe, 0xd8, + 0x9e, 0x20, 0x95, 0x4f, 0x4a, 0xee, 0x7e, 0xd4, 0x68, 0x46, 0xb9, 0x5a, 0x03, 0xb1, 0xaa, 0x70, 0xba, 0x3f, 0xdd, 0x7b, 0xba, 0x7b, 0xf4, 0x57, 0x62, 0x52, 0x1c, 0xb6, 0x05, 0xea, 0x44, 0xa2, + 0xf8, 0xdd, 0x7a, 0xd2, 0x97, 0x89, 0x20, 0x6f, 0x4a, 0xe6, 0xa5, 0x38, 0xca, 0x4f, 0xf9, 0xfa, 0x93, 0xf1, 0xf7, 0xb1, 0xa8, 0xec, 0x6d, 0xc5, 0xf6, 0xa0, 0x77, 0x73, 0x05, 0x7e, 0xe1, 0xcd, + 0x55, 0xd3, 0x39, 0x8a, 0xd5, 0xc3, 0xd7, 0xb1, 0xf3, 0x45, 0x63, 0x14, 0x2b, 0xe3, 0xa0, 0x96, 0x53, 0x73, 0x33, 0x71, 0x16, 0x0a, 0xd1, 0x51, 0x1d, 0x39, 0xaf, 0x16, 0x23, 0xcb, 0x86, 0x49, + 0xad, 0x76, 0xeb, 0x7a, 0xda, 0xf9, 0xe0, 0x8c, 0xcc, 0x36, 0x6c, 0xb8, 0x58, 0x27, 0x1a, 0x48, 0x4e, 0x1a, 0xa2, 0xd4, 0x54, 0xb8, 0x9e, 0x62, 0x72, 0x26, 0x70, 0x87, 0xc0, 0xa1, 0x1c, 0x8e, + 0x39, 0x32, 0x1a, 0xa5, 0x28, 0x6e, 0x4d, 0xe8, 0xba, 0xfc, 0xaf, 0x31, 0xe5, 0x5c, 0x8e, 0xe2, 0xbf, 0xc3, 0x18, 0xe2, 0xa1, 0x25, 0xc3, 0x57, 0xd4, 0x67, 0x8e, 0x9c, 0xaf, 0xcf, 0xbb, 0x38, + 0x7b, 0x68, 0x3e, 0x14, 0xa2, 0x03, 0x77, 0xef, 0xe1, 0x0e, 0x29, 0xb5, 0x91, 0x98, 0xd9, 0x95, 0x94, 0x39, 0xab, 0xdd, 0x3a, 0x6f, 0xc4, 0x31, 0xb3, 0xeb, 0xa4, 0xaa, 0x62, 0x1b, 0x66, 0x3b, + 0x21, 0x50, 0x08, 0xc8, 0x12, 0x9d, 0xa4, 0x36, 0x0d, 0x08, 0x82, 0xe8, 0x7a, 0xbb, 0x42, 0x11, 0x61, 0xc9, 0x4f, 0xa2, 0xe5, 0xc8, 0x9a, 0x35, 0x9b, 0x0c, 0xdf, 0xe8, 0x8a, 0x2e, 0x8f, 0x23, + 0x73, 0xa6, 0x6a, 0xc7, 0x63, 0xf2, 0xdd, 0x78, 0xf9, 0x5e, 0xde, 0xfb, 0x95, 0xf9, 0x79, 0xfb, 0xda, 0x6f, 0xcd, 0xab, 0x9f, 0xef, 0x36, 0xfb, 0x08, 0x7e, 0x45, 0xdd, 0x77, 0x26, 0x56, 0x8f, + 0xe2, 0xdc, 0x5b, 0x19, 0x8c, 0xe6, 0xc3, 0x64, 0x84, 0x65, 0xeb, 0x54, 0x5e, 0xd6, 0xa3, 0x06, 0x1a, 0xeb, 0x3c, 0xb6, 0x1e, 0x5b, 0x7a, 0xbd, 0x11, 0x77, 0x8b, 0xfd, 0x7a, 0x4f, 0xcd, 0x60, + 0x7b, 0x91, 0xd3, 0x68, 0x07, 0xcf, 0xa2, 0xfd, 0x4c, 0xde, 0x38, 0x2c, 0x4e, 0x8a, 0x35, 0x5b, 0x8f, 0x97, 0xe3, 0xc9, 0x50, 0x9d, 0x3a, 0xc0, 0x8a, 0xd5, 0x01, 0x77, 0x34, 0x5e, 0xee, 0x57, + 0x8c, 0x84, 0x83, 0x9b, 0xc0, 0xb1, 0xff, 0x35, 0x8c, 0xdf, 0xaf, 0x8b, 0x12, 0x3f, 0xc8, 0x97, 0x1b, 0x45, 0x89, 0x7b, 0xf1, 0xa1, 0x89, 0x96, 0x0a, 0x44, 0x88, 0x9b, 0x1c, 0x45, 0xd3, 0x43, + 0x83, 0x51, 0xc2, 0x16, 0xa1, 0x73, 0xd0, 0x14, 0x78, 0xc6, 0x24, 0x81, 0xfd, 0x14, 0x91, 0x97, 0x3a, 0xec, 0x06, 0xfa, 0x86, 0x53, 0xaa, 0xae, 0xd2, 0x18, 0x2c, 0x00, 0xe9, 0x8e, 0xd6, 0x8f, + 0xd3, 0xc9, 0x81, 0xc3, 0xc8, 0x9c, 0xe2, 0x94, 0xea, 0x68, 0x8f, 0xb7, 0x3b, 0x6e, 0xb8, 0xc3, 0x84, 0x20, 0x81, 0x0e, 0x21, 0x9d, 0x4f, 0xb5, 0xef, 0x8c, 0xab, 0x2f, 0x67, 0xfe, 0x5f, 0x6f, + 0xb1, 0xe1, 0x4f, 0xec, 0xf9, 0xdf, 0x96, 0xa7, 0xb7, 0x8b, 0x8e, 0xdf, 0xe3, 0xf0, 0x43, 0x33, 0xcd, 0x8d, 0x57, 0x5c, 0xf8, 0x7d, 0xa3, 0xa3, 0x6f, 0x84, 0xad, 0xcc, 0x37, 0xb0, 0x3c, 0xa9, + 0xa1, 0x21, 0xd8, 0xe2, 0x75, 0xa3, 0xb6, 0x62, 0x45, 0x73, 0x5d, 0xeb, 0x53, 0x21, 0x2d, 0x46, 0xac, 0xe5, 0x4c, 0xd3, 0xf5, 0x72, 0xa1, 0x90, 0xca, 0x88, 0x91, 0x47, 0x56, 0x13, 0x58, 0x43, + 0xc1, 0x2e, 0x75, 0x70, 0xcf, 0xc8, 0x23, 0x84, 0x65, 0x5a, 0x64, 0x2e, 0x33, 0x53, 0x7d, 0x1e, 0xb0, 0x43, 0xe4, 0x00, 0x50, 0xec, 0x50, 0x16, 0x4c, 0x9e, 0xdd, 0xd8, 0x7e, 0x4f, 0x23, 0xaf, + 0x57, 0x48, 0xe1, 0x7f, 0x09, 0xef, 0xbe, 0xae, 0x87, 0x06, 0x3e, 0x90, 0x24, 0xfe, 0x8a, 0xfa, 0xcc, 0xa1, 0x97, 0x0a, 0x68, 0x60, 0x9f, 0x74, 0xf1, 0x8a, 0x81, 0x65, 0xb5, 0x0b, 0x9a, 0xd0, + 0xc1, 0x53, 0x97, 0x57, 0x88, 0x08, 0x46, 0xac, 0x70, 0xc2, 0xad, 0x0d, 0x70, 0xe4, 0x99, 0xc4, 0x31, 0xa2, 0xf2, 0x19, 0x1e, 0xce, 0x30, 0x27, 0xc4, 0x6b, 0x7e, 0x87, 0xc0, 0x52, 0xa4, 0xf0, + 0xc8, 0x66, 0xc9, 0x07, 0x5e, 0x65, 0xcc, 0x1c, 0x76, 0x53, 0x8f, 0xdc, 0xd4, 0xb7, 0xac, 0xad, 0xd6, 0xcc, 0x03, 0x7d, 0xed, 0x72, 0x5c, 0xc2, 0x69, 0x72, 0xd5, 0x33, 0xce, 0xf3, 0x7f, 0x82, + 0xe5, 0xfd, 0x5a, 0xa2, 0xfa, 0xb7, 0xc6, 0x15, 0x2e, 0xa8, 0xcf, 0xfc, 0xbc, 0x6c, 0xf4, 0xe8, 0x19, 0x4d, 0xa0, 0x87, 0x34, 0x3f, 0xce, 0x97, 0x4a, 0xd2, 0xd8, 0xd6, 0x31, 0x9f, 0x53, 0xdb, + 0x63, 0xcb, 0xf9, 0x68, 0x03, 0xc9, 0x32, 0xc3, 0xd1, 0x6c, 0xe6, 0x4d, 0x0c, 0x50, 0xd1, 0xbc, 0x6c, 0x39, 0x99, 0xae, 0xcb, 0xce, 0x2a, 0x78, 0xcb, 0x75, 0x3d, 0xac, 0xf6, 0x0f, 0xa2, 0xc7, + 0xd3, 0xab, 0x09, 0xac, 0x28, 0xc7, 0x38, 0xc7, 0x83, 0x32, 0x28, 0x3b, 0x92, 0xa8, 0x3a, 0x09, 0x84, 0xaa, 0x7a, 0xe6, 0xff, 0x80, 0x9f, 0xff, 0xb2, 0x29, 0x79, 0x41, 0x79, 0xde, 0x07, 0xfd, + 0xac, 0xda, 0xee, 0x32, 0x14, 0x7a, 0xe0, 0x84, 0xe2, 0x6b, 0xe8, 0x0b, 0x57, 0xdf, 0x35, 0x9c, 0x43, 0xb2, 0x3d, 0xce, 0x27, 0x66, 0x73, 0x16, 0x85, 0xa4, 0x8d, 0x9e, 0xc3, 0xae, 0x57, 0xcd, + 0x24, 0x52, 0x61, 0x77, 0xd3, 0xdd, 0xc2, 0x1f, 0xef, 0x66, 0xb5, 0x86, 0x50, 0x09, 0x8f, 0x08, 0x08, 0xbe, 0x24, 0x17, 0x4b, 0x55, 0x3e, 0x8a, 0xc7, 0xad, 0xb7, 0x1f, 0xda, 0x00, 0xb1, 0x09, + 0xe3, 0xc3, 0x0c, 0x6e, 0x52, 0x38, 0xd6, 0x62, 0x75, 0x49, 0xca, 0x9a, 0xbe, 0xac, 0xc1, 0x9c, 0x25, 0xcd, 0x1d, 0x8f, 0x79, 0x4c, 0x50, 0x86, 0x3d, 0xf5, 0xa7, 0xd1, 0x18, 0xc1, 0x25, 0xde, + 0xf8, 0xee, 0x87, 0xbf, 0x71, 0xf9, 0xcd, 0x8a, 0xf8, 0x7e, 0x8f, 0xcf, 0xf5, 0x21, 0x2e, 0xe7, 0x25, 0x5b, 0xf2, 0x1a, 0xe0, 0xad, 0x76, 0xc1, 0x25, 0x18, 0x7f, 0xd5, 0xf9, 0x7f, 0x82, 0xd2, + 0x78, 0x3b, 0xea, 0xe3, 0xb7, 0x4e, 0xda, 0xcf, 0xb0, 0x17, 0x01, 0x7b, 0xbe, 0xe9, 0x3b, 0x39, 0xe7, 0x56, 0x55, 0xd6, 0x2b, 0x3d, 0x9e, 0x0b, 0x20, 0xd0, 0x88, 0xe2, 0xda, 0x4d, 0x77, 0x4d, + 0x3b, 0x75, 0x60, 0x60, 0x26, 0x32, 0x4d, 0x12, 0xeb, 0xb0, 0xd3, 0x49, 0x75, 0x06, 0x89, 0xe3, 0xd2, 0x19, 0x01, 0xd5, 0x81, 0xa6, 0x9d, 0xc0, 0x88, 0x70, 0x86, 0x09, 0x90, 0x8d, 0x05, 0x2f, + 0xa7, 0x96, 0x8b, 0x03, 0x79, 0x07, 0x4f, 0xc7, 0x7c, 0x12, 0xaa, 0xe5, 0x9e, 0x3c, 0xfa, 0x4b, 0xd1, 0xe0, 0x7b, 0xa6, 0x2d, 0xfe, 0xef, 0x31, 0x39, 0xbf, 0x15, 0xdc, 0xbe, 0xc5, 0x14, 0xf4, + 0xa1, 0x65, 0xb3, 0x67, 0xcc, 0xe1, 0xe0, 0xe5, 0x6a, 0x80, 0xf6, 0x5b, 0x28, 0x3b, 0x64, 0x47, 0xbd, 0x1c, 0x6d, 0xd2, 0xa3, 0x6e, 0x2c, 0x18, 0x71, 0x31, 0x9b, 0xeb, 0x52, 0x3b, 0x61, 0x0c, + 0x2d, 0x8b, 0xc0, 0xe9, 0x52, 0xa4, 0x80, 0xe9, 0x78, 0x64, 0x2c, 0x82, 0xd6, 0x89, 0x97, 0xfe, 0xfa, 0xb0, 0x3f, 0x0a, 0x1e, 0x8e, 0xf8, 0xa8, 0x04, 0x2d, 0x17, 0x9e, 0x3c, 0x63, 0x33, 0x29, + 0xe7, 0x27, 0x9b, 0xad, 0x15, 0xc7, 0xda, 0xaa, 0xf6, 0x8a, 0x6d, 0xb8, 0x88, 0xc6, 0x95, 0xd2, 0x6c, 0xfb, 0x8e, 0xf5, 0xc2, 0x7b, 0x5f, 0xf0, 0xea, 0x66, 0x32, 0xe7, 0xa7, 0x9a, 0xdf, 0xef, + 0xca, 0x95, 0x9b, 0x41, 0xf2, 0xf2, 0xb9, 0xef, 0xeb, 0x7d, 0x7f, 0x45, 0xf9, 0xf7, 0x27, 0xdc, 0xdf, 0x1b, 0x12, 0x8f, 0x50, 0xff, 0x15, 0xf7, 0xcc, 0x81, 0xd7, 0xbb, 0xbe, 0xc9, 0xd1, 0x62, + 0xc0, 0x37, 0x43, 0x72, 0x97, 0xe9, 0xb5, 0x62, 0x36, 0x2b, 0x71, 0x5d, 0x49, 0x13, 0x99, 0xf4, 0x19, 0xb7, 0xd0, 0x15, 0x6f, 0x18, 0xb3, 0xc3, 0x64, 0x37, 0x34, 0xd1, 0x14, 0xa4, 0x35, 0x53, + 0x3c, 0xd6, 0x90, 0x3c, 0x17, 0xf8, 0x95, 0x7d, 0x58, 0x72, 0xf4, 0xbc, 0x5d, 0x09, 0x2a, 0xb0, 0x9b, 0xf3, 0x1c, 0xd6, 0x14, 0x2b, 0x15, 0x09, 0xc8, 0xbc, 0xca, 0xa7, 0xad, 0x6f, 0xf3, 0xa2, + 0xdc, 0x37, 0x97, 0xd7, 0x0c, 0xbc, 0x8b, 0xaf, 0x7b, 0x49, 0x1a, 0xf9, 0xf5, 0xe7, 0xa8, 0xe7, 0x4e, 0xec, 0x4b, 0x45, 0x42, 0xcb, 0x77, 0x62, 0x63, 0x50, 0x15, 0xc6, 0x89, 0x8a, 0xf7, 0xd7, + 0xa2, 0x1e, 0x26, 0xeb, 0x87, 0x17, 0xbc, 0xd0, 0xf7, 0x43, 0x73, 0x5f, 0x42, 0x6f, 0xd6, 0xe4, 0x90, 0x1f, 0x25, 0x88, 0x1a, 0xaa, 0xfe, 0x5c, 0x4f, 0xa0, 0x68, 0xe5, 0xef, 0xa7, 0x06, 0x45, + 0x4b, 0x9c, 0xbc, 0x15, 0xd4, 0x50, 0xf1, 0x77, 0xe8, 0x98, 0x1a, 0x6e, 0x13, 0xae, 0x21, 0x8f, 0x8d, 0x97, 0x57, 0x79, 0x46, 0xa9, 0xa3, 0x39, 0x87, 0xc6, 0x5b, 0xe1, 0x28, 0x1e, 0xa1, 0x6d, + 0x94, 0xa2, 0x55, 0xde, 0x39, 0xb9, 0x09, 0x96, 0x5c, 0x54, 0xd4, 0x06, 0xd7, 0x22, 0x76, 0xfd, 0x75, 0x15, 0xbd, 0x1b, 0x35, 0x17, 0x6f, 0x91, 0x08, 0xbb, 0x2e, 0xb8, 0xdc, 0x97, 0x46, 0x1f, + 0xd1, 0x87, 0x83, 0x4f, 0x4d, 0x83, 0x0b, 0xf4, 0xf7, 0xc4, 0xd1, 0x65, 0x78, 0x32, 0x9a, 0xc5, 0x94, 0xc5, 0xc9, 0x56, 0x1d, 0x49, 0x92, 0xcd, 0x8e, 0x86, 0x5d, 0xd1, 0x3a, 0x21, 0x9e, 0x90, + 0x52, 0x27, 0x01, 0xee, 0x66, 0x66, 0x6f, 0xaa, 0x18, 0x17, 0x27, 0x19, 0xb6, 0x5e, 0xaf, 0x33, 0xb6, 0x58, 0x2c, 0xf6, 0x0d, 0x65, 0x33, 0x88, 0x85, 0xdb, 0xa4, 0x0d, 0x5b, 0x3e, 0x33, 0x0a, + 0x00, 0x63, 0x38, 0xb4, 0xc5, 0x11, 0xad, 0xe8, 0x55, 0x50, 0xee, 0x93, 0xbc, 0xa7, 0x2e, 0xb0, 0x5e, 0x0e, 0x23, 0xff, 0xf5, 0x27, 0xf8, 0xb1, 0xa4, 0xe3, 0xed, 0xa2, 0x93, 0x1f, 0x2b, 0x49, + 0x39, 0xd5, 0xe0, 0x02, 0x72, 0xa9, 0xa2, 0xf7, 0x52, 0x7b, 0x12, 0xed, 0x55, 0xff, 0x31, 0x4a, 0xd3, 0xcc, 0x74, 0x92, 0xbb, 0x75, 0x8c, 0xa0, 0x87, 0x8a, 0x86, 0xbc, 0xa2, 0x9e, 0xb8, 0xf2, + 0x72, 0x7d, 0x5e, 0x48, 0xed, 0xc1, 0x0d, 0xb7, 0x82, 0xf9, 0xb8, 0xd6, 0x93, 0xc9, 0x01, 0x98, 0x2c, 0x04, 0x57, 0xc2, 0xe2, 0x8c, 0x51, 0x6a, 0x9b, 0x19, 0x6f, 0xbb, 0x28, 0x9b, 0xc7, 0x3e, + 0x11, 0xcb, 0x04, 0x67, 0xf1, 0xb3, 0xd8, 0x71, 0xcb, 0x65, 0xa4, 0x90, 0xf4, 0x1e, 0x94, 0xf1, 0xa4, 0xa0, 0x69, 0xdb, 0x3a, 0x68, 0x53, 0xa0, 0x1b, 0x75, 0x16, 0x28, 0xee, 0xc6, 0xdd, 0x4c, + 0xa7, 0xa0, 0x29, 0xe4, 0xc9, 0x2e, 0xab, 0xd7, 0x8b, 0x9e, 0x5b, 0xee, 0x8e, 0xd5, 0xcb, 0x49, 0x5c, 0x68, 0xcf, 0x02, 0x9a, 0x51, 0x51, 0x0f, 0x2c, 0xc3, 0xf2, 0xef, 0x69, 0x00, 0xfc, 0x21, + 0x0d, 0xf0, 0x8a, 0x7a, 0x22, 0xe0, 0xcb, 0xf5, 0x00, 0xef, 0x37, 0xd6, 0x17, 0x29, 0x6e, 0x2f, 0x40, 0x94, 0x8e, 0xc5, 0xb0, 0xee, 0x92, 0xc3, 0x42, 0x14, 0x91, 0x4c, 0x76, 0x94, 0xd8, 0x1e, + 0xb2, 0xa0, 0xeb, 0x4a, 0xd1, 0x5e, 0x55, 0xbd, 0x83, 0x1e, 0x00, 0x4e, 0x0e, 0xc9, 0x74, 0x9c, 0x0b, 0x07, 0xda, 0x07, 0x9c, 0x55, 0xa9, 0x71, 0x1a, 0x7d, 0xd0, 0x46, 0x23, 0x28, 0x80, 0xa7, + 0x86, 0x8f, 0xfa, 0xd0, 0x98, 0x59, 0xd3, 0x47, 0x34, 0x97, 0xfc, 0x99, 0x59, 0x06, 0x3d, 0xc5, 0xb9, 0x35, 0xa2, 0x28, 0x78, 0xae, 0xaf, 0x8a, 0x3e, 0x64, 0x34, 0xf6, 0xca, 0x58, 0x8b, 0x9d, + 0xca, 0x4f, 0xed, 0xf2, 0x0b, 0x27, 0xe2, 0xe7, 0xf6, 0xdd, 0x33, 0xe6, 0x70, 0xf0, 0x72, 0xd5, 0xb7, 0xc6, 0x79, 0x60, 0x45, 0x14, 0xeb, 0x6c, 0xf2, 0x4d, 0x8c, 0x93, 0xdd, 0xb4, 0x4a, 0x74, + 0xd0, 0x01, 0xa0, 0x15, 0xdc, 0xca, 0x73, 0xbb, 0xe9, 0x36, 0xa9, 0x51, 0x2f, 0x65, 0x54, 0x19, 0x53, 0xc8, 0xae, 0x61, 0x87, 0x0d, 0x3f, 0x0d, 0x9c, 0x29, 0x91, 0xbb, 0xdb, 0xe8, 0x20, 0xeb, + 0x32, 0x30, 0xa1, 0x46, 0xfc, 0xc8, 0xe4, 0xd5, 0xb9, 0x38, 0x02, 0xeb, 0xe8, 0x98, 0xca, 0x29, 0xcd, 0xc2, 0x48, 0xb9, 0x83, 0xbf, 0xcb, 0xb9, 0xf9, 0xde, 0xf4, 0xee, 0xb3, 0xbf, 0x36, 0xfe, + 0xea, 0xe4, 0x1a, 0xfc, 0x01, 0xc1, 0x8d, 0x2f, 0xc7, 0xd5, 0xc4, 0x97, 0x33, 0x6a, 0xf0, 0x3e, 0xe2, 0x2a, 0x8b, 0xfc, 0x7e, 0xed, 0x30, 0x12, 0x02, 0x15, 0xdc, 0x3a, 0x30, 0x8a, 0x72, 0xbc, + 0x99, 0xb3, 0xfa, 0x72, 0x35, 0xf3, 0x9a, 0xa5, 0x35, 0x5c, 0x15, 0x61, 0xea, 0x52, 0xc9, 0x38, 0xe2, 0xaa, 0xca, 0xc5, 0x8c, 0x70, 0xdb, 0xe4, 0xc1, 0x96, 0x22, 0x85, 0xd2, 0x49, 0x4c, 0x2b, + 0x4d, 0xad, 0x6a, 0x89, 0xdb, 0xb8, 0x54, 0xe2, 0x46, 0xae, 0xab, 0x63, 0x0a, 0x50, 0xcd, 0xfd, 0xb2, 0xf2, 0x03, 0xe1, 0xbb, 0x00, 0xfd, 0x27, 0xf3, 0xea, 0x99, 0x12, 0xbf, 0x1e, 0x3a, 0x43, + 0xe5, 0xef, 0x7f, 0x43, 0x7b, 0xda, 0x0e, 0x67, 0xc2, 0xd8, 0xf7, 0x96, 0x12, 0xa1, 0x27, 0xec, 0x11, 0x75, 0xfb, 0x0c, 0xfa, 0x42, 0x77, 0xdb, 0x1c, 0x5c, 0x80, 0xbe, 0xa7, 0x7d, 0xc9, 0xcb, + 0x68, 0xbd, 0x23, 0x6c, 0x2d, 0x6a, 0x2a, 0x65, 0x71, 0x3c, 0x1c, 0x8e, 0xec, 0x04, 0xe4, 0xeb, 0xc0, 0xdf, 0x6d, 0x02, 0x86, 0x90, 0x5a, 0xca, 0x14, 0x30, 0x51, 0x39, 0x4e, 0xe8, 0xf1, 0x28, + 0x96, 0xb5, 0x86, 0xf3, 0x8a, 0x54, 0xe0, 0x0e, 0x9a, 0x20, 0x70, 0x4b, 0x7e, 0x41, 0xd2, 0x73, 0x93, 0x01, 0x20, 0x46, 0xda, 0x45, 0x5c, 0xba, 0x84, 0x64, 0x1a, 0x4e, 0x64, 0xc4, 0xd3, 0x9a, + 0xef, 0x68, 0xff, 0xfb, 0x44, 0xf7, 0xb5, 0xb0, 0xda, 0x6d, 0x01, 0x86, 0x9e, 0x90, 0x9f, 0x47, 0xdf, 0xdf, 0x70, 0x5f, 0xe8, 0x79, 0xbe, 0x19, 0x5c, 0xe0, 0xbe, 0x27, 0xa9, 0x3e, 0xd1, 0x00, + 0x93, 0x8f, 0xb1, 0x4e, 0x92, 0xa6, 0x80, 0x96, 0xd1, 0x05, 0x25, 0x8f, 0x92, 0x25, 0x28, 0x7b, 0x73, 0x5a, 0xe3, 0x25, 0x50, 0xa8, 0x24, 0x68, 0xa3, 0x2b, 0xd3, 0x06, 0x2d, 0x01, 0x40, 0xda, + 0xec, 0x2d, 0x6f, 0x67, 0x48, 0xa0, 0x87, 0x03, 0xe8, 0x16, 0xae, 0xe7, 0xe8, 0x3a, 0x14, 0xc2, 0xae, 0x2d, 0xd9, 0x31, 0xd4, 0x1d, 0x6b, 0x65, 0x85, 0x81, 0x7e, 0x67, 0x38, 0x6a, 0xf0, 0x9d, + 0x36, 0xb8, 0xaf, 0x90, 0xdf, 0x04, 0xee, 0x45, 0xba, 0x7e, 0x2a, 0xda, 0xbd, 0xf9, 0xf1, 0x56, 0x2f, 0xe2, 0x16, 0x3b, 0x90, 0xc7, 0x94, 0xf2, 0x0b, 0xea, 0x99, 0x19, 0xcf, 0xd7, 0xe7, 0xb3, + 0x59, 0x7a, 0x28, 0xe6, 0x05, 0x91, 0xe1, 0x88, 0xbf, 0x0d, 0xa8, 0xf0, 0x00, 0x6d, 0x26, 0xcc, 0xe1, 0x00, 0x29, 0x44, 0x80, 0x10, 0xc0, 0xb8, 0x9d, 0x17, 0x9c, 0xc2, 0x61, 0xaa, 0x20, 0x50, + 0x9d, 0x8e, 0xec, 0x38, 0x6b, 0x05, 0xf2, 0x9b, 0xd6, 0x3c, 0x64, 0x6e, 0xbc, 0x1b, 0x6e, 0x40, 0xac, 0x9b, 0x52, 0xdd, 0x41, 0x18, 0xc9, 0x62, 0xcb, 0x58, 0x2a, 0x5e, 0x21, 0x32, 0x07, 0x2c, + 0x31, 0x23, 0x1f, 0x0b, 0xdc, 0x9c, 0x7d, 0x9c, 0x15, 0x66, 0x61, 0x58, 0xce, 0xc0, 0x39, 0x66, 0x46, 0xf2, 0x42, 0x94, 0x73, 0x3a, 0x3d, 0xf1, 0x43, 0x96, 0xfc, 0x5b, 0x5f, 0x6e, 0x04, 0x77, + 0x8d, 0xee, 0x13, 0xf9, 0x7e, 0xbe, 0xff, 0xe5, 0x05, 0xf4, 0x85, 0x17, 0x41, 0x59, 0x9d, 0x8d, 0xba, 0x6f, 0xf6, 0xbf, 0x9c, 0x59, 0x51, 0x86, 0xc9, 0x1e, 0x35, 0x0f, 0x88, 0xb6, 0xc8, 0xb5, + 0xce, 0xb4, 0xdb, 0x71, 0xb0, 0x29, 0x79, 0x85, 0xe5, 0x5d, 0x0e, 0x00, 0xe4, 0xd9, 0x8c, 0x40, 0x47, 0xf4, 0xb1, 0xc4, 0x33, 0x87, 0xae, 0x31, 0xd5, 0x43, 0x93, 0xc2, 0x49, 0x0c, 0x9c, 0xdb, + 0x1d, 0x39, 0xed, 0x58, 0x08, 0x52, 0x7e, 0x38, 0x80, 0x8b, 0xf8, 0x50, 0x01, 0x5b, 0xc7, 0x25, 0x0b, 0xcf, 0xab, 0xe3, 0xbd, 0xb4, 0xea, 0x3e, 0x16, 0x43, 0xfa, 0x7e, 0x57, 0x50, 0xfc, 0x95, + 0xae, 0x78, 0x40, 0x38, 0xcf, 0x2a, 0xe2, 0xa2, 0x1a, 0x7a, 0x88, 0x63, 0x39, 0xdb, 0xf3, 0x47, 0x60, 0x17, 0xae, 0xab, 0x98, 0xc2, 0xd7, 0x2a, 0x4c, 0xa4, 0x14, 0x3a, 0x1d, 0x4f, 0x99, 0xd5, + 0x94, 0xd6, 0x75, 0x54, 0x44, 0xd5, 0xdc, 0x99, 0x71, 0x2a, 0xdd, 0xe0, 0x64, 0x25, 0x01, 0xa1, 0x89, 0x34, 0xfb, 0xe1, 0xb6, 0x35, 0x96, 0x0a, 0x0f, 0xf2, 0xd2, 0xb2, 0x55, 0xaa, 0x78, 0x25, + 0xae, 0x41, 0x13, 0x30, 0x6c, 0x59, 0x62, 0x1a, 0xb3, 0x84, 0x78, 0xc6, 0x60, 0xcf, 0x76, 0xc2, 0xfd, 0x0f, 0x4e, 0x3e, 0x1c, 0x63, 0x76, 0x5b, 0x16, 0x90, 0x07, 0xd6, 0x44, 0xae, 0x90, 0x87, + 0x83, 0xeb, 0xfb, 0xc1, 0x19, 0xf3, 0x7b, 0x8a, 0xb8, 0x4d, 0xa2, 0x8e, 0x2a, 0xdd, 0xdc, 0x12, 0x8a, 0x4b, 0xcf, 0xb0, 0x31, 0xd5, 0x22, 0x2d, 0x37, 0x4c, 0xe8, 0x55, 0x1b, 0xee, 0x94, 0x09, + 0xbe, 0xf6, 0x7c, 0x26, 0x07, 0x3b, 0x6c, 0x3a, 0x71, 0x37, 0x80, 0xae, 0x66, 0x2b, 0x65, 0x33, 0x97, 0xc6, 0xb6, 0x19, 0xb8, 0x47, 0x61, 0x2f, 0xc0, 0x98, 0x63, 0x16, 0x10, 0x3e, 0x03, 0x37, + 0x84, 0xb3, 0x55, 0x16, 0x41, 0xc9, 0x59, 0x6b, 0x86, 0x9d, 0x21, 0x5f, 0x6f, 0xf6, 0x39, 0xdd, 0xc4, 0x77, 0x73, 0xb6, 0x90, 0x87, 0x76, 0xc0, 0x3d, 0x63, 0x3e, 0x53, 0x21, 0x4e, 0x93, 0x01, + 0xf2, 0xfd, 0x6e, 0xb7, 0xd3, 0xf7, 0x7b, 0x23, 0x4a, 0x27, 0xd8, 0x78, 0xef, 0x0b, 0xfb, 0x5c, 0xdd, 0x6f, 0x2d, 0x18, 0x3c, 0x00, 0xba, 0x2b, 0x10, 0x88, 0xc5, 0xae, 0x4c, 0x86, 0xf4, 0x13, + 0xde, 0xac, 0x8c, 0xa9, 0x39, 0xad, 0xe8, 0x3a, 0xd6, 0xcb, 0xb0, 0x5d, 0xfb, 0xcb, 0xfd, 0x68, 0x65, 0x84, 0x02, 0x48, 0xc8, 0x98, 0x7c, 0x84, 0xc9, 0xa8, 0x99, 0x86, 0x3a, 0xa6, 0x12, 0x6c, + 0xa3, 0x6c, 0xa1, 0x63, 0x27, 0x93, 0x21, 0xbb, 0x7b, 0x5c, 0x41, 0x59, 0x7e, 0xba, 0x0f, 0x6c, 0xe3, 0xed, 0x68, 0x89, 0xab, 0xb0, 0xb2, 0xed, 0x98, 0xb5, 0xf7, 0xdc, 0x05, 0x7f, 0x38, 0x5c, + 0xf9, 0xc6, 0x06, 0xc3, 0x5f, 0x9f, 0x0f, 0x1c, 0xfd, 0x58, 0x52, 0xe8, 0xc3, 0xc9, 0xc8, 0x59, 0x59, 0x15, 0x8e, 0xf3, 0x54, 0x38, 0x71, 0xfb, 0xaa, 0x1b, 0xaf, 0x6a, 0xa9, 0x7e, 0x38, 0xfe, + 0xe0, 0xc3, 0x6e, 0xa3, 0x38, 0x8b, 0x9c, 0x41, 0x9d, 0x9d, 0x13, 0x44, 0x93, 0xf4, 0x6d, 0xb7, 0xf4, 0x0d, 0x97, 0xf9, 0xb2, 0x87, 0xb2, 0x1c, 0x58, 0x69, 0xf4, 0x7c, 0x48, 0x06, 0xf6, 0xe9, + 0x38, 0x85, 0xb4, 0x7e, 0xf7, 0x3b, 0xaf, 0xba, 0xea, 0xc4, 0x76, 0xdc, 0xd2, 0x70, 0xdf, 0xe2, 0x77, 0x58, 0x8f, 0xf8, 0xdd, 0x9b, 0xe0, 0x9d, 0xe3, 0x77, 0xcf, 0xb7, 0x8f, 0xd8, 0x9a, 0xbd, + 0x6b, 0xdd, 0xbf, 0xec, 0x32, 0x4d, 0x33, 0x27, 0xb1, 0xd2, 0x28, 0x72, 0xac, 0xf3, 0x69, 0xba, 0xef, 0x3f, 0xe5, 0x3a, 0xbc, 0x7b, 0xfd, 0xe0, 0x39, 0xcc, 0xfb, 0xf2, 0xb3, 0x5f, 0xde, 0xf8, + 0xed, 0xc8, 0xba, 0x3e, 0xb5, 0xf9, 0x45, 0x68, 0x6e, 0x0f, 0x36, 0xf8, 0x01, 0xc5, 0x73, 0x46, 0x1c, 0x0e, 0x2e, 0x7f, 0xcf, 0x67, 0x25, 0xf5, 0x50, 0x34, 0xf4, 0x34, 0xec, 0x34, 0x8d, 0x0a, + 0x50, 0xc9, 0x77, 0x03, 0xa1, 0x09, 0xba, 0x62, 0x2a, 0x38, 0x8d, 0x24, 0xa9, 0x6c, 0x95, 0xd0, 0xb9, 0xe2, 0x3a, 0xc4, 0x11, 0xa2, 0x7c, 0x8f, 0x29, 0x2d, 0xa9, 0xc3, 0x75, 0x73, 0x65, 0xba, + 0xe9, 0x6a, 0xbb, 0xe2, 0x6b, 0x4f, 0x12, 0xda, 0x71, 0xe5, 0xe3, 0x2e, 0xa9, 0x33, 0xdb, 0x9d, 0x2c, 0xb6, 0x0a, 0x3b, 0x9d, 0x0c, 0x09, 0xa5, 0x46, 0x2b, 0x48, 0x7d, 0x3c, 0x2f, 0x22, 0x2e, + 0x7f, 0x7d, 0x4e, 0x96, 0xfb, 0x21, 0x65, 0x7d, 0xa3, 0x1c, 0xb8, 0xd1, 0xdd, 0xc2, 0x25, 0xc8, 0x43, 0x71, 0x87, 0x17, 0xd0, 0xe7, 0x8a, 0x25, 0xa7, 0xcb, 0xb3, 0x2e, 0xfb, 0xb6, 0x54, 0x69, + 0x65, 0x6f, 0x65, 0x84, 0x9e, 0xe9, 0x45, 0xb0, 0x50, 0x62, 0x77, 0x33, 0x73, 0xa3, 0x94, 0x25, 0x89, 0x68, 0x57, 0x37, 0xe0, 0x5f, 0x72, 0x06, 0xfa, 0x6c, 0xfd, 0xbb, 0x49, 0x9e, 0x2f, 0xa7, + 0xfa, 0x9f, 0xa7, 0x6b, 0xbe, 0x9f, 0xea, 0x7b, 0x24, 0x69, 0xe2, 0xd3, 0xa8, 0xab, 0x4d, 0x69, 0xa5, 0xcf, 0x90, 0x05, 0x6c, 0x0c, 0x37, 0x3b, 0x9a, 0x8a, 0x1c, 0xc6, 0x0f, 0xbb, 0x1c, 0x4b, + 0x8f, 0x1e, 0xdb, 0x1a, 0xb4, 0x3c, 0x6a, 0x35, 0xb5, 0xb1, 0x56, 0x65, 0x93, 0xee, 0x0c, 0x76, 0x91, 0x0f, 0x4b, 0xec, 0xa8, 0xce, 0xf1, 0xa1, 0xaa, 0xf2, 0x78, 0xd5, 0x11, 0xdb, 0xd1, 0x91, + 0xe2, 0x2a, 0x36, 0x11, 0xb9, 0x61, 0xa5, 0x56, 0x53, 0x44, 0xd9, 0x4a, 0xd1, 0x8f, 0x4f, 0x91, 0xba, 0x49, 0x98, 0x4f, 0xca, 0xef, 0x16, 0x91, 0xb0, 0x87, 0x4e, 0x7c, 0xb9, 0x86, 0x1e, 0x0e, + 0x3e, 0x34, 0x0c, 0xb0, 0x7e, 0x27, 0xbe, 0x08, 0xe1, 0x2e, 0x3c, 0xd8, 0xea, 0xbc, 0x42, 0x41, 0x72, 0x3d, 0x0f, 0xa8, 0x9c, 0x56, 0xd1, 0x54, 0x5e, 0x96, 0x9e, 0x0c, 0x33, 0x39, 0x35, 0xeb, + 0x4a, 0x98, 0xcf, 0xf6, 0x31, 0x6a, 0x08, 0x9a, 0x19, 0xc6, 0x80, 0xce, 0x28, 0x8c, 0xa5, 0xa0, 0xa2, 0x3b, 0xdd, 0x48, 0x05, 0x5a, 0xaf, 0x37, 0x7a, 0x6c, 0x80, 0x4e, 0x8b, 0xba, 0x58, 0xe4, + 0xad, 0x8a, 0xfd, 0x18, 0x34, 0x54, 0x50, 0x58, 0xff, 0x85, 0x52, 0x67, 0xef, 0x06, 0xda, 0xa5, 0x0e, 0xde, 0xcf, 0x5d, 0xa8, 0x7e, 0x52, 0x9c, 0x7d, 0xb9, 0x2f, 0xff, 0xe7, 0xec, 0x38, 0x21, + 0x9e, 0x6d, 0x92, 0xac, 0xea, 0x95, 0x27, 0x0e, 0x0d, 0x4c, 0x1b, 0xf4, 0x1b, 0x31, 0x3d, 0x0a, 0x6a, 0x2d, 0x5a, 0x09, 0xb2, 0xf3, 0xdd, 0x20, 0x26, 0x11, 0x6d, 0x8e, 0x03, 0xe8, 0xa3, 0xd4, + 0x33, 0x4c, 0xb3, 0x38, 0x3f, 0xff, 0xab, 0xcf, 0x22, 0xd7, 0x33, 0x11, 0x9e, 0x67, 0xc8, 0xac, 0xfa, 0xf9, 0xf4, 0xd8, 0xc7, 0x39, 0x4a, 0xd2, 0x22, 0x36, 0xa2, 0xa0, 0x73, 0xbe, 0xda, 0xc6, + 0xf7, 0x98, 0x02, 0xbd, 0x86, 0x3e, 0x53, 0xff, 0x7d, 0x43, 0x1f, 0x65, 0x7a, 0xd6, 0x1f, 0x8e, 0x5e, 0x62, 0xab, 0x12, 0x51, 0x2a, 0x3a, 0x28, 0x59, 0x25, 0x1b, 0x89, 0xf0, 0x4c, 0x6e, 0x49, + 0x3b, 0xdf, 0x67, 0xb3, 0x00, 0x1d, 0xef, 0xc4, 0x0e, 0x99, 0x19, 0x79, 0xc0, 0xe0, 0x4e, 0x57, 0x9b, 0x20, 0x06, 0xc1, 0x8c, 0xd8, 0x55, 0xaa, 0x7c, 0x90, 0xc7, 0x38, 0x8d, 0xcf, 0x97, 0xa6, + 0xb0, 0xd7, 0x60, 0x3e, 0x31, 0x87, 0xf1, 0x04, 0x55, 0xb4, 0x34, 0xa4, 0xb7, 0x07, 0xeb, 0xb0, 0xfa, 0xae, 0x3e, 0xf2, 0xf7, 0x49, 0xab, 0xfd, 0x62, 0x5c, 0xcf, 0xa9, 0xa3, 0x41, 0x52, 0x66, + 0x5f, 0xee, 0xc0, 0x7b, 0x24, 0xd4, 0x75, 0x8d, 0x3d, 0x1c, 0x7c, 0x68, 0x18, 0x5c, 0x60, 0xbf, 0x27, 0x30, 0x9b, 0xc2, 0x1d, 0x09, 0x9a, 0xbb, 0x79, 0xb3, 0x88, 0x52, 0x16, 0xd0, 0xba, 0x6d, + 0x9c, 0xe9, 0x3b, 0xc1, 0x21, 0x09, 0x20, 0xa7, 0xc4, 0x78, 0x2c, 0x2f, 0xf5, 0x89, 0xe2, 0x1d, 0x47, 0x56, 0x0d, 0x2c, 0x27, 0x85, 0x0a, 0xeb, 0x13, 0x76, 0x88, 0x54, 0xeb, 0x16, 0xf0, 0x54, + 0x53, 0x67, 0xa4, 0xdd, 0xac, 0x84, 0xd7, 0xa4, 0x66, 0x1f, 0x39, 0x93, 0xf3, 0x09, 0x95, 0xaa, 0x82, 0x78, 0xa4, 0x81, 0x57, 0x81, 0xaf, 0xff, 0xe9, 0xcb, 0xe9, 0x2f, 0x5f, 0xfe, 0x55, 0x14, + 0xfc, 0xe7, 0xe1, 0xaf, 0x57, 0xd4, 0x77, 0xb4, 0xbd, 0x44, 0xc2, 0x7b, 0xc4, 0xbe, 0x10, 0xab, 0x9d, 0x94, 0x2d, 0xeb, 0x55, 0x71, 0x40, 0xcc, 0x89, 0x89, 0x2b, 0x8a, 0x73, 0x78, 0x35, 0xc9, + 0x70, 0x71, 0x09, 0x47, 0x87, 0xa6, 0x32, 0x3d, 0x30, 0x03, 0xb7, 0x90, 0x03, 0x6e, 0x1b, 0x29, 0x9f, 0x62, 0x96, 0x33, 0x3b, 0x02, 0x4b, 0xd8, 0x76, 0xc5, 0x30, 0x86, 0xcc, 0xe5, 0x64, 0xbd, + 0xa3, 0xa7, 0xcc, 0x84, 0x12, 0x9a, 0x16, 0x48, 0x49, 0x0b, 0x37, 0x88, 0x5d, 0x1d, 0x72, 0xf6, 0xc7, 0x73, 0x87, 0x7e, 0xa0, 0x7b, 0xbe, 0xc9, 0x93, 0xb1, 0x1d, 0x37, 0x48, 0x9c, 0x41, 0x56, + 0xa4, 0x99, 0x53, 0x54, 0x97, 0xff, 0xfe, 0xf5, 0xe1, 0xfc, 0x8f, 0xbe, 0x83, 0xe3, 0x9f, 0x94, 0xea, 0xf2, 0xcc, 0xa1, 0xbd, 0xd3, 0x7e, 0x25, 0x05, 0x3f, 0xf7, 0x68, 0xdf, 0xe1, 0xbe, 0xc9, + 0xc1, 0xe9, 0xae, 0xef, 0xee, 0xd6, 0x4d, 0x4d, 0x31, 0xa2, 0xcc, 0xc9, 0xeb, 0x22, 0x9a, 0xab, 0x9c, 0xcb, 0x2e, 0xbb, 0x09, 0x6e, 0x66, 0x7c, 0x8d, 0x54, 0x5a, 0x85, 0x1c, 0x9b, 0x70, 0x63, + 0x6f, 0xe7, 0x02, 0x30, 0x75, 0x24, 0x30, 0xda, 0x98, 0xe8, 0x92, 0x54, 0xb6, 0x04, 0x48, 0x1b, 0x93, 0xa3, 0x5f, 0x6f, 0xbc, 0x5a, 0x84, 0xd5, 0x19, 0x30, 0x0b, 0xf7, 0xed, 0xfa, 0xc0, 0x75, + 0xe5, 0x06, 0xd3, 0xf7, 0xd5, 0x3c, 0x76, 0xfd, 0xd5, 0xc3, 0x1b, 0x20, 0xbe, 0x23, 0xe0, 0x93, 0x51, 0x96, 0x81, 0x77, 0x2f, 0x28, 0x80, 0x3e, 0x14, 0x1c, 0xba, 0x42, 0x7e, 0x25, 0xe2, 0xf3, + 0xfd, 0x39, 0x4b, 0xa5, 0x47, 0xc8, 0x28, 0x38, 0x4a, 0xf0, 0x0a, 0x93, 0x58, 0xb5, 0xa4, 0xb2, 0x36, 0x90, 0x79, 0x6d, 0x19, 0x2b, 0x00, 0xcc, 0xb0, 0x99, 0xaa, 0x3a, 0xd8, 0x3c, 0x40, 0xd6, + 0x80, 0x8b, 0x3a, 0x80, 0xb1, 0x98, 0x52, 0xac, 0x91, 0x62, 0x46, 0x3c, 0xdd, 0x2a, 0xf8, 0x02, 0xe4, 0x38, 0xdc, 0x1a, 0xae, 0x64, 0x72, 0xec, 0xa0, 0x44, 0x5d, 0xd1, 0x47, 0x78, 0xb6, 0x22, + 0x47, 0xfe, 0x71, 0x36, 0xc6, 0x55, 0x31, 0x5e, 0xd6, 0x3d, 0xf3, 0x23, 0x6e, 0x55, 0x3f, 0xe8, 0x39, 0x7a, 0xde, 0x3d, 0x76, 0xbb, 0x9a, 0xf8, 0xbb, 0x07, 0xae, 0x45, 0xf8, 0xaf, 0xd4, 0x38, + 0xfd, 0x67, 0x8c, 0xbf, 0x64, 0xe0, 0x1c, 0x83, 0x6a, 0x10, 0x39, 0xc6, 0x7e, 0xe0, 0x16, 0xce, 0xfd, 0xc5, 0xb4, 0x47, 0x92, 0x9b, 0x3e, 0xa1, 0x9f, 0xc4, 0xe8, 0x63, 0x5b, 0xdf, 0xca, 0x00, + 0xbb, 0x9a, 0x36, 0x74, 0x9d, 0x0a, 0xb7, 0x8e, 0x8e, 0x34, 0xf2, 0xc1, 0xe3, 0xc6, 0xe4, 0xea, 0x48, 0xa5, 0xe5, 0xbc, 0x2e, 0x26, 0x01, 0xa5, 0x80, 0x25, 0x84, 0x14, 0x73, 0x48, 0x3b, 0xc4, + 0x06, 0x0f, 0x00, 0x61, 0x63, 0x1d, 0x79, 0x82, 0xa0, 0x94, 0x54, 0x68, 0x9c, 0x44, 0x77, 0xcc, 0x8c, 0xa6, 0xe0, 0x98, 0x54, 0x68, 0x68, 0xc8, 0xa4, 0x25, 0xaf, 0xf1, 0xeb, 0x30, 0xd9, 0x52, + 0xd9, 0xf0, 0xeb, 0xe8, 0xe3, 0x73, 0x8d, 0xa2, 0xdb, 0x6a, 0x09, 0x7d, 0x88, 0x20, 0xd6, 0x85, 0x06, 0x96, 0x33, 0x38, 0x23, 0x7c, 0x67, 0xd0, 0x2a, 0x93, 0xd2, 0xc8, 0x10, 0x45, 0x61, 0xe5, + 0x72, 0xcb, 0x95, 0xd3, 0x51, 0x32, 0xa5, 0x71, 0x02, 0x43, 0x54, 0x63, 0xc4, 0x3c, 0x3a, 0xa9, 0xfc, 0xac, 0xbc, 0x52, 0xda, 0x38, 0x45, 0x94, 0x1a, 0xf6, 0x69, 0x9c, 0x54, 0xce, 0xd7, 0xdb, + 0x45, 0xe1, 0x07, 0xfc, 0xd2, 0x1b, 0xf8, 0x27, 0x02, 0x7d, 0x6e, 0x3d, 0x07, 0xea, 0x7b, 0x78, 0xae, 0x26, 0xa1, 0xea, 0x66, 0xec, 0xd7, 0x61, 0x92, 0x6f, 0xd2, 0x25, 0xa8, 0xe3, 0x1b, 0xbe, + 0xa3, 0x86, 0x89, 0xef, 0x0a, 0x09, 0x03, 0x92, 0xba, 0xc4, 0x8a, 0x5d, 0x17, 0x4a, 0xeb, 0x83, 0xe3, 0x99, 0xd8, 0x66, 0x94, 0x8e, 0x29, 0x8a, 0xca, 0x8e, 0x88, 0x3b, 0xaa, 0xe1, 0xed, 0xd0, + 0x45, 0x76, 0x33, 0x83, 0xa2, 0x25, 0x21, 0xc4, 0x85, 0x45, 0x32, 0x93, 0x5d, 0x15, 0x4a, 0xa7, 0x55, 0x95, 0xbb, 0x3d, 0xd3, 0x9b, 0xdf, 0x27, 0xa3, 0xfc, 0xea, 0x7d, 0x14, 0xfa, 0x8d, 0x7a, + 0xe3, 0x77, 0x9d, 0xa8, 0x1f, 0xd3, 0xf7, 0x23, 0xf8, 0x70, 0xf0, 0xa9, 0xa9, 0x5f, 0x69, 0xb3, 0x29, 0x58, 0x8b, 0x06, 0xbb, 0xd9, 0x6d, 0x78, 0x80, 0x74, 0x4a, 0xac, 0x18, 0x49, 0x99, 0x91, + 0xf8, 0x95, 0xa5, 0x42, 0xb7, 0xcf, 0x72, 0xe9, 0xab, 0xf8, 0x7a, 0x5b, 0xe5, 0xe7, 0x9f, 0xfd, 0x92, 0x76, 0x78, 0x8f, 0x40, 0x3f, 0x0f, 0xc7, 0xbd, 0xc1, 0xbe, 0x90, 0xe6, 0x7c, 0xd3, 0x77, + 0x77, 0xc4, 0x6a, 0xb2, 0xe8, 0xf8, 0x1d, 0xc3, 0x30, 0xfc, 0x16, 0x68, 0x51, 0xb2, 0x1b, 0x21, 0x14, 0xc8, 0xd8, 0x60, 0xab, 0x9a, 0x64, 0x46, 0x8d, 0xdb, 0x99, 0x92, 0x0e, 0xf7, 0x98, 0xa6, + 0xd9, 0x9a, 0x97, 0x69, 0xf0, 0x10, 0x66, 0x4a, 0xae, 0xdc, 0x97, 0x8b, 0x22, 0x27, 0x22, 0x8e, 0x3d, 0x16, 0x6d, 0xb1, 0xe3, 0x12, 0xc8, 0x09, 0x67, 0x78, 0x4a, 0x65, 0xa4, 0xe1, 0x37, 0xdc, + 0x5c, 0x98, 0x90, 0xe5, 0x1d, 0x8b, 0xf1, 0x0b, 0xda, 0x04, 0x56, 0xfa, 0xd5, 0xda, 0xe5, 0x69, 0xe4, 0x3c, 0x20, 0x3b, 0x2f, 0xa8, 0x27, 0xca, 0xbc, 0x5c, 0x9f, 0x4f, 0xc8, 0xe9, 0x61, 0x40, + 0x2d, 0x64, 0xa4, 0x72, 0x58, 0x69, 0x13, 0xc6, 0x0c, 0xbc, 0xa3, 0x67, 0xd3, 0xae, 0xd6, 0x48, 0x46, 0xed, 0xe8, 0xc9, 0xee, 0xc0, 0xe4, 0x63, 0xd8, 0x20, 0xdd, 0x72, 0xde, 0x1c, 0x0c, 0xb1, + 0x62, 0x7d, 0x4a, 0x59, 0x30, 0xce, 0xce, 0x86, 0x52, 0x48, 0x98, 0x90, 0x20, 0x2d, 0xe3, 0x80, 0x6e, 0x33, 0xaa, 0x2a, 0xae, 0x4c, 0xb1, 0xac, 0x57, 0x87, 0x45, 0xb8, 0xa7, 0xc7, 0x4a, 0xbe, + 0x15, 0xe4, 0xdd, 0x5f, 0xf4, 0x00, 0xc9, 0x77, 0x0b, 0xc1, 0x7f, 0x79, 0x8e, 0x0d, 0xd3, 0xa4, 0xb4, 0xfc, 0x28, 0x48, 0xf6, 0xce, 0x5b, 0x39, 0xc3, 0xaf, 0xe4, 0xf7, 0x72, 0x38, 0xf3, 0x2d, + 0xf6, 0x90, 0x4f, 0x10, 0xfa, 0x10, 0x7f, 0x92, 0xf4, 0xcc, 0x9a, 0x24, 0x1d, 0x5c, 0x20, 0xbe, 0x67, 0x0b, 0xb9, 0xd2, 0x36, 0x0d, 0x31, 0x5e, 0x2a, 0xaa, 0xe8, 0x8a, 0xc0, 0x1e, 0x4f, 0x19, + 0x0b, 0x4f, 0x2d, 0xab, 0xc5, 0x56, 0x06, 0x90, 0xc3, 0x25, 0x7f, 0x90, 0x91, 0x1c, 0x8e, 0x42, 0x49, 0xc5, 0x28, 0x7d, 0x4f, 0x34, 0x00, 0xb6, 0xdf, 0x4c, 0xe0, 0x14, 0x53, 0x88, 0x11, 0x3a, + 0x6d, 0xb7, 0x46, 0xee, 0x1b, 0xf8, 0x64, 0x61, 0x84, 0xf1, 0x7e, 0xb3, 0x2d, 0x95, 0x8a, 0xcf, 0xa6, 0xed, 0x5a, 0xee, 0x7b, 0xb2, 0xaa, 0x51, 0xa5, 0x71, 0x60, 0x0d, 0xca, 0xc8, 0x71, 0xb2, + 0xdb, 0x36, 0xd9, 0xf9, 0xec, 0xc9, 0xc2, 0xb1, 0x5f, 0x32, 0xff, 0x91, 0x8f, 0x87, 0xbe, 0xdc, 0xb2, 0x57, 0x2e, 0x71, 0xe8, 0xeb, 0xc4, 0xc3, 0x13, 0x49, 0x5e, 0xcf, 0xfa, 0xae, 0x0a, 0x23, + 0x29, 0xcf, 0x45, 0x27, 0xff, 0xe3, 0x8f, 0x5f, 0xcd, 0xa7, 0x97, 0x9e, 0x1f, 0x2e, 0x2b, 0x7b, 0x50, 0x3a, 0x45, 0x70, 0x0e, 0x75, 0x14, 0x17, 0x4b, 0x0e, 0xff, 0xf4, 0x64, 0x9f, 0x7c, 0xc6, + 0xbc, 0x0e, 0xac, 0xfd, 0xc0, 0x4d, 0x8b, 0xd8, 0xa8, 0x06, 0x75, 0xe2, 0x94, 0x96, 0x91, 0x39, 0x6f, 0x39, 0x79, 0x57, 0xc6, 0x65, 0xe1, 0x18, 0xd1, 0x39, 0xdb, 0x33, 0x28, 0x5e, 0x52, 0x28, + 0x3f, 0xd6, 0xd5, 0x35, 0x5c, 0x67, 0x50, 0x56, 0xe7, 0x8d, 0x15, 0xd7, 0x87, 0x88, 0x5f, 0x8f, 0xe9, 0xd3, 0xa3, 0x69, 0x12, 0x58, 0x03, 0x33, 0x4d, 0xe3, 0x5f, 0x37, 0x97, 0x7d, 0x2a, 0xbf, + 0x70, 0x8c, 0xab, 0xc3, 0xfe, 0xee, 0xd4, 0x31, 0xfa, 0x14, 0xd5, 0x7a, 0x39, 0x57, 0xdc, 0x0c, 0x92, 0x7e, 0xf9, 0xda, 0xf7, 0xe9, 0x7f, 0x4f, 0x71, 0xff, 0xdc, 0x96, 0xba, 0xf3, 0x8e, 0x97, + 0x01, 0xf1, 0xb9, 0xa7, 0x6f, 0xaa, 0xb1, 0x45, 0x34, 0x29, 0xc6, 0x65, 0x0a, 0x7a, 0x98, 0x8b, 0x28, 0xec, 0xcb, 0x3b, 0x4b, 0xc2, 0xb6, 0x4c, 0xb9, 0x22, 0xf5, 0x28, 0x2c, 0x65, 0x77, 0x1c, + 0xe6, 0xbb, 0xa1, 0x03, 0x97, 0xd3, 0x63, 0x3c, 0x65, 0xa6, 0x7a, 0x90, 0x43, 0xea, 0x4a, 0xce, 0x30, 0x46, 0x5b, 0x55, 0xf5, 0x84, 0xc5, 0x79, 0x86, 0xcd, 0x47, 0x0a, 0xe4, 0x78, 0x4a, 0xbe, + 0x35, 0x93, 0x95, 0xcc, 0x63, 0xd3, 0x5a, 0x8f, 0xb9, 0x9e, 0xe9, 0x87, 0x27, 0x0e, 0xbd, 0xf0, 0xfa, 0x85, 0x4b, 0x9f, 0x8e, 0xa5, 0x2e, 0xb3, 0x28, 0xa8, 0xe0, 0x5f, 0x9f, 0x53, 0x14, 0xbf, + 0x61, 0xc8, 0x67, 0x19, 0xbf, 0xc5, 0x0d, 0xfc, 0x09, 0x7e, 0xc0, 0x5b, 0xbc, 0xf5, 0x82, 0x17, 0x56, 0x7c, 0x68, 0x1e, 0x9c, 0xdf, 0xd0, 0x83, 0x0f, 0x6c, 0xc8, 0xf3, 0x25, 0x03, 0x34, 0x7e, + 0x38, 0xac, 0x12, 0x9f, 0x6e, 0x87, 0x87, 0x60, 0xed, 0x23, 0x6b, 0xa4, 0x43, 0xfc, 0x61, 0x08, 0x61, 0x1d, 0x2b, 0xa8, 0x80, 0x38, 0x9a, 0xed, 0xa5, 0xb1, 0x97, 0x2f, 0x6a, 0xa9, 0x5e, 0x74, + 0xda, 0x02, 0xf5, 0xe4, 0x96, 0xa2, 0x57, 0xfe, 0xc4, 0x58, 0x10, 0xfb, 0xfd, 0xc8, 0x34, 0x46, 0xc1, 0x76, 0x12, 0x9b, 0x2c, 0x5c, 0x2d, 0x64, 0x10, 0xe1, 0x82, 0xaf, 0x4f, 0xe4, 0x7a, 0x1e, + 0xe0, 0x77, 0x28, 0x03, 0x3e, 0x41, 0xd0, 0x23, 0x71, 0xec, 0x67, 0xd4, 0x13, 0x39, 0x9e, 0x15, 0xc8, 0x33, 0x52, 0x0f, 0x1a, 0xd8, 0x33, 0xc7, 0x1d, 0xda, 0x85, 0x32, 0x4d, 0x5b, 0x7b, 0x02, + 0x2d, 0xca, 0x75, 0x57, 0x4f, 0x5d, 0x12, 0x02, 0xc1, 0x44, 0x8f, 0x80, 0x99, 0x04, 0xb4, 0x86, 0x65, 0xc1, 0x26, 0x63, 0x39, 0x36, 0xe6, 0x8e, 0xb6, 0xe1, 0x1e, 0xed, 0x00, 0xa5, 0x9a, 0xca, + 0xd2, 0xb8, 0x1e, 0xf1, 0x3e, 0x17, 0x8c, 0xc2, 0x61, 0xe8, 0xc6, 0x63, 0xbe, 0x06, 0xe3, 0x35, 0xa3, 0xa1, 0x87, 0xb9, 0x4d, 0x4d, 0xc9, 0x1f, 0x86, 0x21, 0xf0, 0x7e, 0x12, 0xf6, 0x49, 0x37, + 0xde, 0x36, 0x44, 0x1e, 0x09, 0x9a, 0x7e, 0xc0, 0x7e, 0x47, 0xc8, 0xe7, 0x96, 0x01, 0xdc, 0x2f, 0x35, 0x7b, 0x08, 0x29, 0x3a, 0x09, 0xec, 0x84, 0x70, 0x8b, 0x1b, 0x8d, 0xc2, 0x79, 0xac, 0xc3, + 0xf0, 0x36, 0x21, 0x4e, 0x84, 0x78, 0x2a, 0x40, 0x63, 0x2c, 0xa6, 0x21, 0x67, 0xab, 0x96, 0x74, 0x8c, 0x49, 0x46, 0x11, 0x6d, 0xe2, 0xe3, 0xf0, 0x40, 0x97, 0x06, 0x36, 0x63, 0x8c, 0xe3, 0x2c, + 0x06, 0xb1, 0x31, 0xb7, 0xdd, 0x56, 0xed, 0x6c, 0xc8, 0x1c, 0x87, 0xc8, 0x31, 0x47, 0xa4, 0x7a, 0xdb, 0xe4, 0x18, 0x91, 0x7f, 0xbd, 0x8b, 0x20, 0x2b, 0xd2, 0x78, 0x60, 0x45, 0xc1, 0xfd, 0x03, + 0x79, 0xce, 0x13, 0xf7, 0x03, 0xb3, 0xff, 0x1b, 0xf0, 0x85, 0x20, 0x2f, 0x77, 0x83, 0x0b, 0xe0, 0xf7, 0xd4, 0xf0, 0xa7, 0x32, 0x02, 0xe7, 0x84, 0xac, 0x0b, 0xd8, 0xc8, 0xdc, 0x2d, 0x84, 0x99, + 0x5c, 0xc5, 0xc8, 0x1c, 0xe6, 0x8b, 0x05, 0xe2, 0x29, 0x4d, 0x4a, 0xef, 0x83, 0x48, 0x1d, 0x95, 0x53, 0x08, 0xc7, 0xf6, 0x25, 0x94, 0xbb, 0x91, 0x5f, 0x7b, 0x3b, 0xda, 0x59, 0x02, 0x22, 0xb4, + 0x08, 0x17, 0x1a, 0xdb, 0xb4, 0x15, 0x92, 0x62, 0xfb, 0x10, 0x27, 0x81, 0x1c, 0x31, 0x2d, 0x3f, 0x2d, 0xe2, 0x30, 0xe9, 0x7b, 0x36, 0x4c, 0x65, 0x07, 0x9e, 0x53, 0xbe, 0x1c, 0x4c, 0xfb, 0x48, + 0xc4, 0xa4, 0x57, 0x9e, 0x75, 0x56, 0xa4, 0xc7, 0x76, 0x60, 0xd8, 0xf6, 0xbd, 0x85, 0x42, 0xf8, 0x31, 0xa7, 0xe1, 0x15, 0xf6, 0x42, 0xfa, 0xe7, 0x9b, 0x73, 0x75, 0x95, 0x1e, 0x4e, 0x43, 0x14, + 0x09, 0xe5, 0x7a, 0x25, 0xca, 0x13, 0x99, 0x97, 0x50, 0x34, 0xb4, 0x0b, 0x79, 0xc8, 0x21, 0x44, 0x1e, 0x25, 0x81, 0x1b, 0x54, 0x13, 0x1e, 0xd0, 0x0f, 0x45, 0x1c, 0xeb, 0x56, 0x2a, 0x2e, 0xdb, + 0xd5, 0xb2, 0xa9, 0xf4, 0x63, 0xd6, 0xee, 0xc0, 0x04, 0x1e, 0x9a, 0x93, 0xe1, 0x06, 0xad, 0xc6, 0x14, 0xa5, 0x0f, 0xbd, 0x05, 0x63, 0xeb, 0x32, 0xb1, 0x5c, 0x17, 0x46, 0xba, 0x84, 0x00, 0x55, + 0xa3, 0x7a, 0xfa, 0xa8, 0xef, 0x4f, 0x59, 0xfd, 0xf5, 0xc9, 0xdc, 0x78, 0x5f, 0x85, 0xf6, 0xb9, 0xe4, 0xec, 0x4f, 0xf9, 0xd2, 0xb7, 0x68, 0xeb, 0x75, 0xb6, 0xcc, 0xbd, 0xd0, 0xef, 0xcf, 0xf7, + 0xd2, 0xbe, 0xc3, 0x3d, 0x31, 0xe7, 0xed, 0xae, 0xef, 0x2e, 0x5a, 0x82, 0x98, 0xe8, 0x87, 0xa3, 0x10, 0x1f, 0x97, 0x49, 0x8d, 0x18, 0x5b, 0x0c, 0x85, 0x65, 0x40, 0x25, 0xa7, 0x6d, 0xb6, 0xe9, + 0x4c, 0x77, 0x01, 0xd0, 0x98, 0x2a, 0x4c, 0xf6, 0x48, 0xad, 0x84, 0xca, 0x31, 0xc1, 0x21, 0x0c, 0x32, 0xe6, 0xeb, 0x59, 0xe5, 0x2b, 0xda, 0x56, 0x95, 0x72, 0x09, 0x62, 0xb0, 0x74, 0xd1, 0x78, + 0x40, 0x14, 0x1a, 0x06, 0xcc, 0x2d, 0x02, 0x60, 0xe7, 0x36, 0x34, 0x27, 0x90, 0x3f, 0x77, 0xe9, 0xea, 0xa4, 0xb5, 0x2e, 0x44, 0xbd, 0x17, 0x90, 0x7b, 0x40, 0x67, 0x3c, 0x83, 0x9e, 0x08, 0xf3, + 0x7c, 0xd9, 0xb7, 0xec, 0x99, 0xba, 0x2d, 0xb7, 0xa1, 0xed, 0x02, 0x21, 0x16, 0x47, 0x40, 0x3b, 0xc4, 0x67, 0x4b, 0x96, 0xd7, 0xcd, 0x62, 0x3a, 0x24, 0x33, 0x58, 0xf3, 0x0c, 0x70, 0xc1, 0x57, + 0x76, 0x2e, 0xcd, 0x35, 0x58, 0x75, 0xb0, 0xd4, 0x5f, 0xf0, 0x93, 0x51, 0x69, 0x4c, 0x16, 0x8b, 0x15, 0xdf, 0x64, 0x23, 0x60, 0x23, 0x8e, 0xb3, 0x62, 0xd7, 0x38, 0x8d, 0xad, 0xea, 0xad, 0x99, + 0x84, 0xb0, 0xd5, 0x90, 0x1c, 0x63, 0x83, 0x3f, 0x99, 0x89, 0xfa, 0xe4, 0xf0, 0xe6, 0xf7, 0x8d, 0x1a, 0xe8, 0x91, 0x18, 0x78, 0x7e, 0x9a, 0xb4, 0xf3, 0x93, 0xc5, 0x02, 0xf5, 0x0a, 0x77, 0x57, + 0x93, 0xcd, 0xbc, 0x83, 0x61, 0x63, 0xdc, 0xd1, 0x93, 0xe3, 0xaa, 0xda, 0xb1, 0x00, 0xb0, 0x4b, 0x24, 0xb7, 0x3b, 0x46, 0xae, 0xb3, 0xc4, 0x68, 0x33, 0x4f, 0xfd, 0x4c, 0xcc, 0xb3, 0x85, 0x17, + 0x42, 0x8a, 0x37, 0xb4, 0x04, 0x53, 0xac, 0x36, 0x54, 0x87, 0x6c, 0xea, 0x9c, 0x2e, 0xb1, 0x66, 0x07, 0x64, 0xe1, 0xb8, 0x5c, 0xa2, 0x47, 0x34, 0xdb, 0x8c, 0xd8, 0x68, 0xe7, 0x13, 0x85, 0xa5, + 0x6d, 0xfb, 0xee, 0x5c, 0xf9, 0x4d, 0xe5, 0xaa, 0xc1, 0xdf, 0xe9, 0x23, 0xf7, 0x8e, 0x43, 0xdf, 0x75, 0x9a, 0x6e, 0x31, 0x13, 0x7d, 0xa8, 0x68, 0xc2, 0xed, 0x57, 0x9c, 0xf8, 0x7b, 0xb3, 0xe3, + 0x5c, 0xce, 0xac, 0x47, 0x39, 0x85, 0x4a, 0xa3, 0x21, 0x01, 0xf2, 0xbd, 0x76, 0x5b, 0xb3, 0x5e, 0x94, 0xee, 0x86, 0x9a, 0x5a, 0xc2, 0x07, 0x08, 0xab, 0x13, 0x7e, 0xe7, 0x93, 0xb9, 0x5b, 0x0f, + 0x73, 0x5a, 0x72, 0x7d, 0x49, 0x33, 0x62, 0xe3, 0x40, 0xb8, 0xad, 0x5f, 0xc7, 0x4b, 0x03, 0x6e, 0x67, 0x99, 0x2d, 0xa6, 0x24, 0xd1, 0x68, 0x08, 0x5c, 0xcc, 0xad, 0x28, 0x04, 0x50, 0x57, 0xd1, + 0x04, 0x55, 0x5e, 0x97, 0x23, 0x86, 0x6d, 0xbe, 0x36, 0x29, 0x0a, 0xe3, 0x30, 0x30, 0x53, 0xfb, 0x9e, 0xda, 0x84, 0xaf, 0x12, 0x1f, 0xfb, 0x92, 0xe7, 0x05, 0x74, 0x38, 0x78, 0xbd, 0x1c, 0x9c, + 0x91, 0xbe, 0x27, 0x01, 0xd9, 0xcd, 0xf2, 0x36, 0x73, 0x99, 0x4d, 0x48, 0xcf, 0xf3, 0x99, 0xef, 0xa9, 0x52, 0x4a, 0x93, 0xc6, 0x18, 0x2e, 0x08, 0xad, 0x18, 0xab, 0x00, 0x25, 0x50, 0xee, 0x9c, + 0x2f, 0x87, 0xeb, 0x68, 0x0f, 0x8c, 0x2b, 0x5e, 0xea, 0x2a, 0xae, 0x91, 0x44, 0x10, 0xda, 0x6c, 0x95, 0x21, 0xc2, 0xf8, 0x38, 0xb8, 0x00, 0x0c, 0x94, 0x8c, 0x2a, 0x32, 0x2f, 0xe9, 0x2e, 0x28, + 0x04, 0x3c, 0x4a, 0xe9, 0x9d, 0xdb, 0x53, 0xea, 0xcd, 0xb6, 0xba, 0xac, 0xdc, 0x7c, 0xca, 0xc6, 0xf4, 0xaf, 0xce, 0xff, 0xb9, 0x71, 0xe2, 0xcd, 0xfb, 0x73, 0x62, 0x3e, 0x1e, 0x0a, 0x73, 0xce, + 0x92, 0xcc, 0x82, 0x4b, 0xfa, 0xe1, 0xc3, 0xc5, 0x03, 0xfa, 0x54, 0xfc, 0xfd, 0xec, 0xf1, 0xdd, 0x16, 0x79, 0xf4, 0x11, 0x9e, 0x5e, 0x63, 0x9f, 0x58, 0x7b, 0xdd, 0x32, 0x38, 0xe3, 0x7e, 0xcf, + 0xe1, 0xd5, 0x7e, 0xe8, 0xce, 0x69, 0xb1, 0x9d, 0xfb, 0xa9, 0x7d, 0x6c, 0xa1, 0xf9, 0x64, 0x09, 0xb3, 0x46, 0xb7, 0x77, 0x66, 0xa1, 0x18, 0x3b, 0x1d, 0xa5, 0xa8, 0xb0, 0xe3, 0xd9, 0xd5, 0x22, + 0xd1, 0xfc, 0xaa, 0x5b, 0x32, 0xe5, 0x98, 0x5f, 0xa4, 0x87, 0x68, 0x8e, 0x4f, 0xf1, 0x15, 0x6f, 0x62, 0x55, 0x3e, 0x17, 0xe6, 0xab, 0x62, 0x6d, 0x1e, 0x61, 0x58, 0xc4, 0x52, 0x64, 0x56, 0x2f, + 0x8c, 0x86, 0xaf, 0xcb, 0x9e, 0x1c, 0x36, 0xcc, 0x93, 0xef, 0x6e, 0xa5, 0x49, 0x55, 0xa4, 0x51, 0xe4, 0xbc, 0x24, 0xf7, 0x7e, 0xe0, 0xe6, 0xdb, 0xd9, 0x36, 0xe7, 0xb0, 0xcd, 0x55, 0x94, 0xe5, + 0xf5, 0xe8, 0xf0, 0xd3, 0xff, 0x7d, 0x3c, 0xec, 0xf3, 0xd5, 0xe3, 0x3b, 0xdb, 0xa1, 0x57, 0xfe, 0xdd, 0xf9, 0x58, 0xa3, 0x22, 0x48, 0xbc, 0xff, 0x6a, 0x3b, 0xa7, 0xa9, 0xb2, 0x78, 0x56, 0xab, + 0xc8, 0x8f, 0xa5, 0xe1, 0x4f, 0x08, 0x7e, 0x82, 0xe1, 0x97, 0xd3, 0xb3, 0xd1, 0x27, 0x88, 0x78, 0x3d, 0x3e, 0x1b, 0xef, 0xe9, 0xc1, 0x9f, 0x38, 0x67, 0x07, 0x45, 0x76, 0x47, 0x40, 0x90, 0x87, + 0x76, 0xbb, 0xbd, 0x80, 0x3e, 0x4b, 0xc6, 0xe9, 0x72, 0x80, 0xf4, 0xdb, 0xf5, 0xe6, 0x73, 0x22, 0x48, 0x8e, 0xd2, 0x84, 0xdc, 0xda, 0x75, 0x6e, 0x9b, 0x7e, 0x23, 0x60, 0x3a, 0x42, 0x50, 0x20, + 0x23, 0x86, 0x65, 0xde, 0xe1, 0xf9, 0xff, 0x60, 0xef, 0xbd, 0x9a, 0x54, 0x57, 0xb6, 0x3f, 0xc1, 0xf7, 0xfe, 0x14, 0x37, 0xce, 0xab, 0x86, 0x83, 0x0c, 0xc8, 0x44, 0x74, 0x77, 0x8c, 0x84, 0x00, + 0x81, 0x90, 0x43, 0x08, 0x99, 0x87, 0x13, 0x21, 0xef, 0x0d, 0xf2, 0x52, 0x44, 0xdf, 0xcf, 0x3e, 0x51, 0x50, 0x55, 0xbb, 0x0c, 0xec, 0xad, 0xcd, 0xdd, 0x1d, 0xff, 0x9e, 0x89, 0x79, 0xaa, 0x94, + 0xa9, 0x25, 0xf2, 0x97, 0x99, 0x2b, 0x57, 0x2e, 0x9b, 0x1d, 0x6d, 0xcf, 0xab, 0x38, 0x05, 0x59, 0x10, 0xcb, 0x4d, 0x73, 0x72, 0x2e, 0x72, 0x0a, 0x60, 0x56, 0xb0, 0x87, 0x89, 0x7d, 0xbb, 0x13, + 0x2a, 0x8a, 0x5e, 0xaf, 0x33, 0x33, 0x5b, 0xd2, 0x62, 0x43, 0xd4, 0xc8, 0x29, 0x27, 0xce, 0xc7, 0x84, 0x1b, 0x7f, 0xa5, 0xdf, 0x7d, 0x3c, 0x4b, 0x3e, 0x6a, 0xc0, 0xff, 0xfa, 0x07, 0xbe, 0xd6, + 0x16, 0xfa, 0xbd, 0x31, 0xfa, 0x9f, 0xff, 0x03, 0x9f, 0x6a, 0x8a, 0xf8, 0xa2, 0xb6, 0xbb, 0xaf, 0x2b, 0x78, 0xe6, 0xa0, 0xfb, 0x91, 0xf0, 0x6d, 0x4c, 0xde, 0x2f, 0x67, 0xe0, 0xb4, 0x23, 0xee, + 0x12, 0xf3, 0xca, 0x72, 0xcb, 0xcd, 0x85, 0xd5, 0xe9, 0x70, 0x39, 0x08, 0x64, 0x00, 0xa6, 0xc1, 0x99, 0x24, 0xce, 0x14, 0xc7, 0x38, 0x00, 0xa1, 0x60, 0x86, 0x05, 0x9f, 0x18, 0x6e, 0xeb, 0x50, + 0x4a, 0x6e, 0x9c, 0x85, 0x7a, 0x6b, 0xed, 0xc7, 0xa8, 0xaf, 0xf4, 0x2d, 0xbd, 0x47, 0x48, 0x82, 0xd4, 0xf5, 0x95, 0xb8, 0x08, 0x32, 0x74, 0x80, 0x4e, 0x67, 0xcb, 0x14, 0xbc, 0x51, 0xad, 0xd3, + 0xe5, 0x76, 0xf3, 0x5b, 0x45, 0x1b, 0x20, 0xf8, 0x6f, 0x08, 0x99, 0x88, 0xa3, 0xef, 0xf6, 0xc5, 0xdf, 0xef, 0xb5, 0xc5, 0xfe, 0xf6, 0x12, 0xd3, 0x7f, 0x24, 0xc2, 0x41, 0x4f, 0xd9, 0x30, 0xee, + 0x7f, 0xe2, 0x8a, 0xed, 0xbd, 0x07, 0xd7, 0xc0, 0x8f, 0x09, 0xd2, 0xf0, 0x3e, 0xa4, 0x9c, 0x23, 0x75, 0x21, 0x20, 0x35, 0xd1, 0xb1, 0xe6, 0xb8, 0x07, 0x9d, 0x0a, 0x3b, 0x02, 0x8e, 0x02, 0xc2, + 0x21, 0x7a, 0x60, 0x43, 0xbc, 0x44, 0xa8, 0x46, 0x0a, 0x78, 0x2d, 0x03, 0xe2, 0xd4, 0x3d, 0xf0, 0xc0, 0xda, 0x63, 0x02, 0x2f, 0xba, 0x70, 0xc7, 0xb0, 0x82, 0xc6, 0x7d, 0x9f, 0x25, 0x0d, 0x8e, + 0x07, 0x97, 0xf9, 0xc2, 0xe9, 0x41, 0x11, 0x16, 0x44, 0x84, 0x14, 0x8f, 0xa7, 0xaf, 0x3a, 0xc2, 0xdf, 0x98, 0xfd, 0xff, 0xdf, 0x77, 0x14, 0x7a, 0x5b, 0x05, 0x5e, 0x99, 0xa7, 0x3f, 0x4f, 0x91, + 0xf6, 0x5c, 0xee, 0xd4, 0x3b, 0xf4, 0xaf, 0x93, 0xe4, 0xdb, 0xdd, 0xa9, 0x19, 0x54, 0x35, 0x0f, 0xcc, 0x54, 0x17, 0x3d, 0x56, 0xee, 0x18, 0x6e, 0xb8, 0x06, 0x20, 0x0b, 0xc2, 0x0a, 0x43, 0xc5, + 0x4a, 0x8b, 0xe4, 0x82, 0xca, 0xc4, 0xbc, 0x00, 0xb0, 0x0e, 0xd3, 0x35, 0x71, 0xbe, 0xa7, 0x98, 0xa0, 0x54, 0x68, 0x5a, 0x09, 0x3a, 0x13, 0x68, 0x49, 0x7e, 0x68, 0xac, 0xe6, 0xe2, 0x19, 0xea, + 0xa9, 0x75, 0x95, 0xf9, 0x9c, 0xd6, 0xcf, 0xdb, 0x8a, 0xde, 0x62, 0x47, 0xf6, 0x30, 0x6f, 0xd7, 0xbf, 0x93, 0x51, 0x72, 0xb2, 0x61, 0xf5, 0x15, 0xa1, 0xc7, 0x87, 0x70, 0xec, 0x29, 0x4e, 0x76, + 0x7d, 0xed, 0x8a, 0xe1, 0xb5, 0x35, 0xbb, 0x11, 0xfa, 0x35, 0x70, 0xa1, 0x0d, 0x60, 0x7b, 0x3d, 0x3c, 0xe3, 0xe7, 0x10, 0x1e, 0x46, 0x69, 0xbb, 0x51, 0x85, 0x38, 0x34, 0xe8, 0xa5, 0x41, 0x8c, + 0x98, 0x00, 0x1b, 0x41, 0x4a, 0x68, 0x9c, 0x79, 0xea, 0x9d, 0xfd, 0xba, 0x67, 0xcd, 0x2a, 0x74, 0x37, 0xab, 0x12, 0x18, 0x34, 0x63, 0xae, 0xa6, 0x5a, 0x65, 0xc7, 0x4c, 0xc8, 0x26, 0x10, 0x6c, + 0x96, 0xe0, 0x80, 0x6a, 0xa1, 0x46, 0xf7, 0x48, 0xba, 0x38, 0x32, 0x19, 0xf4, 0xbc, 0x0f, 0xde, 0x27, 0xb3, 0xf3, 0x6d, 0x6d, 0xfd, 0x57, 0x1c, 0x90, 0x4a, 0xb7, 0x6a, 0xd2, 0x87, 0x59, 0x1c, + 0xc1, 0xa7, 0x2c, 0x28, 0xaf, 0x34, 0x6f, 0x63, 0xf4, 0xd2, 0x9a, 0x81, 0xbf, 0xb6, 0x90, 0x40, 0x33, 0xdc, 0x8d, 0x40, 0xdd, 0x95, 0xb6, 0x32, 0x2a, 0xb8, 0xfe, 0x05, 0xc7, 0x91, 0xd5, 0x85, + 0x0b, 0x4f, 0x20, 0x63, 0x40, 0x4f, 0x17, 0x03, 0xab, 0x83, 0x32, 0x6f, 0xfc, 0xeb, 0xde, 0xfd, 0x6f, 0xf8, 0x6f, 0x64, 0x92, 0xe7, 0x5b, 0xe9, 0x3e, 0x52, 0xa8, 0x82, 0x4f, 0x59, 0x30, 0x4a, + 0xb7, 0xbe, 0x22, 0x51, 0x5f, 0x77, 0xda, 0x09, 0x2b, 0x9c, 0x03, 0x2d, 0x44, 0x57, 0xa5, 0x0a, 0x3b, 0x22, 0x06, 0x01, 0x61, 0xea, 0x51, 0x1a, 0x20, 0x86, 0x21, 0x31, 0xca, 0xc4, 0x68, 0x3c, + 0x68, 0x0d, 0x1f, 0x55, 0xd6, 0xcb, 0xf4, 0x30, 0xc4, 0xfb, 0x5e, 0x3a, 0xaf, 0xe1, 0xa8, 0x01, 0x77, 0x9a, 0xb5, 0x4d, 0x4c, 0x46, 0x14, 0x93, 0x58, 0x07, 0x54, 0x1e, 0xeb, 0x36, 0x22, 0xd0, + 0x29, 0x9c, 0x96, 0x52, 0x1b, 0x12, 0x34, 0xcf, 0x68, 0xab, 0x6f, 0xa5, 0xdf, 0x58, 0xe1, 0xd3, 0x50, 0x6a, 0xaa, 0x9b, 0xc5, 0xf0, 0xfe, 0xe2, 0x7e, 0xe6, 0x24, 0xfd, 0x4a, 0xf3, 0x8a, 0xd6, + 0xb5, 0x35, 0x35, 0xf5, 0xa0, 0x42, 0x64, 0x0c, 0x8e, 0x9b, 0x88, 0x67, 0xcf, 0xdd, 0x78, 0xb5, 0x81, 0x12, 0x70, 0xae, 0x88, 0xd0, 0x2e, 0xaf, 0xc2, 0x66, 0x17, 0x0d, 0xa7, 0x00, 0x0b, 0xa8, + 0x56, 0x3b, 0x73, 0x8c, 0xee, 0x9f, 0x6d, 0x6f, 0xdb, 0xd6, 0x38, 0x81, 0x69, 0x7e, 0x13, 0xc1, 0x8a, 0x70, 0xa0, 0xdd, 0xdd, 0x92, 0xda, 0xc2, 0x29, 0x36, 0x6f, 0xba, 0xc1, 0x3c, 0x9c, 0x4f, + 0xa8, 0x67, 0xd5, 0xab, 0xee, 0x34, 0x8c, 0xbf, 0xe6, 0x89, 0x61, 0x7e, 0xd3, 0x67, 0xfe, 0xcf, 0xff, 0xf1, 0xcd, 0xf6, 0xfb, 0x0c, 0xbb, 0xf4, 0x1c, 0xfb, 0x27, 0x22, 0xca, 0x13, 0xcb, 0xd0, + 0x73, 0xec, 0x17, 0x2c, 0x3d, 0xc7, 0xbe, 0x8a, 0x1f, 0x13, 0x78, 0xe4, 0x19, 0x0e, 0xf2, 0xd6, 0x19, 0x37, 0x96, 0x10, 0x62, 0xd8, 0x5c, 0x35, 0x23, 0x53, 0xe6, 0xb4, 0x18, 0x16, 0x0e, 0x29, + 0xd0, 0xf3, 0x3b, 0x57, 0x72, 0x38, 0xae, 0xa1, 0xb0, 0xd0, 0x8e, 0x30, 0x2b, 0x46, 0xc7, 0x10, 0xde, 0xe0, 0xdb, 0x2d, 0xd9, 0x87, 0xbe, 0x9d, 0xd1, 0x9b, 0x62, 0xcf, 0x58, 0xfc, 0xc0, 0xdb, + 0xfe, 0xb0, 0xa7, 0x43, 0x11, 0xc0, 0x33, 0xa1, 0xd4, 0x97, 0xb6, 0xb1, 0x2d, 0x7f, 0x6e, 0x1a, 0xbb, 0x1a, 0xa2, 0x7f, 0x9a, 0x4a, 0x76, 0xf9, 0x54, 0x41, 0xcf, 0x0f, 0x74, 0xe7, 0xb3, 0x8f, + 0x57, 0xb3, 0xe5, 0xb4, 0xc2, 0x9e, 0x65, 0x81, 0xc8, 0x39, 0x88, 0xb1, 0xb6, 0x93, 0xa6, 0xac, 0xb5, 0x6d, 0x7d, 0x93, 0xef, 0x25, 0x79, 0x5f, 0x62, 0xd6, 0xf6, 0x2c, 0x9f, 0xe3, 0xa5, 0x4c, + 0xac, 0x2f, 0xd0, 0x06, 0x28, 0x0a, 0xeb, 0x98, 0x63, 0x20, 0xa0, 0xbb, 0x26, 0xdd, 0xc7, 0xdd, 0x92, 0x76, 0x70, 0x5e, 0xe4, 0x81, 0x2d, 0x8d, 0x5a, 0x51, 0xa6, 0xa7, 0xf0, 0xb9, 0x11, 0x9b, + 0x95, 0x96, 0x16, 0x8d, 0xde, 0xa6, 0xab, 0xcf, 0xa1, 0x71, 0xff, 0x7f, 0x61, 0xcf, 0x87, 0x9f, 0xf9, 0x0f, 0x0b, 0x7b, 0x5e, 0x87, 0xfb, 0x2a, 0x89, 0xc3, 0x3f, 0x91, 0xe6, 0x7e, 0x7f, 0x49, + 0x7d, 0xa0, 0xfb, 0x36, 0xa9, 0x6e, 0x57, 0x53, 0x6b, 0x34, 0x8b, 0xa6, 0x22, 0x6f, 0x2a, 0xc5, 0xe4, 0xf9, 0x86, 0xed, 0x62, 0x2a, 0x8c, 0x72, 0x52, 0x64, 0x48, 0x16, 0x9d, 0xbb, 0x1c, 0x7a, + 0x0e, 0xcb, 0x76, 0x10, 0xd5, 0xc4, 0xc0, 0x28, 0x52, 0x1a, 0x16, 0x34, 0x10, 0xac, 0xda, 0x60, 0x41, 0xa1, 0xc9, 0x6e, 0x0b, 0x64, 0xa2, 0x13, 0x58, 0x1b, 0x6f, 0x67, 0x89, 0x80, 0x7f, 0xda, + 0x52, 0x76, 0xe9, 0x54, 0x82, 0xa9, 0x54, 0xe0, 0x06, 0x30, 0x28, 0x61, 0xa2, 0xdf, 0xf2, 0x6d, 0x63, 0xfb, 0xeb, 0xdf, 0xe0, 0x44, 0xff, 0xc1, 0x47, 0x2e, 0x22, 0xf7, 0xe1, 0x5c, 0x3c, 0xe1, + 0xa4, 0x79, 0xf7, 0x0b, 0x6f, 0xc0, 0x7e, 0xbd, 0x3f, 0xbb, 0x7e, 0xe3, 0xd7, 0x10, 0xbb, 0xb0, 0x45, 0x93, 0xb0, 0xba, 0x3f, 0x81, 0x5d, 0x5f, 0xb9, 0x67, 0x67, 0x91, 0x54, 0xb4, 0xb8, 0x00, + 0x10, 0x81, 0xd7, 0x50, 0xa6, 0xe0, 0x34, 0xc9, 0x84, 0x8c, 0x60, 0x23, 0x61, 0xb2, 0x02, 0x6c, 0xa3, 0x56, 0x38, 0xae, 0x52, 0x39, 0xb0, 0x56, 0x5c, 0x52, 0x97, 0xf5, 0x8e, 0xf6, 0x62, 0x3d, + 0x38, 0x33, 0xa5, 0x60, 0x8b, 0x75, 0x04, 0xb0, 0x41, 0x4a, 0x53, 0x8e, 0xe8, 0x18, 0x34, 0xf4, 0x3b, 0x07, 0xd5, 0x49, 0x56, 0xaa, 0x2f, 0x95, 0x93, 0xef, 0x63, 0xfa, 0x8c, 0x69, 0xe1, 0x23, + 0xe1, 0x57, 0x28, 0xdf, 0x2e, 0xa7, 0xe6, 0x63, 0xd0, 0x8d, 0x1c, 0x61, 0x71, 0x58, 0xa6, 0xb1, 0x63, 0x38, 0x84, 0xe0, 0x1a, 0x5a, 0x4b, 0x62, 0x1e, 0x1d, 0x46, 0x2c, 0x2e, 0xdc, 0x22, 0x93, + 0xa5, 0x1d, 0xb1, 0x1b, 0x44, 0x8b, 0x61, 0x7c, 0x48, 0xd3, 0x34, 0xb7, 0xb5, 0x96, 0xce, 0x7e, 0x87, 0xd5, 0xc5, 0xc0, 0xc3, 0x24, 0xdd, 0x6f, 0x6d, 0xc9, 0x62, 0xb6, 0x58, 0x6b, 0x0f, 0x47, + 0x26, 0x06, 0x6d, 0xab, 0xbb, 0xd8, 0x52, 0x19, 0xde, 0x32, 0x33, 0xff, 0x04, 0x0e, 0xd7, 0x6e, 0x4a, 0x77, 0x76, 0xcd, 0xe4, 0xf7, 0x33, 0x5f, 0x4c, 0xf8, 0xef, 0x67, 0x0e, 0x0d, 0xdf, 0xa8, + 0xbf, 0x00, 0xf3, 0xf5, 0xde, 0xec, 0x4a, 0xfb, 0xd7, 0xe8, 0xa0, 0xa6, 0x02, 0x1c, 0xbb, 0xca, 0x1d, 0x3b, 0xec, 0x7c, 0xc4, 0xe7, 0xd9, 0xd0, 0xb2, 0xa7, 0x1e, 0x97, 0x0a, 0x95, 0x21, 0x36, + 0xa5, 0xad, 0x87, 0x9a, 0x96, 0x5c, 0x56, 0x8b, 0x71, 0xe9, 0x2c, 0x35, 0x89, 0xa2, 0x8f, 0x97, 0xda, 0xf2, 0xaa, 0x63, 0x94, 0x75, 0xdb, 0xe1, 0x62, 0x85, 0x88, 0xef, 0x38, 0x7c, 0xad, 0x32, + 0xcd, 0x3a, 0x26, 0x04, 0x92, 0x57, 0xf2, 0xfa, 0x00, 0xa3, 0x17, 0x56, 0xf9, 0xb9, 0xbf, 0xf8, 0x7b, 0x7c, 0xff, 0x3d, 0x48, 0xb0, 0xbf, 0x97, 0x4f, 0xc8, 0x5a, 0x37, 0x92, 0x57, 0x1c, 0x5e, + 0x1a, 0xb3, 0x2b, 0x95, 0x5f, 0x77, 0x1e, 0xb2, 0x56, 0xf2, 0x5a, 0x3e, 0xa3, 0x62, 0x0b, 0x84, 0x30, 0xc4, 0xb4, 0x45, 0x5f, 0x20, 0x74, 0x0f, 0x14, 0x32, 0x8d, 0x27, 0x3b, 0xb1, 0xc6, 0x9b, + 0x73, 0x74, 0x2c, 0x7b, 0x52, 0xa9, 0xe7, 0x99, 0x55, 0x75, 0xba, 0x0d, 0xd4, 0x2c, 0xaa, 0xc3, 0x56, 0x1d, 0x2a, 0x87, 0xc8, 0x59, 0x00, 0x5e, 0x76, 0x81, 0x96, 0xa2, 0x06, 0x64, 0x17, 0x89, + 0x5e, 0x61, 0x82, 0x57, 0x63, 0x6a, 0xdc, 0xd9, 0x13, 0x15, 0xb6, 0x1f, 0x33, 0xca, 0xbd, 0x39, 0xd1, 0xbd, 0x2d, 0xb4, 0xf7, 0x7f, 0xff, 0xe6, 0x63, 0xf6, 0x23, 0x37, 0x82, 0x15, 0x66, 0xaf, + 0xbd, 0xfd, 0xfd, 0xe8, 0xc9, 0xa9, 0xab, 0xfa, 0x4e, 0xce, 0xc1, 0xfb, 0xd3, 0xf8, 0x19, 0xad, 0xea, 0x37, 0xea, 0xd7, 0xe1, 0xfb, 0x72, 0x6f, 0x6a, 0x76, 0xb1, 0xe3, 0x39, 0x3b, 0x4b, 0xfd, + 0x49, 0x6b, 0xdc, 0x32, 0x46, 0x97, 0x88, 0xe6, 0x35, 0x49, 0x28, 0xf4, 0x94, 0x88, 0x43, 0xb2, 0x07, 0x02, 0x17, 0x4f, 0x5a, 0x63, 0xc8, 0x61, 0xa7, 0xb3, 0xf6, 0xc0, 0xe9, 0xcc, 0x96, 0x58, + 0x90, 0x0d, 0x03, 0xc6, 0x7e, 0x29, 0x15, 0x47, 0xba, 0x39, 0x19, 0x99, 0x9c, 0x46, 0xc5, 0x50, 0x31, 0xe9, 0xd8, 0xef, 0x35, 0x96, 0xf7, 0x4c, 0x54, 0x8c, 0x36, 0xc1, 0xf0, 0xf3, 0x14, 0x23, + 0xdf, 0xca, 0xfd, 0xdf, 0x97, 0x75, 0x9f, 0x51, 0x70, 0x7e, 0x26, 0x7d, 0xc3, 0xe5, 0xc3, 0x8d, 0xa9, 0x29, 0x16, 0xd7, 0xcb, 0x03, 0xad, 0x61, 0x6a, 0x59, 0xe0, 0x4b, 0x36, 0x4c, 0x96, 0x56, + 0x60, 0xb4, 0x0b, 0x34, 0xc2, 0x23, 0xc1, 0xb5, 0x72, 0xf6, 0xb2, 0xdc, 0x73, 0xa9, 0xce, 0x21, 0xfe, 0x79, 0xeb, 0x6c, 0x19, 0xbc, 0xdf, 0x14, 0xa2, 0xaa, 0x29, 0x5c, 0xc5, 0x97, 0x89, 0x40, + 0xaf, 0xca, 0x38, 0xef, 0xb9, 0xb5, 0xcb, 0x87, 0x73, 0xcd, 0xd8, 0x75, 0xcd, 0xb1, 0xd5, 0x17, 0x1a, 0xdf, 0xe9, 0xdc, 0xbe, 0xf8, 0xc5, 0xda, 0xfe, 0x6c, 0x5e, 0xfd, 0x73, 0xa7, 0xa9, 0x8f, + 0x84, 0x5f, 0x00, 0xf9, 0x70, 0x39, 0xf5, 0x5c, 0x75, 0x59, 0x6a, 0xe2, 0x50, 0x5f, 0x36, 0xeb, 0x1d, 0xcb, 0xc4, 0x5b, 0x27, 0xe4, 0x76, 0xa5, 0x0e, 0x81, 0x69, 0x7b, 0x38, 0xb6, 0x99, 0x14, + 0x2c, 0xe0, 0x39, 0xb0, 0xcd, 0xa9, 0x64, 0xa3, 0x22, 0x16, 0x7c, 0xd0, 0x0e, 0x6b, 0xb8, 0xef, 0xf7, 0x85, 0xb1, 0x71, 0x52, 0x62, 0xd1, 0xb9, 0x20, 0x65, 0xe6, 0x67, 0xe4, 0xd8, 0xed, 0x87, + 0xed, 0xc5, 0x5f, 0x76, 0x32, 0xe6, 0x16, 0xfd, 0xa9, 0x05, 0x8d, 0x76, 0xa2, 0x23, 0xcf, 0x2f, 0xa2, 0xac, 0xee, 0x15, 0x60, 0xfe, 0xa2, 0x9d, 0xfc, 0x16, 0x6e, 0xfb, 0xf2, 0x0e, 0x71, 0x8f, + 0x69, 0xfc, 0x6f, 0xd7, 0xb2, 0x3c, 0x4c, 0xc2, 0xf2, 0x07, 0x45, 0xd3, 0xbb, 0x9f, 0xb8, 0x0e, 0xfc, 0xbd, 0x07, 0x53, 0x05, 0x56, 0x13, 0xa6, 0x08, 0x1d, 0x64, 0x13, 0x5e, 0x4b, 0x88, 0x66, + 0xde, 0x56, 0x2a, 0x5a, 0x9d, 0x76, 0x0d, 0xd1, 0x6e, 0xd7, 0x85, 0xc7, 0x36, 0x70, 0x77, 0x3c, 0xa3, 0x09, 0xc4, 0x20, 0xda, 0xda, 0xac, 0xe6, 0xa0, 0xaf, 0xec, 0xc6, 0xed, 0x48, 0xe5, 0xe2, + 0x7c, 0x97, 0x37, 0x27, 0x5b, 0x91, 0xac, 0x94, 0xd8, 0xab, 0xc6, 0x81, 0x41, 0x56, 0x42, 0x3f, 0x64, 0x20, 0x72, 0xd2, 0x93, 0x8d, 0xd9, 0xa3, 0xcf, 0x6b, 0xcd, 0xbe, 0x65, 0xba, 0xf9, 0x36, + 0x96, 0x7f, 0x84, 0x8d, 0x7f, 0xf4, 0x78, 0xbe, 0x37, 0x44, 0xc8, 0x53, 0x07, 0xf2, 0x1f, 0x64, 0x5f, 0x86, 0xe5, 0xfd, 0x62, 0x86, 0x4c, 0x3b, 0x9c, 0x1f, 0xf4, 0xbe, 0x40, 0x16, 0x6c, 0x62, + 0x40, 0x26, 0xbc, 0xb7, 0x70, 0x43, 0xf2, 0x37, 0x2b, 0x16, 0xc9, 0xc2, 0x1d, 0x33, 0x86, 0x96, 0xd3, 0xd5, 0x1d, 0xaf, 0xa8, 0xac, 0x0f, 0x5e, 0xa4, 0xe3, 0x58, 0xd1, 0xf9, 0x1e, 0xd9, 0x7a, + 0x7e, 0xec, 0xe1, 0xac, 0x43, 0x9d, 0x36, 0x0a, 0x22, 0xc7, 0x6e, 0x44, 0xaf, 0x77, 0x89, 0xda, 0x65, 0x72, 0x56, 0x9c, 0x1d, 0xc1, 0xd8, 0x05, 0x1b, 0x2e, 0x99, 0x4f, 0xf4, 0xee, 0x7a, 0xe0, + 0x62, 0x3f, 0x01, 0xca, 0x37, 0x9f, 0xe2, 0x7b, 0x30, 0x2e, 0x9e, 0xe3, 0xf5, 0x57, 0x92, 0x2f, 0x10, 0x5e, 0x1b, 0xb3, 0xc5, 0x34, 0xde, 0xae, 0xd8, 0x91, 0xbd, 0x17, 0xd4, 0x38, 0x2b, 0xf9, + 0x78, 0x83, 0x8a, 0x07, 0x0d, 0x47, 0x2e, 0x36, 0xc3, 0xa1, 0x2c, 0xe3, 0x9f, 0x59, 0x3e, 0x3e, 0xa3, 0xb0, 0x8e, 0x9b, 0xcb, 0x46, 0xa7, 0xcf, 0x2d, 0x31, 0x38, 0x5b, 0xe9, 0xdc, 0x91, 0x0c, + 0xc7, 0x5e, 0x18, 0x67, 0x1f, 0xb9, 0xd0, 0xf9, 0xa4, 0x16, 0x49, 0xb4, 0x05, 0x55, 0xbd, 0x58, 0xd1, 0x41, 0xb9, 0x72, 0x48, 0x41, 0x67, 0x16, 0x27, 0xf5, 0x77, 0xce, 0x05, 0xff, 0x82, 0xc0, + 0xbf, 0xfb, 0x29, 0x90, 0xd5, 0x66, 0xdd, 0x54, 0xee, 0x23, 0x7b, 0x15, 0xfc, 0x54, 0xbc, 0xd6, 0x1b, 0xd1, 0x17, 0xd8, 0x5e, 0x9b, 0x57, 0x16, 0x30, 0x41, 0x11, 0x72, 0xec, 0x78, 0x92, 0x30, + 0xe6, 0x98, 0x58, 0xb2, 0x20, 0x5a, 0xea, 0x87, 0xdd, 0xb8, 0xe1, 0x12, 0x73, 0x03, 0x24, 0x18, 0x12, 0x76, 0xc5, 0x58, 0x5d, 0x8e, 0xbb, 0x8d, 0x6f, 0x71, 0x07, 0xeb, 0x64, 0x1f, 0x68, 0xd4, + 0x16, 0xcc, 0x1c, 0x87, 0x4f, 0xa6, 0xea, 0x7a, 0xa2, 0x26, 0xb5, 0x14, 0xec, 0x09, 0xab, 0x05, 0x19, 0x35, 0xba, 0xbc, 0xce, 0x1c, 0x19, 0xe3, 0xe7, 0xe9, 0x69, 0x65, 0xc5, 0xce, 0xef, 0xe8, + 0x23, 0x27, 0x7a, 0x3c, 0x7c, 0xb3, 0xa9, 0xff, 0x39, 0x55, 0xda, 0x67, 0xd2, 0x57, 0x0c, 0x3f, 0xde, 0x98, 0xaa, 0x5e, 0x0b, 0xe2, 0xa3, 0x86, 0x2b, 0x90, 0x1a, 0xed, 0x37, 0x0e, 0x7e, 0xa8, + 0xe8, 0x3d, 0x3c, 0x48, 0xf3, 0x4e, 0x55, 0x7b, 0x33, 0x2f, 0xd6, 0x15, 0x49, 0x29, 0x90, 0xe6, 0xc5, 0x1c, 0x4e, 0x02, 0x11, 0x08, 0xe0, 0xcb, 0x3d, 0xb9, 0x2d, 0x8a, 0x1a, 0x42, 0xed, 0x12, + 0x52, 0x03, 0x1f, 0x65, 0x77, 0x96, 0xb5, 0xc8, 0x63, 0x05, 0xe5, 0x2e, 0x09, 0x4a, 0x09, 0x11, 0xd0, 0x34, 0xc5, 0xbc, 0x63, 0xdd, 0x89, 0xd2, 0xf3, 0x67, 0x3d, 0xdb, 0x5f, 0xff, 0x5e, 0x4e, + 0xd5, 0x02, 0x5c, 0x7b, 0xfa, 0xc1, 0x9e, 0x59, 0x97, 0xe1, 0x23, 0xb6, 0xf8, 0x5c, 0x85, 0xe1, 0xbb, 0x5f, 0x78, 0xc7, 0xf8, 0xcb, 0xfd, 0xa9, 0x55, 0x87, 0x03, 0x75, 0x15, 0xcf, 0xc3, 0x8b, + 0x87, 0x25, 0x05, 0x38, 0x27, 0xfd, 0xd3, 0x06, 0x9b, 0x3b, 0x8e, 0x00, 0xed, 0xd4, 0x5a, 0xe6, 0x45, 0x52, 0x8e, 0x92, 0x71, 0x15, 0xda, 0xe7, 0x65, 0x58, 0x92, 0x67, 0x67, 0x0d, 0xf9, 0x65, + 0x54, 0x65, 0x2e, 0x0b, 0xa3, 0xfa, 0x16, 0xed, 0xc9, 0x15, 0x47, 0xad, 0x9d, 0x55, 0x2b, 0xe0, 0x9e, 0x22, 0x9f, 0x40, 0x65, 0xa4, 0xb9, 0x60, 0x0e, 0x4b, 0x03, 0xf0, 0x28, 0xaf, 0xe2, 0x04, + 0xf4, 0xff, 0x03, 0x43, 0xea, 0x87, 0xd7, 0xee, 0x16, 0x30, 0x01, 0x67, 0x99, 0xdb, 0xd7, 0xff, 0xef, 0x29, 0x77, 0x73, 0x77, 0x58, 0x6f, 0xd9, 0xc5, 0xff, 0xa0, 0xf0, 0xfb, 0xe0, 0x23, 0x8f, + 0xa6, 0x95, 0x9b, 0x39, 0x53, 0x85, 0xe2, 0x81, 0xe8, 0x57, 0x51, 0x07, 0x89, 0x30, 0x42, 0x76, 0x31, 0xbe, 0x6e, 0x4f, 0x85, 0x3d, 0x1c, 0x60, 0x7e, 0x57, 0x42, 0x11, 0xd6, 0xed, 0x11, 0xc2, + 0x03, 0x62, 0x34, 0x69, 0x8f, 0x99, 0xcc, 0x8d, 0x40, 0x3a, 0x12, 0xab, 0xed, 0x48, 0xf0, 0xba, 0xe8, 0x26, 0x74, 0xbc, 0x80, 0x63, 0x61, 0x44, 0x81, 0x4b, 0x82, 0xf7, 0x91, 0xc7, 0xe2, 0xb9, + 0x3e, 0x0e, 0x48, 0x44, 0x8a, 0x4b, 0x49, 0x59, 0x4e, 0x5c, 0xc4, 0xff, 0xc1, 0x34, 0xfa, 0x3f, 0x64, 0xa0, 0xab, 0xda, 0xfc, 0x69, 0xbc, 0xd6, 0x1f, 0x1a, 0xea, 0xeb, 0x67, 0x1e, 0x0d, 0xf6, + 0xf5, 0xe1, 0xd4, 0xe1, 0x8e, 0x02, 0xd4, 0x25, 0xf0, 0x85, 0x40, 0x79, 0x6d, 0x2f, 0x2f, 0xc1, 0xda, 0xd1, 0xe1, 0xec, 0x68, 0x64, 0xf9, 0x6a, 0x39, 0x4f, 0x0f, 0x1b, 0x56, 0x38, 0xae, 0x25, + 0xaf, 0xc3, 0xeb, 0xe5, 0x30, 0xd4, 0x71, 0xae, 0x54, 0xfb, 0x23, 0xdf, 0xb7, 0xbb, 0xf9, 0x1a, 0x21, 0x2e, 0x0d, 0x54, 0xd1, 0xa0, 0x50, 0xab, 0x3b, 0x44, 0x58, 0x81, 0x9a, 0xcf, 0xca, 0xa9, + 0xad, 0x76, 0x63, 0xd8, 0xe9, 0x8d, 0xf1, 0xf4, 0x19, 0xe8, 0xff, 0xe4, 0xe1, 0x6e, 0x0a, 0xb7, 0x34, 0xfd, 0xc7, 0xf1, 0x28, 0xf8, 0x53, 0xf5, 0x80, 0x7f, 0x90, 0xbd, 0xe5, 0x4d, 0x7b, 0xbd, + 0x98, 0xe1, 0xd3, 0xaa, 0x02, 0xe7, 0xd4, 0x0a, 0x30, 0xf9, 0x6a, 0x15, 0x8d, 0x63, 0x94, 0x0a, 0x4b, 0x52, 0x10, 0x29, 0x71, 0x23, 0x03, 0x06, 0xc6, 0x88, 0x63, 0xd2, 0x03, 0xb4, 0x54, 0xce, + 0x4d, 0xa6, 0xe3, 0x40, 0x3c, 0xde, 0x01, 0x47, 0x78, 0xe1, 0x57, 0x74, 0x4a, 0xca, 0xd0, 0x81, 0xf3, 0x46, 0x13, 0xf2, 0x58, 0x40, 0x04, 0x64, 0x36, 0x39, 0x91, 0x39, 0x6f, 0x14, 0x42, 0x9b, + 0xe7, 0xeb, 0x79, 0x71, 0x14, 0x20, 0xe6, 0x3f, 0x70, 0xa8, 0xc9, 0xd3, 0x22, 0xcf, 0x5e, 0x7e, 0xbf, 0x9b, 0x86, 0x75, 0xfd, 0xc9, 0xf5, 0xef, 0xff, 0xfa, 0xf8, 0x5a, 0x1e, 0x87, 0x6e, 0x64, + 0xbe, 0xe5, 0xe9, 0xfc, 0xb2, 0x0f, 0xfc, 0xc8, 0x38, 0xba, 0xb8, 0x1a, 0xb5, 0x3f, 0x3c, 0xba, 0x46, 0xba, 0xbe, 0xea, 0xcf, 0x3f, 0x47, 0x75, 0x7e, 0x89, 0x78, 0xf5, 0xf2, 0x32, 0x9d, 0x39, + 0x66, 0x6d, 0xfe, 0x75, 0x37, 0x16, 0xf0, 0xe5, 0x71, 0x78, 0x75, 0xe9, 0x7c, 0xfd, 0xf7, 0xaf, 0x29, 0x4b, 0xdf, 0x0b, 0x0d, 0xdc, 0x66, 0xdc, 0xa7, 0x89, 0xf9, 0x96, 0x33, 0xfe, 0xb3, 0x9a, + 0xeb, 0x5f, 0xff, 0xfa, 0xeb, 0x72, 0xfb, 0x87, 0xab, 0xdb, 0xfb, 0x67, 0x7f, 0xc8, 0x8f, 0xe7, 0x3a, 0xe4, 0x83, 0xb8, 0x37, 0x75, 0x33, 0x43, 0xff, 0x5e, 0xfc, 0x0d, 0xfe, 0xeb, 0xbf, 0x43, + 0xc8, 0xab, 0xfb, 0xe3, 0x14, 0x1b, 0xf6, 0x75, 0x36, 0xd5, 0x8f, 0x2b, 0xb0, 0xa0, 0x4f, 0x79, 0x86, 0xbd, 0x53, 0x7d, 0x9b, 0xaf, 0x2f, 0xed, 0x19, 0x3a, 0xcd, 0xff, 0x2b, 0x38, 0xe6, 0x01, + 0xef, 0xee, 0xbc, 0x78, 0x6e, 0x93, 0x0b, 0x7c, 0xd5, 0x17, 0xe6, 0xbc, 0x5b, 0xe0, 0x41, 0x5c, 0x8b, 0xa8, 0x61, 0x1e, 0x2f, 0x9a, 0x05, 0x4a, 0xe7, 0x65, 0x79, 0x68, 0x55, 0x70, 0x85, 0x15, + 0xe6, 0xb1, 0xa2, 0x14, 0x44, 0x5a, 0x8e, 0x83, 0x33, 0xea, 0x65, 0x95, 0x08, 0xfb, 0x3a, 0x9a, 0xfb, 0xce, 0x02, 0xbf, 0xf4, 0xcb, 0x05, 0x18, 0xb1, 0xb5, 0x5d, 0xa1, 0xed, 0x16, 0xf2, 0x9e, + 0x17, 0x5b, 0x7e, 0x3a, 0xca, 0x9f, 0x16, 0xfc, 0x5f, 0xff, 0xe0, 0x4f, 0xd5, 0x32, 0xbd, 0x8e, 0xdb, 0x84, 0xb1, 0xaa, 0xcd, 0xe2, 0x91, 0x4d, 0x60, 0xf1, 0x37, 0x84, 0x3c, 0xc1, 0x58, 0x5e, + 0x28, 0xce, 0x67, 0xd7, 0x3f, 0xb3, 0x1b, 0x89, 0x5f, 0x0f, 0x0f, 0x38, 0xd7, 0x61, 0x50, 0xec, 0x8e, 0x3b, 0x25, 0x96, 0xec, 0xd3, 0x4a, 0x0e, 0x17, 0x24, 0x29, 0x57, 0x80, 0x40, 0xf2, 0x86, + 0xd1, 0x5d, 0x44, 0xd6, 0x0c, 0x8b, 0xed, 0x6a, 0xdd, 0x15, 0x10, 0xe8, 0x48, 0x5c, 0x58, 0x9c, 0x5b, 0xd9, 0xe8, 0x14, 0x65, 0x15, 0x82, 0x90, 0x3e, 0x17, 0xe2, 0x64, 0xb7, 0x1d, 0x18, 0x76, + 0x13, 0xec, 0xec, 0x28, 0xb7, 0x63, 0x80, 0x66, 0x33, 0xca, 0x3b, 0x90, 0x9b, 0xe7, 0xb5, 0x21, 0x8e, 0xeb, 0x16, 0x33, 0xf7, 0xd2, 0x98, 0x57, 0x2e, 0xfe, 0x6f, 0xe8, 0xeb, 0x1a, 0xbf, 0x6d, + 0x10, 0xce, 0xeb, 0xc3, 0xaf, 0x79, 0x8a, 0xf2, 0xfa, 0x96, 0x9e, 0xf8, 0xaf, 0x9b, 0x51, 0xf0, 0xcb, 0xe8, 0x7a, 0x79, 0x39, 0x7b, 0xab, 0x85, 0xf7, 0xef, 0x17, 0x56, 0xfb, 0x89, 0x03, 0xbd, + 0xd7, 0xd9, 0x7f, 0xdb, 0x9d, 0xbe, 0x7f, 0xfc, 0xad, 0xf4, 0xf9, 0xbf, 0xb1, 0xbf, 0xa1, 0x0f, 0x39, 0xd5, 0x7f, 0x54, 0xbf, 0xbd, 0xfe, 0xa4, 0x4f, 0x54, 0xc3, 0x2c, 0x70, 0xcb, 0xf0, 0xe6, + 0x52, 0xfd, 0x6f, 0xf8, 0x93, 0x34, 0xf0, 0xaf, 0x6b, 0x45, 0xf5, 0xb7, 0x9a, 0xc2, 0xb7, 0xff, 0x5d, 0x7e, 0xe6, 0x39, 0xef, 0x89, 0xdd, 0x5f, 0x9e, 0xc2, 0x9f, 0x9f, 0x7e, 0xd7, 0x05, 0xfe, + 0x1b, 0xfa, 0x64, 0x4a, 0xfa, 0x31, 0x6f, 0xde, 0x7a, 0xf3, 0xfd, 0xe9, 0xab, 0xa3, 0xd4, 0x0b, 0x1c, 0x5f, 0x23, 0xa7, 0x1f, 0x1c, 0x92, 0x6e, 0xbf, 0xe4, 0x13, 0x2c, 0x5f, 0x5d, 0x92, 0xee, + 0xb0, 0xba, 0x6f, 0x36, 0x8c, 0xd7, 0xc9, 0x7f, 0xb5, 0x60, 0x5c, 0xdb, 0xd3, 0xd6, 0xcb, 0xe7, 0xfc, 0xa6, 0x13, 0xb3, 0x0f, 0x3e, 0x63, 0x5f, 0xfb, 0x75, 0xf2, 0xc1, 0x49, 0x96, 0x35, 0x13, + 0x2b, 0xd6, 0x8c, 0x13, 0x40, 0x3d, 0xbb, 0x23, 0xfd, 0xd3, 0x20, 0x2b, 0x5b, 0xff, 0xc0, 0xf5, 0xf3, 0xbe, 0xa3, 0x8d, 0x2a, 0xe6, 0x21, 0xc5, 0x41, 0x5d, 0x5f, 0xd7, 0x79, 0x64, 0xed, 0x1c, + 0xd5, 0x85, 0xc1, 0x89, 0xfc, 0x9a, 0x56, 0x4e, 0x1b, 0x20, 0xe8, 0x06, 0xf8, 0xa0, 0xac, 0x00, 0x2a, 0x01, 0xe4, 0xe1, 0xa0, 0x91, 0x7c, 0xd6, 0x8d, 0xf3, 0x68, 0x08, 0xe6, 0x97, 0xa6, 0xbe, + 0x59, 0xd6, 0x7e, 0xb6, 0xba, 0xfe, 0xb7, 0xcb, 0x45, 0x3f, 0x22, 0x52, 0xef, 0x01, 0x0e, 0x3e, 0x65, 0xe4, 0x7d, 0xa5, 0xf9, 0xc2, 0xbe, 0x6e, 0xad, 0x19, 0x38, 0xcd, 0xb4, 0x0b, 0x6c, 0xc1, + 0xc3, 0xc1, 0x8f, 0xa2, 0x9c, 0xa0, 0x0c, 0x0d, 0xe6, 0x3c, 0xa7, 0x15, 0x3d, 0x06, 0xe0, 0xd8, 0xc3, 0xaa, 0xec, 0x13, 0x4d, 0xd6, 0x5d, 0x7b, 0x49, 0x9b, 0xa2, 0x2e, 0x42, 0x9e, 0x8b, 0xee, + 0x86, 0xc0, 0x03, 0xe7, 0x9e, 0x9c, 0xee, 0x41, 0x6b, 0x13, 0x1a, 0xd0, 0x06, 0xa7, 0x4e, 0xa8, 0xbd, 0xd5, 0x12, 0xf8, 0x50, 0x24, 0xb5, 0x54, 0xd4, 0x63, 0xa4, 0xb1, 0xea, 0x3a, 0x66, 0x27, + 0x1e, 0x5e, 0xac, 0x30, 0xab, 0x4b, 0xf7, 0x26, 0xa5, 0x42, 0x9f, 0x4a, 0x2d, 0xfe, 0x04, 0xbc, 0x2f, 0xb9, 0x25, 0xee, 0x2b, 0xc4, 0x9e, 0x51, 0xe9, 0x7c, 0xa2, 0xfc, 0x02, 0xe4, 0xc7, 0xeb, + 0x6b, 0x32, 0x9a, 0x09, 0x33, 0x36, 0x36, 0xe9, 0x4b, 0x0a, 0xd1, 0xeb, 0x13, 0x51, 0x14, 0x08, 0xaf, 0x75, 0x47, 0x1c, 0xc1, 0x61, 0x95, 0xb1, 0xb2, 0x42, 0xcb, 0x8e, 0x31, 0x4f, 0xf4, 0x5b, + 0x9e, 0x70, 0xa4, 0x1a, 0xa1, 0x60, 0xc0, 0x49, 0xb5, 0x50, 0xc5, 0x35, 0x48, 0x16, 0xba, 0x74, 0x23, 0xf4, 0xe4, 0xba, 0x5c, 0x4b, 0x0b, 0x4c, 0xb0, 0x02, 0x83, 0x40, 0xf7, 0xe8, 0x10, 0x18, + 0xbc, 0xd6, 0x0c, 0x2b, 0xe1, 0x80, 0x4d, 0x85, 0xf3, 0x41, 0x8e, 0x8f, 0x49, 0x98, 0xbe, 0x72, 0xa0, 0x47, 0x68, 0xfe, 0x7e, 0x70, 0xec, 0x2b, 0xcd, 0x1b, 0x8e, 0x2f, 0xad, 0x2b, 0x82, 0xbf, + 0x08, 0x8a, 0x85, 0x66, 0xb4, 0x73, 0xda, 0xcf, 0xd1, 0x0b, 0xce, 0x6b, 0x89, 0x5f, 0x59, 0x76, 0xbc, 0x3e, 0x43, 0x00, 0x9d, 0x9b, 0xe1, 0xc2, 0x53, 0x7e, 0x33, 0xac, 0xb5, 0x0e, 0xb3, 0x61, + 0x96, 0x94, 0xcd, 0x23, 0xbe, 0xf6, 0x5c, 0x96, 0xab, 0x37, 0xaa, 0x2f, 0xfd, 0x7a, 0x6d, 0xce, 0xa0, 0x09, 0x69, 0xad, 0xae, 0xfe, 0xc6, 0xbc, 0xbf, 0x69, 0xfc, 0x73, 0x23, 0xf9, 0x14, 0x5b, + 0x5e, 0x5c, 0x61, 0x9e, 0x16, 0xe1, 0xe9, 0xe4, 0xa7, 0x54, 0x75, 0x12, 0x41, 0xf5, 0x80, 0x0e, 0x6e, 0x73, 0xf0, 0x0e, 0xd5, 0x7c, 0x55, 0x7b, 0x60, 0xb1, 0x9b, 0x87, 0xfd, 0xf6, 0xb2, 0x3b, + 0xa6, 0x78, 0x45, 0xaf, 0x3a, 0xce, 0xd6, 0xb6, 0x2e, 0xa1, 0xaa, 0x6d, 0x0d, 0x57, 0x5b, 0x6d, 0xb7, 0x4c, 0xf9, 0x8b, 0x61, 0x9d, 0xcd, 0x24, 0xdd, 0xff, 0x8e, 0xbe, 0x19, 0x9a, 0xb4, 0xc0, + 0xf2, 0xd7, 0x42, 0xfa, 0xa5, 0x99, 0xf9, 0x8f, 0x24, 0xac, 0xe5, 0x73, 0xe0, 0x7d, 0x22, 0xfd, 0x02, 0xe1, 0xa7, 0x1b, 0xb3, 0xe5, 0x34, 0x1c, 0xd1, 0xa5, 0x88, 0x85, 0x23, 0xaa, 0x2d, 0x87, + 0x75, 0x09, 0xd9, 0x9d, 0xed, 0xb7, 0x52, 0x6f, 0x59, 0xbb, 0x0e, 0x53, 0x62, 0xc4, 0x17, 0x86, 0xa5, 0xb3, 0x73, 0x6a, 0x63, 0x51, 0xd2, 0xad, 0x7b, 0xb8, 0x04, 0xa5, 0xb3, 0x17, 0x81, 0x43, + 0x38, 0x67, 0x7a, 0xb4, 0x1e, 0x58, 0x90, 0x5f, 0x5b, 0x00, 0xbc, 0x5d, 0x0d, 0x99, 0xbb, 0xe2, 0xf6, 0xe1, 0xf6, 0x52, 0x92, 0xf4, 0x4a, 0xe6, 0x63, 0xbc, 0x7a, 0x5e, 0x24, 0x0e, 0xab, 0xd9, + 0xad, 0x3a, 0xe6, 0x5f, 0xb7, 0xc3, 0xca, 0x33, 0x21, 0x7c, 0xf8, 0xb4, 0x75, 0x9a, 0x87, 0x8e, 0x9b, 0xfd, 0xd4, 0x54, 0xf8, 0xe4, 0xac, 0xfe, 0x40, 0xf8, 0x3a, 0x2c, 0x3f, 0x2e, 0xa7, 0xe4, + 0x6c, 0xbb, 0x1e, 0xab, 0x97, 0x95, 0x2c, 0xb2, 0xeb, 0xd8, 0x9f, 0xd3, 0x3b, 0x89, 0x4f, 0x99, 0x05, 0x72, 0x06, 0xe7, 0x8d, 0x5b, 0x1e, 0xca, 0x62, 0x3c, 0xbb, 0x4e, 0xac, 0x04, 0x78, 0xbd, + 0xe5, 0x5b, 0xd3, 0xd5, 0x0a, 0xaf, 0x68, 0xba, 0x88, 0x75, 0xb3, 0x44, 0xce, 0xfb, 0x39, 0x2c, 0xcc, 0xa9, 0x53, 0x62, 0x28, 0xf5, 0xda, 0x05, 0xf6, 0x5b, 0xac, 0x5a, 0xea, 0xc1, 0x7a, 0x44, + 0x41, 0x5c, 0x4c, 0x48, 0xe6, 0xf8, 0x3b, 0x51, 0xdb, 0xd3, 0x6a, 0x2f, 0xbd, 0x15, 0xab, 0xb8, 0x87, 0x1d, 0xf2, 0x54, 0xea, 0xc9, 0x2b, 0xc5, 0x2b, 0x68, 0xcd, 0x6b, 0xbd, 0xa5, 0x09, 0xdb, + 0x84, 0x4a, 0xf5, 0xb8, 0x32, 0x2c, 0x4f, 0x87, 0x5a, 0x90, 0x8f, 0xf5, 0xee, 0x02, 0x70, 0x20, 0x32, 0xaf, 0x58, 0xba, 0xd4, 0x56, 0x07, 0xa6, 0xef, 0x68, 0xfb, 0xd2, 0xc8, 0x22, 0x6c, 0x2f, + 0x90, 0x83, 0x0b, 0x22, 0x73, 0xa2, 0x72, 0xcb, 0x48, 0xa2, 0x76, 0x63, 0x1d, 0x1d, 0x47, 0x74, 0x13, 0xef, 0xdd, 0x91, 0xa0, 0xe7, 0x41, 0xe2, 0x0e, 0xa4, 0x76, 0xa2, 0xb6, 0x87, 0xae, 0x33, + 0x94, 0x8e, 0x78, 0x94, 0xf5, 0x7e, 0xc2, 0x14, 0x7e, 0x4b, 0x26, 0x7e, 0x15, 0xa2, 0xef, 0x15, 0xcd, 0xb8, 0x5b, 0xa3, 0xe3, 0xbd, 0xf0, 0xc7, 0x5b, 0x95, 0x8e, 0xeb, 0x8d, 0x69, 0x79, 0x9b, + 0x9a, 0xcc, 0xca, 0xfb, 0x59, 0x51, 0x86, 0x69, 0x78, 0xad, 0xb4, 0xf1, 0x27, 0x67, 0xf3, 0x17, 0xda, 0xf3, 0xd9, 0xd7, 0x3b, 0x53, 0xe7, 0x74, 0x6d, 0x28, 0x73, 0x84, 0xbf, 0xb0, 0x88, 0x43, + 0x2e, 0xfd, 0x62, 0x0d, 0xb1, 0xf5, 0x10, 0xee, 0x95, 0x72, 0x4d, 0x81, 0x49, 0x9f, 0x6d, 0x63, 0x6e, 0xc3, 0x14, 0xf5, 0x1e, 0xbb, 0xa0, 0x6e, 0xe7, 0x18, 0x78, 0x05, 0xc1, 0x52, 0x29, 0xd0, + 0x1d, 0x6f, 0x05, 0xbb, 0xbd, 0x5c, 0xa7, 0xfb, 0xd8, 0x81, 0x24, 0x5a, 0x33, 0x21, 0xfe, 0x48, 0xe2, 0xe6, 0x06, 0x26, 0xa1, 0x31, 0x9e, 0xeb, 0xc5, 0x30, 0x51, 0xd3, 0xf7, 0xed, 0x3c, 0xf5, + 0xcf, 0xb7, 0xf3, 0x54, 0x60, 0x56, 0xaf, 0x45, 0x84, 0xdf, 0xce, 0xe3, 0xe0, 0xf7, 0x17, 0xbe, 0x17, 0xc1, 0xff, 0xf0, 0x42, 0x17, 0x84, 0x76, 0x30, 0xb3, 0xf2, 0xde, 0x75, 0x3e, 0x8d, 0xc5, + 0x5f, 0xff, 0x65, 0x95, 0xaf, 0x3f, 0x56, 0x8c, 0xb9, 0x2f, 0x8c, 0x80, 0x4f, 0xa4, 0xea, 0x7e, 0xa7, 0x7a, 0x9d, 0x0b, 0xaf, 0xed, 0xab, 0xb5, 0x73, 0x42, 0xaa, 0x6e, 0xb5, 0x17, 0xf8, 0x55, + 0x59, 0x55, 0x14, 0x87, 0x9f, 0x64, 0xf1, 0x78, 0xe1, 0x97, 0xeb, 0xb4, 0x8a, 0xce, 0x65, 0xd5, 0x2e, 0x48, 0x5c, 0x83, 0xe0, 0xfd, 0x82, 0x2c, 0xa9, 0x30, 0x34, 0x87, 0x16, 0xa1, 0x87, 0x61, + 0x8b, 0x18, 0xc9, 0xce, 0x47, 0x87, 0xa1, 0x6a, 0x1a, 0x59, 0x77, 0x8c, 0xea, 0x3c, 0x22, 0x27, 0xd6, 0x3e, 0xf9, 0xb0, 0xe7, 0xcc, 0xe7, 0x4a, 0xe4, 0x2c, 0x56, 0xcc, 0x19, 0xfa, 0x9a, 0x6a, + 0xe1, 0xd7, 0xe2, 0xcc, 0x7b, 0x90, 0xf8, 0xa3, 0x75, 0xf2, 0xfb, 0x9c, 0xeb, 0x46, 0xf2, 0x0a, 0xc9, 0x4b, 0x63, 0x6a, 0xd6, 0xb2, 0x22, 0x1a, 0x60, 0x4b, 0x0f, 0xe4, 0xaa, 0xf1, 0x3a, 0x35, + 0x61, 0x3b, 0xd1, 0x06, 0x12, 0xc4, 0xe6, 0x31, 0xa0, 0x6b, 0xf6, 0x09, 0x8b, 0x36, 0x23, 0xa8, 0x3b, 0xfb, 0xb5, 0x90, 0x48, 0xb4, 0x95, 0xa0, 0x51, 0x3e, 0xd7, 0x13, 0x31, 0x5c, 0xa4, 0x16, + 0x6e, 0xfa, 0x4a, 0x7c, 0x5e, 0xe1, 0xd4, 0x06, 0x3b, 0xe3, 0x7c, 0x33, 0xba, 0x83, 0xc8, 0x5f, 0x8e, 0x71, 0x45, 0x22, 0xc1, 0x58, 0xb3, 0xff, 0x1b, 0xac, 0xbf, 0x4d, 0x19, 0xce, 0xa2, 0x47, + 0x36, 0xf3, 0xc5, 0xdf, 0xcf, 0xe4, 0x41, 0xbc, 0x91, 0x7c, 0x41, 0xec, 0xda, 0xb8, 0x06, 0xb5, 0x4f, 0xe0, 0x23, 0x58, 0xc9, 0x2a, 0xc3, 0x80, 0x20, 0x12, 0x34, 0xd8, 0x04, 0x5e, 0x48, 0x10, + 0x4d, 0xa6, 0x87, 0xba, 0xd3, 0x20, 0x90, 0xd8, 0x60, 0xa7, 0x9d, 0xa7, 0x26, 0x2a, 0xa4, 0x3b, 0x39, 0xae, 0x26, 0x50, 0x18, 0x42, 0xb2, 0xcb, 0x84, 0xae, 0x1b, 0x80, 0x0c, 0xe3, 0x89, 0xee, + 0x01, 0xf6, 0x38, 0x8d, 0x45, 0x47, 0xb0, 0xc2, 0x5d, 0x9b, 0xad, 0x08, 0xaf, 0x5c, 0x35, 0x87, 0x7d, 0x9b, 0x39, 0xd4, 0x44, 0x3f, 0x8d, 0x0f, 0xd9, 0x5d, 0xde, 0xd2, 0x17, 0x4e, 0x80, 0xae, + 0x0e, 0x1f, 0xb9, 0x9e, 0x81, 0x7f, 0x43, 0xcf, 0x98, 0x74, 0x5f, 0x28, 0xbe, 0xe0, 0x56, 0x87, 0xc9, 0xec, 0x46, 0xe2, 0xd7, 0xb0, 0x59, 0xbd, 0x41, 0x5c, 0x6a, 0x39, 0xd9, 0x2a, 0xaa, 0x2c, + 0x0c, 0x84, 0x64, 0x12, 0x9a, 0x1f, 0x43, 0x50, 0x2c, 0x57, 0x49, 0xd1, 0x18, 0x9d, 0xd9, 0xaf, 0xfc, 0x45, 0xc5, 0xef, 0xe8, 0x08, 0xdd, 0x1c, 0x1a, 0x9b, 0x36, 0x2d, 0x78, 0xdf, 0x67, 0x4c, + 0x37, 0xf0, 0xa7, 0x55, 0xc1, 0x70, 0x35, 0x0b, 0x71, 0x51, 0x2e, 0x85, 0xaa, 0x84, 0xd2, 0xa1, 0xc2, 0x19, 0xba, 0x25, 0x97, 0x02, 0x20, 0x4f, 0x64, 0xbf, 0x1f, 0x15, 0x4f, 0x57, 0x5d, 0xf7, + 0x67, 0xb5, 0x54, 0x35, 0x33, 0x4b, 0xbf, 0x49, 0xdd, 0x8f, 0xac, 0xf7, 0xab, 0x6a, 0xca, 0x77, 0x33, 0xb7, 0x34, 0xeb, 0xbc, 0x9c, 0xbd, 0xf1, 0xf2, 0xf7, 0x57, 0xb1, 0x2f, 0xaf, 0xd6, 0x43, + 0xe1, 0x3a, 0x33, 0xb3, 0x2c, 0xcd, 0xe1, 0xaf, 0xbb, 0x76, 0xde, 0x2f, 0xb6, 0xfa, 0x7f, 0x96, 0x5f, 0x95, 0x73, 0x37, 0x4e, 0x7e, 0x8f, 0xce, 0x14, 0x99, 0xbf, 0x69, 0xc2, 0x47, 0xd6, 0x56, + 0xfc, 0x6f, 0xe4, 0x09, 0x75, 0xc4, 0x0b, 0xc1, 0x97, 0xe1, 0x6e, 0x42, 0x67, 0x76, 0xa5, 0xf0, 0xeb, 0xd1, 0x06, 0x78, 0xbd, 0x82, 0x25, 0x97, 0x53, 0x07, 0x60, 0xab, 0x6e, 0x84, 0x75, 0x4a, + 0xf4, 0x59, 0x86, 0x32, 0x2b, 0xba, 0x00, 0x13, 0x4c, 0xa2, 0x68, 0x2c, 0x4d, 0xf0, 0xf1, 0xa0, 0xa4, 0x7b, 0x80, 0x40, 0xa4, 0x25, 0xbf, 0x01, 0xf9, 0xdc, 0x5e, 0x97, 0x59, 0x17, 0x9f, 0x62, + 0xed, 0xbc, 0xe1, 0x43, 0x0d, 0x99, 0x7b, 0xc5, 0x0a, 0x35, 0x3d, 0x19, 0xa7, 0x03, 0x6b, 0xee, 0x8f, 0xd8, 0x11, 0x73, 0x3f, 0x2d, 0x92, 0x6f, 0x42, 0xcc, 0x6b, 0xb7, 0xff, 0x72, 0xc2, 0xaa, + 0x9e, 0xbf, 0x08, 0x31, 0xd7, 0x1b, 0xbf, 0x86, 0xeb, 0xd1, 0xb6, 0xf9, 0x88, 0x35, 0xff, 0x3e, 0x7e, 0x77, 0xbf, 0x30, 0x9f, 0xdd, 0xbf, 0x7f, 0x65, 0xdc, 0x13, 0x10, 0xb6, 0x3a, 0xc3, 0x69, + 0x41, 0x92, 0x3d, 0x14, 0x45, 0xb2, 0xd1, 0x61, 0xd6, 0x38, 0x6a, 0xe8, 0xa9, 0x1d, 0x1a, 0x1e, 0xcb, 0xa3, 0xa8, 0xc4, 0x92, 0x2e, 0xf6, 0xd1, 0x34, 0x01, 0xcb, 0x7c, 0x37, 0x10, 0xba, 0xdb, + 0xc8, 0x25, 0xb6, 0x97, 0x11, 0x0c, 0xbe, 0x24, 0xbc, 0x0a, 0xe1, 0x8a, 0xa4, 0x8f, 0xbe, 0xce, 0x12, 0x63, 0xb8, 0xb5, 0xdd, 0x52, 0xbd, 0x18, 0x42, 0xba, 0xce, 0x88, 0x33, 0x3f, 0x91, 0x0d, + 0x85, 0x6f, 0xa2, 0xca, 0x7d, 0x49, 0xe5, 0xe5, 0x71, 0x9e, 0x27, 0xae, 0x99, 0xcd, 0x6e, 0x9a, 0xc2, 0xf7, 0xe9, 0x0b, 0x7e, 0x79, 0xed, 0x76, 0xd4, 0xfa, 0xfc, 0xd6, 0xf7, 0xb5, 0xf7, 0x1e, + 0xb7, 0x7d, 0x7b, 0xbc, 0xfc, 0xfa, 0xf8, 0x2a, 0x14, 0xbd, 0x3f, 0xfe, 0xaf, 0x30, 0x8e, 0xde, 0x5b, 0xb0, 0xf7, 0xe7, 0x0f, 0xf4, 0x44, 0xda, 0xb8, 0x6f, 0xd4, 0xdf, 0xe7, 0xce, 0x87, 0x7b, + 0xd7, 0x34, 0x65, 0x13, 0x92, 0xc8, 0xb5, 0x51, 0x6f, 0x52, 0x8b, 0xcc, 0xa3, 0x2f, 0x1d, 0xbb, 0x03, 0xbb, 0x0a, 0xeb, 0x8c, 0xa2, 0xdf, 0x25, 0x8e, 0x0b, 0x69, 0xe5, 0x41, 0x5b, 0x36, 0x14, + 0x68, 0x44, 0x85, 0x57, 0x05, 0x7e, 0x6a, 0x16, 0x7b, 0x8e, 0xc6, 0xa2, 0xbd, 0x1a, 0x18, 0x3b, 0x60, 0x38, 0xe5, 0xfb, 0xd3, 0xc5, 0xdc, 0x50, 0xc3, 0x06, 0x74, 0x79, 0xca, 0xd6, 0x7b, 0x2b, + 0x4a, 0x57, 0x63, 0x7e, 0x14, 0xb1, 0x95, 0xb7, 0x9e, 0xc8, 0x87, 0xcd, 0xd6, 0x0c, 0x93, 0x6b, 0xd8, 0xcf, 0x87, 0x1f, 0x5e, 0xdd, 0x1f, 0xd8, 0x5f, 0x18, 0xc7, 0xef, 0xfa, 0xca, 0x7c, 0x22, + 0xe0, 0xe5, 0xe5, 0x9b, 0x81, 0xe3, 0x1f, 0xf8, 0x2b, 0xf5, 0x17, 0x61, 0xba, 0xce, 0x6f, 0x13, 0xab, 0x36, 0x7f, 0xcc, 0xad, 0xaf, 0x13, 0xf4, 0x1e, 0x0f, 0xfe, 0xdd, 0xba, 0xb5, 0xff, 0x65, + 0xae, 0x38, 0xef, 0x29, 0xfb, 0xff, 0x20, 0x2b, 0xbb, 0x92, 0x7c, 0x99, 0x7f, 0xd7, 0xc6, 0x14, 0x66, 0x05, 0xcd, 0x6a, 0x59, 0x22, 0xa2, 0x11, 0xa3, 0x2e, 0x91, 0xd6, 0xf3, 0xb1, 0xbe, 0x69, + 0x49, 0x50, 0xe2, 0x1b, 0x8e, 0xad, 0x8b, 0xfb, 0x39, 0xe0, 0x1f, 0xf7, 0xa8, 0xaf, 0x1f, 0x7b, 0x12, 0x2d, 0x9e, 0xea, 0xd0, 0x95, 0xe2, 0x7c, 0x76, 0xfb, 0x7b, 0x4d, 0xde, 0x35, 0x81, 0xf7, + 0x1e, 0x58, 0x5d, 0x81, 0x42, 0x52, 0xdb, 0x6b, 0x8a, 0x4f, 0x6a, 0x19, 0xa1, 0x1c, 0xa3, 0xb0, 0x01, 0x38, 0x35, 0x18, 0x14, 0x8d, 0xa9, 0x5a, 0xaf, 0xc0, 0x52, 0xbb, 0xd1, 0x53, 0xc2, 0x91, + 0x15, 0x96, 0x05, 0xe7, 0xab, 0xa8, 0x2e, 0x95, 0x6e, 0x43, 0xf6, 0x34, 0x0e, 0xcf, 0xd3, 0x95, 0x6a, 0xd5, 0x87, 0x6a, 0x1b, 0x6d, 0x76, 0xa6, 0x03, 0x76, 0xbb, 0x2a, 0x77, 0x16, 0x63, 0x79, + 0x22, 0xd7, 0xbf, 0x23, 0x34, 0x4f, 0x2b, 0xf2, 0x32, 0x98, 0x49, 0xf2, 0xb8, 0x16, 0xf2, 0xe2, 0xa9, 0x63, 0xc6, 0x2b, 0xcd, 0xf9, 0xec, 0xad, 0x75, 0xc5, 0x6c, 0xc2, 0x41, 0x03, 0xe9, 0x9c, + 0x6d, 0xe8, 0x18, 0xc3, 0x65, 0x29, 0x52, 0x20, 0xbe, 0xd0, 0x0e, 0x6b, 0x79, 0x79, 0x2a, 0x04, 0xf9, 0x48, 0x22, 0x5d, 0xa4, 0x91, 0xc9, 0x4e, 0xe5, 0x82, 0x26, 0x85, 0xe3, 0xa3, 0xdd, 0xce, + 0x17, 0x90, 0x9c, 0xc1, 0x6e, 0x2a, 0x81, 0xce, 0x60, 0x4b, 0xea, 0xa2, 0x31, 0xb4, 0x83, 0x1b, 0x75, 0x6c, 0xeb, 0xa3, 0xeb, 0xaa, 0xb5, 0x9c, 0xe4, 0x7c, 0x00, 0x36, 0xfa, 0xda, 0xae, 0xb1, + 0x1f, 0xb1, 0xc7, 0xff, 0xed, 0x15, 0x83, 0xfb, 0xdc, 0xe7, 0xaf, 0xff, 0xdb, 0x33, 0xab, 0x3a, 0xf4, 0x86, 0xb9, 0x19, 0xb5, 0x33, 0x3b, 0x4f, 0x8b, 0x30, 0x79, 0xa8, 0x75, 0x43, 0x9e, 0x2a, + 0x02, 0x78, 0xf7, 0x0b, 0xf3, 0xd9, 0xa7, 0xcb, 0x19, 0x32, 0xad, 0x12, 0xa0, 0x6b, 0x59, 0xeb, 0x3a, 0xd9, 0x61, 0x4e, 0xaf, 0x6d, 0x96, 0x63, 0xc8, 0x3b, 0x25, 0xb8, 0x4c, 0x05, 0x1d, 0xe7, + 0x33, 0x3a, 0x14, 0x29, 0x48, 0x6b, 0xc9, 0xe4, 0xc0, 0xd8, 0xf5, 0xb1, 0x9e, 0x1f, 0x6d, 0x60, 0x85, 0x1c, 0x56, 0xc2, 0x59, 0x5d, 0x86, 0xa9, 0x72, 0xd6, 0x80, 0x34, 0x68, 0x95, 0x20, 0xe3, + 0xc7, 0x54, 0xa4, 0x18, 0xb7, 0x53, 0x62, 0x61, 0xe3, 0x6f, 0x93, 0x55, 0xef, 0x3b, 0xe4, 0xa7, 0x43, 0xea, 0xab, 0x61, 0xe1, 0x2b, 0x7f, 0x8e, 0xae, 0x15, 0xeb, 0xfe, 0xc1, 0xbf, 0x39, 0x70, + 0xbc, 0xf4, 0xe2, 0x96, 0xea, 0xee, 0x4d, 0x88, 0xfe, 0xea, 0x6f, 0x62, 0x56, 0xf5, 0xac, 0x29, 0xc3, 0x77, 0x76, 0xfb, 0xe0, 0x64, 0xf2, 0x0e, 0x93, 0xe3, 0xba, 0x45, 0xea, 0x96, 0x0f, 0x95, + 0xd2, 0xcf, 0x79, 0xf2, 0x7e, 0x27, 0x7f, 0x2d, 0x99, 0xfa, 0xda, 0x9e, 0xea, 0xc8, 0xbb, 0xc7, 0x4f, 0x82, 0x4c, 0x5d, 0x10, 0x39, 0x37, 0x2c, 0x3a, 0xe0, 0x08, 0xe0, 0x38, 0x6f, 0x30, 0x2c, + 0x10, 0x09, 0xc4, 0x1f, 0xe7, 0xa5, 0x19, 0xc9, 0x24, 0xc0, 0xc2, 0xf1, 0x76, 0x08, 0x23, 0xb1, 0x10, 0x8e, 0xa2, 0xaa, 0x68, 0x8c, 0x52, 0x9c, 0xcc, 0xc4, 0xcd, 0x23, 0x80, 0x80, 0xc9, 0x0a, + 0x94, 0x89, 0x46, 0x3c, 0x8a, 0x98, 0x10, 0xe2, 0xbb, 0x0b, 0xe7, 0x81, 0x0d, 0x50, 0xe6, 0xe8, 0xb7, 0x38, 0xf9, 0xf7, 0xdf, 0x7a, 0xcd, 0x36, 0xf7, 0x70, 0x32, 0xfe, 0x47, 0x30, 0x5c, 0x49, + 0xcf, 0x67, 0xb7, 0xbf, 0x53, 0x23, 0x11, 0x9c, 0x08, 0x6b, 0xa3, 0x5d, 0x06, 0x91, 0x25, 0x5e, 0x9d, 0xb5, 0x08, 0x1e, 0x48, 0x2d, 0xe4, 0xf8, 0xd5, 0x9e, 0x4e, 0x65, 0x82, 0x93, 0x08, 0x8d, + 0x4b, 0x76, 0xae, 0xad, 0xc1, 0xce, 0x6e, 0x1c, 0x83, 0x48, 0x66, 0x56, 0x03, 0x9b, 0x2f, 0x68, 0x47, 0x8b, 0x34, 0xae, 0xc2, 0x3a, 0x56, 0x85, 0xe3, 0x08, 0x1d, 0xda, 0xf3, 0x51, 0x2e, 0x1a, + 0x29, 0x12, 0x0c, 0x44, 0x3f, 0x94, 0xc1, 0x12, 0xfd, 0x16, 0x26, 0xf5, 0xfe, 0x1b, 0xaf, 0x53, 0xe7, 0x1a, 0xa8, 0xf9, 0x23, 0x18, 0xf8, 0x17, 0x4b, 0x74, 0xf1, 0x9f, 0xa1, 0xf2, 0xb3, 0x2f, + 0xce, 0x67, 0x3f, 0x7d, 0x3c, 0x5b, 0x4c, 0xc3, 0xd0, 0x34, 0x48, 0x6d, 0xab, 0xe7, 0x68, 0x0a, 0xc3, 0x9b, 0x18, 0x1a, 0x8d, 0x71, 0xad, 0xb0, 0x54, 0xdb, 0xd4, 0xf3, 0xd5, 0x6e, 0x27, 0xb9, + 0x73, 0xca, 0x2c, 0xd6, 0xc2, 0x31, 0xeb, 0x43, 0x7a, 0x29, 0x95, 0x60, 0x2c, 0x32, 0x97, 0xcb, 0x0e, 0x25, 0xf8, 0x7a, 0xcd, 0xad, 0x52, 0x17, 0x5b, 0x04, 0x80, 0x59, 0x63, 0x70, 0x25, 0x06, + 0x56, 0x6c, 0x2d, 0x8c, 0xf2, 0xe0, 0x40, 0x2a, 0xc2, 0x1e, 0x0f, 0x13, 0x96, 0xf0, 0x9d, 0xdf, 0xfe, 0xd7, 0xed, 0x8c, 0x89, 0x3d, 0x5a, 0x92, 0xef, 0xa5, 0x2a, 0x1f, 0x49, 0xac, 0xbf, 0xaf, + 0x5a, 0xb9, 0x91, 0x7c, 0xe1, 0x7e, 0xd7, 0xc6, 0xd4, 0xea, 0x69, 0x59, 0xe6, 0x12, 0xf3, 0x5d, 0x28, 0xcd, 0x83, 0x71, 0x17, 0xe8, 0x68, 0xe1, 0xd0, 0x99, 0x45, 0xd5, 0x23, 0x46, 0x47, 0xe2, + 0x89, 0x2d, 0x75, 0x10, 0x14, 0xe7, 0x63, 0x2b, 0xca, 0xe9, 0xb2, 0x10, 0x36, 0x71, 0x82, 0xf6, 0xcd, 0xb6, 0xdc, 0x66, 0x5a, 0x36, 0x3f, 0xd7, 0x27, 0x9e, 0xf7, 0xf8, 0x9a, 0xf4, 0x0c, 0x62, + 0x0e, 0x1d, 0x6b, 0x37, 0x88, 0xab, 0x51, 0x21, 0x2e, 0xf6, 0x29, 0x0c, 0xc1, 0x29, 0xd5, 0xf2, 0xef, 0x24, 0x0b, 0xbc, 0xbf, 0x18, 0x9f, 0xd9, 0x32, 0xbf, 0x12, 0xbf, 0xc2, 0xf2, 0xf9, 0xd6, + 0xd4, 0xfa, 0x98, 0x01, 0x9e, 0x48, 0x78, 0x6d, 0xda, 0x86, 0x9e, 0x1d, 0x91, 0x96, 0x97, 0x4e, 0x7e, 0x68, 0x45, 0x40, 0x2d, 0xd0, 0xcc, 0x6e, 0x39, 0x07, 0x12, 0x10, 0x25, 0x1b, 0x58, 0xb4, + 0xcb, 0xb0, 0x9d, 0x6f, 0x53, 0xb7, 0x06, 0x5d, 0x33, 0x5a, 0x9c, 0x3a, 0x95, 0x59, 0x40, 0x95, 0x40, 0x74, 0x19, 0x43, 0x87, 0x52, 0xb5, 0x8e, 0x20, 0xe2, 0x02, 0x3a, 0xe5, 0xe8, 0xa8, 0x8e, + 0x4b, 0x32, 0x75, 0xf7, 0xf9, 0x58, 0x7d, 0x7f, 0x56, 0x5d, 0x53, 0x21, 0xce, 0x6a, 0xb3, 0xf4, 0xdd, 0x7a, 0x56, 0x05, 0x37, 0xe7, 0x97, 0x7f, 0x96, 0x8f, 0xd9, 0xfc, 0x7b, 0x19, 0x85, 0x24, + 0xf7, 0xfd, 0x9f, 0x27, 0xdd, 0x7a, 0x66, 0x76, 0x7d, 0x26, 0x7e, 0x05, 0xf4, 0xf3, 0xad, 0xa9, 0xc1, 0x2f, 0x30, 0x15, 0x1d, 0x4f, 0x46, 0x7f, 0x12, 0xdb, 0xc0, 0x15, 0xda, 0xad, 0x45, 0x55, + 0xc9, 0x46, 0xd6, 0x05, 0x25, 0x2e, 0x01, 0x39, 0x12, 0x6b, 0x21, 0x2b, 0x0f, 0x22, 0x82, 0x78, 0xc0, 0x79, 0xa7, 0x1e, 0x46, 0x77, 0x94, 0x0a, 0xc3, 0xbe, 0x9c, 0x7d, 0x2c, 0x32, 0x91, 0xc3, + 0xc2, 0xa1, 0xb4, 0x74, 0x1c, 0xfd, 0xee, 0x04, 0x98, 0x20, 0x4c, 0x44, 0xc7, 0x7e, 0x29, 0xae, 0x42, 0x64, 0xdf, 0x7c, 0x2f, 0x16, 0x70, 0xdb, 0x57, 0xef, 0x2b, 0x64, 0xa0, 0x67, 0xcc, 0x54, + 0x66, 0xd4, 0xbe, 0x8a, 0x16, 0x37, 0x02, 0xbf, 0xee, 0x68, 0xb7, 0xf5, 0x8b, 0xd2, 0x59, 0xb5, 0x9c, 0x99, 0xac, 0x40, 0x6a, 0xac, 0xb5, 0x36, 0xac, 0x69, 0x38, 0x58, 0x81, 0x0b, 0xdd, 0xf3, + 0xc8, 0xb6, 0xae, 0x94, 0x8c, 0x40, 0xf6, 0xd6, 0x56, 0xd3, 0x0f, 0x64, 0xbd, 0x52, 0x84, 0x45, 0xef, 0x40, 0x58, 0xba, 0x5a, 0x19, 0x52, 0xaf, 0x08, 0xbb, 0x3a, 0xa4, 0x3a, 0xa3, 0xdd, 0xcb, + 0xb6, 0x9a, 0xe3, 0xfc, 0xae, 0x95, 0x38, 0x09, 0x83, 0x4a, 0xa7, 0x98, 0x30, 0x73, 0xae, 0xfc, 0xe8, 0xb3, 0x23, 0xdb, 0xf7, 0xf2, 0x2c, 0x37, 0x7e, 0x65, 0x07, 0x6e, 0x6a, 0xce, 0xea, 0xd2, + 0x7c, 0xc1, 0xe7, 0x87, 0xe1, 0xe2, 0x8b, 0x9b, 0xd6, 0xbd, 0x7c, 0x6e, 0x37, 0x89, 0xe3, 0xd3, 0xf9, 0xf0, 0x5d, 0x5f, 0xfc, 0xd7, 0x3f, 0x8b, 0x6b, 0x5e, 0xa7, 0xfb, 0xd3, 0xf4, 0x93, 0x58, + 0x73, 0x7f, 0x86, 0x3e, 0xc5, 0xff, 0x7e, 0xd0, 0x7d, 0x1d, 0xa7, 0xd7, 0xab, 0xa9, 0x69, 0xb3, 0xd5, 0x1e, 0x64, 0xfb, 0x25, 0x1c, 0xf4, 0x6b, 0x6c, 0x05, 0xe1, 0x41, 0xcc, 0xad, 0x7d, 0x5f, + 0x4f, 0xd6, 0xa1, 0x77, 0x51, 0x8d, 0x5a, 0x37, 0x8f, 0x7e, 0xde, 0xec, 0xf3, 0x12, 0x50, 0x39, 0x47, 0xcc, 0xa4, 0x61, 0xcd, 0x42, 0x48, 0xeb, 0xaf, 0xd5, 0xe1, 0xcc, 0x37, 0x05, 0x26, 0xe7, + 0xae, 0x9b, 0x1f, 0xb8, 0xaa, 0x5c, 0xc4, 0xde, 0x32, 0x40, 0x1d, 0x41, 0x85, 0xa0, 0x1d, 0xb4, 0xe4, 0x94, 0x09, 0xdb, 0xc7, 0x0f, 0x09, 0xf0, 0xf1, 0xd2, 0xce, 0x86, 0x9f, 0xd5, 0x8c, 0x42, + 0x9e, 0xf2, 0x78, 0x7a, 0x23, 0xfa, 0x82, 0xd6, 0x6b, 0xf3, 0x6a, 0x7d, 0x9d, 0x70, 0x18, 0x13, 0x17, 0x88, 0x2b, 0x7a, 0x02, 0xb9, 0x6b, 0x8a, 0xd8, 0x6f, 0x18, 0x65, 0xb0, 0x4b, 0x7b, 0x71, + 0xd9, 0x13, 0xf1, 0x88, 0x1b, 0x61, 0x23, 0x28, 0x61, 0x64, 0xae, 0x4f, 0x9d, 0x86, 0x9d, 0x98, 0x1a, 0xd4, 0xe7, 0x5b, 0x9e, 0xc5, 0x5a, 0xd0, 0x34, 0xf1, 0x52, 0xc7, 0x21, 0xb4, 0x57, 0x23, + 0x03, 0x2b, 0xf7, 0x0e, 0xb9, 0xd4, 0x1c, 0xce, 0x2e, 0xce, 0x9b, 0x13, 0xcb, 0x5d, 0x80, 0x63, 0xab, 0xfa, 0xbf, 0xb0, 0xbe, 0xde, 0x47, 0xef, 0x5b, 0x81, 0xe5, 0x3b, 0x19, 0x67, 0xbf, 0x66, + 0x1c, 0x7d, 0x78, 0x94, 0x33, 0x4b, 0x3b, 0xf8, 0xd9, 0xe1, 0xfd, 0x09, 0xae, 0xf1, 0x42, 0xf1, 0x05, 0xe1, 0x97, 0xbf, 0x53, 0x0d, 0x44, 0x9a, 0x0f, 0x10, 0xc7, 0x6e, 0xe5, 0xcf, 0xc1, 0x02, + 0x81, 0x6b, 0x97, 0x75, 0xb6, 0x9c, 0x78, 0x12, 0xb3, 0xb3, 0xc6, 0xd2, 0x60, 0x87, 0xd0, 0x1e, 0x93, 0x6d, 0x4e, 0x5e, 0x68, 0xe7, 0x63, 0x45, 0xfa, 0x55, 0x7b, 0x81, 0x35, 0x37, 0x13, 0xf7, + 0x97, 0x39, 0xa7, 0x17, 0xe3, 0x28, 0xcd, 0x5b, 0x7c, 0x2c, 0x85, 0x61, 0x9f, 0xa1, 0x74, 0x85, 0x10, 0x67, 0x72, 0xb1, 0xdf, 0xd1, 0xdd, 0xc6, 0xbb, 0x7c, 0x13, 0x06, 0xcd, 0xd2, 0xff, 0x79, + 0x5e, 0x90, 0xa7, 0xf6, 0x89, 0x57, 0xa2, 0xd7, 0x2e, 0xfb, 0x6f, 0x59, 0x40, 0x26, 0xed, 0x0b, 0x38, 0x40, 0xa8, 0x17, 0xd7, 0xb2, 0x36, 0x63, 0xa1, 0x11, 0xc2, 0x11, 0x50, 0x4d, 0x54, 0x80, + 0x09, 0xb3, 0xda, 0xe5, 0xbe, 0x7b, 0xe4, 0x46, 0x7b, 0x5b, 0x93, 0x3b, 0xde, 0x29, 0x38, 0x86, 0x19, 0x48, 0x1f, 0x02, 0x3d, 0x70, 0x69, 0xca, 0x9b, 0x33, 0x65, 0xd9, 0xeb, 0xcb, 0xd6, 0x9b, + 0x8b, 0x5a, 0x07, 0xad, 0x23, 0xd2, 0x00, 0x2e, 0xf0, 0xdc, 0x5a, 0x53, 0x3e, 0x42, 0xb7, 0x4d, 0xc9, 0x22, 0xdf, 0xd2, 0x27, 0x98, 0x95, 0xf9, 0x28, 0x31, 0x2f, 0x7c, 0x4d, 0x18, 0xf8, 0xdb, + 0x3d, 0xae, 0xcc, 0xe2, 0xa5, 0xb7, 0x95, 0x59, 0x5c, 0x7b, 0x8a, 0xfe, 0xba, 0xa7, 0x94, 0xcc, 0xa8, 0x3e, 0x2d, 0x93, 0x21, 0x5b, 0x2d, 0xc1, 0x1c, 0x3e, 0xba, 0x78, 0x51, 0xb4, 0x05, 0x52, + 0xb9, 0x67, 0x46, 0x93, 0x8f, 0xdc, 0x62, 0x61, 0x3b, 0x72, 0x75, 0x22, 0x36, 0x1e, 0xbf, 0x56, 0x14, 0xe3, 0x20, 0x6c, 0xd5, 0xf3, 0xaa, 0x0a, 0x55, 0xf3, 0x28, 0xaa, 0x1c, 0x64, 0x64, 0x19, + 0x90, 0x5e, 0x0c, 0x48, 0xf0, 0xce, 0x06, 0x32, 0x22, 0xb4, 0xba, 0x1e, 0xe5, 0x02, 0x0b, 0x8e, 0x53, 0x0c, 0xa2, 0x66, 0x35, 0x64, 0x76, 0x1c, 0x3e, 0xf6, 0x9c, 0x7c, 0xa6, 0x52, 0xe6, 0x1b, + 0xd1, 0x2b, 0x08, 0xb7, 0xe6, 0x0c, 0xfc, 0x75, 0xc5, 0xcc, 0x17, 0x20, 0x04, 0x37, 0x24, 0x04, 0x66, 0x51, 0x1f, 0x03, 0x50, 0xbf, 0x28, 0xc8, 0xb6, 0x0f, 0x34, 0x8c, 0x70, 0xb8, 0x79, 0xda, + 0x9d, 0xfd, 0xd6, 0x32, 0xf6, 0xa6, 0xcc, 0x9b, 0xc7, 0x18, 0xb0, 0xaa, 0x20, 0x8e, 0x40, 0x79, 0x69, 0x7b, 0x8c, 0xed, 0xeb, 0x66, 0x5c, 0xba, 0x54, 0x54, 0x32, 0x9d, 0x59, 0x6b, 0xac, 0x35, + 0x02, 0xbb, 0x7c, 0xe7, 0xe8, 0x87, 0xbe, 0x64, 0xc3, 0x14, 0xe6, 0x22, 0x75, 0x9a, 0xf0, 0xf9, 0x39, 0xf8, 0xfa, 0x0f, 0xae, 0xf7, 0x0f, 0x84, 0x5f, 0x00, 0xf9, 0x70, 0x39, 0x75, 0xf5, 0xc7, + 0xbc, 0x10, 0xd1, 0x17, 0x32, 0xc0, 0x8a, 0x1e, 0xd4, 0x54, 0x7e, 0x07, 0x2c, 0x24, 0x6b, 0xcc, 0xc3, 0xe3, 0x3c, 0x3b, 0xc5, 0x0c, 0xa9, 0xf2, 0x8d, 0x03, 0x37, 0x6d, 0xb6, 0xbf, 0x34, 0x34, + 0x34, 0xef, 0x97, 0x26, 0xb6, 0x96, 0x0c, 0x6e, 0x7f, 0x02, 0x49, 0x7b, 0xbc, 0xb0, 0xa0, 0x94, 0xa1, 0x58, 0xae, 0xcf, 0x4f, 0x27, 0x09, 0x3a, 0x58, 0x0a, 0x6b, 0x46, 0x46, 0x51, 0x20, 0x3b, + 0xa2, 0xfe, 0xbe, 0x0e, 0x1e, 0xe9, 0x85, 0x1f, 0x61, 0xf1, 0xfb, 0x4e, 0x03, 0xf7, 0x3f, 0xf1, 0x82, 0xca, 0xdd, 0x07, 0x57, 0x7c, 0x26, 0xb8, 0x13, 0xd0, 0x1c, 0x0d, 0xb2, 0x21, 0xbf, 0x40, + 0xdd, 0xb0, 0x70, 0xc7, 0x50, 0x3e, 0x41, 0x07, 0x51, 0x9c, 0xcb, 0x27, 0x8f, 0x56, 0xc0, 0xaa, 0xf1, 0x76, 0xb2, 0x96, 0x46, 0xb2, 0xdf, 0x9e, 0xab, 0x5c, 0x81, 0xeb, 0x4b, 0x6f, 0xd7, 0x92, + 0x4b, 0xca, 0x6e, 0xa4, 0xda, 0x1e, 0x5f, 0xf7, 0x3a, 0x7b, 0x59, 0x9f, 0x38, 0x48, 0xe9, 0x25, 0xbc, 0x2a, 0x60, 0xa1, 0x94, 0x29, 0xb5, 0x60, 0x74, 0xb4, 0xfa, 0xce, 0x1d, 0xdb, 0x36, 0x7c, + 0x5c, 0x04, 0xf0, 0x99, 0xf4, 0x79, 0x57, 0x8a, 0xd7, 0xde, 0xb7, 0x61, 0x3e, 0xc3, 0xa7, 0xa5, 0xcc, 0x3b, 0x91, 0x09, 0xa7, 0xb7, 0x42, 0xd3, 0x6d, 0x87, 0x03, 0x8b, 0x88, 0x1e, 0x65, 0x2d, + 0x55, 0x96, 0xd2, 0x8c, 0x54, 0x1b, 0x61, 0xef, 0xbc, 0xf2, 0x5b, 0x18, 0x71, 0xd0, 0xd1, 0xd8, 0x38, 0x89, 0x3b, 0xbf, 0x20, 0xbe, 0x18, 0xa5, 0x3d, 0x65, 0xba, 0xcd, 0x0a, 0x2c, 0x74, 0x90, + 0x1e, 0xab, 0xa5, 0xa8, 0x72, 0xb2, 0xef, 0x5d, 0x2e, 0x6b, 0x23, 0x2e, 0x07, 0x17, 0x22, 0xb6, 0x09, 0x7d, 0xf2, 0xbb, 0x09, 0x42, 0xc9, 0xeb, 0x4e, 0x78, 0x47, 0x1e, 0xfc, 0x18, 0x2a, 0xf5, + 0x35, 0xc4, 0xc9, 0xac, 0xea, 0xcb, 0xeb, 0x7f, 0xa1, 0x7f, 0x3f, 0x28, 0x5a, 0x6b, 0x99, 0x89, 0x99, 0xd9, 0xae, 0x33, 0xfb, 0x99, 0x48, 0xf3, 0x9c, 0xaa, 0xfc, 0x33, 0xe9, 0xf9, 0xec, 0xcb, + 0x8d, 0x29, 0xaa, 0xf3, 0xab, 0xde, 0x34, 0x97, 0x5d, 0x45, 0x00, 0x4f, 0xdc, 0x19, 0xc5, 0x02, 0x1e, 0x22, 0x53, 0x4b, 0xab, 0xd8, 0xc5, 0x60, 0x5e, 0x14, 0xac, 0x8e, 0x42, 0x26, 0xb1, 0xfa, + 0x23, 0x6d, 0x08, 0x05, 0x03, 0xb2, 0x2a, 0x01, 0xac, 0x5c, 0x6d, 0x61, 0x1d, 0x49, 0x53, 0x03, 0xc9, 0xac, 0xaf, 0xc1, 0xba, 0x87, 0xb9, 0xb2, 0x38, 0x16, 0x6a, 0x27, 0x99, 0x62, 0xb7, 0x4b, + 0x76, 0xf2, 0x7a, 0x1f, 0xe8, 0xca, 0x52, 0x9c, 0x52, 0x56, 0xc6, 0x32, 0x2b, 0x17, 0x5d, 0x3c, 0x76, 0xba, 0x80, 0xfe, 0x5e, 0x3e, 0x31, 0xf1, 0xde, 0xa9, 0x5e, 0x01, 0x79, 0x6d, 0xcf, 0xae, + 0xb4, 0x7e, 0x8d, 0x05, 0xc9, 0x16, 0xa6, 0x9e, 0x30, 0x19, 0x5e, 0x2f, 0xe4, 0xb3, 0x25, 0x30, 0xab, 0x01, 0xb0, 0x96, 0x00, 0xcb, 0xfa, 0xed, 0x71, 0xd1, 0x96, 0x15, 0x8d, 0xb7, 0x56, 0x5b, + 0x5a, 0xa1, 0xb4, 0x2f, 0x2a, 0xcc, 0x63, 0xe9, 0x53, 0x1c, 0xc5, 0x74, 0x39, 0xa0, 0x51, 0x08, 0x96, 0xca, 0x3e, 0x5a, 0x81, 0xf1, 0x68, 0xf1, 0xae, 0x78, 0xe8, 0xc6, 0xfe, 0x82, 0x87, 0x43, + 0x91, 0x2f, 0xa0, 0x8b, 0xab, 0x7e, 0x3b, 0xad, 0x59, 0xa1, 0x7f, 0xb3, 0x4b, 0xfe, 0xfd, 0xb0, 0xef, 0xc4, 0x53, 0xa7, 0x82, 0x8f, 0x84, 0x5f, 0xba, 0xff, 0xe1, 0x72, 0x46, 0x4c, 0x3b, 0x17, + 0x14, 0x4c, 0xba, 0x38, 0x54, 0xdc, 0x1e, 0x4d, 0x46, 0x9f, 0xdf, 0x9e, 0x3d, 0x83, 0x89, 0xb8, 0x5c, 0xc0, 0x2b, 0x27, 0x3f, 0x06, 0xc2, 0x28, 0x30, 0x0b, 0xee, 0x90, 0xea, 0xe8, 0x72, 0xef, + 0x63, 0xa0, 0x55, 0xf4, 0x2b, 0xb6, 0x59, 0x86, 0x02, 0xc3, 0xef, 0x07, 0x6f, 0x83, 0x0a, 0x43, 0xab, 0x77, 0x58, 0x8d, 0x6f, 0x0a, 0x0f, 0x59, 0x1e, 0x9b, 0x51, 0x19, 0x2e, 0x99, 0x54, 0x45, + 0xf8, 0x39, 0xfc, 0x96, 0xbb, 0xcd, 0x0a, 0x33, 0xb3, 0x1c, 0x66, 0x6e, 0x5f, 0xbb, 0xd9, 0x4b, 0x97, 0x1f, 0x1f, 0x8e, 0x9e, 0x49, 0xf0, 0xf1, 0x8d, 0xfa, 0x15, 0x8b, 0x2f, 0xf7, 0xa6, 0x96, + 0x66, 0x8b, 0x68, 0xbb, 0xde, 0xcf, 0x77, 0x67, 0xc9, 0x32, 0xf2, 0xfd, 0x10, 0xe7, 0x2e, 0x63, 0x05, 0x5a, 0x21, 0x24, 0x3c, 0x75, 0xd9, 0xf2, 0x76, 0xa7, 0xed, 0xd9, 0x7d, 0xee, 0x2f, 0xe0, + 0xf5, 0x92, 0xa1, 0x45, 0xa5, 0x93, 0x4e, 0xb2, 0x13, 0xad, 0x18, 0x27, 0x0c, 0xa2, 0x08, 0xa4, 0x93, 0x2c, 0x70, 0x25, 0xcc, 0x4a, 0xac, 0x13, 0xea, 0x30, 0x82, 0xe9, 0xf1, 0x64, 0x28, 0xe3, + 0x79, 0x2e, 0x7d, 0x75, 0xd1, 0xbf, 0xbf, 0x3c, 0x7e, 0x84, 0x3b, 0xfc, 0x41, 0x9e, 0xf1, 0x4a, 0xf4, 0x86, 0xc8, 0xb5, 0x39, 0x95, 0x4f, 0x9c, 0x05, 0xce, 0x3f, 0x71, 0x5d, 0x44, 0x9a, 0xca, + 0x76, 0x89, 0x83, 0xb2, 0x96, 0x21, 0x07, 0xd3, 0x3e, 0xfb, 0x51, 0x53, 0x96, 0x16, 0x97, 0xba, 0x98, 0x61, 0xf0, 0xfa, 0x56, 0x96, 0xcf, 0x58, 0x9a, 0xd6, 0x3a, 0x2a, 0x49, 0xc7, 0x00, 0x5c, + 0xfb, 0x48, 0xd1, 0xed, 0xec, 0xac, 0x96, 0x30, 0x8c, 0x5e, 0x97, 0x2c, 0x74, 0x00, 0xf9, 0x3e, 0xb6, 0xdc, 0x3a, 0xb2, 0x73, 0x6d, 0x3c, 0x77, 0xec, 0xb7, 0x9d, 0xc8, 0x2a, 0x4d, 0xdb, 0x9d, + 0xb9, 0x7d, 0x61, 0x66, 0xaf, 0x3d, 0x7d, 0xa8, 0x34, 0x7c, 0x62, 0x7d, 0x7c, 0x26, 0xfe, 0x02, 0xc2, 0xe7, 0x3b, 0x37, 0x3d, 0xe2, 0x84, 0x65, 0x12, 0xae, 0x1a, 0x91, 0xa1, 0x37, 0x7e, 0xc9, + 0x68, 0x18, 0x03, 0xb7, 0xeb, 0xdd, 0x7c, 0xd9, 0x17, 0x23, 0x88, 0x8d, 0x32, 0x43, 0x81, 0xe0, 0xa9, 0x68, 0xfc, 0x4b, 0x90, 0xea, 0xf5, 0x39, 0xe5, 0x04, 0x74, 0x09, 0xe1, 0xe9, 0xaa, 0x39, + 0x72, 0xb9, 0xa0, 0x6f, 0x12, 0x67, 0x4d, 0x25, 0xa0, 0x0f, 0xe1, 0x58, 0xe3, 0xe5, 0xa3, 0x63, 0x32, 0xbe, 0xca, 0xda, 0xfa, 0xc6, 0x42, 0xa1, 0xcb, 0xf6, 0x91, 0x97, 0xdf, 0x2f, 0x36, 0xaf, + 0x6f, 0x3b, 0xcc, 0x9d, 0x5d, 0xcc, 0xce, 0x33, 0xdb, 0xac, 0x67, 0xe9, 0xf5, 0x34, 0x70, 0xcd, 0xca, 0xfd, 0x68, 0xbb, 0x7a, 0xc1, 0xe3, 0xd1, 0x94, 0x43, 0x9e, 0x9b, 0x72, 0x57, 0x92, 0x6f, + 0x58, 0x57, 0x57, 0x4d, 0xe4, 0x84, 0xe9, 0x66, 0xe1, 0x4d, 0x0a, 0x1c, 0xa0, 0xe3, 0xc8, 0x21, 0x2a, 0x2d, 0x8f, 0x6d, 0x90, 0xa2, 0xfe, 0x6e, 0x84, 0x06, 0xef, 0x64, 0x51, 0x35, 0xaa, 0x9f, + 0x12, 0x7b, 0xcd, 0x92, 0x6d, 0x95, 0x5e, 0x56, 0x86, 0xb1, 0xe9, 0x16, 0xe8, 0x88, 0xc2, 0x68, 0x72, 0x8e, 0x88, 0x08, 0x1a, 0xd6, 0xa2, 0x8a, 0x20, 0xcc, 0x92, 0x01, 0x12, 0x4a, 0x2a, 0x0c, + 0x4e, 0x84, 0x62, 0x3c, 0x01, 0x30, 0x9c, 0x31, 0xc1, 0xe7, 0x10, 0xf6, 0xc2, 0x24, 0x79, 0x8f, 0x6f, 0xb8, 0xf9, 0xec, 0x3f, 0x82, 0xef, 0x67, 0xf9, 0x38, 0xd1, 0xa7, 0xe2, 0xd7, 0xdf, 0x33, + 0x71, 0xbe, 0xe6, 0xe0, 0x44, 0xa7, 0xc5, 0xad, 0x6f, 0x4e, 0xe1, 0xaa, 0xe0, 0xfb, 0xba, 0x0b, 0x0d, 0x83, 0x59, 0x1b, 0x96, 0x6d, 0x9d, 0x76, 0xb6, 0x11, 0xad, 0x8f, 0xe7, 0xdd, 0x2a, 0x23, + 0x86, 0xcb, 0xbc, 0xa0, 0x37, 0xf1, 0x29, 0x21, 0x96, 0x73, 0xb2, 0x1f, 0x69, 0x28, 0x33, 0x29, 0xbb, 0xe6, 0x31, 0x5d, 0x40, 0xf1, 0x32, 0xe4, 0xe6, 0xfe, 0x41, 0xa6, 0x75, 0xac, 0x72, 0x4a, + 0xce, 0x1a, 0xf0, 0x20, 0xf7, 0x48, 0x5a, 0x6f, 0x9a, 0x8b, 0x30, 0x41, 0xbf, 0xf3, 0x71, 0x53, 0xbf, 0x05, 0xa6, 0x7f, 0xf6, 0xdc, 0x71, 0x5d, 0x17, 0x5b, 0x2e, 0x5e, 0x1f, 0xc2, 0x0f, 0x71, + 0x7c, 0xad, 0x9e, 0xf4, 0xe7, 0xf4, 0x3f, 0x57, 0x8a, 0x2f, 0x28, 0xbe, 0xfc, 0x9d, 0xaa, 0xf9, 0x99, 0xf3, 0x1e, 0x76, 0x1a, 0xc6, 0x53, 0x8f, 0xca, 0xc8, 0x70, 0xdc, 0x0b, 0x96, 0x40, 0x9e, + 0x31, 0x62, 0x89, 0x96, 0xb8, 0x5d, 0xc2, 0x80, 0x10, 0xe1, 0xe4, 0x6a, 0xe9, 0xd4, 0x78, 0x27, 0x8b, 0x08, 0x25, 0x91, 0xb9, 0xab, 0x2d, 0x71, 0x3e, 0x67, 0x86, 0x95, 0x82, 0x8b, 0xf8, 0xb8, + 0x8d, 0x79, 0x4d, 0xae, 0xa3, 0x93, 0x1c, 0xa2, 0xde, 0x28, 0xa0, 0x1b, 0xb0, 0xa0, 0x1c, 0x5b, 0xb7, 0xd6, 0xdf, 0x36, 0xc3, 0x8f, 0x8e, 0x28, 0x7f, 0x8e, 0xd3, 0xbf, 0x53, 0x9d, 0xcf, 0x7e, + 0xb4, 0xa7, 0xf2, 0x7a, 0x4c, 0x00, 0x36, 0xd6, 0x2a, 0x0c, 0x4a, 0x6a, 0xa9, 0x6e, 0xad, 0x8d, 0xee, 0x56, 0x76, 0xdd, 0xa5, 0x27, 0xd6, 0x74, 0xd1, 0x52, 0x08, 0x77, 0x63, 0x3a, 0x42, 0xa1, + 0x5d, 0xba, 0xea, 0x1e, 0x00, 0x4d, 0x12, 0x3b, 0xec, 0xbd, 0xe6, 0x12, 0xac, 0xab, 0x1c, 0x3e, 0x11, 0x99, 0x5d, 0xd8, 0x9b, 0x7a, 0xe4, 0xa4, 0x7a, 0xd4, 0x3c, 0x58, 0xda, 0x6e, 0x1b, 0x57, + 0xdd, 0x6f, 0x4f, 0x7a, 0x75, 0x29, 0x27, 0xcc, 0x9e, 0x09, 0x6e, 0xec, 0x8f, 0x12, 0xf7, 0xdd, 0x9d, 0x47, 0x76, 0x90, 0xc7, 0xa1, 0x63, 0xfe, 0xcc, 0x10, 0xff, 0xfb, 0x2b, 0xf2, 0x8d, 0xe8, + 0x0b, 0xb0, 0xaf, 0xcd, 0xab, 0xdd, 0x7d, 0xc2, 0xaa, 0xa4, 0x4b, 0xa4, 0xf2, 0xd8, 0xa3, 0x88, 0xe6, 0x27, 0x3b, 0xf2, 0xe0, 0x7d, 0xaa, 0xa4, 0x9b, 0xbd, 0xe7, 0x9e, 0xb9, 0x56, 0xa3, 0x1c, + 0xd7, 0xef, 0x29, 0x30, 0x3c, 0x4b, 0x4b, 0xd7, 0x82, 0xcf, 0x10, 0xd8, 0x6c, 0xf6, 0xca, 0x8a, 0x94, 0x71, 0x81, 0x1a, 0x0c, 0xe7, 0x4c, 0x0e, 0x67, 0x0b, 0xef, 0x35, 0x7e, 0x44, 0xb6, 0x51, + 0x74, 0xf2, 0x23, 0x22, 0x3e, 0xa8, 0x95, 0x71, 0xba, 0xac, 0xd1, 0xf8, 0x57, 0x11, 0xaa, 0x0f, 0xce, 0x3c, 0x3f, 0xb4, 0xac, 0x7f, 0xfd, 0xfb, 0x5b, 0x91, 0xb2, 0xf7, 0x7d, 0xe0, 0xe5, 0xd9, + 0x17, 0xcd, 0xb7, 0x57, 0xfd, 0x28, 0x5c, 0x75, 0x0d, 0x41, 0xfe, 0xf4, 0xd4, 0x4f, 0x72, 0x6b, 0x56, 0x98, 0xe5, 0x6b, 0x58, 0xff, 0xbf, 0xbf, 0xf9, 0x9e, 0x5e, 0x7d, 0xfb, 0xae, 0xc2, 0xd8, + 0x9b, 0x0e, 0xf3, 0xdf, 0xdf, 0xea, 0xa4, 0x87, 0xd5, 0xec, 0x3d, 0xfc, 0x7b, 0xf1, 0xd5, 0xfb, 0xef, 0xbb, 0x12, 0xf4, 0xdf, 0xdf, 0x94, 0xa0, 0x1f, 0xaa, 0x52, 0xbd, 0x3c, 0x7d, 0x58, 0x2a, + 0xd8, 0x4e, 0xf2, 0xc6, 0x79, 0xef, 0xce, 0xbd, 0x39, 0x82, 0x3d, 0xb7, 0xfa, 0x7e, 0xd0, 0x7d, 0x99, 0x26, 0x3f, 0xae, 0x66, 0xd8, 0xb4, 0x15, 0xa8, 0x86, 0xc2, 0x45, 0xad, 0xf8, 0x98, 0x33, + 0x52, 0x8e, 0x33, 0xd0, 0xde, 0x44, 0xe2, 0xb1, 0x9f, 0x73, 0x24, 0x80, 0x03, 0x67, 0xc0, 0x5e, 0xba, 0xdb, 0x58, 0xae, 0x8d, 0x9d, 0x1d, 0xc6, 0x80, 0xd8, 0xc3, 0xfd, 0x2a, 0xb7, 0xd2, 0xd1, + 0x36, 0xed, 0x0e, 0x5a, 0x0b, 0xdb, 0xc1, 0x0b, 0x04, 0xda, 0x94, 0xd8, 0x78, 0xd7, 0xe2, 0xa7, 0x5e, 0x13, 0x84, 0xc3, 0x78, 0x46, 0x89, 0x5c, 0xdb, 0x5c, 0x26, 0xac, 0xc0, 0xff, 0xc0, 0x43, + 0xe3, 0x6a, 0x64, 0xf9, 0xe2, 0xb6, 0xf9, 0x59, 0x33, 0xfd, 0xf3, 0x9a, 0x66, 0xaf, 0x6e, 0xe4, 0xd7, 0x67, 0xf0, 0x67, 0x1f, 0xcd, 0x37, 0xd7, 0xdb, 0x7f, 0x6e, 0xfe, 0xc5, 0xf7, 0x87, 0x32, + 0x4f, 0xad, 0x30, 0x73, 0x7f, 0x11, 0xec, 0xfb, 0xf2, 0xa3, 0x7e, 0x3f, 0x3c, 0xf5, 0x0b, 0xed, 0x97, 0x21, 0xfd, 0x7c, 0xe7, 0xca, 0x58, 0x27, 0xd4, 0x70, 0xdd, 0x48, 0xfc, 0x82, 0x3b, 0x7a, + 0xcd, 0xde, 0x65, 0x3c, 0xcc, 0xa6, 0x2c, 0x8a, 0xdb, 0x6f, 0xb4, 0x80, 0x95, 0xe9, 0x0b, 0x00, 0xc7, 0x24, 0x59, 0x52, 0x49, 0x7a, 0xa4, 0x5a, 0xbb, 0xdd, 0xac, 0x97, 0x14, 0x05, 0x31, 0x06, + 0xab, 0xd5, 0xf2, 0x86, 0x94, 0xe9, 0xc0, 0x49, 0x46, 0x62, 0x14, 0xf4, 0xae, 0x0f, 0xf0, 0x84, 0x76, 0xb2, 0x36, 0xe5, 0x04, 0x77, 0x0e, 0x2c, 0x6d, 0x27, 0x5f, 0x3b, 0xcf, 0xd9, 0x12, 0x1c, + 0x37, 0x31, 0x87, 0x8f, 0x70, 0xbd, 0xe5, 0x78, 0x78, 0x84, 0x6e, 0x6a, 0x66, 0x3f, 0xc9, 0x8b, 0xf7, 0x9c, 0x06, 0xf1, 0x9d, 0xec, 0x0d, 0xd2, 0x5b, 0xfb, 0x16, 0x22, 0x3b, 0xe1, 0x6c, 0x46, + 0x30, 0x5c, 0xa2, 0xd5, 0xf5, 0x9c, 0xe2, 0x73, 0xbd, 0xc4, 0xf3, 0x7c, 0x88, 0x22, 0xfe, 0xe8, 0xec, 0xc2, 0x44, 0x38, 0xc5, 0xe7, 0xbd, 0x46, 0x01, 0xdb, 0xa0, 0xe7, 0x4e, 0xb5, 0xc0, 0x76, + 0x31, 0x78, 0x5c, 0x44, 0x8b, 0x44, 0x5e, 0xf0, 0x45, 0xd4, 0x5c, 0xd2, 0x63, 0x5f, 0xe6, 0x94, 0x97, 0x79, 0x27, 0x99, 0x91, 0x76, 0x8c, 0x44, 0x61, 0x5d, 0x39, 0x30, 0x81, 0x66, 0x96, 0x7c, + 0x94, 0x7e, 0x53, 0x1e, 0xde, 0xcb, 0xb9, 0x73, 0x7f, 0x6a, 0x3d, 0xe3, 0x33, 0xf2, 0x8d, 0xfa, 0x0d, 0x89, 0xcf, 0xf7, 0xa6, 0xfa, 0x15, 0x1d, 0x1d, 0xa4, 0x72, 0x51, 0x89, 0x02, 0x2a, 0x01, + 0x3a, 0x75, 0x17, 0x23, 0xaa, 0x6c, 0xa9, 0x6c, 0xca, 0x62, 0x2d, 0xee, 0x3c, 0x01, 0x9c, 0x0f, 0x7a, 0x26, 0x87, 0x19, 0x2a, 0xcd, 0x4b, 0x1a, 0x49, 0x85, 0xa6, 0x66, 0x5a, 0xa5, 0x5c, 0x91, + 0xc1, 0xbe, 0xb1, 0x90, 0x92, 0x00, 0x1b, 0xde, 0x02, 0xe4, 0xb5, 0x4c, 0x35, 0x6b, 0x50, 0xd2, 0x73, 0x8a, 0x00, 0x75, 0xc7, 0x33, 0xeb, 0xea, 0xf8, 0x60, 0x7a, 0x7d, 0xc1, 0xe8, 0xc3, 0x01, + 0xe3, 0xbe, 0xb6, 0xfd, 0x19, 0x03, 0xcb, 0x0f, 0xb2, 0x57, 0x54, 0xde, 0x2e, 0xae, 0xf5, 0x80, 0x26, 0x9c, 0xd2, 0xe6, 0x72, 0xd9, 0x2e, 0x9c, 0xaa, 0x1b, 0x24, 0x9e, 0xf2, 0xf2, 0x60, 0x5b, + 0x8c, 0x44, 0x8e, 0xea, 0x16, 0xb2, 0x1d, 0x11, 0xb9, 0x54, 0xe8, 0x0b, 0xc5, 0x2c, 0xcb, 0x53, 0x13, 0x6c, 0x8f, 0x98, 0x19, 0xd4, 0x89, 0xa5, 0xb3, 0xd9, 0xb9, 0xef, 0x60, 0x6b, 0xb5, 0xe1, + 0x8e, 0x49, 0x64, 0x92, 0xd8, 0x5a, 0x63, 0x4c, 0xcd, 0xc0, 0xbb, 0x8a, 0x71, 0x72, 0x67, 0xd3, 0x5a, 0x71, 0xc0, 0xa6, 0x97, 0x69, 0x70, 0xe4, 0x71, 0xf8, 0xc8, 0xd6, 0x04, 0x3e, 0xe5, 0xfe, + 0x77, 0x23, 0x79, 0x85, 0xe1, 0x9a, 0xad, 0x1b, 0x9c, 0xe6, 0xe9, 0xa7, 0x1b, 0xc8, 0x56, 0x19, 0xb2, 0x79, 0x8e, 0xfb, 0x1e, 0xbb, 0x4f, 0xb2, 0x44, 0xc3, 0x7c, 0xac, 0xbf, 0x2c, 0xfc, 0x41, + 0x40, 0x05, 0xb9, 0x09, 0xb6, 0x22, 0x6b, 0x9a, 0xdb, 0xaa, 0xda, 0x52, 0xf0, 0xc5, 0xa7, 0x15, 0x19, 0xf4, 0x45, 0xbf, 0x3e, 0xb5, 0xf9, 0x60, 0x1c, 0x4e, 0x35, 0x41, 0x5a, 0xa8, 0xb3, 0x5a, + 0x04, 0x9e, 0x4d, 0x38, 0xe7, 0xa5, 0x59, 0xc6, 0xad, 0x3d, 0x17, 0x56, 0x69, 0xf9, 0xed, 0xd4, 0x6e, 0x7f, 0xc8, 0x37, 0x75, 0x5f, 0x8f, 0x03, 0x3d, 0x11, 0x05, 0xf4, 0x4e, 0xf5, 0xbd, 0xd7, + 0x91, 0x79, 0x2b, 0x42, 0x30, 0x21, 0x1c, 0xe8, 0x40, 0xf7, 0x68, 0xce, 0x94, 0x2c, 0x20, 0x06, 0xe3, 0x81, 0xdd, 0x2b, 0x44, 0xb4, 0x94, 0xb1, 0xb9, 0x8e, 0x44, 0xdc, 0x3c, 0x55, 0x98, 0x96, + 0x9e, 0xd3, 0xee, 0x0e, 0x52, 0xa5, 0x74, 0x9f, 0xa1, 0x4b, 0x38, 0x14, 0x57, 0x4b, 0x7d, 0x71, 0xa2, 0xc6, 0x15, 0x91, 0x00, 0x4b, 0x81, 0x13, 0xb4, 0x64, 0x38, 0x9d, 0x48, 0x40, 0x4e, 0xcf, + 0x8a, 0x98, 0x82, 0x8c, 0xa4, 0x74, 0x05, 0xbd, 0xdc, 0x5f, 0xa6, 0xa8, 0x35, 0x1d, 0xf7, 0x26, 0x95, 0x3c, 0xd2, 0x5b, 0xfc, 0xfe, 0xd0, 0x5f, 0x29, 0x5e, 0xdd, 0x0c, 0xcd, 0x3a, 0xb8, 0xaa, + 0x28, 0x7e, 0x59, 0x0b, 0x8b, 0x34, 0x2f, 0xb6, 0x44, 0x61, 0x4e, 0x9c, 0x29, 0x9b, 0xcd, 0xda, 0x3e, 0xf8, 0xa9, 0xbe, 0xa4, 0xb7, 0xd6, 0xd6, 0xee, 0xfd, 0x2f, 0x43, 0xf7, 0xa6, 0xe0, 0xbe, + 0xf7, 0x73, 0x3f, 0x67, 0x07, 0x9b, 0xfe, 0x73, 0xad, 0xc6, 0xbf, 0xfe, 0x5c, 0xab, 0xf1, 0xaf, 0xee, 0x6c, 0x13, 0x86, 0x4b, 0x3c, 0xaa, 0x1b, 0xa6, 0x91, 0x15, 0xc4, 0xa5, 0x6b, 0x69, 0x2f, + 0xb6, 0x19, 0xaf, 0x63, 0x7b, 0x3b, 0x76, 0x6b, 0x28, 0x02, 0xeb, 0xa5, 0xd0, 0x08, 0xd5, 0x66, 0x14, 0xc5, 0xb1, 0x72, 0x63, 0x7a, 0x09, 0x1b, 0x09, 0x7e, 0x51, 0xbc, 0xcd, 0x4e, 0x5c, 0x87, + 0x55, 0xa7, 0x5d, 0x76, 0x2d, 0xa3, 0x6e, 0xcf, 0x8c, 0xe0, 0x6b, 0x00, 0xb6, 0x9d, 0xb7, 0x2b, 0x9e, 0x0f, 0xdc, 0xa0, 0xeb, 0xbd, 0x58, 0xfa, 0xb5, 0xbc, 0x93, 0x56, 0x7f, 0xbd, 0x97, 0xca, + 0x78, 0xbd, 0xfb, 0xbf, 0xbe, 0xe0, 0xf3, 0xc1, 0xb5, 0xe4, 0xa1, 0x2e, 0xea, 0x09, 0x90, 0xde, 0xc8, 0xbe, 0xfa, 0x8f, 0xde, 0x2e, 0xa6, 0x3a, 0xb2, 0x0d, 0x0e, 0x61, 0x2f, 0x49, 0x27, 0xbc, + 0x9c, 0xed, 0x23, 0xb0, 0x8f, 0xec, 0x4e, 0x91, 0x2c, 0x82, 0x8e, 0x83, 0xbd, 0x8d, 0x67, 0x3e, 0x5f, 0x82, 0x9c, 0x19, 0xac, 0xa9, 0x6d, 0x4b, 0x87, 0xfb, 0x0e, 0x2f, 0x1a, 0xd5, 0xb4, 0xe0, + 0xc1, 0x48, 0x02, 0x20, 0x8b, 0xcd, 0x4a, 0xc8, 0x0c, 0x11, 0x58, 0x6f, 0x4f, 0xa4, 0x88, 0x96, 0xc7, 0x02, 0xde, 0x8f, 0xfb, 0x60, 0x6f, 0x8c, 0x2d, 0xbf, 0xc1, 0x9f, 0x93, 0x23, 0x26, 0x45, + 0xb7, 0x5d, 0x73, 0x87, 0x7f, 0x89, 0xc2, 0xf9, 0x1a, 0xd2, 0xf3, 0x9e, 0x9c, 0xe9, 0x3b, 0x85, 0xb7, 0x7c, 0x40, 0xd5, 0xfd, 0x7f, 0x7e, 0x7d, 0x1c, 0xbb, 0xef, 0xb1, 0x1e, 0x5f, 0x44, 0xd3, + 0x87, 0x05, 0x3d, 0x6f, 0x5a, 0x88, 0x07, 0x32, 0xcf, 0xbd, 0xfc, 0x88, 0x8f, 0x66, 0xc0, 0xef, 0x1f, 0x23, 0xbf, 0x51, 0xbf, 0x4e, 0x84, 0x2f, 0xf7, 0xae, 0xf3, 0x61, 0xc2, 0xc1, 0x12, 0xe1, + 0x2e, 0x9e, 0xce, 0x46, 0x70, 0x72, 0x18, 0x1d, 0x4e, 0xf6, 0x70, 0x63, 0x67, 0xac, 0xe7, 0x67, 0xc0, 0x68, 0x06, 0x80, 0xf2, 0x69, 0xd4, 0x83, 0xd0, 0x85, 0x8b, 0xb3, 0x70, 0x87, 0x39, 0x7e, + 0x56, 0xb0, 0x64, 0x49, 0xd1, 0x6e, 0xb9, 0xd5, 0x0b, 0x6e, 0x81, 0xee, 0x74, 0xdd, 0x8e, 0xb2, 0xd8, 0x11, 0x79, 0x2e, 0x12, 0x63, 0x82, 0x44, 0xcf, 0x1b, 0x0a, 0x07, 0x10, 0x99, 0x4d, 0xb4, + 0x09, 0xcb, 0xe7, 0x3b, 0xf2, 0x2f, 0xc2, 0xfb, 0xcf, 0xe0, 0xfc, 0x99, 0x96, 0xe3, 0x19, 0xd6, 0x78, 0xa5, 0xf9, 0x0e, 0x9d, 0x33, 0xc5, 0xee, 0x0c, 0xcd, 0x06, 0x1d, 0xb6, 0xc6, 0xd6, 0x51, + 0x1d, 0x2a, 0x14, 0xd6, 0x52, 0x52, 0x6c, 0x8e, 0x5b, 0x63, 0xb1, 0xac, 0xbc, 0xa2, 0xe0, 0xa6, 0x30, 0xf8, 0x2f, 0x82, 0xf3, 0x9f, 0xec, 0xce, 0x47, 0xd2, 0xd7, 0x5e, 0x7d, 0xbc, 0x31, 0xa5, + 0x73, 0x2f, 0xb3, 0xc1, 0x18, 0x64, 0x1a, 0xe3, 0x3d, 0x02, 0x32, 0x0f, 0x14, 0x78, 0xec, 0x0f, 0x0b, 0x76, 0x5b, 0xb2, 0x0c, 0xa5, 0x25, 0xd8, 0xda, 0xa9, 0x20, 0x9a, 0x4c, 0xd7, 0x8e, 0x9d, + 0x9f, 0xcd, 0x4e, 0xcb, 0x0e, 0x34, 0x26, 0xd3, 0x41, 0xc1, 0xfb, 0x75, 0xb3, 0xdb, 0xc1, 0x26, 0x19, 0xfb, 0x98, 0x89, 0x49, 0xf2, 0x02, 0x8a, 0x7a, 0x51, 0x36, 0x20, 0xac, 0x58, 0x9c, 0x9d, + 0x6d, 0xc6, 0x31, 0x31, 0xc2, 0x4d, 0xf1, 0x34, 0x70, 0xdc, 0xe2, 0xd1, 0xf8, 0x3e, 0x57, 0x95, 0xe0, 0x85, 0xe0, 0x15, 0x86, 0xc2, 0x99, 0x5a, 0x71, 0xc0, 0xc7, 0x32, 0x06, 0x15, 0x51, 0x67, + 0xa0, 0xc3, 0x7c, 0x9f, 0xfb, 0x24, 0xb9, 0x2d, 0xca, 0x6d, 0xb1, 0xaa, 0xcf, 0xbb, 0x74, 0x1f, 0x14, 0x62, 0x3c, 0x2f, 0xf3, 0xd5, 0xe8, 0x58, 0x88, 0xb7, 0x0b, 0x50, 0x68, 0x5e, 0xcd, 0x33, + 0xb1, 0xf2, 0x8e, 0x68, 0x9e, 0x0d, 0x5c, 0x17, 0xaf, 0xc8, 0xe3, 0x5c, 0x48, 0x56, 0xc8, 0x40, 0xad, 0xc0, 0x64, 0x2d, 0xb7, 0x4a, 0x2e, 0xad, 0xc9, 0xaa, 0xda, 0x7d, 0x97, 0x78, 0x1c, 0x77, + 0x34, 0x13, 0xff, 0x91, 0xcd, 0x1c, 0x7a, 0x2a, 0x13, 0xed, 0x2b, 0xcd, 0x6b, 0x7f, 0xaf, 0xad, 0xa9, 0x39, 0x66, 0x4b, 0x4d, 0x16, 0x41, 0xcb, 0x03, 0x96, 0x19, 0x28, 0xe5, 0x59, 0x65, 0x01, + 0xf2, 0xf9, 0xec, 0xf1, 0xde, 0xae, 0x0a, 0x53, 0x61, 0xc1, 0xac, 0xeb, 0x34, 0xdb, 0x15, 0x22, 0xa3, 0xe3, 0x12, 0xa4, 0xac, 0x46, 0x36, 0x91, 0x4a, 0x9a, 0xf3, 0x9c, 0xdc, 0x2a, 0xf1, 0x6c, + 0x2f, 0x08, 0xd5, 0xd1, 0x57, 0x57, 0x03, 0x77, 0xbc, 0xb8, 0x32, 0x25, 0x8d, 0xa9, 0xaa, 0x70, 0x17, 0x6c, 0x6c, 0x6f, 0x46, 0xbb, 0xdf, 0xdf, 0x0d, 0x5e, 0x3d, 0x8e, 0xde, 0x42, 0x34, 0x3e, + 0xf0, 0xe0, 0xf7, 0x60, 0xb1, 0xbf, 0x1e, 0x28, 0x7d, 0x3f, 0x26, 0x14, 0xbc, 0x2f, 0x37, 0x3f, 0xa3, 0xf8, 0x7d, 0xa7, 0xfa, 0x02, 0xeb, 0x5b, 0x7b, 0x6a, 0xba, 0x33, 0x65, 0xbb, 0xdd, 0xaa, + 0x9e, 0x6c, 0x36, 0x4d, 0x65, 0x9e, 0xf7, 0x2b, 0x00, 0xf7, 0xfc, 0x33, 0xc0, 0x9f, 0x5b, 0x4a, 0x8b, 0x57, 0xa7, 0xf4, 0xdc, 0x62, 0x55, 0x8c, 0x66, 0x79, 0x44, 0x1b, 0x46, 0xdb, 0x08, 0x0a, + 0xbf, 0x55, 0x06, 0xd0, 0x88, 0x17, 0x4a, 0xc1, 0x48, 0x34, 0xba, 0xa6, 0x23, 0x19, 0x8c, 0x0a, 0xaa, 0xb3, 0xc9, 0x55, 0xcb, 0x2c, 0xdc, 0xdc, 0x6b, 0x87, 0x91, 0xb2, 0x8f, 0xf4, 0x73, 0xfa, + 0xba, 0x6b, 0x7e, 0xc2, 0x77, 0x0b, 0x0f, 0xf2, 0xd8, 0xad, 0xef, 0x73, 0xe0, 0xe2, 0x83, 0xfd, 0x8a, 0x78, 0xc2, 0xc3, 0xe5, 0x03, 0xe1, 0xf9, 0xec, 0xe3, 0xd5, 0xec, 0x46, 0xf0, 0xd7, 0x70, + 0x92, 0x26, 0xbc, 0x85, 0x81, 0xa3, 0x83, 0x58, 0x68, 0xdc, 0xaf, 0x15, 0xf6, 0xb4, 0x59, 0x9c, 0x4c, 0x15, 0xc5, 0xec, 0x91, 0x3a, 0x0c, 0x64, 0x8b, 0x8c, 0xd8, 0x59, 0x08, 0xf4, 0xa3, 0xb2, + 0x04, 0x75, 0xaa, 0x07, 0x2c, 0xab, 0xd2, 0x0d, 0xa2, 0x97, 0xc4, 0x45, 0xc2, 0xf1, 0xe6, 0xe8, 0x8a, 0xcd, 0x26, 0x19, 0x2c, 0x6d, 0x07, 0x9e, 0x17, 0x5c, 0xd9, 0x88, 0x79, 0x85, 0x5d, 0x94, + 0x7c, 0xe9, 0x4d, 0x50, 0x6a, 0xfd, 0x3a, 0xd4, 0xb3, 0xce, 0xbf, 0x65, 0x34, 0xf9, 0x92, 0x77, 0xf1, 0x49, 0xd5, 0xf4, 0x9d, 0x57, 0x6e, 0xe1, 0xc4, 0x33, 0xc7, 0xad, 0xec, 0x32, 0x2c, 0x3e, + 0x45, 0xfa, 0x7f, 0x5a, 0x30, 0xaf, 0x69, 0x2e, 0x5f, 0x63, 0x8e, 0x3f, 0x3f, 0xf8, 0x96, 0xa8, 0xe5, 0x4b, 0x1e, 0xcc, 0xda, 0x2d, 0x33, 0x33, 0x99, 0x55, 0x49, 0x5e, 0x3f, 0x78, 0xa5, 0x9a, + 0xbd, 0xa0, 0xf2, 0x9e, 0xa0, 0xf7, 0x73, 0xea, 0xfd, 0xdb, 0x0b, 0x99, 0xeb, 0x9b, 0xd7, 0x88, 0xf1, 0xd1, 0x2d, 0xf3, 0xf7, 0x45, 0xfd, 0x55, 0x99, 0xfb, 0x51, 0x6c, 0x83, 0xbe, 0x87, 0x56, + 0x07, 0x66, 0xf9, 0x1e, 0x41, 0xfc, 0x21, 0x25, 0xc1, 0xb7, 0x41, 0xf8, 0x1e, 0x86, 0xfd, 0x35, 0xed, 0x41, 0xe7, 0x9a, 0x71, 0xe9, 0x7a, 0xf7, 0xff, 0xfd, 0x6e, 0xb1, 0x1e, 0x08, 0xfe, 0x8c, + 0xe8, 0x2f, 0xe5, 0xc4, 0xdb, 0x0b, 0x7f, 0x9b, 0x55, 0x15, 0xfa, 0xb7, 0x51, 0x59, 0x7c, 0xcb, 0x5a, 0xfb, 0x38, 0xfd, 0xfc, 0x1d, 0xc1, 0xf5, 0xa7, 0x39, 0xcc, 0xef, 0xbc, 0xff, 0x3d, 0xd1, + 0xd1, 0x9b, 0xb8, 0xfb, 0xb6, 0xd6, 0x3f, 0x70, 0x8e, 0x9f, 0x44, 0xcf, 0xbf, 0x0d, 0xca, 0x8f, 0xbb, 0xdf, 0x45, 0xd6, 0x8f, 0x1f, 0x9e, 0xce, 0x05, 0xde, 0x88, 0xcf, 0x67, 0xef, 0xcd, 0xab, + 0x90, 0xfa, 0x79, 0x9b, 0xfa, 0xd7, 0x23, 0x16, 0x10, 0xb7, 0x47, 0xa7, 0xa7, 0xab, 0xde, 0x88, 0x82, 0x51, 0xd1, 0x40, 0xcc, 0xc8, 0x0e, 0x83, 0x33, 0xca, 0xd0, 0x49, 0x99, 0x9f, 0xf6, 0xc9, + 0x49, 0x61, 0x18, 0x7d, 0xa1, 0x1f, 0x0e, 0x38, 0xe6, 0x22, 0x58, 0xae, 0x90, 0x0b, 0x82, 0xf6, 0xe2, 0xc3, 0xc5, 0x1f, 0x80, 0x73, 0xb4, 0xc9, 0xed, 0xbc, 0x1b, 0x60, 0xc2, 0x66, 0x5b, 0x5b, + 0x0e, 0x1b, 0x20, 0xde, 0xb5, 0x18, 0x8c, 0x47, 0xa7, 0xd3, 0xf9, 0xe3, 0x56, 0xf5, 0xaf, 0x87, 0x6c, 0xe0, 0x5f, 0xbf, 0x66, 0x05, 0xff, 0xfa, 0xd7, 0x4f, 0x43, 0xb7, 0x3f, 0xbc, 0xf7, 0xbf, + 0xfe, 0xdb, 0xd7, 0xd6, 0x37, 0x2e, 0xfc, 0x85, 0xa7, 0xdc, 0xe7, 0xc4, 0xcf, 0xf8, 0xd6, 0x7d, 0xa1, 0x7d, 0x63, 0xc6, 0x1f, 0xef, 0x5c, 0x8b, 0x5c, 0x4c, 0x38, 0x45, 0x4a, 0x2b, 0x21, 0x49, + 0x7c, 0x63, 0x5f, 0x9b, 0x4a, 0x4e, 0xa4, 0xa1, 0x4e, 0xd9, 0x87, 0x55, 0x70, 0x52, 0x4c, 0x86, 0x8f, 0xf6, 0x1b, 0x44, 0xd4, 0x2b, 0xe8, 0x1c, 0x3a, 0x34, 0x46, 0x76, 0xe1, 0x3a, 0x82, 0x62, + 0xbd, 0x67, 0x5d, 0xe9, 0x64, 0xd7, 0x07, 0xd2, 0x1d, 0x49, 0x81, 0x59, 0x1a, 0xec, 0x91, 0x01, 0x7d, 0x78, 0xe7, 0x8b, 0x19, 0xca, 0x76, 0xd4, 0x62, 0x77, 0xc2, 0xc3, 0x63, 0xd1, 0x4e, 0xe0, + 0xc7, 0xdf, 0x99, 0xcf, 0x77, 0xc6, 0x31, 0xe5, 0xc4, 0xf8, 0x25, 0x31, 0xc3, 0x83, 0x73, 0xc7, 0xbd, 0xd8, 0xa2, 0x7b, 0x83, 0xf1, 0x5c, 0x96, 0xc2, 0x6f, 0xd4, 0x5f, 0x86, 0xe3, 0xeb, 0xbd, + 0xa9, 0xb9, 0x0a, 0xc3, 0x39, 0xac, 0x59, 0x99, 0x3c, 0xce, 0x9b, 0xfe, 0xb8, 0x52, 0x50, 0x80, 0x77, 0xce, 0x7b, 0x9f, 0x55, 0xe9, 0x13, 0xb7, 0x80, 0x31, 0x80, 0xbb, 0xe8, 0x56, 0x2c, 0x8d, + 0x34, 0x02, 0x43, 0x74, 0xb3, 0x92, 0xf6, 0xca, 0x45, 0x68, 0xf6, 0xec, 0x8e, 0x04, 0x77, 0x1c, 0x0c, 0xa8, 0x70, 0x5f, 0xeb, 0x8c, 0xc3, 0x0a, 0xa9, 0xb1, 0x70, 0x8e, 0xa8, 0xb7, 0xee, 0x2b, + 0x67, 0x21, 0x6b, 0x07, 0x40, 0xfd, 0xa6, 0xd0, 0xfe, 0xa9, 0xbd, 0xeb, 0xb9, 0x78, 0xd0, 0x77, 0x53, 0xd7, 0xab, 0x95, 0x6b, 0x62, 0x20, 0x68, 0x2a, 0x75, 0x00, 0xec, 0xc5, 0x92, 0x45, 0x1e, + 0x46, 0x09, 0x3b, 0x83, 0x9c, 0x0e, 0xee, 0x2e, 0x4e, 0xa6, 0xf1, 0x82, 0x7b, 0xaa, 0xc5, 0x45, 0x09, 0x26, 0x3c, 0x31, 0x62, 0x24, 0x69, 0x76, 0x2b, 0xcd, 0xbf, 0xb8, 0x26, 0x66, 0xd1, 0x61, + 0x08, 0x83, 0xa4, 0x5e, 0xee, 0xa8, 0x72, 0xe3, 0xcc, 0x99, 0x1e, 0xe4, 0x60, 0xc1, 0x1e, 0x51, 0x19, 0x82, 0xa0, 0x95, 0xb9, 0x89, 0x15, 0xdb, 0x02, 0xbf, 0xf5, 0xd7, 0x33, 0xcd, 0x6a, 0x16, + 0x55, 0xb3, 0xb2, 0xc9, 0xea, 0x5b, 0x66, 0xf9, 0xfb, 0x07, 0x94, 0x67, 0xaa, 0xb3, 0x7f, 0xa1, 0x7d, 0x0d, 0xee, 0xfc, 0x74, 0xe7, 0xea, 0x67, 0x36, 0x41, 0xd4, 0xf4, 0xa4, 0x8c, 0x72, 0xbb, + 0xa6, 0x86, 0x4d, 0xc0, 0x22, 0x34, 0x08, 0x51, 0xf4, 0x20, 0xea, 0xcb, 0x0b, 0x27, 0x9b, 0x38, 0x9a, 0x20, 0x20, 0x67, 0xe3, 0x52, 0xb5, 0xd9, 0x27, 0x84, 0x08, 0x60, 0x15, 0x4b, 0x35, 0xa6, + 0x51, 0xf7, 0x1a, 0xd7, 0x89, 0xf0, 0x56, 0xdd, 0x61, 0x2c, 0x2c, 0x90, 0x85, 0x93, 0xa2, 0xfd, 0x0e, 0xe2, 0x60, 0x5a, 0xac, 0x9c, 0x51, 0x3f, 0xe0, 0xb0, 0x73, 0xd8, 0x4c, 0x58, 0x8b, 0x9f, + 0x2d, 0xa0, 0x6f, 0xde, 0x2d, 0x1f, 0xd6, 0xd9, 0x47, 0xcb, 0xcf, 0x5f, 0xff, 0x40, 0xdf, 0xc4, 0x94, 0x37, 0x7d, 0xe7, 0x5f, 0xdf, 0x13, 0xb0, 0xbc, 0x86, 0xc3, 0xbe, 0x6d, 0xa4, 0xf8, 0xdd, + 0xa7, 0xb3, 0xd2, 0xec, 0x66, 0x56, 0xee, 0xbc, 0xbd, 0xf6, 0x65, 0xcf, 0x8e, 0xaa, 0xd9, 0x60, 0xa6, 0xc9, 0xfb, 0x66, 0xfc, 0xe9, 0x61, 0x96, 0x3b, 0xee, 0x2c, 0xaf, 0x66, 0x4d, 0x1d, 0xbe, + 0xcb, 0x42, 0xc8, 0x67, 0xc1, 0x21, 0x6f, 0xdd, 0x32, 0xc9, 0x4d, 0x67, 0xf6, 0xb2, 0x07, 0xbb, 0x1f, 0x13, 0x2b, 0xc1, 0x9f, 0x25, 0xa2, 0xa2, 0xcc, 0xd3, 0x99, 0x9d, 0x84, 0x6f, 0xf9, 0xe8, + 0xa1, 0xc5, 0x57, 0xe9, 0xe0, 0x63, 0xf5, 0x81, 0x07, 0xbc, 0xe6, 0x1a, 0x8d, 0x66, 0xe7, 0x59, 0x7d, 0x65, 0x00, 0x43, 0xe1, 0xfe, 0xb4, 0x1a, 0xed, 0x73, 0x4a, 0x82, 0x07, 0xdf, 0x78, 0x8b, + 0x2b, 0xfe, 0xfe, 0x64, 0xaa, 0xda, 0x40, 0xb3, 0xec, 0x85, 0x66, 0x0f, 0x95, 0xa2, 0xd9, 0x95, 0xb8, 0x34, 0x19, 0x45, 0xc1, 0xf8, 0x0b, 0x22, 0x74, 0x2d, 0x73, 0x21, 0xb0, 0x15, 0xa0, 0x66, + 0x56, 0xec, 0xee, 0x5c, 0xaf, 0x70, 0xf5, 0x83, 0x06, 0x94, 0xc3, 0xb8, 0xd9, 0x27, 0x0a, 0x2a, 0xc8, 0xf5, 0x66, 0x1f, 0x54, 0xa8, 0x90, 0x80, 0x87, 0x58, 0xd9, 0x16, 0x36, 0x0b, 0x74, 0x07, + 0x70, 0xdf, 0x79, 0x1c, 0xb0, 0x59, 0x29, 0xcb, 0xdd, 0x37, 0xef, 0xd7, 0xd7, 0x80, 0x3d, 0xfb, 0x65, 0xe8, 0x9a, 0x32, 0x9c, 0xbd, 0x1b, 0xbb, 0x7e, 0x02, 0xd2, 0xef, 0xb3, 0xe5, 0x87, 0x5f, + 0x79, 0x83, 0xe9, 0xde, 0xb3, 0xa9, 0x99, 0x1e, 0x55, 0xd6, 0x67, 0x55, 0x7f, 0xe9, 0x2a, 0x7d, 0x7b, 0x34, 0xb6, 0x9d, 0x8a, 0x6f, 0x5a, 0xcf, 0x32, 0x19, 0x8c, 0xd4, 0xe4, 0x00, 0xb6, 0x0f, + 0x00, 0x12, 0x2d, 0x3d, 0x6e, 0x3b, 0x2a, 0xdc, 0xaa, 0x57, 0xa9, 0x3d, 0xe2, 0x9c, 0x11, 0x13, 0x53, 0x47, 0x7c, 0x80, 0xbd, 0x79, 0x23, 0x81, 0x2e, 0x42, 0xa1, 0x6a, 0x9a, 0x3b, 0x34, 0x92, + 0xcb, 0xcb, 0x45, 0x74, 0x92, 0x08, 0xe6, 0x7c, 0xda, 0xed, 0xbe, 0xf9, 0x05, 0x7d, 0x8f, 0x6c, 0xbc, 0xcf, 0xaf, 0x9f, 0x51, 0x3e, 0x7e, 0xa1, 0xfd, 0x03, 0x94, 0x77, 0x45, 0x34, 0x32, 0x4d, + 0xf1, 0xe8, 0x21, 0x17, 0x89, 0xc8, 0xa5, 0x81, 0x88, 0x60, 0x32, 0xa0, 0xdc, 0x39, 0x43, 0x9c, 0x57, 0x04, 0xd4, 0x1d, 0x52, 0x96, 0x5a, 0xad, 0x94, 0xb9, 0x4f, 0x0b, 0x19, 0xcb, 0x93, 0xfa, + 0x76, 0x19, 0x54, 0x9d, 0x80, 0x51, 0x07, 0x36, 0x02, 0x09, 0xc6, 0x5e, 0x32, 0x3a, 0x3f, 0x12, 0xf6, 0x76, 0x07, 0x00, 0x7d, 0x52, 0xd0, 0xab, 0x9d, 0x4f, 0x9b, 0x61, 0x7d, 0xae, 0x40, 0x84, + 0x3c, 0x1d, 0xf1, 0xc5, 0x1d, 0x0e, 0x7e, 0x2f, 0xe8, 0xfc, 0xfe, 0x26, 0xfe, 0x4c, 0x02, 0xfa, 0x3b, 0xf4, 0x1f, 0x84, 0xe9, 0x2f, 0xa7, 0xa5, 0xa2, 0xaf, 0xa8, 0xb3, 0x78, 0xf2, 0x33, 0xd2, + 0xa8, 0xdc, 0x43, 0x03, 0x49, 0x7e, 0x84, 0x26, 0x8a, 0x25, 0x81, 0x8c, 0x17, 0x6d, 0x02, 0x43, 0xd5, 0xc8, 0xb4, 0x30, 0x96, 0xa4, 0x29, 0x6f, 0xe3, 0xe1, 0x10, 0x2c, 0x7d, 0x52, 0xa3, 0x7c, + 0x73, 0xde, 0x88, 0xfb, 0x48, 0x12, 0x99, 0x82, 0xde, 0x44, 0x2b, 0xc2, 0x74, 0xd4, 0x5d, 0xe1, 0x08, 0xf6, 0xea, 0x20, 0xd3, 0x27, 0xbf, 0x34, 0xb0, 0x2a, 0xcb, 0x27, 0xe8, 0x63, 0xef, 0x66, + 0xbf, 0xb8, 0x73, 0xb6, 0xfc, 0xe0, 0xe6, 0xf1, 0xfd, 0xc9, 0x84, 0x44, 0x1c, 0x77, 0x02, 0x6e, 0x91, 0x6f, 0x2f, 0xfd, 0xc8, 0xd6, 0xf1, 0x85, 0x6d, 0x97, 0x9e, 0x63, 0xbf, 0x33, 0xe1, 0x07, + 0xca, 0xf7, 0x2b, 0x85, 0x4b, 0xe3, 0x96, 0xc3, 0xfb, 0xb1, 0xf0, 0x91, 0xee, 0xfd, 0x99, 0x5d, 0xfb, 0x33, 0xf1, 0xb7, 0xc1, 0xfe, 0x70, 0xeb, 0x7a, 0xa8, 0x99, 0xb0, 0x6f, 0xfb, 0x28, 0xdb, + 0xb0, 0x6a, 0xba, 0xd1, 0x6c, 0xd0, 0xdb, 0xd1, 0xb8, 0xaa, 0x32, 0x60, 0x14, 0xd6, 0x0b, 0x1f, 0x24, 0xb7, 0x54, 0xbe, 0x0f, 0x56, 0xf1, 0x9e, 0xb3, 0xa0, 0x63, 0x6a, 0x55, 0xf2, 0x5a, 0xe1, + 0x5b, 0x09, 0x30, 0x56, 0x38, 0x8d, 0xae, 0x14, 0x03, 0xd8, 0xd6, 0x1b, 0x3c, 0xe3, 0x46, 0x59, 0xd4, 0xb2, 0x20, 0x74, 0xc5, 0x61, 0xb8, 0x5c, 0xc2, 0x62, 0xe4, 0xf9, 0x75, 0xc6, 0x44, 0xd3, + 0xe3, 0x9e, 0xef, 0xb2, 0xd1, 0xaf, 0x67, 0xc6, 0xef, 0xc0, 0x96, 0xae, 0xf3, 0x58, 0x3f, 0x84, 0x3c, 0xe5, 0x75, 0xff, 0x81, 0xee, 0x1b, 0x9c, 0xb7, 0xab, 0x19, 0x32, 0xcd, 0xd3, 0x7e, 0x34, + 0x4f, 0xa6, 0xb3, 0x0a, 0x4a, 0x80, 0x77, 0xe3, 0x61, 0x34, 0x93, 0x84, 0xe4, 0x34, 0xf2, 0xa4, 0x1d, 0x84, 0x23, 0xce, 0xf1, 0x3d, 0x32, 0x5e, 0x0a, 0x03, 0xe4, 0x94, 0x0d, 0x6c, 0x6e, 0xbd, + 0xc5, 0xda, 0xac, 0x83, 0x6c, 0x0b, 0x7a, 0x08, 0x7c, 0x3e, 0x08, 0x34, 0x9f, 0xe8, 0xf8, 0xae, 0xd9, 0xea, 0x08, 0x93, 0x1f, 0x05, 0xf8, 0x80, 0xce, 0x51, 0x4f, 0x1e, 0xf9, 0xea, 0x60, 0x32, + 0xbb, 0x6f, 0x8a, 0x5b, 0xef, 0x6e, 0x81, 0xa3, 0xfb, 0x02, 0xe1, 0x33, 0x86, 0xbd, 0x3b, 0xf4, 0xdf, 0xe0, 0xf8, 0x7c, 0x77, 0x72, 0xa4, 0x36, 0xc0, 0xee, 0x6d, 0xd8, 0x49, 0x77, 0x87, 0x44, + 0x2c, 0x12, 0x7a, 0xce, 0x2c, 0x58, 0x22, 0x21, 0x0e, 0x36, 0xc9, 0x90, 0x9e, 0x58, 0x8b, 0x28, 0xa5, 0xe3, 0x8b, 0xe6, 0x7c, 0xd0, 0x24, 0x74, 0xdd, 0xda, 0x23, 0x71, 0xb0, 0x7d, 0x04, 0xd1, + 0xe1, 0x11, 0xda, 0x9d, 0xad, 0xe4, 0x84, 0xf6, 0x8e, 0xbe, 0x5c, 0x88, 0x9a, 0x7e, 0x66, 0xd6, 0x2d, 0x00, 0xaa, 0xc5, 0x05, 0xdf, 0xe5, 0xe8, 0x18, 0x4f, 0x09, 0x40, 0xf8, 0xb0, 0x86, 0x1f, + 0xc9, 0xcb, 0x4f, 0xce, 0x92, 0xa6, 0x0c, 0xdf, 0x30, 0x79, 0x99, 0xba, 0x13, 0x23, 0x31, 0xec, 0x5d, 0x53, 0xb1, 0xd4, 0xae, 0x9e, 0x1f, 0xe7, 0xf9, 0x0e, 0x1d, 0xe7, 0x50, 0x36, 0x78, 0x2e, + 0xbc, 0x69, 0xb7, 0xec, 0xf9, 0x94, 0x07, 0xe7, 0xa3, 0xd7, 0xc6, 0x42, 0xd0, 0xf6, 0x60, 0xb6, 0x5a, 0xab, 0x40, 0xef, 0x2d, 0xf9, 0x7c, 0xa5, 0x45, 0x24, 0x63, 0xab, 0x05, 0x81, 0x34, 0x82, + 0x42, 0xd9, 0xc1, 0xa8, 0xdb, 0x55, 0x2b, 0x26, 0xa5, 0x59, 0x90, 0x8e, 0x06, 0x35, 0x2a, 0xa0, 0x6f, 0xef, 0xee, 0xba, 0x8f, 0xe7, 0xc4, 0xe2, 0x6f, 0xf8, 0x59, 0x91, 0xed, 0xc7, 0x44, 0x78, + 0x19, 0xfc, 0x1b, 0xa1, 0x5f, 0x77, 0x7a, 0x54, 0xd5, 0x70, 0xc9, 0x6e, 0x49, 0x0b, 0xd2, 0x0d, 0xd4, 0x1b, 0xca, 0x6c, 0x93, 0x91, 0xd0, 0x8a, 0x84, 0xd6, 0x06, 0x13, 0x6f, 0x39, 0x54, 0x6f, + 0xd6, 0x07, 0x9f, 0x42, 0xa4, 0x42, 0x46, 0x92, 0x45, 0x72, 0x38, 0x0e, 0xd0, 0x42, 0x85, 0x6c, 0x1b, 0x42, 0xad, 0x05, 0xbb, 0x15, 0x99, 0xf9, 0x28, 0x11, 0xb8, 0xba, 0x92, 0x1d, 0x19, 0x38, + 0x2d, 0xa0, 0x7d, 0xcc, 0xe8, 0x88, 0x7b, 0x81, 0xf2, 0x09, 0xc7, 0x82, 0x47, 0xf9, 0xac, 0x5e, 0x78, 0xfd, 0xf2, 0x33, 0x37, 0xff, 0x96, 0x66, 0xe8, 0xe5, 0x1d, 0xf8, 0xc1, 0x3b, 0xf7, 0xf6, + 0xd4, 0x4f, 0xe4, 0x17, 0x5f, 0x6b, 0x99, 0xdd, 0xc9, 0xf4, 0x71, 0xa7, 0x9e, 0xd8, 0x5b, 0x04, 0xe3, 0xcb, 0x96, 0xf6, 0x55, 0x73, 0xfb, 0x50, 0x26, 0xbf, 0xb3, 0x31, 0xde, 0x97, 0x34, 0xde, + 0xd2, 0xdb, 0x7c, 0x7c, 0x31, 0xcc, 0x9c, 0x59, 0x3a, 0xcc, 0xba, 0xd7, 0xc4, 0x7d, 0xd8, 0xd7, 0x5a, 0x65, 0x49, 0xe8, 0x07, 0xf5, 0xcb, 0x1b, 0x2f, 0x00, 0xdf, 0x0a, 0xb8, 0xbc, 0x90, 0x21, + 0x3e, 0xff, 0xb8, 0x22, 0xcc, 0xde, 0x7e, 0xf6, 0x57, 0x6d, 0xe5, 0xab, 0xbb, 0xe4, 0xac, 0x33, 0xcb, 0xec, 0x47, 0xbf, 0xbf, 0xbf, 0xd4, 0x0f, 0x33, 0xd3, 0x71, 0xca, 0x77, 0x5c, 0xb0, 0x07, + 0x5b, 0xed, 0x17, 0x5c, 0x2b, 0xd7, 0x6e, 0x4a, 0xf7, 0xd6, 0xd7, 0x1f, 0x80, 0xc0, 0x5f, 0x47, 0xf7, 0x4b, 0xc5, 0xec, 0x4f, 0xcf, 0x3e, 0x14, 0xcd, 0x78, 0x3d, 0x19, 0xfe, 0x64, 0xcf, 0x79, + 0x19, 0xe9, 0x22, 0x69, 0xfc, 0x4f, 0x69, 0x55, 0x3f, 0xaf, 0xad, 0x67, 0xfc, 0xa2, 0x3e, 0x93, 0xfe, 0xb0, 0xc2, 0x6e, 0x37, 0x66, 0x8b, 0x69, 0x7e, 0x52, 0x18, 0x61, 0xc6, 0xe0, 0xbe, 0x77, + 0x1c, 0x01, 0x6c, 0x6a, 0x52, 0x23, 0xa5, 0xa5, 0x6d, 0xb3, 0x41, 0x5b, 0xa1, 0xad, 0x06, 0x73, 0xdb, 0x81, 0x61, 0x38, 0xae, 0x4a, 0x8d, 0x98, 0x22, 0xf9, 0xf2, 0x82, 0x04, 0x9a, 0x0d, 0xad, + 0x98, 0xb1, 0xe5, 0x45, 0x46, 0xb0, 0xdb, 0x53, 0x75, 0xe6, 0xd6, 0x62, 0xb2, 0xdc, 0x01, 0xfc, 0x09, 0x38, 0x0a, 0x0b, 0x9d, 0xe5, 0xb6, 0x6e, 0x20, 0x78, 0xf2, 0x7d, 0x91, 0xfe, 0xcb, 0x91, + 0xf7, 0x01, 0x97, 0x79, 0x72, 0xe7, 0xf9, 0x48, 0xfc, 0x03, 0x16, 0x6f, 0xb7, 0xae, 0xb5, 0xae, 0x27, 0xec, 0x39, 0xc4, 0xf9, 0xbc, 0x4d, 0xb0, 0x15, 0x0c, 0x28, 0x90, 0x16, 0x12, 0x22, 0x9c, + 0x0b, 0x27, 0x46, 0xad, 0xf7, 0x03, 0x64, 0x08, 0xf1, 0xe8, 0xd0, 0x42, 0xe4, 0xc8, 0xe1, 0x59, 0xce, 0x46, 0x1f, 0x24, 0xbd, 0x39, 0xde, 0xf9, 0x4e, 0x55, 0xf8, 0xe7, 0x9e, 0xd5, 0x32, 0x9d, + 0x72, 0x07, 0x11, 0x67, 0xb6, 0x99, 0xcd, 0x2e, 0xe5, 0xb9, 0xa5, 0xef, 0xe9, 0x0b, 0x9a, 0xc0, 0x24, 0xa8, 0x0b, 0x39, 0x35, 0x41, 0x7c, 0xfd, 0x36, 0x4f, 0xee, 0x84, 0xdd, 0x7e, 0x52, 0x17, + 0xc0, 0x9f, 0x62, 0x44, 0x7f, 0x32, 0xab, 0x1f, 0x56, 0x89, 0xf3, 0x5e, 0xa3, 0x78, 0x1f, 0x08, 0x97, 0xcf, 0x4e, 0xc9, 0xcb, 0x2b, 0xfa, 0x97, 0xd9, 0x8d, 0xc8, 0xaf, 0x31, 0xef, 0xa8, 0x32, + 0xb7, 0x15, 0xf8, 0xb0, 0xd2, 0x34, 0x13, 0x48, 0x54, 0xaa, 0xc6, 0x8f, 0xf9, 0xee, 0x48, 0xe3, 0xc4, 0x26, 0xc4, 0x05, 0x87, 0xa4, 0x04, 0xda, 0x9c, 0xc7, 0xeb, 0x6c, 0x70, 0x87, 0x48, 0x5e, + 0x9a, 0x86, 0xb0, 0x9c, 0x6f, 0xf9, 0x76, 0xb7, 0xac, 0xd6, 0x3b, 0x9e, 0xa4, 0x2f, 0xe2, 0x3c, 0xc0, 0x39, 0x98, 0x50, 0x98, 0x13, 0xa3, 0x58, 0x4b, 0xa4, 0x52, 0x9a, 0xe5, 0x2e, 0xb8, 0x38, + 0x13, 0x82, 0x9f, 0x4b, 0xb7, 0xa9, 0xde, 0xb8, 0x1c, 0xf4, 0xd8, 0xac, 0xf8, 0x29, 0x08, 0xea, 0x1e, 0x58, 0xd8, 0x73, 0xe7, 0xf4, 0x77, 0xb2, 0x2f, 0x80, 0xbd, 0x5f, 0x5c, 0xdd, 0xe4, 0x27, + 0x4c, 0xd4, 0x8b, 0x90, 0x13, 0x1b, 0xc0, 0xe1, 0x94, 0x74, 0x05, 0x1f, 0x6c, 0x6b, 0x41, 0x59, 0xe7, 0x36, 0x63, 0xf7, 0xfd, 0x49, 0x8c, 0x56, 0x29, 0x70, 0x3c, 0x16, 0xee, 0xc2, 0xa7, 0x9b, + 0x6d, 0x39, 0xc6, 0x07, 0x2c, 0x5d, 0x9f, 0x93, 0xb9, 0x13, 0xe9, 0x72, 0x03, 0x0b, 0x8e, 0x04, 0x8b, 0x26, 0x02, 0xc2, 0xfc, 0x22, 0xbf, 0xc4, 0xb2, 0x4f, 0x84, 0x25, 0x1a, 0x99, 0x07, 0x75, + 0x0f, 0x2b, 0xf2, 0xb9, 0xf8, 0x55, 0x71, 0x97, 0xfb, 0x38, 0x7e, 0xab, 0x84, 0x73, 0xcb, 0x5f, 0xf5, 0x88, 0x23, 0x7e, 0xda, 0x3e, 0xee, 0xe3, 0x89, 0x3e, 0x73, 0xb2, 0xf9, 0x41, 0xf7, 0x0a, + 0xe8, 0xfb, 0xd5, 0xec, 0x4a, 0xef, 0xd7, 0x88, 0x82, 0x42, 0xc4, 0x64, 0x90, 0x05, 0x65, 0x2b, 0x0d, 0x71, 0xcf, 0x56, 0x4a, 0x50, 0x83, 0xbb, 0x66, 0xc2, 0xca, 0x16, 0xf5, 0x90, 0x39, 0x78, + 0x81, 0x1b, 0x42, 0x9d, 0xa0, 0x28, 0xc4, 0xc5, 0xf3, 0xa4, 0x38, 0x26, 0xf0, 0x6e, 0x0d, 0x1e, 0x72, 0xfc, 0x5c, 0x9e, 0x75, 0x4f, 0xde, 0x72, 0x7e, 0x26, 0x67, 0x74, 0x80, 0xa3, 0x74, 0xef, + 0x3a, 0x4e, 0x43, 0x66, 0x94, 0xb7, 0xc8, 0x3a, 0x65, 0x3d, 0x61, 0x1a, 0x7a, 0x93, 0x8f, 0x95, 0x9f, 0x0f, 0x85, 0x77, 0xf6, 0xf0, 0xab, 0x9c, 0x7d, 0x1d, 0x0b, 0xf8, 0x7d, 0x53, 0x7c, 0xb4, + 0xfa, 0x7f, 0x54, 0x29, 0xbc, 0x37, 0x06, 0x9f, 0xeb, 0x16, 0x4e, 0x1e, 0x83, 0x57, 0xa2, 0x2f, 0x03, 0xf0, 0xda, 0x9c, 0x5d, 0x29, 0xfd, 0x1a, 0xfd, 0xe8, 0xa2, 0x7b, 0x87, 0x02, 0x4b, 0x73, + 0xa2, 0xdd, 0x0d, 0x92, 0x87, 0x0f, 0xb1, 0x0a, 0xb7, 0x18, 0x09, 0xc0, 0xfc, 0x42, 0x8a, 0xdc, 0x95, 0xbb, 0x5b, 0x02, 0xf4, 0x48, 0x68, 0xa5, 0x19, 0x0a, 0x50, 0xe8, 0x67, 0x38, 0xd4, 0x45, + 0x21, 0x83, 0x6d, 0x2c, 0xa2, 0x95, 0x05, 0xb5, 0x95, 0x3c, 0xbe, 0x4e, 0x65, 0x73, 0xc1, 0xc0, 0xc7, 0x5c, 0x3a, 0x95, 0xa5, 0x16, 0xb6, 0x8e, 0x62, 0xa4, 0xcf, 0x39, 0x1c, 0xdc, 0x33, 0xd2, + 0x20, 0x0f, 0x51, 0xfc, 0x09, 0x88, 0xcf, 0x15, 0xe1, 0x78, 0xa5, 0x79, 0xc3, 0xf0, 0x0a, 0xe1, 0x84, 0x02, 0x1c, 0xd0, 0x6c, 0x05, 0x2c, 0x48, 0x85, 0x0a, 0x9b, 0x2a, 0xa5, 0xa5, 0x1c, 0xc5, + 0xd1, 0x65, 0x12, 0x39, 0xe4, 0xc9, 0xaa, 0xb6, 0xcb, 0xf8, 0xeb, 0x5e, 0xfc, 0xa1, 0x80, 0xed, 0xfd, 0x4d, 0xf8, 0x29, 0x49, 0xff, 0x8d, 0xea, 0xed, 0x87, 0xdf, 0xda, 0x53, 0x53, 0xd8, 0xae, + 0x4f, 0xeb, 0x38, 0x91, 0xb7, 0xe1, 0xb2, 0x06, 0x25, 0xce, 0x68, 0x42, 0x2d, 0x27, 0xe7, 0x12, 0xda, 0xda, 0x59, 0x6f, 0x1f, 0x24, 0x71, 0xd9, 0x3a, 0x8d, 0x2f, 0x17, 0x0d, 0x39, 0x84, 0xa8, + 0x7c, 0xde, 0x86, 0xb0, 0x9d, 0x88, 0x62, 0x01, 0xf4, 0xfe, 0x3a, 0x68, 0x38, 0x93, 0x59, 0x01, 0xe3, 0xd6, 0xcf, 0x10, 0x88, 0x75, 0x60, 0x64, 0xa9, 0x22, 0x4b, 0x0f, 0x63, 0x86, 0x38, 0x36, + 0xbb, 0xe7, 0x46, 0xff, 0x43, 0xf2, 0x9c, 0xbf, 0xfe, 0xf9, 0x9c, 0x2a, 0xe7, 0x6e, 0xac, 0xcd, 0x6d, 0x19, 0xe2, 0x1f, 0x5f, 0x4a, 0xc3, 0xf4, 0x96, 0xf3, 0xe4, 0x83, 0x22, 0xe9, 0x91, 0xda, + 0xfc, 0x63, 0xb5, 0xe0, 0x3f, 0x78, 0x16, 0x7f, 0x27, 0xfb, 0x3a, 0x1a, 0xb7, 0x8b, 0xa9, 0x27, 0x6f, 0x70, 0x6d, 0xcb, 0x44, 0xb7, 0xda, 0xac, 0xc7, 0x43, 0xeb, 0x85, 0x71, 0x85, 0xe5, 0xe9, + 0x1e, 0x90, 0x43, 0x7d, 0x4f, 0x86, 0x34, 0x70, 0x1a, 0xd9, 0x85, 0x68, 0x77, 0x90, 0x92, 0x28, 0xf9, 0x36, 0x0b, 0x94, 0x9e, 0xb6, 0x39, 0x36, 0xaa, 0x41, 0x11, 0xeb, 0xf1, 0x6e, 0x6d, 0x81, + 0x0d, 0x2a, 0x30, 0x0d, 0xce, 0x5b, 0x04, 0xae, 0x6e, 0x91, 0xac, 0xaf, 0x93, 0xcd, 0x72, 0x85, 0x59, 0xad, 0xf2, 0xdc, 0xe6, 0xf2, 0xc3, 0xdd, 0xec, 0x8e, 0xd3, 0x40, 0xe0, 0xf6, 0x79, 0xe8, + 0xdc, 0xe7, 0x85, 0x79, 0x66, 0xbf, 0x2d, 0xdf, 0x2f, 0x63, 0xf8, 0xb9, 0x96, 0xf2, 0xa3, 0x61, 0xe9, 0xcc, 0xd2, 0x79, 0xe8, 0xb3, 0x09, 0x3e, 0xa7, 0x02, 0x78, 0xa3, 0x7a, 0x1b, 0x94, 0x5b, + 0x7b, 0x06, 0x4e, 0x53, 0x02, 0x58, 0xcd, 0x71, 0x0b, 0x7a, 0x05, 0x55, 0x1f, 0x19, 0xf9, 0xb4, 0x12, 0x48, 0xd9, 0x45, 0x03, 0x1a, 0x5e, 0xe2, 0xf5, 0xba, 0xb1, 0x36, 0xf9, 0xf1, 0x60, 0x2d, + 0x0c, 0x9e, 0x44, 0xf9, 0x9e, 0x3b, 0x33, 0x7c, 0x07, 0xfb, 0x82, 0xdd, 0x31, 0x39, 0xd1, 0x0d, 0xa6, 0x95, 0x8c, 0xdc, 0x28, 0x90, 0xcb, 0x91, 0xe8, 0x49, 0xe2, 0x00, 0xb1, 0x7c, 0x14, 0xcf, + 0xf9, 0x1a, 0xe5, 0x4e, 0x84, 0xa9, 0xe7, 0xdf, 0x95, 0x44, 0xd5, 0xdf, 0xa5, 0x6b, 0x26, 0xc5, 0xcf, 0x3c, 0xf9, 0x9f, 0xe2, 0x0e, 0x3f, 0xe8, 0xbe, 0x74, 0xfe, 0xc7, 0xd5, 0x14, 0x13, 0x0d, + 0x34, 0xdb, 0x48, 0x72, 0xbd, 0x97, 0xb9, 0x73, 0xc4, 0x16, 0x24, 0x0c, 0xe6, 0x59, 0x80, 0x57, 0x94, 0x74, 0x4c, 0x15, 0x34, 0x9e, 0x90, 0xe7, 0xfc, 0x43, 0xd8, 0xe6, 0xfd, 0x15, 0xf6, 0x4c, + 0xe5, 0x8e, 0x37, 0xa2, 0xd7, 0xde, 0xbc, 0xda, 0x7e, 0xe1, 0x69, 0x15, 0x3c, 0xfa, 0xf0, 0xc2, 0x49, 0xc7, 0x45, 0x4f, 0xba, 0xcc, 0xa9, 0xa1, 0x88, 0x46, 0x4d, 0x01, 0x6f, 0x73, 0xb4, 0x77, + 0x82, 0xcf, 0x52, 0x5c, 0x28, 0x50, 0x22, 0xe0, 0x6a, 0xe1, 0x70, 0xc2, 0xa2, 0xca, 0x3f, 0xaf, 0x2e, 0x90, 0x15, 0x9f, 0x07, 0xbf, 0x06, 0xc1, 0x9c, 0x94, 0xf3, 0x8e, 0xc2, 0xd6, 0x4e, 0x5d, + 0x08, 0x8c, 0x69, 0x8a, 0x3e, 0x5b, 0xe3, 0x10, 0x2c, 0x12, 0xa6, 0x05, 0xd0, 0xf4, 0xa3, 0xc4, 0x1a, 0xef, 0xb7, 0xf2, 0xab, 0xbf, 0xd5, 0x55, 0xbc, 0xf8, 0x0e, 0xd0, 0x17, 0x0f, 0xaf, 0x47, + 0xea, 0xe6, 0x27, 0xf8, 0xd0, 0x47, 0xca, 0x2f, 0x50, 0x7d, 0xbc, 0x9e, 0xec, 0xf2, 0xbf, 0xcb, 0x5b, 0x72, 0xe4, 0xb4, 0x05, 0x51, 0x6d, 0x70, 0x3d, 0x59, 0xe2, 0x9e, 0xbc, 0x52, 0xf7, 0xcb, + 0xaa, 0x95, 0x0f, 0x8d, 0x19, 0x5a, 0x62, 0xaf, 0x49, 0xfb, 0xcd, 0x21, 0xa5, 0x04, 0xeb, 0xd4, 0xac, 0x4a, 0x90, 0xf3, 0x20, 0x36, 0x14, 0xf3, 0x62, 0xcb, 0x11, 0x7c, 0xb8, 0x89, 0x42, 0x9d, + 0x5a, 0x59, 0x9e, 0x69, 0xc2, 0x9b, 0x00, 0xb5, 0x4a, 0x57, 0x42, 0x49, 0xfe, 0x7c, 0xda, 0x81, 0xdf, 0xac, 0x73, 0x5f, 0x7d, 0xd8, 0xfe, 0x1c, 0x08, 0x9f, 0x28, 0xcf, 0x67, 0x9f, 0xaf, 0xa7, + 0x82, 0x10, 0xab, 0x46, 0x99, 0x9d, 0xb9, 0x05, 0x2c, 0xad, 0xc2, 0x35, 0x09, 0xef, 0x7c, 0xc8, 0xda, 0xe2, 0x63, 0x94, 0xef, 0x38, 0xc1, 0xef, 0xd5, 0x4e, 0x5f, 0xad, 0x5d, 0xde, 0xe9, 0x74, + 0xf4, 0xd4, 0xce, 0x6d, 0x41, 0x76, 0xb7, 0x85, 0x9d, 0x6b, 0x8b, 0x42, 0x63, 0x3c, 0x56, 0xe9, 0x79, 0xf6, 0x9c, 0x93, 0x65, 0x56, 0xae, 0x4b, 0xd8, 0x25, 0xaa, 0x32, 0x23, 0xfb, 0x7e, 0xbb, + 0x2b, 0x4d, 0x99, 0x98, 0x72, 0x30, 0xfd, 0xb5, 0xf7, 0xdf, 0x6f, 0xb9, 0xeb, 0x3d, 0x38, 0x15, 0x3c, 0x74, 0x0f, 0xfc, 0x73, 0x2c, 0xe8, 0xfe, 0x27, 0x5e, 0xc7, 0xe3, 0xfb, 0x83, 0x29, 0x8c, + 0xe9, 0x65, 0x60, 0xe0, 0x75, 0xea, 0x30, 0x90, 0xde, 0xee, 0xa4, 0xd0, 0x28, 0x92, 0x7a, 0xc5, 0xfb, 0x71, 0x13, 0x2a, 0xd9, 0xd0, 0xc4, 0x63, 0xcf, 0xcd, 0x8f, 0x28, 0x4f, 0xef, 0x35, 0x04, + 0x62, 0x5d, 0x84, 0xda, 0x42, 0xfc, 0x65, 0x69, 0x81, 0x32, 0x2c, 0x06, 0xda, 0x92, 0x50, 0xd8, 0x90, 0x68, 0x8d, 0x42, 0xa4, 0xa5, 0xb3, 0x73, 0xc9, 0x00, 0x68, 0x67, 0x9b, 0x64, 0x97, 0x8d, + 0xa7, 0xd3, 0xb2, 0x5d, 0x45, 0x13, 0x8e, 0x0d, 0xbf, 0x70, 0xed, 0x7c, 0xe4, 0x92, 0x79, 0x1f, 0xfd, 0x5b, 0xc8, 0xf9, 0xfd, 0xc3, 0xd8, 0x33, 0x75, 0x55, 0x5e, 0x08, 0xbe, 0x20, 0x9b, 0xe4, + 0xd6, 0x0c, 0x9b, 0x56, 0x3d, 0x45, 0x68, 0x69, 0x62, 0xcd, 0x8f, 0xe2, 0xc1, 0x72, 0xfd, 0x35, 0x9f, 0xe9, 0xe2, 0x52, 0x51, 0xbc, 0xfd, 0x2e, 0x2c, 0x4f, 0xfe, 0x02, 0xd0, 0x3a, 0x4e, 0xdd, + 0x9a, 0x92, 0x27, 0x9d, 0x74, 0x70, 0xef, 0x66, 0x3d, 0xdf, 0xb6, 0x3b, 0x56, 0x44, 0x14, 0x64, 0x5e, 0x93, 0x92, 0x2c, 0xee, 0x9a, 0x79, 0xc2, 0xf4, 0x9a, 0x2e, 0x1b, 0x69, 0xa1, 0x25, 0x0a, + 0xe3, 0x5e, 0xc8, 0x9d, 0xc3, 0x8e, 0xd4, 0xe1, 0x39, 0x99, 0xe3, 0xf3, 0x26, 0x78, 0x47, 0xb6, 0x08, 0x33, 0xef, 0xaa, 0xe4, 0xbc, 0x2f, 0x95, 0x7c, 0xac, 0x89, 0x05, 0x7f, 0x96, 0x0b, 0xbf, + 0x7b, 0x32, 0x7f, 0x78, 0xfc, 0x41, 0x62, 0xf9, 0xa2, 0xb1, 0xbc, 0x6e, 0x94, 0xe1, 0xd5, 0xef, 0x38, 0x4f, 0x9a, 0xfa, 0xa3, 0x06, 0xf7, 0xe1, 0x78, 0xfe, 0x48, 0x45, 0x70, 0x6f, 0x58, 0x97, + 0x4f, 0x59, 0x0f, 0x3f, 0xd0, 0x7d, 0x1b, 0xdd, 0xdb, 0xd5, 0x6c, 0x39, 0xcd, 0x66, 0x48, 0x0a, 0x3b, 0x5f, 0x96, 0x56, 0x6e, 0x11, 0xee, 0xf5, 0x4e, 0x44, 0xc8, 0x63, 0xb6, 0xed, 0x81, 0xe5, + 0x39, 0x3b, 0x35, 0x30, 0x43, 0xe9, 0xce, 0x68, 0x6d, 0xc5, 0xc5, 0xd2, 0x3d, 0x74, 0x50, 0x5b, 0x22, 0x23, 0x85, 0xb4, 0xc6, 0xc1, 0x1d, 0x5c, 0x07, 0xaa, 0x56, 0x44, 0x90, 0x59, 0xb6, 0x60, + 0x13, 0x73, 0xb9, 0xe4, 0x06, 0x6e, 0x79, 0x14, 0xa5, 0x32, 0xde, 0x8e, 0x0b, 0x53, 0x26, 0x8c, 0xfc, 0x39, 0x39, 0xff, 0x43, 0xa6, 0x85, 0x7f, 0x16, 0x8f, 0x19, 0xd3, 0x8d, 0xb9, 0x3d, 0xe2, + 0x42, 0xbf, 0x7f, 0x44, 0x0e, 0xcc, 0x17, 0x91, 0xe1, 0x85, 0x33, 0x42, 0xd3, 0xf2, 0xd9, 0x78, 0xb0, 0xd3, 0x0a, 0xe0, 0x59, 0x41, 0x05, 0x37, 0xc2, 0x8e, 0xb1, 0xba, 0xdf, 0x96, 0x6e, 0x10, + 0x59, 0x23, 0x47, 0x46, 0x9b, 0x62, 0x39, 0x3f, 0xb3, 0x62, 0xb1, 0xac, 0x4f, 0x85, 0xba, 0x3b, 0x2f, 0xf6, 0x0c, 0x63, 0xb0, 0xd0, 0x9c, 0xea, 0xad, 0xcd, 0xb1, 0xf6, 0xe6, 0x55, 0x48, 0xc2, + 0xb2, 0x7a, 0x72, 0x41, 0xc2, 0x36, 0xe9, 0xf4, 0x5c, 0xeb, 0xfa, 0xa8, 0xae, 0x77, 0x16, 0x25, 0x2f, 0xc6, 0x09, 0xfc, 0xe5, 0x11, 0xe3, 0x7f, 0x84, 0xd2, 0x87, 0x12, 0x9b, 0x8f, 0xd0, 0xfa, + 0xfd, 0xad, 0xf3, 0x03, 0xdd, 0x57, 0xd4, 0x5e, 0xaf, 0xa6, 0x3a, 0xac, 0x1c, 0x64, 0x4a, 0x86, 0x0f, 0x91, 0xc5, 0x53, 0x27, 0x0f, 0x85, 0x71, 0x6c, 0xbf, 0xb6, 0xd6, 0x63, 0xbb, 0xf7, 0xbd, + 0x3a, 0xde, 0x2c, 0x2f, 0x9b, 0x38, 0x5d, 0xe5, 0x44, 0x40, 0x1f, 0x0b, 0x72, 0x64, 0x03, 0x45, 0x48, 0xf6, 0x40, 0xd0, 0xe3, 0x8e, 0xb3, 0x50, 0xe4, 0x0a, 0x04, 0x65, 0xbf, 0x52, 0xf8, 0xce, + 0x5e, 0xa0, 0x10, 0xb6, 0x27, 0xe2, 0x70, 0xa9, 0xd7, 0xeb, 0x55, 0xc2, 0xc1, 0x9e, 0xf7, 0x4d, 0x76, 0xf8, 0xbc, 0xd1, 0xfd, 0xd1, 0xc9, 0xf2, 0x46, 0xf7, 0xb5, 0xfb, 0xaf, 0x57, 0x53, 0x27, + 0x4f, 0x82, 0x1c, 0x56, 0xcd, 0x06, 0xe5, 0x7c, 0x9a, 0xef, 0x4e, 0x34, 0x1b, 0x3b, 0xfa, 0x76, 0x1d, 0x06, 0x7a, 0x54, 0x2f, 0x8b, 0xa3, 0x68, 0xad, 0xfd, 0x05, 0x5a, 0xd6, 0x49, 0x9a, 0xc9, + 0x62, 0xa2, 0x58, 0x7e, 0x4a, 0xe1, 0x07, 0x61, 0x57, 0xb2, 0x7b, 0x4b, 0xd7, 0x37, 0x94, 0x6c, 0x65, 0xa2, 0xb9, 0x77, 0x7b, 0x8e, 0xad, 0x43, 0x51, 0xc0, 0x83, 0xd4, 0x3d, 0x46, 0xc7, 0x11, + 0x3e, 0x39, 0xc0, 0xdd, 0xee, 0x7f, 0xf6, 0x1b, 0xfe, 0x73, 0xbb, 0xf6, 0x17, 0xda, 0xaf, 0x30, 0x7c, 0xb8, 0x33, 0x75, 0x9f, 0x8e, 0x37, 0x91, 0x2d, 0xf3, 0x41, 0x96, 0x6c, 0xcf, 0x50, 0x3c, + 0xe4, 0xdb, 0x18, 0x13, 0x34, 0x56, 0x36, 0x3b, 0x66, 0xb9, 0x17, 0xac, 0xf9, 0x61, 0x54, 0xec, 0x65, 0x47, 0x50, 0x20, 0x1c, 0x08, 0x27, 0x01, 0x74, 0xbc, 0xcd, 0x31, 0xb2, 0x18, 0x89, 0x6d, + 0x7d, 0xc8, 0x41, 0x6d, 0x0f, 0x61, 0x2c, 0x57, 0x49, 0x6b, 0x85, 0x38, 0x5b, 0xd6, 0x19, 0xb9, 0x8c, 0x06, 0x7c, 0x72, 0x03, 0x02, 0x53, 0x27, 0x08, 0x50, 0xf7, 0x8b, 0xcb, 0xde, 0x5f, 0x45, + 0x6f, 0xc7, 0xd9, 0x3f, 0x08, 0xdf, 0x95, 0xe4, 0x0b, 0x6a, 0xd7, 0xc6, 0x54, 0xb0, 0xa4, 0xcd, 0xe1, 0x0c, 0xd6, 0xa6, 0x2a, 0x09, 0x46, 0xdd, 0xee, 0x8e, 0x3b, 0xd2, 0xa1, 0x56, 0x81, 0x5b, + 0xa5, 0xb9, 0x6f, 0x94, 0x75, 0xa3, 0xb5, 0x67, 0xb5, 0xda, 0x30, 0xc6, 0x29, 0x86, 0x65, 0x05, 0x30, 0xb3, 0xaa, 0xb8, 0x18, 0x70, 0xcb, 0x65, 0xf9, 0xc1, 0xc7, 0x76, 0x6b, 0x08, 0x50, 0x62, + 0x08, 0xe5, 0x21, 0x82, 0x14, 0x43, 0x1b, 0xa2, 0x9a, 0x0d, 0x6e, 0xad, 0x70, 0x1b, 0x4e, 0x97, 0x53, 0xf2, 0x07, 0xbc, 0x74, 0x65, 0x76, 0x35, 0xa7, 0x3e, 0x3e, 0xae, 0x3d, 0x85, 0xc3, 0x0f, + 0xba, 0x2f, 0x60, 0xfc, 0xb8, 0x9a, 0x1a, 0x5c, 0xb7, 0xa9, 0xbb, 0x72, 0x3b, 0x77, 0x1b, 0x6a, 0x34, 0xd7, 0x91, 0xee, 0x1e, 0x2f, 0x82, 0x9f, 0x0c, 0xd8, 0x16, 0xbc, 0xb4, 0x61, 0xa8, 0xe5, + 0x7b, 0x35, 0x6b, 0xd7, 0x0c, 0x6c, 0x40, 0x45, 0x42, 0x39, 0x9a, 0x6f, 0x0d, 0x51, 0x8b, 0x2c, 0x0a, 0xe6, 0x24, 0x5b, 0xc4, 0x98, 0xbb, 0x0c, 0x37, 0xd0, 0x03, 0x82, 0x00, 0xb4, 0x3a, 0x2c, + 0xd5, 0x9a, 0x50, 0x73, 0xe0, 0xa4, 0x1c, 0x6b, 0x41, 0x97, 0x27, 0x4c, 0x9f, 0xd7, 0xc0, 0xc2, 0xbf, 0xbe, 0x45, 0x95, 0x7d, 0x92, 0x32, 0xbe, 0x45, 0x5f, 0xb8, 0xf5, 0x7b, 0xe4, 0x45, 0xee, + 0xfd, 0xf5, 0xea, 0x70, 0xff, 0x59, 0x57, 0x5c, 0x9b, 0x75, 0x53, 0xb9, 0xef, 0xff, 0xff, 0x49, 0xa4, 0xff, 0x52, 0x41, 0xfd, 0xaf, 0x9f, 0x48, 0xee, 0xa1, 0x9d, 0x67, 0xed, 0x2c, 0x09, 0xeb, + 0xc7, 0xd1, 0x6b, 0x8b, 0xbf, 0xe1, 0xdf, 0x8f, 0x09, 0xfc, 0x41, 0x77, 0x3e, 0xfb, 0x70, 0x31, 0xbb, 0x91, 0xfb, 0xf5, 0x80, 0xb5, 0x08, 0xa7, 0x65, 0x06, 0x69, 0xb7, 0xd9, 0xd0, 0xc5, 0x27, + 0x65, 0x6d, 0xe4, 0xe9, 0x8e, 0xb4, 0xeb, 0xc4, 0xc5, 0x8e, 0x9a, 0xe6, 0xba, 0x8e, 0x70, 0x44, 0xa0, 0xae, 0x4b, 0xb0, 0x73, 0x32, 0xe4, 0x9a, 0xb0, 0x90, 0x42, 0xc2, 0x2c, 0x5b, 0xd9, 0xcd, + 0x78, 0x49, 0xcd, 0x5c, 0xe8, 0x64, 0x1f, 0xbb, 0x60, 0x75, 0x80, 0x98, 0xee, 0xb0, 0x83, 0x21, 0x6b, 0x7d, 0x71, 0x8a, 0x08, 0x9f, 0x4f, 0xc9, 0xe4, 0x55, 0x99, 0x9e, 0x5b, 0x7e, 0x08, 0xf8, + 0xf9, 0x9f, 0xff, 0xe3, 0x5f, 0xd7, 0x20, 0xfb, 0x7f, 0xfd, 0xf7, 0x7f, 0x3d, 0x50, 0x22, 0xff, 0x48, 0x0d, 0x77, 0x7f, 0xdd, 0x3f, 0x63, 0x12, 0x7d, 0xa5, 0xf9, 0x02, 0xdd, 0xad, 0x35, 0x35, + 0x32, 0xc2, 0xb1, 0x87, 0x4b, 0x40, 0xb7, 0x1a, 0xb4, 0x5a, 0xa0, 0x89, 0x66, 0xd8, 0xe7, 0xcb, 0xaa, 0x60, 0x81, 0x4d, 0xcd, 0x1d, 0xa5, 0xb3, 0xb3, 0xe3, 0x78, 0x74, 0x4e, 0x7b, 0xcb, 0xa8, + 0x82, 0xc7, 0xbc, 0x51, 0xaa, 0xcb, 0x16, 0xdb, 0xa1, 0xd5, 0xa6, 0x0f, 0xeb, 0xdd, 0x0a, 0xc0, 0x58, 0x9d, 0x85, 0x09, 0xd6, 0xd1, 0x84, 0x03, 0xe3, 0x34, 0xc4, 0x78, 0x58, 0x54, 0x9b, 0x2c, + 0x3f, 0x4b, 0xd9, 0xc5, 0xfc, 0xb6, 0x63, 0xbc, 0x06, 0x23, 0x5a, 0xc3, 0xcc, 0x71, 0x3d, 0xb3, 0x49, 0xfe, 0xac, 0x0b, 0xec, 0x37, 0xea, 0x2f, 0x30, 0x7c, 0xbd, 0x37, 0x45, 0x82, 0x80, 0x66, + 0x32, 0x57, 0xd4, 0x76, 0x6b, 0x6d, 0x73, 0x14, 0x27, 0x2f, 0x26, 0xc4, 0x2e, 0x73, 0xa7, 0x5c, 0x2c, 0x42, 0x97, 0xed, 0xe2, 0x5f, 0x33, 0xb3, 0x0f, 0xc7, 0x84, 0x47, 0x9d, 0xfb, 0xfd, 0x44, + 0xf4, 0x6f, 0x44, 0x5f, 0xfa, 0xf4, 0xda, 0xbc, 0x76, 0xe5, 0x17, 0x09, 0xe9, 0xa1, 0x99, 0x6c, 0x41, 0x11, 0xe7, 0x78, 0xd2, 0x41, 0xea, 0xf6, 0xed, 0x7e, 0xcd, 0xae, 0x19, 0x15, 0xf5, 0x55, + 0x15, 0xb2, 0xbc, 0xfb, 0x5d, 0xf9, 0xc5, 0x3c, 0x7f, 0x7c, 0x5a, 0xf9, 0x65, 0xbc, 0xeb, 0x07, 0xd6, 0xf5, 0x88, 0xc3, 0x3f, 0xc1, 0x2f, 0x5e, 0x89, 0x5e, 0x71, 0xb9, 0x35, 0xaf, 0xbc, 0x7d, + 0x02, 0xab, 0x88, 0xe7, 0xed, 0xd6, 0xd4, 0x16, 0x73, 0x3d, 0x31, 0x11, 0x75, 0x1c, 0xb8, 0x55, 0x7b, 0x92, 0x04, 0x4d, 0x77, 0x77, 0x4c, 0x7b, 0x11, 0xd8, 0x3a, 0xbb, 0x50, 0x4e, 0x33, 0x9e, + 0x98, 0x62, 0x2c, 0x24, 0x63, 0x24, 0xab, 0x98, 0xe5, 0x02, 0x03, 0x66, 0x81, 0x75, 0x46, 0x85, 0x32, 0x47, 0x8c, 0x5b, 0x39, 0xdf, 0x6d, 0x5c, 0xae, 0xd0, 0xd8, 0xde, 0x5c, 0x38, 0xba, 0x6b, + 0xec, 0xa4, 0x8b, 0xdb, 0x7d, 0x73, 0xe5, 0x0d, 0xbf, 0xc4, 0x26, 0xfe, 0x39, 0x31, 0xf1, 0x13, 0xe5, 0x6b, 0xff, 0x3f, 0x5c, 0x4f, 0x15, 0x15, 0x05, 0x90, 0xa6, 0xa0, 0xfd, 0x6a, 0x5e, 0x89, + 0x83, 0x91, 0x60, 0xf6, 0x2e, 0xc7, 0xf0, 0x6c, 0xe9, 0x1c, 0x31, 0x57, 0x91, 0xbb, 0xae, 0xd0, 0xc5, 0x50, 0x3b, 0x06, 0xa7, 0x91, 0xef, 0x8d, 0x33, 0xc9, 0x29, 0x0d, 0x85, 0xb7, 0x49, 0x76, + 0xdc, 0x0c, 0x87, 0xde, 0x29, 0xcf, 0xa7, 0x3c, 0xae, 0x50, 0x4d, 0x3c, 0x9c, 0xb3, 0x8d, 0x67, 0x8d, 0xe6, 0xd9, 0x59, 0xaa, 0x87, 0x28, 0xf0, 0x7d, 0x60, 0x4a, 0x48, 0xd4, 0x7d, 0x45, 0xc5, + 0xa7, 0x09, 0xf5, 0x50, 0xc1, 0x54, 0x85, 0x8e, 0x3b, 0xb3, 0x03, 0x33, 0xcb, 0xdc, 0x1f, 0xc1, 0x50, 0x0f, 0xcc, 0xf8, 0x61, 0x61, 0x3a, 0xce, 0x4f, 0x12, 0x4f, 0x43, 0x9f, 0x1c, 0x94, 0x26, + 0x43, 0xff, 0x46, 0xf5, 0x05, 0xf6, 0xb7, 0xf6, 0xec, 0x4a, 0xeb, 0xd7, 0x90, 0x83, 0xec, 0x6e, 0x8e, 0x82, 0x58, 0x9f, 0xf7, 0xf2, 0x29, 0x67, 0xb0, 0x6d, 0xc4, 0x43, 0x1b, 0x4f, 0xb6, 0x0e, + 0xb9, 0x02, 0x02, 0x56, 0x7d, 0x0a, 0xed, 0xa8, 0x92, 0x64, 0x55, 0x4a, 0x82, 0x79, 0x60, 0x0c, 0x31, 0x8f, 0xb3, 0x45, 0xca, 0x79, 0x58, 0xa3, 0x77, 0xa2, 0x8a, 0x1c, 0x01, 0x33, 0x36, 0xd0, + 0xe3, 0xbc, 0x83, 0x70, 0x23, 0xd1, 0x64, 0x86, 0xd2, 0xb5, 0x50, 0x57, 0x44, 0x01, 0xf9, 0xe6, 0x7a, 0xf3, 0x25, 0x4d, 0xc9, 0x23, 0xbd, 0xe6, 0xef, 0xcb, 0x54, 0x1f, 0x09, 0xdf, 0x82, 0x22, + 0xdf, 0x2f, 0xa7, 0xe4, 0xea, 0x79, 0x41, 0x00, 0xda, 0x45, 0x8b, 0x44, 0xe0, 0xc4, 0x64, 0xde, 0x53, 0xcb, 0x98, 0xa2, 0x33, 0x6c, 0x07, 0x58, 0x70, 0x5d, 0x8b, 0x1c, 0x6b, 0xe2, 0xd5, 0x18, + 0xac, 0x77, 0xa5, 0x46, 0x37, 0x9a, 0x44, 0xcf, 0x73, 0x17, 0x61, 0xf6, 0x87, 0xd3, 0x21, 0xb8, 0x04, 0xfe, 0xb6, 0x2a, 0x3a, 0x7f, 0xd8, 0x3a, 0x28, 0x27, 0x0c, 0x1d, 0xa5, 0x5c, 0xce, 0xad, + 0x1e, 0xda, 0x1b, 0x0c, 0x4e, 0x62, 0x9f, 0xce, 0x76, 0xcc, 0x04, 0x1f, 0xe2, 0xef, 0xca, 0xb3, 0x07, 0x9a, 0x94, 0x8f, 0xf5, 0x98, 0x1f, 0x2d, 0xd8, 0xdf, 0xd7, 0xa3, 0xbc, 0x53, 0xbd, 0xc1, + 0x76, 0x6b, 0x4f, 0x4d, 0x51, 0x0a, 0xee, 0xcf, 0x4b, 0x40, 0x16, 0x56, 0x52, 0xbc, 0x73, 0xc6, 0x88, 0x62, 0x09, 0xab, 0x21, 0x8f, 0xf6, 0x19, 0x07, 0x17, 0xb4, 0xd3, 0x60, 0x24, 0x28, 0xb9, + 0x35, 0x5a, 0x31, 0x21, 0xb2, 0x09, 0xd3, 0x35, 0x91, 0xb9, 0x68, 0xba, 0xa0, 0xb6, 0x92, 0xe1, 0x1d, 0x33, 0x80, 0x37, 0x42, 0xcd, 0xa2, 0xe2, 0xc5, 0x66, 0xa1, 0xa5, 0x8c, 0x47, 0x1b, 0xbb, + 0xb0, 0x38, 0x44, 0x44, 0xa1, 0xe1, 0x8e, 0xfc, 0x7d, 0x87, 0xfe, 0x9a, 0xac, 0xf2, 0x3e, 0xa7, 0x7e, 0x72, 0xde, 0x7c, 0x20, 0xfd, 0x06, 0xc1, 0xfb, 0x8d, 0xab, 0x91, 0x72, 0xc2, 0xdc, 0x31, + 0xb8, 0xf5, 0x51, 0x77, 0x2b, 0xb4, 0xa0, 0x07, 0x67, 0x68, 0xb6, 0xa1, 0x53, 0xb9, 0x98, 0x50, 0x31, 0x7d, 0x6d, 0xed, 0x30, 0xf5, 0xec, 0x2a, 0xeb, 0x7c, 0xf4, 0x8f, 0x73, 0x1f, 0x2b, 0x1d, + 0xb0, 0x57, 0xc2, 0x54, 0xe7, 0x93, 0xd6, 0x38, 0xae, 0xe7, 0x2c, 0xcc, 0xf9, 0xc6, 0x29, 0x52, 0x07, 0x0c, 0x5e, 0xee, 0x3c, 0x37, 0x39, 0xb8, 0x67, 0x7b, 0xcd, 0x11, 0x58, 0x9a, 0xd6, 0xc7, + 0xad, 0xf6, 0x9c, 0x2e, 0xe9, 0x5e, 0x56, 0xf7, 0x9f, 0x7a, 0x5f, 0xdc, 0xab, 0xe3, 0xfd, 0xe7, 0x0c, 0x0e, 0xdf, 0xa8, 0xbf, 0x62, 0xfc, 0xe9, 0xde, 0x54, 0xc3, 0x83, 0xa5, 0x39, 0x92, 0x1a, + 0xaf, 0x57, 0x94, 0xb2, 0x23, 0xed, 0x55, 0xec, 0x32, 0x50, 0x93, 0x75, 0xfb, 0xc3, 0xae, 0x30, 0x74, 0xd3, 0x5c, 0x9e, 0xdb, 0x66, 0xf0, 0xe5, 0x41, 0x9e, 0xdb, 0x70, 0xe2, 0x61, 0x10, 0x91, + 0x9e, 0x58, 0x83, 0x56, 0x96, 0x8a, 0x43, 0x1f, 0x93, 0xc2, 0x01, 0x21, 0x25, 0x22, 0x69, 0x3f, 0x55, 0xf1, 0xa3, 0x77, 0x31, 0x45, 0x20, 0x3d, 0x9a, 0x67, 0xd1, 0x29, 0xe7, 0xfc, 0x53, 0x4b, + 0xf4, 0xc1, 0xa9, 0xf9, 0xb3, 0xbb, 0xc6, 0x23, 0x11, 0xfa, 0x09, 0x81, 0xe2, 0x07, 0xdd, 0x1b, 0x7e, 0x6f, 0x57, 0x57, 0x51, 0x7a, 0x82, 0x58, 0x91, 0x55, 0x4d, 0x57, 0xf7, 0x86, 0xc7, 0x69, + 0x28, 0x26, 0x94, 0x43, 0x42, 0x1c, 0x56, 0x12, 0xd0, 0x14, 0xd9, 0x0a, 0x34, 0x40, 0xca, 0x2f, 0xba, 0xac, 0x2e, 0x64, 0x9c, 0x48, 0x21, 0x66, 0x7e, 0x3a, 0x6c, 0xc0, 0x91, 0xf7, 0x46, 0xef, + 0xc0, 0x9d, 0xe7, 0x84, 0x6a, 0xce, 0x51, 0xce, 0xa8, 0x22, 0xd0, 0xb4, 0x8b, 0x75, 0x44, 0x0a, 0x20, 0xbb, 0x81, 0xfa, 0x13, 0x6a, 0x38, 0x87, 0x84, 0x58, 0x7e, 0xb3, 0xd8, 0x7e, 0x8b, 0x18, + 0x7e, 0xc4, 0xa6, 0x9e, 0x42, 0xe0, 0x03, 0xe9, 0x1b, 0x08, 0x1f, 0x6e, 0x4c, 0x4d, 0xd2, 0x32, 0xb7, 0x16, 0xc6, 0xb9, 0xda, 0x62, 0xc6, 0x52, 0x3b, 0xd7, 0xbb, 0xbe, 0x9a, 0x07, 0x84, 0x8a, + 0x67, 0xad, 0x77, 0xf0, 0x65, 0x72, 0x60, 0x75, 0xa7, 0xde, 0xaa, 0xd2, 0xc1, 0xba, 0x0c, 0x68, 0x44, 0x42, 0xa1, 0x9d, 0xfa, 0x91, 0x87, 0xab, 0xab, 0xfc, 0xc4, 0xfa, 0xae, 0xbc, 0xe8, 0x86, + 0x65, 0xad, 0x9b, 0xa2, 0x2b, 0xe6, 0xcd, 0xb8, 0xe1, 0x48, 0xde, 0xca, 0x22, 0x62, 0x61, 0xc3, 0xc6, 0x77, 0x25, 0x54, 0x58, 0xbd, 0xac, 0xbf, 0x9f, 0x58, 0x32, 0x9e, 0xf3, 0xa4, 0xf8, 0x41, + 0xf6, 0xd6, 0xff, 0xd7, 0x8b, 0xa9, 0x9e, 0x14, 0xb2, 0xc5, 0x5a, 0x24, 0x1f, 0xf3, 0x28, 0x88, 0x9c, 0xc3, 0x45, 0xb4, 0x36, 0xda, 0x05, 0x71, 0x70, 0xcf, 0x7b, 0x2e, 0x5b, 0x0c, 0xdb, 0xae, + 0xb2, 0x46, 0xa3, 0xcb, 0xcb, 0x75, 0x3e, 0xac, 0xc3, 0xa6, 0xae, 0x78, 0x24, 0xdb, 0xeb, 0x8e, 0x25, 0x20, 0xe8, 0xe8, 0x05, 0xdb, 0x3d, 0x2a, 0xad, 0xe9, 0x42, 0x30, 0x76, 0x9b, 0x98, 0xae, + 0xb3, 0xcb, 0x72, 0x7f, 0xec, 0xd3, 0x36, 0x41, 0xa2, 0x2a, 0x9f, 0x92, 0x90, 0x28, 0xac, 0x66, 0xbe, 0x9b, 0xb9, 0xa5, 0x59, 0xe7, 0xe5, 0xec, 0x4d, 0x97, 0xfb, 0xb3, 0x53, 0xd6, 0x53, 0x7c, + 0xfc, 0xfb, 0x27, 0x6e, 0x28, 0x7d, 0xbf, 0x7f, 0x3b, 0x6e, 0x4d, 0x60, 0xeb, 0x51, 0xb5, 0x8e, 0x06, 0x22, 0x41, 0x86, 0x50, 0x5b, 0x4b, 0x80, 0x58, 0x69, 0x4e, 0x4a, 0x75, 0x6b, 0xd1, 0x16, + 0x7a, 0x53, 0x53, 0x0f, 0x55, 0xc1, 0x3a, 0x45, 0xb2, 0x51, 0xce, 0x3b, 0xa2, 0xbd, 0x40, 0xa1, 0xe1, 0xef, 0xdc, 0xd8, 0x5d, 0x81, 0x07, 0x08, 0xc5, 0x2e, 0x6e, 0x83, 0xa3, 0xf6, 0x28, 0x99, + 0xbd, 0xeb, 0x20, 0x97, 0xb9, 0x32, 0x36, 0x1d, 0x58, 0x75, 0x07, 0x30, 0x2c, 0x0f, 0xf8, 0x04, 0x39, 0xf4, 0x97, 0xc9, 0x0f, 0xbe, 0x71, 0x9d, 0x9f, 0xcc, 0xb5, 0xc5, 0x73, 0x72, 0xfc, 0x8d, + 0xe6, 0x2b, 0x84, 0x2f, 0xb3, 0x6c, 0x31, 0x4d, 0x76, 0xef, 0xdd, 0x44, 0x36, 0x07, 0x86, 0x41, 0x50, 0xc3, 0x5f, 0x63, 0x86, 0x1a, 0x24, 0x21, 0x56, 0xa8, 0xc8, 0x22, 0xe0, 0x2d, 0x3e, 0xc1, + 0x85, 0xa8, 0x5d, 0xb2, 0xe7, 0x34, 0xde, 0xd3, 0x8b, 0x80, 0x72, 0x68, 0xa4, 0x0e, 0xf0, 0x93, 0x17, 0x13, 0xad, 0x6e, 0x56, 0x07, 0x0e, 0x48, 0x35, 0x55, 0x30, 0x82, 0x4d, 0xec, 0x1b, 0x5e, + 0x1f, 0x1c, 0xe4, 0xac, 0xec, 0x8e, 0xe5, 0xc2, 0x4d, 0x64, 0xf9, 0xb9, 0x34, 0x48, 0x9f, 0x96, 0xe1, 0x5b, 0x10, 0xdd, 0x23, 0x04, 0xbf, 0xe6, 0x59, 0x79, 0x74, 0x1a, 0x7c, 0x4a, 0xc2, 0xfa, + 0x44, 0xfc, 0x86, 0xe9, 0xa7, 0x5b, 0xd7, 0xd3, 0xe1, 0x04, 0x79, 0xcb, 0xb9, 0xec, 0x5b, 0xb3, 0x3c, 0x98, 0x9d, 0x56, 0x6d, 0x2c, 0x9e, 0x76, 0xf7, 0x2a, 0x36, 0x92, 0x23, 0xbe, 0xab, 0xf7, + 0x84, 0xed, 0xc0, 0xb8, 0xde, 0x78, 0x4d, 0xb3, 0x19, 0x03, 0x70, 0x8b, 0x17, 0x3c, 0x13, 0xed, 0xb9, 0x4c, 0x07, 0x71, 0xba, 0xc5, 0x2a, 0x5d, 0x83, 0x9b, 0xcd, 0x52, 0x29, 0x24, 0xa1, 0x0b, + 0x5d, 0xd2, 0x15, 0xd6, 0xfd, 0x5a, 0x27, 0x55, 0xd5, 0x6b, 0x30, 0xc3, 0x50, 0xee, 0xb1, 0xaf, 0x5b, 0xc9, 0x9a, 0x07, 0x30, 0x60, 0x4f, 0xa9, 0x3d, 0xdf, 0xa9, 0xbe, 0xf6, 0xff, 0xda, 0xbe, + 0xba, 0x18, 0x4f, 0x58, 0x89, 0x0b, 0x68, 0x15, 0x7a, 0xb1, 0x8f, 0xba, 0xf8, 0x69, 0x48, 0xe4, 0xc2, 0xa9, 0x4f, 0x85, 0x7b, 0x38, 0x73, 0x97, 0x56, 0xa6, 0xd6, 0xe7, 0xf1, 0x54, 0xd7, 0x4c, + 0xbb, 0x3e, 0xd2, 0xd8, 0x02, 0x02, 0x8a, 0xcc, 0xc0, 0x49, 0xbe, 0x05, 0x41, 0x70, 0xc1, 0x1d, 0x0f, 0x0b, 0x44, 0x62, 0x45, 0x3a, 0x61, 0x09, 0x7b, 0xdb, 0xf2, 0x05, 0xca, 0x1b, 0xaa, 0xa1, + 0x50, 0x89, 0xb5, 0xd5, 0xf4, 0xbe, 0xcf, 0xa6, 0x28, 0x81, 0x7f, 0xfc, 0xd2, 0x5f, 0x6e, 0x6a, 0xbf, 0xef, 0x5e, 0xf9, 0x95, 0xf8, 0x27, 0x64, 0x3e, 0x6c, 0x6c, 0x13, 0xb2, 0x3a, 0x1d, 0x15, + 0x30, 0xd9, 0xcd, 0x33, 0x62, 0x59, 0x70, 0xb9, 0xc2, 0x36, 0x44, 0x0b, 0x51, 0x86, 0xb8, 0xe4, 0x28, 0xdb, 0x68, 0x78, 0xf9, 0xbc, 0x8f, 0xb9, 0x98, 0xdc, 0xc2, 0xce, 0xfe, 0xb2, 0x5a, 0x8c, + 0xf0, 0x36, 0x89, 0xb7, 0x0a, 0xef, 0x32, 0x28, 0x2e, 0x37, 0x4c, 0x43, 0xb1, 0x14, 0x3d, 0xd7, 0x36, 0x2e, 0x70, 0x60, 0x0c, 0xc0, 0x23, 0x28, 0x36, 0x3e, 0xac, 0x4f, 0x28, 0xc8, 0x87, 0xae, + 0x73, 0x6f, 0x83, 0xff, 0x9a, 0xd4, 0xe6, 0x8f, 0xa0, 0x70, 0x27, 0x99, 0xcd, 0xa4, 0x5e, 0xb7, 0x09, 0xab, 0x42, 0x98, 0xcc, 0x5f, 0x16, 0x8b, 0xbc, 0x6b, 0x97, 0xa4, 0x74, 0x44, 0x56, 0x17, + 0xd0, 0x92, 0xc4, 0xb5, 0x85, 0x03, 0xf1, 0x06, 0x51, 0x58, 0x03, 0xf6, 0x42, 0x83, 0x17, 0xd4, 0x7a, 0xac, 0xf5, 0xf5, 0x32, 0x04, 0x57, 0xe3, 0xca, 0xe8, 0x37, 0x74, 0x27, 0x2c, 0xf1, 0x0b, + 0x29, 0xa8, 0x75, 0xef, 0x50, 0xc7, 0xb3, 0x30, 0x3f, 0x2f, 0xa5, 0x30, 0x83, 0xba, 0x68, 0x75, 0xd9, 0xe8, 0xcf, 0x19, 0xea, 0x3f, 0x2b, 0x06, 0x1e, 0x71, 0x99, 0xfb, 0x99, 0x98, 0xfe, 0xe8, + 0x69, 0xee, 0xce, 0x27, 0x6e, 0xc8, 0xde, 0x79, 0x30, 0xf5, 0x9c, 0x57, 0x5d, 0x78, 0x58, 0xa1, 0x1b, 0x68, 0x0e, 0x0e, 0x68, 0xd3, 0x6a, 0x83, 0x5c, 0xaf, 0x84, 0x71, 0x08, 0xc8, 0x68, 0x25, + 0x27, 0x8c, 0xed, 0x6e, 0x72, 0x8e, 0xdd, 0xab, 0xb8, 0x4a, 0xac, 0x15, 0xc2, 0x6e, 0x43, 0x7b, 0x2e, 0x39, 0x95, 0x01, 0xc6, 0x6b, 0x85, 0x40, 0x98, 0xf5, 0x80, 0xec, 0x94, 0xf5, 0xc6, 0xd8, + 0x85, 0xcc, 0x1c, 0xe9, 0x00, 0x92, 0x99, 0x2b, 0x92, 0x25, 0x32, 0xbc, 0x13, 0x4c, 0xd8, 0x08, 0x7f, 0x47, 0xf0, 0xfe, 0x45, 0x84, 0x32, 0xf8, 0x84, 0xeb, 0xc8, 0x3b, 0xd5, 0x57, 0x00, 0xdf, + 0x62, 0x92, 0xc1, 0x29, 0x4e, 0x24, 0xf5, 0x1a, 0x56, 0xb4, 0x31, 0x6c, 0x23, 0x17, 0xcd, 0x3d, 0x51, 0xc5, 0x12, 0x18, 0xb1, 0x23, 0x5a, 0xe0, 0x4c, 0x90, 0xf0, 0x2d, 0xac, 0x4f, 0xc8, 0xcb, + 0x16, 0x8d, 0xb6, 0x4b, 0x37, 0x42, 0x1b, 0xf1, 0x8c, 0xc0, 0xa7, 0x44, 0x15, 0x11, 0x9e, 0x15, 0x43, 0xbf, 0x36, 0xb7, 0x2e, 0xc3, 0x37, 0x84, 0x97, 0x07, 0xb6, 0x7d, 0xd4, 0xdb, 0x5d, 0x68, + 0x70, 0x9e, 0x20, 0x64, 0x82, 0xae, 0xd4, 0x13, 0x0e, 0x2b, 0xbf, 0x2f, 0x3c, 0xbc, 0x67, 0xf0, 0xf9, 0xa3, 0xe2, 0xfa, 0x8d, 0xea, 0x2b, 0x72, 0x37, 0x97, 0xa6, 0x89, 0x42, 0xfa, 0x6a, 0xbe, + 0x12, 0xa9, 0x0b, 0xab, 0x66, 0xad, 0x63, 0xf7, 0x97, 0x1d, 0x79, 0xec, 0x07, 0x21, 0x58, 0xb4, 0x90, 0xa2, 0xac, 0x85, 0x15, 0x53, 0xf8, 0xb4, 0x09, 0xaa, 0xba, 0x5f, 0xb0, 0xf4, 0x86, 0xab, + 0x46, 0xbb, 0x14, 0x6d, 0xcf, 0xf3, 0x97, 0x4d, 0xd0, 0xc9, 0xbe, 0xb8, 0x3a, 0xd0, 0xb0, 0xaa, 0xf6, 0xe9, 0x05, 0x0d, 0xab, 0xb0, 0x1a, 0x71, 0xac, 0x1e, 0x4f, 0x20, 0x54, 0x37, 0xdb, 0x60, + 0x22, 0x72, 0x13, 0xcd, 0xa3, 0x61, 0xf5, 0xb1, 0x90, 0xe4, 0x4f, 0x4e, 0xcc, 0xbf, 0x5f, 0xe6, 0xe0, 0x33, 0xe9, 0x1b, 0x7e, 0x1f, 0x6e, 0x5c, 0xcf, 0xca, 0x13, 0x8a, 0x1c, 0x30, 0x17, 0x66, + 0x01, 0x9d, 0x78, 0xe3, 0x02, 0x7b, 0x7e, 0xbd, 0x3d, 0xe1, 0x2a, 0x73, 0xde, 0x9c, 0xf7, 0x01, 0x75, 0xde, 0x36, 0x3a, 0x42, 0x66, 0x22, 0x22, 0x21, 0x28, 0x8b, 0xef, 0x59, 0x4d, 0xe9, 0xe5, + 0xfe, 0xe8, 0xc7, 0x73, 0x07, 0xc0, 0xf8, 0x28, 0xed, 0xb6, 0x70, 0x9b, 0xc3, 0xa9, 0x9e, 0x6a, 0x2c, 0xae, 0xe8, 0x06, 0xdb, 0x80, 0x17, 0x06, 0xb7, 0xce, 0xe2, 0xd2, 0x5f, 0x87, 0x55, 0x34, + 0x61, 0xc9, 0x3e, 0xac, 0xf2, 0x79, 0xc3, 0xf3, 0xc7, 0xf6, 0xf0, 0x6b, 0xbf, 0xb1, 0xcf, 0x49, 0x14, 0xaf, 0xca, 0x58, 0xfc, 0x33, 0x81, 0x1f, 0x31, 0x0f, 0x37, 0x15, 0xc7, 0xa7, 0x87, 0xbf, + 0xbf, 0x10, 0x7e, 0x24, 0xb7, 0xfb, 0xa3, 0x1c, 0xf9, 0x95, 0xec, 0x6d, 0x28, 0x5f, 0x2f, 0xa6, 0x72, 0xde, 0x8b, 0x5d, 0x57, 0xcd, 0xc1, 0x48, 0x77, 0x12, 0x08, 0xb4, 0xb2, 0xcc, 0x79, 0xf9, + 0xb9, 0x1d, 0x36, 0x2e, 0x0c, 0x6c, 0xe5, 0x75, 0x9b, 0xa5, 0x06, 0xec, 0x8e, 0xa7, 0xa6, 0x80, 0x64, 0xaa, 0x72, 0x09, 0xa0, 0xee, 0x56, 0x2b, 0x37, 0x34, 0x13, 0x74, 0xbd, 0x0e, 0x11, 0xde, + 0x86, 0xd9, 0x8d, 0xed, 0xa1, 0xc0, 0x65, 0x84, 0x37, 0x94, 0x98, 0x45, 0x5a, 0x15, 0xe3, 0x7d, 0xc0, 0xca, 0xa6, 0x38, 0xc1, 0xd6, 0x3b, 0x99, 0xf3, 0xfe, 0x48, 0x0d, 0x74, 0xff, 0xf0, 0xf1, + 0x8c, 0x56, 0xee, 0x95, 0xe6, 0x7c, 0xf6, 0xd6, 0x9a, 0x2d, 0xa6, 0xe9, 0xe1, 0xba, 0xa2, 0x37, 0x2a, 0x82, 0xcf, 0x7b, 0xc3, 0xdc, 0xaf, 0xe5, 0xfd, 0x76, 0x67, 0x9c, 0x06, 0x7a, 0x6d, 0xea, + 0x45, 0x02, 0x6e, 0x58, 0x99, 0x04, 0x36, 0x14, 0x61, 0xee, 0xc3, 0xc1, 0x4d, 0xd9, 0x80, 0xeb, 0xe2, 0x5e, 0xf2, 0x51, 0x24, 0x58, 0x9c, 0x20, 0x76, 0xef, 0x2b, 0x5b, 0xa6, 0x38, 0x5d, 0x44, + 0x9a, 0x3f, 0xda, 0x69, 0xaa, 0x1f, 0x1a, 0xbf, 0x3c, 0x46, 0xfb, 0x84, 0xaa, 0xd5, 0xf6, 0x38, 0x65, 0xd2, 0xff, 0x28, 0x6c, 0xfd, 0x16, 0x16, 0xfd, 0x00, 0xac, 0x8f, 0xd5, 0x59, 0x1e, 0x4d, + 0xb2, 0x67, 0x00, 0x7b, 0xa7, 0x7b, 0x05, 0xed, 0xfd, 0x6a, 0xaa, 0x93, 0x85, 0x1c, 0x8a, 0xed, 0x1c, 0x3f, 0x17, 0x46, 0xa3, 0x5a, 0xed, 0x41, 0xe6, 0xea, 0x13, 0xad, 0xe0, 0xc1, 0xda, 0x2b, + 0x0d, 0xd5, 0x9f, 0xa7, 0xcc, 0x3c, 0x3b, 0xcf, 0xad, 0x45, 0x0e, 0xae, 0x74, 0x4b, 0xee, 0x1b, 0x48, 0xd9, 0x49, 0xe2, 0xc1, 0xe9, 0x58, 0x61, 0xb5, 0x1b, 0x0e, 0x92, 0x06, 0x9c, 0x77, 0xa2, + 0xb0, 0x6c, 0xcb, 0x83, 0x86, 0x84, 0xf8, 0xa5, 0xbe, 0x6c, 0x86, 0xc0, 0x11, 0x65, 0x65, 0x8a, 0x4b, 0xc1, 0x97, 0x2a, 0x9c, 0x7f, 0xfd, 0x43, 0x3c, 0x5e, 0xa0, 0xb7, 0x80, 0x70, 0x3b, 0x70, + 0x53, 0x73, 0x56, 0x97, 0xe6, 0x0b, 0x68, 0x7f, 0x36, 0xa7, 0xd3, 0xbd, 0x0f, 0xbc, 0xc1, 0xf9, 0xe5, 0xf6, 0x54, 0x5c, 0x79, 0x0e, 0x9f, 0x8b, 0x44, 0x86, 0x68, 0x91, 0x16, 0xec, 0x8c, 0x0c, + 0x4a, 0x0e, 0x41, 0xbc, 0x31, 0xc9, 0xd5, 0x49, 0x50, 0x8e, 0x92, 0x16, 0xa9, 0xc1, 0x79, 0x41, 0x91, 0xf3, 0x63, 0x26, 0xb4, 0x78, 0xdf, 0xfa, 0x97, 0xfa, 0x52, 0x90, 0x1a, 0xb1, 0x13, 0x16, + 0xe9, 0x51, 0xea, 0xe5, 0x1e, 0x3a, 0x26, 0xf9, 0xa2, 0xbe, 0x8c, 0xee, 0xc5, 0x02, 0x2b, 0x21, 0x29, 0x1b, 0x53, 0x18, 0x10, 0xa7, 0xf9, 0x66, 0x56, 0xb9, 0x13, 0xe5, 0x7e, 0x0f, 0x95, 0xe5, + 0xe7, 0x3c, 0x33, 0x53, 0x61, 0xf9, 0x4a, 0x7d, 0x3e, 0xfb, 0x76, 0x6b, 0x76, 0x23, 0xfd, 0x6b, 0x3c, 0x0c, 0x05, 0xa6, 0x89, 0x6d, 0x4a, 0xda, 0x82, 0x62, 0x37, 0xc9, 0xe9, 0xe4, 0x30, 0xc4, + 0x7c, 0x2c, 0x07, 0x37, 0x42, 0x33, 0xfc, 0x34, 0x9e, 0x00, 0x8f, 0xdf, 0x3a, 0x7c, 0x9d, 0xa2, 0x32, 0x5d, 0x2c, 0x39, 0x8e, 0x2b, 0x98, 0x72, 0xbf, 0x8f, 0x5b, 0xd2, 0x59, 0x23, 0x36, 0xea, + 0xe0, 0x0e, 0x6c, 0x07, 0x6b, 0x22, 0x04, 0xcc, 0xf9, 0xdc, 0x91, 0x89, 0x95, 0x6a, 0xd4, 0x61, 0x15, 0x67, 0x53, 0x2a, 0x2a, 0xd9, 0x6f, 0xb5, 0x40, 0xfe, 0xfa, 0x07, 0xfc, 0x1a, 0x40, 0x7f, + 0x3f, 0xc4, 0xff, 0x6b, 0x38, 0xa3, 0x5b, 0xcf, 0x6e, 0x44, 0x6e, 0x11, 0xcd, 0x6f, 0x91, 0xfe, 0x8b, 0x47, 0x4b, 0x3d, 0xc9, 0xf3, 0xc2, 0x72, 0xb3, 0x9f, 0x94, 0x1b, 0x7e, 0x26, 0x6c, 0xe7, + 0x9d, 0xea, 0xcb, 0x20, 0xbc, 0xb5, 0xaf, 0x4a, 0xe0, 0x09, 0xe0, 0x7b, 0x35, 0x2c, 0xa6, 0x8d, 0x91, 0xd1, 0x1d, 0x40, 0xef, 0x25, 0xef, 0xb4, 0x4c, 0x8b, 0xb5, 0xda, 0x38, 0x6b, 0xea, 0x38, + 0x26, 0xc5, 0x2e, 0x0d, 0xb0, 0x54, 0xc1, 0x04, 0x5b, 0xdc, 0xa6, 0xae, 0x57, 0xb1, 0x89, 0x8a, 0xaf, 0x62, 0x50, 0x41, 0xb3, 0x72, 0xb5, 0x72, 0xec, 0x4e, 0xdf, 0x00, 0x23, 0x31, 0xda, 0xa0, + 0x7c, 0xa6, 0xc6, 0xad, 0x41, 0x42, 0x1b, 0xc8, 0x57, 0x3c, 0xc6, 0x68, 0xf6, 0x13, 0xdc, 0x37, 0xfb, 0xfa, 0x2d, 0x35, 0xeb, 0x4f, 0x9c, 0x5b, 0x93, 0xb2, 0x99, 0xd9, 0xa6, 0x1d, 0x3c, 0x5a, + 0xd2, 0xe8, 0x53, 0x4b, 0xfa, 0x9d, 0xea, 0x0b, 0x5e, 0x6f, 0xed, 0x6b, 0xf9, 0xc6, 0x09, 0x78, 0xed, 0x73, 0xd4, 0xd9, 0x83, 0x8b, 0x55, 0x2a, 0x47, 0xcd, 0x98, 0x75, 0x7b, 0x59, 0x46, 0x0a, + 0xc5, 0x55, 0x53, 0x67, 0xce, 0x80, 0x9e, 0x77, 0x4a, 0x62, 0x4d, 0xf3, 0x3b, 0x23, 0x04, 0xdc, 0x0b, 0xa4, 0xac, 0xd2, 0x8b, 0xd4, 0xad, 0x02, 0xc0, 0x3d, 0x54, 0xba, 0xa0, 0xaf, 0x3a, 0x9d, + 0x20, 0xa0, 0x10, 0xde, 0x98, 0xc1, 0x22, 0x80, 0xa8, 0x35, 0xb7, 0xea, 0x17, 0x97, 0x53, 0xb0, 0xb5, 0xaa, 0x70, 0xc2, 0x64, 0x1d, 0xcc, 0x24, 0x09, 0x5f, 0x73, 0x55, 0x2c, 0x1e, 0xf3, 0xc3, + 0xd4, 0xad, 0x83, 0xdc, 0xf9, 0x99, 0x1d, 0xf5, 0xf7, 0xa5, 0x95, 0x57, 0x9a, 0xf3, 0xd9, 0x5b, 0x6b, 0x6a, 0x06, 0xa6, 0xd0, 0x4e, 0x48, 0xc6, 0xe5, 0x2f, 0x7c, 0x8a, 0xe2, 0xe3, 0xa6, 0xce, + 0x0c, 0xd0, 0x05, 0xa0, 0x03, 0x3c, 0x28, 0x3b, 0xa7, 0x1d, 0xf9, 0xdc, 0x6c, 0x58, 0x65, 0xa1, 0x52, 0x24, 0x72, 0x6e, 0x99, 0x79, 0x2b, 0x6e, 0x42, 0x77, 0x83, 0x5d, 0xbc, 0x63, 0xd2, 0x29, + 0x86, 0x02, 0xd0, 0x24, 0x21, 0x12, 0x96, 0xa8, 0xed, 0x64, 0x02, 0x6c, 0x92, 0x3e, 0x57, 0xf2, 0x15, 0x03, 0x23, 0xd5, 0x19, 0x9e, 0x52, 0xe9, 0x25, 0xfd, 0x59, 0x32, 0x49, 0xf4, 0x89, 0x29, + 0x93, 0xde, 0x32, 0x48, 0xa6, 0xb7, 0xb4, 0x91, 0xe8, 0x94, 0x89, 0xa2, 0xc8, 0x62, 0xcc, 0xb9, 0xeb, 0x13, 0x02, 0x95, 0x02, 0x17, 0x9a, 0x65, 0x45, 0xf1, 0x3b, 0xc6, 0x60, 0x0f, 0x5b, 0xbf, + 0x65, 0xed, 0xf9, 0xa1, 0x8c, 0x72, 0x8f, 0xcc, 0xa8, 0x44, 0xa8, 0x6b, 0x6f, 0x69, 0x46, 0xc7, 0xf6, 0x12, 0x1e, 0x49, 0x5c, 0xaa, 0xdc, 0xcc, 0xb2, 0xf3, 0xdc, 0xae, 0x59, 0xd4, 0x41, 0x4f, + 0x15, 0x6a, 0x5e, 0x0c, 0x8d, 0x22, 0x01, 0xcd, 0x8a, 0xd9, 0x3a, 0x08, 0xa5, 0x29, 0xda, 0xa9, 0xeb, 0x8f, 0x74, 0x1e, 0x69, 0x7e, 0xa1, 0xbf, 0x97, 0xcf, 0xf0, 0x98, 0x57, 0xa2, 0x6f, 0x18, + 0x38, 0xd6, 0xec, 0x46, 0xe8, 0xd7, 0x38, 0x54, 0xa2, 0xb2, 0x68, 0xce, 0x98, 0xa3, 0x27, 0x6d, 0xad, 0xee, 0xfb, 0xae, 0xeb, 0x19, 0x1a, 0x14, 0x9b, 0x30, 0x38, 0xf3, 0xe1, 0x1a, 0x3b, 0x0d, + 0xa4, 0x25, 0x2d, 0x65, 0xb5, 0xa7, 0x57, 0x14, 0x91, 0xfe, 0x3f, 0xd4, 0xbd, 0x47, 0x93, 0xa3, 0x4c, 0xd3, 0x2e, 0xbc, 0x7f, 0x7f, 0xc5, 0x1d, 0xb3, 0xe5, 0xd3, 0xe0, 0x84, 0xd1, 0x12, 0x01, + 0xf2, 0xc2, 0x23, 0xcc, 0xe2, 0xf9, 0x02, 0x2b, 0x40, 0x78, 0x23, 0x4c, 0xc4, 0xb9, 0x7f, 0xfb, 0x09, 0xa9, 0xbb, 0x67, 0x64, 0xa7, 0x35, 0x7a, 0x9f, 0xcd, 0x59, 0x4c, 0x74, 0x61, 0x26, 0x51, + 0x5d, 0xe5, 0xb2, 0xb2, 0x32, 0xf3, 0x52, 0x8d, 0x23, 0xbf, 0x2f, 0x33, 0x91, 0x6f, 0x0d, 0x51, 0xe4, 0xd7, 0xc2, 0x8a, 0xa4, 0x97, 0x36, 0x0b, 0xc0, 0xac, 0xb2, 0x8b, 0xf9, 0x6c, 0x0d, 0xab, + 0x34, 0x92, 0xaa, 0xe8, 0xde, 0x38, 0xbe, 0x8c, 0xc3, 0x57, 0x94, 0xeb, 0xe3, 0xae, 0x00, 0xff, 0x44, 0xff, 0xde, 0x34, 0xf5, 0x5b, 0xee, 0x17, 0x1a, 0xe7, 0x8b, 0xd1, 0x87, 0xb8, 0xef, 0x01, + 0x31, 0x19, 0x03, 0xb0, 0x85, 0x04, 0x1b, 0x14, 0x65, 0x06, 0x18, 0x39, 0x5d, 0x52, 0xea, 0x24, 0x5d, 0x43, 0xea, 0x7e, 0x49, 0x1b, 0x82, 0x02, 0x89, 0xb5, 0x02, 0x73, 0xa6, 0x36, 0x3b, 0x8e, + 0x2b, 0x00, 0x50, 0xb8, 0x83, 0xb3, 0xdf, 0x59, 0x0a, 0xb4, 0xc7, 0x81, 0xb1, 0x84, 0x34, 0xcb, 0xf1, 0x36, 0x12, 0xa3, 0xa1, 0xaf, 0x16, 0x53, 0x78, 0xe8, 0x1a, 0x6d, 0x83, 0x41, 0xc1, 0x60, + 0x79, 0x7a, 0xf8, 0xde, 0xb9, 0xf0, 0xef, 0xae, 0xf2, 0xd5, 0x2f, 0x1e, 0x4f, 0x2a, 0x17, 0x71, 0x21, 0x8f, 0x80, 0x7c, 0x8f, 0xf8, 0xf5, 0x97, 0xd4, 0x33, 0x8c, 0x9f, 0xe5, 0x57, 0x09, 0x60, + 0x57, 0x44, 0x8e, 0xa3, 0x81, 0x14, 0x52, 0x51, 0x0b, 0x73, 0x0c, 0xdb, 0xb6, 0xb0, 0x46, 0x84, 0x28, 0x01, 0x4c, 0xfb, 0x65, 0xc9, 0x6b, 0x3c, 0xa6, 0x8b, 0x22, 0x35, 0x98, 0xe8, 0x8e, 0x77, + 0x36, 0x90, 0xc0, 0xf5, 0x76, 0x9b, 0xfb, 0xc9, 0x0e, 0xe4, 0x20, 0x6c, 0x98, 0x51, 0x43, 0x2b, 0x4e, 0x54, 0xb9, 0x67, 0x1d, 0x1d, 0xaf, 0x51, 0x95, 0x07, 0xd6, 0x98, 0x55, 0x4c, 0x45, 0x7e, + 0xb9, 0x78, 0x0f, 0xc4, 0x7b, 0x62, 0xec, 0x0f, 0x17, 0x21, 0xe2, 0x0f, 0x60, 0x86, 0x4f, 0xf5, 0xb1, 0x53, 0xed, 0xff, 0xde, 0xe9, 0xee, 0x4b, 0xe8, 0x17, 0x94, 0x61, 0x55, 0x9f, 0x15, 0x80, + 0x6f, 0x9c, 0xee, 0xce, 0x48, 0x56, 0x51, 0x7a, 0x18, 0xdb, 0x2d, 0x6a, 0xac, 0x0a, 0x63, 0xb0, 0xdd, 0x7e, 0x1a, 0x72, 0x95, 0xa0, 0x2d, 0x04, 0x9f, 0x07, 0x00, 0x75, 0x3e, 0x27, 0xc6, 0x13, + 0xba, 0xab, 0xf0, 0xdc, 0xa3, 0x1b, 0x4c, 0xdf, 0x8f, 0xd3, 0xd2, 0x4b, 0x2d, 0x9c, 0xdf, 0x75, 0xbc, 0xd1, 0x95, 0xa2, 0x52, 0xb4, 0x2d, 0xb4, 0x4a, 0xda, 0x1a, 0x90, 0x3c, 0x9f, 0x2c, 0xf7, + 0xfb, 0x26, 0x39, 0x28, 0x9b, 0x61, 0xf2, 0xca, 0x09, 0x60, 0xf2, 0xa7, 0x71, 0xf9, 0x46, 0x77, 0x3a, 0x0f, 0xc7, 0x8f, 0x61, 0xf8, 0x42, 0x07, 0xaa, 0xe6, 0x07, 0xa1, 0x03, 0x76, 0xd1, 0xb6, + 0x4e, 0x28, 0x7c, 0xab, 0x23, 0x44, 0x46, 0x8d, 0x67, 0xd3, 0x19, 0xbb, 0x99, 0xd1, 0xa6, 0x39, 0x96, 0xc7, 0x7a, 0xe1, 0xcd, 0x79, 0x9d, 0x3e, 0xe2, 0x64, 0xad, 0x00, 0x91, 0x8d, 0x1e, 0x0f, + 0xa0, 0xd4, 0x5b, 0x6b, 0x4d, 0x80, 0x04, 0x65, 0xdd, 0x6b, 0x75, 0xb2, 0x91, 0xb7, 0x90, 0x0d, 0x58, 0xae, 0xaa, 0xb0, 0x47, 0xbb, 0x82, 0x05, 0xd6, 0x5a, 0x20, 0x77, 0xb6, 0xf1, 0xdb, 0x34, + 0xb8, 0x8f, 0x5b, 0x1c, 0x7d, 0xc3, 0x0c, 0x79, 0x25, 0x19, 0x1c, 0x5d, 0x5f, 0x9f, 0x59, 0x09, 0x5f, 0x30, 0x47, 0xfa, 0xc7, 0x54, 0x9f, 0xd4, 0xa6, 0x2d, 0x11, 0x9a, 0x4f, 0xcf, 0xb1, 0x29, + 0xd5, 0xa3, 0x3d, 0x0f, 0xa6, 0xf4, 0xa6, 0x8f, 0x76, 0x1a, 0x83, 0x6f, 0xf7, 0x01, 0x5b, 0x40, 0x03, 0x36, 0x63, 0x7c, 0x0e, 0x30, 0xf5, 0x7c, 0xa3, 0x71, 0x4b, 0x65, 0xea, 0xda, 0xa1, 0xdf, + 0x89, 0x07, 0x11, 0xc1, 0x3c, 0xbb, 0x84, 0xf1, 0x39, 0xc4, 0x11, 0x9e, 0xa4, 0xad, 0xc2, 0x8a, 0x77, 0xb6, 0xec, 0x62, 0x8e, 0xde, 0x39, 0x16, 0x9e, 0x7e, 0x5a, 0xf2, 0xf4, 0x70, 0x17, 0x7d, + 0xcb, 0x85, 0xf6, 0x53, 0xe6, 0x67, 0xc5, 0x93, 0x2c, 0x3d, 0xb3, 0x97, 0xbf, 0x70, 0xe0, 0xbd, 0x9f, 0x50, 0x26, 0xb1, 0x48, 0x0e, 0x81, 0x78, 0x28, 0xf4, 0x83, 0xe4, 0x20, 0x50, 0x0b, 0x98, + 0xbe, 0x48, 0xa0, 0xce, 0x62, 0x63, 0xb3, 0x64, 0x90, 0x0a, 0x76, 0x6d, 0xcd, 0xec, 0x59, 0x4d, 0x37, 0x89, 0x59, 0x45, 0xfd, 0x36, 0x58, 0x1f, 0x26, 0x1b, 0x2b, 0x12, 0x21, 0x42, 0xc5, 0xd4, + 0x0e, 0x21, 0xe3, 0xe3, 0x2c, 0x32, 0x31, 0x9d, 0x58, 0x1c, 0x35, 0x09, 0xee, 0x06, 0x95, 0x8c, 0x16, 0xbb, 0xf7, 0x26, 0x8e, 0x0b, 0x0e, 0xe4, 0x8f, 0xe4, 0x6d, 0x57, 0x86, 0xae, 0x2f, 0xfa, + 0xb7, 0x8f, 0x9c, 0x6d, 0xd7, 0x94, 0x0b, 0x0f, 0xbc, 0x93, 0x7f, 0xdc, 0xe7, 0x61, 0xbf, 0x0d, 0xe7, 0xbb, 0xe1, 0x4b, 0xc8, 0xab, 0xba, 0xf4, 0xbc, 0x9f, 0xa5, 0x97, 0xf4, 0xbf, 0xe6, 0xac, + 0xab, 0x34, 0x11, 0x37, 0x09, 0xc6, 0x6e, 0x3c, 0x1b, 0x93, 0x3c, 0xf6, 0x46, 0x4d, 0x7e, 0xf6, 0xb7, 0x48, 0xb3, 0xdf, 0xae, 0xf8, 0x0f, 0xb6, 0x49, 0x4d, 0x9e, 0x67, 0x65, 0x5d, 0x8d, 0x9c, + 0x2c, 0xfe, 0x4c, 0x43, 0x87, 0xdd, 0x25, 0x2c, 0xcb, 0x9a, 0x8b, 0xdf, 0x79, 0xf5, 0xa8, 0x49, 0x5d, 0xcf, 0xaf, 0x2c, 0xff, 0xb7, 0x21, 0x05, 0xfb, 0x35, 0xb3, 0x5e, 0x80, 0xfe, 0x8c, 0x73, + 0xe1, 0x96, 0x46, 0xef, 0x9f, 0xbb, 0xfe, 0x77, 0x8d, 0xee, 0xeb, 0x7d, 0xf0, 0x9a, 0x4e, 0xef, 0x2c, 0xe7, 0xaa, 0xff, 0xfd, 0xf3, 0xac, 0x0f, 0xd2, 0xb3, 0x68, 0x30, 0x0c, 0x2a, 0x1c, 0x2b, + 0x81, 0x1f, 0x8a, 0xc7, 0x70, 0x28, 0x67, 0xa2, 0x77, 0x54, 0x14, 0x7d, 0x51, 0xa7, 0x74, 0xa1, 0xf9, 0x1e, 0xd1, 0xc1, 0x54, 0xb0, 0x67, 0x2b, 0x47, 0x19, 0x70, 0xd3, 0xde, 0xd8, 0x7e, 0xb6, + 0x91, 0x36, 0x42, 0xb3, 0x57, 0xc4, 0x7e, 0x5a, 0x07, 0xb8, 0x4f, 0x9a, 0xac, 0xb4, 0x53, 0xe5, 0x5e, 0x5b, 0xcc, 0x18, 0x90, 0xd0, 0x9a, 0x71, 0x0d, 0x5f, 0x71, 0x82, 0xfd, 0xf3, 0xb8, 0x1f, + 0xfe, 0xf3, 0xb4, 0x2f, 0xfe, 0xf3, 0x6b, 0x42, 0xbe, 0x39, 0x12, 0xff, 0xe7, 0xd7, 0xfa, 0xf5, 0xcf, 0x25, 0xde, 0x9f, 0x96, 0x54, 0x3f, 0xb6, 0xfe, 0x0c, 0xed, 0x75, 0x4f, 0x78, 0x1d, 0xda, + 0x2f, 0xe1, 0x9f, 0xe1, 0x54, 0xa7, 0xe2, 0x79, 0x80, 0x43, 0xdf, 0x03, 0x0c, 0x8f, 0x6a, 0x57, 0x52, 0x51, 0x7a, 0x6e, 0x96, 0xe1, 0x4a, 0x4b, 0x7c, 0x6e, 0xee, 0xc7, 0xd9, 0x82, 0x24, 0xe2, + 0x5d, 0x73, 0x84, 0x9e, 0x42, 0xf4, 0xb0, 0x8a, 0xc9, 0x2d, 0x48, 0x77, 0xda, 0xe3, 0x5b, 0x95, 0xbb, 0x5c, 0xa9, 0xd0, 0xef, 0x2b, 0x74, 0xea, 0x31, 0xf8, 0x2c, 0x1e, 0x1a, 0x5b, 0xd9, 0x98, + 0x73, 0x74, 0x85, 0x58, 0x20, 0xb7, 0xa3, 0xa9, 0xd8, 0x63, 0x83, 0x68, 0x28, 0xb0, 0xac, 0xdb, 0x2f, 0x7a, 0x8b, 0x56, 0x27, 0xbd, 0xa1, 0x1f, 0x9d, 0x4d, 0x75, 0xcc, 0x76, 0xd6, 0x62, 0x55, + 0x80, 0x15, 0xd6, 0xe9, 0x4b, 0x1c, 0xd4, 0x75, 0x01, 0xaf, 0x07, 0x42, 0x9a, 0x74, 0x14, 0x5f, 0x2f, 0x52, 0x99, 0x07, 0x6b, 0xbd, 0x9e, 0xa1, 0x9a, 0xa4, 0xc4, 0xd4, 0xf3, 0x1e, 0xf3, 0x10, + 0x8e, 0xbb, 0x71, 0xfc, 0x0c, 0x9a, 0xdb, 0xd1, 0xfd, 0x3a, 0x34, 0xd7, 0x9f, 0x00, 0x47, 0x37, 0x37, 0x46, 0xd8, 0x5d, 0xce, 0xc0, 0x7f, 0x9e, 0x41, 0x26, 0x46, 0xbb, 0xa8, 0x75, 0xf5, 0x65, + 0x3d, 0x86, 0xc8, 0xed, 0x32, 0xa4, 0x0a, 0x5a, 0x1f, 0x67, 0xea, 0xba, 0xda, 0xab, 0x08, 0x5b, 0x50, 0xf3, 0xa1, 0x42, 0x84, 0xfc, 0x90, 0x8c, 0x2d, 0xd1, 0xb0, 0xa3, 0x04, 0x30, 0x59, 0x8d, + 0x75, 0xb4, 0xb1, 0xec, 0xcf, 0x38, 0xa5, 0x1c, 0x37, 0x5b, 0xce, 0x4c, 0x2c, 0xc8, 0xeb, 0xc7, 0x3e, 0x16, 0xef, 0x37, 0xe5, 0x61, 0x0a, 0x59, 0x3a, 0x24, 0x6e, 0xaf, 0x42, 0x79, 0xff, 0x79, + 0x6b, 0x90, 0x5d, 0x0c, 0x9b, 0x8f, 0x10, 0xeb, 0xbf, 0x22, 0x2f, 0x49, 0xb3, 0xfc, 0x8f, 0xa1, 0x28, 0x7f, 0xbf, 0xb1, 0x3b, 0x49, 0x3c, 0xaf, 0xa2, 0x79, 0xfd, 0x92, 0x0b, 0x14, 0x3c, 0xb2, + 0x5d, 0x28, 0x38, 0xca, 0x59, 0x27, 0xea, 0x8d, 0xec, 0xa4, 0xe8, 0x2e, 0xf0, 0xc3, 0x84, 0x44, 0x8d, 0x25, 0x0e, 0x8c, 0xdf, 0x59, 0x05, 0x2d, 0xdb, 0x2e, 0xcf, 0xef, 0x3e, 0x8b, 0xc6, 0xb8, + 0x63, 0x95, 0x7f, 0xa6, 0x45, 0xbc, 0x53, 0xf9, 0x4b, 0xd1, 0x67, 0x18, 0x2e, 0x6f, 0x3c, 0x98, 0x72, 0x1e, 0x8f, 0x4e, 0xcf, 0xac, 0xb0, 0x4d, 0x85, 0x6a, 0x35, 0x1d, 0x56, 0x0b, 0x2d, 0x9f, + 0xc8, 0xc8, 0x5c, 0xed, 0x49, 0xb7, 0x38, 0xe4, 0xf3, 0x70, 0x3c, 0xdd, 0xc9, 0x03, 0x3a, 0xb7, 0x8a, 0x90, 0xc5, 0xbd, 0xa1, 0xb1, 0x21, 0x0c, 0x46, 0x58, 0x79, 0xa8, 0x75, 0xb5, 0x55, 0xa7, + 0x38, 0x8d, 0x2f, 0xd7, 0xb6, 0x78, 0x30, 0x10, 0x21, 0xb5, 0xc1, 0x84, 0x19, 0x6b, 0x46, 0x16, 0xd1, 0x52, 0xeb, 0xb4, 0x9b, 0x57, 0x12, 0x01, 0xdf, 0x71, 0x2b, 0x3d, 0x31, 0xfa, 0xbc, 0xb3, + 0xe3, 0xbf, 0x96, 0x0d, 0x8e, 0x6e, 0x6e, 0x8c, 0x3e, 0xc4, 0x7e, 0x0f, 0xce, 0x22, 0x43, 0x06, 0x12, 0xb2, 0x77, 0xcb, 0xe3, 0x2a, 0xce, 0x16, 0x80, 0x31, 0x48, 0x49, 0x6e, 0xee, 0x44, 0x8f, + 0x24, 0x80, 0x82, 0x92, 0x93, 0xa9, 0xba, 0x36, 0x19, 0x6d, 0xdf, 0x4d, 0x9c, 0x06, 0x58, 0x33, 0xa5, 0x8e, 0x98, 0xcc, 0x02, 0x44, 0xeb, 0x6d, 0x0f, 0xec, 0x75, 0xdb, 0x64, 0x95, 0xdd, 0xbc, + 0x42, 0xb6, 0xa4, 0xe1, 0x76, 0xbc, 0xcd, 0x07, 0x84, 0x4e, 0xd5, 0x61, 0x32, 0x31, 0xa0, 0x3b, 0x6b, 0xf7, 0x25, 0x0f, 0xe9, 0x33, 0xcb, 0xd7, 0xdf, 0x6f, 0xf5, 0x7f, 0x49, 0xbd, 0xa8, 0xfe, + 0x87, 0xf5, 0xeb, 0x85, 0x7d, 0x3e, 0xea, 0xf4, 0x4c, 0xd5, 0x2f, 0xf6, 0x75, 0x12, 0x12, 0x4b, 0x82, 0xf1, 0x65, 0x79, 0x89, 0x6c, 0x98, 0x1c, 0x97, 0xd7, 0x48, 0xdc, 0x1e, 0x6b, 0x7b, 0x0f, + 0xe5, 0x90, 0x04, 0x7b, 0x90, 0x74, 0x54, 0x8a, 0x19, 0xe6, 0x78, 0xf3, 0x0e, 0x58, 0x23, 0xae, 0x2f, 0x47, 0x09, 0x6c, 0xaf, 0x99, 0xed, 0x8e, 0x9e, 0xb1, 0x0c, 0x25, 0x1e, 0x7b, 0x20, 0x23, + 0x1d, 0xdc, 0x22, 0x76, 0x4d, 0xc4, 0xbb, 0xee, 0x9b, 0x9a, 0xe6, 0x9f, 0xcf, 0x54, 0x1f, 0xd1, 0xa9, 0xfe, 0xf8, 0x53, 0x5a, 0xb9, 0x6b, 0xba, 0xae, 0x67, 0x78, 0xff, 0xbd, 0x56, 0x7f, 0x21, + 0xf7, 0x37, 0xe2, 0xa7, 0xab, 0x57, 0x9d, 0xc1, 0xb9, 0x86, 0x62, 0x65, 0x95, 0x57, 0xb7, 0x65, 0xbc, 0xd4, 0x79, 0x7f, 0xb1, 0x1e, 0x18, 0xdc, 0xce, 0x85, 0x06, 0xad, 0x8d, 0x1a, 0xed, 0x8e, + 0x11, 0xe7, 0x4a, 0x4b, 0x11, 0x98, 0x79, 0x0a, 0x14, 0x73, 0xf6, 0x78, 0x4d, 0x6a, 0x12, 0x01, 0xd1, 0x16, 0xd3, 0x05, 0x0d, 0xb7, 0x6f, 0x64, 0x44, 0x9f, 0x03, 0xf3, 0xe8, 0xd0, 0x6f, 0x5b, + 0x7e, 0xa8, 0x38, 0xcc, 0x3c, 0xd4, 0xcb, 0xc4, 0x0f, 0x36, 0x77, 0xbe, 0x70, 0xb7, 0x64, 0x64, 0x8f, 0x00, 0x18, 0xbf, 0xb5, 0x89, 0xbd, 0x92, 0xfc, 0x0b, 0x82, 0xcf, 0xeb, 0xf3, 0x81, 0xe7, + 0x0b, 0x5b, 0xdb, 0xb0, 0x53, 0x90, 0x0d, 0xa6, 0x2c, 0xf4, 0x8a, 0xca, 0xfb, 0x50, 0x15, 0x8c, 0x75, 0xa2, 0x01, 0x08, 0xbb, 0xc8, 0x75, 0xdd, 0xc3, 0x96, 0x21, 0xba, 0x05, 0xfc, 0xb1, 0x07, + 0x58, 0xab, 0x19, 0xb5, 0xb0, 0x32, 0xcc, 0x4a, 0x66, 0x92, 0x86, 0xaf, 0x20, 0x9e, 0xc7, 0x1d, 0x70, 0xa3, 0x92, 0x53, 0x6f, 0x4c, 0x34, 0x35, 0xdd, 0x21, 0xf3, 0x0d, 0x39, 0x09, 0xba, 0xf9, + 0x14, 0xd7, 0xe5, 0x64, 0xdd, 0xbc, 0x70, 0x6e, 0xf7, 0x28, 0x68, 0xe5, 0xc5, 0x5e, 0x76, 0xf1, 0xda, 0xe3, 0xa4, 0x3c, 0x17, 0x2f, 0x3c, 0xe6, 0x8a, 0x7b, 0xdc, 0x4f, 0xd3, 0x91, 0xd7, 0x85, + 0xf5, 0x28, 0xf6, 0xac, 0xc3, 0xc8, 0x2f, 0xbd, 0x3f, 0x25, 0xb1, 0x7b, 0x63, 0x86, 0xbc, 0x95, 0x7e, 0x6a, 0xb0, 0xdb, 0x7b, 0xaf, 0x46, 0x8b, 0xec, 0x1a, 0xda, 0x32, 0x4d, 0x2a, 0x92, 0x3c, + 0x13, 0x3d, 0xaa, 0xed, 0x9e, 0x9f, 0x92, 0x9b, 0x8e, 0xca, 0xaa, 0x65, 0x53, 0x32, 0x21, 0xa5, 0x41, 0x15, 0x8c, 0x96, 0x4b, 0xd8, 0x68, 0x13, 0x4b, 0x00, 0x80, 0xe8, 0xe8, 0x74, 0x02, 0x41, + 0x50, 0x5a, 0x26, 0x1e, 0xbd, 0xd4, 0xf4, 0xec, 0x9c, 0xa6, 0x90, 0x84, 0xd4, 0x68, 0x18, 0x64, 0xb3, 0x4a, 0x30, 0x84, 0x6d, 0x94, 0x4a, 0x54, 0x0e, 0xde, 0xd9, 0x23, 0x3e, 0x83, 0x22, 0x1f, + 0x8f, 0xd8, 0xf1, 0x5b, 0x18, 0x38, 0x1f, 0xd5, 0x76, 0xbc, 0xd1, 0x59, 0xc2, 0x77, 0xda, 0x83, 0xc6, 0x54, 0x56, 0x8e, 0x6a, 0xda, 0x42, 0xad, 0x24, 0xbe, 0x9a, 0x4d, 0xd2, 0x19, 0x8d, 0x13, + 0x18, 0xaa, 0x5b, 0x13, 0xf6, 0x9d, 0x99, 0xed, 0xdb, 0x58, 0xce, 0xc7, 0x2c, 0x43, 0xcf, 0x2c, 0x6f, 0x7f, 0xef, 0x13, 0xfd, 0x40, 0xfe, 0x09, 0x8f, 0xfb, 0xbb, 0x67, 0x7b, 0xdc, 0x0b, 0xbe, + 0xd2, 0x36, 0xa1, 0x9b, 0x76, 0x12, 0x34, 0x51, 0x5a, 0x70, 0xd9, 0x1a, 0x32, 0x71, 0x4e, 0x18, 0x28, 0x30, 0x0d, 0x7c, 0x31, 0x65, 0x21, 0xd2, 0x54, 0x16, 0xf2, 0x30, 0x44, 0xca, 0xb6, 0xf5, + 0xf6, 0x36, 0xc6, 0x4d, 0xb2, 0x29, 0x45, 0x51, 0x79, 0x87, 0xfa, 0x93, 0x06, 0x91, 0x40, 0x1f, 0xdd, 0xcd, 0x2d, 0x8a, 0x56, 0xc4, 0x08, 0x17, 0x57, 0xe9, 0x5c, 0xf5, 0x75, 0x38, 0x9b, 0xd5, + 0x75, 0xe1, 0xbf, 0xe0, 0xe8, 0x74, 0x79, 0x36, 0xf9, 0xe3, 0x4f, 0xfc, 0x1f, 0x0f, 0x92, 0xfd, 0x3c, 0xd5, 0x47, 0xff, 0x1a, 0xce, 0x5b, 0xe1, 0xe0, 0xe8, 0xee, 0xd6, 0x6b, 0x81, 0xd1, 0x33, + 0xa8, 0x91, 0xad, 0x05, 0xb7, 0xe3, 0x04, 0x80, 0xf4, 0x2a, 0xac, 0x9c, 0x28, 0xb9, 0x95, 0x06, 0xb5, 0xa3, 0xc3, 0x2f, 0x64, 0xe4, 0x3b, 0x7f, 0xf2, 0x3b, 0x7e, 0xa8, 0xbf, 0xb7, 0xd9, 0xfd, + 0x16, 0xfb, 0x55, 0xad, 0xdf, 0x2c, 0x50, 0x2f, 0x58, 0xeb, 0x36, 0xcc, 0x6a, 0x10, 0x76, 0x2c, 0xcb, 0x0a, 0x12, 0xd0, 0x8f, 0xc9, 0x61, 0x82, 0x52, 0x10, 0xeb, 0x42, 0xbd, 0x6e, 0x93, 0x39, + 0x35, 0xed, 0xe7, 0x5a, 0x06, 0x1e, 0x30, 0xc3, 0x70, 0x8d, 0x7d, 0x6e, 0x20, 0x20, 0xc2, 0x56, 0x7c, 0x75, 0xa8, 0x56, 0x65, 0x41, 0xc4, 0xfc, 0xa2, 0x2b, 0xfb, 0x72, 0xc7, 0xa7, 0xb0, 0x17, + 0xcd, 0xf1, 0x8c, 0xca, 0x49, 0x2b, 0x38, 0xf2, 0x4b, 0x91, 0x21, 0xab, 0x57, 0x8e, 0xd3, 0xf2, 0xd0, 0xc9, 0xfe, 0x64, 0xff, 0x3f, 0xf5, 0xeb, 0x37, 0x9a, 0xfa, 0x4b, 0xea, 0x09, 0x8c, 0xaf, + 0xf2, 0x39, 0x47, 0xe1, 0x0b, 0x0b, 0xfd, 0x4a, 0x45, 0x6b, 0x6f, 0xa1, 0x70, 0x51, 0xc2, 0x22, 0x3b, 0x7a, 0x3e, 0x1b, 0x1a, 0x83, 0x64, 0xf5, 0x81, 0x66, 0x76, 0x2d, 0x5b, 0x4c, 0x11, 0x8b, + 0xf4, 0xab, 0xe5, 0xb1, 0xb5, 0xe4, 0x7a, 0x11, 0x50, 0xda, 0x8a, 0xf5, 0x76, 0x2e, 0x9c, 0xc1, 0x22, 0x43, 0x42, 0xb4, 0x8a, 0x03, 0xa6, 0xcb, 0xea, 0xba, 0xbc, 0xb1, 0xe5, 0xaa, 0xd9, 0xb4, + 0xab, 0xe8, 0x40, 0x4f, 0xb5, 0x42, 0x12, 0xd5, 0xdd, 0x2b, 0x2a, 0xf7, 0x27, 0x2d, 0xc0, 0x23, 0x18, 0xc8, 0x9f, 0xf0, 0xf8, 0x2d, 0x1c, 0xd2, 0xec, 0x0c, 0x41, 0x9a, 0x8d, 0x3e, 0x44, 0x7c, + 0x5f, 0x7d, 0x72, 0x63, 0x70, 0x47, 0x62, 0xba, 0xd6, 0x74, 0xd9, 0x97, 0x81, 0x03, 0x9e, 0xb1, 0x0e, 0x9e, 0x39, 0x4e, 0x8f, 0x6d, 0x2c, 0xa0, 0x40, 0x2a, 0xa1, 0x55, 0xd1, 0x02, 0x89, 0x23, + 0x45, 0xc7, 0x28, 0xf3, 0x40, 0x1c, 0x01, 0xec, 0xc0, 0x31, 0x48, 0x86, 0x69, 0xc4, 0x64, 0x3c, 0xeb, 0x25, 0xab, 0x08, 0x2c, 0x9c, 0x59, 0x59, 0x51, 0x72, 0xe0, 0xa4, 0x4a, 0xab, 0x85, 0x7c, + 0xd6, 0x6f, 0xd5, 0x57, 0x52, 0x92, 0x5b, 0x75, 0x96, 0x84, 0xce, 0xa8, 0x8a, 0x3d, 0x2f, 0x7f, 0xbc, 0xca, 0x5f, 0x93, 0xd8, 0x7c, 0x98, 0xf3, 0xae, 0x97, 0xef, 0x07, 0x6b, 0xf2, 0x03, 0x26, + 0xa2, 0x33, 0x1c, 0xbf, 0x18, 0x26, 0xea, 0xd2, 0x4a, 0xab, 0x3c, 0xfb, 0x20, 0x67, 0x3d, 0xde, 0x7d, 0xf4, 0xfc, 0x72, 0x55, 0xbb, 0xa3, 0xca, 0x2b, 0xc3, 0xf3, 0xfe, 0xad, 0xfc, 0xd0, 0x0d, + 0xf0, 0xbb, 0x37, 0x5f, 0xf1, 0xeb, 0x28, 0x9a, 0xd0, 0x39, 0x7c, 0x72, 0x2d, 0x8d, 0x9a, 0xd4, 0xab, 0x1c, 0x2b, 0xf7, 0x7e, 0x3b, 0x2b, 0x5c, 0xa9, 0x2b, 0xa5, 0x67, 0xc5, 0xa3, 0x4f, 0xb0, + 0x7e, 0x7c, 0xb8, 0x92, 0xdc, 0x26, 0x32, 0xf9, 0x20, 0x97, 0x39, 0xbb, 0x3f, 0x5e, 0x53, 0x57, 0x5c, 0x8f, 0x9b, 0xd3, 0xab, 0x59, 0x1a, 0x3a, 0x23, 0x3b, 0xcb, 0x92, 0x1f, 0x0f, 0x4d, 0xa1, + 0x75, 0x50, 0x7a, 0xd6, 0x55, 0x6e, 0xdf, 0x3f, 0xc4, 0x70, 0x3e, 0x47, 0xf0, 0xd9, 0x8c, 0xf6, 0xf7, 0xcb, 0xff, 0x93, 0x6f, 0x7c, 0x75, 0xe7, 0xfb, 0x27, 0xaf, 0xfa, 0x48, 0x39, 0xc4, 0x31, + 0xc3, 0xf8, 0x5c, 0x1b, 0xb7, 0x4b, 0x79, 0x8c, 0x04, 0xea, 0xce, 0x51, 0x30, 0x89, 0xad, 0x36, 0xa4, 0x19, 0x47, 0x95, 0xea, 0x4f, 0xa3, 0x62, 0x07, 0x7a, 0x48, 0x35, 0xeb, 0x92, 0x19, 0x3b, + 0x33, 0xc3, 0x02, 0xd6, 0x37, 0x6a, 0x8e, 0xb1, 0xc6, 0xa6, 0x6e, 0x98, 0x05, 0x2e, 0xb0, 0x8b, 0x62, 0xa2, 0xc1, 0xde, 0x5e, 0x2b, 0x24, 0x3b, 0xdd, 0xa8, 0x02, 0x36, 0x6b, 0xcc, 0x84, 0x7f, + 0xc1, 0xcd, 0xe2, 0x84, 0xef, 0x57, 0x4b, 0x7d, 0x61, 0x7c, 0x47, 0x74, 0x50, 0xe5, 0x71, 0x58, 0x23, 0x3f, 0xbe, 0x71, 0xc5, 0x78, 0xd2, 0x29, 0x1f, 0x81, 0x8f, 0xbf, 0xc5, 0x70, 0xf9, 0xe8, + 0x03, 0x5f, 0xc8, 0xdf, 0xdc, 0x1e, 0xe1, 0xaf, 0x71, 0x5d, 0x3a, 0x8b, 0x48, 0x10, 0x2a, 0x16, 0x38, 0x06, 0x11, 0x58, 0xa7, 0x01, 0xdd, 0x83, 0x6d, 0xb8, 0x0d, 0xd0, 0x2d, 0x3a, 0xa0, 0x01, + 0x18, 0xc1, 0xd8, 0xb0, 0x10, 0x75, 0x40, 0x9e, 0xcc, 0x0f, 0xca, 0x74, 0x5f, 0xac, 0x1a, 0xa5, 0x59, 0x0d, 0xc6, 0x6a, 0xbc, 0x57, 0x7b, 0x8a, 0xde, 0x04, 0x8c, 0xb5, 0x22, 0x0e, 0x87, 0x89, + 0x6d, 0x4d, 0x42, 0x89, 0x49, 0xec, 0x05, 0x52, 0xaf, 0x54, 0x08, 0xe5, 0xc3, 0xbb, 0xfd, 0xd3, 0xe7, 0x20, 0x7c, 0x02, 0x06, 0xf4, 0x13, 0x86, 0xdf, 0xb1, 0x64, 0x7d, 0x4a, 0x3d, 0x21, 0xf0, + 0x39, 0xc8, 0x3f, 0x25, 0xbd, 0x50, 0x6d, 0x77, 0xee, 0xf9, 0xa0, 0x5b, 0x6a, 0xb3, 0xac, 0x77, 0x19, 0x78, 0x55, 0x6d, 0x87, 0x66, 0xe6, 0x93, 0x30, 0x04, 0xa5, 0x66, 0x0c, 0xcc, 0x15, 0xa0, + 0xb7, 0x1c, 0x07, 0xb1, 0x59, 0xc7, 0x73, 0x31, 0x7f, 0x22, 0x45, 0x87, 0xf1, 0x00, 0x68, 0xf5, 0x4c, 0x55, 0xa6, 0xcd, 0x44, 0x08, 0xf8, 0x70, 0x12, 0x81, 0x91, 0x9f, 0x4c, 0x85, 0x06, 0x4a, + 0xb6, 0xac, 0x31, 0x6e, 0x97, 0x2e, 0x35, 0x23, 0x9f, 0x55, 0xfb, 0x62, 0xee, 0x79, 0xbc, 0x98, 0xbe, 0x63, 0xad, 0xb9, 0x91, 0x7d, 0x01, 0xc2, 0xe7, 0x9d, 0x57, 0xb9, 0x9c, 0x40, 0x58, 0x33, + 0x49, 0x60, 0x27, 0x46, 0x12, 0x6e, 0x1d, 0x35, 0x7e, 0xbf, 0xf0, 0x58, 0xc1, 0x25, 0x64, 0x46, 0x4c, 0x66, 0x22, 0x3c, 0xc5, 0x12, 0x1a, 0xf6, 0x24, 0xbd, 0xa2, 0x13, 0x4c, 0xb1, 0xca, 0x98, + 0x4b, 0x3a, 0xb0, 0xa5, 0x2b, 0x0b, 0x9b, 0xb3, 0x56, 0x37, 0x4f, 0x20, 0x6c, 0xca, 0x4b, 0x52, 0xdd, 0xcf, 0x41, 0xb6, 0x03, 0xd1, 0xae, 0x40, 0x95, 0x46, 0x3a, 0x16, 0x18, 0x51, 0xdc, 0x99, + 0x6b, 0xae, 0x29, 0x3d, 0x1f, 0xce, 0x47, 0xe3, 0xb7, 0x2c, 0x08, 0x17, 0x82, 0x3f, 0x30, 0xf8, 0xba, 0x1a, 0x7d, 0x08, 0xfc, 0x1e, 0x80, 0x60, 0xa6, 0xa2, 0x48, 0x41, 0xa8, 0xa6, 0x88, 0x4d, + 0xec, 0xdd, 0x4a, 0x9c, 0xab, 0x75, 0x82, 0x2e, 0x11, 0xa1, 0x5c, 0xa1, 0x7b, 0xed, 0x98, 0xd1, 0x87, 0x30, 0xd6, 0x27, 0xd5, 0x0c, 0xc6, 0xb1, 0x43, 0x05, 0x17, 0x7e, 0x1c, 0x34, 0xfb, 0x1d, + 0xed, 0xad, 0x01, 0x19, 0x5e, 0x45, 0x2b, 0x63, 0x71, 0xec, 0x6b, 0x34, 0xc3, 0x0e, 0x11, 0x4e, 0x02, 0x05, 0x6a, 0x3b, 0x41, 0x56, 0x26, 0x51, 0xfa, 0x4a, 0x3e, 0xc3, 0xda, 0x0d, 0xf7, 0x5f, + 0x64, 0x44, 0xd0, 0xf3, 0x2d, 0xed, 0x15, 0xad, 0xd0, 0xe3, 0xfe, 0xf3, 0x96, 0x6a, 0xfa, 0x4b, 0xec, 0x07, 0x6c, 0x9f, 0x17, 0xe7, 0x18, 0xc4, 0x17, 0x54, 0xd3, 0x38, 0x16, 0xab, 0xed, 0x46, + 0x56, 0x19, 0x55, 0x50, 0xc6, 0xe3, 0xc8, 0x2d, 0x55, 0x90, 0x47, 0x89, 0x22, 0x4e, 0x43, 0x3f, 0xac, 0x19, 0x01, 0x30, 0xdb, 0x32, 0x49, 0x4c, 0x27, 0x93, 0xd7, 0xfd, 0x66, 0x7d, 0xac, 0xcd, + 0x2e, 0xef, 0x77, 0x50, 0x8a, 0x80, 0x36, 0x03, 0x72, 0xe3, 0x7a, 0x4a, 0x51, 0x26, 0xb8, 0x5f, 0xb1, 0xae, 0xa9, 0x12, 0xeb, 0x6d, 0x69, 0x65, 0x6b, 0x18, 0xd0, 0x0d, 0xea, 0x85, 0x4d, 0xcb, + 0x65, 0x1e, 0xf4, 0x1f, 0x77, 0x2b, 0xef, 0x65, 0x4a, 0x95, 0xcf, 0xfc, 0x29, 0x8f, 0x31, 0xbd, 0x3a, 0x09, 0x7d, 0x66, 0xce, 0xfa, 0xfb, 0xa8, 0x8d, 0x0b, 0xb9, 0x27, 0x54, 0x7f, 0x5f, 0xbd, + 0x1a, 0xaf, 0x41, 0x10, 0x8c, 0xd9, 0x76, 0x62, 0xd2, 0xad, 0xd3, 0x06, 0xb5, 0x24, 0x6c, 0x8c, 0xa8, 0x80, 0x4e, 0xce, 0xfa, 0x9c, 0x1b, 0x6c, 0x7f, 0x05, 0xd0, 0x98, 0x2e, 0x32, 0x07, 0xb4, + 0xd1, 0x22, 0xad, 0x4b, 0x71, 0x18, 0x83, 0xad, 0xe5, 0x76, 0x5e, 0x07, 0x9a, 0x21, 0xe9, 0x4a, 0xa1, 0xc0, 0x2c, 0x96, 0xad, 0x8e, 0x7b, 0x20, 0x8e, 0x2c, 0x0b, 0xe1, 0x57, 0x21, 0xb0, 0xf3, + 0x8f, 0x34, 0x2f, 0x92, 0x2f, 0x69, 0xfc, 0x4d, 0xda, 0x3b, 0x99, 0xfb, 0xdf, 0x4d, 0xfa, 0xff, 0x25, 0xf4, 0x84, 0xc5, 0x67, 0xf1, 0xd5, 0x30, 0x75, 0x5d, 0xaa, 0xa4, 0xc8, 0xf5, 0x81, 0x08, + 0x4b, 0x62, 0xa0, 0x07, 0xf1, 0xf9, 0x7a, 0x21, 0x98, 0x76, 0x39, 0x03, 0xc9, 0x1c, 0x31, 0xf6, 0x16, 0xb4, 0x12, 0x6a, 0xb7, 0x50, 0x96, 0x06, 0xa2, 0x7b, 0x58, 0x16, 0xac, 0x04, 0x66, 0x52, + 0x59, 0xcc, 0x6a, 0xb5, 0x11, 0x8e, 0xf9, 0x04, 0xe0, 0xe4, 0x69, 0x5e, 0xee, 0x8e, 0xde, 0xd1, 0xd5, 0xcd, 0xde, 0x4e, 0x23, 0xc4, 0x39, 0x92, 0x3c, 0xeb, 0xde, 0xa7, 0xd8, 0x2e, 0x9e, 0xaf, + 0xcf, 0xf0, 0x3b, 0xd6, 0xbc, 0xe2, 0xb4, 0x18, 0x15, 0xa7, 0xc5, 0x17, 0x7e, 0xc9, 0x70, 0x57, 0x33, 0xdc, 0x72, 0x40, 0x10, 0x6b, 0x3a, 0xd0, 0x4c, 0xb7, 0xa9, 0x77, 0x0b, 0x00, 0xd8, 0xa5, + 0x8a, 0x3f, 0x74, 0xb1, 0xef, 0xad, 0x31, 0xda, 0x2e, 0xb2, 0x20, 0x97, 0x8b, 0x7c, 0xb5, 0x8f, 0x60, 0x6d, 0x0f, 0x3a, 0xa2, 0x2d, 0xd7, 0x1c, 0x35, 0xa0, 0x5c, 0x53, 0xd0, 0x15, 0x76, 0xdc, + 0x01, 0x79, 0x34, 0xad, 0xd6, 0xe3, 0x6e, 0x9c, 0x73, 0x93, 0x45, 0xbc, 0x0b, 0x88, 0xd2, 0x31, 0xa4, 0x57, 0x7c, 0x4b, 0xff, 0x26, 0x4d, 0xd1, 0x53, 0xdd, 0xf8, 0xb1, 0x11, 0xf4, 0x9d, 0x38, + 0xb1, 0xc7, 0x9f, 0x38, 0x41, 0xf9, 0xf0, 0xc1, 0x39, 0x08, 0xfd, 0x85, 0x08, 0xb2, 0xda, 0xa0, 0x61, 0x11, 0x0e, 0xf6, 0xbd, 0xd4, 0x2c, 0xf6, 0x71, 0xb6, 0x03, 0x0d, 0xbd, 0x42, 0x5a, 0x18, + 0x6b, 0x52, 0x61, 0x17, 0x90, 0x85, 0xdf, 0x80, 0x05, 0xad, 0xf8, 0x81, 0x62, 0x58, 0x89, 0xd5, 0x12, 0x7e, 0x1f, 0x34, 0xc9, 0xda, 0x42, 0xfa, 0x79, 0xee, 0xca, 0x19, 0x49, 0x1c, 0x0d, 0x14, + 0x29, 0x97, 0x4e, 0x1c, 0x01, 0x63, 0x5f, 0x33, 0x44, 0x5d, 0xdd, 0x56, 0x13, 0x76, 0x71, 0xbc, 0x5b, 0xd9, 0xbe, 0x21, 0x10, 0x43, 0xae, 0xdc, 0x3c, 0x5e, 0x45, 0xe4, 0x82, 0x38, 0xec, 0x17, + 0x61, 0xd8, 0x59, 0xd2, 0xf7, 0xb5, 0x26, 0x87, 0x79, 0xd1, 0xe7, 0x3e, 0xcb, 0x45, 0xf4, 0xb2, 0x98, 0x07, 0x7b, 0x5d, 0xc9, 0x68, 0xd2, 0x9a, 0x22, 0x25, 0x61, 0x94, 0x53, 0x1d, 0xa0, 0x44, + 0xca, 0x5f, 0x0a, 0x15, 0xb8, 0x8d, 0x0f, 0xc0, 0xb4, 0x16, 0x94, 0xa1, 0xe6, 0x8f, 0x8a, 0x0c, 0xc1, 0x9c, 0xa4, 0x81, 0x28, 0x1b, 0xe0, 0xd0, 0x0a, 0xb0, 0xc6, 0x64, 0x5c, 0x93, 0x45, 0x45, + 0x0f, 0x61, 0x29, 0xe2, 0x71, 0x46, 0xef, 0xfc, 0x17, 0xfa, 0x94, 0xdd, 0xd7, 0x1f, 0x16, 0xde, 0x3b, 0xbf, 0x93, 0xe0, 0x2a, 0x85, 0xe6, 0x83, 0xc4, 0x91, 0x97, 0x09, 0x1b, 0x6f, 0xb3, 0x33, + 0x9e, 0xfd, 0x41, 0xf2, 0x30, 0xf7, 0x7e, 0xfc, 0xda, 0xb3, 0x3c, 0xec, 0xa6, 0xf7, 0x7a, 0xfc, 0xe3, 0xfe, 0x39, 0x7e, 0xa7, 0x35, 0xae, 0x65, 0x9f, 0x1a, 0xe5, 0xfa, 0xce, 0xe8, 0x2c, 0xf7, + 0xfb, 0xb6, 0xd9, 0x1c, 0x40, 0x7f, 0x49, 0xcb, 0xfd, 0x32, 0xc8, 0xdc, 0xae, 0x87, 0x97, 0xcc, 0x1a, 0x59, 0x58, 0xc3, 0xc1, 0x9b, 0x47, 0x72, 0xe2, 0x0d, 0x94, 0xa6, 0x23, 0xde, 0xde, 0xad, + 0x57, 0xa9, 0x11, 0xd4, 0xc3, 0x9a, 0xad, 0xa6, 0xc2, 0x2a, 0x6b, 0xe3, 0x25, 0x3e, 0xc3, 0x37, 0x82, 0x8d, 0xd5, 0xc5, 0x52, 0x5c, 0x6e, 0xca, 0xad, 0xdd, 0x21, 0x88, 0x8c, 0x65, 0xe8, 0xbc, + 0x59, 0x59, 0x47, 0xa1, 0xa9, 0x5e, 0x68, 0x1b, 0xcb, 0x3e, 0xed, 0xc4, 0x9c, 0x2c, 0xad, 0xcb, 0x2c, 0xfe, 0xcd, 0x1e, 0x79, 0xd3, 0x0e, 0xbf, 0x53, 0x44, 0x9e, 0xb7, 0xd1, 0x57, 0xbb, 0xde, + 0x0b, 0x5a, 0x7a, 0xf4, 0x2e, 0x19, 0xf8, 0x2f, 0xed, 0xfe, 0xac, 0xc8, 0x5c, 0xe9, 0xf2, 0xe7, 0xbc, 0x9e, 0xa7, 0x2d, 0xf0, 0xff, 0xff, 0x41, 0x90, 0xfb, 0x49, 0x5d, 0x7f, 0x16, 0xf1, 0xb4, + 0x1d, 0xdd, 0xb0, 0xcc, 0x9f, 0x34, 0x20, 0xfa, 0x96, 0x37, 0xf7, 0x97, 0xd0, 0xcf, 0x96, 0x3b, 0x15, 0x47, 0xe8, 0x6b, 0x5e, 0xdd, 0x01, 0x2f, 0x43, 0xe4, 0x24, 0x4b, 0x49, 0xc9, 0x6d, 0x0a, + 0xd7, 0x0e, 0x8e, 0x22, 0x66, 0xa2, 0x04, 0x05, 0xb1, 0x72, 0x54, 0x15, 0x03, 0x5e, 0xa4, 0x92, 0xe3, 0xfb, 0xd5, 0x56, 0x45, 0xc7, 0x13, 0x6c, 0xd6, 0x28, 0x6e, 0x21, 0x27, 0x00, 0x61, 0x07, + 0x2b, 0x64, 0xb2, 0x3a, 0x2e, 0xf9, 0x6a, 0xca, 0xb0, 0x6c, 0x6a, 0xa5, 0x18, 0x23, 0x34, 0x93, 0x1a, 0x55, 0xb2, 0xc9, 0x4e, 0x8a, 0xb7, 0xc3, 0x77, 0xdc, 0x18, 0x8f, 0x5b, 0xf1, 0xd2, 0x2a, + 0xf7, 0xc1, 0x3f, 0xf9, 0x44, 0xbd, 0xb9, 0x31, 0x51, 0x3c, 0xde, 0x73, 0xbd, 0xb3, 0xe9, 0xb8, 0x14, 0xfc, 0x81, 0xe5, 0xaf, 0xcb, 0x57, 0x59, 0x63, 0x30, 0xc2, 0x2f, 0xcb, 0xf9, 0x16, 0xe4, + 0x69, 0x65, 0x53, 0x6c, 0x78, 0x2a, 0x80, 0x92, 0x60, 0x47, 0x4d, 0x76, 0xd3, 0xed, 0xc2, 0x05, 0x26, 0x2a, 0x61, 0xda, 0x88, 0xb2, 0xd8, 0xce, 0xdd, 0xa9, 0x9a, 0x99, 0x3b, 0xbe, 0x9e, 0xdb, + 0xab, 0x21, 0xea, 0x2a, 0x63, 0xce, 0xac, 0x50, 0x6a, 0x42, 0x19, 0x06, 0x2d, 0x8c, 0x83, 0x14, 0xef, 0x61, 0x65, 0x67, 0x5b, 0xbc, 0x3f, 0x68, 0x75, 0x82, 0xcd, 0x67, 0xf7, 0x93, 0xb2, 0xb7, + 0xf7, 0xba, 0xfc, 0xe7, 0xaf, 0x94, 0xb3, 0x3f, 0xfd, 0xd8, 0xda, 0x3f, 0x3f, 0xba, 0x7c, 0xc7, 0x9a, 0xf9, 0xf8, 0x13, 0x67, 0x54, 0x1e, 0x3d, 0x38, 0x7b, 0x68, 0xbe, 0xa0, 0xf8, 0xac, 0xc2, + 0xa9, 0x2b, 0x4d, 0x8b, 0x09, 0xac, 0xc5, 0x06, 0xd1, 0x48, 0x2b, 0xc8, 0xad, 0x08, 0x09, 0x70, 0x55, 0x08, 0x09, 0xf1, 0xcd, 0x3a, 0x24, 0x4b, 0x74, 0xda, 0x88, 0x01, 0xa7, 0xa7, 0xc0, 0x21, + 0xf1, 0x36, 0x1c, 0xc0, 0xfa, 0x8b, 0xc0, 0x8f, 0x8a, 0xad, 0x14, 0x56, 0xf0, 0xb0, 0xea, 0xd2, 0xb8, 0x21, 0xc9, 0xa0, 0x00, 0xc7, 0x6e, 0x07, 0x09, 0x08, 0x2f, 0xa0, 0x94, 0x20, 0x29, 0xfc, + 0x7b, 0xfd, 0xed, 0xbf, 0x7d, 0x88, 0xfc, 0xd5, 0x53, 0xfc, 0xd3, 0x26, 0xed, 0x8f, 0x81, 0xfa, 0xef, 0xa5, 0x58, 0x79, 0x20, 0xff, 0xdc, 0x1c, 0x77, 0x77, 0x5f, 0x4d, 0xb4, 0xa2, 0xfb, 0x50, + 0xaa, 0x79, 0xb8, 0x54, 0x79, 0x43, 0x38, 0xdb, 0x36, 0x00, 0x95, 0x4f, 0xec, 0x30, 0x54, 0xed, 0x24, 0x8f, 0x0b, 0x5c, 0x9e, 0x80, 0x39, 0x40, 0xb4, 0x84, 0xa1, 0x0b, 0xe0, 0x6a, 0xba, 0x08, + 0x4a, 0x95, 0x61, 0xd4, 0xa0, 0xb5, 0x80, 0x23, 0xc5, 0xf5, 0x8d, 0xdd, 0x14, 0xbe, 0xa9, 0x29, 0x47, 0x4f, 0x05, 0x41, 0xc6, 0xd8, 0xcd, 0x2b, 0x66, 0x4e, 0x48, 0xeb, 0x0d, 0x78, 0x64, 0xef, + 0x8e, 0xe8, 0x3e, 0x6b, 0xf7, 0x7c, 0x23, 0xf2, 0x0e, 0x8d, 0xfe, 0xe7, 0x6b, 0xe7, 0xfa, 0x9f, 0x4b, 0xa3, 0x0f, 0x41, 0xdf, 0x57, 0x3a, 0x74, 0x00, 0x62, 0x65, 0x84, 0x3b, 0x72, 0x17, 0x22, + 0xfd, 0x20, 0xce, 0x67, 0x1a, 0x7f, 0x08, 0x4d, 0x06, 0x33, 0x27, 0x03, 0xc1, 0x23, 0x66, 0x90, 0x4c, 0xf4, 0xad, 0xa5, 0x74, 0xee, 0x8a, 0xed, 0xd6, 0x56, 0x15, 0x7a, 0x33, 0xba, 0x04, 0x7a, + 0xdd, 0x04, 0xb5, 0x44, 0xaf, 0x9c, 0xc3, 0x22, 0x5c, 0xc7, 0x30, 0x62, 0x95, 0x50, 0x8f, 0xeb, 0xa1, 0xce, 0x74, 0x68, 0x32, 0x96, 0x16, 0x29, 0xfc, 0x9e, 0x17, 0xc3, 0xd5, 0xa9, 0xcc, 0x47, + 0x0f, 0xc4, 0x9f, 0x75, 0xad, 0xaa, 0x49, 0x9e, 0x66, 0xd1, 0x80, 0xde, 0x32, 0x75, 0x7e, 0xca, 0xfc, 0x80, 0xf0, 0x54, 0x1a, 0x41, 0xdf, 0x9b, 0x32, 0xe1, 0x11, 0xe9, 0x45, 0x90, 0xe1, 0x89, + 0x73, 0x19, 0xe7, 0xbd, 0x7d, 0x41, 0x92, 0x28, 0x5d, 0x6c, 0x43, 0x05, 0x5a, 0x98, 0xf0, 0x5b, 0x59, 0x6d, 0xeb, 0xa0, 0xcc, 0x9a, 0xfd, 0x79, 0xca, 0xff, 0x17, 0xf9, 0x89, 0x3e, 0xd3, 0xd2, + 0x4b, 0xef, 0x99, 0x5d, 0x05, 0x7a, 0xcb, 0xd4, 0x58, 0x7a, 0xf5, 0xb9, 0xe2, 0xf5, 0x79, 0x5e, 0x7f, 0x61, 0xac, 0x6c, 0x21, 0x1b, 0x35, 0x34, 0xb1, 0x22, 0x24, 0xd4, 0x9c, 0xc0, 0x84, 0x26, + 0x89, 0x3d, 0xbc, 0x58, 0x50, 0xc4, 0xd4, 0x22, 0x18, 0x32, 0x38, 0x9a, 0x7b, 0x5c, 0x65, 0xb1, 0x64, 0xd3, 0x1f, 0x56, 0x9d, 0xb8, 0x63, 0x91, 0xa8, 0x81, 0x96, 0xba, 0x3d, 0x8f, 0xad, 0x85, + 0x20, 0xc4, 0x07, 0x03, 0xd0, 0x38, 0xa2, 0x9d, 0x09, 0x40, 0xab, 0x6e, 0xf5, 0x64, 0x3a, 0xa3, 0x20, 0x6b, 0x87, 0x1f, 0x8d, 0xf9, 0x9d, 0x67, 0xf9, 0x6f, 0x86, 0xd4, 0x67, 0x26, 0xed, 0xbf, + 0xdf, 0x7d, 0x7c, 0xca, 0x3c, 0x57, 0xf7, 0x5c, 0x7a, 0x35, 0x43, 0x85, 0x3a, 0x49, 0x17, 0x24, 0x69, 0xa1, 0xbe, 0x03, 0x7a, 0x07, 0x7a, 0x06, 0xc7, 0x10, 0xa8, 0x0a, 0xf0, 0x32, 0xab, 0xc2, + 0x66, 0x19, 0xf5, 0x4a, 0x40, 0x04, 0xd3, 0xa3, 0xbe, 0xdb, 0x2e, 0x8c, 0xfd, 0xce, 0xf1, 0xe7, 0xc7, 0x9a, 0x9c, 0x10, 0xfa, 0xbe, 0x89, 0x10, 0x95, 0xdf, 0x30, 0xde, 0x12, 0x9b, 0xce, 0x91, + 0x84, 0x00, 0x9b, 0xb6, 0xb7, 0x36, 0x3b, 0x05, 0xf7, 0xed, 0x9a, 0x6e, 0x95, 0x7e, 0xb8, 0x9f, 0x1e, 0x3e, 0x68, 0xa3, 0x9f, 0x2d, 0x5c, 0x6f, 0xf4, 0x6b, 0xdf, 0x75, 0x4e, 0x95, 0xf5, 0x5d, + 0xe7, 0xbc, 0x28, 0xbd, 0x30, 0x27, 0xec, 0x90, 0x20, 0x3b, 0xba, 0xc3, 0xcc, 0xe6, 0x43, 0x82, 0x00, 0x35, 0x2b, 0xb2, 0xe4, 0xad, 0x7e, 0x40, 0xf8, 0x4d, 0x02, 0x74, 0xdc, 0xd2, 0x13, 0xdd, + 0xed, 0xb6, 0x99, 0x12, 0xa1, 0x13, 0x11, 0xf6, 0x01, 0x1f, 0x42, 0x64, 0x46, 0xce, 0xe7, 0x54, 0x17, 0xee, 0x9d, 0x94, 0x99, 0xe5, 0xab, 0x85, 0xcd, 0xf5, 0x9c, 0xb3, 0xef, 0x57, 0x4c, 0x28, + 0x00, 0x64, 0xca, 0x97, 0x06, 0xe6, 0x98, 0xf3, 0xf2, 0x6e, 0x37, 0x7e, 0x3e, 0x37, 0xf9, 0x63, 0x3a, 0x1c, 0xec, 0xad, 0xd4, 0xe3, 0x17, 0x72, 0xc1, 0xd1, 0xe5, 0xd5, 0x08, 0x7b, 0x2d, 0x05, + 0x79, 0x99, 0xa3, 0x72, 0x06, 0x11, 0x6b, 0xc7, 0x4d, 0x92, 0xb5, 0x3d, 0x3f, 0xee, 0x2d, 0xae, 0x13, 0xe5, 0x55, 0x49, 0xd8, 0xf3, 0x9d, 0xbc, 0x3b, 0x60, 0xf2, 0x84, 0x2d, 0xe0, 0x19, 0x90, + 0xe7, 0xb6, 0x94, 0x11, 0x10, 0x60, 0x78, 0x16, 0xd3, 0x1d, 0x5a, 0x8c, 0x71, 0x49, 0x4e, 0xe0, 0x80, 0x39, 0x83, 0xdb, 0x51, 0x6a, 0x24, 0xc8, 0xae, 0x11, 0x1a, 0x5a, 0x4f, 0xf2, 0xc6, 0x38, + 0x26, 0xb4, 0x7e, 0xd7, 0xb7, 0xaf, 0xb9, 0x52, 0x9f, 0x2d, 0x8b, 0x7f, 0xdf, 0xde, 0x17, 0x72, 0xbf, 0xaa, 0xff, 0x71, 0xf5, 0x2a, 0xd3, 0x80, 0x60, 0xa9, 0xf2, 0xac, 0x52, 0x2d, 0x8e, 0x6b, + 0xd6, 0xed, 0x61, 0x1a, 0x46, 0x19, 0x25, 0x2c, 0xa8, 0x35, 0x0e, 0x7a, 0x5b, 0x7c, 0x17, 0x96, 0xc7, 0x5e, 0xd0, 0x62, 0x93, 0x98, 0x52, 0x62, 0x3f, 0x66, 0x80, 0x80, 0x3e, 0x06, 0xe3, 0x29, + 0x1e, 0x2f, 0xe7, 0x40, 0x2a, 0xb8, 0x81, 0x3d, 0xf3, 0x97, 0xb6, 0x00, 0xec, 0x95, 0xf9, 0xd4, 0x29, 0xdd, 0x8a, 0xb7, 0xd4, 0x0a, 0x9a, 0x01, 0xe6, 0x94, 0x7f, 0xc1, 0xbd, 0xe8, 0x63, 0x4e, + 0xfb, 0xf1, 0x2f, 0xf4, 0xdc, 0x35, 0xe1, 0xd9, 0x51, 0xdb, 0x63, 0xf4, 0xc6, 0x6f, 0xb8, 0x7b, 0x3c, 0xfc, 0xc2, 0x17, 0x8e, 0xb7, 0xf7, 0x47, 0xe7, 0x6f, 0x7c, 0x8f, 0xa8, 0x87, 0xd8, 0x0c, + 0x85, 0x68, 0x2b, 0x05, 0x6a, 0xbb, 0xca, 0xdb, 0xb9, 0xe3, 0xb8, 0x62, 0x84, 0x31, 0x80, 0xf2, 0x9c, 0x8e, 0x2f, 0xf2, 0xad, 0x2e, 0x5a, 0xb0, 0x19, 0xcc, 0x44, 0x42, 0x56, 0x81, 0x79, 0x74, + 0xe4, 0x25, 0x3a, 0x91, 0x03, 0x9b, 0xde, 0xc6, 0x75, 0x59, 0x2f, 0x19, 0xff, 0x60, 0x04, 0xbb, 0x45, 0xc9, 0x3b, 0x42, 0x1d, 0x01, 0xeb, 0x20, 0x61, 0xa6, 0xae, 0xe0, 0x9a, 0x0c, 0x7c, 0xa7, + 0x04, 0xdf, 0x24, 0xfe, 0x7f, 0x66, 0xd7, 0xfb, 0xfb, 0xc5, 0xe1, 0x52, 0xf0, 0x27, 0x14, 0x5f, 0x97, 0xaf, 0x46, 0x63, 0x19, 0x66, 0x86, 0xae, 0x49, 0x44, 0x66, 0x08, 0x29, 0xec, 0x43, 0x88, + 0x85, 0x59, 0x51, 0xc8, 0xa2, 0xcd, 0x40, 0x1c, 0x72, 0x2f, 0x4f, 0x65, 0x71, 0x39, 0x59, 0xf6, 0x82, 0xbd, 0x58, 0xec, 0x61, 0x5d, 0xd7, 0xbd, 0xa3, 0x8d, 0xb9, 0xab, 0x25, 0x51, 0xe7, 0x3d, + 0x87, 0x50, 0x4c, 0x37, 0x77, 0x44, 0x7b, 0x31, 0x27, 0x8e, 0x4e, 0x2f, 0x2d, 0x0e, 0x90, 0x63, 0xb7, 0x85, 0x23, 0x96, 0xe1, 0x47, 0x5e, 0xa4, 0x6b, 0x04, 0x1e, 0x50, 0x90, 0x3f, 0x86, 0xe1, + 0x1d, 0x1d, 0xeb, 0x4e, 0xfa, 0x09, 0x8b, 0xdb, 0x7b, 0xa3, 0xb3, 0xec, 0xef, 0x01, 0xc1, 0x2d, 0x15, 0x90, 0xda, 0xca, 0x1b, 0x5a, 0x62, 0x27, 0x91, 0x60, 0xda, 0x1f, 0xd7, 0x4a, 0x47, 0x8a, + 0xb9, 0xb6, 0x98, 0xcc, 0x4a, 0xc7, 0x08, 0x75, 0x3d, 0x2e, 0xe8, 0xf1, 0x80, 0xb9, 0x98, 0x2e, 0x4e, 0x19, 0xa9, 0xa8, 0x6d, 0xbf, 0x92, 0xa2, 0xb4, 0x9d, 0xf7, 0x85, 0x1d, 0xa2, 0x7b, 0xd7, + 0xe5, 0x6a, 0x6d, 0xd1, 0xb0, 0x87, 0x09, 0x4f, 0x71, 0x6a, 0x56, 0x6f, 0x10, 0xbc, 0x58, 0xab, 0x77, 0x8b, 0xc9, 0xaf, 0x08, 0x9f, 0x47, 0x28, 0x10, 0x3f, 0xb1, 0x37, 0x96, 0xcf, 0x0f, 0x91, + 0xe7, 0xaa, 0x9f, 0x0a, 0xa3, 0xb3, 0x94, 0xef, 0xeb, 0x0b, 0xdb, 0xb4, 0xcc, 0xca, 0x3b, 0x5c, 0x38, 0x02, 0x21, 0x02, 0x2f, 0x8e, 0x79, 0x97, 0xa3, 0x4c, 0x07, 0xe4, 0x32, 0x43, 0xc6, 0x4b, + 0xa1, 0x26, 0x9b, 0x5d, 0x24, 0x95, 0x1d, 0xa5, 0xd6, 0x60, 0x6a, 0x57, 0xad, 0xe1, 0x00, 0xf5, 0x1a, 0x37, 0x10, 0xbb, 0x0e, 0xd5, 0x4d, 0xe4, 0x8e, 0x01, 0x3f, 0x2d, 0x60, 0x4c, 0xd0, 0x81, + 0xb4, 0x10, 0x19, 0x9a, 0xe0, 0xfd, 0x9a, 0xd0, 0x0e, 0xad, 0xf3, 0x82, 0x29, 0xe4, 0x32, 0xc3, 0xc0, 0x97, 0xbb, 0xc0, 0xe3, 0xa9, 0xe5, 0x41, 0xae, 0x87, 0xc7, 0x7d, 0xe7, 0x1d, 0x8b, 0xc4, + 0x9d, 0xf4, 0x33, 0x80, 0x37, 0xf7, 0x5e, 0x8d, 0x3c, 0x97, 0x76, 0xe9, 0x4e, 0xec, 0x14, 0xbd, 0xf1, 0xca, 0x03, 0x8e, 0xa1, 0xba, 0xdf, 0xc4, 0x21, 0xdf, 0x4d, 0x05, 0x12, 0x96, 0x7d, 0x08, + 0x28, 0x7c, 0x91, 0x25, 0xd0, 0xcd, 0xd2, 0x58, 0x3b, 0xfd, 0xd6, 0x58, 0xcc, 0x27, 0x63, 0xaa, 0x59, 0x40, 0x87, 0x7d, 0x29, 0xe6, 0x12, 0xd3, 0x28, 0x66, 0x2a, 0x27, 0x51, 0xde, 0x57, 0x8b, + 0x64, 0xe8, 0x56, 0xfa, 0x9a, 0xf3, 0x2d, 0x5c, 0x88, 0x66, 0x41, 0x7f, 0xbf, 0x3e, 0xdd, 0x52, 0xb8, 0x3c, 0x56, 0x49, 0xde, 0xb1, 0x2b, 0x5c, 0x8b, 0xfe, 0x80, 0xe2, 0xe2, 0xc6, 0xab, 0xa9, + 0x2d, 0x58, 0x6c, 0xc3, 0xe8, 0x84, 0x56, 0xe6, 0x24, 0xb6, 0x0e, 0x63, 0xcc, 0x0e, 0xcc, 0xe3, 0x18, 0x8f, 0xc8, 0x88, 0xf7, 0xec, 0x6c, 0x5d, 0x60, 0xab, 0x6d, 0x62, 0x6c, 0xd1, 0xfd, 0x6e, + 0xee, 0xce, 0x17, 0x64, 0x37, 0xcb, 0x05, 0x4d, 0x57, 0xb7, 0x15, 0x57, 0xc6, 0x3c, 0x43, 0x97, 0x87, 0xac, 0xdb, 0xb2, 0x1e, 0x17, 0x82, 0xba, 0xb9, 0x6c, 0x1b, 0xe9, 0x68, 0x8c, 0x75, 0xae, + 0x35, 0xb6, 0xab, 0xfc, 0x7e, 0x0c, 0x5d, 0x1b, 0xcf, 0xff, 0x7b, 0x8a, 0xe8, 0xa5, 0xe0, 0x13, 0x06, 0x17, 0x97, 0xaf, 0xaa, 0xa4, 0x05, 0xa6, 0x0b, 0x7d, 0x5d, 0xcc, 0xd8, 0xe5, 0x7a, 0x71, + 0x98, 0xbb, 0xe1, 0x76, 0x59, 0x1a, 0x30, 0x94, 0x1c, 0x37, 0xd2, 0x31, 0x15, 0x83, 0x31, 0x02, 0x02, 0xf3, 0x6c, 0x1a, 0xcf, 0x34, 0xd4, 0x46, 0x36, 0xfa, 0x86, 0x45, 0xba, 0x6e, 0x95, 0x9b, + 0x33, 0x37, 0x99, 0x8c, 0x5b, 0x0f, 0x9a, 0x5a, 0xd9, 0x0e, 0x95, 0xda, 0x55, 0x3f, 0x2f, 0xf6, 0x58, 0x2b, 0x13, 0x5e, 0xde, 0x29, 0x47, 0xc8, 0x3c, 0xbe, 0x70, 0x96, 0xf9, 0x8d, 0x27, 0xf0, + 0x23, 0x4a, 0x85, 0x1b, 0x6b, 0xc2, 0x5d, 0x64, 0xc3, 0xe9, 0x9d, 0xc9, 0xd3, 0xc1, 0xf9, 0x2c, 0x1a, 0xf1, 0xbf, 0xa8, 0x36, 0x3d, 0xfc, 0xc4, 0xb9, 0x5d, 0x1e, 0x3d, 0x78, 0x55, 0x99, 0xb2, + 0x90, 0xe9, 0xc4, 0x80, 0xd6, 0x31, 0xa7, 0xc7, 0x93, 0x06, 0x3c, 0x56, 0x1a, 0x5e, 0x29, 0xcb, 0x66, 0x72, 0x9c, 0xb3, 0xb9, 0xbf, 0x6e, 0x90, 0x56, 0xda, 0xe1, 0x31, 0xbc, 0x40, 0x75, 0xd6, + 0xaa, 0x40, 0x68, 0xaf, 0x2e, 0x87, 0xf9, 0x30, 0xcd, 0x04, 0x70, 0x99, 0x35, 0x8a, 0xa3, 0x8a, 0x76, 0x32, 0x59, 0x69, 0xe6, 0x66, 0x81, 0xd2, 0x7c, 0xd7, 0xa7, 0x10, 0xaa, 0x18, 0xf1, 0xcc, + 0xea, 0xf0, 0xf7, 0xb6, 0xd7, 0x77, 0xe1, 0x9e, 0x8f, 0xa1, 0xbe, 0x74, 0x51, 0x7a, 0x6c, 0x92, 0x7d, 0x67, 0x17, 0xf2, 0x5b, 0xec, 0x09, 0xd2, 0x5f, 0x17, 0x23, 0xf4, 0xb5, 0x1d, 0xc9, 0xc6, + 0xe8, 0x72, 0x74, 0xbc, 0x8e, 0x4d, 0xd8, 0x42, 0x56, 0x36, 0x69, 0x8a, 0xfb, 0x19, 0xbd, 0x46, 0xd3, 0x70, 0xb9, 0x18, 0x42, 0xdb, 0x6d, 0xeb, 0x96, 0x53, 0xb5, 0xf5, 0x1e, 0x2a, 0x44, 0x69, + 0xa8, 0x98, 0x6c, 0x85, 0xce, 0xfd, 0xfd, 0xc1, 0x27, 0xd7, 0xee, 0x54, 0x99, 0xa9, 0xa8, 0x7c, 0xf0, 0x22, 0x86, 0x5d, 0xc6, 0x5a, 0x9b, 0xca, 0x69, 0xbe, 0x73, 0x79, 0x73, 0x19, 0xcc, 0xb6, + 0x31, 0xf8, 0xc2, 0xf9, 0xf3, 0x13, 0x7f, 0xb8, 0xc7, 0xc8, 0x7d, 0x79, 0x0d, 0x3d, 0x3e, 0x89, 0x78, 0x6b, 0xa2, 0x3c, 0x8b, 0x3c, 0x21, 0x76, 0x2e, 0x8c, 0xc6, 0xaf, 0x4d, 0x8c, 0xaa, 0x13, + 0x39, 0x2b, 0x5e, 0x3b, 0xa4, 0x25, 0x77, 0x98, 0xe1, 0xc2, 0x46, 0x27, 0xd1, 0xc2, 0x59, 0x6c, 0xf1, 0xf5, 0x62, 0xbf, 0x5b, 0x73, 0x87, 0x1d, 0x8e, 0x18, 0xa4, 0x85, 0x35, 0x06, 0xb3, 0x3b, + 0x4e, 0x7a, 0x77, 0x2e, 0xee, 0x5a, 0x6a, 0xb1, 0x5d, 0x17, 0x0b, 0x77, 0x15, 0x79, 0xf0, 0x4e, 0xd1, 0xf2, 0x38, 0x9a, 0x43, 0x9a, 0x91, 0xd3, 0x4c, 0x50, 0xd2, 0x2e, 0xc5, 0x1b, 0x8b, 0xb1, + 0xa2, 0xdd, 0x6b, 0x5b, 0xbf, 0x09, 0xbc, 0x9e, 0x0d, 0xc3, 0x37, 0x36, 0x6f, 0x9f, 0x42, 0x4f, 0x75, 0xfe, 0x2c, 0x9e, 0x87, 0xda, 0x0b, 0xdb, 0x36, 0xa9, 0xe5, 0xa8, 0x89, 0x09, 0x12, 0x42, + 0xb9, 0x86, 0xf0, 0xd2, 0xd8, 0x2c, 0x87, 0xd9, 0x36, 0xb6, 0x66, 0x40, 0x4c, 0xa0, 0x61, 0x9b, 0x0f, 0x55, 0x21, 0x2d, 0x67, 0x7b, 0x7b, 0xbb, 0xb1, 0x15, 0x67, 0xc3, 0xe0, 0x0e, 0x6f, 0x65, + 0x24, 0xa2, 0x58, 0x9a, 0xe7, 0x0b, 0xba, 0x78, 0x9c, 0x22, 0x3e, 0x4f, 0x8f, 0xa9, 0xa8, 0x31, 0x64, 0x36, 0x75, 0x65, 0x82, 0x03, 0x13, 0x85, 0xb6, 0x0f, 0xee, 0xfd, 0xb2, 0x78, 0x7b, 0xbc, + 0xf1, 0xdf, 0xdb, 0xa9, 0x5f, 0x8b, 0x3e, 0x23, 0x70, 0x79, 0xe3, 0xd5, 0xdd, 0x7b, 0x70, 0x90, 0x74, 0x52, 0x85, 0xb5, 0x68, 0x35, 0x73, 0xc9, 0x4d, 0xc5, 0xac, 0x90, 0x5e, 0x04, 0x5b, 0x4d, + 0xeb, 0xac, 0x2c, 0x67, 0x2b, 0x6a, 0xaa, 0xc2, 0xba, 0x7f, 0xd8, 0x92, 0x14, 0x10, 0x41, 0x00, 0x89, 0xad, 0xa8, 0x79, 0x9e, 0xd7, 0x30, 0xee, 0x94, 0xb0, 0x16, 0xec, 0xf1, 0xf5, 0xd2, 0xb6, + 0xc7, 0xd9, 0x41, 0xc5, 0xb7, 0x45, 0x8c, 0x4f, 0xf9, 0x08, 0x68, 0x9a, 0x1c, 0x6c, 0xd7, 0xde, 0x0b, 0xaa, 0xd6, 0xf5, 0x7e, 0xfe, 0xc7, 0xbf, 0xd8, 0x1f, 0xf6, 0x71, 0xe7, 0x8a, 0x5d, 0xd8, + 0xcc, 0xeb, 0x32, 0x7c, 0x36, 0xdf, 0xbc, 0x47, 0x9e, 0xf0, 0xf0, 0x0b, 0xbf, 0x20, 0xbd, 0xb9, 0xff, 0x2a, 0xa1, 0x42, 0xa0, 0xd1, 0x07, 0x30, 0x2c, 0x7c, 0x22, 0xce, 0x21, 0x90, 0xda, 0x2b, + 0x33, 0x02, 0x74, 0x5d, 0x1e, 0x5e, 0x6a, 0xb5, 0xcc, 0x09, 0x94, 0x1c, 0xc5, 0x03, 0x1d, 0x3a, 0x3b, 0x2c, 0x2c, 0xa9, 0x9d, 0xcb, 0xc2, 0xfb, 0x32, 0xaa, 0x52, 0x6f, 0x8d, 0xe0, 0xc6, 0x1c, + 0xef, 0x28, 0x7a, 0x3b, 0x65, 0x5d, 0xfa, 0xc8, 0x93, 0xbe, 0x2a, 0x2b, 0x90, 0x3a, 0x30, 0xdb, 0x00, 0x44, 0xc4, 0x1e, 0x78, 0x96, 0x4a, 0xe3, 0xaf, 0x57, 0xe0, 0x97, 0x8d, 0xf5, 0x17, 0xaf, + 0x3d, 0x4c, 0xb6, 0x09, 0x8d, 0x52, 0xaf, 0xab, 0x9f, 0xa5, 0x7e, 0x7c, 0x08, 0xa0, 0xf7, 0x07, 0xda, 0xf6, 0xb7, 0x54, 0xa3, 0x27, 0x1f, 0x79, 0xd6, 0x80, 0x5e, 0xea, 0xbe, 0xaa, 0x32, 0xf5, + 0x93, 0x8e, 0x8e, 0x5a, 0x58, 0x40, 0x50, 0xaa, 0x3d, 0x90, 0xec, 0x51, 0xc9, 0x9d, 0x7e, 0x83, 0x70, 0xcb, 0x12, 0x8e, 0x88, 0x76, 0x85, 0x4e, 0x7c, 0xe0, 0x80, 0xc7, 0x47, 0x29, 0x95, 0xb7, + 0x03, 0x90, 0x0c, 0x13, 0x7a, 0x3e, 0x4c, 0x38, 0x43, 0xf0, 0x62, 0xe6, 0x30, 0x46, 0x0e, 0xfc, 0x80, 0x03, 0x45, 0x4c, 0x76, 0x91, 0xbf, 0x26, 0x33, 0x63, 0xe8, 0xd1, 0x88, 0x12, 0x30, 0x51, + 0xc5, 0x5e, 0x18, 0x1d, 0xff, 0x8b, 0x06, 0x7b, 0xbd, 0x1d, 0xaa, 0xda, 0xfa, 0xa3, 0x03, 0xf0, 0x7f, 0xa9, 0x25, 0xce, 0x9f, 0x79, 0xd6, 0x16, 0xe7, 0x87, 0xaf, 0xb6, 0x46, 0x14, 0xe0, 0xde, + 0x84, 0x1c, 0xf3, 0x53, 0xff, 0xd8, 0xc9, 0x18, 0x54, 0xbb, 0x06, 0x92, 0x4a, 0x66, 0x9a, 0xd1, 0x18, 0x98, 0x6c, 0x66, 0x6b, 0x5e, 0x62, 0x45, 0xbf, 0x25, 0x6b, 0xac, 0xef, 0xeb, 0x43, 0xa6, + 0x56, 0x2b, 0x89, 0xeb, 0x8e, 0x4b, 0x90, 0x45, 0x27, 0x45, 0x03, 0x57, 0x0c, 0xc4, 0xd7, 0xda, 0x12, 0xe5, 0x69, 0x48, 0xdf, 0xaf, 0xe5, 0xc4, 0xd1, 0xda, 0x21, 0x6c, 0x8d, 0xc6, 0x7c, 0x4b, + 0x81, 0xfd, 0x5f, 0xb6, 0x46, 0x93, 0x7b, 0xa5, 0xb5, 0x7f, 0xee, 0xee, 0x48, 0xbe, 0x45, 0xc8, 0xf0, 0x5b, 0xec, 0x47, 0xa8, 0xfc, 0xe7, 0xc5, 0x88, 0x7c, 0x8d, 0x96, 0x21, 0x9b, 0xd2, 0x80, + 0xc5, 0x55, 0x74, 0x34, 0x0c, 0x51, 0xc2, 0x63, 0x14, 0x2f, 0x4c, 0x85, 0x99, 0x0c, 0x98, 0xc4, 0x42, 0x18, 0xe2, 0x0e, 0x60, 0xc4, 0x12, 0xb4, 0x16, 0xed, 0x16, 0x22, 0x0f, 0x4b, 0x40, 0x42, + 0xc6, 0xfb, 0x8a, 0x49, 0x28, 0x19, 0xde, 0x6c, 0xfd, 0xc1, 0x82, 0xfd, 0x35, 0x20, 0x00, 0xf2, 0x3a, 0x56, 0xa8, 0x8c, 0x33, 0x73, 0xfe, 0x98, 0x65, 0x2c, 0x98, 0x4b, 0x3c, 0xbc, 0x78, 0xf3, + 0x70, 0x31, 0x4b, 0xf2, 0x2c, 0x3d, 0xfd, 0x76, 0x2f, 0x09, 0xeb, 0xfa, 0xca, 0x31, 0xe0, 0xff, 0xbb, 0x7c, 0xed, 0xb4, 0x1f, 0x8e, 0xac, 0xaf, 0x4c, 0x23, 0x37, 0xf3, 0xd5, 0xef, 0x9c, 0x29, + 0xe3, 0xf3, 0xd9, 0xc8, 0xc5, 0xa3, 0x73, 0x5c, 0xc2, 0xa7, 0x95, 0xee, 0xda, 0x07, 0xff, 0x26, 0x3e, 0xc1, 0xcf, 0xca, 0x64, 0xe4, 0x5a, 0xb5, 0xf5, 0xe3, 0xa1, 0xef, 0xf7, 0xe9, 0x71, 0xe8, + 0x7e, 0x92, 0xf9, 0x7c, 0xe5, 0x75, 0xbd, 0x78, 0xfe, 0x3b, 0x01, 0xdf, 0x47, 0x87, 0xb8, 0x21, 0x58, 0x3f, 0xe7, 0xa5, 0xbb, 0x31, 0x12, 0x7c, 0x79, 0x9e, 0xfd, 0xf8, 0xcf, 0xd9, 0x51, 0xec, + 0xda, 0x5b, 0xe2, 0x52, 0x29, 0x47, 0x7f, 0x92, 0x7f, 0xe8, 0x5e, 0xf5, 0xf3, 0x24, 0x9f, 0xf8, 0x5b, 0x47, 0xda, 0xbf, 0xa4, 0x7e, 0x75, 0xae, 0x53, 0x79, 0x84, 0xbf, 0x76, 0x70, 0x1d, 0x48, + 0x59, 0xc0, 0x79, 0x4b, 0xff, 0x00, 0x3a, 0xd4, 0x98, 0xa4, 0xbb, 0xdc, 0x02, 0xdb, 0x31, 0x19, 0x1c, 0x6a, 0x01, 0x37, 0x2d, 0xa9, 0xd0, 0x6d, 0x48, 0xdc, 0x61, 0xe5, 0xe6, 0xa8, 0x41, 0x34, + 0x91, 0x5b, 0x52, 0x35, 0x55, 0x51, 0x11, 0x1b, 0x7a, 0x77, 0x30, 0xca, 0x2a, 0xe6, 0x57, 0x75, 0x04, 0xee, 0xdd, 0x31, 0x59, 0x74, 0xd8, 0x18, 0x8a, 0xd6, 0xb5, 0x53, 0xe1, 0xc7, 0x39, 0xec, + 0xbf, 0xb7, 0x16, 0xfe, 0xb1, 0x49, 0xae, 0x46, 0xe6, 0x8f, 0xff, 0x90, 0xcf, 0x33, 0xf5, 0xd7, 0x56, 0xfe, 0xcc, 0x60, 0x38, 0xfe, 0x09, 0xa3, 0x6f, 0x0c, 0xdf, 0x93, 0x44, 0x70, 0x74, 0xfe, + 0x33, 0xfa, 0x10, 0xf1, 0x3d, 0xae, 0x10, 0x68, 0x20, 0x90, 0xd0, 0x4a, 0x4b, 0xf5, 0x20, 0x3a, 0x0a, 0x2d, 0x87, 0x63, 0x8a, 0x92, 0x2b, 0x80, 0xa7, 0x38, 0xd3, 0x6c, 0x0b, 0x61, 0x6d, 0x85, + 0xf9, 0x9c, 0x66, 0xdb, 0x1c, 0x86, 0x5c, 0x71, 0x1b, 0xe6, 0xbb, 0xa3, 0x6c, 0xb6, 0xaa, 0x4a, 0x87, 0x10, 0x6c, 0x80, 0xfc, 0x21, 0x5e, 0xce, 0xfb, 0xc5, 0x7a, 0x16, 0x2c, 0x9d, 0x28, 0x73, + 0x0e, 0x00, 0xb3, 0x4e, 0xa7, 0xfe, 0x86, 0x9a, 0xbd, 0xb7, 0x61, 0x74, 0x3d, 0x2f, 0x1f, 0x79, 0x45, 0x63, 0x9d, 0x9d, 0x06, 0xff, 0x85, 0x6f, 0x47, 0xd2, 0xc7, 0x2c, 0xe9, 0x7e, 0x3e, 0xbc, + 0x8d, 0x06, 0xce, 0xea, 0x8f, 0x34, 0x46, 0x3f, 0x3e, 0x6c, 0xfa, 0x37, 0xcd, 0xe2, 0x67, 0xe5, 0xe8, 0x2b, 0x8b, 0xf7, 0xbf, 0xa7, 0xc9, 0xec, 0x6a, 0x9c, 0xdf, 0x71, 0xbf, 0xdf, 0x7f, 0xfc, + 0x8b, 0xe1, 0xe5, 0x5f, 0xe2, 0x27, 0x7c, 0x91, 0x50, 0xed, 0x37, 0x29, 0xc3, 0xf9, 0x27, 0x5d, 0x49, 0xbd, 0x64, 0x2c, 0xfe, 0x17, 0xb9, 0xa5, 0x2c, 0xbe, 0xa0, 0xb9, 0xf8, 0xf8, 0xbf, 0xd8, + 0xf5, 0xc8, 0xfe, 0x95, 0xd5, 0xed, 0xf4, 0x14, 0xb9, 0x7e, 0x7a, 0x6f, 0xcd, 0xf8, 0x17, 0xbe, 0xb2, 0x31, 0xff, 0xee, 0x33, 0x5f, 0xb5, 0xb9, 0x7f, 0xfa, 0x79, 0xa2, 0x7d, 0x82, 0xe3, 0x36, + 0x1e, 0xe5, 0x89, 0xba, 0xfc, 0xf1, 0x4b, 0xae, 0x89, 0x93, 0x6f, 0xce, 0x8f, 0x7f, 0x4f, 0x28, 0x17, 0xed, 0xff, 0x2c, 0x95, 0xd2, 0xd3, 0x74, 0x13, 0xff, 0xfc, 0x73, 0xab, 0x4b, 0x5c, 0xff, + 0xfc, 0xd7, 0x87, 0xc4, 0xf7, 0x59, 0x27, 0x6e, 0xcd, 0xe7, 0xff, 0x3c, 0x1b, 0x29, 0x16, 0x91, 0xb3, 0x0b, 0x37, 0x80, 0xbb, 0xf5, 0x92, 0xda, 0x2b, 0xbd, 0xac, 0xce, 0xf7, 0x9b, 0x6d, 0x07, + 0x76, 0x2d, 0x63, 0x56, 0x07, 0x0e, 0x56, 0x5d, 0xdc, 0xdb, 0x1b, 0x06, 0x87, 0xb2, 0xae, 0xa4, 0x8d, 0xcd, 0xad, 0xc0, 0xb1, 0x8c, 0xaa, 0xcc, 0x80, 0xa0, 0xed, 0x91, 0x8d, 0x4a, 0x03, 0xd3, + 0x18, 0x90, 0xfb, 0x8d, 0x4e, 0x71, 0x69, 0x3b, 0x80, 0x51, 0x1f, 0x80, 0x45, 0x53, 0x7f, 0x98, 0xd0, 0xaf, 0xbe, 0xfc, 0x28, 0x67, 0xce, 0xe3, 0xe9, 0xe3, 0x97, 0x7f, 0xff, 0xa3, 0x19, 0x04, + 0x7a, 0xeb, 0xe4, 0xe5, 0x53, 0xe6, 0x69, 0x0e, 0xf9, 0x28, 0x8d, 0xa0, 0xd7, 0xce, 0x5b, 0x80, 0x39, 0xb4, 0xd9, 0xec, 0xa3, 0x28, 0x9b, 0x4c, 0x4d, 0x1d, 0xd9, 0xfa, 0xee, 0x51, 0xf0, 0x17, + 0xc0, 0x76, 0xbd, 0xa1, 0xcb, 0x2e, 0xd6, 0x65, 0xc3, 0x73, 0x30, 0xc6, 0x12, 0x0c, 0x01, 0xf6, 0x3d, 0x7c, 0xd9, 0x07, 0x3e, 0x04, 0xfa, 0x72, 0xb2, 0x82, 0xec, 0x59, 0x68, 0xc2, 0x33, 0x72, + 0xaa, 0xe0, 0xce, 0x5c, 0x8f, 0x91, 0x4d, 0x1e, 0xd7, 0x62, 0x5e, 0x0f, 0x91, 0xbe, 0xd6, 0xd8, 0xc3, 0xfa, 0x05, 0x2d, 0xd7, 0x0e, 0xd3, 0xba, 0xf4, 0x3e, 0xf4, 0x25, 0xf8, 0x79, 0xfe, 0xf8, + 0xdb, 0x38, 0xb7, 0xc7, 0xf6, 0x83, 0x77, 0xf6, 0xd0, 0x57, 0x92, 0x4f, 0xb8, 0x5d, 0x5e, 0x9f, 0x83, 0x4f, 0x5f, 0xd8, 0x41, 0x1f, 0x2c, 0xa6, 0x48, 0x60, 0x86, 0x55, 0x26, 0x79, 0x8e, 0x72, + 0x7a, 0x2b, 0x91, 0x28, 0x89, 0x68, 0x0b, 0x3b, 0xcd, 0xf5, 0x54, 0x3a, 0x70, 0x93, 0x6e, 0xce, 0x4d, 0x5c, 0xb1, 0x46, 0xa7, 0x08, 0xe0, 0x26, 0x7a, 0xa8, 0x91, 0x3a, 0x2c, 0xf3, 0x6d, 0x32, + 0xe3, 0x3b, 0x8a, 0x2d, 0x59, 0x71, 0x4c, 0xf0, 0x76, 0x60, 0x4e, 0xf0, 0x15, 0xde, 0x07, 0x26, 0xa7, 0x37, 0x3d, 0xcd, 0x6f, 0x88, 0x57, 0xd0, 0x7b, 0x12, 0x6b, 0xf8, 0x0c, 0xc2, 0xcf, 0x81, + 0xfe, 0x0c, 0xbc, 0xbf, 0x8f, 0x67, 0xf8, 0x94, 0xf9, 0x01, 0xdb, 0xa9, 0x74, 0x06, 0xec, 0x9b, 0x38, 0x06, 0x78, 0xc4, 0xb8, 0xca, 0x0a, 0xc4, 0x0b, 0x92, 0xd3, 0xe3, 0x7d, 0x65, 0x3b, 0x07, + 0x76, 0x07, 0x03, 0x4c, 0x66, 0x85, 0x63, 0x5f, 0xfd, 0x3e, 0x12, 0xa1, 0x0e, 0xd3, 0x7e, 0x14, 0x97, 0xcd, 0xb3, 0x5d, 0xcb, 0x7b, 0x61, 0xe6, 0x5f, 0x52, 0x4f, 0x55, 0xf9, 0x2c, 0x8e, 0xe0, + 0x17, 0xe2, 0xca, 0xcf, 0x1e, 0x51, 0xdc, 0x7e, 0xd6, 0xec, 0x77, 0x8d, 0xb8, 0x9f, 0xae, 0xcb, 0xc2, 0xe3, 0xc1, 0x24, 0x0f, 0x15, 0x65, 0x9f, 0x4c, 0x2b, 0x45, 0x80, 0xb4, 0x0d, 0xde, 0x7b, + 0xcd, 0xc6, 0xdf, 0x54, 0x20, 0x5d, 0xfb, 0x50, 0xbe, 0x04, 0xc3, 0x6e, 0x5e, 0x2c, 0xa5, 0x84, 0xac, 0x18, 0xba, 0xdd, 0x3a, 0xfa, 0xdc, 0x9b, 0x68, 0xda, 0xb1, 0x46, 0xaa, 0xb9, 0xbe, 0xc4, + 0x12, 0xae, 0x30, 0xed, 0x9d, 0x15, 0x27, 0xab, 0x3b, 0xeb, 0x59, 0x9d, 0x7d, 0xb2, 0x1e, 0x95, 0x56, 0xba, 0x7f, 0xa6, 0x77, 0x60, 0xef, 0x55, 0xfe, 0x4a, 0xf4, 0x09, 0x82, 0xab, 0x1b, 0x23, + 0xec, 0x35, 0x1c, 0x70, 0x4c, 0x20, 0xc2, 0x01, 0xd7, 0xb1, 0x9e, 0x2d, 0x61, 0xa7, 0x75, 0xf6, 0x47, 0xb1, 0xb3, 0xed, 0x65, 0x4b, 0xa8, 0x07, 0x74, 0xcf, 0xf7, 0x98, 0xbb, 0x74, 0x6b, 0x73, + 0x5c, 0x32, 0x47, 0x6f, 0x53, 0x04, 0xa5, 0xbb, 0x12, 0x80, 0x4d, 0x08, 0x2e, 0x3a, 0xbc, 0xee, 0xd7, 0x10, 0xc7, 0xda, 0x00, 0x32, 0xa7, 0xfb, 0xd4, 0xa3, 0xb7, 0xab, 0x70, 0x5e, 0x94, 0x14, + 0x43, 0xcb, 0xdc, 0x81, 0xac, 0xde, 0xd3, 0xf0, 0x2e, 0xc9, 0xc9, 0x4e, 0x8a, 0xf2, 0x53, 0x1b, 0x6c, 0x9d, 0x85, 0xae, 0x97, 0xfe, 0xf1, 0x78, 0xe0, 0xcd, 0x0e, 0x75, 0x21, 0xf8, 0x8c, 0xe8, + 0xef, 0xcb, 0x57, 0xf2, 0x15, 0x9c, 0x77, 0x63, 0x58, 0x25, 0x0b, 0x6b, 0xf6, 0xb0, 0x07, 0x99, 0xa5, 0xc8, 0x25, 0x8b, 0x31, 0xba, 0x83, 0xc0, 0xc6, 0x2b, 0x37, 0x65, 0x3e, 0xec, 0x3c, 0xf7, + 0xa0, 0x06, 0x64, 0x3d, 0xe7, 0x8e, 0x96, 0xa7, 0xe7, 0x7e, 0xde, 0xb4, 0xd1, 0xda, 0x4b, 0x63, 0x39, 0xeb, 0x40, 0x84, 0x07, 0xa7, 0x4a, 0x6c, 0xaa, 0x35, 0xeb, 0x01, 0xab, 0x39, 0x51, 0x61, + 0x46, 0xc0, 0x0e, 0x38, 0x44, 0x0a, 0x31, 0xb5, 0x90, 0xee, 0xbc, 0x6a, 0xbe, 0x12, 0x2d, 0x3e, 0x36, 0xdd, 0xbf, 0x93, 0x06, 0xe5, 0x2c, 0xf1, 0x5c, 0xe7, 0xe6, 0x33, 0x7f, 0xef, 0x0b, 0x53, + 0xa8, 0x36, 0xed, 0x48, 0xb5, 0xc7, 0x94, 0x4d, 0xcd, 0xcb, 0x52, 0xbd, 0x2c, 0x80, 0x2d, 0x84, 0x82, 0xd5, 0x9a, 0x29, 0x75, 0x7a, 0xb3, 0xe8, 0x5a, 0xc6, 0x29, 0x1a, 0x59, 0x40, 0x9c, 0x31, + 0xba, 0xf1, 0x20, 0x14, 0x9c, 0x54, 0x5e, 0x19, 0x89, 0xd3, 0xe5, 0x50, 0x47, 0xd2, 0x80, 0xcf, 0x0e, 0x2b, 0x6f, 0x98, 0x30, 0x60, 0x10, 0x7b, 0x3d, 0xa5, 0x2b, 0xd3, 0xf9, 0xa6, 0x6d, 0x4d, + 0xb5, 0x9d, 0xc4, 0xef, 0x6d, 0x3d, 0x3f, 0x73, 0xaa, 0x7d, 0x28, 0x75, 0xf0, 0x93, 0x8e, 0xd3, 0xa4, 0x76, 0xd6, 0x8d, 0xf2, 0x32, 0x4c, 0xc2, 0x3a, 0xfc, 0x83, 0x77, 0xe6, 0x3b, 0x7d, 0xe7, + 0x46, 0x36, 0x38, 0xba, 0xbd, 0xf3, 0x6a, 0x0f, 0xaa, 0x4d, 0x15, 0x44, 0xb9, 0x62, 0x8d, 0xba, 0x14, 0xb6, 0xcf, 0x59, 0x78, 0x5d, 0xf7, 0xe1, 0x4a, 0x2d, 0xd9, 0x29, 0x14, 0x77, 0xe9, 0xfc, + 0xb0, 0x9d, 0x2d, 0xf2, 0x7a, 0x45, 0x14, 0xb8, 0xd7, 0xba, 0x26, 0x59, 0xc1, 0x88, 0x58, 0xf2, 0x4c, 0xcb, 0xd9, 0xc1, 0x72, 0x25, 0xd7, 0xc9, 0xea, 0xe0, 0xc2, 0x22, 0xa3, 0x5b, 0x30, 0x27, + 0x51, 0xa4, 0x35, 0x43, 0x28, 0x78, 0x38, 0x80, 0x46, 0xde, 0xbf, 0x60, 0x2d, 0xb9, 0x53, 0xc7, 0xff, 0x73, 0xa7, 0x8e, 0x07, 0xd6, 0x17, 0x8d, 0xf4, 0xd7, 0x3e, 0x0c, 0xba, 0x7f, 0xe1, 0x9e, + 0x67, 0xe9, 0xe2, 0x85, 0x36, 0x08, 0x9d, 0x60, 0x64, 0x67, 0x9d, 0xe7, 0x5e, 0xb5, 0xc3, 0x8f, 0x3f, 0x11, 0xd1, 0x5c, 0xe6, 0x0e, 0x7d, 0x76, 0x08, 0xf1, 0xf7, 0x69, 0xc1, 0x7e, 0x49, 0x3d, + 0x37, 0xd5, 0x67, 0xf9, 0x7c, 0x0c, 0xf1, 0x42, 0x5a, 0x30, 0xad, 0xe3, 0x39, 0xba, 0xac, 0xaa, 0xe9, 0x96, 0x54, 0x64, 0x41, 0x2a, 0x38, 0x8c, 0x4d, 0xaa, 0x68, 0x57, 0x56, 0xc7, 0x31, 0x45, + 0xea, 0x30, 0xb2, 0x1a, 0x53, 0xe5, 0x34, 0x0c, 0xad, 0xfe, 0x88, 0x32, 0x7d, 0x3f, 0x47, 0xcd, 0x78, 0xb9, 0xc7, 0xfb, 0xbe, 0x6a, 0x1a, 0xd9, 0x70, 0xcd, 0x6a, 0x37, 0xa0, 0xca, 0xda, 0x51, + 0xf6, 0x88, 0xef, 0x82, 0xa0, 0x1a, 0xb9, 0x63, 0x7a, 0xb1, 0x83, 0xc3, 0x57, 0x32, 0x57, 0xfc, 0x8a, 0x9b, 0x79, 0xd6, 0x73, 0xff, 0x7e, 0xe8, 0x7f, 0x88, 0x3c, 0xa3, 0x70, 0x2a, 0xbc, 0x1a, + 0xdc, 0x9f, 0x47, 0x3d, 0x62, 0x1b, 0x81, 0x5c, 0x35, 0x7e, 0xab, 0xc5, 0xeb, 0x56, 0x70, 0x80, 0x18, 0x75, 0x38, 0x02, 0x68, 0x9b, 0x55, 0xbc, 0xc6, 0x9b, 0x01, 0x32, 0xdc, 0x15, 0xcb, 0xc7, + 0x22, 0x63, 0xc7, 0x78, 0x94, 0x81, 0x46, 0x2c, 0x84, 0xe3, 0xc4, 0x26, 0xad, 0xbd, 0x7a, 0xd8, 0xd1, 0xe4, 0x74, 0x46, 0xec, 0x48, 0xae, 0x19, 0xbc, 0x5e, 0xe0, 0x0a, 0xe9, 0x50, 0x51, 0x68, + 0x30, 0xd4, 0xeb, 0xbb, 0x93, 0x98, 0xa6, 0x0c, 0x47, 0x4f, 0xd9, 0xf4, 0xc7, 0x3f, 0xdf, 0x49, 0xd5, 0xf1, 0x21, 0xf2, 0x54, 0xdf, 0x73, 0xe1, 0x1c, 0xe7, 0xf3, 0xc2, 0xb8, 0x24, 0xca, 0xb5, + 0xda, 0xf7, 0x28, 0x2a, 0xc2, 0xbd, 0x33, 0x21, 0x73, 0x11, 0x66, 0xa8, 0x64, 0x53, 0xb7, 0x3a, 0x0c, 0x4d, 0x66, 0x84, 0xb2, 0xf4, 0xb5, 0x58, 0x83, 0x0d, 0x37, 0x23, 0xb5, 0x18, 0x0e, 0x43, + 0x58, 0xf6, 0x16, 0xa1, 0xe7, 0x05, 0xd0, 0x62, 0xe1, 0x0b, 0xde, 0x06, 0xf1, 0xb7, 0xfa, 0x1a, 0x1f, 0xa0, 0x8a, 0xf4, 0x9c, 0x75, 0x35, 0xf1, 0x4b, 0xba, 0xd9, 0xac, 0x8e, 0xa9, 0x3b, 0x7d, + 0xe1, 0x74, 0xf2, 0x22, 0x8a, 0xf3, 0x2b, 0xc3, 0xc6, 0xe3, 0x51, 0x52, 0x87, 0xcf, 0x5c, 0x17, 0xa0, 0x9f, 0xf0, 0x3b, 0xc7, 0x2b, 0x27, 0x89, 0x27, 0x98, 0xea, 0x30, 0x1e, 0x7d, 0x88, 0xf8, + 0x1e, 0x25, 0xbb, 0x33, 0x27, 0x45, 0x2d, 0xc7, 0x73, 0x55, 0x93, 0xf9, 0x7e, 0x22, 0x5a, 0x13, 0x7d, 0x7f, 0x80, 0xe1, 0x83, 0x5c, 0xc5, 0x79, 0x63, 0xb6, 0x56, 0x47, 0xef, 0xc7, 0x15, 0xb7, + 0x64, 0x22, 0x7c, 0xb6, 0x69, 0x1c, 0xc6, 0xb2, 0x91, 0x55, 0x97, 0x2e, 0xda, 0x9e, 0x53, 0xe8, 0x7c, 0xb1, 0xad, 0xd7, 0xf0, 0x36, 0xca, 0xc4, 0x50, 0x13, 0x71, 0x26, 0x54, 0xb7, 0xa6, 0x61, + 0xcb, 0x25, 0x0f, 0xc8, 0x2f, 0xcc, 0x5e, 0x97, 0xdb, 0xfe, 0xb3, 0x3d, 0xef, 0xda, 0x28, 0x50, 0x8d, 0xac, 0x72, 0xdf, 0x24, 0xde, 0xe5, 0xcc, 0x75, 0x6b, 0x18, 0x78, 0xc8, 0x64, 0xfc, 0xf1, + 0x2a, 0x71, 0xf3, 0xea, 0x35, 0x43, 0xdc, 0x83, 0x33, 0x97, 0x9b, 0x63, 0xb2, 0xff, 0x60, 0xb7, 0xa6, 0x91, 0x8f, 0x89, 0xf0, 0x91, 0x9c, 0x67, 0x93, 0x60, 0x13, 0x3e, 0x3b, 0x7e, 0x21, 0x7f, + 0xa2, 0x6f, 0x6c, 0x3b, 0x4f, 0x02, 0x4f, 0xad, 0xdb, 0x84, 0xee, 0xe8, 0x2c, 0xe1, 0xfb, 0xc6, 0x05, 0x38, 0xa3, 0x42, 0x44, 0x6f, 0xab, 0xf5, 0xc0, 0x5c, 0x9b, 0xf1, 0x6c, 0x32, 0xe9, 0xd2, + 0x14, 0x5f, 0xd0, 0x4c, 0x0e, 0xc5, 0x84, 0x38, 0x65, 0x88, 0x24, 0x26, 0x87, 0x8d, 0x9a, 0xac, 0x80, 0x09, 0x2a, 0x62, 0xdc, 0x0c, 0xe2, 0x32, 0x87, 0x2d, 0xd3, 0xf6, 0xa0, 0x1c, 0xf4, 0xdd, + 0x8c, 0x0b, 0x75, 0x14, 0xf4, 0x73, 0x1a, 0xb7, 0x7c, 0x99, 0x64, 0x02, 0x1b, 0xdc, 0x0f, 0x84, 0x44, 0x78, 0x77, 0x4a, 0xf3, 0xb3, 0x35, 0xe2, 0xd9, 0x8c, 0xf7, 0xf7, 0x55, 0x7f, 0xf8, 0x05, + 0x70, 0xf4, 0xf8, 0xfe, 0xab, 0x7c, 0x6e, 0x76, 0x6b, 0xba, 0x47, 0x88, 0x5a, 0x6f, 0xf2, 0x3c, 0x9e, 0x19, 0xc8, 0xda, 0x94, 0x74, 0x5c, 0x39, 0xf6, 0x0d, 0x47, 0x64, 0x51, 0x54, 0x12, 0x71, + 0x7b, 0xd8, 0xe3, 0x49, 0x0c, 0x95, 0xd9, 0xb2, 0x9f, 0x18, 0x5e, 0x23, 0x97, 0xc4, 0x4a, 0x46, 0x09, 0xa4, 0x88, 0x39, 0x0d, 0x26, 0x55, 0xd1, 0x18, 0xf6, 0xc6, 0x7a, 0x32, 0x84, 0x73, 0xc7, + 0x2b, 0xb5, 0xc2, 0xe4, 0x13, 0x36, 0x9d, 0xec, 0x5e, 0xa1, 0xb0, 0x0f, 0xab, 0xdf, 0xbc, 0x63, 0x0f, 0x96, 0xe4, 0x3b, 0x4a, 0xfe, 0x5f, 0x1d, 0x0d, 0xba, 0x79, 0xed, 0x96, 0x0d, 0xf7, 0xf1, + 0x28, 0xf9, 0x15, 0xe3, 0xf3, 0xe3, 0x9e, 0xf5, 0xef, 0x92, 0x71, 0xf2, 0xc7, 0x9f, 0xf8, 0x52, 0x1f, 0xf5, 0xfe, 0xc7, 0xcd, 0x0b, 0xbf, 0x91, 0x06, 0xe1, 0x4e, 0xfa, 0xaf, 0xa6, 0xbd, 0x65, + 0x5b, 0x7c, 0x21, 0x29, 0xc2, 0x31, 0xea, 0xac, 0xe9, 0x38, 0xf5, 0x99, 0xa2, 0x5d, 0x2f, 0xa1, 0xb6, 0x22, 0x5a, 0x33, 0xef, 0x96, 0xb1, 0xeb, 0xc1, 0x7a, 0xb9, 0xd1, 0xb1, 0x66, 0x0a, 0x99, + 0x51, 0xee, 0x57, 0xc1, 0x3e, 0xb1, 0xf2, 0xd5, 0x96, 0x21, 0xa2, 0x95, 0x16, 0x98, 0x4b, 0xa0, 0x57, 0xb2, 0x95, 0x52, 0x58, 0xb3, 0x69, 0x3f, 0x83, 0x3c, 0x6e, 0xea, 0x18, 0x9d, 0x1d, 0x25, + 0xf4, 0x90, 0x49, 0x02, 0x41, 0xfb, 0xec, 0x0b, 0x13, 0xda, 0xff, 0x0b, 0x6c, 0x8b, 0xdf, 0x4f, 0x8a, 0x4f, 0xe8, 0x33, 0x7e, 0x25, 0xfc, 0xfb, 0x2f, 0x8e, 0xe9, 0xb3, 0xc8, 0x53, 0x4b, 0x9f, + 0x0b, 0xaf, 0x8c, 0x5a, 0x78, 0x54, 0xcb, 0xe2, 0x24, 0x1a, 0x88, 0x69, 0x11, 0xe9, 0x1d, 0x77, 0x30, 0x66, 0x47, 0x0a, 0x12, 0xb9, 0x66, 0xbb, 0xae, 0xf3, 0x17, 0xf2, 0xcb, 0x7d, 0x91, 0x5f, + 0x3d, 0xd6, 0x4c, 0xde, 0xa9, 0xc3, 0x59, 0x22, 0x38, 0xfa, 0xf8, 0x7b, 0x8e, 0x88, 0x7f, 0x61, 0xde, 0xd9, 0xac, 0x0d, 0x15, 0x0e, 0x29, 0x7d, 0xa5, 0xab, 0x7b, 0x4a, 0x4f, 0x27, 0xaa, 0x14, + 0x85, 0x0d, 0xb0, 0xd5, 0x82, 0x5e, 0xd5, 0x17, 0xd5, 0xd1, 0xcf, 0x89, 0xc4, 0x69, 0x8c, 0x64, 0xe2, 0xca, 0xea, 0x7a, 0x0d, 0x81, 0x74, 0x54, 0x97, 0x6a, 0x3b, 0xa3, 0x3a, 0x86, 0x44, 0xc0, + 0x84, 0xd6, 0xec, 0x7a, 0x53, 0xcd, 0xa3, 0xd9, 0xd2, 0x72, 0xa1, 0x76, 0x59, 0x65, 0xee, 0x78, 0x28, 0x15, 0x8a, 0xbd, 0xd3, 0xc3, 0x7e, 0x33, 0x57, 0x3d, 0xab, 0xee, 0xdf, 0x2b, 0x9e, 0x9f, + 0x32, 0xc1, 0xd1, 0x57, 0xe9, 0x5c, 0xe5, 0x17, 0x54, 0x4f, 0xb4, 0x75, 0xe7, 0xa1, 0x6b, 0xf6, 0x05, 0x26, 0x4c, 0x21, 0x72, 0xac, 0x6f, 0x58, 0x19, 0x53, 0x72, 0x5e, 0x96, 0x28, 0xb4, 0x8d, + 0x74, 0x2a, 0x5e, 0x6a, 0xdb, 0xa0, 0x49, 0x90, 0x83, 0xe4, 0x1c, 0xc1, 0x31, 0x2c, 0xa7, 0x88, 0x97, 0x88, 0x90, 0xdb, 0x3b, 0xa2, 0x36, 0x6e, 0x4c, 0x7d, 0xe3, 0x45, 0xed, 0xfa, 0xb8, 0xc7, + 0xd9, 0xea, 0x68, 0xbb, 0xf1, 0x6e, 0x03, 0xcc, 0x0c, 0xd6, 0xa9, 0x89, 0xdf, 0x9b, 0xec, 0xff, 0x39, 0xfd, 0xfb, 0x3f, 0xff, 0xf3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, + 0x91, 0xc3, 0x2f, 0x3c, 0x4a, 0xa2, 0x00, 0x00, 0x86, 0x2e, 0x02, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x6c, 0x92, 0x41, 0x6f, 0xe2, 0x30, 0x10, 0x85, 0xef, 0xf9, 0x15, 0x23, 0x1f, 0x38, 0x6d, 0x9c, 0x10, 0x56, 0xbb, 0x12, 0xd2, 0x1e, 0x56, 0x94, 0xb6, + 0x07, 0x44, 0x4f, 0xed, 0x11, 0x64, 0xe2, 0x01, 0x8c, 0x92, 0x71, 0xe4, 0x71, 0x50, 0x51, 0xc5, 0x7f, 0xaf, 0x6c, 0x08, 0x58, 0xa8, 0xc7, 0xcc, 0xcc, 0x7b, 0xdf, 0xbc, 0x89, 0xbf, 0x32, 0x00, + 0x41, 0xaa, 0x45, 0x31, 0x05, 0x81, 0x47, 0x24, 0x9f, 0xef, 0x15, 0xe9, 0x06, 0x9d, 0xf8, 0x15, 0x5a, 0x47, 0x74, 0x6c, 0x2c, 0x85, 0x6e, 0x29, 0xc7, 0xb2, 0xbc, 0x54, 0x35, 0x72, 0xed, 0x4c, + 0xe7, 0xaf, 0x9d, 0xa5, 0xd5, 0x28, 0x0f, 0x0c, 0xb3, 0xc6, 0xf6, 0x7a, 0x1e, 0x4c, 0xe0, 0x35, 0x35, 0x69, 0x4c, 0x8d, 0xc4, 0x11, 0xf1, 0xbf, 0x53, 0xf5, 0x1e, 0xf3, 0x6a, 0x70, 0x72, 0xd8, + 0x59, 0x36, 0xde, 0xba, 0x93, 0x98, 0x42, 0x58, 0x06, 0x40, 0xf8, 0x53, 0x17, 0x67, 0x77, 0xc6, 0xc7, 0x21, 0x00, 0xd1, 0xbb, 0x26, 0x54, 0x44, 0x06, 0x70, 0x8e, 0xba, 0x0b, 0x9f, 0x13, 0x11, + 0xb2, 0x0f, 0x23, 0x64, 0x35, 0x42, 0xf8, 0x28, 0x7a, 0x32, 0x3e, 0x6c, 0x35, 0x1a, 0xc1, 0xbd, 0x68, 0xc8, 0xe3, 0xce, 0xa9, 0xb0, 0xb9, 0x3c, 0xf0, 0x60, 0xcf, 0x5e, 0xb9, 0xa8, 0x7e, 0x7e, + 0x5f, 0xce, 0xd6, 0x8b, 0xb7, 0x97, 0xf5, 0x62, 0xfe, 0x31, 0x5f, 0xfc, 0x33, 0xb4, 0xb5, 0xb0, 0x55, 0x8a, 0xf3, 0x03, 0xe7, 0xae, 0x27, 0x6f, 0x5a, 0x04, 0x59, 0x18, 0xd2, 0xf8, 0x99, 0xc8, + 0x35, 0x6e, 0xfa, 0xdd, 0x00, 0x6f, 0x2d, 0x41, 0x9e, 0x1b, 0xe2, 0x0e, 0x6b, 0x0f, 0xb2, 0x08, 0xb5, 0x75, 0x6b, 0x75, 0xdf, 0x20, 0x17, 0x0f, 0x5e, 0xc5, 0xc6, 0x50, 0x51, 0x37, 0x26, 0xac, + 0x99, 0xd8, 0xde, 0x52, 0x6a, 0x3c, 0x3e, 0x61, 0x87, 0xa4, 0x91, 0x6a, 0x83, 0x49, 0xda, 0x2b, 0x28, 0x30, 0x57, 0x13, 0x59, 0xca, 0xf1, 0x2d, 0x49, 0xdf, 0xa1, 0x1b, 0x6e, 0xb1, 0xfa, 0x23, + 0x27, 0xf7, 0x96, 0x57, 0x97, 0xb3, 0xae, 0x7e, 0xcb, 0xf1, 0x44, 0x96, 0x29, 0xe5, 0x27, 0x44, 0x1d, 0x7e, 0x66, 0x7c, 0x11, 0x1c, 0x55, 0x7f, 0x53, 0xcc, 0x43, 0x8e, 0x38, 0x50, 0xc9, 0x4a, + 0x56, 0xd1, 0x35, 0x3b, 0x67, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9a, 0xec, 0xb0, 0xf8, 0x44, 0x01, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, + 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x8c, 0x52, 0xc1, 0x6e, 0xdb, 0x30, 0x0c, 0xbd, 0xfb, 0x2b, 0x78, 0x93, 0x0c, 0x38, 0x4a, + 0xd6, 0x6d, 0x40, 0x91, 0x22, 0xbb, 0x14, 0x05, 0xda, 0xcb, 0xb0, 0x43, 0x6e, 0xc3, 0x0e, 0xaa, 0xcc, 0xc6, 0xee, 0x6c, 0xc9, 0x15, 0xe9, 0xac, 0x41, 0xe1, 0x7f, 0x1f, 0x28, 0x3b, 0x8e, 0x97, + 0xd3, 0x4e, 0x89, 0x1f, 0x1f, 0x49, 0xbd, 0xf7, 0xa8, 0x7a, 0x42, 0x20, 0x8e, 0xb5, 0x63, 0x75, 0x97, 0xb9, 0xe0, 0x89, 0xe1, 0x03, 0x1e, 0xf7, 0xfb, 0x1f, 0x05, 0xdc, 0x37, 0xa1, 0x2f, 0x1f, + 0x8e, 0xe8, 0x19, 0x06, 0xd8, 0x41, 0xc4, 0xb7, 0xbe, 0x8e, 0xa8, 0x95, 0x13, 0x1c, 0x05, 0x27, 0x95, 0x5f, 0x9a, 0x88, 0x6d, 0xbc, 0x62, 0xbe, 0x58, 0x4b, 0xab, 0x57, 0x5a, 0xc5, 0xde, 0x73, + 0xdd, 0xe2, 0x85, 0x2d, 0x0c, 0x24, 0x5e, 0x72, 0xa9, 0xef, 0x30, 0x32, 0x12, 0x0b, 0x6b, 0xa2, 0xbd, 0xf4, 0xde, 0x2d, 0x39, 0xc6, 0xa8, 0xdc, 0x54, 0xd6, 0x97, 0x0d, 0x9e, 0x27, 0xf1, 0xd5, + 0x18, 0xb6, 0x1d, 0x2e, 0x26, 0x94, 0x96, 0x2d, 0xec, 0xe0, 0x23, 0x03, 0xf0, 0xb6, 0xc5, 0x2d, 0x28, 0xae, 0x0f, 0x18, 0x55, 0x91, 0x01, 0xb8, 0x9e, 0x38, 0xb4, 0x18, 0x9f, 0xca, 0x2d, 0xa8, + 0xcd, 0xa7, 0x9b, 0xcf, 0x5f, 0x54, 0x36, 0x9c, 0x1b, 0x31, 0xc6, 0xc7, 0xb4, 0x28, 0xc2, 0x0e, 0x18, 0x76, 0xdf, 0x04, 0x91, 0x1f, 0x19, 0xc5, 0x06, 0x63, 0x0c, 0x51, 0x63, 0x8c, 0xf9, 0xdd, + 0xf8, 0xed, 0x4b, 0x9d, 0xdf, 0x65, 0xc3, 0xbc, 0xb8, 0x45, 0x22, 0x7b, 0x40, 0xd8, 0x25, 0x33, 0xcd, 0x73, 0xed, 0x6d, 0x3c, 0x69, 0x8f, 0x7f, 0x16, 0xb6, 0xea, 0x34, 0xeb, 0xd4, 0xc9, 0xb3, + 0x5c, 0x68, 0x0d, 0xbe, 0xdb, 0xb6, 0x6b, 0xd0, 0x24, 0x17, 0xe4, 0x85, 0x14, 0xfa, 0xe8, 0xa4, 0x5a, 0x31, 0x77, 0xdb, 0xf5, 0xba, 0x09, 0xce, 0x36, 0x55, 0x20, 0xde, 0xde, 0x6e, 0x6e, 0x37, + 0x89, 0x22, 0x02, 0xb3, 0x21, 0x17, 0xc5, 0xd2, 0xa6, 0xd5, 0x93, 0x67, 0x3c, 0x44, 0xcb, 0x75, 0xf0, 0x5b, 0x18, 0xbd, 0x22, 0xb0, 0x70, 0xb4, 0x4d, 0x5d, 0x42, 0x4a, 0x4d, 0x15, 0xa3, 0x20, + 0xd9, 0x9e, 0x42, 0xd3, 0xe2, 0x73, 0x6e, 0xb8, 0x42, 0xaf, 0x09, 0xe3, 0x11, 0x67, 0xa1, 0x22, 0xad, 0x6b, 0xac, 0xd7, 0x5f, 0x93, 0x4e, 0x38, 0x07, 0x37, 0xd1, 0xf2, 0x84, 0x01, 0x98, 0x2e, + 0xc8, 0xea, 0xb5, 0x9a, 0x01, 0x12, 0x43, 0x26, 0x0f, 0xcc, 0x73, 0x28, 0x4f, 0x8b, 0x0a, 0xcf, 0x85, 0x0a, 0x6d, 0x89, 0x91, 0xe6, 0x1a, 0xbe, 0x77, 0xe8, 0x58, 0xdf, 0x6c, 0x36, 0xd7, 0x90, + 0xba, 0x0f, 0x9e, 0xd1, 0xf3, 0x6a, 0x7f, 0xea, 0x50, 0x15, 0xb0, 0x7e, 0xa5, 0xe0, 0xd7, 0x17, 0x96, 0x2f, 0xb5, 0xa4, 0x51, 0x40, 0x44, 0xea, 0x1b, 0xce, 0x2f, 0x02, 0x46, 0x11, 0x73, 0x5e, + 0x05, 0xa8, 0xef, 0x01, 0xd2, 0xa7, 0x9a, 0x34, 0x8d, 0x8c, 0xf0, 0x5b, 0x4f, 0xbd, 0x4b, 0xb4, 0x44, 0xec, 0x1e, 0xde, 0x7a, 0xdb, 0x4c, 0xc5, 0xa4, 0xa5, 0x48, 0xae, 0xff, 0xc3, 0xc3, 0x25, + 0x67, 0x92, 0xf5, 0x53, 0x39, 0x5c, 0x49, 0xbc, 0xea, 0x57, 0x01, 0x0a, 0x5d, 0x15, 0xd4, 0xff, 0xf5, 0x8c, 0xb1, 0x8f, 0x5d, 0x12, 0xd8, 0x74, 0xf2, 0x57, 0x0f, 0x9e, 0x4e, 0xee, 0x0c, 0x8c, + 0x89, 0x18, 0xd7, 0x04, 0xc2, 0x0b, 0x3e, 0xa4, 0x7f, 0x43, 0xb1, 0xb8, 0x67, 0xcd, 0x72, 0x2d, 0x52, 0xf8, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4c, 0x78, 0x33, 0xb8, 0xe6, + 0x01, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, + 0x6a, 0x73, 0x6c, 0x52, 0xcb, 0x6e, 0x23, 0x21, 0x10, 0xbc, 0xf3, 0x15, 0x75, 0x63, 0x2c, 0x8d, 0xf0, 0x3e, 0x72, 0x1a, 0xcb, 0x2b, 0xad, 0x56, 0x39, 0xe4, 0x03, 0xf6, 0x1c, 0x21, 0xe8, 0x64, + 0x50, 0x18, 0x70, 0xa0, 0xf1, 0xac, 0x65, 0xf9, 0xdf, 0x57, 0x30, 0x8e, 0x3d, 0x91, 0x72, 0xa4, 0xba, 0x44, 0xd7, 0xa3, 0x65, 0xc9, 0x84, 0xcc, 0xc9, 0x19, 0x96, 0x3b, 0x21, 0x4c, 0x0c, 0x99, + 0xf1, 0x52, 0x82, 0xc1, 0x1e, 0x89, 0xde, 0x8b, 0x4b, 0xd4, 0x49, 0xa5, 0xe4, 0x46, 0x8d, 0x3a, 0x58, 0x4f, 0xbb, 0x2b, 0x85, 0x29, 0xf3, 0x9a, 0xc2, 0xfa, 0x40, 0x72, 0xf3, 0x31, 0x3d, 0xe3, + 0x8f, 0x8f, 0xc5, 0x3e, 0x1e, 0x29, 0x30, 0x2e, 0x6b, 0x9e, 0xa9, 0x38, 0x55, 0x3c, 0x57, 0xba, 0xd8, 0x6e, 0xf1, 0x18, 0x72, 0x49, 0x04, 0x1e, 0x35, 0x83, 0x47, 0x6a, 0xdb, 0xd9, 0xc5, 0x00, + 0x13, 0xa7, 0x83, 0x27, 0xa6, 0x0c, 0xe3, 0x49, 0x07, 0x7f, 0xc2, 0x3c, 0x52, 0xc0, 0x41, 0xe7, 0x4c, 0x16, 0x1a, 0x47, 0xed, 0x9d, 0x45, 0xfb, 0x4c, 0x89, 0x2a, 0xa8, 0x93, 0x7f, 0x83, 0xe3, + 0x01, 0x8b, 0xd4, 0xfc, 0x99, 0x22, 0x7b, 0xe8, 0x7c, 0x0a, 0x06, 0x8c, 0xfd, 0x2f, 0x9c, 0x05, 0xc0, 0xea, 0xe0, 0x75, 0xe8, 0x1e, 0x36, 0x3b, 0x01, 0x2c, 0xc2, 0xad, 0x66, 0x8d, 0x7d, 0x9b, + 0x02, 0x41, 0x4f, 0x34, 0x40, 0xb2, 0x7b, 0xa5, 0x24, 0xfb, 0x06, 0x99, 0x92, 0x39, 0x4e, 0x94, 0x9e, 0xec, 0x00, 0xf9, 0xed, 0xfb, 0x8f, 0x9f, 0x0f, 0x52, 0x00, 0x17, 0x21, 0x80, 0xed, 0x16, + 0xbf, 0xd7, 0xfb, 0xe0, 0x82, 0xf1, 0xc5, 0x52, 0x86, 0xb3, 0x3d, 0xf8, 0x74, 0x20, 0xe8, 0x60, 0x91, 0x63, 0x49, 0x86, 0xa0, 0x19, 0x1a, 0x93, 0x0b, 0x6e, 0x2a, 0x93, 0xba, 0xad, 0xbf, 0xa7, + 0x83, 0x3d, 0x02, 0xcd, 0xab, 0x18, 0xbb, 0x45, 0x93, 0xbb, 0x2f, 0x5e, 0x14, 0xd5, 0x8f, 0x07, 0x48, 0x13, 0x27, 0x45, 0xff, 0x74, 0x0d, 0x4c, 0xad, 0x32, 0x56, 0x35, 0x96, 0x2b, 0x73, 0xd9, + 0x3c, 0x40, 0x6e, 0x57, 0x60, 0x35, 0x5c, 0x1d, 0xd4, 0x2e, 0x9a, 0x87, 0xa7, 0x70, 0x8c, 0x6f, 0xf4, 0xb9, 0x88, 0xd9, 0xf1, 0xd8, 0x90, 0x95, 0xbd, 0x1e, 0xf3, 0xe8, 0xcc, 0x88, 0x3c, 0xc6, + 0xe2, 0xed, 0xad, 0xab, 0xc6, 0x8d, 0x85, 0x41, 0x29, 0xc5, 0x74, 0x77, 0x96, 0x28, 0x17, 0x5f, 0x5d, 0xe9, 0x59, 0xbb, 0xe5, 0xc2, 0xba, 0x33, 0x7c, 0x7c, 0x1d, 0x70, 0x86, 0x0b, 0x2f, 0x71, + 0x40, 0xf7, 0xbc, 0xa9, 0xcd, 0x3c, 0xe3, 0x82, 0x4b, 0xbf, 0x8a, 0xa2, 0xd5, 0xc3, 0x2a, 0xbe, 0x75, 0xcb, 0x27, 0xd7, 0x37, 0xbd, 0x17, 0xed, 0xaf, 0x90, 0xaa, 0x36, 0xfa, 0x66, 0xe6, 0xab, + 0x69, 0xcd, 0xa8, 0x87, 0x24, 0x33, 0x46, 0xf9, 0xd5, 0x7c, 0x49, 0xa6, 0x32, 0xda, 0x2d, 0x2d, 0xe7, 0x93, 0x6e, 0xd4, 0x60, 0xbb, 0xcd, 0x4e, 0xd4, 0x88, 0xfe, 0x07, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0xa3, 0xd1, 0x71, 0xb2, 0x9e, 0x01, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xac, 0x58, 0x6d, 0x6f, 0x1c, 0xb7, 0x11, 0xfe, 0xbe, 0xbf, 0x62, 0x6a, 0x7d, 0x88, 0x64, 0x9c, 0xf6, 0x04, 0x17, 0x05, 0x82, 0x53, 0x6c, + 0xc1, 0x76, 0xd5, 0x4a, 0xa9, 0x60, 0x1b, 0x92, 0x92, 0xb4, 0x50, 0x85, 0x92, 0xb7, 0x9c, 0xbb, 0xa5, 0xcc, 0x25, 0x37, 0x24, 0xf7, 0x4e, 0xdb, 0x38, 0xff, 0xbd, 0x18, 0x92, 0xfb, 0xa6, 0x3b, + 0xb9, 0x09, 0xda, 0x4f, 0xd2, 0x91, 0xc3, 0xe1, 0x33, 0x33, 0xcf, 0xbc, 0x70, 0x0f, 0xe0, 0x83, 0x11, 0x98, 0x3f, 0x38, 0xb8, 0xb8, 0xbd, 0xfd, 0x04, 0x7f, 0x69, 0x74, 0xe1, 0xa5, 0xd1, 0x59, + 0xf6, 0x13, 0xaa, 0xc2, 0x54, 0x08, 0xde, 0x40, 0x6b, 0x1a, 0x0b, 0x1a, 0xb7, 0xbd, 0xe8, 0x2a, 0x49, 0x41, 0x6d, 0xcd, 0x03, 0x16, 0xfe, 0x0f, 0x70, 0x5b, 0x22, 0x2c, 0x8d, 0x54, 0x68, 0x6b, + 0xc5, 0x3d, 0x0e, 0x12, 0x85, 0x11, 0x08, 0x05, 0xd7, 0xb0, 0x44, 0x58, 0x99, 0x46, 0x0b, 0x90, 0x1a, 0xee, 0x98, 0xd4, 0x02, 0x1f, 0xf3, 0x07, 0xc7, 0xee, 0x0f, 0xf3, 0x79, 0xf7, 0xe3, 0x28, + 0x87, 0xdb, 0x52, 0x8e, 0xd4, 0x6f, 0xa5, 0x52, 0x60, 0xd1, 0xd5, 0x46, 0x0b, 0x02, 0x22, 0x75, 0x61, 0x2a, 0xa9, 0xd7, 0x11, 0xeb, 0x5f, 0xcf, 0x6f, 0x81, 0x6b, 0x01, 0x9f, 0x3e, 0xde, 0xdc, + 0x82, 0xc5, 0x9f, 0x1b, 0x74, 0xde, 0x25, 0x15, 0xf8, 0xc8, 0xab, 0x5a, 0x8d, 0x70, 0x48, 0x07, 0x5b, 0x2b, 0xbd, 0x47, 0x0d, 0xae, 0xd5, 0x45, 0x69, 0x8d, 0x36, 0x8d, 0x53, 0xed, 0x0c, 0x2c, + 0xfa, 0xc6, 0x6a, 0xd2, 0xca, 0xc1, 0xf2, 0x2d, 0x6c, 0xb8, 0x6a, 0x30, 0x87, 0xcb, 0x55, 0xb4, 0x7b, 0xb0, 0x15, 0xed, 0xca, 0xd8, 0xca, 0x01, 0xd7, 0x2d, 0xf0, 0x91, 0x12, 0xc0, 0x47, 0x2c, + 0x1a, 0x92, 0x99, 0xd1, 0x91, 0x60, 0xad, 0xe3, 0x2b, 0x54, 0x2d, 0x70, 0x21, 0xc0, 0x97, 0x08, 0x2c, 0xc8, 0x33, 0xf8, 0x8c, 0xed, 0xd6, 0xd8, 0x60, 0x0b, 0x2d, 0x77, 0xba, 0x67, 0xc1, 0x8e, + 0x08, 0x04, 0x38, 0xb0, 0x4f, 0xd6, 0x54, 0xd2, 0x21, 0xcb, 0xb3, 0xec, 0xe0, 0x00, 0xae, 0x4c, 0xc1, 0xd5, 0x70, 0x49, 0x96, 0xbd, 0x5d, 0x79, 0xb4, 0xdd, 0x82, 0x5e, 0x03, 0xd3, 0x75, 0x05, + 0x52, 0x3b, 0xcf, 0x95, 0x62, 0x03, 0x06, 0xdb, 0x68, 0xf0, 0x13, 0x7f, 0x2a, 0xd2, 0xa4, 0x5a, 0x58, 0xb6, 0x4f, 0x4f, 0x93, 0x6c, 0xd8, 0xa5, 0x3b, 0x29, 0x98, 0xb6, 0xd1, 0x5e, 0x56, 0x18, + 0x43, 0x80, 0x8f, 0xb5, 0x71, 0x08, 0xbe, 0xb4, 0x88, 0x80, 0x5a, 0xd4, 0x46, 0x6a, 0xef, 0xf2, 0x2c, 0x03, 0x78, 0x09, 0x6c, 0xce, 0x42, 0xf8, 0xbb, 0x75, 0x58, 0x19, 0x3b, 0x75, 0x5d, 0x9e, + 0xe4, 0x4a, 0xe4, 0xca, 0x97, 0x73, 0x8b, 0x5c, 0x48, 0x8d, 0xce, 0xed, 0x39, 0xc7, 0xa1, 0xdf, 0x85, 0x28, 0x0e, 0x45, 0x89, 0xc5, 0xe7, 0xa9, 0x06, 0x25, 0x37, 0xf8, 0xac, 0x82, 0x6e, 0x73, + 0x7a, 0x3e, 0x18, 0x55, 0x73, 0xcb, 0x2b, 0x24, 0xe7, 0xd5, 0xd6, 0x6c, 0xa4, 0xc0, 0x9d, 0x48, 0x0c, 0xca, 0xb8, 0x07, 0xa9, 0x37, 0xa6, 0xe0, 0x1d, 0x7d, 0x38, 0xb0, 0xf7, 0x46, 0x7b, 0x7c, + 0xf4, 0x0c, 0xcc, 0x92, 0x68, 0x0f, 0x85, 0xd1, 0x9e, 0x4b, 0xdd, 0x33, 0x32, 0x91, 0x10, 0xa4, 0x26, 0xa6, 0xf0, 0x68, 0x7b, 0xc6, 0x18, 0x7b, 0x70, 0x59, 0x7f, 0x43, 0xc9, 0xb5, 0x50, 0x78, + 0x1d, 0x45, 0x0f, 0x8b, 0xa8, 0xf2, 0x08, 0x7e, 0xc9, 0x80, 0xf4, 0x39, 0x0f, 0xca, 0xac, 0xe1, 0x35, 0xa4, 0x8d, 0x5c, 0x99, 0xf5, 0x69, 0x06, 0xb4, 0x98, 0x93, 0xda, 0xee, 0x40, 0x5e, 0x7a, + 0x5f, 0xff, 0x88, 0xd6, 0x49, 0xa3, 0x8f, 0xf6, 0x0a, 0x54, 0xe8, 0x4b, 0x23, 0x8e, 0x4e, 0x61, 0x3e, 0x0f, 0x26, 0x4e, 0x10, 0xc6, 0x4d, 0x38, 0x34, 0x5a, 0xb5, 0x21, 0x91, 0x8c, 0x8d, 0x79, + 0xe4, 0x9a, 0xba, 0x36, 0xd6, 0xa3, 0x38, 0xda, 0xa7, 0xf3, 0xe7, 0x06, 0x6d, 0x1b, 0x55, 0xca, 0x15, 0x84, 0x5f, 0x83, 0x53, 0x1d, 0x70, 0x8b, 0x83, 0x67, 0x25, 0x51, 0x99, 0x54, 0xa7, 0x3b, + 0xf7, 0xe9, 0x5b, 0x1a, 0x91, 0xd4, 0x25, 0x57, 0xba, 0x00, 0xb5, 0x43, 0x49, 0xdb, 0x29, 0xaa, 0xe3, 0x24, 0xdf, 0xeb, 0x0e, 0xe4, 0x02, 0xad, 0x8b, 0xca, 0xb8, 0x52, 0xd1, 0xdc, 0xb4, 0x0a, + 0x0e, 0xb5, 0x87, 0xad, 0xf4, 0x65, 0x50, 0x8f, 0x1b, 0xd4, 0x3e, 0xfb, 0x95, 0x02, 0x13, 0x79, 0x31, 0x66, 0x8a, 0xeb, 0xaa, 0x15, 0x2f, 0x0a, 0x74, 0x2e, 0x1a, 0x12, 0xe8, 0xbc, 0xb4, 0x66, + 0xeb, 0xd0, 0x12, 0x33, 0xee, 0xc8, 0xfb, 0x8b, 0xf9, 0x3c, 0xa4, 0x4c, 0x69, 0x9c, 0x5f, 0x7c, 0x7b, 0xf2, 0xed, 0xc9, 0x0e, 0xc1, 0xef, 0x0f, 0x8f, 0x42, 0x66, 0x7f, 0x5d, 0xbc, 0x23, 0xec, + 0xfd, 0xe1, 0x51, 0x0e, 0xff, 0x48, 0xc9, 0xdb, 0x38, 0x04, 0x56, 0x34, 0x56, 0x31, 0xa2, 0x28, 0x23, 0xf3, 0x19, 0x70, 0x1d, 0xb1, 0x3f, 0xcb, 0xda, 0x45, 0x60, 0x1b, 0xd1, 0xc8, 0x28, 0xcc, + 0xe8, 0x38, 0x1c, 0xff, 0x3d, 0xfa, 0xee, 0x58, 0xc0, 0x37, 0xbf, 0xbc, 0x28, 0x51, 0x29, 0xf3, 0x62, 0x01, 0x2f, 0xb6, 0xc6, 0x2a, 0xf1, 0xe2, 0xd7, 0x6f, 0xe0, 0x9f, 0x19, 0xc0, 0xf1, 0xc5, + 0x37, 0x81, 0xda, 0xda, 0x1f, 0xfb, 0xb6, 0xc6, 0x05, 0xf0, 0xba, 0x56, 0x32, 0x52, 0x7f, 0xfe, 0xe0, 0x8c, 0x8e, 0x62, 0x7b, 0xad, 0x18, 0xbc, 0x38, 0x64, 0x2e, 0xd9, 0xdc, 0xa7, 0x61, 0x5f, + 0x2f, 0x82, 0x4d, 0x77, 0x66, 0x83, 0x56, 0x19, 0x2e, 0x8e, 0x6b, 0x6b, 0x3c, 0x06, 0xf8, 0xf7, 0x87, 0xa4, 0xd9, 0x2d, 0xe6, 0xf3, 0xed, 0x76, 0x9b, 0xeb, 0xba, 0x7a, 0x70, 0x79, 0x61, 0xaa, + 0x79, 0xcd, 0x8b, 0xcf, 0x7c, 0x8d, 0xf3, 0x3d, 0x47, 0xa2, 0x5f, 0x27, 0xfd, 0x21, 0x84, 0x97, 0x85, 0xb0, 0xff, 0xe9, 0xe4, 0x8f, 0x70, 0x83, 0x76, 0x23, 0x0b, 0x84, 0x1f, 0x34, 0xdf, 0x70, + 0xa9, 0xf8, 0x52, 0x21, 0x8b, 0x32, 0x94, 0xc8, 0x4a, 0x92, 0xb1, 0xd7, 0xe8, 0x6d, 0xcb, 0x12, 0x4b, 0x88, 0xd1, 0xd3, 0x8a, 0x2f, 0x1d, 0x08, 0x22, 0x76, 0x25, 0x75, 0xac, 0x14, 0x4b, 0x84, + 0x0e, 0x0b, 0x8a, 0x19, 0x2c, 0x39, 0xd1, 0xc3, 0xe8, 0x10, 0x8b, 0x0a, 0x2b, 0x63, 0x5b, 0x68, 0x1c, 0x5f, 0x63, 0x00, 0x17, 0x23, 0xa5, 0x8c, 0xa9, 0x41, 0xa0, 0xe2, 0x6d, 0x2c, 0xe6, 0xe4, + 0xa8, 0xae, 0xc9, 0xc2, 0xa5, 0xf6, 0x68, 0x57, 0xbc, 0xc0, 0xe8, 0xc0, 0xa1, 0x2b, 0xc2, 0x4a, 0x2a, 0x84, 0x8a, 0xb7, 0xa1, 0xf4, 0x5a, 0x0f, 0x1c, 0x9c, 0xd4, 0xeb, 0x71, 0x43, 0x0b, 0x59, + 0xc1, 0x3a, 0x55, 0x2c, 0x8b, 0x25, 0x29, 0x0f, 0x17, 0x0c, 0xcb, 0x5d, 0xa5, 0xe2, 0x4a, 0x99, 0x2d, 0x99, 0xb3, 0x41, 0x65, 0x6a, 0x4a, 0x09, 0x6f, 0x42, 0x77, 0x52, 0x72, 0x85, 0x45, 0x5b, + 0x28, 0x84, 0xd2, 0x98, 0xcf, 0x8e, 0xb2, 0x2d, 0x93, 0x5a, 0x7a, 0xc9, 0x95, 0xfc, 0x77, 0xac, 0x7d, 0x64, 0x8c, 0x2b, 0x1b, 0x2f, 0xcc, 0x96, 0x3a, 0x95, 0x83, 0x2d, 0x2a, 0x45, 0x7f, 0x63, + 0xaa, 0xc7, 0xce, 0xb9, 0xe5, 0x6d, 0xe8, 0xd0, 0xd4, 0x75, 0x2b, 0x32, 0xbc, 0x68, 0x9c, 0x37, 0x55, 0x36, 0x49, 0xad, 0xd4, 0x5b, 0x46, 0xf0, 0x64, 0xe7, 0x81, 0xe8, 0xec, 0x55, 0xf0, 0x34, + 0x77, 0x91, 0xc7, 0xc4, 0x45, 0x57, 0x58, 0x59, 0xfb, 0x2c, 0xb9, 0x61, 0x10, 0xef, 0x7d, 0x48, 0x75, 0x73, 0x3e, 0x0f, 0x66, 0x3f, 0xc1, 0x3d, 0x74, 0x57, 0xea, 0x7a, 0x28, 0x60, 0x89, 0x2b, + 0x63, 0x31, 0x44, 0xcb, 0xa1, 0xdd, 0x50, 0xc8, 0x1d, 0x38, 0xcf, 0xa9, 0xdc, 0x75, 0x5a, 0xc6, 0xed, 0x52, 0x3a, 0x30, 0x35, 0xfd, 0xc7, 0x55, 0x72, 0x82, 0x69, 0x14, 0xa9, 0x19, 0x8f, 0x10, + 0xd4, 0xdc, 0xe8, 0xe2, 0xb3, 0x05, 0x1c, 0x1e, 0xc1, 0xeb, 0x37, 0x34, 0x1e, 0x9c, 0x66, 0x03, 0xa8, 0xce, 0x73, 0xbb, 0x70, 0x78, 0x68, 0xe3, 0x4f, 0xd1, 0x98, 0xba, 0xfe, 0x1f, 0xd1, 0x74, + 0x37, 0x3e, 0x87, 0xa8, 0xcf, 0xcc, 0x1d, 0x44, 0xde, 0xc4, 0x40, 0x51, 0x2a, 0x4c, 0x71, 0x71, 0x3a, 0xf4, 0x3b, 0x50, 0xa5, 0x59, 0xe6, 0xd5, 0xc9, 0xc9, 0xfc, 0xe3, 0xdf, 0x9e, 0x51, 0x47, + 0x58, 0x3b, 0x2c, 0x67, 0x0b, 0xb8, 0x08, 0x4c, 0x79, 0x4f, 0xf7, 0x8f, 0xd1, 0x0e, 0x55, 0xe5, 0x77, 0xc0, 0xa5, 0x43, 0x81, 0x8f, 0x54, 0xc4, 0x6b, 0xdf, 0x4f, 0x87, 0xff, 0x3f, 0x0b, 0xc2, + 0x0d, 0x64, 0x41, 0x8f, 0x6f, 0x8f, 0x09, 0xca, 0xac, 0xaf, 0x28, 0xe3, 0xce, 0x16, 0x70, 0x95, 0xfe, 0x1d, 0x9b, 0xd6, 0x43, 0xf0, 0x26, 0x4d, 0x05, 0x93, 0x26, 0x4d, 0x68, 0xe3, 0xf2, 0x02, + 0xde, 0x2b, 0xd3, 0x88, 0x73, 0xaa, 0x28, 0x3d, 0xf1, 0xbf, 0x04, 0xe1, 0xee, 0xe7, 0x69, 0xd7, 0xcf, 0x0e, 0x0e, 0xe0, 0x22, 0xea, 0xba, 0x91, 0x6b, 0xcd, 0x7d, 0x63, 0x53, 0x75, 0x09, 0xaa, + 0x07, 0xab, 0x7f, 0x63, 0xe2, 0x0d, 0x72, 0xe3, 0xdb, 0x42, 0xd6, 0x75, 0xbd, 0x77, 0x01, 0x69, 0x2e, 0x9a, 0x85, 0x86, 0x7d, 0xb6, 0x80, 0xcb, 0x34, 0xa7, 0xbf, 0xa3, 0xf6, 0xbe, 0x98, 0x9c, + 0xbc, 0x0e, 0x6e, 0xed, 0xd1, 0xfe, 0x54, 0x62, 0xca, 0x48, 0x36, 0x3e, 0xc4, 0x08, 0x15, 0x4a, 0x5f, 0x52, 0xbb, 0x05, 0xe7, 0xad, 0xd4, 0xeb, 0x19, 0x70, 0x78, 0xd7, 0xac, 0x56, 0x68, 0xe9, + 0xbf, 0xef, 0xf9, 0x86, 0xdf, 0x04, 0x88, 0xa9, 0xc4, 0xcd, 0xa8, 0x22, 0x36, 0x3a, 0x99, 0x32, 0x03, 0x81, 0x35, 0xea, 0x50, 0x9c, 0xe8, 0x21, 0x51, 0x72, 0x0f, 0x5b, 0xee, 0xc2, 0x78, 0xa3, + 0x64, 0x6c, 0xea, 0xfd, 0x50, 0x14, 0xfa, 0x63, 0x85, 0x2e, 0x94, 0x6e, 0x32, 0x21, 0x55, 0xd1, 0x8b, 0xdb, 0x1d, 0xe0, 0x0c, 0xc8, 0x37, 0xff, 0xc5, 0x67, 0x41, 0x64, 0xd7, 0x68, 0x78, 0x0d, + 0x69, 0xb0, 0xff, 0xee, 0xc6, 0xdb, 0xa6, 0xa0, 0xd0, 0x88, 0xb8, 0xf5, 0x06, 0xbe, 0xc0, 0xd3, 0x35, 0xf8, 0x02, 0xd7, 0xa1, 0xb5, 0x39, 0x24, 0x97, 0xc0, 0x17, 0xd8, 0x18, 0x29, 0x4e, 0x77, + 0xfc, 0xf6, 0xf4, 0x1c, 0x8b, 0xc3, 0xea, 0x8e, 0x83, 0x86, 0xf9, 0x67, 0x65, 0xa8, 0x1b, 0x90, 0x6b, 0x6a, 0x4b, 0xcd, 0xc0, 0x4b, 0xfc, 0x5a, 0xe0, 0x77, 0x80, 0x51, 0xf0, 0x9d, 0xe7, 0xbe, + 0x71, 0xef, 0x8d, 0xc0, 0xb3, 0x05, 0xe8, 0xa6, 0x5a, 0xa2, 0xa5, 0x29, 0x34, 0x0d, 0x5c, 0x67, 0x0b, 0xb8, 0xc6, 0xc2, 0x58, 0xf1, 0x5d, 0x17, 0xbb, 0xf8, 0xf7, 0x0d, 0xc9, 0x24, 0x92, 0x8c, + 0x8d, 0xeb, 0xf9, 0x70, 0xb9, 0x9a, 0x0e, 0x36, 0x31, 0x0b, 0xc3, 0xf0, 0xbd, 0x6b, 0x67, 0x17, 0x78, 0x5f, 0x62, 0x8c, 0x26, 0x1b, 0x50, 0xb1, 0x90, 0xcb, 0x2c, 0xe1, 0x61, 0x23, 0x4b, 0xc3, + 0x94, 0xda, 0xb8, 0x54, 0x3f, 0x68, 0xe2, 0x26, 0xbd, 0xe3, 0x11, 0x39, 0xe2, 0x0a, 0x4f, 0xc0, 0xa0, 0x75, 0x19, 0x18, 0x99, 0x34, 0xb4, 0xe4, 0xde, 0xda, 0x22, 0x8d, 0x94, 0x33, 0x90, 0x9e, + 0x7e, 0x06, 0x6d, 0xbc, 0x9b, 0x5d, 0xe3, 0xf1, 0x44, 0xa4, 0xe7, 0x0c, 0x62, 0x14, 0x4c, 0x46, 0x9c, 0x65, 0x3d, 0x69, 0xd9, 0xc8, 0x94, 0x89, 0x9a, 0x90, 0x0d, 0x55, 0xed, 0xdb, 0xae, 0x81, + 0x8e, 0x7d, 0xf7, 0x5c, 0xae, 0xec, 0xcf, 0x90, 0x2e, 0x87, 0xf2, 0xdd, 0x7d, 0x17, 0xe7, 0xa9, 0x65, 0x28, 0x73, 0xa1, 0x8f, 0x46, 0xab, 0xbe, 0xbf, 0xf9, 0xf8, 0x21, 0x4f, 0xc7, 0xc6, 0x32, + 0xf4, 0x48, 0x72, 0xb0, 0x94, 0x9a, 0xdb, 0x16, 0x04, 0xf7, 0x3c, 0x4c, 0x38, 0x07, 0xa9, 0x0a, 0x42, 0x28, 0x83, 0xee, 0x2b, 0x1d, 0x9f, 0x2b, 0x67, 0xba, 0xc1, 0x84, 0x86, 0x7c, 0x32, 0x9b, + 0x0b, 0x21, 0xe3, 0x78, 0xb3, 0xa2, 0x98, 0x0f, 0x0f, 0xbd, 0x10, 0xcd, 0xd1, 0xcb, 0xb1, 0x7f, 0x5b, 0x52, 0xaa, 0xba, 0xc1, 0xc1, 0xd3, 0xf0, 0x0e, 0xe3, 0xc8, 0x74, 0xc4, 0xef, 0xae, 0x9b, + 0x68, 0x19, 0x5f, 0x37, 0xee, 0x0e, 0xcf, 0x74, 0x9b, 0xb1, 0x48, 0xec, 0x67, 0x51, 0xc9, 0x1e, 0x90, 0xbf, 0x51, 0xcb, 0x73, 0x5d, 0x2b, 0xb0, 0x28, 0x45, 0xd8, 0x84, 0x63, 0x13, 0x83, 0x87, + 0x1c, 0xd1, 0x46, 0x1f, 0xbf, 0x3a, 0x39, 0x49, 0xc9, 0x19, 0xbe, 0xbd, 0x8c, 0x28, 0x35, 0x41, 0x63, 0xb4, 0x93, 0x02, 0x2d, 0x0a, 0x68, 0x74, 0xf4, 0x0d, 0x91, 0xeb, 0xed, 0xc4, 0x4f, 0x4f, + 0x26, 0xe1, 0x67, 0xeb, 0xdd, 0xfc, 0xe5, 0xcb, 0x0c, 0x5e, 0x06, 0xeb, 0x47, 0x1d, 0x70, 0x14, 0x69, 0x11, 0x24, 0x97, 0x94, 0x7b, 0xfb, 0x2f, 0x98, 0xd1, 0x79, 0xa9, 0x0b, 0xd5, 0x84, 0x8a, + 0x4d, 0x68, 0xfb, 0x9e, 0x5c, 0x73, 0x2a, 0x5b, 0x06, 0xb6, 0xa5, 0x2c, 0x4a, 0x4a, 0xb8, 0x61, 0xf0, 0x59, 0x9a, 0x46, 0x8b, 0x3c, 0x83, 0x97, 0xf3, 0xdd, 0x01, 0x71, 0x8c, 0x24, 0x74, 0xab, + 0xe4, 0xcd, 0x05, 0x5c, 0x78, 0x5f, 0xbf, 0xba, 0x09, 0x9d, 0x3c, 0xbd, 0xc2, 0x67, 0x60, 0xb1, 0x56, 0xed, 0x93, 0xad, 0x98, 0x62, 0x47, 0x8b, 0x38, 0x3f, 0x41, 0x00, 0x72, 0xb6, 0x48, 0x19, + 0xd6, 0x57, 0xac, 0x77, 0x2d, 0xb9, 0x86, 0x37, 0x2a, 0x16, 0xa2, 0x27, 0x44, 0x23, 0x32, 0x06, 0x94, 0xdd, 0x93, 0x6d, 0xcf, 0x37, 0x8c, 0x40, 0xed, 0x3d, 0x1f, 0x47, 0xe8, 0x3e, 0x37, 0xbc, + 0x08, 0xe9, 0xe5, 0x61, 0xa5, 0xc0, 0xf8, 0x4d, 0x67, 0xd9, 0x82, 0x43, 0xef, 0x3b, 0x6f, 0x31, 0x12, 0x1e, 0xd5, 0xa8, 0xf4, 0x28, 0x61, 0x23, 0x2f, 0xb0, 0x71, 0x19, 0x78, 0x7a, 0xfc, 0xea, + 0xf2, 0xc7, 0xf3, 0x0f, 0xe7, 0x37, 0x37, 0xff, 0xfa, 0xe1, 0xfa, 0x2a, 0x21, 0xba, 0x3e, 0x7f, 0xfb, 0xe7, 0xcb, 0x61, 0x0d, 0xf5, 0x46, 0x5a, 0xa3, 0x43, 0x32, 0x6d, 0xb8, 0x95, 0xf4, 0xa0, + 0x72, 0x79, 0x78, 0xd2, 0xa0, 0x23, 0x45, 0x94, 0xe9, 0x72, 0xf7, 0xdb, 0x60, 0x0a, 0x6b, 0x88, 0xfd, 0x5d, 0xa3, 0xa5, 0x07, 0x8f, 0xce, 0xdf, 0x1f, 0xe6, 0x73, 0xfa, 0x3b, 0xa7, 0x95, 0xfc, + 0xc1, 0xc5, 0xf7, 0x1c, 0xd7, 0x70, 0x47, 0x11, 0x5c, 0xdb, 0x38, 0xc1, 0x4f, 0x24, 0x47, 0x1b, 0xf1, 0x5b, 0xe1, 0x5b, 0xa5, 0x80, 0xf5, 0xaf, 0x25, 0xd7, 0xb5, 0x74, 0x12, 0x06, 0x21, 0x2d, + 0x16, 0x9e, 0x1e, 0x64, 0x14, 0x01, 0xdb, 0xa4, 0xef, 0x30, 0xdd, 0xcb, 0x58, 0xd7, 0x55, 0x90, 0x0b, 0x21, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdf, 0x4e, 0x60, + 0x45, 0xd0, 0x07, 0x00, 0x00, 0x03, 0x15, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x8c, 0x53, 0xc1, 0x6e, 0xdb, 0x38, 0x10, + 0xbd, 0xeb, 0x2b, 0x1e, 0xb2, 0x07, 0x25, 0x81, 0x22, 0xed, 0x61, 0xf7, 0xe2, 0xc0, 0x8b, 0x05, 0xb2, 0x46, 0xda, 0x43, 0x91, 0xa2, 0xf5, 0x2e, 0xd0, 0x23, 0x2d, 0x8e, 0x2d, 0xb6, 0x14, 0x47, + 0x25, 0x47, 0x89, 0xb3, 0x86, 0xff, 0x7d, 0x41, 0x52, 0x76, 0xe2, 0xb6, 0x6b, 0xf4, 0x24, 0x6a, 0x38, 0x6f, 0xf8, 0xde, 0xcc, 0x9b, 0xe6, 0xfa, 0xba, 0xc0, 0x35, 0x3e, 0xf1, 0xe8, 0xf1, 0x66, + 0xb9, 0x7c, 0x8f, 0x4e, 0x39, 0x6d, 0x8d, 0xdb, 0x60, 0x3d, 0xba, 0x56, 0x0c, 0xbb, 0x0a, 0xc6, 0x3d, 0xf2, 0x17, 0xd2, 0x78, 0x32, 0xd2, 0x81, 0x54, 0xdb, 0xc1, 0xd3, 0xd7, 0x91, 0x82, 0xd4, + 0x58, 0x76, 0x26, 0xc0, 0x04, 0x28, 0x07, 0xda, 0xaa, 0x7e, 0xb0, 0x14, 0xab, 0x1d, 0xa0, 0x90, 0x4e, 0x09, 0xa8, 0xed, 0x98, 0x02, 0x8c, 0x04, 0x18, 0x37, 0x8c, 0x02, 0x61, 0x48, 0x47, 0x68, + 0x95, 0xb5, 0xe4, 0x2b, 0x28, 0xa7, 0xe1, 0x49, 0x46, 0xef, 0x72, 0x1d, 0xef, 0xd9, 0xc3, 0xac, 0x63, 0xa1, 0x98, 0x66, 0x5c, 0xcb, 0x7d, 0x24, 0x34, 0x3d, 0x1a, 0x9f, 0x0b, 0xdc, 0x93, 0x74, + 0x31, 0xc8, 0xd2, 0x91, 0x8f, 0xef, 0xb8, 0x88, 0x4d, 0x0a, 0xde, 0x3f, 0x7c, 0x5c, 0x82, 0x3d, 0xee, 0x17, 0xcb, 0xba, 0x40, 0x92, 0xf7, 0xd6, 0xa1, 0x55, 0x0e, 0x2b, 0x3a, 0xd5, 0x52, 0x46, + 0xa2, 0x53, 0xa8, 0x4c, 0x79, 0x72, 0xc8, 0x13, 0x0a, 0x72, 0x4c, 0x73, 0x43, 0x9f, 0x02, 0xe5, 0x54, 0xee, 0xcf, 0x41, 0x79, 0xd5, 0x63, 0x77, 0xc7, 0x4e, 0x68, 0x2b, 0x7b, 0xb4, 0xf9, 0x00, + 0x75, 0x3c, 0xf1, 0xea, 0x33, 0xb5, 0x52, 0xbf, 0xce, 0xce, 0xa1, 0x63, 0x72, 0xbd, 0x62, 0xfd, 0x9c, 0x14, 0x1e, 0x84, 0xa5, 0x80, 0x59, 0x43, 0xb9, 0xe7, 0x73, 0xb8, 0xaf, 0x23, 0xf9, 0x0c, + 0xcc, 0xa7, 0x20, 0x3e, 0x76, 0x42, 0x53, 0x20, 0x6f, 0x94, 0x35, 0xff, 0x92, 0x86, 0x4a, 0xad, 0xcc, 0xc8, 0xea, 0x27, 0x6a, 0x5a, 0xde, 0xc0, 0xf2, 0x66, 0x93, 0x5a, 0x9a, 0xee, 0xb2, 0xf4, + 0xd8, 0x66, 0xd6, 0x01, 0x6b, 0xf6, 0x28, 0x8d, 0x5b, 0x73, 0x59, 0xa1, 0x7c, 0x52, 0xde, 0xc5, 0x6f, 0x9a, 0x54, 0x59, 0x81, 0xa4, 0x3d, 0x2b, 0xb4, 0x23, 0xa5, 0xc9, 0x87, 0x44, 0x39, 0x4d, + 0xe8, 0x20, 0x78, 0xba, 0x78, 0x8d, 0xcd, 0x62, 0x5e, 0xb0, 0x99, 0xc0, 0xf7, 0xd0, 0x1c, 0x3f, 0x87, 0xec, 0x44, 0x86, 0x7f, 0xc8, 0x87, 0xec, 0xc3, 0x09, 0x3e, 0x78, 0x16, 0x6e, 0xd9, 0xe2, + 0x31, 0xdf, 0xc4, 0x02, 0x1f, 0x89, 0x66, 0x88, 0xd9, 0x61, 0xd6, 0x34, 0x1b, 0x23, 0xdd, 0xb8, 0xaa, 0x5b, 0xee, 0x9b, 0x2f, 0x4e, 0x89, 0x79, 0xa4, 0x26, 0x9a, 0xa4, 0x59, 0x59, 0x5e, 0x35, + 0xbd, 0x32, 0xae, 0xd1, 0xdc, 0x86, 0xe6, 0xe0, 0xf0, 0x1b, 0x4d, 0x8f, 0x64, 0x79, 0x20, 0x1f, 0x1a, 0xc7, 0x9a, 0x3e, 0x87, 0xba, 0xd7, 0xbf, 0x48, 0x47, 0x37, 0x13, 0x8d, 0x9b, 0xdc, 0x8c, + 0x02, 0xd7, 0x4d, 0xd1, 0xb2, 0x8b, 0xa2, 0xe3, 0x82, 0x11, 0xe6, 0x50, 0xe1, 0xd9, 0xb5, 0xb8, 0x9c, 0x12, 0xab, 0x34, 0xfe, 0x2b, 0xcc, 0xff, 0xc0, 0xae, 0x00, 0x9a, 0x06, 0x9f, 0x1e, 0xfe, + 0xfe, 0x80, 0xbb, 0x87, 0xbf, 0x16, 0x78, 0xb3, 0xf8, 0xb0, 0x28, 0xf0, 0x7a, 0x58, 0x75, 0x9c, 0xc5, 0xe5, 0x45, 0x32, 0xc0, 0x45, 0x75, 0x6a, 0x8d, 0xab, 0xdb, 0x1f, 0xe6, 0xc6, 0xf2, 0x17, + 0xd3, 0x2b, 0xb7, 0x45, 0x7e, 0xe2, 0xed, 0xfa, 0xc4, 0x80, 0x79, 0x91, 0x8f, 0x4b, 0x54, 0xe5, 0x35, 0x9d, 0x1c, 0xfd, 0x64, 0xac, 0x4d, 0x3f, 0xca, 0xb8, 0xef, 0x6c, 0x5b, 0x20, 0x9a, 0xec, + 0xf2, 0x9b, 0xa9, 0xcd, 0xe7, 0x73, 0x94, 0xb1, 0x52, 0x79, 0x95, 0x44, 0x61, 0xda, 0x73, 0xec, 0xb2, 0xd7, 0xf7, 0x91, 0xe9, 0x1e, 0x64, 0x03, 0xfd, 0x2f, 0xfc, 0x7e, 0xf1, 0x82, 0x3e, 0xcb, + 0xf8, 0x7e, 0xf1, 0x23, 0xc2, 0xc6, 0xb5, 0x76, 0xd4, 0x04, 0x75, 0xb2, 0x2c, 0x69, 0x25, 0x8c, 0x80, 0xb6, 0x26, 0x48, 0x38, 0x61, 0x96, 0x7e, 0x90, 0xb3, 0x67, 0xa7, 0x8d, 0xad, 0xd2, 0xdd, + 0xfe, 0x85, 0xf3, 0x37, 0x9a, 0x82, 0x28, 0x19, 0xc3, 0x1d, 0x6b, 0x9a, 0xe1, 0xb7, 0x5f, 0x7f, 0xaf, 0xa6, 0xc0, 0x3b, 0x0a, 0x41, 0x6d, 0x68, 0x86, 0xf2, 0x5d, 0xd6, 0xe5, 0x58, 0xa0, 0xac, + 0xe5, 0x27, 0xd2, 0xe5, 0xd4, 0x83, 0x62, 0x5f, 0x14, 0x4d, 0x83, 0xc5, 0x76, 0x60, 0x2f, 0x49, 0xc5, 0xc1, 0x61, 0x45, 0xcf, 0x7a, 0xb4, 0x54, 0x53, 0xba, 0x0a, 0x98, 0x63, 0x77, 0xb0, 0xd0, + 0xfe, 0xb6, 0xf8, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x1b, 0x16, 0x16, 0xd4, 0x8f, 0x02, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xbd, 0x67, 0x93, 0xbb, 0xdc, 0x92, 0x27, 0xf8, 0x7e, 0x3e, 0xc5, 0x13, 0xff, 0x97, + 0xcd, 0xe8, 0x8f, 0x37, 0xea, 0x98, 0xdb, 0xbb, 0x08, 0x19, 0x64, 0x10, 0x20, 0x40, 0x98, 0x8d, 0xb9, 0x1b, 0x78, 0x23, 0x9c, 0x70, 0x12, 0xec, 0x4c, 0x7f, 0xf6, 0x0d, 0x99, 0xaa, 0x92, 0xaa, + 0x54, 0x55, 0x94, 0x9e, 0xa7, 0xfb, 0xce, 0x8d, 0xe8, 0x57, 0x85, 0xab, 0x44, 0xfc, 0x32, 0x4f, 0x9e, 0x74, 0x27, 0xcf, 0xff, 0xf7, 0xdf, 0xfe, 0xf8, 0xe3, 0x57, 0x6a, 0x26, 0xee, 0xaf, 0x7f, + 0xfd, 0xe3, 0x57, 0x50, 0x55, 0xf9, 0x20, 0x30, 0x53, 0x27, 0x76, 0x8b, 0x5f, 0xff, 0xfd, 0x74, 0xa7, 0x71, 0x8b, 0x32, 0xcc, 0xd2, 0xd3, 0x4d, 0xe8, 0x37, 0xfc, 0x1b, 0xba, 0x5c, 0x8d, 0x33, + 0x7b, 0xe7, 0x85, 0xb1, 0xbb, 0x7d, 0xbd, 0x8b, 0x9c, 0xaf, 0x17, 0xee, 0xbe, 0x0e, 0x0b, 0xb7, 0xfc, 0xf5, 0xaf, 0x7f, 0x54, 0x45, 0xed, 0x9e, 0xaf, 0xe5, 0xa6, 0xbd, 0x33, 0xfd, 0xf3, 0xb5, + 0xd3, 0xbb, 0xfe, 0xf8, 0xe3, 0xd7, 0xeb, 0xd1, 0x57, 0x6f, 0x3e, 0xdf, 0x7d, 0xf8, 0xf6, 0xf3, 0x9d, 0x38, 0xb4, 0xdd, 0xb4, 0x3c, 0xff, 0x2b, 0x9d, 0x9b, 0x76, 0xe0, 0x0e, 0x90, 0xdb, 0xdb, + 0x8e, 0x9b, 0xbb, 0xa9, 0xe3, 0xa6, 0x76, 0x78, 0xf3, 0xe2, 0xf3, 0x1d, 0xcf, 0x34, 0xcb, 0x41, 0x54, 0x0e, 0x8a, 0x3a, 0xad, 0xc2, 0xcb, 0xbb, 0xff, 0x8e, 0xfc, 0x46, 0x7e, 0x23, 0xbf, 0xae, + 0xcf, 0xfc, 0xef, 0x1b, 0x22, 0xcd, 0xf8, 0x53, 0x3a, 0x69, 0xe6, 0xb8, 0xc9, 0xe5, 0xa7, 0xfd, 0x1d, 0xfd, 0x0d, 0xfd, 0x86, 0x5f, 0x5f, 0xfe, 0xc7, 0x1f, 0xbf, 0xca, 0x3a, 0x77, 0x8b, 0xca, + 0x2d, 0xab, 0xf3, 0x6d, 0xe2, 0x37, 0x7a, 0x7f, 0xbb, 0x32, 0xf3, 0xcb, 0x8b, 0xf1, 0xf3, 0x3f, 0xbe, 0xbc, 0xf8, 0xbf, 0xdd, 0xbc, 0xfe, 0x4c, 0xff, 0xff, 0x4d, 0x32, 0xa7, 0x8e, 0xdd, 0x12, + 0xfc, 0xbf, 0x3d, 0xb3, 0xac, 0x42, 0xaf, 0x05, 0xcd, 0xa8, 0x19, 0xd8, 0x59, 0x92, 0x87, 0x27, 0x98, 0x6e, 0x60, 0xbc, 0x01, 0x0a, 0xfd, 0x8d, 0xdf, 0x22, 0x51, 0xb8, 0x65, 0x16, 0x37, 0xae, + 0xf3, 0x02, 0x72, 0xf9, 0xaf, 0x20, 0x58, 0xb8, 0x7e, 0x58, 0x56, 0x45, 0xfb, 0x3b, 0xcd, 0x93, 0xa8, 0xfc, 0x9d, 0x15, 0xfe, 0xe3, 0x37, 0x80, 0x83, 0xbb, 0xd3, 0xc1, 0x99, 0xf4, 0xef, 0xca, + 0xef, 0xde, 0xc8, 0x87, 0x69, 0xe5, 0xfa, 0x45, 0x58, 0xb5, 0x27, 0xfa, 0x65, 0x60, 0xe2, 0x30, 0x32, 0x70, 0x2d, 0x6b, 0x52, 0xc5, 0x73, 0xd2, 0x39, 0x6a, 0x53, 0xbc, 0x0b, 0xd7, 0x4e, 0x01, + 0xe1, 0x09, 0xaf, 0x53, 0xeb, 0x74, 0x1c, 0x0a, 0x23, 0x58, 0x6b, 0xe8, 0x78, 0xc5, 0xda, 0xd5, 0xa6, 0x02, 0x37, 0x36, 0xc0, 0xa0, 0x2b, 0x86, 0xdf, 0xaa, 0x78, 0x98, 0x28, 0x5b, 0x0d, 0x48, + 0x82, 0x46, 0x09, 0xd2, 0x75, 0x97, 0x08, 0x23, 0xd6, 0x3d, 0x28, 0x3b, 0x7e, 0xea, 0xcf, 0x62, 0xe6, 0xe8, 0x3b, 0x34, 0xfd, 0xb7, 0xbf, 0xf5, 0x61, 0xaf, 0x19, 0x35, 0x67, 0x64, 0xa9, 0xdf, + 0xf0, 0xad, 0xbc, 0x5c, 0xee, 0x0c, 0xbc, 0xac, 0x48, 0xcc, 0xaa, 0xbc, 0x32, 0x1d, 0xbe, 0xe7, 0xca, 0x09, 0x81, 0x41, 0x5d, 0x84, 0xd7, 0xbb, 0xd0, 0x6f, 0xe8, 0x27, 0x9c, 0x71, 0x5c, 0x37, + 0x4f, 0xdc, 0xc2, 0x77, 0x3f, 0x61, 0x0b, 0xfc, 0x1b, 0xfd, 0x33, 0x6c, 0x79, 0x25, 0x0f, 0x0e, 0xde, 0x8e, 0x07, 0x67, 0xa2, 0xdf, 0x33, 0x64, 0x41, 0xc9, 0xbc, 0x34, 0xda, 0xa3, 0x52, 0x66, + 0x58, 0xe3, 0x80, 0x1b, 0x02, 0x1b, 0xb0, 0x26, 0xc9, 0x40, 0x18, 0xa2, 0x7e, 0x07, 0x16, 0x66, 0x24, 0xd1, 0xc0, 0x12, 0xd9, 0xcd, 0xda, 0x30, 0x12, 0x72, 0x7e, 0x23, 0xa8, 0x8a, 0xc6, 0x2a, + 0xb9, 0x6c, 0xc6, 0x6e, 0x16, 0x01, 0x43, 0x84, 0x2e, 0x21, 0x69, 0x58, 0x0b, 0x1b, 0x81, 0xe4, 0x43, 0x6a, 0xbe, 0xe7, 0x3c, 0xa8, 0x06, 0x8a, 0x8c, 0x38, 0x31, 0xa4, 0x07, 0x2e, 0x6e, 0x51, + 0x64, 0x9f, 0x8b, 0xea, 0x9f, 0xc2, 0xe4, 0x4c, 0x1a, 0x1c, 0x5c, 0xfe, 0x0e, 0xd0, 0x7e, 0x58, 0x38, 0x11, 0xd9, 0x44, 0xf3, 0x14, 0xa6, 0x0b, 0xaa, 0xdc, 0x6a, 0x11, 0xd2, 0xd2, 0x5a, 0xc8, + 0xad, 0x99, 0xc5, 0x38, 0x91, 0x86, 0x9c, 0x38, 0xd4, 0xb8, 0x78, 0xee, 0xda, 0x1a, 0xe2, 0xcc, 0xbb, 0x2e, 0x88, 0x24, 0x96, 0x69, 0x97, 0x19, 0x36, 0x76, 0xb4, 0x48, 0xe3, 0x4a, 0xf2, 0xb0, + 0x54, 0x91, 0x5d, 0x44, 0xb4, 0xcd, 0x76, 0x23, 0xe5, 0xb5, 0x18, 0xf1, 0x06, 0xaa, 0xaf, 0x8a, 0x00, 0x27, 0x0e, 0xfd, 0xb0, 0x38, 0x4b, 0x58, 0x54, 0x66, 0xe9, 0xa0, 0xac, 0x8a, 0x30, 0xf5, + 0x43, 0xaf, 0xfd, 0x6e, 0x34, 0x63, 0x7f, 0x0e, 0xa2, 0xaf, 0xde, 0x08, 0x0e, 0xbe, 0xbc, 0x3d, 0xc0, 0xfa, 0x01, 0x6a, 0x1a, 0xb4, 0x36, 0xd3, 0x33, 0x22, 0x41, 0x90, 0xe9, 0x0e, 0xee, 0x8c, + 0x6e, 0xa2, 0x2c, 0x47, 0x4d, 0x5d, 0x81, 0xcc, 0x7c, 0x2e, 0xba, 0xe0, 0xc8, 0xcc, 0x27, 0xfc, 0x26, 0x3d, 0x86, 0x63, 0x5c, 0x2c, 0xa0, 0x9d, 0xc0, 0xee, 0xf7, 0x73, 0x62, 0xb8, 0xae, 0x26, + 0x1c, 0x93, 0xb8, 0x24, 0x16, 0x00, 0x66, 0x45, 0x22, 0xa5, 0x10, 0x58, 0x3b, 0x0b, 0x33, 0x8a, 0x95, 0x03, 0xab, 0xe8, 0x72, 0xb3, 0xea, 0x39, 0xda, 0x1f, 0xfc, 0xfe, 0xab, 0x5e, 0x25, 0x7b, + 0x8d, 0x5e, 0xd3, 0xb2, 0x0a, 0xb7, 0xf9, 0x74, 0xc4, 0xde, 0x2a, 0x88, 0xbe, 0xd0, 0x5f, 0x48, 0x9e, 0x34, 0xe7, 0xf9, 0x60, 0x70, 0xa6, 0xf2, 0x3d, 0x8a, 0x69, 0xea, 0x0e, 0xc1, 0x79, 0x28, + 0x82, 0x41, 0x37, 0x0f, 0x74, 0x22, 0x77, 0xc6, 0xa9, 0x35, 0xaa, 0x3a, 0x72, 0x1c, 0x09, 0xf2, 0xb2, 0xd0, 0x21, 0x48, 0x00, 0xbb, 0x46, 0x90, 0x12, 0x3c, 0xe7, 0xa7, 0xbb, 0x98, 0x38, 0xd6, + 0xb3, 0x62, 0x96, 0x6a, 0x29, 0xb8, 0xad, 0xe4, 0xf5, 0xda, 0x5b, 0x57, 0xb4, 0x67, 0x0c, 0x41, 0x78, 0x53, 0xb9, 0xc1, 0xae, 0xec, 0x94, 0xe1, 0xde, 0x96, 0xc3, 0x10, 0x12, 0xef, 0x51, 0x6c, + 0xae, 0xd3, 0xf2, 0x57, 0x78, 0x64, 0x45, 0x35, 0xb0, 0xb3, 0xb4, 0x2a, 0xb2, 0xf8, 0xab, 0x29, 0x06, 0x7a, 0x42, 0x28, 0xdf, 0x13, 0x3f, 0x63, 0x74, 0x7f, 0x69, 0x70, 0xa6, 0xfc, 0x3d, 0x5a, + 0x01, 0x15, 0x8b, 0x54, 0x65, 0xda, 0x86, 0x9e, 0x6e, 0xd0, 0x66, 0x2d, 0xca, 0x7e, 0x68, 0x45, 0x40, 0xc5, 0x8f, 0xd9, 0x39, 0x0e, 0x02, 0x31, 0x44, 0xd0, 0x35, 0x22, 0xd8, 0x45, 0xd8, 0x80, + 0xb3, 0xc4, 0xad, 0x20, 0xd7, 0x8c, 0x30, 0xf9, 0xa0, 0xb2, 0x18, 0x5c, 0xf2, 0xc3, 0x43, 0xca, 0x8e, 0x43, 0xb1, 0x9c, 0x44, 0xf0, 0x70, 0x0f, 0x39, 0x45, 0xe7, 0xa8, 0x8e, 0x4b, 0xb3, 0xd5, + 0xc1, 0xf5, 0xfb, 0xc9, 0x9c, 0xdb, 0xb8, 0x69, 0x35, 0xa8, 0xcc, 0xc2, 0x77, 0xab, 0x41, 0x19, 0x84, 0xc9, 0xeb, 0x4c, 0x0e, 0x7d, 0x34, 0x21, 0xdc, 0xd4, 0x0f, 0xd3, 0x47, 0xa6, 0xc3, 0xe9, + 0x9f, 0xfe, 0xed, 0x6f, 0xc4, 0x6f, 0xbc, 0x97, 0x94, 0x96, 0x55, 0x61, 0xda, 0xd5, 0x20, 0xce, 0x7c, 0x3f, 0x4c, 0xfd, 0x4f, 0xb8, 0x82, 0xdc, 0x59, 0x21, 0xfd, 0xb9, 0x72, 0x4f, 0xfc, 0xcc, + 0x95, 0xfb, 0x4b, 0x83, 0x33, 0xe5, 0xef, 0xb9, 0x82, 0x8c, 0xa2, 0x8d, 0x6c, 0x1c, 0x65, 0xa1, 0x09, 0x5c, 0xbe, 0x99, 0x59, 0xa3, 0x32, 0x9e, 0x4a, 0x3a, 0xaf, 0xec, 0x0a, 0x40, 0x8a, 0x84, + 0x8a, 0x4f, 0x8b, 0x95, 0x80, 0xa2, 0x1e, 0xb0, 0x9d, 0xab, 0xab, 0xce, 0xed, 0xc4, 0xdc, 0xb0, 0xf7, 0x5b, 0x9f, 0x8c, 0x4c, 0x74, 0x85, 0x39, 0x23, 0x2d, 0xe9, 0x3a, 0xff, 0x20, 0x03, 0x26, + 0x84, 0x0c, 0xa3, 0xcd, 0x11, 0x17, 0x98, 0x10, 0x5d, 0xd4, 0xe1, 0xd7, 0xd3, 0xcc, 0x65, 0xba, 0x7f, 0x84, 0x06, 0xf5, 0x1b, 0x46, 0x9e, 0x11, 0xd2, 0xa8, 0xb9, 0x5a, 0x3d, 0x17, 0x02, 0xdf, + 0x7f, 0x75, 0xb9, 0xa9, 0xe1, 0x5d, 0x6e, 0xf3, 0xc3, 0x76, 0x55, 0xe9, 0xc7, 0xd1, 0xb2, 0xd9, 0x7b, 0xb2, 0x1b, 0x0c, 0x97, 0x9d, 0x31, 0x39, 0xf0, 0xa8, 0x24, 0xb7, 0x1a, 0xcc, 0xca, 0x00, + 0xc6, 0x98, 0xe3, 0x8e, 0x21, 0xd8, 0x5c, 0x9e, 0xe9, 0xc1, 0x3c, 0x10, 0xe6, 0x5d, 0x34, 0xd4, 0xea, 0xa5, 0x42, 0x2e, 0xf5, 0xf1, 0x21, 0x35, 0xdd, 0x00, 0x0f, 0x6c, 0xfe, 0x10, 0xb5, 0xb0, + 0x58, 0x2f, 0xba, 0x91, 0xf0, 0x13, 0xfd, 0x77, 0x32, 0x07, 0x06, 0xee, 0xbe, 0x36, 0xe3, 0x5f, 0x17, 0x63, 0xf4, 0x9d, 0x5d, 0x73, 0xd1, 0x8f, 0x76, 0xe0, 0x26, 0xe6, 0xa0, 0x2a, 0xcc, 0x13, + 0x46, 0x17, 0xeb, 0x13, 0xbe, 0x1b, 0xc6, 0x6f, 0xe6, 0xfb, 0xc0, 0x2b, 0xb2, 0xe4, 0xaa, 0x51, 0x5f, 0x8d, 0x21, 0xe4, 0xf6, 0xc1, 0xba, 0x08, 0x07, 0xd1, 0xc5, 0x8c, 0xc2, 0x1e, 0xdb, 0xce, + 0x5e, 0x9d, 0x3a, 0xf7, 0xa2, 0x7a, 0xb2, 0x7b, 0xdb, 0x8b, 0xdd, 0xeb, 0x87, 0x55, 0x50, 0x5b, 0xf7, 0x04, 0xe3, 0x5b, 0xc6, 0x5c, 0x1e, 0xf8, 0x6d, 0x67, 0x09, 0x58, 0xe6, 0x59, 0x5a, 0x66, + 0x45, 0x09, 0xba, 0x79, 0x66, 0xb9, 0x85, 0xdb, 0xed, 0xc2, 0xb4, 0xcf, 0x98, 0xb9, 0xb3, 0xf6, 0x1e, 0x0f, 0x97, 0xa7, 0xd4, 0xfb, 0x1b, 0xdd, 0xab, 0x9c, 0x5c, 0xcf, 0x06, 0x48, 0x3f, 0x45, + 0xaf, 0x1e, 0xa1, 0xe5, 0x11, 0x47, 0x82, 0xe3, 0x84, 0x64, 0x60, 0x2a, 0xd8, 0x71, 0x13, 0xdf, 0xd7, 0xe3, 0x49, 0xe8, 0xed, 0x55, 0xa3, 0xd2, 0xcd, 0x8d, 0x9f, 0xd5, 0x8b, 0xac, 0x00, 0x54, + 0xce, 0x11, 0x52, 0xb1, 0x9d, 0x2c, 0x61, 0xb4, 0xf1, 0x27, 0x6a, 0xbb, 0x5d, 0xd7, 0x39, 0x29, 0x65, 0xae, 0x9b, 0xad, 0xb8, 0xb2, 0xc0, 0x76, 0x1e, 0x1e, 0x10, 0x0e, 0xaf, 0xc2, 0xf0, 0x1c, + 0xc6, 0x39, 0xa5, 0xa7, 0xb8, 0xbc, 0x19, 0xc7, 0x0f, 0x95, 0x55, 0xee, 0xba, 0xc5, 0xe7, 0x0e, 0xcf, 0x0f, 0xff, 0x99, 0x73, 0x2b, 0xf3, 0x11, 0x81, 0xb7, 0x0b, 0x7f, 0xfc, 0xf1, 0x2b, 0xcb, + 0xab, 0x30, 0x4b, 0xcf, 0x82, 0xfb, 0x3a, 0x31, 0xfd, 0xf1, 0xca, 0xd8, 0xaf, 0x19, 0x9c, 0xb6, 0x89, 0x59, 0xd9, 0xc1, 0xa7, 0x53, 0x14, 0x7c, 0x23, 0xb2, 0xbd, 0xb9, 0x7b, 0x25, 0x7a, 0x62, + 0xed, 0xf5, 0x70, 0x70, 0xa6, 0xf4, 0x3d, 0x5f, 0x05, 0x0c, 0x75, 0x05, 0x8f, 0xa7, 0xe7, 0x75, 0xbe, 0xf3, 0x6b, 0x56, 0x69, 0xed, 0xc2, 0xc6, 0xf6, 0x8b, 0xe1, 0xae, 0xa3, 0x8c, 0xb0, 0xe6, + 0x95, 0x30, 0x32, 0x27, 0xf2, 0x41, 0x23, 0x65, 0xb6, 0x82, 0x74, 0x70, 0xb6, 0x5e, 0x92, 0x0d, 0x64, 0x9a, 0x54, 0xa1, 0x53, 0x30, 0x71, 0x54, 0x23, 0x83, 0x2c, 0x16, 0x0e, 0x8d, 0x6b, 0x0e, + 0x67, 0xe7, 0xdb, 0xa9, 0xbc, 0xe4, 0xf6, 0xc0, 0xa6, 0x51, 0xfd, 0xc7, 0x13, 0x78, 0x0f, 0x56, 0xa7, 0x27, 0xa9, 0x8c, 0xc3, 0xce, 0x1d, 0xe4, 0x66, 0x15, 0xfc, 0x7a, 0xf1, 0x52, 0xef, 0x86, + 0x7b, 0x1e, 0xda, 0xd9, 0x0b, 0x86, 0x97, 0x41, 0x8e, 0xfd, 0x78, 0x06, 0xfb, 0x83, 0xea, 0x33, 0x18, 0x0b, 0x3b, 0x68, 0x3f, 0xb5, 0xb2, 0x9e, 0xb2, 0x25, 0x4e, 0x14, 0x4f, 0x5c, 0x3a, 0xfd, + 0x1d, 0xc0, 0xfd, 0xac, 0x06, 0xcd, 0x07, 0x86, 0x9b, 0x03, 0xe3, 0x83, 0x50, 0x8e, 0x22, 0x95, 0xbb, 0x74, 0x66, 0x9c, 0x20, 0x0b, 0xe9, 0x56, 0x5b, 0x8e, 0xa1, 0x03, 0x3a, 0xf6, 0xd8, 0x74, + 0x2a, 0x7b, 0xa1, 0x9d, 0x75, 0x25, 0xed, 0x97, 0xcd, 0x1e, 0xd1, 0xdc, 0x54, 0x58, 0xec, 0x41, 0x4e, 0xcf, 0xbb, 0x4e, 0x04, 0x1b, 0xaa, 0x2b, 0xf8, 0x76, 0x91, 0x12, 0xe3, 0x12, 0x1d, 0x6e, + 0x69, 0x6c, 0x31, 0x1f, 0x1f, 0xa6, 0xde, 0xfe, 0x6b, 0xd3, 0xdf, 0x2c, 0xfc, 0xdc, 0xbc, 0xe8, 0xdb, 0xbf, 0x70, 0xca, 0xbe, 0x12, 0x3d, 0x7f, 0xff, 0xe5, 0xb0, 0xef, 0x14, 0x4d, 0x01, 0x43, + 0x75, 0xef, 0x5a, 0xd6, 0xb4, 0xcb, 0xb5, 0x21, 0xbf, 0x01, 0x54, 0x93, 0xe0, 0x91, 0xa1, 0x59, 0xce, 0x33, 0xdf, 0xdd, 0x70, 0x9d, 0x3d, 0xab, 0xe8, 0xf9, 0xda, 0xc9, 0x39, 0x96, 0x6d, 0x69, + 0x1f, 0x86, 0x3c, 0x08, 0x37, 0xa5, 0xe9, 0x76, 0x64, 0xd9, 0x93, 0xfd, 0xcc, 0x03, 0x05, 0xed, 0x00, 0x4f, 0x22, 0xda, 0x00, 0xf6, 0x08, 0x68, 0x4d, 0x46, 0x3e, 0x3a, 0x6e, 0xea, 0x62, 0x89, + 0x8a, 0x5f, 0x43, 0x50, 0x9a, 0xf9, 0x17, 0x9f, 0x4f, 0xfc, 0xfc, 0xf3, 0x4b, 0x33, 0x3f, 0x7d, 0x7a, 0x69, 0xe6, 0xe7, 0xcf, 0x26, 0xbe, 0xff, 0xec, 0x91, 0xc4, 0xaa, 0xfe, 0x58, 0xa2, 0xc3, + 0x65, 0x89, 0x43, 0x19, 0xb2, 0x71, 0xa9, 0x3c, 0x6f, 0x72, 0xb4, 0x74, 0xb7, 0xac, 0x26, 0x6d, 0x38, 0x0c, 0xb3, 0x1d, 0xa9, 0x94, 0x87, 0x53, 0x6f, 0x3d, 0x51, 0x14, 0x63, 0xc5, 0xcf, 0xd4, + 0x2d, 0x53, 0x86, 0xaa, 0xb9, 0x11, 0x54, 0x0e, 0x36, 0xd2, 0x14, 0x48, 0xf6, 0x06, 0xcc, 0x7b, 0x5b, 0x03, 0xed, 0xd0, 0xb1, 0x3a, 0xe9, 0xa4, 0x9c, 0x0c, 0x36, 0xf4, 0x8f, 0xad, 0xeb, 0xb2, + 0x4d, 0xed, 0x5d, 0x58, 0x7d, 0x82, 0x06, 0xf4, 0x1b, 0x7b, 0x66, 0x24, 0x5c, 0x89, 0x9e, 0x11, 0xb9, 0x1c, 0x0e, 0xce, 0x94, 0xbe, 0x47, 0x85, 0x77, 0xc3, 0x21, 0xcf, 0x62, 0xd5, 0x26, 0x80, + 0xf4, 0xbd, 0x82, 0xce, 0x8e, 0x81, 0x46, 0x0e, 0x1d, 0x0e, 0x4c, 0x0e, 0x5b, 0xbf, 0xb1, 0x8c, 0x85, 0x29, 0xad, 0xcd, 0xcd, 0x0e, 0xb0, 0xca, 0x60, 0x17, 0x41, 0x12, 0x6e, 0x7b, 0xac, 0xed, + 0xeb, 0xe6, 0xae, 0x70, 0x47, 0x51, 0xc1, 0x1e, 0xcc, 0x4a, 0x5b, 0x5a, 0x1d, 0x30, 0xcf, 0xe6, 0x8e, 0xbe, 0x3a, 0x16, 0xcb, 0x30, 0x41, 0xb8, 0x48, 0x7d, 0xc2, 0xe7, 0xa8, 0xb2, 0x24, 0xb4, + 0x07, 0x65, 0xec, 0xba, 0x9f, 0xc9, 0xc9, 0x93, 0x3a, 0xe2, 0x86, 0xf0, 0x09, 0x9d, 0x9b, 0xd3, 0xbe, 0x1a, 0x63, 0xb7, 0xe6, 0xa3, 0xf1, 0x9e, 0x0e, 0xc8, 0xfc, 0x08, 0x69, 0xea, 0x7a, 0x0e, + 0x60, 0xa2, 0xd5, 0x65, 0xe1, 0x06, 0x4c, 0xe5, 0x1d, 0x4b, 0xab, 0xeb, 0xda, 0x41, 0xea, 0x26, 0x5d, 0xec, 0xeb, 0x31, 0x0c, 0x1e, 0x71, 0x93, 0x9c, 0x88, 0x06, 0xb7, 0x90, 0x21, 0xda, 0xee, + 0xf6, 0x4b, 0x48, 0x4c, 0x09, 0x32, 0xd3, 0x41, 0x59, 0x16, 0xe1, 0x95, 0xa5, 0x2c, 0xcd, 0xc8, 0xc8, 0x73, 0x74, 0x3e, 0xac, 0xee, 0x10, 0xfa, 0x46, 0xbd, 0x52, 0x3d, 0xc3, 0x50, 0x66, 0x63, + 0x86, 0xb1, 0x69, 0xc5, 0xee, 0xe0, 0x64, 0x63, 0x39, 0x03, 0xb3, 0x28, 0xcc, 0xf6, 0x33, 0xcb, 0x07, 0x3e, 0x6b, 0xfa, 0x1f, 0xc3, 0xf9, 0xf0, 0x15, 0x27, 0x60, 0x1f, 0xde, 0x38, 0x43, 0x8c, + 0x7d, 0x0f, 0xb1, 0x44, 0xe3, 0x89, 0xb6, 0x50, 0x8b, 0xb9, 0x03, 0xcb, 0xa6, 0x18, 0x79, 0x47, 0x45, 0xf7, 0x03, 0x6b, 0x2f, 0x82, 0x81, 0x1e, 0x66, 0xcb, 0x64, 0xb5, 0x68, 0x84, 0x45, 0x3b, + 0xae, 0xf5, 0x4d, 0xa5, 0x69, 0x6e, 0x3a, 0x5d, 0x73, 0x51, 0x84, 0x05, 0x92, 0x54, 0xc1, 0x8c, 0x07, 0x1f, 0xcb, 0x5a, 0x93, 0xb4, 0xa2, 0x3a, 0x16, 0x5b, 0x06, 0xe7, 0x2b, 0xcc, 0x55, 0x08, + 0x9b, 0xaf, 0x46, 0x63, 0x87, 0xfe, 0x01, 0xc4, 0x7f, 0x3c, 0x9c, 0xf6, 0x1e, 0xda, 0xaf, 0x3d, 0xac, 0xd4, 0x38, 0x0a, 0xcc, 0xc2, 0xea, 0xc5, 0xb1, 0x26, 0xcc, 0x3e, 0xf5, 0x5d, 0x90, 0x67, + 0xa6, 0x85, 0x13, 0xc5, 0x33, 0x3f, 0x9a, 0x30, 0x1b, 0x9c, 0x69, 0x7c, 0x0f, 0xbf, 0x4c, 0xc7, 0x9c, 0xde, 0xf0, 0xf5, 0x61, 0xd6, 0xae, 0x96, 0xa8, 0xe0, 0x8d, 0x2c, 0x5c, 0x5d, 0x8e, 0x34, + 0x23, 0xd1, 0x3a, 0xc4, 0xdb, 0x32, 0x7e, 0x83, 0xa0, 0x0e, 0xd1, 0x19, 0x53, 0x27, 0x76, 0xc1, 0x3d, 0xea, 0x0b, 0x51, 0x72, 0x1c, 0x99, 0x6e, 0xcd, 0x40, 0xb9, 0x0e, 0x8d, 0xbb, 0x12, 0x17, + 0x54, 0x4e, 0xf2, 0xbd, 0xfd, 0x7e, 0x62, 0xec, 0x8a, 0xd6, 0x85, 0x87, 0xb3, 0x78, 0x2c, 0xfb, 0x87, 0x9e, 0xe6, 0xe8, 0xd5, 0x2c, 0x78, 0xe0, 0x89, 0x38, 0xae, 0x55, 0x5f, 0x7c, 0x0f, 0xec, + 0xfd, 0xad, 0x93, 0xcf, 0xb3, 0xbf, 0xfe, 0x17, 0xd1, 0x2b, 0x7a, 0x6e, 0x99, 0xb1, 0x99, 0xda, 0xae, 0x33, 0xf8, 0xca, 0x60, 0x84, 0xef, 0x7c, 0x9c, 0xbe, 0x98, 0xdf, 0x93, 0x06, 0x07, 0xef, + 0x2e, 0x9c, 0x07, 0x41, 0x0f, 0xe3, 0x11, 0xcd, 0x24, 0x57, 0xe1, 0x21, 0x99, 0xdb, 0x12, 0x64, 0xb0, 0x86, 0xe9, 0xc4, 0xd2, 0xca, 0x25, 0xd6, 0x9a, 0x7b, 0x85, 0xac, 0xa2, 0x90, 0x8d, 0xad, + 0xe3, 0x66, 0x6c, 0xf0, 0x39, 0x0b, 0x2d, 0xd5, 0x21, 0xc0, 0xb8, 0x1a, 0x66, 0x6d, 0x68, 0x53, 0x83, 0xe8, 0xf4, 0x58, 0x41, 0xd5, 0x11, 0xe1, 0x8a, 0x7c, 0x93, 0xab, 0x07, 0xd1, 0x14, 0x0e, + 0xf3, 0x78, 0x2e, 0x4d, 0x16, 0x81, 0xae, 0xe0, 0xc2, 0xe1, 0xa7, 0x9a, 0xd8, 0x32, 0x4b, 0x97, 0xc0, 0x2e, 0x8e, 0xdd, 0x63, 0x88, 0xf0, 0x27, 0xc4, 0xf2, 0x95, 0xea, 0x19, 0x9d, 0xeb, 0xf1, + 0xe0, 0x4c, 0xeb, 0x7b, 0x60, 0xe8, 0x65, 0x6e, 0xea, 0x31, 0x9b, 0x52, 0x15, 0x26, 0x6d, 0x2d, 0x9e, 0x65, 0x5a, 0xc0, 0xc2, 0x81, 0xe5, 0xd2, 0x6f, 0x36, 0x58, 0x53, 0x94, 0x63, 0xaa, 0xb1, + 0x9a, 0xc2, 0x0a, 0xc5, 0x45, 0x5e, 0x92, 0xde, 0x72, 0x2c, 0xef, 0xa2, 0xdd, 0xb8, 0x68, 0x89, 0x28, 0x84, 0x0a, 0x65, 0x11, 0x31, 0xd0, 0xae, 0xb3, 0xd6, 0xae, 0xb0, 0x3a, 0x74, 0xc7, 0x3d, + 0x15, 0xb6, 0x79, 0x86, 0xc1, 0x7b, 0x57, 0xbd, 0xd3, 0x0e, 0x6f, 0x03, 0xfd, 0xff, 0x79, 0x95, 0xb1, 0x3b, 0x1f, 0xe5, 0x53, 0xa7, 0xb5, 0x9f, 0x42, 0xf0, 0xdc, 0x22, 0x2b, 0xcb, 0x5f, 0xaf, + 0xff, 0xf5, 0xbf, 0xff, 0xfb, 0xd7, 0xaf, 0xc9, 0xcd, 0xaa, 0x70, 0xb3, 0xf4, 0xcb, 0xf7, 0x1c, 0x0e, 0x87, 0xdf, 0xd7, 0xe7, 0xce, 0x2f, 0xfb, 0xe9, 0x3b, 0xec, 0x2c, 0x2d, 0xeb, 0xb8, 0x3a, + 0x7d, 0xf6, 0x57, 0xaf, 0xb9, 0x90, 0x3d, 0x33, 0xb1, 0xac, 0xf3, 0x3c, 0x2b, 0xaa, 0x9b, 0x57, 0x5c, 0x8f, 0xfe, 0xe7, 0x17, 0xe2, 0x14, 0xfa, 0x69, 0x9d, 0x58, 0x6e, 0xf1, 0xfb, 0x53, 0x89, + 0x1a, 0x3e, 0xe5, 0x83, 0xdf, 0x12, 0x3e, 0x09, 0xd5, 0xcd, 0xe9, 0x60, 0xd8, 0xcf, 0x0b, 0xcf, 0xd9, 0x04, 0x5b, 0x95, 0xdc, 0x82, 0x88, 0x3b, 0x7f, 0x3d, 0xdb, 0x7a, 0x06, 0x1b, 0x71, 0x19, + 0x4f, 0x95, 0x4e, 0xb6, 0x09, 0xf8, 0x8e, 0x67, 0x31, 0x6e, 0x95, 0xe8, 0x04, 0xbe, 0xf0, 0x49, 0xc8, 0xca, 0x8f, 0xcc, 0xb2, 0xc6, 0x43, 0x9e, 0x5d, 0x2f, 0x5a, 0x6f, 0x4a, 0xf0, 0x6d, 0xa3, + 0x1f, 0xc8, 0x8a, 0x9a, 0xe6, 0x1e, 0x8a, 0x6f, 0xea, 0x4e, 0x69, 0xf7, 0xa9, 0x58, 0x46, 0xd4, 0x36, 0xf4, 0x7b, 0xcf, 0x3a, 0xff, 0xd2, 0x47, 0x6b, 0x85, 0xa9, 0x59, 0xb4, 0x03, 0xf7, 0x58, + 0xb9, 0xe9, 0x09, 0xaf, 0xcf, 0xe3, 0x18, 0xcf, 0xc4, 0xb9, 0x3e, 0x50, 0x3f, 0x03, 0xf9, 0xee, 0xda, 0xe0, 0x4c, 0xfb, 0x7b, 0x34, 0xa3, 0xb1, 0x5d, 0x2d, 0xc0, 0xf9, 0x56, 0xb4, 0x8c, 0x6c, + 0xd1, 0xee, 0x32, 0x97, 0xb5, 0x02, 0x2d, 0xe7, 0xe3, 0xf5, 0x68, 0x3f, 0x5b, 0xdb, 0x07, 0x6d, 0xb1, 0x5c, 0x64, 0x3e, 0x86, 0x4c, 0x70, 0x76, 0x2c, 0x28, 0x07, 0x51, 0x96, 0x9c, 0x88, 0x61, + 0x9d, 0x30, 0x88, 0x22, 0x68, 0x1c, 0xa7, 0x81, 0x2b, 0x92, 0x56, 0x6c, 0xc9, 0x84, 0xc3, 0xf2, 0xa6, 0xb7, 0xa6, 0x43, 0x89, 0xca, 0x32, 0x71, 0xf9, 0x89, 0x79, 0xdd, 0x0f, 0xe0, 0x7f, 0xfb, + 0x5b, 0x1f, 0xbf, 0xd4, 0x0a, 0xd3, 0xaa, 0x70, 0xdd, 0xaf, 0xec, 0xa4, 0x27, 0xa6, 0x84, 0x2b, 0xd1, 0x0b, 0xa0, 0xe7, 0xc3, 0xbe, 0xd3, 0xc0, 0x96, 0xe7, 0x7c, 0x99, 0x3b, 0x44, 0xb4, 0xa9, + 0xcc, 0x70, 0x0a, 0x92, 0xb4, 0x14, 0x5d, 0x99, 0xf6, 0xd6, 0x8f, 0xea, 0xa2, 0xb0, 0xb8, 0xc4, 0x25, 0x0d, 0x63, 0xad, 0xcf, 0x24, 0x69, 0x4b, 0x26, 0x49, 0xa5, 0x13, 0xa2, 0xb8, 0x09, 0xa0, + 0x89, 0x8f, 0xe6, 0x87, 0xb9, 0x9d, 0x56, 0x22, 0x49, 0x8e, 0x27, 0xc5, 0x12, 0x5e, 0x41, 0xeb, 0xe3, 0xce, 0x72, 0xab, 0xc8, 0xce, 0xb4, 0x6e, 0x7b, 0x58, 0x7e, 0xed, 0xa0, 0x5a, 0x85, 0x69, + 0xbb, 0x03, 0xf7, 0x98, 0x9b, 0xe9, 0xf5, 0xb3, 0x1f, 0x23, 0x01, 0xff, 0x86, 0x9f, 0x18, 0xa8, 0xf7, 0xc4, 0x4f, 0x88, 0xdc, 0x5f, 0xb9, 0x64, 0x47, 0x7a, 0x8c, 0xd7, 0x90, 0xa9, 0x05, 0x76, + 0x3c, 0xf5, 0x0b, 0x56, 0x23, 0x59, 0xa4, 0x99, 0xcc, 0x41, 0xfc, 0x98, 0x77, 0x10, 0xd9, 0x49, 0xec, 0x08, 0x82, 0xe4, 0xbc, 0xf6, 0xf7, 0x41, 0xa2, 0x57, 0xdb, 0x84, 0xe3, 0x09, 0x1c, 0xa6, + 0x12, 0xa6, 0xde, 0x70, 0x19, 0xaf, 0x4f, 0x63, 0x67, 0x32, 0x8a, 0x21, 0x1f, 0xa6, 0xc8, 0xda, 0xcb, 0x3a, 0xc7, 0x64, 0x7d, 0x75, 0x69, 0xeb, 0x53, 0x8b, 0x80, 0xf7, 0xb3, 0xf0, 0x3b, 0x09, + 0xfb, 0xdc, 0x72, 0xf9, 0x60, 0x51, 0x3c, 0x30, 0x61, 0xec, 0x2c, 0xb5, 0xcd, 0x6a, 0x90, 0x9c, 0xbd, 0xdf, 0x5f, 0x50, 0xcf, 0x4c, 0xff, 0x19, 0xa0, 0xcf, 0x04, 0x12, 0x7d, 0x4e, 0x20, 0xcf, + 0x24, 0x5f, 0xc0, 0x2f, 0xcf, 0x39, 0x96, 0x1e, 0xc2, 0x68, 0x51, 0x75, 0x02, 0xac, 0xe0, 0x4d, 0xc7, 0xa1, 0xea, 0x58, 0xea, 0x9a, 0x20, 0x21, 0xfc, 0x79, 0x07, 0xb7, 0x9e, 0x6c, 0x8d, 0x2a, + 0x42, 0x97, 0x63, 0x7b, 0xb2, 0xa4, 0x9b, 0x32, 0xd9, 0x33, 0x86, 0x31, 0x3d, 0x60, 0x44, 0x47, 0x20, 0x44, 0xbc, 0x8d, 0x86, 0x11, 0xdc, 0x4e, 0x04, 0x15, 0x45, 0x59, 0x9c, 0x05, 0xe2, 0x91, + 0x98, 0x1b, 0x9c, 0x00, 0xef, 0xa8, 0x18, 0x20, 0x29, 0xd6, 0x84, 0x9e, 0x87, 0xdc, 0x0b, 0xe3, 0x78, 0x50, 0x98, 0xa9, 0x7f, 0x89, 0x5d, 0x93, 0x77, 0x78, 0xfe, 0xa5, 0x4a, 0xa1, 0xf6, 0xbc, + 0x4f, 0x33, 0x5f, 0xc4, 0x6f, 0xe8, 0x37, 0xfa, 0x73, 0x0e, 0x9c, 0x49, 0x9e, 0x38, 0x70, 0x3e, 0x18, 0x9c, 0xa9, 0x7c, 0xcf, 0x81, 0xa9, 0x1c, 0x32, 0xf9, 0xfa, 0x58, 0x1d, 0x42, 0xc3, 0x60, + 0x27, 0x86, 0x65, 0x5b, 0xf2, 0xdc, 0x36, 0xa2, 0xc9, 0x66, 0x3b, 0x67, 0xd2, 0x61, 0xbb, 0x07, 0xf3, 0xf1, 0x74, 0x27, 0xc7, 0x43, 0x1c, 0xa4, 0x8f, 0xdd, 0x18, 0x4e, 0xcd, 0x91, 0x5d, 0xad, + 0x49, 0x9d, 0x27, 0xa8, 0x22, 0xe4, 0x40, 0x7f, 0x25, 0x8d, 0x75, 0xb2, 0x74, 0x0a, 0xce, 0x6a, 0xa9, 0x20, 0xf3, 0xe8, 0xb1, 0x5e, 0xd7, 0x7b, 0xfe, 0xbf, 0x8c, 0x9f, 0xbf, 0xd0, 0xf8, 0xe9, + 0x21, 0xb7, 0xb7, 0x46, 0xf5, 0x49, 0x4b, 0xbc, 0x2b, 0x05, 0x0a, 0x5d, 0xd7, 0x25, 0x71, 0xec, 0x7a, 0x13, 0xe9, 0xa7, 0x23, 0xda, 0xea, 0x0b, 0x15, 0xf1, 0x4c, 0xdc, 0xfb, 0x4c, 0xf1, 0x24, + 0x9f, 0xa7, 0xbf, 0x7d, 0x23, 0xde, 0xe0, 0xda, 0x23, 0xe5, 0xb6, 0x93, 0x8f, 0x84, 0x84, 0xb6, 0x9b, 0x05, 0x6f, 0xf1, 0xf4, 0x96, 0x1c, 0xe2, 0x44, 0x41, 0xd9, 0x05, 0x02, 0xf0, 0x11, 0x45, + 0x33, 0xb8, 0x53, 0x51, 0x07, 0x49, 0x40, 0x47, 0x22, 0x9d, 0xb9, 0x1a, 0x4e, 0xad, 0x33, 0xb6, 0x65, 0x14, 0x4a, 0xa0, 0xba, 0xd9, 0x6e, 0xad, 0x49, 0x55, 0x24, 0x4b, 0x21, 0xe1, 0x75, 0x3c, + 0x31, 0x85, 0xf2, 0x91, 0x63, 0xeb, 0xd6, 0xa4, 0xbf, 0x0d, 0x75, 0xf6, 0xdc, 0xfb, 0x0c, 0x68, 0xdb, 0x8c, 0xe3, 0x81, 0x15, 0xa6, 0xce, 0x5f, 0x3a, 0xcd, 0xbf, 0x52, 0x05, 0x07, 0x6f, 0xc7, + 0x7d, 0x27, 0x7a, 0x92, 0x07, 0xa6, 0x16, 0x13, 0x06, 0xc5, 0x08, 0x57, 0x67, 0xd6, 0x54, 0x77, 0x4b, 0xbb, 0x3a, 0x24, 0xf2, 0xd2, 0x74, 0x89, 0x82, 0x0f, 0xe7, 0x5d, 0xd2, 0xc1, 0xa1, 0x5d, + 0xb8, 0xea, 0x02, 0x80, 0x4c, 0x9a, 0x5c, 0x2d, 0xbc, 0x7a, 0x1f, 0x4c, 0xca, 0x0c, 0x91, 0x87, 0xa9, 0x9d, 0xdb, 0xd3, 0xaa, 0xe3, 0xc4, 0xaa, 0xd3, 0x3c, 0x44, 0x9c, 0xcd, 0x6a, 0x57, 0x5d, + 0xcc, 0x64, 0xbd, 0xdc, 0x17, 0x3d, 0x93, 0x40, 0x5e, 0x9d, 0xda, 0xd5, 0x69, 0xee, 0xbd, 0x42, 0x72, 0x92, 0xbb, 0x77, 0x19, 0x43, 0xdf, 0xad, 0x06, 0x27, 0xd3, 0x25, 0x4c, 0xcb, 0xd0, 0x7e, + 0x9d, 0xdd, 0xfa, 0x66, 0xf9, 0x7a, 0xe8, 0x85, 0xde, 0x51, 0x12, 0x3b, 0xc8, 0x76, 0xa1, 0x63, 0x7e, 0x55, 0xeb, 0xf6, 0x73, 0x75, 0xfc, 0x42, 0xf4, 0xc4, 0xb9, 0xeb, 0xe1, 0xb9, 0xb4, 0xad, + 0x87, 0x4a, 0x1e, 0x17, 0x68, 0xe9, 0x2d, 0x37, 0x02, 0x91, 0xc9, 0x76, 0xe4, 0x21, 0x8b, 0x44, 0x49, 0xa6, 0x0b, 0xcf, 0xdd, 0x72, 0x8d, 0x36, 0x72, 0x5c, 0xff, 0x38, 0x82, 0xc2, 0xad, 0x88, + 0xbb, 0x16, 0xb2, 0x85, 0xa1, 0x7a, 0xba, 0x50, 0x18, 0x5a, 0xa2, 0xf8, 0x51, 0x6b, 0x38, 0x5b, 0xba, 0xdd, 0x5a, 0xd4, 0x51, 0x5b, 0x77, 0xe8, 0x2c, 0x8a, 0x64, 0x3f, 0x1a, 0xee, 0x56, 0x6a, + 0x69, 0xc8, 0xfb, 0x09, 0xb1, 0xfb, 0xc4, 0x51, 0xff, 0xb9, 0x96, 0x0e, 0x53, 0x27, 0x6c, 0x42, 0xa7, 0x36, 0xe3, 0x2f, 0x55, 0x5b, 0x6e, 0xd6, 0x71, 0x12, 0xc6, 0x71, 0x71, 0xd1, 0x9f, 0x17, + 0xea, 0xe0, 0x73, 0xea, 0xed, 0x26, 0x0d, 0xf7, 0xeb, 0xdf, 0xef, 0x95, 0xcf, 0x49, 0xf9, 0xbd, 0x58, 0x33, 0xa7, 0x7b, 0xef, 0x72, 0xc8, 0x7e, 0x9c, 0x59, 0x83, 0xdc, 0x2c, 0xdc, 0xf4, 0x5c, + 0x25, 0xf9, 0xef, 0xf8, 0xfb, 0x7f, 0x0e, 0xcb, 0xc1, 0xd5, 0x23, 0x79, 0x49, 0x61, 0xfd, 0x3b, 0xf2, 0xfb, 0x5d, 0x51, 0x5f, 0x58, 0x0e, 0x4e, 0x74, 0xce, 0x37, 0xb1, 0xf7, 0x55, 0x98, 0x1f, + 0x73, 0x60, 0xff, 0xfe, 0x21, 0x07, 0x56, 0xb8, 0xa6, 0xe3, 0x84, 0x45, 0x7e, 0xbd, 0x4b, 0x3c, 0x51, 0xc4, 0xf1, 0x07, 0xf5, 0x1b, 0x7e, 0x98, 0x12, 0x7d, 0xc9, 0x6e, 0x7e, 0x9e, 0x53, 0xf5, + 0xca, 0x73, 0x35, 0x49, 0x79, 0xfd, 0x38, 0xf4, 0x66, 0x8c, 0x7d, 0x31, 0x26, 0xe2, 0xac, 0x76, 0x5e, 0xff, 0xef, 0xd1, 0xb0, 0x20, 0x9f, 0xd3, 0x68, 0x6f, 0x74, 0x4f, 0x23, 0xe3, 0xed, 0x6c, + 0x40, 0xf6, 0xd3, 0x6a, 0x6a, 0xc8, 0xef, 0xd5, 0x72, 0xbd, 0xe3, 0x8c, 0x84, 0xe3, 0x0c, 0xe2, 0x68, 0xa2, 0xbb, 0xee, 0x08, 0x72, 0x34, 0x40, 0x01, 0x5b, 0xc0, 0xc6, 0xdd, 0xd9, 0x4e, 0xaa, + 0x8c, 0xb9, 0x1d, 0xee, 0x00, 0xe1, 0x88, 0x1c, 0x99, 0xcc, 0x4a, 0x3a, 0xdb, 0xb4, 0x0f, 0xf0, 0x84, 0x9f, 0xb5, 0x5e, 0xc0, 0x8f, 0x4d, 0x71, 0xb9, 0x9b, 0x37, 0x94, 0x7c, 0xd4, 0x78, 0x7e, + 0xd5, 0x6d, 0x89, 0x61, 0xa6, 0x4d, 0xf7, 0x3d, 0xb5, 0xda, 0x9f, 0xa8, 0xfb, 0x3c, 0xd7, 0x47, 0x58, 0xa1, 0x1f, 0x5e, 0x04, 0xf1, 0xa3, 0x25, 0x9f, 0x17, 0x99, 0xed, 0x96, 0x97, 0xff, 0x86, + 0x4e, 0xf4, 0xe1, 0xbb, 0xdb, 0x75, 0x15, 0xc6, 0x2f, 0xf7, 0x90, 0x9b, 0xc0, 0xfa, 0xe9, 0x56, 0x1d, 0x3a, 0xd7, 0x9f, 0x85, 0x3e, 0xd2, 0x9f, 0xdf, 0x48, 0x16, 0x4c, 0xfc, 0xf1, 0x3f, 0xfe, + 0x86, 0xf4, 0x89, 0xff, 0xdb, 0x59, 0x62, 0x85, 0xa9, 0xeb, 0x0c, 0xca, 0xaa, 0x70, 0xcd, 0xe4, 0x8b, 0x99, 0x8e, 0xfa, 0xb9, 0x5c, 0xdc, 0xd3, 0x3e, 0xc9, 0xc6, 0xfd, 0x95, 0xf3, 0xac, 0x47, + 0x7d, 0x2f, 0x1f, 0x53, 0x71, 0x8d, 0x71, 0x1b, 0xaf, 0x5e, 0xb8, 0xac, 0x47, 0xda, 0x23, 0x6b, 0xc4, 0x2d, 0xa6, 0x5a, 0xb0, 0x94, 0xc6, 0x7b, 0x00, 0xd9, 0xd1, 0x74, 0x31, 0x8a, 0x93, 0xcd, + 0xa8, 0xb1, 0x9b, 0xe9, 0x04, 0x1f, 0x8d, 0x60, 0xd6, 0x58, 0x6a, 0x95, 0x34, 0xa5, 0xa5, 0x71, 0xe0, 0xc4, 0xdd, 0xb0, 0xe3, 0xf5, 0xc3, 0x31, 0xa0, 0xe2, 0xb1, 0x93, 0x36, 0x09, 0xc7, 0xbb, + 0x20, 0x80, 0xdb, 0x4e, 0x36, 0x71, 0x9e, 0x4f, 0x91, 0x3b, 0x6e, 0x6c, 0xb6, 0xb7, 0x90, 0xfd, 0xfa, 0x77, 0xf8, 0xa9, 0x2a, 0xae, 0xbe, 0x76, 0x48, 0x96, 0x24, 0x66, 0xea, 0x7c, 0xea, 0x5b, + 0xc0, 0xcf, 0xa5, 0xb9, 0x5e, 0xc9, 0x5e, 0x18, 0x73, 0x39, 0x1e, 0xc0, 0x3d, 0x33, 0x5c, 0x43, 0x96, 0x8b, 0xb5, 0xaa, 0x02, 0x47, 0xeb, 0x4c, 0x2f, 0xa8, 0x2c, 0x6b, 0xa3, 0x68, 0xbd, 0x71, + 0xe6, 0x61, 0xcc, 0xcb, 0xbb, 0xed, 0x42, 0x1b, 0x01, 0xb3, 0xe0, 0xc8, 0xc9, 0x15, 0xbf, 0x3c, 0xec, 0xa0, 0x0d, 0x16, 0x61, 0xb1, 0x84, 0xad, 0xf3, 0xa8, 0xde, 0x27, 0x9b, 0x63, 0x91, 0x8d, + 0xbc, 0xd4, 0x93, 0x25, 0x56, 0x9c, 0xb3, 0xe2, 0x88, 0x3c, 0x14, 0x2d, 0x1b, 0x68, 0x66, 0xb1, 0x8e, 0x92, 0x9f, 0x64, 0xb8, 0x60, 0xa2, 0x1f, 0x74, 0x79, 0x96, 0xba, 0x69, 0x35, 0x70, 0x93, + 0xb0, 0xaa, 0x3e, 0x87, 0xf0, 0xa9, 0x6a, 0xd9, 0x0f, 0xd4, 0x2f, 0x48, 0xde, 0x5f, 0xeb, 0x5b, 0x6b, 0xbd, 0x71, 0xd0, 0xd2, 0x25, 0xc4, 0x11, 0x50, 0xf2, 0xb0, 0x7c, 0xd8, 0x1b, 0x51, 0x69, + 0x8b, 0x45, 0x5d, 0xe4, 0x13, 0x61, 0xee, 0xf1, 0x10, 0xd8, 0xea, 0xa9, 0x14, 0xa6, 0x84, 0x08, 0x16, 0x63, 0x34, 0xe1, 0xeb, 0x8a, 0x6d, 0x94, 0x82, 0xa1, 0x83, 0x45, 0x6d, 0xa1, 0xc5, 0x10, + 0xaa, 0xd7, 0x16, 0x20, 0x4d, 0xa4, 0x51, 0x3d, 0x81, 0x44, 0x3d, 0x1b, 0x0d, 0x21, 0xdd, 0xf1, 0xcc, 0xaa, 0xdc, 0x7c, 0x22, 0xe4, 0x5f, 0x01, 0x76, 0x13, 0x7c, 0x78, 0x84, 0x14, 0xf4, 0x54, + 0xe5, 0xc1, 0x1b, 0xd9, 0x33, 0x44, 0x2f, 0x27, 0x03, 0xa8, 0x5f, 0xf5, 0x01, 0x28, 0x15, 0x0d, 0xe6, 0x94, 0x87, 0x56, 0x5c, 0x8f, 0xbc, 0x2c, 0x98, 0xe5, 0xdd, 0x30, 0x23, 0x74, 0x0b, 0x9d, + 0x75, 0xa8, 0x54, 0x28, 0xe3, 0xfd, 0x88, 0xc5, 0x0b, 0xb9, 0x0e, 0x66, 0x1b, 0xd2, 0x0c, 0xaa, 0xd8, 0xd2, 0x97, 0xe9, 0xf6, 0x78, 0x40, 0x2c, 0x66, 0xca, 0x6d, 0xe2, 0xc8, 0xa4, 0xc9, 0x89, + 0xc6, 0x9a, 0x9a, 0x41, 0x1d, 0x4a, 0xd6, 0xc9, 0x9c, 0x69, 0x63, 0xed, 0x82, 0x65, 0xb2, 0x7f, 0x02, 0x9b, 0x6c, 0x17, 0x7e, 0x56, 0x91, 0x01, 0x3d, 0xb5, 0x7a, 0xe2, 0x42, 0xf2, 0x8c, 0xc9, + 0xe9, 0x60, 0x00, 0xf5, 0x5b, 0x28, 0xa1, 0x1b, 0xe8, 0x4c, 0x69, 0x53, 0x30, 0xa3, 0x7c, 0x6f, 0xb9, 0x88, 0xd3, 0x58, 0x23, 0x7d, 0xf2, 0xb8, 0xc7, 0xfc, 0x96, 0x27, 0x78, 0xa9, 0x0e, 0x66, + 0xc2, 0xd2, 0x34, 0x67, 0x65, 0x39, 0x1b, 0x21, 0x7b, 0x7f, 0xac, 0x48, 0x90, 0x2f, 0xf8, 0x95, 0xdc, 0x64, 0xad, 0xb1, 0x92, 0xab, 0x21, 0x6d, 0x11, 0x0e, 0x83, 0x05, 0x9e, 0x3d, 0x74, 0xb6, + 0xb8, 0x59, 0xec, 0x1a, 0x1b, 0xe4, 0x99, 0xa4, 0x38, 0xfc, 0x60, 0xf0, 0xfd, 0x01, 0xfd, 0xee, 0x37, 0xfc, 0x4e, 0x5f, 0x15, 0x7d, 0x6a, 0x86, 0x9f, 0xa6, 0xd4, 0x9f, 0x27, 0x94, 0x5f, 0xa9, + 0xbe, 0xe2, 0x16, 0x99, 0xc5, 0xb9, 0x8c, 0xae, 0x47, 0xda, 0x78, 0x35, 0x3e, 0x12, 0x19, 0x5b, 0x2c, 0x01, 0x21, 0xe8, 0x56, 0xcb, 0x85, 0x32, 0x8c, 0x70, 0x89, 0x04, 0x75, 0x34, 0xe2, 0xc0, + 0x44, 0x61, 0x9b, 0x31, 0x38, 0x76, 0xe7, 0xb0, 0x2a, 0x26, 0x8b, 0x94, 0xc0, 0x91, 0x50, 0x60, 0x70, 0x1d, 0x93, 0x47, 0x1d, 0x33, 0x8c, 0x01, 0x9c, 0xe7, 0x78, 0x2d, 0x6e, 0x65, 0x99, 0x06, + 0xa4, 0x64, 0xab, 0x08, 0x09, 0xc4, 0x8a, 0xca, 0x21, 0x1f, 0xe3, 0x8b, 0xfd, 0x8f, 0x33, 0x66, 0x8e, 0x7b, 0x31, 0x2c, 0x1f, 0xeb, 0x22, 0xf8, 0x09, 0x49, 0x3a, 0x53, 0x3c, 0xaf, 0xf1, 0x30, + 0xab, 0xe0, 0x1c, 0x1e, 0xfd, 0x46, 0x8e, 0xe0, 0x01, 0x6d, 0xee, 0x6d, 0x71, 0x44, 0x3a, 0xbb, 0x54, 0x99, 0x4e, 0x27, 0xf6, 0xca, 0x4f, 0x74, 0x7c, 0x3c, 0xb3, 0x66, 0xf6, 0xd1, 0xff, 0x2a, + 0xf2, 0xfb, 0x92, 0x62, 0x7d, 0xf4, 0xdb, 0xb1, 0xdf, 0xe8, 0x13, 0x0c, 0x3d, 0x53, 0x3c, 0xff, 0x76, 0xab, 0xf6, 0xcf, 0xcb, 0x07, 0x7a, 0x30, 0x52, 0xd8, 0xa8, 0x53, 0xb6, 0x96, 0x14, 0xd4, + 0x1d, 0x57, 0xe2, 0x42, 0x68, 0xd2, 0xb5, 0x4e, 0x2e, 0xec, 0x9d, 0x5b, 0xc1, 0x11, 0x54, 0xe1, 0x7c, 0xcd, 0x97, 0xd3, 0x4e, 0x10, 0xba, 0xd2, 0xdd, 0x8d, 0x71, 0xc4, 0x88, 0xa9, 0xbd, 0xe2, + 0x4d, 0xe7, 0xc2, 0x24, 0x2c, 0x0f, 0xda, 0x7e, 0xde, 0xb0, 0xea, 0x6c, 0xcb, 0xf2, 0xbe, 0x06, 0x90, 0x33, 0xb0, 0x61, 0xd6, 0xeb, 0xc0, 0x0d, 0x0e, 0x47, 0x6f, 0x27, 0xf6, 0x33, 0x1a, 0x93, + 0xf2, 0x45, 0x7a, 0x7f, 0x6e, 0x9b, 0x3d, 0xf4, 0x14, 0xbe, 0x2f, 0x82, 0xbc, 0xc6, 0x92, 0xca, 0x81, 0x9d, 0xc5, 0x77, 0xeb, 0x62, 0xce, 0x77, 0xff, 0x44, 0x3d, 0xe4, 0x5d, 0x15, 0xf0, 0xe3, + 0x41, 0x0a, 0xfd, 0xc6, 0x9f, 0xe0, 0xe9, 0x0b, 0xd9, 0xeb, 0xc2, 0xa3, 0xcb, 0xc9, 0xb9, 0xf0, 0x0a, 0xff, 0x9e, 0xbb, 0xa9, 0x10, 0x6e, 0xfc, 0xc4, 0xa2, 0xab, 0x04, 0x36, 0xd1, 0x45, 0x99, + 0xae, 0x18, 0x8f, 0x00, 0xa5, 0x95, 0xa7, 0xd9, 0x51, 0xbb, 0xc6, 0x1b, 0x6a, 0x05, 0xcb, 0x5a, 0xe7, 0x30, 0x09, 0x5b, 0x68, 0x0b, 0x2c, 0x38, 0x02, 0xbe, 0x0a, 0x1e, 0x60, 0x9d, 0xb1, 0x53, + 0xb2, 0xa3, 0xfc, 0x45, 0x25, 0x85, 0x63, 0xba, 0x30, 0x18, 0x5f, 0xaf, 0x2c, 0x33, 0x43, 0xc5, 0xfd, 0x2a, 0x01, 0xd7, 0xb0, 0xf4, 0x9d, 0xbf, 0xfc, 0x39, 0xc3, 0x6f, 0x43, 0x41, 0x0f, 0x0c, + 0x7d, 0xb7, 0x1c, 0x9c, 0x43, 0x1f, 0x95, 0x5b, 0x98, 0xd5, 0x99, 0x3b, 0xbd, 0x83, 0x23, 0xf7, 0x41, 0xbd, 0x72, 0x60, 0x16, 0x7e, 0x9d, 0xbc, 0xb8, 0x76, 0x7f, 0xbf, 0xaf, 0xb8, 0xb9, 0x3c, + 0xe1, 0x98, 0x95, 0x3b, 0xc8, 0xac, 0xc8, 0xb5, 0xdf, 0xdc, 0x8e, 0xf7, 0xfe, 0x6f, 0xe1, 0xfa, 0xee, 0xf1, 0xf1, 0xcf, 0x08, 0xcb, 0x73, 0x9d, 0xcd, 0xaf, 0x97, 0xd2, 0x4d, 0xfc, 0xf6, 0xe6, + 0x85, 0xec, 0x20, 0x2c, 0x5f, 0xff, 0x17, 0x7b, 0x70, 0x7b, 0xe7, 0xb6, 0xe5, 0x63, 0xe2, 0x97, 0x07, 0x7e, 0x9b, 0x65, 0x19, 0xfa, 0x67, 0xe1, 0xf9, 0x3b, 0xf6, 0xde, 0x3b, 0x3f, 0xff, 0xb4, + 0xfc, 0x77, 0x5e, 0x64, 0x55, 0x56, 0xb5, 0xb9, 0xfb, 0xdb, 0x8b, 0x4d, 0xff, 0x2d, 0xc8, 0x79, 0x87, 0x6b, 0x19, 0x3a, 0xee, 0xc0, 0x0e, 0xcc, 0x34, 0x75, 0xe3, 0xd7, 0x6f, 0x45, 0x6f, 0x9f, + 0x38, 0x04, 0xa1, 0x1d, 0x0c, 0xac, 0xec, 0xe8, 0x3a, 0x83, 0xbc, 0x08, 0x93, 0xb0, 0x0a, 0x1b, 0xf7, 0x31, 0xb8, 0x97, 0x47, 0xed, 0x2c, 0x8e, 0xdd, 0x73, 0x1c, 0xeb, 0xab, 0xa7, 0x6e, 0x0a, + 0x92, 0x5e, 0x3f, 0xf4, 0x1f, 0x11, 0xc6, 0xba, 0x19, 0x45, 0x77, 0xd7, 0xdf, 0x98, 0xf8, 0xd7, 0x8d, 0xd8, 0x2b, 0x4d, 0x70, 0xf0, 0x72, 0xd4, 0x77, 0xac, 0x1e, 0xd9, 0x28, 0x18, 0x17, 0xa8, + 0xbd, 0x1e, 0x2d, 0xa1, 0x51, 0xe7, 0x28, 0x0b, 0x49, 0xd0, 0x8c, 0xb4, 0x12, 0x95, 0x23, 0x98, 0x1c, 0x38, 0x09, 0xdf, 0x1c, 0x30, 0x9a, 0x8c, 0x85, 0xc5, 0x10, 0xd2, 0x66, 0x34, 0x4f, 0xcc, + 0x25, 0x01, 0x74, 0x85, 0xf1, 0xba, 0xce, 0xa0, 0x26, 0xd8, 0xf3, 0x86, 0x02, 0x28, 0x63, 0x7c, 0x91, 0x65, 0xce, 0x81, 0xa1, 0xe9, 0xcc, 0x10, 0x1d, 0x74, 0xea, 0xd2, 0xcb, 0x27, 0xa6, 0x54, + 0x2f, 0x4c, 0xdd, 0x41, 0x5e, 0x64, 0xb9, 0x5b, 0x54, 0xe1, 0x17, 0xc9, 0x59, 0xf8, 0x89, 0xd0, 0xdf, 0x07, 0xea, 0x67, 0xad, 0xf6, 0xee, 0xda, 0x79, 0xda, 0xed, 0x11, 0x0c, 0x44, 0xb9, 0xbd, + 0xa7, 0x2f, 0x23, 0x24, 0x5e, 0x75, 0x0e, 0x27, 0x79, 0x94, 0x31, 0x37, 0x26, 0xe0, 0x16, 0x30, 0xea, 0x16, 0x18, 0xf9, 0x63, 0xc2, 0x83, 0x09, 0xcc, 0xa5, 0x96, 0xc8, 0x81, 0x74, 0xfc, 0x34, + 0x5f, 0xd2, 0xc5, 0x68, 0xec, 0x16, 0x33, 0x3d, 0xe7, 0x30, 0x62, 0xae, 0xeb, 0x76, 0x94, 0xee, 0x1c, 0x61, 0xcd, 0x45, 0xc2, 0x6e, 0x48, 0x13, 0xdb, 0xe9, 0x88, 0x02, 0x50, 0x69, 0x19, 0x6b, + 0x3d, 0xa7, 0xae, 0x8f, 0x43, 0x18, 0xfa, 0x0d, 0xff, 0x7c, 0x16, 0xbb, 0x2b, 0x7e, 0xfb, 0x8e, 0x29, 0x5f, 0x05, 0xd0, 0x9f, 0xb1, 0x74, 0xce, 0x34, 0x5f, 0x19, 0xe0, 0xf4, 0x29, 0xca, 0x84, + 0x07, 0xad, 0x8e, 0x58, 0x5d, 0xe3, 0xa8, 0xce, 0x28, 0xe4, 0x27, 0x62, 0x9c, 0x4f, 0x37, 0x33, 0x03, 0xc3, 0x4b, 0x2f, 0xcf, 0xb9, 0x1f, 0x4b, 0xda, 0x3b, 0xff, 0xff, 0xaf, 0xfc, 0xb6, 0x5b, + 0xd2, 0xe7, 0x4f, 0xbc, 0xbd, 0xd0, 0xe7, 0x4b, 0x4f, 0x02, 0x66, 0xb4, 0xd2, 0x98, 0x5c, 0x7b, 0x43, 0xd8, 0x5c, 0x8d, 0xa0, 0xcd, 0x71, 0x85, 0x2d, 0x67, 0xc5, 0x92, 0x1d, 0x69, 0x31, 0x39, + 0x71, 0x4a, 0x78, 0x4c, 0x27, 0x13, 0xc7, 0xce, 0xb6, 0xe6, 0x41, 0x4b, 0x57, 0x63, 0x52, 0x1a, 0x07, 0xf9, 0xda, 0xaf, 0xea, 0xf9, 0x1c, 0x31, 0xe9, 0x9d, 0x4f, 0x9a, 0xa4, 0x28, 0x61, 0x70, + 0x74, 0x14, 0x24, 0x03, 0x26, 0x73, 0x6c, 0xeb, 0xcc, 0x52, 0x8e, 0xdd, 0xa1, 0xdc, 0x27, 0x05, 0xba, 0x7d, 0x25, 0xe6, 0x52, 0xa5, 0xdc, 0x47, 0x64, 0xf2, 0xcf, 0xe4, 0x05, 0x79, 0x12, 0xd3, + 0xfc, 0x22, 0x2c, 0xb9, 0x73, 0xd6, 0x68, 0x3d, 0xf0, 0xf3, 0xc9, 0x94, 0x25, 0x04, 0xc2, 0x69, 0xc7, 0x61, 0xb6, 0xc8, 0x7c, 0x9a, 0x9e, 0xe5, 0xc5, 0x2c, 0x67, 0xaa, 0xed, 0x3c, 0x59, 0x04, + 0xb9, 0xb0, 0x03, 0x8b, 0x8c, 0xe9, 0x1c, 0x0b, 0xf5, 0xe6, 0x01, 0x01, 0x83, 0x25, 0x98, 0x0a, 0xa5, 0xb7, 0x21, 0xb2, 0xb4, 0xe5, 0x0e, 0x3b, 0x86, 0xde, 0x80, 0x7c, 0xcc, 0xa0, 0xed, 0x88, + 0x81, 0xe2, 0x89, 0xd4, 0x28, 0x99, 0x38, 0xa1, 0xcb, 0x72, 0xfe, 0x53, 0xff, 0xaa, 0x4f, 0x64, 0xc8, 0x71, 0x3b, 0x33, 0xf6, 0x3f, 0xab, 0x06, 0x7d, 0xae, 0x5c, 0xf7, 0x4a, 0xf3, 0x8c, 0xd8, + 0xf9, 0xa8, 0x6f, 0x41, 0x6e, 0xa1, 0x49, 0x02, 0x64, 0x79, 0x00, 0x9e, 0x42, 0x62, 0x96, 0x96, 0x16, 0x20, 0x6d, 0xb7, 0xde, 0xda, 0x9b, 0x97, 0x61, 0xc2, 0x63, 0xec, 0xa4, 0x4a, 0xd2, 0x79, + 0x2e, 0xb0, 0x3a, 0x25, 0xc2, 0x0a, 0xd3, 0x2d, 0x63, 0xb1, 0x18, 0x73, 0x9e, 0x93, 0x59, 0x05, 0x95, 0x2e, 0x78, 0xbe, 0xdc, 0xf8, 0x2a, 0xd3, 0x72, 0x9b, 0xbd, 0x2b, 0x8d, 0xc4, 0x2e, 0x51, + 0x15, 0x6e, 0x4f, 0x76, 0xcd, 0xbb, 0xd2, 0xa8, 0x1f, 0x99, 0x6c, 0xd7, 0xe5, 0x03, 0x2f, 0x2b, 0xf2, 0x6f, 0xa7, 0xf8, 0xc2, 0xcc, 0xf3, 0xf3, 0x2f, 0xef, 0x93, 0x34, 0x75, 0xb2, 0x2a, 0xf4, + 0xd3, 0xac, 0xf8, 0xdc, 0xf1, 0x7f, 0x26, 0x71, 0xfa, 0x4a, 0xf5, 0x84, 0xf3, 0xcb, 0xf1, 0x00, 0xea, 0x97, 0x40, 0x55, 0x66, 0xb3, 0x99, 0xea, 0x49, 0x66, 0x5d, 0x97, 0xe6, 0x76, 0xc1, 0x00, + 0x94, 0xe7, 0x6f, 0x81, 0xf5, 0xb6, 0x19, 0x69, 0x3b, 0x46, 0x4e, 0xb6, 0x0d, 0x59, 0xee, 0x88, 0x34, 0x8b, 0xc6, 0x86, 0xd1, 0xd4, 0xbc, 0xb2, 0x9e, 0x29, 0x2d, 0x64, 0xec, 0x30, 0x25, 0x67, + 0xc5, 0x31, 0x31, 0x19, 0x47, 0x12, 0x14, 0xe5, 0xa3, 0x83, 0x4d, 0x33, 0x0d, 0x8b, 0xb9, 0x99, 0xd7, 0xb4, 0xdd, 0xc8, 0xde, 0x8c, 0x9f, 0x37, 0x8e, 0x93, 0x30, 0x0d, 0xdf, 0xea, 0x59, 0xd0, + 0xc7, 0xcb, 0x81, 0xac, 0x30, 0xbd, 0xff, 0xaf, 0xcb, 0x27, 0x9f, 0x71, 0xb2, 0xc2, 0x14, 0x7c, 0x39, 0xfd, 0x9e, 0x21, 0x6e, 0x39, 0x78, 0x59, 0x68, 0xfa, 0xf9, 0x14, 0x4f, 0x3d, 0xa1, 0x28, + 0x6e, 0x08, 0x83, 0x83, 0xdb, 0xb3, 0xc1, 0x85, 0xe0, 0xf7, 0x8c, 0x59, 0x2d, 0xba, 0x25, 0xc9, 0x15, 0xa2, 0x49, 0xc9, 0x12, 0x14, 0x99, 0xc8, 0x01, 0xd5, 0xd7, 0xab, 0x4e, 0xf1, 0x17, 0xcc, + 0x4c, 0x70, 0x04, 0x7e, 0x0b, 0xb7, 0xdb, 0xc6, 0xed, 0xa2, 0x75, 0x2a, 0x51, 0xc3, 0x31, 0xb0, 0xdd, 0x40, 0x14, 0x20, 0x75, 0x15, 0x92, 0x74, 0xa8, 0x3e, 0x42, 0xc6, 0xf6, 0x0e, 0x04, 0x0e, + 0x78, 0xe5, 0xcd, 0xf7, 0xe0, 0x26, 0x53, 0xe8, 0xe9, 0x7e, 0xb1, 0x98, 0x71, 0x48, 0xdb, 0xb3, 0x28, 0xfa, 0xa3, 0x8b, 0x72, 0x67, 0x76, 0xbb, 0xe5, 0xa0, 0xca, 0x3e, 0x98, 0xc8, 0xc8, 0xbb, + 0x4e, 0x16, 0xcf, 0xa5, 0x78, 0xdf, 0x3d, 0x12, 0x98, 0x6f, 0xa6, 0x05, 0xfa, 0xee, 0xc6, 0xa0, 0x6c, 0x13, 0x2b, 0x8b, 0xcb, 0xc7, 0x3f, 0x32, 0x2c, 0x07, 0xa7, 0xcf, 0x30, 0xad, 0xf8, 0xed, + 0x07, 0xa2, 0xef, 0x1e, 0x48, 0x5d, 0xdf, 0x3c, 0x7d, 0xc1, 0xa0, 0x73, 0x8b, 0xec, 0x75, 0x80, 0xbf, 0x77, 0xa3, 0xee, 0x1d, 0xa0, 0xf7, 0x2f, 0xb9, 0x59, 0xa2, 0x0a, 0x7f, 0xe6, 0x02, 0xa5, + 0x65, 0xfe, 0xe6, 0x61, 0x0d, 0xef, 0x35, 0xc8, 0x5f, 0xe1, 0x07, 0x5d, 0x7e, 0xc3, 0x8d, 0x1f, 0x54, 0x15, 0x61, 0xe2, 0xde, 0xb0, 0x0f, 0xfb, 0xf6, 0xe9, 0xb2, 0x32, 0x8b, 0xea, 0xf1, 0xf3, + 0x75, 0x6a, 0x65, 0xc7, 0x07, 0x1e, 0xd1, 0x53, 0x49, 0x8a, 0x7f, 0xc4, 0x32, 0x87, 0x8f, 0x2e, 0xf5, 0x67, 0xc6, 0xfc, 0xcf, 0x95, 0xef, 0x3b, 0xda, 0x97, 0xc1, 0x7e, 0x7b, 0xe5, 0x6c, 0xc8, + 0xf7, 0x50, 0xc4, 0xc0, 0x58, 0xe6, 0xa9, 0x99, 0x7e, 0xb0, 0x38, 0xe6, 0x60, 0xb5, 0x87, 0x28, 0x4c, 0x0e, 0x06, 0xc7, 0xe6, 0x14, 0x5d, 0xeb, 0x1a, 0x2f, 0x21, 0x0b, 0x63, 0xaa, 0x66, 0x21, + 0x42, 0xc7, 0x02, 0x2f, 0xa1, 0xae, 0x95, 0xce, 0xe7, 0xc3, 0x03, 0xb8, 0x5e, 0xe5, 0x6b, 0xa3, 0xa2, 0x49, 0x1a, 0xd2, 0x57, 0xe6, 0x76, 0x7c, 0x00, 0x78, 0x72, 0x39, 0x65, 0xdc, 0x6c, 0xbe, + 0x25, 0x79, 0xa1, 0xe1, 0xc8, 0xe0, 0x3b, 0x3b, 0xeb, 0x69, 0x15, 0xf0, 0x78, 0xe8, 0x42, 0xdf, 0x8d, 0xd0, 0xef, 0x22, 0x14, 0x1f, 0x33, 0xeb, 0xc9, 0xcd, 0xcc, 0xfb, 0x61, 0xe8, 0xb9, 0xd5, + 0xe7, 0xf7, 0xbe, 0x18, 0x96, 0x1f, 0xc3, 0x16, 0xff, 0x70, 0x99, 0xfc, 0x2f, 0x97, 0xfc, 0x1b, 0x47, 0xe9, 0xe3, 0x9c, 0xf3, 0x78, 0x0c, 0x3f, 0xb3, 0x68, 0xe9, 0x1d, 0xed, 0xcb, 0x18, 0xbe, + 0xbd, 0x32, 0x80, 0xfb, 0x2d, 0x64, 0x12, 0x19, 0x3e, 0x8e, 0x7d, 0x63, 0x51, 0x99, 0x4a, 0x36, 0x4c, 0x42, 0x7d, 0x64, 0xaf, 0x98, 0x40, 0x56, 0x4c, 0x76, 0x1d, 0x2d, 0xa6, 0xa8, 0xa0, 0x97, + 0xf0, 0x36, 0x74, 0xc6, 0x24, 0x7d, 0x08, 0x27, 0x11, 0xbc, 0xd3, 0x8f, 0x4b, 0x57, 0x94, 0xed, 0x6a, 0x45, 0xbb, 0x1d, 0xcd, 0xb3, 0xb8, 0xb1, 0xdc, 0xb0, 0x90, 0x8f, 0xcc, 0x7d, 0x21, 0x25, + 0x96, 0x87, 0x11, 0x36, 0x97, 0xa9, 0x70, 0x93, 0x37, 0x3d, 0x8b, 0x0f, 0x3e, 0xce, 0x77, 0x70, 0xaf, 0x70, 0xdf, 0xfb, 0x21, 0x79, 0x19, 0xb2, 0x37, 0xa3, 0xfe, 0xc3, 0xd8, 0xf8, 0x3f, 0x54, + 0xc9, 0x3f, 0x68, 0x89, 0xf2, 0x48, 0x44, 0xf0, 0xa7, 0x92, 0x8e, 0x1f, 0xa8, 0x9f, 0x84, 0xe4, 0xfd, 0xb5, 0x01, 0xde, 0x2f, 0x05, 0x19, 0x82, 0x88, 0x66, 0xa5, 0x52, 0x07, 0xd6, 0xc7, 0x0d, + 0xa3, 0x10, 0xc0, 0xda, 0xd9, 0x2e, 0xfc, 0xa5, 0x3a, 0x96, 0x39, 0x0c, 0x21, 0x01, 0x6e, 0xaf, 0x5b, 0x3b, 0xb1, 0x1b, 0xa3, 0x08, 0x3c, 0xae, 0x19, 0x71, 0xa1, 0xec, 0xf9, 0x7a, 0xb1, 0x9c, + 0xd3, 0xd0, 0x9c, 0x43, 0x00, 0x15, 0x39, 0x56, 0x3a, 0xeb, 0x2c, 0xf9, 0xc4, 0xc0, 0x9c, 0x0d, 0xe1, 0x4d, 0x8e, 0xa5, 0x83, 0x49, 0xda, 0x0a, 0x50, 0x7f, 0x92, 0xef, 0xee, 0x93, 0x6f, 0xfb, + 0xb2, 0xb8, 0xe7, 0xb9, 0xa6, 0x59, 0xaf, 0x75, 0x3d, 0xd7, 0x92, 0x9e, 0x9e, 0xdd, 0xb2, 0x12, 0xf1, 0x00, 0x20, 0xde, 0x4e, 0xb4, 0xe8, 0x55, 0x27, 0x92, 0x5b, 0x88, 0xd3, 0xa1, 0xf9, 0xde, + 0x49, 0xb5, 0x35, 0xef, 0xca, 0x95, 0x80, 0x15, 0x50, 0xbc, 0x1e, 0x76, 0x24, 0x4d, 0x9b, 0x07, 0x46, 0xf3, 0xf7, 0xae, 0x49, 0x5a, 0xe3, 0x30, 0x44, 0x20, 0x5a, 0x2f, 0xe6, 0xa3, 0x62, 0xea, + 0x80, 0xec, 0x11, 0xe2, 0x10, 0xde, 0xee, 0x08, 0x09, 0x86, 0x61, 0xc6, 0x9c, 0xee, 0x14, 0xdb, 0x82, 0x7e, 0x02, 0x17, 0xf4, 0x9b, 0xfa, 0x7d, 0xec, 0x01, 0xd9, 0xc7, 0xb6, 0x7e, 0x8f, 0xd5, + 0x37, 0xf2, 0x84, 0x9d, 0xf1, 0x8e, 0xf6, 0xb9, 0x6f, 0xd6, 0xdd, 0x95, 0xf3, 0x3a, 0x99, 0x1e, 0x76, 0x86, 0x27, 0xa6, 0x23, 0xf7, 0x50, 0x57, 0x88, 0x09, 0x58, 0x43, 0x0d, 0x46, 0x15, 0x3d, + 0x88, 0x8e, 0xc5, 0x9e, 0x93, 0x4c, 0x8a, 0x88, 0x51, 0x88, 0xb3, 0x29, 0xb1, 0x9c, 0x2e, 0xe2, 0xa1, 0x00, 0x90, 0xe5, 0x72, 0x54, 0x9b, 0x46, 0x75, 0xd4, 0xb8, 0x83, 0x80, 0xcc, 0xd4, 0x39, + 0xb9, 0x44, 0x78, 0x3a, 0x77, 0x12, 0xe2, 0x38, 0x87, 0x39, 0x64, 0x2c, 0x94, 0x4e, 0xa7, 0xaf, 0x28, 0xc4, 0x59, 0x4d, 0x7b, 0xea, 0xa8, 0xfb, 0xaa, 0xb1, 0x97, 0x02, 0xfa, 0x1b, 0xfd, 0x73, + 0x5b, 0x9e, 0xf2, 0xeb, 0xef, 0xf0, 0x87, 0xe4, 0xc8, 0x4b, 0xae, 0xf3, 0x81, 0xad, 0x70, 0xed, 0x36, 0xf6, 0xeb, 0x6a, 0x20, 0x53, 0x0f, 0xef, 0x0e, 0x0a, 0xf3, 0x30, 0xb0, 0x32, 0xe7, 0xe5, + 0x31, 0xe4, 0xfe, 0xa9, 0xa8, 0x1c, 0xb4, 0x66, 0x12, 0xbf, 0xd0, 0xb8, 0xbf, 0x79, 0x62, 0xf5, 0x20, 0x2b, 0x07, 0x75, 0x15, 0xc6, 0x6f, 0x39, 0x06, 0xf2, 0xf6, 0x91, 0xac, 0x71, 0x8b, 0x38, + 0x33, 0x9d, 0xc1, 0xc9, 0xb6, 0xbe, 0xcb, 0x0c, 0xbc, 0xf3, 0x3d, 0xf2, 0x22, 0x4b, 0x06, 0x76, 0x1c, 0xba, 0x2f, 0xe5, 0x5e, 0xd8, 0x7b, 0xab, 0x7f, 0x7f, 0x79, 0x05, 0xf1, 0x1b, 0x7e, 0x98, + 0x2d, 0xf8, 0xe0, 0x02, 0x3f, 0x68, 0x29, 0x79, 0x72, 0x85, 0xed, 0x38, 0xfc, 0x1d, 0x95, 0x3f, 0xd4, 0xe1, 0x7f, 0x47, 0xa0, 0x3f, 0xfe, 0xd7, 0xff, 0xfa, 0xe3, 0xef, 0x30, 0x75, 0xf9, 0xd3, + 0x47, 0x5d, 0x9c, 0xbb, 0x00, 0xd9, 0x59, 0x5a, 0x9d, 0x75, 0x62, 0x9b, 0xbb, 0x83, 0xaf, 0x7a, 0x4e, 0x3c, 0x17, 0xd1, 0xfc, 0xe4, 0x1d, 0x2f, 0x3d, 0xe4, 0x3e, 0xde, 0xe9, 0x1b, 0xe3, 0xd4, + 0x2c, 0x1b, 0xd3, 0xec, 0xb6, 0x54, 0x34, 0xbb, 0x14, 0x70, 0x93, 0x55, 0x14, 0x72, 0xbd, 0x47, 0xf9, 0x43, 0xc3, 0xee, 0x87, 0x24, 0x03, 0xa8, 0xa9, 0xb5, 0x73, 0xe7, 0xae, 0x97, 0xbb, 0xfa, + 0x4a, 0x03, 0x8a, 0xb6, 0x9b, 0x2e, 0x62, 0x85, 0xe0, 0xa5, 0x6a, 0xba, 0x08, 0x4a, 0x82, 0x8f, 0xa1, 0xd5, 0x4e, 0x99, 0xe5, 0xf6, 0x12, 0x38, 0xac, 0xa0, 0xc5, 0xc1, 0xe3, 0x80, 0x29, 0xa3, + 0xe0, 0xf3, 0xaf, 0x9b, 0x46, 0x5d, 0xbb, 0x26, 0xd9, 0x27, 0xa1, 0xaa, 0x8b, 0x70, 0xf0, 0x5a, 0xeb, 0xf3, 0x05, 0x62, 0x3f, 0x9f, 0xb6, 0x3e, 0x7d, 0xcb, 0x0b, 0x66, 0x8f, 0xee, 0x9d, 0x51, + 0xeb, 0x31, 0x8d, 0xa9, 0x4b, 0x7f, 0xa9, 0xfa, 0xb8, 0xab, 0x1c, 0x9b, 0x8d, 0x31, 0x3b, 0xa8, 0xd4, 0xb4, 0xf1, 0x2c, 0x93, 0x25, 0x69, 0x4d, 0x0a, 0x10, 0x7b, 0x05, 0xa0, 0x11, 0xee, 0x71, + 0xb3, 0x4e, 0xe1, 0x98, 0xa3, 0x3a, 0x5a, 0xa0, 0xce, 0x16, 0x35, 0x49, 0xb5, 0xa3, 0x5a, 0xc4, 0x03, 0x6b, 0x11, 0x72, 0xd1, 0x11, 0xa1, 0x26, 0x99, 0x33, 0x46, 0x33, 0x09, 0xc7, 0x22, 0x59, + 0x1c, 0xb2, 0x5b, 0x79, 0x3e, 0xf7, 0xfb, 0xa0, 0xf6, 0x4d, 0x96, 0x19, 0x7d, 0x2a, 0x2d, 0xf3, 0x8e, 0xf6, 0x1b, 0x42, 0xaf, 0xf9, 0x66, 0xb4, 0x5f, 0x4a, 0xc6, 0x43, 0xf7, 0xe2, 0x30, 0x13, + 0xdb, 0x61, 0x84, 0xd0, 0xc1, 0xc8, 0x05, 0xd9, 0xe1, 0x96, 0x19, 0xc2, 0x87, 0x55, 0xb2, 0x1c, 0x31, 0x8c, 0x02, 0xfa, 0x63, 0x3e, 0x5d, 0xae, 0x69, 0x7d, 0x86, 0x07, 0xe5, 0x81, 0x27, 0x47, + 0xab, 0x65, 0x04, 0x0d, 0x59, 0x1b, 0x67, 0xf5, 0x75, 0x37, 0xb4, 0x67, 0x73, 0x00, 0x38, 0xc6, 0xf9, 0x98, 0x99, 0xfb, 0x63, 0x33, 0xac, 0xb6, 0x25, 0x84, 0xd2, 0xf2, 0x86, 0xc2, 0xbe, 0xee, + 0x6f, 0xf2, 0xb8, 0x07, 0xe1, 0x63, 0xf3, 0x87, 0x7c, 0x76, 0xe4, 0xdd, 0xd3, 0xff, 0xa4, 0x73, 0xe3, 0x99, 0xfe, 0xf7, 0x18, 0x95, 0xa3, 0xad, 0x20, 0xfb, 0x29, 0x6d, 0x94, 0xee, 0xaa, 0x86, + 0x45, 0x3f, 0x22, 0x62, 0xc5, 0x12, 0x21, 0xd6, 0x8b, 0xa6, 0x81, 0xa1, 0x6a, 0x74, 0x92, 0x1b, 0x38, 0x6d, 0x4a, 0xb3, 0x5d, 0xbb, 0x0a, 0x70, 0x9f, 0xd6, 0x46, 0xbe, 0x09, 0xd6, 0xc2, 0x22, + 0x12, 0x05, 0x36, 0x1f, 0x4f, 0x23, 0x66, 0x68, 0x3a, 0xea, 0x3c, 0x77, 0x78, 0x9b, 0x59, 0x49, 0x63, 0xd9, 0x2f, 0x0c, 0xb2, 0x4c, 0xb3, 0x9e, 0x69, 0xab, 0x87, 0xed, 0x52, 0x7f, 0x7d, 0xcc, + 0xc4, 0xdf, 0x94, 0xf3, 0x7e, 0xbc, 0xd3, 0xa3, 0x8d, 0xeb, 0x83, 0x9e, 0x68, 0xe8, 0x87, 0x87, 0xde, 0x7a, 0xbd, 0xbe, 0x9b, 0x6e, 0x0a, 0xcf, 0xb1, 0x5f, 0x27, 0x8f, 0x3e, 0xc9, 0x8e, 0x33, + 0xb9, 0x7d, 0xed, 0x16, 0xed, 0xab, 0xef, 0xfb, 0xd7, 0x85, 0x39, 0xde, 0x13, 0x7f, 0xe1, 0xfe, 0xcd, 0xa5, 0xbe, 0x81, 0x0e, 0x9f, 0x58, 0xd6, 0x4b, 0x35, 0x99, 0x6a, 0x36, 0xe4, 0xcd, 0xc7, + 0x94, 0xaa, 0xb2, 0x50, 0x14, 0x56, 0x98, 0x0f, 0xd1, 0xb3, 0x51, 0xb6, 0x08, 0x98, 0xdd, 0x82, 0xb3, 0xe0, 0x4d, 0x62, 0x95, 0xd2, 0x44, 0x59, 0x37, 0x22, 0x60, 0x30, 0xd4, 0x98, 0x60, 0x14, + 0x03, 0x98, 0x55, 0x53, 0x2a, 0xe5, 0x3a, 0x49, 0xd0, 0xd2, 0x20, 0x74, 0x85, 0xb6, 0xdd, 0xef, 0xc3, 0xbc, 0x5b, 0xaf, 0x27, 0x29, 0x1b, 0xf5, 0xec, 0x9b, 0xf8, 0x95, 0xd6, 0x7d, 0x71, 0x87, + 0x7a, 0x22, 0x5d, 0xb8, 0xce, 0xe7, 0x51, 0x63, 0xf4, 0xa9, 0xf5, 0xd0, 0x37, 0x74, 0x5f, 0xf0, 0xbd, 0x9c, 0x0d, 0xd0, 0x7e, 0x6b, 0xa0, 0x3b, 0x53, 0x36, 0x1d, 0x26, 0x28, 0x80, 0xb5, 0xbb, + 0x6b, 0x3b, 0x33, 0x8e, 0x69, 0x4e, 0xa3, 0x65, 0x6d, 0xc5, 0x6f, 0x28, 0x6e, 0x7d, 0x44, 0xbb, 0x7d, 0x6e, 0x40, 0x9c, 0x32, 0x45, 0xcc, 0x99, 0x87, 0x4d, 0xcc, 0x2a, 0x48, 0x67, 0x90, 0x87, + 0x22, 0xdb, 0x15, 0x3f, 0x5e, 0xc7, 0x3a, 0x35, 0xaf, 0x67, 0x3a, 0xca, 0x66, 0x1b, 0x1e, 0x59, 0x11, 0x20, 0xe1, 0x49, 0xdd, 0xba, 0x5c, 0x99, 0xec, 0xfc, 0x27, 0xb9, 0xa6, 0xde, 0x96, 0x42, + 0x69, 0x7a, 0xee, 0xb7, 0xba, 0xea, 0xb9, 0xee, 0x78, 0x0f, 0xe8, 0xbf, 0xa0, 0x79, 0x7f, 0xb5, 0x77, 0xb7, 0x3c, 0x60, 0xb9, 0xb0, 0x11, 0x27, 0x99, 0xaf, 0x62, 0x21, 0x8f, 0xc7, 0x20, 0x8b, + 0x2d, 0x87, 0xf1, 0x70, 0x65, 0xd3, 0x2c, 0xed, 0x09, 0x95, 0x40, 0x8c, 0x74, 0x0a, 0xab, 0xb7, 0x2b, 0x4d, 0x24, 0x26, 0x8d, 0xdd, 0x0d, 0x57, 0xb6, 0x8f, 0xa2, 0x3a, 0xd2, 0xc1, 0xf3, 0xad, + 0x15, 0xcb, 0xc4, 0xd1, 0xd1, 0x71, 0x4c, 0xd0, 0xf4, 0x2d, 0x3b, 0x69, 0x00, 0x48, 0xcd, 0xf7, 0xd4, 0x3c, 0x23, 0xba, 0xdd, 0x8f, 0x1b, 0x37, 0xdd, 0x68, 0x8b, 0xcf, 0xbc, 0x8a, 0x27, 0x25, + 0xae, 0x2e, 0xc2, 0x17, 0x80, 0x4e, 0x63, 0xa2, 0xe7, 0x7a, 0x7b, 0x7b, 0x5e, 0x97, 0xcb, 0xd1, 0xbc, 0x02, 0x37, 0x60, 0x36, 0x27, 0x3a, 0x10, 0x4e, 0x5b, 0xcf, 0x45, 0xa6, 0xcd, 0x6c, 0xb9, + 0x95, 0xb3, 0x60, 0xbb, 0xf1, 0x9a, 0x1d, 0x1f, 0x34, 0x47, 0x28, 0x65, 0x26, 0x2a, 0x70, 0xf4, 0xf0, 0x75, 0xc6, 0x68, 0x11, 0xcd, 0xda, 0x6a, 0x3e, 0x44, 0x6b, 0x5e, 0x19, 0xd9, 0x41, 0xa7, + 0xdb, 0x65, 0x23, 0xc4, 0x85, 0x99, 0xd3, 0x8e, 0x06, 0xd7, 0x2a, 0xa0, 0xcf, 0xbe, 0x9f, 0xfd, 0x3f, 0x97, 0x16, 0xec, 0x37, 0xf2, 0xac, 0x51, 0xf9, 0x26, 0x22, 0x27, 0xb1, 0xb8, 0x10, 0xfa, + 0x1e, 0x81, 0x4e, 0x55, 0x43, 0x7c, 0x39, 0xa3, 0x2d, 0x58, 0x37, 0x08, 0xaf, 0x2d, 0xd2, 0x69, 0x4a, 0xc3, 0x0c, 0x0d, 0x4f, 0x0c, 0x76, 0x37, 0xe3, 0x08, 0xbd, 0x9e, 0xac, 0xfc, 0x11, 0x2a, + 0xe6, 0x12, 0x1a, 0x63, 0xf1, 0x6a, 0xd3, 0xc2, 0x98, 0x0a, 0xdb, 0x36, 0x4c, 0x58, 0xd8, 0x72, 0x26, 0xb0, 0x60, 0x27, 0x0e, 0x29, 0x95, 0x91, 0x1c, 0x09, 0x90, 0x31, 0x78, 0xb1, 0x63, 0x75, + 0xd4, 0xdd, 0xc3, 0x59, 0x4f, 0x4f, 0xea, 0xb3, 0x66, 0xec, 0xa7, 0x69, 0x06, 0xbf, 0x9f, 0x48, 0x3e, 0x74, 0xc1, 0x3e, 0x3d, 0x83, 0x7c, 0xf2, 0xcc, 0xa3, 0x29, 0xfd, 0x8e, 0x3c, 0xf6, 0xbe, + 0xae, 0xea, 0x41, 0x63, 0xd8, 0x07, 0x69, 0x94, 0x97, 0x4e, 0x43, 0xa7, 0xd9, 0xf4, 0x7d, 0xa2, 0xe8, 0x53, 0xcf, 0xe1, 0xc1, 0x9c, 0xfc, 0xd8, 0xd0, 0x79, 0x69, 0xb6, 0x7c, 0xfb, 0x60, 0x98, + 0x3a, 0x83, 0xa4, 0x1d, 0x1c, 0xae, 0x71, 0x5e, 0xf2, 0xbc, 0xac, 0xea, 0xe6, 0x81, 0x38, 0xf4, 0x83, 0xea, 0xf4, 0x44, 0xe1, 0xee, 0xeb, 0x97, 0x2e, 0xf9, 0xf8, 0xef, 0xe1, 0xfd, 0x8f, 0xcb, + 0xc3, 0xf4, 0xe5, 0x67, 0xc3, 0xef, 0x30, 0xbb, 0xae, 0xc8, 0x19, 0x1c, 0xcc, 0x22, 0x7d, 0xfb, 0xee, 0x8f, 0x0f, 0x1d, 0xdb, 0x81, 0xe9, 0x38, 0xc5, 0x2b, 0x2e, 0xe4, 0x27, 0xb3, 0xfc, 0xfb, + 0x7a, 0x35, 0xd7, 0xae, 0x0b, 0xf7, 0xf2, 0xad, 0x6f, 0x80, 0x20, 0xef, 0xb9, 0x5b, 0xba, 0x49, 0x73, 0x65, 0x0d, 0xf9, 0xfe, 0x5e, 0x15, 0xa6, 0xed, 0x20, 0x2e, 0xea, 0x5f, 0xaf, 0xce, 0x74, + 0xdf, 0xd9, 0xed, 0xc4, 0xf6, 0x3c, 0xae, 0xfd, 0x3b, 0x2f, 0xf3, 0x7e, 0xb0, 0x3d, 0x53, 0xa2, 0x7e, 0x4f, 0xfa, 0x66, 0xc8, 0x5d, 0x2e, 0x0c, 0xb0, 0x7e, 0x25, 0xeb, 0xe4, 0xd0, 0xdc, 0x41, + 0x8b, 0xa3, 0xe3, 0xf0, 0x50, 0x5d, 0xd1, 0x1a, 0x2d, 0xe2, 0xb6, 0xbd, 0x0c, 0x9a, 0x92, 0x68, 0x34, 0x84, 0x9b, 0xb5, 0x2c, 0xcb, 0x71, 0x65, 0x62, 0xec, 0x46, 0xf4, 0xba, 0xd8, 0xa3, 0x81, + 0x66, 0xc3, 0x0c, 0xdb, 0x35, 0x6b, 0x81, 0xe5, 0xed, 0x46, 0x2e, 0xb7, 0xdc, 0x44, 0x88, 0xf1, 0x39, 0xb0, 0x96, 0x81, 0x0d, 0x8f, 0xe9, 0x4b, 0x6e, 0xe6, 0x06, 0xbc, 0x27, 0xf5, 0x70, 0x3c, + 0xde, 0xc5, 0x0f, 0x3e, 0xd1, 0x41, 0x4f, 0xce, 0x58, 0xb7, 0xc4, 0x6f, 0x80, 0x79, 0xb9, 0x34, 0xc0, 0xfa, 0x45, 0xa0, 0x87, 0xdb, 0xed, 0x2c, 0x26, 0x19, 0x04, 0x50, 0x60, 0x2d, 0x1c, 0x0a, + 0x48, 0xc6, 0xcb, 0xac, 0x5a, 0x2d, 0x5a, 0xd8, 0xe0, 0x77, 0x9d, 0x33, 0xe6, 0x23, 0x47, 0x0a, 0xb7, 0x52, 0xda, 0xf9, 0x10, 0xed, 0x81, 0xd4, 0xc1, 0x77, 0xca, 0xdc, 0xdf, 0x1e, 0x97, 0x5a, + 0xaa, 0x8f, 0xdc, 0x56, 0xa0, 0xd8, 0x59, 0x6a, 0x2f, 0x71, 0x09, 0xb4, 0xf4, 0xc5, 0x78, 0x4f, 0xc4, 0x08, 0x0d, 0xe9, 0x7c, 0x36, 0xea, 0x69, 0x57, 0x7f, 0x10, 0x9c, 0x07, 0x8d, 0xb3, 0xee, + 0xe2, 0x2f, 0xc8, 0x5d, 0x2f, 0xa7, 0x2f, 0x64, 0x1e, 0x7b, 0x26, 0xd7, 0x08, 0x3f, 0xf8, 0x9f, 0x1f, 0x46, 0xa1, 0x27, 0x59, 0x92, 0x7c, 0x60, 0xc5, 0xff, 0x75, 0x8d, 0x4d, 0xff, 0xad, 0xef, + 0x60, 0xda, 0x7f, 0x6e, 0x89, 0x3f, 0x3b, 0x88, 0xf6, 0x57, 0x11, 0xd9, 0x0f, 0x2e, 0x44, 0xbe, 0x17, 0x8c, 0xc3, 0xa8, 0xc8, 0x6c, 0x05, 0x59, 0x31, 0x9a, 0x66, 0x02, 0xb1, 0x3a, 0xaa, 0xa8, + 0x4d, 0x36, 0xdf, 0x8c, 0xa9, 0xe1, 0x34, 0xa4, 0x78, 0x87, 0x1e, 0xf1, 0x63, 0x13, 0xdc, 0x4d, 0xd2, 0xd6, 0x6d, 0x23, 0x09, 0x37, 0x0d, 0x1e, 0x07, 0x67, 0xeb, 0x66, 0x8e, 0x97, 0x93, 0xf9, + 0x9a, 0x1e, 0xef, 0x05, 0x30, 0xa0, 0x38, 0x64, 0xa8, 0xb0, 0x32, 0xab, 0x58, 0x38, 0x5a, 0x2a, 0x35, 0x3e, 0x0f, 0xf6, 0x4e, 0xcf, 0x72, 0x82, 0xc2, 0xad, 0xcb, 0x17, 0x45, 0x0d, 0xff, 0xee, + 0x57, 0xed, 0x77, 0xd7, 0x6a, 0xe3, 0x11, 0x7a, 0xe4, 0x73, 0x01, 0x91, 0x57, 0xb2, 0x27, 0x04, 0x5f, 0x4f, 0xce, 0xab, 0x4b, 0x7b, 0x0c, 0xaf, 0x3d, 0x9f, 0x0d, 0xa7, 0x80, 0xc3, 0x29, 0x09, + 0x83, 0xac, 0x6c, 0x0b, 0x1b, 0x59, 0xdb, 0x26, 0x5d, 0x2e, 0x8e, 0xb2, 0x10, 0x31, 0x09, 0xb0, 0xd9, 0xe4, 0x2e, 0xe6, 0x8f, 0xeb, 0x59, 0xd1, 0xed, 0x56, 0x64, 0x32, 0xd9, 0xc6, 0xa0, 0x13, + 0xe9, 0x52, 0x8d, 0xf0, 0x8e, 0x88, 0x08, 0x26, 0x0a, 0x21, 0x6b, 0x2c, 0xdb, 0xef, 0x24, 0x7f, 0x18, 0x16, 0x44, 0x64, 0xae, 0xd4, 0x05, 0xa2, 0x48, 0xdb, 0xfc, 0xf9, 0x24, 0x6d, 0x95, 0x5d, + 0x8a, 0x13, 0x6e, 0x7a, 0x92, 0xe0, 0xff, 0x61, 0x3d, 0x49, 0xee, 0x67, 0xd4, 0xc7, 0x2c, 0x21, 0x9e, 0x71, 0x2d, 0xdf, 0xe8, 0x9e, 0x79, 0xf2, 0x7a, 0x36, 0x38, 0xd3, 0xfb, 0x9e, 0x29, 0x10, + 0x1f, 0xb1, 0x29, 0x6c, 0xc1, 0x29, 0xa3, 0xa1, 0xee, 0xd6, 0x4a, 0x86, 0xa3, 0xd6, 0x9d, 0xb0, 0x61, 0x69, 0x0b, 0x7a, 0xc8, 0xae, 0xbc, 0xc0, 0x0d, 0xe1, 0x03, 0xaf, 0x28, 0xc3, 0xbd, 0xe7, + 0x89, 0xbb, 0xdd, 0x90, 0x3a, 0x4c, 0xa0, 0x55, 0x46, 0x6d, 0x8b, 0xad, 0xee, 0x49, 0x33, 0xce, 0x4f, 0xa5, 0x74, 0x1c, 0x50, 0xc4, 0xf8, 0xe8, 0x3a, 0x4e, 0x4d, 0xa7, 0x23, 0x0f, 0x4b, 0x0f, + 0xca, 0xa4, 0xa7, 0x68, 0x7b, 0xbd, 0x1d, 0xfd, 0x7b, 0xcf, 0xfc, 0x81, 0x69, 0x73, 0x76, 0x4e, 0xce, 0xec, 0x44, 0x5e, 0x6d, 0x85, 0x9f, 0xab, 0x3d, 0xb8, 0xd7, 0xe0, 0xca, 0x8a, 0x81, 0x6b, + 0x7e, 0xda, 0x86, 0x10, 0xfa, 0x8d, 0x3e, 0x13, 0x3f, 0xbb, 0x12, 0x3d, 0x31, 0xf1, 0x7a, 0x38, 0x38, 0x53, 0xfa, 0x9e, 0x83, 0xd1, 0x5e, 0xf7, 0x56, 0x39, 0x99, 0x64, 0xc3, 0x66, 0xde, 0x8a, + 0x1e, 0xd5, 0xee, 0x54, 0xa4, 0x21, 0x69, 0x00, 0x59, 0x63, 0x62, 0xe4, 0x32, 0xee, 0x1c, 0x07, 0xc6, 0xdd, 0x50, 0x2b, 0xcc, 0x90, 0x87, 0x43, 0x3f, 0xa5, 0xe0, 0x43, 0x14, 0xb2, 0xe4, 0xd4, + 0x1a, 0x36, 0x12, 0xaf, 0x36, 0xa2, 0xb7, 0xae, 0x12, 0xc9, 0xc4, 0x58, 0x64, 0x93, 0x89, 0x72, 0x51, 0x68, 0x61, 0xe3, 0x28, 0x46, 0xf2, 0x7c, 0x11, 0xda, 0xa3, 0x54, 0x2a, 0xda, 0x0f, 0xd6, + 0x2f, 0x50, 0x7d, 0x2e, 0x6d, 0x7f, 0xa5, 0x79, 0x01, 0xf5, 0x8c, 0x69, 0x8f, 0xb4, 0x3d, 0x3c, 0x60, 0x00, 0x8c, 0x56, 0x46, 0x61, 0x5d, 0x26, 0x63, 0x31, 0x23, 0x28, 0x02, 0x8f, 0x23, 0x87, + 0x96, 0xad, 0x72, 0x86, 0xef, 0xbe, 0x34, 0x73, 0xb2, 0x22, 0x19, 0x38, 0xe6, 0xdd, 0x82, 0xa1, 0x7b, 0xfb, 0xe6, 0x29, 0x17, 0xeb, 0x85, 0xea, 0xe5, 0x2b, 0x2e, 0xc7, 0x03, 0xac, 0x5f, 0x6c, + 0x7e, 0x22, 0x4f, 0x76, 0xb1, 0x34, 0x0b, 0xf1, 0x0a, 0x12, 0x39, 0xa3, 0x0e, 0xb5, 0x8c, 0x06, 0x45, 0xa2, 0xb1, 0xd3, 0xa3, 0xbd, 0x12, 0x05, 0xbc, 0x71, 0x6a, 0x5f, 0xca, 0x6b, 0xba, 0x0d, + 0x09, 0x69, 0x3b, 0x0b, 0x11, 0x3b, 0x16, 0x84, 0x1c, 0x38, 0xfa, 0x93, 0xa0, 0xe6, 0x4c, 0x96, 0x01, 0xba, 0x99, 0x9f, 0xa2, 0xf0, 0xd2, 0x41, 0x50, 0x5c, 0x45, 0x71, 0x8f, 0x64, 0xdb, 0xdd, + 0xce, 0x3c, 0x3c, 0x2f, 0x1b, 0x37, 0xfd, 0x93, 0x7f, 0xfd, 0xfd, 0xbe, 0x5b, 0xf2, 0x25, 0x7f, 0xf5, 0x6e, 0x09, 0xfc, 0x65, 0xa0, 0x53, 0xb7, 0x0f, 0x25, 0x61, 0x72, 0x69, 0x53, 0x7b, 0x13, + 0x3c, 0x7c, 0x22, 0xcd, 0xde, 0x2b, 0xd6, 0x92, 0x15, 0x49, 0xe8, 0x5c, 0x05, 0xf9, 0x2f, 0x0c, 0xb1, 0xbc, 0x92, 0xbd, 0x72, 0xf4, 0x72, 0xd2, 0x37, 0xa0, 0x02, 0x4d, 0x6c, 0x69, 0x78, 0x60, + 0xa6, 0x93, 0x6e, 0xd5, 0x78, 0xe1, 0xae, 0x24, 0xb3, 0x64, 0x01, 0x48, 0xa1, 0xbe, 0xa0, 0xc3, 0x31, 0x20, 0x77, 0x4b, 0x4c, 0xb0, 0x0f, 0xb0, 0x12, 0x2b, 0xd9, 0x2c, 0x0d, 0x94, 0xe3, 0xd8, + 0xe6, 0x96, 0x51, 0x05, 0x09, 0xe4, 0x91, 0x3a, 0x4c, 0x2c, 0xa8, 0x26, 0x78, 0xb6, 0xa6, 0xd6, 0xd6, 0x90, 0x52, 0x67, 0x68, 0x7a, 0xac, 0xe2, 0x29, 0xce, 0x90, 0x56, 0xa3, 0x3c, 0x3f, 0x8b, + 0xbe, 0x55, 0x3e, 0x3f, 0x28, 0x7e, 0x0b, 0xdc, 0x63, 0x16, 0x3a, 0x8f, 0x35, 0x76, 0x96, 0xda, 0x2f, 0x0a, 0xe2, 0x9d, 0x1c, 0xdc, 0x66, 0xef, 0x9e, 0x34, 0x43, 0x77, 0xd9, 0xc0, 0x0b, 0xcf, + 0x56, 0x68, 0x55, 0xa7, 0xa9, 0xbd, 0xcb, 0x98, 0xac, 0x70, 0xcf, 0x8b, 0xeb, 0xc3, 0xb2, 0x3c, 0xb7, 0x62, 0xec, 0xc5, 0xfe, 0x83, 0x59, 0x38, 0x9f, 0x2e, 0x9a, 0x80, 0x9e, 0x0b, 0x1a, 0xbd, + 0x50, 0xbd, 0x30, 0xff, 0x72, 0x3c, 0x80, 0xfa, 0x85, 0x8d, 0xac, 0x7a, 0x33, 0x83, 0xbc, 0x7c, 0x54, 0x6d, 0x58, 0x49, 0x66, 0x78, 0x5a, 0x72, 0x89, 0x60, 0x8c, 0xe0, 0x54, 0x35, 0xa9, 0xad, + 0x69, 0xb6, 0x59, 0x59, 0x98, 0xb1, 0xa6, 0x89, 0xf5, 0x91, 0xdb, 0xb2, 0xeb, 0x03, 0xe2, 0xf3, 0xf6, 0x81, 0xcd, 0x86, 0x87, 0xd6, 0xb4, 0xe2, 0x8e, 0xeb, 0x78, 0x1a, 0xef, 0x86, 0x47, 0x7a, + 0xb8, 0x82, 0x97, 0xeb, 0x68, 0x07, 0xae, 0x2b, 0x82, 0x93, 0x87, 0xa6, 0x9e, 0xfd, 0x24, 0x44, 0xd9, 0x73, 0xb9, 0xb1, 0x57, 0xfe, 0x2e, 0x5c, 0x33, 0xce, 0xbf, 0x5a, 0x5b, 0xfb, 0x94, 0x2e, + 0x7c, 0xa3, 0x7b, 0x82, 0xef, 0xed, 0xac, 0x4f, 0xae, 0x12, 0x1e, 0x4c, 0x45, 0xa9, 0x5a, 0x48, 0xdc, 0x36, 0x5a, 0xe6, 0x34, 0x02, 0x65, 0x69, 0x40, 0x95, 0x23, 0x71, 0x93, 0x28, 0xc4, 0x8e, + 0xfa, 0x69, 0x3c, 0xb1, 0xfc, 0xb2, 0xc2, 0xe3, 0xd2, 0x08, 0xe6, 0xe7, 0x5f, 0xf7, 0x5a, 0xe3, 0xf1, 0x72, 0x38, 0x38, 0x53, 0xfa, 0x5e, 0x30, 0x8e, 0xe1, 0x9e, 0x13, 0x37, 0xd8, 0x91, 0x76, + 0x59, 0xb9, 0x1e, 0x0d, 0x6b, 0x35, 0x01, 0xbc, 0xe9, 0xc6, 0x9e, 0xf3, 0xfe, 0x72, 0xc4, 0x85, 0xfc, 0x48, 0x00, 0x5c, 0x2d, 0x6c, 0x65, 0x32, 0x2a, 0xfd, 0x2d, 0xb3, 0x87, 0xad, 0xdd, 0xb6, + 0xf5, 0x2b, 0x08, 0xca, 0x68, 0x29, 0x3b, 0x8c, 0xc8, 0x89, 0x53, 0xe5, 0x3c, 0x6b, 0x9a, 0x82, 0xbf, 0xac, 0x28, 0x18, 0x11, 0x86, 0xa6, 0x05, 0x8c, 0xc7, 0xdf, 0xf6, 0xef, 0x0c, 0xcc, 0x72, + 0x9e, 0x96, 0x95, 0x19, 0xc7, 0x92, 0x5d, 0x84, 0x79, 0xf5, 0xfe, 0xfe, 0xbb, 0xb5, 0xb0, 0x6f, 0xd7, 0xcb, 0xbb, 0x46, 0x48, 0xbf, 0x1c, 0xb3, 0x38, 0xbc, 0x6d, 0x09, 0xf3, 0x3f, 0xfb, 0xc9, + 0xe2, 0xdf, 0xa9, 0xdf, 0x30, 0xf1, 0xfb, 0x9a, 0x6a, 0x87, 0x7e, 0x5f, 0x0f, 0xff, 0xed, 0x6f, 0x30, 0xdc, 0xb3, 0xe1, 0xfa, 0xfb, 0x12, 0xeb, 0x4f, 0x9c, 0xcc, 0x67, 0x14, 0xfc, 0x2d, 0xe5, + 0x13, 0x33, 0x6f, 0xcf, 0xfb, 0x6e, 0x27, 0xd6, 0xce, 0xb3, 0x86, 0xee, 0x38, 0x0d, 0x1b, 0x96, 0x53, 0x4a, 0x8f, 0x71, 0xca, 0x93, 0x18, 0x75, 0x81, 0x97, 0x8d, 0xb4, 0xaa, 0xcd, 0xd0, 0x12, + 0x8e, 0x9a, 0xb8, 0x98, 0xae, 0x92, 0x11, 0x6f, 0xc9, 0x35, 0x53, 0x40, 0x9c, 0x07, 0x2f, 0x43, 0x21, 0xcb, 0x67, 0xdc, 0x70, 0x1d, 0x4e, 0xa3, 0x50, 0x1f, 0x31, 0x96, 0x67, 0x9a, 0xc8, 0x34, + 0x20, 0xac, 0xc2, 0x15, 0x09, 0x7a, 0xbd, 0x95, 0xe7, 0xd0, 0xd7, 0x59, 0xf5, 0xf7, 0x65, 0xa9, 0x7f, 0x1d, 0x22, 0x77, 0x94, 0xc1, 0xc1, 0xfd, 0x79, 0x5f, 0x44, 0x76, 0xaa, 0x51, 0xa4, 0x5b, + 0x0e, 0x43, 0x44, 0x26, 0x9c, 0xd0, 0xc8, 0xdc, 0x87, 0xad, 0x19, 0xd5, 0x45, 0xd9, 0x9c, 0xe3, 0xfd, 0xa3, 0x7a, 0xd0, 0x99, 0x89, 0xbb, 0x76, 0x0e, 0x3a, 0x21, 0x37, 0xa0, 0xcd, 0x4b, 0xee, + 0x2c, 0xb7, 0x33, 0x0d, 0xcb, 0x35, 0xd6, 0x5b, 0x2a, 0xc7, 0xf5, 0x72, 0x9b, 0xd1, 0x45, 0x5a, 0x4c, 0x0a, 0xc4, 0x1d, 0x96, 0x45, 0x4a, 0x1f, 0x8f, 0xb3, 0x79, 0x61, 0x4a, 0xc3, 0xbe, 0xd1, + 0x99, 0xef, 0xeb, 0xf1, 0x7f, 0x54, 0x6c, 0xff, 0xc0, 0xc9, 0xec, 0x33, 0xad, 0xfd, 0xa9, 0x1a, 0xbf, 0x6b, 0x9b, 0xad, 0xc7, 0xbe, 0x27, 0x7c, 0x13, 0x59, 0xed, 0xcd, 0xd5, 0x38, 0xb3, 0x4e, + 0xcc, 0x8c, 0x33, 0x6b, 0x70, 0xa6, 0xf0, 0x3d, 0x0f, 0xf9, 0x66, 0x3c, 0x9c, 0xac, 0x3b, 0x61, 0x65, 0xb9, 0xfe, 0x64, 0x9d, 0xea, 0x02, 0xae, 0x28, 0xde, 0x62, 0x1e, 0x16, 0xb2, 0x8f, 0x01, + 0xda, 0x81, 0x53, 0x67, 0xa6, 0xe8, 0x89, 0xb2, 0x0e, 0x2d, 0xdc, 0xf4, 0xb8, 0x6e, 0x9a, 0xf9, 0x52, 0x40, 0x15, 0x14, 0xac, 0x68, 0x51, 0x12, 0xe6, 0x35, 0x18, 0xb3, 0x47, 0x4d, 0x97, 0x8c, + 0x24, 0xd7, 0x62, 0x85, 0x75, 0xf7, 0xf4, 0xdc, 0x59, 0x76, 0xa3, 0xd5, 0xf3, 0xc6, 0xcb, 0xfd, 0x3c, 0xf5, 0xc0, 0x48, 0x09, 0x53, 0xef, 0x1c, 0xea, 0x7e, 0x6c, 0xde, 0x84, 0x69, 0xe0, 0x16, + 0xe1, 0x25, 0x8d, 0x8d, 0xdc, 0x1b, 0xa9, 0x1f, 0x17, 0xe2, 0xdc, 0xdc, 0xbe, 0x31, 0x7d, 0xde, 0xc5, 0xad, 0xcf, 0x73, 0x59, 0x78, 0x5e, 0xf0, 0x92, 0xc5, 0x75, 0xf5, 0xfc, 0x72, 0x81, 0x7f, + 0xf9, 0xeb, 0x04, 0x2c, 0x2c, 0x4d, 0xd3, 0xee, 0x63, 0x30, 0xdd, 0xf7, 0x83, 0x7b, 0x24, 0x67, 0xf8, 0x53, 0xe9, 0xf3, 0x1b, 0xba, 0x2f, 0xe2, 0x76, 0x39, 0x1b, 0xe0, 0xfd, 0x92, 0xe6, 0x34, + 0x3f, 0xf7, 0x25, 0x91, 0x71, 0xf3, 0x70, 0xa1, 0x1f, 0x04, 0x94, 0xde, 0xa4, 0xb3, 0x23, 0x80, 0x6f, 0x53, 0xb9, 0x46, 0xd8, 0x91, 0xee, 0x74, 0xd6, 0x4c, 0xc0, 0x70, 0x77, 0x75, 0x80, 0x9b, + 0x02, 0xed, 0x46, 0x68, 0x63, 0xac, 0xdc, 0xd6, 0x75, 0xe0, 0x92, 0x19, 0x06, 0xa9, 0x65, 0xf3, 0xf6, 0x10, 0x94, 0x0a, 0xae, 0xe5, 0xf0, 0x8d, 0x20, 0x16, 0xbb, 0x59, 0x87, 0x99, 0xd2, 0xd0, + 0xc8, 0x9e, 0xf7, 0x82, 0x6e, 0x5a, 0xde, 0xfd, 0x1d, 0x7b, 0x2a, 0xe2, 0xd4, 0xcb, 0x7d, 0xb9, 0x28, 0xa4, 0xcf, 0x8c, 0xaf, 0x9f, 0x87, 0x28, 0x02, 0xf3, 0x64, 0x99, 0x9c, 0xb4, 0x19, 0xdc, + 0xaf, 0xfb, 0xad, 0x87, 0x38, 0x0d, 0x0f, 0x6d, 0x15, 0x82, 0x77, 0x23, 0x72, 0xb3, 0x53, 0x17, 0xb3, 0xc2, 0x0d, 0x22, 0xab, 0xe3, 0xe8, 0x68, 0x9a, 0xe3, 0xe0, 0x76, 0x29, 0xe4, 0x78, 0x25, + 0xe7, 0xea, 0x7c, 0x8b, 0x2d, 0x58, 0xd6, 0x58, 0xc2, 0xe0, 0xe8, 0x68, 0x4d, 0x37, 0x95, 0x07, 0x96, 0x21, 0x8d, 0x48, 0xaa, 0xec, 0x42, 0x43, 0xdb, 0x1c, 0x27, 0xdb, 0x4a, 0xd7, 0x3b, 0x75, + 0x32, 0xb7, 0x46, 0x12, 0xd6, 0xf5, 0x0d, 0x2d, 0x7d, 0xa2, 0xb0, 0x7f, 0x8c, 0x74, 0xdf, 0xd5, 0xb2, 0x27, 0x5c, 0x2e, 0x2d, 0xe8, 0xbe, 0x42, 0xfd, 0xe7, 0x53, 0xe7, 0x0d, 0xdd, 0x2b, 0xfa, + 0xd7, 0xb3, 0xbe, 0x85, 0x66, 0x2b, 0x69, 0x24, 0x21, 0xab, 0xc8, 0x5a, 0x8f, 0x64, 0x8f, 0x40, 0x28, 0x72, 0x31, 0xb1, 0x26, 0x5d, 0xb3, 0xf0, 0xbd, 0x6a, 0x37, 0xc5, 0xf7, 0xd3, 0x5d, 0xc2, + 0x64, 0xc3, 0x60, 0xbc, 0xc9, 0xe9, 0x6e, 0x19, 0x28, 0x7c, 0xbc, 0x00, 0x82, 0x23, 0xe5, 0x38, 0x98, 0x22, 0x95, 0x10, 0x24, 0xf9, 0xa5, 0xb2, 0x3e, 0xd8, 0x18, 0x01, 0x93, 0x8b, 0xe1, 0x2e, + 0xc4, 0xf5, 0x6a, 0xc2, 0xc4, 0x1c, 0xe2, 0x79, 0x9f, 0xf4, 0x20, 0xfe, 0x99, 0x62, 0xe9, 0x3d, 0x73, 0xdd, 0xcf, 0xa0, 0x9f, 0x61, 0xfb, 0x73, 0xc5, 0x72, 0x43, 0xf7, 0x8a, 0xed, 0xf5, 0xac, + 0x6f, 0x17, 0x58, 0x3b, 0xd0, 0x4c, 0x72, 0x58, 0xac, 0x40, 0x85, 0x41, 0x96, 0xb1, 0x06, 0x93, 0x51, 0x86, 0x36, 0x9b, 0x59, 0x07, 0x99, 0x9d, 0xa9, 0x4e, 0x8e, 0x78, 0x35, 0xdb, 0x1b, 0x3e, + 0x9e, 0xf3, 0xe8, 0x5a, 0x69, 0x27, 0x8b, 0xed, 0x08, 0x26, 0x1d, 0xae, 0xa8, 0xc5, 0xb8, 0x63, 0x18, 0xde, 0x53, 0x9a, 0x49, 0xec, 0x07, 0x4b, 0x3b, 0xc1, 0xe1, 0x21, 0x06, 0x8c, 0x98, 0x4d, + 0x13, 0x22, 0x9b, 0x06, 0x9c, 0xfd, 0xd0, 0x1f, 0xfb, 0x47, 0x2c, 0x17, 0x38, 0x41, 0x55, 0x65, 0x97, 0x78, 0x6c, 0x65, 0x7e, 0x5e, 0x2c, 0xf5, 0x8c, 0x8f, 0xf7, 0x8e, 0xf6, 0x95, 0x31, 0x37, + 0x57, 0xfa, 0xf8, 0x7a, 0x67, 0x7b, 0x71, 0x1a, 0xd9, 0xd2, 0x3a, 0x48, 0xe3, 0xd9, 0x16, 0xde, 0xb5, 0xd9, 0x6c, 0x47, 0xf2, 0xda, 0x52, 0x32, 0x0f, 0x2c, 0xbe, 0xe0, 0x2d, 0x70, 0xd5, 0x29, + 0x36, 0x7e, 0x18, 0x8e, 0x20, 0x24, 0xe0, 0x65, 0x1e, 0x72, 0xbc, 0xe9, 0x26, 0xb2, 0x58, 0x71, 0xd9, 0xf8, 0xb0, 0x43, 0xd8, 0x1e, 0xca, 0x5a, 0xae, 0x92, 0x54, 0xca, 0x70, 0x6b, 0x59, 0x5b, + 0x74, 0xdf, 0x19, 0x88, 0xec, 0x06, 0x43, 0x52, 0xed, 0x69, 0x2f, 0x3e, 0x5e, 0x60, 0xf9, 0x8c, 0xf2, 0xf9, 0x47, 0x70, 0xf7, 0x25, 0x6a, 0xf3, 0x17, 0x32, 0xf5, 0x4c, 0xf2, 0xc4, 0xcb, 0xf3, + 0x41, 0x5f, 0x16, 0x8a, 0xd3, 0xd5, 0x16, 0xaa, 0x4c, 0x55, 0xe4, 0x8d, 0xaa, 0x99, 0x6f, 0xe6, 0xb4, 0x33, 0x62, 0x02, 0xb7, 0x4c, 0x32, 0xdf, 0x28, 0xaa, 0x5a, 0x6b, 0xb6, 0x6a, 0x39, 0x65, + 0x0d, 0x79, 0x87, 0x48, 0x0a, 0x60, 0xa6, 0x65, 0xbe, 0x37, 0x90, 0x86, 0x4b, 0xb3, 0x95, 0x4f, 0xce, 0x27, 0x30, 0xa0, 0xec, 0x60, 0x62, 0x0d, 0x0f, 0x69, 0x21, 0xb4, 0xe1, 0x51, 0x3d, 0xa5, + 0x2c, 0x86, 0xb2, 0x91, 0x04, 0xff, 0x6e, 0x25, 0xfb, 0x5f, 0x90, 0xed, 0x39, 0x21, 0x31, 0x38, 0x57, 0x8c, 0x7c, 0x1e, 0x21, 0x78, 0x0a, 0xc6, 0x37, 0xba, 0x27, 0x2c, 0xdf, 0xce, 0xfa, 0xf6, + 0x53, 0x98, 0x56, 0x87, 0x62, 0x06, 0xba, 0xf5, 0xa8, 0x33, 0x27, 0x91, 0xee, 0x6e, 0xf6, 0xbc, 0x1f, 0xb7, 0xe4, 0x0c, 0xda, 0x37, 0x61, 0xa8, 0x65, 0x0b, 0x35, 0x6d, 0x26, 0x2c, 0x62, 0xc0, + 0x79, 0x3c, 0x72, 0x34, 0xdf, 0x6a, 0xa3, 0x06, 0xc5, 0x72, 0x56, 0x96, 0xac, 0x61, 0x97, 0xb9, 0x2c, 0xd7, 0x8e, 0x5b, 0x14, 0x05, 0xc6, 0x6a, 0x8b, 0xab, 0xd5, 0x50, 0xcd, 0x00, 0x59, 0xd9, + 0x54, 0xbc, 0x2e, 0xf5, 0x1c, 0x13, 0xd7, 0x7e, 0x12, 0xbf, 0x3e, 0xb4, 0x01, 0xb8, 0x33, 0xa3, 0x3f, 0xac, 0xb7, 0x75, 0xab, 0xd7, 0xb5, 0xb6, 0x99, 0xf7, 0xeb, 0xba, 0x4c, 0xed, 0x3e, 0xf7, + 0x53, 0x99, 0x55, 0x5d, 0xba, 0xaf, 0xff, 0x7f, 0xe7, 0x96, 0x55, 0x59, 0xe8, 0xb8, 0x69, 0x15, 0x7a, 0xe1, 0xa5, 0xd0, 0xe3, 0x13, 0xef, 0xeb, 0xfb, 0x91, 0xd8, 0x87, 0xef, 0xa1, 0x9d, 0xa5, + 0xcd, 0x20, 0x0e, 0xab, 0xcf, 0x22, 0xc6, 0x27, 0x6b, 0x02, 0xf9, 0x79, 0x2b, 0x88, 0x37, 0xba, 0xe0, 0xe0, 0xe6, 0x64, 0x70, 0x21, 0xf7, 0x3d, 0xdb, 0x1b, 0x94, 0xd3, 0x52, 0x83, 0xb6, 0x9b, + 0xb4, 0x3d, 0xec, 0x64, 0x65, 0x62, 0x64, 0xc9, 0x9c, 0xb6, 0xab, 0xd8, 0x25, 0x37, 0x9a, 0xe6, 0xba, 0x0e, 0xbf, 0x41, 0xe1, 0xc3, 0x21, 0x26, 0xb7, 0x71, 0x9b, 0x69, 0x3c, 0x26, 0x86, 0x43, + 0xb3, 0x68, 0x24, 0x37, 0x5d, 0x8b, 0x6a, 0xea, 0xc2, 0xb2, 0xbd, 0x39, 0x04, 0xcc, 0x0a, 0x66, 0x0f, 0xab, 0x39, 0x02, 0x5b, 0x93, 0xbd, 0x93, 0x47, 0x14, 0xd8, 0xb7, 0x5b, 0x79, 0x69, 0x7a, + 0x6e, 0x31, 0x78, 0xdd, 0x93, 0xe1, 0x04, 0xe6, 0xb9, 0x5f, 0xdb, 0x1f, 0xff, 0xe3, 0x0f, 0xf4, 0xc7, 0x7c, 0x80, 0xee, 0x1b, 0x35, 0x7f, 0xc1, 0x89, 0xd7, 0xae, 0xfc, 0x8f, 0x95, 0xd8, 0x33, + 0x95, 0x26, 0x57, 0x9a, 0x27, 0x16, 0x5c, 0x8e, 0xfa, 0xae, 0x6c, 0x74, 0xec, 0x76, 0x1f, 0x8c, 0x1b, 0x0d, 0x66, 0x30, 0x22, 0xd6, 0x0c, 0x7b, 0xbb, 0x67, 0xf2, 0x25, 0x30, 0xad, 0xb8, 0x8d, + 0xb8, 0x75, 0xe6, 0xdc, 0x9a, 0x00, 0xc7, 0x1e, 0x1e, 0x95, 0x48, 0x97, 0xd5, 0x4a, 0xb9, 0x9f, 0x91, 0x73, 0xa2, 0x9c, 0x1e, 0xc3, 0x6a, 0xce, 0x00, 0xe4, 0x52, 0x5f, 0x22, 0xc3, 0xa5, 0xa3, + 0xf1, 0x2b, 0xd6, 0xa9, 0x87, 0xdd, 0x0a, 0x2b, 0xa7, 0x69, 0xb6, 0x15, 0xd3, 0xbd, 0xf9, 0x5f, 0xdb, 0x40, 0xfc, 0x85, 0xdb, 0x40, 0x7c, 0x21, 0x48, 0x97, 0x86, 0x20, 0x56, 0x3b, 0x70, 0x5c, + 0xcf, 0xac, 0xe3, 0xbf, 0x76, 0x89, 0xc9, 0x07, 0xea, 0x27, 0xe1, 0x7a, 0x7f, 0xad, 0x8f, 0xa5, 0x0f, 0x0f, 0x24, 0x2e, 0xaf, 0xec, 0xc6, 0x9a, 0x65, 0x04, 0x45, 0xef, 0x4d, 0x78, 0x89, 0x67, + 0x4e, 0x81, 0x61, 0xa1, 0xbb, 0x3c, 0xec, 0x7e, 0x18, 0xdc, 0xbe, 0x09, 0x7a, 0x7c, 0xf6, 0xa5, 0x3f, 0xdf, 0xf3, 0xf5, 0x85, 0xe8, 0xe9, 0x03, 0xaf, 0x87, 0xe7, 0xef, 0xfa, 0x66, 0xef, 0x57, + 0x78, 0x20, 0x59, 0x70, 0xc4, 0x39, 0x9e, 0xb8, 0x12, 0x0f, 0x8b, 0x66, 0x31, 0x59, 0x4e, 0x58, 0x95, 0xf0, 0x55, 0x15, 0xb6, 0xbc, 0xc7, 0xdf, 0xd5, 0x43, 0x25, 0x7d, 0x1e, 0x7f, 0xf9, 0x59, + 0x47, 0x9a, 0x9b, 0x89, 0xeb, 0xb3, 0x39, 0xfe, 0x09, 0x5d, 0x7f, 0x25, 0x7a, 0x06, 0xea, 0x72, 0x78, 0x9e, 0xdd, 0x7b, 0xa8, 0xf9, 0x1d, 0xd8, 0xcc, 0x4c, 0x0d, 0x03, 0xf5, 0xd8, 0x44, 0xd5, + 0xae, 0xe5, 0x98, 0x46, 0x16, 0x79, 0x4d, 0x77, 0xe7, 0x6c, 0xb3, 0xe7, 0x97, 0x55, 0xba, 0x1f, 0x39, 0x75, 0x27, 0xb3, 0x79, 0x97, 0x8b, 0x46, 0x47, 0x97, 0xbb, 0x25, 0x17, 0x18, 0xc8, 0x12, + 0x98, 0xa4, 0xa3, 0x50, 0xe2, 0x86, 0xdd, 0x4c, 0xca, 0xe6, 0x53, 0x97, 0xcb, 0xb5, 0xe5, 0xd1, 0xc4, 0x1c, 0xdd, 0x35, 0xe6, 0xe2, 0xde, 0x3d, 0x7c, 0xbd, 0x76, 0x26, 0xcc, 0x4d, 0xc7, 0xf9, + 0x62, 0x7f, 0x38, 0xf8, 0xae, 0x26, 0xb4, 0x37, 0x06, 0x2f, 0x54, 0x4f, 0x20, 0xbc, 0x1c, 0x0f, 0xce, 0xb4, 0xbe, 0x47, 0x01, 0x5a, 0xce, 0x41, 0x02, 0x22, 0x8f, 0xd9, 0x51, 0x92, 0x33, 0x96, + 0x9c, 0x45, 0x6b, 0x78, 0xea, 0x49, 0xd6, 0x2a, 0x53, 0x20, 0xc0, 0xaa, 0xe4, 0xd0, 0x8e, 0x4a, 0x51, 0x52, 0xc5, 0x38, 0x00, 0x03, 0xa3, 0xdd, 0xad, 0xa9, 0x65, 0x9e, 0x70, 0x1e, 0x59, 0xeb, + 0x07, 0x41, 0x45, 0x37, 0x80, 0xb9, 0x33, 0x88, 0x0d, 0x78, 0x80, 0x29, 0x23, 0xd6, 0x24, 0x76, 0xa4, 0x6b, 0xa1, 0xae, 0x08, 0x3c, 0xfa, 0xc3, 0x5d, 0x4d, 0xe0, 0x5e, 0x73, 0xd4, 0x7d, 0x0b, + 0x87, 0xc7, 0xf0, 0x3d, 0xd3, 0x82, 0xf6, 0x96, 0xf0, 0xb9, 0x65, 0xc1, 0xdb, 0x69, 0x9f, 0x86, 0xb4, 0x27, 0x10, 0xe1, 0x79, 0x84, 0xc5, 0x3c, 0x27, 0xc4, 0xe0, 0x71, 0x84, 0xef, 0x46, 0xe3, + 0x94, 0x9c, 0x03, 0x16, 0x52, 0x55, 0x02, 0xb7, 0x34, 0xa9, 0xb2, 0x0b, 0x26, 0xf3, 0x42, 0x1b, 0xd7, 0x9a, 0x38, 0x06, 0x33, 0x17, 0x65, 0x17, 0x2b, 0x79, 0x15, 0xec, 0x03, 0x7f, 0x56, 0xe6, + 0x07, 0xbf, 0x9d, 0x39, 0x04, 0xc7, 0xb7, 0x87, 0x91, 0xb2, 0xdf, 0x36, 0x7a, 0x68, 0x4f, 0x49, 0x24, 0xde, 0xf9, 0xe3, 0x74, 0xce, 0xf6, 0x5c, 0x67, 0xf2, 0xa8, 0xc7, 0xe7, 0x0b, 0x9a, 0x3f, + 0xe0, 0xc1, 0x3f, 0xc2, 0x75, 0x0a, 0xcb, 0xb7, 0x7d, 0x08, 0xfe, 0xba, 0x38, 0xc5, 0x2b, 0xd5, 0x0b, 0x33, 0x2f, 0xc7, 0x7d, 0x63, 0x14, 0xd0, 0x62, 0x8b, 0x03, 0x12, 0xcf, 0x88, 0xbb, 0xb9, + 0xd3, 0x45, 0xa3, 0xe5, 0xd0, 0xaa, 0xe9, 0x8d, 0xbd, 0xa5, 0x20, 0x6c, 0xec, 0xd4, 0x24, 0x0d, 0x89, 0x6e, 0x45, 0x94, 0x6c, 0x88, 0x4e, 0xc3, 0x64, 0x32, 0x4c, 0x5d, 0x22, 0xc1, 0x46, 0x33, + 0xd1, 0xf0, 0x36, 0x29, 0xb0, 0x36, 0x42, 0xcd, 0x1a, 0xed, 0xb0, 0x29, 0xa6, 0x25, 0xac, 0x37, 0x36, 0xe6, 0x61, 0xbe, 0x8a, 0x86, 0xb9, 0x46, 0x39, 0xd2, 0x7f, 0x6e, 0xfc, 0xe7, 0xc3, 0x3e, + 0x22, 0x8f, 0xb5, 0xed, 0x93, 0x43, 0xe5, 0x86, 0xf4, 0x0b, 0xbe, 0xaf, 0x17, 0xce, 0x45, 0x19, 0x3d, 0x86, 0x8b, 0xc1, 0x4d, 0x36, 0xba, 0x5b, 0x12, 0xf9, 0xb8, 0x75, 0xda, 0x7a, 0x16, 0x3a, + 0xa5, 0x4b, 0xf2, 0x25, 0x7b, 0xac, 0xac, 0x39, 0xa9, 0x6e, 0x5d, 0x65, 0x92, 0x75, 0xfe, 0x06, 0xf4, 0xc9, 0xc2, 0x81, 0x8e, 0x4a, 0x98, 0xe8, 0xeb, 0xb8, 0x31, 0x36, 0x13, 0x70, 0x89, 0x70, + 0xbe, 0x21, 0x47, 0x6a, 0x4b, 0x22, 0xf8, 0xdc, 0x73, 0xe3, 0x95, 0xbb, 0xb5, 0x27, 0xdc, 0x90, 0x4c, 0x92, 0x6a, 0x33, 0xd3, 0x9e, 0x8f, 0x30, 0x3f, 0xda, 0x79, 0xf2, 0xd9, 0x9a, 0xb8, 0x5e, + 0x7e, 0x4f, 0x39, 0xb0, 0xb2, 0x2c, 0x76, 0xcd, 0xf4, 0xad, 0x41, 0xc6, 0x67, 0xea, 0xec, 0x89, 0xd9, 0xe0, 0x3d, 0xf5, 0x2b, 0x9b, 0xee, 0xae, 0xf5, 0xcd, 0x22, 0x5a, 0x9a, 0x23, 0xaa, 0xbb, + 0x09, 0x33, 0x52, 0xe6, 0xb4, 0xcd, 0xec, 0x5c, 0x16, 0xae, 0xd3, 0xc3, 0x62, 0x35, 0xcf, 0x0d, 0xdd, 0x34, 0xf1, 0x6d, 0x53, 0xb7, 0xbe, 0xd4, 0x4a, 0xa0, 0x8d, 0xc4, 0x1e, 0x09, 0x0f, 0x13, + 0x79, 0x69, 0x8c, 0x15, 0x5c, 0x71, 0xc6, 0x9b, 0x38, 0x77, 0x20, 0x58, 0x89, 0xe8, 0xb1, 0x9f, 0xa8, 0xd4, 0xc6, 0xdb, 0x9b, 0x02, 0x90, 0x6c, 0xcc, 0xad, 0xe0, 0x14, 0xe0, 0xfa, 0x69, 0xc5, + 0xf6, 0x4f, 0x13, 0x13, 0xba, 0xaf, 0xea, 0xfb, 0xcc, 0xa7, 0xfa, 0x79, 0x52, 0xe1, 0x86, 0xee, 0x85, 0xab, 0x2f, 0x67, 0x67, 0xdf, 0xaa, 0x47, 0x92, 0x61, 0x01, 0x8f, 0x6d, 0xce, 0xa5, 0x14, + 0x5d, 0x1e, 0x49, 0xc5, 0xd2, 0xed, 0xea, 0xb9, 0x22, 0x2b, 0x87, 0x48, 0x2b, 0x83, 0x0c, 0x19, 0x12, 0x43, 0xb4, 0x4e, 0x35, 0x0e, 0xd1, 0x83, 0x85, 0x22, 0x6f, 0x90, 0xea, 0xb8, 0x04, 0xdd, + 0x19, 0x46, 0x5a, 0xcd, 0xda, 0x04, 0x0f, 0x61, 0x2e, 0x4c, 0x13, 0x63, 0xea, 0x17, 0xe0, 0x9a, 0xf0, 0xe0, 0x19, 0x4d, 0x10, 0x4e, 0x03, 0x25, 0x93, 0x56, 0x9e, 0xb7, 0x3f, 0xe9, 0x6f, 0xf1, + 0x0f, 0x64, 0xc8, 0xc9, 0x4d, 0xb8, 0x9c, 0x7f, 0xaa, 0x13, 0xb1, 0xe7, 0x74, 0xe2, 0x0d, 0xe9, 0x2b, 0x5b, 0xde, 0x2e, 0x0c, 0xce, 0x54, 0xbf, 0xe7, 0x0c, 0x41, 0x23, 0xde, 0xce, 0xdb, 0xc3, + 0x85, 0xe7, 0x8a, 0x46, 0x74, 0x2c, 0x8c, 0xc5, 0xcc, 0x2d, 0xf2, 0x15, 0x23, 0xb3, 0x9b, 0xf5, 0x64, 0x14, 0x4a, 0x7e, 0x5a, 0x43, 0x40, 0x66, 0xb9, 0x8b, 0x7c, 0x22, 0x18, 0x1b, 0x25, 0xcb, + 0x58, 0xbf, 0x0c, 0xbb, 0xa6, 0x6b, 0x20, 0x23, 0x5a, 0x1c, 0xf8, 0x0e, 0x0d, 0xd5, 0x39, 0xeb, 0x2c, 0xaa, 0xad, 0xba, 0x00, 0xab, 0x44, 0x28, 0xd0, 0x31, 0x02, 0x83, 0xdf, 0xd5, 0xa4, 0x7c, + 0x19, 0x92, 0xfd, 0xf5, 0x96, 0x9f, 0xff, 0x87, 0x30, 0xec, 0xbe, 0x83, 0xd0, 0x67, 0xf6, 0xc1, 0x13, 0x2e, 0xc3, 0x1d, 0xe9, 0x0b, 0xc3, 0x6e, 0x2e, 0xf4, 0xed, 0x1b, 0x0a, 0x5a, 0x98, 0xb1, + 0x2d, 0x67, 0xa4, 0x81, 0x6b, 0xdb, 0x6a, 0x7e, 0x2c, 0xc1, 0x60, 0xa8, 0x52, 0x69, 0xe3, 0xad, 0x7c, 0x89, 0x6e, 0x97, 0xba, 0x53, 0xcd, 0x54, 0x71, 0x65, 0xed, 0x5b, 0x22, 0xa2, 0xe1, 0xd0, + 0x4e, 0xfc, 0xc8, 0xa3, 0x54, 0x26, 0x93, 0x97, 0xbe, 0x2b, 0x61, 0x87, 0x16, 0xaf, 0x74, 0x53, 0x70, 0x85, 0xac, 0xee, 0xa6, 0x1c, 0xbd, 0xb6, 0xd2, 0x68, 0x88, 0xd9, 0x88, 0x01, 0xfc, 0x13, + 0x6c, 0xe4, 0x1f, 0x96, 0xa7, 0x99, 0xf2, 0x8b, 0xf2, 0x88, 0xe7, 0xea, 0x3c, 0xdf, 0xc8, 0x5e, 0x38, 0x72, 0x3d, 0xe9, 0x5b, 0xe7, 0x29, 0x59, 0x4b, 0x8b, 0x5e, 0xef, 0xd6, 0x04, 0x84, 0x6e, + 0x43, 0x2c, 0x9a, 0x18, 0x0d, 0x36, 0x5c, 0xb9, 0xdb, 0x05, 0x97, 0x62, 0xed, 0xec, 0x50, 0x5a, 0x9d, 0x71, 0xc8, 0x8a, 0x49, 0xd6, 0x4e, 0xc2, 0xba, 0x2a, 0xd7, 0x68, 0xba, 0xd0, 0x1d, 0x8b, + 0x47, 0x89, 0xce, 0x0b, 0x66, 0x0b, 0x42, 0x9c, 0x8c, 0x73, 0xde, 0x98, 0x4f, 0x77, 0xe3, 0x2a, 0xdd, 0xe3, 0x8b, 0xcd, 0x31, 0x69, 0x62, 0x34, 0x2a, 0xdf, 0x2f, 0xf2, 0xff, 0x69, 0xec, 0xbb, + 0x7f, 0xf8, 0xad, 0x1c, 0xf8, 0x6e, 0x7a, 0xed, 0xe1, 0xf7, 0x92, 0x8b, 0xfd, 0x2a, 0x72, 0xf2, 0x94, 0x96, 0xfa, 0xf8, 0x8a, 0x0b, 0xd2, 0x1f, 0xaf, 0x5f, 0x42, 0x28, 0x3d, 0x94, 0x56, 0x54, + 0x4e, 0xa2, 0x76, 0x18, 0xa3, 0x6d, 0xa8, 0x4d, 0x44, 0x40, 0x28, 0x35, 0x27, 0x19, 0x1d, 0x26, 0x82, 0xcd, 0x1f, 0x4d, 0x4d, 0x5d, 0x95, 0xf9, 0xd2, 0xc9, 0xe3, 0xa9, 0xb2, 0x9d, 0x0f, 0x9b, + 0x3d, 0x1c, 0x1a, 0xfe, 0xdc, 0xdd, 0xb9, 0x0c, 0xb4, 0x82, 0x09, 0x72, 0xef, 0xd6, 0x14, 0x61, 0x77, 0xa2, 0x79, 0x74, 0x1d, 0x74, 0x0f, 0x2a, 0x5d, 0x7d, 0x80, 0xca, 0xc3, 0x0a, 0x0a, 0x8b, + 0x15, 0xd5, 0x33, 0x52, 0xfa, 0x31, 0xab, 0xf6, 0xcf, 0xe7, 0xfd, 0x7c, 0x31, 0x8a, 0xb0, 0xa7, 0xaa, 0x0e, 0xae, 0x34, 0xaf, 0x8c, 0x3d, 0x8d, 0x1f, 0xac, 0x5f, 0xf5, 0xc1, 0xd1, 0x8d, 0x25, + 0xb3, 0x65, 0x59, 0x94, 0x30, 0xfc, 0x09, 0x69, 0xa8, 0x41, 0x1c, 0x92, 0xb9, 0x8a, 0x62, 0xc1, 0xda, 0x5a, 0xc7, 0x14, 0x1f, 0x35, 0xf8, 0x72, 0x9b, 0xec, 0x16, 0x63, 0x2c, 0x18, 0x39, 0x63, + 0xb4, 0x0a, 0x28, 0xd9, 0xdb, 0x0d, 0x1b, 0xdd, 0x2c, 0x57, 0x1c, 0x90, 0x68, 0x2a, 0x6f, 0x04, 0xd3, 0x9d, 0x6f, 0x78, 0xc7, 0x60, 0x25, 0xa5, 0xc5, 0x61, 0x53, 0x60, 0x6e, 0x2c, 0x49, 0xdf, + 0xe5, 0x8e, 0xbe, 0x2c, 0xfa, 0x78, 0x53, 0x32, 0x2f, 0x4d, 0x2f, 0x7e, 0xca, 0xd7, 0x9f, 0x8c, 0xbf, 0xcf, 0x77, 0x8e, 0x42, 0x9e, 0x75, 0x42, 0x2f, 0xbb, 0x46, 0x5d, 0x0e, 0xce, 0x31, 0xa9, + 0x1e, 0xee, 0xa7, 0xcd, 0x1b, 0x53, 0x51, 0xcc, 0x3a, 0x39, 0x30, 0x61, 0x0f, 0xe3, 0x8e, 0xab, 0x69, 0x17, 0xfb, 0x4b, 0x5d, 0x90, 0xdb, 0x08, 0x21, 0xf2, 0xd0, 0x76, 0x0c, 0xf9, 0x48, 0x21, + 0x81, 0x65, 0x83, 0x9a, 0x87, 0x2d, 0xc1, 0xca, 0xe0, 0x79, 0x4d, 0x62, 0x76, 0x5c, 0xa3, 0x60, 0xf9, 0x32, 0xcc, 0x36, 0xda, 0x6c, 0xbc, 0x5a, 0x6c, 0x52, 0x68, 0xc6, 0x91, 0x4a, 0xee, 0x92, + 0xbb, 0x0d, 0x89, 0xc0, 0xed, 0x77, 0x6c, 0xf8, 0xcf, 0x90, 0xf4, 0xf7, 0xed, 0x6f, 0x3f, 0x43, 0xfa, 0xa9, 0x89, 0xe3, 0x8e, 0xf8, 0x05, 0xf3, 0xbb, 0x4b, 0x67, 0xf4, 0x7b, 0x4c, 0x22, 0x48, + 0x47, 0x2c, 0x3a, 0xb1, 0x31, 0x36, 0xe6, 0x90, 0x46, 0x74, 0xf2, 0xc8, 0x10, 0x8e, 0x28, 0x26, 0xd8, 0x54, 0x92, 0x25, 0x79, 0xad, 0x46, 0xcb, 0xb9, 0xae, 0xcb, 0x15, 0x86, 0x60, 0x84, 0xcb, + 0xc9, 0x8b, 0x64, 0x9e, 0x41, 0x22, 0x60, 0xb4, 0x7c, 0xa9, 0x10, 0x84, 0x46, 0xc5, 0xc7, 0x25, 0x4c, 0x5b, 0xa3, 0x21, 0xe2, 0x4c, 0x5d, 0x3f, 0x16, 0x56, 0x45, 0x70, 0xc8, 0xdd, 0xcd, 0x92, + 0x27, 0xfe, 0x09, 0x0a, 0x14, 0x4e, 0x78, 0xd5, 0x89, 0xf5, 0xe9, 0x36, 0x73, 0xe4, 0x53, 0xe9, 0xd7, 0x57, 0xaa, 0x57, 0x8e, 0x9c, 0x8f, 0xcf, 0xab, 0x1f, 0x7b, 0xcc, 0x2c, 0x18, 0xcc, 0x84, + 0xde, 0xce, 0x27, 0x5c, 0x4a, 0x6e, 0x63, 0x29, 0x77, 0x2a, 0x39, 0x77, 0x57, 0x5b, 0x6e, 0xdf, 0x48, 0xa3, 0xc9, 0xb6, 0x93, 0xab, 0x8a, 0x6d, 0x26, 0x9b, 0x31, 0x89, 0xc1, 0x40, 0x9e, 0x1a, + 0x14, 0xbd, 0x6e, 0x20, 0x08, 0xc2, 0xb8, 0xcd, 0x0a, 0x43, 0xc5, 0xa5, 0x30, 0x8e, 0x97, 0x43, 0x7b, 0xd6, 0xac, 0x73, 0x62, 0x6d, 0xa8, 0x86, 0x32, 0x8a, 0xad, 0x99, 0xa6, 0x1f, 0x8f, 0xe9, + 0x77, 0x03, 0xe1, 0x7b, 0x7d, 0xd2, 0xaf, 0x3d, 0xce, 0xdb, 0xd7, 0x7e, 0x6b, 0xbe, 0xfe, 0x7c, 0x95, 0xd6, 0x7b, 0xe2, 0x77, 0xe8, 0xde, 0x98, 0xb0, 0x3d, 0xda, 0xad, 0x6e, 0x14, 0x28, 0x9e, + 0x83, 0xe9, 0x10, 0xcf, 0xb9, 0x4c, 0x59, 0xd6, 0xc3, 0x06, 0x1e, 0x19, 0x02, 0xce, 0x8d, 0x6c, 0xa3, 0x5e, 0x4b, 0xdb, 0xc5, 0x8e, 0xdb, 0xd1, 0x33, 0xc4, 0x59, 0xec, 0x19, 0xac, 0x43, 0x66, + 0xf1, 0x6e, 0xa6, 0xac, 0x5d, 0x96, 0xa0, 0xa4, 0x9a, 0xad, 0x47, 0xcb, 0xd1, 0x18, 0xd4, 0xa6, 0x2e, 0xb0, 0x62, 0x0d, 0xc0, 0x1b, 0x8e, 0x96, 0xbb, 0xd5, 0x44, 0x26, 0xa0, 0x75, 0xe8, 0x3a, + 0xff, 0x1c, 0xf2, 0xfe, 0xd2, 0x68, 0xfb, 0xb3, 0xb8, 0xcb, 0x53, 0x53, 0xef, 0x99, 0xe8, 0x85, 0x1f, 0x97, 0xb5, 0xb2, 0x3d, 0x37, 0x56, 0xd9, 0x4b, 0x5b, 0x6d, 0xda, 0x21, 0x14, 0xcb, 0x91, + 0x2d, 0x30, 0x57, 0x35, 0xa2, 0x59, 0x31, 0xa5, 0x7b, 0x74, 0xe2, 0xa6, 0x93, 0x61, 0x61, 0xb1, 0x9e, 0x4a, 0xa3, 0xda, 0x14, 0x57, 0x22, 0x9e, 0x41, 0xf3, 0xc9, 0x81, 0x52, 0xc6, 0xba, 0x4a, + 0x80, 0x08, 0xe0, 0x32, 0xdc, 0xb6, 0x9d, 0x97, 0x16, 0x47, 0x31, 0xeb, 0x95, 0x86, 0x98, 0xa0, 0xa8, 0x26, 0x52, 0xde, 0x1e, 0xf5, 0x09, 0xab, 0x93, 0x4c, 0xcf, 0x3a, 0x83, 0x6f, 0x9a, 0x2f, + 0xff, 0x53, 0x97, 0xe6, 0xbc, 0xf6, 0x6d, 0xfe, 0x4b, 0xe7, 0xf5, 0xd2, 0xbd, 0x8e, 0xb9, 0xd2, 0xad, 0xfa, 0xce, 0xeb, 0x00, 0x62, 0xa7, 0xf2, 0xc4, 0x70, 0x75, 0xbc, 0x03, 0x43, 0x6d, 0x66, + 0xad, 0x02, 0xa1, 0xe0, 0x69, 0x73, 0x09, 0x72, 0x66, 0x8d, 0xef, 0x70, 0x57, 0xdb, 0x0f, 0x23, 0x18, 0x63, 0xf2, 0x8d, 0xec, 0x55, 0x7b, 0x28, 0xa7, 0x17, 0x35, 0xc2, 0x1d, 0xb6, 0x1b, 0xc9, + 0x08, 0x5a, 0x43, 0x1d, 0x75, 0x47, 0x34, 0x23, 0x34, 0x72, 0x88, 0xaf, 0x3a, 0x62, 0x94, 0x5b, 0xc4, 0x06, 0x9a, 0x2d, 0x3d, 0x94, 0xfc, 0x4e, 0x9d, 0xfd, 0xa7, 0xe0, 0xfb, 0x75, 0xff, 0xaf, + 0xa7, 0x72, 0x9f, 0x2f, 0x54, 0xaf, 0x28, 0xbf, 0x74, 0xfc, 0xfa, 0x36, 0xfb, 0x79, 0x9e, 0xc2, 0x7d, 0xa7, 0xb3, 0x96, 0x4a, 0xbd, 0xaf, 0x44, 0x34, 0xd6, 0xd7, 0x85, 0x22, 0x8b, 0x7a, 0xc6, + 0xc4, 0x42, 0x90, 0x90, 0x99, 0x58, 0x63, 0x8a, 0x93, 0x4b, 0x06, 0x97, 0xc3, 0xe0, 0x78, 0xe6, 0xef, 0xd8, 0x91, 0x4c, 0x4d, 0x10, 0x03, 0x8e, 0xa1, 0x96, 0x73, 0x2c, 0x62, 0x8c, 0x75, 0x6b, + 0xfa, 0x78, 0x18, 0x87, 0x5c, 0x43, 0x71, 0x4e, 0x1d, 0x2f, 0x37, 0xfc, 0x62, 0xb6, 0x8e, 0x21, 0x11, 0xfa, 0xe7, 0x50, 0x69, 0xaf, 0xdd, 0x94, 0xff, 0xd2, 0x50, 0xc9, 0x85, 0xea, 0x95, 0x15, + 0xe7, 0xe3, 0xbe, 0x01, 0x12, 0x06, 0x64, 0x84, 0xd1, 0x7e, 0xa9, 0xa6, 0x8d, 0x63, 0x1f, 0xf7, 0x73, 0x7a, 0x73, 0x6c, 0xf9, 0x00, 0x6b, 0x60, 0x45, 0x99, 0xf0, 0x0c, 0x9b, 0xfb, 0x63, 0x13, + 0x52, 0x75, 0x3f, 0x5f, 0x8e, 0xa7, 0x5c, 0xd9, 0xd9, 0x85, 0x60, 0x7b, 0x9e, 0x8f, 0xd7, 0xc1, 0x41, 0xf2, 0x05, 0x66, 0x35, 0x46, 0x54, 0xf5, 0x98, 0xec, 0x89, 0xb0, 0x0c, 0xcb, 0x8e, 0x22, + 0xab, 0x4e, 0x86, 0xe0, 0xaa, 0x9e, 0x05, 0x3d, 0x63, 0xc7, 0xff, 0xec, 0x6a, 0xeb, 0x7e, 0x23, 0xb7, 0xcf, 0x26, 0xa9, 0xa7, 0x8c, 0x87, 0x1b, 0xd2, 0x17, 0xae, 0xde, 0x5c, 0x38, 0x4f, 0x58, + 0x3d, 0x0c, 0x07, 0x09, 0x98, 0x6d, 0xc6, 0xfe, 0x22, 0xde, 0xa0, 0x42, 0x3b, 0xb1, 0x4a, 0x0d, 0x9c, 0x66, 0x96, 0x33, 0xb4, 0xf7, 0xb9, 0x31, 0xaa, 0x1b, 0x45, 0x02, 0x28, 0xb3, 0xdc, 0xec, + 0xf5, 0x31, 0xb7, 0x62, 0x2c, 0x64, 0xcf, 0x75, 0x15, 0x9c, 0x75, 0x78, 0x82, 0x67, 0x47, 0x91, 0x39, 0xf2, 0xbe, 0x32, 0x3e, 0x86, 0x6a, 0xc9, 0x6f, 0xd7, 0x21, 0xd6, 0x9a, 0x53, 0x00, 0xac, + 0x1b, 0x27, 0x66, 0x63, 0xbd, 0xee, 0xc9, 0x5a, 0xb3, 0x31, 0xc3, 0x4b, 0xcc, 0xfb, 0xe6, 0x87, 0x97, 0x8f, 0x67, 0xaf, 0xef, 0x37, 0x17, 0xb9, 0xd9, 0x92, 0xe5, 0x5c, 0xf4, 0x4e, 0xfd, 0x86, + 0x06, 0xa9, 0x7b, 0xac, 0xee, 0x1f, 0x7c, 0x5b, 0x6d, 0xff, 0x60, 0xf3, 0xc1, 0x9e, 0x2b, 0x96, 0xfe, 0x8f, 0x95, 0xb5, 0x83, 0x6b, 0xee, 0xbe, 0x76, 0x7f, 0x9f, 0x72, 0xca, 0xae, 0x64, 0x2f, + 0x32, 0x76, 0x3d, 0xe9, 0xeb, 0x88, 0xad, 0xa5, 0xd1, 0x06, 0xdb, 0xb1, 0x78, 0xb6, 0x8d, 0x60, 0xe5, 0xd0, 0x34, 0x43, 0x12, 0x2a, 0x6a, 0x65, 0xc7, 0x6c, 0x49, 0x1e, 0x4e, 0x3a, 0x7f, 0x3b, + 0xe5, 0x31, 0xb0, 0x70, 0x1b, 0xc4, 0x5e, 0x6d, 0x1c, 0x73, 0x28, 0x27, 0x43, 0xb6, 0x58, 0x91, 0x90, 0x21, 0xd4, 0x15, 0x56, 0xf0, 0xac, 0xaf, 0x43, 0xd3, 0x75, 0xa1, 0xd4, 0xc3, 0x11, 0x63, + 0x69, 0x34, 0x52, 0x3a, 0x22, 0x70, 0x84, 0xec, 0xe0, 0xbb, 0x60, 0xf8, 0x7f, 0x16, 0xd6, 0x5f, 0x9b, 0x24, 0x4f, 0x63, 0xfd, 0x6a, 0x96, 0x5c, 0x4f, 0xfa, 0x62, 0x9d, 0x87, 0x58, 0x13, 0x58, + 0xc1, 0x96, 0x9d, 0xad, 0x8e, 0x59, 0xa0, 0x1c, 0x48, 0x21, 0x98, 0x95, 0xb5, 0x2b, 0x63, 0xcd, 0x66, 0x36, 0xcd, 0xb4, 0x40, 0x20, 0x81, 0xcd, 0x6c, 0x0d, 0x45, 0xcb, 0x79, 0x33, 0x04, 0x28, + 0x41, 0xd5, 0x19, 0x51, 0xde, 0x57, 0xf4, 0x38, 0xf5, 0x8b, 0x23, 0x9f, 0x20, 0x3e, 0x46, 0x04, 0x19, 0x0b, 0x01, 0x3e, 0x55, 0x1b, 0xc6, 0xa8, 0xe3, 0x8a, 0x66, 0x3b, 0x1b, 0x7f, 0xdb, 0x10, + 0xe3, 0x3f, 0x1c, 0xeb, 0xb7, 0xf6, 0xda, 0x8f, 0x80, 0xc6, 0x9e, 0xca, 0x7e, 0x5f, 0x69, 0x82, 0x83, 0x97, 0xa3, 0x01, 0xd6, 0x2f, 0xdf, 0x7d, 0xc8, 0x8f, 0x46, 0x39, 0x5c, 0x67, 0x47, 0xc3, + 0x5c, 0x4c, 0xa4, 0xc5, 0x6c, 0x6e, 0xc8, 0xed, 0x78, 0x62, 0xea, 0x79, 0x0c, 0x4d, 0x97, 0x12, 0x0d, 0x4c, 0x47, 0x43, 0x73, 0x11, 0xb6, 0x6e, 0xb2, 0x0c, 0xb8, 0xc3, 0xee, 0x28, 0xfa, 0x04, + 0x1a, 0x60, 0x32, 0xbc, 0x5c, 0xf8, 0xca, 0x8c, 0xcd, 0xe5, 0xbd, 0x30, 0x5e, 0x6f, 0xec, 0x24, 0xd1, 0x57, 0xb5, 0x5f, 0x6c, 0xa2, 0x45, 0x3c, 0xaa, 0xd4, 0x66, 0xd3, 0x33, 0x4c, 0x6a, 0x16, + 0xfe, 0x6d, 0x7b, 0xab, 0x87, 0xaa, 0xe9, 0x43, 0x87, 0xef, 0x9b, 0xe6, 0xe4, 0x56, 0x98, 0xbe, 0x7c, 0xee, 0x6d, 0x77, 0xef, 0xaf, 0x90, 0x3f, 0xaf, 0x23, 0xfa, 0xa6, 0xac, 0xe3, 0x19, 0xf4, + 0x5f, 0xe9, 0x9e, 0x39, 0xf0, 0x7a, 0xd6, 0xb7, 0x3c, 0x5e, 0x0a, 0x85, 0x06, 0xa4, 0xb6, 0xb9, 0x51, 0xab, 0x56, 0xb3, 0x92, 0xb8, 0x4a, 0x1e, 0x2b, 0x54, 0x30, 0xf1, 0x0a, 0x43, 0xf5, 0xc1, + 0x84, 0x05, 0xd3, 0x2d, 0x68, 0x61, 0x19, 0xc4, 0xe8, 0x96, 0x74, 0xac, 0x61, 0x65, 0x2e, 0x0a, 0x2b, 0xe7, 0xb0, 0xe4, 0x99, 0x79, 0xbb, 0x12, 0x35, 0x60, 0x3b, 0x17, 0x78, 0xbc, 0x29, 0x56, + 0x1a, 0x1a, 0x52, 0xfb, 0x6a, 0x3f, 0x6d, 0x03, 0x47, 0x90, 0x94, 0xbe, 0xd5, 0xdc, 0x56, 0xe8, 0x5f, 0x3c, 0xf4, 0x4b, 0xed, 0xd7, 0xaf, 0xbf, 0x0f, 0x7b, 0xae, 0xbb, 0xbe, 0xf4, 0x1f, 0xb4, + 0x03, 0x37, 0x31, 0x07, 0x55, 0x61, 0x9e, 0x50, 0xfc, 0x3c, 0xa5, 0xfc, 0x34, 0xac, 0xef, 0x5e, 0xf0, 0x82, 0xef, 0xbb, 0xcb, 0x7d, 0x81, 0x5e, 0x73, 0x14, 0x28, 0x0c, 0x53, 0x54, 0x8b, 0xb4, + 0x60, 0x6e, 0xa4, 0x70, 0xbc, 0x0a, 0x76, 0x53, 0x93, 0x66, 0x64, 0x5e, 0xd9, 0x88, 0x5a, 0xa4, 0x06, 0x5b, 0x6c, 0x44, 0x83, 0x9b, 0x94, 0x6f, 0xa8, 0x63, 0xe3, 0xef, 0xab, 0x7d, 0x4e, 0x6b, + 0xc3, 0x39, 0x8f, 0x25, 0x1b, 0xf1, 0x28, 0x1d, 0xe1, 0x4d, 0x9c, 0x61, 0xd5, 0xbe, 0x73, 0xf7, 0x16, 0x54, 0xf2, 0x71, 0x51, 0x9b, 0x7c, 0x8b, 0x3a, 0xf5, 0xd7, 0x3d, 0xf3, 0x1e, 0x74, 0x58, + 0x7c, 0x04, 0x11, 0x7e, 0xdf, 0x5e, 0xb9, 0x2f, 0x46, 0xef, 0xa9, 0x83, 0x83, 0x0f, 0x97, 0x06, 0x17, 0xd2, 0xdf, 0x83, 0x63, 0x28, 0xc8, 0x78, 0x38, 0x4b, 0x68, 0x9b, 0x57, 0xec, 0x3a, 0x96, + 0x65, 0x87, 0x1d, 0x82, 0x5d, 0xd1, 0xba, 0x11, 0x91, 0x52, 0x72, 0x27, 0x03, 0xde, 0x7a, 0xe6, 0xac, 0xab, 0x84, 0x90, 0xc6, 0x39, 0xce, 0x71, 0x5c, 0xce, 0x16, 0x8b, 0xc5, 0xae, 0xa1, 0x9d, + 0x09, 0x6a, 0x13, 0x0e, 0xe5, 0x20, 0x76, 0x30, 0x19, 0x86, 0x80, 0x09, 0x82, 0x8e, 0x34, 0x64, 0x54, 0xa3, 0x0a, 0xcb, 0x5d, 0xba, 0xef, 0xa9, 0x0b, 0xec, 0xf3, 0xae, 0xf3, 0x67, 0xf9, 0x83, + 0xde, 0x37, 0x70, 0x7c, 0xdc, 0x62, 0xf2, 0x7d, 0xdf, 0x28, 0xb7, 0x1a, 0x5c, 0x88, 0x5c, 0x7a, 0xe6, 0xbd, 0x74, 0x9a, 0xc4, 0x7a, 0x75, 0x7b, 0x8c, 0xb3, 0x2c, 0xb7, 0xdc, 0xf4, 0xd3, 0xae, + 0x45, 0xf0, 0x53, 0x2d, 0x42, 0x5e, 0xa9, 0x9e, 0xb8, 0xf2, 0x72, 0x7c, 0xae, 0x87, 0xe8, 0xc1, 0x0d, 0xaf, 0x42, 0x84, 0xa4, 0x36, 0xd2, 0xf1, 0x01, 0x18, 0x2f, 0x44, 0x4f, 0xc6, 0x93, 0x7c, + 0xa2, 0xd6, 0xce, 0x64, 0xb4, 0xe9, 0xe2, 0x7c, 0x9e, 0x04, 0x64, 0xa2, 0x90, 0xbc, 0x2d, 0xcc, 0x12, 0xd7, 0x2b, 0x97, 0xb1, 0x4a, 0x31, 0x3b, 0x48, 0x21, 0xd2, 0x82, 0x61, 0x1c, 0xfb, 0xa0, + 0x4f, 0x81, 0x6e, 0xd8, 0xd9, 0x90, 0xb4, 0x1d, 0x75, 0x33, 0x83, 0x86, 0xa7, 0xb0, 0xaf, 0x78, 0xac, 0x51, 0x2f, 0x7a, 0x2e, 0xba, 0x3c, 0x56, 0x2f, 0xdb, 0xa6, 0x61, 0x3d, 0xdb, 0x65, 0xc6, + 0x45, 0x3d, 0xb0, 0x4d, 0x3b, 0xf8, 0x4c, 0x03, 0x10, 0x4f, 0x69, 0x80, 0x57, 0xaa, 0x27, 0x00, 0x5f, 0x8e, 0x07, 0x44, 0xbf, 0xb1, 0xbe, 0xc8, 0x08, 0x67, 0x01, 0x61, 0x4c, 0x22, 0x45, 0x75, + 0x97, 0x1e, 0x16, 0x92, 0x84, 0xe6, 0x8a, 0xab, 0x26, 0x0e, 0xc8, 0x42, 0x9e, 0x27, 0xc7, 0x3b, 0x4d, 0xf3, 0x0f, 0x46, 0x08, 0xb8, 0x7b, 0x58, 0x61, 0x92, 0xbd, 0x78, 0x60, 0x02, 0xc0, 0x5d, + 0x95, 0x3a, 0xaf, 0x33, 0x07, 0x7d, 0x38, 0x84, 0x43, 0x64, 0x6a, 0x06, 0x58, 0x00, 0x8f, 0x26, 0x1c, 0x73, 0xc4, 0xf6, 0x72, 0x30, 0xb3, 0xca, 0xb0, 0xa7, 0x38, 0xb7, 0x66, 0x1c, 0x87, 0xd7, + 0x6e, 0xaa, 0xd8, 0x53, 0x99, 0xbf, 0x5e, 0x85, 0xa7, 0x89, 0x5b, 0x05, 0x99, 0x53, 0x7e, 0xe1, 0x87, 0xfd, 0x3c, 0x8c, 0x74, 0xa5, 0x09, 0x0e, 0x5e, 0x8e, 0xfa, 0x76, 0x34, 0x0f, 0xed, 0x98, + 0x66, 0xdd, 0xf5, 0x7e, 0x9d, 0x10, 0x54, 0x37, 0xad, 0x52, 0x03, 0x72, 0x01, 0x78, 0x85, 0xb4, 0xca, 0xdc, 0x69, 0xba, 0x75, 0x66, 0xd6, 0x4b, 0x05, 0x53, 0x47, 0x34, 0xba, 0x6d, 0x58, 0xb0, + 0x11, 0xa6, 0xa1, 0x3b, 0x25, 0xf7, 0xde, 0x26, 0x3e, 0x28, 0x86, 0x02, 0x8c, 0xe9, 0xa1, 0x30, 0xb4, 0x04, 0x6d, 0x2e, 0x0d, 0xa1, 0x3a, 0x3e, 0x66, 0x4a, 0xc6, 0xb0, 0x08, 0x5a, 0x6e, 0x91, + 0xef, 0xac, 0xb5, 0xef, 0x5d, 0x97, 0x3e, 0x2b, 0xac, 0x93, 0xaf, 0xf6, 0xa9, 0x21, 0x9e, 0x10, 0xdc, 0xe4, 0xb2, 0x39, 0x4d, 0x72, 0xd9, 0x91, 0x86, 0xe8, 0x23, 0xae, 0x8a, 0x24, 0xec, 0x38, + 0x77, 0x22, 0xa3, 0x70, 0xc1, 0x73, 0xa1, 0x59, 0x94, 0xa3, 0xf5, 0x9c, 0x35, 0x96, 0xab, 0x99, 0xdf, 0x2c, 0x6d, 0x70, 0x55, 0x44, 0x99, 0x47, 0xa7, 0xa3, 0x98, 0xaf, 0x2a, 0x0f, 0x37, 0xa3, + 0x4d, 0xb3, 0x0f, 0x37, 0x34, 0x25, 0x96, 0x6e, 0x6a, 0xd9, 0x59, 0x66, 0x57, 0x4b, 0xc2, 0x21, 0xe4, 0x92, 0x30, 0xf7, 0x86, 0x36, 0xa2, 0x01, 0xcd, 0xda, 0x2d, 0xab, 0x20, 0x14, 0xbf, 0x8b, + 0xc3, 0x7d, 0x30, 0xaf, 0xae, 0x48, 0xfc, 0x7a, 0x6a, 0xc7, 0x94, 0x7f, 0xfb, 0x1b, 0xd6, 0xd3, 0x76, 0x38, 0x03, 0xe3, 0x7c, 0x96, 0x60, 0x86, 0x7f, 0xe3, 0xcf, 0xa8, 0xdb, 0x2b, 0xd1, 0x17, + 0xdc, 0x1d, 0x6b, 0x70, 0x21, 0xf4, 0x3d, 0xf6, 0xa5, 0xa0, 0x60, 0xf5, 0x96, 0x74, 0xf4, 0xb8, 0xa9, 0xd4, 0xc5, 0xf1, 0x70, 0x38, 0xb2, 0x63, 0x48, 0xa8, 0xc3, 0x60, 0xbb, 0x0e, 0x27, 0xa4, + 0xdc, 0xd2, 0x96, 0x88, 0x4b, 0xea, 0x71, 0xcc, 0x8c, 0x86, 0x89, 0xa2, 0x37, 0xbc, 0x5f, 0x64, 0x22, 0x7f, 0xd0, 0x45, 0x91, 0x5f, 0x0a, 0x0b, 0x8a, 0x99, 0x5b, 0x13, 0x00, 0x9e, 0xc8, 0xdb, + 0x98, 0xcf, 0x96, 0xb0, 0xc2, 0x20, 0xa9, 0x82, 0xfa, 0x7a, 0xf3, 0x1d, 0xf6, 0x7f, 0x9d, 0xe8, 0xbe, 0xb6, 0x51, 0x7b, 0x2c, 0xc0, 0xf0, 0x6f, 0xf4, 0xe7, 0xe1, 0x98, 0x37, 0xba, 0x2f, 0x78, + 0x9e, 0x4f, 0x06, 0x17, 0x72, 0xdf, 0x43, 0x6a, 0x8c, 0x75, 0xc0, 0x12, 0x12, 0xbc, 0x93, 0xe5, 0x29, 0xa0, 0xe7, 0x4c, 0x41, 0x2b, 0xc3, 0x74, 0x09, 0x29, 0xfe, 0x9c, 0xd1, 0x05, 0x19, 0x12, + 0x2b, 0x19, 0x5e, 0x1b, 0xea, 0xb4, 0xc1, 0x4a, 0x00, 0x90, 0xd7, 0x3b, 0xdb, 0xdf, 0x9a, 0x32, 0xe4, 0x13, 0x00, 0xb6, 0x41, 0xea, 0x39, 0xc6, 0x45, 0x62, 0xd4, 0xb5, 0x25, 0x3b, 0x82, 0xbb, + 0x63, 0xad, 0xae, 0x70, 0x28, 0xe8, 0x4c, 0x57, 0x0b, 0xbf, 0xd3, 0x06, 0x9f, 0x2b, 0xe4, 0x37, 0x81, 0x7b, 0x91, 0xae, 0x9f, 0x8a, 0x76, 0x6f, 0x7e, 0xbc, 0x75, 0x0c, 0x79, 0xc4, 0x0e, 0xf4, + 0x39, 0xa5, 0xfc, 0x42, 0xf5, 0xcc, 0x8c, 0xeb, 0xf1, 0x79, 0x27, 0x96, 0x1e, 0x8a, 0x79, 0x41, 0xe6, 0x04, 0x1a, 0x6c, 0x42, 0x3a, 0x3a, 0xc0, 0xeb, 0xf1, 0xe4, 0x70, 0x80, 0x55, 0x32, 0x44, + 0x49, 0x60, 0xd4, 0xce, 0x0b, 0x5e, 0xe5, 0x71, 0x4d, 0x14, 0xe9, 0xce, 0x40, 0xb7, 0xbc, 0xbd, 0x82, 0x84, 0x75, 0x6b, 0x1d, 0x72, 0x2f, 0xd9, 0x82, 0x6b, 0x08, 0xef, 0xa6, 0x74, 0x77, 0x10, + 0x87, 0x8a, 0xd4, 0x4e, 0x6c, 0x8d, 0xa8, 0x50, 0x85, 0x07, 0x96, 0xb8, 0xb9, 0x1f, 0x89, 0xfc, 0x9c, 0x7d, 0x9e, 0x15, 0x56, 0x61, 0xda, 0xee, 0xc0, 0x3d, 0xe6, 0x66, 0xfa, 0x02, 0xca, 0xb9, + 0xa7, 0x03, 0xf9, 0x43, 0x96, 0xfc, 0x4b, 0x5f, 0x6e, 0x84, 0x9f, 0x1a, 0xdd, 0x27, 0xf8, 0x7e, 0x9e, 0x05, 0x78, 0x21, 0xfa, 0xc2, 0x8b, 0xb0, 0xac, 0xce, 0x46, 0x5d, 0x8f, 0x1c, 0xc0, 0xa2, + 0x8c, 0xd2, 0x1d, 0x66, 0x1d, 0x50, 0x7d, 0xb1, 0xd7, 0x3b, 0xcb, 0x69, 0x47, 0xe1, 0xba, 0x14, 0x54, 0x56, 0xf0, 0x78, 0x00, 0x50, 0x66, 0x33, 0x12, 0x1b, 0x32, 0xc7, 0x92, 0xc8, 0x5d, 0xa6, + 0xc6, 0x35, 0x1f, 0x4b, 0x0b, 0x37, 0x35, 0x09, 0x7e, 0x7b, 0xe4, 0xf5, 0x63, 0x21, 0xca, 0xfb, 0xc3, 0x01, 0x5a, 0x24, 0x87, 0x0a, 0xd8, 0xb8, 0x1e, 0x55, 0xf8, 0x7e, 0x9d, 0xec, 0xe4, 0x55, + 0xf7, 0xbe, 0xf5, 0xd1, 0xf7, 0xeb, 0xc2, 0x92, 0xaf, 0x74, 0xc5, 0x13, 0xc2, 0x79, 0x56, 0x11, 0x17, 0xd5, 0xd0, 0x43, 0x1c, 0xcb, 0xd9, 0x4e, 0x38, 0x02, 0xdb, 0x88, 0xab, 0x12, 0x9a, 0xe0, + 0x34, 0x84, 0xcc, 0x68, 0x6c, 0x3a, 0x9a, 0x4e, 0x56, 0x53, 0xc6, 0x30, 0x30, 0x09, 0xd3, 0xf6, 0xee, 0x8c, 0xd7, 0x98, 0x86, 0xa0, 0x2a, 0x19, 0x88, 0x2c, 0xb4, 0xd9, 0x81, 0x9b, 0xd6, 0x5c, + 0xaa, 0x02, 0x24, 0xc8, 0xcb, 0x56, 0xad, 0x92, 0x95, 0xc4, 0x41, 0x16, 0x60, 0x3a, 0x8a, 0x3c, 0x69, 0xac, 0x12, 0x16, 0x26, 0x26, 0x7b, 0xb6, 0x13, 0x3e, 0xff, 0xe0, 0xf4, 0xdd, 0xa6, 0x65, + 0x8f, 0x65, 0x01, 0x7d, 0xa2, 0x75, 0xd2, 0x1d, 0x65, 0x70, 0x70, 0x7f, 0x3e, 0x38, 0xd3, 0xfc, 0x1e, 0x11, 0xaf, 0x49, 0xb5, 0x61, 0x65, 0x58, 0x1b, 0x52, 0xf5, 0x98, 0x19, 0x3e, 0xa2, 0x5b, + 0xb4, 0xe5, 0xc1, 0x94, 0x59, 0xb5, 0xd1, 0x56, 0x1d, 0x13, 0x9c, 0x1f, 0x4c, 0xf6, 0x50, 0x87, 0x4f, 0xc7, 0xde, 0x1a, 0x30, 0xb4, 0x7c, 0xa5, 0xae, 0xe7, 0xf2, 0xc8, 0xb1, 0x42, 0xef, 0x28, + 0xee, 0x44, 0x04, 0x77, 0xad, 0x02, 0x26, 0x66, 0xd0, 0x9a, 0x74, 0x37, 0xea, 0x22, 0x2c, 0x79, 0x9b, 0x9b, 0xb0, 0x33, 0xf4, 0xeb, 0xe5, 0x5e, 0xa7, 0x93, 0xe4, 0xd3, 0x4a, 0x3e, 0xf4, 0xa9, + 0x68, 0xdf, 0x95, 0xe6, 0x15, 0x85, 0x24, 0x4b, 0x07, 0x68, 0xbf, 0x38, 0x9f, 0x3f, 0xa4, 0x0d, 0x92, 0x4d, 0x76, 0x81, 0xb8, 0xdb, 0x6b, 0xbb, 0x8d, 0x8d, 0x40, 0x07, 0xc0, 0xf0, 0x44, 0x12, + 0xb5, 0xd9, 0x95, 0x35, 0xa1, 0x82, 0x54, 0xb0, 0x2a, 0x73, 0x6a, 0x4d, 0x2b, 0xa6, 0x4e, 0x8c, 0x32, 0x6a, 0xb9, 0x60, 0xb9, 0x1b, 0xae, 0xcc, 0x48, 0x84, 0x48, 0x05, 0x57, 0x8e, 0x08, 0x15, + 0x37, 0xd3, 0xc8, 0xc0, 0x35, 0x92, 0x6d, 0xd4, 0x0d, 0x7c, 0xec, 0x14, 0x2a, 0x62, 0xb7, 0xcf, 0x2b, 0x28, 0x3b, 0xc8, 0x76, 0xa1, 0x63, 0xbe, 0x6d, 0x24, 0x71, 0x17, 0x70, 0x77, 0x5c, 0xab, + 0xf6, 0xaf, 0xb7, 0x90, 0xfb, 0x6d, 0x0c, 0x1e, 0x2d, 0x31, 0xfd, 0xf5, 0x71, 0x7b, 0xd1, 0xf7, 0x4d, 0xa5, 0xde, 0x6d, 0x63, 0x9d, 0x97, 0x55, 0xe1, 0xba, 0xbf, 0x0b, 0x37, 0x69, 0x5f, 0x75, + 0xe3, 0x5d, 0xe7, 0xd4, 0x77, 0x9b, 0x1d, 0xdc, 0xf5, 0x28, 0x2b, 0xc3, 0x24, 0x8f, 0xdd, 0x41, 0x9d, 0x9f, 0xcb, 0x86, 0xd3, 0xec, 0x6d, 0xbd, 0xfc, 0x03, 0x97, 0xf9, 0xb2, 0x8a, 0xb6, 0x1c, + 0xd8, 0x59, 0x7c, 0xdd, 0x12, 0x03, 0xff, 0xb0, 0x79, 0x42, 0x56, 0xdf, 0xfc, 0xce, 0xbb, 0x5b, 0x75, 0xea, 0xb8, 0x5e, 0x69, 0x7a, 0x6f, 0xf1, 0xbb, 0x07, 0x3b, 0x08, 0x7f, 0x30, 0x30, 0xdf, + 0x04, 0xef, 0x1c, 0xbf, 0xbb, 0x9e, 0x3e, 0x63, 0x6b, 0xf6, 0xee, 0x6c, 0xff, 0xb2, 0xce, 0x38, 0xcb, 0xdd, 0xd4, 0xce, 0xe2, 0xd8, 0xb5, 0xcf, 0x7b, 0xe7, 0xde, 0x7e, 0xca, 0x7d, 0x78, 0xf7, + 0xfe, 0xc1, 0x73, 0x98, 0xf7, 0xe5, 0x67, 0xbf, 0xbc, 0xf1, 0xdb, 0x91, 0x75, 0xbf, 0x95, 0xf1, 0x8b, 0xd0, 0x3c, 0x1e, 0x6c, 0xc8, 0x13, 0x8a, 0xe7, 0x4c, 0x11, 0x1c, 0x5c, 0xfe, 0x9e, 0x77, + 0x46, 0xea, 0xa1, 0x68, 0x98, 0x69, 0xd4, 0xe9, 0x3a, 0x1d, 0x62, 0x72, 0xe0, 0x85, 0x62, 0x13, 0x76, 0xc5, 0x54, 0x74, 0x1b, 0x59, 0xd6, 0xd8, 0x2a, 0x65, 0xf6, 0xaa, 0xe7, 0x92, 0x47, 0x98, + 0x0e, 0xfc, 0x49, 0x69, 0xcb, 0x1d, 0x61, 0x58, 0x2b, 0xcb, 0xcb, 0x56, 0x9b, 0x95, 0x50, 0xfb, 0xb2, 0xd8, 0x8e, 0xaa, 0x80, 0xf0, 0x28, 0x63, 0xb2, 0xd9, 0x2a, 0x52, 0xab, 0xb2, 0xd3, 0x31, + 0x48, 0xaa, 0x35, 0x56, 0xc1, 0xda, 0x77, 0xa5, 0xc8, 0x5f, 0x18, 0x65, 0xe5, 0xaf, 0x8f, 0x25, 0x94, 0x3f, 0x44, 0x36, 0x30, 0xcb, 0x81, 0x17, 0x7f, 0xda, 0xba, 0x06, 0x7d, 0x2a, 0xee, 0xf0, + 0x42, 0xf4, 0xda, 0xb3, 0xe6, 0x74, 0x78, 0xd6, 0x65, 0xdf, 0x36, 0x26, 0xad, 0x9c, 0x8d, 0x82, 0x32, 0x33, 0xa3, 0x08, 0x17, 0x6a, 0xe2, 0xad, 0x67, 0x5e, 0x9c, 0xb1, 0x14, 0x19, 0x6f, 0xeb, + 0x06, 0xfa, 0x53, 0xce, 0x40, 0x9f, 0x76, 0xe6, 0x0f, 0xe1, 0xf9, 0x30, 0xc6, 0x1f, 0xc7, 0x1e, 0x9f, 0xd9, 0x81, 0xe1, 0x9e, 0x34, 0x38, 0x78, 0x77, 0x61, 0x80, 0xf7, 0xdb, 0xc6, 0x44, 0x8c, + 0xb6, 0xd1, 0xc1, 0xd1, 0xe6, 0x15, 0x06, 0x51, 0xdc, 0x3c, 0xa4, 0xf7, 0x8c, 0x86, 0x65, 0xca, 0xb2, 0xf4, 0x15, 0x64, 0xb2, 0xa7, 0x67, 0x5d, 0x89, 0x08, 0xf9, 0x2e, 0xc1, 0x4c, 0x51, 0xb7, + 0xa2, 0x04, 0x30, 0x26, 0xea, 0xc4, 0x56, 0x31, 0xc9, 0x9b, 0xae, 0xe5, 0x02, 0xab, 0xb9, 0xb5, 0x91, 0x98, 0x90, 0xdb, 0x62, 0x1e, 0x1e, 0xfb, 0xab, 0x62, 0x37, 0x82, 0x4c, 0x0d, 0x12, 0xb9, + 0x3f, 0xd1, 0xd3, 0xed, 0x46, 0x9e, 0x2e, 0x0d, 0xff, 0x7e, 0xee, 0x29, 0xf4, 0x63, 0x56, 0xfe, 0x65, 0x03, 0x82, 0x9f, 0xb3, 0xe3, 0x44, 0xf1, 0x3c, 0xf5, 0xe6, 0x55, 0xaf, 0x22, 0x79, 0x78, + 0x60, 0x39, 0x50, 0xd0, 0x48, 0xd9, 0x51, 0xd4, 0x6a, 0xc9, 0x4e, 0xd1, 0x6d, 0xe0, 0x85, 0x09, 0x85, 0xea, 0x73, 0x02, 0xc0, 0x9e, 0x45, 0xcf, 0xb4, 0xac, 0xe2, 0xfc, 0xfc, 0xaf, 0x3e, 0xb9, + 0x9c, 0x2b, 0x08, 0xd7, 0x89, 0x20, 0xaf, 0x7e, 0x3e, 0x0b, 0xf4, 0xf1, 0x01, 0xd2, 0xac, 0x48, 0xcc, 0x38, 0xec, 0xdc, 0xaf, 0x16, 0x9d, 0x3e, 0xa7, 0x27, 0xee, 0x49, 0x9f, 0xd1, 0xbf, 0xbd, + 0xd0, 0x47, 0x67, 0x9c, 0x86, 0x00, 0xe1, 0x1a, 0x25, 0xbe, 0x2a, 0x51, 0xb5, 0x62, 0xc2, 0x92, 0x55, 0xf3, 0xa1, 0x84, 0xcc, 0x94, 0x96, 0x72, 0xf6, 0xbb, 0x7c, 0x16, 0x62, 0xa3, 0xad, 0xd4, + 0xa1, 0x33, 0x73, 0x1f, 0x4e, 0x08, 0xb7, 0xab, 0x2d, 0x08, 0x87, 0x91, 0x89, 0xd4, 0x55, 0x9a, 0x72, 0x50, 0x46, 0x04, 0x43, 0xcc, 0x97, 0x96, 0xb8, 0xd3, 0x11, 0x21, 0xb5, 0xc0, 0x64, 0x8c, + 0xa9, 0x7a, 0x16, 0x31, 0x9b, 0x83, 0x7d, 0x58, 0x7d, 0x97, 0x53, 0xfe, 0xbe, 0xa2, 0xb4, 0x5f, 0x28, 0xe7, 0x5a, 0xd7, 0x19, 0xa6, 0x65, 0xfe, 0xe5, 0x7a, 0xd1, 0x67, 0xd6, 0x0c, 0xdc, 0xd3, + 0x06, 0x07, 0xef, 0x2e, 0x0c, 0x2e, 0x64, 0xbf, 0x07, 0xd8, 0xc5, 0x13, 0x66, 0x11, 0x4b, 0x2c, 0x99, 0x67, 0xf4, 0xda, 0x63, 0xa8, 0x8e, 0x92, 0x86, 0xe5, 0x50, 0x42, 0xe6, 0x6b, 0x1c, 0xc4, + 0x0c, 0x0b, 0x35, 0x0d, 0x14, 0xf5, 0xf0, 0x92, 0xd2, 0xf7, 0x99, 0xd9, 0x31, 0xd3, 0x6e, 0xbd, 0x8a, 0xb3, 0x95, 0x42, 0x15, 0xf8, 0x96, 0x99, 0x01, 0x33, 0x52, 0xcd, 0xf6, 0xab, 0x86, 0xa6, + 0x8d, 0x6c, 0xcb, 0xd9, 0x2d, 0x5a, 0xe5, 0x20, 0xaa, 0x41, 0x42, 0x7c, 0xa7, 0x63, 0xfe, 0xc3, 0xb3, 0xc6, 0x2f, 0x5f, 0xfe, 0x55, 0xb0, 0xf7, 0xe7, 0x51, 0x9e, 0x57, 0xaa, 0x37, 0xd8, 0x96, + 0x7d, 0x4b, 0x6d, 0x50, 0xbb, 0x1d, 0x97, 0x2d, 0xeb, 0x57, 0x49, 0x48, 0xce, 0xc9, 0xb1, 0x27, 0x49, 0x73, 0x64, 0x35, 0xce, 0x09, 0x69, 0x89, 0xc4, 0x87, 0xa6, 0xb2, 0x7c, 0x28, 0x87, 0x36, + 0xb0, 0x0b, 0x6d, 0x1a, 0x79, 0x3f, 0xc5, 0x6d, 0x77, 0x76, 0x04, 0x96, 0x88, 0xe3, 0x49, 0x51, 0x02, 0x5b, 0xcb, 0x31, 0xb7, 0x65, 0xa6, 0x93, 0x31, 0x2d, 0x36, 0x2d, 0x90, 0x51, 0x36, 0x61, + 0x92, 0xdb, 0x3a, 0xe2, 0x9d, 0xf7, 0x9b, 0xe9, 0xfc, 0x40, 0xf7, 0x7c, 0x53, 0x51, 0xe3, 0xb8, 0x5e, 0x98, 0xba, 0x83, 0xbc, 0xc8, 0x72, 0xb7, 0xa8, 0x2e, 0xff, 0xfd, 0x7e, 0x53, 0x8b, 0xbe, + 0x83, 0xe3, 0x1f, 0x54, 0x11, 0x73, 0xe5, 0xd0, 0xce, 0x6d, 0xbf, 0x92, 0x82, 0x9f, 0x3b, 0x6e, 0x37, 0x74, 0xdf, 0xe4, 0xe0, 0x74, 0xd6, 0x77, 0x2d, 0xf6, 0xba, 0xa6, 0x27, 0x92, 0xc2, 0x2b, + 0x5c, 0x11, 0xcf, 0x35, 0xde, 0x63, 0x97, 0xdd, 0x98, 0xb0, 0x72, 0xa1, 0x46, 0x2b, 0xbd, 0x42, 0x8f, 0x4d, 0xb4, 0x76, 0x36, 0x73, 0x11, 0x98, 0xba, 0x32, 0x14, 0xaf, 0x2d, 0x6c, 0x49, 0xa9, + 0x1b, 0x12, 0x62, 0xcc, 0xf1, 0x31, 0xa8, 0xd7, 0x7e, 0x2d, 0x21, 0xda, 0x0c, 0x98, 0x45, 0xbb, 0x96, 0x3b, 0xf0, 0x5d, 0xb9, 0xc6, 0x8d, 0x5d, 0x35, 0x4f, 0xbc, 0x60, 0xf5, 0xf4, 0x82, 0xc3, + 0xef, 0x00, 0xfc, 0x6d, 0x96, 0x65, 0xe8, 0x7f, 0xe6, 0xfb, 0x62, 0x4f, 0xc5, 0x40, 0xee, 0x28, 0xbf, 0x82, 0x78, 0x3d, 0x3f, 0x17, 0x63, 0xf4, 0x88, 0x8c, 0x84, 0x47, 0x19, 0x59, 0xe1, 0x32, + 0xab, 0x95, 0x74, 0xde, 0x86, 0x8a, 0xa0, 0x2f, 0x13, 0x15, 0x40, 0x26, 0x6c, 0xae, 0x69, 0x2e, 0x3e, 0x0f, 0x51, 0x0e, 0xf0, 0x30, 0x17, 0x30, 0x17, 0x53, 0x9a, 0x35, 0x33, 0xdc, 0x4c, 0xa6, + 0x1b, 0x95, 0x58, 0x40, 0x3c, 0x4f, 0xd8, 0xe0, 0x4a, 0xa1, 0x46, 0x2e, 0x46, 0xd6, 0x15, 0x73, 0x44, 0x66, 0x2b, 0x6a, 0x18, 0x1c, 0x67, 0x23, 0x42, 0x93, 0x92, 0x65, 0xdd, 0xb3, 0x0c, 0xe0, + 0x51, 0xaf, 0x8e, 0x9e, 0xa3, 0xe7, 0xe6, 0xb1, 0xc7, 0x05, 0x67, 0x37, 0x0f, 0xdc, 0x8b, 0xf0, 0x9f, 0x69, 0xe6, 0xfa, 0x8f, 0x18, 0x7f, 0xe9, 0xc0, 0x3d, 0x86, 0xd5, 0x20, 0x76, 0xcd, 0xdd, + 0xc0, 0x2b, 0xdc, 0xcf, 0x73, 0x46, 0xcf, 0xd4, 0xf0, 0x7c, 0xa0, 0x7e, 0x12, 0xa3, 0xf7, 0xd7, 0xfa, 0xf6, 0xb1, 0xd8, 0xd6, 0x8c, 0x69, 0x18, 0x74, 0xb4, 0x71, 0x0d, 0xb4, 0x51, 0x0e, 0x3e, + 0x3f, 0xa2, 0x56, 0x47, 0x3a, 0x2b, 0xe7, 0x75, 0x31, 0x0e, 0x69, 0x15, 0x2a, 0x61, 0xb4, 0x98, 0xc3, 0xfa, 0x21, 0x31, 0x05, 0x00, 0x88, 0x1a, 0xfb, 0x28, 0x90, 0x24, 0xad, 0x66, 0x62, 0xe3, + 0xa6, 0x86, 0x6b, 0xe5, 0x0c, 0x8d, 0x24, 0x94, 0xca, 0xc0, 0xe0, 0x24, 0x2b, 0x05, 0x5d, 0xe0, 0xa2, 0x74, 0x43, 0xe7, 0xe0, 0xd7, 0x41, 0xb6, 0x6b, 0x33, 0xa6, 0xc7, 0x6a, 0xe9, 0x99, 0xe5, + 0xeb, 0x27, 0x82, 0x67, 0x0c, 0x6c, 0x77, 0x00, 0x7f, 0xbf, 0x54, 0x1d, 0x1e, 0xa8, 0xe3, 0xd2, 0xcc, 0x51, 0x55, 0x65, 0x95, 0x72, 0xc3, 0x97, 0xd3, 0x61, 0x3a, 0x65, 0x08, 0x12, 0x47, 0x35, + 0x73, 0x38, 0x79, 0x76, 0x52, 0xf9, 0x59, 0x1f, 0xa9, 0xac, 0x71, 0x8b, 0x38, 0x33, 0x9d, 0xd3, 0x38, 0xa9, 0xdc, 0xaf, 0xd7, 0xca, 0x3e, 0xd3, 0x64, 0xe1, 0x01, 0xfd, 0x13, 0x40, 0x1f, 0xaf, + 0xf6, 0x6d, 0xba, 0x60, 0x91, 0x9a, 0x61, 0x25, 0x41, 0x1d, 0xa5, 0xfb, 0x75, 0xb6, 0x84, 0x0c, 0x62, 0x2d, 0x74, 0x34, 0x98, 0x06, 0x9e, 0x98, 0x4e, 0x20, 0xca, 0x90, 0x59, 0xa9, 0xeb, 0x22, + 0x99, 0x3b, 0xb8, 0xbe, 0x85, 0xaf, 0x87, 0xd9, 0x88, 0xa6, 0xe9, 0xfc, 0x88, 0x7a, 0xc3, 0x1a, 0xd9, 0x80, 0x1e, 0xba, 0x9d, 0x99, 0x34, 0x23, 0x8b, 0x11, 0x21, 0x2e, 0xd2, 0x99, 0xe2, 0x69, + 0x70, 0x36, 0xad, 0xaa, 0xbd, 0xd7, 0xb3, 0x5a, 0xf6, 0xb6, 0xe6, 0xe2, 0x57, 0xef, 0xfd, 0xbd, 0x1f, 0x34, 0x56, 0xff, 0xd4, 0x89, 0xfa, 0x31, 0xbe, 0xef, 0x89, 0x83, 0x83, 0x0f, 0x97, 0xfa, + 0xf5, 0x70, 0x9b, 0x42, 0xb5, 0x64, 0xb2, 0xeb, 0xed, 0x5a, 0x00, 0x28, 0xb7, 0xc4, 0x8b, 0xa1, 0x9c, 0x9b, 0x69, 0x50, 0xd9, 0x1a, 0xfc, 0x78, 0x83, 0x92, 0xbe, 0x8a, 0xaf, 0xb7, 0x55, 0x7e, + 0xfe, 0xd9, 0x2f, 0xd5, 0x75, 0x9f, 0x01, 0xf4, 0xf3, 0xa8, 0xd3, 0x1b, 0xd9, 0x17, 0x68, 0xce, 0x27, 0x67, 0x50, 0x7a, 0xc4, 0x9f, 0x56, 0xe3, 0x45, 0x27, 0x6c, 0x27, 0x93, 0x89, 0xb0, 0x01, + 0x5a, 0x8c, 0xea, 0x86, 0x28, 0x0d, 0x4d, 0x1c, 0xa8, 0xd5, 0x2c, 0x2a, 0xa7, 0x47, 0xed, 0x4c, 0xcd, 0xc0, 0x1d, 0xae, 0xeb, 0x8e, 0xee, 0xe7, 0x3a, 0x02, 0x22, 0x93, 0x92, 0x2f, 0x77, 0xe5, + 0xa2, 0xd8, 0x93, 0x31, 0xcf, 0x1e, 0x8b, 0xb6, 0xd8, 0xf2, 0x29, 0xec, 0x46, 0x33, 0x22, 0xa3, 0x73, 0xca, 0x0c, 0x1a, 0x7e, 0x2e, 0x8e, 0xa9, 0xf2, 0x13, 0x8b, 0xf1, 0x0b, 0x6c, 0x42, 0x3b, + 0xfb, 0x2a, 0x45, 0x77, 0x1a, 0x39, 0x4f, 0xc8, 0xce, 0x0b, 0xd5, 0x13, 0x32, 0x2f, 0xc7, 0xe7, 0x6d, 0x5f, 0x7a, 0x18, 0x50, 0x0b, 0x05, 0xad, 0x5c, 0x56, 0x5e, 0x47, 0xc9, 0x04, 0xd9, 0x32, + 0xb3, 0x69, 0x57, 0xeb, 0xd4, 0x44, 0xeb, 0x98, 0xf1, 0xf6, 0x30, 0xd9, 0x8f, 0x10, 0x93, 0xf2, 0xca, 0x79, 0x73, 0x30, 0xa5, 0x8a, 0x0d, 0x68, 0x75, 0x31, 0x71, 0xb7, 0x0e, 0x9c, 0xc1, 0xe2, + 0x98, 0x82, 0x18, 0x85, 0x00, 0x0c, 0x67, 0xa2, 0x69, 0xd2, 0xca, 0x92, 0xca, 0x7a, 0x75, 0x58, 0x44, 0x3b, 0x66, 0xa4, 0xee, 0x37, 0xa2, 0xb2, 0xfd, 0x93, 0x1e, 0x20, 0x75, 0x93, 0xef, 0xfc, + 0xd3, 0x73, 0x6c, 0x94, 0xa5, 0xa5, 0x1d, 0xc4, 0x61, 0xba, 0x73, 0xdf, 0xfa, 0x36, 0x7e, 0x25, 0xbf, 0x97, 0x1d, 0x87, 0x1f, 0xb1, 0x87, 0xfa, 0x0d, 0x63, 0x4f, 0xf1, 0x27, 0xcd, 0xce, 0xac, + 0x49, 0xb3, 0xc1, 0x85, 0xc4, 0xf7, 0x6c, 0xa1, 0x56, 0xfa, 0xba, 0x21, 0x47, 0x4b, 0x55, 0x93, 0x3c, 0x09, 0xd8, 0x11, 0xd9, 0xc4, 0x26, 0x32, 0xdb, 0x6e, 0xf1, 0x95, 0x09, 0xec, 0x91, 0x52, + 0x38, 0x28, 0xe8, 0x1e, 0x89, 0x23, 0x59, 0xc3, 0x69, 0x63, 0x47, 0x36, 0x00, 0xbe, 0x5b, 0x8f, 0x91, 0x0c, 0x57, 0xc9, 0x21, 0x36, 0x6d, 0x37, 0xe6, 0x3e, 0x30, 0x89, 0xf1, 0xc2, 0x8c, 0x92, + 0xdd, 0x7a, 0x53, 0xaa, 0x95, 0x90, 0x4f, 0x5b, 0x4e, 0xe9, 0xbb, 0x5d, 0xa8, 0x59, 0x65, 0x49, 0x68, 0x0f, 0xca, 0xd8, 0x75, 0xf3, 0xc7, 0x36, 0xd9, 0xfd, 0x06, 0xfc, 0x97, 0x08, 0xfd, 0xbd, + 0xb1, 0xf5, 0xc0, 0x5e, 0xb9, 0x84, 0x5b, 0xef, 0xeb, 0xeb, 0x4e, 0x90, 0xbc, 0x6e, 0x60, 0x5d, 0x15, 0x66, 0x5a, 0x9e, 0xbb, 0x6b, 0xfe, 0xeb, 0x1f, 0xbf, 0x9a, 0x0f, 0x2f, 0x3d, 0x3f, 0x5c, + 0x56, 0xce, 0xa0, 0x74, 0x8b, 0xf0, 0x1c, 0xea, 0x28, 0x2e, 0x96, 0x1c, 0xf1, 0xe1, 0xc9, 0x3e, 0x65, 0x7b, 0xfb, 0x3a, 0xb4, 0x77, 0x03, 0x2f, 0x2b, 0x12, 0xb3, 0x1a, 0xd4, 0xa9, 0x5b, 0xda, + 0x66, 0xee, 0xbe, 0x95, 0x9e, 0xdd, 0x19, 0x97, 0x85, 0x6b, 0xc6, 0xe7, 0xa2, 0xc6, 0xb0, 0x78, 0xa9, 0x14, 0x7c, 0xdf, 0x40, 0xf8, 0xb2, 0xb3, 0xfd, 0x79, 0x09, 0xc6, 0xfd, 0xce, 0xd8, 0xf7, + 0x63, 0xfa, 0xf4, 0x68, 0x96, 0x86, 0xf6, 0xc0, 0xca, 0xb2, 0xe4, 0xd7, 0xc3, 0xec, 0x46, 0x15, 0x14, 0xae, 0x79, 0xb7, 0x83, 0xdd, 0x27, 0x5d, 0xb7, 0x3e, 0x44, 0xb5, 0x5e, 0x36, 0xcb, 0xb6, + 0xc2, 0xb4, 0x5f, 0x59, 0xf2, 0xe7, 0xf8, 0x7f, 0xa6, 0xb8, 0x7f, 0x6e, 0x4b, 0x7d, 0xf2, 0x8e, 0x97, 0x01, 0xf1, 0xf1, 0x4e, 0xdf, 0x8a, 0x5a, 0x9b, 0x6c, 0x32, 0x9c, 0xcf, 0x55, 0xec, 0x30, + 0x97, 0x30, 0x24, 0x50, 0xb6, 0xb6, 0x8c, 0x6f, 0x26, 0xe5, 0x8a, 0x32, 0xe2, 0xa8, 0x54, 0xbc, 0x51, 0xb4, 0xdf, 0x82, 0x2e, 0x52, 0x4e, 0x8f, 0xc9, 0x74, 0x32, 0x35, 0xc2, 0x3d, 0xac, 0xad, + 0x94, 0x1c, 0x9f, 0xe8, 0xab, 0xaa, 0x1e, 0xb3, 0x84, 0x30, 0x61, 0xf7, 0x43, 0x15, 0x76, 0x7d, 0x75, 0xbf, 0xb1, 0xd2, 0x95, 0x22, 0xe0, 0xd3, 0xda, 0x48, 0xf8, 0x9e, 0x55, 0x76, 0x27, 0x0e, + 0xbd, 0xf0, 0xfa, 0x85, 0x4b, 0x1f, 0xf6, 0x5a, 0x2e, 0xf3, 0x38, 0xac, 0x90, 0x5f, 0x1f, 0x2b, 0xf1, 0xbe, 0x61, 0xc8, 0x47, 0x19, 0x7f, 0xc4, 0x0d, 0xe2, 0x37, 0xf2, 0x84, 0xb7, 0xf8, 0xe8, + 0x05, 0x2f, 0xac, 0x78, 0x77, 0x79, 0x70, 0x7e, 0x43, 0x0f, 0x3e, 0xb0, 0x91, 0x20, 0x94, 0x13, 0xa0, 0x09, 0x22, 0xb0, 0x4a, 0x03, 0xa6, 0x05, 0x0f, 0x21, 0x17, 0xa0, 0x1c, 0xda, 0xa1, 0x01, + 0x18, 0xc1, 0x78, 0xc7, 0x8a, 0x1a, 0x20, 0x0d, 0x67, 0x3b, 0x79, 0xe4, 0xef, 0x17, 0xb5, 0x5c, 0x2f, 0x3a, 0x7d, 0x81, 0xf9, 0x4a, 0x4b, 0x33, 0xab, 0x60, 0x6c, 0x2e, 0xc8, 0xdd, 0x6e, 0x68, + 0x99, 0xc3, 0x70, 0x33, 0x4e, 0x2c, 0x16, 0xa9, 0x16, 0x0a, 0x84, 0xf2, 0xe1, 0xd7, 0xdb, 0x4c, 0x5d, 0x07, 0xf8, 0x27, 0xc8, 0x40, 0xbf, 0x61, 0xf8, 0x99, 0x38, 0xf6, 0x95, 0xea, 0x09, 0x8e, + 0xab, 0x02, 0xb9, 0x52, 0xea, 0x81, 0x81, 0x33, 0x73, 0x3d, 0xd0, 0x29, 0xd4, 0x69, 0xd6, 0x3a, 0x63, 0x78, 0x51, 0x72, 0x5d, 0x3d, 0xf5, 0x28, 0x18, 0x82, 0x52, 0x23, 0x06, 0x66, 0x32, 0xd0, + 0x9a, 0xb6, 0x8d, 0x58, 0x13, 0xdb, 0x75, 0x70, 0x6f, 0xb8, 0x89, 0x76, 0x58, 0x07, 0xa8, 0xd5, 0x54, 0x91, 0x47, 0xf5, 0x50, 0x08, 0xf8, 0x70, 0x18, 0x81, 0x91, 0x97, 0x8c, 0x84, 0x1a, 0x4a, + 0xb8, 0x89, 0x8e, 0x1d, 0xe6, 0x0e, 0x3d, 0xa5, 0x7e, 0x18, 0x86, 0x20, 0xfa, 0x49, 0xd8, 0x07, 0xdd, 0xf8, 0xd8, 0x10, 0x79, 0xa6, 0x0c, 0xee, 0x1d, 0xed, 0x1b, 0x20, 0xaf, 0x57, 0x06, 0x48, + 0xbf, 0x0a, 0x64, 0x10, 0x56, 0x0d, 0x0a, 0xd8, 0x8a, 0xd1, 0x86, 0x30, 0x1b, 0x95, 0xf7, 0x59, 0x77, 0x22, 0x38, 0xa4, 0x34, 0x16, 0x93, 0xa9, 0x08, 0x8f, 0xf0, 0x84, 0x81, 0xdd, 0x8d, 0x56, + 0x32, 0x09, 0x2e, 0x9b, 0x45, 0xbc, 0x4e, 0x8e, 0xe0, 0x81, 0x29, 0x4d, 0x7c, 0x36, 0x31, 0x8f, 0xb3, 0x04, 0xc2, 0x47, 0xfc, 0x66, 0x53, 0xb5, 0x33, 0x70, 0x72, 0x04, 0xd1, 0xe3, 0x1e, 0x95, + 0xeb, 0x4d, 0xb3, 0xc7, 0xc9, 0xfd, 0xd7, 0xc5, 0xf2, 0x79, 0x91, 0x25, 0x03, 0x3b, 0x0e, 0x3f, 0xdf, 0x79, 0xe8, 0x3c, 0x71, 0x3f, 0x31, 0xfb, 0xbf, 0x11, 0xbe, 0x00, 0xf2, 0x72, 0x36, 0xb8, + 0x10, 0xfc, 0x1e, 0x8d, 0x60, 0xaa, 0xa0, 0xc8, 0x9e, 0x54, 0x0c, 0x11, 0x1f, 0x5a, 0xdb, 0x85, 0x38, 0x53, 0xaa, 0x04, 0x9d, 0x23, 0x42, 0xb1, 0x40, 0x7d, 0xb5, 0xc9, 0x98, 0x5d, 0x18, 0x6b, + 0xc3, 0x72, 0x0a, 0x13, 0xf8, 0xae, 0x84, 0xf7, 0x5e, 0x1c, 0xd4, 0xfe, 0x96, 0x71, 0x97, 0x80, 0x04, 0x2f, 0xa2, 0x85, 0xce, 0x36, 0x6d, 0x85, 0x66, 0xf8, 0x2e, 0x22, 0x28, 0x60, 0x8f, 0x5a, + 0x76, 0x90, 0x15, 0x49, 0x94, 0xf6, 0xdd, 0x04, 0xa7, 0x72, 0x42, 0xdf, 0x2d, 0x5f, 0x76, 0x5b, 0x7d, 0x26, 0x62, 0xd2, 0xab, 0x9c, 0x38, 0x2f, 0xb2, 0x63, 0x3b, 0x30, 0x1d, 0xe7, 0xb3, 0x44, + 0x21, 0xf2, 0x9c, 0xd3, 0xf0, 0x4a, 0xf6, 0x02, 0xfd, 0xf5, 0xe4, 0xbc, 0x0a, 0xac, 0x87, 0xd3, 0x10, 0xc7, 0x62, 0xc9, 0xad, 0x24, 0x65, 0xac, 0x08, 0x32, 0x86, 0x45, 0x4e, 0xa1, 0x80, 0x3c, + 0x4a, 0xee, 0xe3, 0x34, 0xf4, 0xc2, 0x6a, 0x2c, 0x00, 0xc6, 0xa1, 0x48, 0x12, 0xc3, 0xce, 0xa4, 0x65, 0xbb, 0x5a, 0x36, 0x95, 0x71, 0xcc, 0xdb, 0x2d, 0x94, 0x22, 0xa0, 0x35, 0x06, 0xd7, 0x58, + 0x35, 0xa2, 0x69, 0x03, 0xf4, 0x17, 0x13, 0xc7, 0x50, 0xc8, 0x25, 0x57, 0x98, 0xd9, 0x12, 0x06, 0x34, 0x9d, 0xee, 0xe9, 0xa3, 0xde, 0x6e, 0x1d, 0xfa, 0xeb, 0x83, 0xb9, 0x71, 0xdb, 0x33, 0xf9, + 0xda, 0x20, 0xf9, 0xa7, 0x7c, 0xe9, 0xdb, 0x62, 0xf8, 0xbe, 0x28, 0xe4, 0xb3, 0xd0, 0x2f, 0xf5, 0x73, 0xde, 0xbc, 0xd1, 0x3d, 0x31, 0xe7, 0xed, 0xec, 0x1c, 0xfa, 0xa5, 0xbe, 0xe7, 0x0e, 0x49, + 0x8e, 0x8d, 0xc3, 0x51, 0x4c, 0x8e, 0xcb, 0xb4, 0x46, 0xcd, 0x0d, 0x8e, 0x21, 0x0a, 0xa0, 0x51, 0xd3, 0x36, 0x5f, 0x77, 0x96, 0xb7, 0x00, 0x18, 0x5c, 0x13, 0xc7, 0x3b, 0xb4, 0x56, 0x23, 0xf5, + 0x98, 0x12, 0x30, 0x0e, 0x9b, 0x73, 0x6e, 0x56, 0x05, 0xaa, 0xbe, 0xd1, 0xe4, 0xbd, 0x0c, 0x4f, 0xf0, 0x6c, 0xd1, 0xf8, 0x40, 0x1c, 0x99, 0x26, 0xc2, 0x2f, 0x42, 0x60, 0xeb, 0x35, 0x0c, 0x2f, + 0x52, 0x3f, 0x77, 0xe9, 0xea, 0xb4, 0xb5, 0x2f, 0xa0, 0x7e, 0xe6, 0xd1, 0x3d, 0xa1, 0x48, 0xaf, 0x44, 0x4f, 0xc0, 0x5c, 0x0f, 0xcf, 0xfe, 0x5c, 0x0f, 0xd5, 0x59, 0x6c, 0xb6, 0x40, 0x27, 0x8e, + 0xa9, 0x6a, 0x3b, 0x6d, 0x4b, 0x84, 0x88, 0xe9, 0xd9, 0x66, 0xa8, 0x2a, 0xb5, 0x84, 0x85, 0x0a, 0x9d, 0xfa, 0x0b, 0xc9, 0xe6, 0x00, 0x63, 0x23, 0x2d, 0xab, 0x26, 0xc6, 0xab, 0xa5, 0x6b, 0x20, + 0x15, 0x6e, 0x35, 0xce, 0x7a, 0xea, 0xac, 0xd9, 0x91, 0x3a, 0x9c, 0xaa, 0x1b, 0xcc, 0xaf, 0x67, 0x6c, 0xec, 0x27, 0xa5, 0x01, 0xcf, 0xc8, 0x91, 0x94, 0x20, 0x07, 0xd9, 0xaa, 0x7f, 0x32, 0x13, + 0xf5, 0x29, 0x55, 0xdd, 0x7f, 0x6e, 0xd4, 0xc0, 0xcf, 0xc4, 0xc0, 0xf7, 0xa7, 0x49, 0x7b, 0x7f, 0xb2, 0x58, 0xe0, 0x5e, 0xe1, 0xee, 0x6a, 0xbc, 0x9e, 0x77, 0x08, 0x62, 0x8e, 0x3a, 0x66, 0x7c, + 0x5c, 0x55, 0x5b, 0x16, 0x00, 0xb6, 0xa9, 0xec, 0x75, 0xc7, 0xd8, 0x73, 0x97, 0x38, 0x63, 0xed, 0xb3, 0x20, 0x97, 0xf6, 0xf9, 0xc2, 0x8f, 0x60, 0xd5, 0x07, 0x6d, 0xd1, 0x92, 0xaa, 0x35, 0xdd, + 0xa1, 0xeb, 0x7a, 0xcf, 0x94, 0x78, 0xb3, 0x05, 0xf2, 0x68, 0x54, 0x2e, 0xb1, 0x23, 0x96, 0xaf, 0x87, 0x6c, 0xbc, 0x0d, 0xc8, 0xc2, 0xd6, 0x37, 0x7d, 0x17, 0x68, 0x94, 0xa1, 0xe3, 0x0e, 0xec, + 0xc0, 0x4c, 0x53, 0xf7, 0xec, 0xbb, 0x5e, 0xf7, 0x04, 0xfc, 0xe9, 0xf0, 0x85, 0xfe, 0x4a, 0x1f, 0xb9, 0x77, 0x1c, 0xfa, 0x53, 0xa7, 0xe9, 0x11, 0x33, 0xb1, 0xa7, 0xda, 0x2b, 0x3c, 0x7e, 0xc5, + 0x89, 0xbf, 0x0f, 0x6f, 0x9c, 0x7b, 0xb9, 0xf5, 0x68, 0xbc, 0x50, 0xe9, 0x0c, 0x2c, 0xc2, 0x81, 0xdf, 0x6e, 0x6a, 0xd6, 0x8f, 0xb3, 0x2d, 0xa8, 0x6b, 0x25, 0x72, 0x80, 0xf1, 0x3a, 0x15, 0xb6, + 0x01, 0xb5, 0xf7, 0x6a, 0x70, 0xcf, 0xc8, 0x5e, 0x20, 0xeb, 0x66, 0x62, 0x1e, 0x48, 0xaf, 0x0d, 0xea, 0x64, 0x69, 0x22, 0xed, 0x2c, 0x77, 0xa4, 0x8c, 0x22, 0x1b, 0x1d, 0x45, 0x8a, 0xb9, 0x1d, + 0x47, 0x00, 0xe6, 0xa9, 0xba, 0xa8, 0x29, 0x5c, 0x39, 0x9c, 0xb0, 0xcd, 0xd7, 0x26, 0x45, 0x61, 0x1e, 0x06, 0x56, 0xe6, 0x7c, 0xa6, 0x36, 0x91, 0xbb, 0xfa, 0xbe, 0xbe, 0xf0, 0xbc, 0x10, 0x05, + 0x07, 0xaf, 0x87, 0x83, 0x33, 0xa5, 0xef, 0x21, 0xa0, 0xba, 0xd9, 0xbe, 0xcd, 0xbd, 0xc9, 0x3a, 0x62, 0xe6, 0xfb, 0x59, 0xe0, 0x6b, 0x72, 0xc6, 0x50, 0xe6, 0x08, 0x29, 0x48, 0xbd, 0x18, 0x69, + 0x00, 0x2d, 0xd2, 0xde, 0x5c, 0x28, 0x41, 0x2e, 0xde, 0x01, 0xa3, 0x4a, 0x90, 0xbb, 0x8a, 0x6f, 0x64, 0x09, 0x82, 0xd7, 0x1b, 0x15, 0x44, 0x27, 0x01, 0x01, 0x2d, 0x00, 0x13, 0xa3, 0xe2, 0x8a, + 0xda, 0x97, 0x4c, 0x17, 0x16, 0x22, 0x11, 0x67, 0xcc, 0xd6, 0xeb, 0x29, 0xf5, 0x56, 0x5b, 0x5d, 0x32, 0x37, 0x1f, 0x8a, 0x0e, 0x83, 0xbb, 0x8d, 0x8e, 0x1e, 0x6c, 0xed, 0x73, 0xbb, 0x21, 0xce, + 0xfb, 0xdd, 0x6f, 0xce, 0xc5, 0x80, 0x79, 0x78, 0xa9, 0xb2, 0x83, 0x9f, 0xaa, 0x99, 0xe9, 0xb9, 0x2f, 0xcf, 0x47, 0x8f, 0xef, 0xb1, 0xc8, 0x63, 0xcf, 0xf0, 0xf4, 0x9e, 0xf6, 0x89, 0xb5, 0xf7, + 0x57, 0x06, 0x67, 0xba, 0xdf, 0x73, 0x78, 0xb5, 0x03, 0xbd, 0x39, 0x23, 0xb5, 0xf3, 0x20, 0x73, 0x8e, 0x2d, 0x3c, 0x1f, 0x2f, 0x11, 0xd6, 0xec, 0x76, 0xee, 0x2c, 0x92, 0x12, 0xb7, 0xa3, 0x55, + 0x0d, 0x71, 0x7d, 0xa7, 0x5a, 0xa4, 0x7a, 0x50, 0x75, 0xcb, 0x49, 0x39, 0x12, 0x16, 0xd9, 0x21, 0x9e, 0x13, 0x53, 0x62, 0x25, 0x58, 0x78, 0xb5, 0x9f, 0x8b, 0xf3, 0x55, 0xc1, 0xfd, 0xff, 0xec, + 0xfd, 0x59, 0x93, 0xb2, 0x4c, 0xd3, 0x28, 0x0a, 0x9f, 0x7f, 0xbf, 0xe2, 0x8e, 0xeb, 0x94, 0xcf, 0x9b, 0x51, 0x86, 0x88, 0xb5, 0x56, 0x6c, 0x10, 0x05, 0x45, 0x04, 0x04, 0x14, 0x38, 0x78, 0x76, + 0x30, 0x0f, 0x32, 0xc9, 0xa4, 0x10, 0xb1, 0x9f, 0xdf, 0xbe, 0xa3, 0xb5, 0xbb, 0xaf, 0xee, 0x56, 0xbb, 0xb9, 0x7c, 0xee, 0x37, 0xde, 0x15, 0x3b, 0xd6, 0x51, 0x17, 0x25, 0x9d, 0x5a, 0x59, 0x95, + 0x59, 0x39, 0xa7, 0x73, 0x46, 0x10, 0x75, 0x5a, 0xa0, 0x5c, 0xbb, 0xb2, 0x3b, 0xb9, 0xad, 0x47, 0xee, 0xb0, 0xed, 0xbc, 0xe8, 0xee, 0x6e, 0x91, 0x37, 0x55, 0x91, 0xa6, 0xfe, 0x5b, 0x0c, 0xeb, + 0x97, 0xdd, 0xfc, 0xdd, 0xc4, 0xe7, 0x62, 0xb6, 0xf9, 0x64, 0x65, 0x79, 0xef, 0x87, 0xfd, 0xf2, 0x7f, 0x5f, 0xbb, 0x9a, 0xbe, 0x6b, 0x7c, 0x17, 0x39, 0xf4, 0x93, 0x7e, 0x77, 0xe9, 0xdf, 0x54, + 0xc5, 0x79, 0xf8, 0x7f, 0x7b, 0xfe, 0xcb, 0x55, 0x59, 0xbd, 0xb2, 0x55, 0xf4, 0x8f, 0x4f, 0xc3, 0xbf, 0x60, 0xe4, 0x6f, 0x04, 0x79, 0x6b, 0x09, 0x8d, 0xfd, 0x0d, 0x13, 0xef, 0x3d, 0xa1, 0xf1, + 0x91, 0x1a, 0xfc, 0xcb, 0xce, 0x79, 0x71, 0xf5, 0xa8, 0x72, 0x04, 0xfa, 0x54, 0x52, 0xd7, 0x1b, 0xd0, 0xd7, 0x93, 0xf1, 0x32, 0x9c, 0xa0, 0xe3, 0x92, 0xbb, 0x22, 0x49, 0x85, 0x48, 0xaa, 0xc8, + 0xc9, 0xad, 0xd7, 0x1e, 0x3d, 0x27, 0xea, 0x94, 0xa9, 0x85, 0x12, 0x34, 0x34, 0x57, 0x93, 0xfa, 0x38, 0xe0, 0xc7, 0x7c, 0xeb, 0x06, 0x41, 0x2d, 0xea, 0x28, 0x46, 0x4d, 0x17, 0xad, 0xe6, 0x1d, + 0xd5, 0x0c, 0x20, 0x9c, 0x68, 0x85, 0x50, 0xab, 0x6e, 0x29, 0xd5, 0x0c, 0x3b, 0x9f, 0xe7, 0x76, 0x3e, 0x65, 0xe5, 0x96, 0x6a, 0x50, 0xad, 0xa0, 0x76, 0xdb, 0x54, 0x1c, 0x7e, 0xb2, 0xef, 0x3e, + 0x3e, 0x25, 0x1f, 0x2d, 0xe0, 0xbf, 0xfe, 0x85, 0x5c, 0x9a, 0x28, 0xfd, 0xd9, 0x1e, 0xfd, 0xaf, 0xff, 0x49, 0x8e, 0x75, 0x45, 0x7c, 0x31, 0xdb, 0xdd, 0xb7, 0x15, 0x3c, 0xa3, 0xe8, 0x7e, 0x04, + 0x7c, 0xdd, 0x93, 0xf7, 0xc7, 0xb1, 0x7d, 0xf8, 0xa7, 0x44, 0x50, 0x55, 0x9c, 0x08, 0x4a, 0x33, 0x6d, 0x7d, 0x5c, 0x4b, 0x74, 0x04, 0x65, 0xd1, 0x8e, 0xa6, 0x76, 0x8c, 0xc8, 0x7b, 0x00, 0xa5, + 0x13, 0x96, 0x83, 0x68, 0xbc, 0xc8, 0x79, 0x8c, 0x5e, 0x58, 0x3b, 0xa9, 0xe1, 0x9c, 0xd5, 0x90, 0x9c, 0x6b, 0x93, 0x63, 0x57, 0x28, 0x4d, 0xd1, 0xa6, 0x39, 0x93, 0xb1, 0x28, 0xc7, 0x7b, 0x58, + 0xdb, 0x39, 0xb6, 0x14, 0x0c, 0xfb, 0x26, 0x9b, 0x72, 0x8b, 0x3f, 0x6a, 0x31, 0x02, 0x23, 0x7f, 0xc3, 0xe8, 0x48, 0x3c, 0x86, 0xfe, 0xb9, 0xfc, 0xfb, 0xbd, 0x89, 0xda, 0xdf, 0x41, 0x6a, 0x87, + 0x8f, 0x44, 0x38, 0xf8, 0x29, 0x1f, 0xc6, 0xfd, 0xaf, 0xb8, 0xe0, 0xf6, 0xde, 0x07, 0x97, 0xfc, 0x86, 0x11, 0xaa, 0xf3, 0x2a, 0x66, 0xbc, 0x2d, 0x73, 0xa4, 0xe0, 0x7d, 0x6a, 0x12, 0xed, 0x76, + 0x05, 0x79, 0x35, 0xb1, 0x05, 0x3c, 0x1d, 0x42, 0x62, 0x7c, 0x2d, 0xc4, 0x64, 0x85, 0x32, 0xad, 0x12, 0x6d, 0x8c, 0x1c, 0x38, 0x64, 0xfe, 0x7a, 0x03, 0xcc, 0x03, 0x3e, 0x0a, 0x92, 0xa3, 0xb8, + 0x8d, 0x6b, 0x78, 0x58, 0x9d, 0xf3, 0xb4, 0x25, 0xc9, 0xe8, 0x08, 0x62, 0xde, 0x19, 0x92, 0x11, 0x49, 0x46, 0x69, 0x79, 0xab, 0x7d, 0xb5, 0x11, 0xfe, 0xc1, 0xe9, 0xff, 0xff, 0x7e, 0xa0, 0xd0, + 0x1b, 0x15, 0x04, 0x55, 0x91, 0x7d, 0x5f, 0x07, 0xed, 0xb9, 0x52, 0x73, 0x77, 0xe0, 0x5f, 0x0e, 0xc9, 0xcd, 0xec, 0xd8, 0x22, 0x74, 0x46, 0x00, 0xe5, 0x7b, 0x1f, 0xdf, 0xd6, 0xfe, 0x10, 0x2f, + 0xc4, 0x16, 0xa0, 0x4b, 0xca, 0x89, 0x63, 0xdd, 0xc9, 0xca, 0xf4, 0x88, 0xab, 0x14, 0x58, 0x02, 0xc4, 0x89, 0x30, 0x0d, 0x19, 0x5c, 0x31, 0x7c, 0x54, 0xe9, 0x2c, 0xab, 0x47, 0x27, 0x1b, 0xe8, + 0xe8, 0x4d, 0xdf, 0x3a, 0xed, 0x31, 0xb0, 0xf6, 0x5a, 0xe7, 0xeb, 0x20, 0xc8, 0x9a, 0x3b, 0xae, 0x66, 0x39, 0x62, 0x2b, 0xac, 0xc1, 0x6e, 0xfe, 0x27, 0xb5, 0xd1, 0x46, 0x3b, 0x56, 0x5f, 0x31, + 0xf4, 0x0d, 0x3a, 0x5f, 0xab, 0x34, 0xfd, 0xb9, 0x77, 0xff, 0xf5, 0xb5, 0x0b, 0x26, 0x2f, 0xa3, 0xc9, 0x47, 0x70, 0x3f, 0x23, 0x71, 0x4f, 0xae, 0x5b, 0x57, 0xed, 0x73, 0x41, 0x5f, 0xb2, 0x2d, + 0xd5, 0xa7, 0x95, 0x6d, 0x13, 0xad, 0xbf, 0xb3, 0x88, 0xc8, 0x85, 0x5a, 0x3a, 0x5c, 0x31, 0xe7, 0x5d, 0xad, 0xa8, 0x82, 0x64, 0x48, 0x7d, 0xea, 0x93, 0x36, 0x85, 0x1e, 0x8d, 0xc8, 0x1d, 0x00, + 0x83, 0x36, 0x2c, 0xd2, 0x59, 0x1e, 0x11, 0x0f, 0x8f, 0xb1, 0x79, 0xe4, 0x79, 0x39, 0x3e, 0xef, 0x1a, 0x00, 0x02, 0xf5, 0x93, 0x70, 0xc0, 0x9f, 0x8f, 0xee, 0xbf, 0x69, 0x6c, 0x70, 0xbd, 0x69, + 0x3e, 0x0b, 0x14, 0x1f, 0xdd, 0xd4, 0x57, 0x5a, 0xfc, 0xef, 0x50, 0xa8, 0x2a, 0xbf, 0x6e, 0xb3, 0x87, 0x35, 0x66, 0xa1, 0xa7, 0x3c, 0x2e, 0xaf, 0x30, 0xaf, 0xbb, 0xf9, 0x32, 0x9a, 0x40, 0x3f, + 0x7b, 0x54, 0xe0, 0x09, 0xe9, 0x27, 0x90, 0xe9, 0x2b, 0x9c, 0x8a, 0x4b, 0x7e, 0x78, 0x24, 0x49, 0x74, 0x76, 0x14, 0x63, 0x0d, 0xe2, 0x2d, 0xf8, 0xe9, 0x2e, 0x69, 0x4d, 0x54, 0x15, 0x6d, 0x78, + 0xb9, 0xeb, 0xff, 0x8d, 0xfc, 0x8d, 0x8e, 0x8a, 0x94, 0xab, 0x1e, 0x56, 0x82, 0x82, 0x9e, 0xf2, 0x78, 0x54, 0x97, 0x12, 0x50, 0x95, 0xdf, 0x5c, 0x6e, 0xe6, 0x11, 0x1c, 0x41, 0x84, 0x1c, 0xd4, + 0xdc, 0x2b, 0x35, 0xb1, 0x45, 0x2d, 0x0a, 0x26, 0xf6, 0x5b, 0xa5, 0x87, 0x79, 0x9e, 0x26, 0x18, 0x9b, 0x60, 0xc9, 0xa8, 0xb3, 0x42, 0x5c, 0x9f, 0x4f, 0xb3, 0x75, 0x7f, 0x58, 0x9d, 0x95, 0xdd, + 0x1c, 0x49, 0x5a, 0x68, 0x69, 0x38, 0x5c, 0x6a, 0xf3, 0xb2, 0x9c, 0x1e, 0x4c, 0x60, 0xbf, 0x21, 0x4e, 0x0b, 0x19, 0x38, 0xe9, 0xa2, 0x91, 0x31, 0x0b, 0x1a, 0xb2, 0x77, 0x78, 0x67, 0x72, 0x7f, + 0xd2, 0x0e, 0x64, 0x1c, 0x96, 0xda, 0xfa, 0xea, 0x61, 0xbc, 0x7f, 0x07, 0x3f, 0xa3, 0x79, 0xbf, 0xc2, 0xbc, 0x60, 0xeb, 0x32, 0x1a, 0x5b, 0xd4, 0x50, 0xa7, 0x72, 0x9e, 0x24, 0x6d, 0x34, 0x70, + 0x41, 0xff, 0x30, 0x5b, 0xc0, 0x29, 0x04, 0xea, 0x32, 0xbc, 0x2c, 0xea, 0xb8, 0x5d, 0x26, 0xbd, 0x16, 0x11, 0x11, 0xd3, 0x19, 0x3b, 0x91, 0x37, 0xc3, 0x9d, 0x1b, 0x70, 0x5d, 0x43, 0x52, 0x84, + 0x11, 0xb6, 0x09, 0xa2, 0x4b, 0x6b, 0xd6, 0x5f, 0x4e, 0x19, 0x0e, 0xc9, 0x08, 0xb0, 0x3d, 0xf5, 0xf6, 0x7a, 0xa7, 0xe1, 0x81, 0xd3, 0xcc, 0x4e, 0x5a, 0x3f, 0xfc, 0xcc, 0x43, 0xe3, 0xe2, 0x6a, + 0xff, 0xfc, 0x5f, 0xff, 0xf3, 0xc6, 0x57, 0xfc, 0x0c, 0x7b, 0x0d, 0x3c, 0xf7, 0x1b, 0x91, 0xe6, 0x09, 0x32, 0x0c, 0x3c, 0xf7, 0x05, 0x97, 0x81, 0xe7, 0x5e, 0xc4, 0x95, 0x11, 0x42, 0xe1, 0x0e, + 0x89, 0x8a, 0xce, 0x1b, 0x16, 0x8e, 0x14, 0x13, 0x04, 0xb8, 0xb7, 0x13, 0x5b, 0x15, 0x8d, 0x03, 0x22, 0xad, 0x33, 0xe0, 0xbc, 0x59, 0xfa, 0x8a, 0x27, 0x8a, 0x2d, 0x43, 0xc4, 0x6e, 0x42, 0x38, + 0x07, 0x7c, 0x88, 0x91, 0x05, 0xc9, 0x71, 0xf4, 0x39, 0x0e, 0xdd, 0x9c, 0x5d, 0x94, 0x2b, 0xde, 0xd9, 0xf4, 0x1b, 0x37, 0xec, 0x57, 0x6c, 0x2c, 0x03, 0x64, 0x2e, 0x55, 0xe6, 0xd4, 0xb5, 0xb8, + 0xea, 0x7b, 0x57, 0xda, 0xc5, 0x71, 0xfd, 0xae, 0x95, 0xdd, 0x5b, 0xfd, 0xf4, 0xa9, 0x4e, 0xa7, 0x1f, 0xe0, 0x82, 0x93, 0x8f, 0x4f, 0x93, 0xe9, 0xb8, 0x8e, 0xa7, 0x55, 0x89, 0xaa, 0x05, 0x44, + 0x08, 0xae, 0x97, 0x65, 0x82, 0xc3, 0x75, 0xa1, 0xbd, 0x39, 0x2b, 0xea, 0xaa, 0x22, 0x1c, 0x6e, 0xa7, 0xee, 0x0e, 0x53, 0x95, 0x9a, 0x1f, 0xe1, 0x05, 0x50, 0x96, 0xce, 0xb6, 0x20, 0x20, 0xc0, + 0xf4, 0x6d, 0xf6, 0x7c, 0x38, 0x4d, 0x59, 0x8f, 0xdc, 0xc8, 0x1b, 0x80, 0x63, 0x71, 0x27, 0xc9, 0xcd, 0x0c, 0xd9, 0xb5, 0x72, 0x3b, 0x33, 0xb2, 0xb2, 0x35, 0xbb, 0x6c, 0xf6, 0x39, 0x63, 0xec, + 0xff, 0x74, 0x3c, 0x7d, 0xf8, 0x35, 0xff, 0x61, 0xc7, 0xd3, 0xcb, 0x76, 0x5f, 0x24, 0x77, 0xe4, 0x3b, 0x71, 0xe5, 0xb9, 0x43, 0x75, 0x85, 0xfb, 0x76, 0xa8, 0xae, 0x4f, 0x63, 0x9b, 0x57, 0xcb, + 0xb6, 0xae, 0x2e, 0x6a, 0xdd, 0xde, 0x6c, 0x5a, 0xe1, 0x74, 0x60, 0xe2, 0xa4, 0xa0, 0x65, 0x9e, 0x16, 0x70, 0xd0, 0x17, 0xf1, 0x5d, 0x5c, 0x75, 0xbd, 0xbc, 0x4f, 0x2d, 0x82, 0xa1, 0x95, 0x1e, + 0x63, 0x81, 0x68, 0xd6, 0x45, 0x18, 0x83, 0xa7, 0x4b, 0x0e, 0xc8, 0x65, 0x2f, 0x72, 0x16, 0xc1, 0xd2, 0x91, 0x81, 0x50, 0xe3, 0x18, 0xb7, 0xf2, 0x6a, 0xc9, 0xd6, 0x6b, 0x68, 0x01, 0x58, 0x8c, + 0x34, 0x32, 0xce, 0xf9, 0x7a, 0xb1, 0xfd, 0xfa, 0x37, 0x34, 0x32, 0xde, 0xf0, 0x51, 0x48, 0xc9, 0x7d, 0x74, 0x62, 0x4f, 0x88, 0x7d, 0x77, 0xbf, 0xe1, 0x0d, 0xb1, 0x5f, 0xe7, 0x2f, 0x3d, 0x9b, + 0x46, 0xc8, 0x82, 0x3e, 0xe2, 0xb0, 0x34, 0xb2, 0x5f, 0x69, 0xd0, 0xe9, 0x5c, 0xfb, 0x3b, 0x0f, 0x4b, 0x6b, 0x56, 0xc6, 0x00, 0x54, 0xda, 0x18, 0x38, 0x5f, 0x8a, 0x86, 0x62, 0xc3, 0x56, 0xb4, + 0x50, 0x08, 0x55, 0x07, 0xb8, 0xa4, 0x93, 0xb6, 0xb3, 0x4c, 0x8d, 0x9c, 0x99, 0x98, 0x36, 0x55, 0xb3, 0x64, 0x83, 0x83, 0x19, 0xed, 0xf8, 0x4a, 0x72, 0xe5, 0x26, 0x01, 0x84, 0x28, 0x63, 0x19, + 0x4f, 0xf6, 0x2c, 0x16, 0xfe, 0x13, 0xc5, 0x76, 0x94, 0x57, 0xeb, 0x4b, 0x4b, 0xe9, 0xfb, 0x38, 0x7d, 0xc6, 0x15, 0xf1, 0x11, 0xf0, 0x2b, 0x2a, 0xdf, 0x1e, 0xc7, 0x96, 0x29, 0x30, 0xad, 0x02, + 0x15, 0x48, 0x44, 0x65, 0x89, 0x6d, 0xdc, 0xc7, 0xd0, 0x1c, 0x9e, 0x2b, 0x72, 0x91, 0xac, 0x07, 0xe2, 0x50, 0xfa, 0x65, 0xae, 0x2a, 0x4b, 0x6a, 0xd9, 0xcb, 0x0e, 0xcf, 0x87, 0xb0, 0x61, 0x18, + 0x7e, 0xe7, 0x4c, 0xbd, 0xd5, 0x92, 0x68, 0xca, 0x7e, 0x83, 0xd0, 0xec, 0x99, 0x73, 0x15, 0x87, 0xe7, 0x88, 0xce, 0xed, 0xb7, 0xfc, 0x01, 0x72, 0x9d, 0xd3, 0xd1, 0x55, 0xaa, 0x58, 0x6f, 0xbe, + 0x37, 0x55, 0xd7, 0xbe, 0xdb, 0x56, 0xfe, 0xe4, 0x52, 0xe0, 0xee, 0xbb, 0xd8, 0x4d, 0xe4, 0x6f, 0xe2, 0x19, 0xb2, 0xfd, 0x0a, 0xfd, 0x05, 0x31, 0x5f, 0xe7, 0x26, 0x17, 0xd8, 0x3f, 0x63, 0x07, + 0xb7, 0x75, 0x60, 0x7b, 0xaa, 0xfd, 0xe1, 0x44, 0xec, 0xb6, 0x24, 0x98, 0xf7, 0x9d, 0xa0, 0x9d, 0x49, 0xa5, 0xdc, 0xf3, 0xd4, 0xa2, 0x72, 0xcd, 0xd8, 0x30, 0xd2, 0xe3, 0x0c, 0x1b, 0xa6, 0xde, + 0xd4, 0x50, 0x18, 0x76, 0x7b, 0x6c, 0x9c, 0xa0, 0xde, 0x26, 0xf9, 0x89, 0xeb, 0x8f, 0x4e, 0x8c, 0x86, 0x9e, 0xb7, 0x69, 0xf6, 0x7c, 0x3b, 0x3f, 0x50, 0x12, 0xbd, 0xd1, 0x8b, 0x66, 0x8d, 0xe0, + 0x47, 0x41, 0xff, 0x3e, 0xbe, 0xfc, 0x3d, 0xed, 0xfd, 0x1e, 0x4a, 0x88, 0xbf, 0xa7, 0x4f, 0xc8, 0x5a, 0x57, 0x90, 0x17, 0x3c, 0xbc, 0x0c, 0x26, 0x17, 0x28, 0x3f, 0x2f, 0x1e, 0x76, 0x66, 0xea, + 0x5c, 0xdd, 0xe1, 0x72, 0x07, 0xc4, 0x08, 0xcc, 0x77, 0xe5, 0xb9, 0x44, 0xd9, 0x33, 0x50, 0xaa, 0x2c, 0x99, 0x2e, 0xe5, 0x86, 0x6c, 0x77, 0xc9, 0xb6, 0x3a, 0xd3, 0x7a, 0x03, 0xe6, 0x4e, 0x7d, + 0x32, 0x5d, 0xa0, 0x11, 0x70, 0x13, 0x71, 0x9a, 0x58, 0x5f, 0x27, 0x1e, 0x06, 0x04, 0xf9, 0x11, 0x9e, 0xca, 0x06, 0x90, 0x1f, 0x15, 0x76, 0x46, 0x48, 0x41, 0x43, 0xec, 0x0f, 0x27, 0x77, 0xa4, + 0x81, 0xf7, 0x63, 0xa1, 0xb5, 0xb7, 0xa0, 0xbb, 0x37, 0x42, 0x7b, 0xff, 0xf7, 0x9b, 0x98, 0xb4, 0xdf, 0x25, 0x03, 0x9c, 0x38, 0x7f, 0x5d, 0xed, 0x9f, 0x67, 0x5b, 0x8e, 0xa5, 0xea, 0x3b, 0xa5, + 0xf8, 0xee, 0x1f, 0xe3, 0x67, 0xac, 0xb0, 0x37, 0xd0, 0x2f, 0xdb, 0xf7, 0x65, 0x6e, 0x6c, 0xd1, 0xad, 0xed, 0x2e, 0xdf, 0x29, 0x67, 0xcd, 0x68, 0xfd, 0xea, 0x80, 0x4f, 0x51, 0x23, 0x68, 0xd3, + 0x58, 0x3a, 0x33, 0x32, 0x09, 0xab, 0x01, 0x04, 0x1c, 0x03, 0x65, 0x4e, 0xa0, 0xeb, 0xa5, 0x29, 0xb8, 0xbd, 0x68, 0xf2, 0x1c, 0x85, 0xd1, 0x2d, 0x0f, 0x1d, 0xc2, 0x4a, 0x29, 0xb7, 0x6c, 0xab, + 0x59, 0xb9, 0x9a, 0x25, 0x65, 0x5f, 0xf3, 0xd9, 0x70, 0x5e, 0x19, 0xc2, 0x26, 0xb0, 0x71, 0x39, 0x59, 0x44, 0xfd, 0xf7, 0x95, 0x37, 0x6a, 0xbf, 0x79, 0x37, 0xa3, 0x15, 0xc1, 0x43, 0x59, 0xf7, + 0x19, 0x83, 0xe8, 0x67, 0xd0, 0x57, 0xbc, 0x7c, 0x98, 0x18, 0x5b, 0x79, 0x70, 0x3e, 0x5d, 0xb3, 0x06, 0xb1, 0xaf, 0x4a, 0x72, 0x2a, 0xc4, 0xe9, 0xd4, 0x89, 0xac, 0x0e, 0xc3, 0x13, 0x32, 0x91, + 0x7c, 0xa7, 0x10, 0x8e, 0xd3, 0x95, 0x98, 0x99, 0x22, 0x1a, 0xee, 0x38, 0x8f, 0xe3, 0xc9, 0xf3, 0xa2, 0x94, 0xf7, 0x86, 0x2e, 0xd6, 0x9b, 0x2a, 0x95, 0xd8, 0x59, 0x75, 0x28, 0xce, 0xe2, 0xdc, + 0xdf, 0xc4, 0xa0, 0x61, 0x2d, 0x4f, 0xed, 0xb6, 0x33, 0x31, 0x63, 0x73, 0x32, 0xc5, 0x55, 0xf9, 0x03, 0x6d, 0x7f, 0x76, 0xc7, 0xfe, 0x73, 0xda, 0xd4, 0x47, 0xc0, 0x2f, 0x08, 0xf9, 0xf0, 0x38, + 0x56, 0xaf, 0x3a, 0x4e, 0x0d, 0xb9, 0x6f, 0x8e, 0x8b, 0xf9, 0x52, 0xe0, 0x0f, 0x9c, 0x17, 0x8b, 0xcb, 0xca, 0x84, 0xa1, 0xac, 0x5b, 0x6f, 0xbb, 0x5c, 0x89, 0x30, 0x04, 0x04, 0xb8, 0x82, 0x49, + 0x17, 0x7b, 0xd4, 0x41, 0xd6, 0xc6, 0x7a, 0x8e, 0x9c, 0xcf, 0xab, 0xd2, 0x5a, 0x78, 0x19, 0x85, 0x9d, 0x7c, 0x88, 0xb1, 0x8b, 0x1d, 0xba, 0x3d, 0xad, 0x7a, 0xee, 0x18, 0x4e, 0x4f, 0x2a, 0xe1, + 0x97, 0x67, 0xad, 0x83, 0xac, 0x6e, 0x64, 0xe0, 0xcf, 0x0f, 0x59, 0x59, 0xa1, 0xdf, 0x4c, 0xe2, 0xfc, 0x45, 0x36, 0xa8, 0x63, 0xf7, 0xd7, 0x5d, 0x6b, 0xe6, 0x4d, 0x7a, 0xee, 0xcb, 0x3b, 0xd4, + 0x3d, 0xa6, 0xf1, 0x5f, 0x6e, 0x65, 0x79, 0x58, 0x9b, 0xe4, 0x1f, 0x14, 0x4d, 0xef, 0x7e, 0xc5, 0x65, 0xe3, 0xef, 0x7d, 0x30, 0x56, 0x60, 0xb5, 0x11, 0x86, 0x32, 0x21, 0x21, 0xdd, 0x18, 0x29, + 0xd5, 0x82, 0x5d, 0xbd, 0xc7, 0x6b, 0x6d, 0xd9, 0x52, 0x1d, 0x37, 0x2f, 0x03, 0xa1, 0x45, 0x4e, 0xdb, 0x1d, 0x9e, 0xc2, 0x3c, 0x6a, 0xcc, 0xed, 0x1a, 0x84, 0x42, 0x7d, 0x39, 0x70, 0x03, 0x53, + 0xc8, 0xe0, 0xb2, 0x68, 0x35, 0x57, 0x57, 0x9c, 0x8c, 0x5a, 0xed, 0xad, 0x35, 0x8f, 0xce, 0xa4, 0x73, 0x9f, 0x43, 0xa8, 0x66, 0xa6, 0x0b, 0xfb, 0x8c, 0x3f, 0x9f, 0xe9, 0x7a, 0x53, 0x00, 0xe6, + 0x66, 0x2f, 0xff, 0x11, 0x36, 0xfe, 0x31, 0x42, 0xfa, 0xde, 0x16, 0xa1, 0x4f, 0x29, 0xe4, 0xbf, 0xc1, 0xbe, 0x6c, 0xcb, 0xfb, 0xc3, 0x04, 0x1d, 0xa7, 0x9c, 0xaf, 0xcd, 0x73, 0x89, 0x62, 0x42, + 0x6a, 0xc1, 0x36, 0xb2, 0x72, 0x48, 0x4b, 0x09, 0x17, 0x33, 0x01, 0xcd, 0xe3, 0x25, 0x3f, 0xc4, 0x8e, 0x77, 0x6a, 0x4e, 0x1b, 0x7d, 0x2f, 0x84, 0xd0, 0x51, 0xd9, 0x0e, 0x35, 0x5b, 0xac, 0x50, + 0x2e, 0x08, 0x0f, 0x01, 0x29, 0x78, 0x8c, 0xb6, 0xd0, 0x51, 0xf5, 0xe0, 0x27, 0xec, 0x7c, 0x99, 0xee, 0x4f, 0xb9, 0x9a, 0x97, 0x3b, 0x4f, 0xb2, 0x96, 0xd1, 0x42, 0x4c, 0xc1, 0x91, 0xd1, 0x60, + 0x0f, 0x42, 0xf2, 0x47, 0xa0, 0xf2, 0x2d, 0x06, 0xf9, 0x1e, 0x1a, 0xb1, 0xe7, 0x78, 0xfd, 0x05, 0xe4, 0x0b, 0x0a, 0x2f, 0x83, 0x09, 0x36, 0x8e, 0xb7, 0xeb, 0x6e, 0xe2, 0xae, 0xa4, 0xfd, 0x21, + 0xaf, 0x36, 0x87, 0x05, 0x2e, 0xaf, 0x0d, 0x12, 0x3d, 0xba, 0xbc, 0x88, 0x0b, 0x7c, 0xb8, 0x13, 0x36, 0x87, 0x1d, 0x8e, 0x98, 0xa4, 0x3d, 0x6d, 0x4d, 0x76, 0xd7, 0x51, 0xbd, 0xc7, 0x29, 0xbb, + 0x13, 0xcd, 0x8b, 0xc2, 0x91, 0xf7, 0x56, 0x89, 0x0f, 0xef, 0xb4, 0x7d, 0x99, 0x26, 0x1c, 0xb4, 0x37, 0xcb, 0x19, 0x1b, 0x55, 0x33, 0x8f, 0x96, 0x4c, 0x1e, 0xd3, 0xf6, 0x7f, 0xa2, 0x17, 0xfc, + 0x05, 0x43, 0x7f, 0x9f, 0xc7, 0xa0, 0xac, 0xb1, 0x9b, 0xb6, 0xf6, 0x1f, 0xf9, 0xb7, 0x9e, 0xab, 0x47, 0xff, 0x06, 0xf4, 0x05, 0x6d, 0xaf, 0xc3, 0xb1, 0xb5, 0xe8, 0xb7, 0xa7, 0x0d, 0x4d, 0x59, + 0x20, 0x21, 0x57, 0x02, 0x84, 0x57, 0xe6, 0x7a, 0x39, 0x2c, 0xc4, 0xd4, 0x5e, 0x00, 0x29, 0x81, 0xc6, 0xa7, 0x72, 0xa8, 0x8f, 0xdb, 0xe5, 0x22, 0x74, 0xc4, 0xb5, 0xa3, 0xb9, 0x6b, 0x16, 0x77, + 0x25, 0xbb, 0x20, 0x11, 0xcd, 0xde, 0xfb, 0x81, 0x6c, 0x28, 0x1d, 0x83, 0x04, 0xd2, 0x0c, 0xa3, 0x93, 0xd6, 0x54, 0xe7, 0xb9, 0xa7, 0x12, 0x1b, 0x30, 0xd3, 0x66, 0xce, 0xc1, 0xfb, 0x13, 0x7b, + 0xe4, 0xc8, 0x08, 0x89, 0x1b, 0x1f, 0xfc, 0x3f, 0x67, 0x4a, 0xfb, 0x0c, 0xfa, 0x82, 0xc3, 0x8f, 0x13, 0x63, 0xcd, 0x6b, 0xd1, 0x61, 0x6b, 0x90, 0x3a, 0xbc, 0x4f, 0x56, 0x0b, 0x8f, 0x5c, 0xd7, + 0xec, 0x0a, 0xe9, 0x15, 0xf0, 0xb4, 0xdf, 0x9f, 0xed, 0xa2, 0x9c, 0xd7, 0x34, 0xa3, 0xc3, 0x46, 0x70, 0x10, 0x49, 0x1a, 0x48, 0x20, 0x80, 0x9c, 0xae, 0x68, 0xae, 0x2c, 0x1b, 0x18, 0x77, 0x2b, + 0x78, 0x1f, 0x85, 0xb8, 0xb0, 0x74, 0x1c, 0xac, 0x38, 0xe8, 0xb8, 0x78, 0x4c, 0x71, 0x46, 0x4a, 0x80, 0xb6, 0x2d, 0xc1, 0x93, 0xe0, 0x8f, 0x94, 0x9e, 0x3f, 0xdb, 0xd9, 0x7e, 0xfd, 0x7b, 0x3a, + 0xd6, 0x0a, 0x70, 0x59, 0xe9, 0x07, 0xff, 0x67, 0x53, 0xc5, 0x8f, 0xd8, 0xe2, 0x8b, 0x94, 0xf5, 0x84, 0xa0, 0x72, 0xef, 0x1b, 0xde, 0x71, 0xfc, 0x65, 0xfe, 0x22, 0xc9, 0x8d, 0x10, 0x5d, 0xa2, + 0xfd, 0xec, 0x00, 0xc6, 0xc7, 0x80, 0x48, 0x4b, 0x08, 0xa4, 0x43, 0x6d, 0x41, 0x80, 0x9e, 0x27, 0xc1, 0xcb, 0x7d, 0xa3, 0x6e, 0x64, 0x5a, 0x4d, 0xd2, 0x61, 0x16, 0xbb, 0xbb, 0x69, 0x5c, 0xd1, + 0x3b, 0x6f, 0x0e, 0x87, 0x55, 0x52, 0xe7, 0xbe, 0x80, 0xe0, 0x26, 0x87, 0x9f, 0xe9, 0x99, 0xc8, 0xcc, 0xbd, 0x59, 0x27, 0x91, 0x81, 0xae, 0x6a, 0x90, 0x3e, 0xb0, 0x62, 0x04, 0x22, 0x4a, 0x0f, + 0x3c, 0x2a, 0x37, 0x38, 0x02, 0xfb, 0xff, 0x81, 0xe3, 0xf5, 0xc3, 0x6b, 0xdf, 0xb7, 0x46, 0x79, 0xdb, 0xcb, 0x3f, 0x20, 0xab, 0xff, 0x0e, 0x0f, 0xed, 0xdd, 0x6d, 0xbd, 0x16, 0xdd, 0xfe, 0x07, + 0x85, 0xdf, 0x07, 0x5f, 0xf2, 0xe8, 0x58, 0xf9, 0xb9, 0x37, 0x56, 0x28, 0xee, 0xa9, 0xf3, 0x2c, 0x39, 0xc1, 0x32, 0x82, 0xd2, 0xa7, 0x03, 0x39, 0xef, 0xb4, 0xd2, 0xed, 0xd7, 0xc8, 0x66, 0x59, + 0xc1, 0x09, 0x71, 0x5a, 0xa1, 0x54, 0x00, 0x1c, 0xf0, 0xb4, 0xdb, 0xe6, 0xaa, 0x38, 0x00, 0xd9, 0x40, 0xcd, 0xb8, 0x81, 0xda, 0x98, 0xb2, 0x9f, 0xb2, 0x07, 0x0c, 0x39, 0x48, 0x03, 0x0e, 0x1c, + 0x53, 0xf2, 0x9c, 0x04, 0x02, 0x59, 0x98, 0x43, 0x8f, 0x26, 0xb4, 0x3c, 0x55, 0xf4, 0xe9, 0x48, 0x22, 0xfe, 0x0f, 0x8e, 0xd1, 0xff, 0x26, 0x1b, 0x5d, 0x37, 0xf6, 0xb7, 0xf9, 0x5d, 0xff, 0xd0, + 0x56, 0x5f, 0xbe, 0xe6, 0xd1, 0x66, 0x5f, 0x3e, 0x1c, 0xbb, 0xdd, 0x49, 0x84, 0xfb, 0x14, 0x89, 0x49, 0x4c, 0xd0, 0x9d, 0xd5, 0x29, 0xd4, 0x78, 0x26, 0x92, 0x6f, 0xad, 0xbc, 0x98, 0x4d, 0xc1, + 0x6c, 0xbd, 0x10, 0xa4, 0xed, 0x5c, 0x09, 0x4e, 0x64, 0x33, 0xed, 0xfb, 0xe6, 0x50, 0xe8, 0xf5, 0x6a, 0xbb, 0x39, 0x77, 0x4b, 0x70, 0x8e, 0x52, 0xc7, 0x16, 0xae, 0x59, 0x48, 0x6a, 0xf6, 0x4b, + 0x54, 0x9a, 0x41, 0x46, 0x28, 0xa8, 0x99, 0xbb, 0x3f, 0x0d, 0xf1, 0xc9, 0x6c, 0xad, 0xa7, 0x75, 0xa0, 0xff, 0x9d, 0xb7, 0xbb, 0x2d, 0xfd, 0xca, 0x0e, 0x1f, 0xe7, 0xaf, 0x90, 0x4f, 0x35, 0x4f, + 0xfe, 0x0d, 0xf6, 0x5a, 0x67, 0xed, 0xf5, 0x61, 0x42, 0x8e, 0x6b, 0xa1, 0x5c, 0x30, 0x33, 0xc0, 0xde, 0xd4, 0xb3, 0x64, 0x18, 0x92, 0x4c, 0x9a, 0xd2, 0x92, 0xcc, 0xc8, 0x0b, 0x15, 0xb0, 0x08, + 0x5e, 0x1e, 0xd2, 0x33, 0xc0, 0x2a, 0x15, 0x68, 0xf3, 0x27, 0x11, 0x22, 0x0f, 0x4b, 0x60, 0x8b, 0x60, 0x61, 0xcd, 0x66, 0xb4, 0x0a, 0xaf, 0xc5, 0x60, 0xb0, 0xe1, 0x40, 0x00, 0x64, 0x40, 0x15, + 0x52, 0x8d, 0x2e, 0x36, 0x56, 0x29, 0x75, 0x45, 0x31, 0x07, 0xcb, 0xad, 0x04, 0xf3, 0xff, 0x41, 0x00, 0x4e, 0x91, 0x95, 0x45, 0xfe, 0xf2, 0xfb, 0xfd, 0x2c, 0x6e, 0x9a, 0x4f, 0xa1, 0x82, 0xff, + 0xff, 0x8f, 0xaf, 0x15, 0x87, 0xd8, 0x4f, 0xec, 0xb7, 0xf2, 0x95, 0x5f, 0xee, 0x81, 0xdf, 0x85, 0x38, 0xb1, 0x8b, 0x53, 0xfb, 0xc3, 0x47, 0x97, 0xcc, 0xd8, 0x57, 0xfb, 0xf9, 0xe7, 0x2c, 0xd0, + 0x2f, 0x19, 0xb2, 0x41, 0x51, 0x65, 0x13, 0xcf, 0x6e, 0xec, 0x5f, 0x77, 0x73, 0x07, 0x5f, 0x3e, 0x8e, 0x2f, 0x21, 0xa0, 0xaf, 0xff, 0xfe, 0xb5, 0x92, 0xe7, 0x7b, 0xfd, 0xfd, 0xeb, 0x89, 0xfb, + 0x74, 0x30, 0xdf, 0x4a, 0xa9, 0x7f, 0x36, 0x73, 0xfd, 0xf5, 0xd7, 0xaf, 0xe3, 0xf5, 0x1f, 0x2e, 0x61, 0xf2, 0x9f, 0xe3, 0x27, 0x3f, 0xea, 0x75, 0xe8, 0x07, 0x71, 0x6f, 0xec, 0x65, 0x86, 0xff, + 0x8d, 0xfd, 0x0d, 0xfd, 0xf5, 0x3f, 0x60, 0xf4, 0x35, 0x5c, 0x72, 0x8c, 0x0f, 0xfb, 0x72, 0x9a, 0x9a, 0xc7, 0x8d, 0x49, 0xf0, 0xa7, 0x22, 0xc9, 0xde, 0xa1, 0xbe, 0x9d, 0xd7, 0x97, 0xf1, 0x04, + 0x1f, 0x17, 0x2f, 0x16, 0x6d, 0x8b, 0x68, 0xe3, 0x2f, 0x83, 0x03, 0xe8, 0xd2, 0x18, 0x39, 0x3b, 0x97, 0x36, 0x78, 0xc2, 0xc8, 0xe8, 0xd0, 0xc8, 0xb8, 0x65, 0x6f, 0x8f, 0x86, 0x03, 0x29, 0xbb, + 0x69, 0xb5, 0xee, 0xf6, 0xd0, 0x8c, 0x28, 0xed, 0x6d, 0xcd, 0xe8, 0xa8, 0x32, 0x1d, 0x7a, 0x6f, 0x30, 0xab, 0x3a, 0x95, 0x56, 0x4d, 0x02, 0x86, 0x1e, 0x46, 0x1e, 0xcf, 0x53, 0x0c, 0x4a, 0x84, + 0xc6, 0xad, 0xf1, 0x8e, 0x83, 0x83, 0xe7, 0xc5, 0x96, 0x6f, 0x77, 0xf9, 0x13, 0xc1, 0xff, 0xfa, 0xd7, 0x95, 0xbc, 0x9f, 0xda, 0xb7, 0x11, 0x7b, 0xd5, 0xd8, 0xe5, 0x23, 0x9f, 0xc0, 0xf4, 0xa9, + 0xb0, 0x8c, 0x17, 0x80, 0xe0, 0xe4, 0xf2, 0xe7, 0xe2, 0x11, 0x1e, 0xe1, 0x17, 0x09, 0x2b, 0xa3, 0x1a, 0xe4, 0x19, 0x9c, 0xf6, 0xc8, 0xa1, 0xd7, 0x44, 0xc1, 0x3b, 0x9e, 0xa3, 0x29, 0x17, 0xaf, + 0x4b, 0x07, 0x62, 0xca, 0x8d, 0xdb, 0xcc, 0x5a, 0xdf, 0xd5, 0x18, 0xa8, 0xac, 0x79, 0x03, 0xe3, 0x5a, 0x28, 0x77, 0x81, 0xf6, 0xbc, 0xdf, 0x62, 0x67, 0x21, 0xd1, 0x22, 0x10, 0x9b, 0x05, 0x4a, + 0xca, 0x63, 0x43, 0xd4, 0x69, 0x22, 0x02, 0xce, 0x8d, 0x8c, 0x37, 0x4a, 0xbc, 0x03, 0xdb, 0xff, 0x80, 0x97, 0xfc, 0x74, 0x3b, 0xf8, 0xe5, 0xc4, 0x3f, 0xb6, 0x76, 0xfa, 0x4e, 0xc1, 0xd3, 0xdb, + 0xdb, 0xe3, 0x81, 0x79, 0xcd, 0x2b, 0x9a, 0x6b, 0x49, 0xdf, 0xcb, 0xc7, 0xd0, 0xd7, 0xad, 0x0f, 0x8a, 0x6a, 0xf2, 0xde, 0x7b, 0xef, 0x85, 0x0f, 0x7f, 0x62, 0x4f, 0xef, 0x1d, 0xe2, 0x89, 0xbf, + 0xe1, 0x0f, 0x45, 0xc6, 0xaf, 0x45, 0x92, 0xde, 0xbf, 0xef, 0xd3, 0xbf, 0xc4, 0x79, 0xe4, 0x57, 0xf1, 0x6b, 0xf0, 0x35, 0xf2, 0x49, 0x0e, 0xb8, 0xc6, 0x53, 0xbd, 0xb5, 0x06, 0xbe, 0xcb, 0x6d, + 0xde, 0x2b, 0x9d, 0x5f, 0x8b, 0xa9, 0x7c, 0x5a, 0xe6, 0x43, 0x2b, 0xe0, 0x9d, 0x77, 0x7e, 0x1f, 0xf4, 0x3b, 0x20, 0x7e, 0xd7, 0xce, 0x7a, 0x61, 0x97, 0x5f, 0x7e, 0xc3, 0xef, 0xd8, 0xb8, 0xd7, + 0x6c, 0xf9, 0xaf, 0x91, 0x70, 0xd7, 0x77, 0x5e, 0x43, 0xad, 0x5e, 0x70, 0xf6, 0x35, 0x57, 0xfb, 0x81, 0x9a, 0x75, 0x5d, 0xd1, 0x27, 0x6c, 0x7c, 0x08, 0x6a, 0xba, 0x24, 0xf7, 0xdf, 0x61, 0x96, + 0x37, 0x5e, 0x90, 0x57, 0xf2, 0xb9, 0xf8, 0x40, 0x2e, 0xe3, 0x11, 0x14, 0xf7, 0x9e, 0x79, 0x79, 0x8f, 0xe8, 0xa0, 0xa7, 0x9c, 0x93, 0xaf, 0x30, 0x5f, 0xe8, 0xee, 0x3a, 0x9a, 0x40, 0xe3, 0x5c, + 0x92, 0x00, 0x07, 0xad, 0xd7, 0x61, 0x92, 0x14, 0x14, 0x63, 0x19, 0x88, 0x18, 0x78, 0x9d, 0x1c, 0xf0, 0x80, 0x28, 0xac, 0x67, 0xd5, 0x39, 0x35, 0x54, 0xd3, 0x77, 0xa7, 0xac, 0x2d, 0x9b, 0x32, + 0x1c, 0xf8, 0xf8, 0xb2, 0x8f, 0x02, 0x08, 0x0c, 0xd4, 0x6c, 0x05, 0x39, 0x8b, 0xd8, 0x82, 0x17, 0x24, 0xa3, 0xe1, 0x2e, 0x67, 0xa4, 0xc8, 0xba, 0x4c, 0x1b, 0xa5, 0x6c, 0x86, 0xc4, 0x10, 0xf6, + 0xf3, 0x83, 0x30, 0x52, 0xe8, 0x76, 0xe2, 0xbc, 0xa9, 0xfc, 0xab, 0x74, 0x05, 0x7f, 0x6a, 0x59, 0xfa, 0x0d, 0xf2, 0xbe, 0xd4, 0x50, 0xb8, 0x6f, 0xc8, 0x79, 0xc6, 0x14, 0xf1, 0x09, 0xf2, 0x0b, + 0x22, 0x3f, 0x3e, 0x8f, 0x4d, 0xd2, 0x3b, 0xd8, 0xec, 0x31, 0x83, 0xd9, 0xb9, 0x46, 0x95, 0x25, 0xba, 0x31, 0x4e, 0x5b, 0x12, 0x25, 0x91, 0x3d, 0xef, 0xe4, 0xa5, 0x91, 0x6f, 0x0f, 0x1b, 0xea, + 0xcc, 0x6d, 0x28, 0x4f, 0x69, 0x50, 0x06, 0x01, 0xbc, 0xcc, 0x88, 0xf7, 0xa4, 0x01, 0xab, 0xd2, 0x29, 0x5b, 0x48, 0x67, 0x7a, 0x5e, 0xcd, 0x15, 0x8c, 0x90, 0x9c, 0xc8, 0xa2, 0xf0, 0x15, 0xde, + 0x47, 0xd6, 0xc6, 0x68, 0xfb, 0x99, 0xb4, 0x26, 0xc6, 0xa2, 0xf3, 0x41, 0x2d, 0x8b, 0x51, 0x38, 0x7d, 0x3d, 0xf7, 0x8f, 0xb0, 0xf9, 0xe7, 0x49, 0xa0, 0xaf, 0x30, 0xaf, 0x78, 0x7c, 0x19, 0x5d, + 0x30, 0xf8, 0x43, 0xf2, 0x27, 0x3c, 0x61, 0x3d, 0x6d, 0x05, 0xe2, 0x47, 0x72, 0x63, 0xa4, 0x61, 0xed, 0xb8, 0x87, 0xf9, 0x0e, 0x06, 0xd8, 0xc2, 0x8e, 0xb1, 0x40, 0xff, 0xc3, 0xf4, 0xcd, 0x26, + 0xce, 0xfb, 0x49, 0x5a, 0xb5, 0x8f, 0x54, 0xa2, 0xe7, 0xaa, 0x39, 0xbd, 0x41, 0x7d, 0x59, 0xd7, 0xeb, 0x70, 0x02, 0x8f, 0x28, 0xdf, 0xf4, 0x72, 0x36, 0xe2, 0x4d, 0xb8, 0x68, 0xc3, 0x5d, 0xab, + 0x84, 0x8c, 0x50, 0x1d, 0x7d, 0x09, 0xcc, 0xca, 0x58, 0xd3, 0xc2, 0x8c, 0xa9, 0x35, 0x19, 0xda, 0xaf, 0xf1, 0xde, 0x6f, 0xd7, 0xc1, 0xba, 0x06, 0x67, 0x4d, 0x00, 0x95, 0x4b, 0x30, 0x3e, 0x73, + 0xc7, 0xe5, 0x36, 0x23, 0x6b, 0x76, 0x76, 0x12, 0x5d, 0x83, 0xf3, 0xa9, 0xfd, 0xbe, 0x6b, 0x90, 0x9a, 0x33, 0x96, 0xd3, 0x6c, 0x73, 0xb4, 0x9c, 0x9d, 0x9d, 0x66, 0xab, 0x3f, 0xb1, 0x93, 0xc2, + 0xa3, 0x08, 0xac, 0x78, 0xed, 0xe6, 0x5e, 0xd9, 0x79, 0xf8, 0x58, 0x32, 0x78, 0x0a, 0x79, 0x9f, 0x40, 0xbf, 0xa0, 0xf0, 0xd3, 0xc4, 0x64, 0x3a, 0x0e, 0x8f, 0xf8, 0x54, 0x26, 0xe2, 0x01, 0x37, + 0xa6, 0xfd, 0xbc, 0x82, 0xdd, 0x93, 0x1b, 0x76, 0xca, 0xd9, 0x71, 0x96, 0x27, 0x42, 0x3f, 0xa0, 0xa1, 0xd4, 0x4f, 0xbd, 0xa5, 0xd7, 0x58, 0x58, 0xc5, 0x76, 0xfe, 0xfa, 0x18, 0x55, 0xde, 0x4a, + 0x06, 0xd6, 0x31, 0xc8, 0x9f, 0xf1, 0xa6, 0x17, 0xa0, 0xcd, 0xdc, 0x01, 0x10, 0x6e, 0xd6, 0xe7, 0xfe, 0x4c, 0x5c, 0xc5, 0xdc, 0xb1, 0xa2, 0xd9, 0x99, 0xba, 0x39, 0x90, 0xf5, 0xf3, 0xa2, 0x5c, + 0x5c, 0x4f, 0xae, 0xcd, 0x0e, 0x5f, 0x6f, 0xe6, 0x67, 0x52, 0xd5, 0xc8, 0x71, 0x74, 0x5a, 0xc4, 0x9e, 0x9f, 0x7f, 0xeb, 0xe2, 0x7a, 0xf2, 0x54, 0x7f, 0x00, 0x7c, 0xd9, 0x96, 0xdf, 0x8f, 0x63, + 0x6a, 0x93, 0x5d, 0xd4, 0xc1, 0x69, 0xad, 0xca, 0xc2, 0xfc, 0x10, 0x82, 0xec, 0x52, 0xd9, 0x64, 0x3c, 0x86, 0xee, 0x20, 0xb0, 0xf5, 0xab, 0x75, 0x55, 0x0e, 0x3b, 0xdf, 0x3b, 0xe8, 0x11, 0xd9, + 0x70, 0x9b, 0xce, 0xf6, 0x8d, 0x32, 0x28, 0xdb, 0x53, 0x22, 0xf8, 0x79, 0xaa, 0x16, 0x67, 0x10, 0x91, 0x40, 0x46, 0x4b, 0x2d, 0xbd, 0x99, 0xfb, 0xc0, 0x8a, 0x23, 0xea, 0xa9, 0x19, 0xcd, 0x07, + 0x1c, 0x22, 0xe5, 0x94, 0xe6, 0xb7, 0x7f, 0x92, 0x9d, 0x3c, 0xae, 0x95, 0xce, 0x5b, 0xef, 0x81, 0x7b, 0xb8, 0x43, 0x9f, 0x2a, 0xb1, 0x78, 0x81, 0x78, 0x41, 0x5a, 0xfb, 0xda, 0x3e, 0x67, 0xc4, + 0x35, 0xb1, 0x67, 0xce, 0xa4, 0xde, 0x4f, 0xb5, 0x75, 0x23, 0xa9, 0xdb, 0x66, 0x79, 0x04, 0x44, 0x08, 0x05, 0x6b, 0x81, 0xad, 0x8c, 0xd9, 0x9a, 0x3f, 0x9f, 0x58, 0xf7, 0xd8, 0xaa, 0x32, 0xe2, + 0x62, 0xe8, 0xda, 0x87, 0x50, 0x90, 0xaa, 0xfd, 0x2a, 0x51, 0x98, 0xe5, 0xd0, 0x24, 0xdb, 0x01, 0x5f, 0x1c, 0x56, 0xfe, 0x40, 0xb1, 0x60, 0x94, 0xfa, 0x3d, 0x6d, 0x68, 0x0c, 0xb7, 0x3e, 0x9d, + 0x2c, 0xfd, 0x44, 0xa5, 0xcf, 0x0b, 0xbc, 0x6f, 0x45, 0xb3, 0xff, 0x0d, 0xff, 0xfd, 0xa9, 0x76, 0xc0, 0x63, 0xb1, 0xe7, 0x05, 0xa9, 0xef, 0x7d, 0x1c, 0xde, 0x9a, 0x2e, 0x5c, 0x26, 0xc6, 0xd5, + 0x27, 0x6a, 0x73, 0xa7, 0x38, 0x4f, 0xca, 0x2a, 0xce, 0xe2, 0x4b, 0xe3, 0x84, 0x7f, 0xf2, 0x34, 0x7f, 0x81, 0x0d, 0x4e, 0xbe, 0xce, 0x8c, 0x3d, 0xd3, 0x8d, 0xa5, 0x83, 0xe8, 0xe6, 0x28, 0xa0, + 0x1e, 0x3d, 0x0d, 0xcb, 0x39, 0x2c, 0x34, 0x7d, 0xbc, 0xd2, 0xab, 0x39, 0x03, 0xa5, 0xe7, 0x9c, 0x3b, 0x88, 0x0b, 0xbe, 0x6c, 0x56, 0xc4, 0x11, 0xf7, 0x4f, 0x9e, 0x45, 0xd6, 0x30, 0xa2, 0x54, + 0x12, 0x7b, 0xda, 0x38, 0xd1, 0x72, 0xa5, 0x36, 0xd9, 0xea, 0xe0, 0xc1, 0x0a, 0x6b, 0xd8, 0xf0, 0x66, 0x4b, 0x93, 0xf6, 0x02, 0xa1, 0xe1, 0xe1, 0x00, 0x9a, 0x65, 0x3f, 0xd2, 0x42, 0x15, 0xb4, + 0xf9, 0xb5, 0xea, 0xe2, 0x07, 0x3d, 0xe4, 0x8b, 0xa1, 0x21, 0xb2, 0xeb, 0xd7, 0x9e, 0xb0, 0xbf, 0x65, 0xff, 0x9b, 0x17, 0x6e, 0xdb, 0xc2, 0x7f, 0x78, 0xe1, 0x14, 0xc5, 0x6e, 0x34, 0x71, 0x8a, + 0xb3, 0xef, 0x7d, 0xda, 0x8b, 0x5f, 0x8f, 0x3a, 0xc8, 0xff, 0x97, 0xdb, 0xba, 0x3e, 0x36, 0x00, 0xb9, 0x2f, 0x8c, 0x40, 0x4f, 0x94, 0xa4, 0x7e, 0x87, 0x7a, 0x39, 0x0b, 0xaf, 0xe3, 0x8b, 0x97, + 0x6e, 0x44, 0x49, 0xea, 0xfd, 0x59, 0xda, 0xcc, 0xaa, 0xba, 0x66, 0x44, 0x52, 0x53, 0xe5, 0xed, 0x71, 0x33, 0x9d, 0x67, 0x75, 0xb2, 0xab, 0xea, 0x0e, 0xa3, 0x49, 0x03, 0x46, 0x56, 0x18, 0x5d, + 0x31, 0x71, 0x6c, 0xf7, 0x1d, 0xca, 0xf6, 0x3d, 0x87, 0x5a, 0xe9, 0x32, 0xc4, 0xfb, 0xbe, 0x6e, 0x5b, 0xd5, 0xf4, 0xac, 0x7a, 0x37, 0xa0, 0x9a, 0xe0, 0x6a, 0x21, 0x12, 0x78, 0x20, 0xa8, 0x27, + 0x1e, 0x36, 0xe3, 0x77, 0xf0, 0xd7, 0x92, 0x02, 0x3f, 0x8b, 0x33, 0xef, 0xc9, 0xd0, 0x8f, 0xe8, 0xe4, 0xcf, 0x39, 0xd7, 0x15, 0xe4, 0x05, 0x25, 0x2f, 0x83, 0xb1, 0xd5, 0xb9, 0xca, 0xa4, 0x47, + 0x1c, 0x33, 0x52, 0xeb, 0x36, 0x38, 0xed, 0x53, 0xe1, 0x24, 0xbb, 0x40, 0x8a, 0xba, 0x1b, 0x02, 0x38, 0xb5, 0xab, 0x54, 0xc0, 0xdb, 0x01, 0x32, 0xbd, 0xd5, 0x5c, 0x4a, 0x15, 0xd6, 0x49, 0xf1, + 0xa4, 0x00, 0xcd, 0x54, 0x8e, 0xb1, 0xcc, 0x21, 0xed, 0x50, 0x3f, 0xec, 0x66, 0x24, 0xb3, 0x20, 0x76, 0xe4, 0xa6, 0x1d, 0xfc, 0x5e, 0xde, 0x1c, 0xb7, 0x87, 0x9a, 0x46, 0xa3, 0xa1, 0x11, 0xfe, + 0x0b, 0xbc, 0x96, 0x6d, 0x15, 0x4f, 0x92, 0xfa, 0x01, 0xc6, 0xb0, 0xbf, 0x9f, 0xa9, 0xf7, 0x77, 0x05, 0xf9, 0x82, 0xb1, 0xcb, 0xe0, 0x92, 0xbc, 0x3d, 0x82, 0x8f, 0x10, 0x95, 0xa0, 0xf7, 0x3d, + 0x8a, 0x2a, 0x70, 0xef, 0x52, 0x64, 0xa9, 0xc0, 0x2c, 0x9d, 0xad, 0x9b, 0x93, 0x01, 0x43, 0xd4, 0x82, 0xd0, 0x96, 0xc1, 0x3e, 0xdd, 0xc3, 0xa6, 0x57, 0x90, 0xfb, 0x14, 0x8e, 0x63, 0x58, 0xf5, + 0xf9, 0xd8, 0xf7, 0x23, 0x88, 0xe7, 0x03, 0xd9, 0x5f, 0x23, 0x81, 0x68, 0x08, 0xf8, 0x00, 0xd5, 0xa4, 0xef, 0x0a, 0x35, 0x15, 0x54, 0xb3, 0x76, 0xbd, 0xea, 0x72, 0x8f, 0x19, 0x19, 0x5f, 0xf0, + 0xa1, 0x8a, 0xc9, 0x5b, 0x99, 0xbe, 0x11, 0xa8, 0x6b, 0xe2, 0x47, 0x21, 0x53, 0xd0, 0xdf, 0x30, 0xf2, 0x0c, 0x05, 0x36, 0x71, 0xfa, 0x82, 0xb7, 0x26, 0x4e, 0x27, 0x57, 0x10, 0x3f, 0xa3, 0xed, + 0x60, 0x05, 0xa0, 0x80, 0x47, 0xf3, 0x65, 0xb5, 0xe7, 0x97, 0xb8, 0x71, 0x94, 0x16, 0x7a, 0x1c, 0x8b, 0x36, 0x40, 0x50, 0xa7, 0x39, 0xc8, 0x92, 0x0a, 0xb0, 0x99, 0x6d, 0xe8, 0xbd, 0x9b, 0x1e, + 0xfa, 0x10, 0x75, 0x30, 0x0f, 0x39, 0x10, 0x35, 0xa4, 0x70, 0x7e, 0xb9, 0x49, 0x62, 0x9a, 0x71, 0x01, 0x7b, 0x8b, 0x6e, 0x60, 0x99, 0xee, 0xf9, 0x35, 0x51, 0xe2, 0xba, 0xbb, 0x36, 0xf1, 0x75, + 0x56, 0xe5, 0x23, 0x75, 0xa9, 0x1b, 0xb3, 0xc9, 0x67, 0xa3, 0x4a, 0x3d, 0xb1, 0xab, 0xb0, 0xcd, 0xfc, 0x8f, 0xac, 0xf7, 0xab, 0x61, 0x25, 0xf4, 0x73, 0xbf, 0xb2, 0x9b, 0xa2, 0x9a, 0xbc, 0xf1, + 0xf2, 0xf7, 0x57, 0x89, 0x2f, 0xaf, 0x36, 0x7d, 0xe9, 0x7b, 0x13, 0xbb, 0xaa, 0xec, 0xfe, 0x9d, 0xd5, 0xa3, 0xb7, 0x8c, 0xfa, 0xde, 0x6b, 0x63, 0x44, 0xfa, 0xb6, 0x8d, 0x1f, 0x39, 0x01, 0xc9, + 0xbf, 0xd1, 0x27, 0xac, 0x0d, 0x2f, 0x00, 0x5f, 0x76, 0xb3, 0x8d, 0xbd, 0xc9, 0x05, 0xc2, 0xcf, 0x9b, 0x09, 0x6c, 0xcc, 0x1a, 0x51, 0x7c, 0x71, 0xdf, 0x03, 0xdc, 0x7e, 0x21, 0xcd, 0x33, 0xea, + 0x9c, 0xe7, 0x38, 0x3f, 0x63, 0x4b, 0x28, 0x25, 0x14, 0x86, 0x25, 0xb2, 0x94, 0x1c, 0xd6, 0x7a, 0xb6, 0x02, 0x28, 0x54, 0x99, 0x6e, 0x16, 0xd0, 0xa6, 0x70, 0xe7, 0x55, 0x7e, 0x3a, 0x68, 0x07, + 0x63, 0xb7, 0xd8, 0xc4, 0x06, 0x0a, 0x06, 0xe5, 0x0c, 0xb7, 0x03, 0x95, 0x64, 0x23, 0x07, 0x0c, 0x07, 0x62, 0x4b, 0xf8, 0x9f, 0x68, 0xe0, 0x46, 0x46, 0x79, 0x5d, 0xf6, 0x2f, 0x2f, 0xae, 0x1b, + 0xf0, 0x45, 0x46, 0xb9, 0x4c, 0xfc, 0x8c, 0xae, 0x47, 0xb7, 0xe2, 0x23, 0xce, 0xfb, 0xe7, 0xf8, 0xbb, 0xfb, 0x0d, 0xe0, 0xe4, 0xfe, 0xfc, 0x85, 0x2f, 0x8f, 0xc0, 0xb0, 0x73, 0xb2, 0xbc, 0x0e, + 0xa2, 0x85, 0x75, 0x59, 0xa6, 0x0b, 0x13, 0x11, 0xac, 0xad, 0x81, 0x6b, 0x5d, 0xdf, 0x6e, 0x88, 0x22, 0x49, 0x2a, 0x22, 0x3d, 0x1d, 0x42, 0x3c, 0x4b, 0xa1, 0xaa, 0x58, 0xf6, 0x94, 0xe9, 0xb7, + 0x6a, 0x45, 0xac, 0x54, 0x94, 0x40, 0x8e, 0xe9, 0x66, 0x0f, 0x93, 0xba, 0x62, 0x0e, 0xa1, 0x29, 0x50, 0x43, 0xcc, 0xb9, 0x7e, 0xb5, 0x3f, 0x5a, 0x52, 0x36, 0xcf, 0xa9, 0xdd, 0x66, 0x24, 0x97, + 0x89, 0xeb, 0xdf, 0x3d, 0xf0, 0xef, 0x08, 0x22, 0x2f, 0x1f, 0x17, 0x45, 0xea, 0xdb, 0xf9, 0xe4, 0x6a, 0xf2, 0x7b, 0x3f, 0xbe, 0xd0, 0x97, 0xd7, 0xae, 0x9a, 0xd4, 0xe7, 0xb7, 0x6e, 0x49, 0xeb, + 0x3d, 0xfd, 0xf8, 0xfa, 0xf1, 0xf4, 0xeb, 0xc7, 0x17, 0x99, 0xe7, 0xd7, 0x6f, 0x7b, 0xe8, 0xdb, 0x9e, 0xbf, 0xaf, 0xe4, 0xbf, 0x5c, 0x8e, 0xb9, 0xee, 0xe4, 0x5b, 0xc3, 0xaf, 0x22, 0xff, 0x47, + 0x05, 0xdc, 0xaf, 0xc0, 0xdf, 0x4f, 0xce, 0xef, 0xa9, 0xb1, 0x22, 0xee, 0x9e, 0x3c, 0xfb, 0x9a, 0x7e, 0xb2, 0xd3, 0x9c, 0x8c, 0x51, 0x01, 0x74, 0x4d, 0x38, 0xe7, 0x8c, 0xc1, 0xcb, 0x77, 0x56, + 0x1a, 0x7b, 0x8c, 0x6b, 0x87, 0xfd, 0x66, 0xd1, 0x30, 0x1e, 0x3b, 0x3d, 0x9c, 0x73, 0x07, 0xd3, 0x3a, 0x4e, 0xd8, 0x12, 0x8b, 0x40, 0x5d, 0xaa, 0x68, 0x66, 0x96, 0xa7, 0xbd, 0x0a, 0x2b, 0xfa, + 0xac, 0x6d, 0x02, 0x61, 0x20, 0x97, 0x26, 0xb9, 0x4d, 0x82, 0x86, 0x81, 0x00, 0xf8, 0x79, 0x45, 0x24, 0xae, 0x27, 0x99, 0x5d, 0xbe, 0x33, 0xdd, 0xaf, 0x87, 0xa8, 0xbe, 0x26, 0xda, 0xdc, 0xfd, + 0xec, 0xe4, 0xdb, 0x87, 0xef, 0xfe, 0xf7, 0xe5, 0xf3, 0xcf, 0xff, 0xff, 0xdf, 0x75, 0x2a, 0x3e, 0xb3, 0xf1, 0xfb, 0xc7, 0x02, 0x7e, 0xc2, 0x5f, 0x7f, 0x03, 0xfd, 0xfd, 0x5c, 0x7c, 0x98, 0xbb, + 0xd4, 0x60, 0x1b, 0xe1, 0x9d, 0xc7, 0xa8, 0x39, 0xa4, 0x96, 0xba, 0x4f, 0x41, 0x6e, 0x52, 0x16, 0x2e, 0xc1, 0x48, 0xab, 0x53, 0x2f, 0xf3, 0xdb, 0xa3, 0x4a, 0x7b, 0x30, 0xe2, 0xc2, 0x90, 0x92, + 0x21, 0x76, 0xe6, 0xcd, 0xad, 0x6a, 0x25, 0xcf, 0x4c, 0x64, 0xc3, 0x9e, 0xed, 0x3d, 0x04, 0x0f, 0xfc, 0x52, 0xab, 0xfc, 0x0c, 0xa8, 0xf2, 0xb9, 0x66, 0xa2, 0xde, 0xa9, 0x72, 0x78, 0x54, 0xd7, + 0x2b, 0xfd, 0x64, 0x87, 0xc1, 0xcc, 0x64, 0x47, 0x5e, 0xbe, 0x76, 0x67, 0xc7, 0xe9, 0x25, 0x47, 0xe9, 0xc3, 0x0f, 0x7f, 0xa0, 0xc2, 0xfc, 0x10, 0xcd, 0xfc, 0x5d, 0x60, 0xcf, 0x57, 0xaf, 0xed, + 0xbb, 0xdf, 0xe5, 0xc6, 0xa3, 0x33, 0x52, 0x19, 0xfb, 0xb6, 0x4b, 0xc5, 0xc3, 0x6b, 0xfe, 0xe6, 0x18, 0xfe, 0x2c, 0xfe, 0xfe, 0x77, 0x44, 0x17, 0xbd, 0x77, 0x2d, 0xf8, 0x07, 0xaf, 0xc1, 0x0b, + 0xc8, 0x97, 0x53, 0x7a, 0x19, 0x8c, 0xb9, 0xe8, 0xe0, 0x49, 0xa3, 0x2a, 0x54, 0x32, 0x10, 0xcc, 0x31, 0x31, 0xce, 0x9b, 0x83, 0xb9, 0xe8, 0x68, 0x48, 0xd9, 0xb4, 0xa2, 0xd0, 0x94, 0xf7, 0xcb, + 0xe0, 0x3f, 0x5e, 0xd1, 0xb9, 0x79, 0x1c, 0x1c, 0x85, 0x3d, 0xb5, 0xa0, 0x0b, 0x44, 0x70, 0x72, 0xfd, 0x7b, 0xa9, 0x5f, 0x36, 0xe2, 0xde, 0x5e, 0x0b, 0xa6, 0x0e, 0xc7, 0xb4, 0xb1, 0x32, 0xf4, + 0x90, 0x36, 0x72, 0x4a, 0xdf, 0x26, 0x71, 0x0b, 0x88, 0xfb, 0xa8, 0xd7, 0x0d, 0xbe, 0xee, 0x82, 0x92, 0xc8, 0xdc, 0xd6, 0xcc, 0x28, 0x4f, 0xd5, 0x05, 0x01, 0x02, 0x67, 0x49, 0x53, 0xe9, 0xa7, + 0x05, 0x7d, 0x66, 0x49, 0x04, 0xcc, 0x66, 0x7b, 0xa7, 0x59, 0xd7, 0x5c, 0xb2, 0x58, 0xda, 0x1e, 0x74, 0x5a, 0xd6, 0x85, 0x87, 0x0d, 0x95, 0x46, 0xcf, 0xff, 0x44, 0x9f, 0x1a, 0xd7, 0xe7, 0xa6, + 0xb7, 0xd3, 0xf4, 0x71, 0xd7, 0x63, 0xec, 0x29, 0x0d, 0xf4, 0x15, 0x26, 0x38, 0x79, 0x1b, 0x5d, 0x70, 0x36, 0x42, 0x07, 0x45, 0x4f, 0x1e, 0x17, 0x7b, 0x56, 0x7f, 0x9c, 0xca, 0x0c, 0x44, 0x62, + 0xc6, 0x7a, 0xae, 0x4e, 0xb5, 0x52, 0x52, 0xb7, 0x34, 0x7a, 0x4a, 0x0c, 0x3a, 0x5d, 0xee, 0xc5, 0xa8, 0xcd, 0x90, 0xc3, 0xd6, 0xed, 0x40, 0x0c, 0x56, 0x73, 0xc4, 0xcf, 0x14, 0xc8, 0xeb, 0x5d, + 0x65, 0x8f, 0xb5, 0x96, 0xb1, 0xf6, 0x93, 0x93, 0xd0, 0x85, 0xf8, 0xbc, 0xee, 0x1c, 0x2f, 0xdd, 0xad, 0x81, 0x85, 0x39, 0x77, 0x1b, 0xe2, 0x77, 0x3a, 0xf5, 0xff, 0xef, 0x15, 0x07, 0xf7, 0x79, + 0xd4, 0xaf, 0xff, 0x2b, 0xb0, 0xeb, 0x26, 0x0e, 0x7a, 0xd0, 0x4e, 0xba, 0x89, 0x5b, 0x64, 0x65, 0x9c, 0x3e, 0x34, 0xc8, 0xa2, 0x4f, 0xf5, 0x41, 0xbc, 0xfb, 0x0d, 0xe0, 0xe4, 0xd3, 0xe3, 0x04, + 0x1d, 0xd7, 0x0c, 0xd1, 0x77, 0x9c, 0x79, 0x93, 0x2e, 0x09, 0xef, 0x6c, 0x2c, 0xa6, 0x43, 0xbc, 0xf1, 0x2a, 0x68, 0x9a, 0x49, 0x26, 0xb9, 0xc9, 0xd9, 0x58, 0x66, 0x60, 0xa3, 0xa3, 0xd3, 0x35, + 0xef, 0x36, 0xdb, 0x06, 0xdc, 0xba, 0xc0, 0x0c, 0x5d, 0xcf, 0xa4, 0xdd, 0x7e, 0x1a, 0x67, 0xfa, 0xce, 0x00, 0xb2, 0xa8, 0xd3, 0xa3, 0x7c, 0x33, 0x64, 0x32, 0xc3, 0xfb, 0x27, 0xfd, 0x20, 0x2d, + 0x42, 0x2e, 0x9d, 0x9d, 0x43, 0x8f, 0xfe, 0xc4, 0xc9, 0x5f, 0x7d, 0x4e, 0x5f, 0xb9, 0x78, 0x72, 0x69, 0xda, 0xf7, 0x2f, 0xf2, 0x26, 0x26, 0xe5, 0x65, 0x15, 0xd7, 0x6a, 0x7f, 0x6f, 0xfa, 0xd5, + 0xd7, 0x10, 0x1a, 0xbb, 0x6e, 0x26, 0x6d, 0x15, 0xbf, 0x73, 0xe3, 0x07, 0x4a, 0xeb, 0x3b, 0x9a, 0x3c, 0xdf, 0x2f, 0x33, 0xbf, 0x7a, 0xe8, 0xaf, 0x78, 0x2e, 0x38, 0xf9, 0x16, 0xfc, 0xa5, 0x39, + 0xea, 0xeb, 0x78, 0x6c, 0x6c, 0xf2, 0x8a, 0xd4, 0x24, 0x95, 0x39, 0xa2, 0x6a, 0x61, 0x39, 0x6c, 0x24, 0x52, 0xc0, 0x16, 0x6c, 0x09, 0x22, 0x92, 0x29, 0x34, 0x1c, 0xc0, 0xca, 0x4e, 0x54, 0x1a, + 0x10, 0x90, 0x03, 0xd7, 0xc7, 0x89, 0x5c, 0x4a, 0x5b, 0x79, 0xaf, 0x1b, 0xbc, 0x5e, 0x6a, 0x76, 0xea, 0x17, 0x09, 0x40, 0x21, 0x74, 0x0d, 0xa9, 0x54, 0x2b, 0x6f, 0x65, 0x42, 0x8a, 0xc9, 0xe5, + 0x51, 0x0c, 0xa0, 0x16, 0xa8, 0x0a, 0xfc, 0x26, 0xf5, 0xff, 0xfd, 0xb7, 0x5e, 0x0a, 0xee, 0x3d, 0x3c, 0x8c, 0xff, 0x11, 0x1a, 0x2e, 0xa0, 0xc1, 0xc9, 0xf5, 0xef, 0xd8, 0xe4, 0x0a, 0x2f, 0x21, + 0xba, 0x64, 0x99, 0xc3, 0x74, 0x45, 0xd6, 0x3b, 0x23, 0x41, 0x7a, 0xda, 0x88, 0xc5, 0xcd, 0x6c, 0xc5, 0x66, 0x2a, 0x25, 0x2a, 0x94, 0x21, 0xa6, 0x4b, 0xdf, 0x35, 0x10, 0x6f, 0x39, 0x0c, 0x51, + 0xa2, 0xf2, 0xb3, 0x5e, 0x28, 0x30, 0xd6, 0x33, 0x12, 0x43, 0xac, 0x89, 0x93, 0xb0, 0x47, 0x0e, 0x09, 0xde, 0x77, 0xbb, 0xad, 0x5a, 0xb6, 0x4a, 0x22, 0x59, 0xa8, 0xb9, 0xae, 0xa2, 0x29, 0x7e, + 0x93, 0xf9, 0xf5, 0xfe, 0x1b, 0x2f, 0x47, 0xe7, 0x92, 0x7b, 0xfa, 0x3b, 0xbf, 0xf9, 0x07, 0x12, 0xc5, 0xfe, 0x33, 0xac, 0x7c, 0xf7, 0x8d, 0xe0, 0xe4, 0xdb, 0x8f, 0x27, 0xd8, 0x38, 0x1c, 0xda, + 0x16, 0x6d, 0x70, 0x66, 0x81, 0x67, 0x08, 0xb2, 0x38, 0xc0, 0x83, 0x35, 0xcc, 0x75, 0x81, 0xe9, 0xda, 0x06, 0x9c, 0x2d, 0x97, 0x8a, 0x0f, 0x32, 0x76, 0x39, 0x97, 0xb6, 0xf9, 0x39, 0x66, 0xa7, + 0x4a, 0x05, 0x1d, 0x64, 0xfe, 0x78, 0x5c, 0xe2, 0xd4, 0xa6, 0x99, 0x8b, 0xb3, 0xcc, 0x27, 0xb0, 0x08, 0xb0, 0x1b, 0x02, 0xa9, 0xe5, 0xc8, 0x39, 0x38, 0x98, 0x55, 0xad, 0x3d, 0x78, 0x8f, 0x0a, + 0xdb, 0xf5, 0x08, 0x12, 0xbe, 0xf3, 0xdb, 0x2f, 0x24, 0x39, 0xbd, 0x24, 0x0b, 0xdf, 0x25, 0xc9, 0xf7, 0x6e, 0x9d, 0x8f, 0xe4, 0xda, 0x3f, 0x57, 0x77, 0xae, 0x20, 0x5f, 0xb8, 0xdf, 0x65, 0x30, + 0xb6, 0x81, 0x5c, 0x9e, 0xfb, 0x14, 0xb8, 0x8c, 0x15, 0x30, 0x1a, 0x96, 0x91, 0x89, 0x97, 0x1e, 0x9b, 0x3b, 0x4c, 0x33, 0x10, 0x6c, 0x22, 0x6b, 0x42, 0x65, 0x42, 0x90, 0x0c, 0x0e, 0x9d, 0xac, + 0x66, 0xd3, 0x52, 0x5a, 0x1c, 0x52, 0xfc, 0xdc, 0x72, 0x15, 0x97, 0x1b, 0x39, 0xb8, 0x6b, 0xb4, 0xcd, 0x26, 0xd8, 0x34, 0x74, 0x60, 0x51, 0x20, 0xbc, 0x6d, 0xfc, 0xe8, 0x50, 0x0f, 0x3a, 0x75, + 0x74, 0xb5, 0x38, 0x86, 0xc6, 0xf4, 0xc5, 0xbf, 0x53, 0x2f, 0xf1, 0x3e, 0x31, 0x3e, 0x73, 0x65, 0x7e, 0x05, 0x7e, 0x41, 0xcb, 0xe7, 0xa9, 0xb1, 0x2d, 0x42, 0x23, 0x32, 0x55, 0xc8, 0xc6, 0x76, + 0x2d, 0x33, 0xdf, 0xa2, 0xdd, 0x46, 0xd1, 0xc2, 0xd8, 0x49, 0x80, 0x46, 0x62, 0xf9, 0xe5, 0x14, 0x04, 0x52, 0x08, 0xa7, 0x5b, 0x44, 0x76, 0xab, 0xb8, 0x03, 0xb9, 0xcc, 0x6f, 0x20, 0xdf, 0x4e, + 0x30, 0xed, 0xb4, 0xe7, 0x31, 0xb8, 0x96, 0xa8, 0x53, 0xce, 0xb3, 0xb1, 0x52, 0xcf, 0x13, 0x98, 0x3a, 0x42, 0x5e, 0x35, 0x78, 0x7b, 0xcf, 0xa7, 0xf9, 0xe6, 0xf4, 0xd9, 0x24, 0x73, 0xff, 0x54, + 0x5d, 0xaa, 0x41, 0x4e, 0x1a, 0xbb, 0x0a, 0xfd, 0x66, 0x52, 0x47, 0xaf, 0xd1, 0x38, 0xd3, 0xc7, 0x6c, 0xfe, 0xbd, 0x93, 0x44, 0x5a, 0x84, 0xe1, 0xf7, 0x75, 0xc7, 0x9e, 0x39, 0x5d, 0x9f, 0x81, + 0x5f, 0x10, 0xfa, 0x79, 0x6a, 0x6c, 0x3e, 0x0f, 0xc2, 0x24, 0x5b, 0xcd, 0x3a, 0x6b, 0x72, 0x17, 0xf9, 0x52, 0xc7, 0x39, 0x4c, 0x9d, 0x2e, 0x54, 0x53, 0xd2, 0x0f, 0x15, 0xa0, 0x26, 0x72, 0x23, + 0xe5, 0xd5, 0x5a, 0x46, 0xd1, 0x00, 0xd8, 0x2d, 0xf7, 0xeb, 0xc1, 0x1f, 0x94, 0xd2, 0x72, 0x8f, 0xbb, 0x90, 0x48, 0x6c, 0x74, 0x8d, 0x79, 0x8c, 0x91, 0x0d, 0x43, 0x78, 0xd2, 0x00, 0x1b, 0x42, + 0xa8, 0x64, 0x7b, 0x9e, 0xca, 0xb3, 0x18, 0x5d, 0xb5, 0xb7, 0xfd, 0x12, 0xae, 0xf7, 0xea, 0x7d, 0x63, 0x1e, 0xfc, 0x4c, 0xda, 0x97, 0x9d, 0x74, 0xaf, 0xa2, 0xc5, 0x15, 0xc0, 0xcf, 0x0b, 0xad, + 0xb7, 0x2d, 0x7c, 0x28, 0x5d, 0x89, 0xea, 0xd7, 0x8d, 0x79, 0x66, 0x84, 0xee, 0x18, 0x68, 0x7e, 0x44, 0x09, 0x83, 0x35, 0x3f, 0x49, 0xa8, 0xaa, 0xf5, 0x06, 0xcc, 0x6b, 0x00, 0x36, 0xb3, 0xd9, + 0x61, 0x86, 0xf3, 0xa5, 0xc6, 0x99, 0xd1, 0x32, 0x92, 0x97, 0x43, 0x42, 0x19, 0xad, 0xa0, 0x13, 0x82, 0xc9, 0x9e, 0x72, 0xdb, 0x8f, 0xa6, 0x91, 0x2b, 0x9d, 0x92, 0x1e, 0x56, 0xda, 0xd5, 0xc0, + 0xc8, 0x63, 0xf9, 0xd1, 0x97, 0xf0, 0xbb, 0x9b, 0x0e, 0x35, 0x57, 0x7e, 0xe5, 0x46, 0x7e, 0x66, 0x4f, 0x9a, 0xca, 0x7e, 0xc1, 0xcf, 0x6f, 0x9f, 0xd6, 0x27, 0x39, 0xe4, 0x7e, 0x49, 0xbb, 0xab, + 0xc4, 0xf1, 0x49, 0xc9, 0x7c, 0x77, 0x25, 0xfc, 0xfa, 0x17, 0x76, 0x89, 0x89, 0xbc, 0x7f, 0x4c, 0x3f, 0x89, 0x35, 0xf7, 0x4f, 0xe8, 0x53, 0xfc, 0xef, 0x37, 0xdc, 0xd7, 0x7d, 0x7a, 0x7d, 0xba, + 0x94, 0x9d, 0x18, 0x71, 0x2e, 0xf7, 0x67, 0x48, 0x38, 0x4f, 0x91, 0xe8, 0x3c, 0x27, 0x66, 0x30, 0x19, 0x1d, 0xc4, 0x79, 0x18, 0x9a, 0xe9, 0x3c, 0x0e, 0x8e, 0x7b, 0xab, 0x31, 0xed, 0x6d, 0x58, + 0xb4, 0xab, 0xa2, 0x02, 0xf6, 0xa2, 0x27, 0xe7, 0x4a, 0x3f, 0x17, 0x60, 0xb4, 0x0b, 0xe7, 0xfb, 0x7e, 0xb7, 0x69, 0x4b, 0x42, 0x2d, 0x7c, 0xbf, 0x58, 0x8b, 0x75, 0x85, 0x1d, 0x82, 0x69, 0x84, + 0x7b, 0xd2, 0x1e, 0x86, 0x97, 0xf0, 0x54, 0xd4, 0x47, 0x6c, 0xd7, 0x6f, 0x09, 0xf0, 0x31, 0x69, 0xe7, 0xfd, 0x77, 0x6d, 0xb3, 0xd0, 0xa7, 0x82, 0xe1, 0xde, 0x80, 0xbe, 0x60, 0xeb, 0x75, 0x78, + 0x71, 0xcc, 0x8f, 0x50, 0xc6, 0x64, 0x0c, 0xf5, 0xe5, 0x40, 0xa2, 0x97, 0x6d, 0x79, 0x08, 0x5b, 0x5e, 0xef, 0xdd, 0xca, 0xc5, 0x8e, 0x2b, 0xea, 0x30, 0x90, 0x56, 0xdc, 0x4a, 0x7a, 0x9c, 0xd8, + 0x73, 0xed, 0x64, 0x10, 0x1a, 0xdf, 0x40, 0x26, 0xc8, 0x6d, 0x04, 0xa2, 0x83, 0x6c, 0x9b, 0xac, 0x4c, 0x12, 0xc6, 0xcf, 0xfb, 0xc4, 0x22, 0xaa, 0x95, 0x47, 0x4f, 0x0d, 0x4f, 0x74, 0xcb, 0xdd, + 0x42, 0x13, 0xc4, 0x23, 0xb0, 0xed, 0xf6, 0xe1, 0x0f, 0xf6, 0xb0, 0xfb, 0xd8, 0xbb, 0xe9, 0x31, 0x7d, 0xa7, 0xe8, 0xee, 0xd7, 0xa2, 0xab, 0x0f, 0x55, 0x39, 0xbb, 0x72, 0xa3, 0xef, 0x94, 0xf7, + 0x27, 0xb8, 0xc6, 0x0b, 0xc4, 0x17, 0x0c, 0xbf, 0xfc, 0x1d, 0xeb, 0x3b, 0x34, 0x42, 0x80, 0xda, 0x9e, 0x66, 0x21, 0x08, 0x95, 0x28, 0xd2, 0xf8, 0x82, 0xc7, 0x89, 0xb2, 0x26, 0xe7, 0x3b, 0x43, + 0x60, 0xa1, 0x13, 0xca, 0x06, 0x7c, 0xbe, 0xd0, 0x82, 0xd8, 0x2d, 0x86, 0x9a, 0x0e, 0xeb, 0xee, 0x88, 0x18, 0x7e, 0x2e, 0xaf, 0x8e, 0xa0, 0x68, 0x96, 0xc3, 0xa0, 0x80, 0x1d, 0x39, 0x54, 0x52, + 0xbf, 0xca, 0x71, 0xb6, 0x46, 0xa9, 0x1d, 0x8d, 0xad, 0x96, 0xec, 0x69, 0x11, 0x1c, 0x6f, 0x84, 0x41, 0xbb, 0x0a, 0xbf, 0x2f, 0x75, 0xf2, 0xd4, 0x3d, 0xf1, 0x0a, 0xf4, 0xb2, 0xe4, 0xf0, 0xad, + 0xb0, 0xc9, 0xa8, 0x7b, 0x81, 0x04, 0xa8, 0xfd, 0xd1, 0x77, 0x9c, 0xc5, 0x50, 0x1a, 0x94, 0xb4, 0x05, 0xf6, 0x36, 0x2e, 0x21, 0x94, 0x5d, 0x2f, 0x8b, 0xd0, 0xdf, 0x8a, 0x83, 0xcb, 0x35, 0xf4, + 0x72, 0xe3, 0x95, 0x22, 0xcf, 0xf7, 0x74, 0x08, 0x43, 0x01, 0x34, 0xb5, 0xd5, 0xc5, 0x8e, 0x71, 0xdc, 0xf9, 0x91, 0x0b, 0x40, 0xd9, 0x38, 0xc1, 0xf3, 0x84, 0xb6, 0x80, 0x23, 0x02, 0x3a, 0x73, + 0x26, 0x44, 0xd9, 0xae, 0xad, 0x04, 0xf4, 0xa6, 0x22, 0x84, 0x5d, 0xdb, 0x8f, 0x6a, 0x13, 0x23, 0x97, 0x1a, 0x88, 0x7f, 0xbc, 0xe2, 0xda, 0x2e, 0x5f, 0x56, 0x5b, 0xdb, 0xe5, 0x65, 0xa5, 0xf8, + 0xcf, 0x2b, 0x65, 0x54, 0x7e, 0x1f, 0xb2, 0x2a, 0x1d, 0x0b, 0xf5, 0x14, 0x2a, 0x90, 0xad, 0x4f, 0x96, 0x65, 0x57, 0xa2, 0xb5, 0xbf, 0xe3, 0x0d, 0x75, 0x2b, 0x62, 0x98, 0xeb, 0xa9, 0xb5, 0x46, + 0x2d, 0x82, 0xcd, 0x5c, 0xd7, 0xad, 0xb5, 0xc4, 0xed, 0x77, 0xb3, 0x3a, 0xde, 0xdb, 0x5b, 0x79, 0x2f, 0xc2, 0x56, 0x9e, 0x03, 0xd9, 0xd1, 0x82, 0xa5, 0x60, 0x67, 0xa1, 0x03, 0xca, 0xee, 0xe7, + 0x83, 0x5a, 0x12, 0xd1, 0x76, 0x8c, 0xaf, 0xdc, 0xae, 0xfb, 0xdc, 0x3d, 0xc4, 0x8f, 0x83, 0x6a, 0x9f, 0x69, 0x16, 0xfa, 0x06, 0xf4, 0x82, 0x84, 0xeb, 0x70, 0x02, 0xfd, 0xdc, 0x34, 0xf4, 0x05, + 0x11, 0x92, 0x1f, 0x53, 0x12, 0x8f, 0x35, 0xdb, 0x08, 0x32, 0x8f, 0x3a, 0xca, 0x9d, 0x23, 0x83, 0xa0, 0x3c, 0x11, 0xcc, 0x4e, 0xbb, 0xb0, 0x73, 0xac, 0x95, 0xad, 0x6e, 0xec, 0xed, 0x01, 0x70, + 0xea, 0xe8, 0x90, 0x40, 0xea, 0xd4, 0x0d, 0x78, 0x37, 0x34, 0xed, 0x43, 0xe5, 0x33, 0x49, 0xc5, 0x9f, 0xec, 0xc6, 0x10, 0x9c, 0x01, 0x58, 0x16, 0x4b, 0xcf, 0x5c, 0x9f, 0x2b, 0x21, 0xce, 0x10, + 0x31, 0xd9, 0x8f, 0x13, 0x3e, 0x3f, 0xe7, 0x93, 0xff, 0x83, 0xf4, 0xfe, 0x01, 0xf0, 0x0b, 0x42, 0x3e, 0x3c, 0x8e, 0xa5, 0xfe, 0xc3, 0x46, 0x4a, 0xd8, 0x23, 0x1d, 0x11, 0xe5, 0x19, 0x32, 0xf6, + 0x9b, 0x25, 0x80, 0x29, 0xce, 0x50, 0xc4, 0x5b, 0x30, 0xd7, 0x0e, 0x3c, 0xbd, 0xdf, 0xb4, 0x1e, 0xd2, 0x76, 0xf9, 0xea, 0xd8, 0xb2, 0x30, 0x78, 0x9e, 0xda, 0xc4, 0x5c, 0xb1, 0xc4, 0x95, 0x06, + 0xd1, 0xee, 0x70, 0x14, 0x20, 0x25, 0xc7, 0x89, 0xc2, 0x04, 0x35, 0x4d, 0x81, 0xd7, 0x8e, 0x2e, 0xd8, 0x89, 0x55, 0x96, 0xe8, 0x92, 0x6a, 0x6e, 0xe9, 0xe0, 0x91, 0xf5, 0xf8, 0x11, 0x2e, 0xfe, + 0xdc, 0xd2, 0x7e, 0xff, 0x2b, 0x5e, 0xb0, 0x72, 0xf7, 0x83, 0xb1, 0x19, 0x71, 0x2a, 0x3d, 0xcd, 0x8c, 0xd5, 0xbe, 0x5a, 0x7a, 0xb0, 0x66, 0x2b, 0x49, 0x70, 0xd6, 0xcd, 0x30, 0x72, 0x8e, 0x0a, + 0x18, 0x99, 0x71, 0x21, 0x64, 0xeb, 0x55, 0x27, 0xaf, 0x7a, 0xb6, 0x35, 0xb7, 0x8d, 0x61, 0xf8, 0xf9, 0x62, 0x23, 0x26, 0x09, 0x16, 0xa9, 0x6a, 0x03, 0xcf, 0x02, 0xf8, 0x5c, 0xb7, 0x86, 0x6a, + 0x54, 0xcd, 0xb9, 0xda, 0xcd, 0xa6, 0x52, 0x83, 0xf9, 0x3a, 0xee, 0x4a, 0x0d, 0xc3, 0x7a, 0xb7, 0xf2, 0x63, 0xd7, 0xc5, 0x8f, 0xfb, 0x20, 0x3e, 0x53, 0x11, 0xf0, 0x02, 0xf1, 0xb2, 0xfa, 0x2e, + 0x2e, 0x26, 0xe4, 0xb8, 0x2a, 0x80, 0x1a, 0x9d, 0x8a, 0x66, 0x27, 0xb5, 0x27, 0xae, 0x5f, 0x0b, 0xa8, 0x1c, 0x30, 0xce, 0x74, 0x2f, 0x30, 0x86, 0x95, 0x19, 0x03, 0x12, 0xec, 0x66, 0x61, 0x87, + 0xa0, 0x1e, 0x3e, 0x58, 0x0b, 0x2f, 0xf5, 0xc1, 0x23, 0x1a, 0xca, 0x49, 0x76, 0x66, 0x6c, 0xbf, 0x9d, 0x41, 0xa5, 0x09, 0xb1, 0x43, 0x3d, 0x95, 0xf7, 0xa2, 0x1a, 0x06, 0xc7, 0xe3, 0xdc, 0x3a, + 0x54, 0xbd, 0x0f, 0x53, 0x5c, 0xca, 0x6a, 0xe1, 0x69, 0x84, 0x50, 0xf2, 0x7a, 0x13, 0xde, 0xcb, 0xcd, 0xf8, 0x90, 0xfd, 0xf5, 0x35, 0x6b, 0xcb, 0xae, 0x9b, 0xe3, 0xeb, 0x7f, 0xe1, 0x7f, 0x3f, + 0xe8, 0xdb, 0xeb, 0xd8, 0xa9, 0x9d, 0xbb, 0xbe, 0x37, 0xf9, 0x4e, 0xa4, 0x79, 0xce, 0x54, 0xfe, 0x19, 0x34, 0x38, 0xf9, 0x32, 0x31, 0xc6, 0x74, 0x7e, 0xb1, 0x9b, 0x16, 0xaa, 0xaf, 0x4b, 0x90, + 0x26, 0xee, 0x70, 0x22, 0xda, 0xc0, 0x74, 0xe6, 0x18, 0xb5, 0x80, 0xf5, 0xf6, 0x51, 0x27, 0x9a, 0x24, 0xe6, 0x53, 0xe7, 0xbc, 0x65, 0x2d, 0xa9, 0xe4, 0x21, 0x61, 0x4f, 0x01, 0x33, 0xdf, 0xc0, + 0x9c, 0x2d, 0x6d, 0x1b, 0x10, 0x9d, 0x9f, 0x1b, 0xa8, 0x39, 0x23, 0x62, 0x55, 0x6e, 0xcb, 0xfd, 0x49, 0xb1, 0xe5, 0xd3, 0x32, 0x5d, 0xaa, 0xf3, 0x55, 0x64, 0xea, 0x53, 0x79, 0x4c, 0x67, 0x1d, + 0xc7, 0xae, 0x7d, 0x1c, 0x7b, 0x1c, 0x8f, 0x03, 0xff, 0x3d, 0x7d, 0xe2, 0xe0, 0xbd, 0x43, 0xbd, 0x20, 0xe4, 0x75, 0x3c, 0xb9, 0xc0, 0xfa, 0x19, 0x17, 0xb4, 0x50, 0xda, 0x66, 0xca, 0xe7, 0x64, + 0x83, 0xa9, 0x3b, 0x47, 0xe2, 0x67, 0x3d, 0xe0, 0x4c, 0x01, 0x41, 0x08, 0xbb, 0x2d, 0xd6, 0x55, 0x35, 0x4b, 0x76, 0x4e, 0x57, 0x39, 0xb1, 0xb2, 0x2a, 0x6b, 0x22, 0x10, 0x58, 0xed, 0x90, 0x1c, + 0xd8, 0xaa, 0xc7, 0x93, 0x18, 0xaa, 0xf4, 0x55, 0x32, 0x83, 0x0e, 0x83, 0xb3, 0xf1, 0xe5, 0xf5, 0x69, 0x38, 0x1f, 0xc9, 0xb8, 0x2f, 0x0b, 0x0c, 0x3e, 0xfa, 0xfb, 0x1b, 0x6a, 0x73, 0xe2, 0xf0, + 0xea, 0xd3, 0xfe, 0xfb, 0xe1, 0xda, 0xa9, 0xa7, 0xb4, 0x82, 0x8f, 0x80, 0x5f, 0x96, 0xff, 0xe1, 0x71, 0x42, 0x8d, 0xd3, 0x0b, 0x4a, 0x3e, 0xc3, 0xd6, 0xb5, 0xb8, 0xc2, 0xd3, 0x21, 0xdc, 0x70, + 0xbb, 0xc0, 0xe2, 0x13, 0xb1, 0x90, 0xc8, 0xda, 0x2b, 0xb6, 0x91, 0x34, 0x48, 0x3c, 0x26, 0xae, 0x33, 0x13, 0x9f, 0xae, 0x42, 0x02, 0x72, 0xca, 0xf3, 0x4c, 0x68, 0xa7, 0xb1, 0xc4, 0x6f, 0x56, + 0x7d, 0xb0, 0xc0, 0xa5, 0xbe, 0x33, 0x4f, 0x44, 0x43, 0x2e, 0xca, 0x00, 0x9d, 0x6e, 0xdb, 0x41, 0xef, 0x8f, 0xb9, 0x52, 0x27, 0xe4, 0x2e, 0xbe, 0x29, 0x47, 0xe7, 0xc4, 0xb9, 0x5d, 0xf5, 0x13, + 0xff, 0xdc, 0xf8, 0xf9, 0xcb, 0x92, 0x1f, 0x2b, 0x47, 0xcf, 0x28, 0xaf, 0x37, 0xd0, 0x2f, 0xb8, 0xf8, 0x32, 0x37, 0xb6, 0x3b, 0x5d, 0xc2, 0xba, 0xcd, 0x0a, 0x5c, 0xee, 0x14, 0xc7, 0x2a, 0x56, + 0xfd, 0xa1, 0xf0, 0x79, 0x27, 0x32, 0x4a, 0x29, 0xdd, 0x30, 0x47, 0x6e, 0xe3, 0x9e, 0x8c, 0x95, 0xb0, 0x2a, 0x42, 0x0c, 0x99, 0x4f, 0x79, 0x56, 0xd6, 0x4f, 0x8a, 0xa6, 0x7a, 0xc9, 0x8c, 0xf7, + 0xe2, 0x28, 0x49, 0x20, 0x36, 0xcd, 0x23, 0x5f, 0x21, 0x9c, 0xd4, 0xd1, 0x70, 0x8f, 0x97, 0xec, 0x60, 0x43, 0xc7, 0x2a, 0x59, 0x14, 0xca, 0xd7, 0xec, 0x8d, 0xfb, 0xe4, 0xf1, 0x3b, 0x13, 0xe6, + 0x1f, 0xe4, 0x19, 0xaf, 0x40, 0xaf, 0x18, 0xb9, 0x0c, 0xc7, 0xf2, 0x89, 0x9d, 0x24, 0x86, 0x9a, 0x78, 0x4a, 0x68, 0x5b, 0xe7, 0xa6, 0x24, 0xa4, 0x1a, 0x39, 0xba, 0xb6, 0xdd, 0x5d, 0x98, 0xb4, + 0x55, 0xe5, 0x88, 0x99, 0x4f, 0x58, 0xd6, 0xc6, 0xe4, 0x54, 0x75, 0x47, 0x64, 0x59, 0x63, 0xe2, 0x8a, 0xb2, 0x8d, 0xa0, 0x79, 0x88, 0x96, 0xa7, 0xa5, 0x9b, 0x37, 0x0a, 0x41, 0xb0, 0xf3, 0x4a, + 0x80, 0xd7, 0xd0, 0xe6, 0x7c, 0x70, 0xfc, 0x26, 0x71, 0x0b, 0x63, 0xd8, 0x9d, 0x84, 0x1b, 0x39, 0xdd, 0xa9, 0x6c, 0xd7, 0x9f, 0xf8, 0xe7, 0xd2, 0xce, 0xeb, 0xef, 0x62, 0x24, 0xe0, 0xbf, 0xe1, + 0x27, 0xe8, 0xe3, 0x33, 0xf0, 0x17, 0x24, 0x7c, 0x9e, 0xb9, 0xda, 0x11, 0x47, 0x90, 0x49, 0x3c, 0x6b, 0x65, 0x9e, 0x5d, 0x84, 0x15, 0x6f, 0x10, 0x3c, 0xd2, 0xcd, 0x97, 0xe0, 0xf4, 0x5c, 0x0e, + 0x10, 0x31, 0xa8, 0x3c, 0x03, 0x41, 0x5a, 0xd9, 0x86, 0xc7, 0x28, 0x33, 0x9b, 0x5d, 0x26, 0x4a, 0xf8, 0x14, 0x26, 0xb3, 0x59, 0xbb, 0x15, 0x0b, 0xc9, 0x5c, 0xa4, 0xde, 0x9c, 0x49, 0xa1, 0x10, + 0x26, 0x89, 0x36, 0x28, 0x06, 0xcf, 0xe6, 0xc3, 0xbd, 0xe0, 0x9a, 0x0b, 0x07, 0x87, 0x8f, 0xdc, 0xa3, 0x00, 0xd0, 0x1f, 0x2e, 0xaf, 0x9b, 0x1b, 0xe6, 0xce, 0x2d, 0xe6, 0x16, 0xb9, 0x6b, 0x37, + 0x6f, 0x71, 0x14, 0xd0, 0xa7, 0x50, 0x87, 0x5b, 0xf4, 0x3f, 0x3a, 0x72, 0xe8, 0x73, 0x47, 0xee, 0x02, 0xf2, 0x0d, 0xd7, 0xf5, 0xc5, 0x12, 0x39, 0xe2, 0xb8, 0x39, 0x64, 0x9b, 0x01, 0x6b, 0x78, + 0x3b, 0x88, 0xe8, 0x9e, 0x55, 0x87, 0x2e, 0xca, 0xf0, 0x70, 0x39, 0xc0, 0x7d, 0xa0, 0x39, 0x4c, 0x83, 0x9b, 0x5a, 0xea, 0xce, 0x05, 0xba, 0xab, 0xb3, 0xe3, 0xcc, 0xb2, 0x16, 0x27, 0x0c, 0x1f, + 0x70, 0x04, 0x4f, 0x77, 0x09, 0x95, 0xc0, 0xfd, 0x5c, 0xde, 0xa3, 0x28, 0x3f, 0xe5, 0x81, 0x94, 0x51, 0x4a, 0x4b, 0x94, 0xe1, 0x03, 0x99, 0x02, 0x04, 0xc9, 0xdb, 0xd0, 0x73, 0x18, 0x0e, 0xe2, + 0x34, 0x7d, 0x4f, 0x7d, 0xb9, 0xa6, 0x73, 0x3c, 0x42, 0xdf, 0x77, 0x25, 0x46, 0xf1, 0xa7, 0x52, 0xf2, 0xdf, 0x8b, 0x8b, 0xbe, 0x96, 0x15, 0xc5, 0xc7, 0xa5, 0xe2, 0x2f, 0xb4, 0x78, 0x56, 0x6e, + 0xce, 0xcd, 0x29, 0xb6, 0x2c, 0x7e, 0x6e, 0x39, 0xae, 0xa3, 0x2d, 0x5d, 0x2b, 0x99, 0x6f, 0x77, 0xcb, 0x59, 0x4e, 0xf5, 0x47, 0xb0, 0x64, 0x17, 0x07, 0x2d, 0xa5, 0xa6, 0x20, 0x7d, 0x1e, 0x58, + 0x38, 0xb7, 0x19, 0xb7, 0xd9, 0x10, 0xa6, 0x84, 0x93, 0x55, 0x2c, 0x82, 0xe1, 0x5a, 0x65, 0x4d, 0xa2, 0xf6, 0x2a, 0xd1, 0xe9, 0xc9, 0xa8, 0x08, 0x68, 0xd6, 0x6c, 0xdb, 0xa3, 0x34, 0xc2, 0xbe, + 0xf3, 0xf1, 0x52, 0xff, 0xf5, 0x2f, 0xf8, 0x6b, 0x3b, 0xe4, 0xd8, 0xf7, 0x7d, 0x62, 0x8a, 0xbd, 0x7e, 0x88, 0x3c, 0xc4, 0xe3, 0x6b, 0x03, 0xa9, 0x7f, 0xce, 0xfe, 0x73, 0x81, 0xf8, 0x82, 0xc5, + 0x97, 0xbf, 0x63, 0x2d, 0x3f, 0xe0, 0x26, 0x20, 0xb4, 0x7e, 0xd0, 0xce, 0xb8, 0x8a, 0xf6, 0xdb, 0x95, 0xe4, 0x48, 0xf4, 0x8e, 0xa0, 0xa6, 0x78, 0x45, 0xba, 0x15, 0x02, 0x48, 0x09, 0x49, 0xcf, + 0xa6, 0x5e, 0x43, 0x9e, 0x54, 0x19, 0x65, 0x14, 0xba, 0xf0, 0x8d, 0x29, 0xb9, 0x29, 0xf8, 0x7e, 0xa6, 0x93, 0x32, 0x39, 0x70, 0x87, 0x8d, 0xa1, 0x36, 0x89, 0xa6, 0xc6, 0x78, 0x30, 0x48, 0xf8, + 0x02, 0x2a, 0x19, 0xcf, 0x35, 0x9d, 0xf9, 0xcd, 0x65, 0xf8, 0x31, 0x5c, 0xe5, 0x9f, 0xe3, 0xf4, 0xef, 0x50, 0xc1, 0xc9, 0xef, 0xf1, 0x58, 0x5e, 0x4f, 0x48, 0xc0, 0xc2, 0x99, 0xc5, 0x51, 0xc5, + 0x4c, 0xf7, 0x9c, 0xb3, 0x30, 0xfd, 0xda, 0x6d, 0x4e, 0x99, 0x26, 0xd8, 0x3e, 0x5e, 0x49, 0xf1, 0x72, 0xc8, 0x06, 0x38, 0x76, 0x2b, 0x7f, 0xbf, 0x02, 0x20, 0x9b, 0x26, 0xd6, 0xab, 0xa0, 0x3d, + 0x46, 0xf3, 0xba, 0x40, 0x34, 0x2a, 0x77, 0x4b, 0x77, 0xd1, 0x0c, 0xa2, 0xd2, 0x0c, 0x46, 0x80, 0x28, 0x1c, 0xd7, 0xfa, 0xfb, 0x15, 0xa7, 0x99, 0xf5, 0xb1, 0x1a, 0x71, 0x7a, 0x46, 0x04, 0xd5, + 0x3c, 0xaa, 0x45, 0x78, 0xf7, 0x1c, 0xb9, 0x51, 0x71, 0x88, 0x3d, 0xfb, 0x3b, 0x47, 0xfc, 0x9f, 0x53, 0xe4, 0x1b, 0xd0, 0x17, 0xc4, 0xbe, 0x0e, 0x2f, 0x7e, 0xf7, 0x11, 0x54, 0xc9, 0x56, 0x68, + 0x1d, 0x08, 0x5b, 0x19, 0x2f, 0x34, 0x37, 0x09, 0x90, 0x55, 0xa6, 0x67, 0x8b, 0x55, 0xe0, 0xef, 0xc4, 0xce, 0x60, 0x3c, 0x3f, 0x3c, 0x33, 0x50, 0xbc, 0x53, 0xa6, 0xbe, 0x83, 0xec, 0x60, 0xa8, + 0x5d, 0xac, 0xf4, 0x19, 0xad, 0x92, 0x12, 0xd3, 0x5b, 0xde, 0x8e, 0xee, 0x77, 0x0e, 0x79, 0x36, 0x36, 0x03, 0xca, 0x25, 0x89, 0x16, 0x26, 0xd4, 0x61, 0xbd, 0xaf, 0x2d, 0xed, 0x38, 0xc7, 0x0f, + 0x3f, 0x15, 0xf8, 0x7b, 0xa0, 0xf3, 0xfc, 0xb6, 0xb2, 0xfe, 0xfa, 0xf7, 0x4d, 0x9f, 0xb6, 0xf7, 0x7b, 0xe0, 0xe5, 0xb3, 0x2f, 0x96, 0xef, 0xa0, 0xfe, 0xdd, 0xbb, 0xeb, 0xd2, 0xe8, 0xe1, 0xd3, + 0xa7, 0x61, 0x5a, 0x38, 0x93, 0xd2, 0xae, 0x5e, 0x2b, 0x15, 0xfc, 0x7b, 0xfa, 0x15, 0xf4, 0x25, 0x2e, 0xf4, 0x22, 0x8c, 0xbd, 0xd9, 0x30, 0xff, 0x7d, 0xd3, 0x2a, 0x3e, 0xae, 0x27, 0x6f, 0x79, + 0xed, 0xff, 0xc6, 0xbe, 0x46, 0x4d, 0xdd, 0x1a, 0x41, 0xff, 0x7d, 0x63, 0x04, 0xfd, 0xd0, 0x98, 0xeb, 0xe5, 0xd3, 0x87, 0xdd, 0x92, 0xdd, 0xb4, 0x68, 0xbd, 0xf7, 0xe5, 0xdc, 0x3b, 0x23, 0xc4, + 0x73, 0xd4, 0xf7, 0x1b, 0xee, 0xcb, 0x31, 0xf9, 0xfd, 0x34, 0x21, 0xc6, 0x51, 0xe0, 0x3e, 0x96, 0x8e, 0xfb, 0x7a, 0x73, 0x10, 0xad, 0x4c, 0x14, 0x2d, 0xfc, 0x6c, 0xa3, 0x87, 0xe1, 0x0c, 0x8a, + 0x34, 0x40, 0x02, 0x3b, 0xc0, 0x9d, 0xfa, 0xdc, 0x41, 0x6d, 0xac, 0xa5, 0x1b, 0x1f, 0x00, 0xf9, 0x8c, 0x9c, 0x67, 0x85, 0x93, 0x0d, 0xae, 0xed, 0x9e, 0xe0, 0xb9, 0xc4, 0xf5, 0x41, 0x24, 0xb1, + 0xb6, 0x22, 0x1c, 0x96, 0x1d, 0xa9, 0x9d, 0x0d, 0x49, 0x5a, 0x0f, 0x3b, 0x9c, 0x2a, 0x8c, 0xc5, 0x71, 0x04, 0x05, 0xfe, 0x07, 0x11, 0x1a, 0x17, 0x27, 0xcb, 0x97, 0x90, 0xdf, 0xcf, 0x96, 0xe9, + 0xef, 0xdb, 0xba, 0xbd, 0x66, 0x18, 0x5c, 0x3e, 0xfb, 0x92, 0x85, 0xff, 0x16, 0xb6, 0xfd, 0xaf, 0x6b, 0x6c, 0xfa, 0xfd, 0xad, 0x2c, 0x32, 0x27, 0xce, 0xfd, 0x1f, 0xf2, 0xc0, 0x5f, 0x7e, 0xd4, + 0x9f, 0x67, 0x2e, 0x7f, 0x81, 0xfd, 0xb2, 0xa5, 0x9f, 0x67, 0x2e, 0x8c, 0x75, 0x44, 0x1b, 0xdb, 0x85, 0xb2, 0xc1, 0xc4, 0x6d, 0xd0, 0xae, 0x7c, 0x3e, 0x20, 0x5c, 0xc6, 0x61, 0xc4, 0xd5, 0xc2, + 0x88, 0x04, 0x95, 0x3d, 0x02, 0xc8, 0x81, 0xa6, 0x2b, 0x26, 0xcd, 0xb6, 0x4c, 0xe7, 0x76, 0x8b, 0xf9, 0x94, 0x61, 0x60, 0xde, 0x12, 0x8c, 0x46, 0x5d, 0xd0, 0x2a, 0x1b, 0x79, 0xe9, 0x40, 0x0d, + 0x92, 0x79, 0x3a, 0x47, 0x64, 0xca, 0x7a, 0x79, 0x97, 0x89, 0x92, 0x0f, 0x02, 0x53, 0xd7, 0x2b, 0xe6, 0xde, 0x73, 0xbe, 0x04, 0xcf, 0x4f, 0xed, 0xfe, 0x23, 0xba, 0xae, 0xa9, 0x7e, 0x8f, 0x08, + 0xa5, 0xc8, 0x32, 0x3b, 0xff, 0xa6, 0xd4, 0xdf, 0x73, 0x16, 0xc4, 0x77, 0xb0, 0x57, 0x94, 0x5e, 0xc7, 0xd7, 0xec, 0xe9, 0x11, 0xba, 0x19, 0xc5, 0x8b, 0xa9, 0xd1, 0x34, 0x20, 0xb3, 0x29, 0xcc, + 0x8a, 0x2c, 0x8a, 0x3e, 0x49, 0x36, 0x5b, 0x6f, 0x19, 0xa7, 0x92, 0x76, 0xd8, 0xad, 0x0c, 0x06, 0xe0, 0xa2, 0xb3, 0xa8, 0x35, 0x92, 0x70, 0x3a, 0x40, 0x5b, 0x2c, 0xc1, 0x52, 0x15, 0xdb, 0x94, + 0x49, 0x7b, 0xcc, 0xb6, 0xe7, 0xaa, 0x60, 0x82, 0x3c, 0xd0, 0x54, 0x5e, 0x59, 0xf2, 0x0a, 0x43, 0x9c, 0xaa, 0x9e, 0x8f, 0x0c, 0xbb, 0xda, 0x24, 0xd9, 0x8d, 0xf1, 0xf0, 0x5e, 0x19, 0xa1, 0xfb, + 0x47, 0xeb, 0x99, 0x98, 0x91, 0x1b, 0xe8, 0x57, 0x4c, 0x7c, 0x9e, 0x1b, 0x1b, 0x57, 0xb4, 0xf5, 0xd0, 0xda, 0xc7, 0x15, 0x06, 0xa8, 0x25, 0x58, 0x3b, 0x1d, 0xad, 0xa4, 0x76, 0x95, 0xaa, 0xad, + 0xca, 0xb9, 0xbc, 0x0c, 0x24, 0x08, 0xec, 0xcd, 0x5c, 0x8d, 0x73, 0x5c, 0x01, 0x2b, 0x16, 0xcd, 0xa4, 0xb6, 0xe1, 0x3b, 0xbd, 0x9a, 0xd1, 0xd1, 0xaa, 0x75, 0xd0, 0x8a, 0x82, 0xda, 0x8d, 0x03, + 0xa8, 0x73, 0x95, 0x69, 0xe7, 0x90, 0x62, 0x16, 0x0c, 0x05, 0x99, 0x5e, 0x60, 0x37, 0xf5, 0xf6, 0xc1, 0xf1, 0xfa, 0x82, 0xa3, 0x0f, 0x0a, 0xc6, 0x7d, 0x6b, 0xfb, 0x33, 0x0e, 0x96, 0xdf, 0x60, + 0x2f, 0x58, 0x79, 0x7b, 0xb8, 0xb4, 0x38, 0x1a, 0xa1, 0xa5, 0x81, 0x6a, 0xd5, 0x61, 0x5e, 0x7d, 0xea, 0x95, 0x0d, 0x13, 0x14, 0x11, 0x57, 0x0e, 0x54, 0x81, 0x9b, 0x0e, 0xca, 0x0d, 0xa8, 0x5a, + 0xe9, 0xec, 0x91, 0xe1, 0xa7, 0x95, 0xd6, 0x46, 0xdc, 0x96, 0xb0, 0xa3, 0x26, 0x75, 0x4c, 0x21, 0xdf, 0x9d, 0x4f, 0x88, 0x33, 0x5b, 0x88, 0xdb, 0x34, 0xb1, 0x69, 0x62, 0x6e, 0xf0, 0xb6, 0x61, + 0x91, 0xa7, 0x9a, 0xf7, 0x0a, 0x6f, 0xd1, 0x39, 0x87, 0x48, 0xc8, 0x8e, 0xe3, 0xd0, 0x51, 0x1c, 0xe2, 0x47, 0xbe, 0x26, 0xe8, 0xa9, 0xf0, 0xbf, 0x2b, 0xc8, 0x0b, 0x1a, 0x2e, 0x05, 0xc8, 0xa1, + 0x71, 0x91, 0x7e, 0xa6, 0x85, 0x72, 0x7a, 0x9f, 0x83, 0x05, 0x19, 0x06, 0xc2, 0x2a, 0xcd, 0x53, 0x83, 0x08, 0x89, 0xf3, 0x11, 0x0b, 0x7b, 0x09, 0x97, 0xd4, 0x36, 0xe2, 0x64, 0xc1, 0xb6, 0xb9, + 0xba, 0xe6, 0x18, 0xe4, 0x18, 0xb2, 0xba, 0x0a, 0x85, 0x72, 0xd8, 0x68, 0x5d, 0xd1, 0x5b, 0x6b, 0xad, 0xa1, 0x68, 0x07, 0xf7, 0x66, 0x58, 0x14, 0xb8, 0x94, 0xb7, 0x9b, 0xda, 0xd5, 0xa1, 0x73, + 0x41, 0x69, 0x96, 0x55, 0x37, 0x5a, 0xbb, 0xfb, 0xa1, 0x84, 0xd6, 0x7d, 0x3b, 0xce, 0x33, 0xc1, 0xeb, 0xef, 0x50, 0xdf, 0x57, 0x9d, 0xd8, 0xd7, 0xbe, 0x0a, 0x23, 0x0c, 0xe7, 0x6b, 0xf6, 0x8c, + 0x17, 0x7c, 0x25, 0x00, 0x72, 0x34, 0xac, 0x85, 0x95, 0x4e, 0x25, 0x53, 0x95, 0x00, 0x4d, 0x34, 0x11, 0xc1, 0x4c, 0xe7, 0x3b, 0x16, 0x64, 0xfd, 0x25, 0xbc, 0x57, 0xb2, 0x55, 0x8e, 0x4f, 0x91, + 0x58, 0x9e, 0x4d, 0x4d, 0x4c, 0x63, 0x86, 0x19, 0x95, 0x02, 0x53, 0x49, 0x94, 0x8c, 0xb4, 0xd7, 0x34, 0x1a, 0x50, 0xb3, 0x9d, 0x2e, 0x67, 0x10, 0xaf, 0xe8, 0xa7, 0x92, 0x9d, 0xae, 0x8e, 0x63, + 0xcc, 0x9a, 0x9e, 0x7f, 0x95, 0x4a, 0x1e, 0xd9, 0x2d, 0xfe, 0x7c, 0xeb, 0x2f, 0x10, 0x2f, 0x61, 0x86, 0x76, 0x13, 0x5d, 0x4c, 0x14, 0x3f, 0xb6, 0xf7, 0xa2, 0xed, 0xa3, 0xab, 0x30, 0x84, 0x77, + 0xc8, 0xf5, 0xc5, 0x62, 0xee, 0xae, 0xc3, 0xcc, 0x9c, 0xb2, 0x9c, 0xc3, 0xb9, 0xe7, 0xf0, 0xcb, 0xd6, 0xbd, 0x19, 0xb8, 0xef, 0xfd, 0xdc, 0xcf, 0x05, 0xcf, 0xc6, 0xff, 0x5c, 0xa7, 0x0d, 0x2f, + 0x3f, 0xd7, 0x69, 0xc3, 0x4b, 0x38, 0xdb, 0x88, 0xed, 0x92, 0xb7, 0xfb, 0x05, 0xdf, 0xaa, 0x3a, 0xea, 0xb3, 0x8d, 0xb2, 0x92, 0xbb, 0x7c, 0x63, 0x12, 0x2b, 0xf7, 0xe0, 0x37, 0x70, 0x02, 0x35, + 0x53, 0xa9, 0x95, 0xea, 0xc5, 0x20, 0xcb, 0x43, 0xed, 0x1f, 0xd8, 0x29, 0x62, 0xa5, 0xe4, 0x51, 0x0f, 0x16, 0x4b, 0x79, 0x1e, 0xd7, 0x27, 0xe3, 0xb8, 0xec, 0xf8, 0x3d, 0xb7, 0xe3, 0xa5, 0xd0, + 0x00, 0x08, 0x0e, 0xec, 0x66, 0x9b, 0x4d, 0xe4, 0x47, 0xa7, 0x73, 0x70, 0x50, 0x7e, 0x96, 0x77, 0xb2, 0xfa, 0xd7, 0x7b, 0xf7, 0x8f, 0xd7, 0xd9, 0xff, 0xe7, 0x0b, 0x7e, 0x3e, 0x84, 0x96, 0xdc, + 0x3f, 0xdb, 0xcf, 0xa4, 0x1f, 0xff, 0x06, 0xfb, 0x1a, 0x3f, 0x7a, 0x7d, 0x18, 0x9b, 0x80, 0x9c, 0xcb, 0xf1, 0x36, 0xcc, 0x1c, 0xba, 0xc9, 0x60, 0x1b, 0x5d, 0xd5, 0xf9, 0x7a, 0x16, 0xe0, 0xa0, + 0xba, 0x0e, 0x0c, 0x37, 0xe9, 0x37, 0xd3, 0x8e, 0x5c, 0xc3, 0x9a, 0x31, 0x78, 0xb3, 0x8c, 0xaf, 0x8c, 0x15, 0x16, 0x9d, 0x81, 0x70, 0x0f, 0x9e, 0x60, 0x73, 0xe6, 0xe6, 0xc4, 0x40, 0x86, 0xab, + 0x46, 0x8d, 0x59, 0xba, 0xb2, 0x66, 0xa1, 0xd9, 0x38, 0x76, 0x81, 0x2a, 0xc7, 0x75, 0x06, 0x6e, 0x60, 0xf5, 0x39, 0x45, 0xe2, 0xe7, 0x6c, 0x8b, 0x8b, 0xca, 0xd6, 0x5c, 0x13, 0x1f, 0x7f, 0xfd, + 0x81, 0x52, 0xf7, 0x35, 0x57, 0xe2, 0xe7, 0xfc, 0xca, 0x4b, 0xd5, 0xf5, 0x2f, 0x89, 0x62, 0x5f, 0x95, 0x8f, 0xcf, 0xc5, 0xad, 0xbe, 0x7c, 0xc7, 0xef, 0x44, 0x8c, 0x9b, 0x84, 0x8f, 0xdb, 0xba, + 0x55, 0xd8, 0x9d, 0x8f, 0x0f, 0x7e, 0x5f, 0xdf, 0x07, 0x3e, 0xaa, 0xb0, 0xd5, 0x83, 0xd6, 0xab, 0xbf, 0x6e, 0xab, 0x16, 0xde, 0xed, 0x2c, 0x7f, 0x27, 0x41, 0xf4, 0x51, 0x26, 0x3f, 0x7c, 0xfb, + 0xea, 0xa7, 0xd4, 0xb4, 0x87, 0x6f, 0x7d, 0x9f, 0x71, 0xfa, 0xe1, 0xfc, 0x3c, 0x4e, 0xe8, 0xfa, 0x9a, 0xe7, 0xf4, 0xd7, 0xb7, 0x24, 0xf5, 0xd7, 0x1f, 0x90, 0xd5, 0x2b, 0x6c, 0x70, 0xf2, 0x36, + 0xba, 0x43, 0x50, 0x7f, 0x3d, 0x22, 0xaa, 0x33, 0x9f, 0x44, 0x6c, 0x85, 0xba, 0x1b, 0x46, 0x80, 0x98, 0xc1, 0xd3, 0x57, 0xaa, 0x6c, 0x58, 0x79, 0xa3, 0xe8, 0x67, 0x30, 0x3b, 0x89, 0xea, 0x74, + 0x7b, 0xc2, 0x68, 0x22, 0x95, 0x57, 0x14, 0x64, 0x70, 0xb4, 0x84, 0x2f, 0x55, 0x19, 0xf4, 0x65, 0x76, 0xd3, 0x16, 0x50, 0x17, 0x1d, 0x25, 0x4b, 0x07, 0x74, 0x76, 0xba, 0x2a, 0x0a, 0xef, 0x34, + 0xa3, 0xe9, 0xc2, 0x52, 0x3c, 0x74, 0xe1, 0xd3, 0xc2, 0x47, 0xa2, 0xfa, 0xeb, 0xaf, 0xdb, 0x6b, 0xe3, 0xaf, 0x77, 0x8e, 0x73, 0xcb, 0x79, 0x6e, 0x2b, 0x8e, 0x3e, 0xba, 0x54, 0xfe, 0xdc, 0x8a, + 0x71, 0x03, 0xfd, 0xc2, 0x87, 0xbe, 0xcc, 0x5d, 0x2e, 0x9b, 0x11, 0x76, 0x0d, 0x54, 0x3c, 0x06, 0xa6, 0x90, 0x20, 0xe9, 0x7a, 0xf0, 0x44, 0x35, 0x20, 0xad, 0xa5, 0x35, 0x07, 0x77, 0x80, 0xd5, + 0xf6, 0x00, 0x13, 0xb2, 0x78, 0x00, 0xe3, 0x98, 0x4f, 0x0a, 0xc8, 0x89, 0xf0, 0xc2, 0xbc, 0x14, 0xe8, 0x8a, 0x61, 0xfd, 0x8a, 0x33, 0x4b, 0x11, 0xc3, 0x97, 0xa6, 0xe9, 0x26, 0xf9, 0xc1, 0x93, + 0x37, 0x62, 0x22, 0x1f, 0x28, 0x1a, 0xdf, 0x2d, 0x18, 0x12, 0x40, 0x55, 0x21, 0x35, 0x46, 0x70, 0xef, 0x5b, 0xa2, 0x7b, 0xd1, 0x1d, 0x1f, 0x31, 0xf2, 0xb7, 0x12, 0x7c, 0x8f, 0xf4, 0xc2, 0x67, + 0x6e, 0xe6, 0x0b, 0xcc, 0x77, 0xd4, 0x79, 0x63, 0xc2, 0x1e, 0xe0, 0x49, 0x6f, 0x22, 0xce, 0xd0, 0x79, 0x7b, 0x8f, 0x89, 0xa5, 0xb9, 0x92, 0x96, 0x8b, 0x2d, 0x67, 0x61, 0xd3, 0x3a, 0x28, 0x4b, + 0x71, 0x8c, 0x7c, 0xf1, 0x45, 0x6f, 0xfb, 0x27, 0x97, 0xf3, 0x11, 0xf4, 0x65, 0x55, 0x1f, 0x27, 0xc6, 0x2c, 0xee, 0xe5, 0x34, 0x58, 0xbd, 0xca, 0x12, 0x9b, 0x80, 0x82, 0xed, 0x35, 0x03, 0x6d, + 0xcf, 0x6b, 0x4c, 0xe0, 0x2a, 0x81, 0x67, 0x8c, 0x94, 0x98, 0x7b, 0x35, 0xcc, 0xd2, 0xd9, 0xdc, 0x73, 0x8b, 0x9d, 0x7d, 0x32, 0xf2, 0x35, 0x4b, 0xa8, 0x6c, 0x54, 0x6e, 0xc2, 0xa6, 0x5d, 0x2e, + 0x11, 0x9b, 0x3e, 0x84, 0x84, 0x4d, 0x28, 0x2a, 0x06, 0x27, 0x67, 0x59, 0xb5, 0x60, 0xa2, 0xc4, 0x76, 0x1e, 0x97, 0x8b, 0xfc, 0x01, 0x15, 0xc7, 0x04, 0xba, 0x78, 0x7e, 0xf9, 0x68, 0x7f, 0x91, + 0x27, 0x11, 0x52, 0x5e, 0x37, 0xb7, 0xf4, 0xc6, 0xf6, 0xf0, 0x08, 0x89, 0x9c, 0xc7, 0x65, 0xdc, 0xeb, 0xd9, 0xb8, 0x58, 0x15, 0x21, 0x4d, 0x73, 0x65, 0xc5, 0x95, 0xb3, 0x66, 0xb7, 0xcc, 0x56, + 0x51, 0x29, 0x1f, 0xc0, 0xaa, 0x98, 0x0d, 0x9e, 0x83, 0x06, 0xcb, 0x08, 0x87, 0xc1, 0x1a, 0xcc, 0xe5, 0x3a, 0xd8, 0xe2, 0x45, 0xde, 0x8b, 0xa7, 0xc3, 0x8c, 0xde, 0x82, 0x52, 0x3a, 0x43, 0x7b, + 0x66, 0x06, 0xa5, 0x73, 0xb5, 0xd3, 0x0b, 0x65, 0x4e, 0xd7, 0xf5, 0xf2, 0x56, 0xe0, 0xf6, 0xfc, 0xc1, 0x4e, 0xc3, 0x47, 0x21, 0x1b, 0xcf, 0x45, 0xb0, 0xbc, 0xc2, 0xbc, 0xac, 0xf7, 0x32, 0x1a, + 0x1b, 0xa3, 0x52, 0x19, 0xaa, 0x0c, 0x39, 0x01, 0x30, 0xcd, 0x21, 0xa5, 0xc8, 0x6b, 0x07, 0x50, 0x77, 0xbb, 0x60, 0x13, 0x2c, 0xeb, 0x38, 0x93, 0x30, 0x7e, 0xde, 0x64, 0xf9, 0xb2, 0x94, 0x79, + 0x93, 0x54, 0x60, 0x7d, 0x36, 0x08, 0xa9, 0x52, 0xb1, 0x62, 0xe0, 0x15, 0x4e, 0x45, 0xe6, 0x2b, 0x49, 0xaa, 0xb7, 0xe1, 0x7e, 0xd6, 0x8b, 0xdb, 0xa3, 0xaf, 0x32, 0xca, 0x90, 0xed, 0x75, 0xf1, + 0x48, 0x0c, 0xdd, 0xd5, 0x67, 0x7c, 0x67, 0xbf, 0x7f, 0x60, 0x08, 0xaf, 0x01, 0x6f, 0x6f, 0x19, 0x42, 0x1f, 0x2f, 0xaf, 0xb7, 0x5c, 0xc5, 0x5f, 0x0f, 0x7c, 0x0e, 0x1f, 0xab, 0x70, 0xde, 0x57, + 0xdb, 0x9e, 0xf1, 0x3b, 0xbc, 0x43, 0x7d, 0x41, 0xeb, 0xdb, 0x78, 0x6c, 0x21, 0x46, 0x9d, 0xe3, 0xb8, 0x7d, 0xa0, 0xda, 0x6d, 0x5b, 0xdb, 0xbb, 0xd5, 0x0c, 0x20, 0x83, 0x70, 0x07, 0x6c, 0x76, + 0x1d, 0x63, 0x1c, 0x66, 0x5a, 0xb6, 0xeb, 0x88, 0xfa, 0x80, 0xe7, 0x45, 0xc2, 0x5a, 0x56, 0xd7, 0x4a, 0xfa, 0x86, 0xd3, 0x7b, 0xc8, 0x3a, 0x60, 0x7a, 0xc9, 0x2b, 0x2c, 0x3e, 0x67, 0x13, 0x15, + 0x4a, 0x4a, 0xe6, 0xe4, 0xd2, 0xb3, 0x8e, 0xc7, 0xfc, 0x22, 0xe8, 0xfa, 0x81, 0x71, 0xb7, 0xec, 0x73, 0x52, 0xde, 0xa5, 0xee, 0xe7, 0xbb, 0x83, 0x11, 0x7d, 0x1c, 0x55, 0xfa, 0x39, 0xbb, 0xf6, + 0xc1, 0x7d, 0x45, 0x3e, 0x41, 0x8b, 0x1f, 0x00, 0x83, 0x93, 0x8f, 0x4f, 0x93, 0x2b, 0xc0, 0x9f, 0xd1, 0xb9, 0x5e, 0x0d, 0x02, 0x21, 0x56, 0x8a, 0x4d, 0x6a, 0x2a, 0x94, 0xd8, 0xc8, 0x09, 0x35, + 0x37, 0xeb, 0x41, 0x0f, 0x57, 0x33, 0x4e, 0xf6, 0x64, 0x69, 0x07, 0xf7, 0xbb, 0xce, 0x1f, 0x92, 0x4d, 0xae, 0x92, 0x14, 0x0b, 0xec, 0xb6, 0x10, 0x09, 0xa8, 0x43, 0x83, 0x64, 0x03, 0x6a, 0x32, + 0x08, 0xeb, 0x1e, 0x40, 0xe0, 0x34, 0x6d, 0x82, 0xe5, 0x11, 0xdc, 0x16, 0x3a, 0xbd, 0x38, 0xae, 0x56, 0x9c, 0x88, 0xf4, 0x23, 0xc2, 0x8b, 0x7e, 0xa8, 0x1d, 0xeb, 0xd7, 0x93, 0xa6, 0xb8, 0x91, + 0xd0, 0x90, 0x2f, 0xe9, 0x6f, 0xcf, 0x79, 0x46, 0x6e, 0x33, 0x92, 0x7f, 0xdd, 0x95, 0x15, 0x7f, 0x2c, 0x0b, 0x15, 0xd7, 0x93, 0x97, 0x65, 0xbc, 0xd7, 0xa8, 0x7e, 0xf9, 0x81, 0x5f, 0xeb, 0x9f, + 0xe4, 0x7e, 0x68, 0x5f, 0xaa, 0x53, 0x0c, 0x7e, 0x55, 0xbc, 0x53, 0xe1, 0x57, 0x29, 0xfe, 0x9b, 0xe2, 0xb2, 0x3f, 0x94, 0x71, 0xf8, 0x83, 0xea, 0xb2, 0xff, 0x91, 0x18, 0xfe, 0x4d, 0xd3, 0x84, + 0x3b, 0x6a, 0xc7, 0xb7, 0x95, 0xf7, 0xef, 0xbc, 0x7f, 0x5b, 0xe6, 0xec, 0x4d, 0x6b, 0x7a, 0x44, 0x4f, 0x5f, 0xf4, 0xa7, 0x47, 0x32, 0xe0, 0x9f, 0x33, 0xa7, 0x2f, 0xb0, 0xaf, 0x64, 0xf5, 0x71, + 0xe6, 0x22, 0xff, 0x8d, 0x60, 0x54, 0x00, 0xab, 0x49, 0x24, 0x67, 0x9e, 0x1c, 0x71, 0x76, 0x72, 0xfa, 0x53, 0x12, 0x67, 0x27, 0x4b, 0xe4, 0x4b, 0x92, 0x6e, 0x4d, 0x43, 0x52, 0x91, 0x95, 0xb5, + 0xd8, 0x17, 0x31, 0x42, 0xa7, 0xb2, 0xa4, 0xa2, 0xbe, 0x93, 0x2f, 0x97, 0xd4, 0x09, 0xdc, 0xac, 0xcb, 0x8d, 0xd5, 0xd0, 0x04, 0x0d, 0x99, 0x6b, 0x7b, 0xc7, 0x9e, 0x00, 0x89, 0x10, 0x16, 0x33, + 0xbf, 0x58, 0xee, 0x08, 0x49, 0xee, 0x44, 0x22, 0xfa, 0xa9, 0xfc, 0xe2, 0x53, 0xc4, 0x76, 0x9f, 0x48, 0xa0, 0x9f, 0x68, 0xe1, 0x27, 0x55, 0xf4, 0xd6, 0x7f, 0xf5, 0xb1, 0xee, 0xc4, 0xcd, 0x21, + 0xff, 0x50, 0x73, 0xe2, 0x4f, 0x08, 0xe0, 0x56, 0x3f, 0x7d, 0x3b, 0x32, 0x1f, 0xf0, 0xf4, 0x7f, 0xd4, 0xae, 0xff, 0x4c, 0xed, 0xba, 0x65, 0xc7, 0xf7, 0x09, 0xee, 0x99, 0xa8, 0xd8, 0x2f, 0xb0, + 0xaf, 0x04, 0xf7, 0x71, 0xe6, 0xd2, 0x71, 0x67, 0x84, 0x65, 0x5b, 0x99, 0x49, 0x69, 0x1a, 0x5a, 0xab, 0xc6, 0xd6, 0x0b, 0x2a, 0x8b, 0x4d, 0xc6, 0x5d, 0xcf, 0x22, 0x4d, 0xb7, 0xf9, 0x4d, 0xb2, + 0x5a, 0xa0, 0xb2, 0x59, 0xc3, 0xbb, 0xd8, 0x63, 0x09, 0xfa, 0x14, 0xcf, 0x13, 0xf8, 0x60, 0x9e, 0x05, 0x5f, 0xd1, 0xdc, 0x66, 0x4d, 0xfb, 0x03, 0x2d, 0xf1, 0x53, 0x4b, 0xd8, 0xf2, 0x50, 0x88, + 0x2c, 0x43, 0x39, 0xc7, 0x85, 0x13, 0x83, 0x2d, 0x35, 0x32, 0xde, 0x96, 0xdd, 0x08, 0xf7, 0xe0, 0xed, 0x35, 0x00, 0x8f, 0x32, 0xc2, 0x7c, 0xa5, 0x9f, 0x2f, 0xe5, 0x78, 0x1e, 0xa8, 0x6c, 0xf7, + 0xb2, 0x02, 0xef, 0x6d, 0xc6, 0x73, 0xa5, 0x67, 0x6f, 0xa0, 0xbf, 0x6c, 0xc7, 0xd7, 0xb9, 0xb1, 0x05, 0x68, 0x63, 0x10, 0x31, 0x9c, 0x5c, 0x1d, 0xc0, 0xf6, 0xbc, 0x9d, 0xe9, 0x38, 0xb0, 0xf1, + 0x76, 0xab, 0x50, 0xd8, 0xb3, 0x9a, 0x88, 0x21, 0x04, 0x20, 0x1e, 0x4d, 0xe7, 0xa0, 0x0c, 0x2c, 0x8a, 0xc0, 0x6c, 0x3b, 0x53, 0x56, 0xfa, 0x51, 0x6a, 0x57, 0xc2, 0x92, 0x86, 0x96, 0x22, 0x02, + 0xec, 0x91, 0x73, 0x63, 0xf2, 0x9e, 0x20, 0x65, 0x16, 0xe6, 0x6d, 0xf1, 0x60, 0x7e, 0xae, 0x3d, 0x4c, 0x35, 0xd6, 0xc0, 0xfe, 0xc6, 0x15, 0xf5, 0xad, 0xa7, 0xfa, 0xb9, 0x4c, 0xee, 0x77, 0x27, + 0xf5, 0xab, 0x7f, 0x7a, 0x64, 0x0a, 0x77, 0xa6, 0x9c, 0x00, 0x24, 0x38, 0x28, 0x0e, 0xbd, 0x1e, 0x14, 0x62, 0x07, 0x89, 0x26, 0xb4, 0x3c, 0x7a, 0xb9, 0xb1, 0x91, 0x7c, 0xad, 0x91, 0xb1, 0x0a, + 0x4a, 0x37, 0xd4, 0x40, 0xd0, 0xb4, 0x7d, 0x9a, 0x19, 0xe1, 0xd1, 0xb7, 0x09, 0x87, 0x8d, 0x63, 0x04, 0xa2, 0xcd, 0x6a, 0xc9, 0x54, 0x0b, 0x0f, 0xe4, 0xcf, 0x90, 0x88, 0x48, 0xee, 0x80, 0xab, + 0x30, 0x0c, 0xcf, 0xec, 0xc5, 0x41, 0x77, 0x1d, 0xe8, 0x66, 0xbd, 0x81, 0x6d, 0xd7, 0x93, 0xa4, 0x9e, 0x54, 0x6d, 0xde, 0x5c, 0xdb, 0x5c, 0xdc, 0xd7, 0xed, 0x9e, 0xe9, 0x49, 0xf0, 0x05, 0xf6, + 0x25, 0x2d, 0xfb, 0xd3, 0xcc, 0x25, 0x42, 0x74, 0xc4, 0xe5, 0x17, 0x28, 0x39, 0xe3, 0x9f, 0xda, 0x06, 0xb1, 0x01, 0x87, 0x32, 0x60, 0x54, 0x37, 0xa3, 0xe4, 0x5c, 0x1d, 0x45, 0xd5, 0x26, 0xf1, + 0x14, 0x85, 0x44, 0x97, 0x54, 0xea, 0xc5, 0x2a, 0xa5, 0x64, 0x80, 0xa8, 0x05, 0xa6, 0xb5, 0xad, 0xe6, 0x6c, 0x88, 0x27, 0x19, 0xe1, 0xf6, 0x4b, 0x42, 0x40, 0x24, 0xba, 0xf4, 0x32, 0xfc, 0xbc, + 0x84, 0x45, 0x84, 0x95, 0x6b, 0x6f, 0x30, 0xd7, 0x24, 0xe2, 0xad, 0x17, 0x23, 0x68, 0xf1, 0x73, 0xec, 0xc2, 0x5b, 0x5c, 0xda, 0x07, 0x3a, 0xfb, 0xe8, 0xb3, 0xfd, 0xf5, 0x2f, 0xf8, 0xc6, 0x34, + 0xfb, 0xe6, 0xa9, 0xb8, 0x73, 0x81, 0xbd, 0x26, 0xb2, 0xff, 0x7a, 0x95, 0x8f, 0xc8, 0xbb, 0x9f, 0x4e, 0x2a, 0xfb, 0x34, 0x71, 0x0a, 0xef, 0xed, 0x35, 0xe4, 0xf3, 0x5b, 0x49, 0x3d, 0xe9, 0xed, + 0x2c, 0x7d, 0x83, 0xf1, 0xf9, 0xc3, 0xbc, 0xf0, 0xfc, 0x49, 0x51, 0x4f, 0xda, 0x26, 0x4e, 0x7f, 0x5b, 0x38, 0x3f, 0x15, 0xc1, 0x2b, 0x3a, 0xbf, 0x4a, 0x0b, 0xdb, 0x9b, 0xbc, 0x88, 0x56, 0x9f, + 0xec, 0x92, 0x5f, 0x44, 0xcf, 0xb2, 0x2a, 0xb2, 0x89, 0x9b, 0xc6, 0x6f, 0xcd, 0x31, 0x60, 0xec, 0xab, 0xd0, 0xf7, 0xb1, 0x15, 0xca, 0x03, 0x5e, 0x73, 0xc9, 0x23, 0x75, 0x8b, 0xbc, 0xb9, 0x30, + 0x80, 0xbe, 0xf4, 0xbf, 0x6d, 0x8d, 0xfd, 0x9c, 0x7d, 0xe5, 0xc1, 0x77, 0xbc, 0x55, 0x04, 0xb8, 0xfd, 0x64, 0xac, 0xc5, 0xc5, 0x70, 0x5c, 0xcc, 0x70, 0xfb, 0x5a, 0x37, 0xdc, 0x5a, 0x9e, 0xda, + 0xbc, 0xae, 0x13, 0x9b, 0x23, 0x2a, 0x9d, 0x3a, 0xfe, 0x48, 0x11, 0x33, 0x60, 0x9f, 0x3b, 0x07, 0x7f, 0xe9, 0x07, 0xa5, 0x6f, 0xae, 0x0d, 0xa0, 0xea, 0x87, 0xc5, 0x2a, 0xd5, 0x71, 0x49, 0x6d, + 0x16, 0xab, 0xa8, 0xc6, 0xa5, 0x14, 0x5a, 0x1f, 0x74, 0xae, 0x74, 0x05, 0xe0, 0xb4, 0x86, 0x56, 0xa7, 0x40, 0x04, 0x16, 0x33, 0x7d, 0xba, 0xbc, 0x89, 0x5b, 0x7f, 0x4d, 0xb5, 0x75, 0x5f, 0xb6, + 0xae, 0xad, 0xe2, 0xc9, 0xbb, 0x9b, 0xfa, 0x1b, 0x24, 0xfd, 0x39, 0x5b, 0x7e, 0xf8, 0x2d, 0x6f, 0x68, 0xba, 0xf7, 0xd9, 0xe8, 0xda, 0x66, 0x42, 0x28, 0xec, 0xc3, 0xa9, 0xaf, 0x9f, 0xbb, 0xad, + 0xc5, 0x9d, 0xf6, 0xe4, 0xa2, 0x0b, 0x1c, 0x9b, 0x27, 0x68, 0x43, 0x8d, 0x10, 0x77, 0x0d, 0xa0, 0xc9, 0x34, 0x10, 0xb9, 0x41, 0x17, 0x67, 0xe7, 0x3d, 0xb3, 0x42, 0xbd, 0x1d, 0x6a, 0x13, 0xfb, + 0x81, 0xec, 0x91, 0x00, 0x6c, 0x15, 0xc8, 0x47, 0x19, 0x7c, 0x9f, 0x15, 0x1e, 0x8b, 0x16, 0xea, 0x14, 0x4b, 0x34, 0x85, 0xe2, 0x77, 0xda, 0x72, 0x79, 0x13, 0xd1, 0x77, 0x9b, 0x93, 0x7c, 0x9f, + 0x5f, 0x3f, 0x63, 0xb7, 0xfd, 0x02, 0xfb, 0x37, 0x52, 0xde, 0x5d, 0x48, 0xe8, 0x38, 0x9b, 0x6d, 0x80, 0x1e, 0x15, 0xaa, 0x50, 0x7a, 0x2a, 0x41, 0xe8, 0x88, 0xf1, 0x41, 0x9e, 0xda, 0xcd, 0x28, + 0xf8, 0xb4, 0xce, 0x04, 0x66, 0x36, 0xd3, 0xc1, 0x90, 0x95, 0x72, 0x61, 0x43, 0x9b, 0xdc, 0x34, 0xaa, 0x4f, 0x12, 0xc1, 0xac, 0x85, 0x04, 0xa2, 0x78, 0x77, 0xca, 0x9b, 0x9b, 0x81, 0x72, 0xb9, + 0x25, 0x00, 0x9c, 0xd3, 0x92, 0x9d, 0x2d, 0x43, 0xd6, 0x8e, 0x9b, 0x5d, 0x0d, 0xa1, 0xb4, 0xb6, 0x25, 0xb1, 0x3b, 0x1c, 0xfc, 0x5e, 0xb9, 0x88, 0xfb, 0x97, 0xf8, 0x33, 0xdd, 0xe6, 0xef, 0xc0, + 0x7f, 0x50, 0x60, 0x63, 0x3a, 0xae, 0xe3, 0x7c, 0xcd, 0xec, 0x64, 0x2d, 0xcc, 0x69, 0xab, 0xf6, 0xd7, 0x2d, 0xac, 0x84, 0x09, 0x9e, 0xea, 0x8e, 0x02, 0xf1, 0x41, 0xb2, 0x88, 0xac, 0xbd, 0x41, + 0x67, 0xa5, 0x35, 0xa5, 0x6d, 0x95, 0x3b, 0xf4, 0xeb, 0x68, 0x1a, 0xd2, 0x06, 0x13, 0xda, 0x60, 0x2b, 0xaf, 0x12, 0x45, 0xe6, 0x4b, 0x76, 0x91, 0xcc, 0x28, 0xdb, 0xdb, 0x2f, 0x4b, 0x4f, 0x72, + 0x67, 0x6b, 0x95, 0xd5, 0xc2, 0xca, 0x22, 0xea, 0xbc, 0x18, 0x61, 0xca, 0xbe, 0x5b, 0xb7, 0xe6, 0xd7, 0xad, 0x3f, 0xed, 0x43, 0x80, 0xd6, 0xed, 0x27, 0x23, 0x4a, 0xe8, 0xdc, 0x49, 0x95, 0x47, + 0x6f, 0x5e, 0xfa, 0x5d, 0x67, 0xe7, 0x0b, 0xdb, 0xae, 0x02, 0xcf, 0x7d, 0x67, 0xc2, 0x0f, 0x34, 0xd6, 0x0b, 0x84, 0x63, 0xeb, 0x57, 0xfd, 0xbb, 0x2e, 0xf3, 0xcf, 0xa9, 0xac, 0x5f, 0x81, 0xbf, + 0x6d, 0xf6, 0x87, 0xa9, 0xb1, 0x4a, 0x6b, 0x88, 0x0b, 0xad, 0xb0, 0xcf, 0x16, 0x86, 0x0b, 0x05, 0x4b, 0x96, 0xdc, 0xef, 0x79, 0x28, 0x89, 0x1b, 0x2c, 0x84, 0x68, 0x8e, 0x29, 0x56, 0xd1, 0xec, + 0xb0, 0x12, 0x1d, 0x78, 0x9b, 0x39, 0xb5, 0x3a, 0xd7, 0x37, 0x9d, 0x02, 0x58, 0x33, 0x92, 0xc5, 0x67, 0xba, 0x05, 0x70, 0xcd, 0x82, 0xcc, 0xc5, 0x41, 0x95, 0x8d, 0x3c, 0x8a, 0x7d, 0xb9, 0xef, + 0x8f, 0xc7, 0xb8, 0x1c, 0x36, 0x9b, 0x79, 0xce, 0x27, 0x23, 0x6a, 0x5d, 0x7c, 0xc7, 0x46, 0xdf, 0xa4, 0xe5, 0xc7, 0x88, 0xad, 0x7c, 0xef, 0xb1, 0x69, 0x0d, 0x7d, 0x2a, 0x5f, 0xe6, 0x03, 0xdc, + 0x37, 0x74, 0x5e, 0x9f, 0x26, 0xe8, 0xb8, 0x1c, 0x99, 0xc1, 0xd6, 0x6c, 0x6f, 0x16, 0x55, 0xc0, 0xc6, 0x3f, 0xf4, 0x83, 0x9d, 0xa6, 0xb4, 0x68, 0xd0, 0x9a, 0xb1, 0x96, 0xb6, 0xa4, 0xb8, 0x39, + 0xa3, 0xc3, 0xb1, 0xb4, 0x20, 0x51, 0x5f, 0x20, 0x36, 0x17, 0x60, 0x73, 0xbb, 0x89, 0x72, 0x0e, 0x0a, 0x50, 0x64, 0xb7, 0x96, 0xd8, 0x4d, 0x6a, 0x92, 0xcb, 0x96, 0x33, 0x51, 0xbe, 0xd8, 0x4a, + 0xc8, 0x1a, 0x07, 0xf1, 0x40, 0x1d, 0x36, 0xf5, 0xda, 0xe6, 0x97, 0x37, 0x36, 0xef, 0xe0, 0x6e, 0xb7, 0xb5, 0xfb, 0x02, 0xe1, 0x33, 0xd9, 0x53, 0x77, 0xe0, 0xbf, 0xa1, 0xe3, 0xf3, 0xec, 0xe8, + 0x1a, 0x0b, 0x80, 0xb0, 0x72, 0x11, 0x2f, 0x5b, 0xae, 0x53, 0xb9, 0x4c, 0x59, 0x90, 0xc7, 0x04, 0x2a, 0xa5, 0xd6, 0x2e, 0xcd, 0xd3, 0x81, 0xdc, 0xc8, 0x38, 0x63, 0x92, 0x58, 0xbb, 0x5b, 0x1b, + 0x0a, 0x3e, 0xef, 0xdc, 0x81, 0x5a, 0xbb, 0x21, 0x8a, 0x9a, 0xc8, 0x00, 0x2f, 0x77, 0x4e, 0xaa, 0xe1, 0x67, 0xcf, 0x9c, 0x62, 0xb2, 0x61, 0xee, 0xf8, 0x79, 0x07, 0x40, 0xfb, 0xf2, 0x48, 0x2e, + 0x0b, 0x7c, 0x38, 0x8c, 0x49, 0x1d, 0xfa, 0x40, 0xc3, 0x8f, 0xe4, 0xe5, 0x27, 0x4f, 0x49, 0x5b, 0xc5, 0x6f, 0x38, 0x79, 0x39, 0xba, 0x23, 0x73, 0xa8, 0xdc, 0x65, 0x5b, 0x0b, 0xcc, 0xb2, 0x01, + 0xb7, 0x60, 0xb1, 0xc4, 0x07, 0x10, 0xce, 0xfb, 0xc0, 0x47, 0x16, 0x1d, 0x27, 0xec, 0xb4, 0x22, 0xda, 0x6d, 0x83, 0xee, 0x20, 0x45, 0xdd, 0x19, 0xca, 0x67, 0xf3, 0x3d, 0x70, 0x0e, 0xa6, 0x9b, + 0x62, 0x66, 0x24, 0x34, 0xef, 0xee, 0x4b, 0x0a, 0x6d, 0x25, 0x9d, 0x71, 0xa3, 0xc1, 0x74, 0xeb, 0x4e, 0x4e, 0x2b, 0xbb, 0xa4, 0x3d, 0x03, 0x6e, 0xf7, 0x80, 0xc9, 0xdd, 0xbd, 0x75, 0x1f, 0x9f, + 0x09, 0xec, 0x6f, 0xe4, 0x59, 0x91, 0xed, 0xf7, 0x41, 0x78, 0xd9, 0xfc, 0x2b, 0xa0, 0x9f, 0x17, 0x3d, 0xec, 0xf7, 0xf1, 0x54, 0xe0, 0x68, 0x07, 0x36, 0x2d, 0x3c, 0xe8, 0xab, 0x7c, 0x91, 0xd3, + 0xf0, 0x8c, 0x86, 0xe7, 0x16, 0x7f, 0xe0, 0x44, 0xdc, 0x6c, 0xe7, 0xeb, 0x90, 0x41, 0x95, 0x52, 0x45, 0x53, 0x2c, 0x5d, 0x6f, 0x7b, 0x18, 0xdb, 0xc3, 0xae, 0x0b, 0xe3, 0x0e, 0x26, 0x70, 0x32, + 0x0f, 0x0e, 0x0a, 0x45, 0xee, 0x67, 0xaa, 0xa7, 0x02, 0x1a, 0x06, 0xaf, 0x0e, 0xbc, 0x89, 0xfa, 0x47, 0xb8, 0x18, 0xa1, 0x16, 0x3c, 0xaa, 0x44, 0xf7, 0xc2, 0xeb, 0xa7, 0x9f, 0xb9, 0xf9, 0x4d, + 0x81, 0xb0, 0x97, 0x77, 0x90, 0x07, 0xef, 0xdc, 0xbb, 0x53, 0x3f, 0x81, 0xc7, 0xbe, 0x86, 0x28, 0xdc, 0xa9, 0xd1, 0x73, 0xc7, 0x24, 0xfc, 0x96, 0x7b, 0xfc, 0x72, 0xa5, 0x7d, 0x35, 0x7a, 0x3f, + 0x94, 0xc9, 0xef, 0x5c, 0x8c, 0xf7, 0x25, 0x8d, 0xb7, 0xc2, 0x54, 0x1f, 0x5f, 0x8c, 0x73, 0x6f, 0x92, 0xf5, 0x93, 0xd3, 0xab, 0x25, 0x8d, 0xf8, 0xda, 0x38, 0x31, 0x8d, 0xc3, 0xa8, 0x79, 0x79, + 0xe3, 0x05, 0xc1, 0xfe, 0x6b, 0xaf, 0xb3, 0xe9, 0xdf, 0xd4, 0xe7, 0x1f, 0x57, 0xc6, 0xf9, 0xdb, 0xcf, 0x86, 0xbf, 0xe0, 0xec, 0x35, 0xd0, 0x79, 0x72, 0xb2, 0xab, 0xfc, 0xf7, 0xba, 0x6f, 0x5f, + 0x3a, 0xf7, 0x13, 0xdb, 0xf3, 0xaa, 0x77, 0xbc, 0x10, 0x0f, 0xae, 0xda, 0xaf, 0xa1, 0x1f, 0xbe, 0xdb, 0x56, 0xfe, 0x75, 0xad, 0xbf, 0x11, 0x82, 0x7c, 0xdd, 0xdd, 0x2f, 0xed, 0xfb, 0x3f, 0x7d, + 0xf6, 0xa1, 0x13, 0xd2, 0xab, 0x66, 0xf8, 0xcd, 0x9d, 0xf3, 0xb2, 0xd3, 0x65, 0xda, 0x86, 0x9f, 0x8a, 0x69, 0x7f, 0xa6, 0xad, 0x67, 0x22, 0x1a, 0x3f, 0x83, 0xfe, 0x40, 0x61, 0xd7, 0x89, 0x09, + 0x36, 0x2e, 0xc2, 0x91, 0xa0, 0xec, 0x03, 0xb4, 0x3a, 0x7b, 0x9e, 0x04, 0xb5, 0x0d, 0x6d, 0xd0, 0xca, 0xd4, 0x75, 0x85, 0xa8, 0xab, 0xf1, 0xce, 0x40, 0x44, 0xae, 0xe7, 0x79, 0x51, 0xac, 0x33, + 0xeb, 0xc0, 0xd0, 0x9b, 0xea, 0x88, 0x46, 0x86, 0x0b, 0xcf, 0xf8, 0xa1, 0xdb, 0xc8, 0xbc, 0xe4, 0x76, 0x5a, 0xbd, 0x13, 0xe7, 0x72, 0x3a, 0x5d, 0x02, 0x1b, 0x0d, 0xd8, 0x4a, 0x98, 0x29, 0x88, + 0x9c, 0x1f, 0x49, 0x81, 0x7a, 0x5f, 0xa4, 0xff, 0xa2, 0xf2, 0x3e, 0xe0, 0x32, 0x4f, 0xde, 0x3c, 0x1f, 0x81, 0x7f, 0xc0, 0xc5, 0xdb, 0xd4, 0xa5, 0xf1, 0xfe, 0x88, 0x3b, 0x87, 0xda, 0xed, 0xb8, + 0x94, 0x98, 0x21, 0x80, 0x0e, 0x1b, 0x31, 0x25, 0x23, 0x85, 0xa4, 0xf1, 0xfb, 0x66, 0xd5, 0xc3, 0x96, 0x74, 0x18, 0x3c, 0x56, 0x4a, 0x3c, 0x35, 0xde, 0xa9, 0xf9, 0x10, 0x42, 0x74, 0x00, 0x92, + 0xa7, 0xd0, 0xab, 0xcb, 0x70, 0x77, 0x16, 0x8c, 0xdc, 0x64, 0xfc, 0x5e, 0x26, 0x79, 0x2e, 0x77, 0x85, 0xa9, 0x0a, 0x3a, 0xe6, 0x8a, 0x3d, 0xe2, 0x29, 0x42, 0x43, 0xa6, 0x54, 0x30, 0x23, 0xc4, + 0xd7, 0x9b, 0x73, 0x72, 0x27, 0x61, 0xfe, 0x93, 0xb9, 0x00, 0xf9, 0x94, 0xdd, 0xfd, 0xcd, 0xa9, 0x7e, 0xd8, 0xb2, 0x32, 0x78, 0xcd, 0xbf, 0x7f, 0x20, 0x5c, 0x3e, 0x7b, 0x24, 0x8f, 0xaf, 0xd8, + 0x3f, 0x4e, 0xae, 0x40, 0x7e, 0xc6, 0xf9, 0x89, 0xa9, 0x0a, 0x57, 0x47, 0xd6, 0x33, 0xc3, 0xb0, 0x81, 0x74, 0xcf, 0x34, 0xe4, 0xb6, 0x58, 0x6e, 0x59, 0x92, 0x5a, 0xc4, 0xa4, 0xe4, 0xd1, 0x8c, + 0xc4, 0xda, 0xe0, 0x61, 0x9e, 0xf7, 0x7e, 0x9f, 0xa8, 0x53, 0xdb, 0x92, 0xa6, 0x20, 0xb7, 0xe9, 0x96, 0xd3, 0x7a, 0xbe, 0xdc, 0xd0, 0xec, 0x51, 0x06, 0x23, 0x52, 0x44, 0x28, 0x9d, 0xd7, 0x78, + 0xdd, 0x99, 0xa2, 0xb5, 0xde, 0x4e, 0x97, 0xd1, 0xd1, 0x1b, 0xe1, 0x57, 0xac, 0xfc, 0xb6, 0x7e, 0xe3, 0x72, 0xf0, 0x63, 0x8f, 0xec, 0xa7, 0xf4, 0xc5, 0x7b, 0xc8, 0x22, 0x9e, 0xd3, 0xd3, 0xdf, + 0xc1, 0xbe, 0x20, 0xec, 0xfd, 0xe1, 0x92, 0xe0, 0x32, 0xe2, 0xa0, 0x1e, 0xa5, 0x82, 0x5a, 0x00, 0x9e, 0xa8, 0x67, 0x33, 0x64, 0xed, 0x3a, 0x18, 0xe3, 0xec, 0xba, 0x5c, 0x58, 0x9d, 0x35, 0x39, + 0x99, 0x65, 0xc0, 0x76, 0x5b, 0xfa, 0x58, 0xc8, 0xb6, 0x5c, 0x35, 0x1c, 0xd6, 0x44, 0x36, 0xdf, 0xa5, 0xa0, 0x97, 0x98, 0x6a, 0x8b, 0x48, 0x9e, 0x82, 0xc8, 0x36, 0x0a, 0x21, 0x1b, 0xac, 0x38, + 0x1e, 0xd4, 0x90, 0x8a, 0x2b, 0x3c, 0xb1, 0xd7, 0xfb, 0x15, 0xa2, 0xab, 0xbb, 0xf2, 0x39, 0x97, 0xd1, 0x4d, 0x7b, 0xb3, 0x6b, 0xe5, 0xb9, 0x47, 0x1c, 0xf1, 0xd3, 0xf5, 0x71, 0x1f, 0x9f, 0xf8, + 0x33, 0x9a, 0xcd, 0x6f, 0xb8, 0x17, 0x84, 0xbe, 0x3f, 0x4d, 0x2e, 0xf0, 0x7e, 0xc6, 0x28, 0x24, 0x25, 0x7c, 0x0e, 0x3b, 0x70, 0x3e, 0x33, 0x50, 0x7f, 0xe7, 0x64, 0x14, 0xd3, 0xfb, 0x73, 0x3e, + 0xae, 0x5d, 0xd9, 0x8c, 0xf9, 0x75, 0x10, 0xf9, 0x31, 0x7c, 0x92, 0x74, 0x9d, 0x3a, 0x06, 0x81, 0x72, 0x38, 0x50, 0xe4, 0x69, 0x0e, 0xad, 0x0b, 0x72, 0x57, 0xed, 0xcc, 0x40, 0xe5, 0xc4, 0x30, + 0x57, 0x73, 0x36, 0x22, 0x71, 0xf6, 0xec, 0x7b, 0x5e, 0x4b, 0xe7, 0x4c, 0x80, 0xe5, 0x27, 0x7d, 0x3e, 0xe2, 0x18, 0x06, 0xa3, 0xd5, 0xca, 0xcf, 0x4a, 0xe1, 0x9d, 0x3b, 0xfc, 0x22, 0x67, 0x5f, + 0xf6, 0x02, 0x79, 0xbf, 0x14, 0x1f, 0x51, 0xff, 0xef, 0xae, 0xa8, 0xf7, 0xf6, 0xe0, 0x73, 0x9f, 0xd4, 0xd1, 0x7b, 0xf0, 0x0a, 0xf4, 0x65, 0x03, 0x5e, 0x87, 0x93, 0x0b, 0xa4, 0x9f, 0xb1, 0x9f, + 0x1c, 0xcd, 0x60, 0x5d, 0x12, 0x59, 0x41, 0x75, 0xcb, 0x5e, 0x09, 0xc8, 0xfe, 0xb0, 0x47, 0x3a, 0x82, 0x06, 0x90, 0x0d, 0xa6, 0x24, 0xfe, 0xcc, 0x5f, 0x4e, 0x01, 0x76, 0xa0, 0x8c, 0xca, 0x8e, + 0x25, 0x38, 0x0e, 0x73, 0x12, 0x3e, 0x25, 0x31, 0x4f, 0x2c, 0x1c, 0xaa, 0x53, 0xa5, 0x7d, 0xa7, 0x04, 0x9b, 0x26, 0x53, 0x6d, 0x8c, 0x47, 0xb6, 0x85, 0xa2, 0x55, 0x95, 0x11, 0x77, 0x9e, 0x6e, + 0x65, 0xcf, 0xc5, 0x6a, 0xdc, 0x73, 0xd2, 0xa0, 0x0f, 0xb1, 0xf8, 0x0d, 0x12, 0x9f, 0x0b, 0x6d, 0x7e, 0x85, 0x79, 0xc5, 0xe1, 0x05, 0x85, 0x23, 0x82, 0x9a, 0xe1, 0xc9, 0x0c, 0xc0, 0x68, 0x9d, + 0x89, 0xdb, 0x3a, 0x63, 0x95, 0x02, 0x27, 0xf1, 0x69, 0x9a, 0x78, 0xb4, 0xe6, 0xd4, 0xdc, 0xf4, 0xf0, 0xf5, 0x2e, 0xfe, 0xd0, 0x4d, 0xfb, 0xfe, 0x25, 0xfc, 0x94, 0xa4, 0xff, 0x06, 0xf5, 0xfa, + 0xc3, 0xaf, 0xe3, 0xb1, 0xc5, 0xa7, 0xe7, 0xda, 0xfc, 0x90, 0xaa, 0x5c, 0x3c, 0x6d, 0x20, 0x45, 0xb4, 0xda, 0xd8, 0x28, 0x68, 0x50, 0xc1, 0x3b, 0x37, 0x3f, 0xbb, 0x6b, 0x45, 0x9e, 0x76, 0x5e, + 0x1b, 0xaa, 0x65, 0x4b, 0xf7, 0x31, 0xae, 0xee, 0xb8, 0x18, 0x71, 0x53, 0x59, 0x2e, 0x81, 0x73, 0x38, 0x8f, 0x5a, 0xd1, 0xe6, 0x67, 0xc0, 0xc0, 0x85, 0x39, 0x0a, 0x0b, 0x1e, 0x82, 0x4e, 0xf7, + 0xe8, 0x34, 0x20, 0xf8, 0xfe, 0x70, 0xb0, 0x4f, 0xcf, 0xed, 0xfe, 0x87, 0xb2, 0x57, 0xbf, 0xfe, 0xf5, 0xb9, 0xc8, 0xd5, 0xdd, 0x2c, 0xb9, 0x2b, 0x19, 0x92, 0x1f, 0x5f, 0xca, 0xe2, 0xec, 0x5a, + 0xad, 0xe8, 0x83, 0x21, 0xe9, 0x91, 0xd9, 0xfc, 0x63, 0xeb, 0xf2, 0x7f, 0x50, 0x17, 0x7f, 0x07, 0xfb, 0xba, 0x1b, 0xd7, 0x87, 0xb1, 0x9a, 0x37, 0x34, 0x77, 0x55, 0xea, 0x34, 0x5b, 0xcc, 0x87, + 0x75, 0x17, 0xc4, 0x87, 0x9a, 0x28, 0xb2, 0x15, 0xa0, 0xc6, 0xe6, 0x8a, 0x8e, 0x59, 0x40, 0x1b, 0x04, 0x4c, 0x76, 0x4f, 0xb0, 0x9e, 0xea, 0x05, 0x97, 0x47, 0xfa, 0x99, 0x75, 0x45, 0x21, 0x69, + 0x20, 0x99, 0x38, 0x93, 0xa7, 0xb9, 0x03, 0xb5, 0xb8, 0xc4, 0xb7, 0xe4, 0xc6, 0xa1, 0xc8, 0x3d, 0x87, 0xe6, 0xe7, 0x26, 0x5d, 0x4c, 0x67, 0x84, 0xd3, 0xe9, 0xcf, 0x5d, 0x2e, 0xbf, 0x23, 0xf5, + 0xee, 0xc4, 0x82, 0x44, 0xfe, 0xb9, 0x88, 0xbd, 0xfb, 0xbc, 0xb0, 0xc8, 0xdd, 0x37, 0xf2, 0xfd, 0xb2, 0x87, 0x9f, 0x1b, 0xbb, 0x3f, 0xda, 0x96, 0x93, 0x5d, 0x79, 0x0f, 0xc3, 0x5d, 0xa1, 0xe7, + 0x4c, 0x00, 0x6f, 0x50, 0xaf, 0x9b, 0x72, 0x1d, 0x4f, 0xa0, 0x71, 0x46, 0x00, 0xa7, 0xdd, 0x72, 0x50, 0x50, 0x32, 0xcd, 0x96, 0x57, 0xb5, 0x99, 0x44, 0xab, 0x3e, 0x1e, 0xb1, 0xc8, 0x94, 0x6c, + 0xe6, 0xad, 0xb3, 0x28, 0xb6, 0x6b, 0x07, 0xb3, 0x36, 0x34, 0xbe, 0x39, 0x8b, 0x3b, 0x7e, 0x73, 0x42, 0x42, 0xc9, 0x3d, 0xf1, 0x05, 0x75, 0xea, 0x6d, 0x27, 0x1d, 0xc4, 0x41, 0xa2, 0xa7, 0x03, + 0x75, 0xa6, 0xa9, 0x35, 0x2c, 0x6c, 0x92, 0x03, 0xb8, 0x69, 0x70, 0x51, 0xa3, 0x6c, 0xb3, 0xb8, 0x35, 0x12, 0xd5, 0x7f, 0x57, 0xbe, 0x9d, 0x96, 0xdf, 0xe5, 0xe0, 0x3c, 0xc5, 0x1d, 0x7e, 0xc3, + 0x7d, 0x59, 0xfc, 0xef, 0xa7, 0x31, 0x2e, 0x1a, 0x78, 0xb2, 0x50, 0xd4, 0x66, 0xa5, 0x8a, 0xbb, 0x44, 0x28, 0x69, 0x04, 0x2a, 0xf2, 0x88, 0xac, 0x19, 0x65, 0x9b, 0xe9, 0xf8, 0x61, 0x44, 0x87, + 0x82, 0x0f, 0x09, 0xd7, 0xf7, 0x29, 0xec, 0x99, 0x7e, 0x4d, 0x6f, 0x40, 0x2f, 0xab, 0x79, 0xf5, 0xfd, 0x22, 0xe3, 0xfa, 0x36, 0x9d, 0xe3, 0xa3, 0xa8, 0x6c, 0xb1, 0x33, 0xed, 0xf3, 0x5a, 0xcb, + 0x50, 0xed, 0x3e, 0x03, 0x82, 0xc5, 0xd6, 0x5d, 0x4a, 0xa1, 0xc0, 0x88, 0xb1, 0xc4, 0xc8, 0x80, 0x6f, 0xc4, 0xbd, 0x46, 0x24, 0x75, 0xb8, 0x9b, 0x1d, 0x61, 0xe7, 0xb0, 0xeb, 0xc3, 0x06, 0x82, + 0x0a, 0x5a, 0x2d, 0x4e, 0x0c, 0x31, 0xf7, 0x9a, 0x52, 0xe2, 0x6d, 0x5b, 0x0e, 0x85, 0x86, 0x84, 0x11, 0x99, 0xb2, 0x1d, 0x80, 0x65, 0x1f, 0x95, 0xc4, 0x79, 0x9f, 0x2a, 0xca, 0x26, 0x2e, 0xf2, + 0x8b, 0x78, 0x71, 0x8b, 0xa0, 0x2f, 0xc1, 0x71, 0x8f, 0xcc, 0xcd, 0x4f, 0xf0, 0xa1, 0x8f, 0x90, 0x5f, 0x50, 0xf5, 0xf1, 0x79, 0x6c, 0xd5, 0xe9, 0x7e, 0x59, 0x74, 0xf4, 0x20, 0x1a, 0x18, 0x55, + 0x2f, 0x48, 0x33, 0x9d, 0x92, 0x81, 0x3a, 0xdb, 0xaf, 0xa6, 0x75, 0xa7, 0xae, 0x5b, 0x3b, 0x76, 0xe4, 0xb3, 0xa1, 0xac, 0x16, 0xeb, 0x8c, 0x91, 0x1c, 0xad, 0x9d, 0x55, 0x90, 0x18, 0xc0, 0x42, + 0x2c, 0x17, 0x25, 0x27, 0x52, 0x9b, 0x78, 0x91, 0xc4, 0x26, 0x33, 0x73, 0x02, 0xdb, 0x46, 0x16, 0x11, 0xee, 0x54, 0xbe, 0x82, 0xd3, 0x9b, 0x9d, 0xb6, 0x84, 0x6e, 0xbc, 0x73, 0x5f, 0x23, 0x9b, + 0xfe, 0x39, 0x24, 0x7c, 0x82, 0x0c, 0x4e, 0x3e, 0x3f, 0x8f, 0x45, 0xc2, 0x61, 0x6f, 0x55, 0xf9, 0x4e, 0xc4, 0x10, 0x65, 0x16, 0xcf, 0x69, 0x64, 0x19, 0xc2, 0x0e, 0x47, 0x0e, 0x49, 0xb1, 0x14, + 0xa5, 0xf0, 0xbc, 0x3f, 0x99, 0xb3, 0xb9, 0xbf, 0xf1, 0x4e, 0x26, 0xae, 0x75, 0xa0, 0x2b, 0xa9, 0x3e, 0x57, 0xba, 0x85, 0x81, 0x95, 0x06, 0x1f, 0x08, 0xfa, 0x79, 0x23, 0xec, 0x0a, 0xba, 0xca, + 0xab, 0x79, 0x85, 0xf8, 0x54, 0x5d, 0xe5, 0xf4, 0xf9, 0xcc, 0x2d, 0x2b, 0x5b, 0xa5, 0xc6, 0x28, 0xa6, 0x3f, 0x07, 0x4e, 0xfe, 0x51, 0x54, 0xe4, 0x03, 0xad, 0xe0, 0xb5, 0x5c, 0xc1, 0x7d, 0x75, + 0x00, 0xfe, 0x60, 0xd9, 0x19, 0x8d, 0xf4, 0xb4, 0x70, 0x5e, 0x70, 0x9d, 0x16, 0xce, 0xe4, 0x02, 0xe1, 0x67, 0x14, 0x4b, 0x1d, 0x4b, 0xcd, 0x37, 0x83, 0xbc, 0x76, 0xfc, 0x70, 0xbe, 0xc9, 0x4d, + 0x79, 0xaa, 0xeb, 0xc1, 0x6a, 0x19, 0x57, 0x5a, 0x88, 0x01, 0xc6, 0x49, 0xdc, 0x73, 0xb6, 0x12, 0x28, 0x9a, 0x09, 0xad, 0xfc, 0xfc, 0xbc, 0xe9, 0xba, 0xa5, 0x20, 0xa3, 0x3a, 0x0a, 0x36, 0xb4, + 0xa2, 0xca, 0xcb, 0x16, 0x4c, 0xf9, 0xb3, 0x61, 0xaa, 0x56, 0x56, 0x1a, 0xa9, 0xce, 0xfb, 0x47, 0x7a, 0xe9, 0x09, 0x03, 0xb3, 0x7e, 0xee, 0xd6, 0xfb, 0xcc, 0x86, 0xef, 0xdc, 0x6e, 0x71, 0x1e, + 0x5c, 0xcc, 0x6c, 0xf7, 0xef, 0xc5, 0x8f, 0xad, 0xf6, 0x90, 0xcf, 0x92, 0xc9, 0x6d, 0x18, 0xf2, 0xfd, 0x3b, 0xf3, 0x8b, 0xcd, 0xec, 0xc2, 0xaa, 0xe3, 0x4b, 0xd0, 0x70, 0x91, 0xb6, 0xcd, 0x8f, + 0x61, 0x97, 0x9f, 0xcb, 0x58, 0xdc, 0xdb, 0xd6, 0xe9, 0x53, 0xfe, 0xab, 0x0f, 0x70, 0xdf, 0x76, 0xf7, 0xfa, 0x34, 0x99, 0x8e, 0xf3, 0x5a, 0xd1, 0xd2, 0x32, 0x54, 0x95, 0x99, 0x5f, 0xc6, 0x2b, + 0xf3, 0x24, 0xa3, 0xf4, 0x36, 0xe7, 0xce, 0xc0, 0x74, 0x97, 0x6b, 0x2d, 0xc2, 0x33, 0xa6, 0x37, 0x38, 0x9c, 0x8c, 0x4d, 0xfd, 0xf5, 0x09, 0xee, 0x2a, 0x74, 0x60, 0xd0, 0xce, 0x5a, 0xfb, 0xbd, + 0xef, 0xc1, 0xf5, 0x8c, 0x8a, 0x72, 0xc7, 0x95, 0x5c, 0x0a, 0x54, 0x2b, 0xb1, 0x17, 0xa7, 0x5b, 0x59, 0xa9, 0x0e, 0xdc, 0x80, 0xd9, 0x2a, 0x65, 0x15, 0xcf, 0x49, 0x9a, 0x1f, 0xaa, 0x74, 0xfc, + 0x0b, 0x7b, 0x4c, 0x1a, 0x57, 0xf2, 0x7a, 0x74, 0x15, 0xff, 0xb9, 0x92, 0x16, 0xd9, 0x2f, 0x97, 0xd6, 0x0b, 0x6d, 0xc2, 0xe3, 0x6a, 0x21, 0x05, 0x88, 0xd7, 0x49, 0xd0, 0x4e, 0xc7, 0x25, 0x3f, + 0x21, 0xb6, 0x87, 0xfd, 0x8a, 0xab, 0xfc, 0x28, 0x71, 0x06, 0x91, 0x4e, 0x16, 0xe5, 0x14, 0xdc, 0x09, 0x72, 0x39, 0x6d, 0xb4, 0x72, 0xbf, 0xdc, 0x61, 0x2b, 0x9e, 0xb7, 0x04, 0x18, 0x64, 0xce, + 0xce, 0x62, 0xdb, 0x04, 0x60, 0x1d, 0xd3, 0x88, 0xba, 0xd7, 0x7c, 0x88, 0x72, 0x6d, 0x36, 0xdb, 0x35, 0xa6, 0x39, 0xec, 0xe7, 0x4b, 0x87, 0x51, 0xb1, 0x61, 0x8c, 0x62, 0xfc, 0x80, 0xf5, 0x3c, + 0xc2, 0xd2, 0x87, 0xce, 0xbd, 0x8f, 0xb0, 0xf5, 0xe7, 0xcc, 0xfb, 0x03, 0xdc, 0x57, 0xac, 0xbd, 0x3e, 0x8d, 0x0d, 0x99, 0x58, 0xab, 0x8c, 0x8a, 0xac, 0x13, 0x67, 0xc3, 0x68, 0x01, 0x8e, 0x90, + 0xc4, 0x6a, 0xee, 0xcc, 0x87, 0x6e, 0x15, 0x06, 0xcd, 0x61, 0x31, 0x3d, 0x2e, 0x0e, 0xd9, 0xac, 0xa0, 0x22, 0x76, 0x5b, 0xd2, 0x83, 0x10, 0xe9, 0x52, 0xba, 0x02, 0xa2, 0x33, 0xe9, 0x79, 0x98, + 0xae, 0xd6, 0x10, 0xa4, 0x86, 0xb5, 0xbe, 0x39, 0xb9, 0x18, 0x0e, 0x13, 0x2b, 0xea, 0x10, 0x4f, 0xcd, 0x66, 0x3e, 0x4b, 0x45, 0x24, 0x08, 0x6e, 0x6e, 0xaf, 0xcf, 0xac, 0xf6, 0xd1, 0xf2, 0xff, + 0x9c, 0xde, 0x3e, 0xc0, 0x7d, 0x5d, 0xfe, 0xeb, 0xd3, 0xd8, 0x52, 0x48, 0x6e, 0x64, 0xd8, 0x04, 0x55, 0xad, 0x41, 0x7d, 0x86, 0x08, 0xa9, 0x01, 0x13, 0x49, 0x81, 0x76, 0x5b, 0x6e, 0x80, 0xec, + 0xc1, 0xde, 0xcf, 0xcf, 0xd3, 0x86, 0x3b, 0x5a, 0xe1, 0xb4, 0x94, 0xd0, 0x8d, 0xde, 0xcf, 0x57, 0x3b, 0x06, 0x26, 0x3c, 0xb1, 0x6a, 0x95, 0x74, 0x98, 0xcd, 0xa4, 0x40, 0xef, 0xe6, 0x69, 0x18, + 0x09, 0x6e, 0x36, 0x85, 0x29, 0x0c, 0x60, 0x66, 0xdb, 0x2e, 0x46, 0xb6, 0x1d, 0xc8, 0xdd, 0x88, 0xad, 0x2f, 0x3f, 0xac, 0x29, 0xae, 0xa6, 0x91, 0xc6, 0x7e, 0xec, 0x32, 0x7f, 0x46, 0x74, 0xfd, + 0x02, 0xfb, 0x15, 0x0d, 0x1f, 0x66, 0xc6, 0x88, 0xb0, 0x97, 0x2b, 0x7c, 0x91, 0xb8, 0xea, 0x26, 0xca, 0x53, 0x6e, 0x07, 0x1f, 0xfa, 0x82, 0x3b, 0x10, 0x92, 0x21, 0xa8, 0xf6, 0x89, 0x9f, 0xae, + 0x24, 0x07, 0x5c, 0x0f, 0xba, 0x3b, 0x3d, 0x51, 0x0c, 0x84, 0x44, 0x92, 0x26, 0x41, 0x5e, 0xb0, 0xd8, 0x26, 0x0e, 0xaf, 0x08, 0x5d, 0x08, 0x7b, 0xb8, 0x1b, 0xa0, 0xbc, 0xe3, 0xeb, 0x59, 0xa3, + 0x53, 0x3b, 0xc7, 0xd9, 0xa1, 0xc7, 0xc1, 0x42, 0x34, 0x3f, 0xa2, 0x88, 0xfd, 0x88, 0x2b, 0xfc, 0x7e, 0x72, 0xc2, 0x7d, 0x2a, 0x7a, 0x53, 0xa8, 0xfe, 0x41, 0xf4, 0x5d, 0x40, 0xbe, 0x60, 0xed, + 0x32, 0x18, 0x8b, 0x2c, 0x65, 0xb1, 0xde, 0x41, 0x8d, 0xbd, 0x57, 0x24, 0xab, 0xe9, 0x96, 0xdb, 0x25, 0xed, 0x31, 0xb3, 0xc8, 0xaf, 0xb3, 0x22, 0xb4, 0xaa, 0xa6, 0x35, 0xba, 0xdd, 0xbe, 0x5e, + 0xf0, 0x96, 0x76, 0x40, 0x54, 0x1d, 0xb0, 0xf3, 0xba, 0x3c, 0x5a, 0x48, 0x27, 0xe6, 0xc5, 0x3a, 0x24, 0x96, 0x73, 0x18, 0xd0, 0x0f, 0x30, 0xbe, 0x81, 0x29, 0x5a, 0x8e, 0x5d, 0x98, 0x69, 0x17, + 0xa4, 0x33, 0x23, 0x5d, 0x24, 0x9b, 0x8e, 0xa9, 0x3d, 0xf1, 0xb2, 0x94, 0xc9, 0xc5, 0xa1, 0xf7, 0x58, 0x61, 0x78, 0x0a, 0x0f, 0xbf, 0xe1, 0xbe, 0x20, 0xe3, 0xf7, 0xd3, 0xd8, 0xcc, 0xb8, 0x45, + 0x73, 0xaa, 0x38, 0xd0, 0x6f, 0x99, 0xc1, 0x9e, 0x27, 0xa6, 0xbf, 0x3d, 0x4a, 0x61, 0xda, 0x13, 0x1c, 0x74, 0xec, 0xe2, 0xd8, 0x28, 0x56, 0xfb, 0xbc, 0x9b, 0xf3, 0x88, 0x05, 0x97, 0x29, 0xe3, + 0x19, 0xa1, 0xd3, 0x27, 0x1d, 0x8a, 0x95, 0xbc, 0xa6, 0x3a, 0xd4, 0x50, 0xf8, 0xbc, 0xd8, 0xb3, 0x3d, 0x8a, 0x02, 0xec, 0xbe, 0x9f, 0xee, 0x1b, 0x6a, 0x5f, 0x00, 0x9a, 0xbe, 0x6d, 0x24, 0x53, + 0x1d, 0x71, 0x7c, 0x5e, 0xb3, 0x02, 0x7f, 0xdd, 0xa4, 0x84, 0x7d, 0x92, 0x32, 0x6e, 0xd2, 0x3a, 0xfc, 0xe6, 0x3d, 0xa5, 0xa3, 0x08, 0x7e, 0xbd, 0x86, 0x7c, 0x7f, 0xb6, 0x56, 0x36, 0x76, 0xd3, + 0xd6, 0xfe, 0xfb, 0xff, 0x7f, 0x12, 0x2a, 0x9b, 0x22, 0xf6, 0xfc, 0xbc, 0x89, 0x83, 0xf8, 0xea, 0x83, 0xfb, 0x46, 0x76, 0x8c, 0xdd, 0x22, 0xef, 0x26, 0x69, 0xdc, 0x3c, 0x4e, 0x3d, 0xc3, 0xfe, + 0x46, 0xfe, 0x3c, 0xa1, 0xef, 0x37, 0x5c, 0x70, 0xf2, 0xe1, 0x61, 0x72, 0x05, 0xf7, 0xf3, 0x86, 0x75, 0xa8, 0x68, 0xe4, 0x16, 0xed, 0x76, 0x79, 0x7f, 0x3a, 0x68, 0xfa, 0xdc, 0x2a, 0xb2, 0x25, + 0xed, 0x36, 0xa9, 0x4f, 0x6c, 0x0d, 0xc3, 0xf7, 0x3d, 0x69, 0x8b, 0xc2, 0xa7, 0x53, 0x4a, 0xec, 0xd2, 0xbe, 0x30, 0x24, 0x4c, 0x89, 0x29, 0xbb, 0xea, 0x54, 0x3f, 0xdf, 0x28, 0xfb, 0xdc, 0x87, + 0x35, 0x77, 0x7b, 0x8a, 0x66, 0x6b, 0x98, 0x3f, 0xad, 0x97, 0x08, 0xec, 0xcc, 0x8f, 0x5e, 0x99, 0x90, 0xe0, 0x98, 0x2a, 0x70, 0xb5, 0x1d, 0xf8, 0xd5, 0xe4, 0xbd, 0x96, 0xe2, 0xaf, 0xff, 0xf5, + 0x3f, 0xff, 0xba, 0x14, 0x68, 0xf8, 0xeb, 0x7f, 0xfc, 0xf5, 0xc0, 0x8c, 0xf9, 0xbb, 0xac, 0xe0, 0x7d, 0xba, 0x7f, 0xc6, 0x29, 0xf7, 0x0a, 0xf3, 0x05, 0x75, 0xd7, 0xd1, 0xd8, 0xd8, 0x7c, 0xcf, + 0xed, 0x8f, 0x11, 0xdb, 0x19, 0xf0, 0x0c, 0xc3, 0x53, 0xc3, 0x72, 0x77, 0xc7, 0x59, 0x29, 0x00, 0x8b, 0x46, 0xdc, 0x2a, 0x3b, 0x6f, 0x29, 0x6e, 0x70, 0x90, 0x0d, 0xa6, 0x49, 0x8d, 0x0c, 0x45, + 0xab, 0xd7, 0x47, 0x8e, 0x58, 0xe2, 0xf5, 0xe2, 0x1c, 0x37, 0xcb, 0x19, 0x40, 0x08, 0xa6, 0x80, 0x50, 0x82, 0x67, 0x48, 0x6b, 0xde, 0x6b, 0xa9, 0x61, 0x8d, 0xd5, 0x8b, 0xbc, 0xd8, 0x29, 0xf9, + 0xd1, 0xbe, 0xb9, 0x30, 0x5f, 0x33, 0x09, 0x9d, 0x7e, 0xe2, 0xf9, 0x81, 0xdd, 0xa6, 0xff, 0x6c, 0x10, 0xe6, 0x0d, 0xf4, 0x17, 0x34, 0x7c, 0x9d, 0x1b, 0x23, 0x41, 0xc0, 0x13, 0x55, 0x2c, 0x1b, + 0xb7, 0x73, 0xb8, 0x02, 0x27, 0xe9, 0xa3, 0x0d, 0x0b, 0xd3, 0xc2, 0xab, 0x30, 0x2c, 0xf6, 0x85, 0xd3, 0xe1, 0x67, 0x66, 0xf6, 0x41, 0x4d, 0x78, 0xb4, 0xb8, 0x3f, 0x6f, 0x62, 0xf0, 0x06, 0xf4, + 0x65, 0x4d, 0xaf, 0xc3, 0xcb, 0x52, 0x7e, 0x68, 0x66, 0x00, 0x4f, 0x54, 0x07, 0x4e, 0x44, 0x2f, 0x50, 0xd6, 0xca, 0x69, 0xd5, 0xad, 0xe6, 0xc2, 0x9c, 0xdf, 0xe3, 0xe1, 0x7e, 0x0f, 0x3b, 0xc1, + 0xfd, 0xa5, 0xfc, 0x70, 0xce, 0x1f, 0x6b, 0x2b, 0x3f, 0x26, 0xab, 0x7e, 0x60, 0x5d, 0x8f, 0x38, 0xfc, 0x13, 0xfc, 0xe2, 0x15, 0xe8, 0x05, 0x2f, 0xd7, 0xe1, 0x85, 0xb7, 0x8f, 0x60, 0x15, 0x07, + 0xb0, 0xe3, 0x6c, 0x03, 0x03, 0xcd, 0xd4, 0x46, 0xf7, 0x43, 0x2f, 0xce, 0x3a, 0x4d, 0x91, 0x0c, 0xd3, 0x5f, 0xf2, 0xdd, 0x51, 0x12, 0x9a, 0xfc, 0xc8, 0x78, 0xed, 0xa0, 0xf1, 0xe5, 0x50, 0x2a, + 0xd6, 0x40, 0xd7, 0x07, 0x41, 0x8c, 0x2c, 0x44, 0x00, 0xe6, 0x39, 0x13, 0xab, 0x22, 0x35, 0x70, 0x6a, 0xb1, 0x5c, 0xf8, 0x62, 0x69, 0x08, 0x67, 0x1b, 0xf3, 0x4c, 0xdf, 0x5a, 0x2a, 0x47, 0xff, + 0x74, 0x13, 0x4c, 0x1a, 0x97, 0xb6, 0xe7, 0x7d, 0x53, 0x35, 0x1b, 0xfe, 0x14, 0xa3, 0x31, 0x7a, 0xd9, 0x6f, 0x50, 0x5f, 0xd6, 0xfd, 0x36, 0x9e, 0x5c, 0x60, 0xfd, 0xbc, 0x70, 0x48, 0x58, 0x82, + 0x38, 0x44, 0x9c, 0x8b, 0xb3, 0xaa, 0x15, 0x3c, 0xc1, 0x25, 0x1b, 0x78, 0x11, 0xa8, 0xce, 0xba, 0xd0, 0x21, 0xc0, 0x69, 0xb4, 0xd8, 0x4d, 0x6a, 0x45, 0xdd, 0x2b, 0x69, 0x04, 0x46, 0x56, 0x7f, + 0xd8, 0x90, 0x42, 0x99, 0x89, 0x01, 0xd1, 0x9a, 0x27, 0x79, 0x8f, 0x6e, 0x01, 0xfb, 0x60, 0xe1, 0x5b, 0xf0, 0x04, 0x93, 0x56, 0x6a, 0xa8, 0x3c, 0x63, 0x1a, 0xb1, 0xa9, 0xcb, 0x12, 0x7a, 0x13, + 0x7d, 0xf0, 0x25, 0xe3, 0xec, 0x91, 0x69, 0xe7, 0xcf, 0x2f, 0xf5, 0x8f, 0x80, 0x2f, 0xd9, 0x5b, 0xbf, 0x1f, 0xc7, 0x14, 0x1a, 0x7a, 0xc1, 0x00, 0xbc, 0x4c, 0xb0, 0x54, 0x12, 0xe5, 0x14, 0x3c, + 0x33, 0xd3, 0x03, 0xc3, 0xe6, 0xc4, 0x12, 0x70, 0x90, 0xa6, 0x91, 0x45, 0xc1, 0x26, 0xeb, 0x21, 0x9a, 0x2f, 0x2b, 0x83, 0x6d, 0x0d, 0x85, 0x05, 0x0b, 0x1f, 0xe5, 0x57, 0x6b, 0x6d, 0x1d, 0x1d, + 0xa3, 0x90, 0xab, 0xcb, 0x53, 0xd8, 0x73, 0x1e, 0x2e, 0x4a, 0xfd, 0x89, 0xd1, 0x8f, 0xbb, 0xce, 0x8c, 0xdd, 0x05, 0x81, 0xa4, 0x87, 0x90, 0xcd, 0x97, 0xfc, 0x88, 0x30, 0xca, 0x7b, 0x75, 0x67, + 0xee, 0xd3, 0xca, 0x87, 0x46, 0xe4, 0xff, 0x9c, 0x62, 0xf1, 0x0e, 0xf5, 0x8a, 0xb6, 0xeb, 0x78, 0xac, 0x52, 0x01, 0xad, 0x76, 0x53, 0x40, 0x95, 0x66, 0xca, 0x61, 0xe9, 0x0d, 0x09, 0x23, 0x50, + 0x4e, 0x4b, 0x6f, 0xdd, 0x1d, 0x09, 0x61, 0xac, 0xd7, 0x12, 0x34, 0xa4, 0xf8, 0x0d, 0x5e, 0xf3, 0x31, 0xba, 0x88, 0xb3, 0x39, 0x95, 0xfb, 0x78, 0x86, 0x31, 0x9c, 0x62, 0x05, 0xdb, 0x1c, 0xd8, + 0x58, 0xb1, 0xe1, 0x30, 0x07, 0x6c, 0x81, 0x19, 0x19, 0x1f, 0xb0, 0xd6, 0x32, 0x2e, 0xd7, 0x09, 0x55, 0x1a, 0xa4, 0xa7, 0xde, 0x5e, 0x11, 0x5f, 0x2b, 0x6d, 0x3e, 0xf2, 0xcf, 0x3c, 0x75, 0x6e, + 0x3e, 0x80, 0x7e, 0x43, 0xc1, 0xfb, 0xc4, 0xc5, 0x4f, 0x33, 0xe2, 0xec, 0x58, 0xe2, 0x7c, 0x6b, 0xfa, 0x35, 0x5e, 0xb2, 0xbd, 0xd7, 0xb7, 0x5c, 0xec, 0xd5, 0x3e, 0x21, 0xd5, 0xfc, 0xb9, 0x71, + 0x96, 0xc4, 0x7e, 0xe7, 0xeb, 0xf3, 0x62, 0x08, 0xb7, 0x60, 0x48, 0x54, 0x1e, 0x74, 0xd6, 0xe3, 0xcc, 0xdc, 0xa4, 0x9d, 0xb5, 0x9d, 0x83, 0x02, 0x22, 0x86, 0x96, 0x96, 0xec, 0x7b, 0x02, 0x99, + 0x2e, 0x03, 0x3f, 0x5d, 0xfb, 0x3b, 0x77, 0x2e, 0x52, 0x44, 0x96, 0x35, 0x5b, 0xce, 0x78, 0xce, 0x98, 0x71, 0xaf, 0x24, 0xfd, 0xb7, 0x0e, 0xe8, 0x7b, 0x0d, 0xec, 0xff, 0x39, 0x9b, 0xeb, 0x0d, + 0xf4, 0x57, 0x1c, 0x7f, 0x9a, 0x1b, 0x6b, 0x7b, 0x75, 0x0c, 0x4f, 0xd9, 0x1f, 0xe6, 0x33, 0x46, 0x5f, 0xd2, 0xee, 0xec, 0xe0, 0xf3, 0x70, 0x9b, 0x9f, 0x56, 0xeb, 0x65, 0x69, 0x99, 0xb6, 0x3d, + 0xdd, 0x75, 0x6d, 0x1f, 0xaa, 0xbd, 0x0a, 0xba, 0x48, 0x1a, 0x10, 0x30, 0x95, 0x69, 0x82, 0xc5, 0xea, 0x53, 0xdd, 0x63, 0xb7, 0x69, 0xe9, 0x41, 0xb0, 0x9e, 0xd0, 0x6c, 0x98, 0xed, 0xc9, 0x6d, + 0x70, 0xb4, 0x65, 0x20, 0xdb, 0xda, 0x3b, 0xd9, 0xab, 0xc0, 0xcd, 0x53, 0x24, 0xfa, 0x40, 0x6d, 0xfb, 0xec, 0xb1, 0x7e, 0x24, 0xc3, 0xfd, 0xb9, 0xa9, 0xe8, 0x03, 0xdc, 0x2b, 0xfe, 0xde, 0x9e, + 0x2e, 0xb2, 0xdc, 0x08, 0xd3, 0xd1, 0x0a, 0x66, 0x5d, 0xd1, 0x27, 0x75, 0x53, 0x63, 0xd4, 0x4a, 0xf0, 0x87, 0x76, 0xa9, 0x6b, 0xfa, 0x29, 0x31, 0xea, 0xa8, 0x40, 0x28, 0x9c, 0x42, 0xdb, 0xdc, + 0x10, 0x11, 0x33, 0x5a, 0xe9, 0xda, 0x16, 0x69, 0xce, 0x02, 0xe8, 0x73, 0x18, 0xe1, 0x74, 0x1b, 0x1b, 0x3c, 0xc5, 0xa5, 0xbc, 0xc8, 0xac, 0x45, 0x58, 0x81, 0x1b, 0x3c, 0x80, 0x39, 0x1a, 0xc7, + 0xbd, 0x0e, 0xca, 0xe6, 0xbd, 0xb6, 0xec, 0x6f, 0xef, 0xb5, 0x7a, 0xe2, 0xbe, 0x88, 0x56, 0xd7, 0xbe, 0xca, 0x0f, 0x09, 0xf5, 0x99, 0x7e, 0x45, 0x9f, 0x41, 0xbf, 0x22, 0xe1, 0xf7, 0xc4, 0x04, + 0x19, 0xd7, 0xbb, 0x08, 0xa7, 0x91, 0xe0, 0x10, 0x1c, 0xe1, 0x2a, 0xf0, 0x15, 0x2b, 0x39, 0x57, 0xd6, 0x8a, 0xf3, 0xab, 0x72, 0x3d, 0xd3, 0xf8, 0xed, 0x66, 0xce, 0xc4, 0x6a, 0x98, 0xb7, 0x10, + 0x50, 0x38, 0xfe, 0xaa, 0x9c, 0xcb, 0xd6, 0x56, 0x2f, 0x0a, 0x3e, 0xac, 0xe3, 0xa1, 0x1b, 0x3a, 0xc8, 0x4a, 0x56, 0x27, 0x69, 0x40, 0xe3, 0xfd, 0x92, 0xf7, 0x56, 0xcd, 0x6e, 0xbf, 0x02, 0x9b, + 0x4c, 0xae, 0x50, 0x16, 0x81, 0xc1, 0x9f, 0x5c, 0x3e, 0x0f, 0xad, 0x01, 0xbf, 0x7e, 0x5b, 0xeb, 0x1f, 0x1d, 0xa7, 0xcf, 0x49, 0xa8, 0x8f, 0xd8, 0xfe, 0x13, 0x32, 0xd2, 0x27, 0xd0, 0x57, 0x7c, + 0x7e, 0x98, 0x18, 0x5b, 0x32, 0x05, 0x74, 0x30, 0x6b, 0x57, 0x73, 0x84, 0x35, 0x35, 0x76, 0xcd, 0xf2, 0x5c, 0x83, 0x11, 0xb5, 0x27, 0xf3, 0x2e, 0x58, 0x87, 0x2a, 0xdd, 0x0b, 0xa6, 0xd7, 0x70, + 0x7b, 0x65, 0xed, 0x1c, 0x7b, 0x3c, 0xa1, 0xe1, 0xd8, 0xcd, 0xc2, 0x24, 0x20, 0xf7, 0xb3, 0x42, 0x13, 0x42, 0x5f, 0xc5, 0x4e, 0xfd, 0xb4, 0x31, 0x6d, 0xd9, 0x97, 0x8b, 0x76, 0x58, 0x88, 0xf4, + 0xc6, 0xc9, 0x13, 0x0a, 0x73, 0x11, 0x0b, 0xb8, 0x77, 0x01, 0xf8, 0xe7, 0xe6, 0x1b, 0xd7, 0xc4, 0x73, 0xce, 0xf9, 0xdf, 0x60, 0xaf, 0xeb, 0x7f, 0x7d, 0x18, 0xeb, 0x9c, 0x57, 0x1d, 0xc1, 0xa1, + 0x37, 0x87, 0x0d, 0x0e, 0xa1, 0xbb, 0x18, 0x4b, 0xe6, 0x56, 0x87, 0x51, 0x6b, 0x7f, 0xb7, 0x12, 0x73, 0xac, 0xe7, 0x4e, 0xb5, 0x33, 0x58, 0xa7, 0xa2, 0x9a, 0x17, 0xfd, 0x3c, 0x6e, 0x9b, 0x7a, + 0x83, 0xe6, 0x2b, 0xd3, 0x73, 0x24, 0x14, 0x1f, 0x82, 0x88, 0x5b, 0xe1, 0xca, 0x9c, 0x2d, 0x25, 0x6b, 0xb9, 0x38, 0xb0, 0x4d, 0x7e, 0x9c, 0xae, 0xb6, 0xe7, 0xac, 0x4b, 0xd1, 0xa4, 0x2e, 0xc6, + 0x94, 0x07, 0x8a, 0xeb, 0x49, 0xe8, 0xe7, 0xaf, 0x95, 0x0d, 0xde, 0x8c, 0xb3, 0xdf, 0xa9, 0x4d, 0x4f, 0x91, 0xdb, 0xed, 0x57, 0x5c, 0xb1, 0x74, 0x3b, 0x7f, 0xd5, 0x9f, 0x46, 0x50, 0x5f, 0x52, + 0xcf, 0x93, 0x9e, 0x4a, 0xd1, 0x3e, 0x36, 0xe6, 0x0a, 0x20, 0xd7, 0x86, 0x97, 0x31, 0xa7, 0xb9, 0xec, 0x4a, 0x67, 0xdb, 0xd8, 0xaf, 0xeb, 0x52, 0xf0, 0xca, 0x74, 0xa1, 0xef, 0x96, 0x54, 0x77, + 0x84, 0x63, 0x2b, 0x5c, 0xfa, 0x07, 0x7f, 0x06, 0xad, 0x61, 0x9c, 0x38, 0xfa, 0x2d, 0x89, 0xbb, 0x83, 0x62, 0x9f, 0x7d, 0x0f, 0x3d, 0x82, 0xfa, 0xd0, 0x9e, 0xa0, 0xfa, 0xb4, 0x86, 0xe2, 0x6a, + 0x4d, 0x8e, 0x50, 0xc4, 0x6f, 0xad, 0x92, 0x3f, 0x09, 0x5a, 0xdf, 0x9c, 0x35, 0xec, 0x29, 0x63, 0xff, 0x2b, 0xcc, 0x57, 0x14, 0xbe, 0x9c, 0x32, 0x6c, 0x9c, 0xd1, 0xff, 0xec, 0xa7, 0xaa, 0xdd, + 0xf3, 0x3c, 0x8a, 0x5b, 0xe1, 0x9c, 0xb0, 0xf6, 0x51, 0x1a, 0x13, 0xe5, 0x1e, 0xc5, 0xa2, 0x8d, 0xb3, 0x49, 0x49, 0x29, 0xe9, 0xa6, 0xc2, 0x2e, 0x3b, 0xac, 0x58, 0x2c, 0x62, 0x3c, 0x16, 0x6d, + 0x22, 0x52, 0x0b, 0x0e, 0x54, 0x67, 0xda, 0xf5, 0x5a, 0x04, 0x32, 0x63, 0x2f, 0x59, 0xd1, 0xe2, 0x10, 0x5a, 0xc1, 0x39, 0x5a, 0xab, 0x79, 0x75, 0xda, 0x56, 0x98, 0x9f, 0xaa, 0xea, 0x73, 0x45, + 0x89, 0x3e, 0x91, 0xe1, 0x5b, 0x5e, 0xd6, 0x23, 0x0c, 0x3e, 0x2e, 0xa1, 0x8b, 0x3c, 0x2b, 0xa7, 0x5e, 0xcb, 0xe7, 0x5e, 0x07, 0x17, 0x85, 0x6e, 0x84, 0x84, 0xea, 0x4a, 0xd6, 0x42, 0x51, 0x8a, + 0x41, 0x8b, 0x6c, 0x38, 0xc0, 0xc4, 0xf3, 0x7a, 0x31, 0xa4, 0xa1, 0x60, 0xca, 0x5a, 0x9f, 0x20, 0x78, 0x19, 0xbb, 0x9e, 0xa5, 0x9d, 0x49, 0x24, 0x72, 0x5c, 0xd0, 0x08, 0x30, 0x01, 0x6c, 0x2c, + 0x49, 0x32, 0xd4, 0xd9, 0x41, 0xec, 0x74, 0xac, 0x14, 0xe2, 0x62, 0x6b, 0x70, 0xec, 0x7a, 0xb5, 0xcd, 0x21, 0x4e, 0x24, 0xf4, 0xd2, 0x27, 0x0e, 0x5b, 0x02, 0x81, 0xfb, 0x31, 0xe6, 0xcb, 0x3b, + 0x75, 0x64, 0x1e, 0x21, 0xe3, 0x29, 0xce, 0xf5, 0x09, 0xf8, 0x15, 0x2d, 0x9f, 0xa6, 0xc6, 0x36, 0x70, 0x44, 0x06, 0x7c, 0x35, 0x28, 0x9d, 0xb5, 0xb5, 0x29, 0x1a, 0x31, 0x89, 0xf3, 0x0c, 0xf7, + 0x14, 0x25, 0xc3, 0x16, 0xaa, 0xa6, 0x6a, 0x9b, 0x7d, 0x22, 0x2c, 0x4d, 0x53, 0x6b, 0x30, 0x04, 0xc3, 0x7d, 0x51, 0x5b, 0x65, 0xcb, 0x02, 0x52, 0x00, 0xab, 0x97, 0x6a, 0x1d, 0xc7, 0x0d, 0x32, + 0x3d, 0x0b, 0x30, 0xed, 0x30, 0x14, 0xe2, 0x2d, 0xfc, 0x30, 0x95, 0xd7, 0x55, 0x74, 0x2a, 0xfd, 0xad, 0x20, 0xdd, 0xf6, 0x30, 0x7f, 0xf9, 0x75, 0x97, 0x16, 0x4e, 0x0f, 0xd0, 0x40, 0x3c, 0x65, + 0xca, 0x7d, 0x87, 0xfa, 0xba, 0xfe, 0xcb, 0xf8, 0x12, 0xb8, 0x3b, 0x82, 0x19, 0x61, 0xf0, 0x2c, 0x0e, 0x0e, 0x21, 0xee, 0x93, 0x5a, 0x9f, 0xaa, 0xa5, 0xd7, 0x68, 0xa5, 0xbf, 0xde, 0x89, 0xc7, + 0x4e, 0x65, 0xe6, 0xbb, 0x41, 0x6b, 0x1a, 0xbe, 0x9b, 0x6f, 0x59, 0x02, 0x83, 0x81, 0x32, 0xb7, 0x48, 0x7a, 0xd3, 0x41, 0x10, 0x84, 0x89, 0xdb, 0x35, 0x86, 0x2a, 0x82, 0xcc, 0xa6, 0x02, 0xe5, + 0x72, 0xdd, 0xa6, 0xc4, 0x37, 0xd6, 0xde, 0xd2, 0x99, 0xd4, 0xe1, 0x0c, 0xf3, 0x7c, 0xce, 0xc7, 0x9e, 0x8c, 0xeb, 0x2f, 0xfd, 0xf1, 0x5e, 0xff, 0xf3, 0xa0, 0xc5, 0xaf, 0xc0, 0x3f, 0x61, 0xe6, + 0xc3, 0xdd, 0x3e, 0xa2, 0x36, 0xeb, 0x56, 0x87, 0xd2, 0x25, 0x98, 0x53, 0xd3, 0x52, 0x2c, 0x74, 0xa1, 0xa5, 0x3a, 0x98, 0xb1, 0xe4, 0xa9, 0xc8, 0xb8, 0x56, 0xbb, 0x51, 0x77, 0xab, 0x83, 0x78, + 0xa0, 0x39, 0xc4, 0x5b, 0x1d, 0x67, 0xd8, 0x80, 0x70, 0xe9, 0x81, 0xd3, 0x37, 0x3e, 0x8f, 0x93, 0x6a, 0xcb, 0xb7, 0x8c, 0xc0, 0xb0, 0xa0, 0xb1, 0xf0, 0x81, 0x35, 0x6f, 0x01, 0x01, 0xc5, 0x08, + 0x87, 0xf5, 0x5c, 0xc3, 0xa1, 0x4d, 0xec, 0x7b, 0xf7, 0x4e, 0xc6, 0x5b, 0x25, 0xa5, 0x47, 0x5a, 0xc7, 0x53, 0xdc, 0xf6, 0x02, 0xf4, 0xba, 0xfa, 0x6b, 0x50, 0xf4, 0xc8, 0x12, 0x90, 0x47, 0x75, + 0x67, 0x2c, 0x06, 0x84, 0xe4, 0x45, 0xa2, 0x07, 0x96, 0x7b, 0x03, 0xef, 0xd6, 0xb3, 0xda, 0x3f, 0x7b, 0x69, 0x37, 0x68, 0xb0, 0xbc, 0xda, 0x2c, 0x54, 0xa6, 0xb5, 0x95, 0xb5, 0x32, 0x2d, 0xa0, + 0xe5, 0xfc, 0x44, 0xea, 0xac, 0xb9, 0xc7, 0x41, 0x04, 0xf0, 0x67, 0xe2, 0xae, 0x5f, 0xd6, 0x8e, 0x48, 0xce, 0x36, 0x6b, 0x03, 0xb1, 0x41, 0x65, 0x9f, 0xa9, 0x65, 0x7f, 0x36, 0xe7, 0xbc, 0x49, + 0xcc, 0x46, 0x58, 0xf7, 0x7f, 0xa8, 0xf7, 0xf3, 0x07, 0xbe, 0xa3, 0xf7, 0xc2, 0x3c, 0xff, 0x28, 0xf3, 0xad, 0xfd, 0xd7, 0xb3, 0x54, 0xfb, 0xcd, 0x58, 0xe6, 0x0b, 0x20, 0x6e, 0xae, 0xcd, 0x2d, + 0xdf, 0x9c, 0x0e, 0x60, 0x6c, 0x70, 0xce, 0x3a, 0x92, 0x2b, 0x89, 0xb6, 0x05, 0x50, 0xb4, 0xdb, 0xe9, 0x61, 0xea, 0x1b, 0x47, 0x2a, 0x81, 0xb1, 0x59, 0xb9, 0xd5, 0x82, 0xe6, 0x08, 0x95, 0xf4, + 0xaa, 0x45, 0xc4, 0xd3, 0x6e, 0xab, 0x5a, 0x51, 0x6f, 0xed, 0x99, 0xe1, 0x8c, 0x16, 0xb8, 0x41, 0x50, 0xd3, 0xf5, 0x80, 0x33, 0xa5, 0x83, 0x6f, 0x21, 0x4e, 0x08, 0x50, 0x62, 0x24, 0x89, 0xfd, + 0x90, 0xb3, 0xfb, 0x94, 0xbd, 0xf5, 0x0d, 0xea, 0x2b, 0x22, 0xde, 0xb2, 0x74, 0x7f, 0xb4, 0xb8, 0x5e, 0xf8, 0x6c, 0xe8, 0x0d, 0x8e, 0xa0, 0xb7, 0xc7, 0x46, 0x41, 0x53, 0x73, 0x53, 0xe9, 0x9a, + 0x62, 0x16, 0xb3, 0x54, 0x8e, 0x32, 0xa2, 0x50, 0x5a, 0x4c, 0xf7, 0x4a, 0xd5, 0x12, 0x4b, 0x18, 0x64, 0xb9, 0xf0, 0xc0, 0x33, 0x1a, 0x39, 0x47, 0x2c, 0x38, 0x85, 0x7a, 0xd1, 0x73, 0x70, 0x16, + 0x1b, 0x36, 0xf4, 0xf9, 0xc4, 0xc6, 0x62, 0x47, 0x8a, 0x5e, 0x9b, 0x0a, 0x5b, 0x69, 0xc5, 0x6d, 0x52, 0x48, 0x81, 0xee, 0x51, 0xd3, 0x7b, 0x49, 0x9a, 0x7f, 0x54, 0x59, 0xb8, 0x42, 0x7d, 0x5d, + 0xf8, 0x65, 0x3c, 0x56, 0x45, 0x98, 0x81, 0x33, 0x99, 0x39, 0x0a, 0xfb, 0xbc, 0xf3, 0xdc, 0xf3, 0x71, 0x49, 0x6f, 0xcf, 0xbd, 0x14, 0x61, 0x1d, 0xac, 0xeb, 0x73, 0x69, 0xc6, 0x97, 0x21, 0x6b, + 0x43, 0x7b, 0x33, 0x2c, 0x05, 0x76, 0x21, 0xd6, 0x83, 0x5b, 0xc9, 0x6e, 0x10, 0x84, 0xd3, 0x36, 0x3a, 0xa9, 0xa1, 0x3c, 0x5b, 0xb3, 0xc8, 0x7e, 0x7f, 0xce, 0x8e, 0x78, 0x5c, 0xc7, 0xf5, 0x40, + 0x12, 0xcd, 0xa0, 0x41, 0x70, 0xd3, 0x72, 0xd1, 0x08, 0xa5, 0xfd, 0xcf, 0x28, 0xe6, 0x73, 0x35, 0xe0, 0x47, 0x9c, 0xe8, 0x29, 0x7e, 0xfc, 0x01, 0xf4, 0x15, 0x7f, 0x1f, 0x26, 0x2e, 0x5c, 0x69, + 0x04, 0x2f, 0x56, 0x01, 0x6e, 0xcb, 0x86, 0xab, 0x74, 0x8b, 0xca, 0xfd, 0xdc, 0xa9, 0x0d, 0x70, 0x51, 0x38, 0x1e, 0xe5, 0x1e, 0x4b, 0x8b, 0x69, 0x3b, 0x5d, 0x05, 0x48, 0xbb, 0xde, 0x1e, 0x4d, + 0x56, 0x5c, 0xcf, 0x1c, 0xe4, 0x28, 0x0e, 0x0d, 0x5c, 0x0c, 0xd3, 0x6c, 0x5a, 0x9c, 0x95, 0xd9, 0x59, 0x0a, 0x75, 0xf6, 0x1c, 0xef, 0x6b, 0x69, 0xb7, 0x89, 0xb1, 0xde, 0x5e, 0x00, 0x60, 0xdb, + 0x79, 0x29, 0x9f, 0x9a, 0xed, 0x08, 0x24, 0x3e, 0x6c, 0x38, 0x7b, 0x87, 0x45, 0xfd, 0x5c, 0x1e, 0xf0, 0x43, 0x41, 0xc5, 0x4b, 0x0c, 0x09, 0xf9, 0x37, 0x34, 0xc9, 0xfd, 0x73, 0xf3, 0xa5, 0x2f, + 0xcf, 0x7b, 0x2c, 0xff, 0x9d, 0xea, 0xd5, 0x7f, 0x10, 0xca, 0x16, 0xd7, 0x93, 0x93, 0x6f, 0x1f, 0xbe, 0x17, 0x44, 0x9f, 0x92, 0xbd, 0x5e, 0xc1, 0x5e, 0x77, 0xf3, 0xf5, 0x61, 0xac, 0xbc, 0xb5, + 0x51, 0x99, 0x2d, 0x76, 0xe0, 0xa7, 0xc5, 0x2e, 0x81, 0xf5, 0x53, 0xd7, 0x51, 0x04, 0x54, 0xb5, 0xfa, 0x61, 0xb6, 0x23, 0x24, 0x38, 0x1b, 0xc2, 0xdd, 0x42, 0xc2, 0xc0, 0xca, 0xef, 0x10, 0x77, + 0xbd, 0xf5, 0x6c, 0x4a, 0xcb, 0x28, 0xbe, 0x5a, 0x13, 0x90, 0x25, 0xb7, 0x0d, 0x56, 0x49, 0x7c, 0x68, 0x42, 0x8b, 0x4d, 0xa5, 0xb7, 0x14, 0x33, 0x73, 0x0c, 0x1a, 0xa9, 0x3d, 0x05, 0x38, 0x43, + 0x6e, 0x34, 0x26, 0x99, 0xfa, 0xf5, 0xa7, 0x7e, 0x7f, 0x35, 0x3c, 0x8d, 0x8e, 0xf7, 0xeb, 0xe1, 0xf5, 0x61, 0x2c, 0x3a, 0xca, 0x18, 0xeb, 0x22, 0x27, 0xda, 0xf1, 0xdc, 0xfa, 0x5c, 0x44, 0xfa, + 0x89, 0x90, 0x23, 0xae, 0x6e, 0x7d, 0x0d, 0xeb, 0xb6, 0xdc, 0xa2, 0x30, 0x22, 0x99, 0x00, 0xb6, 0xdc, 0x06, 0x4a, 0x84, 0x65, 0x47, 0x01, 0xa4, 0xbc, 0x37, 0x67, 0x8a, 0x76, 0x6c, 0x68, 0x36, + 0x0f, 0xab, 0xb3, 0x94, 0x21, 0x21, 0x86, 0x47, 0x05, 0x0f, 0x01, 0x21, 0xd9, 0x5a, 0x16, 0x33, 0x88, 0x55, 0xb7, 0xe3, 0xd8, 0x47, 0xe9, 0x26, 0x9f, 0xd0, 0xf1, 0xbb, 0xaa, 0xcf, 0x7d, 0x25, + 0xef, 0x19, 0x6b, 0xf2, 0x2b, 0x4c, 0x70, 0xf2, 0x36, 0x9a, 0x60, 0xe3, 0xec, 0xc7, 0xa7, 0xf2, 0x6c, 0xd5, 0xd4, 0xa6, 0x38, 0x5b, 0xf6, 0x6a, 0xae, 0xae, 0xb8, 0xa5, 0xa5, 0xf5, 0xec, 0xdc, + 0x36, 0xcb, 0x14, 0x5a, 0x08, 0x2a, 0x0d, 0x2c, 0x18, 0xca, 0x5e, 0xc5, 0xbd, 0x9f, 0x09, 0x91, 0x78, 0x3a, 0x9c, 0x95, 0x10, 0x47, 0x23, 0x4c, 0x83, 0x85, 0x55, 0xa8, 0x73, 0x7c, 0xa9, 0x1d, + 0x65, 0x76, 0xb3, 0x75, 0xb3, 0xcc, 0x5c, 0xb7, 0x61, 0xb5, 0x4d, 0x56, 0x29, 0xd3, 0xec, 0xbb, 0xed, 0x08, 0xc5, 0xf8, 0x43, 0x37, 0xf9, 0xb7, 0x8c, 0xe6, 0xbb, 0xa4, 0xf4, 0xb9, 0x25, 0xd2, + 0xa3, 0x8b, 0xe5, 0x19, 0x84, 0xbd, 0xc3, 0xbd, 0x20, 0xed, 0xfd, 0x69, 0x6c, 0x74, 0x8a, 0x1a, 0xcb, 0x1d, 0x48, 0xee, 0x4a, 0xab, 0xdd, 0x3b, 0xdd, 0x5a, 0x15, 0x1b, 0x8d, 0xd5, 0xc9, 0x68, + 0x1e, 0x54, 0xd6, 0x3e, 0x04, 0x33, 0x1e, 0xcc, 0x77, 0xa0, 0x83, 0x15, 0xd0, 0xcc, 0x74, 0xd4, 0x73, 0x0b, 0xeb, 0x4b, 0x45, 0x5e, 0x7b, 0x27, 0x41, 0x9a, 0x2d, 0xfb, 0xb5, 0x62, 0x00, 0xbb, + 0xa5, 0x2c, 0x4d, 0xbb, 0x6a, 0x6d, 0xa0, 0x31, 0x79, 0x6c, 0x8e, 0x8b, 0x3e, 0xf2, 0x64, 0x55, 0x1f, 0x13, 0x8b, 0xf1, 0xa5, 0xf5, 0xed, 0xaf, 0x7f, 0x51, 0x8f, 0xcd, 0x09, 0xd7, 0x5c, 0x6e, + 0x37, 0xf2, 0x33, 0x7b, 0xd2, 0x54, 0xf6, 0x0b, 0xd2, 0xfe, 0xd9, 0x72, 0x4c, 0xf7, 0xbe, 0xe0, 0x0d, 0x9d, 0x5f, 0xa6, 0xc7, 0xe2, 0x75, 0x23, 0x92, 0xa0, 0x4c, 0xe5, 0xa8, 0x91, 0x18, 0xd1, + 0xd2, 0xca, 0xe1, 0x74, 0x1d, 0x1d, 0x16, 0x36, 0x3d, 0xd3, 0x24, 0x7d, 0xab, 0x18, 0xc9, 0x3e, 0xda, 0x61, 0x0c, 0x0d, 0x6e, 0x73, 0xa9, 0x23, 0xcf, 0x5d, 0x78, 0x6c, 0x8e, 0x25, 0x6d, 0x50, + 0x4b, 0x09, 0xcb, 0xb6, 0xca, 0x59, 0x3d, 0xc3, 0xdb, 0xb4, 0xc0, 0x9a, 0xe3, 0xe0, 0x1f, 0x1d, 0xa8, 0x96, 0xd2, 0xaa, 0xb5, 0xa5, 0x1e, 0xf5, 0xda, 0x1b, 0x77, 0xe0, 0x9d, 0x04, 0xf5, 0x7b, + 0x58, 0x99, 0x7e, 0x2e, 0x11, 0x33, 0x16, 0x2d, 0x5f, 0xa1, 0x83, 0x93, 0x9b, 0xa9, 0xc9, 0x15, 0xf4, 0xcf, 0xf8, 0xb0, 0x74, 0x84, 0xa5, 0xb8, 0x8c, 0x76, 0x25, 0xdd, 0x6d, 0x53, 0x4d, 0xf3, + 0x78, 0x0a, 0x1c, 0xaa, 0xde, 0x4f, 0xf0, 0x9c, 0xd4, 0x06, 0x0d, 0x08, 0x36, 0x9c, 0xb7, 0x69, 0x32, 0x5c, 0x65, 0xcb, 0xa9, 0x28, 0x8a, 0x25, 0x5f, 0xad, 0x56, 0x87, 0x8e, 0xf6, 0xe6, 0xa8, + 0x8b, 0x7b, 0xa4, 0x87, 0xb8, 0xd1, 0x9c, 0x8a, 0x01, 0x1b, 0x04, 0x3d, 0x95, 0x9a, 0xed, 0xad, 0x26, 0xae, 0x0f, 0xf9, 0x98, 0x36, 0x66, 0xee, 0x5b, 0x03, 0x9e, 0x5f, 0xff, 0x82, 0xbe, 0xe6, + 0xbe, 0xdf, 0xcf, 0xce, 0xff, 0x9a, 0x89, 0xe8, 0x37, 0x93, 0x2b, 0x90, 0x6b, 0x32, 0xf2, 0x5b, 0x92, 0x3e, 0xf6, 0x88, 0xd4, 0xd3, 0xa2, 0x28, 0x1d, 0x3f, 0xff, 0xa6, 0xc7, 0xf7, 0x33, 0x19, + 0x37, 0xef, 0x50, 0x5f, 0x36, 0xe1, 0x6d, 0x7c, 0x71, 0x5e, 0x8c, 0x40, 0x7e, 0xd0, 0x20, 0x72, 0xd6, 0x5a, 0x39, 0x7b, 0x02, 0xd8, 0x95, 0x12, 0x68, 0xd3, 0xac, 0x9c, 0xef, 0x5b, 0x6f, 0xce, + 0x6c, 0x87, 0xb4, 0x5c, 0x66, 0x11, 0x91, 0xe9, 0x84, 0xe4, 0xca, 0x5c, 0xe6, 0x07, 0xb5, 0x90, 0xee, 0xc9, 0xd9, 0x01, 0xd2, 0xf1, 0xbc, 0x9a, 0xcd, 0x3c, 0xf7, 0x64, 0x2e, 0x80, 0x81, 0x1a, + 0x5c, 0x48, 0xdd, 0x31, 0x03, 0x67, 0xd1, 0xf0, 0x02, 0x0e, 0xf5, 0x80, 0xb7, 0xda, 0xd5, 0x88, 0xb8, 0xd7, 0x73, 0xf3, 0x56, 0x2c, 0xf7, 0x9b, 0xa8, 0xe0, 0xb4, 0x6a, 0x27, 0xae, 0xed, 0x46, + 0x8f, 0x48, 0x1a, 0x7f, 0x8a, 0xa4, 0xdf, 0xa1, 0xbe, 0xe0, 0xeb, 0x6d, 0x7c, 0xe9, 0x99, 0x3a, 0x02, 0x5f, 0xab, 0x02, 0xf7, 0x56, 0x10, 0x36, 0xcb, 0xd4, 0xa4, 0x1d, 0xf2, 0xd3, 0x4a, 0x55, + 0xd1, 0x52, 0xf7, 0xf7, 0x99, 0x07, 0xf2, 0xd0, 0xff, 0xcb, 0xda, 0x9b, 0x34, 0x2b, 0xab, 0x34, 0x6b, 0xa0, 0xf3, 0xf3, 0x2b, 0x76, 0xbc, 0x53, 0xae, 0x9b, 0x4e, 0x1a, 0x87, 0x08, 0x88, 0x8a, + 0x22, 0xad, 0x80, 0x83, 0x73, 0x83, 0x56, 0x40, 0xfa, 0x56, 0x88, 0xb8, 0xdf, 0x6f, 0xbf, 0xa1, 0xab, 0x5f, 0xea, 0x5a, 0xbc, 0x9e, 0x6f, 0xb0, 0xe3, 0xa5, 0xdb, 0xe9, 0xaa, 0xa7, 0xb2, 0xaa, + 0xb2, 0xb2, 0x32, 0xf3, 0xf1, 0x7d, 0x35, 0x3e, 0x19, 0xc6, 0xb1, 0x3b, 0x84, 0x80, 0x57, 0xc0, 0x1a, 0x9d, 0x14, 0x52, 0x47, 0x07, 0x80, 0xb7, 0xa9, 0xcc, 0x9d, 0x49, 0x77, 0xe6, 0x6c, 0x06, + 0x87, 0xc8, 0xc2, 0x0a, 0xa6, 0x01, 0x3c, 0x67, 0xb7, 0xf4, 0x79, 0x5a, 0xa8, 0x01, 0x67, 0x57, 0xe1, 0x08, 0x65, 0xed, 0xad, 0x38, 0x0e, 0x5f, 0xcb, 0x4c, 0x4c, 0x1f, 0xcf, 0x87, 0x89, 0x57, + 0x07, 0x99, 0xfb, 0xd3, 0xf9, 0xff, 0xdf, 0x6f, 0x50, 0x5f, 0x65, 0x82, 0x93, 0xb7, 0xab, 0xb1, 0xc5, 0x93, 0x42, 0x27, 0xa6, 0x96, 0x9e, 0x50, 0x08, 0x09, 0x4e, 0x0e, 0x8b, 0x3a, 0x3d, 0x40, + 0x1e, 0x00, 0x6f, 0x90, 0x5e, 0x5b, 0xb9, 0xed, 0x20, 0x64, 0x56, 0xc3, 0x6b, 0x53, 0x7d, 0x4e, 0xa1, 0xfb, 0x76, 0x09, 0xb6, 0xe2, 0x22, 0xf4, 0x16, 0x44, 0xe1, 0xcb, 0x71, 0xa7, 0x1d, 0x34, + 0x80, 0xa1, 0x66, 0xe2, 0xcc, 0x16, 0x8d, 0x95, 0x32, 0x83, 0x9a, 0xf8, 0x9c, 0x69, 0x19, 0xbd, 0x44, 0xd0, 0x6a, 0x8f, 0x8c, 0xb1, 0x3f, 0x92, 0x9f, 0xea, 0x40, 0xe2, 0x4f, 0xa8, 0x4c, 0xf2, + 0x52, 0xfc, 0x31, 0x79, 0xa9, 0xf8, 0x88, 0x8f, 0x51, 0x14, 0x4d, 0x11, 0x4f, 0x5b, 0x8f, 0x55, 0x51, 0xb8, 0xdc, 0x6d, 0x43, 0xab, 0xac, 0xe6, 0xc2, 0x6a, 0x79, 0xe0, 0x37, 0xdc, 0xb1, 0xe5, + 0x1d, 0x70, 0x53, 0x46, 0x99, 0x4f, 0xa5, 0xf3, 0x78, 0x57, 0xd7, 0x3e, 0x66, 0x45, 0x72, 0x5b, 0x84, 0x32, 0x45, 0x4a, 0x95, 0x97, 0xda, 0x4e, 0x96, 0x39, 0x35, 0x8f, 0xbb, 0xb8, 0x5a, 0xe1, + 0x56, 0x71, 0x30, 0xe6, 0x14, 0x60, 0xd8, 0x27, 0xbe, 0x0e, 0x42, 0x69, 0xcc, 0xfe, 0xfc, 0xfa, 0x47, 0xba, 0x8f, 0x3c, 0xec, 0xf0, 0xbf, 0xd8, 0x33, 0x73, 0xcc, 0xab, 0xd0, 0x37, 0x0c, 0x5c, + 0x7b, 0xf2, 0x22, 0xe8, 0x77, 0x1c, 0x2a, 0x51, 0x9b, 0x36, 0x7b, 0xc2, 0x35, 0xe3, 0xb6, 0xd6, 0xd7, 0xe7, 0xae, 0x3b, 0x2f, 0x19, 0x48, 0x6c, 0xc2, 0x60, 0x2f, 0x84, 0x2c, 0xa1, 0xf6, 0x94, + 0x2d, 0x61, 0x8a, 0x7e, 0x66, 0xe8, 0xf9, 0x2c, 0xd1, 0xcc, 0x76, 0x77, 0x2c, 0x33, 0x69, 0xd7, 0x99, 0x92, 0xb4, 0xe3, 0xc5, 0x35, 0x49, 0xaf, 0x6c, 0x16, 0x80, 0x59, 0x75, 0x1f, 0xef, 0x32, + 0x1e, 0xd6, 0x68, 0x24, 0xd5, 0xd0, 0xa3, 0xd9, 0x8e, 0xc6, 0xe1, 0x2d, 0x41, 0xf5, 0xbe, 0x2a, 0xc0, 0xff, 0xa2, 0x7f, 0xbf, 0xeb, 0xfc, 0x90, 0xfb, 0x86, 0xc6, 0xf5, 0x66, 0xf2, 0x22, 0xee, + 0x77, 0x40, 0x0e, 0x8c, 0x09, 0xd8, 0x62, 0x82, 0x0d, 0xaa, 0xba, 0x00, 0xcc, 0x9c, 0x2e, 0x29, 0x6d, 0x96, 0xf2, 0x90, 0x76, 0x5c, 0xd1, 0xa6, 0xa8, 0x42, 0x52, 0xad, 0xc2, 0xc2, 0x41, 0x5f, + 0xb4, 0xd3, 0x0a, 0x00, 0x54, 0xe1, 0xe4, 0x1c, 0xf7, 0x96, 0x0a, 0x1d, 0x71, 0x60, 0x2a, 0x23, 0xcd, 0x6a, 0xba, 0x8d, 0xa4, 0x68, 0xe8, 0xab, 0xe5, 0x1c, 0x1e, 0xce, 0x8d, 0xbe, 0xc1, 0xa0, + 0x60, 0xb0, 0x3c, 0x23, 0x7c, 0x2e, 0x9e, 0xe1, 0x43, 0x55, 0xde, 0xf4, 0xe2, 0xfe, 0xa4, 0xf2, 0x29, 0xa1, 0xe6, 0x1e, 0x90, 0xcf, 0xb1, 0x2d, 0xbf, 0x4b, 0xbd, 0xc2, 0xf8, 0x7a, 0x3d, 0x96, + 0x75, 0x79, 0x4d, 0xe4, 0x38, 0x1a, 0xc8, 0x21, 0x15, 0x75, 0xb0, 0xc0, 0xb0, 0x5d, 0x07, 0xeb, 0x44, 0x88, 0x12, 0xc0, 0xbc, 0x5f, 0x95, 0x3b, 0x7d, 0x87, 0x19, 0x92, 0x44, 0x0d, 0x07, 0x74, + 0xbf, 0x73, 0x36, 0x90, 0x28, 0xf4, 0x76, 0x97, 0xfb, 0xc9, 0x1e, 0x14, 0x20, 0x6c, 0x58, 0x50, 0x43, 0x27, 0xcd, 0x34, 0xa5, 0x67, 0x1d, 0x03, 0xaf, 0x51, 0x6d, 0x07, 0xf0, 0x98, 0x55, 0xcc, + 0xa5, 0xdd, 0x6a, 0xf9, 0x1c, 0x88, 0xb7, 0x6c, 0xf4, 0x2f, 0x39, 0x1c, 0xc4, 0x0f, 0x60, 0x86, 0x0f, 0xed, 0xb1, 0x4b, 0xeb, 0xff, 0xde, 0x7b, 0xf6, 0x26, 0xf4, 0x0d, 0xca, 0xb0, 0xaa, 0xaf, + 0x06, 0xc0, 0x08, 0xdf, 0xd9, 0xba, 0x8a, 0xd2, 0xd3, 0xd4, 0xee, 0x50, 0x73, 0x5d, 0x98, 0x83, 0xed, 0xf6, 0xf3, 0x50, 0xa8, 0x44, 0x7d, 0x29, 0xfa, 0x3b, 0x00, 0xd0, 0x38, 0x8e, 0x98, 0xce, + 0xe8, 0x73, 0x85, 0xe7, 0x1e, 0xdd, 0x60, 0xc6, 0x71, 0x9a, 0x96, 0x5e, 0x6a, 0xe1, 0xbb, 0xfd, 0x79, 0x67, 0x9e, 0x4b, 0x49, 0x2d, 0xba, 0x0e, 0x5a, 0x27, 0x5d, 0x0d, 0xc8, 0x9e, 0x4f, 0x96, + 0xc7, 0x63, 0x93, 0x9c, 0xd4, 0xcd, 0x30, 0x1b, 0x73, 0xd2, 0x9a, 0xfc, 0x34, 0x2e, 0x9f, 0x50, 0xa7, 0xeb, 0x70, 0x7c, 0x19, 0x86, 0x23, 0x14, 0xa8, 0xe2, 0x4e, 0xe2, 0x19, 0xd8, 0x47, 0xdb, + 0x3a, 0xa1, 0xf0, 0xad, 0x81, 0x10, 0x19, 0x35, 0x5d, 0xcc, 0x17, 0xec, 0x66, 0x41, 0x1f, 0x0e, 0x53, 0x65, 0x6a, 0x14, 0x1e, 0xb7, 0x33, 0xe8, 0x16, 0x27, 0x6b, 0x15, 0x88, 0x6c, 0xb4, 0x3d, + 0x81, 0x72, 0x6f, 0xf1, 0xba, 0x08, 0x89, 0x2a, 0xdf, 0xeb, 0x75, 0xb2, 0x51, 0xb6, 0x90, 0x0d, 0x58, 0xae, 0xa6, 0xb2, 0xad, 0x5d, 0xc1, 0x22, 0x6b, 0x2d, 0x91, 0x1b, 0x97, 0xe1, 0xf7, 0x0a, + 0xb6, 0xf7, 0x7b, 0x1c, 0x7d, 0x22, 0xf5, 0xef, 0x8b, 0x64, 0x70, 0xf2, 0xf5, 0xfe, 0x4a, 0x05, 0x3a, 0x22, 0x19, 0xd0, 0x6f, 0x53, 0x63, 0x56, 0x1f, 0x6c, 0x99, 0xd0, 0x7d, 0x9a, 0xc3, 0xe6, + 0x54, 0x8f, 0xf6, 0x3b, 0x30, 0xa5, 0x37, 0x7d, 0xb4, 0xd7, 0x19, 0x7c, 0x7b, 0x0c, 0xd8, 0x02, 0x1a, 0xb0, 0x05, 0xe3, 0x0b, 0xc0, 0xc1, 0xc8, 0x37, 0xba, 0xb0, 0x52, 0xe7, 0xae, 0x1d, 0xfa, + 0x67, 0xe9, 0x24, 0x21, 0x98, 0x67, 0x97, 0x30, 0xce, 0x41, 0x02, 0xe1, 0xc9, 0xfa, 0x3a, 0xac, 0x76, 0xce, 0x96, 0x5d, 0x72, 0xe8, 0x4d, 0xe4, 0xca, 0xe5, 0x4f, 0x4b, 0x1e, 0x1e, 0xa2, 0xa3, + 0x4f, 0x79, 0x46, 0x5e, 0x65, 0xbe, 0x36, 0x3c, 0xc9, 0xd2, 0x09, 0x3a, 0xce, 0x27, 0x72, 0x9c, 0x51, 0x07, 0x62, 0x99, 0x9c, 0x02, 0xe9, 0x54, 0x18, 0x27, 0xd9, 0x41, 0xa0, 0x0e, 0x38, 0xf8, + 0x12, 0x81, 0x3a, 0xcb, 0x8d, 0xcd, 0x92, 0x41, 0x2a, 0xda, 0xb5, 0xb5, 0xb0, 0x17, 0x35, 0xdd, 0x24, 0x87, 0x2a, 0xea, 0xb7, 0x01, 0x7f, 0x9a, 0x6d, 0xac, 0x48, 0x82, 0x08, 0x0d, 0xd3, 0xce, + 0x08, 0x19, 0xb7, 0x8b, 0xe8, 0x80, 0x19, 0xc4, 0xb2, 0xd5, 0x65, 0xf8, 0x3c, 0x68, 0x64, 0xb4, 0xdc, 0x3f, 0x37, 0x71, 0x7c, 0x22, 0x1e, 0x7f, 0xa9, 0xbb, 0xf6, 0xc5, 0x53, 0xf7, 0xc6, 0xb9, + 0xf8, 0x52, 0x6e, 0xed, 0x4b, 0xd5, 0xaf, 0x7b, 0x61, 0xdd, 0x7f, 0x6e, 0x4b, 0xa8, 0x7f, 0xcf, 0x83, 0xfc, 0xc6, 0x60, 0x91, 0x57, 0x75, 0xe9, 0x79, 0xff, 0x96, 0x5e, 0xd2, 0xbf, 0xcf, 0x59, + 0x5f, 0x2a, 0x3c, 0x7c, 0xab, 0x0d, 0xf6, 0x25, 0xeb, 0xb5, 0x0a, 0x93, 0x3c, 0xf6, 0x26, 0x4d, 0x7e, 0x8d, 0x6b, 0x49, 0xb3, 0x8f, 0x1c, 0x86, 0x3b, 0xdb, 0xa4, 0x26, 0xcf, 0xb3, 0xb2, 0xae, + 0x26, 0x4e, 0x16, 0xbf, 0x56, 0x90, 0xc3, 0x6e, 0x6a, 0x8d, 0x65, 0xcd, 0xa7, 0xbf, 0xf3, 0xcb, 0xab, 0x26, 0x75, 0x3d, 0xbf, 0xb2, 0xfc, 0x0f, 0x47, 0xca, 0x5f, 0x51, 0x1a, 0x7c, 0xe7, 0xae, + 0xfc, 0xe7, 0x46, 0xff, 0xbe, 0xa2, 0x3b, 0x5e, 0x07, 0xbf, 0x72, 0x58, 0x5e, 0xe5, 0x7c, 0xd1, 0xbf, 0x7f, 0x1e, 0xe9, 0x20, 0xbd, 0x88, 0x06, 0xd3, 0xa4, 0xc2, 0xa9, 0x1a, 0xf8, 0xa1, 0xd4, + 0x86, 0x43, 0xb9, 0x90, 0xbc, 0x56, 0x55, 0x8d, 0x65, 0x9d, 0xd2, 0x85, 0xee, 0x7b, 0xc4, 0x19, 0xa6, 0x82, 0x23, 0x5b, 0x39, 0xea, 0x80, 0x1f, 0xec, 0x8d, 0xed, 0x67, 0x1b, 0x79, 0x23, 0x36, + 0x47, 0x55, 0xea, 0xe7, 0x75, 0x80, 0xfb, 0xe4, 0x81, 0x95, 0xf7, 0x9a, 0xd2, 0xeb, 0xcb, 0x05, 0x03, 0x12, 0x7a, 0x33, 0xad, 0xe1, 0x2f, 0x4c, 0x68, 0xff, 0xdc, 0xd7, 0xc3, 0x7f, 0x1e, 0xea, + 0xe2, 0x3f, 0xef, 0x13, 0xf2, 0xb7, 0xd0, 0x83, 0x7f, 0xde, 0xd7, 0xaf, 0x7f, 0x3e, 0xe3, 0xfd, 0xea, 0x2c, 0xf6, 0x63, 0xeb, 0x67, 0x68, 0xbf, 0x6a, 0xc2, 0x78, 0x68, 0xdf, 0x84, 0xbf, 0xe6, + 0xa1, 0x5d, 0x2e, 0xaf, 0x03, 0x1c, 0xfa, 0x1d, 0x60, 0x78, 0x52, 0xbb, 0xb2, 0x86, 0xd2, 0xdc, 0xa1, 0x0c, 0xd7, 0x7a, 0xe2, 0x0b, 0x9c, 0x1f, 0x67, 0x4b, 0x92, 0x88, 0xf7, 0x4d, 0x0b, 0x3d, + 0x84, 0xe8, 0x6e, 0x13, 0x6f, 0x14, 0xf7, 0x51, 0x43, 0xbf, 0xab, 0xf3, 0xf8, 0x86, 0x7e, 0xfd, 0x09, 0x70, 0xf2, 0xed, 0xc1, 0x04, 0xbb, 0xa9, 0x6f, 0xf7, 0xcf, 0x23, 0xad, 0x92, 0xa2, 0x7d, + 0xd4, 0xb9, 0xc6, 0xaa, 0x9e, 0x42, 0xe4, 0x76, 0x15, 0x52, 0x05, 0x6d, 0x4c, 0x33, 0x8d, 0xaf, 0x8e, 0x1a, 0xc2, 0x16, 0x14, 0x37, 0x54, 0x88, 0x98, 0x9f, 0x92, 0xa9, 0x25, 0x99, 0x76, 0x94, + 0x00, 0x07, 0x56, 0x67, 0x1d, 0x7d, 0xaa, 0xf8, 0x0b, 0x41, 0x2d, 0xa7, 0xcd, 0x56, 0x38, 0x24, 0x16, 0xe4, 0xf5, 0x53, 0x1f, 0x8b, 0x8f, 0x9b, 0xf2, 0x34, 0x87, 0x2c, 0x03, 0x92, 0xb6, 0xd9, + 0x0f, 0x14, 0x19, 0x23, 0xb5, 0xea, 0x93, 0x9e, 0xbc, 0x24, 0x63, 0x43, 0x0f, 0x74, 0xeb, 0x7f, 0x3e, 0xff, 0xfb, 0xb1, 0x76, 0xe4, 0x3f, 0x26, 0xad, 0xfc, 0xfd, 0x4e, 0xe6, 0x22, 0xf1, 0xba, + 0x6c, 0xe4, 0xf5, 0xa8, 0xd8, 0x2a, 0x78, 0x62, 0xbb, 0x50, 0xd0, 0x2a, 0xd9, 0x59, 0x32, 0x1a, 0xc5, 0x49, 0xd1, 0x7d, 0xe0, 0x87, 0x09, 0x89, 0x9a, 0x2b, 0x1c, 0x98, 0x3e, 0x33, 0xed, 0x5b, + 0xb6, 0x5d, 0x5e, 0xbf, 0x7d, 0x94, 0xb7, 0x91, 0x66, 0x65, 0x62, 0xc5, 0xe1, 0xe0, 0xfd, 0x14, 0x92, 0x8d, 0x3e, 0xe5, 0xfa, 0xf8, 0x2a, 0xfa, 0x0a, 0xc3, 0xe7, 0x07, 0x77, 0xc6, 0xd8, 0x5d, + 0x55, 0xc3, 0xbd, 0x43, 0x85, 0x6d, 0x2a, 0x54, 0xaf, 0xe9, 0xb0, 0x5a, 0xea, 0xf9, 0x4c, 0x41, 0x38, 0xad, 0x27, 0xdd, 0xe2, 0x94, 0x73, 0xe1, 0x74, 0xbe, 0x57, 0x06, 0x94, 0xb3, 0x8a, 0x90, + 0xc5, 0xbd, 0xa1, 0xb1, 0x21, 0x0c, 0x46, 0x58, 0x65, 0xa8, 0x0d, 0xad, 0xd3, 0xe6, 0x38, 0x8d, 0xaf, 0x78, 0x5b, 0x3a, 0x99, 0x88, 0x98, 0xda, 0x60, 0xc2, 0x4c, 0x75, 0x33, 0x8b, 0x68, 0xb9, + 0x73, 0xba, 0xcd, 0x98, 0x73, 0x96, 0x1b, 0x76, 0xa7, 0x07, 0x5e, 0x8e, 0x67, 0xa2, 0xc8, 0xbe, 0xca, 0x06, 0x27, 0xdf, 0x1e, 0x4c, 0x5e, 0xc4, 0xfe, 0x0e, 0x8e, 0x87, 0x25, 0xf4, 0x3a, 0x56, + 0x96, 0x44, 0x9e, 0x51, 0x82, 0x4f, 0x93, 0x03, 0xa9, 0xcc, 0xaa, 0x99, 0x82, 0xac, 0x04, 0x0c, 0x9c, 0x1e, 0x6c, 0xd4, 0x3a, 0xa0, 0xa8, 0x8f, 0x55, 0xa4, 0x59, 0x64, 0xd6, 0x40, 0x2f, 0x06, + 0x61, 0x13, 0x67, 0x1b, 0x8d, 0x2c, 0xb1, 0x3d, 0xcd, 0x01, 0x1c, 0xa1, 0x67, 0xc5, 0xa6, 0xa5, 0xa8, 0x43, 0xb6, 0xdf, 0x3a, 0x3d, 0x5a, 0xe7, 0x20, 0x6a, 0x40, 0x62, 0x7c, 0x63, 0x59, 0x7e, + 0x66, 0x9a, 0x7d, 0xe4, 0xea, 0xf9, 0xfb, 0xbd, 0xed, 0xbb, 0xd4, 0x4f, 0xcd, 0xaf, 0xc6, 0x9e, 0xa3, 0xa2, 0x4e, 0xcf, 0x54, 0xfd, 0xf2, 0x58, 0x27, 0x21, 0xb1, 0x22, 0x18, 0x5f, 0x51, 0x56, + 0xc8, 0x86, 0xc9, 0x71, 0x85, 0x47, 0xe2, 0xae, 0xad, 0xed, 0x23, 0x94, 0x43, 0x32, 0xec, 0x41, 0x72, 0xab, 0x16, 0x0b, 0xcc, 0xf1, 0xb8, 0x33, 0xc0, 0x23, 0xae, 0xaf, 0x44, 0x09, 0x6c, 0xf3, + 0xcc, 0x76, 0x4f, 0x2f, 0x58, 0x86, 0x92, 0xda, 0x1e, 0xc8, 0x48, 0x07, 0xb7, 0x88, 0x7d, 0x13, 0xed, 0x5c, 0xf7, 0x49, 0xd3, 0xea, 0xe7, 0xe3, 0xd2, 0x7b, 0xac, 0xa9, 0x3f, 0x96, 0x40, 0xfb, + 0xca, 0x18, 0xf6, 0x08, 0xef, 0xbf, 0x37, 0x63, 0x3f, 0xc9, 0xfd, 0x40, 0xfc, 0x72, 0x37, 0x36, 0x6a, 0x5f, 0x68, 0x28, 0x56, 0xd1, 0x76, 0xda, 0xb6, 0x8c, 0x57, 0xc6, 0xce, 0x5f, 0xf2, 0x03, + 0x83, 0xdb, 0xb9, 0xd8, 0xa0, 0xb5, 0x59, 0xa3, 0xe7, 0x36, 0x12, 0x5c, 0x79, 0x25, 0x01, 0x0b, 0x4f, 0x85, 0x62, 0xc1, 0x9e, 0xf2, 0xa4, 0x2e, 0x13, 0x10, 0x6d, 0x31, 0xe7, 0xa0, 0x11, 0x8e, + 0x8d, 0x82, 0x18, 0x1c, 0xc0, 0x45, 0xa7, 0x7e, 0xdb, 0xed, 0x86, 0x4a, 0xc0, 0x0e, 0xa7, 0x7a, 0x95, 0xf8, 0xc1, 0xe6, 0x26, 0x46, 0xf8, 0x3b, 0x1f, 0xda, 0x3d, 0x00, 0xa6, 0x4f, 0xed, 0xda, + 0xbe, 0x48, 0x7e, 0x87, 0xe0, 0xf5, 0xfe, 0x7a, 0xc2, 0x37, 0x62, 0x2f, 0x17, 0x9e, 0x55, 0x64, 0x83, 0xa9, 0x4b, 0xa3, 0xa2, 0xf2, 0x3e, 0xd4, 0x44, 0x93, 0x4f, 0x74, 0x00, 0x61, 0x97, 0xb9, + 0x61, 0x78, 0xd8, 0x2a, 0x44, 0xb7, 0x80, 0x3f, 0xf5, 0x00, 0x6b, 0xbd, 0xa0, 0x96, 0x56, 0x86, 0x59, 0xc9, 0x42, 0xd6, 0xf1, 0x35, 0xb4, 0xdb, 0xe1, 0x0e, 0xb8, 0xd1, 0xc8, 0xb9, 0x37, 0x25, + 0x9a, 0x9a, 0x3e, 0x23, 0xdc, 0x86, 0x9c, 0x05, 0x67, 0x6e, 0x8e, 0x1b, 0x4a, 0xc2, 0x37, 0x23, 0x0e, 0xaa, 0x7e, 0x61, 0xb5, 0xfe, 0x49, 0xcb, 0x3e, 0x7d, 0xf6, 0x2b, 0x95, 0xd8, 0x7d, 0xba, + 0xba, 0xfb, 0x7a, 0x9a, 0x4e, 0xbc, 0x73, 0x58, 0x4f, 0x62, 0xcf, 0x3a, 0x4d, 0xfc, 0xd2, 0xfb, 0xa9, 0xe0, 0xda, 0xdf, 0xaf, 0x1e, 0x37, 0xd2, 0x2f, 0x1d, 0xf6, 0xfd, 0xd9, 0xd8, 0xb4, 0x9e, + 0x7d, 0x43, 0x5b, 0x87, 0x03, 0x15, 0xc9, 0xde, 0x01, 0x6d, 0xb5, 0xee, 0xb8, 0x9b, 0x93, 0x9b, 0x33, 0x95, 0x55, 0xab, 0xa6, 0x64, 0x42, 0x4a, 0x87, 0x2a, 0x18, 0x2d, 0x57, 0xb0, 0xd9, 0x25, + 0x96, 0x08, 0x00, 0x51, 0xeb, 0x9c, 0x45, 0x82, 0xa0, 0xf4, 0x4c, 0x6a, 0xbd, 0xf4, 0xe0, 0xd9, 0x39, 0x4d, 0x21, 0x09, 0xa9, 0xd3, 0x30, 0xc8, 0x66, 0x95, 0x68, 0x8a, 0xdb, 0x28, 0x95, 0xa9, + 0x1c, 0xbc, 0x9d, 0x26, 0x5f, 0xd2, 0x27, 0xef, 0x8f, 0xd8, 0x67, 0x72, 0x25, 0x2e, 0x02, 0xaf, 0xcd, 0x76, 0xbc, 0x09, 0xfc, 0x7b, 0x5e, 0x04, 0x3c, 0xd1, 0x99, 0xca, 0xca, 0x51, 0x5d, 0x5f, + 0x6a, 0x95, 0xbc, 0xab, 0x16, 0xb3, 0x74, 0x41, 0xe3, 0x04, 0x86, 0x1a, 0xd6, 0x8c, 0x7d, 0x66, 0x66, 0xfb, 0x35, 0xeb, 0xf3, 0x3e, 0x23, 0xce, 0x23, 0x57, 0xd3, 0x13, 0xcb, 0xe4, 0xad, 0xfc, + 0x0b, 0x1e, 0xb7, 0x4f, 0xc7, 0xa6, 0xcf, 0xd8, 0x84, 0x71, 0xb0, 0x93, 0xa0, 0x89, 0xd2, 0x42, 0xc8, 0x78, 0xe8, 0x80, 0x0b, 0xe2, 0x40, 0x81, 0x69, 0xe0, 0x4b, 0x29, 0x0b, 0x91, 0x07, 0x75, + 0xa9, 0x0c, 0x43, 0xa4, 0x6e, 0x3b, 0xef, 0x68, 0x63, 0xc2, 0x2c, 0x9b, 0x53, 0x14, 0x95, 0x9f, 0x51, 0x7f, 0xd6, 0x20, 0x32, 0xe8, 0xa3, 0x7b, 0xce, 0xa2, 0x68, 0x55, 0x8a, 0x70, 0x69, 0x9d, + 0x72, 0x9a, 0x6f, 0xc0, 0xd9, 0xa2, 0xae, 0x0b, 0x7f, 0x44, 0xf8, 0xcd, 0xe7, 0xc3, 0xb8, 0x3f, 0x3f, 0x71, 0x55, 0xdc, 0x29, 0x0b, 0xf4, 0xd0, 0x1e, 0xfd, 0x6b, 0x38, 0xbf, 0x0b, 0x07, 0x27, + 0x37, 0x8f, 0xc6, 0xa5, 0x50, 0x2f, 0xa0, 0x46, 0xb1, 0x96, 0xc2, 0x5e, 0x10, 0x01, 0xd2, 0xab, 0xb0, 0x72, 0xa6, 0xe6, 0x56, 0x1a, 0xd4, 0x8e, 0x01, 0x8f, 0xa8, 0x1e, 0x77, 0xfd, 0xc9, 0xdf, + 0xb8, 0x8c, 0xfe, 0xde, 0x49, 0xf5, 0x21, 0xf6, 0xad, 0x59, 0x1f, 0x8c, 0x45, 0x23, 0xdc, 0x53, 0x1b, 0x66, 0x3d, 0x88, 0x7b, 0x96, 0x65, 0x45, 0x19, 0xe8, 0xa7, 0xe4, 0x30, 0x43, 0x29, 0x88, + 0x75, 0xa1, 0xde, 0xb0, 0xc9, 0x9c, 0x9a, 0xf7, 0x9c, 0x9e, 0x81, 0x27, 0xcc, 0x34, 0x5d, 0xf3, 0x98, 0x9b, 0x08, 0x88, 0xb0, 0xd5, 0xae, 0x3a, 0x55, 0xeb, 0xb2, 0x20, 0xe2, 0xdd, 0xf2, 0x5c, + 0xf6, 0xe5, 0x7e, 0x97, 0xc2, 0x5e, 0xc4, 0xe1, 0x19, 0x95, 0x93, 0x56, 0xd0, 0xee, 0x56, 0x12, 0x43, 0x56, 0x63, 0xce, 0x8f, 0xf2, 0xd0, 0xc9, 0x7e, 0x72, 0x78, 0x5f, 0xf4, 0xfa, 0x89, 0xae, + 0x7e, 0x93, 0x7a, 0x01, 0xe3, 0xed, 0xfa, 0x5a, 0x4f, 0x6f, 0xc4, 0x42, 0xbf, 0xd6, 0xd0, 0xda, 0x5b, 0xaa, 0x42, 0x94, 0xb0, 0xc8, 0x9e, 0xe6, 0x16, 0x43, 0x63, 0x92, 0xac, 0x31, 0xd0, 0xcc, + 0xbe, 0x63, 0x8b, 0x39, 0x62, 0x91, 0x7e, 0xb5, 0x6a, 0x3b, 0x4b, 0xa9, 0x97, 0x01, 0xa5, 0xaf, 0x59, 0x6f, 0xef, 0xc2, 0x19, 0x2c, 0x31, 0x24, 0x44, 0x6b, 0x38, 0x70, 0x70, 0x59, 0xc3, 0x50, + 0x36, 0xb6, 0x52, 0x35, 0x9b, 0x6e, 0x1d, 0x9d, 0xe8, 0xb9, 0x5e, 0xc8, 0x92, 0xb6, 0x1f, 0x63, 0x72, 0xbf, 0x96, 0xb0, 0xbf, 0x07, 0x03, 0xf9, 0x2f, 0x3c, 0x7d, 0x0a, 0x87, 0x34, 0xbb, 0x42, + 0x90, 0x66, 0x93, 0x17, 0x11, 0xbf, 0x37, 0x9f, 0xdc, 0x98, 0x42, 0x4b, 0xcc, 0x79, 0xdd, 0x50, 0x7c, 0x05, 0x38, 0xe1, 0x19, 0xeb, 0xe0, 0x99, 0xe3, 0xf4, 0xd8, 0xc6, 0x02, 0x0a, 0xa4, 0x12, + 0x3b, 0x0d, 0x2d, 0x90, 0x38, 0x52, 0x0d, 0x8c, 0x3a, 0x9c, 0x88, 0x16, 0xc0, 0x4e, 0x02, 0x83, 0x64, 0x98, 0x4e, 0xcc, 0xa6, 0x8b, 0x5e, 0xb6, 0x8a, 0xc0, 0xc2, 0x99, 0xb5, 0x15, 0x25, 0x27, + 0x41, 0xae, 0xf4, 0x5a, 0xcc, 0x17, 0xfd, 0x56, 0x1b, 0x53, 0x3e, 0xdb, 0xaa, 0xb3, 0x24, 0x74, 0x26, 0x55, 0xec, 0x79, 0xf9, 0xfd, 0x55, 0xfe, 0x2b, 0xe1, 0xca, 0x8b, 0xff, 0xea, 0xeb, 0xf2, + 0x7d, 0x67, 0x4d, 0xbe, 0xc3, 0x9a, 0x73, 0x85, 0xe3, 0x9d, 0x0d, 0xa1, 0x2e, 0xad, 0xb4, 0xca, 0xb3, 0x17, 0x7e, 0xd8, 0xf6, 0xe6, 0x47, 0xaf, 0x1f, 0x57, 0xb5, 0x3b, 0xa9, 0xbc, 0x32, 0xbc, + 0xee, 0xdf, 0xca, 0x17, 0xdb, 0x00, 0xbf, 0xf9, 0x72, 0x4c, 0x20, 0x43, 0xd1, 0x84, 0xce, 0xe9, 0x95, 0x17, 0x68, 0xd2, 0xa4, 0x5e, 0xe5, 0x58, 0xb9, 0xf7, 0x71, 0x3a, 0xff, 0xc5, 0x5c, 0x29, + 0x3d, 0x2b, 0x9e, 0xbc, 0x82, 0xf5, 0xe7, 0x25, 0x76, 0xe2, 0x7b, 0xc9, 0x93, 0x17, 0x22, 0x94, 0x6b, 0x64, 0xe3, 0x57, 0x9a, 0x85, 0xaf, 0xe3, 0xe6, 0xf2, 0x69, 0x96, 0x86, 0xce, 0xc4, 0xce, + 0xb2, 0xe4, 0xcf, 0x5d, 0xdf, 0x5f, 0x1d, 0x94, 0x9e, 0xf5, 0xa5, 0x0e, 0xed, 0x0f, 0xc9, 0xb6, 0x8f, 0x11, 0x7c, 0x34, 0xa3, 0xfd, 0xfd, 0xf2, 0xff, 0xe0, 0x37, 0xde, 0xd4, 0xf9, 0xf6, 0xcd, + 0xd8, 0xa0, 0x20, 0x87, 0x68, 0x33, 0x6c, 0x97, 0xeb, 0xd3, 0x6e, 0xa5, 0x4c, 0x91, 0x40, 0xdb, 0x3b, 0x2a, 0x26, 0xb3, 0xd5, 0x86, 0x3c, 0xc4, 0x51, 0xa5, 0xf9, 0xf3, 0xa8, 0xd8, 0x83, 0x1e, + 0x52, 0x2d, 0xce, 0xc9, 0x82, 0x5d, 0x1c, 0xc2, 0x02, 0x36, 0x36, 0x5a, 0x8e, 0xb1, 0xe6, 0xa6, 0x6e, 0x98, 0x25, 0x2e, 0xb2, 0xcb, 0x62, 0xa6, 0xc3, 0xde, 0x51, 0x2f, 0x64, 0x3b, 0xdd, 0x68, + 0x22, 0xb6, 0x68, 0x0e, 0xc9, 0x6e, 0x44, 0x5c, 0xc1, 0x05, 0xdf, 0xb7, 0x9e, 0x7a, 0xc3, 0xf8, 0xa6, 0x28, 0x7f, 0x95, 0xc7, 0x61, 0x8d, 0xfc, 0xf9, 0x25, 0xf6, 0xe0, 0x81, 0x52, 0xde, 0x03, + 0x1f, 0x7f, 0x8a, 0x8d, 0xf1, 0xde, 0x0f, 0xbc, 0x21, 0xff, 0xed, 0xf1, 0x04, 0x1f, 0xc7, 0xcb, 0xe8, 0x2c, 0x23, 0x51, 0xac, 0x58, 0xa0, 0x0d, 0x22, 0xb0, 0x4e, 0x03, 0xba, 0x07, 0xbb, 0x70, + 0x1b, 0xa0, 0x5b, 0x74, 0x40, 0x03, 0x30, 0x82, 0xb1, 0x61, 0x29, 0x19, 0x80, 0x32, 0xe3, 0x4e, 0xea, 0xfc, 0x58, 0xac, 0x1b, 0xb5, 0x59, 0x0f, 0xe6, 0x7a, 0x7a, 0xd4, 0x7a, 0x8a, 0xde, 0x04, + 0x8c, 0xb5, 0x26, 0x4e, 0xa7, 0x99, 0x6d, 0xcd, 0x42, 0x99, 0x49, 0xec, 0x25, 0x52, 0xaf, 0x35, 0x08, 0xdd, 0x85, 0x37, 0xfb, 0xa7, 0xd7, 0x41, 0xf8, 0x00, 0x0c, 0xe8, 0x5f, 0x18, 0x7e, 0xc6, + 0x93, 0xf5, 0x2a, 0xf5, 0x82, 0xc0, 0xeb, 0x20, 0x7f, 0x95, 0x34, 0xa2, 0xd9, 0x2e, 0xe7, 0xf9, 0xa0, 0x5b, 0xea, 0x8b, 0xac, 0x77, 0x19, 0x78, 0x5d, 0x6d, 0x87, 0x66, 0xe1, 0x93, 0x30, 0x04, + 0xa5, 0x87, 0x18, 0xe0, 0x54, 0xa0, 0xb7, 0x1c, 0x07, 0xb1, 0x59, 0xc7, 0x73, 0x31, 0x7f, 0x26, 0x47, 0xa7, 0xe9, 0x00, 0xe8, 0xf5, 0x42, 0x53, 0xe7, 0xcd, 0x4c, 0x0c, 0x76, 0xe1, 0x2c, 0x02, + 0x23, 0x3f, 0x99, 0x8b, 0x0d, 0x94, 0x6c, 0x59, 0x73, 0xda, 0xad, 0x5c, 0x6a, 0x41, 0x3e, 0x6a, 0xf6, 0xa7, 0xb9, 0xe7, 0xfe, 0x62, 0xfa, 0x4c, 0x40, 0xc2, 0x37, 0xd9, 0x9f, 0x40, 0x78, 0x7d, + 0x32, 0x96, 0x77, 0x08, 0x84, 0xf5, 0x03, 0x09, 0xec, 0xa5, 0x48, 0xc6, 0xad, 0x56, 0xdf, 0x1d, 0x97, 0x1e, 0x2b, 0xba, 0x84, 0xc2, 0x48, 0xc9, 0x42, 0x82, 0xe7, 0x58, 0x42, 0xc3, 0x9e, 0x6c, + 0x54, 0x74, 0x82, 0xa9, 0x56, 0x19, 0x0b, 0xc9, 0x19, 0xec, 0xe8, 0xca, 0xc2, 0x38, 0xd6, 0x3a, 0x73, 0x09, 0x84, 0xcd, 0x77, 0xb2, 0x5c, 0xf7, 0x1c, 0xc8, 0x9e, 0x41, 0xf4, 0x5c, 0xa0, 0x6a, + 0x23, 0xb7, 0x05, 0x46, 0x14, 0x37, 0xd1, 0x78, 0x5f, 0xe9, 0x27, 0xef, 0xce, 0x47, 0xd3, 0xa7, 0x3c, 0x08, 0x9f, 0x04, 0xbf, 0x60, 0xf0, 0x76, 0x37, 0x79, 0x11, 0xf8, 0x3b, 0x00, 0xc1, 0x42, + 0x43, 0x91, 0x82, 0xd0, 0x0e, 0x12, 0x36, 0xb3, 0xf7, 0x6b, 0x89, 0xd3, 0xea, 0x04, 0x5d, 0x21, 0x62, 0xb9, 0x46, 0x8f, 0x7a, 0x9b, 0xd1, 0xa7, 0x30, 0x36, 0x66, 0xd5, 0x02, 0xc6, 0xb1, 0x53, + 0x05, 0x17, 0x7e, 0x1c, 0x34, 0xc7, 0x3d, 0xed, 0xf1, 0x80, 0x02, 0xaf, 0xa3, 0xb5, 0xb9, 0x6c, 0xfb, 0x1a, 0xcd, 0xb0, 0x53, 0x84, 0x93, 0x40, 0x81, 0xda, 0x4e, 0x90, 0x95, 0x49, 0x94, 0x8e, + 0xa9, 0x7c, 0x58, 0xbb, 0xe1, 0xf1, 0x8d, 0x38, 0x07, 0x7a, 0xbc, 0xa5, 0xfd, 0x42, 0x81, 0x73, 0x5f, 0x7f, 0x9e, 0x32, 0x4d, 0xdf, 0xc5, 0xbe, 0xc0, 0xf6, 0x7a, 0x73, 0x0d, 0xad, 0x1e, 0x61, + 0x9a, 0xc6, 0xb1, 0x54, 0x6d, 0x37, 0x8a, 0xc6, 0x68, 0xa2, 0x3a, 0x9d, 0x46, 0x6e, 0xa9, 0x81, 0x3b, 0x94, 0x28, 0xe2, 0x34, 0xf4, 0xc3, 0x9a, 0x11, 0x81, 0x43, 0x57, 0x26, 0xc9, 0xc1, 0xc9, + 0x14, 0xbe, 0xdf, 0xf0, 0x6d, 0x7d, 0x38, 0xe7, 0xfd, 0x1e, 0x4a, 0x11, 0xd0, 0x66, 0x40, 0x61, 0x5a, 0xcf, 0x29, 0xea, 0x00, 0x1e, 0xd7, 0xac, 0x7b, 0xd0, 0x08, 0x7e, 0x5b, 0x5a, 0x19, 0x0f, + 0x03, 0x86, 0x49, 0x8d, 0xd8, 0xb4, 0x7c, 0xae, 0xd9, 0xfd, 0xe7, 0x66, 0xe5, 0xfd, 0x5c, 0xfb, 0xe6, 0xb5, 0xd0, 0xcd, 0x7d, 0x4c, 0xbf, 0x1c, 0xfd, 0x3d, 0x72, 0x67, 0x91, 0x7f, 0x0f, 0xea, + 0x87, 0xdc, 0x0b, 0xaa, 0x1f, 0x77, 0x57, 0x77, 0x16, 0xf9, 0x3b, 0xac, 0x04, 0xc1, 0x1c, 0xba, 0xb3, 0x94, 0x9c, 0xf9, 0xb4, 0x41, 0x2d, 0x19, 0x9b, 0x22, 0x1a, 0x60, 0x90, 0x8b, 0x3e, 0x17, + 0x06, 0xdb, 0x5f, 0x03, 0x34, 0x66, 0x48, 0xcc, 0x09, 0x6d, 0xf4, 0x48, 0x3f, 0xa7, 0x38, 0x8c, 0xc1, 0xd6, 0x6a, 0xcb, 0xd5, 0x81, 0x6e, 0xca, 0x86, 0x5a, 0xa8, 0x30, 0x8b, 0x65, 0xeb, 0xf6, + 0x08, 0xc4, 0x91, 0x65, 0x21, 0xbb, 0x75, 0x08, 0xec, 0xfd, 0x96, 0xde, 0x49, 0xe4, 0x28, 0x8b, 0xbf, 0x49, 0x7b, 0x27, 0x73, 0x1f, 0xfb, 0x4b, 0x9e, 0xa1, 0x4d, 0x7e, 0x13, 0x7a, 0xc1, 0xe2, + 0xf5, 0xf2, 0x6a, 0xee, 0x8f, 0x98, 0x95, 0x4a, 0x79, 0x0f, 0x0c, 0x12, 0x43, 0xd6, 0xfb, 0x45, 0x5f, 0x21, 0x78, 0x4c, 0x71, 0xf2, 0x4c, 0xd7, 0x1a, 0x65, 0x1a, 0x6a, 0x54, 0x7a, 0x5c, 0x2b, + 0xce, 0x16, 0x38, 0xc8, 0x0a, 0x5f, 0xb7, 0x31, 0x56, 0xf3, 0xde, 0x01, 0xa9, 0x31, 0xbb, 0x75, 0x85, 0x85, 0x2b, 0x2c, 0xe7, 0xfa, 0x6c, 0xa1, 0xcb, 0xd3, 0x63, 0xc3, 0x2d, 0xe3, 0x63, 0x52, + 0x1d, 0x60, 0x8e, 0x98, 0x2b, 0x09, 0xd2, 0xa9, 0x76, 0x73, 0x33, 0x41, 0x17, 0x8f, 0xd7, 0x67, 0xf8, 0x19, 0x6f, 0x5e, 0x71, 0x59, 0x8c, 0x8a, 0xcb, 0xe2, 0x0b, 0x8f, 0x72, 0xdc, 0xd5, 0x8c, + 0xb0, 0x1a, 0x10, 0xc4, 0x9a, 0x0f, 0x34, 0x73, 0xde, 0xd4, 0xfb, 0x25, 0x00, 0xec, 0x53, 0xd5, 0x1f, 0xce, 0xb1, 0xef, 0xf1, 0x18, 0x6d, 0x17, 0x59, 0x90, 0x2b, 0x45, 0xbe, 0x3e, 0x46, 0xb0, + 0x7e, 0x04, 0x1d, 0xc9, 0x56, 0x6a, 0x81, 0x1a, 0x50, 0xa1, 0x29, 0xe8, 0x0a, 0x6b, 0xf7, 0x40, 0x1e, 0xcd, 0x2b, 0x7e, 0x7a, 0x9e, 0xe6, 0xc2, 0x6c, 0x19, 0xef, 0x03, 0xa2, 0x74, 0x4c, 0x79, + 0x4c, 0x30, 0x65, 0x15, 0xba, 0xde, 0xc4, 0x09, 0xac, 0x34, 0xf5, 0x3e, 0xf8, 0xc5, 0x1f, 0x30, 0xe3, 0x3c, 0xb4, 0x8d, 0xef, 0x3b, 0x41, 0x9f, 0x49, 0x01, 0xbb, 0xff, 0x13, 0x17, 0x28, 0xef, + 0xbe, 0xb8, 0x66, 0xb7, 0x8f, 0x48, 0x0e, 0xab, 0x4d, 0x1a, 0x96, 0xe0, 0xe0, 0xd8, 0xcb, 0xcd, 0xf2, 0x18, 0x67, 0x7b, 0xd0, 0x34, 0x2a, 0xa4, 0x83, 0xb1, 0x26, 0x15, 0xf7, 0x01, 0x59, 0xf8, + 0x0d, 0x58, 0xd0, 0xaa, 0x1f, 0xa8, 0xa6, 0x95, 0x58, 0x1d, 0xe1, 0xf7, 0x41, 0x93, 0xf0, 0x16, 0xd2, 0x73, 0xb9, 0xab, 0x64, 0x24, 0xd1, 0x9a, 0x28, 0x52, 0xae, 0x9c, 0x38, 0x02, 0xa6, 0xbe, + 0x6e, 0x4a, 0x86, 0xb6, 0xad, 0x66, 0xec, 0xb2, 0xbd, 0x59, 0xd9, 0x7e, 0x21, 0xbb, 0x42, 0xbe, 0xc4, 0x35, 0x8c, 0x45, 0xe4, 0x13, 0xc9, 0xd5, 0x3b, 0xb9, 0xd5, 0x55, 0xd2, 0xef, 0xad, 0x26, + 0x07, 0xae, 0xe8, 0x73, 0x9f, 0x15, 0x22, 0x7a, 0x55, 0x70, 0xc1, 0xd1, 0x50, 0x33, 0x9a, 0xb4, 0xe6, 0x48, 0x49, 0x98, 0xe5, 0xdc, 0x00, 0x28, 0x89, 0xf2, 0x57, 0x62, 0x05, 0x6e, 0xe3, 0x13, + 0x30, 0xaf, 0x45, 0x75, 0xa8, 0x77, 0xad, 0xaa, 0x40, 0xb0, 0x20, 0xeb, 0x20, 0xca, 0x06, 0x38, 0xb4, 0x06, 0xac, 0x29, 0x19, 0xd7, 0x64, 0x51, 0xd1, 0x43, 0x58, 0x4a, 0x78, 0x9c, 0xd1, 0x7b, + 0x7f, 0x84, 0x4e, 0xd9, 0x7d, 0xfd, 0xe2, 0xe1, 0xbd, 0x09, 0xb4, 0x08, 0xbe, 0x14, 0xdb, 0xbc, 0x53, 0x62, 0xf2, 0x73, 0x69, 0xc7, 0xef, 0x75, 0x1c, 0xaf, 0x01, 0x10, 0x79, 0x98, 0x7b, 0x7f, + 0xde, 0xf7, 0x2c, 0x77, 0xd5, 0xf4, 0xd6, 0x8e, 0xbf, 0xaf, 0x9f, 0xd3, 0x67, 0x7a, 0xe3, 0xab, 0xec, 0x4b, 0xa7, 0x7c, 0x7d, 0x32, 0xb9, 0xca, 0xfd, 0xbd, 0x6f, 0x36, 0x27, 0xd0, 0x5f, 0xd1, + 0x4a, 0xbf, 0x0a, 0x32, 0xf7, 0xdc, 0xc3, 0x2b, 0x86, 0x47, 0x96, 0xd6, 0x70, 0xf2, 0xb8, 0x48, 0x49, 0xbc, 0x81, 0xd2, 0x0d, 0xc4, 0x3b, 0xba, 0xf5, 0x3a, 0x35, 0x83, 0x7a, 0xe0, 0xd9, 0x6a, + 0x2e, 0xae, 0xb3, 0x2e, 0x5e, 0xe1, 0x0b, 0x7c, 0x23, 0xda, 0x58, 0x5d, 0xac, 0xa4, 0xd5, 0xa6, 0xdc, 0xda, 0x67, 0x04, 0x51, 0xb0, 0x0c, 0xe5, 0x9a, 0xb5, 0xd5, 0x8a, 0x4d, 0x35, 0xa2, 0x6f, + 0x2c, 0xfb, 0xb2, 0x13, 0x73, 0xb2, 0xb4, 0x2e, 0xb3, 0xf8, 0x83, 0xe9, 0xf0, 0x5b, 0x3f, 0x7c, 0x14, 0x93, 0xbc, 0x6e, 0xa3, 0xbf, 0xec, 0x7a, 0x3f, 0x51, 0xa8, 0xa3, 0x37, 0x65, 0xc3, 0xdf, + 0xad, 0xfb, 0xab, 0x21, 0xf3, 0xc5, 0x96, 0xbf, 0x56, 0x00, 0xbd, 0x6c, 0x81, 0xff, 0xdf, 0x17, 0x32, 0xd7, 0x57, 0x9a, 0xf5, 0xab, 0x88, 0x87, 0xfd, 0xe8, 0x86, 0xe5, 0xa3, 0xb4, 0x3a, 0xf4, + 0xa9, 0xf0, 0xe5, 0x37, 0xa1, 0xaf, 0x3d, 0x77, 0xb9, 0x9c, 0xa0, 0xe3, 0xc2, 0x98, 0x83, 0x9d, 0x02, 0x91, 0xb3, 0x2c, 0x25, 0x65, 0xb7, 0x29, 0x5c, 0x3b, 0x68, 0x25, 0xec, 0x80, 0x12, 0x14, + 0xc4, 0x2a, 0x51, 0x55, 0x0c, 0x78, 0x91, 0xca, 0x8e, 0xef, 0x57, 0x5b, 0x0d, 0x9d, 0xce, 0xb0, 0x45, 0xa3, 0xba, 0x85, 0x92, 0x00, 0x84, 0x1d, 0xac, 0x91, 0xd9, 0xba, 0x5d, 0xed, 0xaa, 0x39, + 0xc3, 0xb2, 0xa9, 0x95, 0x62, 0x8c, 0xd8, 0xcc, 0x6a, 0x54, 0xcd, 0x66, 0x7b, 0x39, 0xde, 0x0e, 0xcf, 0x15, 0xf5, 0xf9, 0xec, 0x95, 0x7b, 0xe1, 0x4a, 0x7c, 0x60, 0xde, 0x7c, 0x73, 0x51, 0xdc, + 0xdf, 0x73, 0x3d, 0xb3, 0xe9, 0xf8, 0x2c, 0xf8, 0x05, 0xcb, 0xf7, 0xdb, 0xb1, 0x0c, 0x27, 0x18, 0xe1, 0x97, 0x25, 0xb7, 0x05, 0x77, 0xb4, 0xba, 0x29, 0x36, 0x3b, 0x2a, 0x80, 0x92, 0x60, 0x4f, + 0xcd, 0xf6, 0xf3, 0xed, 0xd2, 0x05, 0x66, 0x1a, 0x71, 0xb0, 0x11, 0x75, 0xb9, 0xe5, 0xdc, 0xb9, 0x96, 0x1d, 0xf6, 0xbb, 0x9a, 0xb3, 0xd7, 0x43, 0x74, 0xae, 0x4c, 0x8e, 0x59, 0xa3, 0xd4, 0x8c, + 0x32, 0x4d, 0x5a, 0x9c, 0x06, 0x29, 0xde, 0xc3, 0xea, 0xde, 0xb6, 0x76, 0xfe, 0xa0, 0xd7, 0x09, 0xc6, 0x2d, 0x6e, 0x27, 0x65, 0xef, 0xe8, 0x9d, 0xf3, 0x7f, 0xdf, 0x8b, 0xd3, 0xfe, 0xeb, 0xc7, + 0xd6, 0xf1, 0xf1, 0xd1, 0xe5, 0x33, 0xde, 0xcc, 0xfb, 0x3f, 0x71, 0x45, 0xe5, 0xde, 0x8b, 0x6b, 0x48, 0xe2, 0x88, 0xdd, 0xc8, 0x3a, 0x9c, 0xbb, 0xf2, 0xbc, 0x98, 0xc1, 0x7a, 0x6c, 0x12, 0x8d, + 0xbc, 0x86, 0xdc, 0x8a, 0x90, 0x01, 0x57, 0x83, 0x90, 0x10, 0xdf, 0xf0, 0x21, 0x59, 0xa2, 0xf3, 0x46, 0x0a, 0x04, 0x23, 0x05, 0x4e, 0x89, 0xb7, 0x11, 0x00, 0xd6, 0x5f, 0x06, 0x7e, 0x54, 0x6c, + 0xe5, 0xb0, 0x82, 0x87, 0xf5, 0x39, 0x8d, 0x1b, 0x92, 0x0c, 0x0a, 0x70, 0xea, 0x9e, 0x21, 0x11, 0xd9, 0x89, 0x28, 0x25, 0xca, 0xea, 0xee, 0x39, 0x7d, 0xfb, 0x6f, 0x1f, 0x22, 0xbf, 0x69, 0x8a, + 0x7f, 0xd9, 0xa4, 0xfd, 0x98, 0x42, 0xff, 0x5c, 0x21, 0x81, 0x3b, 0xf2, 0xaf, 0xdd, 0x71, 0xf3, 0x74, 0x6c, 0x89, 0x01, 0xc3, 0x87, 0x52, 0xdd, 0xc3, 0xe5, 0xca, 0x1b, 0xc2, 0xc5, 0xb6, 0x01, + 0xa8, 0x7c, 0x66, 0x87, 0xa1, 0x66, 0x27, 0x79, 0x5c, 0xe0, 0xca, 0x0c, 0xcc, 0x01, 0xa2, 0x23, 0x4c, 0x43, 0x04, 0xd7, 0xf3, 0x65, 0x50, 0x6a, 0x0c, 0xa3, 0x05, 0x9d, 0x05, 0xb4, 0x94, 0xd0, + 0x37, 0x76, 0x53, 0xf8, 0x07, 0x5d, 0x6d, 0x3d, 0x0d, 0x04, 0x19, 0x73, 0xcf, 0x55, 0x0c, 0x47, 0xc8, 0xfc, 0x06, 0x6c, 0xd9, 0x9b, 0x23, 0xba, 0xd7, 0xd6, 0xfd, 0x00, 0xc5, 0x6b, 0x22, 0xf3, + 0xdf, 0x9f, 0x55, 0xbd, 0x7e, 0x76, 0x45, 0xe1, 0x7a, 0x35, 0xf9, 0x2c, 0xee, 0x77, 0x00, 0x74, 0x72, 0xd3, 0x38, 0x4a, 0x9f, 0xf2, 0xda, 0x8a, 0x69, 0x66, 0x7d, 0x5c, 0x5a, 0x16, 0xd1, 0x78, + 0xfb, 0x03, 0x11, 0x38, 0x50, 0x43, 0x1d, 0xd7, 0xf3, 0xf3, 0xbe, 0x92, 0x14, 0x7e, 0x67, 0xec, 0xfa, 0xd8, 0x23, 0xad, 0x19, 0x5a, 0x18, 0x81, 0x33, 0x00, 0x06, 0x65, 0x1c, 0x48, 0x7b, 0x55, + 0x20, 0x2e, 0x1e, 0x4e, 0xd9, 0xc0, 0x75, 0x53, 0x9c, 0x6d, 0x6b, 0x00, 0x02, 0xb5, 0x8e, 0x3f, 0xe1, 0xcf, 0x91, 0x65, 0xdc, 0x94, 0x7f, 0xbb, 0xc7, 0x16, 0xfb, 0xf9, 0x14, 0xe7, 0x45, 0x63, + 0xf1, 0x47, 0xaa, 0x58, 0x35, 0xc9, 0xc3, 0x82, 0x31, 0xd0, 0x53, 0xae, 0xd1, 0x57, 0x99, 0x2f, 0x60, 0x5f, 0xae, 0x26, 0xd0, 0xef, 0xae, 0x4f, 0x78, 0x42, 0x7a, 0x11, 0x64, 0x7a, 0x12, 0xa7, + 0xe0, 0x3b, 0xef, 0x58, 0x90, 0x24, 0x4a, 0x17, 0xdb, 0x50, 0x85, 0x96, 0x07, 0xf8, 0xa9, 0x7a, 0xb9, 0x75, 0x50, 0x66, 0xcd, 0xf1, 0xba, 0x44, 0xfc, 0xe7, 0xb2, 0xd7, 0x7a, 0x60, 0xd5, 0x97, + 0x0f, 0x33, 0xb5, 0xa1, 0xa7, 0x5c, 0x93, 0xe5, 0x35, 0x45, 0xbb, 0xf4, 0xea, 0xeb, 0x3a, 0x30, 0x62, 0x6c, 0x6d, 0x21, 0x1b, 0x35, 0x75, 0xa9, 0x22, 0x64, 0xf4, 0x30, 0x83, 0x09, 0x5d, 0x96, + 0x7a, 0x78, 0xb9, 0xa4, 0x88, 0xb9, 0x45, 0x30, 0x64, 0xd0, 0x1e, 0x8e, 0xb8, 0xc6, 0x62, 0xc9, 0xa6, 0x3f, 0xad, 0xcf, 0xd2, 0x9e, 0x45, 0xa2, 0x06, 0x5a, 0x19, 0x36, 0x17, 0x5b, 0x4b, 0x51, + 0x8c, 0x4f, 0x26, 0xa0, 0x0b, 0x44, 0xb7, 0x10, 0x81, 0x4e, 0xdb, 0x1a, 0xc9, 0x7c, 0x41, 0x41, 0xd6, 0x1e, 0x6f, 0x4d, 0xee, 0x26, 0xf4, 0xfa, 0x83, 0xfd, 0xf3, 0x91, 0x0b, 0xfc, 0xef, 0x77, + 0x2b, 0xaf, 0x32, 0xaf, 0xcd, 0xbd, 0x5e, 0x8d, 0x2d, 0x56, 0xa1, 0xcd, 0xd2, 0x25, 0x49, 0x5a, 0xa8, 0xef, 0x80, 0xde, 0x89, 0x5e, 0xc0, 0x31, 0x04, 0x6a, 0x22, 0xbc, 0xca, 0xaa, 0xb0, 0x59, + 0x45, 0xbd, 0x1a, 0x10, 0xc1, 0xbc, 0x35, 0xf6, 0xdb, 0xa5, 0x79, 0xdc, 0x3b, 0x3e, 0xd7, 0xd6, 0xe4, 0x8c, 0x30, 0x8e, 0x4d, 0x84, 0x68, 0xbb, 0x0d, 0xe3, 0xad, 0xb0, 0x39, 0x87, 0x24, 0x04, + 0xd8, 0x74, 0xbd, 0xb5, 0xd9, 0xab, 0xb8, 0x6f, 0xd7, 0x74, 0xa7, 0xf6, 0xc3, 0xed, 0x74, 0xf2, 0x42, 0x89, 0xfc, 0x68, 0xa1, 0x7b, 0x42, 0xaf, 0x7d, 0xd7, 0xb9, 0x34, 0xd6, 0x77, 0x9d, 0xeb, + 0x22, 0x36, 0x62, 0x91, 0xdf, 0x23, 0x41, 0xd6, 0xba, 0xc3, 0xc2, 0xde, 0x85, 0x04, 0x01, 0xea, 0x56, 0x64, 0x29, 0x5b, 0xe3, 0x84, 0xec, 0x36, 0x09, 0x70, 0x16, 0x56, 0x9e, 0xe4, 0x6e, 0xb7, + 0xcd, 0x9c, 0x08, 0x9d, 0x88, 0xb0, 0x4f, 0xf8, 0x10, 0x22, 0x0b, 0x92, 0xe3, 0xa8, 0x73, 0x78, 0x74, 0x52, 0x66, 0x91, 0xaf, 0x97, 0xb6, 0xd0, 0x0b, 0xce, 0xb1, 0x5f, 0x33, 0xa1, 0x08, 0x90, + 0xe9, 0xae, 0x34, 0x31, 0xe7, 0xc0, 0x95, 0x37, 0xbb, 0xf7, 0xeb, 0x39, 0xcb, 0xbb, 0xd1, 0x7a, 0xaf, 0xc1, 0xd8, 0x53, 0x45, 0xcd, 0x3f, 0xc9, 0x05, 0x27, 0x9f, 0xef, 0x26, 0xd8, 0xb8, 0xe2, + 0xe6, 0x65, 0x8e, 0x2a, 0x19, 0x44, 0xf0, 0x8e, 0x9b, 0x24, 0xbc, 0xcd, 0xb5, 0x47, 0x4b, 0x38, 0x4b, 0xca, 0xba, 0x24, 0x6c, 0x6e, 0xaf, 0xec, 0x4f, 0x98, 0x32, 0x63, 0x0b, 0x78, 0x01, 0xe4, + 0xb9, 0x2d, 0x67, 0x04, 0x04, 0x98, 0x9e, 0xc5, 0x9c, 0x4f, 0x1d, 0xc6, 0xb8, 0xa4, 0x20, 0x0a, 0x00, 0xc7, 0xe0, 0x76, 0x94, 0x9a, 0x09, 0xb2, 0x6f, 0xc4, 0x86, 0x36, 0x92, 0xbc, 0x31, 0xdb, + 0x84, 0x36, 0x6e, 0x74, 0xfb, 0x2b, 0x0f, 0xe8, 0xc3, 0xb5, 0xe3, 0xb9, 0xe6, 0xbf, 0xc8, 0x7d, 0x6b, 0xfe, 0xcb, 0xdd, 0x58, 0x0e, 0x03, 0xd1, 0xd2, 0x94, 0x45, 0xa5, 0x59, 0x82, 0xd0, 0xf0, + 0xdd, 0x69, 0x1e, 0x46, 0x19, 0x25, 0x2e, 0x29, 0x1e, 0x07, 0xbd, 0x2d, 0xbe, 0x0f, 0xcb, 0xb6, 0x17, 0xf5, 0xf8, 0x40, 0xcc, 0x29, 0xa9, 0x9f, 0x32, 0x40, 0x40, 0xb7, 0xc1, 0x74, 0x8e, 0xc7, + 0x2b, 0x0e, 0x48, 0x45, 0x37, 0xb0, 0x17, 0xfe, 0xca, 0x16, 0x81, 0xa3, 0xca, 0xcd, 0x9d, 0xd2, 0xad, 0x76, 0x96, 0x56, 0x41, 0x0b, 0xe0, 0x30, 0xdf, 0x8d, 0x08, 0x47, 0x7a, 0x99, 0xd3, 0xfe, + 0xfc, 0x07, 0x7a, 0x1c, 0xca, 0xf0, 0xe8, 0x68, 0xee, 0x3e, 0x7a, 0xd3, 0x27, 0x96, 0xdc, 0xbb, 0xbf, 0xf0, 0x86, 0xe3, 0xf7, 0xe7, 0xd7, 0xca, 0xa2, 0x23, 0xd6, 0x61, 0x0f, 0xb1, 0x19, 0x0a, + 0xd1, 0xd7, 0x2a, 0xd4, 0x9d, 0x2b, 0x6f, 0xef, 0x4e, 0xe3, 0x8a, 0x11, 0xa7, 0x00, 0xba, 0x13, 0x0c, 0x7c, 0x99, 0x6f, 0x0d, 0xc9, 0x82, 0x0f, 0xc1, 0x42, 0x22, 0x14, 0x0d, 0xe0, 0xa2, 0x76, + 0x27, 0xd3, 0x89, 0x12, 0xd8, 0xf4, 0x36, 0xae, 0xcb, 0x7a, 0xc5, 0xf8, 0x27, 0x33, 0xd8, 0x2f, 0xcb, 0x9d, 0x23, 0xd6, 0x11, 0xc0, 0x07, 0x09, 0x33, 0x77, 0x45, 0xf7, 0xc0, 0xc0, 0x37, 0x46, + 0xf3, 0x37, 0x4a, 0x81, 0xfb, 0x98, 0x3c, 0xe3, 0x16, 0xfb, 0x2c, 0xf8, 0x15, 0x8a, 0xb7, 0xdb, 0xb1, 0xe9, 0x4a, 0xe6, 0x21, 0x43, 0x79, 0x12, 0x51, 0x18, 0x42, 0x0e, 0xfb, 0x10, 0x62, 0x61, + 0x56, 0x12, 0xb3, 0x68, 0x33, 0x10, 0xa7, 0xdc, 0xcb, 0x53, 0x45, 0x5a, 0xcd, 0x56, 0xbd, 0x68, 0x2f, 0x97, 0x47, 0xd8, 0x30, 0x0c, 0xaf, 0xb5, 0x31, 0x77, 0xbd, 0x22, 0xea, 0xbc, 0x17, 0x10, + 0x8a, 0x39, 0x73, 0x8e, 0x64, 0x2f, 0x39, 0xa2, 0x75, 0x7a, 0x79, 0x79, 0x82, 0x1c, 0xbb, 0x2b, 0x1c, 0xa9, 0x0c, 0xb5, 0xfa, 0x16, 0x81, 0x3b, 0xf4, 0xda, 0xf7, 0x61, 0x20, 0x9e, 0x19, 0x58, + 0xdf, 0xa5, 0x5f, 0xb0, 0xf8, 0xfe, 0x6c, 0x72, 0x95, 0xfd, 0x3b, 0x20, 0xb8, 0xa5, 0x01, 0x72, 0x57, 0x79, 0x43, 0x47, 0xec, 0x65, 0x12, 0x4c, 0xfb, 0x96, 0x57, 0xcf, 0xa4, 0x94, 0xeb, 0xcb, + 0xd9, 0xa2, 0x74, 0xcc, 0xd0, 0x30, 0xe2, 0x82, 0x9e, 0x0e, 0x98, 0x8b, 0x19, 0xd2, 0x9c, 0x91, 0x8b, 0xda, 0xf6, 0x2b, 0x39, 0x4a, 0x3b, 0xae, 0x2f, 0xec, 0x10, 0x3d, 0xba, 0xae, 0x50, 0xeb, + 0xcb, 0x86, 0x3d, 0xcd, 0x76, 0x94, 0xa0, 0x65, 0xf5, 0x06, 0xc1, 0x0b, 0x5e, 0xbb, 0x59, 0x4c, 0xde, 0x53, 0x60, 0xee, 0xa1, 0x40, 0xfc, 0x8b, 0x3d, 0xb1, 0x7c, 0xbe, 0x88, 0xbc, 0x36, 0xfd, + 0x72, 0x31, 0xb9, 0x4a, 0xf9, 0xbd, 0xbd, 0xb0, 0x4d, 0x2b, 0xac, 0xb2, 0xc7, 0xc5, 0x16, 0x08, 0x11, 0x78, 0xd9, 0xe6, 0xe7, 0x1c, 0x65, 0xce, 0x40, 0xae, 0x30, 0x64, 0xbc, 0x12, 0x6b, 0xb2, + 0xd9, 0x47, 0x72, 0x79, 0xa6, 0xb4, 0x1a, 0x4c, 0xed, 0xaa, 0x33, 0x1d, 0xa0, 0xe6, 0x71, 0x13, 0xb1, 0xeb, 0x50, 0xdb, 0x44, 0xee, 0x14, 0xf0, 0xd3, 0x02, 0xc6, 0x44, 0x03, 0x48, 0x0b, 0x89, + 0xa1, 0x89, 0x9d, 0x5f, 0x13, 0xfa, 0xa9, 0x73, 0x46, 0xb8, 0x4e, 0x3e, 0xa7, 0xe0, 0xbf, 0x85, 0x17, 0xdc, 0x9f, 0x5a, 0xee, 0x14, 0x43, 0xb8, 0xaf, 0x3b, 0xcf, 0x78, 0x30, 0x6e, 0xa4, 0x5f, + 0x01, 0xfc, 0xf6, 0x6c, 0x6c, 0x6a, 0xb6, 0xbc, 0x4f, 0xf7, 0xd2, 0x59, 0x35, 0x1a, 0xaf, 0x3c, 0xe1, 0x18, 0x6a, 0xf8, 0x4d, 0x1c, 0xee, 0xce, 0x73, 0x91, 0x84, 0x15, 0x1f, 0x02, 0x0a, 0x5f, + 0x62, 0x09, 0x74, 0xb3, 0x32, 0x79, 0xa7, 0xdf, 0x9a, 0x4b, 0x6e, 0x36, 0xa5, 0x9a, 0x25, 0x74, 0x3a, 0x96, 0x52, 0x2e, 0x33, 0x8d, 0x7a, 0x48, 0x95, 0x24, 0xca, 0xfb, 0x6a, 0x99, 0x0c, 0xe7, + 0xb5, 0xc1, 0x0b, 0xbe, 0x85, 0x8b, 0xd1, 0x22, 0xb8, 0x2d, 0xd8, 0x7c, 0x43, 0x0e, 0x73, 0xdf, 0x24, 0x79, 0xc6, 0x0f, 0xf1, 0x55, 0xf4, 0x0b, 0x14, 0x9f, 0x1e, 0x8c, 0xad, 0xfd, 0xc0, 0x62, + 0x1b, 0xc6, 0x20, 0xf4, 0x32, 0x27, 0x31, 0x3e, 0x8c, 0x31, 0x3b, 0x38, 0xb4, 0x53, 0x3c, 0x22, 0xa3, 0x9d, 0x67, 0x67, 0x7c, 0x81, 0xad, 0xb7, 0x89, 0xb9, 0x45, 0x8f, 0x7b, 0xce, 0xe5, 0x96, + 0xe4, 0x79, 0x91, 0x8b, 0xba, 0xa1, 0x6d, 0x2b, 0xa1, 0x8c, 0x77, 0x0c, 0x5d, 0x9e, 0xb2, 0xf3, 0x96, 0xf5, 0x84, 0x10, 0x34, 0x0e, 0xab, 0xae, 0x91, 0x5b, 0x73, 0x6a, 0x08, 0x9d, 0xb9, 0x5d, + 0xe7, 0xb7, 0x63, 0xe8, 0xab, 0xb3, 0xfd, 0xbf, 0x67, 0x88, 0x7e, 0x16, 0x7c, 0xc1, 0xe0, 0xd3, 0xed, 0x58, 0x93, 0xb4, 0xc0, 0x0c, 0xb1, 0xaf, 0x8b, 0x05, 0xbb, 0xe2, 0x97, 0x27, 0xce, 0x0d, + 0xb7, 0xab, 0xd2, 0x84, 0xa1, 0xa4, 0xdd, 0xc8, 0x6d, 0x2a, 0x05, 0x53, 0x04, 0x04, 0xb8, 0x6c, 0x1e, 0x2f, 0x74, 0xd4, 0x46, 0x36, 0xc6, 0x86, 0x45, 0xce, 0xe7, 0x75, 0x7e, 0x58, 0xb8, 0xc9, + 0x6c, 0xda, 0x79, 0xd0, 0xdc, 0xca, 0xf6, 0xa8, 0xdc, 0xad, 0x7b, 0xae, 0x38, 0x62, 0x9d, 0x42, 0x78, 0xf9, 0x59, 0x6d, 0xa1, 0x43, 0x3b, 0xe2, 0xec, 0xf3, 0x97, 0xc8, 0xe1, 0xef, 0x34, 0x9d, + 0x77, 0xbc, 0x0f, 0x37, 0x99, 0x10, 0x97, 0x6f, 0x66, 0x0f, 0x07, 0xe7, 0xa3, 0x74, 0xbd, 0xff, 0xa2, 0xd9, 0x74, 0xf7, 0x27, 0xae, 0xfd, 0x72, 0xef, 0xc5, 0x58, 0x63, 0xca, 0x42, 0xe6, 0x33, + 0x13, 0xe2, 0x63, 0xc1, 0x88, 0x67, 0x0d, 0xd8, 0x56, 0x3a, 0x5e, 0xa9, 0xab, 0x66, 0xd6, 0x72, 0x6c, 0xee, 0xf3, 0x0d, 0xd2, 0xc9, 0x7b, 0x3c, 0x86, 0x97, 0xa8, 0xc1, 0x5a, 0x15, 0x08, 0x1d, + 0xb5, 0xd5, 0xc0, 0x0d, 0xf3, 0x4c, 0x04, 0x57, 0x59, 0xa3, 0x3a, 0x9a, 0x64, 0x27, 0xb3, 0xb5, 0x7e, 0xd8, 0x2c, 0x51, 0x7a, 0x77, 0xee, 0x53, 0x08, 0x55, 0xcd, 0x78, 0x61, 0x9d, 0xf1, 0xe7, + 0x92, 0x0a, 0x6e, 0xf2, 0x21, 0xef, 0x43, 0xfd, 0x39, 0xa4, 0xe9, 0xbe, 0x0b, 0xf7, 0x99, 0x5d, 0xc8, 0x87, 0xd8, 0x0b, 0xa4, 0xef, 0x37, 0x13, 0x74, 0xdc, 0x8e, 0x64, 0x63, 0x9e, 0x73, 0x74, + 0xca, 0xc7, 0x07, 0xd8, 0x42, 0xd6, 0x36, 0x79, 0x90, 0x8e, 0x0b, 0x9a, 0x47, 0xd3, 0x70, 0xb5, 0x1c, 0x42, 0xdb, 0xed, 0xea, 0x4e, 0xd0, 0x74, 0xfe, 0x08, 0x15, 0x92, 0x3c, 0x54, 0x4c, 0xb6, + 0x46, 0x39, 0xff, 0x78, 0xf2, 0x49, 0xde, 0x9d, 0xab, 0x0b, 0x0d, 0x55, 0x4e, 0x5e, 0xc4, 0xb0, 0xab, 0x58, 0xef, 0x52, 0x25, 0xcd, 0xf7, 0xee, 0xee, 0xb0, 0x0a, 0x16, 0xdb, 0x18, 0x1c, 0x71, + 0x5e, 0xfd, 0x20, 0x7e, 0xee, 0x3e, 0x72, 0x6f, 0x51, 0x46, 0xf7, 0x4f, 0x2e, 0x9e, 0x9a, 0x28, 0xaf, 0x22, 0x2f, 0x88, 0x5d, 0x2f, 0x26, 0xd3, 0x71, 0x13, 0xa3, 0xe6, 0x44, 0xce, 0x7a, 0xa7, + 0x9f, 0xd2, 0x52, 0x38, 0x2d, 0x70, 0x71, 0x63, 0x90, 0x68, 0xe1, 0x2c, 0xb7, 0x38, 0xbf, 0x3c, 0xee, 0x79, 0xe1, 0xb4, 0xc7, 0x11, 0x93, 0xb4, 0xb0, 0xc6, 0x64, 0xf6, 0xed, 0xac, 0x77, 0x39, + 0x69, 0xdf, 0x51, 0xcb, 0x2d, 0x5f, 0x2c, 0xdd, 0x75, 0xe4, 0xc1, 0x7b, 0x55, 0xcf, 0xe3, 0x88, 0x83, 0x74, 0x33, 0xa7, 0x99, 0xa0, 0xa4, 0x5d, 0x6a, 0x67, 0x2e, 0xa7, 0xaa, 0x7e, 0x6b, 0x6d, + 0x7d, 0x50, 0x83, 0x3d, 0x1a, 0x86, 0x4f, 0x6c, 0xde, 0x5e, 0x85, 0x5e, 0xda, 0xfc, 0x7a, 0x39, 0xb6, 0x5c, 0x9c, 0xdc, 0x09, 0xd4, 0xec, 0x00, 0x12, 0x62, 0xc9, 0x43, 0x78, 0x69, 0x6e, 0x56, + 0xc3, 0x62, 0x1b, 0x5b, 0x0b, 0x20, 0x26, 0xd0, 0xb0, 0xcb, 0x87, 0xaa, 0x90, 0x57, 0x8b, 0xa3, 0xbd, 0xdd, 0xd8, 0xaa, 0xb3, 0x61, 0x70, 0x67, 0x67, 0x65, 0x24, 0xa2, 0x5a, 0xba, 0xe7, 0x8b, + 0x86, 0xd4, 0xce, 0x11, 0x7f, 0x47, 0x4f, 0xa9, 0xa8, 0x31, 0x15, 0x36, 0x75, 0x15, 0x42, 0x00, 0x13, 0x95, 0xb6, 0x4f, 0xee, 0xed, 0xb2, 0xf8, 0xfd, 0x38, 0xe4, 0xbf, 0xb7, 0x53, 0xff, 0x2a, + 0xfa, 0x8a, 0xc0, 0xe7, 0x07, 0x63, 0x77, 0xef, 0xc1, 0x49, 0x36, 0x48, 0x0d, 0xd6, 0xa3, 0xf5, 0xc2, 0x25, 0x37, 0x15, 0xb3, 0x46, 0x7a, 0x09, 0xec, 0x74, 0xfd, 0x6c, 0x65, 0x39, 0x5b, 0x51, + 0x73, 0x0d, 0x36, 0xfc, 0xd3, 0x96, 0xa4, 0x80, 0x08, 0x02, 0x48, 0x6c, 0x4d, 0x71, 0x79, 0x5e, 0xc3, 0xb8, 0x53, 0xc2, 0x7a, 0x70, 0xc4, 0xf9, 0x95, 0x6d, 0x4f, 0xb3, 0x93, 0x86, 0x6f, 0x8b, + 0x18, 0x9f, 0xef, 0x22, 0xa0, 0x69, 0x72, 0xb0, 0xe3, 0xbd, 0x11, 0xa6, 0xd6, 0xd7, 0xfd, 0xfc, 0x9f, 0xff, 0x60, 0x3f, 0xec, 0xe3, 0xae, 0x0d, 0xfb, 0xe4, 0x63, 0xaf, 0xcb, 0xf0, 0xd1, 0x7c, + 0x73, 0x31, 0x06, 0x9e, 0x58, 0x5c, 0xef, 0xfd, 0xc2, 0x3b, 0xa4, 0xdf, 0x9e, 0x5f, 0x0d, 0x8e, 0x11, 0xcb, 0x6d, 0xa0, 0xd3, 0x27, 0x30, 0x2c, 0x7c, 0x22, 0xce, 0x21, 0x90, 0x3a, 0xaa, 0x0b, + 0x02, 0x74, 0xdd, 0x1d, 0xbc, 0xd2, 0x6b, 0x45, 0x10, 0x29, 0x25, 0x8a, 0x07, 0x3a, 0x74, 0xf6, 0x58, 0x58, 0x52, 0x7b, 0x97, 0x85, 0x8f, 0x65, 0x54, 0xa5, 0x1e, 0x8f, 0xe0, 0x26, 0x87, 0x9f, + 0x29, 0x7a, 0x3b, 0x67, 0x5d, 0xba, 0xdd, 0x91, 0xbe, 0xa6, 0xa8, 0x90, 0x36, 0x30, 0xdb, 0x00, 0x44, 0xa4, 0x1e, 0x78, 0x54, 0x6b, 0xe2, 0xaf, 0x57, 0xe0, 0xd1, 0xce, 0xfd, 0x4f, 0x9f, 0xfd, + 0x5c, 0x77, 0x73, 0x7c, 0xd7, 0x79, 0x3f, 0x50, 0x92, 0x3f, 0x65, 0x1a, 0x3d, 0xf8, 0x91, 0x47, 0x1d, 0xe8, 0xa5, 0xee, 0x58, 0x93, 0xa9, 0x9f, 0x9d, 0xe9, 0xa8, 0x83, 0x45, 0x04, 0xa5, 0xba, + 0x13, 0xc9, 0xb6, 0x6a, 0xee, 0xf4, 0x1b, 0x44, 0x58, 0x95, 0x70, 0x44, 0x74, 0x6b, 0x74, 0xe6, 0x03, 0x27, 0x3c, 0x6e, 0xe5, 0x54, 0xd9, 0x0e, 0x40, 0x32, 0xcc, 0x68, 0x6e, 0x98, 0x09, 0xa6, + 0xe8, 0xc5, 0xcc, 0x69, 0x8a, 0x9c, 0x76, 0x03, 0x0e, 0x14, 0x31, 0x79, 0x8e, 0x7c, 0x9e, 0xcc, 0xcc, 0xa1, 0x47, 0x23, 0x4a, 0xc4, 0x24, 0x0d, 0x1b, 0x31, 0x3a, 0xfe, 0x0f, 0x1d, 0x36, 0xbe, + 0x1f, 0xaa, 0xda, 0xfa, 0x31, 0x60, 0xf8, 0xbf, 0xd4, 0x13, 0xd7, 0x9f, 0x79, 0xd4, 0x17, 0xd7, 0x97, 0x63, 0x7b, 0x23, 0x0a, 0x70, 0x6f, 0x46, 0x4e, 0x77, 0x73, 0xbf, 0x3d, 0x2b, 0x18, 0x54, + 0xbb, 0x26, 0x92, 0xca, 0x87, 0x34, 0xa3, 0x31, 0x30, 0xd9, 0x2c, 0xf8, 0x9d, 0xcc, 0x4a, 0x7e, 0x47, 0xd6, 0x58, 0xdf, 0xd7, 0xa7, 0x4c, 0xab, 0xd6, 0xb2, 0x70, 0x6e, 0x57, 0x20, 0x8b, 0xce, + 0x8a, 0x06, 0xae, 0x18, 0x68, 0x57, 0xeb, 0x2b, 0x74, 0x47, 0x43, 0xc6, 0x91, 0x57, 0x12, 0x47, 0xef, 0x86, 0xb0, 0x33, 0x9b, 0xc3, 0x53, 0x06, 0xec, 0xff, 0xb1, 0x37, 0x9a, 0xdc, 0x2b, 0xad, + 0xe3, 0xe3, 0xf0, 0x48, 0xf2, 0x29, 0x66, 0x88, 0x0f, 0xb1, 0x2f, 0xa9, 0xf5, 0xaf, 0x37, 0x13, 0x72, 0x1c, 0x3f, 0x44, 0x36, 0xa7, 0x01, 0x4b, 0xa8, 0xe8, 0x68, 0x18, 0xa2, 0x64, 0x87, 0x51, + 0x3b, 0x71, 0x2e, 0x2e, 0x14, 0xe0, 0x40, 0x2c, 0xc5, 0x21, 0x3e, 0x03, 0x8c, 0x54, 0x82, 0xd6, 0xb2, 0xdb, 0x42, 0xe4, 0x69, 0x05, 0xc8, 0xc8, 0xf4, 0x58, 0x31, 0x09, 0xa5, 0xc0, 0x9b, 0xad, + 0x3f, 0x58, 0xb0, 0xcf, 0x03, 0x22, 0xa0, 0xf0, 0xb1, 0x4a, 0x65, 0xc2, 0x21, 0xdf, 0xb5, 0x59, 0xc6, 0x82, 0xb9, 0xbc, 0x83, 0x97, 0x4f, 0x1e, 0x46, 0x66, 0x49, 0x9e, 0xa5, 0x97, 0xbf, 0xdd, + 0x4b, 0xc2, 0xba, 0xfe, 0x12, 0x48, 0xf0, 0xff, 0x7c, 0xfe, 0xec, 0xb2, 0x1f, 0x8e, 0xac, 0xb7, 0x52, 0x1c, 0xdf, 0xe6, 0xab, 0x8f, 0xa2, 0x22, 0xd3, 0xeb, 0xd9, 0xc8, 0xa7, 0x57, 0xd7, 0x3c, + 0x86, 0x57, 0x2f, 0xdd, 0xd7, 0x98, 0xfd, 0x6f, 0xf9, 0x0c, 0x7e, 0x56, 0x26, 0x13, 0xd7, 0xaa, 0xad, 0x3f, 0x77, 0x63, 0xc5, 0x2f, 0xaf, 0x43, 0xf7, 0x95, 0xa5, 0xe9, 0xad, 0xf0, 0xe9, 0xa7, + 0xf7, 0x1f, 0x15, 0xea, 0x5e, 0x14, 0xe2, 0x1b, 0x75, 0xfb, 0xb5, 0x70, 0xdb, 0x37, 0x27, 0xc1, 0x5b, 0xa4, 0xda, 0x9f, 0xff, 0xbd, 0x06, 0x96, 0x7d, 0x8d, 0xae, 0xf8, 0x6c, 0x94, 0xa3, 0xff, + 0x92, 0x3f, 0xa8, 0x57, 0xfd, 0xb8, 0x0a, 0x26, 0xfe, 0xd4, 0x11, 0xf8, 0xbb, 0xd4, 0x37, 0xe5, 0xba, 0x5c, 0x4f, 0xf0, 0x71, 0x07, 0xdd, 0x81, 0x9c, 0x05, 0x82, 0xb7, 0xf2, 0x4f, 0xa0, 0x43, + 0x4d, 0x49, 0xfa, 0x9c, 0x5b, 0x60, 0x37, 0x25, 0x83, 0x53, 0x2d, 0xe2, 0x07, 0x4b, 0x2e, 0x0c, 0x1b, 0x92, 0xf6, 0x58, 0xb9, 0x69, 0x75, 0x88, 0x26, 0x72, 0x4b, 0xae, 0xe6, 0x1a, 0x2a, 0x61, + 0x43, 0xef, 0x0e, 0x66, 0x59, 0xc5, 0xbb, 0x75, 0x1d, 0x81, 0x47, 0x77, 0x4a, 0x16, 0x67, 0x6c, 0x0a, 0x45, 0x7c, 0xed, 0x54, 0x78, 0xcb, 0xc1, 0xfe, 0x73, 0x6b, 0xe1, 0x8f, 0x5d, 0xf2, 0x65, + 0x64, 0xfe, 0xf9, 0x5f, 0xf2, 0x31, 0xa3, 0x52, 0x6d, 0xe5, 0x8f, 0x1c, 0x86, 0xd8, 0x53, 0x87, 0x6a, 0x17, 0x81, 0xe0, 0xe4, 0xfa, 0xcf, 0xf5, 0xe8, 0x61, 0x84, 0x9f, 0xf4, 0x58, 0x1a, 0xe5, + 0x20, 0xd2, 0x70, 0xdc, 0x23, 0xa7, 0x5e, 0xdd, 0xf2, 0x6e, 0x71, 0x0e, 0x30, 0x2e, 0xdc, 0xe4, 0x36, 0x34, 0xcf, 0x05, 0xa7, 0xa6, 0x1b, 0xcf, 0x51, 0xe7, 0x50, 0x5e, 0x2d, 0x8d, 0x29, 0xd7, + 0x40, 0xa9, 0x03, 0x34, 0x67, 0x5d, 0x9e, 0x9e, 0xf9, 0x48, 0x0d, 0xc0, 0x29, 0xed, 0x4b, 0xf1, 0x72, 0x3a, 0x04, 0xad, 0xba, 0x45, 0x40, 0xd6, 0x48, 0x96, 0x46, 0x8e, 0xb7, 0x60, 0xf3, 0xe4, + 0x88, 0xfd, 0x6d, 0x8a, 0xf4, 0xf2, 0x89, 0x57, 0x34, 0x56, 0xfc, 0x3e, 0x4e, 0xb0, 0xdb, 0x29, 0xf4, 0x81, 0x83, 0xc0, 0xcd, 0xea, 0x97, 0x22, 0x40, 0xd7, 0xd7, 0xd0, 0xf7, 0x3e, 0xf3, 0xb3, + 0x72, 0xf2, 0x5e, 0xe6, 0xfb, 0x32, 0xd3, 0x7d, 0x99, 0x04, 0xde, 0x49, 0x66, 0x88, 0x7f, 0xe1, 0x4f, 0xb5, 0xc6, 0x6e, 0x68, 0xb3, 0x3e, 0xbd, 0xf8, 0xcc, 0x82, 0x7c, 0xfd, 0x53, 0xbf, 0x4c, + 0x1d, 0x9f, 0x68, 0x26, 0xee, 0x8e, 0xe9, 0xf7, 0x82, 0x67, 0x2f, 0x69, 0x96, 0x5f, 0x9a, 0xf9, 0xd0, 0x8f, 0x71, 0xe7, 0x9b, 0x0f, 0x0d, 0xbd, 0x23, 0xe2, 0x23, 0x3b, 0xfd, 0x32, 0x29, 0x7d, + 0xfb, 0x1b, 0x3e, 0x62, 0x0c, 0x5e, 0x33, 0x88, 0xbe, 0x47, 0x14, 0xbc, 0x7c, 0xf3, 0x7a, 0x26, 0x7e, 0xc1, 0xec, 0x7b, 0x06, 0xcc, 0x03, 0x83, 0xfb, 0xa5, 0x45, 0x5f, 0xd0, 0xf8, 0x74, 0x02, + 0x7d, 0x4d, 0x78, 0x7a, 0x30, 0x25, 0x7d, 0x84, 0xbf, 0xdf, 0x1b, 0x30, 0xd0, 0x53, 0x07, 0x0d, 0xaf, 0x32, 0x2f, 0x63, 0xe6, 0xe5, 0x6a, 0x02, 0x8d, 0x3b, 0x5e, 0x00, 0x38, 0x68, 0xb3, 0x39, + 0x46, 0x51, 0x36, 0x9b, 0x1f, 0x0c, 0x64, 0xeb, 0xbb, 0xad, 0xe8, 0x2f, 0x81, 0x2d, 0xbf, 0xa1, 0xcb, 0x73, 0x6c, 0x28, 0xa6, 0xe7, 0x60, 0x8c, 0x25, 0x9a, 0x22, 0xec, 0x7b, 0xf8, 0xaa, 0x0f, + 0x7c, 0x08, 0xf4, 0x95, 0x64, 0x0d, 0xd9, 0x8b, 0xf0, 0x00, 0x2f, 0xc8, 0xb9, 0x8a, 0x3b, 0x9c, 0x11, 0x23, 0x9b, 0x3c, 0xae, 0xa5, 0xbc, 0x1e, 0x22, 0x83, 0xd7, 0xd9, 0x13, 0x3f, 0xc2, 0xa8, + 0xb3, 0xc3, 0xb4, 0x2e, 0xbd, 0x17, 0xf3, 0x00, 0x7e, 0xcc, 0x21, 0xf0, 0x3d, 0x0d, 0xec, 0xfe, 0x76, 0xf9, 0x99, 0x2d, 0xe3, 0x17, 0xc9, 0x17, 0xdc, 0x3e, 0xdf, 0x8f, 0x0d, 0xd6, 0x3e, 0x59, + 0x4c, 0x91, 0xc0, 0x0c, 0xab, 0xce, 0xf2, 0x1c, 0x15, 0x8c, 0x4e, 0x26, 0x51, 0x12, 0xd1, 0x97, 0x76, 0x9a, 0x1b, 0xa9, 0x7c, 0x12, 0x66, 0x67, 0x4e, 0x98, 0xb9, 0x52, 0x8d, 0xce, 0x11, 0xc0, + 0x4d, 0x8c, 0x50, 0x27, 0x0d, 0x58, 0xd9, 0x75, 0xc9, 0x62, 0x77, 0xa6, 0xd8, 0x92, 0x95, 0xa6, 0xc4, 0xce, 0x0e, 0x0e, 0x33, 0x7c, 0x8d, 0xf7, 0xc1, 0x41, 0x30, 0x9a, 0x9e, 0xde, 0x6d, 0x88, + 0x31, 0xe8, 0x3d, 0x48, 0xc5, 0x7b, 0x04, 0xe1, 0xab, 0x56, 0x3e, 0x02, 0xef, 0xef, 0xc3, 0xfd, 0x5f, 0x65, 0xbe, 0xc0, 0x76, 0xb9, 0xba, 0x02, 0xf6, 0x4b, 0x98, 0x3f, 0x3c, 0x61, 0x5c, 0x75, + 0x0d, 0xe2, 0x05, 0x29, 0x18, 0xf1, 0xb1, 0xb2, 0x9d, 0x13, 0xbb, 0x87, 0x01, 0x26, 0xb3, 0xc2, 0xa9, 0xaf, 0xfd, 0x1e, 0xa8, 0x5f, 0x87, 0x69, 0x3f, 0x89, 0xcb, 0xe6, 0x91, 0x91, 0xfe, 0x5c, + 0x16, 0xf6, 0x9b, 0xd4, 0x4b, 0x53, 0x5e, 0x2f, 0x27, 0xf0, 0x88, 0xb4, 0xeb, 0x4b, 0xef, 0x87, 0xc2, 0x71, 0xd1, 0x1c, 0xf7, 0x8d, 0x74, 0x9c, 0xf3, 0x65, 0xe1, 0xed, 0xc0, 0x24, 0x0f, 0x55, + 0xf5, 0x98, 0xcc, 0x2b, 0x55, 0x84, 0xf4, 0x0d, 0xde, 0x7b, 0xcd, 0xc6, 0xdf, 0x54, 0x20, 0x5d, 0xfb, 0x50, 0xbe, 0x02, 0xc3, 0x33, 0x57, 0xac, 0xe4, 0x84, 0xac, 0x18, 0xba, 0xdb, 0x3a, 0x06, + 0xe7, 0xcd, 0x74, 0xbd, 0xad, 0x91, 0x8a, 0x33, 0x56, 0x58, 0x22, 0x14, 0x07, 0x7b, 0x6f, 0xc5, 0xc9, 0xfa, 0xc6, 0x59, 0x54, 0x67, 0xaf, 0x54, 0x3b, 0xa5, 0x95, 0x1e, 0x1f, 0x2f, 0xb3, 0x4f, + 0x35, 0xfe, 0x8b, 0xe8, 0x0b, 0x04, 0x5f, 0x1e, 0x4c, 0xb0, 0x71, 0x38, 0xe0, 0x98, 0x48, 0x84, 0x03, 0x6e, 0x60, 0x3d, 0x5b, 0xc2, 0x4e, 0xe7, 0x1c, 0x5b, 0xe9, 0x6c, 0xdb, 0xab, 0x8e, 0xd0, + 0x4e, 0xe8, 0x71, 0xd7, 0x63, 0xee, 0xca, 0xad, 0x0f, 0xd3, 0x92, 0x69, 0xbd, 0x4d, 0x11, 0x94, 0xee, 0x5a, 0x04, 0x36, 0x21, 0xb8, 0x3c, 0xe3, 0x75, 0xcf, 0x43, 0x02, 0x6b, 0x03, 0x08, 0x47, + 0xf7, 0xa9, 0x47, 0x6f, 0xd7, 0x21, 0x57, 0x94, 0x14, 0x43, 0x2b, 0xc2, 0x89, 0xac, 0x9e, 0x33, 0x68, 0x3e, 0x33, 0x62, 0x5d, 0x96, 0xb9, 0x87, 0x2e, 0xc7, 0x6f, 0x04, 0xfc, 0x8f, 0xb6, 0x7d, + 0xcf, 0x60, 0xfa, 0x21, 0xf8, 0x8a, 0xe8, 0xc7, 0xed, 0x98, 0x74, 0xfe, 0xeb, 0xe6, 0x03, 0xab, 0x14, 0x91, 0x67, 0x4f, 0x47, 0x90, 0x59, 0x49, 0x42, 0xb2, 0x9c, 0xa2, 0x7b, 0x08, 0x6c, 0xbc, + 0x72, 0x53, 0xe6, 0xc3, 0xde, 0x73, 0x4f, 0x5a, 0x40, 0xd6, 0x9c, 0xd0, 0x5a, 0x9e, 0x91, 0xfb, 0x79, 0xd3, 0x45, 0xbc, 0x97, 0xc6, 0x4a, 0x76, 0x06, 0x91, 0x1d, 0x38, 0x57, 0xe3, 0x83, 0x56, + 0xb3, 0x1e, 0xb0, 0xe6, 0x88, 0x0a, 0x33, 0x03, 0x76, 0xc0, 0x21, 0x52, 0x8c, 0xa9, 0xa5, 0x7c, 0x13, 0x44, 0xf2, 0x56, 0x78, 0xef, 0xbe, 0xa7, 0xfa, 0x99, 0x2a, 0x21, 0x57, 0x89, 0xd7, 0x36, + 0x37, 0xaf, 0xf5, 0x5c, 0x47, 0x4c, 0xa1, 0xfa, 0xfc, 0x4c, 0x6a, 0x3d, 0xa6, 0x6e, 0xea, 0x9d, 0x22, 0xd7, 0xab, 0x02, 0xd8, 0x42, 0x28, 0x58, 0xf1, 0x4c, 0x69, 0xd0, 0x9b, 0xe5, 0xb9, 0x63, + 0x9c, 0xa2, 0x51, 0x44, 0xc4, 0x99, 0xa2, 0x1b, 0x0f, 0x42, 0xc1, 0x59, 0xe5, 0x95, 0x91, 0x34, 0x5f, 0x0d, 0x75, 0x24, 0x0f, 0xf8, 0xe2, 0xb4, 0xf6, 0x86, 0x19, 0x03, 0x06, 0xb1, 0xd7, 0x53, + 0x86, 0x3a, 0xe7, 0x36, 0x5d, 0x77, 0xd0, 0xba, 0x59, 0xfc, 0x9c, 0xdd, 0xf6, 0x5a, 0x72, 0xec, 0xcf, 0x7f, 0xe0, 0x97, 0x02, 0x63, 0x77, 0x15, 0xa7, 0x49, 0xed, 0xec, 0x3c, 0xc9, 0xcb, 0x30, + 0x09, 0xeb, 0xf0, 0x61, 0xf0, 0xe2, 0x73, 0xba, 0xf3, 0x4d, 0x36, 0x38, 0xf9, 0xfe, 0x64, 0xac, 0x06, 0xd5, 0x07, 0x0d, 0x44, 0x85, 0x82, 0x47, 0x5d, 0x0a, 0x3b, 0xe6, 0x2c, 0xcc, 0xd7, 0x7d, + 0xb8, 0xd6, 0x4a, 0x76, 0x0e, 0xc5, 0xe7, 0x94, 0x3b, 0x6d, 0x17, 0xcb, 0xbc, 0x5e, 0x13, 0x05, 0xee, 0x75, 0xee, 0x81, 0xac, 0x60, 0x44, 0x2a, 0x77, 0x4c, 0x27, 0xd8, 0xc1, 0x6a, 0xad, 0xd4, + 0xc9, 0xfa, 0xe4, 0xc2, 0x12, 0x63, 0x58, 0xb0, 0x20, 0x53, 0xa4, 0xb5, 0x40, 0x28, 0x78, 0x38, 0x81, 0x66, 0xde, 0x8f, 0x70, 0x0e, 0xbc, 0x73, 0x57, 0x7e, 0xb2, 0x7e, 0xbf, 0x6d, 0x22, 0x03, + 0xeb, 0x8d, 0x0e, 0xfb, 0xc3, 0xe2, 0xbc, 0xf9, 0xe0, 0x96, 0x61, 0xe8, 0xd3, 0x07, 0x5d, 0x10, 0x3a, 0xc1, 0xc4, 0xce, 0xce, 0x9e, 0xfb, 0xa5, 0x1f, 0xfe, 0xfc, 0x44, 0x46, 0xf4, 0xb9, 0x96, + 0xe4, 0x23, 0x9f, 0xfb, 0xdf, 0x57, 0xcd, 0x7a, 0x97, 0x7a, 0xed, 0xaa, 0xd7, 0xeb, 0xab, 0xd7, 0x7d, 0x44, 0xd5, 0x2c, 0xfd, 0xbc, 0x13, 0xe8, 0xb2, 0xaa, 0xe6, 0x5b, 0x52, 0x55, 0x44, 0xb9, + 0x10, 0x30, 0x36, 0xa9, 0xa2, 0x7d, 0x59, 0xb5, 0x53, 0x8a, 0x34, 0x60, 0x64, 0x3d, 0xa5, 0xca, 0x79, 0x18, 0x5a, 0x7d, 0x8b, 0x32, 0x7d, 0xcf, 0xa1, 0x87, 0x78, 0x75, 0xc4, 0xfb, 0xbe, 0x6a, + 0x1a, 0xc5, 0x74, 0x0f, 0xd5, 0x7e, 0x40, 0x55, 0xde, 0x51, 0x8f, 0x88, 0xef, 0x82, 0xa0, 0x16, 0xb9, 0x53, 0x7a, 0xb9, 0x87, 0xc3, 0x31, 0x85, 0x1d, 0xde, 0xd3, 0x4a, 0x1e, 0x69, 0xee, 0xdf, + 0x0f, 0xfd, 0x17, 0x91, 0x57, 0x14, 0x2e, 0x17, 0x63, 0x73, 0xdf, 0xf3, 0xa8, 0x47, 0x6c, 0x33, 0x50, 0xaa, 0xc6, 0xef, 0xf4, 0x98, 0xef, 0x44, 0x07, 0x88, 0x51, 0x47, 0x20, 0x80, 0xae, 0x59, + 0xc7, 0x3c, 0xde, 0x0c, 0x90, 0xe9, 0xae, 0xd9, 0x5d, 0x2c, 0x31, 0x76, 0x8c, 0x47, 0x19, 0x68, 0xc6, 0x62, 0x38, 0x4d, 0x6c, 0xd2, 0x3a, 0x6a, 0xa7, 0x3d, 0x4d, 0xce, 0x17, 0xc4, 0x9e, 0x14, + 0x9a, 0xc1, 0xeb, 0x45, 0xa1, 0x90, 0x4f, 0x15, 0x85, 0x06, 0x43, 0xcd, 0xdf, 0x1c, 0x3c, 0x34, 0x65, 0x38, 0x89, 0x1e, 0x1d, 0xb6, 0x4c, 0xff, 0x7d, 0xa6, 0x92, 0xc5, 0x8b, 0xc8, 0x4b, 0x7b, + 0xaf, 0x17, 0xd7, 0x34, 0x98, 0x11, 0xe3, 0x92, 0x28, 0x79, 0xad, 0xef, 0x51, 0x54, 0x82, 0x7b, 0x67, 0x46, 0xe6, 0x12, 0xcc, 0x50, 0xc9, 0xa6, 0xee, 0x0c, 0x18, 0x9a, 0x2d, 0x08, 0x75, 0xe5, + 0xeb, 0xb1, 0x0e, 0x9b, 0x6e, 0x46, 0xea, 0x31, 0x1c, 0x86, 0xb0, 0xe2, 0x2d, 0x43, 0xcf, 0x0b, 0xa0, 0xe5, 0xd2, 0x17, 0xbd, 0x0d, 0xe2, 0x6f, 0x0d, 0x1e, 0x1f, 0xa0, 0x8a, 0xf4, 0x1c, 0xbe, + 0x9a, 0xf9, 0x25, 0xdd, 0x6c, 0xd6, 0x6d, 0xea, 0xce, 0x47, 0x1c, 0xc6, 0x7d, 0x4a, 0x72, 0x7c, 0x2b, 0x40, 0x71, 0x7f, 0x94, 0xd4, 0xe1, 0xa3, 0x93, 0x7a, 0xe8, 0x5f, 0x18, 0x79, 0x66, 0x84, + 0xd4, 0x61, 0x7c, 0x81, 0xa9, 0x0e, 0xe3, 0xc9, 0x8b, 0x88, 0xdf, 0x51, 0x3a, 0x1d, 0x7c, 0x90, 0xc7, 0x03, 0x76, 0x55, 0xea, 0xcb, 0x15, 0x6e, 0x14, 0xbb, 0x85, 0x16, 0x86, 0x5b, 0x0b, 0x20, + 0x66, 0x1d, 0x0b, 0x32, 0xa4, 0x04, 0x08, 0xb4, 0x40, 0xe9, 0x4e, 0x7c, 0xea, 0x8f, 0xa8, 0x3d, 0x75, 0x91, 0x13, 0x51, 0x41, 0x12, 0xe7, 0xe5, 0x42, 0x14, 0x52, 0x73, 0x07, 0xb0, 0x64, 0x54, + 0x80, 0x45, 0xaa, 0x5f, 0x6e, 0x88, 0x1c, 0xd7, 0x9c, 0x8d, 0x89, 0x6f, 0x92, 0x32, 0x1d, 0x61, 0x55, 0xdf, 0xec, 0x75, 0xbf, 0xee, 0x84, 0xab, 0x89, 0x55, 0x1e, 0x9b, 0xc4, 0xfb, 0x3c, 0x73, + 0x7d, 0xdf, 0x0d, 0xdf, 0x65, 0x10, 0x7e, 0xf9, 0x94, 0xf8, 0xf6, 0xe9, 0x57, 0x6e, 0xb4, 0x3b, 0x47, 0x0c, 0x2f, 0xf3, 0xdc, 0xbd, 0xcf, 0x1e, 0xcd, 0x71, 0x4d, 0xf8, 0xe8, 0x30, 0x81, 0xfc, + 0x17, 0x7d, 0x62, 0x57, 0x79, 0x11, 0x78, 0xe9, 0xbc, 0x26, 0x74, 0x27, 0x57, 0x09, 0xbf, 0xf7, 0x1d, 0x20, 0x98, 0x15, 0x22, 0x79, 0x5b, 0xbd, 0x07, 0x38, 0x7d, 0xb1, 0x63, 0x93, 0xd9, 0x39, + 0x4d, 0xf1, 0x25, 0xcd, 0xe4, 0x50, 0x4c, 0x48, 0x73, 0x86, 0x48, 0x62, 0x72, 0xd8, 0x68, 0xc9, 0x1a, 0x98, 0xa1, 0x12, 0x26, 0x2c, 0x20, 0x21, 0x73, 0xd8, 0x32, 0xed, 0x4e, 0xea, 0xc9, 0xd8, + 0x2f, 0x84, 0xd0, 0x40, 0x41, 0x3f, 0xa7, 0x71, 0xcb, 0x57, 0x48, 0x26, 0xb0, 0xc1, 0xe3, 0x40, 0xc8, 0x84, 0x77, 0x63, 0x13, 0x3f, 0x5a, 0x02, 0x1e, 0x4d, 0x68, 0x7f, 0xdf, 0xf4, 0xbb, 0xbf, + 0x00, 0x4e, 0xee, 0x3f, 0xbf, 0x4e, 0x77, 0x23, 0xc0, 0xb1, 0xbb, 0x83, 0xdb, 0x42, 0x14, 0xbf, 0xc9, 0xf3, 0x78, 0x61, 0x22, 0xfc, 0x41, 0x36, 0x70, 0xb5, 0xed, 0x1b, 0x81, 0xc8, 0xa2, 0xa8, + 0x24, 0xe2, 0xee, 0x74, 0xc4, 0x93, 0x18, 0x2a, 0xb3, 0x55, 0x3f, 0x33, 0xbd, 0x46, 0x29, 0x89, 0xb5, 0x82, 0x12, 0x48, 0x11, 0x0b, 0x3a, 0x4c, 0x6a, 0x92, 0x39, 0x1c, 0x4d, 0x7e, 0x36, 0x84, + 0x9c, 0xe3, 0x95, 0x7a, 0x71, 0xd8, 0x25, 0x6c, 0x3a, 0xdb, 0x8f, 0x61, 0xda, 0x0f, 0xab, 0x0f, 0x9a, 0xa9, 0x3b, 0x2b, 0xee, 0xe5, 0x75, 0x96, 0xc5, 0x9e, 0x95, 0x7e, 0x70, 0xa7, 0xbe, 0x28, + 0x1a, 0xf4, 0xed, 0xb3, 0xef, 0x0c, 0xab, 0xf7, 0x07, 0xc1, 0x7b, 0x86, 0xcb, 0xcb, 0x6b, 0xec, 0xfb, 0xeb, 0x37, 0x2a, 0xc5, 0x37, 0x77, 0xd3, 0x5d, 0x65, 0x7e, 0x01, 0xda, 0xc9, 0xe2, 0xf8, + 0x97, 0x52, 0x66, 0xcf, 0x18, 0x5a, 0xdf, 0x85, 0xbf, 0x77, 0xec, 0xc7, 0xa3, 0xb1, 0xa6, 0x96, 0x4e, 0x9e, 0x3d, 0x55, 0xeb, 0xac, 0x38, 0x25, 0x43, 0x94, 0x07, 0x1d, 0x13, 0x4e, 0x39, 0x63, + 0x70, 0xd3, 0xfd, 0x21, 0x0e, 0xdd, 0xb9, 0x63, 0x1d, 0x7b, 0x61, 0x51, 0xcf, 0x5d, 0x06, 0x3b, 0x9d, 0x53, 0x7b, 0xaa, 0xb6, 0x1c, 0x2f, 0x13, 0x0b, 0x5f, 0x59, 0x29, 0x68, 0x62, 0xe6, 0x9d, + 0xae, 0xc0, 0x92, 0x46, 0x37, 0xb5, 0xcf, 0x0f, 0xe4, 0xca, 0x24, 0xe5, 0xc8, 0xaf, 0xe7, 0x10, 0x00, 0x3f, 0x67, 0xbf, 0xbe, 0xf3, 0x43, 0xdf, 0x71, 0xbe, 0xbf, 0xd3, 0x97, 0xde, 0x7f, 0xf7, + 0x41, 0xe9, 0xf7, 0xf8, 0xfd, 0xd7, 0xff, 0xff, 0x87, 0x4e, 0x1b, 0xc7, 0xfa, 0xf8, 0xf7, 0x27, 0x6a, 0x37, 0xd2, 0xdf, 0xbb, 0xed, 0x3b, 0xf7, 0xe3, 0x88, 0xf3, 0xb3, 0xe9, 0x8c, 0x85, 0x94, + 0x5c, 0xf3, 0x66, 0x90, 0x13, 0xe5, 0x99, 0x43, 0xcc, 0x77, 0xeb, 0xae, 0x17, 0x97, 0x72, 0xa1, 0x50, 0x2e, 0x8c, 0x38, 0x30, 0x24, 0x25, 0x88, 0x95, 0xb8, 0xec, 0xa1, 0x5c, 0x8b, 0xb4, 0x89, + 0x08, 0xcc, 0xd9, 0xd2, 0x21, 0x78, 0x58, 0xae, 0xd4, 0xd2, 0x4b, 0x80, 0x32, 0x65, 0x55, 0x13, 0x75, 0xbb, 0xd2, 0x5e, 0xa2, 0x9a, 0x56, 0x6a, 0x9d, 0x75, 0xf4, 0x69, 0x93, 0x19, 0xb1, 0xc8, + 0xfc, 0xdf, 0xb8, 0x1f, 0xbf, 0x0c, 0xc8, 0x9f, 0xce, 0xa0, 0xbf, 0x1f, 0xdc, 0x3c, 0xe6, 0x7e, 0x1c, 0x69, 0xb3, 0xff, 0x58, 0xa8, 0xf2, 0xe1, 0x72, 0x76, 0x5f, 0x4b, 0xde, 0x2a, 0x19, 0xfe, + 0x17, 0xa7, 0xeb, 0xab, 0xc8, 0x8b, 0x3e, 0x5c, 0x2f, 0xc6, 0x4c, 0xc8, 0xf0, 0xa4, 0x56, 0xa4, 0x59, 0x34, 0x10, 0xf3, 0x22, 0x32, 0xce, 0xc2, 0xc9, 0x5c, 0xb4, 0x14, 0x24, 0x09, 0xcd, 0x96, + 0xaf, 0xf3, 0x11, 0x85, 0xf3, 0xde, 0x68, 0xac, 0xee, 0xdb, 0x94, 0xcf, 0xb4, 0xe1, 0x2a, 0x11, 0x9c, 0xbc, 0xfc, 0x7b, 0x4d, 0xf5, 0x1f, 0xb1, 0xa4, 0x6c, 0x78, 0x53, 0x83, 0x43, 0xca, 0x58, + 0x1b, 0xda, 0x91, 0x32, 0xd2, 0x99, 0x26, 0x47, 0x61, 0x03, 0x6c, 0xf5, 0xa0, 0xd7, 0x8c, 0x65, 0xd5, 0xfa, 0x39, 0x91, 0x38, 0x8d, 0x99, 0xcc, 0x5c, 0x45, 0xe3, 0x79, 0x08, 0xa4, 0xa3, 0xba, + 0xd4, 0xba, 0x05, 0x75, 0x66, 0x48, 0x04, 0x4c, 0x68, 0xdd, 0xae, 0x37, 0x15, 0x17, 0x2d, 0x56, 0x96, 0x0b, 0x75, 0xab, 0x2a, 0x73, 0xa7, 0x43, 0xa9, 0x52, 0xec, 0x8d, 0x05, 0xfd, 0xc1, 0x41, + 0xf5, 0xa8, 0xb9, 0x7f, 0xbf, 0x65, 0x78, 0x95, 0x09, 0x4e, 0xde, 0xae, 0xae, 0x4d, 0x1e, 0xb1, 0x69, 0x40, 0x3b, 0x97, 0x0b, 0xdd, 0x43, 0x5f, 0x60, 0xe2, 0x1c, 0x22, 0xa7, 0xc6, 0x86, 0x55, + 0x30, 0x35, 0xdf, 0x29, 0x32, 0x85, 0x76, 0x91, 0x41, 0xc5, 0x2b, 0x7d, 0x1b, 0x34, 0x09, 0x72, 0x92, 0x9d, 0x16, 0x9c, 0xc2, 0x4a, 0x8a, 0x78, 0x89, 0x04, 0xb9, 0xbd, 0x23, 0xe9, 0xd3, 0xe6, + 0x60, 0x6c, 0xbc, 0xa8, 0xe3, 0xdb, 0x23, 0xce, 0x56, 0xad, 0xed, 0xc6, 0xfb, 0x0d, 0xb0, 0x30, 0x59, 0xa7, 0x26, 0x3e, 0xdc, 0x23, 0xff, 0x73, 0xf9, 0xef, 0xff, 0xfb, 0x9f, 0xff, 0x3f, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe0, 0xbc, 0xb9, 0x6b, 0x52, 0xa3, 0x00, 0x00, 0x08, 0x35, 0x02, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x6c, 0x51, 0x4d, 0x6f, 0x1a, 0x31, 0x10, 0xbd, 0xef, 0xaf, 0x18, 0xed, 0x81, 0x53, 0xd7, 0x0b, 0x8b, 0xda, 0x03, 0x52, 0x0f, 0xa8, 0xa5, 0xed, 0x01, + 0x35, 0x39, 0x90, 0x5c, 0xa2, 0x80, 0x8c, 0x3d, 0xb0, 0x26, 0xbb, 0x63, 0xc7, 0x1f, 0x90, 0x28, 0xe2, 0xbf, 0x47, 0xf6, 0x42, 0x96, 0xa0, 0x1c, 0xfd, 0xc6, 0xef, 0xbd, 0x79, 0x6f, 0xde, 0x32, + 0x80, 0x9c, 0x78, 0x8b, 0xf9, 0x04, 0xf2, 0xda, 0x7b, 0x53, 0xd4, 0x9c, 0x64, 0x83, 0x36, 0xff, 0x16, 0x27, 0x7b, 0xb4, 0x4e, 0x69, 0x8a, 0xc3, 0x21, 0x1b, 0xb1, 0x61, 0x87, 0x4a, 0x74, 0xc2, + 0x2a, 0xe3, 0x4f, 0x93, 0x29, 0x6c, 0x02, 0x89, 0xf8, 0x82, 0x43, 0xad, 0x44, 0x0d, 0x16, 0x9d, 0xd1, 0x24, 0x1d, 0x78, 0x0d, 0xff, 0x16, 0x8b, 0x5b, 0xb0, 0xf8, 0x1c, 0xd0, 0x79, 0xd7, 0xd1, + 0x5b, 0xae, 0x12, 0x4f, 0x91, 0xc4, 0x17, 0xb6, 0x3b, 0xa1, 0x9d, 0xa4, 0xcb, 0x27, 0x10, 0x77, 0x02, 0xc8, 0x3d, 0x3a, 0x1f, 0xbf, 0x91, 0x96, 0x08, 0xf1, 0x51, 0x06, 0x52, 0x9e, 0xed, 0x1c, + 0x0c, 0x06, 0xd0, 0x83, 0x8a, 0x3c, 0x6e, 0x2d, 0x8f, 0xf6, 0x67, 0xad, 0xa8, 0xe6, 0xb9, 0x4d, 0xec, 0x3f, 0x77, 0xff, 0x7f, 0xad, 0xe6, 0x37, 0x7f, 0x57, 0xf3, 0xd9, 0xfd, 0x6c, 0xfe, 0x53, + 0xd1, 0x46, 0xc3, 0x86, 0x73, 0x57, 0xec, 0x5c, 0x61, 0x03, 0x79, 0xd5, 0x22, 0xb0, 0xf2, 0xd3, 0x2a, 0x29, 0xe1, 0x3a, 0x6c, 0xcf, 0xe6, 0xad, 0x26, 0x28, 0x0a, 0x45, 0xce, 0xa0, 0xf0, 0xc0, + 0xca, 0x88, 0xad, 0x5a, 0x2d, 0x43, 0x83, 0xae, 0xbc, 0xd2, 0x2a, 0xd7, 0x8a, 0x4a, 0xd1, 0xa8, 0xb8, 0xe6, 0x85, 0x6c, 0x06, 0x70, 0x4c, 0x29, 0x9f, 0xf0, 0xf5, 0xa0, 0xad, 0x8c, 0x31, 0x1f, + 0x1e, 0x13, 0xc2, 0x83, 0xaf, 0xb5, 0x8d, 0x5e, 0x5d, 0x0f, 0x8d, 0x12, 0x48, 0x2e, 0xdd, 0x63, 0x6a, 0xb8, 0xa8, 0xb1, 0xa8, 0xfa, 0xde, 0x0d, 0x92, 0x44, 0x12, 0x0a, 0x2f, 0x7a, 0xba, 0xda, + 0x20, 0x12, 0x97, 0x15, 0xab, 0x58, 0xd5, 0xbb, 0x4a, 0xdc, 0xff, 0xfe, 0x92, 0x7b, 0x8a, 0x97, 0x38, 0x63, 0x36, 0x64, 0xa3, 0x8f, 0xfe, 0x82, 0x41, 0x7b, 0xbe, 0xc0, 0xf2, 0x07, 0x1b, 0xf7, + 0x23, 0xcf, 0x4d, 0x67, 0xf2, 0x3d, 0x11, 0xa2, 0x49, 0x76, 0xcc, 0xde, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x6f, 0x2e, 0x1b, 0x62, 0x4a, 0x01, 0x00, 0x00, 0x49, 0x02, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x6e, + 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0xcc, 0x93, 0xcf, 0x8e, 0xd3, 0x30, 0x10, 0xc6, 0xef, 0x79, 0x8a, 0xb9, 0xd9, 0x91, 0xd2, 0xb4, 0xac, 0xf6, 0x94, 0xa8, 0x70, 0x58, 0x2d, + 0x2c, 0x17, 0xa8, 0x20, 0x3c, 0x80, 0x49, 0xa6, 0x6d, 0x56, 0xad, 0x9d, 0xce, 0x8c, 0x81, 0xaa, 0xca, 0xbb, 0x23, 0xc7, 0xe9, 0x1f, 0x0a, 0x12, 0x08, 0xed, 0x4a, 0x7b, 0x8a, 0x3c, 0xf9, 0xfc, + 0xcd, 0x37, 0xf3, 0x93, 0x95, 0x67, 0x04, 0x16, 0x6a, 0x6b, 0x51, 0x65, 0x92, 0xd4, 0xce, 0xb2, 0xc0, 0x01, 0x58, 0x0c, 0x09, 0xf4, 0x30, 0x07, 0xc2, 0x9d, 0x6f, 0x09, 0xb5, 0x5a, 0x1a, 0xc3, + 0x93, 0x47, 0x9e, 0x90, 0xb7, 0xd2, 0x6e, 0x51, 0xa5, 0xe5, 0xa8, 0x0e, 0x0a, 0x64, 0xb9, 0xd4, 0xb2, 0xef, 0x90, 0x04, 0x59, 0x82, 0x6a, 0x94, 0x2d, 0xbd, 0xad, 0x2f, 0x35, 0x79, 0xae, 0xd2, + 0x7c, 0x6d, 0x6c, 0xb3, 0xc1, 0xa3, 0x93, 0x5c, 0xd9, 0x88, 0xe9, 0xf0, 0xc2, 0x01, 0x89, 0x1e, 0x06, 0x3d, 0xc1, 0x1c, 0x04, 0xe6, 0xaf, 0x43, 0x25, 0x7c, 0x0e, 0x09, 0x80, 0xe4, 0x48, 0xe4, + 0x48, 0x23, 0x51, 0x5a, 0xc6, 0xb3, 0x6d, 0x74, 0x5a, 0x26, 0x7d, 0x99, 0x24, 0xc1, 0x58, 0xab, 0xf7, 0x56, 0x70, 0x45, 0x46, 0x5a, 0x67, 0x0b, 0x88, 0x9d, 0x19, 0x8c, 0x85, 0x87, 0xaa, 0x5a, + 0xc0, 0xbb, 0xfb, 0x4a, 0x65, 0xd1, 0x35, 0xd8, 0x0d, 0x0b, 0xd0, 0x21, 0x73, 0x9a, 0xcb, 0x1a, 0xad, 0x66, 0xa4, 0x6f, 0x78, 0xea, 0x16, 0xfc, 0xbb, 0x8d, 0xb1, 0xfa, 0x66, 0x68, 0x06, 0xc7, + 0x25, 0x8c, 0xb2, 0x74, 0xa8, 0x01, 0xe4, 0x2b, 0x14, 0xad, 0xa6, 0x6f, 0xac, 0xd9, 0xe2, 0x5c, 0xda, 0x15, 0x92, 0x3a, 0xfd, 0xc2, 0x1f, 0x1d, 0xd6, 0xa2, 0x6f, 0x66, 0xb3, 0xeb, 0x92, 0xba, + 0x73, 0x56, 0xd0, 0xca, 0xa4, 0xda, 0x77, 0xa8, 0x32, 0x98, 0x3e, 0xb2, 0xb3, 0xd3, 0xb3, 0xca, 0x36, 0x3a, 0x8c, 0x99, 0x01, 0x21, 0xa7, 0xe7, 0x44, 0x31, 0xd5, 0x69, 0x0b, 0x19, 0xa8, 0x0f, + 0x0e, 0x86, 0xa3, 0x1a, 0x43, 0x46, 0x45, 0x83, 0xd8, 0xdd, 0xef, 0xbc, 0xd9, 0x68, 0x42, 0xce, 0xbf, 0xba, 0x66, 0x9f, 0xc1, 0x01, 0x76, 0x1e, 0x69, 0x5f, 0xc0, 0x01, 0x42, 0xd6, 0x02, 0x54, + 0x4c, 0x0b, 0x3d, 0xf4, 0xbf, 0x5c, 0x1e, 0x97, 0x7a, 0x2c, 0xc4, 0x71, 0xf3, 0x7a, 0xe3, 0x18, 0xcf, 0xf5, 0x78, 0xa5, 0xcf, 0x2e, 0x88, 0x69, 0x49, 0x03, 0x8b, 0xf4, 0xdf, 0x60, 0x2c, 0x3e, + 0x7e, 0x7e, 0x0e, 0x1a, 0x9d, 0x0b, 0x9d, 0xa7, 0x67, 0x06, 0x1c, 0xc6, 0xf9, 0x6d, 0xe4, 0x97, 0x8a, 0xe8, 0x3a, 0xe6, 0xf3, 0x73, 0x21, 0xe4, 0xce, 0xd9, 0x86, 0xe1, 0x7b, 0x2b, 0xeb, 0x18, + 0x14, 0x6a, 0xd7, 0x20, 0xb4, 0x4b, 0xb0, 0xd8, 0xca, 0x1a, 0x29, 0x3c, 0x1c, 0x70, 0xf4, 0xdf, 0xc8, 0x5e, 0xfd, 0x05, 0x99, 0x7f, 0x09, 0xc4, 0xfe, 0xcc, 0x63, 0x8b, 0xcc, 0x66, 0x15, 0x72, + 0x7c, 0x72, 0x5e, 0x10, 0x16, 0x5f, 0xaa, 0x62, 0x0a, 0xd6, 0x09, 0x2c, 0x9d, 0xb7, 0x8d, 0xca, 0xe2, 0xc6, 0x8a, 0x40, 0x59, 0xe0, 0xed, 0x58, 0x63, 0x31, 0xe2, 0xf9, 0xce, 0x35, 0x58, 0xc0, + 0xed, 0xec, 0xf6, 0xc9, 0x39, 0xfe, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x3b, 0xa7, 0x29, 0xe2, 0xc2, 0x01, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0xc4, 0x92, 0xc1, 0x8e, 0xd3, 0x30, 0x10, 0x86, 0xef, 0x79, 0x8a, 0xff, 0xe6, 0x54, 0x8a, 0xbc, 0x20, + 0xc1, 0x25, 0x51, 0xb9, 0xa0, 0x15, 0x70, 0x58, 0xb1, 0x12, 0xe5, 0x01, 0x4c, 0x3c, 0x6d, 0x2c, 0x5c, 0x4f, 0x6a, 0x8f, 0x29, 0x55, 0xd4, 0x77, 0x47, 0x89, 0x23, 0x81, 0xd0, 0xaa, 0xe5, 0xc6, + 0x29, 0x8a, 0x3d, 0x9e, 0xf9, 0xbe, 0xdf, 0x56, 0x39, 0x11, 0x92, 0x44, 0xd7, 0x8b, 0xea, 0xaa, 0xaa, 0xe7, 0x90, 0x04, 0xfb, 0x1c, 0x7a, 0x6c, 0x11, 0xe9, 0x94, 0x5d, 0xa4, 0x5a, 0x69, 0xad, + 0x36, 0x7a, 0x30, 0xc1, 0x7a, 0xea, 0xd6, 0x12, 0xa1, 0x24, 0x7f, 0x96, 0x88, 0x19, 0x49, 0x6d, 0x7e, 0x77, 0x70, 0x3f, 0x25, 0x47, 0xc2, 0x16, 0x13, 0x3c, 0x1f, 0x5a, 0x4c, 0x70, 0x61, 0xcf, + 0x2d, 0xe6, 0x6d, 0xf6, 0xa4, 0x3d, 0x1f, 0x70, 0xc5, 0xb5, 0xab, 0xaa, 0xb9, 0x53, 0xad, 0xbe, 0x06, 0x27, 0x2d, 0xca, 0x8c, 0x04, 0x13, 0xf0, 0x71, 0xb7, 0x7b, 0xc6, 0x87, 0xc7, 0x9d, 0x6a, + 0x60, 0xd2, 0x25, 0xf4, 0x10, 0x6c, 0xdf, 0x61, 0xaa, 0x00, 0xd1, 0xa3, 0x37, 0xa1, 0x7e, 0xbd, 0xe9, 0x2a, 0xe0, 0xe1, 0x01, 0x9f, 0xc2, 0x0f, 0xfe, 0x4e, 0x90, 0x81, 0x16, 0x70, 0x71, 0x1c, + 0x1a, 0x9c, 0x07, 0xd7, 0x0f, 0x48, 0x03, 0x67, 0x6f, 0xd1, 0xf3, 0x71, 0xf4, 0x24, 0x84, 0xb3, 0x93, 0x81, 0xb3, 0x80, 0x62, 0xe4, 0xa8, 0x2b, 0xa0, 0xd0, 0x46, 0x4a, 0xd9, 0xcf, 0x3a, 0xe6, + 0x6c, 0x5c, 0xd1, 0xaf, 0x27, 0x68, 0xad, 0x57, 0x8d, 0x06, 0x47, 0x92, 0x81, 0x6d, 0x0b, 0x55, 0x88, 0x4e, 0x99, 0xe2, 0x65, 0x96, 0x0a, 0xe6, 0x48, 0x2d, 0x94, 0xb8, 0x03, 0x45, 0x35, 0x0b, + 0x2d, 0x50, 0xa2, 0x2d, 0xd1, 0xf8, 0x78, 0xca, 0xc6, 0xd7, 0xa5, 0x77, 0x83, 0xe9, 0xfe, 0x21, 0x0a, 0xb6, 0xde, 0x74, 0xd5, 0xfc, 0x7b, 0x33, 0x95, 0xe7, 0xcf, 0x5f, 0xee, 0xc5, 0x52, 0xbc, + 0xbe, 0xb1, 0xbd, 0x2c, 0x57, 0xf0, 0xd7, 0xc4, 0xff, 0x11, 0xdc, 0x0a, 0xbd, 0x20, 0x5d, 0xcb, 0xf7, 0x46, 0x56, 0xa5, 0xec, 0x4e, 0x2e, 0x91, 0xd2, 0xc8, 0xc1, 0xa6, 0x85, 0xae, 0xa0, 0xa1, + 0x67, 0x4b, 0x70, 0x7b, 0x04, 0x72, 0x32, 0x50, 0x9c, 0x5f, 0x10, 0x38, 0xfe, 0x7b, 0x64, 0x2f, 0x19, 0xad, 0x32, 0x37, 0x70, 0x93, 0x18, 0xc9, 0xe9, 0x3d, 0x5b, 0x6a, 0xf1, 0xe6, 0xd5, 0xdb, + 0x66, 0x5d, 0x78, 0xa2, 0x94, 0xcc, 0x61, 0x4e, 0xfe, 0x69, 0x89, 0x01, 0x81, 0x05, 0xc6, 0x7b, 0x3e, 0x93, 0x55, 0x2f, 0xe9, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x14, + 0xca, 0x4c, 0x74, 0x6c, 0x01, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x70, + 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0x28, + 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0xd0, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, + 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, + 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x53, 0xcd, 0x8e, 0xdb, 0x3c, 0x0c, 0xbc, 0xeb, 0x29, 0xe6, 0xc3, 0x5e, 0xb2, 0xdf, 0xc1, 0xde, 0xe3, 0x62, 0xaf, 0xc5, 0xf6, 0x5c, 0x14, 0x29, 0x8a, + 0x22, 0x08, 0x6a, 0x45, 0x62, 0x62, 0x75, 0xb5, 0xa4, 0x21, 0xd2, 0x49, 0xf3, 0xf6, 0x85, 0x9c, 0x38, 0x3f, 0x68, 0x8b, 0x9e, 0x12, 0x90, 0x43, 0x6a, 0x38, 0x33, 0x7e, 0xc0, 0xa7, 0xa3, 0xf5, + 0xc2, 0xf8, 0x90, 0x65, 0x8c, 0xaf, 0x7b, 0x62, 0x53, 0x7c, 0x1c, 0x39, 0x58, 0x12, 0x76, 0xee, 0x2b, 0xe5, 0x20, 0xef, 0x04, 0x13, 0x1c, 0x65, 0x2c, 0x60, 0x3a, 0xcc, 0x03, 0xdb, 0x33, 0x08, + 0x43, 0x91, 0x1f, 0x14, 0xec, 0x3f, 0x2c, 0x7b, 0xc2, 0x46, 0x52, 0xa6, 0x32, 0x64, 0x6f, 0x74, 0x41, 0xb8, 0x20, 0x91, 0x10, 0x3c, 0x63, 0x43, 0xd8, 0xca, 0xc8, 0x11, 0x89, 0xb1, 0xea, 0x6a, + 0xbf, 0x19, 0x8e, 0xdd, 0x7a, 0xd1, 0xb4, 0xe7, 0xff, 0x8f, 0x0d, 0x96, 0x7d, 0xd2, 0xeb, 0xf2, 0xa4, 0x78, 0x27, 0xcf, 0xe6, 0x4c, 0x50, 0x48, 0x07, 0xe1, 0x58, 0xc9, 0xac, 0x26, 0xba, 0x38, + 0xf1, 0x5d, 0x2f, 0x7a, 0xb3, 0x41, 0x5f, 0xda, 0x36, 0xd4, 0x2a, 0x4d, 0xc5, 0x26, 0x49, 0xfb, 0xd8, 0x38, 0xf7, 0xf0, 0x80, 0x57, 0x8e, 0x83, 0x24, 0x36, 0x75, 0xee, 0xf3, 0xc8, 0x9c, 0x78, + 0x07, 0xbb, 0x7b, 0xe4, 0x90, 0x72, 0x06, 0xfd, 0x1c, 0x44, 0x09, 0xd6, 0x17, 0x22, 0xd0, 0x3c, 0xd2, 0x38, 0x07, 0xfc, 0x8f, 0xae, 0xed, 0xa6, 0xf3, 0xe6, 0x3a, 0xb6, 0x52, 0x4e, 0x8a, 0xcc, + 0x4b, 0x9a, 0x33, 0xae, 0x27, 0x9f, 0xad, 0x6f, 0x0b, 0xf9, 0x98, 0x98, 0x54, 0xff, 0x30, 0xe7, 0x71, 0xe9, 0xe2, 0x04, 0x47, 0xe8, 0x29, 0xbc, 0xdd, 0x6f, 0xc8, 0x69, 0x4f, 0x7f, 0x5d, 0x30, + 0x37, 0xef, 0xe7, 0x5d, 0x45, 0xde, 0x56, 0x74, 0x56, 0xdd, 0x87, 0x40, 0xaa, 0x34, 0x09, 0x3f, 0xd1, 0xde, 0x14, 0x39, 0x28, 0x15, 0x78, 0x73, 0xab, 0xaa, 0xde, 0x4b, 0xdb, 0x66, 0x09, 0x3e, + 0xf7, 0xa2, 0xf6, 0xf2, 0xfc, 0xf4, 0xfc, 0xf4, 0xdb, 0x21, 0xeb, 0xc5, 0x23, 0x3c, 0xc7, 0x7f, 0xc0, 0x67, 0x62, 0xeb, 0x45, 0x15, 0xff, 0x9b, 0x8c, 0x13, 0x83, 0x51, 0x09, 0x93, 0xdd, 0x48, + 0xbc, 0x97, 0x37, 0xea, 0xaa, 0x87, 0x4a, 0x1c, 0xe1, 0x19, 0x93, 0x5f, 0xb5, 0x60, 0xfd, 0x35, 0x33, 0x97, 0x83, 0x1b, 0x37, 0x79, 0xb8, 0x24, 0xb5, 0xc4, 0xbb, 0x7a, 0xe2, 0xad, 0x73, 0xe7, + 0xec, 0x21, 0x71, 0xc8, 0x63, 0x24, 0x85, 0xc7, 0x6a, 0xe4, 0x64, 0x30, 0x52, 0xab, 0xb9, 0xaa, 0xbf, 0xdf, 0xaf, 0xe1, 0xfa, 0x32, 0xc4, 0x9a, 0xcc, 0x6a, 0xbf, 0xf3, 0x5a, 0xa5, 0x80, 0x8f, + 0x11, 0x9b, 0x51, 0x4f, 0x76, 0x64, 0xd9, 0xa5, 0x70, 0x49, 0xfb, 0x35, 0x85, 0x0c, 0x29, 0x91, 0xca, 0xc4, 0x92, 0xd4, 0x90, 0x4c, 0xb1, 0xa1, 0xde, 0xef, 0x93, 0x94, 0xc6, 0xb9, 0xae, 0xeb, + 0x82, 0xb0, 0x4a, 0x26, 0x37, 0x9c, 0xbe, 0x8e, 0xdb, 0x77, 0x6b, 0xdb, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x70, 0x13, 0x6b, 0x58, 0xac, 0x01, 0x00, 0x00, 0x69, 0x03, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x68, 0x52, 0x56, 0xd4, 0x4f, 0xca, 0xcc, 0xd3, + 0x2f, 0xce, 0xe0, 0xe2, 0x4a, 0xad, 0x48, 0x4d, 0x56, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0x50, 0x52, + 0xd1, 0x48, 0xc9, 0x2c, 0xca, 0x4b, 0xcc, 0x4d, 0x55, 0x50, 0x52, 0x31, 0x50, 0xd2, 0x54, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa7, 0x6e, 0xed, 0xb6, 0x3d, 0x00, + 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, 0x90, + 0xc1, 0x4e, 0xc3, 0x30, 0x10, 0x44, 0xef, 0xf9, 0x8a, 0x51, 0x7b, 0x01, 0x09, 0xf5, 0x03, 0x7a, 0x02, 0x55, 0xf4, 0x0b, 0x7a, 0x47, 0x9b, 0x78, 0x42, 0x96, 0x3a, 0x76, 0xb0, 0xd7, 0x29, 0xfd, + 0x7b, 0x14, 0x37, 0x41, 0xe2, 0x94, 0xd5, 0x66, 0xde, 0xce, 0x78, 0xfa, 0x14, 0x47, 0x4c, 0x92, 0xbc, 0xca, 0xc8, 0x60, 0xd0, 0x71, 0x8a, 0xc9, 0x70, 0x8a, 0xc1, 0xf8, 0x63, 0x2f, 0xe0, 0xcc, + 0x60, 0x4d, 0xd3, 0xbc, 0x3e, 0x06, 0xc7, 0x1e, 0xa3, 0x68, 0x78, 0xea, 0x1e, 0x82, 0xe3, 0xa6, 0x7c, 0x3e, 0x36, 0x00, 0xb0, 0xdb, 0xed, 0xea, 0xf7, 0x5c, 0x42, 0x67, 0x1a, 0x03, 0x8c, 0xe3, + 0xe4, 0xc5, 0x58, 0xb7, 0x97, 0x81, 0x58, 0xc1, 0xc5, 0x53, 0x46, 0x1a, 0x53, 0xdd, 0x88, 0x86, 0x0c, 0x1b, 0x88, 0xb3, 0x97, 0x7c, 0x45, 0xe2, 0x77, 0x61, 0x36, 0xc4, 0xf6, 0x8b, 0x9d, 0x41, + 0x82, 0x83, 0x84, 0x7b, 0xbd, 0x71, 0xf2, 0xb1, 0xb8, 0xf7, 0x25, 0x0c, 0x12, 0x3b, 0xea, 0x4c, 0x87, 0x9b, 0xda, 0x50, 0xe9, 0x95, 0x3b, 0xfc, 0x65, 0xa9, 0xc3, 0x1e, 0x6f, 0xce, 0xe1, 0x1e, + 0x4b, 0x42, 0x5b, 0xb2, 0x06, 0xe6, 0x0c, 0x1f, 0x3f, 0xb5, 0xc3, 0xc0, 0xc4, 0x4d, 0x73, 0xa9, 0xbc, 0x95, 0x14, 0x30, 0x8b, 0x2f, 0xac, 0x3f, 0x71, 0x53, 0xef, 0xd1, 0x12, 0x32, 0x4d, 0x5e, + 0xe9, 0x20, 0x8f, 0x98, 0x4e, 0x4c, 0x20, 0x66, 0x49, 0xdb, 0xb2, 0x3e, 0x6e, 0x8f, 0xd8, 0x43, 0xfe, 0xe7, 0x5b, 0xae, 0xd1, 0xc1, 0x62, 0x85, 0xfa, 0xad, 0x14, 0x0d, 0x73, 0xbc, 0x32, 0x55, + 0x6c, 0xb5, 0x5c, 0x6b, 0x39, 0x74, 0x0b, 0xfe, 0x51, 0xcb, 0x3e, 0x2c, 0x26, 0xcd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x87, 0x81, 0xa6, 0x27, 0xf6, 0x00, 0x00, 0x00, + 0xa1, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, + 0x6d, 0x6c, 0xca, 0xcc, 0x2b, 0xcb, 0xcf, 0x4e, 0xb5, 0x52, 0x50, 0x4a, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x2a, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0xd1, 0x4d, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, + 0xcf, 0x2b, 0xb6, 0xb5, 0x35, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x70, 0x79, + 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, 0x52, 0xc1, + 0x8e, 0xdb, 0x3a, 0x0c, 0xbc, 0xeb, 0x2b, 0xf8, 0xf4, 0x2e, 0x36, 0x90, 0x2a, 0xed, 0x35, 0x80, 0x4f, 0xc1, 0x16, 0x3d, 0xf5, 0xb4, 0x40, 0x8f, 0x02, 0xd7, 0xa2, 0x37, 0x42, 0x65, 0xc9, 0x2b, + 0xd2, 0x46, 0x83, 0xa2, 0xff, 0x5e, 0x50, 0x4e, 0x76, 0x53, 0x1f, 0x6c, 0x6b, 0x38, 0x33, 0x1c, 0x89, 0x9a, 0x6a, 0x99, 0x61, 0x4c, 0x65, 0x0d, 0xb4, 0x51, 0x16, 0x76, 0x17, 0x91, 0x05, 0xe2, + 0xbc, 0x94, 0x2a, 0x70, 0x56, 0xfc, 0x49, 0x71, 0xd3, 0x78, 0x0b, 0xd6, 0x14, 0x71, 0xa6, 0x2c, 0xef, 0x8c, 0x92, 0x85, 0x7e, 0x89, 0x31, 0xb7, 0xf5, 0x9a, 0xa3, 0x08, 0xb1, 0x18, 0x33, 0xad, + 0x79, 0x84, 0x01, 0xbc, 0xdf, 0x2b, 0xde, 0x77, 0x56, 0x21, 0xdb, 0x1b, 0x33, 0x26, 0x64, 0x86, 0x67, 0x62, 0xf9, 0xba, 0xe6, 0xb1, 0xbb, 0x6b, 0x9c, 0x22, 0x67, 0x64, 0xea, 0x4f, 0xc6, 0x00, + 0x04, 0x9a, 0x40, 0x61, 0xaf, 0xb2, 0x8e, 0x29, 0x4d, 0xfd, 0xc9, 0x00, 0x00, 0xfc, 0x0f, 0xe7, 0x4a, 0x28, 0x04, 0xf8, 0x18, 0x70, 0xaf, 0x7c, 0x82, 0xe7, 0x0b, 0x3d, 0xc0, 0x60, 0x63, 0xb0, + 0x10, 0x19, 0x5e, 0x29, 0x53, 0x45, 0xa1, 0x00, 0x71, 0x82, 0x32, 0x6b, 0xc7, 0xe0, 0xc0, 0xf2, 0x42, 0xe3, 0x46, 0x95, 0x63, 0xc9, 0x56, 0x3b, 0xe2, 0x9a, 0x84, 0x41, 0x0a, 0xd8, 0x2f, 0xee, + 0xb3, 0x75, 0xcd, 0x15, 0x45, 0x6a, 0x7c, 0x59, 0x85, 0x18, 0x06, 0xf8, 0xdd, 0x20, 0x7d, 0xac, 0x5c, 0x17, 0xb2, 0x27, 0xb0, 0x81, 0x36, 0xf7, 0x33, 0xa3, 0xc4, 0x8d, 0x9c, 0x66, 0x15, 0x35, + 0x3b, 0x7c, 0xf0, 0xb8, 0xac, 0x75, 0x6c, 0x4c, 0x3d, 0x5b, 0x3e, 0x1d, 0x8f, 0x77, 0x76, 0xa0, 0xed, 0xb8, 0x5c, 0xe5, 0x52, 0xb2, 0x6b, 0xa7, 0x7f, 0x53, 0xfd, 0x69, 0xef, 0x80, 0x82, 0xda, + 0xd0, 0xce, 0xc4, 0x8c, 0xaf, 0xcd, 0xe0, 0x1b, 0xa5, 0x54, 0xe0, 0x47, 0xa9, 0x29, 0xfc, 0x67, 0x77, 0x5a, 0x13, 0xc2, 0xf0, 0xb0, 0xe7, 0xee, 0x23, 0xf0, 0xa1, 0xb9, 0xf4, 0x8d, 0x38, 0xee, + 0xa3, 0x52, 0xea, 0xfe, 0xd7, 0x55, 0x7a, 0x1b, 0xbe, 0x97, 0x4c, 0xff, 0xd4, 0x5d, 0xbb, 0x0c, 0xfe, 0x6e, 0xdb, 0xbe, 0xa6, 0x11, 0x5e, 0x4a, 0xb8, 0xc2, 0x00, 0xba, 0x45, 0x37, 0x63, 0xcc, + 0xdd, 0x4d, 0xb1, 0xcb, 0x75, 0x40, 0x0e, 0x99, 0xa9, 0xca, 0xd3, 0xdb, 0x8a, 0xa9, 0x53, 0xba, 0xd3, 0xf6, 0x87, 0x5b, 0x48, 0xb7, 0x67, 0x31, 0x71, 0x02, 0xef, 0x33, 0xce, 0xe4, 0x3d, 0x0c, + 0x03, 0x58, 0xef, 0xd5, 0xcd, 0x7b, 0xab, 0xe3, 0x7d, 0xbf, 0x0c, 0xad, 0x43, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdf, 0xc1, 0x82, 0x54, 0x76, 0x01, 0x00, 0x00, 0x9f, + 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, + 0x65, 0x1c, 0xc1, 0x51, 0x0a, 0x80, 0x20, 0x0c, 0x06, 0xe0, 0xf7, 0x4e, 0xb1, 0x0b, 0xfc, 0xe1, 0xa3, 0x08, 0x1e, 0x46, 0x97, 0xca, 0x60, 0x6c, 0x92, 0x49, 0xd7, 0x0f, 0xe2, 0x7b, 0x5b, 0x4d, + 0x34, 0xb6, 0x09, 0xfb, 0x6d, 0xd4, 0xb7, 0x71, 0x2a, 0x73, 0xaa, 0x70, 0x79, 0xc4, 0x8d, 0x80, 0x2a, 0x76, 0xe5, 0x70, 0xfe, 0x52, 0x0c, 0x31, 0x10, 0x50, 0x98, 0xdb, 0x5a, 0x50, 0x1f, 0x5d, + 0xb4, 0x65, 0x1c, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfe, 0x63, 0x36, 0x9f, 0x48, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, + 0x61, 0x73, 0x6b, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, 0x8d, 0x41, 0x0a, 0xc2, 0x30, 0x10, 0x45, 0xf7, 0x73, 0x8a, 0xef, 0x6a, 0x92, 0x8d, 0xee, 0x85, 0x82, 0x2b, 0xf1, 0x06, + 0x2e, 0x87, 0x68, 0x13, 0x0c, 0x26, 0x99, 0x32, 0xa6, 0xf7, 0x97, 0xb6, 0x08, 0x75, 0xf9, 0x1f, 0x9f, 0xf7, 0x92, 0x69, 0x45, 0x2a, 0xe1, 0xf3, 0x46, 0xae, 0x93, 0x5a, 0xc7, 0x75, 0x19, 0x44, + 0x61, 0x9a, 0x4a, 0x7e, 0x86, 0x9e, 0xb5, 0x61, 0xd8, 0xa0, 0x13, 0x69, 0xa1, 0x46, 0x11, 0x4f, 0x44, 0x97, 0xdd, 0xe1, 0x68, 0x3a, 0xf7, 0xe8, 0xf8, 0xc4, 0x9e, 0xc6, 0x98, 0xf0, 0x8a, 0xa5, + 0xa8, 0xf3, 0x67, 0x02, 0x00, 0x8b, 0x7d, 0xb6, 0x86, 0x07, 0xdf, 0x16, 0x8a, 0xbb, 0x5a, 0x19, 0xb1, 0x66, 0x57, 0x29, 0x76, 0x9e, 0x03, 0x13, 0x51, 0x4e, 0xf8, 0x75, 0x30, 0x0c, 0x60, 0x91, + 0x1a, 0x72, 0x13, 0xe1, 0x4d, 0xf7, 0x97, 0x9d, 0x9b, 0xf3, 0xf4, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb1, 0x1c, 0x26, 0x1d, 0x85, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x70, 0x79, + 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x2a, 0x2a, 0xcd, 0x73, 0xcd, 0x2b, 0x2b, 0xb6, + 0xe2, 0x52, 0x50, 0xd0, 0x55, 0xc8, 0x4b, 0xcc, 0x4d, 0xb5, 0x52, 0x70, 0x0c, 0x08, 0x88, 0xf7, 0xf5, 0x77, 0x09, 0xf5, 0x71, 0xe5, 0x52, 0x50, 0x50, 0x50, 0x28, 0x4b, 0xcc, 0x29, 0x4d, 0xb5, + 0x52, 0x50, 0x4a, 0x2b, 0xcd, 0x4b, 0xb6, 0x4a, 0x2c, 0x28, 0xc8, 0xc9, 0x4c, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0x53, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x8b, 0x77, + 0xf1, 0x5e, 0x42, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x74, 0x78, 0x74, 0x4a, 0x2f, 0xcd, 0xcb, 0x4c, 0xce, 0x2f, 0xca, 0xb3, 0xb5, 0x35, 0x32, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x72, 0xcb, 0x49, 0x2c, 0xce, 0xb6, 0xb5, 0x35, 0xd2, 0x33, + 0xd2, 0x33, 0xe6, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x49, 0x05, 0x73, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, + 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0xd0, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x90, 0x4d, 0xa5, 0x54, 0x22, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x15, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x93, 0xc1, 0x8e, 0x1a, 0x31, + 0x0c, 0x86, 0xef, 0x79, 0x0a, 0x57, 0x5c, 0xa0, 0x87, 0x61, 0x8f, 0xab, 0xbd, 0x6f, 0xdb, 0x5b, 0x51, 0x3b, 0x55, 0x55, 0x21, 0xd4, 0x09, 0x89, 0x21, 0xe9, 0x66, 0xed, 0x69, 0xec, 0x40, 0x79, + 0xfb, 0x2a, 0xc3, 0x0c, 0xb0, 0xda, 0x56, 0x7b, 0x02, 0xd9, 0xbf, 0x9d, 0xdf, 0xf6, 0x37, 0x33, 0x58, 0x9d, 0x34, 0x30, 0xc1, 0xa7, 0xb6, 0x5d, 0xc1, 0x87, 0x42, 0x4e, 0x23, 0x93, 0x31, 0xdf, + 0x31, 0x39, 0x7e, 0x46, 0x50, 0x86, 0x13, 0x97, 0x0c, 0x84, 0xc7, 0x49, 0xb9, 0x1b, 0x45, 0xd0, 0x67, 0xfe, 0x85, 0x4e, 0xdf, 0x41, 0x1b, 0x10, 0xb6, 0x1c, 0x13, 0xe6, 0x3e, 0x59, 0xc5, 0x8b, + 0xc2, 0x38, 0xf6, 0x08, 0xce, 0x12, 0x6c, 0x11, 0x76, 0x5c, 0xc8, 0x43, 0x24, 0x58, 0x77, 0x35, 0xdf, 0xf4, 0xa7, 0x6e, 0x33, 0x6f, 0x96, 0xe3, 0xff, 0x45, 0x03, 0x6d, 0x88, 0x72, 0x6d, 0x7e, + 0x8c, 0x29, 0x41, 0x46, 0xe9, 0x99, 0xbc, 0x51, 0x86, 0x48, 0x8e, 0x9f, 0x23, 0xed, 0xcf, 0x46, 0x3f, 0x3e, 0xb6, 0x60, 0xc9, 0xc3, 0xea, 0xf3, 0xd7, 0x16, 0x32, 0xfe, 0x2e, 0x28, 0x2a, 0x8d, + 0x31, 0xb3, 0x19, 0x3c, 0x92, 0xef, 0x39, 0x92, 0x8a, 0x31, 0x5f, 0x0a, 0x51, 0x2d, 0xd1, 0xd7, 0x9d, 0xf1, 0x4f, 0xcf, 0x82, 0xa0, 0x21, 0x23, 0x02, 0x4e, 0x25, 0x8d, 0x31, 0x00, 0xef, 0xa1, + 0x5b, 0x76, 0xc3, 0x4c, 0x53, 0x1c, 0x76, 0x9c, 0xcf, 0x6b, 0x98, 0x9a, 0x34, 0xa3, 0x2e, 0xa0, 0x4d, 0x1a, 0x96, 0x19, 0xad, 0x8f, 0x84, 0x22, 0xff, 0xa8, 0xb3, 0x70, 0xc9, 0xc2, 0x59, 0x0e, + 0x2e, 0xa0, 0x7b, 0x7a, 0xd9, 0x21, 0xc5, 0x03, 0xfe, 0xb7, 0xc1, 0x94, 0x7c, 0x59, 0x6f, 0xaa, 0xf2, 0x36, 0x22, 0xd3, 0xaa, 0xad, 0x73, 0x28, 0x82, 0xc3, 0xb6, 0x07, 0xdb, 0xdb, 0xcc, 0x47, + 0xc1, 0x0c, 0x56, 0xcd, 0x3a, 0xa8, 0xf6, 0x0f, 0xcb, 0x65, 0x62, 0x67, 0x53, 0x60, 0xd1, 0x87, 0xfb, 0xbb, 0xfb, 0xbb, 0x57, 0x83, 0x6c, 0xe6, 0x8b, 0xba, 0xe0, 0x37, 0xe4, 0x93, 0xb1, 0xcd, + 0x7c, 0xd1, 0x18, 0xf3, 0x83, 0xcb, 0xe0, 0xa0, 0x08, 0xc2, 0x70, 0x63, 0x88, 0x74, 0xe0, 0x27, 0xec, 0x2a, 0x45, 0x82, 0xe4, 0xc1, 0x8e, 0x9c, 0x8d, 0x17, 0xab, 0x71, 0x0d, 0x57, 0x5e, 0x2e, + 0x73, 0x37, 0x66, 0x38, 0x65, 0x8b, 0xa2, 0x91, 0xf6, 0x75, 0xd2, 0xdb, 0x03, 0x8e, 0xdc, 0x55, 0x24, 0x52, 0xf1, 0x28, 0x60, 0x61, 0x5d, 0x28, 0x2a, 0x28, 0x8a, 0x56, 0xa6, 0xea, 0xef, 0xcf, + 0x2b, 0x58, 0xdf, 0x7a, 0x5f, 0xa9, 0xac, 0x14, 0x18, 0x2b, 0x75, 0x23, 0x60, 0xbd, 0x87, 0x6d, 0x91, 0xf3, 0x55, 0x12, 0xef, 0xa3, 0xbb, 0x90, 0x7e, 0x79, 0x26, 0x12, 0x70, 0xf6, 0x98, 0x07, + 0x97, 0xd5, 0x6d, 0x54, 0x81, 0x2d, 0x06, 0x7b, 0x88, 0x9c, 0x1b, 0x63, 0xba, 0xae, 0x73, 0x4c, 0xc2, 0x09, 0x4d, 0x7f, 0xfe, 0x32, 0x6e, 0xdf, 0xad, 0x69, 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x65, 0x8d, 0x58, 0xbb, 0xa6, 0x01, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x68, + 0x52, 0x56, 0xd4, 0x4f, 0xca, 0xcc, 0xd3, 0x2f, 0xce, 0xe0, 0xe2, 0x4a, 0xad, 0x48, 0x4d, 0x56, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, + 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0x50, 0x52, 0xd1, 0x48, 0xc9, 0x2c, 0xca, 0x4b, 0xcc, 0x4d, 0x55, 0x50, 0x52, 0x31, 0x50, 0xd2, 0x54, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0xa7, 0x6e, 0xed, 0xb6, 0x3d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x9c, 0x54, + 0x4d, 0x4f, 0xdb, 0x40, 0x10, 0xbd, 0xfb, 0x57, 0x3c, 0x2d, 0x07, 0xc7, 0x4a, 0x88, 0x10, 0x47, 0x4b, 0x41, 0xaa, 0x28, 0xf4, 0xd2, 0xaa, 0x6d, 0xa0, 0x27, 0xa8, 0xd0, 0x12, 0x4f, 0xf0, 0x12, + 0x7b, 0x37, 0xec, 0x8e, 0x69, 0x2d, 0xc4, 0x7f, 0xaf, 0x76, 0xed, 0xcd, 0x27, 0x14, 0x44, 0x4e, 0xf1, 0xec, 0xcc, 0x9b, 0x7d, 0x6f, 0xdf, 0xcc, 0xdc, 0x9a, 0x1a, 0x4b, 0x69, 0x2b, 0x25, 0x6b, + 0xd2, 0x0c, 0x55, 0x2f, 0x8d, 0x65, 0x9c, 0x1a, 0xcd, 0xf4, 0x97, 0x93, 0x70, 0x3c, 0xaf, 0xa4, 0x5b, 0xc4, 0x93, 0x29, 0x3d, 0x34, 0xe4, 0x38, 0xe9, 0x3f, 0xef, 0x9d, 0xd1, 0x49, 0x92, 0x1c, + 0x78, 0x0c, 0x47, 0xb0, 0xdd, 0x29, 0x6e, 0x4d, 0xd1, 0x8e, 0xc2, 0x21, 0x0a, 0xc9, 0x12, 0xc6, 0xe2, 0xd7, 0xf4, 0x2b, 0x1e, 0x1a, 0xb2, 0xad, 0x4f, 0x95, 0x35, 0x31, 0x59, 0x97, 0x14, 0x34, + 0xc7, 0x52, 0xb6, 0x95, 0x91, 0xc5, 0xcd, 0xd2, 0x2a, 0xcd, 0x03, 0x4b, 0x0f, 0x79, 0x6c, 0x92, 0xe1, 0xf0, 0x04, 0x8e, 0x6d, 0x9e, 0x00, 0x80, 0x9a, 0x7b, 0xf8, 0x71, 0x4d, 0x5c, 0x9a, 0x02, + 0x93, 0x09, 0xc4, 0x8f, 0xef, 0x17, 0x97, 0xa2, 0x3b, 0xdc, 0x48, 0x50, 0xee, 0xc6, 0x37, 0x5e, 0xc7, 0xfd, 0xcf, 0x12, 0x37, 0x56, 0x87, 0x1b, 0x8d, 0x8b, 0xa6, 0x5e, 0x3a, 0xdf, 0x68, 0xec, + 0x3f, 0x33, 0x0c, 0x21, 0xae, 0xb5, 0x58, 0xa5, 0x53, 0xe5, 0x68, 0xbb, 0xf8, 0x00, 0xdf, 0x9a, 0x8a, 0xd5, 0x67, 0x35, 0x63, 0x68, 0xa2, 0xc2, 0xc1, 0x99, 0x9a, 0xa0, 0x98, 0xac, 0x64, 0x65, + 0xf4, 0x6e, 0x27, 0x4c, 0x20, 0x9e, 0x44, 0xb2, 0x15, 0x9e, 0x1b, 0x8b, 0x05, 0xb5, 0x50, 0x3a, 0x5c, 0x72, 0x6e, 0x6c, 0x3d, 0x5e, 0x50, 0xeb, 0x06, 0xd9, 0x76, 0xaf, 0x08, 0x31, 0x9c, 0x20, + 0x15, 0x29, 0x86, 0xa1, 0x68, 0x88, 0x54, 0xe4, 0x10, 0xe9, 0x70, 0x55, 0x7b, 0xb5, 0xa0, 0xf6, 0x77, 0x88, 0x8f, 0x90, 0x26, 0x2f, 0x51, 0xb5, 0xc4, 0x57, 0xf9, 0xe1, 0xb1, 0x4f, 0x12, 0xcf, + 0xd7, 0x5a, 0x78, 0x79, 0x2a, 0xd2, 0x03, 0x4b, 0x9c, 0xe1, 0x04, 0xc7, 0x81, 0x27, 0xc4, 0xd3, 0x73, 0x7f, 0x51, 0xaa, 0xf6, 0x05, 0xfe, 0x72, 0xb6, 0xa9, 0xef, 0xbb, 0x65, 0x78, 0x41, 0x82, + 0x1d, 0xfa, 0xd2, 0xde, 0xb9, 0x17, 0xe9, 0xbf, 0x4a, 0x1d, 0xc3, 0x55, 0xe1, 0x2b, 0xdc, 0x3f, 0xc0, 0xdb, 0xfb, 0xd6, 0x12, 0x73, 0x8b, 0x60, 0x3e, 0x70, 0xb9, 0xb6, 0x30, 0x1b, 0x38, 0x2e, + 0x4c, 0xc3, 0x50, 0xda, 0xb1, 0xd4, 0x2c, 0x35, 0x99, 0xc6, 0x55, 0x6d, 0x67, 0xda, 0x50, 0xf6, 0xa6, 0x67, 0x3b, 0x25, 0x1c, 0xdb, 0xc1, 0x5a, 0x59, 0x6f, 0xb8, 0x14, 0x9e, 0x50, 0x8c, 0x37, + 0xb6, 0xda, 0x0f, 0x96, 0xc6, 0x83, 0x0d, 0x91, 0x5e, 0xeb, 0x34, 0x89, 0x12, 0x0e, 0x4a, 0x92, 0x05, 0xd9, 0x11, 0x1e, 0x65, 0xd5, 0x90, 0xcb, 0xa2, 0x9e, 0x5d, 0xd8, 0xe5, 0xc9, 0x8e, 0x8e, + 0x02, 0x10, 0x3d, 0x66, 0x97, 0x12, 0xdc, 0x9e, 0x87, 0x60, 0x07, 0x11, 0x3b, 0xbc, 0x6f, 0xc4, 0x22, 0xec, 0x74, 0x63, 0xce, 0xf3, 0xcd, 0xe1, 0xd9, 0xee, 0xbb, 0x37, 0xda, 0xd9, 0x56, 0xbb, + 0xb7, 0x2d, 0x17, 0xe1, 0xfc, 0xf2, 0xf8, 0x19, 0x96, 0xc7, 0x05, 0x5b, 0xa5, 0xef, 0x3e, 0xde, 0x73, 0xed, 0x92, 0x24, 0x41, 0x78, 0xca, 0x5a, 0x2a, 0x3d, 0x98, 0x75, 0x0b, 0x2f, 0x8f, 0x9b, + 0xaf, 0xb7, 0xa5, 0x10, 0x02, 0xe1, 0xcf, 0x79, 0xa3, 0x67, 0xde, 0xe3, 0x60, 0xaa, 0x97, 0x95, 0x64, 0x0a, 0xd1, 0xcb, 0x92, 0xd0, 0x57, 0xae, 0xb7, 0x5a, 0x88, 0x48, 0xa5, 0x5d, 0xb0, 0xd3, + 0x79, 0x58, 0x9e, 0xd1, 0x54, 0xe6, 0xf6, 0x9e, 0x66, 0x0c, 0xa9, 0x0b, 0x48, 0xdd, 0x06, 0x8c, 0xd3, 0xca, 0x34, 0xc5, 0xd9, 0xa3, 0x5f, 0xbe, 0x96, 0x66, 0xa4, 0x1e, 0xa9, 0xc0, 0x1f, 0xc5, + 0xe5, 0xa6, 0x19, 0xc7, 0xf1, 0x32, 0x1d, 0x87, 0x03, 0x7c, 0x2a, 0x0a, 0xb4, 0xa6, 0xb1, 0xb8, 0x6d, 0x9c, 0xd2, 0xe4, 0x1c, 0x2a, 0x73, 0xa7, 0x66, 0x28, 0xc9, 0x76, 0x37, 0xeb, 0xd8, 0x8b, + 0x69, 0x44, 0xec, 0x81, 0x44, 0xb6, 0x7a, 0xe8, 0xb4, 0x0f, 0xa5, 0xde, 0x43, 0x3d, 0x89, 0xbd, 0x91, 0xec, 0xfc, 0xbb, 0x65, 0xf6, 0x98, 0xda, 0x97, 0x67, 0xab, 0xdc, 0x28, 0x38, 0x8f, 0x30, + 0xaf, 0x1a, 0x57, 0x4e, 0x2e, 0x6d, 0x43, 0xd9, 0xee, 0x78, 0x6e, 0x3f, 0xcf, 0x2e, 0xd8, 0x08, 0xc7, 0x47, 0x47, 0xbd, 0x37, 0x36, 0xb7, 0x70, 0x4f, 0xe7, 0xac, 0x5e, 0x72, 0xbb, 0xe2, 0xf2, + 0xdf, 0x3e, 0x7e, 0xc0, 0x3b, 0xb4, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x00, 0xeb, 0x02, 0xc0, 0x8e, 0x02, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x2a, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, + 0xd1, 0x4d, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x2b, 0xb6, 0xb5, 0x35, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa2, 0x8d, 0xf6, 0x14, + 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x74, 0x8e, + 0xb1, 0x6a, 0x03, 0x31, 0x10, 0x44, 0xfb, 0xfd, 0x8a, 0x41, 0x95, 0x04, 0xe6, 0x30, 0x29, 0x0d, 0x57, 0x85, 0xe4, 0x0b, 0xd2, 0x2f, 0xe2, 0xbc, 0x07, 0x82, 0x93, 0x7c, 0xd6, 0xae, 0x8a, 0x60, + 0xfc, 0xef, 0x61, 0x7d, 0x24, 0x5d, 0xda, 0xb7, 0x6f, 0x66, 0xb6, 0xd4, 0xfd, 0xd6, 0x0d, 0xa3, 0x15, 0x33, 0x51, 0x23, 0x5a, 0x47, 0x5b, 0x30, 0x83, 0xf9, 0xb8, 0x30, 0xc7, 0xe0, 0x28, 0x24, + 0xa2, 0x65, 0xcb, 0xaa, 0xf8, 0x12, 0xb5, 0xcf, 0xd1, 0x96, 0xf8, 0x9b, 0x99, 0x9c, 0xbc, 0x67, 0x95, 0x74, 0x21, 0x02, 0xae, 0xb2, 0xc2, 0x31, 0x7b, 0x8c, 0xa5, 0xee, 0xf6, 0xcd, 0x5d, 0xee, + 0x43, 0xd4, 0xa2, 0xca, 0xb6, 0xa6, 0x0b, 0x01, 0x40, 0x17, 0xdd, 0x4f, 0x58, 0x6e, 0x57, 0xc1, 0x0c, 0x57, 0xa7, 0x9a, 0x4b, 0x8b, 0x8f, 0x67, 0x7a, 0x9d, 0xdd, 0x9c, 0xb2, 0xaa, 0x74, 0xfb, + 0xb8, 0x8f, 0xbc, 0xc5, 0xc3, 0x0f, 0x8f, 0x67, 0xf8, 0x47, 0xf0, 0xaa, 0x13, 0xde, 0xce, 0xe7, 0x44, 0x54, 0x56, 0x30, 0xb7, 0x5c, 0x85, 0x19, 0xf3, 0x8c, 0xc0, 0xec, 0xe5, 0xcc, 0xc1, 0xb7, + 0xff, 0xfe, 0x7e, 0x0d, 0xa6, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x40, 0xff, 0x24, 0xad, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, + 0x77, 0x73, 0x67, 0x69, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0x48, 0x2f, 0xcd, 0xcb, + 0x4c, 0xce, 0x2f, 0xca, 0x53, 0x48, 0x2b, 0xcd, 0x4b, 0xb6, 0xca, 0x4d, 0xcc, 0xcc, 0x53, 0xd0, 0xd5, 0x4d, 0xca, 0xcc, 0x4b, 0xb1, 0x35, 0xd0, 0x03, 0x43, 0x2b, 0x0b, 0x03, 0x0b, 0x03, 0x05, + 0x5d, 0xdd, 0xc4, 0xe4, 0xe4, 0xd4, 0xe2, 0x62, 0xdd, 0x9c, 0xfc, 0xf4, 0xb4, 0xcc, 0x9c, 0x54, 0x5b, 0x5d, 0x2e, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, 0x10, 0x21, + 0xc7, 0x42, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x5c, 0xcb, 0xb1, 0xaa, 0xc2, 0x40, + 0x10, 0x05, 0xd0, 0x3e, 0x5f, 0x71, 0x5f, 0x9a, 0x49, 0x20, 0x0f, 0x83, 0xa5, 0xad, 0x85, 0x8a, 0x85, 0x85, 0x82, 0x45, 0x08, 0xb2, 0xea, 0x04, 0x16, 0x36, 0x33, 0xcb, 0xec, 0x28, 0xfa, 0xf7, + 0x82, 0xa5, 0xed, 0x81, 0x73, 0xe7, 0x09, 0x73, 0x88, 0xd2, 0xb0, 0x3c, 0xa3, 0xa9, 0x74, 0x28, 0x1e, 0xcc, 0x2f, 0xc6, 0x25, 0xab, 0x14, 0x6e, 0x57, 0x15, 0x80, 0x1f, 0x6c, 0x68, 0xd9, 0xf7, + 0x38, 0xec, 0xa9, 0xc3, 0xd0, 0xd0, 0x5a, 0xc5, 0x59, 0xfc, 0xff, 0xf4, 0xce, 0x4c, 0x1d, 0xc8, 0xf9, 0xe5, 0x8b, 0x9c, 0x42, 0x14, 0x6a, 0xc7, 0xf6, 0xdb, 0x8d, 0xfd, 0x61, 0x82, 0xe1, 0x5a, + 0x6f, 0x39, 0x25, 0xc5, 0x64, 0x3a, 0xe3, 0x7c, 0xdc, 0xec, 0x10, 0x72, 0x4e, 0xf1, 0x16, 0x3c, 0xaa, 0xfc, 0xd5, 0x63, 0xf5, 0x09, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9d, 0xd3, + 0xa1, 0x9f, 0x80, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, + 0x6c, 0x2a, 0x2a, 0xcd, 0x73, 0xcd, 0x2b, 0x2b, 0xb6, 0xe2, 0x52, 0x50, 0xd0, 0x55, 0xc8, 0x4b, 0xcc, 0x4d, 0xb5, 0x52, 0x70, 0x0c, 0x08, 0x88, 0xf7, 0xf5, 0x77, 0x09, 0xf5, 0x71, 0xe5, 0x52, + 0x50, 0x50, 0x50, 0x28, 0x4b, 0xcc, 0x29, 0x4d, 0xb5, 0x52, 0x50, 0x4a, 0x2b, 0xcd, 0x4b, 0xb6, 0xca, 0x4d, 0xcc, 0xcc, 0x53, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, + 0x0e, 0x15, 0xdf, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x4a, 0x2f, 0xcd, 0xcb, 0x4c, 0xce, 0x2f, 0xca, 0xb3, 0xb5, 0x35, 0x32, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x49, 0x6b, 0xe8, 0xf3, 0x17, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x3c, 0x90, 0xc1, 0x6a, 0xeb, 0x40, 0x0c, 0x45, 0xf7, 0xfa, 0x0a, 0x43, 0x76, 0x86, 0xa7, 0xfc, 0x43, 0x5e, 0xbb, 0x68, 0xa1, 0xed, 0xc2, 0x50, 0xba, 0x2b, 0xca, 0x58, 0x71, 0x94, 0x8e, + 0x47, 0x83, 0x24, 0x3b, 0xed, 0xdf, 0x97, 0x71, 0x43, 0x36, 0x57, 0xe2, 0x70, 0xc4, 0x05, 0xed, 0xba, 0xc7, 0x94, 0xa5, 0x3a, 0x03, 0x56, 0xd3, 0x0b, 0xa7, 0x00, 0x4c, 0x99, 0xdc, 0x2b, 0xc5, + 0x19, 0xd0, 0x39, 0x42, 0xca, 0xe4, 0x7b, 0x38, 0x4a, 0xd9, 0x03, 0xec, 0xba, 0xa7, 0x12, 0x9c, 0xb3, 0x3c, 0x03, 0xca, 0xc8, 0x04, 0x3d, 0x4a, 0xb5, 0x96, 0x73, 0x6e, 0x79, 0xf5, 0xe6, 0xbc, + 0x72, 0x1c, 0x98, 0x8a, 0x43, 0x39, 0xfe, 0x4b, 0x5a, 0x4e, 0x32, 0x2d, 0x46, 0x21, 0x5a, 0xf0, 0x7b, 0xce, 0x4d, 0x78, 0x17, 0x5f, 0x28, 0x77, 0x43, 0x2c, 0xa3, 0x68, 0xf7, 0x5f, 0x47, 0x06, + 0x5c, 0x3d, 0x6d, 0xf3, 0x44, 0x29, 0xd4, 0x7e, 0xb6, 0x7e, 0xd8, 0x75, 0x6f, 0xc3, 0x07, 0xe0, 0xc3, 0xf0, 0x39, 0x84, 0x1a, 0xff, 0xdd, 0xce, 0xd0, 0xa3, 0x5f, 0xeb, 0x96, 0xda, 0x50, 0xa5, + 0x48, 0x67, 0xe8, 0x51, 0x4d, 0x26, 0xe8, 0xd1, 0xf8, 0xd2, 0xe8, 0x0b, 0xad, 0x5c, 0x20, 0xc8, 0x26, 0x8e, 0x3d, 0x54, 0x9d, 0x5b, 0x3b, 0x06, 0x4d, 0xf7, 0xdd, 0x38, 0x33, 0x39, 0x1f, 0x28, + 0x7d, 0x2d, 0xf5, 0x4e, 0x57, 0x36, 0x17, 0x2d, 0x7e, 0xc3, 0x37, 0xa9, 0xbd, 0xa7, 0xb2, 0x85, 0xb0, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, + 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, + 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, + 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, + 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, + 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x44, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, + 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0xdd, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, + 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, + 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, + 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, + 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x57, 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, + 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xf9, 0xe7, 0xc1, 0xa0, 0x2c, 0x4b, 0x9f, 0x59, 0xc4, 0xbe, 0xa4, 0xf5, 0x20, 0xad, 0xf6, 0xaa, 0xc1, 0xdd, 0xf8, 0x76, 0x34, 0x99, 0x8f, 0x2e, 0x3f, 0xf9, + 0x57, 0xee, 0xd4, 0x42, 0xa4, 0xa8, 0x14, 0x10, 0xfe, 0xaf, 0xe0, 0x84, 0x31, 0x2c, 0xb7, 0xc0, 0xf2, 0x3c, 0xe5, 0x11, 0x5b, 0xa6, 0x08, 0x29, 0x2b, 0x2d, 0x3d, 0x6b, 0x42, 0x8c, 0x41, 0x4b, + 0x83, 0xba, 0x24, 0xae, 0xb9, 0x58, 0xf7, 0x41, 0xc9, 0x95, 0x2e, 0x19, 0xa1, 0x31, 0x13, 0x73, 0xa5, 0x89, 0x2f, 0x0b, 0x7d, 0x40, 0x5a, 0x8d, 0x91, 0xab, 0x83, 0x0d, 0x52, 0x00, 0x13, 0xd0, + 0x0d, 0xe6, 0x30, 0x9e, 0x77, 0xe1, 0x97, 0x60, 0x3e, 0x9e, 0xf7, 0x8d, 0x91, 0xa7, 0xf1, 0xc3, 0xaf, 0xd3, 0xc5, 0x03, 0x3c, 0x05, 0x61, 0x18, 0x4c, 0x1e, 0xc6, 0xa3, 0x39, 0x4c, 0x43, 0xb8, + 0x9d, 0x4e, 0x86, 0xe3, 0x87, 0xf1, 0x74, 0x32, 0x87, 0xe9, 0x17, 0x08, 0x26, 0x5f, 0xe1, 0x3f, 0xe3, 0xc9, 0xb0, 0x0f, 0xc8, 0x75, 0x82, 0x04, 0xf8, 0x62, 0x72, 0xab, 0x0c, 0x4c, 0x6e, 0xe8, + 0xc4, 0xd8, 0x72, 0x37, 0x47, 0x3c, 0x80, 0xb0, 0x92, 0x15, 0x24, 0x95, 0x63, 0xc4, 0x57, 0x3c, 0x82, 0x94, 0x89, 0x75, 0xc1, 0xd6, 0x08, 0x6b, 0xb9, 0x41, 0x12, 0x5c, 0xac, 0x21, 0x47, 0xca, + 0xb8, 0x32, 0x69, 0x55, 0xc0, 0x44, 0x6c, 0xcc, 0xa4, 0x3c, 0xe3, 0x9a, 0x69, 0x3b, 0x75, 0x12, 0x97, 0x71, 0x34, 0xe8, 0xf0, 0x2c, 0x97, 0xa4, 0xe1, 0x77, 0xb6, 0x61, 0xbe, 0x40, 0xed, 0x5f, + 0x5c, 0x1f, 0x4c, 0x71, 0x79, 0x3c, 0x23, 0xb8, 0xf4, 0xa3, 0x84, 0x09, 0x81, 0xa9, 0x3a, 0x5e, 0x2b, 0x34, 0x4f, 0xfd, 0x19, 0xc9, 0x1c, 0x49, 0x73, 0x54, 0xd7, 0x9d, 0x4e, 0x5e, 0x2c, 0x53, + 0x1e, 0x41, 0x94, 0x32, 0xa5, 0xe0, 0x9e, 0x6d, 0x50, 0x3c, 0x11, 0xcb, 0x73, 0xa4, 0xa1, 0x2c, 0x45, 0x2a, 0x99, 0xc1, 0xf4, 0xa3, 0xd3, 0x31, 0xc9, 0xcf, 0x89, 0x6f, 0x98, 0x46, 0x50, 0x06, + 0x71, 0x04, 0x2b, 0x5b, 0xe4, 0x73, 0x4d, 0x26, 0xb6, 0xa7, 0x30, 0x98, 0xcd, 0x46, 0xe1, 0xf3, 0xe3, 0x28, 0x9c, 0x8f, 0xa7, 0x13, 0xb8, 0x81, 0xee, 0x95, 0xff, 0x77, 0xff, 0x1f, 0xdd, 0x6b, + 0x7b, 0x74, 0x70, 0x71, 0x61, 0xff, 0x87, 0x0b, 0x18, 0xe2, 0x8a, 0x15, 0xa9, 0x86, 0x45, 0x78, 0x67, 0x32, 0x1e, 0x3b, 0x37, 0x36, 0xf0, 0xcc, 0xf8, 0xbf, 0x2c, 0x2b, 0x00, 0xfe, 0xef, 0x8c, + 0x60, 0x45, 0x32, 0xeb, 0x03, 0x5f, 0x81, 0x90, 0xf0, 0xa1, 0xde, 0xbb, 0xa0, 0xf4, 0x83, 0x49, 0x7a, 0x4e, 0x72, 0xc3, 0x63, 0x9b, 0x11, 0x6b, 0x7b, 0xf0, 0x87, 0x30, 0x87, 0xa3, 0x2f, 0xc1, + 0xe2, 0xee, 0xe1, 0x79, 0x38, 0x7d, 0x9a, 0xdc, 0x4d, 0x83, 0xe1, 0xb3, 0x41, 0x71, 0x03, 0x5d, 0x53, 0xd7, 0xea, 0xf3, 0x60, 0x40, 0x98, 0x4b, 0xdf, 0xa2, 0x68, 0xd6, 0xb7, 0x9d, 0xf8, 0x34, + 0xe0, 0x72, 0xa0, 0xd9, 0x77, 0x46, 0x7c, 0x70, 0x80, 0x73, 0xd0, 0xad, 0xdc, 0x03, 0xc0, 0xc7, 0x13, 0x1e, 0x3e, 0x42, 0xf7, 0x70, 0xf7, 0x65, 0xb7, 0x7d, 0x97, 0x89, 0xb6, 0x7b, 0xdd, 0x39, + 0x66, 0x6b, 0xc6, 0x4c, 0xe3, 0xca, 0x16, 0x76, 0xf2, 0x5d, 0x16, 0x6d, 0xdf, 0xf7, 0xa1, 0x4c, 0x78, 0x94, 0x40, 0x66, 0x45, 0x29, 0x92, 0xc2, 0xf5, 0x74, 0x83, 0x33, 0x70, 0x47, 0xb6, 0xa0, + 0x65, 0x6d, 0xdf, 0x68, 0x07, 0x17, 0x4a, 0x23, 0x8b, 0xeb, 0xce, 0x8f, 0x5d, 0x82, 0xa4, 0xc0, 0xf7, 0x13, 0x7b, 0x1f, 0x3c, 0x8e, 0x26, 0xcf, 0x75, 0x5c, 0xb3, 0x70, 0x3a, 0x1b, 0x85, 0xa6, + 0xc3, 0x9e, 0x67, 0xc1, 0xc3, 0xaf, 0x70, 0xb3, 0x63, 0xc8, 0x8c, 0xae, 0x9f, 0x6d, 0xc4, 0xa0, 0x66, 0xef, 0x5c, 0x54, 0xe7, 0xc8, 0x28, 0x13, 0x24, 0x3c, 0x53, 0x2d, 0x25, 0x4f, 0x53, 0x58, + 0x22, 0x28, 0xb6, 0xb1, 0x7a, 0xf2, 0x57, 0xf1, 0xff, 0x3b, 0x08, 0xff, 0x2c, 0xf0, 0xf6, 0xf4, 0x4d, 0x58, 0x86, 0x35, 0xaf, 0x3b, 0xf6, 0xab, 0x44, 0xa9, 0x44, 0x16, 0x69, 0x6c, 0xd0, 0x16, + 0xaa, 0x12, 0x3f, 0x23, 0x14, 0xc4, 0x63, 0x3c, 0xc8, 0xc2, 0xae, 0x3f, 0x0a, 0x4a, 0x77, 0x2a, 0x53, 0x3b, 0x7d, 0x77, 0x78, 0x2e, 0x21, 0x5f, 0x9f, 0x27, 0xc1, 0xfd, 0x68, 0x17, 0xa6, 0x2b, + 0x7e, 0x67, 0x6d, 0x41, 0x69, 0x1d, 0x81, 0x13, 0x05, 0x67, 0x69, 0x23, 0x79, 0x0c, 0x19, 0xe3, 0xc2, 0x73, 0xd6, 0x18, 0xad, 0xd5, 0x6f, 0xdf, 0x7a, 0xf0, 0x63, 0xc7, 0xce, 0x7c, 0xab, 0x34, + 0x66, 0xbe, 0x2c, 0xb4, 0x9f, 0x13, 0x17, 0x3a, 0x15, 0x5e, 0xf7, 0x12, 0x1a, 0x12, 0xa2, 0x34, 0x23, 0x8d, 0xb1, 0xbd, 0xbd, 0xdc, 0xf8, 0x62, 0x6e, 0xab, 0x25, 0x53, 0x38, 0xe4, 0x84, 0x91, + 0x96, 0xb4, 0x85, 0x1b, 0x10, 0x58, 0xda, 0x05, 0xcf, 0xfa, 0xb8, 0xfa, 0xd6, 0xd8, 0xdf, 0xee, 0x63, 0xa1, 0x0c, 0x22, 0x63, 0x06, 0xe2, 0xda, 0xce, 0x67, 0x30, 0x4d, 0x76, 0x60, 0xda, 0x5f, + 0xa3, 0x0e, 0x96, 0x4a, 0xa6, 0x85, 0x46, 0x53, 0x46, 0x5e, 0xaf, 0xe7, 0x62, 0xb5, 0x19, 0x1b, 0xc0, 0x78, 0xf5, 0x76, 0x8f, 0xe1, 0x0b, 0x57, 0x5a, 0xf5, 0x81, 0x4c, 0xa7, 0x70, 0x6d, 0x04, + 0x1c, 0xa2, 0x04, 0xa3, 0xef, 0x46, 0x9c, 0xf8, 0xae, 0xe3, 0x94, 0xb9, 0x46, 0x0b, 0xa5, 0x65, 0xd6, 0x34, 0xbe, 0x67, 0x18, 0x72, 0x46, 0x2c, 0x43, 0xbd, 0x4b, 0x5e, 0x4d, 0x44, 0xd6, 0x90, + 0x5e, 0x27, 0xd0, 0x5b, 0xbb, 0xd0, 0xe0, 0xe4, 0x20, 0xa2, 0xfe, 0xdb, 0x3d, 0xd7, 0x24, 0xae, 0xca, 0x9a, 0x29, 0xa0, 0x9b, 0x56, 0x05, 0xdc, 0x6f, 0xe5, 0x2b, 0xef, 0x1c, 0x10, 0xbf, 0x62, + 0xc0, 0xeb, 0x35, 0xf3, 0x5e, 0xc3, 0x1f, 0x8b, 0xbc, 0xd0, 0x73, 0x4d, 0xc8, 0xb2, 0xb3, 0x91, 0x34, 0xf7, 0xdc, 0x80, 0x28, 0xd2, 0xf4, 0xfa, 0xc0, 0x8e, 0xa6, 0xed, 0x91, 0x65, 0x33, 0xde, + 0x69, 0xcd, 0x51, 0xd4, 0x98, 0x3d, 0x1b, 0x48, 0xef, 0xfa, 0xc4, 0xc9, 0xfe, 0x46, 0x6c, 0xf3, 0x67, 0xa6, 0x2b, 0x17, 0xfb, 0x09, 0xaf, 0xc5, 0x4a, 0xfb, 0x51, 0xdf, 0x74, 0xc0, 0x59, 0x30, + 0x0d, 0xc0, 0x2d, 0x16, 0xab, 0x94, 0x9d, 0xb1, 0xbb, 0x46, 0x5d, 0x5b, 0xf2, 0xce, 0xf6, 0x77, 0xdf, 0xd8, 0x38, 0xb2, 0xfc, 0x0a, 0x11, 0xd3, 0x51, 0x02, 0xde, 0x78, 0x3a, 0xb2, 0x8f, 0x45, + 0xf3, 0xd0, 0xc4, 0xe3, 0xb4, 0xc2, 0xd9, 0x96, 0x1b, 0x85, 0xe1, 0x34, 0x04, 0x13, 0x96, 0x29, 0xab, 0x0f, 0xa6, 0xd7, 0xde, 0x96, 0xff, 0x8f, 0xd0, 0xfd, 0xd0, 0x3d, 0x01, 0x61, 0x05, 0x2a, + 0x6d, 0xcb, 0x79, 0x7b, 0x25, 0xc0, 0xdb, 0xf5, 0xd9, 0x2c, 0x88, 0x9f, 0xaa, 0xfa, 0x6a, 0x0b, 0xa9, 0x1e, 0xef, 0x30, 0xe3, 0x47, 0xa9, 0x54, 0xd8, 0x96, 0x69, 0x33, 0x5e, 0x4f, 0x66, 0xdf, + 0xcf, 0x2b, 0x38, 0xcd, 0x59, 0x0b, 0x49, 0x08, 0xbe, 0xef, 0x9f, 0xda, 0xea, 0xb4, 0xff, 0xf5, 0xfa, 0x4e, 0xc9, 0x35, 0x99, 0x31, 0x6f, 0xa7, 0x4a, 0x0a, 0xab, 0x1a, 0x38, 0x14, 0x1c, 0x59, + 0xe8, 0xbc, 0xd0, 0x6f, 0x4a, 0xcc, 0xa9, 0x68, 0x1e, 0x8b, 0x4e, 0x7d, 0x51, 0xf6, 0x0e, 0x24, 0xe4, 0xa7, 0xbd, 0x6d, 0x5b, 0xa5, 0x8c, 0x50, 0xd8, 0xbf, 0xbc, 0xde, 0x59, 0x15, 0xf9, 0x83, + 0x63, 0xd9, 0xf7, 0x98, 0x53, 0xcb, 0xb1, 0x33, 0x4c, 0x9c, 0x4d, 0xfb, 0xae, 0x7c, 0x23, 0x42, 0x66, 0xbe, 0x33, 0x1c, 0x0f, 0xfb, 0xcb, 0xa3, 0x2a, 0xe8, 0x37, 0xa0, 0x9c, 0x90, 0xd2, 0x5e, + 0xdf, 0x7f, 0x29, 0x65, 0x5a, 0x56, 0x09, 0x3b, 0x74, 0x7f, 0x72, 0x71, 0xd5, 0x06, 0x4f, 0x1b, 0xa5, 0x7e, 0x2e, 0x98, 0xa3, 0x5f, 0x48, 0x66, 0x8b, 0xf0, 0xce, 0x2b, 0x28, 0xed, 0x37, 0x2c, + 0x1e, 0x01, 0x6d, 0x03, 0x35, 0x94, 0x02, 0x8f, 0x03, 0x72, 0xfb, 0xf0, 0x85, 0x6b, 0xef, 0xaa, 0xb1, 0xb6, 0xab, 0xfa, 0x87, 0x84, 0x64, 0x69, 0x3f, 0xeb, 0x4e, 0x6a, 0xfe, 0x8c, 0x8e, 0x10, + 0x49, 0xda, 0x21, 0xe6, 0x62, 0x7d, 0xec, 0x12, 0xab, 0xdd, 0x73, 0xcd, 0xa2, 0xef, 0x0f, 0xc4, 0xa2, 0x93, 0x5e, 0x6c, 0x62, 0xfa, 0x5b, 0x13, 0x53, 0xa7, 0xfa, 0xd7, 0xfe, 0x77, 0xf4, 0x2e, + 0xb2, 0xaf, 0x99, 0x36, 0x9a, 0xf6, 0xd7, 0x64, 0xf5, 0xab, 0x5f, 0xf5, 0x49, 0x8c, 0x4a, 0x73, 0x61, 0xbf, 0xd1, 0x7a, 0xa0, 0x4d, 0x8c, 0x0a, 0xf6, 0xed, 0xfd, 0xa3, 0x51, 0xf7, 0xe0, 0x39, + 0x3c, 0x6b, 0xd4, 0x28, 0x36, 0x5e, 0xf7, 0xfe, 0x71, 0xf2, 0xf4, 0xbc, 0x98, 0x8f, 0x42, 0xa3, 0xca, 0xdd, 0x5e, 0x2d, 0x4b, 0xf0, 0xf3, 0xcf, 0xd0, 0xb6, 0x73, 0x16, 0xcc, 0xe7, 0x4f, 0xd3, + 0x70, 0xb8, 0xdf, 0x79, 0xc2, 0xa3, 0x83, 0xa8, 0x90, 0x84, 0x79, 0x59, 0xde, 0xb4, 0xda, 0xd9, 0x7b, 0x3c, 0x64, 0x2b, 0x4a, 0x18, 0xfd, 0xf6, 0x0d, 0x72, 0xa6, 0x54, 0x29, 0x29, 0x3e, 0x73, + 0x7a, 0x8f, 0xc2, 0xd7, 0xf2, 0x36, 0x61, 0x14, 0x10, 0xb1, 0xed, 0x31, 0xf3, 0x41, 0xa1, 0x13, 0x14, 0x9a, 0x47, 0x4c, 0x4b, 0xf2, 0x15, 0x6a, 0xf7, 0x59, 0xe7, 0x19, 0x25, 0x39, 0x58, 0xf4, + 0xda, 0x5a, 0xf6, 0x5f, 0x53, 0xf7, 0xd6, 0x3d, 0x59, 0xc9, 0x49, 0x6a, 0x8c, 0xcc, 0x67, 0xfc, 0xcc, 0xe1, 0x6c, 0x58, 0x33, 0x8c, 0xdb, 0x76, 0x6c, 0x5b, 0x69, 0x75, 0x64, 0x06, 0xa1, 0x2e, + 0x48, 0x54, 0x17, 0x78, 0xfb, 0xc9, 0x9a, 0xd0, 0xfe, 0x8e, 0x9c, 0x16, 0xd1, 0x3f, 0x92, 0xe4, 0x93, 0x72, 0x33, 0xc3, 0xbc, 0xa8, 0x4b, 0x5c, 0x2a, 0xae, 0x6b, 0x55, 0x75, 0x0d, 0x58, 0x65, + 0xae, 0x71, 0x26, 0x44, 0x16, 0x9b, 0x66, 0xf9, 0x65, 0xab, 0xf1, 0xb6, 0xfa, 0x5a, 0x07, 0x5a, 0x46, 0xfb, 0x0d, 0xb4, 0x8c, 0xe0, 0x06, 0x6e, 0xeb, 0x0f, 0x79, 0x81, 0xa5, 0xfb, 0xed, 0x39, + 0x07, 0xbe, 0xcc, 0x51, 0xb8, 0xb7, 0x4e, 0xef, 0xe8, 0x5d, 0x3d, 0xb5, 0xdd, 0xee, 0x6e, 0xc3, 0x95, 0x54, 0x0d, 0x89, 0x6f, 0x2e, 0x79, 0xcd, 0xe2, 0xde, 0x5b, 0x58, 0x49, 0xfb, 0xba, 0xa8, + 0xfd, 0xf5, 0x7c, 0x4d, 0x4c, 0xa8, 0x15, 0x92, 0x69, 0x15, 0x8f, 0x96, 0x51, 0x1f, 0xae, 0xfa, 0x70, 0x27, 0xc5, 0xda, 0xbf, 0x0f, 0xfe, 0xfb, 0xfc, 0x18, 0xdc, 0x2d, 0x46, 0x47, 0xc7, 0x4f, + 0xae, 0x4e, 0x5a, 0x46, 0x87, 0x93, 0xaf, 0x9d, 0xce, 0x6b, 0xe7, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, + 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, + 0xf1, 0x7d, 0xef, 0x92, 0x17, 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, 0x21, 0x8d, 0x0a, 0x9e, 0x5e, 0x9c, 0xe9, 0xa6, 0x3b, 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, + 0xce, 0xe1, 0x3a, 0x3e, 0x43, 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, 0x0f, 0x79, 0xa5, 0x0c, 0x31, 0x39, 0x4d, 0x09, 0xc5, 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, + 0x69, 0x93, 0x25, 0xa8, 0x45, 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, 0x2e, 0x66, 0xc9, 0xff, 0x9e, 0xd3, 0xc2, 0x21, 0x37, 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, + 0xb0, 0xc3, 0xb0, 0x36, 0xaa, 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, + 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x94, 0x55, 0x59, 0x6f, 0xdb, 0x38, 0x10, + 0x7e, 0xe7, 0xaf, 0x98, 0x95, 0x0b, 0xf4, 0x40, 0x2d, 0x27, 0x0f, 0x05, 0x0a, 0x01, 0x29, 0x90, 0xc3, 0x69, 0xd5, 0x75, 0xb2, 0x5d, 0x47, 0xee, 0xa2, 0x80, 0x01, 0x8b, 0xa6, 0xc6, 0x12, 0x6d, + 0x8a, 0xd4, 0xf2, 0x90, 0x6b, 0x14, 0xdd, 0xdf, 0xbe, 0xa0, 0x24, 0x5f, 0x49, 0xbc, 0xc7, 0x9b, 0xc4, 0xf9, 0x66, 0x38, 0xf3, 0xcd, 0x37, 0xc3, 0x1e, 0xdc, 0x3a, 0xc9, 0x2c, 0x57, 0x12, 0x2a, + 0xad, 0x96, 0xc8, 0x2c, 0x21, 0x7f, 0xa0, 0x60, 0xaa, 0x44, 0xb0, 0x0a, 0x36, 0xca, 0x69, 0x90, 0xb8, 0x86, 0xdf, 0x1d, 0xd5, 0x2b, 0x67, 0x60, 0xf1, 0x08, 0xfd, 0x0b, 0x21, 0x49, 0xc1, 0x0d, + 0x18, 0x5a, 0x56, 0x02, 0xb7, 0xa7, 0xc0, 0x94, 0xb4, 0x94, 0x4b, 0x03, 0x14, 0x0c, 0x97, 0xb9, 0xc0, 0x9d, 0x63, 0x04, 0xe9, 0xf6, 0xd3, 0x84, 0xdb, 0xbb, 0xc3, 0xed, 0xd1, 0xab, 0xd7, 0xe9, + 0x5b, 0x62, 0x8b, 0x3d, 0x1c, 0x96, 0xce, 0x58, 0xd0, 0x68, 0x9d, 0x96, 0x06, 0xb8, 0x35, 0x40, 0x75, 0xee, 0x4a, 0x94, 0x36, 0x24, 0xa4, 0xd7, 0x83, 0x91, 0x62, 0x54, 0x00, 0x7e, 0x47, 0xe6, + 0x3c, 0x9c, 0xdc, 0xd1, 0x15, 0x82, 0x71, 0x1a, 0xc1, 0x16, 0xd4, 0x42, 0xfa, 0x99, 0xd6, 0x14, 0xce, 0xcf, 0xe1, 0xe1, 0xe6, 0xd7, 0x14, 0xb8, 0x01, 0x2e, 0x8d, 0xa5, 0x42, 0x60, 0x16, 0x12, + 0x92, 0x28, 0x30, 0x96, 0x6a, 0x0b, 0x06, 0x75, 0x8d, 0x1a, 0x84, 0x8f, 0x25, 0x36, 0xa0, 0x9d, 0x84, 0x34, 0x1c, 0x94, 0xb5, 0x5c, 0xc3, 0x9f, 0x6d, 0xdd, 0x51, 0x86, 0x75, 0x1a, 0x92, 0xa4, + 0x40, 0x60, 0xaa, 0x2c, 0xa9, 0xcc, 0x5a, 0x57, 0x03, 0x85, 0xb5, 0xd5, 0x36, 0x80, 0x3f, 0xa6, 0xce, 0xaa, 0x92, 0x5a, 0xde, 0x86, 0x5a, 0x53, 0xcb, 0x0a, 0x34, 0xb0, 0x50, 0x1a, 0x58, 0x41, + 0x65, 0x8e, 0x06, 0xd4, 0x02, 0x8c, 0x72, 0x9a, 0xf9, 0x50, 0x19, 0x86, 0x24, 0x3e, 0xfa, 0xdf, 0xc1, 0x3c, 0x0b, 0xed, 0x37, 0xac, 0xb9, 0x10, 0x30, 0x6f, 0xd8, 0xad, 0x68, 0x4e, 0x2d, 0x66, + 0xbe, 0x37, 0xda, 0x49, 0xc9, 0x65, 0xde, 0x5d, 0x1e, 0x42, 0x6c, 0x81, 0x0a, 0xa3, 0x40, 0x55, 0x28, 0x0d, 0x64, 0x38, 0x77, 0x79, 0xee, 0xed, 0x95, 0xd2, 0x16, 0xd2, 0x77, 0x67, 0x67, 0xef, + 0x52, 0x62, 0x54, 0x67, 0x40, 0x0d, 0x8c, 0x4a, 0x1f, 0x94, 0x5a, 0x4b, 0x59, 0x81, 0x19, 0xf0, 0x05, 0x48, 0xc4, 0x6c, 0x4b, 0x8d, 0x67, 0xc1, 0xa2, 0xb1, 0xcf, 0xd2, 0xe2, 0x0d, 0x69, 0xdb, + 0x01, 0xcf, 0x49, 0xd3, 0xd2, 0x14, 0xae, 0x47, 0x31, 0x21, 0xb1, 0x7d, 0x69, 0x40, 0xa3, 0xa7, 0x09, 0x65, 0xd6, 0xa6, 0x6a, 0xd0, 0x42, 0x7a, 0x3b, 0xb9, 0xbf, 0x9e, 0x8d, 0x87, 0x1f, 0xe3, + 0x87, 0x64, 0xfc, 0x2d, 0x05, 0x94, 0x35, 0xd7, 0x4a, 0xfa, 0x56, 0x42, 0x4d, 0x35, 0xa7, 0x73, 0x81, 0x21, 0x49, 0xd3, 0xd4, 0x14, 0x28, 0x04, 0x18, 0xa6, 0x79, 0x65, 0x49, 0x0f, 0x34, 0x56, + 0x82, 0x32, 0x84, 0xbf, 0x06, 0xe1, 0x9c, 0x9a, 0x42, 0x33, 0x98, 0x6f, 0x5a, 0x5d, 0xb6, 0x40, 0xcd, 0x60, 0xc1, 0x05, 0x1e, 0x20, 0x33, 0xc5, 0x56, 0xa8, 0x43, 0xae, 0x06, 0x4b, 0x55, 0xc8, + 0x4c, 0x79, 0x02, 0x6d, 0xd1, 0xfa, 0x68, 0xcc, 0xb9, 0xb1, 0x7a, 0x43, 0xf0, 0x7b, 0xc3, 0xcb, 0x51, 0x52, 0x17, 0x4f, 0x3c, 0x09, 0xb2, 0x42, 0x41, 0xf0, 0xdf, 0xc0, 0x01, 0x7c, 0xf8, 0x70, + 0x90, 0xa6, 0xaf, 0xc5, 0x33, 0xd4, 0x83, 0x2b, 0xc7, 0x45, 0xc6, 0x65, 0xde, 0xcd, 0xca, 0x56, 0x41, 0x73, 0x7f, 0x6c, 0xe0, 0xb7, 0xeb, 0x18, 0x78, 0x49, 0x73, 0x6c, 0x54, 0x72, 0x28, 0xfe, + 0x90, 0x3c, 0xe1, 0xc3, 0x9b, 0x5a, 0xc7, 0x36, 0xfc, 0xd5, 0x06, 0x32, 0x5c, 0x50, 0x27, 0xec, 0x5b, 0xf8, 0xfc, 0xf5, 0xae, 0x35, 0x79, 0xa1, 0x3b, 0xe3, 0x1b, 0x99, 0x28, 0x40, 0xe9, 0x99, + 0x05, 0x49, 0x2d, 0xaf, 0xb1, 0xb3, 0xfb, 0x7e, 0x2c, 0x94, 0x10, 0x6a, 0xed, 0x05, 0xf2, 0x5c, 0x27, 0x8c, 0x6f, 0x5b, 0xd3, 0xd6, 0x70, 0x43, 0x4b, 0x91, 0x46, 0xfe, 0x3a, 0xff, 0x45, 0x9a, + 0x08, 0x43, 0x59, 0x9b, 0x88, 0x00, 0xf4, 0x41, 0xd2, 0x12, 0x23, 0xb8, 0xfa, 0x32, 0xbb, 0xbf, 0x4c, 0xe2, 0xaf, 0xc3, 0x59, 0x7c, 0x77, 0xf9, 0x71, 0x48, 0x00, 0x00, 0x6a, 0x2a, 0x1c, 0x46, + 0x10, 0x58, 0xed, 0x30, 0x38, 0xc6, 0xde, 0x5d, 0x7e, 0x1d, 0xde, 0xcf, 0xae, 0x26, 0xf1, 0x28, 0x99, 0x5d, 0x8e, 0x93, 0xf8, 0xf6, 0xf2, 0x3a, 0x39, 0xf4, 0xd9, 0xdd, 0x0b, 0x96, 0xea, 0x1c, + 0xed, 0xa0, 0xcd, 0xbe, 0xdf, 0xce, 0x89, 0x19, 0xbc, 0x39, 0x15, 0xee, 0x66, 0x76, 0x39, 0xfe, 0x38, 0xb9, 0x1b, 0xde, 0x27, 0x0f, 0x87, 0xf1, 0x2a, 0xca, 0x56, 0x9e, 0xe0, 0xfe, 0x8d, 0x59, + 0xf1, 0x2a, 0x41, 0x63, 0xcd, 0x85, 0x4f, 0x0b, 0xfa, 0x37, 0x25, 0xad, 0x51, 0x86, 0x4b, 0x5a, 0xd3, 0x4c, 0xb1, 0xd0, 0x9b, 0xb7, 0x96, 0x6e, 0xf4, 0xc3, 0xce, 0x39, 0xb4, 0x9b, 0x0a, 0x2f, + 0x8e, 0x13, 0x39, 0xcd, 0xc0, 0xe3, 0x6c, 0x66, 0xb7, 0xf1, 0xe8, 0x88, 0x96, 0x2e, 0x50, 0xd3, 0xf8, 0x90, 0xea, 0xfc, 0xdf, 0x62, 0x3d, 0x4f, 0xd4, 0xcb, 0x37, 0x7d, 0xbf, 0x06, 0x50, 0x87, + 0x4b, 0xaa, 0x5f, 0xee, 0x15, 0x37, 0x6e, 0x77, 0xc3, 0x23, 0xc1, 0x69, 0x27, 0xcd, 0x91, 0xc0, 0x76, 0xb3, 0xcd, 0x25, 0xd0, 0xed, 0xd2, 0x46, 0x4d, 0x9c, 0x5f, 0xda, 0x0d, 0xb2, 0x15, 0x26, + 0xd3, 0xd8, 0x6c, 0x1d, 0x3a, 0x57, 0xf5, 0x33, 0x43, 0xda, 0x88, 0x52, 0x3b, 0xb9, 0xbf, 0xff, 0x06, 0x2b, 0xa1, 0x36, 0x4f, 0x32, 0x30, 0xdd, 0x2a, 0x6b, 0x44, 0xe8, 0x33, 0xca, 0x1a, 0xdc, + 0x71, 0x4e, 0x5c, 0x5a, 0x05, 0x4c, 0x38, 0x63, 0x51, 0x9f, 0x9a, 0x80, 0xce, 0xaf, 0xd7, 0x6e, 0x3c, 0xab, 0xb9, 0xdf, 0x68, 0xe6, 0x70, 0x30, 0x7a, 0x07, 0x2f, 0x1b, 0x97, 0xb5, 0x62, 0xb4, + 0x79, 0x1f, 0xc8, 0x8d, 0x02, 0xa9, 0xbc, 0xfa, 0xbd, 0xae, 0x76, 0xbb, 0x69, 0x32, 0x1e, 0xa5, 0x3b, 0xed, 0xfb, 0x53, 0x9f, 0x91, 0x56, 0xce, 0xa2, 0x5f, 0xd7, 0xcd, 0xe6, 0x38, 0x18, 0xca, + 0x6f, 0xca, 0x41, 0xe3, 0xbd, 0x03, 0xcd, 0x37, 0x07, 0xf3, 0xd4, 0x15, 0x7b, 0x82, 0x27, 0x2e, 0x17, 0x6a, 0x4f, 0x14, 0x9b, 0x8c, 0x47, 0x4f, 0x6b, 0x9c, 0x8c, 0x47, 0x17, 0xfe, 0x61, 0x89, + 0x06, 0x83, 0xa6, 0x43, 0x85, 0x32, 0x36, 0x7a, 0x7f, 0xf6, 0xfe, 0x6c, 0x40, 0x98, 0xd3, 0x02, 0xfa, 0x35, 0xbc, 0xf8, 0x31, 0x19, 0x8f, 0x7e, 0xc2, 0xd4, 0xcb, 0xe6, 0x13, 0x04, 0xd7, 0x4a, + 0x5a, 0x94, 0xb6, 0x9f, 0x6c, 0x2a, 0x8c, 0x68, 0x55, 0x09, 0xde, 0x16, 0x3c, 0x58, 0x1a, 0x25, 0x83, 0x3d, 0x0c, 0xfb, 0x71, 0x16, 0x9d, 0x1f, 0x1d, 0x3c, 0x34, 0x5a, 0x8e, 0x98, 0x50, 0x2e, + 0xeb, 0x63, 0xed, 0xa3, 0xe0, 0xf7, 0xe6, 0x39, 0x3f, 0x82, 0x35, 0x91, 0x33, 0xac, 0xc3, 0x55, 0x2b, 0xdd, 0xf0, 0x39, 0xd0, 0x43, 0x85, 0xac, 0x46, 0x6d, 0xfc, 0x43, 0x7f, 0x1e, 0x9e, 0x75, + 0xb6, 0x0c, 0x82, 0x1f, 0xd3, 0xa0, 0x44, 0x63, 0x68, 0x8e, 0xd3, 0x20, 0x82, 0x69, 0xf0, 0xe2, 0xd5, 0xba, 0x50, 0xb4, 0xe4, 0xaf, 0xa7, 0xc1, 0xcf, 0x69, 0x10, 0xec, 0x09, 0xf9, 0x94, 0x24, + 0x5f, 0x38, 0xfe, 0x2f, 0x4a, 0x9a, 0x27, 0xf8, 0x98, 0x92, 0x7f, 0xa4, 0xa3, 0x45, 0xb4, 0x4c, 0x6c, 0xbf, 0x4f, 0x93, 0xb0, 0x45, 0x9c, 0xaa, 0x7f, 0x17, 0xe1, 0xb8, 0xf4, 0xe6, 0xb8, 0x2b, + 0xf9, 0x62, 0x57, 0x6d, 0x53, 0xe7, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0x10, 0x26, 0x83, 0x33, 0x04, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, + 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0xca, 0xcc, 0x2b, 0xcb, 0xcf, + 0x4e, 0xb5, 0x52, 0x50, 0x4a, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, + 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6b, 0x93, + 0x1a, 0xb7, 0x96, 0xdf, 0xfb, 0x57, 0x9c, 0x34, 0xac, 0x01, 0x17, 0xdd, 0xd8, 0xbe, 0x75, 0x73, 0xb3, 0x33, 0x4b, 0x6a, 0x31, 0xc3, 0xd8, 0x38, 0xf3, 0x5a, 0x98, 0xf1, 0x38, 0x95, 0xc9, 0x4e, + 0x89, 0x6e, 0x01, 0xf2, 0x34, 0x52, 0x47, 0x52, 0x83, 0xb9, 0xb1, 0xff, 0xfb, 0xd6, 0x91, 0xd4, 0x2f, 0xc0, 0x8e, 0xb3, 0x1e, 0x4f, 0x2a, 0x65, 0x5a, 0x7d, 0x74, 0x74, 0xde, 0x2f, 0x75, 0xe3, + 0x87, 0xde, 0x8c, 0xf1, 0x9e, 0x5a, 0x7a, 0x0d, 0x08, 0x1e, 0xf1, 0xcf, 0x6b, 0xc0, 0x19, 0x8b, 0x28, 0x57, 0x34, 0x06, 0x2d, 0x40, 0x2f, 0x29, 0x0c, 0x52, 0x12, 0x2d, 0x29, 0x4c, 0xc5, 0x5c, + 0x6f, 0x88, 0xa4, 0x70, 0x2a, 0x32, 0x1e, 0x13, 0xcd, 0x04, 0x87, 0xf6, 0x60, 0x7a, 0xda, 0x81, 0x8c, 0xc7, 0x54, 0x82, 0xe0, 0xd4, 0x6b, 0x80, 0x90, 0xb0, 0x12, 0x92, 0x42, 0x24, 0xb8, 0x96, + 0x6c, 0x96, 0x69, 0x21, 0x21, 0xb1, 0x08, 0x81, 0x2c, 0x24, 0xa5, 0x2b, 0xca, 0xb5, 0x0a, 0x01, 0xa6, 0x94, 0x1a, 0xec, 0x17, 0x97, 0xd7, 0xe3, 0xe1, 0x08, 0xe6, 0x2c, 0xc1, 0xed, 0x31, 0x53, + 0x76, 0x1b, 0x8d, 0x61, 0xc3, 0xf4, 0x12, 0xf4, 0x92, 0x29, 0xd8, 0x08, 0xf9, 0x00, 0x73, 0x21, 0x81, 0xc4, 0x31, 0xc3, 0x83, 0x49, 0x02, 0x8c, 0xcf, 0x85, 0x5c, 0x19, 0x32, 0xbc, 0x06, 0x48, + 0xba, 0x20, 0x32, 0x66, 0x7c, 0x01, 0x91, 0x48, 0xb7, 0x92, 0x2d, 0x96, 0x1a, 0xc4, 0x86, 0x53, 0xa9, 0x96, 0x2c, 0x0d, 0x01, 0xae, 0x91, 0x8f, 0xe9, 0x69, 0x4e, 0x8a, 0xb2, 0x78, 0xdd, 0xa1, + 0x5a, 0xc0, 0x56, 0x64, 0x8e, 0x8d, 0x0a, 0xc7, 0x4e, 0x10, 0x5d, 0x78, 0x4b, 0xa5, 0x42, 0x76, 0x5f, 0x84, 0xcf, 0xa0, 0xad, 0x97, 0xb8, 0xc7, 0x77, 0x2f, 0xfd, 0xce, 0xb1, 0xd9, 0xbc, 0x22, + 0x5b, 0xe0, 0x42, 0x43, 0xa6, 0x68, 0x89, 0x1b, 0xe8, 0x87, 0x88, 0xa6, 0x1a, 0x18, 0x87, 0x48, 0xac, 0xd2, 0x84, 0x11, 0x1e, 0xe1, 0x66, 0xc7, 0x59, 0x71, 0x42, 0x08, 0xf0, 0xab, 0xc3, 0x21, + 0x66, 0x9a, 0x30, 0x0e, 0xc4, 0xf0, 0x01, 0x62, 0x5e, 0x05, 0x03, 0xa2, 0xbd, 0x86, 0xd7, 0x00, 0x00, 0x58, 0x6a, 0x9d, 0x1e, 0xf5, 0x7a, 0x9b, 0xcd, 0x26, 0x24, 0x86, 0xd8, 0x50, 0xc8, 0x45, + 0x2f, 0xe7, 0xae, 0x77, 0x36, 0x1e, 0x8e, 0x2e, 0xa6, 0xa3, 0xe0, 0x45, 0xf8, 0xcc, 0xec, 0xb8, 0xe1, 0x09, 0x55, 0x0a, 0x24, 0xfd, 0x23, 0x63, 0x92, 0xc6, 0x30, 0xdb, 0x02, 0x49, 0xd3, 0x84, + 0x45, 0x64, 0x96, 0x50, 0x48, 0xc8, 0x06, 0xf5, 0x66, 0xd4, 0x63, 0xb4, 0xce, 0x38, 0x6c, 0x24, 0xd3, 0x8c, 0x2f, 0xba, 0x5e, 0x03, 0x54, 0xae, 0xf8, 0xaa, 0x72, 0x4a, 0x61, 0xe5, 0xc4, 0x31, + 0x55, 0x03, 0x10, 0x1c, 0x08, 0x6a, 0xc6, 0x1f, 0x4c, 0x61, 0x3c, 0xf5, 0xe1, 0xe5, 0x60, 0x3a, 0x9e, 0x76, 0xe1, 0x76, 0x7c, 0xfd, 0xfa, 0xf2, 0xe6, 0x1a, 0x6e, 0x07, 0x93, 0xc9, 0xe0, 0xe2, + 0x7a, 0x3c, 0x9a, 0xc2, 0xe5, 0x04, 0x86, 0x97, 0x17, 0x27, 0xe3, 0xeb, 0xf1, 0xe5, 0xc5, 0x14, 0x2e, 0x4f, 0x61, 0x70, 0xf1, 0xab, 0xd7, 0x80, 0x5f, 0xc6, 0x17, 0x27, 0x5d, 0xa0, 0x4c, 0x2f, + 0xa9, 0x04, 0xfa, 0x21, 0x95, 0xc8, 0x81, 0x90, 0xc0, 0x50, 0x90, 0x34, 0xae, 0x98, 0x50, 0x4e, 0x01, 0x5a, 0x88, 0xd5, 0x8e, 0x4a, 0x69, 0xc4, 0xe6, 0x2c, 0x82, 0x84, 0xf0, 0x45, 0x46, 0x16, + 0x14, 0x16, 0x62, 0x4d, 0x25, 0x47, 0x03, 0x49, 0xa9, 0x5c, 0x31, 0x85, 0xfa, 0x54, 0x40, 0x78, 0x0c, 0x09, 0x5b, 0x31, 0x6d, 0xec, 0x48, 0x79, 0x8d, 0x7d, 0xbe, 0xc2, 0xc7, 0x76, 0xb0, 0xc7, + 0xc6, 0xd7, 0xc8, 0xcd, 0xf5, 0x9c, 0xac, 0x29, 0x87, 0x5b, 0x49, 0xd2, 0x94, 0x4a, 0x50, 0x9a, 0x48, 0x9d, 0xa5, 0x30, 0x23, 0x3a, 0x5a, 0x82, 0x8a, 0x24, 0x4b, 0x75, 0x17, 0xd6, 0xce, 0x92, + 0xff, 0x11, 0xe6, 0xa6, 0x31, 0xc9, 0x6d, 0x62, 0x74, 0xf1, 0x16, 0xd6, 0x44, 0xaa, 0xa3, 0x83, 0x04, 0x1a, 0xb3, 0x7b, 0x33, 0x78, 0x3b, 0xb8, 0x7f, 0x7d, 0x79, 0x3e, 0x82, 0x00, 0x12, 0x11, + 0xd9, 0x18, 0x20, 0xe6, 0x40, 0xe0, 0xcd, 0xc9, 0x2f, 0xb0, 0x14, 0x2b, 0xb4, 0x11, 0x69, 0xd0, 0x5e, 0xa6, 0xce, 0x4f, 0x73, 0xb4, 0x87, 0xb0, 0x1a, 0xa4, 0xe7, 0x83, 0xb7, 0xa3, 0x8b, 0xfb, + 0xcb, 0xab, 0xeb, 0x29, 0x04, 0x90, 0x12, 0x49, 0x56, 0x54, 0x53, 0xa9, 0x20, 0x25, 0xaa, 0x12, 0x84, 0xde, 0x90, 0x35, 0x81, 0xb7, 0xe7, 0xb0, 0x59, 0x52, 0x0e, 0x32, 0xe3, 0x46, 0x95, 0x86, + 0x63, 0xeb, 0x10, 0x40, 0xc3, 0x45, 0x88, 0xc0, 0x31, 0x9d, 0x65, 0xee, 0x0d, 0x30, 0xad, 0x68, 0x32, 0xef, 0xa2, 0x53, 0x3a, 0x28, 0x00, 0x45, 0x75, 0xe5, 0xc8, 0x7e, 0xf0, 0xce, 0x6e, 0x08, + 0xde, 0xc9, 0x8c, 0xbf, 0x8f, 0x37, 0xe9, 0x91, 0x96, 0x84, 0xab, 0x54, 0x48, 0xdd, 0x8f, 0xf5, 0xbd, 0x12, 0xd1, 0x03, 0xd5, 0x5d, 0x45, 0xe5, 0x9a, 0xca, 0xfe, 0xb6, 0xab, 0x32, 0x95, 0x52, + 0x1e, 0xf7, 0xb7, 0x5d, 0x12, 0xc7, 0x68, 0x91, 0xfd, 0x9f, 0x9e, 0x3d, 0x7b, 0x56, 0xe1, 0x63, 0xfa, 0xcb, 0xf8, 0xea, 0x7e, 0x32, 0x84, 0x00, 0xe6, 0x09, 0x59, 0x18, 0x82, 0x98, 0xb2, 0x5e, + 0x26, 0x88, 0x09, 0x50, 0x62, 0x0e, 0x2b, 0xa4, 0x4e, 0x46, 0x26, 0x46, 0x1c, 0x14, 0xcc, 0x37, 0xfc, 0x79, 0x1e, 0x9b, 0xc3, 0x6f, 0x10, 0xfc, 0x1b, 0xfc, 0x66, 0x8d, 0x24, 0x1f, 0x7e, 0x87, + 0x63, 0x94, 0x25, 0xf7, 0x3c, 0x00, 0x0b, 0x34, 0x87, 0x5e, 0xa6, 0x64, 0x0f, 0x75, 0x99, 0xf4, 0xa8, 0x8e, 0x7a, 0x39, 0x65, 0x05, 0x28, 0x8a, 0x2c, 0xfc, 0x0c, 0x94, 0x07, 0x30, 0x67, 0x35, + 0x64, 0x5f, 0x42, 0xf1, 0xa5, 0x8d, 0x7e, 0x13, 0xad, 0xaa, 0x17, 0xba, 0xf7, 0xfe, 0xee, 0xe6, 0xdd, 0xf7, 0x0e, 0x01, 0xfe, 0xdf, 0x80, 0xcb, 0x69, 0xe9, 0xef, 0x2a, 0x4b, 0x51, 0x75, 0x21, + 0x40, 0x73, 0x4d, 0x24, 0xdc, 0xaf, 0x32, 0xa5, 0xef, 0x61, 0x46, 0x8d, 0xda, 0xb5, 0xc8, 0xc3, 0x89, 0x96, 0x19, 0xc5, 0x58, 0x32, 0x27, 0x09, 0x7a, 0x78, 0xb4, 0x5d, 0x6c, 0x18, 0xef, 0x9b, + 0xa7, 0x63, 0x2f, 0x26, 0xb2, 0xf2, 0xb4, 0x62, 0x7c, 0xb1, 0xb1, 0x0f, 0x5e, 0x44, 0x14, 0x05, 0xbf, 0xd9, 0xce, 0x38, 0x59, 0xd1, 0x8e, 0x0f, 0x0c, 0xe9, 0x1b, 0xfe, 0xfa, 0xea, 0x76, 0x7c, + 0xf1, 0xb4, 0x03, 0x0e, 0x8b, 0xc1, 0x7d, 0x7c, 0xec, 0x01, 0x9c, 0x8f, 0x2f, 0x5e, 0xdd, 0x3e, 0xed, 0x80, 0x45, 0x81, 0xeb, 0x66, 0xf9, 0xc4, 0xe0, 0x7f, 0xda, 0x01, 0x77, 0x10, 0xbe, 0x30, + 0x7c, 0x36, 0xe0, 0x46, 0x51, 0x27, 0x6b, 0x36, 0xa3, 0x1f, 0x68, 0xd4, 0x7b, 0x4f, 0xd6, 0xe4, 0xde, 0x38, 0x16, 0x9b, 0x03, 0x59, 0x13, 0x96, 0xa0, 0x2d, 0x75, 0x41, 0x20, 0x1b, 0x1b, 0x86, + 0x41, 0x8f, 0x24, 0x09, 0xcc, 0x48, 0xf4, 0x80, 0xec, 0xf5, 0xce, 0xd8, 0x4c, 0x12, 0xb9, 0xed, 0xa1, 0xbb, 0xf4, 0x5e, 0x8b, 0x55, 0x8e, 0x18, 0x43, 0x25, 0xe6, 0x0c, 0x75, 0xd4, 0xeb, 0xc5, + 0x74, 0x4d, 0x13, 0x91, 0x52, 0x19, 0x62, 0x0e, 0xa0, 0x61, 0x24, 0x56, 0x78, 0x9e, 0xd9, 0xb7, 0x22, 0x51, 0xef, 0x0f, 0xd2, 0xfb, 0x83, 0x3c, 0x7f, 0xfe, 0xaf, 0x67, 0xbd, 0x7b, 0xc6, 0x63, + 0xfa, 0x21, 0x5c, 0xea, 0x55, 0x62, 0xf0, 0x94, 0x96, 0x55, 0x44, 0x02, 0x1f, 0x7e, 0xaf, 0x68, 0x2a, 0x07, 0xf9, 0x00, 0xfe, 0x61, 0x36, 0x76, 0xc1, 0x2b, 0x31, 0xa5, 0xef, 0x37, 0xdb, 0x87, + 0x37, 0x75, 0xfc, 0x63, 0x4c, 0x00, 0x42, 0xea, 0x12, 0xda, 0xed, 0xa7, 0xa8, 0x96, 0x03, 0xa8, 0xf6, 0x05, 0xf1, 0x79, 0x1c, 0x73, 0xe6, 0x55, 0xfe, 0x39, 0x3e, 0xf6, 0xa8, 0x22, 0x51, 0xd5, + 0x8d, 0xaa, 0xcc, 0x96, 0x76, 0x69, 0xdf, 0x4b, 0x6b, 0xd8, 0x0b, 0xca, 0xb5, 0x10, 0x81, 0xa4, 0x09, 0x45, 0x1b, 0xa9, 0x99, 0x6f, 0x49, 0x56, 0xb3, 0x8d, 0x3c, 0x05, 0x91, 0xe0, 0x73, 0xb6, + 0x80, 0x20, 0x78, 0x2f, 0x69, 0x60, 0x18, 0xb4, 0xf6, 0x6c, 0xcd, 0xf9, 0x54, 0x48, 0x18, 0x1a, 0x53, 0xea, 0x02, 0xe5, 0x2a, 0x93, 0x14, 0x52, 0xa2, 0x97, 0x0a, 0x30, 0x05, 0x33, 0x0e, 0x37, + 0x17, 0xe3, 0x77, 0x60, 0x6b, 0x1f, 0x98, 0xd1, 0x39, 0x16, 0x5b, 0x84, 0x6f, 0xf5, 0x12, 0x63, 0x0b, 0x53, 0xa0, 0x45, 0x16, 0x2d, 0x69, 0x8c, 0xe4, 0x37, 0xad, 0x45, 0x96, 0xb4, 0xfc, 0x06, + 0x01, 0xdf, 0xe5, 0xe7, 0xc9, 0x93, 0x3d, 0x22, 0xa3, 0xed, 0x02, 0x4f, 0x84, 0x20, 0xc8, 0x38, 0xfb, 0x50, 0xdb, 0xd0, 0x29, 0xb1, 0x0c, 0xcf, 0x06, 0xd3, 0xe9, 0xd5, 0xe0, 0xfa, 0x75, 0x05, + 0x4b, 0xb1, 0x56, 0xc3, 0x52, 0x47, 0x56, 0xee, 0xeb, 0x54, 0x38, 0x3e, 0x47, 0x1f, 0xf9, 0x66, 0x86, 0x8d, 0xa7, 0xfd, 0x15, 0xbf, 0xb8, 0x1c, 0xff, 0xa5, 0x18, 0xfc, 0x66, 0x3b, 0xda, 0x81, + 0xfa, 0xf8, 0x11, 0xda, 0x34, 0x5a, 0x0a, 0xf0, 0x23, 0xc2, 0xb1, 0xd8, 0x8b, 0x62, 0x60, 0x5c, 0x0b, 0x28, 0x81, 0x42, 0x63, 0x66, 0x4c, 0xc3, 0xf3, 0xce, 0x31, 0xa4, 0x9b, 0xb8, 0xe3, 0x1b, + 0x1e, 0xff, 0xc2, 0x71, 0xd0, 0x2a, 0x46, 0x1f, 0x68, 0x94, 0x69, 0xf4, 0x6e, 0x3c, 0x7a, 0xb3, 0x64, 0xd1, 0xd2, 0xac, 0x47, 0x1d, 0xbf, 0x30, 0x36, 0x64, 0xa6, 0x0e, 0xeb, 0x38, 0xfa, 0x01, + 0x7e, 0xc3, 0xb8, 0x84, 0x55, 0x12, 0xf8, 0x77, 0xbb, 0x40, 0x77, 0xbe, 0x0f, 0x47, 0xd0, 0xba, 0x6b, 0xff, 0xf6, 0xbf, 0xf0, 0xfb, 0xd3, 0xbb, 0x4e, 0xab, 0xe3, 0x43, 0x1f, 0x7c, 0x2e, 0xea, + 0xde, 0x88, 0x55, 0x34, 0x89, 0x13, 0xc6, 0x1f, 0xda, 0xcf, 0x3b, 0x28, 0x59, 0x64, 0xb1, 0x88, 0x39, 0x40, 0x14, 0xd6, 0x14, 0x3c, 0x26, 0xd2, 0x14, 0x77, 0x53, 0x91, 0x10, 0xc9, 0x14, 0x3c, + 0x7f, 0x16, 0x9a, 0xdd, 0xb8, 0xf7, 0x8c, 0xf1, 0x87, 0x7e, 0x4e, 0x7c, 0x8e, 0xac, 0x53, 0x86, 0x8e, 0x1f, 0x4a, 0x22, 0x9b, 0x39, 0xfc, 0x57, 0x91, 0x66, 0xf6, 0x37, 0x6d, 0xbc, 0x84, 0x9d, + 0x00, 0x82, 0xbc, 0xa2, 0x83, 0xa3, 0xd8, 0x62, 0x26, 0x31, 0x34, 0x1f, 0x96, 0x81, 0x11, 0x64, 0xb9, 0xa7, 0x2e, 0x70, 0xd4, 0xb5, 0xdb, 0x84, 0xc8, 0x50, 0x64, 0x4f, 0x9e, 0xa0, 0x06, 0x21, + 0xb8, 0xea, 0x98, 0x50, 0x14, 0xf9, 0x87, 0x62, 0xce, 0x3e, 0xa6, 0x9c, 0x6f, 0x93, 0xd7, 0xbe, 0x48, 0x87, 0x8b, 0x38, 0xff, 0x1f, 0x16, 0x8a, 0x1d, 0x85, 0x3c, 0xf3, 0x15, 0x27, 0xcf, 0xf0, + 0xe9, 0x5d, 0x07, 0x3b, 0xc4, 0x56, 0xc7, 0xed, 0xa8, 0x5a, 0x76, 0x01, 0x9b, 0x73, 0x74, 0x28, 0x30, 0x1a, 0xea, 0x5c, 0x54, 0xaa, 0xdb, 0xef, 0xf0, 0xfc, 0xe4, 0x40, 0x24, 0xdc, 0xf1, 0xb4, + 0x7a, 0x0c, 0x2c, 0xd2, 0x42, 0x09, 0xd2, 0x7b, 0x2f, 0x69, 0x4f, 0x2d, 0x8d, 0x6c, 0x77, 0x12, 0x3e, 0xda, 0xe2, 0xf8, 0xe5, 0x79, 0x4b, 0x99, 0xba, 0x52, 0x70, 0x18, 0x8c, 0xdf, 0x61, 0x11, + 0x87, 0x16, 0x28, 0x09, 0x5f, 0xd0, 0xa2, 0xfa, 0x54, 0x79, 0xd1, 0x0f, 0xb4, 0x90, 0x93, 0xaa, 0x70, 0x3c, 0x3c, 0x3f, 0xe9, 0x7f, 0xee, 0x4c, 0x6f, 0x47, 0x99, 0x87, 0xe0, 0xb1, 0xc7, 0x2e, + 0x81, 0x8d, 0x48, 0x8a, 0x1d, 0x25, 0x7c, 0xfb, 0x2e, 0xe3, 0x58, 0x60, 0x04, 0x73, 0xec, 0xf3, 0x56, 0xd8, 0x55, 0xbc, 0xf8, 0x19, 0xf3, 0x6c, 0x8f, 0x67, 0x49, 0x72, 0x0c, 0x77, 0xf9, 0x6a, + 0xb0, 0x36, 0x9a, 0xeb, 0xf8, 0x3b, 0xa2, 0xfd, 0xa1, 0x94, 0xcd, 0xae, 0x70, 0x6d, 0xc0, 0x19, 0x49, 0x29, 0xe4, 0x51, 0xa5, 0x00, 0x77, 0xee, 0x19, 0xd3, 0x39, 0xe3, 0x34, 0x86, 0x48, 0x48, + 0x49, 0x23, 0x9d, 0x6c, 0x43, 0x1f, 0x7e, 0x7e, 0xf2, 0xa2, 0xd8, 0x07, 0x70, 0x4b, 0xc1, 0x45, 0x2b, 0x2b, 0x21, 0x0a, 0xe5, 0x31, 0x0e, 0xd2, 0xc4, 0xab, 0x2f, 0xc4, 0xa9, 0x5d, 0x62, 0x6e, + 0x89, 0xe9, 0xa4, 0xaa, 0xe4, 0x50, 0xbe, 0x66, 0x52, 0x70, 0x6c, 0xee, 0xb1, 0xda, 0x67, 0x26, 0x62, 0x38, 0x1a, 0x15, 0xd5, 0xa1, 0xef, 0x42, 0xbd, 0x96, 0x04, 0x5b, 0x10, 0x8a, 0xbd, 0x22, + 0x12, 0x2c, 0xe4, 0x16, 0x75, 0x9a, 0x45, 0x1a, 0xc3, 0xfe, 0x5c, 0x8a, 0x15, 0xa4, 0x52, 0x44, 0xd8, 0xea, 0x99, 0xa6, 0xbf, 0x84, 0xd2, 0xc2, 0x96, 0xcb, 0x5b, 0xa5, 0xe9, 0x0a, 0xa4, 0x10, + 0xda, 0x6b, 0xc0, 0x9c, 0x49, 0xa5, 0x2b, 0x40, 0xa6, 0xb1, 0x0e, 0x57, 0x6b, 0x0e, 0x2a, 0x9b, 0x95, 0xcb, 0x4c, 0x41, 0x24, 0xb8, 0x62, 0x31, 0xc5, 0x46, 0x27, 0x95, 0xe2, 0x3d, 0x8d, 0x34, + 0xcc, 0x30, 0x53, 0x17, 0x40, 0xde, 0x9c, 0xf1, 0xf8, 0xde, 0x14, 0x98, 0xf7, 0xf8, 0x26, 0x66, 0xb2, 0xdd, 0x81, 0x3f, 0xbd, 0x6a, 0xd5, 0xf3, 0xdc, 0x87, 0xdf, 0x3d, 0x28, 0xed, 0xd4, 0x8a, + 0xe3, 0x0a, 0xd3, 0x9b, 0x61, 0xd4, 0x56, 0xa1, 0xb6, 0x69, 0xd9, 0x47, 0xe7, 0xbb, 0x38, 0xa9, 0x33, 0xc9, 0xe1, 0x79, 0x51, 0x03, 0xbb, 0xb7, 0x7d, 0x44, 0xef, 0x01, 0x6c, 0xaa, 0xbf, 0x97, + 0x2c, 0xa1, 0x26, 0xb4, 0xe3, 0xaa, 0x0f, 0x3f, 0xf4, 0xa1, 0xd5, 0x6b, 0x19, 0x85, 0xc4, 0xa2, 0xe2, 0x57, 0x71, 0x0e, 0xd1, 0x33, 0xbc, 0xef, 0xf8, 0x52, 0x7e, 0x80, 0x01, 0xc9, 0xd7, 0x24, + 0x25, 0x0f, 0xd5, 0xb2, 0xa7, 0x61, 0xe4, 0x4d, 0xa4, 0xc8, 0x78, 0x6c, 0x7c, 0xea, 0xcd, 0xcb, 0xd1, 0xe0, 0x2a, 0xf8, 0xe9, 0x3f, 0xff, 0xf1, 0x2f, 0x68, 0xd7, 0xc2, 0x7d, 0x6f, 0x9a, 0x12, + 0x19, 0x75, 0x76, 0x8e, 0xff, 0x13, 0x91, 0x7f, 0xda, 0x8d, 0xda, 0x86, 0x19, 0x97, 0x48, 0xf1, 0x77, 0x2f, 0x0c, 0x4d, 0x1a, 0xb5, 0x26, 0x67, 0x33, 0x64, 0x9d, 0x0a, 0xca, 0x63, 0xec, 0x90, + 0x4a, 0x62, 0x3c, 0x80, 0x58, 0x70, 0xf4, 0xb8, 0x54, 0x32, 0xae, 0xe7, 0xd0, 0xfa, 0x0f, 0xd5, 0x82, 0x3c, 0x3b, 0xe7, 0xa2, 0xdd, 0x45, 0xea, 0x7b, 0x9f, 0xd0, 0xdc, 0x22, 0xc1, 0x23, 0xa2, + 0x29, 0x27, 0x9a, 0x2a, 0xc0, 0x42, 0x39, 0x61, 0x9c, 0x2a, 0xdb, 0xb2, 0x9a, 0xe1, 0x8f, 0x05, 0xb8, 0x37, 0xcb, 0x35, 0x75, 0xcf, 0x9d, 0xba, 0x6b, 0xf9, 0x71, 0x42, 0x57, 0x62, 0x4d, 0xe1, + 0x4e, 0x9a, 0x89, 0x0e, 0x9a, 0xcf, 0x86, 0x62, 0x33, 0x8a, 0x21, 0xea, 0x96, 0xf1, 0x58, 0x6c, 0x94, 0x31, 0x41, 0xc6, 0xe1, 0x15, 0xd3, 0xf0, 0x92, 0xa8, 0xa5, 0xdb, 0x89, 0xce, 0x1f, 0x2d, + 0x69, 0xf4, 0x00, 0x22, 0xd3, 0x26, 0x5e, 0x49, 0x9a, 0x0a, 0xc5, 0x4a, 0xab, 0x25, 0x99, 0x16, 0x30, 0x9c, 0x9c, 0x9d, 0xc2, 0x8a, 0x70, 0xb2, 0x30, 0x73, 0xb2, 0x42, 0x26, 0xe8, 0x4e, 0x71, + 0x08, 0x97, 0x79, 0xd5, 0xdf, 0xc5, 0x83, 0x57, 0x64, 0x6b, 0x92, 0xac, 0x63, 0x4a, 0x2f, 0x89, 0x36, 0x25, 0x53, 0x4c, 0xcd, 0x48, 0xc3, 0x4d, 0xd0, 0x1c, 0x8e, 0x3b, 0x79, 0xc7, 0x0d, 0x15, + 0xa9, 0x14, 0x71, 0x16, 0x51, 0x68, 0xb6, 0x82, 0x77, 0x44, 0x2e, 0xee, 0x64, 0x0b, 0x24, 0xb1, 0x4d, 0xd1, 0x92, 0x70, 0x30, 0x8b, 0x10, 0x67, 0x14, 0x6d, 0x78, 0x23, 0x64, 0xec, 0xf6, 0xab, + 0x34, 0x61, 0x5a, 0x63, 0xc9, 0x25, 0xb3, 0x84, 0x2a, 0x9b, 0xf3, 0xb5, 0x84, 0x40, 0x41, 0x0b, 0x71, 0xb7, 0x00, 0xff, 0xfb, 0x2f, 0x70, 0x96, 0x3b, 0x67, 0xa8, 0x80, 0x44, 0x2c, 0xaa, 0x42, + 0xf5, 0x9b, 0xe7, 0x6f, 0x2f, 0x6e, 0xef, 0xdf, 0x8e, 0x26, 0x2f, 0x2f, 0xa7, 0x23, 0x4c, 0xf4, 0xa6, 0x57, 0xaa, 0xca, 0xb8, 0xd4, 0x31, 0xa2, 0xac, 0x21, 0x7b, 0x39, 0x98, 0x8e, 0xee, 0x4f, + 0xc6, 0x93, 0x7e, 0xb3, 0xbd, 0xef, 0x5b, 0x50, 0xcd, 0x9c, 0xcd, 0x67, 0x7e, 0xc7, 0xef, 0x54, 0x82, 0x59, 0xbe, 0xb5, 0xaa, 0x4f, 0x67, 0x2d, 0x26, 0x2e, 0xd9, 0x3e, 0xf9, 0x6a, 0x72, 0xf9, + 0x66, 0x34, 0xbc, 0x46, 0x60, 0x73, 0xcc, 0x9f, 0x76, 0xd9, 0x3d, 0x1f, 0x05, 0x15, 0x3c, 0x9f, 0x8a, 0x66, 0xe2, 0xd0, 0x56, 0xe4, 0xbb, 0xe8, 0xbe, 0xeb, 0xaf, 0x7c, 0xcf, 0x6b, 0x7c, 0xb7, + 0x3f, 0xaf, 0x01, 0xa3, 0x0f, 0x9a, 0x72, 0x33, 0xe1, 0xd1, 0x02, 0x0d, 0x5e, 0x6c, 0x8c, 0x61, 0xad, 0x88, 0x66, 0x11, 0x49, 0x92, 0x2d, 0xc4, 0x62, 0xc3, 0xf3, 0x49, 0x04, 0x9a, 0xa1, 0x91, + 0x62, 0xb0, 0xb1, 0x43, 0xa3, 0xf0, 0x3d, 0x91, 0x36, 0x08, 0x9b, 0xf9, 0x49, 0x10, 0x51, 0xae, 0x25, 0x49, 0xbc, 0x06, 0x5c, 0x2f, 0x99, 0xb2, 0xf8, 0x14, 0x64, 0xaa, 0xb6, 0x19, 0xdc, 0x66, + 0xf4, 0x09, 0x17, 0x5a, 0x9d, 0x31, 0xa6, 0x52, 0x2c, 0xd9, 0x8c, 0x69, 0x6b, 0xf9, 0xa6, 0x5c, 0xe7, 0x30, 0x63, 0x9c, 0xc8, 0x2d, 0xc4, 0x44, 0x93, 0xf0, 0x7b, 0xca, 0xc2, 0x51, 0xf5, 0x86, + 0x48, 0x8c, 0xcf, 0xfd, 0xc3, 0xea, 0x30, 0xf1, 0xb2, 0xe7, 0x40, 0x7b, 0x7b, 0xb2, 0xf0, 0xbd, 0xbc, 0xc9, 0xf3, 0x9b, 0x75, 0x7c, 0xf5, 0xc8, 0x60, 0xf4, 0x6d, 0xc6, 0xe2, 0xb0, 0x0b, 0xe7, + 0x15, 0xe5, 0x82, 0x01, 0x1a, 0x8a, 0x2c, 0x89, 0x79, 0x4b, 0x9b, 0xf4, 0xb0, 0x0b, 0xdc, 0xad, 0x69, 0x87, 0x69, 0x08, 0xc3, 0xd0, 0xf7, 0x2a, 0x81, 0x96, 0xe7, 0x2e, 0x34, 0x19, 0x5d, 0x5d, + 0xde, 0x4c, 0xce, 0xf6, 0xc2, 0xad, 0x45, 0x77, 0x23, 0x93, 0x7e, 0x1d, 0xb0, 0x27, 0xe4, 0xa2, 0x67, 0x07, 0xc5, 0x96, 0xcb, 0xc3, 0x3c, 0xf7, 0xcc, 0x58, 0xb0, 0xbe, 0x16, 0x98, 0x35, 0x2b, + 0x0d, 0xa8, 0x17, 0x4c, 0xd5, 0xe3, 0xf2, 0xe1, 0x02, 0x86, 0x35, 0x3b, 0xa6, 0xa9, 0x0e, 0xa6, 0xcd, 0xc2, 0x8b, 0x47, 0xa4, 0xc2, 0xe5, 0x0b, 0x9b, 0x20, 0xc7, 0xa7, 0xd3, 0xbe, 0xdf, 0xf7, + 0x6d, 0x30, 0x0c, 0x24, 0x3c, 0xd0, 0x2d, 0xac, 0x49, 0x92, 0xd1, 0x22, 0x4d, 0x56, 0x82, 0x77, 0x0b, 0x23, 0x9e, 0xb1, 0x71, 0x03, 0x52, 0xfa, 0x49, 0xa6, 0xc8, 0x82, 0x62, 0x24, 0xdf, 0xb8, + 0x48, 0x4e, 0x14, 0x62, 0x86, 0x58, 0x50, 0x5b, 0xc7, 0xe4, 0x25, 0x84, 0x45, 0x41, 0x14, 0x10, 0x50, 0x34, 0x25, 0x92, 0x68, 0x21, 0xa1, 0x5d, 0xbc, 0x56, 0xa0, 0x52, 0x12, 0xd1, 0x2e, 0x68, + 0x32, 0xeb, 0x02, 0xa7, 0x1b, 0x13, 0x9f, 0xa1, 0xdd, 0xba, 0xe3, 0xad, 0x4e, 0xd7, 0x66, 0x82, 0x4c, 0x69, 0xb1, 0x82, 0x56, 0xbf, 0x05, 0x79, 0x79, 0xae, 0xc8, 0x9c, 0xbe, 0x45, 0x82, 0xb0, + 0xa2, 0x37, 0x65, 0x45, 0xd3, 0xd0, 0xe7, 0xc3, 0x47, 0x13, 0x66, 0x63, 0x73, 0x6a, 0x0e, 0xed, 0x06, 0x51, 0x0f, 0x74, 0xeb, 0xa3, 0x4f, 0xb5, 0x4b, 0x4d, 0x74, 0xea, 0x46, 0x50, 0xa0, 0xf5, + 0x8f, 0x6d, 0xce, 0xb7, 0x93, 0x29, 0xa3, 0x48, 0x45, 0x22, 0xf3, 0x13, 0xd3, 0xab, 0x89, 0xdc, 0x7f, 0xd7, 0x43, 0x52, 0x29, 0x52, 0x2a, 0x35, 0xa3, 0xca, 0x2f, 0x2d, 0xfc, 0xa4, 0x62, 0xc2, + 0x28, 0xe6, 0xa3, 0xc2, 0xca, 0x6f, 0x64, 0x52, 0x5a, 0xb3, 0x9b, 0x4d, 0x1c, 0x32, 0xdf, 0xdc, 0x65, 0x0f, 0x8c, 0x10, 0x72, 0xd5, 0xec, 0xb9, 0x63, 0x51, 0x45, 0xe4, 0xf8, 0x2b, 0x15, 0xf7, + 0x66, 0x41, 0x35, 0xfc, 0x0c, 0x95, 0x7a, 0xbc, 0xd6, 0x3f, 0x56, 0x9c, 0xd7, 0x40, 0x86, 0x61, 0xe8, 0x42, 0x1c, 0x3e, 0x96, 0x3d, 0xe3, 0xe7, 0xf3, 0x17, 0x76, 0x8a, 0xff, 0x73, 0x33, 0x1e, + 0x5d, 0xf7, 0x7d, 0x53, 0x88, 0xb8, 0xdf, 0x41, 0xf0, 0x47, 0xc6, 0xaa, 0x18, 0x2a, 0x83, 0x59, 0xc4, 0x73, 0x33, 0x1d, 0x4d, 0x2e, 0x06, 0xb6, 0xc2, 0xfe, 0xf8, 0xb1, 0xf6, 0xea, 0x6a, 0x30, + 0x9d, 0xde, 0x5e, 0x4e, 0x4e, 0xf6, 0xc7, 0x65, 0x46, 0x4e, 0x48, 0x66, 0xd3, 0x9c, 0x52, 0x4a, 0x02, 0xa5, 0x0b, 0xc1, 0xe5, 0x81, 0x48, 0xf5, 0xf1, 0x23, 0xc8, 0x95, 0xad, 0x68, 0x76, 0x83, + 0x53, 0x8e, 0xb1, 0xd6, 0xd2, 0xee, 0x1e, 0x11, 0x04, 0xe8, 0xdc, 0x41, 0xa6, 0xa8, 0xec, 0xef, 0x91, 0xee, 0x5e, 0xa6, 0x44, 0x29, 0xac, 0x16, 0xfa, 0x7b, 0x0c, 0x3c, 0x0e, 0x81, 0xce, 0xdf, + 0x69, 0x52, 0x57, 0x6d, 0x94, 0xc9, 0xe4, 0xeb, 0x54, 0x6b, 0x20, 0x4b, 0xd5, 0xe2, 0xe3, 0x37, 0xa9, 0x56, 0xb1, 0x84, 0xf2, 0xef, 0xa0, 0x5b, 0x43, 0x67, 0x2e, 0x78, 0x71, 0x40, 0x58, 0x3b, + 0xf2, 0x9c, 0x43, 0x70, 0xf6, 0x35, 0x02, 0xdc, 0xd3, 0x70, 0xed, 0x20, 0xa3, 0xdc, 0x5d, 0xda, 0x8f, 0x76, 0xe9, 0x7d, 0x4c, 0x7a, 0x0a, 0x85, 0x56, 0xc8, 0xb2, 0xea, 0x22, 0x49, 0x82, 0x1a, + 0xca, 0x47, 0xda, 0x56, 0x5f, 0xe6, 0xfa, 0x47, 0x8b, 0x22, 0x41, 0xd6, 0x47, 0x39, 0x53, 0x91, 0xc9, 0x88, 0x7e, 0x55, 0x8e, 0x37, 0x85, 0x8d, 0xbb, 0x23, 0xcb, 0x43, 0x95, 0x49, 0xf6, 0x79, + 0x8f, 0x9f, 0xe3, 0x1c, 0x26, 0x44, 0xa9, 0x6f, 0x41, 0x19, 0x21, 0x82, 0x12, 0x67, 0x7d, 0xb0, 0xab, 0x36, 0x4c, 0x47, 0x4b, 0x37, 0xe7, 0xd4, 0xa2, 0xe8, 0x1e, 0xea, 0x63, 0xce, 0xfc, 0x9e, + 0xcb, 0x8c, 0x9f, 0xaa, 0xa6, 0x76, 0x28, 0x7a, 0xee, 0x08, 0xe3, 0x8b, 0xd1, 0xb3, 0x84, 0xf3, 0x3b, 0x3b, 0xdb, 0x2d, 0xdf, 0x7f, 0xb9, 0xdb, 0x80, 0x55, 0x36, 0x17, 0xb3, 0xac, 0xdc, 0x15, + 0x68, 0xfd, 0x98, 0x83, 0xc6, 0x9e, 0xcf, 0x3e, 0x68, 0x0d, 0xe9, 0x41, 0x50, 0xc8, 0xed, 0x03, 0x02, 0x18, 0x8a, 0x55, 0xca, 0x92, 0xe2, 0x02, 0xf0, 0xb0, 0x36, 0x6d, 0xf1, 0xb4, 0x8b, 0xa2, + 0x7d, 0x68, 0xb8, 0x13, 0xf9, 0x9f, 0x17, 0x49, 0x8d, 0x33, 0xd8, 0xe3, 0xee, 0x2b, 0x29, 0x9e, 0x54, 0x2f, 0x2c, 0xbf, 0x99, 0x5e, 0x1f, 0x82, 0x28, 0x85, 0xaa, 0x0d, 0x7e, 0x06, 0xf1, 0x8e, + 0x73, 0xee, 0x67, 0xcd, 0xaf, 0xf1, 0x54, 0xa8, 0xcb, 0xa0, 0xbc, 0x2d, 0x99, 0xb3, 0xef, 0x59, 0xbf, 0x37, 0x60, 0x64, 0x47, 0x01, 0x34, 0x6f, 0x69, 0xbe, 0xe7, 0x69, 0x5e, 0x03, 0xc6, 0xf3, + 0x72, 0x80, 0xd3, 0xc5, 0xe2, 0x90, 0xc5, 0x44, 0xdb, 0x0f, 0x0c, 0xa6, 0xaf, 0x07, 0xc1, 0x8b, 0x7f, 0xfe, 0x08, 0x2a, 0x5b, 0xe5, 0x9f, 0x64, 0x9c, 0xd7, 0x5a, 0x1f, 0xd3, 0x37, 0xb1, 0x84, + 0xe6, 0x5d, 0xc7, 0x74, 0x49, 0x5e, 0xfc, 0xf3, 0xc7, 0x69, 0xb6, 0xea, 0xfb, 0xbe, 0xf7, 0x75, 0x45, 0xea, 0x67, 0x4a, 0xba, 0x02, 0x53, 0x51, 0xd8, 0x95, 0xb8, 0x9b, 0x6e, 0x7f, 0xa5, 0xb0, + 0x33, 0x45, 0xdd, 0xa3, 0x14, 0x74, 0x65, 0xc7, 0xb1, 0x7b, 0x6e, 0xd5, 0xdc, 0x6b, 0xef, 0x26, 0x54, 0x65, 0x89, 0x76, 0x77, 0xa5, 0xbb, 0x55, 0x98, 0x32, 0x20, 0x28, 0xc1, 0xc3, 0xf9, 0x9a, + 0xcd, 0xdd, 0x38, 0x6d, 0xef, 0x3c, 0xd8, 0x6b, 0xaa, 0xe0, 0x63, 0x05, 0x5d, 0x10, 0x55, 0x31, 0xc2, 0x8b, 0x9f, 0x9f, 0x3c, 0x3f, 0x54, 0x55, 0xd6, 0x48, 0x2c, 0xae, 0x5c, 0xdd, 0x44, 0x77, + 0x8f, 0xd4, 0xc7, 0xa4, 0xd3, 0x10, 0x49, 0x00, 0x0d, 0xe8, 0x31, 0x68, 0x75, 0x09, 0xd3, 0x12, 0x31, 0xc4, 0xce, 0x1a, 0x0f, 0x70, 0xf6, 0x8a, 0x9d, 0xff, 0x86, 0xd8, 0x2f, 0x7d, 0xa8, 0xd2, + 0x34, 0x86, 0x59, 0xa6, 0x81, 0xbb, 0x6b, 0xef, 0x56, 0x21, 0xb5, 0x16, 0x08, 0xfb, 0x68, 0x7e, 0x13, 0x49, 0xcb, 0x8b, 0x1e, 0x17, 0x85, 0xdc, 0x6c, 0xd3, 0xde, 0x67, 0x32, 0xae, 0x34, 0x49, + 0x92, 0xfc, 0xfa, 0xdc, 0xc9, 0xaa, 0x8b, 0x48, 0xf2, 0xcf, 0x1b, 0x2a, 0x04, 0xcc, 0xb6, 0x20, 0xb1, 0xd9, 0xc2, 0x88, 0xd7, 0xda, 0x95, 0x92, 0x6b, 0xbe, 0xb6, 0x22, 0x93, 0xf0, 0x39, 0xeb, + 0xcb, 0x49, 0xb0, 0x83, 0x69, 0xc7, 0xb9, 0x31, 0xc8, 0xe6, 0x01, 0x09, 0x41, 0xdf, 0xde, 0xe3, 0xd7, 0xa2, 0x70, 0x6d, 0x6c, 0x7e, 0x4a, 0x58, 0x62, 0xa7, 0xb2, 0x85, 0x5b, 0xd7, 0xfd, 0xd7, + 0x39, 0x78, 0xd7, 0x92, 0x55, 0x7f, 0xb7, 0x32, 0x1f, 0x93, 0xcd, 0xa8, 0xf9, 0x84, 0x4b, 0x8a, 0x15, 0x53, 0x34, 0x2e, 0xa6, 0xec, 0xf9, 0x41, 0x63, 0xbe, 0xa6, 0x4a, 0xb3, 0x05, 0xa2, 0x46, + 0xa1, 0xd0, 0x84, 0x6a, 0xba, 0x6b, 0x0f, 0xa6, 0xd7, 0xd4, 0x9a, 0xae, 0x52, 0x0d, 0x04, 0xa2, 0x84, 0x12, 0x5e, 0x14, 0x34, 0xfb, 0x18, 0xe7, 0xf6, 0xa3, 0xb4, 0x14, 0xc9, 0x8d, 0xab, 0x84, + 0xb9, 0x6f, 0x78, 0x0c, 0xb1, 0xc0, 0xdd, 0x27, 0x5b, 0x16, 0xce, 0x84, 0xa6, 0x72, 0x0c, 0xbd, 0x67, 0xa1, 0x4e, 0xc4, 0xdb, 0xea, 0x69, 0x15, 0x21, 0x97, 0xb3, 0x30, 0xf3, 0x6d, 0x8c, 0xdf, + 0x6c, 0x57, 0xe7, 0xa3, 0x5f, 0x0c, 0x28, 0xef, 0xd7, 0xab, 0xd0, 0xde, 0x6b, 0xfb, 0x1d, 0x68, 0x96, 0x48, 0xfc, 0xdd, 0x2b, 0xed, 0xbf, 0x5f, 0xf9, 0x78, 0x07, 0x0a, 0x9e, 0xbf, 0x7d, 0x93, + 0xbd, 0x57, 0xc4, 0x3c, 0xce, 0x9d, 0x76, 0x89, 0xaf, 0x7a, 0xad, 0x5d, 0xe0, 0x3b, 0x38, 0x02, 0x2c, 0x51, 0x1f, 0x9e, 0x3b, 0x7e, 0xe9, 0x94, 0x83, 0x08, 0xf3, 0x7b, 0xf4, 0x2b, 0x29, 0xd6, + 0x2c, 0xa6, 0x40, 0xc0, 0xcf, 0x6f, 0x6a, 0xd9, 0xbf, 0x69, 0xec, 0xc3, 0x86, 0x98, 0xfb, 0x13, 0x49, 0xb5, 0x64, 0x74, 0x6d, 0xad, 0x64, 0x78, 0x36, 0x06, 0x22, 0x17, 0x6e, 0x54, 0xb7, 0x61, + 0x49, 0xe2, 0xd9, 0x3b, 0x00, 0x3b, 0x8e, 0x9e, 0x09, 0xbd, 0x2c, 0x74, 0x83, 0x71, 0x91, 0x0b, 0x1e, 0xe4, 0xcf, 0xf6, 0x26, 0x89, 0x09, 0xae, 0x42, 0x67, 0x2f, 0xc3, 0xf3, 0x93, 0xfb, 0xb3, + 0xf1, 0xc5, 0xe8, 0x7e, 0x30, 0x79, 0x35, 0x2d, 0xaa, 0xe6, 0xe1, 0xe5, 0xc5, 0xe9, 0xf8, 0x15, 0x34, 0x9f, 0xfa, 0x5e, 0x6d, 0x5c, 0x5a, 0x83, 0xf6, 0xbc, 0xdb, 0xc9, 0xe0, 0xea, 0x6a, 0x34, + 0xb9, 0x3f, 0x1b, 0xdc, 0x5c, 0x0c, 0x5f, 0x8f, 0x26, 0x7d, 0x21, 0x17, 0xf9, 0xf4, 0xc8, 0x8e, 0x92, 0xf2, 0x10, 0x51, 0x2d, 0x73, 0xce, 0x09, 0xe3, 0xc8, 0xb5, 0x5a, 0xd2, 0x24, 0xb1, 0xb3, + 0x75, 0x17, 0x8b, 0xfa, 0xd3, 0xe1, 0x8b, 0x67, 0x3f, 0xfd, 0x08, 0x0d, 0x33, 0x55, 0x31, 0x5c, 0x7a, 0x48, 0x72, 0xf5, 0x86, 0xed, 0xce, 0x83, 0xaa, 0x99, 0x56, 0x9f, 0x4f, 0x46, 0x2f, 0x6f, + 0x5e, 0x95, 0xab, 0x81, 0x29, 0xe4, 0x8d, 0x26, 0xfe, 0x7e, 0x46, 0x7d, 0x4f, 0xa4, 0x3d, 0xcb, 0x0f, 0x4e, 0x2c, 0x2b, 0xab, 0x2c, 0xd1, 0xec, 0x5c, 0xc4, 0x59, 0x42, 0xaf, 0xec, 0xb4, 0xf4, + 0x24, 0xbf, 0x82, 0x2a, 0x46, 0xce, 0x75, 0xfc, 0x9f, 0x1c, 0xb5, 0x7f, 0xee, 0xca, 0xe9, 0x13, 0xd4, 0xe5, 0xec, 0x37, 0xff, 0xdb, 0xf7, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x8b, 0x2b, 0xc6, 0x07, 0x61, 0x0e, 0x00, 0x00, 0x19, 0x2c, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, + 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x59, 0x7d, 0x6f, 0xda, 0x48, 0xb7, 0xff, 0xfb, 0xf1, 0xa7, 0x38, 0x8f, 0xb5, 0xde, 0x24, 0x2b, 0x70, 0xda, 0x5c, 0xb5, 0xba, 0xa2, 0xf2, 0x55, + 0x1d, 0x70, 0x1a, 0xba, 0x09, 0x20, 0x4c, 0x92, 0xae, 0xb6, 0x7b, 0xd1, 0x60, 0x1f, 0x60, 0x1a, 0x7b, 0xc6, 0x3b, 0x33, 0x40, 0xb8, 0x57, 0xfb, 0xdd, 0x1f, 0xcd, 0x8b, 0xc1, 0xe4, 0xa5, 0xed, + 0x4a, 0xbb, 0xd2, 0xf6, 0x8f, 0x02, 0x33, 0xe7, 0xfd, 0xfc, 0xe6, 0xcc, 0x99, 0x93, 0xf7, 0xe3, 0xe4, 0x1a, 0xda, 0x7f, 0xe1, 0x3f, 0xcf, 0x48, 0xbc, 0xa2, 0x19, 0x32, 0x89, 0x39, 0x28, 0x0e, + 0x6a, 0x89, 0x10, 0x57, 0x24, 0x5b, 0x22, 0xa4, 0x7c, 0xae, 0x36, 0x44, 0x20, 0x5c, 0xf0, 0x15, 0xcb, 0x89, 0xa2, 0x9c, 0xc1, 0x71, 0x9c, 0x5e, 0x9c, 0xc0, 0x8a, 0xe5, 0x28, 0x80, 0x33, 0xb4, + 0xfc, 0x5c, 0x40, 0xc9, 0x05, 0x42, 0xc6, 0x99, 0x12, 0x74, 0xb6, 0x52, 0x5c, 0x40, 0x61, 0x65, 0x02, 0x59, 0x08, 0xc4, 0x12, 0x99, 0x92, 0x21, 0x40, 0x8a, 0x68, 0x14, 0x0c, 0x86, 0x93, 0x7e, + 0x37, 0x81, 0x39, 0x2d, 0x9c, 0x84, 0x9c, 0x4a, 0xcb, 0x89, 0x39, 0x6c, 0xa8, 0x5a, 0x82, 0x5a, 0x52, 0x09, 0x1b, 0x2e, 0xee, 0x61, 0xce, 0x05, 0x90, 0x3c, 0xa7, 0x5a, 0x3d, 0x29, 0x80, 0xb2, + 0x39, 0x17, 0xa5, 0x31, 0xc6, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x53, 0xb6, 0x80, 0x8c, 0x57, 0x5b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xc3, 0x50, 0xc8, 0x25, 0xad, 0x42, 0x80, 0x89, 0x76, 0x28, 0xbd, + 0xa8, 0x0d, 0x92, 0x56, 0xf4, 0x5e, 0xb5, 0xe2, 0xb0, 0xe5, 0x2b, 0xe7, 0x52, 0xc3, 0x7b, 0x17, 0x94, 0x16, 0xdc, 0xa2, 0x90, 0xda, 0xf5, 0xb3, 0xf0, 0x15, 0x1c, 0xab, 0xa5, 0x63, 0xf3, 0xdd, + 0xbe, 0x7f, 0xf2, 0xce, 0xf0, 0x97, 0x64, 0x0b, 0x8c, 0x2b, 0x58, 0x49, 0xdc, 0x6b, 0x00, 0x7c, 0xc8, 0xb0, 0x52, 0x40, 0x19, 0x64, 0xbc, 0xac, 0x0a, 0x4a, 0x58, 0xe6, 0xf8, 0x9d, 0x97, 0x3b, + 0x3d, 0x21, 0xc0, 0x2f, 0x4e, 0x0c, 0x9f, 0x29, 0x42, 0x19, 0x10, 0xe3, 0x10, 0xf0, 0x79, 0x93, 0x0c, 0x88, 0x32, 0xfc, 0x56, 0x08, 0x00, 0x2c, 0x95, 0xaa, 0x3a, 0xa7, 0xa7, 0x9b, 0xcd, 0x26, + 0x24, 0xc6, 0xf0, 0x90, 0x8b, 0xc5, 0x69, 0xed, 0xec, 0xe9, 0x55, 0xbf, 0x9b, 0x0c, 0xd2, 0xa4, 0x7d, 0x16, 0xbe, 0x6a, 0xf0, 0xdd, 0xb0, 0x02, 0xa5, 0x04, 0x81, 0xbf, 0xaf, 0xa8, 0xc0, 0x1c, + 0x66, 0x5b, 0x20, 0x55, 0x55, 0xd0, 0x8c, 0xcc, 0x0a, 0x84, 0x82, 0x6c, 0x74, 0x4a, 0x4d, 0xe6, 0x0c, 0x26, 0x28, 0x83, 0x8d, 0xa0, 0x8a, 0xb2, 0x45, 0xcb, 0xf2, 0xcb, 0x1a, 0x19, 0xcd, 0xbc, + 0xed, 0x23, 0x58, 0xdb, 0x4a, 0xe5, 0x01, 0x01, 0x67, 0x40, 0x5c, 0xd2, 0xfc, 0x38, 0x85, 0x7e, 0xea, 0xc3, 0x79, 0x9c, 0xf6, 0xd3, 0x16, 0xdc, 0xf5, 0x27, 0x97, 0xc3, 0x9b, 0x09, 0xdc, 0xc5, + 0xe3, 0x71, 0x3c, 0x98, 0xf4, 0x93, 0x14, 0x86, 0x63, 0xe8, 0x0e, 0x07, 0xbd, 0xfe, 0xa4, 0x3f, 0x1c, 0xa4, 0x30, 0xbc, 0x80, 0x78, 0xf0, 0x8b, 0xe5, 0xfd, 0xb9, 0x3f, 0xe8, 0xb5, 0x00, 0xa9, + 0x5a, 0xa2, 0x00, 0x7c, 0xa8, 0x84, 0x76, 0x85, 0x0b, 0xa0, 0x3a, 0xc0, 0x98, 0x37, 0x60, 0x56, 0xdb, 0xa1, 0x21, 0xb4, 0x4b, 0x9c, 0xac, 0x30, 0xa3, 0x73, 0x9a, 0x41, 0x41, 0xd8, 0x62, 0x45, + 0x16, 0x08, 0x0b, 0xbe, 0x46, 0xc1, 0x34, 0x82, 0x2a, 0x14, 0x25, 0x95, 0x3a, 0xdb, 0x12, 0x08, 0xcb, 0xa1, 0xa0, 0x25, 0x55, 0x06, 0x6b, 0xd2, 0x32, 0x3f, 0xf1, 0x31, 0xf4, 0xfe, 0xfa, 0x33, + 0xf9, 0x37, 0x88, 0x34, 0x12, 0x1d, 0xb0, 0xaf, 0xc9, 0x1a, 0x19, 0xdc, 0x09, 0x52, 0x55, 0x28, 0x40, 0x2a, 0x22, 0xd4, 0xaa, 0x82, 0x19, 0x51, 0xd9, 0x12, 0x64, 0x26, 0x68, 0xa5, 0x5a, 0xb0, + 0x76, 0x98, 0xff, 0xaf, 0xf0, 0x10, 0x38, 0xe3, 0x1a, 0x31, 0xc9, 0xe0, 0x16, 0xd6, 0x44, 0xc8, 0x8e, 0x5d, 0xff, 0x18, 0xdf, 0xc6, 0xd3, 0xcb, 0xe1, 0x75, 0x02, 0x6d, 0x28, 0x78, 0x66, 0x6b, + 0x05, 0x9f, 0x03, 0x81, 0x8f, 0xbd, 0x9f, 0x61, 0xc9, 0x4b, 0x0d, 0x15, 0xd1, 0x10, 0x34, 0xac, 0xdc, 0x79, 0xae, 0x05, 0xd9, 0xe5, 0xeb, 0xf8, 0x36, 0x19, 0x4c, 0xcf, 0xe3, 0x49, 0xf7, 0x72, + 0x9a, 0x74, 0x2f, 0x87, 0xd0, 0x06, 0x89, 0x4a, 0x63, 0xf0, 0x88, 0xb3, 0x23, 0xfd, 0x89, 0xcc, 0x60, 0x54, 0xa7, 0x00, 0xb3, 0x25, 0xd7, 0x59, 0x73, 0x27, 0xc4, 0x7a, 0x90, 0xf1, 0xb2, 0x24, + 0x2c, 0x7f, 0x46, 0xde, 0x28, 0xbe, 0x49, 0x93, 0xa7, 0x02, 0x37, 0x84, 0x2a, 0x5b, 0x64, 0xe0, 0x1e, 0xb7, 0x52, 0x09, 0x7e, 0x8f, 0x30, 0xc3, 0xb9, 0x2e, 0x68, 0xc8, 0x74, 0x61, 0x69, 0x8a, + 0x1a, 0x8e, 0x26, 0x29, 0xb4, 0xa1, 0x22, 0x82, 0x94, 0xa8, 0x50, 0x48, 0xa8, 0x88, 0x6c, 0x94, 0xce, 0x8f, 0x64, 0x4d, 0xe0, 0xf6, 0x1a, 0x36, 0x4b, 0x64, 0x20, 0x56, 0xcc, 0xc0, 0xca, 0x44, + 0x7c, 0x77, 0x62, 0x01, 0xc3, 0x45, 0xa8, 0xe9, 0x73, 0x9c, 0xad, 0xdc, 0x26, 0x50, 0x25, 0xb1, 0x98, 0xb7, 0x74, 0xf9, 0x70, 0x30, 0x45, 0xd5, 0x50, 0x19, 0xb5, 0x3f, 0x59, 0xea, 0xf6, 0x27, + 0xb1, 0x62, 0x5f, 0xf2, 0x4d, 0xd5, 0x51, 0x82, 0x30, 0x59, 0x71, 0xa1, 0xa2, 0x5c, 0x4d, 0x25, 0xcf, 0xee, 0x51, 0xb5, 0x24, 0x8a, 0x35, 0x8a, 0x68, 0xdb, 0x92, 0x2b, 0x59, 0x21, 0xcb, 0xa3, + 0x6d, 0x8b, 0xe4, 0xb9, 0x3e, 0x20, 0xd1, 0x7f, 0xbf, 0x7a, 0xf5, 0xaa, 0xe9, 0x48, 0xfa, 0x73, 0x7f, 0x34, 0x1d, 0x77, 0xa1, 0x0d, 0xf3, 0x82, 0x2c, 0x8c, 0x39, 0x54, 0xda, 0xe3, 0xcf, 0x49, + 0xee, 0xc2, 0x5a, 0x6a, 0xdb, 0x44, 0x66, 0x6a, 0x99, 0xfc, 0x1b, 0x60, 0x69, 0x45, 0x9e, 0xe3, 0x42, 0x97, 0xbb, 0xa2, 0x00, 0xfd, 0xab, 0xa0, 0x0c, 0xa5, 0x2d, 0x8f, 0x47, 0xef, 0x8f, 0x4c, + 0xe9, 0x24, 0x12, 0x9f, 0x22, 0x83, 0x4a, 0x93, 0x42, 0xef, 0xbd, 0x86, 0x01, 0xf0, 0xf9, 0x7c, 0x1f, 0x37, 0x45, 0x55, 0x81, 0xda, 0x7e, 0x07, 0x06, 0xd8, 0x50, 0x96, 0xf3, 0x8d, 0x67, 0xd7, + 0x03, 0x17, 0x07, 0x87, 0xa4, 0x1a, 0x45, 0xb3, 0xad, 0xe6, 0x55, 0x26, 0x5f, 0x8f, 0x75, 0x39, 0xb8, 0x78, 0xef, 0xe9, 0x1c, 0xfc, 0xe0, 0xf1, 0x76, 0xe0, 0x43, 0x14, 0x81, 0xcf, 0x99, 0x0f, + 0x46, 0x1a, 0x3c, 0xa5, 0xf0, 0xf6, 0xc6, 0x05, 0xfa, 0x98, 0x04, 0x06, 0xca, 0xbf, 0xaf, 0xe8, 0x9a, 0x14, 0xc8, 0x94, 0xb6, 0xf5, 0x07, 0xbd, 0xee, 0x19, 0x05, 0x86, 0xc2, 0x0a, 0xf5, 0xe1, + 0x58, 0x33, 0xf9, 0x7a, 0x29, 0x32, 0x1b, 0xbd, 0x71, 0xff, 0x36, 0x09, 0xcc, 0xd7, 0x51, 0x3c, 0xb9, 0x0c, 0xfc, 0x13, 0x27, 0x3c, 0x79, 0xc0, 0x6c, 0xa5, 0x10, 0x88, 0x06, 0x91, 0x80, 0x1c, + 0xe7, 0x94, 0x61, 0xee, 0x8e, 0x74, 0x8d, 0x68, 0x73, 0x35, 0xe9, 0x8b, 0x9b, 0xce, 0xcd, 0x75, 0x55, 0x7b, 0xe3, 0xe0, 0xb0, 0xd3, 0xba, 0xe0, 0x8a, 0x83, 0xbc, 0xa7, 0xd5, 0x38, 0x1b, 0x09, + 0x07, 0xc9, 0x6c, 0x89, 0x99, 0xbd, 0x8f, 0x2b, 0x81, 0xbb, 0x52, 0xc1, 0x59, 0x86, 0x36, 0x5d, 0x05, 0x2e, 0x48, 0xb6, 0x85, 0x70, 0x46, 0x94, 0x3b, 0x39, 0xa6, 0x88, 0xee, 0x09, 0xc2, 0xac, + 0xcc, 0xeb, 0x33, 0x45, 0xe7, 0x80, 0x0f, 0x54, 0x6a, 0x0b, 0x6e, 0xd2, 0x64, 0x3c, 0x1a, 0x0f, 0x2f, 0xfa, 0x57, 0x49, 0xf0, 0xd9, 0x41, 0x6e, 0x5a, 0x09, 0xd4, 0x82, 0x7c, 0xc8, 0x34, 0x30, + 0xbe, 0x45, 0x14, 0xfc, 0xf4, 0x5d, 0x02, 0xb3, 0x32, 0xff, 0xb6, 0x40, 0x43, 0x14, 0xfc, 0xe4, 0x75, 0xf6, 0xee, 0x7b, 0xef, 0x25, 0x2a, 0x5d, 0xd7, 0x0a, 0xcf, 0xd3, 0xe9, 0x48, 0xc6, 0xe3, + 0xe1, 0x78, 0xda, 0x1d, 0xf6, 0x92, 0xe8, 0x95, 0x8b, 0xfe, 0x84, 0x03, 0x95, 0xbc, 0x20, 0x0a, 0x81, 0x32, 0x85, 0x42, 0xd7, 0xb6, 0x35, 0x11, 0x54, 0x63, 0x4c, 0xc2, 0x5c, 0xf0, 0x12, 0x2a, + 0x2e, 0x25, 0xd5, 0x90, 0xab, 0xb8, 0x54, 0x2e, 0x7e, 0xb2, 0x05, 0x1b, 0x34, 0x4d, 0x03, 0x61, 0xdc, 0xdc, 0x68, 0x3b, 0x4d, 0x0d, 0x9d, 0x46, 0x43, 0x14, 0x45, 0x11, 0xa4, 0x93, 0x78, 0x3c, + 0x81, 0xdb, 0xf8, 0xaa, 0xdf, 0x8b, 0xf5, 0xd5, 0x68, 0x56, 0xf7, 0xc9, 0xdc, 0xd5, 0xe1, 0xc3, 0x44, 0x0e, 0xef, 0x3f, 0x5e, 0xf2, 0x12, 0x3d, 0x4f, 0xc3, 0x33, 0x34, 0xff, 0x43, 0x22, 0x04, + 0x17, 0x9d, 0x46, 0xe5, 0xd6, 0x12, 0xe6, 0xba, 0xd3, 0xd3, 0x67, 0x6e, 0xcb, 0x57, 0x02, 0x90, 0xad, 0xa9, 0xe0, 0x4c, 0x77, 0x6f, 0x21, 0xfc, 0xcf, 0x8f, 0x67, 0x96, 0x71, 0x54, 0xa0, 0x3e, + 0x90, 0xe6, 0xa0, 0xe9, 0x8a, 0xb7, 0x13, 0x50, 0xbb, 0xfb, 0x1c, 0xbf, 0xc6, 0x7b, 0x69, 0x0a, 0xb4, 0xe6, 0xd9, 0xc9, 0x6a, 0xde, 0x15, 0x86, 0xc5, 0xd4, 0x4f, 0xca, 0xa4, 0x22, 0x45, 0x61, + 0x76, 0xf6, 0x8a, 0x43, 0xcf, 0xf8, 0x82, 0xda, 0x6e, 0xcf, 0xeb, 0xd4, 0x3e, 0x35, 0xf2, 0xbe, 0xf7, 0xfe, 0xf3, 0x8c, 0xb2, 0xcf, 0x5f, 0xc8, 0x9a, 0x84, 0xf8, 0x80, 0x2e, 0x08, 0x94, 0x51, + 0xf5, 0xf5, 0x08, 0x50, 0x59, 0x5f, 0x0e, 0x84, 0x01, 0x65, 0x6b, 0x52, 0xd0, 0x5c, 0xdf, 0x5b, 0x98, 0x29, 0x2e, 0xb6, 0x8d, 0x10, 0xec, 0x59, 0xa2, 0x47, 0x41, 0xff, 0x87, 0x45, 0x69, 0x0f, + 0x9c, 0x64, 0xd0, 0x7b, 0x02, 0x1b, 0xaf, 0x63, 0x63, 0x62, 0xa8, 0x2e, 0x28, 0xcb, 0x8d, 0xda, 0x4a, 0xf0, 0x2f, 0x98, 0x29, 0x98, 0x69, 0xfb, 0x73, 0x2a, 0x5a, 0x40, 0x43, 0x0c, 0xcd, 0xd6, + 0x2e, 0x16, 0xa0, 0x96, 0x44, 0x99, 0x7e, 0x9f, 0x50, 0x26, 0xcd, 0xde, 0x9c, 0x17, 0xba, 0x37, 0xf2, 0xc3, 0x72, 0xcd, 0x7c, 0xd7, 0x16, 0x5d, 0x90, 0xa2, 0x98, 0x91, 0xec, 0x5e, 0xfb, 0x95, + 0xad, 0x84, 0xd0, 0x2e, 0xea, 0xa6, 0x5e, 0x97, 0x86, 0xbd, 0x2c, 0x87, 0x5e, 0x83, 0xbd, 0xd0, 0x1e, 0x30, 0x5b, 0x94, 0x46, 0xe3, 0xe1, 0xc7, 0xa4, 0x3b, 0x39, 0x8f, 0xd3, 0xa4, 0xd7, 0x1f, + 0x47, 0xbb, 0xb2, 0x6a, 0x7e, 0x06, 0x5e, 0xff, 0x42, 0x3f, 0x24, 0x76, 0x25, 0xec, 0x90, 0x3a, 0xf0, 0xa3, 0xa8, 0x86, 0x3f, 0xb2, 0xbc, 0x87, 0x0a, 0x33, 0x75, 0x4e, 0x24, 0xf6, 0xa8, 0x70, + 0x87, 0xf8, 0x53, 0xd2, 0x9d, 0x1a, 0xb9, 0xdd, 0x5e, 0x60, 0x56, 0xee, 0xcc, 0xaf, 0x7a, 0x3d, 0xf0, 0x3a, 0x73, 0xca, 0xf2, 0x9a, 0xa7, 0x7f, 0x01, 0xc9, 0xa7, 0x7e, 0xaa, 0xf5, 0xdd, 0x19, + 0xf9, 0x9f, 0xb5, 0xa7, 0x56, 0xc1, 0xcc, 0xd2, 0x98, 0x77, 0x92, 0x97, 0xe5, 0x10, 0x86, 0x9a, 0xbc, 0x26, 0x8c, 0x22, 0x5f, 0xab, 0xf0, 0x0f, 0x68, 0x07, 0x5c, 0x59, 0xf2, 0xbd, 0x62, 0x6d, + 0x86, 0x21, 0x69, 0xaa, 0xf5, 0x3a, 0x07, 0xc2, 0x5f, 0x0e, 0x8e, 0xd1, 0xa5, 0x95, 0xfb, 0x7b, 0x0f, 0x7c, 0xef, 0x05, 0xff, 0x3b, 0xcf, 0x59, 0xf1, 0xbc, 0xdc, 0x7d, 0x38, 0x1e, 0xcb, 0xf6, + 0x3a, 0x4f, 0x05, 0xbb, 0x9c, 0xd4, 0x91, 0x7a, 0x36, 0x33, 0x26, 0x70, 0x9f, 0xbf, 0xac, 0xcb, 0x30, 0xe3, 0x6c, 0x4e, 0x17, 0xfb, 0x2c, 0x8d, 0x91, 0xe4, 0xf1, 0xee, 0xad, 0xd7, 0x35, 0xbb, + 0x8d, 0xe2, 0x0b, 0x89, 0xb9, 0xb2, 0x93, 0x07, 0x85, 0xcc, 0x36, 0xe9, 0x76, 0xa1, 0x87, 0x05, 0xd9, 0x62, 0x9e, 0x3c, 0x54, 0xc4, 0xac, 0x7b, 0xfa, 0x8e, 0x3a, 0xbd, 0x00, 0x7f, 0x25, 0x51, + 0xc3, 0xef, 0x77, 0xc8, 0xb1, 0xa0, 0xa5, 0x8c, 0x7c, 0x08, 0x02, 0x7d, 0x70, 0xe0, 0xf8, 0x7b, 0x4d, 0x3b, 0x81, 0x9c, 0x9b, 0x43, 0xfc, 0xf1, 0xf6, 0x7a, 0xda, 0x1d, 0x0e, 0x2e, 0xfa, 0x1f, + 0xa6, 0x3b, 0xce, 0x51, 0x1a, 0xfd, 0xfb, 0xf9, 0xf5, 0x7f, 0x6b, 0x45, 0xde, 0x7b, 0x64, 0xb9, 0x35, 0xfc, 0xc7, 0xaf, 0xc9, 0x08, 0x9e, 0x5f, 0x0f, 0x6c, 0x80, 0x9f, 0x8f, 0x49, 0x9a, 0x4c, + 0x5c, 0xbe, 0x4c, 0x65, 0x49, 0x3e, 0x25, 0xd1, 0xcb, 0xf5, 0xcf, 0x62, 0x6c, 0x1c, 0x8f, 0x46, 0xc9, 0x78, 0xfa, 0x31, 0x1e, 0x47, 0x5f, 0xf5, 0x7e, 0x63, 0x5f, 0x06, 0xf6, 0x4e, 0x6c, 0xbb, + 0x5f, 0xe1, 0x17, 0x22, 0x0e, 0xe5, 0x5c, 0xc5, 0x37, 0x83, 0xee, 0x65, 0x32, 0x8e, 0xb8, 0x58, 0xd4, 0x4f, 0x4f, 0xc3, 0x12, 0xd6, 0x2c, 0xa6, 0xb3, 0x75, 0xef, 0x8c, 0x6b, 0x42, 0x99, 0x77, + 0xc0, 0x7f, 0x33, 0xbe, 0x8a, 0x7c, 0xfd, 0x7a, 0x95, 0x9d, 0xd3, 0x53, 0x81, 0x15, 0x77, 0xdc, 0x8d, 0x57, 0xac, 0x59, 0x38, 0x3b, 0xd5, 0x5f, 0xed, 0xaa, 0x5d, 0x39, 0x75, 0x0a, 0x4e, 0x0f, + 0x2c, 0x3c, 0x35, 0x6f, 0x95, 0xc3, 0xb5, 0xb6, 0x59, 0xb3, 0xb6, 0x7b, 0x17, 0xc3, 0xf1, 0x21, 0x28, 0x14, 0xbf, 0x47, 0x26, 0xa3, 0xd7, 0xad, 0xb3, 0x1a, 0x1f, 0x06, 0x20, 0x31, 0xf4, 0x07, + 0xdf, 0x00, 0xc8, 0xf3, 0x21, 0xaa, 0x04, 0xaf, 0x50, 0x28, 0x8a, 0xd2, 0x3f, 0x81, 0xde, 0x10, 0x8e, 0x3d, 0xdd, 0xed, 0x9b, 0x42, 0x10, 0xc4, 0xba, 0x0a, 0x38, 0xc2, 0x1b, 0x51, 0xf8, 0xa0, + 0x13, 0xd8, 0x0c, 0x45, 0x10, 0x9c, 0x7b, 0xfb, 0x4e, 0xce, 0x01, 0xdc, 0x5c, 0x45, 0x45, 0xc1, 0x37, 0x40, 0x56, 0x8a, 0x97, 0x44, 0x51, 0xdd, 0xbc, 0x6c, 0x21, 0xe7, 0x1b, 0x56, 0xb7, 0xe9, + 0xba, 0xf6, 0x3e, 0x49, 0x95, 0x6d, 0x38, 0x4c, 0x02, 0xda, 0x19, 0x32, 0x25, 0x74, 0x3f, 0x61, 0xda, 0x14, 0xdd, 0xff, 0x19, 0x91, 0x12, 0x56, 0xf2, 0x80, 0x1f, 0x1c, 0xbf, 0x3e, 0x1f, 0xee, + 0x0e, 0x90, 0xb6, 0xce, 0x57, 0x82, 0x2f, 0xe9, 0x8c, 0x2a, 0xdb, 0x01, 0x6a, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, 0x5b, 0xc8, 0x89, 0x22, 0xe1, 0xfe, 0x12, 0x0e, 0x1a, 0x30, 0x0b, 0x5c, 0x04, + 0x6c, 0xd3, 0x7c, 0x3b, 0xb8, 0x9b, 0xde, 0x26, 0xe3, 0xf3, 0x61, 0x5a, 0x37, 0x27, 0x4a, 0xac, 0xd0, 0x77, 0x34, 0xe6, 0x5d, 0xa4, 0xef, 0x3a, 0x53, 0x8e, 0x0e, 0xc5, 0x18, 0x82, 0x13, 0xef, + 0x04, 0xb0, 0x90, 0xb8, 0x97, 0xe9, 0xda, 0x57, 0x2d, 0x77, 0x9c, 0x8c, 0x86, 0x37, 0xe3, 0xab, 0x7d, 0xcf, 0xbc, 0x93, 0xf9, 0x38, 0xcc, 0x8f, 0x18, 0xfe, 0x22, 0x6c, 0x59, 0x03, 0xff, 0xb4, + 0xaf, 0x5d, 0xbe, 0x2a, 0x72, 0x76, 0xa4, 0x4c, 0xc1, 0x3f, 0xf4, 0xb9, 0x75, 0x90, 0x63, 0xaa, 0x20, 0x0c, 0xc3, 0x43, 0xe6, 0x5e, 0x63, 0x5f, 0x67, 0xbb, 0xb3, 0x17, 0xa0, 0x3d, 0x73, 0x36, + 0x99, 0x8f, 0x8a, 0x6f, 0x50, 0xc8, 0x25, 0x16, 0x05, 0xb4, 0xbb, 0xee, 0x49, 0xe4, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0x7a, 0xff, 0xfa, 0x97, 0xff, 0xc3, 0x06, 0x67, 0x59, 0x41, 0xf5, 0xd5, 0x1c, + 0x01, 0xc3, 0x4d, 0x9b, 0xcf, 0xcc, 0xf5, 0x9f, 0x6e, 0xa5, 0xc2, 0x32, 0x1c, 0xa0, 0x0a, 0xef, 0x70, 0xd6, 0x35, 0x14, 0xef, 0x2c, 0x0b, 0x9d, 0xc3, 0x71, 0x5b, 0x87, 0xff, 0xf8, 0x57, 0xa9, + 0x04, 0x65, 0x8b, 0xdf, 0x3a, 0x9d, 0xbe, 0x1c, 0xac, 0x8a, 0x62, 0x28, 0x92, 0xb2, 0x52, 0xdb, 0xe3, 0x23, 0x1b, 0x03, 0xdd, 0x63, 0x0f, 0xe2, 0xeb, 0x24, 0x38, 0x3a, 0x81, 0xb6, 0xd6, 0xfa, + 0x0d, 0xfa, 0x51, 0x9c, 0xa6, 0x77, 0xc3, 0x71, 0x2f, 0x38, 0x3a, 0x39, 0x39, 0x81, 0x27, 0x06, 0x86, 0x5d, 0x81, 0x39, 0x32, 0x45, 0x49, 0x21, 0x5f, 0x34, 0x76, 0x80, 0x4a, 0xb7, 0x18, 0x7b, + 0xd2, 0xa7, 0xc6, 0xb4, 0xe0, 0xa9, 0x3e, 0xe7, 0xda, 0x1f, 0xf6, 0xe3, 0x57, 0x2d, 0x29, 0x45, 0xb1, 0xa6, 0x19, 0x8e, 0x38, 0x65, 0xea, 0x9a, 0x30, 0xb2, 0x40, 0xf1, 0x5b, 0xa7, 0x93, 0x62, + 0xb6, 0x12, 0x54, 0x6d, 0x47, 0x82, 0x2b, 0x9e, 0xf1, 0x02, 0x22, 0x70, 0xd4, 0x87, 0xeb, 0x93, 0x6d, 0x85, 0xbf, 0x75, 0x3a, 0x93, 0x42, 0xbe, 0x3e, 0x7b, 0x07, 0x0d, 0x27, 0xea, 0xc4, 0x5d, + 0xd0, 0x02, 0x8f, 0x8f, 0x0e, 0x92, 0x66, 0x2c, 0x6b, 0xc2, 0xe0, 0xe8, 0xa4, 0x36, 0xeb, 0xcf, 0xa3, 0xeb, 0x82, 0x32, 0x2a, 0x97, 0x98, 0x1f, 0x20, 0xe9, 0xd9, 0x83, 0xe5, 0xaa, 0x8e, 0x7e, + 0xab, 0xe9, 0x73, 0xec, 0x8a, 0x8f, 0x2b, 0x46, 0xfd, 0x79, 0x3d, 0x32, 0xc3, 0xbc, 0x05, 0xa6, 0x27, 0xd6, 0x8f, 0x1c, 0x5d, 0x36, 0xd2, 0xcb, 0xb8, 0x7d, 0xf6, 0xe6, 0x2d, 0xc8, 0x55, 0x59, + 0x0f, 0x61, 0xae, 0x0f, 0x2a, 0x89, 0xa9, 0x44, 0xb4, 0x40, 0xaf, 0x79, 0x0c, 0xd3, 0xcb, 0x78, 0x7a, 0xf6, 0xe6, 0xed, 0x34, 0xbd, 0xb9, 0x8e, 0x7c, 0xff, 0x9f, 0x53, 0x96, 0xd3, 0x25, 0x39, + 0x7b, 0xf3, 0x36, 0x5d, 0x95, 0x87, 0xc5, 0xb9, 0x69, 0xae, 0x2d, 0xd2, 0xae, 0xc7, 0x09, 0x9e, 0xa1, 0x08, 0x4c, 0xd3, 0x79, 0xfc, 0x8d, 0x53, 0xe7, 0xb2, 0xe4, 0xff, 0xb0, 0x24, 0x72, 0x09, + 0x11, 0x1c, 0x7f, 0x40, 0xd5, 0xd6, 0x70, 0xb8, 0xd4, 0xbf, 0x3f, 0xfb, 0x07, 0x49, 0xfa, 0xec, 0x43, 0x3b, 0x2e, 0x16, 0x5c, 0x50, 0xb5, 0x2c, 0x75, 0xc8, 0xcf, 0xde, 0xbc, 0x3d, 0x09, 0x35, + 0x65, 0x38, 0xe1, 0x57, 0x5a, 0xc7, 0xb1, 0x01, 0x6f, 0x2d, 0xb4, 0x3f, 0x6f, 0x80, 0xaa, 0x69, 0xda, 0x11, 0xb4, 0x19, 0x82, 0xd1, 0x79, 0xd2, 0xb4, 0x02, 0xe0, 0x4e, 0x50, 0x85, 0xed, 0xe1, + 0x4a, 0x55, 0x2b, 0x05, 0x47, 0xee, 0x59, 0x74, 0x41, 0x68, 0x61, 0xe7, 0x5a, 0xbb, 0x9c, 0x1f, 0x26, 0xd7, 0x65, 0xbf, 0x65, 0x9f, 0x24, 0x87, 0x7b, 0xa5, 0x19, 0xc3, 0xcf, 0xd0, 0x8c, 0xbd, + 0x05, 0x2f, 0xa9, 0xc4, 0x3c, 0x3c, 0x7a, 0xf7, 0x15, 0xad, 0x7d, 0xb6, 0x46, 0xa9, 0xe8, 0x42, 0xeb, 0xe1, 0x42, 0x67, 0x1e, 0x15, 0x3e, 0xba, 0x4e, 0xf4, 0x6d, 0xa8, 0x14, 0x96, 0x95, 0x02, + 0x02, 0x59, 0x81, 0x84, 0xed, 0xb0, 0xfd, 0x0d, 0xe1, 0x73, 0x3b, 0xe3, 0xaf, 0xb4, 0x1b, 0x79, 0xd3, 0x60, 0x37, 0xe8, 0x34, 0x4e, 0x00, 0x73, 0xf3, 0x6e, 0x4b, 0x67, 0xf0, 0xbc, 0x83, 0x3e, + 0x3c, 0x46, 0x09, 0x38, 0x5c, 0x6d, 0x1f, 0xab, 0xc6, 0x07, 0xaa, 0xe0, 0x75, 0x73, 0xed, 0x8f, 0x83, 0xef, 0xf5, 0x49, 0x36, 0x43, 0x84, 0xab, 0xe4, 0x36, 0xb9, 0x82, 0xd7, 0xd0, 0x78, 0xb4, + 0xd5, 0x5d, 0xc0, 0x48, 0xf0, 0x35, 0xcd, 0x11, 0x08, 0xf8, 0x52, 0x11, 0x96, 0x13, 0x91, 0xd3, 0xff, 0xc3, 0xdc, 0x87, 0x0d, 0xd9, 0x6a, 0x2b, 0x05, 0x2a, 0x41, 0x71, 0x6d, 0xed, 0xec, 0x5e, + 0xf5, 0x81, 0x88, 0x85, 0xbb, 0xb0, 0x37, 0xb4, 0x70, 0xf7, 0xbd, 0xf9, 0x13, 0x8a, 0x19, 0xbe, 0xcc, 0xb8, 0x5a, 0xc2, 0x9d, 0x19, 0x84, 0xd9, 0xe1, 0x36, 0xe3, 0xac, 0x5d, 0xff, 0x46, 0x33, + 0x3b, 0xd2, 0x2d, 0x75, 0xd8, 0x78, 0x0a, 0x74, 0xaf, 0x7b, 0xd3, 0xab, 0xfe, 0x20, 0x99, 0xc6, 0xe3, 0x0f, 0x69, 0x14, 0xfc, 0xe4, 0x79, 0xc1, 0x61, 0xcf, 0x19, 0x80, 0x76, 0xec, 0xa5, 0xfe, + 0xd5, 0x6e, 0xee, 0x87, 0x98, 0x07, 0x0b, 0xbd, 0xe4, 0xfc, 0xe6, 0x43, 0x63, 0xb9, 0x9d, 0x15, 0x44, 0xca, 0x8a, 0xa8, 0xe5, 0xa3, 0xa4, 0xeb, 0x4d, 0xbf, 0xdd, 0xb3, 0xcd, 0x61, 0xb9, 0x2a, + 0x14, 0xbd, 0xe6, 0xf9, 0xaa, 0xc0, 0x91, 0x6d, 0x51, 0x7a, 0xf5, 0x33, 0x32, 0x7a, 0xe1, 0x19, 0x68, 0x95, 0x3e, 0xee, 0x5a, 0x83, 0xda, 0x0e, 0x6b, 0x77, 0xe0, 0x26, 0x48, 0x2f, 0xe5, 0xa4, + 0x7e, 0xa0, 0xe8, 0x96, 0xdc, 0x2c, 0x3c, 0x9a, 0x02, 0xbd, 0xb6, 0xbd, 0xfa, 0x93, 0x8e, 0xbf, 0x41, 0x12, 0xec, 0xbf, 0x07, 0xde, 0x8b, 0xe3, 0xb7, 0xfd, 0xa3, 0xd5, 0x4d, 0x9f, 0xb8, 0x54, + 0x4f, 0xa6, 0x6f, 0xfb, 0xf1, 0xd1, 0xdf, 0x37, 0x7e, 0xe3, 0x52, 0x7d, 0xc7, 0xfc, 0xad, 0xa6, 0xfa, 0x3e, 0x79, 0xdf, 0x1e, 0xbf, 0xd5, 0x54, 0xbb, 0xe1, 0x9b, 0x76, 0xdf, 0xfa, 0x5f, 0x11, + 0xfb, 0xa7, 0xb5, 0x7a, 0xf2, 0xa8, 0x8f, 0xd0, 0xd3, 0xf1, 0xfe, 0x7e, 0x84, 0x63, 0x06, 0xb6, 0x4f, 0xe6, 0xb5, 0x86, 0xca, 0x84, 0x99, 0x33, 0xdf, 0xca, 0xf4, 0x9a, 0x54, 0x93, 0x64, 0x7c, + 0xdd, 0x1f, 0xc4, 0x93, 0x44, 0x83, 0x7f, 0x47, 0x67, 0x8e, 0xf4, 0x61, 0x02, 0x75, 0x2c, 0x4f, 0xbb, 0x76, 0xe7, 0xf4, 0xfc, 0x70, 0xf3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x68, 0x33, 0xee, 0xa3, 0xf6, 0x0a, 0x00, 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x57, 0x51, 0x6f, 0xe3, 0x28, 0x10, 0x7e, 0xcf, 0xaf, 0xb0, 0xa2, 0xbe, 0x1a, 0x92, 0xee, 0x9d, 0x6e, 0x55, 0x71, 0xac, 0xf6, 0xe1, 0x56, 0x57, 0xa9, + 0xdd, 0xad, 0xd4, 0xde, 0xea, 0x5e, 0x29, 0x1e, 0x3b, 0xb4, 0x36, 0x78, 0x01, 0xa7, 0x89, 0xaa, 0xfc, 0xf7, 0x15, 0x60, 0x3b, 0xb6, 0x63, 0xb7, 0xd9, 0x2a, 0xdb, 0x37, 0x33, 0xf3, 0x31, 0x0c, + 0xdf, 0x7c, 0x86, 0x81, 0x7c, 0xda, 0x14, 0x79, 0xb4, 0x06, 0x6d, 0x84, 0x92, 0x7f, 0xcf, 0x97, 0x68, 0x31, 0xff, 0x44, 0x67, 0xa4, 0xd4, 0xea, 0x01, 0xb8, 0x8d, 0x36, 0x46, 0x5c, 0x18, 0xbe, + 0x82, 0x82, 0x5d, 0x29, 0xce, 0xac, 0xc7, 0xac, 0xac, 0x2d, 0x2f, 0x30, 0x2e, 0xd8, 0x1a, 0x24, 0x62, 0x25, 0xe3, 0x2b, 0x40, 0x4a, 0x67, 0xf8, 0xe6, 0xdb, 0x35, 0xfe, 0x03, 0x2d, 0xd0, 0x22, + 0x72, 0x08, 0x33, 0x06, 0xd9, 0x98, 0x24, 0x18, 0x63, 0x0f, 0x44, 0x1b, 0x93, 0xcc, 0xa3, 0x4d, 0x91, 0x4b, 0x73, 0x44, 0xd8, 0xf9, 0x2c, 0x8a, 0xa2, 0x80, 0xbe, 0xd8, 0x18, 0xd1, 0xce, 0x78, + 0x7a, 0x7a, 0x42, 0x4f, 0x1f, 0x3c, 0xf6, 0x7c, 0xb1, 0x58, 0xe2, 0xff, 0xaf, 0xaf, 0x6e, 0x7d, 0xca, 0xb1, 0x90, 0xc6, 0x32, 0xc9, 0x61, 0x4e, 0x67, 0x51, 0x44, 0x0a, 0x95, 0x40, 0xfe, 0x3d, + 0xec, 0x94, 0xfa, 0x88, 0x04, 0xf7, 0x6c, 0x0e, 0x94, 0x69, 0x55, 0x95, 0x97, 0x09, 0x55, 0x3a, 0x43, 0x8c, 0x17, 0x40, 0x70, 0x63, 0x71, 0x5e, 0xa6, 0xad, 0x48, 0x19, 0xb7, 0x97, 0x09, 0x4d, + 0x2b, 0xc9, 0x1d, 0x1f, 0x04, 0x77, 0x8c, 0x0e, 0x53, 0x73, 0x49, 0x97, 0x6e, 0x85, 0xf8, 0xf6, 0xeb, 0xe7, 0x9b, 0xdb, 0x7f, 0xbf, 0xdd, 0x11, 0xbc, 0xee, 0xac, 0x52, 0x6a, 0x55, 0x82, 0xb6, + 0x02, 0x0c, 0xf5, 0x9b, 0x22, 0x5c, 0x15, 0xa5, 0xc8, 0x41, 0xc7, 0x65, 0x5e, 0x65, 0x42, 0xa2, 0x06, 0xfc, 0x01, 0x7d, 0x44, 0x4b, 0x82, 0xa7, 0xdc, 0x61, 0x72, 0xa0, 0xac, 0xc1, 0x20, 0x0d, + 0x39, 0x30, 0x03, 0x74, 0xb9, 0x24, 0x78, 0xc2, 0x15, 0xe6, 0xd5, 0x45, 0x46, 0xf7, 0x95, 0xc8, 0x13, 0x64, 0x54, 0xa5, 0x39, 0xfc, 0x23, 0xb9, 0x4a, 0x84, 0xcc, 0xe8, 0x7f, 0x77, 0x5f, 0xe2, + 0x8f, 0x04, 0xbf, 0x88, 0xe9, 0x87, 0xd1, 0x50, 0x2a, 0x6d, 0x85, 0xcc, 0x90, 0xaa, 0x6c, 0x59, 0xd9, 0xa9, 0x50, 0x93, 0xb8, 0x10, 0xee, 0x47, 0xc5, 0xf4, 0x63, 0x65, 0x50, 0x99, 0x33, 0x9b, + 0x2a, 0x5d, 0xa0, 0x86, 0xdf, 0x58, 0x24, 0xb4, 0x76, 0xc6, 0xf7, 0xaa, 0x20, 0xf8, 0x45, 0xe4, 0x44, 0x30, 0x5f, 0x4d, 0xe7, 0x17, 0x0a, 0x0d, 0x9d, 0x23, 0x11, 0x5b, 0xf8, 0x44, 0xb8, 0x7d, + 0x9d, 0xce, 0xd1, 0x39, 0xfa, 0x22, 0x24, 0xcb, 0x47, 0xa2, 0xf4, 0xcb, 0x65, 0x1e, 0x45, 0x79, 0x79, 0x67, 0xa8, 0xd5, 0x15, 0x10, 0xdc, 0x8c, 0x6a, 0x5f, 0xa5, 0x21, 0x15, 0x1a, 0x0e, 0x75, + 0xe0, 0xc4, 0x74, 0xfd, 0x17, 0xc1, 0x53, 0x08, 0x27, 0x2b, 0xdc, 0xd7, 0x15, 0x49, 0xa0, 0x04, 0x99, 0x80, 0xe4, 0xdb, 0x6b, 0x26, 0x59, 0x06, 0x05, 0x48, 0x5b, 0x2f, 0xd4, 0xba, 0x5a, 0x0d, + 0xf6, 0xf0, 0x8d, 0xa9, 0xf3, 0x47, 0x9c, 0x3d, 0x4f, 0xb2, 0xb3, 0xeb, 0xfd, 0x25, 0xf5, 0xbc, 0xce, 0x6f, 0x31, 0x32, 0xb5, 0x53, 0xaa, 0xdd, 0xf0, 0x17, 0xaa, 0x03, 0x34, 0x3b, 0x1b, 0x99, + 0x5d, 0xbb, 0x76, 0xbd, 0xbf, 0xaa, 0x9e, 0x66, 0xb7, 0x25, 0xd0, 0xd2, 0xe9, 0xc3, 0x7f, 0xed, 0x1d, 0x86, 0xab, 0x12, 0xa8, 0x28, 0x9c, 0xfa, 0x08, 0x0e, 0xa3, 0x66, 0xe7, 0x78, 0xb8, 0xf5, + 0x8e, 0xa5, 0x61, 0x13, 0x4f, 0xd1, 0x39, 0x42, 0xe6, 0x08, 0x95, 0x2d, 0x91, 0x7b, 0xe5, 0x1d, 0xd0, 0xd6, 0x25, 0xad, 0x91, 0x7a, 0x5a, 0xc9, 0x1f, 0xdb, 0xf8, 0x51, 0x32, 0x2b, 0xd6, 0x10, + 0xc3, 0x1a, 0xa4, 0x35, 0x87, 0x8c, 0x8d, 0xec, 0xe0, 0x74, 0x29, 0x98, 0x82, 0xe5, 0xb9, 0xde, 0x42, 0xbc, 0x02, 0x96, 0xdb, 0xd5, 0x3b, 0xaf, 0xce, 0x34, 0x7f, 0xe7, 0x15, 0x1f, 0x2a, 0x29, + 0xec, 0x9f, 0x63, 0xb2, 0xac, 0x45, 0x64, 0xc1, 0xf4, 0x25, 0xf4, 0xcb, 0xe9, 0x68, 0x30, 0x36, 0x66, 0xc6, 0xfd, 0xcd, 0xc9, 0x8b, 0x39, 0xf5, 0x81, 0x6f, 0xcf, 0x68, 0x44, 0xd0, 0xfe, 0x4c, + 0xaf, 0xd1, 0xe1, 0x34, 0xd9, 0x1f, 0x05, 0x61, 0x4c, 0x4f, 0x7a, 0x0c, 0x34, 0xf4, 0x86, 0x0e, 0x20, 0xac, 0x70, 0xda, 0x7f, 0x1f, 0x36, 0x16, 0xa4, 0xb3, 0x35, 0xa7, 0x6b, 0xc7, 0xd0, 0x45, + 0x01, 0xaf, 0x6c, 0xdf, 0xd8, 0x35, 0x77, 0xad, 0x6e, 0xe7, 0x8a, 0xe5, 0xa6, 0x6f, 0xab, 0xad, 0xd4, 0x33, 0x48, 0xb0, 0xff, 0x1e, 0x05, 0x64, 0x20, 0x41, 0x33, 0x0b, 0x31, 0x57, 0x09, 0x1c, + 0x0d, 0x8c, 0x5d, 0x35, 0xcd, 0x18, 0x3c, 0xd8, 0xfa, 0x79, 0xe3, 0x91, 0xc4, 0x3b, 0xc6, 0x7d, 0x4d, 0x71, 0xbf, 0xa8, 0x87, 0x35, 0xee, 0x94, 0x22, 0xd4, 0x68, 0xd0, 0x77, 0xbc, 0x5a, 0xac, + 0x89, 0x3e, 0x65, 0xb4, 0x56, 0x5c, 0xc9, 0x54, 0x64, 0x95, 0x66, 0x43, 0xca, 0xdb, 0x66, 0xe8, 0xb3, 0xce, 0x06, 0xbc, 0x13, 0xa6, 0x33, 0x1a, 0x97, 0x4c, 0xb3, 0x02, 0x2c, 0x68, 0x7f, 0x0e, + 0x66, 0x7d, 0x32, 0xc6, 0x27, 0x3b, 0xfb, 0xc8, 0x72, 0x6f, 0xa0, 0x64, 0x70, 0xff, 0xbe, 0x4a, 0xc9, 0xc4, 0x7d, 0xfd, 0x8b, 0x94, 0x98, 0xad, 0xb1, 0x50, 0xdc, 0x84, 0xeb, 0x7d, 0xfb, 0x9d, + 0x69, 0xc1, 0xee, 0x73, 0x18, 0xb2, 0xf3, 0xc0, 0xd6, 0x0c, 0x55, 0x56, 0xe4, 0x28, 0x57, 0x59, 0xe6, 0x3a, 0xac, 0xc2, 0x5f, 0x54, 0xda, 0xb7, 0xb3, 0x0f, 0xf7, 0xca, 0x18, 0xe7, 0xa9, 0x8d, + 0xe8, 0x4a, 0x65, 0xe1, 0x22, 0xd3, 0x04, 0x4f, 0x4f, 0xed, 0x2f, 0x11, 0x1a, 0xca, 0x95, 0x2a, 0x80, 0x9e, 0x3d, 0xef, 0x07, 0xbb, 0xa6, 0xd5, 0xf4, 0x9e, 0x5e, 0x41, 0x5e, 0x4d, 0xfd, 0x74, + 0xb5, 0x49, 0x99, 0xc8, 0x0d, 0x4b, 0x7f, 0x4b, 0x6d, 0x4e, 0x77, 0x68, 0x08, 0x69, 0x21, 0x0b, 0x7b, 0x8d, 0xc3, 0xb1, 0x3d, 0x7d, 0x2c, 0xac, 0x41, 0x8b, 0x74, 0x7b, 0xe4, 0x49, 0xf0, 0x92, + 0x82, 0xa2, 0xa3, 0x55, 0xe4, 0x91, 0xa1, 0xdb, 0x40, 0xa2, 0x60, 0x19, 0xa0, 0x92, 0xd9, 0x15, 0x3d, 0x7b, 0xee, 0x3f, 0x05, 0x12, 0xa1, 0x81, 0x5b, 0xa5, 0xb7, 0x3b, 0x3c, 0x74, 0xa5, 0xae, + 0x0d, 0xfe, 0xca, 0x0a, 0xd8, 0xc5, 0xba, 0x92, 0xd2, 0xc9, 0xeb, 0x30, 0xde, 0xe1, 0x9a, 0xbf, 0x5f, 0xbd, 0xd1, 0x5b, 0x14, 0x1c, 0x1d, 0xa7, 0xe2, 0x68, 0x5a, 0xc9, 0xc1, 0xf5, 0xa6, 0x53, + 0xba, 0x19, 0xd5, 0x1d, 0x68, 0x7b, 0x63, 0xbb, 0x47, 0x57, 0x2a, 0xda, 0x04, 0x9a, 0x61, 0x1b, 0x44, 0x24, 0x34, 0x50, 0x4e, 0xb0, 0xe8, 0xb4, 0x15, 0xdc, 0x8a, 0xf5, 0x20, 0xb5, 0xe6, 0x2d, + 0xba, 0xed, 0x65, 0x2b, 0x59, 0x01, 0x6d, 0x04, 0x3f, 0xe8, 0x24, 0x3d, 0x9c, 0x41, 0xf0, 0x61, 0xe0, 0x83, 0x27, 0xae, 0x37, 0x36, 0x8f, 0x9d, 0x94, 0xe5, 0x66, 0xf8, 0xf6, 0xf1, 0x80, 0xf6, + 0xb6, 0x67, 0xfc, 0xd1, 0x49, 0xc5, 0xb7, 0xf0, 0x4d, 0x1e, 0xa3, 0xce, 0xd9, 0x20, 0xab, 0x7d, 0x0b, 0x8e, 0x3b, 0xa4, 0xb4, 0x03, 0x43, 0x67, 0xed, 0x4b, 0x94, 0xce, 0x7e, 0x06, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb4, 0x8f, 0xae, 0x2b, 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, - 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xa4, 0x90, 0xb1, 0x6e, 0xc4, 0x20, 0x10, 0x44, 0x7b, - 0xbe, 0x62, 0x44, 0xc3, 0x9d, 0x2c, 0xe5, 0x07, 0x4e, 0x27, 0xa5, 0x4d, 0x11, 0xa5, 0x48, 0x9b, 0x86, 0x70, 0x1b, 0x82, 0xe2, 0x60, 0x04, 0x8b, 0x1b, 0xcb, 0xff, 0x1e, 0xd9, 0xe0, 0x38, 0x96, - 0x50, 0x9a, 0xdb, 0x0a, 0xed, 0xcc, 0xbc, 0x1d, 0x11, 0xb4, 0xf9, 0xd2, 0x96, 0xf0, 0x91, 0xbd, 0x61, 0x37, 0xf8, 0x74, 0x11, 0x22, 0xe4, 0xf7, 0xde, 0x19, 0x98, 0x5e, 0xa7, 0x84, 0x27, 0x1f, - 0x32, 0x63, 0x12, 0x00, 0x10, 0xa2, 0x1b, 0x35, 0x13, 0x5e, 0x39, 0x3a, 0x6f, 0xf1, 0x4d, 0x29, 0x69, 0x4b, 0x17, 0x51, 0xc4, 0x92, 0x5a, 0xfd, 0xa7, 0x33, 0xa6, 0xb9, 0xb1, 0x3e, 0x06, 0xcf, - 0x15, 0xbb, 0x0c, 0x7f, 0xba, 0xf4, 0x50, 0xf7, 0xb8, 0xee, 0xe8, 0x45, 0x3b, 0x92, 0x2a, 0xc3, 0x12, 0x3f, 0x17, 0xd3, 0xe9, 0x2f, 0x27, 0x12, 0xe7, 0xe8, 0xff, 0xcb, 0x8f, 0x83, 0xbb, 0x21, - 0xed, 0xe9, 0xbb, 0x3a, 0x3d, 0xbe, 0x8c, 0x14, 0xa3, 0xbb, 0x51, 0xa3, 0x21, 0x0f, 0xe5, 0xd1, 0xea, 0x27, 0xd7, 0xff, 0x98, 0x24, 0xba, 0x5f, 0x65, 0x1b, 0x59, 0xef, 0x5c, 0x95, 0x44, 0xb7, - 0x1d, 0x45, 0x07, 0xf5, 0xa6, 0x54, 0xc3, 0xae, 0x66, 0xb5, 0x35, 0x9a, 0xc5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa6, 0x1f, 0xc2, 0x5d, 0xbc, 0x00, 0x00, 0x00, 0xce, - 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, + 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, - 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xa4, 0x90, 0xc1, 0x6a, 0xc4, 0x20, 0x10, 0x86, - 0xef, 0x3e, 0xc5, 0x8f, 0x17, 0x77, 0x09, 0xf4, 0x05, 0x96, 0x85, 0xbe, 0x40, 0xc9, 0xa1, 0xd7, 0x5e, 0xac, 0x99, 0x5a, 0x69, 0x6a, 0x44, 0xc7, 0x5c, 0x42, 0xde, 0xbd, 0x04, 0x4d, 0xd3, 0x80, - 0xf4, 0xb2, 0x73, 0x92, 0x99, 0xf9, 0xbe, 0xf9, 0x31, 0x68, 0xf3, 0xa5, 0x2d, 0xe1, 0x23, 0x7b, 0xc3, 0x6e, 0xf2, 0xe9, 0x26, 0x44, 0xc8, 0xef, 0xa3, 0x33, 0x30, 0xa3, 0x4e, 0x09, 0x7d, 0xe6, - 0x90, 0x19, 0x8b, 0x00, 0x80, 0x10, 0xdd, 0xac, 0x99, 0xf0, 0xca, 0xd1, 0x79, 0x8b, 0x6f, 0x4a, 0x49, 0x5b, 0xba, 0x89, 0x32, 0x2c, 0x58, 0x01, 0x2e, 0x57, 0x2c, 0x6b, 0xab, 0x7f, 0x46, 0xaf, - 0x55, 0xbc, 0x15, 0x7f, 0xba, 0xf4, 0x54, 0xfb, 0xb8, 0x1f, 0xf2, 0x6d, 0x76, 0x56, 0x55, 0x87, 0x25, 0x7e, 0x29, 0x4b, 0x97, 0xbf, 0x9e, 0x48, 0x9c, 0xa3, 0xff, 0x8f, 0x9f, 0x27, 0x37, 0x20, - 0x1d, 0xf4, 0x43, 0x99, 0x9e, 0xfb, 0x99, 0x62, 0x74, 0x03, 0x35, 0x12, 0xf2, 0x54, 0x1e, 0xad, 0x7c, 0xb2, 0x7c, 0xc8, 0x22, 0xd1, 0xfd, 0x8e, 0xf6, 0x92, 0xf5, 0xd0, 0x5d, 0x49, 0x74, 0xfb, - 0x55, 0x74, 0x50, 0x6f, 0x4a, 0x35, 0xd6, 0xd5, 0xaa, 0xf6, 0x48, 0xab, 0xf8, 0x09, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x03, 0xc2, 0xc1, 0xc3, 0xba, 0x00, 0x00, 0x00, 0xd2, 0x01, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, - 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, - 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x74, 0x8c, 0x41, 0xae, 0xc2, 0x30, 0x0c, 0x44, 0xf7, 0x39, 0x45, 0xa4, 0xae, 0x9b, 0x7f, 0x82, 0xac, 0xfe, 0x49, 0x2c, 0x70, 0x48, 0x54, 0x63, 0xb7, 0x8e, 0x5d, 0x91, 0xdb, 0x23, - 0x54, 0x51, 0x56, 0x5d, 0xbe, 0x99, 0x37, 0x33, 0xc5, 0x7f, 0xe1, 0xd2, 0x1e, 0xae, 0x60, 0x4d, 0x38, 0x96, 0x46, 0x18, 0xa6, 0xb8, 0xe0, 0x88, 0x39, 0xee, 0x40, 0x8e, 0x61, 0x73, 0xd0, 0xc5, - 0x7b, 0x2a, 0xce, 0xdb, 0x48, 0xf8, 0x5a, 0x45, 0x2d, 0x17, 0xe7, 0xdb, 0x67, 0x70, 0xb6, 0xfd, 0x09, 0x44, 0x3a, 0x70, 0xae, 0x08, 0x64, 0x35, 0xa9, 0x88, 0xcd, 0x2b, 0x58, 0xcd, 0x7f, 0x47, - 0x72, 0x69, 0x52, 0xdb, 0x91, 0xb1, 0xf7, 0xc3, 0xfe, 0xd2, 0xf5, 0x31, 0xc2, 0xbd, 0xfd, 0xfc, 0x13, 0xc3, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x83, 0x67, 0x54, 0xb9, 0x75, - 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, - 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, - 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, - 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, - 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, - 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, 0x92, 0xcd, 0x6e, 0xdb, 0x3a, 0x10, 0x85, 0xf7, 0x7a, 0x0a, 0x5e, 0xae, 0x28, 0x20, 0x77, 0x92, 0x06, 0x5d, 0xd5, 0x28, 0x90, 0x34, 0x48, 0xd1, - 0x2c, 0xd2, 0xa2, 0x45, 0xd0, 0x95, 0x37, 0x34, 0x35, 0x91, 0x69, 0xcb, 0x24, 0xcd, 0x19, 0xba, 0x30, 0x0c, 0xbf, 0x7b, 0xa1, 0xdf, 0x28, 0xb5, 0x50, 0xa7, 0xda, 0x88, 0x20, 0xcf, 0x87, 0x39, - 0x33, 0x73, 0x82, 0x36, 0x6b, 0x5d, 0xa2, 0x78, 0x4e, 0xce, 0xb0, 0xf5, 0x8e, 0x66, 0x59, 0x66, 0x37, 0xc1, 0x47, 0x16, 0xd6, 0xc3, 0x36, 0xe9, 0xb8, 0x4e, 0x04, 0xcf, 0xc9, 0x6d, 0xf7, 0xb0, - 0x76, 0x9a, 0xed, 0x0e, 0x01, 0x77, 0xe8, 0x98, 0xe0, 0xae, 0xf2, 0xa9, 0xb8, 0xaf, 0xcf, 0x9f, 0x92, 0xad, 0x0a, 0x8c, 0xb3, 0x09, 0x92, 0x91, 0x18, 0x56, 0xc9, 0x59, 0x86, 0xef, 0xed, 0xd5, - 0x13, 0x12, 0x8f, 0x95, 0x11, 0x89, 0x35, 0x51, 0x8a, 0x58, 0xc0, 0x0f, 0x24, 0xbe, 0x6d, 0xcf, 0x83, 0xc4, 0xc7, 0x12, 0x96, 0x7a, 0x63, 0x6a, 0x1d, 0xdc, 0xf9, 0x88, 0x8f, 0x9a, 0xcd, 0x12, - 0x23, 0xbd, 0x52, 0xb4, 0x25, 0x56, 0x29, 0x58, 0xc6, 0x08, 0x3a, 0x58, 0xb8, 0x25, 0xc2, 0xd8, 0xb5, 0xf4, 0x57, 0x61, 0x6b, 0xa8, 0xd7, 0x10, 0x6b, 0xb6, 0xe6, 0x75, 0xd5, 0xbe, 0x22, 0xe0, - 0x36, 0xe9, 0xea, 0xc9, 0xcf, 0xde, 0x24, 0x76, 0x9e, 0xbf, 0xa6, 0xaa, 0xfa, 0xa9, 0xab, 0x84, 0xb3, 0x2c, 0xbb, 0x19, 0xf5, 0x9f, 0x85, 0xb4, 0xa8, 0xac, 0x11, 0xa6, 0xd2, 0x44, 0xe2, 0x73, - 0x37, 0xfb, 0xfa, 0x45, 0x1c, 0xb2, 0x4c, 0x08, 0x21, 0x6e, 0x1a, 0x59, 0x7d, 0xda, 0x79, 0x5b, 0x88, 0x7a, 0x8c, 0xbd, 0x4c, 0xe5, 0xe2, 0xd0, 0xbc, 0xd4, 0xdf, 0xb7, 0xc4, 0x21, 0xb1, 0xf0, - 0xed, 0xef, 0xa3, 0x50, 0x0e, 0x7f, 0x89, 0x17, 0x65, 0x0e, 0xfd, 0x62, 0xd5, 0xc9, 0xba, 0xc0, 0x44, 0xd4, 0x8c, 0x2a, 0x87, 0x45, 0x7d, 0xd1, 0x90, 0x0f, 0x2e, 0x24, 0x56, 0xf2, 0x0b, 0x56, - 0x95, 0xff, 0x4f, 0xe6, 0x79, 0x0e, 0x85, 0x66, 0xad, 0xf2, 0xd9, 0x50, 0xf0, 0x65, 0xac, 0xa0, 0x9b, 0xe3, 0x7d, 0x3d, 0x13, 0x1a, 0x98, 0x8b, 0xce, 0x0b, 0x94, 0xc8, 0x8f, 0x48, 0xa4, 0x4b, - 0x54, 0x79, 0xc7, 0x1f, 0xff, 0xec, 0xad, 0x1b, 0xc3, 0x49, 0x8b, 0x0f, 0x8e, 0xb1, 0x8c, 0xfa, 0xa4, 0xdb, 0x51, 0x3e, 0xa0, 0xb4, 0x3b, 0x74, 0x2a, 0x07, 0xe3, 0x1d, 0xa3, 0xe3, 0xa7, 0x7d, - 0x40, 0x25, 0x75, 0x08, 0x95, 0x35, 0x0d, 0x78, 0xb9, 0x22, 0xef, 0x64, 0x3e, 0xb0, 0xfd, 0x07, 0x0b, 0x5f, 0xec, 0x95, 0x3c, 0xcc, 0xe5, 0xa6, 0xb5, 0x37, 0x97, 0x1f, 0xc4, 0xbc, 0xb3, 0x3f, - 0x97, 0xc7, 0x29, 0x64, 0x89, 0xba, 0xc0, 0xa8, 0xa4, 0xc1, 0xff, 0x6d, 0x21, 0x2f, 0x84, 0x7c, 0x7f, 0x7d, 0x46, 0x46, 0x01, 0xcd, 0x0e, 0x23, 0x59, 0xef, 0x6a, 0xfd, 0x3b, 0xb8, 0x9a, 0x02, - 0x82, 0x27, 0x56, 0xf2, 0x72, 0xea, 0x89, 0x97, 0x4d, 0x77, 0x75, 0xc2, 0x12, 0xdd, 0xf9, 0x02, 0xd5, 0xf5, 0xd5, 0xd5, 0x1b, 0xac, 0x8d, 0x53, 0xa7, 0xf2, 0x7f, 0x31, 0xd9, 0x85, 0x5b, 0xb5, - 0x66, 0xcf, 0x90, 0x3e, 0x45, 0x83, 0x63, 0xa8, 0xcf, 0xd9, 0x39, 0x92, 0xf7, 0x61, 0x92, 0x83, 0x36, 0x36, 0x93, 0x78, 0xbb, 0xb1, 0x6e, 0x5d, 0x63, 0x78, 0xc8, 0xe9, 0x90, 0xaf, 0x63, 0xf6, - 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfb, 0x20, 0x9b, 0xb4, 0xde, 0x01, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x91, 0xbf, 0x6e, 0xdb, 0x30, 0x10, 0xc6, 0x77, 0x3e, 0xc5, 0x8d, 0x92, 0x06, 0xea, 0x01, 0xd4, 0x16, 0x6e, 0x8b, 0x1a, 0xe8, 0x50, 0x14, 0x45, 0x93, 0x21, 0x23, + 0x2d, 0x9d, 0x25, 0xc2, 0x14, 0x49, 0xf1, 0x8e, 0x8e, 0x85, 0xc0, 0xef, 0x1e, 0x50, 0x7f, 0x2c, 0x03, 0x49, 0x96, 0x68, 0x21, 0x71, 0xbf, 0xef, 0x3b, 0xde, 0x7d, 0xf2, 0xaa, 0x3e, 0xa9, 0x16, + 0xe1, 0x18, 0x6d, 0xcd, 0xda, 0x59, 0xaa, 0x84, 0xd0, 0xbd, 0x77, 0x81, 0x41, 0x3b, 0x39, 0x44, 0x15, 0x4e, 0x91, 0xe4, 0x31, 0xda, 0x61, 0x94, 0xfb, 0x68, 0x87, 0xea, 0x43, 0x7a, 0xb2, 0x8a, + 0xf5, 0x19, 0x25, 0x9e, 0xd1, 0x32, 0xc9, 0x9f, 0xc6, 0xc5, 0xe6, 0x57, 0xba, 0x7f, 0xc2, 0xf2, 0x23, 0x6a, 0xd3, 0x60, 0xa8, 0x84, 0x28, 0x8b, 0x42, 0x40, 0x01, 0x4f, 0x2e, 0x06, 0xd8, 0x2f, + 0x33, 0x42, 0x6d, 0x14, 0x91, 0x80, 0xa2, 0x14, 0x3e, 0x1e, 0x8c, 0xae, 0xe7, 0xc2, 0xc6, 0x5f, 0x84, 0x00, 0x00, 0x98, 0xbc, 0xe9, 0x2b, 0xe0, 0x91, 0x10, 0xb8, 0x43, 0xf8, 0x37, 0xbf, 0x9f, + 0xa4, 0x03, 0xe0, 0x85, 0xd1, 0x52, 0x32, 0x1c, 0x5d, 0x98, 0xf0, 0x9a, 0x82, 0x84, 0x87, 0x4e, 0x13, 0xe0, 0x45, 0xf5, 0xde, 0xe0, 0xda, 0x64, 0xa5, 0x40, 0xba, 0xf7, 0x66, 0x04, 0xac, 0x3b, + 0x87, 0x04, 0x9a, 0x09, 0xb4, 0xf5, 0x91, 0xa1, 0x51, 0xac, 0xe4, 0xaa, 0xde, 0x79, 0x15, 0x54, 0xbf, 0x10, 0x05, 0xdb, 0x72, 0x37, 0x41, 0x40, 0x8e, 0xc1, 0xbe, 0xc7, 0xca, 0xe9, 0xdc, 0xa5, + 0x29, 0xa7, 0xdb, 0xb2, 0xe6, 0xa6, 0xfb, 0xf2, 0x37, 0xb2, 0x8f, 0xfc, 0xed, 0x36, 0x53, 0x76, 0xc7, 0x7e, 0xdb, 0x09, 0x4d, 0x2f, 0xe7, 0x6b, 0x18, 0x53, 0x20, 0x25, 0x7c, 0x6f, 0x1a, 0x18, + 0x53, 0x98, 0x87, 0x48, 0xda, 0x22, 0x11, 0x18, 0xd7, 0xea, 0x1a, 0x3a, 0x0c, 0xb8, 0x09, 0xff, 0x8f, 0xc4, 0xd8, 0x4b, 0x17, 0x59, 0xfa, 0xa0, 0x2d, 0x1b, 0x9b, 0xcd, 0xdd, 0xaa, 0x9b, 0x64, + 0x1e, 0x00, 0xdc, 0x7c, 0x7c, 0x05, 0x8b, 0xcf, 0x4b, 0x6d, 0x96, 0xca, 0x14, 0x46, 0x96, 0xcb, 0x16, 0xf9, 0x0f, 0x12, 0xa9, 0x16, 0xb3, 0xfc, 0xce, 0xbe, 0xec, 0xfe, 0xe6, 0x97, 0xcb, 0x3a, + 0xa0, 0x62, 0xcc, 0x72, 0x79, 0x48, 0x85, 0x6c, 0xee, 0xbf, 0x18, 0xaf, 0x42, 0x5c, 0xc5, 0x6b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x29, 0x16, 0x23, 0x9b, 0x51, 0x01, 0x00, + 0x00, 0xb2, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, + 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, + 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xa4, 0x90, 0xb1, 0x6e, 0xc4, 0x20, 0x10, + 0x44, 0x7b, 0xbe, 0x62, 0x44, 0xc3, 0x9d, 0x2c, 0xe5, 0x07, 0x4e, 0x27, 0xa5, 0x4d, 0x11, 0xa5, 0x48, 0x9b, 0x86, 0x70, 0x1b, 0x82, 0xe2, 0x60, 0x04, 0x8b, 0x1b, 0xcb, 0xff, 0x1e, 0xd9, 0xe0, + 0x38, 0x96, 0x50, 0x9a, 0xdb, 0x0a, 0xed, 0xcc, 0xbc, 0x1d, 0x11, 0xb4, 0xf9, 0xd2, 0x96, 0xf0, 0x91, 0xbd, 0x61, 0x37, 0xf8, 0x74, 0x11, 0x22, 0xe4, 0xf7, 0xde, 0x19, 0x98, 0x5e, 0xa7, 0x84, + 0x27, 0x1f, 0x32, 0x63, 0x12, 0x00, 0x10, 0xa2, 0x1b, 0x35, 0x13, 0x5e, 0x39, 0x3a, 0x6f, 0xf1, 0x4d, 0x29, 0x69, 0x4b, 0x17, 0x51, 0xc4, 0x92, 0x5a, 0xfd, 0xa7, 0x33, 0xa6, 0xb9, 0xb1, 0x3e, + 0x06, 0xcf, 0x15, 0xbb, 0x0c, 0x7f, 0xba, 0xf4, 0x50, 0xf7, 0xb8, 0xee, 0xe8, 0x45, 0x3b, 0x92, 0x2a, 0xc3, 0x12, 0x3f, 0x17, 0xd3, 0xe9, 0x2f, 0x27, 0x12, 0xe7, 0xe8, 0xff, 0xcb, 0x8f, 0x83, + 0xbb, 0x21, 0xed, 0xe9, 0xbb, 0x3a, 0x3d, 0xbe, 0x8c, 0x14, 0xa3, 0xbb, 0x51, 0xa3, 0x21, 0x0f, 0xe5, 0xd1, 0xea, 0x27, 0xd7, 0xff, 0x98, 0x24, 0xba, 0x5f, 0x65, 0x1b, 0x59, 0xef, 0x5c, 0x95, + 0x44, 0xb7, 0x1d, 0x45, 0x07, 0xf5, 0xa6, 0x54, 0xc3, 0xae, 0x66, 0xb5, 0x35, 0x9a, 0xc5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa6, 0x1f, 0xc2, 0x5d, 0xbc, 0x00, 0x00, + 0x00, 0xce, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, + 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, + 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xa4, 0x90, 0xc1, 0x6a, 0xc4, 0x20, + 0x10, 0x86, 0xef, 0x3e, 0xc5, 0x8f, 0x17, 0x77, 0x09, 0xf4, 0x05, 0x96, 0x85, 0xbe, 0x40, 0xc9, 0xa1, 0xd7, 0x5e, 0xac, 0x99, 0x5a, 0x69, 0x6a, 0x44, 0xc7, 0x5c, 0x42, 0xde, 0xbd, 0x04, 0x4d, + 0xd3, 0x80, 0xf4, 0xb2, 0x73, 0x92, 0x99, 0xf9, 0xbe, 0xf9, 0x31, 0x68, 0xf3, 0xa5, 0x2d, 0xe1, 0x23, 0x7b, 0xc3, 0x6e, 0xf2, 0xe9, 0x26, 0x44, 0xc8, 0xef, 0xa3, 0x33, 0x30, 0xa3, 0x4e, 0x09, + 0x7d, 0xe6, 0x90, 0x19, 0x8b, 0x00, 0x80, 0x10, 0xdd, 0xac, 0x99, 0xf0, 0xca, 0xd1, 0x79, 0x8b, 0x6f, 0x4a, 0x49, 0x5b, 0xba, 0x89, 0x32, 0x2c, 0x58, 0x01, 0x2e, 0x57, 0x2c, 0x6b, 0xab, 0x7f, + 0x46, 0xaf, 0x55, 0xbc, 0x15, 0x7f, 0xba, 0xf4, 0x54, 0xfb, 0xb8, 0x1f, 0xf2, 0x6d, 0x76, 0x56, 0x55, 0x87, 0x25, 0x7e, 0x29, 0x4b, 0x97, 0xbf, 0x9e, 0x48, 0x9c, 0xa3, 0xff, 0x8f, 0x9f, 0x27, + 0x37, 0x20, 0x1d, 0xf4, 0x43, 0x99, 0x9e, 0xfb, 0x99, 0x62, 0x74, 0x03, 0x35, 0x12, 0xf2, 0x54, 0x1e, 0xad, 0x7c, 0xb2, 0x7c, 0xc8, 0x22, 0xd1, 0xfd, 0x8e, 0xf6, 0x92, 0xf5, 0xd0, 0x5d, 0x49, + 0x74, 0xfb, 0x55, 0x74, 0x50, 0x6f, 0x4a, 0x35, 0xd6, 0xd5, 0xaa, 0xf6, 0x48, 0xab, 0xf8, 0x09, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x03, 0xc2, 0xc1, 0xc3, 0xba, 0x00, 0x00, 0x00, + 0xd2, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, + 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, + 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x74, 0x8c, 0x41, 0xae, 0xc2, 0x30, 0x0c, 0x44, 0xf7, 0x39, 0x45, 0xa4, 0xae, 0x9b, 0x7f, 0x82, 0xac, 0xfe, 0x49, 0x2c, 0x70, 0x48, 0x54, 0x63, 0xb7, 0x8e, 0x5d, 0x91, + 0xdb, 0x23, 0x54, 0x51, 0x56, 0x5d, 0xbe, 0x99, 0x37, 0x33, 0xc5, 0x7f, 0xe1, 0xd2, 0x1e, 0xae, 0x60, 0x4d, 0x38, 0x96, 0x46, 0x18, 0xa6, 0xb8, 0xe0, 0x88, 0x39, 0xee, 0x40, 0x8e, 0x61, 0x73, + 0xd0, 0xc5, 0x7b, 0x2a, 0xce, 0xdb, 0x48, 0xf8, 0x5a, 0x45, 0x2d, 0x17, 0xe7, 0xdb, 0x67, 0x70, 0xb6, 0xfd, 0x09, 0x44, 0x3a, 0x70, 0xae, 0x08, 0x64, 0x35, 0xa9, 0x88, 0xcd, 0x2b, 0x58, 0xcd, + 0x7f, 0x47, 0x72, 0x69, 0x52, 0xdb, 0x91, 0xb1, 0xf7, 0xc3, 0xfe, 0xd2, 0xf5, 0x31, 0xc2, 0xbd, 0xfd, 0xfc, 0x13, 0xc3, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x83, 0x67, 0x54, + 0xb9, 0x75, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, + 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, + 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, + 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, + 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, 0x92, 0xcd, 0x6e, 0xdb, 0x3a, 0x10, 0x85, 0xf7, 0x7a, 0x0a, 0x5e, 0xae, 0x28, 0x20, 0x77, 0x92, 0x06, 0x5d, 0xd5, 0x28, 0x90, 0x34, + 0x48, 0xd1, 0x2c, 0xd2, 0xa2, 0x45, 0xd0, 0x95, 0x37, 0x34, 0x35, 0x91, 0x69, 0xcb, 0x24, 0xcd, 0x19, 0xba, 0x30, 0x0c, 0xbf, 0x7b, 0xa1, 0xdf, 0x28, 0xb5, 0x50, 0xa7, 0xda, 0x88, 0x20, 0xcf, + 0x87, 0x39, 0x33, 0x73, 0x82, 0x36, 0x6b, 0x5d, 0xa2, 0x78, 0x4e, 0xce, 0xb0, 0xf5, 0x8e, 0x66, 0x59, 0x66, 0x37, 0xc1, 0x47, 0x16, 0xd6, 0xc3, 0x36, 0xe9, 0xb8, 0x4e, 0x04, 0xcf, 0xc9, 0x6d, + 0xf7, 0xb0, 0x76, 0x9a, 0xed, 0x0e, 0x01, 0x77, 0xe8, 0x98, 0xe0, 0xae, 0xf2, 0xa9, 0xb8, 0xaf, 0xcf, 0x9f, 0x92, 0xad, 0x0a, 0x8c, 0xb3, 0x09, 0x92, 0x91, 0x18, 0x56, 0xc9, 0x59, 0x86, 0xef, + 0xed, 0xd5, 0x13, 0x12, 0x8f, 0x95, 0x11, 0x89, 0x35, 0x51, 0x8a, 0x58, 0xc0, 0x0f, 0x24, 0xbe, 0x6d, 0xcf, 0x83, 0xc4, 0xc7, 0x12, 0x96, 0x7a, 0x63, 0x6a, 0x1d, 0xdc, 0xf9, 0x88, 0x8f, 0x9a, + 0xcd, 0x12, 0x23, 0xbd, 0x52, 0xb4, 0x25, 0x56, 0x29, 0x58, 0xc6, 0x08, 0x3a, 0x58, 0xb8, 0x25, 0xc2, 0xd8, 0xb5, 0xf4, 0x57, 0x61, 0x6b, 0xa8, 0xd7, 0x10, 0x6b, 0xb6, 0xe6, 0x75, 0xd5, 0xbe, + 0x22, 0xe0, 0x36, 0xe9, 0xea, 0xc9, 0xcf, 0xde, 0x24, 0x76, 0x9e, 0xbf, 0xa6, 0xaa, 0xfa, 0xa9, 0xab, 0x84, 0xb3, 0x2c, 0xbb, 0x19, 0xf5, 0x9f, 0x85, 0xb4, 0xa8, 0xac, 0x11, 0xa6, 0xd2, 0x44, + 0xe2, 0x73, 0x37, 0xfb, 0xfa, 0x45, 0x1c, 0xb2, 0x4c, 0x08, 0x21, 0x6e, 0x1a, 0x59, 0x7d, 0xda, 0x79, 0x5b, 0x88, 0x7a, 0x8c, 0xbd, 0x4c, 0xe5, 0xe2, 0xd0, 0xbc, 0xd4, 0xdf, 0xb7, 0xc4, 0x21, + 0xb1, 0xf0, 0xed, 0xef, 0xa3, 0x50, 0x0e, 0x7f, 0x89, 0x17, 0x65, 0x0e, 0xfd, 0x62, 0xd5, 0xc9, 0xba, 0xc0, 0x44, 0xd4, 0x8c, 0x2a, 0x87, 0x45, 0x7d, 0xd1, 0x90, 0x0f, 0x2e, 0x24, 0x56, 0xf2, + 0x0b, 0x56, 0x95, 0xff, 0x4f, 0xe6, 0x79, 0x0e, 0x85, 0x66, 0xad, 0xf2, 0xd9, 0x50, 0xf0, 0x65, 0xac, 0xa0, 0x9b, 0xe3, 0x7d, 0x3d, 0x13, 0x1a, 0x98, 0x8b, 0xce, 0x0b, 0x94, 0xc8, 0x8f, 0x48, + 0xa4, 0x4b, 0x54, 0x79, 0xc7, 0x1f, 0xff, 0xec, 0xad, 0x1b, 0xc3, 0x49, 0x8b, 0x0f, 0x8e, 0xb1, 0x8c, 0xfa, 0xa4, 0xdb, 0x51, 0x3e, 0xa0, 0xb4, 0x3b, 0x74, 0x2a, 0x07, 0xe3, 0x1d, 0xa3, 0xe3, + 0xa7, 0x7d, 0x40, 0x25, 0x75, 0x08, 0x95, 0x35, 0x0d, 0x78, 0xb9, 0x22, 0xef, 0x64, 0x3e, 0xb0, 0xfd, 0x07, 0x0b, 0x5f, 0xec, 0x95, 0x3c, 0xcc, 0xe5, 0xa6, 0xb5, 0x37, 0x97, 0x1f, 0xc4, 0xbc, + 0xb3, 0x3f, 0x97, 0xc7, 0x29, 0x64, 0x89, 0xba, 0xc0, 0xa8, 0xa4, 0xc1, 0xff, 0x6d, 0x21, 0x2f, 0x84, 0x7c, 0x7f, 0x7d, 0x46, 0x46, 0x01, 0xcd, 0x0e, 0x23, 0x59, 0xef, 0x6a, 0xfd, 0x3b, 0xb8, + 0x9a, 0x02, 0x82, 0x27, 0x56, 0xf2, 0x72, 0xea, 0x89, 0x97, 0x4d, 0x77, 0x75, 0xc2, 0x12, 0xdd, 0xf9, 0x02, 0xd5, 0xf5, 0xd5, 0xd5, 0x1b, 0xac, 0x8d, 0x53, 0xa7, 0xf2, 0x7f, 0x31, 0xd9, 0x85, + 0x5b, 0xb5, 0x66, 0xcf, 0x90, 0x3e, 0x45, 0x83, 0x63, 0xa8, 0xcf, 0xd9, 0x39, 0x92, 0xf7, 0x61, 0x92, 0x83, 0x36, 0x36, 0x93, 0x78, 0xbb, 0xb1, 0x6e, 0x5d, 0x63, 0x78, 0xc8, 0xe9, 0x90, 0xaf, + 0x63, 0xf6, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfb, 0x20, 0x9b, 0xb4, 0xde, 0x01, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x6c, 0x8e, 0x3b, 0x8e, 0x83, 0x40, 0x10, 0x44, 0xf3, 0x3e, + 0x45, 0x9d, 0x60, 0x38, 0x00, 0xc9, 0x26, 0xbb, 0x12, 0xc9, 0x4a, 0x96, 0xb8, 0xc0, 0x30, 0xb4, 0xf1, 0x18, 0xe8, 0xc1, 0x74, 0xb7, 0x85, 0x64, 0xf9, 0xee, 0x16, 0xfe, 0x64, 0x4e, 0x5f, 0xe9, + 0x55, 0xd5, 0x12, 0xd3, 0x18, 0x07, 0xc6, 0xd1, 0x25, 0x59, 0x2e, 0xa2, 0x35, 0x51, 0x9e, 0x97, 0xb2, 0x1a, 0x72, 0x09, 0x17, 0x8f, 0xeb, 0xe8, 0x1a, 0x8c, 0xd5, 0xc2, 0xd9, 0x25, 0x5b, 0x38, + 0xbc, 0x50, 0x23, 0xc6, 0xc3, 0x1a, 0x77, 0xa5, 0x65, 0xb5, 0x9a, 0xe8, 0xe7, 0x7b, 0x42, 0x8b, 0x77, 0x53, 0x4e, 0x48, 0x53, 0x54, 0xc5, 0x7f, 0xb4, 0x7c, 0xe5, 0xbf, 0xf7, 0x58, 0xd3, 0x82, + 0x37, 0x63, 0xe9, 0x15, 0x1f, 0xb4, 0x2b, 0xb8, 0x11, 0x01, 0x40, 0x55, 0xe1, 0x77, 0xe3, 0xe4, 0xc6, 0xb0, 0x13, 0x43, 0xe3, 0xcc, 0xd8, 0x9f, 0x28, 0x3a, 0x37, 0x64, 0x81, 0x3c, 0xdb, 0x30, + 0x97, 0x9e, 0x03, 0xdd, 0xe9, 0x11, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4a, 0xa2, 0x67, 0x39, 0x94, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x3c, 0x90, 0xc1, 0x6a, 0xeb, 0x40, + 0x0c, 0x45, 0xf7, 0xfa, 0x0a, 0x43, 0x76, 0x86, 0xa7, 0xfc, 0x43, 0x5e, 0xbb, 0x68, 0xa1, 0xed, 0xc2, 0x50, 0xba, 0x2b, 0xca, 0x58, 0x71, 0x94, 0x8e, 0x47, 0x83, 0x24, 0x3b, 0xed, 0xdf, 0x97, + 0x71, 0x43, 0x36, 0x57, 0xe2, 0x70, 0xc4, 0x05, 0xed, 0xba, 0xc7, 0x94, 0xa5, 0x3a, 0x03, 0x56, 0xd3, 0x0b, 0xa7, 0x00, 0x4c, 0x99, 0xdc, 0x2b, 0xc5, 0x19, 0xd0, 0x39, 0x42, 0xca, 0xe4, 0x7b, + 0x38, 0x4a, 0xd9, 0x03, 0xec, 0xba, 0xa7, 0x12, 0x9c, 0xb3, 0x3c, 0x03, 0xca, 0xc8, 0x04, 0x3d, 0x4a, 0xb5, 0x96, 0x73, 0x6e, 0x79, 0xf5, 0xe6, 0xbc, 0x72, 0x1c, 0x98, 0x8a, 0x43, 0x39, 0xfe, + 0x4b, 0x5a, 0x4e, 0x32, 0x2d, 0x46, 0x21, 0x5a, 0xf0, 0x7b, 0xce, 0x4d, 0x78, 0x17, 0x5f, 0x28, 0x77, 0x43, 0x2c, 0xa3, 0x68, 0xf7, 0x5f, 0x47, 0x06, 0x5c, 0x3d, 0x6d, 0xf3, 0x44, 0x29, 0xd4, + 0x7e, 0xb6, 0x7e, 0xd8, 0x75, 0x6f, 0xc3, 0x07, 0xe0, 0xc3, 0xf0, 0x39, 0x84, 0x1a, 0xff, 0xdd, 0xce, 0xd0, 0xa3, 0x5f, 0xeb, 0x96, 0xda, 0x50, 0xa5, 0x48, 0x67, 0xe8, 0x51, 0x4d, 0x26, 0xe8, + 0xd1, 0xf8, 0xd2, 0xe8, 0x0b, 0xad, 0x5c, 0x20, 0xc8, 0x26, 0x8e, 0x3d, 0x54, 0x9d, 0x5b, 0x3b, 0x06, 0x4d, 0xf7, 0xdd, 0x38, 0x33, 0x39, 0x1f, 0x28, 0x7d, 0x2d, 0xf5, 0x4e, 0x57, 0x36, 0x17, + 0x2d, 0x7e, 0xc3, 0x37, 0xa9, 0xbd, 0xa7, 0xb2, 0x85, 0xb0, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x71, 0x75, + 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, + 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, + 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x44, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, + 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0xdd, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, + 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, + 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, + 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, + 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x57, 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, + 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xf9, 0xe7, 0xc1, 0xa0, 0x2c, 0x4b, 0x9f, 0x59, 0xc4, 0xbe, 0xa4, 0xf5, 0x20, 0xad, 0xf6, 0xaa, 0xc1, 0xdd, 0xf8, 0x76, 0x34, 0x99, + 0x8f, 0x2e, 0x3f, 0xf9, 0x57, 0xee, 0xd4, 0x42, 0xa4, 0xa8, 0x14, 0x10, 0xfe, 0xaf, 0xe0, 0x84, 0x31, 0x2c, 0xb7, 0xc0, 0xf2, 0x3c, 0xe5, 0x11, 0x5b, 0xa6, 0x08, 0x29, 0x2b, 0x2d, 0x3d, 0x6b, + 0x42, 0x8c, 0x41, 0x4b, 0x83, 0xba, 0x24, 0xae, 0xb9, 0x58, 0xf7, 0x41, 0xc9, 0x95, 0x2e, 0x19, 0xa1, 0x31, 0x13, 0x73, 0xa5, 0x89, 0x2f, 0x0b, 0x7d, 0x40, 0x5a, 0x8d, 0x91, 0xab, 0x83, 0x0d, + 0x52, 0x00, 0x13, 0xd0, 0x0d, 0xe6, 0x30, 0x9e, 0x77, 0xe1, 0x97, 0x60, 0x3e, 0x9e, 0xf7, 0x8d, 0x91, 0xa7, 0xf1, 0xc3, 0xaf, 0xd3, 0xc5, 0x03, 0x3c, 0x05, 0x61, 0x18, 0x4c, 0x1e, 0xc6, 0xa3, + 0x39, 0x4c, 0x43, 0xb8, 0x9d, 0x4e, 0x86, 0xe3, 0x87, 0xf1, 0x74, 0x32, 0x87, 0xe9, 0x17, 0x08, 0x26, 0x5f, 0xe1, 0x3f, 0xe3, 0xc9, 0xb0, 0x0f, 0xc8, 0x75, 0x82, 0x04, 0xf8, 0x62, 0x72, 0xab, + 0x0c, 0x4c, 0x6e, 0xe8, 0xc4, 0xd8, 0x72, 0x37, 0x47, 0x3c, 0x80, 0xb0, 0x92, 0x15, 0x24, 0x95, 0x63, 0xc4, 0x57, 0x3c, 0x82, 0x94, 0x89, 0x75, 0xc1, 0xd6, 0x08, 0x6b, 0xb9, 0x41, 0x12, 0x5c, + 0xac, 0x21, 0x47, 0xca, 0xb8, 0x32, 0x69, 0x55, 0xc0, 0x44, 0x6c, 0xcc, 0xa4, 0x3c, 0xe3, 0x9a, 0x69, 0x3b, 0x75, 0x12, 0x97, 0x71, 0x34, 0xe8, 0xf0, 0x2c, 0x97, 0xa4, 0xe1, 0x77, 0xb6, 0x61, + 0xbe, 0x40, 0xed, 0x5f, 0x5c, 0x1f, 0x4c, 0x71, 0x79, 0x3c, 0x23, 0xb8, 0xf4, 0xa3, 0x84, 0x09, 0x81, 0xa9, 0x3a, 0x5e, 0x2b, 0x34, 0x4f, 0xfd, 0x19, 0xc9, 0x1c, 0x49, 0x73, 0x54, 0xd7, 0x9d, + 0x4e, 0x5e, 0x2c, 0x53, 0x1e, 0x41, 0x94, 0x32, 0xa5, 0xe0, 0x9e, 0x6d, 0x50, 0x3c, 0x11, 0xcb, 0x73, 0xa4, 0xa1, 0x2c, 0x45, 0x2a, 0x99, 0xc1, 0xf4, 0xa3, 0xd3, 0x31, 0xc9, 0xcf, 0x89, 0x6f, + 0x98, 0x46, 0x50, 0x06, 0x71, 0x04, 0x2b, 0x5b, 0xe4, 0x73, 0x4d, 0x26, 0xb6, 0xa7, 0x30, 0x98, 0xcd, 0x46, 0xe1, 0xf3, 0xe3, 0x28, 0x9c, 0x8f, 0xa7, 0x13, 0xb8, 0x81, 0xee, 0x95, 0xff, 0x77, + 0xff, 0x1f, 0xdd, 0x6b, 0x7b, 0x74, 0x70, 0x71, 0x61, 0xff, 0x87, 0x0b, 0x18, 0xe2, 0x8a, 0x15, 0xa9, 0x86, 0x45, 0x78, 0x67, 0x32, 0x1e, 0x3b, 0x37, 0x36, 0xf0, 0xcc, 0xf8, 0xbf, 0x2c, 0x2b, + 0x00, 0xfe, 0xef, 0x8c, 0x60, 0x45, 0x32, 0xeb, 0x03, 0x5f, 0x81, 0x90, 0xf0, 0xa1, 0xde, 0xbb, 0xa0, 0xf4, 0x83, 0x49, 0x7a, 0x4e, 0x72, 0xc3, 0x63, 0x9b, 0x11, 0x6b, 0x7b, 0xf0, 0x87, 0x30, + 0x87, 0xa3, 0x2f, 0xc1, 0xe2, 0xee, 0xe1, 0x79, 0x38, 0x7d, 0x9a, 0xdc, 0x4d, 0x83, 0xe1, 0xb3, 0x41, 0x71, 0x03, 0x5d, 0x53, 0xd7, 0xea, 0xf3, 0x60, 0x40, 0x98, 0x4b, 0xdf, 0xa2, 0x68, 0xd6, + 0xb7, 0x9d, 0xf8, 0x34, 0xe0, 0x72, 0xa0, 0xd9, 0x77, 0x46, 0x7c, 0x70, 0x80, 0x73, 0xd0, 0xad, 0xdc, 0x03, 0xc0, 0xc7, 0x13, 0x1e, 0x3e, 0x42, 0xf7, 0x70, 0xf7, 0x65, 0xb7, 0x7d, 0x97, 0x89, + 0xb6, 0x7b, 0xdd, 0x39, 0x66, 0x6b, 0xc6, 0x4c, 0xe3, 0xca, 0x16, 0x76, 0xf2, 0x5d, 0x16, 0x6d, 0xdf, 0xf7, 0xa1, 0x4c, 0x78, 0x94, 0x40, 0x66, 0x45, 0x29, 0x92, 0xc2, 0xf5, 0x74, 0x83, 0x33, + 0x70, 0x47, 0xb6, 0xa0, 0x65, 0x6d, 0xdf, 0x68, 0x07, 0x17, 0x4a, 0x23, 0x8b, 0xeb, 0xce, 0x8f, 0x5d, 0x82, 0xa4, 0xc0, 0xf7, 0x13, 0x7b, 0x1f, 0x3c, 0x8e, 0x26, 0xcf, 0x75, 0x5c, 0xb3, 0x70, + 0x3a, 0x1b, 0x85, 0xa6, 0xc3, 0x9e, 0x67, 0xc1, 0xc3, 0xaf, 0x70, 0xb3, 0x63, 0xc8, 0x8c, 0xae, 0x9f, 0x6d, 0xc4, 0xa0, 0x66, 0xef, 0x5c, 0x54, 0xe7, 0xc8, 0x28, 0x13, 0x24, 0x3c, 0x53, 0x2d, + 0x25, 0x4f, 0x53, 0x58, 0x22, 0x28, 0xb6, 0xb1, 0x7a, 0xf2, 0x57, 0xf1, 0xff, 0x3b, 0x08, 0xff, 0x2c, 0xf0, 0xf6, 0xf4, 0x4d, 0x58, 0x86, 0x35, 0xaf, 0x3b, 0xf6, 0xab, 0x44, 0xa9, 0x44, 0x16, + 0x69, 0x6c, 0xd0, 0x16, 0xaa, 0x12, 0x3f, 0x23, 0x14, 0xc4, 0x63, 0x3c, 0xc8, 0xc2, 0xae, 0x3f, 0x0a, 0x4a, 0x77, 0x2a, 0x53, 0x3b, 0x7d, 0x77, 0x78, 0x2e, 0x21, 0x5f, 0x9f, 0x27, 0xc1, 0xfd, + 0x68, 0x17, 0xa6, 0x2b, 0x7e, 0x67, 0x6d, 0x41, 0x69, 0x1d, 0x81, 0x13, 0x05, 0x67, 0x69, 0x23, 0x79, 0x0c, 0x19, 0xe3, 0xc2, 0x73, 0xd6, 0x18, 0xad, 0xd5, 0x6f, 0xdf, 0x7a, 0xf0, 0x63, 0xc7, + 0xce, 0x7c, 0xab, 0x34, 0x66, 0xbe, 0x2c, 0xb4, 0x9f, 0x13, 0x17, 0x3a, 0x15, 0x5e, 0xf7, 0x12, 0x1a, 0x12, 0xa2, 0x34, 0x23, 0x8d, 0xb1, 0xbd, 0xbd, 0xdc, 0xf8, 0x62, 0x6e, 0xab, 0x25, 0x53, + 0x38, 0xe4, 0x84, 0x91, 0x96, 0xb4, 0x85, 0x1b, 0x10, 0x58, 0xda, 0x05, 0xcf, 0xfa, 0xb8, 0xfa, 0xd6, 0xd8, 0xdf, 0xee, 0x63, 0xa1, 0x0c, 0x22, 0x63, 0x06, 0xe2, 0xda, 0xce, 0x67, 0x30, 0x4d, + 0x76, 0x60, 0xda, 0x5f, 0xa3, 0x0e, 0x96, 0x4a, 0xa6, 0x85, 0x46, 0x53, 0x46, 0x5e, 0xaf, 0xe7, 0x62, 0xb5, 0x19, 0x1b, 0xc0, 0x78, 0xf5, 0x76, 0x8f, 0xe1, 0x0b, 0x57, 0x5a, 0xf5, 0x81, 0x4c, + 0xa7, 0x70, 0x6d, 0x04, 0x1c, 0xa2, 0x04, 0xa3, 0xef, 0x46, 0x9c, 0xf8, 0xae, 0xe3, 0x94, 0xb9, 0x46, 0x0b, 0xa5, 0x65, 0xd6, 0x34, 0xbe, 0x67, 0x18, 0x72, 0x46, 0x2c, 0x43, 0xbd, 0x4b, 0x5e, + 0x4d, 0x44, 0xd6, 0x90, 0x5e, 0x27, 0xd0, 0x5b, 0xbb, 0xd0, 0xe0, 0xe4, 0x20, 0xa2, 0xfe, 0xdb, 0x3d, 0xd7, 0x24, 0xae, 0xca, 0x9a, 0x29, 0xa0, 0x9b, 0x56, 0x05, 0xdc, 0x6f, 0xe5, 0x2b, 0xef, + 0x1c, 0x10, 0xbf, 0x62, 0xc0, 0xeb, 0x35, 0xf3, 0x5e, 0xc3, 0x1f, 0x8b, 0xbc, 0xd0, 0x73, 0x4d, 0xc8, 0xb2, 0xb3, 0x91, 0x34, 0xf7, 0xdc, 0x80, 0x28, 0xd2, 0xf4, 0xfa, 0xc0, 0x8e, 0xa6, 0xed, + 0x91, 0x65, 0x33, 0xde, 0x69, 0xcd, 0x51, 0xd4, 0x98, 0x3d, 0x1b, 0x48, 0xef, 0xfa, 0xc4, 0xc9, 0xfe, 0x46, 0x6c, 0xf3, 0x67, 0xa6, 0x2b, 0x17, 0xfb, 0x09, 0xaf, 0xc5, 0x4a, 0xfb, 0x51, 0xdf, + 0x74, 0xc0, 0x59, 0x30, 0x0d, 0xc0, 0x2d, 0x16, 0xab, 0x94, 0x9d, 0xb1, 0xbb, 0x46, 0x5d, 0x5b, 0xf2, 0xce, 0xf6, 0x77, 0xdf, 0xd8, 0x38, 0xb2, 0xfc, 0x0a, 0x11, 0xd3, 0x51, 0x02, 0xde, 0x78, + 0x3a, 0xb2, 0x8f, 0x45, 0xf3, 0xd0, 0xc4, 0xe3, 0xb4, 0xc2, 0xd9, 0x96, 0x1b, 0x85, 0xe1, 0x34, 0x04, 0x13, 0x96, 0x29, 0xab, 0x0f, 0xa6, 0xd7, 0xde, 0x96, 0xff, 0x8f, 0xd0, 0xfd, 0xd0, 0x3d, + 0x01, 0x61, 0x05, 0x2a, 0x6d, 0xcb, 0x79, 0x7b, 0x25, 0xc0, 0xdb, 0xf5, 0xd9, 0x2c, 0x88, 0x9f, 0xaa, 0xfa, 0x6a, 0x0b, 0xa9, 0x1e, 0xef, 0x30, 0xe3, 0x47, 0xa9, 0x54, 0xd8, 0x96, 0x69, 0x33, + 0x5e, 0x4f, 0x66, 0xdf, 0xcf, 0x2b, 0x38, 0xcd, 0x59, 0x0b, 0x49, 0x08, 0xbe, 0xef, 0x9f, 0xda, 0xea, 0xb4, 0xff, 0xf5, 0xfa, 0x4e, 0xc9, 0x35, 0x99, 0x31, 0x6f, 0xa7, 0x4a, 0x0a, 0xab, 0x1a, + 0x38, 0x14, 0x1c, 0x59, 0xe8, 0xbc, 0xd0, 0x6f, 0x4a, 0xcc, 0xa9, 0x68, 0x1e, 0x8b, 0x4e, 0x7d, 0x51, 0xf6, 0x0e, 0x24, 0xe4, 0xa7, 0xbd, 0x6d, 0x5b, 0xa5, 0x8c, 0x50, 0xd8, 0xbf, 0xbc, 0xde, + 0x59, 0x15, 0xf9, 0x83, 0x63, 0xd9, 0xf7, 0x98, 0x53, 0xcb, 0xb1, 0x33, 0x4c, 0x9c, 0x4d, 0xfb, 0xae, 0x7c, 0x23, 0x42, 0x66, 0xbe, 0x33, 0x1c, 0x0f, 0xfb, 0xcb, 0xa3, 0x2a, 0xe8, 0x37, 0xa0, + 0x9c, 0x90, 0xd2, 0x5e, 0xdf, 0x7f, 0x29, 0x65, 0x5a, 0x56, 0x09, 0x3b, 0x74, 0x7f, 0x72, 0x71, 0xd5, 0x06, 0x4f, 0x1b, 0xa5, 0x7e, 0x2e, 0x98, 0xa3, 0x5f, 0x48, 0x66, 0x8b, 0xf0, 0xce, 0x2b, + 0x28, 0xed, 0x37, 0x2c, 0x1e, 0x01, 0x6d, 0x03, 0x35, 0x94, 0x02, 0x8f, 0x03, 0x72, 0xfb, 0xf0, 0x85, 0x6b, 0xef, 0xaa, 0xb1, 0xb6, 0xab, 0xfa, 0x87, 0x84, 0x64, 0x69, 0x3f, 0xeb, 0x4e, 0x6a, + 0xfe, 0x8c, 0x8e, 0x10, 0x49, 0xda, 0x21, 0xe6, 0x62, 0x7d, 0xec, 0x12, 0xab, 0xdd, 0x73, 0xcd, 0xa2, 0xef, 0x0f, 0xc4, 0xa2, 0x93, 0x5e, 0x6c, 0x62, 0xfa, 0x5b, 0x13, 0x53, 0xa7, 0xfa, 0xd7, + 0xfe, 0x77, 0xf4, 0x2e, 0xb2, 0xaf, 0x99, 0x36, 0x9a, 0xf6, 0xd7, 0x64, 0xf5, 0xab, 0x5f, 0xf5, 0x49, 0x8c, 0x4a, 0x73, 0x61, 0xbf, 0xd1, 0x7a, 0xa0, 0x4d, 0x8c, 0x0a, 0xf6, 0xed, 0xfd, 0xa3, + 0x51, 0xf7, 0xe0, 0x39, 0x3c, 0x6b, 0xd4, 0x28, 0x36, 0x5e, 0xf7, 0xfe, 0x71, 0xf2, 0xf4, 0xbc, 0x98, 0x8f, 0x42, 0xa3, 0xca, 0xdd, 0x5e, 0x2d, 0x4b, 0xf0, 0xf3, 0xcf, 0xd0, 0xb6, 0x73, 0x16, + 0xcc, 0xe7, 0x4f, 0xd3, 0x70, 0xb8, 0xdf, 0x79, 0xc2, 0xa3, 0x83, 0xa8, 0x90, 0x84, 0x79, 0x59, 0xde, 0xb4, 0xda, 0xd9, 0x7b, 0x3c, 0x64, 0x2b, 0x4a, 0x18, 0xfd, 0xf6, 0x0d, 0x72, 0xa6, 0x54, + 0x29, 0x29, 0x3e, 0x73, 0x7a, 0x8f, 0xc2, 0xd7, 0xf2, 0x36, 0x61, 0x14, 0x10, 0xb1, 0xed, 0x31, 0xf3, 0x41, 0xa1, 0x13, 0x14, 0x9a, 0x47, 0x4c, 0x4b, 0xf2, 0x15, 0x6a, 0xf7, 0x59, 0xe7, 0x19, + 0x25, 0x39, 0x58, 0xf4, 0xda, 0x5a, 0xf6, 0x5f, 0x53, 0xf7, 0xd6, 0x3d, 0x59, 0xc9, 0x49, 0x6a, 0x8c, 0xcc, 0x67, 0xfc, 0xcc, 0xe1, 0x6c, 0x58, 0x33, 0x8c, 0xdb, 0x76, 0x6c, 0x5b, 0x69, 0x75, + 0x64, 0x06, 0xa1, 0x2e, 0x48, 0x54, 0x17, 0x78, 0xfb, 0xc9, 0x9a, 0xd0, 0xfe, 0x8e, 0x9c, 0x16, 0xd1, 0x3f, 0x92, 0xe4, 0x93, 0x72, 0x33, 0xc3, 0xbc, 0xa8, 0x4b, 0x5c, 0x2a, 0xae, 0x6b, 0x55, + 0x75, 0x0d, 0x58, 0x65, 0xae, 0x71, 0x26, 0x44, 0x16, 0x9b, 0x66, 0xf9, 0x65, 0xab, 0xf1, 0xb6, 0xfa, 0x5a, 0x07, 0x5a, 0x46, 0xfb, 0x0d, 0xb4, 0x8c, 0xe0, 0x06, 0x6e, 0xeb, 0x0f, 0x79, 0x81, + 0xa5, 0xfb, 0xed, 0x39, 0x07, 0xbe, 0xcc, 0x51, 0xb8, 0xb7, 0x4e, 0xef, 0xe8, 0x5d, 0x3d, 0xb5, 0xdd, 0xee, 0x6e, 0xc3, 0x95, 0x54, 0x0d, 0x89, 0x6f, 0x2e, 0x79, 0xcd, 0xe2, 0xde, 0x5b, 0x58, + 0x49, 0xfb, 0xba, 0xa8, 0xfd, 0xf5, 0x7c, 0x4d, 0x4c, 0xa8, 0x15, 0x92, 0x69, 0x15, 0x8f, 0x96, 0x51, 0x1f, 0xae, 0xfa, 0x70, 0x27, 0xc5, 0xda, 0xbf, 0x0f, 0xfe, 0xfb, 0xfc, 0x18, 0xdc, 0x2d, + 0x46, 0x47, 0xc7, 0x4f, 0xae, 0x4e, 0x5a, 0x46, 0x87, 0x93, 0xaf, 0x9d, 0xce, 0x6b, 0xe7, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, + 0x00, 0x4d, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, + 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, 0xf1, 0x7d, 0xef, + 0x92, 0x17, 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, 0x21, 0x8d, 0x0a, 0x9e, 0x5e, 0x9c, 0xe9, 0xa6, 0x3b, 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, 0xce, 0xe1, 0x3a, + 0x3e, 0x43, 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, 0x0f, 0x79, 0xa5, 0x0c, 0x31, 0x39, 0x4d, 0x09, 0xc5, 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, 0x69, 0x93, 0x25, + 0xa8, 0x45, 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, 0x2e, 0x66, 0xc9, 0xff, 0x9e, 0xd3, 0xc2, 0x21, 0x37, 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, 0xb0, 0xc3, 0xb0, + 0x36, 0xaa, 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x9c, 0x55, 0xdb, 0x8e, 0xdb, 0x46, 0x0c, 0x7d, 0x9f, 0xaf, 0x60, 0xe5, 0x00, 0xb9, 0x20, 0x96, 0x37, + 0x0f, 0x01, 0x02, 0x03, 0x9b, 0x62, 0x2f, 0xde, 0xc4, 0xa9, 0x77, 0x93, 0x3a, 0x72, 0x8a, 0x00, 0x06, 0x2c, 0x7a, 0x44, 0x4b, 0xe3, 0x1d, 0xcd, 0xa8, 0x73, 0x91, 0x63, 0x04, 0xe9, 0xb7, 0x17, + 0x23, 0xf9, 0xba, 0xeb, 0x14, 0x6d, 0xdf, 0xec, 0x21, 0x79, 0x48, 0x1e, 0x1e, 0x52, 0x1d, 0xb8, 0xf1, 0x8a, 0x3b, 0xa1, 0x15, 0x54, 0x46, 0x2f, 0x89, 0x3b, 0xc6, 0xfe, 0x20, 0xc9, 0x75, 0x49, + 0xe0, 0x34, 0xac, 0xb5, 0x37, 0xa0, 0x68, 0x05, 0xbf, 0x7b, 0x34, 0xf7, 0xde, 0xc2, 0xe2, 0x81, 0xf7, 0x2f, 0x8c, 0x25, 0x85, 0xb0, 0x60, 0xb1, 0xac, 0x24, 0x6d, 0x5f, 0x81, 0x6b, 0xe5, 0x50, + 0x28, 0x0b, 0x08, 0x56, 0xa8, 0x5c, 0xd2, 0x2e, 0xb0, 0x0f, 0xe9, 0xf6, 0xa7, 0x8d, 0xb7, 0xb9, 0xe3, 0xed, 0xd3, 0xb3, 0xe7, 0xe9, 0x4b, 0xe6, 0x8a, 0xbd, 0x3b, 0x2c, 0xbd, 0x75, 0x60, 0xc8, + 0x79, 0xa3, 0x2c, 0x08, 0x67, 0x01, 0x4d, 0xee, 0x4b, 0x52, 0x2e, 0x66, 0xac, 0xd3, 0x81, 0x91, 0xe6, 0x28, 0x81, 0xbe, 0x11, 0xf7, 0xc1, 0x9d, 0xdd, 0xe2, 0x3d, 0x81, 0xf5, 0x86, 0xc0, 0x15, + 0xe8, 0x20, 0xfd, 0x80, 0x35, 0xc2, 0xab, 0x57, 0xf0, 0xf9, 0xfa, 0xb7, 0x14, 0x84, 0x05, 0xa1, 0xac, 0x43, 0x29, 0x29, 0x8b, 0x19, 0x4b, 0x34, 0x58, 0x87, 0xc6, 0x81, 0x25, 0x53, 0x93, 0x01, + 0x19, 0xb0, 0xe4, 0x1a, 0x8c, 0x57, 0x90, 0xc6, 0xbd, 0xb2, 0x56, 0x2b, 0xf8, 0xb3, 0xed, 0xbb, 0x9f, 0x51, 0x9d, 0xc6, 0x2c, 0x29, 0x08, 0xb8, 0x2e, 0x4b, 0x54, 0x59, 0x1b, 0x6a, 0xa1, 0x70, + 0xae, 0xda, 0x02, 0x84, 0x67, 0xf4, 0x4e, 0x97, 0xe8, 0x44, 0x0b, 0xb5, 0x42, 0xc7, 0x0b, 0xb2, 0xb0, 0xd0, 0x06, 0x78, 0x81, 0x2a, 0x27, 0x0b, 0x7a, 0x01, 0x56, 0x7b, 0xc3, 0x03, 0x54, 0x46, + 0x31, 0x1b, 0x1e, 0xfd, 0xdf, 0xb9, 0x05, 0x16, 0xda, 0xdf, 0xb0, 0x12, 0x52, 0xc2, 0xbc, 0x61, 0xb7, 0xc2, 0x1c, 0x1d, 0x65, 0x61, 0x36, 0xc6, 0x2b, 0x25, 0x54, 0xbe, 0x49, 0x1e, 0xc3, 0xd0, + 0x01, 0x4a, 0xab, 0x41, 0x57, 0xa4, 0x2c, 0x64, 0x34, 0xf7, 0x79, 0x1e, 0xec, 0x95, 0x36, 0x0e, 0xd2, 0xd7, 0x67, 0x67, 0xaf, 0x53, 0x66, 0xf5, 0xc6, 0x40, 0x06, 0x38, 0xaa, 0x00, 0x8a, 0xce, + 0x21, 0x2f, 0x28, 0x03, 0xb1, 0x00, 0x45, 0x94, 0x6d, 0xa9, 0x09, 0x2c, 0x38, 0xb2, 0xee, 0x24, 0x2d, 0xc1, 0x90, 0xb6, 0x13, 0x08, 0x9c, 0x34, 0x23, 0x4d, 0xe1, 0x6a, 0x34, 0x64, 0x6c, 0xe8, + 0x9e, 0x5a, 0x30, 0x14, 0x68, 0x22, 0x95, 0xb5, 0xa5, 0x5a, 0x72, 0x90, 0xde, 0x4c, 0xee, 0xae, 0x66, 0xe3, 0xc1, 0xbb, 0xe1, 0xe7, 0x64, 0xfc, 0x35, 0x05, 0x52, 0xb5, 0x30, 0x5a, 0x85, 0x51, + 0x42, 0x8d, 0x46, 0xe0, 0x5c, 0x52, 0xcc, 0xd2, 0x34, 0xb5, 0x05, 0x49, 0x09, 0x96, 0x1b, 0x51, 0x39, 0xd6, 0x01, 0x43, 0x95, 0x44, 0x4e, 0xf0, 0x57, 0x2f, 0x9e, 0xa3, 0x2d, 0x0c, 0x87, 0xf9, + 0xba, 0xd5, 0x65, 0xeb, 0x68, 0x38, 0x2c, 0x84, 0xa4, 0x03, 0xcf, 0x4c, 0xf3, 0x7b, 0x32, 0xb1, 0xd0, 0xbd, 0xa5, 0x2e, 0x54, 0xa6, 0x03, 0x81, 0xae, 0x68, 0x63, 0x0c, 0xe5, 0xc2, 0x3a, 0xb3, + 0x66, 0xf4, 0xad, 0xe1, 0xe5, 0xa8, 0xa8, 0xf3, 0x47, 0x91, 0x8c, 0x78, 0xa1, 0x21, 0xfa, 0x77, 0xce, 0x11, 0xbc, 0x7d, 0x7b, 0x50, 0x66, 0xe8, 0x25, 0x30, 0xd4, 0x81, 0x4b, 0x2f, 0x64, 0x26, + 0x54, 0xbe, 0xd9, 0x95, 0xad, 0x82, 0xe6, 0xe1, 0xd9, 0xc2, 0xc7, 0xab, 0x21, 0x88, 0x12, 0x73, 0x6a, 0x54, 0x72, 0x28, 0xfe, 0x98, 0x3d, 0xe2, 0x23, 0x98, 0xda, 0xc0, 0x16, 0xfe, 0x72, 0x0d, + 0x19, 0x2d, 0xd0, 0x4b, 0xf7, 0x12, 0x3e, 0x7c, 0xb9, 0x6d, 0x4d, 0x41, 0xe8, 0xde, 0x86, 0x41, 0x26, 0x1a, 0x48, 0x05, 0x66, 0x41, 0xa1, 0x13, 0x35, 0x6d, 0xec, 0x61, 0x1e, 0x0b, 0x2d, 0xa5, + 0x5e, 0x05, 0x81, 0x9c, 0x9a, 0x84, 0x0d, 0x63, 0x6b, 0xc6, 0x1a, 0xaf, 0xb1, 0x94, 0x69, 0x3f, 0xa4, 0x0b, 0xbf, 0x58, 0x83, 0x30, 0x50, 0xb5, 0xed, 0xb3, 0x2e, 0x28, 0x2c, 0xa9, 0x0f, 0x97, + 0x9f, 0x66, 0x77, 0x17, 0xc9, 0xf0, 0xcb, 0x60, 0x36, 0xbc, 0xbd, 0x78, 0x37, 0x60, 0x00, 0x35, 0x4a, 0x4f, 0x7d, 0x88, 0x9c, 0xf1, 0x14, 0x1d, 0xfa, 0xdd, 0x5e, 0x7c, 0x19, 0xdc, 0xcd, 0x2e, + 0x27, 0xc3, 0x51, 0x32, 0xbb, 0x18, 0x27, 0xc3, 0x9b, 0x8b, 0xab, 0x64, 0xef, 0xbf, 0xcb, 0x07, 0x0e, 0x4d, 0x4e, 0xae, 0xd7, 0x56, 0xdd, 0x6d, 0xf7, 0xc3, 0xf6, 0x5e, 0x9c, 0x86, 0xba, 0x9e, + 0x5d, 0x8c, 0xdf, 0x4d, 0x6e, 0x07, 0x77, 0xc9, 0xe7, 0x3d, 0x56, 0x85, 0xfc, 0x3e, 0x90, 0xda, 0xbd, 0xb6, 0xf7, 0xa2, 0x4a, 0xc8, 0x3a, 0x7b, 0x1e, 0xca, 0x81, 0xee, 0x75, 0x89, 0x35, 0xa9, + 0x78, 0x89, 0x35, 0x66, 0x9a, 0xc7, 0xc1, 0xbc, 0xb5, 0x6c, 0xd6, 0x3d, 0xde, 0x04, 0xc7, 0x6e, 0x5d, 0xd1, 0xf9, 0x71, 0x11, 0x3f, 0xeb, 0xfa, 0x61, 0x25, 0xb3, 0x9b, 0xe1, 0xe8, 0x80, 0x8a, + 0x0d, 0x48, 0x33, 0xe8, 0x18, 0x4d, 0xfe, 0xcf, 0x38, 0xa7, 0xc8, 0x79, 0xfa, 0xa2, 0x1b, 0x56, 0x9e, 0x4c, 0xbc, 0x44, 0xf3, 0x94, 0xed, 0xe5, 0x35, 0x6e, 0x0f, 0xc1, 0x03, 0x75, 0x19, 0xaf, + 0xec, 0x4e, 0x4d, 0xbb, 0x25, 0x16, 0x0a, 0x70, 0x7b, 0x9d, 0xc9, 0x30, 0x1f, 0xae, 0x73, 0xe3, 0xd5, 0x2a, 0x90, 0x1b, 0x6a, 0xce, 0x0b, 0xce, 0x75, 0x7d, 0x62, 0x1b, 0x1b, 0x28, 0xe3, 0xd5, + 0x3e, 0xf7, 0x35, 0x55, 0x52, 0xaf, 0x1f, 0x65, 0xb7, 0x9b, 0x9b, 0xd5, 0xa8, 0x2d, 0x54, 0x93, 0x35, 0x7e, 0x47, 0xea, 0x06, 0xa1, 0x9c, 0x06, 0x2e, 0xbd, 0x75, 0x64, 0x7e, 0x26, 0xf5, 0x4d, + 0x5c, 0xa7, 0x3d, 0x6d, 0xce, 0x88, 0x70, 0xba, 0xec, 0xe1, 0x06, 0x74, 0x0e, 0x3e, 0x61, 0x42, 0xd5, 0x9a, 0x63, 0xf3, 0x21, 0x60, 0xd7, 0x1a, 0x94, 0x0e, 0x32, 0x0f, 0x42, 0xda, 0x1d, 0xa1, + 0xc9, 0x78, 0x94, 0xee, 0x44, 0x1e, 0x5e, 0x43, 0x45, 0x46, 0x7b, 0x47, 0xe1, 0x2e, 0x37, 0x27, 0xe2, 0x60, 0xfb, 0xbe, 0x6a, 0x0f, 0x4d, 0xf4, 0xce, 0x69, 0xbe, 0x3e, 0x58, 0x9c, 0x4d, 0xb3, + 0x3f, 0xe1, 0x49, 0xa8, 0x85, 0xde, 0x13, 0xc5, 0x27, 0xe3, 0xd1, 0xe3, 0x1e, 0x27, 0xe3, 0xd1, 0x79, 0xf8, 0x82, 0xf4, 0x7b, 0xbd, 0x66, 0x42, 0x85, 0xb6, 0xae, 0xff, 0xe6, 0xec, 0xcd, 0x59, + 0x8f, 0x71, 0x6f, 0x24, 0x74, 0x6b, 0x78, 0xf2, 0x7d, 0x32, 0x1e, 0xfd, 0x80, 0x29, 0x03, 0xe8, 0xbe, 0x87, 0xe8, 0x4a, 0x2b, 0x47, 0xca, 0x75, 0x93, 0x75, 0x45, 0x7d, 0xac, 0x2a, 0x29, 0xda, + 0x86, 0x7b, 0x4b, 0xab, 0x55, 0xd4, 0xba, 0x65, 0x10, 0x7d, 0x9f, 0x46, 0x25, 0x59, 0x8b, 0x39, 0x4d, 0xa3, 0x3e, 0x4c, 0xa3, 0x27, 0xcf, 0x56, 0x85, 0xc6, 0x52, 0x3c, 0x9f, 0x46, 0x3f, 0xa6, + 0x51, 0xc4, 0x3a, 0xf0, 0x71, 0xdc, 0x64, 0x8f, 0x4e, 0xa7, 0xff, 0x75, 0x13, 0x7d, 0xbe, 0x0b, 0x8c, 0x1e, 0x56, 0xb4, 0xef, 0xed, 0x7d, 0x92, 0x7c, 0x12, 0xf4, 0x9f, 0xba, 0x6b, 0x3e, 0x9b, + 0xc7, 0xdd, 0x3d, 0xca, 0xf8, 0xbf, 0x8a, 0x3c, 0x06, 0x6e, 0x6a, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x25, 0xb5, 0xab, 0x10, 0x02, 0x04, 0x00, 0x00, 0xe4, 0x08, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6b, 0x93, 0x1a, 0xb7, 0x96, 0xdf, 0xfb, 0x57, 0x9c, 0x34, 0xac, 0x01, 0x17, 0xdd, + 0xd8, 0xbe, 0x75, 0x73, 0xb3, 0x33, 0x4b, 0x6a, 0x31, 0xc3, 0xd8, 0x38, 0xf3, 0x5a, 0x98, 0xf1, 0x38, 0x95, 0xc9, 0x4e, 0x89, 0x6e, 0x01, 0xf2, 0x34, 0x52, 0x47, 0x52, 0x83, 0xb9, 0xb1, 0xff, + 0xfb, 0xd6, 0x91, 0xd4, 0x2f, 0xc0, 0x8e, 0xb3, 0x1e, 0x4f, 0x2a, 0x65, 0x5a, 0x7d, 0x74, 0x74, 0xde, 0x2f, 0x75, 0xe3, 0x87, 0xde, 0x8c, 0xf1, 0x9e, 0x5a, 0x7a, 0x0d, 0x08, 0x1e, 0xf1, 0xcf, + 0x6b, 0xc0, 0x19, 0x8b, 0x28, 0x57, 0x34, 0x06, 0x2d, 0x40, 0x2f, 0x29, 0x0c, 0x52, 0x12, 0x2d, 0x29, 0x4c, 0xc5, 0x5c, 0x6f, 0x88, 0xa4, 0x70, 0x2a, 0x32, 0x1e, 0x13, 0xcd, 0x04, 0x87, 0xf6, + 0x60, 0x7a, 0xda, 0x81, 0x8c, 0xc7, 0x54, 0x82, 0xe0, 0xd4, 0x6b, 0x80, 0x90, 0xb0, 0x12, 0x92, 0x42, 0x24, 0xb8, 0x96, 0x6c, 0x96, 0x69, 0x21, 0x21, 0xb1, 0x08, 0x81, 0x2c, 0x24, 0xa5, 0x2b, + 0xca, 0xb5, 0x0a, 0x01, 0xa6, 0x94, 0x1a, 0xec, 0x17, 0x97, 0xd7, 0xe3, 0xe1, 0x08, 0xe6, 0x2c, 0xc1, 0xed, 0x31, 0x53, 0x76, 0x1b, 0x8d, 0x61, 0xc3, 0xf4, 0x12, 0xf4, 0x92, 0x29, 0xd8, 0x08, + 0xf9, 0x00, 0x73, 0x21, 0x81, 0xc4, 0x31, 0xc3, 0x83, 0x49, 0x02, 0x8c, 0xcf, 0x85, 0x5c, 0x19, 0x32, 0xbc, 0x06, 0x48, 0xba, 0x20, 0x32, 0x66, 0x7c, 0x01, 0x91, 0x48, 0xb7, 0x92, 0x2d, 0x96, + 0x1a, 0xc4, 0x86, 0x53, 0xa9, 0x96, 0x2c, 0x0d, 0x01, 0xae, 0x91, 0x8f, 0xe9, 0x69, 0x4e, 0x8a, 0xb2, 0x78, 0xdd, 0xa1, 0x5a, 0xc0, 0x56, 0x64, 0x8e, 0x8d, 0x0a, 0xc7, 0x4e, 0x10, 0x5d, 0x78, + 0x4b, 0xa5, 0x42, 0x76, 0x5f, 0x84, 0xcf, 0xa0, 0xad, 0x97, 0xb8, 0xc7, 0x77, 0x2f, 0xfd, 0xce, 0xb1, 0xd9, 0xbc, 0x22, 0x5b, 0xe0, 0x42, 0x43, 0xa6, 0x68, 0x89, 0x1b, 0xe8, 0x87, 0x88, 0xa6, + 0x1a, 0x18, 0x87, 0x48, 0xac, 0xd2, 0x84, 0x11, 0x1e, 0xe1, 0x66, 0xc7, 0x59, 0x71, 0x42, 0x08, 0xf0, 0xab, 0xc3, 0x21, 0x66, 0x9a, 0x30, 0x0e, 0xc4, 0xf0, 0x01, 0x62, 0x5e, 0x05, 0x03, 0xa2, + 0xbd, 0x86, 0xd7, 0x00, 0x00, 0x58, 0x6a, 0x9d, 0x1e, 0xf5, 0x7a, 0x9b, 0xcd, 0x26, 0x24, 0x86, 0xd8, 0x50, 0xc8, 0x45, 0x2f, 0xe7, 0xae, 0x77, 0x36, 0x1e, 0x8e, 0x2e, 0xa6, 0xa3, 0xe0, 0x45, + 0xf8, 0xcc, 0xec, 0xb8, 0xe1, 0x09, 0x55, 0x0a, 0x24, 0xfd, 0x23, 0x63, 0x92, 0xc6, 0x30, 0xdb, 0x02, 0x49, 0xd3, 0x84, 0x45, 0x64, 0x96, 0x50, 0x48, 0xc8, 0x06, 0xf5, 0x66, 0xd4, 0x63, 0xb4, + 0xce, 0x38, 0x6c, 0x24, 0xd3, 0x8c, 0x2f, 0xba, 0x5e, 0x03, 0x54, 0xae, 0xf8, 0xaa, 0x72, 0x4a, 0x61, 0xe5, 0xc4, 0x31, 0x55, 0x03, 0x10, 0x1c, 0x08, 0x6a, 0xc6, 0x1f, 0x4c, 0x61, 0x3c, 0xf5, + 0xe1, 0xe5, 0x60, 0x3a, 0x9e, 0x76, 0xe1, 0x76, 0x7c, 0xfd, 0xfa, 0xf2, 0xe6, 0x1a, 0x6e, 0x07, 0x93, 0xc9, 0xe0, 0xe2, 0x7a, 0x3c, 0x9a, 0xc2, 0xe5, 0x04, 0x86, 0x97, 0x17, 0x27, 0xe3, 0xeb, + 0xf1, 0xe5, 0xc5, 0x14, 0x2e, 0x4f, 0x61, 0x70, 0xf1, 0xab, 0xd7, 0x80, 0x5f, 0xc6, 0x17, 0x27, 0x5d, 0xa0, 0x4c, 0x2f, 0xa9, 0x04, 0xfa, 0x21, 0x95, 0xc8, 0x81, 0x90, 0xc0, 0x50, 0x90, 0x34, + 0xae, 0x98, 0x50, 0x4e, 0x01, 0x5a, 0x88, 0xd5, 0x8e, 0x4a, 0x69, 0xc4, 0xe6, 0x2c, 0x82, 0x84, 0xf0, 0x45, 0x46, 0x16, 0x14, 0x16, 0x62, 0x4d, 0x25, 0x47, 0x03, 0x49, 0xa9, 0x5c, 0x31, 0x85, + 0xfa, 0x54, 0x40, 0x78, 0x0c, 0x09, 0x5b, 0x31, 0x6d, 0xec, 0x48, 0x79, 0x8d, 0x7d, 0xbe, 0xc2, 0xc7, 0x76, 0xb0, 0xc7, 0xc6, 0xd7, 0xc8, 0xcd, 0xf5, 0x9c, 0xac, 0x29, 0x87, 0x5b, 0x49, 0xd2, + 0x94, 0x4a, 0x50, 0x9a, 0x48, 0x9d, 0xa5, 0x30, 0x23, 0x3a, 0x5a, 0x82, 0x8a, 0x24, 0x4b, 0x75, 0x17, 0xd6, 0xce, 0x92, 0xff, 0x11, 0xe6, 0xa6, 0x31, 0xc9, 0x6d, 0x62, 0x74, 0xf1, 0x16, 0xd6, + 0x44, 0xaa, 0xa3, 0x83, 0x04, 0x1a, 0xb3, 0x7b, 0x33, 0x78, 0x3b, 0xb8, 0x7f, 0x7d, 0x79, 0x3e, 0x82, 0x00, 0x12, 0x11, 0xd9, 0x18, 0x20, 0xe6, 0x40, 0xe0, 0xcd, 0xc9, 0x2f, 0xb0, 0x14, 0x2b, + 0xb4, 0x11, 0x69, 0xd0, 0x5e, 0xa6, 0xce, 0x4f, 0x73, 0xb4, 0x87, 0xb0, 0x1a, 0xa4, 0xe7, 0x83, 0xb7, 0xa3, 0x8b, 0xfb, 0xcb, 0xab, 0xeb, 0x29, 0x04, 0x90, 0x12, 0x49, 0x56, 0x54, 0x53, 0xa9, + 0x20, 0x25, 0xaa, 0x12, 0x84, 0xde, 0x90, 0x35, 0x81, 0xb7, 0xe7, 0xb0, 0x59, 0x52, 0x0e, 0x32, 0xe3, 0x46, 0x95, 0x86, 0x63, 0xeb, 0x10, 0x40, 0xc3, 0x45, 0x88, 0xc0, 0x31, 0x9d, 0x65, 0xee, + 0x0d, 0x30, 0xad, 0x68, 0x32, 0xef, 0xa2, 0x53, 0x3a, 0x28, 0x00, 0x45, 0x75, 0xe5, 0xc8, 0x7e, 0xf0, 0xce, 0x6e, 0x08, 0xde, 0xc9, 0x8c, 0xbf, 0x8f, 0x37, 0xe9, 0x91, 0x96, 0x84, 0xab, 0x54, + 0x48, 0xdd, 0x8f, 0xf5, 0xbd, 0x12, 0xd1, 0x03, 0xd5, 0x5d, 0x45, 0xe5, 0x9a, 0xca, 0xfe, 0xb6, 0xab, 0x32, 0x95, 0x52, 0x1e, 0xf7, 0xb7, 0x5d, 0x12, 0xc7, 0x68, 0x91, 0xfd, 0x9f, 0x9e, 0x3d, + 0x7b, 0x56, 0xe1, 0x63, 0xfa, 0xcb, 0xf8, 0xea, 0x7e, 0x32, 0x84, 0x00, 0xe6, 0x09, 0x59, 0x18, 0x82, 0x98, 0xb2, 0x5e, 0x26, 0x88, 0x09, 0x50, 0x62, 0x0e, 0x2b, 0xa4, 0x4e, 0x46, 0x26, 0x46, + 0x1c, 0x14, 0xcc, 0x37, 0xfc, 0x79, 0x1e, 0x9b, 0xc3, 0x6f, 0x10, 0xfc, 0x1b, 0xfc, 0x66, 0x8d, 0x24, 0x1f, 0x7e, 0x87, 0x63, 0x94, 0x25, 0xf7, 0x3c, 0x00, 0x0b, 0x34, 0x87, 0x5e, 0xa6, 0x64, + 0x0f, 0x75, 0x99, 0xf4, 0xa8, 0x8e, 0x7a, 0x39, 0x65, 0x05, 0x28, 0x8a, 0x2c, 0xfc, 0x0c, 0x94, 0x07, 0x30, 0x67, 0x35, 0x64, 0x5f, 0x42, 0xf1, 0xa5, 0x8d, 0x7e, 0x13, 0xad, 0xaa, 0x17, 0xba, + 0xf7, 0xfe, 0xee, 0xe6, 0xdd, 0xf7, 0x0e, 0x01, 0xfe, 0xdf, 0x80, 0xcb, 0x69, 0xe9, 0xef, 0x2a, 0x4b, 0x51, 0x75, 0x21, 0x40, 0x73, 0x4d, 0x24, 0xdc, 0xaf, 0x32, 0xa5, 0xef, 0x61, 0x46, 0x8d, + 0xda, 0xb5, 0xc8, 0xc3, 0x89, 0x96, 0x19, 0xc5, 0x58, 0x32, 0x27, 0x09, 0x7a, 0x78, 0xb4, 0x5d, 0x6c, 0x18, 0xef, 0x9b, 0xa7, 0x63, 0x2f, 0x26, 0xb2, 0xf2, 0xb4, 0x62, 0x7c, 0xb1, 0xb1, 0x0f, + 0x5e, 0x44, 0x14, 0x05, 0xbf, 0xd9, 0xce, 0x38, 0x59, 0xd1, 0x8e, 0x0f, 0x0c, 0xe9, 0x1b, 0xfe, 0xfa, 0xea, 0x76, 0x7c, 0xf1, 0xb4, 0x03, 0x0e, 0x8b, 0xc1, 0x7d, 0x7c, 0xec, 0x01, 0x9c, 0x8f, + 0x2f, 0x5e, 0xdd, 0x3e, 0xed, 0x80, 0x45, 0x81, 0xeb, 0x66, 0xf9, 0xc4, 0xe0, 0x7f, 0xda, 0x01, 0x77, 0x10, 0xbe, 0x30, 0x7c, 0x36, 0xe0, 0x46, 0x51, 0x27, 0x6b, 0x36, 0xa3, 0x1f, 0x68, 0xd4, + 0x7b, 0x4f, 0xd6, 0xe4, 0xde, 0x38, 0x16, 0x9b, 0x03, 0x59, 0x13, 0x96, 0xa0, 0x2d, 0x75, 0x41, 0x20, 0x1b, 0x1b, 0x86, 0x41, 0x8f, 0x24, 0x09, 0xcc, 0x48, 0xf4, 0x80, 0xec, 0xf5, 0xce, 0xd8, + 0x4c, 0x12, 0xb9, 0xed, 0xa1, 0xbb, 0xf4, 0x5e, 0x8b, 0x55, 0x8e, 0x18, 0x43, 0x25, 0xe6, 0x0c, 0x75, 0xd4, 0xeb, 0xc5, 0x74, 0x4d, 0x13, 0x91, 0x52, 0x19, 0x62, 0x0e, 0xa0, 0x61, 0x24, 0x56, + 0x78, 0x9e, 0xd9, 0xb7, 0x22, 0x51, 0xef, 0x0f, 0xd2, 0xfb, 0x83, 0x3c, 0x7f, 0xfe, 0xaf, 0x67, 0xbd, 0x7b, 0xc6, 0x63, 0xfa, 0x21, 0x5c, 0xea, 0x55, 0x62, 0xf0, 0x94, 0x96, 0x55, 0x44, 0x02, + 0x1f, 0x7e, 0xaf, 0x68, 0x2a, 0x07, 0xf9, 0x00, 0xfe, 0x61, 0x36, 0x76, 0xc1, 0x2b, 0x31, 0xa5, 0xef, 0x37, 0xdb, 0x87, 0x37, 0x75, 0xfc, 0x63, 0x4c, 0x00, 0x42, 0xea, 0x12, 0xda, 0xed, 0xa7, + 0xa8, 0x96, 0x03, 0xa8, 0xf6, 0x05, 0xf1, 0x79, 0x1c, 0x73, 0xe6, 0x55, 0xfe, 0x39, 0x3e, 0xf6, 0xa8, 0x22, 0x51, 0xd5, 0x8d, 0xaa, 0xcc, 0x96, 0x76, 0x69, 0xdf, 0x4b, 0x6b, 0xd8, 0x0b, 0xca, + 0xb5, 0x10, 0x81, 0xa4, 0x09, 0x45, 0x1b, 0xa9, 0x99, 0x6f, 0x49, 0x56, 0xb3, 0x8d, 0x3c, 0x05, 0x91, 0xe0, 0x73, 0xb6, 0x80, 0x20, 0x78, 0x2f, 0x69, 0x60, 0x18, 0xb4, 0xf6, 0x6c, 0xcd, 0xf9, + 0x54, 0x48, 0x18, 0x1a, 0x53, 0xea, 0x02, 0xe5, 0x2a, 0x93, 0x14, 0x52, 0xa2, 0x97, 0x0a, 0x30, 0x05, 0x33, 0x0e, 0x37, 0x17, 0xe3, 0x77, 0x60, 0x6b, 0x1f, 0x98, 0xd1, 0x39, 0x16, 0x5b, 0x84, + 0x6f, 0xf5, 0x12, 0x63, 0x0b, 0x53, 0xa0, 0x45, 0x16, 0x2d, 0x69, 0x8c, 0xe4, 0x37, 0xad, 0x45, 0x96, 0xb4, 0xfc, 0x06, 0x01, 0xdf, 0xe5, 0xe7, 0xc9, 0x93, 0x3d, 0x22, 0xa3, 0xed, 0x02, 0x4f, + 0x84, 0x20, 0xc8, 0x38, 0xfb, 0x50, 0xdb, 0xd0, 0x29, 0xb1, 0x0c, 0xcf, 0x06, 0xd3, 0xe9, 0xd5, 0xe0, 0xfa, 0x75, 0x05, 0x4b, 0xb1, 0x56, 0xc3, 0x52, 0x47, 0x56, 0xee, 0xeb, 0x54, 0x38, 0x3e, + 0x47, 0x1f, 0xf9, 0x66, 0x86, 0x8d, 0xa7, 0xfd, 0x15, 0xbf, 0xb8, 0x1c, 0xff, 0xa5, 0x18, 0xfc, 0x66, 0x3b, 0xda, 0x81, 0xfa, 0xf8, 0x11, 0xda, 0x34, 0x5a, 0x0a, 0xf0, 0x23, 0xc2, 0xb1, 0xd8, + 0x8b, 0x62, 0x60, 0x5c, 0x0b, 0x28, 0x81, 0x42, 0x63, 0x66, 0x4c, 0xc3, 0xf3, 0xce, 0x31, 0xa4, 0x9b, 0xb8, 0xe3, 0x1b, 0x1e, 0xff, 0xc2, 0x71, 0xd0, 0x2a, 0x46, 0x1f, 0x68, 0x94, 0x69, 0xf4, + 0x6e, 0x3c, 0x7a, 0xb3, 0x64, 0xd1, 0xd2, 0xac, 0x47, 0x1d, 0xbf, 0x30, 0x36, 0x64, 0xa6, 0x0e, 0xeb, 0x38, 0xfa, 0x01, 0x7e, 0xc3, 0xb8, 0x84, 0x55, 0x12, 0xf8, 0x77, 0xbb, 0x40, 0x77, 0xbe, + 0x0f, 0x47, 0xd0, 0xba, 0x6b, 0xff, 0xf6, 0xbf, 0xf0, 0xfb, 0xd3, 0xbb, 0x4e, 0xab, 0xe3, 0x43, 0x1f, 0x7c, 0x2e, 0xea, 0xde, 0x88, 0x55, 0x34, 0x89, 0x13, 0xc6, 0x1f, 0xda, 0xcf, 0x3b, 0x28, + 0x59, 0x64, 0xb1, 0x88, 0x39, 0x40, 0x14, 0xd6, 0x14, 0x3c, 0x26, 0xd2, 0x14, 0x77, 0x53, 0x91, 0x10, 0xc9, 0x14, 0x3c, 0x7f, 0x16, 0x9a, 0xdd, 0xb8, 0xf7, 0x8c, 0xf1, 0x87, 0x7e, 0x4e, 0x7c, + 0x8e, 0xac, 0x53, 0x86, 0x8e, 0x1f, 0x4a, 0x22, 0x9b, 0x39, 0xfc, 0x57, 0x91, 0x66, 0xf6, 0x37, 0x6d, 0xbc, 0x84, 0x9d, 0x00, 0x82, 0xbc, 0xa2, 0x83, 0xa3, 0xd8, 0x62, 0x26, 0x31, 0x34, 0x1f, + 0x96, 0x81, 0x11, 0x64, 0xb9, 0xa7, 0x2e, 0x70, 0xd4, 0xb5, 0xdb, 0x84, 0xc8, 0x50, 0x64, 0x4f, 0x9e, 0xa0, 0x06, 0x21, 0xb8, 0xea, 0x98, 0x50, 0x14, 0xf9, 0x87, 0x62, 0xce, 0x3e, 0xa6, 0x9c, + 0x6f, 0x93, 0xd7, 0xbe, 0x48, 0x87, 0x8b, 0x38, 0xff, 0x1f, 0x16, 0x8a, 0x1d, 0x85, 0x3c, 0xf3, 0x15, 0x27, 0xcf, 0xf0, 0xe9, 0x5d, 0x07, 0x3b, 0xc4, 0x56, 0xc7, 0xed, 0xa8, 0x5a, 0x76, 0x01, + 0x9b, 0x73, 0x74, 0x28, 0x30, 0x1a, 0xea, 0x5c, 0x54, 0xaa, 0xdb, 0xef, 0xf0, 0xfc, 0xe4, 0x40, 0x24, 0xdc, 0xf1, 0xb4, 0x7a, 0x0c, 0x2c, 0xd2, 0x42, 0x09, 0xd2, 0x7b, 0x2f, 0x69, 0x4f, 0x2d, + 0x8d, 0x6c, 0x77, 0x12, 0x3e, 0xda, 0xe2, 0xf8, 0xe5, 0x79, 0x4b, 0x99, 0xba, 0x52, 0x70, 0x18, 0x8c, 0xdf, 0x61, 0x11, 0x87, 0x16, 0x28, 0x09, 0x5f, 0xd0, 0xa2, 0xfa, 0x54, 0x79, 0xd1, 0x0f, + 0xb4, 0x90, 0x93, 0xaa, 0x70, 0x3c, 0x3c, 0x3f, 0xe9, 0x7f, 0xee, 0x4c, 0x6f, 0x47, 0x99, 0x87, 0xe0, 0xb1, 0xc7, 0x2e, 0x81, 0x8d, 0x48, 0x8a, 0x1d, 0x25, 0x7c, 0xfb, 0x2e, 0xe3, 0x58, 0x60, + 0x04, 0x73, 0xec, 0xf3, 0x56, 0xd8, 0x55, 0xbc, 0xf8, 0x19, 0xf3, 0x6c, 0x8f, 0x67, 0x49, 0x72, 0x0c, 0x77, 0xf9, 0x6a, 0xb0, 0x36, 0x9a, 0xeb, 0xf8, 0x3b, 0xa2, 0xfd, 0xa1, 0x94, 0xcd, 0xae, + 0x70, 0x6d, 0xc0, 0x19, 0x49, 0x29, 0xe4, 0x51, 0xa5, 0x00, 0x77, 0xee, 0x19, 0xd3, 0x39, 0xe3, 0x34, 0x86, 0x48, 0x48, 0x49, 0x23, 0x9d, 0x6c, 0x43, 0x1f, 0x7e, 0x7e, 0xf2, 0xa2, 0xd8, 0x07, + 0x70, 0x4b, 0xc1, 0x45, 0x2b, 0x2b, 0x21, 0x0a, 0xe5, 0x31, 0x0e, 0xd2, 0xc4, 0xab, 0x2f, 0xc4, 0xa9, 0x5d, 0x62, 0x6e, 0x89, 0xe9, 0xa4, 0xaa, 0xe4, 0x50, 0xbe, 0x66, 0x52, 0x70, 0x6c, 0xee, + 0xb1, 0xda, 0x67, 0x26, 0x62, 0x38, 0x1a, 0x15, 0xd5, 0xa1, 0xef, 0x42, 0xbd, 0x96, 0x04, 0x5b, 0x10, 0x8a, 0xbd, 0x22, 0x12, 0x2c, 0xe4, 0x16, 0x75, 0x9a, 0x45, 0x1a, 0xc3, 0xfe, 0x5c, 0x8a, + 0x15, 0xa4, 0x52, 0x44, 0xd8, 0xea, 0x99, 0xa6, 0xbf, 0x84, 0xd2, 0xc2, 0x96, 0xcb, 0x5b, 0xa5, 0xe9, 0x0a, 0xa4, 0x10, 0xda, 0x6b, 0xc0, 0x9c, 0x49, 0xa5, 0x2b, 0x40, 0xa6, 0xb1, 0x0e, 0x57, + 0x6b, 0x0e, 0x2a, 0x9b, 0x95, 0xcb, 0x4c, 0x41, 0x24, 0xb8, 0x62, 0x31, 0xc5, 0x46, 0x27, 0x95, 0xe2, 0x3d, 0x8d, 0x34, 0xcc, 0x30, 0x53, 0x17, 0x40, 0xde, 0x9c, 0xf1, 0xf8, 0xde, 0x14, 0x98, + 0xf7, 0xf8, 0x26, 0x66, 0xb2, 0xdd, 0x81, 0x3f, 0xbd, 0x6a, 0xd5, 0xf3, 0xdc, 0x87, 0xdf, 0x3d, 0x28, 0xed, 0xd4, 0x8a, 0xe3, 0x0a, 0xd3, 0x9b, 0x61, 0xd4, 0x56, 0xa1, 0xb6, 0x69, 0xd9, 0x47, + 0xe7, 0xbb, 0x38, 0xa9, 0x33, 0xc9, 0xe1, 0x79, 0x51, 0x03, 0xbb, 0xb7, 0x7d, 0x44, 0xef, 0x01, 0x6c, 0xaa, 0xbf, 0x97, 0x2c, 0xa1, 0x26, 0xb4, 0xe3, 0xaa, 0x0f, 0x3f, 0xf4, 0xa1, 0xd5, 0x6b, + 0x19, 0x85, 0xc4, 0xa2, 0xe2, 0x57, 0x71, 0x0e, 0xd1, 0x33, 0xbc, 0xef, 0xf8, 0x52, 0x7e, 0x80, 0x01, 0xc9, 0xd7, 0x24, 0x25, 0x0f, 0xd5, 0xb2, 0xa7, 0x61, 0xe4, 0x4d, 0xa4, 0xc8, 0x78, 0x6c, + 0x7c, 0xea, 0xcd, 0xcb, 0xd1, 0xe0, 0x2a, 0xf8, 0xe9, 0x3f, 0xff, 0xf1, 0x2f, 0x68, 0xd7, 0xc2, 0x7d, 0x6f, 0x9a, 0x12, 0x19, 0x75, 0x76, 0x8e, 0xff, 0x13, 0x91, 0x7f, 0xda, 0x8d, 0xda, 0x86, + 0x19, 0x97, 0x48, 0xf1, 0x77, 0x2f, 0x0c, 0x4d, 0x1a, 0xb5, 0x26, 0x67, 0x33, 0x64, 0x9d, 0x0a, 0xca, 0x63, 0xec, 0x90, 0x4a, 0x62, 0x3c, 0x80, 0x58, 0x70, 0xf4, 0xb8, 0x54, 0x32, 0xae, 0xe7, + 0xd0, 0xfa, 0x0f, 0xd5, 0x82, 0x3c, 0x3b, 0xe7, 0xa2, 0xdd, 0x45, 0xea, 0x7b, 0x9f, 0xd0, 0xdc, 0x22, 0xc1, 0x23, 0xa2, 0x29, 0x27, 0x9a, 0x2a, 0xc0, 0x42, 0x39, 0x61, 0x9c, 0x2a, 0xdb, 0xb2, + 0x9a, 0xe1, 0x8f, 0x05, 0xb8, 0x37, 0xcb, 0x35, 0x75, 0xcf, 0x9d, 0xba, 0x6b, 0xf9, 0x71, 0x42, 0x57, 0x62, 0x4d, 0xe1, 0x4e, 0x9a, 0x89, 0x0e, 0x9a, 0xcf, 0x86, 0x62, 0x33, 0x8a, 0x21, 0xea, + 0x96, 0xf1, 0x58, 0x6c, 0x94, 0x31, 0x41, 0xc6, 0xe1, 0x15, 0xd3, 0xf0, 0x92, 0xa8, 0xa5, 0xdb, 0x89, 0xce, 0x1f, 0x2d, 0x69, 0xf4, 0x00, 0x22, 0xd3, 0x26, 0x5e, 0x49, 0x9a, 0x0a, 0xc5, 0x4a, + 0xab, 0x25, 0x99, 0x16, 0x30, 0x9c, 0x9c, 0x9d, 0xc2, 0x8a, 0x70, 0xb2, 0x30, 0x73, 0xb2, 0x42, 0x26, 0xe8, 0x4e, 0x71, 0x08, 0x97, 0x79, 0xd5, 0xdf, 0xc5, 0x83, 0x57, 0x64, 0x6b, 0x92, 0xac, + 0x63, 0x4a, 0x2f, 0x89, 0x36, 0x25, 0x53, 0x4c, 0xcd, 0x48, 0xc3, 0x4d, 0xd0, 0x1c, 0x8e, 0x3b, 0x79, 0xc7, 0x0d, 0x15, 0xa9, 0x14, 0x71, 0x16, 0x51, 0x68, 0xb6, 0x82, 0x77, 0x44, 0x2e, 0xee, + 0x64, 0x0b, 0x24, 0xb1, 0x4d, 0xd1, 0x92, 0x70, 0x30, 0x8b, 0x10, 0x67, 0x14, 0x6d, 0x78, 0x23, 0x64, 0xec, 0xf6, 0xab, 0x34, 0x61, 0x5a, 0x63, 0xc9, 0x25, 0xb3, 0x84, 0x2a, 0x9b, 0xf3, 0xb5, + 0x84, 0x40, 0x41, 0x0b, 0x71, 0xb7, 0x00, 0xff, 0xfb, 0x2f, 0x70, 0x96, 0x3b, 0x67, 0xa8, 0x80, 0x44, 0x2c, 0xaa, 0x42, 0xf5, 0x9b, 0xe7, 0x6f, 0x2f, 0x6e, 0xef, 0xdf, 0x8e, 0x26, 0x2f, 0x2f, + 0xa7, 0x23, 0x4c, 0xf4, 0xa6, 0x57, 0xaa, 0xca, 0xb8, 0xd4, 0x31, 0xa2, 0xac, 0x21, 0x7b, 0x39, 0x98, 0x8e, 0xee, 0x4f, 0xc6, 0x93, 0x7e, 0xb3, 0xbd, 0xef, 0x5b, 0x50, 0xcd, 0x9c, 0xcd, 0x67, + 0x7e, 0xc7, 0xef, 0x54, 0x82, 0x59, 0xbe, 0xb5, 0xaa, 0x4f, 0x67, 0x2d, 0x26, 0x2e, 0xd9, 0x3e, 0xf9, 0x6a, 0x72, 0xf9, 0x66, 0x34, 0xbc, 0x46, 0x60, 0x73, 0xcc, 0x9f, 0x76, 0xd9, 0x3d, 0x1f, + 0x05, 0x15, 0x3c, 0x9f, 0x8a, 0x66, 0xe2, 0xd0, 0x56, 0xe4, 0xbb, 0xe8, 0xbe, 0xeb, 0xaf, 0x7c, 0xcf, 0x6b, 0x7c, 0xb7, 0x3f, 0xaf, 0x01, 0xa3, 0x0f, 0x9a, 0x72, 0x33, 0xe1, 0xd1, 0x02, 0x0d, + 0x5e, 0x6c, 0x8c, 0x61, 0xad, 0x88, 0x66, 0x11, 0x49, 0x92, 0x2d, 0xc4, 0x62, 0xc3, 0xf3, 0x49, 0x04, 0x9a, 0xa1, 0x91, 0x62, 0xb0, 0xb1, 0x43, 0xa3, 0xf0, 0x3d, 0x91, 0x36, 0x08, 0x9b, 0xf9, + 0x49, 0x10, 0x51, 0xae, 0x25, 0x49, 0xbc, 0x06, 0x5c, 0x2f, 0x99, 0xb2, 0xf8, 0x14, 0x64, 0xaa, 0xb6, 0x19, 0xdc, 0x66, 0xf4, 0x09, 0x17, 0x5a, 0x9d, 0x31, 0xa6, 0x52, 0x2c, 0xd9, 0x8c, 0x69, + 0x6b, 0xf9, 0xa6, 0x5c, 0xe7, 0x30, 0x63, 0x9c, 0xc8, 0x2d, 0xc4, 0x44, 0x93, 0xf0, 0x7b, 0xca, 0xc2, 0x51, 0xf5, 0x86, 0x48, 0x8c, 0xcf, 0xfd, 0xc3, 0xea, 0x30, 0xf1, 0xb2, 0xe7, 0x40, 0x7b, + 0x7b, 0xb2, 0xf0, 0xbd, 0xbc, 0xc9, 0xf3, 0x9b, 0x75, 0x7c, 0xf5, 0xc8, 0x60, 0xf4, 0x6d, 0xc6, 0xe2, 0xb0, 0x0b, 0xe7, 0x15, 0xe5, 0x82, 0x01, 0x1a, 0x8a, 0x2c, 0x89, 0x79, 0x4b, 0x9b, 0xf4, + 0xb0, 0x0b, 0xdc, 0xad, 0x69, 0x87, 0x69, 0x08, 0xc3, 0xd0, 0xf7, 0x2a, 0x81, 0x96, 0xe7, 0x2e, 0x34, 0x19, 0x5d, 0x5d, 0xde, 0x4c, 0xce, 0xf6, 0xc2, 0xad, 0x45, 0x77, 0x23, 0x93, 0x7e, 0x1d, + 0xb0, 0x27, 0xe4, 0xa2, 0x67, 0x07, 0xc5, 0x96, 0xcb, 0xc3, 0x3c, 0xf7, 0xcc, 0x58, 0xb0, 0xbe, 0x16, 0x98, 0x35, 0x2b, 0x0d, 0xa8, 0x17, 0x4c, 0xd5, 0xe3, 0xf2, 0xe1, 0x02, 0x86, 0x35, 0x3b, + 0xa6, 0xa9, 0x0e, 0xa6, 0xcd, 0xc2, 0x8b, 0x47, 0xa4, 0xc2, 0xe5, 0x0b, 0x9b, 0x20, 0xc7, 0xa7, 0xd3, 0xbe, 0xdf, 0xf7, 0x6d, 0x30, 0x0c, 0x24, 0x3c, 0xd0, 0x2d, 0xac, 0x49, 0x92, 0xd1, 0x22, + 0x4d, 0x56, 0x82, 0x77, 0x0b, 0x23, 0x9e, 0xb1, 0x71, 0x03, 0x52, 0xfa, 0x49, 0xa6, 0xc8, 0x82, 0x62, 0x24, 0xdf, 0xb8, 0x48, 0x4e, 0x14, 0x62, 0x86, 0x58, 0x50, 0x5b, 0xc7, 0xe4, 0x25, 0x84, + 0x45, 0x41, 0x14, 0x10, 0x50, 0x34, 0x25, 0x92, 0x68, 0x21, 0xa1, 0x5d, 0xbc, 0x56, 0xa0, 0x52, 0x12, 0xd1, 0x2e, 0x68, 0x32, 0xeb, 0x02, 0xa7, 0x1b, 0x13, 0x9f, 0xa1, 0xdd, 0xba, 0xe3, 0xad, + 0x4e, 0xd7, 0x66, 0x82, 0x4c, 0x69, 0xb1, 0x82, 0x56, 0xbf, 0x05, 0x79, 0x79, 0xae, 0xc8, 0x9c, 0xbe, 0x45, 0x82, 0xb0, 0xa2, 0x37, 0x65, 0x45, 0xd3, 0xd0, 0xe7, 0xc3, 0x47, 0x13, 0x66, 0x63, + 0x73, 0x6a, 0x0e, 0xed, 0x06, 0x51, 0x0f, 0x74, 0xeb, 0xa3, 0x4f, 0xb5, 0x4b, 0x4d, 0x74, 0xea, 0x46, 0x50, 0xa0, 0xf5, 0x8f, 0x6d, 0xce, 0xb7, 0x93, 0x29, 0xa3, 0x48, 0x45, 0x22, 0xf3, 0x13, + 0xd3, 0xab, 0x89, 0xdc, 0x7f, 0xd7, 0x43, 0x52, 0x29, 0x52, 0x2a, 0x35, 0xa3, 0xca, 0x2f, 0x2d, 0xfc, 0xa4, 0x62, 0xc2, 0x28, 0xe6, 0xa3, 0xc2, 0xca, 0x6f, 0x64, 0x52, 0x5a, 0xb3, 0x9b, 0x4d, + 0x1c, 0x32, 0xdf, 0xdc, 0x65, 0x0f, 0x8c, 0x10, 0x72, 0xd5, 0xec, 0xb9, 0x63, 0x51, 0x45, 0xe4, 0xf8, 0x2b, 0x15, 0xf7, 0x66, 0x41, 0x35, 0xfc, 0x0c, 0x95, 0x7a, 0xbc, 0xd6, 0x3f, 0x56, 0x9c, + 0xd7, 0x40, 0x86, 0x61, 0xe8, 0x42, 0x1c, 0x3e, 0x96, 0x3d, 0xe3, 0xe7, 0xf3, 0x17, 0x76, 0x8a, 0xff, 0x73, 0x33, 0x1e, 0x5d, 0xf7, 0x7d, 0x53, 0x88, 0xb8, 0xdf, 0x41, 0xf0, 0x47, 0xc6, 0xaa, + 0x18, 0x2a, 0x83, 0x59, 0xc4, 0x73, 0x33, 0x1d, 0x4d, 0x2e, 0x06, 0xb6, 0xc2, 0xfe, 0xf8, 0xb1, 0xf6, 0xea, 0x6a, 0x30, 0x9d, 0xde, 0x5e, 0x4e, 0x4e, 0xf6, 0xc7, 0x65, 0x46, 0x4e, 0x48, 0x66, + 0xd3, 0x9c, 0x52, 0x4a, 0x02, 0xa5, 0x0b, 0xc1, 0xe5, 0x81, 0x48, 0xf5, 0xf1, 0x23, 0xc8, 0x95, 0xad, 0x68, 0x76, 0x83, 0x53, 0x8e, 0xb1, 0xd6, 0xd2, 0xee, 0x1e, 0x11, 0x04, 0xe8, 0xdc, 0x41, + 0xa6, 0xa8, 0xec, 0xef, 0x91, 0xee, 0x5e, 0xa6, 0x44, 0x29, 0xac, 0x16, 0xfa, 0x7b, 0x0c, 0x3c, 0x0e, 0x81, 0xce, 0xdf, 0x69, 0x52, 0x57, 0x6d, 0x94, 0xc9, 0xe4, 0xeb, 0x54, 0x6b, 0x20, 0x4b, + 0xd5, 0xe2, 0xe3, 0x37, 0xa9, 0x56, 0xb1, 0x84, 0xf2, 0xef, 0xa0, 0x5b, 0x43, 0x67, 0x2e, 0x78, 0x71, 0x40, 0x58, 0x3b, 0xf2, 0x9c, 0x43, 0x70, 0xf6, 0x35, 0x02, 0xdc, 0xd3, 0x70, 0xed, 0x20, + 0xa3, 0xdc, 0x5d, 0xda, 0x8f, 0x76, 0xe9, 0x7d, 0x4c, 0x7a, 0x0a, 0x85, 0x56, 0xc8, 0xb2, 0xea, 0x22, 0x49, 0x82, 0x1a, 0xca, 0x47, 0xda, 0x56, 0x5f, 0xe6, 0xfa, 0x47, 0x8b, 0x22, 0x41, 0xd6, + 0x47, 0x39, 0x53, 0x91, 0xc9, 0x88, 0x7e, 0x55, 0x8e, 0x37, 0x85, 0x8d, 0xbb, 0x23, 0xcb, 0x43, 0x95, 0x49, 0xf6, 0x79, 0x8f, 0x9f, 0xe3, 0x1c, 0x26, 0x44, 0xa9, 0x6f, 0x41, 0x19, 0x21, 0x82, + 0x12, 0x67, 0x7d, 0xb0, 0xab, 0x36, 0x4c, 0x47, 0x4b, 0x37, 0xe7, 0xd4, 0xa2, 0xe8, 0x1e, 0xea, 0x63, 0xce, 0xfc, 0x9e, 0xcb, 0x8c, 0x9f, 0xaa, 0xa6, 0x76, 0x28, 0x7a, 0xee, 0x08, 0xe3, 0x8b, + 0xd1, 0xb3, 0x84, 0xf3, 0x3b, 0x3b, 0xdb, 0x2d, 0xdf, 0x7f, 0xb9, 0xdb, 0x80, 0x55, 0x36, 0x17, 0xb3, 0xac, 0xdc, 0x15, 0x68, 0xfd, 0x98, 0x83, 0xc6, 0x9e, 0xcf, 0x3e, 0x68, 0x0d, 0xe9, 0x41, + 0x50, 0xc8, 0xed, 0x03, 0x02, 0x18, 0x8a, 0x55, 0xca, 0x92, 0xe2, 0x02, 0xf0, 0xb0, 0x36, 0x6d, 0xf1, 0xb4, 0x8b, 0xa2, 0x7d, 0x68, 0xb8, 0x13, 0xf9, 0x9f, 0x17, 0x49, 0x8d, 0x33, 0xd8, 0xe3, + 0xee, 0x2b, 0x29, 0x9e, 0x54, 0x2f, 0x2c, 0xbf, 0x99, 0x5e, 0x1f, 0x82, 0x28, 0x85, 0xaa, 0x0d, 0x7e, 0x06, 0xf1, 0x8e, 0x73, 0xee, 0x67, 0xcd, 0xaf, 0xf1, 0x54, 0xa8, 0xcb, 0xa0, 0xbc, 0x2d, + 0x99, 0xb3, 0xef, 0x59, 0xbf, 0x37, 0x60, 0x64, 0x47, 0x01, 0x34, 0x6f, 0x69, 0xbe, 0xe7, 0x69, 0x5e, 0x03, 0xc6, 0xf3, 0x72, 0x80, 0xd3, 0xc5, 0xe2, 0x90, 0xc5, 0x44, 0xdb, 0x0f, 0x0c, 0xa6, + 0xaf, 0x07, 0xc1, 0x8b, 0x7f, 0xfe, 0x08, 0x2a, 0x5b, 0xe5, 0x9f, 0x64, 0x9c, 0xd7, 0x5a, 0x1f, 0xd3, 0x37, 0xb1, 0x84, 0xe6, 0x5d, 0xc7, 0x74, 0x49, 0x5e, 0xfc, 0xf3, 0xc7, 0x69, 0xb6, 0xea, + 0xfb, 0xbe, 0xf7, 0x75, 0x45, 0xea, 0x67, 0x4a, 0xba, 0x02, 0x53, 0x51, 0xd8, 0x95, 0xb8, 0x9b, 0x6e, 0x7f, 0xa5, 0xb0, 0x33, 0x45, 0xdd, 0xa3, 0x14, 0x74, 0x65, 0xc7, 0xb1, 0x7b, 0x6e, 0xd5, + 0xdc, 0x6b, 0xef, 0x26, 0x54, 0x65, 0x89, 0x76, 0x77, 0xa5, 0xbb, 0x55, 0x98, 0x32, 0x20, 0x28, 0xc1, 0xc3, 0xf9, 0x9a, 0xcd, 0xdd, 0x38, 0x6d, 0xef, 0x3c, 0xd8, 0x6b, 0xaa, 0xe0, 0x63, 0x05, + 0x5d, 0x10, 0x55, 0x31, 0xc2, 0x8b, 0x9f, 0x9f, 0x3c, 0x3f, 0x54, 0x55, 0xd6, 0x48, 0x2c, 0xae, 0x5c, 0xdd, 0x44, 0x77, 0x8f, 0xd4, 0xc7, 0xa4, 0xd3, 0x10, 0x49, 0x00, 0x0d, 0xe8, 0x31, 0x68, + 0x75, 0x09, 0xd3, 0x12, 0x31, 0xc4, 0xce, 0x1a, 0x0f, 0x70, 0xf6, 0x8a, 0x9d, 0xff, 0x86, 0xd8, 0x2f, 0x7d, 0xa8, 0xd2, 0x34, 0x86, 0x59, 0xa6, 0x81, 0xbb, 0x6b, 0xef, 0x56, 0x21, 0xb5, 0x16, + 0x08, 0xfb, 0x68, 0x7e, 0x13, 0x49, 0xcb, 0x8b, 0x1e, 0x17, 0x85, 0xdc, 0x6c, 0xd3, 0xde, 0x67, 0x32, 0xae, 0x34, 0x49, 0x92, 0xfc, 0xfa, 0xdc, 0xc9, 0xaa, 0x8b, 0x48, 0xf2, 0xcf, 0x1b, 0x2a, + 0x04, 0xcc, 0xb6, 0x20, 0xb1, 0xd9, 0xc2, 0x88, 0xd7, 0xda, 0x95, 0x92, 0x6b, 0xbe, 0xb6, 0x22, 0x93, 0xf0, 0x39, 0xeb, 0xcb, 0x49, 0xb0, 0x83, 0x69, 0xc7, 0xb9, 0x31, 0xc8, 0xe6, 0x01, 0x09, + 0x41, 0xdf, 0xde, 0xe3, 0xd7, 0xa2, 0x70, 0x6d, 0x6c, 0x7e, 0x4a, 0x58, 0x62, 0xa7, 0xb2, 0x85, 0x5b, 0xd7, 0xfd, 0xd7, 0x39, 0x78, 0xd7, 0x92, 0x55, 0x7f, 0xb7, 0x32, 0x1f, 0x93, 0xcd, 0xa8, + 0xf9, 0x84, 0x4b, 0x8a, 0x15, 0x53, 0x34, 0x2e, 0xa6, 0xec, 0xf9, 0x41, 0x63, 0xbe, 0xa6, 0x4a, 0xb3, 0x05, 0xa2, 0x46, 0xa1, 0xd0, 0x84, 0x6a, 0xba, 0x6b, 0x0f, 0xa6, 0xd7, 0xd4, 0x9a, 0xae, + 0x52, 0x0d, 0x04, 0xa2, 0x84, 0x12, 0x5e, 0x14, 0x34, 0xfb, 0x18, 0xe7, 0xf6, 0xa3, 0xb4, 0x14, 0xc9, 0x8d, 0xab, 0x84, 0xb9, 0x6f, 0x78, 0x0c, 0xb1, 0xc0, 0xdd, 0x27, 0x5b, 0x16, 0xce, 0x84, + 0xa6, 0x72, 0x0c, 0xbd, 0x67, 0xa1, 0x4e, 0xc4, 0xdb, 0xea, 0x69, 0x15, 0x21, 0x97, 0xb3, 0x30, 0xf3, 0x6d, 0x8c, 0xdf, 0x6c, 0x57, 0xe7, 0xa3, 0x5f, 0x0c, 0x28, 0xef, 0xd7, 0xab, 0xd0, 0xde, + 0x6b, 0xfb, 0x1d, 0x68, 0x96, 0x48, 0xfc, 0xdd, 0x2b, 0xed, 0xbf, 0x5f, 0xf9, 0x78, 0x07, 0x0a, 0x9e, 0xbf, 0x7d, 0x93, 0xbd, 0x57, 0xc4, 0x3c, 0xce, 0x9d, 0x76, 0x89, 0xaf, 0x7a, 0xad, 0x5d, + 0xe0, 0x3b, 0x38, 0x02, 0x2c, 0x51, 0x1f, 0x9e, 0x3b, 0x7e, 0xe9, 0x94, 0x83, 0x08, 0xf3, 0x7b, 0xf4, 0x2b, 0x29, 0xd6, 0x2c, 0xa6, 0x40, 0xc0, 0xcf, 0x6f, 0x6a, 0xd9, 0xbf, 0x69, 0xec, 0xc3, + 0x86, 0x98, 0xfb, 0x13, 0x49, 0xb5, 0x64, 0x74, 0x6d, 0xad, 0x64, 0x78, 0x36, 0x06, 0x22, 0x17, 0x6e, 0x54, 0xb7, 0x61, 0x49, 0xe2, 0xd9, 0x3b, 0x00, 0x3b, 0x8e, 0x9e, 0x09, 0xbd, 0x2c, 0x74, + 0x83, 0x71, 0x91, 0x0b, 0x1e, 0xe4, 0xcf, 0xf6, 0x26, 0x89, 0x09, 0xae, 0x42, 0x67, 0x2f, 0xc3, 0xf3, 0x93, 0xfb, 0xb3, 0xf1, 0xc5, 0xe8, 0x7e, 0x30, 0x79, 0x35, 0x2d, 0xaa, 0xe6, 0xe1, 0xe5, + 0xc5, 0xe9, 0xf8, 0x15, 0x34, 0x9f, 0xfa, 0x5e, 0x6d, 0x5c, 0x5a, 0x83, 0xf6, 0xbc, 0xdb, 0xc9, 0xe0, 0xea, 0x6a, 0x34, 0xb9, 0x3f, 0x1b, 0xdc, 0x5c, 0x0c, 0x5f, 0x8f, 0x26, 0x7d, 0x21, 0x17, + 0xf9, 0xf4, 0xc8, 0x8e, 0x92, 0xf2, 0x10, 0x51, 0x2d, 0x73, 0xce, 0x09, 0xe3, 0xc8, 0xb5, 0x5a, 0xd2, 0x24, 0xb1, 0xb3, 0x75, 0x17, 0x8b, 0xfa, 0xd3, 0xe1, 0x8b, 0x67, 0x3f, 0xfd, 0x08, 0x0d, + 0x33, 0x55, 0x31, 0x5c, 0x7a, 0x48, 0x72, 0xf5, 0x86, 0xed, 0xce, 0x83, 0xaa, 0x99, 0x56, 0x9f, 0x4f, 0x46, 0x2f, 0x6f, 0x5e, 0x95, 0xab, 0x81, 0x29, 0xe4, 0x8d, 0x26, 0xfe, 0x7e, 0x46, 0x7d, + 0x4f, 0xa4, 0x3d, 0xcb, 0x0f, 0x4e, 0x2c, 0x2b, 0xab, 0x2c, 0xd1, 0xec, 0x5c, 0xc4, 0x59, 0x42, 0xaf, 0xec, 0xb4, 0xf4, 0x24, 0xbf, 0x82, 0x2a, 0x46, 0xce, 0x75, 0xfc, 0x9f, 0x1c, 0xb5, 0x7f, + 0xee, 0xca, 0xe9, 0x13, 0xd4, 0xe5, 0xec, 0x37, 0xff, 0xdb, 0xf7, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x8b, 0x2b, 0xc6, 0x07, 0x61, 0x0e, 0x00, 0x00, 0x19, 0x2c, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x59, 0x7d, 0x6f, 0xda, 0x48, 0xb7, 0xff, 0xfb, 0xf1, 0xa7, 0x38, + 0x8f, 0xb5, 0xde, 0x24, 0x2b, 0x70, 0xda, 0x5c, 0xb5, 0xba, 0xa2, 0xf2, 0x55, 0x1d, 0x70, 0x1a, 0xba, 0x09, 0x20, 0x4c, 0x92, 0xae, 0xb6, 0x7b, 0xd1, 0x60, 0x1f, 0x60, 0x1a, 0x7b, 0xc6, 0x3b, + 0x33, 0x40, 0xb8, 0x57, 0xfb, 0xdd, 0x1f, 0xcd, 0x8b, 0xc1, 0xe4, 0xa5, 0xed, 0x4a, 0xbb, 0xd2, 0xf6, 0x8f, 0x02, 0x33, 0xe7, 0xfd, 0xfc, 0xe6, 0xcc, 0x99, 0x93, 0xf7, 0xe3, 0xe4, 0x1a, 0xda, + 0x7f, 0xe1, 0x3f, 0xcf, 0x48, 0xbc, 0xa2, 0x19, 0x32, 0x89, 0x39, 0x28, 0x0e, 0x6a, 0x89, 0x10, 0x57, 0x24, 0x5b, 0x22, 0xa4, 0x7c, 0xae, 0x36, 0x44, 0x20, 0x5c, 0xf0, 0x15, 0xcb, 0x89, 0xa2, + 0x9c, 0xc1, 0x71, 0x9c, 0x5e, 0x9c, 0xc0, 0x8a, 0xe5, 0x28, 0x80, 0x33, 0xb4, 0xfc, 0x5c, 0x40, 0xc9, 0x05, 0x42, 0xc6, 0x99, 0x12, 0x74, 0xb6, 0x52, 0x5c, 0x40, 0x61, 0x65, 0x02, 0x59, 0x08, + 0xc4, 0x12, 0x99, 0x92, 0x21, 0x40, 0x8a, 0x68, 0x14, 0x0c, 0x86, 0x93, 0x7e, 0x37, 0x81, 0x39, 0x2d, 0x9c, 0x84, 0x9c, 0x4a, 0xcb, 0x89, 0x39, 0x6c, 0xa8, 0x5a, 0x82, 0x5a, 0x52, 0x09, 0x1b, + 0x2e, 0xee, 0x61, 0xce, 0x05, 0x90, 0x3c, 0xa7, 0x5a, 0x3d, 0x29, 0x80, 0xb2, 0x39, 0x17, 0xa5, 0x31, 0xc6, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x53, 0xb6, 0x80, 0x8c, 0x57, 0x5b, 0x41, 0x17, 0x4b, + 0x05, 0x7c, 0xc3, 0x50, 0xc8, 0x25, 0xad, 0x42, 0x80, 0x89, 0x76, 0x28, 0xbd, 0xa8, 0x0d, 0x92, 0x56, 0xf4, 0x5e, 0xb5, 0xe2, 0xb0, 0xe5, 0x2b, 0xe7, 0x52, 0xc3, 0x7b, 0x17, 0x94, 0x16, 0xdc, + 0xa2, 0x90, 0xda, 0xf5, 0xb3, 0xf0, 0x15, 0x1c, 0xab, 0xa5, 0x63, 0xf3, 0xdd, 0xbe, 0x7f, 0xf2, 0xce, 0xf0, 0x97, 0x64, 0x0b, 0x8c, 0x2b, 0x58, 0x49, 0xdc, 0x6b, 0x00, 0x7c, 0xc8, 0xb0, 0x52, + 0x40, 0x19, 0x64, 0xbc, 0xac, 0x0a, 0x4a, 0x58, 0xe6, 0xf8, 0x9d, 0x97, 0x3b, 0x3d, 0x21, 0xc0, 0x2f, 0x4e, 0x0c, 0x9f, 0x29, 0x42, 0x19, 0x10, 0xe3, 0x10, 0xf0, 0x79, 0x93, 0x0c, 0x88, 0x32, + 0xfc, 0x56, 0x08, 0x00, 0x2c, 0x95, 0xaa, 0x3a, 0xa7, 0xa7, 0x9b, 0xcd, 0x26, 0x24, 0xc6, 0xf0, 0x90, 0x8b, 0xc5, 0x69, 0xed, 0xec, 0xe9, 0x55, 0xbf, 0x9b, 0x0c, 0xd2, 0xa4, 0x7d, 0x16, 0xbe, + 0x6a, 0xf0, 0xdd, 0xb0, 0x02, 0xa5, 0x04, 0x81, 0xbf, 0xaf, 0xa8, 0xc0, 0x1c, 0x66, 0x5b, 0x20, 0x55, 0x55, 0xd0, 0x8c, 0xcc, 0x0a, 0x84, 0x82, 0x6c, 0x74, 0x4a, 0x4d, 0xe6, 0x0c, 0x26, 0x28, + 0x83, 0x8d, 0xa0, 0x8a, 0xb2, 0x45, 0xcb, 0xf2, 0xcb, 0x1a, 0x19, 0xcd, 0xbc, 0xed, 0x23, 0x58, 0xdb, 0x4a, 0xe5, 0x01, 0x01, 0x67, 0x40, 0x5c, 0xd2, 0xfc, 0x38, 0x85, 0x7e, 0xea, 0xc3, 0x79, + 0x9c, 0xf6, 0xd3, 0x16, 0xdc, 0xf5, 0x27, 0x97, 0xc3, 0x9b, 0x09, 0xdc, 0xc5, 0xe3, 0x71, 0x3c, 0x98, 0xf4, 0x93, 0x14, 0x86, 0x63, 0xe8, 0x0e, 0x07, 0xbd, 0xfe, 0xa4, 0x3f, 0x1c, 0xa4, 0x30, + 0xbc, 0x80, 0x78, 0xf0, 0x8b, 0xe5, 0xfd, 0xb9, 0x3f, 0xe8, 0xb5, 0x00, 0xa9, 0x5a, 0xa2, 0x00, 0x7c, 0xa8, 0x84, 0x76, 0x85, 0x0b, 0xa0, 0x3a, 0xc0, 0x98, 0x37, 0x60, 0x56, 0xdb, 0xa1, 0x21, + 0xb4, 0x4b, 0x9c, 0xac, 0x30, 0xa3, 0x73, 0x9a, 0x41, 0x41, 0xd8, 0x62, 0x45, 0x16, 0x08, 0x0b, 0xbe, 0x46, 0xc1, 0x34, 0x82, 0x2a, 0x14, 0x25, 0x95, 0x3a, 0xdb, 0x12, 0x08, 0xcb, 0xa1, 0xa0, + 0x25, 0x55, 0x06, 0x6b, 0xd2, 0x32, 0x3f, 0xf1, 0x31, 0xf4, 0xfe, 0xfa, 0x33, 0xf9, 0x37, 0x88, 0x34, 0x12, 0x1d, 0xb0, 0xaf, 0xc9, 0x1a, 0x19, 0xdc, 0x09, 0x52, 0x55, 0x28, 0x40, 0x2a, 0x22, + 0xd4, 0xaa, 0x82, 0x19, 0x51, 0xd9, 0x12, 0x64, 0x26, 0x68, 0xa5, 0x5a, 0xb0, 0x76, 0x98, 0xff, 0xaf, 0xf0, 0x10, 0x38, 0xe3, 0x1a, 0x31, 0xc9, 0xe0, 0x16, 0xd6, 0x44, 0xc8, 0x8e, 0x5d, 0xff, + 0x18, 0xdf, 0xc6, 0xd3, 0xcb, 0xe1, 0x75, 0x02, 0x6d, 0x28, 0x78, 0x66, 0x6b, 0x05, 0x9f, 0x03, 0x81, 0x8f, 0xbd, 0x9f, 0x61, 0xc9, 0x4b, 0x0d, 0x15, 0xd1, 0x10, 0x34, 0xac, 0xdc, 0x79, 0xae, + 0x05, 0xd9, 0xe5, 0xeb, 0xf8, 0x36, 0x19, 0x4c, 0xcf, 0xe3, 0x49, 0xf7, 0x72, 0x9a, 0x74, 0x2f, 0x87, 0xd0, 0x06, 0x89, 0x4a, 0x63, 0xf0, 0x88, 0xb3, 0x23, 0xfd, 0x89, 0xcc, 0x60, 0x54, 0xa7, + 0x00, 0xb3, 0x25, 0xd7, 0x59, 0x73, 0x27, 0xc4, 0x7a, 0x90, 0xf1, 0xb2, 0x24, 0x2c, 0x7f, 0x46, 0xde, 0x28, 0xbe, 0x49, 0x93, 0xa7, 0x02, 0x37, 0x84, 0x2a, 0x5b, 0x64, 0xe0, 0x1e, 0xb7, 0x52, + 0x09, 0x7e, 0x8f, 0x30, 0xc3, 0xb9, 0x2e, 0x68, 0xc8, 0x74, 0x61, 0x69, 0x8a, 0x1a, 0x8e, 0x26, 0x29, 0xb4, 0xa1, 0x22, 0x82, 0x94, 0xa8, 0x50, 0x48, 0xa8, 0x88, 0x6c, 0x94, 0xce, 0x8f, 0x64, + 0x4d, 0xe0, 0xf6, 0x1a, 0x36, 0x4b, 0x64, 0x20, 0x56, 0xcc, 0xc0, 0xca, 0x44, 0x7c, 0x77, 0x62, 0x01, 0xc3, 0x45, 0xa8, 0xe9, 0x73, 0x9c, 0xad, 0xdc, 0x26, 0x50, 0x25, 0xb1, 0x98, 0xb7, 0x74, + 0xf9, 0x70, 0x30, 0x45, 0xd5, 0x50, 0x19, 0xb5, 0x3f, 0x59, 0xea, 0xf6, 0x27, 0xb1, 0x62, 0x5f, 0xf2, 0x4d, 0xd5, 0x51, 0x82, 0x30, 0x59, 0x71, 0xa1, 0xa2, 0x5c, 0x4d, 0x25, 0xcf, 0xee, 0x51, + 0xb5, 0x24, 0x8a, 0x35, 0x8a, 0x68, 0xdb, 0x92, 0x2b, 0x59, 0x21, 0xcb, 0xa3, 0x6d, 0x8b, 0xe4, 0xb9, 0x3e, 0x20, 0xd1, 0x7f, 0xbf, 0x7a, 0xf5, 0xaa, 0xe9, 0x48, 0xfa, 0x73, 0x7f, 0x34, 0x1d, + 0x77, 0xa1, 0x0d, 0xf3, 0x82, 0x2c, 0x8c, 0x39, 0x54, 0xda, 0xe3, 0xcf, 0x49, 0xee, 0xc2, 0x5a, 0x6a, 0xdb, 0x44, 0x66, 0x6a, 0x99, 0xfc, 0x1b, 0x60, 0x69, 0x45, 0x9e, 0xe3, 0x42, 0x97, 0xbb, + 0xa2, 0x00, 0xfd, 0xab, 0xa0, 0x0c, 0xa5, 0x2d, 0x8f, 0x47, 0xef, 0x8f, 0x4c, 0xe9, 0x24, 0x12, 0x9f, 0x22, 0x83, 0x4a, 0x93, 0x42, 0xef, 0xbd, 0x86, 0x01, 0xf0, 0xf9, 0x7c, 0x1f, 0x37, 0x45, + 0x55, 0x81, 0xda, 0x7e, 0x07, 0x06, 0xd8, 0x50, 0x96, 0xf3, 0x8d, 0x67, 0xd7, 0x03, 0x17, 0x07, 0x87, 0xa4, 0x1a, 0x45, 0xb3, 0xad, 0xe6, 0x55, 0x26, 0x5f, 0x8f, 0x75, 0x39, 0xb8, 0x78, 0xef, + 0xe9, 0x1c, 0xfc, 0xe0, 0xf1, 0x76, 0xe0, 0x43, 0x14, 0x81, 0xcf, 0x99, 0x0f, 0x46, 0x1a, 0x3c, 0xa5, 0xf0, 0xf6, 0xc6, 0x05, 0xfa, 0x98, 0x04, 0x06, 0xca, 0xbf, 0xaf, 0xe8, 0x9a, 0x14, 0xc8, + 0x94, 0xb6, 0xf5, 0x07, 0xbd, 0xee, 0x19, 0x05, 0x86, 0xc2, 0x0a, 0xf5, 0xe1, 0x58, 0x33, 0xf9, 0x7a, 0x29, 0x32, 0x1b, 0xbd, 0x71, 0xff, 0x36, 0x09, 0xcc, 0xd7, 0x51, 0x3c, 0xb9, 0x0c, 0xfc, + 0x13, 0x27, 0x3c, 0x79, 0xc0, 0x6c, 0xa5, 0x10, 0x88, 0x06, 0x91, 0x80, 0x1c, 0xe7, 0x94, 0x61, 0xee, 0x8e, 0x74, 0x8d, 0x68, 0x73, 0x35, 0xe9, 0x8b, 0x9b, 0xce, 0xcd, 0x75, 0x55, 0x7b, 0xe3, + 0xe0, 0xb0, 0xd3, 0xba, 0xe0, 0x8a, 0x83, 0xbc, 0xa7, 0xd5, 0x38, 0x1b, 0x09, 0x07, 0xc9, 0x6c, 0x89, 0x99, 0xbd, 0x8f, 0x2b, 0x81, 0xbb, 0x52, 0xc1, 0x59, 0x86, 0x36, 0x5d, 0x05, 0x2e, 0x48, + 0xb6, 0x85, 0x70, 0x46, 0x94, 0x3b, 0x39, 0xa6, 0x88, 0xee, 0x09, 0xc2, 0xac, 0xcc, 0xeb, 0x33, 0x45, 0xe7, 0x80, 0x0f, 0x54, 0x6a, 0x0b, 0x6e, 0xd2, 0x64, 0x3c, 0x1a, 0x0f, 0x2f, 0xfa, 0x57, + 0x49, 0xf0, 0xd9, 0x41, 0x6e, 0x5a, 0x09, 0xd4, 0x82, 0x7c, 0xc8, 0x34, 0x30, 0xbe, 0x45, 0x14, 0xfc, 0xf4, 0x5d, 0x02, 0xb3, 0x32, 0xff, 0xb6, 0x40, 0x43, 0x14, 0xfc, 0xe4, 0x75, 0xf6, 0xee, + 0x7b, 0xef, 0x25, 0x2a, 0x5d, 0xd7, 0x0a, 0xcf, 0xd3, 0xe9, 0x48, 0xc6, 0xe3, 0xe1, 0x78, 0xda, 0x1d, 0xf6, 0x92, 0xe8, 0x95, 0x8b, 0xfe, 0x84, 0x03, 0x95, 0xbc, 0x20, 0x0a, 0x81, 0x32, 0x85, + 0x42, 0xd7, 0xb6, 0x35, 0x11, 0x54, 0x63, 0x4c, 0xc2, 0x5c, 0xf0, 0x12, 0x2a, 0x2e, 0x25, 0xd5, 0x90, 0xab, 0xb8, 0x54, 0x2e, 0x7e, 0xb2, 0x05, 0x1b, 0x34, 0x4d, 0x03, 0x61, 0xdc, 0xdc, 0x68, + 0x3b, 0x4d, 0x0d, 0x9d, 0x46, 0x43, 0x14, 0x45, 0x11, 0xa4, 0x93, 0x78, 0x3c, 0x81, 0xdb, 0xf8, 0xaa, 0xdf, 0x8b, 0xf5, 0xd5, 0x68, 0x56, 0xf7, 0xc9, 0xdc, 0xd5, 0xe1, 0xc3, 0x44, 0x0e, 0xef, + 0x3f, 0x5e, 0xf2, 0x12, 0x3d, 0x4f, 0xc3, 0x33, 0x34, 0xff, 0x43, 0x22, 0x04, 0x17, 0x9d, 0x46, 0xe5, 0xd6, 0x12, 0xe6, 0xba, 0xd3, 0xd3, 0x67, 0x6e, 0xcb, 0x57, 0x02, 0x90, 0xad, 0xa9, 0xe0, + 0x4c, 0x77, 0x6f, 0x21, 0xfc, 0xcf, 0x8f, 0x67, 0x96, 0x71, 0x54, 0xa0, 0x3e, 0x90, 0xe6, 0xa0, 0xe9, 0x8a, 0xb7, 0x13, 0x50, 0xbb, 0xfb, 0x1c, 0xbf, 0xc6, 0x7b, 0x69, 0x0a, 0xb4, 0xe6, 0xd9, + 0xc9, 0x6a, 0xde, 0x15, 0x86, 0xc5, 0xd4, 0x4f, 0xca, 0xa4, 0x22, 0x45, 0x61, 0x76, 0xf6, 0x8a, 0x43, 0xcf, 0xf8, 0x82, 0xda, 0x6e, 0xcf, 0xeb, 0xd4, 0x3e, 0x35, 0xf2, 0xbe, 0xf7, 0xfe, 0xf3, + 0x8c, 0xb2, 0xcf, 0x5f, 0xc8, 0x9a, 0x84, 0xf8, 0x80, 0x2e, 0x08, 0x94, 0x51, 0xf5, 0xf5, 0x08, 0x50, 0x59, 0x5f, 0x0e, 0x84, 0x01, 0x65, 0x6b, 0x52, 0xd0, 0x5c, 0xdf, 0x5b, 0x98, 0x29, 0x2e, + 0xb6, 0x8d, 0x10, 0xec, 0x59, 0xa2, 0x47, 0x41, 0xff, 0x87, 0x45, 0x69, 0x0f, 0x9c, 0x64, 0xd0, 0x7b, 0x02, 0x1b, 0xaf, 0x63, 0x63, 0x62, 0xa8, 0x2e, 0x28, 0xcb, 0x8d, 0xda, 0x4a, 0xf0, 0x2f, + 0x98, 0x29, 0x98, 0x69, 0xfb, 0x73, 0x2a, 0x5a, 0x40, 0x43, 0x0c, 0xcd, 0xd6, 0x2e, 0x16, 0xa0, 0x96, 0x44, 0x99, 0x7e, 0x9f, 0x50, 0x26, 0xcd, 0xde, 0x9c, 0x17, 0xba, 0x37, 0xf2, 0xc3, 0x72, + 0xcd, 0x7c, 0xd7, 0x16, 0x5d, 0x90, 0xa2, 0x98, 0x91, 0xec, 0x5e, 0xfb, 0x95, 0xad, 0x84, 0xd0, 0x2e, 0xea, 0xa6, 0x5e, 0x97, 0x86, 0xbd, 0x2c, 0x87, 0x5e, 0x83, 0xbd, 0xd0, 0x1e, 0x30, 0x5b, + 0x94, 0x46, 0xe3, 0xe1, 0xc7, 0xa4, 0x3b, 0x39, 0x8f, 0xd3, 0xa4, 0xd7, 0x1f, 0x47, 0xbb, 0xb2, 0x6a, 0x7e, 0x06, 0x5e, 0xff, 0x42, 0x3f, 0x24, 0x76, 0x25, 0xec, 0x90, 0x3a, 0xf0, 0xa3, 0xa8, + 0x86, 0x3f, 0xb2, 0xbc, 0x87, 0x0a, 0x33, 0x75, 0x4e, 0x24, 0xf6, 0xa8, 0x70, 0x87, 0xf8, 0x53, 0xd2, 0x9d, 0x1a, 0xb9, 0xdd, 0x5e, 0x60, 0x56, 0xee, 0xcc, 0xaf, 0x7a, 0x3d, 0xf0, 0x3a, 0x73, + 0xca, 0xf2, 0x9a, 0xa7, 0x7f, 0x01, 0xc9, 0xa7, 0x7e, 0xaa, 0xf5, 0xdd, 0x19, 0xf9, 0x9f, 0xb5, 0xa7, 0x56, 0xc1, 0xcc, 0xd2, 0x98, 0x77, 0x92, 0x97, 0xe5, 0x10, 0x86, 0x9a, 0xbc, 0x26, 0x8c, + 0x22, 0x5f, 0xab, 0xf0, 0x0f, 0x68, 0x07, 0x5c, 0x59, 0xf2, 0xbd, 0x62, 0x6d, 0x86, 0x21, 0x69, 0xaa, 0xf5, 0x3a, 0x07, 0xc2, 0x5f, 0x0e, 0x8e, 0xd1, 0xa5, 0x95, 0xfb, 0x7b, 0x0f, 0x7c, 0xef, + 0x05, 0xff, 0x3b, 0xcf, 0x59, 0xf1, 0xbc, 0xdc, 0x7d, 0x38, 0x1e, 0xcb, 0xf6, 0x3a, 0x4f, 0x05, 0xbb, 0x9c, 0xd4, 0x91, 0x7a, 0x36, 0x33, 0x26, 0x70, 0x9f, 0xbf, 0xac, 0xcb, 0x30, 0xe3, 0x6c, + 0x4e, 0x17, 0xfb, 0x2c, 0x8d, 0x91, 0xe4, 0xf1, 0xee, 0xad, 0xd7, 0x35, 0xbb, 0x8d, 0xe2, 0x0b, 0x89, 0xb9, 0xb2, 0x93, 0x07, 0x85, 0xcc, 0x36, 0xe9, 0x76, 0xa1, 0x87, 0x05, 0xd9, 0x62, 0x9e, + 0x3c, 0x54, 0xc4, 0xac, 0x7b, 0xfa, 0x8e, 0x3a, 0xbd, 0x00, 0x7f, 0x25, 0x51, 0xc3, 0xef, 0x77, 0xc8, 0xb1, 0xa0, 0xa5, 0x8c, 0x7c, 0x08, 0x02, 0x7d, 0x70, 0xe0, 0xf8, 0x7b, 0x4d, 0x3b, 0x81, + 0x9c, 0x9b, 0x43, 0xfc, 0xf1, 0xf6, 0x7a, 0xda, 0x1d, 0x0e, 0x2e, 0xfa, 0x1f, 0xa6, 0x3b, 0xce, 0x51, 0x1a, 0xfd, 0xfb, 0xf9, 0xf5, 0x7f, 0x6b, 0x45, 0xde, 0x7b, 0x64, 0xb9, 0x35, 0xfc, 0xc7, + 0xaf, 0xc9, 0x08, 0x9e, 0x5f, 0x0f, 0x6c, 0x80, 0x9f, 0x8f, 0x49, 0x9a, 0x4c, 0x5c, 0xbe, 0x4c, 0x65, 0x49, 0x3e, 0x25, 0xd1, 0xcb, 0xf5, 0xcf, 0x62, 0x6c, 0x1c, 0x8f, 0x46, 0xc9, 0x78, 0xfa, + 0x31, 0x1e, 0x47, 0x5f, 0xf5, 0x7e, 0x63, 0x5f, 0x06, 0xf6, 0x4e, 0x6c, 0xbb, 0x5f, 0xe1, 0x17, 0x22, 0x0e, 0xe5, 0x5c, 0xc5, 0x37, 0x83, 0xee, 0x65, 0x32, 0x8e, 0xb8, 0x58, 0xd4, 0x4f, 0x4f, + 0xc3, 0x12, 0xd6, 0x2c, 0xa6, 0xb3, 0x75, 0xef, 0x8c, 0x6b, 0x42, 0x99, 0x77, 0xc0, 0x7f, 0x33, 0xbe, 0x8a, 0x7c, 0xfd, 0x7a, 0x95, 0x9d, 0xd3, 0x53, 0x81, 0x15, 0x77, 0xdc, 0x8d, 0x57, 0xac, + 0x59, 0x38, 0x3b, 0xd5, 0x5f, 0xed, 0xaa, 0x5d, 0x39, 0x75, 0x0a, 0x4e, 0x0f, 0x2c, 0x3c, 0x35, 0x6f, 0x95, 0xc3, 0xb5, 0xb6, 0x59, 0xb3, 0xb6, 0x7b, 0x17, 0xc3, 0xf1, 0x21, 0x28, 0x14, 0xbf, + 0x47, 0x26, 0xa3, 0xd7, 0xad, 0xb3, 0x1a, 0x1f, 0x06, 0x20, 0x31, 0xf4, 0x07, 0xdf, 0x00, 0xc8, 0xf3, 0x21, 0xaa, 0x04, 0xaf, 0x50, 0x28, 0x8a, 0xd2, 0x3f, 0x81, 0xde, 0x10, 0x8e, 0x3d, 0xdd, + 0xed, 0x9b, 0x42, 0x10, 0xc4, 0xba, 0x0a, 0x38, 0xc2, 0x1b, 0x51, 0xf8, 0xa0, 0x13, 0xd8, 0x0c, 0x45, 0x10, 0x9c, 0x7b, 0xfb, 0x4e, 0xce, 0x01, 0xdc, 0x5c, 0x45, 0x45, 0xc1, 0x37, 0x40, 0x56, + 0x8a, 0x97, 0x44, 0x51, 0xdd, 0xbc, 0x6c, 0x21, 0xe7, 0x1b, 0x56, 0xb7, 0xe9, 0xba, 0xf6, 0x3e, 0x49, 0x95, 0x6d, 0x38, 0x4c, 0x02, 0xda, 0x19, 0x32, 0x25, 0x74, 0x3f, 0x61, 0xda, 0x14, 0xdd, + 0xff, 0x19, 0x91, 0x12, 0x56, 0xf2, 0x80, 0x1f, 0x1c, 0xbf, 0x3e, 0x1f, 0xee, 0x0e, 0x90, 0xb6, 0xce, 0x57, 0x82, 0x2f, 0xe9, 0x8c, 0x2a, 0xdb, 0x01, 0x6a, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, + 0x5b, 0xc8, 0x89, 0x22, 0xe1, 0xfe, 0x12, 0x0e, 0x1a, 0x30, 0x0b, 0x5c, 0x04, 0x6c, 0xd3, 0x7c, 0x3b, 0xb8, 0x9b, 0xde, 0x26, 0xe3, 0xf3, 0x61, 0x5a, 0x37, 0x27, 0x4a, 0xac, 0xd0, 0x77, 0x34, + 0xe6, 0x5d, 0xa4, 0xef, 0x3a, 0x53, 0x8e, 0x0e, 0xc5, 0x18, 0x82, 0x13, 0xef, 0x04, 0xb0, 0x90, 0xb8, 0x97, 0xe9, 0xda, 0x57, 0x2d, 0x77, 0x9c, 0x8c, 0x86, 0x37, 0xe3, 0xab, 0x7d, 0xcf, 0xbc, + 0x93, 0xf9, 0x38, 0xcc, 0x8f, 0x18, 0xfe, 0x22, 0x6c, 0x59, 0x03, 0xff, 0xb4, 0xaf, 0x5d, 0xbe, 0x2a, 0x72, 0x76, 0xa4, 0x4c, 0xc1, 0x3f, 0xf4, 0xb9, 0x75, 0x90, 0x63, 0xaa, 0x20, 0x0c, 0xc3, + 0x43, 0xe6, 0x5e, 0x63, 0x5f, 0x67, 0xbb, 0xb3, 0x17, 0xa0, 0x3d, 0x73, 0x36, 0x99, 0x8f, 0x8a, 0x6f, 0x50, 0xc8, 0x25, 0x16, 0x05, 0xb4, 0xbb, 0xee, 0x49, 0xe4, 0xff, 0xf8, 0xff, 0xfe, 0xff, + 0x7a, 0xff, 0xfa, 0x97, 0xff, 0xc3, 0x06, 0x67, 0x59, 0x41, 0xf5, 0xd5, 0x1c, 0x01, 0xc3, 0x4d, 0x9b, 0xcf, 0xcc, 0xf5, 0x9f, 0x6e, 0xa5, 0xc2, 0x32, 0x1c, 0xa0, 0x0a, 0xef, 0x70, 0xd6, 0x35, + 0x14, 0xef, 0x2c, 0x0b, 0x9d, 0xc3, 0x71, 0x5b, 0x87, 0xff, 0xf8, 0x57, 0xa9, 0x04, 0x65, 0x8b, 0xdf, 0x3a, 0x9d, 0xbe, 0x1c, 0xac, 0x8a, 0x62, 0x28, 0x92, 0xb2, 0x52, 0xdb, 0xe3, 0x23, 0x1b, + 0x03, 0xdd, 0x63, 0x0f, 0xe2, 0xeb, 0x24, 0x38, 0x3a, 0x81, 0xb6, 0xd6, 0xfa, 0x0d, 0xfa, 0x51, 0x9c, 0xa6, 0x77, 0xc3, 0x71, 0x2f, 0x38, 0x3a, 0x39, 0x39, 0x81, 0x27, 0x06, 0x86, 0x5d, 0x81, + 0x39, 0x32, 0x45, 0x49, 0x21, 0x5f, 0x34, 0x76, 0x80, 0x4a, 0xb7, 0x18, 0x7b, 0xd2, 0xa7, 0xc6, 0xb4, 0xe0, 0xa9, 0x3e, 0xe7, 0xda, 0x1f, 0xf6, 0xe3, 0x57, 0x2d, 0x29, 0x45, 0xb1, 0xa6, 0x19, + 0x8e, 0x38, 0x65, 0xea, 0x9a, 0x30, 0xb2, 0x40, 0xf1, 0x5b, 0xa7, 0x93, 0x62, 0xb6, 0x12, 0x54, 0x6d, 0x47, 0x82, 0x2b, 0x9e, 0xf1, 0x02, 0x22, 0x70, 0xd4, 0x87, 0xeb, 0x93, 0x6d, 0x85, 0xbf, + 0x75, 0x3a, 0x93, 0x42, 0xbe, 0x3e, 0x7b, 0x07, 0x0d, 0x27, 0xea, 0xc4, 0x5d, 0xd0, 0x02, 0x8f, 0x8f, 0x0e, 0x92, 0x66, 0x2c, 0x6b, 0xc2, 0xe0, 0xe8, 0xa4, 0x36, 0xeb, 0xcf, 0xa3, 0xeb, 0x82, + 0x32, 0x2a, 0x97, 0x98, 0x1f, 0x20, 0xe9, 0xd9, 0x83, 0xe5, 0xaa, 0x8e, 0x7e, 0xab, 0xe9, 0x73, 0xec, 0x8a, 0x8f, 0x2b, 0x46, 0xfd, 0x79, 0x3d, 0x32, 0xc3, 0xbc, 0x05, 0xa6, 0x27, 0xd6, 0x8f, + 0x1c, 0x5d, 0x36, 0xd2, 0xcb, 0xb8, 0x7d, 0xf6, 0xe6, 0x2d, 0xc8, 0x55, 0x59, 0x0f, 0x61, 0xae, 0x0f, 0x2a, 0x89, 0xa9, 0x44, 0xb4, 0x40, 0xaf, 0x79, 0x0c, 0xd3, 0xcb, 0x78, 0x7a, 0xf6, 0xe6, + 0xed, 0x34, 0xbd, 0xb9, 0x8e, 0x7c, 0xff, 0x9f, 0x53, 0x96, 0xd3, 0x25, 0x39, 0x7b, 0xf3, 0x36, 0x5d, 0x95, 0x87, 0xc5, 0xb9, 0x69, 0xae, 0x2d, 0xd2, 0xae, 0xc7, 0x09, 0x9e, 0xa1, 0x08, 0x4c, + 0xd3, 0x79, 0xfc, 0x8d, 0x53, 0xe7, 0xb2, 0xe4, 0xff, 0xb0, 0x24, 0x72, 0x09, 0x11, 0x1c, 0x7f, 0x40, 0xd5, 0xd6, 0x70, 0xb8, 0xd4, 0xbf, 0x3f, 0xfb, 0x07, 0x49, 0xfa, 0xec, 0x43, 0x3b, 0x2e, + 0x16, 0x5c, 0x50, 0xb5, 0x2c, 0x75, 0xc8, 0xcf, 0xde, 0xbc, 0x3d, 0x09, 0x35, 0x65, 0x38, 0xe1, 0x57, 0x5a, 0xc7, 0xb1, 0x01, 0x6f, 0x2d, 0xb4, 0x3f, 0x6f, 0x80, 0xaa, 0x69, 0xda, 0x11, 0xb4, + 0x19, 0x82, 0xd1, 0x79, 0xd2, 0xb4, 0x02, 0xe0, 0x4e, 0x50, 0x85, 0xed, 0xe1, 0x4a, 0x55, 0x2b, 0x05, 0x47, 0xee, 0x59, 0x74, 0x41, 0x68, 0x61, 0xe7, 0x5a, 0xbb, 0x9c, 0x1f, 0x26, 0xd7, 0x65, + 0xbf, 0x65, 0x9f, 0x24, 0x87, 0x7b, 0xa5, 0x19, 0xc3, 0xcf, 0xd0, 0x8c, 0xbd, 0x05, 0x2f, 0xa9, 0xc4, 0x3c, 0x3c, 0x7a, 0xf7, 0x15, 0xad, 0x7d, 0xb6, 0x46, 0xa9, 0xe8, 0x42, 0xeb, 0xe1, 0x42, + 0x67, 0x1e, 0x15, 0x3e, 0xba, 0x4e, 0xf4, 0x6d, 0xa8, 0x14, 0x96, 0x95, 0x02, 0x02, 0x59, 0x81, 0x84, 0xed, 0xb0, 0xfd, 0x0d, 0xe1, 0x73, 0x3b, 0xe3, 0xaf, 0xb4, 0x1b, 0x79, 0xd3, 0x60, 0x37, + 0xe8, 0x34, 0x4e, 0x00, 0x73, 0xf3, 0x6e, 0x4b, 0x67, 0xf0, 0xbc, 0x83, 0x3e, 0x3c, 0x46, 0x09, 0x38, 0x5c, 0x6d, 0x1f, 0xab, 0xc6, 0x07, 0xaa, 0xe0, 0x75, 0x73, 0xed, 0x8f, 0x83, 0xef, 0xf5, + 0x49, 0x36, 0x43, 0x84, 0xab, 0xe4, 0x36, 0xb9, 0x82, 0xd7, 0xd0, 0x78, 0xb4, 0xd5, 0x5d, 0xc0, 0x48, 0xf0, 0x35, 0xcd, 0x11, 0x08, 0xf8, 0x52, 0x11, 0x96, 0x13, 0x91, 0xd3, 0xff, 0xc3, 0xdc, + 0x87, 0x0d, 0xd9, 0x6a, 0x2b, 0x05, 0x2a, 0x41, 0x71, 0x6d, 0xed, 0xec, 0x5e, 0xf5, 0x81, 0x88, 0x85, 0xbb, 0xb0, 0x37, 0xb4, 0x70, 0xf7, 0xbd, 0xf9, 0x13, 0x8a, 0x19, 0xbe, 0xcc, 0xb8, 0x5a, + 0xc2, 0x9d, 0x19, 0x84, 0xd9, 0xe1, 0x36, 0xe3, 0xac, 0x5d, 0xff, 0x46, 0x33, 0x3b, 0xd2, 0x2d, 0x75, 0xd8, 0x78, 0x0a, 0x74, 0xaf, 0x7b, 0xd3, 0xab, 0xfe, 0x20, 0x99, 0xc6, 0xe3, 0x0f, 0x69, + 0x14, 0xfc, 0xe4, 0x79, 0xc1, 0x61, 0xcf, 0x19, 0x80, 0x76, 0xec, 0xa5, 0xfe, 0xd5, 0x6e, 0xee, 0x87, 0x98, 0x07, 0x0b, 0xbd, 0xe4, 0xfc, 0xe6, 0x43, 0x63, 0xb9, 0x9d, 0x15, 0x44, 0xca, 0x8a, + 0xa8, 0xe5, 0xa3, 0xa4, 0xeb, 0x4d, 0xbf, 0xdd, 0xb3, 0xcd, 0x61, 0xb9, 0x2a, 0x14, 0xbd, 0xe6, 0xf9, 0xaa, 0xc0, 0x91, 0x6d, 0x51, 0x7a, 0xf5, 0x33, 0x32, 0x7a, 0xe1, 0x19, 0x68, 0x95, 0x3e, + 0xee, 0x5a, 0x83, 0xda, 0x0e, 0x6b, 0x77, 0xe0, 0x26, 0x48, 0x2f, 0xe5, 0xa4, 0x7e, 0xa0, 0xe8, 0x96, 0xdc, 0x2c, 0x3c, 0x9a, 0x02, 0xbd, 0xb6, 0xbd, 0xfa, 0x93, 0x8e, 0xbf, 0x41, 0x12, 0xec, + 0xbf, 0x07, 0xde, 0x8b, 0xe3, 0xb7, 0xfd, 0xa3, 0xd5, 0x4d, 0x9f, 0xb8, 0x54, 0x4f, 0xa6, 0x6f, 0xfb, 0xf1, 0xd1, 0xdf, 0x37, 0x7e, 0xe3, 0x52, 0x7d, 0xc7, 0xfc, 0xad, 0xa6, 0xfa, 0x3e, 0x79, + 0xdf, 0x1e, 0xbf, 0xd5, 0x54, 0xbb, 0xe1, 0x9b, 0x76, 0xdf, 0xfa, 0x5f, 0x11, 0xfb, 0xa7, 0xb5, 0x7a, 0xf2, 0xa8, 0x8f, 0xd0, 0xd3, 0xf1, 0xfe, 0x7e, 0x84, 0x63, 0x06, 0xb6, 0x4f, 0xe6, 0xb5, + 0x86, 0xca, 0x84, 0x99, 0x33, 0xdf, 0xca, 0xf4, 0x9a, 0x54, 0x93, 0x64, 0x7c, 0xdd, 0x1f, 0xc4, 0x93, 0x44, 0x83, 0x7f, 0x47, 0x67, 0x8e, 0xf4, 0x61, 0x02, 0x75, 0x2c, 0x4f, 0xbb, 0x76, 0xe7, + 0xf4, 0xfc, 0x70, 0xf3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x68, 0x33, 0xee, 0xa3, 0xf6, 0x0a, 0x00, 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x57, 0x51, 0x6f, 0xe3, 0x28, 0x10, 0x7e, 0xcf, 0xaf, 0xb0, 0xa2, 0xbe, 0x1a, 0x92, 0xee, 0x9d, 0x6e, 0x55, 0x71, + 0xac, 0xf6, 0xe1, 0x56, 0x57, 0xa9, 0xdd, 0xad, 0xd4, 0xde, 0xea, 0x5e, 0x29, 0x1e, 0x3b, 0xb4, 0x36, 0x78, 0x01, 0xa7, 0x89, 0xaa, 0xfc, 0xf7, 0x15, 0x60, 0x3b, 0xb6, 0x63, 0xb7, 0xd9, 0x2a, + 0xdb, 0x37, 0x33, 0xf3, 0x31, 0x0c, 0xdf, 0x7c, 0x86, 0x81, 0x7c, 0xda, 0x14, 0x79, 0xb4, 0x06, 0x6d, 0x84, 0x92, 0x7f, 0xcf, 0x97, 0x68, 0x31, 0xff, 0x44, 0x67, 0xa4, 0xd4, 0xea, 0x01, 0xb8, + 0x8d, 0x36, 0x46, 0x5c, 0x18, 0xbe, 0x82, 0x82, 0x5d, 0x29, 0xce, 0xac, 0xc7, 0xac, 0xac, 0x2d, 0x2f, 0x30, 0x2e, 0xd8, 0x1a, 0x24, 0x62, 0x25, 0xe3, 0x2b, 0x40, 0x4a, 0x67, 0xf8, 0xe6, 0xdb, + 0x35, 0xfe, 0x03, 0x2d, 0xd0, 0x22, 0x72, 0x08, 0x33, 0x06, 0xd9, 0x98, 0x24, 0x18, 0x63, 0x0f, 0x44, 0x1b, 0x93, 0xcc, 0xa3, 0x4d, 0x91, 0x4b, 0x73, 0x44, 0xd8, 0xf9, 0x2c, 0x8a, 0xa2, 0x80, + 0xbe, 0xd8, 0x18, 0xd1, 0xce, 0x78, 0x7a, 0x7a, 0x42, 0x4f, 0x1f, 0x3c, 0xf6, 0x7c, 0xb1, 0x58, 0xe2, 0xff, 0xaf, 0xaf, 0x6e, 0x7d, 0xca, 0xb1, 0x90, 0xc6, 0x32, 0xc9, 0x61, 0x4e, 0x67, 0x51, + 0x44, 0x0a, 0x95, 0x40, 0xfe, 0x3d, 0xec, 0x94, 0xfa, 0x88, 0x04, 0xf7, 0x6c, 0x0e, 0x94, 0x69, 0x55, 0x95, 0x97, 0x09, 0x55, 0x3a, 0x43, 0x8c, 0x17, 0x40, 0x70, 0x63, 0x71, 0x5e, 0xa6, 0xad, + 0x48, 0x19, 0xb7, 0x97, 0x09, 0x4d, 0x2b, 0xc9, 0x1d, 0x1f, 0x04, 0x77, 0x8c, 0x0e, 0x53, 0x73, 0x49, 0x97, 0x6e, 0x85, 0xf8, 0xf6, 0xeb, 0xe7, 0x9b, 0xdb, 0x7f, 0xbf, 0xdd, 0x11, 0xbc, 0xee, + 0xac, 0x52, 0x6a, 0x55, 0x82, 0xb6, 0x02, 0x0c, 0xf5, 0x9b, 0x22, 0x5c, 0x15, 0xa5, 0xc8, 0x41, 0xc7, 0x65, 0x5e, 0x65, 0x42, 0xa2, 0x06, 0xfc, 0x01, 0x7d, 0x44, 0x4b, 0x82, 0xa7, 0xdc, 0x61, + 0x72, 0xa0, 0xac, 0xc1, 0x20, 0x0d, 0x39, 0x30, 0x03, 0x74, 0xb9, 0x24, 0x78, 0xc2, 0x15, 0xe6, 0xd5, 0x45, 0x46, 0xf7, 0x95, 0xc8, 0x13, 0x64, 0x54, 0xa5, 0x39, 0xfc, 0x23, 0xb9, 0x4a, 0x84, + 0xcc, 0xe8, 0x7f, 0x77, 0x5f, 0xe2, 0x8f, 0x04, 0xbf, 0x88, 0xe9, 0x87, 0xd1, 0x50, 0x2a, 0x6d, 0x85, 0xcc, 0x90, 0xaa, 0x6c, 0x59, 0xd9, 0xa9, 0x50, 0x93, 0xb8, 0x10, 0xee, 0x47, 0xc5, 0xf4, + 0x63, 0x65, 0x50, 0x99, 0x33, 0x9b, 0x2a, 0x5d, 0xa0, 0x86, 0xdf, 0x58, 0x24, 0xb4, 0x76, 0xc6, 0xf7, 0xaa, 0x20, 0xf8, 0x45, 0xe4, 0x44, 0x30, 0x5f, 0x4d, 0xe7, 0x17, 0x0a, 0x0d, 0x9d, 0x23, + 0x11, 0x5b, 0xf8, 0x44, 0xb8, 0x7d, 0x9d, 0xce, 0xd1, 0x39, 0xfa, 0x22, 0x24, 0xcb, 0x47, 0xa2, 0xf4, 0xcb, 0x65, 0x1e, 0x45, 0x79, 0x79, 0x67, 0xa8, 0xd5, 0x15, 0x10, 0xdc, 0x8c, 0x6a, 0x5f, + 0xa5, 0x21, 0x15, 0x1a, 0x0e, 0x75, 0xe0, 0xc4, 0x74, 0xfd, 0x17, 0xc1, 0x53, 0x08, 0x27, 0x2b, 0xdc, 0xd7, 0x15, 0x49, 0xa0, 0x04, 0x99, 0x80, 0xe4, 0xdb, 0x6b, 0x26, 0x59, 0x06, 0x05, 0x48, + 0x5b, 0x2f, 0xd4, 0xba, 0x5a, 0x0d, 0xf6, 0xf0, 0x8d, 0xa9, 0xf3, 0x47, 0x9c, 0x3d, 0x4f, 0xb2, 0xb3, 0xeb, 0xfd, 0x25, 0xf5, 0xbc, 0xce, 0x6f, 0x31, 0x32, 0xb5, 0x53, 0xaa, 0xdd, 0xf0, 0x17, + 0xaa, 0x03, 0x34, 0x3b, 0x1b, 0x99, 0x5d, 0xbb, 0x76, 0xbd, 0xbf, 0xaa, 0x9e, 0x66, 0xb7, 0x25, 0xd0, 0xd2, 0xe9, 0xc3, 0x7f, 0xed, 0x1d, 0x86, 0xab, 0x12, 0xa8, 0x28, 0x9c, 0xfa, 0x08, 0x0e, + 0xa3, 0x66, 0xe7, 0x78, 0xb8, 0xf5, 0x8e, 0xa5, 0x61, 0x13, 0x4f, 0xd1, 0x39, 0x42, 0xe6, 0x08, 0x95, 0x2d, 0x91, 0x7b, 0xe5, 0x1d, 0xd0, 0xd6, 0x25, 0xad, 0x91, 0x7a, 0x5a, 0xc9, 0x1f, 0xdb, + 0xf8, 0x51, 0x32, 0x2b, 0xd6, 0x10, 0xc3, 0x1a, 0xa4, 0x35, 0x87, 0x8c, 0x8d, 0xec, 0xe0, 0x74, 0x29, 0x98, 0x82, 0xe5, 0xb9, 0xde, 0x42, 0xbc, 0x02, 0x96, 0xdb, 0xd5, 0x3b, 0xaf, 0xce, 0x34, + 0x7f, 0xe7, 0x15, 0x1f, 0x2a, 0x29, 0xec, 0x9f, 0x63, 0xb2, 0xac, 0x45, 0x64, 0xc1, 0xf4, 0x25, 0xf4, 0xcb, 0xe9, 0x68, 0x30, 0x36, 0x66, 0xc6, 0xfd, 0xcd, 0xc9, 0x8b, 0x39, 0xf5, 0x81, 0x6f, + 0xcf, 0x68, 0x44, 0xd0, 0xfe, 0x4c, 0xaf, 0xd1, 0xe1, 0x34, 0xd9, 0x1f, 0x05, 0x61, 0x4c, 0x4f, 0x7a, 0x0c, 0x34, 0xf4, 0x86, 0x0e, 0x20, 0xac, 0x70, 0xda, 0x7f, 0x1f, 0x36, 0x16, 0xa4, 0xb3, + 0x35, 0xa7, 0x6b, 0xc7, 0xd0, 0x45, 0x01, 0xaf, 0x6c, 0xdf, 0xd8, 0x35, 0x77, 0xad, 0x6e, 0xe7, 0x8a, 0xe5, 0xa6, 0x6f, 0xab, 0xad, 0xd4, 0x33, 0x48, 0xb0, 0xff, 0x1e, 0x05, 0x64, 0x20, 0x41, + 0x33, 0x0b, 0x31, 0x57, 0x09, 0x1c, 0x0d, 0x8c, 0x5d, 0x35, 0xcd, 0x18, 0x3c, 0xd8, 0xfa, 0x79, 0xe3, 0x91, 0xc4, 0x3b, 0xc6, 0x7d, 0x4d, 0x71, 0xbf, 0xa8, 0x87, 0x35, 0xee, 0x94, 0x22, 0xd4, + 0x68, 0xd0, 0x77, 0xbc, 0x5a, 0xac, 0x89, 0x3e, 0x65, 0xb4, 0x56, 0x5c, 0xc9, 0x54, 0x64, 0x95, 0x66, 0x43, 0xca, 0xdb, 0x66, 0xe8, 0xb3, 0xce, 0x06, 0xbc, 0x13, 0xa6, 0x33, 0x1a, 0x97, 0x4c, + 0xb3, 0x02, 0x2c, 0x68, 0x7f, 0x0e, 0x66, 0x7d, 0x32, 0xc6, 0x27, 0x3b, 0xfb, 0xc8, 0x72, 0x6f, 0xa0, 0x64, 0x70, 0xff, 0xbe, 0x4a, 0xc9, 0xc4, 0x7d, 0xfd, 0x8b, 0x94, 0x98, 0xad, 0xb1, 0x50, + 0xdc, 0x84, 0xeb, 0x7d, 0xfb, 0x9d, 0x69, 0xc1, 0xee, 0x73, 0x18, 0xb2, 0xf3, 0xc0, 0xd6, 0x0c, 0x55, 0x56, 0xe4, 0x28, 0x57, 0x59, 0xe6, 0x3a, 0xac, 0xc2, 0x5f, 0x54, 0xda, 0xb7, 0xb3, 0x0f, + 0xf7, 0xca, 0x18, 0xe7, 0xa9, 0x8d, 0xe8, 0x4a, 0x65, 0xe1, 0x22, 0xd3, 0x04, 0x4f, 0x4f, 0xed, 0x2f, 0x11, 0x1a, 0xca, 0x95, 0x2a, 0x80, 0x9e, 0x3d, 0xef, 0x07, 0xbb, 0xa6, 0xd5, 0xf4, 0x9e, + 0x5e, 0x41, 0x5e, 0x4d, 0xfd, 0x74, 0xb5, 0x49, 0x99, 0xc8, 0x0d, 0x4b, 0x7f, 0x4b, 0x6d, 0x4e, 0x77, 0x68, 0x08, 0x69, 0x21, 0x0b, 0x7b, 0x8d, 0xc3, 0xb1, 0x3d, 0x7d, 0x2c, 0xac, 0x41, 0x8b, + 0x74, 0x7b, 0xe4, 0x49, 0xf0, 0x92, 0x82, 0xa2, 0xa3, 0x55, 0xe4, 0x91, 0xa1, 0xdb, 0x40, 0xa2, 0x60, 0x19, 0xa0, 0x92, 0xd9, 0x15, 0x3d, 0x7b, 0xee, 0x3f, 0x05, 0x12, 0xa1, 0x81, 0x5b, 0xa5, + 0xb7, 0x3b, 0x3c, 0x74, 0xa5, 0xae, 0x0d, 0xfe, 0xca, 0x0a, 0xd8, 0xc5, 0xba, 0x92, 0xd2, 0xc9, 0xeb, 0x30, 0xde, 0xe1, 0x9a, 0xbf, 0x5f, 0xbd, 0xd1, 0x5b, 0x14, 0x1c, 0x1d, 0xa7, 0xe2, 0x68, + 0x5a, 0xc9, 0xc1, 0xf5, 0xa6, 0x53, 0xba, 0x19, 0xd5, 0x1d, 0x68, 0x7b, 0x63, 0xbb, 0x47, 0x57, 0x2a, 0xda, 0x04, 0x9a, 0x61, 0x1b, 0x44, 0x24, 0x34, 0x50, 0x4e, 0xb0, 0xe8, 0xb4, 0x15, 0xdc, + 0x8a, 0xf5, 0x20, 0xb5, 0xe6, 0x2d, 0xba, 0xed, 0x65, 0x2b, 0x59, 0x01, 0x6d, 0x04, 0x3f, 0xe8, 0x24, 0x3d, 0x9c, 0x41, 0xf0, 0x61, 0xe0, 0x83, 0x27, 0xae, 0x37, 0x36, 0x8f, 0x9d, 0x94, 0xe5, + 0x66, 0xf8, 0xf6, 0xf1, 0x80, 0xf6, 0xb6, 0x67, 0xfc, 0xd1, 0x49, 0xc5, 0xb7, 0xf0, 0x4d, 0x1e, 0xa3, 0xce, 0xd9, 0x20, 0xab, 0x7d, 0x0b, 0x8e, 0x3b, 0xa4, 0xb4, 0x03, 0x43, 0x67, 0xed, 0x4b, + 0x94, 0xce, 0x7e, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb4, 0x8f, 0xae, 0x2b, 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, + 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x6c, 0x8f, 0xb1, 0x6e, 0xf3, 0x30, 0x0c, 0x84, 0x77, 0x3e, 0xc5, 0x8d, 0x89, 0x07, 0xfb, 0x01, 0xb2, 0xe4, 0x5f, 0x02, 0xfc, 0x05, 0x8a, 0xa2, 0x40, + 0x3b, 0x74, 0x54, 0x14, 0xda, 0x16, 0x62, 0x4b, 0xb2, 0x28, 0xb5, 0x35, 0x8a, 0xbc, 0x7b, 0x21, 0xd9, 0x4e, 0x96, 0x6a, 0x91, 0x44, 0xf2, 0xbe, 0xe3, 0x79, 0xa5, 0xaf, 0xaa, 0x63, 0xb4, 0xc9, + 0xea, 0x68, 0x9c, 0x95, 0x03, 0x91, 0x19, 0xbd, 0x0b, 0x11, 0xc6, 0xd5, 0x53, 0x52, 0xe1, 0x9a, 0xa4, 0x6e, 0x93, 0x9d, 0xe6, 0xfa, 0x94, 0xec, 0x74, 0x20, 0x6a, 0xaa, 0x8a, 0x50, 0xe1, 0xc3, + 0xa5, 0x80, 0xd3, 0x2a, 0x83, 0x1e, 0x94, 0x08, 0xa1, 0x6a, 0xc8, 0xa7, 0xf3, 0x60, 0xf4, 0x52, 0x78, 0xf4, 0x7f, 0x88, 0x00, 0xa0, 0x68, 0xf3, 0xa9, 0xf0, 0x2e, 0x8c, 0xd8, 0x33, 0x5e, 0x17, + 0x8f, 0x3c, 0x3a, 0xcd, 0xe0, 0xef, 0xc8, 0x56, 0xb2, 0xa2, 0x75, 0x01, 0xd9, 0x62, 0xdb, 0xac, 0xc6, 0x5b, 0x6f, 0xe4, 0xfe, 0x85, 0x98, 0xd1, 0x0f, 0x33, 0x58, 0xf7, 0x8e, 0x05, 0x26, 0x0a, + 0x8c, 0xf5, 0x29, 0x6e, 0xf8, 0xa3, 0x57, 0x41, 0x8d, 0x4b, 0x0d, 0x0a, 0x4f, 0xea, 0x53, 0xe1, 0xcc, 0xca, 0xde, 0xfb, 0x81, 0x63, 0x0a, 0xf6, 0x8f, 0x56, 0x53, 0xee, 0x63, 0xde, 0xa7, 0xbc, + 0xd6, 0x40, 0x2f, 0x29, 0x66, 0xd4, 0xe6, 0xbf, 0xfb, 0x5f, 0xc8, 0x85, 0xbf, 0xdf, 0xe2, 0x95, 0x88, 0x0d, 0xfe, 0x5d, 0x2e, 0x38, 0x27, 0x31, 0x96, 0x45, 0x30, 0xb8, 0xce, 0x68, 0xf4, 0x1c, + 0xf8, 0x31, 0xb3, 0x7a, 0x5b, 0xfe, 0x5a, 0xb1, 0xbb, 0xc2, 0xa9, 0x3b, 0x8e, 0xcf, 0x2c, 0xa2, 0x3a, 0xde, 0xed, 0xf7, 0x87, 0x32, 0x7e, 0x23, 0xba, 0xd1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x48, 0x0a, 0xe7, 0x07, 0xf9, 0x00, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, + 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x8e, 0x31, + 0x0e, 0xc2, 0x30, 0x0c, 0x45, 0xf7, 0x9c, 0xe2, 0x8f, 0xed, 0xc2, 0x05, 0x2a, 0x0e, 0xc0, 0xc0, 0xc4, 0x09, 0x42, 0x30, 0xc1, 0xa2, 0xa4, 0x51, 0xec, 0x74, 0xa9, 0x7a, 0x77, 0x54, 0x12, 0xa9, + 0x54, 0x42, 0x0c, 0xf5, 0xf8, 0xff, 0x7f, 0x4f, 0x8e, 0xd6, 0x3d, 0xad, 0x27, 0xdc, 0x73, 0x70, 0xca, 0x43, 0x90, 0xce, 0x98, 0x98, 0xaf, 0x3d, 0x3b, 0xb8, 0xde, 0x8a, 0xe0, 0x14, 0x62, 0x56, + 0x4c, 0x06, 0x00, 0x62, 0xe2, 0xd1, 0x2a, 0xe1, 0xa2, 0x89, 0x83, 0xc7, 0x8b, 0x44, 0xac, 0xa7, 0xce, 0x94, 0xb2, 0x50, 0x9f, 0x7d, 0xd3, 0x62, 0x9a, 0x7f, 0xc4, 0x5b, 0xb0, 0xad, 0xda, 0xe5, + 0xf4, 0xc1, 0x72, 0xa8, 0x39, 0x8e, 0xab, 0x7a, 0xe9, 0xb6, 0xa6, 0xea, 0xf0, 0xa4, 0xe7, 0x32, 0x6a, 0xbe, 0x3d, 0x89, 0x34, 0xa7, 0xf0, 0x8f, 0x1f, 0x07, 0xbe, 0x41, 0x56, 0x7a, 0xef, 0x4f, + 0xb3, 0x79, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdd, 0x4f, 0x11, 0xc3, 0x8a, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x8e, 0x31, 0x0e, 0xc2, 0x30, 0x0c, 0x45, 0xf7, 0x9c, 0xe2, 0x8f, 0xed, 0xc2, 0x05, 0x2a, 0x8e, 0x80, 0x18, 0x38, 0x41, 0x08, 0x26, 0x58, 0x94, 0x34, 0x8a, + 0xed, 0x2e, 0x55, 0xef, 0x8e, 0xaa, 0x54, 0x2a, 0x95, 0x10, 0x03, 0x1e, 0xff, 0xf7, 0x7b, 0xfa, 0xd9, 0x87, 0xa7, 0x8f, 0x84, 0xbb, 0xa5, 0xa0, 0x3c, 0x24, 0xe9, 0x9c, 0xcb, 0x76, 0xed, 0x39, + 0x20, 0xf4, 0x5e, 0x04, 0x67, 0xd3, 0x6c, 0x8a, 0xc9, 0x01, 0x40, 0x2e, 0x3c, 0x7a, 0x25, 0x5c, 0xb4, 0x70, 0x8a, 0x78, 0x91, 0x88, 0x8f, 0xd4, 0xb9, 0x5a, 0x56, 0xac, 0x02, 0x4d, 0x8b, 0x69, + 0xfe, 0x96, 0xef, 0xd1, 0x76, 0x15, 0x2f, 0xa7, 0x0f, 0x96, 0xc3, 0x9a, 0xe3, 0xb8, 0xc9, 0x97, 0x6e, 0xaf, 0x5a, 0x1d, 0x91, 0xf4, 0x54, 0x9f, 0x9a, 0x4f, 0x4f, 0x21, 0xb5, 0x92, 0x7e, 0xf1, + 0xe3, 0xc0, 0x37, 0xc8, 0x46, 0xff, 0xbb, 0x69, 0x76, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfa, 0x49, 0xd9, 0x7c, 0x8a, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, + 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, + 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x74, 0x8c, 0x41, 0xae, 0xc2, 0x30, 0x0c, 0x44, 0xf7, 0x39, 0x45, 0xa4, 0xae, 0x9b, 0x7f, + 0x82, 0xac, 0xfe, 0x49, 0x2c, 0x70, 0x48, 0x54, 0x63, 0xb7, 0x8e, 0x5d, 0x91, 0xdb, 0x23, 0x54, 0x51, 0x56, 0x5d, 0xbe, 0x99, 0x37, 0x33, 0xc5, 0x7f, 0xe1, 0xd2, 0x1e, 0xae, 0x60, 0x4d, 0x38, + 0x96, 0x46, 0x18, 0xa6, 0xb8, 0xe0, 0x88, 0x39, 0xee, 0x40, 0x8e, 0x61, 0x73, 0xd0, 0xc5, 0x7b, 0x2a, 0xce, 0xdb, 0x48, 0xf8, 0x5a, 0x45, 0x2d, 0x17, 0xe7, 0xdb, 0x67, 0x70, 0xb6, 0xfd, 0x09, + 0x44, 0x3a, 0x70, 0xae, 0x08, 0x64, 0x35, 0xa9, 0x88, 0xcd, 0x2b, 0x58, 0xcd, 0x7f, 0x47, 0x72, 0x69, 0x52, 0xdb, 0x91, 0xb1, 0xf7, 0xc3, 0xfe, 0xd2, 0xf5, 0x31, 0xc2, 0xbd, 0xfd, 0xfc, 0x13, + 0xc3, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x83, 0x67, 0x54, 0xb9, 0x75, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x8c, 0x92, 0x4d, 0x6f, 0xdb, 0x30, + 0x0c, 0x86, 0xef, 0xfe, 0x15, 0x9c, 0x4e, 0x32, 0x90, 0xb1, 0x59, 0xb1, 0xd3, 0x8c, 0x01, 0x2d, 0x8a, 0x0d, 0xeb, 0xa1, 0x1b, 0x36, 0x04, 0x3b, 0xe5, 0xa2, 0xca, 0x9c, 0xa3, 0xd4, 0x91, 0x54, + 0x91, 0xca, 0x50, 0x04, 0xf9, 0xef, 0x83, 0xbf, 0xd2, 0x74, 0xc9, 0x3e, 0x74, 0x31, 0x61, 0x3e, 0x14, 0xdf, 0x97, 0x54, 0x34, 0xf6, 0xc1, 0x34, 0x04, 0x3f, 0xb2, 0xb7, 0xe2, 0x82, 0xe7, 0xaa, + 0x28, 0xdc, 0x26, 0x86, 0x24, 0xe0, 0x02, 0x3e, 0x66, 0x93, 0x1e, 0x32, 0xa3, 0x10, 0x0b, 0xae, 0xb3, 0x77, 0x82, 0x5f, 0x87, 0x5f, 0x0b, 0x62, 0xa9, 0x8e, 0xc8, 0x44, 0x2c, 0x86, 0x39, 0x27, + 0xaa, 0xf1, 0x1b, 0xb1, 0x5c, 0x0f, 0xf1, 0x01, 0x09, 0xa9, 0xc1, 0x95, 0xd9, 0xd8, 0x8e, 0xc3, 0x9b, 0x90, 0xe8, 0xce, 0x88, 0x5d, 0x51, 0xe2, 0x17, 0xc4, 0xd0, 0x62, 0x9d, 0xa3, 0x13, 0x4a, + 0x68, 0xa2, 0xc3, 0x6b, 0x66, 0x4a, 0xa3, 0xb0, 0xbf, 0x82, 0x83, 0xa0, 0x89, 0x61, 0x31, 0xe2, 0xec, 0xcb, 0xae, 0x53, 0x47, 0xa4, 0xc7, 0x6c, 0xda, 0x45, 0xa8, 0xfe, 0x0b, 0xf6, 0x41, 0x3e, + 0xe7, 0xb6, 0xfd, 0x6e, 0xda, 0x4c, 0x55, 0x51, 0x5c, 0x1d, 0xf9, 0x2f, 0x62, 0xbe, 0x6f, 0x9d, 0x05, 0xdb, 0x1a, 0x66, 0xf8, 0x38, 0x4e, 0xb0, 0xcb, 0xc0, 0xae, 0x28, 0x00, 0x00, 0xae, 0x7a, + 0xac, 0x8b, 0xb6, 0xc1, 0xd5, 0xd0, 0x8d, 0x71, 0xc2, 0x74, 0x09, 0xbb, 0x3e, 0xd3, 0x9d, 0x2f, 0x59, 0x62, 0x16, 0x08, 0xc3, 0xe7, 0x3d, 0x68, 0x4f, 0x3f, 0xe1, 0x99, 0x2c, 0x71, 0x5a, 0x4f, + 0x9f, 0xb8, 0xf5, 0x31, 0x8b, 0x56, 0x9f, 0xa8, 0x6d, 0xc3, 0x2b, 0x55, 0x96, 0xd5, 0xe1, 0x9e, 0xe7, 0x69, 0xa1, 0xe9, 0xc3, 0x0f, 0x9d, 0x55, 0x3e, 0xb0, 0xb3, 0xb1, 0x05, 0x36, 0x24, 0x77, + 0xc4, 0x6c, 0x1a, 0xd2, 0x53, 0xfd, 0xfe, 0x77, 0xc9, 0xa3, 0xbb, 0x13, 0xe5, 0xb7, 0x5e, 0xa8, 0x49, 0xe6, 0xc4, 0xc4, 0xd1, 0xda, 0xb1, 0x71, 0x5b, 0xf2, 0xba, 0x44, 0x1b, 0xbc, 0x90, 0x97, + 0xc5, 0x53, 0x24, 0xad, 0x4c, 0x8c, 0xad, 0xb3, 0x7d, 0xe1, 0xc5, 0x9a, 0x83, 0x57, 0xe5, 0xa1, 0x76, 0x3a, 0x78, 0x1f, 0xea, 0x27, 0xad, 0x76, 0x4b, 0xb5, 0x19, 0xe4, 0x2d, 0xd5, 0x3b, 0x58, + 0x0e, 0xf2, 0x97, 0x6a, 0x7f, 0xae, 0x62, 0x45, 0xa6, 0xa6, 0xa4, 0x95, 0xa5, 0xd7, 0xae, 0x56, 0x33, 0x50, 0x6f, 0x2f, 0xff, 0x81, 0x71, 0x24, 0xbb, 0xa5, 0xc4, 0x2e, 0xf8, 0x8e, 0x7f, 0x83, + 0xf3, 0x73, 0x05, 0x31, 0xb0, 0x68, 0x75, 0x71, 0x2e, 0x25, 0xab, 0xde, 0x5c, 0xf7, 0x6e, 0x32, 0xdf, 0x84, 0x9a, 0xf4, 0xe5, 0x7c, 0xfe, 0x47, 0x33, 0xa3, 0x13, 0x35, 0x83, 0xf1, 0xe1, 0x8d, + 0xeb, 0x50, 0x47, 0x93, 0xdf, 0x17, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe1, 0x2d, 0xc8, 0x7b, 0x92, 0x01, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, + 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x6c, 0x8e, 0x3b, 0x8e, 0x83, 0x40, 0x10, 0x44, 0xf3, 0x3e, 0x45, 0x9d, 0x60, 0x38, 0x00, 0xc9, 0x26, 0xbb, 0x12, 0xc9, 0x4a, 0x96, 0xb8, 0xc0, 0x30, 0xb4, 0xf1, 0x18, 0xe8, 0xc1, 0x74, 0xb7, 0x85, 0x64, 0xf9, 0xee, 0x16, 0xfe, 0x64, 0x4e, 0x5f, 0xe9, 0x55, 0xd5, 0x12, 0xd3, 0x18, 0x07, 0xc6, 0xd1, 0x25, 0x59, 0x2e, 0xa2, 0x35, 0x51, 0x9e, 0x97, 0xb2, 0x1a, 0x72, 0x09, 0x17, 0x8f, 0xeb, 0xe8, 0x1a, 0x8c, 0xd5, 0xc2, 0xd9, 0x25, 0x5b, 0x38, 0xbc, 0x50, 0x23, 0xc6, 0xc3, 0x1a, 0x77, 0xa5, 0x65, 0xb5, 0x9a, 0xe8, 0xe7, 0x7b, 0x42, 0x8b, 0x77, 0x53, 0x4e, 0x48, 0x53, 0x54, 0xc5, 0x7f, 0xb4, 0x7c, 0xe5, 0xbf, 0xf7, 0x58, 0xd3, 0x82, 0x37, 0x63, 0xe9, 0x15, 0x1f, 0xb4, 0x2b, 0xb8, 0x11, 0x01, 0x40, 0x55, 0xe1, 0x77, 0xe3, 0xe4, 0xc6, 0xb0, 0x13, 0x43, 0xe3, 0xcc, 0xd8, 0x9f, 0x28, 0x3a, 0x37, 0x64, 0x81, 0x3c, 0xdb, 0x30, 0x97, 0x9e, - 0x03, 0xdd, 0xe9, 0x11, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4a, 0xa2, 0x67, 0x39, 0x94, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x3c, 0x90, 0xc1, 0x6a, 0xeb, 0x40, 0x0c, 0x45, - 0xf7, 0xfa, 0x0a, 0x43, 0x76, 0x86, 0xa7, 0xfc, 0x43, 0x5e, 0xbb, 0x68, 0xa1, 0xed, 0xc2, 0x50, 0xba, 0x2b, 0xca, 0x58, 0x71, 0x94, 0x8e, 0x47, 0x83, 0x24, 0x3b, 0xed, 0xdf, 0x97, 0x71, 0x43, - 0x36, 0x57, 0xe2, 0x70, 0xc4, 0x05, 0xed, 0xba, 0xc7, 0x94, 0xa5, 0x3a, 0x03, 0x56, 0xd3, 0x0b, 0xa7, 0x00, 0x4c, 0x99, 0xdc, 0x2b, 0xc5, 0x19, 0xd0, 0x39, 0x42, 0xca, 0xe4, 0x7b, 0x38, 0x4a, - 0xd9, 0x03, 0xec, 0xba, 0xa7, 0x12, 0x9c, 0xb3, 0x3c, 0x03, 0xca, 0xc8, 0x04, 0x3d, 0x4a, 0xb5, 0x96, 0x73, 0x6e, 0x79, 0xf5, 0xe6, 0xbc, 0x72, 0x1c, 0x98, 0x8a, 0x43, 0x39, 0xfe, 0x4b, 0x5a, - 0x4e, 0x32, 0x2d, 0x46, 0x21, 0x5a, 0xf0, 0x7b, 0xce, 0x4d, 0x78, 0x17, 0x5f, 0x28, 0x77, 0x43, 0x2c, 0xa3, 0x68, 0xf7, 0x5f, 0x47, 0x06, 0x5c, 0x3d, 0x6d, 0xf3, 0x44, 0x29, 0xd4, 0x7e, 0xb6, - 0x7e, 0xd8, 0x75, 0x6f, 0xc3, 0x07, 0xe0, 0xc3, 0xf0, 0x39, 0x84, 0x1a, 0xff, 0xdd, 0xce, 0xd0, 0xa3, 0x5f, 0xeb, 0x96, 0xda, 0x50, 0xa5, 0x48, 0x67, 0xe8, 0x51, 0x4d, 0x26, 0xe8, 0xd1, 0xf8, - 0xd2, 0xe8, 0x0b, 0xad, 0x5c, 0x20, 0xc8, 0x26, 0x8e, 0x3d, 0x54, 0x9d, 0x5b, 0x3b, 0x06, 0x4d, 0xf7, 0xdd, 0x38, 0x33, 0x39, 0x1f, 0x28, 0x7d, 0x2d, 0xf5, 0x4e, 0x57, 0x36, 0x17, 0x2d, 0x7e, - 0xc3, 0x37, 0xa9, 0xbd, 0xa7, 0xb2, 0x85, 0xb0, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, - 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, - 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, - 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, - 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x44, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, - 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0xdd, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, - 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, - 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, - 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, - 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x57, 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, - 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xf9, 0xe7, 0xc1, 0xa0, 0x2c, 0x4b, 0x9f, 0x59, 0xc4, 0xbe, 0xa4, 0xf5, 0x20, 0xad, 0xf6, 0xaa, 0xc1, 0xdd, 0xf8, 0x76, 0x34, 0x99, 0x8f, 0x2e, - 0x3f, 0xf9, 0x57, 0xee, 0xd4, 0x42, 0xa4, 0xa8, 0x14, 0x10, 0xfe, 0xaf, 0xe0, 0x84, 0x31, 0x2c, 0xb7, 0xc0, 0xf2, 0x3c, 0xe5, 0x11, 0x5b, 0xa6, 0x08, 0x29, 0x2b, 0x2d, 0x3d, 0x6b, 0x42, 0x8c, - 0x41, 0x4b, 0x83, 0xba, 0x24, 0xae, 0xb9, 0x58, 0xf7, 0x41, 0xc9, 0x95, 0x2e, 0x19, 0xa1, 0x31, 0x13, 0x73, 0xa5, 0x89, 0x2f, 0x0b, 0x7d, 0x40, 0x5a, 0x8d, 0x91, 0xab, 0x83, 0x0d, 0x52, 0x00, - 0x13, 0xd0, 0x0d, 0xe6, 0x30, 0x9e, 0x77, 0xe1, 0x97, 0x60, 0x3e, 0x9e, 0xf7, 0x8d, 0x91, 0xa7, 0xf1, 0xc3, 0xaf, 0xd3, 0xc5, 0x03, 0x3c, 0x05, 0x61, 0x18, 0x4c, 0x1e, 0xc6, 0xa3, 0x39, 0x4c, - 0x43, 0xb8, 0x9d, 0x4e, 0x86, 0xe3, 0x87, 0xf1, 0x74, 0x32, 0x87, 0xe9, 0x17, 0x08, 0x26, 0x5f, 0xe1, 0x3f, 0xe3, 0xc9, 0xb0, 0x0f, 0xc8, 0x75, 0x82, 0x04, 0xf8, 0x62, 0x72, 0xab, 0x0c, 0x4c, - 0x6e, 0xe8, 0xc4, 0xd8, 0x72, 0x37, 0x47, 0x3c, 0x80, 0xb0, 0x92, 0x15, 0x24, 0x95, 0x63, 0xc4, 0x57, 0x3c, 0x82, 0x94, 0x89, 0x75, 0xc1, 0xd6, 0x08, 0x6b, 0xb9, 0x41, 0x12, 0x5c, 0xac, 0x21, - 0x47, 0xca, 0xb8, 0x32, 0x69, 0x55, 0xc0, 0x44, 0x6c, 0xcc, 0xa4, 0x3c, 0xe3, 0x9a, 0x69, 0x3b, 0x75, 0x12, 0x97, 0x71, 0x34, 0xe8, 0xf0, 0x2c, 0x97, 0xa4, 0xe1, 0x77, 0xb6, 0x61, 0xbe, 0x40, - 0xed, 0x5f, 0x5c, 0x1f, 0x4c, 0x71, 0x79, 0x3c, 0x23, 0xb8, 0xf4, 0xa3, 0x84, 0x09, 0x81, 0xa9, 0x3a, 0x5e, 0x2b, 0x34, 0x4f, 0xfd, 0x19, 0xc9, 0x1c, 0x49, 0x73, 0x54, 0xd7, 0x9d, 0x4e, 0x5e, - 0x2c, 0x53, 0x1e, 0x41, 0x94, 0x32, 0xa5, 0xe0, 0x9e, 0x6d, 0x50, 0x3c, 0x11, 0xcb, 0x73, 0xa4, 0xa1, 0x2c, 0x45, 0x2a, 0x99, 0xc1, 0xf4, 0xa3, 0xd3, 0x31, 0xc9, 0xcf, 0x89, 0x6f, 0x98, 0x46, - 0x50, 0x06, 0x71, 0x04, 0x2b, 0x5b, 0xe4, 0x73, 0x4d, 0x26, 0xb6, 0xa7, 0x30, 0x98, 0xcd, 0x46, 0xe1, 0xf3, 0xe3, 0x28, 0x9c, 0x8f, 0xa7, 0x13, 0xb8, 0x81, 0xee, 0x95, 0xff, 0x77, 0xff, 0x1f, - 0xdd, 0x6b, 0x7b, 0x74, 0x70, 0x71, 0x61, 0xff, 0x87, 0x0b, 0x18, 0xe2, 0x8a, 0x15, 0xa9, 0x86, 0x45, 0x78, 0x67, 0x32, 0x1e, 0x3b, 0x37, 0x36, 0xf0, 0xcc, 0xf8, 0xbf, 0x2c, 0x2b, 0x00, 0xfe, - 0xef, 0x8c, 0x60, 0x45, 0x32, 0xeb, 0x03, 0x5f, 0x81, 0x90, 0xf0, 0xa1, 0xde, 0xbb, 0xa0, 0xf4, 0x83, 0x49, 0x7a, 0x4e, 0x72, 0xc3, 0x63, 0x9b, 0x11, 0x6b, 0x7b, 0xf0, 0x87, 0x30, 0x87, 0xa3, - 0x2f, 0xc1, 0xe2, 0xee, 0xe1, 0x79, 0x38, 0x7d, 0x9a, 0xdc, 0x4d, 0x83, 0xe1, 0xb3, 0x41, 0x71, 0x03, 0x5d, 0x53, 0xd7, 0xea, 0xf3, 0x60, 0x40, 0x98, 0x4b, 0xdf, 0xa2, 0x68, 0xd6, 0xb7, 0x9d, - 0xf8, 0x34, 0xe0, 0x72, 0xa0, 0xd9, 0x77, 0x46, 0x7c, 0x70, 0x80, 0x73, 0xd0, 0xad, 0xdc, 0x03, 0xc0, 0xc7, 0x13, 0x1e, 0x3e, 0x42, 0xf7, 0x70, 0xf7, 0x65, 0xb7, 0x7d, 0x97, 0x89, 0xb6, 0x7b, - 0xdd, 0x39, 0x66, 0x6b, 0xc6, 0x4c, 0xe3, 0xca, 0x16, 0x76, 0xf2, 0x5d, 0x16, 0x6d, 0xdf, 0xf7, 0xa1, 0x4c, 0x78, 0x94, 0x40, 0x66, 0x45, 0x29, 0x92, 0xc2, 0xf5, 0x74, 0x83, 0x33, 0x70, 0x47, - 0xb6, 0xa0, 0x65, 0x6d, 0xdf, 0x68, 0x07, 0x17, 0x4a, 0x23, 0x8b, 0xeb, 0xce, 0x8f, 0x5d, 0x82, 0xa4, 0xc0, 0xf7, 0x13, 0x7b, 0x1f, 0x3c, 0x8e, 0x26, 0xcf, 0x75, 0x5c, 0xb3, 0x70, 0x3a, 0x1b, - 0x85, 0xa6, 0xc3, 0x9e, 0x67, 0xc1, 0xc3, 0xaf, 0x70, 0xb3, 0x63, 0xc8, 0x8c, 0xae, 0x9f, 0x6d, 0xc4, 0xa0, 0x66, 0xef, 0x5c, 0x54, 0xe7, 0xc8, 0x28, 0x13, 0x24, 0x3c, 0x53, 0x2d, 0x25, 0x4f, - 0x53, 0x58, 0x22, 0x28, 0xb6, 0xb1, 0x7a, 0xf2, 0x57, 0xf1, 0xff, 0x3b, 0x08, 0xff, 0x2c, 0xf0, 0xf6, 0xf4, 0x4d, 0x58, 0x86, 0x35, 0xaf, 0x3b, 0xf6, 0xab, 0x44, 0xa9, 0x44, 0x16, 0x69, 0x6c, - 0xd0, 0x16, 0xaa, 0x12, 0x3f, 0x23, 0x14, 0xc4, 0x63, 0x3c, 0xc8, 0xc2, 0xae, 0x3f, 0x0a, 0x4a, 0x77, 0x2a, 0x53, 0x3b, 0x7d, 0x77, 0x78, 0x2e, 0x21, 0x5f, 0x9f, 0x27, 0xc1, 0xfd, 0x68, 0x17, - 0xa6, 0x2b, 0x7e, 0x67, 0x6d, 0x41, 0x69, 0x1d, 0x81, 0x13, 0x05, 0x67, 0x69, 0x23, 0x79, 0x0c, 0x19, 0xe3, 0xc2, 0x73, 0xd6, 0x18, 0xad, 0xd5, 0x6f, 0xdf, 0x7a, 0xf0, 0x63, 0xc7, 0xce, 0x7c, - 0xab, 0x34, 0x66, 0xbe, 0x2c, 0xb4, 0x9f, 0x13, 0x17, 0x3a, 0x15, 0x5e, 0xf7, 0x12, 0x1a, 0x12, 0xa2, 0x34, 0x23, 0x8d, 0xb1, 0xbd, 0xbd, 0xdc, 0xf8, 0x62, 0x6e, 0xab, 0x25, 0x53, 0x38, 0xe4, - 0x84, 0x91, 0x96, 0xb4, 0x85, 0x1b, 0x10, 0x58, 0xda, 0x05, 0xcf, 0xfa, 0xb8, 0xfa, 0xd6, 0xd8, 0xdf, 0xee, 0x63, 0xa1, 0x0c, 0x22, 0x63, 0x06, 0xe2, 0xda, 0xce, 0x67, 0x30, 0x4d, 0x76, 0x60, - 0xda, 0x5f, 0xa3, 0x0e, 0x96, 0x4a, 0xa6, 0x85, 0x46, 0x53, 0x46, 0x5e, 0xaf, 0xe7, 0x62, 0xb5, 0x19, 0x1b, 0xc0, 0x78, 0xf5, 0x76, 0x8f, 0xe1, 0x0b, 0x57, 0x5a, 0xf5, 0x81, 0x4c, 0xa7, 0x70, - 0x6d, 0x04, 0x1c, 0xa2, 0x04, 0xa3, 0xef, 0x46, 0x9c, 0xf8, 0xae, 0xe3, 0x94, 0xb9, 0x46, 0x0b, 0xa5, 0x65, 0xd6, 0x34, 0xbe, 0x67, 0x18, 0x72, 0x46, 0x2c, 0x43, 0xbd, 0x4b, 0x5e, 0x4d, 0x44, - 0xd6, 0x90, 0x5e, 0x27, 0xd0, 0x5b, 0xbb, 0xd0, 0xe0, 0xe4, 0x20, 0xa2, 0xfe, 0xdb, 0x3d, 0xd7, 0x24, 0xae, 0xca, 0x9a, 0x29, 0xa0, 0x9b, 0x56, 0x05, 0xdc, 0x6f, 0xe5, 0x2b, 0xef, 0x1c, 0x10, - 0xbf, 0x62, 0xc0, 0xeb, 0x35, 0xf3, 0x5e, 0xc3, 0x1f, 0x8b, 0xbc, 0xd0, 0x73, 0x4d, 0xc8, 0xb2, 0xb3, 0x91, 0x34, 0xf7, 0xdc, 0x80, 0x28, 0xd2, 0xf4, 0xfa, 0xc0, 0x8e, 0xa6, 0xed, 0x91, 0x65, - 0x33, 0xde, 0x69, 0xcd, 0x51, 0xd4, 0x98, 0x3d, 0x1b, 0x48, 0xef, 0xfa, 0xc4, 0xc9, 0xfe, 0x46, 0x6c, 0xf3, 0x67, 0xa6, 0x2b, 0x17, 0xfb, 0x09, 0xaf, 0xc5, 0x4a, 0xfb, 0x51, 0xdf, 0x74, 0xc0, - 0x59, 0x30, 0x0d, 0xc0, 0x2d, 0x16, 0xab, 0x94, 0x9d, 0xb1, 0xbb, 0x46, 0x5d, 0x5b, 0xf2, 0xce, 0xf6, 0x77, 0xdf, 0xd8, 0x38, 0xb2, 0xfc, 0x0a, 0x11, 0xd3, 0x51, 0x02, 0xde, 0x78, 0x3a, 0xb2, - 0x8f, 0x45, 0xf3, 0xd0, 0xc4, 0xe3, 0xb4, 0xc2, 0xd9, 0x96, 0x1b, 0x85, 0xe1, 0x34, 0x04, 0x13, 0x96, 0x29, 0xab, 0x0f, 0xa6, 0xd7, 0xde, 0x96, 0xff, 0x8f, 0xd0, 0xfd, 0xd0, 0x3d, 0x01, 0x61, - 0x05, 0x2a, 0x6d, 0xcb, 0x79, 0x7b, 0x25, 0xc0, 0xdb, 0xf5, 0xd9, 0x2c, 0x88, 0x9f, 0xaa, 0xfa, 0x6a, 0x0b, 0xa9, 0x1e, 0xef, 0x30, 0xe3, 0x47, 0xa9, 0x54, 0xd8, 0x96, 0x69, 0x33, 0x5e, 0x4f, - 0x66, 0xdf, 0xcf, 0x2b, 0x38, 0xcd, 0x59, 0x0b, 0x49, 0x08, 0xbe, 0xef, 0x9f, 0xda, 0xea, 0xb4, 0xff, 0xf5, 0xfa, 0x4e, 0xc9, 0x35, 0x99, 0x31, 0x6f, 0xa7, 0x4a, 0x0a, 0xab, 0x1a, 0x38, 0x14, - 0x1c, 0x59, 0xe8, 0xbc, 0xd0, 0x6f, 0x4a, 0xcc, 0xa9, 0x68, 0x1e, 0x8b, 0x4e, 0x7d, 0x51, 0xf6, 0x0e, 0x24, 0xe4, 0xa7, 0xbd, 0x6d, 0x5b, 0xa5, 0x8c, 0x50, 0xd8, 0xbf, 0xbc, 0xde, 0x59, 0x15, - 0xf9, 0x83, 0x63, 0xd9, 0xf7, 0x98, 0x53, 0xcb, 0xb1, 0x33, 0x4c, 0x9c, 0x4d, 0xfb, 0xae, 0x7c, 0x23, 0x42, 0x66, 0xbe, 0x33, 0x1c, 0x0f, 0xfb, 0xcb, 0xa3, 0x2a, 0xe8, 0x37, 0xa0, 0x9c, 0x90, - 0xd2, 0x5e, 0xdf, 0x7f, 0x29, 0x65, 0x5a, 0x56, 0x09, 0x3b, 0x74, 0x7f, 0x72, 0x71, 0xd5, 0x06, 0x4f, 0x1b, 0xa5, 0x7e, 0x2e, 0x98, 0xa3, 0x5f, 0x48, 0x66, 0x8b, 0xf0, 0xce, 0x2b, 0x28, 0xed, - 0x37, 0x2c, 0x1e, 0x01, 0x6d, 0x03, 0x35, 0x94, 0x02, 0x8f, 0x03, 0x72, 0xfb, 0xf0, 0x85, 0x6b, 0xef, 0xaa, 0xb1, 0xb6, 0xab, 0xfa, 0x87, 0x84, 0x64, 0x69, 0x3f, 0xeb, 0x4e, 0x6a, 0xfe, 0x8c, - 0x8e, 0x10, 0x49, 0xda, 0x21, 0xe6, 0x62, 0x7d, 0xec, 0x12, 0xab, 0xdd, 0x73, 0xcd, 0xa2, 0xef, 0x0f, 0xc4, 0xa2, 0x93, 0x5e, 0x6c, 0x62, 0xfa, 0x5b, 0x13, 0x53, 0xa7, 0xfa, 0xd7, 0xfe, 0x77, - 0xf4, 0x2e, 0xb2, 0xaf, 0x99, 0x36, 0x9a, 0xf6, 0xd7, 0x64, 0xf5, 0xab, 0x5f, 0xf5, 0x49, 0x8c, 0x4a, 0x73, 0x61, 0xbf, 0xd1, 0x7a, 0xa0, 0x4d, 0x8c, 0x0a, 0xf6, 0xed, 0xfd, 0xa3, 0x51, 0xf7, - 0xe0, 0x39, 0x3c, 0x6b, 0xd4, 0x28, 0x36, 0x5e, 0xf7, 0xfe, 0x71, 0xf2, 0xf4, 0xbc, 0x98, 0x8f, 0x42, 0xa3, 0xca, 0xdd, 0x5e, 0x2d, 0x4b, 0xf0, 0xf3, 0xcf, 0xd0, 0xb6, 0x73, 0x16, 0xcc, 0xe7, - 0x4f, 0xd3, 0x70, 0xb8, 0xdf, 0x79, 0xc2, 0xa3, 0x83, 0xa8, 0x90, 0x84, 0x79, 0x59, 0xde, 0xb4, 0xda, 0xd9, 0x7b, 0x3c, 0x64, 0x2b, 0x4a, 0x18, 0xfd, 0xf6, 0x0d, 0x72, 0xa6, 0x54, 0x29, 0x29, - 0x3e, 0x73, 0x7a, 0x8f, 0xc2, 0xd7, 0xf2, 0x36, 0x61, 0x14, 0x10, 0xb1, 0xed, 0x31, 0xf3, 0x41, 0xa1, 0x13, 0x14, 0x9a, 0x47, 0x4c, 0x4b, 0xf2, 0x15, 0x6a, 0xf7, 0x59, 0xe7, 0x19, 0x25, 0x39, - 0x58, 0xf4, 0xda, 0x5a, 0xf6, 0x5f, 0x53, 0xf7, 0xd6, 0x3d, 0x59, 0xc9, 0x49, 0x6a, 0x8c, 0xcc, 0x67, 0xfc, 0xcc, 0xe1, 0x6c, 0x58, 0x33, 0x8c, 0xdb, 0x76, 0x6c, 0x5b, 0x69, 0x75, 0x64, 0x06, - 0xa1, 0x2e, 0x48, 0x54, 0x17, 0x78, 0xfb, 0xc9, 0x9a, 0xd0, 0xfe, 0x8e, 0x9c, 0x16, 0xd1, 0x3f, 0x92, 0xe4, 0x93, 0x72, 0x33, 0xc3, 0xbc, 0xa8, 0x4b, 0x5c, 0x2a, 0xae, 0x6b, 0x55, 0x75, 0x0d, - 0x58, 0x65, 0xae, 0x71, 0x26, 0x44, 0x16, 0x9b, 0x66, 0xf9, 0x65, 0xab, 0xf1, 0xb6, 0xfa, 0x5a, 0x07, 0x5a, 0x46, 0xfb, 0x0d, 0xb4, 0x8c, 0xe0, 0x06, 0x6e, 0xeb, 0x0f, 0x79, 0x81, 0xa5, 0xfb, - 0xed, 0x39, 0x07, 0xbe, 0xcc, 0x51, 0xb8, 0xb7, 0x4e, 0xef, 0xe8, 0x5d, 0x3d, 0xb5, 0xdd, 0xee, 0x6e, 0xc3, 0x95, 0x54, 0x0d, 0x89, 0x6f, 0x2e, 0x79, 0xcd, 0xe2, 0xde, 0x5b, 0x58, 0x49, 0xfb, - 0xba, 0xa8, 0xfd, 0xf5, 0x7c, 0x4d, 0x4c, 0xa8, 0x15, 0x92, 0x69, 0x15, 0x8f, 0x96, 0x51, 0x1f, 0xae, 0xfa, 0x70, 0x27, 0xc5, 0xda, 0xbf, 0x0f, 0xfe, 0xfb, 0xfc, 0x18, 0xdc, 0x2d, 0x46, 0x47, - 0xc7, 0x4f, 0xae, 0x4e, 0x5a, 0x46, 0x87, 0x93, 0xaf, 0x9d, 0xce, 0x6b, 0xe7, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, - 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, - 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, - 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, 0xf1, 0x7d, 0xef, 0x92, 0x17, - 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, 0x21, 0x8d, 0x0a, 0x9e, 0x5e, 0x9c, 0xe9, 0xa6, 0x3b, 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, 0xce, 0xe1, 0x3a, 0x3e, 0x43, - 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, 0x0f, 0x79, 0xa5, 0x0c, 0x31, 0x39, 0x4d, 0x09, 0xc5, 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, 0x69, 0x93, 0x25, 0xa8, 0x45, - 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, 0x2e, 0x66, 0xc9, 0xff, 0x9e, 0xd3, 0xc2, 0x21, 0x37, 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, 0xb0, 0xc3, 0xb0, 0x36, 0xaa, - 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x9c, 0x55, 0xdb, 0x8e, 0xdb, 0x46, 0x0c, 0x7d, 0x9f, 0xaf, 0x60, 0xe5, 0x00, 0xb9, 0x20, 0x96, 0x37, 0x0f, 0x01, - 0x02, 0x03, 0x9b, 0x62, 0x2f, 0xde, 0xc4, 0xa9, 0x77, 0x93, 0x3a, 0x72, 0x8a, 0x00, 0x06, 0x2c, 0x7a, 0x44, 0x4b, 0xe3, 0x1d, 0xcd, 0xa8, 0x73, 0x91, 0x63, 0x04, 0xe9, 0xb7, 0x17, 0x23, 0xf9, - 0xba, 0xeb, 0x14, 0x6d, 0xdf, 0xec, 0x21, 0x79, 0x48, 0x1e, 0x1e, 0x52, 0x1d, 0xb8, 0xf1, 0x8a, 0x3b, 0xa1, 0x15, 0x54, 0x46, 0x2f, 0x89, 0x3b, 0xc6, 0xfe, 0x20, 0xc9, 0x75, 0x49, 0xe0, 0x34, - 0xac, 0xb5, 0x37, 0xa0, 0x68, 0x05, 0xbf, 0x7b, 0x34, 0xf7, 0xde, 0xc2, 0xe2, 0x81, 0xf7, 0x2f, 0x8c, 0x25, 0x85, 0xb0, 0x60, 0xb1, 0xac, 0x24, 0x6d, 0x5f, 0x81, 0x6b, 0xe5, 0x50, 0x28, 0x0b, - 0x08, 0x56, 0xa8, 0x5c, 0xd2, 0x2e, 0xb0, 0x0f, 0xe9, 0xf6, 0xa7, 0x8d, 0xb7, 0xb9, 0xe3, 0xed, 0xd3, 0xb3, 0xe7, 0xe9, 0x4b, 0xe6, 0x8a, 0xbd, 0x3b, 0x2c, 0xbd, 0x75, 0x60, 0xc8, 0x79, 0xa3, - 0x2c, 0x08, 0x67, 0x01, 0x4d, 0xee, 0x4b, 0x52, 0x2e, 0x66, 0xac, 0xd3, 0x81, 0x91, 0xe6, 0x28, 0x81, 0xbe, 0x11, 0xf7, 0xc1, 0x9d, 0xdd, 0xe2, 0x3d, 0x81, 0xf5, 0x86, 0xc0, 0x15, 0xe8, 0x20, - 0xfd, 0x80, 0x35, 0xc2, 0xab, 0x57, 0xf0, 0xf9, 0xfa, 0xb7, 0x14, 0x84, 0x05, 0xa1, 0xac, 0x43, 0x29, 0x29, 0x8b, 0x19, 0x4b, 0x34, 0x58, 0x87, 0xc6, 0x81, 0x25, 0x53, 0x93, 0x01, 0x19, 0xb0, - 0xe4, 0x1a, 0x8c, 0x57, 0x90, 0xc6, 0xbd, 0xb2, 0x56, 0x2b, 0xf8, 0xb3, 0xed, 0xbb, 0x9f, 0x51, 0x9d, 0xc6, 0x2c, 0x29, 0x08, 0xb8, 0x2e, 0x4b, 0x54, 0x59, 0x1b, 0x6a, 0xa1, 0x70, 0xae, 0xda, - 0x02, 0x84, 0x67, 0xf4, 0x4e, 0x97, 0xe8, 0x44, 0x0b, 0xb5, 0x42, 0xc7, 0x0b, 0xb2, 0xb0, 0xd0, 0x06, 0x78, 0x81, 0x2a, 0x27, 0x0b, 0x7a, 0x01, 0x56, 0x7b, 0xc3, 0x03, 0x54, 0x46, 0x31, 0x1b, - 0x1e, 0xfd, 0xdf, 0xb9, 0x05, 0x16, 0xda, 0xdf, 0xb0, 0x12, 0x52, 0xc2, 0xbc, 0x61, 0xb7, 0xc2, 0x1c, 0x1d, 0x65, 0x61, 0x36, 0xc6, 0x2b, 0x25, 0x54, 0xbe, 0x49, 0x1e, 0xc3, 0xd0, 0x01, 0x4a, - 0xab, 0x41, 0x57, 0xa4, 0x2c, 0x64, 0x34, 0xf7, 0x79, 0x1e, 0xec, 0x95, 0x36, 0x0e, 0xd2, 0xd7, 0x67, 0x67, 0xaf, 0x53, 0x66, 0xf5, 0xc6, 0x40, 0x06, 0x38, 0xaa, 0x00, 0x8a, 0xce, 0x21, 0x2f, - 0x28, 0x03, 0xb1, 0x00, 0x45, 0x94, 0x6d, 0xa9, 0x09, 0x2c, 0x38, 0xb2, 0xee, 0x24, 0x2d, 0xc1, 0x90, 0xb6, 0x13, 0x08, 0x9c, 0x34, 0x23, 0x4d, 0xe1, 0x6a, 0x34, 0x64, 0x6c, 0xe8, 0x9e, 0x5a, - 0x30, 0x14, 0x68, 0x22, 0x95, 0xb5, 0xa5, 0x5a, 0x72, 0x90, 0xde, 0x4c, 0xee, 0xae, 0x66, 0xe3, 0xc1, 0xbb, 0xe1, 0xe7, 0x64, 0xfc, 0x35, 0x05, 0x52, 0xb5, 0x30, 0x5a, 0x85, 0x51, 0x42, 0x8d, - 0x46, 0xe0, 0x5c, 0x52, 0xcc, 0xd2, 0x34, 0xb5, 0x05, 0x49, 0x09, 0x96, 0x1b, 0x51, 0x39, 0xd6, 0x01, 0x43, 0x95, 0x44, 0x4e, 0xf0, 0x57, 0x2f, 0x9e, 0xa3, 0x2d, 0x0c, 0x87, 0xf9, 0xba, 0xd5, - 0x65, 0xeb, 0x68, 0x38, 0x2c, 0x84, 0xa4, 0x03, 0xcf, 0x4c, 0xf3, 0x7b, 0x32, 0xb1, 0xd0, 0xbd, 0xa5, 0x2e, 0x54, 0xa6, 0x03, 0x81, 0xae, 0x68, 0x63, 0x0c, 0xe5, 0xc2, 0x3a, 0xb3, 0x66, 0xf4, - 0xad, 0xe1, 0xe5, 0xa8, 0xa8, 0xf3, 0x47, 0x91, 0x8c, 0x78, 0xa1, 0x21, 0xfa, 0x77, 0xce, 0x11, 0xbc, 0x7d, 0x7b, 0x50, 0x66, 0xe8, 0x25, 0x30, 0xd4, 0x81, 0x4b, 0x2f, 0x64, 0x26, 0x54, 0xbe, - 0xd9, 0x95, 0xad, 0x82, 0xe6, 0xe1, 0xd9, 0xc2, 0xc7, 0xab, 0x21, 0x88, 0x12, 0x73, 0x6a, 0x54, 0x72, 0x28, 0xfe, 0x98, 0x3d, 0xe2, 0x23, 0x98, 0xda, 0xc0, 0x16, 0xfe, 0x72, 0x0d, 0x19, 0x2d, - 0xd0, 0x4b, 0xf7, 0x12, 0x3e, 0x7c, 0xb9, 0x6d, 0x4d, 0x41, 0xe8, 0xde, 0x86, 0x41, 0x26, 0x1a, 0x48, 0x05, 0x66, 0x41, 0xa1, 0x13, 0x35, 0x6d, 0xec, 0x61, 0x1e, 0x0b, 0x2d, 0xa5, 0x5e, 0x05, - 0x81, 0x9c, 0x9a, 0x84, 0x0d, 0x63, 0x6b, 0xc6, 0x1a, 0xaf, 0xb1, 0x94, 0x69, 0x3f, 0xa4, 0x0b, 0xbf, 0x58, 0x83, 0x30, 0x50, 0xb5, 0xed, 0xb3, 0x2e, 0x28, 0x2c, 0xa9, 0x0f, 0x97, 0x9f, 0x66, - 0x77, 0x17, 0xc9, 0xf0, 0xcb, 0x60, 0x36, 0xbc, 0xbd, 0x78, 0x37, 0x60, 0x00, 0x35, 0x4a, 0x4f, 0x7d, 0x88, 0x9c, 0xf1, 0x14, 0x1d, 0xfa, 0xdd, 0x5e, 0x7c, 0x19, 0xdc, 0xcd, 0x2e, 0x27, 0xc3, - 0x51, 0x32, 0xbb, 0x18, 0x27, 0xc3, 0x9b, 0x8b, 0xab, 0x64, 0xef, 0xbf, 0xcb, 0x07, 0x0e, 0x4d, 0x4e, 0xae, 0xd7, 0x56, 0xdd, 0x6d, 0xf7, 0xc3, 0xf6, 0x5e, 0x9c, 0x86, 0xba, 0x9e, 0x5d, 0x8c, - 0xdf, 0x4d, 0x6e, 0x07, 0x77, 0xc9, 0xe7, 0x3d, 0x56, 0x85, 0xfc, 0x3e, 0x90, 0xda, 0xbd, 0xb6, 0xf7, 0xa2, 0x4a, 0xc8, 0x3a, 0x7b, 0x1e, 0xca, 0x81, 0xee, 0x75, 0x89, 0x35, 0xa9, 0x78, 0x89, - 0x35, 0x66, 0x9a, 0xc7, 0xc1, 0xbc, 0xb5, 0x6c, 0xd6, 0x3d, 0xde, 0x04, 0xc7, 0x6e, 0x5d, 0xd1, 0xf9, 0x71, 0x11, 0x3f, 0xeb, 0xfa, 0x61, 0x25, 0xb3, 0x9b, 0xe1, 0xe8, 0x80, 0x8a, 0x0d, 0x48, - 0x33, 0xe8, 0x18, 0x4d, 0xfe, 0xcf, 0x38, 0xa7, 0xc8, 0x79, 0xfa, 0xa2, 0x1b, 0x56, 0x9e, 0x4c, 0xbc, 0x44, 0xf3, 0x94, 0xed, 0xe5, 0x35, 0x6e, 0x0f, 0xc1, 0x03, 0x75, 0x19, 0xaf, 0xec, 0x4e, - 0x4d, 0xbb, 0x25, 0x16, 0x0a, 0x70, 0x7b, 0x9d, 0xc9, 0x30, 0x1f, 0xae, 0x73, 0xe3, 0xd5, 0x2a, 0x90, 0x1b, 0x6a, 0xce, 0x0b, 0xce, 0x75, 0x7d, 0x62, 0x1b, 0x1b, 0x28, 0xe3, 0xd5, 0x3e, 0xf7, - 0x35, 0x55, 0x52, 0xaf, 0x1f, 0x65, 0xb7, 0x9b, 0x9b, 0xd5, 0xa8, 0x2d, 0x54, 0x93, 0x35, 0x7e, 0x47, 0xea, 0x06, 0xa1, 0x9c, 0x06, 0x2e, 0xbd, 0x75, 0x64, 0x7e, 0x26, 0xf5, 0x4d, 0x5c, 0xa7, - 0x3d, 0x6d, 0xce, 0x88, 0x70, 0xba, 0xec, 0xe1, 0x06, 0x74, 0x0e, 0x3e, 0x61, 0x42, 0xd5, 0x9a, 0x63, 0xf3, 0x21, 0x60, 0xd7, 0x1a, 0x94, 0x0e, 0x32, 0x0f, 0x42, 0xda, 0x1d, 0xa1, 0xc9, 0x78, - 0x94, 0xee, 0x44, 0x1e, 0x5e, 0x43, 0x45, 0x46, 0x7b, 0x47, 0xe1, 0x2e, 0x37, 0x27, 0xe2, 0x60, 0xfb, 0xbe, 0x6a, 0x0f, 0x4d, 0xf4, 0xce, 0x69, 0xbe, 0x3e, 0x58, 0x9c, 0x4d, 0xb3, 0x3f, 0xe1, - 0x49, 0xa8, 0x85, 0xde, 0x13, 0xc5, 0x27, 0xe3, 0xd1, 0xe3, 0x1e, 0x27, 0xe3, 0xd1, 0x79, 0xf8, 0x82, 0xf4, 0x7b, 0xbd, 0x66, 0x42, 0x85, 0xb6, 0xae, 0xff, 0xe6, 0xec, 0xcd, 0x59, 0x8f, 0x71, - 0x6f, 0x24, 0x74, 0x6b, 0x78, 0xf2, 0x7d, 0x32, 0x1e, 0xfd, 0x80, 0x29, 0x03, 0xe8, 0xbe, 0x87, 0xe8, 0x4a, 0x2b, 0x47, 0xca, 0x75, 0x93, 0x75, 0x45, 0x7d, 0xac, 0x2a, 0x29, 0xda, 0x86, 0x7b, - 0x4b, 0xab, 0x55, 0xd4, 0xba, 0x65, 0x10, 0x7d, 0x9f, 0x46, 0x25, 0x59, 0x8b, 0x39, 0x4d, 0xa3, 0x3e, 0x4c, 0xa3, 0x27, 0xcf, 0x56, 0x85, 0xc6, 0x52, 0x3c, 0x9f, 0x46, 0x3f, 0xa6, 0x51, 0xc4, - 0x3a, 0xf0, 0x71, 0xdc, 0x64, 0x8f, 0x4e, 0xa7, 0xff, 0x75, 0x13, 0x7d, 0xbe, 0x0b, 0x8c, 0x1e, 0x56, 0xb4, 0xef, 0xed, 0x7d, 0x92, 0x7c, 0x12, 0xf4, 0x9f, 0xba, 0x6b, 0x3e, 0x9b, 0xc7, 0xdd, - 0x3d, 0xca, 0xf8, 0xbf, 0x8a, 0x3c, 0x06, 0x6e, 0x6a, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x25, 0xb5, 0xab, 0x10, 0x02, 0x04, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, - 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6b, 0x93, 0x1a, 0xb7, 0x96, 0xdf, 0xfb, 0x57, 0x9c, 0x34, 0xac, 0x01, 0x17, 0xdd, 0xd8, 0xbe, - 0x75, 0x73, 0xb3, 0x33, 0x4b, 0x6a, 0x31, 0xc3, 0xd8, 0x38, 0xf3, 0x5a, 0x98, 0xf1, 0x38, 0x95, 0xc9, 0x4e, 0x89, 0x6e, 0x01, 0xf2, 0x34, 0x52, 0x47, 0x52, 0x83, 0xb9, 0xb1, 0xff, 0xfb, 0xd6, - 0x91, 0xd4, 0x2f, 0xc0, 0x8e, 0xb3, 0x1e, 0x4f, 0x2a, 0x65, 0x5a, 0x7d, 0x74, 0x74, 0xde, 0x2f, 0x75, 0xe3, 0x87, 0xde, 0x8c, 0xf1, 0x9e, 0x5a, 0x7a, 0x0d, 0x08, 0x1e, 0xf1, 0xcf, 0x6b, 0xc0, - 0x19, 0x8b, 0x28, 0x57, 0x34, 0x06, 0x2d, 0x40, 0x2f, 0x29, 0x0c, 0x52, 0x12, 0x2d, 0x29, 0x4c, 0xc5, 0x5c, 0x6f, 0x88, 0xa4, 0x70, 0x2a, 0x32, 0x1e, 0x13, 0xcd, 0x04, 0x87, 0xf6, 0x60, 0x7a, - 0xda, 0x81, 0x8c, 0xc7, 0x54, 0x82, 0xe0, 0xd4, 0x6b, 0x80, 0x90, 0xb0, 0x12, 0x92, 0x42, 0x24, 0xb8, 0x96, 0x6c, 0x96, 0x69, 0x21, 0x21, 0xb1, 0x08, 0x81, 0x2c, 0x24, 0xa5, 0x2b, 0xca, 0xb5, - 0x0a, 0x01, 0xa6, 0x94, 0x1a, 0xec, 0x17, 0x97, 0xd7, 0xe3, 0xe1, 0x08, 0xe6, 0x2c, 0xc1, 0xed, 0x31, 0x53, 0x76, 0x1b, 0x8d, 0x61, 0xc3, 0xf4, 0x12, 0xf4, 0x92, 0x29, 0xd8, 0x08, 0xf9, 0x00, - 0x73, 0x21, 0x81, 0xc4, 0x31, 0xc3, 0x83, 0x49, 0x02, 0x8c, 0xcf, 0x85, 0x5c, 0x19, 0x32, 0xbc, 0x06, 0x48, 0xba, 0x20, 0x32, 0x66, 0x7c, 0x01, 0x91, 0x48, 0xb7, 0x92, 0x2d, 0x96, 0x1a, 0xc4, - 0x86, 0x53, 0xa9, 0x96, 0x2c, 0x0d, 0x01, 0xae, 0x91, 0x8f, 0xe9, 0x69, 0x4e, 0x8a, 0xb2, 0x78, 0xdd, 0xa1, 0x5a, 0xc0, 0x56, 0x64, 0x8e, 0x8d, 0x0a, 0xc7, 0x4e, 0x10, 0x5d, 0x78, 0x4b, 0xa5, - 0x42, 0x76, 0x5f, 0x84, 0xcf, 0xa0, 0xad, 0x97, 0xb8, 0xc7, 0x77, 0x2f, 0xfd, 0xce, 0xb1, 0xd9, 0xbc, 0x22, 0x5b, 0xe0, 0x42, 0x43, 0xa6, 0x68, 0x89, 0x1b, 0xe8, 0x87, 0x88, 0xa6, 0x1a, 0x18, - 0x87, 0x48, 0xac, 0xd2, 0x84, 0x11, 0x1e, 0xe1, 0x66, 0xc7, 0x59, 0x71, 0x42, 0x08, 0xf0, 0xab, 0xc3, 0x21, 0x66, 0x9a, 0x30, 0x0e, 0xc4, 0xf0, 0x01, 0x62, 0x5e, 0x05, 0x03, 0xa2, 0xbd, 0x86, - 0xd7, 0x00, 0x00, 0x58, 0x6a, 0x9d, 0x1e, 0xf5, 0x7a, 0x9b, 0xcd, 0x26, 0x24, 0x86, 0xd8, 0x50, 0xc8, 0x45, 0x2f, 0xe7, 0xae, 0x77, 0x36, 0x1e, 0x8e, 0x2e, 0xa6, 0xa3, 0xe0, 0x45, 0xf8, 0xcc, - 0xec, 0xb8, 0xe1, 0x09, 0x55, 0x0a, 0x24, 0xfd, 0x23, 0x63, 0x92, 0xc6, 0x30, 0xdb, 0x02, 0x49, 0xd3, 0x84, 0x45, 0x64, 0x96, 0x50, 0x48, 0xc8, 0x06, 0xf5, 0x66, 0xd4, 0x63, 0xb4, 0xce, 0x38, - 0x6c, 0x24, 0xd3, 0x8c, 0x2f, 0xba, 0x5e, 0x03, 0x54, 0xae, 0xf8, 0xaa, 0x72, 0x4a, 0x61, 0xe5, 0xc4, 0x31, 0x55, 0x03, 0x10, 0x1c, 0x08, 0x6a, 0xc6, 0x1f, 0x4c, 0x61, 0x3c, 0xf5, 0xe1, 0xe5, - 0x60, 0x3a, 0x9e, 0x76, 0xe1, 0x76, 0x7c, 0xfd, 0xfa, 0xf2, 0xe6, 0x1a, 0x6e, 0x07, 0x93, 0xc9, 0xe0, 0xe2, 0x7a, 0x3c, 0x9a, 0xc2, 0xe5, 0x04, 0x86, 0x97, 0x17, 0x27, 0xe3, 0xeb, 0xf1, 0xe5, - 0xc5, 0x14, 0x2e, 0x4f, 0x61, 0x70, 0xf1, 0xab, 0xd7, 0x80, 0x5f, 0xc6, 0x17, 0x27, 0x5d, 0xa0, 0x4c, 0x2f, 0xa9, 0x04, 0xfa, 0x21, 0x95, 0xc8, 0x81, 0x90, 0xc0, 0x50, 0x90, 0x34, 0xae, 0x98, - 0x50, 0x4e, 0x01, 0x5a, 0x88, 0xd5, 0x8e, 0x4a, 0x69, 0xc4, 0xe6, 0x2c, 0x82, 0x84, 0xf0, 0x45, 0x46, 0x16, 0x14, 0x16, 0x62, 0x4d, 0x25, 0x47, 0x03, 0x49, 0xa9, 0x5c, 0x31, 0x85, 0xfa, 0x54, - 0x40, 0x78, 0x0c, 0x09, 0x5b, 0x31, 0x6d, 0xec, 0x48, 0x79, 0x8d, 0x7d, 0xbe, 0xc2, 0xc7, 0x76, 0xb0, 0xc7, 0xc6, 0xd7, 0xc8, 0xcd, 0xf5, 0x9c, 0xac, 0x29, 0x87, 0x5b, 0x49, 0xd2, 0x94, 0x4a, - 0x50, 0x9a, 0x48, 0x9d, 0xa5, 0x30, 0x23, 0x3a, 0x5a, 0x82, 0x8a, 0x24, 0x4b, 0x75, 0x17, 0xd6, 0xce, 0x92, 0xff, 0x11, 0xe6, 0xa6, 0x31, 0xc9, 0x6d, 0x62, 0x74, 0xf1, 0x16, 0xd6, 0x44, 0xaa, - 0xa3, 0x83, 0x04, 0x1a, 0xb3, 0x7b, 0x33, 0x78, 0x3b, 0xb8, 0x7f, 0x7d, 0x79, 0x3e, 0x82, 0x00, 0x12, 0x11, 0xd9, 0x18, 0x20, 0xe6, 0x40, 0xe0, 0xcd, 0xc9, 0x2f, 0xb0, 0x14, 0x2b, 0xb4, 0x11, - 0x69, 0xd0, 0x5e, 0xa6, 0xce, 0x4f, 0x73, 0xb4, 0x87, 0xb0, 0x1a, 0xa4, 0xe7, 0x83, 0xb7, 0xa3, 0x8b, 0xfb, 0xcb, 0xab, 0xeb, 0x29, 0x04, 0x90, 0x12, 0x49, 0x56, 0x54, 0x53, 0xa9, 0x20, 0x25, - 0xaa, 0x12, 0x84, 0xde, 0x90, 0x35, 0x81, 0xb7, 0xe7, 0xb0, 0x59, 0x52, 0x0e, 0x32, 0xe3, 0x46, 0x95, 0x86, 0x63, 0xeb, 0x10, 0x40, 0xc3, 0x45, 0x88, 0xc0, 0x31, 0x9d, 0x65, 0xee, 0x0d, 0x30, - 0xad, 0x68, 0x32, 0xef, 0xa2, 0x53, 0x3a, 0x28, 0x00, 0x45, 0x75, 0xe5, 0xc8, 0x7e, 0xf0, 0xce, 0x6e, 0x08, 0xde, 0xc9, 0x8c, 0xbf, 0x8f, 0x37, 0xe9, 0x91, 0x96, 0x84, 0xab, 0x54, 0x48, 0xdd, - 0x8f, 0xf5, 0xbd, 0x12, 0xd1, 0x03, 0xd5, 0x5d, 0x45, 0xe5, 0x9a, 0xca, 0xfe, 0xb6, 0xab, 0x32, 0x95, 0x52, 0x1e, 0xf7, 0xb7, 0x5d, 0x12, 0xc7, 0x68, 0x91, 0xfd, 0x9f, 0x9e, 0x3d, 0x7b, 0x56, - 0xe1, 0x63, 0xfa, 0xcb, 0xf8, 0xea, 0x7e, 0x32, 0x84, 0x00, 0xe6, 0x09, 0x59, 0x18, 0x82, 0x98, 0xb2, 0x5e, 0x26, 0x88, 0x09, 0x50, 0x62, 0x0e, 0x2b, 0xa4, 0x4e, 0x46, 0x26, 0x46, 0x1c, 0x14, - 0xcc, 0x37, 0xfc, 0x79, 0x1e, 0x9b, 0xc3, 0x6f, 0x10, 0xfc, 0x1b, 0xfc, 0x66, 0x8d, 0x24, 0x1f, 0x7e, 0x87, 0x63, 0x94, 0x25, 0xf7, 0x3c, 0x00, 0x0b, 0x34, 0x87, 0x5e, 0xa6, 0x64, 0x0f, 0x75, - 0x99, 0xf4, 0xa8, 0x8e, 0x7a, 0x39, 0x65, 0x05, 0x28, 0x8a, 0x2c, 0xfc, 0x0c, 0x94, 0x07, 0x30, 0x67, 0x35, 0x64, 0x5f, 0x42, 0xf1, 0xa5, 0x8d, 0x7e, 0x13, 0xad, 0xaa, 0x17, 0xba, 0xf7, 0xfe, - 0xee, 0xe6, 0xdd, 0xf7, 0x0e, 0x01, 0xfe, 0xdf, 0x80, 0xcb, 0x69, 0xe9, 0xef, 0x2a, 0x4b, 0x51, 0x75, 0x21, 0x40, 0x73, 0x4d, 0x24, 0xdc, 0xaf, 0x32, 0xa5, 0xef, 0x61, 0x46, 0x8d, 0xda, 0xb5, - 0xc8, 0xc3, 0x89, 0x96, 0x19, 0xc5, 0x58, 0x32, 0x27, 0x09, 0x7a, 0x78, 0xb4, 0x5d, 0x6c, 0x18, 0xef, 0x9b, 0xa7, 0x63, 0x2f, 0x26, 0xb2, 0xf2, 0xb4, 0x62, 0x7c, 0xb1, 0xb1, 0x0f, 0x5e, 0x44, - 0x14, 0x05, 0xbf, 0xd9, 0xce, 0x38, 0x59, 0xd1, 0x8e, 0x0f, 0x0c, 0xe9, 0x1b, 0xfe, 0xfa, 0xea, 0x76, 0x7c, 0xf1, 0xb4, 0x03, 0x0e, 0x8b, 0xc1, 0x7d, 0x7c, 0xec, 0x01, 0x9c, 0x8f, 0x2f, 0x5e, - 0xdd, 0x3e, 0xed, 0x80, 0x45, 0x81, 0xeb, 0x66, 0xf9, 0xc4, 0xe0, 0x7f, 0xda, 0x01, 0x77, 0x10, 0xbe, 0x30, 0x7c, 0x36, 0xe0, 0x46, 0x51, 0x27, 0x6b, 0x36, 0xa3, 0x1f, 0x68, 0xd4, 0x7b, 0x4f, - 0xd6, 0xe4, 0xde, 0x38, 0x16, 0x9b, 0x03, 0x59, 0x13, 0x96, 0xa0, 0x2d, 0x75, 0x41, 0x20, 0x1b, 0x1b, 0x86, 0x41, 0x8f, 0x24, 0x09, 0xcc, 0x48, 0xf4, 0x80, 0xec, 0xf5, 0xce, 0xd8, 0x4c, 0x12, - 0xb9, 0xed, 0xa1, 0xbb, 0xf4, 0x5e, 0x8b, 0x55, 0x8e, 0x18, 0x43, 0x25, 0xe6, 0x0c, 0x75, 0xd4, 0xeb, 0xc5, 0x74, 0x4d, 0x13, 0x91, 0x52, 0x19, 0x62, 0x0e, 0xa0, 0x61, 0x24, 0x56, 0x78, 0x9e, - 0xd9, 0xb7, 0x22, 0x51, 0xef, 0x0f, 0xd2, 0xfb, 0x83, 0x3c, 0x7f, 0xfe, 0xaf, 0x67, 0xbd, 0x7b, 0xc6, 0x63, 0xfa, 0x21, 0x5c, 0xea, 0x55, 0x62, 0xf0, 0x94, 0x96, 0x55, 0x44, 0x02, 0x1f, 0x7e, - 0xaf, 0x68, 0x2a, 0x07, 0xf9, 0x00, 0xfe, 0x61, 0x36, 0x76, 0xc1, 0x2b, 0x31, 0xa5, 0xef, 0x37, 0xdb, 0x87, 0x37, 0x75, 0xfc, 0x63, 0x4c, 0x00, 0x42, 0xea, 0x12, 0xda, 0xed, 0xa7, 0xa8, 0x96, - 0x03, 0xa8, 0xf6, 0x05, 0xf1, 0x79, 0x1c, 0x73, 0xe6, 0x55, 0xfe, 0x39, 0x3e, 0xf6, 0xa8, 0x22, 0x51, 0xd5, 0x8d, 0xaa, 0xcc, 0x96, 0x76, 0x69, 0xdf, 0x4b, 0x6b, 0xd8, 0x0b, 0xca, 0xb5, 0x10, - 0x81, 0xa4, 0x09, 0x45, 0x1b, 0xa9, 0x99, 0x6f, 0x49, 0x56, 0xb3, 0x8d, 0x3c, 0x05, 0x91, 0xe0, 0x73, 0xb6, 0x80, 0x20, 0x78, 0x2f, 0x69, 0x60, 0x18, 0xb4, 0xf6, 0x6c, 0xcd, 0xf9, 0x54, 0x48, - 0x18, 0x1a, 0x53, 0xea, 0x02, 0xe5, 0x2a, 0x93, 0x14, 0x52, 0xa2, 0x97, 0x0a, 0x30, 0x05, 0x33, 0x0e, 0x37, 0x17, 0xe3, 0x77, 0x60, 0x6b, 0x1f, 0x98, 0xd1, 0x39, 0x16, 0x5b, 0x84, 0x6f, 0xf5, - 0x12, 0x63, 0x0b, 0x53, 0xa0, 0x45, 0x16, 0x2d, 0x69, 0x8c, 0xe4, 0x37, 0xad, 0x45, 0x96, 0xb4, 0xfc, 0x06, 0x01, 0xdf, 0xe5, 0xe7, 0xc9, 0x93, 0x3d, 0x22, 0xa3, 0xed, 0x02, 0x4f, 0x84, 0x20, - 0xc8, 0x38, 0xfb, 0x50, 0xdb, 0xd0, 0x29, 0xb1, 0x0c, 0xcf, 0x06, 0xd3, 0xe9, 0xd5, 0xe0, 0xfa, 0x75, 0x05, 0x4b, 0xb1, 0x56, 0xc3, 0x52, 0x47, 0x56, 0xee, 0xeb, 0x54, 0x38, 0x3e, 0x47, 0x1f, - 0xf9, 0x66, 0x86, 0x8d, 0xa7, 0xfd, 0x15, 0xbf, 0xb8, 0x1c, 0xff, 0xa5, 0x18, 0xfc, 0x66, 0x3b, 0xda, 0x81, 0xfa, 0xf8, 0x11, 0xda, 0x34, 0x5a, 0x0a, 0xf0, 0x23, 0xc2, 0xb1, 0xd8, 0x8b, 0x62, - 0x60, 0x5c, 0x0b, 0x28, 0x81, 0x42, 0x63, 0x66, 0x4c, 0xc3, 0xf3, 0xce, 0x31, 0xa4, 0x9b, 0xb8, 0xe3, 0x1b, 0x1e, 0xff, 0xc2, 0x71, 0xd0, 0x2a, 0x46, 0x1f, 0x68, 0x94, 0x69, 0xf4, 0x6e, 0x3c, - 0x7a, 0xb3, 0x64, 0xd1, 0xd2, 0xac, 0x47, 0x1d, 0xbf, 0x30, 0x36, 0x64, 0xa6, 0x0e, 0xeb, 0x38, 0xfa, 0x01, 0x7e, 0xc3, 0xb8, 0x84, 0x55, 0x12, 0xf8, 0x77, 0xbb, 0x40, 0x77, 0xbe, 0x0f, 0x47, - 0xd0, 0xba, 0x6b, 0xff, 0xf6, 0xbf, 0xf0, 0xfb, 0xd3, 0xbb, 0x4e, 0xab, 0xe3, 0x43, 0x1f, 0x7c, 0x2e, 0xea, 0xde, 0x88, 0x55, 0x34, 0x89, 0x13, 0xc6, 0x1f, 0xda, 0xcf, 0x3b, 0x28, 0x59, 0x64, - 0xb1, 0x88, 0x39, 0x40, 0x14, 0xd6, 0x14, 0x3c, 0x26, 0xd2, 0x14, 0x77, 0x53, 0x91, 0x10, 0xc9, 0x14, 0x3c, 0x7f, 0x16, 0x9a, 0xdd, 0xb8, 0xf7, 0x8c, 0xf1, 0x87, 0x7e, 0x4e, 0x7c, 0x8e, 0xac, - 0x53, 0x86, 0x8e, 0x1f, 0x4a, 0x22, 0x9b, 0x39, 0xfc, 0x57, 0x91, 0x66, 0xf6, 0x37, 0x6d, 0xbc, 0x84, 0x9d, 0x00, 0x82, 0xbc, 0xa2, 0x83, 0xa3, 0xd8, 0x62, 0x26, 0x31, 0x34, 0x1f, 0x96, 0x81, - 0x11, 0x64, 0xb9, 0xa7, 0x2e, 0x70, 0xd4, 0xb5, 0xdb, 0x84, 0xc8, 0x50, 0x64, 0x4f, 0x9e, 0xa0, 0x06, 0x21, 0xb8, 0xea, 0x98, 0x50, 0x14, 0xf9, 0x87, 0x62, 0xce, 0x3e, 0xa6, 0x9c, 0x6f, 0x93, - 0xd7, 0xbe, 0x48, 0x87, 0x8b, 0x38, 0xff, 0x1f, 0x16, 0x8a, 0x1d, 0x85, 0x3c, 0xf3, 0x15, 0x27, 0xcf, 0xf0, 0xe9, 0x5d, 0x07, 0x3b, 0xc4, 0x56, 0xc7, 0xed, 0xa8, 0x5a, 0x76, 0x01, 0x9b, 0x73, - 0x74, 0x28, 0x30, 0x1a, 0xea, 0x5c, 0x54, 0xaa, 0xdb, 0xef, 0xf0, 0xfc, 0xe4, 0x40, 0x24, 0xdc, 0xf1, 0xb4, 0x7a, 0x0c, 0x2c, 0xd2, 0x42, 0x09, 0xd2, 0x7b, 0x2f, 0x69, 0x4f, 0x2d, 0x8d, 0x6c, - 0x77, 0x12, 0x3e, 0xda, 0xe2, 0xf8, 0xe5, 0x79, 0x4b, 0x99, 0xba, 0x52, 0x70, 0x18, 0x8c, 0xdf, 0x61, 0x11, 0x87, 0x16, 0x28, 0x09, 0x5f, 0xd0, 0xa2, 0xfa, 0x54, 0x79, 0xd1, 0x0f, 0xb4, 0x90, - 0x93, 0xaa, 0x70, 0x3c, 0x3c, 0x3f, 0xe9, 0x7f, 0xee, 0x4c, 0x6f, 0x47, 0x99, 0x87, 0xe0, 0xb1, 0xc7, 0x2e, 0x81, 0x8d, 0x48, 0x8a, 0x1d, 0x25, 0x7c, 0xfb, 0x2e, 0xe3, 0x58, 0x60, 0x04, 0x73, - 0xec, 0xf3, 0x56, 0xd8, 0x55, 0xbc, 0xf8, 0x19, 0xf3, 0x6c, 0x8f, 0x67, 0x49, 0x72, 0x0c, 0x77, 0xf9, 0x6a, 0xb0, 0x36, 0x9a, 0xeb, 0xf8, 0x3b, 0xa2, 0xfd, 0xa1, 0x94, 0xcd, 0xae, 0x70, 0x6d, - 0xc0, 0x19, 0x49, 0x29, 0xe4, 0x51, 0xa5, 0x00, 0x77, 0xee, 0x19, 0xd3, 0x39, 0xe3, 0x34, 0x86, 0x48, 0x48, 0x49, 0x23, 0x9d, 0x6c, 0x43, 0x1f, 0x7e, 0x7e, 0xf2, 0xa2, 0xd8, 0x07, 0x70, 0x4b, - 0xc1, 0x45, 0x2b, 0x2b, 0x21, 0x0a, 0xe5, 0x31, 0x0e, 0xd2, 0xc4, 0xab, 0x2f, 0xc4, 0xa9, 0x5d, 0x62, 0x6e, 0x89, 0xe9, 0xa4, 0xaa, 0xe4, 0x50, 0xbe, 0x66, 0x52, 0x70, 0x6c, 0xee, 0xb1, 0xda, - 0x67, 0x26, 0x62, 0x38, 0x1a, 0x15, 0xd5, 0xa1, 0xef, 0x42, 0xbd, 0x96, 0x04, 0x5b, 0x10, 0x8a, 0xbd, 0x22, 0x12, 0x2c, 0xe4, 0x16, 0x75, 0x9a, 0x45, 0x1a, 0xc3, 0xfe, 0x5c, 0x8a, 0x15, 0xa4, - 0x52, 0x44, 0xd8, 0xea, 0x99, 0xa6, 0xbf, 0x84, 0xd2, 0xc2, 0x96, 0xcb, 0x5b, 0xa5, 0xe9, 0x0a, 0xa4, 0x10, 0xda, 0x6b, 0xc0, 0x9c, 0x49, 0xa5, 0x2b, 0x40, 0xa6, 0xb1, 0x0e, 0x57, 0x6b, 0x0e, - 0x2a, 0x9b, 0x95, 0xcb, 0x4c, 0x41, 0x24, 0xb8, 0x62, 0x31, 0xc5, 0x46, 0x27, 0x95, 0xe2, 0x3d, 0x8d, 0x34, 0xcc, 0x30, 0x53, 0x17, 0x40, 0xde, 0x9c, 0xf1, 0xf8, 0xde, 0x14, 0x98, 0xf7, 0xf8, - 0x26, 0x66, 0xb2, 0xdd, 0x81, 0x3f, 0xbd, 0x6a, 0xd5, 0xf3, 0xdc, 0x87, 0xdf, 0x3d, 0x28, 0xed, 0xd4, 0x8a, 0xe3, 0x0a, 0xd3, 0x9b, 0x61, 0xd4, 0x56, 0xa1, 0xb6, 0x69, 0xd9, 0x47, 0xe7, 0xbb, - 0x38, 0xa9, 0x33, 0xc9, 0xe1, 0x79, 0x51, 0x03, 0xbb, 0xb7, 0x7d, 0x44, 0xef, 0x01, 0x6c, 0xaa, 0xbf, 0x97, 0x2c, 0xa1, 0x26, 0xb4, 0xe3, 0xaa, 0x0f, 0x3f, 0xf4, 0xa1, 0xd5, 0x6b, 0x19, 0x85, - 0xc4, 0xa2, 0xe2, 0x57, 0x71, 0x0e, 0xd1, 0x33, 0xbc, 0xef, 0xf8, 0x52, 0x7e, 0x80, 0x01, 0xc9, 0xd7, 0x24, 0x25, 0x0f, 0xd5, 0xb2, 0xa7, 0x61, 0xe4, 0x4d, 0xa4, 0xc8, 0x78, 0x6c, 0x7c, 0xea, - 0xcd, 0xcb, 0xd1, 0xe0, 0x2a, 0xf8, 0xe9, 0x3f, 0xff, 0xf1, 0x2f, 0x68, 0xd7, 0xc2, 0x7d, 0x6f, 0x9a, 0x12, 0x19, 0x75, 0x76, 0x8e, 0xff, 0x13, 0x91, 0x7f, 0xda, 0x8d, 0xda, 0x86, 0x19, 0x97, - 0x48, 0xf1, 0x77, 0x2f, 0x0c, 0x4d, 0x1a, 0xb5, 0x26, 0x67, 0x33, 0x64, 0x9d, 0x0a, 0xca, 0x63, 0xec, 0x90, 0x4a, 0x62, 0x3c, 0x80, 0x58, 0x70, 0xf4, 0xb8, 0x54, 0x32, 0xae, 0xe7, 0xd0, 0xfa, - 0x0f, 0xd5, 0x82, 0x3c, 0x3b, 0xe7, 0xa2, 0xdd, 0x45, 0xea, 0x7b, 0x9f, 0xd0, 0xdc, 0x22, 0xc1, 0x23, 0xa2, 0x29, 0x27, 0x9a, 0x2a, 0xc0, 0x42, 0x39, 0x61, 0x9c, 0x2a, 0xdb, 0xb2, 0x9a, 0xe1, - 0x8f, 0x05, 0xb8, 0x37, 0xcb, 0x35, 0x75, 0xcf, 0x9d, 0xba, 0x6b, 0xf9, 0x71, 0x42, 0x57, 0x62, 0x4d, 0xe1, 0x4e, 0x9a, 0x89, 0x0e, 0x9a, 0xcf, 0x86, 0x62, 0x33, 0x8a, 0x21, 0xea, 0x96, 0xf1, - 0x58, 0x6c, 0x94, 0x31, 0x41, 0xc6, 0xe1, 0x15, 0xd3, 0xf0, 0x92, 0xa8, 0xa5, 0xdb, 0x89, 0xce, 0x1f, 0x2d, 0x69, 0xf4, 0x00, 0x22, 0xd3, 0x26, 0x5e, 0x49, 0x9a, 0x0a, 0xc5, 0x4a, 0xab, 0x25, - 0x99, 0x16, 0x30, 0x9c, 0x9c, 0x9d, 0xc2, 0x8a, 0x70, 0xb2, 0x30, 0x73, 0xb2, 0x42, 0x26, 0xe8, 0x4e, 0x71, 0x08, 0x97, 0x79, 0xd5, 0xdf, 0xc5, 0x83, 0x57, 0x64, 0x6b, 0x92, 0xac, 0x63, 0x4a, - 0x2f, 0x89, 0x36, 0x25, 0x53, 0x4c, 0xcd, 0x48, 0xc3, 0x4d, 0xd0, 0x1c, 0x8e, 0x3b, 0x79, 0xc7, 0x0d, 0x15, 0xa9, 0x14, 0x71, 0x16, 0x51, 0x68, 0xb6, 0x82, 0x77, 0x44, 0x2e, 0xee, 0x64, 0x0b, - 0x24, 0xb1, 0x4d, 0xd1, 0x92, 0x70, 0x30, 0x8b, 0x10, 0x67, 0x14, 0x6d, 0x78, 0x23, 0x64, 0xec, 0xf6, 0xab, 0x34, 0x61, 0x5a, 0x63, 0xc9, 0x25, 0xb3, 0x84, 0x2a, 0x9b, 0xf3, 0xb5, 0x84, 0x40, - 0x41, 0x0b, 0x71, 0xb7, 0x00, 0xff, 0xfb, 0x2f, 0x70, 0x96, 0x3b, 0x67, 0xa8, 0x80, 0x44, 0x2c, 0xaa, 0x42, 0xf5, 0x9b, 0xe7, 0x6f, 0x2f, 0x6e, 0xef, 0xdf, 0x8e, 0x26, 0x2f, 0x2f, 0xa7, 0x23, - 0x4c, 0xf4, 0xa6, 0x57, 0xaa, 0xca, 0xb8, 0xd4, 0x31, 0xa2, 0xac, 0x21, 0x7b, 0x39, 0x98, 0x8e, 0xee, 0x4f, 0xc6, 0x93, 0x7e, 0xb3, 0xbd, 0xef, 0x5b, 0x50, 0xcd, 0x9c, 0xcd, 0x67, 0x7e, 0xc7, - 0xef, 0x54, 0x82, 0x59, 0xbe, 0xb5, 0xaa, 0x4f, 0x67, 0x2d, 0x26, 0x2e, 0xd9, 0x3e, 0xf9, 0x6a, 0x72, 0xf9, 0x66, 0x34, 0xbc, 0x46, 0x60, 0x73, 0xcc, 0x9f, 0x76, 0xd9, 0x3d, 0x1f, 0x05, 0x15, - 0x3c, 0x9f, 0x8a, 0x66, 0xe2, 0xd0, 0x56, 0xe4, 0xbb, 0xe8, 0xbe, 0xeb, 0xaf, 0x7c, 0xcf, 0x6b, 0x7c, 0xb7, 0x3f, 0xaf, 0x01, 0xa3, 0x0f, 0x9a, 0x72, 0x33, 0xe1, 0xd1, 0x02, 0x0d, 0x5e, 0x6c, - 0x8c, 0x61, 0xad, 0x88, 0x66, 0x11, 0x49, 0x92, 0x2d, 0xc4, 0x62, 0xc3, 0xf3, 0x49, 0x04, 0x9a, 0xa1, 0x91, 0x62, 0xb0, 0xb1, 0x43, 0xa3, 0xf0, 0x3d, 0x91, 0x36, 0x08, 0x9b, 0xf9, 0x49, 0x10, - 0x51, 0xae, 0x25, 0x49, 0xbc, 0x06, 0x5c, 0x2f, 0x99, 0xb2, 0xf8, 0x14, 0x64, 0xaa, 0xb6, 0x19, 0xdc, 0x66, 0xf4, 0x09, 0x17, 0x5a, 0x9d, 0x31, 0xa6, 0x52, 0x2c, 0xd9, 0x8c, 0x69, 0x6b, 0xf9, - 0xa6, 0x5c, 0xe7, 0x30, 0x63, 0x9c, 0xc8, 0x2d, 0xc4, 0x44, 0x93, 0xf0, 0x7b, 0xca, 0xc2, 0x51, 0xf5, 0x86, 0x48, 0x8c, 0xcf, 0xfd, 0xc3, 0xea, 0x30, 0xf1, 0xb2, 0xe7, 0x40, 0x7b, 0x7b, 0xb2, - 0xf0, 0xbd, 0xbc, 0xc9, 0xf3, 0x9b, 0x75, 0x7c, 0xf5, 0xc8, 0x60, 0xf4, 0x6d, 0xc6, 0xe2, 0xb0, 0x0b, 0xe7, 0x15, 0xe5, 0x82, 0x01, 0x1a, 0x8a, 0x2c, 0x89, 0x79, 0x4b, 0x9b, 0xf4, 0xb0, 0x0b, - 0xdc, 0xad, 0x69, 0x87, 0x69, 0x08, 0xc3, 0xd0, 0xf7, 0x2a, 0x81, 0x96, 0xe7, 0x2e, 0x34, 0x19, 0x5d, 0x5d, 0xde, 0x4c, 0xce, 0xf6, 0xc2, 0xad, 0x45, 0x77, 0x23, 0x93, 0x7e, 0x1d, 0xb0, 0x27, - 0xe4, 0xa2, 0x67, 0x07, 0xc5, 0x96, 0xcb, 0xc3, 0x3c, 0xf7, 0xcc, 0x58, 0xb0, 0xbe, 0x16, 0x98, 0x35, 0x2b, 0x0d, 0xa8, 0x17, 0x4c, 0xd5, 0xe3, 0xf2, 0xe1, 0x02, 0x86, 0x35, 0x3b, 0xa6, 0xa9, - 0x0e, 0xa6, 0xcd, 0xc2, 0x8b, 0x47, 0xa4, 0xc2, 0xe5, 0x0b, 0x9b, 0x20, 0xc7, 0xa7, 0xd3, 0xbe, 0xdf, 0xf7, 0x6d, 0x30, 0x0c, 0x24, 0x3c, 0xd0, 0x2d, 0xac, 0x49, 0x92, 0xd1, 0x22, 0x4d, 0x56, - 0x82, 0x77, 0x0b, 0x23, 0x9e, 0xb1, 0x71, 0x03, 0x52, 0xfa, 0x49, 0xa6, 0xc8, 0x82, 0x62, 0x24, 0xdf, 0xb8, 0x48, 0x4e, 0x14, 0x62, 0x86, 0x58, 0x50, 0x5b, 0xc7, 0xe4, 0x25, 0x84, 0x45, 0x41, - 0x14, 0x10, 0x50, 0x34, 0x25, 0x92, 0x68, 0x21, 0xa1, 0x5d, 0xbc, 0x56, 0xa0, 0x52, 0x12, 0xd1, 0x2e, 0x68, 0x32, 0xeb, 0x02, 0xa7, 0x1b, 0x13, 0x9f, 0xa1, 0xdd, 0xba, 0xe3, 0xad, 0x4e, 0xd7, - 0x66, 0x82, 0x4c, 0x69, 0xb1, 0x82, 0x56, 0xbf, 0x05, 0x79, 0x79, 0xae, 0xc8, 0x9c, 0xbe, 0x45, 0x82, 0xb0, 0xa2, 0x37, 0x65, 0x45, 0xd3, 0xd0, 0xe7, 0xc3, 0x47, 0x13, 0x66, 0x63, 0x73, 0x6a, - 0x0e, 0xed, 0x06, 0x51, 0x0f, 0x74, 0xeb, 0xa3, 0x4f, 0xb5, 0x4b, 0x4d, 0x74, 0xea, 0x46, 0x50, 0xa0, 0xf5, 0x8f, 0x6d, 0xce, 0xb7, 0x93, 0x29, 0xa3, 0x48, 0x45, 0x22, 0xf3, 0x13, 0xd3, 0xab, - 0x89, 0xdc, 0x7f, 0xd7, 0x43, 0x52, 0x29, 0x52, 0x2a, 0x35, 0xa3, 0xca, 0x2f, 0x2d, 0xfc, 0xa4, 0x62, 0xc2, 0x28, 0xe6, 0xa3, 0xc2, 0xca, 0x6f, 0x64, 0x52, 0x5a, 0xb3, 0x9b, 0x4d, 0x1c, 0x32, - 0xdf, 0xdc, 0x65, 0x0f, 0x8c, 0x10, 0x72, 0xd5, 0xec, 0xb9, 0x63, 0x51, 0x45, 0xe4, 0xf8, 0x2b, 0x15, 0xf7, 0x66, 0x41, 0x35, 0xfc, 0x0c, 0x95, 0x7a, 0xbc, 0xd6, 0x3f, 0x56, 0x9c, 0xd7, 0x40, - 0x86, 0x61, 0xe8, 0x42, 0x1c, 0x3e, 0x96, 0x3d, 0xe3, 0xe7, 0xf3, 0x17, 0x76, 0x8a, 0xff, 0x73, 0x33, 0x1e, 0x5d, 0xf7, 0x7d, 0x53, 0x88, 0xb8, 0xdf, 0x41, 0xf0, 0x47, 0xc6, 0xaa, 0x18, 0x2a, - 0x83, 0x59, 0xc4, 0x73, 0x33, 0x1d, 0x4d, 0x2e, 0x06, 0xb6, 0xc2, 0xfe, 0xf8, 0xb1, 0xf6, 0xea, 0x6a, 0x30, 0x9d, 0xde, 0x5e, 0x4e, 0x4e, 0xf6, 0xc7, 0x65, 0x46, 0x4e, 0x48, 0x66, 0xd3, 0x9c, - 0x52, 0x4a, 0x02, 0xa5, 0x0b, 0xc1, 0xe5, 0x81, 0x48, 0xf5, 0xf1, 0x23, 0xc8, 0x95, 0xad, 0x68, 0x76, 0x83, 0x53, 0x8e, 0xb1, 0xd6, 0xd2, 0xee, 0x1e, 0x11, 0x04, 0xe8, 0xdc, 0x41, 0xa6, 0xa8, - 0xec, 0xef, 0x91, 0xee, 0x5e, 0xa6, 0x44, 0x29, 0xac, 0x16, 0xfa, 0x7b, 0x0c, 0x3c, 0x0e, 0x81, 0xce, 0xdf, 0x69, 0x52, 0x57, 0x6d, 0x94, 0xc9, 0xe4, 0xeb, 0x54, 0x6b, 0x20, 0x4b, 0xd5, 0xe2, - 0xe3, 0x37, 0xa9, 0x56, 0xb1, 0x84, 0xf2, 0xef, 0xa0, 0x5b, 0x43, 0x67, 0x2e, 0x78, 0x71, 0x40, 0x58, 0x3b, 0xf2, 0x9c, 0x43, 0x70, 0xf6, 0x35, 0x02, 0xdc, 0xd3, 0x70, 0xed, 0x20, 0xa3, 0xdc, - 0x5d, 0xda, 0x8f, 0x76, 0xe9, 0x7d, 0x4c, 0x7a, 0x0a, 0x85, 0x56, 0xc8, 0xb2, 0xea, 0x22, 0x49, 0x82, 0x1a, 0xca, 0x47, 0xda, 0x56, 0x5f, 0xe6, 0xfa, 0x47, 0x8b, 0x22, 0x41, 0xd6, 0x47, 0x39, - 0x53, 0x91, 0xc9, 0x88, 0x7e, 0x55, 0x8e, 0x37, 0x85, 0x8d, 0xbb, 0x23, 0xcb, 0x43, 0x95, 0x49, 0xf6, 0x79, 0x8f, 0x9f, 0xe3, 0x1c, 0x26, 0x44, 0xa9, 0x6f, 0x41, 0x19, 0x21, 0x82, 0x12, 0x67, - 0x7d, 0xb0, 0xab, 0x36, 0x4c, 0x47, 0x4b, 0x37, 0xe7, 0xd4, 0xa2, 0xe8, 0x1e, 0xea, 0x63, 0xce, 0xfc, 0x9e, 0xcb, 0x8c, 0x9f, 0xaa, 0xa6, 0x76, 0x28, 0x7a, 0xee, 0x08, 0xe3, 0x8b, 0xd1, 0xb3, - 0x84, 0xf3, 0x3b, 0x3b, 0xdb, 0x2d, 0xdf, 0x7f, 0xb9, 0xdb, 0x80, 0x55, 0x36, 0x17, 0xb3, 0xac, 0xdc, 0x15, 0x68, 0xfd, 0x98, 0x83, 0xc6, 0x9e, 0xcf, 0x3e, 0x68, 0x0d, 0xe9, 0x41, 0x50, 0xc8, - 0xed, 0x03, 0x02, 0x18, 0x8a, 0x55, 0xca, 0x92, 0xe2, 0x02, 0xf0, 0xb0, 0x36, 0x6d, 0xf1, 0xb4, 0x8b, 0xa2, 0x7d, 0x68, 0xb8, 0x13, 0xf9, 0x9f, 0x17, 0x49, 0x8d, 0x33, 0xd8, 0xe3, 0xee, 0x2b, - 0x29, 0x9e, 0x54, 0x2f, 0x2c, 0xbf, 0x99, 0x5e, 0x1f, 0x82, 0x28, 0x85, 0xaa, 0x0d, 0x7e, 0x06, 0xf1, 0x8e, 0x73, 0xee, 0x67, 0xcd, 0xaf, 0xf1, 0x54, 0xa8, 0xcb, 0xa0, 0xbc, 0x2d, 0x99, 0xb3, - 0xef, 0x59, 0xbf, 0x37, 0x60, 0x64, 0x47, 0x01, 0x34, 0x6f, 0x69, 0xbe, 0xe7, 0x69, 0x5e, 0x03, 0xc6, 0xf3, 0x72, 0x80, 0xd3, 0xc5, 0xe2, 0x90, 0xc5, 0x44, 0xdb, 0x0f, 0x0c, 0xa6, 0xaf, 0x07, - 0xc1, 0x8b, 0x7f, 0xfe, 0x08, 0x2a, 0x5b, 0xe5, 0x9f, 0x64, 0x9c, 0xd7, 0x5a, 0x1f, 0xd3, 0x37, 0xb1, 0x84, 0xe6, 0x5d, 0xc7, 0x74, 0x49, 0x5e, 0xfc, 0xf3, 0xc7, 0x69, 0xb6, 0xea, 0xfb, 0xbe, - 0xf7, 0x75, 0x45, 0xea, 0x67, 0x4a, 0xba, 0x02, 0x53, 0x51, 0xd8, 0x95, 0xb8, 0x9b, 0x6e, 0x7f, 0xa5, 0xb0, 0x33, 0x45, 0xdd, 0xa3, 0x14, 0x74, 0x65, 0xc7, 0xb1, 0x7b, 0x6e, 0xd5, 0xdc, 0x6b, - 0xef, 0x26, 0x54, 0x65, 0x89, 0x76, 0x77, 0xa5, 0xbb, 0x55, 0x98, 0x32, 0x20, 0x28, 0xc1, 0xc3, 0xf9, 0x9a, 0xcd, 0xdd, 0x38, 0x6d, 0xef, 0x3c, 0xd8, 0x6b, 0xaa, 0xe0, 0x63, 0x05, 0x5d, 0x10, - 0x55, 0x31, 0xc2, 0x8b, 0x9f, 0x9f, 0x3c, 0x3f, 0x54, 0x55, 0xd6, 0x48, 0x2c, 0xae, 0x5c, 0xdd, 0x44, 0x77, 0x8f, 0xd4, 0xc7, 0xa4, 0xd3, 0x10, 0x49, 0x00, 0x0d, 0xe8, 0x31, 0x68, 0x75, 0x09, - 0xd3, 0x12, 0x31, 0xc4, 0xce, 0x1a, 0x0f, 0x70, 0xf6, 0x8a, 0x9d, 0xff, 0x86, 0xd8, 0x2f, 0x7d, 0xa8, 0xd2, 0x34, 0x86, 0x59, 0xa6, 0x81, 0xbb, 0x6b, 0xef, 0x56, 0x21, 0xb5, 0x16, 0x08, 0xfb, - 0x68, 0x7e, 0x13, 0x49, 0xcb, 0x8b, 0x1e, 0x17, 0x85, 0xdc, 0x6c, 0xd3, 0xde, 0x67, 0x32, 0xae, 0x34, 0x49, 0x92, 0xfc, 0xfa, 0xdc, 0xc9, 0xaa, 0x8b, 0x48, 0xf2, 0xcf, 0x1b, 0x2a, 0x04, 0xcc, - 0xb6, 0x20, 0xb1, 0xd9, 0xc2, 0x88, 0xd7, 0xda, 0x95, 0x92, 0x6b, 0xbe, 0xb6, 0x22, 0x93, 0xf0, 0x39, 0xeb, 0xcb, 0x49, 0xb0, 0x83, 0x69, 0xc7, 0xb9, 0x31, 0xc8, 0xe6, 0x01, 0x09, 0x41, 0xdf, - 0xde, 0xe3, 0xd7, 0xa2, 0x70, 0x6d, 0x6c, 0x7e, 0x4a, 0x58, 0x62, 0xa7, 0xb2, 0x85, 0x5b, 0xd7, 0xfd, 0xd7, 0x39, 0x78, 0xd7, 0x92, 0x55, 0x7f, 0xb7, 0x32, 0x1f, 0x93, 0xcd, 0xa8, 0xf9, 0x84, - 0x4b, 0x8a, 0x15, 0x53, 0x34, 0x2e, 0xa6, 0xec, 0xf9, 0x41, 0x63, 0xbe, 0xa6, 0x4a, 0xb3, 0x05, 0xa2, 0x46, 0xa1, 0xd0, 0x84, 0x6a, 0xba, 0x6b, 0x0f, 0xa6, 0xd7, 0xd4, 0x9a, 0xae, 0x52, 0x0d, - 0x04, 0xa2, 0x84, 0x12, 0x5e, 0x14, 0x34, 0xfb, 0x18, 0xe7, 0xf6, 0xa3, 0xb4, 0x14, 0xc9, 0x8d, 0xab, 0x84, 0xb9, 0x6f, 0x78, 0x0c, 0xb1, 0xc0, 0xdd, 0x27, 0x5b, 0x16, 0xce, 0x84, 0xa6, 0x72, - 0x0c, 0xbd, 0x67, 0xa1, 0x4e, 0xc4, 0xdb, 0xea, 0x69, 0x15, 0x21, 0x97, 0xb3, 0x30, 0xf3, 0x6d, 0x8c, 0xdf, 0x6c, 0x57, 0xe7, 0xa3, 0x5f, 0x0c, 0x28, 0xef, 0xd7, 0xab, 0xd0, 0xde, 0x6b, 0xfb, - 0x1d, 0x68, 0x96, 0x48, 0xfc, 0xdd, 0x2b, 0xed, 0xbf, 0x5f, 0xf9, 0x78, 0x07, 0x0a, 0x9e, 0xbf, 0x7d, 0x93, 0xbd, 0x57, 0xc4, 0x3c, 0xce, 0x9d, 0x76, 0x89, 0xaf, 0x7a, 0xad, 0x5d, 0xe0, 0x3b, - 0x38, 0x02, 0x2c, 0x51, 0x1f, 0x9e, 0x3b, 0x7e, 0xe9, 0x94, 0x83, 0x08, 0xf3, 0x7b, 0xf4, 0x2b, 0x29, 0xd6, 0x2c, 0xa6, 0x40, 0xc0, 0xcf, 0x6f, 0x6a, 0xd9, 0xbf, 0x69, 0xec, 0xc3, 0x86, 0x98, - 0xfb, 0x13, 0x49, 0xb5, 0x64, 0x74, 0x6d, 0xad, 0x64, 0x78, 0x36, 0x06, 0x22, 0x17, 0x6e, 0x54, 0xb7, 0x61, 0x49, 0xe2, 0xd9, 0x3b, 0x00, 0x3b, 0x8e, 0x9e, 0x09, 0xbd, 0x2c, 0x74, 0x83, 0x71, - 0x91, 0x0b, 0x1e, 0xe4, 0xcf, 0xf6, 0x26, 0x89, 0x09, 0xae, 0x42, 0x67, 0x2f, 0xc3, 0xf3, 0x93, 0xfb, 0xb3, 0xf1, 0xc5, 0xe8, 0x7e, 0x30, 0x79, 0x35, 0x2d, 0xaa, 0xe6, 0xe1, 0xe5, 0xc5, 0xe9, - 0xf8, 0x15, 0x34, 0x9f, 0xfa, 0x5e, 0x6d, 0x5c, 0x5a, 0x83, 0xf6, 0xbc, 0xdb, 0xc9, 0xe0, 0xea, 0x6a, 0x34, 0xb9, 0x3f, 0x1b, 0xdc, 0x5c, 0x0c, 0x5f, 0x8f, 0x26, 0x7d, 0x21, 0x17, 0xf9, 0xf4, - 0xc8, 0x8e, 0x92, 0xf2, 0x10, 0x51, 0x2d, 0x73, 0xce, 0x09, 0xe3, 0xc8, 0xb5, 0x5a, 0xd2, 0x24, 0xb1, 0xb3, 0x75, 0x17, 0x8b, 0xfa, 0xd3, 0xe1, 0x8b, 0x67, 0x3f, 0xfd, 0x08, 0x0d, 0x33, 0x55, - 0x31, 0x5c, 0x7a, 0x48, 0x72, 0xf5, 0x86, 0xed, 0xce, 0x83, 0xaa, 0x99, 0x56, 0x9f, 0x4f, 0x46, 0x2f, 0x6f, 0x5e, 0x95, 0xab, 0x81, 0x29, 0xe4, 0x8d, 0x26, 0xfe, 0x7e, 0x46, 0x7d, 0x4f, 0xa4, - 0x3d, 0xcb, 0x0f, 0x4e, 0x2c, 0x2b, 0xab, 0x2c, 0xd1, 0xec, 0x5c, 0xc4, 0x59, 0x42, 0xaf, 0xec, 0xb4, 0xf4, 0x24, 0xbf, 0x82, 0x2a, 0x46, 0xce, 0x75, 0xfc, 0x9f, 0x1c, 0xb5, 0x7f, 0xee, 0xca, - 0xe9, 0x13, 0xd4, 0xe5, 0xec, 0x37, 0xff, 0xdb, 0xf7, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x8b, 0x2b, 0xc6, 0x07, 0x61, 0x0e, 0x00, 0x00, 0x19, 0x2c, 0x00, 0x00, 0x50, - 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, - 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x59, 0x7d, 0x6f, 0xda, 0x48, 0xb7, 0xff, 0xfb, 0xf1, 0xa7, 0x38, 0x8f, 0xb5, - 0xde, 0x24, 0x2b, 0x70, 0xda, 0x5c, 0xb5, 0xba, 0xa2, 0xf2, 0x55, 0x1d, 0x70, 0x1a, 0xba, 0x09, 0x20, 0x4c, 0x92, 0xae, 0xb6, 0x7b, 0xd1, 0x60, 0x1f, 0x60, 0x1a, 0x7b, 0xc6, 0x3b, 0x33, 0x40, - 0xb8, 0x57, 0xfb, 0xdd, 0x1f, 0xcd, 0x8b, 0xc1, 0xe4, 0xa5, 0xed, 0x4a, 0xbb, 0xd2, 0xf6, 0x8f, 0x02, 0x33, 0xe7, 0xfd, 0xfc, 0xe6, 0xcc, 0x99, 0x93, 0xf7, 0xe3, 0xe4, 0x1a, 0xda, 0x7f, 0xe1, - 0x3f, 0xcf, 0x48, 0xbc, 0xa2, 0x19, 0x32, 0x89, 0x39, 0x28, 0x0e, 0x6a, 0x89, 0x10, 0x57, 0x24, 0x5b, 0x22, 0xa4, 0x7c, 0xae, 0x36, 0x44, 0x20, 0x5c, 0xf0, 0x15, 0xcb, 0x89, 0xa2, 0x9c, 0xc1, - 0x71, 0x9c, 0x5e, 0x9c, 0xc0, 0x8a, 0xe5, 0x28, 0x80, 0x33, 0xb4, 0xfc, 0x5c, 0x40, 0xc9, 0x05, 0x42, 0xc6, 0x99, 0x12, 0x74, 0xb6, 0x52, 0x5c, 0x40, 0x61, 0x65, 0x02, 0x59, 0x08, 0xc4, 0x12, - 0x99, 0x92, 0x21, 0x40, 0x8a, 0x68, 0x14, 0x0c, 0x86, 0x93, 0x7e, 0x37, 0x81, 0x39, 0x2d, 0x9c, 0x84, 0x9c, 0x4a, 0xcb, 0x89, 0x39, 0x6c, 0xa8, 0x5a, 0x82, 0x5a, 0x52, 0x09, 0x1b, 0x2e, 0xee, - 0x61, 0xce, 0x05, 0x90, 0x3c, 0xa7, 0x5a, 0x3d, 0x29, 0x80, 0xb2, 0x39, 0x17, 0xa5, 0x31, 0xc6, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x53, 0xb6, 0x80, 0x8c, 0x57, 0x5b, 0x41, 0x17, 0x4b, 0x05, 0x7c, - 0xc3, 0x50, 0xc8, 0x25, 0xad, 0x42, 0x80, 0x89, 0x76, 0x28, 0xbd, 0xa8, 0x0d, 0x92, 0x56, 0xf4, 0x5e, 0xb5, 0xe2, 0xb0, 0xe5, 0x2b, 0xe7, 0x52, 0xc3, 0x7b, 0x17, 0x94, 0x16, 0xdc, 0xa2, 0x90, - 0xda, 0xf5, 0xb3, 0xf0, 0x15, 0x1c, 0xab, 0xa5, 0x63, 0xf3, 0xdd, 0xbe, 0x7f, 0xf2, 0xce, 0xf0, 0x97, 0x64, 0x0b, 0x8c, 0x2b, 0x58, 0x49, 0xdc, 0x6b, 0x00, 0x7c, 0xc8, 0xb0, 0x52, 0x40, 0x19, - 0x64, 0xbc, 0xac, 0x0a, 0x4a, 0x58, 0xe6, 0xf8, 0x9d, 0x97, 0x3b, 0x3d, 0x21, 0xc0, 0x2f, 0x4e, 0x0c, 0x9f, 0x29, 0x42, 0x19, 0x10, 0xe3, 0x10, 0xf0, 0x79, 0x93, 0x0c, 0x88, 0x32, 0xfc, 0x56, - 0x08, 0x00, 0x2c, 0x95, 0xaa, 0x3a, 0xa7, 0xa7, 0x9b, 0xcd, 0x26, 0x24, 0xc6, 0xf0, 0x90, 0x8b, 0xc5, 0x69, 0xed, 0xec, 0xe9, 0x55, 0xbf, 0x9b, 0x0c, 0xd2, 0xa4, 0x7d, 0x16, 0xbe, 0x6a, 0xf0, - 0xdd, 0xb0, 0x02, 0xa5, 0x04, 0x81, 0xbf, 0xaf, 0xa8, 0xc0, 0x1c, 0x66, 0x5b, 0x20, 0x55, 0x55, 0xd0, 0x8c, 0xcc, 0x0a, 0x84, 0x82, 0x6c, 0x74, 0x4a, 0x4d, 0xe6, 0x0c, 0x26, 0x28, 0x83, 0x8d, - 0xa0, 0x8a, 0xb2, 0x45, 0xcb, 0xf2, 0xcb, 0x1a, 0x19, 0xcd, 0xbc, 0xed, 0x23, 0x58, 0xdb, 0x4a, 0xe5, 0x01, 0x01, 0x67, 0x40, 0x5c, 0xd2, 0xfc, 0x38, 0x85, 0x7e, 0xea, 0xc3, 0x79, 0x9c, 0xf6, - 0xd3, 0x16, 0xdc, 0xf5, 0x27, 0x97, 0xc3, 0x9b, 0x09, 0xdc, 0xc5, 0xe3, 0x71, 0x3c, 0x98, 0xf4, 0x93, 0x14, 0x86, 0x63, 0xe8, 0x0e, 0x07, 0xbd, 0xfe, 0xa4, 0x3f, 0x1c, 0xa4, 0x30, 0xbc, 0x80, - 0x78, 0xf0, 0x8b, 0xe5, 0xfd, 0xb9, 0x3f, 0xe8, 0xb5, 0x00, 0xa9, 0x5a, 0xa2, 0x00, 0x7c, 0xa8, 0x84, 0x76, 0x85, 0x0b, 0xa0, 0x3a, 0xc0, 0x98, 0x37, 0x60, 0x56, 0xdb, 0xa1, 0x21, 0xb4, 0x4b, - 0x9c, 0xac, 0x30, 0xa3, 0x73, 0x9a, 0x41, 0x41, 0xd8, 0x62, 0x45, 0x16, 0x08, 0x0b, 0xbe, 0x46, 0xc1, 0x34, 0x82, 0x2a, 0x14, 0x25, 0x95, 0x3a, 0xdb, 0x12, 0x08, 0xcb, 0xa1, 0xa0, 0x25, 0x55, - 0x06, 0x6b, 0xd2, 0x32, 0x3f, 0xf1, 0x31, 0xf4, 0xfe, 0xfa, 0x33, 0xf9, 0x37, 0x88, 0x34, 0x12, 0x1d, 0xb0, 0xaf, 0xc9, 0x1a, 0x19, 0xdc, 0x09, 0x52, 0x55, 0x28, 0x40, 0x2a, 0x22, 0xd4, 0xaa, - 0x82, 0x19, 0x51, 0xd9, 0x12, 0x64, 0x26, 0x68, 0xa5, 0x5a, 0xb0, 0x76, 0x98, 0xff, 0xaf, 0xf0, 0x10, 0x38, 0xe3, 0x1a, 0x31, 0xc9, 0xe0, 0x16, 0xd6, 0x44, 0xc8, 0x8e, 0x5d, 0xff, 0x18, 0xdf, - 0xc6, 0xd3, 0xcb, 0xe1, 0x75, 0x02, 0x6d, 0x28, 0x78, 0x66, 0x6b, 0x05, 0x9f, 0x03, 0x81, 0x8f, 0xbd, 0x9f, 0x61, 0xc9, 0x4b, 0x0d, 0x15, 0xd1, 0x10, 0x34, 0xac, 0xdc, 0x79, 0xae, 0x05, 0xd9, - 0xe5, 0xeb, 0xf8, 0x36, 0x19, 0x4c, 0xcf, 0xe3, 0x49, 0xf7, 0x72, 0x9a, 0x74, 0x2f, 0x87, 0xd0, 0x06, 0x89, 0x4a, 0x63, 0xf0, 0x88, 0xb3, 0x23, 0xfd, 0x89, 0xcc, 0x60, 0x54, 0xa7, 0x00, 0xb3, - 0x25, 0xd7, 0x59, 0x73, 0x27, 0xc4, 0x7a, 0x90, 0xf1, 0xb2, 0x24, 0x2c, 0x7f, 0x46, 0xde, 0x28, 0xbe, 0x49, 0x93, 0xa7, 0x02, 0x37, 0x84, 0x2a, 0x5b, 0x64, 0xe0, 0x1e, 0xb7, 0x52, 0x09, 0x7e, - 0x8f, 0x30, 0xc3, 0xb9, 0x2e, 0x68, 0xc8, 0x74, 0x61, 0x69, 0x8a, 0x1a, 0x8e, 0x26, 0x29, 0xb4, 0xa1, 0x22, 0x82, 0x94, 0xa8, 0x50, 0x48, 0xa8, 0x88, 0x6c, 0x94, 0xce, 0x8f, 0x64, 0x4d, 0xe0, - 0xf6, 0x1a, 0x36, 0x4b, 0x64, 0x20, 0x56, 0xcc, 0xc0, 0xca, 0x44, 0x7c, 0x77, 0x62, 0x01, 0xc3, 0x45, 0xa8, 0xe9, 0x73, 0x9c, 0xad, 0xdc, 0x26, 0x50, 0x25, 0xb1, 0x98, 0xb7, 0x74, 0xf9, 0x70, - 0x30, 0x45, 0xd5, 0x50, 0x19, 0xb5, 0x3f, 0x59, 0xea, 0xf6, 0x27, 0xb1, 0x62, 0x5f, 0xf2, 0x4d, 0xd5, 0x51, 0x82, 0x30, 0x59, 0x71, 0xa1, 0xa2, 0x5c, 0x4d, 0x25, 0xcf, 0xee, 0x51, 0xb5, 0x24, - 0x8a, 0x35, 0x8a, 0x68, 0xdb, 0x92, 0x2b, 0x59, 0x21, 0xcb, 0xa3, 0x6d, 0x8b, 0xe4, 0xb9, 0x3e, 0x20, 0xd1, 0x7f, 0xbf, 0x7a, 0xf5, 0xaa, 0xe9, 0x48, 0xfa, 0x73, 0x7f, 0x34, 0x1d, 0x77, 0xa1, - 0x0d, 0xf3, 0x82, 0x2c, 0x8c, 0x39, 0x54, 0xda, 0xe3, 0xcf, 0x49, 0xee, 0xc2, 0x5a, 0x6a, 0xdb, 0x44, 0x66, 0x6a, 0x99, 0xfc, 0x1b, 0x60, 0x69, 0x45, 0x9e, 0xe3, 0x42, 0x97, 0xbb, 0xa2, 0x00, - 0xfd, 0xab, 0xa0, 0x0c, 0xa5, 0x2d, 0x8f, 0x47, 0xef, 0x8f, 0x4c, 0xe9, 0x24, 0x12, 0x9f, 0x22, 0x83, 0x4a, 0x93, 0x42, 0xef, 0xbd, 0x86, 0x01, 0xf0, 0xf9, 0x7c, 0x1f, 0x37, 0x45, 0x55, 0x81, - 0xda, 0x7e, 0x07, 0x06, 0xd8, 0x50, 0x96, 0xf3, 0x8d, 0x67, 0xd7, 0x03, 0x17, 0x07, 0x87, 0xa4, 0x1a, 0x45, 0xb3, 0xad, 0xe6, 0x55, 0x26, 0x5f, 0x8f, 0x75, 0x39, 0xb8, 0x78, 0xef, 0xe9, 0x1c, - 0xfc, 0xe0, 0xf1, 0x76, 0xe0, 0x43, 0x14, 0x81, 0xcf, 0x99, 0x0f, 0x46, 0x1a, 0x3c, 0xa5, 0xf0, 0xf6, 0xc6, 0x05, 0xfa, 0x98, 0x04, 0x06, 0xca, 0xbf, 0xaf, 0xe8, 0x9a, 0x14, 0xc8, 0x94, 0xb6, - 0xf5, 0x07, 0xbd, 0xee, 0x19, 0x05, 0x86, 0xc2, 0x0a, 0xf5, 0xe1, 0x58, 0x33, 0xf9, 0x7a, 0x29, 0x32, 0x1b, 0xbd, 0x71, 0xff, 0x36, 0x09, 0xcc, 0xd7, 0x51, 0x3c, 0xb9, 0x0c, 0xfc, 0x13, 0x27, - 0x3c, 0x79, 0xc0, 0x6c, 0xa5, 0x10, 0x88, 0x06, 0x91, 0x80, 0x1c, 0xe7, 0x94, 0x61, 0xee, 0x8e, 0x74, 0x8d, 0x68, 0x73, 0x35, 0xe9, 0x8b, 0x9b, 0xce, 0xcd, 0x75, 0x55, 0x7b, 0xe3, 0xe0, 0xb0, - 0xd3, 0xba, 0xe0, 0x8a, 0x83, 0xbc, 0xa7, 0xd5, 0x38, 0x1b, 0x09, 0x07, 0xc9, 0x6c, 0x89, 0x99, 0xbd, 0x8f, 0x2b, 0x81, 0xbb, 0x52, 0xc1, 0x59, 0x86, 0x36, 0x5d, 0x05, 0x2e, 0x48, 0xb6, 0x85, - 0x70, 0x46, 0x94, 0x3b, 0x39, 0xa6, 0x88, 0xee, 0x09, 0xc2, 0xac, 0xcc, 0xeb, 0x33, 0x45, 0xe7, 0x80, 0x0f, 0x54, 0x6a, 0x0b, 0x6e, 0xd2, 0x64, 0x3c, 0x1a, 0x0f, 0x2f, 0xfa, 0x57, 0x49, 0xf0, - 0xd9, 0x41, 0x6e, 0x5a, 0x09, 0xd4, 0x82, 0x7c, 0xc8, 0x34, 0x30, 0xbe, 0x45, 0x14, 0xfc, 0xf4, 0x5d, 0x02, 0xb3, 0x32, 0xff, 0xb6, 0x40, 0x43, 0x14, 0xfc, 0xe4, 0x75, 0xf6, 0xee, 0x7b, 0xef, - 0x25, 0x2a, 0x5d, 0xd7, 0x0a, 0xcf, 0xd3, 0xe9, 0x48, 0xc6, 0xe3, 0xe1, 0x78, 0xda, 0x1d, 0xf6, 0x92, 0xe8, 0x95, 0x8b, 0xfe, 0x84, 0x03, 0x95, 0xbc, 0x20, 0x0a, 0x81, 0x32, 0x85, 0x42, 0xd7, - 0xb6, 0x35, 0x11, 0x54, 0x63, 0x4c, 0xc2, 0x5c, 0xf0, 0x12, 0x2a, 0x2e, 0x25, 0xd5, 0x90, 0xab, 0xb8, 0x54, 0x2e, 0x7e, 0xb2, 0x05, 0x1b, 0x34, 0x4d, 0x03, 0x61, 0xdc, 0xdc, 0x68, 0x3b, 0x4d, - 0x0d, 0x9d, 0x46, 0x43, 0x14, 0x45, 0x11, 0xa4, 0x93, 0x78, 0x3c, 0x81, 0xdb, 0xf8, 0xaa, 0xdf, 0x8b, 0xf5, 0xd5, 0x68, 0x56, 0xf7, 0xc9, 0xdc, 0xd5, 0xe1, 0xc3, 0x44, 0x0e, 0xef, 0x3f, 0x5e, - 0xf2, 0x12, 0x3d, 0x4f, 0xc3, 0x33, 0x34, 0xff, 0x43, 0x22, 0x04, 0x17, 0x9d, 0x46, 0xe5, 0xd6, 0x12, 0xe6, 0xba, 0xd3, 0xd3, 0x67, 0x6e, 0xcb, 0x57, 0x02, 0x90, 0xad, 0xa9, 0xe0, 0x4c, 0x77, - 0x6f, 0x21, 0xfc, 0xcf, 0x8f, 0x67, 0x96, 0x71, 0x54, 0xa0, 0x3e, 0x90, 0xe6, 0xa0, 0xe9, 0x8a, 0xb7, 0x13, 0x50, 0xbb, 0xfb, 0x1c, 0xbf, 0xc6, 0x7b, 0x69, 0x0a, 0xb4, 0xe6, 0xd9, 0xc9, 0x6a, - 0xde, 0x15, 0x86, 0xc5, 0xd4, 0x4f, 0xca, 0xa4, 0x22, 0x45, 0x61, 0x76, 0xf6, 0x8a, 0x43, 0xcf, 0xf8, 0x82, 0xda, 0x6e, 0xcf, 0xeb, 0xd4, 0x3e, 0x35, 0xf2, 0xbe, 0xf7, 0xfe, 0xf3, 0x8c, 0xb2, - 0xcf, 0x5f, 0xc8, 0x9a, 0x84, 0xf8, 0x80, 0x2e, 0x08, 0x94, 0x51, 0xf5, 0xf5, 0x08, 0x50, 0x59, 0x5f, 0x0e, 0x84, 0x01, 0x65, 0x6b, 0x52, 0xd0, 0x5c, 0xdf, 0x5b, 0x98, 0x29, 0x2e, 0xb6, 0x8d, - 0x10, 0xec, 0x59, 0xa2, 0x47, 0x41, 0xff, 0x87, 0x45, 0x69, 0x0f, 0x9c, 0x64, 0xd0, 0x7b, 0x02, 0x1b, 0xaf, 0x63, 0x63, 0x62, 0xa8, 0x2e, 0x28, 0xcb, 0x8d, 0xda, 0x4a, 0xf0, 0x2f, 0x98, 0x29, - 0x98, 0x69, 0xfb, 0x73, 0x2a, 0x5a, 0x40, 0x43, 0x0c, 0xcd, 0xd6, 0x2e, 0x16, 0xa0, 0x96, 0x44, 0x99, 0x7e, 0x9f, 0x50, 0x26, 0xcd, 0xde, 0x9c, 0x17, 0xba, 0x37, 0xf2, 0xc3, 0x72, 0xcd, 0x7c, - 0xd7, 0x16, 0x5d, 0x90, 0xa2, 0x98, 0x91, 0xec, 0x5e, 0xfb, 0x95, 0xad, 0x84, 0xd0, 0x2e, 0xea, 0xa6, 0x5e, 0x97, 0x86, 0xbd, 0x2c, 0x87, 0x5e, 0x83, 0xbd, 0xd0, 0x1e, 0x30, 0x5b, 0x94, 0x46, - 0xe3, 0xe1, 0xc7, 0xa4, 0x3b, 0x39, 0x8f, 0xd3, 0xa4, 0xd7, 0x1f, 0x47, 0xbb, 0xb2, 0x6a, 0x7e, 0x06, 0x5e, 0xff, 0x42, 0x3f, 0x24, 0x76, 0x25, 0xec, 0x90, 0x3a, 0xf0, 0xa3, 0xa8, 0x86, 0x3f, - 0xb2, 0xbc, 0x87, 0x0a, 0x33, 0x75, 0x4e, 0x24, 0xf6, 0xa8, 0x70, 0x87, 0xf8, 0x53, 0xd2, 0x9d, 0x1a, 0xb9, 0xdd, 0x5e, 0x60, 0x56, 0xee, 0xcc, 0xaf, 0x7a, 0x3d, 0xf0, 0x3a, 0x73, 0xca, 0xf2, - 0x9a, 0xa7, 0x7f, 0x01, 0xc9, 0xa7, 0x7e, 0xaa, 0xf5, 0xdd, 0x19, 0xf9, 0x9f, 0xb5, 0xa7, 0x56, 0xc1, 0xcc, 0xd2, 0x98, 0x77, 0x92, 0x97, 0xe5, 0x10, 0x86, 0x9a, 0xbc, 0x26, 0x8c, 0x22, 0x5f, - 0xab, 0xf0, 0x0f, 0x68, 0x07, 0x5c, 0x59, 0xf2, 0xbd, 0x62, 0x6d, 0x86, 0x21, 0x69, 0xaa, 0xf5, 0x3a, 0x07, 0xc2, 0x5f, 0x0e, 0x8e, 0xd1, 0xa5, 0x95, 0xfb, 0x7b, 0x0f, 0x7c, 0xef, 0x05, 0xff, - 0x3b, 0xcf, 0x59, 0xf1, 0xbc, 0xdc, 0x7d, 0x38, 0x1e, 0xcb, 0xf6, 0x3a, 0x4f, 0x05, 0xbb, 0x9c, 0xd4, 0x91, 0x7a, 0x36, 0x33, 0x26, 0x70, 0x9f, 0xbf, 0xac, 0xcb, 0x30, 0xe3, 0x6c, 0x4e, 0x17, - 0xfb, 0x2c, 0x8d, 0x91, 0xe4, 0xf1, 0xee, 0xad, 0xd7, 0x35, 0xbb, 0x8d, 0xe2, 0x0b, 0x89, 0xb9, 0xb2, 0x93, 0x07, 0x85, 0xcc, 0x36, 0xe9, 0x76, 0xa1, 0x87, 0x05, 0xd9, 0x62, 0x9e, 0x3c, 0x54, - 0xc4, 0xac, 0x7b, 0xfa, 0x8e, 0x3a, 0xbd, 0x00, 0x7f, 0x25, 0x51, 0xc3, 0xef, 0x77, 0xc8, 0xb1, 0xa0, 0xa5, 0x8c, 0x7c, 0x08, 0x02, 0x7d, 0x70, 0xe0, 0xf8, 0x7b, 0x4d, 0x3b, 0x81, 0x9c, 0x9b, - 0x43, 0xfc, 0xf1, 0xf6, 0x7a, 0xda, 0x1d, 0x0e, 0x2e, 0xfa, 0x1f, 0xa6, 0x3b, 0xce, 0x51, 0x1a, 0xfd, 0xfb, 0xf9, 0xf5, 0x7f, 0x6b, 0x45, 0xde, 0x7b, 0x64, 0xb9, 0x35, 0xfc, 0xc7, 0xaf, 0xc9, - 0x08, 0x9e, 0x5f, 0x0f, 0x6c, 0x80, 0x9f, 0x8f, 0x49, 0x9a, 0x4c, 0x5c, 0xbe, 0x4c, 0x65, 0x49, 0x3e, 0x25, 0xd1, 0xcb, 0xf5, 0xcf, 0x62, 0x6c, 0x1c, 0x8f, 0x46, 0xc9, 0x78, 0xfa, 0x31, 0x1e, - 0x47, 0x5f, 0xf5, 0x7e, 0x63, 0x5f, 0x06, 0xf6, 0x4e, 0x6c, 0xbb, 0x5f, 0xe1, 0x17, 0x22, 0x0e, 0xe5, 0x5c, 0xc5, 0x37, 0x83, 0xee, 0x65, 0x32, 0x8e, 0xb8, 0x58, 0xd4, 0x4f, 0x4f, 0xc3, 0x12, - 0xd6, 0x2c, 0xa6, 0xb3, 0x75, 0xef, 0x8c, 0x6b, 0x42, 0x99, 0x77, 0xc0, 0x7f, 0x33, 0xbe, 0x8a, 0x7c, 0xfd, 0x7a, 0x95, 0x9d, 0xd3, 0x53, 0x81, 0x15, 0x77, 0xdc, 0x8d, 0x57, 0xac, 0x59, 0x38, - 0x3b, 0xd5, 0x5f, 0xed, 0xaa, 0x5d, 0x39, 0x75, 0x0a, 0x4e, 0x0f, 0x2c, 0x3c, 0x35, 0x6f, 0x95, 0xc3, 0xb5, 0xb6, 0x59, 0xb3, 0xb6, 0x7b, 0x17, 0xc3, 0xf1, 0x21, 0x28, 0x14, 0xbf, 0x47, 0x26, - 0xa3, 0xd7, 0xad, 0xb3, 0x1a, 0x1f, 0x06, 0x20, 0x31, 0xf4, 0x07, 0xdf, 0x00, 0xc8, 0xf3, 0x21, 0xaa, 0x04, 0xaf, 0x50, 0x28, 0x8a, 0xd2, 0x3f, 0x81, 0xde, 0x10, 0x8e, 0x3d, 0xdd, 0xed, 0x9b, - 0x42, 0x10, 0xc4, 0xba, 0x0a, 0x38, 0xc2, 0x1b, 0x51, 0xf8, 0xa0, 0x13, 0xd8, 0x0c, 0x45, 0x10, 0x9c, 0x7b, 0xfb, 0x4e, 0xce, 0x01, 0xdc, 0x5c, 0x45, 0x45, 0xc1, 0x37, 0x40, 0x56, 0x8a, 0x97, - 0x44, 0x51, 0xdd, 0xbc, 0x6c, 0x21, 0xe7, 0x1b, 0x56, 0xb7, 0xe9, 0xba, 0xf6, 0x3e, 0x49, 0x95, 0x6d, 0x38, 0x4c, 0x02, 0xda, 0x19, 0x32, 0x25, 0x74, 0x3f, 0x61, 0xda, 0x14, 0xdd, 0xff, 0x19, - 0x91, 0x12, 0x56, 0xf2, 0x80, 0x1f, 0x1c, 0xbf, 0x3e, 0x1f, 0xee, 0x0e, 0x90, 0xb6, 0xce, 0x57, 0x82, 0x2f, 0xe9, 0x8c, 0x2a, 0xdb, 0x01, 0x6a, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, 0x5b, 0xc8, - 0x89, 0x22, 0xe1, 0xfe, 0x12, 0x0e, 0x1a, 0x30, 0x0b, 0x5c, 0x04, 0x6c, 0xd3, 0x7c, 0x3b, 0xb8, 0x9b, 0xde, 0x26, 0xe3, 0xf3, 0x61, 0x5a, 0x37, 0x27, 0x4a, 0xac, 0xd0, 0x77, 0x34, 0xe6, 0x5d, - 0xa4, 0xef, 0x3a, 0x53, 0x8e, 0x0e, 0xc5, 0x18, 0x82, 0x13, 0xef, 0x04, 0xb0, 0x90, 0xb8, 0x97, 0xe9, 0xda, 0x57, 0x2d, 0x77, 0x9c, 0x8c, 0x86, 0x37, 0xe3, 0xab, 0x7d, 0xcf, 0xbc, 0x93, 0xf9, - 0x38, 0xcc, 0x8f, 0x18, 0xfe, 0x22, 0x6c, 0x59, 0x03, 0xff, 0xb4, 0xaf, 0x5d, 0xbe, 0x2a, 0x72, 0x76, 0xa4, 0x4c, 0xc1, 0x3f, 0xf4, 0xb9, 0x75, 0x90, 0x63, 0xaa, 0x20, 0x0c, 0xc3, 0x43, 0xe6, - 0x5e, 0x63, 0x5f, 0x67, 0xbb, 0xb3, 0x17, 0xa0, 0x3d, 0x73, 0x36, 0x99, 0x8f, 0x8a, 0x6f, 0x50, 0xc8, 0x25, 0x16, 0x05, 0xb4, 0xbb, 0xee, 0x49, 0xe4, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0x7a, 0xff, - 0xfa, 0x97, 0xff, 0xc3, 0x06, 0x67, 0x59, 0x41, 0xf5, 0xd5, 0x1c, 0x01, 0xc3, 0x4d, 0x9b, 0xcf, 0xcc, 0xf5, 0x9f, 0x6e, 0xa5, 0xc2, 0x32, 0x1c, 0xa0, 0x0a, 0xef, 0x70, 0xd6, 0x35, 0x14, 0xef, - 0x2c, 0x0b, 0x9d, 0xc3, 0x71, 0x5b, 0x87, 0xff, 0xf8, 0x57, 0xa9, 0x04, 0x65, 0x8b, 0xdf, 0x3a, 0x9d, 0xbe, 0x1c, 0xac, 0x8a, 0x62, 0x28, 0x92, 0xb2, 0x52, 0xdb, 0xe3, 0x23, 0x1b, 0x03, 0xdd, - 0x63, 0x0f, 0xe2, 0xeb, 0x24, 0x38, 0x3a, 0x81, 0xb6, 0xd6, 0xfa, 0x0d, 0xfa, 0x51, 0x9c, 0xa6, 0x77, 0xc3, 0x71, 0x2f, 0x38, 0x3a, 0x39, 0x39, 0x81, 0x27, 0x06, 0x86, 0x5d, 0x81, 0x39, 0x32, - 0x45, 0x49, 0x21, 0x5f, 0x34, 0x76, 0x80, 0x4a, 0xb7, 0x18, 0x7b, 0xd2, 0xa7, 0xc6, 0xb4, 0xe0, 0xa9, 0x3e, 0xe7, 0xda, 0x1f, 0xf6, 0xe3, 0x57, 0x2d, 0x29, 0x45, 0xb1, 0xa6, 0x19, 0x8e, 0x38, - 0x65, 0xea, 0x9a, 0x30, 0xb2, 0x40, 0xf1, 0x5b, 0xa7, 0x93, 0x62, 0xb6, 0x12, 0x54, 0x6d, 0x47, 0x82, 0x2b, 0x9e, 0xf1, 0x02, 0x22, 0x70, 0xd4, 0x87, 0xeb, 0x93, 0x6d, 0x85, 0xbf, 0x75, 0x3a, - 0x93, 0x42, 0xbe, 0x3e, 0x7b, 0x07, 0x0d, 0x27, 0xea, 0xc4, 0x5d, 0xd0, 0x02, 0x8f, 0x8f, 0x0e, 0x92, 0x66, 0x2c, 0x6b, 0xc2, 0xe0, 0xe8, 0xa4, 0x36, 0xeb, 0xcf, 0xa3, 0xeb, 0x82, 0x32, 0x2a, - 0x97, 0x98, 0x1f, 0x20, 0xe9, 0xd9, 0x83, 0xe5, 0xaa, 0x8e, 0x7e, 0xab, 0xe9, 0x73, 0xec, 0x8a, 0x8f, 0x2b, 0x46, 0xfd, 0x79, 0x3d, 0x32, 0xc3, 0xbc, 0x05, 0xa6, 0x27, 0xd6, 0x8f, 0x1c, 0x5d, - 0x36, 0xd2, 0xcb, 0xb8, 0x7d, 0xf6, 0xe6, 0x2d, 0xc8, 0x55, 0x59, 0x0f, 0x61, 0xae, 0x0f, 0x2a, 0x89, 0xa9, 0x44, 0xb4, 0x40, 0xaf, 0x79, 0x0c, 0xd3, 0xcb, 0x78, 0x7a, 0xf6, 0xe6, 0xed, 0x34, - 0xbd, 0xb9, 0x8e, 0x7c, 0xff, 0x9f, 0x53, 0x96, 0xd3, 0x25, 0x39, 0x7b, 0xf3, 0x36, 0x5d, 0x95, 0x87, 0xc5, 0xb9, 0x69, 0xae, 0x2d, 0xd2, 0xae, 0xc7, 0x09, 0x9e, 0xa1, 0x08, 0x4c, 0xd3, 0x79, - 0xfc, 0x8d, 0x53, 0xe7, 0xb2, 0xe4, 0xff, 0xb0, 0x24, 0x72, 0x09, 0x11, 0x1c, 0x7f, 0x40, 0xd5, 0xd6, 0x70, 0xb8, 0xd4, 0xbf, 0x3f, 0xfb, 0x07, 0x49, 0xfa, 0xec, 0x43, 0x3b, 0x2e, 0x16, 0x5c, - 0x50, 0xb5, 0x2c, 0x75, 0xc8, 0xcf, 0xde, 0xbc, 0x3d, 0x09, 0x35, 0x65, 0x38, 0xe1, 0x57, 0x5a, 0xc7, 0xb1, 0x01, 0x6f, 0x2d, 0xb4, 0x3f, 0x6f, 0x80, 0xaa, 0x69, 0xda, 0x11, 0xb4, 0x19, 0x82, - 0xd1, 0x79, 0xd2, 0xb4, 0x02, 0xe0, 0x4e, 0x50, 0x85, 0xed, 0xe1, 0x4a, 0x55, 0x2b, 0x05, 0x47, 0xee, 0x59, 0x74, 0x41, 0x68, 0x61, 0xe7, 0x5a, 0xbb, 0x9c, 0x1f, 0x26, 0xd7, 0x65, 0xbf, 0x65, - 0x9f, 0x24, 0x87, 0x7b, 0xa5, 0x19, 0xc3, 0xcf, 0xd0, 0x8c, 0xbd, 0x05, 0x2f, 0xa9, 0xc4, 0x3c, 0x3c, 0x7a, 0xf7, 0x15, 0xad, 0x7d, 0xb6, 0x46, 0xa9, 0xe8, 0x42, 0xeb, 0xe1, 0x42, 0x67, 0x1e, - 0x15, 0x3e, 0xba, 0x4e, 0xf4, 0x6d, 0xa8, 0x14, 0x96, 0x95, 0x02, 0x02, 0x59, 0x81, 0x84, 0xed, 0xb0, 0xfd, 0x0d, 0xe1, 0x73, 0x3b, 0xe3, 0xaf, 0xb4, 0x1b, 0x79, 0xd3, 0x60, 0x37, 0xe8, 0x34, - 0x4e, 0x00, 0x73, 0xf3, 0x6e, 0x4b, 0x67, 0xf0, 0xbc, 0x83, 0x3e, 0x3c, 0x46, 0x09, 0x38, 0x5c, 0x6d, 0x1f, 0xab, 0xc6, 0x07, 0xaa, 0xe0, 0x75, 0x73, 0xed, 0x8f, 0x83, 0xef, 0xf5, 0x49, 0x36, - 0x43, 0x84, 0xab, 0xe4, 0x36, 0xb9, 0x82, 0xd7, 0xd0, 0x78, 0xb4, 0xd5, 0x5d, 0xc0, 0x48, 0xf0, 0x35, 0xcd, 0x11, 0x08, 0xf8, 0x52, 0x11, 0x96, 0x13, 0x91, 0xd3, 0xff, 0xc3, 0xdc, 0x87, 0x0d, - 0xd9, 0x6a, 0x2b, 0x05, 0x2a, 0x41, 0x71, 0x6d, 0xed, 0xec, 0x5e, 0xf5, 0x81, 0x88, 0x85, 0xbb, 0xb0, 0x37, 0xb4, 0x70, 0xf7, 0xbd, 0xf9, 0x13, 0x8a, 0x19, 0xbe, 0xcc, 0xb8, 0x5a, 0xc2, 0x9d, - 0x19, 0x84, 0xd9, 0xe1, 0x36, 0xe3, 0xac, 0x5d, 0xff, 0x46, 0x33, 0x3b, 0xd2, 0x2d, 0x75, 0xd8, 0x78, 0x0a, 0x74, 0xaf, 0x7b, 0xd3, 0xab, 0xfe, 0x20, 0x99, 0xc6, 0xe3, 0x0f, 0x69, 0x14, 0xfc, - 0xe4, 0x79, 0xc1, 0x61, 0xcf, 0x19, 0x80, 0x76, 0xec, 0xa5, 0xfe, 0xd5, 0x6e, 0xee, 0x87, 0x98, 0x07, 0x0b, 0xbd, 0xe4, 0xfc, 0xe6, 0x43, 0x63, 0xb9, 0x9d, 0x15, 0x44, 0xca, 0x8a, 0xa8, 0xe5, - 0xa3, 0xa4, 0xeb, 0x4d, 0xbf, 0xdd, 0xb3, 0xcd, 0x61, 0xb9, 0x2a, 0x14, 0xbd, 0xe6, 0xf9, 0xaa, 0xc0, 0x91, 0x6d, 0x51, 0x7a, 0xf5, 0x33, 0x32, 0x7a, 0xe1, 0x19, 0x68, 0x95, 0x3e, 0xee, 0x5a, - 0x83, 0xda, 0x0e, 0x6b, 0x77, 0xe0, 0x26, 0x48, 0x2f, 0xe5, 0xa4, 0x7e, 0xa0, 0xe8, 0x96, 0xdc, 0x2c, 0x3c, 0x9a, 0x02, 0xbd, 0xb6, 0xbd, 0xfa, 0x93, 0x8e, 0xbf, 0x41, 0x12, 0xec, 0xbf, 0x07, - 0xde, 0x8b, 0xe3, 0xb7, 0xfd, 0xa3, 0xd5, 0x4d, 0x9f, 0xb8, 0x54, 0x4f, 0xa6, 0x6f, 0xfb, 0xf1, 0xd1, 0xdf, 0x37, 0x7e, 0xe3, 0x52, 0x7d, 0xc7, 0xfc, 0xad, 0xa6, 0xfa, 0x3e, 0x79, 0xdf, 0x1e, - 0xbf, 0xd5, 0x54, 0xbb, 0xe1, 0x9b, 0x76, 0xdf, 0xfa, 0x5f, 0x11, 0xfb, 0xa7, 0xb5, 0x7a, 0xf2, 0xa8, 0x8f, 0xd0, 0xd3, 0xf1, 0xfe, 0x7e, 0x84, 0x63, 0x06, 0xb6, 0x4f, 0xe6, 0xb5, 0x86, 0xca, - 0x84, 0x99, 0x33, 0xdf, 0xca, 0xf4, 0x9a, 0x54, 0x93, 0x64, 0x7c, 0xdd, 0x1f, 0xc4, 0x93, 0x44, 0x83, 0x7f, 0x47, 0x67, 0x8e, 0xf4, 0x61, 0x02, 0x75, 0x2c, 0x4f, 0xbb, 0x76, 0xe7, 0xf4, 0xfc, - 0x70, 0xf3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x68, 0x33, 0xee, 0xa3, 0xf6, 0x0a, 0x00, 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x57, 0x51, 0x6f, 0xdc, 0x28, 0x10, 0x7e, 0xdf, 0x5f, 0x61, 0x45, 0x79, 0x35, 0xec, 0x5e, 0xee, 0x74, 0x55, 0xc4, 0x51, 0xf5, - 0xe1, 0xaa, 0x8b, 0x94, 0xb4, 0x91, 0x92, 0xab, 0xee, 0x95, 0xe0, 0xb1, 0x97, 0xc4, 0x80, 0x0b, 0x78, 0xb3, 0xab, 0x68, 0xff, 0xfb, 0x09, 0xb0, 0xbd, 0xb6, 0xd7, 0x4e, 0xd2, 0x28, 0xed, 0x9b, - 0x99, 0xf9, 0x18, 0x86, 0x6f, 0x3e, 0xc3, 0x40, 0x3e, 0x6e, 0x65, 0x99, 0x6c, 0xc0, 0x58, 0xa1, 0xd5, 0x5f, 0x27, 0x2b, 0xb4, 0x3c, 0xf9, 0x48, 0x17, 0xa4, 0x32, 0xfa, 0x1e, 0xb8, 0x4b, 0xb6, - 0x56, 0x9c, 0x5b, 0xbe, 0x06, 0xc9, 0x2e, 0x35, 0x67, 0x2e, 0x60, 0xd6, 0xce, 0x55, 0xe7, 0x18, 0x4b, 0xb6, 0x01, 0x85, 0x58, 0xc5, 0xf8, 0x1a, 0x90, 0x36, 0x05, 0xbe, 0xfe, 0x7a, 0x85, 0x7f, - 0x47, 0x4b, 0xb4, 0x4c, 0x3c, 0xc2, 0x4e, 0x41, 0xb6, 0x36, 0x8b, 0xc6, 0x34, 0x00, 0xd1, 0xd6, 0x66, 0x27, 0xc9, 0x56, 0x96, 0xca, 0xbe, 0x22, 0xec, 0xc9, 0x22, 0x49, 0x92, 0x88, 0x3e, 0xdf, - 0x5a, 0xd1, 0xcd, 0x78, 0x7c, 0x7c, 0x44, 0x8f, 0x67, 0x01, 0xfb, 0xdb, 0x72, 0xb9, 0xc2, 0xff, 0x5d, 0x5d, 0xde, 0x84, 0x94, 0x53, 0xa1, 0xac, 0x63, 0x8a, 0xc3, 0x09, 0x5d, 0x24, 0x09, 0x91, - 0x3a, 0x83, 0xf2, 0x5b, 0xdc, 0x29, 0x0d, 0x11, 0x09, 0x1e, 0xd8, 0x3c, 0xa8, 0x30, 0xba, 0xae, 0x2e, 0x32, 0xaa, 0x4d, 0x81, 0x18, 0x97, 0x40, 0x70, 0x6b, 0xf1, 0x5e, 0x66, 0x9c, 0xc8, 0x19, - 0x77, 0x17, 0x19, 0xcd, 0x6b, 0xc5, 0x3d, 0x1f, 0x04, 0xf7, 0x8c, 0x1e, 0xd3, 0x70, 0x49, 0x57, 0x7e, 0x85, 0xf4, 0xe6, 0xcb, 0xa7, 0xeb, 0x9b, 0x7f, 0xbe, 0xde, 0x12, 0xbc, 0xe9, 0xad, 0x52, - 0x19, 0x5d, 0x81, 0x71, 0x02, 0x2c, 0x0d, 0x9b, 0x22, 0x5c, 0xcb, 0x4a, 0x94, 0x60, 0xd2, 0xaa, 0xac, 0x0b, 0xa1, 0x50, 0x0b, 0x3e, 0x43, 0x1f, 0xd0, 0x8a, 0xe0, 0x39, 0x77, 0x9c, 0x1c, 0x29, - 0x6b, 0x31, 0xc8, 0x40, 0x09, 0xcc, 0x02, 0x5d, 0xad, 0x08, 0x9e, 0x71, 0xc5, 0x79, 0x4d, 0x91, 0xd1, 0x5d, 0x2d, 0xca, 0x0c, 0x59, 0x5d, 0x1b, 0x0e, 0x7f, 0x2b, 0xae, 0x33, 0xa1, 0x0a, 0xfa, - 0xef, 0xed, 0xe7, 0xf4, 0x03, 0xc1, 0xcf, 0x62, 0x86, 0x61, 0x0c, 0x54, 0xda, 0x38, 0xa1, 0x0a, 0xa4, 0x6b, 0x57, 0xd5, 0x6e, 0x2e, 0xd4, 0x2c, 0x2e, 0x86, 0xfb, 0x5e, 0x33, 0xf3, 0x50, 0x5b, - 0x54, 0x95, 0xcc, 0xe5, 0xda, 0x48, 0xd4, 0xf2, 0x9b, 0x8a, 0x8c, 0x36, 0xce, 0xf4, 0x4e, 0x4b, 0x82, 0x9f, 0x45, 0xce, 0x04, 0x0b, 0xd5, 0xf4, 0x7e, 0xa1, 0xd1, 0xd8, 0x39, 0x11, 0xb1, 0x83, - 0xcf, 0x84, 0x3b, 0xd4, 0x69, 0x89, 0xce, 0xd0, 0x67, 0xa1, 0x58, 0x39, 0x11, 0x65, 0x58, 0x2e, 0xfb, 0x20, 0xaa, 0x8b, 0x5b, 0x4b, 0x9d, 0xa9, 0x81, 0xe0, 0x76, 0xd4, 0xf8, 0x6a, 0x03, 0xb9, - 0x30, 0x70, 0xac, 0x03, 0x2f, 0xa6, 0xab, 0x3f, 0x09, 0x9e, 0x43, 0x78, 0x59, 0xe1, 0xa1, 0xae, 0x48, 0x06, 0x15, 0xa8, 0x0c, 0x14, 0xdf, 0x5d, 0x31, 0xc5, 0x0a, 0x90, 0xa0, 0x5c, 0xb3, 0x50, - 0xe7, 0xea, 0x34, 0x38, 0xc0, 0xb7, 0xa6, 0xde, 0x1f, 0x71, 0xfa, 0x34, 0xcb, 0xce, 0x7e, 0xf0, 0x97, 0x34, 0xf3, 0x7a, 0xbf, 0xc5, 0xc4, 0xd4, 0x5e, 0xa9, 0xf6, 0xe3, 0x5f, 0xa8, 0x09, 0xd0, - 0xee, 0x6c, 0x62, 0x76, 0xe3, 0xda, 0x0f, 0xfe, 0xaa, 0x66, 0x9a, 0xdb, 0x55, 0x40, 0x2b, 0xaf, 0x8f, 0xf0, 0x75, 0x70, 0x58, 0xae, 0x2b, 0xa0, 0x42, 0x7a, 0xf5, 0x11, 0x1c, 0x47, 0xed, 0xce, - 0xf1, 0x78, 0xeb, 0x3d, 0x4b, 0xcb, 0x26, 0x9e, 0xa3, 0x73, 0x82, 0xcc, 0x09, 0x2a, 0x3b, 0x22, 0x0f, 0xca, 0x3b, 0xa2, 0xad, 0x4f, 0x5a, 0x2b, 0xf5, 0xbc, 0x56, 0xdf, 0x77, 0xe9, 0x83, 0x62, - 0x4e, 0x6c, 0x20, 0x85, 0x0d, 0x28, 0x67, 0x8f, 0x19, 0x9b, 0xd8, 0xc1, 0xfb, 0xa5, 0x60, 0x25, 0x2b, 0x4b, 0xb3, 0x83, 0x74, 0x0d, 0xac, 0x74, 0xeb, 0x5f, 0xbc, 0x3a, 0x33, 0xfc, 0x17, 0xaf, - 0x78, 0x5f, 0x2b, 0xe1, 0xfe, 0x98, 0x92, 0x65, 0x23, 0x22, 0x07, 0x76, 0x28, 0xa1, 0x1f, 0x4e, 0xc7, 0x80, 0x75, 0x29, 0xb3, 0xfe, 0x6f, 0xce, 0x9e, 0xcd, 0x69, 0x08, 0x7c, 0x7b, 0x46, 0x13, - 0x82, 0x0e, 0x67, 0x7a, 0x83, 0x8e, 0xa7, 0xc9, 0xe1, 0x28, 0x88, 0x63, 0xfa, 0xae, 0xc7, 0x40, 0x4b, 0x6f, 0xec, 0x00, 0xe2, 0x0a, 0xef, 0xfb, 0xef, 0xc3, 0xd6, 0x81, 0xf2, 0xb6, 0xf6, 0x74, - 0xed, 0x19, 0xfa, 0x28, 0xe0, 0xb5, 0x1b, 0x1a, 0xfb, 0xe6, 0xbe, 0xd5, 0xef, 0x5c, 0xb3, 0xd2, 0x0e, 0x6d, 0x8d, 0x95, 0x06, 0x06, 0x09, 0x0e, 0xdf, 0x93, 0x80, 0x02, 0x14, 0x18, 0xe6, 0x20, - 0xe5, 0x3a, 0x83, 0x57, 0x03, 0x53, 0x5f, 0x4d, 0x3b, 0x05, 0x8f, 0xb6, 0x61, 0xde, 0x78, 0x22, 0xf1, 0x9e, 0xf1, 0x50, 0x53, 0x3c, 0x2c, 0xea, 0x71, 0x8d, 0x7b, 0xa5, 0x88, 0x35, 0x1a, 0xf5, - 0x1d, 0x2f, 0x16, 0x6b, 0xa6, 0x4f, 0x99, 0xac, 0x15, 0xd7, 0x2a, 0x17, 0x45, 0x6d, 0xd8, 0x98, 0xf2, 0xae, 0x19, 0xfa, 0x64, 0x8a, 0x11, 0xef, 0x84, 0x99, 0x82, 0xa6, 0x15, 0x33, 0x4c, 0x82, - 0x03, 0x13, 0xce, 0xc1, 0x62, 0x48, 0xc6, 0xf4, 0x64, 0x6f, 0x9f, 0x58, 0xee, 0x0d, 0x94, 0x8c, 0xee, 0xdf, 0x17, 0x29, 0x99, 0xb9, 0xaf, 0x7f, 0x90, 0x12, 0xbb, 0xb3, 0x0e, 0xe4, 0x75, 0xbc, - 0xde, 0x77, 0xdf, 0x98, 0x11, 0xec, 0xae, 0x84, 0x31, 0x3b, 0xf7, 0x6c, 0xc3, 0x50, 0xed, 0x44, 0x89, 0x4a, 0x5d, 0x14, 0xbe, 0xc3, 0x92, 0xe1, 0xa2, 0x32, 0xa1, 0x9d, 0xbd, 0xbf, 0xd3, 0xd6, - 0x7a, 0x4f, 0x63, 0x44, 0x97, 0xba, 0x88, 0x17, 0x99, 0x21, 0x78, 0x7e, 0xea, 0x70, 0x89, 0xd8, 0x50, 0xae, 0xb5, 0x04, 0x7a, 0xfa, 0x74, 0x18, 0xec, 0xdb, 0x56, 0x33, 0x78, 0x06, 0x05, 0x79, - 0x31, 0xf5, 0xf7, 0xab, 0x4d, 0xce, 0x44, 0x69, 0x59, 0xfe, 0x53, 0x6a, 0xf3, 0x7e, 0x87, 0x86, 0x50, 0x0e, 0x8a, 0xb8, 0xd7, 0x34, 0x1e, 0xdb, 0xf3, 0xc7, 0xc2, 0x06, 0x8c, 0xc8, 0x77, 0xaf, - 0x3c, 0x09, 0x9e, 0x53, 0x50, 0xf2, 0x6a, 0x15, 0x05, 0x64, 0xec, 0x36, 0x90, 0x90, 0xac, 0x00, 0x54, 0x31, 0xb7, 0xa6, 0xa7, 0x4f, 0xc3, 0xa7, 0x40, 0x26, 0x0c, 0x70, 0xa7, 0xcd, 0x6e, 0x8f, - 0xc7, 0xae, 0xdc, 0xb7, 0xc1, 0x5f, 0x98, 0x84, 0x7d, 0x6a, 0x6a, 0xa5, 0xbc, 0xbc, 0x8e, 0xe3, 0x1d, 0xaf, 0xf9, 0xf3, 0xd5, 0x9b, 0xbc, 0x45, 0xc1, 0xc9, 0xeb, 0x54, 0x9c, 0xcc, 0x2b, 0x39, - 0xba, 0xde, 0x74, 0x4a, 0xb7, 0xa3, 0xa6, 0x03, 0xed, 0x6e, 0x6c, 0xff, 0xe8, 0xca, 0x45, 0x97, 0x40, 0x3b, 0xec, 0x82, 0x88, 0x8c, 0x46, 0xca, 0x09, 0x16, 0xbd, 0xb6, 0x82, 0x3b, 0xb1, 0x19, - 0xa5, 0xd6, 0xbe, 0x45, 0x77, 0x83, 0x6c, 0x15, 0x93, 0xd0, 0x45, 0x08, 0x83, 0x5e, 0xd2, 0xe3, 0x19, 0x04, 0x1f, 0x07, 0x3e, 0x7a, 0xe2, 0x06, 0x63, 0xfb, 0xd8, 0xc9, 0x59, 0x69, 0xc7, 0x6f, - 0x9f, 0x00, 0xe8, 0x6e, 0x7b, 0xc6, 0x1f, 0xbc, 0x54, 0x42, 0x0b, 0xdf, 0xe6, 0x31, 0xe9, 0x5c, 0x8c, 0xb2, 0x3a, 0xb4, 0xe0, 0xb8, 0x47, 0x4a, 0x37, 0xb0, 0x74, 0xd1, 0xbd, 0x44, 0xe9, 0xe2, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4a, 0x79, 0x94, 0xb6, 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, - 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x6c, 0x8f, 0xb1, 0x6e, 0xf3, 0x30, 0x0c, 0x84, 0x77, 0x3e, 0xc5, 0x8d, 0x89, 0x07, 0xfb, 0x01, 0xb2, 0xe4, 0x5f, 0x02, 0xfc, 0x05, 0x8a, 0xa2, 0x40, 0x3b, 0x74, - 0x54, 0x14, 0xda, 0x16, 0x62, 0x4b, 0xb2, 0x28, 0xb5, 0x35, 0x8a, 0xbc, 0x7b, 0x21, 0xd9, 0x4e, 0x96, 0x6a, 0x91, 0x44, 0xf2, 0xbe, 0xe3, 0x79, 0xa5, 0xaf, 0xaa, 0x63, 0xb4, 0xc9, 0xea, 0x68, - 0x9c, 0x95, 0x03, 0x91, 0x19, 0xbd, 0x0b, 0x11, 0xc6, 0xd5, 0x53, 0x52, 0xe1, 0x9a, 0xa4, 0x6e, 0x93, 0x9d, 0xe6, 0xfa, 0x94, 0xec, 0x74, 0x20, 0x6a, 0xaa, 0x8a, 0x50, 0xe1, 0xc3, 0xa5, 0x80, - 0xd3, 0x2a, 0x83, 0x1e, 0x94, 0x08, 0xa1, 0x6a, 0xc8, 0xa7, 0xf3, 0x60, 0xf4, 0x52, 0x78, 0xf4, 0x7f, 0x88, 0x00, 0xa0, 0x68, 0xf3, 0xa9, 0xf0, 0x2e, 0x8c, 0xd8, 0x33, 0x5e, 0x17, 0x8f, 0x3c, - 0x3a, 0xcd, 0xe0, 0xef, 0xc8, 0x56, 0xb2, 0xa2, 0x75, 0x01, 0xd9, 0x62, 0xdb, 0xac, 0xc6, 0x5b, 0x6f, 0xe4, 0xfe, 0x85, 0x98, 0xd1, 0x0f, 0x33, 0x58, 0xf7, 0x8e, 0x05, 0x26, 0x0a, 0x8c, 0xf5, - 0x29, 0x6e, 0xf8, 0xa3, 0x57, 0x41, 0x8d, 0x4b, 0x0d, 0x0a, 0x4f, 0xea, 0x53, 0xe1, 0xcc, 0xca, 0xde, 0xfb, 0x81, 0x63, 0x0a, 0xf6, 0x8f, 0x56, 0x53, 0xee, 0x63, 0xde, 0xa7, 0xbc, 0xd6, 0x40, - 0x2f, 0x29, 0x66, 0xd4, 0xe6, 0xbf, 0xfb, 0x5f, 0xc8, 0x85, 0xbf, 0xdf, 0xe2, 0x95, 0x88, 0x0d, 0xfe, 0x5d, 0x2e, 0x38, 0x27, 0x31, 0x96, 0x45, 0x30, 0xb8, 0xce, 0x68, 0xf4, 0x1c, 0xf8, 0x31, - 0xb3, 0x7a, 0x5b, 0xfe, 0x5a, 0xb1, 0xbb, 0xc2, 0xa9, 0x3b, 0x8e, 0xcf, 0x2c, 0xa2, 0x3a, 0xde, 0xed, 0xf7, 0x87, 0x32, 0x7e, 0x23, 0xba, 0xd1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, - 0x07, 0x08, 0x48, 0x0a, 0xe7, 0x07, 0xf9, 0x00, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, - 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x8e, 0x31, 0x0e, 0xc2, - 0x30, 0x0c, 0x45, 0xf7, 0x9c, 0xe2, 0x8f, 0xed, 0xc2, 0x05, 0x2a, 0x0e, 0xc0, 0xc0, 0xc4, 0x09, 0x42, 0x30, 0xc1, 0xa2, 0xa4, 0x51, 0xec, 0x74, 0xa9, 0x7a, 0x77, 0x54, 0x12, 0xa9, 0x54, 0x42, - 0x0c, 0xf5, 0xf8, 0xff, 0x7f, 0x4f, 0x8e, 0xd6, 0x3d, 0xad, 0x27, 0xdc, 0x73, 0x70, 0xca, 0x43, 0x90, 0xce, 0x98, 0x98, 0xaf, 0x3d, 0x3b, 0xb8, 0xde, 0x8a, 0xe0, 0x14, 0x62, 0x56, 0x4c, 0x06, - 0x00, 0x62, 0xe2, 0xd1, 0x2a, 0xe1, 0xa2, 0x89, 0x83, 0xc7, 0x8b, 0x44, 0xac, 0xa7, 0xce, 0x94, 0xb2, 0x50, 0x9f, 0x7d, 0xd3, 0x62, 0x9a, 0x7f, 0xc4, 0x5b, 0xb0, 0xad, 0xda, 0xe5, 0xf4, 0xc1, - 0x72, 0xa8, 0x39, 0x8e, 0xab, 0x7a, 0xe9, 0xb6, 0xa6, 0xea, 0xf0, 0xa4, 0xe7, 0x32, 0x6a, 0xbe, 0x3d, 0x89, 0x34, 0xa7, 0xf0, 0x8f, 0x1f, 0x07, 0xbe, 0x41, 0x56, 0x7a, 0xef, 0x4f, 0xb3, 0x79, - 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdd, 0x4f, 0x11, 0xc3, 0x8a, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, - 0x61, 0x76, 0x61, 0x9c, 0x8e, 0x31, 0x0e, 0xc2, 0x30, 0x0c, 0x45, 0xf7, 0x9c, 0xe2, 0x8f, 0xed, 0xc2, 0x05, 0x2a, 0x8e, 0x80, 0x18, 0x38, 0x41, 0x08, 0x26, 0x58, 0x94, 0x34, 0x8a, 0xed, 0x2e, - 0x55, 0xef, 0x8e, 0xaa, 0x54, 0x2a, 0x95, 0x10, 0x03, 0x1e, 0xff, 0xf7, 0x7b, 0xfa, 0xd9, 0x87, 0xa7, 0x8f, 0x84, 0xbb, 0xa5, 0xa0, 0x3c, 0x24, 0xe9, 0x9c, 0xcb, 0x76, 0xed, 0x39, 0x20, 0xf4, - 0x5e, 0x04, 0x67, 0xd3, 0x6c, 0x8a, 0xc9, 0x01, 0x40, 0x2e, 0x3c, 0x7a, 0x25, 0x5c, 0xb4, 0x70, 0x8a, 0x78, 0x91, 0x88, 0x8f, 0xd4, 0xb9, 0x5a, 0x56, 0xac, 0x02, 0x4d, 0x8b, 0x69, 0xfe, 0x96, - 0xef, 0xd1, 0x76, 0x15, 0x2f, 0xa7, 0x0f, 0x96, 0xc3, 0x9a, 0xe3, 0xb8, 0xc9, 0x97, 0x6e, 0xaf, 0x5a, 0x1d, 0x91, 0xf4, 0x54, 0x9f, 0x9a, 0x4f, 0x4f, 0x21, 0xb5, 0x92, 0x7e, 0xf1, 0xe3, 0xc0, - 0x37, 0xc8, 0x46, 0xff, 0xbb, 0x69, 0x76, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfa, 0x49, 0xd9, 0x7c, 0x8a, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, - 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, - 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, - 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x74, 0x8c, 0x41, 0xae, 0xc2, 0x30, 0x0c, 0x44, 0xf7, 0x39, 0x45, 0xa4, 0xae, 0x9b, 0x7f, 0x82, 0xac, - 0xfe, 0x49, 0x2c, 0x70, 0x48, 0x54, 0x63, 0xb7, 0x8e, 0x5d, 0x91, 0xdb, 0x23, 0x54, 0x51, 0x56, 0x5d, 0xbe, 0x99, 0x37, 0x33, 0xc5, 0x7f, 0xe1, 0xd2, 0x1e, 0xae, 0x60, 0x4d, 0x38, 0x96, 0x46, - 0x18, 0xa6, 0xb8, 0xe0, 0x88, 0x39, 0xee, 0x40, 0x8e, 0x61, 0x73, 0xd0, 0xc5, 0x7b, 0x2a, 0xce, 0xdb, 0x48, 0xf8, 0x5a, 0x45, 0x2d, 0x17, 0xe7, 0xdb, 0x67, 0x70, 0xb6, 0xfd, 0x09, 0x44, 0x3a, - 0x70, 0xae, 0x08, 0x64, 0x35, 0xa9, 0x88, 0xcd, 0x2b, 0x58, 0xcd, 0x7f, 0x47, 0x72, 0x69, 0x52, 0xdb, 0x91, 0xb1, 0xf7, 0xc3, 0xfe, 0xd2, 0xf5, 0x31, 0xc2, 0xbd, 0xfd, 0xfc, 0x13, 0xc3, 0x3b, - 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x83, 0x67, 0x54, 0xb9, 0x75, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, - 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, - 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x71, - 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, - 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x8c, 0x92, 0x4d, 0x6f, 0xdb, 0x30, 0x0c, 0x86, - 0xef, 0xfe, 0x15, 0x9c, 0x4e, 0x32, 0x90, 0xb1, 0x59, 0xb1, 0xd3, 0x8c, 0x01, 0x2d, 0x8a, 0x0d, 0xeb, 0xa1, 0x1b, 0x36, 0x04, 0x3b, 0xe5, 0xa2, 0xca, 0x9c, 0xa3, 0xd4, 0x91, 0x54, 0x91, 0xca, - 0x50, 0x04, 0xf9, 0xef, 0x83, 0xbf, 0xd2, 0x74, 0xc9, 0x3e, 0x74, 0x31, 0x61, 0x3e, 0x14, 0xdf, 0x97, 0x54, 0x34, 0xf6, 0xc1, 0x34, 0x04, 0x3f, 0xb2, 0xb7, 0xe2, 0x82, 0xe7, 0xaa, 0x28, 0xdc, - 0x26, 0x86, 0x24, 0xe0, 0x02, 0x3e, 0x66, 0x93, 0x1e, 0x32, 0xa3, 0x10, 0x0b, 0xae, 0xb3, 0x77, 0x82, 0x5f, 0x87, 0x5f, 0x0b, 0x62, 0xa9, 0x8e, 0xc8, 0x44, 0x2c, 0x86, 0x39, 0x27, 0xaa, 0xf1, - 0x1b, 0xb1, 0x5c, 0x0f, 0xf1, 0x01, 0x09, 0xa9, 0xc1, 0x95, 0xd9, 0xd8, 0x8e, 0xc3, 0x9b, 0x90, 0xe8, 0xce, 0x88, 0x5d, 0x51, 0xe2, 0x17, 0xc4, 0xd0, 0x62, 0x9d, 0xa3, 0x13, 0x4a, 0x68, 0xa2, - 0xc3, 0x6b, 0x66, 0x4a, 0xa3, 0xb0, 0xbf, 0x82, 0x83, 0xa0, 0x89, 0x61, 0x31, 0xe2, 0xec, 0xcb, 0xae, 0x53, 0x47, 0xa4, 0xc7, 0x6c, 0xda, 0x45, 0xa8, 0xfe, 0x0b, 0xf6, 0x41, 0x3e, 0xe7, 0xb6, - 0xfd, 0x6e, 0xda, 0x4c, 0x55, 0x51, 0x5c, 0x1d, 0xf9, 0x2f, 0x62, 0xbe, 0x6f, 0x9d, 0x05, 0xdb, 0x1a, 0x66, 0xf8, 0x38, 0x4e, 0xb0, 0xcb, 0xc0, 0xae, 0x28, 0x00, 0x00, 0xae, 0x7a, 0xac, 0x8b, - 0xb6, 0xc1, 0xd5, 0xd0, 0x8d, 0x71, 0xc2, 0x74, 0x09, 0xbb, 0x3e, 0xd3, 0x9d, 0x2f, 0x59, 0x62, 0x16, 0x08, 0xc3, 0xe7, 0x3d, 0x68, 0x4f, 0x3f, 0xe1, 0x99, 0x2c, 0x71, 0x5a, 0x4f, 0x9f, 0xb8, - 0xf5, 0x31, 0x8b, 0x56, 0x9f, 0xa8, 0x6d, 0xc3, 0x2b, 0x55, 0x96, 0xd5, 0xe1, 0x9e, 0xe7, 0x69, 0xa1, 0xe9, 0xc3, 0x0f, 0x9d, 0x55, 0x3e, 0xb0, 0xb3, 0xb1, 0x05, 0x36, 0x24, 0x77, 0xc4, 0x6c, - 0x1a, 0xd2, 0x53, 0xfd, 0xfe, 0x77, 0xc9, 0xa3, 0xbb, 0x13, 0xe5, 0xb7, 0x5e, 0xa8, 0x49, 0xe6, 0xc4, 0xc4, 0xd1, 0xda, 0xb1, 0x71, 0x5b, 0xf2, 0xba, 0x44, 0x1b, 0xbc, 0x90, 0x97, 0xc5, 0x53, - 0x24, 0xad, 0x4c, 0x8c, 0xad, 0xb3, 0x7d, 0xe1, 0xc5, 0x9a, 0x83, 0x57, 0xe5, 0xa1, 0x76, 0x3a, 0x78, 0x1f, 0xea, 0x27, 0xad, 0x76, 0x4b, 0xb5, 0x19, 0xe4, 0x2d, 0xd5, 0x3b, 0x58, 0x0e, 0xf2, - 0x97, 0x6a, 0x7f, 0xae, 0x62, 0x45, 0xa6, 0xa6, 0xa4, 0x95, 0xa5, 0xd7, 0xae, 0x56, 0x33, 0x50, 0x6f, 0x2f, 0xff, 0x81, 0x71, 0x24, 0xbb, 0xa5, 0xc4, 0x2e, 0xf8, 0x8e, 0x7f, 0x83, 0xf3, 0x73, - 0x05, 0x31, 0xb0, 0x68, 0x75, 0x71, 0x2e, 0x25, 0xab, 0xde, 0x5c, 0xf7, 0x6e, 0x32, 0xdf, 0x84, 0x9a, 0xf4, 0xe5, 0x7c, 0xfe, 0x47, 0x33, 0xa3, 0x13, 0x35, 0x83, 0xf1, 0xe1, 0x8d, 0xeb, 0x50, - 0x47, 0x93, 0xdf, 0x17, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe1, 0x2d, 0xc8, 0x7b, 0x92, 0x01, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, - 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x6c, 0x8e, 0x3b, 0x8e, 0x83, 0x40, 0x10, 0x44, 0xf3, 0x3e, 0x45, 0x9d, 0x60, 0x38, - 0x00, 0xc9, 0x26, 0xbb, 0x12, 0xc9, 0x4a, 0x96, 0xb8, 0xc0, 0x30, 0xb4, 0xf1, 0x18, 0xe8, 0xc1, 0x74, 0xb7, 0x85, 0x64, 0xf9, 0xee, 0x16, 0xfe, 0x64, 0x4e, 0x5f, 0xe9, 0x55, 0xd5, 0x12, 0xd3, - 0x18, 0x07, 0xc6, 0xd1, 0x25, 0x59, 0x2e, 0xa2, 0x35, 0x51, 0x9e, 0x97, 0xb2, 0x1a, 0x72, 0x09, 0x17, 0x8f, 0xeb, 0xe8, 0x1a, 0x8c, 0xd5, 0xc2, 0xd9, 0x25, 0x5b, 0x38, 0xbc, 0x50, 0x23, 0xc6, - 0xc3, 0x1a, 0x77, 0xa5, 0x65, 0xb5, 0x9a, 0xe8, 0xe7, 0x7b, 0x42, 0x8b, 0x77, 0x53, 0x4e, 0x48, 0x53, 0x54, 0xc5, 0x7f, 0xb4, 0x7c, 0xe5, 0xbf, 0xf7, 0x58, 0xd3, 0x82, 0x37, 0x63, 0xe9, 0x15, - 0x1f, 0xb4, 0x2b, 0xb8, 0x11, 0x01, 0x40, 0x55, 0xe1, 0x77, 0xe3, 0xe4, 0xc6, 0xb0, 0x13, 0x43, 0xe3, 0xcc, 0xd8, 0x9f, 0x28, 0x3a, 0x37, 0x64, 0x81, 0x3c, 0xdb, 0x30, 0x97, 0x9e, 0x03, 0xdd, - 0xe9, 0x11, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4a, 0xa2, 0x67, 0x39, 0x94, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x74, 0x90, 0xcd, 0x8a, 0xc2, 0x30, 0x14, 0x85, 0xf7, 0x3e, 0xc5, 0xc5, 0xe5, 0x40, 0x53, 0x98, 0xa5, 0xe0, 0x22, 0xda, 0x28, 0x01, 0xff, - 0xa8, 0x51, 0x98, 0x55, 0xb8, 0x6a, 0x2a, 0x6d, 0xd3, 0x4e, 0x26, 0x3f, 0x05, 0xdf, 0x7e, 0xa8, 0xd3, 0x0e, 0x95, 0xe9, 0x2c, 0x02, 0xe1, 0x9c, 0x9c, 0x7b, 0xbe, 0xdc, 0x4b, 0xc8, 0xf5, 0x8d, - 0xd5, 0x8d, 0x9b, 0x4d, 0x00, 0x22, 0xa8, 0xb1, 0x52, 0x33, 0x58, 0x1c, 0xe4, 0x8e, 0x0a, 0x7e, 0x66, 0x92, 0x6f, 0xe9, 0x9a, 0x4d, 0x00, 0x00, 0x1a, 0xd4, 0x41, 0xcd, 0x60, 0x9a, 0xa1, 0x76, - 0x6a, 0xfa, 0xfa, 0x78, 0x4b, 0xcf, 0x6c, 0x27, 0x17, 0x27, 0xbe, 0x11, 0x92, 0xa6, 0x82, 0xaf, 0xe8, 0x52, 0x0c, 0x43, 0x59, 0xa8, 0xaf, 0xe4, 0x81, 0x95, 0x06, 0x8f, 0xf6, 0xae, 0x7c, 0xfc, - 0x15, 0xd0, 0x96, 0xc1, 0x45, 0x68, 0x4c, 0xac, 0xf3, 0x4b, 0x3c, 0xa6, 0xbf, 0x91, 0x02, 0xed, 0x98, 0xd1, 0x9e, 0x31, 0xbd, 0xbb, 0xc7, 0xff, 0xb1, 0x25, 0x92, 0xa6, 0xeb, 0xd3, 0x96, 0xed, - 0xc4, 0x71, 0x08, 0x67, 0xf0, 0x5a, 0xe2, 0x5d, 0x41, 0x94, 0xb8, 0x32, 0x37, 0x42, 0x39, 0xef, 0xe6, 0xde, 0x86, 0x56, 0xa8, 0xb0, 0x51, 0x35, 0x29, 0xb0, 0xc1, 0xdb, 0xe7, 0x95, 0xb4, 0x76, - 0xef, 0x74, 0x5d, 0xa4, 0x0b, 0x13, 0xff, 0x30, 0x6a, 0x9e, 0xa1, 0xf3, 0x51, 0x81, 0x76, 0x00, 0xf0, 0xd3, 0x7e, 0x7c, 0xe7, 0xbf, 0x7b, 0x91, 0x09, 0x4f, 0x5f, 0xfa, 0xff, 0xfe, 0x64, 0x90, - 0x6f, 0x93, 0xc7, 0xfd, 0x29, 0x5d, 0x32, 0x99, 0xb0, 0xc3, 0x66, 0xff, 0xf1, 0xc4, 0x97, 0x2b, 0xbe, 0x11, 0x2c, 0x1d, 0x4e, 0xd1, 0xf9, 0x05, 0xfa, 0x11, 0x36, 0xd4, 0xcf, 0xdd, 0xa1, 0x31, - 0xbd, 0x36, 0xf9, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdb, 0xf9, 0xb9, 0xcb, 0xff, 0x00, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x2a, 0x49, 0x2c, 0x4a, 0x4f, 0x2d, 0xd1, 0xe7, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x72, - 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0xb4, 0xbd, 0x4d, 0x6f, 0x5c, 0x49, - 0xae, 0x26, 0xbc, 0xaf, 0x5f, 0x61, 0xd4, 0x5d, 0x5e, 0xcb, 0xcd, 0x60, 0x90, 0xc1, 0xe0, 0x0b, 0x5c, 0xe0, 0x05, 0x66, 0x35, 0xfb, 0xd9, 0x5d, 0x5c, 0x18, 0x24, 0x83, 0xb4, 0xd5, 0x25, 0x4b, - 0x1e, 0x7d, 0x54, 0x95, 0xfb, 0xd7, 0x0f, 0x4e, 0x4a, 0xb2, 0xa5, 0x54, 0xa6, 0x5c, 0xdd, 0x9d, 0x42, 0x2d, 0x2a, 0xf3, 0xe8, 0x48, 0x3e, 0x64, 0x30, 0xc8, 0x87, 0x4f, 0x90, 0x3c, 0xff, 0xf1, - 0xee, 0xff, 0x7c, 0x3e, 0xbf, 0x79, 0x57, 0xe7, 0x17, 0xf9, 0xee, 0xfc, 0xe6, 0x9d, 0xdd, 0xdd, 0x5e, 0x7d, 0xb1, 0xdb, 0xf3, 0xb0, 0x8b, 0x8b, 0x6f, 0xef, 0xfe, 0xff, 0x4f, 0x79, 0x99, 0xd7, - 0x76, 0x9b, 0xeb, 0x9d, 0x7f, 0x7b, 0xf7, 0xbf, 0xec, 0xfa, 0xd3, 0xd5, 0x87, 0x5f, 0xfe, 0xe3, 0xdd, 0xff, 0xbe, 0xdd, 0x6e, 0xbd, 0xbc, 0xba, 0x7d, 0x77, 0x7e, 0x79, 0x9b, 0x97, 0x2b, 0xd7, - 0xbb, 0xba, 0xba, 0x7e, 0xf7, 0xc5, 0x2e, 0xef, 0xec, 0xe2, 0x5d, 0xae, 0xf3, 0xdb, 0xf3, 0xcb, 0x4f, 0x1f, 0x7e, 0xf9, 0x3d, 0xaf, 0x6f, 0xce, 0xaf, 0x2e, 0xdf, 0xfd, 0xd7, 0xbb, 0xfe, 0xcb, - 0x2f, 0xff, 0xfd, 0xdf, 0x5f, 0x2d, 0x7e, 0xb3, 0x4f, 0xf9, 0x3f, 0xff, 0xf3, 0xcb, 0xa5, 0x7d, 0xc9, 0x77, 0xff, 0xf5, 0xee, 0x57, 0x8b, 0xdb, 0xf3, 0x3f, 0xcf, 0xe2, 0x6a, 0x65, 0xfc, 0xfa, - 0xe4, 0xee, 0x5f, 0xe1, 0x03, 0x7f, 0x80, 0x5f, 0x7f, 0xb9, 0xb9, 0xba, 0xbb, 0x8e, 0xdd, 0x8d, 0xd7, 0xf9, 0xe9, 0xfc, 0xe6, 0xf6, 0xfa, 0xdb, 0x7f, 0x7e, 0xbe, 0xbd, 0xfd, 0x7a, 0xf3, 0xff, - 0xfd, 0xed, 0x6f, 0x9f, 0xce, 0x6f, 0x3f, 0xdf, 0xf9, 0x87, 0xb8, 0xfa, 0xf2, 0xb7, 0xeb, 0xbb, 0x9b, 0xdb, 0xb3, 0x0b, 0xbb, 0xfc, 0xf4, 0xb7, 0xd8, 0x9e, 0xf4, 0xe6, 0xc3, 0xf9, 0xd5, 0xd9, - 0xf9, 0xe5, 0xca, 0x3f, 0x7f, 0xfd, 0x25, 0x3e, 0x67, 0xfc, 0x76, 0x73, 0xf7, 0x65, 0xfb, 0x13, 0x2c, 0x26, 0xcc, 0x4a, 0x40, 0x26, 0xd5, 0x59, 0x7a, 0x43, 0x31, 0x73, 0xee, 0x01, 0x33, 0xb2, - 0x8b, 0x8d, 0x18, 0xd6, 0x1b, 0x47, 0x17, 0xb2, 0xde, 0x40, 0xa0, 0x7a, 0x68, 0x8b, 0xd5, 0x7c, 0xfb, 0x8d, 0xfc, 0xf5, 0x97, 0x95, 0x5f, 0x37, 0x59, 0x2f, 0xe3, 0x3c, 0x6f, 0xde, 0xfd, 0xd7, - 0xbb, 0xff, 0xfe, 0xe5, 0xdd, 0xaf, 0x7e, 0x7e, 0x5b, 0x17, 0xf6, 0xe9, 0xe6, 0xd7, 0xf7, 0xdb, 0x97, 0x6f, 0xb7, 0x79, 0xff, 0xa9, 0xee, 0x6e, 0xef, 0xae, 0xf3, 0xe6, 0x2c, 0xae, 0xae, 0xf3, - 0xd9, 0x85, 0x9b, 0xf3, 0xcb, 0xdf, 0x76, 0x17, 0x2e, 0xae, 0x3e, 0xed, 0xfe, 0xff, 0x25, 0xbf, 0xc4, 0xe7, 0xeb, 0xdd, 0xc7, 0xaf, 0xe7, 0x97, 0x67, 0x5f, 0xaf, 0xaf, 0xfe, 0x9e, 0x71, 0x7b, - 0x76, 0x71, 0x7e, 0x7b, 0xff, 0x8b, 0xb7, 0x57, 0xbf, 0x9d, 0x5f, 0xfd, 0xf8, 0x74, 0x76, 0x77, 0x7b, 0x7e, 0xf1, 0xeb, 0xfb, 0x5f, 0xfe, 0xe7, 0x35, 0x7d, 0x6e, 0x3a, 0x7a, 0xa6, 0xce, 0xfe, - 0xa1, 0x7f, 0x68, 0x27, 0x56, 0x67, 0x20, 0x88, 0x22, 0x0d, 0xd6, 0x11, 0x6d, 0x3a, 0x59, 0xef, 0x89, 0x42, 0x96, 0x0d, 0x02, 0x92, 0x61, 0xb4, 0x5e, 0xb4, 0x3a, 0x1a, 0x35, 0x9d, 0x09, 0x1a, - 0xe2, 0xda, 0x45, 0x1a, 0xb4, 0x5e, 0xb9, 0x84, 0x0e, 0xaa, 0xf3, 0xa9, 0x3d, 0xbc, 0xff, 0xfe, 0xfd, 0xfa, 0xf6, 0xc9, 0x97, 0x9b, 0xbc, 0xfe, 0xfd, 0x3c, 0xf2, 0xc9, 0x95, 0x4d, 0x25, 0xf7, - 0x6a, 0xb7, 0xcf, 0x76, 0xf3, 0xf9, 0x1d, 0x7c, 0x98, 0x1f, 0xfa, 0xfd, 0x82, 0xd8, 0x4d, 0x0e, 0x7a, 0x07, 0x1f, 0xb0, 0x7d, 0x80, 0xfb, 0x2b, 0xcf, 0xd6, 0xeb, 0xfa, 0xea, 0xf6, 0xe2, 0x7c, - 0x6f, 0xe9, 0x76, 0x9f, 0x6e, 0xaf, 0xcf, 0x2f, 0xef, 0xd7, 0x67, 0xe5, 0xf5, 0xf9, 0xef, 0xf9, 0xf1, 0xcb, 0xe3, 0x42, 0xe6, 0x65, 0x5c, 0xad, 0xf3, 0xcb, 0x4f, 0x1f, 0xaf, 0x1f, 0x56, 0xfa, - 0xc2, 0x6e, 0x13, 0x0f, 0x2f, 0xfa, 0xe7, 0xfb, 0xeb, 0xbb, 0xe5, 0x78, 0xfc, 0x60, 0xd7, 0x37, 0xf9, 0xfd, 0xcb, 0xb2, 0x87, 0x55, 0x3e, 0xbf, 0xbd, 0xb2, 0x77, 0xed, 0x03, 0x7c, 0x18, 0xf7, - 0xc6, 0x61, 0x97, 0x9f, 0xee, 0xec, 0x53, 0x9e, 0xdd, 0x3e, 0x3e, 0xea, 0xc5, 0x55, 0xd8, 0xc5, 0x59, 0x7c, 0xb6, 0xcb, 0xcb, 0xbc, 0xb8, 0x37, 0x9c, 0xf3, 0x2f, 0xf7, 0xbf, 0xfb, 0x35, 0xaf, - 0x23, 0x2f, 0x6f, 0xcf, 0x1e, 0x9f, 0xec, 0xb8, 0x2d, 0x5d, 0xdb, 0xe5, 0xda, 0x7d, 0xb8, 0xf9, 0x6c, 0xed, 0xfe, 0xc3, 0x17, 0xbb, 0xb8, 0xf8, 0xfd, 0x41, 0xd9, 0x47, 0x4c, 0xed, 0xdd, 0xaf, - 0xb7, 0xd7, 0x16, 0x8f, 0x7f, 0xf8, 0x1f, 0x37, 0xb7, 0xeb, 0x67, 0xf6, 0xf7, 0xc5, 0xe2, 0xfa, 0xea, 0x66, 0x6f, 0x43, 0xe3, 0x87, 0x7e, 0x62, 0x0b, 0xa4, 0xc1, 0x36, 0x9a, 0x60, 0xd4, 0x50, - 0xd7, 0x01, 0xda, 0x64, 0xb6, 0x06, 0x88, 0x6b, 0x16, 0xaa, 0x07, 0xb8, 0x94, 0xb5, 0xae, 0xd3, 0x83, 0x4a, 0xa6, 0xf7, 0xa0, 0x31, 0x86, 0xf4, 0xe5, 0x0d, 0x5b, 0xf7, 0x71, 0xd0, 0x02, 0xff, - 0xef, 0xdd, 0xd5, 0x83, 0xb6, 0x6e, 0xbe, 0x5d, 0xee, 0x96, 0x44, 0xf0, 0x67, 0xf2, 0x5e, 0x5f, 0xdd, 0xdd, 0xe6, 0xf5, 0x0b, 0x07, 0x76, 0xea, 0x1d, 0xb7, 0xc6, 0xa8, 0xa2, 0x85, 0x24, 0x0b, - 0xbd, 0x0d, 0x98, 0xa3, 0x95, 0xe1, 0x1c, 0x83, 0x58, 0x72, 0xb2, 0xc0, 0x98, 0xbd, 0x33, 0xca, 0x24, 0x48, 0x6a, 0xbd, 0xd7, 0x2c, 0x52, 0x33, 0xc2, 0x6e, 0x7d, 0x8a, 0xea, 0x61, 0x07, 0xf6, - 0xdc, 0xdc, 0xbf, 0xdb, 0xea, 0x75, 0x7e, 0xca, 0x3f, 0xef, 0xf5, 0x90, 0xd7, 0x2b, 0xf7, 0xec, 0xe0, 0x75, 0x75, 0xdc, 0x3e, 0x53, 0x05, 0x7e, 0x98, 0x27, 0xf7, 0xe5, 0x8d, 0x71, 0xb0, 0x0f, - 0x9f, 0x89, 0x9d, 0x64, 0x08, 0xa4, 0xf7, 0xd1, 0x83, 0xa4, 0x62, 0x86, 0x30, 0xc2, 0xe6, 0x90, 0x48, 0x95, 0x1c, 0xa5, 0x29, 0x56, 0x27, 0xae, 0xf0, 0x14, 0x90, 0x09, 0x54, 0xfd, 0xb0, 0x2f, - 0x7f, 0x66, 0xbc, 0x07, 0x37, 0xf4, 0xe3, 0x0e, 0x79, 0x55, 0xfc, 0xcd, 0x41, 0xed, 0x59, 0x03, 0x7e, 0xc0, 0x93, 0xab, 0xa0, 0xe7, 0x1c, 0xad, 0x9b, 0xf0, 0x5a, 0x0c, 0x11, 0xc4, 0x45, 0xd2, - 0x23, 0xb3, 0x47, 0xa7, 0xc5, 0x9a, 0x6b, 0x88, 0x04, 0x94, 0x38, 0x11, 0x4d, 0x88, 0xec, 0x3e, 0x37, 0xcb, 0x91, 0x15, 0xdc, 0xb4, 0xa3, 0xbc, 0xa2, 0x82, 0xbf, 0xec, 0x6f, 0x8f, 0x86, 0xb9, - 0xef, 0xae, 0xe3, 0xcb, 0x83, 0x47, 0xb9, 0xbc, 0xfb, 0xf2, 0x31, 0xbe, 0xde, 0xdd, 0xff, 0xda, 0xcd, 0x55, 0xfc, 0x96, 0xb7, 0xb8, 0xef, 0x74, 0xfe, 0x9a, 0x75, 0x3d, 0x3e, 0xcf, 0x73, 0xfd, - 0xc2, 0x07, 0x3c, 0xb5, 0x7e, 0x7d, 0x2a, 0x29, 0xb5, 0x9a, 0x6d, 0x46, 0xad, 0x90, 0x88, 0x20, 0xd7, 0x1c, 0x50, 0x26, 0xc9, 0xdd, 0x19, 0x08, 0x0d, 0x73, 0xf2, 0x10, 0x14, 0x28, 0x6d, 0x24, - 0x8b, 0x59, 0xdb, 0xd4, 0xde, 0xa5, 0xdb, 0x41, 0xfd, 0xbe, 0x50, 0xd8, 0x57, 0xbb, 0x79, 0x70, 0x37, 0x07, 0x3c, 0xf6, 0xab, 0x7a, 0xb8, 0x5f, 0x85, 0xe7, 0x51, 0x1e, 0x4e, 0xee, 0x73, 0xe6, - 0xb4, 0xb6, 0x62, 0x55, 0x35, 0x1a, 0x23, 0x7b, 0x20, 0xcd, 0x99, 0x2d, 0x9c, 0xa3, 0x0f, 0x93, 0x36, 0x11, 0x85, 0xc1, 0x16, 0xf5, 0xd9, 0x55, 0xbb, 0xd4, 0xe4, 0x85, 0x45, 0x4b, 0x6b, 0xba, - 0x00, 0xaf, 0x79, 0x50, 0x0b, 0xf7, 0xc1, 0xec, 0x0f, 0xfb, 0x2d, 0x8f, 0x02, 0x9f, 0x57, 0x45, 0xff, 0x23, 0xfd, 0x99, 0xe0, 0xf4, 0x16, 0xf0, 0x66, 0xf5, 0x70, 0xc2, 0x52, 0x1e, 0xc3, 0xbc, - 0xc9, 0xc8, 0x96, 0x05, 0x3e, 0xbd, 0xdb, 0xd4, 0xc1, 0xa8, 0x30, 0xd0, 0x29, 0x2b, 0x86, 0x27, 0x34, 0xec, 0x40, 0x03, 0x94, 0xb5, 0x51, 0x50, 0xb4, 0xd0, 0xc3, 0xc1, 0xe5, 0x30, 0xbc, 0xf9, - 0xee, 0x73, 0x5f, 0x38, 0xa0, 0x67, 0xe1, 0xe5, 0xfd, 0xf1, 0xfd, 0xf9, 0xec, 0xa7, 0xaf, 0x02, 0xa4, 0x47, 0xfd, 0xed, 0x1e, 0xe2, 0x53, 0x5e, 0xde, 0x5f, 0x7d, 0x80, 0x4d, 0xf2, 0x00, 0x3f, - 0x8e, 0x82, 0xa1, 0xa8, 0x4f, 0x67, 0xe7, 0x75, 0xff, 0xf1, 0xea, 0xea, 0xb7, 0xf3, 0xfb, 0x7f, 0xe4, 0xa7, 0x10, 0xe9, 0xa7, 0x5e, 0xe2, 0xbb, 0x06, 0xfe, 0x02, 0x0e, 0x7a, 0x80, 0xcd, 0x8f, - 0xe8, 0xe7, 0xea, 0x32, 0xf2, 0x63, 0xe4, 0xc5, 0xc5, 0x31, 0x4b, 0x3a, 0x1c, 0xca, 0x76, 0x9f, 0x3e, 0xfe, 0xfd, 0xe6, 0xea, 0xf2, 0xc9, 0xd7, 0xbb, 0xeb, 0x8b, 0xdd, 0xb3, 0xe7, 0x03, 0x4a, - 0x7a, 0x0a, 0x8e, 0x9e, 0xf9, 0xac, 0xf3, 0x2f, 0xf9, 0x0e, 0x3e, 0xf4, 0x0f, 0x78, 0x0f, 0x2a, 0xef, 0xae, 0x7f, 0x0a, 0xc9, 0x9f, 0xaa, 0xfc, 0xb9, 0xe9, 0x9e, 0x3e, 0x32, 0x20, 0x0e, 0x6c, - 0x03, 0x4c, 0x2c, 0x51, 0xb3, 0x53, 0x63, 0x66, 0xb2, 0x5e, 0xad, 0x02, 0x28, 0x64, 0x90, 0x37, 0x26, 0x88, 0xd6, 0x86, 0x19, 0x23, 0x8d, 0xd9, 0x11, 0x26, 0xc8, 0xf4, 0x2d, 0x41, 0xf2, 0x38, - 0x8c, 0x13, 0x5e, 0x98, 0xe2, 0xd7, 0xeb, 0xab, 0xb8, 0xb7, 0xd5, 0x7b, 0xa5, 0xfc, 0x93, 0xc0, 0x69, 0x5d, 0xec, 0xc5, 0xc8, 0xf6, 0x06, 0x3e, 0xbc, 0x70, 0x20, 0xb4, 0x01, 0x14, 0x53, 0xbc, - 0x25, 0x34, 0x5f, 0x7d, 0xe9, 0xac, 0xb9, 0x78, 0xa9, 0xcd, 0x0a, 0xf7, 0xd9, 0x38, 0x67, 0xe4, 0x72, 0x6a, 0x55, 0x11, 0x9e, 0x4e, 0x5e, 0xac, 0xdd, 0x3a, 0x6f, 0x29, 0xdf, 0xe1, 0x87, 0xdf, - 0xf6, 0xcb, 0x1e, 0xdc, 0xdb, 0xf6, 0xce, 0x89, 0x1f, 0x3e, 0x9c, 0x9b, 0xc1, 0x50, 0x5e, 0xb3, 0x66, 0x9f, 0xde, 0x32, 0x01, 0xd4, 0x7b, 0x79, 0x8d, 0xe1, 0xcb, 0x40, 0x66, 0xac, 0x41, 0xac, - 0x80, 0x80, 0x36, 0x07, 0xd9, 0xac, 0x9e, 0x33, 0x68, 0x4b, 0x62, 0xe9, 0x70, 0x80, 0xff, 0x94, 0xb7, 0x5b, 0x16, 0x70, 0xf5, 0xe5, 0xc0, 0xe6, 0x79, 0x90, 0xe7, 0xe3, 0xee, 0x21, 0x5e, 0x59, - 0xba, 0x03, 0xd2, 0xcf, 0x93, 0x83, 0x7b, 0x0c, 0xd5, 0x1a, 0xb4, 0x5a, 0xc2, 0xa0, 0x39, 0x6b, 0x20, 0x94, 0x76, 0x1c, 0x22, 0x89, 0xe4, 0x31, 0x12, 0xa7, 0x0a, 0x4f, 0xd4, 0x09, 0x44, 0xcd, - 0x52, 0xc1, 0x86, 0x34, 0x6a, 0xec, 0x4b, 0x32, 0xb0, 0x0e, 0x4a, 0xff, 0xc4, 0x7f, 0x9d, 0x44, 0x11, 0x57, 0x9b, 0x4f, 0xb3, 0x9b, 0xf3, 0xf8, 0xed, 0x85, 0x35, 0xb4, 0x79, 0x62, 0x85, 0xb4, - 0xec, 0x12, 0xb5, 0x38, 0x65, 0xb0, 0xd8, 0x32, 0xe2, 0x12, 0xc2, 0x35, 0x52, 0x35, 0x8c, 0x65, 0x4e, 0x9e, 0xe0, 0x1c, 0x8c, 0xba, 0x42, 0x66, 0x59, 0xb5, 0x96, 0x91, 0x63, 0x85, 0x00, 0x0e, - 0x1e, 0x87, 0x15, 0xf2, 0x9d, 0x7d, 0x38, 0x26, 0xe2, 0xc5, 0xc5, 0x55, 0x9c, 0x5d, 0x5e, 0x9d, 0xdd, 0xdc, 0xae, 0x8b, 0x73, 0x7f, 0x01, 0xba, 0x4e, 0xbd, 0xea, 0x9d, 0x73, 0x83, 0xb1, 0x40, - 0x0a, 0xb6, 0x5a, 0x50, 0x5a, 0x72, 0x50, 0x47, 0x76, 0x34, 0xe5, 0x62, 0x6c, 0x0b, 0xb0, 0x27, 0xc7, 0x26, 0x2e, 0xf7, 0x2a, 0xb1, 0x30, 0xb0, 0x61, 0x6d, 0xf4, 0xb6, 0xbc, 0x1f, 0xdb, 0xb0, - 0x3b, 0x31, 0x0e, 0xc8, 0xb0, 0xa5, 0xa5, 0xa7, 0x46, 0x0e, 0x43, 0x25, 0x97, 0xe4, 0x0a, 0xa8, 0x26, 0xad, 0xad, 0x24, 0x8d, 0x6c, 0x30, 0x83, 0xa9, 0x0d, 0xec, 0x06, 0x56, 0x2a, 0x31, 0x62, - 0x80, 0x63, 0x8d, 0x44, 0x1f, 0x8c, 0xa8, 0x93, 0xc4, 0x62, 0x52, 0x0f, 0x3c, 0xec, 0x7e, 0xf7, 0x16, 0xe2, 0xf8, 0x8a, 0xdd, 0x7c, 0xbb, 0x8c, 0xb3, 0xdb, 0x6b, 0x3b, 0xbf, 0xdd, 0x93, 0xb4, - 0x7d, 0xe0, 0x53, 0x47, 0x1a, 0x70, 0x9d, 0x39, 0xc9, 0xdd, 0x29, 0x3c, 0xd6, 0x52, 0x59, 0xd6, 0x14, 0xdc, 0x20, 0x78, 0x5a, 0x73, 0x87, 0x95, 0x18, 0xad, 0x56, 0x0d, 0x59, 0x8d, 0x35, 0x9b, - 0x62, 0x2e, 0x19, 0xc3, 0x32, 0x4c, 0xf0, 0xb0, 0xa8, 0xff, 0x66, 0x60, 0xb9, 0xbb, 0xbd, 0x8a, 0xfa, 0xb4, 0x17, 0x5a, 0xda, 0xc9, 0x83, 0xec, 0xa2, 0x31, 0x27, 0xa0, 0x6f, 0xd8, 0x30, 0x3c, - 0x20, 0x82, 0x85, 0x53, 0x1d, 0xb8, 0x17, 0xb5, 0x14, 0x34, 0xeb, 0xc3, 0xcb, 0x86, 0x4b, 0x31, 0x67, 0x67, 0xd4, 0x2a, 0xa3, 0xde, 0x46, 0x73, 0x95, 0xb2, 0x23, 0x96, 0x7a, 0xcf, 0x58, 0xed, - 0xaf, 0xdc, 0xe9, 0xb9, 0x93, 0x4e, 0xd4, 0x6a, 0xcb, 0x0e, 0x01, 0x65, 0xce, 0x54, 0x9a, 0x49, 0x52, 0xc4, 0x12, 0x06, 0xad, 0xda, 0x92, 0x1c, 0x4b, 0x31, 0x86, 0x76, 0x8f, 0xd6, 0x31, 0x10, - 0x1d, 0xa6, 0xac, 0xde, 0xa8, 0x05, 0xf4, 0xaa, 0x7f, 0xe6, 0xf1, 0xf1, 0xf4, 0xda, 0x37, 0x32, 0x5a, 0xcb, 0x8c, 0x9b, 0xb1, 0x07, 0xa3, 0x0d, 0xa5, 0x59, 0x42, 0x01, 0x63, 0x21, 0x98, 0xd9, - 0x5a, 0xbe, 0x25, 0xfe, 0x94, 0xe6, 0xa2, 0x3e, 0x43, 0xc5, 0x66, 0x30, 0x8f, 0xd4, 0xcd, 0x67, 0x1e, 0xd5, 0xfe, 0x23, 0x3b, 0xf8, 0xdc, 0x7a, 0x4e, 0xef, 0x23, 0xa2, 0xda, 0x4a, 0xac, 0x9c, - 0xb1, 0x21, 0xae, 0x46, 0x6c, 0x58, 0x2c, 0x62, 0x6b, 0x29, 0x6f, 0x19, 0x67, 0xa7, 0x39, 0xd5, 0x49, 0x94, 0x17, 0x09, 0x8d, 0x61, 0x4c, 0xc6, 0x31, 0x69, 0xac, 0xa1, 0x6d, 0xe8, 0x31, 0x3f, - 0xe7, 0x17, 0x57, 0xf1, 0xdb, 0x99, 0xdf, 0x55, 0xbd, 0xa0, 0xa3, 0x1a, 0x7c, 0xa0, 0x13, 0x0b, 0xd1, 0x37, 0x00, 0x22, 0x03, 0xd5, 0x07, 0xae, 0x5e, 0x40, 0x5d, 0xb9, 0x49, 0x59, 0x57, 0x52, - 0x1d, 0x16, 0x16, 0xc1, 0xe1, 0xa1, 0x2d, 0xd8, 0x10, 0xd6, 0x8c, 0xc1, 0x33, 0x45, 0xcc, 0x17, 0x43, 0x37, 0x69, 0x47, 0x00, 0xca, 0x65, 0x5e, 0x9f, 0xc7, 0x99, 0x5d, 0x5f, 0xdb, 0xb7, 0xe3, - 0xdb, 0xfc, 0x81, 0xba, 0xdd, 0x27, 0xb9, 0x4f, 0x2d, 0xa2, 0x35, 0x03, 0x6f, 0xcb, 0x23, 0xe6, 0x06, 0xa6, 0x3b, 0xea, 0xc0, 0x56, 0x73, 0x51, 0xc1, 0x9a, 0x9d, 0x65, 0x4a, 0xb4, 0xe8, 0xd3, - 0xbd, 0x11, 0x34, 0x15, 0x75, 0xd2, 0xd5, 0xba, 0x83, 0x77, 0xe0, 0xaa, 0x71, 0x38, 0xfd, 0x7d, 0xe9, 0xcb, 0xf7, 0x22, 0xd4, 0xfb, 0xef, 0xdc, 0xf4, 0xd9, 0xca, 0xb8, 0xfa, 0xf2, 0xf5, 0x3a, - 0x6f, 0x6e, 0xae, 0x5e, 0x09, 0xd3, 0x87, 0x6e, 0x7e, 0x1e, 0xaa, 0xfb, 0xc9, 0xb1, 0x35, 0xab, 0x2d, 0x5c, 0x34, 0xb8, 0x7b, 0x71, 0x58, 0x1f, 0x96, 0xa2, 0xe2, 0xad, 0xc8, 0x9d, 0x96, 0xaf, - 0xe5, 0x03, 0x62, 0x8b, 0x7d, 0x46, 0x96, 0x6b, 0x1a, 0x46, 0xd2, 0x44, 0xad, 0x01, 0x84, 0xec, 0x13, 0xfe, 0x55, 0xd5, 0x1c, 0x53, 0xc1, 0xdd, 0x97, 0xaf, 0x76, 0x71, 0xb5, 0x67, 0x11, 0x72, - 0x72, 0xcf, 0xa3, 0xc1, 0x9a, 0x62, 0x05, 0x0d, 0x43, 0x5a, 0x2f, 0xc6, 0xed, 0x6b, 0xcf, 0x64, 0x89, 0x54, 0xef, 0x6d, 0xad, 0x35, 0x79, 0x2e, 0x72, 0x6e, 0xa8, 0xd8, 0x07, 0x60, 0x09, 0x0d, - 0x98, 0x0e, 0xa0, 0xa3, 0xb7, 0x63, 0x3b, 0x77, 0x97, 0x72, 0xef, 0xe7, 0x43, 0xa7, 0x76, 0x3b, 0x2e, 0xb0, 0xad, 0x49, 0x97, 0x01, 0xd4, 0x56, 0x2c, 0xb0, 0x8e, 0x52, 0x0b, 0x40, 0x25, 0xa8, - 0x81, 0xb2, 0x50, 0x0f, 0x8a, 0x69, 0x35, 0xe7, 0x14, 0x1c, 0xac, 0x84, 0x3b, 0x24, 0x09, 0xe0, 0x0b, 0x08, 0x5e, 0x7b, 0xf8, 0x7b, 0x96, 0x60, 0x5f, 0x82, 0x93, 0xab, 0x1f, 0x04, 0x86, 0x5b, - 0xd3, 0x54, 0x71, 0x05, 0x99, 0x23, 0x9b, 0xae, 0x80, 0xc5, 0x89, 0xe6, 0x6b, 0x02, 0xc0, 0x5c, 0xaa, 0x8b, 0x02, 0x82, 0x57, 0xb3, 0x05, 0xce, 0x29, 0x18, 0x19, 0x12, 0xa4, 0xb4, 0x8e, 0x73, - 0xe0, 0xc7, 0x4d, 0x2b, 0xe2, 0x85, 0x58, 0xa2, 0x27, 0x96, 0x8b, 0x61, 0x75, 0x50, 0x18, 0x38, 0x47, 0xc3, 0xb6, 0x94, 0x3d, 0xfb, 0xda, 0xfc, 0x7f, 0xef, 0x4e, 0x3c, 0x6b, 0x0a, 0x69, 0xf7, - 0x0e, 0x46, 0xce, 0x25, 0x6a, 0x03, 0x64, 0xf9, 0x2c, 0x5e, 0xad, 0x99, 0x69, 0x3b, 0x8c, 0xee, 0xff, 0x7e, 0xe5, 0xdf, 0xd9, 0xa1, 0x63, 0xb2, 0xdd, 0x67, 0x44, 0x6f, 0xbd, 0x6c, 0x6e, 0x5b, - 0xc0, 0xa3, 0xde, 0x55, 0x46, 0xe3, 0x39, 0x3d, 0x60, 0x34, 0xcd, 0xbe, 0x21, 0xa7, 0x86, 0x90, 0xc9, 0x13, 0xd3, 0x5d, 0xc8, 0xb9, 0x3b, 0x65, 0x79, 0x89, 0xb6, 0x26, 0xbe, 0x70, 0x19, 0x41, - 0xad, 0x23, 0x86, 0x17, 0x9f, 0xaf, 0xaf, 0x2e, 0xaf, 0xf6, 0x22, 0x1d, 0x7d, 0x68, 0xa7, 0x5e, 0x9d, 0x21, 0x60, 0x6b, 0xcc, 0x50, 0x98, 0x33, 0xd0, 0x74, 0x74, 0x33, 0x43, 0x9d, 0xe1, 0x7d, - 0xe8, 0x98, 0x33, 0xaa, 0x97, 0xd2, 0xe0, 0x48, 0x4e, 0x5c, 0x14, 0xd6, 0x20, 0xc7, 0x96, 0xac, 0x4f, 0x6b, 0x91, 0xd2, 0x0f, 0xb3, 0xa0, 0xe7, 0x7e, 0x4f, 0x2d, 0x5d, 0xde, 0x7d, 0x39, 0x3b, - 0xbf, 0xbc, 0xcd, 0x4f, 0x0f, 0xcc, 0xca, 0xf6, 0x7d, 0x07, 0xe0, 0x6f, 0xf6, 0x48, 0xab, 0x07, 0xde, 0xa9, 0x7d, 0xa0, 0xfb, 0xe3, 0xcd, 0x3f, 0xce, 0x2f, 0xed, 0xeb, 0xf9, 0x2b, 0x8b, 0x7b, - 0x71, 0x75, 0xb7, 0xf2, 0xf7, 0xbc, 0xbc, 0xbd, 0x39, 0xbb, 0x59, 0x2f, 0x73, 0xd4, 0x53, 0xaf, 0xf2, 0x84, 0x26, 0x6d, 0x43, 0x05, 0xdc, 0xa6, 0x39, 0xf0, 0x92, 0x90, 0xc9, 0x30, 0xa3, 0x51, - 0x14, 0x73, 0x93, 0x6e, 0x8d, 0xac, 0xd9, 0xd8, 0x39, 0x96, 0xb6, 0x7a, 0x67, 0x0c, 0x64, 0x19, 0x36, 0xda, 0x10, 0x3f, 0x6c, 0xc4, 0x07, 0x39, 0xd2, 0x3f, 0xf2, 0x21, 0x36, 0x3c, 0xc9, 0x76, - 0xde, 0x3f, 0x3d, 0xf0, 0xdd, 0x41, 0xe6, 0xf7, 0xc7, 0x0f, 0xe8, 0x1f, 0x2c, 0xe7, 0xfd, 0x8e, 0xbe, 0xbc, 0xc8, 0x4f, 0x76, 0x9b, 0x67, 0x76, 0x7b, 0x7b, 0xbf, 0x00, 0x0f, 0xfc, 0xe4, 0xee, - 0xf3, 0xe7, 0xab, 0x9b, 0xdb, 0x4d, 0x9f, 0xf7, 0x5f, 0x1e, 0x9f, 0xe2, 0x38, 0x91, 0x78, 0x69, 0x75, 0xf7, 0x84, 0x14, 0x7c, 0xf7, 0xeb, 0xdd, 0xdd, 0xf9, 0x3d, 0x9d, 0xf8, 0x47, 0xfa, 0xd9, - 0xcd, 0xb7, 0xd7, 0xfc, 0xcc, 0xd5, 0xe5, 0xef, 0x79, 0x7d, 0xfb, 0x31, 0xec, 0x26, 0x5f, 0xd8, 0xf4, 0xa9, 0xd7, 0x6a, 0x20, 0xf1, 0x62, 0xb5, 0x9e, 0x13, 0x4d, 0x2a, 0xb0, 0x49, 0xf0, 0xc4, - 0x69, 0x63, 0x28, 0x2e, 0x8f, 0xb1, 0xca, 0x47, 0x37, 0x88, 0xcd, 0xea, 0x49, 0x79, 0xc3, 0x3d, 0xe2, 0xba, 0x44, 0x05, 0xc8, 0xe0, 0x18, 0x35, 0xf6, 0x40, 0x0b, 0xef, 0x61, 0xcf, 0x71, 0x72, - 0xf4, 0x91, 0x93, 0x35, 0x16, 0xcb, 0x02, 0x69, 0xb0, 0x34, 0x61, 0x44, 0x9f, 0xcd, 0x99, 0x21, 0x60, 0xa4, 0x0c, 0x55, 0x24, 0x41, 0x9b, 0x31, 0x16, 0xa3, 0x58, 0xc6, 0xc2, 0x8a, 0x21, 0x7d, - 0x45, 0x60, 0x6f, 0xe5, 0x87, 0x33, 0xcf, 0x43, 0x27, 0xe9, 0xfb, 0x64, 0xef, 0x5f, 0x24, 0x87, 0xe2, 0xeb, 0x5d, 0xa5, 0xdd, 0xdb, 0xd1, 0x3e, 0xe3, 0x70, 0x6a, 0xa6, 0x10, 0x27, 0x98, 0x16, - 0xae, 0xe9, 0xdd, 0xfa, 0x9c, 0xd2, 0xac, 0xc7, 0x34, 0x1a, 0xe5, 0x13, 0x96, 0x0f, 0xce, 0xed, 0xbf, 0x5d, 0x72, 0x3e, 0x21, 0x68, 0xc1, 0xf4, 0x42, 0xd9, 0x96, 0x37, 0x3b, 0x67, 0x9b, 0x87, - 0x81, 0xf8, 0x83, 0x7b, 0x3a, 0x26, 0xde, 0x75, 0x74, 0x2c, 0xbb, 0xb9, 0x7d, 0xf3, 0x54, 0x69, 0xb6, 0xc6, 0xa3, 0x32, 0x72, 0x92, 0xf9, 0xd8, 0xe4, 0xb4, 0x5a, 0xde, 0x40, 0x23, 0xbb, 0x25, - 0x8b, 0x24, 0xa1, 0x37, 0xc4, 0x49, 0xd4, 0x72, 0xe5, 0x52, 0xf5, 0x25, 0x52, 0x03, 0xb7, 0xe0, 0xe9, 0xed, 0xf0, 0x39, 0xdc, 0x77, 0x22, 0xf0, 0xa8, 0x78, 0xdf, 0xbe, 0xde, 0x5e, 0x9d, 0xc5, - 0xd5, 0x97, 0x2f, 0x57, 0x97, 0x2f, 0x78, 0x94, 0x53, 0xaf, 0x5f, 0xf3, 0xf2, 0x86, 0x0c, 0x58, 0xbd, 0x82, 0x46, 0x84, 0x35, 0x77, 0x6e, 0x16, 0x38, 0x57, 0xe9, 0x1a, 0x6d, 0xae, 0xd9, 0x7a, - 0xac, 0xe8, 0x0b, 0x0b, 0xd9, 0xb5, 0x52, 0x84, 0xad, 0x93, 0x15, 0x0e, 0xf7, 0xc3, 0xe1, 0x65, 0x3f, 0x91, 0x7a, 0xf7, 0xeb, 0xed, 0xb7, 0xaf, 0x79, 0x79, 0xf7, 0xe5, 0xb8, 0xd4, 0xcf, 0x3d, - 0xe1, 0xbe, 0xd5, 0x9e, 0x3a, 0xa8, 0x66, 0x4a, 0x4a, 0x1a, 0x2c, 0x37, 0x02, 0x21, 0xd4, 0x35, 0xdb, 0xc8, 0x99, 0x7d, 0xae, 0x65, 0xcd, 0x68, 0x48, 0x2c, 0x21, 0xe9, 0x22, 0x88, 0x85, 0x11, - 0x31, 0xd3, 0x72, 0xcb, 0x1e, 0xd4, 0x9a, 0x75, 0x3b, 0xb2, 0x85, 0xff, 0x2d, 0xf2, 0xe8, 0xe9, 0x49, 0xd6, 0x73, 0xf1, 0x55, 0x3f, 0xb4, 0x53, 0x27, 0x97, 0x1c, 0x21, 0xae, 0x91, 0xd5, 0xb2, - 0x73, 0x1b, 0x03, 0x92, 0x89, 0xba, 0x22, 0x25, 0x15, 0x75, 0x73, 0xe4, 0x72, 0xcf, 0xd5, 0x53, 0x8d, 0x0b, 0x18, 0x57, 0xf5, 0x21, 0xb2, 0xd2, 0x69, 0x0d, 0xef, 0x78, 0x38, 0x83, 0x7a, 0x16, - 0x44, 0xde, 0xff, 0xfb, 0x1a, 0x39, 0xff, 0x94, 0x37, 0x2f, 0x98, 0x44, 0x38, 0xf9, 0x16, 0x98, 0x6d, 0xcc, 0x2e, 0xb3, 0x28, 0x19, 0xb0, 0xa7, 0x60, 0x9b, 0x31, 0x35, 0xa6, 0xb6, 0x80, 0x5a, - 0x33, 0x63, 0xf9, 0xe6, 0xc4, 0xa8, 0xda, 0x0c, 0x97, 0x59, 0x7d, 0x46, 0x6d, 0x11, 0x6c, 0x01, 0xb6, 0x94, 0x23, 0xec, 0xf6, 0x33, 0x3a, 0x64, 0x17, 0xf5, 0x9f, 0x6d, 0xeb, 0xe3, 0x42, 0x5f, - 0xc5, 0xee, 0x9e, 0xbc, 0xdc, 0x97, 0xbc, 0x9f, 0x9c, 0x88, 0xab, 0x34, 0x6a, 0xee, 0xd6, 0x71, 0xe9, 0x50, 0xe7, 0xd6, 0x55, 0x45, 0x18, 0xa5, 0xf3, 0x00, 0x06, 0x26, 0x0f, 0x58, 0x65, 0x8a, - 0x4e, 0xc1, 0xc3, 0xab, 0xb5, 0xa9, 0x85, 0xd9, 0x84, 0x3c, 0xc5, 0xda, 0xb1, 0x94, 0xec, 0xe9, 0x19, 0xec, 0xfe, 0x51, 0x0d, 0x9e, 0xfa, 0x68, 0x62, 0xc2, 0x2a, 0x40, 0x2a, 0x0f, 0xb6, 0x98, - 0x50, 0x53, 0x56, 0x65, 0xc1, 0xd2, 0x62, 0x04, 0x35, 0x64, 0x2c, 0x34, 0x52, 0x29, 0x29, 0x42, 0x25, 0x8a, 0x2a, 0xa4, 0x35, 0x91, 0x7b, 0x58, 0xc0, 0xe0, 0x7f, 0xc9, 0x45, 0xe7, 0xe5, 0xef, - 0x1f, 0x2f, 0xae, 0x3e, 0x7d, 0x3a, 0xc4, 0x74, 0x9d, 0x1a, 0x2c, 0x4d, 0x8e, 0xb5, 0x05, 0x9f, 0xa9, 0x16, 0x51, 0x63, 0x48, 0xef, 0xb6, 0xd8, 0xda, 0xd0, 0x6e, 0xb4, 0x22, 0x72, 0x0d, 0xcb, - 0xaa, 0x41, 0x03, 0xd0, 0x47, 0x27, 0xee, 0xb0, 0x96, 0xf4, 0x68, 0xd5, 0x33, 0xb5, 0x0e, 0xef, 0xd4, 0xcf, 0x77, 0x5f, 0xec, 0xf2, 0xf6, 0xf1, 0x1c, 0xfb, 0xfc, 0xe6, 0xec, 0x36, 0xaf, 0xbf, - 0x9c, 0x5f, 0xda, 0x3d, 0x6c, 0x7c, 0x3c, 0xe8, 0xfe, 0x71, 0x78, 0xbd, 0xfd, 0x38, 0xae, 0x2e, 0x5e, 0xe3, 0x81, 0xf2, 0xfa, 0xfa, 0x45, 0x3a, 0xd4, 0x4f, 0xae, 0x0d, 0x86, 0x35, 0x0c, 0x54, - 0x46, 0xe8, 0x96, 0x69, 0x4b, 0xaf, 0x9c, 0x6a, 0x6b, 0xce, 0xb9, 0xd8, 0x70, 0x52, 0x32, 0xf7, 0x31, 0x96, 0xae, 0x50, 0xe8, 0xd3, 0x9b, 0x1b, 0x9a, 0x35, 0x6e, 0x38, 0x83, 0xac, 0xec, 0xb0, - 0x36, 0x76, 0x8f, 0x7e, 0xb6, 0xae, 0xed, 0xd3, 0xd5, 0x65, 0x5d, 0xdc, 0x07, 0xac, 0xef, 0x19, 0xd2, 0x1f, 0xe7, 0x97, 0xeb, 0xea, 0x8f, 0x9b, 0xd7, 0xe1, 0xf3, 0xfe, 0x5f, 0xd8, 0x8f, 0xda, - 0xa7, 0x86, 0xa0, 0x66, 0x63, 0x56, 0xf3, 0x86, 0x32, 0xa8, 0xcc, 0xa7, 0xd2, 0x42, 0x61, 0x5e, 0xc8, 0x6d, 0x0a, 0x53, 0x4a, 0x73, 0xaa, 0x35, 0x21, 0xa3, 0x7c, 0x22, 0xca, 0x96, 0xfa, 0x20, - 0x8c, 0x40, 0x33, 0xef, 0x7a, 0x24, 0xdb, 0x89, 0x78, 0x2a, 0xf9, 0x11, 0x49, 0x1f, 0x6a, 0x4e, 0xf7, 0x93, 0x76, 0x3c, 0xf5, 0x42, 0xc7, 0xea, 0x96, 0xc1, 0x7d, 0x65, 0x83, 0x4a, 0x1d, 0x4b, - 0xd6, 0x0c, 0x1e, 0x9c, 0xde, 0xa4, 0x30, 0xc6, 0x14, 0x77, 0xde, 0x72, 0x3d, 0xcc, 0x20, 0xee, 0xce, 0x1b, 0x8a, 0x41, 0x1d, 0xc4, 0x38, 0xcc, 0xf3, 0x48, 0x80, 0x7a, 0x52, 0x43, 0xf2, 0x1d, - 0x44, 0x3e, 0x5b, 0xed, 0x2f, 0xe7, 0x97, 0xe7, 0xff, 0xf8, 0x78, 0xf5, 0xe7, 0xf9, 0x7a, 0xa5, 0x12, 0xa8, 0x2e, 0x7f, 0x7f, 0xc9, 0xca, 0x9c, 0x58, 0xfe, 0x5e, 0x9a, 0x19, 0xda, 0xe6, 0xea, - 0x85, 0x04, 0x43, 0x57, 0x86, 0xab, 0x55, 0x63, 0xa6, 0xb0, 0x25, 0x31, 0x27, 0x24, 0x2e, 0x43, 0x32, 0xb5, 0x5a, 0x73, 0x5a, 0x18, 0x00, 0x70, 0x6f, 0xe6, 0x13, 0xe3, 0x18, 0xd7, 0x57, 0x57, - 0xd7, 0x5f, 0x9e, 0xd6, 0x9a, 0xbc, 0x35, 0xeb, 0xc7, 0x15, 0xc8, 0x36, 0xa5, 0x8c, 0x6a, 0x21, 0x28, 0x79, 0x95, 0xc3, 0x50, 0xe4, 0xc9, 0x08, 0x9d, 0x96, 0x82, 0x35, 0x29, 0x58, 0x2d, 0x81, - 0x9b, 0xca, 0xda, 0xd2, 0xbd, 0xd5, 0x99, 0x59, 0x18, 0x9b, 0x1e, 0x4e, 0x0f, 0xbe, 0xd8, 0x6d, 0x7c, 0x7e, 0xc8, 0x91, 0x0f, 0xe4, 0x4d, 0xc7, 0x56, 0xed, 0xee, 0x32, 0x6e, 0xcf, 0x0f, 0x40, - 0xea, 0x23, 0x74, 0xf0, 0xa1, 0xdc, 0xff, 0x59, 0xf5, 0xd3, 0x23, 0x11, 0xb0, 0x4f, 0x75, 0xbc, 0xff, 0xe5, 0x59, 0x84, 0x38, 0xec, 0x51, 0xf7, 0x72, 0xf7, 0x9f, 0x54, 0x77, 0x3e, 0xb2, 0x02, - 0xfb, 0xee, 0xb5, 0xf1, 0x89, 0xd7, 0x0b, 0x52, 0x92, 0xba, 0x4d, 0xe8, 0xcb, 0x12, 0xcb, 0xba, 0x44, 0xab, 0x61, 0xb3, 0xb2, 0x61, 0xcb, 0x2d, 0x0d, 0x2f, 0x65, 0x9a, 0x4e, 0xab, 0x02, 0x18, - 0xd1, 0x08, 0xab, 0x53, 0x23, 0x5e, 0xb6, 0x2a, 0x8e, 0x54, 0x76, 0x7e, 0x2f, 0xc2, 0x7a, 0x52, 0x42, 0x7e, 0xb4, 0x30, 0x2b, 0xff, 0xcc, 0xb8, 0xbb, 0xbd, 0x7a, 0xc6, 0x86, 0x9c, 0x3d, 0x94, - 0x69, 0xbe, 0xe8, 0x64, 0x78, 0xbc, 0x70, 0x6b, 0x37, 0xcf, 0x2f, 0xbc, 0xde, 0xaa, 0xb0, 0xff, 0x40, 0xfb, 0x6a, 0x3d, 0x39, 0x4a, 0x51, 0xde, 0x7c, 0xd5, 0x22, 0x49, 0x50, 0x47, 0x76, 0x4f, - 0x0f, 0xb1, 0x36, 0x57, 0x35, 0xf0, 0xd9, 0x0a, 0x42, 0xc6, 0x48, 0x2b, 0x0a, 0xaa, 0x16, 0x11, 0x59, 0x58, 0x61, 0xbc, 0x41, 0x97, 0x72, 0xae, 0xc3, 0x87, 0xd5, 0x3f, 0x6b, 0xf4, 0xf8, 0x99, - 0xf0, 0x2f, 0x33, 0x8d, 0x37, 0x90, 0x9c, 0x3c, 0x8c, 0x67, 0x77, 0x49, 0x1c, 0xc5, 0xd2, 0x1a, 0x52, 0x25, 0xbb, 0xf0, 0x68, 0x8b, 0x34, 0x1c, 0xe7, 0x98, 0x4b, 0xb4, 0xb5, 0x11, 0x65, 0x90, - 0x59, 0x91, 0x9b, 0xb2, 0x58, 0x62, 0x54, 0xe6, 0x8c, 0x63, 0x7e, 0x6c, 0xdf, 0x5a, 0xde, 0x7c, 0x67, 0xb8, 0x2d, 0xb3, 0x61, 0x0a, 0x5a, 0x16, 0x9a, 0x82, 0x7d, 0x2c, 0x18, 0x08, 0xbb, 0xd3, - 0xd3, 0x92, 0x31, 0x68, 0x10, 0x6c, 0x11, 0x4a, 0xd8, 0xa5, 0x99, 0x30, 0x63, 0xf9, 0x1a, 0x73, 0xa5, 0x95, 0xb9, 0x1c, 0xae, 0x6c, 0x3b, 0xba, 0x84, 0xff, 0xa2, 0x41, 0x9f, 0xbf, 0x44, 0x60, - 0xa7, 0x5f, 0xd1, 0xaa, 0x12, 0x02, 0x1d, 0x29, 0x2d, 0x17, 0x49, 0xcd, 0x04, 0xec, 0x08, 0x14, 0xb5, 0xc0, 0xac, 0xe1, 0xd4, 0x58, 0x4c, 0x96, 0x4c, 0x1d, 0x4c, 0x19, 0xbb, 0x27, 0x0c, 0x88, - 0xe5, 0x93, 0x54, 0x07, 0xfd, 0x64, 0x45, 0x77, 0xe9, 0xe2, 0xdb, 0x4b, 0x31, 0x35, 0x8c, 0x89, 0x4d, 0x09, 0x46, 0xf3, 0xd1, 0x07, 0x17, 0x86, 0x74, 0x66, 0x27, 0xef, 0xe8, 0x0b, 0x61, 0x55, - 0xaf, 0x52, 0x2e, 0xc0, 0x65, 0xda, 0x51, 0xbd, 0x53, 0x44, 0x74, 0x5f, 0x23, 0x53, 0xfe, 0x95, 0xf2, 0x11, 0xdc, 0xe2, 0xeb, 0x2b, 0xf9, 0xee, 0xb3, 0xed, 0xfb, 0xe6, 0x0a, 0x28, 0xea, 0x9e, - 0x54, 0x89, 0xcd, 0x5a, 0x77, 0x95, 0xd9, 0x6c, 0xa8, 0x95, 0x91, 0x4e, 0x76, 0xa8, 0x91, 0x09, 0xd9, 0x36, 0xd3, 0xc5, 0x18, 0x45, 0x4c, 0x36, 0xa3, 0x3a, 0x24, 0x3a, 0x62, 0x17, 0x1f, 0xc7, - 0x48, 0xd8, 0x67, 0x06, 0xfc, 0xe6, 0x42, 0xc8, 0x58, 0x7d, 0xb5, 0x8e, 0x9e, 0x23, 0x20, 0xc7, 0x06, 0xf5, 0xfb, 0x06, 0x96, 0x42, 0x80, 0x4d, 0xc8, 0x58, 0x55, 0xac, 0xf3, 0x08, 0x58, 0x81, - 0x35, 0x87, 0x91, 0xc8, 0xe0, 0xe4, 0xd1, 0x24, 0xd8, 0xb7, 0xec, 0xef, 0x55, 0x21, 0x76, 0x9b, 0xee, 0xcd, 0x85, 0xc0, 0xe1, 0xd0, 0x92, 0xc0, 0x45, 0x70, 0x31, 0x45, 0x8d, 0x18, 0x4b, 0xb0, - 0x45, 0x5b, 0xcd, 0x7c, 0xc1, 0x20, 0x31, 0x68, 0x30, 0xac, 0x61, 0x86, 0x59, 0x8b, 0x36, 0x07, 0x4a, 0xef, 0x8a, 0x36, 0x94, 0xfb, 0x61, 0x0a, 0xee, 0x9f, 0x8a, 0xb9, 0x7b, 0xe1, 0xf5, 0x7e, - 0x0b, 0xfe, 0xb5, 0x80, 0xfb, 0xb3, 0x1e, 0xc2, 0xed, 0xe2, 0x8f, 0x1a, 0xf0, 0x9b, 0x0b, 0x7b, 0xe5, 0x1c, 0xfd, 0x39, 0x6d, 0xb8, 0x07, 0xd3, 0xe8, 0xe4, 0x05, 0x16, 0x0c, 0xbb, 0xc6, 0x82, - 0x88, 0x69, 0x1d, 0x56, 0x5b, 0xdd, 0xa5, 0x42, 0x11, 0xd5, 0x1b, 0xa2, 0x63, 0xe4, 0xcc, 0x35, 0x52, 0x97, 0x22, 0xf6, 0x6a, 0xad, 0xcf, 0x45, 0x6e, 0xee, 0xc8, 0x3d, 0xb9, 0xcd, 0x76, 0x18, - 0xeb, 0xfc, 0x20, 0x3a, 0xff, 0x32, 0x5d, 0xff, 0xa3, 0x1c, 0x74, 0x9f, 0xf6, 0x3c, 0xb5, 0xa5, 0x05, 0xb0, 0xa5, 0x0f, 0x43, 0xf4, 0x59, 0x03, 0x77, 0x95, 0xd8, 0x4a, 0x66, 0xa1, 0x13, 0x0a, - 0x5b, 0x63, 0x2b, 0x18, 0xe2, 0x95, 0x8d, 0x0d, 0xa4, 0xd3, 0x12, 0x14, 0x31, 0x19, 0x73, 0x75, 0x1d, 0xde, 0x0f, 0xa3, 0xf1, 0x27, 0x49, 0xd5, 0x8f, 0xa4, 0xd9, 0x6e, 0x5e, 0x39, 0x1b, 0xfc, - 0x8c, 0x2f, 0xc3, 0xf5, 0xa9, 0x49, 0x3d, 0xf6, 0x14, 0x67, 0xe2, 0xa9, 0xce, 0xb3, 0xd5, 0x40, 0x2a, 0x1e, 0xc3, 0x8b, 0xd7, 0x4c, 0xdf, 0x95, 0xce, 0x2d, 0x97, 0x3e, 0x82, 0x1b, 0xe3, 0x14, - 0x04, 0x1f, 0xbe, 0xfa, 0x70, 0x1d, 0xce, 0xac, 0xf8, 0x93, 0xc3, 0xfa, 0xfb, 0x14, 0xf0, 0xd5, 0x2d, 0xf5, 0x62, 0xc7, 0x1c, 0x68, 0x38, 0xd8, 0x9e, 0xfa, 0x8b, 0x7d, 0x7d, 0xba, 0x33, 0xfe, - 0x52, 0x27, 0xe4, 0x31, 0xb5, 0xda, 0xcd, 0x67, 0xbf, 0xbe, 0xfa, 0x63, 0x3f, 0xc3, 0xd1, 0x93, 0x67, 0x75, 0x4b, 0xac, 0x92, 0x8c, 0x10, 0xb2, 0x57, 0x8a, 0xea, 0x10, 0x03, 0x98, 0x3a, 0x23, - 0x5a, 0xd1, 0x72, 0x89, 0x69, 0xa4, 0xa6, 0xbd, 0x77, 0x43, 0xad, 0x69, 0xe4, 0x4b, 0x86, 0x21, 0xf7, 0xc5, 0xb1, 0xe0, 0x18, 0x04, 0xf8, 0x9c, 0xd7, 0x5f, 0xce, 0x6f, 0xcf, 0xcc, 0xcf, 0x5f, - 0xe4, 0x68, 0x27, 0x2f, 0x69, 0xee, 0x88, 0x45, 0x2b, 0x45, 0x94, 0x47, 0x22, 0xe6, 0x82, 0x64, 0xe8, 0x18, 0x9d, 0xd5, 0xa0, 0x1a, 0x4a, 0xaf, 0x56, 0x5b, 0x62, 0x2a, 0xea, 0x65, 0xdd, 0x67, - 0x95, 0x87, 0x74, 0x58, 0x52, 0x1e, 0xc1, 0xf1, 0x2f, 0x9c, 0x5b, 0x1d, 0x15, 0xef, 0xf4, 0x1d, 0x44, 0x95, 0x8b, 0x68, 0x4e, 0x08, 0x1a, 0x43, 0xfa, 0xc8, 0x52, 0xe3, 0x60, 0xe7, 0xb2, 0xc8, - 0x72, 0xce, 0x05, 0x32, 0x79, 0xc8, 0x58, 0x10, 0x80, 0x6b, 0x34, 0x5c, 0xde, 0x28, 0x79, 0x57, 0x5a, 0x46, 0x38, 0xc7, 0xb1, 0x05, 0x7a, 0x3c, 0x90, 0x7e, 0xeb, 0xe7, 0xef, 0x21, 0xbd, 0x45, - 0xcf, 0x06, 0x0c, 0x14, 0x31, 0x73, 0x75, 0x8e, 0x4a, 0xac, 0xb6, 0x9c, 0x42, 0x51, 0x28, 0xfa, 0xea, 0x5c, 0x46, 0x73, 0x64, 0xf7, 0xde, 0x56, 0xd1, 0x28, 0x18, 0x33, 0xab, 0xe7, 0x1c, 0x87, - 0x5d, 0xf3, 0x0f, 0x92, 0xc7, 0x6e, 0xe3, 0xf3, 0xc7, 0xa8, 0xfb, 0x9c, 0xfc, 0x67, 0x95, 0x0c, 0x9f, 0xf7, 0x3b, 0xda, 0xdf, 0xe2, 0x40, 0x6a, 0x43, 0x95, 0x55, 0xa1, 0x6a, 0xe5, 0xa3, 0x13, - 0xb2, 0x55, 0xa9, 0x03, 0xcf, 0x3e, 0x0a, 0x50, 0x75, 0xd7, 0x4c, 0xc3, 0x36, 0x1a, 0x4d, 0x6b, 0xe4, 0x92, 0xb1, 0xd8, 0x7c, 0x88, 0x95, 0x12, 0xd1, 0x3c, 0x0c, 0x47, 0x5f, 0xba, 0xab, 0x67, - 0x3d, 0x4e, 0xaf, 0xc8, 0xbb, 0xeb, 0x14, 0x7f, 0xce, 0x0d, 0x9d, 0xbe, 0x91, 0x76, 0x4d, 0x95, 0xea, 0x4a, 0x6e, 0x6b, 0x98, 0x00, 0x2f, 0x2e, 0x6a, 0x40, 0x32, 0x30, 0x5b, 0x1b, 0x26, 0x3c, - 0xba, 0x26, 0x09, 0xac, 0x09, 0x0a, 0x2d, 0x73, 0x01, 0xdb, 0x1c, 0x5b, 0x4a, 0x11, 0xde, 0xf4, 0xb8, 0x17, 0x79, 0x6c, 0x6e, 0x7f, 0xc1, 0x51, 0x9e, 0xf8, 0xf9, 0x83, 0xac, 0x65, 0x1f, 0x31, - 0xb1, 0x2d, 0x4f, 0x20, 0x16, 0xaa, 0x01, 0x38, 0xb7, 0x25, 0xd2, 0x12, 0xc2, 0xa2, 0xf2, 0x1e, 0x3a, 0x17, 0x01, 0x91, 0x56, 0x6b, 0x1e, 0xb6, 0xda, 0x5c, 0xc3, 0x9b, 0x10, 0x1e, 0xa3, 0xe8, - 0x7e, 0x70, 0xf3, 0x4f, 0x05, 0xc0, 0x37, 0xa8, 0x23, 0x57, 0xeb, 0xc6, 0x5e, 0xde, 0x94, 0xb5, 0xb7, 0x4c, 0xef, 0x7d, 0x38, 0x9a, 0x38, 0x2d, 0x19, 0x6d, 0x59, 0xc6, 0xa4, 0x5d, 0xc5, 0xb8, - 0x92, 0xac, 0x4e, 0x5d, 0x69, 0x40, 0x93, 0x2e, 0x26, 0xee, 0xc6, 0x79, 0x6c, 0x01, 0xce, 0xd7, 0xa5, 0xbd, 0xd8, 0x30, 0xa7, 0x3e, 0xbb, 0xa2, 0x36, 0x0d, 0x6c, 0x94, 0xf9, 0xc4, 0x46, 0xc2, - 0x35, 0x3a, 0x65, 0x65, 0x8f, 0x08, 0xe2, 0x80, 0xd6, 0xb7, 0x05, 0xc8, 0x4a, 0xe8, 0x6b, 0x72, 0xcf, 0xb9, 0x7a, 0x67, 0x5e, 0x1c, 0x3e, 0x19, 0x32, 0xea, 0x70, 0x75, 0xec, 0x53, 0x62, 0xf1, - 0xee, 0xf2, 0x3c, 0xae, 0x56, 0x9e, 0xf9, 0xf9, 0x3a, 0x7f, 0x76, 0xe1, 0xf2, 0xea, 0xfa, 0x8b, 0x5d, 0x9c, 0xff, 0xc3, 0x76, 0x64, 0xe2, 0xd1, 0x6d, 0xf4, 0x3d, 0xba, 0x3f, 0x37, 0xc3, 0xd3, - 0x97, 0xa3, 0x4c, 0xa4, 0x49, 0x6c, 0xe0, 0x35, 0x55, 0x4c, 0x81, 0xb0, 0xcf, 0x3e, 0x49, 0x1d, 0x30, 0x9a, 0x07, 0x36, 0x8d, 0xed, 0x8a, 0x08, 0x66, 0xc5, 0xe2, 0x18, 0xa5, 0x32, 0x46, 0x19, - 0xf9, 0x6c, 0x96, 0x75, 0x38, 0x7d, 0x78, 0x6c, 0x65, 0xd8, 0x01, 0x96, 0xef, 0xb8, 0xe2, 0xb8, 0xb0, 0x57, 0x67, 0x17, 0xe7, 0x95, 0x9b, 0xd5, 0xbe, 0xac, 0x24, 0x3d, 0xb5, 0xaf, 0x04, 0x45, - 0x81, 0x5a, 0x54, 0xd6, 0xda, 0xb6, 0xa7, 0x46, 0xa3, 0x5c, 0x88, 0x34, 0x42, 0xb2, 0x78, 0x60, 0x57, 0xeb, 0x30, 0xfa, 0x62, 0x4f, 0x58, 0x2d, 0xa3, 0x3b, 0x4f, 0x0d, 0x06, 0x5e, 0x04, 0x60, - 0x79, 0xf8, 0xf0, 0xfe, 0x47, 0x70, 0x7e, 0x77, 0x1f, 0xd0, 0xde, 0xff, 0xd3, 0x87, 0x40, 0x4f, 0x8f, 0xd1, 0x9e, 0x9b, 0x3f, 0x9d, 0xfc, 0xcc, 0x1a, 0x79, 0xdb, 0x8a, 0x25, 0xa4, 0xe6, 0xbd, - 0x35, 0x49, 0xed, 0x16, 0xae, 0x0d, 0x46, 0x07, 0xd0, 0x6c, 0xd5, 0xdc, 0x79, 0x2c, 0xe8, 0x3a, 0xd8, 0x1b, 0x05, 0xc6, 0x5c, 0x45, 0xb9, 0xd9, 0x04, 0x23, 0x1d, 0xe9, 0x8d, 0x3e, 0xa8, 0x83, - 0x67, 0x4b, 0xbb, 0x5d, 0xd8, 0x9e, 0xf0, 0xfc, 0xcf, 0x7f, 0x42, 0x2d, 0xb7, 0x57, 0xfb, 0xee, 0x80, 0x4e, 0x7e, 0x5c, 0xb2, 0x16, 0x32, 0xf4, 0x01, 0xd8, 0x1c, 0x56, 0xce, 0xcd, 0x37, 0x54, - 0x8d, 0x6d, 0xb3, 0x03, 0x37, 0x1e, 0x3d, 0x06, 0xb7, 0xb1, 0xc0, 0x8b, 0x7b, 0xcd, 0xd1, 0xa7, 0xf6, 0x99, 0xcb, 0x5d, 0x57, 0x4a, 0x47, 0xe9, 0xc7, 0x00, 0xcf, 0x8b, 0x67, 0xbf, 0x8f, 0x9d, - 0xa7, 0x7d, 0x76, 0xe2, 0x6e, 0x4b, 0x8b, 0x27, 0x1a, 0xd1, 0xe6, 0x8b, 0x93, 0x0b, 0x16, 0xcc, 0xb9, 0xad, 0x56, 0x02, 0x45, 0xe5, 0x5c, 0xdc, 0x6c, 0xa6, 0x15, 0x88, 0x54, 0x43, 0x8b, 0xb1, - 0x7a, 0x2a, 0xb5, 0x41, 0x61, 0xc7, 0x9e, 0xfd, 0x47, 0x05, 0xee, 0x8b, 0xd3, 0xc8, 0x53, 0x4b, 0xa0, 0x7d, 0x44, 0x2d, 0x6c, 0x68, 0xd0, 0x98, 0x15, 0xba, 0x87, 0x07, 0x0c, 0xc8, 0xde, 0x46, - 0xf9, 0x88, 0x90, 0xf0, 0xc2, 0x6c, 0x0a, 0xd2, 0x51, 0xbb, 0xb6, 0x74, 0x5b, 0xd1, 0x2a, 0x21, 0x52, 0xe4, 0x48, 0xdb, 0xd9, 0xeb, 0x60, 0xfa, 0xef, 0xf7, 0x56, 0xb7, 0x0f, 0x44, 0xf9, 0xd4, - 0x48, 0x74, 0x76, 0x5f, 0xe5, 0x16, 0xd9, 0x0d, 0x72, 0x36, 0x23, 0xe4, 0x5e, 0xd2, 0x9d, 0x34, 0x75, 0x80, 0x03, 0xf7, 0xec, 0x3a, 0xac, 0x35, 0x68, 0x18, 0xbe, 0x48, 0x5d, 0x5d, 0x68, 0x0d, - 0x43, 0x1f, 0x02, 0xe3, 0xb0, 0x68, 0x7f, 0xd8, 0xcd, 0x97, 0x33, 0x3f, 0xbf, 0x5c, 0xf7, 0x5d, 0xf0, 0x47, 0x44, 0xbc, 0x78, 0xd6, 0x81, 0xfe, 0x82, 0x86, 0x3a, 0xb1, 0xa0, 0x8b, 0x3a, 0xb1, - 0x0e, 0x72, 0x6f, 0xb4, 0x45, 0x94, 0x5d, 0x43, 0xc5, 0x68, 0x45, 0xd2, 0x8d, 0xa1, 0x1b, 0xf5, 0x5d, 0xba, 0xd4, 0x48, 0xd7, 0x9a, 0x21, 0x84, 0x22, 0x73, 0xc6, 0xc8, 0xd6, 0xbb, 0x68, 0x9f, - 0xf3, 0x88, 0x15, 0x5e, 0xd8, 0x3f, 0xbe, 0x7d, 0xbc, 0xb9, 0xb5, 0xdb, 0xf3, 0xfd, 0x4a, 0xf6, 0xd3, 0xd7, 0x95, 0x26, 0x9a, 0xdb, 0xc2, 0x5e, 0x1e, 0x84, 0xde, 0x05, 0xa0, 0xb0, 0x50, 0x74, - 0x12, 0xad, 0x98, 0x1d, 0x6d, 0x39, 0x3a, 0xa6, 0xc3, 0x50, 0xc7, 0x55, 0xda, 0x66, 0x11, 0x73, 0x50, 0xb6, 0x19, 0x31, 0xe8, 0xd8, 0x46, 0xda, 0x19, 0xe2, 0x3e, 0x9e, 0x69, 0x74, 0xea, 0xa7, - 0x57, 0x45, 0x94, 0xde, 0x49, 0xb1, 0x95, 0x65, 0x33, 0x15, 0x8d, 0x02, 0xaf, 0x55, 0x11, 0xc3, 0x7b, 0x72, 0x64, 0x97, 0x91, 0xc5, 0x92, 0xbb, 0x5d, 0x55, 0xde, 0xd3, 0x30, 0xd7, 0x00, 0xe5, - 0x9a, 0x70, 0xec, 0xa4, 0xe4, 0xe2, 0xfc, 0xf2, 0xee, 0xcf, 0xb3, 0x6b, 0xfb, 0xe3, 0xe0, 0x7e, 0x39, 0xf5, 0x76, 0x59, 0xac, 0x9b, 0x75, 0x30, 0x34, 0x9c, 0xdc, 0x17, 0xe6, 0x14, 0x2c, 0xe7, - 0xe1, 0x31, 0x0d, 0x93, 0xbb, 0xb4, 0x99, 0x18, 0x56, 0xd9, 0x8c, 0x62, 0x62, 0x6f, 0xb4, 0x6b, 0xeb, 0x1b, 0x4b, 0x21, 0xb6, 0x94, 0xfc, 0x98, 0x10, 0xcf, 0x46, 0x50, 0xed, 0xfb, 0xb3, 0x53, - 0x63, 0x4b, 0xa9, 0x0e, 0x3d, 0x03, 0x52, 0x29, 0x46, 0x30, 0x11, 0x49, 0x4d, 0xaa, 0xee, 0x90, 0x25, 0x56, 0x32, 0x74, 0xf2, 0x34, 0x0d, 0xda, 0xe0, 0x46, 0x16, 0x9a, 0xce, 0xb1, 0xfa, 0x8a, - 0x45, 0xd1, 0x2b, 0xf4, 0x30, 0x37, 0xf0, 0x2f, 0x30, 0x45, 0xcf, 0x67, 0x95, 0x1c, 0xf3, 0x12, 0x4f, 0x6e, 0x7a, 0x6b, 0xc5, 0x64, 0xa7, 0x92, 0x91, 0xde, 0x47, 0x6b, 0x4a, 0x90, 0x90, 0xb2, - 0xb8, 0x9b, 0x9a, 0x19, 0xe5, 0x6e, 0x80, 0x5d, 0xab, 0xa1, 0x4c, 0xcd, 0x70, 0x62, 0x2d, 0x58, 0xb6, 0x98, 0xa5, 0x11, 0x42, 0x70, 0xaf, 0x3a, 0x96, 0xf1, 0x5c, 0x5c, 0xc5, 0x6f, 0x1f, 0xb7, - 0x1c, 0x7c, 0x1f, 0x25, 0x9c, 0x1a, 0x39, 0x52, 0x67, 0x68, 0xad, 0x8f, 0x51, 0xc9, 0x83, 0x67, 0xf7, 0x36, 0xa2, 0x94, 0x47, 0xe9, 0x2a, 0x00, 0x65, 0x27, 0x60, 0x9f, 0xb8, 0x64, 0x10, 0xb2, - 0xc7, 0xd4, 0xd9, 0x02, 0x12, 0x31, 0x07, 0x64, 0xd0, 0x3a, 0xd2, 0x24, 0xf0, 0x04, 0x2a, 0xdf, 0xc4, 0xd5, 0xd7, 0xfc, 0x74, 0x67, 0xd7, 0xaf, 0xcc, 0x29, 0xbb, 0xb8, 0xfa, 0xf4, 0x42, 0xd0, - 0xd3, 0xd7, 0x77, 0x36, 0x57, 0xf7, 0x1c, 0x41, 0xb2, 0xb8, 0x55, 0xf4, 0xcd, 0xa1, 0xb8, 0x6e, 0x1e, 0x9e, 0x95, 0x86, 0x53, 0x10, 0x35, 0x42, 0xf3, 0x29, 0x8a, 0xc1, 0x30, 0x3b, 0x9b, 0x4e, - 0x58, 0x7d, 0x60, 0xa0, 0xb4, 0x9f, 0x94, 0xcf, 0x1c, 0x91, 0xec, 0x07, 0xaf, 0xb2, 0x6f, 0x88, 0xa7, 0xf6, 0x95, 0x55, 0x9e, 0x39, 0xb7, 0x94, 0x0f, 0x16, 0xf1, 0x42, 0x9e, 0x16, 0x4e, 0x34, - 0x53, 0xd2, 0xcc, 0x7b, 0x45, 0x8a, 0x81, 0xd1, 0x90, 0xae, 0xbc, 0x68, 0x69, 0x21, 0xce, 0xec, 0xd1, 0x0a, 0x5a, 0x39, 0x1e, 0xcd, 0x5c, 0x1f, 0xf3, 0xbf, 0xfd, 0xc7, 0x3f, 0x35, 0xf9, 0x28, - 0x55, 0xc1, 0xc1, 0xbd, 0x4f, 0x1a, 0xba, 0x68, 0xf5, 0xb4, 0x26, 0x0b, 0x87, 0xd6, 0x06, 0xf2, 0x3a, 0x37, 0xb4, 0x85, 0x24, 0x48, 0x12, 0x1d, 0x7c, 0xe1, 0xaa, 0xa1, 0x39, 0x66, 0x07, 0xcd, - 0x05, 0x06, 0xc7, 0x62, 0xed, 0xc3, 0x59, 0xcc, 0x73, 0xda, 0xe0, 0xf4, 0x61, 0xd6, 0xdb, 0xf0, 0x45, 0xb2, 0x34, 0x3b, 0x2a, 0x75, 0xce, 0x0e, 0x1a, 0xbc, 0x89, 0x52, 0x09, 0xa2, 0x2d, 0x70, - 0xc1, 0x6a, 0x6e, 0x3a, 0x32, 0x60, 0xf3, 0x06, 0x8c, 0xc6, 0x96, 0xe8, 0x40, 0x7d, 0xca, 0x3a, 0x16, 0xa8, 0xbe, 0xec, 0x53, 0x1e, 0x6f, 0x72, 0x2e, 0x80, 0x36, 0x20, 0x24, 0x92, 0xa1, 0x85, - 0xb4, 0x84, 0x6e, 0x1a, 0x1a, 0xb0, 0x3a, 0xfb, 0x1c, 0x8d, 0x5a, 0xb7, 0x54, 0x64, 0x5f, 0x5b, 0xf4, 0x0d, 0x31, 0xca, 0x0e, 0x0b, 0x06, 0xc0, 0xd8, 0x9c, 0x5c, 0xcc, 0x63, 0xdd, 0x60, 0x4f, - 0xeb, 0xc6, 0xf6, 0x37, 0xf7, 0xa9, 0xf7, 0xb6, 0x29, 0x72, 0x9b, 0xa9, 0x33, 0x40, 0x26, 0xcf, 0xe1, 0x31, 0x42, 0x3b, 0x01, 0x4e, 0x5b, 0x11, 0x46, 0xa1, 0x68, 0xdc, 0xd7, 0x30, 0xe5, 0xd9, - 0x74, 0xac, 0x9c, 0x9d, 0x9b, 0x80, 0x41, 0x5b, 0x93, 0x92, 0x0e, 0xe7, 0xbf, 0xf7, 0x43, 0x71, 0xde, 0x3f, 0xf3, 0x67, 0xc7, 0xb6, 0xf9, 0x8b, 0x2a, 0x83, 0x79, 0xf2, 0x9c, 0x88, 0x5d, 0x97, - 0x1a, 0x8d, 0xac, 0x62, 0xa7, 0xaa, 0x41, 0x4e, 0x6c, 0xba, 0x25, 0x14, 0x36, 0x56, 0x4b, 0xf0, 0x90, 0xa6, 0x59, 0x84, 0x1a, 0xbe, 0xf9, 0xe6, 0x18, 0x1d, 0xc6, 0x24, 0x6c, 0xb8, 0x21, 0xa6, - 0xc3, 0xd5, 0x16, 0xdf, 0xd3, 0xf9, 0xc7, 0x72, 0xac, 0x87, 0x63, 0xaa, 0xbf, 0x98, 0xc8, 0x3e, 0xed, 0x95, 0xdb, 0xf7, 0x10, 0x74, 0xea, 0x45, 0x5e, 0x18, 0x31, 0x74, 0xda, 0xe8, 0xce, 0xa4, - 0x26, 0xe0, 0x01, 0x24, 0x20, 0x7d, 0xa1, 0x92, 0x46, 0x24, 0x4a, 0xac, 0x16, 0xe2, 0x60, 0x64, 0x73, 0xe0, 0x82, 0x69, 0x13, 0x7a, 0xf3, 0xc0, 0x09, 0x6d, 0x1d, 0x59, 0xe4, 0x27, 0xa1, 0xea, - 0x59, 0xa7, 0xdf, 0x2b, 0x12, 0x3f, 0xdc, 0xf3, 0x12, 0xff, 0x9e, 0x58, 0x60, 0xb5, 0x41, 0xde, 0x32, 0x38, 0x96, 0x21, 0xcf, 0x91, 0x38, 0x49, 0x10, 0x69, 0x8e, 0x35, 0x01, 0x2d, 0xaa, 0x95, - 0x2c, 0x5f, 0x31, 0xb0, 0x27, 0x7a, 0x05, 0x4b, 0x0e, 0x0e, 0x6b, 0xb1, 0x40, 0x15, 0xf5, 0x48, 0x11, 0xdf, 0xcf, 0x6c, 0xf9, 0xfb, 0x6c, 0xc0, 0xe7, 0xb9, 0x49, 0x3b, 0x7d, 0xe5, 0x32, 0x30, - 0xa9, 0x56, 0x17, 0x1e, 0x43, 0x5a, 0x34, 0x9e, 0x93, 0x2b, 0x53, 0xa1, 0x13, 0xd1, 0xd8, 0x30, 0x48, 0x55, 0x2f, 0xa4, 0xbe, 0x06, 0x88, 0xb8, 0xb6, 0x64, 0x19, 0xb2, 0x6a, 0x4b, 0xc1, 0x64, - 0x8c, 0x23, 0x8d, 0x36, 0xcf, 0x18, 0x9b, 0xdd, 0x29, 0xd9, 0xfb, 0x9f, 0x66, 0xce, 0x3f, 0xe6, 0x0d, 0xed, 0xc9, 0x2c, 0x27, 0xcf, 0x06, 0x5c, 0x92, 0x19, 0x00, 0x55, 0xb3, 0x8d, 0xdc, 0x32, - 0x4b, 0xb1, 0xdd, 0xd9, 0x32, 0x98, 0x12, 0x5a, 0xe1, 0xa0, 0xa8, 0x3e, 0xe6, 0x2c, 0x12, 0xc5, 0xee, 0xb3, 0x02, 0x63, 0xf1, 0xe4, 0x59, 0xd8, 0x6d, 0x1d, 0x1b, 0x35, 0xf1, 0xd5, 0xae, 0x7f, - 0x3b, 0xbf, 0xfc, 0xf4, 0xf1, 0xe2, 0xea, 0x45, 0x77, 0xc8, 0xe9, 0x7b, 0xc0, 0xba, 0x10, 0x3a, 0x46, 0x83, 0xee, 0x5a, 0x30, 0x3c, 0xb4, 0xaa, 0xc0, 0xba, 0x54, 0x91, 0x36, 0xd4, 0xce, 0x93, - 0x9b, 0x67, 0x8e, 0xd5, 0x47, 0xf5, 0x00, 0xf4, 0x08, 0x61, 0xf6, 0xa8, 0x0c, 0xc4, 0x79, 0x18, 0x33, 0x7e, 0x47, 0xbc, 0xef, 0x7f, 0x79, 0x26, 0xce, 0xc7, 0x87, 0xec, 0xe0, 0xc8, 0xd2, 0xbd, - 0xb8, 0xf3, 0xb9, 0xf4, 0x7a, 0x72, 0x5a, 0x4d, 0x61, 0x68, 0xb8, 0x6b, 0xa9, 0x66, 0xb7, 0x0d, 0x26, 0x92, 0x8c, 0x08, 0x47, 0x8d, 0xf4, 0xb6, 0xb2, 0x4d, 0xd7, 0xd6, 0x66, 0x58, 0x19, 0xf7, - 0x54, 0x08, 0x65, 0x6e, 0xd8, 0x79, 0x25, 0xba, 0x32, 0xfe, 0xf5, 0x82, 0x81, 0xeb, 0x5c, 0x57, 0x7f, 0x7e, 0xbc, 0xf9, 0x76, 0x13, 0xf6, 0x30, 0x08, 0xeb, 0xd9, 0x04, 0xbc, 0xbf, 0xe4, 0x9f, - 0xef, 0xe7, 0x59, 0xee, 0xb3, 0x75, 0xed, 0xd4, 0x44, 0x89, 0x96, 0xd0, 0x08, 0x82, 0xc1, 0x36, 0xcb, 0x7a, 0x25, 0x76, 0x15, 0x5a, 0x6b, 0x62, 0x35, 0xa6, 0xde, 0x22, 0xe6, 0x22, 0x10, 0xd1, - 0x89, 0x0d, 0xa0, 0x11, 0xd0, 0x6a, 0xb0, 0x30, 0x45, 0xc3, 0x64, 0x89, 0x1e, 0x33, 0xea, 0xfd, 0x42, 0xe6, 0xb7, 0x3e, 0xfd, 0x59, 0x54, 0x8b, 0x07, 0xb5, 0x05, 0x2d, 0x66, 0xb5, 0x69, 0xd8, - 0x97, 0x89, 0x8f, 0x4a, 0x54, 0xd4, 0x59, 0x45, 0xce, 0x6c, 0x15, 0x11, 0xab, 0x64, 0xaa, 0x74, 0xc7, 0x6d, 0xb7, 0x36, 0xd9, 0xfc, 0x56, 0xc7, 0x63, 0x05, 0x60, 0x2f, 0xaa, 0x80, 0xf6, 0x23, - 0xc7, 0xa9, 0x93, 0xba, 0xdc, 0x4d, 0x1b, 0xec, 0x16, 0x58, 0xad, 0x49, 0x87, 0xc9, 0xab, 0xeb, 0xe4, 0xde, 0x42, 0x80, 0x85, 0x47, 0x28, 0x19, 0x05, 0x8f, 0x49, 0x5d, 0x26, 0xaf, 0x9a, 0xbc, - 0x41, 0xc0, 0x66, 0x60, 0x65, 0xd1, 0xda, 0x31, 0xd6, 0xe7, 0x47, 0xe1, 0xd2, 0x5b, 0x27, 0x33, 0xd3, 0xa7, 0xc0, 0x9a, 0xd1, 0xb8, 0xf9, 0x28, 0x2c, 0xd7, 0x9e, 0x93, 0xac, 0xf5, 0x46, 0xa3, - 0xf5, 0x59, 0xc0, 0x0b, 0x30, 0x57, 0x6b, 0x21, 0x29, 0xc1, 0x54, 0x73, 0xe2, 0x30, 0xb3, 0x92, 0xd0, 0x6a, 0xf3, 0x58, 0x32, 0xf3, 0xf5, 0xb7, 0x4f, 0x67, 0x71, 0x75, 0x59, 0xe7, 0xfb, 0xe9, - 0x58, 0x3f, 0x3d, 0x01, 0x3c, 0x2c, 0xd4, 0x58, 0x4b, 0x3a, 0x49, 0xaf, 0xe6, 0x73, 0x4d, 0x46, 0xc2, 0x96, 0xac, 0x39, 0x68, 0x82, 0x16, 0x20, 0xab, 0xd2, 0xec, 0x92, 0x25, 0xd4, 0x47, 0xe3, - 0x18, 0x0b, 0x82, 0xbd, 0x03, 0xb7, 0x71, 0xac, 0x93, 0xec, 0xeb, 0xd7, 0xdf, 0x77, 0x36, 0x34, 0xc7, 0x4b, 0xfc, 0x71, 0xea, 0x55, 0xb0, 0x10, 0x8a, 0x81, 0xb4, 0x86, 0xe3, 0xc2, 0x56, 0x84, - 0x5c, 0xc2, 0x88, 0x03, 0x8b, 0xb0, 0xcd, 0xd9, 0x07, 0x2f, 0xf1, 0x59, 0xd5, 0xac, 0x4a, 0x28, 0x26, 0x26, 0x71, 0xeb, 0x83, 0x1b, 0x18, 0x4d, 0x96, 0x63, 0x22, 0x3c, 0x29, 0x09, 0xdd, 0x77, - 0x4d, 0x7c, 0x6a, 0x0c, 0x95, 0x24, 0x68, 0x0d, 0x48, 0x54, 0x43, 0xc8, 0xb9, 0x91, 0xb1, 0x20, 0x8e, 0x36, 0xa0, 0x01, 0x99, 0xd1, 0xec, 0x4c, 0x63, 0x65, 0x97, 0x9c, 0x5d, 0x33, 0x18, 0xb2, - 0x07, 0x26, 0xb5, 0xb5, 0xa6, 0x70, 0x3f, 0x3c, 0x17, 0xff, 0xf1, 0xdc, 0xf3, 0x7c, 0xe5, 0xe5, 0xed, 0x71, 0xef, 0x7b, 0x5f, 0xeb, 0xba, 0x2f, 0xe2, 0xc9, 0x2d, 0x8d, 0x08, 0xc9, 0x8a, 0xbc, - 0x44, 0xa6, 0x59, 0x22, 0x70, 0x33, 0x11, 0x1f, 0x80, 0xb3, 0xf7, 0x8e, 0xd5, 0xe7, 0x60, 0x26, 0x64, 0x5e, 0x82, 0x88, 0xbd, 0x2f, 0xd0, 0xf2, 0x0a, 0xd9, 0xf2, 0x38, 0xc3, 0x3a, 0xcc, 0xcd, - 0x3d, 0xaf, 0xdb, 0x3d, 0x22, 0xe0, 0x6e, 0x82, 0xfd, 0x7e, 0xde, 0x73, 0xea, 0x2a, 0xf3, 0x4e, 0x56, 0x73, 0x35, 0x83, 0x44, 0x56, 0x24, 0x0f, 0x76, 0x09, 0xea, 0x01, 0xa2, 0xa1, 0x84, 0xbd, - 0xeb, 0x9a, 0x05, 0x36, 0x9d, 0x25, 0xba, 0x02, 0xa9, 0x67, 0xf1, 0x6c, 0x4e, 0xa3, 0xa3, 0x10, 0x1c, 0x5e, 0xc1, 0x1f, 0x51, 0xd6, 0x2e, 0xd7, 0xc7, 0xf8, 0x6c, 0xf1, 0xd9, 0x9e, 0x7c, 0x7f, - 0x15, 0x72, 0x3c, 0xfd, 0x95, 0xb7, 0x26, 0x8f, 0x73, 0x44, 0x03, 0x1b, 0xdd, 0xa0, 0xac, 0x23, 0x32, 0x7a, 0x92, 0x2e, 0x6c, 0x29, 0x02, 0xba, 0x68, 0x91, 0x6f, 0xca, 0xc1, 0xde, 0x02, 0x97, - 0x47, 0xb6, 0x34, 0x9b, 0x8d, 0x9a, 0xab, 0x37, 0x94, 0x35, 0x0f, 0x1f, 0x6a, 0x3e, 0xf1, 0x21, 0xff, 0x94, 0xc8, 0x2f, 0xe1, 0xd5, 0x38, 0x79, 0x26, 0x9f, 0x01, 0x9e, 0x24, 0xca, 0x89, 0x35, - 0x0c, 0x27, 0x0c, 0xf5, 0xed, 0x1a, 0x57, 0xf5, 0x44, 0x0b, 0x75, 0xab, 0x50, 0xcd, 0x61, 0x6a, 0xb2, 0xa2, 0xf3, 0xb6, 0xb3, 0x47, 0x70, 0xcc, 0x36, 0x14, 0xf1, 0xb0, 0x31, 0x3f, 0x9d, 0x2e, - 0x7a, 0x4c, 0xc2, 0x67, 0x68, 0x6b, 0xdf, 0xb5, 0x9e, 0x9c, 0xed, 0x22, 0x94, 0xae, 0x49, 0x2d, 0x16, 0x29, 0x35, 0x5a, 0x39, 0xa5, 0xa5, 0x71, 0x6e, 0x89, 0x6d, 0xb9, 0x24, 0x5a, 0xb7, 0x10, - 0x71, 0x9e, 0xea, 0xe1, 0xe9, 0x39, 0x63, 0x62, 0x99, 0x77, 0x69, 0x24, 0x47, 0xb6, 0xec, 0x93, 0xd9, 0x2a, 0x47, 0x85, 0xfc, 0xb4, 0x3d, 0xc9, 0x33, 0x87, 0x34, 0x4e, 0x1e, 0xbc, 0x29, 0x28, - 0xbd, 0xe3, 0x90, 0x26, 0xe4, 0x33, 0x46, 0x60, 0x0d, 0xa6, 0xd6, 0xc6, 0xc0, 0xae, 0x0d, 0x0c, 0x2a, 0x0b, 0x34, 0x48, 0xb8, 0xd7, 0x5c, 0x6b, 0xf6, 0xb5, 0x81, 0x67, 0x9a, 0x06, 0xab, 0x74, - 0xce, 0x23, 0x79, 0xfa, 0xd3, 0xe9, 0xae, 0xef, 0x9f, 0x57, 0x59, 0xef, 0xc4, 0x3a, 0xbb, 0xf9, 0x76, 0x79, 0x6b, 0x7f, 0xfe, 0x44, 0xf8, 0xc7, 0xbb, 0xf6, 0xcd, 0x18, 0x4f, 0x9d, 0x26, 0x58, - 0xaf, 0x29, 0x2e, 0x3d, 0xb2, 0x35, 0x6f, 0xa3, 0xa9, 0xf5, 0x18, 0x9b, 0x37, 0x26, 0xee, 0xd4, 0x12, 0x80, 0xa4, 0x49, 0x17, 0x69, 0x39, 0x7d, 0xba, 0xec, 0xee, 0xae, 0xcc, 0x72, 0x71, 0x1e, - 0x48, 0xc7, 0x10, 0xcc, 0xf5, 0x7d, 0xa5, 0xc1, 0x9e, 0xdb, 0x91, 0x93, 0x3b, 0x5d, 0x48, 0x99, 0x11, 0x8c, 0xdc, 0x91, 0x03, 0xc6, 0xee, 0x95, 0x3b, 0x05, 0xb8, 0x1c, 0xb7, 0x7c, 0x07, 0xb7, - 0xac, 0x8e, 0xd0, 0xb7, 0x6b, 0xd1, 0xb5, 0x95, 0x8e, 0x18, 0x8b, 0x2d, 0x46, 0x51, 0x69, 0x73, 0x39, 0xdc, 0x43, 0xfe, 0x6c, 0xf8, 0xcf, 0x7d, 0x73, 0xf4, 0xc1, 0x72, 0x8a, 0x1f, 0xa4, 0xd4, - 0xb3, 0x83, 0xba, 0xbf, 0x9c, 0xf5, 0x5c, 0x7f, 0xbb, 0x7b, 0x09, 0x2c, 0x4e, 0xac, 0x20, 0x69, 0xab, 0x43, 0x5b, 0xd4, 0xb4, 0x2f, 0xe8, 0xcd, 0x7c, 0x2d, 0xd1, 0x2a, 0xc9, 0xbe, 0x96, 0x60, - 0x6b, 0x63, 0x9a, 0xb2, 0x60, 0x56, 0xaf, 0xe4, 0x66, 0x8d, 0x9b, 0x98, 0x1b, 0x76, 0xf6, 0x35, 0x6b, 0x1e, 0xed, 0x15, 0x79, 0x72, 0x5a, 0xb2, 0x47, 0x45, 0x9c, 0x7c, 0x9b, 0x2e, 0x54, 0x73, - 0x88, 0xb1, 0x7a, 0x05, 0x64, 0x2a, 0x56, 0x8e, 0x91, 0xb8, 0x54, 0x4b, 0x00, 0xd2, 0xbc, 0x89, 0xcd, 0xc5, 0xb2, 0x5a, 0xec, 0x1a, 0x01, 0x68, 0xf6, 0x09, 0xe5, 0x08, 0x6e, 0x26, 0x33, 0x8e, - 0xd1, 0xbe, 0xf7, 0xb3, 0x98, 0x5e, 0xa6, 0x9c, 0xa7, 0x46, 0x3d, 0x19, 0xc2, 0xc0, 0xe6, 0x69, 0x61, 0x19, 0x42, 0x96, 0x24, 0x32, 0x97, 0x2e, 0xed, 0x38, 0x2b, 0xd9, 0x78, 0x01, 0x6d, 0xf6, - 0x8b, 0x60, 0x93, 0x83, 0x32, 0x61, 0x43, 0x3f, 0xba, 0x45, 0x8f, 0xb1, 0xe0, 0x30, 0x79, 0x74, 0xdf, 0x82, 0x7a, 0x3f, 0x77, 0xe4, 0xb8, 0x7d, 0x3d, 0xbb, 0xeb, 0xed, 0x25, 0xd5, 0xd1, 0x4d, - 0x96, 0x87, 0x4e, 0x65, 0x4b, 0x0b, 0xb1, 0x50, 0x48, 0xa1, 0xea, 0x64, 0xbc, 0x18, 0x47, 0x9b, 0x38, 0x4b, 0x74, 0x55, 0xe7, 0xf0, 0x5c, 0xd4, 0xb2, 0x41, 0x9b, 0xba, 0xfa, 0x04, 0x5a, 0x74, - 0x58, 0xd2, 0x7f, 0x6f, 0x0e, 0xc9, 0x93, 0x56, 0xdd, 0x7d, 0xf9, 0xc7, 0xa9, 0x11, 0x81, 0xa8, 0xa6, 0xca, 0x0a, 0xad, 0x65, 0xd9, 0x87, 0x71, 0x4c, 0x9f, 0x85, 0x61, 0xa9, 0x91, 0x98, 0xa9, - 0xb5, 0x62, 0x03, 0xbd, 0x33, 0x58, 0x4c, 0x7b, 0x0e, 0x50, 0x5d, 0xda, 0xb4, 0x96, 0x4e, 0xac, 0x23, 0x5d, 0x86, 0xbb, 0xaa, 0xdf, 0xfb, 0xaa, 0xab, 0x5d, 0x04, 0xf9, 0x76, 0x3f, 0x25, 0xec, - 0x71, 0x90, 0xd8, 0xab, 0x62, 0x1f, 0xe9, 0x15, 0x7f, 0x8b, 0x11, 0x6e, 0xb9, 0xca, 0x58, 0x4c, 0x6a, 0x2e, 0x8d, 0xb6, 0x70, 0x80, 0x31, 0x69, 0x0a, 0x22, 0x35, 0x80, 0x1a, 0x41, 0x7d, 0x51, - 0x2f, 0x6d, 0xd0, 0x13, 0xc6, 0x5a, 0xd3, 0x09, 0x94, 0x4d, 0x1d, 0x9d, 0x7a, 0xe4, 0x91, 0x0e, 0xcb, 0xbd, 0x86, 0xf7, 0xf7, 0xff, 0xba, 0x3e, 0x3e, 0x5b, 0xdb, 0xe7, 0x02, 0x4e, 0xef, 0x6a, - 0x0b, 0x08, 0xb5, 0xaf, 0x98, 0x5b, 0xac, 0xd1, 0xce, 0x4d, 0x0b, 0x97, 0xd4, 0x28, 0x6e, 0x4d, 0x40, 0x32, 0x05, 0x94, 0x2a, 0x77, 0xae, 0x8c, 0x60, 0x54, 0x7a, 0xef, 0x10, 0xcb, 0x3b, 0x13, - 0xa4, 0xdb, 0x61, 0xfb, 0x7f, 0x3a, 0xf7, 0xe0, 0xc9, 0x6c, 0xb0, 0xed, 0xfb, 0xc3, 0x90, 0x9d, 0xe3, 0x52, 0x9f, 0x7f, 0xba, 0xb4, 0x8b, 0xb3, 0xcf, 0x57, 0x57, 0xbf, 0x9d, 0x3d, 0x8a, 0xb7, - 0xb7, 0x0d, 0x4e, 0x7f, 0xc2, 0x98, 0xdc, 0x52, 0x7a, 0xc7, 0xb9, 0x82, 0x2c, 0x20, 0x24, 0xc2, 0x97, 0x75, 0x23, 0xa5, 0x55, 0x06, 0x7d, 0xdd, 0x8f, 0x30, 0xa6, 0x01, 0x6d, 0x36, 0x94, 0x1a, - 0x10, 0x43, 0x7b, 0xe1, 0xa0, 0x49, 0xcc, 0x7e, 0xf8, 0x2c, 0xe0, 0x75, 0x56, 0x7c, 0xd7, 0x7f, 0xb3, 0x7f, 0x72, 0x77, 0xea, 0xfa, 0x89, 0x6a, 0xd2, 0x2d, 0xfa, 0x6a, 0x26, 0xd9, 0x1d, 0x27, - 0x40, 0x2f, 0x82, 0x95, 0xe0, 0x1c, 0x29, 0x95, 0x28, 0x0d, 0x4a, 0x5d, 0x57, 0xf4, 0x8a, 0x3e, 0xc7, 0xa0, 0x48, 0xcf, 0xa4, 0xe1, 0xdd, 0x07, 0xe3, 0x31, 0x8e, 0xe1, 0x3b, 0x55, 0xba, 0x0f, - 0x76, 0x4f, 0x9d, 0xa0, 0x55, 0x42, 0x75, 0x09, 0xcd, 0x59, 0x3d, 0xd8, 0xc8, 0xc6, 0xb0, 0x35, 0x98, 0x4d, 0x7b, 0x08, 0x2d, 0xb3, 0x20, 0x5b, 0x00, 0x41, 0xd4, 0xb8, 0xef, 0x66, 0xf3, 0x8e, - 0x14, 0x55, 0x70, 0x27, 0x1c, 0x40, 0x47, 0x71, 0xc0, 0x6e, 0x70, 0xe1, 0x3e, 0x4a, 0x3d, 0x39, 0xc3, 0xb3, 0x45, 0x79, 0x5c, 0x3d, 0x70, 0x34, 0xc7, 0x0e, 0xd3, 0x61, 0x4d, 0x08, 0x1c, 0x55, - 0xe5, 0x3c, 0x57, 0x93, 0x74, 0x9b, 0xcd, 0xc8, 0x53, 0x65, 0x2a, 0x34, 0x68, 0x45, 0x6d, 0x38, 0xc9, 0x8c, 0x1d, 0x77, 0x7b, 0xd0, 0xaa, 0x9e, 0xce, 0x6b, 0x7a, 0xff, 0x38, 0x84, 0xf1, 0xec, - 0xa7, 0x41, 0xf5, 0xe9, 0x5d, 0x6f, 0x2e, 0x78, 0x63, 0x98, 0xb9, 0xed, 0x9b, 0xe8, 0x03, 0x13, 0xfb, 0x6c, 0xb2, 0x81, 0xd8, 0x95, 0x6d, 0x9a, 0xe7, 0x62, 0x1d, 0x86, 0x8c, 0x4d, 0x6d, 0x3a, - 0xc6, 0x18, 0x39, 0x97, 0xf7, 0x1e, 0xd0, 0x99, 0xfa, 0xea, 0x8d, 0xdf, 0x62, 0xda, 0xd9, 0xe3, 0x2b, 0x6d, 0xf6, 0x77, 0xdc, 0xa9, 0xc9, 0xe1, 0x41, 0x46, 0xa6, 0xad, 0x65, 0xae, 0xc9, 0xcb, - 0xaa, 0xcd, 0xd9, 0x29, 0xca, 0x6c, 0x0e, 0x13, 0x75, 0x59, 0x38, 0x46, 0x95, 0xf6, 0x2a, 0x76, 0x6b, 0x04, 0xc0, 0x84, 0x03, 0x9b, 0xd2, 0x84, 0x5c, 0xe3, 0x48, 0xf9, 0xe6, 0xd3, 0xb2, 0xf0, - 0x57, 0x5b, 0x87, 0x6e, 0xbe, 0xbd, 0x84, 0x0c, 0x72, 0xea, 0xf3, 0x08, 0x6b, 0x39, 0x63, 0xf9, 0x96, 0x4d, 0xa9, 0xa9, 0xb1, 0x0d, 0x4e, 0x58, 0x3e, 0x9d, 0xc4, 0x05, 0x7b, 0xa6, 0x82, 0xb8, - 0x84, 0xd4, 0x24, 0x1d, 0x21, 0xc3, 0x9a, 0xc8, 0xe6, 0x70, 0x7a, 0x03, 0x37, 0x3f, 0xd2, 0x3a, 0x74, 0x7c, 0x75, 0x1f, 0xe9, 0xc0, 0x3f, 0xcf, 0x5f, 0xa9, 0x71, 0xda, 0x17, 0x1c, 0xdf, 0xe2, - 0x20, 0x46, 0x74, 0x29, 0xf7, 0x56, 0x4a, 0xad, 0x61, 0x54, 0xf4, 0xa4, 0x98, 0xc5, 0x05, 0x18, 0x8e, 0xce, 0xb3, 0x04, 0x43, 0xc5, 0x25, 0x6b, 0x4d, 0x2e, 0x01, 0x84, 0x1e, 0x31, 0xd6, 0xcc, - 0x5a, 0xc6, 0x7a, 0x64, 0x56, 0xc9, 0xcf, 0x05, 0xff, 0x09, 0x0f, 0xfa, 0x63, 0x54, 0xd6, 0x7e, 0x4e, 0x73, 0x6a, 0xf9, 0x71, 0x55, 0xae, 0xa9, 0x5a, 0x90, 0x0e, 0xbd, 0x3a, 0x66, 0xce, 0x18, - 0x06, 0x66, 0xbe, 0x7c, 0x9a, 0x28, 0xe9, 0x60, 0xcd, 0x4e, 0x63, 0xf0, 0x68, 0x15, 0x60, 0xab, 0x98, 0x12, 0xc7, 0x9a, 0x33, 0xb8, 0x0e, 0x73, 0x85, 0xf7, 0x26, 0xfd, 0x93, 0x71, 0x13, 0x2f, - 0xba, 0x93, 0x1e, 0x06, 0x03, 0x9f, 0x56, 0xbe, 0xb0, 0x69, 0x0c, 0x59, 0xd8, 0x07, 0x94, 0xaf, 0x96, 0xe9, 0x90, 0xb1, 0x68, 0x88, 0xb2, 0x4d, 0xb1, 0xa6, 0x80, 0x94, 0x4e, 0xce, 0x3d, 0x78, - 0x85, 0xb6, 0x11, 0xd6, 0x6a, 0x29, 0x57, 0x0e, 0xa4, 0x7e, 0xe4, 0xfd, 0x6f, 0x7f, 0x75, 0xef, 0x1e, 0x90, 0xb1, 0xbf, 0xc5, 0x98, 0x2b, 0x08, 0xaf, 0x0c, 0xa7, 0xd5, 0xd4, 0x39, 0x4d, 0xd8, - 0xbd, 0x37, 0x5b, 0x0a, 0x94, 0xce, 0xae, 0x65, 0xad, 0x17, 0x36, 0x10, 0x8d, 0xee, 0x8a, 0xb0, 0x45, 0xa9, 0x55, 0xa4, 0xaa, 0xc6, 0xf3, 0x48, 0xd5, 0xc3, 0xde, 0x9b, 0xcc, 0x9e, 0x0f, 0x71, - 0x7e, 0xf2, 0x46, 0xc9, 0xed, 0xdb, 0xf7, 0x37, 0xbe, 0xbd, 0xa2, 0x86, 0x43, 0xa3, 0x62, 0x4e, 0x9f, 0xa2, 0x63, 0x36, 0xee, 0xd9, 0xaa, 0x6d, 0x39, 0x6e, 0x4d, 0x8b, 0xe0, 0x2e, 0x39, 0xa6, - 0x13, 0x29, 0x8c, 0x85, 0xcb, 0x07, 0xf5, 0x91, 0xe8, 0x9d, 0x2d, 0x30, 0xc6, 0x86, 0x29, 0x08, 0xaa, 0x4a, 0x5b, 0xc1, 0xf1, 0x39, 0xdd, 0x4f, 0xa5, 0x7c, 0x6b, 0xa6, 0xb3, 0xd6, 0x04, 0x1b, - 0x2c, 0x29, 0x6d, 0xd9, 0x6c, 0xe4, 0x33, 0x79, 0x0d, 0x58, 0xbd, 0x0b, 0xd5, 0x86, 0xd8, 0x19, 0x88, 0x61, 0x20, 0x12, 0xaf, 0x09, 0x88, 0x24, 0x34, 0x2d, 0x19, 0x71, 0x2d, 0x19, 0xd5, 0x0f, - 0xbf, 0xb8, 0xef, 0xe9, 0xa2, 0x1d, 0x5d, 0xa4, 0xcb, 0x6f, 0x2f, 0xf1, 0xdf, 0xe9, 0xdf, 0xee, 0xc6, 0xce, 0x88, 0x50, 0xc0, 0xee, 0xb2, 0x52, 0xaa, 0x17, 0xf7, 0x90, 0x80, 0xc1, 0xd9, 0x9a, - 0xaa, 0xf7, 0x26, 0x38, 0x74, 0x54, 0xe2, 0x72, 0x2d, 0x0d, 0x5a, 0xd3, 0x96, 0x3a, 0x65, 0x0a, 0x45, 0xa7, 0xc3, 0xa1, 0xe6, 0xe1, 0xe1, 0x3f, 0xfe, 0xdc, 0x12, 0x9f, 0xdd, 0xf7, 0xd6, 0xe6, - 0x18, 0xcb, 0x36, 0x48, 0x2b, 0xd9, 0x6c, 0x0c, 0x2a, 0x51, 0x76, 0x6f, 0x35, 0x6d, 0x4a, 0xc6, 0x96, 0x78, 0xf9, 0x54, 0x03, 0x64, 0xc4, 0xa8, 0x91, 0xdb, 0xa2, 0xc2, 0x82, 0x36, 0x6c, 0xad, - 0xb1, 0x7c, 0x43, 0xbe, 0xc7, 0xcc, 0x71, 0xd7, 0xde, 0xbf, 0xb7, 0x50, 0xa7, 0xcf, 0xa5, 0x17, 0xac, 0x24, 0x31, 0xca, 0x0c, 0xcf, 0xd6, 0x8a, 0x74, 0xaa, 0xcc, 0x2d, 0x57, 0xd6, 0x25, 0x8a, - 0x05, 0x0b, 0x87, 0xe2, 0x6a, 0x6b, 0x01, 0xf4, 0xc1, 0x10, 0x48, 0x21, 0x83, 0x1b, 0x64, 0xf7, 0x00, 0x38, 0x5c, 0xb8, 0xf1, 0xb4, 0x7c, 0xec, 0x47, 0x6f, 0xf1, 0x93, 0xd9, 0x79, 0xf7, 0x14, - 0xe7, 0xd3, 0xf2, 0x9c, 0xf7, 0xc7, 0xe6, 0x82, 0x1c, 0xcc, 0x2b, 0xdf, 0xef, 0xbd, 0xec, 0xf0, 0x2f, 0x11, 0xa0, 0x4f, 0xc6, 0x24, 0xec, 0x33, 0x14, 0xa7, 0xe6, 0xb9, 0x99, 0x50, 0xd6, 0x54, - 0xe2, 0x0e, 0xa0, 0x1d, 0x79, 0x25, 0xac, 0x59, 0x9d, 0x30, 0x94, 0x14, 0x00, 0xb4, 0x64, 0xa4, 0xaa, 0x86, 0xcb, 0x10, 0x5c, 0x22, 0x49, 0x03, 0x87, 0x10, 0xcd, 0x92, 0x1c, 0xfe, 0xd3, 0x2e, - 0xed, 0x9f, 0xb6, 0x08, 0xfc, 0xec, 0x35, 0xed, 0x3f, 0x1b, 0x11, 0xf1, 0x78, 0xc3, 0xfe, 0xe6, 0xe9, 0xa7, 0xa6, 0x31, 0x8c, 0x00, 0xb2, 0x37, 0xb3, 0x01, 0xae, 0x8b, 0xc8, 0x18, 0x6d, 0x66, - 0x42, 0xa7, 0xdd, 0xa8, 0xc6, 0xc9, 0x63, 0x38, 0x74, 0x9b, 0x1d, 0x5b, 0xc2, 0xea, 0xb8, 0xeb, 0x1b, 0x88, 0xda, 0xbd, 0x24, 0x09, 0x76, 0x05, 0x01, 0x3f, 0x29, 0x1c, 0xba, 0x7a, 0xe5, 0x5d, - 0xe3, 0x0f, 0x52, 0xfe, 0xcc, 0x69, 0x3e, 0xbd, 0xeb, 0x85, 0x42, 0x4e, 0xbd, 0x21, 0x37, 0xa4, 0x02, 0xdd, 0x6d, 0xc7, 0x35, 0xd7, 0x9a, 0xc4, 0xc0, 0x00, 0x3c, 0x23, 0x39, 0x47, 0x1b, 0xcc, - 0x33, 0x67, 0xcd, 0x35, 0x2b, 0x6c, 0xf4, 0x9e, 0xc3, 0xdb, 0xe8, 0x95, 0xc8, 0x21, 0x2a, 0xd8, 0x8e, 0xbc, 0xd2, 0xf7, 0xe9, 0xab, 0x03, 0x8f, 0x49, 0xf9, 0x30, 0x8f, 0x66, 0x0f, 0x8c, 0xbe, - 0xc1, 0x41, 0x98, 0x8a, 0x8e, 0x96, 0xa5, 0x7d, 0xa9, 0x50, 0x62, 0x4f, 0x1f, 0x45, 0xbd, 0xa7, 0x73, 0x65, 0x73, 0xd1, 0x0e, 0x3e, 0x58, 0x0b, 0xc6, 0x6a, 0xb8, 0x32, 0x46, 0x05, 0x91, 0xcd, - 0x62, 0xa6, 0x00, 0xf7, 0x63, 0xaf, 0xc5, 0x7a, 0xd6, 0x86, 0xbd, 0x0f, 0xc7, 0x4e, 0x6d, 0xb5, 0x99, 0x3e, 0x3d, 0x11, 0xd4, 0xbd, 0x85, 0x0e, 0x97, 0x68, 0x22, 0x21, 0x84, 0x9b, 0xbb, 0x4c, - 0xa0, 0x8c, 0xb0, 0x70, 0xc8, 0xb4, 0x1c, 0xae, 0x13, 0xb2, 0x73, 0x85, 0x0b, 0x0d, 0x99, 0x0d, 0xe4, 0xc8, 0xd0, 0xd1, 0x1f, 0x4d, 0xe5, 0x47, 0x96, 0xe8, 0x79, 0x62, 0xb1, 0x9f, 0x2f, 0x9e, - 0x1a, 0xa3, 0x24, 0xd3, 0x20, 0x9b, 0xe2, 0xd8, 0xb5, 0x5a, 0xb7, 0xd1, 0x8d, 0xa1, 0x15, 0x0a, 0xb4, 0xdd, 0xf0, 0x3a, 0x72, 0x4b, 0xc5, 0x85, 0xd4, 0x17, 0xb9, 0x4b, 0x7a, 0xc3, 0x1a, 0x8b, - 0x65, 0x21, 0x0e, 0xf5, 0x3a, 0x76, 0x56, 0x77, 0xb8, 0x3b, 0x7e, 0x7f, 0x5b, 0x9d, 0xfc, 0xed, 0x28, 0x8b, 0x89, 0x75, 0xf3, 0xc5, 0x4a, 0xcd, 0x34, 0x75, 0x4b, 0xe7, 0x61, 0x76, 0x5c, 0x5b, - 0xc2, 0x4f, 0xe9, 0xd9, 0xbc, 0x30, 0x29, 0x34, 0xc9, 0x3a, 0x33, 0xad, 0xae, 0x7d, 0xb5, 0x59, 0x9c, 0x93, 0xc9, 0x8f, 0xd4, 0x89, 0x3f, 0xc2, 0xa9, 0x9f, 0xae, 0xd8, 0x96, 0x03, 0xef, 0x63, - 0xca, 0x53, 0x67, 0x79, 0x33, 0xc2, 0x27, 0xae, 0xd1, 0x6a, 0xc3, 0x96, 0xa3, 0x67, 0x65, 0x2b, 0x99, 0x62, 0xdc, 0xbc, 0x0d, 0x67, 0xe3, 0x96, 0xbd, 0x37, 0x5a, 0xc3, 0xa2, 0x0f, 0x76, 0x98, - 0xa3, 0x6b, 0x31, 0xf6, 0x29, 0xde, 0x7b, 0x1d, 0xab, 0xa1, 0xbd, 0xbb, 0xbe, 0xd8, 0xcb, 0xd0, 0x4f, 0xff, 0xe8, 0xc6, 0x20, 0xd1, 0x67, 0x77, 0x5c, 0xbd, 0x3b, 0x57, 0x74, 0x5e, 0x6d, 0x8e, - 0x96, 0xb2, 0x45, 0xc3, 0x3e, 0xfb, 0x6a, 0x3c, 0x1d, 0x97, 0x71, 0x36, 0xaa, 0xe4, 0xe6, 0xb3, 0x6f, 0x39, 0x6d, 0x8d, 0x5a, 0x2c, 0xf3, 0x48, 0x1f, 0xdd, 0x21, 0x42, 0x7f, 0x5d, 0xde, 0x17, - 0xb4, 0xfc, 0x64, 0x32, 0xec, 0x4f, 0x39, 0xfe, 0xdd, 0x0b, 0x53, 0x9e, 0xef, 0xc0, 0xd3, 0x57, 0x82, 0xb7, 0x21, 0x34, 0x89, 0x3b, 0x8e, 0xcc, 0x06, 0xab, 0x4b, 0xd8, 0xd8, 0xd5, 0xf6, 0x0f, - 0x58, 0x84, 0x73, 0xda, 0xa8, 0x09, 0xd5, 0x81, 0x00, 0x64, 0x29, 0x26, 0x07, 0x77, 0x37, 0x97, 0x19, 0x1a, 0xb5, 0x8e, 0x9c, 0xf1, 0xfc, 0x85, 0xaa, 0x8f, 0x07, 0xb1, 0x1e, 0xc6, 0x91, 0x3d, - 0xb7, 0x5b, 0x3d, 0x79, 0x6d, 0x0b, 0xe9, 0xdc, 0x95, 0xa0, 0x0d, 0xf1, 0xc1, 0x4b, 0x9a, 0x76, 0x9f, 0xe6, 0xd6, 0x78, 0x48, 0x71, 0xc8, 0xd2, 0xbe, 0x00, 0x5a, 0x58, 0x45, 0xa7, 0x01, 0x10, - 0x99, 0x00, 0x3d, 0x97, 0xc9, 0x94, 0xa4, 0xd9, 0x8f, 0x75, 0x82, 0xee, 0x5a, 0x36, 0xf6, 0xdc, 0x4a, 0xfb, 0x00, 0xff, 0xb9, 0x5d, 0x3f, 0xbb, 0xb9, 0xb4, 0xaf, 0x37, 0x9f, 0xaf, 0x6e, 0xcf, - 0xbe, 0x5e, 0xe7, 0xef, 0xe7, 0xf9, 0xc7, 0xa9, 0xf9, 0x6f, 0x8d, 0xb9, 0xa6, 0xa4, 0xa0, 0x0f, 0xb2, 0xee, 0xb4, 0x1c, 0xe7, 0x6a, 0x2d, 0x12, 0x15, 0xbb, 0x04, 0xd2, 0x68, 0x73, 0x16, 0x15, - 0x37, 0x60, 0x59, 0x83, 0x4d, 0xd2, 0x7c, 0x74, 0x17, 0xdd, 0x84, 0xc2, 0x63, 0x7b, 0xf1, 0x59, 0x3b, 0xf8, 0xbe, 0x3f, 0x91, 0x53, 0x2f, 0xcc, 0x62, 0xca, 0x6c, 0x8b, 0x72, 0xd1, 0x1c, 0x25, - 0x73, 0x0a, 0xa1, 0xcc, 0x1c, 0x3d, 0x09, 0x86, 0x56, 0x34, 0x73, 0xad, 0x61, 0x6d, 0x86, 0x91, 0x22, 0xc8, 0xa8, 0x72, 0x85, 0xe0, 0x74, 0x54, 0x95, 0x3a, 0x3c, 0x19, 0xed, 0x09, 0x34, 0x7b, - 0x2a, 0xcd, 0xf7, 0x51, 0x82, 0x47, 0x4c, 0xf2, 0xd9, 0xbd, 0x6e, 0xf1, 0x5b, 0xbe, 0xa8, 0xb1, 0x7b, 0x03, 0x0d, 0xf4, 0xcd, 0x31, 0x0e, 0x83, 0xa1, 0x14, 0x51, 0x69, 0xdc, 0x97, 0xd2, 0xf2, - 0xe9, 0x98, 0xab, 0x45, 0xb7, 0x69, 0x14, 0x73, 0xac, 0xa5, 0x7d, 0x78, 0xdb, 0x95, 0xfd, 0x5b, 0xe3, 0x0c, 0x32, 0xe2, 0xe6, 0x0a, 0x87, 0xc3, 0xfc, 0xe3, 0x4b, 0x00, 0x77, 0xe8, 0xf4, 0x49, - 0xd3, 0xfb, 0x33, 0xb4, 0xfa, 0xd7, 0x38, 0xf3, 0x3d, 0xbd, 0xdc, 0x7c, 0xb6, 0xeb, 0x7c, 0x85, 0x6c, 0x3d, 0xa0, 0xf0, 0x37, 0x57, 0x21, 0xcc, 0xd9, 0x86, 0x86, 0x8d, 0x46, 0x1d, 0x2a, 0x5b, - 0xf2, 0xf4, 0x09, 0x3a, 0x02, 0x49, 0x85, 0x91, 0x9b, 0x00, 0xa4, 0x78, 0xdb, 0x5c, 0xb9, 0xb6, 0x08, 0x5d, 0xac, 0x0e, 0x54, 0xae, 0xde, 0xa6, 0xaf, 0xc3, 0xdc, 0xe3, 0x0f, 0x75, 0xbc, 0x14, - 0xe9, 0xec, 0xe6, 0xee, 0xeb, 0xd7, 0xab, 0xeb, 0x57, 0x88, 0xd7, 0x57, 0x7e, 0xe7, 0xcd, 0xd5, 0xe1, 0x89, 0x48, 0x8d, 0x09, 0xab, 0xfa, 0xd2, 0x42, 0x6a, 0xc5, 0x89, 0xe1, 0x63, 0x2d, 0x50, - 0xef, 0x92, 0x95, 0x32, 0xc7, 0xaa, 0x39, 0xb9, 0x05, 0x93, 0xb2, 0x8c, 0xd9, 0x8d, 0xb4, 0x40, 0xa7, 0x98, 0xfe, 0xb3, 0x54, 0xf4, 0x6b, 0xd6, 0xf2, 0xb8, 0x8b, 0xfe, 0x3d, 0x33, 0x7a, 0xb8, - 0xf9, 0xcd, 0x15, 0xb7, 0x24, 0xaa, 0xa6, 0x0c, 0x9f, 0xd5, 0x66, 0xe6, 0x12, 0xb6, 0x31, 0xa2, 0x48, 0x7d, 0x70, 0x4a, 0xe9, 0x90, 0xf0, 0xce, 0x64, 0x62, 0xd6, 0x06, 0x40, 0x2f, 0x67, 0x5e, - 0x5e, 0x0b, 0xd9, 0x89, 0x9c, 0x8e, 0x46, 0x89, 0x87, 0xf7, 0x9d, 0xbd, 0x48, 0x18, 0x4e, 0x1d, 0x11, 0x72, 0xe2, 0xa4, 0x26, 0xde, 0x45, 0xab, 0xaf, 0x92, 0xd6, 0xda, 0xea, 0x86, 0xa6, 0xc9, - 0xc2, 0x5d, 0x60, 0x84, 0x25, 0x6a, 0x50, 0x2b, 0x09, 0x02, 0xd4, 0x5d, 0x05, 0x87, 0x48, 0xf5, 0x04, 0x4d, 0x3e, 0x72, 0xf8, 0xf2, 0xf7, 0x9b, 0x1f, 0x25, 0x60, 0x7f, 0x69, 0x52, 0xc8, 0x03, - 0x97, 0xbd, 0x2f, 0xed, 0xa9, 0xc1, 0x36, 0xc7, 0xec, 0x6a, 0x43, 0xa8, 0x62, 0x89, 0xe9, 0x54, 0xc6, 0x64, 0xed, 0x48, 0x98, 0x5b, 0xbe, 0x6f, 0x9e, 0xda, 0x55, 0x71, 0xcb, 0x87, 0x46, 0xcb, - 0x3e, 0x07, 0x35, 0x02, 0x5e, 0x38, 0x1d, 0xa0, 0xa8, 0x1d, 0x06, 0x2e, 0x0f, 0x07, 0x0e, 0xe7, 0x63, 0x8e, 0xb3, 0xaf, 0x71, 0xf6, 0x48, 0xf9, 0x7c, 0xba, 0xbc, 0x7b, 0xa4, 0x80, 0xb6, 0x1f, - 0xff, 0x39, 0xc7, 0xc7, 0x41, 0x2f, 0x6f, 0x78, 0x55, 0x21, 0x07, 0xff, 0xe8, 0xfe, 0x89, 0xe3, 0xa9, 0xd1, 0x9d, 0x45, 0xf7, 0x29, 0x31, 0xfa, 0x40, 0x20, 0xdc, 0xa2, 0x88, 0xab, 0xb6, 0xe4, - 0x48, 0xe8, 0xa8, 0x59, 0xc5, 0xc4, 0x1e, 0xe1, 0xee, 0x9d, 0xaa, 0x7b, 0x82, 0x56, 0x8d, 0xf2, 0x61, 0xce, 0xcd, 0xc5, 0x8f, 0xb5, 0xa3, 0x3c, 0x3d, 0x97, 0xd9, 0xcf, 0xaa, 0x4e, 0x9d, 0x06, - 0x0b, 0x64, 0x8c, 0xc8, 0xc9, 0xee, 0x8d, 0x67, 0xe3, 0x16, 0x96, 0x9c, 0x1c, 0x53, 0x4a, 0xd9, 0x66, 0xaa, 0x2c, 0x0c, 0x08, 0x72, 0x80, 0x86, 0xd8, 0xab, 0x77, 0xeb, 0x9d, 0xb2, 0x47, 0xf2, - 0xca, 0x26, 0x87, 0x0f, 0x5e, 0x7e, 0x76, 0xde, 0xf2, 0xea, 0x42, 0xbf, 0xf5, 0xa2, 0x49, 0xc3, 0x44, 0x94, 0x49, 0x6d, 0x01, 0x4b, 0xb4, 0xcc, 0x16, 0x0b, 0xcb, 0x11, 0xcb, 0x24, 0xd9, 0x98, - 0x46, 0xb3, 0x9c, 0x49, 0xb3, 0x0c, 0xc3, 0x44, 0x33, 0x08, 0xa3, 0xa2, 0x69, 0x6f, 0xed, 0x15, 0xb0, 0xfa, 0x84, 0xbf, 0xdc, 0x13, 0x81, 0x4f, 0x2f, 0x03, 0xe3, 0xec, 0x9e, 0x9c, 0xe5, 0x38, - 0x7b, 0x5b, 0x5d, 0xd2, 0x1a, 0x61, 0x1f, 0x5c, 0x00, 0x1a, 0x80, 0x19, 0x08, 0x3d, 0x16, 0xaa, 0xf5, 0xf4, 0x0c, 0x0f, 0xd0, 0xbe, 0x18, 0x7b, 0x63, 0x1f, 0x63, 0x1d, 0x46, 0x35, 0x8f, 0x12, - 0xdc, 0xda, 0xf5, 0xa7, 0x7c, 0xad, 0x55, 0x78, 0xff, 0xc6, 0x3d, 0x71, 0x4f, 0x9f, 0x5c, 0xce, 0xe4, 0x36, 0x21, 0x00, 0x62, 0x11, 0x85, 0x7a, 0x8b, 0x39, 0x6d, 0x79, 0x1f, 0xda, 0x51, 0x5b, - 0xb5, 0xd8, 0xe0, 0x1b, 0xf0, 0xca, 0x5d, 0x91, 0x07, 0x83, 0x09, 0x2f, 0x12, 0x14, 0x1e, 0x4e, 0x0b, 0x8e, 0xbc, 0x01, 0xfc, 0x41, 0x8a, 0x8f, 0x66, 0xd7, 0xf1, 0x79, 0xd0, 0xc7, 0x4f, 0x97, - 0x77, 0x17, 0x17, 0xbf, 0x7f, 0x79, 0x4a, 0x46, 0x7f, 0xff, 0xd9, 0x97, 0x9b, 0xdf, 0x9f, 0x35, 0x27, 0x7e, 0xdc, 0xbc, 0xcd, 0xc7, 0x27, 0x7e, 0xeb, 0xc7, 0xc5, 0x17, 0xb7, 0xde, 0x5b, 0xf9, - 0x8b, 0x9b, 0x7f, 0x5c, 0x7e, 0xf1, 0xaf, 0x3e, 0xfc, 0xe8, 0xe1, 0x2f, 0xbd, 0xbe, 0x08, 0x2f, 0x1e, 0xff, 0xcd, 0x17, 0x83, 0x55, 0x8c, 0x5b, 0x9b, 0x2c, 0xe0, 0x63, 0x7a, 0xc0, 0x5c, 0x73, - 0xb1, 0x36, 0xe4, 0xde, 0x31, 0x98, 0xaa, 0xb9, 0xe9, 0x52, 0x5b, 0x99, 0x2b, 0xb3, 0xd8, 0x55, 0x1d, 0xd0, 0x0d, 0x1d, 0x86, 0xce, 0x3a, 0x36, 0xd0, 0xe2, 0xa0, 0xca, 0xdf, 0x5c, 0x98, 0x84, - 0x99, 0x73, 0x0e, 0xb2, 0x01, 0x05, 0x23, 0x0b, 0x16, 0x54, 0x91, 0x1b, 0x50, 0xc3, 0x5d, 0x9a, 0x00, 0xe5, 0xdb, 0x46, 0x13, 0x19, 0xc6, 0xb1, 0x48, 0x06, 0xb5, 0x54, 0xc2, 0xe4, 0x19, 0xf7, - 0x25, 0xa8, 0xaf, 0x0a, 0xf3, 0xdd, 0x4c, 0xde, 0x5c, 0x90, 0x18, 0x6d, 0x29, 0xca, 0x9a, 0xcb, 0xa8, 0x2d, 0xd3, 0x61, 0xb3, 0x15, 0xa0, 0xd2, 0xd4, 0xce, 0x3d, 0xc7, 0x94, 0xae, 0xd2, 0x65, - 0x75, 0xcf, 0x30, 0xea, 0x8d, 0x38, 0xa6, 0x55, 0x86, 0x5a, 0x6f, 0x36, 0x8f, 0x83, 0xab, 0x17, 0xa6, 0xfd, 0xe6, 0x92, 0x10, 0xad, 0x49, 0xe0, 0x23, 0x63, 0x90, 0x16, 0x4d, 0x30, 0x6a, 0x5b, - 0x2e, 0x0e, 0xa5, 0x31, 0xb8, 0xc1, 0x74, 0xc5, 0x35, 0xb5, 0x13, 0xaf, 0xa5, 0x04, 0x28, 0x5e, 0x09, 0xc3, 0x82, 0x88, 0x56, 0x83, 0xa3, 0xfd, 0x85, 0x07, 0xb6, 0xe3, 0x9b, 0x8b, 0x32, 0x57, - 0x6a, 0x43, 0x9f, 0x3e, 0x2b, 0x9d, 0x39, 0x60, 0xd0, 0x1c, 0x12, 0x05, 0x24, 0x6b, 0x19, 0xa8, 0x94, 0xe2, 0xe2, 0x96, 0x65, 0x8b, 0x9d, 0xb4, 0xad, 0x72, 0x9d, 0x35, 0xdc, 0x5d, 0x20, 0xfc, - 0xe8, 0xa4, 0xc2, 0x23, 0x2e, 0xe4, 0xcd, 0xc5, 0xc1, 0xb1, 0xa8, 0x39, 0x0d, 0xeb, 0x63, 0x11, 0xf7, 0xdd, 0x81, 0xf6, 0xca, 0x6a, 0x34, 0xc7, 0xe2, 0x10, 0x9b, 0xbc, 0x1c, 0x31, 0x79, 0x58, - 0x55, 0xa7, 0x41, 0x5d, 0x27, 0xa5, 0x4d, 0xe6, 0x46, 0xa9, 0x64, 0x3f, 0xdb, 0x2c, 0x4f, 0xdd, 0xde, 0x9b, 0xcb, 0xa2, 0x96, 0xc1, 0xcb, 0x7a, 0x6f, 0xbc, 0x65, 0x73, 0x33, 0xc6, 0x6a, 0x46, - 0x16, 0x60, 0xde, 0x98, 0x5a, 0x23, 0x0d, 0x70, 0x65, 0xe0, 0x5a, 0x09, 0x83, 0xb0, 0x3b, 0x60, 0x71, 0x16, 0x34, 0x18, 0xbe, 0x7b, 0xd5, 0xde, 0x41, 0x59, 0xfe, 0x71, 0x73, 0xbb, 0x9f, 0x49, - 0x35, 0xfc, 0xd0, 0xff, 0x73, 0xbb, 0xbe, 0xa1, 0xb7, 0x93, 0xcb, 0x21, 0x23, 0xd3, 0x5a, 0xc7, 0x72, 0x40, 0x4a, 0xc8, 0xd6, 0x6b, 0x69, 0x60, 0xf1, 0xe2, 0xc5, 0xca, 0x6b, 0x9a, 0x0e, 0x31, - 0x13, 0xec, 0x13, 0x2d, 0xb0, 0x74, 0x75, 0xad, 0x08, 0x65, 0xab, 0x05, 0x13, 0x0e, 0x97, 0x21, 0x6c, 0x4f, 0x7b, 0x76, 0x63, 0xf5, 0x0a, 0x7b, 0xfa, 0xe3, 0x96, 0xa7, 0xd2, 0x8e, 0x0f, 0xf0, - 0x81, 0x7e, 0x08, 0x7b, 0xea, 0x0c, 0x52, 0xac, 0x9c, 0x9c, 0xc9, 0xa7, 0x36, 0x88, 0x62, 0x22, 0x19, 0x7d, 0xc6, 0x76, 0xa5, 0x28, 0xa7, 0x8d, 0x5d, 0x9b, 0xc0, 0x92, 0xd9, 0xad, 0x74, 0xba, - 0xce, 0x18, 0x58, 0x95, 0x1b, 0x44, 0x98, 0xcc, 0x47, 0x1a, 0x06, 0xbe, 0x9f, 0x69, 0xdf, 0x8b, 0xf4, 0xda, 0xf1, 0xf3, 0xf7, 0x3b, 0x9e, 0xb3, 0xe9, 0xf0, 0x41, 0xde, 0x4e, 0x66, 0x25, 0x06, - 0x8d, 0xee, 0x86, 0x95, 0xcc, 0xa8, 0xb4, 0x84, 0xd1, 0x45, 0x27, 0x61, 0x70, 0x87, 0x88, 0x32, 0x97, 0x01, 0x4d, 0x91, 0xb1, 0xad, 0x12, 0x32, 0x98, 0xcd, 0x64, 0x2e, 0xf4, 0x1e, 0x52, 0x47, - 0x5e, 0x7a, 0xf9, 0xec, 0xf5, 0x7f, 0xcf, 0xfa, 0xc7, 0x37, 0xe1, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x08, 0x8a, 0x26, 0x03, 0x18, 0x26, 0x00, 0x00, 0xab, 0x9d, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, - 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x9c, 0x8f, 0xc1, 0x6e, 0x84, - 0x20, 0x10, 0x86, 0xef, 0xf3, 0x14, 0x64, 0xce, 0x95, 0x60, 0xd7, 0x4d, 0xbd, 0xf8, 0x24, 0xc6, 0x6c, 0x28, 0xcc, 0x52, 0xaa, 0x05, 0x03, 0xa3, 0xdd, 0xa4, 0xe9, 0xbb, 0x37, 0xa8, 0x3d, 0x78, - 0xdd, 0x1b, 0x7c, 0x99, 0x7c, 0xff, 0xff, 0x43, 0x3f, 0x6b, 0x33, 0x6a, 0x47, 0x03, 0x04, 0xfd, 0x45, 0xa2, 0x13, 0x78, 0x5f, 0x82, 0x61, 0x1f, 0x03, 0xc2, 0x4a, 0x29, 0xfb, 0x18, 0x0a, 0x54, - 0xb2, 0x96, 0x0a, 0x81, 0xac, 0xe7, 0x83, 0xbc, 0xaa, 0xba, 0x45, 0x80, 0xde, 0xd2, 0x4c, 0xc1, 0x52, 0x30, 0x9e, 0xf2, 0x00, 0x66, 0x8a, 0x8b, 0xa5, 0x95, 0x02, 0xe7, 0x2a, 0xdb, 0x51, 0x74, - 0xe2, 0x47, 0x9c, 0x34, 0x6f, 0x52, 0xe1, 0x8b, 0xb8, 0x93, 0xe6, 0x25, 0x51, 0x16, 0x9d, 0xe8, 0x51, 0x1b, 0xf6, 0x0f, 0x1c, 0xc4, 0x2f, 0x6c, 0xaf, 0xea, 0x9b, 0xde, 0xcb, 0x6d, 0x23, 0x2f, - 0xb2, 0xc6, 0x83, 0x25, 0xde, 0x32, 0x65, 0x5b, 0x5a, 0x64, 0x4a, 0x96, 0x6e, 0x9f, 0x79, 0x77, 0xd6, 0x08, 0x53, 0x74, 0xbb, 0xbd, 0xd9, 0x4a, 0x86, 0xf5, 0x36, 0x45, 0xe7, 0x28, 0x1d, 0xcd, - 0x55, 0xa1, 0x89, 0x1c, 0x3d, 0xb6, 0x7b, 0x79, 0x95, 0x57, 0x04, 0x8e, 0xa3, 0x8f, 0xfb, 0xbf, 0x95, 0xcd, 0x7f, 0xce, 0x07, 0xf3, 0x5c, 0xe0, 0x65, 0x0f, 0x2f, 0xf3, 0xd6, 0xea, 0x3c, 0xf1, - 0x29, 0xd1, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x41, 0x41, 0x5a, 0x20, 0xcd, 0x00, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xdc, 0x95, 0x6f, 0x6f, 0x1b, 0xb7, 0x0f, 0xc7, 0x9f, 0xeb, 0x55, 0xb0, 0xc9, 0x0f, 0x48, 0xf2, - 0x43, 0x7c, 0x4e, 0x9f, 0x15, 0x87, 0x2e, 0x40, 0x97, 0xb5, 0x6b, 0xd0, 0xa1, 0x19, 0x12, 0x07, 0x43, 0x90, 0x15, 0x3d, 0x59, 0xe2, 0xf9, 0xd4, 0xc8, 0xe2, 0x4d, 0x94, 0xce, 0xf1, 0x86, 0xbd, - 0xf7, 0x41, 0xd2, 0xf9, 0x1f, 0xda, 0xf5, 0x05, 0xec, 0x99, 0x4f, 0x22, 0x29, 0xf2, 0xcb, 0x0f, 0xe9, 0x63, 0xb8, 0x8d, 0x1c, 0xe0, 0xed, 0x80, 0x2e, 0x30, 0xbc, 0x8b, 0x4e, 0x05, 0x43, 0x4e, - 0x88, 0xdf, 0xd0, 0x2a, 0x5a, 0x22, 0x04, 0x82, 0x35, 0x45, 0x0f, 0x0e, 0x57, 0xc5, 0xb2, 0x1d, 0x4d, 0xa0, 0xf7, 0xf4, 0x05, 0x55, 0x78, 0x01, 0xb3, 0x0e, 0x61, 0x4e, 0xc6, 0xa2, 0xef, 0xad, - 0x0c, 0x28, 0x1e, 0xa5, 0x0a, 0xe6, 0xf9, 0xd3, 0x69, 0x17, 0x42, 0xcf, 0xf5, 0x74, 0x9a, 0x3f, 0x2b, 0xcf, 0xd3, 0x33, 0x58, 0xe1, 0x1c, 0x18, 0xfd, 0x80, 0x1e, 0x0c, 0x83, 0x71, 0xe2, 0xb1, - 0x61, 0xaf, 0xa6, 0x4b, 0x69, 0x5c, 0xe5, 0xb9, 0xf9, 0x74, 0x5a, 0x4d, 0xf7, 0xbe, 0xcf, 0x2a, 0xb8, 0x0e, 0x27, 0x0c, 0x8a, 0x5c, 0x6b, 0x16, 0xd1, 0xa3, 0x4e, 0xe9, 0x18, 0x37, 0xd0, 0x13, - 0x42, 0xe8, 0x10, 0x9a, 0x4e, 0x3a, 0x6d, 0xb1, 0x11, 0xdb, 0xa4, 0x8c, 0x83, 0x12, 0xb2, 0xdc, 0xf8, 0xfd, 0xa8, 0xbb, 0xa3, 0xb3, 0x64, 0xe7, 0x91, 0x7b, 0x72, 0x9c, 0x4b, 0x94, 0xf0, 0xeb, - 0xcd, 0xdd, 0x4c, 0x78, 0xfc, 0x23, 0x22, 0x87, 0xf4, 0x60, 0x90, 0xc6, 0x19, 0xb7, 0x00, 0x09, 0x83, 0xb4, 0x46, 0x43, 0x73, 0x65, 0x29, 0xea, 0x2c, 0x53, 0x53, 0xc1, 0x03, 0x45, 0xe0, 0x8e, - 0xa2, 0xd5, 0xd0, 0xc7, 0x50, 0x14, 0xd2, 0xc8, 0xc6, 0xa3, 0x16, 0x73, 0xec, 0xe4, 0x60, 0xc8, 0x83, 0x71, 0x6c, 0x74, 0x4a, 0x54, 0x86, 0x6d, 0xa6, 0x5b, 0xf9, 0x2a, 0xb8, 0x76, 0xa0, 0x24, - 0x63, 0x72, 0x06, 0x87, 0xa5, 0xb6, 0x6d, 0xa5, 0x82, 0x93, 0xf8, 0x1e, 0x99, 0xa2, 0x57, 0xc8, 0xd0, 0x92, 0x2f, 0xaf, 0x6c, 0xfc, 0xcf, 0xb3, 0x9f, 0x92, 0x0e, 0x34, 0x95, 0x27, 0x8c, 0xcb, - 0x9a, 0x3c, 0x36, 0xdb, 0x20, 0xbb, 0xd7, 0x36, 0x12, 0x94, 0xab, 0x2c, 0xad, 0x10, 0xa9, 0x6f, 0xb2, 0xef, 0x61, 0x65, 0xac, 0x05, 0x7c, 0xee, 0x29, 0x69, 0xd1, 0x79, 0x44, 0x40, 0xa7, 0x7b, - 0x32, 0x2e, 0x70, 0x2d, 0x04, 0xc0, 0xff, 0xa1, 0x99, 0x36, 0x30, 0xf3, 0x66, 0xb1, 0x40, 0xcf, 0x07, 0xc2, 0xef, 0x68, 0x48, 0x09, 0x16, 0x15, 0x61, 0x89, 0xa1, 0x23, 0x3d, 0x3a, 0x76, 0x28, - 0x6d, 0xe8, 0xa6, 0x1e, 0xa5, 0x36, 0x0e, 0x99, 0x9b, 0x8c, 0xcb, 0xe6, 0x81, 0xd1, 0x6d, 0x7b, 0x0b, 0xc5, 0x1c, 0x54, 0x87, 0xea, 0xe9, 0x30, 0x82, 0x35, 0x03, 0xfe, 0x6b, 0x80, 0xcd, 0xe5, - 0xa1, 0xbf, 0x48, 0x6d, 0x5a, 0xca, 0x35, 0x44, 0x46, 0x90, 0x6e, 0x0d, 0xd4, 0xe6, 0xec, 0xe5, 0x20, 0x8d, 0x95, 0x73, 0x8b, 0x50, 0x50, 0x15, 0x2d, 0xca, 0x10, 0x3d, 0xf2, 0x37, 0x98, 0xd5, - 0xa4, 0x12, 0xb8, 0x81, 0xa0, 0x8d, 0xb6, 0x4d, 0x4a, 0xa5, 0x08, 0x23, 0x28, 0x0c, 0x32, 0x40, 0xe8, 0x88, 0x51, 0x6c, 0x25, 0xab, 0x84, 0x38, 0x3e, 0x86, 0x9f, 0x70, 0x40, 0x4b, 0xfd, 0x12, - 0x5d, 0x48, 0x42, 0x27, 0xd8, 0x19, 0x64, 0x8a, 0x61, 0xd7, 0xc0, 0x68, 0xdb, 0xc9, 0xc8, 0x18, 0xea, 0xd4, 0x03, 0x6b, 0x94, 0x2c, 0x5d, 0x65, 0xda, 0x35, 0xb6, 0xc4, 0x00, 0x13, 0x40, 0xb2, - 0x48, 0xa7, 0xab, 0x4c, 0x5c, 0xae, 0x24, 0x74, 0xe8, 0xcb, 0x40, 0x1e, 0xb8, 0x63, 0xb5, 0xa8, 0x84, 0x68, 0x9a, 0x86, 0x3b, 0xb4, 0x16, 0x58, 0x79, 0xd3, 0x07, 0xa1, 0xa4, 0x5f, 0x10, 0xcc, - 0xa3, 0xb1, 0x7a, 0xfc, 0x1d, 0x90, 0x37, 0xc7, 0x3e, 0xba, 0xe4, 0x20, 0xc4, 0x8d, 0x53, 0x98, 0xbe, 0x12, 0xf7, 0xe7, 0xb9, 0xcc, 0xdd, 0x58, 0xf1, 0x9e, 0x68, 0x32, 0xc0, 0xeb, 0xa4, 0x53, - 0x3d, 0x9d, 0x5a, 0x52, 0xd2, 0x76, 0xc4, 0xa1, 0x7e, 0x75, 0xf1, 0xea, 0xe2, 0x12, 0xa4, 0xd3, 0x22, 0x39, 0xee, 0xb7, 0x81, 0x41, 0xfa, 0xef, 0x38, 0x7d, 0x45, 0x48, 0x89, 0xf2, 0x7d, 0xe3, - 0x4d, 0xbf, 0x2f, 0x2b, 0x98, 0x51, 0xa1, 0x4e, 0x3a, 0xc0, 0x34, 0x9d, 0xa9, 0x55, 0xa1, 0x43, 0xb1, 0x1b, 0x14, 0x09, 0x31, 0x18, 0x6b, 0xc2, 0x1a, 0x38, 0xaa, 0x0e, 0x24, 0x43, 0xa3, 0xa2, - 0xb7, 0x4d, 0x46, 0x63, 0x8e, 0x89, 0x0e, 0x5d, 0x67, 0xd1, 0x14, 0x39, 0x26, 0x8b, 0x22, 0x5d, 0xc3, 0x64, 0x80, 0x89, 0x86, 0x93, 0xbf, 0x8e, 0x9c, 0x5c, 0xe2, 0x51, 0x0d, 0x47, 0x3f, 0x12, - 0x05, 0x5e, 0x1f, 0xfd, 0x7d, 0x02, 0xbf, 0x0b, 0x80, 0xc9, 0xfb, 0x93, 0xd4, 0x42, 0x74, 0x61, 0x12, 0xd6, 0x3d, 0xd6, 0xfb, 0x7d, 0x98, 0x7e, 0x61, 0x72, 0x3b, 0x33, 0x9c, 0x70, 0x8f, 0x6a, - 0x40, 0xcf, 0x86, 0x5c, 0x0d, 0x2f, 0xab, 0x8b, 0xfd, 0x3b, 0xa3, 0x6b, 0x78, 0x79, 0x60, 0x9c, 0x67, 0xbe, 0x86, 0x51, 0x01, 0x95, 0x16, 0x4f, 0x2e, 0x8d, 0x2b, 0x43, 0xfb, 0x86, 0xe5, 0x5d, - 0x8d, 0x43, 0xf5, 0xe4, 0x64, 0x30, 0x03, 0x56, 0xf8, 0x2c, 0x97, 0xbd, 0xc5, 0x62, 0xf4, 0x4d, 0x05, 0x4b, 0xab, 0x33, 0xa1, 0xbd, 0xa5, 0x75, 0x01, 0xf4, 0x9e, 0x11, 0x9a, 0x24, 0x58, 0x33, - 0x2e, 0xa1, 0x4c, 0xa6, 0x37, 0x7f, 0x62, 0x59, 0x3a, 0x07, 0x88, 0xf5, 0x71, 0x6e, 0x0d, 0x77, 0x09, 0xcb, 0xbc, 0x39, 0x3d, 0x2e, 0x0c, 0x07, 0xbf, 0x16, 0xd2, 0x69, 0xd0, 0x39, 0x6a, 0x41, - 0x16, 0x24, 0x7c, 0x28, 0x79, 0xc1, 0x1d, 0xfa, 0xc1, 0x28, 0x4c, 0x3b, 0x2a, 0x07, 0xfc, 0x10, 0xe7, 0xe8, 0x1d, 0x06, 0x64, 0x50, 0x36, 0x72, 0x40, 0x5f, 0x7f, 0x4d, 0x6d, 0x4a, 0x68, 0x13, - 0x70, 0x32, 0xd9, 0x3c, 0xf3, 0x83, 0x26, 0xf5, 0x84, 0xbe, 0x32, 0x34, 0x7d, 0xfd, 0x70, 0x73, 0x7f, 0xfb, 0xf9, 0xcd, 0xd5, 0xd5, 0xcd, 0xfd, 0xc7, 0xd9, 0x65, 0xa9, 0xec, 0x61, 0x1c, 0x1e, - 0x5a, 0xa6, 0xfc, 0xd2, 0xaa, 0xda, 0xb9, 0x36, 0x40, 0x7d, 0xc6, 0x79, 0x9e, 0x66, 0x30, 0x84, 0xb4, 0xdf, 0xb3, 0xc9, 0xbb, 0xfb, 0x8f, 0x57, 0x9f, 0x6f, 0xdf, 0xfe, 0x7c, 0x7d, 0x37, 0xbb, - 0x7d, 0x68, 0x04, 0xba, 0xc1, 0x78, 0x72, 0x49, 0x1b, 0x18, 0xa4, 0x37, 0x89, 0xfa, 0x0a, 0xde, 0x38, 0x0d, 0xa6, 0xcd, 0xd3, 0xd9, 0x92, 0x5f, 0x60, 0xc8, 0x2b, 0xf8, 0xc4, 0xda, 0xc4, 0x50, - 0xef, 0x69, 0xd9, 0x07, 0xd4, 0xe3, 0x5a, 0xa5, 0x18, 0xd2, 0xff, 0x42, 0xeb, 0x69, 0x09, 0x32, 0x61, 0xa7, 0x90, 0xb9, 0x8d, 0x76, 0x53, 0xce, 0xf8, 0xdf, 0xc1, 0x1d, 0xad, 0x72, 0x06, 0xf7, - 0xb7, 0xbf, 0xe4, 0x4d, 0x96, 0xc0, 0xe5, 0xa2, 0xd5, 0x39, 0xac, 0x3a, 0xa3, 0xba, 0xed, 0x36, 0x90, 0x96, 0x09, 0x16, 0x18, 0x60, 0x30, 0xb2, 0x34, 0x0b, 0x8c, 0x6b, 0xa9, 0xd9, 0x9b, 0xf9, - 0xff, 0x16, 0xbe, 0xff, 0x3b, 0xdd, 0x16, 0x09, 0x13, 0x82, 0xe8, 0xed, 0x59, 0x69, 0xf1, 0x7b, 0x39, 0xe4, 0xd5, 0xf4, 0x42, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xff, - 0xc5, 0x70, 0x1e, 0xeb, 0x03, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, - 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, - 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, - 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, - 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, - 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, - 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, - 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x94, 0x52, 0x4d, 0x8f, 0xda, 0x30, 0x10, 0xbd, 0xe7, 0x57, 0x4c, 0x39, 0x54, 0x89, 0x44, - 0xe1, 0x6e, 0xb6, 0x48, 0xd5, 0xb2, 0x52, 0x6f, 0x95, 0x76, 0x7b, 0x07, 0xc7, 0x1e, 0x07, 0xab, 0xce, 0x38, 0xf2, 0x07, 0x2c, 0x5a, 0xe5, 0xbf, 0x57, 0xb6, 0x21, 0x1b, 0x24, 0x7a, 0xa8, 0x0f, - 0x06, 0xcf, 0xbc, 0x99, 0x79, 0xef, 0x65, 0xa2, 0x47, 0xe0, 0x22, 0xe8, 0xf7, 0xfd, 0x19, 0x5b, 0xc6, 0x3e, 0xca, 0xed, 0xd1, 0xa8, 0x25, 0xec, 0x78, 0xe0, 0xe3, 0xb8, 0xa9, 0xaa, 0xf5, 0x7a, - 0x0d, 0xaf, 0x91, 0x40, 0x44, 0x1f, 0x6c, 0x0f, 0xc2, 0x92, 0xd2, 0x5d, 0x74, 0x3c, 0x68, 0x4b, 0xc0, 0x3d, 0x0c, 0xdc, 0x05, 0xb0, 0x0a, 0xc2, 0x11, 0x81, 0x0f, 0x83, 0xd1, 0xa2, 0xa4, 0xda, - 0xa8, 0x8d, 0xd4, 0xd4, 0xe5, 0x06, 0x83, 0xb3, 0x02, 0xbd, 0x5f, 0xa5, 0x47, 0x0e, 0xfc, 0x3e, 0x6a, 0x0f, 0x2a, 0x92, 0xc8, 0x58, 0x7f, 0xb4, 0xd1, 0xc8, 0xd4, 0x3b, 0x70, 0x4d, 0xc0, 0x8d, - 0x79, 0x3c, 0x4e, 0x59, 0x07, 0x17, 0x1b, 0xdd, 0x67, 0xe5, 0x6c, 0xe2, 0x67, 0xf3, 0xc3, 0xe1, 0xe0, 0xa2, 0x0f, 0xf9, 0xbf, 0xa2, 0xa9, 0x07, 0xd6, 0x42, 0x75, 0x0c, 0xbe, 0xf6, 0x31, 0x40, - 0x96, 0xfa, 0x86, 0xee, 0xa4, 0x05, 0x3e, 0xe7, 0x7c, 0x03, 0x1f, 0xb9, 0x20, 0x1d, 0x83, 0x01, 0x64, 0xbb, 0x97, 0x4e, 0x9f, 0xd0, 0xc1, 0x77, 0xe8, 0x2f, 0x7b, 0xd9, 0xd6, 0xcd, 0x66, 0x02, - 0x08, 0xd5, 0xad, 0x24, 0x0f, 0xbc, 0x9e, 0x50, 0x2b, 0x61, 0x2c, 0x61, 0xdd, 0x5c, 0x41, 0xe3, 0x8d, 0xc8, 0x4c, 0x31, 0x52, 0x22, 0x0f, 0x82, 0x13, 0x24, 0xe7, 0x27, 0x5a, 0x12, 0x1c, 0x7a, - 0x1b, 0x9d, 0x40, 0x0f, 0x9a, 0xee, 0x05, 0x3e, 0x16, 0x35, 0xc4, 0x16, 0xb8, 0xbf, 0x90, 0x48, 0xf2, 0x8e, 0x9c, 0xa4, 0xc1, 0x7a, 0xe2, 0x86, 0x27, 0xa4, 0xc0, 0xe0, 0x25, 0xfd, 0x2c, 0xa7, - 0x68, 0x61, 0xc9, 0x8a, 0xf0, 0xf4, 0x71, 0x9f, 0x76, 0xed, 0x2e, 0xc7, 0xb6, 0x05, 0xd4, 0xc0, 0xb7, 0x2d, 0xbc, 0xa2, 0x8f, 0x26, 0x3c, 0x95, 0xda, 0xf9, 0x6e, 0xbc, 0x38, 0x67, 0xdd, 0x76, - 0x66, 0xd1, 0xaf, 0x3f, 0x75, 0x46, 0x31, 0x26, 0x51, 0xf1, 0x68, 0x42, 0xdd, 0x34, 0x57, 0xe5, 0x89, 0xdd, 0x7f, 0xd9, 0x9e, 0x2d, 0xb7, 0x1d, 0x63, 0x9a, 0x94, 0xfd, 0x52, 0x2f, 0x9e, 0xaf, - 0x95, 0x9a, 0x3a, 0xf0, 0x05, 0xbc, 0x68, 0x36, 0xd5, 0xcd, 0x78, 0x3e, 0x0c, 0xfb, 0x6c, 0x7e, 0x92, 0xc1, 0x18, 0xe1, 0xb9, 0xfe, 0x99, 0x3d, 0x70, 0xa5, 0x70, 0x4e, 0xa9, 0xd9, 0x54, 0x63, - 0xd9, 0xe1, 0x1f, 0x04, 0xf8, 0xce, 0xfb, 0xc1, 0xe0, 0x6d, 0x5b, 0xa7, 0x25, 0xba, 0x5f, 0x32, 0x1f, 0x5c, 0x14, 0x21, 0x3a, 0x5c, 0x65, 0x25, 0xe5, 0x09, 0x77, 0x13, 0xae, 0x9c, 0x53, 0x9a, - 0x78, 0x8f, 0x0c, 0xde, 0x42, 0x22, 0xbb, 0x4c, 0xb3, 0x74, 0x3f, 0x18, 0xd8, 0x15, 0x02, 0x79, 0x61, 0x1f, 0x55, 0x2a, 0x82, 0x89, 0x63, 0xf2, 0xfd, 0x11, 0x26, 0x9d, 0x7f, 0xc5, 0xd3, 0x99, - 0x4f, 0x66, 0x4c, 0x39, 0xdb, 0xd7, 0x8b, 0xb3, 0x75, 0x46, 0x2e, 0x9a, 0xe5, 0x04, 0x1c, 0xab, 0x72, 0x8f, 0xd5, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc5, 0x03, 0xda, - 0x36, 0xc8, 0x01, 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0xcc, 0x55, 0x4d, 0x6f, 0xe3, 0x36, 0x10, 0xbd, 0xeb, 0x57, 0x30, 0x5a, 0xa0, 0xa5, 0x0a, 0x55, 0x6e, 0xaf, 0xf4, 0x26, 0xc5, 0x6e, 0x1b, 0xa0, 0xdb, 0x43, - 0x0f, 0x9b, 0xa2, 0x97, 0x20, 0x10, 0x68, 0x69, 0x9c, 0xb0, 0xa5, 0x48, 0x85, 0x1c, 0xda, 0x6b, 0x18, 0xfa, 0xef, 0xc5, 0x90, 0x8c, 0x2c, 0xe7, 0xa3, 0x45, 0x2f, 0x45, 0x7d, 0xb1, 0xc8, 0xf9, - 0x7e, 0xef, 0x8d, 0x14, 0x3c, 0xb0, 0xce, 0x49, 0x04, 0x21, 0x3a, 0x6b, 0xb6, 0xea, 0x5e, 0x88, 0x9f, 0xa5, 0xe9, 0x35, 0xb8, 0x1f, 0xe3, 0x71, 0x5d, 0x90, 0x87, 0xec, 0x50, 0x7d, 0x69, 0xf7, - 0xb0, 0x11, 0x62, 0x0f, 0x9b, 0x74, 0xd7, 0x69, 0x1b, 0x7a, 0xd8, 0x81, 0x41, 0x2f, 0xc4, 0x31, 0x3e, 0x08, 0xf1, 0x93, 0x44, 0x59, 0xb3, 0x6b, 0x3a, 0xe4, 0xbf, 0x8f, 0x41, 0xe9, 0x1e, 0xdc, - 0xf9, 0xe9, 0xf7, 0xef, 0xbf, 0x9b, 0x52, 0x16, 0x6d, 0xef, 0x85, 0x50, 0x66, 0x6b, 0xd3, 0xd1, 0x83, 0xeb, 0xa1, 0xfd, 0xc3, 0x5b, 0x23, 0xc4, 0x71, 0xeb, 0xec, 0xd0, 0x7a, 0xad, 0x3a, 0xa8, - 0x59, 0x7a, 0x46, 0x57, 0x33, 0x32, 0x4e, 0xeb, 0xa2, 0x58, 0xad, 0xd8, 0xa7, 0x61, 0xd4, 0x30, 0x80, 0x41, 0x76, 0xb0, 0xc1, 0xb1, 0x6d, 0x30, 0x1d, 0x2a, 0x6b, 0xbe, 0xf6, 0x94, 0x56, 0x75, - 0xec, 0x01, 0x1c, 0x14, 0x63, 0xd8, 0x30, 0xe9, 0x0f, 0xa6, 0x63, 0x5b, 0xc3, 0x1e, 0xe2, 0x6c, 0xbc, 0x60, 0x8c, 0xb1, 0xd4, 0x72, 0x6e, 0x36, 0xde, 0x64, 0x04, 0x58, 0x1c, 0x94, 0x46, 0x79, - 0x7f, 0x86, 0xc5, 0x55, 0x5d, 0x54, 0xec, 0xdb, 0x2b, 0xf6, 0x19, 0x7c, 0xd0, 0xf8, 0x3e, 0x4f, 0xb9, 0xc0, 0xe6, 0xda, 0x39, 0xeb, 0xae, 0xd8, 0x31, 0x26, 0xa3, 0xa1, 0x2e, 0x78, 0x99, 0xab, - 0x1c, 0xa7, 0xb2, 0x4e, 0x15, 0xab, 0x75, 0x11, 0xed, 0x1a, 0x90, 0x29, 0x33, 0x06, 0x64, 0x97, 0x6c, 0x90, 0xd8, 0x3d, 0x24, 0x73, 0xd3, 0x4b, 0x94, 0xbc, 0xca, 0x49, 0xe8, 0x77, 0x63, 0x07, - 0xe0, 0xd4, 0x8d, 0x10, 0x1f, 0x95, 0x91, 0xee, 0xc0, 0x77, 0x55, 0xc5, 0x2e, 0xaf, 0xd8, 0x09, 0x1f, 0xbe, 0xab, 0x7e, 0xa8, 0x5f, 0x0b, 0xb8, 0x41, 0xa7, 0xcc, 0xfd, 0x79, 0x00, 0xba, 0x37, - 0xdd, 0x7f, 0xf1, 0xd6, 0x3c, 0x39, 0xef, 0x1a, 0xb4, 0xad, 0xdd, 0x1b, 0xe8, 0x79, 0x75, 0x72, 0xfe, 0xd5, 0x1a, 0x20, 0x2b, 0xb1, 0x70, 0xc1, 0x8f, 0xac, 0x34, 0x72, 0x80, 0x52, 0x64, 0xe8, - 0x1a, 0x3a, 0xb1, 0x29, 0xfb, 0x4f, 0x79, 0xd2, 0x67, 0xcc, 0x0b, 0x41, 0x7d, 0xf0, 0x04, 0xc6, 0x9c, 0xb8, 0xf1, 0x36, 0xb8, 0x0e, 0x78, 0x49, 0x2c, 0x8a, 0xd5, 0x2a, 0x31, 0xe5, 0xca, 0x85, - 0x07, 0x1e, 0x92, 0xb5, 0x81, 0x2f, 0x92, 0x98, 0x5f, 0xda, 0x22, 0x6a, 0xa5, 0x1c, 0x47, 0xad, 0x3a, 0x49, 0x22, 0x58, 0x51, 0x87, 0x65, 0x7d, 0x6a, 0xf4, 0x01, 0xb4, 0xb6, 0xa5, 0x48, 0x98, - 0xdf, 0xa6, 0xbe, 0xef, 0xd8, 0x54, 0x2d, 0x92, 0x6c, 0xa8, 0x47, 0xbe, 0xb8, 0x18, 0xe4, 0xd8, 0x82, 0x73, 0x7c, 0xc1, 0x31, 0x10, 0xc7, 0x99, 0xea, 0x4f, 0x06, 0xc1, 0x19, 0xa9, 0x6f, 0xc0, - 0xed, 0xc0, 0xc5, 0xab, 0xaa, 0x98, 0x8a, 0xe2, 0xdd, 0x6d, 0xb7, 0xbd, 0xe7, 0x08, 0x1e, 0xab, 0xbb, 0x62, 0xb0, 0x3d, 0xa3, 0x47, 0x9f, 0x29, 0x8d, 0x32, 0x0f, 0x23, 0x38, 0x21, 0xbe, 0xc9, - 0x00, 0x6d, 0x4d, 0xc6, 0x8f, 0x47, 0x7d, 0xbd, 0x25, 0xbf, 0x85, 0x26, 0x66, 0x17, 0x21, 0x0c, 0xec, 0xf9, 0x99, 0x9f, 0x10, 0x3d, 0x6c, 0x65, 0xd0, 0xc8, 0xf3, 0x6c, 0x53, 0xaa, 0xf2, 0xee, - 0x36, 0x8d, 0xe1, 0x50, 0x08, 0x6a, 0xe8, 0x2e, 0xde, 0xce, 0xab, 0xb1, 0x93, 0x5a, 0xf5, 0x6d, 0x44, 0xe7, 0x4c, 0x7e, 0xa4, 0xd3, 0x21, 0x9c, 0xb4, 0x7a, 0x9d, 0x36, 0x7d, 0xae, 0xb1, 0x9e, - 0x3d, 0xa3, 0x47, 0xe3, 0x01, 0xdb, 0x7f, 0x62, 0xe3, 0x49, 0x35, 0xe5, 0xc6, 0x5a, 0xf4, 0x87, 0x72, 0xaa, 0x16, 0x69, 0xa8, 0xa0, 0x03, 0x3f, 0xb2, 0xcb, 0xa7, 0x75, 0x8d, 0x89, 0xeb, 0x19, - 0xa3, 0xaa, 0x91, 0x7b, 0xa9, 0xf0, 0x14, 0x21, 0xbd, 0x07, 0x87, 0x17, 0x9c, 0xa2, 0x1a, 0xe5, 0x5b, 0xfb, 0x27, 0x5f, 0x26, 0x4c, 0xdb, 0x15, 0x8d, 0xc1, 0xec, 0x9d, 0x1c, 0x79, 0xf5, 0x72, - 0xcb, 0xd8, 0x2b, 0x9b, 0x60, 0x03, 0x8e, 0x01, 0xd3, 0x3a, 0xa4, 0x1a, 0x2d, 0x3c, 0x5e, 0xf0, 0xa7, 0xae, 0x6b, 0x96, 0x1c, 0x6e, 0xb3, 0xb6, 0xee, 0x16, 0x7b, 0x42, 0xbf, 0x96, 0xe2, 0x46, - 0x69, 0x54, 0x77, 0xb1, 0x5c, 0xa1, 0xe9, 0x5f, 0x90, 0x62, 0xec, 0x1b, 0x8c, 0x9c, 0x03, 0xf4, 0x9c, 0x93, 0xff, 0x11, 0x56, 0x7b, 0xeb, 0x74, 0xff, 0x5f, 0x40, 0xa5, 0x4c, 0x52, 0x70, 0x7c, - 0xaf, 0x9c, 0xb5, 0xfb, 0xec, 0x0b, 0x76, 0xa4, 0xe0, 0x9a, 0x56, 0xa8, 0x66, 0x1f, 0xc6, 0x71, 0x5a, 0xbf, 0x90, 0xba, 0x1c, 0x09, 0x5b, 0x72, 0xa3, 0x6f, 0x93, 0xc2, 0xd6, 0x83, 0xdb, 0xd1, - 0x6b, 0xf6, 0xc3, 0x38, 0xa6, 0x85, 0xab, 0x1a, 0x67, 0x03, 0x02, 0x2f, 0x57, 0x65, 0x9d, 0x96, 0x71, 0xb4, 0x1e, 0x79, 0xd5, 0xa0, 0xe5, 0x89, 0x93, 0xea, 0x25, 0xf4, 0x89, 0xb7, 0xc7, 0x39, - 0xf5, 0x6f, 0xe0, 0xf1, 0x33, 0x3c, 0x86, 0x78, 0xc8, 0xf1, 0xc1, 0x29, 0x4a, 0x4a, 0x89, 0x5a, 0x97, 0x6c, 0xfc, 0xf5, 0xdd, 0x48, 0x39, 0x3a, 0xa9, 0xf5, 0xdc, 0xde, 0x57, 0xb9, 0xf9, 0x9a, - 0xca, 0xfc, 0x3d, 0xf3, 0x1e, 0x25, 0x06, 0xcf, 0x2b, 0x92, 0x40, 0xa7, 0x15, 0x18, 0x6c, 0xe3, 0x9b, 0x6d, 0x16, 0xc3, 0x54, 0x4c, 0xc5, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, - 0x08, 0x36, 0xb0, 0x7a, 0x13, 0x17, 0x03, 0x00, 0x00, 0x1d, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, - 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x7c, 0x52, 0x4d, 0x8f, 0xda, 0x30, 0x10, 0xbd, 0xe7, 0x57, 0x8c, 0xd2, 0x8b, 0x2d, 0xa5, 0x81, 0xbd, 0x54, 0xab, 0xa1, 0x50, 0xd1, 0x6a, 0xa5, 0x3d, - 0xb4, 0x65, 0x45, 0xb9, 0x55, 0x55, 0x64, 0xc8, 0x84, 0x58, 0x18, 0x3b, 0x1a, 0x3b, 0x49, 0x2b, 0xe0, 0xbf, 0x57, 0xf9, 0x10, 0x65, 0x69, 0xd5, 0xe1, 0xc0, 0xf8, 0x79, 0x5e, 0xde, 0xd3, 0x1b, - 0xd7, 0x9e, 0x40, 0xed, 0x82, 0xfe, 0x99, 0xb5, 0xb4, 0x45, 0x3c, 0xb5, 0xb4, 0x4d, 0x60, 0x59, 0x55, 0x09, 0x3c, 0x87, 0x50, 0xad, 0xc9, 0x57, 0xce, 0x7a, 0x1a, 0x4e, 0xdf, 0x88, 0x1b, 0xe2, - 0xcb, 0x2c, 0xea, 0x48, 0x64, 0x9b, 0xcc, 0xb8, 0xfd, 0x9e, 0x18, 0x94, 0x07, 0x32, 0x6e, 0x3f, 0x8b, 0xa2, 0xa3, 0xcb, 0x61, 0xe7, 0x6c, 0xa1, 0xf7, 0xb3, 0xbe, 0x2f, 0x95, 0xcd, 0x0d, 0xf1, - 0x2c, 0x8a, 0xde, 0x7c, 0xbf, 0x51, 0x39, 0x2a, 0x6d, 0x7f, 0x44, 0xca, 0xff, 0xb2, 0x3b, 0x28, 0x2c, 0x74, 0x47, 0x21, 0xe1, 0xed, 0x02, 0x7c, 0xc8, 0x11, 0xb5, 0x43, 0x5c, 0x93, 0xaf, 0x4d, - 0x78, 0x2f, 0xe4, 0x02, 0x4e, 0x11, 0x00, 0xf4, 0x02, 0x88, 0x1f, 0x6b, 0x6d, 0x72, 0x62, 0xc4, 0x82, 0xdd, 0x31, 0x23, 0xdb, 0x88, 0x01, 0x7f, 0xb2, 0x0d, 0x62, 0x4e, 0x85, 0xaa, 0x4d, 0x10, - 0x32, 0x1d, 0xbb, 0xac, 0xd0, 0x26, 0x10, 0x67, 0x8e, 0x45, 0xac, 0x6d, 0xe1, 0x92, 0xab, 0x85, 0x79, 0xab, 0xd8, 0xc6, 0x52, 0xa6, 0xda, 0xea, 0x20, 0xe4, 0x2c, 0xea, 0x35, 0x0c, 0x05, 0xa8, - 0x1c, 0x07, 0x84, 0xfa, 0xe1, 0x1d, 0xcc, 0xe1, 0xa8, 0xc2, 0xae, 0x1c, 0x3c, 0x51, 0x27, 0xd0, 0x28, 0x16, 0xf1, 0xcb, 0x6a, 0xbd, 0x89, 0xe5, 0xe8, 0xaa, 0xab, 0xd5, 0x41, 0x34, 0x12, 0xe6, - 0x0b, 0x68, 0xd2, 0x4a, 0xb1, 0x27, 0x21, 0xd3, 0xda, 0xb6, 0xac, 0x2a, 0x21, 0x93, 0xeb, 0xd0, 0x13, 0xb3, 0xc8, 0xfa, 0xa9, 0xc7, 0xe9, 0xe3, 0x74, 0xc0, 0x2f, 0xa3, 0xec, 0x64, 0x02, 0x9f, - 0x98, 0x54, 0x20, 0x08, 0x25, 0xc1, 0xf3, 0x66, 0xf3, 0x02, 0xbe, 0x4f, 0xba, 0xbf, 0xfd, 0x13, 0x3c, 0xa2, 0xa5, 0x56, 0x9c, 0xcf, 0x37, 0xda, 0xcb, 0xaa, 0x1a, 0x50, 0x79, 0x85, 0xba, 0x4a, - 0x7b, 0xf9, 0xdb, 0xc0, 0x75, 0x9e, 0x1b, 0x6a, 0x15, 0x13, 0xe2, 0xe7, 0x7e, 0x69, 0x37, 0x71, 0xdd, 0x71, 0x87, 0xfd, 0xd5, 0x4c, 0x62, 0xe8, 0x10, 0xaf, 0xc8, 0xdd, 0x24, 0xbb, 0x3a, 0x90, - 0x88, 0x27, 0x71, 0x02, 0xbd, 0x4a, 0xe5, 0x7c, 0x97, 0x7e, 0x70, 0x62, 0xdc, 0x3b, 0xe2, 0xd0, 0xdc, 0x4b, 0xdc, 0x13, 0xf7, 0x34, 0xf2, 0x6e, 0xdf, 0x1c, 0xe2, 0x17, 0x0a, 0xa5, 0xcb, 0xbf, - 0xba, 0xb0, 0x34, 0xc6, 0xb5, 0x94, 0xff, 0xfb, 0x33, 0xaf, 0xb0, 0xae, 0xe2, 0x49, 0x49, 0xca, 0x84, 0x72, 0x72, 0xca, 0x50, 0x30, 0xa9, 0x5c, 0x5b, 0xf2, 0xfe, 0x6c, 0x74, 0x43, 0x5d, 0x23, - 0x2f, 0x71, 0xf2, 0x17, 0xe7, 0x7f, 0x36, 0x56, 0x07, 0xf9, 0x9a, 0x30, 0xd8, 0xb8, 0x0c, 0x7f, 0xe9, 0x56, 0xdb, 0x5c, 0x88, 0x78, 0x9a, 0xf6, 0xbf, 0x38, 0xe9, 0x9f, 0x90, 0x94, 0x1f, 0x86, - 0xdb, 0xd6, 0xf1, 0x81, 0xd8, 0x8b, 0x87, 0x71, 0x9a, 0x6b, 0x3b, 0x2e, 0x2b, 0x55, 0xad, 0xd2, 0x21, 0xba, 0x44, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x1f, 0x66, 0x64, - 0xc8, 0xd2, 0x01, 0x00, 0x00, 0x83, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x2a, 0x49, 0x2c, 0x4a, 0x4f, 0x2d, 0xd1, 0xe7, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, - 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0xb4, 0x7d, 0x4d, 0x6f, 0x1c, 0x49, 0x8f, 0xe6, 0xbd, 0x7f, 0x85, 0xd1, 0x73, - 0x9c, 0x96, 0x5f, 0x46, 0x04, 0x19, 0x0c, 0x2e, 0x30, 0xc0, 0x02, 0x7b, 0xda, 0xfb, 0xde, 0x06, 0x03, 0x83, 0x9f, 0xb2, 0xa6, 0x65, 0x95, 0x57, 0x1f, 0xdd, 0xed, 0xf9, 0xf5, 0x8b, 0x2c, 0xc9, - 0xb6, 0x54, 0xaa, 0x92, 0x7b, 0xde, 0x2d, 0xa3, 0x0f, 0x5d, 0x99, 0x4a, 0xc9, 0xc9, 0xe0, 0xd7, 0xf3, 0x90, 0x8c, 0xa8, 0x7f, 0x79, 0xf7, 0x7f, 0x3e, 0x5e, 0xdd, 0xbd, 0xab, 0xab, 0xeb, 0x7c, - 0x77, 0x75, 0xf7, 0x4e, 0x1f, 0xee, 0x77, 0x9f, 0xf4, 0xfe, 0xca, 0xf5, 0xfa, 0xfa, 0xcb, 0xbb, 0xff, 0x79, 0x99, 0x37, 0x79, 0xab, 0xf7, 0x19, 0xef, 0xec, 0xcb, 0xbb, 0xff, 0xa5, 0xb7, 0x97, - 0xbb, 0xf7, 0xbf, 0xfc, 0xcb, 0xbb, 0xff, 0x7d, 0xbf, 0x3d, 0x7a, 0xb3, 0xbb, 0x7f, 0x77, 0x75, 0x73, 0x9f, 0x37, 0x91, 0xf1, 0xae, 0x76, 0xb7, 0xef, 0x3e, 0xe9, 0xcd, 0x83, 0x5e, 0xbf, 0xcb, - 0xb8, 0xba, 0xbf, 0xba, 0xb9, 0x7c, 0xff, 0xcb, 0x1f, 0x79, 0x7b, 0x77, 0xb5, 0xbb, 0x79, 0xf7, 0x6f, 0xef, 0xc6, 0x2f, 0xbf, 0xfc, 0xfb, 0xbf, 0x7f, 0x56, 0xff, 0x5d, 0x2f, 0xf3, 0x3f, 0xfe, - 0xe3, 0x97, 0x1b, 0xfd, 0x94, 0xef, 0xfe, 0xed, 0xdd, 0xaf, 0xea, 0xf7, 0x57, 0x7f, 0x5d, 0xf8, 0x2e, 0xd2, 0x7f, 0x7d, 0xf6, 0xf4, 0xaf, 0xf0, 0x9e, 0xde, 0xc3, 0xaf, 0xbf, 0xdc, 0xed, 0x1e, - 0x6e, 0x7d, 0xff, 0xe0, 0x6d, 0x5e, 0x5e, 0xdd, 0xdd, 0xdf, 0x7e, 0xf9, 0xd7, 0x8f, 0xf7, 0xf7, 0x9f, 0xef, 0xfe, 0xc7, 0x3f, 0xfe, 0x71, 0x79, 0x75, 0xff, 0xf1, 0xc1, 0xde, 0xfb, 0xee, 0xd3, - 0x3f, 0x6e, 0x1f, 0xee, 0xee, 0x2f, 0xae, 0xf5, 0xe6, 0xf2, 0x1f, 0xbe, 0xbd, 0xe9, 0xdd, 0xfb, 0xab, 0xdd, 0xc5, 0xd5, 0x4d, 0xe4, 0x5f, 0xbf, 0xfe, 0xe2, 0x1f, 0xd3, 0x7f, 0xbf, 0x7b, 0xf8, - 0xb4, 0xfd, 0x09, 0x62, 0x65, 0x22, 0x41, 0x40, 0xe5, 0x1a, 0xc4, 0xa3, 0x75, 0x56, 0x35, 0x1a, 0x0e, 0xcb, 0x73, 0xb0, 0x4e, 0x9f, 0x3a, 0x1a, 0xf9, 0x60, 0xd4, 0xd1, 0x80, 0xa1, 0x86, 0x4b, - 0xf3, 0x68, 0xb6, 0xfd, 0x46, 0xfe, 0xfa, 0x4b, 0xe4, 0xe7, 0x4d, 0xd6, 0x1b, 0xbf, 0xca, 0xbb, 0x77, 0xff, 0xf6, 0xee, 0xdf, 0x7f, 0x79, 0xf7, 0xab, 0x5d, 0xdd, 0xd7, 0xb5, 0x5e, 0xde, 0xfd, - 0xfa, 0xdb, 0x76, 0xf1, 0xe5, 0x3e, 0x1f, 0x3f, 0xd5, 0xc3, 0xfd, 0xc3, 0x6d, 0xde, 0x5d, 0xf8, 0xee, 0x36, 0x5f, 0xdc, 0xb8, 0xbb, 0xba, 0xf9, 0x7d, 0x7f, 0xe3, 0x7a, 0x77, 0xb9, 0xff, 0xff, - 0xa7, 0xfc, 0xe4, 0x1f, 0x6f, 0xf7, 0x1f, 0x3f, 0x5f, 0xdd, 0x5c, 0x7c, 0xbe, 0xdd, 0xfd, 0x67, 0xfa, 0xfd, 0xc5, 0xf5, 0xd5, 0xfd, 0xe3, 0x2f, 0xde, 0xef, 0x7e, 0xbf, 0xda, 0x7d, 0xff, 0x74, - 0xf1, 0x70, 0x7f, 0x75, 0xfd, 0xeb, 0x6f, 0xbf, 0xfc, 0xc7, 0x5b, 0xeb, 0xb9, 0xad, 0xd1, 0x8b, 0xe5, 0x1c, 0xef, 0xc7, 0xfb, 0x76, 0xe6, 0xe5, 0xf4, 0x0e, 0x2c, 0x1d, 0x27, 0xc9, 0xf4, 0xb6, - 0x0c, 0x75, 0x8c, 0xec, 0x8c, 0x9a, 0x0d, 0x1c, 0x92, 0x60, 0xb6, 0x51, 0x18, 0xa3, 0x2b, 0x36, 0x59, 0x09, 0xe2, 0x6c, 0x32, 0x98, 0x1b, 0xb4, 0x51, 0x19, 0x8c, 0x47, 0x97, 0xf3, 0xb9, 0x3d, - 0xfc, 0xf6, 0xed, 0xfa, 0xf6, 0xfe, 0xd9, 0xc5, 0x5d, 0xde, 0xfe, 0x71, 0xe5, 0xf9, 0xec, 0xce, 0xb6, 0x24, 0x8f, 0xcb, 0xae, 0x1f, 0xf5, 0xee, 0xe3, 0x3b, 0x78, 0xbf, 0xde, 0x8f, 0x47, 0x85, - 0xe8, 0x5d, 0x4e, 0x7c, 0xfc, 0xf8, 0x42, 0x51, 0xb7, 0xbb, 0xfb, 0xeb, 0xab, 0x03, 0x9d, 0xed, 0x3f, 0xdd, 0xdf, 0x5e, 0xdd, 0x3c, 0x2a, 0x26, 0xf2, 0xf6, 0xea, 0x8f, 0xfc, 0xf0, 0xe9, 0xab, - 0x06, 0xf3, 0xc6, 0x77, 0x71, 0x75, 0x73, 0xf9, 0xe1, 0xf6, 0x49, 0xc5, 0xd7, 0x7a, 0x9f, 0xfd, 0xb8, 0xb6, 0x3f, 0x3e, 0xde, 0xdf, 0xeb, 0xe1, 0xeb, 0x07, 0xbd, 0xbd, 0xcb, 0x6f, 0x17, 0xa1, - 0x4f, 0xea, 0xbd, 0xba, 0xdf, 0xe9, 0xbb, 0xf6, 0x1e, 0xde, 0xcf, 0x47, 0xab, 0xd0, 0x9b, 0xcb, 0x07, 0xbd, 0xcc, 0x8b, 0xfb, 0xaf, 0xaf, 0x7a, 0xbd, 0x73, 0xbd, 0xbe, 0xf0, 0x8f, 0x7a, 0x73, - 0x93, 0xd7, 0x8f, 0x16, 0x73, 0xf5, 0xe9, 0xf1, 0x77, 0x3f, 0xe7, 0xad, 0xe7, 0xcd, 0xfd, 0xc5, 0xd7, 0x37, 0x3b, 0x6d, 0x44, 0xb7, 0x7a, 0x13, 0xfb, 0x0f, 0x77, 0x1f, 0xb5, 0x3d, 0x7e, 0xf8, - 0xa4, 0xd7, 0xd7, 0x7f, 0x3c, 0xad, 0xf2, 0x09, 0x1b, 0x7b, 0xf7, 0xeb, 0xfd, 0xad, 0xfa, 0xd7, 0x3f, 0xfc, 0x5f, 0x77, 0xf7, 0xf1, 0x23, 0xc3, 0xfb, 0xa4, 0x7e, 0xbb, 0xbb, 0x3b, 0xf0, 0xe4, - 0xfe, 0x7e, 0x9c, 0xd9, 0xf4, 0x70, 0x92, 0xce, 0xc6, 0xdd, 0x6b, 0x8a, 0xc9, 0x04, 0x69, 0xbc, 0x5a, 0x83, 0xde, 0x63, 0x55, 0x17, 0x73, 0x30, 0x2e, 0x6d, 0x43, 0x96, 0x39, 0x16, 0x2f, 0x1b, - 0x8e, 0x73, 0x4e, 0x1e, 0x61, 0xad, 0xb7, 0x61, 0xf3, 0xa8, 0xe9, 0xfd, 0xdf, 0x87, 0xdd, 0xd3, 0x6a, 0xdd, 0x7d, 0xb9, 0xf9, 0x91, 0xa0, 0xb7, 0xbb, 0x87, 0xfb, 0xbc, 0x7d, 0x15, 0xb2, 0xce, - 0xed, 0x63, 0x31, 0x67, 0x15, 0x46, 0x47, 0x8e, 0x6e, 0x6d, 0xc2, 0x9a, 0xad, 0xb4, 0xaf, 0x39, 0x91, 0x38, 0x17, 0x31, 0xcc, 0x35, 0x06, 0x75, 0x5e, 0x08, 0x89, 0x6d, 0x8c, 0x5a, 0x85, 0xa2, - 0x8a, 0x7d, 0xe8, 0x58, 0x2c, 0x72, 0x3c, 0x64, 0xbd, 0xb4, 0xf3, 0x6f, 0x46, 0x7a, 0x9b, 0x97, 0xf9, 0xd7, 0xe3, 0x02, 0xe4, 0x6d, 0xe4, 0x81, 0x01, 0xbc, 0xbd, 0x1c, 0xf7, 0x2f, 0x96, 0xa2, - 0xbf, 0x5f, 0x67, 0x8f, 0xde, 0x8d, 0xfa, 0x24, 0x9b, 0xb6, 0xb2, 0x0f, 0xe4, 0xc9, 0x90, 0x36, 0xe6, 0x70, 0xe4, 0xf2, 0xe5, 0x4c, 0x1d, 0xb6, 0x10, 0x84, 0x22, 0x68, 0x9d, 0x9b, 0xf4, 0x1a, - 0x48, 0xe5, 0x96, 0x0c, 0xbc, 0x00, 0x6b, 0x1c, 0x8f, 0xde, 0x2f, 0xac, 0xf6, 0xa8, 0x27, 0x7f, 0x75, 0x8d, 0x37, 0xc5, 0xdf, 0x42, 0xd2, 0x81, 0x35, 0xf4, 0xf7, 0xfd, 0xec, 0x4b, 0x30, 0x72, - 0xcd, 0x36, 0x94, 0x29, 0x82, 0xc0, 0x1d, 0xa9, 0x90, 0x87, 0x67, 0x0e, 0x1f, 0x18, 0x24, 0x19, 0x93, 0xd9, 0xa1, 0xd8, 0x10, 0x71, 0x81, 0xe7, 0xb0, 0xb5, 0x59, 0x0e, 0x87, 0x53, 0x93, 0xd1, - 0xf9, 0x8d, 0x25, 0xf8, 0xdb, 0x11, 0xf6, 0x64, 0x62, 0xfb, 0x16, 0x33, 0x3e, 0x3d, 0x85, 0x92, 0x9b, 0x87, 0x4f, 0x1f, 0xfc, 0xf3, 0xc3, 0xe3, 0xaf, 0xdd, 0xed, 0xfc, 0xf7, 0xbc, 0xef, 0x87, - 0xd1, 0xe6, 0xef, 0x59, 0xd7, 0xd7, 0xf7, 0x79, 0xb9, 0xbe, 0xf0, 0xbe, 0x9f, 0x7b, 0x7d, 0x6d, 0x09, 0x0a, 0xb6, 0x5a, 0x6d, 0x79, 0x85, 0xb3, 0xbb, 0xa3, 0x49, 0x4e, 0x28, 0xe5, 0xa4, 0x61, - 0x04, 0xd8, 0xb5, 0xe7, 0xa2, 0xc9, 0x9d, 0xa1, 0xa4, 0x21, 0x07, 0x91, 0xb4, 0x25, 0x63, 0xf0, 0xd0, 0xa3, 0xeb, 0xfb, 0x6a, 0xc1, 0x3e, 0xeb, 0xdd, 0x53, 0x9c, 0x39, 0x12, 0xaa, 0xdf, 0x5c, - 0x87, 0x47, 0x2d, 0xbc, 0xcc, 0xeb, 0x70, 0xf6, 0x98, 0xb3, 0x96, 0xb6, 0xf0, 0xa8, 0x6a, 0x38, 0x67, 0x0e, 0xef, 0xb8, 0x56, 0x36, 0x37, 0xf2, 0x31, 0x95, 0xdb, 0xea, 0x9d, 0x09, 0x34, 0x70, - 0xac, 0x21, 0x32, 0xb8, 0x16, 0x45, 0x2f, 0x0c, 0xa9, 0x65, 0x0c, 0x14, 0xeb, 0xe8, 0x2a, 0x3c, 0x66, 0xb1, 0x3f, 0xf5, 0xf7, 0x3c, 0x09, 0x75, 0xde, 0x14, 0xfd, 0xcf, 0xb4, 0x17, 0x82, 0xe3, - 0xcf, 0x00, 0x34, 0x31, 0xdc, 0xb0, 0x97, 0xd0, 0x9c, 0x6a, 0x8d, 0x67, 0xb6, 0x2c, 0xb0, 0x65, 0x43, 0x97, 0x4c, 0xea, 0x02, 0xb3, 0x1b, 0x66, 0xf9, 0xb4, 0x84, 0xd6, 0x07, 0xe0, 0x04, 0x21, - 0x69, 0xe8, 0xe8, 0xcd, 0xe5, 0x78, 0x56, 0x39, 0x0e, 0x68, 0xbe, 0xc5, 0xdc, 0x57, 0x01, 0xe8, 0x45, 0x7a, 0xf9, 0xed, 0xb4, 0x7f, 0xbe, 0xf8, 0xe9, 0x9b, 0x90, 0xe8, 0xeb, 0xfa, 0xed, 0x5f, - 0xe2, 0x32, 0x6f, 0x1e, 0xef, 0x3e, 0x01, 0x25, 0x7e, 0xc2, 0x1d, 0x27, 0x51, 0x90, 0xd7, 0xe5, 0xc5, 0x55, 0x3d, 0x7e, 0xdc, 0xed, 0x7e, 0xbf, 0x7a, 0xfc, 0x47, 0x7e, 0x88, 0x8d, 0x7e, 0x18, - 0x25, 0xbe, 0xad, 0xc0, 0xdf, 0x00, 0x40, 0x4f, 0x40, 0xf9, 0x2b, 0xec, 0xd9, 0xdd, 0x78, 0x7e, 0xf0, 0xbc, 0xbe, 0x3e, 0x65, 0x49, 0xc7, 0x53, 0xd9, 0xfe, 0xd3, 0x87, 0xff, 0xbc, 0xdb, 0xdd, - 0x3c, 0xbb, 0x7c, 0xb8, 0xbd, 0xde, 0xbf, 0x7b, 0x3e, 0xc1, 0xa3, 0xe7, 0xa8, 0xe8, 0x45, 0xcc, 0xfa, 0xfa, 0x8f, 0x3f, 0xdc, 0xfe, 0x10, 0x7d, 0x3f, 0x5f, 0xeb, 0x97, 0x36, 0x7b, 0xfe, 0x94, - 0xd0, 0xfb, 0xec, 0x6d, 0x82, 0xb2, 0x66, 0x97, 0x1c, 0xd8, 0x88, 0x08, 0x75, 0x54, 0x2b, 0x07, 0x74, 0x9e, 0x68, 0x8d, 0x10, 0xbc, 0xb5, 0xa9, 0x4a, 0x1d, 0xe7, 0x1a, 0x1d, 0x16, 0xf0, 0xb2, - 0x8d, 0x0b, 0x99, 0x1f, 0x07, 0x08, 0xaf, 0x6c, 0xf0, 0xf3, 0xed, 0xce, 0x1f, 0x8d, 0xf4, 0x71, 0x35, 0xfe, 0x2e, 0x54, 0x8a, 0xeb, 0x83, 0xac, 0xd8, 0x7e, 0x42, 0xd4, 0xae, 0x3e, 0x3b, 0xb4, - 0x09, 0xe8, 0x8b, 0xad, 0x25, 0x34, 0x8b, 0x11, 0xb2, 0x6a, 0x05, 0x85, 0xe8, 0x2a, 0x37, 0x5b, 0x8d, 0x72, 0x79, 0x86, 0x61, 0xab, 0x72, 0xb7, 0x34, 0xb4, 0x22, 0x19, 0x3a, 0x68, 0xa3, 0x75, - 0xc7, 0x5f, 0x7e, 0xf3, 0x90, 0x03, 0x80, 0xb7, 0x79, 0xcb, 0x99, 0x5f, 0xde, 0x8d, 0x9a, 0xc2, 0x14, 0x8a, 0x55, 0x6b, 0x2c, 0x6b, 0x99, 0x00, 0x62, 0xa3, 0xac, 0xe6, 0xb4, 0x50, 0xe0, 0xe5, - 0x31, 0x91, 0x04, 0x3a, 0x74, 0x5d, 0x13, 0x75, 0xd5, 0xc8, 0xe5, 0xb8, 0x11, 0x55, 0x3c, 0x9e, 0xd2, 0x2f, 0xf3, 0x7e, 0x03, 0xfc, 0xbb, 0x4f, 0x47, 0xdc, 0xe5, 0x49, 0x9e, 0x0f, 0xfb, 0x97, - 0x78, 0x43, 0x75, 0x47, 0xa4, 0x5f, 0x67, 0xc7, 0xf1, 0xdd, 0x45, 0x6a, 0x62, 0xb4, 0x84, 0x89, 0x6b, 0xd5, 0xec, 0x50, 0x32, 0xfa, 0x64, 0xce, 0x8e, 0xe6, 0x33, 0xfb, 0x12, 0xa6, 0xd5, 0x65, - 0x01, 0x62, 0xd3, 0x14, 0xd0, 0xc9, 0x0d, 0x1b, 0x59, 0x70, 0x7a, 0xaf, 0xa3, 0xd2, 0x3f, 0x8b, 0x58, 0x67, 0x59, 0x88, 0xdd, 0x16, 0xc5, 0xf4, 0xee, 0xca, 0x7f, 0x7f, 0x65, 0x0d, 0x6d, 0x9d, - 0x79, 0x41, 0x5a, 0x0e, 0xf6, 0x0a, 0x4a, 0x9e, 0xc4, 0x1a, 0x8a, 0x54, 0x8c, 0x3d, 0x66, 0x8a, 0xb8, 0x12, 0xaf, 0x45, 0x0b, 0x8c, 0x9c, 0xba, 0x84, 0xf3, 0x2a, 0xad, 0xd6, 0xd2, 0x73, 0x86, - 0x33, 0xf4, 0x49, 0xf3, 0xf8, 0x82, 0x7c, 0xab, 0x30, 0x9c, 0x12, 0xf1, 0xfa, 0x7a, 0xe7, 0x17, 0x37, 0xbb, 0x8b, 0xbb, 0xfb, 0xb8, 0xbe, 0xb2, 0x57, 0x30, 0xeb, 0xdc, 0x5a, 0x1f, 0x94, 0x1b, - 0x70, 0x05, 0x14, 0xd0, 0x68, 0x8e, 0xa9, 0x49, 0x8e, 0xa3, 0x93, 0x75, 0x15, 0x2a, 0xea, 0x2d, 0xa0, 0x8f, 0x24, 0xdf, 0xc4, 0xa5, 0x51, 0xc5, 0xea, 0x0a, 0x3a, 0xb5, 0xcd, 0xd1, 0xc2, 0xc6, - 0x29, 0x87, 0xdd, 0x8b, 0x71, 0x44, 0x86, 0x8d, 0x81, 0x9e, 0x1b, 0x2b, 0x4c, 0xe1, 0x0c, 0xce, 0x70, 0xa8, 0xc6, 0xad, 0x45, 0xa2, 0x78, 0x36, 0x58, 0x4e, 0xd8, 0x66, 0x1f, 0x0a, 0x5a, 0xc2, - 0x3e, 0x7d, 0x82, 0xf5, 0x9a, 0xd9, 0x6d, 0x52, 0xef, 0xb2, 0x90, 0xd5, 0x17, 0x0e, 0xef, 0xc7, 0xe3, 0xee, 0x81, 0x22, 0x4e, 0x6b, 0xec, 0xe1, 0x7e, 0xe7, 0x75, 0x79, 0x10, 0x5a, 0xdb, 0xd9, - 0xb3, 0x4b, 0xe0, 0x5c, 0x0b, 0xba, 0x6d, 0x68, 0xc8, 0xcd, 0xc1, 0x9d, 0x98, 0x52, 0x0c, 0x68, 0x14, 0xb6, 0xe4, 0xae, 0x3a, 0xa6, 0x95, 0x4e, 0xe3, 0x22, 0xca, 0x41, 0x5d, 0xaa, 0x14, 0x47, - 0x9b, 0xcd, 0x84, 0x4b, 0x4f, 0x68, 0xea, 0xa9, 0x2a, 0x73, 0xa0, 0xa3, 0xf3, 0xbf, 0xbe, 0xa2, 0x62, 0x84, 0x2a, 0x35, 0x25, 0x73, 0xea, 0x3a, 0x05, 0x57, 0x31, 0x3a, 0xcc, 0xe8, 0xa0, 0xaa, - 0x11, 0xb6, 0x71, 0x45, 0x4c, 0x35, 0x16, 0x5b, 0x2e, 0xac, 0xcb, 0x89, 0x66, 0xca, 0xe6, 0x74, 0x27, 0x5f, 0xff, 0x6b, 0x25, 0xe9, 0xe5, 0xf2, 0x9f, 0xdf, 0xc8, 0xbc, 0x5a, 0x64, 0xaf, 0xdc, - 0xf8, 0xad, 0x79, 0x43, 0xd2, 0x5e, 0xc4, 0xac, 0x11, 0x42, 0x1b, 0x49, 0x19, 0xb8, 0x96, 0x18, 0xb2, 0x50, 0x20, 0xe3, 0x9c, 0x4a, 0xa8, 0xe4, 0x0b, 0x67, 0x4c, 0x69, 0x53, 0x4e, 0x39, 0x8a, - 0x5d, 0xef, 0xfc, 0xf7, 0x0b, 0x7b, 0xa8, 0x7a, 0x55, 0xc1, 0x68, 0xf0, 0x1e, 0xcf, 0x2c, 0xc4, 0xd8, 0x32, 0x18, 0xcf, 0x2e, 0x36, 0x7b, 0x8c, 0x02, 0x1c, 0x42, 0x8d, 0x4b, 0x87, 0xa0, 0xc8, - 0x54, 0x57, 0x77, 0x72, 0x73, 0x69, 0x4e, 0xda, 0x21, 0x96, 0x4f, 0x5a, 0xc9, 0xac, 0x16, 0x04, 0x43, 0xb9, 0x9d, 0xc8, 0x70, 0x37, 0x79, 0x7b, 0xe5, 0x17, 0x7a, 0x7b, 0xab, 0x5f, 0x4e, 0xfb, - 0xc9, 0x53, 0x99, 0xef, 0xb0, 0x12, 0x7a, 0x6e, 0x11, 0xb5, 0x29, 0x58, 0x0b, 0x73, 0x5f, 0x1b, 0x0c, 0x1b, 0x5d, 0x66, 0x6f, 0xb5, 0x02, 0x0b, 0x62, 0x0d, 0xe2, 0xc5, 0xde, 0x7c, 0x2c, 0xb3, - 0x86, 0xd0, 0x84, 0xc5, 0x50, 0xa2, 0x0d, 0x03, 0x1b, 0x40, 0x55, 0xf3, 0x38, 0x63, 0x7a, 0x1d, 0x0c, 0x0e, 0x42, 0xdc, 0x6f, 0xdf, 0xea, 0x98, 0x17, 0x91, 0xbe, 0xfb, 0xf4, 0xf9, 0x36, 0xef, - 0xee, 0x76, 0x6f, 0xc4, 0xf9, 0x63, 0x0f, 0xbf, 0x8c, 0xf5, 0xe3, 0xec, 0xe0, 0x8c, 0x44, 0xa3, 0x07, 0x4e, 0x1a, 0x56, 0xe4, 0x3a, 0xa6, 0x26, 0x0b, 0x5b, 0x2b, 0x34, 0xc3, 0xb0, 0x08, 0x9b, - 0xe0, 0x5b, 0xf0, 0x54, 0xd4, 0x8c, 0xa5, 0xdd, 0x13, 0x57, 0x97, 0x9a, 0x80, 0x9d, 0x6c, 0xc1, 0x3f, 0xbb, 0x34, 0xa7, 0x96, 0x60, 0x4f, 0x73, 0x5e, 0xfa, 0x2d, 0x9e, 0x3d, 0xee, 0x2c, 0xb1, - 0x5e, 0xd1, 0x15, 0xc2, 0x6b, 0xac, 0x60, 0xe1, 0x96, 0xbd, 0x09, 0xda, 0xb4, 0x99, 0x69, 0x6a, 0x48, 0x9a, 0xd0, 0x60, 0x32, 0xd2, 0x54, 0xae, 0x90, 0x11, 0x44, 0xc8, 0x3a, 0x9b, 0x31, 0xd8, - 0x29, 0x44, 0xfa, 0x8c, 0x99, 0x1d, 0x62, 0xea, 0x73, 0x4b, 0x20, 0xc0, 0x30, 0x4d, 0x9b, 0xa4, 0xb0, 0x09, 0xf0, 0x9a, 0xd9, 0x24, 0x1c, 0x82, 0xb2, 0xab, 0xc5, 0x02, 0x80, 0x15, 0x22, 0x81, - 0x0e, 0x4e, 0xd1, 0x34, 0xc0, 0x28, 0xb9, 0x7b, 0x3a, 0x3b, 0x0a, 0xc6, 0xe9, 0xba, 0xe3, 0x69, 0xdd, 0xb8, 0xbf, 0x12, 0x8b, 0xe5, 0xcc, 0x72, 0x11, 0xc4, 0x80, 0x8d, 0xc7, 0xaf, 0xd9, 0x7a, - 0x0b, 0x21, 0xcb, 0x11, 0x5b, 0x00, 0x1d, 0xc3, 0x90, 0x56, 0x2d, 0x46, 0x19, 0x36, 0x40, 0xd1, 0xa8, 0x58, 0x74, 0x02, 0x87, 0xad, 0xa2, 0x68, 0x4d, 0x55, 0xda, 0x71, 0x7c, 0xf5, 0x9f, 0x3b, - 0xfb, 0xc6, 0xc8, 0x4f, 0xc9, 0xf6, 0x88, 0x49, 0x7f, 0xb6, 0xda, 0x4c, 0xb7, 0x8c, 0x81, 0x63, 0x08, 0xcf, 0x46, 0x6b, 0x99, 0xc3, 0x6c, 0x92, 0x63, 0xcb, 0xdd, 0xad, 0x43, 0x26, 0xad, 0x9e, - 0x66, 0x8c, 0x46, 0xc3, 0x30, 0xcb, 0x8a, 0xa5, 0x35, 0xb6, 0xe8, 0xa1, 0x08, 0x15, 0x27, 0x0c, 0xcf, 0x77, 0x37, 0x7f, 0xe4, 0xed, 0xfd, 0x07, 0xd7, 0xbb, 0x3c, 0x48, 0x18, 0xe7, 0x77, 0x9e, - 0xd9, 0x91, 0x82, 0x44, 0x47, 0xae, 0xae, 0x5c, 0xde, 0x1b, 0x3b, 0xad, 0xbe, 0x74, 0x4e, 0xe9, 0x61, 0x3e, 0xa3, 0x6c, 0x0e, 0x05, 0x5f, 0x2e, 0x80, 0x42, 0x5b, 0xa8, 0x65, 0x93, 0xcd, 0xcb, - 0x00, 0x15, 0x4e, 0x39, 0xcf, 0x53, 0xf1, 0xe2, 0x20, 0xdd, 0xcd, 0xb3, 0x07, 0xbc, 0x5c, 0x24, 0x1e, 0xc4, 0x01, 0xdc, 0x20, 0x24, 0x61, 0xfa, 0x58, 0xcd, 0x88, 0xc0, 0x61, 0x26, 0x4f, 0x91, - 0x8e, 0xdc, 0x75, 0xf9, 0x0c, 0xea, 0xac, 0xe9, 0xd1, 0xcb, 0x27, 0x8f, 0x70, 0xef, 0xa3, 0x95, 0x1d, 0xb5, 0xb0, 0xa3, 0x8d, 0x9e, 0x6f, 0x25, 0x89, 0xbf, 0xc9, 0x64, 0xfc, 0xf3, 0x43, 0xa5, - 0xee, 0xcb, 0x30, 0xaf, 0xe0, 0xf1, 0xb9, 0x69, 0x6d, 0x5f, 0xa0, 0x52, 0x3d, 0x96, 0x0d, 0x1d, 0x6b, 0x71, 0xd3, 0xe1, 0x4b, 0x71, 0x96, 0x2d, 0x08, 0x9b, 0x94, 0xdb, 0x7f, 0x21, 0x1c, 0xba, - 0xc0, 0x31, 0x60, 0x59, 0x75, 0xde, 0xf4, 0x9a, 0x83, 0xb2, 0xad, 0xe3, 0x49, 0xff, 0xfa, 0xca, 0xfc, 0x0d, 0xf1, 0x6e, 0x7d, 0xf4, 0xd2, 0xbb, 0xfb, 0x9f, 0x0e, 0xcb, 0x56, 0x6b, 0x34, 0x2b, - 0x3d, 0x17, 0xaa, 0xcd, 0x4d, 0x4e, 0xad, 0xb0, 0x06, 0xe2, 0x39, 0x34, 0x89, 0x39, 0xb1, 0x5b, 0xeb, 0x7d, 0x21, 0xb6, 0x8c, 0x0c, 0x11, 0x0b, 0xe6, 0x9a, 0x7d, 0x8b, 0x33, 0xd6, 0x8e, 0x97, - 0x89, 0xbf, 0xb1, 0xd6, 0x93, 0xe2, 0x7d, 0xf9, 0x7c, 0xbf, 0x51, 0xd1, 0x4f, 0x9f, 0x76, 0x37, 0x87, 0x66, 0x7c, 0x76, 0xfd, 0x35, 0x2b, 0x6b, 0x9d, 0xa0, 0xd7, 0x28, 0xc7, 0xe9, 0xae, 0xcd, - 0x8c, 0x9a, 0x7a, 0x5f, 0x51, 0x12, 0xb3, 0xad, 0x58, 0x6d, 0x78, 0xf8, 0x88, 0x5e, 0x9d, 0x4c, 0x2a, 0x99, 0x49, 0x07, 0x6a, 0xf5, 0x69, 0x1b, 0x45, 0xfb, 0x1b, 0xa0, 0xed, 0xdd, 0xaf, 0xf7, - 0x5f, 0x3e, 0xe7, 0xcd, 0xc3, 0xa7, 0xd3, 0x52, 0x3f, 0xaf, 0x33, 0xbe, 0x94, 0x59, 0xe4, 0x7d, 0x3b, 0x37, 0x8e, 0x23, 0x77, 0x36, 0xf1, 0xac, 0x96, 0x83, 0xda, 0x9c, 0x90, 0x84, 0x38, 0x36, - 0x7e, 0x80, 0x85, 0x43, 0xad, 0x53, 0x99, 0x65, 0x8c, 0x14, 0xa5, 0x02, 0xea, 0x51, 0x63, 0x32, 0x47, 0x1a, 0xc6, 0xb4, 0xd1, 0x8f, 0x83, 0x95, 0x17, 0xc1, 0xf3, 0xff, 0xa3, 0x98, 0x16, 0x57, - 0x97, 0x79, 0x60, 0xdc, 0x7b, 0xbc, 0x7e, 0x6e, 0xd5, 0xaf, 0x36, 0xd7, 0xe0, 0x55, 0x98, 0xb4, 0xb1, 0x70, 0xee, 0x6d, 0xf9, 0x12, 0x5f, 0xd2, 0x1c, 0x2a, 0x56, 0x7a, 0xd8, 0xe6, 0xbc, 0x58, - 0x6d, 0xb9, 0xf1, 0xaa, 0xb1, 0xbc, 0xb6, 0x90, 0x1d, 0xd0, 0x5b, 0xf2, 0x89, 0x12, 0xc4, 0x0b, 0xca, 0xb1, 0x89, 0xfa, 0xd2, 0x9c, 0x4f, 0x0a, 0xfd, 0xbc, 0xae, 0x7c, 0x58, 0x8c, 0xea, 0xe7, - 0x2e, 0xbe, 0x2c, 0x88, 0x82, 0x8e, 0x65, 0x4e, 0xea, 0x0b, 0x6a, 0x71, 0x54, 0x16, 0x84, 0x14, 0x75, 0x10, 0xed, 0xd4, 0xab, 0x2b, 0x0a, 0x17, 0x17, 0x76, 0x41, 0xf4, 0xaa, 0x8e, 0xb1, 0x3a, - 0x0d, 0x57, 0x87, 0x49, 0xff, 0x94, 0x5f, 0xe7, 0xcd, 0x1f, 0x1f, 0xae, 0x77, 0x97, 0x97, 0xc7, 0xa8, 0xd8, 0xb9, 0x53, 0xeb, 0x22, 0x8f, 0x2d, 0x62, 0x2d, 0x51, 0xf7, 0x9a, 0x93, 0xc7, 0xd0, - 0x20, 0xdd, 0xa8, 0xa2, 0x62, 0xb8, 0x67, 0x4c, 0xcd, 0xaa, 0x89, 0x13, 0xba, 0xcd, 0x81, 0x34, 0x20, 0x82, 0x87, 0xb7, 0x1a, 0x99, 0x52, 0xc7, 0xed, 0xfb, 0xe3, 0xc3, 0x27, 0xbd, 0xf9, 0x96, - 0x8b, 0xae, 0xee, 0x2e, 0xee, 0xf3, 0xf6, 0xd3, 0xd5, 0x8d, 0x5e, 0xbf, 0x28, 0xde, 0x7f, 0x2f, 0xc8, 0x6f, 0x3f, 0xf6, 0xdd, 0xf5, 0x5b, 0x44, 0x25, 0x6f, 0x6f, 0x6f, 0x76, 0x07, 0xcb, 0x31, - 0xce, 0xbe, 0x1a, 0x04, 0x31, 0x15, 0x84, 0xa7, 0xcb, 0x86, 0x64, 0x79, 0x54, 0x2e, 0xd1, 0x58, 0x6b, 0x05, 0x69, 0x5f, 0x98, 0x44, 0x63, 0xce, 0x90, 0x70, 0x81, 0xb1, 0xac, 0x99, 0x76, 0xd5, - 0x46, 0xad, 0x2f, 0x47, 0x2d, 0x3d, 0xbe, 0x1a, 0xfb, 0x57, 0xbf, 0x88, 0x5b, 0xbd, 0xdc, 0xdd, 0xd4, 0xf5, 0x63, 0x94, 0x7b, 0xca, 0x5b, 0xef, 0x7e, 0xfd, 0xf3, 0xea, 0x26, 0x76, 0x7f, 0xde, - 0x5d, 0xdc, 0x7d, 0x79, 0x03, 0x06, 0x1f, 0xfe, 0x85, 0xc3, 0x50, 0x7f, 0x6e, 0xc0, 0xa2, 0x3a, 0x57, 0x35, 0x6b, 0x9d, 0x27, 0x96, 0xda, 0x12, 0x8c, 0xce, 0x44, 0xd1, 0xa9, 0x2d, 0x26, 0x4c, - 0x6e, 0x86, 0x15, 0x0b, 0xd2, 0xcb, 0x56, 0xef, 0xdc, 0x50, 0x5b, 0x87, 0xe9, 0x5d, 0xd5, 0x86, 0xd8, 0x89, 0x1a, 0xac, 0x3f, 0x97, 0xfc, 0x84, 0xa4, 0x4f, 0x03, 0x34, 0xaf, 0xfa, 0x03, 0xe7, - 0x56, 0xb4, 0xc7, 0xd0, 0x74, 0x1a, 0x91, 0x0d, 0x2a, 0x65, 0x06, 0xc7, 0x72, 0x9a, 0x94, 0xd6, 0xb8, 0xba, 0xcf, 0xc5, 0x66, 0x44, 0x6d, 0x69, 0x4f, 0x47, 0x1a, 0x46, 0x5b, 0xea, 0xeb, 0x32, - 0x91, 0xfa, 0x54, 0xcb, 0x13, 0x61, 0xfd, 0x59, 0x5f, 0xec, 0x1b, 0xf2, 0x78, 0xa1, 0xed, 0x4f, 0x57, 0x37, 0x57, 0xff, 0xf5, 0x61, 0xf7, 0xd7, 0x55, 0xbc, 0xd1, 0xdd, 0xac, 0x9b, 0x3f, 0x5e, - 0xb3, 0x9e, 0x33, 0xcb, 0x3f, 0x4a, 0x32, 0x5d, 0xda, 0x8a, 0x51, 0x1d, 0x61, 0x4a, 0xa4, 0x9b, 0x68, 0x35, 0x22, 0x74, 0x0d, 0xf6, 0xb5, 0x20, 0x7b, 0x68, 0x47, 0x15, 0xad, 0x58, 0x4b, 0x5d, - 0x01, 0x80, 0x46, 0x53, 0x5b, 0xdd, 0xdb, 0x09, 0x44, 0x5d, 0xbb, 0xdb, 0x4f, 0xcf, 0xfb, 0x67, 0x87, 0x62, 0x9c, 0x1b, 0x76, 0x51, 0x79, 0x27, 0x5d, 0x5c, 0x8a, 0x15, 0x1d, 0x04, 0xad, 0xca, - 0x60, 0x4a, 0xa7, 0x45, 0x1d, 0x06, 0x86, 0x80, 0x36, 0x2e, 0x88, 0x96, 0x40, 0x4d, 0x38, 0x36, 0x72, 0x10, 0x83, 0x88, 0x98, 0x7a, 0x93, 0xe3, 0x98, 0xf2, 0x93, 0xde, 0xfb, 0xc7, 0xa7, 0xce, - 0xe7, 0x11, 0x94, 0x7d, 0x4a, 0x6b, 0x0f, 0x37, 0x7e, 0x7f, 0x75, 0x04, 0x87, 0x9d, 0xa8, 0x57, 0x1c, 0xeb, 0xf9, 0xbe, 0xe8, 0xe8, 0xfe, 0x99, 0x8f, 0x55, 0x8c, 0x67, 0xd9, 0xe0, 0x44, 0xf4, - 0x7c, 0x7b, 0x1c, 0xe5, 0x45, 0xdf, 0xf5, 0x30, 0x80, 0x9e, 0x3d, 0x61, 0xa2, 0xb9, 0xd2, 0x1a, 0xc6, 0xd9, 0x67, 0x11, 0xb7, 0xd6, 0xb1, 0x92, 0x8c, 0x69, 0xb6, 0x40, 0x71, 0xeb, 0x6b, 0xae, - 0xd8, 0x18, 0xe6, 0xf4, 0x52, 0xc8, 0x2c, 0x4f, 0xa1, 0x4d, 0x1f, 0x3e, 0x2b, 0x73, 0xf9, 0x29, 0xc3, 0x7a, 0x3e, 0x2a, 0x79, 0x28, 0x44, 0xa3, 0x33, 0x0b, 0xa1, 0xc4, 0x96, 0x1a, 0xe0, 0x59, - 0x05, 0x31, 0x23, 0x72, 0x15, 0x4e, 0x4a, 0x0f, 0x99, 0x2e, 0x63, 0xac, 0xd6, 0x9b, 0x19, 0x73, 0xe3, 0x18, 0xc9, 0xd6, 0x60, 0x01, 0x09, 0x8d, 0xb6, 0x18, 0x1c, 0xfb, 0xea, 0x3f, 0x10, 0xe2, - 0x5e, 0xef, 0x5e, 0x0b, 0x71, 0x76, 0x4d, 0xf0, 0x8c, 0x11, 0x6d, 0x74, 0xcb, 0xe9, 0x90, 0x73, 0xcb, 0x53, 0x63, 0xf3, 0x74, 0x67, 0x20, 0x65, 0x54, 0x12, 0x61, 0x1d, 0x34, 0x1d, 0xc2, 0x7b, - 0xad, 0xa9, 0xc8, 0xbc, 0xb1, 0xb0, 0xb9, 0x91, 0x6b, 0xdb, 0xa0, 0xcb, 0x9b, 0x42, 0xec, 0xbb, 0xf6, 0x3f, 0x5d, 0x88, 0x3e, 0x0d, 0x5a, 0x22, 0x18, 0x73, 0x0f, 0x42, 0xaf, 0xe9, 0x33, 0xb8, - 0x37, 0x6f, 0xd1, 0xd4, 0x02, 0x26, 0xb2, 0x42, 0x83, 0xa9, 0xad, 0xa7, 0xab, 0x36, 0x6f, 0x6b, 0x76, 0x1e, 0x43, 0xba, 0x4e, 0xa1, 0x71, 0x9c, 0x74, 0x9c, 0x9c, 0x44, 0xd8, 0x2b, 0xe6, 0xb7, - 0x53, 0x03, 0x04, 0xdb, 0xcd, 0xaf, 0x33, 0x14, 0x27, 0x7c, 0xed, 0x25, 0x9d, 0x39, 0x88, 0x04, 0x78, 0xf6, 0x22, 0x33, 0xc1, 0x7e, 0x1e, 0xc7, 0x7d, 0xe9, 0x80, 0x68, 0x31, 0x8c, 0xcb, 0xa5, - 0x77, 0xd9, 0xa8, 0xa6, 0x75, 0xcf, 0x95, 0x31, 0x53, 0x42, 0x7a, 0x1f, 0xd5, 0xda, 0x58, 0x81, 0xa6, 0x66, 0x9d, 0x46, 0x52, 0x5b, 0xed, 0x78, 0xa7, 0xf8, 0x3b, 0x01, 0xfb, 0xdb, 0x65, 0x84, - 0xef, 0x3d, 0xd5, 0xc3, 0x22, 0xc2, 0xb9, 0xed, 0xc1, 0x81, 0x34, 0x6d, 0x6a, 0xef, 0xb6, 0x6a, 0xf6, 0xfd, 0x1c, 0x83, 0xa0, 0xaa, 0xcb, 0x82, 0xea, 0xad, 0x91, 0x16, 0x4c, 0xb6, 0xca, 0x46, - 0x0a, 0x3c, 0x30, 0xb8, 0x33, 0x2b, 0xcf, 0x15, 0x43, 0xa6, 0x8d, 0xe3, 0x01, 0xff, 0x59, 0xde, 0xfe, 0x8e, 0xcb, 0xf4, 0xee, 0xea, 0xb4, 0xc0, 0x1f, 0xfb, 0xeb, 0x20, 0x74, 0x6e, 0xd2, 0x45, - 0x96, 0x6c, 0x84, 0xb4, 0xc4, 0x68, 0xb5, 0x9a, 0x1d, 0x8b, 0xe6, 0xb4, 0xa2, 0x58, 0x69, 0xfb, 0xfe, 0x5b, 0x18, 0x8f, 0xe9, 0xd4, 0xa8, 0x2f, 0xee, 0x60, 0xd3, 0x62, 0x4c, 0x93, 0x69, 0x44, - 0xd2, 0x7f, 0x50, 0x6f, 0x7d, 0x44, 0x19, 0xbf, 0xfd, 0xad, 0xa9, 0xf4, 0x37, 0xe6, 0x74, 0xb6, 0xb7, 0xfe, 0xa4, 0x8f, 0x17, 0x77, 0xd7, 0x6a, 0x2f, 0xf2, 0xd1, 0x1b, 0x93, 0xc3, 0xa7, 0x96, - 0x55, 0xef, 0x3e, 0xda, 0xed, 0xee, 0xcf, 0xc3, 0x24, 0x2a, 0x67, 0x07, 0x0e, 0xc1, 0x5a, 0x89, 0x8a, 0x1d, 0x72, 0x54, 0xb2, 0xc8, 0x64, 0x05, 0x58, 0xb2, 0xdc, 0x5b, 0x61, 0x18, 0xfb, 0x52, - 0x14, 0x95, 0x31, 0x86, 0x76, 0xa9, 0xa5, 0x68, 0xc1, 0x53, 0x3b, 0x8d, 0x20, 0x0f, 0xc0, 0x13, 0xc1, 0xf1, 0xe3, 0xc6, 0x73, 0xee, 0x2f, 0xd4, 0xae, 0x5e, 0xc1, 0x80, 0xb3, 0xcf, 0x05, 0x8c, - 0xde, 0x0b, 0x23, 0x99, 0x85, 0x66, 0xf6, 0x9e, 0x01, 0x49, 0x30, 0xba, 0x0f, 0x12, 0x85, 0x6a, 0x9d, 0x47, 0xb5, 0xda, 0xb0, 0x0f, 0x8b, 0x95, 0x0e, 0x5b, 0x55, 0xe6, 0x3c, 0x20, 0xb8, 0xcc, - 0x9d, 0xfc, 0x9f, 0xa8, 0xa7, 0x9d, 0x14, 0xef, 0xfc, 0x83, 0x77, 0x95, 0x81, 0xb8, 0x16, 0x38, 0x6e, 0x9c, 0x74, 0x66, 0x89, 0x92, 0x93, 0x51, 0xa9, 0x67, 0x19, 0x65, 0x00, 0x2f, 0x9a, 0x3c, - 0x03, 0x1c, 0x7a, 0xcc, 0xd6, 0xc3, 0x1a, 0x26, 0xed, 0xdb, 0x6b, 0xd8, 0xd7, 0x3c, 0xa5, 0xa0, 0xc3, 0x5d, 0x10, 0x5b, 0x90, 0x3a, 0x77, 0x47, 0xc1, 0x62, 0x66, 0x95, 0x8b, 0x68, 0x6d, 0x94, - 0xb9, 0x93, 0x56, 0x89, 0x01, 0xad, 0x31, 0x0b, 0xba, 0xc8, 0x7e, 0x2a, 0x8b, 0x74, 0x36, 0x5c, 0xda, 0xd0, 0x38, 0x3d, 0x48, 0x6d, 0xb2, 0x96, 0x20, 0xe2, 0x3a, 0x3e, 0x08, 0xf0, 0xda, 0x73, - 0x5f, 0x4c, 0xc9, 0x9d, 0xd2, 0xd8, 0xd7, 0x4d, 0x06, 0x2f, 0x91, 0xf8, 0xf9, 0x47, 0xb1, 0x63, 0x09, 0xd7, 0x10, 0x34, 0x8d, 0xa9, 0x0c, 0x14, 0x54, 0xd8, 0x00, 0x79, 0xf6, 0x6c, 0x6d, 0x2a, - 0xd3, 0x1c, 0x92, 0xc8, 0x10, 0x0b, 0x04, 0x5a, 0x66, 0x00, 0xe9, 0x9a, 0xa0, 0x42, 0x6e, 0x4d, 0x4e, 0x3b, 0xd4, 0xd7, 0x7d, 0x11, 0xaf, 0x18, 0xe1, 0x99, 0xdf, 0xdf, 0x51, 0x5b, 0x8e, 0xe9, - 0xab, 0xb7, 0xb0, 0x04, 0x24, 0xc6, 0x9a, 0xd0, 0xd7, 0xa6, 0x22, 0x29, 0xc6, 0x5e, 0x58, 0x36, 0x5c, 0x56, 0x20, 0x20, 0x4a, 0xb5, 0x66, 0xae, 0xd1, 0x56, 0x4c, 0x6b, 0x8c, 0xfd, 0x14, 0x21, - 0xfa, 0x5e, 0x09, 0x79, 0x2e, 0x40, 0xff, 0x09, 0x73, 0x19, 0xa2, 0x43, 0xc9, 0xca, 0x9a, 0x90, 0x8c, 0x96, 0x69, 0x63, 0x4c, 0xeb, 0xca, 0x86, 0xc1, 0xb3, 0x85, 0xa6, 0x2f, 0xdc, 0x4f, 0x60, - 0x08, 0x72, 0x0c, 0x1c, 0x82, 0x13, 0x1a, 0x0f, 0x56, 0x36, 0x53, 0xca, 0x53, 0x0a, 0xb8, 0x8a, 0x1b, 0x7d, 0xe5, 0x30, 0xe7, 0x9e, 0xfe, 0xc1, 0xb6, 0x14, 0x74, 0xd6, 0xc6, 0x2d, 0x1b, 0x32, - 0xd5, 0x1c, 0x98, 0x95, 0xc3, 0xdd, 0x91, 0x1c, 0xda, 0xd8, 0x14, 0x90, 0x95, 0x30, 0x62, 0xd1, 0xc8, 0x15, 0x63, 0x10, 0x05, 0xb9, 0x2d, 0x82, 0xf4, 0x3a, 0xde, 0x2c, 0x7f, 0x4e, 0xe3, 0x1e, - 0x6e, 0xae, 0x36, 0x42, 0x7a, 0x61, 0x57, 0x71, 0xf5, 0xe2, 0xc6, 0xcd, 0xee, 0xf6, 0x93, 0x5e, 0x5f, 0xfd, 0x97, 0xee, 0xa9, 0xdb, 0x49, 0x37, 0xfa, 0x96, 0xe8, 0x5e, 0x9a, 0xe1, 0xf9, 0x5b, - 0x45, 0xab, 0xe3, 0x42, 0x52, 0xb0, 0x5a, 0xc2, 0x2a, 0x80, 0x7d, 0xac, 0xb1, 0x50, 0x0c, 0xba, 0x37, 0xf3, 0xde, 0xc4, 0xb7, 0x3b, 0xcc, 0x3d, 0xcb, 0x83, 0x7c, 0x96, 0xf0, 0x9c, 0xa5, 0x68, - 0xab, 0x69, 0xd6, 0x71, 0xbc, 0xfb, 0x75, 0x34, 0x68, 0x9f, 0xbb, 0xbf, 0xa5, 0xd8, 0xd3, 0xc2, 0xee, 0x2e, 0xae, 0xaf, 0x2a, 0x37, 0xab, 0x3d, 0xec, 0x8b, 0xc3, 0xd9, 0x63, 0x25, 0x48, 0x67, - 0xa8, 0xc0, 0xd2, 0xd6, 0x36, 0x9f, 0x9a, 0x0d, 0x33, 0x7a, 0xc7, 0xe9, 0x9c, 0x45, 0xb3, 0x0f, 0xd1, 0x01, 0x73, 0x04, 0x59, 0x6e, 0x2c, 0xde, 0x87, 0xd1, 0x12, 0x27, 0xa0, 0x40, 0x00, 0xcd, - 0xe3, 0xbd, 0xb1, 0xef, 0x79, 0xea, 0xdd, 0x63, 0x6e, 0xfa, 0xed, 0xbf, 0x5d, 0x72, 0x7b, 0x5e, 0xb4, 0x3c, 0x6c, 0x6f, 0x9e, 0x1b, 0xe9, 0x75, 0xda, 0x5c, 0xb1, 0x18, 0x45, 0x6d, 0xb4, 0xc6, - 0x29, 0x43, 0xdd, 0xa4, 0xc1, 0x1c, 0x00, 0x92, 0xad, 0x9a, 0x19, 0xcd, 0x80, 0x21, 0x93, 0xac, 0xa1, 0x77, 0x5f, 0x51, 0x98, 0x9b, 0x4d, 0x50, 0xc7, 0x13, 0xd3, 0xf5, 0x47, 0xd7, 0xe0, 0x85, - 0x6a, 0xf7, 0x55, 0x84, 0x87, 0xbb, 0xfb, 0xab, 0xbf, 0xfe, 0x1b, 0xcb, 0x72, 0xbf, 0x3b, 0x0c, 0x07, 0x78, 0xf6, 0xe2, 0x54, 0x44, 0x27, 0x18, 0x13, 0x7a, 0x33, 0x88, 0x5c, 0x5b, 0x6c, 0xa8, - 0x9a, 0x9b, 0xb3, 0x03, 0x35, 0x9a, 0xc3, 0x27, 0xb5, 0x19, 0x60, 0x45, 0xa3, 0xd6, 0x1c, 0x4b, 0xc6, 0xca, 0x30, 0x93, 0x48, 0x1e, 0x9d, 0xc7, 0xa9, 0xdc, 0xff, 0xea, 0xdd, 0x1f, 0x73, 0xe7, - 0x79, 0xdf, 0x1d, 0x69, 0x68, 0x48, 0xd1, 0xea, 0x8a, 0xb8, 0xc5, 0xe2, 0xa4, 0x82, 0x80, 0xb5, 0x36, 0x6d, 0x25, 0xa0, 0x57, 0xae, 0xa0, 0xa6, 0x2b, 0xb5, 0x80, 0xb9, 0x5a, 0x57, 0x9f, 0x31, - 0x52, 0xb0, 0x4d, 0x74, 0x3d, 0xf5, 0xee, 0xdf, 0xe7, 0x09, 0x5e, 0xd5, 0x7e, 0xcf, 0x2d, 0x81, 0x8c, 0xe9, 0x15, 0xbd, 0x75, 0x85, 0x46, 0x24, 0x30, 0xcc, 0xcd, 0x61, 0x42, 0x8e, 0x36, 0xcb, - 0xa6, 0x3b, 0xbb, 0x55, 0xcf, 0x26, 0xc0, 0xa3, 0xcb, 0x90, 0x96, 0xa6, 0xe1, 0xad, 0x12, 0x3c, 0x99, 0x4f, 0x8c, 0x31, 0xbe, 0x8d, 0x2b, 0xaf, 0x5f, 0x0c, 0xf8, 0xbf, 0x2a, 0x2a, 0x9c, 0x59, - 0xc0, 0xc0, 0x81, 0x24, 0x13, 0xcd, 0x1a, 0x6e, 0xe1, 0x76, 0x3f, 0x7c, 0x34, 0x5b, 0x21, 0x0f, 0x25, 0x18, 0x8a, 0x63, 0x0f, 0xab, 0x1b, 0x4a, 0xc4, 0x72, 0xc6, 0xce, 0xbc, 0x96, 0xcf, 0x6c, - 0x63, 0xb0, 0x8c, 0xb5, 0x4e, 0xa8, 0x68, 0x2f, 0xe2, 0x61, 0xa6, 0x6c, 0x78, 0xf6, 0x3c, 0x2f, 0xbd, 0xf3, 0x18, 0x28, 0xbd, 0x95, 0x66, 0x53, 0x61, 0xf1, 0x02, 0xab, 0x28, 0xf7, 0x69, 0x23, - 0xc9, 0x73, 0xf0, 0xcc, 0x22, 0xce, 0xbd, 0xbe, 0xca, 0x46, 0x6a, 0xcf, 0x98, 0x20, 0x54, 0x0b, 0x4e, 0x15, 0xd8, 0xae, 0xaf, 0x6e, 0x1e, 0xfe, 0xba, 0xb8, 0xd5, 0x3f, 0xf7, 0xfe, 0xff, 0xb3, - 0xd1, 0x7d, 0x90, 0x6c, 0x4b, 0x4b, 0xd0, 0xfa, 0xa2, 0x11, 0x3d, 0x17, 0xf7, 0x32, 0x9a, 0xe6, 0x4b, 0x7b, 0xd2, 0xe0, 0xb6, 0xb2, 0xbb, 0x56, 0x36, 0x45, 0x5f, 0x7d, 0x34, 0x1c, 0x0d, 0x9b, - 0xcf, 0x10, 0xf0, 0x8d, 0xf7, 0x9c, 0x12, 0xe2, 0xc5, 0xbe, 0xd8, 0x43, 0x4f, 0x39, 0x37, 0x6a, 0xe1, 0x1a, 0x30, 0xd2, 0x21, 0x05, 0x7d, 0x3a, 0x21, 0x22, 0xd7, 0xc2, 0x1a, 0x06, 0x59, 0xac, - 0xc5, 0x53, 0x16, 0x2d, 0x15, 0xc7, 0x2d, 0x91, 0x65, 0x75, 0x95, 0x35, 0x63, 0x84, 0x07, 0xfa, 0x28, 0x97, 0xe3, 0x04, 0xec, 0x9f, 0xa0, 0xe3, 0x2f, 0xf7, 0x51, 0x9d, 0x72, 0xb1, 0x67, 0x0f, - 0xfd, 0xec, 0x85, 0xc9, 0x81, 0xc5, 0x33, 0x6d, 0xcc, 0xd6, 0x04, 0x21, 0x21, 0x39, 0x68, 0xa8, 0xa8, 0x2a, 0xe6, 0x7e, 0x3b, 0x7d, 0xab, 0x29, 0x84, 0x4d, 0xfb, 0xea, 0x15, 0x10, 0x1a, 0x44, - 0xdc, 0xb0, 0x83, 0xd3, 0xa8, 0x3a, 0x85, 0xa5, 0xaf, 0x77, 0xfe, 0xfb, 0x07, 0xfd, 0x7c, 0xc8, 0x3d, 0xf1, 0xec, 0x98, 0x04, 0x07, 0x41, 0x6b, 0x63, 0xce, 0x4a, 0x9a, 0xb4, 0x86, 0xb5, 0xe9, - 0x25, 0x34, 0x4b, 0xa2, 0x00, 0x84, 0x0c, 0x81, 0x6c, 0xf5, 0xe0, 0x89, 0x9d, 0xcc, 0x97, 0xac, 0xe6, 0xb0, 0x51, 0xf0, 0x09, 0xe9, 0x18, 0xc7, 0xdb, 0x5f, 0xcf, 0x41, 0xd8, 0x9d, 0xef, 0x3e, - 0xe7, 0xe5, 0x83, 0xde, 0xbe, 0xb1, 0x79, 0xfa, 0x7a, 0x77, 0xf9, 0x4a, 0xd0, 0xf3, 0x4f, 0x37, 0x34, 0x13, 0xb3, 0x9c, 0x8e, 0x1c, 0xd4, 0xca, 0xc7, 0x16, 0x50, 0x4c, 0xb6, 0xf0, 0x48, 0x82, - 0xd3, 0xd0, 0x11, 0x1b, 0x76, 0xb5, 0xc5, 0xd2, 0x9d, 0x60, 0x0d, 0x52, 0x59, 0x10, 0x63, 0x76, 0xef, 0xdc, 0x7e, 0xd0, 0x06, 0x3b, 0x21, 0xd9, 0x57, 0x60, 0x7e, 0x68, 0x86, 0xe7, 0x2e, 0x90, - 0x70, 0x95, 0x93, 0xd3, 0x18, 0x0b, 0xa7, 0x04, 0xc6, 0x48, 0x6d, 0x1c, 0x7d, 0x4a, 0x6d, 0xd9, 0x77, 0x50, 0xeb, 0x1a, 0x1d, 0xb9, 0x23, 0xfb, 0x00, 0x8b, 0x1e, 0x35, 0x25, 0xe7, 0x1a, 0x20, - 0x19, 0xa0, 0x70, 0x2a, 0xce, 0x3f, 0x6d, 0x9d, 0x78, 0xc9, 0xe7, 0xce, 0x3f, 0xf3, 0x66, 0x6d, 0x5a, 0x20, 0x87, 0xe4, 0xe8, 0x82, 0x83, 0x72, 0x80, 0x38, 0x6d, 0xa2, 0x54, 0x02, 0x4b, 0xf3, - 0x1e, 0x10, 0xcd, 0x54, 0x66, 0x3a, 0x6c, 0xce, 0x44, 0x5d, 0x49, 0xb3, 0x1b, 0xe0, 0x58, 0x1c, 0xa7, 0xe2, 0xfc, 0xa7, 0x43, 0x2e, 0xfa, 0x53, 0x6a, 0x97, 0x5d, 0x27, 0x38, 0x7b, 0x12, 0x34, - 0xe7, 0x96, 0x30, 0x54, 0x5c, 0x1c, 0x62, 0x90, 0xad, 0xd9, 0xb0, 0x0d, 0x4d, 0xe9, 0x64, 0xb1, 0x25, 0x2f, 0x67, 0xc5, 0x1c, 0x10, 0x30, 0x01, 0xe6, 0x16, 0x23, 0x7c, 0x9d, 0x1a, 0x3a, 0x7c, - 0xde, 0x3e, 0x3d, 0xf4, 0x8d, 0x73, 0xbb, 0x86, 0x4a, 0xa7, 0xb6, 0x52, 0x96, 0x03, 0x2f, 0x5a, 0xd3, 0x7c, 0xba, 0x0c, 0x84, 0xbe, 0x34, 0xdc, 0x15, 0x5d, 0xba, 0xd2, 0x88, 0xa9, 0x42, 0xab, - 0xc9, 0x8c, 0x5c, 0x83, 0x1a, 0x83, 0x42, 0x8b, 0x85, 0x89, 0xc7, 0x89, 0xc9, 0xe3, 0xee, 0xb7, 0xdf, 0x5e, 0x84, 0x83, 0x53, 0x5e, 0x72, 0x75, 0x38, 0xee, 0xb0, 0xce, 0x0e, 0x56, 0xc9, 0x24, - 0x44, 0x71, 0x66, 0x15, 0x19, 0x56, 0x4d, 0x34, 0x24, 0x95, 0x0d, 0xe9, 0xe9, 0x8c, 0x96, 0x60, 0xce, 0x4d, 0xb2, 0xb0, 0x8b, 0xdb, 0x16, 0xda, 0x7c, 0x0e, 0x98, 0x0b, 0x7b, 0xeb, 0x1b, 0xe0, - 0x38, 0xbe, 0x53, 0xf0, 0x1b, 0xcf, 0xfa, 0xda, 0xa9, 0x7c, 0x2a, 0xa5, 0xff, 0x4d, 0x86, 0xf1, 0x6d, 0x8b, 0xf8, 0x4b, 0xa4, 0xde, 0xce, 0x3f, 0xec, 0x01, 0x84, 0x22, 0x35, 0x98, 0xe6, 0xe4, - 0xe6, 0x8d, 0xd6, 0xa2, 0xca, 0x14, 0x18, 0x88, 0x38, 0xb7, 0x70, 0x5f, 0x35, 0xaa, 0xe3, 0x88, 0x09, 0xcc, 0x26, 0x2d, 0x89, 0x27, 0x47, 0x6d, 0x50, 0x91, 0xe7, 0x3c, 0x31, 0xd0, 0xf6, 0x82, - 0x76, 0xed, 0xab, 0xbe, 0xbf, 0xfd, 0x10, 0xfe, 0x7e, 0xdf, 0x84, 0x76, 0x20, 0x33, 0x9f, 0x1d, 0x78, 0x19, 0x27, 0x11, 0x40, 0x17, 0xc9, 0x36, 0x73, 0x43, 0xc0, 0xac, 0xfb, 0x5e, 0x09, 0xa8, - 0x60, 0xd7, 0xea, 0x13, 0xbd, 0xc6, 0x5c, 0xab, 0x90, 0xa5, 0x0f, 0x5b, 0xe5, 0xdd, 0x83, 0x16, 0xad, 0xea, 0x43, 0xe3, 0xd4, 0xf6, 0x91, 0xcf, 0x7a, 0xfb, 0xfb, 0xd5, 0xcd, 0xe5, 0x87, 0xeb, - 0xdd, 0xab, 0x69, 0xb4, 0xf3, 0xcf, 0x5a, 0x0e, 0xc6, 0x6e, 0xdd, 0x1b, 0x0c, 0x93, 0x82, 0x69, 0x2e, 0x55, 0x05, 0x3a, 0xb8, 0x0a, 0xa5, 0x75, 0x19, 0xb4, 0xa8, 0x59, 0xe6, 0x8c, 0x31, 0x6b, - 0x38, 0x74, 0x73, 0x67, 0x22, 0xf3, 0x4a, 0xef, 0x7d, 0x1d, 0x4f, 0xcf, 0xdf, 0xc0, 0xc5, 0x6f, 0xbf, 0xbc, 0x10, 0xe7, 0xc3, 0x13, 0x10, 0x3b, 0xa1, 0xba, 0x57, 0x4f, 0x1e, 0x36, 0x2e, 0xce, - 0xcd, 0x8d, 0x05, 0xa6, 0xb8, 0x99, 0x94, 0x48, 0x6e, 0x74, 0x65, 0x0d, 0xe4, 0xe9, 0x6e, 0x5d, 0x3c, 0xad, 0x45, 0xb6, 0x65, 0xd2, 0xda, 0x72, 0x2d, 0xa5, 0x91, 0x02, 0x2e, 0x44, 0xad, 0x0f, - 0x8a, 0xec, 0x26, 0xd4, 0xff, 0x7e, 0x03, 0xec, 0x36, 0x63, 0xf7, 0xd7, 0x87, 0xbb, 0x2f, 0x77, 0xae, 0x4f, 0xbb, 0x23, 0x5f, 0x6c, 0x84, 0xfe, 0x5b, 0xbe, 0xfc, 0x78, 0xac, 0xc1, 0x21, 0xe5, - 0x6e, 0xe7, 0x26, 0x74, 0x52, 0x8c, 0xd3, 0x11, 0x26, 0xe9, 0x2a, 0x1d, 0x95, 0x7d, 0x08, 0x63, 0xc4, 0xea, 0xd5, 0x08, 0x47, 0x73, 0x5f, 0x81, 0xc0, 0x2c, 0xab, 0x37, 0x80, 0x86, 0x80, 0xd1, - 0x20, 0x7a, 0xb2, 0xb8, 0x72, 0xb0, 0x9c, 0x32, 0xea, 0xc3, 0xd9, 0x8f, 0x9f, 0x5d, 0xc2, 0x0d, 0xac, 0xa0, 0x89, 0x2d, 0xa0, 0xf9, 0xaa, 0xb6, 0xb4, 0x8f, 0x50, 0xb6, 0x59, 0xd9, 0xa5, 0xcb, - 0xaa, 0x42, 0x23, 0xd2, 0x72, 0xf7, 0x28, 0x5e, 0xc2, 0xc3, 0xfa, 0xe6, 0xad, 0x8d, 0xb7, 0xb8, 0x35, 0xfa, 0xa9, 0x31, 0xf7, 0x57, 0xcd, 0xec, 0x9f, 0xdd, 0xff, 0xc8, 0xfd, 0xde, 0xf3, 0xa1, - 0xde, 0xab, 0x35, 0x1e, 0xb0, 0x28, 0x86, 0x2c, 0x1a, 0xcd, 0x19, 0x88, 0x69, 0xba, 0xa0, 0xa2, 0xd3, 0x5c, 0x38, 0x78, 0x51, 0xd4, 0xa2, 0x0d, 0x2e, 0x34, 0x05, 0x2d, 0xf5, 0xd6, 0x4e, 0xd5, - 0x40, 0xbe, 0xf7, 0xdf, 0x0f, 0x91, 0xe3, 0xb9, 0x15, 0xb1, 0x6c, 0x31, 0xc4, 0xf2, 0x46, 0xcd, 0x66, 0xf5, 0x32, 0x19, 0xb9, 0x50, 0xdb, 0x68, 0x38, 0xdb, 0x58, 0x05, 0x14, 0xd0, 0x33, 0x5a, - 0x73, 0x4e, 0x76, 0xc2, 0x5a, 0xab, 0x4f, 0x55, 0x2d, 0x76, 0xa9, 0xb6, 0x4e, 0xd5, 0xd2, 0x3f, 0xff, 0x7e, 0x79, 0xe1, 0xbb, 0x9b, 0xba, 0x3a, 0x44, 0xf6, 0xe3, 0xfc, 0x55, 0x9c, 0xa9, 0x2e, - 0x4a, 0x52, 0x3c, 0x90, 0x47, 0x35, 0x5b, 0xb1, 0xa8, 0x63, 0x6f, 0x49, 0x92, 0x13, 0x17, 0x48, 0x41, 0x27, 0x11, 0x5c, 0x83, 0xb3, 0x18, 0xc7, 0x6c, 0xe4, 0x33, 0xc0, 0xc9, 0x06, 0x50, 0x9b, - 0x70, 0x4a, 0x84, 0xcf, 0x7f, 0xec, 0x6d, 0x68, 0xcd, 0xd7, 0xa5, 0x8e, 0x73, 0x6b, 0x41, 0x9d, 0xd1, 0x67, 0xc7, 0x98, 0xd6, 0xa3, 0xb7, 0xc2, 0x4e, 0xc5, 0xd4, 0xfb, 0xec, 0x85, 0xbd, 0xad, - 0x35, 0x26, 0x05, 0xdb, 0xaa, 0x6a, 0x5a, 0xc5, 0xe8, 0xab, 0x27, 0x52, 0x1b, 0x93, 0x1a, 0x28, 0x2e, 0xe2, 0x53, 0x22, 0x3c, 0x9b, 0xb5, 0x7e, 0xd5, 0x55, 0x3a, 0x77, 0xb8, 0xae, 0xcd, 0x8c, - 0xb4, 0xb8, 0xcb, 0x9a, 0xde, 0x94, 0x64, 0x71, 0x9f, 0x1a, 0x2e, 0x6b, 0x99, 0x91, 0xac, 0x2d, 0xcb, 0x66, 0x2d, 0x2c, 0xca, 0x24, 0x55, 0x82, 0x0e, 0xd2, 0x90, 0x32, 0x17, 0x30, 0xc3, 0x38, - 0x5e, 0xda, 0xfd, 0xda, 0xbc, 0xf8, 0xeb, 0xea, 0x0d, 0xfe, 0xf8, 0x38, 0x42, 0xfe, 0xb3, 0xcb, 0xf7, 0x3e, 0x02, 0x4c, 0x18, 0x29, 0xbc, 0x47, 0x5a, 0x11, 0xb0, 0x2f, 0xec, 0x3d, 0x12, 0x28, - 0xb8, 0xf7, 0xe9, 0xde, 0x0a, 0x26, 0x62, 0x6f, 0x33, 0x2a, 0x2a, 0x35, 0x64, 0xad, 0x12, 0x6b, 0x6a, 0xa3, 0xeb, 0xf1, 0x09, 0x94, 0x97, 0xd3, 0xf0, 0x27, 0xe4, 0xdb, 0x1f, 0x5f, 0x76, 0x08, - 0x90, 0xcf, 0x3d, 0x08, 0x36, 0x50, 0x6b, 0x45, 0x53, 0xc8, 0x4e, 0xd2, 0xd1, 0x9c, 0x8c, 0x1d, 0x87, 0x03, 0x8b, 0x0b, 0xf6, 0x31, 0x24, 0x56, 0x81, 0x2e, 0x23, 0xf6, 0x21, 0x80, 0x62, 0x59, - 0xb4, 0x9a, 0xe1, 0x1c, 0x9d, 0x11, 0x8e, 0x9f, 0x67, 0xf7, 0x3d, 0xc5, 0xea, 0x4d, 0x7c, 0xf0, 0x8f, 0xea, 0x1f, 0xf5, 0xd9, 0xf5, 0x9b, 0x78, 0xe3, 0xf9, 0xaf, 0xfc, 0xec, 0x22, 0x5d, 0x4e, - 0x6f, 0xa0, 0x73, 0x28, 0x94, 0x8e, 0xde, 0xa9, 0x5b, 0xa2, 0x44, 0x6f, 0xc9, 0x0c, 0x1b, 0x9f, 0x46, 0xdb, 0x16, 0xa7, 0x8f, 0x8d, 0x8a, 0x9a, 0x67, 0x4b, 0xd5, 0xd5, 0xb0, 0x99, 0x58, 0xeb, - 0x1c, 0xeb, 0xb8, 0xed, 0x3e, 0x0b, 0x20, 0xff, 0x2d, 0x91, 0x5f, 0x63, 0xab, 0x79, 0x76, 0xca, 0x97, 0x0e, 0x96, 0xc8, 0x42, 0xd9, 0x6b, 0x6a, 0x5f, 0x30, 0xc5, 0xb6, 0x7b, 0x54, 0x35, 0xb2, - 0xab, 0x8b, 0x69, 0xb9, 0x48, 0x4e, 0x15, 0xe5, 0xf0, 0x41, 0xc8, 0x22, 0xd3, 0xc9, 0x57, 0x9b, 0xd2, 0xfb, 0xf1, 0x82, 0xde, 0xf3, 0xf3, 0x26, 0x4e, 0x49, 0xf8, 0x02, 0x6a, 0x1d, 0xc6, 0xd5, - 0xb3, 0x97, 0x45, 0xb0, 0xf3, 0x90, 0xc4, 0xe6, 0x81, 0x82, 0x0d, 0x23, 0x17, 0xb7, 0x54, 0x4a, 0x42, 0xd1, 0x32, 0xce, 0xae, 0x43, 0x9d, 0xd9, 0x68, 0x89, 0xb9, 0xa5, 0xe5, 0xf2, 0xd5, 0x4b, - 0x6d, 0x70, 0x43, 0xae, 0xe3, 0x52, 0x3e, 0x3b, 0x49, 0xf1, 0xa4, 0x90, 0x97, 0xdb, 0x9b, 0xbc, 0x88, 0x47, 0xf3, 0xec, 0x99, 0x1b, 0x1d, 0xd3, 0x46, 0x9f, 0xdc, 0x18, 0x6d, 0xf9, 0xf4, 0x5e, - 0x93, 0xb0, 0xb5, 0x39, 0xfb, 0x90, 0x06, 0x0a, 0x95, 0x05, 0xe2, 0xc8, 0x34, 0x6a, 0x45, 0xac, 0x11, 0x1b, 0x72, 0xc6, 0xa5, 0x10, 0xb5, 0xc5, 0xe4, 0xe3, 0xac, 0xfd, 0xf9, 0x79, 0x1f, 0xbf, - 0xbd, 0x3c, 0x9f, 0x73, 0x2f, 0xd6, 0xc5, 0xdd, 0x97, 0x9b, 0x7b, 0xfd, 0xeb, 0x07, 0xc2, 0x7f, 0x7d, 0xea, 0xd0, 0x8c, 0xcf, 0x9e, 0x74, 0x74, 0xd4, 0x62, 0xe3, 0xe1, 0xd9, 0x9a, 0xb5, 0xd9, - 0x44, 0x87, 0xcf, 0x31, 0x7a, 0x21, 0x0d, 0x6c, 0x09, 0x80, 0xdc, 0x78, 0x30, 0xb7, 0x5c, 0xb6, 0x8c, 0xf7, 0x4f, 0x57, 0x66, 0x19, 0x1b, 0xcd, 0x8e, 0xa7, 0xe0, 0xcb, 0xed, 0x63, 0xaf, 0xf0, - 0x20, 0xec, 0xf0, 0xd9, 0x83, 0x2e, 0x24, 0x2f, 0x77, 0xea, 0x34, 0x3a, 0x39, 0xcc, 0xfd, 0x41, 0xab, 0x05, 0x3d, 0xac, 0x6f, 0x64, 0xa7, 0x6f, 0x94, 0x0e, 0xbb, 0x6d, 0xf7, 0x7c, 0x48, 0x2b, - 0x99, 0x3e, 0x83, 0xd4, 0x67, 0x61, 0x49, 0x33, 0x3e, 0xbe, 0xe7, 0xe6, 0xc5, 0x51, 0x9f, 0x8f, 0x9b, 0x49, 0x8e, 0x36, 0x44, 0xbf, 0x57, 0x2f, 0x5e, 0x34, 0x44, 0xfe, 0x36, 0xe5, 0xb9, 0xfd, - 0xf2, 0xf0, 0x2a, 0xe9, 0x9e, 0x7b, 0x81, 0xb8, 0xc5, 0x80, 0x16, 0xd8, 0x64, 0x04, 0x8c, 0xa6, 0x16, 0xc1, 0x52, 0xc5, 0x39, 0x22, 0xb8, 0xb7, 0x36, 0x97, 0x0a, 0x71, 0xcf, 0x1a, 0x95, 0xd4, - 0xb4, 0x51, 0x63, 0x35, 0xed, 0x83, 0x2c, 0x56, 0xad, 0x79, 0x8a, 0x27, 0x3c, 0xab, 0x4a, 0x1f, 0xd4, 0x21, 0xce, 0xee, 0xa6, 0xd1, 0x45, 0x0d, 0x7c, 0xc6, 0x28, 0x87, 0x4c, 0xe9, 0x95, 0x73, - 0x66, 0x0f, 0x91, 0x62, 0x80, 0x54, 0x6b, 0xac, 0x2b, 0x88, 0xa3, 0xf9, 0x7e, 0xaa, 0x15, 0xd7, 0x58, 0x50, 0xd6, 0xc1, 0x54, 0x79, 0xf9, 0xa9, 0xfa, 0xe0, 0xe3, 0xc1, 0x5e, 0xaf, 0xf9, 0xe6, - 0xb9, 0xc1, 0x75, 0x3a, 0x13, 0x90, 0x5a, 0xaa, 0x6b, 0x3a, 0xa3, 0x26, 0x32, 0xaf, 0x90, 0x90, 0xd1, 0x57, 0x25, 0x29, 0x05, 0xe0, 0x66, 0xbf, 0x1d, 0x74, 0x91, 0x63, 0x26, 0xf4, 0xde, 0x87, - 0x6c, 0xd9, 0x63, 0x06, 0x9c, 0xaa, 0xa2, 0x3c, 0x3b, 0x8d, 0xec, 0x50, 0x86, 0x79, 0xee, 0x5c, 0xc7, 0x22, 0x29, 0x1c, 0x2e, 0x15, 0x9a, 0x63, 0x2a, 0xf9, 0xb2, 0x55, 0xdd, 0x35, 0xc5, 0xb3, - 0x67, 0x4a, 0x85, 0x67, 0x07, 0x5a, 0x4e, 0xac, 0x32, 0x72, 0x82, 0x48, 0x48, 0x93, 0x0a, 0x59, 0xbd, 0xf8, 0x78, 0xe9, 0x6f, 0x3f, 0x91, 0xf6, 0x38, 0x11, 0xb0, 0x8f, 0x8d, 0x5f, 0x1e, 0x1e, - 0x0b, 0x07, 0x4f, 0xe7, 0xad, 0x9d, 0x70, 0x99, 0x57, 0xa7, 0xae, 0xbd, 0x8c, 0x30, 0x7c, 0x76, 0xeb, 0xcb, 0x28, 0x25, 0x56, 0xae, 0x15, 0xe2, 0x2d, 0xfa, 0x04, 0x25, 0x94, 0xe4, 0xde, 0xb1, - 0x01, 0xd4, 0x74, 0x1c, 0x81, 0xa3, 0xa4, 0xc1, 0x48, 0x98, 0x11, 0xcb, 0x10, 0x84, 0x54, 0xac, 0x1b, 0x0e, 0xcf, 0xe3, 0xb2, 0x1f, 0x6e, 0x7d, 0xf9, 0xed, 0x9f, 0x5f, 0x8f, 0x8f, 0xda, 0x0e, - 0x29, 0xee, 0xf9, 0x83, 0x48, 0x01, 0x76, 0x19, 0xe1, 0x6b, 0x8b, 0xa2, 0x32, 0xa8, 0x49, 0xf5, 0xe0, 0x9a, 0x45, 0xad, 0x31, 0x70, 0x26, 0x83, 0x60, 0xe5, 0xde, 0x49, 0x11, 0x66, 0xa5, 0x8d, - 0x01, 0x1e, 0x36, 0x08, 0x21, 0x4d, 0x8f, 0x57, 0x3f, 0x9f, 0xef, 0x80, 0x7a, 0xb6, 0xb5, 0x7c, 0xbb, 0x7e, 0xda, 0xab, 0x7a, 0x5a, 0xea, 0xab, 0xcb, 0x1b, 0xbd, 0xbe, 0xf8, 0xb8, 0xdb, 0xfd, - 0x7e, 0xf1, 0x55, 0xbc, 0x03, 0x37, 0x38, 0x7f, 0x93, 0x25, 0xa9, 0x25, 0x8f, 0xd1, 0x57, 0x38, 0xaa, 0x83, 0xb3, 0xbb, 0x85, 0x0e, 0x45, 0xc1, 0x28, 0x85, 0x11, 0x8f, 0xa7, 0xed, 0xe0, 0x84, - 0xb6, 0x5a, 0xe7, 0x9a, 0xe0, 0x53, 0x46, 0xf5, 0x89, 0x0b, 0x89, 0xec, 0x78, 0xff, 0xeb, 0xed, 0x62, 0xef, 0x7e, 0x4c, 0xfa, 0xb0, 0x79, 0x71, 0xee, 0x0e, 0x6c, 0x35, 0x1e, 0xea, 0x23, 0x9a, - 0x72, 0x0e, 0xeb, 0x0b, 0x60, 0x14, 0x42, 0x24, 0x18, 0x79, 0x72, 0x65, 0xe7, 0x06, 0x25, 0x26, 0xe1, 0xa3, 0x7c, 0xac, 0x39, 0xd1, 0xd3, 0x32, 0x71, 0xda, 0xb0, 0x49, 0xfd, 0x14, 0x75, 0xfe, - 0x56, 0x01, 0x3c, 0x84, 0x71, 0xe7, 0xa6, 0x1e, 0x95, 0x50, 0x83, 0x5d, 0x72, 0xd5, 0x70, 0x52, 0xd4, 0x39, 0x35, 0x26, 0x91, 0xca, 0x70, 0xc6, 0x50, 0x75, 0xd4, 0x00, 0x70, 0xc4, 0x46, 0x63, - 0x7f, 0x8c, 0xcc, 0x4c, 0x16, 0x01, 0x33, 0xec, 0x13, 0xf0, 0x64, 0x86, 0x7b, 0x3a, 0xbd, 0xf1, 0x70, 0xf9, 0xcf, 0xcd, 0x8a, 0x27, 0x2a, 0xaa, 0xb4, 0x96, 0x19, 0x8b, 0x42, 0xab, 0xad, 0x35, - 0xd0, 0x4b, 0x75, 0x4d, 0x65, 0x31, 0x8e, 0x3e, 0x67, 0x95, 0x8c, 0x2a, 0x32, 0x6d, 0x08, 0x40, 0xd8, 0x67, 0x6f, 0x82, 0x0b, 0x32, 0xe6, 0x7c, 0x73, 0x84, 0x66, 0x8f, 0x43, 0x1e, 0x0b, 0xd5, - 0xa7, 0x2c, 0xec, 0xcb, 0xeb, 0xfc, 0xc1, 0xe7, 0xae, 0xb9, 0x6a, 0xcb, 0xe5, 0x61, 0x1b, 0x68, 0x14, 0x15, 0x25, 0x9d, 0x94, 0x10, 0xb6, 0x0c, 0xd9, 0xb8, 0x8f, 0x4c, 0x01, 0x36, 0x76, 0xae, - 0x85, 0x32, 0x9d, 0xa7, 0x36, 0xe6, 0xcd, 0xfa, 0x46, 0x03, 0x53, 0x3b, 0x31, 0xe3, 0x7c, 0x7a, 0x1b, 0xfc, 0xdf, 0x2a, 0x79, 0x7c, 0xdf, 0x46, 0x7c, 0x88, 0x5f, 0xce, 0x2d, 0x7d, 0x8f, 0xca, - 0x58, 0x22, 0x05, 0x69, 0x30, 0x6a, 0xf4, 0xcc, 0xe5, 0x53, 0x41, 0xd5, 0xc2, 0x96, 0xb2, 0xa0, 0x4c, 0x92, 0x1c, 0x38, 0x27, 0xcd, 0x56, 0x0e, 0x1a, 0x45, 0x98, 0x7d, 0xc6, 0x5a, 0x4e, 0x75, - 0xbc, 0x2e, 0xf0, 0xa8, 0xd7, 0x1f, 0x1c, 0xe6, 0xff, 0x6a, 0x96, 0x78, 0x5f, 0x3d, 0x3c, 0x77, 0x5c, 0xf4, 0x00, 0xb7, 0x4a, 0x37, 0x8c, 0x26, 0x46, 0xa9, 0x4c, 0x66, 0xa3, 0x69, 0x08, 0x60, - 0x1a, 0x99, 0x94, 0xb6, 0x51, 0xbd, 0x01, 0x8b, 0x0f, 0x93, 0x0e, 0x8d, 0xd3, 0xa2, 0x50, 0x44, 0x94, 0x96, 0x1c, 0x8f, 0x8b, 0x07, 0xa7, 0xba, 0x3e, 0x3b, 0x50, 0xfc, 0xea, 0x53, 0x3e, 0x3b, - 0x5d, 0x7b, 0xbb, 0xfa, 0x76, 0xfa, 0xed, 0x1b, 0xcb, 0x70, 0x6c, 0x47, 0xe3, 0xf9, 0xa1, 0x6a, 0xcf, 0x46, 0x23, 0x5b, 0xb5, 0x0d, 0xeb, 0xd5, 0x52, 0x77, 0x1a, 0x9c, 0x73, 0x19, 0xa2, 0xc0, - 0x8c, 0x1e, 0x36, 0x71, 0xcc, 0xec, 0x36, 0x48, 0xbd, 0xfb, 0xdc, 0x22, 0x10, 0x42, 0x55, 0x49, 0x2b, 0x38, 0x7d, 0x7e, 0xce, 0x73, 0x29, 0x7f, 0x36, 0xe3, 0xaf, 0x58, 0xa0, 0x93, 0x38, 0xb9, - 0x85, 0xae, 0x86, 0xb6, 0x92, 0x62, 0x42, 0x8c, 0xc1, 0x58, 0x5b, 0x7e, 0x27, 0x40, 0x82, 0xd9, 0x3b, 0x52, 0x2c, 0xe8, 0x1d, 0x19, 0x97, 0x26, 0xf5, 0x1e, 0xc1, 0xb3, 0xc6, 0xf1, 0x43, 0x8c, - 0x9f, 0x2b, 0xed, 0xa4, 0x92, 0x6e, 0xbe, 0xbc, 0xce, 0x16, 0xe7, 0x3f, 0xf0, 0x96, 0x8c, 0x7a, 0x87, 0x02, 0x32, 0xe3, 0x48, 0xae, 0x51, 0x34, 0x9c, 0x1d, 0x26, 0x65, 0x6b, 0x22, 0x36, 0x1a, - 0xf7, 0x29, 0xb3, 0xb2, 0x87, 0x49, 0x89, 0x63, 0x2c, 0x0d, 0x31, 0xcc, 0x64, 0xf4, 0x81, 0xc7, 0x63, 0xd1, 0xd3, 0xcb, 0x7f, 0xf8, 0xb1, 0x25, 0xbe, 0x78, 0xee, 0x67, 0x9b, 0xa3, 0x87, 0x6e, - 0x09, 0x90, 0xb3, 0xe9, 0x9c, 0x58, 0x2c, 0x64, 0xd6, 0x6a, 0xe9, 0xe2, 0xf4, 0x0d, 0xa6, 0xd9, 0x12, 0x85, 0x4e, 0xbd, 0x7b, 0xcd, 0xdc, 0x94, 0x0a, 0x01, 0x6d, 0x6a, 0xc4, 0x0c, 0xdb, 0xf2, - 0xe4, 0x29, 0x73, 0xdc, 0xef, 0xd9, 0x3a, 0x50, 0xd4, 0xf9, 0x91, 0x77, 0x40, 0x24, 0xb2, 0x62, 0xa6, 0x5b, 0xb6, 0x56, 0x28, 0x4b, 0x78, 0x6d, 0xc8, 0x5a, 0x82, 0xa5, 0x17, 0x44, 0x9f, 0xd2, - 0xa3, 0x45, 0x00, 0x8c, 0x49, 0xe0, 0x1d, 0x9d, 0x27, 0x35, 0xc8, 0x61, 0x0e, 0x70, 0xbc, 0x7b, 0xf9, 0x7c, 0xb2, 0xea, 0xfb, 0x2e, 0x99, 0x67, 0x7b, 0xee, 0x77, 0x87, 0x4d, 0xdd, 0xc7, 0xeb, - 0x63, 0x7b, 0x3c, 0x8f, 0xa2, 0xd0, 0xdf, 0x0e, 0x0e, 0x7e, 0xfe, 0x5b, 0x85, 0x80, 0x67, 0x7b, 0xdf, 0x0e, 0xf9, 0xcc, 0xb9, 0xeb, 0x3d, 0x84, 0x9d, 0x63, 0x09, 0xd2, 0x00, 0x90, 0xd1, 0x29, - 0x12, 0x62, 0xd5, 0xc0, 0xee, 0x82, 0x02, 0x00, 0x52, 0x3c, 0x53, 0x44, 0xdc, 0x78, 0x72, 0x0f, 0xe6, 0xc4, 0xd9, 0x27, 0x23, 0xae, 0xe2, 0x9c, 0xf6, 0xc3, 0xfd, 0x46, 0x3f, 0x1c, 0x49, 0xfc, - 0xd1, 0x97, 0xd4, 0xfc, 0x68, 0xdf, 0xdf, 0xd7, 0x07, 0x0e, 0x9d, 0x67, 0x9c, 0x9b, 0xf4, 0x28, 0x02, 0xe4, 0x68, 0xaa, 0x13, 0x4c, 0x02, 0x51, 0xa9, 0xeb, 0xca, 0x84, 0x81, 0xfb, 0x23, 0x1e, - 0x16, 0xcd, 0x69, 0x30, 0x74, 0x8d, 0xde, 0x12, 0x62, 0xf4, 0xfd, 0x9c, 0xa2, 0xd7, 0xfe, 0xf4, 0x4f, 0xd8, 0x77, 0xc5, 0x7e, 0xd0, 0x3d, 0xdf, 0xbd, 0xf1, 0x85, 0x2b, 0x4f, 0x52, 0xfe, 0x28, - 0x68, 0x3e, 0x7f, 0xea, 0xd5, 0x82, 0x9c, 0xdb, 0x21, 0x3b, 0x6e, 0x00, 0xc6, 0x74, 0x5f, 0x73, 0xa9, 0x58, 0x48, 0x40, 0xb0, 0xb1, 0xfe, 0xa4, 0x9c, 0x6d, 0x12, 0xad, 0x5c, 0xb5, 0x62, 0x95, - 0xeb, 0x1c, 0x23, 0xa7, 0xb5, 0x39, 0x2a, 0x3b, 0x39, 0x0b, 0xf7, 0x76, 0xe2, 0xeb, 0x0d, 0x9e, 0x1f, 0xaa, 0x7c, 0x4a, 0xca, 0xa7, 0x4d, 0xc6, 0x07, 0x40, 0xed, 0x27, 0x14, 0x84, 0x85, 0x65, - 0xb6, 0x2c, 0x19, 0x21, 0x8c, 0xd9, 0x47, 0xda, 0x2c, 0x1c, 0x23, 0x8d, 0x2a, 0x9b, 0xb1, 0x0c, 0xb0, 0x49, 0x52, 0x30, 0xa3, 0xf5, 0x48, 0x9f, 0xe5, 0x88, 0xba, 0x8a, 0x08, 0x1d, 0xcc, 0x4e, - 0x9d, 0xf7, 0xfa, 0x62, 0x43, 0xd1, 0x21, 0x1c, 0x3b, 0xb7, 0xd5, 0x66, 0xda, 0xb2, 0xec, 0x20, 0x66, 0xcd, 0x65, 0x1a, 0x7b, 0x63, 0x76, 0xc6, 0xbe, 0x85, 0xcb, 0x04, 0x4c, 0x77, 0x75, 0x83, - 0x4c, 0xcd, 0x69, 0xb2, 0x20, 0x07, 0x95, 0x1b, 0xe3, 0xe4, 0xd5, 0x80, 0x4f, 0x1c, 0x56, 0xf2, 0x7d, 0x7b, 0xd4, 0x09, 0x15, 0x1d, 0xdf, 0x22, 0x75, 0x68, 0x91, 0xed, 0xdc, 0xdc, 0x29, 0x08, - 0x49, 0xb6, 0x30, 0x26, 0xd8, 0x54, 0x52, 0x36, 0xaa, 0x04, 0x6b, 0xf4, 0xd8, 0xc8, 0x14, 0xa6, 0x65, 0xb3, 0xea, 0x89, 0x2e, 0x89, 0x3a, 0x88, 0x30, 0x86, 0x8c, 0x68, 0xab, 0x28, 0x17, 0xa1, - 0x9d, 0x98, 0x49, 0xfb, 0x8a, 0x44, 0x7e, 0x28, 0xec, 0xc6, 0x2f, 0x0e, 0xe1, 0xd8, 0xb9, 0xc9, 0xc3, 0x72, 0xb7, 0xd5, 0x63, 0xb6, 0xda, 0x60, 0xd9, 0x1c, 0x59, 0xd9, 0x8a, 0x17, 0x2b, 0x35, - 0x6b, 0xd3, 0x48, 0xa9, 0xe5, 0x18, 0x0d, 0x63, 0xaa, 0x8f, 0x49, 0x06, 0x6b, 0x0e, 0x29, 0xea, 0x63, 0xb1, 0x8d, 0x51, 0xa7, 0xaa, 0x87, 0x0f, 0xb7, 0x2f, 0x33, 0x4d, 0xff, 0x09, 0xaf, 0xae, - 0x04, 0xec, 0x63, 0x0d, 0xeb, 0x31, 0x86, 0x51, 0xf9, 0xa0, 0x68, 0x6b, 0xb6, 0xe4, 0x2d, 0x91, 0x8c, 0x35, 0xa2, 0xd1, 0xb2, 0x1e, 0x4a, 0xd9, 0xb0, 0x92, 0x9a, 0xad, 0xb1, 0x51, 0xa5, 0x9a, - 0x15, 0xc4, 0xeb, 0xc4, 0xc8, 0xfb, 0xb1, 0xca, 0x59, 0xdc, 0x3c, 0xf6, 0x44, 0xff, 0xb9, 0xc3, 0x58, 0x9e, 0x96, 0xe1, 0xe9, 0xdc, 0x82, 0x97, 0x0a, 0x95, 0xb3, 0xf7, 0x0d, 0x51, 0x16, 0xa3, - 0x51, 0x9b, 0x6c, 0x93, 0x82, 0x9b, 0x0c, 0x5b, 0x6a, 0xda, 0x68, 0x72, 0x91, 0x73, 0xc8, 0x08, 0x80, 0xe6, 0x5a, 0x3e, 0x70, 0x02, 0x78, 0x26, 0xc0, 0xc8, 0x50, 0x5e, 0x9c, 0xb8, 0xc6, 0xa9, - 0xdd, 0x0c, 0xfb, 0xb9, 0xc9, 0x03, 0x7f, 0x6b, 0xef, 0xe1, 0x5f, 0xb7, 0xfb, 0x17, 0x77, 0x37, 0xfa, 0xf9, 0xee, 0xe3, 0xee, 0xfe, 0xe2, 0xf3, 0x6d, 0xfe, 0x71, 0x95, 0x7f, 0x9e, 0xbb, 0x02, - 0x23, 0xbe, 0x62, 0x71, 0x72, 0xb7, 0x89, 0x3a, 0x0c, 0xc3, 0xfa, 0x8a, 0xd6, 0x3c, 0xbb, 0xf4, 0xc1, 0xde, 0x71, 0xb6, 0xb5, 0x0a, 0x8b, 0x1a, 0x10, 0xc7, 0x24, 0xe5, 0x54, 0x9b, 0xc3, 0x58, - 0x36, 0xa1, 0xfa, 0x29, 0x23, 0x7d, 0xaa, 0x5d, 0x1c, 0x46, 0xcc, 0x73, 0x07, 0x11, 0xf2, 0x35, 0x44, 0xe7, 0x46, 0x6f, 0x82, 0x55, 0x96, 0x50, 0x4f, 0x92, 0xd1, 0xb1, 0xe7, 0x06, 0x01, 0xd4, - 0x52, 0x86, 0x48, 0xdf, 0x42, 0xe4, 0x6c, 0x39, 0xd6, 0xc4, 0x86, 0x40, 0xd1, 0x97, 0x01, 0x14, 0xb6, 0xe3, 0x41, 0xe4, 0x89, 0x9f, 0x5f, 0xcd, 0x35, 0x2f, 0x3e, 0xfb, 0xc5, 0x57, 0x14, 0x78, - 0x79, 0xf3, 0xf0, 0xac, 0x2c, 0x73, 0xf1, 0xd7, 0x9a, 0x1f, 0x26, 0xbe, 0x7e, 0xe0, 0x84, 0xa5, 0xbe, 0xf1, 0x47, 0x0f, 0xab, 0x54, 0xe7, 0x4e, 0x8d, 0xea, 0xc3, 0x16, 0xfb, 0x1c, 0xb3, 0x03, - 0xf6, 0x19, 0x21, 0x26, 0xd2, 0x92, 0x3c, 0x61, 0x74, 0xc9, 0x2a, 0x42, 0x32, 0x77, 0x33, 0x1b, 0x58, 0xc3, 0x12, 0xa4, 0x6a, 0x96, 0x4d, 0x35, 0x6a, 0xc6, 0x76, 0x6a, 0x4c, 0xeb, 0x79, 0x19, - 0xe3, 0x30, 0x5b, 0x9c, 0x3b, 0x33, 0x32, 0xa4, 0x4f, 0xcf, 0xb5, 0x91, 0x20, 0x5a, 0x8d, 0x9a, 0x6b, 0x52, 0x92, 0x2f, 0x2e, 0x21, 0x5d, 0x29, 0x1c, 0xdd, 0xc1, 0xd1, 0x00, 0x5a, 0xef, 0xa3, - 0xc6, 0xd0, 0x31, 0x30, 0x87, 0x27, 0x45, 0x36, 0x3e, 0x3e, 0xa2, 0xf0, 0xa3, 0xfa, 0xda, 0x9b, 0x8a, 0xfe, 0xd9, 0x4a, 0xe3, 0xd6, 0xb3, 0x77, 0x5e, 0xd8, 0x02, 0x88, 0xbd, 0x65, 0x36, 0x8f, - 0x5e, 0xd6, 0xfb, 0xfe, 0xfb, 0xa8, 0x94, 0x70, 0x36, 0xcd, 0x95, 0xb8, 0x4a, 0xbb, 0x2b, 0x4b, 0x3a, 0x76, 0x2f, 0x6f, 0x32, 0x5a, 0x7b, 0x23, 0xd6, 0x3c, 0xa3, 0x34, 0x07, 0x22, 0x9c, 0xff, - 0x4b, 0x37, 0x99, 0xfa, 0x1a, 0x96, 0x94, 0x65, 0x7d, 0x8d, 0x16, 0x83, 0x53, 0x1b, 0xf6, 0x31, 0xa9, 0x00, 0xc4, 0xa1, 0xa7, 0x77, 0x18, 0x1e, 0x5d, 0x74, 0xa4, 0xa5, 0x9b, 0x83, 0x8c, 0xa0, - 0x3e, 0x1a, 0xd9, 0x9c, 0x71, 0x1c, 0xcf, 0x7c, 0x95, 0xe0, 0x5e, 0x6f, 0x2f, 0xf3, 0xfe, 0x0d, 0x5c, 0x73, 0xf8, 0xe0, 0x81, 0xb8, 0xe7, 0x4f, 0x9a, 0x2b, 0xa9, 0x2d, 0x70, 0x00, 0x0f, 0x44, - 0x17, 0x6b, 0xbe, 0x96, 0x86, 0x8d, 0xb9, 0x81, 0x9c, 0x56, 0xcd, 0x43, 0xc6, 0x04, 0x8a, 0x8c, 0x05, 0xde, 0x09, 0x94, 0x29, 0x90, 0x3b, 0xd3, 0x34, 0x0c, 0x38, 0x71, 0xda, 0xfd, 0x93, 0x14, - 0x1f, 0x54, 0x6f, 0xfd, 0xe3, 0xc4, 0x0f, 0x97, 0x37, 0x0f, 0xd7, 0xd7, 0x7f, 0x7c, 0x7a, 0xce, 0x4f, 0xbf, 0xfd, 0xec, 0xd3, 0xdd, 0x1f, 0x2f, 0x86, 0x76, 0x3f, 0x6c, 0xd1, 0xe6, 0xc3, 0xb3, - 0xb8, 0xf5, 0xfd, 0xe6, 0xab, 0x47, 0x1f, 0xad, 0xfc, 0xd5, 0xc3, 0xdf, 0x6f, 0xbf, 0xfa, 0x57, 0x9f, 0x7e, 0xf4, 0xf4, 0x97, 0xde, 0x56, 0xc2, 0xab, 0xd7, 0xff, 0xe9, 0xca, 0x20, 0xd9, 0x70, - 0x56, 0x5b, 0xc4, 0x60, 0x73, 0x99, 0xc3, 0x8a, 0x15, 0x24, 0xad, 0xd3, 0x18, 0xdd, 0x09, 0xab, 0x99, 0x4a, 0x88, 0x6e, 0x70, 0x33, 0xb3, 0xc8, 0x44, 0x0c, 0xba, 0x69, 0x37, 0x98, 0xb2, 0xea, - 0xd4, 0xa6, 0xa0, 0xa3, 0x4b, 0xfe, 0xd3, 0x85, 0x49, 0x58, 0xb9, 0xd6, 0x44, 0x9d, 0x50, 0x30, 0xb3, 0x20, 0xa0, 0x0a, 0x4d, 0x01, 0x5b, 0xc7, 0xb0, 0x65, 0x50, 0xb6, 0x39, 0x1a, 0xf3, 0x54, - 0xf2, 0x40, 0x9e, 0xd8, 0x52, 0xb0, 0x27, 0x2d, 0xc7, 0xc0, 0x37, 0x92, 0xf4, 0x4b, 0x33, 0xf9, 0xe9, 0x82, 0xf8, 0x6c, 0x21, 0x9d, 0x63, 0x85, 0x62, 0x0b, 0x95, 0xa9, 0xab, 0x15, 0x74, 0xc1, - 0x25, 0x83, 0x46, 0xce, 0xc5, 0x43, 0x78, 0x70, 0x0c, 0x4b, 0x57, 0x1c, 0x0d, 0xc9, 0x97, 0x56, 0xba, 0xe8, 0x68, 0xba, 0xf0, 0x07, 0x51, 0xed, 0x99, 0x69, 0xff, 0x74, 0x49, 0x10, 0x63, 0x21, - 0xd8, 0x4c, 0x9f, 0x28, 0x85, 0x0b, 0x14, 0xdb, 0x06, 0xa5, 0xa0, 0xc4, 0x27, 0x35, 0x58, 0x26, 0x3d, 0x96, 0x0c, 0xa4, 0x08, 0x41, 0xe8, 0x6c, 0x95, 0x30, 0xd5, 0x11, 0x31, 0x1a, 0x9c, 0x9c, - 0xbb, 0x3d, 0xe2, 0x8e, 0x3f, 0x5d, 0x94, 0x15, 0x29, 0xad, 0xdb, 0xb2, 0x55, 0x69, 0x44, 0x0e, 0x13, 0xd7, 0x64, 0x2f, 0x40, 0x8e, 0x50, 0x10, 0x2e, 0xe9, 0x41, 0x2d, 0x4b, 0x83, 0x0c, 0xa5, - 0x45, 0x99, 0xac, 0x9a, 0x66, 0xc6, 0xe0, 0x76, 0x72, 0x1b, 0xfe, 0x89, 0x10, 0xf2, 0xd3, 0xc5, 0xe9, 0x33, 0xb0, 0x19, 0x4e, 0x1d, 0x33, 0x90, 0xc6, 0xbe, 0xc6, 0x1d, 0x59, 0x0d, 0xd7, 0x0c, - 0x72, 0xd6, 0x45, 0x61, 0xbd, 0x27, 0x4d, 0xad, 0x1a, 0x38, 0x71, 0xc8, 0xc2, 0xd4, 0x45, 0xd4, 0x30, 0x05, 0xf5, 0x47, 0xce, 0xf2, 0x3c, 0xec, 0xfd, 0x74, 0x59, 0x44, 0xd3, 0x29, 0x74, 0x8c, - 0x46, 0x1d, 0x1b, 0x2d, 0x9f, 0xd1, 0x14, 0xd5, 0x41, 0xad, 0x11, 0xb6, 0x86, 0xe2, 0x60, 0x42, 0x40, 0x15, 0x09, 0x13, 0xfb, 0x30, 0xe8, 0x45, 0x59, 0xd0, 0x60, 0xda, 0xfe, 0xd4, 0xde, 0xa3, - 0xb2, 0xec, 0xbf, 0xce, 0xf7, 0x00, 0xb3, 0xf5, 0xf7, 0xe3, 0x5f, 0xb7, 0xfb, 0x1b, 0x7a, 0x3b, 0xbb, 0x1c, 0x3c, 0x33, 0xb5, 0x8d, 0x5e, 0x06, 0x1d, 0x13, 0xb2, 0x8d, 0x0a, 0xf1, 0x5e, 0x14, - 0x14, 0x24, 0x14, 0x4b, 0x65, 0xb2, 0x2a, 0xf7, 0xb1, 0xba, 0x7a, 0x2f, 0x89, 0x21, 0xe5, 0x2e, 0xa4, 0x15, 0xb0, 0xe0, 0x78, 0x67, 0x62, 0x7b, 0xdb, 0x8b, 0x3b, 0xad, 0x37, 0x8a, 0x6c, 0xdf, - 0x1f, 0x79, 0x2e, 0xed, 0x7c, 0x0f, 0xef, 0xf1, 0xbb, 0xb0, 0xe7, 0xa6, 0x89, 0xac, 0x65, 0x68, 0x84, 0xb6, 0xa4, 0x81, 0x17, 0x21, 0xf2, 0x1c, 0xcb, 0xb7, 0x3b, 0x85, 0xb9, 0x74, 0x92, 0x5b, - 0x46, 0xf0, 0x1a, 0x5a, 0xb2, 0x4c, 0x96, 0xcf, 0x5e, 0x95, 0x1b, 0x44, 0x58, 0x44, 0x78, 0x7c, 0xe2, 0xe2, 0x5b, 0x99, 0xfb, 0x51, 0xa4, 0xb7, 0x2a, 0xd2, 0xdf, 0x9e, 0x78, 0x59, 0x25, 0x80, - 0xf7, 0xfc, 0xf3, 0x64, 0x16, 0x24, 0x10, 0x1f, 0xa6, 0xbd, 0x92, 0xa8, 0x0b, 0x06, 0x53, 0xdf, 0x48, 0x22, 0x76, 0xa7, 0x01, 0xee, 0xa5, 0xc6, 0x13, 0x9a, 0x74, 0xea, 0x2d, 0x8a, 0x51, 0x61, - 0x35, 0xe5, 0x15, 0xdd, 0x86, 0x73, 0x9d, 0x38, 0x3f, 0xdb, 0x5f, 0x56, 0xf8, 0x9f, 0xed, 0xab, 0xd8, 0x84, 0xff, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe1, 0x56, 0xaf, - 0x8e, 0x26, 0x1f, 0x00, 0x00, 0xbc, 0x7e, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x9c, 0x8e, 0xb1, 0xae, 0x83, - 0x30, 0x0c, 0x45, 0x77, 0x7f, 0x05, 0xca, 0x4e, 0x14, 0x1e, 0x20, 0xb1, 0xbc, 0x2f, 0x41, 0xa8, 0x4a, 0x83, 0x9b, 0x46, 0x50, 0x07, 0x05, 0x97, 0xf2, 0xf9, 0x95, 0x09, 0x1d, 0xba, 0x76, 0xf4, - 0x91, 0xef, 0xb9, 0x17, 0xfa, 0xc5, 0xba, 0xc9, 0x7a, 0x1c, 0x80, 0xec, 0x03, 0x8b, 0xff, 0x42, 0xdd, 0x9e, 0xe4, 0x38, 0x44, 0x52, 0xb0, 0x61, 0x5a, 0x43, 0x24, 0x81, 0x46, 0x57, 0xda, 0x28, - 0xc0, 0x31, 0xf0, 0x49, 0xfe, 0x4c, 0xd5, 0x29, 0x80, 0x7e, 0xc4, 0x05, 0x69, 0x44, 0x72, 0x01, 0xd7, 0x01, 0xac, 0xe3, 0xb0, 0x97, 0x2f, 0xbc, 0xca, 0x4b, 0xa3, 0x6b, 0x09, 0x65, 0x96, 0xf8, - 0x48, 0xe9, 0x4e, 0xd0, 0x1c, 0x7d, 0xb6, 0x36, 0x87, 0x95, 0xb6, 0xcb, 0x1c, 0xbd, 0xc7, 0x74, 0x56, 0x19, 0xa1, 0x09, 0x3d, 0xee, 0x02, 0x2a, 0xdd, 0xea, 0x56, 0x01, 0xc7, 0x29, 0xc4, 0x7c, - 0x77, 0xba, 0xf9, 0x68, 0xef, 0xcc, 0x8b, 0xc0, 0x3a, 0x77, 0xc9, 0x9e, 0xad, 0xfc, 0xde, 0xf4, 0x93, 0xe8, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x16, 0x62, 0x3c, 0xce, 0x9c, - 0x00, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x7c, 0x54, 0xe1, 0x6f, 0x1b, 0xb7, 0x0f, 0xfd, - 0xae, 0xbf, 0x82, 0x4d, 0x7f, 0x40, 0x9a, 0x1f, 0xe2, 0x73, 0x3f, 0x16, 0x46, 0x57, 0xa0, 0xc8, 0xda, 0x26, 0xe8, 0xd0, 0x14, 0x89, 0x83, 0x21, 0xc8, 0x8a, 0x9e, 0xac, 0xe3, 0x59, 0x6a, 0x64, - 0xf1, 0x26, 0x52, 0xe7, 0x78, 0xc3, 0xfe, 0xf7, 0x41, 0x92, 0xed, 0x38, 0x68, 0xd7, 0x6f, 0x77, 0x12, 0xf9, 0x44, 0xbe, 0xf7, 0xc8, 0xe7, 0x70, 0x95, 0x58, 0xe0, 0x7c, 0x3e, 0xff, 0x0c, 0xef, - 0x53, 0x30, 0xe2, 0x28, 0x28, 0xf5, 0x3b, 0x7a, 0x43, 0x2b, 0x04, 0x21, 0xd8, 0x50, 0x8a, 0x10, 0x70, 0x5d, 0xe3, 0xfa, 0x6d, 0x08, 0x0c, 0x91, 0xbe, 0xa1, 0x91, 0x67, 0x30, 0xb7, 0x08, 0x0b, - 0x72, 0x1e, 0xe3, 0xe0, 0xb5, 0xa0, 0xba, 0xd3, 0x46, 0xdc, 0xc3, 0x97, 0x17, 0x56, 0x64, 0xe0, 0xd9, 0x74, 0x5a, 0x7e, 0x9b, 0xc8, 0xd3, 0x13, 0x58, 0xe3, 0x02, 0x18, 0xe3, 0x88, 0x11, 0x1c, - 0x83, 0x0b, 0xea, 0xae, 0xe5, 0x68, 0xa6, 0x2b, 0xed, 0x42, 0x13, 0xb9, 0xfd, 0xf2, 0xa2, 0x99, 0x1e, 0xfc, 0x9f, 0x34, 0x70, 0x21, 0xc7, 0x0c, 0x86, 0x42, 0xef, 0x96, 0x29, 0x62, 0x97, 0xcb, - 0x71, 0x61, 0xa4, 0x7b, 0x04, 0xb1, 0x08, 0xad, 0x0b, 0x1d, 0x3e, 0xb4, 0x6a, 0x5f, 0x93, 0x0b, 0x50, 0x11, 0xad, 0x0e, 0x9d, 0xc7, 0x78, 0x08, 0xfa, 0x78, 0x74, 0x92, 0xe3, 0x22, 0xf2, 0x40, - 0x81, 0x4b, 0x87, 0x0b, 0x12, 0xab, 0x3e, 0xbc, 0x9b, 0x83, 0x0e, 0x1d, 0x7c, 0xbe, 0xbc, 0x9e, 0x43, 0xc4, 0x3f, 0x13, 0xb2, 0x70, 0x03, 0xb7, 0x94, 0x80, 0x2d, 0x25, 0xdf, 0xc1, 0x90, 0xa4, - 0x92, 0xd1, 0x21, 0xbb, 0x5c, 0xcd, 0x02, 0xad, 0x1e, 0x1d, 0x45, 0x70, 0x81, 0x5d, 0x87, 0x4a, 0xac, 0x96, 0x5d, 0x51, 0x7b, 0xa2, 0x1a, 0xb8, 0x08, 0x60, 0x34, 0x63, 0xce, 0x85, 0x80, 0xb5, - 0x8b, 0x7d, 0x4f, 0x8a, 0x33, 0xcd, 0x11, 0x99, 0x52, 0x34, 0xc8, 0xd0, 0x53, 0xac, 0x8f, 0xec, 0xf2, 0x4f, 0x4b, 0x9e, 0xd1, 0x01, 0x3a, 0x82, 0xf2, 0x82, 0x0b, 0xa5, 0xfb, 0xbb, 0x76, 0x0f, - 0xf2, 0xf8, 0xda, 0xae, 0xdb, 0x7a, 0x55, 0x48, 0x54, 0x2a, 0x2b, 0xa4, 0x87, 0x01, 0xd6, 0xce, 0x7b, 0xc0, 0x87, 0x81, 0x72, 0xdb, 0x36, 0x22, 0x02, 0x86, 0x6e, 0x20, 0x17, 0x84, 0x67, 0x4a, - 0x01, 0xfc, 0x1f, 0xda, 0x69, 0x0b, 0xf3, 0xe8, 0x96, 0x4b, 0x8c, 0x7c, 0x48, 0xf1, 0x41, 0x35, 0xb9, 0x40, 0x74, 0x62, 0x31, 0x42, 0xa6, 0x8c, 0x62, 0x65, 0x6c, 0x85, 0x62, 0xa9, 0xe3, 0x2d, - 0x8a, 0x45, 0xed, 0xc5, 0x4e, 0x23, 0xea, 0xce, 0x05, 0x64, 0x6e, 0x8b, 0x4b, 0x76, 0xaf, 0x15, 0x0c, 0x0d, 0xfb, 0x5b, 0xa8, 0xe1, 0x60, 0x2c, 0x9a, 0xfb, 0xa7, 0x08, 0xde, 0x8d, 0xf8, 0x9f, - 0x00, 0xbb, 0xcb, 0xa7, 0xf9, 0x2a, 0x4b, 0xb6, 0xd2, 0x1b, 0x48, 0x8c, 0xa0, 0xc3, 0x06, 0xa8, 0x2f, 0xad, 0xe8, 0x51, 0x3b, 0xaf, 0x17, 0x1e, 0xa1, 0x3a, 0x54, 0xf5, 0xa8, 0x25, 0x45, 0xe4, - 0x1f, 0x58, 0xb5, 0x23, 0x93, 0xfd, 0x2a, 0x04, 0x7d, 0xf2, 0x7d, 0xa6, 0x2d, 0x23, 0xec, 0x5c, 0x01, 0x5a, 0x40, 0x2c, 0x31, 0xaa, 0x3d, 0x7f, 0x8d, 0x52, 0xcf, 0x9f, 0xc3, 0xaf, 0x38, 0xa2, - 0xa7, 0x61, 0x85, 0x41, 0x32, 0xeb, 0xd9, 0xe3, 0x0c, 0x3a, 0x63, 0xf8, 0x0d, 0x30, 0xfa, 0x7e, 0x62, 0x28, 0x88, 0x76, 0x01, 0xbb, 0x2c, 0x88, 0x77, 0x46, 0x57, 0x52, 0x99, 0x1e, 0x55, 0xae, - 0x18, 0xe0, 0x04, 0x34, 0xab, 0x7c, 0xba, 0x2e, 0xee, 0x2b, 0x9d, 0x14, 0xda, 0xcb, 0x1c, 0x3e, 0x49, 0xc7, 0x66, 0xd9, 0x28, 0xd5, 0xb6, 0x2d, 0x5b, 0xf4, 0x1e, 0xd8, 0x44, 0x37, 0x88, 0x32, - 0x3a, 0x2e, 0x09, 0x16, 0xc9, 0xf9, 0x6e, 0xfb, 0x2d, 0xc8, 0xbb, 0xe3, 0x98, 0x42, 0x4e, 0x50, 0xea, 0x32, 0x18, 0xcc, 0x7f, 0xc1, 0x85, 0xe5, 0x69, 0x69, 0xf3, 0x71, 0x9c, 0xf8, 0x80, 0x34, - 0x2d, 0xf0, 0x3a, 0xf3, 0x34, 0x9b, 0x4e, 0x3d, 0x19, 0xed, 0x2d, 0xb1, 0xcc, 0x5e, 0xbd, 0x7c, 0xf5, 0xf2, 0x4d, 0x1e, 0x1b, 0x95, 0x13, 0x0f, 0x65, 0x60, 0xd0, 0xf1, 0x27, 0x49, 0xdf, 0x39, - 0xa4, 0xa2, 0xfc, 0x3c, 0x78, 0xa7, 0xf7, 0x9b, 0x06, 0xe6, 0x54, 0x6d, 0xd7, 0x69, 0xd1, 0x59, 0xa6, 0xc3, 0xba, 0x4f, 0x95, 0x86, 0x24, 0xce, 0x3b, 0xd9, 0x00, 0x27, 0x63, 0x41, 0x33, 0xb4, - 0x26, 0x45, 0xdf, 0x16, 0x5b, 0x2c, 0x30, 0x3b, 0xa3, 0x9b, 0x15, 0xc2, 0x0c, 0x05, 0x26, 0x8f, 0x2a, 0x5f, 0xc3, 0xa4, 0x83, 0xe3, 0xbf, 0x8f, 0x32, 0x85, 0x74, 0x34, 0x83, 0xa3, 0x35, 0x45, - 0xdf, 0x1d, 0xfd, 0x73, 0x0c, 0x7f, 0x28, 0x80, 0xc9, 0xf9, 0x71, 0xd6, 0x0e, 0x83, 0x4c, 0x64, 0x33, 0xe0, 0xec, 0x50, 0x80, 0xe9, 0x37, 0xa6, 0x50, 0xc3, 0x7e, 0x58, 0x7f, 0x25, 0xba, 0xf8, - 0x63, 0xf0, 0xb4, 0xa9, 0xf6, 0xb8, 0x61, 0x84, 0x36, 0x97, 0xdc, 0x6e, 0xf7, 0x41, 0xf1, 0x45, 0x74, 0x7f, 0x61, 0x9d, 0xff, 0x27, 0x02, 0x0f, 0x69, 0xe1, 0x1d, 0xdb, 0x6c, 0x0a, 0xa1, 0x32, - 0x3a, 0x4b, 0xc7, 0x12, 0x37, 0x2a, 0x6f, 0xac, 0xae, 0xa0, 0x56, 0xc3, 0x80, 0x86, 0x8f, 0x41, 0x8b, 0x1b, 0x11, 0xae, 0x31, 0x8e, 0xce, 0x60, 0x5e, 0x17, 0x05, 0xf0, 0x63, 0x5a, 0x60, 0x0c, - 0x28, 0xc8, 0x60, 0x7c, 0x62, 0xc1, 0x38, 0xfb, 0xde, 0x33, 0xb9, 0xa0, 0x1d, 0xe0, 0x64, 0xb2, 0x7b, 0xe6, 0x97, 0x8e, 0xcc, 0x3d, 0xc6, 0xc6, 0xd1, 0xf4, 0xf5, 0xed, 0xe5, 0xcd, 0xd5, 0xd7, - 0xb7, 0x67, 0x67, 0x97, 0x37, 0x9f, 0xe6, 0x6f, 0x6a, 0x67, 0xb7, 0x5b, 0xeb, 0xd2, 0x2a, 0xd7, 0x97, 0xb7, 0xc6, 0x63, 0x6a, 0x0b, 0x34, 0x14, 0x33, 0x2d, 0xf2, 0x04, 0x88, 0xb8, 0xb0, 0xac, - 0x21, 0xef, 0x6f, 0x3e, 0x9d, 0x7d, 0xbd, 0x7a, 0xf7, 0xe1, 0xe2, 0x7a, 0x7e, 0x75, 0xdb, 0x2a, 0x0c, 0xa3, 0x8b, 0x14, 0x32, 0x37, 0x30, 0xea, 0xe8, 0xb2, 0xe7, 0x1a, 0x78, 0x1b, 0x3a, 0x70, - 0x7d, 0x99, 0x8d, 0x9e, 0xe2, 0x12, 0xa5, 0x6c, 0xc3, 0x63, 0xef, 0xb3, 0x8a, 0x43, 0xa4, 0xd5, 0x20, 0xd8, 0x6d, 0x37, 0x1c, 0x25, 0xc9, 0x1b, 0xba, 0x8f, 0xb4, 0x02, 0x9d, 0x85, 0x37, 0xc8, - 0xdc, 0x27, 0xbf, 0x6b, 0x67, 0xbb, 0xc5, 0xd9, 0xd2, 0xba, 0x54, 0x70, 0x73, 0xf5, 0x5b, 0xd9, 0x23, 0x62, 0x51, 0x71, 0xe5, 0xea, 0x14, 0xd6, 0xd6, 0x19, 0xbb, 0x9f, 0x45, 0xed, 0x99, 0x60, - 0x89, 0x02, 0xa3, 0xd3, 0x55, 0x2c, 0x70, 0xa1, 0xa7, 0xf6, 0x60, 0xe2, 0x9e, 0x18, 0xe8, 0x7f, 0x2f, 0xf6, 0x31, 0x30, 0x21, 0x48, 0xd1, 0x9f, 0x54, 0x86, 0xce, 0xf5, 0x58, 0xfc, 0xf9, 0x4c, - 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa5, 0x86, 0xa7, 0x33, 0xae, 0x03, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 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, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, - 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x94, 0x52, 0x4d, 0x6f, 0xdb, 0x30, 0x0c, 0xbd, 0xfb, - 0x57, 0x70, 0x19, 0x30, 0xd8, 0x40, 0x96, 0xde, 0xd5, 0xad, 0xc0, 0x90, 0x1c, 0x7a, 0xda, 0xa1, 0xdd, 0x6d, 0x18, 0x52, 0x59, 0xa2, 0x1c, 0x01, 0x32, 0xa5, 0xea, 0xa3, 0x49, 0x50, 0xf8, 0xbf, - 0x0f, 0x92, 0x12, 0x37, 0x01, 0xb2, 0xc3, 0x74, 0x10, 0x6c, 0xf2, 0x91, 0x7c, 0xef, 0x89, 0x29, 0x20, 0x70, 0x11, 0xf5, 0x61, 0xbb, 0xc7, 0x9e, 0xb1, 0xf7, 0x7a, 0x07, 0x34, 0x6a, 0x09, 0x1b, - 0x1e, 0xf9, 0x34, 0xdd, 0x37, 0xcd, 0xdd, 0xdd, 0x1d, 0x3c, 0x25, 0x02, 0x91, 0x42, 0xb4, 0x23, 0x08, 0x4b, 0x4a, 0x0f, 0xc9, 0xf3, 0xa8, 0x2d, 0x01, 0x0f, 0xe0, 0xb8, 0x8f, 0x60, 0x15, 0xc4, - 0x1d, 0x02, 0x77, 0xce, 0x68, 0x51, 0x53, 0x7d, 0xd2, 0x46, 0x6a, 0x1a, 0x4a, 0x03, 0xe7, 0xad, 0xc0, 0x10, 0x56, 0xf9, 0xa7, 0x04, 0x7e, 0xed, 0x74, 0x00, 0x95, 0x48, 0x14, 0x6c, 0xd8, 0xd9, - 0x64, 0x64, 0xee, 0x1d, 0xb9, 0x26, 0xe0, 0xc6, 0xdc, 0x1e, 0xa7, 0xac, 0x87, 0xa3, 0x4d, 0xfe, 0xa3, 0xf2, 0x62, 0xe2, 0x47, 0xf3, 0x97, 0x97, 0x17, 0x9f, 0x42, 0x2c, 0xdf, 0x8a, 0xe6, 0x1e, - 0xd8, 0x0a, 0x35, 0x30, 0xf8, 0x32, 0xa6, 0x08, 0x45, 0xea, 0x33, 0xfa, 0x37, 0x2d, 0x70, 0x5d, 0xf2, 0x1d, 0xbc, 0x97, 0x82, 0x7c, 0x0c, 0x46, 0x90, 0xfd, 0x56, 0x7a, 0xfd, 0x86, 0x1e, 0xbe, - 0xc3, 0x78, 0xdc, 0xca, 0xbe, 0xed, 0xee, 0x67, 0x80, 0x50, 0xc3, 0x4a, 0xf2, 0xc8, 0xdb, 0x19, 0xb5, 0x12, 0xc6, 0x12, 0xb6, 0xdd, 0x09, 0x34, 0x9d, 0x89, 0x5c, 0x28, 0x46, 0xca, 0xe4, 0x41, - 0x70, 0x82, 0xec, 0xfc, 0x4c, 0x4b, 0x82, 0xc7, 0x60, 0x93, 0x17, 0x18, 0x40, 0xd3, 0xb5, 0xc0, 0xdb, 0xa2, 0x5c, 0xea, 0x81, 0x87, 0x23, 0x89, 0x2c, 0x4f, 0x93, 0xc4, 0x43, 0x3b, 0x53, 0xf3, - 0xf8, 0xca, 0xe0, 0x31, 0x46, 0xf7, 0x84, 0xaf, 0x09, 0x43, 0x5c, 0xce, 0x99, 0x4a, 0x94, 0x55, 0xed, 0xf9, 0x7d, 0xbf, 0x6d, 0xfa, 0x4d, 0x89, 0x3d, 0x54, 0x50, 0x07, 0x5f, 0x1f, 0x4e, 0xa5, - 0xc1, 0x59, 0x0a, 0x78, 0x61, 0xc9, 0x65, 0x98, 0xb1, 0x9f, 0x76, 0x6d, 0x29, 0x22, 0xc5, 0xb6, 0x3b, 0xc9, 0xcd, 0x94, 0xfe, 0xcb, 0xeb, 0xe2, 0xb3, 0x1d, 0x18, 0xd3, 0xa4, 0xec, 0xa7, 0x76, - 0xb1, 0x3e, 0x55, 0x6a, 0x1a, 0x20, 0x54, 0xf0, 0xa2, 0xbb, 0x6f, 0xce, 0x6e, 0x73, 0xe7, 0xb6, 0xc5, 0xf1, 0x4c, 0x9c, 0x31, 0xc2, 0x7d, 0xfb, 0xc8, 0x49, 0x1a, 0xf4, 0xb5, 0x90, 0x31, 0x89, - 0x8a, 0x27, 0x13, 0xdb, 0x2e, 0xbf, 0xc1, 0x54, 0x17, 0xf7, 0x07, 0x01, 0x1e, 0xf8, 0xe8, 0x0c, 0x9e, 0x57, 0x74, 0xde, 0x9c, 0xeb, 0xcd, 0x0a, 0xd1, 0x27, 0x11, 0x93, 0xc7, 0x55, 0xf3, 0xf9, - 0xb7, 0xc4, 0xec, 0x4a, 0xbb, 0xce, 0x2f, 0xda, 0xfd, 0x29, 0xd2, 0x6a, 0x1e, 0xae, 0x46, 0x9e, 0x44, 0xe4, 0x34, 0xf1, 0x11, 0x19, 0x3c, 0xc7, 0xcc, 0x7e, 0x99, 0x87, 0xeb, 0xd1, 0x19, 0xd8, - 0x54, 0x46, 0x65, 0x6d, 0x6f, 0x55, 0x2a, 0x82, 0x99, 0x74, 0xb1, 0xfe, 0x06, 0xa6, 0x78, 0xff, 0x8f, 0x78, 0x3e, 0x97, 0x93, 0x19, 0x53, 0xde, 0x8e, 0xed, 0x62, 0x6f, 0xbd, 0x91, 0x8b, 0x6e, - 0x39, 0x03, 0xa7, 0xa6, 0xde, 0x53, 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x15, 0x03, 0x40, 0xa5, 0xd5, 0x01, 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0xb4, 0x53, 0x51, 0x6f, 0xd3, 0x40, 0x0c, 0x7e, 0xcf, 0xaf, 0x70, 0x3b, 0x09, 0xee, - 0x50, 0xc8, 0xde, 0x5d, 0x3a, 0x24, 0x06, 0x62, 0x08, 0x21, 0x24, 0xd8, 0xdb, 0x98, 0xa2, 0x6b, 0xe2, 0xb4, 0xd1, 0x92, 0xbb, 0xf4, 0xce, 0x51, 0x56, 0x55, 0xf9, 0xef, 0xe8, 0x2e, 0x69, 0xd6, - 0x4e, 0x0c, 0x0d, 0x04, 0xf7, 0xd2, 0xda, 0xf5, 0x67, 0x7f, 0xfe, 0x3e, 0xb7, 0x75, 0x04, 0x99, 0x55, 0x4c, 0x88, 0x99, 0xd1, 0x45, 0xb9, 0x46, 0xbc, 0x52, 0x3a, 0xaf, 0xc8, 0x5e, 0x86, 0x70, - 0x11, 0xf9, 0x0a, 0x95, 0x71, 0x79, 0x9f, 0x76, 0xb4, 0x42, 0xdc, 0x6f, 0x98, 0x1b, 0xc4, 0x2f, 0xc4, 0x1b, 0x93, 0xc7, 0xd0, 0xd1, 0x2a, 0x86, 0x2b, 0xe6, 0xe6, 0x1b, 0x6d, 0x5b, 0x72, 0x7c, - 0x08, 0x5c, 0x63, 0xb4, 0xa3, 0x7e, 0x80, 0x57, 0x66, 0x8d, 0x58, 0xea, 0xc2, 0x2c, 0xa2, 0xe8, 0xfc, 0x1c, 0x3e, 0xd5, 0x4d, 0x45, 0x35, 0x69, 0x86, 0x9d, 0x69, 0x2d, 0x14, 0xad, 0xce, 0xb8, - 0x34, 0xfa, 0xa5, 0xf3, 0x85, 0x65, 0x06, 0x1b, 0xb2, 0x14, 0x35, 0xed, 0x0a, 0x94, 0xdb, 0xe9, 0x0c, 0x0a, 0x0d, 0xa5, 0xce, 0xe9, 0x5e, 0x58, 0xda, 0xe2, 0xe9, 0xac, 0x91, 0x32, 0x04, 0x66, - 0xef, 0x15, 0xab, 0x37, 0x27, 0xe4, 0x2f, 0x24, 0xbc, 0xbe, 0x38, 0x21, 0x04, 0xfb, 0x08, 0x00, 0xc0, 0x73, 0x99, 0x89, 0xf9, 0x1e, 0xcf, 0xde, 0xf6, 0xf3, 0x18, 0x2c, 0x6d, 0xe5, 0x62, 0xf8, - 0xa1, 0xf0, 0x41, 0x52, 0x87, 0xed, 0x84, 0x84, 0xe5, 0x12, 0x86, 0x4d, 0x11, 0x3f, 0x7e, 0xb8, 0x1e, 0xd1, 0xfe, 0x1d, 0x37, 0x45, 0xfc, 0x7a, 0x27, 0x64, 0xb2, 0x32, 0xf9, 0x4e, 0x14, 0xc6, - 0xd6, 0x8a, 0x67, 0x62, 0x7e, 0x45, 0x55, 0x65, 0x60, 0xdf, 0xcf, 0x7e, 0xe8, 0xf9, 0x81, 0x68, 0xa2, 0x55, 0x4d, 0x52, 0x86, 0x26, 0x3d, 0x50, 0x35, 0xf1, 0x79, 0x56, 0xc7, 0xeb, 0x8d, 0xd2, - 0x77, 0xee, 0x77, 0x2d, 0xa3, 0x3e, 0x8a, 0xce, 0x6e, 0xb2, 0x62, 0x2d, 0x98, 0x1c, 0xcb, 0xdb, 0xa8, 0x36, 0x39, 0xf8, 0xaf, 0x6e, 0x9c, 0xe3, 0xcd, 0x70, 0x6d, 0x43, 0x16, 0xf1, 0xd5, 0x62, - 0xca, 0x1c, 0xbb, 0xeb, 0x47, 0x22, 0xb2, 0x49, 0x57, 0x3b, 0x26, 0x17, 0x83, 0x77, 0x3b, 0x0e, 0x3d, 0xe2, 0x41, 0xe5, 0x77, 0x3e, 0xdf, 0x2f, 0xa2, 0x80, 0x2e, 0xf4, 0x48, 0x43, 0x04, 0xa5, - 0x9f, 0xb2, 0xe1, 0x68, 0xcb, 0xa9, 0x04, 0x51, 0x53, 0x27, 0x4e, 0xea, 0x10, 0x73, 0x2a, 0x54, 0x5b, 0xb1, 0x98, 0x16, 0x0a, 0x1f, 0x67, 0x37, 0x03, 0x43, 0xcb, 0x88, 0x9e, 0xc9, 0x6d, 0xc8, - 0x4e, 0xc7, 0xb1, 0x26, 0x16, 0xf2, 0x68, 0x44, 0x45, 0xec, 0x4d, 0x84, 0x65, 0xa0, 0x8d, 0x78, 0x4d, 0x8e, 0xc7, 0x8b, 0x41, 0x0c, 0xc5, 0x09, 0x9b, 0xd4, 0x2f, 0x96, 0xda, 0x21, 0x2d, 0x46, - 0xf7, 0x1f, 0xd0, 0xae, 0x81, 0xe5, 0xc3, 0xd5, 0xc5, 0xd3, 0x96, 0x32, 0x51, 0x9d, 0x2a, 0xf9, 0xa1, 0x5c, 0x39, 0x47, 0x96, 0x53, 0xda, 0xce, 0x84, 0x47, 0x25, 0x8e, 0x15, 0xb7, 0x4e, 0xc8, - 0x41, 0x39, 0xc4, 0xef, 0x21, 0xbe, 0x34, 0xb9, 0xf7, 0xf4, 0xb3, 0xfc, 0x25, 0x70, 0xca, 0xf9, 0xf7, 0x22, 0x08, 0x8c, 0x58, 0x58, 0x53, 0x3f, 0x75, 0x4d, 0xf3, 0xce, 0xd8, 0x2a, 0x9f, 0x4b, - 0x19, 0x9f, 0x40, 0x0f, 0xae, 0x0d, 0x4c, 0x4a, 0xed, 0x63, 0x7f, 0x41, 0x07, 0xd6, 0x49, 0xab, 0x3b, 0xab, 0x1a, 0x21, 0x13, 0xe5, 0x52, 0x4b, 0x85, 0x90, 0x13, 0x7c, 0x24, 0xf6, 0x3c, 0xc1, - 0x1b, 0xe3, 0xfe, 0x40, 0xf1, 0xa1, 0xfa, 0x9f, 0x4b, 0xfe, 0x48, 0xef, 0xa4, 0x74, 0xa9, 0x6b, 0xb3, 0x8c, 0x9c, 0x13, 0xf2, 0xaf, 0x65, 0x7e, 0xf4, 0x17, 0xfb, 0x8f, 0x3a, 0xf7, 0xd1, 0xcf, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfa, 0xab, 0x29, 0xcc, 0x13, 0x02, 0x00, 0x00, 0x7a, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x94, 0x52, 0xc1, 0x8a, 0xdb, 0x30, 0x10, 0xbd, 0xfb, 0x2b, 0x06, 0xf7, 0x22, 0x81, 0xeb, 0x64, 0x2f, 0x65, 0x99, 0x74, 0x53, 0xb6, 0x65, 0x61, - 0x0f, 0x85, 0x2c, 0x69, 0x6e, 0xa5, 0x18, 0x25, 0x1e, 0x27, 0x22, 0x8a, 0x64, 0x46, 0xb2, 0xbd, 0x25, 0xc9, 0xbf, 0x17, 0xcb, 0x26, 0x4d, 0xd2, 0x53, 0xc7, 0x07, 0x8f, 0x9e, 0xe6, 0xe9, 0x0d, - 0x6f, 0xa6, 0xf1, 0x04, 0x6a, 0x13, 0xf4, 0x7b, 0xd1, 0xd1, 0x1a, 0xf1, 0xd8, 0xd1, 0x3a, 0x83, 0xe7, 0xba, 0xce, 0xe0, 0x35, 0x84, 0x7a, 0x49, 0xbe, 0x76, 0xd6, 0xd3, 0x70, 0xfa, 0x41, 0xdc, - 0x12, 0x9f, 0x67, 0x49, 0x4f, 0x22, 0xdb, 0x16, 0xc6, 0x6d, 0xb7, 0xc4, 0xa0, 0x3c, 0x90, 0x71, 0xdb, 0x59, 0x92, 0x1c, 0x5c, 0x09, 0x1b, 0x67, 0x2b, 0xbd, 0x9d, 0xc5, 0x7c, 0xa7, 0x6c, 0x69, - 0x88, 0x67, 0x49, 0xf2, 0xe1, 0xe7, 0x95, 0xca, 0x41, 0x69, 0xfb, 0x2b, 0x51, 0xfe, 0xb7, 0xdd, 0x40, 0x65, 0xa1, 0x3f, 0x0a, 0x09, 0x1f, 0xe7, 0xe0, 0x43, 0x89, 0xa8, 0x1d, 0xe2, 0x92, 0x7c, - 0x63, 0xc2, 0x67, 0x21, 0xe7, 0x70, 0x4c, 0x00, 0x20, 0x0a, 0x20, 0x7e, 0x6d, 0xb4, 0x29, 0x89, 0x11, 0x2b, 0x76, 0x87, 0x82, 0x6c, 0x2b, 0x06, 0xfc, 0xc5, 0xb6, 0x88, 0x25, 0x55, 0xaa, 0x31, - 0x41, 0xc8, 0x7c, 0xcc, 0x8a, 0x4a, 0x9b, 0x40, 0x5c, 0x38, 0x16, 0xa9, 0xb6, 0x95, 0x4b, 0xa5, 0xcc, 0xb5, 0xd5, 0x41, 0xc8, 0x59, 0x12, 0x1f, 0x35, 0x14, 0xa0, 0x76, 0x1c, 0x10, 0x9a, 0x87, - 0x4f, 0xf0, 0x04, 0x07, 0x15, 0x36, 0xbb, 0xa1, 0x09, 0xea, 0x5f, 0x6c, 0x15, 0x8b, 0xf4, 0x6d, 0xb1, 0x5c, 0xa5, 0x72, 0x6c, 0xa3, 0x8f, 0xc5, 0x5e, 0xb4, 0x12, 0x9e, 0xe6, 0xd0, 0xe6, 0xb5, - 0x62, 0x4f, 0x42, 0xe6, 0x8d, 0xed, 0x58, 0xd5, 0x42, 0x66, 0x97, 0xa2, 0x17, 0x66, 0x51, 0xc4, 0xaa, 0xc7, 0xe9, 0xe3, 0x74, 0xc0, 0xcf, 0xa3, 0xec, 0x64, 0x02, 0xdf, 0x98, 0x54, 0x20, 0x08, - 0x3b, 0x82, 0xd7, 0xd5, 0xea, 0x0d, 0x7c, 0xb4, 0x36, 0xde, 0xfe, 0x75, 0x1a, 0xd1, 0x52, 0x27, 0x4e, 0xa7, 0x2b, 0xed, 0xe7, 0xba, 0x1e, 0x50, 0x79, 0x81, 0xfa, 0xc8, 0xa3, 0xfc, 0xb5, 0xc3, - 0xba, 0x2c, 0x0d, 0x75, 0x8a, 0x09, 0xf1, 0x7b, 0x9c, 0xd2, 0x95, 0x3f, 0x77, 0xdc, 0x61, 0x60, 0x0d, 0x93, 0x18, 0x32, 0xc4, 0x0b, 0x72, 0x57, 0xc9, 0xae, 0x09, 0x24, 0xd2, 0x49, 0x9a, 0x41, - 0x54, 0xd9, 0x52, 0xef, 0x76, 0x70, 0x62, 0x9c, 0x33, 0xa2, 0xb6, 0x25, 0xbd, 0xdf, 0x0b, 0xdc, 0xd3, 0x6a, 0xe7, 0xff, 0x83, 0x77, 0x83, 0xf5, 0x91, 0x4e, 0x76, 0xa4, 0x4c, 0xd8, 0x4d, 0x8e, - 0x05, 0x0a, 0x26, 0x55, 0x6a, 0x4b, 0xde, 0x9f, 0x8c, 0x6e, 0xa9, 0x4f, 0xe4, 0x39, 0xcd, 0xfe, 0xe1, 0xdc, 0xb6, 0x7b, 0xbd, 0xda, 0x88, 0x8b, 0xbd, 0xbc, 0x25, 0x0c, 0x6d, 0x9c, 0x87, 0x5f, - 0xbe, 0xd6, 0xb6, 0x14, 0x22, 0x9d, 0xe6, 0xf1, 0x4b, 0xb3, 0xb8, 0x31, 0x52, 0x7e, 0x19, 0x6e, 0x3b, 0xc7, 0x7b, 0x62, 0x2f, 0x1e, 0xc6, 0x6a, 0x6e, 0xec, 0x38, 0x9b, 0x5c, 0x75, 0x4a, 0x87, - 0xe4, 0x9c, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd9, 0x2e, 0xc4, 0x3e, 0xc0, 0x01, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, - 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4a, 0x2a, 0xcd, 0xcc, 0x49, 0x29, 0x48, 0x4c, 0xce, 0x2e, 0xb6, 0xe2, 0x52, 0x50, 0xd0, 0x55, 0x48, 0xc9, 0x4f, 0xce, 0x4e, 0x2d, 0xd2, 0xcb, - 0xcc, 0xd7, 0x2f, 0x48, 0xcc, 0x4e, 0x2d, 0xc9, 0x4f, 0xce, 0xcf, 0xcd, 0x2d, 0xcd, 0xcb, 0x2c, 0xa9, 0xd4, 0x2f, 0x2a, 0x2d, 0x2e, 0xe1, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, - 0x08, 0x69, 0xd4, 0x7c, 0x17, 0x35, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0xcc, 0x31, 0x0a, 0x02, 0x41, 0x0c, 0x85, 0xe1, 0x3e, 0xa7, 0x48, 0x2d, 0xd8, 0x58, 0xd9, 0xcc, 0x49, 0x44, - 0x42, 0x58, 0x33, 0x6e, 0x20, 0x66, 0x25, 0xc9, 0x32, 0xe8, 0xe9, 0x65, 0x2c, 0xb4, 0xfd, 0x1f, 0xdf, 0x8b, 0x6d, 0x2b, 0x6c, 0x58, 0xb1, 0x0b, 0xc0, 0xe5, 0x70, 0x05, 0xf5, 0x9b, 0x78, 0x51, - 0xd6, 0xcb, 0x04, 0x1b, 0xe6, 0x93, 0x17, 0xf9, 0x45, 0x7d, 0xcf, 0x76, 0x82, 0x65, 0xe5, 0x48, 0x99, 0x70, 0xaf, 0x7e, 0x3c, 0x43, 0x85, 0x3e, 0xa8, 0x82, 0xd5, 0xd4, 0xef, 0x34, 0x56, 0x2d, - 0xf9, 0x42, 0x6c, 0xd8, 0xd9, 0x72, 0x1e, 0xa4, 0x44, 0x51, 0x57, 0x67, 0x23, 0x97, 0x61, 0xea, 0xff, 0xf1, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, - 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5c, 0x90, 0xcd, 0x6a, 0xc4, 0x30, 0x0c, 0x84, 0xef, 0x7a, 0x8a, 0x2c, 0xbe, 0x05, 0xd6, 0xba, 0xf4, 0x05, 0xfa, 0xb3, 0xd0, 0x2d, 0xa5, 0x14, 0x52, 0x7a, - 0x2d, 0x8a, 0xad, 0x66, 0xbd, 0x38, 0x8e, 0x91, 0xd5, 0x2c, 0x7d, 0xfb, 0x92, 0xc4, 0x2d, 0x65, 0x2f, 0xc2, 0xf3, 0x31, 0x96, 0x86, 0x79, 0x3c, 0x3c, 0xbf, 0xda, 0xd1, 0x83, 0x92, 0x0c, 0xac, - 0x08, 0x3b, 0x3b, 0xce, 0x09, 0x2f, 0x42, 0x39, 0xb3, 0xe0, 0x48, 0x33, 0xa7, 0x7d, 0x55, 0xf6, 0x4c, 0x02, 0xbb, 0xb6, 0xc5, 0x22, 0x0e, 0x47, 0x0a, 0x09, 0xdb, 0x16, 0xff, 0xfe, 0x55, 0xae, - 0x5c, 0xf4, 0x3f, 0x07, 0x63, 0x4c, 0xd3, 0xbd, 0x75, 0x8d, 0x31, 0x06, 0x2c, 0x65, 0xfd, 0x18, 0x38, 0xb1, 0x90, 0xb2, 0x07, 0xeb, 0x22, 0x95, 0x92, 0x49, 0x4f, 0x60, 0x3f, 0xc9, 0xe9, 0x24, - 0xdf, 0x9b, 0xc8, 0x32, 0x9d, 0xd9, 0x29, 0xd8, 0xc2, 0xaa, 0x21, 0x0d, 0x05, 0x6c, 0xc9, 0x12, 0xd2, 0x70, 0xc7, 0x94, 0x16, 0xa1, 0xe5, 0x66, 0xef, 0xc8, 0x9d, 0x78, 0xdb, 0x7f, 0x4c, 0xca, - 0x31, 0x86, 0xa7, 0xe6, 0xf8, 0x70, 0xb8, 0xdd, 0x2e, 0x05, 0xcf, 0x04, 0xad, 0x0d, 0x97, 0xb2, 0xcc, 0x31, 0x2e, 0x33, 0xcb, 0x66, 0x7f, 0x61, 0x5d, 0x17, 0xad, 0x4e, 0x4c, 0x7d, 0x3d, 0x87, - 0x59, 0xc2, 0x4c, 0xca, 0xb8, 0xb0, 0xfe, 0x2b, 0x44, 0x8f, 0x80, 0x3e, 0x14, 0x5d, 0x41, 0x7d, 0xd8, 0xd4, 0xef, 0x07, 0x21, 0x1f, 0x19, 0xa1, 0x7a, 0xae, 0x2b, 0xb9, 0xc2, 0xbf, 0x8d, 0x54, - 0xbc, 0x26, 0x78, 0xef, 0x9a, 0xfb, 0xc9, 0xf3, 0x16, 0x75, 0x2e, 0x6e, 0xf2, 0x8c, 0xf0, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, - 0x8b, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, - 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, - 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, - 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x73, 0x70, - 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, - 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x46, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, - 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0x9d, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, - 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, - 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, - 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, - 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x17, 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, - 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xb9, 0xfa, 0x65, 0x30, 0x28, 0xcb, 0xd2, 0x67, 0x16, 0xb2, 0x2f, 0x69, 0x3d, 0x48, 0xab, 0xcd, 0x6a, 0x70, 0x37, 0xbe, - 0x1d, 0x4d, 0xe6, 0xa3, 0xcb, 0x4f, 0xfe, 0x95, 0x3b, 0xb6, 0x10, 0x29, 0x2a, 0x05, 0x84, 0xff, 0x2b, 0x38, 0x61, 0x0c, 0xcb, 0x2d, 0xb0, 0x3c, 0x4f, 0x79, 0xc4, 0x96, 0x29, 0x42, 0xca, 0x4a, - 0xcb, 0xcf, 0x9a, 0x10, 0x63, 0xd0, 0xd2, 0xc0, 0x2e, 0x89, 0x6b, 0x2e, 0xd6, 0x7d, 0x50, 0x72, 0xa5, 0x4b, 0x46, 0x68, 0xcc, 0xc4, 0x5c, 0x69, 0xe2, 0xcb, 0x42, 0x1f, 0xb0, 0x56, 0x83, 0xe4, - 0xea, 0x60, 0x83, 0x14, 0xc0, 0x04, 0x74, 0x83, 0x39, 0x8c, 0xe7, 0x5d, 0xf8, 0x35, 0x98, 0x8f, 0xe7, 0x7d, 0x63, 0xe4, 0x69, 0xfc, 0xf0, 0xdb, 0x74, 0xf1, 0x00, 0x4f, 0x41, 0x18, 0x06, 0x93, - 0x87, 0xf1, 0x68, 0x0e, 0xd3, 0x10, 0x6e, 0xa7, 0x93, 0xe1, 0xf8, 0x61, 0x3c, 0x9d, 0xcc, 0x61, 0xfa, 0x19, 0x82, 0xc9, 0x17, 0xf8, 0xcf, 0x78, 0x32, 0xec, 0x03, 0x72, 0x9d, 0x20, 0x01, 0xbe, - 0x98, 0xe4, 0x2a, 0x03, 0x93, 0x1b, 0x3e, 0x31, 0xb6, 0xe4, 0xcd, 0x11, 0x0f, 0x20, 0xac, 0x64, 0x05, 0x49, 0xe5, 0x18, 0xf1, 0x15, 0x8f, 0x20, 0x65, 0x62, 0x5d, 0xb0, 0x35, 0xc2, 0x5a, 0x6e, - 0x90, 0x04, 0x17, 0x6b, 0xc8, 0x91, 0x32, 0xae, 0x4c, 0x5e, 0x15, 0x30, 0x11, 0x1b, 0x33, 0x29, 0xcf, 0xb8, 0x66, 0xda, 0x4e, 0x9d, 0xc4, 0x65, 0x1c, 0x0d, 0x3a, 0x3c, 0xcb, 0x25, 0x69, 0xf8, - 0x83, 0x6d, 0x98, 0x2f, 0x50, 0xfb, 0x17, 0xd7, 0x07, 0x53, 0x5c, 0x1e, 0xcf, 0x08, 0x2e, 0xfd, 0x28, 0x61, 0x42, 0x60, 0xaa, 0x8e, 0xd7, 0x0a, 0xcd, 0x53, 0x7f, 0x46, 0x32, 0x47, 0xd2, 0x1c, - 0xd5, 0x75, 0xa7, 0x93, 0x17, 0xcb, 0x94, 0x47, 0x10, 0xa5, 0x4c, 0x29, 0xb8, 0x67, 0x1b, 0x14, 0x4f, 0xc4, 0xf2, 0x1c, 0x69, 0x28, 0x4b, 0x91, 0x4a, 0x66, 0x30, 0x7d, 0xef, 0x74, 0x4c, 0xf6, - 0x73, 0xe2, 0x1b, 0xa6, 0x11, 0x94, 0x41, 0x1c, 0xc1, 0xca, 0x56, 0xf9, 0x5c, 0x93, 0x89, 0xed, 0x29, 0x0c, 0x66, 0xb3, 0x51, 0xf8, 0xfc, 0x38, 0x0a, 0xe7, 0xe3, 0xe9, 0x04, 0x6e, 0xa0, 0x7b, - 0xe5, 0xff, 0xdd, 0xff, 0x47, 0xf7, 0xda, 0x1e, 0x1d, 0x5c, 0x5c, 0xd8, 0xff, 0xe1, 0x02, 0x86, 0xb8, 0x62, 0x45, 0xaa, 0x61, 0x11, 0xde, 0x99, 0x8c, 0xc7, 0xce, 0x8d, 0x0d, 0x3c, 0x33, 0xfe, - 0x2f, 0xcb, 0x0a, 0x80, 0xff, 0x07, 0x23, 0x58, 0x91, 0xcc, 0xfa, 0xc0, 0x57, 0x20, 0x24, 0x7c, 0xa8, 0xf7, 0x2e, 0x28, 0xfd, 0x60, 0x92, 0x9e, 0x93, 0xdc, 0xf0, 0xd8, 0x66, 0xc4, 0xda, 0x1e, - 0xfc, 0x29, 0xcc, 0xe1, 0xe8, 0x73, 0xb0, 0xb8, 0x7b, 0x78, 0x1e, 0x4e, 0x9f, 0x26, 0x77, 0xd3, 0x60, 0xf8, 0x6c, 0x50, 0xdc, 0x40, 0xb7, 0x2e, 0x6c, 0xc2, 0x5c, 0xfa, 0x16, 0x45, 0xb3, 0xbe, - 0xed, 0xc4, 0xa7, 0x01, 0x97, 0x03, 0xcd, 0xbe, 0x31, 0xe2, 0x83, 0x03, 0x9c, 0x83, 0x6e, 0xe5, 0x1e, 0x00, 0x3e, 0x9e, 0xf0, 0xf0, 0x11, 0xba, 0x87, 0xbb, 0x2f, 0xbb, 0xed, 0xbb, 0x4c, 0xb4, - 0xdd, 0xeb, 0xce, 0x31, 0x5b, 0x33, 0x66, 0x3a, 0x57, 0xb6, 0xb0, 0x93, 0xef, 0xb2, 0x68, 0x1b, 0xbf, 0x0f, 0x65, 0xc2, 0xa3, 0x04, 0x32, 0xab, 0x4a, 0x91, 0x14, 0xae, 0xa9, 0x1b, 0x9c, 0x81, - 0x3b, 0xb2, 0x05, 0x2d, 0x6b, 0xfb, 0x46, 0x3c, 0xb8, 0x50, 0x1a, 0x59, 0x5c, 0xb7, 0x7e, 0xec, 0x12, 0x24, 0x05, 0xbe, 0x9f, 0xd8, 0xfb, 0xe0, 0x71, 0x34, 0x79, 0xae, 0xe3, 0x9a, 0x85, 0xd3, - 0xd9, 0x28, 0x34, 0x1d, 0xf6, 0x3c, 0x0b, 0x1e, 0x7e, 0x83, 0x9b, 0x1d, 0x43, 0x66, 0x74, 0xfd, 0x6c, 0x23, 0x06, 0x35, 0x7b, 0xe7, 0xa2, 0x3a, 0x47, 0x46, 0x99, 0x20, 0xe1, 0x99, 0x6a, 0x29, - 0x79, 0x9a, 0xc2, 0x12, 0x41, 0xb1, 0x8d, 0xd5, 0x93, 0x1f, 0xc5, 0xff, 0xef, 0x20, 0xfc, 0xab, 0xc0, 0xdb, 0xd3, 0x37, 0x61, 0x19, 0xd6, 0xbc, 0xee, 0xd8, 0xaf, 0x12, 0xa5, 0x12, 0x59, 0xa4, - 0xb1, 0x41, 0x5b, 0xa8, 0x4a, 0xfc, 0x8c, 0x50, 0x10, 0x8f, 0xf1, 0x20, 0x0b, 0xbb, 0xfe, 0x28, 0x28, 0xdd, 0xa9, 0x4c, 0xed, 0xf4, 0xdd, 0xe1, 0xb9, 0x84, 0x7c, 0x79, 0x9e, 0x04, 0xf7, 0xa3, - 0x5d, 0x98, 0xae, 0xf8, 0x9d, 0xb5, 0x05, 0xa5, 0x75, 0x04, 0x4e, 0x14, 0x9c, 0xa5, 0x8d, 0xe4, 0x31, 0x64, 0x8c, 0x0b, 0xcf, 0x59, 0x63, 0xb4, 0x56, 0xbf, 0x7f, 0xed, 0xc1, 0xf7, 0x1d, 0x3b, - 0xf3, 0xad, 0xd2, 0x98, 0xf9, 0xb2, 0xd0, 0x7e, 0x4e, 0x5c, 0xe8, 0x54, 0x78, 0xdd, 0x4b, 0x68, 0x48, 0x88, 0xd2, 0x8c, 0x34, 0xc6, 0xf6, 0xfa, 0x72, 0xe3, 0xb3, 0xb9, 0xae, 0x96, 0x4c, 0xe1, - 0x90, 0x13, 0x46, 0x5a, 0xd2, 0x16, 0x6e, 0x40, 0x60, 0x69, 0x17, 0x3c, 0xeb, 0xe3, 0xea, 0x6b, 0x63, 0x7f, 0xbb, 0x8f, 0x85, 0x32, 0x88, 0x8c, 0x19, 0x88, 0x6b, 0x3b, 0xbf, 0x80, 0x69, 0xb2, - 0x03, 0xd3, 0xfe, 0x1a, 0x75, 0xb0, 0x54, 0x32, 0x2d, 0x34, 0x9a, 0x32, 0xf2, 0x7a, 0x3d, 0x17, 0xab, 0xcd, 0xd8, 0x00, 0xc6, 0xab, 0xb7, 0x7b, 0x0c, 0x5f, 0xb8, 0xd2, 0xaa, 0x0f, 0x64, 0x3a, - 0x85, 0x6b, 0x23, 0xe0, 0x10, 0x25, 0x18, 0x7d, 0x33, 0xe2, 0xc4, 0x77, 0x1d, 0xa7, 0xcc, 0x3d, 0x5a, 0x28, 0x2d, 0xb3, 0xa6, 0xf1, 0x3d, 0xc3, 0x90, 0x33, 0x62, 0x19, 0xea, 0x5d, 0xf2, 0x6a, - 0x22, 0xb2, 0x86, 0xf4, 0x3a, 0x81, 0xde, 0xda, 0x85, 0x06, 0x27, 0x07, 0x11, 0xf5, 0xdf, 0xee, 0xb9, 0x26, 0x71, 0x55, 0xd6, 0x4c, 0x01, 0xdd, 0xb4, 0x2a, 0xe0, 0x7e, 0x2b, 0x5f, 0x79, 0xe7, - 0x80, 0xf8, 0x15, 0x03, 0x5e, 0xaf, 0x99, 0xf7, 0x1a, 0xfe, 0x58, 0xe4, 0x85, 0x9e, 0x6b, 0x42, 0x96, 0x9d, 0x8d, 0xa4, 0xb9, 0xe7, 0x06, 0x44, 0x91, 0xa6, 0xd7, 0x07, 0x76, 0x34, 0x6d, 0x8f, - 0x2c, 0x9b, 0xf1, 0x4e, 0x6b, 0x8e, 0xa2, 0xc6, 0xec, 0xd9, 0x40, 0x7a, 0xd7, 0x27, 0x4e, 0xf6, 0x37, 0x62, 0x9b, 0x3f, 0x33, 0x5d, 0xb9, 0xd8, 0x4f, 0x78, 0x2d, 0x56, 0xda, 0x8f, 0xfa, 0xa6, - 0x03, 0xce, 0x82, 0x69, 0x00, 0x6e, 0xb1, 0x58, 0xa5, 0xec, 0x8c, 0xdd, 0x35, 0xea, 0xda, 0x92, 0x77, 0xb6, 0xbf, 0xfb, 0xc6, 0xc6, 0x91, 0xe5, 0x57, 0x88, 0x98, 0x8e, 0x12, 0xf0, 0xc6, 0xd3, - 0x91, 0x7d, 0x2d, 0x9a, 0x97, 0x26, 0x1e, 0xa7, 0x15, 0xce, 0xb6, 0xdc, 0x28, 0x0c, 0xa7, 0x21, 0x98, 0xb0, 0x4c, 0x59, 0x7d, 0x30, 0xbd, 0xf6, 0xb6, 0xfc, 0x7f, 0x84, 0xee, 0x87, 0xee, 0x09, - 0x08, 0x2b, 0x50, 0x69, 0x5b, 0xce, 0xdb, 0x2b, 0x01, 0xde, 0xae, 0xcf, 0x66, 0x41, 0xfc, 0x54, 0xd5, 0x57, 0x5b, 0x48, 0xf5, 0x78, 0x87, 0x19, 0x3f, 0x4a, 0xa5, 0xc2, 0xb6, 0x4c, 0x9b, 0xf1, - 0x7a, 0x32, 0xfb, 0x7e, 0x5e, 0xc1, 0x69, 0xce, 0x5a, 0x48, 0x42, 0xf0, 0x7d, 0xff, 0xd4, 0x56, 0xa7, 0xfd, 0xaf, 0xd7, 0x77, 0x4a, 0xae, 0xc9, 0x8c, 0x79, 0x3b, 0x55, 0x52, 0x58, 0xd5, 0xc0, - 0xa1, 0xe0, 0xc8, 0x42, 0xe7, 0x85, 0x7e, 0x53, 0x62, 0x4e, 0x45, 0xf3, 0x58, 0x74, 0xea, 0x8b, 0xb2, 0x77, 0x20, 0x21, 0x3f, 0xed, 0x6d, 0xdb, 0x2a, 0x65, 0x84, 0xc2, 0xfe, 0xe5, 0xf5, 0xce, - 0xaa, 0xc8, 0x9f, 0x1c, 0xcb, 0xbe, 0xc5, 0x9c, 0x5a, 0x8e, 0x9d, 0x61, 0xe2, 0x6c, 0xda, 0x77, 0xe5, 0x1b, 0x11, 0x32, 0xf3, 0x9d, 0xe1, 0x78, 0xd8, 0x5f, 0x1e, 0x55, 0x41, 0xbf, 0x01, 0xe5, - 0x84, 0x94, 0xf6, 0xfa, 0xfe, 0xa1, 0x94, 0x69, 0x59, 0x25, 0xec, 0xd0, 0xfd, 0xc9, 0xc5, 0x55, 0x1b, 0x3c, 0x6d, 0x94, 0xfa, 0xb9, 0x60, 0x8e, 0x7e, 0x26, 0x99, 0x2d, 0xc2, 0x3b, 0xaf, 0xa0, - 0xb4, 0xdf, 0xb0, 0x78, 0x04, 0xb4, 0x0d, 0xd4, 0x50, 0x0a, 0x3c, 0x0e, 0xc8, 0xed, 0xc3, 0x17, 0xae, 0xbd, 0xab, 0xc6, 0xda, 0xae, 0xea, 0x1f, 0x12, 0x92, 0xa5, 0xfd, 0xac, 0x3b, 0xa9, 0xf9, - 0x33, 0x3a, 0x42, 0x24, 0x69, 0x87, 0x98, 0x8b, 0xf5, 0xb1, 0x4b, 0xac, 0x76, 0xcf, 0x35, 0x8b, 0xbe, 0x3d, 0x10, 0x8b, 0x4e, 0x7a, 0xb1, 0x89, 0xe9, 0x6f, 0x4d, 0x4c, 0x9d, 0xea, 0x5f, 0xfb, - 0xdf, 0xd1, 0xbb, 0xc8, 0xbe, 0x66, 0xda, 0x68, 0xda, 0x5f, 0x93, 0xd5, 0xaf, 0x7e, 0xd5, 0x27, 0x31, 0x2a, 0xcd, 0x85, 0xfd, 0x46, 0xeb, 0x81, 0x36, 0x31, 0x2a, 0xd8, 0xb7, 0xf7, 0xf7, 0x46, - 0xdd, 0x83, 0xe7, 0xf0, 0xac, 0x51, 0xa3, 0xd8, 0x78, 0xdd, 0xfb, 0xc7, 0xc9, 0xd3, 0xf3, 0x62, 0x3e, 0x0a, 0x8d, 0x2a, 0x77, 0x7b, 0xb5, 0x2c, 0xc1, 0xcf, 0x3f, 0x43, 0xdb, 0xce, 0x59, 0x30, - 0x9f, 0x3f, 0x4d, 0xc3, 0xe1, 0x7e, 0xe7, 0x09, 0x8f, 0x0e, 0xa2, 0x42, 0x12, 0xe6, 0x65, 0x79, 0xd3, 0x6a, 0x67, 0xef, 0xf1, 0x90, 0xad, 0x28, 0x61, 0xf4, 0xfb, 0x57, 0xc8, 0x99, 0x52, 0xa5, - 0xa4, 0xf8, 0xcc, 0xe9, 0x3d, 0x0a, 0x5f, 0xcb, 0xdb, 0x84, 0x51, 0x40, 0xc4, 0xb6, 0xc7, 0xcc, 0x07, 0x85, 0x4e, 0x50, 0x68, 0x1e, 0x31, 0x2d, 0xc9, 0x57, 0xa8, 0xdd, 0x67, 0x9d, 0x67, 0x94, - 0xe4, 0x60, 0xd1, 0x6b, 0x6b, 0xd9, 0x7f, 0x4d, 0xdd, 0x5b, 0xf7, 0x64, 0x25, 0x27, 0xa9, 0x31, 0x32, 0x9f, 0xf1, 0x33, 0x87, 0xb3, 0x61, 0xcd, 0x30, 0x6e, 0xdb, 0xb1, 0x6d, 0xa5, 0xd5, 0x91, - 0x19, 0x84, 0xba, 0x20, 0x51, 0x5d, 0xe0, 0xed, 0x27, 0x6b, 0x42, 0xfb, 0x3b, 0x72, 0x5a, 0x44, 0xff, 0x48, 0x92, 0x4f, 0xca, 0xcd, 0x0c, 0xf3, 0xa2, 0x2e, 0x71, 0xa9, 0xb8, 0xae, 0x55, 0xd5, - 0x35, 0x60, 0x95, 0xb9, 0xc6, 0x99, 0x10, 0x59, 0x6c, 0x9a, 0xe5, 0xd7, 0xad, 0xc6, 0xdb, 0xea, 0x6b, 0x1d, 0x68, 0x19, 0xed, 0x37, 0xd0, 0x32, 0x82, 0x1b, 0xb8, 0xad, 0x3f, 0xe4, 0x05, 0x96, - 0xee, 0xb7, 0xe7, 0x1c, 0xf8, 0x32, 0x47, 0xe1, 0xde, 0x3a, 0xbd, 0xa3, 0x77, 0xf5, 0xd4, 0x76, 0xbb, 0xbb, 0x0d, 0x57, 0x52, 0x35, 0x24, 0xbe, 0xb9, 0xe4, 0x35, 0x8b, 0x7b, 0x6f, 0x61, 0x25, - 0xed, 0xeb, 0xa2, 0xf6, 0xd7, 0xf3, 0x35, 0x31, 0xa1, 0x56, 0x48, 0xa6, 0x55, 0x3c, 0x5a, 0x46, 0x7d, 0xb8, 0xea, 0xc3, 0x9d, 0x14, 0x6b, 0xff, 0x3e, 0xf8, 0xef, 0xf3, 0x63, 0x70, 0xb7, 0x18, - 0x1d, 0x1d, 0x3f, 0xb9, 0x3a, 0x69, 0x19, 0x1d, 0x4e, 0xbe, 0x76, 0x3a, 0xaf, 0x9d, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, - 0x4e, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x03, 0xdd, 0xe9, 0x11, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4a, 0xa2, 0x67, 0x39, 0x94, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x74, 0x90, 0xcd, 0x8a, 0xc2, 0x30, 0x14, 0x85, 0xf7, 0x3e, 0xc5, 0xc5, 0xe5, 0x40, 0x53, 0x98, 0xa5, 0xe0, 0x22, 0xda, 0x28, + 0x01, 0xff, 0xa8, 0x51, 0x98, 0x55, 0xb8, 0x6a, 0x2a, 0x6d, 0xd3, 0x4e, 0x26, 0x3f, 0x05, 0xdf, 0x7e, 0xa8, 0xd3, 0x0e, 0x95, 0xe9, 0x2c, 0x02, 0xe1, 0x9c, 0x9c, 0x7b, 0xbe, 0xdc, 0x4b, 0xc8, + 0xf5, 0x8d, 0xd5, 0x8d, 0x9b, 0x4d, 0x00, 0x22, 0xa8, 0xb1, 0x52, 0x33, 0x58, 0x1c, 0xe4, 0x8e, 0x0a, 0x7e, 0x66, 0x92, 0x6f, 0xe9, 0x9a, 0x4d, 0x00, 0x00, 0x1a, 0xd4, 0x41, 0xcd, 0x60, 0x9a, + 0xa1, 0x76, 0x6a, 0xfa, 0xfa, 0x78, 0x4b, 0xcf, 0x6c, 0x27, 0x17, 0x27, 0xbe, 0x11, 0x92, 0xa6, 0x82, 0xaf, 0xe8, 0x52, 0x0c, 0x43, 0x59, 0xa8, 0xaf, 0xe4, 0x81, 0x95, 0x06, 0x8f, 0xf6, 0xae, + 0x7c, 0xfc, 0x15, 0xd0, 0x96, 0xc1, 0x45, 0x68, 0x4c, 0xac, 0xf3, 0x4b, 0x3c, 0xa6, 0xbf, 0x91, 0x02, 0xed, 0x98, 0xd1, 0x9e, 0x31, 0xbd, 0xbb, 0xc7, 0xff, 0xb1, 0x25, 0x92, 0xa6, 0xeb, 0xd3, + 0x96, 0xed, 0xc4, 0x71, 0x08, 0x67, 0xf0, 0x5a, 0xe2, 0x5d, 0x41, 0x94, 0xb8, 0x32, 0x37, 0x42, 0x39, 0xef, 0xe6, 0xde, 0x86, 0x56, 0xa8, 0xb0, 0x51, 0x35, 0x29, 0xb0, 0xc1, 0xdb, 0xe7, 0x95, + 0xb4, 0x76, 0xef, 0x74, 0x5d, 0xa4, 0x0b, 0x13, 0xff, 0x30, 0x6a, 0x9e, 0xa1, 0xf3, 0x51, 0x81, 0x76, 0x00, 0xf0, 0xd3, 0x7e, 0x7c, 0xe7, 0xbf, 0x7b, 0x91, 0x09, 0x4f, 0x5f, 0xfa, 0xff, 0xfe, + 0x64, 0x90, 0x6f, 0x93, 0xc7, 0xfd, 0x29, 0x5d, 0x32, 0x99, 0xb0, 0xc3, 0x66, 0xff, 0xf1, 0xc4, 0x97, 0x2b, 0xbe, 0x11, 0x2c, 0x1d, 0x4e, 0xd1, 0xf9, 0x05, 0xfa, 0x11, 0x36, 0xd4, 0xcf, 0xdd, + 0xa1, 0x31, 0xbd, 0x36, 0xf9, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdb, 0xf9, 0xb9, 0xcb, 0xff, 0x00, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x2a, 0x49, 0x2c, 0x4a, 0x4f, 0x2d, 0xd1, 0xe7, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0xb4, 0xbd, 0x4b, 0x6f, + 0x5c, 0xbb, 0xae, 0x3f, 0x38, 0xdf, 0x9f, 0x22, 0xd8, 0x77, 0x78, 0xe3, 0x5c, 0xf1, 0x21, 0x52, 0x6a, 0xe0, 0x02, 0x0d, 0xf4, 0xa8, 0xe7, 0x3d, 0xbb, 0xb8, 0x08, 0x48, 0x8a, 0x4c, 0x7c, 0xb6, + 0x1f, 0x69, 0x3f, 0xf6, 0xe3, 0x7c, 0xfa, 0x3f, 0x56, 0xd9, 0x49, 0xec, 0x72, 0x95, 0x93, 0x7d, 0x4e, 0x79, 0x12, 0x54, 0x2d, 0x2f, 0x3b, 0x22, 0x45, 0x51, 0x3f, 0xfe, 0x44, 0x52, 0xff, 0xf1, + 0xee, 0xff, 0xfb, 0x7c, 0x7e, 0xfb, 0xae, 0xce, 0x2f, 0xf2, 0xdd, 0xf9, 0xed, 0x3b, 0xbb, 0xbf, 0xbb, 0xbe, 0xb4, 0xbb, 0xf3, 0xb0, 0x8b, 0x8b, 0xbf, 0xde, 0xfd, 0xdf, 0x9f, 0xf2, 0x2a, 0x6f, + 0xec, 0x2e, 0xd7, 0x3b, 0xff, 0xeb, 0xdd, 0xff, 0x63, 0x37, 0x9f, 0xae, 0x3f, 0xfc, 0xf2, 0x1f, 0xef, 0xfe, 0xdf, 0xbb, 0xed, 0xd5, 0xab, 0xeb, 0xbb, 0x77, 0xe7, 0x57, 0x77, 0x79, 0xb5, 0x72, + 0xbd, 0xab, 0xeb, 0x9b, 0x77, 0x97, 0x76, 0x75, 0x6f, 0x17, 0xef, 0x72, 0x9d, 0xdf, 0x9d, 0x5f, 0x7d, 0xfa, 0xf0, 0xcb, 0xef, 0x79, 0x73, 0x7b, 0x7e, 0x7d, 0xf5, 0xee, 0xbf, 0xdf, 0xd1, 0x2f, + 0xbf, 0xfc, 0xcf, 0xff, 0x7c, 0xb1, 0xf8, 0xcd, 0x3e, 0xe5, 0xff, 0xfe, 0xef, 0x2f, 0x57, 0x76, 0x99, 0xef, 0xfe, 0xfb, 0xdd, 0xaf, 0x16, 0x77, 0xe7, 0x7f, 0x9e, 0xc5, 0xf5, 0xca, 0xf8, 0xf5, + 0xc9, 0xdb, 0xbf, 0xb6, 0x0f, 0xfd, 0x03, 0xfc, 0xfa, 0xcb, 0xed, 0xf5, 0xfd, 0x4d, 0xec, 0x5e, 0xbc, 0xc9, 0x4f, 0xe7, 0xb7, 0x77, 0x37, 0x7f, 0xfd, 0xe7, 0xe7, 0xbb, 0xbb, 0x2f, 0xb7, 0xff, + 0xd7, 0x7f, 0xfd, 0xd7, 0xa7, 0xf3, 0xbb, 0xcf, 0xf7, 0xfe, 0x21, 0xae, 0x2f, 0xff, 0xeb, 0xe6, 0xfe, 0xf6, 0xee, 0xec, 0xc2, 0xae, 0x3e, 0xfd, 0x57, 0x6c, 0x23, 0xbd, 0xfd, 0x70, 0x7e, 0x7d, + 0x76, 0x7e, 0xb5, 0xf2, 0xcf, 0x5f, 0x7f, 0x89, 0xcf, 0x19, 0xbf, 0xdd, 0xde, 0x5f, 0x6e, 0x7f, 0x42, 0x40, 0x6d, 0xa0, 0x8c, 0xa4, 0x4e, 0x5a, 0x09, 0x6b, 0xc4, 0x4c, 0x5b, 0x13, 0x7b, 0x85, + 0xf1, 0xcc, 0x12, 0x6e, 0x6d, 0xa2, 0x66, 0xaa, 0x07, 0x8a, 0xf6, 0x96, 0xb3, 0x65, 0x64, 0x02, 0x47, 0xb2, 0x8f, 0x5f, 0x7f, 0x59, 0xf9, 0x65, 0x93, 0xf5, 0x2a, 0xce, 0xf3, 0xf6, 0xdd, 0x7f, + 0xbf, 0xfb, 0x9f, 0x5f, 0xde, 0xfd, 0xea, 0xe7, 0x77, 0x75, 0x61, 0x9f, 0x6e, 0x7f, 0x7d, 0xbf, 0x7d, 0xf9, 0xeb, 0x2e, 0x1f, 0x3e, 0xd5, 0xfd, 0xdd, 0xfd, 0x4d, 0xde, 0x9e, 0xc5, 0xf5, 0x4d, + 0x3e, 0x7b, 0x70, 0x7b, 0x7e, 0xf5, 0xdb, 0xee, 0xc1, 0x65, 0x5e, 0xc6, 0xe7, 0x9b, 0xdd, 0xc7, 0x2f, 0xe7, 0x57, 0x67, 0x5f, 0x6e, 0xae, 0xff, 0x91, 0x71, 0x77, 0x76, 0x71, 0x7e, 0xf7, 0xf0, + 0x0b, 0x77, 0xd7, 0xbf, 0x9d, 0x5f, 0x7f, 0xff, 0x74, 0x76, 0x7f, 0x77, 0x7e, 0xf1, 0xf0, 0xf5, 0xc6, 0xe2, 0xfc, 0xea, 0xd3, 0xaf, 0xef, 0x7f, 0xf9, 0xdf, 0xd7, 0x74, 0xba, 0xe9, 0xe9, 0x99, + 0x4a, 0xe9, 0x03, 0x9d, 0x5c, 0xa5, 0x81, 0x4d, 0x27, 0xb2, 0xf4, 0x29, 0x01, 0xc3, 0xd9, 0x88, 0x12, 0x95, 0x2d, 0xa1, 0x45, 0xcb, 0xde, 0x04, 0xa8, 0x78, 0x11, 0x1a, 0xc3, 0x1c, 0xd9, 0x66, + 0xa8, 0x4f, 0x52, 0x85, 0x06, 0x54, 0xb9, 0x94, 0x0f, 0xaa, 0xf4, 0xa9, 0x4d, 0xbc, 0xff, 0xf6, 0xfd, 0xe6, 0xee, 0xc9, 0x97, 0xdb, 0xbc, 0xf9, 0xfd, 0x3c, 0xf2, 0xc9, 0x93, 0x4d, 0x3d, 0x0f, + 0xaa, 0xb7, 0xcf, 0x76, 0xfb, 0xf9, 0x5d, 0xfb, 0x30, 0x3e, 0xd0, 0xc3, 0xa4, 0xd8, 0x6d, 0x0a, 0xbf, 0x6b, 0x1f, 0x10, 0x3e, 0xe0, 0xc3, 0x93, 0x67, 0x73, 0x76, 0x73, 0x7d, 0x77, 0x71, 0xbe, + 0x37, 0x7d, 0xbb, 0x4f, 0x77, 0x37, 0x0f, 0x6a, 0x7e, 0xf7, 0xeb, 0xca, 0x9b, 0xf3, 0xdf, 0xf3, 0xe3, 0xe5, 0xd7, 0xc9, 0xcc, 0xab, 0xb8, 0x5e, 0xe7, 0x57, 0x9f, 0x3e, 0xde, 0x3c, 0xce, 0xf6, + 0x85, 0xdd, 0x25, 0x1e, 0x9e, 0xf8, 0xcf, 0x0f, 0xcf, 0x77, 0xd3, 0xf1, 0xf5, 0x83, 0xdd, 0xdc, 0xe6, 0xb7, 0x2f, 0xcb, 0x1e, 0x67, 0xfc, 0xfc, 0xee, 0xda, 0x76, 0x1f, 0x36, 0xbd, 0xdf, 0xdb, + 0xa7, 0x3c, 0xbb, 0xfb, 0x3a, 0xc8, 0x8b, 0xeb, 0xb0, 0x8b, 0xb3, 0xf8, 0x6c, 0x57, 0x57, 0xf9, 0x60, 0x05, 0x97, 0xe7, 0x97, 0x0f, 0xbf, 0xf5, 0x25, 0x6f, 0x22, 0xaf, 0xee, 0xce, 0xbe, 0x8e, + 0xe9, 0xb8, 0x45, 0xdd, 0xd8, 0xd5, 0xda, 0x7d, 0xb8, 0xfd, 0x6c, 0xf0, 0xf0, 0xe1, 0xd2, 0x2e, 0x2e, 0x7e, 0x7f, 0x54, 0xf3, 0x4f, 0x18, 0xdc, 0xbb, 0x5f, 0xff, 0x79, 0x7b, 0xb7, 0x7e, 0x64, + 0x79, 0x97, 0x16, 0x37, 0xd7, 0xb7, 0x7b, 0xcb, 0x19, 0x3f, 0xd0, 0x89, 0x6d, 0x8f, 0xa5, 0x9b, 0x80, 0x62, 0x94, 0x4c, 0x9f, 0xd2, 0x26, 0xe8, 0x00, 0x68, 0x88, 0x6b, 0x14, 0x4e, 0x8f, 0xe6, + 0x5a, 0x06, 0x34, 0x87, 0x07, 0x97, 0x0e, 0xa7, 0x60, 0x11, 0x51, 0x5a, 0x0e, 0x08, 0xe4, 0x72, 0xd0, 0xf6, 0xfe, 0xff, 0xfb, 0xeb, 0x47, 0x6d, 0xdd, 0xfe, 0x75, 0xf5, 0x0e, 0x3e, 0xb4, 0x0f, + 0xd0, 0xe6, 0x8f, 0x04, 0xbe, 0xb9, 0xbe, 0xbf, 0xcb, 0x9b, 0x37, 0xf7, 0x5f, 0x4b, 0xa4, 0x8a, 0x17, 0xb2, 0x2e, 0x74, 0x90, 0x36, 0x04, 0xca, 0x70, 0x88, 0x70, 0xd7, 0x1c, 0x5d, 0x9b, 0x0c, + 0xa2, 0x8e, 0x3a, 0xb8, 0x25, 0x03, 0x51, 0x8d, 0xe2, 0x69, 0xc6, 0x48, 0x46, 0x43, 0xe7, 0x3c, 0xec, 0xbf, 0x9e, 0x5b, 0xfa, 0x37, 0x33, 0xbd, 0xc9, 0x4f, 0xf9, 0xe7, 0x83, 0x22, 0xf2, 0x66, + 0xe5, 0x9e, 0x21, 0xbc, 0xae, 0x8e, 0xbb, 0x67, 0xaa, 0xc0, 0x0f, 0xe3, 0x43, 0x3b, 0xb1, 0x2a, 0xa0, 0xa3, 0x74, 0x17, 0x1f, 0x89, 0xc4, 0x2a, 0xda, 0xd2, 0x49, 0x28, 0x58, 0x2b, 0x46, 0x68, + 0xc7, 0xb6, 0xf9, 0x22, 0x9e, 0x93, 0x1d, 0x15, 0x26, 0x16, 0x71, 0xaf, 0xf0, 0xd4, 0xa6, 0xa3, 0x71, 0x51, 0xbe, 0xe2, 0x77, 0x1e, 0xad, 0xf7, 0xe0, 0x5a, 0xfe, 0xba, 0x44, 0x5e, 0x15, 0x7f, + 0xf3, 0x4d, 0x7b, 0xd6, 0x80, 0x1f, 0xf0, 0xe4, 0x2a, 0xa0, 0x1c, 0x02, 0x64, 0xda, 0xd7, 0xea, 0x2d, 0x82, 0x7b, 0xb1, 0x52, 0x64, 0x52, 0x10, 0xaf, 0x3e, 0x73, 0x89, 0x6a, 0xb4, 0x52, 0x67, + 0xe6, 0xd1, 0x22, 0xc9, 0xc7, 0x66, 0x39, 0xba, 0xa2, 0xc3, 0x24, 0xd4, 0x57, 0x54, 0xf0, 0xd3, 0xae, 0xf6, 0xe8, 0x2e, 0xf7, 0xcd, 0x77, 0x5c, 0x3e, 0xba, 0x94, 0xab, 0xfb, 0xcb, 0x8f, 0xf1, + 0xe5, 0xfe, 0xe1, 0xd7, 0x6e, 0xaf, 0xe3, 0xb7, 0xbc, 0xc3, 0x7d, 0xaf, 0xf3, 0x73, 0xd6, 0xf5, 0x75, 0x3c, 0xcf, 0xf5, 0xdb, 0x3e, 0xe0, 0xa9, 0xf5, 0xeb, 0x63, 0xf2, 0x64, 0xa8, 0x01, 0x23, + 0x6a, 0x85, 0x46, 0x04, 0xfb, 0x4c, 0x69, 0x65, 0x9a, 0x9d, 0xbc, 0x37, 0x46, 0xc3, 0x1c, 0x5d, 0x14, 0xb5, 0xd5, 0x04, 0xd6, 0xd5, 0xfb, 0x84, 0x31, 0x89, 0x94, 0xec, 0xa0, 0x7e, 0x5f, 0x28, + 0xec, 0x8b, 0xdd, 0x3e, 0xfa, 0x9b, 0x03, 0x2e, 0xfb, 0x55, 0x3d, 0x3c, 0xcc, 0xc2, 0xf3, 0x0d, 0xbe, 0x9d, 0xdc, 0xe7, 0x8c, 0x61, 0xb0, 0x62, 0x55, 0x01, 0x8b, 0x24, 0x05, 0xf2, 0x18, 0x09, + 0xe1, 0x3d, 0x48, 0x4c, 0x61, 0x20, 0x6a, 0x6f, 0xb6, 0x98, 0x06, 0xcd, 0x49, 0x5a, 0xa3, 0x2f, 0x2c, 0x5e, 0xb3, 0x86, 0x6b, 0xeb, 0xeb, 0x30, 0x66, 0x7a, 0xd8, 0xcd, 0xfe, 0xb0, 0xdf, 0xf2, + 0x28, 0xfe, 0x79, 0x55, 0xf4, 0x3f, 0xd2, 0x9f, 0x09, 0xce, 0x6f, 0x81, 0x6c, 0x16, 0x85, 0x33, 0xd6, 0xec, 0x22, 0xe6, 0xa0, 0x92, 0x90, 0xd5, 0x7c, 0x38, 0xd9, 0x98, 0xd2, 0x71, 0x36, 0x41, + 0xe7, 0xac, 0x10, 0xcf, 0x06, 0x48, 0x8d, 0xa5, 0xcd, 0x3e, 0x81, 0x83, 0x03, 0x62, 0x1e, 0xde, 0x5d, 0x0e, 0x23, 0x9b, 0x6f, 0x3e, 0xf7, 0x85, 0x03, 0x7a, 0xb6, 0xbd, 0xbc, 0x3f, 0xbe, 0x3e, + 0x9f, 0xfd, 0xf4, 0x55, 0x6c, 0xf4, 0x55, 0x7f, 0xbb, 0x41, 0x7c, 0xca, 0xab, 0x87, 0xa7, 0x8f, 0x88, 0x49, 0x3f, 0xc8, 0xee, 0xfb, 0x51, 0x1c, 0x14, 0xf5, 0xe9, 0xec, 0xbc, 0x1e, 0x3e, 0x5e, + 0x5f, 0xff, 0x76, 0xfe, 0xf0, 0x9f, 0xfc, 0x10, 0x1d, 0xfd, 0xd0, 0x4b, 0x7c, 0xd3, 0xc0, 0xab, 0x10, 0xe8, 0xd3, 0xa3, 0x47, 0x79, 0x04, 0x3e, 0xd7, 0x57, 0x91, 0x1f, 0x23, 0x2f, 0x2e, 0x8e, + 0xd9, 0xd0, 0xe1, 0x4d, 0x6c, 0xf7, 0xe9, 0xe3, 0x3f, 0x6e, 0xaf, 0xaf, 0x9e, 0x7c, 0xbd, 0xbf, 0xb9, 0xd8, 0x8d, 0x3a, 0x1f, 0x01, 0xd2, 0x53, 0x5c, 0xf4, 0xcc, 0x5b, 0x9d, 0x5f, 0xe6, 0xbb, + 0xf6, 0x81, 0x3e, 0xe0, 0xc3, 0xf7, 0xfb, 0x9b, 0x8b, 0x9f, 0x30, 0xd6, 0x6f, 0xca, 0x7e, 0x6e, 0xb4, 0xa7, 0xdf, 0x13, 0x10, 0x05, 0x41, 0x9a, 0xa9, 0x25, 0xce, 0x24, 0x86, 0xde, 0x3b, 0x1b, + 0x15, 0x54, 0x34, 0x0e, 0x15, 0x76, 0xe8, 0xdc, 0x02, 0x40, 0xcc, 0x3a, 0xb2, 0x0c, 0xc2, 0x36, 0x9a, 0x0e, 0x57, 0xd3, 0xee, 0x71, 0x18, 0x21, 0xbc, 0x30, 0xc2, 0x2f, 0x37, 0xd7, 0xf1, 0x60, + 0xa5, 0x0f, 0x4a, 0xf8, 0xbb, 0x98, 0x69, 0x5d, 0xec, 0x6d, 0x8f, 0xf0, 0x06, 0xee, 0xbb, 0x50, 0xb0, 0x81, 0x34, 0x8e, 0xa1, 0x0e, 0xd9, 0xc0, 0x17, 0xad, 0x39, 0x6a, 0xac, 0xbe, 0xa6, 0x8d, + 0x0a, 0xf7, 0x01, 0x3d, 0x47, 0xe4, 0x72, 0x86, 0xaa, 0x08, 0x4f, 0x67, 0xaf, 0x3e, 0xc9, 0xa8, 0x57, 0xfe, 0x7a, 0x64, 0xf0, 0xdb, 0x52, 0xd9, 0x43, 0x7a, 0xdb, 0xb2, 0x39, 0xf1, 0xe0, 0xc3, + 0x3b, 0x58, 0x93, 0xd9, 0xd7, 0xa8, 0x41, 0xc3, 0x21, 0xb3, 0xb5, 0xe9, 0x54, 0x5e, 0x22, 0xbe, 0xac, 0xe9, 0x88, 0x25, 0xdc, 0x67, 0xc3, 0x86, 0x36, 0x84, 0x6d, 0x14, 0xe5, 0x08, 0x26, 0xe8, + 0xc1, 0x87, 0xf7, 0xf6, 0x4f, 0x79, 0xb7, 0x45, 0x00, 0xd7, 0x97, 0x07, 0x56, 0xcf, 0xa3, 0x3c, 0x1f, 0x77, 0x83, 0x78, 0x65, 0xea, 0x0e, 0x48, 0x3f, 0x4e, 0x0e, 0xec, 0x31, 0xe6, 0x2c, 0xe1, + 0x05, 0xd9, 0x84, 0xc7, 0x28, 0xc1, 0x56, 0x93, 0x50, 0x54, 0x13, 0xd9, 0x43, 0x12, 0xc7, 0xd4, 0x3e, 0x70, 0x8e, 0xc6, 0x0c, 0x96, 0xb3, 0x99, 0x28, 0x30, 0x74, 0x5f, 0x9a, 0x81, 0x75, 0x50, + 0xfa, 0x27, 0xae, 0xeb, 0x24, 0x8a, 0xb8, 0xde, 0xdc, 0x99, 0xdd, 0x9e, 0xc7, 0x6f, 0x6f, 0x6e, 0xca, 0x4c, 0x25, 0xe1, 0xe0, 0x85, 0x88, 0x0d, 0x3b, 0x71, 0x03, 0x1d, 0x45, 0x03, 0x83, 0x51, + 0x0a, 0x48, 0xbb, 0x3a, 0x4e, 0x69, 0x39, 0xa6, 0xea, 0x5c, 0x15, 0x4e, 0x30, 0x83, 0xb0, 0x33, 0x5a, 0x37, 0x86, 0x83, 0xfa, 0xf8, 0x46, 0x3f, 0x1c, 0x93, 0xf0, 0xe2, 0xe2, 0x3a, 0xce, 0xae, + 0xae, 0xcf, 0x6e, 0xef, 0xd6, 0xc5, 0xb9, 0xbf, 0x80, 0x5b, 0x7c, 0x62, 0x21, 0x23, 0xd4, 0x1d, 0x04, 0x33, 0x68, 0x2e, 0xde, 0xb6, 0xdc, 0xb0, 0x11, 0xaa, 0x5e, 0x8a, 0x39, 0x66, 0xeb, 0xd4, + 0x3d, 0x63, 0x81, 0x76, 0x70, 0xe7, 0x5e, 0xc2, 0xd1, 0xa7, 0x6e, 0x8b, 0x37, 0x46, 0x88, 0xd3, 0xb1, 0xf5, 0xba, 0x13, 0xe3, 0x80, 0x0c, 0x5b, 0x44, 0x7a, 0xea, 0x89, 0x9a, 0x5c, 0x3e, 0x36, + 0x40, 0xc4, 0x10, 0x8a, 0x80, 0x33, 0xbd, 0x83, 0xeb, 0x6a, 0x84, 0x18, 0x38, 0x7d, 0xd0, 0x50, 0x6b, 0x34, 0x04, 0x50, 0x15, 0x86, 0xb7, 0x29, 0x8c, 0x13, 0x1b, 0x58, 0x5f, 0x92, 0x71, 0x24, + 0x2a, 0xd9, 0x9b, 0x88, 0xe3, 0x33, 0x76, 0xb5, 0x6e, 0xae, 0xcf, 0xd7, 0xd9, 0xdd, 0x3f, 0x97, 0xdd, 0xd9, 0x9e, 0xb0, 0x70, 0x72, 0x80, 0x94, 0x73, 0xce, 0xc9, 0xe0, 0x48, 0x5c, 0x04, 0x04, + 0xde, 0x9a, 0x07, 0x50, 0x20, 0xae, 0x26, 0x39, 0xa2, 0x57, 0x29, 0xca, 0x02, 0x17, 0x82, 0x61, 0xa1, 0xe9, 0xa8, 0x32, 0xa7, 0xba, 0x3b, 0x57, 0x56, 0x3b, 0x36, 0x61, 0x0f, 0x52, 0x7c, 0xbc, + 0xfd, 0xeb, 0xf6, 0x2e, 0x2f, 0x3f, 0x7e, 0xb9, 0xb9, 0xfe, 0x92, 0x37, 0x77, 0xe7, 0xb9, 0xcf, 0x27, 0xc0, 0x87, 0x7e, 0x62, 0x81, 0x06, 0xcc, 0x54, 0x84, 0xb9, 0x7c, 0x31, 0x34, 0x26, 0x0b, + 0xd4, 0xe9, 0x30, 0x07, 0xb5, 0xc2, 0xac, 0x18, 0x53, 0xa1, 0x0b, 0xcf, 0xb6, 0xb4, 0x96, 0xa4, 0x4d, 0x10, 0xc5, 0x06, 0xa0, 0x99, 0x22, 0x04, 0x87, 0x97, 0xd9, 0xc5, 0xb9, 0xc7, 0x2b, 0x53, + 0x76, 0xfb, 0xd7, 0x55, 0x9c, 0xdd, 0xdd, 0xd8, 0xf9, 0xdd, 0x0b, 0xf1, 0x64, 0x9c, 0x58, 0x3e, 0x9f, 0x11, 0x6b, 0x8d, 0x42, 0x03, 0x01, 0xcf, 0xe9, 0xab, 0x47, 0x43, 0x5a, 0xd5, 0xa5, 0xc0, + 0xd1, 0x9a, 0x2f, 0x58, 0x9b, 0x89, 0xa2, 0x6d, 0xe1, 0x8d, 0x82, 0x0d, 0x36, 0xc0, 0x98, 0x5e, 0x92, 0x83, 0xf1, 0xa0, 0x7c, 0xaf, 0x63, 0x81, 0xcd, 0x51, 0xc0, 0x78, 0x45, 0xfe, 0xfb, 0xbb, + 0xeb, 0xa8, 0x4f, 0x7b, 0x1e, 0x14, 0x4e, 0x8e, 0x8b, 0x16, 0xcb, 0x18, 0x0d, 0x7d, 0x03, 0xf2, 0xe1, 0xd1, 0x22, 0xba, 0xf6, 0x9c, 0xde, 0x3a, 0x15, 0x43, 0x2a, 0x9a, 0x91, 0x78, 0x99, 0xb8, + 0x56, 0xef, 0x49, 0x1d, 0x67, 0x95, 0x31, 0x6d, 0x8a, 0x9a, 0x5a, 0x76, 0xc4, 0x56, 0x1f, 0x98, 0xc5, 0xfd, 0x99, 0x3b, 0x3d, 0xd3, 0x45, 0xcc, 0x50, 0x5b, 0x28, 0xdf, 0x50, 0xc7, 0xc8, 0xc9, + 0x23, 0x59, 0x8b, 0xbb, 0x86, 0x35, 0x28, 0x58, 0x9a, 0xb2, 0x26, 0x86, 0x4c, 0xda, 0x56, 0x20, 0x06, 0xa2, 0xb7, 0xa1, 0x8b, 0x80, 0x21, 0x1a, 0x55, 0xfd, 0x9d, 0xe1, 0xef, 0x48, 0xd2, 0xd3, + 0x0e, 0x5f, 0x1a, 0x6f, 0x1b, 0x96, 0x44, 0x0f, 0x84, 0x6a, 0xb8, 0xa2, 0xf7, 0xae, 0x83, 0x07, 0xb4, 0x5c, 0xe5, 0x63, 0x2c, 0x62, 0x0b, 0x0c, 0x25, 0xc7, 0xb4, 0x84, 0x36, 0xa5, 0x6f, 0x0b, + 0x2d, 0x53, 0x29, 0x92, 0xd6, 0xb1, 0xe1, 0x7f, 0x65, 0x71, 0x9f, 0x5b, 0x0f, 0x9d, 0x7c, 0xfc, 0x9e, 0x45, 0x63, 0x71, 0x07, 0xa1, 0xc0, 0x82, 0xb5, 0xb2, 0x4d, 0x36, 0x5d, 0xb5, 0x88, 0x22, + 0xaa, 0xcf, 0x1e, 0x13, 0x67, 0xeb, 0x31, 0x6a, 0x14, 0xd7, 0x0a, 0x18, 0xab, 0x49, 0x39, 0x34, 0xda, 0xdc, 0xfc, 0x51, 0xeb, 0xb9, 0xb8, 0x8e, 0xdf, 0xce, 0xfc, 0xbe, 0xea, 0x05, 0x77, 0x08, + 0xa7, 0xdf, 0x5f, 0x69, 0x83, 0x8c, 0x2a, 0x38, 0x5d, 0x70, 0x51, 0x35, 0xa6, 0xd9, 0x41, 0xcb, 0x68, 0xf2, 0x9c, 0x62, 0x61, 0x11, 0x3d, 0x3c, 0x26, 0x44, 0x37, 0x6c, 0x6b, 0x84, 0xf4, 0x91, + 0xaa, 0xe6, 0xab, 0x37, 0x32, 0x3d, 0xec, 0xdd, 0x76, 0x67, 0x43, 0xe7, 0x71, 0x66, 0x37, 0x37, 0xf6, 0xd7, 0xf1, 0x65, 0xfe, 0x48, 0xb1, 0xef, 0x1f, 0x46, 0x9c, 0x5a, 0x44, 0x03, 0x6b, 0x0e, + 0xcb, 0x23, 0xc6, 0x16, 0xff, 0x10, 0x4e, 0x41, 0xa8, 0xb1, 0xb8, 0xda, 0x1a, 0xd4, 0x75, 0x68, 0x40, 0xd0, 0x70, 0x07, 0x6e, 0x30, 0x75, 0x3a, 0xcf, 0x05, 0xe4, 0xcd, 0xa9, 0xf5, 0x2a, 0x39, + 0xcc, 0x55, 0xbc, 0xdc, 0x7e, 0xf7, 0x40, 0xc5, 0xfb, 0x6f, 0x67, 0x08, 0x67, 0x2b, 0xe3, 0xfa, 0xf2, 0xcb, 0x4d, 0xde, 0xde, 0x5e, 0xbf, 0x82, 0xac, 0x0e, 0xbd, 0xfc, 0x1c, 0x5d, 0x9d, 0x5e, + 0x35, 0xec, 0xd2, 0x05, 0x6a, 0x51, 0x8d, 0xd9, 0x0d, 0x20, 0x47, 0x29, 0x5a, 0x61, 0xb8, 0x2e, 0xc4, 0x6c, 0x83, 0x44, 0x3c, 0x3d, 0xd0, 0xc5, 0xbb, 0x96, 0x2a, 0x73, 0xb0, 0x2f, 0x43, 0x6d, + 0xc4, 0xca, 0x47, 0xce, 0x69, 0x7e, 0xac, 0x9a, 0x63, 0x2a, 0xb8, 0xbf, 0xfc, 0x62, 0x17, 0xd7, 0x7b, 0x16, 0x01, 0x74, 0x72, 0xc7, 0x6f, 0x94, 0x18, 0xb4, 0x2c, 0x6b, 0x0c, 0xca, 0x08, 0xf0, + 0xbe, 0xfa, 0x08, 0xe8, 0xb6, 0x2c, 0x27, 0xb1, 0x36, 0x9b, 0xb0, 0x18, 0x7b, 0x51, 0x27, 0x74, 0x03, 0x99, 0x7d, 0xf0, 0x94, 0x2e, 0x56, 0x54, 0x01, 0xc7, 0x96, 0xee, 0x8e, 0x20, 0x79, 0xee, + 0x77, 0xf8, 0xe4, 0x83, 0x1f, 0xd3, 0xb1, 0x16, 0x5a, 0x5b, 0xb1, 0x39, 0x20, 0x9d, 0x0a, 0x89, 0x30, 0xd9, 0xc5, 0x25, 0xd3, 0xcd, 0xb9, 0x5b, 0x36, 0x68, 0xa2, 0xdc, 0xc5, 0xb4, 0xd6, 0xa4, + 0xd5, 0x3b, 0xab, 0x09, 0xb8, 0x36, 0x3f, 0x16, 0xc2, 0x3e, 0xe1, 0x74, 0xf6, 0x3d, 0xe7, 0xa9, 0x25, 0x40, 0x1a, 0xc9, 0x63, 0x88, 0x4a, 0x5b, 0x73, 0x04, 0xd7, 0x98, 0x93, 0xa4, 0xc5, 0x20, + 0x2e, 0x9b, 0x94, 0x82, 0x51, 0x5a, 0x8a, 0x60, 0x41, 0x81, 0xcb, 0x48, 0x7b, 0xf8, 0x2a, 0xf6, 0x21, 0x3a, 0xcd, 0x0e, 0x03, 0xe2, 0xaf, 0xec, 0xd4, 0x11, 0xdb, 0x8a, 0x78, 0x11, 0x90, 0xe9, + 0x3c, 0xb1, 0x5c, 0xbd, 0x2d, 0x6a, 0xb3, 0x09, 0x6e, 0x50, 0x1e, 0xd6, 0xec, 0x9e, 0xb4, 0x58, 0x67, 0x27, 0x72, 0xee, 0xa3, 0x86, 0xf2, 0x24, 0xa7, 0x66, 0xec, 0xbd, 0x74, 0x9a, 0x34, 0x5d, + 0x3e, 0xaa, 0x2f, 0x00, 0xb3, 0x09, 0x87, 0x23, 0xd4, 0x7f, 0x5c, 0xfb, 0x37, 0x2e, 0xef, 0x98, 0x6c, 0x0f, 0x41, 0xec, 0xbe, 0x7c, 0xa7, 0x9e, 0x36, 0xb7, 0x82, 0x95, 0x4c, 0x34, 0x55, 0xa0, + 0x8f, 0xe1, 0xd1, 0x04, 0x66, 0xd2, 0x06, 0x9d, 0x00, 0x5b, 0x66, 0x1f, 0x98, 0xee, 0xca, 0xde, 0xc9, 0x39, 0xcb, 0x4b, 0x27, 0x80, 0xfa, 0xc2, 0x65, 0xdc, 0xea, 0xd8, 0x86, 0x1d, 0x9f, 0x6f, + 0xae, 0xaf, 0xae, 0xf7, 0xb6, 0x3a, 0xfe, 0x80, 0xa7, 0x66, 0x4f, 0x32, 0x06, 0xa9, 0x29, 0x50, 0xef, 0x8e, 0xa3, 0x36, 0x30, 0xb1, 0x7c, 0x75, 0x99, 0x4e, 0xea, 0x54, 0x24, 0xd4, 0x26, 0x44, + 0xf3, 0xc5, 0x8e, 0xa9, 0xd4, 0xb7, 0xf5, 0x83, 0xe0, 0x1c, 0xbd, 0xd6, 0xf4, 0xe8, 0x87, 0x9d, 0xdd, 0xf3, 0xe8, 0x6a, 0x47, 0x56, 0xda, 0x95, 0x9d, 0xdd, 0x9d, 0x5f, 0xe6, 0xd9, 0x3f, 0xaf, + 0xaf, 0x1e, 0x40, 0xef, 0x3f, 0x6e, 0xcf, 0x6e, 0xff, 0x7a, 0xe0, 0x2b, 0xaf, 0xee, 0x2f, 0x1f, 0x90, 0xfd, 0xed, 0x1e, 0x01, 0xf9, 0xc8, 0x21, 0xc2, 0x07, 0xee, 0xbb, 0xef, 0x7f, 0xd8, 0xed, + 0xe5, 0x99, 0x9f, 0x5f, 0xad, 0xaf, 0x74, 0xec, 0x1f, 0xe7, 0x57, 0xf6, 0xe5, 0xfc, 0x15, 0x2b, 0xb8, 0xb8, 0xbe, 0x5f, 0xf9, 0x7b, 0x5e, 0xdd, 0xdd, 0x9e, 0xdd, 0xae, 0xdf, 0x5e, 0xb0, 0x51, + 0xa7, 0x36, 0x87, 0xd1, 0x40, 0x61, 0xc3, 0x0f, 0x1d, 0x86, 0x79, 0xeb, 0x4b, 0x43, 0x47, 0x6f, 0x23, 0x80, 0xa3, 0x7a, 0x07, 0x25, 0x03, 0x36, 0x30, 0x91, 0x3e, 0x19, 0x61, 0x11, 0x75, 0x0c, + 0xec, 0x2a, 0x26, 0x20, 0xea, 0x87, 0xad, 0xfd, 0x20, 0xf5, 0xfd, 0x47, 0x3e, 0xee, 0x22, 0x4f, 0xe2, 0xa2, 0xf7, 0x4f, 0x8f, 0xf0, 0x77, 0xe0, 0xfa, 0xfd, 0xf1, 0xb4, 0x8b, 0x47, 0x13, 0x7b, + 0xbf, 0x63, 0xa5, 0x2f, 0xf2, 0x93, 0xdd, 0xe5, 0x99, 0xdd, 0xdd, 0x3d, 0xf0, 0x96, 0x8f, 0xb4, 0xf3, 0xee, 0xf3, 0xe7, 0xeb, 0xdb, 0xbb, 0x4d, 0x9f, 0x0f, 0x5f, 0xbe, 0x8e, 0xe2, 0x38, 0x4b, + 0x7c, 0x65, 0x75, 0xbf, 0xfb, 0xf4, 0xc0, 0xf8, 0xbe, 0xfb, 0xf5, 0xfe, 0xfe, 0xfc, 0x81, 0x2b, 0xfe, 0x23, 0xfd, 0x71, 0xce, 0x8f, 0x4d, 0xd7, 0xf5, 0xd5, 0xef, 0x79, 0x73, 0xf7, 0x31, 0xec, + 0x36, 0x5f, 0x18, 0xff, 0xa9, 0xe7, 0x4a, 0x90, 0xfb, 0xea, 0xd3, 0x28, 0x07, 0x9a, 0x56, 0x20, 0x68, 0xf4, 0x81, 0xc3, 0x44, 0x26, 0x2e, 0x0f, 0x59, 0xe5, 0x42, 0xd6, 0x62, 0xc4, 0x6c, 0x3c, + 0xfb, 0x86, 0x90, 0xd4, 0xe7, 0xb6, 0xb9, 0x34, 0xb6, 0x76, 0x6c, 0xcf, 0x78, 0x64, 0xfb, 0xf7, 0x50, 0xaa, 0x9c, 0x1c, 0x6a, 0xe7, 0xe8, 0x33, 0x56, 0xd7, 0xd5, 0x14, 0xda, 0x9a, 0xd9, 0x24, + 0x68, 0x80, 0xf7, 0xde, 0xa2, 0x49, 0xaa, 0xcc, 0x89, 0xac, 0x68, 0x23, 0x64, 0x75, 0x54, 0xcb, 0x58, 0x58, 0x21, 0x4a, 0x2b, 0x02, 0x09, 0xca, 0x0f, 0xc7, 0xa8, 0x87, 0x32, 0x24, 0xf6, 0x99, + 0xfc, 0x9f, 0x24, 0xfe, 0xe2, 0xfa, 0x26, 0xcf, 0xea, 0xfa, 0xfe, 0x6a, 0xd9, 0xdd, 0xf9, 0xf5, 0xd5, 0x6e, 0xe6, 0xf7, 0xf9, 0xd0, 0x53, 0x83, 0xb7, 0xe4, 0x29, 0xd6, 0x5b, 0x2d, 0x1b, 0x66, + 0x11, 0x11, 0x43, 0x96, 0x76, 0x9c, 0x89, 0x01, 0xd9, 0xc6, 0x36, 0xaf, 0xab, 0xd5, 0x98, 0xc3, 0xc4, 0xbb, 0x70, 0xf7, 0xde, 0x05, 0x7c, 0xcc, 0x20, 0x84, 0x96, 0x47, 0xa3, 0xd7, 0xf8, 0x72, + 0x5f, 0x69, 0x0f, 0x4b, 0x62, 0x9f, 0x19, 0xd3, 0x13, 0x8b, 0x40, 0xc9, 0x01, 0x69, 0x86, 0x0d, 0x30, 0x58, 0x3d, 0xc3, 0xdd, 0x16, 0x6e, 0xf1, 0x78, 0xe7, 0xc1, 0x81, 0x36, 0x78, 0x01, 0x8c, + 0xee, 0x5d, 0xa4, 0x1c, 0x23, 0xba, 0x0f, 0x6d, 0x4a, 0x4c, 0xab, 0xb2, 0x1f, 0x39, 0x46, 0x7c, 0x95, 0x5b, 0x89, 0x9b, 0x20, 0x2c, 0xbb, 0xbd, 0x7b, 0xfb, 0xf8, 0xb0, 0x73, 0xf3, 0x35, 0x3c, + 0x06, 0xb4, 0x45, 0x63, 0xf4, 0xd8, 0xb1, 0x43, 0x89, 0x0d, 0x06, 0x35, 0x2c, 0x19, 0x6e, 0x6e, 0x08, 0x38, 0xcd, 0x29, 0xc7, 0x28, 0x42, 0x1a, 0x33, 0x73, 0x92, 0xb6, 0x31, 0xda, 0x7a, 0x9d, + 0xaf, 0x3e, 0x2a, 0xde, 0x5f, 0x5f, 0xee, 0xae, 0xcf, 0xe2, 0xfa, 0xf2, 0xf2, 0xfa, 0xea, 0x25, 0x79, 0x74, 0x62, 0x11, 0xc1, 0xcb, 0x01, 0x7b, 0xc3, 0x0d, 0x15, 0xb3, 0x44, 0x18, 0xb8, 0x77, + 0xb0, 0xc0, 0xb1, 0x6a, 0x2e, 0x81, 0xb1, 0x06, 0x50, 0xac, 0xa0, 0x85, 0x85, 0xdd, 0x67, 0xa5, 0x6a, 0x37, 0x62, 0x2b, 0x14, 0x77, 0xfa, 0xa9, 0xe8, 0xf1, 0xdd, 0xaf, 0x77, 0x7f, 0x7d, 0xc9, + 0xab, 0xfb, 0xcb, 0xe3, 0x52, 0x3f, 0x77, 0xea, 0xfb, 0x56, 0x7b, 0x6a, 0x98, 0x97, 0xa9, 0xa9, 0x69, 0x6d, 0xb9, 0x71, 0x53, 0xc6, 0xb9, 0x06, 0x48, 0x8e, 0xa4, 0xb1, 0x96, 0x81, 0xb1, 0x68, + 0x2c, 0x65, 0x25, 0x55, 0xc4, 0xc2, 0x6d, 0x61, 0xa6, 0xa5, 0x34, 0xc6, 0x69, 0x60, 0x64, 0x47, 0xbc, 0xd1, 0xbf, 0x77, 0x7a, 0xf6, 0xf4, 0xb0, 0xf5, 0xb9, 0xfc, 0x73, 0x7e, 0x80, 0x53, 0xaf, + 0x5b, 0x2e, 0xdf, 0x19, 0x75, 0x33, 0x0d, 0x98, 0x9d, 0x6a, 0x02, 0x11, 0xaf, 0x54, 0x64, 0x56, 0x82, 0x0a, 0x2a, 0x0a, 0x68, 0x4b, 0x2b, 0x41, 0x88, 0x68, 0x18, 0x6d, 0x93, 0x2f, 0xdc, 0xa6, + 0x34, 0xc2, 0xc3, 0xac, 0xc1, 0xb3, 0x0d, 0xf1, 0xfd, 0xab, 0x2a, 0xd9, 0x86, 0x19, 0x1f, 0x1f, 0xc5, 0xfc, 0x1b, 0x4a, 0x3a, 0xff, 0x94, 0xb7, 0x2f, 0x28, 0xd5, 0x76, 0x72, 0xb7, 0x36, 0x73, + 0x4d, 0xc3, 0xb1, 0x6d, 0xa1, 0x31, 0x5d, 0xbb, 0x4a, 0x0a, 0xf0, 0xb6, 0xde, 0x05, 0xba, 0x89, 0x58, 0x8f, 0x11, 0xb5, 0xaa, 0x18, 0x19, 0x9b, 0x69, 0x33, 0x1b, 0xa8, 0x0d, 0x8c, 0x1c, 0x12, + 0xe7, 0x61, 0x4a, 0xf5, 0x19, 0x2f, 0xb4, 0x03, 0x35, 0xcf, 0x96, 0xfa, 0x71, 0xa1, 0xaf, 0x63, 0xf7, 0x4e, 0x5e, 0xed, 0x4b, 0x4e, 0x27, 0x67, 0x24, 0x2b, 0x8d, 0xc1, 0xdd, 0x08, 0xd7, 0x94, + 0xe9, 0x1d, 0x68, 0x4e, 0xd5, 0x8e, 0x1b, 0x9a, 0x6e, 0xbd, 0x75, 0xf6, 0x68, 0xab, 0x6c, 0xe2, 0x86, 0xaa, 0xc5, 0x0b, 0x60, 0xcc, 0xc2, 0x04, 0x65, 0x4f, 0x35, 0x38, 0x46, 0xfe, 0x3f, 0xcd, + 0x1c, 0x78, 0x71, 0xca, 0x78, 0x6a, 0xb7, 0xdd, 0x14, 0x8c, 0xa0, 0x38, 0x73, 0x74, 0x6e, 0x44, 0xda, 0xbc, 0x0f, 0x0b, 0x53, 0x96, 0x6a, 0xd0, 0x18, 0x72, 0xa5, 0x54, 0x5b, 0x86, 0x4a, 0x9b, + 0x39, 0xdb, 0x6a, 0x0d, 0x72, 0x05, 0xba, 0x82, 0xd3, 0x3c, 0xcc, 0x89, 0xfc, 0xc8, 0x6d, 0xe7, 0xd5, 0xef, 0x1f, 0x2f, 0xae, 0x3f, 0x7d, 0x3a, 0x44, 0xf9, 0x9d, 0x1a, 0x0b, 0x8e, 0x1e, 0xcb, + 0x5c, 0x6c, 0x4c, 0x8b, 0x28, 0x11, 0x25, 0xb2, 0xd5, 0x0d, 0x64, 0x92, 0xf1, 0x8a, 0xc8, 0x25, 0x96, 0x55, 0xc2, 0xd2, 0xd0, 0x85, 0xb8, 0x53, 0x5b, 0x4b, 0x29, 0xa0, 0x28, 0x73, 0x56, 0x3b, + 0x28, 0xe0, 0xe7, 0xfb, 0x4b, 0xbb, 0xba, 0xfb, 0x9a, 0x83, 0x71, 0x7e, 0x7b, 0x76, 0x97, 0x37, 0x97, 0xe7, 0x57, 0xf6, 0x80, 0x8a, 0xbf, 0x26, 0x69, 0x7c, 0x4f, 0xbc, 0xd8, 0x7e, 0x1c, 0xd7, + 0x17, 0xaf, 0x11, 0x62, 0x79, 0x73, 0xf3, 0x22, 0x2c, 0x3c, 0x7d, 0x42, 0x0f, 0x7b, 0x54, 0x06, 0x99, 0xb6, 0x9a, 0x1a, 0x53, 0x30, 0xa8, 0xa9, 0xe3, 0xc2, 0xe8, 0x92, 0xd4, 0x47, 0x14, 0xac, + 0xd6, 0xbc, 0xf7, 0xb1, 0x94, 0x51, 0xd0, 0x7b, 0x4d, 0x9c, 0x99, 0x23, 0x42, 0xf3, 0x58, 0x3e, 0xd7, 0x6e, 0xe8, 0x67, 0xeb, 0xc6, 0x3e, 0x5d, 0x5f, 0xd5, 0xc5, 0xc3, 0x26, 0xf6, 0x08, 0x4b, + 0x76, 0x71, 0xdc, 0xba, 0xfe, 0xe3, 0xf6, 0xf5, 0xe8, 0x60, 0xff, 0x2f, 0xec, 0xef, 0xe4, 0xa7, 0xb6, 0x7a, 0x33, 0x19, 0x05, 0x0e, 0xa8, 0xc2, 0x65, 0x3e, 0x26, 0x2f, 0xd4, 0xde, 0x17, 0x76, + 0x18, 0xda, 0x39, 0x15, 0x9c, 0x6b, 0x8d, 0x96, 0x51, 0x3e, 0x10, 0x75, 0x8b, 0xec, 0xb0, 0x49, 0xa0, 0x99, 0xd3, 0x3c, 0x12, 0xcc, 0x45, 0x3c, 0x95, 0xfc, 0x88, 0xa4, 0x8f, 0x49, 0xd2, 0xfb, + 0xe4, 0xc5, 0xc9, 0xc3, 0x7f, 0xf2, 0xc9, 0x38, 0x59, 0xdb, 0x44, 0x5a, 0x39, 0x72, 0x84, 0x2f, 0x5e, 0xb8, 0xa2, 0x03, 0x75, 0xea, 0xdc, 0x9a, 0xb3, 0x53, 0x65, 0x35, 0x82, 0x59, 0xde, 0x83, + 0x13, 0xaa, 0x6f, 0xee, 0xd9, 0xb3, 0x94, 0x0f, 0x63, 0x95, 0xef, 0x68, 0xf2, 0xfd, 0x2e, 0x07, 0xe9, 0xea, 0xfc, 0x9f, 0x1f, 0xaf, 0xff, 0x3c, 0x5f, 0xaf, 0xe4, 0xaa, 0xd5, 0xd5, 0xef, 0x2f, + 0x99, 0xa8, 0x53, 0xcb, 0x5a, 0x33, 0x33, 0x26, 0x8c, 0x45, 0x85, 0xdc, 0x64, 0xae, 0x0c, 0x9f, 0x56, 0xd0, 0x3b, 0x87, 0x2d, 0x8d, 0x31, 0x5a, 0xe2, 0x32, 0x64, 0x9b, 0x56, 0x6b, 0x6c, 0xfe, + 0xad, 0xb5, 0xd6, 0x09, 0xcc, 0x07, 0x1e, 0xe5, 0x37, 0xeb, 0xfa, 0xe6, 0xf2, 0x69, 0x4e, 0xd4, 0x73, 0x31, 0x4e, 0x9f, 0xb7, 0x64, 0x82, 0x1e, 0x10, 0x25, 0x35, 0xa8, 0x05, 0x66, 0x00, 0x5b, + 0x07, 0xb2, 0xb9, 0xa1, 0x4e, 0x5e, 0xcd, 0x10, 0xc8, 0x04, 0xa7, 0xc8, 0x30, 0x86, 0x21, 0x45, 0x38, 0x97, 0x23, 0x54, 0x36, 0xee, 0xd2, 0x8f, 0x1c, 0x4d, 0xbe, 0x0c, 0xfb, 0x8e, 0xcd, 0xd4, + 0xfd, 0x55, 0x6c, 0xd1, 0xdc, 0x8b, 0xc5, 0x77, 0xd8, 0x05, 0x1e, 0x48, 0xc2, 0xfb, 0x4a, 0x5c, 0xec, 0x53, 0x33, 0xef, 0x7f, 0x79, 0xe6, 0xf2, 0x9f, 0xba, 0xc8, 0x67, 0x0c, 0xc3, 0xd1, 0x81, + 0x1d, 0x0a, 0xcf, 0xe8, 0x03, 0x9e, 0xfa, 0x6c, 0x18, 0x89, 0x18, 0xcd, 0x13, 0xd0, 0xdc, 0xfa, 0xa0, 0x09, 0xe4, 0x98, 0x82, 0x85, 0x88, 0xd8, 0xab, 0x66, 0xcc, 0xde, 0x54, 0xb9, 0x49, 0x4f, + 0xf6, 0x72, 0x01, 0x83, 0x19, 0x6b, 0xaa, 0xb6, 0xca, 0xe0, 0xc3, 0x7a, 0xfa, 0x96, 0xf7, 0xf7, 0xa4, 0x6c, 0xe1, 0x68, 0x2e, 0x60, 0xfe, 0x99, 0x71, 0x7f, 0x77, 0xfd, 0x8c, 0xa9, 0x39, 0x7b, + 0xcc, 0x0c, 0x7e, 0x51, 0x3b, 0xf3, 0xf5, 0xc1, 0x9d, 0xdd, 0x3e, 0x7f, 0xf0, 0x98, 0x51, 0xf8, 0xba, 0x3a, 0xbf, 0x0d, 0xe8, 0xcd, 0xd5, 0x3a, 0x7b, 0xef, 0x30, 0x16, 0x6b, 0xb6, 0xe9, 0xd8, + 0xdd, 0xd3, 0x43, 0x0d, 0xc6, 0x2a, 0x68, 0x3e, 0xa0, 0x5a, 0xa8, 0x48, 0x5a, 0x71, 0x70, 0x41, 0x44, 0x64, 0x61, 0x85, 0xf5, 0x42, 0xe3, 0xf2, 0x5e, 0x87, 0xed, 0xfa, 0x47, 0xa5, 0x45, 0x3f, + 0x12, 0xfe, 0x65, 0xe4, 0xf0, 0x06, 0x92, 0xb3, 0xc7, 0x66, 0x47, 0xae, 0x89, 0x52, 0x5d, 0x01, 0x90, 0x2b, 0xbb, 0x6b, 0x17, 0x58, 0x3c, 0xc3, 0x71, 0xc8, 0x58, 0x3a, 0x01, 0x24, 0xca, 0x5a, + 0x66, 0x45, 0x6e, 0xca, 0xea, 0x1a, 0x52, 0xdb, 0x9e, 0x7b, 0xcc, 0x31, 0xed, 0x5b, 0xcb, 0x9b, 0x0b, 0x12, 0x91, 0x91, 0x39, 0x90, 0x70, 0x0c, 0xc0, 0xee, 0x6b, 0x0c, 0xe7, 0xa5, 0xd5, 0xa5, + 0xc7, 0xcc, 0x3e, 0x92, 0x61, 0x6c, 0xff, 0xaa, 0xb9, 0x62, 0x8e, 0x34, 0x5c, 0xc2, 0x39, 0x49, 0x90, 0x69, 0x48, 0xfe, 0x60, 0x65, 0xec, 0x4f, 0xe1, 0xbf, 0x68, 0xd0, 0xe7, 0x2f, 0xe1, 0xd3, + 0xc9, 0x15, 0xc1, 0x55, 0xa5, 0x5b, 0x5c, 0x97, 0x0a, 0xb9, 0x58, 0x6b, 0x64, 0x43, 0xc2, 0xc6, 0x51, 0xab, 0x99, 0x01, 0x8e, 0x19, 0xab, 0xb3, 0x65, 0x67, 0x6a, 0x36, 0x3b, 0x92, 0x67, 0x93, + 0x16, 0xcb, 0x07, 0xcf, 0x29, 0xfc, 0x83, 0x19, 0xdd, 0x85, 0x7f, 0x6f, 0x2f, 0xc5, 0x98, 0x61, 0x9d, 0xbb, 0x4d, 0x6e, 0x02, 0x2e, 0x24, 0xbd, 0x30, 0x94, 0x7a, 0xdf, 0x30, 0x01, 0xfa, 0xc2, + 0xb6, 0x8a, 0xaa, 0x66, 0xaf, 0x86, 0xcb, 0x26, 0xe1, 0x74, 0xe2, 0x88, 0x20, 0x5f, 0x92, 0xa9, 0x6f, 0x91, 0x04, 0xf3, 0x6c, 0xf9, 0xbe, 0xb9, 0x02, 0x8a, 0xc9, 0x93, 0x2b, 0x11, 0x0c, 0xc8, + 0xa7, 0x0e, 0x30, 0x99, 0x56, 0xc6, 0x73, 0x74, 0x6f, 0x25, 0x99, 0x2d, 0xc1, 0xca, 0x1c, 0x43, 0x8a, 0x3b, 0xdb, 0x88, 0xa2, 0x96, 0xe8, 0x88, 0xa4, 0x2e, 0xc7, 0x08, 0xe2, 0x67, 0x06, 0xfc, + 0xe6, 0x42, 0xa8, 0x2c, 0x5a, 0x40, 0xe8, 0x29, 0xd1, 0x52, 0xcc, 0xa0, 0xd3, 0x86, 0x7e, 0x42, 0x5b, 0x37, 0x65, 0xeb, 0x73, 0xaa, 0x51, 0x97, 0x68, 0x2b, 0xb0, 0x86, 0x18, 0xab, 0x4a, 0xcf, + 0x2e, 0xa0, 0xd1, 0x5d, 0xfa, 0x0f, 0x84, 0xd8, 0x2d, 0xba, 0x37, 0x17, 0x02, 0xc5, 0x1b, 0x24, 0x37, 0x57, 0xc5, 0xd5, 0x39, 0x4a, 0x42, 0x96, 0x22, 0x04, 0x2c, 0x30, 0x5f, 0x4d, 0x58, 0xad, + 0x41, 0x13, 0x03, 0xcc, 0x30, 0x83, 0x80, 0x21, 0xa8, 0x44, 0x13, 0x4d, 0x66, 0xa7, 0xc3, 0x38, 0xf5, 0x6f, 0xed, 0xb9, 0x7b, 0xdb, 0xeb, 0xc3, 0x12, 0xfc, 0xb9, 0x0d, 0xf7, 0x47, 0xd5, 0xab, + 0xdb, 0xc3, 0xef, 0x65, 0x07, 0xb7, 0x17, 0xf6, 0x4a, 0x36, 0xc0, 0x73, 0x1e, 0x70, 0x0f, 0x83, 0xf1, 0xc9, 0x31, 0xf3, 0xe8, 0xc2, 0x9b, 0x17, 0x80, 0x5a, 0x8a, 0xa8, 0xb8, 0x74, 0x20, 0xd8, + 0xb2, 0x42, 0x65, 0x5b, 0x13, 0x02, 0xc7, 0x40, 0x55, 0x05, 0x5a, 0x33, 0x60, 0x0c, 0x6c, 0x6b, 0xf3, 0x60, 0xa6, 0x55, 0x32, 0x73, 0x1e, 0x0e, 0x04, 0xbf, 0x33, 0x97, 0x3f, 0x7d, 0x94, 0xf0, + 0x3d, 0x0d, 0x79, 0x9f, 0xc7, 0x84, 0x53, 0xe3, 0x6b, 0x4f, 0x06, 0x12, 0x47, 0x83, 0xbe, 0x16, 0xc1, 0x24, 0x69, 0x9e, 0x10, 0x4d, 0xd7, 0x9c, 0x44, 0x1d, 0x34, 0xa2, 0x9a, 0xe7, 0x28, 0x10, + 0x2f, 0x41, 0x23, 0xcf, 0xe4, 0x6a, 0x3b, 0x5e, 0xb7, 0xf8, 0x48, 0xad, 0xd8, 0x93, 0x8c, 0xea, 0xef, 0x21, 0xaf, 0xdd, 0x9e, 0xbf, 0x6b, 0x1f, 0x00, 0x3e, 0xb4, 0xff, 0xdc, 0x3e, 0x9f, 0xdd, + 0x5e, 0xd9, 0x97, 0xdb, 0xcf, 0xd7, 0x77, 0x67, 0x5f, 0x6e, 0xf2, 0xf7, 0xf3, 0xfc, 0x03, 0x8e, 0xeb, 0xe3, 0x33, 0xbe, 0xe4, 0x00, 0x4e, 0xcd, 0xe8, 0x2e, 0xea, 0x1a, 0x6a, 0x39, 0xc7, 0x48, + 0x5d, 0x08, 0x03, 0x4b, 0x97, 0x0e, 0x85, 0xd5, 0x7c, 0x0a, 0x4d, 0x41, 0xc6, 0xe6, 0x4d, 0x74, 0x78, 0x9b, 0x53, 0x23, 0x75, 0xa5, 0x62, 0x6b, 0x60, 0x69, 0xae, 0xe3, 0x08, 0x61, 0xf7, 0xbd, + 0xea, 0xfb, 0xea, 0xf7, 0xd7, 0x57, 0xdc, 0x8b, 0x05, 0x75, 0xa0, 0x04, 0x66, 0x1b, 0xf5, 0xa5, 0x7d, 0x79, 0xba, 0x70, 0x7e, 0xaa, 0x38, 0xf7, 0x98, 0x5a, 0xed, 0xf6, 0xb3, 0xdf, 0x5c, 0xff, + 0xf1, 0x22, 0xba, 0x39, 0x7d, 0x9e, 0xe2, 0xb0, 0x99, 0xa9, 0x2d, 0x98, 0xcc, 0x8a, 0x41, 0x63, 0x02, 0xd3, 0x14, 0xe1, 0x6e, 0xad, 0x6c, 0x74, 0x14, 0xe4, 0xd1, 0xc0, 0x91, 0xd3, 0x5d, 0x2d, + 0x75, 0x54, 0x0e, 0x54, 0x1c, 0x63, 0x5a, 0x8c, 0x31, 0x8e, 0xb8, 0xe5, 0xcf, 0x79, 0x73, 0x79, 0x7e, 0x77, 0x66, 0x7e, 0xfe, 0x62, 0xa5, 0x9c, 0x9a, 0x3b, 0xc8, 0xec, 0x80, 0xc2, 0xad, 0x92, + 0xba, 0x85, 0x97, 0xb3, 0xbb, 0xea, 0x5c, 0x2e, 0xd5, 0xd6, 0x68, 0xda, 0x38, 0x30, 0x2c, 0xca, 0x30, 0x69, 0xba, 0x34, 0xc8, 0xa2, 0xa4, 0x62, 0x5d, 0x60, 0xc9, 0x71, 0x78, 0xa1, 0xbc, 0x4e, + 0x8b, 0x1c, 0x95, 0xee, 0xf4, 0x14, 0x58, 0xe5, 0x62, 0x1e, 0xa3, 0x05, 0x8b, 0x28, 0x49, 0xd6, 0xb4, 0x1e, 0xdd, 0x7b, 0x59, 0x64, 0x79, 0xcf, 0xd5, 0x74, 0x74, 0x51, 0x59, 0x2d, 0x1a, 0x2e, + 0x01, 0x5c, 0x0e, 0x9c, 0x7d, 0x97, 0x3f, 0xc7, 0x38, 0xe4, 0xd8, 0xfc, 0x7c, 0x3d, 0x4b, 0x7f, 0xeb, 0xf1, 0x53, 0x28, 0x41, 0x50, 0x42, 0xeb, 0x8d, 0x23, 0x46, 0x2e, 0xea, 0x51, 0x89, 0x05, + 0xcb, 0x39, 0x26, 0x2a, 0x07, 0x2d, 0xea, 0x65, 0x3c, 0x24, 0xc9, 0x09, 0x56, 0xb1, 0x54, 0x93, 0xb1, 0xcd, 0xd2, 0x90, 0x57, 0x67, 0xe7, 0xdd, 0xaf, 0x97, 0x76, 0x17, 0x9f, 0x3f, 0x46, 0x3d, + 0x84, 0xe7, 0x3f, 0x4a, 0xc2, 0xf8, 0xbc, 0xdf, 0x5e, 0xe1, 0x2d, 0x0e, 0xa0, 0x36, 0xd0, 0x59, 0x15, 0x73, 0x5a, 0xb9, 0x10, 0x63, 0xb7, 0xaa, 0xe9, 0xad, 0x0f, 0x92, 0x6a, 0x38, 0xe7, 0xae, + 0xc8, 0xab, 0x9b, 0x00, 0x0f, 0x03, 0x76, 0xcd, 0x58, 0xdd, 0x5c, 0xd4, 0x6a, 0x32, 0xf3, 0x4f, 0xbb, 0xab, 0xc7, 0xaa, 0xbb, 0x57, 0x24, 0xdd, 0x35, 0x2c, 0x78, 0xce, 0x02, 0x9d, 0xbe, 0xa8, + 0x7b, 0x8d, 0xa9, 0x45, 0x93, 0xdd, 0x96, 0x98, 0xb6, 0xbe, 0x7a, 0x31, 0x34, 0x56, 0xc1, 0x04, 0x10, 0xd3, 0x2e, 0x34, 0x93, 0x75, 0x5b, 0x88, 0xb3, 0x41, 0xe6, 0x6a, 0xdd, 0x86, 0x6c, 0xb1, + 0x46, 0x38, 0xcc, 0x76, 0x2c, 0xc2, 0xf8, 0xfc, 0xb5, 0xc7, 0xc2, 0x0b, 0xe6, 0xf1, 0xc4, 0xe3, 0x0f, 0x36, 0x48, 0x92, 0x18, 0x08, 0xcb, 0xb3, 0x71, 0x57, 0x2e, 0x69, 0x38, 0xb6, 0xc9, 0x99, + 0xa5, 0x8c, 0xc5, 0xe5, 0x14, 0x73, 0x2c, 0x6e, 0xcc, 0xb3, 0x00, 0x3c, 0x6c, 0xc1, 0x58, 0xe2, 0xa0, 0x8c, 0xc7, 0xc8, 0xb8, 0xef, 0x8c, 0xfb, 0x53, 0x01, 0xf0, 0x0d, 0xd2, 0xe4, 0xa7, 0x91, + 0x75, 0x2f, 0x87, 0xd9, 0x27, 0x41, 0xa6, 0xd3, 0x0e, 0x34, 0xe8, 0x16, 0xf0, 0x0a, 0x2c, 0xcb, 0x18, 0xbc, 0x4b, 0x88, 0x9f, 0xac, 0x8b, 0x98, 0x26, 0x4b, 0x03, 0x25, 0x35, 0x75, 0xb7, 0x9e, + 0xc7, 0x26, 0x60, 0x2f, 0x4f, 0x6a, 0x9f, 0x64, 0xeb, 0xa7, 0x06, 0x78, 0x58, 0xb6, 0xba, 0x0f, 0xec, 0x83, 0x71, 0xa1, 0xd3, 0xd8, 0xc2, 0x3a, 0xd9, 0x5c, 0x00, 0x2c, 0x99, 0x5d, 0x05, 0x7b, + 0x2d, 0xad, 0x66, 0x24, 0xb0, 0xad, 0x9f, 0xa0, 0x96, 0x0d, 0xac, 0x59, 0xe2, 0x5a, 0x02, 0x87, 0x81, 0xf5, 0xf1, 0xba, 0x94, 0xf7, 0xbf, 0x1c, 0x4e, 0x0b, 0x79, 0xff, 0x22, 0x45, 0xec, 0xec, + 0xb3, 0x9d, 0xff, 0xf6, 0x90, 0x46, 0xf4, 0x24, 0x51, 0xec, 0x50, 0xfe, 0xd7, 0xba, 0xfe, 0xe3, 0x95, 0x33, 0x83, 0x83, 0x7f, 0xf5, 0xad, 0x0f, 0x0e, 0x8a, 0x60, 0xa0, 0xda, 0xa6, 0xc9, 0x5d, + 0x76, 0x2c, 0x66, 0x9f, 0xcd, 0xad, 0xcb, 0xea, 0x0b, 0x57, 0x1b, 0xbd, 0x7a, 0x1f, 0xbd, 0x0d, 0x98, 0xd8, 0x27, 0x29, 0xd3, 0x06, 0x26, 0x91, 0x9a, 0xf0, 0xec, 0x28, 0xf3, 0x95, 0x83, 0x83, + 0x63, 0x52, 0xae, 0xab, 0xfd, 0x2a, 0xa6, 0xd3, 0xe7, 0x4b, 0xe9, 0x16, 0xf1, 0x8b, 0x37, 0xf5, 0xf2, 0x80, 0x36, 0xc6, 0xc0, 0x35, 0x46, 0xae, 0x91, 0xa4, 0x8b, 0xa6, 0x90, 0xac, 0x08, 0x94, + 0x96, 0xd0, 0x93, 0x5a, 0x70, 0x4f, 0x71, 0x6b, 0x63, 0x0a, 0x34, 0x9f, 0xa0, 0x71, 0x50, 0xaa, 0xfb, 0xab, 0xf3, 0xb8, 0x5e, 0x79, 0xe6, 0xe7, 0xeb, 0xa1, 0xb1, 0xcc, 0xd7, 0x07, 0x57, 0xd7, + 0x37, 0x97, 0x76, 0x71, 0xfe, 0xcf, 0x9d, 0x91, 0xbc, 0x22, 0xf9, 0x57, 0x08, 0xf8, 0xdc, 0x63, 0xcd, 0x93, 0x03, 0x36, 0x5f, 0x4d, 0x5b, 0xd2, 0x16, 0x03, 0x90, 0x4e, 0xc9, 0xd1, 0x60, 0x61, + 0x9b, 0xb6, 0x88, 0x66, 0x8e, 0xd9, 0xa7, 0xa4, 0x73, 0x8c, 0xc5, 0xd4, 0x16, 0x8c, 0x5c, 0x29, 0x06, 0x11, 0xb9, 0x46, 0x59, 0xf9, 0x3a, 0xd2, 0x51, 0xe4, 0x6b, 0x51, 0xcf, 0x0e, 0xd5, 0x7e, + 0x03, 0x9f, 0xc7, 0x85, 0xbd, 0x3e, 0xbb, 0x38, 0xaf, 0xdc, 0xcc, 0x79, 0x3f, 0xa5, 0x7a, 0x0b, 0x24, 0x4e, 0x2c, 0x71, 0x5a, 0xaa, 0x4f, 0xcb, 0x9c, 0x32, 0x1a, 0xc9, 0xea, 0xbc, 0x22, 0x9b, + 0x44, 0xba, 0x65, 0xad, 0x09, 0x33, 0x99, 0x15, 0x53, 0x3b, 0xe1, 0x94, 0x65, 0x11, 0x4b, 0x16, 0x31, 0x27, 0x25, 0xae, 0x6a, 0x71, 0x78, 0x47, 0xfd, 0x0e, 0xe1, 0xde, 0x3d, 0xc0, 0x9e, 0xf7, + 0x7f, 0xfb, 0x18, 0xf0, 0xe9, 0x41, 0xea, 0xbe, 0xcd, 0x9f, 0xda, 0x3f, 0xda, 0x8a, 0x9a, 0x24, 0xb0, 0x79, 0xef, 0x18, 0x80, 0x73, 0xad, 0x52, 0x4c, 0x5c, 0x5d, 0x88, 0x56, 0x0d, 0x54, 0x37, + 0xe9, 0x1d, 0x3a, 0x43, 0xc8, 0x1a, 0xd1, 0x67, 0xc7, 0x66, 0xa4, 0xc0, 0xda, 0x3d, 0x8f, 0x64, 0x2f, 0x1f, 0xd4, 0xc1, 0xb3, 0xb9, 0x7d, 0xff, 0x98, 0xcf, 0x71, 0xfe, 0xe7, 0xdf, 0x50, 0xcb, + 0x86, 0x4c, 0xf6, 0x8d, 0xe2, 0xd4, 0xa0, 0x9f, 0x3b, 0xd9, 0x9a, 0xd5, 0x07, 0x1a, 0xf3, 0xb6, 0xf7, 0x65, 0xaf, 0xb6, 0xda, 0x18, 0xde, 0x30, 0xb2, 0x71, 0x54, 0x8e, 0xd5, 0xc1, 0x46, 0x5a, + 0x35, 0xd5, 0x02, 0xb4, 0x90, 0x45, 0x39, 0x19, 0x84, 0xc3, 0x8e, 0xc1, 0xe2, 0xef, 0xf9, 0xdc, 0x2f, 0x5c, 0xf3, 0xa9, 0x25, 0x98, 0x24, 0x51, 0x0b, 0x01, 0xad, 0x41, 0xef, 0xb3, 0x91, 0x87, + 0x47, 0x93, 0x96, 0x04, 0x52, 0x2e, 0x11, 0x1a, 0x5e, 0x98, 0x30, 0x9b, 0x12, 0x4e, 0x9a, 0x90, 0x6e, 0x2b, 0xa0, 0xb2, 0x45, 0xaa, 0x1e, 0xb1, 0xea, 0xd7, 0xc3, 0x96, 0xc7, 0x0d, 0x6c, 0x1f, + 0xf2, 0xcb, 0xa9, 0x5d, 0x14, 0x16, 0xa9, 0xb1, 0xf5, 0x89, 0x83, 0x00, 0x2c, 0x7a, 0x83, 0x95, 0x29, 0xc3, 0x29, 0x54, 0x80, 0x0c, 0x1a, 0xe9, 0x6a, 0xb9, 0x9c, 0x5a, 0x8c, 0xec, 0x8c, 0xea, + 0x6b, 0x10, 0xae, 0xde, 0x17, 0xb8, 0xce, 0xc3, 0xfc, 0xfb, 0xde, 0x96, 0x7b, 0x44, 0xc4, 0x8b, 0x67, 0x3d, 0x28, 0x5e, 0xf0, 0x81, 0x27, 0x16, 0x74, 0x31, 0x71, 0x9f, 0xc2, 0xee, 0xc0, 0xc8, + 0x83, 0x75, 0xaa, 0x83, 0x40, 0xb1, 0x92, 0xf5, 0x46, 0xc6, 0xbb, 0xbc, 0x2b, 0x05, 0x9e, 0x6b, 0x8d, 0x50, 0x46, 0xd5, 0x31, 0x42, 0x12, 0x88, 0x74, 0xd2, 0xd1, 0xe0, 0x79, 0x37, 0x8b, 0x2f, + 0x08, 0x26, 0x3e, 0xb5, 0x05, 0xd6, 0x44, 0x4f, 0x9e, 0x44, 0x01, 0x54, 0x8b, 0xe7, 0x18, 0x82, 0x36, 0xb3, 0xa1, 0x51, 0xeb, 0xbd, 0x86, 0x8d, 0x35, 0xa3, 0xd1, 0x8c, 0x24, 0x5a, 0x3e, 0x95, + 0x9a, 0xd4, 0xea, 0x26, 0x61, 0xa6, 0x85, 0xd3, 0x8f, 0x8e, 0xfe, 0xea, 0xfe, 0xcf, 0xb3, 0x1b, 0xfb, 0xe3, 0xa0, 0xb1, 0x9d, 0x9a, 0x91, 0xcd, 0xea, 0x34, 0x19, 0xd3, 0xd5, 0x4b, 0xab, 0x98, + 0x4c, 0x40, 0x9d, 0x12, 0x03, 0x82, 0xad, 0x67, 0x54, 0x9f, 0xcc, 0xa6, 0x01, 0x1e, 0x80, 0x4b, 0x33, 0x69, 0xba, 0x3b, 0xf4, 0xec, 0x01, 0x1d, 0xe6, 0x31, 0x21, 0x9e, 0x35, 0x6f, 0xdb, 0x77, + 0x06, 0xa7, 0x5e, 0x30, 0x5a, 0xd4, 0x28, 0xa3, 0xe5, 0xe4, 0x90, 0xe8, 0xcc, 0xac, 0x35, 0xb8, 0xc8, 0x5b, 0x96, 0x5a, 0xa9, 0xcc, 0xd1, 0x87, 0xcd, 0xe0, 0xac, 0x2e, 0x59, 0x68, 0x73, 0xc8, + 0xa2, 0x15, 0x8b, 0x83, 0x2a, 0xe6, 0x61, 0x44, 0xf3, 0x2f, 0x10, 0x5a, 0xcf, 0x9b, 0xfc, 0x1c, 0x5b, 0x62, 0x4f, 0x5e, 0x7a, 0x6b, 0xc5, 0x24, 0x71, 0xa9, 0xa4, 0x93, 0x00, 0x4c, 0x6e, 0xd9, + 0x52, 0x57, 0x27, 0x9b, 0x66, 0xc6, 0x29, 0x46, 0xd0, 0xa1, 0x64, 0x76, 0x06, 0xc3, 0x81, 0xb5, 0xda, 0xb2, 0xd5, 0xbb, 0x02, 0x63, 0x8b, 0x4e, 0x55, 0xc7, 0xc2, 0xb3, 0x8b, 0xeb, 0xf8, 0xed, + 0xa3, 0x7d, 0xd9, 0x67, 0x6f, 0xf8, 0xf4, 0x2c, 0x6e, 0x40, 0xc4, 0x54, 0xd8, 0x30, 0xb8, 0x83, 0x3b, 0x22, 0x16, 0x11, 0xa5, 0xd8, 0xc4, 0x5a, 0x84, 0xa5, 0x6b, 0x18, 0x8c, 0xb5, 0xa2, 0x1b, + 0xc1, 0x04, 0x03, 0xb0, 0xe2, 0xbe, 0xc2, 0x8b, 0x57, 0x2c, 0x38, 0xd2, 0x92, 0xe8, 0x09, 0x5a, 0xbb, 0x8d, 0xeb, 0x2f, 0xf9, 0xe9, 0xde, 0x6e, 0x5e, 0x69, 0xf1, 0x77, 0x71, 0xfd, 0xe9, 0xa5, + 0xa4, 0xa7, 0x5e, 0x88, 0x1d, 0x46, 0x96, 0x4a, 0x61, 0x0d, 0x25, 0xe9, 0x13, 0x64, 0x73, 0x8a, 0x83, 0x39, 0x40, 0xd6, 0xa8, 0xac, 0x35, 0x7a, 0xa3, 0xe9, 0xd1, 0x65, 0xce, 0xd6, 0x1b, 0x42, + 0x33, 0x55, 0x1d, 0x99, 0x10, 0x0b, 0xd6, 0xb1, 0x43, 0xaa, 0xef, 0x0c, 0xcf, 0xbe, 0xad, 0x9d, 0x7a, 0xaa, 0xaa, 0x3c, 0x73, 0x08, 0x71, 0xb6, 0xc5, 0x7d, 0x61, 0x1f, 0x16, 0xce, 0x3c, 0x52, + 0xd3, 0xcc, 0xa9, 0x22, 0xd5, 0x9a, 0xb1, 0x28, 0xcd, 0xbe, 0x78, 0xcd, 0x42, 0x1c, 0x49, 0x01, 0xd5, 0xa0, 0x1c, 0x8f, 0x46, 0xd2, 0x8f, 0xa7, 0x2e, 0xcf, 0x79, 0x80, 0x7e, 0xf2, 0xd1, 0xe3, + 0xaa, 0xca, 0x8e, 0x19, 0x85, 0xaa, 0x8a, 0x29, 0x0d, 0x66, 0xeb, 0xae, 0x1d, 0x31, 0x9c, 0xb3, 0x74, 0xb6, 0x85, 0x11, 0xd8, 0x88, 0xc7, 0x70, 0x5f, 0x2d, 0xb1, 0x72, 0xf4, 0x0a, 0x57, 0xee, + 0x22, 0xc7, 0xea, 0xbf, 0x2e, 0xf7, 0x39, 0x8c, 0x1d, 0x50, 0x3c, 0x35, 0xba, 0x95, 0xa1, 0xea, 0xde, 0x81, 0xdb, 0x80, 0x4c, 0x34, 0xad, 0xea, 0x59, 0x73, 0x25, 0xe1, 0x80, 0x02, 0x36, 0x5e, + 0x8b, 0x3d, 0xd2, 0x82, 0xa3, 0x6d, 0x1b, 0x67, 0x53, 0x36, 0xf1, 0xbe, 0x6a, 0x18, 0xd0, 0x3c, 0x56, 0x2d, 0xf1, 0x34, 0xe5, 0xeb, 0xb9, 0x0c, 0x7a, 0x72, 0x9e, 0x33, 0x75, 0x40, 0xcb, 0xe6, + 0xd9, 0xbb, 0x33, 0x0e, 0x5b, 0xc6, 0xd0, 0x18, 0x82, 0xa1, 0x08, 0x63, 0x16, 0x18, 0xe3, 0x00, 0x9d, 0x0d, 0x9c, 0x23, 0x8a, 0x7b, 0x19, 0xad, 0x87, 0x12, 0xdf, 0xd4, 0x63, 0x2c, 0xf4, 0x43, + 0xdb, 0xa5, 0xa3, 0xeb, 0xfa, 0xf2, 0x45, 0x0e, 0xc1, 0x38, 0xf9, 0xfe, 0x3a, 0x51, 0x4d, 0xa5, 0xc7, 0xa2, 0x0a, 0x14, 0x6c, 0x92, 0x22, 0x8e, 0x53, 0x58, 0x7a, 0xd9, 0x5c, 0x94, 0xdd, 0xbc, + 0x35, 0x4a, 0xe9, 0x10, 0xe0, 0xb4, 0x43, 0xb0, 0x3a, 0xbb, 0xac, 0x29, 0x0e, 0x73, 0xbd, 0x0a, 0x53, 0xbf, 0x27, 0x56, 0xfd, 0xd4, 0x19, 0xd4, 0x4f, 0xc6, 0x1f, 0x4f, 0x8a, 0xf8, 0x5e, 0x60, + 0xa8, 0x53, 0xf7, 0x1f, 0xe9, 0xba, 0x45, 0xd8, 0xc4, 0x51, 0x0d, 0x6b, 0x4c, 0x64, 0xf3, 0xb9, 0x6d, 0xde, 0xbd, 0x05, 0x8e, 0xa6, 0xdd, 0x79, 0xd3, 0x90, 0xa3, 0xcc, 0xa9, 0x48, 0xdc, 0x53, + 0xb3, 0x91, 0xa2, 0xd3, 0x08, 0x89, 0x15, 0x87, 0xcb, 0x48, 0xbe, 0xbb, 0xf7, 0xe3, 0x12, 0x3e, 0x34, 0x66, 0x7c, 0x1e, 0x65, 0xc1, 0xe9, 0xbd, 0x4a, 0x2b, 0x8b, 0x99, 0xb8, 0x0c, 0xc8, 0x7b, + 0x3a, 0xb3, 0x9a, 0x44, 0xd2, 0xa2, 0x89, 0x85, 0x64, 0x38, 0xd7, 0x90, 0xc9, 0x5e, 0xa5, 0x03, 0xbc, 0x1a, 0x19, 0x48, 0xac, 0x69, 0x31, 0x64, 0x6a, 0x9f, 0x74, 0xb8, 0x9a, 0xe2, 0x59, 0xd8, + 0x89, 0x8f, 0xfd, 0xeb, 0x5e, 0x8f, 0x5c, 0xbe, 0x37, 0x7c, 0xda, 0x13, 0xf9, 0x0d, 0x18, 0xed, 0x35, 0xbc, 0xaf, 0x85, 0x96, 0x3d, 0x97, 0x02, 0x0b, 0x46, 0xe7, 0x86, 0x7d, 0x78, 0xae, 0xf0, + 0x0e, 0x53, 0x3a, 0x20, 0xd9, 0xd2, 0xd4, 0x6d, 0x1d, 0xfb, 0xb4, 0x11, 0x56, 0x66, 0x6c, 0x42, 0x5d, 0x8f, 0x3a, 0xd2, 0x2f, 0x76, 0xf3, 0xdb, 0xf9, 0xd5, 0xa7, 0x8f, 0x17, 0xd7, 0x2f, 0x6a, + 0x1c, 0xf0, 0xe4, 0xce, 0x88, 0x94, 0xd1, 0x31, 0xa0, 0x91, 0xcf, 0x6a, 0xe2, 0x31, 0xab, 0xaa, 0x19, 0x6d, 0x00, 0x79, 0x02, 0x4e, 0xea, 0xa3, 0x83, 0x67, 0xca, 0x22, 0x29, 0x8a, 0x86, 0x1e, + 0xa1, 0xbd, 0xef, 0xb2, 0xad, 0x11, 0xc7, 0x61, 0xb6, 0xe0, 0x1b, 0x68, 0x7a, 0xff, 0xcb, 0x33, 0x71, 0x3e, 0x3e, 0x02, 0xcc, 0x23, 0x53, 0xf7, 0xe2, 0xcd, 0xe7, 0xd2, 0xcf, 0xd3, 0x7b, 0x2c, + 0xaa, 0xd6, 0x62, 0x48, 0xaf, 0xd4, 0x30, 0x2f, 0xe9, 0xad, 0x0d, 0xb0, 0xaa, 0x8c, 0x45, 0x43, 0xa1, 0x69, 0x2b, 0x14, 0x15, 0x4d, 0x75, 0x6c, 0xda, 0x8c, 0xaa, 0x2c, 0x81, 0x43, 0x3a, 0x6f, + 0x16, 0xfe, 0xd3, 0x07, 0xe7, 0x37, 0xb9, 0xae, 0xff, 0xfc, 0x78, 0xfb, 0xd7, 0x6d, 0xd8, 0x63, 0x27, 0xb2, 0x67, 0x3d, 0x08, 0xbf, 0x3a, 0xab, 0x3b, 0xbb, 0xf9, 0x94, 0x77, 0xaf, 0x38, 0xac, + 0x87, 0x7e, 0xa2, 0x2f, 0x68, 0xb4, 0x53, 0x07, 0xab, 0xb3, 0x94, 0x25, 0xb8, 0x49, 0xb7, 0x51, 0x46, 0x95, 0x48, 0x53, 0x79, 0xad, 0x81, 0x05, 0x9d, 0x09, 0x22, 0xc6, 0xe2, 0xa6, 0x3a, 0x07, + 0x42, 0x6b, 0xc0, 0x8d, 0x17, 0xb4, 0x85, 0xa9, 0x33, 0x4c, 0x97, 0x1e, 0x8b, 0x94, 0x5e, 0xa4, 0xec, 0x3e, 0x47, 0x3a, 0xa7, 0x6f, 0x50, 0x30, 0x1d, 0x8d, 0x75, 0x28, 0x4e, 0xc9, 0x39, 0xc7, + 0x14, 0x00, 0x9a, 0x1c, 0x44, 0x05, 0x93, 0x6a, 0x9b, 0xd8, 0xc6, 0x56, 0x20, 0x43, 0x52, 0x9b, 0x8f, 0x1a, 0x8d, 0xc8, 0xbc, 0xbb, 0x4d, 0xa3, 0x6e, 0xf3, 0x18, 0x4e, 0x7b, 0x91, 0x12, 0xf3, + 0xd6, 0x07, 0x85, 0xb9, 0xeb, 0xf9, 0x48, 0x16, 0x58, 0x00, 0x4a, 0x6d, 0xf4, 0x45, 0x73, 0x74, 0x82, 0xd0, 0xd6, 0xb5, 0x4b, 0x4c, 0x36, 0x8e, 0x2e, 0x83, 0x49, 0xc7, 0x06, 0x75, 0xba, 0x49, + 0x0b, 0xb0, 0x66, 0x65, 0x01, 0x70, 0x8c, 0xc2, 0xfa, 0x9e, 0xc5, 0xf3, 0xd6, 0x80, 0x79, 0xf8, 0xd0, 0xb6, 0xc6, 0x16, 0x46, 0xfb, 0x86, 0xfb, 0x7d, 0x52, 0x0e, 0x36, 0x20, 0x60, 0x01, 0x1a, + 0xd5, 0xfa, 0x6a, 0x98, 0x0b, 0x20, 0x36, 0x5f, 0xd9, 0xb9, 0xc6, 0x40, 0x31, 0xb3, 0xd2, 0x0d, 0x0f, 0x8d, 0xa3, 0x13, 0xf1, 0xdb, 0xa7, 0xb3, 0xb8, 0xbe, 0xaa, 0xf3, 0x7d, 0xc8, 0x4f, 0x1f, + 0xf0, 0xd4, 0xc0, 0x13, 0xa5, 0x29, 0x0e, 0x69, 0x6e, 0x13, 0x39, 0xbc, 0x6c, 0x8e, 0x34, 0x9a, 0x31, 0x02, 0xa6, 0xf3, 0x5a, 0x62, 0x6c, 0xd8, 0x19, 0x69, 0xf9, 0x2a, 0x84, 0x19, 0x90, 0x61, + 0x13, 0xcc, 0x5a, 0x94, 0x1c, 0x4f, 0x90, 0xfc, 0xf2, 0xe5, 0xf7, 0x9d, 0x0d, 0x0d, 0x79, 0x09, 0x41, 0x4e, 0x2d, 0x42, 0x77, 0x6e, 0x56, 0xa3, 0x75, 0x27, 0x40, 0xa8, 0x34, 0x1f, 0x46, 0x81, + 0xb3, 0x1a, 0xaf, 0x61, 0x0b, 0x05, 0xcb, 0x46, 0xb6, 0x2e, 0x30, 0x06, 0xa5, 0x4a, 0xa7, 0x6c, 0xc8, 0x96, 0xcc, 0x3a, 0x53, 0x8e, 0xc6, 0x5d, 0x4f, 0xf3, 0x23, 0x5f, 0x90, 0xb9, 0xa7, 0xb6, + 0xa4, 0x95, 0x81, 0xde, 0x86, 0xb8, 0xda, 0x10, 0x8c, 0xe2, 0x95, 0xd8, 0xa0, 0x4d, 0x41, 0xe0, 0xb2, 0xa1, 0x8d, 0x98, 0xa3, 0x26, 0xa2, 0xa3, 0x53, 0x0b, 0x10, 0x75, 0x5b, 0x4e, 0x56, 0x04, + 0xb3, 0x73, 0x3b, 0x1c, 0x25, 0x7f, 0x3d, 0xc0, 0x39, 0x5f, 0x79, 0x75, 0x77, 0xdc, 0xfb, 0x3e, 0x24, 0x7e, 0xee, 0x8b, 0x78, 0xf2, 0xcc, 0x41, 0xf0, 0x69, 0x3e, 0x43, 0xd3, 0x56, 0xad, 0xb1, + 0x0a, 0x66, 0x6b, 0x52, 0x10, 0x5b, 0x60, 0x60, 0xb9, 0x80, 0x3a, 0xb7, 0x5c, 0x3d, 0x3c, 0x1a, 0x6b, 0x83, 0x96, 0x91, 0x7d, 0xa0, 0x24, 0xb4, 0x81, 0x9d, 0xc7, 0xe1, 0x6a, 0xea, 0xe7, 0x49, + 0xac, 0x47, 0x04, 0xdc, 0x5d, 0x21, 0xb0, 0x1f, 0x26, 0x9c, 0x1a, 0x08, 0x13, 0x5b, 0x8d, 0x05, 0xd6, 0x12, 0xfb, 0x44, 0xf6, 0xe8, 0xae, 0xc1, 0x14, 0x4d, 0x67, 0x4c, 0x46, 0xa2, 0xb9, 0x46, + 0x35, 0x1b, 0xde, 0x35, 0x68, 0x36, 0x9e, 0x9e, 0xd5, 0x07, 0x38, 0x0b, 0xa1, 0x72, 0x3b, 0x5c, 0x98, 0xf7, 0x7d, 0xa7, 0xb5, 0xab, 0xf5, 0x31, 0x3e, 0x5b, 0x7c, 0xb6, 0x27, 0xdf, 0x5f, 0x85, + 0x1d, 0x4f, 0x7f, 0xe5, 0x45, 0xfc, 0x7a, 0x62, 0xe1, 0x53, 0x02, 0x9a, 0x09, 0x59, 0x2b, 0x23, 0xc4, 0xbe, 0xa3, 0x55, 0x17, 0x42, 0xaa, 0xb6, 0xb9, 0x78, 0xb1, 0x6f, 0xca, 0x41, 0x82, 0xc0, + 0xe5, 0x91, 0x90, 0x66, 0x03, 0x18, 0x7c, 0x3a, 0xa0, 0xae, 0x63, 0x73, 0xfb, 0xdd, 0x87, 0xfc, 0x2d, 0x91, 0x5f, 0x42, 0x2c, 0x39, 0x7d, 0x77, 0x83, 0x68, 0x9e, 0xac, 0xb3, 0x27, 0x96, 0x18, + 0x8e, 0x26, 0xd3, 0xb7, 0x67, 0xbd, 0x8a, 0x12, 0x2d, 0xa6, 0x5b, 0xc5, 0x9c, 0x29, 0x36, 0x4d, 0x57, 0x50, 0x67, 0x9d, 0x53, 0xa2, 0xc7, 0x00, 0x99, 0x88, 0x87, 0xf9, 0xca, 0xa7, 0x2d, 0x5e, + 0x8f, 0x49, 0xf8, 0x0c, 0x71, 0xed, 0x4f, 0xeb, 0xa9, 0x6d, 0xba, 0x8b, 0x8a, 0x70, 0xa1, 0xa0, 0xb6, 0xc9, 0x4a, 0x73, 0xd7, 0x1c, 0xa8, 0x66, 0x76, 0xf0, 0xc2, 0xf4, 0x22, 0xe2, 0x51, 0x98, + 0xca, 0x23, 0x22, 0x7a, 0x5b, 0x69, 0xd8, 0x84, 0x65, 0xf4, 0x51, 0xa3, 0xf0, 0xc8, 0xdd, 0x0d, 0xdf, 0x9b, 0xa0, 0x1c, 0x15, 0xf2, 0xd3, 0x36, 0x92, 0x67, 0x0e, 0xe9, 0xf4, 0x0d, 0x2a, 0x56, + 0x33, 0xa7, 0x30, 0xe9, 0xd2, 0xbb, 0x3b, 0x24, 0x43, 0xa1, 0x8d, 0x18, 0xb1, 0x44, 0x30, 0x9d, 0xcb, 0x1b, 0xf5, 0x14, 0x0d, 0x2a, 0x1d, 0xcb, 0x60, 0x09, 0xac, 0xaa, 0x1c, 0x73, 0x35, 0xa5, + 0xd6, 0x8e, 0x34, 0x88, 0x79, 0xda, 0x62, 0xf7, 0xfd, 0xf3, 0x94, 0xe3, 0x9d, 0x58, 0x67, 0xb7, 0x7f, 0x5d, 0xdd, 0xd9, 0x9f, 0x3f, 0x10, 0xfe, 0xeb, 0x5b, 0xfb, 0x9c, 0xcd, 0xa9, 0x11, 0x31, + 0x93, 0x78, 0xeb, 0x2d, 0x55, 0x72, 0xe1, 0x6c, 0x84, 0x24, 0xd5, 0x08, 0xad, 0x4f, 0x15, 0x08, 0x48, 0x9f, 0x33, 0xc1, 0x9b, 0xa5, 0xad, 0x5d, 0x73, 0x9c, 0x89, 0xa8, 0x0a, 0xcb, 0x1c, 0x76, + 0x57, 0x56, 0x1c, 0x3b, 0xbe, 0xb9, 0x79, 0x56, 0x00, 0xbf, 0x4f, 0xbc, 0x9e, 0x7a, 0xef, 0xf4, 0xb2, 0x56, 0x7d, 0x74, 0x44, 0x59, 0x98, 0x32, 0xda, 0xd4, 0xc5, 0x35, 0xfb, 0x02, 0x20, 0x87, + 0xee, 0x83, 0x6c, 0x60, 0x0e, 0x98, 0xe6, 0xd8, 0x15, 0x34, 0xa3, 0xf5, 0xd9, 0xd6, 0xec, 0x83, 0xb3, 0x48, 0x0e, 0xef, 0x9d, 0xb7, 0x79, 0xf9, 0x6a, 0x53, 0xab, 0x9b, 0x87, 0x33, 0xe1, 0xbd, + 0x15, 0xa8, 0xa7, 0x4f, 0xfe, 0xb5, 0xa8, 0x0d, 0xe9, 0xaf, 0xd1, 0x19, 0x55, 0x76, 0x4d, 0x4f, 0xa3, 0x54, 0xd3, 0x1b, 0xf1, 0xea, 0x58, 0xdc, 0x16, 0x69, 0x77, 0x1f, 0x2e, 0xd0, 0x57, 0x73, + 0x60, 0x6d, 0x63, 0x4e, 0x96, 0x04, 0x11, 0xa0, 0xc3, 0x04, 0xcb, 0xb3, 0x46, 0x44, 0x0f, 0x95, 0xcc, 0x07, 0x4f, 0xbe, 0xbf, 0xd3, 0x54, 0xcf, 0x8e, 0xb4, 0x7e, 0x9a, 0x89, 0xba, 0xf9, 0xeb, + 0xfe, 0x65, 0x58, 0x77, 0xea, 0x23, 0x92, 0x5d, 0x7b, 0x87, 0x19, 0x8d, 0x45, 0x57, 0x0a, 0x92, 0x34, 0xe1, 0x59, 0x63, 0x51, 0xc2, 0xe8, 0x61, 0x63, 0x25, 0x23, 0x72, 0x15, 0x0e, 0x28, 0x91, + 0xd6, 0xda, 0xca, 0x9e, 0x8e, 0xa6, 0x6a, 0x3a, 0x1b, 0x1f, 0x3b, 0x22, 0x79, 0x72, 0xae, 0xb0, 0x47, 0xb9, 0x9c, 0xdc, 0x82, 0x17, 0x4e, 0xf3, 0x16, 0xb2, 0xa8, 0xa2, 0x65, 0x4e, 0xac, 0x14, + 0x49, 0x5c, 0x73, 0x96, 0xb6, 0x96, 0xe6, 0xa0, 0x36, 0x56, 0xd7, 0x05, 0x01, 0x8b, 0x5c, 0x79, 0xd0, 0x68, 0xe5, 0xd8, 0xdc, 0x4c, 0x47, 0x1c, 0x63, 0x5c, 0x1e, 0x6d, 0xf8, 0xc5, 0x04, 0x9c, + 0x1a, 0x80, 0x7b, 0xfa, 0x22, 0x21, 0x42, 0x59, 0xad, 0x67, 0x50, 0x62, 0x75, 0x42, 0x73, 0x15, 0x69, 0x32, 0x5a, 0x91, 0x37, 0x04, 0x6a, 0x4b, 0x47, 0x0b, 0x9c, 0xd3, 0xc3, 0x94, 0x58, 0xe6, + 0xea, 0x08, 0x1e, 0x2d, 0x8f, 0x0f, 0xff, 0x66, 0x1d, 0x60, 0x05, 0xe4, 0xd4, 0x1b, 0xc1, 0xcc, 0xcd, 0xeb, 0xd7, 0xa4, 0x91, 0x73, 0x94, 0xca, 0xf4, 0x00, 0xe1, 0x89, 0xe4, 0x4d, 0x56, 0xe4, + 0x84, 0x48, 0x03, 0xed, 0xd0, 0x11, 0x8b, 0xa5, 0x06, 0x8b, 0xb0, 0x80, 0x55, 0xe3, 0x98, 0x0d, 0xf5, 0xf0, 0x0a, 0x7b, 0x28, 0x94, 0x7d, 0xe8, 0x7b, 0x72, 0x7c, 0x7d, 0x3c, 0x7b, 0xeb, 0xed, + 0x25, 0x5d, 0x53, 0xa9, 0xbb, 0xd0, 0x6e, 0xb7, 0x86, 0xc0, 0xe1, 0x25, 0x13, 0x78, 0xcd, 0x66, 0x98, 0x53, 0xb1, 0x3b, 0xa9, 0x02, 0x73, 0x85, 0x00, 0x06, 0x4f, 0x13, 0x80, 0x5a, 0xeb, 0xa1, + 0x1d, 0xf6, 0x3a, 0xd2, 0x6b, 0xf4, 0xdf, 0xab, 0x23, 0x7b, 0x52, 0x50, 0xbc, 0x2f, 0xff, 0x3c, 0xf5, 0x71, 0x7f, 0xeb, 0xba, 0x68, 0xb2, 0xf5, 0xc6, 0x8d, 0x3c, 0x2c, 0x00, 0x45, 0xb7, 0x88, + 0x0a, 0x46, 0x39, 0x0d, 0x35, 0x97, 0x85, 0x63, 0xae, 0xd9, 0x75, 0x99, 0x8b, 0xae, 0x85, 0x0d, 0x86, 0x76, 0x9a, 0x90, 0x1d, 0xeb, 0x70, 0x5f, 0x98, 0x6f, 0x97, 0x7f, 0x6c, 0xbe, 0xee, 0xfd, + 0x93, 0x76, 0x6c, 0xaf, 0x0a, 0x7c, 0xa4, 0x4c, 0xfd, 0x2d, 0xce, 0x65, 0x16, 0xf1, 0x84, 0x00, 0x56, 0xe8, 0x61, 0x88, 0x93, 0x83, 0x97, 0xd8, 0x18, 0x05, 0x3d, 0xc7, 0x06, 0xea, 0x74, 0x8c, + 0x80, 0xd5, 0xa8, 0x65, 0xae, 0x11, 0x00, 0x8d, 0x49, 0xcc, 0x6a, 0x99, 0x61, 0x51, 0x1d, 0x36, 0xef, 0xfd, 0x5a, 0xfb, 0xf7, 0xff, 0x8a, 0x26, 0x3e, 0x1b, 0xec, 0x53, 0x34, 0xed, 0xe4, 0x18, + 0xb6, 0x1a, 0xe3, 0xa4, 0x15, 0xa3, 0x05, 0xcd, 0x49, 0x1d, 0x66, 0xe1, 0xd2, 0x92, 0xea, 0x00, 0xda, 0x34, 0x73, 0x83, 0xb6, 0x95, 0x3b, 0xef, 0xcb, 0x4d, 0x2a, 0x9d, 0xa8, 0xc5, 0xf2, 0x5d, + 0x38, 0xea, 0x76, 0xa4, 0xb1, 0xc2, 0x93, 0x2b, 0x65, 0x9e, 0x34, 0x24, 0xdb, 0xbe, 0x3f, 0x76, 0xf1, 0x39, 0x2e, 0xf5, 0xf9, 0xa7, 0x2b, 0xbb, 0x38, 0xfb, 0x7c, 0x7d, 0xfd, 0xdb, 0xd9, 0x57, + 0xf1, 0xf6, 0x4c, 0x9f, 0x4f, 0x6f, 0x03, 0x03, 0x71, 0x3a, 0x2b, 0xb9, 0x59, 0x9f, 0xa3, 0x59, 0x28, 0x66, 0x31, 0x71, 0x30, 0x43, 0xdf, 0x55, 0xbf, 0x78, 0xdf, 0x75, 0xd1, 0x40, 0x6a, 0x4c, + 0xb6, 0x9c, 0xdd, 0x5a, 0x9f, 0x35, 0x66, 0xcc, 0x69, 0xff, 0x4a, 0x97, 0xf8, 0x5d, 0x11, 0xd0, 0x3e, 0xf4, 0x3b, 0x35, 0xa7, 0x20, 0x1d, 0x07, 0x75, 0x88, 0xe9, 0x31, 0xcc, 0x11, 0xa9, 0x53, + 0xcd, 0xa5, 0x2a, 0xcb, 0x69, 0x1a, 0x36, 0x1c, 0x23, 0xc7, 0x92, 0x20, 0xcd, 0x1a, 0x51, 0x49, 0x04, 0xba, 0xe1, 0xa9, 0x9e, 0x19, 0x15, 0xf8, 0x2f, 0x9e, 0x3e, 0x7d, 0x23, 0xb9, 0xf7, 0x70, + 0xc1, 0xe9, 0x9b, 0xe1, 0x58, 0x6f, 0xea, 0x59, 0xa9, 0xb3, 0x73, 0x63, 0xee, 0x42, 0x0c, 0xab, 0xcc, 0xa1, 0x45, 0x96, 0x48, 0xda, 0xe2, 0x68, 0x0c, 0x25, 0xe8, 0xc3, 0x01, 0xdc, 0x7d, 0xa2, + 0x57, 0x65, 0x5f, 0x6d, 0x76, 0xca, 0x63, 0x1d, 0x8b, 0x1e, 0x1a, 0x43, 0xee, 0xc7, 0xc8, 0x27, 0x4f, 0xfd, 0xd8, 0x80, 0x0b, 0x2e, 0x0a, 0x14, 0x70, 0xa4, 0x36, 0xbc, 0xad, 0x0d, 0x01, 0x48, + 0x55, 0x79, 0x1f, 0x0b, 0x34, 0xdd, 0x06, 0x18, 0x7b, 0x4e, 0x1d, 0xb3, 0x41, 0x83, 0x62, 0x10, 0x67, 0x1d, 0xb1, 0xa3, 0xdc, 0x0f, 0xce, 0xce, 0xd3, 0x86, 0x51, 0xef, 0xbf, 0x36, 0xb9, 0x3c, + 0xfb, 0xe1, 0x46, 0xfb, 0xf4, 0xad, 0x37, 0x17, 0x1c, 0x7a, 0x1b, 0x59, 0xd6, 0x28, 0x48, 0x30, 0x91, 0x06, 0x68, 0x4d, 0x89, 0x95, 0x30, 0xcc, 0x73, 0xf5, 0x29, 0x86, 0x1d, 0x61, 0xda, 0x70, + 0x0c, 0x91, 0x1c, 0xcb, 0x89, 0xa2, 0x51, 0x67, 0x5a, 0x04, 0xfd, 0x4d, 0x5a, 0xb0, 0x7d, 0xbd, 0x10, 0x6a, 0x7f, 0x49, 0x9e, 0x3a, 0x5e, 0x11, 0x36, 0xb6, 0x09, 0xb0, 0x6d, 0x26, 0x7d, 0x59, + 0xc1, 0x18, 0xc4, 0x51, 0x66, 0x43, 0x4c, 0xa7, 0xeb, 0x42, 0x91, 0xaa, 0x49, 0x55, 0xdd, 0x0d, 0xb8, 0xb5, 0xce, 0x28, 0x08, 0x93, 0x47, 0xcb, 0x2d, 0xf2, 0x7e, 0x9d, 0x07, 0xfb, 0x51, 0x81, + 0xd3, 0xed, 0x5f, 0x2f, 0x71, 0xc4, 0xa6, 0x96, 0xd3, 0xca, 0xa8, 0xe8, 0xc2, 0x30, 0xc1, 0x51, 0xbb, 0x6f, 0xe2, 0x24, 0xb2, 0xcc, 0x1c, 0x56, 0x18, 0xb0, 0xb9, 0x19, 0xb7, 0x32, 0x51, 0xef, + 0x38, 0xd3, 0x96, 0x4e, 0x34, 0x59, 0x0d, 0xa4, 0x8d, 0x31, 0x36, 0x0f, 0x7b, 0xd8, 0xb0, 0x8f, 0xcf, 0xef, 0x4f, 0xf2, 0xb8, 0xfb, 0xb2, 0x3f, 0x42, 0xaf, 0xd3, 0x8a, 0x4e, 0xb8, 0x18, 0x44, + 0xd5, 0xc3, 0x13, 0x39, 0xb0, 0x45, 0xc7, 0xd4, 0xd0, 0xb6, 0x2d, 0xee, 0xe5, 0x8d, 0x81, 0x38, 0xfa, 0x82, 0x26, 0xe2, 0x35, 0x87, 0x6c, 0xf6, 0x3f, 0x14, 0x6c, 0xe1, 0x16, 0xc8, 0x1c, 0xb9, + 0xc3, 0xf2, 0xdf, 0x16, 0xfd, 0x7b, 0xbf, 0xae, 0xe7, 0x93, 0x7f, 0xfa, 0xa6, 0x3f, 0x9e, 0xbd, 0x47, 0x8d, 0xc9, 0x58, 0x69, 0xd1, 0x43, 0xa5, 0x07, 0xc6, 0x9c, 0xc4, 0x88, 0xa3, 0xc9, 0x60, + 0x8a, 0x69, 0xd3, 0xb8, 0x2f, 0x5e, 0x3d, 0xb8, 0xa9, 0x2d, 0x59, 0x0b, 0xd3, 0x66, 0x4f, 0x9f, 0x47, 0xee, 0x6f, 0x7d, 0xb0, 0xea, 0x1f, 0xb4, 0xcd, 0x78, 0x51, 0x4c, 0xf5, 0xd8, 0x8d, 0xf9, + 0xb4, 0xf2, 0x81, 0xeb, 0x54, 0x2b, 0x5b, 0x54, 0x04, 0xb8, 0x20, 0x44, 0xac, 0xcb, 0x82, 0x0d, 0x20, 0x82, 0xd4, 0x04, 0xa1, 0xdd, 0x57, 0x5f, 0xd0, 0x47, 0x79, 0x48, 0x98, 0xd0, 0x98, 0x55, + 0xe2, 0x35, 0x5a, 0x3f, 0x5c, 0x67, 0xfe, 0xa2, 0xd2, 0xba, 0xfd, 0x30, 0xcb, 0xe5, 0xd5, 0x55, 0x7e, 0x40, 0x15, 0xbb, 0x96, 0xb8, 0xa7, 0x55, 0x45, 0xda, 0x4c, 0x70, 0x8a, 0x02, 0x64, 0xb2, + 0x6c, 0xad, 0xaf, 0x99, 0xca, 0x6d, 0xec, 0xe6, 0x96, 0x71, 0x53, 0x50, 0xe7, 0x3e, 0x8a, 0xb6, 0x5d, 0xac, 0x10, 0xda, 0x9a, 0x0d, 0x56, 0x2c, 0x65, 0x80, 0x3c, 0x02, 0x9c, 0xbf, 0x81, 0xe4, + 0xe7, 0xad, 0xb5, 0x9f, 0xdc, 0xd6, 0xba, 0x7d, 0xfb, 0x76, 0x9b, 0xe2, 0x2b, 0x0a, 0x38, 0xd4, 0x13, 0xe7, 0xf4, 0x17, 0x26, 0xed, 0xa8, 0x4e, 0xcf, 0x72, 0x5e, 0xb6, 0x62, 0x13, 0x93, 0xba, + 0xcd, 0xc8, 0x22, 0x25, 0x8d, 0x34, 0x99, 0x68, 0x73, 0x4d, 0x4d, 0xf0, 0x19, 0x1e, 0x8b, 0xd3, 0x97, 0xa5, 0xd4, 0x18, 0x32, 0x52, 0xea, 0x58, 0x8a, 0xf4, 0x53, 0x29, 0xf7, 0x0f, 0x08, 0x4f, + 0xed, 0xad, 0x49, 0x71, 0xf6, 0x36, 0xb9, 0x59, 0xaf, 0xa6, 0x5e, 0x34, 0x96, 0x27, 0x02, 0x2c, 0xc5, 0x41, 0x31, 0x53, 0x96, 0x12, 0xea, 0xaa, 0x4e, 0x3a, 0x79, 0x4e, 0x5c, 0x38, 0x29, 0x3b, + 0x71, 0x28, 0xd1, 0x6a, 0xf3, 0xf0, 0x6e, 0xfc, 0x74, 0xd2, 0x8e, 0x4e, 0xd2, 0xd5, 0x5f, 0x2f, 0x51, 0xa2, 0x9c, 0xdc, 0x25, 0x0d, 0x8d, 0xe8, 0x91, 0x5b, 0x04, 0xdb, 0xdd, 0xb1, 0x05, 0x8e, + 0xd9, 0x5a, 0xeb, 0xc6, 0x89, 0x28, 0xc6, 0xb2, 0xab, 0x0e, 0xb7, 0x1e, 0xda, 0x73, 0x39, 0x32, 0x82, 0x77, 0x1c, 0x02, 0xd6, 0xac, 0x85, 0xf7, 0xc3, 0xc5, 0x06, 0x8f, 0x83, 0xff, 0xf8, 0x63, + 0x4b, 0x7c, 0xf6, 0xde, 0x5b, 0x9b, 0x23, 0x14, 0x45, 0xb8, 0x05, 0x01, 0x54, 0x5a, 0xeb, 0x35, 0xa4, 0x04, 0x66, 0x63, 0x67, 0x41, 0xef, 0xbd, 0x9c, 0x56, 0x8d, 0x41, 0x6a, 0x24, 0xb2, 0x2a, + 0xa4, 0x81, 0x35, 0x10, 0x58, 0xad, 0x13, 0x16, 0x1e, 0x03, 0xc4, 0x0f, 0x8d, 0x0a, 0xf6, 0xf6, 0x8e, 0x71, 0x72, 0xba, 0x7d, 0xf2, 0x52, 0x87, 0xa8, 0x85, 0x66, 0xdc, 0x00, 0x0a, 0x57, 0x2a, + 0x07, 0x06, 0x87, 0x90, 0x48, 0x4f, 0x54, 0x53, 0x68, 0x4d, 0xbc, 0x19, 0x4c, 0x5c, 0xb1, 0x50, 0xa1, 0xa1, 0x62, 0x2a, 0xad, 0xb2, 0xc3, 0xd8, 0xe8, 0x69, 0x2e, 0xf4, 0xf7, 0x2a, 0xe9, 0xef, + 0x05, 0xe2, 0x8f, 0x1d, 0x18, 0x9e, 0xa6, 0x5f, 0xbd, 0x3f, 0xd6, 0x00, 0xe5, 0x60, 0x70, 0xfa, 0x7e, 0xef, 0x3a, 0xd1, 0x9f, 0x62, 0x7e, 0x9f, 0x34, 0x7c, 0xd8, 0x27, 0x38, 0x4e, 0x0d, 0x49, + 0xc6, 0x16, 0xb5, 0x8f, 0xc0, 0x18, 0x9a, 0x11, 0x31, 0x9c, 0x50, 0x34, 0x7c, 0x77, 0x9b, 0xe8, 0x22, 0x73, 0x5c, 0xcd, 0x17, 0x69, 0x85, 0x69, 0x33, 0x17, 0xc4, 0x64, 0x31, 0xb3, 0x49, 0xda, + 0xd7, 0xf2, 0x23, 0xfc, 0xdd, 0x93, 0x7a, 0xf3, 0x1f, 0x56, 0x11, 0x1c, 0x54, 0xe5, 0xdf, 0xb8, 0x22, 0xfa, 0xeb, 0x0b, 0xfb, 0x8b, 0x87, 0x4e, 0x4d, 0xd4, 0x8e, 0xc8, 0x11, 0x44, 0x36, 0x16, + 0x0f, 0x5f, 0xdc, 0x97, 0x20, 0x9b, 0x64, 0x47, 0x62, 0xee, 0xb5, 0x10, 0x32, 0x80, 0x16, 0x49, 0xa7, 0x58, 0x1d, 0x4a, 0x06, 0x98, 0x97, 0x28, 0xc3, 0xa8, 0xce, 0xe9, 0x87, 0xf9, 0xbf, 0xa7, + 0x89, 0x61, 0xd7, 0xaf, 0x5c, 0xe4, 0xff, 0x28, 0xe5, 0x8f, 0x9c, 0xe6, 0xd3, 0xb7, 0x5e, 0x28, 0xe4, 0xd4, 0xee, 0xa4, 0xcd, 0xde, 0x7d, 0x00, 0xa9, 0xc1, 0x2a, 0x29, 0x30, 0xcc, 0x69, 0xa4, + 0x6b, 0x98, 0x48, 0x17, 0x9c, 0x50, 0xd5, 0x70, 0x6a, 0x80, 0x4d, 0x0d, 0xe4, 0xdc, 0xb5, 0x94, 0xe8, 0x95, 0x48, 0x80, 0xa5, 0x47, 0xba, 0xea, 0x3c, 0xbd, 0x9b, 0xf3, 0x98, 0x94, 0x8f, 0x8d, + 0x77, 0xf6, 0x08, 0x84, 0xd3, 0xef, 0x0d, 0x3c, 0x75, 0x0a, 0x64, 0x4d, 0x5a, 0x53, 0x39, 0x91, 0xd2, 0xa5, 0x98, 0x28, 0xbd, 0x57, 0x6e, 0x58, 0x8f, 0x9a, 0x4b, 0x9f, 0xd5, 0x64, 0x01, 0xae, + 0x0c, 0xa9, 0x60, 0xb6, 0x51, 0xbd, 0x73, 0x34, 0xf7, 0x63, 0x79, 0xe5, 0xcf, 0x6a, 0x85, 0xf7, 0x81, 0xd8, 0xc9, 0x0f, 0x78, 0x26, 0x6e, 0x81, 0x93, 0xf5, 0xae, 0x54, 0xd5, 0x46, 0x53, 0x12, + 0x27, 0xe1, 0x21, 0x53, 0x5c, 0x5b, 0x6c, 0x68, 0x55, 0x17, 0xf6, 0xd6, 0x3b, 0x80, 0x76, 0x0b, 0x37, 0xe3, 0x6c, 0x34, 0xba, 0x53, 0x02, 0xcb, 0x31, 0xa7, 0xff, 0x3c, 0xb6, 0x78, 0xc1, 0x3e, + 0x9f, 0x58, 0x08, 0x87, 0x3e, 0x00, 0xc2, 0x0a, 0x19, 0x7a, 0xf9, 0x18, 0x13, 0x74, 0x08, 0x51, 0xaa, 0x22, 0xbb, 0x6d, 0xe3, 0x9f, 0xd0, 0x20, 0x56, 0xa2, 0x4a, 0xe3, 0x91, 0x0d, 0xc8, 0xe7, + 0xca, 0xea, 0xd9, 0xa1, 0xec, 0x47, 0x42, 0x3c, 0x2f, 0xd2, 0xde, 0x5f, 0x38, 0x27, 0xc7, 0xc6, 0x3d, 0xba, 0x02, 0x55, 0xab, 0x60, 0xef, 0xcb, 0x45, 0x86, 0xa1, 0x85, 0x50, 0x2c, 0x57, 0x77, + 0x66, 0x99, 0x6b, 0xc4, 0xac, 0x5c, 0x8d, 0xd5, 0x61, 0x35, 0x9c, 0x18, 0xa1, 0xde, 0x22, 0xd1, 0x6d, 0x1e, 0x69, 0xb1, 0xfe, 0x15, 0x30, 0x1d, 0x5d, 0x36, 0xf7, 0x37, 0x17, 0x7b, 0x11, 0xee, + 0xe9, 0x4f, 0x93, 0x7b, 0xdb, 0x25, 0x73, 0x13, 0x24, 0x4c, 0x6c, 0xcd, 0x46, 0x77, 0x50, 0x20, 0x58, 0x6d, 0xf4, 0xc0, 0xbe, 0x74, 0x00, 0x78, 0x70, 0xc2, 0x90, 0xac, 0x65, 0xd5, 0xd9, 0x7d, + 0x01, 0xe1, 0x9c, 0x6c, 0x63, 0xc4, 0x61, 0xb4, 0x78, 0x90, 0x2e, 0x5f, 0x57, 0x0f, 0x91, 0xc0, 0xc1, 0x9b, 0x3e, 0x7e, 0xc0, 0x9d, 0xef, 0x2e, 0x72, 0x79, 0x6e, 0xb2, 0xa7, 0xef, 0x97, 0x4e, + 0xdc, 0x99, 0x39, 0x09, 0x99, 0x91, 0x3b, 0x38, 0x8a, 0x56, 0x60, 0x67, 0xcb, 0xd1, 0x0d, 0xdb, 0x0c, 0x61, 0xcf, 0xbe, 0x3b, 0x33, 0x69, 0xb9, 0x43, 0x5a, 0x41, 0x5a, 0xd5, 0x82, 0xa2, 0x67, + 0x1c, 0xa9, 0x7c, 0xf8, 0x89, 0x24, 0x97, 0x47, 0xb1, 0x1e, 0x5b, 0x91, 0x3d, 0xb7, 0xe5, 0x79, 0xf2, 0x3c, 0x10, 0x9e, 0x43, 0xd9, 0x3b, 0x88, 0xba, 0xf4, 0xa5, 0x30, 0xc9, 0x87, 0xb9, 0x41, + 0x17, 0xad, 0x1e, 0xba, 0x26, 0xad, 0xd6, 0xb6, 0x85, 0x1b, 0xc4, 0xd2, 0x5a, 0x64, 0xb6, 0x46, 0xb9, 0x4c, 0x87, 0x26, 0x0f, 0x3a, 0x76, 0x4f, 0xe5, 0x16, 0xde, 0xbe, 0x3c, 0xdd, 0x38, 0x1a, + 0xf6, 0x9e, 0x56, 0x26, 0x30, 0x60, 0xea, 0x53, 0xc3, 0x34, 0x54, 0x27, 0x65, 0x95, 0x4e, 0x5e, 0x59, 0xd4, 0x71, 0x31, 0xe8, 0x16, 0xb4, 0x51, 0xf0, 0x80, 0x74, 0x68, 0x8c, 0x8c, 0x54, 0xa5, + 0x55, 0x8a, 0x6e, 0x18, 0x04, 0x7f, 0x47, 0xa6, 0x57, 0x0a, 0x56, 0x4e, 0x2b, 0xd3, 0x8c, 0xb1, 0x86, 0xe6, 0x8e, 0x7b, 0x33, 0x72, 0x5e, 0x8e, 0x63, 0x01, 0x44, 0xe2, 0x44, 0xda, 0x76, 0x67, + 0x81, 0x31, 0x8a, 0xab, 0x43, 0xeb, 0xba, 0xa4, 0x9b, 0xa6, 0xb9, 0x90, 0xeb, 0xdc, 0x26, 0x0a, 0x8f, 0xdd, 0xb5, 0xfc, 0xac, 0xaa, 0x7a, 0x3f, 0x14, 0x1d, 0xa7, 0x3e, 0x82, 0xec, 0xee, 0xd6, + 0x72, 0x84, 0x0f, 0x74, 0xe3, 0x59, 0xb5, 0xc5, 0x68, 0x93, 0xfb, 0xac, 0x42, 0x34, 0x98, 0xe0, 0x9e, 0xd3, 0x20, 0x9c, 0x8c, 0x18, 0x04, 0x5a, 0xcc, 0x20, 0xca, 0x0a, 0xd4, 0xb5, 0x4a, 0x7f, + 0x78, 0x1a, 0xf5, 0x54, 0x9a, 0x6f, 0xad, 0x11, 0x8f, 0x2c, 0xb3, 0x67, 0xef, 0xba, 0xc5, 0x6f, 0xf9, 0x22, 0x4d, 0xf2, 0x0d, 0x34, 0x00, 0xd3, 0x1b, 0x7b, 0x4c, 0xaa, 0xb9, 0xc4, 0xd7, 0xee, + 0xfc, 0xad, 0xc4, 0x17, 0xc2, 0x86, 0x32, 0x75, 0x2d, 0x11, 0x9d, 0x51, 0x00, 0x2a, 0x06, 0x56, 0x2c, 0x5c, 0x61, 0x64, 0xde, 0x96, 0xc8, 0x1a, 0x47, 0x2e, 0x4b, 0xfa, 0x7a, 0x35, 0xe3, 0x53, + 0x10, 0xfa, 0xfc, 0x8a, 0xf4, 0x9f, 0x3c, 0xa5, 0xde, 0xd3, 0xca, 0xed, 0x67, 0xbb, 0xc9, 0x57, 0xea, 0x4a, 0x0f, 0xa8, 0xfb, 0xed, 0x15, 0xc8, 0x4b, 0xbc, 0x21, 0x17, 0x58, 0x47, 0x71, 0x6f, + 0x48, 0x5c, 0x1d, 0x07, 0x37, 0x1a, 0x73, 0xa2, 0x62, 0x57, 0x4f, 0x17, 0x6d, 0x02, 0xad, 0x0d, 0x20, 0x69, 0xd9, 0xad, 0x51, 0xf4, 0x55, 0x33, 0xf0, 0xc8, 0xad, 0x44, 0xdf, 0xd5, 0xf1, 0x52, + 0xa4, 0xb3, 0xdb, 0xfb, 0x2f, 0x5f, 0xae, 0x6f, 0x5e, 0xa1, 0x5f, 0x5f, 0xf9, 0x9d, 0x37, 0x57, 0x47, 0x02, 0x0e, 0x4f, 0xb7, 0x31, 0x70, 0x2d, 0x48, 0x17, 0x6c, 0x2d, 0x61, 0xc5, 0x44, 0x4b, + 0x89, 0xbe, 0x36, 0x30, 0x48, 0x00, 0x66, 0xea, 0x8e, 0x1b, 0x00, 0x6b, 0xd4, 0x55, 0x67, 0xf6, 0xac, 0xa0, 0x59, 0xff, 0x56, 0x4e, 0xc3, 0x91, 0x35, 0xf4, 0xef, 0x99, 0xd1, 0xe3, 0xcb, 0x6f, + 0xaf, 0xb8, 0x35, 0x57, 0x77, 0xa6, 0xd6, 0xb9, 0xcd, 0x05, 0x15, 0x93, 0x07, 0x56, 0x26, 0x2e, 0xad, 0xe9, 0xe1, 0x85, 0xec, 0x34, 0x15, 0xbd, 0xfa, 0x1c, 0xa0, 0x59, 0xda, 0x35, 0x91, 0xe6, + 0x40, 0xe4, 0x6d, 0xfb, 0x38, 0xe6, 0x4f, 0x1f, 0x6f, 0x96, 0xdb, 0x8f, 0x0a, 0x4e, 0xde, 0x63, 0x83, 0x7c, 0xad, 0x99, 0xc5, 0x39, 0x07, 0x2f, 0x03, 0x18, 0xea, 0x35, 0x00, 0x5a, 0xf4, 0xa8, + 0xee, 0x83, 0x7b, 0x79, 0x0c, 0x35, 0x24, 0x69, 0x18, 0xab, 0x26, 0x20, 0x0d, 0x31, 0x95, 0x8a, 0x45, 0x76, 0xac, 0x7d, 0xc8, 0xf1, 0x0e, 0x57, 0xc7, 0xa6, 0xee, 0x81, 0xaa, 0xde, 0x97, 0xf6, + 0xd4, 0xd1, 0x43, 0x8f, 0x41, 0xd3, 0x44, 0xb9, 0x62, 0xa9, 0xcd, 0x31, 0x3b, 0x66, 0x9f, 0x84, 0x8c, 0x69, 0xdc, 0x9a, 0x79, 0x4e, 0xda, 0x16, 0x3f, 0x8b, 0x0a, 0x24, 0x0d, 0x61, 0xe0, 0xd6, + 0x17, 0x0e, 0x6f, 0xad, 0x18, 0x0e, 0x67, 0xe2, 0x3e, 0x1e, 0x3b, 0x9c, 0xcb, 0x90, 0xb3, 0x2f, 0x71, 0xf6, 0x95, 0xd7, 0xf9, 0x74, 0x75, 0xff, 0x95, 0xe7, 0xd9, 0x7e, 0xfc, 0xe7, 0x90, 0x8f, + 0xc2, 0x2f, 0x5f, 0x78, 0x55, 0x21, 0x07, 0xff, 0xe8, 0xfe, 0xd1, 0xe3, 0xa9, 0xa1, 0xbb, 0x05, 0xf9, 0xd0, 0x10, 0x12, 0x6c, 0x8c, 0xb2, 0xd6, 0xf4, 0x39, 0x21, 0x7b, 0x64, 0x23, 0x9c, 0x59, + 0xd5, 0xb9, 0x7b, 0x84, 0xbb, 0x13, 0x17, 0x79, 0xb6, 0x59, 0x25, 0xe5, 0x62, 0xde, 0xc1, 0xd5, 0x8f, 0xd5, 0x13, 0x3d, 0x3d, 0x9d, 0xd9, 0x0f, 0xac, 0x4e, 0x7d, 0xfc, 0xa2, 0x2d, 0x43, 0x22, + 0x47, 0xf7, 0x5d, 0xbc, 0xd8, 0x21, 0x2c, 0x7b, 0xf6, 0x18, 0x5a, 0xb3, 0xdb, 0xc8, 0xa9, 0x0b, 0xa3, 0x05, 0x7b, 0x6b, 0x80, 0x48, 0x45, 0x64, 0x44, 0x9c, 0x14, 0xd9, 0x57, 0x82, 0x1e, 0xf6, + 0x66, 0x3f, 0x3a, 0x4e, 0x79, 0x75, 0xa2, 0xdf, 0x7a, 0xd2, 0x14, 0x30, 0x11, 0x75, 0x30, 0xac, 0xd6, 0x35, 0x60, 0xd7, 0x0d, 0x01, 0xcb, 0x11, 0xcb, 0x34, 0xbb, 0x75, 0x16, 0xb0, 0x1c, 0xc9, + 0xa3, 0x0c, 0xc3, 0x74, 0x66, 0x30, 0x46, 0x05, 0x4c, 0x02, 0x78, 0x05, 0x7e, 0x3f, 0xb6, 0xa3, 0xdb, 0x1b, 0xfe, 0xe9, 0xab, 0x65, 0x53, 0x86, 0x8c, 0x21, 0x1e, 0x4d, 0x87, 0x07, 0x78, 0xf3, + 0x2d, 0x48, 0xb0, 0x68, 0xc0, 0x6a, 0xb6, 0x7c, 0x40, 0x6f, 0x63, 0xba, 0x24, 0x2f, 0x13, 0x6e, 0x20, 0xe1, 0x4b, 0x3b, 0xef, 0x3a, 0x63, 0xea, 0xb1, 0x34, 0xf2, 0x9f, 0xae, 0x9c, 0x7c, 0xca, + 0xc5, 0xbe, 0xb9, 0xa8, 0xa2, 0xba, 0x90, 0x61, 0x78, 0x86, 0xf4, 0x24, 0xa2, 0x91, 0xcb, 0x9b, 0x4a, 0x8e, 0x26, 0x1e, 0x90, 0x01, 0x5d, 0xe6, 0x06, 0x34, 0x1a, 0x34, 0x96, 0x41, 0x85, 0x59, + 0x39, 0xba, 0x96, 0x40, 0xeb, 0x62, 0x47, 0x9d, 0xd0, 0xdf, 0x13, 0xf5, 0xeb, 0x8b, 0x6f, 0x2e, 0xae, 0xfa, 0x06, 0x27, 0xaa, 0xc5, 0xd2, 0x18, 0x2d, 0x74, 0x6a, 0x9f, 0x31, 0x71, 0x02, 0x70, + 0x56, 0x53, 0xf0, 0xa1, 0xd4, 0x39, 0x92, 0x55, 0xd6, 0x5c, 0x93, 0x51, 0xa1, 0x11, 0x44, 0xe3, 0xa9, 0xb6, 0x6a, 0x1d, 0xbe, 0x91, 0xf7, 0x51, 0x8a, 0x8f, 0x66, 0x37, 0xf1, 0x59, 0xf8, 0xe3, + 0xa7, 0xab, 0xfb, 0x8b, 0x8b, 0xdf, 0x2f, 0x9f, 0x12, 0xeb, 0xdf, 0x7e, 0x76, 0x79, 0xfb, 0xfb, 0xb3, 0x42, 0xda, 0x8f, 0x9b, 0x53, 0xfd, 0xf8, 0xc4, 0x3d, 0x7f, 0x7f, 0xf8, 0xe2, 0xd5, 0x87, + 0xc5, 0xfc, 0xe2, 0xe5, 0xef, 0x8f, 0x5f, 0xfc, 0xaf, 0x8f, 0x3f, 0x7a, 0xfc, 0x4b, 0xaf, 0x4f, 0xc2, 0x8b, 0xe1, 0xbf, 0xf9, 0x64, 0x4c, 0xb0, 0xec, 0x8a, 0x3b, 0xce, 0x72, 0x6d, 0x68, 0x8f, + 0xb2, 0x2d, 0x82, 0xce, 0xca, 0x5b, 0x5c, 0xd4, 0xfa, 0x02, 0xac, 0x2e, 0xd3, 0xb9, 0xb5, 0x8a, 0x9a, 0xad, 0x0f, 0xf0, 0x26, 0x4d, 0xb0, 0x34, 0xc1, 0x8f, 0x5d, 0xcd, 0x71, 0x50, 0xe5, 0x6f, + 0x2e, 0x8c, 0x63, 0x16, 0x6a, 0xb6, 0xa5, 0xbe, 0x2a, 0x2a, 0xd4, 0x87, 0x0c, 0x27, 0xd0, 0x80, 0x45, 0x18, 0xc2, 0x60, 0x52, 0xc9, 0x82, 0x33, 0x60, 0xb3, 0xb3, 0x89, 0x23, 0xd4, 0xdb, 0x58, + 0x73, 0x2c, 0x8d, 0x3a, 0x0a, 0xbd, 0xf6, 0xcd, 0xe4, 0xcd, 0x05, 0x91, 0x5d, 0xd0, 0x2a, 0x68, 0xba, 0x7c, 0x50, 0x5b, 0x52, 0xab, 0x99, 0x4c, 0x19, 0x14, 0xa3, 0x19, 0x8c, 0x5a, 0xb6, 0x4b, + 0xa1, 0x9d, 0xd5, 0x8a, 0x59, 0xab, 0x49, 0x37, 0xf2, 0x0d, 0xa5, 0x2c, 0x33, 0x3c, 0x9a, 0x7a, 0xff, 0xd2, 0xb4, 0xdf, 0x5c, 0x12, 0xee, 0x8c, 0x21, 0x49, 0xc2, 0x91, 0x08, 0x5e, 0xdc, 0x97, + 0xcc, 0x5a, 0x0b, 0x6d, 0x24, 0xf7, 0x5e, 0x46, 0x63, 0x11, 0x08, 0xf4, 0x11, 0xb5, 0x98, 0x9c, 0x2c, 0x20, 0xba, 0x83, 0xc3, 0xac, 0x91, 0xed, 0x18, 0x3d, 0x7b, 0x60, 0x39, 0xbe, 0xb9, 0x28, + 0x61, 0xe8, 0xc3, 0x44, 0xa0, 0x54, 0x70, 0x84, 0x2f, 0x24, 0xe6, 0x96, 0xbd, 0xed, 0x6e, 0xc1, 0x6e, 0x7d, 0x39, 0xc9, 0x90, 0x1a, 0x93, 0x2b, 0x66, 0x1f, 0x6d, 0x60, 0x13, 0x24, 0xe9, 0x62, + 0x35, 0x95, 0xfd, 0x47, 0x93, 0xb2, 0xe7, 0x42, 0xde, 0x5c, 0x1c, 0x1d, 0x53, 0x96, 0x07, 0x14, 0x43, 0xb6, 0x31, 0x14, 0x73, 0xae, 0x9e, 0xa3, 0x86, 0x9b, 0x8d, 0x6d, 0x86, 0x44, 0xb5, 0x70, + 0xb2, 0x8c, 0xe0, 0x84, 0x2e, 0x08, 0x0d, 0x94, 0x73, 0x85, 0x96, 0xfa, 0xec, 0x3f, 0x5a, 0x2c, 0x4f, 0xdd, 0xde, 0x9b, 0xcb, 0x02, 0xd6, 0xa1, 0x57, 0xd7, 0x39, 0x2b, 0x79, 0x0a, 0x84, 0x77, + 0xc2, 0x9a, 0x83, 0x22, 0x71, 0x97, 0x22, 0x89, 0x24, 0xe2, 0x63, 0x8e, 0xec, 0x58, 0xe5, 0x91, 0xdc, 0x67, 0x0c, 0x29, 0xd1, 0x18, 0xa4, 0xe3, 0xd8, 0x71, 0xcc, 0x3f, 0x6f, 0xef, 0xf6, 0x03, + 0x46, 0xc0, 0x0f, 0xf4, 0x9f, 0xdb, 0xf3, 0x0d, 0xa4, 0x9e, 0xfc, 0x20, 0x5b, 0x25, 0xd3, 0x80, 0xb0, 0xbc, 0x21, 0x67, 0x4b, 0xa0, 0x5a, 0x33, 0xb0, 0xfa, 0xea, 0xab, 0xcf, 0xbe, 0x86, 0x4d, + 0x51, 0x33, 0x45, 0x1a, 0x68, 0x81, 0x35, 0x17, 0xcd, 0x8a, 0x98, 0xdd, 0x6a, 0xb5, 0x71, 0xa4, 0x5c, 0x79, 0x1b, 0xed, 0xd9, 0xad, 0xd5, 0x2b, 0xb4, 0xf7, 0xf7, 0x57, 0x9e, 0x4a, 0x2b, 0x1f, + 0xda, 0x87, 0xfe, 0x5d, 0xd8, 0x53, 0x13, 0xc4, 0xab, 0xcb, 0x9a, 0x29, 0xcd, 0xd9, 0x41, 0xfb, 0xd8, 0xdd, 0x2b, 0x48, 0xc3, 0xa0, 0x81, 0x6c, 0x31, 0xa6, 0x25, 0x85, 0x91, 0xfa, 0x66, 0x75, + 0x9c, 0x34, 0x39, 0x58, 0x88, 0x85, 0x4a, 0x3a, 0xce, 0x85, 0x47, 0x5a, 0xc0, 0x7c, 0x3b, 0x9f, 0x7f, 0x10, 0xe9, 0xb5, 0xa3, 0xf4, 0x6f, 0x6f, 0x3c, 0x3f, 0xfa, 0x68, 0x1f, 0xc6, 0x77, 0x99, + 0x4f, 0x1d, 0x87, 0xf4, 0xde, 0x25, 0x25, 0x13, 0xfb, 0x22, 0x5c, 0x85, 0x7d, 0x48, 0xb4, 0x39, 0xdc, 0xcb, 0x50, 0xc7, 0x68, 0x24, 0x13, 0x0d, 0xdb, 0x6a, 0xe6, 0xb3, 0x4b, 0xcf, 0xc6, 0x93, + 0x47, 0x5b, 0x1d, 0xb5, 0x69, 0xc6, 0x38, 0x5c, 0xdf, 0xfa, 0xfc, 0xc2, 0xc5, 0x67, 0x7d, 0x0e, 0x36, 0xe1, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc4, 0x5e, 0x79, + 0x62, 0xfd, 0x26, 0x00, 0x00, 0xd2, 0xa1, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, + 0x6d, 0x6c, 0x54, 0x90, 0x4d, 0x6e, 0xeb, 0x30, 0x0c, 0x84, 0xf7, 0x3c, 0x05, 0xa1, 0xf5, 0xb3, 0x20, 0xe7, 0x05, 0x6d, 0xba, 0xf0, 0x49, 0x02, 0x23, 0x50, 0xa4, 0x89, 0xa1, 0x46, 0x91, 0x0c, + 0x89, 0x76, 0xff, 0xd0, 0xbb, 0x17, 0x8a, 0xd3, 0x45, 0x77, 0xc3, 0x8f, 0xc0, 0xcc, 0x90, 0xc7, 0xd9, 0xba, 0xab, 0x9d, 0x30, 0x52, 0xb2, 0x37, 0xf0, 0xc0, 0xea, 0xb2, 0x24, 0x27, 0x21, 0x27, + 0x45, 0x2b, 0x4a, 0x0d, 0x39, 0x35, 0x68, 0x74, 0xaf, 0x8d, 0x22, 0xf8, 0x20, 0x0f, 0xb2, 0x33, 0xbb, 0x5e, 0x11, 0x1d, 0xe7, 0x92, 0x2f, 0x21, 0x42, 0x17, 0x44, 0xd8, 0x8a, 0x91, 0x5c, 0xf6, + 0x98, 0x90, 0xba, 0x25, 0x05, 0xa9, 0x3c, 0x70, 0x4f, 0x1e, 0xe7, 0x65, 0xe2, 0x81, 0x0d, 0x85, 0xe4, 0x0a, 0x6e, 0x48, 0x62, 0x23, 0x0f, 0x2c, 0x65, 0x01, 0x45, 0xc9, 0xbf, 0x32, 0xcf, 0xd2, + 0x45, 0xac, 0x68, 0x3b, 0xf5, 0xa9, 0xa8, 0x4a, 0x09, 0x73, 0xd3, 0xf5, 0xe3, 0x76, 0xce, 0xb1, 0xb6, 0x38, 0x8f, 0x19, 0xc9, 0x23, 0xb9, 0x80, 0x3a, 0x92, 0x75, 0x12, 0xde, 0xbb, 0x22, 0xf7, + 0x42, 0xfa, 0xd0, 0x2a, 0x6e, 0xe8, 0x0d, 0xe7, 0xc6, 0xf6, 0xfa, 0xbf, 0xee, 0x15, 0xb9, 0x98, 0x17, 0x8f, 0x15, 0x49, 0x6a, 0x57, 0xfd, 0x95, 0x07, 0xfe, 0xe2, 0x3f, 0xc7, 0x3d, 0x6b, 0xa3, + 0xfe, 0xf1, 0x05, 0x56, 0x96, 0x82, 0x56, 0xfa, 0xa8, 0xee, 0x3e, 0x6a, 0xe4, 0x6f, 0x42, 0x5a, 0x4f, 0x31, 0x4f, 0x13, 0xca, 0xe3, 0x13, 0xa6, 0xe5, 0xc4, 0x3c, 0x6d, 0xe3, 0x5e, 0xf7, 0x07, + 0x45, 0x15, 0xc5, 0xe3, 0xf4, 0x5a, 0x37, 0xc7, 0x5e, 0x1b, 0xfd, 0xf2, 0xa4, 0xe8, 0x27, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2a, 0x23, 0xc1, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x5e, + 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, + 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xdc, 0x95, 0x6f, 0x6f, 0x1b, + 0xb7, 0x0f, 0xc7, 0x9f, 0xeb, 0x55, 0xb0, 0xc9, 0x0f, 0x48, 0xf2, 0x43, 0x7c, 0x4e, 0x9f, 0x15, 0x87, 0x2e, 0x40, 0x97, 0xb5, 0x6b, 0xd0, 0xa1, 0x19, 0x12, 0x07, 0x43, 0x90, 0x15, 0x3d, 0x59, + 0xe2, 0xf9, 0xd4, 0xc8, 0xe2, 0x4d, 0x94, 0xce, 0xf1, 0x86, 0xbd, 0xf7, 0x41, 0xd2, 0xf9, 0x1f, 0xda, 0xf5, 0x05, 0xec, 0x99, 0x4f, 0x22, 0x29, 0xf2, 0xcb, 0x0f, 0xe9, 0x63, 0xb8, 0x8d, 0x1c, + 0xe0, 0xed, 0x80, 0x2e, 0x30, 0xbc, 0x8b, 0x4e, 0x05, 0x43, 0x4e, 0x88, 0xdf, 0xd0, 0x2a, 0x5a, 0x22, 0x04, 0x82, 0x35, 0x45, 0x0f, 0x0e, 0x57, 0xc5, 0xb2, 0x1d, 0x4d, 0xa0, 0xf7, 0xf4, 0x05, + 0x55, 0x78, 0x01, 0xb3, 0x0e, 0x61, 0x4e, 0xc6, 0xa2, 0xef, 0xad, 0x0c, 0x28, 0x1e, 0xa5, 0x0a, 0xe6, 0xf9, 0xd3, 0x69, 0x17, 0x42, 0xcf, 0xf5, 0x74, 0x9a, 0x3f, 0x2b, 0xcf, 0xd3, 0x33, 0x58, + 0xe1, 0x1c, 0x18, 0xfd, 0x80, 0x1e, 0x0c, 0x83, 0x71, 0xe2, 0xb1, 0x61, 0xaf, 0xa6, 0x4b, 0x69, 0x5c, 0xe5, 0xb9, 0xf9, 0x74, 0x5a, 0x4d, 0xf7, 0xbe, 0xcf, 0x2a, 0xb8, 0x0e, 0x27, 0x0c, 0x8a, + 0x5c, 0x6b, 0x16, 0xd1, 0xa3, 0x4e, 0xe9, 0x18, 0x37, 0xd0, 0x13, 0x42, 0xe8, 0x10, 0x9a, 0x4e, 0x3a, 0x6d, 0xb1, 0x11, 0xdb, 0xa4, 0x8c, 0x83, 0x12, 0xb2, 0xdc, 0xf8, 0xfd, 0xa8, 0xbb, 0xa3, + 0xb3, 0x64, 0xe7, 0x91, 0x7b, 0x72, 0x9c, 0x4b, 0x94, 0xf0, 0xeb, 0xcd, 0xdd, 0x4c, 0x78, 0xfc, 0x23, 0x22, 0x87, 0xf4, 0x60, 0x90, 0xc6, 0x19, 0xb7, 0x00, 0x09, 0x83, 0xb4, 0x46, 0x43, 0x73, + 0x65, 0x29, 0xea, 0x2c, 0x53, 0x53, 0xc1, 0x03, 0x45, 0xe0, 0x8e, 0xa2, 0xd5, 0xd0, 0xc7, 0x50, 0x14, 0xd2, 0xc8, 0xc6, 0xa3, 0x16, 0x73, 0xec, 0xe4, 0x60, 0xc8, 0x83, 0x71, 0x6c, 0x74, 0x4a, + 0x54, 0x86, 0x6d, 0xa6, 0x5b, 0xf9, 0x2a, 0xb8, 0x76, 0xa0, 0x24, 0x63, 0x72, 0x06, 0x87, 0xa5, 0xb6, 0x6d, 0xa5, 0x82, 0x93, 0xf8, 0x1e, 0x99, 0xa2, 0x57, 0xc8, 0xd0, 0x92, 0x2f, 0xaf, 0x6c, + 0xfc, 0xcf, 0xb3, 0x9f, 0x92, 0x0e, 0x34, 0x95, 0x27, 0x8c, 0xcb, 0x9a, 0x3c, 0x36, 0xdb, 0x20, 0xbb, 0xd7, 0x36, 0x12, 0x94, 0xab, 0x2c, 0xad, 0x10, 0xa9, 0x6f, 0xb2, 0xef, 0x61, 0x65, 0xac, + 0x05, 0x7c, 0xee, 0x29, 0x69, 0xd1, 0x79, 0x44, 0x40, 0xa7, 0x7b, 0x32, 0x2e, 0x70, 0x2d, 0x04, 0xc0, 0xff, 0xa1, 0x99, 0x36, 0x30, 0xf3, 0x66, 0xb1, 0x40, 0xcf, 0x07, 0xc2, 0xef, 0x68, 0x48, + 0x09, 0x16, 0x15, 0x61, 0x89, 0xa1, 0x23, 0x3d, 0x3a, 0x76, 0x28, 0x6d, 0xe8, 0xa6, 0x1e, 0xa5, 0x36, 0x0e, 0x99, 0x9b, 0x8c, 0xcb, 0xe6, 0x81, 0xd1, 0x6d, 0x7b, 0x0b, 0xc5, 0x1c, 0x54, 0x87, + 0xea, 0xe9, 0x30, 0x82, 0x35, 0x03, 0xfe, 0x6b, 0x80, 0xcd, 0xe5, 0xa1, 0xbf, 0x48, 0x6d, 0x5a, 0xca, 0x35, 0x44, 0x46, 0x90, 0x6e, 0x0d, 0xd4, 0xe6, 0xec, 0xe5, 0x20, 0x8d, 0x95, 0x73, 0x8b, + 0x50, 0x50, 0x15, 0x2d, 0xca, 0x10, 0x3d, 0xf2, 0x37, 0x98, 0xd5, 0xa4, 0x12, 0xb8, 0x81, 0xa0, 0x8d, 0xb6, 0x4d, 0x4a, 0xa5, 0x08, 0x23, 0x28, 0x0c, 0x32, 0x40, 0xe8, 0x88, 0x51, 0x6c, 0x25, + 0xab, 0x84, 0x38, 0x3e, 0x86, 0x9f, 0x70, 0x40, 0x4b, 0xfd, 0x12, 0x5d, 0x48, 0x42, 0x27, 0xd8, 0x19, 0x64, 0x8a, 0x61, 0xd7, 0xc0, 0x68, 0xdb, 0xc9, 0xc8, 0x18, 0xea, 0xd4, 0x03, 0x6b, 0x94, + 0x2c, 0x5d, 0x65, 0xda, 0x35, 0xb6, 0xc4, 0x00, 0x13, 0x40, 0xb2, 0x48, 0xa7, 0xab, 0x4c, 0x5c, 0xae, 0x24, 0x74, 0xe8, 0xcb, 0x40, 0x1e, 0xb8, 0x63, 0xb5, 0xa8, 0x84, 0x68, 0x9a, 0x86, 0x3b, + 0xb4, 0x16, 0x58, 0x79, 0xd3, 0x07, 0xa1, 0xa4, 0x5f, 0x10, 0xcc, 0xa3, 0xb1, 0x7a, 0xfc, 0x1d, 0x90, 0x37, 0xc7, 0x3e, 0xba, 0xe4, 0x20, 0xc4, 0x8d, 0x53, 0x98, 0xbe, 0x12, 0xf7, 0xe7, 0xb9, + 0xcc, 0xdd, 0x58, 0xf1, 0x9e, 0x68, 0x32, 0xc0, 0xeb, 0xa4, 0x53, 0x3d, 0x9d, 0x5a, 0x52, 0xd2, 0x76, 0xc4, 0xa1, 0x7e, 0x75, 0xf1, 0xea, 0xe2, 0x12, 0xa4, 0xd3, 0x22, 0x39, 0xee, 0xb7, 0x81, + 0x41, 0xfa, 0xef, 0x38, 0x7d, 0x45, 0x48, 0x89, 0xf2, 0x7d, 0xe3, 0x4d, 0xbf, 0x2f, 0x2b, 0x98, 0x51, 0xa1, 0x4e, 0x3a, 0xc0, 0x34, 0x9d, 0xa9, 0x55, 0xa1, 0x43, 0xb1, 0x1b, 0x14, 0x09, 0x31, + 0x18, 0x6b, 0xc2, 0x1a, 0x38, 0xaa, 0x0e, 0x24, 0x43, 0xa3, 0xa2, 0xb7, 0x4d, 0x46, 0x63, 0x8e, 0x89, 0x0e, 0x5d, 0x67, 0xd1, 0x14, 0x39, 0x26, 0x8b, 0x22, 0x5d, 0xc3, 0x64, 0x80, 0x89, 0x86, + 0x93, 0xbf, 0x8e, 0x9c, 0x5c, 0xe2, 0x51, 0x0d, 0x47, 0x3f, 0x12, 0x05, 0x5e, 0x1f, 0xfd, 0x7d, 0x02, 0xbf, 0x0b, 0x80, 0xc9, 0xfb, 0x93, 0xd4, 0x42, 0x74, 0x61, 0x12, 0xd6, 0x3d, 0xd6, 0xfb, + 0x7d, 0x98, 0x7e, 0x61, 0x72, 0x3b, 0x33, 0x9c, 0x70, 0x8f, 0x6a, 0x40, 0xcf, 0x86, 0x5c, 0x0d, 0x2f, 0xab, 0x8b, 0xfd, 0x3b, 0xa3, 0x6b, 0x78, 0x79, 0x60, 0x9c, 0x67, 0xbe, 0x86, 0x51, 0x01, + 0x95, 0x16, 0x4f, 0x2e, 0x8d, 0x2b, 0x43, 0xfb, 0x86, 0xe5, 0x5d, 0x8d, 0x43, 0xf5, 0xe4, 0x64, 0x30, 0x03, 0x56, 0xf8, 0x2c, 0x97, 0xbd, 0xc5, 0x62, 0xf4, 0x4d, 0x05, 0x4b, 0xab, 0x33, 0xa1, + 0xbd, 0xa5, 0x75, 0x01, 0xf4, 0x9e, 0x11, 0x9a, 0x24, 0x58, 0x33, 0x2e, 0xa1, 0x4c, 0xa6, 0x37, 0x7f, 0x62, 0x59, 0x3a, 0x07, 0x88, 0xf5, 0x71, 0x6e, 0x0d, 0x77, 0x09, 0xcb, 0xbc, 0x39, 0x3d, + 0x2e, 0x0c, 0x07, 0xbf, 0x16, 0xd2, 0x69, 0xd0, 0x39, 0x6a, 0x41, 0x16, 0x24, 0x7c, 0x28, 0x79, 0xc1, 0x1d, 0xfa, 0xc1, 0x28, 0x4c, 0x3b, 0x2a, 0x07, 0xfc, 0x10, 0xe7, 0xe8, 0x1d, 0x06, 0x64, + 0x50, 0x36, 0x72, 0x40, 0x5f, 0x7f, 0x4d, 0x6d, 0x4a, 0x68, 0x13, 0x70, 0x32, 0xd9, 0x3c, 0xf3, 0x83, 0x26, 0xf5, 0x84, 0xbe, 0x32, 0x34, 0x7d, 0xfd, 0x70, 0x73, 0x7f, 0xfb, 0xf9, 0xcd, 0xd5, + 0xd5, 0xcd, 0xfd, 0xc7, 0xd9, 0x65, 0xa9, 0xec, 0x61, 0x1c, 0x1e, 0x5a, 0xa6, 0xfc, 0xd2, 0xaa, 0xda, 0xb9, 0x36, 0x40, 0x7d, 0xc6, 0x79, 0x9e, 0x66, 0x30, 0x84, 0xb4, 0xdf, 0xb3, 0xc9, 0xbb, + 0xfb, 0x8f, 0x57, 0x9f, 0x6f, 0xdf, 0xfe, 0x7c, 0x7d, 0x37, 0xbb, 0x7d, 0x68, 0x04, 0xba, 0xc1, 0x78, 0x72, 0x49, 0x1b, 0x18, 0xa4, 0x37, 0x89, 0xfa, 0x0a, 0xde, 0x38, 0x0d, 0xa6, 0xcd, 0xd3, + 0xd9, 0x92, 0x5f, 0x60, 0xc8, 0x2b, 0xf8, 0xc4, 0xda, 0xc4, 0x50, 0xef, 0x69, 0xd9, 0x07, 0xd4, 0xe3, 0x5a, 0xa5, 0x18, 0xd2, 0xff, 0x42, 0xeb, 0x69, 0x09, 0x32, 0x61, 0xa7, 0x90, 0xb9, 0x8d, + 0x76, 0x53, 0xce, 0xf8, 0xdf, 0xc1, 0x1d, 0xad, 0x72, 0x06, 0xf7, 0xb7, 0xbf, 0xe4, 0x4d, 0x96, 0xc0, 0xe5, 0xa2, 0xd5, 0x39, 0xac, 0x3a, 0xa3, 0xba, 0xed, 0x36, 0x90, 0x96, 0x09, 0x16, 0x18, + 0x60, 0x30, 0xb2, 0x34, 0x0b, 0x8c, 0x6b, 0xa9, 0xd9, 0x9b, 0xf9, 0xff, 0x16, 0xbe, 0xff, 0x3b, 0xdd, 0x16, 0x09, 0x13, 0x82, 0xe8, 0xed, 0x59, 0x69, 0xf1, 0x7b, 0x39, 0xe4, 0xd5, 0xf4, 0x42, + 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xff, 0xc5, 0x70, 0x1e, 0xeb, 0x03, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, + 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, + 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, + 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, + 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, + 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, + 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x72, 0x75, + 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x8c, 0x92, 0xcf, 0x6e, + 0x1a, 0x31, 0x10, 0xc6, 0xef, 0xfb, 0x14, 0x53, 0x0e, 0x95, 0x57, 0xa2, 0x70, 0x37, 0x29, 0x52, 0x15, 0x22, 0xf5, 0x56, 0x29, 0xe9, 0x1d, 0xbc, 0xf6, 0x78, 0xb1, 0xea, 0x1d, 0xaf, 0xfc, 0x07, + 0x82, 0x22, 0xde, 0xbd, 0xb2, 0x0d, 0x1b, 0x90, 0xa8, 0x54, 0x1f, 0x0c, 0xb6, 0xbf, 0x99, 0xf9, 0xcd, 0xec, 0x97, 0x02, 0x82, 0x90, 0xd1, 0xbc, 0x6f, 0x8f, 0xd8, 0x71, 0x5e, 0xb6, 0x8f, 0x8d, + 0x88, 0x62, 0x0e, 0x6f, 0xe8, 0x0f, 0x46, 0xe2, 0xb3, 0x23, 0x6d, 0xfa, 0xf3, 0xaa, 0xc9, 0x52, 0xeb, 0x7a, 0xce, 0x0d, 0x69, 0xb7, 0x6a, 0x9a, 0xe5, 0x72, 0x09, 0xaf, 0x89, 0x40, 0xa6, 0x10, + 0xdd, 0x00, 0xb2, 0xe8, 0x92, 0x17, 0xd1, 0x38, 0x02, 0x11, 0x60, 0x14, 0x3e, 0x82, 0xd3, 0x10, 0xf7, 0x08, 0x62, 0x1c, 0xad, 0x91, 0xf5, 0xa9, 0x4b, 0xc6, 0x2a, 0x43, 0x7d, 0x49, 0x30, 0x7a, + 0x27, 0x31, 0x84, 0x45, 0x3e, 0x94, 0x8b, 0xdf, 0x7b, 0x13, 0x40, 0x27, 0x92, 0x45, 0x1b, 0xf6, 0x2e, 0x59, 0x95, 0x73, 0x47, 0x61, 0x08, 0x84, 0xb5, 0x8f, 0xcb, 0x69, 0xe7, 0xe1, 0xe4, 0x92, + 0xff, 0x8c, 0xbc, 0xa9, 0xf8, 0x99, 0x7c, 0xb7, 0xdb, 0xf9, 0x14, 0x62, 0xf9, 0xaf, 0x69, 0xca, 0x81, 0x4c, 0xea, 0x9e, 0xc3, 0xd7, 0x21, 0xc5, 0xfb, 0xae, 0x5b, 0xf8, 0x28, 0xda, 0xbc, 0x2c, + 0x46, 0x50, 0xdd, 0x56, 0x79, 0x73, 0x40, 0x0f, 0xdf, 0x61, 0x38, 0x6d, 0x55, 0xc7, 0xda, 0xd5, 0x24, 0x90, 0xba, 0x5f, 0x28, 0x11, 0x05, 0x9b, 0x54, 0x0b, 0x69, 0x1d, 0x21, 0x6b, 0x2f, 0xa2, + 0xf3, 0x95, 0xe1, 0xa6, 0x59, 0xa4, 0xcc, 0x0d, 0x52, 0x10, 0xe4, 0xf9, 0x4e, 0x44, 0x0a, 0x3c, 0x06, 0x97, 0xbc, 0xc4, 0x00, 0x86, 0xee, 0x7b, 0x7b, 0xdc, 0xcf, 0x98, 0x3a, 0x10, 0xe1, 0x44, + 0x32, 0x77, 0xb6, 0x17, 0xa4, 0x2c, 0xb2, 0x89, 0x0d, 0x0f, 0x48, 0x91, 0xc3, 0x4b, 0xfe, 0x99, 0x4f, 0xb7, 0x95, 0x92, 0x43, 0xfe, 0xde, 0x4f, 0x9b, 0x6e, 0x53, 0x8e, 0xeb, 0xfa, 0xde, 0xc2, + 0xb7, 0x35, 0xbc, 0x62, 0x48, 0x36, 0x3e, 0xd5, 0xb0, 0x5b, 0x9f, 0xbc, 0x78, 0xef, 0xfc, 0xfa, 0x66, 0x3a, 0xbf, 0xfe, 0xb0, 0xa2, 0xe2, 0x5c, 0xa1, 0x16, 0xc9, 0x46, 0xd6, 0xb6, 0x97, 0xa6, + 0x33, 0xd8, 0xff, 0x0e, 0x3b, 0xa7, 0xca, 0xf6, 0xfa, 0xc2, 0x66, 0xcf, 0x17, 0xbd, 0xa1, 0x1e, 0x42, 0xd5, 0xcd, 0xda, 0x55, 0x73, 0x9d, 0xb4, 0x18, 0xc7, 0x6d, 0x99, 0x76, 0x86, 0xe7, 0x9c, + 0xf0, 0xc8, 0x7e, 0x96, 0xa6, 0x7d, 0x0d, 0xbc, 0x05, 0x69, 0x57, 0xcd, 0xb9, 0xfa, 0xf5, 0x07, 0x01, 0xbe, 0x8b, 0x61, 0xb4, 0x78, 0x75, 0xe6, 0x64, 0x98, 0x7b, 0x43, 0x85, 0xe8, 0x93, 0x8c, + 0xc9, 0xe3, 0xa2, 0xf0, 0xd7, 0x23, 0xdc, 0x55, 0xb8, 0xe0, 0xe6, 0x67, 0x12, 0x03, 0x72, 0x78, 0x8b, 0x19, 0x76, 0x9e, 0x6b, 0x99, 0x61, 0xb4, 0xb0, 0xa9, 0x00, 0xc5, 0x9c, 0x8f, 0x22, 0x35, + 0xc1, 0xc4, 0x98, 0xa7, 0xfd, 0x48, 0x93, 0xd7, 0xbf, 0xee, 0xf3, 0xaa, 0x95, 0x67, 0x47, 0xe7, 0xad, 0x9a, 0x2d, 0x0c, 0x45, 0xc7, 0xda, 0xf9, 0xa4, 0x38, 0x37, 0x75, 0x3f, 0x37, 0x7f, 0x03, + 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5d, 0x0a, 0x86, 0xd0, 0xc8, 0x01, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0xcc, 0x55, 0x4d, 0x8f, 0xe4, 0x34, 0x10, 0xbd, 0xe7, 0x57, 0x78, 0xb2, 0x12, 0x38, 0x28, + 0xa4, 0xe1, 0xea, 0xde, 0x19, 0xb4, 0x0b, 0x23, 0xb1, 0x1c, 0x38, 0xec, 0x20, 0x2e, 0xa3, 0x51, 0xe4, 0x4e, 0xaa, 0x67, 0x0c, 0x8e, 0x9d, 0xb1, 0xcb, 0xdd, 0xdb, 0x6a, 0xe5, 0xbf, 0xa3, 0xb2, + 0x3d, 0xe9, 0xf4, 0x7c, 0x80, 0xb8, 0x20, 0x72, 0x49, 0xec, 0xfa, 0x7a, 0x7e, 0xf5, 0x2a, 0x0e, 0x1e, 0x58, 0xe7, 0x24, 0x82, 0x10, 0x9d, 0x35, 0x5b, 0x75, 0x2f, 0xc4, 0xcf, 0xd2, 0xf4, 0x1a, + 0xdc, 0x8f, 0x71, 0xb9, 0x2e, 0xc8, 0x43, 0x76, 0xa8, 0xbe, 0xb4, 0x7b, 0xd8, 0x08, 0x71, 0x04, 0xe7, 0xac, 0x13, 0xe2, 0x9a, 0x5e, 0x9f, 0x0c, 0x82, 0x33, 0x52, 0xdf, 0x80, 0xdb, 0x81, 0x8b, + 0x5b, 0x35, 0xdb, 0xc3, 0x66, 0x4a, 0x61, 0x9d, 0xb6, 0xa1, 0x87, 0x1d, 0x18, 0xf4, 0x14, 0x48, 0x1f, 0x42, 0xfc, 0x24, 0x51, 0xd6, 0xec, 0x9a, 0x16, 0xf9, 0xf5, 0x31, 0x28, 0xdd, 0x83, 0x3b, + 0x5f, 0xfd, 0xfe, 0xfd, 0x77, 0x39, 0x8b, 0xb6, 0xf7, 0x42, 0x28, 0xb3, 0xb5, 0x69, 0xe9, 0xc1, 0xf5, 0xd0, 0xfe, 0xe1, 0xad, 0x11, 0xe2, 0xb8, 0x75, 0x76, 0x68, 0xbd, 0x56, 0x1d, 0xd4, 0x2c, + 0x7d, 0xa3, 0xab, 0x19, 0x19, 0xa7, 0x75, 0x51, 0xac, 0x56, 0xec, 0xd3, 0x30, 0x6a, 0x18, 0xc0, 0x20, 0x3b, 0xd8, 0xe0, 0xd8, 0x36, 0x98, 0x0e, 0x95, 0x35, 0x5f, 0x7b, 0x4a, 0xab, 0x3a, 0xf6, + 0x00, 0x0e, 0x8a, 0x31, 0x6c, 0x98, 0xf4, 0x07, 0xd3, 0xb1, 0xad, 0x61, 0x0f, 0xf1, 0xf8, 0xbc, 0x60, 0x8c, 0xb1, 0x04, 0x39, 0x83, 0x8d, 0x3b, 0x99, 0x24, 0x16, 0xb9, 0xa0, 0xa3, 0xbc, 0x3f, + 0xa3, 0xeb, 0xaa, 0x2e, 0x2a, 0xf6, 0xed, 0x15, 0xfb, 0x0c, 0x3e, 0x68, 0x7c, 0x9f, 0x4f, 0xb9, 0xa0, 0x2f, 0x72, 0x74, 0xc5, 0x8e, 0x31, 0x19, 0x1d, 0xea, 0x82, 0x97, 0xb9, 0xca, 0x71, 0x2a, + 0xeb, 0x54, 0xb1, 0x5a, 0x17, 0xd1, 0xae, 0x01, 0x99, 0x32, 0x63, 0x40, 0x76, 0xc9, 0x06, 0x89, 0xdd, 0x43, 0x32, 0x37, 0xbd, 0x44, 0xc9, 0xab, 0x9c, 0x84, 0x9e, 0x1b, 0x3b, 0x00, 0x27, 0x34, + 0x42, 0x7c, 0x54, 0x46, 0xba, 0x03, 0xdf, 0x55, 0x15, 0xbb, 0xbc, 0x62, 0x27, 0x7e, 0xf8, 0xae, 0xfa, 0xa1, 0x7e, 0x2d, 0xe0, 0x06, 0x9d, 0x32, 0xf7, 0xe7, 0x01, 0xe8, 0xde, 0x74, 0xff, 0xc5, + 0x5b, 0xf3, 0xe4, 0xbc, 0x6b, 0xd0, 0xb6, 0x76, 0x6f, 0xa0, 0xe7, 0xd5, 0xc9, 0xf9, 0x57, 0x6b, 0x80, 0xac, 0xd4, 0x85, 0x0b, 0x7e, 0x64, 0xa5, 0x91, 0x03, 0x94, 0x22, 0x53, 0xd7, 0xd0, 0x8a, + 0x4d, 0xd9, 0x7f, 0xca, 0x27, 0x7d, 0xd6, 0x79, 0x21, 0x08, 0x07, 0x4f, 0x64, 0xcc, 0x89, 0x1b, 0x6f, 0x83, 0xeb, 0x80, 0x97, 0xd4, 0x45, 0xb1, 0x5a, 0xa5, 0x4e, 0xb9, 0x72, 0xe1, 0x81, 0x87, + 0x64, 0x6d, 0xe0, 0x8b, 0xa4, 0xce, 0x2f, 0x6d, 0x91, 0xb5, 0x52, 0x8e, 0xa3, 0x56, 0x9d, 0x24, 0x11, 0xac, 0x08, 0x61, 0x59, 0x9f, 0x80, 0x3e, 0x80, 0xd6, 0xb6, 0x14, 0x89, 0xf3, 0xdb, 0x84, + 0xfb, 0x8e, 0x4d, 0xd5, 0x22, 0xc9, 0x86, 0x30, 0xf2, 0xc5, 0xc6, 0x20, 0xc7, 0x16, 0x9c, 0xe3, 0x6f, 0xcd, 0x43, 0x55, 0x4c, 0x45, 0xf1, 0xee, 0xb6, 0xdb, 0xde, 0x73, 0x04, 0x8f, 0xd5, 0x5d, + 0x31, 0xd8, 0x9e, 0xd1, 0xa7, 0xcf, 0x0d, 0x8c, 0xa2, 0x0e, 0x23, 0x38, 0x21, 0xbe, 0xc9, 0x74, 0x6c, 0x4d, 0x66, 0x8b, 0x47, 0x35, 0xbd, 0x25, 0xb6, 0x85, 0x02, 0x66, 0x17, 0x21, 0x0c, 0xec, + 0xf9, 0x99, 0x9f, 0x10, 0x3d, 0x6c, 0x65, 0xd0, 0xc8, 0xf3, 0x49, 0xa6, 0x54, 0xe5, 0xdd, 0x6d, 0x12, 0xa6, 0x43, 0x21, 0x08, 0xd0, 0x5d, 0xdc, 0x9d, 0x07, 0x61, 0x27, 0xb5, 0xea, 0xdb, 0xc8, + 0xc5, 0x99, 0xd8, 0x48, 0x95, 0x43, 0x38, 0x29, 0xf3, 0x3a, 0xcd, 0xf5, 0x5c, 0x63, 0x3d, 0x7b, 0x46, 0x8f, 0xc6, 0x03, 0xb6, 0xff, 0xc4, 0xfd, 0x93, 0x46, 0xca, 0x8d, 0xb5, 0xe8, 0x0f, 0xe5, + 0x54, 0x2d, 0xd2, 0x50, 0x41, 0x07, 0x7e, 0x64, 0x97, 0x4f, 0xc3, 0x19, 0x13, 0xd7, 0x33, 0x47, 0x55, 0x23, 0xf7, 0x52, 0xe1, 0x29, 0x42, 0x7a, 0x0f, 0x0e, 0x2f, 0x38, 0x45, 0x35, 0xca, 0xb7, + 0xf6, 0x4f, 0xbe, 0x4c, 0x98, 0x66, 0x29, 0x1a, 0x83, 0xd9, 0x3b, 0x39, 0xf2, 0xea, 0xe5, 0x4c, 0xb1, 0x57, 0x74, 0x6f, 0x03, 0x8e, 0x01, 0x93, 0xf8, 0x53, 0x8d, 0x16, 0x1e, 0x2f, 0xf8, 0x13, + 0xea, 0x9a, 0x25, 0x87, 0xdb, 0xac, 0xa4, 0xbb, 0xc5, 0x54, 0xd0, 0xd3, 0x52, 0xdc, 0x28, 0x8d, 0xea, 0x2e, 0x96, 0x03, 0x33, 0xfd, 0x8b, 0xa6, 0x18, 0xfb, 0x46, 0x47, 0xce, 0x09, 0x7a, 0xde, + 0x93, 0xff, 0x11, 0x57, 0x7b, 0xeb, 0x74, 0xff, 0x5f, 0x50, 0xa5, 0x4c, 0x52, 0x70, 0xfc, 0x8b, 0x9c, 0xc1, 0x7d, 0x7e, 0xa5, 0x51, 0x70, 0xbc, 0xb7, 0x6a, 0xf6, 0x61, 0x1c, 0xa7, 0xf5, 0x0b, + 0xa9, 0xcb, 0x91, 0xb8, 0x25, 0x37, 0xba, 0x89, 0x14, 0xb6, 0x1e, 0xdc, 0x8e, 0x7e, 0xaa, 0x1f, 0xc6, 0x31, 0x0d, 0x5c, 0xd5, 0x38, 0x1b, 0x10, 0x78, 0xb9, 0x2a, 0xeb, 0x34, 0x8c, 0xa3, 0xf5, + 0xc8, 0xab, 0x06, 0x2d, 0x4f, 0x3d, 0xa9, 0x5e, 0x52, 0x9f, 0xfa, 0xf6, 0x38, 0xa7, 0xfe, 0x0d, 0x3c, 0x7e, 0x86, 0xc7, 0x10, 0x17, 0x39, 0x3e, 0x38, 0x45, 0x49, 0x29, 0x51, 0xeb, 0x92, 0x8d, + 0xbf, 0x3e, 0x1b, 0x29, 0x47, 0x27, 0xb5, 0x9e, 0xe1, 0x7d, 0x95, 0xc1, 0xd7, 0x54, 0xe6, 0xef, 0x3b, 0xef, 0x51, 0x62, 0xf0, 0xbc, 0x22, 0x09, 0x74, 0x5a, 0x81, 0xc1, 0x36, 0xde, 0xf4, 0xb3, + 0x18, 0xa6, 0x62, 0x2a, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa5, 0x45, 0xd6, 0x55, 0x19, 0x03, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x7c, 0x53, 0x4f, 0x6f, 0xdb, 0x3e, 0x0c, 0xbd, 0xfb, 0x53, 0x10, 0xfe, + 0x5d, 0x24, 0xc0, 0x3f, 0xa7, 0xbb, 0x15, 0xcc, 0xda, 0xa2, 0x1b, 0x02, 0x74, 0xd8, 0x9f, 0x14, 0x5d, 0x6f, 0xc3, 0x60, 0xa8, 0x31, 0x13, 0x0b, 0x75, 0x24, 0x83, 0x92, 0xed, 0x0d, 0x89, 0xbf, + 0xfb, 0x20, 0xcb, 0xf0, 0x92, 0x6c, 0x98, 0x7c, 0x10, 0x45, 0x91, 0x7a, 0x7c, 0x7c, 0x74, 0xeb, 0x08, 0xd4, 0xc6, 0xeb, 0x1f, 0x45, 0x4f, 0x2f, 0x88, 0x87, 0x9e, 0x5e, 0x32, 0xb8, 0x6f, 0x9a, + 0x0c, 0x1e, 0xbc, 0x6f, 0x9e, 0xc8, 0x35, 0xd6, 0x38, 0x8a, 0xa7, 0xaf, 0xc4, 0x1d, 0xf1, 0xb0, 0x4c, 0x42, 0x12, 0x99, 0xae, 0xa8, 0xed, 0x6e, 0x47, 0x8c, 0x78, 0x78, 0xd7, 0xea, 0xba, 0x24, + 0xce, 0x60, 0x65, 0xba, 0xe9, 0xde, 0xf9, 0x12, 0xf1, 0x90, 0x00, 0x40, 0x08, 0xcd, 0x46, 0x43, 0x5b, 0xc4, 0xc3, 0x8a, 0xd9, 0x86, 0xc8, 0xb0, 0x7d, 0xd4, 0xa6, 0xcc, 0xe0, 0x89, 0x5c, 0x5b, + 0xfb, 0x21, 0xc6, 0x98, 0x76, 0x8f, 0xf8, 0xa8, 0xd8, 0xd1, 0x07, 0xe3, 0x63, 0x6c, 0x32, 0x2c, 0x93, 0x64, 0x6f, 0x4b, 0xd8, 0x58, 0xb3, 0xd5, 0xbb, 0xe5, 0x68, 0x57, 0xca, 0x94, 0x35, 0xf1, + 0x32, 0x49, 0xfe, 0xfb, 0x76, 0x42, 0x60, 0xaf, 0xb4, 0xf9, 0x9e, 0x28, 0xf7, 0xd3, 0x6c, 0x60, 0x6b, 0x20, 0x1c, 0x85, 0x84, 0xff, 0x6f, 0x27, 0x90, 0xb7, 0x42, 0xde, 0x42, 0xac, 0x6a, 0xaa, + 0x19, 0x71, 0xcb, 0x76, 0x5f, 0x90, 0xe9, 0xc4, 0xca, 0x74, 0x88, 0x25, 0x6d, 0x55, 0x5b, 0x7b, 0x21, 0xf3, 0xc9, 0x2a, 0xb6, 0xba, 0xf6, 0xc4, 0x85, 0x65, 0x91, 0x6a, 0xb3, 0xb5, 0xd9, 0x8c, + 0x76, 0xd3, 0x2b, 0x36, 0xa9, 0x94, 0xb9, 0x36, 0xda, 0x0b, 0xb9, 0x4c, 0xc6, 0x77, 0x6b, 0xf2, 0xd0, 0x58, 0xf6, 0x70, 0x03, 0x7b, 0xe5, 0x37, 0x55, 0xa0, 0x8f, 0xd8, 0x29, 0x16, 0xe9, 0xe3, + 0xfa, 0xe9, 0x39, 0x95, 0x13, 0x7e, 0x58, 0xeb, 0x57, 0xd1, 0x49, 0xb8, 0xb9, 0x85, 0x6e, 0x76, 0x85, 0x95, 0x37, 0x81, 0xbf, 0x90, 0xe7, 0xce, 0xbd, 0x6a, 0x0a, 0x62, 0x16, 0x47, 0x42, 0x38, + 0x6b, 0xd0, 0x31, 0x36, 0x13, 0xd1, 0x50, 0x2f, 0xe6, 0xbe, 0x22, 0xae, 0x7d, 0x15, 0x34, 0xa1, 0xdc, 0xdb, 0xc2, 0x79, 0xd6, 0x66, 0x27, 0xa4, 0x94, 0x77, 0xd9, 0xfc, 0xec, 0x8a, 0x59, 0x14, + 0x23, 0xfe, 0xf5, 0xd5, 0xf5, 0x55, 0xf4, 0x0f, 0x13, 0x8d, 0xc5, 0x02, 0xde, 0x33, 0x29, 0x4f, 0xe0, 0x2b, 0x82, 0x87, 0xe7, 0xe7, 0x47, 0x70, 0xa3, 0xfe, 0xe3, 0xed, 0xef, 0x71, 0x88, 0xa8, + 0xc7, 0xe3, 0x09, 0xab, 0xfb, 0xa6, 0x89, 0xde, 0x0b, 0x02, 0x3d, 0xab, 0x46, 0x9c, 0x6a, 0xa5, 0xcb, 0xb2, 0xa6, 0x5e, 0x31, 0x21, 0x7e, 0x9a, 0x46, 0x69, 0x6e, 0xff, 0x45, 0x6e, 0x94, 0xbe, + 0x65, 0x12, 0xd1, 0x42, 0x9c, 0x3d, 0x17, 0x91, 0x6c, 0x5b, 0x4f, 0x22, 0x5d, 0xa4, 0x19, 0x8c, 0x28, 0x8d, 0x75, 0x41, 0x4d, 0x6f, 0xc5, 0x34, 0x32, 0x88, 0xd1, 0xb8, 0x84, 0xb8, 0x4c, 0xdc, + 0xd1, 0x94, 0x77, 0xfa, 0x27, 0x20, 0x7e, 0x26, 0x5f, 0xd9, 0xf2, 0x8b, 0xf5, 0xf7, 0x75, 0x6d, 0x7b, 0x2a, 0xff, 0xfe, 0xcc, 0x99, 0x2f, 0xac, 0x74, 0x51, 0x91, 0xaa, 0x7d, 0xb5, 0x38, 0x14, + 0x28, 0x98, 0x54, 0xa9, 0x0d, 0x39, 0x77, 0xac, 0x75, 0x47, 0xc1, 0x90, 0x43, 0x9a, 0xfd, 0x91, 0xf3, 0xaf, 0x32, 0xd6, 0xaf, 0xf2, 0x3c, 0x21, 0x96, 0x31, 0xc4, 0x2d, 0x7f, 0xd1, 0xa6, 0x14, + 0x22, 0xbd, 0xca, 0xc7, 0x2f, 0xcd, 0xc6, 0x91, 0x94, 0xf2, 0x2e, 0xde, 0xf6, 0x96, 0x5f, 0x89, 0x9d, 0x78, 0x33, 0x45, 0x73, 0x6b, 0x26, 0xb1, 0x72, 0xd5, 0x2b, 0xed, 0x93, 0x21, 0xf9, 0x15, + 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x94, 0x89, 0x68, 0xc1, 0x10, 0x02, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x2a, 0x49, 0x2c, 0x4a, 0x4f, 0x2d, 0xd1, 0xe7, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, + 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0xbc, 0x7d, + 0x4b, 0x6f, 0x9b, 0x4b, 0x8f, 0xe6, 0xfe, 0xfc, 0x8a, 0xe0, 0xf4, 0xb2, 0x8f, 0xf3, 0x15, 0x2f, 0x45, 0x56, 0x0d, 0xd0, 0xc0, 0x00, 0xb3, 0x9a, 0xfd, 0xec, 0x1a, 0x8d, 0x80, 0x64, 0x91, 0x8e, + 0xfa, 0xf8, 0x92, 0xb1, 0x9d, 0x73, 0xe9, 0x5f, 0x3f, 0x78, 0x65, 0x27, 0xb1, 0x65, 0xc9, 0xc9, 0xd7, 0x50, 0x66, 0x27, 0xc9, 0xaf, 0xed, 0xe2, 0xfd, 0xe1, 0xad, 0xf4, 0x2f, 0xef, 0xfe, 0xcf, + 0xc7, 0xdd, 0xfd, 0xbb, 0xda, 0x5d, 0xe5, 0xbb, 0xdd, 0xfd, 0x3b, 0xfb, 0xfc, 0x70, 0x7b, 0x6d, 0x0f, 0xbb, 0xb0, 0xab, 0xab, 0xbf, 0xdf, 0xfd, 0xcf, 0xcb, 0xbc, 0xc9, 0x3b, 0x7b, 0xc8, 0xf5, + 0xce, 0xff, 0x7e, 0xf7, 0xbf, 0xec, 0xee, 0xf2, 0xf6, 0xfd, 0x2f, 0xff, 0xf2, 0xee, 0x7f, 0x3f, 0x6c, 0x8f, 0xde, 0xdc, 0x3e, 0xbc, 0xdb, 0xdd, 0x3c, 0xe4, 0xcd, 0xca, 0xf5, 0xae, 0x6e, 0xef, + 0xde, 0x5d, 0xdb, 0xcd, 0x67, 0xbb, 0x7a, 0x97, 0x6b, 0xf7, 0xb0, 0xbb, 0xb9, 0x7c, 0xff, 0xcb, 0x1f, 0x79, 0x77, 0xbf, 0xbb, 0xbd, 0x79, 0xf7, 0x6f, 0xef, 0xe8, 0x97, 0x5f, 0xfe, 0xfd, 0xdf, + 0x3f, 0x59, 0xfc, 0x6e, 0x97, 0xf9, 0x1f, 0xff, 0xf1, 0xcb, 0x8d, 0x5d, 0xe7, 0xbb, 0x7f, 0x7b, 0xf7, 0xab, 0xc5, 0xc3, 0xee, 0xaf, 0x8b, 0xb8, 0x5d, 0x19, 0xbf, 0x3e, 0x7b, 0xfa, 0xd7, 0xf6, + 0xbe, 0xbf, 0x87, 0x5f, 0x7f, 0xb9, 0xbf, 0xfd, 0x7c, 0x17, 0xfb, 0x07, 0xef, 0xf2, 0x72, 0x77, 0xff, 0x70, 0xf7, 0xf7, 0xbf, 0x7e, 0x7c, 0x78, 0xf8, 0x74, 0xff, 0x3f, 0xfe, 0xf1, 0x8f, 0xcb, + 0xdd, 0xc3, 0xc7, 0xcf, 0xfe, 0x3e, 0x6e, 0xaf, 0xff, 0x71, 0xf7, 0xf9, 0xfe, 0xe1, 0xe2, 0xca, 0x6e, 0x2e, 0xff, 0x11, 0xdb, 0x49, 0xef, 0xdf, 0xef, 0x6e, 0x2f, 0x76, 0x37, 0x2b, 0xff, 0xfa, + 0xf5, 0x97, 0xf8, 0x98, 0xf1, 0xfb, 0xfd, 0xe7, 0xeb, 0xed, 0x4f, 0x08, 0xa8, 0x0d, 0x94, 0x91, 0xd4, 0x49, 0x2b, 0x61, 0x8d, 0x98, 0x69, 0x6b, 0x62, 0xaf, 0x30, 0x9e, 0x59, 0xc2, 0xad, 0x4d, + 0xd4, 0x4c, 0xf5, 0x40, 0xd1, 0xde, 0x72, 0xb6, 0x8c, 0x4c, 0xe0, 0x48, 0xf6, 0xf1, 0xeb, 0x2f, 0x2b, 0x3f, 0x6d, 0xb4, 0xde, 0xc4, 0x2e, 0xef, 0xdf, 0xfd, 0xdb, 0xbb, 0x7f, 0xff, 0xe5, 0xdd, + 0xaf, 0xbe, 0x7b, 0xa8, 0x2b, 0xbb, 0xbc, 0xff, 0xf5, 0xb7, 0xed, 0xcd, 0xdf, 0x0f, 0xf9, 0xf8, 0xaa, 0x3e, 0x3f, 0x7c, 0xbe, 0xcb, 0xfb, 0x8b, 0xb8, 0xbd, 0xcb, 0x17, 0x1f, 0xdc, 0xef, 0x6e, + 0x7e, 0xdf, 0x7f, 0x70, 0x9d, 0xd7, 0xf1, 0xf1, 0x6e, 0xff, 0xf2, 0xd3, 0xee, 0xe6, 0xe2, 0xd3, 0xdd, 0xed, 0x7f, 0x66, 0x3c, 0x5c, 0x5c, 0xed, 0x1e, 0x1e, 0x7f, 0xe1, 0xe1, 0xf6, 0xf7, 0xdd, + 0xed, 0xb7, 0x57, 0x17, 0x9f, 0x1f, 0x76, 0x57, 0x8f, 0x6f, 0xef, 0x2c, 0x76, 0x37, 0x97, 0xbf, 0xfe, 0xf6, 0xcb, 0x7f, 0xbc, 0xc5, 0xd3, 0x8d, 0x4f, 0x2f, 0x58, 0x4a, 0xef, 0xe9, 0xec, 0x2c, + 0x0d, 0x6c, 0x3a, 0x91, 0xa5, 0x4f, 0x09, 0x18, 0xce, 0x46, 0x94, 0xa8, 0x6c, 0x09, 0x2d, 0x5a, 0xf6, 0x26, 0x40, 0xc5, 0x8b, 0xd0, 0x18, 0xe6, 0xc8, 0x36, 0x43, 0x7d, 0x92, 0x2a, 0x34, 0xa0, + 0xca, 0xa5, 0x7c, 0x94, 0xa5, 0xcf, 0x75, 0xe2, 0xb7, 0xaf, 0xef, 0xef, 0x1e, 0x9e, 0xbd, 0xb9, 0xcf, 0xbb, 0x3f, 0x76, 0x91, 0xcf, 0x3e, 0xd9, 0xd8, 0xf3, 0xc8, 0x7a, 0xfb, 0x68, 0xf7, 0x1f, + 0xdf, 0xb5, 0xf7, 0xe3, 0x3d, 0x3d, 0x0a, 0xc5, 0xee, 0x53, 0xf8, 0xf1, 0xe5, 0x0b, 0x61, 0xdd, 0xdd, 0x3e, 0x5c, 0xed, 0x0e, 0xe4, 0xb6, 0x7f, 0xf5, 0x70, 0xf7, 0xc8, 0xdf, 0x77, 0xbf, 0xae, + 0xbc, 0xdb, 0xfd, 0x91, 0x1f, 0xae, 0xbf, 0x48, 0x31, 0x6f, 0xe2, 0x76, 0xed, 0x6e, 0x2e, 0x3f, 0xdc, 0x3d, 0x89, 0xf9, 0xca, 0x1e, 0x12, 0x8f, 0x4b, 0xfc, 0xe3, 0xe3, 0xe7, 0x7b, 0x39, 0x7c, + 0x79, 0x61, 0x77, 0xf7, 0xf9, 0xf5, 0xcd, 0xb2, 0x27, 0x51, 0xef, 0x1e, 0x6e, 0x6d, 0xff, 0x62, 0x63, 0xf8, 0x67, 0xbb, 0xcc, 0x8b, 0x87, 0x2f, 0x87, 0xbc, 0xba, 0x0d, 0xbb, 0xba, 0x88, 0x8f, + 0x76, 0x73, 0x93, 0x8f, 0xe2, 0xbf, 0xde, 0x5d, 0x3f, 0xfe, 0xd6, 0xa7, 0xbc, 0x8b, 0xbc, 0x79, 0xb8, 0xf8, 0x72, 0xa6, 0xd3, 0xaa, 0x74, 0x67, 0x37, 0x6b, 0xff, 0xe2, 0xfe, 0xa3, 0xc1, 0xe3, + 0x8b, 0x6b, 0xbb, 0xba, 0xfa, 0xe3, 0x89, 0xbf, 0x3f, 0xa0, 0x69, 0xef, 0x7e, 0xfd, 0xaf, 0xfb, 0x87, 0xf5, 0x3d, 0x95, 0xbb, 0xb6, 0xb8, 0xbb, 0xbd, 0x3f, 0xb0, 0x63, 0x7c, 0x4f, 0x67, 0x56, + 0x3a, 0x96, 0x6e, 0x02, 0x8a, 0x51, 0x32, 0x7d, 0x4a, 0x9b, 0xa0, 0x03, 0xa0, 0x21, 0xae, 0x51, 0x38, 0x3d, 0x9a, 0x6b, 0x19, 0xd0, 0x1c, 0x1e, 0x5c, 0x3a, 0x9c, 0x82, 0x45, 0x44, 0x69, 0x39, + 0x20, 0x90, 0xcb, 0x51, 0xa5, 0xfb, 0xbf, 0x9f, 0x6f, 0x9f, 0xb8, 0x75, 0xff, 0xf7, 0xcd, 0xf7, 0x08, 0xbd, 0xbb, 0xfd, 0xfc, 0x90, 0x77, 0x3f, 0xdd, 0x61, 0x2d, 0x91, 0x2a, 0x5e, 0xc8, 0xba, + 0xd0, 0x41, 0xda, 0x10, 0x28, 0xc3, 0x21, 0xc2, 0x5d, 0x73, 0x74, 0x6d, 0x32, 0x88, 0x3a, 0xea, 0xe0, 0x96, 0x0c, 0x44, 0x35, 0x8a, 0xa7, 0x19, 0x23, 0x19, 0x0d, 0x9d, 0xf3, 0xb8, 0xc3, 0x7a, + 0xa9, 0xe1, 0x5f, 0xd5, 0xf3, 0x2e, 0x2f, 0xf3, 0xaf, 0x47, 0x06, 0xe4, 0xdd, 0xca, 0x03, 0x05, 0x78, 0x9b, 0x1d, 0x0f, 0x2f, 0x58, 0x81, 0xef, 0xc7, 0xfb, 0x76, 0x66, 0x56, 0x40, 0x47, 0xe9, + 0x2e, 0x3e, 0x12, 0x89, 0x55, 0xb4, 0xa5, 0x93, 0x50, 0xb0, 0x56, 0x8c, 0xd0, 0x8e, 0x6d, 0x73, 0x3e, 0x3c, 0x27, 0x3b, 0x2a, 0x4c, 0x2c, 0xe2, 0x5e, 0xe1, 0xa9, 0x4d, 0x47, 0xe3, 0xa2, 0x7c, + 0xc3, 0xd1, 0x3c, 0x69, 0xed, 0x51, 0x1b, 0xfe, 0x62, 0x1a, 0x6f, 0x92, 0xbf, 0x39, 0xa3, 0x03, 0x6d, 0xc0, 0xf7, 0x78, 0x76, 0x16, 0x50, 0x0e, 0x01, 0x32, 0xed, 0x6b, 0xf5, 0x16, 0xc1, 0xbd, + 0x58, 0x29, 0x32, 0x29, 0x88, 0x57, 0x9f, 0xb9, 0x44, 0x35, 0x5a, 0xa9, 0x33, 0xf3, 0x68, 0x91, 0xe4, 0x63, 0xd3, 0x1c, 0x5d, 0xd1, 0x61, 0x12, 0xea, 0x1b, 0x2c, 0xf8, 0x61, 0xdf, 0x7a, 0x32, + 0xac, 0x7d, 0xf5, 0x19, 0xd7, 0x4f, 0xae, 0xe4, 0xe6, 0xf3, 0xf5, 0x87, 0xf8, 0xf4, 0xf9, 0xf1, 0xd7, 0xee, 0x6f, 0xe3, 0xf7, 0x7c, 0xc0, 0x43, 0x6f, 0xf3, 0x63, 0xda, 0xf5, 0xe5, 0x3c, 0x2f, + 0xf9, 0xdb, 0xde, 0xe3, 0xb9, 0xf9, 0xeb, 0x63, 0xf2, 0x64, 0xa8, 0x01, 0x23, 0x6a, 0x85, 0x46, 0x04, 0xfb, 0x4c, 0x69, 0x65, 0x9a, 0x9d, 0xbc, 0x37, 0x46, 0xc3, 0x1c, 0x5d, 0x14, 0xb5, 0xd5, + 0x04, 0xd6, 0xd5, 0xfb, 0x84, 0x31, 0x89, 0x94, 0xec, 0x28, 0x7f, 0x5f, 0x31, 0xec, 0x93, 0xdd, 0x3f, 0xf9, 0x99, 0x23, 0xae, 0xfa, 0x4d, 0x3e, 0x3c, 0x4a, 0xe1, 0x65, 0x44, 0x6f, 0x67, 0xf7, + 0x39, 0x63, 0x18, 0xac, 0x58, 0x55, 0xc0, 0x22, 0x49, 0x81, 0x3c, 0x46, 0x42, 0x78, 0x0f, 0x12, 0x53, 0x18, 0x88, 0xda, 0x9b, 0x2d, 0xa6, 0x41, 0x73, 0x92, 0xd6, 0xe8, 0x0b, 0x8b, 0xd7, 0xac, + 0xe1, 0xda, 0xfa, 0x3a, 0x0e, 0x92, 0x1e, 0xa3, 0xd8, 0x9f, 0xf6, 0x7b, 0x9e, 0x04, 0x3c, 0x6f, 0x92, 0xfe, 0x67, 0xfa, 0x0b, 0xc2, 0xf9, 0x67, 0x40, 0x99, 0x45, 0xe1, 0x8c, 0x35, 0xbb, 0x88, + 0x39, 0xa8, 0x24, 0x64, 0x35, 0x1f, 0x4e, 0x36, 0xa6, 0x74, 0x9c, 0x4d, 0xd0, 0x39, 0x2b, 0xc4, 0xb3, 0x01, 0x52, 0x63, 0x69, 0xb3, 0x4f, 0xe0, 0xe0, 0x80, 0x98, 0xc7, 0xa3, 0xca, 0x71, 0x28, + 0xf3, 0xd5, 0xe7, 0xbe, 0x72, 0x40, 0x2f, 0xc2, 0xcb, 0x6f, 0xa7, 0xed, 0xf3, 0xc5, 0x4f, 0xdf, 0x04, 0x43, 0x5f, 0xf8, 0xb7, 0x3f, 0xc4, 0x65, 0xde, 0x3c, 0x7e, 0xfa, 0x04, 0x91, 0xf4, 0xbd, + 0xec, 0xdf, 0x9f, 0xc4, 0x3f, 0x51, 0x97, 0x17, 0xbb, 0x7a, 0x7c, 0x79, 0x7b, 0xfb, 0xfb, 0xee, 0xf1, 0x9f, 0x7c, 0x17, 0x15, 0x7d, 0xd7, 0x4b, 0x7c, 0xe5, 0xc0, 0x9b, 0xd0, 0xe7, 0xf2, 0xc9, + 0xa3, 0x3c, 0x01, 0x9e, 0xdb, 0x9b, 0xc8, 0x0f, 0x91, 0x57, 0x57, 0xa7, 0x74, 0xe8, 0x78, 0x10, 0xdb, 0xbf, 0xfa, 0xf0, 0x9f, 0xf7, 0xb7, 0x37, 0xcf, 0xde, 0x7e, 0xbe, 0xbb, 0xda, 0x9f, 0x3a, + 0x9f, 0x80, 0xd1, 0x73, 0x3c, 0xf4, 0xc2, 0x5b, 0x7d, 0xf9, 0xe7, 0x9f, 0xef, 0xae, 0x7e, 0x40, 0x4b, 0xbf, 0x72, 0xf9, 0xa5, 0xb6, 0x9e, 0x3f, 0x18, 0x20, 0x0a, 0x82, 0x34, 0x53, 0x4b, 0x9c, + 0x49, 0x0c, 0xbd, 0x77, 0x36, 0x2a, 0xa8, 0x68, 0x1c, 0x2a, 0xec, 0xd0, 0xb9, 0x05, 0x80, 0x98, 0x75, 0x64, 0x19, 0x84, 0x6d, 0x34, 0x1d, 0xae, 0xa6, 0xdd, 0xe3, 0x38, 0x34, 0x78, 0xa5, 0x7d, + 0x9f, 0xee, 0x6e, 0xe3, 0x51, 0x3d, 0x1f, 0xb9, 0xf1, 0xa3, 0x20, 0x69, 0x5d, 0x1d, 0xc4, 0x43, 0xf8, 0x09, 0xfe, 0xba, 0x50, 0xb0, 0x81, 0x34, 0x8e, 0xa1, 0x0e, 0xd9, 0xc0, 0x17, 0xad, 0x39, + 0x6a, 0xac, 0xbe, 0xa6, 0x8d, 0x0a, 0xf7, 0x01, 0x3d, 0x47, 0xe4, 0x72, 0x86, 0xaa, 0x08, 0x4f, 0x67, 0xaf, 0x3e, 0xc9, 0xa8, 0x57, 0xfe, 0x7a, 0xe2, 0xf0, 0x9b, 0x6d, 0x1c, 0x40, 0xbb, 0xcd, + 0x4e, 0xce, 0x7c, 0xf8, 0xf0, 0x0e, 0xd6, 0x64, 0xf6, 0x35, 0x6a, 0xd0, 0x70, 0xc8, 0x6c, 0x6d, 0x3a, 0x95, 0x97, 0x88, 0x2f, 0x6b, 0x3a, 0x62, 0x09, 0xf7, 0xd9, 0xb0, 0xa1, 0x0d, 0x61, 0x1b, + 0x45, 0x39, 0x82, 0x09, 0x7a, 0xf0, 0xf1, 0x60, 0x7e, 0x99, 0x0f, 0x1b, 0xd4, 0xbf, 0xbd, 0x3e, 0x62, 0x2e, 0x4f, 0xf4, 0x7c, 0xd8, 0x1f, 0xe2, 0x0d, 0xd1, 0x1d, 0xa1, 0x7e, 0x9c, 0x1d, 0xc1, + 0x63, 0xcc, 0x59, 0xc2, 0x0b, 0xb2, 0x09, 0x8f, 0x51, 0x82, 0xad, 0x26, 0xa1, 0xa8, 0x26, 0xb2, 0x87, 0x24, 0x8e, 0xa9, 0x7d, 0xe0, 0x1c, 0x8d, 0x19, 0x2c, 0x67, 0x33, 0x51, 0x60, 0xe8, 0xbe, + 0x34, 0x03, 0xeb, 0x28, 0xf5, 0xcf, 0x7c, 0xd5, 0x59, 0x18, 0x71, 0xbb, 0xf9, 0x2f, 0xbb, 0xdf, 0xc5, 0xef, 0x3f, 0x5d, 0x95, 0x99, 0x4a, 0xc2, 0xc1, 0x0b, 0x11, 0x1b, 0x76, 0xe2, 0x06, 0x3a, + 0x8a, 0x06, 0x06, 0xa3, 0x14, 0x90, 0x76, 0x75, 0x9c, 0xd2, 0x72, 0x4c, 0xd5, 0xb9, 0x2a, 0x9c, 0x60, 0x06, 0x61, 0x67, 0xb4, 0x6e, 0x0c, 0x47, 0xf9, 0xf1, 0xb5, 0xc0, 0x70, 0x8a, 0xc2, 0xab, + 0xab, 0xdb, 0xb8, 0xb8, 0xb9, 0xbd, 0xb8, 0x7f, 0x58, 0x57, 0x3b, 0x7f, 0x85, 0xaf, 0xf8, 0xcc, 0x44, 0x46, 0xa8, 0x3b, 0x08, 0x66, 0xd0, 0x5c, 0xbc, 0xc5, 0xd8, 0xb0, 0x11, 0xaa, 0x5e, 0x8a, + 0x39, 0x66, 0xeb, 0xd4, 0x3d, 0x63, 0x81, 0x76, 0x70, 0xe7, 0x5e, 0xc2, 0xd1, 0xa7, 0x6e, 0xc6, 0x1b, 0x23, 0xc4, 0xe9, 0x94, 0xbd, 0xee, 0xc9, 0x38, 0x42, 0xc3, 0x96, 0x7a, 0x9e, 0x5b, 0x50, + 0x93, 0xcb, 0xc7, 0x86, 0x80, 0x18, 0x42, 0x11, 0x70, 0xa6, 0x77, 0x70, 0x5d, 0x8d, 0x10, 0x03, 0xa7, 0x0f, 0x1a, 0x6a, 0x8d, 0x86, 0x00, 0xaa, 0xc2, 0xf0, 0x36, 0x85, 0x71, 0x62, 0x03, 0xeb, + 0x4b, 0x32, 0x4e, 0xa4, 0x21, 0x07, 0x82, 0x38, 0x2d, 0xb1, 0xcf, 0x0f, 0xb7, 0x51, 0x97, 0x07, 0xea, 0x08, 0x67, 0x0f, 0x2e, 0x8b, 0x65, 0x8c, 0x86, 0xbe, 0xc1, 0xa0, 0xf0, 0x68, 0x11, 0x5d, + 0x7b, 0x4e, 0x6f, 0x9d, 0x8a, 0x21, 0x15, 0xcd, 0x48, 0xbc, 0x4c, 0x5c, 0xab, 0xf7, 0xa4, 0x8e, 0xb3, 0xca, 0x98, 0x40, 0xc0, 0xa7, 0x96, 0x9d, 0x90, 0xd4, 0x53, 0x21, 0xe6, 0x40, 0x46, 0x70, + 0x76, 0x21, 0x49, 0xe3, 0xcd, 0x7c, 0x24, 0x7a, 0x20, 0x54, 0xc3, 0x15, 0xbd, 0x77, 0x1d, 0x3c, 0xa0, 0xe5, 0x2a, 0x1f, 0x63, 0x11, 0x5b, 0x60, 0x28, 0x39, 0xa6, 0x25, 0xb4, 0x29, 0xbd, 0x0b, + 0xcf, 0xcc, 0x2d, 0x9f, 0xa2, 0x75, 0xea, 0xf8, 0x5f, 0x8a, 0x47, 0x2f, 0xd9, 0x4f, 0x67, 0x3f, 0xbf, 0x67, 0xd1, 0x58, 0xdc, 0x41, 0x28, 0xb0, 0x60, 0xad, 0x6c, 0x93, 0x4d, 0x57, 0x2d, 0xa2, + 0x88, 0xea, 0xb3, 0xc7, 0xc4, 0xd9, 0x7a, 0x8c, 0x2d, 0xe1, 0xaf, 0x15, 0x30, 0x56, 0x93, 0x72, 0x68, 0xb4, 0x29, 0xdd, 0x49, 0xf6, 0x5f, 0xdd, 0xc6, 0xef, 0x17, 0xfe, 0xb9, 0xea, 0x55, 0xe9, + 0x02, 0xce, 0x6f, 0xed, 0xb4, 0x05, 0x30, 0x15, 0x9c, 0x2e, 0xb8, 0xa8, 0x1a, 0xd3, 0xec, 0xa0, 0x65, 0x34, 0x79, 0x4e, 0xb1, 0xb0, 0x88, 0x1e, 0x1e, 0x13, 0xa2, 0x1b, 0xb6, 0x35, 0x42, 0xfa, + 0x48, 0x55, 0xf3, 0xd5, 0x1b, 0x99, 0x1e, 0x77, 0x69, 0xfb, 0x5a, 0xf4, 0x2e, 0x2e, 0xec, 0xee, 0xce, 0xfe, 0x3e, 0x6d, 0x27, 0x4f, 0x95, 0xbd, 0xc3, 0xe2, 0xe7, 0xb9, 0x49, 0x34, 0xb0, 0xe6, + 0xb0, 0x3c, 0x62, 0x6c, 0x28, 0x8c, 0x70, 0x0a, 0x42, 0x8d, 0xc5, 0xd5, 0xd6, 0xa0, 0xae, 0x43, 0x03, 0x82, 0x86, 0x3b, 0x70, 0x83, 0xa9, 0xd3, 0x79, 0x2e, 0x20, 0x6f, 0x4e, 0xad, 0x57, 0xc9, + 0xf1, 0x54, 0xe9, 0xb5, 0x33, 0x38, 0x70, 0x71, 0xbf, 0x7d, 0x2d, 0x5d, 0x5e, 0xac, 0x8c, 0xdb, 0xeb, 0x4f, 0x77, 0x79, 0x7f, 0x7f, 0xfb, 0x86, 0x9f, 0x3f, 0xf6, 0xf0, 0x4b, 0x5f, 0x7f, 0x7e, + 0xd6, 0xb0, 0x4b, 0x17, 0xa8, 0x45, 0x35, 0x66, 0x37, 0x80, 0x1c, 0xa5, 0x68, 0x85, 0xe1, 0xba, 0x10, 0xb3, 0x0d, 0x12, 0xf1, 0xf4, 0x40, 0x17, 0xef, 0x5a, 0xaa, 0xcc, 0xc1, 0xbe, 0x0c, 0xb5, + 0x11, 0x2b, 0x9f, 0xa8, 0x0b, 0x7f, 0x9f, 0x35, 0xa7, 0x58, 0xb0, 0xcf, 0x6f, 0x5e, 0xda, 0x2d, 0x9f, 0xdd, 0x6d, 0x8e, 0xe9, 0x58, 0x0b, 0xad, 0xad, 0xd8, 0x0c, 0x58, 0xa7, 0x42, 0x22, 0x4c, + 0x76, 0x71, 0xc9, 0x74, 0x73, 0xee, 0x96, 0x0d, 0x9a, 0x28, 0x77, 0x31, 0xad, 0x35, 0x69, 0xf5, 0xce, 0x6a, 0x02, 0xae, 0xcd, 0x4f, 0x01, 0xd2, 0x67, 0x29, 0xd9, 0xa1, 0xe7, 0x39, 0x37, 0x05, + 0x48, 0x23, 0x79, 0x0c, 0x51, 0x69, 0x6b, 0x8e, 0xe0, 0x1a, 0x73, 0x92, 0xb4, 0x18, 0xc4, 0x65, 0x93, 0x52, 0x30, 0x4a, 0x4b, 0x11, 0x2c, 0x28, 0x70, 0x19, 0x69, 0x0f, 0x5f, 0xc5, 0x3e, 0x44, + 0xa7, 0xd9, 0xf1, 0xf0, 0xf6, 0x25, 0xb9, 0x3c, 0x21, 0x9b, 0x88, 0x57, 0xf0, 0x4a, 0xe7, 0x99, 0xe9, 0xea, 0x6d, 0x51, 0xdb, 0x12, 0xf8, 0x2d, 0x30, 0xc3, 0x9a, 0xdd, 0x93, 0x16, 0xeb, 0xec, + 0x44, 0xce, 0x7d, 0xd4, 0x50, 0x9e, 0xe4, 0xd4, 0x8c, 0xbd, 0x97, 0x4e, 0x93, 0xa6, 0xcb, 0x47, 0xf5, 0x05, 0x60, 0x36, 0xe1, 0x38, 0xde, 0xfc, 0xcf, 0x5b, 0xff, 0x9a, 0x8a, 0x9f, 0xa2, 0xed, + 0x11, 0x92, 0x1e, 0xd2, 0x77, 0x6e, 0xb1, 0xb9, 0x15, 0xac, 0x64, 0xa2, 0xa9, 0x02, 0x7d, 0x0c, 0x8f, 0x26, 0x30, 0x93, 0xb6, 0xd8, 0x0d, 0xd8, 0x32, 0xfb, 0xc0, 0x74, 0x57, 0xf6, 0x4e, 0xce, + 0x59, 0x5e, 0x3a, 0x01, 0xd4, 0x17, 0x2e, 0xe3, 0x56, 0xa7, 0x02, 0x5e, 0xdc, 0xde, 0xfc, 0x91, 0x77, 0x0f, 0x1f, 0xc2, 0xee, 0xf3, 0x20, 0x60, 0x9c, 0xdf, 0x78, 0x04, 0xb9, 0xaf, 0x3e, 0x8d, + 0x72, 0xa0, 0x69, 0x05, 0x82, 0x46, 0x1f, 0x38, 0x4c, 0x64, 0xe2, 0xf2, 0x90, 0x55, 0x2e, 0x64, 0x2d, 0x46, 0xcc, 0xc6, 0xb3, 0x6f, 0xae, 0x56, 0x7d, 0x6e, 0x56, 0xd6, 0xd8, 0xda, 0x29, 0xe3, + 0x79, 0xaa, 0x5a, 0x1c, 0x84, 0x3b, 0x39, 0x7b, 0xcc, 0xce, 0xd1, 0x67, 0xac, 0xae, 0xab, 0x29, 0xb4, 0x35, 0xb3, 0x49, 0xd0, 0x00, 0xef, 0xbd, 0x45, 0x93, 0x54, 0x99, 0x13, 0x59, 0xd1, 0x46, + 0xc8, 0xea, 0xa8, 0x96, 0xb1, 0xb0, 0x42, 0x94, 0x56, 0x04, 0x12, 0x94, 0x1f, 0xd5, 0xb0, 0xa3, 0x1d, 0x9e, 0xaf, 0x15, 0x89, 0x1f, 0x4c, 0x64, 0xe2, 0xd3, 0xe7, 0x4a, 0xdb, 0xd7, 0x5f, 0x5e, + 0xc1, 0x63, 0x3d, 0x33, 0x17, 0x28, 0x39, 0x20, 0xcd, 0xb0, 0x01, 0x06, 0xab, 0x67, 0xb8, 0xdb, 0xc2, 0x0d, 0x47, 0x76, 0x1e, 0x1c, 0x68, 0x83, 0x17, 0xc0, 0xe8, 0xde, 0x45, 0xca, 0x31, 0xa2, + 0xfb, 0xd0, 0xa6, 0xc4, 0xb4, 0x2a, 0xfb, 0x89, 0xe2, 0xe1, 0xce, 0xe3, 0x0d, 0xf2, 0xee, 0x82, 0xb0, 0xec, 0xfe, 0xe1, 0xe7, 0xc3, 0xb2, 0xce, 0xcd, 0xd7, 0xf0, 0x18, 0xd0, 0x16, 0x8d, 0xd1, + 0x43, 0xd2, 0x26, 0x24, 0x36, 0x18, 0xd4, 0xb0, 0x64, 0xb8, 0xb9, 0x6d, 0x49, 0x81, 0x39, 0xe5, 0x18, 0x45, 0x48, 0x63, 0x66, 0x4e, 0xd2, 0x36, 0x46, 0x5b, 0x6f, 0x27, 0xad, 0x27, 0xc9, 0xfb, + 0xfb, 0xd3, 0xc3, 0x96, 0x89, 0x5e, 0x5f, 0xdf, 0xde, 0x1c, 0xaa, 0xf1, 0xd9, 0xab, 0x12, 0xe0, 0xe5, 0x80, 0xbd, 0x61, 0x51, 0x05, 0x4b, 0x84, 0x81, 0x7b, 0x07, 0x0b, 0x1c, 0xab, 0xe6, 0x12, + 0x18, 0x6b, 0x00, 0xc5, 0x0a, 0x5a, 0x58, 0xd8, 0x7d, 0x56, 0xaa, 0x76, 0x23, 0xb6, 0x42, 0xf1, 0x2d, 0x45, 0xfb, 0x01, 0xd0, 0xf6, 0xee, 0xd7, 0x87, 0xbf, 0x3f, 0xe5, 0xcd, 0xe7, 0xeb, 0xd3, + 0x54, 0x3f, 0x2f, 0x30, 0xbe, 0xa4, 0x79, 0xce, 0xf7, 0x70, 0x6e, 0xad, 0xdd, 0x72, 0xba, 0x4d, 0xa4, 0xcd, 0x34, 0x60, 0x76, 0xaa, 0x09, 0x44, 0xbc, 0x52, 0x91, 0x59, 0x09, 0x2a, 0xa8, 0x28, + 0xa0, 0x2d, 0xad, 0x04, 0x21, 0xa2, 0x61, 0xb4, 0x91, 0x2e, 0xdc, 0xa6, 0x34, 0xc2, 0xe3, 0x50, 0xf5, 0x85, 0xf3, 0x7c, 0xbb, 0x96, 0xb6, 0x1d, 0x33, 0x3e, 0x3c, 0x91, 0xf9, 0xfd, 0xea, 0xda, + 0xda, 0x5d, 0xe6, 0x81, 0xba, 0xef, 0x11, 0xfc, 0xb9, 0xd9, 0x32, 0x73, 0x4d, 0xc3, 0xb1, 0xb9, 0xd9, 0x98, 0xae, 0x5d, 0x25, 0x05, 0x78, 0xd3, 0x72, 0x81, 0x6e, 0x22, 0xd6, 0x63, 0x44, 0xad, + 0x2a, 0x46, 0xc6, 0x66, 0xda, 0xcc, 0x06, 0x6a, 0x03, 0x23, 0x87, 0xc4, 0x89, 0xc7, 0xc1, 0xc0, 0xf3, 0x24, 0x64, 0x23, 0xf5, 0xa5, 0x82, 0x9f, 0x24, 0xfa, 0x79, 0x89, 0xf9, 0x55, 0x75, 0xea, + 0xdc, 0x96, 0xde, 0x14, 0x8c, 0xa0, 0x38, 0x73, 0x74, 0x6e, 0x44, 0xda, 0xbc, 0x0f, 0x0b, 0x53, 0x96, 0x6a, 0xd0, 0x18, 0x72, 0xa5, 0x54, 0xdb, 0xe0, 0x2a, 0x6d, 0x3a, 0x60, 0xab, 0x35, 0xc8, + 0x15, 0xe8, 0x0a, 0x4e, 0xf3, 0x38, 0x7a, 0xfd, 0x9e, 0xa5, 0xe7, 0xcd, 0x1f, 0x1f, 0xae, 0x6e, 0x2f, 0x2f, 0x8f, 0x25, 0x67, 0xe7, 0x0e, 0xb6, 0xa3, 0xc7, 0x32, 0x17, 0x1b, 0xd3, 0x22, 0x4a, + 0x44, 0x89, 0x6c, 0x75, 0x03, 0x99, 0x64, 0xbc, 0x22, 0x72, 0x89, 0x65, 0x95, 0xb0, 0x34, 0x74, 0x21, 0xee, 0xd4, 0xd6, 0x52, 0x0a, 0x28, 0xca, 0x9c, 0xd5, 0x8e, 0x12, 0xf8, 0xf1, 0xf3, 0xb5, + 0xdd, 0x7c, 0x8d, 0x4e, 0xbb, 0xfb, 0x8b, 0x87, 0xbc, 0xbb, 0xde, 0xdd, 0xd8, 0xd5, 0x8b, 0x6a, 0xfe, 0xb7, 0x0a, 0xfd, 0xf6, 0xe3, 0xb8, 0xbd, 0x7a, 0x2b, 0x75, 0xc9, 0xbb, 0xbb, 0x9b, 0xdb, + 0x03, 0x76, 0x9c, 0xbf, 0xf3, 0xc3, 0x1e, 0x95, 0x41, 0xa6, 0xad, 0xa6, 0xc6, 0x14, 0x0c, 0x6a, 0xea, 0xb8, 0x30, 0xba, 0x24, 0xf5, 0x11, 0x05, 0xab, 0x35, 0xef, 0x7d, 0x2c, 0x65, 0x14, 0xf4, + 0x5e, 0x13, 0x67, 0xe6, 0x88, 0xd0, 0x3c, 0xd5, 0xf8, 0xdb, 0x1f, 0xfd, 0x62, 0xdd, 0xd9, 0xe5, 0xed, 0x4d, 0x5d, 0x3d, 0xfa, 0xbd, 0xa7, 0x48, 0xf6, 0xee, 0xd7, 0x3f, 0x77, 0x37, 0xeb, 0xf6, + 0xcf, 0xfb, 0x8b, 0xfb, 0xbf, 0xdf, 0x00, 0xc6, 0x87, 0x7f, 0xe1, 0xd0, 0xf9, 0x9f, 0x5b, 0xeb, 0xcd, 0x64, 0x14, 0x38, 0xa0, 0x0a, 0x97, 0xf9, 0x98, 0xbc, 0x50, 0x7b, 0x5f, 0xd8, 0x61, 0x68, + 0xe7, 0x54, 0x70, 0xae, 0x35, 0x5a, 0x46, 0xf9, 0x40, 0x54, 0x60, 0x03, 0x6c, 0x12, 0x68, 0xe6, 0x34, 0xfd, 0x44, 0x51, 0x36, 0x9e, 0x53, 0x7e, 0x82, 0xd2, 0xa7, 0x29, 0x9a, 0x57, 0x55, 0xd6, + 0x73, 0x87, 0x37, 0xf2, 0xc9, 0x38, 0x59, 0xdb, 0x44, 0x5a, 0x39, 0x72, 0x84, 0x2f, 0x5e, 0xb8, 0xa2, 0x03, 0x75, 0xea, 0xdc, 0x9a, 0xb3, 0x53, 0x65, 0x35, 0x82, 0x59, 0xde, 0x83, 0x13, 0xaa, + 0x6f, 0xbe, 0xcd, 0xb3, 0x94, 0x8f, 0x87, 0xb7, 0x6f, 0x00, 0xe4, 0xb7, 0x7d, 0xb3, 0xea, 0x66, 0xf7, 0x5f, 0x1f, 0x6e, 0xff, 0xda, 0xad, 0x37, 0x9a, 0x9a, 0x75, 0xf3, 0xc7, 0xeb, 0x9c, 0xe7, + 0xdc, 0xb4, 0xd6, 0xcc, 0x8c, 0x09, 0x63, 0x51, 0x21, 0x37, 0x99, 0x2b, 0xc3, 0xa7, 0x15, 0xf4, 0xce, 0x61, 0x4b, 0x63, 0x8c, 0x96, 0xb8, 0x0c, 0xd9, 0xa6, 0xd5, 0x1a, 0x9b, 0x7f, 0x6b, 0xad, + 0x75, 0x02, 0xf3, 0x81, 0x01, 0x27, 0xf0, 0x74, 0xdd, 0xde, 0x5d, 0x3f, 0x6f, 0x9e, 0xbd, 0x24, 0xe3, 0xfc, 0x7d, 0x2e, 0x13, 0xf4, 0x80, 0x28, 0xa9, 0x41, 0x2d, 0x30, 0x03, 0xd8, 0x3a, 0x90, + 0xcd, 0x0d, 0xa8, 0xf0, 0x6a, 0x86, 0x40, 0x26, 0x38, 0x45, 0x86, 0x31, 0x0c, 0x29, 0xc2, 0xb9, 0x1c, 0xa1, 0xb2, 0x71, 0x97, 0x7e, 0x3c, 0x08, 0x1d, 0xc1, 0xd5, 0xa7, 0x24, 0xf5, 0xf9, 0x26, + 0x1e, 0x76, 0x47, 0x90, 0xd7, 0x71, 0x17, 0x78, 0xa4, 0x5b, 0xfb, 0x67, 0x3e, 0x16, 0x2a, 0x9e, 0xb9, 0xf7, 0x6f, 0xee, 0xf0, 0xe4, 0x7f, 0x7d, 0xd6, 0x3f, 0x3d, 0xf4, 0x7e, 0x38, 0xce, 0xcc, + 0x62, 0xf6, 0xb0, 0x3e, 0xc8, 0x35, 0x51, 0xaa, 0x2b, 0x00, 0x72, 0x65, 0x77, 0xed, 0x02, 0x8b, 0x67, 0x38, 0x0e, 0x19, 0x6b, 0x4b, 0x18, 0x25, 0xca, 0x5a, 0x66, 0x45, 0xce, 0xde, 0x7b, 0xd7, + 0x90, 0xda, 0x9c, 0xe0, 0x29, 0x4d, 0x79, 0x3e, 0xf0, 0xf8, 0xd3, 0x89, 0x28, 0x26, 0x4f, 0xae, 0x44, 0x30, 0x20, 0x9f, 0x3a, 0xc0, 0x64, 0x5a, 0x19, 0xcf, 0xd1, 0xbd, 0x95, 0x64, 0xb6, 0x04, + 0x2b, 0x73, 0x0c, 0x29, 0xee, 0x6c, 0x23, 0x8a, 0x5a, 0xa2, 0x23, 0x92, 0xba, 0x9c, 0x4a, 0x1f, 0xbf, 0x10, 0xf1, 0x60, 0xf7, 0xff, 0x1f, 0x88, 0x50, 0x59, 0xb4, 0x80, 0xd0, 0x53, 0xa2, 0xa5, + 0x98, 0x41, 0xa7, 0xcd, 0x74, 0x43, 0x5b, 0x37, 0x65, 0xeb, 0x73, 0xaa, 0x51, 0x97, 0x68, 0x2b, 0xb0, 0x86, 0x18, 0xab, 0x4a, 0xcf, 0x2e, 0x5b, 0xae, 0xec, 0xd2, 0xbf, 0x43, 0xc4, 0xbe, 0xfb, + 0xfe, 0xd3, 0x89, 0x40, 0xf1, 0x06, 0xc9, 0xcd, 0x55, 0x71, 0x75, 0x8e, 0x92, 0x90, 0xa5, 0x08, 0x01, 0x0b, 0xcc, 0x57, 0x13, 0x56, 0x6b, 0xd0, 0xc4, 0x00, 0x33, 0xcc, 0x20, 0x60, 0x08, 0x2a, + 0xd1, 0x44, 0x93, 0xd9, 0xe9, 0xb8, 0x93, 0x3d, 0x39, 0x51, 0xb0, 0x17, 0xcc, 0x6f, 0xa7, 0xc6, 0x01, 0xb6, 0x0f, 0xbf, 0xcc, 0x42, 0x9c, 0xb0, 0xb5, 0x97, 0xd9, 0xc9, 0x81, 0x99, 0xf3, 0xd9, + 0xdd, 0xf2, 0xe8, 0xc2, 0x33, 0xac, 0x43, 0x2d, 0x45, 0x54, 0x5c, 0x3a, 0x10, 0x6c, 0x59, 0xa1, 0xb2, 0xad, 0x09, 0x81, 0x63, 0xa0, 0xaa, 0x02, 0xad, 0x19, 0x30, 0x06, 0xb6, 0x35, 0x78, 0x4e, + 0xd3, 0x2a, 0x99, 0x39, 0x8f, 0x63, 0x8d, 0x6f, 0xf9, 0xd4, 0x0f, 0x57, 0x05, 0xbe, 0x75, 0x48, 0x0f, 0x6b, 0x02, 0x70, 0x6e, 0x17, 0xee, 0xc9, 0x40, 0xe2, 0x68, 0xd0, 0xd7, 0x22, 0x98, 0x24, + 0xcd, 0x13, 0xa2, 0xe9, 0x9a, 0x93, 0xa8, 0x83, 0x46, 0x54, 0xf3, 0x1c, 0x05, 0xe2, 0x25, 0x68, 0xe4, 0x99, 0x5c, 0x6d, 0x9f, 0x6d, 0x16, 0x9f, 0x98, 0x5b, 0x7b, 0xd6, 0xec, 0xfd, 0x86, 0xaa, + 0xec, 0x7e, 0x77, 0x9a, 0xe2, 0x8f, 0xf8, 0x1a, 0x48, 0x9e, 0xbb, 0xce, 0xb8, 0xa8, 0x6b, 0xa8, 0xe5, 0x1c, 0x23, 0x75, 0x21, 0x0c, 0x2c, 0x5d, 0x3a, 0x14, 0x56, 0xf3, 0x29, 0x34, 0x65, 0xcb, + 0x94, 0xbc, 0x89, 0x0e, 0x6f, 0x73, 0x6a, 0xa4, 0x6e, 0x59, 0x66, 0x6b, 0x60, 0x69, 0xae, 0xe3, 0x44, 0xca, 0xf4, 0x6d, 0xa8, 0xfc, 0xe6, 0x8f, 0x17, 0xca, 0x7f, 0x7a, 0xb8, 0xfc, 0x8d, 0x81, + 0x9b, 0xed, 0xd4, 0xd7, 0xf6, 0xf8, 0xe6, 0xfe, 0xca, 0x1e, 0xa3, 0xd3, 0x0f, 0x8c, 0x00, 0x9f, 0x62, 0xab, 0xdd, 0x7f, 0xf4, 0xbb, 0xdb, 0x3f, 0x5f, 0x85, 0xc8, 0xf3, 0xcf, 0xfd, 0x0e, 0x9b, + 0x99, 0xda, 0x82, 0xc9, 0xac, 0x18, 0x34, 0x26, 0x30, 0x4d, 0x11, 0xee, 0xd6, 0xca, 0x46, 0x47, 0x41, 0x1e, 0x0d, 0x1c, 0x39, 0xdd, 0xd5, 0x52, 0x47, 0xe5, 0x40, 0xc5, 0xb1, 0xa5, 0x39, 0x63, + 0x8c, 0x13, 0xee, 0xf1, 0xe3, 0x96, 0xa6, 0x3c, 0x5c, 0x98, 0xef, 0x5e, 0xd9, 0xc2, 0xb9, 0x01, 0x68, 0x66, 0x07, 0x14, 0x6e, 0x95, 0xd4, 0x2d, 0xbc, 0x9c, 0xdd, 0x55, 0xe7, 0xf2, 0x2d, 0x9b, + 0x1c, 0x4d, 0x1b, 0x07, 0x86, 0x45, 0x19, 0x26, 0x4d, 0x97, 0x06, 0x59, 0x94, 0x54, 0xac, 0x0b, 0x2c, 0x39, 0x8e, 0x9b, 0xc2, 0xdb, 0xd8, 0xfa, 0x24, 0x75, 0xe7, 0xcf, 0xa3, 0x2a, 0x17, 0xf3, + 0x18, 0x2d, 0x78, 0xcb, 0x28, 0x25, 0x6b, 0x5a, 0x8f, 0xee, 0xbd, 0x2c, 0xb2, 0xbc, 0xe7, 0x6a, 0x3a, 0xba, 0xa8, 0xac, 0x16, 0x0d, 0x97, 0x00, 0x2e, 0x07, 0xce, 0xbe, 0x6f, 0x97, 0x31, 0x0e, + 0x39, 0x25, 0x9f, 0xc3, 0x45, 0x86, 0x4d, 0x32, 0xe7, 0xb6, 0x5c, 0x5f, 0x92, 0x55, 0x31, 0xa7, 0xd5, 0x96, 0xf0, 0x62, 0xb7, 0xaa, 0xe9, 0xad, 0x0f, 0x92, 0x6a, 0x38, 0xe7, 0x7e, 0xc8, 0xaa, + 0x9b, 0x00, 0x0f, 0x03, 0x76, 0xcd, 0x58, 0xdd, 0x5c, 0xd4, 0x6a, 0x32, 0xf3, 0x0f, 0x5b, 0xee, 0xd3, 0xb8, 0xdb, 0x29, 0x59, 0x7d, 0xd9, 0x10, 0x78, 0x89, 0xaa, 0xcf, 0x3f, 0x4d, 0xbd, 0xc6, + 0xd4, 0xa2, 0xc9, 0x6e, 0x4b, 0x4c, 0x5b, 0x5f, 0xbd, 0x18, 0x1a, 0xab, 0x60, 0x02, 0x88, 0x69, 0x17, 0x9a, 0xc9, 0xba, 0xe9, 0xe4, 0x6c, 0x90, 0xb9, 0x5a, 0xb7, 0x21, 0xcd, 0x66, 0x0f, 0x87, + 0xd9, 0xf8, 0x0d, 0x49, 0xed, 0x97, 0x1a, 0x5e, 0x65, 0x72, 0x67, 0x3e, 0x7f, 0xb0, 0x41, 0x92, 0xc4, 0x40, 0x58, 0xbe, 0x21, 0x7d, 0xe5, 0x92, 0x86, 0x63, 0x13, 0xce, 0x2c, 0x65, 0x2c, 0x2e, + 0xa7, 0x98, 0x63, 0x71, 0x63, 0x9e, 0x05, 0xe0, 0x61, 0x0b, 0xc6, 0x12, 0x07, 0x65, 0x3c, 0x95, 0xdc, 0x7c, 0xab, 0x60, 0x3c, 0x27, 0x00, 0x7f, 0xc2, 0x84, 0xc5, 0x34, 0xb2, 0xee, 0xe5, 0x30, + 0xfb, 0x24, 0xc8, 0x74, 0xda, 0x47, 0x48, 0x75, 0x5e, 0x2a, 0xb0, 0x2c, 0x63, 0xf0, 0x7e, 0x96, 0x62, 0xb2, 0x2e, 0x62, 0x9a, 0x2c, 0x0d, 0x94, 0xd4, 0xd4, 0xdd, 0x7a, 0x9e, 0x12, 0xc0, 0x6e, + 0xdd, 0xd8, 0x4f, 0xef, 0xd4, 0xe8, 0xc2, 0xb6, 0xc4, 0x9b, 0x7a, 0x79, 0x40, 0x1b, 0x63, 0xe0, 0x1a, 0x23, 0xd7, 0x48, 0xd2, 0x45, 0x53, 0x48, 0x56, 0x04, 0x4a, 0x4b, 0xe8, 0x49, 0x2d, 0xb8, + 0xa7, 0xb8, 0xb5, 0x31, 0x05, 0x9a, 0x4f, 0xd0, 0x38, 0x6a, 0x2a, 0x9f, 0x6f, 0x76, 0x5b, 0x42, 0x79, 0xe1, 0xbb, 0xf5, 0xb8, 0x92, 0xf3, 0xe5, 0x83, 0x9b, 0xdb, 0xbb, 0x6b, 0xbb, 0xda, 0xfd, + 0x97, 0x3d, 0xec, 0xde, 0xaa, 0x0f, 0x7e, 0x0d, 0x6b, 0x2f, 0x55, 0x6f, 0x9e, 0x3d, 0x08, 0xf9, 0x6a, 0xda, 0x92, 0x36, 0xe4, 0x42, 0x3a, 0x25, 0x47, 0x83, 0x85, 0x6d, 0xda, 0x22, 0x9a, 0x39, + 0x66, 0x9f, 0x92, 0xce, 0x31, 0x16, 0x53, 0x5b, 0x30, 0x72, 0xa5, 0x18, 0x44, 0xe4, 0x1a, 0x65, 0xe5, 0xeb, 0xc4, 0x4e, 0xc6, 0x97, 0xc1, 0x9e, 0x7d, 0xa4, 0xfe, 0x1a, 0x50, 0x4f, 0x13, 0x7b, + 0x7b, 0x71, 0xb5, 0xab, 0xdc, 0x34, 0xf5, 0xb0, 0xab, 0xdd, 0xde, 0xc3, 0xb9, 0xdd, 0x7a, 0x5a, 0xaa, 0x4f, 0xcb, 0x9c, 0x32, 0x1a, 0xc9, 0xea, 0xbc, 0x22, 0x9b, 0x44, 0xba, 0x65, 0xad, 0x09, + 0x33, 0x99, 0x15, 0x53, 0x3b, 0xe1, 0x94, 0x65, 0x11, 0x4b, 0x16, 0x31, 0x27, 0x25, 0xae, 0x6a, 0x71, 0xdc, 0x35, 0x7e, 0x0b, 0x4b, 0xef, 0x1e, 0x43, 0xd1, 0x3f, 0x5f, 0x1f, 0x7b, 0x5e, 0x61, + 0x3c, 0xd4, 0xf9, 0x73, 0xc3, 0x76, 0x5b, 0x51, 0x93, 0x04, 0x36, 0x33, 0x8c, 0x01, 0x38, 0xd7, 0x2a, 0xc5, 0xc4, 0xd5, 0x85, 0x68, 0xd5, 0x40, 0x75, 0x93, 0xde, 0xa1, 0x33, 0x84, 0xac, 0x11, + 0x7d, 0x76, 0x6c, 0x46, 0x0a, 0xac, 0xdd, 0xf3, 0x44, 0x03, 0xf9, 0x28, 0x0f, 0x5e, 0xc8, 0xf6, 0xb7, 0xa7, 0xee, 0xc0, 0xee, 0xaf, 0x7f, 0x82, 0x2d, 0x5b, 0x88, 0x39, 0x54, 0x8a, 0x73, 0x03, + 0x19, 0xee, 0x64, 0x6b, 0x56, 0x1f, 0x68, 0xcc, 0x9b, 0x13, 0xcb, 0x5e, 0x6d, 0xb5, 0x31, 0xbc, 0x61, 0x64, 0xe3, 0xa8, 0x1c, 0xab, 0x83, 0x8d, 0xb4, 0x6a, 0xaa, 0x05, 0x68, 0x21, 0x8b, 0x72, + 0x32, 0x08, 0x87, 0x9d, 0x0a, 0xf5, 0xdf, 0x5a, 0xea, 0xaf, 0x8a, 0x9d, 0xe7, 0xa6, 0x60, 0x92, 0x44, 0x2d, 0x04, 0xb4, 0x06, 0xbd, 0xcf, 0x46, 0x1e, 0x1e, 0x4d, 0x5a, 0x12, 0x48, 0xb9, 0x44, + 0x68, 0x78, 0x61, 0xc2, 0x6c, 0x4a, 0x38, 0x69, 0x42, 0xba, 0xad, 0x80, 0xca, 0x16, 0xa9, 0x7a, 0x42, 0xab, 0xdf, 0x86, 0x62, 0x57, 0x2f, 0x46, 0xdc, 0x5f, 0x25, 0xe2, 0x67, 0x26, 0x70, 0x31, + 0x71, 0x9f, 0xc2, 0xee, 0xc0, 0xc8, 0x83, 0x75, 0xaa, 0x83, 0x40, 0xb1, 0x92, 0xf5, 0x46, 0xc6, 0xfb, 0x16, 0x97, 0x02, 0xcf, 0xb5, 0x46, 0x28, 0xa3, 0xea, 0x18, 0x21, 0x09, 0x44, 0x3a, 0xe9, + 0x24, 0x5a, 0xde, 0x93, 0xf8, 0x2a, 0x67, 0xe4, 0x73, 0x8b, 0xa7, 0x26, 0x7a, 0xf2, 0x24, 0x0a, 0xa0, 0x5a, 0x3c, 0xc7, 0x10, 0xb4, 0x99, 0x0d, 0x8d, 0x5a, 0xef, 0x35, 0x6c, 0xac, 0x19, 0x8d, + 0x66, 0x24, 0xd1, 0xf2, 0xa9, 0xd4, 0xa4, 0x56, 0x37, 0x09, 0x33, 0x2d, 0x9c, 0x7e, 0xf2, 0xf4, 0x37, 0x9f, 0xff, 0xba, 0xb8, 0xb3, 0x3f, 0xf7, 0x36, 0x74, 0x28, 0x82, 0x73, 0x97, 0x42, 0xb2, + 0x3a, 0x4d, 0xc6, 0x74, 0xf5, 0xd2, 0x2a, 0x26, 0x13, 0x50, 0xa7, 0xc4, 0x80, 0x60, 0xeb, 0x19, 0xd5, 0x27, 0xb3, 0x69, 0x80, 0x07, 0xe0, 0xd2, 0xdc, 0x50, 0xbf, 0x3b, 0xf4, 0xec, 0x01, 0x7d, + 0xcb, 0x4e, 0x8f, 0x13, 0xf1, 0x62, 0x27, 0xf4, 0xd0, 0x52, 0xce, 0x1d, 0xf0, 0xb4, 0xa8, 0x51, 0x46, 0xcb, 0xc9, 0x21, 0xd1, 0x99, 0x59, 0x6b, 0x70, 0x91, 0xb7, 0x2c, 0xb5, 0x52, 0x99, 0xa3, + 0x0f, 0x9b, 0xc1, 0x59, 0x5d, 0xb2, 0xd0, 0xe6, 0x90, 0x45, 0x2b, 0x16, 0x07, 0x55, 0xcc, 0xe3, 0xe1, 0xfe, 0xbf, 0x91, 0xc1, 0xbe, 0xdc, 0x21, 0x3a, 0x65, 0x62, 0xcf, 0x1e, 0xfa, 0xd9, 0x8c, + 0x49, 0xe2, 0x52, 0x49, 0x27, 0x01, 0x98, 0xdc, 0xb2, 0xa5, 0xae, 0x4e, 0x36, 0xcd, 0x8c, 0x53, 0x8c, 0xa0, 0x43, 0xc9, 0xec, 0x0c, 0x86, 0x03, 0x6b, 0xb5, 0x65, 0xab, 0x77, 0x05, 0xc6, 0x16, + 0x9d, 0xaa, 0x4e, 0x81, 0xd0, 0xab, 0xdb, 0xf8, 0xfd, 0x83, 0x7d, 0x3a, 0x4c, 0xd7, 0xf8, 0xfc, 0x85, 0x99, 0x80, 0x88, 0xa9, 0xa0, 0x86, 0xcd, 0xc1, 0x1d, 0x11, 0x8b, 0x88, 0x52, 0x6c, 0x62, + 0x2d, 0xc2, 0xd2, 0x35, 0x0c, 0xc6, 0x5a, 0xd1, 0x8d, 0x60, 0x82, 0x01, 0x58, 0x71, 0x5f, 0xe1, 0xc5, 0x2b, 0x16, 0x9c, 0xd8, 0x78, 0x7a, 0x06, 0x65, 0xee, 0xe3, 0xf6, 0x53, 0x5e, 0x7e, 0xb6, + 0xbb, 0x37, 0x36, 0x87, 0xaf, 0x6e, 0x2f, 0x5f, 0x53, 0x7a, 0x6e, 0x43, 0xec, 0x30, 0xb2, 0x54, 0x0a, 0x6b, 0x28, 0x49, 0x9f, 0x20, 0x9b, 0x53, 0x1c, 0xcc, 0x01, 0xb2, 0x46, 0x65, 0xad, 0xd1, + 0x1b, 0x4d, 0x8f, 0x2e, 0x73, 0xb6, 0xde, 0x10, 0x9a, 0xa9, 0xea, 0xc8, 0x84, 0x58, 0xb0, 0x4e, 0x55, 0x87, 0x9f, 0x26, 0xec, 0x5f, 0x26, 0x0b, 0xfd, 0xec, 0x80, 0x1b, 0x57, 0x55, 0x76, 0xcc, + 0x28, 0x54, 0x55, 0x4c, 0x69, 0x30, 0x5b, 0x77, 0xed, 0x88, 0xe1, 0x9c, 0xa5, 0xb3, 0x2d, 0x8c, 0xc0, 0x46, 0x3c, 0x86, 0xfb, 0x6a, 0x89, 0x95, 0xa3, 0x57, 0xb8, 0x72, 0x17, 0x39, 0x35, 0xde, + 0x75, 0x7d, 0x98, 0xe8, 0xec, 0x41, 0xc8, 0xb9, 0x91, 0x93, 0x0c, 0x55, 0xf7, 0x0e, 0xdc, 0x06, 0x64, 0xa2, 0x69, 0x55, 0xcf, 0x9a, 0x2b, 0x09, 0x07, 0x14, 0xb0, 0xf1, 0x5a, 0xec, 0x91, 0x16, + 0x1c, 0x6d, 0x8b, 0x3b, 0x4d, 0xd9, 0xc4, 0xfb, 0xaa, 0x61, 0x40, 0xf3, 0xd4, 0x30, 0xf3, 0xf3, 0x3e, 0xdb, 0x4b, 0x1a, 0xf4, 0xec, 0x75, 0x8d, 0xd4, 0x01, 0x2d, 0x9b, 0x67, 0xef, 0xce, 0x38, + 0x6c, 0xd9, 0x96, 0x2c, 0x43, 0x30, 0x14, 0x61, 0xcc, 0x02, 0x63, 0x1c, 0xa0, 0xb3, 0x81, 0x73, 0x44, 0x71, 0x2f, 0xa3, 0xf5, 0x38, 0x01, 0x9b, 0x7a, 0xaa, 0x6a, 0xf3, 0xb8, 0x23, 0x75, 0xd2, + 0x2c, 0xae, 0x77, 0x87, 0x7d, 0xef, 0x71, 0xf6, 0xf0, 0x34, 0x51, 0x4d, 0xa5, 0xc7, 0xa2, 0x0a, 0x14, 0x6c, 0x92, 0x22, 0x8e, 0x53, 0x58, 0x7a, 0xd9, 0x5c, 0x94, 0xdd, 0xbc, 0x35, 0x4a, 0xe9, + 0x10, 0xe0, 0xb4, 0x47, 0x47, 0x3a, 0xbb, 0xac, 0x29, 0x0e, 0x73, 0xbd, 0x09, 0x81, 0xbe, 0x35, 0xfc, 0x9f, 0xaa, 0xb2, 0x3f, 0x88, 0x5e, 0xbf, 0xae, 0x0d, 0xbf, 0x44, 0xb0, 0x70, 0x7e, 0xab, + 0x6a, 0x65, 0x31, 0x13, 0x97, 0x01, 0x79, 0x4f, 0x67, 0x56, 0x93, 0x48, 0x5a, 0x34, 0xb1, 0x90, 0x0c, 0xe7, 0x1a, 0x32, 0xd9, 0xab, 0x74, 0x80, 0x57, 0x23, 0x03, 0x89, 0x35, 0x2d, 0x86, 0x4c, + 0xed, 0x93, 0x8e, 0x4f, 0xec, 0xbd, 0x80, 0xf4, 0xf8, 0xb4, 0x5d, 0xf9, 0x36, 0x2a, 0xfc, 0xb6, 0x9d, 0x74, 0x40, 0xf2, 0x4f, 0x28, 0xfb, 0xac, 0xe1, 0x7d, 0x2d, 0xb4, 0xec, 0xb9, 0x14, 0x58, + 0x30, 0x3a, 0x37, 0xec, 0xc3, 0x73, 0x85, 0x77, 0x98, 0xd2, 0x01, 0xc9, 0x96, 0xa6, 0x6e, 0x7a, 0xec, 0xd3, 0x46, 0x58, 0x99, 0xb1, 0x09, 0x75, 0x3d, 0xe9, 0x48, 0x3e, 0xd9, 0xdd, 0xef, 0xbb, + 0x9b, 0xcb, 0x0f, 0x57, 0xb7, 0xaf, 0xa6, 0x92, 0xf0, 0xec, 0xc6, 0x48, 0xca, 0xe8, 0x18, 0xd0, 0xc8, 0x67, 0x35, 0xf1, 0x98, 0x55, 0xb5, 0xa5, 0x5a, 0x55, 0x3c, 0x01, 0x27, 0xf5, 0xd1, 0xc1, + 0x33, 0x65, 0x91, 0x14, 0x45, 0x43, 0x8f, 0xd0, 0xde, 0xf7, 0x23, 0x1e, 0x88, 0xe3, 0x78, 0x26, 0xf6, 0x35, 0xe6, 0xee, 0x9b, 0x46, 0xdf, 0xc8, 0xf9, 0xf0, 0x84, 0x4f, 0x4e, 0x88, 0xee, 0xd5, + 0x93, 0x2f, 0xa9, 0x9f, 0xe7, 0xb7, 0x58, 0xaa, 0xd6, 0x62, 0x48, 0xaf, 0xd4, 0x30, 0x2f, 0xe9, 0xad, 0x0d, 0xb0, 0xaa, 0x8c, 0x45, 0x43, 0xa1, 0x69, 0x2b, 0x14, 0x15, 0x4d, 0x75, 0x6c, 0xda, + 0x8c, 0xaa, 0x2c, 0x81, 0x43, 0x3a, 0x6f, 0x1a, 0xfe, 0xc3, 0xad, 0x94, 0xbb, 0x5c, 0xb7, 0x7f, 0x7d, 0xb8, 0xff, 0xfb, 0x3e, 0xec, 0x69, 0x6d, 0xee, 0xc5, 0x86, 0xec, 0x17, 0x53, 0x7e, 0xb0, + 0xbb, 0xcb, 0x7c, 0x78, 0xc3, 0x9c, 0x1f, 0xb7, 0xdd, 0x5f, 0x95, 0x28, 0xce, 0x9d, 0xeb, 0xcc, 0x52, 0x96, 0xe0, 0x26, 0xdd, 0x46, 0x19, 0x55, 0x22, 0x4d, 0xe5, 0xb5, 0x06, 0x16, 0x74, 0x26, + 0x88, 0x18, 0x8b, 0x9b, 0xea, 0x1c, 0x08, 0xad, 0x01, 0x37, 0x5e, 0xd0, 0x16, 0xa6, 0xce, 0x30, 0x5d, 0x7a, 0x0a, 0x68, 0xbf, 0x9a, 0x13, 0x78, 0x19, 0xe9, 0xcf, 0x3f, 0x7f, 0x3f, 0x1d, 0x8d, + 0x75, 0x28, 0x4e, 0xc9, 0x39, 0xc7, 0x14, 0x00, 0x9a, 0x1c, 0x44, 0x05, 0x93, 0x6a, 0x13, 0x6c, 0x63, 0x2b, 0x90, 0x21, 0xa9, 0xcd, 0x47, 0x8d, 0x46, 0x64, 0xde, 0xdd, 0xa6, 0x51, 0xb7, 0x79, + 0xaa, 0x2c, 0xf8, 0xaa, 0x37, 0xfa, 0xb3, 0xab, 0xe9, 0xb9, 0x5f, 0x4c, 0x26, 0x0b, 0x2c, 0x00, 0xa5, 0x36, 0xfa, 0xa2, 0x39, 0x3a, 0x41, 0x68, 0xeb, 0xda, 0x25, 0x26, 0x1b, 0x47, 0x97, 0xc1, + 0xa4, 0x63, 0x0b, 0xf5, 0xdd, 0xa4, 0x05, 0x58, 0xb3, 0xb2, 0x00, 0x38, 0x55, 0x1e, 0xf8, 0xd6, 0xce, 0x3d, 0xc4, 0xf6, 0xe7, 0x16, 0xc4, 0xf0, 0xa1, 0x6d, 0x8d, 0x2d, 0x0b, 0xf3, 0x0d, 0x36, + 0xfa, 0xa4, 0x1c, 0x6c, 0x40, 0xc0, 0x02, 0x34, 0xaa, 0xf5, 0xd5, 0x30, 0x17, 0x40, 0x6c, 0xbe, 0xb2, 0x73, 0x8d, 0x81, 0x62, 0x66, 0xa5, 0x1b, 0x1e, 0x18, 0x27, 0x05, 0xf1, 0xfb, 0xe5, 0x45, + 0xdc, 0xde, 0xd4, 0xee, 0x10, 0xf3, 0xd2, 0x7b, 0x3c, 0x37, 0xf0, 0x42, 0x69, 0x8a, 0x43, 0x9a, 0xdb, 0x44, 0x0e, 0x2f, 0x9b, 0x23, 0x8d, 0x66, 0x8c, 0x80, 0xe9, 0xbc, 0x96, 0x18, 0x1b, 0x76, + 0x46, 0x5a, 0xbe, 0x0a, 0x61, 0x06, 0x64, 0xd8, 0x04, 0xb3, 0x16, 0x25, 0x53, 0x4e, 0x92, 0xf0, 0xe9, 0x8f, 0xbd, 0x0e, 0x0d, 0x79, 0x5d, 0x05, 0x38, 0x37, 0x09, 0xdd, 0xb9, 0x59, 0x8d, 0xd6, + 0x9d, 0x00, 0xa1, 0xd2, 0x7c, 0x18, 0x05, 0xce, 0x6a, 0xbc, 0x86, 0x2d, 0x14, 0x2c, 0x1b, 0xd9, 0xba, 0xc0, 0x18, 0x94, 0x2a, 0x9d, 0xb2, 0x21, 0x5b, 0x32, 0xeb, 0x4c, 0x39, 0x09, 0xdb, 0x9f, + 0x4f, 0xe2, 0xbe, 0x2a, 0x94, 0x9d, 0x5b, 0x93, 0x56, 0x06, 0x7a, 0x1b, 0xe2, 0x6a, 0x43, 0x30, 0x8a, 0x57, 0x62, 0x83, 0x36, 0x05, 0x81, 0xcb, 0x86, 0x36, 0x62, 0x8e, 0x9a, 0x88, 0x8e, 0x4e, + 0x2d, 0x40, 0xd4, 0x6d, 0x39, 0x59, 0x11, 0xcc, 0xce, 0xed, 0x78, 0x92, 0xf5, 0xa5, 0x38, 0xbe, 0x5b, 0x79, 0xf3, 0x70, 0xda, 0xfb, 0x3e, 0x8e, 0x18, 0xbf, 0x6a, 0xc6, 0x9c, 0x3b, 0x2a, 0x81, + 0x4f, 0xf3, 0x19, 0x9a, 0xb6, 0x6a, 0x8d, 0x55, 0x30, 0x5b, 0x93, 0x82, 0xd8, 0x80, 0xb1, 0xe5, 0x02, 0xea, 0xdc, 0x72, 0xf5, 0xf0, 0x68, 0xac, 0x0d, 0x5a, 0x46, 0xf6, 0x81, 0x92, 0xd0, 0x06, + 0x76, 0x1e, 0xc7, 0xa7, 0xfe, 0x5f, 0x8e, 0x4b, 0x9f, 0x20, 0x70, 0x7f, 0xb1, 0xd5, 0x21, 0x4c, 0xee, 0x67, 0x26, 0x8f, 0xd8, 0x6a, 0x2c, 0xb0, 0x96, 0xd8, 0x27, 0xb2, 0x47, 0x77, 0x0d, 0xa6, + 0x68, 0x3a, 0x63, 0x32, 0x12, 0xcd, 0x35, 0xaa, 0xd9, 0xf0, 0xae, 0x41, 0xb3, 0xf1, 0xf4, 0xac, 0x3e, 0xc0, 0x59, 0x08, 0x95, 0xdb, 0xf1, 0x69, 0xe0, 0x6f, 0x91, 0xd6, 0x6e, 0xd6, 0x87, 0xf8, + 0x68, 0xf1, 0xd1, 0x9e, 0xbd, 0x7f, 0x13, 0x76, 0x3c, 0xff, 0x95, 0x57, 0xf9, 0xdb, 0x99, 0x89, 0x4f, 0x09, 0x68, 0x26, 0x64, 0xad, 0x8c, 0x10, 0xfb, 0xbe, 0x2a, 0xb7, 0x10, 0x52, 0xb5, 0xcd, + 0xc5, 0x8b, 0x7d, 0x63, 0x0e, 0x12, 0x04, 0x2e, 0x8f, 0x84, 0x34, 0x1b, 0xc0, 0xe0, 0xd3, 0x01, 0x75, 0x9d, 0x92, 0xed, 0x37, 0x1f, 0xf2, 0x4f, 0x91, 0xfc, 0x1a, 0x62, 0xc9, 0xd9, 0x37, 0x17, + 0x33, 0x9a, 0x27, 0xeb, 0xec, 0x89, 0x25, 0x86, 0xa3, 0xc9, 0xf4, 0xed, 0xb3, 0x5e, 0x45, 0x89, 0x16, 0xd3, 0xad, 0x62, 0xce, 0x14, 0x9b, 0xa6, 0x2b, 0xa8, 0xb3, 0xce, 0x29, 0xd1, 0x63, 0x80, + 0x4c, 0xc4, 0xe3, 0xe5, 0xae, 0xe7, 0xf7, 0x11, 0x9c, 0xa2, 0xf0, 0x05, 0xe2, 0x3a, 0x14, 0xeb, 0xb9, 0x75, 0xba, 0x8b, 0x8a, 0x70, 0xa1, 0xa0, 0xb6, 0xc9, 0x4a, 0x73, 0xbf, 0xfb, 0x56, 0x33, + 0x3b, 0x78, 0x61, 0x7a, 0x11, 0xf1, 0x28, 0x4c, 0xe5, 0x11, 0x11, 0xbd, 0xad, 0x34, 0x6c, 0xc2, 0x32, 0xfa, 0xa8, 0x51, 0x78, 0xe2, 0x66, 0xb1, 0x6f, 0xb7, 0xeb, 0x9d, 0x24, 0xf2, 0x72, 0x3b, + 0xc9, 0x0b, 0x87, 0x34, 0xce, 0x2e, 0xc2, 0xd5, 0xcc, 0x29, 0x4c, 0xba, 0xf4, 0xee, 0x0e, 0xc9, 0x50, 0x68, 0x23, 0x46, 0x2c, 0x11, 0x4c, 0xe7, 0xf2, 0x46, 0x3d, 0x45, 0x83, 0x4a, 0xc7, 0x32, + 0x58, 0x02, 0xab, 0x2a, 0xc7, 0x5c, 0x4d, 0xa9, 0xb5, 0xe3, 0x29, 0xc2, 0x8b, 0xfb, 0x20, 0x7e, 0x7b, 0x79, 0x7f, 0xe3, 0x9e, 0xac, 0x8b, 0xfb, 0xbf, 0x6f, 0x1e, 0xec, 0xaf, 0xef, 0x10, 0xff, + 0xe5, 0xa9, 0xc3, 0x9a, 0xc5, 0xb9, 0x11, 0x31, 0x93, 0x78, 0xeb, 0x2d, 0x55, 0x72, 0xe1, 0x6c, 0x84, 0x24, 0xd5, 0x08, 0xad, 0x4f, 0x15, 0x08, 0x48, 0x9f, 0x33, 0xc1, 0x9b, 0xa5, 0x2d, 0x0c, + 0xec, 0x3a, 0x11, 0x55, 0x61, 0x99, 0xc3, 0xfe, 0x42, 0xb5, 0x53, 0xd5, 0xff, 0xbb, 0x17, 0xab, 0x2a, 0x87, 0x75, 0xbb, 0x73, 0xc7, 0x4e, 0x2f, 0x6b, 0xd5, 0x47, 0x47, 0x94, 0x85, 0x29, 0xa3, + 0x4d, 0x5d, 0x5c, 0xb3, 0x2f, 0x00, 0x72, 0xe8, 0x3e, 0xc8, 0x06, 0xe6, 0x80, 0x69, 0x8e, 0x5d, 0x41, 0x33, 0x5a, 0x9f, 0x6d, 0xcd, 0x3e, 0x38, 0x8b, 0xe4, 0x78, 0xec, 0xbc, 0xcf, 0xeb, 0x37, + 0x77, 0x36, 0xef, 0x1e, 0xfb, 0x6d, 0x07, 0x16, 0xa8, 0xe7, 0x1f, 0x16, 0xb3, 0xa8, 0x0d, 0xe9, 0xaf, 0xd1, 0x19, 0x55, 0xa4, 0xc0, 0x31, 0x4a, 0x35, 0xbd, 0x11, 0xaf, 0x8e, 0xc5, 0x6d, 0x91, + 0x76, 0xf7, 0xe1, 0x02, 0x7d, 0x35, 0x07, 0xd6, 0x36, 0xe6, 0x64, 0x49, 0x10, 0x01, 0x3a, 0xbe, 0x4f, 0xf6, 0xe2, 0x86, 0xcb, 0xc7, 0xf5, 0x89, 0xa3, 0x5d, 0xc5, 0x6f, 0x65, 0x9a, 0x17, 0x1d, + 0x91, 0x1f, 0xae, 0xd3, 0xdc, 0xfd, 0xfd, 0xf9, 0x75, 0x5a, 0x77, 0xee, 0x0a, 0xfb, 0x7e, 0x11, 0x6b, 0x46, 0x63, 0xd1, 0x95, 0x82, 0x24, 0x4d, 0x78, 0xd6, 0x58, 0x94, 0x30, 0x7a, 0xd8, 0x58, + 0xc9, 0x88, 0x5c, 0x85, 0x03, 0x4a, 0xa4, 0xb5, 0xb6, 0xb2, 0xa7, 0xa3, 0xa9, 0x9a, 0xce, 0xc6, 0xa7, 0x2a, 0xec, 0xcf, 0xca, 0xd2, 0x07, 0x25, 0x97, 0xb3, 0x6b, 0xf0, 0xc2, 0x69, 0xde, 0x42, + 0x16, 0x55, 0xb4, 0xcc, 0x89, 0x95, 0x22, 0x89, 0x6b, 0xce, 0xd2, 0xd6, 0xd2, 0x1c, 0xd4, 0xc6, 0xea, 0xba, 0x20, 0x60, 0x91, 0x2b, 0x0f, 0x1a, 0xad, 0x1c, 0x9b, 0x9b, 0xe9, 0x88, 0x53, 0x15, + 0x97, 0x27, 0x1d, 0x7e, 0x25, 0x80, 0x73, 0x03, 0x70, 0x4f, 0x5f, 0x24, 0x44, 0x28, 0xab, 0xf5, 0x0c, 0x4a, 0xac, 0x4e, 0x68, 0xae, 0x22, 0x4d, 0x46, 0x2b, 0xf2, 0x86, 0x40, 0x6d, 0xe9, 0x68, + 0x81, 0x73, 0x7a, 0x98, 0x12, 0xcb, 0x5c, 0x1d, 0xc1, 0xa3, 0xe5, 0xe9, 0xe3, 0xdf, 0xad, 0x23, 0x55, 0x01, 0x39, 0x77, 0x20, 0x98, 0xb9, 0x79, 0xfd, 0x9a, 0x34, 0x72, 0x8e, 0x52, 0x99, 0x1e, + 0x20, 0x3c, 0x91, 0xbc, 0xc9, 0x8a, 0x9c, 0x10, 0x69, 0xa0, 0x1d, 0x3a, 0x62, 0xb1, 0xd4, 0x60, 0x11, 0x16, 0xb0, 0x6a, 0x1c, 0xb3, 0xa1, 0xbe, 0x79, 0xfc, 0xc7, 0x0b, 0xc5, 0x0e, 0x69, 0x98, + 0xe7, 0xee, 0x83, 0xb6, 0xae, 0x8b, 0x26, 0x5b, 0x6f, 0xdc, 0xc8, 0xc3, 0x02, 0x50, 0x74, 0xcb, 0x15, 0x60, 0x94, 0xd3, 0x50, 0x73, 0x59, 0x38, 0xe6, 0x9a, 0x5d, 0x97, 0xb9, 0xe8, 0x5a, 0xd8, + 0x60, 0x68, 0xa7, 0x09, 0xd9, 0xb1, 0x8e, 0xef, 0x26, 0x7e, 0xbd, 0x74, 0x6d, 0xb3, 0xe2, 0xdf, 0x9e, 0x5d, 0x96, 0x76, 0xc2, 0xd8, 0x5f, 0x5d, 0x99, 0xf6, 0xb3, 0x2b, 0xee, 0x8b, 0x78, 0x42, + 0x00, 0x2b, 0xf4, 0x30, 0xc4, 0xc9, 0xc1, 0x4b, 0x6c, 0x8c, 0x82, 0x9e, 0x63, 0x83, 0x2b, 0x3a, 0x46, 0xc0, 0x6a, 0xd4, 0x32, 0xb7, 0x2c, 0x1d, 0x1a, 0x93, 0x98, 0xd5, 0x32, 0xc3, 0xa2, 0x3a, + 0xee, 0x1a, 0x0f, 0x57, 0x57, 0x7e, 0xfb, 0xef, 0x70, 0xe2, 0xa3, 0xc1, 0x61, 0xf1, 0xa1, 0x9d, 0x1d, 0x9d, 0x55, 0x63, 0x9c, 0xb4, 0x62, 0xb4, 0xa0, 0x39, 0xa9, 0xc3, 0x2c, 0x5c, 0x5a, 0x52, + 0x1d, 0x40, 0x9b, 0x66, 0x6e, 0xa0, 0xad, 0x72, 0xef, 0x57, 0xb8, 0x49, 0xa5, 0x13, 0xb5, 0x58, 0xbe, 0x4f, 0xb4, 0xdc, 0x4e, 0xec, 0x29, 0x3d, 0xbb, 0xca, 0xef, 0xd9, 0x4a, 0xf8, 0xf6, 0xfe, + 0x69, 0xa3, 0xf4, 0x34, 0xd5, 0xbb, 0xcb, 0x1b, 0xbb, 0xba, 0xf8, 0x78, 0x7b, 0xfb, 0xfb, 0xc5, 0x17, 0xf2, 0x0e, 0x54, 0x9f, 0xcf, 0xaf, 0x03, 0x03, 0x71, 0x3a, 0x2b, 0xb9, 0x59, 0x9f, 0xa3, + 0x59, 0x28, 0x66, 0x31, 0x71, 0x30, 0x43, 0xdf, 0xcf, 0x01, 0x7b, 0xdf, 0x2f, 0xa5, 0x21, 0x35, 0x26, 0x5b, 0xce, 0x6e, 0xad, 0xcf, 0x1a, 0x33, 0xe6, 0xb4, 0xe3, 0x9a, 0xff, 0x76, 0x29, 0x7e, + 0x3f, 0x0e, 0x7d, 0x08, 0x6a, 0xce, 0x9d, 0x2d, 0x4b, 0xc7, 0x41, 0x1d, 0x62, 0x7a, 0x0c, 0x73, 0x44, 0xea, 0x54, 0x73, 0xa9, 0xca, 0x72, 0x9a, 0x86, 0x0d, 0xc7, 0xc8, 0xb1, 0x24, 0x48, 0xb3, + 0x46, 0x54, 0x12, 0x81, 0x6e, 0x48, 0xa1, 0x67, 0x46, 0x05, 0x1e, 0xd7, 0xed, 0x6f, 0x5d, 0xd7, 0x53, 0xa4, 0x7d, 0x29, 0xdf, 0x1e, 0x44, 0xbc, 0xf3, 0xef, 0x96, 0x5a, 0x6f, 0xea, 0x59, 0xa9, + 0xb3, 0x73, 0x63, 0xee, 0x42, 0x0c, 0xab, 0xcc, 0xa1, 0x45, 0x96, 0x48, 0xda, 0xe2, 0x68, 0x0c, 0x25, 0xe8, 0xc3, 0x01, 0xdc, 0x7d, 0xa2, 0x57, 0x65, 0x5f, 0x6d, 0x76, 0xca, 0x76, 0xca, 0xe9, + 0x3e, 0x5d, 0xca, 0x78, 0x28, 0x9e, 0x73, 0xa3, 0x32, 0x61, 0x63, 0x9b, 0x00, 0x9b, 0x63, 0xe9, 0xcb, 0x0a, 0xc6, 0x20, 0x8e, 0x32, 0x1b, 0x62, 0x3a, 0x5d, 0x17, 0x8a, 0x54, 0x4d, 0xaa, 0xea, + 0x6e, 0xc0, 0xad, 0x75, 0x46, 0x41, 0x98, 0x3c, 0x5a, 0x6e, 0xf9, 0xc5, 0xdb, 0xd9, 0xfe, 0x9f, 0xbb, 0x9b, 0xc7, 0x36, 0xc3, 0x29, 0x31, 0xfd, 0xfd, 0x3a, 0xa6, 0x40, 0x3b, 0x37, 0x8d, 0x8a, + 0x2e, 0x0c, 0x13, 0x1c, 0xb5, 0xfb, 0x46, 0x4e, 0x22, 0xcb, 0xcc, 0x61, 0x85, 0x01, 0x9b, 0xca, 0xb9, 0x95, 0x89, 0x7a, 0xc7, 0x99, 0xb6, 0x74, 0xa2, 0xc9, 0x6a, 0x20, 0x6d, 0x8c, 0xb1, 0x59, + 0xdb, 0xf1, 0x36, 0xc2, 0xe9, 0xfd, 0xf6, 0x1f, 0xac, 0x56, 0x7d, 0xdb, 0x07, 0x7e, 0xc9, 0x81, 0xf3, 0x2f, 0x15, 0x7a, 0xf6, 0x1e, 0x35, 0x26, 0x63, 0xa5, 0x45, 0x0f, 0x95, 0x1e, 0x18, 0x73, + 0x12, 0xe3, 0x96, 0xf0, 0x0f, 0xa6, 0x98, 0x36, 0x8d, 0xfb, 0xe2, 0xd5, 0x83, 0x9b, 0xda, 0x92, 0xb5, 0x30, 0x6d, 0xf6, 0xf4, 0x79, 0xe2, 0x02, 0xf1, 0x47, 0xd1, 0x7e, 0x99, 0x57, 0x39, 0x45, + 0xe3, 0xb1, 0x9e, 0x3b, 0x9e, 0x3b, 0xf9, 0x4b, 0xdb, 0x92, 0x3b, 0x8a, 0x02, 0x64, 0xb2, 0x6c, 0xad, 0xaf, 0x99, 0xca, 0x6d, 0xec, 0x09, 0x62, 0x2c, 0x02, 0xec, 0xdc, 0x47, 0x91, 0x0d, 0xb0, + 0x42, 0x68, 0x6b, 0x36, 0x58, 0xb1, 0x94, 0x01, 0xf2, 0x44, 0xf8, 0xfc, 0x1a, 0x2a, 0x9f, 0x5d, 0x0f, 0xbe, 0xbb, 0xce, 0x67, 0x77, 0x65, 0x6f, 0xef, 0xbe, 0xde, 0x65, 0xfb, 0x06, 0x03, 0x8e, + 0xed, 0x35, 0xc2, 0xd9, 0xe3, 0xc7, 0x3e, 0x95, 0xf7, 0x2c, 0xe7, 0x65, 0x2b, 0x36, 0x32, 0xa9, 0xdb, 0x8c, 0x2c, 0x52, 0xd2, 0x48, 0x93, 0x89, 0x36, 0xd7, 0xd4, 0x04, 0x9f, 0xe1, 0xb1, 0x38, + 0x7d, 0x59, 0x4a, 0x8d, 0x21, 0x23, 0xa5, 0x4e, 0x4d, 0x90, 0x3d, 0xa7, 0xf2, 0x67, 0xb7, 0x51, 0x48, 0x71, 0xf6, 0x36, 0xb9, 0x59, 0xaf, 0xa6, 0x5e, 0x34, 0x96, 0x27, 0x02, 0x2c, 0xc5, 0x41, + 0x31, 0x53, 0x96, 0x12, 0xea, 0xaa, 0x4e, 0x3a, 0x79, 0x4e, 0x5c, 0x38, 0x29, 0x3b, 0x71, 0x28, 0xd1, 0x6a, 0xf3, 0x78, 0x8b, 0xfa, 0xb9, 0xd0, 0x4e, 0x0a, 0xe9, 0xe6, 0xef, 0xd7, 0xb1, 0x42, + 0xce, 0x6e, 0x87, 0x43, 0x23, 0x7a, 0xe4, 0x86, 0x63, 0xbb, 0x3b, 0xb6, 0xc0, 0x31, 0x5b, 0x6b, 0xdd, 0x38, 0x11, 0xc5, 0x58, 0xf6, 0xdb, 0x32, 0xd6, 0x43, 0x7b, 0x2e, 0x47, 0x46, 0xf0, 0x8e, + 0x43, 0xc0, 0x9a, 0xb5, 0xf0, 0x7e, 0x7c, 0x07, 0xf7, 0xe9, 0xf0, 0x1f, 0xbe, 0xaf, 0x89, 0x2f, 0x9e, 0xfb, 0xd9, 0xea, 0x08, 0x45, 0x11, 0x6e, 0x41, 0x00, 0x95, 0xd6, 0x7a, 0x0d, 0x29, 0x81, + 0xd9, 0xd8, 0x59, 0xd0, 0x7b, 0x2f, 0xa7, 0x55, 0x63, 0x90, 0x1a, 0x89, 0xac, 0x0a, 0x69, 0x60, 0x0d, 0x04, 0x56, 0xeb, 0x84, 0x85, 0xa7, 0xc2, 0xe2, 0xe3, 0xe2, 0xd6, 0x81, 0xc3, 0x1c, 0x67, + 0x2f, 0x27, 0x4d, 0x5e, 0xea, 0x10, 0xb5, 0xd0, 0x8c, 0x1b, 0x40, 0xe1, 0x4a, 0xe5, 0xc0, 0xe0, 0x10, 0x12, 0xe9, 0x89, 0x6a, 0x0a, 0xad, 0x89, 0x37, 0x83, 0x89, 0x2b, 0x16, 0x2a, 0x34, 0x54, + 0x4c, 0xa5, 0x55, 0x76, 0x3c, 0x2a, 0x3e, 0x1f, 0x15, 0xfb, 0xb6, 0x2a, 0xf3, 0x35, 0x56, 0x7e, 0xb9, 0x49, 0xfe, 0xf9, 0x78, 0xc1, 0x6f, 0xa7, 0x36, 0x3d, 0x8f, 0x42, 0xd4, 0xdf, 0x0e, 0x2e, + 0x73, 0xfe, 0xa1, 0xca, 0xc6, 0xb3, 0x05, 0xb8, 0xc3, 0x34, 0xe7, 0xdc, 0x50, 0x70, 0x6c, 0xd8, 0x7d, 0x04, 0xc6, 0xd0, 0x8c, 0x88, 0xe1, 0x84, 0xa2, 0xe1, 0xfb, 0x2b, 0x9d, 0x17, 0x99, 0xe3, + 0x6a, 0xbe, 0x48, 0x2b, 0x4c, 0x9b, 0xb9, 0x20, 0x26, 0x8b, 0x99, 0x4d, 0xd2, 0xbe, 0x96, 0xeb, 0x89, 0x0a, 0xd0, 0x3f, 0xf1, 0x1d, 0x34, 0xdf, 0xfb, 0xe2, 0x99, 0xef, 0x2d, 0xff, 0x7d, 0x79, + 0xe0, 0xd0, 0x78, 0xe8, 0xdc, 0x85, 0x88, 0x11, 0x39, 0x82, 0xc8, 0xc6, 0xe2, 0xe1, 0x8b, 0xfb, 0x12, 0x64, 0x93, 0xec, 0x48, 0xcc, 0xbd, 0x16, 0x42, 0x06, 0xd0, 0x22, 0xe9, 0x14, 0xab, 0x43, + 0xc9, 0x00, 0xf3, 0x12, 0x65, 0x18, 0xd5, 0x39, 0x4f, 0x7c, 0x75, 0xcf, 0xf3, 0xc1, 0x87, 0xdb, 0x37, 0xbe, 0x3e, 0xe5, 0x89, 0xca, 0xef, 0x39, 0xcd, 0xe7, 0x4f, 0xbd, 0x62, 0xc8, 0xb9, 0xdd, + 0x49, 0x9b, 0xbd, 0xfb, 0x00, 0x52, 0x83, 0x55, 0x52, 0x60, 0x98, 0xd3, 0x48, 0xd7, 0x30, 0x91, 0x2e, 0x38, 0xa1, 0xaa, 0xe1, 0xd4, 0x00, 0x9b, 0x1a, 0xc8, 0xb9, 0x5f, 0xb1, 0xeb, 0x95, 0x48, + 0x80, 0xa5, 0x27, 0xf6, 0x88, 0x9f, 0x5f, 0x94, 0x7c, 0x8a, 0xca, 0xa7, 0x55, 0xe3, 0x83, 0x34, 0xe2, 0xfc, 0xb1, 0x81, 0xa7, 0x4e, 0x81, 0xac, 0x49, 0x6b, 0x2a, 0x27, 0x52, 0xba, 0x14, 0x13, + 0xa5, 0xf7, 0x4a, 0x70, 0x9d, 0xd4, 0x5c, 0xfa, 0xac, 0x26, 0x0b, 0x70, 0x65, 0x48, 0x05, 0xb3, 0x8d, 0xea, 0x9d, 0xa3, 0xb9, 0x9f, 0x9a, 0x1b, 0x7c, 0xb1, 0x67, 0xf4, 0xaa, 0x79, 0x76, 0xee, + 0x02, 0xe6, 0xc4, 0x0d, 0x32, 0x5b, 0xef, 0x4a, 0x55, 0x6d, 0x34, 0x25, 0x71, 0x12, 0x1e, 0x32, 0xc5, 0xb5, 0x85, 0x95, 0x2d, 0x5d, 0xd8, 0x5b, 0xdf, 0x12, 0xfb, 0x6e, 0xe1, 0x66, 0x9c, 0x8d, + 0x46, 0x77, 0x4a, 0x60, 0x39, 0xe5, 0xf4, 0x5f, 0x02, 0xea, 0x57, 0x35, 0xa8, 0x33, 0x13, 0xe1, 0xd0, 0x07, 0x40, 0x58, 0x21, 0x43, 0x2f, 0x1f, 0x63, 0x82, 0x0e, 0x21, 0x4a, 0x55, 0x64, 0xb7, + 0xed, 0xfc, 0x13, 0x1a, 0xc4, 0x4a, 0x54, 0x69, 0x3c, 0xb2, 0x01, 0xf9, 0x5c, 0x59, 0x3d, 0x3b, 0x94, 0x7d, 0x8f, 0x88, 0x97, 0x0b, 0x5e, 0x87, 0x86, 0x73, 0x76, 0x6c, 0xdc, 0xa3, 0x2b, 0x50, + 0xb5, 0x0a, 0xf6, 0xbe, 0x5c, 0x64, 0x18, 0x5a, 0x08, 0xc5, 0x72, 0x75, 0x67, 0x96, 0xb9, 0x46, 0xcc, 0xca, 0xd5, 0x58, 0x1d, 0x56, 0xc3, 0x89, 0x11, 0xea, 0x2d, 0x12, 0xdd, 0xe6, 0x89, 0xcb, + 0xbe, 0xbe, 0x00, 0xa6, 0x93, 0x66, 0xf3, 0xf9, 0xee, 0x65, 0x34, 0xc1, 0x9f, 0xd0, 0x2d, 0xe9, 0x6d, 0x3f, 0xac, 0x48, 0x90, 0x30, 0xb1, 0x35, 0x1b, 0xdd, 0x41, 0x81, 0x60, 0xb5, 0xd1, 0x03, + 0xfb, 0xd2, 0x01, 0xe0, 0xc1, 0x09, 0x43, 0xb2, 0x96, 0x55, 0x67, 0xf7, 0x05, 0x84, 0x73, 0xb2, 0x8d, 0x11, 0xc7, 0xd1, 0xe2, 0xd1, 0xa2, 0xd9, 0xba, 0x79, 0xcc, 0x04, 0x7e, 0xfc, 0x1e, 0x95, + 0x27, 0xd2, 0x9f, 0x6e, 0x25, 0x78, 0x29, 0xe4, 0x79, 0xf6, 0x06, 0x20, 0xcf, 0xa1, 0xec, 0x1d, 0x44, 0x5d, 0xfa, 0x52, 0x98, 0xe4, 0xc3, 0xdc, 0xa0, 0x8b, 0x56, 0x0f, 0x5d, 0x93, 0x56, 0x6b, + 0x9b, 0x46, 0x07, 0xb1, 0xb4, 0x16, 0x99, 0xad, 0x51, 0x2e, 0xd3, 0xa1, 0xc9, 0x83, 0xea, 0x84, 0xc6, 0xee, 0x27, 0x59, 0x0f, 0x14, 0x14, 0xde, 0xb7, 0x7f, 0xdd, 0x3e, 0xbf, 0xb8, 0xbf, 0xb1, + 0x4f, 0xf7, 0x1f, 0x6f, 0x1f, 0x2e, 0x3e, 0xdd, 0xe5, 0x1f, 0xbb, 0xfc, 0xf3, 0xdc, 0x0e, 0x7f, 0xc6, 0x58, 0x43, 0x73, 0x9f, 0xba, 0x1b, 0x39, 0x2f, 0xc7, 0xb1, 0x00, 0x22, 0x71, 0x22, 0x6d, + 0x2e, 0x5e, 0x60, 0x8c, 0xe2, 0xea, 0xd0, 0xba, 0x2e, 0xe9, 0xa6, 0x69, 0x2e, 0xe4, 0x3a, 0x37, 0xa2, 0xf0, 0xd4, 0xed, 0xe9, 0x4f, 0x05, 0x89, 0x43, 0x4f, 0x78, 0x6e, 0x1f, 0xd2, 0x63, 0xd0, + 0x34, 0x51, 0xae, 0x58, 0x6a, 0x73, 0xcc, 0x8e, 0xd9, 0x27, 0x21, 0x63, 0x1a, 0xb7, 0x66, 0x9e, 0x93, 0xe6, 0x44, 0x65, 0x51, 0x81, 0xa4, 0x21, 0x0c, 0xdc, 0xfa, 0xc2, 0xe1, 0xad, 0x15, 0xc3, + 0xf1, 0x7e, 0xf3, 0x53, 0xc6, 0xbd, 0x93, 0x21, 0x17, 0x9f, 0xe2, 0xe2, 0x0b, 0xba, 0xbb, 0xbc, 0xf9, 0xfc, 0xac, 0xd6, 0x72, 0xf1, 0xd7, 0x90, 0x0f, 0xc2, 0xaf, 0x1f, 0x38, 0xa1, 0xa9, 0x6f, + 0xfc, 0xd1, 0x9f, 0xdd, 0xee, 0xb4, 0x20, 0x1f, 0xba, 0x01, 0x6a, 0x6c, 0x8c, 0xb2, 0xd6, 0xf4, 0x39, 0x21, 0x7b, 0x64, 0x23, 0x9c, 0x59, 0xd5, 0xb9, 0x7b, 0x84, 0xbb, 0x13, 0x17, 0x79, 0xb6, + 0x59, 0x25, 0xe5, 0x62, 0xfb, 0x3b, 0xe8, 0xfd, 0xd4, 0xd4, 0xdc, 0xf3, 0xc2, 0xc4, 0xa1, 0x7b, 0x3d, 0x77, 0xe5, 0x5a, 0x5b, 0x86, 0x44, 0x8e, 0xee, 0xfb, 0xa8, 0xd1, 0x21, 0x2c, 0x7b, 0xf6, + 0x18, 0x5a, 0xb3, 0xdb, 0xc8, 0xa9, 0x0b, 0xa3, 0x05, 0x7b, 0x6b, 0x80, 0x48, 0x45, 0x64, 0x44, 0x9c, 0x14, 0xd9, 0x57, 0x82, 0x1e, 0xc7, 0x69, 0xdf, 0x2b, 0x9a, 0xbd, 0x29, 0xe8, 0x9f, 0x2d, + 0x34, 0x05, 0x4c, 0x44, 0x1d, 0xbc, 0x65, 0x6a, 0x1a, 0xb0, 0x5f, 0x19, 0xc1, 0x72, 0xc4, 0xfd, 0xb7, 0x46, 0x59, 0x67, 0x01, 0xcb, 0x91, 0x3c, 0xca, 0x30, 0x4c, 0x67, 0x06, 0x63, 0x54, 0xc0, + 0x24, 0x80, 0x37, 0x7c, 0xcd, 0xb3, 0x54, 0xe5, 0x80, 0x84, 0xf3, 0xcf, 0x85, 0x8b, 0xea, 0x42, 0x86, 0xe1, 0x19, 0xd2, 0x93, 0x88, 0x46, 0x2e, 0x6f, 0x2a, 0x39, 0x9a, 0x78, 0x6c, 0xd8, 0xba, + 0xcb, 0xa4, 0xe8, 0xab, 0x41, 0x63, 0x19, 0x54, 0x98, 0x95, 0xa3, 0x6b, 0x09, 0xb4, 0x2e, 0x76, 0xd2, 0x3a, 0x7f, 0x6c, 0x46, 0xf8, 0xf0, 0xc1, 0x9f, 0x4e, 0xae, 0x3a, 0x6c, 0x60, 0xb2, 0xc5, + 0xd2, 0x18, 0x2d, 0x74, 0x6a, 0x9f, 0x31, 0x71, 0x02, 0x70, 0x56, 0x53, 0xf0, 0xa1, 0xd4, 0x39, 0x92, 0x55, 0xd6, 0x5c, 0x93, 0xb7, 0x54, 0x96, 0x20, 0x1a, 0x4f, 0xb5, 0x55, 0xab, 0xbf, 0x45, + 0xee, 0x07, 0xb3, 0xbb, 0xf8, 0x28, 0xfc, 0xe1, 0xf2, 0xe6, 0xf3, 0xd5, 0xd5, 0x1f, 0xd7, 0xcf, 0xf3, 0xce, 0xaf, 0x3f, 0xbb, 0xbe, 0xff, 0xe3, 0xc5, 0x1c, 0xf5, 0x87, 0xcd, 0xdb, 0x7c, 0x78, + 0xe6, 0xb7, 0xbe, 0x7d, 0xf8, 0xea, 0xd1, 0x47, 0x2d, 0x7f, 0xf5, 0xf0, 0xb7, 0x8f, 0x5f, 0xfd, 0xd7, 0xa7, 0x1f, 0x3d, 0xfd, 0xa5, 0xb7, 0x85, 0xf0, 0xea, 0xf8, 0x3f, 0x5d, 0x18, 0x13, 0x2c, + 0xbb, 0xe2, 0x1e, 0xd2, 0x2f, 0xb7, 0x31, 0x28, 0xdb, 0x22, 0xe8, 0xac, 0xbc, 0x4a, 0xa9, 0xf5, 0x05, 0x58, 0x5d, 0xa6, 0x73, 0x6b, 0x15, 0x35, 0x5b, 0x1f, 0xe0, 0x4d, 0x9a, 0x60, 0x69, 0x82, + 0x9f, 0xba, 0x7d, 0xec, 0x28, 0xcb, 0x7f, 0x3a, 0x31, 0x8e, 0x59, 0xa8, 0xd9, 0x96, 0xfa, 0xaa, 0xa8, 0x50, 0x1f, 0x32, 0x9c, 0x40, 0x03, 0x16, 0x61, 0x08, 0x83, 0x49, 0x25, 0x0b, 0xce, 0x80, + 0x4d, 0xcf, 0x26, 0x8e, 0x0d, 0x5b, 0x8e, 0x35, 0xc7, 0xd2, 0xa8, 0x37, 0x82, 0xf4, 0x4b, 0x35, 0xf9, 0xe9, 0x84, 0x08, 0xa2, 0xc1, 0x14, 0x34, 0x5d, 0x3e, 0xa8, 0x2d, 0xa9, 0xd5, 0x4c, 0xa6, + 0x0c, 0x8a, 0xd1, 0x0c, 0x46, 0x2d, 0xdb, 0xf7, 0x99, 0x67, 0xb5, 0x62, 0xd6, 0x6a, 0xd2, 0x8d, 0x7c, 0x0b, 0xdf, 0xcb, 0x0c, 0x4f, 0x4e, 0x5e, 0xbc, 0x56, 0xed, 0x9f, 0x4e, 0x09, 0x77, 0xc6, + 0x90, 0x24, 0xe1, 0x48, 0x04, 0x2f, 0xee, 0x4b, 0x66, 0xad, 0x85, 0x36, 0x92, 0x7b, 0x2f, 0xa3, 0xb1, 0x08, 0x04, 0xfa, 0x88, 0x5a, 0x4c, 0x4e, 0x16, 0x10, 0xdd, 0xc1, 0x61, 0xd6, 0xc8, 0x76, + 0x2a, 0x7b, 0x39, 0x62, 0x8e, 0x3f, 0x9d, 0x94, 0x30, 0xf4, 0x2d, 0xbf, 0x87, 0x52, 0xc1, 0x11, 0xbe, 0x90, 0x98, 0x5b, 0xf6, 0xe6, 0xad, 0x2f, 0x6d, 0x7d, 0x39, 0xc9, 0x90, 0x1a, 0x93, 0x2b, + 0x66, 0x1f, 0x6d, 0x60, 0x13, 0x24, 0xe9, 0x62, 0x35, 0x95, 0xfd, 0x7b, 0x42, 0x39, 0x70, 0x21, 0x3f, 0x9d, 0x1c, 0x1d, 0x53, 0x96, 0x07, 0x14, 0x43, 0xb6, 0x31, 0x14, 0x73, 0xae, 0x9e, 0xa3, + 0x86, 0x9b, 0x8d, 0x4d, 0x42, 0xa2, 0x5a, 0x38, 0x59, 0xc6, 0x96, 0xb4, 0x74, 0x41, 0x68, 0xa0, 0x9c, 0x2b, 0xb4, 0xd4, 0x67, 0xff, 0x9e, 0xb1, 0x3c, 0x77, 0x7b, 0x3f, 0x9d, 0x16, 0xb0, 0x0e, + 0xbd, 0xba, 0xce, 0x59, 0xc9, 0x53, 0x20, 0xbc, 0x13, 0xd6, 0x1c, 0xb4, 0xa5, 0x8d, 0x48, 0x6d, 0x20, 0x89, 0xf8, 0x98, 0x23, 0x3b, 0x56, 0x79, 0x24, 0xf7, 0x19, 0x43, 0x4a, 0x34, 0x06, 0xe9, + 0xc9, 0xaf, 0x6c, 0xd9, 0x7f, 0xe9, 0xee, 0x01, 0x66, 0xc3, 0xf7, 0xf4, 0xaf, 0xdb, 0xe7, 0x1b, 0x7a, 0x3b, 0x7b, 0x9d, 0x57, 0x25, 0xd3, 0x80, 0xb0, 0xbc, 0x21, 0x67, 0x4b, 0xa0, 0x5a, 0x33, + 0xb0, 0xfa, 0xea, 0xab, 0xcf, 0xbe, 0x86, 0x4d, 0x51, 0x33, 0x45, 0x1a, 0x68, 0x81, 0x35, 0x17, 0xcd, 0x8a, 0x98, 0xdd, 0x6a, 0xb5, 0x71, 0x62, 0x5a, 0x7d, 0x3b, 0xed, 0xc5, 0xbd, 0xd5, 0x1b, + 0xc5, 0xb3, 0x6f, 0x8f, 0x3c, 0xa7, 0x56, 0xde, 0xb7, 0xf7, 0xfd, 0x1b, 0xb1, 0xe7, 0x4e, 0x13, 0x57, 0x97, 0x35, 0x53, 0x9a, 0xb3, 0x83, 0xf6, 0xb1, 0xbf, 0xcb, 0x96, 0x86, 0x41, 0x03, 0xe9, + 0xe5, 0x61, 0x49, 0x61, 0xa4, 0xbe, 0x69, 0x1d, 0x27, 0x4d, 0x0e, 0x16, 0x62, 0xa1, 0x92, 0x8e, 0x73, 0xe1, 0x89, 0x0d, 0xc0, 0xaf, 0xe5, 0xeb, 0x47, 0x92, 0xde, 0xaa, 0x34, 0x7f, 0x7d, 0xe2, + 0x65, 0x65, 0xa0, 0xbd, 0x1f, 0xdf, 0x68, 0x3e, 0x37, 0x40, 0xef, 0xbd, 0x4b, 0x4a, 0x26, 0xf6, 0x45, 0xb8, 0x0a, 0xfb, 0x90, 0x68, 0x73, 0xb8, 0x97, 0xa1, 0x8e, 0xd1, 0x48, 0x26, 0x1a, 0xb6, + 0xd5, 0xcc, 0x67, 0x97, 0x9e, 0x8d, 0x27, 0x8f, 0xb6, 0x3a, 0x6a, 0xd3, 0x8c, 0x71, 0x7c, 0xbc, 0xf9, 0xe5, 0x25, 0xbf, 0x2f, 0xd6, 0x5c, 0x36, 0xe2, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x37, 0x87, 0xee, 0xf4, 0x02, 0x1f, 0x00, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, + 0x6d, 0x6c, 0x34, 0x8f, 0x4d, 0x6e, 0xc3, 0x20, 0x10, 0x85, 0xf7, 0x73, 0x0a, 0xc4, 0xde, 0xc8, 0xa4, 0x59, 0x64, 0xe3, 0x93, 0x44, 0x56, 0x85, 0xe1, 0x05, 0xa1, 0xe2, 0x01, 0xc1, 0xd8, 0xfd, + 0x39, 0x7d, 0x45, 0x93, 0xee, 0xde, 0x7c, 0x33, 0xd2, 0x7c, 0xef, 0x5e, 0x9d, 0xff, 0x70, 0x11, 0x2b, 0xb1, 0xdb, 0xa1, 0x16, 0xa5, 0x1f, 0x07, 0x7b, 0x49, 0x85, 0x35, 0x9d, 0x68, 0x3d, 0x15, + 0x1e, 0x70, 0x36, 0xd6, 0xcc, 0x9a, 0x10, 0x92, 0xbc, 0xc8, 0x65, 0xbe, 0x58, 0x4d, 0x74, 0xaf, 0xad, 0x3c, 0x52, 0x86, 0x69, 0xc8, 0x70, 0x1d, 0x2b, 0xf9, 0x12, 0x10, 0xc1, 0xd3, 0xc1, 0x49, + 0xba, 0x5a, 0x94, 0xa5, 0x80, 0xed, 0x88, 0x6a, 0x51, 0x33, 0x25, 0xf6, 0x0d, 0x3b, 0x58, 0x5c, 0x56, 0x8b, 0x92, 0x76, 0x80, 0xb2, 0x94, 0xff, 0x58, 0xaa, 0x4c, 0x19, 0x27, 0xc6, 0x4e, 0xff, + 0x68, 0xea, 0xd2, 0x52, 0x1d, 0xb9, 0x7f, 0xef, 0x5b, 0xc9, 0x7d, 0xbc, 0x0b, 0xa8, 0xe0, 0x00, 0xf6, 0x09, 0x7d, 0x25, 0xe7, 0x25, 0x7d, 0x4d, 0x4d, 0xfe, 0x84, 0xcc, 0x6d, 0x28, 0x3e, 0xd1, + 0x27, 0xb6, 0xc1, 0xae, 0xe6, 0xcd, 0x58, 0x4d, 0xe0, 0xf3, 0x3d, 0x97, 0x18, 0xd1, 0x5e, 0x5d, 0xe6, 0x71, 0x99, 0x4b, 0x7c, 0x8e, 0x57, 0x63, 0x6f, 0x9a, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x1d, 0xdd, 0xc0, 0x65, 0xbe, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, + 0x64, 0x7c, 0x54, 0xe1, 0x6f, 0x1b, 0xb7, 0x0f, 0xfd, 0xae, 0xbf, 0x82, 0x4d, 0x7f, 0x40, 0x9a, 0x1f, 0xe2, 0x73, 0x3f, 0x16, 0x46, 0x57, 0xa0, 0xc8, 0xda, 0x26, 0xe8, 0xd0, 0x14, 0x89, 0x83, + 0x21, 0xc8, 0x8a, 0x9e, 0xac, 0xe3, 0x59, 0x6a, 0x64, 0xf1, 0x26, 0x52, 0xe7, 0x78, 0xc3, 0xfe, 0xf7, 0x41, 0x92, 0xed, 0x38, 0x68, 0xd7, 0x6f, 0x77, 0x12, 0xf9, 0x44, 0xbe, 0xf7, 0xc8, 0xe7, + 0x70, 0x95, 0x58, 0xe0, 0x7c, 0x3e, 0xff, 0x0c, 0xef, 0x53, 0x30, 0xe2, 0x28, 0x28, 0xf5, 0x3b, 0x7a, 0x43, 0x2b, 0x04, 0x21, 0xd8, 0x50, 0x8a, 0x10, 0x70, 0x5d, 0xe3, 0xfa, 0x6d, 0x08, 0x0c, + 0x91, 0xbe, 0xa1, 0x91, 0x67, 0x30, 0xb7, 0x08, 0x0b, 0x72, 0x1e, 0xe3, 0xe0, 0xb5, 0xa0, 0xba, 0xd3, 0x46, 0xdc, 0xc3, 0x97, 0x17, 0x56, 0x64, 0xe0, 0xd9, 0x74, 0x5a, 0x7e, 0x9b, 0xc8, 0xd3, + 0x13, 0x58, 0xe3, 0x02, 0x18, 0xe3, 0x88, 0x11, 0x1c, 0x83, 0x0b, 0xea, 0xae, 0xe5, 0x68, 0xa6, 0x2b, 0xed, 0x42, 0x13, 0xb9, 0xfd, 0xf2, 0xa2, 0x99, 0x1e, 0xfc, 0x9f, 0x34, 0x70, 0x21, 0xc7, + 0x0c, 0x86, 0x42, 0xef, 0x96, 0x29, 0x62, 0x97, 0xcb, 0x71, 0x61, 0xa4, 0x7b, 0x04, 0xb1, 0x08, 0xad, 0x0b, 0x1d, 0x3e, 0xb4, 0x6a, 0x5f, 0x93, 0x0b, 0x50, 0x11, 0xad, 0x0e, 0x9d, 0xc7, 0x78, + 0x08, 0xfa, 0x78, 0x74, 0x92, 0xe3, 0x22, 0xf2, 0x40, 0x81, 0x4b, 0x87, 0x0b, 0x12, 0xab, 0x3e, 0xbc, 0x9b, 0x83, 0x0e, 0x1d, 0x7c, 0xbe, 0xbc, 0x9e, 0x43, 0xc4, 0x3f, 0x13, 0xb2, 0x70, 0x03, + 0xb7, 0x94, 0x80, 0x2d, 0x25, 0xdf, 0xc1, 0x90, 0xa4, 0x92, 0xd1, 0x21, 0xbb, 0x5c, 0xcd, 0x02, 0xad, 0x1e, 0x1d, 0x45, 0x70, 0x81, 0x5d, 0x87, 0x4a, 0xac, 0x96, 0x5d, 0x51, 0x7b, 0xa2, 0x1a, + 0xb8, 0x08, 0x60, 0x34, 0x63, 0xce, 0x85, 0x80, 0xb5, 0x8b, 0x7d, 0x4f, 0x8a, 0x33, 0xcd, 0x11, 0x99, 0x52, 0x34, 0xc8, 0xd0, 0x53, 0xac, 0x8f, 0xec, 0xf2, 0x4f, 0x4b, 0x9e, 0xd1, 0x01, 0x3a, + 0x82, 0xf2, 0x82, 0x0b, 0xa5, 0xfb, 0xbb, 0x76, 0x0f, 0xf2, 0xf8, 0xda, 0xae, 0xdb, 0x7a, 0x55, 0x48, 0x54, 0x2a, 0x2b, 0xa4, 0x87, 0x01, 0xd6, 0xce, 0x7b, 0xc0, 0x87, 0x81, 0x72, 0xdb, 0x36, + 0x22, 0x02, 0x86, 0x6e, 0x20, 0x17, 0x84, 0x67, 0x4a, 0x01, 0xfc, 0x1f, 0xda, 0x69, 0x0b, 0xf3, 0xe8, 0x96, 0x4b, 0x8c, 0x7c, 0x48, 0xf1, 0x41, 0x35, 0xb9, 0x40, 0x74, 0x62, 0x31, 0x42, 0xa6, + 0x8c, 0x62, 0x65, 0x6c, 0x85, 0x62, 0xa9, 0xe3, 0x2d, 0x8a, 0x45, 0xed, 0xc5, 0x4e, 0x23, 0xea, 0xce, 0x05, 0x64, 0x6e, 0x8b, 0x4b, 0x76, 0xaf, 0x15, 0x0c, 0x0d, 0xfb, 0x5b, 0xa8, 0xe1, 0x60, + 0x2c, 0x9a, 0xfb, 0xa7, 0x08, 0xde, 0x8d, 0xf8, 0x9f, 0x00, 0xbb, 0xcb, 0xa7, 0xf9, 0x2a, 0x4b, 0xb6, 0xd2, 0x1b, 0x48, 0x8c, 0xa0, 0xc3, 0x06, 0xa8, 0x2f, 0xad, 0xe8, 0x51, 0x3b, 0xaf, 0x17, + 0x1e, 0xa1, 0x3a, 0x54, 0xf5, 0xa8, 0x25, 0x45, 0xe4, 0x1f, 0x58, 0xb5, 0x23, 0x93, 0xfd, 0x2a, 0x04, 0x7d, 0xf2, 0x7d, 0xa6, 0x2d, 0x23, 0xec, 0x5c, 0x01, 0x5a, 0x40, 0x2c, 0x31, 0xaa, 0x3d, + 0x7f, 0x8d, 0x52, 0xcf, 0x9f, 0xc3, 0xaf, 0x38, 0xa2, 0xa7, 0x61, 0x85, 0x41, 0x32, 0xeb, 0xd9, 0xe3, 0x0c, 0x3a, 0x63, 0xf8, 0x0d, 0x30, 0xfa, 0x7e, 0x62, 0x28, 0x88, 0x76, 0x01, 0xbb, 0x2c, + 0x88, 0x77, 0x46, 0x57, 0x52, 0x99, 0x1e, 0x55, 0xae, 0x18, 0xe0, 0x04, 0x34, 0xab, 0x7c, 0xba, 0x2e, 0xee, 0x2b, 0x9d, 0x14, 0xda, 0xcb, 0x1c, 0x3e, 0x49, 0xc7, 0x66, 0xd9, 0x28, 0xd5, 0xb6, + 0x2d, 0x5b, 0xf4, 0x1e, 0xd8, 0x44, 0x37, 0x88, 0x32, 0x3a, 0x2e, 0x09, 0x16, 0xc9, 0xf9, 0x6e, 0xfb, 0x2d, 0xc8, 0xbb, 0xe3, 0x98, 0x42, 0x4e, 0x50, 0xea, 0x32, 0x18, 0xcc, 0x7f, 0xc1, 0x85, + 0xe5, 0x69, 0x69, 0xf3, 0x71, 0x9c, 0xf8, 0x80, 0x34, 0x2d, 0xf0, 0x3a, 0xf3, 0x34, 0x9b, 0x4e, 0x3d, 0x19, 0xed, 0x2d, 0xb1, 0xcc, 0x5e, 0xbd, 0x7c, 0xf5, 0xf2, 0x4d, 0x1e, 0x1b, 0x95, 0x13, + 0x0f, 0x65, 0x60, 0xd0, 0xf1, 0x27, 0x49, 0xdf, 0x39, 0xa4, 0xa2, 0xfc, 0x3c, 0x78, 0xa7, 0xf7, 0x9b, 0x06, 0xe6, 0x54, 0x6d, 0xd7, 0x69, 0xd1, 0x59, 0xa6, 0xc3, 0xba, 0x4f, 0x95, 0x86, 0x24, + 0xce, 0x3b, 0xd9, 0x00, 0x27, 0x63, 0x41, 0x33, 0xb4, 0x26, 0x45, 0xdf, 0x16, 0x5b, 0x2c, 0x30, 0x3b, 0xa3, 0x9b, 0x15, 0xc2, 0x0c, 0x05, 0x26, 0x8f, 0x2a, 0x5f, 0xc3, 0xa4, 0x83, 0xe3, 0xbf, + 0x8f, 0x32, 0x85, 0x74, 0x34, 0x83, 0xa3, 0x35, 0x45, 0xdf, 0x1d, 0xfd, 0x73, 0x0c, 0x7f, 0x28, 0x80, 0xc9, 0xf9, 0x71, 0xd6, 0x0e, 0x83, 0x4c, 0x64, 0x33, 0xe0, 0xec, 0x50, 0x80, 0xe9, 0x37, + 0xa6, 0x50, 0xc3, 0x7e, 0x58, 0x7f, 0x25, 0xba, 0xf8, 0x63, 0xf0, 0xb4, 0xa9, 0xf6, 0xb8, 0x61, 0x84, 0x36, 0x97, 0xdc, 0x6e, 0xf7, 0x41, 0xf1, 0x45, 0x74, 0x7f, 0x61, 0x9d, 0xff, 0x27, 0x02, + 0x0f, 0x69, 0xe1, 0x1d, 0xdb, 0x6c, 0x0a, 0xa1, 0x32, 0x3a, 0x4b, 0xc7, 0x12, 0x37, 0x2a, 0x6f, 0xac, 0xae, 0xa0, 0x56, 0xc3, 0x80, 0x86, 0x8f, 0x41, 0x8b, 0x1b, 0x11, 0xae, 0x31, 0x8e, 0xce, + 0x60, 0x5e, 0x17, 0x05, 0xf0, 0x63, 0x5a, 0x60, 0x0c, 0x28, 0xc8, 0x60, 0x7c, 0x62, 0xc1, 0x38, 0xfb, 0xde, 0x33, 0xb9, 0xa0, 0x1d, 0xe0, 0x64, 0xb2, 0x7b, 0xe6, 0x97, 0x8e, 0xcc, 0x3d, 0xc6, + 0xc6, 0xd1, 0xf4, 0xf5, 0xed, 0xe5, 0xcd, 0xd5, 0xd7, 0xb7, 0x67, 0x67, 0x97, 0x37, 0x9f, 0xe6, 0x6f, 0x6a, 0x67, 0xb7, 0x5b, 0xeb, 0xd2, 0x2a, 0xd7, 0x97, 0xb7, 0xc6, 0x63, 0x6a, 0x0b, 0x34, + 0x14, 0x33, 0x2d, 0xf2, 0x04, 0x88, 0xb8, 0xb0, 0xac, 0x21, 0xef, 0x6f, 0x3e, 0x9d, 0x7d, 0xbd, 0x7a, 0xf7, 0xe1, 0xe2, 0x7a, 0x7e, 0x75, 0xdb, 0x2a, 0x0c, 0xa3, 0x8b, 0x14, 0x32, 0x37, 0x30, + 0xea, 0xe8, 0xb2, 0xe7, 0x1a, 0x78, 0x1b, 0x3a, 0x70, 0x7d, 0x99, 0x8d, 0x9e, 0xe2, 0x12, 0xa5, 0x6c, 0xc3, 0x63, 0xef, 0xb3, 0x8a, 0x43, 0xa4, 0xd5, 0x20, 0xd8, 0x6d, 0x37, 0x1c, 0x25, 0xc9, + 0x1b, 0xba, 0x8f, 0xb4, 0x02, 0x9d, 0x85, 0x37, 0xc8, 0xdc, 0x27, 0xbf, 0x6b, 0x67, 0xbb, 0xc5, 0xd9, 0xd2, 0xba, 0x54, 0x70, 0x73, 0xf5, 0x5b, 0xd9, 0x23, 0x62, 0x51, 0x71, 0xe5, 0xea, 0x14, + 0xd6, 0xd6, 0x19, 0xbb, 0x9f, 0x45, 0xed, 0x99, 0x60, 0x89, 0x02, 0xa3, 0xd3, 0x55, 0x2c, 0x70, 0xa1, 0xa7, 0xf6, 0x60, 0xe2, 0x9e, 0x18, 0xe8, 0x7f, 0x2f, 0xf6, 0x31, 0x30, 0x21, 0x48, 0xd1, + 0x9f, 0x54, 0x86, 0xce, 0xf5, 0x58, 0xfc, 0xf9, 0x4c, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa5, 0x86, 0xa7, 0x33, 0xae, 0x03, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0x50, + 0x4b, 0x03, 0x04, 0x14, 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, 0x72, 0x75, 0x73, + 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, + 0x8c, 0x52, 0xc1, 0x8a, 0xdb, 0x30, 0x10, 0xbd, 0xfb, 0x2b, 0xa6, 0x29, 0x14, 0x1b, 0xd2, 0xec, 0x5d, 0x69, 0x17, 0x4a, 0x72, 0xd8, 0x53, 0x0f, 0xbb, 0xbd, 0x95, 0x92, 0xc8, 0xd2, 0xd8, 0x11, + 0xc8, 0x23, 0xad, 0x34, 0xda, 0x24, 0x2c, 0xf9, 0xf7, 0x22, 0x39, 0xf1, 0x26, 0x90, 0x42, 0x7d, 0x10, 0xd6, 0xcc, 0x9b, 0x99, 0xf7, 0x9e, 0x26, 0x45, 0x04, 0xa9, 0xd8, 0x1c, 0x36, 0x7b, 0x6c, + 0x85, 0x28, 0xc7, 0xfb, 0x5a, 0xb2, 0x9c, 0xc3, 0x0b, 0x86, 0x37, 0xa3, 0x70, 0xe5, 0xa8, 0x33, 0xfd, 0x69, 0x59, 0x65, 0xa8, 0x75, 0xbd, 0x10, 0x86, 0x3a, 0xb7, 0xac, 0xaa, 0x87, 0x87, 0x07, + 0x78, 0x4e, 0x04, 0x2a, 0x45, 0x76, 0x03, 0xa8, 0x82, 0x4b, 0x41, 0xb2, 0x71, 0x04, 0x32, 0x82, 0x97, 0x81, 0xc1, 0x75, 0xc0, 0x3b, 0x04, 0xe9, 0xbd, 0x35, 0x6a, 0x4c, 0xb5, 0xc9, 0x58, 0x6d, + 0xa8, 0x2f, 0x0d, 0x7c, 0x70, 0x0a, 0x63, 0x5c, 0xe4, 0x4b, 0x09, 0xfc, 0xda, 0x99, 0x08, 0x5d, 0x22, 0x55, 0xb0, 0x71, 0xe7, 0x92, 0xd5, 0xb9, 0x37, 0x4b, 0x43, 0x20, 0xad, 0xbd, 0x3f, 0xae, + 0x73, 0x01, 0x8e, 0x2e, 0x85, 0x8f, 0xca, 0xab, 0x89, 0x1f, 0xcd, 0xb7, 0xdb, 0x6d, 0x48, 0x91, 0xcb, 0x7f, 0x47, 0x53, 0x0f, 0xac, 0x55, 0xd7, 0x0b, 0xf8, 0x32, 0x24, 0xbe, 0x55, 0xdd, 0xc0, + 0x7b, 0xc1, 0xe6, 0xcf, 0x22, 0x83, 0x6e, 0x37, 0x3a, 0x98, 0x37, 0x0c, 0xf0, 0x1d, 0x86, 0xe3, 0x46, 0xb7, 0x75, 0xb3, 0x9c, 0x00, 0xaa, 0xeb, 0x17, 0x5a, 0xb2, 0xac, 0x27, 0xd4, 0x42, 0x59, + 0x47, 0x58, 0x37, 0x67, 0xd0, 0xe9, 0xc2, 0xe1, 0x4a, 0x2c, 0x52, 0xe6, 0x0d, 0x4a, 0x12, 0x64, 0x7f, 0x27, 0x46, 0x1a, 0x02, 0x46, 0x97, 0x82, 0xc2, 0x08, 0x86, 0x6e, 0xb5, 0xdd, 0xd7, 0xe3, + 0x53, 0x0b, 0x32, 0x1e, 0x49, 0x65, 0x65, 0x86, 0x34, 0x1e, 0xea, 0x89, 0x5a, 0xc0, 0x57, 0x01, 0x4f, 0xcc, 0xfe, 0x19, 0x5f, 0x13, 0x46, 0x9e, 0x4f, 0x99, 0x91, 0xa8, 0x80, 0xfc, 0xe4, 0xdf, + 0xd6, 0xed, 0xba, 0x5c, 0x1f, 0xc7, 0x7c, 0x03, 0x5f, 0x1f, 0xcf, 0x55, 0xd1, 0x3b, 0x8a, 0x78, 0xe5, 0xc6, 0x75, 0x58, 0x88, 0x9f, 0x6e, 0xe5, 0x88, 0x91, 0xb8, 0x6e, 0xce, 0x4a, 0x33, 0x9b, + 0xff, 0x75, 0x38, 0xf7, 0xcb, 0x3b, 0xf5, 0xa9, 0x9e, 0xad, 0xce, 0x78, 0x43, 0x3d, 0xc4, 0x11, 0x37, 0x6b, 0x96, 0xd5, 0xc5, 0x5e, 0xe9, 0xfd, 0xa6, 0x58, 0x9c, 0xe9, 0x0a, 0x41, 0xb8, 0xaf, + 0x9f, 0x24, 0x69, 0x8b, 0x61, 0x2c, 0x14, 0x42, 0x63, 0x27, 0x93, 0xe5, 0xba, 0xc9, 0xa6, 0x9f, 0xc6, 0x25, 0xfd, 0x41, 0x80, 0x07, 0x39, 0x78, 0x8b, 0x97, 0x75, 0x9c, 0xb6, 0xe4, 0x76, 0x8b, + 0x22, 0x87, 0xa4, 0x38, 0x05, 0x5c, 0x54, 0x9f, 0x7f, 0x6b, 0xcc, 0x5e, 0xd4, 0xab, 0xfc, 0x84, 0xcd, 0x9f, 0x22, 0x68, 0xcc, 0xc3, 0xcd, 0xc8, 0x33, 0xff, 0x9c, 0x26, 0x39, 0xa0, 0x80, 0x17, + 0xce, 0xec, 0xe7, 0x79, 0xb8, 0x19, 0xbc, 0x85, 0xf5, 0xc8, 0xa8, 0xac, 0xe8, 0xbd, 0xca, 0x8e, 0x60, 0x22, 0x5d, 0x0c, 0xbf, 0x83, 0x29, 0x8e, 0xff, 0x23, 0x9e, 0xbf, 0x71, 0xf2, 0x6c, 0xef, + 0x82, 0xd5, 0xb3, 0x85, 0x21, 0x76, 0x75, 0x33, 0x9f, 0x10, 0xa7, 0x6a, 0x3c, 0x4f, 0xd5, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0xe0, 0x86, 0xf1, 0xd5, 0x01, 0x00, + 0x00, 0xee, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0xb4, 0x53, 0x51, 0x6b, 0xdb, + 0x4c, 0x10, 0x7c, 0xd7, 0xaf, 0x58, 0x2b, 0xf0, 0x7d, 0x77, 0x45, 0x55, 0xde, 0xd7, 0x75, 0x0a, 0x4d, 0x4b, 0x53, 0x4a, 0x29, 0xb4, 0x79, 0x4b, 0x83, 0x38, 0x4b, 0x2b, 0x5b, 0x44, 0xba, 0x93, + 0xef, 0x56, 0x38, 0xc6, 0xe8, 0xbf, 0x97, 0x3b, 0xc9, 0x8a, 0x1d, 0xd2, 0x62, 0x4a, 0xab, 0x17, 0x7b, 0x57, 0xb3, 0x73, 0xb3, 0x33, 0xa7, 0xce, 0x11, 0xe4, 0x56, 0x31, 0x21, 0xe6, 0x46, 0x97, + 0xd5, 0x0a, 0xf1, 0x46, 0xe9, 0xa2, 0x26, 0x7b, 0x1d, 0xca, 0x79, 0xe4, 0x11, 0x2a, 0xe7, 0xea, 0x31, 0xdb, 0xd2, 0x12, 0x71, 0xbf, 0x66, 0x6e, 0x11, 0xbf, 0x10, 0xaf, 0x4d, 0x91, 0x40, 0xe8, + 0xbd, 0x57, 0xac, 0x12, 0xb8, 0x61, 0x6e, 0xbf, 0xd1, 0xa6, 0x23, 0xc7, 0x87, 0xc2, 0xb5, 0x46, 0x3b, 0xea, 0x07, 0x92, 0xda, 0xac, 0x10, 0x2b, 0x5d, 0x9a, 0x79, 0x14, 0x5d, 0x5e, 0xc2, 0xa7, + 0xa6, 0xad, 0xa9, 0x21, 0xcd, 0xb0, 0x33, 0x9d, 0x85, 0xb2, 0xd3, 0x39, 0x57, 0x46, 0xff, 0xef, 0x3c, 0xb0, 0xca, 0x61, 0x4d, 0x96, 0xa2, 0xb6, 0x5b, 0x82, 0x72, 0x3b, 0x9d, 0x43, 0xa9, 0xa1, + 0xd2, 0x05, 0x3d, 0x0a, 0x4b, 0x1b, 0x3c, 0x3d, 0x6b, 0x14, 0x0e, 0x5e, 0xc6, 0x9b, 0x13, 0xf5, 0x57, 0x12, 0x5e, 0x5f, 0x9d, 0x68, 0x81, 0x7d, 0x04, 0x00, 0xe0, 0x65, 0xcc, 0x44, 0xbc, 0xc7, + 0x8b, 0xb7, 0x7d, 0x9c, 0x80, 0xa5, 0x8d, 0x9c, 0x0f, 0x2f, 0x4a, 0x5f, 0xa4, 0x4d, 0x58, 0x4f, 0x48, 0x58, 0x2c, 0x60, 0x58, 0x15, 0xf1, 0xe3, 0x87, 0xdb, 0x71, 0xda, 0x3f, 0xc7, 0xa4, 0x88, + 0x5f, 0x1f, 0x84, 0x4c, 0x97, 0xa6, 0xd8, 0x89, 0xd2, 0xd8, 0x46, 0xf1, 0x4c, 0xc4, 0x37, 0x54, 0xd7, 0x06, 0xf6, 0xfd, 0xec, 0x87, 0x8e, 0x0f, 0x1a, 0x53, 0xad, 0x1a, 0x92, 0x32, 0x90, 0xf4, + 0x40, 0xf5, 0xa4, 0xe7, 0x2c, 0xc6, 0xdb, 0xb5, 0xd2, 0x0f, 0xee, 0x77, 0x94, 0x51, 0x1f, 0x45, 0x17, 0x77, 0x79, 0xb9, 0x12, 0x4c, 0x8e, 0xe5, 0x7d, 0xd4, 0x98, 0x02, 0xfc, 0x5f, 0x37, 0x9e, + 0xe3, 0x73, 0x70, 0x5d, 0x4b, 0x16, 0xf1, 0xd5, 0x7c, 0xea, 0x1c, 0xc7, 0xeb, 0x8f, 0x44, 0x64, 0x93, 0x2d, 0x77, 0x4c, 0x2e, 0x01, 0x1f, 0x77, 0x12, 0x38, 0x10, 0x6f, 0xc9, 0xf1, 0xe4, 0x7a, + 0x80, 0xbf, 0xf3, 0xa0, 0x7e, 0x1e, 0x05, 0xaa, 0x52, 0x8f, 0x9a, 0x44, 0xb0, 0xfd, 0x85, 0x38, 0x8e, 0xb6, 0xf5, 0x6f, 0x11, 0x35, 0x6d, 0xc5, 0x09, 0x04, 0xb1, 0xa0, 0x52, 0x75, 0x35, 0x8b, + 0x69, 0xa7, 0xf0, 0x73, 0x71, 0x37, 0x88, 0xb4, 0x8c, 0xe8, 0xc5, 0xdc, 0x87, 0xee, 0x74, 0x35, 0x56, 0xc4, 0x42, 0x1e, 0xb1, 0xd7, 0xc4, 0x3e, 0x47, 0x58, 0xc0, 0x91, 0x66, 0xc4, 0x00, 0x4b, + 0xd9, 0x64, 0x7e, 0xab, 0xcc, 0x0e, 0x6d, 0x31, 0x46, 0xff, 0x34, 0xe7, 0x5a, 0x58, 0x3c, 0xdd, 0xb6, 0x64, 0xda, 0x4a, 0xa6, 0x6a, 0xab, 0x2a, 0x7e, 0x82, 0x2b, 0xe7, 0xc8, 0x72, 0x46, 0x9b, + 0x99, 0xf0, 0x53, 0xa9, 0x63, 0xc5, 0x9d, 0x13, 0x72, 0xb0, 0x0d, 0xf1, 0x7b, 0xa8, 0xaf, 0x4d, 0xe1, 0x03, 0xfd, 0x2c, 0x5f, 0x1c, 0x9c, 0x7a, 0xfe, 0xf9, 0x2f, 0x18, 0x8a, 0x58, 0x5a, 0xd3, + 0xfc, 0xea, 0x2a, 0xc5, 0x5b, 0x63, 0xeb, 0x22, 0x96, 0x32, 0x39, 0x19, 0x3d, 0x44, 0x36, 0x28, 0xa9, 0xb4, 0xaf, 0xfd, 0xf5, 0x39, 0xa8, 0x4e, 0x3b, 0xbd, 0xb5, 0xaa, 0x15, 0x32, 0x55, 0x2e, + 0xb3, 0x54, 0x0a, 0x39, 0x8d, 0x8f, 0xc2, 0xce, 0xb3, 0xba, 0x35, 0xee, 0x2c, 0xaf, 0x07, 0xdc, 0x5f, 0x37, 0xfb, 0x99, 0xd3, 0x69, 0xe5, 0x32, 0xd7, 0xe5, 0x39, 0x39, 0x27, 0xe4, 0x1f, 0x1b, + 0xfc, 0xec, 0xcb, 0xfa, 0x87, 0x0e, 0xf7, 0xd1, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xda, 0x3d, 0x7e, 0xd6, 0x13, 0x02, 0x00, 0x00, 0x72, 0x05, 0x00, 0x00, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x94, 0x53, 0x41, 0x6f, 0xdb, 0x3c, 0x0c, 0xbd, 0xfb, 0x57, 0x10, 0xfe, 0x2e, 0x12, 0xe0, + 0xcf, 0xe9, 0x6e, 0x05, 0xb3, 0xb6, 0xe8, 0x86, 0x00, 0x1d, 0x36, 0x20, 0x45, 0xd7, 0xdb, 0x30, 0x18, 0x6a, 0xcc, 0xc4, 0x42, 0x6c, 0xc9, 0xa0, 0x64, 0xbb, 0x43, 0xe2, 0xff, 0x3e, 0xc8, 0x32, + 0xb2, 0x24, 0x3b, 0x4d, 0x3e, 0x88, 0xa2, 0x48, 0x3d, 0x3e, 0x3e, 0xba, 0x73, 0x04, 0x6a, 0xe3, 0xf5, 0x7b, 0x31, 0xd0, 0x1b, 0xe2, 0x61, 0xa0, 0xb7, 0x0c, 0x1e, 0xdb, 0x36, 0x83, 0x27, 0xef, + 0xdb, 0x17, 0x72, 0xad, 0x35, 0x8e, 0xe2, 0xe9, 0x3b, 0x71, 0x4f, 0x3c, 0x2e, 0x93, 0x90, 0x44, 0xa6, 0x2f, 0x6a, 0xbb, 0xdb, 0x11, 0x23, 0x1e, 0x3e, 0x75, 0xba, 0x2e, 0x89, 0x33, 0x58, 0x99, + 0x7e, 0xbe, 0x77, 0xbe, 0x44, 0x3c, 0x24, 0x00, 0x10, 0x42, 0xb3, 0xc9, 0xd0, 0x16, 0xf1, 0xb0, 0x62, 0xb6, 0x21, 0x32, 0x6c, 0x5f, 0xb5, 0x29, 0x33, 0x78, 0x21, 0xd7, 0xd5, 0x7e, 0x8c, 0x31, + 0xa6, 0x6b, 0x10, 0x9f, 0x15, 0x3b, 0xfa, 0x62, 0x7c, 0x8c, 0x4d, 0xc6, 0x65, 0x92, 0x34, 0xb6, 0x84, 0x8d, 0x35, 0x5b, 0xbd, 0x5b, 0x4e, 0x76, 0xa5, 0x4c, 0x59, 0x13, 0x2f, 0x93, 0xe4, 0xbf, + 0x1f, 0x67, 0x04, 0x1a, 0xa5, 0xcd, 0xcf, 0x44, 0xb9, 0x5f, 0x66, 0x03, 0x5b, 0x03, 0xe1, 0x28, 0x24, 0xfc, 0x7f, 0x3f, 0x83, 0x7c, 0x14, 0xf2, 0x1e, 0x62, 0x55, 0x73, 0xcd, 0x88, 0x5b, 0xb6, + 0x4d, 0x41, 0xa6, 0x17, 0x2b, 0xd3, 0x23, 0x96, 0xb4, 0x55, 0x5d, 0xed, 0x85, 0xcc, 0x67, 0xab, 0xd8, 0xea, 0xda, 0x13, 0x17, 0x96, 0x45, 0xaa, 0xcd, 0xd6, 0xa6, 0x52, 0xe6, 0xda, 0x68, 0x2f, + 0xe4, 0x32, 0x99, 0x1e, 0xaa, 0xc9, 0x43, 0x6b, 0xd9, 0xc3, 0x1d, 0x34, 0xca, 0x6f, 0xaa, 0xc0, 0x17, 0xb1, 0x57, 0x2c, 0xd2, 0xe7, 0xf5, 0xcb, 0x6b, 0x2a, 0x67, 0xc0, 0xb0, 0xd6, 0x7b, 0xd1, + 0x4b, 0xb8, 0xbb, 0x87, 0xfe, 0xe4, 0x0a, 0x2b, 0x6f, 0x03, 0x61, 0x21, 0x2f, 0x9d, 0x8d, 0x6a, 0x0b, 0x62, 0x16, 0x47, 0x42, 0xb8, 0xe8, 0xc8, 0x31, 0x76, 0x0f, 0xd1, 0xd0, 0x20, 0x4e, 0x8d, + 0x44, 0x5c, 0xfb, 0x2a, 0x88, 0x40, 0xb9, 0xb7, 0x85, 0xf3, 0xac, 0xcd, 0x4e, 0x48, 0x29, 0x1f, 0xb2, 0xd3, 0xb3, 0x2b, 0x66, 0x51, 0x4c, 0xf8, 0xb7, 0x37, 0xb7, 0x37, 0xd1, 0x3f, 0xce, 0x34, + 0x16, 0x0b, 0xf8, 0xcc, 0xa4, 0x3c, 0x81, 0xaf, 0x08, 0x9e, 0x5e, 0x5f, 0x9f, 0xc1, 0x4d, 0x82, 0x4f, 0xb7, 0x7f, 0xf4, 0x8f, 0xa8, 0xc7, 0xe3, 0x19, 0xab, 0xc7, 0xb6, 0x8d, 0xde, 0x2b, 0x02, + 0x03, 0xab, 0x56, 0x9c, 0x8b, 0xa3, 0xcb, 0xb2, 0xa6, 0x41, 0x31, 0x21, 0x7e, 0x9b, 0x67, 0xe7, 0xd4, 0xef, 0xab, 0xdc, 0xa8, 0x75, 0xc7, 0x24, 0xa2, 0x85, 0x78, 0xf2, 0x5c, 0x45, 0xb2, 0xed, + 0x3c, 0x89, 0x74, 0x91, 0x66, 0x30, 0xa1, 0xec, 0x28, 0xa8, 0xe7, 0xad, 0x98, 0x47, 0x04, 0x51, 0x9b, 0x92, 0xde, 0xaf, 0x01, 0xae, 0xd3, 0x5a, 0xeb, 0xfe, 0x21, 0xef, 0xc2, 0x17, 0x56, 0xba, + 0xa8, 0x48, 0xd5, 0xbe, 0x5a, 0x1c, 0x0a, 0x14, 0x4c, 0xaa, 0xd4, 0x86, 0x9c, 0x3b, 0xd6, 0xba, 0xa7, 0x60, 0xc8, 0x31, 0xcd, 0xfe, 0xca, 0xb9, 0x2c, 0xf7, 0xfc, 0x87, 0x43, 0x5c, 0xef, 0xe5, + 0x65, 0x42, 0x2c, 0x63, 0x8c, 0x5b, 0xfe, 0xa6, 0x4d, 0x29, 0x44, 0x7a, 0x93, 0x4f, 0x5f, 0x9a, 0x4d, 0x13, 0x28, 0xe5, 0x43, 0xbc, 0x1d, 0x2c, 0xef, 0x89, 0x9d, 0xf8, 0x30, 0x47, 0x73, 0x67, + 0x66, 0x6d, 0x72, 0x35, 0x28, 0xed, 0x93, 0x31, 0xf9, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x11, 0xdd, 0x37, 0xa9, 0xfd, 0x01, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, + 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4a, 0x2a, 0xcd, 0xcc, 0x49, 0x29, 0x48, 0x4c, 0xce, 0x2e, 0xb6, 0xe2, 0x52, 0x50, 0xd0, 0x55, 0x48, 0xc9, + 0x4f, 0xce, 0x4e, 0x2d, 0xd2, 0xcb, 0xcc, 0xd7, 0x2f, 0x48, 0xcc, 0x4e, 0x2d, 0xc9, 0x4f, 0xce, 0xcf, 0xcd, 0x2d, 0xcd, 0xcb, 0x2c, 0xa9, 0xd4, 0x2f, 0x2a, 0x2d, 0x2e, 0xe1, 0x02, 0x04, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x69, 0xd4, 0x7c, 0x17, 0x35, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, + 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0xcc, 0x31, 0x0a, 0x02, 0x41, 0x0c, 0x85, 0xe1, 0x3e, 0xa7, 0x48, 0x2d, + 0xd8, 0x58, 0xd9, 0xcc, 0x49, 0x44, 0x42, 0x58, 0x33, 0x6e, 0x20, 0x66, 0x25, 0xc9, 0x32, 0xe8, 0xe9, 0x65, 0x2c, 0xb4, 0xfd, 0x1f, 0xdf, 0x8b, 0x6d, 0x2b, 0x6c, 0x58, 0xb1, 0x0b, 0xc0, 0xe5, + 0x70, 0x05, 0xf5, 0x9b, 0x78, 0x51, 0xd6, 0xcb, 0x04, 0x1b, 0xe6, 0x93, 0x17, 0xf9, 0x45, 0x7d, 0xcf, 0x76, 0x82, 0x65, 0xe5, 0x48, 0x99, 0x70, 0xaf, 0x7e, 0x3c, 0x43, 0x85, 0x3e, 0xa8, 0x82, + 0xd5, 0xd4, 0xef, 0x34, 0x56, 0x2d, 0xf9, 0x42, 0x6c, 0xd8, 0xd9, 0x72, 0x1e, 0xa4, 0x44, 0x51, 0x57, 0x67, 0x23, 0x97, 0x61, 0xea, 0xff, 0xf1, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5c, 0x90, 0xcd, 0x6a, 0xc4, 0x30, 0x0c, 0x84, 0xef, 0x7a, 0x8a, 0x2c, 0xbe, 0x05, 0xd6, 0xba, 0xf4, 0x05, 0xfa, 0xb3, + 0xd0, 0x2d, 0xa5, 0x14, 0x52, 0x7a, 0x2d, 0x8a, 0xad, 0x66, 0xbd, 0x38, 0x8e, 0x91, 0xd5, 0x2c, 0x7d, 0xfb, 0x92, 0xc4, 0x2d, 0x65, 0x2f, 0xc2, 0xf3, 0x31, 0x96, 0x86, 0x79, 0x3c, 0x3c, 0xbf, + 0xda, 0xd1, 0x83, 0x92, 0x0c, 0xac, 0x08, 0x3b, 0x3b, 0xce, 0x09, 0x2f, 0x42, 0x39, 0xb3, 0xe0, 0x48, 0x33, 0xa7, 0x7d, 0x55, 0xf6, 0x4c, 0x02, 0xbb, 0xb6, 0xc5, 0x22, 0x0e, 0x47, 0x0a, 0x09, + 0xdb, 0x16, 0xff, 0xfe, 0x55, 0xae, 0x5c, 0xf4, 0x3f, 0x07, 0x63, 0x4c, 0xd3, 0xbd, 0x75, 0x8d, 0x31, 0x06, 0x2c, 0x65, 0xfd, 0x18, 0x38, 0xb1, 0x90, 0xb2, 0x07, 0xeb, 0x22, 0x95, 0x92, 0x49, + 0x4f, 0x60, 0x3f, 0xc9, 0xe9, 0x24, 0xdf, 0x9b, 0xc8, 0x32, 0x9d, 0xd9, 0x29, 0xd8, 0xc2, 0xaa, 0x21, 0x0d, 0x05, 0x6c, 0xc9, 0x12, 0xd2, 0x70, 0xc7, 0x94, 0x16, 0xa1, 0xe5, 0x66, 0xef, 0xc8, + 0x9d, 0x78, 0xdb, 0x7f, 0x4c, 0xca, 0x31, 0x86, 0xa7, 0xe6, 0xf8, 0x70, 0xb8, 0xdd, 0x2e, 0x05, 0xcf, 0x04, 0xad, 0x0d, 0x97, 0xb2, 0xcc, 0x31, 0x2e, 0x33, 0xcb, 0x66, 0x7f, 0x61, 0x5d, 0x17, + 0xad, 0x4e, 0x4c, 0x7d, 0x3d, 0x87, 0x59, 0xc2, 0x4c, 0xca, 0xb8, 0xb0, 0xfe, 0x2b, 0x44, 0x8f, 0x80, 0x3e, 0x14, 0x5d, 0x41, 0x7d, 0xd8, 0xd4, 0xef, 0x07, 0x21, 0x1f, 0x19, 0xa1, 0x7a, 0xae, + 0x2b, 0xb9, 0xc2, 0xbf, 0x8d, 0x54, 0xbc, 0x26, 0x78, 0xef, 0x9a, 0xfb, 0xc9, 0xf3, 0x16, 0x75, 0x2e, 0x6e, 0xf2, 0x8c, 0xf0, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9f, 0x89, + 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, + 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, + 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x46, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, + 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0x9d, 0x7e, 0x98, 0x21, 0xfd, + 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, + 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, + 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, + 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x17, 0x67, 0x43, 0x2e, + 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xb9, 0xfa, 0x65, 0x30, 0x28, 0xcb, 0xd2, 0x67, 0x16, 0xb2, 0x2f, 0x69, 0x3d, 0x48, + 0xab, 0xcd, 0x6a, 0x70, 0x37, 0xbe, 0x1d, 0x4d, 0xe6, 0xa3, 0xcb, 0x4f, 0xfe, 0x95, 0x3b, 0xb6, 0x10, 0x29, 0x2a, 0x05, 0x84, 0xff, 0x2b, 0x38, 0x61, 0x0c, 0xcb, 0x2d, 0xb0, 0x3c, 0x4f, 0x79, + 0xc4, 0x96, 0x29, 0x42, 0xca, 0x4a, 0xcb, 0xcf, 0x9a, 0x10, 0x63, 0xd0, 0xd2, 0xc0, 0x2e, 0x89, 0x6b, 0x2e, 0xd6, 0x7d, 0x50, 0x72, 0xa5, 0x4b, 0x46, 0x68, 0xcc, 0xc4, 0x5c, 0x69, 0xe2, 0xcb, + 0x42, 0x1f, 0xb0, 0x56, 0x83, 0xe4, 0xea, 0x60, 0x83, 0x14, 0xc0, 0x04, 0x74, 0x83, 0x39, 0x8c, 0xe7, 0x5d, 0xf8, 0x35, 0x98, 0x8f, 0xe7, 0x7d, 0x63, 0xe4, 0x69, 0xfc, 0xf0, 0xdb, 0x74, 0xf1, + 0x00, 0x4f, 0x41, 0x18, 0x06, 0x93, 0x87, 0xf1, 0x68, 0x0e, 0xd3, 0x10, 0x6e, 0xa7, 0x93, 0xe1, 0xf8, 0x61, 0x3c, 0x9d, 0xcc, 0x61, 0xfa, 0x19, 0x82, 0xc9, 0x17, 0xf8, 0xcf, 0x78, 0x32, 0xec, + 0x03, 0x72, 0x9d, 0x20, 0x01, 0xbe, 0x98, 0xe4, 0x2a, 0x03, 0x93, 0x1b, 0x3e, 0x31, 0xb6, 0xe4, 0xcd, 0x11, 0x0f, 0x20, 0xac, 0x64, 0x05, 0x49, 0xe5, 0x18, 0xf1, 0x15, 0x8f, 0x20, 0x65, 0x62, + 0x5d, 0xb0, 0x35, 0xc2, 0x5a, 0x6e, 0x90, 0x04, 0x17, 0x6b, 0xc8, 0x91, 0x32, 0xae, 0x4c, 0x5e, 0x15, 0x30, 0x11, 0x1b, 0x33, 0x29, 0xcf, 0xb8, 0x66, 0xda, 0x4e, 0x9d, 0xc4, 0x65, 0x1c, 0x0d, + 0x3a, 0x3c, 0xcb, 0x25, 0x69, 0xf8, 0x83, 0x6d, 0x98, 0x2f, 0x50, 0xfb, 0x17, 0xd7, 0x07, 0x53, 0x5c, 0x1e, 0xcf, 0x08, 0x2e, 0xfd, 0x28, 0x61, 0x42, 0x60, 0xaa, 0x8e, 0xd7, 0x0a, 0xcd, 0x53, + 0x7f, 0x46, 0x32, 0x47, 0xd2, 0x1c, 0xd5, 0x75, 0xa7, 0x93, 0x17, 0xcb, 0x94, 0x47, 0x10, 0xa5, 0x4c, 0x29, 0xb8, 0x67, 0x1b, 0x14, 0x4f, 0xc4, 0xf2, 0x1c, 0x69, 0x28, 0x4b, 0x91, 0x4a, 0x66, + 0x30, 0x7d, 0xef, 0x74, 0x4c, 0xf6, 0x73, 0xe2, 0x1b, 0xa6, 0x11, 0x94, 0x41, 0x1c, 0xc1, 0xca, 0x56, 0xf9, 0x5c, 0x93, 0x89, 0xed, 0x29, 0x0c, 0x66, 0xb3, 0x51, 0xf8, 0xfc, 0x38, 0x0a, 0xe7, + 0xe3, 0xe9, 0x04, 0x6e, 0xa0, 0x7b, 0xe5, 0xff, 0xdd, 0xff, 0x47, 0xf7, 0xda, 0x1e, 0x1d, 0x5c, 0x5c, 0xd8, 0xff, 0xe1, 0x02, 0x86, 0xb8, 0x62, 0x45, 0xaa, 0x61, 0x11, 0xde, 0x99, 0x8c, 0xc7, + 0xce, 0x8d, 0x0d, 0x3c, 0x33, 0xfe, 0x2f, 0xcb, 0x0a, 0x80, 0xff, 0x07, 0x23, 0x58, 0x91, 0xcc, 0xfa, 0xc0, 0x57, 0x20, 0x24, 0x7c, 0xa8, 0xf7, 0x2e, 0x28, 0xfd, 0x60, 0x92, 0x9e, 0x93, 0xdc, + 0xf0, 0xd8, 0x66, 0xc4, 0xda, 0x1e, 0xfc, 0x29, 0xcc, 0xe1, 0xe8, 0x73, 0xb0, 0xb8, 0x7b, 0x78, 0x1e, 0x4e, 0x9f, 0x26, 0x77, 0xd3, 0x60, 0xf8, 0x6c, 0x50, 0xdc, 0x40, 0xb7, 0x2e, 0x6c, 0xc2, + 0x5c, 0xfa, 0x16, 0x45, 0xb3, 0xbe, 0xed, 0xc4, 0xa7, 0x01, 0x97, 0x03, 0xcd, 0xbe, 0x31, 0xe2, 0x83, 0x03, 0x9c, 0x83, 0x6e, 0xe5, 0x1e, 0x00, 0x3e, 0x9e, 0xf0, 0xf0, 0x11, 0xba, 0x87, 0xbb, + 0x2f, 0xbb, 0xed, 0xbb, 0x4c, 0xb4, 0xdd, 0xeb, 0xce, 0x31, 0x5b, 0x33, 0x66, 0x3a, 0x57, 0xb6, 0xb0, 0x93, 0xef, 0xb2, 0x68, 0x1b, 0xbf, 0x0f, 0x65, 0xc2, 0xa3, 0x04, 0x32, 0xab, 0x4a, 0x91, + 0x14, 0xae, 0xa9, 0x1b, 0x9c, 0x81, 0x3b, 0xb2, 0x05, 0x2d, 0x6b, 0xfb, 0x46, 0x3c, 0xb8, 0x50, 0x1a, 0x59, 0x5c, 0xb7, 0x7e, 0xec, 0x12, 0x24, 0x05, 0xbe, 0x9f, 0xd8, 0xfb, 0xe0, 0x71, 0x34, + 0x79, 0xae, 0xe3, 0x9a, 0x85, 0xd3, 0xd9, 0x28, 0x34, 0x1d, 0xf6, 0x3c, 0x0b, 0x1e, 0x7e, 0x83, 0x9b, 0x1d, 0x43, 0x66, 0x74, 0xfd, 0x6c, 0x23, 0x06, 0x35, 0x7b, 0xe7, 0xa2, 0x3a, 0x47, 0x46, + 0x99, 0x20, 0xe1, 0x99, 0x6a, 0x29, 0x79, 0x9a, 0xc2, 0x12, 0x41, 0xb1, 0x8d, 0xd5, 0x93, 0x1f, 0xc5, 0xff, 0xef, 0x20, 0xfc, 0xab, 0xc0, 0xdb, 0xd3, 0x37, 0x61, 0x19, 0xd6, 0xbc, 0xee, 0xd8, + 0xaf, 0x12, 0xa5, 0x12, 0x59, 0xa4, 0xb1, 0x41, 0x5b, 0xa8, 0x4a, 0xfc, 0x8c, 0x50, 0x10, 0x8f, 0xf1, 0x20, 0x0b, 0xbb, 0xfe, 0x28, 0x28, 0xdd, 0xa9, 0x4c, 0xed, 0xf4, 0xdd, 0xe1, 0xb9, 0x84, + 0x7c, 0x79, 0x9e, 0x04, 0xf7, 0xa3, 0x5d, 0x98, 0xae, 0xf8, 0x9d, 0xb5, 0x05, 0xa5, 0x75, 0x04, 0x4e, 0x14, 0x9c, 0xa5, 0x8d, 0xe4, 0x31, 0x64, 0x8c, 0x0b, 0xcf, 0x59, 0x63, 0xb4, 0x56, 0xbf, + 0x7f, 0xed, 0xc1, 0xf7, 0x1d, 0x3b, 0xf3, 0xad, 0xd2, 0x98, 0xf9, 0xb2, 0xd0, 0x7e, 0x4e, 0x5c, 0xe8, 0x54, 0x78, 0xdd, 0x4b, 0x68, 0x48, 0x88, 0xd2, 0x8c, 0x34, 0xc6, 0xf6, 0xfa, 0x72, 0xe3, + 0xb3, 0xb9, 0xae, 0x96, 0x4c, 0xe1, 0x90, 0x13, 0x46, 0x5a, 0xd2, 0x16, 0x6e, 0x40, 0x60, 0x69, 0x17, 0x3c, 0xeb, 0xe3, 0xea, 0x6b, 0x63, 0x7f, 0xbb, 0x8f, 0x85, 0x32, 0x88, 0x8c, 0x19, 0x88, + 0x6b, 0x3b, 0xbf, 0x80, 0x69, 0xb2, 0x03, 0xd3, 0xfe, 0x1a, 0x75, 0xb0, 0x54, 0x32, 0x2d, 0x34, 0x9a, 0x32, 0xf2, 0x7a, 0x3d, 0x17, 0xab, 0xcd, 0xd8, 0x00, 0xc6, 0xab, 0xb7, 0x7b, 0x0c, 0x5f, + 0xb8, 0xd2, 0xaa, 0x0f, 0x64, 0x3a, 0x85, 0x6b, 0x23, 0xe0, 0x10, 0x25, 0x18, 0x7d, 0x33, 0xe2, 0xc4, 0x77, 0x1d, 0xa7, 0xcc, 0x3d, 0x5a, 0x28, 0x2d, 0xb3, 0xa6, 0xf1, 0x3d, 0xc3, 0x90, 0x33, + 0x62, 0x19, 0xea, 0x5d, 0xf2, 0x6a, 0x22, 0xb2, 0x86, 0xf4, 0x3a, 0x81, 0xde, 0xda, 0x85, 0x06, 0x27, 0x07, 0x11, 0xf5, 0xdf, 0xee, 0xb9, 0x26, 0x71, 0x55, 0xd6, 0x4c, 0x01, 0xdd, 0xb4, 0x2a, + 0xe0, 0x7e, 0x2b, 0x5f, 0x79, 0xe7, 0x80, 0xf8, 0x15, 0x03, 0x5e, 0xaf, 0x99, 0xf7, 0x1a, 0xfe, 0x58, 0xe4, 0x85, 0x9e, 0x6b, 0x42, 0x96, 0x9d, 0x8d, 0xa4, 0xb9, 0xe7, 0x06, 0x44, 0x91, 0xa6, + 0xd7, 0x07, 0x76, 0x34, 0x6d, 0x8f, 0x2c, 0x9b, 0xf1, 0x4e, 0x6b, 0x8e, 0xa2, 0xc6, 0xec, 0xd9, 0x40, 0x7a, 0xd7, 0x27, 0x4e, 0xf6, 0x37, 0x62, 0x9b, 0x3f, 0x33, 0x5d, 0xb9, 0xd8, 0x4f, 0x78, + 0x2d, 0x56, 0xda, 0x8f, 0xfa, 0xa6, 0x03, 0xce, 0x82, 0x69, 0x00, 0x6e, 0xb1, 0x58, 0xa5, 0xec, 0x8c, 0xdd, 0x35, 0xea, 0xda, 0x92, 0x77, 0xb6, 0xbf, 0xfb, 0xc6, 0xc6, 0x91, 0xe5, 0x57, 0x88, + 0x98, 0x8e, 0x12, 0xf0, 0xc6, 0xd3, 0x91, 0x7d, 0x2d, 0x9a, 0x97, 0x26, 0x1e, 0xa7, 0x15, 0xce, 0xb6, 0xdc, 0x28, 0x0c, 0xa7, 0x21, 0x98, 0xb0, 0x4c, 0x59, 0x7d, 0x30, 0xbd, 0xf6, 0xb6, 0xfc, + 0x7f, 0x84, 0xee, 0x87, 0xee, 0x09, 0x08, 0x2b, 0x50, 0x69, 0x5b, 0xce, 0xdb, 0x2b, 0x01, 0xde, 0xae, 0xcf, 0x66, 0x41, 0xfc, 0x54, 0xd5, 0x57, 0x5b, 0x48, 0xf5, 0x78, 0x87, 0x19, 0x3f, 0x4a, + 0xa5, 0xc2, 0xb6, 0x4c, 0x9b, 0xf1, 0x7a, 0x32, 0xfb, 0x7e, 0x5e, 0xc1, 0x69, 0xce, 0x5a, 0x48, 0x42, 0xf0, 0x7d, 0xff, 0xd4, 0x56, 0xa7, 0xfd, 0xaf, 0xd7, 0x77, 0x4a, 0xae, 0xc9, 0x8c, 0x79, + 0x3b, 0x55, 0x52, 0x58, 0xd5, 0xc0, 0xa1, 0xe0, 0xc8, 0x42, 0xe7, 0x85, 0x7e, 0x53, 0x62, 0x4e, 0x45, 0xf3, 0x58, 0x74, 0xea, 0x8b, 0xb2, 0x77, 0x20, 0x21, 0x3f, 0xed, 0x6d, 0xdb, 0x2a, 0x65, + 0x84, 0xc2, 0xfe, 0xe5, 0xf5, 0xce, 0xaa, 0xc8, 0x9f, 0x1c, 0xcb, 0xbe, 0xc5, 0x9c, 0x5a, 0x8e, 0x9d, 0x61, 0xe2, 0x6c, 0xda, 0x77, 0xe5, 0x1b, 0x11, 0x32, 0xf3, 0x9d, 0xe1, 0x78, 0xd8, 0x5f, + 0x1e, 0x55, 0x41, 0xbf, 0x01, 0xe5, 0x84, 0x94, 0xf6, 0xfa, 0xfe, 0xa1, 0x94, 0x69, 0x59, 0x25, 0xec, 0xd0, 0xfd, 0xc9, 0xc5, 0x55, 0x1b, 0x3c, 0x6d, 0x94, 0xfa, 0xb9, 0x60, 0x8e, 0x7e, 0x26, + 0x99, 0x2d, 0xc2, 0x3b, 0xaf, 0xa0, 0xb4, 0xdf, 0xb0, 0x78, 0x04, 0xb4, 0x0d, 0xd4, 0x50, 0x0a, 0x3c, 0x0e, 0xc8, 0xed, 0xc3, 0x17, 0xae, 0xbd, 0xab, 0xc6, 0xda, 0xae, 0xea, 0x1f, 0x12, 0x92, + 0xa5, 0xfd, 0xac, 0x3b, 0xa9, 0xf9, 0x33, 0x3a, 0x42, 0x24, 0x69, 0x87, 0x98, 0x8b, 0xf5, 0xb1, 0x4b, 0xac, 0x76, 0xcf, 0x35, 0x8b, 0xbe, 0x3d, 0x10, 0x8b, 0x4e, 0x7a, 0xb1, 0x89, 0xe9, 0x6f, + 0x4d, 0x4c, 0x9d, 0xea, 0x5f, 0xfb, 0xdf, 0xd1, 0xbb, 0xc8, 0xbe, 0x66, 0xda, 0x68, 0xda, 0x5f, 0x93, 0xd5, 0xaf, 0x7e, 0xd5, 0x27, 0x31, 0x2a, 0xcd, 0x85, 0xfd, 0x46, 0xeb, 0x81, 0x36, 0x31, + 0x2a, 0xd8, 0xb7, 0xf7, 0xf7, 0x46, 0xdd, 0x83, 0xe7, 0xf0, 0xac, 0x51, 0xa3, 0xd8, 0x78, 0xdd, 0xfb, 0xc7, 0xc9, 0xd3, 0xf3, 0x62, 0x3e, 0x0a, 0x8d, 0x2a, 0x77, 0x7b, 0xb5, 0x2c, 0xc1, 0xcf, + 0x3f, 0x43, 0xdb, 0xce, 0x59, 0x30, 0x9f, 0x3f, 0x4d, 0xc3, 0xe1, 0x7e, 0xe7, 0x09, 0x8f, 0x0e, 0xa2, 0x42, 0x12, 0xe6, 0x65, 0x79, 0xd3, 0x6a, 0x67, 0xef, 0xf1, 0x90, 0xad, 0x28, 0x61, 0xf4, + 0xfb, 0x57, 0xc8, 0x99, 0x52, 0xa5, 0xa4, 0xf8, 0xcc, 0xe9, 0x3d, 0x0a, 0x5f, 0xcb, 0xdb, 0x84, 0x51, 0x40, 0xc4, 0xb6, 0xc7, 0xcc, 0x07, 0x85, 0x4e, 0x50, 0x68, 0x1e, 0x31, 0x2d, 0xc9, 0x57, + 0xa8, 0xdd, 0x67, 0x9d, 0x67, 0x94, 0xe4, 0x60, 0xd1, 0x6b, 0x6b, 0xd9, 0x7f, 0x4d, 0xdd, 0x5b, 0xf7, 0x64, 0x25, 0x27, 0xa9, 0x31, 0x32, 0x9f, 0xf1, 0x33, 0x87, 0xb3, 0x61, 0xcd, 0x30, 0x6e, + 0xdb, 0xb1, 0x6d, 0xa5, 0xd5, 0x91, 0x19, 0x84, 0xba, 0x20, 0x51, 0x5d, 0xe0, 0xed, 0x27, 0x6b, 0x42, 0xfb, 0x3b, 0x72, 0x5a, 0x44, 0xff, 0x48, 0x92, 0x4f, 0xca, 0xcd, 0x0c, 0xf3, 0xa2, 0x2e, + 0x71, 0xa9, 0xb8, 0xae, 0x55, 0xd5, 0x35, 0x60, 0x95, 0xb9, 0xc6, 0x99, 0x10, 0x59, 0x6c, 0x9a, 0xe5, 0xd7, 0xad, 0xc6, 0xdb, 0xea, 0x6b, 0x1d, 0x68, 0x19, 0xed, 0x37, 0xd0, 0x32, 0x82, 0x1b, + 0xb8, 0xad, 0x3f, 0xe4, 0x05, 0x96, 0xee, 0xb7, 0xe7, 0x1c, 0xf8, 0x32, 0x47, 0xe1, 0xde, 0x3a, 0xbd, 0xa3, 0x77, 0xf5, 0xd4, 0x76, 0xbb, 0xbb, 0x0d, 0x57, 0x52, 0x35, 0x24, 0xbe, 0xb9, 0xe4, + 0x35, 0x8b, 0x7b, 0x6f, 0x61, 0x25, 0xed, 0xeb, 0xa2, 0xf6, 0xd7, 0xf3, 0x35, 0x31, 0xa1, 0x56, 0x48, 0xa6, 0x55, 0x3c, 0x5a, 0x46, 0x7d, 0xb8, 0xea, 0xc3, 0x9d, 0x14, 0x6b, 0xff, 0x3e, 0xf8, + 0xef, 0xf3, 0x63, 0x70, 0xb7, 0x18, 0x1d, 0x1d, 0x3f, 0xb9, 0x3a, 0x69, 0x19, 0x1d, 0x4e, 0xbe, 0x76, 0x3a, 0xaf, 0x9d, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, 0xac, + 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, + 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4b, 0x0a, 0xc2, 0x40, 0x0c, 0xc6, 0xf1, 0x7d, 0xef, 0x92, 0x2f, 0x3e, 0x50, 0x50, 0xf0, 0x18, 0x1e, 0x20, 0xd5, 0xc1, 0xc6, 0xc7, 0x4c, 0x48, 0xa3, 0x82, + 0xa7, 0x17, 0x67, 0xba, 0xe9, 0xce, 0x5d, 0xfe, 0x3f, 0x08, 0xdf, 0x59, 0xc7, 0x70, 0xed, 0x9f, 0xa1, 0x25, 0x1f, 0xfd, 0x7e, 0x18, 0x22, 0x6c, 0xdc, 0x33, 0x7b, 0xb2, 0x82, 0x87, 0xbc, 0x52, + 0x86, 0x98, 0x9c, 0x86, 0x84, 0xe2, 0x17, 0xae, 0xb0, 0xe2, 0xdf, 0xd9, 0xb4, 0xc9, 0x14, 0xd4, 0x62, 0x8d, 0x1d, 0x96, 0x33, 0xa2, 0x4a, 0xd4, 0x6b, 0xc6, 0x47, 0xad, 0x7b, 0xbb, 0x98, 0x25, + 0xff, 0x7b, 0x4e, 0x0b, 0x87, 0xdc, 0xc4, 0xb5, 0x01, 0x4d, 0xff, 0xbc, 0xc0, 0x06, 0xdb, 0xb9, 0x51, 0x35, 0x5c, 0xc5, 0xbb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x62, + 0xfd, 0x25, 0x59, 0x77, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xd4, 0x58, 0xeb, 0x6f, 0xdc, 0xb8, 0x11, 0xff, 0xce, 0xbf, 0x62, 0xba, 0x36, 0x70, 0x17, 0xc3, 0xd2, 0x26, 0x0d, 0x0e, 0x05, 0x16, 0x4d, + 0x00, 0xbf, 0x92, 0xdb, 0xd4, 0xeb, 0x33, 0x36, 0xeb, 0x1c, 0x0e, 0x77, 0x85, 0x45, 0x51, 0xa3, 0x15, 0xbd, 0x14, 0xa9, 0x92, 0x94, 0x36, 0x0b, 0x14, 0xfd, 0xdb, 0x8b, 0x21, 0xa5, 0x7d, 0xf8, + 0x71, 0xcd, 0xf5, 0x53, 0xeb, 0x4f, 0xb2, 0x38, 0x33, 0x9c, 0xf9, 0xcd, 0x6f, 0x1e, 0xda, 0x23, 0xf8, 0xd0, 0x6a, 0xe1, 0xa5, 0xd1, 0xd0, 0x58, 0xf3, 0x80, 0xc2, 0x33, 0xf6, 0x33, 0x2a, 0x61, + 0x6a, 0x04, 0x6f, 0x60, 0x63, 0x5a, 0x0b, 0x1a, 0xd7, 0x4f, 0xa4, 0xfe, 0xc4, 0xd8, 0xa2, 0x92, 0x0e, 0x1c, 0xaf, 0x1b, 0x85, 0xc3, 0x5b, 0x10, 0x46, 0x7b, 0x2e, 0xb5, 0x03, 0x0e, 0x4e, 0xea, + 0xa5, 0x42, 0x28, 0x07, 0xc5, 0x9c, 0x3b, 0x2c, 0xc0, 0x68, 0xf8, 0xdc, 0x58, 0xa9, 0x97, 0x70, 0xa1, 0x4c, 0x5b, 0x6c, 0xed, 0x4e, 0x20, 0x43, 0x51, 0x99, 0xf4, 0x4a, 0x54, 0x66, 0x78, 0x97, + 0x9d, 0xc2, 0xba, 0x92, 0xa2, 0x02, 0x8b, 0xbe, 0xb5, 0x64, 0x54, 0x03, 0x09, 0x81, 0x29, 0xc1, 0x57, 0x08, 0x05, 0xf7, 0x1c, 0x1a, 0xee, 0xc8, 0x6e, 0x27, 0x79, 0xb4, 0x78, 0xd5, 0xa1, 0xf6, + 0x2e, 0x65, 0xec, 0xe8, 0x08, 0xae, 0x8d, 0xe0, 0x0a, 0xf0, 0x2b, 0x8a, 0x96, 0xec, 0x31, 0x36, 0xe3, 0x2b, 0x04, 0xd7, 0x5a, 0x04, 0x5f, 0x71, 0x0f, 0xd9, 0x27, 0xde, 0x71, 0x78, 0xf3, 0x17, + 0xf8, 0x7c, 0xf9, 0xb7, 0x0c, 0xa4, 0x03, 0xa9, 0x9d, 0xe7, 0x4a, 0x61, 0x41, 0xde, 0x0b, 0x1c, 0x5c, 0x3d, 0x37, 0xc6, 0xc3, 0xdb, 0xf4, 0x35, 0x58, 0xfc, 0x47, 0x2b, 0x2d, 0x3a, 0xe8, 0x15, + 0x53, 0xc6, 0x16, 0x06, 0x9c, 0xe7, 0xd6, 0x83, 0x43, 0xdb, 0xa1, 0x05, 0x45, 0x77, 0xaa, 0x0d, 0xd8, 0x56, 0x43, 0x96, 0x8e, 0xeb, 0x4e, 0xaf, 0xc1, 0x05, 0x33, 0x49, 0x6e, 0x8c, 0x9f, 0xd8, + 0x56, 0x67, 0x29, 0x5b, 0x54, 0x08, 0xc2, 0xd4, 0x35, 0xd7, 0x45, 0x54, 0x77, 0x50, 0x79, 0xdf, 0x0c, 0x46, 0xe8, 0x35, 0x6f, 0xbd, 0xa9, 0xb9, 0x97, 0xd1, 0xdc, 0x9a, 0x7b, 0x51, 0xa1, 0x83, + 0xd2, 0x58, 0x10, 0x15, 0xd7, 0x4b, 0x74, 0x04, 0x83, 0x33, 0xad, 0x15, 0x64, 0xaa, 0xc0, 0x94, 0x4d, 0x0f, 0xfe, 0xdf, 0x8a, 0x11, 0x54, 0xf1, 0x19, 0xd6, 0x52, 0x29, 0xc8, 0x43, 0xba, 0x1a, + 0xbe, 0xe4, 0x1e, 0x0b, 0x4a, 0xb2, 0x6d, 0xb5, 0xa6, 0x30, 0xe3, 0xe5, 0x29, 0x4c, 0x3d, 0x70, 0xe5, 0x0c, 0x98, 0x06, 0xb5, 0x83, 0x02, 0xf3, 0x76, 0xb9, 0xa4, 0xf3, 0xc6, 0x58, 0x0f, 0xd9, + 0x0f, 0xaf, 0x5f, 0xff, 0x90, 0x31, 0x67, 0x80, 0xf7, 0x47, 0x68, 0x41, 0x70, 0x4d, 0x66, 0xb9, 0xf7, 0x5c, 0x54, 0x58, 0x80, 0x2c, 0x41, 0x23, 0x16, 0x58, 0x44, 0x80, 0x08, 0x0b, 0x8f, 0xce, + 0xbb, 0x67, 0xd1, 0xa1, 0x93, 0x2c, 0x26, 0x8c, 0x60, 0xc9, 0x88, 0x31, 0x19, 0x5c, 0x5c, 0x4f, 0x19, 0x9b, 0xfa, 0xef, 0x1c, 0x58, 0x24, 0xa4, 0x50, 0x17, 0xd1, 0x5b, 0x87, 0x1e, 0xb2, 0x0f, + 0x77, 0x37, 0x17, 0xf7, 0xf3, 0xab, 0x8f, 0xd3, 0xcf, 0x8b, 0xf9, 0x2f, 0x19, 0xa0, 0xee, 0xa4, 0x35, 0xba, 0x46, 0xed, 0xa1, 0xe3, 0x56, 0xf2, 0x5c, 0x61, 0xca, 0x58, 0x96, 0x65, 0xae, 0x42, + 0xa5, 0xc0, 0x09, 0x2b, 0x1b, 0xcf, 0x8e, 0xc0, 0x62, 0xa3, 0xb8, 0x40, 0xf8, 0xd7, 0x38, 0xcd, 0xb9, 0xab, 0xac, 0x80, 0x7c, 0x13, 0x49, 0x1e, 0x05, 0xad, 0x80, 0x52, 0x2a, 0xdc, 0x93, 0x2c, + 0x8c, 0x58, 0xa1, 0x4d, 0xa5, 0x19, 0x3f, 0x98, 0x4a, 0x17, 0x86, 0x40, 0xf4, 0x55, 0xd4, 0xb1, 0xb8, 0x94, 0xce, 0xdb, 0x0d, 0xc3, 0xaf, 0x01, 0x9b, 0x03, 0xaf, 0xde, 0x3d, 0xd1, 0x64, 0x81, + 0xbc, 0xa3, 0x6f, 0x13, 0x1e, 0xc1, 0xfb, 0xf7, 0x3b, 0x37, 0x29, 0x14, 0x42, 0xe8, 0x08, 0xce, 0x5b, 0xa9, 0x0a, 0xa9, 0x97, 0x7d, 0xfd, 0x0d, 0x24, 0xca, 0xe9, 0x75, 0xa8, 0x90, 0x9f, 0x2e, + 0xa6, 0x20, 0x6b, 0xbe, 0xc4, 0xc0, 0x15, 0x4a, 0xfe, 0x50, 0x82, 0x29, 0x9c, 0x6f, 0xa0, 0xc0, 0x92, 0xb7, 0xca, 0x9f, 0x82, 0x27, 0xf5, 0x48, 0x08, 0xd2, 0x05, 0x0e, 0x9f, 0xbe, 0xcc, 0xa2, + 0xe6, 0x33, 0xd0, 0x91, 0x8d, 0x5e, 0x30, 0xe9, 0xe0, 0xc9, 0xdf, 0x51, 0x7f, 0x16, 0xd4, 0xa3, 0xb3, 0x27, 0x27, 0x37, 0xc6, 0xe3, 0xc9, 0xc9, 0x04, 0xa6, 0x25, 0xc1, 0x05, 0x6b, 0xae, 0x3d, + 0x25, 0x10, 0x35, 0xa5, 0x27, 0x78, 0xa6, 0xb9, 0x97, 0x1d, 0x46, 0xdd, 0xd3, 0x20, 0x44, 0xb4, 0x09, 0x42, 0x85, 0xf4, 0x41, 0x24, 0xd0, 0x21, 0xdd, 0xf0, 0x5a, 0x65, 0x21, 0x35, 0x54, 0x1b, + 0x8c, 0x38, 0x10, 0x0e, 0xcf, 0x6f, 0xef, 0x6f, 0xce, 0x16, 0xd3, 0x2f, 0x57, 0xf7, 0xd3, 0xd9, 0xd9, 0xc7, 0xab, 0x2c, 0xc2, 0x83, 0xf6, 0x4a, 0x77, 0x5b, 0x22, 0x90, 0x39, 0x6f, 0x5b, 0x9c, + 0x84, 0xa8, 0xc8, 0x12, 0x0b, 0x17, 0x5e, 0xe9, 0xce, 0x4d, 0x18, 0x40, 0x02, 0x9a, 0xd7, 0x38, 0x81, 0x47, 0xb6, 0x18, 0xc5, 0xd5, 0x71, 0xd5, 0xe2, 0x04, 0x46, 0xa4, 0x3f, 0x7a, 0x21, 0xae, + 0x8a, 0x77, 0x08, 0xd2, 0xb9, 0x16, 0x5d, 0xe4, 0x06, 0x79, 0xf6, 0x6b, 0xdf, 0x3a, 0xce, 0x7e, 0x5a, 0xfc, 0xfd, 0x7b, 0x2a, 0x6d, 0x37, 0x19, 0x8f, 0x0b, 0x23, 0x5c, 0x1a, 0x9b, 0x01, 0x65, + 0xba, 0x6f, 0x0b, 0xa5, 0xe5, 0x35, 0xae, 0x8d, 0x5d, 0x85, 0xf3, 0xb1, 0x68, 0xad, 0x45, 0xed, 0xc7, 0x16, 0x4b, 0xb4, 0xa8, 0x05, 0x8e, 0x2b, 0x5f, 0xab, 0xb1, 0x30, 0x16, 0x53, 0x7a, 0x3a, + 0x0a, 0x4f, 0xdc, 0xf8, 0x57, 0x54, 0xc6, 0x02, 0x1d, 0x35, 0x5a, 0x90, 0x3a, 0x52, 0x72, 0x0f, 0x4a, 0x2a, 0x4a, 0xea, 0x9b, 0x31, 0xd3, 0xa6, 0x2c, 0x89, 0xeb, 0x84, 0x2b, 0xc9, 0xbf, 0x04, + 0x2d, 0x58, 0xac, 0x4d, 0x17, 0xb3, 0x93, 0x25, 0xb7, 0x31, 0x41, 0x19, 0xdd, 0x14, 0x24, 0x4a, 0x6b, 0xea, 0x2d, 0xf2, 0xb3, 0xb3, 0x2f, 0x57, 0x37, 0xf7, 0xe7, 0x77, 0xd3, 0xeb, 0xcb, 0xfb, + 0xb3, 0xf9, 0xc7, 0xbb, 0xd9, 0xd5, 0xcd, 0xe2, 0xf3, 0xb3, 0x29, 0xf8, 0x06, 0xe8, 0x9f, 0x35, 0xb6, 0x9f, 0x83, 0xc1, 0x19, 0x48, 0x2e, 0x6b, 0xde, 0xa1, 0x4e, 0xa9, 0x6f, 0xa4, 0x6e, 0x25, + 0x9b, 0x77, 0x94, 0x1d, 0x48, 0x12, 0x6d, 0x12, 0x6f, 0xb9, 0x76, 0x25, 0xda, 0xa4, 0xb1, 0x66, 0x69, 0xd1, 0x39, 0x68, 0xb8, 0x58, 0x6d, 0x39, 0xf9, 0x1e, 0xe6, 0x14, 0xde, 0x16, 0x80, 0xa7, + 0x01, 0xd6, 0xc8, 0xb5, 0x8b, 0xd3, 0x21, 0xd0, 0xd1, 0x80, 0x32, 0x9a, 0x5a, 0xdc, 0xd0, 0x3a, 0x07, 0x46, 0xf5, 0x45, 0x43, 0x93, 0xae, 0xf7, 0x6b, 0x28, 0x1d, 0xaa, 0xd2, 0x79, 0x6c, 0xa9, + 0x8f, 0x8a, 0xd4, 0xb6, 0xda, 0x6d, 0x2b, 0x72, 0xdb, 0x0b, 0xa5, 0x06, 0x3e, 0x0c, 0x4e, 0xb4, 0xac, 0x75, 0x83, 0x7b, 0xb1, 0x8a, 0x85, 0xc5, 0xd0, 0xa8, 0x79, 0x6e, 0xba, 0x17, 0x2b, 0xd3, + 0xb6, 0x7a, 0xd7, 0x22, 0x2e, 0xb1, 0x51, 0x66, 0xf3, 0xf4, 0xfa, 0xfd, 0x62, 0xd7, 0x05, 0x14, 0x41, 0xec, 0xa0, 0x43, 0x80, 0xd4, 0xde, 0x80, 0x50, 0xad, 0xf3, 0x68, 0x5f, 0xba, 0xab, 0xd7, + 0x4b, 0x3a, 0x38, 0x8a, 0x73, 0xc2, 0x5b, 0x49, 0x53, 0xc0, 0x45, 0xdb, 0x3b, 0x3f, 0x3e, 0x18, 0x0b, 0x67, 0xf3, 0xd9, 0x40, 0x53, 0x63, 0xfb, 0x1d, 0xc0, 0x6d, 0x9c, 0xc7, 0xda, 0x31, 0x36, + 0xf4, 0xb2, 0x83, 0x39, 0xcb, 0x9b, 0xa6, 0xaf, 0xa3, 0x5b, 0xbe, 0x42, 0x6f, 0x22, 0x9f, 0x28, 0x8d, 0x8e, 0xb6, 0x07, 0xae, 0x7f, 0xc7, 0xe6, 0x29, 0x28, 0xb9, 0xc2, 0x20, 0xd3, 0xd0, 0x5a, + 0x32, 0xe3, 0x22, 0x37, 0x66, 0x15, 0xcd, 0x71, 0x0d, 0xb3, 0x37, 0x60, 0x2c, 0xcc, 0xfe, 0x0c, 0xa2, 0x92, 0xcd, 0x29, 0x14, 0x06, 0x9d, 0xfe, 0xce, 0x03, 0x15, 0x1f, 0xac, 0x29, 0x4e, 0x1e, + 0xfb, 0x4a, 0x6d, 0x68, 0x94, 0xa4, 0x34, 0xbb, 0xc2, 0x19, 0xb7, 0xa6, 0xd5, 0x45, 0x2c, 0xa4, 0xa1, 0xb4, 0x22, 0x90, 0xbb, 0x3c, 0x99, 0xbe, 0x02, 0x43, 0x5a, 0x7b, 0x7f, 0x20, 0x26, 0xf3, + 0xd7, 0x4f, 0x32, 0xdf, 0x75, 0x81, 0xa5, 0xf4, 0x55, 0x9b, 0xa7, 0xc2, 0xd4, 0xe3, 0x8f, 0xc6, 0x2c, 0x15, 0x5e, 0x0c, 0xb9, 0x5f, 0x18, 0xa3, 0xdc, 0xf8, 0x41, 0xe6, 0xaf, 0xc2, 0x86, 0xa0, + 0x63, 0x1d, 0xaf, 0x4d, 0xab, 0x0e, 0xb2, 0xf5, 0x49, 0xe6, 0xb0, 0x44, 0x8d, 0x36, 0xf0, 0x62, 0xaf, 0x63, 0xb3, 0x7e, 0xa2, 0x0a, 0x53, 0x37, 0x44, 0x66, 0x61, 0xea, 0x74, 0x19, 0xae, 0x48, + 0x05, 0xed, 0x46, 0xa9, 0xa7, 0x0b, 0x26, 0x0f, 0x32, 0x4f, 0x42, 0x09, 0x25, 0x8d, 0x6a, 0x97, 0x52, 0x4f, 0xde, 0xa6, 0x6f, 0xd3, 0x37, 0x93, 0x38, 0x82, 0xce, 0x63, 0x8f, 0xbf, 0x0c, 0x66, + 0xdf, 0x1d, 0x1f, 0x4c, 0xa9, 0x31, 0x0d, 0xb0, 0x43, 0x12, 0x24, 0x01, 0x86, 0x77, 0x25, 0x57, 0x8e, 0x4a, 0xf0, 0x65, 0xad, 0x9e, 0x15, 0xbb, 0x45, 0x52, 0xea, 0xce, 0x08, 0x1e, 0xf7, 0xb2, + 0x67, 0x57, 0x42, 0x07, 0x5c, 0x29, 0xb3, 0x8e, 0x88, 0xd3, 0x9a, 0x62, 0x5a, 0x8f, 0xfb, 0x4b, 0x5e, 0xd8, 0x06, 0x1a, 0x14, 0xb2, 0x94, 0x62, 0x4b, 0x61, 0x07, 0xbb, 0x02, 0xca, 0x2e, 0x30, + 0x59, 0x6c, 0x1a, 0xcc, 0x68, 0x33, 0xb1, 0x32, 0x6f, 0x3d, 0xa6, 0xec, 0x43, 0x98, 0x8a, 0xd2, 0x01, 0x7e, 0x0d, 0xbb, 0xeb, 0x69, 0x10, 0xdd, 0x99, 0xa5, 0x3d, 0x30, 0x5c, 0x15, 0xe6, 0x50, + 0x30, 0x43, 0x01, 0x64, 0x7b, 0x63, 0xf4, 0x97, 0x9e, 0x02, 0x05, 0x96, 0x52, 0x23, 0xd4, 0xad, 0xf2, 0xb2, 0xd9, 0xdb, 0x75, 0xc3, 0x22, 0x29, 0x0b, 0x8c, 0xf7, 0x0c, 0x7b, 0x35, 0x0f, 0x0c, + 0x42, 0x0d, 0xad, 0xc3, 0x97, 0xdc, 0xdb, 0xc5, 0x59, 0xc8, 0x32, 0xf4, 0x7f, 0xff, 0x38, 0xe2, 0xdd, 0xc1, 0x16, 0xa8, 0x94, 0x5d, 0x54, 0x28, 0x56, 0xd1, 0xa8, 0xb3, 0x62, 0x5c, 0x73, 0xa9, + 0xc7, 0x16, 0xe3, 0x36, 0xe8, 0xc6, 0xbc, 0x69, 0x94, 0x8c, 0x58, 0xa7, 0xb4, 0xfa, 0xa1, 0xf5, 0x12, 0x5d, 0xdf, 0xf4, 0x87, 0x2d, 0x21, 0x1b, 0xbc, 0x9f, 0xd3, 0xfd, 0x36, 0xa3, 0x96, 0x54, + 0xca, 0x65, 0x6b, 0x79, 0x7f, 0xc7, 0x8d, 0xf1, 0x52, 0xe0, 0xae, 0x37, 0x12, 0x02, 0xa1, 0xfe, 0x29, 0x9e, 0xac, 0xe1, 0xbe, 0x4a, 0x42, 0x2d, 0x66, 0x21, 0x02, 0xca, 0x41, 0xd8, 0x6e, 0x31, + 0x86, 0x0d, 0x5c, 0x6f, 0x00, 0x03, 0xc0, 0x7e, 0xd3, 0x20, 0xcd, 0xa2, 0x98, 0xbb, 0xcd, 0x90, 0xad, 0x6d, 0x13, 0x22, 0x53, 0xa7, 0xac, 0x7c, 0x94, 0xa7, 0x09, 0x8c, 0x8e, 0xef, 0xe6, 0xd7, + 0x81, 0x4d, 0xa3, 0x94, 0xf5, 0x79, 0xc4, 0xe1, 0xd8, 0x41, 0x8e, 0xca, 0xac, 0x4f, 0xa1, 0x51, 0xc8, 0x1d, 0x52, 0xab, 0x8e, 0x8b, 0x7e, 0xdc, 0x18, 0x43, 0x84, 0x77, 0xf3, 0xeb, 0xec, 0x70, + 0x2d, 0xa8, 0xb0, 0x87, 0xdb, 0x94, 0xb1, 0x7a, 0xb7, 0x49, 0x66, 0x8c, 0xb2, 0xbc, 0xec, 0x55, 0xa3, 0x50, 0xbe, 0x81, 0xd2, 0x10, 0x27, 0xc9, 0xe5, 0xbe, 0xab, 0xbe, 0xd4, 0x25, 0xa5, 0x2e, + 0x7b, 0xd2, 0xd3, 0xba, 0x10, 0x8c, 0x84, 0x41, 0x46, 0x37, 0x9d, 0x9c, 0x04, 0x8c, 0xdd, 0xe4, 0xe4, 0x64, 0x37, 0x51, 0x4d, 0xeb, 0x9b, 0xd6, 0x9f, 0xc6, 0xfd, 0xf6, 0x38, 0xb8, 0xea, 0x0d, + 0x48, 0xef, 0xa2, 0x5e, 0xca, 0xd8, 0xfd, 0xfd, 0x62, 0x7a, 0x7b, 0x7f, 0x3f, 0x61, 0xac, 0xdf, 0x3c, 0x02, 0xf0, 0x2b, 0x9d, 0x45, 0x5a, 0x0d, 0x39, 0x19, 0xc2, 0x6d, 0xad, 0x82, 0x7c, 0x33, + 0x79, 0x6e, 0x0d, 0x5e, 0xe9, 0xb0, 0xec, 0x53, 0x3a, 0x0b, 0xa4, 0xb7, 0x39, 0xc2, 0x5f, 0xb7, 0xf8, 0xd3, 0x4c, 0x7e, 0x1f, 0x93, 0x57, 0x99, 0x75, 0x1f, 0x7b, 0x6b, 0xd5, 0xb0, 0xe6, 0xde, + 0xcd, 0xaf, 0xdf, 0x1d, 0x7f, 0xff, 0x9c, 0x8d, 0xe3, 0xef, 0x89, 0x01, 0xa4, 0x0f, 0xc7, 0xb7, 0x3f, 0x5f, 0xbe, 0x82, 0xc4, 0xb4, 0x56, 0xbd, 0xda, 0x8d, 0x04, 0xba, 0x83, 0xb1, 0xbb, 0x50, + 0xa1, 0x59, 0x8f, 0x53, 0x67, 0x56, 0x98, 0xed, 0x0d, 0x29, 0x5f, 0x1d, 0x50, 0x7e, 0x57, 0x25, 0x3d, 0xad, 0x9e, 0x89, 0x68, 0xcf, 0x12, 0x24, 0x49, 0xe0, 0xd7, 0x28, 0xf0, 0x24, 0xde, 0x1c, + 0xef, 0xbb, 0x25, 0x86, 0x9e, 0x87, 0x69, 0xf1, 0xcd, 0x96, 0xb8, 0x25, 0x06, 0xec, 0x11, 0x6f, 0x17, 0x8a, 0xb8, 0x9b, 0x5f, 0x0f, 0xa6, 0xff, 0xa8, 0xbf, 0x82, 0x72, 0x93, 0x74, 0xbd, 0xe1, + 0x11, 0xfc, 0x46, 0xbb, 0xd0, 0x8f, 0x30, 0xa2, 0x49, 0x80, 0xda, 0x07, 0xfd, 0xc9, 0x5e, 0xd5, 0x8e, 0x1f, 0x9c, 0xd1, 0x7b, 0x62, 0x98, 0x4c, 0x8b, 0xc9, 0x9b, 0x83, 0x17, 0x9f, 0xdb, 0x9c, + 0xba, 0xcc, 0x84, 0x3e, 0xa0, 0x0f, 0x0f, 0x42, 0x13, 0x98, 0x84, 0x01, 0x90, 0x84, 0x02, 0x4c, 0xfa, 0x92, 0x39, 0x10, 0x0b, 0x57, 0xe2, 0x13, 0xe5, 0x06, 0x45, 0x87, 0xd6, 0xd1, 0x17, 0xfa, + 0x9b, 0xf4, 0x75, 0x7f, 0xb6, 0x86, 0xd1, 0x6f, 0x83, 0x3b, 0x05, 0x8c, 0x28, 0xb2, 0xff, 0x02, 0xea, 0x43, 0x10, 0x1e, 0x5d, 0xfd, 0x7f, 0x0f, 0x04, 0x51, 0xe4, 0xc7, 0xc5, 0xe2, 0x56, 0xe2, + 0x37, 0x92, 0xe4, 0x31, 0x3c, 0xe1, 0x63, 0x31, 0x58, 0x84, 0x7f, 0xc6, 0x1f, 0x07, 0x1e, 0x11, 0xe6, 0x77, 0x31, 0x8a, 0x12, 0x11, 0x9e, 0xe1, 0x79, 0x1f, 0x99, 0xed, 0xbb, 0x17, 0x41, 0x19, + 0x24, 0x82, 0xf9, 0xd9, 0x26, 0xce, 0xc6, 0x41, 0xeb, 0x10, 0x8d, 0xff, 0x94, 0xfa, 0x3f, 0x10, 0xda, 0x0e, 0xf8, 0xff, 0xb5, 0xf0, 0x8e, 0x8e, 0xe0, 0x42, 0x21, 0xd7, 0x6d, 0x13, 0x7f, 0xd3, + 0xd8, 0x7d, 0x27, 0xc5, 0x5d, 0x08, 0x8b, 0xdd, 0x04, 0x0b, 0x4d, 0x3d, 0xcc, 0x93, 0x7e, 0x97, 0x3e, 0xa5, 0x0d, 0x7d, 0xaf, 0x06, 0x86, 0x25, 0x4a, 0xa1, 0x8f, 0x9f, 0x26, 0xff, 0x0e, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd7, 0x9e, 0xd3, 0xdb, 0x9a, 0x07, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, + 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, + 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, + 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, + 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, + 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, + 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, 0x25, 0xd9, 0xb9, 0xba, 0x7b, 0x9e, 0xb3, 0x8f, + 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, 0x70, 0x81, 0x1d, 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, 0xff, 0x7e, 0xd5, 0x33, 0x12, 0x92, 0x00, 0x67, + 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, 0xa3, 0x7e, 0x7f, 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, 0x9f, 0x53, 0x83, 0x73, 0x16, 0x52, 0xae, 0x68, + 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, 0x26, 0x24, 0x9c, 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, 0xf6, 0x9b, 0x83, 0xd7, 0x07, 0x90, 0xf2, 0x88, + 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, 0x12, 0xe6, 0x42, 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, 0x74, 0x4e, 0xb9, 0x56, 0x3e, 0xc0, 0x80, 0x52, + 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, 0xda, 0x30, 0x61, 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, 0x14, 0xf2, 0x1e, 0x26, 0x42, 0x02, 0x89, 0x22, + 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, 0x84, 0x9c, 0x1b, 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, 0x67, 0x1a, 0xc4, 0x92, 0x53, 0xa9, 0x66, 0x2c, + 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, 0xeb, 0x5c, 0x14, 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, 0x84, 0xf7, 0x54, 0x2a, 0x54, 0xf7, 0xa5, 0x7f, + 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, 0xf6, 0xd2, 0x3d, 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, 0x34, 0xd1, 0xc0, 0x38, 0x84, 0x62, 0x9e, 0xc4, + 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, 0xd6, 0x1c, 0x7c, 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, 0x20, 0xda, 0xa9, 0x39, 0x35, 0x00, 0x80, 0x99, + 0xd6, 0x89, 0x3a, 0x09, 0x82, 0xe5, 0x72, 0xe9, 0x13, 0x23, 0xad, 0x2f, 0xe4, 0x34, 0xc8, 0xd5, 0x0b, 0xce, 0x3b, 0xad, 0x76, 0x77, 0xd0, 0xf6, 0x5e, 0xfa, 0x47, 0x06, 0xe5, 0x9a, 0xc7, 0x54, + 0x29, 0x90, 0xf4, 0x73, 0xca, 0x24, 0x8d, 0x60, 0xbc, 0x02, 0x92, 0x24, 0x31, 0x0b, 0xc9, 0x38, 0xa6, 0x10, 0x93, 0x25, 0x3a, 0xce, 0xf8, 0xc7, 0xb8, 0x9d, 0x71, 0x58, 0x4a, 0xa6, 0x19, 0x9f, + 0x1e, 0x3a, 0x35, 0x50, 0xb9, 0xe7, 0xcb, 0xde, 0x29, 0xac, 0x95, 0x4b, 0xc7, 0x54, 0x05, 0x40, 0x70, 0x20, 0xe8, 0x1a, 0xb7, 0x39, 0x80, 0xce, 0xc0, 0x85, 0x57, 0xcd, 0x41, 0x67, 0x70, 0x08, + 0x37, 0x9d, 0xab, 0xb7, 0xbd, 0xeb, 0x2b, 0xb8, 0x69, 0xf6, 0xfb, 0xcd, 0xee, 0x55, 0xa7, 0x3d, 0x80, 0x5e, 0x1f, 0x5a, 0xbd, 0xee, 0x59, 0xe7, 0xaa, 0xd3, 0xeb, 0x0e, 0xa0, 0xf7, 0x1a, 0x9a, + 0xdd, 0x3f, 0x9c, 0x1a, 0xfc, 0xde, 0xe9, 0x9e, 0x1d, 0x02, 0x65, 0x7a, 0x46, 0x25, 0xd0, 0x87, 0x44, 0xa2, 0x06, 0x42, 0x02, 0x43, 0x4b, 0xd2, 0xa8, 0x14, 0x43, 0xb9, 0x04, 0x18, 0x22, 0xd6, + 0x3d, 0x2a, 0xa1, 0x21, 0x9b, 0xb0, 0x10, 0x62, 0xc2, 0xa7, 0x29, 0x99, 0x52, 0x98, 0x8a, 0x05, 0x95, 0x1c, 0x23, 0x24, 0xa1, 0x72, 0xce, 0x14, 0x3a, 0x54, 0x01, 0xe1, 0x11, 0xc4, 0x6c, 0xce, + 0xb4, 0x09, 0x24, 0xe5, 0xd4, 0xb6, 0xf5, 0xf2, 0x7f, 0x76, 0x86, 0xfd, 0x6c, 0x7a, 0x35, 0xb8, 0x20, 0x0b, 0xca, 0x61, 0xa0, 0x89, 0xd4, 0x70, 0x9d, 0xc0, 0x2b, 0xa2, 0xc3, 0x19, 0xa8, 0x50, + 0xb2, 0xc4, 0x06, 0x4c, 0x3f, 0x77, 0x7b, 0xbb, 0xfb, 0x1e, 0x16, 0x44, 0xaa, 0x93, 0x9d, 0x32, 0x98, 0xd0, 0x7a, 0xd7, 0x7c, 0xdf, 0x1c, 0xbe, 0xed, 0x5d, 0xb4, 0xc1, 0x83, 0x58, 0x84, 0x36, + 0xcf, 0xc5, 0x04, 0x08, 0xbc, 0x3b, 0xfb, 0x1d, 0x66, 0x62, 0x8e, 0x61, 0x20, 0x0d, 0xd9, 0x5e, 0x92, 0xe5, 0x62, 0x4e, 0x76, 0x17, 0x55, 0x43, 0xf4, 0xe2, 0xe5, 0x2e, 0x92, 0x73, 0x14, 0xfb, + 0xe5, 0x9e, 0x02, 0xc6, 0x95, 0x26, 0x71, 0x4c, 0xa3, 0x12, 0x7d, 0xc4, 0x6a, 0xbe, 0x6f, 0x77, 0x87, 0xbd, 0xcb, 0xab, 0x01, 0x78, 0x90, 0x10, 0x49, 0xe6, 0x54, 0x53, 0xa9, 0x20, 0x21, 0xaa, + 0x54, 0x9e, 0xde, 0x91, 0x05, 0x81, 0xf7, 0x17, 0xb0, 0x9c, 0x51, 0x0e, 0x32, 0xe5, 0xc6, 0xc7, 0xc6, 0x22, 0x36, 0x55, 0x80, 0xfa, 0x53, 0x1f, 0x81, 0x23, 0x3a, 0x4e, 0xb3, 0x37, 0xc0, 0xb4, + 0xa2, 0xf1, 0xe4, 0x10, 0xd3, 0x35, 0x83, 0x02, 0x50, 0x54, 0x97, 0x58, 0x36, 0xbc, 0x0f, 0x16, 0xc1, 0xfb, 0x20, 0x53, 0x7e, 0x17, 0x2d, 0x93, 0x13, 0x2d, 0x09, 0x57, 0x89, 0x90, 0xba, 0x11, + 0xe9, 0xa1, 0x12, 0xe1, 0x3d, 0xd5, 0x87, 0x8a, 0xca, 0x05, 0x95, 0x8d, 0xd5, 0xa1, 0x4a, 0x55, 0x42, 0x79, 0xd4, 0x58, 0x1d, 0x92, 0x28, 0xc2, 0x50, 0x6d, 0xfc, 0xfb, 0xe8, 0xe8, 0xa8, 0xa4, + 0xc7, 0xe0, 0xf7, 0xce, 0xe5, 0xb0, 0xdf, 0x02, 0x0f, 0x26, 0x31, 0x99, 0x1a, 0x81, 0x98, 0xb2, 0xe9, 0x27, 0x88, 0x29, 0x5d, 0xb9, 0x49, 0x64, 0x68, 0xaa, 0xc7, 0x4e, 0x73, 0xfe, 0xc0, 0xcf, + 0x71, 0xd8, 0x04, 0x3e, 0x82, 0xf7, 0x27, 0xb8, 0xf5, 0x8a, 0x48, 0x2e, 0x7c, 0x82, 0x53, 0xb4, 0x25, 0x77, 0x1c, 0x00, 0x0b, 0x34, 0x81, 0x80, 0xea, 0x30, 0xc8, 0xe5, 0x59, 0x03, 0xa0, 0xa1, + 0xfc, 0xca, 0x3b, 0x07, 0x60, 0xc2, 0xca, 0x88, 0x6e, 0x1d, 0x7d, 0x1d, 0xf8, 0xd9, 0x7b, 0x77, 0x13, 0x79, 0xf3, 0x7d, 0x46, 0x00, 0xff, 0xad, 0x41, 0x6f, 0x50, 0xe4, 0xae, 0x4a, 0x13, 0xb4, + 0xb6, 0x0f, 0x50, 0x5f, 0x10, 0x09, 0xc3, 0x79, 0xaa, 0xf4, 0x10, 0xc6, 0xd4, 0x78, 0x4a, 0x8b, 0xbc, 0x34, 0x68, 0x99, 0x52, 0xac, 0x0b, 0x13, 0x12, 0x63, 0xb6, 0x86, 0xab, 0xe9, 0x92, 0xf1, + 0x86, 0x79, 0x3a, 0x75, 0x22, 0x22, 0x4b, 0x4f, 0x73, 0xc6, 0xa7, 0x4b, 0xfb, 0xe0, 0x84, 0x44, 0x51, 0x70, 0x47, 0x29, 0x27, 0x73, 0x3a, 0x72, 0x81, 0xa1, 0x78, 0xad, 0x3f, 0xde, 0xdc, 0x74, + 0xba, 0x2f, 0x0e, 0x20, 0x23, 0x62, 0x48, 0x9f, 0x9e, 0x3a, 0x00, 0x17, 0x9d, 0xee, 0x9b, 0x9b, 0x17, 0x07, 0x60, 0x29, 0xe0, 0xb9, 0x39, 0x3e, 0x33, 0xe4, 0x5f, 0x1c, 0x40, 0xc6, 0x07, 0x5f, + 0x18, 0x35, 0x6b, 0x70, 0xad, 0x28, 0x04, 0xa9, 0x92, 0x41, 0xcc, 0xc6, 0xf4, 0x81, 0x86, 0xc1, 0x1d, 0x59, 0x90, 0xa1, 0x09, 0x70, 0x36, 0x01, 0xb2, 0x20, 0x2c, 0x46, 0xef, 0x1f, 0x82, 0x40, + 0x2d, 0x96, 0x0c, 0xeb, 0x17, 0x89, 0x63, 0x18, 0x93, 0xf0, 0x1e, 0xb5, 0x0b, 0xce, 0xd9, 0x58, 0x12, 0xb9, 0x0a, 0x30, 0xc0, 0x83, 0xb7, 0x62, 0x9e, 0x13, 0xc6, 0xaa, 0x97, 0xd7, 0xff, 0x88, + 0x2e, 0x68, 0x2c, 0x12, 0x2a, 0x7d, 0x2c, 0xe7, 0xd4, 0x0f, 0xc5, 0x1c, 0xf9, 0x19, 0xbc, 0x39, 0x09, 0x83, 0xcf, 0x24, 0xf8, 0x4c, 0x8e, 0x8f, 0xff, 0x75, 0x14, 0x0c, 0x19, 0x8f, 0xe8, 0x83, + 0x3f, 0xd3, 0xf3, 0xd8, 0xd0, 0x29, 0x62, 0x61, 0x9d, 0xf1, 0x2e, 0x7c, 0x2a, 0x39, 0x2a, 0x07, 0x79, 0x00, 0x77, 0xb7, 0x1a, 0x9b, 0xe0, 0x80, 0x45, 0x5a, 0x48, 0x5d, 0x94, 0x90, 0x86, 0x3b, + 0xda, 0x8d, 0x3a, 0x72, 0x33, 0x1c, 0x8a, 0x9e, 0x78, 0x1a, 0x7d, 0xdb, 0x06, 0x39, 0xe2, 0x84, 0x39, 0xa5, 0xff, 0x9c, 0x9e, 0x3a, 0x54, 0x91, 0xb0, 0x1c, 0xe1, 0x65, 0xad, 0x8a, 0xf8, 0xb3, + 0xef, 0xa5, 0x0d, 0xe0, 0x29, 0xe5, 0x5a, 0x08, 0x4f, 0xd2, 0x98, 0x62, 0x2c, 0x54, 0xc2, 0xb4, 0x10, 0x62, 0x84, 0x52, 0x7b, 0xa1, 0xe0, 0x13, 0x36, 0x05, 0xcf, 0xbb, 0x93, 0xd4, 0x33, 0x2a, + 0xd8, 0xb0, 0xc5, 0xa8, 0x2d, 0xa5, 0xd5, 0xcb, 0x6d, 0x96, 0x35, 0xec, 0x4e, 0x94, 0x88, 0x17, 0x14, 0x62, 0xc6, 0xef, 0x15, 0x78, 0x50, 0x3f, 0x32, 0x77, 0xfd, 0x98, 0x02, 0x31, 0x67, 0xe8, + 0x6e, 0x93, 0x0d, 0x7b, 0xca, 0x54, 0x40, 0x07, 0xe0, 0xb2, 0xff, 0xa6, 0xe1, 0xd6, 0x8f, 0x5c, 0x4c, 0xac, 0x1a, 0x70, 0x73, 0x2f, 0x9b, 0xb6, 0x42, 0x48, 0x90, 0x34, 0x26, 0x9a, 0x2d, 0x28, + 0xa8, 0xd5, 0xdc, 0x90, 0x74, 0x00, 0x96, 0x33, 0xec, 0x37, 0x3e, 0x82, 0x37, 0x03, 0xb7, 0x7e, 0xd9, 0x7f, 0x63, 0x45, 0x88, 0x84, 0x51, 0x26, 0x56, 0x8d, 0x51, 0xac, 0xc0, 0x8b, 0xa3, 0xec, + 0xe5, 0xc8, 0x1e, 0x33, 0x7e, 0xdf, 0x18, 0xe1, 0xcd, 0x0a, 0x6e, 0x3d, 0x56, 0x2e, 0x9c, 0xc0, 0x9e, 0xff, 0xc2, 0xfb, 0x0d, 0x6e, 0xf7, 0xfd, 0x17, 0xb7, 0x07, 0xf5, 0xbd, 0x51, 0x1e, 0x29, + 0x39, 0x0c, 0xe3, 0xf7, 0x06, 0x2a, 0xf0, 0x5f, 0xec, 0xc1, 0x6f, 0x80, 0xe1, 0x17, 0xf0, 0x34, 0x8e, 0x2b, 0x71, 0x60, 0x45, 0x37, 0xb0, 0xce, 0x86, 0x8f, 0xcd, 0xab, 0x51, 0xc4, 0x24, 0x26, + 0x5d, 0x2e, 0x4b, 0x50, 0x82, 0x35, 0xfe, 0x8c, 0xb0, 0x95, 0x74, 0x00, 0x14, 0x59, 0xd0, 0x28, 0x62, 0xb2, 0x31, 0x4a, 0x96, 0xd1, 0x08, 0x4f, 0x32, 0xfb, 0x36, 0xb6, 0x48, 0xf8, 0xbe, 0x35, + 0xd4, 0x9c, 0xdc, 0x53, 0x60, 0x1a, 0x26, 0x69, 0x1c, 0xaf, 0xe0, 0x73, 0x4a, 0x62, 0x36, 0x61, 0x34, 0x2a, 0xa3, 0x86, 0x51, 0xd9, 0x51, 0xcf, 0x9f, 0x43, 0x4e, 0xdc, 0xbc, 0xc8, 0x79, 0xba, + 0x86, 0x1c, 0x0d, 0x67, 0x02, 0xae, 0x15, 0x16, 0xe7, 0xf9, 0x4b, 0x20, 0x1a, 0x72, 0xc4, 0xac, 0x5a, 0xbd, 0x16, 0x12, 0x5a, 0xa6, 0x54, 0x1c, 0x02, 0xe5, 0x2a, 0x95, 0x14, 0x12, 0xa2, 0x67, + 0x0a, 0xb0, 0x5b, 0x62, 0x1c, 0xae, 0xbb, 0x9d, 0x0f, 0x60, 0xfb, 0x54, 0x18, 0xd3, 0x09, 0x36, 0xc6, 0x84, 0xaf, 0xf4, 0x0c, 0x09, 0x32, 0x05, 0x5a, 0xa4, 0xe1, 0x8c, 0x46, 0x18, 0x40, 0x75, + 0x5b, 0x71, 0x8a, 0xb0, 0xf9, 0x08, 0x1e, 0xaf, 0x46, 0xd4, 0xf3, 0xe7, 0xc6, 0x44, 0x85, 0x22, 0xab, 0x29, 0x32, 0x03, 0xcf, 0x4b, 0x39, 0x7b, 0x28, 0xc1, 0x8e, 0x0a, 0xf4, 0x4a, 0x16, 0x64, + 0x04, 0x4a, 0xa1, 0xbd, 0x45, 0xa2, 0x80, 0x2f, 0x11, 0x69, 0x9d, 0x37, 0x07, 0x83, 0xcb, 0xe6, 0xd5, 0xdb, 0x12, 0x91, 0xf5, 0x59, 0x99, 0x48, 0x95, 0x56, 0x81, 0x36, 0x2a, 0x99, 0xeb, 0x02, + 0x0b, 0xe8, 0x0f, 0x5b, 0xcb, 0x94, 0xe1, 0xef, 0x30, 0x96, 0x3b, 0xda, 0xaf, 0xf8, 0xfd, 0x14, 0xbd, 0x7e, 0x60, 0xca, 0xd0, 0x37, 0x59, 0x2a, 0xc7, 0x2f, 0xa0, 0xd6, 0x14, 0xaa, 0x15, 0x60, + 0x67, 0x31, 0xc5, 0x0a, 0xd2, 0x7e, 0xa0, 0x61, 0xaa, 0xb1, 0xe2, 0x37, 0xdc, 0xd1, 0x72, 0xc6, 0xc2, 0x99, 0x39, 0x0e, 0x8d, 0x0c, 0x16, 0x1f, 0xc5, 0xa8, 0x82, 0x5a, 0x59, 0xe0, 0x19, 0x7c, + 0x04, 0xd7, 0x26, 0xea, 0xed, 0x26, 0xc8, 0xad, 0x49, 0xc8, 0xdb, 0xfd, 0x8f, 0xff, 0x07, 0x9f, 0x5e, 0xdc, 0x1e, 0xec, 0x8d, 0x5c, 0x68, 0x80, 0xcb, 0x45, 0xb5, 0x3a, 0x63, 0x0d, 0x22, 0x11, + 0xe6, 0xd9, 0xfe, 0xf1, 0x01, 0x1a, 0x13, 0x67, 0x95, 0xf5, 0x1d, 0x04, 0x44, 0x81, 0xd2, 0x84, 0x47, 0x44, 0x9a, 0xbe, 0x7d, 0x20, 0x62, 0x22, 0x99, 0x82, 0xe3, 0x23, 0xdf, 0x60, 0x23, 0xee, + 0xb9, 0x29, 0x16, 0x56, 0xf0, 0x9c, 0xd6, 0xa8, 0xb8, 0x49, 0x9e, 0x41, 0x5e, 0x48, 0x72, 0xe0, 0x4d, 0xb9, 0x76, 0x89, 0x65, 0x90, 0xeb, 0xf6, 0xee, 0x84, 0x8d, 0xcb, 0x04, 0xd5, 0xc4, 0x8a, + 0x5f, 0x2a, 0x18, 0x3b, 0x94, 0x5f, 0xdf, 0x24, 0x3b, 0xac, 0x1c, 0x46, 0x39, 0x06, 0xd2, 0xb9, 0xcd, 0x93, 0x1d, 0xbc, 0xcb, 0x91, 0xb9, 0x8a, 0xc2, 0x9d, 0xb7, 0xd0, 0x16, 0x99, 0x5c, 0x5b, + 0xec, 0x6d, 0xbe, 0x26, 0x41, 0x76, 0x17, 0x7d, 0xb7, 0xe4, 0x6b, 0xf0, 0xdc, 0x82, 0xf9, 0x41, 0x66, 0x41, 0xac, 0xc5, 0x38, 0xec, 0x67, 0xe5, 0xb8, 0x12, 0x96, 0x05, 0x6c, 0xae, 0xca, 0xc6, + 0x1d, 0x5a, 0x54, 0xd5, 0xad, 0xcb, 0x0a, 0x61, 0x5a, 0x17, 0x67, 0x3b, 0xee, 0xc7, 0x8d, 0x7c, 0xa8, 0xde, 0x8c, 0xeb, 0xae, 0xa0, 0x00, 0x09, 0xee, 0x24, 0x0d, 0xd4, 0xcc, 0x18, 0x75, 0xa3, + 0xdd, 0xc3, 0xd0, 0xeb, 0xbc, 0xba, 0xd8, 0x53, 0x66, 0x7c, 0x10, 0x1c, 0x9a, 0x9d, 0x0f, 0xd8, 0x75, 0x63, 0xc0, 0x49, 0xc2, 0xa7, 0x74, 0x3d, 0x11, 0xa8, 0x7c, 0x7c, 0x03, 0xba, 0xb6, 0x92, + 0x2a, 0x69, 0xdc, 0xba, 0x38, 0x6b, 0x3c, 0xc5, 0x73, 0xf3, 0x9e, 0xd9, 0x05, 0x3f, 0x66, 0xbc, 0x04, 0x6c, 0x4c, 0xb2, 0xc6, 0x58, 0xc3, 0x97, 0x32, 0x73, 0xe4, 0x6e, 0x18, 0xed, 0x59, 0xa1, + 0xf5, 0xa6, 0xd9, 0xcc, 0x3d, 0xe1, 0xb6, 0xa5, 0x14, 0xf2, 0xa4, 0x34, 0x41, 0x65, 0x79, 0x16, 0xd1, 0x09, 0xe3, 0x34, 0x82, 0x50, 0x48, 0x49, 0x43, 0x1d, 0xaf, 0x7c, 0x17, 0x7e, 0x7b, 0xfe, + 0x72, 0x8d, 0x07, 0x70, 0x43, 0x21, 0x24, 0x1c, 0x61, 0xad, 0xee, 0x14, 0x0a, 0x36, 0x19, 0xe4, 0x03, 0xd3, 0x70, 0xfc, 0x95, 0x62, 0xb3, 0x29, 0xcc, 0x0d, 0x31, 0xd3, 0x6e, 0x59, 0x1c, 0xca, + 0x17, 0x4c, 0x0a, 0x3e, 0xa7, 0x5c, 0xe3, 0xb8, 0xc6, 0x4c, 0xea, 0x67, 0x32, 0x2a, 0xaa, 0x7d, 0x5b, 0xcb, 0x4c, 0xd9, 0xbe, 0xe9, 0xf5, 0xcf, 0xcf, 0x06, 0xc3, 0xf3, 0xe6, 0x75, 0xb7, 0xf5, + 0xb6, 0xdd, 0x6f, 0x08, 0x39, 0xf5, 0x43, 0x11, 0xd1, 0x19, 0x49, 0x95, 0x9f, 0xc4, 0xf4, 0x21, 0x55, 0x7e, 0x18, 0x13, 0xa5, 0x96, 0x42, 0xc6, 0x91, 0xf2, 0x63, 0x92, 0xf2, 0x70, 0x46, 0xa5, + 0x7f, 0x9e, 0xfd, 0x81, 0xe5, 0x5e, 0x4b, 0xb2, 0xa0, 0x12, 0x7d, 0x1d, 0x31, 0x54, 0x5c, 0xc8, 0x15, 0x7a, 0x3d, 0x0d, 0x35, 0x96, 0xfe, 0x89, 0x14, 0x73, 0x48, 0xa4, 0x08, 0x71, 0xac, 0x37, + 0x1b, 0x9e, 0x02, 0x4a, 0x0b, 0x3b, 0x01, 0xad, 0x94, 0xa6, 0x73, 0x90, 0x42, 0x68, 0xa7, 0x06, 0x13, 0x26, 0x95, 0x2e, 0x01, 0x99, 0x2d, 0x8a, 0x3f, 0x5f, 0x70, 0x50, 0xe9, 0xb8, 0x38, 0x66, + 0x0a, 0x42, 0xc1, 0x15, 0x8b, 0x28, 0x4e, 0xbc, 0x89, 0x14, 0x77, 0x34, 0xd4, 0x30, 0xc6, 0x0e, 0x6f, 0x0d, 0xe4, 0x4c, 0x18, 0x8f, 0x86, 0xa6, 0xe5, 0x1a, 0xe2, 0x9b, 0x88, 0xc9, 0xfd, 0x03, + 0xf8, 0x52, 0x4c, 0x31, 0x68, 0xdd, 0x63, 0x17, 0x3e, 0x39, 0x50, 0x84, 0xb2, 0xb5, 0xeb, 0x25, 0xde, 0x71, 0xc6, 0x62, 0x76, 0x4c, 0xb1, 0x83, 0xe8, 0x36, 0x3d, 0x37, 0xab, 0x9c, 0x3a, 0x95, + 0x1c, 0x8e, 0xd7, 0x43, 0x52, 0xf6, 0xb6, 0x81, 0xe4, 0xb1, 0x6d, 0x2b, 0xff, 0x9d, 0xb5, 0x70, 0x6e, 0x1d, 0x4f, 0x5d, 0x78, 0xd6, 0x80, 0xbd, 0x60, 0xaf, 0xdc, 0xc7, 0x59, 0xd9, 0xa2, 0x1c, + 0x22, 0x30, 0xca, 0x6f, 0xa4, 0x5b, 0xce, 0xc0, 0x80, 0xe4, 0x67, 0x92, 0x92, 0xfb, 0x22, 0xec, 0x31, 0x27, 0xd1, 0xe0, 0x44, 0x8a, 0x94, 0x47, 0x26, 0xed, 0xde, 0xbd, 0x6a, 0x37, 0x2f, 0xbd, + 0x7f, 0xff, 0xf7, 0x7f, 0xfc, 0x0b, 0xf6, 0x2b, 0x17, 0x40, 0x30, 0x48, 0x88, 0x0c, 0x0f, 0x36, 0xd8, 0x7f, 0x41, 0xe2, 0x8f, 0x9b, 0xb5, 0xdc, 0x28, 0x63, 0xfb, 0x2b, 0xfc, 0x33, 0xf0, 0x7d, + 0x7b, 0x4b, 0x8e, 0xaa, 0xac, 0x29, 0x8f, 0x70, 0xd4, 0x2d, 0x24, 0xc8, 0x5b, 0xbe, 0xdc, 0xc4, 0xf5, 0x2f, 0x99, 0x12, 0x8f, 0xae, 0xf3, 0x88, 0x81, 0x14, 0x0a, 0x1e, 0x12, 0x4d, 0x39, 0xd1, + 0x54, 0x01, 0xce, 0x48, 0x31, 0xe3, 0x54, 0xd9, 0xad, 0x84, 0xd9, 0xe1, 0x59, 0x80, 0xa1, 0x39, 0x36, 0x8e, 0x2c, 0x4f, 0xa3, 0xc7, 0x55, 0x39, 0x33, 0x1e, 0xfb, 0x5a, 0x82, 0xa7, 0x60, 0xef, + 0x96, 0xef, 0x01, 0xfe, 0xf3, 0x3f, 0x06, 0xf2, 0x20, 0x4b, 0xfa, 0x47, 0xc7, 0x79, 0xd5, 0x1c, 0xb4, 0x87, 0x67, 0x9d, 0x7e, 0x63, 0xb4, 0xed, 0x5c, 0xc4, 0xc7, 0xeb, 0xdf, 0x1d, 0x95, 0xb2, + 0x31, 0x47, 0x28, 0xb3, 0xb3, 0x69, 0x7b, 0x6a, 0xfb, 0x9f, 0x5f, 0xf6, 0x73, 0x6a, 0xd0, 0x7e, 0xd0, 0x94, 0x9b, 0x25, 0xa5, 0x16, 0x68, 0x22, 0xb1, 0x04, 0x92, 0x6a, 0x31, 0x27, 0x9a, 0x85, + 0x04, 0x7b, 0xe1, 0x48, 0x2c, 0x79, 0xbe, 0x68, 0xc0, 0x22, 0x6b, 0xf4, 0xf1, 0x96, 0x92, 0x24, 0x38, 0x3d, 0xde, 0x11, 0x69, 0x13, 0xd2, 0xac, 0x47, 0xbc, 0x90, 0x72, 0x2d, 0x49, 0xec, 0xd4, + 0xe0, 0x0a, 0x87, 0x0e, 0x43, 0x4f, 0x41, 0xaa, 0x2a, 0xc8, 0x90, 0x21, 0x63, 0xeb, 0x96, 0xa5, 0x99, 0x02, 0x3d, 0x23, 0x1a, 0x9f, 0x66, 0x6c, 0xcc, 0x34, 0x84, 0x33, 0x1a, 0xde, 0x9b, 0xf6, + 0x8d, 0xc3, 0x98, 0x71, 0x22, 0x57, 0x10, 0x11, 0x4d, 0xfc, 0x5f, 0x69, 0x8b, 0x7c, 0xc4, 0x2b, 0x1c, 0x62, 0xf2, 0x24, 0xc8, 0xa4, 0x0d, 0xb6, 0x14, 0xaf, 0x86, 0x87, 0x41, 0x77, 0xeb, 0x17, + 0xef, 0xbb, 0x37, 0xc3, 0xf7, 0xed, 0xfe, 0xab, 0xde, 0xa0, 0x8d, 0x1d, 0x95, 0xd9, 0x04, 0x54, 0xc3, 0xdd, 0x06, 0x92, 0xd9, 0x86, 0xc3, 0xdf, 0x70, 0xc8, 0x13, 0x60, 0x7d, 0xe1, 0x7c, 0x2f, + 0x97, 0x96, 0x48, 0xe3, 0x88, 0xef, 0x69, 0x53, 0x68, 0xfe, 0x86, 0xdb, 0x61, 0xc5, 0xd7, 0x4c, 0x83, 0xef, 0xfb, 0x6e, 0x39, 0x05, 0x8b, 0x4b, 0xde, 0xf0, 0xef, 0xb7, 0x2f, 0x7b, 0xd7, 0xfd, + 0xf3, 0xcd, 0x6c, 0xbe, 0x23, 0xf2, 0x5a, 0xc6, 0x8d, 0x2a, 0x50, 0xc0, 0x44, 0xa0, 0xc9, 0x3d, 0x91, 0xac, 0xca, 0x37, 0x38, 0xf2, 0xff, 0xd3, 0xff, 0xaf, 0xea, 0x99, 0x67, 0xce, 0x0a, 0xfd, + 0x4b, 0xf7, 0x73, 0x4e, 0x3b, 0x5f, 0x63, 0x48, 0x9a, 0x08, 0xbb, 0x0f, 0x2a, 0x6f, 0xb3, 0xed, 0x7e, 0xf0, 0x47, 0x58, 0x66, 0x0a, 0xdb, 0xca, 0xda, 0x79, 0x3d, 0x68, 0xb8, 0x0d, 0xd7, 0x74, + 0xaf, 0x70, 0x4f, 0x57, 0xb0, 0x20, 0x71, 0x4a, 0xd7, 0xc5, 0x15, 0xc0, 0x6e, 0x84, 0xea, 0xf7, 0x74, 0xe5, 0x62, 0xc0, 0xee, 0x67, 0x44, 0xaf, 0x65, 0x7c, 0x50, 0x58, 0xc3, 0x20, 0xb9, 0xa7, + 0xb6, 0xa6, 0xda, 0xdd, 0x90, 0x51, 0x4e, 0x91, 0xd0, 0xfc, 0x89, 0x95, 0xcc, 0x14, 0x93, 0x6f, 0x89, 0xbe, 0x44, 0x8a, 0x84, 0x4a, 0xcd, 0xa8, 0x72, 0xff, 0x51, 0x58, 0x9c, 0x95, 0x1c, 0x8d, + 0xe9, 0x7b, 0x02, 0x75, 0x2b, 0x68, 0x55, 0x7d, 0xcb, 0xed, 0x1d, 0x91, 0x78, 0x79, 0x35, 0xbe, 0x4d, 0xb4, 0xb5, 0x0d, 0x8b, 0xe1, 0xb4, 0x5a, 0xec, 0xab, 0x44, 0xb7, 0xa7, 0xc0, 0x25, 0xe3, + 0x11, 0x56, 0x0d, 0xb7, 0x5e, 0x05, 0x75, 0xd7, 0xd7, 0x41, 0x4e, 0x3e, 0x14, 0xf3, 0x39, 0xe1, 0x11, 0x78, 0x0b, 0x58, 0x4e, 0xa9, 0x7e, 0x72, 0xb1, 0xf0, 0x3d, 0xf6, 0x81, 0x8d, 0x04, 0x35, + 0x84, 0x7d, 0xdf, 0xcf, 0x8a, 0x18, 0x3e, 0x16, 0x93, 0xc3, 0xba, 0x73, 0x2f, 0x5f, 0xff, 0x86, 0xc9, 0xf5, 0xa0, 0xdd, 0xef, 0x36, 0x6d, 0x83, 0xf5, 0xd7, 0x5f, 0x95, 0x57, 0x97, 0xb6, 0x4d, + 0x3a, 0xdb, 0x5e, 0x83, 0xe1, 0xcf, 0xf0, 0x73, 0x73, 0x6f, 0x80, 0xd7, 0xdb, 0xb6, 0xc3, 0x1a, 0xbe, 0x32, 0x7e, 0xac, 0x91, 0x3d, 0x0f, 0xb3, 0xc3, 0x4b, 0x15, 0x95, 0x8d, 0xaa, 0x30, 0xf9, + 0xab, 0xc4, 0xf6, 0x5f, 0x51, 0xa3, 0x2a, 0xd0, 0xb7, 0xb2, 0xcd, 0xb4, 0xa6, 0x71, 0xd5, 0x05, 0x61, 0x2a, 0xe3, 0x5f, 0xe2, 0x02, 0x43, 0xb8, 0x70, 0x01, 0x3e, 0xfe, 0x52, 0x17, 0x18, 0x7e, + 0x9e, 0xd8, 0xb6, 0x40, 0xd9, 0x40, 0x93, 0xa7, 0xbd, 0x60, 0xf1, 0x8d, 0x03, 0xa0, 0x2a, 0xca, 0xc9, 0x86, 0xc1, 0xbf, 0x9d, 0x49, 0x1e, 0xf5, 0x15, 0x66, 0xff, 0xc8, 0xa4, 0x24, 0x8e, 0xd1, + 0x8a, 0xf9, 0xb6, 0xd8, 0xda, 0xd4, 0x7c, 0x0b, 0xd1, 0x62, 0x7d, 0x01, 0xec, 0xb4, 0x2f, 0x0e, 0x37, 0x2d, 0xec, 0xdd, 0x9f, 0xac, 0x04, 0xa6, 0x09, 0xb8, 0xb1, 0x0f, 0x79, 0x89, 0x31, 0x25, + 0x21, 0x9f, 0x9e, 0xc0, 0x34, 0x72, 0xe5, 0xed, 0x97, 0x5a, 0x32, 0x1d, 0xce, 0xb2, 0x7d, 0x8e, 0x16, 0x70, 0x93, 0x65, 0x7f, 0x75, 0x9d, 0x93, 0x7f, 0x9e, 0x31, 0xd3, 0x77, 0x59, 0xff, 0x5d, + 0x15, 0xa6, 0x2a, 0xeb, 0xd7, 0x0a, 0xcc, 0x1a, 0xca, 0x1d, 0x3d, 0x1d, 0x50, 0xb4, 0x02, 0xb8, 0x33, 0x62, 0xf2, 0x31, 0x8f, 0x3e, 0x59, 0xbe, 0x9f, 0xb0, 0x4c, 0xf8, 0x34, 0x4d, 0xf8, 0x6e, + 0x07, 0xe7, 0xbf, 0x6c, 0x38, 0xf4, 0xa0, 0x25, 0xe6, 0x09, 0x8b, 0xd7, 0x9f, 0xb5, 0x76, 0x3b, 0xa6, 0xb8, 0xe5, 0xcb, 0xbf, 0x92, 0x15, 0xf2, 0x5f, 0xad, 0x44, 0x6f, 0xfd, 0xfd, 0xcc, 0x28, + 0xb0, 0x05, 0xba, 0xbf, 0x6b, 0x7e, 0x0e, 0xdd, 0x8a, 0x21, 0x0f, 0x2a, 0x58, 0x1b, 0xfc, 0x0a, 0xcb, 0xff, 0x4c, 0x73, 0xd6, 0xa0, 0x9f, 0xc5, 0x11, 0xca, 0x1f, 0xad, 0xf1, 0x7e, 0xb6, 0xdd, + 0xfb, 0xe5, 0x8f, 0x89, 0x3f, 0x68, 0xf5, 0x9d, 0xa6, 0x74, 0xc1, 0x0b, 0x93, 0x4a, 0x37, 0xf7, 0x04, 0xaf, 0xf5, 0x17, 0xbb, 0xcb, 0x7e, 0xef, 0x5d, 0xbb, 0x75, 0x85, 0xd6, 0xc4, 0x49, 0xe3, + 0x49, 0xe3, 0x17, 0x9f, 0x47, 0x26, 0xec, 0x57, 0x36, 0xdb, 0x35, 0x68, 0xdb, 0x69, 0x8e, 0xe6, 0xf3, 0xc7, 0xaf, 0xe4, 0xe6, 0x64, 0xdb, 0xad, 0x5d, 0xb6, 0x68, 0xd4, 0xbf, 0xd8, 0xe3, 0xec, + 0xf9, 0xc4, 0x2b, 0x4d, 0x64, 0x8f, 0xce, 0xb7, 0x85, 0x82, 0x71, 0xfd, 0x4e, 0x53, 0xa3, 0x1d, 0x4b, 0x1f, 0x87, 0xdd, 0xfa, 0x7e, 0x79, 0xe6, 0x7c, 0xc2, 0x3f, 0x36, 0xd8, 0xef, 0x16, 0x73, + 0xdf, 0x7e, 0x3e, 0x72, 0x0f, 0x72, 0xe2, 0x48, 0xc4, 0xdd, 0xfc, 0x82, 0xf0, 0xfd, 0x35, 0xd4, 0xd9, 0x51, 0x3a, 0xff, 0x76, 0x17, 0xfe, 0xb5, 0x4a, 0xfa, 0x23, 0x9f, 0x10, 0xb6, 0x88, 0xfd, + 0x94, 0x8f, 0x09, 0x05, 0xb9, 0xf2, 0xf7, 0x84, 0x42, 0xcd, 0x5d, 0x69, 0x51, 0xd2, 0x79, 0x57, 0xa4, 0x7c, 0xd5, 0x00, 0xbb, 0xe8, 0xe5, 0xdf, 0x2f, 0x2e, 0xa5, 0x58, 0xb0, 0x88, 0x02, 0x01, + 0x37, 0x5f, 0x97, 0xb3, 0x3f, 0x69, 0xe4, 0xc2, 0x92, 0x98, 0x9d, 0x95, 0xa4, 0x5a, 0x32, 0xba, 0xb0, 0xff, 0x53, 0x4a, 0xeb, 0xbc, 0x03, 0x44, 0x4e, 0xb3, 0x91, 0x78, 0xc9, 0x62, 0x1c, 0xa7, + 0xcd, 0x9e, 0xcb, 0x2c, 0xae, 0xc6, 0x42, 0xcf, 0xd6, 0x1e, 0xc6, 0xd6, 0x8b, 0x0b, 0xee, 0xe5, 0xcf, 0x76, 0x0b, 0xc8, 0x04, 0x57, 0x7e, 0x16, 0x75, 0xad, 0x8b, 0xb3, 0xe1, 0x79, 0xa7, 0xdb, + 0x1e, 0x36, 0xfb, 0x6f, 0x30, 0xfc, 0xb2, 0xd3, 0x5e, 0xf7, 0x75, 0xe7, 0x0d, 0xd4, 0xff, 0xd7, 0xad, 0xa6, 0x46, 0x05, 0xda, 0x71, 0x6e, 0xfa, 0xcd, 0xcb, 0xcb, 0x76, 0xbf, 0xba, 0xce, 0xcb, + 0x06, 0x2d, 0x3b, 0x75, 0xe5, 0x5d, 0x7f, 0xb9, 0xfc, 0x5c, 0x10, 0xc6, 0x31, 0xe5, 0x68, 0x58, 0xde, 0x7a, 0xde, 0x3a, 0x50, 0x0e, 0x62, 0xf3, 0xec, 0x99, 0x82, 0x6d, 0x6c, 0xf9, 0xb5, 0x44, + 0xf8, 0xca, 0x04, 0x8e, 0x54, 0x5c, 0xef, 0xcc, 0x0a, 0x33, 0x13, 0x73, 0x8a, 0xe9, 0x6c, 0x63, 0xf1, 0xd1, 0x2d, 0xde, 0xcc, 0xd3, 0x58, 0xb3, 0x0b, 0x11, 0xa5, 0x31, 0xbd, 0xb4, 0x1b, 0x87, + 0xb3, 0x7c, 0xa5, 0xb7, 0xce, 0xff, 0x2a, 0xe7, 0xc7, 0x4c, 0xe2, 0x2f, 0x9b, 0x36, 0x78, 0x84, 0xaa, 0x0d, 0x5d, 0x34, 0xe2, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdd, + 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, 0xff, 0xb9, 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, 0x38, 0x79, 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, + 0x39, 0x60, 0x1a, 0xd2, 0x04, 0x90, 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, 0x2f, 0x66, 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, 0xf7, 0xd3, 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, + 0x9e, 0x5a, 0xe9, 0xde, 0x0f, 0x8f, 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, 0x47, 0x77, 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, 0x2d, 0x4d, 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, + 0x4b, 0x84, 0xb0, 0x20, 0xe9, 0x12, 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, 0x2c, 0x23, 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, 0x83, 0x35, 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, + 0x73, 0x01, 0x2b, 0x2e, 0x10, 0x52, 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, 0x26, 0x90, 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, 0x48, 0x10, 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, + 0x46, 0x30, 0xa7, 0xb9, 0x95, 0x90, 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, 0x96, 0x54, 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, 0x24, 0xcb, 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, + 0xce, 0xc5, 0xca, 0x18, 0x53, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, 0x3b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, 0x25, 0x2d, 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, + 0x57, 0x06, 0xc9, 0x52, 0x74, 0xad, 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, 0x0d, 0x4a, 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, 0x7f, 0x01, 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, + 0xde, 0x3d, 0xfb, 0xde, 0xf0, 0xaf, 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, 0x7c, 0x4e, 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, 0xe4, 0x94, 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, + 0x7a, 0x7c, 0x80, 0x9f, 0xac, 0x18, 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, 0x26, 0x19, 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, 0x54, 0xaa, 0x90, 0x9d, 0xf3, 0xf3, 0xed, 0x76, + 0xeb, 0x13, 0x63, 0xb9, 0xcf, 0xc5, 0xe2, 0xbc, 0xf2, 0xf6, 0xfc, 0x76, 0xd0, 0x8d, 0x86, 0x49, 0xd4, 0xbe, 0xf4, 0x2f, 0x1a, 0x8c, 0xf7, 0x2c, 0x47, 0x29, 0x41, 0xe0, 0xaf, 0x6b, 0x2a, 0x30, + 0x83, 0xd9, 0x0e, 0x48, 0x51, 0xe4, 0x34, 0x25, 0xb3, 0x1c, 0x21, 0x27, 0x5b, 0x9d, 0x53, 0x93, 0x3a, 0x03, 0x0a, 0xca, 0x60, 0x2b, 0xa8, 0xa2, 0x6c, 0xd1, 0x2a, 0xf9, 0x65, 0x05, 0x8d, 0x66, + 0xe2, 0xea, 0x10, 0x56, 0xc6, 0x52, 0x79, 0x40, 0xc0, 0x19, 0x10, 0x9b, 0x35, 0x37, 0x4c, 0x60, 0x90, 0xb8, 0x70, 0x15, 0x26, 0x83, 0xa4, 0x05, 0x8f, 0x83, 0xc9, 0xf5, 0xe8, 0x7e, 0x02, 0x8f, + 0x61, 0x1c, 0x87, 0xc3, 0xc9, 0x20, 0x4a, 0x60, 0x14, 0x43, 0x77, 0x34, 0xec, 0x0d, 0x26, 0x83, 0xd1, 0x30, 0x81, 0x51, 0x1f, 0xc2, 0xe1, 0x4f, 0x25, 0xef, 0x8f, 0x83, 0x61, 0xaf, 0x05, 0x48, + 0xd5, 0x12, 0x05, 0xe0, 0x73, 0x21, 0xb4, 0x2b, 0x5c, 0x00, 0xd5, 0x11, 0xc6, 0xac, 0x81, 0xb3, 0xca, 0x0e, 0x8d, 0xa1, 0x7d, 0xe6, 0x64, 0x81, 0x29, 0x9d, 0xd3, 0x14, 0x72, 0xc2, 0x16, 0x6b, + 0xb2, 0x40, 0x58, 0xf0, 0x0d, 0x0a, 0xa6, 0x21, 0x54, 0xa0, 0x58, 0x51, 0xa9, 0xd3, 0x2d, 0x81, 0xb0, 0x0c, 0x72, 0xba, 0xa2, 0xca, 0x80, 0x4d, 0x96, 0xcc, 0x47, 0x3e, 0xfa, 0xce, 0x1f, 0x5f, + 0x94, 0x7f, 0x82, 0x48, 0x23, 0xf1, 0x8e, 0x6c, 0x90, 0x41, 0xa2, 0x88, 0x50, 0x70, 0x5f, 0xc0, 0x15, 0x51, 0xe9, 0x12, 0x64, 0x2a, 0x68, 0xd1, 0x04, 0x55, 0x5c, 0x81, 0x22, 0x1a, 0x3e, 0xc0, + 0x86, 0x08, 0xd9, 0x29, 0xcf, 0x6f, 0xc2, 0x87, 0x70, 0x7a, 0x3d, 0xba, 0x8b, 0xa0, 0x0d, 0x39, 0x4f, 0xcb, 0x7e, 0xc0, 0xe7, 0x40, 0xe0, 0xa6, 0xf7, 0x23, 0x2c, 0xf9, 0x4a, 0xa3, 0x41, 0x34, + 0x04, 0x8d, 0x0a, 0x5b, 0xb3, 0x95, 0x20, 0x6b, 0xc5, 0xe5, 0x6b, 0x52, 0x56, 0xda, 0xb6, 0xcb, 0x13, 0x09, 0x94, 0x49, 0x45, 0xf2, 0x1c, 0xb3, 0x43, 0x91, 0x70, 0x17, 0x3e, 0x44, 0xc3, 0xe9, + 0x55, 0x38, 0xe9, 0x5e, 0x4f, 0xa3, 0xee, 0xf5, 0x08, 0xda, 0x20, 0x51, 0x69, 0x74, 0x9e, 0x70, 0x76, 0xa2, 0x7f, 0x91, 0x19, 0xf4, 0xea, 0xe4, 0x60, 0xba, 0xe4, 0x3a, 0x9f, 0xb6, 0x78, 0x66, + 0xc6, 0xd3, 0x94, 0xaf, 0x56, 0x84, 0x65, 0xf2, 0x58, 0xde, 0x38, 0xbc, 0x4f, 0xa2, 0x63, 0x81, 0x5b, 0x42, 0x55, 0xd9, 0x7f, 0xe0, 0x09, 0x77, 0x52, 0x09, 0xfe, 0x84, 0x30, 0xc3, 0xb9, 0xee, + 0x75, 0xc8, 0x74, 0xcf, 0x69, 0x8a, 0x1a, 0x8d, 0x27, 0x09, 0xb4, 0xa1, 0x20, 0x82, 0xac, 0x50, 0xa1, 0x90, 0x50, 0x10, 0xd9, 0xe8, 0xaa, 0x37, 0x64, 0x43, 0xe0, 0xe1, 0x0e, 0xb6, 0x4b, 0x64, + 0x20, 0xd6, 0xcc, 0x00, 0xce, 0xa4, 0x64, 0x5f, 0xcc, 0x80, 0xfe, 0xc2, 0xd7, 0xf4, 0x19, 0xce, 0xd6, 0xf6, 0x25, 0x50, 0x25, 0x31, 0x9f, 0xb7, 0x74, 0x67, 0xb1, 0x00, 0x46, 0xd5, 0x50, 0x19, + 0xb4, 0x3f, 0x95, 0xd4, 0xed, 0x4f, 0x62, 0xcd, 0xbe, 0x64, 0xdb, 0xa2, 0xa3, 0x04, 0x61, 0xb2, 0xe0, 0x42, 0x05, 0x99, 0x9a, 0x4a, 0x9e, 0x3e, 0xa1, 0x6a, 0x49, 0x14, 0x1b, 0x14, 0xc1, 0xae, + 0x25, 0xd7, 0xb2, 0x40, 0x96, 0x05, 0xbb, 0x16, 0xc9, 0x32, 0x5d, 0x3a, 0xc1, 0xdf, 0x2e, 0x2e, 0x2e, 0x9a, 0x8e, 0x24, 0x3f, 0x0e, 0xc6, 0xd3, 0xb8, 0x0b, 0x6d, 0x98, 0xe7, 0x64, 0x61, 0xcc, + 0xa1, 0xb2, 0x6c, 0x0c, 0x9c, 0x64, 0x36, 0xac, 0x26, 0x5f, 0x22, 0x35, 0x6d, 0x4e, 0xfe, 0x09, 0x80, 0x2d, 0x45, 0x5e, 0xe1, 0x42, 0x77, 0xc2, 0x3c, 0x07, 0xfd, 0x94, 0x53, 0x86, 0xb2, 0xec, + 0x9c, 0x27, 0x1f, 0x4f, 0x4c, 0x57, 0x25, 0x12, 0x8f, 0x91, 0x41, 0xa5, 0x49, 0xa1, 0xf3, 0x51, 0xc3, 0x00, 0xf8, 0x7c, 0x5e, 0xc7, 0x4d, 0x51, 0x95, 0xa3, 0xb6, 0xdf, 0x82, 0x01, 0xb6, 0x94, + 0x65, 0x7c, 0xeb, 0x94, 0xe7, 0x9e, 0x8d, 0x83, 0x45, 0x52, 0x85, 0xa2, 0xd9, 0x4e, 0xf3, 0x2a, 0x93, 0xaf, 0x97, 0xba, 0x2c, 0x5c, 0x9c, 0x8f, 0x74, 0x0e, 0xae, 0xf7, 0xf2, 0xb5, 0xe7, 0x42, + 0x10, 0x80, 0xcb, 0x99, 0x0b, 0x46, 0x1a, 0x1c, 0x53, 0x38, 0xb5, 0x71, 0x9e, 0xae, 0x0b, 0xcf, 0x40, 0xf9, 0xd7, 0x35, 0xdd, 0x90, 0x1c, 0x99, 0xd2, 0xb6, 0x7e, 0xa3, 0xcf, 0x1d, 0xa3, 0xc0, + 0x50, 0x94, 0x42, 0x5d, 0x38, 0xd5, 0x4c, 0xae, 0x3e, 0x0a, 0xcc, 0x8b, 0x5e, 0x3c, 0x78, 0x88, 0x3c, 0xf3, 0xe7, 0x38, 0x9c, 0x5c, 0x7b, 0xee, 0x99, 0x15, 0x1e, 0x3d, 0x63, 0xba, 0x56, 0x08, + 0x44, 0x83, 0x48, 0x40, 0x86, 0x73, 0xca, 0x30, 0xb3, 0xa5, 0x5f, 0x21, 0xda, 0xdc, 0x5a, 0xfa, 0x4e, 0xa7, 0x73, 0x73, 0x93, 0x55, 0xde, 0x58, 0x38, 0xec, 0xb5, 0x2e, 0xb8, 0xe2, 0x20, 0x9f, + 0x68, 0x11, 0xa7, 0x63, 0x61, 0x21, 0x99, 0x2e, 0x31, 0x2d, 0xaf, 0xea, 0x42, 0xa0, 0x95, 0xdb, 0x02, 0xce, 0x52, 0x2c, 0xd3, 0x95, 0xe3, 0x82, 0xa4, 0x3b, 0xf0, 0x67, 0x44, 0xd9, 0xca, 0x31, + 0xed, 0xb5, 0x26, 0xf0, 0xd3, 0x55, 0x56, 0xd5, 0x14, 0x9d, 0x03, 0x3e, 0x53, 0xa9, 0x2a, 0x77, 0x3f, 0x5b, 0xac, 0x4d, 0x0b, 0x81, 0x5a, 0x82, 0x0b, 0xa9, 0x46, 0xc4, 0x5b, 0x6f, 0xdf, 0xe7, + 0x4f, 0x57, 0xd9, 0x3b, 0xfc, 0xfa, 0xad, 0xd3, 0xa9, 0x9d, 0x73, 0x3e, 0x4a, 0x54, 0xba, 0x4d, 0xe5, 0x8e, 0xa3, 0x83, 0x1d, 0xc5, 0xf1, 0x28, 0x9e, 0x76, 0x47, 0xbd, 0x28, 0xb8, 0xb0, 0xb1, + 0x9d, 0x70, 0xa0, 0x92, 0xe7, 0x44, 0x21, 0x50, 0xa6, 0x50, 0xe8, 0x86, 0xb7, 0x21, 0x82, 0x6a, 0x04, 0x49, 0x98, 0x0b, 0xbe, 0x82, 0x82, 0x4b, 0x49, 0x35, 0xa0, 0x0a, 0x2e, 0x95, 0x8d, 0x8e, + 0x6c, 0xc1, 0x16, 0xcd, 0xb4, 0x40, 0x18, 0x37, 0x37, 0xd9, 0x5e, 0x53, 0x43, 0xa7, 0xd1, 0x10, 0x04, 0x41, 0x00, 0xc9, 0x24, 0x8c, 0x27, 0xf0, 0x10, 0xde, 0x0e, 0x7a, 0xa1, 0xbe, 0x12, 0xcd, + 0x69, 0x9d, 0xaa, 0x7d, 0x73, 0x3e, 0x4c, 0xd3, 0xe8, 0xe9, 0xe6, 0x9a, 0xaf, 0xd0, 0x71, 0x34, 0xf8, 0x7c, 0xf3, 0x3f, 0x44, 0x42, 0x70, 0xd1, 0x69, 0xb4, 0x73, 0x2d, 0x61, 0xae, 0x47, 0x3c, + 0x5d, 0x51, 0x3b, 0xbe, 0x16, 0x80, 0x6c, 0x43, 0x05, 0x67, 0x7a, 0x6c, 0xf3, 0xe1, 0xef, 0xdf, 0x5e, 0x96, 0x8c, 0xe3, 0x1c, 0x75, 0xb9, 0x99, 0x32, 0xd2, 0xfd, 0x6c, 0x2f, 0xa0, 0x72, 0xf7, + 0x35, 0x7e, 0x8d, 0xe6, 0x95, 0x69, 0xbf, 0x9a, 0x67, 0x2f, 0xab, 0xd9, 0xfa, 0x0d, 0x8b, 0xe9, 0x8e, 0xb6, 0xf7, 0x9b, 0x37, 0xb5, 0x62, 0xdf, 0x31, 0xbe, 0xa0, 0xb6, 0xdb, 0x71, 0x3a, 0x95, + 0x4f, 0x8d, 0x34, 0xd7, 0xde, 0x7f, 0x9e, 0x51, 0xf6, 0xf9, 0x0b, 0xd9, 0x10, 0x1f, 0x9f, 0xd1, 0x06, 0x81, 0x32, 0xaa, 0xde, 0x8f, 0x00, 0x95, 0x55, 0xeb, 0x27, 0x0c, 0x28, 0xdb, 0x90, 0x9c, + 0x66, 0xfa, 0xe6, 0xc1, 0x54, 0x71, 0xb1, 0x6b, 0x84, 0xa0, 0x66, 0x09, 0x5e, 0x04, 0xfd, 0xff, 0x2c, 0x4a, 0x35, 0x70, 0xa2, 0x61, 0xef, 0x08, 0x36, 0x4e, 0xa7, 0x8c, 0x89, 0xa1, 0xea, 0x53, + 0x96, 0x19, 0xb5, 0x85, 0xe0, 0x5f, 0x30, 0x55, 0x30, 0xd3, 0xf6, 0x67, 0x54, 0xb4, 0x80, 0xfa, 0xe8, 0x9b, 0x57, 0xfb, 0x58, 0x80, 0x5a, 0x12, 0x65, 0x06, 0x7d, 0x42, 0x99, 0x34, 0xef, 0xe6, + 0x3c, 0xd7, 0x33, 0x91, 0xeb, 0xaf, 0x36, 0xcc, 0xb5, 0xe3, 0x50, 0x9f, 0xe4, 0xf9, 0x8c, 0xa4, 0x4f, 0xda, 0xaf, 0x74, 0x2d, 0x84, 0x76, 0x51, 0x4f, 0xf3, 0xba, 0xf0, 0x6b, 0x59, 0x16, 0xbd, + 0x06, 0x7b, 0x7e, 0x59, 0x60, 0x65, 0xcb, 0x19, 0xc7, 0xa3, 0x9b, 0xa8, 0x3b, 0xb9, 0x0a, 0x93, 0xa8, 0x37, 0x88, 0x83, 0x7d, 0xd3, 0x34, 0x8f, 0x9e, 0x33, 0xe8, 0xeb, 0x0d, 0x62, 0xdf, 0xa0, + 0x0e, 0xa9, 0x3d, 0x37, 0x08, 0x2a, 0xf8, 0x23, 0xcb, 0x7a, 0xa8, 0x30, 0x55, 0x57, 0x44, 0x62, 0x8f, 0x0a, 0x5b, 0xc4, 0x9f, 0xa2, 0xee, 0xd4, 0xc8, 0xed, 0xf6, 0x3c, 0x73, 0xf2, 0x68, 0x9e, + 0xaa, 0x73, 0xcf, 0xe9, 0xcc, 0x29, 0xcb, 0x2a, 0x9e, 0x41, 0x1f, 0xa2, 0x4f, 0x83, 0x44, 0xeb, 0x7b, 0x34, 0xf2, 0x3f, 0x6b, 0x4f, 0x4b, 0x05, 0xb3, 0x92, 0xc6, 0x2c, 0x48, 0x4e, 0x9a, 0x81, + 0xef, 0x6b, 0xf2, 0x8a, 0x30, 0x08, 0x5c, 0xad, 0xc2, 0x3d, 0xa0, 0x1d, 0x72, 0x55, 0x92, 0xd7, 0x8a, 0xb5, 0x19, 0x86, 0xa4, 0xa9, 0xd6, 0xe9, 0x1c, 0x08, 0x7f, 0x3b, 0x38, 0x46, 0x97, 0x56, + 0xee, 0xd6, 0x1e, 0xb8, 0xce, 0x1b, 0xfe, 0x77, 0x5e, 0xb3, 0xe2, 0x75, 0xb9, 0x75, 0x38, 0x5e, 0xca, 0x76, 0x3a, 0xc7, 0x82, 0x6d, 0x4e, 0xaa, 0x48, 0xbd, 0x9a, 0x19, 0x13, 0xb8, 0xcf, 0x5f, + 0x36, 0x2b, 0x3f, 0xe5, 0x6c, 0x4e, 0x17, 0x75, 0x96, 0x62, 0x24, 0x59, 0xb8, 0x5f, 0xf2, 0xba, 0xe6, 0x6d, 0xa3, 0xf9, 0x42, 0x64, 0x2e, 0xe4, 0xe8, 0x59, 0x21, 0x2b, 0x87, 0xf3, 0xf2, 0xa0, + 0x87, 0x39, 0xd9, 0x61, 0x16, 0x3d, 0x17, 0xc4, 0x9c, 0x3b, 0xfa, 0x06, 0x3a, 0xef, 0x83, 0xbb, 0x96, 0xa8, 0xe1, 0xf7, 0x2b, 0x64, 0x98, 0xd3, 0x95, 0x0c, 0x5c, 0xf0, 0x3c, 0x5d, 0x38, 0x70, + 0xfa, 0xdf, 0x9a, 0x76, 0x06, 0x19, 0x37, 0x45, 0x7c, 0xf3, 0x70, 0x37, 0xed, 0x8e, 0x86, 0xfd, 0xc1, 0x0f, 0xd3, 0x3d, 0xe7, 0x38, 0x09, 0xbe, 0x7e, 0xfd, 0xfc, 0x6b, 0xad, 0xc8, 0xf9, 0x88, + 0x2c, 0x2b, 0x0d, 0xff, 0xf6, 0x3d, 0x19, 0xde, 0xeb, 0xe7, 0x5e, 0x19, 0xe0, 0xd7, 0x63, 0x92, 0x44, 0x13, 0x9b, 0x2f, 0xd3, 0x59, 0xa2, 0x4f, 0x51, 0xf0, 0x76, 0xff, 0x2b, 0x31, 0x16, 0x87, + 0xe3, 0x71, 0x14, 0x4f, 0x6f, 0xc2, 0x38, 0x78, 0xd7, 0xfb, 0xad, 0x20, 0x45, 0x81, 0xa2, 0xbc, 0x10, 0xdb, 0xf6, 0xc9, 0xff, 0x42, 0xc4, 0xa1, 0x9c, 0xdb, 0xf0, 0x7e, 0xd8, 0xbd, 0x8e, 0xe2, + 0x80, 0x8b, 0x45, 0xb5, 0x72, 0x1a, 0x16, 0xbf, 0x62, 0x31, 0x73, 0xeb, 0x63, 0xf9, 0x70, 0x47, 0x28, 0x2b, 0xcb, 0xae, 0x37, 0x7a, 0x1c, 0xde, 0x8e, 0xc2, 0xde, 0xf4, 0x3e, 0xbe, 0x0d, 0xdc, + 0x6a, 0x6f, 0x15, 0x58, 0x70, 0xcb, 0xde, 0x58, 0x5f, 0xcb, 0x6d, 0xe0, 0x9c, 0xf2, 0x73, 0x45, 0x9e, 0x88, 0xa0, 0xe7, 0x07, 0x36, 0x9d, 0x5f, 0xf8, 0x7f, 0xf1, 0xff, 0x7a, 0x78, 0xd6, 0x36, + 0x67, 0xa5, 0xb5, 0x4e, 0x7f, 0x14, 0x1b, 0x18, 0x28, 0xfe, 0x84, 0x4c, 0x06, 0x1f, 0x5a, 0x97, 0x15, 0x10, 0x0c, 0x12, 0x42, 0x18, 0x0c, 0x7f, 0x03, 0x09, 0xaf, 0xc7, 0xa2, 0x10, 0xbc, 0x40, + 0xa1, 0x28, 0x4a, 0xf7, 0x0c, 0x7a, 0x23, 0x38, 0x75, 0xf4, 0xd0, 0x6e, 0x2a, 0xde, 0x0b, 0x75, 0xb9, 0x5b, 0xc2, 0x7b, 0x91, 0xbb, 0xa0, 0x33, 0x75, 0xe0, 0xb3, 0xe7, 0x5d, 0x39, 0xf5, 0x44, + 0x66, 0xa1, 0x6c, 0x2e, 0x9d, 0x3c, 0xe7, 0x5b, 0x20, 0x6b, 0xc5, 0x57, 0x44, 0x51, 0x3d, 0x9c, 0xec, 0x20, 0xe3, 0x5b, 0x56, 0x8d, 0xdb, 0xba, 0xcb, 0x1e, 0x25, 0xa5, 0x1c, 0x2d, 0x4c, 0xa8, + 0xdb, 0x29, 0x32, 0x25, 0xf4, 0xe4, 0x60, 0x06, 0x12, 0x3d, 0xc7, 0x19, 0x91, 0x12, 0xd6, 0xf2, 0x80, 0x1f, 0x2c, 0xbf, 0xae, 0x04, 0xdb, 0xed, 0x65, 0xd9, 0xd1, 0x0b, 0xc1, 0x97, 0x74, 0x46, + 0x55, 0x39, 0xc9, 0x69, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, 0x3b, 0xc8, 0x88, 0x22, 0x7e, 0x7d, 0xdd, 0x7a, 0x0d, 0x40, 0x79, 0x36, 0x04, 0xe5, 0xf0, 0xfb, 0x30, 0x7c, 0x9c, 0x3e, 0x44, 0xf1, + 0xd5, 0x28, 0xa9, 0xc6, 0x10, 0x25, 0xd6, 0xe8, 0x5a, 0x1a, 0xb3, 0xdf, 0xe8, 0x5b, 0xcd, 0x34, 0x9e, 0x43, 0x31, 0x86, 0xe0, 0xcc, 0x39, 0x03, 0xcc, 0x25, 0xd6, 0x32, 0xed, 0x18, 0xaa, 0xe5, + 0xc6, 0xd1, 0x78, 0x74, 0x1f, 0xdf, 0xd6, 0xb3, 0xef, 0x5e, 0xe6, 0x51, 0x9c, 0x5f, 0x70, 0xfc, 0xaf, 0x28, 0x2a, 0x4d, 0xfa, 0xdd, 0xde, 0x75, 0xf9, 0x3a, 0xcf, 0xd8, 0x89, 0x32, 0xcd, 0xfc, + 0xd0, 0xcb, 0xd6, 0x41, 0x56, 0xa9, 0x02, 0xdf, 0xf7, 0x0f, 0x99, 0x7b, 0x8d, 0xf7, 0x3a, 0xbf, 0x1d, 0xf0, 0x9a, 0xae, 0x55, 0x71, 0x32, 0x3f, 0x05, 0xdf, 0xa2, 0x90, 0x4b, 0xcc, 0x73, 0x68, + 0x77, 0xed, 0x36, 0xe3, 0x7e, 0xfb, 0x2f, 0xf7, 0x1f, 0xce, 0x57, 0x5f, 0xb9, 0xdf, 0x6c, 0x71, 0x96, 0xe6, 0x54, 0xdf, 0xbb, 0x01, 0x30, 0xdc, 0xb6, 0xf9, 0xcc, 0xdc, 0xed, 0xc9, 0x4e, 0x2a, + 0x5c, 0xf9, 0x43, 0x54, 0xfe, 0x23, 0xce, 0xba, 0x86, 0xe2, 0xfb, 0x92, 0x85, 0xce, 0xe1, 0xb4, 0xad, 0x23, 0x7e, 0xfa, 0xb3, 0x54, 0x82, 0xb2, 0xc5, 0x2f, 0x9d, 0xce, 0x40, 0x0e, 0xd7, 0x79, + 0x3e, 0x12, 0xd1, 0xaa, 0x50, 0xbb, 0xd3, 0x93, 0x32, 0x08, 0xf7, 0x49, 0x14, 0x0f, 0xc3, 0xbb, 0xc8, 0x3b, 0x39, 0x83, 0xb6, 0xd6, 0xfa, 0x1b, 0xf4, 0xe3, 0x30, 0x49, 0x1e, 0x47, 0x71, 0xcf, + 0x3b, 0x39, 0x3b, 0x3b, 0x83, 0x23, 0x03, 0xfd, 0xae, 0xc0, 0x0c, 0x99, 0xa2, 0x24, 0x97, 0x6f, 0x1a, 0x3b, 0x44, 0xa5, 0xe7, 0x87, 0x9a, 0xf4, 0xd8, 0x98, 0x16, 0x1c, 0xeb, 0xb3, 0xae, 0xfd, + 0xbb, 0xfc, 0xf9, 0x59, 0x4b, 0x4a, 0x50, 0x6c, 0x68, 0x8a, 0x63, 0x4e, 0x99, 0xba, 0x23, 0x8c, 0x2c, 0x50, 0xfc, 0xd2, 0xe9, 0x24, 0x98, 0xae, 0x05, 0x55, 0xbb, 0xb1, 0xe0, 0x8a, 0xa7, 0x3c, + 0x87, 0x00, 0x2c, 0xf5, 0xe1, 0xf9, 0x64, 0x57, 0xe0, 0x2f, 0x9d, 0xce, 0x24, 0x97, 0x1f, 0x2e, 0xbf, 0x87, 0x86, 0x13, 0x55, 0xe6, 0xfa, 0x34, 0xc7, 0xd3, 0x93, 0xc3, 0xac, 0x19, 0xd3, 0x9a, + 0x40, 0x38, 0x39, 0xab, 0xec, 0xfa, 0xfd, 0xf8, 0xea, 0x53, 0x46, 0xe5, 0x12, 0xb3, 0x03, 0x2c, 0xbd, 0x5a, 0x4c, 0xb6, 0xd3, 0xe8, 0x3d, 0x4b, 0xd7, 0xae, 0x6d, 0x38, 0xb6, 0x01, 0x8d, 0x05, + 0xdf, 0xd0, 0x4c, 0xaf, 0x84, 0xae, 0x54, 0x84, 0x65, 0x44, 0x64, 0xf4, 0x9f, 0x98, 0xb9, 0xb0, 0x25, 0x3b, 0xdd, 0x93, 0x04, 0x2a, 0x41, 0x71, 0x53, 0x7e, 0x4e, 0xe9, 0xde, 0x0e, 0x80, 0x88, + 0x85, 0xed, 0x15, 0x5b, 0x9a, 0xdb, 0x56, 0x63, 0x3e, 0xd0, 0x9a, 0xfd, 0x6d, 0xc6, 0xd5, 0x12, 0x1e, 0xcd, 0x2e, 0x5d, 0x7e, 0x39, 0x63, 0x9c, 0xb5, 0xab, 0x67, 0x34, 0xeb, 0xa7, 0xbe, 0xb7, + 0xfd, 0xc6, 0xbc, 0xd1, 0xbd, 0xeb, 0x4d, 0x6f, 0x07, 0xc3, 0x68, 0x1a, 0xc6, 0x3f, 0x24, 0x81, 0xf7, 0x9d, 0xe3, 0x78, 0x87, 0x17, 0x9b, 0x07, 0x6f, 0x5d, 0x90, 0xd5, 0x1a, 0x3d, 0x1a, 0x4f, + 0xea, 0x87, 0x5e, 0x74, 0x75, 0xff, 0x83, 0x3d, 0x6a, 0xa7, 0x39, 0x91, 0xb2, 0x20, 0x6a, 0xf9, 0xa2, 0x5d, 0xb9, 0xed, 0x5e, 0x79, 0xd9, 0xac, 0xd6, 0xb9, 0xa2, 0x77, 0x3c, 0x5b, 0xe7, 0x38, + 0x2e, 0x3b, 0x61, 0xaf, 0x9a, 0x4b, 0x83, 0x37, 0xe6, 0xca, 0x5a, 0x54, 0x75, 0x05, 0xee, 0x75, 0x97, 0x36, 0x7a, 0xe0, 0x7d, 0xa7, 0xfb, 0xa4, 0xd9, 0x12, 0x6f, 0xa3, 0x87, 0xe8, 0x16, 0x3e, + 0x40, 0x63, 0x2a, 0xaf, 0xa6, 0x1d, 0x7d, 0xbf, 0x9b, 0x83, 0x17, 0x2b, 0xe5, 0x87, 0xf2, 0xe2, 0x3f, 0x1a, 0x1f, 0x1a, 0x24, 0x5e, 0xfd, 0xb7, 0xe7, 0xfc, 0x9e, 0x4d, 0x9d, 0x4b, 0x75, 0xb4, + 0xaa, 0xd7, 0xdb, 0xe8, 0x9f, 0xb0, 0xab, 0x73, 0xa9, 0xde, 0x5b, 0xd6, 0xab, 0xd7, 0xbf, 0x21, 0xe1, 0x9d, 0x75, 0xbd, 0x7a, 0xbd, 0xdf, 0xd7, 0xb5, 0x8b, 0xa5, 0x8f, 0x05, 0x29, 0x3f, 0xc3, + 0x57, 0x9f, 0x22, 0x74, 0x85, 0x1d, 0x7f, 0xef, 0xab, 0xb7, 0x3e, 0xf3, 0x05, 0xe7, 0xe8, 0x03, 0x8e, 0xa1, 0x6a, 0x7c, 0xc1, 0x31, 0x52, 0x9d, 0x26, 0xdd, 0x24, 0x8a, 0xef, 0x06, 0xc3, 0x70, + 0x12, 0x69, 0x30, 0x37, 0x28, 0xf1, 0x99, 0x2a, 0x38, 0x4c, 0x95, 0x39, 0x3a, 0xbf, 0x3a, 0x3c, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5f, 0x41, 0x77, 0xf2, 0xcf, + 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, + 0x78, 0x6d, 0x6c, 0xbc, 0x56, 0x5d, 0x8b, 0xe3, 0x36, 0x14, 0x7d, 0xcf, 0xaf, 0x30, 0xa1, 0x8f, 0xb5, 0x94, 0x64, 0x0a, 0x2d, 0x41, 0xe3, 0x65, 0x29, 0x59, 0xba, 0xb0, 0xd3, 0x1d, 0xc8, 0xb6, + 0xf4, 0x55, 0x23, 0xdf, 0x38, 0x9a, 0xda, 0x92, 0x90, 0xe4, 0xc4, 0x43, 0xe9, 0x7f, 0x2f, 0x96, 0x6c, 0x47, 0x76, 0xe4, 0xf9, 0x28, 0xcc, 0xce, 0xd3, 0x44, 0xf7, 0xdc, 0xab, 0x73, 0xbf, 0x8e, + 0x4c, 0x3e, 0x34, 0x55, 0x99, 0x9c, 0x40, 0x1b, 0x2e, 0xc5, 0xed, 0x72, 0x8d, 0x56, 0xcb, 0x04, 0x04, 0x93, 0x39, 0x17, 0xc5, 0xed, 0xf2, 0x8f, 0x6f, 0x9f, 0xd2, 0x5f, 0x96, 0x1f, 0xb2, 0x05, + 0x51, 0x5a, 0x3e, 0x02, 0xb3, 0x49, 0x53, 0x95, 0xc2, 0xdc, 0x2e, 0x8f, 0xd6, 0xaa, 0x2d, 0xc6, 0x15, 0x3d, 0x81, 0x40, 0x54, 0x51, 0x76, 0x04, 0x24, 0x75, 0x81, 0xef, 0xbf, 0xde, 0xe1, 0x9f, + 0xd0, 0xaa, 0x8d, 0xe2, 0x90, 0xdb, 0xc6, 0xf0, 0x01, 0x7d, 0x3e, 0x9f, 0xd1, 0xf9, 0xc6, 0xe1, 0x36, 0xab, 0xd5, 0x1a, 0xff, 0x75, 0xf7, 0x65, 0xcf, 0x8e, 0x50, 0xd1, 0x94, 0x0b, 0x63, 0xa9, + 0x60, 0xb0, 0x5c, 0x24, 0xfd, 0x5f, 0x63, 0xf8, 0xd6, 0x38, 0xeb, 0x17, 0xc9, 0xa8, 0x75, 0xec, 0x5e, 0xbc, 0x35, 0x69, 0x11, 0x26, 0x06, 0x69, 0x4c, 0xee, 0x0f, 0x53, 0x07, 0x44, 0x8d, 0xc9, + 0x97, 0xd9, 0x22, 0x49, 0x48, 0x25, 0x73, 0x28, 0xff, 0xf4, 0xf9, 0x67, 0xce, 0x46, 0xf0, 0xe8, 0x6c, 0xd1, 0xa2, 0x14, 0xd5, 0x20, 0x6c, 0xe6, 0xe8, 0x91, 0x42, 0xcb, 0x5a, 0x7d, 0xce, 0x33, + 0xa9, 0x0b, 0x64, 0x94, 0xe6, 0xa2, 0x38, 0x68, 0x5a, 0xc1, 0x59, 0xea, 0xbf, 0xd1, 0x83, 0x94, 0x96, 0xe0, 0x1e, 0xe1, 0xf1, 0x54, 0x5b, 0x7e, 0xa0, 0xcc, 0x7e, 0xce, 0x33, 0x0f, 0x4f, 0x5b, + 0x54, 0x6a, 0x2c, 0xd5, 0x16, 0x74, 0xea, 0x63, 0x13, 0x1c, 0xc0, 0xbc, 0x5f, 0xd7, 0x95, 0xec, 0x06, 0xad, 0x5b, 0x56, 0xfd, 0x4f, 0x6f, 0xd4, 0x50, 0x52, 0xcb, 0x4f, 0x70, 0x4f, 0xed, 0x11, + 0xbb, 0x4c, 0x70, 0x4f, 0x72, 0x11, 0x70, 0x64, 0xb2, 0x42, 0xd0, 0xd0, 0x4a, 0x95, 0x80, 0xe0, 0x04, 0xc2, 0x9a, 0x11, 0xbb, 0x90, 0xdb, 0xa1, 0x16, 0xac, 0xad, 0xf3, 0x94, 0xc9, 0xc0, 0xa3, + 0xad, 0xdb, 0x3a, 0xdd, 0xff, 0xfe, 0xf1, 0x7e, 0xff, 0xdb, 0xd7, 0x6f, 0x23, 0x42, 0x44, 0xd0, 0x0a, 0xb2, 0xbd, 0xcb, 0x2e, 0xf9, 0xb5, 0x94, 0x75, 0x9e, 0x7c, 0xea, 0xc2, 0x6d, 0xb7, 0x3b, + 0x77, 0x6f, 0xb2, 0xf3, 0x34, 0x08, 0x76, 0xd8, 0xd6, 0x29, 0x07, 0xc3, 0x34, 0x57, 0x2d, 0x2a, 0xfb, 0x98, 0x44, 0xbd, 0x7f, 0x4c, 0x6a, 0x73, 0x39, 0xdd, 0x75, 0x19, 0x84, 0x8e, 0xbe, 0x3f, + 0x5a, 0x2a, 0xd0, 0x96, 0x83, 0xe9, 0xca, 0xf3, 0x48, 0x4f, 0x14, 0xf5, 0x04, 0xd7, 0x3f, 0x13, 0x3c, 0x3a, 0xf0, 0x98, 0xae, 0x19, 0xac, 0x0d, 0x3d, 0x98, 0x36, 0xab, 0xcd, 0x06, 0xad, 0xd0, + 0x0d, 0xc1, 0x51, 0xb3, 0xf7, 0x64, 0xb2, 0x52, 0xbc, 0x6c, 0x7b, 0x57, 0xd6, 0x05, 0x17, 0x28, 0xe8, 0x94, 0x6b, 0xd5, 0x9c, 0xbd, 0xbb, 0xb7, 0xd6, 0x70, 0xe0, 0x1a, 0xae, 0xbd, 0xdd, 0xf4, + 0xcd, 0x99, 0xbd, 0xb3, 0x9f, 0xec, 0xfe, 0x02, 0xa4, 0x68, 0x3b, 0x7a, 0x16, 0xb4, 0xc9, 0xac, 0xae, 0x81, 0xe0, 0x79, 0x7b, 0xd4, 0xdf, 0xc8, 0x5a, 0x33, 0x70, 0x15, 0x8a, 0x5b, 0xa2, 0x5e, + 0x96, 0xea, 0x02, 0x6c, 0xcc, 0xab, 0xb3, 0x78, 0xaf, 0x4e, 0x34, 0xd0, 0x43, 0xcd, 0xcb, 0xbc, 0x0b, 0xb8, 0xeb, 0xc4, 0x25, 0x73, 0xda, 0x42, 0xf0, 0xb3, 0x98, 0x71, 0x18, 0x0d, 0x4a, 0x6a, + 0xcb, 0x45, 0x81, 0x64, 0x6d, 0x55, 0x6d, 0xe7, 0x42, 0xcd, 0xe2, 0xfc, 0x96, 0x04, 0xa3, 0xe2, 0x87, 0x50, 0x81, 0xc8, 0x41, 0xb0, 0xa7, 0x3b, 0x2a, 0x68, 0x01, 0xd5, 0x65, 0xd1, 0x07, 0xd3, + 0x30, 0x57, 0x23, 0x7c, 0x36, 0xa8, 0xd5, 0xb3, 0x92, 0xe0, 0x06, 0x68, 0xa2, 0x09, 0x33, 0xba, 0xe0, 0xa0, 0x69, 0x78, 0xed, 0xb5, 0x2c, 0x8c, 0xa4, 0xe1, 0x87, 0x7f, 0x62, 0x53, 0xfa, 0xef, + 0x44, 0x2c, 0x9c, 0x8b, 0x7d, 0x52, 0x90, 0x29, 0x59, 0x11, 0xec, 0xfe, 0xbb, 0x18, 0x0c, 0x93, 0x0a, 0x32, 0x5e, 0xb5, 0x45, 0x23, 0xd8, 0xff, 0xea, 0x93, 0xc5, 0xd3, 0x6c, 0x83, 0x93, 0xae, + 0x28, 0x21, 0x26, 0xac, 0xe0, 0x22, 0x5a, 0xc0, 0x48, 0xf9, 0xde, 0xaa, 0xa7, 0x2f, 0x2b, 0x2a, 0x65, 0xb6, 0xa6, 0x56, 0xea, 0x88, 0xa6, 0x5e, 0x27, 0xf4, 0x3d, 0x08, 0x9d, 0xe1, 0xe1, 0x50, + 0xd6, 0xcd, 0x7b, 0xf0, 0x89, 0x4f, 0xd7, 0xec, 0x6c, 0xf5, 0x8c, 0x7a, 0xb1, 0x6f, 0xa9, 0xbd, 0x07, 0xad, 0xff, 0x55, 0x26, 0x0b, 0x26, 0xf2, 0x0e, 0x0e, 0x23, 0xea, 0xcd, 0xc1, 0x80, 0x4e, + 0x69, 0x4e, 0x87, 0xb3, 0x3d, 0x72, 0xba, 0xd2, 0x0b, 0x89, 0x13, 0xd4, 0xe9, 0x9a, 0x0f, 0x06, 0x13, 0x2c, 0x85, 0x3f, 0xb9, 0x1c, 0x4c, 0xd2, 0xed, 0xbe, 0x2c, 0xbc, 0xf8, 0x75, 0xde, 0x91, + 0x15, 0x1f, 0xa7, 0xec, 0xbf, 0x3f, 0x26, 0x6f, 0x43, 0x7c, 0xc1, 0x47, 0x2b, 0x3e, 0xf3, 0x9a, 0x44, 0xb7, 0x1c, 0x4f, 0x89, 0xbf, 0x63, 0x26, 0x93, 0x87, 0xea, 0x15, 0x99, 0xcc, 0x3c, 0x6d, + 0xaf, 0xc9, 0xa4, 0xff, 0xdd, 0xeb, 0x08, 0xbe, 0x6e, 0x66, 0xd8, 0x64, 0x33, 0xe9, 0x6d, 0x10, 0x38, 0xcc, 0xbe, 0xd0, 0x94, 0x96, 0xa7, 0xca, 0xbf, 0x3e, 0x56, 0xca, 0x32, 0x96, 0x7b, 0x98, + 0xb9, 0x70, 0x1f, 0x5d, 0xa9, 0x2f, 0xc0, 0x7c, 0xde, 0x57, 0xec, 0x9f, 0x65, 0xf1, 0xaa, 0xe5, 0x99, 0x5f, 0x9f, 0xb7, 0x91, 0x19, 0x15, 0x92, 0xe0, 0x6e, 0x3f, 0x86, 0xd7, 0x33, 0x5b, 0xfc, + 0x17, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x48, 0xb8, 0x7d, 0x55, 0x22, 0x03, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x45, + 0x63, 0x68, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, 0x54, 0x4d, 0x4f, 0xe3, 0x30, 0x10, 0xbd, 0xe7, 0x57, 0x8c, 0x72, 0x4a, 0x50, 0xe5, 0x70, + 0xa6, 0x80, 0x80, 0x36, 0x40, 0x56, 0x2c, 0x45, 0x6d, 0x83, 0xb4, 0xb7, 0xba, 0xce, 0x34, 0x35, 0x24, 0xb6, 0x65, 0x3b, 0x65, 0x2b, 0xd4, 0xff, 0xbe, 0x72, 0x3e, 0x4a, 0xa9, 0xd8, 0x08, 0x7a, + 0xe9, 0x78, 0x32, 0x7e, 0xf3, 0xe6, 0xcd, 0x8c, 0x15, 0x65, 0xaf, 0x34, 0x47, 0x40, 0xb6, 0x96, 0x43, 0xcf, 0xe3, 0xa5, 0x92, 0xda, 0x82, 0xd4, 0x39, 0x31, 0x4a, 0x73, 0x91, 0xaf, 0x34, 0x2d, + 0xf1, 0x4d, 0xea, 0x57, 0xc2, 0x0a, 0x59, 0x65, 0x64, 0x55, 0x09, 0x66, 0xb9, 0x14, 0xcd, 0x11, 0x37, 0x28, 0x2c, 0x19, 0x39, 0x33, 0x76, 0xe6, 0x6f, 0x34, 0x86, 0xe6, 0x78, 0x53, 0xf1, 0x22, + 0x43, 0x3d, 0xfc, 0x01, 0xdc, 0x1b, 0x2e, 0x49, 0x65, 0x79, 0x41, 0xee, 0x91, 0x66, 0xa8, 0x53, 0xcb, 0x0b, 0xd3, 0x7b, 0x7f, 0x6d, 0xad, 0x22, 0xf7, 0xd6, 0xaa, 0xe6, 0x42, 0x7f, 0x70, 0x59, + 0xf3, 0xe2, 0x22, 0x27, 0x2d, 0xc3, 0xde, 0x68, 0x63, 0x51, 0xa3, 0xb4, 0x5b, 0x85, 0x64, 0x24, 0x4b, 0x25, 0x05, 0x0a, 0xfb, 0xa1, 0xcd, 0x0b, 0xdd, 0x50, 0x22, 0xd0, 0x92, 0x74, 0x9a, 0x0c, + 0x3f, 0x39, 0x6b, 0xfe, 0x69, 0x9a, 0x8c, 0xbf, 0x70, 0xef, 0x0b, 0xbd, 0x6d, 0x8d, 0x2f, 0x62, 0x0a, 0x99, 0xd7, 0x1c, 0x1f, 0x70, 0x83, 0x45, 0xdf, 0x77, 0x99, 0xe7, 0x4e, 0xdd, 0x2e, 0xc2, + 0x58, 0x6a, 0x39, 0xfb, 0x8e, 0xca, 0x7d, 0x4d, 0xab, 0x25, 0x27, 0x27, 0x43, 0xcf, 0xbb, 0xda, 0x57, 0x1d, 0xf8, 0x6e, 0x2e, 0xfc, 0xd0, 0x53, 0xd5, 0xb2, 0xe0, 0x0c, 0x58, 0x41, 0x8d, 0x81, + 0x98, 0xad, 0x65, 0x57, 0x06, 0xf0, 0x52, 0x15, 0x58, 0xa2, 0xb0, 0x06, 0x3a, 0xdf, 0x79, 0x8b, 0x78, 0x3e, 0xb3, 0x8e, 0xcd, 0xe5, 0x00, 0x8e, 0x1c, 0x97, 0xf0, 0xee, 0x01, 0x28, 0xcd, 0x37, + 0xd4, 0x62, 0x47, 0x7f, 0xc5, 0x05, 0x2d, 0xa0, 0xa9, 0x0d, 0x1e, 0x26, 0x77, 0x77, 0xf1, 0x14, 0x2e, 0xda, 0x33, 0xc9, 0xd1, 0x36, 0x56, 0xe0, 0x41, 0xfd, 0x3b, 0xe4, 0x40, 0x6a, 0x5a, 0x2e, + 0xe6, 0x91, 0x96, 0x18, 0x84, 0xe1, 0xd0, 0xf3, 0x00, 0xae, 0x26, 0x1b, 0xd4, 0x9a, 0x67, 0xe8, 0x52, 0x35, 0xf4, 0x8f, 0x68, 0x00, 0x55, 0xaa, 0xd8, 0x06, 0xc7, 0x5e, 0x2e, 0x54, 0xd5, 0x89, + 0x12, 0xd6, 0x4c, 0x01, 0xa2, 0x93, 0x26, 0xef, 0x09, 0xfc, 0x99, 0xa4, 0x53, 0x18, 0x4d, 0xc6, 0x31, 0xdc, 0xc7, 0xd3, 0xb8, 0xf5, 0x76, 0x1f, 0xe7, 0x7a, 0x0b, 0xba, 0x12, 0x82, 0x8b, 0x1c, + 0x16, 0xe5, 0x46, 0x80, 0x45, 0x63, 0x17, 0x04, 0xe0, 0x3a, 0xcb, 0xa0, 0x94, 0x1a, 0x6b, 0x07, 0x50, 0x03, 0x5b, 0x59, 0x01, 0x93, 0x19, 0x02, 0x17, 0xb0, 0x70, 0xce, 0xc8, 0xf5, 0x39, 0x72, + 0x72, 0x47, 0xb3, 0xba, 0x89, 0x1f, 0x0d, 0x32, 0xd7, 0x4a, 0x15, 0x9c, 0x51, 0x57, 0xeb, 0x1c, 0x8d, 0x35, 0x0b, 0xd2, 0x26, 0x8c, 0x9a, 0xff, 0x83, 0x35, 0x80, 0xf5, 0x81, 0x7d, 0x01, 0x07, + 0xdb, 0x44, 0x56, 0x5a, 0x96, 0x6d, 0x59, 0xc1, 0x61, 0x8d, 0x4e, 0xb8, 0xf6, 0x46, 0xa7, 0x1d, 0x40, 0xdb, 0x01, 0x37, 0x73, 0x41, 0x3d, 0x8f, 0x24, 0x79, 0xbc, 0x9d, 0x0c, 0xc0, 0x4f, 0xdc, + 0x4d, 0x18, 0xc5, 0x90, 0x64, 0x67, 0xef, 0xa7, 0x3b, 0x7f, 0x70, 0x98, 0xd1, 0x41, 0xdd, 0x72, 0x6d, 0x6c, 0x90, 0x8c, 0x1d, 0xd4, 0xf7, 0x90, 0x66, 0x0a, 0x19, 0x3c, 0xa3, 0x36, 0x5c, 0x8a, + 0x3e, 0xcc, 0xd9, 0x53, 0x3c, 0x7a, 0x8e, 0xa7, 0xb3, 0x64, 0xf2, 0xf8, 0x03, 0x70, 0x59, 0x69, 0x86, 0xbd, 0xb0, 0x93, 0x74, 0x3a, 0x8a, 0x7f, 0x80, 0x58, 0x2d, 0x5f, 0x90, 0xd9, 0x5e, 0xc8, + 0xf4, 0xe6, 0x57, 0x3c, 0x9a, 0xef, 0x31, 0x9b, 0xd1, 0x6a, 0x26, 0x0b, 0x2e, 0xe0, 0x58, 0xfd, 0x27, 0xba, 0x2d, 0x24, 0xcd, 0x82, 0xef, 0x51, 0x78, 0x3f, 0xdd, 0x81, 0x3f, 0x68, 0x40, 0xf6, + 0xed, 0xd2, 0x68, 0x2b, 0x2d, 0xe0, 0x7f, 0x4f, 0x31, 0x79, 0xe3, 0x76, 0x3d, 0xa6, 0x96, 0x36, 0x9d, 0x0f, 0xdb, 0x2d, 0x02, 0x20, 0x06, 0xed, 0x7c, 0xab, 0xb0, 0xdb, 0x74, 0x77, 0x4e, 0xb2, + 0xc0, 0xbd, 0x62, 0x44, 0x53, 0x91, 0xc9, 0xd2, 0x99, 0x41, 0x48, 0xac, 0x6c, 0x8a, 0x08, 0xc2, 0xcf, 0x97, 0x5b, 0x35, 0x02, 0xdf, 0x6d, 0x24, 0xd4, 0x6f, 0x8b, 0x7f, 0x14, 0x51, 0x77, 0x20, + 0x48, 0xa7, 0x09, 0x61, 0x1a, 0xa9, 0xc5, 0xc0, 0x77, 0xa2, 0x9d, 0x45, 0x11, 0xfe, 0xa5, 0xee, 0xf5, 0x20, 0x4c, 0x96, 0x51, 0x93, 0x3e, 0x24, 0x4b, 0x47, 0xb8, 0x51, 0x62, 0xe7, 0xed, 0xbc, + 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x49, 0x1e, 0xc2, 0x1b, 0x96, 0x02, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, + 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, + 0x53, 0x5f, 0x6b, 0xdb, 0x30, 0x10, 0x7f, 0xd7, 0xa7, 0xb8, 0xc7, 0x04, 0x82, 0xbe, 0x40, 0x5e, 0xb2, 0x7a, 0x81, 0x84, 0x36, 0xcb, 0x68, 0xda, 0xed, 0x61, 0x8c, 0xa2, 0x28, 0x17, 0xe7, 0xa8, + 0xad, 0x33, 0xa7, 0x73, 0xb6, 0x50, 0xfa, 0xdd, 0x87, 0x64, 0x1b, 0x52, 0x52, 0xb2, 0xd6, 0x60, 0x6c, 0x99, 0xdf, 0x5f, 0xe9, 0xdc, 0x38, 0xff, 0xec, 0x4a, 0x04, 0xf4, 0x07, 0x9e, 0x1a, 0x43, + 0x75, 0xc3, 0xa2, 0xc0, 0x52, 0xda, 0xd8, 0x08, 0x85, 0x72, 0x2f, 0xae, 0xc6, 0x3f, 0x2c, 0xcf, 0xd6, 0xb1, 0xda, 0x03, 0x05, 0xb5, 0x2b, 0xac, 0xb7, 0x28, 0x85, 0x53, 0x2c, 0x59, 0x4e, 0xd3, + 0x0f, 0x71, 0xee, 0xdb, 0xa0, 0x54, 0xe3, 0x82, 0x82, 0xc6, 0xcf, 0x33, 0xee, 0xb1, 0xa4, 0xa8, 0xe2, 0xe4, 0x2a, 0x75, 0xcb, 0xac, 0x76, 0x93, 0x3f, 0x7e, 0x69, 0x9a, 0x8a, 0xbc, 0x53, 0xe2, + 0xf0, 0x7f, 0x8a, 0x6b, 0x95, 0x3d, 0x87, 0x3d, 0x95, 0xad, 0x60, 0x2f, 0x70, 0xc3, 0xac, 0x1f, 0x15, 0xf1, 0x15, 0xb7, 0x3b, 0xbb, 0x6f, 0x83, 0x4f, 0x50, 0xeb, 0x39, 0x28, 0xfe, 0x55, 0x5b, + 0x63, 0x8c, 0xae, 0x44, 0xbb, 0xea, 0x9e, 0x8f, 0x4a, 0xd5, 0xf5, 0xea, 0x03, 0xd1, 0x85, 0xc0, 0x9a, 0x6d, 0xed, 0x32, 0xa3, 0xdf, 0x6e, 0x9e, 0x99, 0xbd, 0x1b, 0xd1, 0xcc, 0x2e, 0xc1, 0xa3, + 0x0e, 0x59, 0xa4, 0x80, 0xf3, 0x23, 0x06, 0x8d, 0x67, 0x84, 0x21, 0xd8, 0x02, 0xdd, 0x0e, 0x25, 0xe3, 0xad, 0xaf, 0x5c, 0x8c, 0x63, 0xd3, 0xb4, 0xdb, 0x8a, 0x3c, 0xe4, 0x15, 0x5c, 0xd3, 0x80, + 0x17, 0x63, 0x00, 0x7a, 0x78, 0x4c, 0xa1, 0x3d, 0x1c, 0x99, 0x76, 0x50, 0x3b, 0x0a, 0xa3, 0x8d, 0x26, 0xe6, 0xaf, 0xdf, 0xe0, 0xa4, 0x8c, 0x63, 0x78, 0x31, 0x00, 0x00, 0x17, 0x07, 0x64, 0xa5, + 0x0d, 0xd7, 0x83, 0xe6, 0x1c, 0x93, 0x4e, 0x65, 0x6a, 0x00, 0x5e, 0x93, 0x69, 0xef, 0xd6, 0x65, 0xbc, 0xac, 0x02, 0x54, 0x37, 0x15, 0xd6, 0x49, 0x0a, 0xde, 0x1d, 0xa5, 0x3e, 0xce, 0x6c, 0x7d, + 0x44, 0x11, 0xda, 0x61, 0x5e, 0xf5, 0x4d, 0x72, 0x05, 0xc9, 0xc8, 0x5e, 0x6e, 0x74, 0xae, 0x01, 0x69, 0x40, 0xe3, 0x04, 0x8a, 0xe4, 0x7d, 0xc7, 0xc9, 0xb3, 0xcb, 0xd1, 0xbd, 0x0f, 0x4d, 0xa1, + 0xc3, 0x59, 0xc1, 0x7d, 0x85, 0x79, 0x36, 0x46, 0x63, 0x3b, 0xa8, 0x3e, 0x9c, 0x1a, 0x1c, 0x9d, 0x8f, 0xc6, 0x70, 0x1c, 0x1b, 0x95, 0xd6, 0x6b, 0x2b, 0xf8, 0x93, 0xf4, 0x50, 0xb8, 0x88, 0xcb, + 0x10, 0x31, 0x44, 0x52, 0x3a, 0xf6, 0xfd, 0x6e, 0xf1, 0xd4, 0x9f, 0xd4, 0xa4, 0xf7, 0x49, 0xd7, 0xdb, 0xbf, 0xd2, 0x2e, 0xbf, 0xfd, 0x58, 0xdf, 0xce, 0x9f, 0xbe, 0x3f, 0xde, 0xdc, 0x2d, 0x8b, + 0xa7, 0xd5, 0xfc, 0x61, 0xb1, 0xfe, 0xba, 0xc9, 0xbb, 0x97, 0xf6, 0x2f, 0xdd, 0xaf, 0xe6, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd2, 0xfa, 0xdc, 0x7c, 0x96, 0x01, 0x00, + 0x00, 0xfc, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2a, 0x2e, 0x28, 0xca, 0xcc, 0x4b, 0xd7, 0x4b, 0xce, 0xc9, 0x2f, 0x4d, 0xd1, 0x4b, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, + 0xd3, 0x4b, 0x49, 0x4d, 0xcb, 0xcc, 0xcb, 0x04, 0x31, 0x6d, 0x61, 0x62, 0x41, 0xf9, 0xa5, 0x25, 0xa9, 0x45, 0x5c, 0xd8, 0xd5, 0x17, 0xe5, 0x97, 0x96, 0x64, 0xe6, 0xa5, 0xeb, 0xa6, 0x56, 0x14, + 0x14, 0xa5, 0x16, 0x17, 0x83, 0xf4, 0x65, 0xa4, 0x26, 0xa6, 0xa4, 0x16, 0x15, 0x47, 0xab, 0x27, 0xa7, 0xea, 0x96, 0x54, 0x16, 0xa4, 0xaa, 0xc7, 0x72, 0x01, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0xfd, 0x80, 0x5f, 0x6d, 0x54, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, + 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x73, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xdc, 0x55, 0x5d, 0x6f, 0x22, 0x37, 0x14, 0x7d, 0x9f, 0x5f, 0x71, 0xc5, 0xd3, 0x20, 0x8d, 0x1c, 0xda, 0xa7, 0xd5, 0x52, 0xaa, 0x25, 0x64, 0xa4, 0x65, 0xd5, + 0x00, 0x1a, 0x86, 0xad, 0xfa, 0xb4, 0x32, 0x9e, 0x1b, 0xc6, 0x59, 0x63, 0x7b, 0xed, 0x3b, 0x90, 0x68, 0xb5, 0xff, 0xbd, 0xf2, 0x0c, 0x90, 0x21, 0x45, 0x84, 0xaa, 0x42, 0x6a, 0x9b, 0x97, 0x98, + 0xf1, 0xb9, 0xdf, 0xe7, 0xf8, 0x5a, 0x2e, 0xbe, 0xf2, 0x15, 0x02, 0x8a, 0xd2, 0xf4, 0xa3, 0x48, 0xae, 0xad, 0x71, 0x04, 0x9e, 0x38, 0x49, 0x01, 0xc6, 0xad, 0x58, 0xc9, 0xd7, 0xc2, 0xa1, 0x27, + 0x76, 0xcf, 0x49, 0x94, 0xe8, 0x86, 0xde, 0xa3, 0x23, 0xc6, 0xeb, 0x7f, 0x79, 0xc9, 0xa9, 0x7f, 0x81, 0x91, 0x67, 0xf8, 0xad, 0xe2, 0x2a, 0x37, 0x97, 0x81, 0xb5, 0xa1, 0x49, 0xa5, 0xd4, 0x67, + 0xae, 0x2a, 0x3c, 0x65, 0xe1, 0xad, 0x93, 0x7a, 0xf5, 0xe0, 0xf8, 0x1a, 0xb7, 0xc6, 0x7d, 0x65, 0x42, 0x99, 0xaa, 0x60, 0x0f, 0x95, 0x16, 0x24, 0x8d, 0x6e, 0x7e, 0xe2, 0x06, 0x35, 0xb1, 0x51, + 0x38, 0xa6, 0xe1, 0x78, 0x8f, 0xde, 0xf3, 0x15, 0x2e, 0x48, 0x2a, 0xcf, 0xc6, 0x77, 0x57, 0x71, 0x3b, 0x9f, 0x2e, 0xb2, 0x51, 0x7a, 0x1d, 0xd7, 0xb3, 0x74, 0xf4, 0x39, 0xcd, 0xe6, 0xe3, 0xe9, + 0xe4, 0x3a, 0xfe, 0x17, 0xb7, 0x9f, 0xd2, 0x51, 0x7e, 0x15, 0xdf, 0xf9, 0x1f, 0xb3, 0xf4, 0x85, 0x5b, 0x8f, 0x7c, 0xc3, 0x99, 0x46, 0x62, 0x8b, 0x6c, 0xdc, 0x3f, 0xfa, 0x58, 0x91, 0x54, 0x6c, + 0xb1, 0x68, 0x0d, 0x27, 0x84, 0x7f, 0xac, 0xb4, 0x24, 0xf6, 0x58, 0x59, 0x49, 0xe8, 0x18, 0xb7, 0x92, 0xe5, 0xe8, 0xe9, 0x08, 0xf2, 0x3a, 0xc3, 0x25, 0x72, 0xed, 0xd9, 0x03, 0x17, 0x64, 0xdc, + 0x33, 0xe3, 0x5a, 0x9b, 0x50, 0x8d, 0xd1, 0x6c, 0x58, 0x91, 0xd9, 0x4a, 0x87, 0xc5, 0x79, 0x73, 0x63, 0x88, 0x51, 0x60, 0xa4, 0x30, 0x9a, 0xf0, 0x89, 0xd8, 0xbc, 0x46, 0xdc, 0x1a, 0x43, 0x6f, + 0xc7, 0x7e, 0xc3, 0x98, 0xfd, 0x8e, 0xcb, 0x54, 0x6f, 0xa4, 0x33, 0x7a, 0x8d, 0xfa, 0x52, 0x5f, 0x5b, 0x5c, 0x32, 0xa1, 0x64, 0x68, 0x72, 0x70, 0x92, 0xa1, 0xa7, 0x1c, 0xd7, 0x56, 0x71, 0xc2, + 0xb3, 0x1e, 0x4a, 0x22, 0xcb, 0x3e, 0x12, 0xd9, 0x8f, 0xc8, 0x0b, 0x74, 0xfe, 0x6d, 0xf0, 0x3d, 0x16, 0x92, 0xe7, 0xcf, 0xf6, 0x02, 0xbf, 0x19, 0x7e, 0xab, 0xd0, 0x53, 0xaa, 0x49, 0xd2, 0xf3, + 0x25, 0x70, 0x6f, 0x8d, 0xf6, 0xb8, 0xc7, 0x47, 0x1f, 0x8e, 0x3b, 0x13, 0x0b, 0x15, 0x5e, 0x15, 0x0f, 0x03, 0x68, 0x2e, 0x5e, 0xe8, 0xe4, 0x87, 0xd6, 0x2a, 0x29, 0xf8, 0x8e, 0x70, 0xdc, 0xfb, + 0x24, 0x02, 0x00, 0xd8, 0x1e, 0xf5, 0x12, 0x06, 0x70, 0xdc, 0x5c, 0x96, 0x0d, 0x27, 0x77, 0xd3, 0xfb, 0x2f, 0xb3, 0x69, 0x96, 0x77, 0x23, 0x5b, 0x2d, 0x95, 0x14, 0x50, 0x9b, 0x9f, 0x8d, 0x10, + 0x92, 0xf1, 0xf0, 0x3d, 0x02, 0x88, 0x00, 0x3e, 0x1c, 0x38, 0x13, 0x01, 0x58, 0x27, 0x37, 0x9c, 0x10, 0x5e, 0xcf, 0x00, 0x5c, 0x4d, 0x8b, 0x00, 0x0f, 0x57, 0x01, 0xd9, 0x04, 0xdb, 0x18, 0x59, + 0x40, 0x98, 0x60, 0x2a, 0x4a, 0x33, 0xd6, 0xb6, 0xa2, 0xb8, 0x0b, 0x54, 0x3a, 0xb3, 0xf5, 0x90, 0x3e, 0x09, 0xb4, 0x21, 0x1e, 0x7c, 0x8f, 0xea, 0x6a, 0xe6, 0x14, 0x72, 0x02, 0x19, 0x60, 0x30, + 0xe8, 0x94, 0xa8, 0x94, 0xe9, 0xf4, 0x9b, 0xbb, 0xd6, 0x0c, 0x41, 0xe0, 0xfe, 0x34, 0x00, 0x8d, 0xdb, 0xf6, 0x5d, 0xdc, 0xed, 0xd7, 0xf0, 0x03, 0x84, 0xf1, 0xa2, 0x88, 0x5b, 0x8f, 0x47, 0x02, + 0x9d, 0x9f, 0x58, 0xaf, 0x73, 0x12, 0x36, 0xbe, 0x4b, 0x20, 0xc8, 0x8f, 0x39, 0xae, 0x0b, 0xb3, 0x0e, 0xc7, 0xb8, 0x5b, 0xe3, 0xc2, 0x1f, 0x23, 0xd3, 0x24, 0x18, 0x77, 0x4f, 0x5a, 0x07, 0x95, + 0x27, 0xd0, 0x09, 0x8b, 0xe4, 0xb4, 0xfb, 0xe6, 0x75, 0x4c, 0xa0, 0x13, 0xd8, 0xf0, 0xfe, 0xe6, 0x46, 0x19, 0xc1, 0x55, 0x69, 0x3c, 0xbd, 0x7f, 0xd7, 0x7b, 0xd7, 0xbb, 0x39, 0x63, 0xd8, 0xbc, + 0x4d, 0x09, 0x74, 0x42, 0x17, 0xa1, 0xd6, 0x95, 0xa6, 0x80, 0xad, 0xc1, 0xc7, 0xbc, 0xfa, 0xa5, 0x49, 0xf2, 0xd7, 0x30, 0x92, 0xfa, 0x33, 0x0c, 0x80, 0x4a, 0xe9, 0x59, 0xbd, 0x62, 0xf0, 0x49, + 0x94, 0x5c, 0xaf, 0x30, 0x3e, 0x94, 0x75, 0x44, 0x62, 0x66, 0x8d, 0xa7, 0x38, 0xf4, 0x74, 0x91, 0x8d, 0xe3, 0xce, 0x2e, 0xa7, 0x97, 0x1e, 0xd4, 0x7d, 0xd8, 0xc5, 0x0f, 0x1a, 0x89, 0x0f, 0x6a, + 0x61, 0xc3, 0xd9, 0xec, 0xb7, 0xf1, 0x68, 0x98, 0x8f, 0xa7, 0x93, 0x2f, 0x9f, 0xe6, 0xd3, 0xc9, 0x2b, 0xa3, 0x72, 0x37, 0x9f, 0x43, 0x65, 0xaf, 0xee, 0x97, 0xa6, 0x78, 0x8e, 0xeb, 0xc9, 0x77, + 0x93, 0xc3, 0x4d, 0x53, 0x4a, 0x43, 0xf8, 0x7d, 0xb5, 0x2f, 0x8b, 0x37, 0xde, 0x57, 0xc8, 0x56, 0x48, 0x73, 0xe2, 0x54, 0xf9, 0x91, 0x29, 0xb0, 0x3d, 0xb2, 0x4d, 0xd8, 0xa0, 0x71, 0x37, 0x81, + 0xdd, 0xfa, 0x8d, 0x7f, 0xee, 0xf5, 0xf6, 0xd3, 0xdb, 0xb1, 0x2d, 0x04, 0x86, 0x01, 0xb4, 0x7d, 0xdd, 0x86, 0x5c, 0x76, 0xa8, 0x56, 0xb8, 0x80, 0x4c, 0xa0, 0xbd, 0x9b, 0x0f, 0x4c, 0xf8, 0x0b, + 0x6a, 0x1f, 0xaf, 0xa9, 0xa8, 0x46, 0xfd, 0x78, 0x4b, 0x1e, 0x99, 0xa9, 0x28, 0x3c, 0x07, 0xdc, 0x63, 0x31, 0xd5, 0x75, 0x7b, 0xff, 0x9b, 0x5a, 0xf9, 0x5f, 0x2a, 0xe5, 0xac, 0x4e, 0xda, 0x1a, + 0xf9, 0xdb, 0xfa, 0x38, 0xa7, 0x8d, 0x53, 0xba, 0xf8, 0x67, 0xaa, 0xf8, 0x97, 0x69, 0xe2, 0x47, 0xf4, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xea, 0x65, 0xb0, 0x9a, 0x11, + 0x03, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0xcc, 0x31, 0x0a, 0x02, 0x41, 0x0c, 0x85, 0xe1, 0x3e, 0xa7, 0x48, 0x2d, 0xd8, 0x58, 0xd9, + 0xcc, 0x49, 0x44, 0x42, 0x58, 0x33, 0x6e, 0x20, 0x66, 0x25, 0xc9, 0x32, 0xe8, 0xe9, 0x65, 0x2c, 0xb4, 0xfd, 0x1f, 0xdf, 0x8b, 0x6d, 0x2b, 0x6c, 0x58, 0xb1, 0x0b, 0xc0, 0xe5, 0x70, 0x05, 0xf5, + 0x9b, 0x78, 0x51, 0xd6, 0xcb, 0x04, 0x1b, 0xe6, 0x93, 0x17, 0xf9, 0x45, 0x7d, 0xcf, 0x76, 0x82, 0x65, 0xe5, 0x48, 0x99, 0x70, 0xaf, 0x7e, 0x3c, 0x43, 0x85, 0x3e, 0xa8, 0x82, 0xd5, 0xd4, 0xef, + 0x34, 0x56, 0x2d, 0xf9, 0x42, 0x6c, 0xd8, 0xd9, 0x72, 0x1e, 0xa4, 0x44, 0x51, 0x57, 0x67, 0x23, 0x97, 0x61, 0xea, 0xff, 0xf1, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x7b, 0x8c, + 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x5c, 0x90, 0xcd, 0x6a, 0xc4, 0x30, 0x0c, 0x84, 0xef, 0x7a, 0x8a, 0x2c, 0xbe, 0x05, 0xd6, 0xba, 0xf4, 0x05, 0xfa, 0xb3, 0xd0, 0x2d, 0xa5, 0x14, 0x52, 0x7a, 0x2d, 0x8a, 0xad, 0x66, + 0xbd, 0x38, 0x8e, 0x91, 0xd5, 0x2c, 0x7d, 0xfb, 0x92, 0xc4, 0x2d, 0x65, 0x2f, 0xc2, 0xf3, 0x31, 0x96, 0x86, 0x79, 0x3c, 0x3c, 0xbf, 0xda, 0xd1, 0x83, 0x92, 0x0c, 0xac, 0x08, 0x3b, 0x3b, 0xce, + 0x09, 0x2f, 0x42, 0x39, 0xb3, 0xe0, 0x48, 0x33, 0xa7, 0x7d, 0x55, 0xf6, 0x4c, 0x02, 0xbb, 0xb6, 0xc5, 0x22, 0x0e, 0x47, 0x0a, 0x09, 0xdb, 0x16, 0xff, 0xfe, 0x55, 0xae, 0x5c, 0xf4, 0x3f, 0x07, + 0x63, 0x4c, 0xd3, 0xbd, 0x75, 0x8d, 0x31, 0x06, 0x2c, 0x65, 0xfd, 0x18, 0x38, 0xb1, 0x90, 0xb2, 0x07, 0xeb, 0x22, 0x95, 0x92, 0x49, 0x4f, 0x60, 0x3f, 0xc9, 0xe9, 0x24, 0xdf, 0x9b, 0xc8, 0x32, + 0x9d, 0xd9, 0x29, 0xd8, 0xc2, 0xaa, 0x21, 0x0d, 0x05, 0x6c, 0xc9, 0x12, 0xd2, 0x70, 0xc7, 0x94, 0x16, 0xa1, 0xe5, 0x66, 0xef, 0xc8, 0x9d, 0x78, 0xdb, 0x7f, 0x4c, 0xca, 0x31, 0x86, 0xa7, 0xe6, + 0xf8, 0x70, 0xb8, 0xdd, 0x2e, 0x05, 0xcf, 0x04, 0xad, 0x0d, 0x97, 0xb2, 0xcc, 0x31, 0x2e, 0x33, 0xcb, 0x66, 0x7f, 0x61, 0x5d, 0x17, 0xad, 0x4e, 0x4c, 0x7d, 0x3d, 0x87, 0x59, 0xc2, 0x4c, 0xca, + 0xb8, 0xb0, 0xfe, 0x2b, 0x44, 0x8f, 0x80, 0x3e, 0x14, 0x5d, 0x41, 0x7d, 0xd8, 0xd4, 0xef, 0x07, 0x21, 0x1f, 0x19, 0xa1, 0x7a, 0xae, 0x2b, 0xb9, 0xc2, 0xbf, 0x8d, 0x54, 0xbc, 0x26, 0x78, 0xef, + 0x9a, 0xfb, 0xc9, 0xf3, 0x16, 0x75, 0x2e, 0x6e, 0xf2, 0x8c, 0xf0, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x73, 0x70, + 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, + 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, + 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x46, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, + 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0x9d, 0x7e, 0x98, 0x21, + 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, + 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, + 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, + 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x17, 0x67, 0x43, + 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xb9, 0xfa, 0x65, 0x30, 0x28, 0xcb, 0xd2, 0x67, 0x16, 0xb2, 0x2f, 0x69, 0x3d, + 0x48, 0xab, 0xcd, 0x6a, 0x70, 0x37, 0xbe, 0x1d, 0x4d, 0xe6, 0xa3, 0xcb, 0x4f, 0xfe, 0x95, 0x3b, 0xb6, 0x10, 0x29, 0x2a, 0x05, 0x84, 0xff, 0x2b, 0x38, 0x61, 0x0c, 0xcb, 0x2d, 0xb0, 0x3c, 0x4f, + 0x79, 0xc4, 0x96, 0x29, 0x42, 0xca, 0x4a, 0xcb, 0xcf, 0x9a, 0x10, 0x63, 0xd0, 0xd2, 0xc0, 0x2e, 0x89, 0x6b, 0x2e, 0xd6, 0x7d, 0x50, 0x72, 0xa5, 0x4b, 0x46, 0x68, 0xcc, 0xc4, 0x5c, 0x69, 0xe2, + 0xcb, 0x42, 0x1f, 0xb0, 0x56, 0x83, 0xe4, 0xea, 0x60, 0x83, 0x14, 0xc0, 0x04, 0x74, 0x83, 0x39, 0x8c, 0xe7, 0x5d, 0xf8, 0x35, 0x98, 0x8f, 0xe7, 0x7d, 0x63, 0xe4, 0x69, 0xfc, 0xf0, 0xdb, 0x74, + 0xf1, 0x00, 0x4f, 0x41, 0x18, 0x06, 0x93, 0x87, 0xf1, 0x68, 0x0e, 0xd3, 0x10, 0x6e, 0xa7, 0x93, 0xe1, 0xf8, 0x61, 0x3c, 0x9d, 0xcc, 0x61, 0xfa, 0x19, 0x82, 0xc9, 0x17, 0xf8, 0xcf, 0x78, 0x32, + 0xec, 0x03, 0x72, 0x9d, 0x20, 0x01, 0xbe, 0x98, 0xe4, 0x2a, 0x03, 0x93, 0x1b, 0x3e, 0x31, 0xb6, 0xe4, 0xcd, 0x11, 0x0f, 0x20, 0xac, 0x64, 0x05, 0x49, 0xe5, 0x18, 0xf1, 0x15, 0x8f, 0x20, 0x65, + 0x62, 0x5d, 0xb0, 0x35, 0xc2, 0x5a, 0x6e, 0x90, 0x04, 0x17, 0x6b, 0xc8, 0x91, 0x32, 0xae, 0x4c, 0x5e, 0x15, 0x30, 0x11, 0x1b, 0x33, 0x29, 0xcf, 0xb8, 0x66, 0xda, 0x4e, 0x9d, 0xc4, 0x65, 0x1c, + 0x0d, 0x3a, 0x3c, 0xcb, 0x25, 0x69, 0xf8, 0x83, 0x6d, 0x98, 0x2f, 0x50, 0xfb, 0x17, 0xd7, 0x07, 0x53, 0x5c, 0x1e, 0xcf, 0x08, 0x2e, 0xfd, 0x28, 0x61, 0x42, 0x60, 0xaa, 0x8e, 0xd7, 0x0a, 0xcd, + 0x53, 0x7f, 0x46, 0x32, 0x47, 0xd2, 0x1c, 0xd5, 0x75, 0xa7, 0x93, 0x17, 0xcb, 0x94, 0x47, 0x10, 0xa5, 0x4c, 0x29, 0xb8, 0x67, 0x1b, 0x14, 0x4f, 0xc4, 0xf2, 0x1c, 0x69, 0x28, 0x4b, 0x91, 0x4a, + 0x66, 0x30, 0x7d, 0xef, 0x74, 0x4c, 0xf6, 0x73, 0xe2, 0x1b, 0xa6, 0x11, 0x94, 0x41, 0x1c, 0xc1, 0xca, 0x56, 0xf9, 0x5c, 0x93, 0x89, 0xed, 0x29, 0x0c, 0x66, 0xb3, 0x51, 0xf8, 0xfc, 0x38, 0x0a, + 0xe7, 0xe3, 0xe9, 0x04, 0x6e, 0xa0, 0x7b, 0xe5, 0xff, 0xdd, 0xff, 0x47, 0xf7, 0xda, 0x1e, 0x1d, 0x5c, 0x5c, 0xd8, 0xff, 0xe1, 0x02, 0x86, 0xb8, 0x62, 0x45, 0xaa, 0x61, 0x11, 0xde, 0x99, 0x8c, + 0xc7, 0xce, 0x8d, 0x0d, 0x3c, 0x33, 0xfe, 0x2f, 0xcb, 0x0a, 0x80, 0xff, 0x07, 0x23, 0x58, 0x91, 0xcc, 0xfa, 0xc0, 0x57, 0x20, 0x24, 0x7c, 0xa8, 0xf7, 0x2e, 0x28, 0xfd, 0x60, 0x92, 0x9e, 0x93, + 0xdc, 0xf0, 0xd8, 0x66, 0xc4, 0xda, 0x1e, 0xfc, 0x29, 0xcc, 0xe1, 0xe8, 0x73, 0xb0, 0xb8, 0x7b, 0x78, 0x1e, 0x4e, 0x9f, 0x26, 0x77, 0xd3, 0x60, 0xf8, 0x6c, 0x50, 0xdc, 0x40, 0xb7, 0x2e, 0x6c, + 0xc2, 0x5c, 0xfa, 0x16, 0x45, 0xb3, 0xbe, 0xed, 0xc4, 0xa7, 0x01, 0x97, 0x03, 0xcd, 0xbe, 0x31, 0xe2, 0x83, 0x03, 0x9c, 0x83, 0x6e, 0xe5, 0x1e, 0x00, 0x3e, 0x9e, 0xf0, 0xf0, 0x11, 0xba, 0x87, + 0xbb, 0x2f, 0xbb, 0xed, 0xbb, 0x4c, 0xb4, 0xdd, 0xeb, 0xce, 0x31, 0x5b, 0x33, 0x66, 0x3a, 0x57, 0xb6, 0xb0, 0x93, 0xef, 0xb2, 0x68, 0x1b, 0xbf, 0x0f, 0x65, 0xc2, 0xa3, 0x04, 0x32, 0xab, 0x4a, + 0x91, 0x14, 0xae, 0xa9, 0x1b, 0x9c, 0x81, 0x3b, 0xb2, 0x05, 0x2d, 0x6b, 0xfb, 0x46, 0x3c, 0xb8, 0x50, 0x1a, 0x59, 0x5c, 0xb7, 0x7e, 0xec, 0x12, 0x24, 0x05, 0xbe, 0x9f, 0xd8, 0xfb, 0xe0, 0x71, + 0x34, 0x79, 0xae, 0xe3, 0x9a, 0x85, 0xd3, 0xd9, 0x28, 0x34, 0x1d, 0xf6, 0x3c, 0x0b, 0x1e, 0x7e, 0x83, 0x9b, 0x1d, 0x43, 0x66, 0x74, 0xfd, 0x6c, 0x23, 0x06, 0x35, 0x7b, 0xe7, 0xa2, 0x3a, 0x47, + 0x46, 0x99, 0x20, 0xe1, 0x99, 0x6a, 0x29, 0x79, 0x9a, 0xc2, 0x12, 0x41, 0xb1, 0x8d, 0xd5, 0x93, 0x1f, 0xc5, 0xff, 0xef, 0x20, 0xfc, 0xab, 0xc0, 0xdb, 0xd3, 0x37, 0x61, 0x19, 0xd6, 0xbc, 0xee, + 0xd8, 0xaf, 0x12, 0xa5, 0x12, 0x59, 0xa4, 0xb1, 0x41, 0x5b, 0xa8, 0x4a, 0xfc, 0x8c, 0x50, 0x10, 0x8f, 0xf1, 0x20, 0x0b, 0xbb, 0xfe, 0x28, 0x28, 0xdd, 0xa9, 0x4c, 0xed, 0xf4, 0xdd, 0xe1, 0xb9, + 0x84, 0x7c, 0x79, 0x9e, 0x04, 0xf7, 0xa3, 0x5d, 0x98, 0xae, 0xf8, 0x9d, 0xb5, 0x05, 0xa5, 0x75, 0x04, 0x4e, 0x14, 0x9c, 0xa5, 0x8d, 0xe4, 0x31, 0x64, 0x8c, 0x0b, 0xcf, 0x59, 0x63, 0xb4, 0x56, + 0xbf, 0x7f, 0xed, 0xc1, 0xf7, 0x1d, 0x3b, 0xf3, 0xad, 0xd2, 0x98, 0xf9, 0xb2, 0xd0, 0x7e, 0x4e, 0x5c, 0xe8, 0x54, 0x78, 0xdd, 0x4b, 0x68, 0x48, 0x88, 0xd2, 0x8c, 0x34, 0xc6, 0xf6, 0xfa, 0x72, + 0xe3, 0xb3, 0xb9, 0xae, 0x96, 0x4c, 0xe1, 0x90, 0x13, 0x46, 0x5a, 0xd2, 0x16, 0x6e, 0x40, 0x60, 0x69, 0x17, 0x3c, 0xeb, 0xe3, 0xea, 0x6b, 0x63, 0x7f, 0xbb, 0x8f, 0x85, 0x32, 0x88, 0x8c, 0x19, + 0x88, 0x6b, 0x3b, 0xbf, 0x80, 0x69, 0xb2, 0x03, 0xd3, 0xfe, 0x1a, 0x75, 0xb0, 0x54, 0x32, 0x2d, 0x34, 0x9a, 0x32, 0xf2, 0x7a, 0x3d, 0x17, 0xab, 0xcd, 0xd8, 0x00, 0xc6, 0xab, 0xb7, 0x7b, 0x0c, + 0x5f, 0xb8, 0xd2, 0xaa, 0x0f, 0x64, 0x3a, 0x85, 0x6b, 0x23, 0xe0, 0x10, 0x25, 0x18, 0x7d, 0x33, 0xe2, 0xc4, 0x77, 0x1d, 0xa7, 0xcc, 0x3d, 0x5a, 0x28, 0x2d, 0xb3, 0xa6, 0xf1, 0x3d, 0xc3, 0x90, + 0x33, 0x62, 0x19, 0xea, 0x5d, 0xf2, 0x6a, 0x22, 0xb2, 0x86, 0xf4, 0x3a, 0x81, 0xde, 0xda, 0x85, 0x06, 0x27, 0x07, 0x11, 0xf5, 0xdf, 0xee, 0xb9, 0x26, 0x71, 0x55, 0xd6, 0x4c, 0x01, 0xdd, 0xb4, + 0x2a, 0xe0, 0x7e, 0x2b, 0x5f, 0x79, 0xe7, 0x80, 0xf8, 0x15, 0x03, 0x5e, 0xaf, 0x99, 0xf7, 0x1a, 0xfe, 0x58, 0xe4, 0x85, 0x9e, 0x6b, 0x42, 0x96, 0x9d, 0x8d, 0xa4, 0xb9, 0xe7, 0x06, 0x44, 0x91, + 0xa6, 0xd7, 0x07, 0x76, 0x34, 0x6d, 0x8f, 0x2c, 0x9b, 0xf1, 0x4e, 0x6b, 0x8e, 0xa2, 0xc6, 0xec, 0xd9, 0x40, 0x7a, 0xd7, 0x27, 0x4e, 0xf6, 0x37, 0x62, 0x9b, 0x3f, 0x33, 0x5d, 0xb9, 0xd8, 0x4f, + 0x78, 0x2d, 0x56, 0xda, 0x8f, 0xfa, 0xa6, 0x03, 0xce, 0x82, 0x69, 0x00, 0x6e, 0xb1, 0x58, 0xa5, 0xec, 0x8c, 0xdd, 0x35, 0xea, 0xda, 0x92, 0x77, 0xb6, 0xbf, 0xfb, 0xc6, 0xc6, 0x91, 0xe5, 0x57, + 0x88, 0x98, 0x8e, 0x12, 0xf0, 0xc6, 0xd3, 0x91, 0x7d, 0x2d, 0x9a, 0x97, 0x26, 0x1e, 0xa7, 0x15, 0xce, 0xb6, 0xdc, 0x28, 0x0c, 0xa7, 0x21, 0x98, 0xb0, 0x4c, 0x59, 0x7d, 0x30, 0xbd, 0xf6, 0xb6, + 0xfc, 0x7f, 0x84, 0xee, 0x87, 0xee, 0x09, 0x08, 0x2b, 0x50, 0x69, 0x5b, 0xce, 0xdb, 0x2b, 0x01, 0xde, 0xae, 0xcf, 0x66, 0x41, 0xfc, 0x54, 0xd5, 0x57, 0x5b, 0x48, 0xf5, 0x78, 0x87, 0x19, 0x3f, + 0x4a, 0xa5, 0xc2, 0xb6, 0x4c, 0x9b, 0xf1, 0x7a, 0x32, 0xfb, 0x7e, 0x5e, 0xc1, 0x69, 0xce, 0x5a, 0x48, 0x42, 0xf0, 0x7d, 0xff, 0xd4, 0x56, 0xa7, 0xfd, 0xaf, 0xd7, 0x77, 0x4a, 0xae, 0xc9, 0x8c, + 0x79, 0x3b, 0x55, 0x52, 0x58, 0xd5, 0xc0, 0xa1, 0xe0, 0xc8, 0x42, 0xe7, 0x85, 0x7e, 0x53, 0x62, 0x4e, 0x45, 0xf3, 0x58, 0x74, 0xea, 0x8b, 0xb2, 0x77, 0x20, 0x21, 0x3f, 0xed, 0x6d, 0xdb, 0x2a, + 0x65, 0x84, 0xc2, 0xfe, 0xe5, 0xf5, 0xce, 0xaa, 0xc8, 0x9f, 0x1c, 0xcb, 0xbe, 0xc5, 0x9c, 0x5a, 0x8e, 0x9d, 0x61, 0xe2, 0x6c, 0xda, 0x77, 0xe5, 0x1b, 0x11, 0x32, 0xf3, 0x9d, 0xe1, 0x78, 0xd8, + 0x5f, 0x1e, 0x55, 0x41, 0xbf, 0x01, 0xe5, 0x84, 0x94, 0xf6, 0xfa, 0xfe, 0xa1, 0x94, 0x69, 0x59, 0x25, 0xec, 0xd0, 0xfd, 0xc9, 0xc5, 0x55, 0x1b, 0x3c, 0x6d, 0x94, 0xfa, 0xb9, 0x60, 0x8e, 0x7e, + 0x26, 0x99, 0x2d, 0xc2, 0x3b, 0xaf, 0xa0, 0xb4, 0xdf, 0xb0, 0x78, 0x04, 0xb4, 0x0d, 0xd4, 0x50, 0x0a, 0x3c, 0x0e, 0xc8, 0xed, 0xc3, 0x17, 0xae, 0xbd, 0xab, 0xc6, 0xda, 0xae, 0xea, 0x1f, 0x12, + 0x92, 0xa5, 0xfd, 0xac, 0x3b, 0xa9, 0xf9, 0x33, 0x3a, 0x42, 0x24, 0x69, 0x87, 0x98, 0x8b, 0xf5, 0xb1, 0x4b, 0xac, 0x76, 0xcf, 0x35, 0x8b, 0xbe, 0x3d, 0x10, 0x8b, 0x4e, 0x7a, 0xb1, 0x89, 0xe9, + 0x6f, 0x4d, 0x4c, 0x9d, 0xea, 0x5f, 0xfb, 0xdf, 0xd1, 0xbb, 0xc8, 0xbe, 0x66, 0xda, 0x68, 0xda, 0x5f, 0x93, 0xd5, 0xaf, 0x7e, 0xd5, 0x27, 0x31, 0x2a, 0xcd, 0x85, 0xfd, 0x46, 0xeb, 0x81, 0x36, + 0x31, 0x2a, 0xd8, 0xb7, 0xf7, 0xf7, 0x46, 0xdd, 0x83, 0xe7, 0xf0, 0xac, 0x51, 0xa3, 0xd8, 0x78, 0xdd, 0xfb, 0xc7, 0xc9, 0xd3, 0xf3, 0x62, 0x3e, 0x0a, 0x8d, 0x2a, 0x77, 0x7b, 0xb5, 0x2c, 0xc1, + 0xcf, 0x3f, 0x43, 0xdb, 0xce, 0x59, 0x30, 0x9f, 0x3f, 0x4d, 0xc3, 0xe1, 0x7e, 0xe7, 0x09, 0x8f, 0x0e, 0xa2, 0x42, 0x12, 0xe6, 0x65, 0x79, 0xd3, 0x6a, 0x67, 0xef, 0xf1, 0x90, 0xad, 0x28, 0x61, + 0xf4, 0xfb, 0x57, 0xc8, 0x99, 0x52, 0xa5, 0xa4, 0xf8, 0xcc, 0xe9, 0x3d, 0x0a, 0x5f, 0xcb, 0xdb, 0x84, 0x51, 0x40, 0xc4, 0xb6, 0xc7, 0xcc, 0x07, 0x85, 0x4e, 0x50, 0x68, 0x1e, 0x31, 0x2d, 0xc9, + 0x57, 0xa8, 0xdd, 0x67, 0x9d, 0x67, 0x94, 0xe4, 0x60, 0xd1, 0x6b, 0x6b, 0xd9, 0x7f, 0x4d, 0xdd, 0x5b, 0xf7, 0x64, 0x25, 0x27, 0xa9, 0x31, 0x32, 0x9f, 0xf1, 0x33, 0x87, 0xb3, 0x61, 0xcd, 0x30, + 0x6e, 0xdb, 0xb1, 0x6d, 0xa5, 0xd5, 0x91, 0x19, 0x84, 0xba, 0x20, 0x51, 0x5d, 0xe0, 0xed, 0x27, 0x6b, 0x42, 0xfb, 0x3b, 0x72, 0x5a, 0x44, 0xff, 0x48, 0x92, 0x4f, 0xca, 0xcd, 0x0c, 0xf3, 0xa2, + 0x2e, 0x71, 0xa9, 0xb8, 0xae, 0x55, 0xd5, 0x35, 0x60, 0x95, 0xb9, 0xc6, 0x99, 0x10, 0x59, 0x6c, 0x9a, 0xe5, 0xd7, 0xad, 0xc6, 0xdb, 0xea, 0x6b, 0x1d, 0x68, 0x19, 0xed, 0x37, 0xd0, 0x32, 0x82, + 0x1b, 0xb8, 0xad, 0x3f, 0xe4, 0x05, 0x96, 0xee, 0xb7, 0xe7, 0x1c, 0xf8, 0x32, 0x47, 0xe1, 0xde, 0x3a, 0xbd, 0xa3, 0x77, 0xf5, 0xd4, 0x76, 0xbb, 0xbb, 0x0d, 0x57, 0x52, 0x35, 0x24, 0xbe, 0xb9, + 0xe4, 0x35, 0x8b, 0x7b, 0x6f, 0x61, 0x25, 0xed, 0xeb, 0xa2, 0xf6, 0xd7, 0xf3, 0x35, 0x31, 0xa1, 0x56, 0x48, 0xa6, 0x55, 0x3c, 0x5a, 0x46, 0x7d, 0xb8, 0xea, 0xc3, 0x9d, 0x14, 0x6b, 0xff, 0x3e, + 0xf8, 0xef, 0xf3, 0x63, 0x70, 0xb7, 0x18, 0x1d, 0x1d, 0x3f, 0xb9, 0x3a, 0x69, 0x19, 0x1d, 0x4e, 0xbe, 0x76, 0x3a, 0xaf, 0x9d, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, + 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4b, 0x0a, 0xc2, 0x40, 0x0c, 0xc6, 0xf1, 0x7d, 0xef, 0x92, 0x2f, 0x3e, 0x50, 0x50, 0xf0, 0x18, 0x1e, 0x20, 0xd5, 0xc1, 0xc6, 0xc7, 0x4c, 0x48, 0xa3, 0x82, 0xa7, 0x17, 0x67, 0xba, 0xe9, 0xce, 0x5d, 0xfe, 0x3f, 0x08, 0xdf, 0x59, 0xc7, 0x70, 0xed, 0x9f, 0xa1, 0x25, 0x1f, 0xfd, 0x7e, 0x18, 0x22, 0x6c, 0xdc, 0x33, 0x7b, 0xb2, 0x82, 0x87, 0xbc, 0x52, 0x86, 0x98, 0x9c, 0x86, 0x84, 0xe2, 0x17, 0xae, 0xb0, 0xe2, 0xdf, 0xd9, 0xb4, 0xc9, 0x14, 0xd4, 0x62, 0x8d, 0x1d, 0x96, 0x33, 0xa2, 0x4a, 0xd4, 0x6b, 0xc6, 0x47, 0xad, 0x7b, 0xbb, 0x98, 0x25, 0xff, 0x7b, 0x4e, 0x0b, 0x87, 0xdc, 0xc4, 0xb5, 0x01, 0x4d, 0xff, 0xbc, 0xc0, 0x06, 0xdb, 0xb9, 0x51, 0x35, 0x5c, 0xc5, 0xbb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x62, 0xfd, 0x25, 0x59, 0x77, 0x00, 0x00, - 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, - 0x2e, 0x6d, 0x64, 0xd4, 0x58, 0xeb, 0x6f, 0xdc, 0xb8, 0x11, 0xff, 0xce, 0xbf, 0x62, 0xba, 0x36, 0x70, 0x17, 0xc3, 0xd2, 0x26, 0x0d, 0x0e, 0x05, 0x16, 0x4d, 0x00, 0xbf, 0x92, 0xdb, 0xd4, 0xeb, - 0x33, 0x36, 0xeb, 0x1c, 0x0e, 0x77, 0x85, 0x45, 0x51, 0xa3, 0x15, 0xbd, 0x14, 0xa9, 0x92, 0x94, 0x36, 0x0b, 0x14, 0xfd, 0xdb, 0x8b, 0x21, 0xa5, 0x7d, 0xf8, 0x71, 0xcd, 0xf5, 0x53, 0xeb, 0x4f, - 0xb2, 0x38, 0x33, 0x9c, 0xf9, 0xcd, 0x6f, 0x1e, 0xda, 0x23, 0xf8, 0xd0, 0x6a, 0xe1, 0xa5, 0xd1, 0xd0, 0x58, 0xf3, 0x80, 0xc2, 0x33, 0xf6, 0x33, 0x2a, 0x61, 0x6a, 0x04, 0x6f, 0x60, 0x63, 0x5a, - 0x0b, 0x1a, 0xd7, 0x4f, 0xa4, 0xfe, 0xc4, 0xd8, 0xa2, 0x92, 0x0e, 0x1c, 0xaf, 0x1b, 0x85, 0xc3, 0x5b, 0x10, 0x46, 0x7b, 0x2e, 0xb5, 0x03, 0x0e, 0x4e, 0xea, 0xa5, 0x42, 0x28, 0x07, 0xc5, 0x9c, - 0x3b, 0x2c, 0xc0, 0x68, 0xf8, 0xdc, 0x58, 0xa9, 0x97, 0x70, 0xa1, 0x4c, 0x5b, 0x6c, 0xed, 0x4e, 0x20, 0x43, 0x51, 0x99, 0xf4, 0x4a, 0x54, 0x66, 0x78, 0x97, 0x9d, 0xc2, 0xba, 0x92, 0xa2, 0x02, - 0x8b, 0xbe, 0xb5, 0x64, 0x54, 0x03, 0x09, 0x81, 0x29, 0xc1, 0x57, 0x08, 0x05, 0xf7, 0x1c, 0x1a, 0xee, 0xc8, 0x6e, 0x27, 0x79, 0xb4, 0x78, 0xd5, 0xa1, 0xf6, 0x2e, 0x65, 0xec, 0xe8, 0x08, 0xae, - 0x8d, 0xe0, 0x0a, 0xf0, 0x2b, 0x8a, 0x96, 0xec, 0x31, 0x36, 0xe3, 0x2b, 0x04, 0xd7, 0x5a, 0x04, 0x5f, 0x71, 0x0f, 0xd9, 0x27, 0xde, 0x71, 0x78, 0xf3, 0x17, 0xf8, 0x7c, 0xf9, 0xb7, 0x0c, 0xa4, - 0x03, 0xa9, 0x9d, 0xe7, 0x4a, 0x61, 0x41, 0xde, 0x0b, 0x1c, 0x5c, 0x3d, 0x37, 0xc6, 0xc3, 0xdb, 0xf4, 0x35, 0x58, 0xfc, 0x47, 0x2b, 0x2d, 0x3a, 0xe8, 0x15, 0x53, 0xc6, 0x16, 0x06, 0x9c, 0xe7, - 0xd6, 0x83, 0x43, 0xdb, 0xa1, 0x05, 0x45, 0x77, 0xaa, 0x0d, 0xd8, 0x56, 0x43, 0x96, 0x8e, 0xeb, 0x4e, 0xaf, 0xc1, 0x05, 0x33, 0x49, 0x6e, 0x8c, 0x9f, 0xd8, 0x56, 0x67, 0x29, 0x5b, 0x54, 0x08, - 0xc2, 0xd4, 0x35, 0xd7, 0x45, 0x54, 0x77, 0x50, 0x79, 0xdf, 0x0c, 0x46, 0xe8, 0x35, 0x6f, 0xbd, 0xa9, 0xb9, 0x97, 0xd1, 0xdc, 0x9a, 0x7b, 0x51, 0xa1, 0x83, 0xd2, 0x58, 0x10, 0x15, 0xd7, 0x4b, - 0x74, 0x04, 0x83, 0x33, 0xad, 0x15, 0x64, 0xaa, 0xc0, 0x94, 0x4d, 0x0f, 0xfe, 0xdf, 0x8a, 0x11, 0x54, 0xf1, 0x19, 0xd6, 0x52, 0x29, 0xc8, 0x43, 0xba, 0x1a, 0xbe, 0xe4, 0x1e, 0x0b, 0x4a, 0xb2, - 0x6d, 0xb5, 0xa6, 0x30, 0xe3, 0xe5, 0x29, 0x4c, 0x3d, 0x70, 0xe5, 0x0c, 0x98, 0x06, 0xb5, 0x83, 0x02, 0xf3, 0x76, 0xb9, 0xa4, 0xf3, 0xc6, 0x58, 0x0f, 0xd9, 0x0f, 0xaf, 0x5f, 0xff, 0x90, 0x31, - 0x67, 0x80, 0xf7, 0x47, 0x68, 0x41, 0x70, 0x4d, 0x66, 0xb9, 0xf7, 0x5c, 0x54, 0x58, 0x80, 0x2c, 0x41, 0x23, 0x16, 0x58, 0x44, 0x80, 0x08, 0x0b, 0x8f, 0xce, 0xbb, 0x67, 0xd1, 0xa1, 0x93, 0x2c, - 0x26, 0x8c, 0x60, 0xc9, 0x88, 0x31, 0x19, 0x5c, 0x5c, 0x4f, 0x19, 0x9b, 0xfa, 0xef, 0x1c, 0x58, 0x24, 0xa4, 0x50, 0x17, 0xd1, 0x5b, 0x87, 0x1e, 0xb2, 0x0f, 0x77, 0x37, 0x17, 0xf7, 0xf3, 0xab, - 0x8f, 0xd3, 0xcf, 0x8b, 0xf9, 0x2f, 0x19, 0xa0, 0xee, 0xa4, 0x35, 0xba, 0x46, 0xed, 0xa1, 0xe3, 0x56, 0xf2, 0x5c, 0x61, 0xca, 0x58, 0x96, 0x65, 0xae, 0x42, 0xa5, 0xc0, 0x09, 0x2b, 0x1b, 0xcf, - 0x8e, 0xc0, 0x62, 0xa3, 0xb8, 0x40, 0xf8, 0xd7, 0x38, 0xcd, 0xb9, 0xab, 0xac, 0x80, 0x7c, 0x13, 0x49, 0x1e, 0x05, 0xad, 0x80, 0x52, 0x2a, 0xdc, 0x93, 0x2c, 0x8c, 0x58, 0xa1, 0x4d, 0xa5, 0x19, - 0x3f, 0x98, 0x4a, 0x17, 0x86, 0x40, 0xf4, 0x55, 0xd4, 0xb1, 0xb8, 0x94, 0xce, 0xdb, 0x0d, 0xc3, 0xaf, 0x01, 0x9b, 0x03, 0xaf, 0xde, 0x3d, 0xd1, 0x64, 0x81, 0xbc, 0xa3, 0x6f, 0x13, 0x1e, 0xc1, - 0xfb, 0xf7, 0x3b, 0x37, 0x29, 0x14, 0x42, 0xe8, 0x08, 0xce, 0x5b, 0xa9, 0x0a, 0xa9, 0x97, 0x7d, 0xfd, 0x0d, 0x24, 0xca, 0xe9, 0x75, 0xa8, 0x90, 0x9f, 0x2e, 0xa6, 0x20, 0x6b, 0xbe, 0xc4, 0xc0, - 0x15, 0x4a, 0xfe, 0x50, 0x82, 0x29, 0x9c, 0x6f, 0xa0, 0xc0, 0x92, 0xb7, 0xca, 0x9f, 0x82, 0x27, 0xf5, 0x48, 0x08, 0xd2, 0x05, 0x0e, 0x9f, 0xbe, 0xcc, 0xa2, 0xe6, 0x33, 0xd0, 0x91, 0x8d, 0x5e, - 0x30, 0xe9, 0xe0, 0xc9, 0xdf, 0x51, 0x7f, 0x16, 0xd4, 0xa3, 0xb3, 0x27, 0x27, 0x37, 0xc6, 0xe3, 0xc9, 0xc9, 0x04, 0xa6, 0x25, 0xc1, 0x05, 0x6b, 0xae, 0x3d, 0x25, 0x10, 0x35, 0xa5, 0x27, 0x78, - 0xa6, 0xb9, 0x97, 0x1d, 0x46, 0xdd, 0xd3, 0x20, 0x44, 0xb4, 0x09, 0x42, 0x85, 0xf4, 0x41, 0x24, 0xd0, 0x21, 0xdd, 0xf0, 0x5a, 0x65, 0x21, 0x35, 0x54, 0x1b, 0x8c, 0x38, 0x10, 0x0e, 0xcf, 0x6f, - 0xef, 0x6f, 0xce, 0x16, 0xd3, 0x2f, 0x57, 0xf7, 0xd3, 0xd9, 0xd9, 0xc7, 0xab, 0x2c, 0xc2, 0x83, 0xf6, 0x4a, 0x77, 0x5b, 0x22, 0x90, 0x39, 0x6f, 0x5b, 0x9c, 0x84, 0xa8, 0xc8, 0x12, 0x0b, 0x17, - 0x5e, 0xe9, 0xce, 0x4d, 0x18, 0x40, 0x02, 0x9a, 0xd7, 0x38, 0x81, 0x47, 0xb6, 0x18, 0xc5, 0xd5, 0x71, 0xd5, 0xe2, 0x04, 0x46, 0xa4, 0x3f, 0x7a, 0x21, 0xae, 0x8a, 0x77, 0x08, 0xd2, 0xb9, 0x16, - 0x5d, 0xe4, 0x06, 0x79, 0xf6, 0x6b, 0xdf, 0x3a, 0xce, 0x7e, 0x5a, 0xfc, 0xfd, 0x7b, 0x2a, 0x6d, 0x37, 0x19, 0x8f, 0x0b, 0x23, 0x5c, 0x1a, 0x9b, 0x01, 0x65, 0xba, 0x6f, 0x0b, 0xa5, 0xe5, 0x35, - 0xae, 0x8d, 0x5d, 0x85, 0xf3, 0xb1, 0x68, 0xad, 0x45, 0xed, 0xc7, 0x16, 0x4b, 0xb4, 0xa8, 0x05, 0x8e, 0x2b, 0x5f, 0xab, 0xb1, 0x30, 0x16, 0x53, 0x7a, 0x3a, 0x0a, 0x4f, 0xdc, 0xf8, 0x57, 0x54, - 0xc6, 0x02, 0x1d, 0x35, 0x5a, 0x90, 0x3a, 0x52, 0x72, 0x0f, 0x4a, 0x2a, 0x4a, 0xea, 0x9b, 0x31, 0xd3, 0xa6, 0x2c, 0x89, 0xeb, 0x84, 0x2b, 0xc9, 0xbf, 0x04, 0x2d, 0x58, 0xac, 0x4d, 0x17, 0xb3, - 0x93, 0x25, 0xb7, 0x31, 0x41, 0x19, 0xdd, 0x14, 0x24, 0x4a, 0x6b, 0xea, 0x2d, 0xf2, 0xb3, 0xb3, 0x2f, 0x57, 0x37, 0xf7, 0xe7, 0x77, 0xd3, 0xeb, 0xcb, 0xfb, 0xb3, 0xf9, 0xc7, 0xbb, 0xd9, 0xd5, - 0xcd, 0xe2, 0xf3, 0xb3, 0x29, 0xf8, 0x06, 0xe8, 0x9f, 0x35, 0xb6, 0x9f, 0x83, 0xc1, 0x19, 0x48, 0x2e, 0x6b, 0xde, 0xa1, 0x4e, 0xa9, 0x6f, 0xa4, 0x6e, 0x25, 0x9b, 0x77, 0x94, 0x1d, 0x48, 0x12, - 0x6d, 0x12, 0x6f, 0xb9, 0x76, 0x25, 0xda, 0xa4, 0xb1, 0x66, 0x69, 0xd1, 0x39, 0x68, 0xb8, 0x58, 0x6d, 0x39, 0xf9, 0x1e, 0xe6, 0x14, 0xde, 0x16, 0x80, 0xa7, 0x01, 0xd6, 0xc8, 0xb5, 0x8b, 0xd3, - 0x21, 0xd0, 0xd1, 0x80, 0x32, 0x9a, 0x5a, 0xdc, 0xd0, 0x3a, 0x07, 0x46, 0xf5, 0x45, 0x43, 0x93, 0xae, 0xf7, 0x6b, 0x28, 0x1d, 0xaa, 0xd2, 0x79, 0x6c, 0xa9, 0x8f, 0x8a, 0xd4, 0xb6, 0xda, 0x6d, - 0x2b, 0x72, 0xdb, 0x0b, 0xa5, 0x06, 0x3e, 0x0c, 0x4e, 0xb4, 0xac, 0x75, 0x83, 0x7b, 0xb1, 0x8a, 0x85, 0xc5, 0xd0, 0xa8, 0x79, 0x6e, 0xba, 0x17, 0x2b, 0xd3, 0xb6, 0x7a, 0xd7, 0x22, 0x2e, 0xb1, - 0x51, 0x66, 0xf3, 0xf4, 0xfa, 0xfd, 0x62, 0xd7, 0x05, 0x14, 0x41, 0xec, 0xa0, 0x43, 0x80, 0xd4, 0xde, 0x80, 0x50, 0xad, 0xf3, 0x68, 0x5f, 0xba, 0xab, 0xd7, 0x4b, 0x3a, 0x38, 0x8a, 0x73, 0xc2, - 0x5b, 0x49, 0x53, 0xc0, 0x45, 0xdb, 0x3b, 0x3f, 0x3e, 0x18, 0x0b, 0x67, 0xf3, 0xd9, 0x40, 0x53, 0x63, 0xfb, 0x1d, 0xc0, 0x6d, 0x9c, 0xc7, 0xda, 0x31, 0x36, 0xf4, 0xb2, 0x83, 0x39, 0xcb, 0x9b, - 0xa6, 0xaf, 0xa3, 0x5b, 0xbe, 0x42, 0x6f, 0x22, 0x9f, 0x28, 0x8d, 0x8e, 0xb6, 0x07, 0xae, 0x7f, 0xc7, 0xe6, 0x29, 0x28, 0xb9, 0xc2, 0x20, 0xd3, 0xd0, 0x5a, 0x32, 0xe3, 0x22, 0x37, 0x66, 0x15, - 0xcd, 0x71, 0x0d, 0xb3, 0x37, 0x60, 0x2c, 0xcc, 0xfe, 0x0c, 0xa2, 0x92, 0xcd, 0x29, 0x14, 0x06, 0x9d, 0xfe, 0xce, 0x03, 0x15, 0x1f, 0xac, 0x29, 0x4e, 0x1e, 0xfb, 0x4a, 0x6d, 0x68, 0x94, 0xa4, - 0x34, 0xbb, 0xc2, 0x19, 0xb7, 0xa6, 0xd5, 0x45, 0x2c, 0xa4, 0xa1, 0xb4, 0x22, 0x90, 0xbb, 0x3c, 0x99, 0xbe, 0x02, 0x43, 0x5a, 0x7b, 0x7f, 0x20, 0x26, 0xf3, 0xd7, 0x4f, 0x32, 0xdf, 0x75, 0x81, - 0xa5, 0xf4, 0x55, 0x9b, 0xa7, 0xc2, 0xd4, 0xe3, 0x8f, 0xc6, 0x2c, 0x15, 0x5e, 0x0c, 0xb9, 0x5f, 0x18, 0xa3, 0xdc, 0xf8, 0x41, 0xe6, 0xaf, 0xc2, 0x86, 0xa0, 0x63, 0x1d, 0xaf, 0x4d, 0xab, 0x0e, - 0xb2, 0xf5, 0x49, 0xe6, 0xb0, 0x44, 0x8d, 0x36, 0xf0, 0x62, 0xaf, 0x63, 0xb3, 0x7e, 0xa2, 0x0a, 0x53, 0x37, 0x44, 0x66, 0x61, 0xea, 0x74, 0x19, 0xae, 0x48, 0x05, 0xed, 0x46, 0xa9, 0xa7, 0x0b, - 0x26, 0x0f, 0x32, 0x4f, 0x42, 0x09, 0x25, 0x8d, 0x6a, 0x97, 0x52, 0x4f, 0xde, 0xa6, 0x6f, 0xd3, 0x37, 0x93, 0x38, 0x82, 0xce, 0x63, 0x8f, 0xbf, 0x0c, 0x66, 0xdf, 0x1d, 0x1f, 0x4c, 0xa9, 0x31, - 0x0d, 0xb0, 0x43, 0x12, 0x24, 0x01, 0x86, 0x77, 0x25, 0x57, 0x8e, 0x4a, 0xf0, 0x65, 0xad, 0x9e, 0x15, 0xbb, 0x45, 0x52, 0xea, 0xce, 0x08, 0x1e, 0xf7, 0xb2, 0x67, 0x57, 0x42, 0x07, 0x5c, 0x29, - 0xb3, 0x8e, 0x88, 0xd3, 0x9a, 0x62, 0x5a, 0x8f, 0xfb, 0x4b, 0x5e, 0xd8, 0x06, 0x1a, 0x14, 0xb2, 0x94, 0x62, 0x4b, 0x61, 0x07, 0xbb, 0x02, 0xca, 0x2e, 0x30, 0x59, 0x6c, 0x1a, 0xcc, 0x68, 0x33, - 0xb1, 0x32, 0x6f, 0x3d, 0xa6, 0xec, 0x43, 0x98, 0x8a, 0xd2, 0x01, 0x7e, 0x0d, 0xbb, 0xeb, 0x69, 0x10, 0xdd, 0x99, 0xa5, 0x3d, 0x30, 0x5c, 0x15, 0xe6, 0x50, 0x30, 0x43, 0x01, 0x64, 0x7b, 0x63, - 0xf4, 0x97, 0x9e, 0x02, 0x05, 0x96, 0x52, 0x23, 0xd4, 0xad, 0xf2, 0xb2, 0xd9, 0xdb, 0x75, 0xc3, 0x22, 0x29, 0x0b, 0x8c, 0xf7, 0x0c, 0x7b, 0x35, 0x0f, 0x0c, 0x42, 0x0d, 0xad, 0xc3, 0x97, 0xdc, - 0xdb, 0xc5, 0x59, 0xc8, 0x32, 0xf4, 0x7f, 0xff, 0x38, 0xe2, 0xdd, 0xc1, 0x16, 0xa8, 0x94, 0x5d, 0x54, 0x28, 0x56, 0xd1, 0xa8, 0xb3, 0x62, 0x5c, 0x73, 0xa9, 0xc7, 0x16, 0xe3, 0x36, 0xe8, 0xc6, - 0xbc, 0x69, 0x94, 0x8c, 0x58, 0xa7, 0xb4, 0xfa, 0xa1, 0xf5, 0x12, 0x5d, 0xdf, 0xf4, 0x87, 0x2d, 0x21, 0x1b, 0xbc, 0x9f, 0xd3, 0xfd, 0x36, 0xa3, 0x96, 0x54, 0xca, 0x65, 0x6b, 0x79, 0x7f, 0xc7, - 0x8d, 0xf1, 0x52, 0xe0, 0xae, 0x37, 0x12, 0x02, 0xa1, 0xfe, 0x29, 0x9e, 0xac, 0xe1, 0xbe, 0x4a, 0x42, 0x2d, 0x66, 0x21, 0x02, 0xca, 0x41, 0xd8, 0x6e, 0x31, 0x86, 0x0d, 0x5c, 0x6f, 0x00, 0x03, - 0xc0, 0x7e, 0xd3, 0x20, 0xcd, 0xa2, 0x98, 0xbb, 0xcd, 0x90, 0xad, 0x6d, 0x13, 0x22, 0x53, 0xa7, 0xac, 0x7c, 0x94, 0xa7, 0x09, 0x8c, 0x8e, 0xef, 0xe6, 0xd7, 0x81, 0x4d, 0xa3, 0x94, 0xf5, 0x79, - 0xc4, 0xe1, 0xd8, 0x41, 0x8e, 0xca, 0xac, 0x4f, 0xa1, 0x51, 0xc8, 0x1d, 0x52, 0xab, 0x8e, 0x8b, 0x7e, 0xdc, 0x18, 0x43, 0x84, 0x77, 0xf3, 0xeb, 0xec, 0x70, 0x2d, 0xa8, 0xb0, 0x87, 0xdb, 0x94, - 0xb1, 0x7a, 0xb7, 0x49, 0x66, 0x8c, 0xb2, 0xbc, 0xec, 0x55, 0xa3, 0x50, 0xbe, 0x81, 0xd2, 0x10, 0x27, 0xc9, 0xe5, 0xbe, 0xab, 0xbe, 0xd4, 0x25, 0xa5, 0x2e, 0x7b, 0xd2, 0xd3, 0xba, 0x10, 0x8c, - 0x84, 0x41, 0x46, 0x37, 0x9d, 0x9c, 0x04, 0x8c, 0xdd, 0xe4, 0xe4, 0x64, 0x37, 0x51, 0x4d, 0xeb, 0x9b, 0xd6, 0x9f, 0xc6, 0xfd, 0xf6, 0x38, 0xb8, 0xea, 0x0d, 0x48, 0xef, 0xa2, 0x5e, 0xca, 0xd8, - 0xfd, 0xfd, 0x62, 0x7a, 0x7b, 0x7f, 0x3f, 0x61, 0xac, 0xdf, 0x3c, 0x02, 0xf0, 0x2b, 0x9d, 0x45, 0x5a, 0x0d, 0x39, 0x19, 0xc2, 0x6d, 0xad, 0x82, 0x7c, 0x33, 0x79, 0x6e, 0x0d, 0x5e, 0xe9, 0xb0, - 0xec, 0x53, 0x3a, 0x0b, 0xa4, 0xb7, 0x39, 0xc2, 0x5f, 0xb7, 0xf8, 0xd3, 0x4c, 0x7e, 0x1f, 0x93, 0x57, 0x99, 0x75, 0x1f, 0x7b, 0x6b, 0xd5, 0xb0, 0xe6, 0xde, 0xcd, 0xaf, 0xdf, 0x1d, 0x7f, 0xff, - 0x9c, 0x8d, 0xe3, 0xef, 0x89, 0x01, 0xa4, 0x0f, 0xc7, 0xb7, 0x3f, 0x5f, 0xbe, 0x82, 0xc4, 0xb4, 0x56, 0xbd, 0xda, 0x8d, 0x04, 0xba, 0x83, 0xb1, 0xbb, 0x50, 0xa1, 0x59, 0x8f, 0x53, 0x67, 0x56, - 0x98, 0xed, 0x0d, 0x29, 0x5f, 0x1d, 0x50, 0x7e, 0x57, 0x25, 0x3d, 0xad, 0x9e, 0x89, 0x68, 0xcf, 0x12, 0x24, 0x49, 0xe0, 0xd7, 0x28, 0xf0, 0x24, 0xde, 0x1c, 0xef, 0xbb, 0x25, 0x86, 0x9e, 0x87, - 0x69, 0xf1, 0xcd, 0x96, 0xb8, 0x25, 0x06, 0xec, 0x11, 0x6f, 0x17, 0x8a, 0xb8, 0x9b, 0x5f, 0x0f, 0xa6, 0xff, 0xa8, 0xbf, 0x82, 0x72, 0x93, 0x74, 0xbd, 0xe1, 0x11, 0xfc, 0x46, 0xbb, 0xd0, 0x8f, - 0x30, 0xa2, 0x49, 0x80, 0xda, 0x07, 0xfd, 0xc9, 0x5e, 0xd5, 0x8e, 0x1f, 0x9c, 0xd1, 0x7b, 0x62, 0x98, 0x4c, 0x8b, 0xc9, 0x9b, 0x83, 0x17, 0x9f, 0xdb, 0x9c, 0xba, 0xcc, 0x84, 0x3e, 0xa0, 0x0f, - 0x0f, 0x42, 0x13, 0x98, 0x84, 0x01, 0x90, 0x84, 0x02, 0x4c, 0xfa, 0x92, 0x39, 0x10, 0x0b, 0x57, 0xe2, 0x13, 0xe5, 0x06, 0x45, 0x87, 0xd6, 0xd1, 0x17, 0xfa, 0x9b, 0xf4, 0x75, 0x7f, 0xb6, 0x86, - 0xd1, 0x6f, 0x83, 0x3b, 0x05, 0x8c, 0x28, 0xb2, 0xff, 0x02, 0xea, 0x43, 0x10, 0x1e, 0x5d, 0xfd, 0x7f, 0x0f, 0x04, 0x51, 0xe4, 0xc7, 0xc5, 0xe2, 0x56, 0xe2, 0x37, 0x92, 0xe4, 0x31, 0x3c, 0xe1, - 0x63, 0x31, 0x58, 0x84, 0x7f, 0xc6, 0x1f, 0x07, 0x1e, 0x11, 0xe6, 0x77, 0x31, 0x8a, 0x12, 0x11, 0x9e, 0xe1, 0x79, 0x1f, 0x99, 0xed, 0xbb, 0x17, 0x41, 0x19, 0x24, 0x82, 0xf9, 0xd9, 0x26, 0xce, - 0xc6, 0x41, 0xeb, 0x10, 0x8d, 0xff, 0x94, 0xfa, 0x3f, 0x10, 0xda, 0x0e, 0xf8, 0xff, 0xb5, 0xf0, 0x8e, 0x8e, 0xe0, 0x42, 0x21, 0xd7, 0x6d, 0x13, 0x7f, 0xd3, 0xd8, 0x7d, 0x27, 0xc5, 0x5d, 0x08, - 0x8b, 0xdd, 0x04, 0x0b, 0x4d, 0x3d, 0xcc, 0x93, 0x7e, 0x97, 0x3e, 0xa5, 0x0d, 0x7d, 0xaf, 0x06, 0x86, 0x25, 0x4a, 0xa1, 0x8f, 0x9f, 0x26, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, - 0x08, 0xd7, 0x9e, 0xd3, 0xdb, 0x9a, 0x07, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x8f, 0x41, 0x6e, 0xeb, 0x30, 0x0c, 0x44, 0xf7, 0x3e, 0xc5, 0x20, 0x5e, 0x64, 0x97, 0x03, 0xfc, - 0x03, 0x7c, 0xa0, 0xfb, 0x5e, 0x80, 0x95, 0xc6, 0xb6, 0x50, 0x85, 0x34, 0x44, 0xca, 0x69, 0x6f, 0x5f, 0xc8, 0x41, 0x83, 0x2e, 0x89, 0x07, 0xbc, 0x37, 0x9c, 0x61, 0x7b, 0x14, 0x53, 0xa9, 0x37, - 0xe0, 0x4d, 0x0f, 0x4b, 0x32, 0x4e, 0x64, 0x2e, 0x45, 0xe9, 0xd8, 0x8a, 0x86, 0x63, 0xb1, 0x86, 0xcd, 0x1e, 0xf8, 0xdf, 0x35, 0x0d, 0xec, 0x48, 0x8d, 0x12, 0xcc, 0xe8, 0x5e, 0x74, 0x45, 0x6c, - 0xc5, 0xa7, 0x19, 0xc1, 0xfb, 0x5e, 0x25, 0x88, 0x24, 0x8a, 0x0f, 0xa2, 0xe8, 0x61, 0x9f, 0xcc, 0x37, 0xe0, 0x7d, 0xa3, 0x13, 0xce, 0x88, 0xa2, 0xab, 0xff, 0xf2, 0xbe, 0xe7, 0x53, 0x62, 0x8a, - 0xd8, 0x88, 0x46, 0xef, 0x35, 0x44, 0x63, 0x9a, 0x5f, 0x25, 0x88, 0x23, 0xf3, 0x60, 0xb5, 0xfd, 0x4e, 0x0d, 0xec, 0xcd, 0xd6, 0x46, 0x77, 0x3a, 0xc2, 0x40, 0xf5, 0xde, 0x88, 0xeb, 0x33, 0x74, - 0x3d, 0xbd, 0x52, 0x1f, 0xf2, 0xed, 0x88, 0x56, 0xd6, 0x95, 0x6d, 0x88, 0xa7, 0x19, 0xfc, 0x62, 0xea, 0xa7, 0xcf, 0x16, 0x08, 0x5a, 0x57, 0x1d, 0xbb, 0x5f, 0x95, 0xa2, 0x1e, 0xa2, 0x89, 0xe7, - 0xa7, 0x41, 0x1f, 0x33, 0x21, 0x9a, 0xff, 0xb6, 0x6f, 0xd3, 0x33, 0xf3, 0x0f, 0x97, 0x54, 0xad, 0x0f, 0xa2, 0x71, 0x99, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xce, 0x36, - 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, - 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, 0x25, 0xd9, 0xb9, 0xba, 0x7b, 0x9e, 0xb3, 0x8f, 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, - 0x70, 0x81, 0x1d, 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, 0xff, 0x7e, 0xd5, 0x33, 0x12, 0x92, 0x00, 0x67, 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, - 0xa3, 0x7e, 0x7f, 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, 0x9f, 0x53, 0x83, 0x73, 0x16, 0x52, 0xae, 0x68, 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, - 0x26, 0x24, 0x9c, 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, 0xf6, 0x9b, 0x83, 0xd7, 0x07, 0x90, 0xf2, 0x88, 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, - 0x12, 0xe6, 0x42, 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, 0x74, 0x4e, 0xb9, 0x56, 0x3e, 0xc0, 0x80, 0x52, 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, - 0xda, 0x30, 0x61, 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, 0x14, 0xf2, 0x1e, 0x26, 0x42, 0x02, 0x89, 0x22, 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, - 0x84, 0x9c, 0x1b, 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, 0x67, 0x1a, 0xc4, 0x92, 0x53, 0xa9, 0x66, 0x2c, 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, - 0xeb, 0x5c, 0x14, 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, 0x84, 0xf7, 0x54, 0x2a, 0x54, 0xf7, 0xa5, 0x7f, 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, - 0xf6, 0xd2, 0x3d, 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, 0x34, 0xd1, 0xc0, 0x38, 0x84, 0x62, 0x9e, 0xc4, 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, - 0xd6, 0x1c, 0x7c, 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, 0x20, 0xda, 0xa9, 0x39, 0x35, 0x00, 0x80, 0x99, 0xd6, 0x89, 0x3a, 0x09, 0x82, 0xe5, - 0x72, 0xe9, 0x13, 0x23, 0xad, 0x2f, 0xe4, 0x34, 0xc8, 0xd5, 0x0b, 0xce, 0x3b, 0xad, 0x76, 0x77, 0xd0, 0xf6, 0x5e, 0xfa, 0x47, 0x06, 0xe5, 0x9a, 0xc7, 0x54, 0x29, 0x90, 0xf4, 0x73, 0xca, 0x24, - 0x8d, 0x60, 0xbc, 0x02, 0x92, 0x24, 0x31, 0x0b, 0xc9, 0x38, 0xa6, 0x10, 0x93, 0x25, 0x3a, 0xce, 0xf8, 0xc7, 0xb8, 0x9d, 0x71, 0x58, 0x4a, 0xa6, 0x19, 0x9f, 0x1e, 0x3a, 0x35, 0x50, 0xb9, 0xe7, - 0xcb, 0xde, 0x29, 0xac, 0x95, 0x4b, 0xc7, 0x54, 0x05, 0x40, 0x70, 0x20, 0xe8, 0x1a, 0xb7, 0x39, 0x80, 0xce, 0xc0, 0x85, 0x57, 0xcd, 0x41, 0x67, 0x70, 0x08, 0x37, 0x9d, 0xab, 0xb7, 0xbd, 0xeb, - 0x2b, 0xb8, 0x69, 0xf6, 0xfb, 0xcd, 0xee, 0x55, 0xa7, 0x3d, 0x80, 0x5e, 0x1f, 0x5a, 0xbd, 0xee, 0x59, 0xe7, 0xaa, 0xd3, 0xeb, 0x0e, 0xa0, 0xf7, 0x1a, 0x9a, 0xdd, 0x3f, 0x9c, 0x1a, 0xfc, 0xde, - 0xe9, 0x9e, 0x1d, 0x02, 0x65, 0x7a, 0x46, 0x25, 0xd0, 0x87, 0x44, 0xa2, 0x06, 0x42, 0x02, 0x43, 0x4b, 0xd2, 0xa8, 0x14, 0x43, 0xb9, 0x04, 0x18, 0x22, 0xd6, 0x3d, 0x2a, 0xa1, 0x21, 0x9b, 0xb0, - 0x10, 0x62, 0xc2, 0xa7, 0x29, 0x99, 0x52, 0x98, 0x8a, 0x05, 0x95, 0x1c, 0x23, 0x24, 0xa1, 0x72, 0xce, 0x14, 0x3a, 0x54, 0x01, 0xe1, 0x11, 0xc4, 0x6c, 0xce, 0xb4, 0x09, 0x24, 0xe5, 0xd4, 0xb6, - 0xf5, 0xf2, 0x7f, 0x76, 0x86, 0xfd, 0x6c, 0x7a, 0x35, 0xb8, 0x20, 0x0b, 0xca, 0x61, 0xa0, 0x89, 0xd4, 0x70, 0x9d, 0xc0, 0x2b, 0xa2, 0xc3, 0x19, 0xa8, 0x50, 0xb2, 0xc4, 0x06, 0x4c, 0x3f, 0x77, - 0x7b, 0xbb, 0xfb, 0x1e, 0x16, 0x44, 0xaa, 0x93, 0x9d, 0x32, 0x98, 0xd0, 0x7a, 0xd7, 0x7c, 0xdf, 0x1c, 0xbe, 0xed, 0x5d, 0xb4, 0xc1, 0x83, 0x58, 0x84, 0x36, 0xcf, 0xc5, 0x04, 0x08, 0xbc, 0x3b, - 0xfb, 0x1d, 0x66, 0x62, 0x8e, 0x61, 0x20, 0x0d, 0xd9, 0x5e, 0x92, 0xe5, 0x62, 0x4e, 0x76, 0x17, 0x55, 0x43, 0xf4, 0xe2, 0xe5, 0x2e, 0x92, 0x73, 0x14, 0xfb, 0xe5, 0x9e, 0x02, 0xc6, 0x95, 0x26, - 0x71, 0x4c, 0xa3, 0x12, 0x7d, 0xc4, 0x6a, 0xbe, 0x6f, 0x77, 0x87, 0xbd, 0xcb, 0xab, 0x01, 0x78, 0x90, 0x10, 0x49, 0xe6, 0x54, 0x53, 0xa9, 0x20, 0x21, 0xaa, 0x54, 0x9e, 0xde, 0x91, 0x05, 0x81, - 0xf7, 0x17, 0xb0, 0x9c, 0x51, 0x0e, 0x32, 0xe5, 0xc6, 0xc7, 0xc6, 0x22, 0x36, 0x55, 0x80, 0xfa, 0x53, 0x1f, 0x81, 0x23, 0x3a, 0x4e, 0xb3, 0x37, 0xc0, 0xb4, 0xa2, 0xf1, 0xe4, 0x10, 0xd3, 0x35, - 0x83, 0x02, 0x50, 0x54, 0x97, 0x58, 0x36, 0xbc, 0x0f, 0x16, 0xc1, 0xfb, 0x20, 0x53, 0x7e, 0x17, 0x2d, 0x93, 0x13, 0x2d, 0x09, 0x57, 0x89, 0x90, 0xba, 0x11, 0xe9, 0xa1, 0x12, 0xe1, 0x3d, 0xd5, - 0x87, 0x8a, 0xca, 0x05, 0x95, 0x8d, 0xd5, 0xa1, 0x4a, 0x55, 0x42, 0x79, 0xd4, 0x58, 0x1d, 0x92, 0x28, 0xc2, 0x50, 0x6d, 0xfc, 0xfb, 0xe8, 0xe8, 0xa8, 0xa4, 0xc7, 0xe0, 0xf7, 0xce, 0xe5, 0xb0, - 0xdf, 0x02, 0x0f, 0x26, 0x31, 0x99, 0x1a, 0x81, 0x98, 0xb2, 0xe9, 0x27, 0x88, 0x29, 0x5d, 0xb9, 0x49, 0x64, 0x68, 0xaa, 0xc7, 0x4e, 0x73, 0xfe, 0xc0, 0xcf, 0x71, 0xd8, 0x04, 0x3e, 0x82, 0xf7, - 0x27, 0xb8, 0xf5, 0x8a, 0x48, 0x2e, 0x7c, 0x82, 0x53, 0xb4, 0x25, 0x77, 0x1c, 0x00, 0x0b, 0x34, 0x81, 0x80, 0xea, 0x30, 0xc8, 0xe5, 0x59, 0x03, 0xa0, 0xa1, 0xfc, 0xca, 0x3b, 0x07, 0x60, 0xc2, - 0xca, 0x88, 0x6e, 0x1d, 0x7d, 0x1d, 0xf8, 0xd9, 0x7b, 0x77, 0x13, 0x79, 0xf3, 0x7d, 0x46, 0x00, 0xff, 0xad, 0x41, 0x6f, 0x50, 0xe4, 0xae, 0x4a, 0x13, 0xb4, 0xb6, 0x0f, 0x50, 0x5f, 0x10, 0x09, - 0xc3, 0x79, 0xaa, 0xf4, 0x10, 0xc6, 0xd4, 0x78, 0x4a, 0x8b, 0xbc, 0x34, 0x68, 0x99, 0x52, 0xac, 0x0b, 0x13, 0x12, 0x63, 0xb6, 0x86, 0xab, 0xe9, 0x92, 0xf1, 0x86, 0x79, 0x3a, 0x75, 0x22, 0x22, - 0x4b, 0x4f, 0x73, 0xc6, 0xa7, 0x4b, 0xfb, 0xe0, 0x84, 0x44, 0x51, 0x70, 0x47, 0x29, 0x27, 0x73, 0x3a, 0x72, 0x81, 0xa1, 0x78, 0xad, 0x3f, 0xde, 0xdc, 0x74, 0xba, 0x2f, 0x0e, 0x20, 0x23, 0x62, - 0x48, 0x9f, 0x9e, 0x3a, 0x00, 0x17, 0x9d, 0xee, 0x9b, 0x9b, 0x17, 0x07, 0x60, 0x29, 0xe0, 0xb9, 0x39, 0x3e, 0x33, 0xe4, 0x5f, 0x1c, 0x40, 0xc6, 0x07, 0x5f, 0x18, 0x35, 0x6b, 0x70, 0xad, 0x28, - 0x04, 0xa9, 0x92, 0x41, 0xcc, 0xc6, 0xf4, 0x81, 0x86, 0xc1, 0x1d, 0x59, 0x90, 0xa1, 0x09, 0x70, 0x36, 0x01, 0xb2, 0x20, 0x2c, 0x46, 0xef, 0x1f, 0x82, 0x40, 0x2d, 0x96, 0x0c, 0xeb, 0x17, 0x89, - 0x63, 0x18, 0x93, 0xf0, 0x1e, 0xb5, 0x0b, 0xce, 0xd9, 0x58, 0x12, 0xb9, 0x0a, 0x30, 0xc0, 0x83, 0xb7, 0x62, 0x9e, 0x13, 0xc6, 0xaa, 0x97, 0xd7, 0xff, 0x88, 0x2e, 0x68, 0x2c, 0x12, 0x2a, 0x7d, - 0x2c, 0xe7, 0xd4, 0x0f, 0xc5, 0x1c, 0xf9, 0x19, 0xbc, 0x39, 0x09, 0x83, 0xcf, 0x24, 0xf8, 0x4c, 0x8e, 0x8f, 0xff, 0x75, 0x14, 0x0c, 0x19, 0x8f, 0xe8, 0x83, 0x3f, 0xd3, 0xf3, 0xd8, 0xd0, 0x29, - 0x62, 0x61, 0x9d, 0xf1, 0x2e, 0x7c, 0x2a, 0x39, 0x2a, 0x07, 0x79, 0x00, 0x77, 0xb7, 0x1a, 0x9b, 0xe0, 0x80, 0x45, 0x5a, 0x48, 0x5d, 0x94, 0x90, 0x86, 0x3b, 0xda, 0x8d, 0x3a, 0x72, 0x33, 0x1c, - 0x8a, 0x9e, 0x78, 0x1a, 0x7d, 0xdb, 0x06, 0x39, 0xe2, 0x84, 0x39, 0xa5, 0xff, 0x9c, 0x9e, 0x3a, 0x54, 0x91, 0xb0, 0x1c, 0xe1, 0x65, 0xad, 0x8a, 0xf8, 0xb3, 0xef, 0xa5, 0x0d, 0xe0, 0x29, 0xe5, - 0x5a, 0x08, 0x4f, 0xd2, 0x98, 0x62, 0x2c, 0x54, 0xc2, 0xb4, 0x10, 0x62, 0x84, 0x52, 0x7b, 0xa1, 0xe0, 0x13, 0x36, 0x05, 0xcf, 0xbb, 0x93, 0xd4, 0x33, 0x2a, 0xd8, 0xb0, 0xc5, 0xa8, 0x2d, 0xa5, - 0xd5, 0xcb, 0x6d, 0x96, 0x35, 0xec, 0x4e, 0x94, 0x88, 0x17, 0x14, 0x62, 0xc6, 0xef, 0x15, 0x78, 0x50, 0x3f, 0x32, 0x77, 0xfd, 0x98, 0x02, 0x31, 0x67, 0xe8, 0x6e, 0x93, 0x0d, 0x7b, 0xca, 0x54, - 0x40, 0x07, 0xe0, 0xb2, 0xff, 0xa6, 0xe1, 0xd6, 0x8f, 0x5c, 0x4c, 0xac, 0x1a, 0x70, 0x73, 0x2f, 0x9b, 0xb6, 0x42, 0x48, 0x90, 0x34, 0x26, 0x9a, 0x2d, 0x28, 0xa8, 0xd5, 0xdc, 0x90, 0x74, 0x00, - 0x96, 0x33, 0xec, 0x37, 0x3e, 0x82, 0x37, 0x03, 0xb7, 0x7e, 0xd9, 0x7f, 0x63, 0x45, 0x88, 0x84, 0x51, 0x26, 0x56, 0x8d, 0x51, 0xac, 0xc0, 0x8b, 0xa3, 0xec, 0xe5, 0xc8, 0x1e, 0x33, 0x7e, 0xdf, - 0x18, 0xe1, 0xcd, 0x0a, 0x6e, 0x3d, 0x56, 0x2e, 0x9c, 0xc0, 0x9e, 0xff, 0xc2, 0xfb, 0x0d, 0x6e, 0xf7, 0xfd, 0x17, 0xb7, 0x07, 0xf5, 0xbd, 0x51, 0x1e, 0x29, 0x39, 0x0c, 0xe3, 0xf7, 0x06, 0x2a, - 0xf0, 0x5f, 0xec, 0xc1, 0x6f, 0x80, 0xe1, 0x17, 0xf0, 0x34, 0x8e, 0x2b, 0x71, 0x60, 0x45, 0x37, 0xb0, 0xce, 0x86, 0x8f, 0xcd, 0xab, 0x51, 0xc4, 0x24, 0x26, 0x5d, 0x2e, 0x4b, 0x50, 0x82, 0x35, - 0xfe, 0x8c, 0xb0, 0x95, 0x74, 0x00, 0x14, 0x59, 0xd0, 0x28, 0x62, 0xb2, 0x31, 0x4a, 0x96, 0xd1, 0x08, 0x4f, 0x32, 0xfb, 0x36, 0xb6, 0x48, 0xf8, 0xbe, 0x35, 0xd4, 0x9c, 0xdc, 0x53, 0x60, 0x1a, - 0x26, 0x69, 0x1c, 0xaf, 0xe0, 0x73, 0x4a, 0x62, 0x36, 0x61, 0x34, 0x2a, 0xa3, 0x86, 0x51, 0xd9, 0x51, 0xcf, 0x9f, 0x43, 0x4e, 0xdc, 0xbc, 0xc8, 0x79, 0xba, 0x86, 0x1c, 0x0d, 0x67, 0x02, 0xae, - 0x15, 0x16, 0xe7, 0xf9, 0x4b, 0x20, 0x1a, 0x72, 0xc4, 0xac, 0x5a, 0xbd, 0x16, 0x12, 0x5a, 0xa6, 0x54, 0x1c, 0x02, 0xe5, 0x2a, 0x95, 0x14, 0x12, 0xa2, 0x67, 0x0a, 0xb0, 0x5b, 0x62, 0x1c, 0xae, - 0xbb, 0x9d, 0x0f, 0x60, 0xfb, 0x54, 0x18, 0xd3, 0x09, 0x36, 0xc6, 0x84, 0xaf, 0xf4, 0x0c, 0x09, 0x32, 0x05, 0x5a, 0xa4, 0xe1, 0x8c, 0x46, 0x18, 0x40, 0x75, 0x5b, 0x71, 0x8a, 0xb0, 0xf9, 0x08, - 0x1e, 0xaf, 0x46, 0xd4, 0xf3, 0xe7, 0xc6, 0x44, 0x85, 0x22, 0xab, 0x29, 0x32, 0x03, 0xcf, 0x4b, 0x39, 0x7b, 0x28, 0xc1, 0x8e, 0x0a, 0xf4, 0x4a, 0x16, 0x64, 0x04, 0x4a, 0xa1, 0xbd, 0x45, 0xa2, - 0x80, 0x2f, 0x11, 0x69, 0x9d, 0x37, 0x07, 0x83, 0xcb, 0xe6, 0xd5, 0xdb, 0x12, 0x91, 0xf5, 0x59, 0x99, 0x48, 0x95, 0x56, 0x81, 0x36, 0x2a, 0x99, 0xeb, 0x02, 0x0b, 0xe8, 0x0f, 0x5b, 0xcb, 0x94, - 0xe1, 0xef, 0x30, 0x96, 0x3b, 0xda, 0xaf, 0xf8, 0xfd, 0x14, 0xbd, 0x7e, 0x60, 0xca, 0xd0, 0x37, 0x59, 0x2a, 0xc7, 0x2f, 0xa0, 0xd6, 0x14, 0xaa, 0x15, 0x60, 0x67, 0x31, 0xc5, 0x0a, 0xd2, 0x7e, - 0xa0, 0x61, 0xaa, 0xb1, 0xe2, 0x37, 0xdc, 0xd1, 0x72, 0xc6, 0xc2, 0x99, 0x39, 0x0e, 0x8d, 0x0c, 0x16, 0x1f, 0xc5, 0xa8, 0x82, 0x5a, 0x59, 0xe0, 0x19, 0x7c, 0x04, 0xd7, 0x26, 0xea, 0xed, 0x26, - 0xc8, 0xad, 0x49, 0xc8, 0xdb, 0xfd, 0x8f, 0xff, 0x07, 0x9f, 0x5e, 0xdc, 0x1e, 0xec, 0x8d, 0x5c, 0x68, 0x80, 0xcb, 0x45, 0xb5, 0x3a, 0x63, 0x0d, 0x22, 0x11, 0xe6, 0xd9, 0xfe, 0xf1, 0x01, 0x1a, - 0x13, 0x67, 0x95, 0xf5, 0x1d, 0x04, 0x44, 0x81, 0xd2, 0x84, 0x47, 0x44, 0x9a, 0xbe, 0x7d, 0x20, 0x62, 0x22, 0x99, 0x82, 0xe3, 0x23, 0xdf, 0x60, 0x23, 0xee, 0xb9, 0x29, 0x16, 0x56, 0xf0, 0x9c, - 0xd6, 0xa8, 0xb8, 0x49, 0x9e, 0x41, 0x5e, 0x48, 0x72, 0xe0, 0x4d, 0xb9, 0x76, 0x89, 0x65, 0x90, 0xeb, 0xf6, 0xee, 0x84, 0x8d, 0xcb, 0x04, 0xd5, 0xc4, 0x8a, 0x5f, 0x2a, 0x18, 0x3b, 0x94, 0x5f, - 0xdf, 0x24, 0x3b, 0xac, 0x1c, 0x46, 0x39, 0x06, 0xd2, 0xb9, 0xcd, 0x93, 0x1d, 0xbc, 0xcb, 0x91, 0xb9, 0x8a, 0xc2, 0x9d, 0xb7, 0xd0, 0x16, 0x99, 0x5c, 0x5b, 0xec, 0x6d, 0xbe, 0x26, 0x41, 0x76, - 0x17, 0x7d, 0xb7, 0xe4, 0x6b, 0xf0, 0xdc, 0x82, 0xf9, 0x41, 0x66, 0x41, 0xac, 0xc5, 0x38, 0xec, 0x67, 0xe5, 0xb8, 0x12, 0x96, 0x05, 0x6c, 0xae, 0xca, 0xc6, 0x1d, 0x5a, 0x54, 0xd5, 0xad, 0xcb, - 0x0a, 0x61, 0x5a, 0x17, 0x67, 0x3b, 0xee, 0xc7, 0x8d, 0x7c, 0xa8, 0xde, 0x8c, 0xeb, 0xae, 0xa0, 0x00, 0x09, 0xee, 0x24, 0x0d, 0xd4, 0xcc, 0x18, 0x75, 0xa3, 0xdd, 0xc3, 0xd0, 0xeb, 0xbc, 0xba, - 0xd8, 0x53, 0x66, 0x7c, 0x10, 0x1c, 0x9a, 0x9d, 0x0f, 0xd8, 0x75, 0x63, 0xc0, 0x49, 0xc2, 0xa7, 0x74, 0x3d, 0x11, 0xa8, 0x7c, 0x7c, 0x03, 0xba, 0xb6, 0x92, 0x2a, 0x69, 0xdc, 0xba, 0x38, 0x6b, - 0x3c, 0xc5, 0x73, 0xf3, 0x9e, 0xd9, 0x05, 0x3f, 0x66, 0xbc, 0x04, 0x6c, 0x4c, 0xb2, 0xc6, 0x58, 0xc3, 0x97, 0x32, 0x73, 0xe4, 0x6e, 0x18, 0xed, 0x59, 0xa1, 0xf5, 0xa6, 0xd9, 0xcc, 0x3d, 0xe1, - 0xb6, 0xa5, 0x14, 0xf2, 0xa4, 0x34, 0x41, 0x65, 0x79, 0x16, 0xd1, 0x09, 0xe3, 0x34, 0x82, 0x50, 0x48, 0x49, 0x43, 0x1d, 0xaf, 0x7c, 0x17, 0x7e, 0x7b, 0xfe, 0x72, 0x8d, 0x07, 0x70, 0x43, 0x21, - 0x24, 0x1c, 0x61, 0xad, 0xee, 0x14, 0x0a, 0x36, 0x19, 0xe4, 0x03, 0xd3, 0x70, 0xfc, 0x95, 0x62, 0xb3, 0x29, 0xcc, 0x0d, 0x31, 0xd3, 0x6e, 0x59, 0x1c, 0xca, 0x17, 0x4c, 0x0a, 0x3e, 0xa7, 0x5c, - 0xe3, 0xb8, 0xc6, 0x4c, 0xea, 0x67, 0x32, 0x2a, 0xaa, 0x7d, 0x5b, 0xcb, 0x4c, 0xd9, 0xbe, 0xe9, 0xf5, 0xcf, 0xcf, 0x06, 0xc3, 0xf3, 0xe6, 0x75, 0xb7, 0xf5, 0xb6, 0xdd, 0x6f, 0x08, 0x39, 0xf5, - 0x43, 0x11, 0xd1, 0x19, 0x49, 0x95, 0x9f, 0xc4, 0xf4, 0x21, 0x55, 0x7e, 0x18, 0x13, 0xa5, 0x96, 0x42, 0xc6, 0x91, 0xf2, 0x63, 0x92, 0xf2, 0x70, 0x46, 0xa5, 0x7f, 0x9e, 0xfd, 0x81, 0xe5, 0x5e, - 0x4b, 0xb2, 0xa0, 0x12, 0x7d, 0x1d, 0x31, 0x54, 0x5c, 0xc8, 0x15, 0x7a, 0x3d, 0x0d, 0x35, 0x96, 0xfe, 0x89, 0x14, 0x73, 0x48, 0xa4, 0x08, 0x71, 0xac, 0x37, 0x1b, 0x9e, 0x02, 0x4a, 0x0b, 0x3b, - 0x01, 0xad, 0x94, 0xa6, 0x73, 0x90, 0x42, 0x68, 0xa7, 0x06, 0x13, 0x26, 0x95, 0x2e, 0x01, 0x99, 0x2d, 0x8a, 0x3f, 0x5f, 0x70, 0x50, 0xe9, 0xb8, 0x38, 0x66, 0x0a, 0x42, 0xc1, 0x15, 0x8b, 0x28, - 0x4e, 0xbc, 0x89, 0x14, 0x77, 0x34, 0xd4, 0x30, 0xc6, 0x0e, 0x6f, 0x0d, 0xe4, 0x4c, 0x18, 0x8f, 0x86, 0xa6, 0xe5, 0x1a, 0xe2, 0x9b, 0x88, 0xc9, 0xfd, 0x03, 0xf8, 0x52, 0x4c, 0x31, 0x68, 0xdd, - 0x63, 0x17, 0x3e, 0x39, 0x50, 0x84, 0xb2, 0xb5, 0xeb, 0x25, 0xde, 0x71, 0xc6, 0x62, 0x76, 0x4c, 0xb1, 0x83, 0xe8, 0x36, 0x3d, 0x37, 0xab, 0x9c, 0x3a, 0x95, 0x1c, 0x8e, 0xd7, 0x43, 0x52, 0xf6, - 0xb6, 0x81, 0xe4, 0xb1, 0x6d, 0x2b, 0xff, 0x9d, 0xb5, 0x70, 0x6e, 0x1d, 0x4f, 0x5d, 0x78, 0xd6, 0x80, 0xbd, 0x60, 0xaf, 0xdc, 0xc7, 0x59, 0xd9, 0xa2, 0x1c, 0x22, 0x30, 0xca, 0x6f, 0xa4, 0x5b, - 0xce, 0xc0, 0x80, 0xe4, 0x67, 0x92, 0x92, 0xfb, 0x22, 0xec, 0x31, 0x27, 0xd1, 0xe0, 0x44, 0x8a, 0x94, 0x47, 0x26, 0xed, 0xde, 0xbd, 0x6a, 0x37, 0x2f, 0xbd, 0x7f, 0xff, 0xf7, 0x7f, 0xfc, 0x0b, - 0xf6, 0x2b, 0x17, 0x40, 0x30, 0x48, 0x88, 0x0c, 0x0f, 0x36, 0xd8, 0x7f, 0x41, 0xe2, 0x8f, 0x9b, 0xb5, 0xdc, 0x28, 0x63, 0xfb, 0x2b, 0xfc, 0x33, 0xf0, 0x7d, 0x7b, 0x4b, 0x8e, 0xaa, 0xac, 0x29, - 0x8f, 0x70, 0xd4, 0x2d, 0x24, 0xc8, 0x5b, 0xbe, 0xdc, 0xc4, 0xf5, 0x2f, 0x99, 0x12, 0x8f, 0xae, 0xf3, 0x88, 0x81, 0x14, 0x0a, 0x1e, 0x12, 0x4d, 0x39, 0xd1, 0x54, 0x01, 0xce, 0x48, 0x31, 0xe3, - 0x54, 0xd9, 0xad, 0x84, 0xd9, 0xe1, 0x59, 0x80, 0xa1, 0x39, 0x36, 0x8e, 0x2c, 0x4f, 0xa3, 0xc7, 0x55, 0x39, 0x33, 0x1e, 0xfb, 0x5a, 0x82, 0xa7, 0x60, 0xef, 0x96, 0xef, 0x01, 0xfe, 0xf3, 0x3f, - 0x06, 0xf2, 0x20, 0x4b, 0xfa, 0x47, 0xc7, 0x79, 0xd5, 0x1c, 0xb4, 0x87, 0x67, 0x9d, 0x7e, 0x63, 0xb4, 0xed, 0x5c, 0xc4, 0xc7, 0xeb, 0xdf, 0x1d, 0x95, 0xb2, 0x31, 0x47, 0x28, 0xb3, 0xb3, 0x69, - 0x7b, 0x6a, 0xfb, 0x9f, 0x5f, 0xf6, 0x73, 0x6a, 0xd0, 0x7e, 0xd0, 0x94, 0x9b, 0x25, 0xa5, 0x16, 0x68, 0x22, 0xb1, 0x04, 0x92, 0x6a, 0x31, 0x27, 0x9a, 0x85, 0x04, 0x7b, 0xe1, 0x48, 0x2c, 0x79, - 0xbe, 0x68, 0xc0, 0x22, 0x6b, 0xf4, 0xf1, 0x96, 0x92, 0x24, 0x38, 0x3d, 0xde, 0x11, 0x69, 0x13, 0xd2, 0xac, 0x47, 0xbc, 0x90, 0x72, 0x2d, 0x49, 0xec, 0xd4, 0xe0, 0x0a, 0x87, 0x0e, 0x43, 0x4f, - 0x41, 0xaa, 0x2a, 0xc8, 0x90, 0x21, 0x63, 0xeb, 0x96, 0xa5, 0x99, 0x02, 0x3d, 0x23, 0x1a, 0x9f, 0x66, 0x6c, 0xcc, 0x34, 0x84, 0x33, 0x1a, 0xde, 0x9b, 0xf6, 0x8d, 0xc3, 0x98, 0x71, 0x22, 0x57, - 0x10, 0x11, 0x4d, 0xfc, 0x5f, 0x69, 0x8b, 0x7c, 0xc4, 0x2b, 0x1c, 0x62, 0xf2, 0x24, 0xc8, 0xa4, 0x0d, 0xb6, 0x14, 0xaf, 0x86, 0x87, 0x41, 0x77, 0xeb, 0x17, 0xef, 0xbb, 0x37, 0xc3, 0xf7, 0xed, - 0xfe, 0xab, 0xde, 0xa0, 0x8d, 0x1d, 0x95, 0xd9, 0x04, 0x54, 0xc3, 0xdd, 0x06, 0x92, 0xd9, 0x86, 0xc3, 0xdf, 0x70, 0xc8, 0x13, 0x60, 0x7d, 0xe1, 0x7c, 0x2f, 0x97, 0x96, 0x48, 0xe3, 0x88, 0xef, - 0x69, 0x53, 0x68, 0xfe, 0x86, 0xdb, 0x61, 0xc5, 0xd7, 0x4c, 0x83, 0xef, 0xfb, 0x6e, 0x39, 0x05, 0x8b, 0x4b, 0xde, 0xf0, 0xef, 0xb7, 0x2f, 0x7b, 0xd7, 0xfd, 0xf3, 0xcd, 0x6c, 0xbe, 0x23, 0xf2, - 0x5a, 0xc6, 0x8d, 0x2a, 0x50, 0xc0, 0x44, 0xa0, 0xc9, 0x3d, 0x91, 0xac, 0xca, 0x37, 0x38, 0xf2, 0xff, 0xd3, 0xff, 0xaf, 0xea, 0x99, 0x67, 0xce, 0x0a, 0xfd, 0x4b, 0xf7, 0x73, 0x4e, 0x3b, 0x5f, - 0x63, 0x48, 0x9a, 0x08, 0xbb, 0x0f, 0x2a, 0x6f, 0xb3, 0xed, 0x7e, 0xf0, 0x47, 0x58, 0x66, 0x0a, 0xdb, 0xca, 0xda, 0x79, 0x3d, 0x68, 0xb8, 0x0d, 0xd7, 0x74, 0xaf, 0x70, 0x4f, 0x57, 0xb0, 0x20, - 0x71, 0x4a, 0xd7, 0xc5, 0x15, 0xc0, 0x6e, 0x84, 0xea, 0xf7, 0x74, 0xe5, 0x62, 0xc0, 0xee, 0x67, 0x44, 0xaf, 0x65, 0x7c, 0x50, 0x58, 0xc3, 0x20, 0xb9, 0xa7, 0xb6, 0xa6, 0xda, 0xdd, 0x90, 0x51, - 0x4e, 0x91, 0xd0, 0xfc, 0x89, 0x95, 0xcc, 0x14, 0x93, 0x6f, 0x89, 0xbe, 0x44, 0x8a, 0x84, 0x4a, 0xcd, 0xa8, 0x72, 0xff, 0x51, 0x58, 0x9c, 0x95, 0x1c, 0x8d, 0xe9, 0x7b, 0x02, 0x75, 0x2b, 0x68, - 0x55, 0x7d, 0xcb, 0xed, 0x1d, 0x91, 0x78, 0x79, 0x35, 0xbe, 0x4d, 0xb4, 0xb5, 0x0d, 0x8b, 0xe1, 0xb4, 0x5a, 0xec, 0xab, 0x44, 0xb7, 0xa7, 0xc0, 0x25, 0xe3, 0x11, 0x56, 0x0d, 0xb7, 0x5e, 0x05, - 0x75, 0xd7, 0xd7, 0x41, 0x4e, 0x3e, 0x14, 0xf3, 0x39, 0xe1, 0x11, 0x78, 0x0b, 0x58, 0x4e, 0xa9, 0x7e, 0x72, 0xb1, 0xf0, 0x3d, 0xf6, 0x81, 0x8d, 0x04, 0x35, 0x84, 0x7d, 0xdf, 0xcf, 0x8a, 0x18, - 0x3e, 0x16, 0x93, 0xc3, 0xba, 0x73, 0x2f, 0x5f, 0xff, 0x86, 0xc9, 0xf5, 0xa0, 0xdd, 0xef, 0x36, 0x6d, 0x83, 0xf5, 0xd7, 0x5f, 0x95, 0x57, 0x97, 0xb6, 0x4d, 0x3a, 0xdb, 0x5e, 0x83, 0xe1, 0xcf, - 0xf0, 0x73, 0x73, 0x6f, 0x80, 0xd7, 0xdb, 0xb6, 0xc3, 0x1a, 0xbe, 0x32, 0x7e, 0xac, 0x91, 0x3d, 0x0f, 0xb3, 0xc3, 0x4b, 0x15, 0x95, 0x8d, 0xaa, 0x30, 0xf9, 0xab, 0xc4, 0xf6, 0x5f, 0x51, 0xa3, - 0x2a, 0xd0, 0xb7, 0xb2, 0xcd, 0xb4, 0xa6, 0x71, 0xd5, 0x05, 0x61, 0x2a, 0xe3, 0x5f, 0xe2, 0x02, 0x43, 0xb8, 0x70, 0x01, 0x3e, 0xfe, 0x52, 0x17, 0x18, 0x7e, 0x9e, 0xd8, 0xb6, 0x40, 0xd9, 0x40, - 0x93, 0xa7, 0xbd, 0x60, 0xf1, 0x8d, 0x03, 0xa0, 0x2a, 0xca, 0xc9, 0x86, 0xc1, 0xbf, 0x9d, 0x49, 0x1e, 0xf5, 0x15, 0x66, 0xff, 0xc8, 0xa4, 0x24, 0x8e, 0xd1, 0x8a, 0xf9, 0xb6, 0xd8, 0xda, 0xd4, - 0x7c, 0x0b, 0xd1, 0x62, 0x7d, 0x01, 0xec, 0xb4, 0x2f, 0x0e, 0x37, 0x2d, 0xec, 0xdd, 0x9f, 0xac, 0x04, 0xa6, 0x09, 0xb8, 0xb1, 0x0f, 0x79, 0x89, 0x31, 0x25, 0x21, 0x9f, 0x9e, 0xc0, 0x34, 0x72, - 0xe5, 0xed, 0x97, 0x5a, 0x32, 0x1d, 0xce, 0xb2, 0x7d, 0x8e, 0x16, 0x70, 0x93, 0x65, 0x7f, 0x75, 0x9d, 0x93, 0x7f, 0x9e, 0x31, 0xd3, 0x77, 0x59, 0xff, 0x5d, 0x15, 0xa6, 0x2a, 0xeb, 0xd7, 0x0a, - 0xcc, 0x1a, 0xca, 0x1d, 0x3d, 0x1d, 0x50, 0xb4, 0x02, 0xb8, 0x33, 0x62, 0xf2, 0x31, 0x8f, 0x3e, 0x59, 0xbe, 0x9f, 0xb0, 0x4c, 0xf8, 0x34, 0x4d, 0xf8, 0x6e, 0x07, 0xe7, 0xbf, 0x6c, 0x38, 0xf4, - 0xa0, 0x25, 0xe6, 0x09, 0x8b, 0xd7, 0x9f, 0xb5, 0x76, 0x3b, 0xa6, 0xb8, 0xe5, 0xcb, 0xbf, 0x92, 0x15, 0xf2, 0x5f, 0xad, 0x44, 0x6f, 0xfd, 0xfd, 0xcc, 0x28, 0xb0, 0x05, 0xba, 0xbf, 0x6b, 0x7e, - 0x0e, 0xdd, 0x8a, 0x21, 0x0f, 0x2a, 0x58, 0x1b, 0xfc, 0x0a, 0xcb, 0xff, 0x4c, 0x73, 0xd6, 0xa0, 0x9f, 0xc5, 0x11, 0xca, 0x1f, 0xad, 0xf1, 0x7e, 0xb6, 0xdd, 0xfb, 0xe5, 0x8f, 0x89, 0x3f, 0x68, - 0xf5, 0x9d, 0xa6, 0x74, 0xc1, 0x0b, 0x93, 0x4a, 0x37, 0xf7, 0x04, 0xaf, 0xf5, 0x17, 0xbb, 0xcb, 0x7e, 0xef, 0x5d, 0xbb, 0x75, 0x85, 0xd6, 0xc4, 0x49, 0xe3, 0x49, 0xe3, 0x17, 0x9f, 0x47, 0x26, - 0xec, 0x57, 0x36, 0xdb, 0x35, 0x68, 0xdb, 0x69, 0x8e, 0xe6, 0xf3, 0xc7, 0xaf, 0xe4, 0xe6, 0x64, 0xdb, 0xad, 0x5d, 0xb6, 0x68, 0xd4, 0xbf, 0xd8, 0xe3, 0xec, 0xf9, 0xc4, 0x2b, 0x4d, 0x64, 0x8f, - 0xce, 0xb7, 0x85, 0x82, 0x71, 0xfd, 0x4e, 0x53, 0xa3, 0x1d, 0x4b, 0x1f, 0x87, 0xdd, 0xfa, 0x7e, 0x79, 0xe6, 0x7c, 0xc2, 0x3f, 0x36, 0xd8, 0xef, 0x16, 0x73, 0xdf, 0x7e, 0x3e, 0x72, 0x0f, 0x72, - 0xe2, 0x48, 0xc4, 0xdd, 0xfc, 0x82, 0xf0, 0xfd, 0x35, 0xd4, 0xd9, 0x51, 0x3a, 0xff, 0x76, 0x17, 0xfe, 0xb5, 0x4a, 0xfa, 0x23, 0x9f, 0x10, 0xb6, 0x88, 0xfd, 0x94, 0x8f, 0x09, 0x05, 0xb9, 0xf2, - 0xf7, 0x84, 0x42, 0xcd, 0x5d, 0x69, 0x51, 0xd2, 0x79, 0x57, 0xa4, 0x7c, 0xd5, 0x00, 0xbb, 0xe8, 0xe5, 0xdf, 0x2f, 0x2e, 0xa5, 0x58, 0xb0, 0x88, 0x02, 0x01, 0x37, 0x5f, 0x97, 0xb3, 0x3f, 0x69, - 0xe4, 0xc2, 0x92, 0x98, 0x9d, 0x95, 0xa4, 0x5a, 0x32, 0xba, 0xb0, 0xff, 0x53, 0x4a, 0xeb, 0xbc, 0x03, 0x44, 0x4e, 0xb3, 0x91, 0x78, 0xc9, 0x62, 0x1c, 0xa7, 0xcd, 0x9e, 0xcb, 0x2c, 0xae, 0xc6, - 0x42, 0xcf, 0xd6, 0x1e, 0xc6, 0xd6, 0x8b, 0x0b, 0xee, 0xe5, 0xcf, 0x76, 0x0b, 0xc8, 0x04, 0x57, 0x7e, 0x16, 0x75, 0xad, 0x8b, 0xb3, 0xe1, 0x79, 0xa7, 0xdb, 0x1e, 0x36, 0xfb, 0x6f, 0x30, 0xfc, - 0xb2, 0xd3, 0x5e, 0xf7, 0x75, 0xe7, 0x0d, 0xd4, 0xff, 0xd7, 0xad, 0xa6, 0x46, 0x05, 0xda, 0x71, 0x6e, 0xfa, 0xcd, 0xcb, 0xcb, 0x76, 0xbf, 0xba, 0xce, 0xcb, 0x06, 0x2d, 0x3b, 0x75, 0xe5, 0x5d, - 0x7f, 0xb9, 0xfc, 0x5c, 0x10, 0xc6, 0x31, 0xe5, 0x68, 0x58, 0xde, 0x7a, 0xde, 0x3a, 0x50, 0x0e, 0x62, 0xf3, 0xec, 0x99, 0x82, 0x6d, 0x6c, 0xf9, 0xb5, 0x44, 0xf8, 0xca, 0x04, 0x8e, 0x54, 0x5c, - 0xef, 0xcc, 0x0a, 0x33, 0x13, 0x73, 0x8a, 0xe9, 0x6c, 0x63, 0xf1, 0xd1, 0x2d, 0xde, 0xcc, 0xd3, 0x58, 0xb3, 0x0b, 0x11, 0xa5, 0x31, 0xbd, 0xb4, 0x1b, 0x87, 0xb3, 0x7c, 0xa5, 0xb7, 0xce, 0xff, - 0x2a, 0xe7, 0xc7, 0x4c, 0xe2, 0x2f, 0x9b, 0x36, 0x78, 0x84, 0xaa, 0x0d, 0x5d, 0x34, 0xe2, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, - 0x00, 0x56, 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, - 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, - 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, 0xff, 0xb9, 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, 0x38, 0x79, 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, 0x39, 0x60, 0x1a, 0xd2, 0x04, 0x90, - 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, 0x2f, 0x66, 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, 0xf7, 0xd3, 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, 0x9e, 0x5a, 0xe9, 0xde, 0x0f, 0x8f, - 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, 0x47, 0x77, 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, 0x2d, 0x4d, 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, 0x4b, 0x84, 0xb0, 0x20, 0xe9, 0x12, - 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, 0x2c, 0x23, 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, 0x83, 0x35, 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, 0x73, 0x01, 0x2b, 0x2e, 0x10, 0x52, - 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, 0x26, 0x90, 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, 0x48, 0x10, 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, 0x46, 0x30, 0xa7, 0xb9, 0x95, 0x90, - 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, 0x96, 0x54, 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, 0x24, 0xcb, 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, 0xce, 0xc5, 0xca, 0x18, 0x53, 0xb2, - 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, 0x3b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, 0x25, 0x2d, 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, 0x57, 0x06, 0xc9, 0x52, 0x74, 0xad, - 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, 0x0d, 0x4a, 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, 0x7f, 0x01, 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, 0xde, 0x3d, 0xfb, 0xde, 0xf0, 0xaf, - 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, 0x7c, 0x4e, 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, 0xe4, 0x94, 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, 0x7a, 0x7c, 0x80, 0x9f, 0xac, 0x18, - 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, 0x26, 0x19, 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, 0x54, 0xaa, 0x90, 0x9d, 0xf3, 0xf3, 0xed, 0x76, 0xeb, 0x13, 0x63, 0xb9, 0xcf, 0xc5, - 0xe2, 0xbc, 0xf2, 0xf6, 0xfc, 0x76, 0xd0, 0x8d, 0x86, 0x49, 0xd4, 0xbe, 0xf4, 0x2f, 0x1a, 0x8c, 0xf7, 0x2c, 0x47, 0x29, 0x41, 0xe0, 0xaf, 0x6b, 0x2a, 0x30, 0x83, 0xd9, 0x0e, 0x48, 0x51, 0xe4, - 0x34, 0x25, 0xb3, 0x1c, 0x21, 0x27, 0x5b, 0x9d, 0x53, 0x93, 0x3a, 0x03, 0x0a, 0xca, 0x60, 0x2b, 0xa8, 0xa2, 0x6c, 0xd1, 0x2a, 0xf9, 0x65, 0x05, 0x8d, 0x66, 0xe2, 0xea, 0x10, 0x56, 0xc6, 0x52, - 0x79, 0x40, 0xc0, 0x19, 0x10, 0x9b, 0x35, 0x37, 0x4c, 0x60, 0x90, 0xb8, 0x70, 0x15, 0x26, 0x83, 0xa4, 0x05, 0x8f, 0x83, 0xc9, 0xf5, 0xe8, 0x7e, 0x02, 0x8f, 0x61, 0x1c, 0x87, 0xc3, 0xc9, 0x20, - 0x4a, 0x60, 0x14, 0x43, 0x77, 0x34, 0xec, 0x0d, 0x26, 0x83, 0xd1, 0x30, 0x81, 0x51, 0x1f, 0xc2, 0xe1, 0x4f, 0x25, 0xef, 0x8f, 0x83, 0x61, 0xaf, 0x05, 0x48, 0xd5, 0x12, 0x05, 0xe0, 0x73, 0x21, - 0xb4, 0x2b, 0x5c, 0x00, 0xd5, 0x11, 0xc6, 0xac, 0x81, 0xb3, 0xca, 0x0e, 0x8d, 0xa1, 0x7d, 0xe6, 0x64, 0x81, 0x29, 0x9d, 0xd3, 0x14, 0x72, 0xc2, 0x16, 0x6b, 0xb2, 0x40, 0x58, 0xf0, 0x0d, 0x0a, - 0xa6, 0x21, 0x54, 0xa0, 0x58, 0x51, 0xa9, 0xd3, 0x2d, 0x81, 0xb0, 0x0c, 0x72, 0xba, 0xa2, 0xca, 0x80, 0x4d, 0x96, 0xcc, 0x47, 0x3e, 0xfa, 0xce, 0x1f, 0x5f, 0x94, 0x7f, 0x82, 0x48, 0x23, 0xf1, - 0x8e, 0x6c, 0x90, 0x41, 0xa2, 0x88, 0x50, 0x70, 0x5f, 0xc0, 0x15, 0x51, 0xe9, 0x12, 0x64, 0x2a, 0x68, 0xd1, 0x04, 0x55, 0x5c, 0x81, 0x22, 0x1a, 0x3e, 0xc0, 0x86, 0x08, 0xd9, 0x29, 0xcf, 0x6f, - 0xc2, 0x87, 0x70, 0x7a, 0x3d, 0xba, 0x8b, 0xa0, 0x0d, 0x39, 0x4f, 0xcb, 0x7e, 0xc0, 0xe7, 0x40, 0xe0, 0xa6, 0xf7, 0x23, 0x2c, 0xf9, 0x4a, 0xa3, 0x41, 0x34, 0x04, 0x8d, 0x0a, 0x5b, 0xb3, 0x95, - 0x20, 0x6b, 0xc5, 0xe5, 0x6b, 0x52, 0x56, 0xda, 0xb6, 0xcb, 0x13, 0x09, 0x94, 0x49, 0x45, 0xf2, 0x1c, 0xb3, 0x43, 0x91, 0x70, 0x17, 0x3e, 0x44, 0xc3, 0xe9, 0x55, 0x38, 0xe9, 0x5e, 0x4f, 0xa3, - 0xee, 0xf5, 0x08, 0xda, 0x20, 0x51, 0x69, 0x74, 0x9e, 0x70, 0x76, 0xa2, 0x7f, 0x91, 0x19, 0xf4, 0xea, 0xe4, 0x60, 0xba, 0xe4, 0x3a, 0x9f, 0xb6, 0x78, 0x66, 0xc6, 0xd3, 0x94, 0xaf, 0x56, 0x84, - 0x65, 0xf2, 0x58, 0xde, 0x38, 0xbc, 0x4f, 0xa2, 0x63, 0x81, 0x5b, 0x42, 0x55, 0xd9, 0x7f, 0xe0, 0x09, 0x77, 0x52, 0x09, 0xfe, 0x84, 0x30, 0xc3, 0xb9, 0xee, 0x75, 0xc8, 0x74, 0xcf, 0x69, 0x8a, - 0x1a, 0x8d, 0x27, 0x09, 0xb4, 0xa1, 0x20, 0x82, 0xac, 0x50, 0xa1, 0x90, 0x50, 0x10, 0xd9, 0xe8, 0xaa, 0x37, 0x64, 0x43, 0xe0, 0xe1, 0x0e, 0xb6, 0x4b, 0x64, 0x20, 0xd6, 0xcc, 0x00, 0xce, 0xa4, - 0x64, 0x5f, 0xcc, 0x80, 0xfe, 0xc2, 0xd7, 0xf4, 0x19, 0xce, 0xd6, 0xf6, 0x25, 0x50, 0x25, 0x31, 0x9f, 0xb7, 0x74, 0x67, 0xb1, 0x00, 0x46, 0xd5, 0x50, 0x19, 0xb4, 0x3f, 0x95, 0xd4, 0xed, 0x4f, - 0x62, 0xcd, 0xbe, 0x64, 0xdb, 0xa2, 0xa3, 0x04, 0x61, 0xb2, 0xe0, 0x42, 0x05, 0x99, 0x9a, 0x4a, 0x9e, 0x3e, 0xa1, 0x6a, 0x49, 0x14, 0x1b, 0x14, 0xc1, 0xae, 0x25, 0xd7, 0xb2, 0x40, 0x96, 0x05, - 0xbb, 0x16, 0xc9, 0x32, 0x5d, 0x3a, 0xc1, 0xdf, 0x2e, 0x2e, 0x2e, 0x9a, 0x8e, 0x24, 0x3f, 0x0e, 0xc6, 0xd3, 0xb8, 0x0b, 0x6d, 0x98, 0xe7, 0x64, 0x61, 0xcc, 0xa1, 0xb2, 0x6c, 0x0c, 0x9c, 0x64, - 0x36, 0xac, 0x26, 0x5f, 0x22, 0x35, 0x6d, 0x4e, 0xfe, 0x09, 0x80, 0x2d, 0x45, 0x5e, 0xe1, 0x42, 0x77, 0xc2, 0x3c, 0x07, 0xfd, 0x94, 0x53, 0x86, 0xb2, 0xec, 0x9c, 0x27, 0x1f, 0x4f, 0x4c, 0x57, - 0x25, 0x12, 0x8f, 0x91, 0x41, 0xa5, 0x49, 0xa1, 0xf3, 0x51, 0xc3, 0x00, 0xf8, 0x7c, 0x5e, 0xc7, 0x4d, 0x51, 0x95, 0xa3, 0xb6, 0xdf, 0x82, 0x01, 0xb6, 0x94, 0x65, 0x7c, 0xeb, 0x94, 0xe7, 0x9e, - 0x8d, 0x83, 0x45, 0x52, 0x85, 0xa2, 0xd9, 0x4e, 0xf3, 0x2a, 0x93, 0xaf, 0x97, 0xba, 0x2c, 0x5c, 0x9c, 0x8f, 0x74, 0x0e, 0xae, 0xf7, 0xf2, 0xb5, 0xe7, 0x42, 0x10, 0x80, 0xcb, 0x99, 0x0b, 0x46, - 0x1a, 0x1c, 0x53, 0x38, 0xb5, 0x71, 0x9e, 0xae, 0x0b, 0xcf, 0x40, 0xf9, 0xd7, 0x35, 0xdd, 0x90, 0x1c, 0x99, 0xd2, 0xb6, 0x7e, 0xa3, 0xcf, 0x1d, 0xa3, 0xc0, 0x50, 0x94, 0x42, 0x5d, 0x38, 0xd5, - 0x4c, 0xae, 0x3e, 0x0a, 0xcc, 0x8b, 0x5e, 0x3c, 0x78, 0x88, 0x3c, 0xf3, 0xe7, 0x38, 0x9c, 0x5c, 0x7b, 0xee, 0x99, 0x15, 0x1e, 0x3d, 0x63, 0xba, 0x56, 0x08, 0x44, 0x83, 0x48, 0x40, 0x86, 0x73, - 0xca, 0x30, 0xb3, 0xa5, 0x5f, 0x21, 0xda, 0xdc, 0x5a, 0xfa, 0x4e, 0xa7, 0x73, 0x73, 0x93, 0x55, 0xde, 0x58, 0x38, 0xec, 0xb5, 0x2e, 0xb8, 0xe2, 0x20, 0x9f, 0x68, 0x11, 0xa7, 0x63, 0x61, 0x21, - 0x99, 0x2e, 0x31, 0x2d, 0xaf, 0xea, 0x42, 0xa0, 0x95, 0xdb, 0x02, 0xce, 0x52, 0x2c, 0xd3, 0x95, 0xe3, 0x82, 0xa4, 0x3b, 0xf0, 0x67, 0x44, 0xd9, 0xca, 0x31, 0xed, 0xb5, 0x26, 0xf0, 0xd3, 0x55, - 0x56, 0xd5, 0x14, 0x9d, 0x03, 0x3e, 0x53, 0xa9, 0x2a, 0x77, 0x3f, 0x5b, 0xac, 0x4d, 0x0b, 0x81, 0x5a, 0x82, 0x0b, 0xa9, 0x46, 0xc4, 0x5b, 0x6f, 0xdf, 0xe7, 0x4f, 0x57, 0xd9, 0x3b, 0xfc, 0xfa, - 0xad, 0xd3, 0xa9, 0x9d, 0x73, 0x3e, 0x4a, 0x54, 0xba, 0x4d, 0xe5, 0x8e, 0xa3, 0x83, 0x1d, 0xc5, 0xf1, 0x28, 0x9e, 0x76, 0x47, 0xbd, 0x28, 0xb8, 0xb0, 0xb1, 0x9d, 0x70, 0xa0, 0x92, 0xe7, 0x44, - 0x21, 0x50, 0xa6, 0x50, 0xe8, 0x86, 0xb7, 0x21, 0x82, 0x6a, 0x04, 0x49, 0x98, 0x0b, 0xbe, 0x82, 0x82, 0x4b, 0x49, 0x35, 0xa0, 0x0a, 0x2e, 0x95, 0x8d, 0x8e, 0x6c, 0xc1, 0x16, 0xcd, 0xb4, 0x40, - 0x18, 0x37, 0x37, 0xd9, 0x5e, 0x53, 0x43, 0xa7, 0xd1, 0x10, 0x04, 0x41, 0x00, 0xc9, 0x24, 0x8c, 0x27, 0xf0, 0x10, 0xde, 0x0e, 0x7a, 0xa1, 0xbe, 0x12, 0xcd, 0x69, 0x9d, 0xaa, 0x7d, 0x73, 0x3e, - 0x4c, 0xd3, 0xe8, 0xe9, 0xe6, 0x9a, 0xaf, 0xd0, 0x71, 0x34, 0xf8, 0x7c, 0xf3, 0x3f, 0x44, 0x42, 0x70, 0xd1, 0x69, 0xb4, 0x73, 0x2d, 0x61, 0xae, 0x47, 0x3c, 0x5d, 0x51, 0x3b, 0xbe, 0x16, 0x80, - 0x6c, 0x43, 0x05, 0x67, 0x7a, 0x6c, 0xf3, 0xe1, 0xef, 0xdf, 0x5e, 0x96, 0x8c, 0xe3, 0x1c, 0x75, 0xb9, 0x99, 0x32, 0xd2, 0xfd, 0x6c, 0x2f, 0xa0, 0x72, 0xf7, 0x35, 0x7e, 0x8d, 0xe6, 0x95, 0x69, - 0xbf, 0x9a, 0x67, 0x2f, 0xab, 0xd9, 0xfa, 0x0d, 0x8b, 0xe9, 0x8e, 0xb6, 0xf7, 0x9b, 0x37, 0xb5, 0x62, 0xdf, 0x31, 0xbe, 0xa0, 0xb6, 0xdb, 0x71, 0x3a, 0x95, 0x4f, 0x8d, 0x34, 0xd7, 0xde, 0x7f, - 0x9e, 0x51, 0xf6, 0xf9, 0x0b, 0xd9, 0x10, 0x1f, 0x9f, 0xd1, 0x06, 0x81, 0x32, 0xaa, 0xde, 0x8f, 0x00, 0x95, 0x55, 0xeb, 0x27, 0x0c, 0x28, 0xdb, 0x90, 0x9c, 0x66, 0xfa, 0xe6, 0xc1, 0x54, 0x71, - 0xb1, 0x6b, 0x84, 0xa0, 0x66, 0x09, 0x5e, 0x04, 0xfd, 0xff, 0x2c, 0x4a, 0x35, 0x70, 0xa2, 0x61, 0xef, 0x08, 0x36, 0x4e, 0xa7, 0x8c, 0x89, 0xa1, 0xea, 0x53, 0x96, 0x19, 0xb5, 0x85, 0xe0, 0x5f, - 0x30, 0x55, 0x30, 0xd3, 0xf6, 0x67, 0x54, 0xb4, 0x80, 0xfa, 0xe8, 0x9b, 0x57, 0xfb, 0x58, 0x80, 0x5a, 0x12, 0x65, 0x06, 0x7d, 0x42, 0x99, 0x34, 0xef, 0xe6, 0x3c, 0xd7, 0x33, 0x91, 0xeb, 0xaf, - 0x36, 0xcc, 0xb5, 0xe3, 0x50, 0x9f, 0xe4, 0xf9, 0x8c, 0xa4, 0x4f, 0xda, 0xaf, 0x74, 0x2d, 0x84, 0x76, 0x51, 0x4f, 0xf3, 0xba, 0xf0, 0x6b, 0x59, 0x16, 0xbd, 0x06, 0x7b, 0x7e, 0x59, 0x60, 0x65, - 0xcb, 0x19, 0xc7, 0xa3, 0x9b, 0xa8, 0x3b, 0xb9, 0x0a, 0x93, 0xa8, 0x37, 0x88, 0x83, 0x7d, 0xd3, 0x34, 0x8f, 0x9e, 0x33, 0xe8, 0xeb, 0x0d, 0x62, 0xdf, 0xa0, 0x0e, 0xa9, 0x3d, 0x37, 0x08, 0x2a, - 0xf8, 0x23, 0xcb, 0x7a, 0xa8, 0x30, 0x55, 0x57, 0x44, 0x62, 0x8f, 0x0a, 0x5b, 0xc4, 0x9f, 0xa2, 0xee, 0xd4, 0xc8, 0xed, 0xf6, 0x3c, 0x73, 0xf2, 0x68, 0x9e, 0xaa, 0x73, 0xcf, 0xe9, 0xcc, 0x29, - 0xcb, 0x2a, 0x9e, 0x41, 0x1f, 0xa2, 0x4f, 0x83, 0x44, 0xeb, 0x7b, 0x34, 0xf2, 0x3f, 0x6b, 0x4f, 0x4b, 0x05, 0xb3, 0x92, 0xc6, 0x2c, 0x48, 0x4e, 0x9a, 0x81, 0xef, 0x6b, 0xf2, 0x8a, 0x30, 0x08, - 0x5c, 0xad, 0xc2, 0x3d, 0xa0, 0x1d, 0x72, 0x55, 0x92, 0xd7, 0x8a, 0xb5, 0x19, 0x86, 0xa4, 0xa9, 0xd6, 0xe9, 0x1c, 0x08, 0x7f, 0x3b, 0x38, 0x46, 0x97, 0x56, 0xee, 0xd6, 0x1e, 0xb8, 0xce, 0x1b, - 0xfe, 0x77, 0x5e, 0xb3, 0xe2, 0x75, 0xb9, 0x75, 0x38, 0x5e, 0xca, 0x76, 0x3a, 0xc7, 0x82, 0x6d, 0x4e, 0xaa, 0x48, 0xbd, 0x9a, 0x19, 0x13, 0xb8, 0xcf, 0x5f, 0x36, 0x2b, 0x3f, 0xe5, 0x6c, 0x4e, - 0x17, 0x75, 0x96, 0x62, 0x24, 0x59, 0xb8, 0x5f, 0xf2, 0xba, 0xe6, 0x6d, 0xa3, 0xf9, 0x42, 0x64, 0x2e, 0xe4, 0xe8, 0x59, 0x21, 0x2b, 0x87, 0xf3, 0xf2, 0xa0, 0x87, 0x39, 0xd9, 0x61, 0x16, 0x3d, - 0x17, 0xc4, 0x9c, 0x3b, 0xfa, 0x06, 0x3a, 0xef, 0x83, 0xbb, 0x96, 0xa8, 0xe1, 0xf7, 0x2b, 0x64, 0x98, 0xd3, 0x95, 0x0c, 0x5c, 0xf0, 0x3c, 0x5d, 0x38, 0x70, 0xfa, 0xdf, 0x9a, 0x76, 0x06, 0x19, - 0x37, 0x45, 0x7c, 0xf3, 0x70, 0x37, 0xed, 0x8e, 0x86, 0xfd, 0xc1, 0x0f, 0xd3, 0x3d, 0xe7, 0x38, 0x09, 0xbe, 0x7e, 0xfd, 0xfc, 0x6b, 0xad, 0xc8, 0xf9, 0x88, 0x2c, 0x2b, 0x0d, 0xff, 0xf6, 0x3d, - 0x19, 0xde, 0xeb, 0xe7, 0x5e, 0x19, 0xe0, 0xd7, 0x63, 0x92, 0x44, 0x13, 0x9b, 0x2f, 0xd3, 0x59, 0xa2, 0x4f, 0x51, 0xf0, 0x76, 0xff, 0x2b, 0x31, 0x16, 0x87, 0xe3, 0x71, 0x14, 0x4f, 0x6f, 0xc2, - 0x38, 0x78, 0xd7, 0xfb, 0xad, 0x20, 0x45, 0x81, 0xa2, 0xbc, 0x10, 0xdb, 0xf6, 0xc9, 0xff, 0x42, 0xc4, 0xa1, 0x9c, 0xdb, 0xf0, 0x7e, 0xd8, 0xbd, 0x8e, 0xe2, 0x80, 0x8b, 0x45, 0xb5, 0x72, 0x1a, - 0x16, 0xbf, 0x62, 0x31, 0x73, 0xeb, 0x63, 0xf9, 0x70, 0x47, 0x28, 0x2b, 0xcb, 0xae, 0x37, 0x7a, 0x1c, 0xde, 0x8e, 0xc2, 0xde, 0xf4, 0x3e, 0xbe, 0x0d, 0xdc, 0x6a, 0x6f, 0x15, 0x58, 0x70, 0xcb, - 0xde, 0x58, 0x5f, 0xcb, 0x6d, 0xe0, 0x9c, 0xf2, 0x73, 0x45, 0x9e, 0x88, 0xa0, 0xe7, 0x07, 0x36, 0x9d, 0x5f, 0xf8, 0x7f, 0xf1, 0xff, 0x7a, 0x78, 0xd6, 0x36, 0x67, 0xa5, 0xb5, 0x4e, 0x7f, 0x14, - 0x1b, 0x18, 0x28, 0xfe, 0x84, 0x4c, 0x06, 0x1f, 0x5a, 0x97, 0x15, 0x10, 0x0c, 0x12, 0x42, 0x18, 0x0c, 0x7f, 0x03, 0x09, 0xaf, 0xc7, 0xa2, 0x10, 0xbc, 0x40, 0xa1, 0x28, 0x4a, 0xf7, 0x0c, 0x7a, - 0x23, 0x38, 0x75, 0xf4, 0xd0, 0x6e, 0x2a, 0xde, 0x0b, 0x75, 0xb9, 0x5b, 0xc2, 0x7b, 0x91, 0xbb, 0xa0, 0x33, 0x75, 0xe0, 0xb3, 0xe7, 0x5d, 0x39, 0xf5, 0x44, 0x66, 0xa1, 0x6c, 0x2e, 0x9d, 0x3c, - 0xe7, 0x5b, 0x20, 0x6b, 0xc5, 0x57, 0x44, 0x51, 0x3d, 0x9c, 0xec, 0x20, 0xe3, 0x5b, 0x56, 0x8d, 0xdb, 0xba, 0xcb, 0x1e, 0x25, 0xa5, 0x1c, 0x2d, 0x4c, 0xa8, 0xdb, 0x29, 0x32, 0x25, 0xf4, 0xe4, - 0x60, 0x06, 0x12, 0x3d, 0xc7, 0x19, 0x91, 0x12, 0xd6, 0xf2, 0x80, 0x1f, 0x2c, 0xbf, 0xae, 0x04, 0xdb, 0xed, 0x65, 0xd9, 0xd1, 0x0b, 0xc1, 0x97, 0x74, 0x46, 0x55, 0x39, 0xc9, 0x69, 0x26, 0xca, - 0x60, 0x46, 0x19, 0x11, 0x3b, 0xc8, 0x88, 0x22, 0x7e, 0x7d, 0xdd, 0x7a, 0x0d, 0x40, 0x79, 0x36, 0x04, 0xe5, 0xf0, 0xfb, 0x30, 0x7c, 0x9c, 0x3e, 0x44, 0xf1, 0xd5, 0x28, 0xa9, 0xc6, 0x10, 0x25, - 0xd6, 0xe8, 0x5a, 0x1a, 0xb3, 0xdf, 0xe8, 0x5b, 0xcd, 0x34, 0x9e, 0x43, 0x31, 0x86, 0xe0, 0xcc, 0x39, 0x03, 0xcc, 0x25, 0xd6, 0x32, 0xed, 0x18, 0xaa, 0xe5, 0xc6, 0xd1, 0x78, 0x74, 0x1f, 0xdf, - 0xd6, 0xb3, 0xef, 0x5e, 0xe6, 0x51, 0x9c, 0x5f, 0x70, 0xfc, 0xaf, 0x28, 0x2a, 0x4d, 0xfa, 0xdd, 0xde, 0x75, 0xf9, 0x3a, 0xcf, 0xd8, 0x89, 0x32, 0xcd, 0xfc, 0xd0, 0xcb, 0xd6, 0x41, 0x56, 0xa9, - 0x02, 0xdf, 0xf7, 0x0f, 0x99, 0x7b, 0x8d, 0xf7, 0x3a, 0xbf, 0x1d, 0xf0, 0x9a, 0xae, 0x55, 0x71, 0x32, 0x3f, 0x05, 0xdf, 0xa2, 0x90, 0x4b, 0xcc, 0x73, 0x68, 0x77, 0xed, 0x36, 0xe3, 0x7e, 0xfb, - 0x2f, 0xf7, 0x1f, 0xce, 0x57, 0x5f, 0xb9, 0xdf, 0x6c, 0x71, 0x96, 0xe6, 0x54, 0xdf, 0xbb, 0x01, 0x30, 0xdc, 0xb6, 0xf9, 0xcc, 0xdc, 0xed, 0xc9, 0x4e, 0x2a, 0x5c, 0xf9, 0x43, 0x54, 0xfe, 0x23, - 0xce, 0xba, 0x86, 0xe2, 0xfb, 0x92, 0x85, 0xce, 0xe1, 0xb4, 0xad, 0x23, 0x7e, 0xfa, 0xb3, 0x54, 0x82, 0xb2, 0xc5, 0x2f, 0x9d, 0xce, 0x40, 0x0e, 0xd7, 0x79, 0x3e, 0x12, 0xd1, 0xaa, 0x50, 0xbb, - 0xd3, 0x93, 0x32, 0x08, 0xf7, 0x49, 0x14, 0x0f, 0xc3, 0xbb, 0xc8, 0x3b, 0x39, 0x83, 0xb6, 0xd6, 0xfa, 0x1b, 0xf4, 0xe3, 0x30, 0x49, 0x1e, 0x47, 0x71, 0xcf, 0x3b, 0x39, 0x3b, 0x3b, 0x83, 0x23, - 0x03, 0xfd, 0xae, 0xc0, 0x0c, 0x99, 0xa2, 0x24, 0x97, 0x6f, 0x1a, 0x3b, 0x44, 0xa5, 0xe7, 0x87, 0x9a, 0xf4, 0xd8, 0x98, 0x16, 0x1c, 0xeb, 0xb3, 0xae, 0xfd, 0xbb, 0xfc, 0xf9, 0x59, 0x4b, 0x4a, - 0x50, 0x6c, 0x68, 0x8a, 0x63, 0x4e, 0x99, 0xba, 0x23, 0x8c, 0x2c, 0x50, 0xfc, 0xd2, 0xe9, 0x24, 0x98, 0xae, 0x05, 0x55, 0xbb, 0xb1, 0xe0, 0x8a, 0xa7, 0x3c, 0x87, 0x00, 0x2c, 0xf5, 0xe1, 0xf9, - 0x64, 0x57, 0xe0, 0x2f, 0x9d, 0xce, 0x24, 0x97, 0x1f, 0x2e, 0xbf, 0x87, 0x86, 0x13, 0x55, 0xe6, 0xfa, 0x34, 0xc7, 0xd3, 0x93, 0xc3, 0xac, 0x19, 0xd3, 0x9a, 0x40, 0x38, 0x39, 0xab, 0xec, 0xfa, - 0xfd, 0xf8, 0xea, 0x53, 0x46, 0xe5, 0x12, 0xb3, 0x03, 0x2c, 0xbd, 0x5a, 0x4c, 0xb6, 0xd3, 0xe8, 0x3d, 0x4b, 0xd7, 0xae, 0x6d, 0x38, 0xb6, 0x01, 0x8d, 0x05, 0xdf, 0xd0, 0x4c, 0xaf, 0x84, 0xae, - 0x54, 0x84, 0x65, 0x44, 0x64, 0xf4, 0x9f, 0x98, 0xb9, 0xb0, 0x25, 0x3b, 0xdd, 0x93, 0x04, 0x2a, 0x41, 0x71, 0x53, 0x7e, 0x4e, 0xe9, 0xde, 0x0e, 0x80, 0x88, 0x85, 0xed, 0x15, 0x5b, 0x9a, 0xdb, - 0x56, 0x63, 0x3e, 0xd0, 0x9a, 0xfd, 0x6d, 0xc6, 0xd5, 0x12, 0x1e, 0xcd, 0x2e, 0x5d, 0x7e, 0x39, 0x63, 0x9c, 0xb5, 0xab, 0x67, 0x34, 0xeb, 0xa7, 0xbe, 0xb7, 0xfd, 0xc6, 0xbc, 0xd1, 0xbd, 0xeb, - 0x4d, 0x6f, 0x07, 0xc3, 0x68, 0x1a, 0xc6, 0x3f, 0x24, 0x81, 0xf7, 0x9d, 0xe3, 0x78, 0x87, 0x17, 0x9b, 0x07, 0x6f, 0x5d, 0x90, 0xd5, 0x1a, 0x3d, 0x1a, 0x4f, 0xea, 0x87, 0x5e, 0x74, 0x75, 0xff, - 0x83, 0x3d, 0x6a, 0xa7, 0x39, 0x91, 0xb2, 0x20, 0x6a, 0xf9, 0xa2, 0x5d, 0xb9, 0xed, 0x5e, 0x79, 0xd9, 0xac, 0xd6, 0xb9, 0xa2, 0x77, 0x3c, 0x5b, 0xe7, 0x38, 0x2e, 0x3b, 0x61, 0xaf, 0x9a, 0x4b, - 0x83, 0x37, 0xe6, 0xca, 0x5a, 0x54, 0x75, 0x05, 0xee, 0x75, 0x97, 0x36, 0x7a, 0xe0, 0x7d, 0xa7, 0xfb, 0xa4, 0xd9, 0x12, 0x6f, 0xa3, 0x87, 0xe8, 0x16, 0x3e, 0x40, 0x63, 0x2a, 0xaf, 0xa6, 0x1d, - 0x7d, 0xbf, 0x9b, 0x83, 0x17, 0x2b, 0xe5, 0x87, 0xf2, 0xe2, 0x3f, 0x1a, 0x1f, 0x1a, 0x24, 0x5e, 0xfd, 0xb7, 0xe7, 0xfc, 0x9e, 0x4d, 0x9d, 0x4b, 0x75, 0xb4, 0xaa, 0xd7, 0xdb, 0xe8, 0x9f, 0xb0, - 0xab, 0x73, 0xa9, 0xde, 0x5b, 0xd6, 0xab, 0xd7, 0xbf, 0x21, 0xe1, 0x9d, 0x75, 0xbd, 0x7a, 0xbd, 0xdf, 0xd7, 0xb5, 0x8b, 0xa5, 0x8f, 0x05, 0x29, 0x3f, 0xc3, 0x57, 0x9f, 0x22, 0x74, 0x85, 0x1d, - 0x7f, 0xef, 0xab, 0xb7, 0x3e, 0xf3, 0x05, 0xe7, 0xe8, 0x03, 0x8e, 0xa1, 0x6a, 0x7c, 0xc1, 0x31, 0x52, 0x9d, 0x26, 0xdd, 0x24, 0x8a, 0xef, 0x06, 0xc3, 0x70, 0x12, 0x69, 0x30, 0x37, 0x28, 0xf1, - 0x99, 0x2a, 0x38, 0x4c, 0x95, 0x39, 0x3a, 0xbf, 0x3a, 0x3c, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, - 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x73, - 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x56, 0x5f, - 0x6f, 0xfb, 0x26, 0x14, 0x7d, 0xcf, 0xa7, 0xb0, 0xa2, 0x3d, 0xce, 0x90, 0xa4, 0x9b, 0x36, 0x45, 0xd4, 0x55, 0x35, 0xa5, 0x5a, 0xa5, 0x76, 0xad, 0x94, 0x6e, 0xda, 0x2b, 0xc5, 0x37, 0x0e, 0x9d, - 0x0d, 0x08, 0x70, 0xe2, 0x6a, 0xda, 0x77, 0x9f, 0x0c, 0xb6, 0x63, 0x3b, 0xb8, 0x7f, 0x7e, 0x52, 0x7f, 0x7d, 0x6a, 0xb8, 0xe7, 0xc2, 0x39, 0x97, 0x7b, 0x0f, 0x26, 0x57, 0x55, 0x91, 0x47, 0x07, - 0xd0, 0x86, 0x4b, 0x71, 0x39, 0x5f, 0xa2, 0xc5, 0x3c, 0x02, 0xc1, 0x64, 0xca, 0x45, 0x76, 0x39, 0xff, 0xf3, 0xe9, 0x26, 0xfe, 0x75, 0x7e, 0x95, 0xcc, 0x88, 0xd2, 0xf2, 0x05, 0x98, 0x8d, 0xaa, - 0x22, 0x17, 0xe6, 0x72, 0xbe, 0xb7, 0x56, 0xad, 0x31, 0x2e, 0xe8, 0x01, 0x04, 0xa2, 0x8a, 0xb2, 0x3d, 0x20, 0xa9, 0x33, 0xfc, 0xf8, 0x70, 0x8f, 0x7f, 0x42, 0x8b, 0x7a, 0x17, 0x87, 0x5c, 0x57, - 0x86, 0x77, 0xe8, 0xe3, 0xf1, 0x88, 0x8e, 0x17, 0x0e, 0xb7, 0x5a, 0x2c, 0x96, 0xf8, 0xef, 0xfb, 0xbb, 0x2d, 0xdb, 0x43, 0x41, 0x63, 0x2e, 0x8c, 0xa5, 0x82, 0xc1, 0x7c, 0x16, 0xb5, 0x7f, 0x95, - 0xe1, 0x6b, 0xe3, 0xa2, 0x77, 0x92, 0x51, 0xeb, 0xd8, 0xbd, 0x7b, 0x6a, 0x54, 0x23, 0x4c, 0x08, 0x52, 0x99, 0xd4, 0x2f, 0xc6, 0x0e, 0x88, 0x2a, 0x93, 0xce, 0x93, 0x59, 0x14, 0x91, 0x42, 0xa6, - 0x90, 0xff, 0xe5, 0xf5, 0x27, 0x2e, 0x46, 0xf0, 0x60, 0x6d, 0x56, 0xa3, 0x14, 0xd5, 0x20, 0x6c, 0xe2, 0xe8, 0x91, 0x4c, 0xcb, 0x52, 0xdd, 0xa6, 0x89, 0xd4, 0x19, 0x32, 0x4a, 0x73, 0x91, 0xed, - 0x34, 0x2d, 0xe0, 0x28, 0xf5, 0x3f, 0xe8, 0x59, 0x4a, 0x4b, 0x70, 0x8b, 0xf0, 0x78, 0xaa, 0x2d, 0xdf, 0x51, 0x66, 0x6f, 0xd3, 0xc4, 0xc3, 0xe3, 0x1a, 0x15, 0x1b, 0x4b, 0xb5, 0x05, 0x1d, 0xfb, - 0xbd, 0x09, 0xee, 0xc1, 0x7c, 0x5e, 0x73, 0x2b, 0xc9, 0x05, 0x5a, 0xa0, 0x9f, 0x09, 0x6e, 0x7f, 0xfa, 0xa0, 0x86, 0x9c, 0x5a, 0x7e, 0x80, 0x47, 0x6a, 0xf7, 0xd8, 0x29, 0xc1, 0x2d, 0xc9, 0x59, - 0x8f, 0x23, 0x93, 0x05, 0x82, 0x8a, 0x16, 0x2a, 0x07, 0x04, 0x07, 0x10, 0xd6, 0x0c, 0xd8, 0xf5, 0xb9, 0xed, 0x4a, 0xc1, 0xea, 0x3a, 0x8f, 0x99, 0x74, 0x3c, 0xea, 0xba, 0x2d, 0xe3, 0xed, 0x1f, - 0xd7, 0x8f, 0xdb, 0xdf, 0x1f, 0x9e, 0x06, 0x84, 0x88, 0xa0, 0x05, 0x24, 0x5b, 0xa7, 0x2e, 0xfa, 0x2d, 0x97, 0x65, 0x1a, 0xdd, 0x34, 0xdb, 0xad, 0xd7, 0x1b, 0x77, 0x6e, 0xb4, 0xf1, 0x34, 0x08, - 0x76, 0xd8, 0x3a, 0x29, 0x05, 0xc3, 0x34, 0x57, 0x35, 0x2a, 0xb9, 0x8e, 0x82, 0xd9, 0x3f, 0x46, 0xa5, 0x39, 0xad, 0x6e, 0x1a, 0x05, 0xfd, 0x44, 0x7f, 0x3f, 0x5a, 0x2a, 0xd0, 0x96, 0x83, 0x69, - 0xca, 0xf3, 0x42, 0x0f, 0x14, 0xb5, 0x04, 0x97, 0xbf, 0x10, 0x3c, 0x58, 0xf0, 0x98, 0xe6, 0x32, 0x58, 0xbd, 0x75, 0x17, 0x5a, 0x2d, 0x56, 0x2b, 0xb4, 0x40, 0x2b, 0x82, 0x83, 0x61, 0x9f, 0xc9, - 0x64, 0xa1, 0x78, 0x5e, 0xdf, 0x5d, 0x5e, 0x66, 0x5c, 0xa0, 0xd3, 0x4d, 0x2d, 0x97, 0x75, 0x03, 0x4d, 0xc5, 0x9b, 0x73, 0x4b, 0x0d, 0x3b, 0xae, 0xe1, 0x3c, 0xdb, 0x75, 0xdf, 0x54, 0xd8, 0x27, - 0xfb, 0xce, 0x6e, 0x0f, 0x40, 0x8a, 0xd6, 0xad, 0x67, 0x41, 0x9b, 0xc4, 0xea, 0x12, 0x08, 0x9e, 0x8e, 0x07, 0xf3, 0x8d, 0x2c, 0x35, 0x03, 0x57, 0xa1, 0x70, 0x24, 0x98, 0x65, 0xa9, 0xce, 0xc0, - 0x86, 0xb2, 0x9a, 0x88, 0xcf, 0x6a, 0x4c, 0x03, 0x3d, 0x97, 0x3c, 0x4f, 0x9b, 0x0d, 0x37, 0x8d, 0xb9, 0x24, 0xce, 0x5b, 0x08, 0x7e, 0x13, 0x33, 0xdc, 0x46, 0x83, 0x92, 0xda, 0x72, 0x91, 0x21, - 0x59, 0x5a, 0x55, 0xda, 0xa9, 0xad, 0x26, 0x71, 0x7e, 0x4a, 0x7a, 0xad, 0xe2, 0x9b, 0x50, 0x81, 0x48, 0x41, 0xb0, 0xd7, 0x7b, 0x2a, 0x68, 0x06, 0xc5, 0x69, 0xd0, 0xbb, 0x50, 0xd7, 0x57, 0x03, - 0x7c, 0xd2, 0xb9, 0xd5, 0x9b, 0x96, 0xe0, 0x1a, 0x68, 0xe4, 0x09, 0x13, 0xbe, 0xe0, 0xa0, 0x71, 0xff, 0xd8, 0x73, 0x5b, 0x18, 0x58, 0xc3, 0x0f, 0xff, 0x86, 0xba, 0xf4, 0xbf, 0x91, 0x59, 0xb8, - 0x14, 0xfb, 0xaa, 0x20, 0x51, 0xb2, 0x20, 0xd8, 0xfd, 0x77, 0x0a, 0x18, 0x26, 0x15, 0x24, 0xbc, 0xa8, 0x8b, 0x46, 0xb0, 0xff, 0xd5, 0x8a, 0xc5, 0x63, 0xb5, 0xbd, 0x95, 0xa6, 0x28, 0x7d, 0x4c, - 0xbf, 0x82, 0xb3, 0x60, 0x01, 0x03, 0xe5, 0xfb, 0xac, 0x9f, 0xbe, 0xef, 0xa8, 0x94, 0xd9, 0x92, 0x5a, 0xa9, 0x03, 0x9e, 0x7a, 0x2e, 0xe8, 0x7b, 0x10, 0x3a, 0xc2, 0xf3, 0x2e, 0x2f, 0xab, 0xaf, - 0xe0, 0x13, 0xee, 0xae, 0xc9, 0xde, 0x6a, 0x19, 0xb5, 0x66, 0x5f, 0x53, 0xfb, 0x0a, 0x5a, 0xdf, 0x54, 0x26, 0x0b, 0x26, 0xf0, 0x0e, 0x76, 0x2d, 0xea, 0xc3, 0xbd, 0x06, 0x1d, 0xd3, 0x1c, 0x37, - 0x67, 0xbd, 0xe4, 0x7c, 0xa5, 0x35, 0x12, 0x67, 0xa8, 0xe3, 0x31, 0xef, 0x02, 0xa6, 0x37, 0x14, 0x7e, 0xe5, 0xb4, 0x30, 0x92, 0xdb, 0x7c, 0x59, 0x78, 0xf3, 0x6b, 0xb2, 0x03, 0x23, 0x3e, 0x94, - 0xec, 0xbf, 0x3f, 0x46, 0x6f, 0x43, 0x78, 0xc0, 0x07, 0x23, 0x3e, 0xf1, 0x9a, 0x04, 0xa7, 0x1c, 0x8f, 0x89, 0x7f, 0xa1, 0x92, 0xd1, 0x43, 0xf5, 0x01, 0x25, 0x13, 0x4f, 0xdb, 0x47, 0x94, 0xb4, - 0xbf, 0x5b, 0x1f, 0xc1, 0xe7, 0x97, 0xd9, 0xbf, 0x64, 0x33, 0xba, 0xdb, 0xde, 0xc6, 0x7d, 0xf5, 0x99, 0xa6, 0x34, 0x3f, 0x14, 0xfe, 0xf5, 0xb1, 0x52, 0xe6, 0x21, 0xed, 0x7d, 0xe5, 0xc2, 0x7d, - 0x74, 0xc5, 0xbe, 0x00, 0xd3, 0xba, 0xcf, 0xd8, 0xbf, 0xc9, 0xe2, 0x43, 0xc3, 0x33, 0x3d, 0x3e, 0x9f, 0x23, 0x33, 0x28, 0x24, 0xc1, 0xcd, 0x7c, 0x74, 0xaf, 0x67, 0x32, 0xfb, 0x3f, 0x00, 0x00, - 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x04, 0x05, 0xcc, 0x4f, 0x25, 0x03, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, - 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x45, 0x63, 0x68, 0x6f, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, 0x54, 0x4d, 0x4f, 0xe3, 0x30, 0x10, 0xbd, 0xe7, 0x57, 0x8c, 0x72, 0x4a, 0x50, 0xe5, 0x70, 0xa6, 0x80, 0x80, - 0x36, 0x40, 0x56, 0x2c, 0x45, 0x6d, 0x83, 0xb4, 0xb7, 0xba, 0xce, 0x34, 0x35, 0x24, 0xb6, 0x65, 0x3b, 0x65, 0x2b, 0xd4, 0xff, 0xbe, 0x72, 0x3e, 0x4a, 0xa9, 0xd8, 0x08, 0x7a, 0xe9, 0x78, 0x32, - 0x7e, 0xf3, 0xe6, 0xcd, 0x8c, 0x15, 0x65, 0xaf, 0x34, 0x47, 0x40, 0xb6, 0x96, 0x43, 0xcf, 0xe3, 0xa5, 0x92, 0xda, 0x82, 0xd4, 0x39, 0x31, 0x4a, 0x73, 0x91, 0xaf, 0x34, 0x2d, 0xf1, 0x4d, 0xea, - 0x57, 0xc2, 0x0a, 0x59, 0x65, 0x64, 0x55, 0x09, 0x66, 0xb9, 0x14, 0xcd, 0x11, 0x37, 0x28, 0x2c, 0x19, 0x39, 0x33, 0x76, 0xe6, 0x6f, 0x34, 0x86, 0xe6, 0x78, 0x53, 0xf1, 0x22, 0x43, 0x3d, 0xfc, - 0x01, 0xdc, 0x1b, 0x2e, 0x49, 0x65, 0x79, 0x41, 0xee, 0x91, 0x66, 0xa8, 0x53, 0xcb, 0x0b, 0xd3, 0x7b, 0x7f, 0x6d, 0xad, 0x22, 0xf7, 0xd6, 0xaa, 0xe6, 0x42, 0x7f, 0x70, 0x59, 0xf3, 0xe2, 0x22, - 0x27, 0x2d, 0xc3, 0xde, 0x68, 0x63, 0x51, 0xa3, 0xb4, 0x5b, 0x85, 0x64, 0x24, 0x4b, 0x25, 0x05, 0x0a, 0xfb, 0xa1, 0xcd, 0x0b, 0xdd, 0x50, 0x22, 0xd0, 0x92, 0x74, 0x9a, 0x0c, 0x3f, 0x39, 0x6b, - 0xfe, 0x69, 0x9a, 0x8c, 0xbf, 0x70, 0xef, 0x0b, 0xbd, 0x6d, 0x8d, 0x2f, 0x62, 0x0a, 0x99, 0xd7, 0x1c, 0x1f, 0x70, 0x83, 0x45, 0xdf, 0x77, 0x99, 0xe7, 0x4e, 0xdd, 0x2e, 0xc2, 0x58, 0x6a, 0x39, - 0xfb, 0x8e, 0xca, 0x7d, 0x4d, 0xab, 0x25, 0x27, 0x27, 0x43, 0xcf, 0xbb, 0xda, 0x57, 0x1d, 0xf8, 0x6e, 0x2e, 0xfc, 0xd0, 0x53, 0xd5, 0xb2, 0xe0, 0x0c, 0x58, 0x41, 0x8d, 0x81, 0x98, 0xad, 0x65, - 0x57, 0x06, 0xf0, 0x52, 0x15, 0x58, 0xa2, 0xb0, 0x06, 0x3a, 0xdf, 0x79, 0x8b, 0x78, 0x3e, 0xb3, 0x8e, 0xcd, 0xe5, 0x00, 0x8e, 0x1c, 0x97, 0xf0, 0xee, 0x01, 0x28, 0xcd, 0x37, 0xd4, 0x62, 0x47, - 0x7f, 0xc5, 0x05, 0x2d, 0xa0, 0xa9, 0x0d, 0x1e, 0x26, 0x77, 0x77, 0xf1, 0x14, 0x2e, 0xda, 0x33, 0xc9, 0xd1, 0x36, 0x56, 0xe0, 0x41, 0xfd, 0x3b, 0xe4, 0x40, 0x6a, 0x5a, 0x2e, 0xe6, 0x91, 0x96, - 0x18, 0x84, 0xe1, 0xd0, 0xf3, 0x00, 0xae, 0x26, 0x1b, 0xd4, 0x9a, 0x67, 0xe8, 0x52, 0x35, 0xf4, 0x8f, 0x68, 0x00, 0x55, 0xaa, 0xd8, 0x06, 0xc7, 0x5e, 0x2e, 0x54, 0xd5, 0x89, 0x12, 0xd6, 0x4c, - 0x01, 0xa2, 0x93, 0x26, 0xef, 0x09, 0xfc, 0x99, 0xa4, 0x53, 0x18, 0x4d, 0xc6, 0x31, 0xdc, 0xc7, 0xd3, 0xb8, 0xf5, 0x76, 0x1f, 0xe7, 0x7a, 0x0b, 0xba, 0x12, 0x82, 0x8b, 0x1c, 0x16, 0xe5, 0x46, - 0x80, 0x45, 0x63, 0x17, 0x04, 0xe0, 0x3a, 0xcb, 0xa0, 0x94, 0x1a, 0x6b, 0x07, 0x50, 0x03, 0x5b, 0x59, 0x01, 0x93, 0x19, 0x02, 0x17, 0xb0, 0x70, 0xce, 0xc8, 0xf5, 0x39, 0x72, 0x72, 0x47, 0xb3, - 0xba, 0x89, 0x1f, 0x0d, 0x32, 0xd7, 0x4a, 0x15, 0x9c, 0x51, 0x57, 0xeb, 0x1c, 0x8d, 0x35, 0x0b, 0xd2, 0x26, 0x8c, 0x9a, 0xff, 0x83, 0x35, 0x80, 0xf5, 0x81, 0x7d, 0x01, 0x07, 0xdb, 0x44, 0x56, - 0x5a, 0x96, 0x6d, 0x59, 0xc1, 0x61, 0x8d, 0x4e, 0xb8, 0xf6, 0x46, 0xa7, 0x1d, 0x40, 0xdb, 0x01, 0x37, 0x73, 0x41, 0x3d, 0x8f, 0x24, 0x79, 0xbc, 0x9d, 0x0c, 0xc0, 0x4f, 0xdc, 0x4d, 0x18, 0xc5, - 0x90, 0x64, 0x67, 0xef, 0xa7, 0x3b, 0x7f, 0x70, 0x98, 0xd1, 0x41, 0xdd, 0x72, 0x6d, 0x6c, 0x90, 0x8c, 0x1d, 0xd4, 0xf7, 0x90, 0x66, 0x0a, 0x19, 0x3c, 0xa3, 0x36, 0x5c, 0x8a, 0x3e, 0xcc, 0xd9, - 0x53, 0x3c, 0x7a, 0x8e, 0xa7, 0xb3, 0x64, 0xf2, 0xf8, 0x03, 0x70, 0x59, 0x69, 0x86, 0xbd, 0xb0, 0x93, 0x74, 0x3a, 0x8a, 0x7f, 0x80, 0x58, 0x2d, 0x5f, 0x90, 0xd9, 0x5e, 0xc8, 0xf4, 0xe6, 0x57, - 0x3c, 0x9a, 0xef, 0x31, 0x9b, 0xd1, 0x6a, 0x26, 0x0b, 0x2e, 0xe0, 0x58, 0xfd, 0x27, 0xba, 0x2d, 0x24, 0xcd, 0x82, 0xef, 0x51, 0x78, 0x3f, 0xdd, 0x81, 0x3f, 0x68, 0x40, 0xf6, 0xed, 0xd2, 0x68, - 0x2b, 0x2d, 0xe0, 0x7f, 0x4f, 0x31, 0x79, 0xe3, 0x76, 0x3d, 0xa6, 0x96, 0x36, 0x9d, 0x0f, 0xdb, 0x2d, 0x02, 0x20, 0x06, 0xed, 0x7c, 0xab, 0xb0, 0xdb, 0x74, 0x77, 0x4e, 0xb2, 0xc0, 0xbd, 0x62, - 0x44, 0x53, 0x91, 0xc9, 0xd2, 0x99, 0x41, 0x48, 0xac, 0x6c, 0x8a, 0x08, 0xc2, 0xcf, 0x97, 0x5b, 0x35, 0x02, 0xdf, 0x6d, 0x24, 0xd4, 0x6f, 0x8b, 0x7f, 0x14, 0x51, 0x77, 0x20, 0x48, 0xa7, 0x09, - 0x61, 0x1a, 0xa9, 0xc5, 0xc0, 0x77, 0xa2, 0x9d, 0x45, 0x11, 0xfe, 0xa5, 0xee, 0xf5, 0x20, 0x4c, 0x96, 0x51, 0x93, 0x3e, 0x24, 0x4b, 0x47, 0xb8, 0x51, 0x62, 0xe7, 0xed, 0xbc, 0x7f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x49, 0x1e, 0xc2, 0x1b, 0x96, 0x02, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, 0x6e, - 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, 0x53, 0x5f, 0x6b, - 0xdb, 0x30, 0x10, 0x7f, 0xd7, 0xa7, 0xb8, 0xc7, 0x04, 0x82, 0xbe, 0x40, 0x5e, 0xb2, 0x7a, 0x81, 0x84, 0x36, 0xcb, 0x68, 0xda, 0xed, 0x61, 0x8c, 0xa2, 0x28, 0x17, 0xe7, 0xa8, 0xad, 0x33, 0xa7, - 0x73, 0xb6, 0x50, 0xfa, 0xdd, 0x87, 0x64, 0x1b, 0x52, 0x52, 0xb2, 0xd6, 0x60, 0x6c, 0x99, 0xdf, 0x5f, 0xe9, 0xdc, 0x38, 0xff, 0xec, 0x4a, 0x04, 0xf4, 0x07, 0x9e, 0x1a, 0x43, 0x75, 0xc3, 0xa2, - 0xc0, 0x52, 0xda, 0xd8, 0x08, 0x85, 0x72, 0x2f, 0xae, 0xc6, 0x3f, 0x2c, 0xcf, 0xd6, 0xb1, 0xda, 0x03, 0x05, 0xb5, 0x2b, 0xac, 0xb7, 0x28, 0x85, 0x53, 0x2c, 0x59, 0x4e, 0xd3, 0x0f, 0x71, 0xee, - 0xdb, 0xa0, 0x54, 0xe3, 0x82, 0x82, 0xc6, 0xcf, 0x33, 0xee, 0xb1, 0xa4, 0xa8, 0xe2, 0xe4, 0x2a, 0x75, 0xcb, 0xac, 0x76, 0x93, 0x3f, 0x7e, 0x69, 0x9a, 0x8a, 0xbc, 0x53, 0xe2, 0xf0, 0x7f, 0x8a, - 0x6b, 0x95, 0x3d, 0x87, 0x3d, 0x95, 0xad, 0x60, 0x2f, 0x70, 0xc3, 0xac, 0x1f, 0x15, 0xf1, 0x15, 0xb7, 0x3b, 0xbb, 0x6f, 0x83, 0x4f, 0x50, 0xeb, 0x39, 0x28, 0xfe, 0x55, 0x5b, 0x63, 0x8c, 0xae, - 0x44, 0xbb, 0xea, 0x9e, 0x8f, 0x4a, 0xd5, 0xf5, 0xea, 0x03, 0xd1, 0x85, 0xc0, 0x9a, 0x6d, 0xed, 0x32, 0xa3, 0xdf, 0x6e, 0x9e, 0x99, 0xbd, 0x1b, 0xd1, 0xcc, 0x2e, 0xc1, 0xa3, 0x0e, 0x59, 0xa4, - 0x80, 0xf3, 0x23, 0x06, 0x8d, 0x67, 0x84, 0x21, 0xd8, 0x02, 0xdd, 0x0e, 0x25, 0xe3, 0xad, 0xaf, 0x5c, 0x8c, 0x63, 0xd3, 0xb4, 0xdb, 0x8a, 0x3c, 0xe4, 0x15, 0x5c, 0xd3, 0x80, 0x17, 0x63, 0x00, - 0x7a, 0x78, 0x4c, 0xa1, 0x3d, 0x1c, 0x99, 0x76, 0x50, 0x3b, 0x0a, 0xa3, 0x8d, 0x26, 0xe6, 0xaf, 0xdf, 0xe0, 0xa4, 0x8c, 0x63, 0x78, 0x31, 0x00, 0x00, 0x17, 0x07, 0x64, 0xa5, 0x0d, 0xd7, 0x83, - 0xe6, 0x1c, 0x93, 0x4e, 0x65, 0x6a, 0x00, 0x5e, 0x93, 0x69, 0xef, 0xd6, 0x65, 0xbc, 0xac, 0x02, 0x54, 0x37, 0x15, 0xd6, 0x49, 0x0a, 0xde, 0x1d, 0xa5, 0x3e, 0xce, 0x6c, 0x7d, 0x44, 0x11, 0xda, - 0x61, 0x5e, 0xf5, 0x4d, 0x72, 0x05, 0xc9, 0xc8, 0x5e, 0x6e, 0x74, 0xae, 0x01, 0x69, 0x40, 0xe3, 0x04, 0x8a, 0xe4, 0x7d, 0xc7, 0xc9, 0xb3, 0xcb, 0xd1, 0xbd, 0x0f, 0x4d, 0xa1, 0xc3, 0x59, 0xc1, - 0x7d, 0x85, 0x79, 0x36, 0x46, 0x63, 0x3b, 0xa8, 0x3e, 0x9c, 0x1a, 0x1c, 0x9d, 0x8f, 0xc6, 0x70, 0x1c, 0x1b, 0x95, 0xd6, 0x6b, 0x2b, 0xf8, 0x93, 0xf4, 0x50, 0xb8, 0x88, 0xcb, 0x10, 0x31, 0x44, - 0x52, 0x3a, 0xf6, 0xfd, 0x6e, 0xf1, 0xd4, 0x9f, 0xd4, 0xa4, 0xf7, 0x49, 0xd7, 0xdb, 0xbf, 0xd2, 0x2e, 0xbf, 0xfd, 0x58, 0xdf, 0xce, 0x9f, 0xbe, 0x3f, 0xde, 0xdc, 0x2d, 0x8b, 0xa7, 0xd5, 0xfc, - 0x61, 0xb1, 0xfe, 0xba, 0xc9, 0xbb, 0x97, 0xf6, 0x2f, 0xdd, 0xaf, 0xe6, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd2, 0xfa, 0xdc, 0x7c, 0x96, 0x01, 0x00, 0x00, 0xfc, 0x03, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, - 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2a, 0x2e, 0x28, 0xca, 0xcc, 0x4b, 0xd7, 0x4b, 0xce, 0xc9, 0x2f, 0x4d, 0xd1, 0x4b, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xd3, 0x4b, 0x49, - 0x4d, 0xcb, 0xcc, 0xcb, 0x04, 0x31, 0x6d, 0x61, 0x62, 0x41, 0xf9, 0xa5, 0x25, 0xa9, 0x45, 0x5c, 0xd8, 0xd5, 0x17, 0xe5, 0x97, 0x96, 0x64, 0xe6, 0xa5, 0xeb, 0xa6, 0x56, 0x14, 0x14, 0xa5, 0x16, - 0x17, 0x83, 0xf4, 0x65, 0xa4, 0x26, 0xa6, 0xa4, 0x16, 0x15, 0x47, 0xab, 0x27, 0xa7, 0xea, 0x96, 0x54, 0x16, 0xa4, 0xaa, 0xc7, 0x72, 0x01, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, - 0xfd, 0x80, 0x5f, 0x6d, 0x54, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, - 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, - 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x6a, - 0x61, 0x76, 0x61, 0xdc, 0x55, 0x5d, 0x6f, 0x22, 0x37, 0x14, 0x7d, 0x9f, 0x5f, 0x71, 0xc5, 0xd3, 0x20, 0x8d, 0x1c, 0xda, 0xa7, 0xd5, 0x52, 0xaa, 0x25, 0x64, 0xa4, 0x65, 0xd5, 0x00, 0x1a, 0x86, - 0xad, 0xfa, 0xb4, 0x32, 0x9e, 0x1b, 0xc6, 0x59, 0x63, 0x7b, 0xed, 0x3b, 0x90, 0x68, 0xb5, 0xff, 0xbd, 0xf2, 0x0c, 0x90, 0x21, 0x45, 0x84, 0xaa, 0x42, 0x6a, 0x9b, 0x97, 0x98, 0xf1, 0xb9, 0xdf, - 0xe7, 0xf8, 0x5a, 0x2e, 0xbe, 0xf2, 0x15, 0x02, 0x8a, 0xd2, 0xf4, 0xa3, 0x48, 0xae, 0xad, 0x71, 0x04, 0x9e, 0x38, 0x49, 0x01, 0xc6, 0xad, 0x58, 0xc9, 0xd7, 0xc2, 0xa1, 0x27, 0x76, 0xcf, 0x49, - 0x94, 0xe8, 0x86, 0xde, 0xa3, 0x23, 0xc6, 0xeb, 0x7f, 0x79, 0xc9, 0xa9, 0x7f, 0x81, 0x91, 0x67, 0xf8, 0xad, 0xe2, 0x2a, 0x37, 0x97, 0x81, 0xb5, 0xa1, 0x49, 0xa5, 0xd4, 0x67, 0xae, 0x2a, 0x3c, - 0x65, 0xe1, 0xad, 0x93, 0x7a, 0xf5, 0xe0, 0xf8, 0x1a, 0xb7, 0xc6, 0x7d, 0x65, 0x42, 0x99, 0xaa, 0x60, 0x0f, 0x95, 0x16, 0x24, 0x8d, 0x6e, 0x7e, 0xe2, 0x06, 0x35, 0xb1, 0x51, 0x38, 0xa6, 0xe1, - 0x78, 0x8f, 0xde, 0xf3, 0x15, 0x2e, 0x48, 0x2a, 0xcf, 0xc6, 0x77, 0x57, 0x71, 0x3b, 0x9f, 0x2e, 0xb2, 0x51, 0x7a, 0x1d, 0xd7, 0xb3, 0x74, 0xf4, 0x39, 0xcd, 0xe6, 0xe3, 0xe9, 0xe4, 0x3a, 0xfe, - 0x17, 0xb7, 0x9f, 0xd2, 0x51, 0x7e, 0x15, 0xdf, 0xf9, 0x1f, 0xb3, 0xf4, 0x85, 0x5b, 0x8f, 0x7c, 0xc3, 0x99, 0x46, 0x62, 0x8b, 0x6c, 0xdc, 0x3f, 0xfa, 0x58, 0x91, 0x54, 0x6c, 0xb1, 0x68, 0x0d, - 0x27, 0x84, 0x7f, 0xac, 0xb4, 0x24, 0xf6, 0x58, 0x59, 0x49, 0xe8, 0x18, 0xb7, 0x92, 0xe5, 0xe8, 0xe9, 0x08, 0xf2, 0x3a, 0xc3, 0x25, 0x72, 0xed, 0xd9, 0x03, 0x17, 0x64, 0xdc, 0x33, 0xe3, 0x5a, - 0x9b, 0x50, 0x8d, 0xd1, 0x6c, 0x58, 0x91, 0xd9, 0x4a, 0x87, 0xc5, 0x79, 0x73, 0x63, 0x88, 0x51, 0x60, 0xa4, 0x30, 0x9a, 0xf0, 0x89, 0xd8, 0xbc, 0x46, 0xdc, 0x1a, 0x43, 0x6f, 0xc7, 0x7e, 0xc3, - 0x98, 0xfd, 0x8e, 0xcb, 0x54, 0x6f, 0xa4, 0x33, 0x7a, 0x8d, 0xfa, 0x52, 0x5f, 0x5b, 0x5c, 0x32, 0xa1, 0x64, 0x68, 0x72, 0x70, 0x92, 0xa1, 0xa7, 0x1c, 0xd7, 0x56, 0x71, 0xc2, 0xb3, 0x1e, 0x4a, - 0x22, 0xcb, 0x3e, 0x12, 0xd9, 0x8f, 0xc8, 0x0b, 0x74, 0xfe, 0x6d, 0xf0, 0x3d, 0x16, 0x92, 0xe7, 0xcf, 0xf6, 0x02, 0xbf, 0x19, 0x7e, 0xab, 0xd0, 0x53, 0xaa, 0x49, 0xd2, 0xf3, 0x25, 0x70, 0x6f, - 0x8d, 0xf6, 0xb8, 0xc7, 0x47, 0x1f, 0x8e, 0x3b, 0x13, 0x0b, 0x15, 0x5e, 0x15, 0x0f, 0x03, 0x68, 0x2e, 0x5e, 0xe8, 0xe4, 0x87, 0xd6, 0x2a, 0x29, 0xf8, 0x8e, 0x70, 0xdc, 0xfb, 0x24, 0x02, 0x00, - 0xd8, 0x1e, 0xf5, 0x12, 0x06, 0x70, 0xdc, 0x5c, 0x96, 0x0d, 0x27, 0x77, 0xd3, 0xfb, 0x2f, 0xb3, 0x69, 0x96, 0x77, 0x23, 0x5b, 0x2d, 0x95, 0x14, 0x50, 0x9b, 0x9f, 0x8d, 0x10, 0x92, 0xf1, 0xf0, - 0x3d, 0x02, 0x88, 0x00, 0x3e, 0x1c, 0x38, 0x13, 0x01, 0x58, 0x27, 0x37, 0x9c, 0x10, 0x5e, 0xcf, 0x00, 0x5c, 0x4d, 0x8b, 0x00, 0x0f, 0x57, 0x01, 0xd9, 0x04, 0xdb, 0x18, 0x59, 0x40, 0x98, 0x60, - 0x2a, 0x4a, 0x33, 0xd6, 0xb6, 0xa2, 0xb8, 0x0b, 0x54, 0x3a, 0xb3, 0xf5, 0x90, 0x3e, 0x09, 0xb4, 0x21, 0x1e, 0x7c, 0x8f, 0xea, 0x6a, 0xe6, 0x14, 0x72, 0x02, 0x19, 0x60, 0x30, 0xe8, 0x94, 0xa8, - 0x94, 0xe9, 0xf4, 0x9b, 0xbb, 0xd6, 0x0c, 0x41, 0xe0, 0xfe, 0x34, 0x00, 0x8d, 0xdb, 0xf6, 0x5d, 0xdc, 0xed, 0xd7, 0xf0, 0x03, 0x84, 0xf1, 0xa2, 0x88, 0x5b, 0x8f, 0x47, 0x02, 0x9d, 0x9f, 0x58, - 0xaf, 0x73, 0x12, 0x36, 0xbe, 0x4b, 0x20, 0xc8, 0x8f, 0x39, 0xae, 0x0b, 0xb3, 0x0e, 0xc7, 0xb8, 0x5b, 0xe3, 0xc2, 0x1f, 0x23, 0xd3, 0x24, 0x18, 0x77, 0x4f, 0x5a, 0x07, 0x95, 0x27, 0xd0, 0x09, - 0x8b, 0xe4, 0xb4, 0xfb, 0xe6, 0x75, 0x4c, 0xa0, 0x13, 0xd8, 0xf0, 0xfe, 0xe6, 0x46, 0x19, 0xc1, 0x55, 0x69, 0x3c, 0xbd, 0x7f, 0xd7, 0x7b, 0xd7, 0xbb, 0x39, 0x63, 0xd8, 0xbc, 0x4d, 0x09, 0x74, - 0x42, 0x17, 0xa1, 0xd6, 0x95, 0xa6, 0x80, 0xad, 0xc1, 0xc7, 0xbc, 0xfa, 0xa5, 0x49, 0xf2, 0xd7, 0x30, 0x92, 0xfa, 0x33, 0x0c, 0x80, 0x4a, 0xe9, 0x59, 0xbd, 0x62, 0xf0, 0x49, 0x94, 0x5c, 0xaf, - 0x30, 0x3e, 0x94, 0x75, 0x44, 0x62, 0x66, 0x8d, 0xa7, 0x38, 0xf4, 0x74, 0x91, 0x8d, 0xe3, 0xce, 0x2e, 0xa7, 0x97, 0x1e, 0xd4, 0x7d, 0xd8, 0xc5, 0x0f, 0x1a, 0x89, 0x0f, 0x6a, 0x61, 0xc3, 0xd9, - 0xec, 0xb7, 0xf1, 0x68, 0x98, 0x8f, 0xa7, 0x93, 0x2f, 0x9f, 0xe6, 0xd3, 0xc9, 0x2b, 0xa3, 0x72, 0x37, 0x9f, 0x43, 0x65, 0xaf, 0xee, 0x97, 0xa6, 0x78, 0x8e, 0xeb, 0xc9, 0x77, 0x93, 0xc3, 0x4d, - 0x53, 0x4a, 0x43, 0xf8, 0x7d, 0xb5, 0x2f, 0x8b, 0x37, 0xde, 0x57, 0xc8, 0x56, 0x48, 0x73, 0xe2, 0x54, 0xf9, 0x91, 0x29, 0xb0, 0x3d, 0xb2, 0x4d, 0xd8, 0xa0, 0x71, 0x37, 0x81, 0xdd, 0xfa, 0x8d, - 0x7f, 0xee, 0xf5, 0xf6, 0xd3, 0xdb, 0xb1, 0x2d, 0x04, 0x86, 0x01, 0xb4, 0x7d, 0xdd, 0x86, 0x5c, 0x76, 0xa8, 0x56, 0xb8, 0x80, 0x4c, 0xa0, 0xbd, 0x9b, 0x0f, 0x4c, 0xf8, 0x0b, 0x6a, 0x1f, 0xaf, - 0xa9, 0xa8, 0x46, 0xfd, 0x78, 0x4b, 0x1e, 0x99, 0xa9, 0x28, 0x3c, 0x07, 0xdc, 0x63, 0x31, 0xd5, 0x75, 0x7b, 0xff, 0x9b, 0x5a, 0xf9, 0x5f, 0x2a, 0xe5, 0xac, 0x4e, 0xda, 0x1a, 0xf9, 0xdb, 0xfa, - 0x38, 0xa7, 0x8d, 0x53, 0xba, 0xf8, 0x67, 0xaa, 0xf8, 0x97, 0x69, 0xe2, 0x47, 0xf4, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xea, 0x65, 0xb0, 0x9a, 0x11, 0x03, 0x00, 0x00, - 0x82, 0x0b, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0xcc, 0x31, 0x0a, 0x02, 0x41, 0x0c, 0x85, 0xe1, 0x3e, 0xa7, 0x48, 0x2d, 0xd8, 0x58, 0xd9, 0xcc, 0x49, 0x44, - 0x42, 0x58, 0x33, 0x6e, 0x20, 0x66, 0x25, 0xc9, 0x32, 0xe8, 0xe9, 0x65, 0x2c, 0xb4, 0xfd, 0x1f, 0xdf, 0x8b, 0x6d, 0x2b, 0x6c, 0x58, 0xb1, 0x0b, 0xc0, 0xe5, 0x70, 0x05, 0xf5, 0x9b, 0x78, 0x51, - 0xd6, 0xcb, 0x04, 0x1b, 0xe6, 0x93, 0x17, 0xf9, 0x45, 0x7d, 0xcf, 0x76, 0x82, 0x65, 0xe5, 0x48, 0x99, 0x70, 0xaf, 0x7e, 0x3c, 0x43, 0x85, 0x3e, 0xa8, 0x82, 0xd5, 0xd4, 0xef, 0x34, 0x56, 0x2d, - 0xf9, 0x42, 0x6c, 0xd8, 0xd9, 0x72, 0x1e, 0xa4, 0x44, 0x51, 0x57, 0x67, 0x23, 0x97, 0x61, 0xea, 0xff, 0xf1, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5c, - 0x90, 0xcd, 0x6a, 0xc4, 0x30, 0x0c, 0x84, 0xef, 0x7a, 0x8a, 0x2c, 0xbe, 0x05, 0xd6, 0xba, 0xf4, 0x05, 0xfa, 0xb3, 0xd0, 0x2d, 0xa5, 0x14, 0x52, 0x7a, 0x2d, 0x8a, 0xad, 0x66, 0xbd, 0x38, 0x8e, - 0x91, 0xd5, 0x2c, 0x7d, 0xfb, 0x92, 0xc4, 0x2d, 0x65, 0x2f, 0xc2, 0xf3, 0x31, 0x96, 0x86, 0x79, 0x3c, 0x3c, 0xbf, 0xda, 0xd1, 0x83, 0x92, 0x0c, 0xac, 0x08, 0x3b, 0x3b, 0xce, 0x09, 0x2f, 0x42, - 0x39, 0xb3, 0xe0, 0x48, 0x33, 0xa7, 0x7d, 0x55, 0xf6, 0x4c, 0x02, 0xbb, 0xb6, 0xc5, 0x22, 0x0e, 0x47, 0x0a, 0x09, 0xdb, 0x16, 0xff, 0xfe, 0x55, 0xae, 0x5c, 0xf4, 0x3f, 0x07, 0x63, 0x4c, 0xd3, - 0xbd, 0x75, 0x8d, 0x31, 0x06, 0x2c, 0x65, 0xfd, 0x18, 0x38, 0xb1, 0x90, 0xb2, 0x07, 0xeb, 0x22, 0x95, 0x92, 0x49, 0x4f, 0x60, 0x3f, 0xc9, 0xe9, 0x24, 0xdf, 0x9b, 0xc8, 0x32, 0x9d, 0xd9, 0x29, - 0xd8, 0xc2, 0xaa, 0x21, 0x0d, 0x05, 0x6c, 0xc9, 0x12, 0xd2, 0x70, 0xc7, 0x94, 0x16, 0xa1, 0xe5, 0x66, 0xef, 0xc8, 0x9d, 0x78, 0xdb, 0x7f, 0x4c, 0xca, 0x31, 0x86, 0xa7, 0xe6, 0xf8, 0x70, 0xb8, - 0xdd, 0x2e, 0x05, 0xcf, 0x04, 0xad, 0x0d, 0x97, 0xb2, 0xcc, 0x31, 0x2e, 0x33, 0xcb, 0x66, 0x7f, 0x61, 0x5d, 0x17, 0xad, 0x4e, 0x4c, 0x7d, 0x3d, 0x87, 0x59, 0xc2, 0x4c, 0xca, 0xb8, 0xb0, 0xfe, - 0x2b, 0x44, 0x8f, 0x80, 0x3e, 0x14, 0x5d, 0x41, 0x7d, 0xd8, 0xd4, 0xef, 0x07, 0x21, 0x1f, 0x19, 0xa1, 0x7a, 0xae, 0x2b, 0xb9, 0xc2, 0xbf, 0x8d, 0x54, 0xbc, 0x26, 0x78, 0xef, 0x9a, 0xfb, 0xc9, - 0xf3, 0x16, 0x75, 0x2e, 0x6e, 0xf2, 0x8c, 0xf0, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, - 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, - 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, - 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, - 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, - 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x46, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, - 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0x9d, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, - 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, - 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, - 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, - 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x17, 0x67, 0x43, 0x2e, 0x35, 0xe3, - 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xb9, 0xfa, 0x65, 0x30, 0x28, 0xcb, 0xd2, 0x67, 0x16, 0xb2, 0x2f, 0x69, 0x3d, 0x48, 0xab, 0xcd, - 0x6a, 0x70, 0x37, 0xbe, 0x1d, 0x4d, 0xe6, 0xa3, 0xcb, 0x4f, 0xfe, 0x95, 0x3b, 0xb6, 0x10, 0x29, 0x2a, 0x05, 0x84, 0xff, 0x2b, 0x38, 0x61, 0x0c, 0xcb, 0x2d, 0xb0, 0x3c, 0x4f, 0x79, 0xc4, 0x96, - 0x29, 0x42, 0xca, 0x4a, 0xcb, 0xcf, 0x9a, 0x10, 0x63, 0xd0, 0xd2, 0xc0, 0x2e, 0x89, 0x6b, 0x2e, 0xd6, 0x7d, 0x50, 0x72, 0xa5, 0x4b, 0x46, 0x68, 0xcc, 0xc4, 0x5c, 0x69, 0xe2, 0xcb, 0x42, 0x1f, - 0xb0, 0x56, 0x83, 0xe4, 0xea, 0x60, 0x83, 0x14, 0xc0, 0x04, 0x74, 0x83, 0x39, 0x8c, 0xe7, 0x5d, 0xf8, 0x35, 0x98, 0x8f, 0xe7, 0x7d, 0x63, 0xe4, 0x69, 0xfc, 0xf0, 0xdb, 0x74, 0xf1, 0x00, 0x4f, - 0x41, 0x18, 0x06, 0x93, 0x87, 0xf1, 0x68, 0x0e, 0xd3, 0x10, 0x6e, 0xa7, 0x93, 0xe1, 0xf8, 0x61, 0x3c, 0x9d, 0xcc, 0x61, 0xfa, 0x19, 0x82, 0xc9, 0x17, 0xf8, 0xcf, 0x78, 0x32, 0xec, 0x03, 0x72, - 0x9d, 0x20, 0x01, 0xbe, 0x98, 0xe4, 0x2a, 0x03, 0x93, 0x1b, 0x3e, 0x31, 0xb6, 0xe4, 0xcd, 0x11, 0x0f, 0x20, 0xac, 0x64, 0x05, 0x49, 0xe5, 0x18, 0xf1, 0x15, 0x8f, 0x20, 0x65, 0x62, 0x5d, 0xb0, - 0x35, 0xc2, 0x5a, 0x6e, 0x90, 0x04, 0x17, 0x6b, 0xc8, 0x91, 0x32, 0xae, 0x4c, 0x5e, 0x15, 0x30, 0x11, 0x1b, 0x33, 0x29, 0xcf, 0xb8, 0x66, 0xda, 0x4e, 0x9d, 0xc4, 0x65, 0x1c, 0x0d, 0x3a, 0x3c, - 0xcb, 0x25, 0x69, 0xf8, 0x83, 0x6d, 0x98, 0x2f, 0x50, 0xfb, 0x17, 0xd7, 0x07, 0x53, 0x5c, 0x1e, 0xcf, 0x08, 0x2e, 0xfd, 0x28, 0x61, 0x42, 0x60, 0xaa, 0x8e, 0xd7, 0x0a, 0xcd, 0x53, 0x7f, 0x46, - 0x32, 0x47, 0xd2, 0x1c, 0xd5, 0x75, 0xa7, 0x93, 0x17, 0xcb, 0x94, 0x47, 0x10, 0xa5, 0x4c, 0x29, 0xb8, 0x67, 0x1b, 0x14, 0x4f, 0xc4, 0xf2, 0x1c, 0x69, 0x28, 0x4b, 0x91, 0x4a, 0x66, 0x30, 0x7d, - 0xef, 0x74, 0x4c, 0xf6, 0x73, 0xe2, 0x1b, 0xa6, 0x11, 0x94, 0x41, 0x1c, 0xc1, 0xca, 0x56, 0xf9, 0x5c, 0x93, 0x89, 0xed, 0x29, 0x0c, 0x66, 0xb3, 0x51, 0xf8, 0xfc, 0x38, 0x0a, 0xe7, 0xe3, 0xe9, - 0x04, 0x6e, 0xa0, 0x7b, 0xe5, 0xff, 0xdd, 0xff, 0x47, 0xf7, 0xda, 0x1e, 0x1d, 0x5c, 0x5c, 0xd8, 0xff, 0xe1, 0x02, 0x86, 0xb8, 0x62, 0x45, 0xaa, 0x61, 0x11, 0xde, 0x99, 0x8c, 0xc7, 0xce, 0x8d, - 0x0d, 0x3c, 0x33, 0xfe, 0x2f, 0xcb, 0x0a, 0x80, 0xff, 0x07, 0x23, 0x58, 0x91, 0xcc, 0xfa, 0xc0, 0x57, 0x20, 0x24, 0x7c, 0xa8, 0xf7, 0x2e, 0x28, 0xfd, 0x60, 0x92, 0x9e, 0x93, 0xdc, 0xf0, 0xd8, - 0x66, 0xc4, 0xda, 0x1e, 0xfc, 0x29, 0xcc, 0xe1, 0xe8, 0x73, 0xb0, 0xb8, 0x7b, 0x78, 0x1e, 0x4e, 0x9f, 0x26, 0x77, 0xd3, 0x60, 0xf8, 0x6c, 0x50, 0xdc, 0x40, 0xb7, 0x2e, 0x6c, 0xc2, 0x5c, 0xfa, - 0x16, 0x45, 0xb3, 0xbe, 0xed, 0xc4, 0xa7, 0x01, 0x97, 0x03, 0xcd, 0xbe, 0x31, 0xe2, 0x83, 0x03, 0x9c, 0x83, 0x6e, 0xe5, 0x1e, 0x00, 0x3e, 0x9e, 0xf0, 0xf0, 0x11, 0xba, 0x87, 0xbb, 0x2f, 0xbb, - 0xed, 0xbb, 0x4c, 0xb4, 0xdd, 0xeb, 0xce, 0x31, 0x5b, 0x33, 0x66, 0x3a, 0x57, 0xb6, 0xb0, 0x93, 0xef, 0xb2, 0x68, 0x1b, 0xbf, 0x0f, 0x65, 0xc2, 0xa3, 0x04, 0x32, 0xab, 0x4a, 0x91, 0x14, 0xae, - 0xa9, 0x1b, 0x9c, 0x81, 0x3b, 0xb2, 0x05, 0x2d, 0x6b, 0xfb, 0x46, 0x3c, 0xb8, 0x50, 0x1a, 0x59, 0x5c, 0xb7, 0x7e, 0xec, 0x12, 0x24, 0x05, 0xbe, 0x9f, 0xd8, 0xfb, 0xe0, 0x71, 0x34, 0x79, 0xae, - 0xe3, 0x9a, 0x85, 0xd3, 0xd9, 0x28, 0x34, 0x1d, 0xf6, 0x3c, 0x0b, 0x1e, 0x7e, 0x83, 0x9b, 0x1d, 0x43, 0x66, 0x74, 0xfd, 0x6c, 0x23, 0x06, 0x35, 0x7b, 0xe7, 0xa2, 0x3a, 0x47, 0x46, 0x99, 0x20, - 0xe1, 0x99, 0x6a, 0x29, 0x79, 0x9a, 0xc2, 0x12, 0x41, 0xb1, 0x8d, 0xd5, 0x93, 0x1f, 0xc5, 0xff, 0xef, 0x20, 0xfc, 0xab, 0xc0, 0xdb, 0xd3, 0x37, 0x61, 0x19, 0xd6, 0xbc, 0xee, 0xd8, 0xaf, 0x12, - 0xa5, 0x12, 0x59, 0xa4, 0xb1, 0x41, 0x5b, 0xa8, 0x4a, 0xfc, 0x8c, 0x50, 0x10, 0x8f, 0xf1, 0x20, 0x0b, 0xbb, 0xfe, 0x28, 0x28, 0xdd, 0xa9, 0x4c, 0xed, 0xf4, 0xdd, 0xe1, 0xb9, 0x84, 0x7c, 0x79, - 0x9e, 0x04, 0xf7, 0xa3, 0x5d, 0x98, 0xae, 0xf8, 0x9d, 0xb5, 0x05, 0xa5, 0x75, 0x04, 0x4e, 0x14, 0x9c, 0xa5, 0x8d, 0xe4, 0x31, 0x64, 0x8c, 0x0b, 0xcf, 0x59, 0x63, 0xb4, 0x56, 0xbf, 0x7f, 0xed, - 0xc1, 0xf7, 0x1d, 0x3b, 0xf3, 0xad, 0xd2, 0x98, 0xf9, 0xb2, 0xd0, 0x7e, 0x4e, 0x5c, 0xe8, 0x54, 0x78, 0xdd, 0x4b, 0x68, 0x48, 0x88, 0xd2, 0x8c, 0x34, 0xc6, 0xf6, 0xfa, 0x72, 0xe3, 0xb3, 0xb9, - 0xae, 0x96, 0x4c, 0xe1, 0x90, 0x13, 0x46, 0x5a, 0xd2, 0x16, 0x6e, 0x40, 0x60, 0x69, 0x17, 0x3c, 0xeb, 0xe3, 0xea, 0x6b, 0x63, 0x7f, 0xbb, 0x8f, 0x85, 0x32, 0x88, 0x8c, 0x19, 0x88, 0x6b, 0x3b, - 0xbf, 0x80, 0x69, 0xb2, 0x03, 0xd3, 0xfe, 0x1a, 0x75, 0xb0, 0x54, 0x32, 0x2d, 0x34, 0x9a, 0x32, 0xf2, 0x7a, 0x3d, 0x17, 0xab, 0xcd, 0xd8, 0x00, 0xc6, 0xab, 0xb7, 0x7b, 0x0c, 0x5f, 0xb8, 0xd2, - 0xaa, 0x0f, 0x64, 0x3a, 0x85, 0x6b, 0x23, 0xe0, 0x10, 0x25, 0x18, 0x7d, 0x33, 0xe2, 0xc4, 0x77, 0x1d, 0xa7, 0xcc, 0x3d, 0x5a, 0x28, 0x2d, 0xb3, 0xa6, 0xf1, 0x3d, 0xc3, 0x90, 0x33, 0x62, 0x19, - 0xea, 0x5d, 0xf2, 0x6a, 0x22, 0xb2, 0x86, 0xf4, 0x3a, 0x81, 0xde, 0xda, 0x85, 0x06, 0x27, 0x07, 0x11, 0xf5, 0xdf, 0xee, 0xb9, 0x26, 0x71, 0x55, 0xd6, 0x4c, 0x01, 0xdd, 0xb4, 0x2a, 0xe0, 0x7e, - 0x2b, 0x5f, 0x79, 0xe7, 0x80, 0xf8, 0x15, 0x03, 0x5e, 0xaf, 0x99, 0xf7, 0x1a, 0xfe, 0x58, 0xe4, 0x85, 0x9e, 0x6b, 0x42, 0x96, 0x9d, 0x8d, 0xa4, 0xb9, 0xe7, 0x06, 0x44, 0x91, 0xa6, 0xd7, 0x07, - 0x76, 0x34, 0x6d, 0x8f, 0x2c, 0x9b, 0xf1, 0x4e, 0x6b, 0x8e, 0xa2, 0xc6, 0xec, 0xd9, 0x40, 0x7a, 0xd7, 0x27, 0x4e, 0xf6, 0x37, 0x62, 0x9b, 0x3f, 0x33, 0x5d, 0xb9, 0xd8, 0x4f, 0x78, 0x2d, 0x56, - 0xda, 0x8f, 0xfa, 0xa6, 0x03, 0xce, 0x82, 0x69, 0x00, 0x6e, 0xb1, 0x58, 0xa5, 0xec, 0x8c, 0xdd, 0x35, 0xea, 0xda, 0x92, 0x77, 0xb6, 0xbf, 0xfb, 0xc6, 0xc6, 0x91, 0xe5, 0x57, 0x88, 0x98, 0x8e, - 0x12, 0xf0, 0xc6, 0xd3, 0x91, 0x7d, 0x2d, 0x9a, 0x97, 0x26, 0x1e, 0xa7, 0x15, 0xce, 0xb6, 0xdc, 0x28, 0x0c, 0xa7, 0x21, 0x98, 0xb0, 0x4c, 0x59, 0x7d, 0x30, 0xbd, 0xf6, 0xb6, 0xfc, 0x7f, 0x84, - 0xee, 0x87, 0xee, 0x09, 0x08, 0x2b, 0x50, 0x69, 0x5b, 0xce, 0xdb, 0x2b, 0x01, 0xde, 0xae, 0xcf, 0x66, 0x41, 0xfc, 0x54, 0xd5, 0x57, 0x5b, 0x48, 0xf5, 0x78, 0x87, 0x19, 0x3f, 0x4a, 0xa5, 0xc2, - 0xb6, 0x4c, 0x9b, 0xf1, 0x7a, 0x32, 0xfb, 0x7e, 0x5e, 0xc1, 0x69, 0xce, 0x5a, 0x48, 0x42, 0xf0, 0x7d, 0xff, 0xd4, 0x56, 0xa7, 0xfd, 0xaf, 0xd7, 0x77, 0x4a, 0xae, 0xc9, 0x8c, 0x79, 0x3b, 0x55, - 0x52, 0x58, 0xd5, 0xc0, 0xa1, 0xe0, 0xc8, 0x42, 0xe7, 0x85, 0x7e, 0x53, 0x62, 0x4e, 0x45, 0xf3, 0x58, 0x74, 0xea, 0x8b, 0xb2, 0x77, 0x20, 0x21, 0x3f, 0xed, 0x6d, 0xdb, 0x2a, 0x65, 0x84, 0xc2, - 0xfe, 0xe5, 0xf5, 0xce, 0xaa, 0xc8, 0x9f, 0x1c, 0xcb, 0xbe, 0xc5, 0x9c, 0x5a, 0x8e, 0x9d, 0x61, 0xe2, 0x6c, 0xda, 0x77, 0xe5, 0x1b, 0x11, 0x32, 0xf3, 0x9d, 0xe1, 0x78, 0xd8, 0x5f, 0x1e, 0x55, - 0x41, 0xbf, 0x01, 0xe5, 0x84, 0x94, 0xf6, 0xfa, 0xfe, 0xa1, 0x94, 0x69, 0x59, 0x25, 0xec, 0xd0, 0xfd, 0xc9, 0xc5, 0x55, 0x1b, 0x3c, 0x6d, 0x94, 0xfa, 0xb9, 0x60, 0x8e, 0x7e, 0x26, 0x99, 0x2d, - 0xc2, 0x3b, 0xaf, 0xa0, 0xb4, 0xdf, 0xb0, 0x78, 0x04, 0xb4, 0x0d, 0xd4, 0x50, 0x0a, 0x3c, 0x0e, 0xc8, 0xed, 0xc3, 0x17, 0xae, 0xbd, 0xab, 0xc6, 0xda, 0xae, 0xea, 0x1f, 0x12, 0x92, 0xa5, 0xfd, - 0xac, 0x3b, 0xa9, 0xf9, 0x33, 0x3a, 0x42, 0x24, 0x69, 0x87, 0x98, 0x8b, 0xf5, 0xb1, 0x4b, 0xac, 0x76, 0xcf, 0x35, 0x8b, 0xbe, 0x3d, 0x10, 0x8b, 0x4e, 0x7a, 0xb1, 0x89, 0xe9, 0x6f, 0x4d, 0x4c, - 0x9d, 0xea, 0x5f, 0xfb, 0xdf, 0xd1, 0xbb, 0xc8, 0xbe, 0x66, 0xda, 0x68, 0xda, 0x5f, 0x93, 0xd5, 0xaf, 0x7e, 0xd5, 0x27, 0x31, 0x2a, 0xcd, 0x85, 0xfd, 0x46, 0xeb, 0x81, 0x36, 0x31, 0x2a, 0xd8, - 0xb7, 0xf7, 0xf7, 0x46, 0xdd, 0x83, 0xe7, 0xf0, 0xac, 0x51, 0xa3, 0xd8, 0x78, 0xdd, 0xfb, 0xc7, 0xc9, 0xd3, 0xf3, 0x62, 0x3e, 0x0a, 0x8d, 0x2a, 0x77, 0x7b, 0xb5, 0x2c, 0xc1, 0xcf, 0x3f, 0x43, - 0xdb, 0xce, 0x59, 0x30, 0x9f, 0x3f, 0x4d, 0xc3, 0xe1, 0x7e, 0xe7, 0x09, 0x8f, 0x0e, 0xa2, 0x42, 0x12, 0xe6, 0x65, 0x79, 0xd3, 0x6a, 0x67, 0xef, 0xf1, 0x90, 0xad, 0x28, 0x61, 0xf4, 0xfb, 0x57, - 0xc8, 0x99, 0x52, 0xa5, 0xa4, 0xf8, 0xcc, 0xe9, 0x3d, 0x0a, 0x5f, 0xcb, 0xdb, 0x84, 0x51, 0x40, 0xc4, 0xb6, 0xc7, 0xcc, 0x07, 0x85, 0x4e, 0x50, 0x68, 0x1e, 0x31, 0x2d, 0xc9, 0x57, 0xa8, 0xdd, - 0x67, 0x9d, 0x67, 0x94, 0xe4, 0x60, 0xd1, 0x6b, 0x6b, 0xd9, 0x7f, 0x4d, 0xdd, 0x5b, 0xf7, 0x64, 0x25, 0x27, 0xa9, 0x31, 0x32, 0x9f, 0xf1, 0x33, 0x87, 0xb3, 0x61, 0xcd, 0x30, 0x6e, 0xdb, 0xb1, - 0x6d, 0xa5, 0xd5, 0x91, 0x19, 0x84, 0xba, 0x20, 0x51, 0x5d, 0xe0, 0xed, 0x27, 0x6b, 0x42, 0xfb, 0x3b, 0x72, 0x5a, 0x44, 0xff, 0x48, 0x92, 0x4f, 0xca, 0xcd, 0x0c, 0xf3, 0xa2, 0x2e, 0x71, 0xa9, - 0xb8, 0xae, 0x55, 0xd5, 0x35, 0x60, 0x95, 0xb9, 0xc6, 0x99, 0x10, 0x59, 0x6c, 0x9a, 0xe5, 0xd7, 0xad, 0xc6, 0xdb, 0xea, 0x6b, 0x1d, 0x68, 0x19, 0xed, 0x37, 0xd0, 0x32, 0x82, 0x1b, 0xb8, 0xad, - 0x3f, 0xe4, 0x05, 0x96, 0xee, 0xb7, 0xe7, 0x1c, 0xf8, 0x32, 0x47, 0xe1, 0xde, 0x3a, 0xbd, 0xa3, 0x77, 0xf5, 0xd4, 0x76, 0xbb, 0xbb, 0x0d, 0x57, 0x52, 0x35, 0x24, 0xbe, 0xb9, 0xe4, 0x35, 0x8b, - 0x7b, 0x6f, 0x61, 0x25, 0xed, 0xeb, 0xa2, 0xf6, 0xd7, 0xf3, 0x35, 0x31, 0xa1, 0x56, 0x48, 0xa6, 0x55, 0x3c, 0x5a, 0x46, 0x7d, 0xb8, 0xea, 0xc3, 0x9d, 0x14, 0x6b, 0xff, 0x3e, 0xf8, 0xef, 0xf3, - 0x63, 0x70, 0xb7, 0x18, 0x1d, 0x1d, 0x3f, 0xb9, 0x3a, 0x69, 0x19, 0x1d, 0x4e, 0xbe, 0x76, 0x3a, 0xaf, 0x9d, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, 0xac, 0xb9, 0x3d, - 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, - 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4b, 0x0a, 0xc2, - 0x40, 0x0c, 0xc6, 0xf1, 0x7d, 0xef, 0x92, 0x2f, 0x3e, 0x50, 0x50, 0xf0, 0x18, 0x1e, 0x20, 0xd5, 0xc1, 0xc6, 0xc7, 0x4c, 0x48, 0xa3, 0x82, 0xa7, 0x17, 0x67, 0xba, 0xe9, 0xce, 0x5d, 0xfe, 0x3f, - 0x08, 0xdf, 0x59, 0xc7, 0x70, 0xed, 0x9f, 0xa1, 0x25, 0x1f, 0xfd, 0x7e, 0x18, 0x22, 0x6c, 0xdc, 0x33, 0x7b, 0xb2, 0x82, 0x87, 0xbc, 0x52, 0x86, 0x98, 0x9c, 0x86, 0x84, 0xe2, 0x17, 0xae, 0xb0, - 0xe2, 0xdf, 0xd9, 0xb4, 0xc9, 0x14, 0xd4, 0x62, 0x8d, 0x1d, 0x96, 0x33, 0xa2, 0x4a, 0xd4, 0x6b, 0xc6, 0x47, 0xad, 0x7b, 0xbb, 0x98, 0x25, 0xff, 0x7b, 0x4e, 0x0b, 0x87, 0xdc, 0xc4, 0xb5, 0x01, - 0x4d, 0xff, 0xbc, 0xc0, 0x06, 0xdb, 0xb9, 0x51, 0x35, 0x5c, 0xc5, 0xbb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x62, 0xfd, 0x25, 0x59, 0x77, 0x00, 0x00, 0x00, 0xda, 0x00, - 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xc4, 0x57, 0x6d, 0x6f, 0xdb, 0xc8, 0x11, - 0xfe, 0xce, 0x5f, 0x31, 0xb5, 0x0d, 0x5c, 0x6c, 0x98, 0xd4, 0xa5, 0xc1, 0xa1, 0x80, 0xd0, 0x04, 0xf0, 0x5b, 0x72, 0x4a, 0x6d, 0x9f, 0xa1, 0xc8, 0x39, 0x1c, 0xee, 0x0a, 0x73, 0xb5, 0x1c, 0x89, - 0x1b, 0x2d, 0x77, 0xd8, 0x7d, 0xa1, 0x22, 0xa0, 0xe8, 0x6f, 0x2f, 0x66, 0x97, 0x94, 0xac, 0xd8, 0xee, 0xdd, 0x87, 0xa2, 0xf5, 0x27, 0x5a, 0x9c, 0xd7, 0x67, 0xe6, 0x99, 0x19, 0x1e, 0xc2, 0xfb, - 0x60, 0xa4, 0x57, 0x64, 0xa0, 0xb5, 0xf4, 0x05, 0xa5, 0xcf, 0xb2, 0x9f, 0x51, 0x4b, 0x6a, 0x10, 0x3c, 0xc1, 0x86, 0x82, 0x05, 0x83, 0xeb, 0x27, 0x52, 0x7f, 0xca, 0xb2, 0x59, 0xad, 0x1c, 0x38, - 0xd1, 0xb4, 0x1a, 0x87, 0x5f, 0x41, 0x92, 0xf1, 0x42, 0x19, 0x07, 0x02, 0x9c, 0x32, 0x4b, 0x8d, 0xb0, 0x18, 0x14, 0xe7, 0xc2, 0x61, 0x05, 0x64, 0xe0, 0x53, 0x6b, 0x95, 0x59, 0xc2, 0x85, 0xa6, - 0x50, 0x6d, 0xed, 0x8e, 0xa1, 0x1c, 0x24, 0x5d, 0x11, 0x5f, 0x0d, 0x6f, 0xce, 0xda, 0x56, 0x2b, 0x29, 0xf8, 0xb1, 0x40, 0x59, 0xd3, 0xab, 0xe3, 0xf2, 0x14, 0xd6, 0xb5, 0x92, 0x35, 0x58, 0xf4, - 0xc1, 0xb2, 0x33, 0x03, 0xfc, 0x06, 0x68, 0x01, 0xbe, 0x46, 0xa8, 0x84, 0x17, 0xd0, 0x0a, 0xc7, 0xfe, 0x3a, 0x25, 0xe0, 0xc7, 0xd9, 0xec, 0x0e, 0x2c, 0xfe, 0x23, 0xa0, 0xf3, 0x45, 0x96, 0x1d, - 0x1e, 0xc2, 0x35, 0x49, 0xa1, 0x01, 0xbf, 0xa2, 0x0c, 0x6c, 0x37, 0xcb, 0x6e, 0xc4, 0x0a, 0xc1, 0x05, 0x8b, 0xe0, 0x6b, 0xe1, 0xa1, 0xfc, 0x28, 0x3a, 0x01, 0xaf, 0xff, 0x02, 0x9f, 0x2e, 0xff, - 0x56, 0x82, 0x72, 0xa0, 0x8c, 0xf3, 0x42, 0x6b, 0xac, 0x38, 0x2d, 0x89, 0x43, 0x0e, 0xe7, 0x44, 0x1e, 0xde, 0x14, 0xdf, 0x47, 0xeb, 0xca, 0xa2, 0x83, 0x5e, 0xb1, 0xc8, 0xb2, 0x19, 0x81, 0xf3, - 0xc2, 0x7a, 0x70, 0x68, 0x3b, 0xb4, 0xa0, 0xd9, 0xa7, 0xde, 0x80, 0x0d, 0x06, 0xca, 0x62, 0xd4, 0x74, 0x66, 0x0d, 0x2e, 0x9a, 0xc9, 0xe7, 0x44, 0x7e, 0x6c, 0x83, 0x29, 0x8b, 0x6c, 0x56, 0x23, - 0x48, 0x6a, 0x1a, 0x61, 0xaa, 0xa4, 0xee, 0xa0, 0xf6, 0xbe, 0x1d, 0x8c, 0xf0, 0xcf, 0x22, 0x78, 0x6a, 0x84, 0x57, 0xc9, 0xdc, 0x5a, 0x78, 0x59, 0xa3, 0x83, 0x05, 0x59, 0x90, 0xb5, 0x30, 0x4b, - 0x74, 0x8c, 0x83, 0xa3, 0x60, 0x25, 0x9b, 0xaa, 0xb0, 0xc8, 0x26, 0x7b, 0xff, 0x6f, 0xc5, 0x18, 0xab, 0xf4, 0x0c, 0x6b, 0xa5, 0x35, 0xcc, 0x63, 0x1d, 0x5b, 0xb1, 0x14, 0x1e, 0x2b, 0xae, 0xbe, - 0x0d, 0xc6, 0x70, 0x9a, 0xc9, 0x79, 0x01, 0x13, 0x0f, 0x42, 0x3b, 0x02, 0x6a, 0xd1, 0x38, 0xa8, 0x70, 0x1e, 0x96, 0x4b, 0x7e, 0xdf, 0x92, 0xf5, 0x50, 0xfe, 0xf0, 0xfd, 0xf7, 0x3f, 0x94, 0x99, - 0x23, 0x10, 0xfd, 0x2b, 0xb4, 0x20, 0x85, 0x61, 0xb3, 0xc2, 0x7b, 0x21, 0x6b, 0xac, 0x40, 0x2d, 0xc0, 0x20, 0x56, 0x58, 0x25, 0x80, 0x18, 0x0b, 0x8f, 0xce, 0xbb, 0x67, 0xd1, 0xe1, 0x37, 0x65, - 0x2a, 0x18, 0xc3, 0x12, 0x1b, 0xa4, 0x84, 0x8b, 0xeb, 0x49, 0x96, 0x4d, 0xfc, 0x77, 0x0e, 0x2c, 0x32, 0x52, 0x68, 0xaa, 0x14, 0xad, 0x43, 0x0f, 0xe5, 0xfb, 0xfb, 0xdb, 0x8b, 0x87, 0xe9, 0xd5, - 0x87, 0xc9, 0xa7, 0xd9, 0xf4, 0x97, 0x12, 0xd0, 0x74, 0xca, 0x92, 0x69, 0xd0, 0x78, 0xe8, 0x84, 0x55, 0x62, 0xae, 0xb1, 0xc8, 0xb2, 0xb2, 0x2c, 0x5d, 0x8d, 0x5a, 0x83, 0x93, 0x56, 0xb5, 0x3e, - 0x3b, 0x04, 0x8b, 0xad, 0x16, 0x12, 0xe1, 0x5f, 0xa3, 0x62, 0x2e, 0x5c, 0x6d, 0x25, 0xcc, 0x37, 0xa9, 0xfb, 0x93, 0xa0, 0x95, 0xb0, 0x50, 0x1a, 0x1f, 0x49, 0x56, 0x24, 0x57, 0x68, 0x0b, 0x45, - 0xa3, 0x2f, 0x54, 0x9b, 0x8a, 0x18, 0x44, 0x5f, 0x27, 0x1d, 0x8b, 0x4b, 0xe5, 0xbc, 0xdd, 0x64, 0xf8, 0x35, 0x62, 0xb3, 0x17, 0xd5, 0xdb, 0x27, 0x9a, 0x59, 0xec, 0xde, 0x83, 0x3f, 0x26, 0x7c, - 0x00, 0xef, 0xde, 0xed, 0xc2, 0xe4, 0x54, 0x18, 0xa1, 0x43, 0x38, 0x0f, 0x4a, 0x57, 0xca, 0x2c, 0x7b, 0x62, 0x0e, 0x4d, 0x34, 0xe7, 0x9f, 0x23, 0x45, 0x7e, 0xba, 0x98, 0x80, 0x6a, 0xc4, 0x12, - 0x63, 0xaf, 0x70, 0xf1, 0x07, 0xc6, 0x15, 0x70, 0xbe, 0x81, 0x0a, 0x17, 0x22, 0x68, 0x7f, 0x0a, 0x9e, 0xd5, 0x53, 0x43, 0xb0, 0x2e, 0x08, 0xf8, 0xf8, 0xf9, 0x26, 0x69, 0x3e, 0x03, 0x1d, 0xdb, - 0xe8, 0x05, 0xf3, 0x0e, 0x9e, 0xfc, 0x1d, 0xf6, 0xef, 0xa2, 0x7a, 0x0a, 0xf6, 0xe4, 0xe4, 0x96, 0x3c, 0x9e, 0x9c, 0x8c, 0x61, 0xb2, 0x60, 0xb8, 0x60, 0x2d, 0x8c, 0xe7, 0x02, 0xa2, 0xe1, 0xf2, - 0xc4, 0xc8, 0x8c, 0xf0, 0xaa, 0xc3, 0xa4, 0x7b, 0x1a, 0x85, 0xb8, 0x6d, 0xa2, 0x50, 0xa5, 0x7c, 0x14, 0x89, 0xed, 0x50, 0x6c, 0x44, 0xa3, 0xcb, 0x58, 0x1a, 0xe6, 0x46, 0xc6, 0x3d, 0x10, 0x5f, - 0x9e, 0xdf, 0x3d, 0xdc, 0x9e, 0xcd, 0x26, 0x9f, 0xaf, 0x1e, 0x26, 0x37, 0x67, 0x1f, 0xae, 0xca, 0x04, 0x0f, 0xda, 0x2b, 0xd3, 0x6d, 0x1b, 0x81, 0xcd, 0x79, 0x1b, 0x70, 0x1c, 0xb3, 0x62, 0x4b, - 0x59, 0x74, 0x78, 0x65, 0x3a, 0x37, 0xce, 0x00, 0x72, 0x30, 0xa2, 0xc1, 0x31, 0x7c, 0x63, 0x2b, 0xe3, 0xbc, 0x3a, 0xa1, 0x03, 0x8e, 0xe1, 0x80, 0xf5, 0x0f, 0x5e, 0xc8, 0xab, 0x16, 0x1d, 0x82, - 0x72, 0x2e, 0xa0, 0x4b, 0xbd, 0xc1, 0x91, 0xfd, 0xda, 0x8f, 0x8e, 0xb3, 0x9f, 0x66, 0x7f, 0x7f, 0xc5, 0xd4, 0x76, 0xe3, 0xd1, 0xa8, 0x22, 0xe9, 0x8a, 0x34, 0x0c, 0xb8, 0xd2, 0xfd, 0x58, 0x58, - 0x58, 0xd1, 0xe0, 0x9a, 0xec, 0x2a, 0xbe, 0x1f, 0xc9, 0x60, 0x2d, 0x1a, 0x3f, 0xb2, 0xb8, 0x40, 0x8b, 0x46, 0xe2, 0xa8, 0xf6, 0x8d, 0x1e, 0x49, 0xb2, 0x58, 0xf0, 0xd3, 0x61, 0x7c, 0x12, 0xe4, - 0x8f, 0x99, 0xc6, 0x12, 0x1d, 0x4f, 0x60, 0x50, 0x26, 0xb5, 0xe4, 0x23, 0x28, 0x99, 0x94, 0x3c, 0x38, 0x53, 0xa5, 0x69, 0xb1, 0xe0, 0x5e, 0x67, 0x5c, 0x59, 0xfe, 0x25, 0x68, 0xc1, 0x62, 0x43, - 0x5d, 0xaa, 0x4e, 0x99, 0xdf, 0xa5, 0x02, 0x95, 0xec, 0x29, 0x4a, 0x2c, 0x2c, 0x35, 0x5b, 0xe4, 0x6f, 0xce, 0x3e, 0x5f, 0xdd, 0x3e, 0x9c, 0xdf, 0x4f, 0xae, 0x2f, 0x1f, 0xce, 0xa6, 0x1f, 0xee, - 0x6f, 0xae, 0x6e, 0x67, 0x9f, 0x9e, 0x2d, 0xc1, 0x1f, 0x80, 0xfe, 0x59, 0x63, 0x8f, 0x6b, 0x30, 0x04, 0x03, 0xf9, 0x65, 0x23, 0x3a, 0x34, 0x05, 0xcf, 0x8d, 0xc2, 0xad, 0x54, 0xfb, 0x96, 0xab, - 0x03, 0x79, 0x6e, 0x28, 0xf7, 0x56, 0x18, 0xb7, 0x40, 0x9b, 0xb7, 0x96, 0x96, 0x16, 0x9d, 0x83, 0x56, 0xc8, 0xd5, 0xb6, 0x27, 0xdf, 0xc1, 0x94, 0xd3, 0xdb, 0x02, 0xf0, 0x34, 0xc1, 0x06, 0x85, - 0x71, 0x69, 0x3b, 0xc4, 0x76, 0x24, 0xd0, 0x64, 0x78, 0xc4, 0x0d, 0xa3, 0x73, 0xe8, 0xa8, 0x9e, 0x34, 0xbc, 0x02, 0xfb, 0xb8, 0x06, 0xea, 0x30, 0x4b, 0xa7, 0x69, 0xa4, 0x7e, 0x43, 0x52, 0x1b, - 0x8c, 0xdb, 0x32, 0x72, 0x3b, 0x0b, 0x95, 0x01, 0x31, 0x6c, 0x54, 0xb4, 0x59, 0x70, 0x43, 0x78, 0x89, 0xc5, 0xd2, 0x62, 0x1c, 0xd4, 0x62, 0x4e, 0xdd, 0x8b, 0xcc, 0xb4, 0xc1, 0xec, 0x46, 0xc4, - 0x25, 0xb6, 0x9a, 0x36, 0x4f, 0xdd, 0x3f, 0x26, 0xbb, 0xa9, 0xa0, 0x8a, 0x62, 0x7b, 0x13, 0x02, 0x94, 0xf1, 0x04, 0x52, 0x07, 0xe7, 0xd1, 0xbe, 0xe4, 0xab, 0xd7, 0xcb, 0x3b, 0x38, 0x4c, 0x7b, - 0xc2, 0x5b, 0xc5, 0x5b, 0xc0, 0x25, 0xdb, 0xbb, 0x38, 0xde, 0x93, 0x85, 0xb3, 0xe9, 0xcd, 0xd0, 0xa6, 0x64, 0xfb, 0xe3, 0xc0, 0x6d, 0x9c, 0xc7, 0xc6, 0x65, 0xd9, 0x30, 0xcb, 0xf6, 0xf6, 0xac, - 0x68, 0xdb, 0x9e, 0x47, 0x77, 0x62, 0x85, 0x9e, 0x52, 0x3f, 0x71, 0x19, 0x1d, 0x9f, 0x15, 0xc2, 0xfc, 0x07, 0x9b, 0xa7, 0xa0, 0xd5, 0x0a, 0xa3, 0x4c, 0xcb, 0xf7, 0xca, 0x8d, 0x90, 0x73, 0xa2, - 0x55, 0x32, 0x27, 0x0c, 0xdc, 0xbc, 0x06, 0xb2, 0x70, 0xf3, 0x67, 0x90, 0xb5, 0x6a, 0x4f, 0xa1, 0x22, 0x74, 0xe6, 0x3b, 0x0f, 0x4c, 0x3e, 0x58, 0x73, 0x9e, 0x22, 0xcd, 0x95, 0x86, 0x78, 0x95, - 0x14, 0xbc, 0xbb, 0xe2, 0x3b, 0x61, 0x29, 0x98, 0x2a, 0x11, 0x69, 0xa0, 0x56, 0x02, 0x72, 0x57, 0x27, 0xea, 0x19, 0x18, 0xcb, 0xda, 0xc7, 0x03, 0xa9, 0x98, 0xbf, 0x7e, 0x54, 0xf3, 0xdd, 0x14, - 0x58, 0x2a, 0x5f, 0x87, 0x79, 0x21, 0xa9, 0x19, 0x7d, 0x20, 0x5a, 0x6a, 0xbc, 0x18, 0x6a, 0x3f, 0x23, 0xd2, 0x6e, 0xf4, 0x45, 0xcd, 0x8f, 0xe3, 0x85, 0x60, 0x12, 0x8f, 0xd7, 0x14, 0xf4, 0x5e, - 0xb5, 0x3e, 0xaa, 0x39, 0x2c, 0xd1, 0xa0, 0x8d, 0x7d, 0xf1, 0x68, 0x62, 0x67, 0xfd, 0x46, 0x95, 0xd4, 0xb4, 0xdc, 0xcc, 0x92, 0x9a, 0x62, 0x19, 0x5d, 0x14, 0x92, 0x6f, 0xad, 0xc2, 0xb3, 0x83, - 0xf1, 0x17, 0x35, 0xcf, 0x23, 0x85, 0xf2, 0x56, 0x87, 0xa5, 0x32, 0xe3, 0x37, 0xc5, 0x9b, 0xe2, 0xf5, 0x38, 0xad, 0xa0, 0xf3, 0x34, 0xe3, 0x2f, 0xa3, 0xd9, 0xb7, 0x47, 0x7b, 0x5b, 0x6a, 0xc4, - 0x0b, 0x6c, 0xbf, 0x09, 0xf2, 0x08, 0xc3, 0xdb, 0x85, 0xd0, 0x8e, 0x29, 0xf8, 0xb2, 0x56, 0xdf, 0x15, 0xbb, 0x0b, 0x53, 0x99, 0x8e, 0xd2, 0xbd, 0x97, 0x65, 0xef, 0xfb, 0x4d, 0x85, 0x5f, 0xe3, - 0x9d, 0xe9, 0x60, 0x8e, 0x9a, 0xd6, 0xa7, 0xd0, 0x6a, 0x14, 0x0e, 0x99, 0x76, 0xe9, 0x68, 0x4b, 0xdb, 0x3f, 0x52, 0xf7, 0x7e, 0x7a, 0x5d, 0xee, 0x8f, 0xf8, 0x1a, 0xc1, 0x52, 0xf0, 0xc8, 0x77, - 0x51, 0xac, 0xc4, 0x76, 0xef, 0x65, 0xd9, 0x2f, 0x14, 0x60, 0xd9, 0xab, 0x26, 0xa1, 0xf9, 0x06, 0x16, 0xa4, 0x35, 0xad, 0xb9, 0x40, 0x3d, 0x43, 0x5e, 0xea, 0x78, 0x65, 0x16, 0x7d, 0x02, 0x3c, - 0xfa, 0xa3, 0x91, 0x38, 0x94, 0xd8, 0xd3, 0xc9, 0xc9, 0x94, 0xed, 0xb9, 0xf1, 0xc9, 0xc9, 0x6e, 0x3a, 0x52, 0xf0, 0x6d, 0xf0, 0xa7, 0xe9, 0x56, 0x39, 0x8a, 0xa1, 0x7a, 0x02, 0xe5, 0x5d, 0xd2, - 0x2b, 0xb2, 0xec, 0xe1, 0x61, 0x36, 0xb9, 0x7b, 0x78, 0x18, 0x67, 0x59, 0xbf, 0x45, 0x82, 0x43, 0x28, 0x57, 0xa6, 0x64, 0x7d, 0xb3, 0x6d, 0xb2, 0x21, 0xdd, 0x60, 0x35, 0xcc, 0x37, 0xe3, 0xe7, - 0x4e, 0x9a, 0x95, 0x89, 0x87, 0x9b, 0xe2, 0x5b, 0x05, 0xf9, 0xd7, 0x39, 0xc2, 0x5f, 0xb7, 0x84, 0xe6, 0xf9, 0xfa, 0x2e, 0xd2, 0xdd, 0xd5, 0xb4, 0xee, 0x73, 0x0f, 0x56, 0x0f, 0x27, 0xcb, 0xfd, - 0xf4, 0xfa, 0xed, 0xd1, 0xab, 0xe7, 0x6c, 0x1c, 0xbd, 0x62, 0x66, 0xb1, 0x3e, 0x1c, 0xdd, 0xfd, 0x7c, 0x79, 0x0c, 0x39, 0x05, 0xab, 0x8f, 0x77, 0xf4, 0x66, 0x1f, 0x59, 0x76, 0x1f, 0x3b, 0xbc, - 0xec, 0x71, 0xea, 0x68, 0x85, 0xe5, 0xa3, 0x81, 0x13, 0x59, 0xec, 0xeb, 0xfc, 0x3c, 0x92, 0x94, 0xbd, 0x2b, 0xb3, 0x7c, 0x26, 0x8d, 0x47, 0xea, 0x90, 0xe7, 0x5e, 0x58, 0x2e, 0xd6, 0x01, 0x23, - 0x17, 0xbb, 0xe7, 0x00, 0xf2, 0x3c, 0x9e, 0xfb, 0x07, 0x47, 0xaf, 0xd6, 0x35, 0x89, 0x46, 0x1d, 0xf7, 0xdb, 0x78, 0xf2, 0x4d, 0xad, 0x41, 0x6a, 0xe1, 0x78, 0x50, 0xe8, 0xcd, 0xee, 0x2b, 0x85, - 0xcc, 0x6e, 0xc4, 0x9d, 0xee, 0x03, 0xac, 0x91, 0xb7, 0x37, 0x85, 0x04, 0x73, 0xef, 0xb8, 0x15, 0xbe, 0xfe, 0xdd, 0x20, 0x9f, 0x8f, 0x87, 0x81, 0x91, 0xf7, 0xd3, 0xeb, 0xa7, 0xda, 0x92, 0x6b, - 0x98, 0x77, 0x7b, 0x59, 0xfd, 0xc6, 0x3b, 0xf0, 0x47, 0x38, 0xe0, 0x09, 0x80, 0xc6, 0xe7, 0xb3, 0x4d, 0x8b, 0x63, 0x8f, 0x5f, 0xfd, 0xa8, 0xd5, 0x42, 0x99, 0x5e, 0x60, 0x0d, 0x07, 0xbf, 0x0d, - 0xcf, 0xd5, 0xff, 0x17, 0x82, 0xbd, 0x24, 0xfe, 0x4b, 0xf1, 0x33, 0x64, 0xfc, 0xed, 0xa6, 0xf0, 0xa9, 0xbf, 0x74, 0x31, 0xef, 0x34, 0xe0, 0x9f, 0xe9, 0x3b, 0x69, 0x1f, 0xc7, 0xff, 0x3d, 0x0e, - 0xbf, 0x17, 0xd7, 0x36, 0x35, 0xb8, 0xd0, 0x28, 0x4c, 0x68, 0xe3, 0x77, 0x90, 0xe4, 0xe7, 0xf4, 0xed, 0x1a, 0xc7, 0x27, 0x56, 0xbb, 0x60, 0x6d, 0x30, 0x8f, 0xfc, 0x0c, 0x43, 0x56, 0xa3, 0x4f, - 0xa7, 0xcb, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2a, 0x28, 0xfe, 0x0e, 0x8f, 0x06, 0x00, 0x00, 0xc1, 0x0f, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, - 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, 0x25, 0xd9, 0xb9, 0xba, 0x7b, 0x9e, 0xb3, - 0x8f, 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, 0x70, 0x81, 0x1d, 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, 0xff, 0x7e, 0xd5, 0x33, 0x12, 0x92, 0x00, - 0x67, 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, 0xa3, 0x7e, 0x7f, 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, 0x9f, 0x53, 0x83, 0x73, 0x16, 0x52, 0xae, - 0x68, 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, 0x26, 0x24, 0x9c, 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, 0xf6, 0x9b, 0x83, 0xd7, 0x07, 0x90, 0xf2, - 0x88, 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, 0x12, 0xe6, 0x42, 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, 0x74, 0x4e, 0xb9, 0x56, 0x3e, 0xc0, 0x80, - 0x52, 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, 0xda, 0x30, 0x61, 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, 0x14, 0xf2, 0x1e, 0x26, 0x42, 0x02, 0x89, - 0x22, 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, 0x84, 0x9c, 0x1b, 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, 0x67, 0x1a, 0xc4, 0x92, 0x53, 0xa9, 0x66, - 0x2c, 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, 0xeb, 0x5c, 0x14, 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, 0x84, 0xf7, 0x54, 0x2a, 0x54, 0xf7, 0xa5, - 0x7f, 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, 0xf6, 0xd2, 0x3d, 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, 0x34, 0xd1, 0xc0, 0x38, 0x84, 0x62, 0x9e, - 0xc4, 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, 0xd6, 0x1c, 0x7c, 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, 0x20, 0xda, 0xa9, 0x39, 0x35, 0x00, 0x80, - 0x99, 0xd6, 0x89, 0x3a, 0x09, 0x82, 0xe5, 0x72, 0xe9, 0x13, 0x23, 0xad, 0x2f, 0xe4, 0x34, 0xc8, 0xd5, 0x0b, 0xce, 0x3b, 0xad, 0x76, 0x77, 0xd0, 0xf6, 0x5e, 0xfa, 0x47, 0x06, 0xe5, 0x9a, 0xc7, - 0x54, 0x29, 0x90, 0xf4, 0x73, 0xca, 0x24, 0x8d, 0x60, 0xbc, 0x02, 0x92, 0x24, 0x31, 0x0b, 0xc9, 0x38, 0xa6, 0x10, 0x93, 0x25, 0x3a, 0xce, 0xf8, 0xc7, 0xb8, 0x9d, 0x71, 0x58, 0x4a, 0xa6, 0x19, - 0x9f, 0x1e, 0x3a, 0x35, 0x50, 0xb9, 0xe7, 0xcb, 0xde, 0x29, 0xac, 0x95, 0x4b, 0xc7, 0x54, 0x05, 0x40, 0x70, 0x20, 0xe8, 0x1a, 0xb7, 0x39, 0x80, 0xce, 0xc0, 0x85, 0x57, 0xcd, 0x41, 0x67, 0x70, - 0x08, 0x37, 0x9d, 0xab, 0xb7, 0xbd, 0xeb, 0x2b, 0xb8, 0x69, 0xf6, 0xfb, 0xcd, 0xee, 0x55, 0xa7, 0x3d, 0x80, 0x5e, 0x1f, 0x5a, 0xbd, 0xee, 0x59, 0xe7, 0xaa, 0xd3, 0xeb, 0x0e, 0xa0, 0xf7, 0x1a, - 0x9a, 0xdd, 0x3f, 0x9c, 0x1a, 0xfc, 0xde, 0xe9, 0x9e, 0x1d, 0x02, 0x65, 0x7a, 0x46, 0x25, 0xd0, 0x87, 0x44, 0xa2, 0x06, 0x42, 0x02, 0x43, 0x4b, 0xd2, 0xa8, 0x14, 0x43, 0xb9, 0x04, 0x18, 0x22, - 0xd6, 0x3d, 0x2a, 0xa1, 0x21, 0x9b, 0xb0, 0x10, 0x62, 0xc2, 0xa7, 0x29, 0x99, 0x52, 0x98, 0x8a, 0x05, 0x95, 0x1c, 0x23, 0x24, 0xa1, 0x72, 0xce, 0x14, 0x3a, 0x54, 0x01, 0xe1, 0x11, 0xc4, 0x6c, - 0xce, 0xb4, 0x09, 0x24, 0xe5, 0xd4, 0xb6, 0xf5, 0xf2, 0x7f, 0x76, 0x86, 0xfd, 0x6c, 0x7a, 0x35, 0xb8, 0x20, 0x0b, 0xca, 0x61, 0xa0, 0x89, 0xd4, 0x70, 0x9d, 0xc0, 0x2b, 0xa2, 0xc3, 0x19, 0xa8, - 0x50, 0xb2, 0xc4, 0x06, 0x4c, 0x3f, 0x77, 0x7b, 0xbb, 0xfb, 0x1e, 0x16, 0x44, 0xaa, 0x93, 0x9d, 0x32, 0x98, 0xd0, 0x7a, 0xd7, 0x7c, 0xdf, 0x1c, 0xbe, 0xed, 0x5d, 0xb4, 0xc1, 0x83, 0x58, 0x84, - 0x36, 0xcf, 0xc5, 0x04, 0x08, 0xbc, 0x3b, 0xfb, 0x1d, 0x66, 0x62, 0x8e, 0x61, 0x20, 0x0d, 0xd9, 0x5e, 0x92, 0xe5, 0x62, 0x4e, 0x76, 0x17, 0x55, 0x43, 0xf4, 0xe2, 0xe5, 0x2e, 0x92, 0x73, 0x14, - 0xfb, 0xe5, 0x9e, 0x02, 0xc6, 0x95, 0x26, 0x71, 0x4c, 0xa3, 0x12, 0x7d, 0xc4, 0x6a, 0xbe, 0x6f, 0x77, 0x87, 0xbd, 0xcb, 0xab, 0x01, 0x78, 0x90, 0x10, 0x49, 0xe6, 0x54, 0x53, 0xa9, 0x20, 0x21, - 0xaa, 0x54, 0x9e, 0xde, 0x91, 0x05, 0x81, 0xf7, 0x17, 0xb0, 0x9c, 0x51, 0x0e, 0x32, 0xe5, 0xc6, 0xc7, 0xc6, 0x22, 0x36, 0x55, 0x80, 0xfa, 0x53, 0x1f, 0x81, 0x23, 0x3a, 0x4e, 0xb3, 0x37, 0xc0, - 0xb4, 0xa2, 0xf1, 0xe4, 0x10, 0xd3, 0x35, 0x83, 0x02, 0x50, 0x54, 0x97, 0x58, 0x36, 0xbc, 0x0f, 0x16, 0xc1, 0xfb, 0x20, 0x53, 0x7e, 0x17, 0x2d, 0x93, 0x13, 0x2d, 0x09, 0x57, 0x89, 0x90, 0xba, - 0x11, 0xe9, 0xa1, 0x12, 0xe1, 0x3d, 0xd5, 0x87, 0x8a, 0xca, 0x05, 0x95, 0x8d, 0xd5, 0xa1, 0x4a, 0x55, 0x42, 0x79, 0xd4, 0x58, 0x1d, 0x92, 0x28, 0xc2, 0x50, 0x6d, 0xfc, 0xfb, 0xe8, 0xe8, 0xa8, - 0xa4, 0xc7, 0xe0, 0xf7, 0xce, 0xe5, 0xb0, 0xdf, 0x02, 0x0f, 0x26, 0x31, 0x99, 0x1a, 0x81, 0x98, 0xb2, 0xe9, 0x27, 0x88, 0x29, 0x5d, 0xb9, 0x49, 0x64, 0x68, 0xaa, 0xc7, 0x4e, 0x73, 0xfe, 0xc0, - 0xcf, 0x71, 0xd8, 0x04, 0x3e, 0x82, 0xf7, 0x27, 0xb8, 0xf5, 0x8a, 0x48, 0x2e, 0x7c, 0x82, 0x53, 0xb4, 0x25, 0x77, 0x1c, 0x00, 0x0b, 0x34, 0x81, 0x80, 0xea, 0x30, 0xc8, 0xe5, 0x59, 0x03, 0xa0, - 0xa1, 0xfc, 0xca, 0x3b, 0x07, 0x60, 0xc2, 0xca, 0x88, 0x6e, 0x1d, 0x7d, 0x1d, 0xf8, 0xd9, 0x7b, 0x77, 0x13, 0x79, 0xf3, 0x7d, 0x46, 0x00, 0xff, 0xad, 0x41, 0x6f, 0x50, 0xe4, 0xae, 0x4a, 0x13, - 0xb4, 0xb6, 0x0f, 0x50, 0x5f, 0x10, 0x09, 0xc3, 0x79, 0xaa, 0xf4, 0x10, 0xc6, 0xd4, 0x78, 0x4a, 0x8b, 0xbc, 0x34, 0x68, 0x99, 0x52, 0xac, 0x0b, 0x13, 0x12, 0x63, 0xb6, 0x86, 0xab, 0xe9, 0x92, - 0xf1, 0x86, 0x79, 0x3a, 0x75, 0x22, 0x22, 0x4b, 0x4f, 0x73, 0xc6, 0xa7, 0x4b, 0xfb, 0xe0, 0x84, 0x44, 0x51, 0x70, 0x47, 0x29, 0x27, 0x73, 0x3a, 0x72, 0x81, 0xa1, 0x78, 0xad, 0x3f, 0xde, 0xdc, - 0x74, 0xba, 0x2f, 0x0e, 0x20, 0x23, 0x62, 0x48, 0x9f, 0x9e, 0x3a, 0x00, 0x17, 0x9d, 0xee, 0x9b, 0x9b, 0x17, 0x07, 0x60, 0x29, 0xe0, 0xb9, 0x39, 0x3e, 0x33, 0xe4, 0x5f, 0x1c, 0x40, 0xc6, 0x07, - 0x5f, 0x18, 0x35, 0x6b, 0x70, 0xad, 0x28, 0x04, 0xa9, 0x92, 0x41, 0xcc, 0xc6, 0xf4, 0x81, 0x86, 0xc1, 0x1d, 0x59, 0x90, 0xa1, 0x09, 0x70, 0x36, 0x01, 0xb2, 0x20, 0x2c, 0x46, 0xef, 0x1f, 0x82, - 0x40, 0x2d, 0x96, 0x0c, 0xeb, 0x17, 0x89, 0x63, 0x18, 0x93, 0xf0, 0x1e, 0xb5, 0x0b, 0xce, 0xd9, 0x58, 0x12, 0xb9, 0x0a, 0x30, 0xc0, 0x83, 0xb7, 0x62, 0x9e, 0x13, 0xc6, 0xaa, 0x97, 0xd7, 0xff, - 0x88, 0x2e, 0x68, 0x2c, 0x12, 0x2a, 0x7d, 0x2c, 0xe7, 0xd4, 0x0f, 0xc5, 0x1c, 0xf9, 0x19, 0xbc, 0x39, 0x09, 0x83, 0xcf, 0x24, 0xf8, 0x4c, 0x8e, 0x8f, 0xff, 0x75, 0x14, 0x0c, 0x19, 0x8f, 0xe8, - 0x83, 0x3f, 0xd3, 0xf3, 0xd8, 0xd0, 0x29, 0x62, 0x61, 0x9d, 0xf1, 0x2e, 0x7c, 0x2a, 0x39, 0x2a, 0x07, 0x79, 0x00, 0x77, 0xb7, 0x1a, 0x9b, 0xe0, 0x80, 0x45, 0x5a, 0x48, 0x5d, 0x94, 0x90, 0x86, - 0x3b, 0xda, 0x8d, 0x3a, 0x72, 0x33, 0x1c, 0x8a, 0x9e, 0x78, 0x1a, 0x7d, 0xdb, 0x06, 0x39, 0xe2, 0x84, 0x39, 0xa5, 0xff, 0x9c, 0x9e, 0x3a, 0x54, 0x91, 0xb0, 0x1c, 0xe1, 0x65, 0xad, 0x8a, 0xf8, - 0xb3, 0xef, 0xa5, 0x0d, 0xe0, 0x29, 0xe5, 0x5a, 0x08, 0x4f, 0xd2, 0x98, 0x62, 0x2c, 0x54, 0xc2, 0xb4, 0x10, 0x62, 0x84, 0x52, 0x7b, 0xa1, 0xe0, 0x13, 0x36, 0x05, 0xcf, 0xbb, 0x93, 0xd4, 0x33, - 0x2a, 0xd8, 0xb0, 0xc5, 0xa8, 0x2d, 0xa5, 0xd5, 0xcb, 0x6d, 0x96, 0x35, 0xec, 0x4e, 0x94, 0x88, 0x17, 0x14, 0x62, 0xc6, 0xef, 0x15, 0x78, 0x50, 0x3f, 0x32, 0x77, 0xfd, 0x98, 0x02, 0x31, 0x67, - 0xe8, 0x6e, 0x93, 0x0d, 0x7b, 0xca, 0x54, 0x40, 0x07, 0xe0, 0xb2, 0xff, 0xa6, 0xe1, 0xd6, 0x8f, 0x5c, 0x4c, 0xac, 0x1a, 0x70, 0x73, 0x2f, 0x9b, 0xb6, 0x42, 0x48, 0x90, 0x34, 0x26, 0x9a, 0x2d, - 0x28, 0xa8, 0xd5, 0xdc, 0x90, 0x74, 0x00, 0x96, 0x33, 0xec, 0x37, 0x3e, 0x82, 0x37, 0x03, 0xb7, 0x7e, 0xd9, 0x7f, 0x63, 0x45, 0x88, 0x84, 0x51, 0x26, 0x56, 0x8d, 0x51, 0xac, 0xc0, 0x8b, 0xa3, - 0xec, 0xe5, 0xc8, 0x1e, 0x33, 0x7e, 0xdf, 0x18, 0xe1, 0xcd, 0x0a, 0x6e, 0x3d, 0x56, 0x2e, 0x9c, 0xc0, 0x9e, 0xff, 0xc2, 0xfb, 0x0d, 0x6e, 0xf7, 0xfd, 0x17, 0xb7, 0x07, 0xf5, 0xbd, 0x51, 0x1e, - 0x29, 0x39, 0x0c, 0xe3, 0xf7, 0x06, 0x2a, 0xf0, 0x5f, 0xec, 0xc1, 0x6f, 0x80, 0xe1, 0x17, 0xf0, 0x34, 0x8e, 0x2b, 0x71, 0x60, 0x45, 0x37, 0xb0, 0xce, 0x86, 0x8f, 0xcd, 0xab, 0x51, 0xc4, 0x24, - 0x26, 0x5d, 0x2e, 0x4b, 0x50, 0x82, 0x35, 0xfe, 0x8c, 0xb0, 0x95, 0x74, 0x00, 0x14, 0x59, 0xd0, 0x28, 0x62, 0xb2, 0x31, 0x4a, 0x96, 0xd1, 0x08, 0x4f, 0x32, 0xfb, 0x36, 0xb6, 0x48, 0xf8, 0xbe, - 0x35, 0xd4, 0x9c, 0xdc, 0x53, 0x60, 0x1a, 0x26, 0x69, 0x1c, 0xaf, 0xe0, 0x73, 0x4a, 0x62, 0x36, 0x61, 0x34, 0x2a, 0xa3, 0x86, 0x51, 0xd9, 0x51, 0xcf, 0x9f, 0x43, 0x4e, 0xdc, 0xbc, 0xc8, 0x79, - 0xba, 0x86, 0x1c, 0x0d, 0x67, 0x02, 0xae, 0x15, 0x16, 0xe7, 0xf9, 0x4b, 0x20, 0x1a, 0x72, 0xc4, 0xac, 0x5a, 0xbd, 0x16, 0x12, 0x5a, 0xa6, 0x54, 0x1c, 0x02, 0xe5, 0x2a, 0x95, 0x14, 0x12, 0xa2, - 0x67, 0x0a, 0xb0, 0x5b, 0x62, 0x1c, 0xae, 0xbb, 0x9d, 0x0f, 0x60, 0xfb, 0x54, 0x18, 0xd3, 0x09, 0x36, 0xc6, 0x84, 0xaf, 0xf4, 0x0c, 0x09, 0x32, 0x05, 0x5a, 0xa4, 0xe1, 0x8c, 0x46, 0x18, 0x40, - 0x75, 0x5b, 0x71, 0x8a, 0xb0, 0xf9, 0x08, 0x1e, 0xaf, 0x46, 0xd4, 0xf3, 0xe7, 0xc6, 0x44, 0x85, 0x22, 0xab, 0x29, 0x32, 0x03, 0xcf, 0x4b, 0x39, 0x7b, 0x28, 0xc1, 0x8e, 0x0a, 0xf4, 0x4a, 0x16, - 0x64, 0x04, 0x4a, 0xa1, 0xbd, 0x45, 0xa2, 0x80, 0x2f, 0x11, 0x69, 0x9d, 0x37, 0x07, 0x83, 0xcb, 0xe6, 0xd5, 0xdb, 0x12, 0x91, 0xf5, 0x59, 0x99, 0x48, 0x95, 0x56, 0x81, 0x36, 0x2a, 0x99, 0xeb, - 0x02, 0x0b, 0xe8, 0x0f, 0x5b, 0xcb, 0x94, 0xe1, 0xef, 0x30, 0x96, 0x3b, 0xda, 0xaf, 0xf8, 0xfd, 0x14, 0xbd, 0x7e, 0x60, 0xca, 0xd0, 0x37, 0x59, 0x2a, 0xc7, 0x2f, 0xa0, 0xd6, 0x14, 0xaa, 0x15, - 0x60, 0x67, 0x31, 0xc5, 0x0a, 0xd2, 0x7e, 0xa0, 0x61, 0xaa, 0xb1, 0xe2, 0x37, 0xdc, 0xd1, 0x72, 0xc6, 0xc2, 0x99, 0x39, 0x0e, 0x8d, 0x0c, 0x16, 0x1f, 0xc5, 0xa8, 0x82, 0x5a, 0x59, 0xe0, 0x19, - 0x7c, 0x04, 0xd7, 0x26, 0xea, 0xed, 0x26, 0xc8, 0xad, 0x49, 0xc8, 0xdb, 0xfd, 0x8f, 0xff, 0x07, 0x9f, 0x5e, 0xdc, 0x1e, 0xec, 0x8d, 0x5c, 0x68, 0x80, 0xcb, 0x45, 0xb5, 0x3a, 0x63, 0x0d, 0x22, - 0x11, 0xe6, 0xd9, 0xfe, 0xf1, 0x01, 0x1a, 0x13, 0x67, 0x95, 0xf5, 0x1d, 0x04, 0x44, 0x81, 0xd2, 0x84, 0x47, 0x44, 0x9a, 0xbe, 0x7d, 0x20, 0x62, 0x22, 0x99, 0x82, 0xe3, 0x23, 0xdf, 0x60, 0x23, - 0xee, 0xb9, 0x29, 0x16, 0x56, 0xf0, 0x9c, 0xd6, 0xa8, 0xb8, 0x49, 0x9e, 0x41, 0x5e, 0x48, 0x72, 0xe0, 0x4d, 0xb9, 0x76, 0x89, 0x65, 0x90, 0xeb, 0xf6, 0xee, 0x84, 0x8d, 0xcb, 0x04, 0xd5, 0xc4, - 0x8a, 0x5f, 0x2a, 0x18, 0x3b, 0x94, 0x5f, 0xdf, 0x24, 0x3b, 0xac, 0x1c, 0x46, 0x39, 0x06, 0xd2, 0xb9, 0xcd, 0x93, 0x1d, 0xbc, 0xcb, 0x91, 0xb9, 0x8a, 0xc2, 0x9d, 0xb7, 0xd0, 0x16, 0x99, 0x5c, - 0x5b, 0xec, 0x6d, 0xbe, 0x26, 0x41, 0x76, 0x17, 0x7d, 0xb7, 0xe4, 0x6b, 0xf0, 0xdc, 0x82, 0xf9, 0x41, 0x66, 0x41, 0xac, 0xc5, 0x38, 0xec, 0x67, 0xe5, 0xb8, 0x12, 0x96, 0x05, 0x6c, 0xae, 0xca, - 0xc6, 0x1d, 0x5a, 0x54, 0xd5, 0xad, 0xcb, 0x0a, 0x61, 0x5a, 0x17, 0x67, 0x3b, 0xee, 0xc7, 0x8d, 0x7c, 0xa8, 0xde, 0x8c, 0xeb, 0xae, 0xa0, 0x00, 0x09, 0xee, 0x24, 0x0d, 0xd4, 0xcc, 0x18, 0x75, - 0xa3, 0xdd, 0xc3, 0xd0, 0xeb, 0xbc, 0xba, 0xd8, 0x53, 0x66, 0x7c, 0x10, 0x1c, 0x9a, 0x9d, 0x0f, 0xd8, 0x75, 0x63, 0xc0, 0x49, 0xc2, 0xa7, 0x74, 0x3d, 0x11, 0xa8, 0x7c, 0x7c, 0x03, 0xba, 0xb6, - 0x92, 0x2a, 0x69, 0xdc, 0xba, 0x38, 0x6b, 0x3c, 0xc5, 0x73, 0xf3, 0x9e, 0xd9, 0x05, 0x3f, 0x66, 0xbc, 0x04, 0x6c, 0x4c, 0xb2, 0xc6, 0x58, 0xc3, 0x97, 0x32, 0x73, 0xe4, 0x6e, 0x18, 0xed, 0x59, - 0xa1, 0xf5, 0xa6, 0xd9, 0xcc, 0x3d, 0xe1, 0xb6, 0xa5, 0x14, 0xf2, 0xa4, 0x34, 0x41, 0x65, 0x79, 0x16, 0xd1, 0x09, 0xe3, 0x34, 0x82, 0x50, 0x48, 0x49, 0x43, 0x1d, 0xaf, 0x7c, 0x17, 0x7e, 0x7b, - 0xfe, 0x72, 0x8d, 0x07, 0x70, 0x43, 0x21, 0x24, 0x1c, 0x61, 0xad, 0xee, 0x14, 0x0a, 0x36, 0x19, 0xe4, 0x03, 0xd3, 0x70, 0xfc, 0x95, 0x62, 0xb3, 0x29, 0xcc, 0x0d, 0x31, 0xd3, 0x6e, 0x59, 0x1c, - 0xca, 0x17, 0x4c, 0x0a, 0x3e, 0xa7, 0x5c, 0xe3, 0xb8, 0xc6, 0x4c, 0xea, 0x67, 0x32, 0x2a, 0xaa, 0x7d, 0x5b, 0xcb, 0x4c, 0xd9, 0xbe, 0xe9, 0xf5, 0xcf, 0xcf, 0x06, 0xc3, 0xf3, 0xe6, 0x75, 0xb7, - 0xf5, 0xb6, 0xdd, 0x6f, 0x08, 0x39, 0xf5, 0x43, 0x11, 0xd1, 0x19, 0x49, 0x95, 0x9f, 0xc4, 0xf4, 0x21, 0x55, 0x7e, 0x18, 0x13, 0xa5, 0x96, 0x42, 0xc6, 0x91, 0xf2, 0x63, 0x92, 0xf2, 0x70, 0x46, - 0xa5, 0x7f, 0x9e, 0xfd, 0x81, 0xe5, 0x5e, 0x4b, 0xb2, 0xa0, 0x12, 0x7d, 0x1d, 0x31, 0x54, 0x5c, 0xc8, 0x15, 0x7a, 0x3d, 0x0d, 0x35, 0x96, 0xfe, 0x89, 0x14, 0x73, 0x48, 0xa4, 0x08, 0x71, 0xac, - 0x37, 0x1b, 0x9e, 0x02, 0x4a, 0x0b, 0x3b, 0x01, 0xad, 0x94, 0xa6, 0x73, 0x90, 0x42, 0x68, 0xa7, 0x06, 0x13, 0x26, 0x95, 0x2e, 0x01, 0x99, 0x2d, 0x8a, 0x3f, 0x5f, 0x70, 0x50, 0xe9, 0xb8, 0x38, - 0x66, 0x0a, 0x42, 0xc1, 0x15, 0x8b, 0x28, 0x4e, 0xbc, 0x89, 0x14, 0x77, 0x34, 0xd4, 0x30, 0xc6, 0x0e, 0x6f, 0x0d, 0xe4, 0x4c, 0x18, 0x8f, 0x86, 0xa6, 0xe5, 0x1a, 0xe2, 0x9b, 0x88, 0xc9, 0xfd, - 0x03, 0xf8, 0x52, 0x4c, 0x31, 0x68, 0xdd, 0x63, 0x17, 0x3e, 0x39, 0x50, 0x84, 0xb2, 0xb5, 0xeb, 0x25, 0xde, 0x71, 0xc6, 0x62, 0x76, 0x4c, 0xb1, 0x83, 0xe8, 0x36, 0x3d, 0x37, 0xab, 0x9c, 0x3a, - 0x95, 0x1c, 0x8e, 0xd7, 0x43, 0x52, 0xf6, 0xb6, 0x81, 0xe4, 0xb1, 0x6d, 0x2b, 0xff, 0x9d, 0xb5, 0x70, 0x6e, 0x1d, 0x4f, 0x5d, 0x78, 0xd6, 0x80, 0xbd, 0x60, 0xaf, 0xdc, 0xc7, 0x59, 0xd9, 0xa2, - 0x1c, 0x22, 0x30, 0xca, 0x6f, 0xa4, 0x5b, 0xce, 0xc0, 0x80, 0xe4, 0x67, 0x92, 0x92, 0xfb, 0x22, 0xec, 0x31, 0x27, 0xd1, 0xe0, 0x44, 0x8a, 0x94, 0x47, 0x26, 0xed, 0xde, 0xbd, 0x6a, 0x37, 0x2f, - 0xbd, 0x7f, 0xff, 0xf7, 0x7f, 0xfc, 0x0b, 0xf6, 0x2b, 0x17, 0x40, 0x30, 0x48, 0x88, 0x0c, 0x0f, 0x36, 0xd8, 0x7f, 0x41, 0xe2, 0x8f, 0x9b, 0xb5, 0xdc, 0x28, 0x63, 0xfb, 0x2b, 0xfc, 0x33, 0xf0, - 0x7d, 0x7b, 0x4b, 0x8e, 0xaa, 0xac, 0x29, 0x8f, 0x70, 0xd4, 0x2d, 0x24, 0xc8, 0x5b, 0xbe, 0xdc, 0xc4, 0xf5, 0x2f, 0x99, 0x12, 0x8f, 0xae, 0xf3, 0x88, 0x81, 0x14, 0x0a, 0x1e, 0x12, 0x4d, 0x39, - 0xd1, 0x54, 0x01, 0xce, 0x48, 0x31, 0xe3, 0x54, 0xd9, 0xad, 0x84, 0xd9, 0xe1, 0x59, 0x80, 0xa1, 0x39, 0x36, 0x8e, 0x2c, 0x4f, 0xa3, 0xc7, 0x55, 0x39, 0x33, 0x1e, 0xfb, 0x5a, 0x82, 0xa7, 0x60, - 0xef, 0x96, 0xef, 0x01, 0xfe, 0xf3, 0x3f, 0x06, 0xf2, 0x20, 0x4b, 0xfa, 0x47, 0xc7, 0x79, 0xd5, 0x1c, 0xb4, 0x87, 0x67, 0x9d, 0x7e, 0x63, 0xb4, 0xed, 0x5c, 0xc4, 0xc7, 0xeb, 0xdf, 0x1d, 0x95, - 0xb2, 0x31, 0x47, 0x28, 0xb3, 0xb3, 0x69, 0x7b, 0x6a, 0xfb, 0x9f, 0x5f, 0xf6, 0x73, 0x6a, 0xd0, 0x7e, 0xd0, 0x94, 0x9b, 0x25, 0xa5, 0x16, 0x68, 0x22, 0xb1, 0x04, 0x92, 0x6a, 0x31, 0x27, 0x9a, - 0x85, 0x04, 0x7b, 0xe1, 0x48, 0x2c, 0x79, 0xbe, 0x68, 0xc0, 0x22, 0x6b, 0xf4, 0xf1, 0x96, 0x92, 0x24, 0x38, 0x3d, 0xde, 0x11, 0x69, 0x13, 0xd2, 0xac, 0x47, 0xbc, 0x90, 0x72, 0x2d, 0x49, 0xec, - 0xd4, 0xe0, 0x0a, 0x87, 0x0e, 0x43, 0x4f, 0x41, 0xaa, 0x2a, 0xc8, 0x90, 0x21, 0x63, 0xeb, 0x96, 0xa5, 0x99, 0x02, 0x3d, 0x23, 0x1a, 0x9f, 0x66, 0x6c, 0xcc, 0x34, 0x84, 0x33, 0x1a, 0xde, 0x9b, - 0xf6, 0x8d, 0xc3, 0x98, 0x71, 0x22, 0x57, 0x10, 0x11, 0x4d, 0xfc, 0x5f, 0x69, 0x8b, 0x7c, 0xc4, 0x2b, 0x1c, 0x62, 0xf2, 0x24, 0xc8, 0xa4, 0x0d, 0xb6, 0x14, 0xaf, 0x86, 0x87, 0x41, 0x77, 0xeb, - 0x17, 0xef, 0xbb, 0x37, 0xc3, 0xf7, 0xed, 0xfe, 0xab, 0xde, 0xa0, 0x8d, 0x1d, 0x95, 0xd9, 0x04, 0x54, 0xc3, 0xdd, 0x06, 0x92, 0xd9, 0x86, 0xc3, 0xdf, 0x70, 0xc8, 0x13, 0x60, 0x7d, 0xe1, 0x7c, - 0x2f, 0x97, 0x96, 0x48, 0xe3, 0x88, 0xef, 0x69, 0x53, 0x68, 0xfe, 0x86, 0xdb, 0x61, 0xc5, 0xd7, 0x4c, 0x83, 0xef, 0xfb, 0x6e, 0x39, 0x05, 0x8b, 0x4b, 0xde, 0xf0, 0xef, 0xb7, 0x2f, 0x7b, 0xd7, - 0xfd, 0xf3, 0xcd, 0x6c, 0xbe, 0x23, 0xf2, 0x5a, 0xc6, 0x8d, 0x2a, 0x50, 0xc0, 0x44, 0xa0, 0xc9, 0x3d, 0x91, 0xac, 0xca, 0x37, 0x38, 0xf2, 0xff, 0xd3, 0xff, 0xaf, 0xea, 0x99, 0x67, 0xce, 0x0a, - 0xfd, 0x4b, 0xf7, 0x73, 0x4e, 0x3b, 0x5f, 0x63, 0x48, 0x9a, 0x08, 0xbb, 0x0f, 0x2a, 0x6f, 0xb3, 0xed, 0x7e, 0xf0, 0x47, 0x58, 0x66, 0x0a, 0xdb, 0xca, 0xda, 0x79, 0x3d, 0x68, 0xb8, 0x0d, 0xd7, - 0x74, 0xaf, 0x70, 0x4f, 0x57, 0xb0, 0x20, 0x71, 0x4a, 0xd7, 0xc5, 0x15, 0xc0, 0x6e, 0x84, 0xea, 0xf7, 0x74, 0xe5, 0x62, 0xc0, 0xee, 0x67, 0x44, 0xaf, 0x65, 0x7c, 0x50, 0x58, 0xc3, 0x20, 0xb9, - 0xa7, 0xb6, 0xa6, 0xda, 0xdd, 0x90, 0x51, 0x4e, 0x91, 0xd0, 0xfc, 0x89, 0x95, 0xcc, 0x14, 0x93, 0x6f, 0x89, 0xbe, 0x44, 0x8a, 0x84, 0x4a, 0xcd, 0xa8, 0x72, 0xff, 0x51, 0x58, 0x9c, 0x95, 0x1c, - 0x8d, 0xe9, 0x7b, 0x02, 0x75, 0x2b, 0x68, 0x55, 0x7d, 0xcb, 0xed, 0x1d, 0x91, 0x78, 0x79, 0x35, 0xbe, 0x4d, 0xb4, 0xb5, 0x0d, 0x8b, 0xe1, 0xb4, 0x5a, 0xec, 0xab, 0x44, 0xb7, 0xa7, 0xc0, 0x25, - 0xe3, 0x11, 0x56, 0x0d, 0xb7, 0x5e, 0x05, 0x75, 0xd7, 0xd7, 0x41, 0x4e, 0x3e, 0x14, 0xf3, 0x39, 0xe1, 0x11, 0x78, 0x0b, 0x58, 0x4e, 0xa9, 0x7e, 0x72, 0xb1, 0xf0, 0x3d, 0xf6, 0x81, 0x8d, 0x04, - 0x35, 0x84, 0x7d, 0xdf, 0xcf, 0x8a, 0x18, 0x3e, 0x16, 0x93, 0xc3, 0xba, 0x73, 0x2f, 0x5f, 0xff, 0x86, 0xc9, 0xf5, 0xa0, 0xdd, 0xef, 0x36, 0x6d, 0x83, 0xf5, 0xd7, 0x5f, 0x95, 0x57, 0x97, 0xb6, - 0x4d, 0x3a, 0xdb, 0x5e, 0x83, 0xe1, 0xcf, 0xf0, 0x73, 0x73, 0x6f, 0x80, 0xd7, 0xdb, 0xb6, 0xc3, 0x1a, 0xbe, 0x32, 0x7e, 0xac, 0x91, 0x3d, 0x0f, 0xb3, 0xc3, 0x4b, 0x15, 0x95, 0x8d, 0xaa, 0x30, - 0xf9, 0xab, 0xc4, 0xf6, 0x5f, 0x51, 0xa3, 0x2a, 0xd0, 0xb7, 0xb2, 0xcd, 0xb4, 0xa6, 0x71, 0xd5, 0x05, 0x61, 0x2a, 0xe3, 0x5f, 0xe2, 0x02, 0x43, 0xb8, 0x70, 0x01, 0x3e, 0xfe, 0x52, 0x17, 0x18, - 0x7e, 0x9e, 0xd8, 0xb6, 0x40, 0xd9, 0x40, 0x93, 0xa7, 0xbd, 0x60, 0xf1, 0x8d, 0x03, 0xa0, 0x2a, 0xca, 0xc9, 0x86, 0xc1, 0xbf, 0x9d, 0x49, 0x1e, 0xf5, 0x15, 0x66, 0xff, 0xc8, 0xa4, 0x24, 0x8e, - 0xd1, 0x8a, 0xf9, 0xb6, 0xd8, 0xda, 0xd4, 0x7c, 0x0b, 0xd1, 0x62, 0x7d, 0x01, 0xec, 0xb4, 0x2f, 0x0e, 0x37, 0x2d, 0xec, 0xdd, 0x9f, 0xac, 0x04, 0xa6, 0x09, 0xb8, 0xb1, 0x0f, 0x79, 0x89, 0x31, - 0x25, 0x21, 0x9f, 0x9e, 0xc0, 0x34, 0x72, 0xe5, 0xed, 0x97, 0x5a, 0x32, 0x1d, 0xce, 0xb2, 0x7d, 0x8e, 0x16, 0x70, 0x93, 0x65, 0x7f, 0x75, 0x9d, 0x93, 0x7f, 0x9e, 0x31, 0xd3, 0x77, 0x59, 0xff, - 0x5d, 0x15, 0xa6, 0x2a, 0xeb, 0xd7, 0x0a, 0xcc, 0x1a, 0xca, 0x1d, 0x3d, 0x1d, 0x50, 0xb4, 0x02, 0xb8, 0x33, 0x62, 0xf2, 0x31, 0x8f, 0x3e, 0x59, 0xbe, 0x9f, 0xb0, 0x4c, 0xf8, 0x34, 0x4d, 0xf8, - 0x6e, 0x07, 0xe7, 0xbf, 0x6c, 0x38, 0xf4, 0xa0, 0x25, 0xe6, 0x09, 0x8b, 0xd7, 0x9f, 0xb5, 0x76, 0x3b, 0xa6, 0xb8, 0xe5, 0xcb, 0xbf, 0x92, 0x15, 0xf2, 0x5f, 0xad, 0x44, 0x6f, 0xfd, 0xfd, 0xcc, - 0x28, 0xb0, 0x05, 0xba, 0xbf, 0x6b, 0x7e, 0x0e, 0xdd, 0x8a, 0x21, 0x0f, 0x2a, 0x58, 0x1b, 0xfc, 0x0a, 0xcb, 0xff, 0x4c, 0x73, 0xd6, 0xa0, 0x9f, 0xc5, 0x11, 0xca, 0x1f, 0xad, 0xf1, 0x7e, 0xb6, - 0xdd, 0xfb, 0xe5, 0x8f, 0x89, 0x3f, 0x68, 0xf5, 0x9d, 0xa6, 0x74, 0xc1, 0x0b, 0x93, 0x4a, 0x37, 0xf7, 0x04, 0xaf, 0xf5, 0x17, 0xbb, 0xcb, 0x7e, 0xef, 0x5d, 0xbb, 0x75, 0x85, 0xd6, 0xc4, 0x49, - 0xe3, 0x49, 0xe3, 0x17, 0x9f, 0x47, 0x26, 0xec, 0x57, 0x36, 0xdb, 0x35, 0x68, 0xdb, 0x69, 0x8e, 0xe6, 0xf3, 0xc7, 0xaf, 0xe4, 0xe6, 0x64, 0xdb, 0xad, 0x5d, 0xb6, 0x68, 0xd4, 0xbf, 0xd8, 0xe3, - 0xec, 0xf9, 0xc4, 0x2b, 0x4d, 0x64, 0x8f, 0xce, 0xb7, 0x85, 0x82, 0x71, 0xfd, 0x4e, 0x53, 0xa3, 0x1d, 0x4b, 0x1f, 0x87, 0xdd, 0xfa, 0x7e, 0x79, 0xe6, 0x7c, 0xc2, 0x3f, 0x36, 0xd8, 0xef, 0x16, - 0x73, 0xdf, 0x7e, 0x3e, 0x72, 0x0f, 0x72, 0xe2, 0x48, 0xc4, 0xdd, 0xfc, 0x82, 0xf0, 0xfd, 0x35, 0xd4, 0xd9, 0x51, 0x3a, 0xff, 0x76, 0x17, 0xfe, 0xb5, 0x4a, 0xfa, 0x23, 0x9f, 0x10, 0xb6, 0x88, - 0xfd, 0x94, 0x8f, 0x09, 0x05, 0xb9, 0xf2, 0xf7, 0x84, 0x42, 0xcd, 0x5d, 0x69, 0x51, 0xd2, 0x79, 0x57, 0xa4, 0x7c, 0xd5, 0x00, 0xbb, 0xe8, 0xe5, 0xdf, 0x2f, 0x2e, 0xa5, 0x58, 0xb0, 0x88, 0x02, - 0x01, 0x37, 0x5f, 0x97, 0xb3, 0x3f, 0x69, 0xe4, 0xc2, 0x92, 0x98, 0x9d, 0x95, 0xa4, 0x5a, 0x32, 0xba, 0xb0, 0xff, 0x53, 0x4a, 0xeb, 0xbc, 0x03, 0x44, 0x4e, 0xb3, 0x91, 0x78, 0xc9, 0x62, 0x1c, - 0xa7, 0xcd, 0x9e, 0xcb, 0x2c, 0xae, 0xc6, 0x42, 0xcf, 0xd6, 0x1e, 0xc6, 0xd6, 0x8b, 0x0b, 0xee, 0xe5, 0xcf, 0x76, 0x0b, 0xc8, 0x04, 0x57, 0x7e, 0x16, 0x75, 0xad, 0x8b, 0xb3, 0xe1, 0x79, 0xa7, - 0xdb, 0x1e, 0x36, 0xfb, 0x6f, 0x30, 0xfc, 0xb2, 0xd3, 0x5e, 0xf7, 0x75, 0xe7, 0x0d, 0xd4, 0xff, 0xd7, 0xad, 0xa6, 0x46, 0x05, 0xda, 0x71, 0x6e, 0xfa, 0xcd, 0xcb, 0xcb, 0x76, 0xbf, 0xba, 0xce, - 0xcb, 0x06, 0x2d, 0x3b, 0x75, 0xe5, 0x5d, 0x7f, 0xb9, 0xfc, 0x5c, 0x10, 0xc6, 0x31, 0xe5, 0x68, 0x58, 0xde, 0x7a, 0xde, 0x3a, 0x50, 0x0e, 0x62, 0xf3, 0xec, 0x99, 0x82, 0x6d, 0x6c, 0xf9, 0xb5, - 0x44, 0xf8, 0xca, 0x04, 0x8e, 0x54, 0x5c, 0xef, 0xcc, 0x0a, 0x33, 0x13, 0x73, 0x8a, 0xe9, 0x6c, 0x63, 0xf1, 0xd1, 0x2d, 0xde, 0xcc, 0xd3, 0x58, 0xb3, 0x0b, 0x11, 0xa5, 0x31, 0xbd, 0xb4, 0x1b, - 0x87, 0xb3, 0x7c, 0xa5, 0xb7, 0xce, 0xff, 0x2a, 0xe7, 0xc7, 0x4c, 0xe2, 0x2f, 0x9b, 0x36, 0x78, 0x84, 0xaa, 0x0d, 0x5d, 0x34, 0xe2, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, - 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, - 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, 0xff, 0xb9, 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, 0x38, 0x79, 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, 0x39, 0x60, 0x1a, 0xd2, 0x04, 0x90, - 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, 0x2f, 0x66, 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, 0xf7, 0xd3, 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, 0x9e, 0x5a, 0xe9, 0xde, 0x0f, 0x8f, - 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, 0x47, 0x77, 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, 0x2d, 0x4d, 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, 0x4b, 0x84, 0xb0, 0x20, 0xe9, 0x12, - 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, 0x2c, 0x23, 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, 0x83, 0x35, 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, 0x73, 0x01, 0x2b, 0x2e, 0x10, 0x52, - 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, 0x26, 0x90, 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, 0x48, 0x10, 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, 0x46, 0x30, 0xa7, 0xb9, 0x95, 0x90, - 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, 0x96, 0x54, 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, 0x24, 0xcb, 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, 0xce, 0xc5, 0xca, 0x18, 0x53, 0xb2, - 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, 0x3b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, 0x25, 0x2d, 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, 0x57, 0x06, 0xc9, 0x52, 0x74, 0xad, - 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, 0x0d, 0x4a, 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, 0x7f, 0x01, 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, 0xde, 0x3d, 0xfb, 0xde, 0xf0, 0xaf, - 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, 0x7c, 0x4e, 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, 0xe4, 0x94, 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, 0x7a, 0x7c, 0x80, 0x9f, 0xac, 0x18, - 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, 0x26, 0x19, 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, 0x54, 0xaa, 0x90, 0x9d, 0xf3, 0xf3, 0xed, 0x76, 0xeb, 0x13, 0x63, 0xb9, 0xcf, 0xc5, - 0xe2, 0xbc, 0xf2, 0xf6, 0xfc, 0x76, 0xd0, 0x8d, 0x86, 0x49, 0xd4, 0xbe, 0xf4, 0x2f, 0x1a, 0x8c, 0xf7, 0x2c, 0x47, 0x29, 0x41, 0xe0, 0xaf, 0x6b, 0x2a, 0x30, 0x83, 0xd9, 0x0e, 0x48, 0x51, 0xe4, - 0x34, 0x25, 0xb3, 0x1c, 0x21, 0x27, 0x5b, 0x9d, 0x53, 0x93, 0x3a, 0x03, 0x0a, 0xca, 0x60, 0x2b, 0xa8, 0xa2, 0x6c, 0xd1, 0x2a, 0xf9, 0x65, 0x05, 0x8d, 0x66, 0xe2, 0xea, 0x10, 0x56, 0xc6, 0x52, - 0x79, 0x40, 0xc0, 0x19, 0x10, 0x9b, 0x35, 0x37, 0x4c, 0x60, 0x90, 0xb8, 0x70, 0x15, 0x26, 0x83, 0xa4, 0x05, 0x8f, 0x83, 0xc9, 0xf5, 0xe8, 0x7e, 0x02, 0x8f, 0x61, 0x1c, 0x87, 0xc3, 0xc9, 0x20, - 0x4a, 0x60, 0x14, 0x43, 0x77, 0x34, 0xec, 0x0d, 0x26, 0x83, 0xd1, 0x30, 0x81, 0x51, 0x1f, 0xc2, 0xe1, 0x4f, 0x25, 0xef, 0x8f, 0x83, 0x61, 0xaf, 0x05, 0x48, 0xd5, 0x12, 0x05, 0xe0, 0x73, 0x21, - 0xb4, 0x2b, 0x5c, 0x00, 0xd5, 0x11, 0xc6, 0xac, 0x81, 0xb3, 0xca, 0x0e, 0x8d, 0xa1, 0x7d, 0xe6, 0x64, 0x81, 0x29, 0x9d, 0xd3, 0x14, 0x72, 0xc2, 0x16, 0x6b, 0xb2, 0x40, 0x58, 0xf0, 0x0d, 0x0a, - 0xa6, 0x21, 0x54, 0xa0, 0x58, 0x51, 0xa9, 0xd3, 0x2d, 0x81, 0xb0, 0x0c, 0x72, 0xba, 0xa2, 0xca, 0x80, 0x4d, 0x96, 0xcc, 0x47, 0x3e, 0xfa, 0xce, 0x1f, 0x5f, 0x94, 0x7f, 0x82, 0x48, 0x23, 0xf1, - 0x8e, 0x6c, 0x90, 0x41, 0xa2, 0x88, 0x50, 0x70, 0x5f, 0xc0, 0x15, 0x51, 0xe9, 0x12, 0x64, 0x2a, 0x68, 0xd1, 0x04, 0x55, 0x5c, 0x81, 0x22, 0x1a, 0x3e, 0xc0, 0x86, 0x08, 0xd9, 0x29, 0xcf, 0x6f, - 0xc2, 0x87, 0x70, 0x7a, 0x3d, 0xba, 0x8b, 0xa0, 0x0d, 0x39, 0x4f, 0xcb, 0x7e, 0xc0, 0xe7, 0x40, 0xe0, 0xa6, 0xf7, 0x23, 0x2c, 0xf9, 0x4a, 0xa3, 0x41, 0x34, 0x04, 0x8d, 0x0a, 0x5b, 0xb3, 0x95, - 0x20, 0x6b, 0xc5, 0xe5, 0x6b, 0x52, 0x56, 0xda, 0xb6, 0xcb, 0x13, 0x09, 0x94, 0x49, 0x45, 0xf2, 0x1c, 0xb3, 0x43, 0x91, 0x70, 0x17, 0x3e, 0x44, 0xc3, 0xe9, 0x55, 0x38, 0xe9, 0x5e, 0x4f, 0xa3, - 0xee, 0xf5, 0x08, 0xda, 0x20, 0x51, 0x69, 0x74, 0x9e, 0x70, 0x76, 0xa2, 0x7f, 0x91, 0x19, 0xf4, 0xea, 0xe4, 0x60, 0xba, 0xe4, 0x3a, 0x9f, 0xb6, 0x78, 0x66, 0xc6, 0xd3, 0x94, 0xaf, 0x56, 0x84, - 0x65, 0xf2, 0x58, 0xde, 0x38, 0xbc, 0x4f, 0xa2, 0x63, 0x81, 0x5b, 0x42, 0x55, 0xd9, 0x7f, 0xe0, 0x09, 0x77, 0x52, 0x09, 0xfe, 0x84, 0x30, 0xc3, 0xb9, 0xee, 0x75, 0xc8, 0x74, 0xcf, 0x69, 0x8a, - 0x1a, 0x8d, 0x27, 0x09, 0xb4, 0xa1, 0x20, 0x82, 0xac, 0x50, 0xa1, 0x90, 0x50, 0x10, 0xd9, 0xe8, 0xaa, 0x37, 0x64, 0x43, 0xe0, 0xe1, 0x0e, 0xb6, 0x4b, 0x64, 0x20, 0xd6, 0xcc, 0x00, 0xce, 0xa4, - 0x64, 0x5f, 0xcc, 0x80, 0xfe, 0xc2, 0xd7, 0xf4, 0x19, 0xce, 0xd6, 0xf6, 0x25, 0x50, 0x25, 0x31, 0x9f, 0xb7, 0x74, 0x67, 0xb1, 0x00, 0x46, 0xd5, 0x50, 0x19, 0xb4, 0x3f, 0x95, 0xd4, 0xed, 0x4f, - 0x62, 0xcd, 0xbe, 0x64, 0xdb, 0xa2, 0xa3, 0x04, 0x61, 0xb2, 0xe0, 0x42, 0x05, 0x99, 0x9a, 0x4a, 0x9e, 0x3e, 0xa1, 0x6a, 0x49, 0x14, 0x1b, 0x14, 0xc1, 0xae, 0x25, 0xd7, 0xb2, 0x40, 0x96, 0x05, - 0xbb, 0x16, 0xc9, 0x32, 0x5d, 0x3a, 0xc1, 0xdf, 0x2e, 0x2e, 0x2e, 0x9a, 0x8e, 0x24, 0x3f, 0x0e, 0xc6, 0xd3, 0xb8, 0x0b, 0x6d, 0x98, 0xe7, 0x64, 0x61, 0xcc, 0xa1, 0xb2, 0x6c, 0x0c, 0x9c, 0x64, - 0x36, 0xac, 0x26, 0x5f, 0x22, 0x35, 0x6d, 0x4e, 0xfe, 0x09, 0x80, 0x2d, 0x45, 0x5e, 0xe1, 0x42, 0x77, 0xc2, 0x3c, 0x07, 0xfd, 0x94, 0x53, 0x86, 0xb2, 0xec, 0x9c, 0x27, 0x1f, 0x4f, 0x4c, 0x57, - 0x25, 0x12, 0x8f, 0x91, 0x41, 0xa5, 0x49, 0xa1, 0xf3, 0x51, 0xc3, 0x00, 0xf8, 0x7c, 0x5e, 0xc7, 0x4d, 0x51, 0x95, 0xa3, 0xb6, 0xdf, 0x82, 0x01, 0xb6, 0x94, 0x65, 0x7c, 0xeb, 0x94, 0xe7, 0x9e, - 0x8d, 0x83, 0x45, 0x52, 0x85, 0xa2, 0xd9, 0x4e, 0xf3, 0x2a, 0x93, 0xaf, 0x97, 0xba, 0x2c, 0x5c, 0x9c, 0x8f, 0x74, 0x0e, 0xae, 0xf7, 0xf2, 0xb5, 0xe7, 0x42, 0x10, 0x80, 0xcb, 0x99, 0x0b, 0x46, - 0x1a, 0x1c, 0x53, 0x38, 0xb5, 0x71, 0x9e, 0xae, 0x0b, 0xcf, 0x40, 0xf9, 0xd7, 0x35, 0xdd, 0x90, 0x1c, 0x99, 0xd2, 0xb6, 0x7e, 0xa3, 0xcf, 0x1d, 0xa3, 0xc0, 0x50, 0x94, 0x42, 0x5d, 0x38, 0xd5, - 0x4c, 0xae, 0x3e, 0x0a, 0xcc, 0x8b, 0x5e, 0x3c, 0x78, 0x88, 0x3c, 0xf3, 0xe7, 0x38, 0x9c, 0x5c, 0x7b, 0xee, 0x99, 0x15, 0x1e, 0x3d, 0x63, 0xba, 0x56, 0x08, 0x44, 0x83, 0x48, 0x40, 0x86, 0x73, - 0xca, 0x30, 0xb3, 0xa5, 0x5f, 0x21, 0xda, 0xdc, 0x5a, 0xfa, 0x4e, 0xa7, 0x73, 0x73, 0x93, 0x55, 0xde, 0x58, 0x38, 0xec, 0xb5, 0x2e, 0xb8, 0xe2, 0x20, 0x9f, 0x68, 0x11, 0xa7, 0x63, 0x61, 0x21, - 0x99, 0x2e, 0x31, 0x2d, 0xaf, 0xea, 0x42, 0xa0, 0x95, 0xdb, 0x02, 0xce, 0x52, 0x2c, 0xd3, 0x95, 0xe3, 0x82, 0xa4, 0x3b, 0xf0, 0x67, 0x44, 0xd9, 0xca, 0x31, 0xed, 0xb5, 0x26, 0xf0, 0xd3, 0x55, - 0x56, 0xd5, 0x14, 0x9d, 0x03, 0x3e, 0x53, 0xa9, 0x2a, 0x77, 0x3f, 0x5b, 0xac, 0x4d, 0x0b, 0x81, 0x5a, 0x82, 0x0b, 0xa9, 0x46, 0xc4, 0x5b, 0x6f, 0xdf, 0xe7, 0x4f, 0x57, 0xd9, 0x3b, 0xfc, 0xfa, - 0xad, 0xd3, 0xa9, 0x9d, 0x73, 0x3e, 0x4a, 0x54, 0xba, 0x4d, 0xe5, 0x8e, 0xa3, 0x83, 0x1d, 0xc5, 0xf1, 0x28, 0x9e, 0x76, 0x47, 0xbd, 0x28, 0xb8, 0xb0, 0xb1, 0x9d, 0x70, 0xa0, 0x92, 0xe7, 0x44, - 0x21, 0x50, 0xa6, 0x50, 0xe8, 0x86, 0xb7, 0x21, 0x82, 0x6a, 0x04, 0x49, 0x98, 0x0b, 0xbe, 0x82, 0x82, 0x4b, 0x49, 0x35, 0xa0, 0x0a, 0x2e, 0x95, 0x8d, 0x8e, 0x6c, 0xc1, 0x16, 0xcd, 0xb4, 0x40, - 0x18, 0x37, 0x37, 0xd9, 0x5e, 0x53, 0x43, 0xa7, 0xd1, 0x10, 0x04, 0x41, 0x00, 0xc9, 0x24, 0x8c, 0x27, 0xf0, 0x10, 0xde, 0x0e, 0x7a, 0xa1, 0xbe, 0x12, 0xcd, 0x69, 0x9d, 0xaa, 0x7d, 0x73, 0x3e, - 0x4c, 0xd3, 0xe8, 0xe9, 0xe6, 0x9a, 0xaf, 0xd0, 0x71, 0x34, 0xf8, 0x7c, 0xf3, 0x3f, 0x44, 0x42, 0x70, 0xd1, 0x69, 0xb4, 0x73, 0x2d, 0x61, 0xae, 0x47, 0x3c, 0x5d, 0x51, 0x3b, 0xbe, 0x16, 0x80, - 0x6c, 0x43, 0x05, 0x67, 0x7a, 0x6c, 0xf3, 0xe1, 0xef, 0xdf, 0x5e, 0x96, 0x8c, 0xe3, 0x1c, 0x75, 0xb9, 0x99, 0x32, 0xd2, 0xfd, 0x6c, 0x2f, 0xa0, 0x72, 0xf7, 0x35, 0x7e, 0x8d, 0xe6, 0x95, 0x69, - 0xbf, 0x9a, 0x67, 0x2f, 0xab, 0xd9, 0xfa, 0x0d, 0x8b, 0xe9, 0x8e, 0xb6, 0xf7, 0x9b, 0x37, 0xb5, 0x62, 0xdf, 0x31, 0xbe, 0xa0, 0xb6, 0xdb, 0x71, 0x3a, 0x95, 0x4f, 0x8d, 0x34, 0xd7, 0xde, 0x7f, - 0x9e, 0x51, 0xf6, 0xf9, 0x0b, 0xd9, 0x10, 0x1f, 0x9f, 0xd1, 0x06, 0x81, 0x32, 0xaa, 0xde, 0x8f, 0x00, 0x95, 0x55, 0xeb, 0x27, 0x0c, 0x28, 0xdb, 0x90, 0x9c, 0x66, 0xfa, 0xe6, 0xc1, 0x54, 0x71, - 0xb1, 0x6b, 0x84, 0xa0, 0x66, 0x09, 0x5e, 0x04, 0xfd, 0xff, 0x2c, 0x4a, 0x35, 0x70, 0xa2, 0x61, 0xef, 0x08, 0x36, 0x4e, 0xa7, 0x8c, 0x89, 0xa1, 0xea, 0x53, 0x96, 0x19, 0xb5, 0x85, 0xe0, 0x5f, - 0x30, 0x55, 0x30, 0xd3, 0xf6, 0x67, 0x54, 0xb4, 0x80, 0xfa, 0xe8, 0x9b, 0x57, 0xfb, 0x58, 0x80, 0x5a, 0x12, 0x65, 0x06, 0x7d, 0x42, 0x99, 0x34, 0xef, 0xe6, 0x3c, 0xd7, 0x33, 0x91, 0xeb, 0xaf, - 0x36, 0xcc, 0xb5, 0xe3, 0x50, 0x9f, 0xe4, 0xf9, 0x8c, 0xa4, 0x4f, 0xda, 0xaf, 0x74, 0x2d, 0x84, 0x76, 0x51, 0x4f, 0xf3, 0xba, 0xf0, 0x6b, 0x59, 0x16, 0xbd, 0x06, 0x7b, 0x7e, 0x59, 0x60, 0x65, - 0xcb, 0x19, 0xc7, 0xa3, 0x9b, 0xa8, 0x3b, 0xb9, 0x0a, 0x93, 0xa8, 0x37, 0x88, 0x83, 0x7d, 0xd3, 0x34, 0x8f, 0x9e, 0x33, 0xe8, 0xeb, 0x0d, 0x62, 0xdf, 0xa0, 0x0e, 0xa9, 0x3d, 0x37, 0x08, 0x2a, - 0xf8, 0x23, 0xcb, 0x7a, 0xa8, 0x30, 0x55, 0x57, 0x44, 0x62, 0x8f, 0x0a, 0x5b, 0xc4, 0x9f, 0xa2, 0xee, 0xd4, 0xc8, 0xed, 0xf6, 0x3c, 0x73, 0xf2, 0x68, 0x9e, 0xaa, 0x73, 0xcf, 0xe9, 0xcc, 0x29, - 0xcb, 0x2a, 0x9e, 0x41, 0x1f, 0xa2, 0x4f, 0x83, 0x44, 0xeb, 0x7b, 0x34, 0xf2, 0x3f, 0x6b, 0x4f, 0x4b, 0x05, 0xb3, 0x92, 0xc6, 0x2c, 0x48, 0x4e, 0x9a, 0x81, 0xef, 0x6b, 0xf2, 0x8a, 0x30, 0x08, - 0x5c, 0xad, 0xc2, 0x3d, 0xa0, 0x1d, 0x72, 0x55, 0x92, 0xd7, 0x8a, 0xb5, 0x19, 0x86, 0xa4, 0xa9, 0xd6, 0xe9, 0x1c, 0x08, 0x7f, 0x3b, 0x38, 0x46, 0x97, 0x56, 0xee, 0xd6, 0x1e, 0xb8, 0xce, 0x1b, - 0xfe, 0x77, 0x5e, 0xb3, 0xe2, 0x75, 0xb9, 0x75, 0x38, 0x5e, 0xca, 0x76, 0x3a, 0xc7, 0x82, 0x6d, 0x4e, 0xaa, 0x48, 0xbd, 0x9a, 0x19, 0x13, 0xb8, 0xcf, 0x5f, 0x36, 0x2b, 0x3f, 0xe5, 0x6c, 0x4e, - 0x17, 0x75, 0x96, 0x62, 0x24, 0x59, 0xb8, 0x5f, 0xf2, 0xba, 0xe6, 0x6d, 0xa3, 0xf9, 0x42, 0x64, 0x2e, 0xe4, 0xe8, 0x59, 0x21, 0x2b, 0x87, 0xf3, 0xf2, 0xa0, 0x87, 0x39, 0xd9, 0x61, 0x16, 0x3d, - 0x17, 0xc4, 0x9c, 0x3b, 0xfa, 0x06, 0x3a, 0xef, 0x83, 0xbb, 0x96, 0xa8, 0xe1, 0xf7, 0x2b, 0x64, 0x98, 0xd3, 0x95, 0x0c, 0x5c, 0xf0, 0x3c, 0x5d, 0x38, 0x70, 0xfa, 0xdf, 0x9a, 0x76, 0x06, 0x19, - 0x37, 0x45, 0x7c, 0xf3, 0x70, 0x37, 0xed, 0x8e, 0x86, 0xfd, 0xc1, 0x0f, 0xd3, 0x3d, 0xe7, 0x38, 0x09, 0xbe, 0x7e, 0xfd, 0xfc, 0x6b, 0xad, 0xc8, 0xf9, 0x88, 0x2c, 0x2b, 0x0d, 0xff, 0xf6, 0x3d, - 0x19, 0xde, 0xeb, 0xe7, 0x5e, 0x19, 0xe0, 0xd7, 0x63, 0x92, 0x44, 0x13, 0x9b, 0x2f, 0xd3, 0x59, 0xa2, 0x4f, 0x51, 0xf0, 0x76, 0xff, 0x2b, 0x31, 0x16, 0x87, 0xe3, 0x71, 0x14, 0x4f, 0x6f, 0xc2, - 0x38, 0x78, 0xd7, 0xfb, 0xad, 0x20, 0x45, 0x81, 0xa2, 0xbc, 0x10, 0xdb, 0xf6, 0xc9, 0xff, 0x42, 0xc4, 0xa1, 0x9c, 0xdb, 0xf0, 0x7e, 0xd8, 0xbd, 0x8e, 0xe2, 0x80, 0x8b, 0x45, 0xb5, 0x72, 0x1a, - 0x16, 0xbf, 0x62, 0x31, 0x73, 0xeb, 0x63, 0xf9, 0x70, 0x47, 0x28, 0x2b, 0xcb, 0xae, 0x37, 0x7a, 0x1c, 0xde, 0x8e, 0xc2, 0xde, 0xf4, 0x3e, 0xbe, 0x0d, 0xdc, 0x6a, 0x6f, 0x15, 0x58, 0x70, 0xcb, - 0xde, 0x58, 0x5f, 0xcb, 0x6d, 0xe0, 0x9c, 0xf2, 0x73, 0x45, 0x9e, 0x88, 0xa0, 0xe7, 0x07, 0x36, 0x9d, 0x5f, 0xf8, 0x7f, 0xf1, 0xff, 0x7a, 0x78, 0xd6, 0x36, 0x67, 0xa5, 0xb5, 0x4e, 0x7f, 0x14, - 0x1b, 0x18, 0x28, 0xfe, 0x84, 0x4c, 0x06, 0x1f, 0x5a, 0x97, 0x15, 0x10, 0x0c, 0x12, 0x42, 0x18, 0x0c, 0x7f, 0x03, 0x09, 0xaf, 0xc7, 0xa2, 0x10, 0xbc, 0x40, 0xa1, 0x28, 0x4a, 0xf7, 0x0c, 0x7a, - 0x23, 0x38, 0x75, 0xf4, 0xd0, 0x6e, 0x2a, 0xde, 0x0b, 0x75, 0xb9, 0x5b, 0xc2, 0x7b, 0x91, 0xbb, 0xa0, 0x33, 0x75, 0xe0, 0xb3, 0xe7, 0x5d, 0x39, 0xf5, 0x44, 0x66, 0xa1, 0x6c, 0x2e, 0x9d, 0x3c, - 0xe7, 0x5b, 0x20, 0x6b, 0xc5, 0x57, 0x44, 0x51, 0x3d, 0x9c, 0xec, 0x20, 0xe3, 0x5b, 0x56, 0x8d, 0xdb, 0xba, 0xcb, 0x1e, 0x25, 0xa5, 0x1c, 0x2d, 0x4c, 0xa8, 0xdb, 0x29, 0x32, 0x25, 0xf4, 0xe4, - 0x60, 0x06, 0x12, 0x3d, 0xc7, 0x19, 0x91, 0x12, 0xd6, 0xf2, 0x80, 0x1f, 0x2c, 0xbf, 0xae, 0x04, 0xdb, 0xed, 0x65, 0xd9, 0xd1, 0x0b, 0xc1, 0x97, 0x74, 0x46, 0x55, 0x39, 0xc9, 0x69, 0x26, 0xca, - 0x60, 0x46, 0x19, 0x11, 0x3b, 0xc8, 0x88, 0x22, 0x7e, 0x7d, 0xdd, 0x7a, 0x0d, 0x40, 0x79, 0x36, 0x04, 0xe5, 0xf0, 0xfb, 0x30, 0x7c, 0x9c, 0x3e, 0x44, 0xf1, 0xd5, 0x28, 0xa9, 0xc6, 0x10, 0x25, - 0xd6, 0xe8, 0x5a, 0x1a, 0xb3, 0xdf, 0xe8, 0x5b, 0xcd, 0x34, 0x9e, 0x43, 0x31, 0x86, 0xe0, 0xcc, 0x39, 0x03, 0xcc, 0x25, 0xd6, 0x32, 0xed, 0x18, 0xaa, 0xe5, 0xc6, 0xd1, 0x78, 0x74, 0x1f, 0xdf, - 0xd6, 0xb3, 0xef, 0x5e, 0xe6, 0x51, 0x9c, 0x5f, 0x70, 0xfc, 0xaf, 0x28, 0x2a, 0x4d, 0xfa, 0xdd, 0xde, 0x75, 0xf9, 0x3a, 0xcf, 0xd8, 0x89, 0x32, 0xcd, 0xfc, 0xd0, 0xcb, 0xd6, 0x41, 0x56, 0xa9, - 0x02, 0xdf, 0xf7, 0x0f, 0x99, 0x7b, 0x8d, 0xf7, 0x3a, 0xbf, 0x1d, 0xf0, 0x9a, 0xae, 0x55, 0x71, 0x32, 0x3f, 0x05, 0xdf, 0xa2, 0x90, 0x4b, 0xcc, 0x73, 0x68, 0x77, 0xed, 0x36, 0xe3, 0x7e, 0xfb, - 0x2f, 0xf7, 0x1f, 0xce, 0x57, 0x5f, 0xb9, 0xdf, 0x6c, 0x71, 0x96, 0xe6, 0x54, 0xdf, 0xbb, 0x01, 0x30, 0xdc, 0xb6, 0xf9, 0xcc, 0xdc, 0xed, 0xc9, 0x4e, 0x2a, 0x5c, 0xf9, 0x43, 0x54, 0xfe, 0x23, - 0xce, 0xba, 0x86, 0xe2, 0xfb, 0x92, 0x85, 0xce, 0xe1, 0xb4, 0xad, 0x23, 0x7e, 0xfa, 0xb3, 0x54, 0x82, 0xb2, 0xc5, 0x2f, 0x9d, 0xce, 0x40, 0x0e, 0xd7, 0x79, 0x3e, 0x12, 0xd1, 0xaa, 0x50, 0xbb, - 0xd3, 0x93, 0x32, 0x08, 0xf7, 0x49, 0x14, 0x0f, 0xc3, 0xbb, 0xc8, 0x3b, 0x39, 0x83, 0xb6, 0xd6, 0xfa, 0x1b, 0xf4, 0xe3, 0x30, 0x49, 0x1e, 0x47, 0x71, 0xcf, 0x3b, 0x39, 0x3b, 0x3b, 0x83, 0x23, - 0x03, 0xfd, 0xae, 0xc0, 0x0c, 0x99, 0xa2, 0x24, 0x97, 0x6f, 0x1a, 0x3b, 0x44, 0xa5, 0xe7, 0x87, 0x9a, 0xf4, 0xd8, 0x98, 0x16, 0x1c, 0xeb, 0xb3, 0xae, 0xfd, 0xbb, 0xfc, 0xf9, 0x59, 0x4b, 0x4a, - 0x50, 0x6c, 0x68, 0x8a, 0x63, 0x4e, 0x99, 0xba, 0x23, 0x8c, 0x2c, 0x50, 0xfc, 0xd2, 0xe9, 0x24, 0x98, 0xae, 0x05, 0x55, 0xbb, 0xb1, 0xe0, 0x8a, 0xa7, 0x3c, 0x87, 0x00, 0x2c, 0xf5, 0xe1, 0xf9, - 0x64, 0x57, 0xe0, 0x2f, 0x9d, 0xce, 0x24, 0x97, 0x1f, 0x2e, 0xbf, 0x87, 0x86, 0x13, 0x55, 0xe6, 0xfa, 0x34, 0xc7, 0xd3, 0x93, 0xc3, 0xac, 0x19, 0xd3, 0x9a, 0x40, 0x38, 0x39, 0xab, 0xec, 0xfa, - 0xfd, 0xf8, 0xea, 0x53, 0x46, 0xe5, 0x12, 0xb3, 0x03, 0x2c, 0xbd, 0x5a, 0x4c, 0xb6, 0xd3, 0xe8, 0x3d, 0x4b, 0xd7, 0xae, 0x6d, 0x38, 0xb6, 0x01, 0x8d, 0x05, 0xdf, 0xd0, 0x4c, 0xaf, 0x84, 0xae, - 0x54, 0x84, 0x65, 0x44, 0x64, 0xf4, 0x9f, 0x98, 0xb9, 0xb0, 0x25, 0x3b, 0xdd, 0x93, 0x04, 0x2a, 0x41, 0x71, 0x53, 0x7e, 0x4e, 0xe9, 0xde, 0x0e, 0x80, 0x88, 0x85, 0xed, 0x15, 0x5b, 0x9a, 0xdb, - 0x56, 0x63, 0x3e, 0xd0, 0x9a, 0xfd, 0x6d, 0xc6, 0xd5, 0x12, 0x1e, 0xcd, 0x2e, 0x5d, 0x7e, 0x39, 0x63, 0x9c, 0xb5, 0xab, 0x67, 0x34, 0xeb, 0xa7, 0xbe, 0xb7, 0xfd, 0xc6, 0xbc, 0xd1, 0xbd, 0xeb, - 0x4d, 0x6f, 0x07, 0xc3, 0x68, 0x1a, 0xc6, 0x3f, 0x24, 0x81, 0xf7, 0x9d, 0xe3, 0x78, 0x87, 0x17, 0x9b, 0x07, 0x6f, 0x5d, 0x90, 0xd5, 0x1a, 0x3d, 0x1a, 0x4f, 0xea, 0x87, 0x5e, 0x74, 0x75, 0xff, - 0x83, 0x3d, 0x6a, 0xa7, 0x39, 0x91, 0xb2, 0x20, 0x6a, 0xf9, 0xa2, 0x5d, 0xb9, 0xed, 0x5e, 0x79, 0xd9, 0xac, 0xd6, 0xb9, 0xa2, 0x77, 0x3c, 0x5b, 0xe7, 0x38, 0x2e, 0x3b, 0x61, 0xaf, 0x9a, 0x4b, - 0x83, 0x37, 0xe6, 0xca, 0x5a, 0x54, 0x75, 0x05, 0xee, 0x75, 0x97, 0x36, 0x7a, 0xe0, 0x7d, 0xa7, 0xfb, 0xa4, 0xd9, 0x12, 0x6f, 0xa3, 0x87, 0xe8, 0x16, 0x3e, 0x40, 0x63, 0x2a, 0xaf, 0xa6, 0x1d, - 0x7d, 0xbf, 0x9b, 0x83, 0x17, 0x2b, 0xe5, 0x87, 0xf2, 0xe2, 0x3f, 0x1a, 0x1f, 0x1a, 0x24, 0x5e, 0xfd, 0xb7, 0xe7, 0xfc, 0x9e, 0x4d, 0x9d, 0x4b, 0x75, 0xb4, 0xaa, 0xd7, 0xdb, 0xe8, 0x9f, 0xb0, - 0xab, 0x73, 0xa9, 0xde, 0x5b, 0xd6, 0xab, 0xd7, 0xbf, 0x21, 0xe1, 0x9d, 0x75, 0xbd, 0x7a, 0xbd, 0xdf, 0xd7, 0xb5, 0x8b, 0xa5, 0x8f, 0x05, 0x29, 0x3f, 0xc3, 0x57, 0x9f, 0x22, 0x74, 0x85, 0x1d, - 0x7f, 0xef, 0xab, 0xb7, 0x3e, 0xf3, 0x05, 0xe7, 0xe8, 0x03, 0x8e, 0xa1, 0x6a, 0x7c, 0xc1, 0x31, 0x52, 0x9d, 0x26, 0xdd, 0x24, 0x8a, 0xef, 0x06, 0xc3, 0x70, 0x12, 0x69, 0x30, 0x37, 0x28, 0xf1, - 0x99, 0x2a, 0x38, 0x4c, 0x95, 0x39, 0x3a, 0xbf, 0x3a, 0x3c, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, - 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x73, - 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x56, 0x5d, 0x6f, 0xf3, 0x26, 0x14, 0xbe, 0xcf, 0xaf, - 0xb0, 0xa2, 0x5d, 0xce, 0x90, 0xa4, 0x9b, 0x36, 0x45, 0xd4, 0x55, 0x35, 0xb5, 0x6a, 0xa5, 0x76, 0xad, 0x94, 0x6e, 0xda, 0x2d, 0xc5, 0x27, 0x0e, 0x9d, 0x0d, 0x08, 0x70, 0xe2, 0x6a, 0xda, 0x7f, - 0x7f, 0x65, 0xb0, 0x1d, 0xdb, 0xc1, 0xfd, 0x78, 0xa5, 0xbe, 0xb9, 0x8a, 0x39, 0xcf, 0x81, 0xe7, 0x7c, 0x3d, 0x40, 0x2e, 0xaa, 0x22, 0x8f, 0xf6, 0xa0, 0x0d, 0x97, 0xe2, 0x7c, 0xbe, 0x44, 0x8b, - 0x79, 0x04, 0x82, 0xc9, 0x94, 0x8b, 0xec, 0x7c, 0xfe, 0xd7, 0xd3, 0x75, 0xfc, 0xfb, 0xfc, 0x22, 0x99, 0x11, 0xa5, 0xe5, 0x0b, 0x30, 0x1b, 0x55, 0x45, 0x2e, 0xcc, 0xf9, 0x7c, 0x67, 0xad, 0x5a, - 0x63, 0x5c, 0xd0, 0x3d, 0x08, 0x44, 0x15, 0x65, 0x3b, 0x40, 0x52, 0x67, 0xf8, 0xf1, 0xe1, 0x1e, 0xff, 0x82, 0x16, 0xf5, 0x2e, 0x0e, 0xb9, 0xae, 0x0c, 0xef, 0xd0, 0x87, 0xc3, 0x01, 0x1d, 0xce, - 0x1c, 0x6e, 0xb5, 0x58, 0x2c, 0xf1, 0x3f, 0xf7, 0x77, 0x1b, 0xb6, 0x83, 0x82, 0xc6, 0x5c, 0x18, 0x4b, 0x05, 0x83, 0xf9, 0x2c, 0x6a, 0x7f, 0x95, 0xe1, 0x6b, 0xe3, 0xac, 0x77, 0x92, 0x51, 0xeb, - 0xd8, 0xbd, 0x7b, 0x6a, 0x54, 0x23, 0x4c, 0x08, 0x52, 0x99, 0xd4, 0x2f, 0xc6, 0x0e, 0x88, 0x2a, 0x93, 0xce, 0x93, 0x59, 0x14, 0x91, 0x42, 0xa6, 0x90, 0xff, 0xed, 0xe3, 0x4f, 0x9c, 0x8d, 0xe0, - 0xc1, 0xda, 0xac, 0x46, 0x29, 0xaa, 0x41, 0xd8, 0xc4, 0xd1, 0x23, 0x99, 0x96, 0xa5, 0xba, 0x4d, 0x13, 0xa9, 0x33, 0x64, 0x94, 0xe6, 0x22, 0xdb, 0x6a, 0x5a, 0xc0, 0x41, 0xea, 0x7f, 0xd1, 0xb3, - 0x94, 0x96, 0xe0, 0x16, 0xe1, 0xf1, 0x54, 0x5b, 0xbe, 0xa5, 0xcc, 0xde, 0xa6, 0x89, 0x87, 0xc7, 0x35, 0x2a, 0x36, 0x96, 0x6a, 0x0b, 0x3a, 0xf6, 0x7b, 0x13, 0xdc, 0x83, 0x79, 0xbf, 0xa6, 0x2a, - 0xc9, 0x19, 0x5a, 0xa0, 0x5f, 0x09, 0x6e, 0x3f, 0xbd, 0x51, 0x43, 0x4e, 0x2d, 0xdf, 0xc3, 0x23, 0xb5, 0x3b, 0xec, 0x22, 0xc1, 0x2d, 0xc9, 0x59, 0x8f, 0x23, 0x93, 0x05, 0x82, 0x8a, 0x16, 0x2a, - 0x07, 0x04, 0x7b, 0x10, 0xd6, 0x0c, 0xd8, 0xf5, 0xb9, 0x6d, 0x4b, 0xc1, 0xea, 0x3c, 0x8f, 0x99, 0x74, 0x3c, 0xea, 0xbc, 0x2d, 0xe3, 0xcd, 0x9f, 0x97, 0x8f, 0x9b, 0x9b, 0x87, 0xa7, 0x01, 0x21, - 0x22, 0x68, 0x01, 0xc9, 0xc6, 0x45, 0x17, 0xfd, 0x91, 0xcb, 0x32, 0x8d, 0xae, 0x9b, 0xed, 0xd6, 0xeb, 0x1b, 0x6b, 0x55, 0x74, 0xe5, 0x49, 0x10, 0xec, 0x90, 0xb5, 0x4b, 0x0a, 0x86, 0x69, 0xae, - 0x6a, 0x4c, 0x72, 0x19, 0x05, 0x7d, 0x7f, 0x8e, 0x86, 0xbe, 0x7d, 0x17, 0x5f, 0x17, 0x2d, 0x15, 0x68, 0xcb, 0xc1, 0x34, 0x69, 0x79, 0xa1, 0x7b, 0x8a, 0x5a, 0x62, 0xcb, 0xdf, 0x08, 0x1e, 0x2c, - 0x78, 0x4c, 0x53, 0x04, 0x56, 0x1f, 0xd5, 0x99, 0x56, 0x8b, 0xd5, 0x0a, 0x2d, 0xd0, 0x8a, 0xe0, 0xa0, 0xd9, 0x7b, 0x32, 0x59, 0x28, 0x9e, 0xd7, 0x35, 0xcb, 0xcb, 0x8c, 0x0b, 0x74, 0xac, 0xd0, - 0x72, 0x59, 0x37, 0xce, 0x94, 0xbd, 0x39, 0xb7, 0xd4, 0xb0, 0xe5, 0x1a, 0x4e, 0xbd, 0x5d, 0xd7, 0x4d, 0x99, 0xbd, 0xb3, 0xef, 0xe8, 0xf6, 0x00, 0xa4, 0x68, 0xdd, 0x72, 0x16, 0xb4, 0x49, 0xac, - 0x2e, 0x81, 0xe0, 0x69, 0x7b, 0xd0, 0xdf, 0xc8, 0x52, 0x33, 0x70, 0x19, 0x0a, 0x5b, 0x82, 0x5e, 0x96, 0xea, 0x0c, 0x6c, 0xc8, 0xab, 0xb1, 0x78, 0xaf, 0x46, 0x2c, 0xd0, 0x73, 0xc9, 0xf3, 0xb4, - 0xd9, 0xf0, 0xaa, 0x11, 0x95, 0xc4, 0x69, 0x0a, 0xc1, 0x6f, 0x62, 0x86, 0xdb, 0x68, 0x50, 0x52, 0x5b, 0x2e, 0x32, 0x24, 0x4b, 0xab, 0x4a, 0x3b, 0xb5, 0xd5, 0x24, 0xce, 0x4f, 0x47, 0xaf, 0x55, - 0x7c, 0xfb, 0x29, 0x10, 0x29, 0x08, 0xf6, 0x7a, 0x4f, 0x05, 0xcd, 0xa0, 0x38, 0x0e, 0x78, 0x67, 0xea, 0xfa, 0x6a, 0x80, 0x4f, 0x3a, 0x95, 0x7a, 0x53, 0x0a, 0x5c, 0x03, 0x8d, 0xb4, 0x60, 0x42, - 0x0f, 0x1c, 0x34, 0xee, 0x1f, 0x7b, 0x2a, 0x07, 0x03, 0x49, 0xf8, 0xe9, 0xbf, 0x50, 0x97, 0xfe, 0x3f, 0x12, 0x09, 0xe7, 0x62, 0x5f, 0x15, 0x24, 0x4a, 0x16, 0x04, 0xbb, 0x7f, 0x47, 0x83, 0x61, - 0x52, 0x41, 0xc2, 0x8b, 0x3a, 0x69, 0x04, 0xfb, 0xaf, 0x36, 0x58, 0x3c, 0x8e, 0xb6, 0xb7, 0xd2, 0x24, 0xa5, 0x8f, 0xe9, 0x67, 0x70, 0x16, 0x4c, 0x60, 0x20, 0x7d, 0x9f, 0xd5, 0xd1, 0xf7, 0x95, - 0x94, 0x32, 0x5b, 0x52, 0x2b, 0x75, 0x40, 0x4b, 0x4f, 0x03, 0xfa, 0x11, 0x84, 0x0e, 0xf0, 0xbc, 0xcd, 0xcb, 0xea, 0x2b, 0xf8, 0x84, 0xbb, 0x6b, 0xb2, 0xb7, 0x5a, 0x46, 0xad, 0xc8, 0xd7, 0xd4, - 0xbe, 0x82, 0xd6, 0x77, 0xa5, 0xc9, 0x82, 0x09, 0xdc, 0x7f, 0x5d, 0x8b, 0x7a, 0x73, 0xaf, 0x41, 0xc7, 0x34, 0xc7, 0xcd, 0x59, 0x2f, 0x39, 0x5d, 0x69, 0x85, 0xc4, 0x09, 0xea, 0x78, 0xcc, 0x3b, - 0x83, 0xe9, 0x0d, 0x85, 0x5f, 0x39, 0x2e, 0x8c, 0xc2, 0x6d, 0x5e, 0x14, 0x5e, 0xfc, 0x1a, 0xef, 0xc0, 0x88, 0x0f, 0x43, 0xf6, 0xef, 0x8e, 0xd1, 0xdd, 0x10, 0x1e, 0xf0, 0xc1, 0x88, 0x4f, 0xdc, - 0x26, 0xc1, 0x29, 0xc7, 0x63, 0xe2, 0x5f, 0x18, 0xc9, 0xe8, 0xa2, 0xfa, 0x40, 0x24, 0x13, 0x57, 0xdb, 0x47, 0x22, 0x69, 0xbf, 0x5b, 0x1d, 0xc1, 0xa7, 0xc5, 0xec, 0x17, 0xd9, 0x8c, 0x6a, 0xdb, - 0xdb, 0xb8, 0x1f, 0x7d, 0xa6, 0x29, 0xcd, 0xf7, 0x85, 0xbf, 0x7d, 0xac, 0x94, 0x79, 0x28, 0xf6, 0x7e, 0xe4, 0xc2, 0x3d, 0xb6, 0x62, 0x9f, 0x80, 0xe9, 0xb8, 0x4f, 0xd8, 0xbf, 0xc9, 0xe2, 0x43, - 0xc3, 0x33, 0x3d, 0x3e, 0x9f, 0x23, 0x33, 0x48, 0x24, 0xc1, 0xcd, 0x7c, 0x74, 0xb7, 0x67, 0x32, 0xfb, 0x16, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb0, 0xa0, 0x7c, 0xf1, 0x20, 0x03, + 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xc4, 0x57, 0x6d, 0x6f, + 0xdb, 0xc8, 0x11, 0xfe, 0xce, 0x5f, 0x31, 0xb5, 0x0d, 0x5c, 0x6c, 0x98, 0xd4, 0xa5, 0xc1, 0xa1, 0x80, 0xd0, 0x04, 0xf0, 0x5b, 0x72, 0x4a, 0x6d, 0x9f, 0xa1, 0xc8, 0x39, 0x1c, 0xee, 0x0a, 0x73, + 0xb5, 0x1c, 0x89, 0x1b, 0x2d, 0x77, 0xd8, 0x7d, 0xa1, 0x22, 0xa0, 0xe8, 0x6f, 0x2f, 0x66, 0x97, 0x94, 0xac, 0xd8, 0xee, 0xdd, 0x87, 0xa2, 0xf5, 0x27, 0x5a, 0x9c, 0xd7, 0x67, 0xe6, 0x99, 0x19, + 0x1e, 0xc2, 0xfb, 0x60, 0xa4, 0x57, 0x64, 0xa0, 0xb5, 0xf4, 0x05, 0xa5, 0xcf, 0xb2, 0x9f, 0x51, 0x4b, 0x6a, 0x10, 0x3c, 0xc1, 0x86, 0x82, 0x05, 0x83, 0xeb, 0x27, 0x52, 0x7f, 0xca, 0xb2, 0x59, + 0xad, 0x1c, 0x38, 0xd1, 0xb4, 0x1a, 0x87, 0x5f, 0x41, 0x92, 0xf1, 0x42, 0x19, 0x07, 0x02, 0x9c, 0x32, 0x4b, 0x8d, 0xb0, 0x18, 0x14, 0xe7, 0xc2, 0x61, 0x05, 0x64, 0xe0, 0x53, 0x6b, 0x95, 0x59, + 0xc2, 0x85, 0xa6, 0x50, 0x6d, 0xed, 0x8e, 0xa1, 0x1c, 0x24, 0x5d, 0x11, 0x5f, 0x0d, 0x6f, 0xce, 0xda, 0x56, 0x2b, 0x29, 0xf8, 0xb1, 0x40, 0x59, 0xd3, 0xab, 0xe3, 0xf2, 0x14, 0xd6, 0xb5, 0x92, + 0x35, 0x58, 0xf4, 0xc1, 0xb2, 0x33, 0x03, 0xfc, 0x06, 0x68, 0x01, 0xbe, 0x46, 0xa8, 0x84, 0x17, 0xd0, 0x0a, 0xc7, 0xfe, 0x3a, 0x25, 0xe0, 0xc7, 0xd9, 0xec, 0x0e, 0x2c, 0xfe, 0x23, 0xa0, 0xf3, + 0x45, 0x96, 0x1d, 0x1e, 0xc2, 0x35, 0x49, 0xa1, 0x01, 0xbf, 0xa2, 0x0c, 0x6c, 0x37, 0xcb, 0x6e, 0xc4, 0x0a, 0xc1, 0x05, 0x8b, 0xe0, 0x6b, 0xe1, 0xa1, 0xfc, 0x28, 0x3a, 0x01, 0xaf, 0xff, 0x02, + 0x9f, 0x2e, 0xff, 0x56, 0x82, 0x72, 0xa0, 0x8c, 0xf3, 0x42, 0x6b, 0xac, 0x38, 0x2d, 0x89, 0x43, 0x0e, 0xe7, 0x44, 0x1e, 0xde, 0x14, 0xdf, 0x47, 0xeb, 0xca, 0xa2, 0x83, 0x5e, 0xb1, 0xc8, 0xb2, + 0x19, 0x81, 0xf3, 0xc2, 0x7a, 0x70, 0x68, 0x3b, 0xb4, 0xa0, 0xd9, 0xa7, 0xde, 0x80, 0x0d, 0x06, 0xca, 0x62, 0xd4, 0x74, 0x66, 0x0d, 0x2e, 0x9a, 0xc9, 0xe7, 0x44, 0x7e, 0x6c, 0x83, 0x29, 0x8b, + 0x6c, 0x56, 0x23, 0x48, 0x6a, 0x1a, 0x61, 0xaa, 0xa4, 0xee, 0xa0, 0xf6, 0xbe, 0x1d, 0x8c, 0xf0, 0xcf, 0x22, 0x78, 0x6a, 0x84, 0x57, 0xc9, 0xdc, 0x5a, 0x78, 0x59, 0xa3, 0x83, 0x05, 0x59, 0x90, + 0xb5, 0x30, 0x4b, 0x74, 0x8c, 0x83, 0xa3, 0x60, 0x25, 0x9b, 0xaa, 0xb0, 0xc8, 0x26, 0x7b, 0xff, 0x6f, 0xc5, 0x18, 0xab, 0xf4, 0x0c, 0x6b, 0xa5, 0x35, 0xcc, 0x63, 0x1d, 0x5b, 0xb1, 0x14, 0x1e, + 0x2b, 0xae, 0xbe, 0x0d, 0xc6, 0x70, 0x9a, 0xc9, 0x79, 0x01, 0x13, 0x0f, 0x42, 0x3b, 0x02, 0x6a, 0xd1, 0x38, 0xa8, 0x70, 0x1e, 0x96, 0x4b, 0x7e, 0xdf, 0x92, 0xf5, 0x50, 0xfe, 0xf0, 0xfd, 0xf7, + 0x3f, 0x94, 0x99, 0x23, 0x10, 0xfd, 0x2b, 0xb4, 0x20, 0x85, 0x61, 0xb3, 0xc2, 0x7b, 0x21, 0x6b, 0xac, 0x40, 0x2d, 0xc0, 0x20, 0x56, 0x58, 0x25, 0x80, 0x18, 0x0b, 0x8f, 0xce, 0xbb, 0x67, 0xd1, + 0xe1, 0x37, 0x65, 0x2a, 0x18, 0xc3, 0x12, 0x1b, 0xa4, 0x84, 0x8b, 0xeb, 0x49, 0x96, 0x4d, 0xfc, 0x77, 0x0e, 0x2c, 0x32, 0x52, 0x68, 0xaa, 0x14, 0xad, 0x43, 0x0f, 0xe5, 0xfb, 0xfb, 0xdb, 0x8b, + 0x87, 0xe9, 0xd5, 0x87, 0xc9, 0xa7, 0xd9, 0xf4, 0x97, 0x12, 0xd0, 0x74, 0xca, 0x92, 0x69, 0xd0, 0x78, 0xe8, 0x84, 0x55, 0x62, 0xae, 0xb1, 0xc8, 0xb2, 0xb2, 0x2c, 0x5d, 0x8d, 0x5a, 0x83, 0x93, + 0x56, 0xb5, 0x3e, 0x3b, 0x04, 0x8b, 0xad, 0x16, 0x12, 0xe1, 0x5f, 0xa3, 0x62, 0x2e, 0x5c, 0x6d, 0x25, 0xcc, 0x37, 0xa9, 0xfb, 0x93, 0xa0, 0x95, 0xb0, 0x50, 0x1a, 0x1f, 0x49, 0x56, 0x24, 0x57, + 0x68, 0x0b, 0x45, 0xa3, 0x2f, 0x54, 0x9b, 0x8a, 0x18, 0x44, 0x5f, 0x27, 0x1d, 0x8b, 0x4b, 0xe5, 0xbc, 0xdd, 0x64, 0xf8, 0x35, 0x62, 0xb3, 0x17, 0xd5, 0xdb, 0x27, 0x9a, 0x59, 0xec, 0xde, 0x83, + 0x3f, 0x26, 0x7c, 0x00, 0xef, 0xde, 0xed, 0xc2, 0xe4, 0x54, 0x18, 0xa1, 0x43, 0x38, 0x0f, 0x4a, 0x57, 0xca, 0x2c, 0x7b, 0x62, 0x0e, 0x4d, 0x34, 0xe7, 0x9f, 0x23, 0x45, 0x7e, 0xba, 0x98, 0x80, + 0x6a, 0xc4, 0x12, 0x63, 0xaf, 0x70, 0xf1, 0x07, 0xc6, 0x15, 0x70, 0xbe, 0x81, 0x0a, 0x17, 0x22, 0x68, 0x7f, 0x0a, 0x9e, 0xd5, 0x53, 0x43, 0xb0, 0x2e, 0x08, 0xf8, 0xf8, 0xf9, 0x26, 0x69, 0x3e, + 0x03, 0x1d, 0xdb, 0xe8, 0x05, 0xf3, 0x0e, 0x9e, 0xfc, 0x1d, 0xf6, 0xef, 0xa2, 0x7a, 0x0a, 0xf6, 0xe4, 0xe4, 0x96, 0x3c, 0x9e, 0x9c, 0x8c, 0x61, 0xb2, 0x60, 0xb8, 0x60, 0x2d, 0x8c, 0xe7, 0x02, + 0xa2, 0xe1, 0xf2, 0xc4, 0xc8, 0x8c, 0xf0, 0xaa, 0xc3, 0xa4, 0x7b, 0x1a, 0x85, 0xb8, 0x6d, 0xa2, 0x50, 0xa5, 0x7c, 0x14, 0x89, 0xed, 0x50, 0x6c, 0x44, 0xa3, 0xcb, 0x58, 0x1a, 0xe6, 0x46, 0xc6, + 0x3d, 0x10, 0x5f, 0x9e, 0xdf, 0x3d, 0xdc, 0x9e, 0xcd, 0x26, 0x9f, 0xaf, 0x1e, 0x26, 0x37, 0x67, 0x1f, 0xae, 0xca, 0x04, 0x0f, 0xda, 0x2b, 0xd3, 0x6d, 0x1b, 0x81, 0xcd, 0x79, 0x1b, 0x70, 0x1c, + 0xb3, 0x62, 0x4b, 0x59, 0x74, 0x78, 0x65, 0x3a, 0x37, 0xce, 0x00, 0x72, 0x30, 0xa2, 0xc1, 0x31, 0x7c, 0x63, 0x2b, 0xe3, 0xbc, 0x3a, 0xa1, 0x03, 0x8e, 0xe1, 0x80, 0xf5, 0x0f, 0x5e, 0xc8, 0xab, + 0x16, 0x1d, 0x82, 0x72, 0x2e, 0xa0, 0x4b, 0xbd, 0xc1, 0x91, 0xfd, 0xda, 0x8f, 0x8e, 0xb3, 0x9f, 0x66, 0x7f, 0x7f, 0xc5, 0xd4, 0x76, 0xe3, 0xd1, 0xa8, 0x22, 0xe9, 0x8a, 0x34, 0x0c, 0xb8, 0xd2, + 0xfd, 0x58, 0x58, 0x58, 0xd1, 0xe0, 0x9a, 0xec, 0x2a, 0xbe, 0x1f, 0xc9, 0x60, 0x2d, 0x1a, 0x3f, 0xb2, 0xb8, 0x40, 0x8b, 0x46, 0xe2, 0xa8, 0xf6, 0x8d, 0x1e, 0x49, 0xb2, 0x58, 0xf0, 0xd3, 0x61, + 0x7c, 0x12, 0xe4, 0x8f, 0x99, 0xc6, 0x12, 0x1d, 0x4f, 0x60, 0x50, 0x26, 0xb5, 0xe4, 0x23, 0x28, 0x99, 0x94, 0x3c, 0x38, 0x53, 0xa5, 0x69, 0xb1, 0xe0, 0x5e, 0x67, 0x5c, 0x59, 0xfe, 0x25, 0x68, + 0xc1, 0x62, 0x43, 0x5d, 0xaa, 0x4e, 0x99, 0xdf, 0xa5, 0x02, 0x95, 0xec, 0x29, 0x4a, 0x2c, 0x2c, 0x35, 0x5b, 0xe4, 0x6f, 0xce, 0x3e, 0x5f, 0xdd, 0x3e, 0x9c, 0xdf, 0x4f, 0xae, 0x2f, 0x1f, 0xce, + 0xa6, 0x1f, 0xee, 0x6f, 0xae, 0x6e, 0x67, 0x9f, 0x9e, 0x2d, 0xc1, 0x1f, 0x80, 0xfe, 0x59, 0x63, 0x8f, 0x6b, 0x30, 0x04, 0x03, 0xf9, 0x65, 0x23, 0x3a, 0x34, 0x05, 0xcf, 0x8d, 0xc2, 0xad, 0x54, + 0xfb, 0x96, 0xab, 0x03, 0x79, 0x6e, 0x28, 0xf7, 0x56, 0x18, 0xb7, 0x40, 0x9b, 0xb7, 0x96, 0x96, 0x16, 0x9d, 0x83, 0x56, 0xc8, 0xd5, 0xb6, 0x27, 0xdf, 0xc1, 0x94, 0xd3, 0xdb, 0x02, 0xf0, 0x34, + 0xc1, 0x06, 0x85, 0x71, 0x69, 0x3b, 0xc4, 0x76, 0x24, 0xd0, 0x64, 0x78, 0xc4, 0x0d, 0xa3, 0x73, 0xe8, 0xa8, 0x9e, 0x34, 0xbc, 0x02, 0xfb, 0xb8, 0x06, 0xea, 0x30, 0x4b, 0xa7, 0x69, 0xa4, 0x7e, + 0x43, 0x52, 0x1b, 0x8c, 0xdb, 0x32, 0x72, 0x3b, 0x0b, 0x95, 0x01, 0x31, 0x6c, 0x54, 0xb4, 0x59, 0x70, 0x43, 0x78, 0x89, 0xc5, 0xd2, 0x62, 0x1c, 0xd4, 0x62, 0x4e, 0xdd, 0x8b, 0xcc, 0xb4, 0xc1, + 0xec, 0x46, 0xc4, 0x25, 0xb6, 0x9a, 0x36, 0x4f, 0xdd, 0x3f, 0x26, 0xbb, 0xa9, 0xa0, 0x8a, 0x62, 0x7b, 0x13, 0x02, 0x94, 0xf1, 0x04, 0x52, 0x07, 0xe7, 0xd1, 0xbe, 0xe4, 0xab, 0xd7, 0xcb, 0x3b, + 0x38, 0x4c, 0x7b, 0xc2, 0x5b, 0xc5, 0x5b, 0xc0, 0x25, 0xdb, 0xbb, 0x38, 0xde, 0x93, 0x85, 0xb3, 0xe9, 0xcd, 0xd0, 0xa6, 0x64, 0xfb, 0xe3, 0xc0, 0x6d, 0x9c, 0xc7, 0xc6, 0x65, 0xd9, 0x30, 0xcb, + 0xf6, 0xf6, 0xac, 0x68, 0xdb, 0x9e, 0x47, 0x77, 0x62, 0x85, 0x9e, 0x52, 0x3f, 0x71, 0x19, 0x1d, 0x9f, 0x15, 0xc2, 0xfc, 0x07, 0x9b, 0xa7, 0xa0, 0xd5, 0x0a, 0xa3, 0x4c, 0xcb, 0xf7, 0xca, 0x8d, + 0x90, 0x73, 0xa2, 0x55, 0x32, 0x27, 0x0c, 0xdc, 0xbc, 0x06, 0xb2, 0x70, 0xf3, 0x67, 0x90, 0xb5, 0x6a, 0x4f, 0xa1, 0x22, 0x74, 0xe6, 0x3b, 0x0f, 0x4c, 0x3e, 0x58, 0x73, 0x9e, 0x22, 0xcd, 0x95, + 0x86, 0x78, 0x95, 0x14, 0xbc, 0xbb, 0xe2, 0x3b, 0x61, 0x29, 0x98, 0x2a, 0x11, 0x69, 0xa0, 0x56, 0x02, 0x72, 0x57, 0x27, 0xea, 0x19, 0x18, 0xcb, 0xda, 0xc7, 0x03, 0xa9, 0x98, 0xbf, 0x7e, 0x54, + 0xf3, 0xdd, 0x14, 0x58, 0x2a, 0x5f, 0x87, 0x79, 0x21, 0xa9, 0x19, 0x7d, 0x20, 0x5a, 0x6a, 0xbc, 0x18, 0x6a, 0x3f, 0x23, 0xd2, 0x6e, 0xf4, 0x45, 0xcd, 0x8f, 0xe3, 0x85, 0x60, 0x12, 0x8f, 0xd7, + 0x14, 0xf4, 0x5e, 0xb5, 0x3e, 0xaa, 0x39, 0x2c, 0xd1, 0xa0, 0x8d, 0x7d, 0xf1, 0x68, 0x62, 0x67, 0xfd, 0x46, 0x95, 0xd4, 0xb4, 0xdc, 0xcc, 0x92, 0x9a, 0x62, 0x19, 0x5d, 0x14, 0x92, 0x6f, 0xad, + 0xc2, 0xb3, 0x83, 0xf1, 0x17, 0x35, 0xcf, 0x23, 0x85, 0xf2, 0x56, 0x87, 0xa5, 0x32, 0xe3, 0x37, 0xc5, 0x9b, 0xe2, 0xf5, 0x38, 0xad, 0xa0, 0xf3, 0x34, 0xe3, 0x2f, 0xa3, 0xd9, 0xb7, 0x47, 0x7b, + 0x5b, 0x6a, 0xc4, 0x0b, 0x6c, 0xbf, 0x09, 0xf2, 0x08, 0xc3, 0xdb, 0x85, 0xd0, 0x8e, 0x29, 0xf8, 0xb2, 0x56, 0xdf, 0x15, 0xbb, 0x0b, 0x53, 0x99, 0x8e, 0xd2, 0xbd, 0x97, 0x65, 0xef, 0xfb, 0x4d, + 0x85, 0x5f, 0xe3, 0x9d, 0xe9, 0x60, 0x8e, 0x9a, 0xd6, 0xa7, 0xd0, 0x6a, 0x14, 0x0e, 0x99, 0x76, 0xe9, 0x68, 0x4b, 0xdb, 0x3f, 0x52, 0xf7, 0x7e, 0x7a, 0x5d, 0xee, 0x8f, 0xf8, 0x1a, 0xc1, 0x52, + 0xf0, 0xc8, 0x77, 0x51, 0xac, 0xc4, 0x76, 0xef, 0x65, 0xd9, 0x2f, 0x14, 0x60, 0xd9, 0xab, 0x26, 0xa1, 0xf9, 0x06, 0x16, 0xa4, 0x35, 0xad, 0xb9, 0x40, 0x3d, 0x43, 0x5e, 0xea, 0x78, 0x65, 0x16, + 0x7d, 0x02, 0x3c, 0xfa, 0xa3, 0x91, 0x38, 0x94, 0xd8, 0xd3, 0xc9, 0xc9, 0x94, 0xed, 0xb9, 0xf1, 0xc9, 0xc9, 0x6e, 0x3a, 0x52, 0xf0, 0x6d, 0xf0, 0xa7, 0xe9, 0x56, 0x39, 0x8a, 0xa1, 0x7a, 0x02, + 0xe5, 0x5d, 0xd2, 0x2b, 0xb2, 0xec, 0xe1, 0x61, 0x36, 0xb9, 0x7b, 0x78, 0x18, 0x67, 0x59, 0xbf, 0x45, 0x82, 0x43, 0x28, 0x57, 0xa6, 0x64, 0x7d, 0xb3, 0x6d, 0xb2, 0x21, 0xdd, 0x60, 0x35, 0xcc, + 0x37, 0xe3, 0xe7, 0x4e, 0x9a, 0x95, 0x89, 0x87, 0x9b, 0xe2, 0x5b, 0x05, 0xf9, 0xd7, 0x39, 0xc2, 0x5f, 0xb7, 0x84, 0xe6, 0xf9, 0xfa, 0x2e, 0xd2, 0xdd, 0xd5, 0xb4, 0xee, 0x73, 0x0f, 0x56, 0x0f, + 0x27, 0xcb, 0xfd, 0xf4, 0xfa, 0xed, 0xd1, 0xab, 0xe7, 0x6c, 0x1c, 0xbd, 0x62, 0x66, 0xb1, 0x3e, 0x1c, 0xdd, 0xfd, 0x7c, 0x79, 0x0c, 0x39, 0x05, 0xab, 0x8f, 0x77, 0xf4, 0x66, 0x1f, 0x59, 0x76, + 0x1f, 0x3b, 0xbc, 0xec, 0x71, 0xea, 0x68, 0x85, 0xe5, 0xa3, 0x81, 0x13, 0x59, 0xec, 0xeb, 0xfc, 0x3c, 0x92, 0x94, 0xbd, 0x2b, 0xb3, 0x7c, 0x26, 0x8d, 0x47, 0xea, 0x90, 0xe7, 0x5e, 0x58, 0x2e, + 0xd6, 0x01, 0x23, 0x17, 0xbb, 0xe7, 0x00, 0xf2, 0x3c, 0x9e, 0xfb, 0x07, 0x47, 0xaf, 0xd6, 0x35, 0x89, 0x46, 0x1d, 0xf7, 0xdb, 0x78, 0xf2, 0x4d, 0xad, 0x41, 0x6a, 0xe1, 0x78, 0x50, 0xe8, 0xcd, + 0xee, 0x2b, 0x85, 0xcc, 0x6e, 0xc4, 0x9d, 0xee, 0x03, 0xac, 0x91, 0xb7, 0x37, 0x85, 0x04, 0x73, 0xef, 0xb8, 0x15, 0xbe, 0xfe, 0xdd, 0x20, 0x9f, 0x8f, 0x87, 0x81, 0x91, 0xf7, 0xd3, 0xeb, 0xa7, + 0xda, 0x92, 0x6b, 0x98, 0x77, 0x7b, 0x59, 0xfd, 0xc6, 0x3b, 0xf0, 0x47, 0x38, 0xe0, 0x09, 0x80, 0xc6, 0xe7, 0xb3, 0x4d, 0x8b, 0x63, 0x8f, 0x5f, 0xfd, 0xa8, 0xd5, 0x42, 0x99, 0x5e, 0x60, 0x0d, + 0x07, 0xbf, 0x0d, 0xcf, 0xd5, 0xff, 0x17, 0x82, 0xbd, 0x24, 0xfe, 0x4b, 0xf1, 0x33, 0x64, 0xfc, 0xed, 0xa6, 0xf0, 0xa9, 0xbf, 0x74, 0x31, 0xef, 0x34, 0xe0, 0x9f, 0xe9, 0x3b, 0x69, 0x1f, 0xc7, + 0xff, 0x3d, 0x0e, 0xbf, 0x17, 0xd7, 0x36, 0x35, 0xb8, 0xd0, 0x28, 0x4c, 0x68, 0xe3, 0x77, 0x90, 0xe4, 0xe7, 0xf4, 0xed, 0x1a, 0xc7, 0x27, 0x56, 0xbb, 0x60, 0x6d, 0x30, 0x8f, 0xfc, 0x0c, 0x43, + 0x56, 0xa3, 0x4f, 0xa7, 0xcb, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2a, 0x28, 0xfe, 0x0e, 0x8f, 0x06, 0x00, 0x00, 0xc1, 0x0f, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, 0x25, 0xd9, 0xb9, 0xba, + 0x7b, 0x9e, 0xb3, 0x8f, 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, 0x70, 0x81, 0x1d, 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, 0xff, 0x7e, 0xd5, 0x33, + 0x12, 0x92, 0x00, 0x67, 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, 0xa3, 0x7e, 0x7f, 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, 0x9f, 0x53, 0x83, 0x73, + 0x16, 0x52, 0xae, 0x68, 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, 0x26, 0x24, 0x9c, 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, 0xf6, 0x9b, 0x83, 0xd7, + 0x07, 0x90, 0xf2, 0x88, 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, 0x12, 0xe6, 0x42, 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, 0x74, 0x4e, 0xb9, 0x56, + 0x3e, 0xc0, 0x80, 0x52, 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, 0xda, 0x30, 0x61, 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, 0x14, 0xf2, 0x1e, 0x26, + 0x42, 0x02, 0x89, 0x22, 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, 0x84, 0x9c, 0x1b, 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, 0x67, 0x1a, 0xc4, 0x92, + 0x53, 0xa9, 0x66, 0x2c, 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, 0xeb, 0x5c, 0x14, 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, 0x84, 0xf7, 0x54, 0x2a, + 0x54, 0xf7, 0xa5, 0x7f, 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, 0xf6, 0xd2, 0x3d, 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, 0x34, 0xd1, 0xc0, 0x38, + 0x84, 0x62, 0x9e, 0xc4, 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, 0xd6, 0x1c, 0x7c, 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, 0x20, 0xda, 0xa9, 0x39, + 0x35, 0x00, 0x80, 0x99, 0xd6, 0x89, 0x3a, 0x09, 0x82, 0xe5, 0x72, 0xe9, 0x13, 0x23, 0xad, 0x2f, 0xe4, 0x34, 0xc8, 0xd5, 0x0b, 0xce, 0x3b, 0xad, 0x76, 0x77, 0xd0, 0xf6, 0x5e, 0xfa, 0x47, 0x06, + 0xe5, 0x9a, 0xc7, 0x54, 0x29, 0x90, 0xf4, 0x73, 0xca, 0x24, 0x8d, 0x60, 0xbc, 0x02, 0x92, 0x24, 0x31, 0x0b, 0xc9, 0x38, 0xa6, 0x10, 0x93, 0x25, 0x3a, 0xce, 0xf8, 0xc7, 0xb8, 0x9d, 0x71, 0x58, + 0x4a, 0xa6, 0x19, 0x9f, 0x1e, 0x3a, 0x35, 0x50, 0xb9, 0xe7, 0xcb, 0xde, 0x29, 0xac, 0x95, 0x4b, 0xc7, 0x54, 0x05, 0x40, 0x70, 0x20, 0xe8, 0x1a, 0xb7, 0x39, 0x80, 0xce, 0xc0, 0x85, 0x57, 0xcd, + 0x41, 0x67, 0x70, 0x08, 0x37, 0x9d, 0xab, 0xb7, 0xbd, 0xeb, 0x2b, 0xb8, 0x69, 0xf6, 0xfb, 0xcd, 0xee, 0x55, 0xa7, 0x3d, 0x80, 0x5e, 0x1f, 0x5a, 0xbd, 0xee, 0x59, 0xe7, 0xaa, 0xd3, 0xeb, 0x0e, + 0xa0, 0xf7, 0x1a, 0x9a, 0xdd, 0x3f, 0x9c, 0x1a, 0xfc, 0xde, 0xe9, 0x9e, 0x1d, 0x02, 0x65, 0x7a, 0x46, 0x25, 0xd0, 0x87, 0x44, 0xa2, 0x06, 0x42, 0x02, 0x43, 0x4b, 0xd2, 0xa8, 0x14, 0x43, 0xb9, + 0x04, 0x18, 0x22, 0xd6, 0x3d, 0x2a, 0xa1, 0x21, 0x9b, 0xb0, 0x10, 0x62, 0xc2, 0xa7, 0x29, 0x99, 0x52, 0x98, 0x8a, 0x05, 0x95, 0x1c, 0x23, 0x24, 0xa1, 0x72, 0xce, 0x14, 0x3a, 0x54, 0x01, 0xe1, + 0x11, 0xc4, 0x6c, 0xce, 0xb4, 0x09, 0x24, 0xe5, 0xd4, 0xb6, 0xf5, 0xf2, 0x7f, 0x76, 0x86, 0xfd, 0x6c, 0x7a, 0x35, 0xb8, 0x20, 0x0b, 0xca, 0x61, 0xa0, 0x89, 0xd4, 0x70, 0x9d, 0xc0, 0x2b, 0xa2, + 0xc3, 0x19, 0xa8, 0x50, 0xb2, 0xc4, 0x06, 0x4c, 0x3f, 0x77, 0x7b, 0xbb, 0xfb, 0x1e, 0x16, 0x44, 0xaa, 0x93, 0x9d, 0x32, 0x98, 0xd0, 0x7a, 0xd7, 0x7c, 0xdf, 0x1c, 0xbe, 0xed, 0x5d, 0xb4, 0xc1, + 0x83, 0x58, 0x84, 0x36, 0xcf, 0xc5, 0x04, 0x08, 0xbc, 0x3b, 0xfb, 0x1d, 0x66, 0x62, 0x8e, 0x61, 0x20, 0x0d, 0xd9, 0x5e, 0x92, 0xe5, 0x62, 0x4e, 0x76, 0x17, 0x55, 0x43, 0xf4, 0xe2, 0xe5, 0x2e, + 0x92, 0x73, 0x14, 0xfb, 0xe5, 0x9e, 0x02, 0xc6, 0x95, 0x26, 0x71, 0x4c, 0xa3, 0x12, 0x7d, 0xc4, 0x6a, 0xbe, 0x6f, 0x77, 0x87, 0xbd, 0xcb, 0xab, 0x01, 0x78, 0x90, 0x10, 0x49, 0xe6, 0x54, 0x53, + 0xa9, 0x20, 0x21, 0xaa, 0x54, 0x9e, 0xde, 0x91, 0x05, 0x81, 0xf7, 0x17, 0xb0, 0x9c, 0x51, 0x0e, 0x32, 0xe5, 0xc6, 0xc7, 0xc6, 0x22, 0x36, 0x55, 0x80, 0xfa, 0x53, 0x1f, 0x81, 0x23, 0x3a, 0x4e, + 0xb3, 0x37, 0xc0, 0xb4, 0xa2, 0xf1, 0xe4, 0x10, 0xd3, 0x35, 0x83, 0x02, 0x50, 0x54, 0x97, 0x58, 0x36, 0xbc, 0x0f, 0x16, 0xc1, 0xfb, 0x20, 0x53, 0x7e, 0x17, 0x2d, 0x93, 0x13, 0x2d, 0x09, 0x57, + 0x89, 0x90, 0xba, 0x11, 0xe9, 0xa1, 0x12, 0xe1, 0x3d, 0xd5, 0x87, 0x8a, 0xca, 0x05, 0x95, 0x8d, 0xd5, 0xa1, 0x4a, 0x55, 0x42, 0x79, 0xd4, 0x58, 0x1d, 0x92, 0x28, 0xc2, 0x50, 0x6d, 0xfc, 0xfb, + 0xe8, 0xe8, 0xa8, 0xa4, 0xc7, 0xe0, 0xf7, 0xce, 0xe5, 0xb0, 0xdf, 0x02, 0x0f, 0x26, 0x31, 0x99, 0x1a, 0x81, 0x98, 0xb2, 0xe9, 0x27, 0x88, 0x29, 0x5d, 0xb9, 0x49, 0x64, 0x68, 0xaa, 0xc7, 0x4e, + 0x73, 0xfe, 0xc0, 0xcf, 0x71, 0xd8, 0x04, 0x3e, 0x82, 0xf7, 0x27, 0xb8, 0xf5, 0x8a, 0x48, 0x2e, 0x7c, 0x82, 0x53, 0xb4, 0x25, 0x77, 0x1c, 0x00, 0x0b, 0x34, 0x81, 0x80, 0xea, 0x30, 0xc8, 0xe5, + 0x59, 0x03, 0xa0, 0xa1, 0xfc, 0xca, 0x3b, 0x07, 0x60, 0xc2, 0xca, 0x88, 0x6e, 0x1d, 0x7d, 0x1d, 0xf8, 0xd9, 0x7b, 0x77, 0x13, 0x79, 0xf3, 0x7d, 0x46, 0x00, 0xff, 0xad, 0x41, 0x6f, 0x50, 0xe4, + 0xae, 0x4a, 0x13, 0xb4, 0xb6, 0x0f, 0x50, 0x5f, 0x10, 0x09, 0xc3, 0x79, 0xaa, 0xf4, 0x10, 0xc6, 0xd4, 0x78, 0x4a, 0x8b, 0xbc, 0x34, 0x68, 0x99, 0x52, 0xac, 0x0b, 0x13, 0x12, 0x63, 0xb6, 0x86, + 0xab, 0xe9, 0x92, 0xf1, 0x86, 0x79, 0x3a, 0x75, 0x22, 0x22, 0x4b, 0x4f, 0x73, 0xc6, 0xa7, 0x4b, 0xfb, 0xe0, 0x84, 0x44, 0x51, 0x70, 0x47, 0x29, 0x27, 0x73, 0x3a, 0x72, 0x81, 0xa1, 0x78, 0xad, + 0x3f, 0xde, 0xdc, 0x74, 0xba, 0x2f, 0x0e, 0x20, 0x23, 0x62, 0x48, 0x9f, 0x9e, 0x3a, 0x00, 0x17, 0x9d, 0xee, 0x9b, 0x9b, 0x17, 0x07, 0x60, 0x29, 0xe0, 0xb9, 0x39, 0x3e, 0x33, 0xe4, 0x5f, 0x1c, + 0x40, 0xc6, 0x07, 0x5f, 0x18, 0x35, 0x6b, 0x70, 0xad, 0x28, 0x04, 0xa9, 0x92, 0x41, 0xcc, 0xc6, 0xf4, 0x81, 0x86, 0xc1, 0x1d, 0x59, 0x90, 0xa1, 0x09, 0x70, 0x36, 0x01, 0xb2, 0x20, 0x2c, 0x46, + 0xef, 0x1f, 0x82, 0x40, 0x2d, 0x96, 0x0c, 0xeb, 0x17, 0x89, 0x63, 0x18, 0x93, 0xf0, 0x1e, 0xb5, 0x0b, 0xce, 0xd9, 0x58, 0x12, 0xb9, 0x0a, 0x30, 0xc0, 0x83, 0xb7, 0x62, 0x9e, 0x13, 0xc6, 0xaa, + 0x97, 0xd7, 0xff, 0x88, 0x2e, 0x68, 0x2c, 0x12, 0x2a, 0x7d, 0x2c, 0xe7, 0xd4, 0x0f, 0xc5, 0x1c, 0xf9, 0x19, 0xbc, 0x39, 0x09, 0x83, 0xcf, 0x24, 0xf8, 0x4c, 0x8e, 0x8f, 0xff, 0x75, 0x14, 0x0c, + 0x19, 0x8f, 0xe8, 0x83, 0x3f, 0xd3, 0xf3, 0xd8, 0xd0, 0x29, 0x62, 0x61, 0x9d, 0xf1, 0x2e, 0x7c, 0x2a, 0x39, 0x2a, 0x07, 0x79, 0x00, 0x77, 0xb7, 0x1a, 0x9b, 0xe0, 0x80, 0x45, 0x5a, 0x48, 0x5d, + 0x94, 0x90, 0x86, 0x3b, 0xda, 0x8d, 0x3a, 0x72, 0x33, 0x1c, 0x8a, 0x9e, 0x78, 0x1a, 0x7d, 0xdb, 0x06, 0x39, 0xe2, 0x84, 0x39, 0xa5, 0xff, 0x9c, 0x9e, 0x3a, 0x54, 0x91, 0xb0, 0x1c, 0xe1, 0x65, + 0xad, 0x8a, 0xf8, 0xb3, 0xef, 0xa5, 0x0d, 0xe0, 0x29, 0xe5, 0x5a, 0x08, 0x4f, 0xd2, 0x98, 0x62, 0x2c, 0x54, 0xc2, 0xb4, 0x10, 0x62, 0x84, 0x52, 0x7b, 0xa1, 0xe0, 0x13, 0x36, 0x05, 0xcf, 0xbb, + 0x93, 0xd4, 0x33, 0x2a, 0xd8, 0xb0, 0xc5, 0xa8, 0x2d, 0xa5, 0xd5, 0xcb, 0x6d, 0x96, 0x35, 0xec, 0x4e, 0x94, 0x88, 0x17, 0x14, 0x62, 0xc6, 0xef, 0x15, 0x78, 0x50, 0x3f, 0x32, 0x77, 0xfd, 0x98, + 0x02, 0x31, 0x67, 0xe8, 0x6e, 0x93, 0x0d, 0x7b, 0xca, 0x54, 0x40, 0x07, 0xe0, 0xb2, 0xff, 0xa6, 0xe1, 0xd6, 0x8f, 0x5c, 0x4c, 0xac, 0x1a, 0x70, 0x73, 0x2f, 0x9b, 0xb6, 0x42, 0x48, 0x90, 0x34, + 0x26, 0x9a, 0x2d, 0x28, 0xa8, 0xd5, 0xdc, 0x90, 0x74, 0x00, 0x96, 0x33, 0xec, 0x37, 0x3e, 0x82, 0x37, 0x03, 0xb7, 0x7e, 0xd9, 0x7f, 0x63, 0x45, 0x88, 0x84, 0x51, 0x26, 0x56, 0x8d, 0x51, 0xac, + 0xc0, 0x8b, 0xa3, 0xec, 0xe5, 0xc8, 0x1e, 0x33, 0x7e, 0xdf, 0x18, 0xe1, 0xcd, 0x0a, 0x6e, 0x3d, 0x56, 0x2e, 0x9c, 0xc0, 0x9e, 0xff, 0xc2, 0xfb, 0x0d, 0x6e, 0xf7, 0xfd, 0x17, 0xb7, 0x07, 0xf5, + 0xbd, 0x51, 0x1e, 0x29, 0x39, 0x0c, 0xe3, 0xf7, 0x06, 0x2a, 0xf0, 0x5f, 0xec, 0xc1, 0x6f, 0x80, 0xe1, 0x17, 0xf0, 0x34, 0x8e, 0x2b, 0x71, 0x60, 0x45, 0x37, 0xb0, 0xce, 0x86, 0x8f, 0xcd, 0xab, + 0x51, 0xc4, 0x24, 0x26, 0x5d, 0x2e, 0x4b, 0x50, 0x82, 0x35, 0xfe, 0x8c, 0xb0, 0x95, 0x74, 0x00, 0x14, 0x59, 0xd0, 0x28, 0x62, 0xb2, 0x31, 0x4a, 0x96, 0xd1, 0x08, 0x4f, 0x32, 0xfb, 0x36, 0xb6, + 0x48, 0xf8, 0xbe, 0x35, 0xd4, 0x9c, 0xdc, 0x53, 0x60, 0x1a, 0x26, 0x69, 0x1c, 0xaf, 0xe0, 0x73, 0x4a, 0x62, 0x36, 0x61, 0x34, 0x2a, 0xa3, 0x86, 0x51, 0xd9, 0x51, 0xcf, 0x9f, 0x43, 0x4e, 0xdc, + 0xbc, 0xc8, 0x79, 0xba, 0x86, 0x1c, 0x0d, 0x67, 0x02, 0xae, 0x15, 0x16, 0xe7, 0xf9, 0x4b, 0x20, 0x1a, 0x72, 0xc4, 0xac, 0x5a, 0xbd, 0x16, 0x12, 0x5a, 0xa6, 0x54, 0x1c, 0x02, 0xe5, 0x2a, 0x95, + 0x14, 0x12, 0xa2, 0x67, 0x0a, 0xb0, 0x5b, 0x62, 0x1c, 0xae, 0xbb, 0x9d, 0x0f, 0x60, 0xfb, 0x54, 0x18, 0xd3, 0x09, 0x36, 0xc6, 0x84, 0xaf, 0xf4, 0x0c, 0x09, 0x32, 0x05, 0x5a, 0xa4, 0xe1, 0x8c, + 0x46, 0x18, 0x40, 0x75, 0x5b, 0x71, 0x8a, 0xb0, 0xf9, 0x08, 0x1e, 0xaf, 0x46, 0xd4, 0xf3, 0xe7, 0xc6, 0x44, 0x85, 0x22, 0xab, 0x29, 0x32, 0x03, 0xcf, 0x4b, 0x39, 0x7b, 0x28, 0xc1, 0x8e, 0x0a, + 0xf4, 0x4a, 0x16, 0x64, 0x04, 0x4a, 0xa1, 0xbd, 0x45, 0xa2, 0x80, 0x2f, 0x11, 0x69, 0x9d, 0x37, 0x07, 0x83, 0xcb, 0xe6, 0xd5, 0xdb, 0x12, 0x91, 0xf5, 0x59, 0x99, 0x48, 0x95, 0x56, 0x81, 0x36, + 0x2a, 0x99, 0xeb, 0x02, 0x0b, 0xe8, 0x0f, 0x5b, 0xcb, 0x94, 0xe1, 0xef, 0x30, 0x96, 0x3b, 0xda, 0xaf, 0xf8, 0xfd, 0x14, 0xbd, 0x7e, 0x60, 0xca, 0xd0, 0x37, 0x59, 0x2a, 0xc7, 0x2f, 0xa0, 0xd6, + 0x14, 0xaa, 0x15, 0x60, 0x67, 0x31, 0xc5, 0x0a, 0xd2, 0x7e, 0xa0, 0x61, 0xaa, 0xb1, 0xe2, 0x37, 0xdc, 0xd1, 0x72, 0xc6, 0xc2, 0x99, 0x39, 0x0e, 0x8d, 0x0c, 0x16, 0x1f, 0xc5, 0xa8, 0x82, 0x5a, + 0x59, 0xe0, 0x19, 0x7c, 0x04, 0xd7, 0x26, 0xea, 0xed, 0x26, 0xc8, 0xad, 0x49, 0xc8, 0xdb, 0xfd, 0x8f, 0xff, 0x07, 0x9f, 0x5e, 0xdc, 0x1e, 0xec, 0x8d, 0x5c, 0x68, 0x80, 0xcb, 0x45, 0xb5, 0x3a, + 0x63, 0x0d, 0x22, 0x11, 0xe6, 0xd9, 0xfe, 0xf1, 0x01, 0x1a, 0x13, 0x67, 0x95, 0xf5, 0x1d, 0x04, 0x44, 0x81, 0xd2, 0x84, 0x47, 0x44, 0x9a, 0xbe, 0x7d, 0x20, 0x62, 0x22, 0x99, 0x82, 0xe3, 0x23, + 0xdf, 0x60, 0x23, 0xee, 0xb9, 0x29, 0x16, 0x56, 0xf0, 0x9c, 0xd6, 0xa8, 0xb8, 0x49, 0x9e, 0x41, 0x5e, 0x48, 0x72, 0xe0, 0x4d, 0xb9, 0x76, 0x89, 0x65, 0x90, 0xeb, 0xf6, 0xee, 0x84, 0x8d, 0xcb, + 0x04, 0xd5, 0xc4, 0x8a, 0x5f, 0x2a, 0x18, 0x3b, 0x94, 0x5f, 0xdf, 0x24, 0x3b, 0xac, 0x1c, 0x46, 0x39, 0x06, 0xd2, 0xb9, 0xcd, 0x93, 0x1d, 0xbc, 0xcb, 0x91, 0xb9, 0x8a, 0xc2, 0x9d, 0xb7, 0xd0, + 0x16, 0x99, 0x5c, 0x5b, 0xec, 0x6d, 0xbe, 0x26, 0x41, 0x76, 0x17, 0x7d, 0xb7, 0xe4, 0x6b, 0xf0, 0xdc, 0x82, 0xf9, 0x41, 0x66, 0x41, 0xac, 0xc5, 0x38, 0xec, 0x67, 0xe5, 0xb8, 0x12, 0x96, 0x05, + 0x6c, 0xae, 0xca, 0xc6, 0x1d, 0x5a, 0x54, 0xd5, 0xad, 0xcb, 0x0a, 0x61, 0x5a, 0x17, 0x67, 0x3b, 0xee, 0xc7, 0x8d, 0x7c, 0xa8, 0xde, 0x8c, 0xeb, 0xae, 0xa0, 0x00, 0x09, 0xee, 0x24, 0x0d, 0xd4, + 0xcc, 0x18, 0x75, 0xa3, 0xdd, 0xc3, 0xd0, 0xeb, 0xbc, 0xba, 0xd8, 0x53, 0x66, 0x7c, 0x10, 0x1c, 0x9a, 0x9d, 0x0f, 0xd8, 0x75, 0x63, 0xc0, 0x49, 0xc2, 0xa7, 0x74, 0x3d, 0x11, 0xa8, 0x7c, 0x7c, + 0x03, 0xba, 0xb6, 0x92, 0x2a, 0x69, 0xdc, 0xba, 0x38, 0x6b, 0x3c, 0xc5, 0x73, 0xf3, 0x9e, 0xd9, 0x05, 0x3f, 0x66, 0xbc, 0x04, 0x6c, 0x4c, 0xb2, 0xc6, 0x58, 0xc3, 0x97, 0x32, 0x73, 0xe4, 0x6e, + 0x18, 0xed, 0x59, 0xa1, 0xf5, 0xa6, 0xd9, 0xcc, 0x3d, 0xe1, 0xb6, 0xa5, 0x14, 0xf2, 0xa4, 0x34, 0x41, 0x65, 0x79, 0x16, 0xd1, 0x09, 0xe3, 0x34, 0x82, 0x50, 0x48, 0x49, 0x43, 0x1d, 0xaf, 0x7c, + 0x17, 0x7e, 0x7b, 0xfe, 0x72, 0x8d, 0x07, 0x70, 0x43, 0x21, 0x24, 0x1c, 0x61, 0xad, 0xee, 0x14, 0x0a, 0x36, 0x19, 0xe4, 0x03, 0xd3, 0x70, 0xfc, 0x95, 0x62, 0xb3, 0x29, 0xcc, 0x0d, 0x31, 0xd3, + 0x6e, 0x59, 0x1c, 0xca, 0x17, 0x4c, 0x0a, 0x3e, 0xa7, 0x5c, 0xe3, 0xb8, 0xc6, 0x4c, 0xea, 0x67, 0x32, 0x2a, 0xaa, 0x7d, 0x5b, 0xcb, 0x4c, 0xd9, 0xbe, 0xe9, 0xf5, 0xcf, 0xcf, 0x06, 0xc3, 0xf3, + 0xe6, 0x75, 0xb7, 0xf5, 0xb6, 0xdd, 0x6f, 0x08, 0x39, 0xf5, 0x43, 0x11, 0xd1, 0x19, 0x49, 0x95, 0x9f, 0xc4, 0xf4, 0x21, 0x55, 0x7e, 0x18, 0x13, 0xa5, 0x96, 0x42, 0xc6, 0x91, 0xf2, 0x63, 0x92, + 0xf2, 0x70, 0x46, 0xa5, 0x7f, 0x9e, 0xfd, 0x81, 0xe5, 0x5e, 0x4b, 0xb2, 0xa0, 0x12, 0x7d, 0x1d, 0x31, 0x54, 0x5c, 0xc8, 0x15, 0x7a, 0x3d, 0x0d, 0x35, 0x96, 0xfe, 0x89, 0x14, 0x73, 0x48, 0xa4, + 0x08, 0x71, 0xac, 0x37, 0x1b, 0x9e, 0x02, 0x4a, 0x0b, 0x3b, 0x01, 0xad, 0x94, 0xa6, 0x73, 0x90, 0x42, 0x68, 0xa7, 0x06, 0x13, 0x26, 0x95, 0x2e, 0x01, 0x99, 0x2d, 0x8a, 0x3f, 0x5f, 0x70, 0x50, + 0xe9, 0xb8, 0x38, 0x66, 0x0a, 0x42, 0xc1, 0x15, 0x8b, 0x28, 0x4e, 0xbc, 0x89, 0x14, 0x77, 0x34, 0xd4, 0x30, 0xc6, 0x0e, 0x6f, 0x0d, 0xe4, 0x4c, 0x18, 0x8f, 0x86, 0xa6, 0xe5, 0x1a, 0xe2, 0x9b, + 0x88, 0xc9, 0xfd, 0x03, 0xf8, 0x52, 0x4c, 0x31, 0x68, 0xdd, 0x63, 0x17, 0x3e, 0x39, 0x50, 0x84, 0xb2, 0xb5, 0xeb, 0x25, 0xde, 0x71, 0xc6, 0x62, 0x76, 0x4c, 0xb1, 0x83, 0xe8, 0x36, 0x3d, 0x37, + 0xab, 0x9c, 0x3a, 0x95, 0x1c, 0x8e, 0xd7, 0x43, 0x52, 0xf6, 0xb6, 0x81, 0xe4, 0xb1, 0x6d, 0x2b, 0xff, 0x9d, 0xb5, 0x70, 0x6e, 0x1d, 0x4f, 0x5d, 0x78, 0xd6, 0x80, 0xbd, 0x60, 0xaf, 0xdc, 0xc7, + 0x59, 0xd9, 0xa2, 0x1c, 0x22, 0x30, 0xca, 0x6f, 0xa4, 0x5b, 0xce, 0xc0, 0x80, 0xe4, 0x67, 0x92, 0x92, 0xfb, 0x22, 0xec, 0x31, 0x27, 0xd1, 0xe0, 0x44, 0x8a, 0x94, 0x47, 0x26, 0xed, 0xde, 0xbd, + 0x6a, 0x37, 0x2f, 0xbd, 0x7f, 0xff, 0xf7, 0x7f, 0xfc, 0x0b, 0xf6, 0x2b, 0x17, 0x40, 0x30, 0x48, 0x88, 0x0c, 0x0f, 0x36, 0xd8, 0x7f, 0x41, 0xe2, 0x8f, 0x9b, 0xb5, 0xdc, 0x28, 0x63, 0xfb, 0x2b, + 0xfc, 0x33, 0xf0, 0x7d, 0x7b, 0x4b, 0x8e, 0xaa, 0xac, 0x29, 0x8f, 0x70, 0xd4, 0x2d, 0x24, 0xc8, 0x5b, 0xbe, 0xdc, 0xc4, 0xf5, 0x2f, 0x99, 0x12, 0x8f, 0xae, 0xf3, 0x88, 0x81, 0x14, 0x0a, 0x1e, + 0x12, 0x4d, 0x39, 0xd1, 0x54, 0x01, 0xce, 0x48, 0x31, 0xe3, 0x54, 0xd9, 0xad, 0x84, 0xd9, 0xe1, 0x59, 0x80, 0xa1, 0x39, 0x36, 0x8e, 0x2c, 0x4f, 0xa3, 0xc7, 0x55, 0x39, 0x33, 0x1e, 0xfb, 0x5a, + 0x82, 0xa7, 0x60, 0xef, 0x96, 0xef, 0x01, 0xfe, 0xf3, 0x3f, 0x06, 0xf2, 0x20, 0x4b, 0xfa, 0x47, 0xc7, 0x79, 0xd5, 0x1c, 0xb4, 0x87, 0x67, 0x9d, 0x7e, 0x63, 0xb4, 0xed, 0x5c, 0xc4, 0xc7, 0xeb, + 0xdf, 0x1d, 0x95, 0xb2, 0x31, 0x47, 0x28, 0xb3, 0xb3, 0x69, 0x7b, 0x6a, 0xfb, 0x9f, 0x5f, 0xf6, 0x73, 0x6a, 0xd0, 0x7e, 0xd0, 0x94, 0x9b, 0x25, 0xa5, 0x16, 0x68, 0x22, 0xb1, 0x04, 0x92, 0x6a, + 0x31, 0x27, 0x9a, 0x85, 0x04, 0x7b, 0xe1, 0x48, 0x2c, 0x79, 0xbe, 0x68, 0xc0, 0x22, 0x6b, 0xf4, 0xf1, 0x96, 0x92, 0x24, 0x38, 0x3d, 0xde, 0x11, 0x69, 0x13, 0xd2, 0xac, 0x47, 0xbc, 0x90, 0x72, + 0x2d, 0x49, 0xec, 0xd4, 0xe0, 0x0a, 0x87, 0x0e, 0x43, 0x4f, 0x41, 0xaa, 0x2a, 0xc8, 0x90, 0x21, 0x63, 0xeb, 0x96, 0xa5, 0x99, 0x02, 0x3d, 0x23, 0x1a, 0x9f, 0x66, 0x6c, 0xcc, 0x34, 0x84, 0x33, + 0x1a, 0xde, 0x9b, 0xf6, 0x8d, 0xc3, 0x98, 0x71, 0x22, 0x57, 0x10, 0x11, 0x4d, 0xfc, 0x5f, 0x69, 0x8b, 0x7c, 0xc4, 0x2b, 0x1c, 0x62, 0xf2, 0x24, 0xc8, 0xa4, 0x0d, 0xb6, 0x14, 0xaf, 0x86, 0x87, + 0x41, 0x77, 0xeb, 0x17, 0xef, 0xbb, 0x37, 0xc3, 0xf7, 0xed, 0xfe, 0xab, 0xde, 0xa0, 0x8d, 0x1d, 0x95, 0xd9, 0x04, 0x54, 0xc3, 0xdd, 0x06, 0x92, 0xd9, 0x86, 0xc3, 0xdf, 0x70, 0xc8, 0x13, 0x60, + 0x7d, 0xe1, 0x7c, 0x2f, 0x97, 0x96, 0x48, 0xe3, 0x88, 0xef, 0x69, 0x53, 0x68, 0xfe, 0x86, 0xdb, 0x61, 0xc5, 0xd7, 0x4c, 0x83, 0xef, 0xfb, 0x6e, 0x39, 0x05, 0x8b, 0x4b, 0xde, 0xf0, 0xef, 0xb7, + 0x2f, 0x7b, 0xd7, 0xfd, 0xf3, 0xcd, 0x6c, 0xbe, 0x23, 0xf2, 0x5a, 0xc6, 0x8d, 0x2a, 0x50, 0xc0, 0x44, 0xa0, 0xc9, 0x3d, 0x91, 0xac, 0xca, 0x37, 0x38, 0xf2, 0xff, 0xd3, 0xff, 0xaf, 0xea, 0x99, + 0x67, 0xce, 0x0a, 0xfd, 0x4b, 0xf7, 0x73, 0x4e, 0x3b, 0x5f, 0x63, 0x48, 0x9a, 0x08, 0xbb, 0x0f, 0x2a, 0x6f, 0xb3, 0xed, 0x7e, 0xf0, 0x47, 0x58, 0x66, 0x0a, 0xdb, 0xca, 0xda, 0x79, 0x3d, 0x68, + 0xb8, 0x0d, 0xd7, 0x74, 0xaf, 0x70, 0x4f, 0x57, 0xb0, 0x20, 0x71, 0x4a, 0xd7, 0xc5, 0x15, 0xc0, 0x6e, 0x84, 0xea, 0xf7, 0x74, 0xe5, 0x62, 0xc0, 0xee, 0x67, 0x44, 0xaf, 0x65, 0x7c, 0x50, 0x58, + 0xc3, 0x20, 0xb9, 0xa7, 0xb6, 0xa6, 0xda, 0xdd, 0x90, 0x51, 0x4e, 0x91, 0xd0, 0xfc, 0x89, 0x95, 0xcc, 0x14, 0x93, 0x6f, 0x89, 0xbe, 0x44, 0x8a, 0x84, 0x4a, 0xcd, 0xa8, 0x72, 0xff, 0x51, 0x58, + 0x9c, 0x95, 0x1c, 0x8d, 0xe9, 0x7b, 0x02, 0x75, 0x2b, 0x68, 0x55, 0x7d, 0xcb, 0xed, 0x1d, 0x91, 0x78, 0x79, 0x35, 0xbe, 0x4d, 0xb4, 0xb5, 0x0d, 0x8b, 0xe1, 0xb4, 0x5a, 0xec, 0xab, 0x44, 0xb7, + 0xa7, 0xc0, 0x25, 0xe3, 0x11, 0x56, 0x0d, 0xb7, 0x5e, 0x05, 0x75, 0xd7, 0xd7, 0x41, 0x4e, 0x3e, 0x14, 0xf3, 0x39, 0xe1, 0x11, 0x78, 0x0b, 0x58, 0x4e, 0xa9, 0x7e, 0x72, 0xb1, 0xf0, 0x3d, 0xf6, + 0x81, 0x8d, 0x04, 0x35, 0x84, 0x7d, 0xdf, 0xcf, 0x8a, 0x18, 0x3e, 0x16, 0x93, 0xc3, 0xba, 0x73, 0x2f, 0x5f, 0xff, 0x86, 0xc9, 0xf5, 0xa0, 0xdd, 0xef, 0x36, 0x6d, 0x83, 0xf5, 0xd7, 0x5f, 0x95, + 0x57, 0x97, 0xb6, 0x4d, 0x3a, 0xdb, 0x5e, 0x83, 0xe1, 0xcf, 0xf0, 0x73, 0x73, 0x6f, 0x80, 0xd7, 0xdb, 0xb6, 0xc3, 0x1a, 0xbe, 0x32, 0x7e, 0xac, 0x91, 0x3d, 0x0f, 0xb3, 0xc3, 0x4b, 0x15, 0x95, + 0x8d, 0xaa, 0x30, 0xf9, 0xab, 0xc4, 0xf6, 0x5f, 0x51, 0xa3, 0x2a, 0xd0, 0xb7, 0xb2, 0xcd, 0xb4, 0xa6, 0x71, 0xd5, 0x05, 0x61, 0x2a, 0xe3, 0x5f, 0xe2, 0x02, 0x43, 0xb8, 0x70, 0x01, 0x3e, 0xfe, + 0x52, 0x17, 0x18, 0x7e, 0x9e, 0xd8, 0xb6, 0x40, 0xd9, 0x40, 0x93, 0xa7, 0xbd, 0x60, 0xf1, 0x8d, 0x03, 0xa0, 0x2a, 0xca, 0xc9, 0x86, 0xc1, 0xbf, 0x9d, 0x49, 0x1e, 0xf5, 0x15, 0x66, 0xff, 0xc8, + 0xa4, 0x24, 0x8e, 0xd1, 0x8a, 0xf9, 0xb6, 0xd8, 0xda, 0xd4, 0x7c, 0x0b, 0xd1, 0x62, 0x7d, 0x01, 0xec, 0xb4, 0x2f, 0x0e, 0x37, 0x2d, 0xec, 0xdd, 0x9f, 0xac, 0x04, 0xa6, 0x09, 0xb8, 0xb1, 0x0f, + 0x79, 0x89, 0x31, 0x25, 0x21, 0x9f, 0x9e, 0xc0, 0x34, 0x72, 0xe5, 0xed, 0x97, 0x5a, 0x32, 0x1d, 0xce, 0xb2, 0x7d, 0x8e, 0x16, 0x70, 0x93, 0x65, 0x7f, 0x75, 0x9d, 0x93, 0x7f, 0x9e, 0x31, 0xd3, + 0x77, 0x59, 0xff, 0x5d, 0x15, 0xa6, 0x2a, 0xeb, 0xd7, 0x0a, 0xcc, 0x1a, 0xca, 0x1d, 0x3d, 0x1d, 0x50, 0xb4, 0x02, 0xb8, 0x33, 0x62, 0xf2, 0x31, 0x8f, 0x3e, 0x59, 0xbe, 0x9f, 0xb0, 0x4c, 0xf8, + 0x34, 0x4d, 0xf8, 0x6e, 0x07, 0xe7, 0xbf, 0x6c, 0x38, 0xf4, 0xa0, 0x25, 0xe6, 0x09, 0x8b, 0xd7, 0x9f, 0xb5, 0x76, 0x3b, 0xa6, 0xb8, 0xe5, 0xcb, 0xbf, 0x92, 0x15, 0xf2, 0x5f, 0xad, 0x44, 0x6f, + 0xfd, 0xfd, 0xcc, 0x28, 0xb0, 0x05, 0xba, 0xbf, 0x6b, 0x7e, 0x0e, 0xdd, 0x8a, 0x21, 0x0f, 0x2a, 0x58, 0x1b, 0xfc, 0x0a, 0xcb, 0xff, 0x4c, 0x73, 0xd6, 0xa0, 0x9f, 0xc5, 0x11, 0xca, 0x1f, 0xad, + 0xf1, 0x7e, 0xb6, 0xdd, 0xfb, 0xe5, 0x8f, 0x89, 0x3f, 0x68, 0xf5, 0x9d, 0xa6, 0x74, 0xc1, 0x0b, 0x93, 0x4a, 0x37, 0xf7, 0x04, 0xaf, 0xf5, 0x17, 0xbb, 0xcb, 0x7e, 0xef, 0x5d, 0xbb, 0x75, 0x85, + 0xd6, 0xc4, 0x49, 0xe3, 0x49, 0xe3, 0x17, 0x9f, 0x47, 0x26, 0xec, 0x57, 0x36, 0xdb, 0x35, 0x68, 0xdb, 0x69, 0x8e, 0xe6, 0xf3, 0xc7, 0xaf, 0xe4, 0xe6, 0x64, 0xdb, 0xad, 0x5d, 0xb6, 0x68, 0xd4, + 0xbf, 0xd8, 0xe3, 0xec, 0xf9, 0xc4, 0x2b, 0x4d, 0x64, 0x8f, 0xce, 0xb7, 0x85, 0x82, 0x71, 0xfd, 0x4e, 0x53, 0xa3, 0x1d, 0x4b, 0x1f, 0x87, 0xdd, 0xfa, 0x7e, 0x79, 0xe6, 0x7c, 0xc2, 0x3f, 0x36, + 0xd8, 0xef, 0x16, 0x73, 0xdf, 0x7e, 0x3e, 0x72, 0x0f, 0x72, 0xe2, 0x48, 0xc4, 0xdd, 0xfc, 0x82, 0xf0, 0xfd, 0x35, 0xd4, 0xd9, 0x51, 0x3a, 0xff, 0x76, 0x17, 0xfe, 0xb5, 0x4a, 0xfa, 0x23, 0x9f, + 0x10, 0xb6, 0x88, 0xfd, 0x94, 0x8f, 0x09, 0x05, 0xb9, 0xf2, 0xf7, 0x84, 0x42, 0xcd, 0x5d, 0x69, 0x51, 0xd2, 0x79, 0x57, 0xa4, 0x7c, 0xd5, 0x00, 0xbb, 0xe8, 0xe5, 0xdf, 0x2f, 0x2e, 0xa5, 0x58, + 0xb0, 0x88, 0x02, 0x01, 0x37, 0x5f, 0x97, 0xb3, 0x3f, 0x69, 0xe4, 0xc2, 0x92, 0x98, 0x9d, 0x95, 0xa4, 0x5a, 0x32, 0xba, 0xb0, 0xff, 0x53, 0x4a, 0xeb, 0xbc, 0x03, 0x44, 0x4e, 0xb3, 0x91, 0x78, + 0xc9, 0x62, 0x1c, 0xa7, 0xcd, 0x9e, 0xcb, 0x2c, 0xae, 0xc6, 0x42, 0xcf, 0xd6, 0x1e, 0xc6, 0xd6, 0x8b, 0x0b, 0xee, 0xe5, 0xcf, 0x76, 0x0b, 0xc8, 0x04, 0x57, 0x7e, 0x16, 0x75, 0xad, 0x8b, 0xb3, + 0xe1, 0x79, 0xa7, 0xdb, 0x1e, 0x36, 0xfb, 0x6f, 0x30, 0xfc, 0xb2, 0xd3, 0x5e, 0xf7, 0x75, 0xe7, 0x0d, 0xd4, 0xff, 0xd7, 0xad, 0xa6, 0x46, 0x05, 0xda, 0x71, 0x6e, 0xfa, 0xcd, 0xcb, 0xcb, 0x76, + 0xbf, 0xba, 0xce, 0xcb, 0x06, 0x2d, 0x3b, 0x75, 0xe5, 0x5d, 0x7f, 0xb9, 0xfc, 0x5c, 0x10, 0xc6, 0x31, 0xe5, 0x68, 0x58, 0xde, 0x7a, 0xde, 0x3a, 0x50, 0x0e, 0x62, 0xf3, 0xec, 0x99, 0x82, 0x6d, + 0x6c, 0xf9, 0xb5, 0x44, 0xf8, 0xca, 0x04, 0x8e, 0x54, 0x5c, 0xef, 0xcc, 0x0a, 0x33, 0x13, 0x73, 0x8a, 0xe9, 0x6c, 0x63, 0xf1, 0xd1, 0x2d, 0xde, 0xcc, 0xd3, 0x58, 0xb3, 0x0b, 0x11, 0xa5, 0x31, + 0xbd, 0xb4, 0x1b, 0x87, 0xb3, 0x7c, 0xa5, 0xb7, 0xce, 0xff, 0x2a, 0xe7, 0xc7, 0x4c, 0xe2, 0x2f, 0x9b, 0x36, 0x78, 0x84, 0xaa, 0x0d, 0x5d, 0x34, 0xe2, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, + 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, 0xff, 0xb9, 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, 0x38, 0x79, 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, 0x39, 0x60, 0x1a, + 0xd2, 0x04, 0x90, 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, 0x2f, 0x66, 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, 0xf7, 0xd3, 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, 0x9e, 0x5a, 0xe9, + 0xde, 0x0f, 0x8f, 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, 0x47, 0x77, 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, 0x2d, 0x4d, 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, 0x4b, 0x84, 0xb0, + 0x20, 0xe9, 0x12, 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, 0x2c, 0x23, 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, 0x83, 0x35, 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, 0x73, 0x01, 0x2b, + 0x2e, 0x10, 0x52, 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, 0x26, 0x90, 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, 0x48, 0x10, 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, 0x46, 0x30, 0xa7, + 0xb9, 0x95, 0x90, 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, 0x96, 0x54, 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, 0x24, 0xcb, 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, 0xce, 0xc5, 0xca, + 0x18, 0x53, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, 0x3b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, 0x25, 0x2d, 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, 0x57, 0x06, 0xc9, + 0x52, 0x74, 0xad, 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, 0x0d, 0x4a, 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, 0x7f, 0x01, 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, 0xde, 0x3d, 0xfb, + 0xde, 0xf0, 0xaf, 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, 0x7c, 0x4e, 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, 0xe4, 0x94, 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, 0x7a, 0x7c, 0x80, + 0x9f, 0xac, 0x18, 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, 0x26, 0x19, 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, 0x54, 0xaa, 0x90, 0x9d, 0xf3, 0xf3, 0xed, 0x76, 0xeb, 0x13, 0x63, + 0xb9, 0xcf, 0xc5, 0xe2, 0xbc, 0xf2, 0xf6, 0xfc, 0x76, 0xd0, 0x8d, 0x86, 0x49, 0xd4, 0xbe, 0xf4, 0x2f, 0x1a, 0x8c, 0xf7, 0x2c, 0x47, 0x29, 0x41, 0xe0, 0xaf, 0x6b, 0x2a, 0x30, 0x83, 0xd9, 0x0e, + 0x48, 0x51, 0xe4, 0x34, 0x25, 0xb3, 0x1c, 0x21, 0x27, 0x5b, 0x9d, 0x53, 0x93, 0x3a, 0x03, 0x0a, 0xca, 0x60, 0x2b, 0xa8, 0xa2, 0x6c, 0xd1, 0x2a, 0xf9, 0x65, 0x05, 0x8d, 0x66, 0xe2, 0xea, 0x10, + 0x56, 0xc6, 0x52, 0x79, 0x40, 0xc0, 0x19, 0x10, 0x9b, 0x35, 0x37, 0x4c, 0x60, 0x90, 0xb8, 0x70, 0x15, 0x26, 0x83, 0xa4, 0x05, 0x8f, 0x83, 0xc9, 0xf5, 0xe8, 0x7e, 0x02, 0x8f, 0x61, 0x1c, 0x87, + 0xc3, 0xc9, 0x20, 0x4a, 0x60, 0x14, 0x43, 0x77, 0x34, 0xec, 0x0d, 0x26, 0x83, 0xd1, 0x30, 0x81, 0x51, 0x1f, 0xc2, 0xe1, 0x4f, 0x25, 0xef, 0x8f, 0x83, 0x61, 0xaf, 0x05, 0x48, 0xd5, 0x12, 0x05, + 0xe0, 0x73, 0x21, 0xb4, 0x2b, 0x5c, 0x00, 0xd5, 0x11, 0xc6, 0xac, 0x81, 0xb3, 0xca, 0x0e, 0x8d, 0xa1, 0x7d, 0xe6, 0x64, 0x81, 0x29, 0x9d, 0xd3, 0x14, 0x72, 0xc2, 0x16, 0x6b, 0xb2, 0x40, 0x58, + 0xf0, 0x0d, 0x0a, 0xa6, 0x21, 0x54, 0xa0, 0x58, 0x51, 0xa9, 0xd3, 0x2d, 0x81, 0xb0, 0x0c, 0x72, 0xba, 0xa2, 0xca, 0x80, 0x4d, 0x96, 0xcc, 0x47, 0x3e, 0xfa, 0xce, 0x1f, 0x5f, 0x94, 0x7f, 0x82, + 0x48, 0x23, 0xf1, 0x8e, 0x6c, 0x90, 0x41, 0xa2, 0x88, 0x50, 0x70, 0x5f, 0xc0, 0x15, 0x51, 0xe9, 0x12, 0x64, 0x2a, 0x68, 0xd1, 0x04, 0x55, 0x5c, 0x81, 0x22, 0x1a, 0x3e, 0xc0, 0x86, 0x08, 0xd9, + 0x29, 0xcf, 0x6f, 0xc2, 0x87, 0x70, 0x7a, 0x3d, 0xba, 0x8b, 0xa0, 0x0d, 0x39, 0x4f, 0xcb, 0x7e, 0xc0, 0xe7, 0x40, 0xe0, 0xa6, 0xf7, 0x23, 0x2c, 0xf9, 0x4a, 0xa3, 0x41, 0x34, 0x04, 0x8d, 0x0a, + 0x5b, 0xb3, 0x95, 0x20, 0x6b, 0xc5, 0xe5, 0x6b, 0x52, 0x56, 0xda, 0xb6, 0xcb, 0x13, 0x09, 0x94, 0x49, 0x45, 0xf2, 0x1c, 0xb3, 0x43, 0x91, 0x70, 0x17, 0x3e, 0x44, 0xc3, 0xe9, 0x55, 0x38, 0xe9, + 0x5e, 0x4f, 0xa3, 0xee, 0xf5, 0x08, 0xda, 0x20, 0x51, 0x69, 0x74, 0x9e, 0x70, 0x76, 0xa2, 0x7f, 0x91, 0x19, 0xf4, 0xea, 0xe4, 0x60, 0xba, 0xe4, 0x3a, 0x9f, 0xb6, 0x78, 0x66, 0xc6, 0xd3, 0x94, + 0xaf, 0x56, 0x84, 0x65, 0xf2, 0x58, 0xde, 0x38, 0xbc, 0x4f, 0xa2, 0x63, 0x81, 0x5b, 0x42, 0x55, 0xd9, 0x7f, 0xe0, 0x09, 0x77, 0x52, 0x09, 0xfe, 0x84, 0x30, 0xc3, 0xb9, 0xee, 0x75, 0xc8, 0x74, + 0xcf, 0x69, 0x8a, 0x1a, 0x8d, 0x27, 0x09, 0xb4, 0xa1, 0x20, 0x82, 0xac, 0x50, 0xa1, 0x90, 0x50, 0x10, 0xd9, 0xe8, 0xaa, 0x37, 0x64, 0x43, 0xe0, 0xe1, 0x0e, 0xb6, 0x4b, 0x64, 0x20, 0xd6, 0xcc, + 0x00, 0xce, 0xa4, 0x64, 0x5f, 0xcc, 0x80, 0xfe, 0xc2, 0xd7, 0xf4, 0x19, 0xce, 0xd6, 0xf6, 0x25, 0x50, 0x25, 0x31, 0x9f, 0xb7, 0x74, 0x67, 0xb1, 0x00, 0x46, 0xd5, 0x50, 0x19, 0xb4, 0x3f, 0x95, + 0xd4, 0xed, 0x4f, 0x62, 0xcd, 0xbe, 0x64, 0xdb, 0xa2, 0xa3, 0x04, 0x61, 0xb2, 0xe0, 0x42, 0x05, 0x99, 0x9a, 0x4a, 0x9e, 0x3e, 0xa1, 0x6a, 0x49, 0x14, 0x1b, 0x14, 0xc1, 0xae, 0x25, 0xd7, 0xb2, + 0x40, 0x96, 0x05, 0xbb, 0x16, 0xc9, 0x32, 0x5d, 0x3a, 0xc1, 0xdf, 0x2e, 0x2e, 0x2e, 0x9a, 0x8e, 0x24, 0x3f, 0x0e, 0xc6, 0xd3, 0xb8, 0x0b, 0x6d, 0x98, 0xe7, 0x64, 0x61, 0xcc, 0xa1, 0xb2, 0x6c, + 0x0c, 0x9c, 0x64, 0x36, 0xac, 0x26, 0x5f, 0x22, 0x35, 0x6d, 0x4e, 0xfe, 0x09, 0x80, 0x2d, 0x45, 0x5e, 0xe1, 0x42, 0x77, 0xc2, 0x3c, 0x07, 0xfd, 0x94, 0x53, 0x86, 0xb2, 0xec, 0x9c, 0x27, 0x1f, + 0x4f, 0x4c, 0x57, 0x25, 0x12, 0x8f, 0x91, 0x41, 0xa5, 0x49, 0xa1, 0xf3, 0x51, 0xc3, 0x00, 0xf8, 0x7c, 0x5e, 0xc7, 0x4d, 0x51, 0x95, 0xa3, 0xb6, 0xdf, 0x82, 0x01, 0xb6, 0x94, 0x65, 0x7c, 0xeb, + 0x94, 0xe7, 0x9e, 0x8d, 0x83, 0x45, 0x52, 0x85, 0xa2, 0xd9, 0x4e, 0xf3, 0x2a, 0x93, 0xaf, 0x97, 0xba, 0x2c, 0x5c, 0x9c, 0x8f, 0x74, 0x0e, 0xae, 0xf7, 0xf2, 0xb5, 0xe7, 0x42, 0x10, 0x80, 0xcb, + 0x99, 0x0b, 0x46, 0x1a, 0x1c, 0x53, 0x38, 0xb5, 0x71, 0x9e, 0xae, 0x0b, 0xcf, 0x40, 0xf9, 0xd7, 0x35, 0xdd, 0x90, 0x1c, 0x99, 0xd2, 0xb6, 0x7e, 0xa3, 0xcf, 0x1d, 0xa3, 0xc0, 0x50, 0x94, 0x42, + 0x5d, 0x38, 0xd5, 0x4c, 0xae, 0x3e, 0x0a, 0xcc, 0x8b, 0x5e, 0x3c, 0x78, 0x88, 0x3c, 0xf3, 0xe7, 0x38, 0x9c, 0x5c, 0x7b, 0xee, 0x99, 0x15, 0x1e, 0x3d, 0x63, 0xba, 0x56, 0x08, 0x44, 0x83, 0x48, + 0x40, 0x86, 0x73, 0xca, 0x30, 0xb3, 0xa5, 0x5f, 0x21, 0xda, 0xdc, 0x5a, 0xfa, 0x4e, 0xa7, 0x73, 0x73, 0x93, 0x55, 0xde, 0x58, 0x38, 0xec, 0xb5, 0x2e, 0xb8, 0xe2, 0x20, 0x9f, 0x68, 0x11, 0xa7, + 0x63, 0x61, 0x21, 0x99, 0x2e, 0x31, 0x2d, 0xaf, 0xea, 0x42, 0xa0, 0x95, 0xdb, 0x02, 0xce, 0x52, 0x2c, 0xd3, 0x95, 0xe3, 0x82, 0xa4, 0x3b, 0xf0, 0x67, 0x44, 0xd9, 0xca, 0x31, 0xed, 0xb5, 0x26, + 0xf0, 0xd3, 0x55, 0x56, 0xd5, 0x14, 0x9d, 0x03, 0x3e, 0x53, 0xa9, 0x2a, 0x77, 0x3f, 0x5b, 0xac, 0x4d, 0x0b, 0x81, 0x5a, 0x82, 0x0b, 0xa9, 0x46, 0xc4, 0x5b, 0x6f, 0xdf, 0xe7, 0x4f, 0x57, 0xd9, + 0x3b, 0xfc, 0xfa, 0xad, 0xd3, 0xa9, 0x9d, 0x73, 0x3e, 0x4a, 0x54, 0xba, 0x4d, 0xe5, 0x8e, 0xa3, 0x83, 0x1d, 0xc5, 0xf1, 0x28, 0x9e, 0x76, 0x47, 0xbd, 0x28, 0xb8, 0xb0, 0xb1, 0x9d, 0x70, 0xa0, + 0x92, 0xe7, 0x44, 0x21, 0x50, 0xa6, 0x50, 0xe8, 0x86, 0xb7, 0x21, 0x82, 0x6a, 0x04, 0x49, 0x98, 0x0b, 0xbe, 0x82, 0x82, 0x4b, 0x49, 0x35, 0xa0, 0x0a, 0x2e, 0x95, 0x8d, 0x8e, 0x6c, 0xc1, 0x16, + 0xcd, 0xb4, 0x40, 0x18, 0x37, 0x37, 0xd9, 0x5e, 0x53, 0x43, 0xa7, 0xd1, 0x10, 0x04, 0x41, 0x00, 0xc9, 0x24, 0x8c, 0x27, 0xf0, 0x10, 0xde, 0x0e, 0x7a, 0xa1, 0xbe, 0x12, 0xcd, 0x69, 0x9d, 0xaa, + 0x7d, 0x73, 0x3e, 0x4c, 0xd3, 0xe8, 0xe9, 0xe6, 0x9a, 0xaf, 0xd0, 0x71, 0x34, 0xf8, 0x7c, 0xf3, 0x3f, 0x44, 0x42, 0x70, 0xd1, 0x69, 0xb4, 0x73, 0x2d, 0x61, 0xae, 0x47, 0x3c, 0x5d, 0x51, 0x3b, + 0xbe, 0x16, 0x80, 0x6c, 0x43, 0x05, 0x67, 0x7a, 0x6c, 0xf3, 0xe1, 0xef, 0xdf, 0x5e, 0x96, 0x8c, 0xe3, 0x1c, 0x75, 0xb9, 0x99, 0x32, 0xd2, 0xfd, 0x6c, 0x2f, 0xa0, 0x72, 0xf7, 0x35, 0x7e, 0x8d, + 0xe6, 0x95, 0x69, 0xbf, 0x9a, 0x67, 0x2f, 0xab, 0xd9, 0xfa, 0x0d, 0x8b, 0xe9, 0x8e, 0xb6, 0xf7, 0x9b, 0x37, 0xb5, 0x62, 0xdf, 0x31, 0xbe, 0xa0, 0xb6, 0xdb, 0x71, 0x3a, 0x95, 0x4f, 0x8d, 0x34, + 0xd7, 0xde, 0x7f, 0x9e, 0x51, 0xf6, 0xf9, 0x0b, 0xd9, 0x10, 0x1f, 0x9f, 0xd1, 0x06, 0x81, 0x32, 0xaa, 0xde, 0x8f, 0x00, 0x95, 0x55, 0xeb, 0x27, 0x0c, 0x28, 0xdb, 0x90, 0x9c, 0x66, 0xfa, 0xe6, + 0xc1, 0x54, 0x71, 0xb1, 0x6b, 0x84, 0xa0, 0x66, 0x09, 0x5e, 0x04, 0xfd, 0xff, 0x2c, 0x4a, 0x35, 0x70, 0xa2, 0x61, 0xef, 0x08, 0x36, 0x4e, 0xa7, 0x8c, 0x89, 0xa1, 0xea, 0x53, 0x96, 0x19, 0xb5, + 0x85, 0xe0, 0x5f, 0x30, 0x55, 0x30, 0xd3, 0xf6, 0x67, 0x54, 0xb4, 0x80, 0xfa, 0xe8, 0x9b, 0x57, 0xfb, 0x58, 0x80, 0x5a, 0x12, 0x65, 0x06, 0x7d, 0x42, 0x99, 0x34, 0xef, 0xe6, 0x3c, 0xd7, 0x33, + 0x91, 0xeb, 0xaf, 0x36, 0xcc, 0xb5, 0xe3, 0x50, 0x9f, 0xe4, 0xf9, 0x8c, 0xa4, 0x4f, 0xda, 0xaf, 0x74, 0x2d, 0x84, 0x76, 0x51, 0x4f, 0xf3, 0xba, 0xf0, 0x6b, 0x59, 0x16, 0xbd, 0x06, 0x7b, 0x7e, + 0x59, 0x60, 0x65, 0xcb, 0x19, 0xc7, 0xa3, 0x9b, 0xa8, 0x3b, 0xb9, 0x0a, 0x93, 0xa8, 0x37, 0x88, 0x83, 0x7d, 0xd3, 0x34, 0x8f, 0x9e, 0x33, 0xe8, 0xeb, 0x0d, 0x62, 0xdf, 0xa0, 0x0e, 0xa9, 0x3d, + 0x37, 0x08, 0x2a, 0xf8, 0x23, 0xcb, 0x7a, 0xa8, 0x30, 0x55, 0x57, 0x44, 0x62, 0x8f, 0x0a, 0x5b, 0xc4, 0x9f, 0xa2, 0xee, 0xd4, 0xc8, 0xed, 0xf6, 0x3c, 0x73, 0xf2, 0x68, 0x9e, 0xaa, 0x73, 0xcf, + 0xe9, 0xcc, 0x29, 0xcb, 0x2a, 0x9e, 0x41, 0x1f, 0xa2, 0x4f, 0x83, 0x44, 0xeb, 0x7b, 0x34, 0xf2, 0x3f, 0x6b, 0x4f, 0x4b, 0x05, 0xb3, 0x92, 0xc6, 0x2c, 0x48, 0x4e, 0x9a, 0x81, 0xef, 0x6b, 0xf2, + 0x8a, 0x30, 0x08, 0x5c, 0xad, 0xc2, 0x3d, 0xa0, 0x1d, 0x72, 0x55, 0x92, 0xd7, 0x8a, 0xb5, 0x19, 0x86, 0xa4, 0xa9, 0xd6, 0xe9, 0x1c, 0x08, 0x7f, 0x3b, 0x38, 0x46, 0x97, 0x56, 0xee, 0xd6, 0x1e, + 0xb8, 0xce, 0x1b, 0xfe, 0x77, 0x5e, 0xb3, 0xe2, 0x75, 0xb9, 0x75, 0x38, 0x5e, 0xca, 0x76, 0x3a, 0xc7, 0x82, 0x6d, 0x4e, 0xaa, 0x48, 0xbd, 0x9a, 0x19, 0x13, 0xb8, 0xcf, 0x5f, 0x36, 0x2b, 0x3f, + 0xe5, 0x6c, 0x4e, 0x17, 0x75, 0x96, 0x62, 0x24, 0x59, 0xb8, 0x5f, 0xf2, 0xba, 0xe6, 0x6d, 0xa3, 0xf9, 0x42, 0x64, 0x2e, 0xe4, 0xe8, 0x59, 0x21, 0x2b, 0x87, 0xf3, 0xf2, 0xa0, 0x87, 0x39, 0xd9, + 0x61, 0x16, 0x3d, 0x17, 0xc4, 0x9c, 0x3b, 0xfa, 0x06, 0x3a, 0xef, 0x83, 0xbb, 0x96, 0xa8, 0xe1, 0xf7, 0x2b, 0x64, 0x98, 0xd3, 0x95, 0x0c, 0x5c, 0xf0, 0x3c, 0x5d, 0x38, 0x70, 0xfa, 0xdf, 0x9a, + 0x76, 0x06, 0x19, 0x37, 0x45, 0x7c, 0xf3, 0x70, 0x37, 0xed, 0x8e, 0x86, 0xfd, 0xc1, 0x0f, 0xd3, 0x3d, 0xe7, 0x38, 0x09, 0xbe, 0x7e, 0xfd, 0xfc, 0x6b, 0xad, 0xc8, 0xf9, 0x88, 0x2c, 0x2b, 0x0d, + 0xff, 0xf6, 0x3d, 0x19, 0xde, 0xeb, 0xe7, 0x5e, 0x19, 0xe0, 0xd7, 0x63, 0x92, 0x44, 0x13, 0x9b, 0x2f, 0xd3, 0x59, 0xa2, 0x4f, 0x51, 0xf0, 0x76, 0xff, 0x2b, 0x31, 0x16, 0x87, 0xe3, 0x71, 0x14, + 0x4f, 0x6f, 0xc2, 0x38, 0x78, 0xd7, 0xfb, 0xad, 0x20, 0x45, 0x81, 0xa2, 0xbc, 0x10, 0xdb, 0xf6, 0xc9, 0xff, 0x42, 0xc4, 0xa1, 0x9c, 0xdb, 0xf0, 0x7e, 0xd8, 0xbd, 0x8e, 0xe2, 0x80, 0x8b, 0x45, + 0xb5, 0x72, 0x1a, 0x16, 0xbf, 0x62, 0x31, 0x73, 0xeb, 0x63, 0xf9, 0x70, 0x47, 0x28, 0x2b, 0xcb, 0xae, 0x37, 0x7a, 0x1c, 0xde, 0x8e, 0xc2, 0xde, 0xf4, 0x3e, 0xbe, 0x0d, 0xdc, 0x6a, 0x6f, 0x15, + 0x58, 0x70, 0xcb, 0xde, 0x58, 0x5f, 0xcb, 0x6d, 0xe0, 0x9c, 0xf2, 0x73, 0x45, 0x9e, 0x88, 0xa0, 0xe7, 0x07, 0x36, 0x9d, 0x5f, 0xf8, 0x7f, 0xf1, 0xff, 0x7a, 0x78, 0xd6, 0x36, 0x67, 0xa5, 0xb5, + 0x4e, 0x7f, 0x14, 0x1b, 0x18, 0x28, 0xfe, 0x84, 0x4c, 0x06, 0x1f, 0x5a, 0x97, 0x15, 0x10, 0x0c, 0x12, 0x42, 0x18, 0x0c, 0x7f, 0x03, 0x09, 0xaf, 0xc7, 0xa2, 0x10, 0xbc, 0x40, 0xa1, 0x28, 0x4a, + 0xf7, 0x0c, 0x7a, 0x23, 0x38, 0x75, 0xf4, 0xd0, 0x6e, 0x2a, 0xde, 0x0b, 0x75, 0xb9, 0x5b, 0xc2, 0x7b, 0x91, 0xbb, 0xa0, 0x33, 0x75, 0xe0, 0xb3, 0xe7, 0x5d, 0x39, 0xf5, 0x44, 0x66, 0xa1, 0x6c, + 0x2e, 0x9d, 0x3c, 0xe7, 0x5b, 0x20, 0x6b, 0xc5, 0x57, 0x44, 0x51, 0x3d, 0x9c, 0xec, 0x20, 0xe3, 0x5b, 0x56, 0x8d, 0xdb, 0xba, 0xcb, 0x1e, 0x25, 0xa5, 0x1c, 0x2d, 0x4c, 0xa8, 0xdb, 0x29, 0x32, + 0x25, 0xf4, 0xe4, 0x60, 0x06, 0x12, 0x3d, 0xc7, 0x19, 0x91, 0x12, 0xd6, 0xf2, 0x80, 0x1f, 0x2c, 0xbf, 0xae, 0x04, 0xdb, 0xed, 0x65, 0xd9, 0xd1, 0x0b, 0xc1, 0x97, 0x74, 0x46, 0x55, 0x39, 0xc9, + 0x69, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, 0x3b, 0xc8, 0x88, 0x22, 0x7e, 0x7d, 0xdd, 0x7a, 0x0d, 0x40, 0x79, 0x36, 0x04, 0xe5, 0xf0, 0xfb, 0x30, 0x7c, 0x9c, 0x3e, 0x44, 0xf1, 0xd5, 0x28, 0xa9, + 0xc6, 0x10, 0x25, 0xd6, 0xe8, 0x5a, 0x1a, 0xb3, 0xdf, 0xe8, 0x5b, 0xcd, 0x34, 0x9e, 0x43, 0x31, 0x86, 0xe0, 0xcc, 0x39, 0x03, 0xcc, 0x25, 0xd6, 0x32, 0xed, 0x18, 0xaa, 0xe5, 0xc6, 0xd1, 0x78, + 0x74, 0x1f, 0xdf, 0xd6, 0xb3, 0xef, 0x5e, 0xe6, 0x51, 0x9c, 0x5f, 0x70, 0xfc, 0xaf, 0x28, 0x2a, 0x4d, 0xfa, 0xdd, 0xde, 0x75, 0xf9, 0x3a, 0xcf, 0xd8, 0x89, 0x32, 0xcd, 0xfc, 0xd0, 0xcb, 0xd6, + 0x41, 0x56, 0xa9, 0x02, 0xdf, 0xf7, 0x0f, 0x99, 0x7b, 0x8d, 0xf7, 0x3a, 0xbf, 0x1d, 0xf0, 0x9a, 0xae, 0x55, 0x71, 0x32, 0x3f, 0x05, 0xdf, 0xa2, 0x90, 0x4b, 0xcc, 0x73, 0x68, 0x77, 0xed, 0x36, + 0xe3, 0x7e, 0xfb, 0x2f, 0xf7, 0x1f, 0xce, 0x57, 0x5f, 0xb9, 0xdf, 0x6c, 0x71, 0x96, 0xe6, 0x54, 0xdf, 0xbb, 0x01, 0x30, 0xdc, 0xb6, 0xf9, 0xcc, 0xdc, 0xed, 0xc9, 0x4e, 0x2a, 0x5c, 0xf9, 0x43, + 0x54, 0xfe, 0x23, 0xce, 0xba, 0x86, 0xe2, 0xfb, 0x92, 0x85, 0xce, 0xe1, 0xb4, 0xad, 0x23, 0x7e, 0xfa, 0xb3, 0x54, 0x82, 0xb2, 0xc5, 0x2f, 0x9d, 0xce, 0x40, 0x0e, 0xd7, 0x79, 0x3e, 0x12, 0xd1, + 0xaa, 0x50, 0xbb, 0xd3, 0x93, 0x32, 0x08, 0xf7, 0x49, 0x14, 0x0f, 0xc3, 0xbb, 0xc8, 0x3b, 0x39, 0x83, 0xb6, 0xd6, 0xfa, 0x1b, 0xf4, 0xe3, 0x30, 0x49, 0x1e, 0x47, 0x71, 0xcf, 0x3b, 0x39, 0x3b, + 0x3b, 0x83, 0x23, 0x03, 0xfd, 0xae, 0xc0, 0x0c, 0x99, 0xa2, 0x24, 0x97, 0x6f, 0x1a, 0x3b, 0x44, 0xa5, 0xe7, 0x87, 0x9a, 0xf4, 0xd8, 0x98, 0x16, 0x1c, 0xeb, 0xb3, 0xae, 0xfd, 0xbb, 0xfc, 0xf9, + 0x59, 0x4b, 0x4a, 0x50, 0x6c, 0x68, 0x8a, 0x63, 0x4e, 0x99, 0xba, 0x23, 0x8c, 0x2c, 0x50, 0xfc, 0xd2, 0xe9, 0x24, 0x98, 0xae, 0x05, 0x55, 0xbb, 0xb1, 0xe0, 0x8a, 0xa7, 0x3c, 0x87, 0x00, 0x2c, + 0xf5, 0xe1, 0xf9, 0x64, 0x57, 0xe0, 0x2f, 0x9d, 0xce, 0x24, 0x97, 0x1f, 0x2e, 0xbf, 0x87, 0x86, 0x13, 0x55, 0xe6, 0xfa, 0x34, 0xc7, 0xd3, 0x93, 0xc3, 0xac, 0x19, 0xd3, 0x9a, 0x40, 0x38, 0x39, + 0xab, 0xec, 0xfa, 0xfd, 0xf8, 0xea, 0x53, 0x46, 0xe5, 0x12, 0xb3, 0x03, 0x2c, 0xbd, 0x5a, 0x4c, 0xb6, 0xd3, 0xe8, 0x3d, 0x4b, 0xd7, 0xae, 0x6d, 0x38, 0xb6, 0x01, 0x8d, 0x05, 0xdf, 0xd0, 0x4c, + 0xaf, 0x84, 0xae, 0x54, 0x84, 0x65, 0x44, 0x64, 0xf4, 0x9f, 0x98, 0xb9, 0xb0, 0x25, 0x3b, 0xdd, 0x93, 0x04, 0x2a, 0x41, 0x71, 0x53, 0x7e, 0x4e, 0xe9, 0xde, 0x0e, 0x80, 0x88, 0x85, 0xed, 0x15, + 0x5b, 0x9a, 0xdb, 0x56, 0x63, 0x3e, 0xd0, 0x9a, 0xfd, 0x6d, 0xc6, 0xd5, 0x12, 0x1e, 0xcd, 0x2e, 0x5d, 0x7e, 0x39, 0x63, 0x9c, 0xb5, 0xab, 0x67, 0x34, 0xeb, 0xa7, 0xbe, 0xb7, 0xfd, 0xc6, 0xbc, + 0xd1, 0xbd, 0xeb, 0x4d, 0x6f, 0x07, 0xc3, 0x68, 0x1a, 0xc6, 0x3f, 0x24, 0x81, 0xf7, 0x9d, 0xe3, 0x78, 0x87, 0x17, 0x9b, 0x07, 0x6f, 0x5d, 0x90, 0xd5, 0x1a, 0x3d, 0x1a, 0x4f, 0xea, 0x87, 0x5e, + 0x74, 0x75, 0xff, 0x83, 0x3d, 0x6a, 0xa7, 0x39, 0x91, 0xb2, 0x20, 0x6a, 0xf9, 0xa2, 0x5d, 0xb9, 0xed, 0x5e, 0x79, 0xd9, 0xac, 0xd6, 0xb9, 0xa2, 0x77, 0x3c, 0x5b, 0xe7, 0x38, 0x2e, 0x3b, 0x61, + 0xaf, 0x9a, 0x4b, 0x83, 0x37, 0xe6, 0xca, 0x5a, 0x54, 0x75, 0x05, 0xee, 0x75, 0x97, 0x36, 0x7a, 0xe0, 0x7d, 0xa7, 0xfb, 0xa4, 0xd9, 0x12, 0x6f, 0xa3, 0x87, 0xe8, 0x16, 0x3e, 0x40, 0x63, 0x2a, + 0xaf, 0xa6, 0x1d, 0x7d, 0xbf, 0x9b, 0x83, 0x17, 0x2b, 0xe5, 0x87, 0xf2, 0xe2, 0x3f, 0x1a, 0x1f, 0x1a, 0x24, 0x5e, 0xfd, 0xb7, 0xe7, 0xfc, 0x9e, 0x4d, 0x9d, 0x4b, 0x75, 0xb4, 0xaa, 0xd7, 0xdb, + 0xe8, 0x9f, 0xb0, 0xab, 0x73, 0xa9, 0xde, 0x5b, 0xd6, 0xab, 0xd7, 0xbf, 0x21, 0xe1, 0x9d, 0x75, 0xbd, 0x7a, 0xbd, 0xdf, 0xd7, 0xb5, 0x8b, 0xa5, 0x8f, 0x05, 0x29, 0x3f, 0xc3, 0x57, 0x9f, 0x22, + 0x74, 0x85, 0x1d, 0x7f, 0xef, 0xab, 0xb7, 0x3e, 0xf3, 0x05, 0xe7, 0xe8, 0x03, 0x8e, 0xa1, 0x6a, 0x7c, 0xc1, 0x31, 0x52, 0x9d, 0x26, 0xdd, 0x24, 0x8a, 0xef, 0x06, 0xc3, 0x70, 0x12, 0x69, 0x30, + 0x37, 0x28, 0xf1, 0x99, 0x2a, 0x38, 0x4c, 0x95, 0x39, 0x3a, 0xbf, 0x3a, 0x3c, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, + 0xd0, 0x19, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, + 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x56, 0xdf, 0x6f, 0xeb, 0x26, 0x14, + 0x7e, 0xcf, 0x5f, 0x61, 0x45, 0x7b, 0x9c, 0x21, 0x49, 0x27, 0x6d, 0x8a, 0xa8, 0xaf, 0xae, 0xa6, 0x7b, 0xd5, 0x4a, 0xed, 0x5a, 0x29, 0xdd, 0xb4, 0x57, 0x8a, 0x4f, 0x1c, 0x3a, 0x1b, 0x10, 0xe0, + 0xc4, 0xd5, 0xb4, 0xff, 0x7d, 0x32, 0xd8, 0x2e, 0x76, 0x70, 0x7f, 0x4c, 0xea, 0xf2, 0x14, 0x73, 0xbe, 0x03, 0xdf, 0xf9, 0xf5, 0x01, 0xf9, 0xd2, 0x54, 0x65, 0x72, 0x04, 0x6d, 0xb8, 0x14, 0x97, + 0xcb, 0x35, 0x5a, 0x2d, 0x13, 0x10, 0x4c, 0xe6, 0x5c, 0x14, 0x97, 0xcb, 0xdf, 0x1f, 0xbe, 0xa7, 0xbf, 0x2c, 0xbf, 0x64, 0x0b, 0xa2, 0xb4, 0x7c, 0x02, 0x66, 0x93, 0xa6, 0x2a, 0x85, 0xb9, 0x5c, + 0x1e, 0xac, 0x55, 0x5b, 0x8c, 0x2b, 0x7a, 0x04, 0x81, 0xa8, 0xa2, 0xec, 0x00, 0x48, 0xea, 0x02, 0xdf, 0xdf, 0xdd, 0xe2, 0x9f, 0xd0, 0xaa, 0xdd, 0xc5, 0x21, 0xb7, 0x8d, 0xe1, 0x03, 0xfa, 0x74, + 0x3a, 0xa1, 0xd3, 0x85, 0xc3, 0x6d, 0x56, 0xab, 0x35, 0xfe, 0xf3, 0xf6, 0x66, 0xc7, 0x0e, 0x50, 0xd1, 0x94, 0x0b, 0x63, 0xa9, 0x60, 0xb0, 0x5c, 0x24, 0xfd, 0xaf, 0x31, 0x7c, 0x6b, 0x9c, 0xf5, + 0x46, 0x32, 0x6a, 0x1d, 0xbb, 0x37, 0x4f, 0x4d, 0x5a, 0x84, 0x89, 0x41, 0x1a, 0x93, 0xfb, 0xc5, 0xd4, 0x01, 0x51, 0x63, 0xf2, 0x65, 0xb6, 0x48, 0x12, 0x52, 0xc9, 0x1c, 0xca, 0x3f, 0x7c, 0xfc, + 0x99, 0xb3, 0x11, 0x3c, 0x5a, 0x5b, 0xb4, 0x28, 0x45, 0x35, 0x08, 0x9b, 0x39, 0x7a, 0xa4, 0xd0, 0xb2, 0x56, 0xd7, 0x79, 0x26, 0x75, 0x81, 0x8c, 0xd2, 0x5c, 0x14, 0x7b, 0x4d, 0x2b, 0x38, 0x49, + 0xfd, 0x17, 0x7a, 0x94, 0xd2, 0x12, 0xdc, 0x23, 0x3c, 0x9e, 0x6a, 0xcb, 0xf7, 0x94, 0xd9, 0xeb, 0x3c, 0xf3, 0xf0, 0xb4, 0x45, 0xa5, 0xc6, 0x52, 0x6d, 0x41, 0xa7, 0x7e, 0x6f, 0x82, 0x03, 0x98, + 0xf7, 0xeb, 0xaa, 0x92, 0x5d, 0xa0, 0x75, 0xcb, 0xaa, 0xff, 0xf4, 0x46, 0x0d, 0x25, 0xb5, 0xfc, 0x08, 0xf7, 0xd4, 0x1e, 0xb0, 0x8b, 0x04, 0xf7, 0x24, 0x17, 0x01, 0x47, 0x26, 0x2b, 0x04, 0x0d, + 0xad, 0x54, 0x09, 0x08, 0x8e, 0x20, 0xac, 0x19, 0xb1, 0x0b, 0xb9, 0xed, 0x6b, 0xc1, 0xda, 0x3c, 0x4f, 0x99, 0x0c, 0x3c, 0xda, 0xbc, 0xad, 0xd3, 0xdd, 0x6f, 0x5f, 0xef, 0x77, 0x57, 0x77, 0x0f, + 0x23, 0x42, 0x44, 0xd0, 0x0a, 0xb2, 0x9d, 0x8b, 0x2e, 0xf9, 0xb5, 0x94, 0x75, 0x9e, 0x7c, 0xef, 0xb6, 0xdb, 0x6e, 0xaf, 0xac, 0x55, 0xc9, 0x37, 0x4f, 0x82, 0x60, 0x87, 0x6c, 0x5d, 0x72, 0x30, + 0x4c, 0x73, 0xd5, 0x62, 0xb2, 0xaf, 0x49, 0xd4, 0xf7, 0xc7, 0x64, 0xec, 0x1b, 0xba, 0xf8, 0xba, 0x68, 0xa9, 0x40, 0x5b, 0x0e, 0xa6, 0x4b, 0xcb, 0x13, 0x3d, 0x52, 0xd4, 0x13, 0x5b, 0xff, 0x4c, + 0xf0, 0x68, 0xc1, 0x63, 0xba, 0x22, 0xb0, 0xf6, 0xa8, 0xc1, 0xb4, 0x59, 0x6d, 0x36, 0x68, 0x85, 0x2e, 0x08, 0x8e, 0x9a, 0xbd, 0x27, 0x93, 0x95, 0xe2, 0x65, 0x5b, 0xb3, 0xb2, 0x2e, 0xb8, 0x40, + 0x41, 0x85, 0x5c, 0x89, 0xe6, 0xec, 0xdd, 0xb9, 0xb5, 0x86, 0x3d, 0xd7, 0x70, 0xee, 0xed, 0xba, 0x6e, 0xce, 0xec, 0x9d, 0x7d, 0x47, 0xf7, 0x07, 0x20, 0x45, 0xdb, 0x96, 0xb3, 0xa0, 0x4d, 0x66, + 0x75, 0x0d, 0x04, 0xcf, 0xdb, 0xa3, 0xfe, 0x46, 0xd6, 0x9a, 0x81, 0xcb, 0x50, 0xdc, 0x12, 0xf5, 0xb2, 0x54, 0x17, 0x60, 0x63, 0x5e, 0x9d, 0xc5, 0x7b, 0x75, 0x62, 0x81, 0x1e, 0x6b, 0x5e, 0xe6, + 0xdd, 0x86, 0xdf, 0x3a, 0x51, 0xc9, 0x9c, 0xa6, 0x10, 0xfc, 0x2a, 0x66, 0xbc, 0x8d, 0x06, 0x25, 0xb5, 0xe5, 0xa2, 0x40, 0xb2, 0xb6, 0xaa, 0xb6, 0x73, 0x5b, 0xcd, 0xe2, 0xfc, 0x74, 0x04, 0xad, + 0xe2, 0xdb, 0x4f, 0x81, 0xc8, 0x41, 0xb0, 0xe7, 0x5b, 0x2a, 0x68, 0x01, 0xd5, 0xcb, 0x80, 0x0f, 0xa6, 0xa1, 0xaf, 0x46, 0xf8, 0x6c, 0x50, 0xa9, 0x57, 0xa5, 0xc0, 0x35, 0xd0, 0x44, 0x0b, 0x66, + 0xf4, 0xc0, 0x41, 0xd3, 0xf0, 0xd8, 0x73, 0x39, 0x18, 0x49, 0xc2, 0x0f, 0x7f, 0xc7, 0xba, 0xf4, 0x9f, 0x89, 0x48, 0x38, 0x17, 0xfb, 0xac, 0x20, 0x53, 0xb2, 0x22, 0xd8, 0xfd, 0x7b, 0x31, 0x18, + 0x26, 0x15, 0x64, 0xbc, 0x6a, 0x93, 0x46, 0xb0, 0xff, 0xea, 0x83, 0xc5, 0xd3, 0x68, 0x83, 0x95, 0x2e, 0x29, 0x21, 0x26, 0xcc, 0xe0, 0x22, 0x9a, 0xc0, 0x48, 0xfa, 0x3e, 0xaa, 0xa3, 0x6f, 0x2b, + 0x29, 0x65, 0xb6, 0xa6, 0x56, 0xea, 0x88, 0x96, 0x9e, 0x07, 0xf4, 0x7f, 0x10, 0x3a, 0xc1, 0xe3, 0xbe, 0xac, 0x9b, 0xcf, 0xe0, 0x13, 0xef, 0xae, 0xd9, 0xde, 0xea, 0x19, 0xf5, 0x22, 0xdf, 0x52, + 0xfb, 0x0c, 0x5a, 0xff, 0x29, 0x4d, 0x16, 0x4c, 0xe4, 0xfe, 0x1b, 0x5a, 0xd4, 0x9b, 0x83, 0x06, 0x9d, 0xd2, 0x9c, 0x36, 0x67, 0xbb, 0xe4, 0x74, 0xa5, 0x17, 0x12, 0x27, 0xa8, 0xd3, 0x31, 0x1f, + 0x0c, 0x26, 0x18, 0x0a, 0xbf, 0xf2, 0xb2, 0x30, 0x09, 0xb7, 0x7b, 0x51, 0x78, 0xf1, 0xeb, 0xbc, 0x23, 0x23, 0x3e, 0x0e, 0xd9, 0xbf, 0x3b, 0x26, 0x77, 0x43, 0x7c, 0xc0, 0x47, 0x23, 0x3e, 0x73, + 0x9b, 0x44, 0xa7, 0x1c, 0x4f, 0x89, 0x7f, 0x62, 0x24, 0x93, 0x8b, 0xea, 0x1d, 0x91, 0xcc, 0x5c, 0x6d, 0xef, 0x89, 0xa4, 0xff, 0xee, 0x75, 0x04, 0x9f, 0x17, 0x33, 0x2c, 0xb2, 0x99, 0xd4, 0x36, + 0xd8, 0x38, 0x8c, 0xbe, 0xd0, 0x94, 0x96, 0xc7, 0xca, 0xdf, 0x3e, 0x56, 0xca, 0x32, 0x16, 0x7b, 0x18, 0xb9, 0x70, 0x8f, 0xad, 0xd4, 0x27, 0x60, 0x3e, 0xee, 0x33, 0xf6, 0xaf, 0xb2, 0x78, 0xd7, + 0xf0, 0xcc, 0x8f, 0xcf, 0xc7, 0xc8, 0x8c, 0x12, 0x49, 0x70, 0x37, 0x1f, 0xc3, 0xed, 0x99, 0x2d, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x26, 0xa4, 0x1b, 0x1d, 0x1d, 0x03, 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, @@ -6024,5928 +10134,6210 @@ var TemplatesZip = []byte{ 0x4b, 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, - 0x6e, 0xec, 0xfd, 0x59, 0x93, 0xfa, 0x4a, 0x92, 0x37, 0x08, 0xdf, 0xbf, 0x9f, 0xe2, 0xd8, 0xb9, 0x7c, 0xf5, 0x90, 0xda, 0x17, 0xda, 0xa6, 0x6a, 0x1a, 0x49, 0x80, 0x58, 0x84, 0x10, 0x48, 0x2c, - 0x1a, 0x9b, 0x1a, 0xd3, 0xbe, 0xa0, 0x7d, 0x05, 0x3d, 0x3d, 0xf5, 0xd9, 0xc7, 0x10, 0x90, 0x09, 0x99, 0x90, 0x28, 0xf9, 0x9f, 0xea, 0xea, 0xee, 0x3a, 0x37, 0x99, 0x92, 0x42, 0x72, 0xa1, 0x9f, - 0x7b, 0x84, 0x7b, 0x78, 0xb8, 0x7b, 0xfc, 0xef, 0xff, 0xdf, 0x6f, 0xbf, 0xfd, 0x1e, 0xaa, 0x81, 0xf9, 0xfb, 0xbf, 0xfd, 0xf6, 0xbb, 0x59, 0x9a, 0x61, 0xde, 0x71, 0xd4, 0xd0, 0xf0, 0xcd, 0xf4, - 0xf7, 0xff, 0x75, 0x6c, 0x2a, 0xcd, 0x34, 0x73, 0xa3, 0xf0, 0xd8, 0x0a, 0xbd, 0xc1, 0x6f, 0xd0, 0xe9, 0xaa, 0x1f, 0xe9, 0x3b, 0xcb, 0xf5, 0xcd, 0xd5, 0x7b, 0x2b, 0xd2, 0x5c, 0x4f, 0xcd, 0xa4, - 0x70, 0x53, 0x33, 0xfb, 0xfd, 0xdf, 0x7e, 0xcb, 0xd3, 0xc2, 0x6c, 0xae, 0xc5, 0xaa, 0xbe, 0x53, 0xed, 0xe6, 0xda, 0xf1, 0x65, 0xbf, 0xfd, 0xf6, 0xfb, 0xfb, 0xd1, 0xb7, 0xaf, 0x6e, 0x9a, 0xef, - 0xbe, 0xbe, 0x69, 0xf1, 0x5d, 0xdd, 0x0c, 0xb3, 0xe6, 0xd9, 0x5e, 0xac, 0xea, 0x8e, 0xd9, 0x41, 0xae, 0x9b, 0x0d, 0x33, 0x36, 0x43, 0xc3, 0x0c, 0x75, 0xf7, 0xea, 0xcd, 0x4d, 0xcb, 0xbf, 0xe7, - 0x87, 0xd8, 0xcc, 0xc0, 0x30, 0x32, 0x9a, 0x87, 0xff, 0x06, 0x13, 0x6f, 0x30, 0xfc, 0x06, 0x23, 0xef, 0xcf, 0xfe, 0xf6, 0xdb, 0xef, 0xba, 0x1f, 0x15, 0x46, 0xf3, 0x93, 0xb2, 0xe6, 0x1e, 0xe2, - 0x0d, 0x7a, 0xc3, 0xae, 0x6f, 0xb0, 0x54, 0x35, 0xeb, 0x78, 0x59, 0x27, 0x2d, 0xc2, 0xdc, 0x0d, 0xce, 0x84, 0x9a, 0x1f, 0x78, 0xbe, 0xe7, 0xff, 0xbd, 0xfa, 0x25, 0x25, 0xfb, 0xec, 0xc7, 0xe4, - 0x6a, 0x7c, 0xa2, 0x81, 0xbd, 0xc1, 0xe8, 0xd5, 0x67, 0xbc, 0xdf, 0xa1, 0xa7, 0x6e, 0x9c, 0x77, 0xcc, 0xcc, 0x77, 0xc3, 0x1c, 0x3c, 0xfd, 0xeb, 0xc4, 0x7e, 0x61, 0xbb, 0xe1, 0xf9, 0x31, 0x04, - 0x7b, 0xfa, 0x58, 0xac, 0xa6, 0x99, 0x99, 0x3e, 0xb8, 0xff, 0x74, 0x4f, 0xd3, 0x48, 0xbe, 0x21, 0xc4, 0xbd, 0xc6, 0x8e, 0x1e, 0x85, 0x96, 0x6b, 0x77, 0xe2, 0xd4, 0xcc, 0x73, 0xf7, 0x4c, 0x89, - 0x7a, 0x43, 0xef, 0xde, 0x7b, 0xfa, 0x71, 0xb7, 0xf7, 0xa2, 0x6f, 0x9f, 0x5e, 0x7a, 0xe4, 0x41, 0x70, 0xe2, 0xee, 0xdf, 0x90, 0xcf, 0x10, 0xdf, 0x3c, 0x8a, 0x7c, 0x7e, 0x4d, 0x56, 0xc4, 0x66, - 0x9a, 0x9b, 0x59, 0x7e, 0xe6, 0x0f, 0xfa, 0x06, 0x5f, 0x37, 0x7f, 0x03, 0x68, 0x9e, 0x75, 0xde, 0x79, 0xdf, 0x7d, 0x83, 0x3f, 0x3d, 0x97, 0x19, 0x4d, 0x03, 0x74, 0x04, 0xe8, 0x53, 0xcb, 0x43, - 0x0c, 0xe0, 0x37, 0x98, 0xfa, 0xf4, 0x8e, 0x77, 0xf0, 0x2f, 0x70, 0xbf, 0x61, 0xef, 0x92, 0xd1, 0xfc, 0x3f, 0xcb, 0x47, 0x03, 0xc1, 0xff, 0x13, 0x44, 0x46, 0xe1, 0x9b, 0x19, 0xf8, 0xef, 0x9a, - 0xaa, 0x99, 0x3e, 0xa8, 0x47, 0x86, 0xd9, 0xb1, 0xd2, 0x53, 0xcf, 0xf8, 0xdf, 0x77, 0xba, 0x02, 0xf9, 0x06, 0x23, 0x6f, 0xf0, 0xc7, 0xcf, 0xfb, 0x3d, 0x35, 0xb3, 0xc8, 0x2f, 0xcd, 0xe6, 0xb7, - 0x3b, 0x79, 0x1e, 0x67, 0xff, 0x06, 0x82, 0xa9, 0x69, 0xbb, 0x59, 0x9e, 0x1e, 0xde, 0xc2, 0x38, 0xf0, 0xb2, 0xb7, 0x28, 0xb5, 0xbf, 0xd2, 0x07, 0x3b, 0x57, 0x27, 0x9d, 0x33, 0xd9, 0xb7, 0xdc, - 0xae, 0x3f, 0x48, 0xbb, 0x61, 0x6e, 0xda, 0xa9, 0x9b, 0x1f, 0x8e, 0xb4, 0x33, 0x47, 0xc5, 0x61, 0xa4, 0xa3, 0xe4, 0xf0, 0x21, 0x32, 0xe8, 0x3d, 0x2c, 0xeb, 0x07, 0xd7, 0x9c, 0xf3, 0xcb, 0xdd, - 0x3a, 0x94, 0x31, 0x67, 0x9e, 0x38, 0x55, 0x42, 0x3a, 0x43, 0x17, 0x09, 0x07, 0x53, 0x78, 0x6a, 0xf6, 0xd0, 0xbe, 0xec, 0x03, 0x09, 0x32, 0x15, 0xf7, 0x30, 0xc1, 0x8f, 0x96, 0xf6, 0x18, 0x02, - 0x6a, 0xd2, 0x08, 0x03, 0xbb, 0x9c, 0x77, 0xc5, 0x7c, 0xe4, 0x9b, 0x45, 0x5f, 0x1a, 0x0a, 0xae, 0xc0, 0xc1, 0x0b, 0x7d, 0x54, 0xfd, 0xe5, 0x2f, 0xd7, 0xdd, 0xb7, 0xbc, 0x1a, 0x43, 0x7e, 0x7b, - 0xd2, 0xa3, 0x4f, 0x9f, 0xe5, 0xb8, 0xb6, 0xe3, 0xbb, 0xb6, 0x73, 0x91, 0x62, 0x18, 0xfa, 0x09, 0xe8, 0x8e, 0xe9, 0xc7, 0x66, 0xda, 0x29, 0x55, 0xdf, 0x35, 0xd4, 0x3c, 0x4a, 0x3b, 0xae, 0x61, - 0x86, 0xb9, 0x6b, 0x9d, 0x98, 0xfc, 0x80, 0x0b, 0xd7, 0xf2, 0xfc, 0x43, 0x26, 0x7c, 0xf3, 0x3e, 0xb0, 0xf3, 0x5d, 0x6b, 0xe7, 0xf4, 0xde, 0xe7, 0x5c, 0x5a, 0xa1, 0x79, 0x46, 0xd6, 0xfc, 0xb2, - 0xc0, 0x7d, 0xcb, 0xad, 0xd6, 0xec, 0x6a, 0x5d, 0x2f, 0xd8, 0xe1, 0x68, 0x06, 0xf8, 0x21, 0xd3, 0x97, 0x0d, 0x75, 0x63, 0xe7, 0x2b, 0x6e, 0x6c, 0x4f, 0x35, 0x38, 0x1d, 0xaa, 0x3d, 0xc2, 0xe3, - 0xd3, 0x9c, 0xee, 0xf6, 0x83, 0x3e, 0x39, 0x85, 0x29, 0x2b, 0xda, 0x8c, 0x47, 0x7d, 0x4a, 0x0e, 0xc1, 0x1e, 0xe8, 0x10, 0xb3, 0xb1, 0x35, 0x14, 0x63, 0xd0, 0x84, 0xc7, 0x58, 0xef, 0x3e, 0x97, - 0x9e, 0xc3, 0x7b, 0xc5, 0x9c, 0x7f, 0x00, 0x98, 0x17, 0xea, 0x47, 0xe8, 0x2e, 0xc7, 0xad, 0x81, 0xda, 0x2e, 0x19, 0xa1, 0xda, 0x97, 0xd2, 0xb6, 0x3f, 0xe2, 0x97, 0x43, 0x95, 0x16, 0x35, 0x7c, - 0xc7, 0xb2, 0x19, 0x13, 0xc5, 0xac, 0xe1, 0xca, 0xc3, 0x2c, 0x89, 0xd5, 0x3c, 0x46, 0x2d, 0xc1, 0x1f, 0x61, 0x00, 0xc2, 0x89, 0xcb, 0x9d, 0x14, 0xf4, 0x57, 0xeb, 0x70, 0x55, 0x1c, 0x96, 0x46, - 0x8f, 0xc1, 0xfb, 0x6b, 0x26, 0x59, 0xae, 0xd7, 0x52, 0x09, 0xb9, 0x1a, 0x81, 0x2e, 0xbc, 0x05, 0x69, 0x48, 0xb4, 0x61, 0xff, 0xb2, 0x38, 0x7f, 0x2b, 0x90, 0x8d, 0x80, 0x7f, 0x1a, 0x4e, 0x75, - 0x47, 0xf5, 0x77, 0xef, 0x83, 0xe9, 0x4d, 0x93, 0x97, 0x75, 0xf2, 0x68, 0x67, 0x86, 0xd9, 0x79, 0x3c, 0x82, 0xae, 0x34, 0x55, 0x7b, 0xde, 0x81, 0x37, 0xad, 0x6a, 0x98, 0xb9, 0x9d, 0x2c, 0x3f, - 0xf8, 0x37, 0x1f, 0x70, 0xcd, 0x54, 0xf4, 0x0d, 0x79, 0xfb, 0xf9, 0x28, 0x75, 0x45, 0x17, 0xec, 0x5c, 0x9f, 0x75, 0x1a, 0x7a, 0xcf, 0xf9, 0xb9, 0x92, 0x20, 0x65, 0x44, 0xec, 0x94, 0x85, 0x21, - 0x39, 0xd4, 0xf6, 0x30, 0xae, 0xd0, 0x25, 0xaf, 0x6d, 0x03, 0xb0, 0x00, 0x66, 0x89, 0x95, 0xf5, 0xf6, 0xfd, 0x78, 0x2d, 0x40, 0x73, 0xab, 0x9b, 0x25, 0x14, 0x68, 0x76, 0xb1, 0xf5, 0x7e, 0x2f, - 0xc4, 0xf3, 0xc9, 0xbe, 0x3b, 0x58, 0xc0, 0x03, 0xff, 0xc0, 0xe4, 0xc2, 0x8a, 0x9d, 0x09, 0x22, 0x40, 0x85, 0xb9, 0x9f, 0x0c, 0xf6, 0xee, 0x42, 0x07, 0x52, 0x3c, 0x79, 0x20, 0xf8, 0x2d, 0xf8, - 0xa9, 0x47, 0x7e, 0x94, 0x1e, 0x15, 0x47, 0x69, 0xa6, 0xf9, 0x59, 0x61, 0x74, 0xef, 0x59, 0x0a, 0x66, 0x68, 0xbb, 0xe1, 0xe7, 0xa7, 0x2f, 0xba, 0xea, 0xaf, 0x7f, 0xf9, 0xc9, 0x60, 0x76, 0x9f, - 0x63, 0x17, 0x01, 0xb9, 0xc7, 0x2b, 0xe4, 0x0d, 0x7b, 0x43, 0x7e, 0xcc, 0xab, 0x86, 0xe2, 0x51, 0x8b, 0x1c, 0xff, 0x77, 0x1a, 0x1a, 0xcf, 0xf9, 0xc3, 0xe7, 0x2e, 0x60, 0x75, 0xfd, 0x78, 0x3c, - 0xd3, 0xab, 0x01, 0x96, 0xaf, 0x57, 0x14, 0x28, 0xa4, 0x92, 0x94, 0x0f, 0x60, 0x5b, 0x71, 0x01, 0x8b, 0x1a, 0x24, 0xfe, 0xa1, 0x67, 0x44, 0x45, 0xaa, 0xfa, 0xfa, 0x60, 0x3d, 0x10, 0xd7, 0x03, - 0x04, 0x98, 0xd9, 0x0c, 0xb7, 0x74, 0xbc, 0x1d, 0xa3, 0x01, 0xa3, 0x01, 0x3d, 0x4d, 0xba, 0x5a, 0xa1, 0x54, 0x7d, 0x78, 0xaf, 0xef, 0x44, 0x19, 0x8b, 0xcd, 0x65, 0x21, 0xbe, 0xcc, 0x9f, 0x5b, - 0x39, 0x3e, 0x9a, 0x29, 0xc8, 0xad, 0xea, 0x37, 0x33, 0x5d, 0x8d, 0xcd, 0x4e, 0x96, 0xa7, 0x6e, 0x68, 0x77, 0x52, 0xd3, 0x36, 0xf7, 0xf1, 0x99, 0x8f, 0xd0, 0x1b, 0xfe, 0xc9, 0x2a, 0x89, 0xa3, - 0x34, 0xcf, 0x3a, 0x0d, 0xcf, 0x9b, 0x7b, 0xf0, 0xc6, 0x72, 0xf9, 0x27, 0xf0, 0xfa, 0x93, 0xd4, 0xdd, 0xe3, 0xf9, 0x51, 0x0e, 0xd1, 0x9f, 0xf3, 0xfc, 0x9a, 0x72, 0x63, 0x41, 0x5c, 0x9d, 0x77, - 0x1a, 0x9a, 0xcf, 0x65, 0x40, 0xb4, 0x7a, 0x72, 0x6e, 0x00, 0xe5, 0xc0, 0xe8, 0xe5, 0x03, 0x51, 0x67, 0x28, 0x86, 0x39, 0x6c, 0x73, 0xd8, 0xda, 0xae, 0xf7, 0xcb, 0xa4, 0xe7, 0x4e, 0x10, 0x7d, - 0xc9, 0x12, 0x35, 0x4b, 0x53, 0x33, 0x54, 0x8f, 0xb3, 0x3e, 0xdd, 0x2b, 0x17, 0xfb, 0xb8, 0x5b, 0x0b, 0x43, 0x9b, 0x18, 0x82, 0x4b, 0x8e, 0x1b, 0x6f, 0x7b, 0x12, 0x45, 0x81, 0x6a, 0x0d, 0x8e, - 0x0a, 0x76, 0xd8, 0x9b, 0x66, 0xb3, 0x95, 0x36, 0x7c, 0x7d, 0xcc, 0x3d, 0x7d, 0xc3, 0x65, 0x32, 0x72, 0xb4, 0xe4, 0xd1, 0x3f, 0x88, 0x03, 0xe1, 0x63, 0x33, 0xee, 0xf4, 0x9a, 0xd7, 0xe0, 0x0f, - 0x2f, 0xd6, 0xdb, 0xe5, 0xa4, 0xd3, 0x50, 0xfb, 0x1e, 0x78, 0xb8, 0x13, 0x77, 0xe9, 0x95, 0xdb, 0x75, 0x75, 0xb1, 0x34, 0x57, 0xa8, 0x3c, 0x3a, 0x78, 0xa8, 0x38, 0xe2, 0xf5, 0x58, 0x2a, 0x19, - 0xf9, 0x17, 0xf5, 0xfa, 0xed, 0xb7, 0x3b, 0x6a, 0xd6, 0xb1, 0x7c, 0xd5, 0x7e, 0xa8, 0x18, 0xa0, 0x17, 0x94, 0xfd, 0x85, 0xe8, 0x51, 0xc9, 0x9f, 0x0f, 0x3b, 0x0d, 0xa5, 0x67, 0x5f, 0x9d, 0x1b, - 0x0b, 0x19, 0x65, 0x86, 0x4a, 0xea, 0x8e, 0xd7, 0x81, 0x35, 0x1b, 0x5a, 0x7e, 0xc4, 0x51, 0xa4, 0xbf, 0x2a, 0x4a, 0xe8, 0x7b, 0x81, 0xf9, 0x87, 0xf7, 0xd2, 0x2f, 0x03, 0xc6, 0x3d, 0xb4, 0xf0, - 0x37, 0xfc, 0x05, 0xb4, 0x6e, 0x49, 0x83, 0x9d, 0x4f, 0x17, 0x3a, 0x0d, 0xd5, 0x16, 0x1d, 0xd5, 0x5b, 0x79, 0x95, 0xb1, 0x19, 0xe5, 0x18, 0x44, 0xf1, 0x23, 0xb7, 0x97, 0x30, 0x1b, 0x2c, 0x92, - 0x27, 0x99, 0x2d, 0x23, 0xfd, 0xa4, 0x37, 0xac, 0x33, 0x64, 0x1e, 0xef, 0x02, 0x4c, 0x15, 0xb7, 0x9a, 0x17, 0x00, 0x4a, 0x7f, 0xdd, 0xd7, 0xd7, 0xd8, 0xd2, 0x1a, 0xcc, 0xa4, 0x14, 0x2b, 0xf8, - 0x99, 0x12, 0xa8, 0x90, 0x79, 0xc0, 0x2c, 0xdc, 0xb7, 0xa7, 0xe9, 0x8e, 0x86, 0xd4, 0x0d, 0x24, 0xf2, 0xd1, 0xeb, 0xb6, 0xfe, 0x95, 0x60, 0x1d, 0x47, 0x6a, 0xe8, 0x1f, 0x35, 0xb6, 0xde, 0x4c, - 0xb5, 0x53, 0xfd, 0x01, 0x67, 0xa0, 0x37, 0xec, 0x05, 0x03, 0xe7, 0x33, 0x71, 0xb0, 0xf3, 0x7e, 0xd8, 0x69, 0x28, 0x3e, 0xe7, 0x0a, 0x5e, 0x92, 0x12, 0xdb, 0xef, 0xc6, 0xfe, 0xca, 0x29, 0xf7, - 0xa2, 0xb9, 0x9e, 0x6e, 0x58, 0xa9, 0x1c, 0x94, 0x63, 0xda, 0xe0, 0x88, 0xb8, 0x9f, 0x19, 0xa1, 0x8f, 0xd8, 0xa0, 0xd1, 0x8b, 0xf3, 0xa0, 0x18, 0xf4, 0xe7, 0xa6, 0x21, 0x62, 0xfd, 0x34, 0xc1, - 0xd3, 0x8c, 0xcd, 0x36, 0x40, 0x50, 0xf6, 0x78, 0x02, 0x86, 0x46, 0xce, 0x4c, 0x15, 0x90, 0x35, 0xbe, 0x82, 0x0d, 0x41, 0x08, 0xd9, 0xc9, 0x7e, 0xf7, 0x0b, 0x2a, 0xd4, 0x2b, 0x7f, 0x3f, 0xcd, - 0xc3, 0x61, 0xe4, 0x76, 0x16, 0x6f, 0x98, 0x5a, 0x71, 0x62, 0x16, 0xf6, 0x79, 0xae, 0x6d, 0x66, 0x71, 0x6a, 0x9e, 0xe6, 0xe1, 0xe4, 0xe7, 0xe9, 0xbd, 0xed, 0x47, 0x9a, 0xea, 0x9f, 0xf4, 0xf1, - 0x71, 0x52, 0x7a, 0xdb, 0xea, 0xda, 0x61, 0x94, 0x5e, 0xe6, 0xf7, 0xd0, 0x1b, 0x71, 0xd3, 0x16, 0x1c, 0x85, 0xbc, 0x63, 0xa5, 0x66, 0xe6, 0xdc, 0x57, 0xe7, 0x5e, 0xd6, 0x39, 0xa8, 0x81, 0x7f, - 0x6e, 0x84, 0x3f, 0x79, 0x0e, 0x02, 0x37, 0x74, 0x03, 0x35, 0xd7, 0x9d, 0x77, 0x09, 0xbb, 0xf9, 0x9e, 0xa3, 0x11, 0x10, 0x77, 0xbc, 0x2c, 0x0a, 0x3b, 0x7a, 0x14, 0x04, 0xef, 0x1e, 0x22, 0xb4, - 0xf9, 0xba, 0x9f, 0x89, 0xe2, 0xdf, 0x60, 0xe8, 0x88, 0x17, 0xf4, 0xdb, 0x7f, 0xfc, 0xc7, 0x6f, 0x7f, 0xfd, 0x0b, 0x8c, 0xb4, 0xb5, 0xca, 0x3f, 0x8b, 0xcf, 0x4d, 0xeb, 0x05, 0xf0, 0x7b, 0xe2, - 0x8a, 0xdd, 0xb8, 0x49, 0xda, 0x8a, 0x6b, 0x43, 0x11, 0xec, 0x9c, 0xfe, 0x77, 0x1a, 0x1a, 0xcf, 0x05, 0xd4, 0x88, 0xfa, 0x95, 0x51, 0x06, 0xd8, 0x9c, 0x31, 0x27, 0xd8, 0x04, 0x5d, 0x88, 0x33, - 0x44, 0x61, 0x10, 0x7a, 0x2b, 0xd3, 0xea, 0xbe, 0x9a, 0xf6, 0x16, 0x4c, 0xa2, 0x04, 0xbc, 0x97, 0x0f, 0x28, 0x15, 0x87, 0xc7, 0xc8, 0x42, 0x83, 0xf6, 0xf1, 0xca, 0x8f, 0x06, 0x8b, 0x90, 0x11, - 0xd8, 0x2a, 0xf1, 0xe2, 0x2a, 0xec, 0x45, 0x6a, 0x84, 0xc5, 0xa6, 0x3f, 0xa3, 0x7c, 0x74, 0x31, 0x36, 0x4a, 0xd4, 0x5e, 0xbc, 0x2e, 0xa0, 0x41, 0xc3, 0xa5, 0xa3, 0x20, 0x21, 0x3f, 0x64, 0xd2, - 0x5f, 0xff, 0x42, 0xdc, 0x1b, 0x63, 0x62, 0xd3, 0x4c, 0xaf, 0xdd, 0x7a, 0xbc, 0x99, 0xab, 0xb7, 0x04, 0x1e, 0x0e, 0xed, 0x4d, 0x6b, 0x14, 0xe7, 0x6e, 0x14, 0xaa, 0xfe, 0xb5, 0x9e, 0xfd, 0xed, - 0x9d, 0xef, 0xbf, 0xc0, 0xff, 0x8f, 0x9e, 0x73, 0xd7, 0xe4, 0x40, 0xde, 0x5e, 0x99, 0x66, 0x9f, 0x89, 0x82, 0x9d, 0xcb, 0x51, 0xe7, 0x44, 0xe8, 0xb9, 0x1c, 0xd0, 0xeb, 0x11, 0x53, 0xd4, 0x35, - 0x5b, 0xb2, 0x11, 0x87, 0x63, 0x33, 0x6e, 0xc2, 0x64, 0x26, 0xab, 0x86, 0x3d, 0xa7, 0x8f, 0x32, 0x26, 0x1b, 0xa5, 0x36, 0x3b, 0xc5, 0x79, 0x89, 0x98, 0xf2, 0x9b, 0x8d, 0x87, 0xac, 0x99, 0xd0, - 0xe8, 0xca, 0x0c, 0x92, 0xd5, 0xc6, 0x0e, 0xeb, 0xad, 0xa7, 0x96, 0x67, 0xd8, 0x33, 0x9a, 0xd9, 0x4c, 0x65, 0x35, 0xdc, 0x6c, 0xf5, 0x98, 0xa6, 0x27, 0xc2, 0x72, 0x3d, 0xac, 0x5e, 0xb7, 0xf3, - 0xf2, 0x43, 0x6c, 0x76, 0xac, 0x8b, 0xdb, 0x10, 0x7a, 0xa3, 0x7e, 0xdc, 0x69, 0xff, 0xfa, 0x17, 0xea, 0xeb, 0x13, 0x56, 0x11, 0x1a, 0x6e, 0x68, 0xdf, 0x3e, 0x51, 0xa4, 0xfe, 0x35, 0xac, 0xb6, - 0x9b, 0x3b, 0x85, 0xf6, 0xa6, 0x47, 0x01, 0x98, 0xc5, 0x51, 0x98, 0x45, 0x69, 0x06, 0x66, 0x6e, 0x68, 0x1c, 0x59, 0x90, 0x3a, 0x45, 0xf6, 0xcb, 0x3d, 0x3f, 0x78, 0xc4, 0xf4, 0x93, 0xd8, 0xff, - 0x94, 0xe7, 0xc1, 0x91, 0xdd, 0x41, 0xd6, 0x69, 0x9e, 0x7e, 0xce, 0xe8, 0x6c, 0xb8, 0x9b, 0xef, 0x81, 0x95, 0xc7, 0xe7, 0x41, 0x8f, 0xe0, 0x37, 0x08, 0x19, 0xf5, 0xb0, 0x01, 0x3d, 0xe8, 0x4f, - 0x07, 0x8c, 0xa2, 0x60, 0x4b, 0x6c, 0x93, 0x98, 0x43, 0x61, 0xc3, 0x94, 0x04, 0x95, 0x4b, 0x80, 0xa7, 0xa1, 0xe5, 0x0e, 0x5c, 0x1c, 0xd4, 0xc9, 0x7a, 0x0e, 0xcd, 0xa5, 0xc9, 0x61, 0x9d, 0x07, - 0xd3, 0x25, 0x0f, 0x69, 0x80, 0x6a, 0xc8, 0x52, 0xbf, 0xd4, 0x32, 0x78, 0xde, 0x57, 0x39, 0xe4, 0x81, 0x9d, 0xf0, 0x2a, 0x42, 0xf7, 0x07, 0xef, 0xfb, 0x06, 0x2a, 0xfc, 0xc2, 0x48, 0x79, 0x87, - 0xfe, 0xd1, 0xee, 0xfa, 0x7a, 0xb5, 0xd3, 0xd0, 0x7f, 0x0e, 0x2a, 0x61, 0xcd, 0x75, 0x60, 0x81, 0xb9, 0x4e, 0x95, 0xcc, 0x89, 0x19, 0xa8, 0x8e, 0x4a, 0xc4, 0x82, 0x6d, 0x9e, 0xa3, 0x7c, 0x61, - 0x95, 0xaf, 0x45, 0x2e, 0x4a, 0x18, 0xec, 0x30, 0x21, 0xa2, 0x25, 0xbb, 0x5a, 0x45, 0x7a, 0x11, 0xf4, 0x32, 0x8b, 0x49, 0xbc, 0xdd, 0x26, 0x4c, 0xdc, 0x2d, 0xef, 0x04, 0x7c, 0xb5, 0x04, 0x83, - 0x3e, 0x37, 0x8d, 0xc9, 0x95, 0xe9, 0xf8, 0x39, 0x9a, 0xf8, 0x84, 0xdf, 0x77, 0x9f, 0xf5, 0x9e, 0xff, 0xba, 0xe2, 0x6f, 0xa9, 0x59, 0xee, 0x5a, 0x07, 0x50, 0xf5, 0xca, 0x23, 0x94, 0xb1, 0xeb, - 0x3f, 0x74, 0xce, 0xa2, 0x2f, 0xd9, 0xcc, 0x77, 0xdf, 0x00, 0x76, 0x6e, 0x4e, 0x3b, 0x68, 0x3b, 0xc3, 0xd9, 0xd4, 0xb4, 0x7e, 0xee, 0x8f, 0x48, 0x63, 0xbf, 0x19, 0xe0, 0xb5, 0x3b, 0x33, 0x52, - 0x08, 0x0f, 0x84, 0x2d, 0x35, 0x0b, 0x59, 0x77, 0x4e, 0xc3, 0x9b, 0xb2, 0xe7, 0x4f, 0x39, 0x3d, 0x5f, 0xe4, 0xe0, 0x42, 0x07, 0x18, 0x74, 0xca, 0x08, 0xab, 0x35, 0xee, 0x06, 0xf2, 0x6a, 0x03, - 0x04, 0x4e, 0x29, 0x3b, 0xe1, 0xac, 0x0e, 0xe6, 0x34, 0x67, 0x56, 0xf2, 0x4e, 0x18, 0xd8, 0x43, 0x9f, 0xd9, 0xdb, 0x46, 0xef, 0x93, 0x17, 0xea, 0x99, 0x3d, 0x46, 0xbd, 0xc1, 0x9f, 0x4c, 0xa7, - 0xe3, 0x97, 0x58, 0x51, 0x1a, 0xa8, 0x67, 0xbb, 0x05, 0xf9, 0x6c, 0x95, 0x1d, 0x11, 0xe8, 0x14, 0xa9, 0xfb, 0xfb, 0x87, 0x1f, 0xf1, 0x45, 0xce, 0x7c, 0xf2, 0x16, 0x36, 0x3f, 0xe9, 0x1e, 0xab, - 0xa8, 0xc6, 0x08, 0xfa, 0x31, 0xaf, 0x54, 0xaf, 0x3c, 0x73, 0xe6, 0x44, 0xe0, 0x39, 0x47, 0xb2, 0x45, 0x01, 0xef, 0x62, 0x5d, 0xe8, 0x1e, 0xa6, 0xf9, 0x76, 0x4f, 0x4f, 0xca, 0xc4, 0x92, 0x4c, - 0xa7, 0x3b, 0xa9, 0x95, 0x7e, 0x25, 0xa0, 0x4b, 0xe9, 0xb0, 0x81, 0x39, 0x09, 0xc0, 0x18, 0x95, 0xad, 0x19, 0x82, 0x8b, 0xa5, 0xe1, 0xd6, 0x19, 0x39, 0xf3, 0x51, 0xed, 0x75, 0x37, 0xc5, 0x44, - 0x26, 0x27, 0x5b, 0xb6, 0x0a, 0x55, 0xd3, 0xc1, 0x1d, 0x5d, 0xa8, 0xbc, 0x03, 0x2c, 0x16, 0xe3, 0x9a, 0x9e, 0xb7, 0xe4, 0x48, 0x03, 0xab, 0x61, 0x9a, 0x71, 0xc7, 0x4c, 0x0a, 0xd5, 0xbf, 0xb2, - 0x19, 0xaf, 0xb0, 0x6f, 0xc6, 0x88, 0x4c, 0x77, 0xcc, 0x40, 0xed, 0xe4, 0xa9, 0x7a, 0xc4, 0xe8, 0xb2, 0xb4, 0xf8, 0xc9, 0x9f, 0x7b, 0x5e, 0x68, 0xed, 0x58, 0x69, 0x14, 0x9c, 0x1d, 0x53, 0xef, - 0x0c, 0xbb, 0x59, 0xc9, 0x2c, 0x52, 0xb7, 0xe3, 0x5d, 0xbc, 0xbe, 0xc8, 0x3d, 0xeb, 0xe7, 0x6e, 0xe7, 0x3d, 0xea, 0xc9, 0xe3, 0x43, 0xa7, 0x5e, 0x7b, 0x4b, 0xf0, 0x69, 0xb7, 0x36, 0xe3, 0x48, - 0x33, 0x53, 0xb3, 0xde, 0xb9, 0xe1, 0x1f, 0x23, 0x3b, 0x0f, 0x70, 0xb9, 0xef, 0x53, 0x79, 0xc5, 0xb3, 0x70, 0xef, 0x05, 0x60, 0xe7, 0xee, 0xe5, 0x0e, 0xfc, 0xdc, 0xe3, 0x70, 0x14, 0xb6, 0x19, - 0x4f, 0x81, 0xf3, 0x6e, 0x88, 0x6e, 0xbc, 0x8d, 0x33, 0x52, 0x42, 0xd8, 0x9f, 0x3a, 0xbb, 0x81, 0xda, 0x63, 0x24, 0x41, 0x5e, 0x88, 0x1b, 0x6f, 0xed, 0xac, 0x30, 0xba, 0x07, 0x2e, 0x42, 0xa1, - 0xa4, 0xf6, 0xa5, 0x9d, 0xe4, 0x49, 0xdc, 0xdb, 0x74, 0x47, 0x02, 0x16, 0x2c, 0xc4, 0xfd, 0x72, 0x0f, 0x2f, 0xfc, 0x08, 0xcb, 0x93, 0xda, 0x4c, 0x34, 0x28, 0x13, 0xfc, 0xb4, 0x50, 0x85, 0x03, - 0x6a, 0x14, 0xc7, 0xa1, 0xbb, 0x05, 0x92, 0x47, 0x39, 0x0b, 0xcc, 0xd4, 0x7e, 0x0c, 0x12, 0xfa, 0x02, 0x48, 0x5f, 0xc9, 0x37, 0x93, 0x82, 0xf3, 0x71, 0xa7, 0x21, 0xfa, 0x1c, 0x97, 0x31, 0x25, - 0x09, 0x4b, 0x3a, 0x41, 0x97, 0x91, 0xa2, 0xb1, 0x0e, 0xdf, 0x05, 0x16, 0x60, 0x41, 0x92, 0xce, 0xbc, 0x8b, 0xda, 0x35, 0x98, 0xaa, 0xde, 0xb2, 0x07, 0x4c, 0x90, 0xdd, 0xf0, 0xe0, 0x7a, 0xf3, - 0x58, 0x58, 0xcc, 0xd7, 0xf2, 0x86, 0x93, 0x63, 0x49, 0xf5, 0xcd, 0xc8, 0x03, 0xba, 0x48, 0x2f, 0x83, 0x96, 0xdd, 0x62, 0xbe, 0x98, 0x93, 0x82, 0x4b, 0x8d, 0x12, 0xde, 0x82, 0x0a, 0x20, 0x8d, - 0x88, 0x5e, 0x3b, 0x5c, 0xcc, 0x34, 0x7d, 0xe8, 0x64, 0x39, 0x4e, 0x13, 0x7f, 0x01, 0x93, 0x86, 0xf4, 0x71, 0x22, 0x7f, 0xfc, 0xdf, 0x2c, 0x54, 0xb4, 0xc0, 0x62, 0xd2, 0xb3, 0xf4, 0xa9, 0x0a, - 0x30, 0xe1, 0x2e, 0xac, 0x56, 0x2e, 0x6e, 0xad, 0x23, 0x3b, 0x9d, 0x6e, 0x6c, 0xd7, 0x98, 0xba, 0x3a, 0x30, 0xdc, 0x84, 0x53, 0xcf, 0xf5, 0x36, 0x46, 0xec, 0x53, 0x71, 0xb9, 0x2b, 0xb5, 0x8d, - 0x8c, 0xd3, 0x43, 0x15, 0x25, 0x5d, 0x45, 0xe8, 0x0e, 0x86, 0x65, 0xe6, 0x74, 0x95, 0x29, 0x76, 0x00, 0xa2, 0x81, 0x8b, 0xeb, 0x1a, 0x47, 0x07, 0xb8, 0x2c, 0x0c, 0x01, 0x23, 0x10, 0xdb, 0x61, - 0xd1, 0x0c, 0x48, 0x27, 0x01, 0x6f, 0x86, 0x0f, 0xd7, 0x3a, 0x3c, 0xd3, 0xa9, 0xd8, 0xaf, 0x41, 0xf4, 0xdd, 0x1b, 0xc1, 0xce, 0xb7, 0xcd, 0x1d, 0xac, 0x1d, 0xa0, 0x87, 0x58, 0x39, 0x84, 0x8b, - 0x72, 0xd3, 0x43, 0x0d, 0x57, 0xb3, 0xe6, 0x87, 0x9d, 0x38, 0x43, 0x17, 0x34, 0x5e, 0xd1, 0x46, 0x5f, 0xb6, 0x97, 0x43, 0x3b, 0x3c, 0x50, 0xa2, 0x4e, 0xec, 0x60, 0x02, 0xad, 0xb6, 0xf3, 0x29, - 0x8b, 0x05, 0xfd, 0x61, 0x9f, 0xdd, 0xf5, 0x98, 0x18, 0x80, 0xa0, 0x6d, 0x90, 0xec, 0x86, 0xe5, 0x28, 0xa0, 0x58, 0x70, 0xbf, 0x8d, 0x38, 0xd5, 0xab, 0x0e, 0x7d, 0x63, 0xcd, 0x82, 0xa6, 0xfd, - 0x83, 0x11, 0xfe, 0xf6, 0xf7, 0xff, 0x7e, 0x5a, 0x00, 0x68, 0xa9, 0x43, 0x8f, 0x67, 0xbe, 0xab, 0x81, 0x56, 0xf6, 0x96, 0xe9, 0x6a, 0x68, 0xb8, 0x8f, 0xf8, 0x70, 0xd4, 0xd9, 0xd8, 0xcf, 0xf9, - 0xf0, 0x95, 0xfe, 0x11, 0xf5, 0xf7, 0x93, 0xc6, 0xd0, 0xc7, 0x9e, 0x63, 0x8c, 0xa2, 0x36, 0x1a, 0xf3, 0xe3, 0x1d, 0xaa, 0xd9, 0x78, 0xb8, 0xd1, 0xa6, 0x20, 0xc0, 0x6c, 0x89, 0x11, 0x62, 0x8e, - 0xd9, 0x5a, 0xe9, 0x85, 0x2e, 0xd6, 0x9d, 0x5b, 0xe3, 0x70, 0x8a, 0x5b, 0xb6, 0x33, 0x97, 0x6c, 0x7b, 0x5e, 0xd2, 0x06, 0x18, 0x0f, 0x66, 0x4b, 0x7b, 0x9c, 0x19, 0x3d, 0x7b, 0x1d, 0xe7, 0xc5, - 0xa0, 0x20, 0x93, 0x04, 0xec, 0x2f, 0x4a, 0x61, 0x3b, 0xf0, 0x9d, 0x32, 0x9b, 0x4a, 0xcc, 0xe4, 0xf5, 0xd5, 0xb5, 0x9b, 0xcf, 0xca, 0xd5, 0xfc, 0x04, 0xd0, 0x27, 0xaf, 0x4d, 0x5a, 0x84, 0x9d, - 0x58, 0x4d, 0x55, 0xdf, 0x37, 0xfd, 0xb3, 0x42, 0x85, 0xdf, 0xba, 0x3f, 0x9e, 0xf9, 0xfd, 0x46, 0xfd, 0x94, 0x8f, 0xa7, 0x1f, 0x74, 0x9f, 0x89, 0xd0, 0xaf, 0x32, 0x31, 0x57, 0xf3, 0x33, 0x07, - 0x73, 0x35, 0xef, 0x34, 0x04, 0x9f, 0xb3, 0x6f, 0xb4, 0xf5, 0xb9, 0x71, 0x0f, 0xd2, 0xfd, 0x1c, 0x01, 0x56, 0x36, 0xa9, 0xe9, 0x7a, 0x02, 0x48, 0xf5, 0xc2, 0x18, 0x97, 0x25, 0xdc, 0xd5, 0x91, - 0xd1, 0x2c, 0xa1, 0x97, 0x59, 0x24, 0x4c, 0x63, 0xd8, 0x33, 0xc9, 0xbd, 0x97, 0xa7, 0xe4, 0x18, 0x21, 0x80, 0xf5, 0x66, 0x41, 0x22, 0x3c, 0x63, 0x94, 0x72, 0x37, 0x81, 0x13, 0xa9, 0x1e, 0xad, - 0x59, 0xcb, 0xe1, 0x2d, 0x80, 0x5d, 0x94, 0xe2, 0x78, 0x82, 0x3d, 0x73, 0xcc, 0xfc, 0xd1, 0xb8, 0x56, 0x8f, 0xd7, 0x31, 0x8f, 0x93, 0x55, 0xe2, 0x97, 0x70, 0xad, 0x4e, 0x4b, 0x9a, 0xe7, 0xa3, - 0x4e, 0x43, 0xf0, 0x39, 0xae, 0x14, 0x9d, 0x46, 0x6a, 0x46, 0x94, 0x52, 0xbe, 0xc6, 0x86, 0xa3, 0x8d, 0xd4, 0xe3, 0xd8, 0xa8, 0x8f, 0x22, 0x4e, 0x38, 0x43, 0x78, 0xfc, 0xb0, 0xb3, 0x99, 0x78, - 0x3d, 0xd4, 0x8a, 0x0d, 0x27, 0xc2, 0x78, 0xd9, 0xe7, 0x93, 0x14, 0x41, 0x63, 0x9a, 0x24, 0x4c, 0x70, 0xa8, 0xe8, 0xdb, 0x4c, 0x61, 0xb8, 0xde, 0xb4, 0xc4, 0xa1, 0x5d, 0x6e, 0x20, 0x58, 0xe2, - 0xf4, 0x0f, 0x93, 0x94, 0xa8, 0xe8, 0xfc, 0x17, 0xfc, 0xe4, 0xf7, 0x47, 0x93, 0x4f, 0x43, 0xc7, 0x79, 0xd4, 0x4a, 0xce, 0x5d, 0xe2, 0xae, 0xa3, 0xeb, 0x0f, 0x61, 0x5d, 0x9e, 0x19, 0xe0, 0x4d, - 0x4c, 0xd4, 0x7d, 0xf5, 0x42, 0xbd, 0xd2, 0x23, 0x6e, 0x69, 0x83, 0x9d, 0xab, 0x93, 0x4e, 0x43, 0xf2, 0x39, 0xef, 0xd6, 0xfc, 0x60, 0xb6, 0xca, 0xf2, 0x6a, 0x3d, 0x3c, 0xb0, 0x85, 0x32, 0x47, - 0xa6, 0xc3, 0xf9, 0x42, 0x01, 0x76, 0x73, 0x6e, 0xaf, 0x4c, 0x03, 0x47, 0x00, 0x90, 0x28, 0x0d, 0xb2, 0x9c, 0x2d, 0xc3, 0x8d, 0x7b, 0x88, 0xe8, 0x79, 0xbe, 0x86, 0x93, 0xa4, 0xbb, 0x71, 0x9c, - 0x74, 0x37, 0xc2, 0x66, 0xab, 0x7c, 0x6f, 0x67, 0x00, 0xa2, 0xb8, 0xb2, 0xe4, 0x77, 0x7b, 0x43, 0x32, 0x9c, 0x8d, 0x16, 0x09, 0x58, 0x30, 0x0f, 0xa6, 0xd9, 0xdf, 0xa1, 0xd4, 0xc4, 0x02, 0xbe, - 0x47, 0xe2, 0xdd, 0xc3, 0x88, 0x7c, 0x43, 0xba, 0xaf, 0xe8, 0xe0, 0x6b, 0xd2, 0xef, 0xcb, 0x0d, 0x9d, 0x13, 0xb5, 0xe7, 0xf8, 0xac, 0x66, 0x7a, 0xe9, 0x46, 0x5b, 0x96, 0xa3, 0xc0, 0xc1, 0x5e, - 0x35, 0xa5, 0xc9, 0x8e, 0xc7, 0x40, 0xc9, 0x95, 0xaa, 0x9c, 0x88, 0xe9, 0x55, 0xb7, 0x8f, 0x0a, 0xd6, 0x30, 0x28, 0xd5, 0x8a, 0xca, 0xe7, 0x3e, 0x94, 0xa6, 0x1c, 0x33, 0xc6, 0xa6, 0x3e, 0x8c, - 0x73, 0x0b, 0x09, 0x88, 0x79, 0x77, 0xd0, 0xb3, 0x40, 0x7e, 0x2a, 0x96, 0xbd, 0x9a, 0x01, 0x88, 0x45, 0x2d, 0xf3, 0xfd, 0x69, 0x97, 0x31, 0xc3, 0x67, 0x6e, 0x88, 0xa7, 0x11, 0x9c, 0x66, 0x96, - 0x9f, 0xd7, 0x0f, 0xfe, 0xff, 0xd7, 0x12, 0x7d, 0x6e, 0xbd, 0xb2, 0xdd, 0x4f, 0xb7, 0xb4, 0x11, 0xd3, 0x5b, 0xba, 0x7f, 0xdc, 0xfc, 0xe2, 0x86, 0x72, 0x83, 0xff, 0xf1, 0xa0, 0xed, 0x54, 0x62, - 0x5d, 0xf8, 0xc9, 0x86, 0x67, 0x65, 0x69, 0xdb, 0xdb, 0x30, 0x9e, 0x12, 0xee, 0x88, 0x71, 0x3e, 0xe2, 0xe6, 0xae, 0x1d, 0xe3, 0xb8, 0xbe, 0xca, 0x59, 0x9b, 0x4d, 0x05, 0xc4, 0xe6, 0x16, 0x95, - 0x73, 0x18, 0xe7, 0x11, 0x02, 0x03, 0x70, 0xad, 0xad, 0x98, 0x5c, 0xd8, 0xd2, 0xc8, 0x14, 0x1e, 0x74, 0x2b, 0x2c, 0x61, 0x44, 0x28, 0x15, 0x86, 0x6b, 0x3a, 0xa4, 0x4d, 0x68, 0x30, 0x93, 0xdc, - 0xfe, 0x78, 0xf4, 0x60, 0xc8, 0x7e, 0x8a, 0xce, 0x2d, 0xae, 0xf7, 0x65, 0x14, 0x7a, 0x23, 0x5f, 0x85, 0xe8, 0x8a, 0xfc, 0xa7, 0x09, 0x58, 0x43, 0xf6, 0x39, 0x58, 0xfa, 0x7e, 0x3d, 0x10, 0x57, - 0x99, 0x49, 0x07, 0x84, 0xd0, 0x1d, 0x6a, 0x15, 0x3c, 0x5a, 0x6b, 0x54, 0x4a, 0x08, 0x4b, 0x4c, 0x70, 0x96, 0x39, 0xea, 0xcc, 0x95, 0xe9, 0x6e, 0xd0, 0x8b, 0xa7, 0x1e, 0x4f, 0x49, 0xfd, 0xcd, - 0x42, 0xa0, 0x0b, 0x71, 0x38, 0xed, 0x71, 0x88, 0x8b, 0xd8, 0x4a, 0xac, 0x6f, 0x8c, 0x29, 0x3d, 0x4a, 0xe3, 0x4d, 0x21, 0xb1, 0x0e, 0x47, 0xae, 0xb4, 0x00, 0x76, 0x37, 0xc1, 0x6c, 0xf8, 0xf3, - 0xa8, 0xb7, 0xd3, 0xd7, 0x34, 0x8b, 0x49, 0x6e, 0xf6, 0x38, 0xfe, 0x02, 0x79, 0xc1, 0x31, 0xfb, 0x89, 0x36, 0xd8, 0x79, 0x3f, 0x6c, 0x74, 0x55, 0x0b, 0x5f, 0xad, 0xe7, 0x14, 0x93, 0xe9, 0x68, - 0x91, 0x3a, 0x25, 0x33, 0x9f, 0x26, 0xd5, 0x5c, 0xdf, 0x13, 0xa3, 0x59, 0x12, 0x4c, 0x4c, 0xb7, 0x87, 0xf7, 0xd7, 0x69, 0xc6, 0x08, 0x73, 0x27, 0xf5, 0x07, 0xcb, 0x54, 0x4b, 0x03, 0x19, 0x53, - 0xf8, 0xb9, 0xe7, 0xe1, 0xb2, 0x0f, 0x46, 0x53, 0x86, 0x67, 0x85, 0x2e, 0xb5, 0x59, 0xc8, 0xa3, 0x6a, 0x15, 0x90, 0xd4, 0x7e, 0xc4, 0xd4, 0x58, 0x7f, 0xce, 0x98, 0xbb, 0xbc, 0x36, 0x5f, 0x15, - 0xa8, 0xb3, 0x2e, 0xb9, 0x8b, 0xcf, 0xe7, 0xd0, 0xec, 0x1f, 0x42, 0x74, 0x24, 0x0d, 0x76, 0x9a, 0x7f, 0x9d, 0x0b, 0xad, 0xe7, 0xe8, 0x00, 0xc8, 0xc8, 0xb6, 0x2b, 0x9b, 0x9c, 0xef, 0x23, 0x01, - 0x9f, 0x1c, 0x9c, 0x32, 0x4b, 0xba, 0x2b, 0x35, 0x0d, 0xe6, 0xda, 0xc8, 0xf4, 0x37, 0x73, 0x88, 0x84, 0x38, 0x7e, 0x14, 0xf4, 0x63, 0x2d, 0x1f, 0x32, 0xd1, 0x61, 0x3d, 0x1b, 0xcd, 0x44, 0x0f, - 0xab, 0x6a, 0x4f, 0x13, 0x99, 0x4d, 0x6d, 0x70, 0xd2, 0x62, 0x13, 0x26, 0x85, 0x55, 0xe4, 0x63, 0x0d, 0x9f, 0xf4, 0xe4, 0x85, 0xd2, 0x9b, 0xcd, 0xe8, 0x5e, 0xf5, 0xfd, 0xac, 0xec, 0xf2, 0x7b, - 0xd3, 0x40, 0xf5, 0xdd, 0xda, 0xec, 0x9c, 0x83, 0xe6, 0x3b, 0x86, 0x9a, 0x3f, 0xea, 0x66, 0xc8, 0x6b, 0x6b, 0xcf, 0xdf, 0xbd, 0xa9, 0xc1, 0xea, 0x5e, 0x43, 0x13, 0xd9, 0xd5, 0xc2, 0x5f, 0x3d, - 0xf4, 0x48, 0x7d, 0x44, 0xd6, 0x40, 0x97, 0xe2, 0x11, 0x0a, 0x91, 0x92, 0x20, 0x46, 0x26, 0x78, 0x7f, 0x94, 0x45, 0x51, 0x21, 0xf7, 0x6b, 0x8d, 0x1e, 0x3b, 0xa2, 0x58, 0xb3, 0x7d, 0xd4, 0x5b, - 0x8e, 0x16, 0x3b, 0x22, 0xed, 0xda, 0x59, 0x0d, 0x45, 0x72, 0xb4, 0x4b, 0x46, 0xf2, 0x02, 0x2b, 0xe0, 0x05, 0x6a, 0xf0, 0x5c, 0x04, 0xc5, 0x2c, 0xc7, 0x93, 0xd9, 0x4c, 0xe0, 0x0e, 0x4e, 0xe1, - 0x1f, 0xe2, 0x9f, 0x2f, 0x02, 0xdc, 0x04, 0xd5, 0xdf, 0x37, 0x35, 0xe0, 0x97, 0x3c, 0x20, 0x1f, 0x84, 0x8f, 0x76, 0x86, 0x1a, 0x9b, 0x9d, 0x13, 0xa5, 0xe7, 0xc8, 0x40, 0x2b, 0x4a, 0x9f, 0x44, - 0x15, 0x6d, 0x64, 0x6e, 0xaf, 0x1b, 0x6a, 0xfb, 0x9e, 0x4d, 0xe2, 0x28, 0x9c, 0x0d, 0x10, 0xdd, 0x98, 0x2b, 0x33, 0x57, 0x8e, 0x6c, 0xdd, 0x1a, 0xc9, 0xa6, 0x3c, 0x0c, 0x00, 0xcd, 0xf4, 0x64, - 0xba, 0x0f, 0x6a, 0xa5, 0xab, 0xd5, 0x68, 0xca, 0xa1, 0x84, 0x2b, 0xce, 0xbb, 0x9a, 0xe8, 0x09, 0x60, 0x26, 0xd4, 0x83, 0x4a, 0xee, 0x92, 0x60, 0xc1, 0xe0, 0x01, 0x73, 0x88, 0x7e, 0x61, 0xd6, - 0x74, 0x9b, 0x04, 0xd1, 0x5e, 0x3b, 0x7e, 0x9b, 0x88, 0xf0, 0xc0, 0x69, 0xf0, 0xca, 0x8a, 0xe3, 0xb3, 0xb7, 0x7d, 0x18, 0x31, 0xe7, 0x4c, 0x83, 0xd3, 0x7b, 0x9e, 0x33, 0x22, 0xd1, 0x18, 0x7b, - 0x37, 0xe7, 0x49, 0x76, 0x2d, 0x65, 0x5b, 0x71, 0xe8, 0xed, 0xbb, 0x0b, 0xa9, 0x10, 0x87, 0x59, 0xe5, 0x02, 0x5a, 0x3f, 0x87, 0xdc, 0x2c, 0x61, 0x69, 0x33, 0x02, 0x98, 0xc9, 0x0a, 0xea, 0xe2, - 0x68, 0x9d, 0x8c, 0x20, 0x29, 0x26, 0x19, 0x85, 0x1c, 0xb8, 0x5d, 0x37, 0xb6, 0x07, 0x3d, 0x22, 0xd0, 0xc5, 0x64, 0x80, 0xcd, 0x84, 0xd5, 0xac, 0x5a, 0x82, 0x16, 0x92, 0x12, 0xfb, 0xa5, 0xf3, - 0x0b, 0x76, 0xfa, 0x9d, 0xef, 0xdc, 0xc7, 0x66, 0xea, 0x06, 0x66, 0x98, 0xab, 0x7e, 0xa7, 0xc8, 0xdd, 0x53, 0x18, 0x44, 0xab, 0x14, 0x8f, 0x4c, 0x8f, 0x62, 0xb3, 0x13, 0xa8, 0xa1, 0x6a, 0x9f, - 0xa2, 0x84, 0xbf, 0x3e, 0xf5, 0x4d, 0x40, 0x86, 0x55, 0x84, 0xfa, 0x69, 0x55, 0xba, 0x93, 0x9a, 0x46, 0x47, 0xf3, 0x55, 0x7d, 0xd7, 0xb9, 0xd8, 0x58, 0x8d, 0x0f, 0xfa, 0xe6, 0x76, 0x3f, 0x32, - 0xd4, 0x73, 0x8c, 0x05, 0xf6, 0x06, 0x93, 0x6f, 0xf0, 0x4d, 0x28, 0xe4, 0x29, 0x4c, 0xf2, 0x14, 0x27, 0x89, 0x7e, 0x76, 0x5f, 0x67, 0x66, 0x50, 0xbe, 0x87, 0x31, 0xa3, 0xb7, 0x1e, 0xeb, 0x3c, - 0x7b, 0xff, 0xe6, 0xbf, 0xa1, 0x0d, 0xdd, 0x1f, 0x4e, 0x4a, 0xbe, 0x0d, 0xab, 0x78, 0x27, 0xf1, 0xad, 0xdb, 0x3b, 0x8a, 0xcd, 0x50, 0x8f, 0x7c, 0xdf, 0xd4, 0x73, 0xb7, 0x34, 0xaf, 0x7f, 0xdd, - 0x27, 0xf7, 0xf7, 0xed, 0x8d, 0x8d, 0x1b, 0xfc, 0x0b, 0x57, 0x9e, 0x07, 0x0f, 0x3c, 0x15, 0x89, 0x9b, 0xd4, 0x1d, 0xe8, 0x61, 0xe6, 0x4e, 0xe3, 0x6a, 0x3a, 0x7e, 0x76, 0x93, 0xb0, 0x74, 0x3a, - 0x22, 0xef, 0x7f, 0xfe, 0xf3, 0xf8, 0x85, 0xbb, 0xf3, 0xb5, 0xa6, 0xe5, 0x57, 0x62, 0x17, 0x9e, 0x75, 0xeb, 0xf0, 0xcf, 0x58, 0x96, 0xcb, 0xa5, 0x7f, 0x89, 0x58, 0x96, 0x1f, 0xc9, 0xc3, 0x9f, - 0x11, 0x0e, 0xf7, 0x11, 0xbb, 0xa7, 0x30, 0xfe, 0xc1, 0xba, 0xf8, 0xcb, 0x2b, 0x8f, 0x0a, 0xf9, 0xcb, 0xc5, 0xd6, 0x5a, 0x79, 0x54, 0x49, 0x12, 0xb2, 0x9a, 0xb1, 0x13, 0x0e, 0x76, 0xa8, 0x85, - 0x92, 0x99, 0x3c, 0x87, 0x31, 0xfa, 0x96, 0xae, 0x09, 0x5f, 0x2a, 0x17, 0x91, 0x30, 0x65, 0x8b, 0x22, 0x99, 0x29, 0x4a, 0x24, 0x39, 0xa5, 0xc5, 0xf5, 0x1d, 0xc1, 0x55, 0xe6, 0x22, 0x13, 0x55, - 0x00, 0xde, 0xf7, 0xd1, 0x79, 0x7e, 0xd8, 0x8f, 0x61, 0x97, 0x4d, 0x09, 0x79, 0xa3, 0x54, 0xdb, 0xbc, 0x8f, 0x1e, 0x14, 0xd1, 0x73, 0xf4, 0x5f, 0xd5, 0xca, 0x9f, 0x7d, 0x08, 0xcd, 0x58, 0x8a, - 0xfe, 0xba, 0x0a, 0xbe, 0xf3, 0x54, 0x73, 0xe5, 0x67, 0x77, 0x5f, 0xae, 0x5c, 0x14, 0xf4, 0xa3, 0x9c, 0xce, 0x4e, 0xf3, 0x8b, 0x3e, 0xf4, 0xc3, 0x9d, 0x3b, 0x3e, 0x14, 0xee, 0x03, 0x65, 0xf9, - 0x3f, 0x5a, 0xdf, 0x7e, 0x28, 0xd0, 0x17, 0xcd, 0xe0, 0x77, 0xed, 0xfc, 0x8f, 0xed, 0x73, 0xa7, 0xd7, 0x80, 0x9d, 0xf3, 0x41, 0xeb, 0xbe, 0x65, 0x78, 0xb0, 0x32, 0x72, 0x40, 0x4c, 0x9c, 0x98, - 0x7d, 0x66, 0xaa, 0x21, 0x16, 0x28, 0x7a, 0x8b, 0x8a, 0x0f, 0xd8, 0x5e, 0xaa, 0x57, 0x3a, 0xb2, 0x8e, 0xd2, 0xf5, 0x7c, 0xe1, 0xd3, 0x94, 0x3c, 0x93, 0x14, 0x7f, 0x0b, 0x4f, 0x62, 0x69, 0x95, - 0x69, 0x1b, 0xd2, 0x44, 0x15, 0xc5, 0x88, 0x1d, 0x6b, 0x51, 0x21, 0x5d, 0x55, 0x1a, 0xc8, 0xcb, 0x59, 0x31, 0xa4, 0xa9, 0xaa, 0xbb, 0xc1, 0xb3, 0x65, 0x97, 0xfc, 0xd5, 0xbe, 0xf5, 0x5f, 0xb5, - 0xcf, 0x7c, 0x36, 0x8f, 0xff, 0x55, 0xbb, 0xc2, 0x7f, 0x4f, 0x5b, 0xf2, 0xdc, 0x45, 0xfe, 0x34, 0x22, 0xdf, 0x2f, 0xfd, 0x8b, 0x1a, 0x91, 0xf7, 0x04, 0xe1, 0x4f, 0xeb, 0xf1, 0x2e, 0x54, 0x9f, - 0x07, 0xdf, 0x7f, 0xac, 0x12, 0xbb, 0x79, 0x1b, 0xd8, 0xb9, 0x3d, 0x6f, 0xad, 0xd2, 0xba, 0xc0, 0x7a, 0x3b, 0x1e, 0xb2, 0x61, 0xc1, 0x74, 0x57, 0xf9, 0x76, 0x9a, 0xd0, 0x8e, 0xbe, 0x2c, 0x78, - 0xd2, 0x28, 0x48, 0xdc, 0x3a, 0x30, 0x4b, 0xf0, 0x10, 0x33, 0x94, 0x8e, 0xdb, 0xe4, 0xd2, 0xa8, 0xc8, 0x78, 0x38, 0xc5, 0x66, 0xac, 0xa4, 0x99, 0x1c, 0x4a, 0x99, 0xe3, 0xb9, 0x55, 0x8f, 0x0e, - 0x06, 0xc3, 0x29, 0x6c, 0x24, 0xd8, 0x9e, 0x1f, 0xed, 0x97, 0xbd, 0x1e, 0x0a, 0x60, 0x3e, 0x58, 0x67, 0xbf, 0xea, 0x4d, 0xfb, 0x05, 0xe5, 0x54, 0xba, 0x99, 0x9b, 0x47, 0x69, 0x67, 0x67, 0x1e, - 0xae, 0x1f, 0xfa, 0x59, 0xc7, 0xfc, 0x1b, 0xf5, 0x06, 0x5f, 0x46, 0xea, 0xa3, 0x1e, 0x42, 0xdf, 0xf5, 0x10, 0x7c, 0x6c, 0xb8, 0xa3, 0xcb, 0xfe, 0x09, 0x8a, 0xe8, 0x47, 0xa2, 0x79, 0x01, 0xf1, - 0x1f, 0x2b, 0x92, 0x27, 0x5b, 0xff, 0xbc, 0x6e, 0xdc, 0x5a, 0x04, 0xf3, 0x9d, 0x22, 0xd3, 0x36, 0x2b, 0x4e, 0x8c, 0xd2, 0xca, 0xa8, 0x29, 0x46, 0x4e, 0xd5, 0x64, 0x1f, 0x79, 0x13, 0xb6, 0x0f, - 0x04, 0x23, 0x39, 0x10, 0x6a, 0xa3, 0x26, 0x53, 0xa0, 0x00, 0x64, 0x1c, 0xf3, 0xd1, 0x21, 0xbb, 0x93, 0xe2, 0xbe, 0x26, 0xc2, 0xe3, 0x18, 0xd5, 0x67, 0x49, 0xd2, 0x93, 0xbb, 0x25, 0x2f, 0x33, - 0x74, 0x0f, 0xb6, 0xdc, 0x3c, 0x1b, 0x39, 0x01, 0x79, 0x98, 0x41, 0xe5, 0xbe, 0xfb, 0x6c, 0x3c, 0xff, 0x57, 0xe4, 0xff, 0x27, 0x9b, 0xed, 0x3f, 0x41, 0x16, 0xae, 0xdf, 0x78, 0x1b, 0x4f, 0x70, - 0x5e, 0xb7, 0x6d, 0x2b, 0x23, 0x3b, 0x9a, 0x75, 0xf3, 0x29, 0xa8, 0x1d, 0x40, 0x6e, 0x42, 0xda, 0x14, 0xb3, 0x9d, 0x4a, 0xa4, 0x3a, 0x89, 0x7b, 0x95, 0xbf, 0xa0, 0x8c, 0x28, 0x73, 0xac, 0x75, - 0x4d, 0x19, 0x24, 0xec, 0x75, 0xc9, 0x10, 0xdf, 0xc9, 0x2a, 0xae, 0xab, 0xdc, 0xba, 0xdc, 0x42, 0x8b, 0xb2, 0x2f, 0xf7, 0xd5, 0x70, 0x0a, 0xf6, 0x13, 0x7a, 0x1c, 0xf5, 0x66, 0x66, 0x49, 0x6d, - 0x74, 0x30, 0x10, 0x89, 0xe9, 0xb4, 0xda, 0x3c, 0x5a, 0x8b, 0xfc, 0x27, 0x0e, 0x53, 0x57, 0x0f, 0x7d, 0xe3, 0x5d, 0xb6, 0xfd, 0x48, 0xd3, 0x4e, 0x21, 0x71, 0xf0, 0x17, 0x5f, 0xb2, 0x9b, 0x75, - 0x8e, 0xed, 0xbf, 0x5f, 0x3c, 0x9c, 0x37, 0x8d, 0x7f, 0x7a, 0x8b, 0xff, 0x8b, 0x98, 0xd7, 0x5f, 0x7b, 0xc7, 0x9f, 0x96, 0xf6, 0xfb, 0xa5, 0x7f, 0x51, 0x4b, 0xfb, 0x89, 0x4c, 0xfc, 0x69, 0x74, - 0xdf, 0x45, 0xed, 0xd3, 0x48, 0xfa, 0x8f, 0x55, 0x6a, 0xd7, 0x2f, 0x03, 0x3b, 0x37, 0xa7, 0xad, 0x55, 0x19, 0x16, 0xed, 0xe1, 0xcc, 0x0b, 0x86, 0xdc, 0x68, 0xef, 0xf5, 0x59, 0x3a, 0xe4, 0x99, - 0x7c, 0x3d, 0x18, 0x38, 0xfd, 0x74, 0x93, 0x4f, 0x7a, 0x70, 0x5f, 0x87, 0x32, 0x3a, 0x2e, 0x6a, 0xc8, 0x4a, 0x2c, 0x74, 0x0e, 0xd8, 0xe8, 0x78, 0x30, 0x3c, 0x48, 0xfb, 0xbd, 0x36, 0x80, 0x08, - 0xed, 0x50, 0x41, 0x83, 0x45, 0x36, 0x0f, 0x43, 0x2d, 0xc1, 0x30, 0x7d, 0xe2, 0x96, 0x1c, 0x39, 0xc9, 0x60, 0x10, 0xca, 0x88, 0x5f, 0x0d, 0x01, 0x6b, 0xab, 0xca, 0xce, 0x6e, 0xce, 0xcf, 0xea, - 0xeb, 0x35, 0x6f, 0xe7, 0x7f, 0x6f, 0x2b, 0x4b, 0xd5, 0xb4, 0xd4, 0x7c, 0x94, 0x89, 0x05, 0xbf, 0x94, 0xf5, 0x78, 0x22, 0x09, 0x76, 0xce, 0x07, 0x4d, 0x21, 0x92, 0x16, 0xc3, 0x74, 0x18, 0x9a, - 0x5d, 0x70, 0xe4, 0x8a, 0xa0, 0x53, 0x8f, 0x9c, 0x2d, 0x11, 0x1b, 0x6c, 0xa8, 0xd1, 0x79, 0x4d, 0xb2, 0xde, 0x5c, 0x9a, 0xa4, 0x5b, 0x08, 0x9a, 0x83, 0x75, 0x39, 0x5f, 0x06, 0x78, 0x2c, 0x0c, - 0x76, 0x3e, 0xb1, 0x2f, 0x86, 0xe9, 0x30, 0xdc, 0x84, 0xe0, 0x2a, 0x97, 0x66, 0x33, 0x6b, 0x96, 0xf7, 0x2c, 0xa5, 0x0b, 0xc2, 0x8b, 0xdc, 0x74, 0x76, 0x59, 0x2d, 0x77, 0x13, 0x5d, 0x72, 0x5d, - 0xe8, 0xc7, 0x41, 0x48, 0xaa, 0x16, 0xa5, 0x4d, 0x55, 0xbf, 0x3c, 0x3d, 0x82, 0xfb, 0x38, 0x3b, 0xe4, 0x95, 0xb0, 0xbf, 0xcf, 0xc4, 0x1b, 0x8c, 0x6e, 0x2f, 0xb5, 0x29, 0x60, 0x72, 0x44, 0xcb, - 0xa1, 0x7c, 0x91, 0xca, 0x55, 0x5d, 0xd9, 0x86, 0x0b, 0xb4, 0x9c, 0x89, 0x92, 0xed, 0x6a, 0x1e, 0x90, 0x0b, 0x2c, 0x37, 0xc2, 0x41, 0xc0, 0x87, 0x88, 0x5e, 0x81, 0xcc, 0xf5, 0xd4, 0x2d, 0xc1, - 0x61, 0x60, 0xe6, 0x90, 0xa9, 0x7a, 0x98, 0x54, 0xad, 0x39, 0x0c, 0xce, 0x84, 0x6e, 0x15, 0x72, 0xac, 0x2b, 0x66, 0x7d, 0x0f, 0xee, 0x26, 0x90, 0x91, 0xd6, 0xc6, 0xda, 0x30, 0x7b, 0x5c, 0x5e, - 0xb5, 0xcd, 0x6c, 0x38, 0xd5, 0xe6, 0xcc, 0xd5, 0xd4, 0x36, 0xf3, 0x4e, 0xe6, 0xb8, 0xc1, 0xef, 0x5f, 0xf3, 0x1a, 0xda, 0x75, 0x9e, 0xa3, 0x46, 0xc3, 0x5b, 0x49, 0x69, 0x96, 0xa7, 0xaa, 0x9e, - 0x77, 0xfc, 0xc8, 0xb6, 0x6f, 0xfb, 0xce, 0xe7, 0x18, 0xfa, 0x57, 0xe4, 0xf5, 0x96, 0x78, 0xc3, 0x95, 0xdb, 0x4b, 0x4d, 0x30, 0x7d, 0x0b, 0x19, 0x46, 0x68, 0x6f, 0x21, 0x29, 0x7b, 0x69, 0x5e, - 0x3a, 0xa6, 0x50, 0x0e, 0x35, 0x3a, 0xf3, 0x07, 0xcb, 0xad, 0x20, 0xef, 0x52, 0x60, 0xe9, 0xcd, 0x73, 0x21, 0x4c, 0xa7, 0x73, 0x14, 0xb5, 0x80, 0xd5, 0x68, 0x3d, 0xad, 0xcd, 0x5a, 0x8c, 0x15, - 0x3d, 0x59, 0xd9, 0xa4, 0xa7, 0xa2, 0x53, 0xcc, 0xa0, 0x37, 0x41, 0x5d, 0xdb, 0x95, 0x04, 0xa8, 0x10, 0xd2, 0xf5, 0x16, 0x7b, 0x7c, 0xce, 0xb8, 0xe8, 0xb8, 0x70, 0xbf, 0x4f, 0x66, 0x52, 0xf5, - 0x28, 0x7d, 0x14, 0x6b, 0x43, 0xbe, 0x14, 0x12, 0xd6, 0x50, 0x3c, 0x82, 0x70, 0xfc, 0xdf, 0x21, 0xdb, 0x45, 0x7a, 0x85, 0xe2, 0x21, 0x86, 0x22, 0x18, 0x0c, 0x66, 0x86, 0x26, 0x09, 0xf0, 0x5c, - 0x20, 0x76, 0xdc, 0xae, 0x5a, 0xa6, 0x81, 0xad, 0x40, 0xbc, 0x04, 0x7a, 0x0c, 0x13, 0xcf, 0xdc, 0x4a, 0x93, 0xbd, 0x61, 0xb4, 0x98, 0x61, 0x86, 0x4f, 0x3b, 0xc9, 0x38, 0x8f, 0xc4, 0x82, 0x09, - 0xfb, 0xc2, 0xa4, 0xb6, 0xa5, 0x55, 0x65, 0x43, 0xca, 0xda, 0x65, 0x22, 0xf1, 0x40, 0x2c, 0xf7, 0xbc, 0xa9, 0x89, 0x2b, 0x87, 0x7a, 0x36, 0xb5, 0xd1, 0x6e, 0xa2, 0x8c, 0x7e, 0xfb, 0xed, 0xf7, - 0x0b, 0x18, 0xc7, 0x96, 0x33, 0x32, 0x3f, 0x15, 0x48, 0xe8, 0x0d, 0x6b, 0x95, 0x9e, 0x73, 0x42, 0xc7, 0xcb, 0xf6, 0x0f, 0xb0, 0xc7, 0x5f, 0x32, 0x70, 0xdf, 0xa9, 0xbe, 0xe3, 0xef, 0x65, 0xfb, - 0x0e, 0xde, 0xce, 0xd0, 0x9d, 0x40, 0xf3, 0x3c, 0x00, 0x31, 0x52, 0x98, 0x58, 0xe2, 0x22, 0x9e, 0x89, 0xc8, 0x18, 0x8c, 0x46, 0x33, 0x10, 0x15, 0xb7, 0xee, 0x84, 0x18, 0x54, 0x6b, 0xc0, 0x1c, - 0x6b, 0xa3, 0xa9, 0x93, 0x19, 0x7b, 0x07, 0x59, 0x4b, 0x53, 0xc3, 0x07, 0x50, 0x28, 0xa2, 0xd4, 0xa1, 0x21, 0x69, 0x01, 0x3e, 0xd6, 0x2c, 0x2b, 0x1e, 0x0c, 0x7a, 0x36, 0x68, 0x03, 0xb5, 0x0b, - 0xf7, 0x01, 0xaf, 0x1c, 0x3b, 0x2a, 0xfe, 0x34, 0x2c, 0xfb, 0xfb, 0x05, 0x84, 0x77, 0x86, 0x7c, 0x5e, 0x35, 0x68, 0x8e, 0xa8, 0x96, 0xa9, 0x50, 0x8f, 0x73, 0x85, 0x9b, 0x02, 0x33, 0x3f, 0x4f, - 0xef, 0xf8, 0xc8, 0x15, 0x3e, 0x11, 0x78, 0x8e, 0xad, 0x87, 0x5a, 0xab, 0xa9, 0x5d, 0x4a, 0x11, 0x8e, 0x90, 0x6a, 0x78, 0xd8, 0x1e, 0xc6, 0xc2, 0x50, 0xda, 0x8e, 0xb5, 0x21, 0x50, 0x86, 0xa1, - 0xb8, 0x2d, 0xfb, 0x50, 0x80, 0x07, 0xc1, 0x4e, 0x87, 0xa5, 0x09, 0x10, 0xee, 0x7b, 0x71, 0xbc, 0x63, 0xa6, 0xfc, 0x68, 0x0a, 0xa9, 0x0a, 0x66, 0x68, 0xfe, 0x8a, 0x99, 0x45, 0xc3, 0xa5, 0xe3, - 0x04, 0xc0, 0xae, 0xee, 0x63, 0x8a, 0x7c, 0xd8, 0xd1, 0x11, 0x6f, 0x63, 0xcf, 0xb0, 0xfd, 0xc5, 0xf4, 0xe1, 0xeb, 0x0c, 0x34, 0x55, 0xf3, 0xcd, 0x4f, 0x89, 0x68, 0x77, 0x8a, 0x42, 0x3e, 0x48, - 0x37, 0xbe, 0x2d, 0x6b, 0xf4, 0xdf, 0x22, 0x8b, 0xf8, 0x36, 0xaf, 0xfd, 0xd1, 0x84, 0xe3, 0x85, 0x0e, 0xfa, 0x41, 0xf7, 0x2c, 0x41, 0xe7, 0xb3, 0x66, 0x0a, 0xd2, 0xa2, 0x93, 0xae, 0xf7, 0xd0, - 0x64, 0x8f, 0x23, 0xce, 0xbe, 0x4f, 0x32, 0x30, 0xe5, 0xec, 0xf8, 0xbe, 0x6d, 0x6f, 0xfd, 0xbe, 0x6b, 0x25, 0x6b, 0x25, 0xdf, 0xaa, 0x0b, 0x3b, 0x2a, 0xc6, 0x51, 0x0a, 0xac, 0x79, 0x63, 0x1e, - 0x8a, 0x87, 0xfe, 0x04, 0x46, 0x4b, 0xbb, 0xbf, 0x3e, 0xac, 0x66, 0x45, 0x4c, 0x2e, 0x23, 0xd3, 0x8c, 0xa6, 0x7c, 0x96, 0x62, 0x3b, 0x0b, 0x77, 0x08, 0x43, 0x58, 0xc3, 0xf0, 0x08, 0xc6, 0x79, - 0xb9, 0x65, 0xd2, 0xf9, 0x47, 0x19, 0x80, 0x56, 0xeb, 0x76, 0xbf, 0xf4, 0xf0, 0xd7, 0x59, 0xe8, 0x6d, 0x2f, 0x6e, 0x2e, 0xfd, 0xc2, 0xd4, 0xf3, 0x9a, 0x11, 0x2d, 0x07, 0x8b, 0x4f, 0xd5, 0x0f, - 0x7e, 0xc0, 0xf2, 0x8f, 0xc2, 0x02, 0x70, 0x1b, 0xe3, 0xac, 0x1a, 0xda, 0x71, 0x6a, 0x30, 0x25, 0xaf, 0xfa, 0x0c, 0x44, 0xd7, 0xf9, 0xa6, 0x74, 0x73, 0x16, 0x71, 0x18, 0x08, 0xdb, 0x5a, 0x56, - 0xaf, 0xcc, 0x33, 0x39, 0xec, 0xa2, 0x63, 0x6d, 0xb8, 0xd9, 0x4e, 0x7b, 0x39, 0x23, 0x0b, 0xd8, 0xde, 0x80, 0xc9, 0x80, 0x61, 0x14, 0x71, 0x2f, 0x0b, 0xa3, 0xdc, 0xa5, 0x2b, 0xa5, 0x1c, 0x2f, - 0xf5, 0x75, 0x44, 0xcd, 0x46, 0xa5, 0xc8, 0x8b, 0x24, 0x9c, 0x1a, 0x71, 0x4b, 0xe3, 0xac, 0xd5, 0xc8, 0xf0, 0x2f, 0x59, 0x58, 0xe0, 0xa1, 0xc4, 0xfc, 0x59, 0x4e, 0xa0, 0x55, 0x39, 0x81, 0xa6, - 0x2e, 0x6a, 0xe3, 0x41, 0x7a, 0xec, 0xa2, 0x78, 0x69, 0x48, 0xfd, 0xa0, 0x7b, 0xa9, 0xef, 0x7b, 0x3a, 0xeb, 0x60, 0xed, 0x86, 0xd4, 0x71, 0xb4, 0x81, 0xd4, 0x78, 0xa8, 0x71, 0xaa, 0x3c, 0xa6, - 0x67, 0x3e, 0x71, 0x18, 0x00, 0x31, 0x31, 0xee, 0x0d, 0xb6, 0x0a, 0x41, 0x10, 0xa0, 0xe3, 0x30, 0xc3, 0xc9, 0x0c, 0xcf, 0xbb, 0xe2, 0xc0, 0xd3, 0xc6, 0xe2, 0x44, 0x96, 0x41, 0x9b, 0xe2, 0x67, - 0xda, 0x80, 0xd5, 0x4a, 0x2b, 0xb5, 0x27, 0x9b, 0x72, 0x04, 0x8b, 0xb1, 0x12, 0xfb, 0x73, 0x21, 0xac, 0x46, 0x51, 0xb7, 0xeb, 0x6f, 0xc0, 0x5e, 0x2f, 0x78, 0x66, 0x7b, 0x3e, 0x9b, 0xd7, 0xb4, - 0x11, 0xc8, 0xe3, 0xa7, 0x9e, 0x8a, 0xc9, 0x3e, 0x46, 0x14, 0x7d, 0xc1, 0x2b, 0x76, 0x4d, 0xf8, 0x02, 0xe9, 0xf9, 0xb4, 0x71, 0x9a, 0xb6, 0xf0, 0x94, 0xd9, 0x93, 0x8d, 0x87, 0xf7, 0xa6, 0xe9, - 0x64, 0x2d, 0x4e, 0xb3, 0xed, 0xb0, 0xeb, 0xf9, 0xd2, 0x22, 0x58, 0x80, 0xfb, 0x89, 0x5f, 0xec, 0xb9, 0x15, 0xa0, 0x74, 0xc5, 0x7e, 0x35, 0x1b, 0xd9, 0x8c, 0xc5, 0xc3, 0x60, 0x51, 0xcd, 0x79, - 0xa6, 0xa8, 0x57, 0xab, 0xd0, 0xc1, 0x83, 0x4a, 0x32, 0x00, 0xa1, 0xa0, 0x15, 0xbd, 0x5a, 0x8e, 0x78, 0x2d, 0xc9, 0xb2, 0xd9, 0x7a, 0x11, 0xc0, 0x7e, 0x1f, 0x87, 0x45, 0xf5, 0x75, 0xa7, 0x69, - 0xfe, 0xa9, 0x4e, 0x17, 0x72, 0x5d, 0x90, 0xb5, 0x2d, 0x4f, 0xfe, 0x79, 0x95, 0x8a, 0x6e, 0x18, 0x72, 0xd3, 0x72, 0xfd, 0x61, 0xf7, 0x04, 0xe0, 0xfc, 0xa9, 0x3f, 0x95, 0x80, 0x77, 0xb2, 0xe7, - 0xf5, 0xaa, 0xe6, 0xb8, 0x73, 0x22, 0xf6, 0x9c, 0xf9, 0x39, 0x94, 0xd6, 0x74, 0x42, 0x91, 0x01, 0x6a, 0xad, 0x74, 0xa3, 0xe0, 0x58, 0x79, 0xe0, 0x4c, 0x82, 0xc3, 0x61, 0x03, 0x74, 0xcd, 0x88, - 0x58, 0x8b, 0x9e, 0x52, 0x5a, 0x38, 0xdc, 0x57, 0x41, 0x1e, 0x12, 0x49, 0x40, 0x42, 0x49, 0x6c, 0x1c, 0xc3, 0xaa, 0xec, 0x1e, 0x64, 0x1f, 0x1a, 0x4e, 0xf6, 0x31, 0xc5, 0x83, 0x42, 0x5f, 0x5a, - 0x71, 0x4b, 0xb6, 0x0c, 0x76, 0x87, 0xb9, 0x5d, 0x6e, 0x80, 0xcd, 0x23, 0x37, 0x69, 0x5b, 0xe6, 0xc1, 0x6d, 0x57, 0x61, 0xfe, 0x41, 0xdc, 0x6b, 0xf2, 0x17, 0x1e, 0xce, 0xf5, 0x5e, 0xf2, 0x3b, - 0xbc, 0x93, 0xbd, 0xf4, 0xd1, 0xe6, 0xa4, 0x83, 0xb7, 0xf3, 0x35, 0x24, 0xc5, 0x58, 0xdc, 0xf8, 0xd2, 0x52, 0x1e, 0x4e, 0x91, 0x29, 0xd7, 0x5d, 0xca, 0x9b, 0x88, 0x5a, 0x55, 0xd9, 0x16, 0xcb, - 0x22, 0x35, 0x74, 0xec, 0x88, 0x98, 0xce, 0x96, 0x01, 0x85, 0xf5, 0xe1, 0x29, 0xad, 0xf7, 0xa9, 0x0c, 0x15, 0xa0, 0x2a, 0x36, 0xdc, 0x45, 0x7d, 0x58, 0x74, 0x6b, 0x50, 0x51, 0xc6, 0xbc, 0xcf, - 0xaf, 0x4b, 0x94, 0x4c, 0x04, 0x41, 0xeb, 0xc6, 0xc6, 0xd8, 0xe7, 0xe5, 0xfe, 0x64, 0xf0, 0xac, 0x87, 0xb6, 0xee, 0x61, 0x4f, 0xd0, 0xfc, 0xb6, 0x4c, 0x3c, 0xf6, 0x52, 0x39, 0x9a, 0xc7, 0x65, - 0xe2, 0xb1, 0x76, 0x95, 0x68, 0x6a, 0x8d, 0xee, 0xa6, 0xcc, 0xb8, 0x27, 0xc1, 0xa9, 0xe6, 0xb9, 0x2b, 0x56, 0x43, 0x9c, 0x64, 0x32, 0xe0, 0x66, 0xdb, 0xe9, 0xde, 0xce, 0x77, 0xd4, 0x4c, 0x5e, - 0xec, 0x15, 0x74, 0xa4, 0x54, 0x2c, 0x3a, 0x20, 0x66, 0xf9, 0x5e, 0xdb, 0x28, 0x22, 0x13, 0x86, 0x4b, 0x17, 0x9e, 0xee, 0xf6, 0xc0, 0x88, 0x8d, 0x1c, 0x63, 0xee, 0x0f, 0x62, 0x04, 0x41, 0xaa, - 0x55, 0x6f, 0x3a, 0x72, 0x4c, 0x65, 0x2c, 0x2e, 0xfb, 0xaf, 0x4f, 0xf1, 0xbe, 0x96, 0x89, 0x3f, 0xb9, 0xb7, 0xbe, 0xf4, 0x82, 0xd6, 0x3c, 0x79, 0xb5, 0xdf, 0x9c, 0x8a, 0xba, 0x5f, 0x21, 0xfa, - 0x7f, 0x9e, 0x7b, 0xd2, 0x5f, 0xe0, 0x56, 0xfc, 0x3e, 0x5c, 0xea, 0xa7, 0xde, 0x63, 0x36, 0xfa, 0xd2, 0xba, 0xcf, 0x85, 0x68, 0xc3, 0xe9, 0xd3, 0x61, 0x53, 0x43, 0xaf, 0x85, 0x66, 0x9b, 0x63, - 0xa8, 0x39, 0xb7, 0x84, 0xde, 0xa8, 0x88, 0x77, 0x76, 0xc1, 0xc9, 0x07, 0x3d, 0xd5, 0xb1, 0x64, 0xdc, 0xdd, 0xd5, 0x94, 0xe2, 0x16, 0x82, 0xec, 0x7a, 0x6a, 0x5f, 0xaa, 0x36, 0xa4, 0xc4, 0xe5, - 0xd0, 0x16, 0x1c, 0xce, 0x26, 0x64, 0x09, 0xa9, 0x2a, 0x95, 0x6e, 0x29, 0x98, 0xd8, 0xaf, 0x3d, 0x85, 0x4c, 0xc7, 0x46, 0x0f, 0xdf, 0x18, 0xbc, 0x1e, 0xaf, 0x06, 0xd2, 0x84, 0x4f, 0x80, 0x45, - 0xb9, 0x7e, 0x9d, 0xcd, 0xd7, 0x09, 0x96, 0xf9, 0x47, 0x91, 0xd9, 0x1b, 0x23, 0x3c, 0x76, 0xf5, 0xe8, 0xa3, 0x06, 0xed, 0xa9, 0x52, 0xc8, 0x4f, 0xc5, 0xa0, 0x55, 0x61, 0x06, 0x35, 0xd5, 0x9d, - 0xc3, 0x1f, 0x6a, 0xfa, 0x36, 0x14, 0x8f, 0x5c, 0x3a, 0xfe, 0x6f, 0x6b, 0xdc, 0x6e, 0x6c, 0xa0, 0xbb, 0xa8, 0x18, 0x1b, 0x84, 0x62, 0x14, 0xc9, 0xcd, 0x89, 0x31, 0xe4, 0xe7, 0xd2, 0x3c, 0x5c, - 0x6d, 0x26, 0x2c, 0x54, 0xa1, 0xac, 0xc5, 0x85, 0x03, 0xc9, 0x72, 0xf5, 0xa8, 0xce, 0x7a, 0x76, 0x56, 0x26, 0xc8, 0xc6, 0x0c, 0xe7, 0xe3, 0x04, 0xe4, 0xb7, 0x71, 0x5d, 0x8b, 0x60, 0x49, 0xd5, - 0xa9, 0x70, 0x18, 0x87, 0x04, 0x9b, 0xa1, 0xdd, 0x55, 0x0f, 0x1b, 0x8f, 0xd8, 0x6a, 0x60, 0x25, 0xdf, 0x67, 0xdc, 0xaa, 0xe9, 0xe3, 0x95, 0xea, 0x57, 0x14, 0xb0, 0x9a, 0x36, 0x7e, 0xe4, 0xd4, - 0x6e, 0x8c, 0xd8, 0x16, 0x3a, 0x17, 0xa7, 0x96, 0x5d, 0x91, 0x4d, 0x86, 0xd0, 0x66, 0x8f, 0x90, 0xdb, 0x6a, 0xbe, 0xcc, 0xbb, 0xd6, 0x78, 0xef, 0x96, 0xde, 0xd6, 0xc7, 0x50, 0x64, 0xcb, 0x54, - 0x16, 0xcb, 0x5b, 0x0a, 0x40, 0xc2, 0x8b, 0x5e, 0x22, 0xa7, 0x8a, 0x69, 0x91, 0xd3, 0x74, 0x22, 0x2a, 0xe8, 0x94, 0x9b, 0x0a, 0x15, 0xb3, 0xc4, 0x06, 0xd3, 0x19, 0x1d, 0xfb, 0x73, 0x1c, 0x45, - 0x95, 0x3d, 0xd5, 0xc5, 0x97, 0xa6, 0xc0, 0x70, 0xe5, 0x8f, 0xf3, 0xd4, 0xd5, 0xd4, 0x6e, 0x42, 0x25, 0xbf, 0x91, 0x01, 0xf8, 0x15, 0x21, 0x38, 0x51, 0x3d, 0x21, 0xd2, 0x1c, 0x76, 0x4e, 0xa4, - 0x9e, 0xe3, 0x12, 0xe1, 0x8b, 0xe8, 0x40, 0xe4, 0xb3, 0x21, 0xb6, 0x9c, 0x82, 0x03, 0x61, 0xc7, 0xf4, 0x66, 0xc4, 0xa2, 0xf6, 0x5c, 0x75, 0xa7, 0x2c, 0x11, 0x7c, 0x31, 0xdd, 0x0e, 0x52, 0x9d, - 0xcf, 0xf3, 0x71, 0xa2, 0x19, 0x06, 0x45, 0xaf, 0xd3, 0xb0, 0x07, 0x58, 0xc3, 0x1a, 0x27, 0xdd, 0x19, 0x3e, 0xd7, 0x20, 0x22, 0x2e, 0xe9, 0x61, 0xe9, 0xe3, 0xb6, 0x08, 0xd1, 0x18, 0x65, 0x8c, - 0xfd, 0xcc, 0xdf, 0x94, 0x91, 0xf4, 0x7a, 0x77, 0xcd, 0xe2, 0xd4, 0x0d, 0x73, 0xeb, 0x3c, 0xd5, 0xfd, 0x3b, 0xdc, 0x4c, 0x83, 0xdb, 0x74, 0xac, 0x54, 0x3d, 0x74, 0x8a, 0xf0, 0x84, 0xe3, 0x23, - 0x77, 0xd4, 0x2b, 0xc8, 0xbe, 0xd3, 0x6d, 0xc0, 0x7d, 0x3f, 0x6b, 0xdc, 0x51, 0x2d, 0xe0, 0xe5, 0x86, 0x87, 0x7d, 0x24, 0x48, 0x5b, 0xf9, 0xc0, 0xf0, 0x44, 0x96, 0xcb, 0x26, 0xd1, 0x1f, 0xdb, - 0xa1, 0x81, 0xf5, 0x23, 0xb3, 0xea, 0x8d, 0xc8, 0x9a, 0x37, 0xac, 0x44, 0x00, 0x76, 0x43, 0x2f, 0xf4, 0x95, 0x80, 0x66, 0x6b, 0x50, 0x5f, 0xe0, 0xb1, 0x45, 0xa5, 0xa0, 0xbe, 0xc0, 0xd6, 0x09, - 0x01, 0x65, 0x53, 0x30, 0x86, 0x46, 0x3b, 0xdd, 0x93, 0xfb, 0xfd, 0x79, 0xb5, 0x44, 0x87, 0x83, 0x74, 0x74, 0xf8, 0x45, 0x53, 0xaf, 0xdd, 0x48, 0x95, 0x9e, 0xfc, 0x98, 0x0f, 0xc5, 0xf4, 0x15, - 0x2c, 0x5d, 0xeb, 0x34, 0x56, 0x1d, 0x0f, 0x4e, 0x12, 0xfa, 0x1c, 0x41, 0x94, 0xd9, 0xd6, 0xe6, 0xbe, 0xcb, 0x77, 0x07, 0x43, 0xd1, 0x63, 0x86, 0xfc, 0xf0, 0xe0, 0x12, 0x20, 0x0a, 0xeb, 0xd4, - 0x70, 0xac, 0xd9, 0x1a, 0x94, 0x0c, 0x0f, 0xe9, 0x1e, 0xe7, 0xd6, 0xfb, 0xb9, 0x01, 0xa9, 0x4c, 0xe5, 0x60, 0x3a, 0x8d, 0x6c, 0x3d, 0x5e, 0x43, 0x36, 0x56, 0x57, 0x2e, 0xa2, 0xc8, 0x4e, 0xf9, - 0xd4, 0x17, 0xba, 0xba, 0x94, 0x84, 0x34, 0x9e, 0x8e, 0xf0, 0x21, 0xa7, 0x48, 0xfa, 0x67, 0x87, 0xde, 0x4f, 0x11, 0x6c, 0xba, 0x56, 0x2b, 0xcf, 0x7a, 0xa6, 0xc6, 0x0f, 0x05, 0x12, 0x7a, 0xc5, - 0xb3, 0x9e, 0xa9, 0xf1, 0x11, 0xc2, 0x4c, 0x8d, 0x9b, 0x45, 0xb3, 0x16, 0xae, 0x75, 0x7a, 0xc9, 0xad, 0x6d, 0x76, 0xd9, 0x73, 0x27, 0x19, 0x0e, 0x45, 0xc8, 0xc2, 0xa4, 0xe2, 0xb8, 0x8c, 0xd1, - 0xcc, 0x5c, 0x71, 0x9b, 0xe5, 0x82, 0xc7, 0x30, 0xdd, 0x58, 0x66, 0x52, 0x77, 0x60, 0xcd, 0xfa, 0xb2, 0xac, 0x4c, 0x85, 0xe1, 0x7a, 0xc5, 0x64, 0xee, 0x5a, 0x5d, 0xcc, 0xd7, 0x3c, 0xac, 0x84, - 0x21, 0x10, 0x24, 0x0a, 0x2c, 0x58, 0x2b, 0x05, 0xad, 0x51, 0x76, 0xdd, 0xaf, 0x97, 0x31, 0xe9, 0x2c, 0x7e, 0x3e, 0xf2, 0x65, 0x79, 0xda, 0x24, 0x3a, 0x3f, 0x36, 0xf3, 0x91, 0xd7, 0x34, 0xe0, - 0x15, 0xe1, 0x06, 0x99, 0x8f, 0xd3, 0x06, 0xa1, 0x16, 0x9d, 0x54, 0x21, 0x73, 0xbe, 0x82, 0x0f, 0xb9, 0xb4, 0xc9, 0x71, 0x2f, 0xe1, 0x75, 0x61, 0x0e, 0x08, 0x62, 0x6e, 0xca, 0xf0, 0xaa, 0x98, - 0x4d, 0xba, 0x5b, 0x08, 0x29, 0x8a, 0x71, 0x3e, 0x11, 0xe1, 0x65, 0x49, 0x74, 0xbd, 0x8d, 0x38, 0x99, 0xd8, 0xb8, 0xee, 0x6a, 0xd3, 0x6a, 0x38, 0x8e, 0x2a, 0xea, 0x50, 0x2b, 0x73, 0xc0, 0xec, - 0xe9, 0x30, 0xd5, 0x0f, 0xa6, 0xc3, 0xb9, 0xea, 0x43, 0x5a, 0x8c, 0x12, 0x69, 0xf9, 0x9f, 0x61, 0xea, 0x67, 0x87, 0x50, 0xdf, 0xb9, 0x8f, 0xe7, 0xb6, 0xaf, 0x04, 0xb4, 0x5c, 0x88, 0x36, 0x58, - 0x9e, 0x0e, 0x9b, 0x5d, 0x12, 0x5a, 0xe0, 0x28, 0x98, 0x6e, 0x57, 0xe0, 0xb0, 0x7c, 0xe1, 0x40, 0xdb, 0x44, 0x46, 0x87, 0x7b, 0x67, 0x43, 0x76, 0x0d, 0x1e, 0x0c, 0xaa, 0x95, 0x5d, 0x6a, 0xca, - 0x58, 0x5d, 0xce, 0xd4, 0xc5, 0x0e, 0xd0, 0x32, 0x67, 0xe7, 0x41, 0x4b, 0x5c, 0xb7, 0x38, 0xdd, 0xde, 0xaa, 0xbb, 0xd4, 0xa4, 0xbd, 0x94, 0xab, 0xd4, 0x7c, 0x33, 0xd1, 0x6a, 0x60, 0x14, 0x8d, - 0x8c, 0xed, 0x74, 0x9f, 0x4e, 0xdc, 0x00, 0xe1, 0xbd, 0xf5, 0x0b, 0x21, 0x06, 0x79, 0x14, 0xb8, 0x7a, 0x27, 0xf3, 0x4d, 0xf3, 0x51, 0xdf, 0x7b, 0xd1, 0xd6, 0xba, 0x22, 0x7c, 0x44, 0xe7, 0xea, - 0xb4, 0xad, 0xe5, 0xb5, 0x9b, 0x09, 0x1e, 0x9b, 0xf4, 0x1c, 0x32, 0xde, 0x43, 0x9b, 0xf5, 0x6c, 0x04, 0x60, 0xa2, 0x56, 0x47, 0xee, 0x02, 0x0c, 0xa5, 0x1d, 0xd7, 0x5b, 0xcf, 0x0a, 0x03, 0x29, - 0xca, 0x70, 0x9c, 0x14, 0x2c, 0x0c, 0xee, 0x71, 0x95, 0xec, 0x8b, 0x0a, 0x3f, 0x96, 0xa0, 0x9e, 0x5e, 0x27, 0x13, 0x48, 0x0c, 0x09, 0x32, 0xda, 0x82, 0x92, 0x24, 0xc2, 0x53, 0x4d, 0x9e, 0xa8, - 0x9e, 0x12, 0xc7, 0xe8, 0xa8, 0x9b, 0xdf, 0x20, 0xf4, 0x4c, 0xac, 0xda, 0x2e, 0x09, 0x96, 0xaa, 0xeb, 0x37, 0x8b, 0x5a, 0xf9, 0x21, 0x36, 0x8d, 0x4e, 0xa3, 0xfa, 0x1e, 0x4d, 0x28, 0x6f, 0xf7, - 0x65, 0x6a, 0x0d, 0xe7, 0xdd, 0x57, 0x1c, 0x81, 0xbd, 0xdb, 0xd0, 0x40, 0x8c, 0x3f, 0x87, 0x98, 0xe5, 0x59, 0x68, 0xe2, 0xce, 0x30, 0xc2, 0x74, 0x63, 0xb3, 0x76, 0x97, 0x12, 0x3c, 0x9d, 0xcf, - 0xc1, 0xa5, 0x64, 0xb1, 0x32, 0x94, 0x15, 0xd6, 0x68, 0xb9, 0x09, 0xbc, 0xa5, 0x5d, 0xae, 0xb2, 0x48, 0x46, 0xf2, 0x64, 0xaf, 0xe7, 0xa2, 0xd9, 0x5b, 0x9a, 0xde, 0x5a, 0xb7, 0x66, 0xf9, 0x7e, - 0x3b, 0x49, 0xfa, 0x12, 0x0f, 0xcb, 0x7b, 0x91, 0xca, 0x62, 0x44, 0x48, 0x97, 0xf4, 0x3a, 0xe6, 0xb6, 0x44, 0x56, 0xfd, 0x00, 0xe2, 0xdf, 0xee, 0x4e, 0x1f, 0x7e, 0x38, 0x27, 0x7c, 0xf7, 0xa5, - 0xf8, 0x9e, 0xa3, 0xa6, 0x5a, 0x2b, 0x8e, 0x95, 0x6e, 0xf4, 0x80, 0x41, 0xd4, 0x6b, 0x1b, 0xc3, 0x1d, 0x29, 0x36, 0xfc, 0x28, 0xdd, 0xa8, 0x43, 0xb5, 0xdb, 0x0c, 0x4e, 0xea, 0xf9, 0xfc, 0xb6, - 0x14, 0x8a, 0x6a, 0x78, 0x98, 0x4e, 0xd0, 0xb9, 0x45, 0x6b, 0xf8, 0x7a, 0x42, 0x6f, 0x94, 0x60, 0x53, 0x23, 0xd6, 0x8a, 0xb1, 0x4b, 0x04, 0x35, 0x88, 0x5a, 0x19, 0x18, 0xbe, 0x09, 0x26, 0xa8, - 0x3d, 0xf7, 0x82, 0x3d, 0xad, 0x9a, 0x05, 0x03, 0xc5, 0x5b, 0x88, 0xad, 0x33, 0x7c, 0xbe, 0xe6, 0x97, 0xb6, 0x95, 0x24, 0x7d, 0x65, 0x97, 0x1e, 0x4c, 0xb8, 0x3b, 0xf4, 0x59, 0xc9, 0xae, 0xda, - 0xad, 0xcd, 0x5c, 0xa6, 0x57, 0x77, 0xd6, 0x59, 0xae, 0x03, 0xa5, 0x3f, 0x35, 0xdd, 0x96, 0xe4, 0x6b, 0x35, 0xe5, 0x6e, 0x80, 0xb9, 0xb9, 0xf4, 0x2c, 0x16, 0xf7, 0xe7, 0x85, 0xf6, 0xbe, 0xc6, - 0xe2, 0xb6, 0xa8, 0xac, 0x37, 0x5f, 0xac, 0x07, 0x5c, 0xb1, 0x94, 0x51, 0x93, 0xcd, 0xc5, 0xf1, 0xbc, 0x0c, 0x67, 0x5b, 0x72, 0xac, 0xef, 0xcc, 0x1c, 0xf6, 0xa0, 0x1c, 0x17, 0x0a, 0x21, 0x1b, - 0xd4, 0xf3, 0x79, 0x9d, 0x99, 0x3b, 0x16, 0x47, 0x14, 0x9f, 0x4a, 0x64, 0x6b, 0x30, 0x9a, 0xf7, 0xdd, 0xac, 0xda, 0x24, 0xa3, 0x92, 0x5b, 0x0f, 0x57, 0x9c, 0x60, 0x6f, 0x00, 0x72, 0x08, 0x96, - 0xcc, 0x6c, 0xe6, 0x98, 0x4e, 0xb5, 0xb7, 0x3e, 0xef, 0x53, 0xf3, 0xaf, 0x10, 0x78, 0x7b, 0x87, 0xc3, 0xff, 0x43, 0x23, 0x6b, 0x1f, 0x63, 0xa0, 0xa9, 0xbe, 0x1a, 0xea, 0xa6, 0xd1, 0xf9, 0xce, - 0xbd, 0x04, 0xdf, 0xac, 0x53, 0xb6, 0xfd, 0xf8, 0x5b, 0xd2, 0x60, 0xe7, 0xd3, 0x85, 0x66, 0xa8, 0x6f, 0x01, 0x0a, 0x1a, 0x2d, 0x4d, 0x59, 0x80, 0x24, 0x7e, 0x45, 0x90, 0xce, 0x0c, 0xee, 0x05, - 0xda, 0x26, 0x9b, 0x60, 0x07, 0x35, 0x91, 0xc9, 0xdc, 0x73, 0x39, 0x5f, 0xdb, 0x2f, 0x58, 0x45, 0x88, 0x39, 0x68, 0xb2, 0xee, 0x02, 0x8c, 0xb9, 0xc1, 0xb4, 0x45, 0x4f, 0xdd, 0x40, 0xbd, 0x70, - 0x9f, 0x43, 0xf9, 0x1e, 0xe1, 0xd3, 0x78, 0x11, 0xaf, 0x2b, 0x51, 0x9d, 0x57, 0x23, 0x7f, 0xb4, 0xec, 0x8f, 0x9d, 0xad, 0x8c, 0xcf, 0x7f, 0x1c, 0x6e, 0xac, 0xa9, 0x99, 0x49, 0x60, 0xa7, 0x19, - 0xeb, 0x7d, 0x88, 0xf0, 0x17, 0x06, 0xdf, 0x77, 0xaa, 0x0d, 0x3a, 0xe7, 0xe3, 0x4e, 0x43, 0xeb, 0x39, 0x30, 0xbd, 0x49, 0xac, 0x6e, 0x7d, 0x2e, 0xa4, 0x72, 0x6c, 0xb9, 0xd2, 0x04, 0x8e, 0x39, - 0x00, 0x1a, 0x0e, 0x4c, 0x26, 0x76, 0xb9, 0xc0, 0xca, 0x34, 0x63, 0xa9, 0x52, 0x2b, 0x53, 0xcd, 0x15, 0xc7, 0x71, 0x46, 0x5a, 0x13, 0x56, 0xda, 0x79, 0x3b, 0x36, 0x3d, 0x10, 0x9e, 0x0b, 0xa5, - 0xf2, 0xd8, 0x63, 0xa0, 0x5d, 0xad, 0xcd, 0xcc, 0xf9, 0xb4, 0xaa, 0xf7, 0x09, 0xe5, 0x1e, 0xe2, 0x08, 0x83, 0x13, 0x73, 0x7d, 0x63, 0xf2, 0x7f, 0xa8, 0xb3, 0xff, 0xeb, 0xbd, 0x5f, 0xdd, 0x74, - 0xbe, 0x87, 0x0b, 0xcf, 0xed, 0xd4, 0x9e, 0x65, 0xa6, 0x51, 0xf6, 0xbe, 0x78, 0x70, 0x35, 0x2a, 0x3c, 0x78, 0x4d, 0xac, 0xe6, 0xa9, 0x19, 0x85, 0xdf, 0xbe, 0xa7, 0xaa, 0xaa, 0xb7, 0xf3, 0x7d, - 0xcd, 0xcb, 0x7e, 0xfa, 0x0e, 0x3d, 0x0a, 0xb3, 0xc2, 0xcf, 0x8f, 0x9f, 0xfd, 0xdd, 0x6b, 0x4e, 0x64, 0x1b, 0x26, 0x9e, 0xc7, 0xa7, 0xdf, 0xbf, 0x0c, 0x3d, 0xff, 0xf7, 0x37, 0xe2, 0xe4, 0x86, - 0x6a, 0x7a, 0xe8, 0x98, 0xfb, 0xdc, 0x0c, 0x8f, 0x22, 0xf4, 0x78, 0xd8, 0x79, 0xa5, 0x3a, 0xf8, 0x17, 0xea, 0x47, 0xf1, 0xfa, 0x7c, 0xad, 0x83, 0xb4, 0x2b, 0xff, 0xed, 0xb1, 0x7a, 0x3e, 0x06, - 0x47, 0x2b, 0x51, 0x53, 0xa2, 0xf1, 0x61, 0x17, 0x99, 0x9c, 0xe6, 0x6c, 0x62, 0xc1, 0x9f, 0xd1, 0xc9, 0x70, 0xa6, 0x57, 0x9b, 0xf1, 0x64, 0x1c, 0xd9, 0x18, 0xd2, 0xc7, 0x39, 0x76, 0x2e, 0x57, - 0xa2, 0xb4, 0x34, 0x3c, 0x86, 0x33, 0x5c, 0xc7, 0xf3, 0x20, 0xd6, 0x0f, 0x1d, 0x53, 0x24, 0x35, 0x5f, 0x93, 0x08, 0x83, 0x13, 0x54, 0x6b, 0xd6, 0x73, 0x97, 0x54, 0x14, 0x89, 0x4f, 0x4b, 0x53, - 0x3f, 0x33, 0x70, 0x5b, 0xe8, 0x6f, 0xcd, 0x0d, 0xf3, 0xd4, 0x7c, 0xb8, 0x3e, 0xf2, 0xe2, 0x98, 0x76, 0x26, 0x7a, 0x02, 0xb4, 0x39, 0x6c, 0x3b, 0x8e, 0xad, 0x04, 0xde, 0x96, 0xf8, 0xca, 0xeb, - 0xa9, 0xf2, 0x10, 0xa7, 0xa0, 0xe5, 0x26, 0x44, 0xa7, 0xaa, 0xbe, 0xb2, 0xbd, 0x22, 0x4d, 0x35, 0x3e, 0x30, 0x49, 0x45, 0x99, 0x6d, 0x87, 0xcb, 0xe5, 0x8a, 0x0c, 0x82, 0x7c, 0x4b, 0x88, 0xe2, - 0xc2, 0x81, 0xfa, 0x36, 0x1a, 0x57, 0x23, 0x3d, 0xcc, 0x45, 0x92, 0x64, 0xfb, 0xe9, 0x04, 0x9e, 0x42, 0xb3, 0xfd, 0x4e, 0x33, 0x73, 0x4f, 0x8f, 0x36, 0xf5, 0xaa, 0x9a, 0x3c, 0x19, 0xdc, 0x53, - 0x55, 0x37, 0x3b, 0xe6, 0x3e, 0x56, 0xc3, 0xec, 0xb1, 0xd3, 0xac, 0x09, 0x2d, 0x7f, 0x61, 0xec, 0xba, 0x25, 0x7e, 0x44, 0xe4, 0xf6, 0xca, 0x29, 0x66, 0xbd, 0xc5, 0x40, 0xe6, 0x32, 0xc5, 0x9c, - 0x63, 0x07, 0x76, 0xca, 0x6d, 0x48, 0x0e, 0x29, 0xfb, 0x23, 0x10, 0xdf, 0xc7, 0x35, 0x44, 0xd6, 0x4b, 0x8e, 0x86, 0x20, 0x29, 0x2e, 0xec, 0xc4, 0x09, 0xb6, 0xf9, 0x2a, 0xe0, 0x05, 0x02, 0x87, - 0xa9, 0x80, 0x29, 0x16, 0x7c, 0x24, 0x6c, 0x07, 0xbe, 0xd1, 0xa7, 0x7d, 0xc8, 0x86, 0x29, 0xb2, 0xb0, 0xa2, 0xda, 0x50, 0x39, 0x7b, 0x3d, 0xd1, 0xb7, 0x03, 0x8d, 0x80, 0x93, 0xa1, 0xfb, 0x4c, - 0xc2, 0x1e, 0x9b, 0x38, 0x5f, 0x54, 0xe2, 0x1d, 0x4b, 0x53, 0x8f, 0x42, 0x5d, 0xcd, 0x3b, 0x41, 0xe3, 0xf8, 0xf9, 0x1d, 0xba, 0x59, 0x53, 0x7a, 0xc2, 0x8f, 0x47, 0x02, 0x89, 0xbe, 0x26, 0x90, - 0x0d, 0xc9, 0x0b, 0xf8, 0x59, 0x13, 0xf9, 0xde, 0x42, 0x18, 0x35, 0xaa, 0x08, 0x80, 0x29, 0xbc, 0xa8, 0x79, 0x74, 0xcd, 0x2e, 0xeb, 0xd2, 0x09, 0x08, 0x7b, 0x54, 0xc3, 0x07, 0x4b, 0xd2, 0xe8, - 0x9c, 0xd8, 0x4a, 0xbe, 0xde, 0x9f, 0xf4, 0xca, 0x2c, 0x48, 0x18, 0x45, 0x19, 0x54, 0x18, 0x51, 0x13, 0x08, 0xe1, 0xaf, 0xbc, 0xae, 0x07, 0x1f, 0xfa, 0xf3, 0x35, 0x8a, 0x72, 0x38, 0x07, 0xf8, - 0xb4, 0x18, 0x2b, 0xfc, 0x1c, 0xde, 0x51, 0x3e, 0x40, 0x52, 0x9c, 0x0a, 0xbd, 0x0e, 0xb9, 0xe5, 0xfa, 0x7e, 0x27, 0x55, 0x43, 0xfb, 0x14, 0x40, 0x45, 0xfe, 0xe2, 0x1a, 0xdd, 0x37, 0x1c, 0x28, - 0x2c, 0xeb, 0x61, 0x3e, 0x02, 0x71, 0x53, 0x89, 0xa8, 0x35, 0x07, 0x1a, 0x92, 0x47, 0x0e, 0x34, 0x07, 0x9d, 0x86, 0xca, 0x73, 0x0e, 0x0c, 0x24, 0x97, 0x89, 0x67, 0xfb, 0xbc, 0x72, 0x15, 0x85, - 0xeb, 0x2b, 0x9a, 0xae, 0x49, 0x23, 0x5d, 0xf1, 0xfa, 0x8b, 0xd5, 0x88, 0x09, 0xbb, 0x87, 0x04, 0x8c, 0xd9, 0xc1, 0x4e, 0xf2, 0xbb, 0x38, 0xd8, 0xdb, 0xd7, 0x2c, 0x1c, 0xaa, 0xb4, 0x9e, 0xcf, - 0xc8, 0xad, 0x40, 0x50, 0xa9, 0xcb, 0x83, 0xf6, 0x74, 0xc9, 0x6e, 0xc9, 0xcc, 0x48, 0x79, 0xed, 0x40, 0x39, 0x91, 0xd5, 0x63, 0xb7, 0x45, 0x91, 0x08, 0x7f, 0x6a, 0xef, 0x3f, 0x50, 0x7b, 0xb7, - 0x90, 0xdb, 0x6b, 0xab, 0xf0, 0x38, 0x4a, 0x7c, 0xda, 0xf6, 0xd2, 0x35, 0x4d, 0x93, 0xc4, 0xb1, 0x73, 0x23, 0xd2, 0x6e, 0x8c, 0x38, 0x49, 0x91, 0x95, 0x46, 0xc1, 0x77, 0xe3, 0xf5, 0x8b, 0x62, - 0xda, 0xd0, 0xfd, 0x90, 0xd5, 0x26, 0x20, 0xb1, 0x65, 0x6a, 0x11, 0x2f, 0xea, 0x9b, 0xbe, 0xac, 0x31, 0x93, 0xbc, 0x1f, 0x91, 0x9a, 0x93, 0xf4, 0x33, 0x02, 0x27, 0x20, 0xee, 0x60, 0x60, 0x1b, - 0x35, 0x2a, 0x15, 0x5f, 0x00, 0x77, 0xdd, 0x15, 0xea, 0x78, 0x2b, 0x79, 0x00, 0xd6, 0xd5, 0x9a, 0x9c, 0xd0, 0x2b, 0x63, 0x39, 0xc1, 0xec, 0x51, 0x0e, 0x6a, 0x75, 0xb5, 0xec, 0xf2, 0xda, 0x02, - 0x4f, 0x22, 0x0d, 0x18, 0xe0, 0x5e, 0x91, 0x29, 0x99, 0x06, 0x6d, 0xc5, 0x09, 0xf2, 0x63, 0x0f, 0xb3, 0xae, 0xfa, 0x7e, 0x47, 0x73, 0x43, 0xe3, 0x0f, 0x55, 0xeb, 0xef, 0x54, 0xc1, 0xce, 0xc7, - 0x71, 0x5b, 0xc5, 0x4e, 0x0a, 0xc0, 0x40, 0x63, 0x5c, 0x27, 0xa5, 0xf1, 0xf5, 0x50, 0x1b, 0x6c, 0xcd, 0x4c, 0xcf, 0xab, 0x40, 0x9a, 0xa8, 0x26, 0x91, 0x0a, 0xee, 0xa8, 0x0e, 0x6a, 0xd8, 0xd5, - 0x53, 0x73, 0x3d, 0x06, 0x20, 0xb5, 0x47, 0x4e, 0xc7, 0x56, 0x91, 0x38, 0xfd, 0x2c, 0x42, 0xa4, 0x6e, 0xa8, 0xc7, 0xfa, 0x20, 0xaf, 0x79, 0x31, 0xaf, 0x37, 0x16, 0x22, 0x0e, 0x87, 0x85, 0xb9, - 0x1e, 0x0f, 0xa5, 0x6d, 0x96, 0xa4, 0x2d, 0x83, 0x91, 0x2f, 0xd5, 0x45, 0x2f, 0x90, 0x9c, 0x36, 0xe1, 0xb8, 0x4d, 0x11, 0x37, 0xf3, 0xce, 0xd1, 0x54, 0x71, 0xc3, 0xcc, 0xd5, 0xdf, 0xb5, 0x59, - 0xdb, 0xd0, 0xd2, 0x16, 0xe3, 0x40, 0x6b, 0xe7, 0xd5, 0x11, 0xd9, 0xcc, 0xcd, 0xbf, 0xd1, 0x80, 0xaf, 0xac, 0xde, 0xbd, 0x53, 0x3d, 0xf3, 0xae, 0x39, 0x6e, 0xe2, 0x18, 0x5a, 0x18, 0xb7, 0x73, - 0x8a, 0xf6, 0x7a, 0xd9, 0xa6, 0x54, 0x96, 0xc0, 0x6a, 0xc4, 0xca, 0x23, 0x18, 0x76, 0x38, 0x46, 0xec, 0x97, 0x24, 0xb6, 0x95, 0x08, 0x72, 0x2b, 0xbb, 0xf8, 0x78, 0x3c, 0x98, 0xad, 0x47, 0xc9, - 0x14, 0x41, 0xf1, 0x8c, 0x0e, 0xbc, 0x0d, 0x06, 0x24, 0xfb, 0x2e, 0x5f, 0x94, 0x7e, 0x86, 0xbb, 0xe5, 0x61, 0xd6, 0x9f, 0xe9, 0xf9, 0x1e, 0x23, 0xf6, 0xe2, 0x54, 0x44, 0x55, 0xa9, 0xe8, 0x93, - 0x59, 0xf6, 0x34, 0x42, 0xef, 0x99, 0x9b, 0xa4, 0x15, 0x94, 0x81, 0xe9, 0xeb, 0xea, 0xc3, 0x35, 0xe6, 0xd7, 0x12, 0x67, 0xde, 0xa9, 0x36, 0x50, 0x9e, 0x8f, 0xdb, 0x26, 0xce, 0x4c, 0x11, 0x6a, - 0x29, 0xd1, 0x30, 0x09, 0x85, 0xd5, 0x7a, 0x49, 0xa0, 0xb2, 0x97, 0xfb, 0x7d, 0xa1, 0x8f, 0x1a, 0xbe, 0x21, 0xf6, 0x62, 0x75, 0xbc, 0x51, 0x76, 0xc2, 0x08, 0x2e, 0xf8, 0x81, 0x55, 0x5b, 0x68, - 0xba, 0x28, 0xe6, 0xa6, 0xcd, 0xa9, 0x9c, 0x99, 0x1d, 0x4c, 0x13, 0xd8, 0xee, 0x45, 0x60, 0x4d, 0x2c, 0xcb, 0x05, 0x2b, 0xae, 0x08, 0x39, 0x35, 0x04, 0x63, 0xe1, 0x2e, 0x60, 0x1c, 0xad, 0xc6, - 0xcf, 0xd6, 0x98, 0xff, 0x48, 0x28, 0xbf, 0xcb, 0x1b, 0x26, 0x5e, 0x2a, 0x2a, 0x7f, 0x4b, 0xfa, 0x06, 0xd4, 0x26, 0x4f, 0x98, 0x68, 0x57, 0x59, 0x7e, 0x9b, 0x56, 0x6a, 0x0f, 0x2a, 0xfb, 0x13, - 0xb5, 0x9e, 0xd3, 0xbb, 0x10, 0x72, 0x63, 0xc9, 0xe5, 0xe3, 0xa5, 0xea, 0x6d, 0xd9, 0xa5, 0x09, 0x4c, 0x3c, 0xd1, 0x4a, 0x3d, 0x47, 0xa7, 0xf9, 0xfd, 0x38, 0x07, 0xeb, 0x50, 0x2b, 0x7d, 0xce, - 0xa0, 0xe6, 0x15, 0xb8, 0x52, 0x03, 0xb5, 0xc6, 0xfb, 0x34, 0xb6, 0xb6, 0x9c, 0x0c, 0x5d, 0xca, 0x0b, 0x54, 0xe9, 0x06, 0xd5, 0xa2, 0x00, 0xe7, 0x68, 0x86, 0x6e, 0x9f, 0x21, 0xfb, 0x4d, 0x4c, - 0xd5, 0x95, 0xec, 0xfd, 0xfe, 0x37, 0xfc, 0xb3, 0xd2, 0x0b, 0xd4, 0xb8, 0x13, 0x69, 0xde, 0xef, 0x77, 0xdd, 0xb0, 0x49, 0xe1, 0xea, 0xbb, 0x8e, 0x9f, 0x16, 0xef, 0xcd, 0xbf, 0x62, 0xe7, 0xfd, - 0xf2, 0xd0, 0xf5, 0xc3, 0x18, 0xc6, 0x26, 0x86, 0xeb, 0xa1, 0xff, 0xf7, 0x15, 0x07, 0xe1, 0x29, 0x2a, 0xac, 0x73, 0xfa, 0xdf, 0x44, 0xb9, 0xb4, 0x90, 0x87, 0x68, 0x12, 0x6a, 0xce, 0xe0, 0xb0, - 0x18, 0x6d, 0x62, 0xb9, 0x30, 0x6b, 0xca, 0xa5, 0xf9, 0xe0, 0xd0, 0x57, 0xb1, 0x50, 0xf3, 0xb0, 0x91, 0x20, 0x1e, 0x0a, 0x47, 0x07, 0xab, 0x43, 0x77, 0xb7, 0x25, 0xc1, 0xf5, 0x6a, 0xae, 0x57, - 0x23, 0xa1, 0xbb, 0xea, 0x11, 0x04, 0x35, 0x2f, 0xa8, 0xc5, 0x4e, 0x20, 0x01, 0x68, 0x48, 0x12, 0xcb, 0xe9, 0x42, 0x30, 0x0f, 0x55, 0x97, 0x89, 0x45, 0x88, 0x80, 0x5d, 0xec, 0x69, 0xa8, 0xf6, - 0x37, 0x0e, 0xf9, 0x9b, 0x58, 0xc4, 0x53, 0x91, 0x92, 0x1b, 0xa6, 0x7f, 0x71, 0xe0, 0x1e, 0x2d, 0x7c, 0xf8, 0x85, 0x3c, 0xd7, 0x3f, 0x20, 0x7c, 0xf5, 0x04, 0x78, 0xf3, 0xf7, 0x47, 0x01, 0x78, - 0xba, 0x13, 0xed, 0x5c, 0x43, 0xfd, 0x6e, 0x67, 0xd4, 0x9f, 0x4f, 0x1d, 0x2e, 0x44, 0x1b, 0x01, 0x38, 0x1d, 0x36, 0x1b, 0xa1, 0xb6, 0x98, 0x3e, 0xb0, 0x29, 0x9a, 0x59, 0x93, 0xc5, 0x9c, 0x88, - 0x24, 0xdd, 0xb3, 0x90, 0x71, 0x20, 0x07, 0x83, 0xb1, 0x65, 0xae, 0xf8, 0x72, 0x43, 0x1b, 0xa6, 0xbd, 0xa7, 0x21, 0x77, 0x25, 0xe2, 0xa6, 0x86, 0xac, 0x60, 0xa8, 0x18, 0x8c, 0x65, 0xa6, 0xb7, - 0xa4, 0x04, 0xfa, 0xa0, 0x18, 0xab, 0xde, 0x61, 0xa5, 0x51, 0xfb, 0xcd, 0xac, 0x46, 0x87, 0x9e, 0x27, 0xd9, 0x5e, 0x77, 0x37, 0x5d, 0x67, 0x8a, 0x94, 0xf4, 0x89, 0xdd, 0xb3, 0x90, 0x93, 0xd6, - 0x33, 0x0a, 0x37, 0x34, 0xdc, 0xd2, 0x35, 0x0a, 0xd5, 0xff, 0xd6, 0x0c, 0x8f, 0xd5, 0xc2, 0x0f, 0x5c, 0xdf, 0x4f, 0x4f, 0xb6, 0xfe, 0x89, 0x3a, 0xf8, 0x9a, 0x29, 0x7e, 0x15, 0x21, 0xf9, 0xfb, - 0xdf, 0x6f, 0xe3, 0x21, 0x8f, 0x86, 0xfa, 0x65, 0xe6, 0x7d, 0x6c, 0xfb, 0x94, 0x74, 0x63, 0xfb, 0x91, 0xd6, 0x89, 0xd5, 0xd4, 0x3c, 0x15, 0x69, 0xfc, 0x3b, 0xfe, 0xf9, 0x61, 0x37, 0xeb, 0x9c, - 0xbd, 0x67, 0x97, 0xe8, 0xc2, 0xbf, 0x7f, 0xdd, 0x3d, 0xff, 0xa3, 0xd6, 0xce, 0xdf, 0xbf, 0xd4, 0xda, 0xf9, 0x1a, 0x9e, 0xf8, 0xf7, 0x2f, 0xe1, 0x89, 0xa9, 0xa9, 0x1a, 0x86, 0x9b, 0xc6, 0xe7, - 0xd6, 0xd7, 0xb6, 0x8d, 0xba, 0x8d, 0x58, 0x79, 0x7f, 0xee, 0xb2, 0x46, 0xf2, 0x38, 0x2f, 0xcd, 0xca, 0x9a, 0x7c, 0xf4, 0xec, 0xfc, 0x71, 0x68, 0xab, 0x78, 0x2c, 0xdd, 0x8f, 0x0a, 0xe3, 0xfd, - 0xb9, 0x47, 0x33, 0xea, 0x9f, 0x2f, 0x8a, 0x5d, 0xd1, 0x3d, 0xf6, 0x8c, 0x8f, 0xb3, 0x66, 0x6e, 0xdd, 0x62, 0x81, 0x6c, 0xa5, 0x1e, 0x28, 0x58, 0x93, 0xb2, 0x22, 0x1f, 0xec, 0x94, 0x3d, 0x17, - 0xf2, 0xc8, 0x04, 0x4a, 0xcd, 0xb2, 0x8b, 0x1b, 0xd0, 0x9e, 0x54, 0x25, 0x05, 0x1d, 0x02, 0x74, 0x10, 0x50, 0xe0, 0x30, 0x1c, 0xd5, 0xd9, 0x2a, 0x1f, 0x5a, 0x26, 0xbd, 0x9b, 0xea, 0x9b, 0x01, - 0x8b, 0xe9, 0xb5, 0x02, 0x51, 0x8b, 0x48, 0x08, 0x89, 0xb9, 0x30, 0xf1, 0x81, 0x74, 0xb4, 0x51, 0xe9, 0x25, 0xb0, 0x09, 0x01, 0x6f, 0xd4, 0xd2, 0x22, 0xff, 0x85, 0x5d, 0x82, 0xe3, 0x34, 0xd2, - 0xcd, 0xec, 0xd4, 0x08, 0x35, 0x1b, 0xab, 0xdc, 0x3c, 0x5f, 0xe4, 0xae, 0x7f, 0x69, 0x43, 0x6e, 0x37, 0x1c, 0x2b, 0x0a, 0xd7, 0x38, 0xbf, 0x15, 0x7d, 0x61, 0x61, 0x0e, 0x46, 0x7e, 0xfb, 0x3f, - 0x10, 0xa8, 0x65, 0xd0, 0xc0, 0x35, 0x77, 0x6e, 0x97, 0xd3, 0xfe, 0xcc, 0x19, 0xfc, 0x33, 0x67, 0xf0, 0x47, 0x12, 0xf3, 0x67, 0xce, 0x60, 0xab, 0x9c, 0xc1, 0xcf, 0x49, 0x0c, 0xf7, 0xf0, 0x79, - 0xad, 0x6a, 0xc7, 0x0d, 0xe5, 0xe3, 0x58, 0x7b, 0x7d, 0xde, 0xb6, 0x5e, 0xc7, 0x62, 0xd1, 0x67, 0xe6, 0x99, 0x47, 0xba, 0x05, 0xb8, 0xd7, 0xf0, 0x68, 0xb2, 0xd5, 0xb3, 0x01, 0xb7, 0x8c, 0xe3, - 0xc1, 0x2c, 0xcc, 0x3c, 0x10, 0x47, 0x84, 0x95, 0xb4, 0x98, 0x68, 0x58, 0x3d, 0xc7, 0xa3, 0x70, 0x53, 0xad, 0x06, 0x68, 0xbd, 0x0a, 0x02, 0x29, 0x9a, 0xe9, 0x82, 0x35, 0x64, 0x00, 0x66, 0xc1, - 0xc6, 0xd6, 0x04, 0x94, 0x71, 0x0a, 0xb3, 0x78, 0x1b, 0xa5, 0x14, 0x8e, 0x51, 0xfb, 0xfe, 0xe4, 0xd9, 0x1c, 0xfa, 0x59, 0xca, 0x47, 0xa8, 0x06, 0x8d, 0x78, 0xff, 0x1d, 0x6e, 0x36, 0x67, 0xfc, - 0xe9, 0x88, 0x48, 0xb6, 0x1d, 0x0c, 0xaf, 0x5f, 0xf6, 0xc8, 0x59, 0xf7, 0x82, 0x06, 0x7c, 0x27, 0xfb, 0xce, 0x94, 0xe3, 0x49, 0xe3, 0xaa, 0x6b, 0xa1, 0xff, 0x0c, 0xe1, 0x00, 0xa0, 0xbd, 0x62, - 0x8d, 0xaa, 0x48, 0x35, 0xd3, 0x14, 0x6e, 0x54, 0xf0, 0x4a, 0x2c, 0xe9, 0xb6, 0x37, 0x2c, 0xa6, 0x32, 0x58, 0xd0, 0x53, 0xb0, 0xd0, 0x74, 0x65, 0xd0, 0x15, 0x36, 0x1a, 0x1b, 0x51, 0x96, 0x85, - 0x09, 0xd4, 0x61, 0x15, 0xe3, 0xb4, 0x05, 0x99, 0xd6, 0x92, 0x2a, 0xfa, 0xd1, 0x36, 0xc2, 0x13, 0x6c, 0xb0, 0x27, 0x8d, 0x6d, 0x57, 0xb0, 0xc5, 0xe1, 0xc6, 0xee, 0x65, 0xe2, 0xcf, 0x5d, 0x75, - 0x51, 0xa0, 0xb9, 0xa1, 0x69, 0x1c, 0x47, 0x2f, 0x53, 0x7d, 0xec, 0xcd, 0x84, 0xde, 0xa8, 0x17, 0x00, 0xba, 0xa1, 0xdd, 0xa0, 0x74, 0x73, 0xa5, 0xe9, 0xce, 0xd4, 0x73, 0xa8, 0x06, 0xe2, 0x0c, - 0xe3, 0x17, 0x56, 0x31, 0x36, 0x39, 0x8b, 0xd4, 0x69, 0x8d, 0xe6, 0xc7, 0x83, 0x8d, 0x33, 0x59, 0xb2, 0x09, 0x80, 0xec, 0x7a, 0xbd, 0x94, 0xf6, 0x83, 0x05, 0x5d, 0xea, 0xe5, 0xa0, 0x8f, 0xd3, - 0x34, 0xcc, 0x29, 0x93, 0x4d, 0xbe, 0x1c, 0xf4, 0x96, 0xac, 0x63, 0xf8, 0x75, 0xb7, 0x16, 0xb6, 0xd5, 0xde, 0xa1, 0x7c, 0xd6, 0x08, 0xcb, 0x80, 0x17, 0x4c, 0x10, 0xc0, 0x75, 0x23, 0xea, 0x1b, - 0xaf, 0xcf, 0xad, 0x0d, 0xd3, 0x57, 0x0f, 0xd7, 0x90, 0x9d, 0xa2, 0xe3, 0x5f, 0xb0, 0x05, 0x8f, 0xa8, 0xb6, 0x91, 0xdf, 0x20, 0x50, 0x43, 0xe3, 0xe1, 0x92, 0x08, 0x0c, 0xbd, 0x34, 0xee, 0xbe, - 0x93, 0x3d, 0x31, 0xe6, 0x74, 0xdc, 0x39, 0x11, 0x7b, 0xce, 0x93, 0x7a, 0x89, 0xcf, 0x43, 0x69, 0x84, 0x20, 0x83, 0xd1, 0x82, 0x27, 0x0e, 0xfe, 0x6c, 0x4d, 0x0d, 0xb1, 0x5e, 0x0c, 0x8d, 0xfa, - 0xc2, 0x61, 0x47, 0x20, 0x96, 0x33, 0x5d, 0xb2, 0x10, 0x50, 0x70, 0x0b, 0xa9, 0xcb, 0xeb, 0x0b, 0x66, 0x3a, 0x8c, 0x77, 0xab, 0x59, 0xa9, 0x46, 0x98, 0xe6, 0xb9, 0x41, 0x3c, 0x01, 0x87, 0x4b, - 0xe7, 0x10, 0x1e, 0xc4, 0xdd, 0x60, 0xb0, 0xe7, 0x9c, 0x8a, 0xd7, 0xfb, 0x52, 0x60, 0x14, 0xbd, 0x1f, 0x04, 0xf7, 0xc1, 0x58, 0x3b, 0xe8, 0xe2, 0x28, 0x34, 0xc3, 0xbc, 0x63, 0x06, 0x6e, 0x9e, - 0x3f, 0x86, 0xf0, 0xa5, 0x44, 0xbc, 0x2f, 0xd4, 0x4f, 0x48, 0xde, 0x5e, 0x6b, 0xbb, 0x3d, 0xfc, 0xc2, 0x40, 0x33, 0x93, 0x10, 0x69, 0x20, 0x13, 0x60, 0xa9, 0x4a, 0x14, 0x2f, 0xd3, 0xc5, 0xb4, - 0x48, 0xe3, 0xfe, 0x7c, 0x64, 0x09, 0x10, 0x78, 0xd8, 0x86, 0x4b, 0x37, 0x24, 0x44, 0x30, 0x65, 0xd1, 0x40, 0x28, 0x72, 0xae, 0x94, 0x53, 0xa6, 0xe7, 0x8c, 0x0b, 0x0d, 0x4d, 0xbb, 0x50, 0x31, - 0xd3, 0x80, 0x65, 0x7f, 0x49, 0x17, 0x7d, 0x48, 0xdc, 0x46, 0x74, 0x17, 0xda, 0x1a, 0x96, 0x9a, 0x67, 0x8b, 0x1f, 0x6f, 0xc5, 0x7a, 0xb3, 0x66, 0x7a, 0x0f, 0x29, 0xe8, 0x45, 0x1d, 0x76, 0x21, - 0xdb, 0x40, 0x74, 0x39, 0xe9, 0x40, 0xed, 0xb4, 0x17, 0xb8, 0x4c, 0x4b, 0xcc, 0xc8, 0xaa, 0x83, 0x38, 0xa3, 0xad, 0xc8, 0x19, 0xc6, 0x75, 0x37, 0x22, 0xb6, 0x1a, 0x3a, 0xac, 0xd1, 0x65, 0x2a, - 0xb3, 0x09, 0xcd, 0xe1, 0xa9, 0x54, 0x38, 0xc3, 0x05, 0xa9, 0x3a, 0xb9, 0xaf, 0x6d, 0x27, 0xe1, 0x6a, 0x5f, 0x21, 0x1a, 0x33, 0xe0, 0x17, 0xbe, 0xa7, 0xf6, 0xc8, 0xfe, 0x86, 0x53, 0x37, 0x0a, - 0x55, 0x65, 0x9c, 0x11, 0x19, 0x83, 0x52, 0xdb, 0x39, 0x93, 0x20, 0x79, 0x01, 0x9b, 0x68, 0xe7, 0x3e, 0xd2, 0x21, 0xd0, 0x1b, 0xfe, 0x92, 0x04, 0x1d, 0x49, 0x36, 0x98, 0x1c, 0x0f, 0x3a, 0x0d, - 0x95, 0xe7, 0x78, 0x6c, 0x15, 0x74, 0x28, 0x1f, 0x42, 0x30, 0xa2, 0x6c, 0x6b, 0x32, 0xf6, 0x43, 0x7f, 0x43, 0xda, 0xe4, 0x3e, 0xc1, 0xec, 0x83, 0x40, 0x08, 0xcb, 0xc2, 0x19, 0xce, 0x27, 0xaa, - 0x3a, 0xcc, 0xb2, 0x21, 0x8d, 0x24, 0x36, 0x2b, 0x2f, 0x21, 0x7b, 0x6e, 0xe7, 0x52, 0x19, 0x1d, 0x94, 0xa9, 0x94, 0x77, 0x7b, 0x1a, 0x61, 0x30, 0x98, 0x63, 0xe9, 0x5d, 0x63, 0x85, 0xab, 0xe9, - 0xae, 0xd4, 0x41, 0x81, 0x09, 0xd2, 0x1f, 0x46, 0xd6, 0xb6, 0x72, 0xdb, 0x36, 0x5f, 0xe5, 0x3d, 0xf4, 0xc8, 0xbc, 0xb6, 0x9f, 0xfb, 0x3b, 0xd5, 0x77, 0xdc, 0x3c, 0xb5, 0xf5, 0x26, 0xee, 0x53, - 0x76, 0x4f, 0x44, 0x5c, 0x3a, 0x01, 0xe6, 0x4e, 0x3d, 0x9d, 0x8c, 0xe5, 0xae, 0x87, 0x2f, 0x49, 0x70, 0x8b, 0x7a, 0x3c, 0x18, 0xc8, 0x5c, 0xc9, 0x82, 0xac, 0x39, 0x82, 0xd7, 0x62, 0x30, 0x0e, - 0x09, 0x1c, 0x71, 0xe7, 0x0c, 0xbe, 0xc5, 0x24, 0xba, 0x66, 0xba, 0x3e, 0x80, 0x0b, 0xbc, 0xb0, 0xf1, 0x0f, 0x92, 0xd4, 0x03, 0x96, 0xc1, 0x4a, 0x9e, 0x07, 0x10, 0x27, 0xca, 0x55, 0xcc, 0xe2, - 0xe3, 0xe4, 0xc7, 0x91, 0x6a, 0x7a, 0x6a, 0xaa, 0xb9, 0xd9, 0x39, 0xcf, 0x1f, 0xbe, 0x31, 0x4b, 0x5e, 0xe8, 0x6a, 0x37, 0xa4, 0x8f, 0x10, 0xdd, 0x5c, 0x68, 0xbb, 0x92, 0x68, 0xe8, 0x93, 0xc1, - 0x06, 0xf5, 0x42, 0x88, 0x8f, 0x47, 0xea, 0xc6, 0x73, 0xb3, 0x68, 0x51, 0x9a, 0xfb, 0xd1, 0x78, 0xd5, 0x9f, 0xd4, 0x6a, 0x42, 0xd6, 0x48, 0xaa, 0x4c, 0xf6, 0x16, 0xc0, 0x2f, 0xd3, 0xae, 0xb4, - 0x33, 0x02, 0x2e, 0xc8, 0x64, 0x2c, 0x40, 0x7c, 0x7d, 0x1a, 0x79, 0xa9, 0x07, 0x0e, 0x38, 0x9f, 0x0a, 0x76, 0xf8, 0x6a, 0xcf, 0x07, 0xdb, 0x1e, 0x60, 0xe5, 0x8b, 0xdd, 0x1c, 0x44, 0xa3, 0x47, - 0x06, 0xe3, 0x77, 0x38, 0x45, 0x59, 0xd6, 0xc9, 0x62, 0xb5, 0x7a, 0x14, 0x18, 0x43, 0xbe, 0x14, 0x0f, 0x70, 0x45, 0xb7, 0x41, 0xe8, 0xfd, 0xac, 0xd9, 0x6c, 0xb7, 0x85, 0x6b, 0xcf, 0x5d, 0xb0, - 0xf3, 0xf1, 0x44, 0x9e, 0xaf, 0xfa, 0x33, 0x96, 0x34, 0xb8, 0xb9, 0x40, 0xa5, 0x3b, 0x4d, 0x08, 0xe7, 0xf1, 0x81, 0x3d, 0xd8, 0x3a, 0x3b, 0xc8, 0xd7, 0x5e, 0x6c, 0xae, 0x67, 0x8c, 0x7d, 0xa0, - 0xd6, 0x73, 0x24, 0xdd, 0xe8, 0xfb, 0xcd, 0x94, 0x92, 0xb2, 0xdd, 0xc2, 0x14, 0x7d, 0x42, 0x48, 0x69, 0x64, 0x48, 0x02, 0xf2, 0x38, 0x55, 0xed, 0x0c, 0x4e, 0x60, 0x7c, 0x50, 0x18, 0x3a, 0x39, - 0x24, 0x9e, 0xb9, 0xf6, 0x1e, 0x9b, 0x24, 0xb1, 0x9a, 0x3b, 0x9d, 0x9d, 0x79, 0x0a, 0xb9, 0x46, 0xbf, 0xf8, 0x76, 0x1d, 0x53, 0x53, 0x43, 0xbb, 0x73, 0xd6, 0xf2, 0xbf, 0xff, 0xdb, 0xbd, 0x9a, - 0x58, 0x95, 0xe3, 0x5e, 0xa5, 0xdd, 0xfe, 0xdc, 0xe3, 0xdf, 0x2a, 0xed, 0xd6, 0x30, 0x4f, 0xbe, 0xb5, 0x47, 0xe2, 0xfe, 0xf3, 0x11, 0xb4, 0xa1, 0xd8, 0x04, 0x67, 0x1f, 0x21, 0x80, 0xdb, 0xad, - 0x28, 0x96, 0xd9, 0x8a, 0x58, 0x62, 0x93, 0x15, 0x57, 0x4a, 0xc3, 0xbd, 0xd6, 0xd7, 0x5d, 0x8f, 0x74, 0x76, 0xeb, 0x45, 0x09, 0x8d, 0x72, 0x20, 0x1b, 0x0e, 0xd7, 0x2b, 0x81, 0x27, 0x48, 0x43, - 0x34, 0x4c, 0x30, 0xc2, 0x37, 0x5e, 0x98, 0x02, 0x93, 0x60, 0xea, 0xed, 0xd7, 0x63, 0xd7, 0x45, 0x8a, 0xbe, 0xa0, 0x8d, 0xd2, 0x1c, 0x66, 0x74, 0xbe, 0x5b, 0x41, 0x5b, 0x35, 0x2a, 0xf7, 0x80, - 0x2b, 0xf8, 0xa3, 0x29, 0xf0, 0x7d, 0x98, 0xd7, 0x77, 0x61, 0xe9, 0xe8, 0x1b, 0xf2, 0xc2, 0xbe, 0xd1, 0xb7, 0x61, 0xe9, 0x0d, 0x8d, 0xe7, 0x5f, 0xce, 0x0c, 0xbc, 0x7a, 0xbb, 0xed, 0xb9, 0x98, - 0xe4, 0x58, 0xae, 0x58, 0xba, 0x75, 0x3a, 0x10, 0xcd, 0x52, 0x92, 0x36, 0x5c, 0x1e, 0x32, 0xc9, 0xda, 0x32, 0xc9, 0x3d, 0xdc, 0x73, 0xec, 0x7e, 0xa6, 0x4b, 0x35, 0xa1, 0x68, 0x53, 0xcd, 0x8a, - 0xa6, 0x8b, 0xe9, 0xbc, 0xb0, 0x25, 0xf1, 0x40, 0xe7, 0x0e, 0x61, 0x51, 0x4a, 0x7f, 0xb1, 0x92, 0x97, 0x87, 0x35, 0x37, 0x60, 0x41, 0x72, 0x5d, 0x60, 0x39, 0xbc, 0x79, 0x7d, 0x1e, 0x18, 0x5c, - 0x7b, 0xd9, 0xda, 0x88, 0x4f, 0xb3, 0xae, 0xe5, 0xd6, 0x8f, 0x87, 0xcc, 0x57, 0x42, 0x31, 0x3f, 0xc8, 0x36, 0x70, 0x5e, 0x4e, 0x9a, 0x4d, 0xa5, 0x5b, 0x48, 0x53, 0x8d, 0x2c, 0x81, 0x75, 0x77, - 0x43, 0xa2, 0x4e, 0x4f, 0x96, 0x77, 0x2e, 0x30, 0x03, 0xba, 0x8a, 0x8a, 0xf8, 0xb4, 0x5f, 0x84, 0x54, 0xb7, 0x76, 0x6d, 0xe1, 0x30, 0x4c, 0x33, 0x75, 0x0f, 0x4c, 0x64, 0x91, 0xa8, 0x26, 0x6b, - 0x4c, 0x89, 0xd6, 0x71, 0x7f, 0x4b, 0xef, 0x86, 0x8e, 0xe8, 0x55, 0x3d, 0xcf, 0x63, 0x99, 0xdd, 0x7a, 0xef, 0x6c, 0xa1, 0xd5, 0xa4, 0xef, 0xec, 0xa8, 0xaa, 0xde, 0x92, 0x03, 0x5c, 0x7f, 0xb6, - 0xd4, 0xf3, 0x47, 0xe5, 0x45, 0x5e, 0x7d, 0xee, 0x37, 0x4b, 0xab, 0xaf, 0xa9, 0xa2, 0x4f, 0xb4, 0x6f, 0xc1, 0x6d, 0x16, 0x57, 0x5b, 0x2a, 0xa3, 0xb5, 0x3b, 0xdf, 0xdb, 0x7d, 0x37, 0x1d, 0xad, - 0x20, 0xd0, 0x1c, 0x09, 0xbc, 0x1e, 0x0e, 0xe8, 0x1e, 0x0a, 0x8e, 0xc6, 0x4a, 0x4f, 0x49, 0x26, 0x61, 0xd5, 0xab, 0xd6, 0x87, 0xb2, 0x34, 0x5c, 0xcc, 0xcf, 0x52, 0x78, 0xcd, 0xcc, 0x10, 0x24, - 0x74, 0x0c, 0x0b, 0x44, 0x0d, 0x0d, 0x65, 0x23, 0x45, 0x97, 0x3d, 0x69, 0x85, 0x2c, 0x13, 0xab, 0x1e, 0x55, 0xb3, 0x43, 0x4c, 0x1c, 0x90, 0x7d, 0x86, 0x86, 0xc1, 0xaf, 0x4c, 0x00, 0xaf, 0xc4, - 0xf0, 0x14, 0xcd, 0x71, 0x33, 0x94, 0x5e, 0xaf, 0xae, 0xbe, 0x36, 0x33, 0x84, 0x1e, 0x2c, 0x12, 0xfc, 0x70, 0x21, 0xed, 0xd5, 0x35, 0xd4, 0xcf, 0x8c, 0xbb, 0x69, 0xfc, 0xf8, 0xba, 0x47, 0xae, - 0x82, 0x9f, 0x4b, 0xca, 0x99, 0x26, 0xd8, 0xb9, 0x1c, 0xb5, 0xcd, 0x49, 0x26, 0x67, 0x60, 0x82, 0xfa, 0x07, 0x05, 0x98, 0xae, 0x98, 0x98, 0x9c, 0xd7, 0xc5, 0x3e, 0x1d, 0xa7, 0xd8, 0x84, 0xd7, - 0xe8, 0x3e, 0xe2, 0xac, 0x49, 0x5a, 0x22, 0xb7, 0x33, 0x57, 0x45, 0x51, 0x48, 0x18, 0xec, 0x47, 0x16, 0x66, 0xa0, 0x29, 0x5e, 0xaf, 0x62, 0x57, 0x9f, 0x23, 0x04, 0x0e, 0xf9, 0x24, 0x33, 0x9f, - 0x11, 0x0b, 0xbe, 0x5b, 0x0b, 0xe3, 0x85, 0x8f, 0xce, 0x86, 0x71, 0xb2, 0x74, 0x2b, 0xf4, 0x69, 0x29, 0x93, 0x9f, 0x31, 0xef, 0x3b, 0x98, 0xaf, 0x1c, 0xd1, 0x7f, 0x64, 0xb7, 0xbb, 0x90, 0x6d, - 0x7a, 0xdc, 0xe5, 0xa4, 0x6d, 0x67, 0x3b, 0x18, 0x5d, 0x1d, 0xef, 0x19, 0x6e, 0xb2, 0xd2, 0x17, 0xc0, 0xd8, 0xd3, 0x2b, 0x59, 0xd4, 0xba, 0xec, 0xce, 0x19, 0xeb, 0x54, 0x68, 0xcf, 0x52, 0x88, - 0x57, 0x9d, 0x3e, 0x3d, 0x2c, 0x59, 0x77, 0x5c, 0x51, 0x71, 0xb1, 0x56, 0x35, 0xe4, 0xa0, 0xf8, 0x0e, 0x10, 0xee, 0xd4, 0x4c, 0x08, 0x95, 0x39, 0xd0, 0x1f, 0x4a, 0xbd, 0x39, 0x91, 0x2e, 0x62, - 0x64, 0x5c, 0x8f, 0x9d, 0xb1, 0x52, 0x97, 0xb3, 0x01, 0xf5, 0x0c, 0xd2, 0xc7, 0x9d, 0xcd, 0xcd, 0x3a, 0x6a, 0x6a, 0x17, 0xc1, 0x65, 0xe5, 0xab, 0xe9, 0x51, 0x37, 0x0b, 0x2b, 0x6e, 0xd6, 0x31, - 0x8e, 0x16, 0x6e, 0xa4, 0x79, 0xa6, 0x9e, 0xbf, 0xdf, 0xf3, 0x79, 0x9b, 0x8d, 0x4b, 0xc2, 0xf3, 0x1d, 0x0a, 0xa7, 0x27, 0x3b, 0x6e, 0x76, 0xff, 0xe1, 0x73, 0xf3, 0x7b, 0xf5, 0xf4, 0x2f, 0xe1, - 0x5b, 0xa7, 0x2d, 0x9f, 0xdf, 0xe2, 0x34, 0xca, 0xa3, 0xfc, 0x10, 0x9b, 0x6f, 0x96, 0xaf, 0xda, 0x97, 0x7b, 0x91, 0x3f, 0xb2, 0x23, 0xb7, 0x8e, 0xe3, 0x6a, 0xf8, 0xee, 0x3e, 0x1a, 0xcf, 0xa1, - 0x97, 0x4a, 0x7d, 0x9c, 0x69, 0x5e, 0xa4, 0xca, 0xcd, 0x3a, 0xd0, 0xf3, 0x92, 0x1f, 0x70, 0x27, 0x43, 0xc2, 0x35, 0x00, 0x23, 0x54, 0x1f, 0x20, 0xe7, 0xf2, 0x0e, 0x58, 0x64, 0x1c, 0x0b, 0x90, - 0xfa, 0x6c, 0x53, 0xd7, 0xe2, 0x0f, 0xa7, 0x03, 0x86, 0x69, 0xb9, 0xa1, 0xd9, 0x89, 0xd3, 0x28, 0x36, 0xd3, 0xdc, 0x7d, 0x18, 0xa4, 0x06, 0xbf, 0xf8, 0x79, 0x9f, 0xa8, 0x37, 0x1f, 0xfa, 0xe9, - 0x5a, 0xd3, 0x8b, 0x5a, 0x4c, 0x10, 0x50, 0x3e, 0xb1, 0xb6, 0x13, 0x0f, 0xf1, 0xa7, 0xb5, 0xc1, 0x2f, 0x2d, 0x4a, 0x19, 0x29, 0x7d, 0x70, 0x05, 0x28, 0xc5, 0x01, 0xa0, 0x6d, 0x96, 0xb0, 0x60, - 0x02, 0x33, 0xa9, 0x09, 0x52, 0x91, 0x86, 0x1d, 0xc6, 0x93, 0x5e, 0x4a, 0xb3, 0x66, 0x3a, 0xdc, 0xc6, 0x3c, 0x46, 0x8c, 0xb6, 0x5b, 0xdd, 0x0b, 0x77, 0xc6, 0x7c, 0xc6, 0x7b, 0xf3, 0x5d, 0xb7, - 0x47, 0xac, 0x06, 0x34, 0x05, 0xa0, 0xcb, 0x89, 0xff, 0x0b, 0x86, 0xd6, 0x57, 0x11, 0x86, 0xde, 0xe0, 0x9f, 0x2f, 0x42, 0xde, 0x64, 0xd4, 0x3e, 0xe3, 0xd3, 0x77, 0xe1, 0x9f, 0xaf, 0x18, 0x69, - 0x0d, 0xcd, 0x77, 0x9e, 0x18, 0x6d, 0x16, 0x83, 0xe0, 0xce, 0x61, 0x8b, 0x68, 0x75, 0x69, 0xac, 0x0d, 0xda, 0x15, 0xfa, 0xa2, 0x1f, 0x0f, 0x16, 0x43, 0x05, 0xc3, 0x33, 0x2b, 0x8e, 0xf9, 0x1f, - 0x0b, 0xdf, 0x27, 0xb7, 0xef, 0x1f, 0xf9, 0x6d, 0xd7, 0xa4, 0x9b, 0x4f, 0xbc, 0xbe, 0xd0, 0xe6, 0x4b, 0x8f, 0x32, 0xa7, 0x1c, 0x96, 0x2c, 0x39, 0xb3, 0xba, 0xb0, 0x3a, 0xa5, 0xa1, 0xc5, 0x7e, - 0x8a, 0x4d, 0x86, 0xe9, 0x84, 0xa3, 0x37, 0x3e, 0xd9, 0x37, 0x32, 0x98, 0xed, 0x05, 0x7d, 0x43, 0x8f, 0x56, 0x6a, 0xb5, 0x09, 0xa7, 0x2c, 0xb9, 0x64, 0x9d, 0x78, 0x66, 0xe7, 0xc5, 0x68, 0x84, - 0xa8, 0xbd, 0x9d, 0x4d, 0xaa, 0xa4, 0xb8, 0xc4, 0x60, 0x6f, 0x3f, 0x5f, 0x2a, 0x30, 0x19, 0x63, 0x2b, 0x63, 0x18, 0xf2, 0xdc, 0x0e, 0xe5, 0x9f, 0xc9, 0xdc, 0x53, 0x65, 0xd8, 0xae, 0xca, 0xb8, - 0x61, 0xd6, 0xaa, 0x6f, 0x3f, 0x4a, 0x9b, 0x86, 0x5f, 0x8a, 0x51, 0x38, 0xd3, 0x6c, 0xf0, 0x6c, 0x8e, 0x1a, 0x20, 0x5b, 0x38, 0x89, 0xd2, 0xcd, 0x72, 0x0e, 0x69, 0x16, 0x80, 0x87, 0x90, 0x18, - 0x85, 0x99, 0x06, 0x2c, 0x57, 0x2b, 0x6b, 0x66, 0x8d, 0x32, 0x37, 0x10, 0x30, 0xae, 0x9f, 0x07, 0xe1, 0x28, 0x9e, 0x73, 0x5b, 0x4a, 0x84, 0x65, 0xa6, 0x9e, 0xf8, 0x62, 0xca, 0xf2, 0x96, 0x11, - 0x69, 0x29, 0x15, 0x8e, 0x05, 0x21, 0x5b, 0xd8, 0x6b, 0xe6, 0xc0, 0x2f, 0x12, 0x73, 0x49, 0x8b, 0x75, 0xb0, 0x96, 0xf9, 0x84, 0xac, 0xcb, 0x95, 0xfb, 0xba, 0x0a, 0x3c, 0xd7, 0x2e, 0xb9, 0x37, - 0x69, 0x4f, 0xd5, 0x38, 0x6e, 0x7e, 0x79, 0xab, 0xe9, 0x93, 0x6b, 0x59, 0x0f, 0x00, 0xc6, 0x5e, 0x0a, 0xc9, 0x3e, 0x12, 0x3c, 0xa2, 0xeb, 0x5a, 0x56, 0x07, 0x6b, 0x17, 0x88, 0x8d, 0x53, 0x7e, - 0xb0, 0x9f, 0x2c, 0x7b, 0x18, 0x3d, 0x3b, 0x4c, 0x6b, 0x80, 0xe3, 0x78, 0xb9, 0xf6, 0x85, 0x7e, 0x6c, 0x43, 0xdd, 0xc1, 0x0a, 0x30, 0x4b, 0x42, 0xe1, 0x4d, 0xb4, 0x1c, 0xbb, 0x8e, 0x6d, 0xec, - 0x6b, 0x5b, 0xaf, 0x14, 0x6a, 0x15, 0xf5, 0xfb, 0xf3, 0xa0, 0x37, 0x65, 0x94, 0x61, 0x77, 0x1a, 0x24, 0xd6, 0x2a, 0x9a, 0xf1, 0xfc, 0x24, 0xce, 0xf3, 0xd1, 0x56, 0x5a, 0x0d, 0x89, 0x82, 0xdd, - 0x92, 0xbf, 0x3c, 0x59, 0x42, 0xdb, 0x4d, 0x3f, 0xdd, 0xf4, 0x12, 0x40, 0x74, 0x7f, 0x1a, 0xff, 0x8a, 0xe9, 0x7b, 0x21, 0xda, 0xe0, 0x78, 0x3a, 0x6c, 0x12, 0x84, 0x5a, 0x58, 0x6a, 0xeb, 0x5d, - 0xba, 0x8e, 0xbb, 0xc3, 0x05, 0x36, 0xd9, 0x58, 0x93, 0xe1, 0xb6, 0x16, 0xa6, 0x81, 0x54, 0x0c, 0x57, 0x2e, 0x2c, 0xaf, 0x07, 0x56, 0x95, 0xa1, 0x24, 0x19, 0x76, 0x75, 0x1d, 0xc7, 0xc1, 0x5c, - 0x23, 0xd8, 0x22, 0x39, 0x0c, 0x88, 0x58, 0x17, 0xf1, 0x9e, 0xe6, 0x72, 0xfd, 0xcc, 0x51, 0xd9, 0x78, 0xdb, 0x2d, 0x89, 0x48, 0x5d, 0xa6, 0xc8, 0x86, 0x61, 0x5d, 0x63, 0x18, 0xf0, 0x95, 0x51, - 0x7f, 0x0e, 0xa1, 0xf9, 0x81, 0x98, 0x36, 0x4e, 0xa8, 0x4b, 0xc8, 0xc2, 0x39, 0xac, 0xf4, 0x02, 0x6a, 0x5b, 0x56, 0xb4, 0x72, 0x22, 0x45, 0x7a, 0x9e, 0xba, 0xe1, 0x23, 0x1f, 0xc0, 0x6b, 0x3b, - 0x96, 0x5c, 0x88, 0x1e, 0xd9, 0x70, 0x3e, 0x6c, 0xbb, 0x43, 0xc9, 0x61, 0x09, 0x88, 0xb8, 0x8b, 0x3a, 0xb4, 0x45, 0x0e, 0xe9, 0x9d, 0x81, 0x4d, 0x86, 0x94, 0x4a, 0x9a, 0xf4, 0x6c, 0xb6, 0x9e, - 0x0d, 0xa7, 0x92, 0xda, 0xaf, 0xaa, 0xed, 0x5a, 0x76, 0xbd, 0xd1, 0x96, 0x27, 0xeb, 0xd4, 0xdf, 0xb2, 0x3c, 0x44, 0x0f, 0x36, 0x9c, 0xe7, 0xcd, 0xd7, 0xfe, 0x5a, 0x81, 0x17, 0x36, 0x29, 0xab, - 0x86, 0xa1, 0x98, 0x23, 0x36, 0x70, 0xbb, 0xde, 0x00, 0xe5, 0x82, 0xc4, 0x15, 0x9f, 0x16, 0x11, 0xfd, 0x66, 0xd3, 0x92, 0xec, 0x76, 0x57, 0xf3, 0x9f, 0x6b, 0x79, 0xa2, 0xe5, 0xc2, 0xba, 0x11, - 0xe5, 0xae, 0x1d, 0x46, 0x0f, 0x1d, 0xd8, 0xd0, 0x4b, 0xe1, 0xb6, 0xef, 0x54, 0x1b, 0x56, 0x9c, 0x8f, 0x1b, 0x4b, 0xb3, 0xc5, 0xf0, 0x22, 0x0f, 0x87, 0xc3, 0xb5, 0xb5, 0x54, 0x8b, 0x22, 0x53, - 0x57, 0x63, 0x06, 0xa0, 0x2c, 0x7b, 0x05, 0xcc, 0x56, 0x25, 0xbd, 0xd9, 0x31, 0x52, 0xb0, 0x2a, 0xc9, 0x6c, 0x47, 0x84, 0x91, 0xc7, 0x2a, 0x4a, 0x59, 0x08, 0xf2, 0x6c, 0x28, 0x1f, 0x20, 0x65, - 0x87, 0xc9, 0x31, 0x27, 0xb2, 0x44, 0x9f, 0xf5, 0x96, 0x90, 0x17, 0xd3, 0x95, 0xde, 0x63, 0x4a, 0x0e, 0x33, 0x23, 0xab, 0x3c, 0xd4, 0xb4, 0xbe, 0x60, 0x5f, 0xe7, 0x45, 0xe0, 0x86, 0xee, 0x47, - 0x86, 0x22, 0x7a, 0xbf, 0x9e, 0xe1, 0x97, 0xcd, 0x3d, 0x4e, 0x9f, 0xdc, 0xe0, 0xa4, 0xb9, 0x21, 0x78, 0x39, 0x7d, 0xce, 0x10, 0x33, 0x88, 0xbc, 0xef, 0x0b, 0xb8, 0x52, 0x2f, 0x75, 0x8e, 0x2b, - 0xba, 0x60, 0xe7, 0xfa, 0xac, 0x43, 0xb5, 0xeb, 0x22, 0xfc, 0xd2, 0xdb, 0xd6, 0xfa, 0x7a, 0x26, 0xf4, 0x20, 0xb3, 0xea, 0x71, 0x71, 0x0d, 0xf1, 0xfb, 0x78, 0x3b, 0x28, 0x2b, 0x9b, 0x38, 0x78, - 0x07, 0x78, 0x36, 0x44, 0xf7, 0xb9, 0x19, 0x25, 0x35, 0x81, 0x61, 0x2b, 0x26, 0x02, 0x17, 0x73, 0x3b, 0x4c, 0x61, 0x70, 0x38, 0xcc, 0x01, 0x57, 0x47, 0xdd, 0xb1, 0x54, 0x8b, 0x54, 0xbf, 0x40, - 0x25, 0x83, 0x87, 0xb1, 0xa5, 0x5a, 0x85, 0x2b, 0x39, 0x18, 0xf6, 0x89, 0x1f, 0x07, 0x3b, 0x98, 0x61, 0xb3, 0x04, 0xf2, 0x78, 0x35, 0x0a, 0x7d, 0xa1, 0x0e, 0xd8, 0x85, 0xe8, 0x11, 0x98, 0xf3, - 0x61, 0xa7, 0xa1, 0xf4, 0x1c, 0x95, 0x83, 0x37, 0x0b, 0xe7, 0x29, 0x0a, 0xe3, 0xe0, 0xc0, 0x5b, 0x62, 0xf5, 0x28, 0x93, 0xf7, 0x5b, 0xbb, 0xd8, 0xca, 0xf3, 0x39, 0x62, 0xc2, 0xb3, 0x09, 0x66, - 0x90, 0x7d, 0x52, 0x11, 0xa6, 0xee, 0x61, 0xcb, 0xe8, 0xda, 0x80, 0x76, 0x25, 0xfe, 0x30, 0x62, 0x01, 0xa4, 0x2a, 0x03, 0xa4, 0x22, 0x80, 0x58, 0x01, 0x23, 0x83, 0xef, 0x91, 0xfa, 0x62, 0xe7, - 0x39, 0xd9, 0x5c, 0xf3, 0xf3, 0x8a, 0x16, 0xd2, 0xe9, 0x2f, 0x98, 0x19, 0x37, 0x65, 0xcf, 0x5f, 0xdb, 0x07, 0xfe, 0xaf, 0x7f, 0xa1, 0x5a, 0xad, 0x0c, 0x9a, 0x69, 0x1a, 0xa5, 0x9d, 0x87, 0x62, - 0x0a, 0xbf, 0x54, 0x0d, 0xfc, 0x42, 0xf4, 0xc8, 0x8a, 0xf3, 0x61, 0xb3, 0xfa, 0xde, 0x62, 0xdc, 0x20, 0x8d, 0x01, 0x37, 0x0b, 0x12, 0x73, 0xb0, 0xec, 0xe7, 0x88, 0x42, 0x67, 0x4c, 0xea, 0x46, - 0xe9, 0x24, 0x0c, 0x51, 0x05, 0x89, 0x3d, 0xc0, 0x32, 0xba, 0xbb, 0x60, 0x44, 0x88, 0xd1, 0xba, 0xc2, 0x40, 0x90, 0x9d, 0x02, 0xae, 0xde, 0xa7, 0x2d, 0x1d, 0x92, 0xc9, 0x64, 0xcc, 0xb8, 0x59, - 0x92, 0x4a, 0xd9, 0x44, 0xf2, 0x2a, 0xcc, 0x9a, 0x0d, 0x0e, 0x48, 0xbc, 0xee, 0x0a, 0xc9, 0x32, 0x67, 0xa9, 0x5f, 0xd8, 0xf5, 0xa4, 0x71, 0x7a, 0xa4, 0xea, 0xc1, 0xcd, 0x4e, 0x23, 0x07, 0xd4, - 0x32, 0x31, 0xd1, 0xcc, 0x3a, 0x97, 0x1d, 0x9d, 0x1e, 0x4f, 0x8d, 0xbb, 0x2f, 0x94, 0x88, 0xba, 0x22, 0x7c, 0x44, 0xf7, 0xe3, 0xac, 0x73, 0x22, 0xf8, 0x1c, 0xe1, 0x9e, 0x8a, 0x0c, 0x11, 0x60, - 0x61, 0xa0, 0x1a, 0xb1, 0xdb, 0xf7, 0xe5, 0x89, 0x34, 0xc0, 0x24, 0x75, 0x4d, 0x90, 0x7a, 0x4d, 0x4f, 0x0f, 0xbd, 0x12, 0xad, 0xc9, 0x95, 0xe0, 0x6c, 0x17, 0x32, 0x0e, 0x6d, 0xe9, 0x3d, 0xa0, - 0x69, 0xd9, 0x56, 0xe9, 0xee, 0xc5, 0x39, 0xe6, 0xf3, 0x33, 0xb5, 0x36, 0xe7, 0xc5, 0xc0, 0x3f, 0x68, 0x9b, 0x11, 0xb4, 0xc2, 0xf8, 0xb4, 0x98, 0x47, 0x19, 0x99, 0xc8, 0x11, 0x6e, 0xbd, 0x6e, - 0xac, 0x5c, 0xe7, 0x28, 0x5e, 0xb2, 0xed, 0xfe, 0xd7, 0x47, 0xb3, 0x99, 0x75, 0xf2, 0xa8, 0x13, 0xa7, 0x6e, 0xe0, 0x36, 0xdb, 0xd3, 0xfd, 0xdb, 0x7b, 0x76, 0xe8, 0xd5, 0x4d, 0x2f, 0x26, 0xf6, - 0xdd, 0xb9, 0x25, 0x3b, 0x04, 0x5a, 0xe4, 0x77, 0x8c, 0xf3, 0xae, 0x76, 0x67, 0x5e, 0x7d, 0x0d, 0x38, 0x75, 0xd4, 0x8f, 0xe9, 0x3b, 0xfa, 0xa9, 0xe1, 0x4c, 0xe4, 0xc1, 0x0d, 0x47, 0x96, 0xa4, - 0xa1, 0xea, 0x77, 0x32, 0x3f, 0xca, 0x1f, 0xdc, 0x92, 0x75, 0x8e, 0xa8, 0xa8, 0x9a, 0xff, 0xf1, 0xbd, 0x9f, 0x1d, 0x6d, 0xa1, 0x69, 0xab, 0x47, 0x40, 0x3a, 0xb5, 0x99, 0x46, 0xbf, 0xdf, 0x8d, - 0x75, 0xfd, 0xe4, 0x6a, 0x83, 0xbf, 0xd0, 0xc8, 0x1c, 0x35, 0xbd, 0x14, 0x13, 0xeb, 0xbc, 0x27, 0x7b, 0xdf, 0x61, 0xc2, 0xf1, 0xde, 0x8f, 0xa0, 0xda, 0x63, 0x33, 0xf9, 0xa9, 0xb9, 0x32, 0xd5, - 0x5d, 0x6a, 0x5a, 0xf7, 0x1f, 0xbf, 0x78, 0xf5, 0xc2, 0x2c, 0xfe, 0xf0, 0x0b, 0xc2, 0xc8, 0x2d, 0xa2, 0x4f, 0x7d, 0x7b, 0xa7, 0x1b, 0xde, 0xd4, 0x2c, 0x73, 0xed, 0xf0, 0x7d, 0x5c, 0xbc, 0x79, - 0xd1, 0xe9, 0x47, 0x5e, 0xb9, 0xff, 0xf2, 0xd4, 0x0d, 0xcc, 0x2b, 0xd1, 0xc2, 0x9e, 0xde, 0x9d, 0xe5, 0x6a, 0x9a, 0xdf, 0xbf, 0xbf, 0x08, 0xb5, 0x68, 0xff, 0x45, 0x14, 0x5f, 0x5a, 0xa2, 0xfd, - 0xe7, 0xd4, 0x43, 0xbb, 0x1e, 0x3b, 0x6e, 0x1a, 0xae, 0x24, 0xe5, 0x91, 0x17, 0xef, 0xe7, 0x93, 0xfe, 0x0b, 0x51, 0xb0, 0xf3, 0x7e, 0xd8, 0x36, 0x24, 0x73, 0x57, 0x2e, 0x8c, 0x3d, 0x9b, 0xed, - 0x15, 0xcf, 0xa9, 0xe5, 0x0d, 0x44, 0x2a, 0xe1, 0xf4, 0x60, 0xd4, 0x4b, 0x58, 0x92, 0x41, 0x69, 0xec, 0x4b, 0x32, 0xc7, 0x6d, 0xb1, 0xed, 0x74, 0x4a, 0x91, 0x26, 0x4a, 0x46, 0x72, 0x0f, 0xeb, - 0xb2, 0xd6, 0x6e, 0x9a, 0xd8, 0x07, 0x60, 0xe5, 0x0d, 0x22, 0x3d, 0xaa, 0x0e, 0x48, 0x57, 0x9f, 0x94, 0xfa, 0xd2, 0x2d, 0x80, 0xdd, 0xa8, 0x24, 0x11, 0xca, 0x93, 0xa4, 0xd5, 0xeb, 0x4a, 0xe0, - 0xc9, 0x10, 0x75, 0xec, 0xf2, 0x79, 0x74, 0x92, 0xa6, 0x5c, 0xb5, 0xaf, 0x06, 0x8c, 0xff, 0xee, 0x72, 0xf1, 0xa5, 0xe3, 0x3e, 0x90, 0x8e, 0x57, 0xd6, 0x7a, 0x6f, 0x69, 0x83, 0x9d, 0x4f, 0x17, - 0x3a, 0x27, 0xb2, 0xcf, 0x65, 0x85, 0x8b, 0x90, 0x9a, 0x82, 0xb4, 0xd5, 0xa8, 0x1c, 0xfb, 0x11, 0x07, 0x6c, 0xeb, 0x45, 0x10, 0x2b, 0x2b, 0xd1, 0xa4, 0x48, 0x20, 0xe9, 0x2d, 0x03, 0x5a, 0x9e, - 0x28, 0xec, 0xda, 0xde, 0x77, 0xf5, 0x02, 0x98, 0xb0, 0xe9, 0x06, 0x51, 0x58, 0x0e, 0x44, 0x73, 0xfe, 0x00, 0xd8, 0x1b, 0x4d, 0xe9, 0x4b, 0xab, 0x61, 0x86, 0xf0, 0xd4, 0xd6, 0xd8, 0x0b, 0x9a, - 0xe0, 0x90, 0x9b, 0x5e, 0xee, 0x06, 0xdd, 0x2d, 0xf4, 0x4c, 0x56, 0xfe, 0x33, 0x58, 0xf2, 0x49, 0xed, 0xdd, 0x87, 0xfe, 0x95, 0x22, 0x86, 0x9f, 0x68, 0x9f, 0xcc, 0x88, 0xeb, 0x2b, 0xcd, 0x7a, - 0x7b, 0x0b, 0xb7, 0x87, 0xc8, 0x08, 0xbe, 0x6f, 0x2b, 0xe3, 0x5c, 0x95, 0xa3, 0x6e, 0xe0, 0x6e, 0x69, 0x7d, 0xca, 0x38, 0x92, 0xac, 0x72, 0x33, 0x6f, 0x3c, 0x40, 0xe7, 0xdb, 0x0c, 0x5e, 0xb9, - 0x06, 0x4b, 0xf6, 0x2a, 0xb7, 0xef, 0xc1, 0xbb, 0xed, 0x7e, 0x62, 0x8a, 0x92, 0x9e, 0x4f, 0x7b, 0x66, 0xdd, 0x13, 0x38, 0x5c, 0x99, 0x2c, 0x38, 0xc8, 0x46, 0x46, 0xf6, 0x3c, 0x24, 0x26, 0x15, - 0x8d, 0x8d, 0x24, 0xca, 0x5d, 0xc4, 0x8f, 0x0a, 0x88, 0xb7, 0xe8, 0xa6, 0x5f, 0xd5, 0xe6, 0x57, 0x95, 0xd7, 0x66, 0x7d, 0xea, 0xa4, 0xbe, 0xaf, 0xfa, 0xfa, 0x7f, 0x9b, 0x6e, 0xac, 0xab, 0xf1, - 0x65, 0xcb, 0xbd, 0xd3, 0x80, 0xfb, 0x5d, 0xb5, 0xd7, 0x57, 0x6c, 0xcf, 0xaf, 0x2f, 0x68, 0xa4, 0xe7, 0xeb, 0xe5, 0x36, 0xa5, 0x49, 0xe1, 0xce, 0x10, 0xe1, 0x7a, 0x2b, 0x77, 0x28, 0x26, 0x33, - 0x10, 0x49, 0xbd, 0xe2, 0x50, 0x57, 0xa3, 0xde, 0xc1, 0xe1, 0xa7, 0x4e, 0x7e, 0x7f, 0x41, 0xaa, 0x2d, 0x03, 0xa0, 0x37, 0xaa, 0x95, 0xdf, 0xe4, 0xbc, 0x67, 0xf1, 0x7d, 0x8c, 0xc8, 0x37, 0x84, - 0x78, 0x61, 0x5c, 0x3b, 0xef, 0x05, 0xdd, 0x39, 0x1f, 0x74, 0x4e, 0x64, 0x9e, 0x77, 0x26, 0x6c, 0x01, 0xbb, 0xe6, 0xc2, 0xc2, 0x11, 0xd0, 0xad, 0x75, 0xa5, 0x4f, 0xf6, 0xfc, 0xe9, 0x01, 0x27, - 0x8a, 0x11, 0xc7, 0xb1, 0x53, 0x89, 0xc4, 0xb6, 0x75, 0x8d, 0x8c, 0x4a, 0xc4, 0x27, 0x76, 0xac, 0xba, 0x2d, 0xfb, 0x45, 0x77, 0x0f, 0x54, 0x3c, 0x8d, 0x1b, 0x4a, 0x2f, 0x5d, 0x4d, 0xa9, 0xe5, - 0x76, 0xb8, 0x59, 0x6e, 0x57, 0xc8, 0xb6, 0x67, 0x93, 0xd0, 0x40, 0x5f, 0xe3, 0x5b, 0x3c, 0x1c, 0x0e, 0x67, 0xa3, 0x67, 0xe3, 0xd8, 0xe3, 0xce, 0xf4, 0xef, 0x9a, 0xaa, 0x99, 0x3e, 0xa8, 0x47, - 0x86, 0xd9, 0xb1, 0xd2, 0x73, 0x7e, 0x08, 0x79, 0x1c, 0x93, 0xe1, 0x9b, 0xfe, 0xf2, 0xef, 0xe7, 0xef, 0x3d, 0xfd, 0x4b, 0x4f, 0xa6, 0xf5, 0x97, 0xdd, 0x1b, 0x2f, 0x79, 0x7e, 0xc4, 0x69, 0x45, - 0xfe, 0xaa, 0xe5, 0x92, 0x25, 0x7e, 0x27, 0xfd, 0xfd, 0x36, 0xe6, 0xf0, 0x54, 0xe8, 0xe8, 0x46, 0xf1, 0xde, 0x56, 0x30, 0xbd, 0x79, 0xe1, 0x95, 0x6b, 0xf2, 0xce, 0xee, 0x16, 0x57, 0xfe, 0x87, - 0xa3, 0xdd, 0x8c, 0x5e, 0xf5, 0x85, 0xdf, 0xde, 0xf7, 0xea, 0xce, 0xf4, 0xe8, 0xec, 0x41, 0xc5, 0x3f, 0x9b, 0xa2, 0xe7, 0x3b, 0xae, 0xdd, 0x7b, 0x9f, 0x22, 0x4f, 0xbe, 0xdf, 0xef, 0xfb, 0xe6, - 0xc6, 0x38, 0x35, 0xcd, 0xf3, 0xf7, 0xa1, 0x9f, 0x5f, 0x93, 0x14, 0x66, 0x7a, 0x38, 0x8f, 0x44, 0x5f, 0x76, 0x14, 0xff, 0xec, 0x5d, 0xbc, 0x6a, 0xb4, 0x5c, 0xdf, 0xec, 0x98, 0x61, 0x9e, 0x1e, - 0x3a, 0xba, 0xaa, 0x3b, 0xe6, 0x19, 0x7c, 0xe8, 0xfe, 0xb4, 0xa9, 0x29, 0x0e, 0x6e, 0x74, 0x34, 0x5f, 0xd5, 0x77, 0x9d, 0xfc, 0xf2, 0x73, 0xbe, 0x0c, 0x8d, 0x9f, 0x52, 0x7f, 0xcf, 0xdb, 0x2f, - 0x7f, 0xba, 0x41, 0xbd, 0xcc, 0x7b, 0x4e, 0x59, 0xb9, 0xd7, 0x23, 0xeb, 0xc5, 0x43, 0x79, 0x62, 0x17, 0x71, 0xd3, 0x16, 0xc4, 0x51, 0x9a, 0x77, 0xac, 0xd4, 0xcc, 0x1e, 0x6c, 0x48, 0xe2, 0x06, - 0x45, 0x1a, 0x14, 0xa9, 0xa3, 0xbe, 0x4f, 0xc4, 0xbf, 0x0e, 0xee, 0x97, 0x9c, 0xe2, 0xaf, 0xa2, 0xe4, 0x65, 0x9d, 0x83, 0x1a, 0xbc, 0xa7, 0x19, 0xa2, 0xf7, 0xf2, 0x0c, 0x3f, 0x6d, 0x58, 0xda, - 0xa9, 0xdc, 0xdc, 0x89, 0x8a, 0xd3, 0x76, 0xa6, 0x97, 0x0d, 0x4c, 0xbf, 0x60, 0xe2, 0x9b, 0x65, 0x78, 0x5f, 0xe4, 0xfd, 0xc8, 0xb8, 0xfc, 0x56, 0xec, 0x0d, 0x26, 0xdf, 0x90, 0xdb, 0xba, 0x0f, - 0x77, 0xfc, 0x91, 0x57, 0xcd, 0xa1, 0x9a, 0x17, 0xa9, 0xea, 0x77, 0xf4, 0x28, 0x38, 0x02, 0x7e, 0x5f, 0x02, 0xce, 0x89, 0xca, 0xf9, 0xb9, 0x4a, 0x00, 0xf4, 0xd6, 0xfd, 0x92, 0x21, 0x6b, 0xa7, - 0x97, 0x14, 0xd9, 0x2f, 0x82, 0x77, 0x1a, 0xa7, 0xe3, 0x0b, 0x24, 0x9f, 0x02, 0x55, 0xcd, 0xa0, 0x34, 0x2f, 0xc5, 0x07, 0x3e, 0x4d, 0xb6, 0x8f, 0x08, 0xc5, 0x1d, 0x35, 0xcc, 0xdc, 0x77, 0xa9, - 0x82, 0xbe, 0xb6, 0x37, 0x98, 0xea, 0x51, 0xf0, 0x11, 0x2e, 0xf2, 0xe5, 0x25, 0xf9, 0xbb, 0xa6, 0x26, 0x3e, 0x7f, 0x7f, 0x6e, 0xee, 0xf3, 0xce, 0x47, 0x3b, 0xf4, 0xf6, 0x69, 0xb2, 0x58, 0x52, - 0x0d, 0x34, 0x47, 0x29, 0xff, 0x90, 0x6f, 0xa4, 0x99, 0x47, 0x9f, 0x6f, 0xfa, 0xc6, 0xab, 0xfb, 0x3e, 0xea, 0x37, 0x4e, 0xdd, 0xd3, 0xd9, 0x9b, 0x97, 0xfd, 0x50, 0xcd, 0x37, 0x5b, 0xef, 0x23, - 0xef, 0x5b, 0xef, 0x3f, 0xd8, 0xc8, 0xbf, 0x8d, 0xd2, 0xbf, 0xb3, 0xaf, 0x7e, 0xeb, 0xcd, 0xf4, 0xcf, 0xe3, 0x8c, 0x1e, 0x85, 0x96, 0x6b, 0x77, 0xe2, 0xd4, 0xcc, 0x73, 0xf7, 0xa1, 0x5f, 0x95, - 0x7a, 0x29, 0xb9, 0xe6, 0xfe, 0x2b, 0x3e, 0x14, 0xdc, 0xa7, 0x86, 0x0e, 0xd5, 0x2e, 0xcd, 0x86, 0xb6, 0x95, 0x62, 0x2a, 0x2f, 0xcd, 0x49, 0x5d, 0xfa, 0x53, 0x70, 0x25, 0x7b, 0x7b, 0x70, 0xab, - 0x91, 0x14, 0xb9, 0x12, 0x11, 0x62, 0x21, 0xa3, 0xf6, 0xd0, 0xeb, 0xa1, 0xae, 0x3b, 0x28, 0x8d, 0x2c, 0x06, 0x11, 0x8d, 0xb7, 0x56, 0xa3, 0xb5, 0xbc, 0x9a, 0x93, 0xb9, 0xb7, 0xcf, 0xbd, 0x25, - 0x64, 0x02, 0xdc, 0x1c, 0x83, 0xba, 0xfa, 0xdc, 0x9f, 0x97, 0xb3, 0x9d, 0xe8, 0x47, 0x35, 0xc5, 0x74, 0x61, 0xf3, 0xd9, 0x02, 0xc1, 0x03, 0x59, 0xb8, 0x83, 0x5f, 0x23, 0x1b, 0xba, 0xef, 0xde, - 0x15, 0x8c, 0xef, 0xb7, 0xad, 0xfd, 0x90, 0xaf, 0xf6, 0xa9, 0x91, 0xe7, 0xdf, 0x71, 0xca, 0x78, 0xcf, 0xcd, 0xf4, 0xf4, 0x53, 0x0e, 0x0f, 0x18, 0x89, 0xbd, 0x14, 0xa1, 0xfd, 0xe0, 0x1d, 0x1f, - 0x9c, 0xfc, 0xdc, 0xd2, 0x94, 0x58, 0x69, 0xc1, 0xca, 0x51, 0x26, 0x4b, 0xf9, 0x70, 0x3f, 0x80, 0x9d, 0x94, 0x23, 0x7c, 0x7e, 0xed, 0x2e, 0x7d, 0x78, 0xad, 0x0d, 0x55, 0x77, 0x0e, 0xc1, 0xa6, - 0x44, 0xec, 0xea, 0x43, 0x65, 0x6c, 0x61, 0x19, 0xa8, 0xa7, 0x3a, 0xc4, 0xcf, 0x81, 0xb0, 0xea, 0x87, 0xb2, 0xbb, 0xec, 0xca, 0x23, 0x6a, 0xa4, 0x0a, 0x92, 0xec, 0x48, 0xa6, 0x38, 0x9e, 0xfa, - 0x4c, 0x7f, 0x3d, 0xd2, 0x36, 0xa3, 0x19, 0xcd, 0x61, 0xdb, 0xb1, 0x46, 0x3f, 0x0b, 0x77, 0xf8, 0xc6, 0x74, 0xc9, 0x0f, 0xf1, 0xb5, 0x71, 0x77, 0x1e, 0xc3, 0x6e, 0x5c, 0x6c, 0x9f, 0x36, 0xc2, - 0x3c, 0x65, 0x83, 0xdf, 0x0c, 0x73, 0xd7, 0x86, 0xc9, 0x7d, 0xe5, 0x9e, 0x16, 0xbe, 0xd9, 0x31, 0x22, 0xfd, 0xc3, 0x5f, 0x85, 0xdf, 0x2a, 0x00, 0xfb, 0xc6, 0x13, 0xf8, 0x45, 0x29, 0xc5, 0x7e, - 0x91, 0xde, 0x6f, 0x39, 0x9b, 0xd2, 0x95, 0x6b, 0xe4, 0xce, 0xfb, 0xaf, 0xbb, 0xbd, 0xe3, 0x52, 0x25, 0xc6, 0x39, 0xc4, 0x66, 0xea, 0xbb, 0xe1, 0xee, 0x7a, 0x98, 0xff, 0x22, 0xb0, 0xcf, 0x52, - 0xf8, 0x5e, 0x1c, 0xb9, 0xfe, 0x80, 0x08, 0xd7, 0x33, 0x96, 0xb1, 0x5f, 0xd8, 0x6e, 0xf8, 0x6c, 0x00, 0x43, 0x5f, 0xda, 0xbe, 0xe3, 0xfe, 0x2b, 0x3e, 0xc4, 0xfe, 0x53, 0x43, 0x07, 0x6d, 0xb7, - 0xb5, 0x87, 0xcc, 0x4e, 0x88, 0x74, 0x2c, 0x11, 0xa3, 0xd9, 0xd2, 0xd2, 0x85, 0x08, 0xc7, 0x70, 0xcf, 0x55, 0x85, 0x8a, 0x26, 0x21, 0xb8, 0xe8, 0x8d, 0x72, 0x04, 0x34, 0x16, 0xe4, 0x3a, 0x1c, - 0x88, 0xd1, 0x90, 0x59, 0xf9, 0x30, 0xd8, 0xe7, 0x13, 0xa3, 0x37, 0xa3, 0x83, 0x4a, 0x56, 0x93, 0x44, 0xc4, 0x70, 0x75, 0x13, 0xa7, 0x99, 0x34, 0xac, 0x97, 0x2a, 0xda, 0x9d, 0x8e, 0xe0, 0xf9, - 0xa1, 0x58, 0xd0, 0xfb, 0xfd, 0xb3, 0x01, 0xec, 0x9b, 0x45, 0xff, 0xcb, 0xcf, 0xf7, 0x1b, 0x0f, 0x73, 0xc7, 0x31, 0xfd, 0xd8, 0x4c, 0x3f, 0x9c, 0xd0, 0x3f, 0x97, 0x0a, 0xe2, 0xfe, 0x53, 0xed, - 0x07, 0xbf, 0x2f, 0x06, 0xe2, 0xf5, 0xf8, 0xfa, 0xd7, 0xbf, 0xc0, 0x47, 0x43, 0xac, 0xc5, 0x0b, 0xbe, 0x16, 0xb9, 0x7f, 0xaa, 0xf5, 0x9a, 0xbb, 0x7e, 0xa1, 0xd8, 0xfd, 0x9d, 0x1e, 0xfe, 0xc8, - 0x31, 0x8a, 0xa0, 0xaf, 0x4c, 0xa4, 0x6f, 0xc9, 0x7f, 0xc8, 0xe2, 0xfb, 0xa5, 0xce, 0x99, 0xf6, 0x73, 0x39, 0x04, 0x24, 0x11, 0xd8, 0x63, 0x63, 0x43, 0x0a, 0xd9, 0x68, 0xd0, 0xdf, 0x6c, 0x34, - 0xd4, 0x62, 0x4b, 0x6b, 0x28, 0x54, 0xe1, 0x61, 0xb6, 0x22, 0x8d, 0x82, 0xa3, 0xac, 0xcd, 0x5a, 0x9a, 0xb3, 0xb0, 0x6b, 0xaa, 0x74, 0x40, 0x53, 0x51, 0xe0, 0x91, 0xc3, 0x0a, 0x8c, 0x79, 0x9a, - 0x2e, 0xb0, 0x62, 0x84, 0x14, 0x63, 0x86, 0x91, 0xa9, 0xde, 0x9c, 0x55, 0xc5, 0x71, 0xbd, 0x2e, 0x36, 0xa1, 0x94, 0x71, 0xd8, 0xcf, 0x97, 0x74, 0x6f, 0x27, 0x4d, 0xf7, 0xd0, 0xc2, 0x5f, 0x0a, - 0xa2, 0xbe, 0x26, 0xfc, 0x81, 0x53, 0x73, 0xda, 0xc1, 0xdb, 0x05, 0x52, 0x23, 0xb3, 0x7d, 0xa5, 0x0d, 0x40, 0x47, 0x81, 0x26, 0xb1, 0x19, 0x6f, 0x67, 0x90, 0x3e, 0xd3, 0x22, 0x60, 0x30, 0x23, - 0x36, 0xd1, 0x84, 0x1c, 0xaa, 0x9c, 0x2f, 0x3a, 0xf6, 0x1e, 0x74, 0x46, 0x8a, 0x4f, 0xac, 0x54, 0x48, 0x1b, 0x60, 0xf8, 0x42, 0x14, 0x84, 0xca, 0x99, 0x8e, 0x0e, 0x94, 0x2f, 0xb2, 0x5a, 0xc1, - 0xb8, 0xaa, 0xb1, 0x9c, 0x32, 0x74, 0xc8, 0x21, 0xcc, 0x60, 0x9b, 0x14, 0x6e, 0x8e, 0x6b, 0xaf, 0xf7, 0x54, 0x33, 0x4b, 0x4d, 0xbd, 0xb8, 0xd4, 0x32, 0xb9, 0xdd, 0x7a, 0xb4, 0x69, 0xbe, 0xa9, - 0x75, 0xf2, 0xea, 0xe2, 0xef, 0x8f, 0xec, 0x8e, 0xcb, 0x54, 0xf2, 0x1e, 0xdb, 0x5e, 0xdb, 0x26, 0xee, 0x9a, 0xf0, 0x07, 0xdb, 0x9a, 0xd3, 0xb6, 0x1b, 0xc5, 0x55, 0x5d, 0xcc, 0x10, 0xb7, 0x91, - 0x5a, 0x1c, 0x4a, 0x9f, 0xd5, 0x31, 0x74, 0x13, 0x0e, 0x69, 0xca, 0x97, 0x51, 0x25, 0x27, 0x61, 0xb4, 0x9c, 0x31, 0x8e, 0x9d, 0x63, 0xfd, 0x75, 0xe5, 0x6c, 0x7a, 0x73, 0x64, 0xb3, 0xa3, 0xcb, - 0xd0, 0xb0, 0xf6, 0x03, 0xa8, 0x67, 0x8f, 0x92, 0x89, 0x20, 0xa8, 0x99, 0x37, 0x1f, 0xcd, 0x6b, 0xaf, 0x3b, 0x4e, 0xec, 0x6a, 0x57, 0x69, 0xcc, 0x96, 0x85, 0xc0, 0x15, 0xaa, 0xbc, 0xee, 0x11, - 0x79, 0x34, 0xa5, 0x87, 0x5f, 0xaa, 0xce, 0x46, 0xfc, 0x71, 0x1a, 0x37, 0x38, 0x64, 0xb9, 0xab, 0xab, 0xb9, 0xa9, 0xfe, 0x90, 0xe1, 0xe0, 0xbd, 0x96, 0x4f, 0xdf, 0x77, 0x7f, 0xd8, 0xfb, 0x85, - 0x79, 0xc4, 0x35, 0xfd, 0x0f, 0xc1, 0xb8, 0xbe, 0xda, 0x36, 0x51, 0x9f, 0x18, 0x93, 0xc8, 0x8c, 0x92, 0x67, 0x2a, 0x46, 0x20, 0x95, 0x0a, 0x4e, 0x06, 0x02, 0x9b, 0x83, 0xf3, 0x31, 0x3a, 0x92, - 0x09, 0x68, 0xc9, 0xc6, 0x0c, 0x2a, 0x6e, 0x18, 0x98, 0xf3, 0x74, 0x98, 0xde, 0x6c, 0x62, 0x6b, 0x8a, 0x30, 0xdd, 0x05, 0x0e, 0xf4, 0x64, 0xd2, 0x73, 0x4c, 0x68, 0x40, 0x0c, 0x17, 0xfd, 0x64, - 0xc5, 0x3b, 0xd8, 0xb8, 0x28, 0x80, 0xd9, 0x96, 0xdc, 0x87, 0x00, 0x61, 0xb8, 0xb1, 0xfc, 0xcc, 0xec, 0x7c, 0xc2, 0xd6, 0x36, 0x41, 0xd9, 0xed, 0x81, 0xfe, 0xa5, 0xae, 0xd7, 0x02, 0xe8, 0x96, - 0x1d, 0x11, 0x4a, 0x97, 0xc1, 0x82, 0xae, 0x37, 0x36, 0x5b, 0x8f, 0x32, 0x96, 0x08, 0x86, 0xc6, 0xd8, 0x36, 0xcb, 0xda, 0x36, 0xeb, 0x11, 0x8e, 0x62, 0x8c, 0x99, 0xe2, 0x53, 0xb0, 0x3c, 0xf0, - 0x1b, 0x68, 0xc7, 0xd5, 0x12, 0xe8, 0xb9, 0x34, 0x86, 0x7a, 0x0b, 0xc7, 0xe8, 0x6e, 0x65, 0x9f, 0x1f, 0x6e, 0xa7, 0xe2, 0x01, 0xa9, 0xe3, 0x74, 0x16, 0x44, 0x12, 0x95, 0xa8, 0x19, 0x33, 0xcc, - 0xb7, 0x80, 0xa8, 0x4e, 0x9e, 0x8d, 0x9f, 0xed, 0x4d, 0xd6, 0x67, 0x48, 0xff, 0x6c, 0x5b, 0xa2, 0x9f, 0x6b, 0xa8, 0xaf, 0xdb, 0x12, 0xb5, 0xd0, 0x49, 0x46, 0xd4, 0xaf, 0x8c, 0x32, 0xc0, 0xe6, - 0x8c, 0x39, 0xc1, 0x26, 0xe8, 0x42, 0x9c, 0x21, 0x0a, 0x83, 0xd0, 0x5b, 0x99, 0x56, 0xf7, 0xd5, 0xb4, 0xb7, 0x60, 0x12, 0x25, 0xe0, 0xbd, 0x7c, 0x40, 0xa9, 0x38, 0x3c, 0x46, 0x16, 0x1a, 0xb4, - 0x8f, 0x57, 0x7e, 0x34, 0x58, 0x84, 0x8c, 0xc0, 0x56, 0x89, 0x17, 0x57, 0x61, 0x2f, 0x52, 0x23, 0x2c, 0x36, 0xfd, 0x19, 0xe5, 0xa3, 0x8b, 0xb1, 0x51, 0xa2, 0xf6, 0xe2, 0x99, 0xf0, 0x3e, 0xcb, - 0xff, 0xfc, 0x9f, 0xb1, 0x53, 0xd1, 0x3d, 0xae, 0xff, 0x0f, 0xdd, 0xaa, 0xe8, 0x0e, 0xb3, 0x7f, 0x86, 0xcb, 0x7d, 0x67, 0xdd, 0xfd, 0xb9, 0xd7, 0x2b, 0xd6, 0xdb, 0x1d, 0xfa, 0x60, 0xe7, 0xde, - 0xd5, 0xa6, 0x06, 0x75, 0x8b, 0x7e, 0x43, 0x58, 0x73, 0x1d, 0x58, 0x60, 0xae, 0x53, 0x25, 0x73, 0x62, 0x06, 0xaa, 0xa3, 0x12, 0xb1, 0x60, 0x9b, 0xe7, 0x28, 0x5f, 0x58, 0xe5, 0x6b, 0x91, 0x8b, - 0x12, 0x06, 0x3b, 0x4c, 0x88, 0x68, 0xc9, 0xae, 0x56, 0x91, 0x5e, 0x04, 0xbd, 0xcc, 0x62, 0x12, 0x6f, 0xb7, 0x09, 0x13, 0x77, 0xcb, 0x3b, 0x01, 0x5f, 0x2d, 0xc1, 0xa0, 0xcf, 0x4d, 0x63, 0x72, - 0x65, 0x3a, 0x7e, 0x8e, 0x26, 0x3e, 0xe1, 0xf7, 0x9f, 0x66, 0x04, 0x3c, 0x33, 0xb6, 0xfe, 0x38, 0x5d, 0xfe, 0xe3, 0xd9, 0xf3, 0x79, 0xf5, 0xe0, 0x1e, 0xc7, 0xc8, 0x97, 0x46, 0xb3, 0x13, 0xc9, - 0x46, 0x61, 0x1c, 0x0f, 0x3a, 0x64, 0xbb, 0xf1, 0xac, 0x44, 0xc7, 0xcc, 0x8c, 0xe9, 0x13, 0x58, 0x11, 0xec, 0x06, 0x71, 0xb0, 0x1b, 0x0c, 0x93, 0x7a, 0x35, 0xc9, 0x04, 0x09, 0xca, 0x67, 0xb0, - 0x92, 0x02, 0x85, 0x99, 0x4c, 0x15, 0x2b, 0x5e, 0xc1, 0x82, 0x46, 0x99, 0x00, 0xd3, 0xb7, 0xe7, 0x6b, 0x15, 0x10, 0xf6, 0x4c, 0x34, 0xe4, 0xd0, 0x3c, 0x74, 0xdc, 0x80, 0x9f, 0x8c, 0x54, 0x3a, - 0xc0, 0x02, 0xb0, 0x54, 0x17, 0xf1, 0x18, 0xdc, 0xa5, 0x8b, 0x1a, 0x79, 0xc6, 0x97, 0x6f, 0x42, 0x28, 0xf5, 0x28, 0xbd, 0xac, 0x1a, 0x7d, 0x72, 0x9b, 0x37, 0x4d, 0x1d, 0x2f, 0x3b, 0xc5, 0x45, - 0x7d, 0xa9, 0xc8, 0xfc, 0xd8, 0xcc, 0xbb, 0x3b, 0x59, 0x7d, 0xdd, 0x47, 0xfc, 0x8c, 0xab, 0x7f, 0x5a, 0x67, 0xff, 0x24, 0xeb, 0x2c, 0x4e, 0xdd, 0x40, 0x7d, 0x68, 0x21, 0xbc, 0x92, 0x5a, 0x72, - 0xa6, 0x79, 0xee, 0x54, 0x6e, 0xa0, 0x36, 0x49, 0x3a, 0x2d, 0x7a, 0x95, 0x39, 0x2c, 0x06, 0x83, 0x8a, 0x94, 0x63, 0x43, 0x05, 0x6c, 0x2c, 0x06, 0x44, 0xae, 0x0c, 0xd7, 0xd0, 0xe2, 0x20, 0x6d, - 0xc0, 0xe5, 0xca, 0x1c, 0xd3, 0x2c, 0x0f, 0xda, 0x4c, 0xce, 0xf7, 0x16, 0x02, 0xa4, 0x4f, 0x0b, 0x09, 0xe1, 0xf4, 0xfe, 0x24, 0x94, 0xe6, 0xa5, 0xe3, 0xad, 0x08, 0x75, 0x68, 0x26, 0x29, 0x43, - 0x83, 0x99, 0x36, 0x8b, 0x62, 0x68, 0x92, 0xd5, 0x01, 0xe4, 0x65, 0xea, 0x5a, 0x7e, 0x34, 0xb7, 0x7f, 0xbf, 0x74, 0xc7, 0x49, 0x7e, 0xd9, 0xa1, 0xfd, 0xbc, 0x62, 0xd2, 0x9c, 0xbe, 0x79, 0xd9, - 0x6d, 0xbf, 0x29, 0x55, 0xdf, 0x35, 0xd4, 0xfc, 0xea, 0xbe, 0xcb, 0x95, 0x9f, 0xaf, 0xae, 0xb4, 0xe5, 0xd5, 0x65, 0x81, 0xf4, 0x7e, 0x47, 0x78, 0xcd, 0x5b, 0xd8, 0xd0, 0x6c, 0x78, 0xd5, 0x1c, - 0x75, 0xe0, 0x76, 0xfe, 0x40, 0x9d, 0x61, 0xdd, 0x2c, 0x5e, 0xe7, 0x78, 0xc9, 0x71, 0x79, 0xc5, 0x6f, 0x91, 0x6d, 0xda, 0x13, 0x31, 0x57, 0x1b, 0xec, 0x7a, 0x53, 0x6a, 0xa1, 0x71, 0xf8, 0x76, - 0x48, 0x87, 0x0a, 0xad, 0x77, 0x21, 0x3e, 0xf2, 0xcb, 0xd2, 0xda, 0xed, 0x44, 0x7d, 0x9c, 0x46, 0xa0, 0xaa, 0xb8, 0x3d, 0x51, 0xf6, 0x45, 0x34, 0xb1, 0xd3, 0xed, 0x92, 0x60, 0x89, 0x92, 0x1a, - 0xea, 0xf8, 0x10, 0x67, 0xc4, 0x4c, 0xef, 0x3e, 0xb3, 0x92, 0xbf, 0x9b, 0xae, 0xde, 0xb8, 0x11, 0xf0, 0x97, 0x66, 0xa9, 0xcd, 0xde, 0xfb, 0xad, 0xf9, 0xf0, 0x79, 0xc4, 0x7a, 0x52, 0xa5, 0x14, - 0x7f, 0xa9, 0x46, 0xc8, 0x07, 0xd9, 0x86, 0x45, 0xef, 0x15, 0x49, 0xf1, 0x76, 0x35, 0x42, 0xe8, 0xbd, 0x36, 0x1b, 0x0e, 0x67, 0x01, 0xb4, 0x38, 0x2c, 0xb6, 0xa5, 0x6c, 0x70, 0xf1, 0xa8, 0x2a, - 0xbb, 0xa3, 0x75, 0x6d, 0xf2, 0xdd, 0x0d, 0xe3, 0x6b, 0xc2, 0xbe, 0x8a, 0x7a, 0x52, 0x31, 0x30, 0x84, 0x3e, 0xa9, 0xf4, 0x89, 0x8a, 0x9b, 0x02, 0x9c, 0x88, 0x4b, 0x94, 0x13, 0xcd, 0x79, 0xa0, - 0xe6, 0xca, 0x60, 0x52, 0xd7, 0x59, 0x3f, 0x71, 0xec, 0x03, 0x34, 0x4c, 0x45, 0x7c, 0x03, 0xa3, 0xaa, 0xe5, 0xfe, 0xea, 0xb0, 0xd4, 0x52, 0x2b, 0x7c, 0xb8, 0x8d, 0x1e, 0x4d, 0x5e, 0x5e, 0x81, - 0xf3, 0x4c, 0xb5, 0x41, 0xf3, 0x7c, 0xdc, 0x4c, 0x62, 0x5a, 0x80, 0x39, 0x09, 0xac, 0xc9, 0x14, 0xd5, 0x88, 0x21, 0xb0, 0xd8, 0x94, 0x73, 0x6a, 0x06, 0x97, 0x29, 0x2a, 0x25, 0xf0, 0x6e, 0x0a, - 0x46, 0xcc, 0xc0, 0x0e, 0x91, 0xd9, 0x76, 0xd3, 0xcf, 0x93, 0x39, 0x05, 0x4e, 0xd1, 0x78, 0xa2, 0xc6, 0x72, 0x0f, 0x1b, 0x52, 0xfa, 0x60, 0xa5, 0x46, 0x03, 0x74, 0x29, 0xa3, 0x08, 0xca, 0xb0, - 0xd8, 0xe6, 0x10, 0x2f, 0x40, 0xcb, 0x72, 0x23, 0x2e, 0xd8, 0xe5, 0x2e, 0x01, 0x4a, 0xea, 0xeb, 0x4a, 0xff, 0x8b, 0xc8, 0xdf, 0xcd, 0xf8, 0xff, 0x63, 0x99, 0xf1, 0xa7, 0xcc, 0xff, 0x63, 0x65, - 0xfe, 0x09, 0x9e, 0xaf, 0x0a, 0xfd, 0x7d, 0x3c, 0x5b, 0x8a, 0x3d, 0xda, 0x0d, 0xc3, 0x89, 0x65, 0xad, 0x6b, 0x6a, 0x3f, 0x83, 0x69, 0x19, 0x44, 0x74, 0xb2, 0x1b, 0x76, 0x43, 0xba, 0xcb, 0xb1, - 0x75, 0x04, 0x85, 0xee, 0x56, 0x4e, 0xf6, 0xc4, 0xfe, 0x90, 0xc8, 0xe1, 0x21, 0xea, 0x85, 0xe2, 0xe1, 0xb0, 0x8e, 0x05, 0xc9, 0x50, 0xfa, 0xa6, 0xcb, 0xe8, 0x0e, 0x45, 0xd3, 0x05, 0x0e, 0xe3, - 0x39, 0x56, 0xc5, 0x5d, 0x25, 0xb0, 0x57, 0xd6, 0xca, 0x09, 0xbb, 0x7d, 0x3a, 0x7e, 0x36, 0xd2, 0xff, 0x41, 0x78, 0x7e, 0xef, 0xe9, 0x7d, 0xa5, 0x84, 0xdb, 0x99, 0x66, 0x83, 0xe4, 0xc5, 0xbf, - 0xdb, 0xaa, 0x74, 0xdb, 0x6e, 0x95, 0xe9, 0xc9, 0x66, 0x87, 0x09, 0x4c, 0x4c, 0x50, 0x4b, 0x05, 0x32, 0x76, 0x76, 0x7f, 0xb2, 0x72, 0x09, 0x90, 0x72, 0x3d, 0x14, 0x82, 0x26, 0xf4, 0x5a, 0x1a, - 0x27, 0x28, 0x32, 0x07, 0x8d, 0xad, 0xb9, 0x96, 0x96, 0xd5, 0x04, 0x83, 0xd7, 0x07, 0x69, 0xaf, 0xfa, 0x33, 0xd8, 0x5c, 0x04, 0x3d, 0x5c, 0xe9, 0xca, 0x32, 0x38, 0xdd, 0x74, 0x59, 0x72, 0xb0, - 0x5e, 0x06, 0xab, 0xee, 0xb2, 0xb7, 0xdd, 0x13, 0xcf, 0x46, 0x8f, 0x16, 0x0a, 0xaf, 0x1d, 0x92, 0xa5, 0x19, 0xe6, 0x9d, 0x5c, 0x4d, 0x9b, 0xac, 0x11, 0xc7, 0x7d, 0x54, 0x87, 0x00, 0x7f, 0xcd, - 0x60, 0xfc, 0x4c, 0xfd, 0x88, 0xee, 0xe7, 0x6b, 0x1d, 0xbc, 0x9d, 0x11, 0xe9, 0x82, 0xc8, 0x46, 0x0b, 0x97, 0x35, 0x58, 0xec, 0x17, 0x8c, 0x4c, 0x00, 0x33, 0x63, 0x35, 0xb6, 0x27, 0x6b, 0x56, - 0xe2, 0x31, 0x84, 0x04, 0xf8, 0x64, 0xab, 0xed, 0xc4, 0x9a, 0x45, 0x11, 0x98, 0x2d, 0x18, 0x71, 0x2c, 0x27, 0x42, 0x31, 0x9e, 0x8c, 0x7a, 0xd0, 0x88, 0x47, 0x80, 0x35, 0xb2, 0xcf, 0xb7, 0x9c, - 0x31, 0x11, 0x02, 0x05, 0x33, 0x16, 0x84, 0xd5, 0xdf, 0x67, 0x06, 0xb6, 0xdc, 0x4c, 0x81, 0xf5, 0x4f, 0x76, 0xd8, 0x6f, 0x95, 0x87, 0xf6, 0xdd, 0xce, 0x08, 0xe8, 0x6b, 0xbd, 0xfc, 0xb2, 0x29, - 0xc2, 0x79, 0x3f, 0x04, 0xb4, 0x5d, 0xef, 0x0e, 0xc4, 0x0a, 0x40, 0xac, 0x9d, 0xa8, 0xf5, 0xa6, 0xb5, 0x48, 0xae, 0x20, 0x7e, 0x0b, 0x8d, 0x12, 0x23, 0xdc, 0xcc, 0x04, 0x53, 0xca, 0xe7, 0x58, - 0x0a, 0xf9, 0xb3, 0x6e, 0x4d, 0xf6, 0x7a, 0x6a, 0xc5, 0x6c, 0xec, 0xc4, 0x54, 0x49, 0x8d, 0x75, 0x5d, 0x04, 0xea, 0x6d, 0xd3, 0x11, 0x9d, 0x0e, 0x0c, 0x90, 0xdb, 0x43, 0x3c, 0x22, 0xe8, 0x35, - 0xb1, 0x84, 0x61, 0x98, 0x51, 0x07, 0x3b, 0x59, 0xd7, 0xa0, 0x9f, 0xc0, 0x05, 0xbd, 0x51, 0x6f, 0xfb, 0x16, 0x90, 0x59, 0xaa, 0x9a, 0x75, 0xbc, 0xac, 0x93, 0x16, 0x61, 0xee, 0x7e, 0x5b, 0x53, - 0xfb, 0xe7, 0xd8, 0x7d, 0xa2, 0x0d, 0x76, 0x3e, 0x5f, 0x69, 0x5b, 0xe1, 0xaf, 0x6f, 0x67, 0xdb, 0xfe, 0x72, 0xd0, 0xe3, 0xb8, 0x89, 0xb3, 0xf2, 0xc3, 0xf5, 0x80, 0x83, 0x23, 0xad, 0xc4, 0x12, - 0x41, 0xdd, 0x60, 0xfc, 0xc0, 0xed, 0xaf, 0x16, 0x23, 0x4f, 0x5b, 0x6e, 0x03, 0x3c, 0xa3, 0x33, 0x60, 0xe1, 0x68, 0x4a, 0x1d, 0x48, 0x95, 0x54, 0xe1, 0x31, 0x9f, 0xce, 0x92, 0xd4, 0xce, 0xc3, - 0x70, 0x02, 0xe3, 0x73, 0x92, 0x2a, 0xa9, 0x05, 0x21, 0x8f, 0x6b, 0x29, 0xa0, 0xad, 0xc9, 0xb2, 0xe5, 0xe6, 0xf7, 0xb7, 0x5b, 0x6e, 0xdc, 0x09, 0x33, 0xbb, 0x2e, 0xe8, 0xdc, 0x4c, 0xd6, 0x3f, - 0xad, 0x57, 0x5f, 0xaa, 0x24, 0xfe, 0xfe, 0xb5, 0xb4, 0x98, 0xa5, 0x66, 0xf9, 0x25, 0x2a, 0x10, 0x7b, 0x83, 0xf1, 0xc7, 0xf1, 0x86, 0x5f, 0xc2, 0x47, 0x8e, 0x4c, 0xec, 0x44, 0xd9, 0x55, 0xf8, - 0xe8, 0x71, 0x4a, 0x7d, 0x93, 0x51, 0x15, 0x95, 0x66, 0xea, 0x47, 0xaa, 0xd1, 0x89, 0xd3, 0x28, 0x37, 0xf5, 0xab, 0x3c, 0x34, 0xe4, 0x36, 0x55, 0x2c, 0x4e, 0xa3, 0xa0, 0xa3, 0xfb, 0xee, 0x25, - 0x26, 0x13, 0xc6, 0x3e, 0xc7, 0xaa, 0x26, 0x97, 0x6f, 0x87, 0xef, 0xae, 0x23, 0x7e, 0x99, 0xec, 0x7d, 0x95, 0xaa, 0x6f, 0x43, 0xa1, 0x9e, 0xf8, 0x3f, 0xa8, 0xdf, 0xfe, 0xe3, 0x3f, 0x7e, 0xfb, - 0x1b, 0x4c, 0x9c, 0xfe, 0xb5, 0x99, 0xd3, 0x7d, 0x96, 0xbc, 0x9b, 0x46, 0x35, 0xb5, 0x2f, 0x53, 0xd1, 0x47, 0x0a, 0xec, 0xe7, 0x83, 0xed, 0x85, 0x28, 0xd8, 0x79, 0x3f, 0x6c, 0x5b, 0xcd, 0x9f, - 0x02, 0xba, 0xeb, 0xc4, 0xd4, 0xb4, 0x41, 0x1d, 0x6f, 0xba, 0xc2, 0x02, 0x58, 0xab, 0x84, 0x80, 0x74, 0xd5, 0x6c, 0x14, 0xd9, 0xe6, 0x82, 0xaf, 0xf5, 0x61, 0xde, 0x1b, 0xcd, 0x8c, 0x98, 0xe7, - 0xb8, 0x43, 0xcf, 0x86, 0x21, 0x0b, 0xc2, 0xd5, 0xe5, 0x60, 0x45, 0x6b, 0x7a, 0x3f, 0x19, 0x5a, 0xe0, 0x7c, 0x53, 0xc1, 0x7d, 0xaf, 0xa7, 0x00, 0x09, 0x02, 0x6a, 0x7d, 0xda, 0x46, 0xd9, 0xb2, - 0x48, 0x27, 0xa8, 0xf8, 0x6d, 0xfd, 0xca, 0x6f, 0xf1, 0xf9, 0x90, 0xbb, 0xfb, 0xc6, 0xd2, 0x2b, 0x43, 0xc1, 0x99, 0x66, 0xb3, 0x13, 0x44, 0x73, 0xd4, 0x36, 0x2c, 0xac, 0x8a, 0xf7, 0x4a, 0xd6, - 0x9d, 0x45, 0x7b, 0x45, 0x1d, 0xf7, 0x97, 0xe3, 0xe1, 0x48, 0x91, 0x0e, 0x6c, 0x5f, 0xdd, 0xc6, 0x3e, 0x34, 0x98, 0x2c, 0x7b, 0xc0, 0x80, 0xee, 0xaa, 0x63, 0xf7, 0x60, 0x06, 0x13, 0x87, 0xaf, - 0x76, 0x7b, 0xd1, 0x26, 0x50, 0x07, 0x93, 0xe0, 0xc9, 0xd8, 0x96, 0x87, 0x5c, 0x2c, 0x25, 0x73, 0x76, 0xb6, 0xd0, 0x83, 0x60, 0x3b, 0x2d, 0xec, 0x74, 0xe1, 0x8d, 0x7d, 0x3a, 0x5f, 0x97, 0x8b, - 0xb6, 0x1b, 0xcb, 0x7c, 0x08, 0xca, 0xc3, 0x3a, 0xaa, 0x5f, 0x44, 0xff, 0xaa, 0xd7, 0x1e, 0x45, 0xfe, 0x7c, 0x7a, 0x2d, 0xf6, 0xdf, 0xb1, 0x25, 0x6b, 0x02, 0x52, 0xf2, 0x46, 0x49, 0x1f, 0x62, - 0xb3, 0xf3, 0x9d, 0xa0, 0xbe, 0x56, 0x9d, 0xe8, 0xc1, 0x3b, 0x9a, 0xc1, 0xf9, 0x6e, 0x4b, 0xdb, 0x7a, 0x45, 0x1b, 0x4d, 0xc7, 0x36, 0xfa, 0x21, 0x93, 0x37, 0x7a, 0x36, 0xc7, 0x55, 0x4e, 0x96, - 0xc9, 0x59, 0x82, 0x0a, 0x55, 0xc9, 0x25, 0x5d, 0x92, 0x01, 0xd6, 0xa1, 0xb6, 0x33, 0x47, 0xa6, 0x15, 0x9b, 0xdb, 0xe9, 0x06, 0x48, 0x0f, 0xf5, 0x60, 0xec, 0xcb, 0x84, 0xb0, 0xcc, 0x07, 0x63, - 0x27, 0x23, 0x04, 0x1f, 0x9a, 0xee, 0xe4, 0x61, 0xac, 0x4f, 0x80, 0x6a, 0x0a, 0x8d, 0x2b, 0x8b, 0x07, 0x06, 0x8c, 0x8c, 0x37, 0xf5, 0x4b, 0x9e, 0xe0, 0x65, 0x98, 0x4d, 0x7e, 0x41, 0x91, 0xba, - 0x9d, 0xf7, 0x72, 0xed, 0xdf, 0x20, 0xf6, 0xf3, 0xae, 0xfd, 0xf0, 0x2d, 0x17, 0xcc, 0xee, 0xb5, 0xb5, 0x2d, 0x79, 0xb8, 0x9e, 0xd8, 0x93, 0xb5, 0x8d, 0x9b, 0xf2, 0xbe, 0x5c, 0x28, 0xc3, 0x6a, - 0x4d, 0x0d, 0x4a, 0x4b, 0x53, 0x39, 0xb2, 0xb7, 0x59, 0x3a, 0x88, 0x3e, 0x05, 0x50, 0x0f, 0xb7, 0xf8, 0x61, 0x2d, 0xf3, 0xcc, 0x7e, 0x4d, 0x8f, 0x51, 0x63, 0x85, 0xaa, 0xe4, 0xba, 0xa6, 0x0e, - 0x88, 0x05, 0x16, 0x22, 0x64, 0xa2, 0x34, 0xb1, 0x0e, 0x22, 0x83, 0x45, 0xa3, 0x25, 0x8e, 0x79, 0x92, 0xd8, 0xe5, 0x56, 0xd2, 0x68, 0xf4, 0xfd, 0xe6, 0x26, 0x5f, 0xb7, 0xcd, 0xb9, 0x6f, 0x2e, - 0xbd, 0x52, 0x75, 0xed, 0x13, 0xed, 0x0f, 0x84, 0xde, 0xeb, 0x16, 0xa2, 0xed, 0x2a, 0xae, 0x59, 0x68, 0x22, 0x76, 0x23, 0xf1, 0xd0, 0xf5, 0x90, 0x9e, 0x43, 0x9b, 0x20, 0xd7, 0x5d, 0x31, 0x5d, - 0xb8, 0x9a, 0x06, 0x13, 0x9a, 0x61, 0x64, 0xd0, 0x66, 0x85, 0x70, 0x32, 0xeb, 0x6d, 0x87, 0xb8, 0x93, 0x55, 0x02, 0x49, 0x4f, 0x27, 0x1e, 0xd4, 0xe5, 0x74, 0x9c, 0xdb, 0xce, 0xea, 0xae, 0x3e, - 0x1c, 0x01, 0xc0, 0xde, 0x8f, 0x59, 0x66, 0x64, 0xb3, 0xaa, 0x9b, 0xaf, 0x32, 0x08, 0xed, 0x49, 0x0b, 0x0a, 0x7b, 0x36, 0x28, 0x1e, 0x7f, 0xe9, 0xe3, 0xaa, 0x4a, 0xaf, 0x95, 0xa3, 0x7d, 0xa7, - 0xfa, 0x8e, 0x85, 0x6b, 0x59, 0x6d, 0x8b, 0xd1, 0xee, 0xc7, 0x45, 0x24, 0xe1, 0xc0, 0xb4, 0xdb, 0xdd, 0xf8, 0x0a, 0x95, 0x57, 0xa6, 0xa1, 0x2e, 0x2c, 0xa2, 0xb7, 0x47, 0x24, 0x5b, 0x5c, 0xed, - 0x4b, 0x5b, 0x11, 0xb6, 0xd1, 0x7c, 0x92, 0x28, 0x85, 0x15, 0x8c, 0x5d, 0x0d, 0xca, 0xa7, 0x48, 0x6e, 0xda, 0x73, 0x5a, 0x50, 0x34, 0x38, 0x5e, 0xcd, 0xec, 0x91, 0xe3, 0x27, 0xac, 0xdf, 0x83, - 0x4c, 0x01, 0xd2, 0xd1, 0x8a, 0x2e, 0x45, 0x3d, 0xa8, 0xf7, 0xd8, 0x8f, 0xd7, 0xfc, 0x9a, 0x9f, 0xfd, 0x6d, 0xa9, 0x24, 0xe4, 0x85, 0x44, 0xb0, 0x77, 0xaa, 0x17, 0x60, 0xce, 0xc5, 0x92, 0x90, - 0x67, 0x29, 0x5f, 0x4d, 0x34, 0x16, 0x9b, 0x0f, 0x74, 0x5b, 0x22, 0xa8, 0xca, 0x95, 0x24, 0xb7, 0x52, 0x10, 0x67, 0x66, 0x8c, 0x2d, 0x9d, 0x9b, 0xed, 0xcc, 0xee, 0x46, 0xb0, 0xc2, 0x2a, 0xa0, - 0x17, 0xeb, 0x8d, 0x13, 0x98, 0x13, 0x9e, 0x4a, 0x07, 0x90, 0x34, 0xac, 0x02, 0x06, 0x14, 0xf3, 0x08, 0x5d, 0x92, 0x8b, 0x48, 0x99, 0xc4, 0xb8, 0xee, 0xfa, 0x8a, 0xb6, 0xaf, 0x05, 0xdc, 0x95, - 0x66, 0x92, 0x98, 0x8d, 0x81, 0xbe, 0xc9, 0x3e, 0x9b, 0xf6, 0x7d, 0x13, 0x2d, 0x7c, 0xc4, 0xcb, 0x77, 0x35, 0xd0, 0xca, 0xde, 0xb2, 0x5c, 0xcd, 0xdf, 0x35, 0xc6, 0x4d, 0x42, 0xcd, 0xf5, 0x5d, - 0xd5, 0x25, 0x30, 0xf8, 0x8b, 0x35, 0xf6, 0x35, 0x43, 0xe6, 0x73, 0x41, 0x5a, 0x33, 0xb5, 0x4d, 0xe4, 0xf7, 0x8f, 0xf5, 0xa4, 0xeb, 0x36, 0x57, 0x4f, 0xa3, 0x8f, 0x9c, 0x10, 0xec, 0xf3, 0x4f, - 0x88, 0x5d, 0xfd, 0xaa, 0x19, 0xb9, 0x29, 0x44, 0xd1, 0xce, 0x1c, 0x6b, 0x57, 0xd5, 0xa9, 0x61, 0xe8, 0xdd, 0x94, 0x98, 0x87, 0x56, 0xd7, 0x2b, 0x66, 0xc5, 0xe3, 0xd7, 0x5c, 0x84, 0xea, 0x7e, - 0x5a, 0x4e, 0xcb, 0x98, 0x15, 0xdf, 0x31, 0xc0, 0x6a, 0x00, 0x4c, 0x77, 0x5d, 0x8a, 0x53, 0x22, 0x89, 0xc9, 0xfd, 0x55, 0xaa, 0x72, 0xb9, 0xe5, 0xe0, 0x9b, 0xad, 0xeb, 0x8d, 0x3c, 0xd5, 0xdf, - 0xe8, 0x3b, 0x32, 0x53, 0xe5, 0xbc, 0x50, 0xc3, 0x25, 0x7b, 0x98, 0xf2, 0xfb, 0x90, 0x73, 0x96, 0x9b, 0x3e, 0x3b, 0x4e, 0xb8, 0x3d, 0x4b, 0x06, 0xd9, 0x82, 0x62, 0xa1, 0x82, 0x09, 0x12, 0x7f, - 0x57, 0x79, 0xcc, 0x8a, 0xda, 0x97, 0x15, 0xf7, 0x5a, 0xf7, 0x3b, 0x7f, 0xc7, 0xf7, 0x20, 0xe2, 0x6f, 0xe4, 0x2f, 0x82, 0x78, 0x1f, 0xbd, 0x0b, 0x6c, 0x0d, 0xfd, 0xe7, 0xb0, 0x65, 0xf4, 0x6a, - 0x2e, 0xd9, 0x61, 0x4f, 0xc9, 0xcc, 0x69, 0x01, 0x8b, 0xb6, 0x47, 0xf8, 0xb2, 0x26, 0x42, 0x9c, 0xe5, 0x0d, 0x1c, 0x65, 0xbd, 0xe9, 0x05, 0xb1, 0x82, 0xf7, 0xd4, 0xe5, 0x70, 0x77, 0x98, 0x3a, - 0xb8, 0xdd, 0xdb, 0xd0, 0xb6, 0x0a, 0x16, 0xf3, 0xb1, 0x27, 0xce, 0xb9, 0x98, 0x1d, 0x78, 0x4c, 0x57, 0x35, 0xd6, 0xa3, 0xd8, 0x10, 0x74, 0x66, 0xba, 0x64, 0x25, 0x3b, 0x55, 0xc8, 0x2c, 0x8c, - 0xc4, 0x76, 0x36, 0xdb, 0xbf, 0x9f, 0xe7, 0x54, 0x4d, 0x51, 0xd3, 0xa6, 0xa7, 0xfc, 0xfe, 0x11, 0xbc, 0x7c, 0xd5, 0x11, 0xae, 0x36, 0x0d, 0xfc, 0xda, 0xf2, 0xfd, 0xa6, 0x81, 0x8f, 0xb6, 0x9d, - 0x43, 0xbf, 0xdc, 0x54, 0xa4, 0xee, 0x3b, 0x89, 0x9b, 0x77, 0xa4, 0x96, 0xa1, 0xbf, 0xf7, 0xfe, 0x36, 0x9e, 0xa2, 0x7b, 0x3c, 0xba, 0x9d, 0xd4, 0x7c, 0xb7, 0x15, 0xe0, 0x2b, 0x7a, 0xeb, 0x66, - 0x2b, 0xc0, 0x56, 0xca, 0x2a, 0x5b, 0x14, 0xf0, 0x2e, 0xd6, 0x85, 0xee, 0x61, 0x9a, 0x6f, 0xf7, 0xf4, 0xa4, 0x4c, 0x2c, 0xc9, 0x74, 0xba, 0x93, 0x5a, 0xe9, 0x57, 0x02, 0xba, 0x94, 0x0e, 0x1b, - 0x98, 0x93, 0x00, 0x8c, 0x51, 0xd9, 0x9a, 0x21, 0xb8, 0x58, 0x1a, 0x6e, 0x9d, 0x91, 0x33, 0x1f, 0xd5, 0x5e, 0x77, 0x53, 0x4c, 0x64, 0x72, 0xb2, 0x65, 0xab, 0x50, 0x35, 0x1d, 0xdc, 0xd1, 0x85, - 0xca, 0x3b, 0xc0, 0x62, 0x31, 0xae, 0xe9, 0x79, 0x4b, 0x53, 0xfd, 0xcf, 0xad, 0x00, 0x5f, 0x96, 0x9c, 0x3f, 0xb7, 0x04, 0x6c, 0xb5, 0x25, 0x60, 0x83, 0xa3, 0x6f, 0x96, 0x66, 0x98, 0x39, 0xb9, - 0x79, 0x33, 0xeb, 0xfb, 0xec, 0x3d, 0xf8, 0x79, 0xd9, 0xb1, 0xcf, 0xc4, 0x2f, 0xe3, 0xef, 0xd5, 0xa5, 0xc6, 0x9b, 0xf0, 0xa4, 0x0c, 0x19, 0xdc, 0x99, 0x6f, 0x63, 0x5d, 0x89, 0x6c, 0x62, 0x90, - 0xf0, 0x7c, 0x32, 0x14, 0x01, 0x67, 0x41, 0x29, 0x45, 0x62, 0xe0, 0xe6, 0x42, 0x7f, 0x45, 0xeb, 0x34, 0x2b, 0xb2, 0xef, 0xf2, 0xff, 0xc8, 0x33, 0xf8, 0xe2, 0x94, 0xea, 0x8a, 0xf8, 0xe5, 0x7b, - 0xaf, 0x2e, 0xb5, 0x2d, 0x70, 0x9e, 0x2c, 0x90, 0x14, 0x30, 0x51, 0xae, 0x74, 0xfa, 0x83, 0x20, 0x36, 0x38, 0xbe, 0x04, 0x41, 0x99, 0x1a, 0x84, 0x03, 0x3f, 0xdc, 0x7a, 0x2a, 0x43, 0x88, 0x13, - 0xb6, 0x50, 0x37, 0xbd, 0x29, 0xbb, 0xab, 0x90, 0x5d, 0xc9, 0x09, 0xd4, 0x9a, 0xf5, 0xf6, 0x1c, 0x60, 0x81, 0x29, 0x37, 0x5c, 0x60, 0xbc, 0x89, 0xc5, 0xe1, 0x8e, 0x8a, 0xbb, 0xe3, 0xde, 0x6e, - 0x31, 0x93, 0xbc, 0x2d, 0xd7, 0x9b, 0x2c, 0x42, 0xa4, 0xa5, 0xb2, 0xf9, 0x6e, 0xfe, 0xf9, 0xb9, 0xac, 0xcf, 0x13, 0xa4, 0x53, 0xd3, 0x78, 0x5c, 0xe6, 0x0b, 0x7d, 0x29, 0xbe, 0xf0, 0x8a, 0xee, - 0x05, 0xdf, 0xd3, 0x59, 0x33, 0x07, 0x6b, 0x11, 0x71, 0x08, 0x40, 0x66, 0x00, 0x8c, 0x0e, 0x6a, 0xd7, 0x9a, 0x0c, 0xad, 0xbe, 0x38, 0xd4, 0x0d, 0x02, 0xd9, 0x96, 0x44, 0x14, 0x7a, 0x74, 0x10, - 0x38, 0x2b, 0xb8, 0x70, 0x28, 0x62, 0xb3, 0xb2, 0x04, 0x99, 0x5a, 0x55, 0x3d, 0x93, 0xd8, 0xa9, 0x03, 0x43, 0x64, 0xd6, 0xa3, 0x6e, 0x06, 0x81, 0xb3, 0xb0, 0xb0, 0xf7, 0xf8, 0xca, 0xe8, 0xe6, - 0x86, 0xa6, 0x90, 0x26, 0x61, 0xf7, 0x91, 0x7c, 0xd1, 0x35, 0xea, 0x8d, 0xf1, 0x93, 0x8d, 0xa9, 0xda, 0xf8, 0xfc, 0x9b, 0xef, 0xca, 0x54, 0xab, 0x9d, 0x89, 0xf9, 0xa2, 0xa8, 0xde, 0xd2, 0xbf, - 0xa0, 0x79, 0x7b, 0xf5, 0xff, 0x63, 0xef, 0x3d, 0x7b, 0x5d, 0x55, 0x9b, 0x04, 0xd1, 0xbf, 0x72, 0x74, 0x3e, 0x0e, 0xd7, 0x9b, 0x9c, 0x5a, 0x9a, 0xd1, 0x60, 0x1b, 0x27, 0x30, 0xc9, 0xc6, 0x60, - 0x46, 0xf3, 0x4a, 0x44, 0x83, 0xc9, 0xd9, 0xa0, 0xd1, 0xfd, 0xed, 0x57, 0x0e, 0x2b, 0xee, 0xe5, 0x65, 0x96, 0xcf, 0xe9, 0x3e, 0x3d, 0xad, 0xfb, 0x65, 0x6f, 0xd2, 0x2a, 0x4c, 0x55, 0x3d, 0xf5, - 0x54, 0xae, 0x8b, 0x52, 0x39, 0x80, 0x61, 0x35, 0x80, 0x5b, 0xd9, 0x88, 0x13, 0x2f, 0xf9, 0x48, 0xca, 0xa2, 0x29, 0xb8, 0xc0, 0x38, 0x3a, 0xa2, 0x79, 0x9b, 0x59, 0x30, 0x9e, 0x54, 0x49, 0xc4, - 0x78, 0x4f, 0x61, 0xf5, 0x8e, 0xd7, 0x65, 0x82, 0x6d, 0xec, 0x9e, 0xe6, 0xed, 0x03, 0x8a, 0xee, 0x91, 0x1e, 0x5e, 0xee, 0xac, 0x68, 0x4b, 0x9c, 0x9c, 0x3d, 0x8e, 0x49, 0xfa, 0x7e, 0xb7, 0x60, - 0x1b, 0x00, 0xd2, 0xb2, 0x9c, 0x5a, 0xa6, 0x44, 0x1f, 0xfe, 0xb8, 0xd4, 0xe6, 0x9d, 0x7e, 0xf2, 0x35, 0xae, 0x9e, 0xd1, 0x19, 0x5e, 0x80, 0xbe, 0x20, 0xe8, 0xbc, 0x26, 0x90, 0x61, 0x96, 0xae, - 0xbd, 0xac, 0x4b, 0x6e, 0xbc, 0xac, 0x40, 0x05, 0x4c, 0x97, 0x44, 0x0f, 0xc2, 0x49, 0xe7, 0xb9, 0xc8, 0xac, 0x99, 0x73, 0xbb, 0x6d, 0xea, 0xef, 0x14, 0xaf, 0x09, 0x45, 0xbf, 0x39, 0x41, 0xc9, - 0x84, 0xd5, 0x80, 0x93, 0x87, 0x0b, 0xe9, 0x44, 0x3f, 0x32, 0x0b, 0x5b, 0xcb, 0x68, 0xb4, 0x16, 0xd5, 0xb1, 0xed, 0xf7, 0x7b, 0xbb, 0x6c, 0xa4, 0xa8, 0x30, 0x33, 0xc6, 0xd1, 0xe1, 0x5a, 0x03, - 0xf6, 0xf3, 0xc7, 0x12, 0xfd, 0x3e, 0xb7, 0x7c, 0xf2, 0xc7, 0xff, 0x04, 0x05, 0x6f, 0x2c, 0x72, 0x66, 0x8b, 0x2b, 0xa0, 0xc7, 0x18, 0x88, 0xc1, 0x89, 0xa9, 0x08, 0x54, 0xe2, 0xe1, 0x75, 0xb7, - 0x77, 0x8a, 0xa9, 0x8b, 0xe4, 0x79, 0x0e, 0x40, 0x3d, 0x9a, 0xce, 0x3b, 0x16, 0x60, 0x00, 0x20, 0x8f, 0x38, 0x39, 0xe5, 0x57, 0xdb, 0x25, 0xa6, 0x2d, 0xa1, 0x44, 0xe3, 0xe8, 0x29, 0xa1, 0xa0, - 0xb3, 0x93, 0x2e, 0xa3, 0xeb, 0x5d, 0x5b, 0x81, 0xb1, 0x43, 0x93, 0xe4, 0x7c, 0xad, 0x60, 0x33, 0x0c, 0xcd, 0x58, 0x3a, 0xcd, 0x8b, 0x0d, 0xd2, 0x0f, 0x0c, 0x72, 0xbc, 0x6a, 0xcd, 0x67, 0x7d, - 0xef, 0x56, 0x14, 0x5f, 0xdc, 0x94, 0xa8, 0x4f, 0x51, 0x89, 0xd7, 0x47, 0x2f, 0x4d, 0x19, 0x6f, 0xcf, 0x40, 0x77, 0x9e, 0xf9, 0xca, 0x88, 0xf8, 0x00, 0xfe, 0xb7, 0x9a, 0xd4, 0xd7, 0x4e, 0x84, - 0x51, 0x7a, 0x38, 0xbc, 0x57, 0xbb, 0x3e, 0xb6, 0x02, 0x69, 0x9a, 0xe0, 0xda, 0xb0, 0x8e, 0xfa, 0x0c, 0xe0, 0xf2, 0xca, 0x2f, 0x7d, 0xa8, 0x5f, 0xe8, 0x79, 0x5e, 0x90, 0x38, 0xa3, 0xb8, 0x1b, - 0xb5, 0xe6, 0x35, 0x08, 0x43, 0x7e, 0xee, 0x37, 0x11, 0x05, 0x07, 0xbf, 0x3a, 0x3f, 0x71, 0xd6, 0x08, 0xdd, 0xf2, 0xc5, 0x22, 0x27, 0x3e, 0x35, 0x49, 0x08, 0x92, 0x97, 0x5f, 0xf3, 0x09, 0x5b, - 0xb7, 0x01, 0xe3, 0xa3, 0xd6, 0x2c, 0x92, 0xf7, 0x5f, 0xf3, 0xf9, 0xa1, 0x53, 0x37, 0x32, 0x1d, 0xa7, 0x78, 0xbd, 0xff, 0x21, 0x90, 0xf3, 0xce, 0x5a, 0xf8, 0x64, 0xee, 0x97, 0xae, 0x5d, 0x17, - 0xee, 0x15, 0xc3, 0xef, 0x5d, 0xd5, 0xf8, 0xe7, 0xc7, 0xde, 0x75, 0x62, 0xf8, 0x14, 0x25, 0xaa, 0x82, 0xa4, 0x1b, 0x45, 0x45, 0x7d, 0x7d, 0xc1, 0xd0, 0x91, 0xe4, 0x67, 0x2c, 0xe7, 0xf7, 0x55, - 0x82, 0x67, 0x6d, 0xf9, 0xfc, 0xb6, 0x6e, 0xf2, 0x11, 0x3c, 0x70, 0xfe, 0x38, 0xc9, 0xda, 0x7d, 0x49, 0x1d, 0x96, 0xd2, 0xb4, 0xd8, 0xf5, 0x5b, 0x80, 0x0d, 0xcb, 0xfd, 0xd8, 0xae, 0xb3, 0x7c, - 0xdd, 0x9d, 0x36, 0x0b, 0x5d, 0x2f, 0x16, 0x22, 0xaf, 0x28, 0x27, 0x15, 0x01, 0xa7, 0x81, 0xbd, 0xa3, 0x48, 0x8a, 0x5e, 0x2b, 0x63, 0x45, 0xa1, 0x80, 0x85, 0x8d, 0xd4, 0x5a, 0xaf, 0xd6, 0x99, - 0x58, 0x62, 0xfb, 0x0d, 0xb6, 0xea, 0xc7, 0xf1, 0xf8, 0x74, 0x3c, 0x4e, 0x76, 0xe3, 0xd3, 0x14, 0x1c, 0x38, 0x7f, 0xbc, 0x70, 0xeb, 0xf2, 0x7d, 0x53, 0x8f, 0x41, 0x91, 0xa9, 0xdf, 0x9b, 0xaa, - 0x7c, 0x85, 0x43, 0xe2, 0x39, 0x4f, 0xf5, 0x27, 0xe0, 0x67, 0x6c, 0x7e, 0xba, 0x74, 0x19, 0xe8, 0x3f, 0x60, 0x97, 0x22, 0xe7, 0x59, 0x09, 0xea, 0x5a, 0x17, 0x5b, 0x7c, 0x88, 0xc8, 0xfc, 0x9e, - 0xc3, 0x84, 0x3e, 0x5b, 0x8b, 0xc5, 0xfe, 0xb8, 0xf6, 0x9d, 0xe5, 0x49, 0xaf, 0x97, 0x4d, 0x87, 0xc8, 0xe3, 0x92, 0x67, 0x89, 0xe8, 0x58, 0xa7, 0x0e, 0xd7, 0x38, 0xa1, 0x56, 0x82, 0x76, 0xd6, - 0xad, 0x56, 0xe8, 0x64, 0xb7, 0xdc, 0x65, 0x0b, 0x48, 0x0c, 0xe0, 0x45, 0x73, 0x80, 0xd3, 0xc6, 0x5a, 0xf7, 0xbc, 0x33, 0x1b, 0x8f, 0x9f, 0x77, 0xb0, 0x79, 0x91, 0x59, 0xbd, 0xeb, 0xd2, 0x71, - 0xa7, 0xf7, 0xf2, 0xbf, 0x47, 0x1e, 0xb5, 0x17, 0x44, 0xd1, 0xa8, 0x30, 0x93, 0xc3, 0x3d, 0x52, 0x91, 0xcf, 0x92, 0xea, 0x06, 0xf6, 0x4a, 0xa4, 0xdb, 0xc9, 0x65, 0x62, 0xe1, 0x00, 0xf2, 0xe4, - 0x62, 0x4a, 0xcf, 0x00, 0x67, 0xad, 0xc6, 0x13, 0x84, 0xb7, 0x2d, 0x6c, 0x6c, 0xed, 0x9a, 0x84, 0x5b, 0x9d, 0xb6, 0xd2, 0x71, 0x12, 0x03, 0x8a, 0x92, 0xb9, 0xd8, 0x61, 0x5a, 0xcf, 0x8b, 0x3e, - 0xe4, 0xc9, 0x98, 0xdd, 0x45, 0xa0, 0x73, 0xdc, 0x6f, 0x6a, 0x44, 0x74, 0x64, 0x44, 0x32, 0x51, 0x08, 0x11, 0xb0, 0x34, 0x0f, 0x37, 0x07, 0x3a, 0x28, 0x88, 0xa3, 0xc9, 0x6b, 0x2b, 0x44, 0xdd, - 0xec, 0xb2, 0x47, 0xd9, 0x58, 0xf7, 0xc9, 0x53, 0xa5, 0xb7, 0xde, 0x8c, 0x2f, 0x88, 0xba, 0x36, 0xf6, 0xf9, 0x77, 0xf2, 0x2d, 0x7e, 0x10, 0xda, 0x5f, 0x93, 0xe4, 0x99, 0xa6, 0x5b, 0xef, 0xe0, - 0x5e, 0x68, 0xf2, 0x7a, 0x36, 0xba, 0xc0, 0x7b, 0x4c, 0x94, 0x05, 0x69, 0xb9, 0x85, 0xe6, 0x2c, 0x56, 0x00, 0x3e, 0x11, 0x76, 0x05, 0x16, 0x44, 0xbc, 0x26, 0x99, 0x01, 0x16, 0x47, 0xe4, 0x1e, - 0xc9, 0x99, 0xf2, 0x74, 0x6c, 0xd1, 0xcc, 0x73, 0xc7, 0x27, 0x29, 0x38, 0x18, 0xb1, 0x39, 0xdd, 0xf6, 0x33, 0xa8, 0x3d, 0xae, 0xf8, 0x23, 0x0d, 0x9d, 0x94, 0x49, 0x3c, 0xb7, 0xb5, 0xbd, 0xdd, - 0x55, 0x10, 0x0e, 0x75, 0x02, 0x80, 0x62, 0xa2, 0x31, 0x5d, 0xc5, 0xb0, 0xfb, 0x33, 0x53, 0x64, 0x80, 0x53, 0xea, 0xa3, 0x4d, 0xf7, 0xc5, 0xa6, 0x78, 0x51, 0x6b, 0x2f, 0xe4, 0x44, 0xde, 0xed, - 0x57, 0x3f, 0xa5, 0xe4, 0xb0, 0x38, 0xfd, 0x19, 0xc9, 0xf5, 0xbd, 0x06, 0x73, 0xcf, 0x85, 0x9a, 0x6f, 0x30, 0x5f, 0x48, 0x58, 0x67, 0x43, 0x43, 0xcd, 0x52, 0x26, 0xb6, 0x8c, 0x23, 0x83, 0xfb, - 0x48, 0x97, 0x91, 0xe6, 0x48, 0x99, 0xa8, 0x4f, 0x2d, 0x83, 0x6c, 0x5a, 0xef, 0x95, 0x00, 0x6d, 0x6d, 0x77, 0x27, 0xcb, 0xf3, 0xbd, 0x76, 0x12, 0x96, 0x82, 0x6d, 0xe7, 0x18, 0xc4, 0x24, 0x2d, - 0x39, 0x8e, 0x4a, 0x56, 0x9f, 0xac, 0xad, 0x0a, 0x36, 0x2a, 0x40, 0xe4, 0x19, 0x62, 0x96, 0xd3, 0x65, 0xbd, 0xcc, 0x96, 0xda, 0x14, 0x12, 0xcb, 0x64, 0xb9, 0x89, 0x1e, 0x65, 0xe4, 0xdd, 0xa7, - 0x68, 0x94, 0xda, 0x66, 0x75, 0xd6, 0x5e, 0x6e, 0xd9, 0x23, 0xbf, 0x37, 0x42, 0x30, 0x2b, 0x7f, 0xe4, 0x9e, 0x82, 0xb2, 0x7a, 0x71, 0x40, 0x3d, 0x43, 0xa7, 0x41, 0x2b, 0xee, 0xbd, 0xf4, 0xfd, - 0xda, 0x40, 0x7d, 0x66, 0xa2, 0xcb, 0x1b, 0xd8, 0x33, 0xb1, 0x5e, 0x4f, 0x2e, 0x93, 0x1a, 0x06, 0x34, 0x78, 0x75, 0x62, 0xba, 0xc4, 0xa5, 0x96, 0x5c, 0xd9, 0xd0, 0xbc, 0x59, 0xef, 0xad, 0xd2, - 0x17, 0x88, 0xde, 0xf6, 0x27, 0x0c, 0xad, 0x1c, 0xe4, 0xa8, 0xef, 0x59, 0x43, 0x47, 0x9b, 0x2e, 0x52, 0xe8, 0x65, 0x3e, 0xf3, 0x36, 0x94, 0x6e, 0x07, 0x56, 0xa4, 0xea, 0x22, 0xe7, 0x69, 0xc4, - 0x26, 0xa8, 0x57, 0x90, 0x0b, 0xa3, 0xee, 0x74, 0x6f, 0xa4, 0xc6, 0x0e, 0x6f, 0x9d, 0xc2, 0x6d, 0x48, 0x09, 0x15, 0xda, 0xbf, 0xb6, 0x45, 0x55, 0xd7, 0x6f, 0xfe, 0xbd, 0x4d, 0x55, 0x11, 0xc4, - 0x85, 0xe9, 0xbd, 0xee, 0x5d, 0x3f, 0xad, 0x8f, 0x7c, 0x76, 0xef, 0x7a, 0xfd, 0x49, 0xf7, 0xbc, 0x0a, 0x4f, 0x6c, 0x5c, 0x57, 0x98, 0x37, 0x8a, 0x55, 0xae, 0x33, 0xb4, 0xe8, 0xae, 0x67, 0x52, - 0x46, 0x0e, 0x6a, 0xa7, 0x03, 0x0a, 0x7c, 0xd3, 0x24, 0x9b, 0x16, 0xe5, 0x56, 0x1d, 0x9e, 0x96, 0x60, 0xaa, 0xac, 0xf6, 0x8b, 0xbe, 0xe8, 0x8f, 0x26, 0x58, 0x8d, 0xa7, 0x79, 0x61, 0x54, 0x82, - 0xaf, 0xb6, 0x94, 0x55, 0x11, 0x1d, 0x25, 0x8e, 0xfb, 0xb5, 0x66, 0x1f, 0xb5, 0x02, 0xa0, 0xa2, 0x60, 0x47, 0xb1, 0x16, 0xd1, 0x89, 0x7e, 0x4b, 0x69, 0x06, 0xb9, 0x9b, 0x19, 0xb8, 0xd1, 0xff, - 0xdc, 0xee, 0x4d, 0x8b, 0x91, 0x6b, 0xda, 0xf7, 0xc6, 0xd6, 0x42, 0xbf, 0xd0, 0x67, 0xa2, 0xde, 0x37, 0xa0, 0x67, 0xa4, 0xdc, 0x0e, 0x47, 0x17, 0x48, 0x8f, 0xb1, 0x72, 0xcc, 0xf7, 0x1e, 0x9f, - 0x91, 0x71, 0x4a, 0x37, 0xcb, 0x4e, 0xf6, 0xa8, 0x2e, 0xd4, 0x90, 0x86, 0x64, 0x00, 0x44, 0xc0, 0xe4, 0xa3, 0x3b, 0x71, 0x97, 0x38, 0x30, 0xed, 0x69, 0xbd, 0x30, 0x03, 0x11, 0x0e, 0x0e, 0x09, - 0x05, 0xb7, 0xc7, 0x60, 0x41, 0xce, 0x2c, 0xba, 0xd9, 0x88, 0x5a, 0x23, 0x7b, 0x42, 0x15, 0x6f, 0x4c, 0x6c, 0x81, 0x28, 0xa9, 0xbc, 0x2d, 0x0a, 0x3d, 0x68, 0x1c, 0xd5, 0x88, 0x07, 0x5a, 0x7d, - 0x5f, 0xf5, 0x3a, 0x45, 0x87, 0xb0, 0x55, 0x5a, 0xc4, 0x23, 0xc7, 0xac, 0xbe, 0xab, 0x6f, 0x7a, 0x42, 0x6e, 0xbf, 0x40, 0xbd, 0x62, 0xf1, 0x7a, 0x7c, 0xa9, 0x71, 0x1a, 0x20, 0xbb, 0xd9, 0x2d, - 0x1b, 0x46, 0x9b, 0x79, 0x80, 0x57, 0x90, 0xbc, 0x36, 0xea, 0x40, 0x4f, 0x19, 0x50, 0x26, 0x1a, 0x3b, 0x39, 0xd9, 0xbc, 0x2c, 0xe1, 0x8d, 0x53, 0x1f, 0x36, 0x59, 0xcd, 0x74, 0x01, 0xb1, 0xd9, - 0xcd, 0x03, 0xc4, 0x8e, 0x24, 0x29, 0x03, 0x4e, 0x07, 0xd6, 0xaf, 0xd7, 0xe6, 0x62, 0x02, 0xf4, 0xf3, 0x43, 0x82, 0xc2, 0x9c, 0x83, 0xa0, 0xb8, 0x86, 0xe2, 0x1e, 0xb9, 0xe8, 0xc2, 0xd0, 0x6c, - 0x9f, 0x97, 0xdd, 0x66, 0xd9, 0x25, 0x76, 0x18, 0x5c, 0xcd, 0x45, 0xe8, 0x73, 0xf1, 0xa0, 0x9d, 0xc6, 0xd6, 0x65, 0xe6, 0xd9, 0xeb, 0xf0, 0xb1, 0xeb, 0x2e, 0x4c, 0xbd, 0x7f, 0x28, 0x0e, 0x62, - 0xf7, 0x62, 0xbf, 0xbe, 0x8b, 0x42, 0xfd, 0x54, 0x6c, 0xfc, 0x8f, 0xff, 0xfe, 0xc7, 0x20, 0x17, 0x5a, 0x5a, 0xc4, 0x81, 0x73, 0x63, 0x83, 0xbf, 0xd1, 0x73, 0xf6, 0x0a, 0xf6, 0x46, 0xd1, 0xeb, - 0xc9, 0x50, 0x3f, 0x19, 0xc4, 0xda, 0x1b, 0xba, 0x9d, 0xcc, 0xd8, 0x9e, 0x6f, 0xbc, 0x20, 0x2c, 0xc9, 0x34, 0x5e, 0x01, 0x9b, 0x60, 0xbf, 0x62, 0x82, 0x29, 0xb0, 0xed, 0x39, 0x4c, 0xb2, 0x5b, - 0x58, 0x8d, 0xd4, 0x74, 0x9e, 0xf8, 0xea, 0x69, 0x6a, 0xaf, 0xb9, 0x63, 0x05, 0x49, 0xe4, 0x89, 0x6a, 0x59, 0x0b, 0xaa, 0x09, 0x71, 0x51, 0x53, 0x82, 0x45, 0x53, 0xda, 0x1c, 0x4d, 0x4e, 0x55, - 0x34, 0xc3, 0x27, 0xa4, 0xd5, 0x3c, 0xac, 0xfd, 0xbb, 0x4f, 0xd2, 0xb7, 0x91, 0x66, 0x5f, 0x74, 0x75, 0xf7, 0xdd, 0x53, 0x1a, 0x38, 0x7f, 0x7e, 0xa9, 0x4e, 0xa5, 0x89, 0xfd, 0xb2, 0xbc, 0x3e, - 0xf1, 0xc1, 0xfb, 0xac, 0xca, 0x27, 0x9b, 0x67, 0x85, 0xe9, 0xc8, 0x0b, 0x2e, 0xe1, 0xa1, 0xaa, 0x4e, 0x12, 0x3b, 0x4c, 0x27, 0x69, 0xe1, 0x82, 0x76, 0x1a, 0xc7, 0x41, 0x79, 0xa6, 0xde, 0xa0, - 0xac, 0xb3, 0xb4, 0x68, 0xcd, 0xc2, 0xb9, 0xbb, 0x4f, 0x40, 0xcf, 0xf9, 0x02, 0x5f, 0xa0, 0x5e, 0x89, 0x7f, 0x3d, 0x1e, 0x41, 0xc3, 0xbc, 0x81, 0x56, 0xad, 0xcc, 0x21, 0x2f, 0x1b, 0x57, 0xca, - 0x62, 0xb3, 0x9d, 0x88, 0xcc, 0xc6, 0x25, 0xfc, 0x29, 0x82, 0x53, 0x15, 0x5b, 0x5b, 0xb3, 0x54, 0xe1, 0x2d, 0xcc, 0x10, 0x18, 0x42, 0x38, 0xad, 0x77, 0x0b, 0xa1, 0x45, 0x0e, 0xa2, 0xdd, 0x2e, - 0x52, 0xba, 0xed, 0x4c, 0x2b, 0xea, 0xd7, 0xbd, 0xc8, 0xe0, 0x3d, 0x7d, 0x62, 0x68, 0x1e, 0xe6, 0x84, 0x63, 0x08, 0x0a, 0x15, 0xb1, 0xde, 0xd2, 0xe6, 0x3e, 0xfd, 0x89, 0xe7, 0xf9, 0x0f, 0x68, - 0xd0, 0xe0, 0x13, 0xaf, 0xfc, 0x55, 0xb8, 0x66, 0x94, 0x7d, 0x37, 0x07, 0xfd, 0x29, 0x59, 0xf8, 0x06, 0xf7, 0x8c, 0xbe, 0xb7, 0xb3, 0x21, 0x01, 0x32, 0x78, 0x34, 0x93, 0x37, 0xd5, 0x6a, 0xb3, - 0xde, 0x1d, 0xb9, 0x8c, 0x41, 0xa0, 0x34, 0xf1, 0xa9, 0x72, 0x2c, 0x2b, 0xb1, 0x4a, 0x84, 0xd4, 0x4f, 0xb7, 0xcb, 0xf2, 0xdb, 0x9c, 0x7a, 0xe4, 0xa9, 0xc9, 0x2e, 0x2f, 0x40, 0x2f, 0x9f, 0x76, - 0xcb, 0xab, 0x47, 0x86, 0x4d, 0x76, 0x39, 0x05, 0xf9, 0x5a, 0x56, 0xb0, 0x13, 0xe3, 0x2e, 0xb6, 0xf5, 0x98, 0xae, 0xb5, 0x18, 0xf0, 0x66, 0x8a, 0xbd, 0x14, 0x0f, 0xdc, 0x78, 0x1d, 0x88, 0x63, - 0x09, 0x70, 0xf5, 0xa0, 0xdb, 0x92, 0xc7, 0xf2, 0xb0, 0x9b, 0xe4, 0xb0, 0x15, 0xee, 0xba, 0x43, 0x05, 0x41, 0x29, 0xb3, 0x49, 0xdb, 0x31, 0xc9, 0x3a, 0x55, 0x26, 0x2e, 0x4c, 0x53, 0x3a, 0x70, - 0x15, 0x05, 0x23, 0x12, 0x6d, 0x5a, 0xc0, 0x74, 0xca, 0x3d, 0xaa, 0x65, 0xf5, 0xcd, 0x72, 0x99, 0x94, 0x95, 0x19, 0x45, 0x9b, 0xcb, 0x40, 0x8f, 0xcf, 0xf7, 0x3f, 0xb5, 0x99, 0x78, 0xbb, 0x7e, - 0x46, 0xdb, 0xff, 0x7a, 0x27, 0x42, 0xcc, 0xa2, 0x7d, 0x8b, 0xd9, 0xfe, 0xef, 0x61, 0xbc, 0xf8, 0x2f, 0xea, 0x17, 0x4c, 0x5c, 0x35, 0xbf, 0xb3, 0x16, 0x48, 0xbc, 0x2a, 0x81, 0xf0, 0x50, 0x25, - 0xf0, 0xd3, 0x5c, 0x93, 0x3b, 0x2e, 0xbb, 0x67, 0x04, 0xfc, 0x7b, 0xc8, 0x67, 0x62, 0xbe, 0x3f, 0x1f, 0x1a, 0xbf, 0xeb, 0x96, 0x69, 0xc3, 0xf4, 0x6b, 0x1d, 0xa3, 0xcb, 0x19, 0xb5, 0x8f, 0x70, - 0xca, 0xdb, 0x4c, 0xb4, 0x15, 0x5e, 0x36, 0x1b, 0xbe, 0x36, 0x03, 0x4b, 0x3a, 0xe9, 0xf2, 0x6a, 0xc6, 0xc7, 0x63, 0xd1, 0xda, 0xd6, 0x93, 0x02, 0x5a, 0x7b, 0x30, 0x17, 0x48, 0x69, 0x36, 0x5f, - 0xd3, 0x42, 0x30, 0x3b, 0x06, 0xfb, 0xf1, 0xc4, 0xf2, 0x4c, 0x13, 0x99, 0xf9, 0x84, 0x55, 0xb8, 0x32, 0xc1, 0x08, 0xbb, 0xed, 0x12, 0x7a, 0x90, 0x36, 0xfa, 0x4d, 0xcb, 0xe2, 0x7b, 0x6b, 0xf8, - 0x79, 0xec, 0xfc, 0xf6, 0x96, 0x77, 0x98, 0xfa, 0xed, 0xde, 0x90, 0xb4, 0x51, 0x78, 0x34, 0x6f, 0xf3, 0xbe, 0xd9, 0xa9, 0x24, 0x77, 0x80, 0x8f, 0xb1, 0xc3, 0xd9, 0xd3, 0x23, 0x71, 0x28, 0xa3, - 0xe5, 0xe2, 0xd0, 0xfd, 0x34, 0xca, 0xfb, 0x79, 0xa2, 0xcd, 0x3d, 0xe6, 0xf8, 0xb9, 0x4e, 0xfc, 0x01, 0x32, 0x38, 0xfa, 0x78, 0x3e, 0x74, 0xee, 0xae, 0xbc, 0xda, 0xf5, 0xf0, 0xf6, 0x48, 0xae, - 0x37, 0x10, 0x4d, 0x4b, 0x6e, 0xa3, 0xce, 0xf1, 0x63, 0x93, 0x54, 0x74, 0xb5, 0x09, 0x75, 0x81, 0xe2, 0x60, 0xcc, 0x39, 0xc9, 0x51, 0x10, 0xae, 0x6a, 0xa9, 0xc2, 0xea, 0x29, 0xed, 0x2f, 0x98, - 0xc5, 0x91, 0xef, 0xf8, 0x71, 0xc0, 0x2b, 0x78, 0xcf, 0xf2, 0x6e, 0x34, 0x76, 0xa6, 0xb4, 0x2c, 0x28, 0x8c, 0x6e, 0xf4, 0xe5, 0xea, 0x04, 0x69, 0xe6, 0x94, 0xa7, 0x87, 0xa6, 0x94, 0x3c, 0x9e, - 0x07, 0xf4, 0xc3, 0x01, 0x3e, 0x2f, 0x6b, 0xf5, 0x47, 0x3b, 0xfc, 0x5f, 0xea, 0xe6, 0x7f, 0x77, 0x1a, 0xd1, 0xdf, 0xb7, 0x55, 0x7d, 0xfd, 0x8a, 0x1b, 0xc1, 0x7f, 0xbf, 0x31, 0x64, 0x03, 0xbb, - 0x24, 0x78, 0xb2, 0xb1, 0xb3, 0x80, 0xf7, 0xcd, 0x52, 0x0e, 0x8c, 0x2c, 0xaa, 0x26, 0xc2, 0x21, 0xac, 0x03, 0x35, 0xe9, 0xea, 0xb0, 0x3f, 0xad, 0x41, 0x85, 0x10, 0xa6, 0x2b, 0x1d, 0x85, 0x39, - 0x17, 0x1d, 0xcf, 0x61, 0x21, 0xc7, 0x2d, 0x68, 0x83, 0x48, 0xbe, 0x8e, 0xd3, 0x2a, 0x17, 0xd0, 0x8d, 0x91, 0x49, 0x53, 0x79, 0xe7, 0xe4, 0x09, 0x00, 0x2f, 0x6d, 0x93, 0x69, 0x93, 0x7e, 0xbb, - 0xc5, 0x9b, 0xc9, 0xf1, 0x79, 0x85, 0xfe, 0xc1, 0xf4, 0x96, 0x7b, 0x83, 0xa1, 0x7e, 0xa3, 0xf8, 0x63, 0xb5, 0xe3, 0x9f, 0x18, 0xfa, 0xf0, 0x4d, 0x6e, 0x2f, 0xf9, 0x0b, 0x7e, 0x22, 0x9f, 0xe5, - 0x96, 0xd6, 0x7b, 0x49, 0x65, 0xbd, 0x40, 0x78, 0x4c, 0x70, 0xbe, 0x35, 0x4f, 0x6d, 0x67, 0x90, 0x08, 0x1f, 0x92, 0x8d, 0xb1, 0x14, 0x2a, 0x41, 0x28, 0xba, 0x56, 0x87, 0x8c, 0x9a, 0xef, 0x36, - 0x55, 0xe1, 0x4c, 0x2b, 0xd3, 0x72, 0x3d, 0x83, 0x63, 0xf6, 0xb8, 0x31, 0x5f, 0xf9, 0xbb, 0xea, 0xe0, 0xf4, 0x49, 0x54, 0x2b, 0x6e, 0x79, 0x12, 0x62, 0x29, 0xa8, 0x58, 0x68, 0xc3, 0x88, 0x80, - 0x88, 0x10, 0xa5, 0xb6, 0x5d, 0xb8, 0xdc, 0x66, 0x89, 0xb4, 0xeb, 0xf1, 0xa3, 0x9d, 0xfd, 0x9b, 0xd5, 0xff, 0x41, 0xb3, 0xfb, 0x42, 0xad, 0x0f, 0x12, 0xef, 0x12, 0x1c, 0xfc, 0xf3, 0x4b, 0x83, - 0x20, 0x48, 0x7c, 0xb7, 0x08, 0xae, 0x8e, 0xb9, 0x0f, 0x9c, 0xf2, 0xa0, 0x67, 0xfb, 0x3b, 0x63, 0x01, 0xfd, 0xc2, 0xdb, 0x17, 0x5c, 0x86, 0xec, 0xa4, 0x51, 0x5d, 0xbd, 0x0f, 0x68, 0xfe, 0x8c, - 0xcb, 0xfe, 0xdb, 0xdf, 0xc7, 0x60, 0x41, 0x69, 0x9a, 0xf6, 0x10, 0x13, 0xe3, 0x63, 0x4e, 0xf3, 0x57, 0x7c, 0x86, 0x3f, 0x95, 0xe2, 0xf2, 0x0e, 0xee, 0x0b, 0xbb, 0x5d, 0xcf, 0x2e, 0x5d, 0x3d, - 0x07, 0xe8, 0x93, 0x8c, 0xb8, 0x3c, 0x6c, 0xe4, 0x89, 0x9b, 0x05, 0xab, 0x7d, 0x2b, 0xa1, 0x8c, 0x92, 0xcc, 0x4f, 0x00, 0xbe, 0x4b, 0xb6, 0x35, 0xb2, 0x18, 0xef, 0x9d, 0xde, 0x9a, 0x4b, 0x18, - 0xee, 0xf2, 0x2d, 0xdc, 0x14, 0x68, 0x3f, 0x46, 0x1b, 0x83, 0x77, 0x3b, 0xd7, 0x81, 0xcb, 0x09, 0xed, 0x27, 0x96, 0x2d, 0xda, 0x34, 0xb8, 0x29, 0xd6, 0xdd, 0x1a, 0x57, 0x24, 0xb9, 0x08, 0xe7, - 0x3d, 0x66, 0x6e, 0x68, 0x23, 0x7d, 0x5e, 0xcc, 0x7c, 0x9e, 0x3f, 0xf0, 0x84, 0x04, 0x19, 0x62, 0xb6, 0xbc, 0xcd, 0x58, 0xf8, 0x72, 0x1f, 0x40, 0x2f, 0x93, 0x4f, 0x9e, 0xa1, 0x85, 0x79, 0x29, - 0xe1, 0xbe, 0x1d, 0x8d, 0xae, 0x80, 0x1e, 0x13, 0xa1, 0x58, 0x54, 0x0e, 0x43, 0x00, 0xd2, 0x74, 0xbc, 0x3c, 0xba, 0x6c, 0xc3, 0xd0, 0x70, 0x91, 0xe5, 0x3d, 0xdb, 0x84, 0x60, 0x88, 0x82, 0x01, - 0xc9, 0xba, 0x82, 0x1c, 0x14, 0x5d, 0xa0, 0xd5, 0xab, 0x05, 0xb4, 0x68, 0x69, 0x3b, 0xeb, 0x56, 0x6b, 0xa6, 0x42, 0x8e, 0x95, 0xc5, 0xb4, 0xaa, 0xa9, 0x38, 0xfe, 0x14, 0xc0, 0x49, 0x54, 0xc7, - 0x1a, 0xad, 0x25, 0x96, 0xf6, 0x91, 0x93, 0xcc, 0x32, 0xa0, 0x9f, 0xb7, 0xf4, 0x2f, 0x49, 0x03, 0xde, 0x4b, 0xb0, 0x1f, 0xfa, 0x85, 0xfc, 0xdc, 0x5f, 0xfb, 0x4f, 0xb6, 0xf3, 0x7a, 0xa1, 0xc3, - 0x87, 0x8b, 0xef, 0xbf, 0xe9, 0x8e, 0x8d, 0xff, 0xcc, 0xc8, 0xf0, 0x57, 0xb0, 0xe0, 0xe8, 0xed, 0x78, 0x74, 0x05, 0xf6, 0x98, 0xee, 0x82, 0x0b, 0xb8, 0x2c, 0x56, 0x40, 0x60, 0xa0, 0x25, 0x19, - 0x73, 0x9a, 0x52, 0x38, 0xd2, 0xa3, 0x0c, 0x20, 0x40, 0xe3, 0x0a, 0x57, 0x04, 0x10, 0x14, 0x8e, 0xab, 0x56, 0x71, 0x90, 0xdd, 0x6c, 0xc1, 0xc6, 0x45, 0xd7, 0x9e, 0x3c, 0xbc, 0x29, 0x8d, 0xc8, - 0xc7, 0x14, 0x22, 0x0a, 0x4e, 0x11, 0x31, 0x06, 0xda, 0x1e, 0xa4, 0x1c, 0x20, 0x36, 0xb7, 0x1b, 0x26, 0x14, 0xe0, 0xd9, 0x32, 0x5c, 0xa2, 0xfc, 0x23, 0xba, 0x3f, 0x0a, 0x5b, 0x3d, 0xe9, 0x88, - 0xf9, 0x9b, 0x08, 0x67, 0xdd, 0x0b, 0x69, 0xc2, 0xf0, 0x53, 0x7d, 0x15, 0xae, 0x30, 0x6f, 0x6b, 0xd2, 0xea, 0x46, 0x57, 0x30, 0x8f, 0x49, 0xe3, 0x79, 0x4e, 0x9c, 0x96, 0x47, 0x86, 0x82, 0xc8, - 0x8e, 0x04, 0x22, 0x06, 0x16, 0xd6, 0xd0, 0x91, 0xe5, 0x19, 0x65, 0x17, 0xef, 0xeb, 0x08, 0x24, 0x61, 0xfc, 0x14, 0x2c, 0x79, 0xf6, 0x98, 0xa2, 0xfe, 0x98, 0x97, 0xb6, 0x76, 0x50, 0x1c, 0x64, - 0x21, 0xd1, 0xd9, 0x49, 0x82, 0x1f, 0xd0, 0xb8, 0x52, 0xa8, 0xad, 0xc8, 0x4f, 0x76, 0x56, 0xe8, 0xd5, 0x26, 0xbc, 0xc8, 0xdc, 0x04, 0xc1, 0x41, 0xdd, 0x7e, 0x3e, 0xb6, 0x72, 0x9d, 0x2e, 0x59, - 0x27, 0x37, 0x64, 0xfc, 0x9e, 0x50, 0xff, 0x6e, 0x98, 0xfb, 0x75, 0x57, 0xfd, 0x3d, 0x63, 0xff, 0xdd, 0xed, 0x4f, 0x6a, 0xfc, 0xbb, 0xa1, 0x32, 0xf8, 0xe7, 0x89, 0x30, 0xdf, 0x15, 0xdb, 0x94, - 0x91, 0xf9, 0x61, 0xd2, 0xcc, 0x4f, 0x65, 0xc4, 0x3f, 0xce, 0x6b, 0x9f, 0x06, 0x38, 0x7e, 0x37, 0xfd, 0xfb, 0x8c, 0x18, 0xea, 0xc7, 0xec, 0xf7, 0x3a, 0xfa, 0xfb, 0x36, 0xf7, 0xfb, 0x02, 0xe5, - 0x31, 0xf7, 0x8d, 0xd7, 0x99, 0x37, 0x25, 0xa5, 0x2c, 0x60, 0xb7, 0xd9, 0x38, 0x02, 0x19, 0x62, 0x83, 0xd1, 0xd4, 0xd8, 0x5c, 0xae, 0x88, 0x3d, 0xc8, 0x8c, 0xb7, 0x34, 0xca, 0x6e, 0x2d, 0xab, - 0x43, 0x3c, 0x09, 0x82, 0x1a, 0x8c, 0xb5, 0x1a, 0x69, 0xac, 0x6b, 0x6c, 0x6a, 0x2a, 0xb0, 0x3a, 0x96, 0xb8, 0x12, 0x0d, 0x14, 0x1c, 0xcd, 0x56, 0x7b, 0x92, 0xad, 0x8c, 0x10, 0xe7, 0x98, 0xc9, - 0x12, 0x27, 0x03, 0x58, 0x7d, 0xb4, 0x2b, 0x3f, 0xda, 0x58, 0x87, 0xc4, 0xb3, 0x0f, 0x69, 0x76, 0xdf, 0xc5, 0xf2, 0x8c, 0x13, 0xe1, 0x0c, 0xf0, 0xbc, 0x7a, 0xd3, 0xcc, 0x19, 0xe2, 0x1a, 0xb8, - 0x84, 0x45, 0x09, 0xdc, 0x12, 0xa2, 0xa5, 0xe9, 0x9c, 0x9a, 0xcc, 0x02, 0x19, 0xc4, 0xb4, 0x76, 0x4e, 0x94, 0x73, 0xf9, 0x0e, 0x27, 0xd0, 0x63, 0xad, 0x24, 0x06, 0xac, 0x55, 0x21, 0x51, 0xc2, - 0xe5, 0x52, 0xa1, 0x6a, 0xa1, 0xd4, 0x15, 0x12, 0x3a, 0xe5, 0xcb, 0x7e, 0x97, 0x9f, 0x76, 0x1e, 0xec, 0x6e, 0xf3, 0x69, 0x9d, 0xb4, 0x5b, 0x64, 0x1d, 0xda, 0x3d, 0xeb, 0x9a, 0x6e, 0x3f, 0xe1, - 0xb6, 0x86, 0xdf, 0x0e, 0xb4, 0x99, 0xbf, 0xb6, 0x83, 0xfe, 0x09, 0xcb, 0xd7, 0x37, 0x0b, 0x67, 0x54, 0xb8, 0xc7, 0xd7, 0xbe, 0x07, 0x5f, 0xd1, 0xe4, 0xb9, 0xa2, 0xb3, 0x8f, 0xa0, 0xc1, 0xd1, - 0xa7, 0x0b, 0x43, 0x8b, 0xcb, 0x76, 0x4b, 0x63, 0x0c, 0x04, 0xd6, 0xd4, 0x3f, 0x91, 0xa2, 0xe5, 0x33, 0x2e, 0x29, 0xee, 0xaa, 0x94, 0xb5, 0x6a, 0x09, 0xf3, 0xc1, 0x75, 0x2d, 0x6e, 0x17, 0x2b, - 0x60, 0x45, 0xf9, 0xa0, 0x3b, 0xd6, 0xd3, 0x6a, 0xb5, 0x8f, 0x20, 0x6f, 0x7c, 0x50, 0x48, 0xe4, 0x34, 0x9d, 0x4d, 0xb8, 0xc3, 0xd2, 0x47, 0x10, 0x71, 0x65, 0x2c, 0xc5, 0x9d, 0x70, 0x1a, 0xaf, - 0xb5, 0xda, 0x67, 0x0a, 0x18, 0x2a, 0xa8, 0x85, 0xf3, 0xc8, 0xe0, 0xf9, 0x1b, 0x12, 0xae, 0xaf, 0x4e, 0x8f, 0x7b, 0x2c, 0xfe, 0xf3, 0x2d, 0xca, 0x37, 0xcb, 0x0b, 0x0e, 0xcb, 0xd1, 0xd0, 0xbd, - 0x09, 0x71, 0x1a, 0x11, 0xda, 0xa9, 0x84, 0xe8, 0x1e, 0x49, 0x25, 0xd4, 0x56, 0xf3, 0xc2, 0xf5, 0x8f, 0x56, 0xbf, 0x66, 0x8e, 0xb3, 0x0c, 0x07, 0x77, 0x9c, 0x94, 0xe1, 0xd5, 0x36, 0xd3, 0x96, - 0x3b, 0x6c, 0xb5, 0x58, 0x18, 0x1c, 0x0c, 0x8e, 0x4f, 0xd6, 0x4c, 0xa9, 0x3c, 0xb0, 0x0c, 0x18, 0x64, 0xa3, 0x6d, 0x5d, 0x88, 0xb6, 0xcd, 0x69, 0xbc, 0xab, 0xf6, 0xfb, 0x5e, 0x63, 0x97, 0xd6, - 0x78, 0x83, 0x0d, 0x4d, 0x94, 0xbd, 0xe7, 0x14, 0xfa, 0x8d, 0xc1, 0x1f, 0x49, 0x93, 0x6b, 0x50, 0x70, 0x10, 0xb6, 0x47, 0x56, 0x70, 0x08, 0xee, 0xfb, 0xe0, 0x3f, 0x3a, 0x23, 0x7e, 0x80, 0xf5, - 0x17, 0xb8, 0x37, 0xec, 0xdf, 0xce, 0x2e, 0x54, 0x18, 0xa0, 0xbc, 0x55, 0x9b, 0x66, 0xc2, 0x55, 0xe3, 0x82, 0x8e, 0xc2, 0x19, 0xc4, 0x9e, 0x20, 0x53, 0x0e, 0x24, 0x5a, 0x00, 0xc4, 0x6c, 0x87, - 0xf5, 0x01, 0x52, 0x80, 0x82, 0xeb, 0xe2, 0xbb, 0x50, 0x99, 0x5a, 0x66, 0xde, 0xa0, 0xb8, 0xc2, 0xef, 0xd7, 0xbd, 0xd5, 0xca, 0xde, 0x6c, 0x63, 0x18, 0x0b, 0x28, 0x54, 0x00, 0xc5, 0x21, 0x50, - 0x08, 0x51, 0x57, 0x06, 0x92, 0x81, 0xd6, 0x6a, 0xc2, 0xa6, 0x0a, 0xba, 0xfb, 0x5c, 0xe4, 0xf7, 0x1b, 0xfb, 0xfe, 0x07, 0x88, 0x8d, 0x72, 0xe4, 0x45, 0xe6, 0xfd, 0xde, 0xde, 0xcf, 0xb8, 0xc8, - 0x5e, 0x80, 0xde, 0x10, 0x7d, 0x3e, 0x1c, 0x1c, 0xd7, 0xee, 0xc2, 0xd5, 0x16, 0x94, 0x61, 0xee, 0xb8, 0xd5, 0xec, 0x2a, 0xcb, 0x0e, 0x4b, 0xe6, 0xe0, 0x6d, 0x44, 0xa8, 0xe2, 0x76, 0xb5, 0xa1, - 0x1e, 0xfd, 0xc3, 0xba, 0x80, 0xc9, 0x30, 0xdf, 0xd6, 0xf1, 0x3a, 0x22, 0x18, 0xaf, 0x41, 0xd9, 0xe5, 0x26, 0x72, 0x55, 0x32, 0x37, 0xd4, 0x3e, 0xd5, 0xa7, 0xb3, 0x2d, 0xb3, 0xd8, 0x4e, 0x27, - 0x98, 0x20, 0xa6, 0x73, 0xd0, 0x38, 0xa9, 0x28, 0xdb, 0x44, 0x6b, 0xe9, 0x11, 0x96, 0x07, 0x9b, 0x36, 0xdf, 0xe3, 0xf1, 0xcd, 0x01, 0xfa, 0xb7, 0x0a, 0x8b, 0x17, 0xb8, 0x37, 0x6c, 0xde, 0xce, - 0x86, 0x0a, 0x8f, 0x08, 0xe5, 0x27, 0xf5, 0x8c, 0x58, 0x1f, 0xa6, 0x42, 0xbb, 0x9d, 0x72, 0xa1, 0xb3, 0x9f, 0xb3, 0x81, 0xbf, 0x3f, 0x56, 0x78, 0xa6, 0x48, 0x16, 0x7b, 0xc0, 0x88, 0xa2, 0x8a, - 0xe2, 0x64, 0x23, 0x45, 0xaa, 0x75, 0x88, 0xc7, 0x14, 0x2f, 0x2e, 0x0b, 0x6e, 0x65, 0xed, 0xf7, 0xb3, 0xf1, 0xc6, 0x4a, 0x24, 0x73, 0xe5, 0x9e, 0xd6, 0x5c, 0x15, 0x48, 0x22, 0xe5, 0xc7, 0xae, - 0x72, 0x54, 0x7a, 0x64, 0xeb, 0x00, 0xcc, 0xcf, 0x22, 0x8b, 0xff, 0x84, 0x8b, 0xef, 0xf7, 0xf9, 0xd2, 0xf7, 0x88, 0xf2, 0x1c, 0x7f, 0xbf, 0x83, 0x7d, 0x23, 0xcc, 0xbb, 0x2b, 0x43, 0x9d, 0xbe, - 0xe1, 0xec, 0x68, 0x6f, 0x04, 0x3f, 0x89, 0xe6, 0x3b, 0x38, 0xec, 0xd2, 0x79, 0x48, 0x8a, 0x3a, 0xb7, 0x31, 0xdb, 0x05, 0xbe, 0x12, 0x2d, 0x90, 0xef, 0x55, 0x1b, 0x6f, 0xe9, 0x31, 0x84, 0xf8, - 0xe2, 0x56, 0x84, 0x1c, 0x6f, 0xa6, 0x1c, 0xad, 0x85, 0xcc, 0x35, 0x07, 0xd8, 0x21, 0x6c, 0x0f, 0x5d, 0x58, 0xae, 0x1a, 0x57, 0x2a, 0xbd, 0xb3, 0xac, 0x1d, 0x9a, 0xf7, 0x06, 0xb2, 0x75, 0x7d, - 0x9a, 0xd4, 0x06, 0x26, 0x50, 0x7e, 0xe5, 0xb2, 0xff, 0xb9, 0xd9, 0xff, 0x4f, 0x51, 0xf7, 0x25, 0xff, 0xe0, 0x6f, 0x24, 0xea, 0x05, 0xe4, 0x99, 0x96, 0x97, 0x83, 0xa1, 0x24, 0x94, 0x67, 0xfc, - 0x0e, 0xaa, 0x4c, 0x4d, 0x16, 0x8d, 0xaa, 0x59, 0x2a, 0x4b, 0xc6, 0x19, 0x4f, 0x7c, 0xb7, 0x8c, 0xd3, 0x83, 0x51, 0x54, 0xb5, 0xde, 0xec, 0xb4, 0x72, 0xb6, 0x30, 0xb6, 0x21, 0xb2, 0x51, 0x01, - 0x33, 0x29, 0xb3, 0xdc, 0x40, 0x9a, 0x75, 0x92, 0xf2, 0x07, 0x72, 0xc9, 0xc2, 0x80, 0x1a, 0xc2, 0x84, 0x00, 0xd3, 0x8c, 0x14, 0xd8, 0xf0, 0xb8, 0x9e, 0x51, 0xd6, 0x84, 0xb2, 0x91, 0x18, 0x7f, - 0x64, 0x38, 0xfe, 0x1d, 0x02, 0x2b, 0x2d, 0x2b, 0xd7, 0x19, 0x1d, 0x82, 0xb3, 0x02, 0xeb, 0xa5, 0x77, 0xe5, 0xff, 0x53, 0x0a, 0xe3, 0x47, 0xd8, 0x67, 0x9c, 0x7e, 0xbc, 0x32, 0x34, 0x43, 0x35, - 0xec, 0x26, 0x35, 0x2b, 0x6a, 0xc7, 0x55, 0x6e, 0xd4, 0x53, 0x4b, 0x59, 0xf4, 0x3c, 0xb5, 0xa3, 0x51, 0xa1, 0x97, 0xfd, 0x76, 0x39, 0x26, 0xe1, 0x74, 0xa6, 0x6d, 0xba, 0x7e, 0x97, 0x02, 0x9c, - 0x64, 0x2c, 0x81, 0x2c, 0x91, 0x25, 0xe9, 0x54, 0xdb, 0x4e, 0x58, 0x88, 0x46, 0x13, 0xf2, 0x4a, 0x52, 0x78, 0xb8, 0xaa, 0x94, 0xf2, 0x1a, 0x58, 0xae, 0x20, 0x7a, 0xda, 0x22, 0xb4, 0xad, 0x30, - 0xfc, 0xf2, 0x91, 0xca, 0xf8, 0x4d, 0x86, 0x6a, 0x51, 0x7f, 0x9a, 0x0c, 0xfb, 0x97, 0x6c, 0xe0, 0xfb, 0xc4, 0x09, 0x5c, 0xd7, 0x25, 0x71, 0xec, 0x2e, 0x7f, 0x3f, 0x33, 0xc0, 0xfc, 0x06, 0xf3, - 0x6c, 0x9b, 0x5e, 0x8f, 0x86, 0x0e, 0x2c, 0x77, 0xec, 0x2e, 0xf7, 0xa7, 0x8d, 0x0e, 0x4f, 0x30, 0x22, 0xd2, 0x0d, 0x7b, 0x97, 0x4f, 0x32, 0x0e, 0x98, 0x55, 0x6b, 0x45, 0xde, 0x39, 0xcb, 0xb5, - 0x40, 0x80, 0x53, 0x0f, 0x3f, 0x96, 0x48, 0x9f, 0xd6, 0x6a, 0x99, 0xcf, 0xc9, 0x25, 0x51, 0xce, 0x4e, 0x41, 0xb5, 0x9c, 0x00, 0x24, 0xb7, 0xe7, 0x10, 0x9a, 0x73, 0x74, 0x91, 0x5f, 0x38, 0x35, - 0xdd, 0xf3, 0x58, 0x39, 0x4b, 0xd2, 0x9d, 0x9c, 0xe4, 0xe6, 0x07, 0x22, 0xbc, 0x89, 0x8b, 0xb7, 0xe4, 0x81, 0x37, 0xe4, 0x7d, 0x57, 0x3e, 0x3e, 0x4c, 0xac, 0x78, 0x6e, 0x91, 0x96, 0xaf, 0x5e, - 0x82, 0x77, 0xc4, 0xba, 0xf3, 0x9a, 0xcc, 0xac, 0x0a, 0x37, 0x4d, 0xbe, 0x7d, 0x4f, 0xdb, 0xb6, 0xbf, 0x6e, 0xcf, 0x5d, 0x5e, 0xf6, 0xd3, 0x77, 0xd8, 0x69, 0x52, 0xd6, 0x51, 0x75, 0xfe, 0xec, - 0xef, 0x5e, 0x73, 0x05, 0x7b, 0x21, 0xe0, 0x6d, 0xf4, 0xc7, 0xbb, 0x57, 0xdc, 0x8e, 0xfe, 0xf7, 0x37, 0x8c, 0xf4, 0x9d, 0x8b, 0x03, 0x7b, 0xaa, 0x74, 0xfb, 0xb3, 0x8b, 0x03, 0x7b, 0x5c, 0xa6, - 0x7d, 0xe6, 0x22, 0xbb, 0x9b, 0x4d, 0xb9, 0x22, 0xb7, 0xc1, 0xbd, 0x63, 0x6b, 0xb3, 0x24, 0x58, 0xf9, 0xfd, 0x12, 0x43, 0x00, 0xa6, 0xdf, 0x00, 0x07, 0xa1, 0x8d, 0xd5, 0x5e, 0xdc, 0xcc, 0x6c, - 0x65, 0x22, 0xef, 0xdb, 0x6e, 0x53, 0x8f, 0xc7, 0xe3, 0x0e, 0xe4, 0x8e, 0xf5, 0x49, 0xe3, 0x0d, 0x70, 0xb6, 0x60, 0x17, 0xc4, 0x3a, 0xcd, 0x61, 0x21, 0xe8, 0xd7, 0xe2, 0x58, 0xeb, 0xb6, 0x76, - 0x43, 0x89, 0x98, 0x68, 0x2c, 0xd7, 0x7f, 0x51, 0x4e, 0x0e, 0x72, 0x71, 0xdc, 0x3e, 0xd3, 0xea, 0x46, 0x8e, 0xeb, 0x99, 0x75, 0xf4, 0xf7, 0xf6, 0xda, 0xfa, 0x0d, 0xfa, 0x1b, 0x62, 0xdf, 0xae, - 0x0d, 0xf1, 0x84, 0xc0, 0xa3, 0xcd, 0x3a, 0xab, 0xec, 0xc6, 0x9a, 0xa7, 0x04, 0xc5, 0xe4, 0x26, 0xcc, 0xe1, 0xa9, 0x53, 0x60, 0x58, 0xe0, 0x72, 0x6d, 0xf8, 0xc3, 0x24, 0x89, 0x4f, 0x83, 0xa5, - 0xbf, 0xfa, 0xda, 0xe7, 0x9a, 0x8b, 0xbe, 0x07, 0x7c, 0xfe, 0xd0, 0x77, 0xa7, 0x43, 0x1b, 0x8d, 0x36, 0xee, 0x7e, 0xef, 0xcb, 0x26, 0x30, 0x85, 0xe5, 0x31, 0xd7, 0x27, 0x8d, 0xaf, 0x2e, 0x4e, - 0x16, 0xe5, 0x99, 0xa7, 0xa8, 0x68, 0xd5, 0xe4, 0x54, 0xba, 0x53, 0xc6, 0x62, 0x32, 0x0c, 0x27, 0x59, 0xa8, 0xe5, 0x85, 0x20, 0x45, 0x2c, 0x71, 0xc3, 0x25, 0xc7, 0xfd, 0xd4, 0x5f, 0x1f, 0x81, - 0x7d, 0xc0, 0xe4, 0x04, 0x7c, 0x2a, 0xd6, 0x73, 0x5f, 0x0e, 0xe9, 0x40, 0xdf, 0x85, 0xf8, 0xac, 0x3f, 0xc8, 0xeb, 0x47, 0xae, 0xb2, 0xfb, 0x5b, 0xc2, 0x2d, 0xfa, 0x76, 0xc5, 0xdc, 0x9f, 0x5f, - 0x06, 0x4e, 0x6f, 0xb8, 0xb9, 0xf4, 0xd6, 0xf8, 0xf3, 0xdf, 0x9e, 0xae, 0x5b, 0xf8, 0x1b, 0x67, 0x9f, 0xfd, 0xd0, 0x77, 0xfa, 0x71, 0x8a, 0xf8, 0x57, 0xdc, 0xf0, 0x71, 0xae, 0xf8, 0x70, 0x6e, - 0x78, 0x85, 0x7b, 0x61, 0x86, 0xd7, 0xb3, 0xd1, 0x05, 0xde, 0x23, 0x7e, 0x0f, 0xfd, 0x00, 0x2f, 0x8b, 0x30, 0x4d, 0x8f, 0xc1, 0x49, 0xb2, 0xb7, 0xa4, 0x89, 0xc0, 0xba, 0xd5, 0xad, 0x55, 0x15, - 0x48, 0xff, 0x92, 0x54, 0x80, 0x7e, 0x51, 0xbf, 0x60, 0x7a, 0x08, 0x5e, 0xce, 0x2c, 0x51, 0x8d, 0xbe, 0x6d, 0x17, 0xf1, 0x9c, 0x01, 0xfd, 0x01, 0xf2, 0x19, 0x37, 0xef, 0xcf, 0x07, 0x9b, 0xd2, - 0xce, 0x74, 0x6a, 0xd4, 0x18, 0x83, 0x88, 0xdd, 0x92, 0x23, 0xf9, 0x02, 0x44, 0xfa, 0x39, 0xd0, 0xe2, 0xc7, 0xd8, 0xaa, 0x43, 0x78, 0xba, 0x1b, 0x27, 0x6c, 0xab, 0xb0, 0x72, 0x33, 0xee, 0xcb, - 0x6c, 0xbc, 0x0a, 0x27, 0xac, 0xa5, 0x98, 0xd4, 0xfc, 0xa4, 0xc2, 0xd1, 0xc1, 0xdf, 0xdb, 0xe6, 0x7c, 0x35, 0x49, 0x14, 0x2d, 0xb0, 0x8e, 0x53, 0x3d, 0xca, 0x49, 0x92, 0xd6, 0x61, 0xb0, 0xc3, - 0x4f, 0x0f, 0xcb, 0x45, 0xfe, 0x06, 0xcd, 0xf4, 0x5d, 0xa2, 0xc1, 0x3d, 0x39, 0xfb, 0xc4, 0xae, 0x75, 0x03, 0x7a, 0x41, 0xe6, 0xf5, 0xf0, 0x22, 0x55, 0x1f, 0x36, 0x18, 0xd9, 0x58, 0xf0, 0x71, - 0xed, 0x78, 0x32, 0x2f, 0xb7, 0xab, 0x66, 0xc5, 0x72, 0xec, 0x42, 0x23, 0x0e, 0x9a, 0x06, 0x5b, 0xde, 0xd7, 0x52, 0x75, 0x80, 0xcc, 0xb8, 0x9f, 0xf3, 0xd0, 0x16, 0x66, 0x96, 0x5d, 0xde, 0x3d, - 0xa4, 0x8f, 0xc6, 0xbb, 0x9c, 0x8b, 0xaf, 0x10, 0x85, 0x3c, 0x55, 0xa3, 0xf4, 0x02, 0xf4, 0x82, 0xa8, 0xeb, 0xe1, 0xa5, 0x13, 0xcb, 0x80, 0xfa, 0xa4, 0x10, 0x6c, 0xe6, 0xa6, 0x8e, 0x81, 0xfb, - 0xc8, 0x44, 0xb5, 0xbe, 0x5b, 0x4f, 0x9a, 0xad, 0x2c, 0xea, 0x7b, 0x77, 0xb9, 0x68, 0x72, 0x91, 0xab, 0x92, 0x7c, 0xec, 0xd4, 0xfd, 0x76, 0x91, 0xf5, 0x99, 0x6c, 0xf4, 0x4c, 0x19, 0x72, 0x6b, - 0xdf, 0x40, 0x38, 0x80, 0x4d, 0xc6, 0xc1, 0x66, 0x4d, 0xf7, 0xf3, 0x4d, 0xba, 0x9c, 0xb9, 0xeb, 0x4c, 0xe7, 0x4e, 0x26, 0xe6, 0xec, 0x5d, 0x63, 0x29, 0xe7, 0x6e, 0xfb, 0x7d, 0x0b, 0xc3, 0xf3, - 0xcf, 0x28, 0x12, 0x33, 0x1a, 0x95, 0x51, 0xfa, 0x1d, 0xc3, 0xfc, 0xdc, 0xf1, 0xf2, 0x01, 0xf2, 0x05, 0x19, 0xef, 0xce, 0x87, 0x3a, 0x5f, 0x44, 0x68, 0x3a, 0x86, 0x57, 0x13, 0xb0, 0x94, 0x3a, - 0x23, 0x22, 0xed, 0x65, 0x4a, 0x52, 0x09, 0xee, 0x28, 0xa4, 0xab, 0x6e, 0xda, 0x36, 0xdb, 0x4b, 0x81, 0xae, 0xf8, 0xdb, 0x5e, 0x38, 0x19, 0x3b, 0x66, 0xad, 0xd6, 0x63, 0xaa, 0x89, 0x12, 0x65, - 0xd6, 0xf1, 0x27, 0xa7, 0xd8, 0x6d, 0xd3, 0xb0, 0x24, 0x74, 0x89, 0xdf, 0x25, 0x33, 0xcf, 0xea, 0xcd, 0x9d, 0x83, 0x6b, 0xfc, 0xd1, 0x3f, 0x1c, 0x80, 0xe6, 0x79, 0xfb, 0xe5, 0xeb, 0x68, 0xc5, - 0x07, 0x0e, 0xbc, 0x9b, 0xe1, 0x57, 0x06, 0x8e, 0x3b, 0xb2, 0x7d, 0x33, 0x49, 0xdc, 0xe8, 0xcf, 0x7f, 0xfb, 0xad, 0x00, 0x7c, 0xa8, 0x00, 0xf8, 0x63, 0x58, 0xd5, 0x78, 0x90, 0x99, 0x8e, 0x53, - 0xfc, 0x3a, 0xde, 0x77, 0xa6, 0xd1, 0xcf, 0x28, 0x5b, 0x2f, 0x50, 0xcf, 0xf4, 0x7c, 0x39, 0x1e, 0x5d, 0x60, 0x3d, 0xa6, 0x25, 0xc4, 0x2d, 0x41, 0x02, 0x22, 0x4f, 0xe9, 0x69, 0xb3, 0x4d, 0x17, - 0xe4, 0xfc, 0x28, 0xc0, 0x33, 0x6f, 0x63, 0xf1, 0xa9, 0x0a, 0x01, 0x56, 0xb5, 0x0d, 0xec, 0x63, 0x29, 0x6f, 0x34, 0x39, 0xf2, 0x41, 0xdf, 0xe8, 0x42, 0x81, 0xe2, 0xb2, 0x78, 0xed, 0x91, 0xf5, - 0xbe, 0x95, 0x34, 0x54, 0x01, 0xcc, 0xd0, 0x20, 0x14, 0xb0, 0x85, 0x29, 0x23, 0xd2, 0x37, 0x8b, 0xf1, 0x5e, 0x0f, 0xf6, 0xaa, 0x24, 0xa2, 0x87, 0x9f, 0x39, 0xd2, 0x86, 0x19, 0x8f, 0x45, 0xe1, - 0x1e, 0xea, 0xc8, 0x2c, 0x46, 0x59, 0x54, 0x17, 0xf7, 0xd3, 0x5e, 0x9e, 0x54, 0xe1, 0x3e, 0x43, 0x3f, 0xe3, 0xf2, 0xf3, 0xb5, 0xa1, 0xca, 0xdc, 0x7a, 0x37, 0xe6, 0x39, 0x75, 0x6b, 0x26, 0x87, - 0x35, 0xca, 0x7a, 0x8a, 0x34, 0x53, 0x44, 0x3f, 0xd6, 0x64, 0x99, 0x53, 0xa6, 0x65, 0x71, 0x58, 0x52, 0xe8, 0x8a, 0x9a, 0x6f, 0xd0, 0xa3, 0xde, 0x01, 0x62, 0xbb, 0xcf, 0x03, 0x05, 0x01, 0xcd, - 0x54, 0x4b, 0x9c, 0xbd, 0x8c, 0x63, 0x30, 0x71, 0xe4, 0x59, 0xb4, 0x36, 0xe7, 0x07, 0x7e, 0x41, 0x26, 0x76, 0xec, 0xa2, 0x3a, 0xdd, 0x41, 0xf4, 0xc1, 0x40, 0xff, 0x23, 0xb6, 0xa8, 0x72, 0x64, - 0x16, 0x87, 0xfa, 0xbb, 0xc9, 0x7f, 0xf0, 0x73, 0xd2, 0xf7, 0x1d, 0xe0, 0x33, 0x62, 0xdf, 0x9d, 0x5e, 0x64, 0xce, 0x00, 0x29, 0x7c, 0x92, 0x7c, 0x48, 0x89, 0x2b, 0x4a, 0x60, 0x09, 0xbc, 0x14, - 0xfa, 0xa6, 0x53, 0x63, 0xed, 0xb0, 0x84, 0xab, 0x1e, 0x8d, 0xb9, 0x9c, 0xc4, 0xa2, 0x39, 0x03, 0xc5, 0x3c, 0xc5, 0xef, 0x0d, 0x3b, 0x5d, 0xf6, 0x9c, 0xd8, 0x4f, 0x7d, 0x62, 0x11, 0x17, 0xfb, - 0x18, 0x75, 0x60, 0x2a, 0x24, 0xa0, 0x64, 0xe1, 0x16, 0x13, 0x8a, 0xa1, 0xb9, 0x98, 0x0a, 0xf7, 0x35, 0x45, 0xf6, 0xde, 0x66, 0x96, 0xf0, 0x4f, 0x3b, 0x7c, 0x1f, 0xe0, 0xb0, 0x30, 0xbb, 0xe0, - 0x1b, 0xad, 0xf2, 0x29, 0x3f, 0xc7, 0x1b, 0xdc, 0x17, 0x0c, 0x5e, 0xcf, 0x2e, 0xb5, 0x38, 0x03, 0x16, 0x7a, 0xdf, 0x43, 0xc4, 0x86, 0xaa, 0xa0, 0xb4, 0x4f, 0xa7, 0xfa, 0x7a, 0x0e, 0xd4, 0x96, - 0x8b, 0x10, 0xbd, 0x3b, 0xd9, 0x0a, 0xba, 0xcd, 0x2d, 0xa5, 0x95, 0xb1, 0x0a, 0x28, 0x7f, 0x5c, 0xcc, 0xb0, 0xc0, 0x99, 0xf0, 0x71, 0x89, 0x4d, 0xe6, 0xb4, 0x5c, 0x71, 0x64, 0x3e, 0x8e, 0x60, - 0x2b, 0x0d, 0x70, 0x71, 0xda, 0xcf, 0xb2, 0x63, 0xd9, 0x5a, 0xf8, 0x4a, 0x8a, 0x17, 0x13, 0x6b, 0x9d, 0x1d, 0xcd, 0x7d, 0x7f, 0x87, 0x29, 0xbf, 0x45, 0xcf, 0x35, 0x40, 0xf5, 0x77, 0xf3, 0xd7, - 0x15, 0xea, 0x15, 0x35, 0xd7, 0xe3, 0xa1, 0x9c, 0xd5, 0x8f, 0xe9, 0x49, 0x51, 0xaf, 0xcd, 0xf8, 0xd8, 0xc5, 0x14, 0x1c, 0x20, 0x2b, 0x03, 0x55, 0xd7, 0x09, 0x8e, 0x49, 0xdc, 0xbc, 0x94, 0xfb, - 0x72, 0xe5, 0xa6, 0xc4, 0xa9, 0x11, 0xd0, 0xc5, 0x6a, 0x85, 0x4d, 0x98, 0x52, 0x16, 0xc6, 0x44, 0xa0, 0xd4, 0x55, 0x86, 0x6c, 0x53, 0x92, 0x14, 0xbd, 0x89, 0x50, 0xa7, 0xa7, 0x32, 0x2b, 0x97, - 0x7e, 0x6f, 0x4a, 0xa9, 0x08, 0xf7, 0xdd, 0x84, 0xf5, 0x67, 0xe2, 0xa3, 0xd5, 0xfa, 0xbd, 0x03, 0xfb, 0x2d, 0x52, 0xf8, 0xb9, 0xfd, 0xd8, 0x2b, 0x80, 0x67, 0x8d, 0xa4, 0xc1, 0xbe, 0xe8, 0x0b, - 0x1e, 0x13, 0xb3, 0xe8, 0x46, 0xdf, 0x94, 0x45, 0x3d, 0x17, 0x79, 0xff, 0x08, 0xfa, 0x85, 0x66, 0xaf, 0x17, 0x86, 0x46, 0xde, 0x8d, 0x35, 0xab, 0xec, 0xdd, 0x92, 0xc8, 0xa6, 0x9d, 0xd3, 0xd5, - 0xf3, 0xc0, 0x29, 0x5d, 0x52, 0x2c, 0x17, 0xa7, 0xca, 0x5a, 0x92, 0xda, 0xce, 0x55, 0xd9, 0xb4, 0x3f, 0x28, 0xe0, 0x81, 0x2c, 0x1c, 0xe8, 0xa4, 0x06, 0xf1, 0x5e, 0x88, 0x1a, 0x43, 0x61, 0x41, - 0x0e, 0x59, 0x1f, 0x8c, 0xed, 0x51, 0xeb, 0x48, 0x04, 0x5f, 0x7a, 0x6e, 0xc4, 0xbb, 0x3b, 0x9b, 0x5d, 0xd3, 0x64, 0x1c, 0x57, 0xca, 0x5c, 0x7f, 0xde, 0x66, 0xbe, 0x7d, 0x81, 0x7b, 0xaa, 0xdc, - 0xa4, 0xbc, 0xd4, 0xec, 0xfd, 0xdb, 0xd3, 0x5d, 0x17, 0x06, 0x4a, 0x6b, 0x2b, 0x4d, 0x23, 0xd7, 0x4c, 0x46, 0xa9, 0x75, 0x74, 0xef, 0x76, 0x9d, 0x83, 0x9f, 0x4a, 0xc9, 0xfd, 0x0d, 0xfa, 0x8d, - 0x4c, 0x1f, 0xae, 0x5d, 0xea, 0x3f, 0x06, 0x04, 0x99, 0x0f, 0xd3, 0xbd, 0xc9, 0x2d, 0x56, 0x71, 0x72, 0xc4, 0x4c, 0xed, 0xd4, 0x1d, 0x89, 0xfd, 0xa2, 0xd3, 0x77, 0x99, 0x23, 0x9b, 0x6d, 0xb5, - 0xe3, 0x17, 0x2a, 0x6e, 0x5b, 0x80, 0xdb, 0x57, 0xd2, 0xdc, 0xee, 0x3d, 0xc2, 0x3e, 0xd6, 0x5b, 0xa7, 0x6d, 0x5c, 0xdc, 0x58, 0xb2, 0xde, 0x41, 0xcf, 0x17, 0x98, 0x8b, 0x93, 0x4c, 0x02, 0x4f, - 0x61, 0x86, 0xf3, 0xa8, 0x89, 0x81, 0x86, 0xfb, 0x42, 0x56, 0xf2, 0xfd, 0xf3, 0x0a, 0xe3, 0x83, 0x2a, 0x80, 0xdf, 0x63, 0x6c, 0xcf, 0x65, 0x68, 0xff, 0x63, 0x61, 0xa4, 0x8f, 0x05, 0xe1, 0x5f, - 0xf3, 0x04, 0xf2, 0x9c, 0x98, 0x7d, 0x81, 0x7b, 0xe5, 0x86, 0x97, 0xb3, 0x8b, 0xcf, 0x7d, 0x80, 0xa8, 0x4d, 0xca, 0xba, 0xad, 0x4e, 0x86, 0xb7, 0xd6, 0x09, 0x52, 0x2c, 0xba, 0x88, 0xe6, 0x27, - 0x32, 0x50, 0x67, 0xc9, 0x04, 0x32, 0xa0, 0xf1, 0x21, 0x6b, 0x93, 0x2a, 0xdb, 0x50, 0x74, 0x0c, 0x2f, 0xc0, 0x2d, 0x3f, 0x83, 0x7a, 0xc1, 0xeb, 0x3d, 0x7e, 0xbd, 0x03, 0x69, 0xcd, 0x04, 0x89, - 0xb5, 0x51, 0x1e, 0x21, 0xd3, 0xce, 0xd8, 0x23, 0x23, 0x42, 0xdc, 0x0c, 0x3e, 0x6d, 0x09, 0xc3, 0xe1, 0x23, 0x1a, 0xff, 0x61, 0x3d, 0xe8, 0x3f, 0x45, 0x90, 0xb4, 0x70, 0xdf, 0xfc, 0x69, 0x77, - 0x64, 0xe9, 0x93, 0xc2, 0xf4, 0x1d, 0xec, 0x1b, 0x5d, 0xde, 0x2e, 0x8c, 0x90, 0x81, 0x1d, 0xb8, 0x14, 0xe5, 0x78, 0x8a, 0x1a, 0x7e, 0x1a, 0x4e, 0xe1, 0xfd, 0xaa, 0x9d, 0x5a, 0x45, 0x3a, 0x5e, - 0xac, 0x2d, 0xc0, 0xae, 0xc3, 0xba, 0x08, 0xa7, 0x9a, 0xd0, 0x2d, 0x4e, 0xe4, 0x14, 0x4d, 0x85, 0x31, 0x7e, 0xa2, 0x0b, 0x0b, 0x4f, 0x0f, 0x76, 0x58, 0xae, 0x27, 0x78, 0xbb, 0x98, 0x98, 0x8e, - 0xad, 0xa7, 0x29, 0x41, 0x1e, 0x76, 0x05, 0x08, 0xa0, 0xf3, 0x59, 0xb7, 0xf1, 0x51, 0x18, 0xc5, 0xfa, 0x80, 0x28, 0x9e, 0x97, 0xa6, 0x1f, 0x2d, 0xb6, 0x7f, 0x84, 0x64, 0x8e, 0x59, 0xb9, 0x8f, - 0x44, 0xeb, 0x33, 0x39, 0x3b, 0x1f, 0x41, 0x5f, 0x29, 0xf6, 0xee, 0xc2, 0xd0, 0xcc, 0x1d, 0x75, 0x13, 0x4d, 0xb7, 0x38, 0x82, 0xb5, 0xa9, 0x0c, 0x51, 0x66, 0x6a, 0xcc, 0x7a, 0x1f, 0x05, 0x0d, - 0xc2, 0xf6, 0xe9, 0x3d, 0xc8, 0x6a, 0x3a, 0xbb, 0x90, 0x41, 0xc6, 0x54, 0x04, 0x68, 0x13, 0x72, 0x39, 0x56, 0x21, 0xab, 0x16, 0x51, 0x10, 0x14, 0xa5, 0xab, 0x8d, 0x1e, 0xb7, 0xf5, 0x2e, 0xdd, - 0x93, 0x3c, 0x1f, 0x8d, 0x27, 0x96, 0xb8, 0x8c, 0x4e, 0x48, 0xdc, 0x49, 0x20, 0x8f, 0xf7, 0x21, 0xf4, 0x48, 0x6f, 0xf9, 0x4f, 0xbb, 0xbe, 0xdc, 0x53, 0xf5, 0x4d, 0xf9, 0xd3, 0x73, 0x9d, 0x0f, - 0xde, 0xc0, 0x5e, 0x89, 0x74, 0x3b, 0x19, 0xd2, 0xf9, 0x00, 0x1e, 0xe5, 0xcb, 0x76, 0xa2, 0xc2, 0xae, 0x42, 0x4d, 0xc8, 0xad, 0xb7, 0x30, 0xfd, 0xda, 0xcd, 0x75, 0x9b, 0x3a, 0xf4, 0xc0, 0x7a, - 0xf9, 0x97, 0x50, 0x3c, 0x78, 0x2a, 0x5d, 0x50, 0x8e, 0xbc, 0x3a, 0x8a, 0xda, 0xc0, 0xa9, 0xfc, 0xd1, 0xa5, 0xb7, 0x6d, 0x96, 0xde, 0x57, 0xbc, 0xd1, 0xe7, 0x3c, 0xba, 0x5f, 0xbf, 0xe3, 0x8a, - 0xae, 0xaf, 0xee, 0x5c, 0x9a, 0x02, 0x0d, 0x90, 0x46, 0x7d, 0x17, 0xc7, 0x38, 0x50, 0x03, 0xe5, 0xa4, 0xdc, 0x68, 0xdd, 0x94, 0xce, 0x05, 0xd3, 0x3d, 0xee, 0xd0, 0xe9, 0xac, 0xf1, 0x27, 0x9c, - 0x1d, 0x71, 0x4e, 0xd0, 0xef, 0xcd, 0x95, 0x5a, 0x2f, 0x18, 0x0a, 0x55, 0xf8, 0xa3, 0x45, 0x26, 0x9b, 0x7a, 0x9e, 0x38, 0xce, 0x64, 0x31, 0x6f, 0x20, 0x3f, 0x04, 0xb8, 0x3d, 0x39, 0x5e, 0x33, - 0x51, 0xa9, 0xb9, 0x1c, 0xa6, 0xba, 0x07, 0x82, 0xdd, 0x11, 0xba, 0xfc, 0x17, 0x99, 0x7b, 0xa0, 0x52, 0x76, 0x70, 0x13, 0xb7, 0x30, 0xab, 0xb4, 0x18, 0xbd, 0x64, 0x19, 0x7e, 0x23, 0x3d, 0xe0, - 0xa7, 0x70, 0xfe, 0xfb, 0x2b, 0xae, 0x18, 0xff, 0xfd, 0xfa, 0x35, 0xc6, 0x36, 0x00, 0xe1, 0xc7, 0x92, 0x3d, 0x76, 0x74, 0x84, 0x76, 0x81, 0xce, 0xca, 0x80, 0x54, 0xea, 0x4e, 0x3c, 0x6e, 0x59, - 0xc9, 0x16, 0x4f, 0xa6, 0xae, 0xf1, 0x65, 0xc6, 0x39, 0x59, 0x34, 0x53, 0x77, 0x4b, 0xba, 0xc9, 0xe1, 0xc0, 0x38, 0x2c, 0xdd, 0xd0, 0x9d, 0x40, 0x3c, 0x4c, 0x90, 0xb9, 0x5b, 0x53, 0x84, 0xdd, - 0xcb, 0xe6, 0xc9, 0x75, 0xd0, 0x1c, 0x54, 0xfb, 0xba, 0x85, 0xca, 0x96, 0x87, 0x82, 0x82, 0xa7, 0x06, 0xa6, 0x1b, 0xff, 0x57, 0x50, 0xb8, 0xbe, 0x11, 0x3e, 0xcf, 0xcd, 0x09, 0xbf, 0xc1, 0xbc, - 0x11, 0xf6, 0x2c, 0x76, 0x06, 0xce, 0x09, 0xc7, 0xe7, 0x50, 0xc5, 0x55, 0xe3, 0xed, 0x6c, 0x19, 0x8b, 0xf9, 0x34, 0xe1, 0xc7, 0x88, 0x3f, 0x27, 0xc6, 0x19, 0x92, 0xdb, 0x1c, 0x3b, 0x73, 0xea, - 0x14, 0xab, 0x8c, 0x9a, 0x5e, 0x6f, 0xc1, 0x05, 0x21, 0xc8, 0x0d, 0x78, 0xf0, 0xfd, 0x0e, 0x85, 0x52, 0x1c, 0xaf, 0x3d, 0xd3, 0x3b, 0xad, 0x40, 0xde, 0x59, 0x90, 0x34, 0xcf, 0x97, 0x08, 0xe7, - 0x15, 0x09, 0x85, 0x6f, 0x79, 0xae, 0x63, 0xc8, 0xb1, 0xfa, 0x68, 0xe9, 0x7c, 0x5b, 0x0b, 0xf7, 0x26, 0x9b, 0x5f, 0xc6, 0x30, 0xfc, 0x94, 0xae, 0x3f, 0x11, 0x7a, 0x89, 0x7b, 0x30, 0xab, 0xa0, - 0x71, 0x47, 0xbd, 0x5b, 0xdc, 0x4b, 0x00, 0x42, 0x9e, 0xdd, 0xb8, 0x3f, 0x00, 0xbf, 0xd2, 0xe6, 0xc3, 0xa5, 0x4b, 0x50, 0x61, 0xc0, 0xe6, 0xed, 0xe4, 0xab, 0xc6, 0x2c, 0x78, 0xb3, 0xd5, 0xcb, - 0x99, 0x25, 0x4c, 0xdd, 0x95, 0x46, 0xf6, 0x4c, 0x4f, 0x2d, 0xab, 0x15, 0x6d, 0x3b, 0x08, 0xb5, 0xaf, 0xbd, 0xba, 0x9e, 0xf5, 0x3e, 0x34, 0xa7, 0x32, 0x61, 0x71, 0x5c, 0xad, 0x93, 0x3d, 0x44, - 0x4d, 0x1b, 0xb2, 0xdc, 0xeb, 0x48, 0x3d, 0xc3, 0xd5, 0x4c, 0x16, 0xdb, 0xc0, 0x65, 0x5c, 0x91, 0x3d, 0xb1, 0x7b, 0x46, 0xd3, 0xbc, 0x9a, 0x34, 0x0c, 0xf5, 0x91, 0x45, 0xf4, 0x9f, 0x76, 0xf1, - 0x24, 0x75, 0x6c, 0x5d, 0x1a, 0xdb, 0x7e, 0x45, 0x2b, 0xf2, 0xd9, 0x9d, 0xe9, 0x0a, 0xf5, 0x46, 0xa4, 0xcb, 0xf1, 0xa5, 0x2d, 0xe7, 0x00, 0x61, 0x88, 0xc1, 0x93, 0xc0, 0x0b, 0x0f, 0x84, 0x4b, - 0x6d, 0xbb, 0x68, 0x93, 0x39, 0xd5, 0x36, 0x73, 0xf9, 0xdd, 0x3a, 0x6f, 0x36, 0x63, 0x76, 0xd7, 0x6f, 0xab, 0x6a, 0xd1, 0xb0, 0xca, 0x94, 0xc4, 0x60, 0x20, 0x4b, 0x0c, 0x8a, 0x11, 0x1a, 0x08, - 0x82, 0xb0, 0xb5, 0xc2, 0x63, 0xa8, 0xcc, 0x49, 0xd3, 0x88, 0xa3, 0xed, 0x79, 0x23, 0x64, 0x84, 0x60, 0x68, 0x86, 0x3a, 0x8e, 0xac, 0xb9, 0xbe, 0x3f, 0x9d, 0x92, 0x47, 0x4b, 0xe8, 0xf1, 0x12, - 0x18, 0x36, 0x63, 0xe4, 0xed, 0x6b, 0x1f, 0xea, 0xae, 0xe4, 0xf3, 0x68, 0xfd, 0xa0, 0xbd, 0x7e, 0xb8, 0x74, 0xd9, 0x72, 0xc8, 0xc7, 0x48, 0x0e, 0x61, 0x15, 0x5a, 0x2a, 0x3d, 0xbf, 0x4e, 0x49, - 0x23, 0xda, 0x2f, 0xbd, 0x5e, 0xa9, 0x11, 0x54, 0xf4, 0x89, 0x75, 0xb0, 0x9c, 0x99, 0xe5, 0x21, 0xb3, 0x68, 0x9d, 0x24, 0xdc, 0xdc, 0x9b, 0x19, 0x4c, 0xde, 0x2e, 0x30, 0x4c, 0x5d, 0x62, 0xdc, - 0x76, 0xdc, 0x8c, 0xf7, 0x4b, 0x03, 0x76, 0x36, 0x3c, 0x6d, 0xf4, 0x13, 0x7f, 0x3b, 0xa6, 0x37, 0xfe, 0xc2, 0xe3, 0x43, 0x05, 0xcb, 0x1c, 0x0d, 0x0f, 0x8b, 0x47, 0x39, 0xd1, 0xff, 0xb5, 0x37, - 0xa1, 0x2c, 0x32, 0x83, 0x8b, 0x6f, 0xe6, 0x2e, 0xcd, 0x9f, 0xb4, 0x30, 0x5f, 0x01, 0x5f, 0xe9, 0xfd, 0x7a, 0x3a, 0x74, 0xf2, 0x6b, 0xd7, 0x84, 0x4a, 0x77, 0x8a, 0x67, 0x1c, 0x2b, 0xca, 0x58, - 0x26, 0xe8, 0x93, 0x78, 0x35, 0xc7, 0x19, 0x56, 0x16, 0x22, 0x7d, 0xb5, 0xc1, 0x79, 0x53, 0x14, 0xf4, 0x14, 0x07, 0x6d, 0xde, 0xd9, 0x1a, 0x8e, 0xd6, 0x94, 0x06, 0x1c, 0xa4, 0x2b, 0x36, 0x4d, - 0xf8, 0x39, 0x93, 0x96, 0x5c, 0xb4, 0xd6, 0x58, 0x2a, 0x6a, 0xd5, 0x0e, 0xb4, 0x56, 0xfd, 0xfa, 0x68, 0xb7, 0x94, 0xd9, 0x93, 0x28, 0x30, 0xfb, 0xeb, 0x0b, 0x6a, 0xf0, 0x9e, 0x72, 0x69, 0xa3, - 0xfa, 0xcd, 0x42, 0xfa, 0xf9, 0xd8, 0xb4, 0x17, 0xa0, 0x57, 0x84, 0x5e, 0xbb, 0xee, 0x5e, 0x20, 0x3d, 0x46, 0x66, 0x13, 0x71, 0x1a, 0x4c, 0x6e, 0x84, 0x1c, 0xc3, 0xd2, 0xb6, 0xc1, 0x19, 0x59, - 0x41, 0x27, 0x39, 0x64, 0xc9, 0x12, 0x6b, 0x51, 0x40, 0x38, 0x43, 0x55, 0xce, 0x40, 0xbc, 0xc0, 0x10, 0x44, 0xad, 0xea, 0xab, 0x3d, 0x8b, 0x07, 0xd0, 0xa4, 0x9f, 0x18, 0xa7, 0xd9, 0xb4, 0x15, - 0x71, 0x2a, 0x67, 0x44, 0xad, 0x3a, 0x39, 0x63, 0x65, 0x27, 0x82, 0x3b, 0x5c, 0x0e, 0x12, 0xb8, 0x3d, 0x4e, 0xf2, 0xd9, 0xfe, 0x2f, 0x2d, 0x9c, 0x3f, 0xbf, 0xb1, 0xd4, 0xff, 0xd3, 0x2e, 0x96, - 0xd2, 0x37, 0x0b, 0xd7, 0xb9, 0xc6, 0x51, 0x46, 0x56, 0xed, 0x79, 0x77, 0x77, 0xa0, 0xa7, 0xcd, 0xfc, 0x2f, 0x5e, 0x71, 0xa5, 0xf7, 0x17, 0x37, 0x86, 0x9a, 0xfd, 0x65, 0x2e, 0x20, 0xea, 0xb4, - 0x86, 0x41, 0xa8, 0x23, 0xea, 0x46, 0xef, 0x36, 0xd5, 0x44, 0xec, 0x3b, 0x9f, 0x39, 0x4e, 0x36, 0xd1, 0xc2, 0x76, 0x67, 0xe9, 0x9a, 0x5b, 0x69, 0x94, 0x46, 0xb3, 0x2a, 0x6d, 0x37, 0x81, 0x0d, - 0xca, 0x4e, 0x69, 0x40, 0x21, 0xab, 0xd2, 0xe8, 0x82, 0xed, 0xd0, 0xa5, 0xca, 0xce, 0x8c, 0x65, 0xb0, 0x00, 0xd1, 0x16, 0x60, 0x16, 0xa0, 0x2a, 0x5b, 0xd2, 0x42, 0x70, 0xfc, 0x47, 0x9a, 0xc3, - 0xcf, 0x7c, 0xa9, 0xff, 0x0c, 0x39, 0xbf, 0x1f, 0x6f, 0xf3, 0xe4, 0x66, 0xf7, 0x96, 0xab, 0xf4, 0x72, 0x3c, 0x74, 0x7b, 0xab, 0x58, 0x44, 0xd5, 0xfb, 0xa0, 0x39, 0xba, 0x44, 0xea, 0x49, 0x1a, - 0x19, 0x21, 0xa8, 0x7d, 0x9c, 0x8a, 0x6b, 0x13, 0xa2, 0x0f, 0x16, 0x79, 0x8a, 0x98, 0x7c, 0x4e, 0x1c, 0xe7, 0xb8, 0x7b, 0x24, 0x6a, 0x69, 0x87, 0x22, 0xdb, 0x48, 0x93, 0x50, 0x81, 0x93, 0x82, - 0x43, 0x65, 0xce, 0xdd, 0x85, 0x50, 0xd3, 0x5e, 0xea, 0xdb, 0xb6, 0xb2, 0x6f, 0x96, 0x81, 0xb1, 0xf6, 0x44, 0x31, 0x11, 0xf7, 0x6a, 0xf5, 0x48, 0xe4, 0xfd, 0xd7, 0xde, 0xde, 0xae, 0x75, 0x1d, - 0xdf, 0x90, 0xf8, 0x89, 0x7c, 0x98, 0x17, 0xa8, 0x37, 0x12, 0x5f, 0x1b, 0x1d, 0x0d, 0xcd, 0x83, 0x69, 0x83, 0xa3, 0x6f, 0x2a, 0x9b, 0x43, 0xde, 0xf8, 0x31, 0x08, 0x19, 0x0e, 0x63, 0xeb, 0x82, - 0x51, 0xd1, 0xd1, 0xde, 0xe1, 0x66, 0x99, 0xad, 0x4c, 0xb7, 0xb8, 0xca, 0xab, 0xf5, 0x5e, 0x97, 0xd2, 0x2d, 0x49, 0x63, 0xaa, 0x20, 0x3a, 0x2a, 0x70, 0xc8, 0xb6, 0x84, 0xd2, 0xa7, 0xa4, 0x85, - 0xed, 0x90, 0x85, 0x1a, 0x81, 0x69, 0x46, 0xcc, 0xf3, 0x3d, 0x45, 0x63, 0x8c, 0xd1, 0x36, 0xb4, 0x67, 0xfe, 0x25, 0x41, 0xfc, 0x5b, 0xe9, 0xcb, 0xcf, 0x4d, 0xad, 0x7f, 0x8e, 0xbc, 0x55, 0x97, - 0xbd, 0xc8, 0xc4, 0x6f, 0xf4, 0x97, 0xe7, 0x3c, 0x26, 0xef, 0x60, 0x5f, 0x29, 0xfd, 0xee, 0xc2, 0xb5, 0xc5, 0xdd, 0x00, 0x2d, 0x46, 0x5a, 0xe5, 0x07, 0x76, 0x11, 0x68, 0x46, 0xb3, 0xce, 0xcc, - 0x99, 0x81, 0xd6, 0x5b, 0x9b, 0x0a, 0x17, 0xd2, 0x1a, 0x03, 0x30, 0x66, 0xba, 0x8d, 0xa6, 0x49, 0x50, 0xcb, 0x3c, 0x69, 0xab, 0xa0, 0x3a, 0x65, 0x20, 0x39, 0x22, 0x67, 0x24, 0xd4, 0xcd, 0xbd, - 0x45, 0xe6, 0xa3, 0x36, 0x2f, 0xb8, 0x80, 0x4d, 0x57, 0xa9, 0x19, 0x1c, 0x1a, 0x60, 0x3a, 0xeb, 0xb7, 0x2b, 0xce, 0xb7, 0x91, 0x49, 0x25, 0x12, 0x03, 0x7d, 0x24, 0x66, 0x63, 0x06, 0xd7, 0x58, - 0xcb, 0xbb, 0x5f, 0xfe, 0x46, 0xe7, 0x37, 0x05, 0xe4, 0x71, 0x7c, 0xeb, 0x5d, 0xef, 0xe4, 0x3f, 0xff, 0xf5, 0xb1, 0x53, 0xf2, 0x1f, 0x7f, 0xfc, 0x79, 0xab, 0x7d, 0x7f, 0x61, 0x9f, 0xff, 0xe7, - 0x23, 0x7f, 0xfd, 0xdf, 0x2e, 0x42, 0xea, 0x24, 0xb8, 0x38, 0x23, 0x6f, 0x55, 0x07, 0x17, 0xd6, 0xf9, 0x8a, 0xd3, 0xa0, 0x67, 0x35, 0xe5, 0xdf, 0x5e, 0x70, 0x65, 0xb7, 0xdf, 0x2e, 0x5f, 0x92, - 0x81, 0x07, 0xf0, 0x5c, 0x98, 0x9c, 0xe6, 0x48, 0x8e, 0xa9, 0x13, 0xb4, 0xa6, 0xca, 0x4a, 0x99, 0x77, 0xcc, 0x6e, 0x35, 0x11, 0x9d, 0xd3, 0x2c, 0x6e, 0xf0, 0xa9, 0x11, 0x28, 0xb6, 0x13, 0x2d, - 0x4d, 0x46, 0xd6, 0x19, 0x6b, 0xe3, 0xad, 0x3a, 0x13, 0x10, 0xfd, 0x34, 0x13, 0xd2, 0x8a, 0x97, 0x8b, 0xb2, 0x1a, 0xfb, 0x79, 0x9d, 0xd7, 0x98, 0x91, 0xd5, 0x9c, 0x35, 0xb5, 0x41, 0x6a, 0x43, - 0xc4, 0x07, 0xfd, 0x20, 0xcd, 0xa4, 0x47, 0x61, 0x99, 0xe1, 0xc5, 0x3e, 0x7f, 0x99, 0x78, 0x3f, 0x4d, 0xda, 0x2e, 0x47, 0xad, 0x6b, 0x86, 0x85, 0x7b, 0x7f, 0xba, 0xf3, 0x93, 0xba, 0xda, 0x0d, - 0xec, 0x95, 0x5c, 0xb7, 0x93, 0xa1, 0x3a, 0x59, 0x6e, 0x57, 0x65, 0xcd, 0x1b, 0xf1, 0x52, 0x86, 0x80, 0x66, 0xb3, 0x59, 0x7b, 0xe9, 0xae, 0xe9, 0x66, 0x2e, 0x02, 0xcc, 0x37, 0x6c, 0x93, 0xc4, - 0x06, 0xe2, 0xf6, 0xdb, 0x3a, 0x83, 0x37, 0xe3, 0xd2, 0xa5, 0x81, 0xaa, 0x9d, 0x4c, 0xdc, 0xc0, 0x8c, 0x08, 0x96, 0x0d, 0x50, 0xc1, 0x46, 0xb8, 0x99, 0xed, 0x11, 0x40, 0xde, 0x23, 0xb3, 0xb1, - 0x94, 0x1c, 0xf5, 0x32, 0xa4, 0x4e, 0x3e, 0xb7, 0x31, 0x1f, 0x96, 0xf7, 0xfe, 0xe7, 0xd7, 0xc9, 0xdc, 0xd3, 0xfd, 0x58, 0xe7, 0x73, 0x3e, 0x1d, 0xf7, 0x74, 0x8d, 0x70, 0xba, 0x27, 0xf7, 0xe2, - 0x69, 0x7b, 0xd8, 0x42, 0x97, 0x90, 0x9a, 0xde, 0x11, 0x4e, 0x3b, 0x0b, 0x0c, 0x54, 0xd7, 0x9f, 0xda, 0xe5, 0xcc, 0xae, 0xf6, 0x3d, 0x55, 0x02, 0x3e, 0xf3, 0xc3, 0xcc, 0xa5, 0xe3, 0x59, 0xf8, - 0x85, 0x6e, 0x52, 0xde, 0xf9, 0xa4, 0xe7, 0x52, 0xe2, 0x5f, 0xa1, 0x5e, 0x26, 0x69, 0xde, 0x8e, 0x87, 0xa6, 0xc2, 0x2b, 0xce, 0x4a, 0xf5, 0x22, 0x9b, 0x45, 0x6d, 0xb5, 0xe7, 0x82, 0x75, 0x2e, - 0x1f, 0xca, 0x49, 0x0d, 0x11, 0x33, 0xa9, 0xa6, 0x55, 0x67, 0xb9, 0x12, 0x21, 0xcb, 0xdd, 0x5b, 0x92, 0xbf, 0x10, 0xb0, 0x90, 0x30, 0xb3, 0xc3, 0xaa, 0x0a, 0x3c, 0x3b, 0x9d, 0x54, 0x5b, 0xda, - 0xb2, 0x4f, 0x62, 0xb6, 0x1f, 0x57, 0xd9, 0x14, 0x09, 0x27, 0x6b, 0x62, 0x63, 0xf5, 0x07, 0x6c, 0x62, 0xd6, 0xa5, 0x06, 0x4a, 0xdc, 0x1d, 0xb6, 0xfb, 0x16, 0x31, 0x9d, 0x19, 0xdf, 0x53, 0xcb, - 0xd0, 0x5f, 0x30, 0xf6, 0x84, 0xf7, 0xfb, 0x06, 0xf4, 0x8a, 0x95, 0xf3, 0xd1, 0xe8, 0x0a, 0xe8, 0x31, 0x52, 0xd2, 0x70, 0xbd, 0x20, 0x45, 0x5d, 0x5f, 0x91, 0xfb, 0x42, 0xa0, 0xc5, 0x10, 0x05, - 0x37, 0x7a, 0x91, 0xd4, 0x58, 0xa0, 0xd3, 0x9d, 0x18, 0x02, 0x08, 0x9e, 0xe4, 0x3a, 0x16, 0xc4, 0x1b, 0x24, 0xc9, 0xea, 0x66, 0xbb, 0x9f, 0xc6, 0x29, 0x28, 0xb3, 0x46, 0x9a, 0xb7, 0x46, 0xb8, - 0x37, 0x97, 0xd3, 0x10, 0x3d, 0xee, 0x9a, 0xb1, 0xb8, 0x15, 0x97, 0xec, 0x81, 0xf5, 0x4d, 0x5e, 0xec, 0x92, 0xf1, 0x86, 0x7e, 0x5e, 0xef, 0x36, 0x8b, 0xc3, 0xc7, 0xc1, 0x65, 0x1f, 0xa6, 0x76, - 0xb9, 0x65, 0x56, 0x04, 0xb1, 0xf9, 0xe7, 0x37, 0xf5, 0x33, 0xd6, 0x87, 0x19, 0xa5, 0x97, 0xf1, 0xb7, 0x2f, 0xf8, 0x3e, 0xdf, 0x7b, 0xc1, 0xcf, 0xaf, 0xe3, 0x10, 0xf1, 0xf9, 0x36, 0x61, 0x6c, - 0xe4, 0x36, 0x6e, 0x32, 0xb2, 0xdc, 0xaa, 0x72, 0x8b, 0xd1, 0x65, 0x06, 0xdc, 0x3d, 0xc6, 0x46, 0x7e, 0xa1, 0x4f, 0x11, 0xf0, 0x9b, 0x37, 0xbd, 0x8c, 0x8d, 0xbd, 0x77, 0xff, 0xd2, 0x46, 0x7a, - 0x00, 0xad, 0x4f, 0xdd, 0xac, 0xed, 0xfc, 0x22, 0x05, 0x57, 0x6c, 0xea, 0x11, 0x73, 0xdf, 0x45, 0x82, 0x1e, 0x11, 0x6c, 0x3d, 0x3d, 0x22, 0x65, 0x94, 0x0a, 0xa5, 0x56, 0x80, 0x7a, 0xc9, 0x2a, - 0x53, 0x0e, 0x4c, 0x03, 0x69, 0xe2, 0x99, 0x82, 0x1f, 0xe1, 0xa2, 0xe0, 0x65, 0xc0, 0x51, 0x76, 0x18, 0x43, 0x91, 0x65, 0x68, 0xb9, 0xd2, 0x84, 0x7e, 0x41, 0xf7, 0x4b, 0x63, 0x46, 0x46, 0x01, - 0x0d, 0x87, 0x3e, 0xf2, 0xe3, 0xc1, 0xde, 0x3f, 0x98, 0xbc, 0x0b, 0xfd, 0x7a, 0x6e, 0x31, 0x0c, 0x9f, 0xbc, 0x7b, 0x79, 0xc3, 0x00, 0xcc, 0x59, 0xd6, 0x64, 0x81, 0x3b, 0x93, 0xbd, 0x8a, 0x6f, - 0x29, 0xde, 0x66, 0x7d, 0xbf, 0xf6, 0xc9, 0xc5, 0x8a, 0xa2, 0x16, 0x7a, 0xad, 0xa1, 0x79, 0xb9, 0x44, 0xf7, 0x50, 0x2f, 0x1a, 0x33, 0xce, 0x33, 0xd8, 0x85, 0x9d, 0x69, 0xc1, 0x42, 0x05, 0x57, - 0xa7, 0x3e, 0x24, 0x10, 0x7a, 0x5c, 0x94, 0xa6, 0x05, 0xc6, 0xeb, 0x60, 0x21, 0x57, 0x01, 0xdd, 0xae, 0x25, 0x80, 0xc2, 0x70, 0x45, 0x72, 0xd1, 0xdd, 0x8f, 0xb3, 0x41, 0xbf, 0x9e, 0xea, 0xde, - 0x06, 0x95, 0x9f, 0xd6, 0xd7, 0x81, 0x83, 0xf7, 0x07, 0x3b, 0xc2, 0x4f, 0x45, 0xd5, 0x06, 0xbd, 0xf1, 0x15, 0xb7, 0x0f, 0x9e, 0x1b, 0x56, 0xc0, 0x98, 0x58, 0x2e, 0x1c, 0xad, 0xcc, 0x4a, 0xea, - 0x7b, 0x80, 0x6a, 0x33, 0x78, 0x36, 0x81, 0xaa, 0xb0, 0x2d, 0xf4, 0x55, 0xc4, 0xfe, 0x10, 0x5d, 0x61, 0x90, 0x38, 0xa3, 0xf4, 0x9e, 0xe6, 0x43, 0x3c, 0x65, 0x00, 0xdf, 0x60, 0x82, 0xa3, 0x97, - 0xa3, 0xcb, 0x64, 0xb9, 0x01, 0xc6, 0xaf, 0x63, 0x6f, 0xe0, 0x3a, 0x02, 0xe8, 0x2a, 0x76, 0xa7, 0x34, 0xbe, 0x05, 0x4e, 0x08, 0x05, 0xba, 0x3e, 0x7f, 0x70, 0xe8, 0x98, 0x15, 0x4c, 0x94, 0x2f, - 0x9b, 0xe9, 0xb6, 0xea, 0x63, 0xb4, 0xe9, 0xc6, 0xac, 0x48, 0x2a, 0x52, 0x56, 0x35, 0xcc, 0x14, 0xa8, 0x30, 0x4c, 0xdb, 0xe9, 0xa6, 0x7a, 0xdc, 0x8e, 0x15, 0xbb, 0xc8, 0x66, 0xee, 0x2c, 0x9a, - 0x50, 0xda, 0xa4, 0xa8, 0x55, 0x05, 0xc3, 0x09, 0xff, 0x2f, 0x2a, 0xa6, 0x83, 0x5d, 0xba, 0x91, 0xdb, 0xdc, 0x8b, 0xca, 0x3f, 0xb7, 0x44, 0xcf, 0x00, 0xc1, 0xd1, 0xe5, 0xbf, 0xa1, 0x4b, 0x10, - 0xb0, 0xb6, 0x48, 0xbd, 0xc0, 0x58, 0x9c, 0x9f, 0xb3, 0xa4, 0x0f, 0x26, 0xa8, 0xdb, 0xd8, 0x1b, 0xb0, 0x94, 0xa3, 0x95, 0x3e, 0xc9, 0x96, 0x19, 0xd1, 0xc5, 0x94, 0xa8, 0xad, 0x70, 0x77, 0x47, - 0x00, 0x04, 0x39, 0x2d, 0xf3, 0x08, 0xe4, 0x4d, 0x73, 0x4b, 0xe6, 0xab, 0x31, 0x53, 0x21, 0x45, 0xef, 0xa5, 0x26, 0x88, 0xcb, 0xe3, 0xf9, 0xd8, 0x3f, 0x4d, 0x83, 0x13, 0xec, 0xac, 0x2b, 0x24, - 0x94, 0xef, 0xed, 0xde, 0x03, 0x36, 0xaa, 0xac, 0x70, 0xa3, 0xda, 0x71, 0x47, 0xaf, 0xce, 0x03, 0xe4, 0xa3, 0xf5, 0x77, 0xe9, 0x0b, 0x69, 0xfb, 0xae, 0x1d, 0x9e, 0xef, 0xff, 0xbf, 0x1f, 0x1b, - 0x1f, 0x0d, 0x25, 0xd0, 0x1f, 0xd0, 0xa5, 0x27, 0xe9, 0x00, 0x02, 0xfd, 0x3e, 0xb0, 0xf3, 0x2b, 0x62, 0xe1, 0x4f, 0x15, 0xcc, 0x7c, 0x06, 0x7e, 0x26, 0xdc, 0xa7, 0x4b, 0x23, 0x7c, 0x58, 0xf9, - 0x8c, 0xba, 0x25, 0x33, 0x35, 0xa4, 0x8e, 0xc2, 0x44, 0x81, 0x5b, 0x85, 0x6c, 0xd1, 0x40, 0xf3, 0x96, 0xc7, 0x13, 0x8a, 0x4c, 0x83, 0x31, 0xe2, 0xa1, 0xfe, 0xcc, 0x91, 0x37, 0x62, 0xdb, 0xa1, - 0x20, 0x2b, 0xc9, 0x68, 0x82, 0xee, 0x52, 0xbb, 0x0b, 0x32, 0xf5, 0x64, 0x77, 0x8a, 0xa1, 0x40, 0xa6, 0x9f, 0xba, 0x0d, 0xe0, 0x85, 0x1d, 0x41, 0xd7, 0x0c, 0x30, 0x77, 0x8f, 0x92, 0x49, 0x73, - 0xf5, 0x82, 0x1b, 0x38, 0xb7, 0xd2, 0x4e, 0xd3, 0x30, 0xb8, 0x2a, 0x16, 0xd0, 0x53, 0x03, 0x4b, 0x4b, 0xb7, 0x1a, 0x5d, 0x81, 0x5c, 0x77, 0xe2, 0x97, 0xb9, 0xa5, 0xd8, 0xa0, 0x79, 0xd7, 0xd1, - 0x99, 0xd0, 0x23, 0x33, 0x71, 0x46, 0x76, 0x1a, 0xd5, 0xf1, 0x5d, 0xc5, 0xf8, 0xb9, 0x5c, 0xd3, 0xdf, 0xa0, 0x5f, 0x88, 0xf4, 0xe9, 0xda, 0xd0, 0xbc, 0x53, 0xb2, 0x8b, 0xba, 0xc8, 0x2d, 0x0d, - 0x19, 0x94, 0x76, 0x08, 0x7d, 0xf4, 0xd9, 0x69, 0x84, 0xaa, 0xde, 0x31, 0x25, 0x0c, 0x9d, 0x3c, 0x4c, 0xf2, 0x55, 0x81, 0xcf, 0x48, 0x89, 0x2b, 0x72, 0x9b, 0x46, 0x1b, 0xd2, 0xeb, 0x37, 0x5d, - 0x5c, 0xc1, 0xe3, 0xac, 0x65, 0x55, 0x2a, 0x61, 0x54, 0xbd, 0xa4, 0xf2, 0xbe, 0x6f, 0x72, 0xdf, 0x3a, 0xfa, 0x1c, 0x2e, 0x1b, 0x07, 0x62, 0x5d, 0x81, 0x8b, 0xf0, 0xde, 0x14, 0xcc, 0x6f, 0x10, - 0xf6, 0x61, 0x12, 0xdc, 0xd7, 0xec, 0xfc, 0x8c, 0x0d, 0xf1, 0x0e, 0xee, 0x19, 0x49, 0x6f, 0x67, 0x23, 0x7c, 0x98, 0x1d, 0x51, 0x91, 0x7e, 0x4b, 0x67, 0x4b, 0x40, 0x6b, 0xea, 0x56, 0x58, 0xe9, - 0x6d, 0x88, 0xf7, 0xbb, 0x45, 0xd6, 0xf9, 0xcb, 0xbc, 0x3f, 0x20, 0xf9, 0x36, 0x0a, 0xa3, 0x95, 0xe8, 0x41, 0xf1, 0xee, 0x34, 0xdf, 0x58, 0x2e, 0x3a, 0xcb, 0x90, 0x5d, 0xe0, 0x1a, 0xb6, 0x53, - 0x0b, 0xfb, 0xa3, 0xc9, 0x4f, 0xd3, 0x8e, 0xc8, 0xe8, 0x7a, 0x9e, 0xc9, 0xec, 0x5c, 0x9b, 0x53, 0xa4, 0x96, 0xad, 0xb9, 0x48, 0xc8, 0xa9, 0xe7, 0x55, 0xe6, 0x6c, 0x74, 0xfd, 0x86, 0x3f, 0xaf, - 0x5a, 0xf1, 0x97, 0x43, 0x75, 0xfe, 0x86, 0x54, 0xad, 0x28, 0x75, 0xee, 0x97, 0x7e, 0x63, 0xbf, 0x60, 0xf2, 0x17, 0xf2, 0x84, 0x68, 0xb9, 0x00, 0xbd, 0x90, 0xe1, 0x7c, 0x30, 0xba, 0xc1, 0x79, - 0x4c, 0x83, 0x06, 0x09, 0xa7, 0xac, 0x8b, 0x93, 0x91, 0x6b, 0x6f, 0xeb, 0xc8, 0x9c, 0x2e, 0x6b, 0x61, 0x2b, 0x75, 0xa8, 0xd2, 0x61, 0x07, 0x7e, 0xbe, 0x22, 0x0c, 0x58, 0x44, 0x1b, 0x16, 0x0e, - 0x8b, 0x83, 0x6e, 0x08, 0x45, 0x29, 0x03, 0xfc, 0x6c, 0x3b, 0x5f, 0xec, 0x4e, 0xbb, 0xa3, 0xad, 0x4b, 0x25, 0x4c, 0xf2, 0xbe, 0x65, 0xec, 0xe6, 0xae, 0xc3, 0xac, 0x1a, 0x4a, 0x37, 0xe0, 0xaa, - 0x39, 0xe2, 0xb3, 0x66, 0xf3, 0x04, 0x8b, 0x9e, 0x7f, 0xf5, 0x2f, 0x3b, 0x4a, 0x13, 0xd7, 0x71, 0xdd, 0xfb, 0x13, 0x1d, 0x9f, 0x99, 0xa9, 0xfd, 0x19, 0xf8, 0x2b, 0x96, 0xde, 0x2e, 0x8d, 0x2e, - 0x90, 0x1f, 0x69, 0x54, 0xd8, 0x91, 0x02, 0x13, 0x16, 0x90, 0x1a, 0x87, 0x58, 0xac, 0x36, 0xc9, 0x78, 0x7c, 0xf2, 0xf5, 0x74, 0x69, 0x45, 0xbd, 0xf8, 0xd3, 0xb9, 0x38, 0xb7, 0xf7, 0x57, 0x45, - 0x9d, 0xdc, 0x38, 0xee, 0xeb, 0xcf, 0xc5, 0x9e, 0xf0, 0x29, 0x7d, 0x82, 0xfd, 0xf6, 0xb5, 0x2f, 0x57, 0x46, 0x17, 0xb8, 0x8f, 0x3e, 0x56, 0x3b, 0xaa, 0x42, 0xca, 0xb3, 0x8a, 0x88, 0x09, 0x40, - 0x0f, 0x82, 0xbb, 0xc3, 0xa6, 0x03, 0x34, 0xc1, 0xca, 0x31, 0x63, 0xfd, 0xe3, 0x8f, 0x3d, 0x3c, 0x68, 0xe6, 0xf6, 0x5c, 0x5f, 0xa4, 0x77, 0x70, 0x2f, 0x1f, 0xf9, 0x7a, 0x36, 0xb4, 0x1f, 0x12, - 0xa5, 0x4b, 0x4d, 0xc6, 0x30, 0x54, 0xdd, 0xf9, 0x5e, 0xe5, 0xd6, 0x54, 0xb6, 0x6c, 0xe4, 0x53, 0xb6, 0x32, 0xc8, 0xcd, 0x7e, 0xef, 0x64, 0x6a, 0xd0, 0x18, 0xd9, 0xbc, 0x23, 0xca, 0x59, 0x39, - 0xae, 0x39, 0x65, 0x0f, 0x92, 0x85, 0x3c, 0x37, 0x1b, 0xd7, 0x71, 0xc7, 0x94, 0xc9, 0x01, 0x46, 0xd8, 0xe5, 0x44, 0x9d, 0xad, 0x67, 0x3b, 0x1e, 0xa4, 0x19, 0x8d, 0x68, 0xc4, 0x7d, 0xef, 0x29, - 0x1d, 0xff, 0xbc, 0xfc, 0xb1, 0x7d, 0x33, 0x0a, 0xdf, 0x09, 0x9f, 0x77, 0x3b, 0xe6, 0x1d, 0x0f, 0xf2, 0x79, 0x03, 0x7e, 0x46, 0x4c, 0xfd, 0x83, 0x8e, 0xd4, 0x28, 0x4d, 0x33, 0xcb, 0x4d, 0xee, - 0x4e, 0x50, 0x84, 0x9f, 0x9a, 0x16, 0xf6, 0x0a, 0xf5, 0xc2, 0x08, 0xb7, 0xe3, 0xcb, 0x2e, 0x3d, 0x80, 0x0d, 0xbc, 0x0a, 0x91, 0xe2, 0xda, 0x48, 0xa6, 0x2d, 0x30, 0x5d, 0xc9, 0xde, 0x16, 0x8f, - 0x33, 0x56, 0xab, 0x1d, 0x76, 0xac, 0xf4, 0x51, 0xb6, 0x8c, 0x7d, 0x32, 0x56, 0x49, 0xd1, 0x96, 0xe6, 0xb1, 0xeb, 0x95, 0x5c, 0xa4, 0x51, 0x93, 0x10, 0x52, 0x89, 0xa4, 0x98, 0x4c, 0x1c, 0xbb, - 0xdd, 0xcf, 0x80, 0x9e, 0xee, 0x6d, 0x68, 0xb3, 0x1b, 0xf7, 0x73, 0x83, 0x81, 0x67, 0xf0, 0x41, 0xf5, 0x16, 0x46, 0xbd, 0x1a, 0xd8, 0x10, 0xf4, 0x54, 0xb9, 0x37, 0x77, 0xe9, 0xc7, 0x7e, 0xfd, - 0xdf, 0x20, 0xf0, 0x5d, 0xd7, 0xac, 0x7b, 0xe6, 0xd8, 0x13, 0x08, 0x7c, 0x81, 0x7a, 0x46, 0xe0, 0xcb, 0xf1, 0xc5, 0x24, 0x1b, 0x80, 0xc0, 0x55, 0x4a, 0x38, 0x2b, 0x08, 0x9b, 0xc4, 0x9b, 0x63, - 0xdd, 0x27, 0xed, 0x6a, 0xb3, 0x41, 0x33, 0xd5, 0xd5, 0x62, 0x07, 0x5c, 0x40, 0x9e, 0xb7, 0x8d, 0x42, 0x5d, 0x3f, 0xb4, 0x46, 0x00, 0xb8, 0x39, 0xac, 0x4e, 0xe2, 0x5c, 0x6e, 0x27, 0x3e, 0xe0, - 0xf2, 0xe5, 0x5e, 0xdc, 0x4f, 0xda, 0x3d, 0x4d, 0xc3, 0x01, 0x32, 0x33, 0x7d, 0xcc, 0x87, 0xc7, 0xec, 0x7a, 0x72, 0xc2, 0xf2, 0xad, 0x3f, 0xb7, 0xca, 0x60, 0x60, 0x7c, 0xaa, 0x33, 0xa3, 0x28, - 0xb8, 0xf5, 0xda, 0x7f, 0xae, 0x13, 0xcc, 0xa0, 0x2a, 0xf0, 0xd8, 0x0c, 0xdd, 0xab, 0x93, 0xe8, 0x2e, 0xdf, 0xa2, 0x4f, 0xf4, 0xd1, 0x78, 0x03, 0x0b, 0x8e, 0xde, 0x9d, 0x8c, 0x2e, 0xd0, 0x1e, - 0x23, 0xbe, 0xa4, 0x54, 0x3f, 0x12, 0x5c, 0xb2, 0x91, 0xb8, 0x34, 0x96, 0xfd, 0x09, 0x9c, 0xcf, 0xdc, 0x68, 0x9d, 0x86, 0x05, 0xb8, 0xb1, 0x51, 0xe6, 0x20, 0x58, 0x65, 0x8a, 0x26, 0x24, 0x16, - 0xef, 0x24, 0x06, 0xe7, 0xb7, 0x46, 0x1b, 0x8e, 0x69, 0x21, 0xd2, 0x3d, 0x4c, 0x97, 0xcc, 0x98, 0x3f, 0xad, 0x58, 0xca, 0x87, 0x0e, 0x3e, 0x89, 0x16, 0x6b, 0x1a, 0x3b, 0x35, 0xad, 0xb2, 0x45, - 0x26, 0xbb, 0x65, 0xf2, 0x63, 0x3f, 0x54, 0x6c, 0x66, 0xdf, 0xe4, 0x7e, 0x61, 0x4f, 0xd5, 0xc5, 0xdf, 0x60, 0x5e, 0xb0, 0x72, 0x39, 0x1a, 0x61, 0xc3, 0x6a, 0xe0, 0x7d, 0x47, 0x80, 0xdb, 0x5d, - 0x61, 0x58, 0x16, 0x42, 0xbb, 0xe3, 0x79, 0x30, 0x3f, 0xae, 0x2c, 0x57, 0xa2, 0x56, 0x16, 0x77, 0xcc, 0xe1, 0xba, 0x08, 0x17, 0x2b, 0x90, 0x5f, 0x4a, 0xa0, 0xb0, 0xc7, 0xa8, 0xb5, 0x01, 0xcb, - 0x3b, 0x5d, 0x2d, 0xe5, 0xf1, 0x0e, 0x9e, 0xc3, 0x7d, 0xb3, 0x9f, 0x2d, 0x12, 0x58, 0x67, 0x21, 0xc2, 0x6e, 0x8f, 0xe3, 0x52, 0x5c, 0x22, 0x1c, 0xaa, 0x46, 0xc9, 0x11, 0xde, 0xeb, 0x8f, 0xac, - 0xdb, 0xc1, 0x5a, 0xe1, 0x7f, 0xb4, 0xb4, 0x8d, 0xdd, 0xb4, 0xbd, 0x43, 0x17, 0xfa, 0x29, 0x39, 0x71, 0x06, 0x78, 0x26, 0x8a, 0x9b, 0xb6, 0x23, 0x7a, 0x98, 0x74, 0x00, 0x52, 0x6b, 0x63, 0x45, - 0xa2, 0x1c, 0x2b, 0xbe, 0xdd, 0x8d, 0x2b, 0x02, 0xf1, 0xea, 0x42, 0xce, 0x15, 0x46, 0xce, 0x84, 0x4e, 0xd3, 0x53, 0x6a, 0x5c, 0xcb, 0xb8, 0x25, 0x90, 0xce, 0x9c, 0x6a, 0xe3, 0x56, 0x06, 0x9a, - 0x76, 0xc1, 0x65, 0x60, 0x31, 0x99, 0x4d, 0xb1, 0x49, 0xb1, 0x95, 0xa8, 0x49, 0x39, 0x95, 0xa7, 0x70, 0x79, 0x4c, 0x0d, 0x1a, 0xe3, 0x30, 0x98, 0xd4, 0x59, 0x35, 0xa4, 0x96, 0x8f, 0x28, 0x72, - 0x5f, 0x60, 0xfc, 0xcf, 0xcb, 0x50, 0x54, 0xf0, 0x32, 0x48, 0xe7, 0x45, 0x70, 0x7c, 0xdc, 0x74, 0x2e, 0x91, 0xac, 0xd8, 0x8d, 0x6c, 0xb3, 0x74, 0x47, 0xa1, 0x7b, 0x8b, 0x76, 0x13, 0xbf, 0x90, - 0x8f, 0xe1, 0x6c, 0xc7, 0xbd, 0x3c, 0x15, 0xf4, 0xee, 0xd7, 0x30, 0xde, 0xee, 0xbf, 0x01, 0xf9, 0xa2, 0x41, 0xc8, 0xa7, 0x3e, 0xe3, 0x5f, 0x0c, 0x27, 0x78, 0xf9, 0xa9, 0xa3, 0xeb, 0xa0, 0xc0, - 0xf2, 0x77, 0x8d, 0xe9, 0x42, 0xf6, 0x22, 0x36, 0x2f, 0x2f, 0xcb, 0x4c, 0x3b, 0x34, 0x0f, 0xee, 0xcb, 0x84, 0xdd, 0x97, 0xe9, 0x02, 0xef, 0x9e, 0x2d, 0x5c, 0xd3, 0x19, 0x65, 0xe1, 0xe1, 0x3a, - 0x3a, 0xfd, 0xcf, 0x7f, 0x91, 0x9f, 0x23, 0xee, 0x85, 0xeb, 0x5c, 0x47, 0xed, 0x7c, 0xf1, 0xc7, 0x55, 0x11, 0xc4, 0xa3, 0xc4, 0x6d, 0xa3, 0x1b, 0xc7, 0x7f, 0xf5, 0xc8, 0xa7, 0x09, 0x28, 0x30, - 0xf5, 0xf1, 0x7e, 0x67, 0x16, 0x87, 0xf2, 0x83, 0xe9, 0x0f, 0xfd, 0x42, 0x9e, 0xc8, 0xe1, 0xfb, 0x07, 0xd5, 0x98, 0xcb, 0x3a, 0xf8, 0x70, 0xe5, 0xf1, 0x88, 0x14, 0x98, 0x7a, 0xc2, 0x67, 0x74, - 0x6f, 0x44, 0xca, 0x19, 0xd8, 0xe3, 0xb5, 0x27, 0x2e, 0x99, 0xbd, 0x1e, 0x52, 0xc0, 0x72, 0xb3, 0x07, 0xf2, 0xad, 0xd8, 0x86, 0x8b, 0x8a, 0xcb, 0x7b, 0xa6, 0x3e, 0xd9, 0x7e, 0xba, 0x0e, 0xa6, - 0xb4, 0xea, 0x9c, 0x80, 0xd9, 0x66, 0x2e, 0x4f, 0xeb, 0x40, 0x51, 0x00, 0x69, 0xc5, 0xad, 0x16, 0x36, 0x22, 0xac, 0x18, 0x3d, 0xb2, 0xfc, 0x70, 0xde, 0x6e, 0x2b, 0x10, 0x03, 0x13, 0xce, 0x38, - 0xb1, 0xfc, 0x1e, 0x6e, 0x51, 0xc5, 0xd5, 0x44, 0x9e, 0xfa, 0x3c, 0x1e, 0xfa, 0xa7, 0xd2, 0xf0, 0x1f, 0xa5, 0xda, 0x6d, 0x1a, 0xc7, 0xd7, 0x3b, 0xf8, 0x33, 0x0e, 0xd8, 0x2b, 0xc8, 0x8b, 0x48, - 0x3c, 0x1f, 0x8c, 0xe0, 0x61, 0x4e, 0x58, 0x2a, 0x27, 0x77, 0xec, 0x61, 0xbd, 0xd2, 0xb0, 0x15, 0x55, 0xd9, 0xde, 0x4e, 0xea, 0xa8, 0x03, 0x44, 0x0b, 0xb6, 0xdc, 0x1a, 0x8e, 0xd5, 0xce, 0xd8, - 0xdc, 0x77, 0x41, 0xcd, 0x08, 0xd3, 0x65, 0x7f, 0x4c, 0x40, 0x74, 0x3b, 0x9f, 0xb6, 0x95, 0x38, 0xd9, 0x57, 0xfa, 0xfc, 0xc4, 0xa0, 0x22, 0x55, 0x49, 0x7d, 0x66, 0xf7, 0x93, 0xc9, 0xf4, 0xd0, - 0x00, 0x12, 0x22, 0xe1, 0x1d, 0x04, 0x19, 0x2b, 0xf1, 0x61, 0xf3, 0x87, 0x47, 0x4e, 0xd2, 0x21, 0xde, 0x8b, 0xd8, 0xad, 0xfc, 0xd4, 0xb9, 0xef, 0x73, 0x7b, 0xa6, 0xe6, 0xff, 0x06, 0xf3, 0x82, - 0xc4, 0xcb, 0xd1, 0xd0, 0xfa, 0xfe, 0xc0, 0x8e, 0x98, 0x85, 0x2b, 0xe4, 0x42, 0x4c, 0x50, 0xfd, 0xac, 0x4a, 0x0c, 0xc8, 0x05, 0x60, 0x1e, 0xe9, 0xd4, 0xa5, 0xd3, 0xf4, 0x42, 0x6a, 0xd6, 0x9c, - 0x8a, 0x69, 0x63, 0x06, 0xdd, 0x35, 0x0b, 0xb0, 0x91, 0x66, 0x81, 0x3b, 0x23, 0x73, 0x4f, 0x89, 0x5a, 0xd5, 0x50, 0x81, 0x29, 0x43, 0x4b, 0xb4, 0x25, 0xe9, 0xcb, 0x0d, 0x0d, 0xd5, 0xd1, 0x29, - 0x55, 0xd3, 0xc9, 0x02, 0x41, 0xcb, 0xdd, 0xbd, 0x38, 0xdc, 0x60, 0x2c, 0x0e, 0x1b, 0xfd, 0x1b, 0x07, 0x76, 0x91, 0xbe, 0x4c, 0x72, 0xfb, 0x5a, 0x6f, 0x7a, 0xa6, 0x23, 0xc9, 0x1b, 0xd8, 0x33, - 0x36, 0x5f, 0x4f, 0x2e, 0x91, 0xfd, 0x01, 0x0e, 0xcb, 0x4c, 0x89, 0xfb, 0x16, 0xd4, 0x55, 0xbb, 0xd5, 0xe7, 0xd9, 0x94, 0x36, 0x97, 0x74, 0x0e, 0x42, 0xba, 0xd8, 0xf2, 0x42, 0x77, 0x38, 0xb2, - 0xdb, 0x15, 0xd5, 0x41, 0x66, 0x0a, 0xb5, 0x4e, 0x9e, 0x15, 0x45, 0x3f, 0x35, 0xb1, 0x7d, 0x72, 0xe2, 0xed, 0x9e, 0xf4, 0x64, 0xc5, 0x28, 0xa8, 0x26, 0xf5, 0xa9, 0x1d, 0x0c, 0x85, 0x73, 0x9f, - 0x19, 0x5b, 0x82, 0xbd, 0xd8, 0x85, 0x78, 0xbb, 0x38, 0x68, 0x0f, 0x9b, 0xdc, 0x7d, 0xd3, 0xda, 0xa2, 0x30, 0xed, 0x77, 0x9b, 0xcc, 0x87, 0x3d, 0x2a, 0x0b, 0xec, 0xf4, 0x6d, 0x12, 0x1e, 0xf2, - 0xd4, 0x06, 0x42, 0xfd, 0x90, 0x54, 0x1f, 0x25, 0xfe, 0xfb, 0x5f, 0xf0, 0x15, 0x05, 0xaf, 0xbf, 0xe9, 0xa7, 0x14, 0x7c, 0x85, 0x0a, 0x8e, 0xde, 0x8e, 0x47, 0x17, 0x58, 0x8f, 0xe9, 0xc7, 0x65, - 0x2c, 0x7f, 0xf4, 0x5a, 0x7b, 0x32, 0x55, 0x2d, 0x5a, 0x72, 0x83, 0xc3, 0xb6, 0x44, 0xe2, 0xf1, 0xaa, 0xd7, 0x55, 0xa9, 0x67, 0x6a, 0x09, 0x49, 0x25, 0x9b, 0xa1, 0x29, 0x7a, 0xe1, 0x52, 0x4a, - 0xe5, 0x42, 0xc0, 0x5e, 0x65, 0x8e, 0x2d, 0xbc, 0xda, 0xb9, 0xce, 0xd4, 0xaf, 0xb7, 0x9c, 0x14, 0x2e, 0x8e, 0x9b, 0x7d, 0xbf, 0x16, 0xd0, 0x24, 0x9b, 0xd0, 0x51, 0xbd, 0xf5, 0xe7, 0x7b, 0x96, - 0x73, 0x1e, 0xd1, 0xef, 0x07, 0x48, 0xfe, 0xcb, 0x02, 0xff, 0x98, 0x26, 0xa5, 0xed, 0x47, 0x41, 0x12, 0xba, 0x6f, 0xbd, 0x7b, 0xbf, 0xa5, 0x5d, 0x7c, 0x3f, 0x17, 0x88, 0x78, 0x46, 0x01, 0x0e, - 0x62, 0xf7, 0xb2, 0xb4, 0x62, 0x77, 0x74, 0x81, 0xf0, 0x98, 0x28, 0xea, 0x46, 0x0a, 0xd7, 0x2e, 0xbb, 0x45, 0xe1, 0x42, 0x5c, 0x07, 0x66, 0x51, 0x8e, 0x85, 0xe5, 0xc2, 0xe0, 0xf8, 0xf9, 0xa1, - 0xe1, 0x6c, 0x90, 0x2f, 0x8e, 0xa9, 0xc7, 0x24, 0xe3, 0x48, 0xac, 0x2a, 0x0f, 0x37, 0x8f, 0x4a, 0x93, 0x07, 0x0a, 0x43, 0xc9, 0xa5, 0x9b, 0x58, 0x76, 0x9a, 0xda, 0x15, 0x47, 0x38, 0xc4, 0xb6, - 0x24, 0xcc, 0xdc, 0xd0, 0xc7, 0x0c, 0xa0, 0x5b, 0x21, 0x57, 0xf9, 0xc1, 0xc3, 0x9a, 0xe2, 0xdf, 0xd2, 0x37, 0x6e, 0x98, 0xf8, 0xd3, 0x8e, 0x82, 0xf7, 0x39, 0x1b, 0x43, 0xa9, 0xf8, 0xd1, 0xb6, - 0xfe, 0x1e, 0xe1, 0x23, 0xe7, 0x5e, 0x49, 0x2a, 0xfc, 0x0b, 0x7f, 0xc6, 0xbd, 0x73, 0x03, 0xfa, 0x82, 0x77, 0xc7, 0x1a, 0x5d, 0x01, 0x3d, 0xc6, 0x7d, 0x29, 0xa9, 0x58, 0xbd, 0x23, 0x9d, 0x7d, - 0xd4, 0x54, 0xda, 0xea, 0xd4, 0xb6, 0xa7, 0xc5, 0x14, 0x92, 0xea, 0xc0, 0xdf, 0x09, 0x01, 0x4b, 0x6e, 0x3b, 0xc6, 0x92, 0xf1, 0x8d, 0x76, 0x9a, 0x4e, 0xc6, 0x74, 0xac, 0xee, 0x1b, 0xf1, 0x50, - 0xa4, 0xb2, 0xd8, 0xee, 0x65, 0x59, 0xe4, 0xa4, 0x15, 0x35, 0x59, 0x5a, 0x2c, 0x00, 0xb3, 0xdb, 0x5d, 0x24, 0xa6, 0x1c, 0xac, 0x4e, 0x90, 0x44, 0x45, 0x0f, 0xfb, 0xe6, 0x11, 0xee, 0xff, 0xae, - 0x1d, 0x22, 0xbe, 0x26, 0xdd, 0xde, 0x4f, 0x90, 0x81, 0x7f, 0xa1, 0x3f, 0xaf, 0x00, 0x7a, 0x83, 0xfb, 0x82, 0xcf, 0xcb, 0xc9, 0xe8, 0x0a, 0xee, 0x31, 0x4a, 0x8d, 0xe9, 0x1e, 0xb0, 0xa4, 0x18, - 0xef, 0xb7, 0xdb, 0x19, 0xb0, 0xcf, 0x26, 0x05, 0xa3, 0xd2, 0x09, 0x07, 0xa9, 0x87, 0xe5, 0x64, 0x2f, 0x6d, 0x21, 0xb9, 0xda, 0xc2, 0x82, 0xa1, 0xcd, 0x1a, 0xac, 0x04, 0x80, 0xad, 0x10, 0xda, - 0x87, 0x9d, 0xb9, 0x85, 0x0e, 0x04, 0x80, 0x29, 0x48, 0xbd, 0xc4, 0xd6, 0x47, 0xf9, 0xd8, 0x77, 0xe5, 0x62, 0x0c, 0xf7, 0xa7, 0x5a, 0xe3, 0x71, 0xc8, 0xef, 0x4d, 0x57, 0x0f, 0x1e, 0x6d, 0xba, - 0xf7, 0xf7, 0x88, 0x37, 0x86, 0x7b, 0xe1, 0xae, 0x9f, 0xb2, 0xf6, 0x60, 0x7a, 0x24, 0xa3, 0x6b, 0xe7, 0xd8, 0xbb, 0xcc, 0xfd, 0x4c, 0x66, 0xc8, 0x1b, 0xd8, 0x0b, 0x39, 0x5e, 0x4e, 0x86, 0xe4, - 0x78, 0x9c, 0xa9, 0xb1, 0xa4, 0x8f, 0xed, 0x3a, 0x81, 0xc8, 0x4d, 0x07, 0x2e, 0x5b, 0xf1, 0x88, 0xf6, 0xbb, 0x70, 0x17, 0x84, 0xc8, 0x6a, 0xdb, 0x1c, 0x32, 0xb3, 0x0b, 0xa7, 0x06, 0x1b, 0x1c, - 0x78, 0x42, 0x39, 0x11, 0x02, 0xcd, 0x5b, 0xeb, 0xae, 0x6d, 0xd5, 0xcd, 0xba, 0x3a, 0xb1, 0x5b, 0x80, 0x8c, 0x76, 0xe9, 0x94, 0xe7, 0x1d, 0x54, 0x44, 0x97, 0x7a, 0xbb, 0x6a, 0x9b, 0xba, 0x4e, - 0x4a, 0x4a, 0x1d, 0x83, 0x0b, 0x97, 0xf9, 0x8b, 0x0c, 0x3e, 0xa4, 0x5f, 0xdd, 0xfb, 0x41, 0xb6, 0x5f, 0x21, 0x13, 0x7d, 0x4e, 0x93, 0x7c, 0x81, 0x7a, 0xc5, 0xe5, 0xf5, 0x78, 0x84, 0x0e, 0xd3, - 0x26, 0x57, 0x64, 0x46, 0xa0, 0xbe, 0x12, 0x9c, 0xf7, 0x44, 0x61, 0xca, 0xb6, 0x2d, 0xac, 0x91, 0x01, 0x4a, 0x02, 0xe3, 0x6e, 0x59, 0x88, 0x9a, 0x88, 0xeb, 0xb2, 0xcc, 0xf4, 0x06, 0xba, 0x13, - 0x6d, 0x1e, 0x92, 0x84, 0xce, 0x6a, 0x33, 0x2f, 0xde, 0x81, 0x02, 0x84, 0xf7, 0x33, 0xa6, 0x6f, 0x65, 0x5a, 0xdd, 0x74, 0xac, 0xad, 0x13, 0x15, 0xaa, 0x8a, 0x00, 0x87, 0x9b, 0xf9, 0x58, 0x16, - 0x97, 0x8b, 0xe7, 0x19, 0xfb, 0xa2, 0xfc, 0x8c, 0xdc, 0x53, 0x66, 0x26, 0x2f, 0x48, 0xb9, 0xf8, 0x0f, 0xc8, 0x1f, 0x32, 0xf8, 0x7f, 0x1b, 0x4a, 0x8d, 0xe0, 0xae, 0xed, 0x7a, 0x46, 0xdf, 0x13, - 0xce, 0xcd, 0x1b, 0xd0, 0x17, 0x5a, 0x04, 0x65, 0x75, 0x71, 0xc9, 0x0f, 0x70, 0x6c, 0xae, 0xca, 0x63, 0x12, 0x62, 0x56, 0x8b, 0xee, 0x57, 0xf9, 0xbe, 0xb7, 0x9c, 0x6e, 0x1c, 0x08, 0xa5, 0xa4, - 0x2d, 0x24, 0x4f, 0x04, 0x00, 0x75, 0x3e, 0x27, 0x31, 0x7a, 0x72, 0x2a, 0x89, 0xcc, 0x9d, 0xd4, 0xb8, 0x7e, 0xc0, 0x92, 0xc2, 0x4d, 0x4c, 0x42, 0xdc, 0x9d, 0xc4, 0xfd, 0xa9, 0x90, 0xb7, 0x79, - 0xdb, 0x42, 0xab, 0xb8, 0xad, 0x00, 0xc5, 0xf5, 0xa8, 0xe2, 0x70, 0xa8, 0xe3, 0x70, 0xcb, 0xf7, 0xf7, 0x46, 0xba, 0x3e, 0xc6, 0xca, 0x3b, 0xc7, 0xcb, 0xd7, 0x9a, 0xfa, 0x33, 0xd1, 0xab, 0xcf, - 0xc0, 0xdf, 0x63, 0xe9, 0x76, 0x69, 0x68, 0x1c, 0x4b, 0xc6, 0x0a, 0xea, 0xe0, 0x3b, 0x14, 0xd4, 0xf9, 0x22, 0x08, 0x1d, 0x61, 0x11, 0x1d, 0x23, 0xe3, 0x63, 0xeb, 0xea, 0xa8, 0x17, 0x2c, 0x0e, - 0xb4, 0xed, 0x88, 0xed, 0x71, 0xe5, 0x20, 0x2b, 0x92, 0x90, 0x61, 0x14, 0xb7, 0x01, 0x61, 0x7a, 0x9a, 0x4f, 0x72, 0x67, 0xcf, 0xc9, 0xf0, 0x86, 0x1b, 0xd7, 0x33, 0xef, 0xa0, 0x59, 0x8c, 0xda, - 0x8f, 0xbd, 0x66, 0x7f, 0x94, 0x54, 0xd6, 0x15, 0x0e, 0xb9, 0x00, 0x3f, 0x5f, 0x9a, 0x67, 0x16, 0xc5, 0x35, 0x7d, 0xee, 0x8b, 0x5a, 0x8e, 0xe0, 0x63, 0xb1, 0xf0, 0x17, 0x1e, 0xb1, 0xb7, 0x64, - 0xb3, 0xeb, 0x4c, 0x90, 0x9f, 0x6b, 0xf5, 0x83, 0x66, 0x18, 0xc7, 0xdf, 0xee, 0xaa, 0x3f, 0xa7, 0xe6, 0x85, 0x7e, 0xb7, 0x4d, 0xf4, 0x31, 0xc5, 0x88, 0x59, 0xd4, 0xd7, 0xd6, 0x96, 0x37, 0xe6, - 0xe8, 0x0a, 0x31, 0x41, 0x61, 0x37, 0x61, 0x22, 0x97, 0xf5, 0x8f, 0x7d, 0x8e, 0xa7, 0xa7, 0xc3, 0xa2, 0x33, 0x27, 0x2a, 0xdd, 0xed, 0xf5, 0xc6, 0xe6, 0xcb, 0x26, 0xdd, 0x99, 0x8b, 0x55, 0x0e, - 0x96, 0xf8, 0x49, 0x5f, 0x12, 0xa0, 0xae, 0x4b, 0x44, 0xd5, 0x93, 0x0a, 0x7d, 0x62, 0xc4, 0x6a, 0x91, 0x6c, 0x44, 0xb0, 0xd2, 0xab, 0x19, 0xaa, 0x29, 0xdb, 0xe8, 0x0e, 0xc5, 0xee, 0xe3, 0x20, - 0x31, 0xab, 0xba, 0x30, 0xa3, 0x91, 0x9d, 0xc6, 0x99, 0x79, 0x77, 0xae, 0x05, 0x7c, 0xc9, 0xb8, 0xfa, 0x29, 0x42, 0x3e, 0xc1, 0x06, 0x47, 0x9f, 0xaf, 0x5c, 0x3c, 0x25, 0x0f, 0x43, 0xee, 0x9b, - 0x82, 0x00, 0xc9, 0xca, 0x51, 0x17, 0x5d, 0x9b, 0x14, 0x52, 0x99, 0x35, 0x56, 0xa3, 0xe8, 0x4b, 0xd8, 0xca, 0x24, 0xfb, 0xa7, 0x1f, 0x9b, 0x3a, 0xee, 0x28, 0x2d, 0x47, 0x75, 0x15, 0x7c, 0x33, - 0x54, 0x0c, 0x7d, 0xa2, 0x5c, 0xf3, 0x03, 0xe4, 0xf3, 0x87, 0xbe, 0x3f, 0xbf, 0x84, 0x72, 0x06, 0x94, 0x6d, 0x7a, 0x4d, 0xa2, 0xd3, 0x95, 0x61, 0x29, 0xa4, 0xe6, 0x4d, 0xe6, 0xf8, 0x98, 0xe9, - 0xd0, 0x4e, 0x04, 0x93, 0x09, 0xdf, 0x1d, 0x77, 0xda, 0x94, 0x58, 0x1f, 0x7c, 0x36, 0x87, 0x7a, 0x7c, 0x36, 0xf5, 0x04, 0xc0, 0xd0, 0x33, 0x5e, 0x13, 0x96, 0xdb, 0xb1, 0x63, 0x05, 0xde, 0x49, - 0x0e, 0x65, 0x04, 0x77, 0xad, 0x02, 0x26, 0xe6, 0x90, 0x40, 0xba, 0x8a, 0xb6, 0x0a, 0x4a, 0xd1, 0x5e, 0xb3, 0x8b, 0x39, 0xfa, 0x7d, 0xb7, 0xef, 0xf3, 0x49, 0x9c, 0xde, 0xcb, 0x47, 0x3c, 0xab, - 0xd7, 0x30, 0xfd, 0x14, 0x32, 0xe2, 0x4b, 0x5f, 0xa0, 0xdb, 0xd1, 0xe8, 0x0a, 0xe8, 0x31, 0x06, 0xb0, 0xac, 0x81, 0x3d, 0xc4, 0x5a, 0x4f, 0x8f, 0x10, 0xeb, 0x1e, 0xc0, 0xb5, 0x3f, 0xcf, 0x4f, - 0x45, 0xd5, 0xb8, 0xae, 0x8c, 0x83, 0x73, 0x50, 0xdd, 0xb9, 0x74, 0x20, 0x12, 0xf5, 0xd6, 0xe8, 0x8f, 0x89, 0x12, 0xd5, 0x1b, 0x06, 0x93, 0x76, 0x9a, 0x47, 0x4d, 0x34, 0x9a, 0xe6, 0x55, 0xa9, - 0x9d, 0x8f, 0x51, 0x57, 0x58, 0x32, 0x64, 0xaf, 0xce, 0x52, 0x89, 0x24, 0xf7, 0xf5, 0x92, 0xf4, 0x45, 0x1b, 0x7a, 0x24, 0xc5, 0x7c, 0xb3, 0x5c, 0x26, 0x65, 0x65, 0x46, 0xd1, 0xc6, 0x2e, 0x82, - 0xac, 0x1a, 0x2e, 0xe5, 0x6c, 0x3f, 0x0d, 0x03, 0xc7, 0xbc, 0x3a, 0xb0, 0xd1, 0x5f, 0xf8, 0xe7, 0xe0, 0x80, 0x55, 0x1f, 0x6e, 0xb7, 0x90, 0x8f, 0xb9, 0xf7, 0x5f, 0x4d, 0x40, 0xf9, 0x42, 0x52, - 0x3e, 0x98, 0xf4, 0x9f, 0x95, 0x55, 0xe1, 0xba, 0xbf, 0x0a, 0x37, 0xee, 0x5e, 0xe5, 0x28, 0xf5, 0xfe, 0x81, 0xd2, 0x8d, 0x9b, 0x9b, 0x7b, 0x1d, 0xff, 0x45, 0x7e, 0x84, 0x5d, 0x06, 0x71, 0x16, - 0xb9, 0xa3, 0x3a, 0xbb, 0xb4, 0x7f, 0x4b, 0xd2, 0x2a, 0xf0, 0x82, 0xdb, 0xb3, 0xbf, 0x95, 0x0a, 0xdc, 0xf2, 0x0d, 0xca, 0x91, 0x9d, 0x46, 0xe9, 0x0b, 0xbc, 0x4f, 0x59, 0x7f, 0x55, 0x5a, 0xbf, - 0xfe, 0xce, 0x4f, 0xe2, 0xbc, 0x4e, 0x1c, 0xd7, 0x2b, 0x4d, 0xef, 0x1a, 0x24, 0x41, 0x2e, 0x25, 0x83, 0xb7, 0xbb, 0x6f, 0x02, 0xfd, 0x37, 0x63, 0xf5, 0x8d, 0x35, 0x2f, 0xb5, 0x06, 0xb7, 0xd3, - 0x67, 0xec, 0x56, 0xea, 0x63, 0x6a, 0xee, 0xeb, 0x9f, 0x7d, 0xe9, 0x80, 0x78, 0x99, 0x26, 0x94, 0x66, 0x6e, 0x62, 0xa7, 0x51, 0xe4, 0xda, 0x55, 0xd0, 0xb8, 0x1f, 0x3e, 0xe7, 0xa3, 0x8b, 0xe2, - 0xe3, 0x83, 0x17, 0x57, 0xc5, 0xcb, 0x4f, 0x7f, 0x79, 0xe3, 0xc3, 0xf5, 0xf7, 0xd1, 0xa9, 0xf4, 0x60, 0x82, 0xe4, 0x73, 0xed, 0xd2, 0xbe, 0x9a, 0x20, 0x39, 0xa0, 0x21, 0x1a, 0x3c, 0xaa, 0x1c, - 0x45, 0x45, 0x27, 0x73, 0xa3, 0x08, 0x56, 0x5a, 0xec, 0x09, 0x73, 0x2f, 0x4a, 0x17, 0x14, 0x19, 0xed, 0xea, 0x06, 0xfa, 0x77, 0xb7, 0x10, 0xbe, 0x44, 0xcf, 0x2b, 0x57, 0x7f, 0x85, 0x9c, 0x8f, - 0x7c, 0x3e, 0x14, 0x39, 0x57, 0x90, 0xe0, 0xe8, 0x76, 0x30, 0xba, 0x40, 0x79, 0x2c, 0xae, 0x4a, 0xb3, 0x36, 0xa7, 0x1e, 0x28, 0x19, 0xce, 0xee, 0x50, 0xf0, 0x5b, 0x61, 0xbf, 0x50, 0xaa, 0x4c, - 0x37, 0xe1, 0x40, 0x09, 0x38, 0xdb, 0x74, 0xad, 0x80, 0x93, 0xe1, 0xf1, 0xca, 0xc9, 0xe4, 0x48, 0x5b, 0x20, 0xd1, 0xa4, 0x71, 0x4f, 0xb2, 0xa3, 0xe3, 0x78, 0x99, 0x48, 0xb3, 0x8e, 0x23, 0xe5, - 0x3e, 0xab, 0x9d, 0xdc, 0x9a, 0x2c, 0xa1, 0x5c, 0x9f, 0x79, 0xa2, 0x59, 0x2e, 0x9c, 0x4e, 0x98, 0xce, 0x1f, 0x85, 0x35, 0x7f, 0x5b, 0x28, 0x6f, 0xab, 0xfc, 0xbc, 0x4e, 0x6e, 0x67, 0xcf, 0xe2, - 0xf6, 0xf3, 0x4a, 0xff, 0x1a, 0xc7, 0xcf, 0xa4, 0xe0, 0x7d, 0x04, 0x7d, 0xc6, 0xf5, 0x87, 0x0b, 0x23, 0xfc, 0x71, 0xfa, 0xdd, 0x45, 0xd1, 0x3d, 0xee, 0x8e, 0xad, 0xa3, 0x2f, 0x2b, 0x0c, 0xa2, - 0xd6, 0xcb, 0x80, 0xc9, 0x27, 0x3a, 0x96, 0xaa, 0x5c, 0x79, 0x50, 0x11, 0x36, 0x67, 0xe6, 0x7d, 0x89, 0x48, 0x59, 0x18, 0x63, 0xa6, 0xbc, 0xb7, 0x8e, 0x31, 0x60, 0xb0, 0x1a, 0x6b, 0x6b, 0xd8, - 0xc6, 0x9b, 0x09, 0xdb, 0x02, 0xab, 0xd7, 0x82, 0x11, 0x9b, 0x90, 0xdb, 0x61, 0x1e, 0x1e, 0x1d, 0xf8, 0x22, 0x1c, 0x43, 0xa6, 0x0e, 0xc9, 0xeb, 0xf4, 0x79, 0x0b, 0xed, 0xdd, 0x5a, 0x7d, 0x76, - 0x86, 0xfb, 0xb0, 0x85, 0x90, 0x7d, 0xeb, 0x72, 0xf8, 0x39, 0x39, 0xce, 0x10, 0x2f, 0x3b, 0x74, 0x56, 0x0d, 0x6a, 0xd4, 0x07, 0x8f, 0x2c, 0x07, 0xf2, 0x9b, 0x4d, 0x7a, 0x92, 0xf5, 0x7a, 0x63, - 0x27, 0xe8, 0xce, 0xf7, 0x82, 0x98, 0x42, 0xf7, 0x4b, 0x02, 0xc0, 0x9e, 0xc5, 0x9e, 0x69, 0x59, 0xc5, 0xe5, 0xf9, 0x3f, 0xbf, 0x68, 0x16, 0xf0, 0xc5, 0x8e, 0x70, 0x41, 0xc2, 0x6d, 0x3b, 0xc8, - 0xaa, 0x9f, 0xef, 0x05, 0x43, 0xec, 0xe0, 0xbb, 0x51, 0xf4, 0x7b, 0xb2, 0xf8, 0xe7, 0x96, 0xc2, 0xd7, 0xaf, 0xb8, 0x50, 0xe3, 0xab, 0x1b, 0x17, 0x39, 0x3d, 0xc0, 0xa2, 0xc8, 0x10, 0x0d, 0x2e, - 0x0f, 0x79, 0x70, 0x44, 0xfb, 0xf5, 0xba, 0x53, 0x26, 0x10, 0x41, 0x4e, 0x0f, 0x30, 0x61, 0x79, 0xfd, 0x6e, 0x01, 0xb4, 0xa4, 0xdf, 0xb9, 0x87, 0x38, 0x5b, 0x36, 0x06, 0xb6, 0x12, 0x8e, 0x79, - 0x35, 0x17, 0x77, 0xcc, 0xb2, 0xe1, 0xe3, 0xe3, 0xf8, 0x84, 0x76, 0x12, 0xb9, 0xdf, 0xba, 0x74, 0xc3, 0xad, 0x0e, 0x61, 0x2a, 0x88, 0xd2, 0xb1, 0x95, 0xe7, 0xe9, 0x61, 0x9a, 0xae, 0xf5, 0xd9, - 0x23, 0xed, 0xe9, 0x9b, 0xa5, 0xf1, 0xdb, 0x3c, 0xcc, 0x97, 0x0c, 0xb7, 0x77, 0x9b, 0xe9, 0x6f, 0xed, 0x89, 0xcf, 0x0a, 0x02, 0xfe, 0xb9, 0x56, 0xe0, 0x55, 0x8d, 0x21, 0x7f, 0xa1, 0x1f, 0x75, - 0xa0, 0xc6, 0x8c, 0x82, 0xab, 0x06, 0x93, 0xc5, 0xaf, 0x48, 0x8b, 0x02, 0xdb, 0x4d, 0x6e, 0x75, 0x8f, 0xe8, 0x53, 0x9d, 0x28, 0x06, 0x25, 0x84, 0xbd, 0xa7, 0xd6, 0xdd, 0xbc, 0xfa, 0xe7, 0x76, - 0xeb, 0x8f, 0xa0, 0x3f, 0x71, 0x46, 0xe5, 0x0f, 0xd9, 0xb9, 0x2f, 0x36, 0xa6, 0x6b, 0x94, 0x38, 0x5f, 0xa2, 0x5a, 0x35, 0x09, 0xca, 0x85, 0x96, 0xd1, 0x1b, 0x64, 0xae, 0x76, 0x94, 0x93, 0x87, - 0xd9, 0x3c, 0xc0, 0xc6, 0xbb, 0x4d, 0x8f, 0xce, 0xcd, 0x3c, 0x60, 0x09, 0xb7, 0xaf, 0x2d, 0x08, 0x87, 0x11, 0x76, 0xd3, 0x57, 0xba, 0xda, 0xaa, 0x63, 0x62, 0x42, 0x2c, 0x39, 0x4b, 0x0e, 0xf7, - 0x88, 0x94, 0x58, 0x60, 0x3c, 0xc5, 0xb4, 0x7d, 0x7a, 0x9c, 0x28, 0xad, 0xdd, 0xf2, 0x8f, 0x38, 0xe2, 0xef, 0x2a, 0x94, 0xba, 0xb5, 0x74, 0x0b, 0x92, 0x32, 0xfb, 0xae, 0x95, 0x1c, 0xf9, 0x04, - 0x7a, 0x3f, 0x82, 0x06, 0x47, 0x9f, 0x2e, 0x8c, 0x2e, 0x50, 0x1f, 0xa3, 0xd7, 0x24, 0x33, 0x76, 0xe1, 0xf8, 0xf0, 0x89, 0x5b, 0x32, 0x87, 0x6d, 0xb7, 0x51, 0xe7, 0x07, 0x7e, 0x7d, 0x02, 0x4f, - 0xed, 0xd4, 0x28, 0x43, 0x01, 0x56, 0x1d, 0xc2, 0x3d, 0xec, 0xf7, 0x02, 0xca, 0x3a, 0x8a, 0x86, 0x19, 0x6b, 0x49, 0x60, 0xa7, 0xea, 0x76, 0x06, 0xf8, 0x6d, 0x87, 0xf0, 0xea, 0x04, 0x18, 0x47, - 0xc0, 0xa6, 0xe3, 0x75, 0x46, 0x48, 0xda, 0x1e, 0x3c, 0x76, 0x3e, 0x98, 0xd7, 0x15, 0xa7, 0x3e, 0xda, 0x8b, 0x9e, 0x0d, 0x9b, 0x0d, 0x2e, 0x9e, 0x7f, 0xc1, 0xc5, 0x77, 0x01, 0xfe, 0x9f, 0xcb, - 0xbc, 0x57, 0xa8, 0xef, 0xb0, 0x7d, 0x0d, 0xf2, 0x0f, 0x90, 0x6c, 0x95, 0xdb, 0xe5, 0x7c, 0x33, 0xd3, 0x7a, 0x3e, 0xcc, 0xf1, 0x31, 0x1d, 0x06, 0xd4, 0x6c, 0xa7, 0x31, 0x34, 0x84, 0xa8, 0xac, - 0x82, 0xe4, 0xe1, 0x29, 0x76, 0x18, 0x2c, 0xe1, 0x3d, 0xa0, 0x3d, 0x8a, 0x3c, 0xa3, 0x1d, 0x4e, 0xfd, 0x44, 0x33, 0x84, 0xc9, 0x29, 0x9b, 0xe6, 0xf4, 0xba, 0x61, 0xa9, 0x75, 0xec, 0x6b, 0x42, - 0x01, 0x2c, 0xa9, 0x16, 0x1d, 0x0b, 0x18, 0xbd, 0x3b, 0xa1, 0xc4, 0x9e, 0xd0, 0x1f, 0x79, 0xb8, 0xef, 0x4b, 0x36, 0xc7, 0xf5, 0x82, 0xc4, 0x1d, 0x65, 0x45, 0x9a, 0xb9, 0x45, 0x15, 0xdc, 0xc2, - 0xd3, 0x1f, 0xf1, 0x72, 0xa9, 0xb0, 0x1e, 0x99, 0x56, 0x59, 0x15, 0xa6, 0xfd, 0x62, 0xdf, 0xc1, 0xd4, 0x2f, 0x68, 0x94, 0xb8, 0xa7, 0xea, 0x09, 0x91, 0xf4, 0x0f, 0x35, 0x2e, 0xb9, 0xd1, 0xea, - 0x96, 0xbe, 0x76, 0x8f, 0x1f, 0x7e, 0xae, 0x72, 0xbf, 0x83, 0xfb, 0xc6, 0x11, 0xe7, 0xb3, 0x6b, 0x4b, 0x9c, 0xc7, 0x3c, 0x21, 0xd4, 0x0c, 0xbb, 0x51, 0x45, 0x75, 0x5d, 0x44, 0x4b, 0x5d, 0xf4, - 0x16, 0x5c, 0x3f, 0x25, 0xac, 0x4c, 0xaa, 0xd1, 0x6a, 0x5f, 0xa1, 0xa7, 0xe6, 0x28, 0x38, 0xca, 0x52, 0x06, 0x66, 0xee, 0x16, 0x8a, 0x04, 0x0b, 0xe3, 0x28, 0x4d, 0x21, 0xa1, 0x89, 0x39, 0x3d, - 0xf9, 0xb5, 0x70, 0xa8, 0x37, 0x88, 0x3e, 0x07, 0xe6, 0xc7, 0xb0, 0x5b, 0xb7, 0x62, 0x5f, 0x0a, 0xb8, 0x11, 0x56, 0xcb, 0xd8, 0xf3, 0xff, 0xaa, 0x6c, 0x1b, 0x38, 0xa8, 0xe7, 0xfa, 0xb5, 0xbf, - 0xcc, 0xb2, 0x0c, 0x0e, 0xf7, 0x7c, 0x2f, 0xd8, 0x53, 0xc1, 0x8f, 0x0f, 0x90, 0x5f, 0xf1, 0x7a, 0x3b, 0xbf, 0xf8, 0x92, 0x07, 0x04, 0x41, 0x82, 0xd3, 0x16, 0xe1, 0xf1, 0xed, 0x42, 0x2f, 0x99, - 0xac, 0x0b, 0x54, 0x69, 0xcf, 0xc5, 0x1a, 0x80, 0xb0, 0x8b, 0x4c, 0xd7, 0x5d, 0x7c, 0x19, 0xa0, 0x6b, 0xc0, 0xc3, 0x5c, 0xc0, 0x5c, 0xcd, 0x98, 0x85, 0x99, 0xe2, 0x66, 0x3c, 0x53, 0x34, 0x62, - 0x05, 0x89, 0x22, 0x61, 0x83, 0xbc, 0x4a, 0x8d, 0x5d, 0x8c, 0xac, 0xab, 0xc9, 0x09, 0x99, 0xf3, 0x14, 0xed, 0x9f, 0xe6, 0x63, 0x42, 0xdf, 0xc4, 0x5c, 0xfd, 0xc8, 0xac, 0xf9, 0x49, 0x4b, 0x91, - 0x4f, 0x39, 0x96, 0x83, 0x16, 0xe3, 0xd7, 0x1d, 0xaa, 0xde, 0x3d, 0xf0, 0x91, 0xd1, 0xaf, 0x10, 0xfe, 0xef, 0x59, 0xa5, 0xc9, 0xc8, 0x3d, 0x05, 0xd5, 0x28, 0x72, 0xcd, 0x70, 0xe4, 0x15, 0xee, - 0xfd, 0x84, 0x87, 0x67, 0xe2, 0x14, 0xbf, 0x41, 0x3f, 0x73, 0xd6, 0xe7, 0x6b, 0x43, 0x47, 0xe7, 0xec, 0xea, 0x89, 0x69, 0x18, 0xcc, 0x51, 0x71, 0x0d, 0xb4, 0x51, 0xdb, 0x83, 0x38, 0xa6, 0xf8, - 0x13, 0x93, 0x96, 0xcb, 0xba, 0x98, 0x06, 0x8c, 0x06, 0x95, 0x30, 0x5a, 0x2c, 0xe1, 0x7d, 0x1b, 0x9b, 0x12, 0x00, 0x1c, 0x1b, 0xfb, 0x24, 0x91, 0x24, 0xa3, 0xa5, 0x72, 0xe3, 0x26, 0x86, 0x6b, - 0x65, 0x13, 0x06, 0x89, 0x29, 0x6d, 0x02, 0x83, 0x6c, 0x5a, 0x4a, 0x7b, 0x69, 0x7d, 0x4c, 0x14, 0x26, 0x03, 0xdb, 0x6f, 0xbd, 0x9c, 0xb7, 0xf1, 0x90, 0x5f, 0x0b, 0xaf, 0x67, 0x3c, 0xdb, 0x67, - 0x80, 0x17, 0x1c, 0xd8, 0x03, 0x7d, 0xd8, 0xda, 0xb4, 0x34, 0x33, 0x54, 0xd3, 0x16, 0x6a, 0xa9, 0x88, 0xe5, 0x8c, 0x4e, 0x66, 0x13, 0x82, 0xc4, 0x51, 0xdd, 0xa4, 0xbf, 0x2e, 0xc4, 0x1f, 0xb0, - 0x2c, 0x7e, 0x36, 0xd9, 0xf2, 0x1a, 0x4e, 0x32, 0xab, 0xbb, 0x46, 0x3d, 0xf4, 0x54, 0x39, 0xf3, 0x1b, 0xd8, 0x33, 0x3a, 0x5e, 0x4f, 0x46, 0xd0, 0xb0, 0x12, 0x66, 0x12, 0x53, 0xa2, 0x3d, 0x3e, - 0x9b, 0x24, 0x7e, 0x8e, 0x1d, 0x95, 0xd3, 0x4e, 0x95, 0xb8, 0xa9, 0xa9, 0xb4, 0xc5, 0x4e, 0xd0, 0xd7, 0x79, 0x39, 0x2f, 0x03, 0x8d, 0x60, 0x56, 0x2d, 0xa6, 0x73, 0x94, 0x1f, 0x57, 0x31, 0x0c, - 0xb5, 0x13, 0xa8, 0xcb, 0x8c, 0x31, 0xdf, 0xe2, 0xcb, 0x65, 0x46, 0xe1, 0x82, 0xb1, 0x2e, 0x68, 0x18, 0xc8, 0x1d, 0x58, 0x69, 0x1a, 0x56, 0x68, 0x0f, 0xe4, 0xf1, 0xa8, 0xcc, 0x1e, 0x29, 0x50, - 0xdf, 0xed, 0xeb, 0x6e, 0x76, 0xd5, 0x7b, 0xae, 0x55, 0x55, 0x1f, 0x04, 0x88, 0x67, 0x96, 0x67, 0x6e, 0x6f, 0xdc, 0xa4, 0xf4, 0x2b, 0x37, 0xb8, 0x06, 0x63, 0x91, 0x0f, 0xa3, 0x53, 0xff, 0xf8, - 0xe3, 0xcf, 0x5b, 0x75, 0xff, 0xf9, 0xef, 0xb1, 0x4f, 0xc9, 0x6a, 0x3f, 0x2a, 0x72, 0xff, 0x17, 0xf4, 0x81, 0x31, 0xcf, 0xf4, 0x4e, 0x0b, 0x67, 0x74, 0x26, 0xfa, 0xeb, 0x9f, 0x3f, 0x11, 0x16, - 0x1b, 0x5a, 0x03, 0x9f, 0x36, 0x6e, 0x11, 0xa5, 0xa6, 0x73, 0x16, 0xab, 0x95, 0xfb, 0xfd, 0x24, 0x81, 0x67, 0x32, 0xdc, 0xbe, 0x80, 0x7f, 0x66, 0xa0, 0xdf, 0xaf, 0x5e, 0xa2, 0xc5, 0x03, 0x34, - 0x44, 0x8b, 0xd4, 0x0d, 0x2b, 0xf6, 0xeb, 0x63, 0x92, 0x0b, 0x29, 0x07, 0x19, 0x84, 0x20, 0xf5, 0x0c, 0x98, 0xf8, 0x9e, 0x9c, 0xb0, 0x10, 0x65, 0x6c, 0x17, 0x9b, 0xbe, 0x3f, 0x6e, 0xd7, 0xad, - 0x7b, 0xb0, 0x70, 0x81, 0x4e, 0xc7, 0x0c, 0xc3, 0x64, 0x27, 0xd4, 0xa3, 0x6b, 0x44, 0x01, 0x3d, 0x74, 0x37, 0x37, 0x99, 0xc9, 0x56, 0x3e, 0x12, 0xf2, 0x2a, 0x99, 0xab, 0x9e, 0x0e, 0xa7, 0xb3, - 0xaa, 0xca, 0xbd, 0x81, 0xc5, 0xf0, 0xef, 0xeb, 0xd9, 0x5e, 0x8a, 0x00, 0x1e, 0xa3, 0x38, 0x1b, 0x45, 0x41, 0x1c, 0xdc, 0xb3, 0x6b, 0x90, 0xa7, 0x4a, 0x66, 0x6e, 0x30, 0xc1, 0xd1, 0xcb, 0xd1, - 0xa5, 0x9b, 0xcd, 0x00, 0xa1, 0x0c, 0x82, 0x14, 0x15, 0xcf, 0xb4, 0xcd, 0xea, 0x44, 0x45, 0xa7, 0x49, 0xdf, 0x3a, 0x0c, 0x33, 0xde, 0xae, 0x78, 0x64, 0xdd, 0x69, 0x63, 0x18, 0x01, 0xdc, 0xe5, - 0x9e, 0x5c, 0x4f, 0x79, 0x64, 0x93, 0xf3, 0x31, 0x13, 0xba, 0x9c, 0x4a, 0xe7, 0x27, 0xa5, 0xd1, 0xea, 0x4d, 0xb7, 0x3d, 0xc6, 0xe8, 0x4c, 0x8d, 0xb3, 0x31, 0xbb, 0xae, 0x67, 0x9e, 0x1d, 0x32, - 0xcb, 0x9c, 0x35, 0x77, 0x73, 0x75, 0x7a, 0xb2, 0x88, 0xe7, 0x17, 0x62, 0x36, 0xaa, 0x8a, 0xee, 0x75, 0x81, 0xfd, 0xdc, 0xa5, 0xf6, 0x37, 0x66, 0x1b, 0xfe, 0x30, 0xbd, 0xfc, 0x5d, 0x01, 0xf9, - 0x3d, 0xad, 0xee, 0x29, 0xb2, 0xa6, 0xb7, 0x3a, 0xde, 0x97, 0xc3, 0xa1, 0x79, 0x01, 0x0a, 0x49, 0x1b, 0x06, 0x08, 0xb5, 0xcc, 0x89, 0x9b, 0xd7, 0x68, 0xba, 0x5f, 0x47, 0x3d, 0x75, 0xec, 0xc0, - 0xd0, 0xf2, 0x4b, 0xa1, 0xd8, 0x90, 0x1b, 0xce, 0x20, 0xa5, 0x13, 0xbb, 0x18, 0x1f, 0x56, 0x38, 0x30, 0x43, 0xe2, 0x6a, 0xa6, 0x21, 0x1e, 0x87, 0xd8, 0x62, 0x35, 0xf6, 0x61, 0x7b, 0xb1, 0x0f, - 0xe5, 0xd2, 0xea, 0x67, 0x3b, 0x72, 0x09, 0xb0, 0xa9, 0xc2, 0xb9, 0xc4, 0xbe, 0x82, 0x52, 0x8e, 0x7c, 0xa4, 0x25, 0x7f, 0x5b, 0x5f, 0x7f, 0x63, 0xfa, 0x6b, 0xbe, 0xee, 0xcf, 0x49, 0x3b, 0x24, - 0x41, 0xfd, 0x85, 0x7d, 0xbe, 0x5e, 0x58, 0xcf, 0x64, 0x1f, 0x5e, 0x20, 0x5e, 0xd0, 0x5f, 0x15, 0xdd, 0x25, 0x13, 0x77, 0x08, 0xee, 0xb1, 0x44, 0x62, 0x76, 0x5b, 0x46, 0x85, 0xc6, 0xf4, 0x14, - 0xc5, 0xc1, 0x79, 0x88, 0xd6, 0x2b, 0x0f, 0x24, 0xf5, 0xbd, 0x25, 0xdb, 0x5d, 0xea, 0x6f, 0x38, 0xa7, 0x61, 0x4e, 0x4b, 0x65, 0x23, 0x1c, 0xfc, 0x59, 0x84, 0xb9, 0x24, 0xec, 0xef, 0xd2, 0x79, - 0x32, 0x16, 0xe4, 0x9e, 0xb6, 0x35, 0x53, 0x3f, 0x89, 0xc8, 0x12, 0x86, 0xb8, 0xed, 0x04, 0x40, 0x8f, 0x6b, 0xa7, 0x69, 0x52, 0xae, 0x25, 0x9c, 0x47, 0x7a, 0xf4, 0xe0, 0x95, 0xf1, 0x0d, 0xfa, - 0x3e, 0x4d, 0xe0, 0xff, 0x5a, 0xec, 0x3f, 0x93, 0xe8, 0xf6, 0x01, 0xf2, 0x19, 0x9d, 0xef, 0xcf, 0x87, 0xa6, 0xbb, 0xcd, 0x65, 0x84, 0xd5, 0x94, 0x4c, 0xde, 0x51, 0x60, 0x0a, 0x30, 0x2d, 0xb5, - 0xcf, 0x2b, 0xcf, 0x30, 0x24, 0x4f, 0x50, 0x34, 0x63, 0x1f, 0x5a, 0x81, 0xc3, 0xd2, 0x21, 0x5e, 0x64, 0x11, 0xe8, 0x4f, 0xd0, 0xa6, 0x5a, 0x2c, 0xc6, 0xde, 0x3c, 0x46, 0x96, 0x5e, 0x40, 0xe4, - 0xda, 0x0e, 0xb0, 0xd3, 0xe9, 0x3c, 0x2c, 0x54, 0xce, 0x60, 0x4e, 0x2c, 0xca, 0xa7, 0x15, 0x1e, 0xda, 0xa5, 0x12, 0xf9, 0xc0, 0xf3, 0xce, 0x80, 0xb3, 0x79, 0x52, 0x06, 0xd5, 0xcd, 0xee, 0x78, - 0x2e, 0x04, 0x30, 0x90, 0x2a, 0xa5, 0x7b, 0x69, 0xff, 0x74, 0x87, 0x24, 0xf8, 0x73, 0x9c, 0xfd, 0x0a, 0xf6, 0x4a, 0x8f, 0xdb, 0xc9, 0x08, 0x1f, 0xc6, 0xe3, 0x66, 0x37, 0xe1, 0x9a, 0x18, 0xcc, - 0xfc, 0xc9, 0xfc, 0x24, 0x86, 0x7b, 0x65, 0x33, 0x59, 0x53, 0x48, 0x30, 0x6d, 0xed, 0x8a, 0x02, 0xd9, 0x34, 0xd9, 0xb0, 0x87, 0xc9, 0xe6, 0xa4, 0x9d, 0xa6, 0x64, 0xe3, 0x12, 0xc7, 0xc5, 0xe1, - 0x50, 0xce, 0x22, 0xcc, 0x33, 0x76, 0xf2, 0x58, 0x52, 0x84, 0x83, 0x9c, 0x72, 0x41, 0xbd, 0x03, 0x53, 0xc7, 0x9f, 0x15, 0xf3, 0x5e, 0xd6, 0x8d, 0xd6, 0x0a, 0xbc, 0x09, 0xa5, 0x3c, 0x4f, 0x8c, - 0xff, 0x69, 0x99, 0x96, 0x1b, 0x81, 0x97, 0x2a, 0x79, 0xaf, 0x30, 0xaf, 0xe9, 0xce, 0xff, 0x22, 0x3f, 0xdb, 0x8c, 0xd7, 0x0a, 0xdb, 0x4b, 0x5b, 0xfd, 0x3f, 0x2f, 0x33, 0xe3, 0x3f, 0x68, 0x62, - 0x8f, 0x3a, 0xd5, 0x9d, 0x45, 0xd7, 0xa7, 0x31, 0xf3, 0x5f, 0x35, 0xa4, 0xb9, 0x9a, 0x90, 0x5f, 0x6c, 0x45, 0x83, 0x25, 0xdc, 0x7f, 0xf8, 0xe6, 0x65, 0x56, 0xfe, 0xd9, 0xaa, 0x2b, 0xef, 0xce, - 0x60, 0x7e, 0xae, 0xd3, 0xe4, 0x3b, 0xb8, 0x17, 0x26, 0x7b, 0x3d, 0x1b, 0xda, 0x6d, 0xd2, 0x0c, 0x69, 0xb9, 0xc3, 0x65, 0xf2, 0xb8, 0xb7, 0x10, 0xad, 0xb5, 0xdd, 0x0e, 0x9f, 0x65, 0xcd, 0x01, - 0xe1, 0x52, 0xc6, 0x06, 0x8d, 0xa5, 0xcf, 0x6f, 0x78, 0x71, 0x33, 0x8e, 0x95, 0xb8, 0x3b, 0x48, 0xe5, 0xbc, 0x0d, 0x77, 0xbb, 0x0a, 0xf2, 0x0c, 0x13, 0xca, 0x8b, 0x6a, 0xdd, 0x03, 0x31, 0x51, - 0xad, 0xb6, 0xcc, 0xc2, 0x33, 0x64, 0x6a, 0x96, 0xc4, 0x63, 0x6c, 0x3d, 0xc7, 0x78, 0xad, 0x23, 0xc1, 0x47, 0xea, 0xc9, 0x60, 0x32, 0x3d, 0x40, 0x68, 0x70, 0x71, 0x03, 0xa6, 0x51, 0x7d, 0x57, - 0x2b, 0x78, 0x56, 0x98, 0x7e, 0x04, 0xfe, 0x82, 0xda, 0x77, 0x97, 0x86, 0x88, 0x54, 0x78, 0x34, 0x83, 0xea, 0x8d, 0xb9, 0x10, 0x76, 0x82, 0x04, 0x50, 0x6e, 0x89, 0x17, 0xf4, 0x36, 0x33, 0x13, - 0xbf, 0xb2, 0x75, 0xf8, 0xeb, 0x9e, 0x26, 0x43, 0x31, 0x34, 0xd8, 0xd3, 0x7f, 0xf9, 0xd9, 0xa1, 0x7b, 0x6f, 0xcb, 0x46, 0x9f, 0x72, 0x30, 0xbe, 0x00, 0x7d, 0x41, 0x4b, 0xe8, 0x76, 0x97, 0x2c, - 0xe0, 0x01, 0x3b, 0x4c, 0x7a, 0x8c, 0x5d, 0x01, 0xca, 0x1d, 0xa0, 0x83, 0x8e, 0x65, 0xcf, 0x56, 0xe9, 0x1e, 0xa3, 0x0a, 0x48, 0x72, 0x73, 0xdc, 0x69, 0xd7, 0x6c, 0xb8, 0x8c, 0x26, 0x62, 0x4d, - 0xc8, 0xb8, 0x87, 0xc1, 0x91, 0x17, 0x96, 0xad, 0x5e, 0x73, 0xd5, 0xbe, 0xf0, 0x0f, 0xe9, 0x36, 0xe3, 0x93, 0x6e, 0x69, 0x2f, 0x62, 0x04, 0x53, 0xfd, 0xfc, 0x04, 0xe0, 0xdb, 0x3c, 0x46, 0x96, - 0xc9, 0xa6, 0xe5, 0x7d, 0x96, 0xf8, 0x8b, 0x1b, 0xf7, 0x60, 0x76, 0x7b, 0x69, 0xf9, 0x79, 0x8f, 0xd1, 0x7e, 0x9e, 0xdc, 0xf6, 0x06, 0xf6, 0x05, 0x97, 0x57, 0xe1, 0x08, 0x0f, 0x9b, 0x46, 0xc0, - 0x4f, 0x57, 0xbd, 0xb4, 0x63, 0x59, 0x56, 0x52, 0x80, 0x0e, 0xa3, 0x7a, 0x1a, 0x65, 0x20, 0xd6, 0x81, 0x3a, 0xdd, 0xa2, 0x32, 0x66, 0xdc, 0xcd, 0xb5, 0x14, 0x0c, 0xf1, 0xfd, 0xde, 0xd9, 0x1f, - 0xb2, 0x3d, 0x02, 0x22, 0x6c, 0x29, 0x96, 0x61, 0xb9, 0x2a, 0x72, 0x32, 0x12, 0x17, 0xa7, 0xa2, 0x2b, 0x76, 0x62, 0x02, 0xbb, 0xc7, 0x39, 0x91, 0x32, 0x19, 0x65, 0xfa, 0x8d, 0xb8, 0x94, 0xa7, - 0x54, 0xf9, 0xe3, 0x0e, 0x05, 0x97, 0xdf, 0x7d, 0x4b, 0xee, 0xf9, 0x9b, 0x25, 0xdb, 0x19, 0xea, 0x0b, 0x66, 0x2e, 0x56, 0xfc, 0x40, 0xa9, 0x76, 0x98, 0x72, 0x16, 0x65, 0x1a, 0xeb, 0xa9, 0x3b, - 0x05, 0x2b, 0x43, 0x2b, 0x69, 0x89, 0x00, 0x72, 0x68, 0x45, 0xaf, 0xdb, 0xd0, 0x89, 0x88, 0xd3, 0x7a, 0x47, 0x6d, 0x8f, 0xc9, 0x5c, 0x42, 0xf3, 0xd5, 0x6e, 0x05, 0x11, 0x96, 0xb3, 0x3e, 0x84, - 0xd6, 0x38, 0xe2, 0x55, 0x6a, 0xe9, 0x78, 0x62, 0xb9, 0x2c, 0x67, 0x3d, 0x32, 0xd6, 0xe0, 0x42, 0xd8, 0x6d, 0x51, 0xbd, 0x16, 0xd8, 0x88, 0xea, 0x25, 0xa6, 0xf9, 0x8f, 0x90, 0x6a, 0x03, 0x8a, - 0xde, 0x7e, 0xee, 0xba, 0xbe, 0x5f, 0xf4, 0x36, 0xc0, 0x65, 0x9d, 0x43, 0x6b, 0x90, 0x76, 0x8d, 0x45, 0x1f, 0x17, 0x10, 0x53, 0x47, 0x7a, 0x27, 0xb5, 0x82, 0x67, 0x1c, 0xab, 0xd6, 0x00, 0x95, - 0xb1, 0x11, 0x59, 0x02, 0xca, 0xa1, 0x13, 0xb6, 0xd8, 0x15, 0x21, 0x0e, 0x6d, 0x11, 0x66, 0xb3, 0x5f, 0x92, 0xe3, 0xce, 0x85, 0xd8, 0xc6, 0x0d, 0x67, 0x7b, 0x74, 0x29, 0xc1, 0x42, 0x85, 0x4c, - 0x17, 0x35, 0x54, 0xb8, 0xc0, 0x0e, 0x31, 0x16, 0xcb, 0x6c, 0x1d, 0xd6, 0xda, 0x23, 0x35, 0xe4, 0x11, 0x2a, 0xff, 0xc9, 0xa2, 0xb7, 0x2c, 0x48, 0xee, 0x0d, 0xa0, 0xa3, 0x9e, 0x1b, 0xf6, 0x7b, - 0x86, 0x78, 0x21, 0x4d, 0x92, 0x8e, 0xa8, 0x81, 0x83, 0x7d, 0x0d, 0xc4, 0xe5, 0x36, 0x4d, 0x54, 0x44, 0x48, 0xb1, 0xa0, 0x32, 0xdc, 0x6d, 0x5c, 0x41, 0x4d, 0xb6, 0x8e, 0x83, 0x31, 0xc7, 0x55, - 0x48, 0x55, 0x4c, 0xc9, 0x87, 0x8b, 0xbd, 0x21, 0x73, 0xf3, 0x85, 0x84, 0x69, 0x5b, 0x1f, 0x99, 0x07, 0xb0, 0x2d, 0x6e, 0xc4, 0x12, 0x75, 0x35, 0x29, 0x37, 0x8f, 0x40, 0x12, 0x6c, 0xd0, 0xc3, - 0x11, 0x53, 0xc3, 0xb4, 0x70, 0x53, 0x53, 0x3b, 0xcc, 0x50, 0x43, 0xdb, 0x0f, 0xf4, 0xca, 0x98, 0x55, 0x1a, 0x07, 0xf6, 0xa8, 0x8c, 0xae, 0xbd, 0xc4, 0xbe, 0x88, 0x1c, 0x5c, 0x3c, 0x7a, 0x85, - 0xeb, 0xbc, 0xc4, 0xe7, 0x3e, 0xee, 0x33, 0x7f, 0xfc, 0xf1, 0xe7, 0x57, 0x5e, 0xf5, 0x2f, 0x9a, 0x33, 0x5c, 0x50, 0xf2, 0x12, 0xe9, 0x1b, 0x55, 0x85, 0x99, 0x94, 0x59, 0x5a, 0x5c, 0x60, 0x36, - 0xbf, 0xbd, 0xf4, 0xf2, 0x70, 0x59, 0x39, 0xa3, 0xd2, 0x2d, 0x82, 0x4b, 0x44, 0xff, 0xa6, 0x53, 0x12, 0xbf, 0x3d, 0x39, 0xa4, 0x8f, 0x62, 0x5e, 0x07, 0x76, 0x38, 0xf2, 0xd2, 0x22, 0x36, 0xab, - 0x51, 0x9d, 0xb8, 0xa5, 0x6d, 0x66, 0x57, 0x52, 0x5e, 0x72, 0x2d, 0x3e, 0x78, 0x30, 0x0b, 0xd7, 0x8c, 0x2e, 0x4d, 0x26, 0x83, 0xe2, 0xfa, 0x25, 0xd0, 0xe7, 0x7e, 0x15, 0xa5, 0xe9, 0xb9, 0xbf, - 0xb5, 0x9e, 0xfd, 0xf3, 0x45, 0xe3, 0xfd, 0x98, 0x3f, 0x9a, 0x26, 0x81, 0x3d, 0xb2, 0xd2, 0x34, 0x7e, 0xc5, 0xdd, 0xc7, 0x7c, 0x50, 0xff, 0xd2, 0x62, 0xa2, 0xac, 0x0a, 0xd7, 0x8c, 0xff, 0xfc, - 0xc6, 0x95, 0xf3, 0x5b, 0x9a, 0xcf, 0x8d, 0x75, 0xcf, 0x37, 0x86, 0x75, 0x96, 0xbe, 0x8f, 0xff, 0x7b, 0x7b, 0xe0, 0x73, 0xdc, 0xff, 0xc5, 0x3b, 0x5e, 0x16, 0xc4, 0xef, 0x77, 0x2e, 0xbb, 0xe3, - 0x80, 0x25, 0x62, 0x93, 0x4d, 0x8a, 0x8b, 0x99, 0x86, 0xb5, 0xcb, 0x0d, 0x86, 0xf8, 0xea, 0xce, 0xde, 0xe2, 0x0a, 0x5b, 0xf2, 0x94, 0x11, 0x1d, 0x4b, 0xd5, 0x1b, 0x1f, 0xf3, 0x1d, 0xe8, 0x22, - 0xe5, 0xec, 0x14, 0xcf, 0xd8, 0x99, 0x11, 0xe4, 0xb0, 0xce, 0xab, 0x19, 0xce, 0xee, 0xf9, 0xaa, 0x9e, 0x2e, 0x08, 0x89, 0x5d, 0xe4, 0xb4, 0x06, 0xbb, 0x07, 0x2d, 0x57, 0xac, 0x84, 0x57, 0x25, - 0x7c, 0x56, 0x1b, 0xb1, 0x38, 0xb0, 0x71, 0xd2, 0x99, 0x42, 0x2f, 0xb4, 0x7e, 0xa1, 0x12, 0xf6, 0x5b, 0xa7, 0xce, 0x2c, 0x0a, 0x2a, 0xe4, 0xdd, 0xbd, 0x81, 0x04, 0xf9, 0x9d, 0xc7, 0xbf, 0xa2, - 0x06, 0xf1, 0x9c, 0xd1, 0xfa, 0xc5, 0x0b, 0x5e, 0x48, 0xf1, 0xe9, 0xf2, 0x88, 0x18, 0x66, 0xc8, 0x2e, 0xb5, 0xc3, 0xa6, 0x57, 0x79, 0x4a, 0x87, 0x5b, 0x6c, 0xbc, 0xd4, 0xb6, 0x2d, 0x5b, 0x28, - 0x87, 0x6a, 0x47, 0x49, 0x9d, 0x38, 0x17, 0xc5, 0x80, 0x80, 0xea, 0xbc, 0x81, 0x52, 0xae, 0xde, 0x80, 0x9e, 0xc8, 0x50, 0x82, 0x9d, 0x82, 0xa2, 0xbb, 0x24, 0xa2, 0x71, 0x6d, 0x63, 0x4e, 0x27, - 0x51, 0xeb, 0xb5, 0xe7, 0xcc, 0xda, 0x6e, 0x91, 0x6f, 0xd7, 0xf6, 0x78, 0xc9, 0x90, 0xc9, 0x34, 0xc8, 0xd9, 0x9c, 0xf9, 0x36, 0x2c, 0x95, 0x45, 0xf5, 0xbd, 0x68, 0xcc, 0x93, 0xda, 0x48, 0x54, - 0x17, 0x67, 0x34, 0x44, 0x75, 0x31, 0x54, 0x07, 0xc1, 0xd4, 0xb9, 0xdb, 0x16, 0xfb, 0x43, 0x3e, 0x9d, 0xb5, 0x74, 0xb3, 0x23, 0x7a, 0x61, 0x07, 0x30, 0xd3, 0x58, 0x62, 0x54, 0xc6, 0x5b, 0x49, - 0x5c, 0x35, 0x6f, 0x2c, 0x70, 0xe7, 0x64, 0x32, 0x73, 0x42, 0x70, 0x1d, 0xf7, 0xd0, 0x93, 0xee, 0xcc, 0x9d, 0x4e, 0x64, 0x77, 0xb3, 0x36, 0x8c, 0xa8, 0x45, 0x04, 0x56, 0x11, 0x09, 0x9c, 0x2c, - 0x77, 0x91, 0x6f, 0xd8, 0x35, 0x30, 0xc5, 0xc1, 0x6d, 0x50, 0xfc, 0x95, 0x89, 0xad, 0x45, 0xe1, 0x1e, 0xea, 0xc8, 0x2c, 0x46, 0xe7, 0x8f, 0x30, 0xa3, 0x17, 0xa7, 0xca, 0x33, 0x9e, 0xc2, 0x7f, - 0xb0, 0xc9, 0xc8, 0x87, 0x58, 0xcf, 0xd7, 0x42, 0x08, 0x79, 0xc6, 0xa4, 0x79, 0x05, 0x7b, 0xa6, 0xf2, 0xeb, 0xc9, 0x25, 0x46, 0x32, 0xc0, 0xac, 0x69, 0x42, 0x7b, 0x2a, 0x15, 0x8a, 0x91, 0xc2, - 0xb2, 0xc1, 0x5b, 0x09, 0xae, 0xf0, 0x73, 0x29, 0x3b, 0x80, 0x5a, 0xbc, 0x94, 0x09, 0x3c, 0x4f, 0x35, 0xcd, 0xb7, 0xe7, 0x9c, 0x07, 0x5a, 0xb8, 0x9b, 0x45, 0x61, 0x68, 0x16, 0x3a, 0x14, 0xd3, - 0x3d, 0x95, 0x65, 0x13, 0xb3, 0xc2, 0xe2, 0x48, 0xcc, 0xd5, 0x52, 0xcb, 0x3a, 0xa1, 0xde, 0x1f, 0x44, 0x74, 0xa7, 0x74, 0xc5, 0x7e, 0xb1, 0xe9, 0x75, 0xfc, 0x11, 0xad, 0xff, 0xae, 0x88, 0x54, - 0x56, 0xb8, 0x55, 0x15, 0xdc, 0xcd, 0xfb, 0x7e, 0x32, 0x5e, 0x72, 0x03, 0x7a, 0x45, 0xe7, 0xe5, 0x70, 0x68, 0xc4, 0x24, 0xd4, 0x2b, 0x11, 0x2b, 0x21, 0xbe, 0x07, 0xa7, 0x1a, 0xb8, 0x5c, 0xd1, - 0xb2, 0xa3, 0xf9, 0x8c, 0x47, 0x82, 0x42, 0x2c, 0x69, 0xb2, 0x1e, 0xce, 0x0a, 0xb0, 0x00, 0xb5, 0x50, 0x41, 0x9b, 0x6e, 0x09, 0x40, 0x0d, 0x65, 0xc6, 0xdb, 0xe9, 0x29, 0x30, 0xe5, 0x0d, 0xdf, - 0x97, 0x94, 0x30, 0x8e, 0xba, 0xca, 0xe3, 0x35, 0x1d, 0x24, 0x6b, 0x59, 0x5d, 0x2f, 0x35, 0x82, 0x24, 0x3b, 0x9e, 0x8b, 0xb0, 0x47, 0xca, 0xfb, 0xef, 0x7b, 0xe5, 0x1b, 0x56, 0xce, 0x37, 0x47, - 0x2f, 0xe7, 0x3f, 0x4f, 0x8d, 0x3d, 0xaf, 0x97, 0x5f, 0x30, 0xfa, 0x23, 0x5a, 0x8c, 0xa2, 0x33, 0x66, 0x8a, 0x91, 0xef, 0x46, 0xd9, 0x7d, 0x11, 0xff, 0xe4, 0x86, 0xfb, 0xf5, 0x3b, 0xde, 0x53, - 0xea, 0xe3, 0x9d, 0xa1, 0x1b, 0xee, 0xdc, 0xe2, 0x10, 0x5b, 0xa2, 0x93, 0xc2, 0xdc, 0x6c, 0xd4, 0x19, 0x2d, 0x20, 0x7a, 0xab, 0xb6, 0xb9, 0xd7, 0x47, 0xcc, 0x2c, 0x5a, 0x0b, 0xfb, 0x7d, 0x04, - 0x6c, 0x7c, 0x16, 0xdc, 0x01, 0x0b, 0xca, 0xa4, 0x6b, 0x21, 0x02, 0x53, 0x35, 0x1f, 0xc3, 0x2d, 0xc2, 0xf2, 0x38, 0xb6, 0xf2, 0x21, 0x31, 0xea, 0x94, 0x8d, 0x43, 0x29, 0x9e, 0xb6, 0x5f, 0xa1, - 0x76, 0xba, 0xdb, 0x60, 0x5b, 0x45, 0x94, 0x1e, 0x36, 0x8c, 0xb9, 0x2f, 0xf1, 0x2e, 0x4a, 0xa8, 0x13, 0x78, 0xd7, 0x6a, 0xc7, 0x6b, 0xf3, 0x9c, 0x9f, 0x52, 0x8e, 0x18, 0xba, 0x2f, 0x5f, 0x35, - 0xca, 0x3b, 0x74, 0x82, 0xce, 0x4a, 0xfd, 0x13, 0x99, 0xe4, 0x37, 0xa8, 0x17, 0xca, 0x5c, 0x35, 0xd6, 0x1b, 0xa4, 0xc7, 0xb4, 0xb0, 0x9d, 0xb9, 0xeb, 0x81, 0x4e, 0xa1, 0xcd, 0xd2, 0xce, 0x99, - 0xc2, 0xab, 0x72, 0xdd, 0xd7, 0x33, 0x8f, 0x82, 0x21, 0x28, 0x31, 0x22, 0x60, 0xbe, 0x05, 0x3a, 0xd3, 0xb6, 0x11, 0x8b, 0xb5, 0x5d, 0x07, 0xf7, 0x68, 0xe5, 0x18, 0x62, 0x3d, 0xa0, 0x55, 0x33, - 0x75, 0x3b, 0xae, 0x69, 0xc9, 0x17, 0x03, 0xfa, 0x08, 0x1e, 0xbd, 0x78, 0x2c, 0xd5, 0x50, 0xbc, 0x66, 0xf7, 0x58, 0xbb, 0x74, 0x98, 0xd9, 0xc7, 0xc9, 0xef, 0x8f, 0xc5, 0x0f, 0xf1, 0x13, 0xd4, - 0xbd, 0x53, 0xc6, 0xef, 0x59, 0xbe, 0x4f, 0x23, 0xf0, 0x05, 0xf6, 0x3b, 0x44, 0xde, 0xae, 0x0c, 0x0d, 0x38, 0x81, 0xb0, 0x66, 0x50, 0xc0, 0x4e, 0x3e, 0x2a, 0x84, 0xd9, 0x68, 0xe2, 0x61, 0xe1, - 0xb2, 0x92, 0x43, 0x6e, 0xa6, 0x72, 0x3c, 0x93, 0xe1, 0x31, 0x1e, 0x4f, 0x60, 0x57, 0xd1, 0xcb, 0x49, 0x8c, 0x6f, 0xcd, 0x22, 0x12, 0xe2, 0x13, 0xd8, 0x4e, 0x4a, 0x13, 0x9f, 0xb3, 0xe6, 0x69, - 0x1e, 0x43, 0xf8, 0x58, 0x54, 0x94, 0xaa, 0x9b, 0x83, 0xec, 0x09, 0x44, 0x4f, 0x39, 0xba, 0xad, 0x95, 0x26, 0xc7, 0xc9, 0xfc, 0xf0, 0xbd, 0x0e, 0x53, 0xa4, 0x87, 0xe2, 0x3e, 0x4f, 0x21, 0x4f, - 0xe5, 0xc7, 0xbf, 0x00, 0xbd, 0x62, 0xe2, 0x72, 0x78, 0x29, 0x21, 0x1c, 0x90, 0x07, 0x40, 0x4a, 0xc1, 0xa2, 0xe2, 0xa3, 0x08, 0xe7, 0x9d, 0x84, 0x5b, 0xae, 0x5b, 0x18, 0x82, 0x96, 0x00, 0x75, - 0x5a, 0xe9, 0x0a, 0x7e, 0xd0, 0x10, 0xb9, 0xd5, 0xf6, 0xe1, 0x96, 0x08, 0x56, 0x8d, 0x09, 0x59, 0x7a, 0x50, 0x19, 0x9c, 0x09, 0xea, 0xeb, 0x62, 0x63, 0x39, 0xf1, 0x01, 0x2d, 0x10, 0x3d, 0x31, - 0x03, 0xa7, 0xa7, 0xe5, 0x3a, 0x76, 0xa0, 0x9d, 0x64, 0xae, 0x0b, 0x23, 0x9a, 0xd1, 0x3b, 0xba, 0x7c, 0x14, 0xef, 0x7c, 0xe8, 0x07, 0xc5, 0x86, 0xf2, 0x58, 0x3c, 0xb2, 0xa3, 0xe0, 0x9b, 0xf6, - 0x12, 0xd8, 0x73, 0xae, 0xd0, 0x37, 0xc0, 0x57, 0x94, 0xbe, 0x9c, 0x8d, 0xae, 0x00, 0x1f, 0xa3, 0xd5, 0x9f, 0xa9, 0x28, 0x92, 0x93, 0xaa, 0x21, 0xe3, 0xb4, 0xb5, 0x5b, 0xc9, 0x73, 0xb5, 0x8a, - 0xd1, 0x25, 0x22, 0x15, 0x2b, 0xf4, 0xa0, 0x35, 0xe9, 0x24, 0x0c, 0x22, 0x9d, 0x2e, 0x67, 0x30, 0x81, 0x87, 0x25, 0x9c, 0x7b, 0x91, 0x5f, 0x1f, 0x76, 0x13, 0x97, 0x03, 0x36, 0xf0, 0xea, 0xb8, - 0xda, 0x2f, 0x9a, 0xae, 0x42, 0x53, 0x3c, 0x3c, 0x12, 0x14, 0x90, 0xa3, 0x96, 0xed, 0xa7, 0x45, 0x7c, 0x4c, 0xfa, 0x81, 0xfd, 0x71, 0x2b, 0x27, 0x38, 0xbc, 0x6b, 0x24, 0xf8, 0x44, 0x52, 0xde, - 0xa0, 0x6c, 0xfe, 0xac, 0x48, 0x4f, 0xdd, 0xc8, 0x74, 0x9c, 0xfb, 0x2a, 0xc6, 0x53, 0xce, 0xd3, 0x57, 0xb0, 0x57, 0xd4, 0xdf, 0x4e, 0x2e, 0xfc, 0x3c, 0xc0, 0x79, 0x1a, 0x45, 0x72, 0xb9, 0xe6, - 0x37, 0xea, 0x54, 0x95, 0xb6, 0x18, 0x76, 0x74, 0x0a, 0x15, 0x14, 0x51, 0x32, 0x8f, 0x92, 0xc0, 0x0b, 0xaa, 0xa9, 0x04, 0x18, 0x6d, 0x11, 0xc7, 0x86, 0x9d, 0x6e, 0xb8, 0x8e, 0xe7, 0x9a, 0xca, - 0x38, 0x65, 0xdd, 0x0e, 0x4a, 0x10, 0xd0, 0x9a, 0x82, 0x02, 0x56, 0x8d, 0x19, 0xc6, 0x00, 0x0f, 0x2b, 0xd6, 0x31, 0x54, 0x92, 0x5b, 0x17, 0x66, 0xca, 0xc1, 0x80, 0xbe, 0xff, 0xdc, 0xdb, 0xe3, - 0xee, 0xd6, 0x94, 0x16, 0xad, 0x59, 0x38, 0xd7, 0x4f, 0xfc, 0xcd, 0x57, 0x10, 0x64, 0xe7, 0xef, 0x38, 0x2b, 0x1a, 0x97, 0x3d, 0x9e, 0x7e, 0x82, 0x2e, 0x7f, 0x5c, 0x2a, 0x97, 0x06, 0x90, 0xe6, - 0x43, 0xa1, 0xeb, 0xd7, 0x3a, 0xc6, 0xfb, 0xd2, 0xd7, 0xc1, 0xb4, 0x79, 0x83, 0x7b, 0x26, 0xce, 0xdb, 0xd9, 0x25, 0x07, 0x99, 0x7a, 0x4c, 0x1d, 0x92, 0x9c, 0x1a, 0xed, 0x49, 0x8e, 0x4f, 0x5c, - 0x52, 0xa3, 0xa6, 0x82, 0x63, 0x88, 0x0a, 0xe8, 0xd4, 0xac, 0xcb, 0x84, 0xde, 0xf2, 0x56, 0xc0, 0x04, 0xd7, 0xe5, 0x69, 0x88, 0xd6, 0xda, 0x51, 0x3b, 0x25, 0x04, 0x8c, 0xc3, 0xe6, 0x72, 0x3d, - 0xaf, 0x7c, 0x6d, 0xaf, 0xe8, 0xdb, 0x7c, 0x0b, 0xb3, 0x78, 0xba, 0x6a, 0x0e, 0x40, 0x74, 0x34, 0x4d, 0x44, 0x5c, 0x05, 0xc0, 0xce, 0x6b, 0x26, 0xa2, 0x4c, 0xfd, 0xdc, 0xb5, 0x5d, 0x27, 0x9d, - 0x7d, 0x45, 0xea, 0xd7, 0x7c, 0xfb, 0x94, 0xcc, 0xb8, 0x01, 0x3d, 0x23, 0xe6, 0x76, 0x78, 0xc9, 0xf0, 0x1c, 0x20, 0x2c, 0x74, 0xa5, 0x54, 0x8e, 0x8e, 0x07, 0x1c, 0xf1, 0x38, 0x02, 0x3a, 0x90, - 0x98, 0x73, 0x0b, 0xc9, 0xb0, 0x8a, 0x19, 0x48, 0x65, 0xc8, 0xfe, 0x60, 0x42, 0x2b, 0xa9, 0x72, 0xf2, 0xed, 0x72, 0x8f, 0xe8, 0x2e, 0x9e, 0xfa, 0x2b, 0x69, 0x4a, 0x97, 0xe6, 0x74, 0xb5, 0xe2, - 0xa5, 0x26, 0xa3, 0x01, 0x61, 0x33, 0xce, 0x8a, 0x5d, 0xe3, 0x36, 0x8e, 0x6e, 0x74, 0x56, 0x72, 0x44, 0xec, 0x86, 0x12, 0x59, 0x07, 0xfa, 0xc9, 0xae, 0x3e, 0x24, 0x9c, 0x9e, 0xdf, 0xf7, 0x48, - 0xc0, 0xcf, 0xe0, 0x2b, 0x3f, 0xef, 0x56, 0x79, 0x39, 0xba, 0xfe, 0xf9, 0x63, 0x24, 0x41, 0x6d, 0x59, 0xf4, 0x87, 0x6d, 0x0f, 0x86, 0xcc, 0x6e, 0xe9, 0xd6, 0xa7, 0xcd, 0x31, 0xc9, 0xe6, 0x13, - 0x9c, 0x28, 0xfa, 0x7d, 0x55, 0x10, 0xab, 0x2d, 0x88, 0x8c, 0x5b, 0xb6, 0x59, 0x9b, 0x92, 0x3f, 0x5b, 0xa6, 0x7b, 0x13, 0x36, 0xe7, 0x22, 0xc5, 0x5b, 0x7d, 0xad, 0xc2, 0x0a, 0x54, 0xab, 0x7b, - 0x39, 0xe4, 0x33, 0x6d, 0xbc, 0x15, 0x8f, 0x50, 0x04, 0x4e, 0x78, 0x66, 0x35, 0x26, 0xb0, 0x15, 0x91, 0xc8, 0xc3, 0x16, 0x76, 0x19, 0x38, 0xee, 0xc8, 0xf6, 0xcd, 0x24, 0x71, 0x2f, 0x96, 0xef, - 0xc5, 0x35, 0xfa, 0x45, 0xda, 0xf2, 0xc3, 0x7d, 0xed, 0x6f, 0x74, 0x70, 0x0f, 0x4e, 0x75, 0xce, 0x6b, 0xb7, 0x76, 0x47, 0x97, 0x86, 0x7c, 0x95, 0x59, 0x86, 0xdf, 0x18, 0xd8, 0x3f, 0x57, 0x3c, - 0x3e, 0xc1, 0x3e, 0x53, 0xf4, 0xe3, 0x95, 0xa1, 0xe9, 0x88, 0x42, 0x6d, 0x0a, 0x1b, 0x93, 0xf0, 0x22, 0x6e, 0x8b, 0xaf, 0xcc, 0xcd, 0x5e, 0xee, 0x57, 0x69, 0x08, 0x61, 0xab, 0x7e, 0xcb, 0xc3, - 0x13, 0x86, 0x30, 0xe7, 0x7e, 0x83, 0x17, 0x1e, 0xaf, 0xa1, 0xd2, 0x21, 0x67, 0x80, 0x35, 0x32, 0xf1, 0x33, 0x43, 0x4e, 0x98, 0x09, 0xe5, 0x53, 0x01, 0x66, 0xcc, 0xc2, 0xf1, 0x86, 0xd2, 0x71, - 0x25, 0x0f, 0xa7, 0xe3, 0x05, 0x43, 0x16, 0x98, 0xef, 0x1e, 0x51, 0x8e, 0x7e, 0xa4, 0x86, 0xbc, 0xa1, 0xfe, 0x7f, 0xbd, 0xa2, 0xfe, 0x8d, 0x08, 0xef, 0x6a, 0xdb, 0xaf, 0xf8, 0x7f, 0x27, 0xcc, - 0x87, 0x91, 0xc8, 0x73, 0x8b, 0xb4, 0x7c, 0xb5, 0x2b, 0xdf, 0x11, 0xfd, 0xce, 0x6b, 0x32, 0xb3, 0x2a, 0xdc, 0x34, 0xf9, 0xf6, 0x3d, 0x6d, 0xdb, 0xfe, 0xba, 0x3d, 0x77, 0x79, 0xd9, 0x4f, 0xdf, - 0x61, 0xa7, 0x49, 0x59, 0x47, 0xd5, 0xf9, 0xb3, 0xbf, 0x7b, 0xcd, 0x15, 0xec, 0x85, 0xc6, 0xb7, 0xb2, 0xe3, 0x77, 0xaf, 0xb8, 0x1d, 0xfd, 0xef, 0xef, 0x78, 0xee, 0x8e, 0x97, 0xfd, 0x2b, 0xd6, - 0x7b, 0xae, 0x6b, 0xe7, 0xd7, 0xaf, 0xb8, 0x70, 0xe0, 0x57, 0x37, 0x86, 0x76, 0xf3, 0xac, 0xf6, 0x13, 0x58, 0x86, 0xfd, 0x43, 0xa7, 0xd4, 0x8b, 0x43, 0x94, 0xee, 0xc0, 0xbd, 0x5e, 0x22, 0x2d, - 0x8c, 0xd7, 0x89, 0xb4, 0xf3, 0xa9, 0xdc, 0xab, 0xc1, 0x7c, 0xb2, 0xf5, 0xfc, 0xed, 0xde, 0x8c, 0xcd, 0x96, 0xf4, 0x3a, 0xbf, 0x8e, 0x39, 0x13, 0xe9, 0xe6, 0x99, 0xb3, 0x49, 0x29, 0xb2, 0xd9, - 0xa3, 0x48, 0xb1, 0xb4, 0xa3, 0x23, 0x80, 0x79, 0xda, 0x5e, 0xd6, 0xd5, 0x75, 0x49, 0xb3, 0x8b, 0xe6, 0x7b, 0x93, 0xe0, 0xfa, 0x83, 0xa3, 0xa2, 0xfe, 0x06, 0x3f, 0x4f, 0xc8, 0xd7, 0x17, 0xa8, - 0xaf, 0x28, 0x89, 0x8a, 0xfa, 0x82, 0x85, 0x01, 0xc2, 0x96, 0x51, 0xfc, 0x49, 0x16, 0x93, 0x90, 0xd7, 0x3b, 0x76, 0x23, 0xc8, 0x9e, 0x94, 0x76, 0x18, 0xbd, 0x34, 0xcd, 0x84, 0x0b, 0xb7, 0x91, - 0xa2, 0xcd, 0x90, 0xd5, 0xba, 0xcf, 0x7d, 0x7b, 0x65, 0xf9, 0x9b, 0x99, 0x62, 0x34, 0x64, 0x22, 0x6d, 0x1b, 0x63, 0xe5, 0xd8, 0x7b, 0x12, 0x85, 0xe0, 0xa5, 0x14, 0x37, 0x1a, 0x00, 0x66, 0x90, - 0x72, 0x58, 0x6a, 0x89, 0x3c, 0xe5, 0x57, 0xa7, 0xc0, 0x2b, 0x65, 0xf2, 0x2f, 0x7a, 0xbe, 0x86, 0x44, 0x5a, 0x5f, 0xba, 0x74, 0xdf, 0xc1, 0xe4, 0x73, 0x19, 0x5f, 0x2f, 0x40, 0xc1, 0xd1, 0xeb, - 0xe1, 0xd0, 0x6c, 0x2f, 0xf5, 0x40, 0xd0, 0xb1, 0x20, 0x66, 0x5e, 0xc3, 0x4d, 0x19, 0x1b, 0x91, 0xa9, 0xa9, 0x92, 0xad, 0x8f, 0xc7, 0xde, 0xa9, 0x8a, 0xa4, 0xa1, 0x17, 0xf6, 0x66, 0xad, 0x03, - 0xd8, 0xae, 0x34, 0x4e, 0x53, 0xd8, 0x34, 0x08, 0xa3, 0x2f, 0x96, 0x2c, 0x59, 0x44, 0xbd, 0x3e, 0xae, 0xb4, 0x6d, 0xe7, 0xab, 0xfc, 0x66, 0xcd, 0x1d, 0x20, 0x92, 0x60, 0x34, 0x42, 0x53, 0xf0, - 0xc0, 0xc8, 0xa6, 0xd0, 0x2a, 0x78, 0xd8, 0xb2, 0xf8, 0x61, 0x1f, 0xf7, 0x6f, 0xfa, 0x9e, 0x23, 0x9f, 0xb3, 0xe8, 0xbf, 0x7d, 0xf6, 0xf3, 0x20, 0xb3, 0xf7, 0x19, 0x77, 0x7f, 0xfe, 0x0b, 0x7f, - 0xd4, 0xe3, 0x9c, 0x78, 0xc2, 0x49, 0xfd, 0x13, 0x2e, 0xb8, 0xf6, 0x6a, 0xff, 0x8a, 0x11, 0xc8, 0xa7, 0x96, 0xd4, 0x3b, 0xb8, 0xef, 0x79, 0xa1, 0xce, 0x46, 0xe4, 0xb0, 0x65, 0xd5, 0x73, 0xd0, - 0x76, 0x4c, 0xea, 0x0e, 0xb1, 0xca, 0x26, 0x7c, 0x1c, 0xf1, 0x71, 0xed, 0xe5, 0x5d, 0x38, 0x67, 0x01, 0x70, 0x1b, 0x89, 0xae, 0x34, 0x25, 0x72, 0x6e, 0x12, 0x09, 0x1a, 0xe9, 0x2f, 0xa6, 0xdc, - 0xcc, 0x07, 0x57, 0x24, 0x48, 0x1e, 0x26, 0xda, 0x5c, 0x21, 0x8f, 0x29, 0x2b, 0xb3, 0x1a, 0x6c, 0x71, 0x39, 0x6a, 0xa2, 0x9d, 0x6a, 0x6c, 0x44, 0x4b, 0x4c, 0x35, 0x7e, 0x26, 0x63, 0xa9, 0xff, - 0x3c, 0x3b, 0x78, 0x41, 0xe2, 0xbc, 0xf4, 0xb3, 0xff, 0xad, 0x39, 0xfe, 0xbb, 0xa5, 0x74, 0x26, 0x25, 0xf2, 0x3d, 0x29, 0xa9, 0x27, 0xac, 0x99, 0x7f, 0x2e, 0x6f, 0xef, 0x75, 0x45, 0x7f, 0xb8, - 0xfa, 0x7b, 0xfd, 0xfd, 0xd7, 0xd6, 0x01, 0xf5, 0xeb, 0xe7, 0x2d, 0x9e, 0x3e, 0xc1, 0x06, 0x47, 0x9f, 0xaf, 0x8c, 0x2e, 0x70, 0x1f, 0xb3, 0x50, 0x7c, 0x5a, 0x4e, 0x19, 0x8b, 0xe6, 0xcb, 0x98, - 0x98, 0xa6, 0xe2, 0x8a, 0x3c, 0x2d, 0x00, 0x1c, 0xd0, 0xb1, 0x0e, 0xe6, 0x55, 0x10, 0x5b, 0x04, 0x38, 0xc4, 0xd3, 0x13, 0xbc, 0x5c, 0x96, 0x2d, 0x87, 0xae, 0x7a, 0x95, 0xdf, 0x60, 0x56, 0x1b, - 0xc2, 0xb3, 0xe6, 0xe8, 0x8c, 0x0f, 0xcd, 0x5e, 0xc1, 0xac, 0x7e, 0x8b, 0x55, 0xb5, 0x2a, 0x07, 0x13, 0x18, 0x9f, 0xb1, 0x88, 0x87, 0x2f, 0x2c, 0xbe, 0xd9, 0xff, 0xd8, 0x82, 0xfa, 0x1a, 0x81, - 0x3f, 0xea, 0x04, 0x81, 0x3c, 0xd5, 0x14, 0xe5, 0xa7, 0x9d, 0x20, 0x90, 0x61, 0x4d, 0x52, 0x40, 0x7c, 0xb2, 0x16, 0xd0, 0x2d, 0xa4, 0x60, 0xfa, 0xf6, 0x88, 0x4d, 0xed, 0xb9, 0xe9, 0x9e, 0x52, - 0xa0, 0x48, 0x8d, 0x8d, 0xb3, 0x99, 0x69, 0x20, 0xc4, 0x88, 0xe2, 0x56, 0x11, 0x8b, 0xe3, 0xa9, 0x9f, 0xcc, 0xe1, 0xb6, 0xd0, 0x74, 0xb6, 0x9c, 0x5b, 0x0a, 0xe7, 0x36, 0xc7, 0x68, 0xc9, 0x03, - 0xc6, 0x94, 0xc5, 0x4a, 0x23, 0x5a, 0x15, 0x38, 0x3b, 0xc5, 0xf6, 0x1a, 0xd4, 0xe5, 0x71, 0xc8, 0x01, 0xee, 0x23, 0xf5, 0xf3, 0x67, 0x9d, 0x20, 0xce, 0xb6, 0x24, 0xf6, 0x71, 0x81, 0x5e, 0x30, - 0xf6, 0xe7, 0xcd, 0x0d, 0xfe, 0x39, 0x0a, 0xfd, 0xda, 0x03, 0x02, 0xf9, 0xe3, 0xff, 0xfc, 0x9f, 0x3f, 0xd0, 0xf3, 0x3f, 0xd8, 0xf9, 0x1f, 0xfc, 0xfd, 0x53, 0x3f, 0xec, 0x06, 0xf1, 0x53, 0x86, - 0xf8, 0xff, 0x3b, 0x0f, 0x7d, 0xb2, 0x23, 0x9f, 0xeb, 0x3c, 0xf4, 0x35, 0x72, 0x1f, 0x0f, 0xcf, 0x78, 0xa6, 0x57, 0xf7, 0xbd, 0xd9, 0x19, 0x83, 0xba, 0x76, 0xe7, 0xc0, 0x7a, 0x4c, 0x25, 0x7b, - 0x05, 0xe6, 0xa6, 0x7c, 0x71, 0x28, 0xb0, 0x39, 0xde, 0xb9, 0xb1, 0x57, 0x65, 0xeb, 0x09, 0x09, 0xca, 0x7c, 0xbe, 0x4b, 0x9c, 0x71, 0xcc, 0xb2, 0x4e, 0xde, 0xc7, 0xc2, 0x11, 0x77, 0xec, 0x99, - 0x28, 0x62, 0x62, 0x4a, 0xe5, 0x51, 0x6b, 0xb0, 0xa8, 0xca, 0x6f, 0x51, 0xc0, 0x08, 0x62, 0x78, 0x46, 0x71, 0x39, 0x66, 0x8f, 0x93, 0x20, 0x14, 0xfc, 0x68, 0xb2, 0x8e, 0x1e, 0xed, 0x6f, 0x83, - 0x77, 0x99, 0xef, 0x11, 0xfc, 0x31, 0xaf, 0xe3, 0x6b, 0x3d, 0xfc, 0x99, 0x90, 0xe9, 0x27, 0xd8, 0x37, 0xc5, 0xe1, 0xdd, 0x95, 0xa1, 0x53, 0x9a, 0xd6, 0x35, 0x9b, 0x30, 0x50, 0x64, 0x6d, 0x02, - 0x72, 0xb5, 0xa1, 0xf4, 0x35, 0xa0, 0x09, 0xab, 0x48, 0x33, 0xc2, 0x05, 0xc3, 0x38, 0x31, 0x79, 0x60, 0xb7, 0x0b, 0x67, 0xc6, 0x81, 0xa0, 0x0c, 0xc6, 0x13, 0x7f, 0xde, 0x1d, 0x11, 0x33, 0x64, - 0x67, 0x95, 0xc3, 0x1b, 0x3e, 0x8a, 0x1c, 0x37, 0x4e, 0xa8, 0xcd, 0x2d, 0xa5, 0x9d, 0x68, 0x74, 0x96, 0x10, 0x07, 0x94, 0xd7, 0xa6, 0xce, 0xd4, 0x35, 0x92, 0xf1, 0x40, 0x07, 0x88, 0x69, 0xa5, - 0x45, 0x35, 0xb2, 0xd3, 0xa4, 0x2a, 0xd2, 0x28, 0x72, 0x8b, 0x3f, 0xff, 0xed, 0xab, 0x19, 0x36, 0x56, 0xed, 0x79, 0xb7, 0x7b, 0xc4, 0xe7, 0x5c, 0x2a, 0xb7, 0x71, 0x93, 0xea, 0x25, 0x3b, 0x01, - 0xfd, 0x32, 0x71, 0xeb, 0xa6, 0x4a, 0x5c, 0x83, 0x6a, 0x2f, 0x44, 0x1b, 0x46, 0xe6, 0x7f, 0xc1, 0xc8, 0x2f, 0x04, 0xf9, 0x05, 0x9d, 0x05, 0xdc, 0xbf, 0xe0, 0xcb, 0x20, 0xcf, 0xcb, 0xf1, 0xff, - 0xf8, 0xef, 0xf0, 0xd0, 0x58, 0xdf, 0x99, 0x2a, 0x4e, 0x50, 0xdc, 0xd3, 0x18, 0xd1, 0xa7, 0x56, 0xd3, 0x0b, 0xd0, 0x1b, 0xd5, 0xcf, 0x87, 0x23, 0x74, 0xd8, 0x5a, 0xf2, 0xc5, 0x0d, 0x44, 0xd1, - 0x69, 0x42, 0x29, 0x4e, 0x9d, 0x3b, 0x96, 0xdf, 0xc8, 0xb8, 0x81, 0x92, 0x0c, 0xc4, 0x6e, 0x8e, 0x65, 0xde, 0x13, 0x79, 0xa2, 0xd8, 0x9e, 0x57, 0xae, 0x55, 0x14, 0xa3, 0xf1, 0x59, 0xbd, 0x75, - 0xf2, 0x4d, 0x0c, 0x90, 0x96, 0xbf, 0x42, 0xe8, 0x55, 0xb3, 0x14, 0xcb, 0xf1, 0x94, 0x65, 0x13, 0x33, 0xc1, 0xa7, 0x52, 0x4d, 0x57, 0xe8, 0x36, 0xa5, 0x77, 0x4a, 0xb4, 0xee, 0x9f, 0xdf, 0x92, - 0x7e, 0x1f, 0x1d, 0xf1, 0x84, 0xc2, 0x37, 0x34, 0xbf, 0xfd, 0x53, 0xe2, 0xdd, 0xd7, 0xd2, 0xed, 0x49, 0x53, 0xee, 0x15, 0xf0, 0x95, 0x26, 0xaf, 0xa7, 0x23, 0x68, 0x98, 0x49, 0x87, 0x93, 0x5e, - 0x51, 0xcc, 0xd7, 0xa0, 0x38, 0xd9, 0xf2, 0x39, 0x2f, 0x32, 0x3e, 0x14, 0xfb, 0x3b, 0x86, 0xde, 0x8d, 0xd7, 0x0b, 0x07, 0xa0, 0x55, 0xd2, 0xb0, 0x90, 0xed, 0x62, 0x3d, 0x77, 0xc6, 0x6a, 0x6a, - 0xec, 0xc4, 0x6a, 0x6e, 0xad, 0xfa, 0xe3, 0xa9, 0xdc, 0xcf, 0xa7, 0x2b, 0x94, 0xa1, 0x99, 0xfd, 0x7e, 0x22, 0x61, 0x7e, 0x42, 0x74, 0xf0, 0x76, 0x67, 0x99, 0xa2, 0xd7, 0x6b, 0x55, 0x8c, 0xcf, - 0x67, 0x87, 0x1f, 0x38, 0x6b, 0xff, 0x80, 0x91, 0xa1, 0x79, 0x07, 0xaf, 0x33, 0xa9, 0xbe, 0xe6, 0xe8, 0x67, 0xd2, 0x0c, 0xae, 0x20, 0x2f, 0xb8, 0xbb, 0xb4, 0x5c, 0x1f, 0xda, 0x58, 0xa9, 0x9a, - 0x32, 0xd4, 0x81, 0xa6, 0x34, 0x17, 0xea, 0x1d, 0x68, 0xde, 0xec, 0xdc, 0xf5, 0x96, 0x36, 0x0b, 0x56, 0x4c, 0xb6, 0x2d, 0x9d, 0xaf, 0x21, 0x94, 0xa7, 0xed, 0x95, 0x6e, 0x4e, 0x8e, 0x45, 0x90, - 0xc1, 0xa2, 0x48, 0x12, 0x98, 0x32, 0x1d, 0xf3, 0x63, 0xaf, 0x18, 0x63, 0x76, 0xdb, 0x0b, 0xf3, 0xe9, 0x11, 0x17, 0x19, 0x3c, 0x48, 0xbb, 0x78, 0x42, 0xcf, 0xc3, 0xa0, 0x3f, 0x68, 0xab, 0xe9, - 0x5f, 0x49, 0x9b, 0xba, 0xf6, 0x8b, 0xbf, 0xa6, 0x6c, 0xfe, 0xf9, 0x75, 0x1a, 0x5f, 0x55, 0x04, 0xd9, 0x5b, 0xf3, 0xfa, 0x67, 0x2b, 0xd5, 0x86, 0x6d, 0x3f, 0x07, 0xf7, 0x94, 0xfd, 0xca, 0x8a, - 0xb4, 0x4a, 0xcf, 0x7b, 0xee, 0x2f, 0x2f, 0x32, 0x0f, 0xf7, 0xb3, 0x43, 0x9e, 0xdb, 0x85, 0xbe, 0x7a, 0xc5, 0x85, 0x8c, 0x5f, 0xdd, 0xb8, 0x74, 0xe0, 0x1d, 0x40, 0x56, 0x04, 0x90, 0xa1, 0x09, - 0x7e, 0xa0, 0x71, 0x58, 0x8c, 0xf6, 0xd1, 0xaa, 0x27, 0xba, 0x1a, 0x07, 0xd7, 0x28, 0xba, 0xb4, 0x4b, 0x76, 0xc3, 0x47, 0xbc, 0x57, 0x76, 0x4b, 0x93, 0x5f, 0x99, 0x73, 0x6c, 0xc6, 0x20, 0x05, - 0xd6, 0x49, 0xd4, 0xba, 0xd9, 0xad, 0x57, 0xaa, 0x2a, 0x81, 0xde, 0x6e, 0x1c, 0x6e, 0x32, 0xcb, 0xb2, 0x8c, 0x68, 0x83, 0x1f, 0xba, 0xc4, 0x62, 0x35, 0x3e, 0xc8, 0x82, 0x40, 0x0f, 0x1e, 0xa9, - 0x55, 0xff, 0x1e, 0x7d, 0x86, 0xc8, 0xff, 0xeb, 0xfa, 0x0c, 0x5d, 0x09, 0x77, 0x7f, 0xbb, 0x7a, 0x26, 0x65, 0xfd, 0x06, 0xf3, 0x95, 0x2d, 0xb2, 0x4b, 0x01, 0xd0, 0x00, 0x3e, 0x30, 0xc4, 0x65, - 0xef, 0x50, 0xdd, 0xae, 0x94, 0x65, 0x86, 0x3c, 0x52, 0xf3, 0xc9, 0x26, 0x92, 0xe6, 0x7a, 0x7b, 0xc0, 0x25, 0x2f, 0x66, 0xe0, 0xb8, 0xc8, 0xa1, 0x95, 0x84, 0x25, 0x73, 0xdf, 0xc7, 0x31, 0xde, - 0xe4, 0x04, 0xf4, 0xe4, 0x98, 0x01, 0xd8, 0x2c, 0xd4, 0x69, 0x4d, 0x62, 0x19, 0xd7, 0xee, 0x28, 0xf1, 0x54, 0xba, 0xeb, 0x0d, 0x81, 0xd7, 0x88, 0xb0, 0x8c, 0xd3, 0x52, 0xb6, 0x37, 0x53, 0xe8, - 0x11, 0x1f, 0x0c, 0x5e, 0x79, 0x7f, 0x99, 0x28, 0x71, 0x57, 0x56, 0x81, 0x6d, 0x56, 0xae, 0x39, 0x88, 0x30, 0xd7, 0xfd, 0xc4, 0x2b, 0xd2, 0xf8, 0x4d, 0xc2, 0x7c, 0x6d, 0x02, 0x43, 0x4f, 0xd4, - 0x7d, 0x7c, 0x01, 0xff, 0x42, 0xb0, 0xdf, 0xae, 0x5e, 0x42, 0xe6, 0x03, 0x6a, 0x41, 0x74, 0x0f, 0x4a, 0x34, 0x97, 0x50, 0x4a, 0xb7, 0x0f, 0x66, 0xeb, 0x1a, 0x60, 0x32, 0xda, 0x0a, 0x02, 0xd5, - 0x8a, 0xb3, 0x28, 0x27, 0x36, 0x34, 0x98, 0x01, 0x64, 0x4b, 0xee, 0x75, 0x09, 0x5c, 0x8d, 0x17, 0x7e, 0xa1, 0x4e, 0xa7, 0xaa, 0xdf, 0x9a, 0x40, 0xc3, 0x08, 0x5d, 0x6d, 0xd5, 0xb9, 0x67, 0x68, - 0xdb, 0xc6, 0x55, 0x41, 0x70, 0xba, 0xdf, 0xcd, 0xcb, 0xe9, 0x9c, 0x54, 0x38, 0x1e, 0x6c, 0xd8, 0xf6, 0x07, 0x3b, 0xda, 0xe0, 0xba, 0xb7, 0x37, 0x93, 0xf7, 0x6b, 0xc9, 0x08, 0x3f, 0xd3, 0xdb, - 0xee, 0xf6, 0xd8, 0x05, 0x87, 0x97, 0xa3, 0xd1, 0x15, 0xd0, 0x63, 0xc4, 0x05, 0x36, 0x40, 0xae, 0xf6, 0xc1, 0x8e, 0xda, 0x05, 0x48, 0xd7, 0xcb, 0xf3, 0x99, 0x26, 0x86, 0x81, 0x31, 0xc5, 0x0d, - 0xba, 0x27, 0x45, 0xc4, 0xf0, 0x63, 0x5a, 0x5f, 0x9b, 0xdb, 0x93, 0xb3, 0x62, 0x4f, 0x9c, 0x59, 0x06, 0xee, 0x6c, 0x52, 0x00, 0x9d, 0x6e, 0x80, 0x5a, 0xac, 0x97, 0x76, 0xb8, 0x08, 0xb8, 0x08, - 0x46, 0xcc, 0x02, 0xea, 0x08, 0x3d, 0xd0, 0xa7, 0x27, 0x34, 0xc6, 0x94, 0x45, 0x02, 0x3f, 0x9f, 0x19, 0xf7, 0xa1, 0x9a, 0xed, 0xff, 0x63, 0xef, 0x4f, 0x9a, 0x5b, 0xd5, 0xbe, 0x7c, 0x51, 0xb4, - 0x9f, 0x9f, 0x62, 0xc5, 0x6e, 0x3e, 0x5d, 0x2d, 0x4a, 0x01, 0x3a, 0xf1, 0xce, 0x7d, 0x29, 0x40, 0x02, 0x15, 0x94, 0x02, 0x09, 0xd1, 0xc8, 0x08, 0xea, 0x42, 0xd4, 0x35, 0x34, 0xf6, 0x67, 0x7f, - 0x61, 0xc9, 0xf6, 0xb2, 0x6c, 0xcb, 0x66, 0x69, 0xed, 0xff, 0xcd, 0xbc, 0x27, 0xfe, 0x1d, 0x9b, 0x42, 0x1a, 0x88, 0x31, 0xc7, 0x9c, 0x73, 0x94, 0xbf, 0x71, 0x8d, 0x51, 0xfe, 0x77, 0xc4, 0x1b, - 0x5f, 0xb8, 0xf8, 0x24, 0x89, 0x77, 0x2d, 0xa9, 0xc7, 0x54, 0x8f, 0x5f, 0x84, 0xdf, 0x8c, 0xd6, 0x45, 0xe2, 0x47, 0x66, 0x6f, 0x67, 0x26, 0xc0, 0x9d, 0x62, 0xad, 0xac, 0x16, 0xe7, 0xbe, 0x94, - 0x57, 0x1d, 0x91, 0x05, 0xfc, 0x1a, 0xaa, 0x98, 0x15, 0x2f, 0xad, 0x57, 0x0b, 0xa4, 0x39, 0x2f, 0x11, 0x26, 0x47, 0x97, 0xf5, 0x02, 0xb2, 0x57, 0x98, 0xc7, 0x66, 0xc0, 0xa4, 0xf1, 0xf4, 0xbc, - 0xa4, 0x98, 0x8d, 0x91, 0x35, 0x3d, 0xc1, 0x23, 0xd2, 0x04, 0x4d, 0xf1, 0x55, 0xdb, 0xe4, 0xb5, 0xb8, 0xb1, 0x12, 0x1d, 0x97, 0x4f, 0x3d, 0xfa, 0x9d, 0x1a, 0xf2, 0x8d, 0xf4, 0x8f, 0x01, 0x40, - 0x2b, 0x9c, 0xb2, 0x8e, 0xef, 0x7a, 0x52, 0xc0, 0x47, 0xd9, 0xf9, 0x44, 0xf3, 0xca, 0xc9, 0xa7, 0xa3, 0x29, 0xf8, 0x3d, 0x13, 0xa1, 0x29, 0xe1, 0x84, 0xe0, 0xc9, 0x91, 0x98, 0x3d, 0x26, 0x38, - 0x5e, 0x4e, 0x10, 0x08, 0x95, 0x73, 0x81, 0x02, 0xb2, 0x3a, 0x74, 0x7e, 0x54, 0x70, 0x2b, 0xbf, 0x48, 0x6b, 0xef, 0x62, 0x59, 0xfc, 0x0d, 0x5f, 0x00, 0x4b, 0xc7, 0x70, 0xe4, 0xbe, 0xdf, 0xe3, - 0x91, 0x6a, 0xba, 0xc2, 0xb9, 0x2a, 0xb5, 0xd5, 0xc5, 0x0e, 0x18, 0xb1, 0x6a, 0x72, 0xa0, 0x89, 0x9c, 0x8e, 0x52, 0x89, 0xcb, 0x88, 0x3e, 0x87, 0xf0, 0xa3, 0x2c, 0xf5, 0x10, 0xcb, 0x2e, 0x70, - 0xd2, 0xc0, 0x69, 0xc2, 0x6f, 0x74, 0x0f, 0x53, 0x97, 0xb3, 0x78, 0xd7, 0x9f, 0x37, 0x9d, 0x74, 0x58, 0xc2, 0x61, 0x0d, 0xae, 0x35, 0x93, 0x89, 0x0c, 0x56, 0x14, 0xa3, 0xf3, 0x69, 0x72, 0xe4, - 0xf1, 0x76, 0x25, 0x4e, 0x5a, 0x95, 0xd3, 0x62, 0x72, 0xb5, 0x00, 0x8d, 0x03, 0xd6, 0x9c, 0x6e, 0x3d, 0x4a, 0xff, 0x88, 0xdc, 0xd4, 0xe5, 0xb5, 0x22, 0xe9, 0xf3, 0x05, 0xf3, 0x91, 0xc0, 0xeb, - 0x33, 0xcd, 0x0b, 0xb7, 0x2e, 0x47, 0x97, 0x44, 0xe2, 0x11, 0xa1, 0x55, 0x75, 0x9e, 0xb0, 0x04, 0x61, 0x20, 0xae, 0x05, 0x38, 0x67, 0x6a, 0x05, 0x45, 0x20, 0xa0, 0x8a, 0xd0, 0x3a, 0x2d, 0x83, - 0x7a, 0x1d, 0xf6, 0x8a, 0x8f, 0xfb, 0x64, 0xa3, 0x1d, 0x38, 0xf6, 0xe4, 0x1d, 0x2c, 0x97, 0x69, 0x2a, 0x62, 0x8e, 0x6b, 0x5e, 0x1d, 0xc2, 0xaa, 0xb0, 0xa3, 0x9d, 0xf5, 0x8c, 0x64, 0xe0, 0x18, - 0x07, 0xea, 0xb6, 0x37, 0x76, 0x07, 0x05, 0x73, 0xcd, 0x8a, 0x6a, 0x95, 0x7e, 0xf8, 0x7e, 0x9f, 0x09, 0xd2, 0x6b, 0xca, 0xd5, 0xff, 0xfd, 0xbf, 0x3f, 0xd4, 0x96, 0x3d, 0xb2, 0x05, 0xb9, 0xb6, - 0xf5, 0xcf, 0x6a, 0xe6, 0xae, 0x6d, 0x3d, 0xf1, 0xd2, 0xb5, 0xad, 0xb1, 0x5a, 0xf7, 0x01, 0xf6, 0xd3, 0xc6, 0x1e, 0x56, 0xa6, 0x10, 0xe0, 0x38, 0x70, 0x34, 0x42, 0x63, 0xcf, 0x69, 0x67, 0x58, - 0xd8, 0xc5, 0x93, 0x8e, 0x5f, 0x3b, 0x92, 0xcd, 0x71, 0x35, 0x89, 0x07, 0x56, 0x88, 0x9b, 0x67, 0x6c, 0x08, 0xe0, 0x15, 0xc1, 0x30, 0x8b, 0x2e, 0xf0, 0xac, 0x84, 0x5e, 0x65, 0x1b, 0xd6, 0xe4, - 0x7b, 0xde, 0xf2, 0xfa, 0x0d, 0x1d, 0x88, 0x13, 0x22, 0x11, 0x8a, 0xd3, 0xcc, 0xd2, 0x99, 0xe2, 0xeb, 0xd2, 0x9b, 0x22, 0x88, 0x0b, 0xc3, 0xfd, 0xc2, 0x92, 0x7c, 0x60, 0xc6, 0x5d, 0x48, 0x3e, - 0xbd, 0xfa, 0xe5, 0xe0, 0x62, 0x49, 0x8e, 0x98, 0x77, 0x1b, 0xfd, 0xbc, 0xe1, 0xf4, 0xf3, 0x82, 0x59, 0xad, 0x44, 0x11, 0x3e, 0xe5, 0x9a, 0xae, 0x89, 0x26, 0x17, 0x71, 0xa4, 0x57, 0x76, 0xc3, - 0x92, 0x58, 0xef, 0x4a, 0x34, 0xe2, 0xd6, 0x1a, 0x00, 0xa7, 0xe0, 0x6e, 0xae, 0x92, 0xed, 0x5c, 0x00, 0x4e, 0x48, 0x8a, 0xb5, 0xab, 0x16, 0x08, 0xe6, 0xa7, 0x9d, 0x91, 0x59, 0xea, 0xe6, 0xd8, - 0xe6, 0x66, 0x80, 0x9c, 0xed, 0x6e, 0x2d, 0xda, 0x14, 0x06, 0x2b, 0xeb, 0xc7, 0xfd, 0x22, 0x5e, 0x94, 0x5e, 0xfa, 0xa8, 0xfd, 0x17, 0x7e, 0xb1, 0x32, 0x5e, 0x04, 0xe8, 0xf5, 0x9b, 0x1f, 0x7c, - 0xc0, 0xaf, 0x9c, 0x7c, 0x5f, 0xaf, 0xf7, 0xc7, 0x3b, 0x74, 0x50, 0x1a, 0x86, 0x35, 0x2a, 0xfc, 0x55, 0x5f, 0xe0, 0x3a, 0x8c, 0x28, 0xba, 0xa4, 0x33, 0x7d, 0x2e, 0xcb, 0x0f, 0xb9, 0x57, 0xde, - 0x10, 0x7e, 0x1a, 0xd8, 0x37, 0xa7, 0x97, 0x44, 0xa0, 0x11, 0xb2, 0x3d, 0x8b, 0xd0, 0x43, 0xaf, 0xcb, 0x04, 0xb6, 0xd3, 0x81, 0x88, 0xee, 0x74, 0x45, 0xc6, 0xc2, 0x7c, 0x47, 0x2c, 0x56, 0x4b, - 0x78, 0x0f, 0xae, 0x57, 0x3b, 0x4e, 0x84, 0xb1, 0x85, 0x19, 0x96, 0xbb, 0xc3, 0x82, 0xee, 0x58, 0xdb, 0x27, 0x01, 0x0b, 0x64, 0xd4, 0x92, 0x9d, 0xf4, 0xc8, 0x5c, 0x75, 0xa9, 0x00, 0xb1, 0x87, - 0x81, 0x10, 0x22, 0xa9, 0x16, 0xe3, 0xc4, 0xd8, 0x08, 0x5c, 0x4a, 0xb3, 0x12, 0xf9, 0xdd, 0xf0, 0xfe, 0x3b, 0x11, 0xe8, 0xee, 0x63, 0x46, 0x25, 0x02, 0x8d, 0x98, 0x27, 0x1f, 0xb3, 0xd0, 0xae, - 0xc8, 0x6f, 0xf0, 0x08, 0x79, 0xbd, 0x54, 0xd9, 0x5e, 0x2c, 0xd2, 0x7b, 0x7d, 0xa8, 0xe1, 0x87, 0x34, 0xa0, 0x37, 0x74, 0x81, 0xe9, 0xdb, 0xb3, 0x8b, 0xe5, 0x34, 0x42, 0x58, 0x45, 0x43, 0xdd, - 0xaf, 0x4a, 0xd5, 0xe0, 0xf9, 0x7a, 0xdb, 0x9e, 0xc9, 0x20, 0x4c, 0x17, 0x22, 0xbb, 0xd8, 0x62, 0x80, 0xc3, 0x61, 0x87, 0xa0, 0x68, 0x7a, 0xf1, 0x18, 0xe9, 0x38, 0xb9, 0x90, 0x7a, 0x94, 0x9e, - 0xf8, 0x54, 0xe3, 0xa3, 0x24, 0x16, 0xad, 0x99, 0x49, 0x22, 0xda, 0xbe, 0xb9, 0x72, 0xd7, 0xa6, 0x38, 0xf1, 0x14, 0x86, 0xb4, 0x0a, 0xbb, 0x14, 0x0c, 0xb5, 0x04, 0x57, 0x13, 0x9d, 0x14, 0x46, - 0xba, 0xe4, 0xaf, 0x0a, 0xd0, 0x5f, 0x7f, 0x83, 0x23, 0xe1, 0xf3, 0xee, 0x95, 0x2a, 0x7f, 0xce, 0x4e, 0xf4, 0x81, 0x64, 0xc0, 0x4f, 0x9f, 0xf0, 0xc2, 0xd8, 0xf7, 0xd7, 0xa7, 0x97, 0x67, 0x7c, - 0xcf, 0x62, 0x07, 0x36, 0xe9, 0x05, 0x7c, 0xdc, 0x28, 0x60, 0xdb, 0x95, 0xce, 0xc1, 0x46, 0xa3, 0x92, 0x16, 0xd1, 0x09, 0x22, 0xf0, 0x1a, 0xc6, 0x66, 0x9c, 0x26, 0x19, 0x90, 0xee, 0xaf, 0x24, - 0x7c, 0xaf, 0x4e, 0x98, 0xb0, 0x11, 0x64, 0x2a, 0xde, 0xfb, 0x26, 0xc5, 0x45, 0x55, 0x51, 0xad, 0x69, 0xf7, 0x7c, 0xf2, 0x0f, 0x6c, 0x21, 0x58, 0x62, 0x15, 0x4e, 0xb6, 0x7e, 0x4c, 0x93, 0xb6, - 0x68, 0xeb, 0x34, 0xf4, 0x3b, 0xee, 0xd6, 0x51, 0x09, 0xd7, 0xa5, 0x63, 0xd5, 0xc5, 0x33, 0x10, 0xd4, 0x57, 0x78, 0x22, 0xf0, 0x43, 0xe8, 0xeb, 0x1f, 0xa8, 0x5f, 0xc2, 0x9f, 0xef, 0xae, 0x4d, - 0xe1, 0x71, 0x18, 0xec, 0x98, 0xa1, 0x4e, 0xe4, 0xb6, 0x74, 0x86, 0x16, 0x3f, 0xc8, 0x04, 0x90, 0xf4, 0xcd, 0x56, 0xe9, 0x08, 0x29, 0x3b, 0xb2, 0xf3, 0x55, 0x61, 0x9d, 0x02, 0x4d, 0x8b, 0x72, - 0x0a, 0x1d, 0x66, 0xf6, 0x4c, 0x93, 0x48, 0x5a, 0xce, 0x2b, 0xd3, 0x2d, 0xe5, 0x30, 0x69, 0x99, 0xfe, 0x69, 0xcf, 0xf4, 0x6c, 0x9b, 0xaf, 0x8e, 0x6c, 0xbd, 0x3c, 0xcf, 0x85, 0x05, 0xaf, 0xa6, - 0xd5, 0x0e, 0xc6, 0xf2, 0x2b, 0x06, 0xfb, 0x57, 0xdc, 0xf9, 0x22, 0x0c, 0x8c, 0xff, 0x44, 0x1e, 0xc8, 0x44, 0x7f, 0x1f, 0x06, 0xbe, 0x50, 0xf9, 0xfe, 0xe5, 0x79, 0x12, 0xb2, 0x2a, 0x66, 0x37, - 0x2b, 0x22, 0xb6, 0x10, 0x37, 0xd5, 0x8a, 0x3e, 0xac, 0x0f, 0x83, 0xd2, 0x4b, 0x7d, 0xc4, 0xed, 0xea, 0x39, 0x3f, 0x3f, 0xac, 0xa9, 0x05, 0xc6, 0xee, 0x57, 0x9b, 0x94, 0xe0, 0x28, 0xe6, 0xa0, - 0x70, 0x47, 0xcc, 0x73, 0xb3, 0xc0, 0x6a, 0xb7, 0x71, 0xbc, 0x05, 0xec, 0x45, 0xa8, 0x08, 0x45, 0x5e, 0xcf, 0x22, 0x0c, 0xd9, 0x6c, 0x84, 0x8c, 0xde, 0x17, 0x8b, 0xa0, 0x44, 0x46, 0x16, 0x8f, - 0x47, 0x45, 0x3d, 0xb5, 0x0c, 0xcb, 0xbf, 0x5a, 0xe7, 0xd8, 0xc8, 0xe2, 0xfe, 0xcf, 0x42, 0xc6, 0x8f, 0x15, 0x2b, 0x8e, 0x12, 0xe3, 0x6a, 0x6a, 0xa5, 0xe9, 0x39, 0x70, 0xae, 0x32, 0x75, 0xbf, - 0xb2, 0xe3, 0x91, 0x60, 0xd8, 0x07, 0xea, 0x97, 0xe1, 0x7b, 0x77, 0x6d, 0x6c, 0x83, 0x68, 0xf9, 0x90, 0x1c, 0xa4, 0x4e, 0xd1, 0x6a, 0xa7, 0x38, 0x63, 0x33, 0x44, 0x73, 0xeb, 0x28, 0x10, 0x3a, - 0x52, 0x24, 0xa0, 0xbd, 0x0b, 0x4e, 0x72, 0x57, 0x5a, 0xe2, 0xc8, 0x6e, 0x7d, 0xda, 0x5a, 0x3d, 0x77, 0x62, 0x99, 0x39, 0xba, 0xa8, 0x59, 0xf0, 0xec, 0x15, 0x52, 0x26, 0xd3, 0xb5, 0xa2, 0x27, - 0xfb, 0x38, 0xcc, 0xfa, 0x92, 0x8d, 0x87, 0x6e, 0xa3, 0x6d, 0x79, 0xd7, 0xc0, 0xc4, 0x70, 0xe5, 0xf7, 0x5f, 0xf7, 0x7e, 0x2b, 0x7d, 0xc7, 0x34, 0x12, 0x6f, 0x6a, 0xa5, 0x71, 0x6c, 0x24, 0xf7, - 0xb2, 0x59, 0x1f, 0xdc, 0x8a, 0x6e, 0x69, 0x3f, 0x71, 0xe6, 0xf6, 0xca, 0xd8, 0x2d, 0xe9, 0xcc, 0x76, 0x05, 0x3c, 0xe8, 0xd9, 0xa9, 0xb2, 0xe3, 0x82, 0x87, 0x72, 0x3a, 0x2c, 0x0a, 0x0d, 0xd0, - 0xa1, 0x42, 0x86, 0xce, 0x0c, 0x41, 0x77, 0x13, 0xef, 0x9c, 0x6d, 0x21, 0x06, 0x75, 0xb4, 0xb8, 0xd1, 0xca, 0x36, 0xb6, 0x96, 0x90, 0xaf, 0x1c, 0xc9, 0xe3, 0x49, 0x1d, 0xa2, 0xc2, 0x38, 0xb5, - 0x10, 0xd0, 0xeb, 0x19, 0x76, 0xaa, 0xe9, 0x13, 0x8e, 0x9f, 0xaa, 0xc6, 0xe4, 0x41, 0x3b, 0xa6, 0xbf, 0xd3, 0x9f, 0xbe, 0xc8, 0x9c, 0x7f, 0x7e, 0x8b, 0xcb, 0xbe, 0xfa, 0xd7, 0xbf, 0x36, 0x8c, - 0xf2, 0xfe, 0x59, 0xf7, 0x4c, 0x95, 0xc7, 0x47, 0xe7, 0x42, 0xf9, 0xcd, 0xd8, 0x5c, 0xce, 0xc7, 0x86, 0xc0, 0xf0, 0xc9, 0xc4, 0x5e, 0xf9, 0x95, 0xd5, 0x21, 0xc8, 0x0c, 0xa9, 0x49, 0x23, 0x27, - 0x68, 0x5a, 0x46, 0xf9, 0xba, 0x23, 0x9d, 0x8a, 0x1c, 0x28, 0x5c, 0x97, 0x04, 0x3f, 0x56, 0xa4, 0x75, 0xc2, 0x2e, 0x6d, 0xcc, 0xdc, 0x17, 0x9a, 0x1d, 0x2c, 0xfb, 0x81, 0x6a, 0x18, 0x10, 0xd7, - 0x51, 0x54, 0x3d, 0xd9, 0xbb, 0xbd, 0x7f, 0x54, 0x7b, 0xad, 0x9a, 0x71, 0x40, 0xef, 0x0f, 0x84, 0x73, 0xb6, 0xcc, 0x6f, 0x3b, 0x8e, 0xfe, 0x13, 0x6c, 0xbd, 0x2d, 0x7e, 0xf8, 0xe7, 0x1c, 0x09, - 0x6f, 0x09, 0x3f, 0x31, 0xf5, 0xcd, 0xe9, 0x58, 0x97, 0x42, 0x3e, 0xd3, 0xc4, 0xbe, 0xca, 0x57, 0xcb, 0xf5, 0x96, 0x3d, 0x33, 0x76, 0xc0, 0xad, 0x8b, 0x13, 0x04, 0xc6, 0xcd, 0x4e, 0x6e, 0x12, - 0xc9, 0x47, 0x61, 0x60, 0xc2, 0xa4, 0x64, 0xb4, 0x3a, 0x22, 0x26, 0xbc, 0xd3, 0x76, 0x4b, 0xb8, 0xeb, 0x36, 0x99, 0xbe, 0xb2, 0xe3, 0x39, 0xda, 0x3a, 0x20, 0x69, 0xa4, 0x07, 0x44, 0x6e, 0x37, - 0x3d, 0x93, 0x7b, 0xb3, 0x76, 0x8f, 0x3b, 0x59, 0xa7, 0x34, 0xa0, 0xfe, 0x1e, 0x11, 0xea, 0x41, 0x98, 0x7d, 0xcf, 0xa9, 0xa6, 0x41, 0xf2, 0xa4, 0xee, 0x94, 0x81, 0xf5, 0xfa, 0x91, 0x9b, 0x86, - 0x87, 0x1f, 0x1a, 0xb6, 0x3c, 0x7d, 0x66, 0x3e, 0xba, 0xf3, 0xde, 0x08, 0xc3, 0x63, 0xb4, 0xd3, 0xf6, 0x66, 0x2c, 0x6e, 0xee, 0x8c, 0xec, 0x2a, 0xf3, 0x50, 0x0d, 0xd0, 0xf7, 0x6d, 0x65, 0xc6, - 0xd5, 0x06, 0xad, 0x5d, 0x9c, 0x0c, 0x57, 0x51, 0x76, 0x1e, 0x06, 0xd2, 0x39, 0x40, 0x56, 0xee, 0x29, 0x88, 0xb0, 0x3f, 0x2a, 0x88, 0x31, 0xf4, 0x69, 0x47, 0x33, 0x46, 0x28, 0x4f, 0x02, 0x26, - 0x59, 0x91, 0xee, 0xe1, 0x00, 0x2f, 0x8f, 0x3d, 0xdd, 0x1f, 0x0d, 0x5d, 0x3f, 0xc2, 0x4b, 0x99, 0x0e, 0x55, 0xe3, 0x04, 0x4b, 0x1c, 0x11, 0xcc, 0xc2, 0x35, 0xb2, 0x0f, 0xf1, 0xd8, 0x2f, 0x39, - 0x94, 0xa6, 0x17, 0xf9, 0xf1, 0x66, 0x6a, 0xfd, 0x3f, 0x30, 0x00, 0x77, 0xda, 0x4b, 0xde, 0x9b, 0x6f, 0xbf, 0x5f, 0x59, 0xf9, 0xf9, 0x23, 0x2e, 0x33, 0xef, 0xb3, 0x1b, 0x63, 0xe1, 0xea, 0x48, - 0x72, 0xeb, 0xc9, 0x04, 0x4a, 0x6e, 0xa4, 0x4d, 0x8c, 0x1d, 0xc3, 0xe3, 0x8a, 0x63, 0xbd, 0xdd, 0xa1, 0x4e, 0x31, 0x68, 0x45, 0xd2, 0xfb, 0x10, 0x1a, 0x80, 0x6e, 0xbf, 0x52, 0xd7, 0xe9, 0x90, - 0x0b, 0x58, 0x2b, 0xe0, 0x41, 0x00, 0x6e, 0x3a, 0x2a, 0x8f, 0xd6, 0xb5, 0x8d, 0x2f, 0x93, 0x02, 0x98, 0xec, 0xfc, 0xc8, 0xe4, 0xd7, 0x60, 0xeb, 0x2f, 0x8b, 0x7c, 0x8e, 0x89, 0x70, 0xce, 0xf2, - 0x47, 0xe7, 0xf1, 0x28, 0xc8, 0x2f, 0x85, 0xe9, 0x6f, 0xfc, 0xb1, 0xad, 0x66, 0xac, 0x2b, 0xf0, 0x0e, 0x3f, 0x7f, 0x47, 0xf5, 0x7d, 0x68, 0x33, 0xfa, 0xa0, 0xfa, 0x8e, 0xda, 0x7e, 0x26, 0x0c, - 0x89, 0x0d, 0x87, 0xc5, 0x7c, 0x77, 0xf4, 0xb1, 0x21, 0x6d, 0x4e, 0xd2, 0x6e, 0xb1, 0x63, 0xdb, 0x66, 0x56, 0x98, 0xb0, 0xc8, 0x32, 0xd1, 0x26, 0x40, 0x22, 0x37, 0xc8, 0xd7, 0x6c, 0x27, 0x83, - 0x75, 0xdd, 0x52, 0x9e, 0xe3, 0x5a, 0xc2, 0xc6, 0x9a, 0xcd, 0x9b, 0xb9, 0xdb, 0x40, 0x2d, 0xc1, 0x98, 0xfb, 0xaa, 0xed, 0xea, 0x3a, 0xcf, 0x17, 0xe1, 0x7a, 0xce, 0x73, 0x0b, 0x41, 0xf0, 0xf2, - 0x6f, 0xb7, 0x9f, 0xdf, 0x56, 0x67, 0xbf, 0xe0, 0x76, 0x64, 0x94, 0xff, 0x6c, 0xcf, 0xb0, 0x0b, 0xc5, 0x27, 0x3e, 0x3e, 0xfd, 0x1f, 0xbb, 0x8b, 0x7b, 0x73, 0x09, 0xf2, 0x0d, 0xc7, 0xec, 0x11, - 0x4c, 0xd8, 0xef, 0xab, 0xd6, 0x44, 0x93, 0x8a, 0x62, 0x18, 0xc6, 0xd8, 0x96, 0xc6, 0x61, 0x1f, 0x4a, 0x18, 0xe1, 0x92, 0x5d, 0x2a, 0x59, 0x75, 0x15, 0xcd, 0xdc, 0x3d, 0xd4, 0xd4, 0x27, 0x88, - 0x60, 0x91, 0x76, 0x5f, 0x21, 0xe1, 0xaa, 0x5f, 0x55, 0xc5, 0xb9, 0x9b, 0x6c, 0x07, 0xf0, 0x00, 0x31, 0xc4, 0x6c, 0x81, 0x72, 0xfd, 0xc2, 0xa6, 0xb9, 0x00, 0xfe, 0xc7, 0x22, 0xdd, 0x5f, 0xb1, - 0x2f, 0xb0, 0x9c, 0xa9, 0x91, 0x94, 0xc1, 0x1d, 0x1e, 0x3e, 0x16, 0x93, 0xfb, 0x45, 0xf6, 0xc2, 0xc8, 0x97, 0x93, 0xb1, 0xf1, 0xb8, 0x9c, 0xa3, 0x38, 0xd7, 0x3f, 0x81, 0x28, 0x68, 0x1d, 0x58, - 0x05, 0x45, 0xb6, 0x73, 0x72, 0xd5, 0x7b, 0xf9, 0xc9, 0x54, 0xc5, 0x95, 0xbe, 0x65, 0x05, 0x0f, 0xdf, 0xe2, 0x48, 0x5c, 0x29, 0xc7, 0x8d, 0x6c, 0x12, 0x59, 0x2f, 0x22, 0xee, 0xe0, 0xa2, 0xeb, - 0xce, 0x9e, 0xed, 0x07, 0x7b, 0xb9, 0x91, 0x30, 0x4e, 0x56, 0x3d, 0xe0, 0x48, 0x26, 0xc2, 0xae, 0xf3, 0x7c, 0xbd, 0xda, 0x6e, 0xeb, 0x62, 0xc9, 0x7f, 0xc7, 0xcd, 0x2f, 0xd2, 0x1c, 0x9f, 0x7e, - 0x7a, 0x59, 0xf5, 0xd1, 0x73, 0xe6, 0xc8, 0x87, 0xa4, 0x20, 0xa3, 0xac, 0x8a, 0x4b, 0xca, 0xd8, 0x8b, 0x36, 0xfb, 0x01, 0x5f, 0x2e, 0x28, 0xa7, 0x6e, 0x1d, 0x45, 0x6d, 0x60, 0x57, 0xfe, 0xf4, - 0x52, 0x04, 0x9c, 0xa5, 0xc1, 0x1f, 0x65, 0x10, 0xfd, 0x03, 0xb0, 0x4c, 0x96, 0x6f, 0x44, 0xe7, 0x37, 0xc3, 0xf3, 0xff, 0x7b, 0xde, 0x9f, 0xfe, 0xf7, 0x98, 0xd4, 0xee, 0x1b, 0xe0, 0xba, 0xcf, - 0x67, 0xdf, 0x23, 0x71, 0x8f, 0x5f, 0x64, 0x9f, 0x24, 0xe7, 0xf5, 0x64, 0x8a, 0x8c, 0x8b, 0x81, 0xec, 0x4e, 0x5d, 0x86, 0xa0, 0xdb, 0x48, 0x87, 0x0c, 0x78, 0x63, 0x12, 0xba, 0xe4, 0xad, 0xa8, - 0x2d, 0x92, 0x04, 0x6b, 0x76, 0x08, 0x4c, 0xbb, 0xad, 0x5a, 0x5e, 0x3d, 0x6e, 0x3d, 0x30, 0x97, 0xe4, 0xa1, 0xa4, 0xd3, 0x0d, 0xc2, 0xb8, 0xde, 0xd9, 0x25, 0xb6, 0x36, 0xa9, 0xac, 0x54, 0x64, - 0x7f, 0x76, 0x42, 0x7a, 0xb9, 0x8e, 0x8e, 0x6d, 0xb2, 0x4f, 0xb2, 0x83, 0x2d, 0xe8, 0x6b, 0x7f, 0xc5, 0x45, 0xc0, 0xc8, 0x3a, 0xff, 0x3b, 0x48, 0x89, 0x63, 0x58, 0x59, 0x17, 0x96, 0x33, 0x8d, - 0x8d, 0x7b, 0x69, 0x3b, 0xe0, 0x4f, 0xec, 0x01, 0x35, 0xea, 0x17, 0xd9, 0x0b, 0x2b, 0x5f, 0x4e, 0x2e, 0x59, 0xdb, 0x23, 0xb4, 0x27, 0x35, 0xf4, 0x8c, 0xac, 0x8e, 0x8f, 0x91, 0xc9, 0xf9, 0x67, - 0xd2, 0x1b, 0x14, 0xfc, 0x74, 0xb6, 0x66, 0x27, 0x4d, 0x55, 0x50, 0x6c, 0x05, 0x06, 0xdb, 0x9a, 0xd8, 0x33, 0x5a, 0x0e, 0x9a, 0x56, 0x2b, 0xce, 0xec, 0x01, 0xf0, 0x41, 0x31, 0x0a, 0x31, 0x27, - 0xd9, 0xe4, 0xe1, 0x00, 0xe9, 0x66, 0x0e, 0x47, 0xb3, 0xa3, 0x91, 0x9f, 0x92, 0xe2, 0x60, 0xb6, 0x47, 0xe1, 0xc8, 0xf5, 0x2b, 0x64, 0x85, 0xfe, 0x69, 0xb1, 0xdf, 0xe8, 0x78, 0xdc, 0x9b, 0xd7, - 0x7d, 0xf1, 0x4f, 0xdf, 0x63, 0xed, 0xec, 0x91, 0xde, 0xec, 0x1f, 0xe9, 0xdf, 0xf2, 0xf8, 0xf9, 0xe2, 0xf4, 0x4a, 0xfe, 0x7b, 0x66, 0x1f, 0xd3, 0x24, 0xc6, 0x07, 0x81, 0x5a, 0x6f, 0x06, 0x92, - 0x91, 0x6c, 0x72, 0x52, 0xf9, 0xa5, 0x68, 0x14, 0xe0, 0xf9, 0x54, 0x53, 0xeb, 0xe1, 0xd4, 0x74, 0x7a, 0x1b, 0x91, 0x06, 0x81, 0xf7, 0x01, 0xc0, 0xd9, 0x61, 0x83, 0x2b, 0x41, 0x06, 0x5b, 0xfd, - 0xc1, 0xdc, 0x85, 0xb3, 0x14, 0xb4, 0x56, 0x22, 0x8f, 0x2e, 0x0f, 0xe7, 0x5a, 0x69, 0x4d, 0x84, 0xa1, 0xe9, 0x5e, 0xed, 0x60, 0x9a, 0x49, 0x98, 0xc7, 0xb5, 0xa5, 0x6b, 0xca, 0xf6, 0x4b, 0xae, - 0xc6, 0x27, 0x66, 0xcc, 0x8d, 0xc8, 0xbe, 0x2f, 0xda, 0xfb, 0x62, 0x58, 0x32, 0xbb, 0x9b, 0x5a, 0x69, 0x51, 0xdc, 0xb7, 0x19, 0x1e, 0x43, 0xa9, 0x7e, 0x4b, 0xf8, 0x69, 0x24, 0xde, 0x9c, 0x8e, - 0x45, 0xab, 0xb6, 0x84, 0x93, 0xa5, 0x1e, 0x5b, 0x9f, 0xaa, 0x59, 0x4a, 0x0b, 0xd0, 0xb9, 0xec, 0xaf, 0x64, 0xaa, 0xdf, 0x2c, 0xb7, 0x48, 0x20, 0x86, 0x90, 0x1e, 0x0c, 0x73, 0x3a, 0x3b, 0x04, - 0x07, 0xa4, 0x32, 0x75, 0xa1, 0xd5, 0x68, 0x74, 0x2e, 0x0d, 0x6b, 0x1e, 0xe1, 0x32, 0x61, 0xb7, 0xe1, 0x3b, 0x1f, 0xce, 0xdb, 0x1c, 0x8e, 0x36, 0x1b, 0xdd, 0xd8, 0x72, 0x87, 0x76, 0x9e, 0xf3, - 0x01, 0x1a, 0x2a, 0x14, 0xf8, 0xf8, 0x10, 0x5c, 0x5e, 0xc1, 0xe9, 0xb2, 0xc2, 0x29, 0x9f, 0x58, 0xf3, 0x26, 0x83, 0xe7, 0x43, 0x82, 0xfd, 0xe5, 0xa3, 0xcf, 0xe5, 0x39, 0xd3, 0xc0, 0x2e, 0x3f, - 0xd9, 0x55, 0xbe, 0x19, 0x12, 0xa7, 0xb3, 0x9c, 0x4b, 0xd7, 0xa9, 0xf2, 0xae, 0xfb, 0xea, 0xa1, 0xc5, 0xfc, 0x96, 0xf6, 0xcb, 0xc0, 0xfc, 0xba, 0x32, 0x16, 0x25, 0x0e, 0xa8, 0x94, 0xe2, 0x24, - 0x50, 0xb8, 0x28, 0xae, 0xa1, 0x44, 0x5d, 0x78, 0x1d, 0x82, 0xfa, 0x6a, 0x96, 0x6b, 0x75, 0xbf, 0x61, 0x26, 0xb4, 0xc2, 0x6e, 0x94, 0x64, 0xad, 0xee, 0x18, 0xb4, 0xa0, 0x7b, 0x2f, 0x40, 0xbb, - 0x1a, 0xa8, 0x5c, 0x2f, 0xce, 0x21, 0x07, 0xb2, 0xd6, 0x72, 0x2b, 0x0f, 0xad, 0xee, 0xa5, 0x28, 0xbf, 0xeb, 0xf7, 0xc1, 0xa4, 0x08, 0xac, 0xdd, 0x59, 0x3f, 0xb7, 0x68, 0x30, 0xbb, 0xa3, 0xa5, - 0x7e, 0xcb, 0xaa, 0x0f, 0x43, 0x72, 0x4f, 0xf7, 0x7c, 0x50, 0x8c, 0xdf, 0x3f, 0xe1, 0x17, 0xdb, 0x6e, 0xaf, 0x5f, 0x74, 0xd3, 0x31, 0x82, 0x6d, 0xe6, 0x6c, 0x9d, 0x94, 0xd2, 0x31, 0xd9, 0xf0, - 0x4b, 0x6c, 0xeb, 0x1f, 0xf6, 0x5c, 0xc9, 0x39, 0xec, 0x8c, 0x05, 0x76, 0xf3, 0x65, 0xd6, 0xc7, 0xe6, 0x90, 0x2b, 0x12, 0x52, 0xef, 0x5a, 0x9e, 0xda, 0xe9, 0x90, 0x84, 0x12, 0x50, 0x7a, 0x34, - 0x52, 0x37, 0x67, 0xf1, 0x44, 0xc0, 0x0e, 0x20, 0xde, 0x45, 0x5a, 0x7b, 0xc2, 0x44, 0x5f, 0xb2, 0x25, 0x78, 0xed, 0xd8, 0xc7, 0x0e, 0xd0, 0xb7, 0xe8, 0xe3, 0xda, 0xd4, 0x47, 0x81, 0xfb, 0x04, - 0x0b, 0xf8, 0xcf, 0x45, 0xfa, 0xf6, 0xcb, 0x77, 0x87, 0xe8, 0xf7, 0x13, 0x14, 0xde, 0x53, 0x7f, 0x19, 0x9e, 0x37, 0x97, 0xae, 0x23, 0x33, 0x22, 0x6b, 0xa1, 0x28, 0x26, 0x87, 0xc3, 0x5e, 0xab, - 0x64, 0x5f, 0x40, 0x05, 0xd6, 0xd4, 0xd4, 0x60, 0xb1, 0xc2, 0xbb, 0x23, 0x42, 0xa6, 0x73, 0xba, 0xae, 0x57, 0x18, 0x35, 0x0b, 0xd9, 0x49, 0x0e, 0x74, 0xd0, 0x2c, 0x84, 0xc3, 0x24, 0xe8, 0x2d, - 0x6f, 0x6b, 0x76, 0x2a, 0x38, 0x67, 0x0b, 0xf0, 0x98, 0x47, 0xfb, 0x9d, 0x5a, 0xa2, 0x01, 0x1a, 0x55, 0x2c, 0xa3, 0xe5, 0x8a, 0x83, 0x1f, 0x58, 0x2b, 0x3a, 0x1d, 0xfb, 0x07, 0xe4, 0xfa, 0x19, - 0x9a, 0xf6, 0x73, 0x03, 0xe0, 0x91, 0x90, 0xff, 0x95, 0xe4, 0x85, 0x35, 0x4f, 0x07, 0x53, 0x74, 0x5c, 0x98, 0x5f, 0xb5, 0x42, 0x6b, 0x23, 0x1c, 0xcf, 0x49, 0xc1, 0x9f, 0x57, 0x98, 0xb8, 0xd3, - 0x08, 0x24, 0xb7, 0x58, 0x0e, 0xdb, 0xb2, 0xde, 0x61, 0xcb, 0x9f, 0x0f, 0x18, 0x7c, 0x22, 0x8c, 0x59, 0x7d, 0xa2, 0x0f, 0xcd, 0xbc, 0xb7, 0x19, 0xe9, 0xd0, 0x2e, 0x58, 0x6e, 0x9b, 0xb3, 0xf6, - 0x26, 0x74, 0xa0, 0x83, 0x72, 0xcc, 0xa2, 0x90, 0x01, 0x8f, 0xa7, 0x8c, 0xa2, 0xfd, 0x82, 0xb2, 0x17, 0xc2, 0x89, 0x45, 0x95, 0xe3, 0xef, 0x84, 0xf5, 0x7e, 0x40, 0xe0, 0xcf, 0x6e, 0x94, 0x88, - 0x15, 0x41, 0x52, 0xb9, 0xd3, 0xf0, 0x9e, 0x70, 0x41, 0x0f, 0x21, 0xb6, 0xfd, 0x22, 0x7b, 0x61, 0xdd, 0xcb, 0xc9, 0xc5, 0xe7, 0xf2, 0x4d, 0x54, 0x14, 0x9a, 0x92, 0x82, 0xb1, 0x37, 0xe1, 0x53, - 0x1a, 0x29, 0x07, 0x51, 0xb4, 0x17, 0x87, 0x35, 0x7d, 0x1a, 0xea, 0x95, 0x95, 0xb9, 0x41, 0xfb, 0xbb, 0x02, 0x71, 0x4d, 0x14, 0xbe, 0x58, 0x2b, 0x5f, 0x88, 0xc5, 0x03, 0xef, 0xf7, 0x86, 0xf0, - 0xd3, 0x1b, 0xbe, 0x39, 0xbd, 0x88, 0xc8, 0x88, 0xc8, 0x6f, 0xbb, 0xed, 0x25, 0x59, 0xca, 0xc2, 0x0d, 0x58, 0xae, 0x33, 0x0c, 0x5e, 0x16, 0x7b, 0xdd, 0x66, 0xca, 0x90, 0xdb, 0x1c, 0x4b, 0x23, - 0x9b, 0xa5, 0x32, 0x1f, 0xf8, 0xac, 0x5f, 0x63, 0x0c, 0xbe, 0x39, 0x08, 0xc0, 0x3c, 0x5c, 0x93, 0x98, 0xda, 0x3b, 0xcd, 0x6e, 0x52, 0x69, 0xb5, 0x90, 0x17, 0x89, 0x47, 0x84, 0x80, 0xd5, 0x6d, - 0x95, 0x63, 0x7f, 0x54, 0xdb, 0x66, 0xaf, 0x14, 0x41, 0xa0, 0x0f, 0xef, 0x35, 0xfc, 0xdf, 0x58, 0xcd, 0x9c, 0x38, 0x0d, 0x83, 0x37, 0x96, 0x1f, 0xf1, 0xfb, 0x96, 0xdf, 0xdb, 0x65, 0xef, 0x52, - 0x5d, 0xf2, 0x6c, 0x8e, 0x5f, 0xa3, 0x81, 0xbf, 0x5f, 0x79, 0x30, 0xca, 0xee, 0xbf, 0x70, 0xfe, 0x4d, 0x7d, 0x47, 0x55, 0x04, 0xf7, 0x0c, 0x39, 0xe8, 0xa1, 0xcc, 0xc9, 0x4f, 0x9f, 0xf0, 0x3a, - 0xe6, 0xef, 0xae, 0x5f, 0xd2, 0x80, 0x46, 0xac, 0x97, 0xe6, 0xac, 0x2f, 0xcc, 0x08, 0x21, 0xb5, 0x75, 0xc8, 0x1a, 0xf5, 0x5c, 0x2c, 0xce, 0xb8, 0x0a, 0xca, 0xf2, 0xc9, 0x52, 0x4f, 0x36, 0x8f, - 0xb6, 0xcc, 0xfe, 0x60, 0xe4, 0x29, 0x29, 0xed, 0x67, 0x20, 0x45, 0x2d, 0x91, 0x2d, 0x59, 0x9f, 0x54, 0x50, 0x39, 0xc9, 0xbc, 0xb8, 0xa2, 0x44, 0xdc, 0x38, 0xa4, 0x3c, 0xa7, 0x11, 0x38, 0xbb, - 0x55, 0x7c, 0x9b, 0x93, 0x0f, 0x6b, 0x11, 0xf1, 0x02, 0x2b, 0xda, 0x3e, 0x3e, 0xf8, 0x8f, 0x17, 0x96, 0xbc, 0x36, 0xb0, 0xfe, 0x7d, 0xc3, 0xff, 0xbf, 0xa9, 0xb0, 0xe4, 0xd3, 0x71, 0x73, 0xee, - 0xc6, 0x3b, 0x1f, 0x8c, 0xfd, 0xdc, 0x79, 0xc8, 0x3d, 0xb9, 0x71, 0x12, 0x7b, 0x6c, 0x4c, 0xa8, 0x9f, 0x77, 0x54, 0xd8, 0x42, 0x22, 0x8c, 0x2c, 0xda, 0x33, 0xb1, 0x6c, 0x94, 0xcc, 0xea, 0x77, - 0x30, 0xbf, 0x2e, 0xa0, 0x10, 0x6f, 0x37, 0xc8, 0xdc, 0x9d, 0x9c, 0xb1, 0xa8, 0x91, 0x93, 0x3d, 0x37, 0x4c, 0xe2, 0x61, 0x4e, 0x31, 0xc3, 0x9c, 0x3f, 0x89, 0x4e, 0x44, 0x9f, 0x51, 0xf8, 0x2c, - 0x0c, 0xd8, 0x24, 0x8f, 0x88, 0x2e, 0x74, 0xb7, 0x44, 0x7a, 0x1a, 0x7a, 0x24, 0x5c, 0x88, 0x33, 0x49, 0xbd, 0xa7, 0x42, 0x8e, 0x10, 0x9d, 0x8f, 0x61, 0xa2, 0x9b, 0x18, 0xd0, 0x57, 0x92, 0xf5, - 0x3f, 0x64, 0xec, 0xcb, 0xca, 0xf8, 0xb2, 0x39, 0xc0, 0x3f, 0x34, 0xfa, 0x97, 0xc7, 0xdc, 0x1b, 0xff, 0xcb, 0xcd, 0xb1, 0x12, 0x10, 0xfa, 0x98, 0x33, 0x27, 0x50, 0x81, 0x74, 0x9b, 0x6e, 0x3f, - 0x03, 0x2b, 0xfb, 0x04, 0x27, 0xb2, 0x9e, 0xa4, 0xd4, 0x0c, 0x88, 0x77, 0xab, 0xad, 0x20, 0x2f, 0x25, 0xb7, 0x25, 0xaa, 0x59, 0xdf, 0x57, 0xe7, 0x54, 0x2d, 0x37, 0x32, 0xdf, 0x35, 0x6b, 0x60, - 0x89, 0xcc, 0xf3, 0x1a, 0x2a, 0x69, 0x50, 0xa8, 0x8e, 0x6b, 0x44, 0xa0, 0x40, 0xcd, 0xdb, 0xee, 0x63, 0xeb, 0xd8, 0x0e, 0x41, 0x7b, 0xaa, 0xf5, 0xc7, 0x0d, 0xbc, 0xff, 0xd7, 0x49, 0x40, 0xf6, - 0x95, 0x9f, 0x18, 0x7b, 0xcc, 0xde, 0x79, 0x25, 0xfb, 0x3c, 0xc2, 0xd7, 0x93, 0x29, 0x36, 0xce, 0xb2, 0x39, 0x21, 0xc4, 0x41, 0xdc, 0xb3, 0x56, 0x7e, 0x5e, 0x15, 0x54, 0xb6, 0x4a, 0xa4, 0x79, - 0x53, 0xef, 0xb5, 0x38, 0xaf, 0xeb, 0x66, 0x96, 0x6a, 0xc2, 0x36, 0x63, 0x1c, 0x05, 0x33, 0x98, 0xa2, 0x40, 0x52, 0x84, 0xb1, 0xe6, 0x8b, 0xe8, 0x60, 0x60, 0x1b, 0xd2, 0x55, 0xf7, 0x02, 0x95, - 0x98, 0x1d, 0xc3, 0xe8, 0xab, 0x09, 0x00, 0xa6, 0xe9, 0x1a, 0xdf, 0x16, 0x62, 0xad, 0xee, 0x87, 0x4a, 0xb5, 0xff, 0x64, 0x4e, 0x5f, 0x7e, 0xfa, 0x2f, 0x55, 0x60, 0xf6, 0x2f, 0xdd, 0xbd, 0xdf, - 0x14, 0xa1, 0xde, 0x33, 0x6e, 0x1e, 0x50, 0xdb, 0xdf, 0x10, 0x7e, 0x1d, 0x91, 0xe7, 0xaa, 0xd8, 0x91, 0x91, 0x90, 0xc8, 0xd8, 0x28, 0x06, 0xb2, 0x31, 0x27, 0x07, 0x29, 0x33, 0x28, 0x8c, 0x2e, - 0x1d, 0xd6, 0x5f, 0xe1, 0xb6, 0x76, 0xc8, 0x59, 0xc5, 0xdd, 0x88, 0x94, 0x4c, 0x1b, 0x4b, 0x33, 0xb0, 0x01, 0xbb, 0x10, 0x7c, 0x2f, 0xa8, 0xbc, 0xd3, 0xb9, 0x06, 0x22, 0xa7, 0xe2, 0xd4, 0x5c, - 0xd0, 0x56, 0xe9, 0xf1, 0x00, 0x0e, 0xeb, 0xb5, 0x6a, 0x86, 0x99, 0xcd, 0xc2, 0xd5, 0xa4, 0x3a, 0x85, 0xa8, 0x29, 0x71, 0xf2, 0xe3, 0xd6, 0x66, 0x1c, 0x24, 0x6f, 0xab, 0x75, 0xa1, 0x87, 0x7c, - 0xed, 0xa3, 0xc6, 0xa4, 0xce, 0x9c, 0xc2, 0xf0, 0xee, 0x8f, 0x08, 0xf1, 0x98, 0x45, 0xf0, 0x4a, 0xf6, 0x69, 0x3c, 0x5e, 0x4f, 0xa6, 0xc4, 0xf7, 0x16, 0xc1, 0xd3, 0x68, 0xa4, 0x24, 0x35, 0x31, - 0xf8, 0x92, 0x0a, 0x87, 0x21, 0x8c, 0x85, 0xd9, 0x42, 0x10, 0x49, 0x71, 0xb5, 0x9f, 0xe8, 0x38, 0x2b, 0x0e, 0x51, 0x37, 0xa1, 0xa5, 0x02, 0x30, 0xd8, 0x96, 0x03, 0x89, 0xf3, 0x7a, 0x22, 0xc3, - 0xa8, 0x57, 0xd2, 0xf1, 0x62, 0x0f, 0xed, 0x38, 0x77, 0x30, 0x20, 0x77, 0x3b, 0x11, 0x27, 0xfb, 0x6d, 0xa4, 0x2c, 0x52, 0x5e, 0xcf, 0x84, 0x26, 0x4d, 0x97, 0x40, 0x26, 0x0b, 0x10, 0xfb, 0xf8, - 0x0c, 0xb1, 0xd2, 0x38, 0x4b, 0x93, 0xa7, 0xdf, 0xef, 0xc4, 0x41, 0x55, 0x3d, 0xa3, 0x42, 0x40, 0xef, 0x91, 0x1f, 0xae, 0xa9, 0x5f, 0xa1, 0x71, 0xbd, 0x0d, 0xbf, 0xd7, 0xa7, 0x6c, 0xc7, 0xac, - 0x5f, 0xca, 0xb3, 0x91, 0x5b, 0xf4, 0x9b, 0x0b, 0x0c, 0xfc, 0x73, 0x66, 0xe9, 0x6d, 0xdf, 0x9d, 0x77, 0x3d, 0x89, 0xdc, 0xb4, 0x88, 0x7f, 0x61, 0x96, 0x7d, 0x88, 0xe8, 0x3c, 0xdd, 0x0e, 0x2e, - 0x70, 0x1c, 0x7f, 0xbd, 0xc4, 0x73, 0x6e, 0xbe, 0x1e, 0x3b, 0x95, 0x9f, 0xda, 0xbf, 0xd6, 0xe4, 0x9b, 0xa5, 0x3b, 0x0e, 0xae, 0x0d, 0x33, 0x6f, 0xf3, 0xe1, 0x7e, 0xfc, 0xf8, 0x2b, 0xbf, 0x7e, - 0x01, 0xbb, 0xed, 0x1c, 0x75, 0x13, 0xff, 0xfc, 0xaf, 0x6b, 0xe2, 0xe3, 0xef, 0x4a, 0x28, 0xf6, 0x13, 0xfd, 0x09, 0xfe, 0xf8, 0xff, 0x42, 0xc8, 0x33, 0xbc, 0xc5, 0x98, 0x2a, 0xa0, 0x37, 0xa2, - 0x75, 0x73, 0xfd, 0x85, 0xbd, 0x9f, 0x9b, 0x7d, 0xc8, 0x03, 0x1b, 0xfb, 0x85, 0x22, 0x30, 0xbd, 0xfe, 0xbf, 0x00, 0x9b, 0x8c, 0xd8, 0xae, 0x45, 0xf9, 0xb8, 0x62, 0xeb, 0xbd, 0x8a, 0x38, 0x74, - 0x25, 0x6d, 0xc4, 0x26, 0xe1, 0x4f, 0xf8, 0xc6, 0x3a, 0x3b, 0x15, 0x14, 0x82, 0xd5, 0x4c, 0xa8, 0x85, 0x72, 0x35, 0x88, 0xe2, 0x50, 0x3a, 0x67, 0x7a, 0x06, 0xeb, 0x11, 0x91, 0xab, 0xee, 0x6a, - 0x2d, 0x2e, 0x83, 0xb2, 0xd5, 0xf2, 0x75, 0xc3, 0x1e, 0x99, 0x03, 0x2b, 0x78, 0xda, 0x04, 0x67, 0x80, 0x86, 0xe2, 0x79, 0xdf, 0xf1, 0xdb, 0xce, 0x3d, 0xff, 0xc1, 0x42, 0x52, 0xfe, 0xf5, 0x0c, - 0x02, 0xfc, 0x50, 0x63, 0x81, 0x8f, 0xdf, 0xc9, 0x1c, 0xa7, 0xa0, 0xdf, 0x3c, 0x8e, 0x73, 0x6e, 0x40, 0xb1, 0x9e, 0xa4, 0xe2, 0x1a, 0x44, 0x28, 0xa7, 0x56, 0x1a, 0xa5, 0xc5, 0xcd, 0xbd, 0x1f, - 0x3f, 0xfe, 0x4a, 0x2f, 0xfe, 0x33, 0x23, 0x7a, 0x6b, 0xcd, 0xff, 0xf8, 0xf1, 0x2b, 0xfd, 0xfe, 0x81, 0x91, 0x8f, 0xef, 0xbb, 0x7f, 0xa1, 0x07, 0x4c, 0xc0, 0xb8, 0x04, 0xa6, 0x40, 0x5c, 0x5e, - 0xf0, 0x8e, 0x47, 0x18, 0x77, 0x25, 0x73, 0x16, 0xbb, 0xc9, 0x21, 0xe4, 0xaa, 0x78, 0x81, 0x71, 0x1a, 0x8c, 0xa7, 0x0b, 0x74, 0x45, 0xae, 0x96, 0xbb, 0x15, 0xa5, 0xeb, 0xe8, 0x1e, 0xd5, 0x72, - 0x87, 0x11, 0x34, 0xaa, 0xc1, 0x88, 0x4a, 0x99, 0x84, 0x26, 0xd2, 0x9c, 0x01, 0xb9, 0x37, 0xb6, 0x47, 0x11, 0x14, 0x95, 0x6d, 0x7f, 0xac, 0xe2, 0xdd, 0x9e, 0x03, 0xcd, 0x89, 0x61, 0xab, 0xca, - 0xb2, 0x31, 0x4b, 0x48, 0x5c, 0x1a, 0xec, 0xbd, 0x8e, 0x12, 0xdf, 0xf0, 0xa6, 0xba, 0x8f, 0x9f, 0x84, 0xdd, 0x74, 0xf0, 0x1a, 0xcb, 0x8a, 0x57, 0xaa, 0x2f, 0xab, 0xf8, 0xd3, 0xf1, 0xf4, 0x42, - 0xeb, 0x7b, 0xc6, 0xf8, 0x72, 0xea, 0xf3, 0xce, 0xda, 0x3d, 0x03, 0xd6, 0x02, 0x25, 0xa8, 0x2e, 0x33, 0x80, 0x16, 0x25, 0xfc, 0x73, 0x25, 0x62, 0xba, 0x21, 0xe7, 0x9a, 0x09, 0x4a, 0x87, 0x59, - 0xb1, 0x6b, 0x8e, 0x20, 0x85, 0x67, 0x86, 0x5c, 0x92, 0x2a, 0x22, 0xcd, 0x86, 0xde, 0x1e, 0x4e, 0x45, 0x19, 0x09, 0x9b, 0x2a, 0x04, 0x3c, 0x1b, 0x25, 0xf2, 0x6e, 0x86, 0x82, 0xe1, 0xb6, 0xb2, - 0x4a, 0xac, 0x61, 0x20, 0xf7, 0x0f, 0x66, 0xc2, 0x57, 0x6b, 0xdf, 0xcd, 0x36, 0x78, 0x75, 0x87, 0x7c, 0xa2, 0xaf, 0x7e, 0x3b, 0x5f, 0xc6, 0x21, 0xfd, 0xdf, 0x9d, 0x20, 0xb7, 0xe9, 0x34, 0x0f, - 0x39, 0x30, 0x6f, 0x48, 0x5f, 0x47, 0xed, 0xcd, 0x85, 0x29, 0x3e, 0xce, 0xa1, 0x99, 0x67, 0xd4, 0xa2, 0x91, 0xa3, 0x79, 0x59, 0xd5, 0x02, 0xdb, 0x38, 0xdb, 0x32, 0xc1, 0xd9, 0xc4, 0xda, 0xc8, - 0x4d, 0x33, 0x03, 0xa1, 0x7c, 0x6d, 0x58, 0xdb, 0x41, 0x8a, 0x04, 0x60, 0xb2, 0x6b, 0x3b, 0x6b, 0x3e, 0x01, 0x73, 0xb8, 0xdd, 0xf5, 0x0d, 0x4a, 0xbb, 0x4d, 0x45, 0x80, 0x00, 0x2d, 0x26, 0x70, - 0x96, 0x0b, 0x64, 0xb9, 0xb1, 0xe9, 0x20, 0xf5, 0x34, 0x46, 0x9e, 0x4f, 0x84, 0xa6, 0x95, 0x1f, 0xb7, 0x39, 0x7c, 0xa3, 0x9c, 0xba, 0x91, 0xf1, 0x16, 0xdb, 0xe4, 0x77, 0xc7, 0x66, 0xa4, 0x2e, - 0x74, 0xe5, 0x95, 0xdf, 0x67, 0x4e, 0x11, 0x05, 0xc9, 0xf9, 0xfe, 0xc2, 0xf2, 0x50, 0x5c, 0xe9, 0x23, 0xfd, 0xb7, 0x23, 0xf4, 0xeb, 0xea, 0xd8, 0xf8, 0x92, 0x9c, 0x95, 0x0b, 0x3d, 0xca, 0x8e, - 0x16, 0xdd, 0x0a, 0xa2, 0xb4, 0x80, 0x61, 0x83, 0x62, 0xd1, 0x0d, 0x58, 0xe1, 0x3b, 0x62, 0x13, 0x2f, 0x9a, 0x92, 0xea, 0x5c, 0x61, 0xbf, 0x6c, 0x63, 0xdc, 0x92, 0x4a, 0x64, 0x57, 0xfa, 0x3c, - 0x82, 0x49, 0x86, 0x72, 0x6e, 0x6d, 0x1c, 0xa4, 0x13, 0x52, 0xd0, 0xe8, 0x23, 0x53, 0x96, 0x2d, 0xec, 0xa8, 0xa9, 0x45, 0x50, 0x86, 0x7c, 0x54, 0x40, 0xad, 0x4e, 0x1e, 0x57, 0x93, 0x3e, 0x19, - 0xa6, 0xdb, 0x29, 0x76, 0x2b, 0xf5, 0x2f, 0x9d, 0xb9, 0xff, 0x15, 0x43, 0x59, 0x3d, 0xeb, 0x40, 0x9f, 0x2f, 0x85, 0x8f, 0x40, 0xf5, 0x5d, 0x28, 0x02, 0xd3, 0xeb, 0xff, 0x29, 0x36, 0x0e, 0xa8, - 0x4f, 0x67, 0xea, 0x18, 0xc5, 0x4f, 0x01, 0xb6, 0x15, 0x84, 0x15, 0xbd, 0x24, 0x62, 0x18, 0x46, 0x2a, 0x7b, 0x86, 0x18, 0x95, 0x0f, 0x3b, 0x09, 0x6b, 0x9d, 0x76, 0x9e, 0x40, 0x85, 0x4c, 0x31, - 0x4b, 0xbc, 0x9a, 0x30, 0xed, 0xf5, 0x42, 0x96, 0xce, 0x58, 0xcc, 0x03, 0xad, 0xcc, 0x35, 0x68, 0xcf, 0xc9, 0x16, 0x9b, 0x50, 0xfb, 0x84, 0x35, 0xa9, 0xa5, 0x6f, 0xa0, 0x65, 0x6a, 0x4a, 0xdd, - 0xac, 0xff, 0xb6, 0x31, 0xe9, 0x17, 0x96, 0x5e, 0xd8, 0xbc, 0x2e, 0x6f, 0x37, 0x7a, 0x61, 0x94, 0xda, 0x46, 0xe9, 0xff, 0xb4, 0xa2, 0x34, 0x71, 0xec, 0x97, 0x3c, 0x10, 0xf4, 0x3d, 0x22, 0xee, - 0xf3, 0xa7, 0xaa, 0xa2, 0x4e, 0x2c, 0xa3, 0x72, 0x9e, 0x3f, 0x84, 0xbe, 0x5b, 0x49, 0xdf, 0xa6, 0x66, 0xdd, 0x41, 0x22, 0x7a, 0xe3, 0xa4, 0x7f, 0xfa, 0xc4, 0xfb, 0x36, 0x94, 0x1f, 0xbd, 0xc9, - 0xbf, 0x2f, 0x24, 0x10, 0x38, 0x32, 0xea, 0x76, 0x1d, 0xd7, 0x9b, 0x4b, 0x57, 0x36, 0x7d, 0x6e, 0x0c, 0xa1, 0x0f, 0xcc, 0x7b, 0x23, 0x6c, 0x80, 0xe9, 0xd3, 0xdf, 0xe9, 0xe5, 0xfb, 0xdf, 0x8b, - 0x0d, 0x2e, 0xd1, 0x70, 0x84, 0x4d, 0xb6, 0xe4, 0x7e, 0xd7, 0xba, 0x13, 0x9c, 0xab, 0x4f, 0xa9, 0x65, 0x1e, 0x1b, 0x59, 0xb4, 0x85, 0x1a, 0x43, 0x80, 0xaa, 0x90, 0x1d, 0x65, 0x57, 0xc3, 0xdb, - 0x55, 0x7b, 0xf6, 0xac, 0x2a, 0xa9, 0x4d, 0xc8, 0xa8, 0xd3, 0xd5, 0xe4, 0x04, 0x1d, 0x4f, 0x56, 0x0c, 0xce, 0x29, 0x85, 0xc3, 0xf3, 0xba, 0x2e, 0xad, 0x62, 0xc8, 0xe3, 0xc5, 0xde, 0xd8, 0xb1, - 0x14, 0xf0, 0x27, 0xa1, 0xcf, 0x6b, 0x93, 0x2a, 0xc7, 0xc9, 0xa6, 0x4e, 0x5e, 0x1b, 0xd7, 0x9e, 0x01, 0x1f, 0xba, 0xa5, 0x5e, 0x6a, 0xb7, 0x4a, 0xcb, 0x77, 0x62, 0x63, 0x5a, 0x15, 0xc6, 0x13, - 0xd3, 0x9c, 0xbf, 0xfe, 0xd7, 0x67, 0x49, 0x18, 0x9f, 0x43, 0xca, 0x5c, 0xad, 0x95, 0x1b, 0x51, 0xaa, 0x8b, 0xe0, 0x1a, 0xa9, 0xba, 0x0a, 0xc9, 0x27, 0x0a, 0xec, 0xa7, 0x0e, 0xa4, 0xbb, 0xe5, - 0xad, 0x63, 0x5c, 0x4b, 0x4e, 0x96, 0x9a, 0x4e, 0xe1, 0x0c, 0xe7, 0x20, 0x79, 0x4c, 0x78, 0xee, 0xf0, 0xe1, 0x33, 0x69, 0x7a, 0xac, 0x35, 0xda, 0x67, 0x0f, 0x00, 0xa6, 0x9f, 0x5e, 0x1e, 0xdb, - 0x14, 0x8d, 0xe7, 0x08, 0x40, 0x9c, 0x27, 0x88, 0x16, 0x6a, 0xfe, 0x5a, 0x4f, 0xa0, 0x68, 0xe7, 0x9f, 0x57, 0xc6, 0x82, 0x52, 0x04, 0x55, 0x96, 0xb4, 0xf0, 0xe8, 0x1f, 0x50, 0x72, 0x01, 0xc8, - 0x89, 0xd0, 0x10, 0x5d, 0xe3, 0xe5, 0x55, 0x9e, 0x2d, 0xb4, 0xf9, 0x5a, 0x40, 0x63, 0x59, 0xea, 0xf6, 0x1d, 0x24, 0x47, 0x29, 0x5a, 0xe5, 0x83, 0x93, 0x9b, 0x60, 0x29, 0x44, 0x45, 0x6d, 0x08, - 0x3d, 0x62, 0xd7, 0x77, 0x96, 0xa9, 0xaf, 0x98, 0xf9, 0x45, 0x7b, 0x6e, 0x08, 0x79, 0xc0, 0x0b, 0xf1, 0x44, 0xf1, 0xb2, 0x64, 0x5f, 0xba, 0x72, 0x3f, 0x91, 0xf8, 0x9e, 0x17, 0x20, 0x70, 0x82, - 0x41, 0xb1, 0x95, 0xd7, 0xea, 0x59, 0xb2, 0x14, 0x6a, 0x1f, 0xa0, 0x8b, 0xc5, 0xbe, 0x9c, 0x08, 0x0b, 0x5e, 0xd7, 0xdb, 0x5c, 0xdc, 0x1a, 0x41, 0xc6, 0x50, 0xcb, 0x36, 0x83, 0x40, 0x5b, 0xe2, - 0x82, 0xec, 0xd0, 0xec, 0xf5, 0x56, 0x55, 0xa9, 0x00, 0x84, 0x4e, 0x80, 0x70, 0x8e, 0xd6, 0x4c, 0xcf, 0x6e, 0x57, 0xfe, 0xda, 0x0a, 0x53, 0xeb, 0x3c, 0xa1, 0xb7, 0x09, 0xe9, 0xee, 0x16, 0xab, - 0xc7, 0x55, 0x9f, 0xdb, 0x69, 0xf7, 0x37, 0xf4, 0x7e, 0xda, 0x5d, 0xfd, 0xad, 0xf6, 0xf3, 0xcd, 0x77, 0x33, 0xcd, 0x4e, 0xab, 0xc0, 0x4b, 0xd2, 0x6b, 0xbf, 0xdf, 0xbf, 0xc1, 0xf7, 0x4a, 0xaf, - 0x9b, 0x16, 0x53, 0xc7, 0xb8, 0x82, 0x20, 0xfe, 0x0d, 0xfe, 0x44, 0x6e, 0xdd, 0x15, 0x6e, 0x9d, 0x58, 0x4f, 0xa6, 0xda, 0xab, 0xb3, 0xf7, 0xe3, 0xc3, 0x5f, 0xe0, 0x02, 0xfe, 0x7e, 0xda, 0x0c, - 0xb1, 0xb7, 0x77, 0x7c, 0xa3, 0x7c, 0xfd, 0x49, 0x37, 0x54, 0x83, 0xc4, 0x77, 0x8a, 0xe0, 0x8a, 0x9d, 0xf9, 0x37, 0x7c, 0xe3, 0x6f, 0xbf, 0x46, 0x1d, 0x5f, 0x1d, 0x91, 0x97, 0xef, 0xde, 0xe0, - 0xfb, 0xc6, 0x41, 0x12, 0xc4, 0xc1, 0x15, 0xa5, 0xfb, 0xef, 0x27, 0xdb, 0xec, 0xe6, 0xee, 0xc7, 0xfa, 0x93, 0xbf, 0xa1, 0x9b, 0x02, 0xd5, 0x5f, 0x72, 0xf3, 0xf2, 0x36, 0x1f, 0xef, 0x3e, 0xe3, - 0xd2, 0x3c, 0xb1, 0xe3, 0xd3, 0x7d, 0xeb, 0x63, 0xe8, 0xf1, 0xfa, 0x4b, 0x6e, 0xd8, 0xf2, 0x1e, 0x01, 0xe6, 0x13, 0xbf, 0xc8, 0x87, 0x54, 0xf2, 0x67, 0xe1, 0xbf, 0x24, 0x92, 0x5f, 0x8e, 0x47, - 0x2c, 0x3e, 0xaf, 0x9d, 0xb1, 0x3e, 0x9b, 0x32, 0xe0, 0x43, 0xb6, 0xef, 0x33, 0xcd, 0xa7, 0x49, 0x73, 0x3d, 0x9a, 0x82, 0xe3, 0xac, 0xe0, 0x09, 0x03, 0xee, 0x76, 0x5e, 0x18, 0xa6, 0x73, 0x52, - 0xd7, 0x60, 0xce, 0xb5, 0x1b, 0xd1, 0x65, 0x27, 0xdc, 0x76, 0x47, 0x15, 0x5d, 0xa4, 0xed, 0x4f, 0x8e, 0x35, 0xa3, 0x0d, 0xf1, 0x24, 0x42, 0xae, 0x83, 0xad, 0x7b, 0xdf, 0x05, 0x01, 0x77, 0x1f, - 0x6f, 0x40, 0x73, 0x15, 0xe8, 0xd0, 0x8a, 0x20, 0x15, 0xcc, 0x62, 0xb4, 0x08, 0xde, 0x65, 0x51, 0x25, 0x65, 0xd5, 0x10, 0x6a, 0xdb, 0xe3, 0xf2, 0xbc, 0x1d, 0x59, 0x8b, 0x6a, 0x06, 0x49, 0x55, - 0x38, 0xd7, 0x50, 0xc3, 0x35, 0x20, 0x31, 0x82, 0x79, 0x4e, 0x57, 0x4d, 0xbf, 0xd2, 0x12, 0x1f, 0x83, 0xe4, 0xfc, 0x45, 0xf6, 0x89, 0x85, 0xaf, 0x27, 0x63, 0xe0, 0x38, 0xa1, 0xa9, 0x0b, 0xe1, - 0xe9, 0x1a, 0xc3, 0x16, 0xaa, 0xe7, 0x2e, 0xa8, 0x66, 0xe7, 0xee, 0x53, 0xa5, 0x14, 0x89, 0x49, 0x64, 0xed, 0xa4, 0xdf, 0x5d, 0x4a, 0xdf, 0xb5, 0xdf, 0xfe, 0xe7, 0x6c, 0x98, 0x1b, 0xca, 0x4f, - 0xef, 0xf8, 0xf6, 0x7c, 0xac, 0xdd, 0x72, 0x36, 0xe8, 0x3c, 0x86, 0xe8, 0xa5, 0x32, 0xcf, 0x32, 0x84, 0xd7, 0x5a, 0x99, 0x40, 0x08, 0xf8, 0xc8, 0x9a, 0x49, 0xa6, 0x25, 0xf2, 0x99, 0x9f, 0x77, - 0x0c, 0x3f, 0xb7, 0xa5, 0x0a, 0x21, 0xe1, 0x89, 0x1d, 0x6b, 0xc1, 0x91, 0xd0, 0xa0, 0xbd, 0xd0, 0xc6, 0x2b, 0xa1, 0x5b, 0x2c, 0x8b, 0xa5, 0x84, 0xe2, 0x82, 0xe9, 0xeb, 0x73, 0x6c, 0x83, 0xf5, - 0xbe, 0xce, 0x6b, 0x75, 0x4f, 0x09, 0x3b, 0x7c, 0xac, 0xb0, 0xdc, 0x69, 0x83, 0x3e, 0x42, 0x62, 0x5e, 0x67, 0xf5, 0x3d, 0x6e, 0xfe, 0x7e, 0xe1, 0xf7, 0x33, 0xcd, 0x2b, 0x1f, 0x9f, 0x8e, 0x2e, - 0x1c, 0xfc, 0xa6, 0xf4, 0x1b, 0x9a, 0xd2, 0xb6, 0xb2, 0x01, 0xb0, 0x9c, 0xe0, 0xb5, 0xc8, 0x2b, 0x4d, 0xeb, 0xbc, 0x3c, 0x40, 0x13, 0x3a, 0x35, 0x02, 0xd4, 0x55, 0x7f, 0x57, 0x50, 0x82, 0xa4, - 0xff, 0xa2, 0x59, 0x0b, 0x04, 0xfe, 0x44, 0x1f, 0xb1, 0x95, 0x9e, 0xa9, 0x3e, 0xbd, 0xd7, 0xf3, 0xe1, 0xf4, 0x4a, 0xea, 0x7b, 0xd9, 0x30, 0xeb, 0xdd, 0x7a, 0x68, 0xf1, 0x2c, 0xcb, 0xfb, 0xb8, - 0x16, 0x90, 0xac, 0x82, 0xc0, 0x90, 0x3d, 0x03, 0x98, 0xc4, 0x39, 0xfa, 0xce, 0x0c, 0xec, 0xc0, 0xe7, 0x24, 0x75, 0xc2, 0x63, 0x65, 0xea, 0xad, 0xb0, 0x65, 0x42, 0x0e, 0x0c, 0x98, 0x57, 0xf4, - 0x71, 0xcd, 0xd6, 0x7e, 0x0b, 0x75, 0x88, 0xdd, 0xf3, 0xde, 0x61, 0x07, 0x6c, 0x15, 0x66, 0xad, 0x97, 0xca, 0x96, 0x80, 0x26, 0x3d, 0x35, 0xec, 0x7e, 0x27, 0x97, 0x0a, 0x1a, 0xb5, 0x7c, 0xa4, - 0xcf, 0xe5, 0xb2, 0x85, 0x91, 0x78, 0xf7, 0x96, 0x90, 0xd9, 0x43, 0xc1, 0xc5, 0x5b, 0xd2, 0x4f, 0x2c, 0xbc, 0xb9, 0x30, 0x9d, 0x8d, 0x0b, 0x32, 0x62, 0x33, 0x11, 0x0f, 0x06, 0x4c, 0x9b, 0xf5, - 0xcb, 0x02, 0xb2, 0x5a, 0xcb, 0x6b, 0xa4, 0xce, 0x34, 0xd7, 0x2d, 0xae, 0x9e, 0x11, 0x4f, 0xe8, 0x67, 0xf6, 0xda, 0xae, 0x74, 0xb4, 0xa0, 0x1b, 0x67, 0x97, 0xfb, 0x85, 0xbd, 0x11, 0x27, 0xbb, - 0x00, 0x60, 0x3b, 0xac, 0xea, 0xb7, 0x20, 0xbf, 0x34, 0x27, 0x30, 0x43, 0xf5, 0x89, 0x43, 0x71, 0x9b, 0x80, 0xc9, 0x8b, 0x05, 0x4d, 0xed, 0xf9, 0x33, 0x51, 0x3e, 0x6e, 0x43, 0x04, 0xe5, 0x34, - 0xa9, 0x63, 0xd3, 0xf9, 0x23, 0xc3, 0x7f, 0xdc, 0x3c, 0x4d, 0x6b, 0xeb, 0x7e, 0x69, 0xd5, 0x23, 0x40, 0xa2, 0x17, 0x8a, 0x97, 0x81, 0xa8, 0x2d, 0x7f, 0x2c, 0x88, 0xe8, 0x91, 0xec, 0x08, 0xb5, - 0x9f, 0x29, 0xbb, 0x4a, 0xd8, 0xcb, 0xd5, 0x3a, 0x9f, 0x70, 0x20, 0x02, 0x94, 0x5b, 0xba, 0xd0, 0xa8, 0x1d, 0xdb, 0xb5, 0xb4, 0x95, 0xd7, 0x7b, 0x11, 0xb6, 0x50, 0x64, 0xe7, 0x80, 0x08, 0x30, - 0x2f, 0x9d, 0x22, 0x94, 0xc8, 0xf5, 0x50, 0x85, 0xf2, 0x80, 0xad, 0xce, 0x1b, 0x67, 0x98, 0xd3, 0x80, 0x1f, 0x39, 0xfd, 0x42, 0x53, 0x48, 0x66, 0xd7, 0xb6, 0xba, 0xda, 0xce, 0xa3, 0xc7, 0x7d, - 0x33, 0x49, 0x9a, 0xbd, 0xe8, 0x44, 0xe0, 0xa7, 0x88, 0xe4, 0x1f, 0x34, 0x92, 0x27, 0xa6, 0xbe, 0xf0, 0xf2, 0xa2, 0x96, 0xbc, 0x5e, 0x18, 0x57, 0xe2, 0x76, 0x49, 0x90, 0x4a, 0x9c, 0x36, 0x7a, - 0x37, 0xa4, 0x7f, 0x9e, 0x6e, 0x7c, 0x43, 0xf9, 0x69, 0x5c, 0xde, 0x9e, 0x8f, 0x4e, 0x2f, 0x86, 0x44, 0xa5, 0x5c, 0x20, 0xd5, 0xa9, 0x58, 0x97, 0x3b, 0xe6, 0xbc, 0x39, 0x0f, 0xec, 0x6a, 0xd2, - 0xce, 0x57, 0xf0, 0xb2, 0xef, 0x5c, 0x8d, 0x49, 0x51, 0xb5, 0xdf, 0x58, 0x68, 0xb6, 0xda, 0x4d, 0x26, 0x2b, 0x2e, 0x4c, 0x72, 0x90, 0xdd, 0xec, 0xb1, 0xb9, 0x82, 0x70, 0xb8, 0x0d, 0x00, 0xde, - 0xb6, 0x58, 0x6d, 0xdb, 0x1e, 0x85, 0xe7, 0x66, 0x5a, 0x8b, 0x4e, 0x69, 0x3d, 0xe9, 0x9e, 0xea, 0xe4, 0xdb, 0xb4, 0x8a, 0xef, 0x04, 0x7c, 0x0c, 0x5b, 0xcb, 0xe9, 0xf3, 0x17, 0x3e, 0x63, 0xe8, - 0xfc, 0xa1, 0x32, 0x84, 0x67, 0x9a, 0x4f, 0xac, 0xbc, 0x1e, 0x4d, 0xe7, 0xe3, 0x8a, 0x0f, 0x7c, 0x31, 0xaa, 0x70, 0x7d, 0x41, 0x2d, 0x65, 0x89, 0x71, 0x41, 0x84, 0x83, 0x67, 0x48, 0x5f, 0xed, - 0x4e, 0x88, 0xcd, 0x9a, 0x0c, 0xcf, 0x14, 0x8b, 0x7c, 0x9e, 0xaf, 0xd9, 0xa3, 0x7a, 0x9a, 0x6b, 0xec, 0x29, 0x82, 0x06, 0xbc, 0x3d, 0x25, 0xde, 0xbe, 0x40, 0x04, 0x69, 0xd6, 0xc5, 0x75, 0x40, - 0xa4, 0xf0, 0xc2, 0xe8, 0x4a, 0x81, 0xef, 0xd6, 0x43, 0x68, 0xb8, 0x3b, 0x35, 0x38, 0x92, 0x29, 0xb4, 0xfa, 0x03, 0xff, 0x56, 0xf1, 0xe2, 0x7b, 0x7c, 0x17, 0xa8, 0xb4, 0x0a, 0xc7, 0xa8, 0x9c, - 0x9b, 0x6d, 0x1f, 0x7a, 0xff, 0x99, 0xd7, 0x2e, 0xdc, 0xe8, 0x87, 0xa8, 0xa9, 0x71, 0x76, 0xa6, 0x4e, 0x51, 0xa4, 0xc5, 0xeb, 0x37, 0x6f, 0xee, 0x7f, 0x5a, 0xb5, 0xf3, 0xa4, 0x58, 0xcc, 0x7e, - 0x42, 0xf8, 0xdb, 0x0f, 0xf6, 0xaf, 0x8b, 0xd0, 0x27, 0x09, 0x16, 0x1f, 0x4d, 0x82, 0xd7, 0x91, 0xfe, 0xcb, 0x0e, 0xca, 0x0a, 0x78, 0x46, 0x58, 0xfb, 0xbf, 0x3e, 0x7c, 0x62, 0x5a, 0x5a, 0x45, - 0x70, 0x9d, 0xde, 0x2f, 0x1f, 0x7c, 0xbe, 0x74, 0xe7, 0xf3, 0x55, 0x61, 0x24, 0x65, 0x16, 0x44, 0xce, 0x34, 0x4d, 0xa2, 0xfe, 0xe6, 0x7b, 0xaf, 0xb7, 0x3e, 0x7e, 0xf5, 0xee, 0x53, 0xa6, 0xb6, - 0x93, 0x15, 0x8e, 0x65, 0x54, 0x8e, 0xfd, 0x18, 0x98, 0xcb, 0xe7, 0xbb, 0xc1, 0xfb, 0x48, 0xe3, 0x47, 0x2f, 0xcf, 0xaf, 0x5f, 0xf4, 0x7f, 0xff, 0x6f, 0xf8, 0x27, 0x3e, 0x6a, 0xf6, 0xdc, 0xcb, - 0xfc, 0x03, 0x7f, 0xc2, 0x0f, 0xa9, 0x3a, 0xa5, 0x7d, 0x99, 0x36, 0xf6, 0xf4, 0x4a, 0xe0, 0xfb, 0x39, 0x53, 0xd2, 0x93, 0x92, 0x80, 0x00, 0xd8, 0xe0, 0x50, 0x59, 0xf6, 0x83, 0x98, 0xa2, 0xab, - 0xca, 0x46, 0xbb, 0x8c, 0xe4, 0x4d, 0x75, 0x75, 0x4c, 0x52, 0x6e, 0xcf, 0x9e, 0x81, 0x94, 0x38, 0x53, 0xc4, 0xf2, 0x0c, 0x23, 0x61, 0x14, 0x3a, 0x32, 0x7f, 0x0c, 0xcb, 0x6e, 0xb5, 0x89, 0x85, - 0xf8, 0xb4, 0xab, 0x77, 0x0a, 0x3f, 0x2f, 0x5b, 0xb9, 0x82, 0x4c, 0x2c, 0xd0, 0x5c, 0x55, 0x53, 0x2c, 0x25, 0xf8, 0x03, 0xc8, 0xbf, 0xff, 0x7c, 0x7a, 0x83, 0x5b, 0x66, 0xfe, 0x8d, 0xfe, 0x24, - 0xde, 0xa7, 0x82, 0x46, 0x41, 0x52, 0x3d, 0xb7, 0x21, 0xac, 0x9c, 0x62, 0x7a, 0xe9, 0xc2, 0xdf, 0x7f, 0x3e, 0xd9, 0xbc, 0x28, 0x35, 0xcd, 0xeb, 0x3d, 0x08, 0xfa, 0x98, 0x81, 0x90, 0xb6, 0x97, - 0x5b, 0xf3, 0xf7, 0x06, 0xf6, 0x05, 0xf0, 0xd7, 0xe9, 0x82, 0xb2, 0x2a, 0xff, 0xfa, 0xd4, 0x73, 0x7c, 0xdb, 0x08, 0xed, 0xae, 0x12, 0xf1, 0xc9, 0x3c, 0xb2, 0x5f, 0x85, 0xd6, 0x8a, 0x82, 0x87, - 0x44, 0x14, 0xfd, 0x09, 0x8d, 0x69, 0x2b, 0x5b, 0x95, 0x51, 0x60, 0xde, 0xf5, 0xf6, 0x41, 0x8f, 0x09, 0x58, 0x14, 0x98, 0x17, 0x11, 0x8b, 0x02, 0x73, 0x7a, 0x25, 0xf2, 0xbd, 0x90, 0x69, 0x49, - 0x80, 0xcc, 0xf8, 0xed, 0x10, 0x7a, 0x5c, 0xd1, 0x3a, 0x4d, 0x5f, 0xb2, 0x0a, 0xb5, 0x28, 0xaa, 0x1d, 0x9d, 0x89, 0x4d, 0xef, 0x10, 0xc3, 0x01, 0x00, 0x97, 0xe8, 0xb2, 0x3f, 0x25, 0x28, 0x22, - 0xe2, 0x00, 0x9e, 0x37, 0x52, 0x2b, 0xfa, 0x73, 0x92, 0x39, 0xb3, 0x4e, 0x6b, 0x72, 0x75, 0x74, 0x48, 0x2a, 0x33, 0xf0, 0x62, 0x4b, 0xc1, 0x0b, 0x5b, 0x43, 0x48, 0x3e, 0x9d, 0xb7, 0xf2, 0xe6, - 0xf7, 0x3d, 0x7a, 0x57, 0xb1, 0xb1, 0xd2, 0xc4, 0x0d, 0xbc, 0xab, 0xcc, 0x7c, 0x05, 0x03, 0x01, 0x11, 0x8f, 0x28, 0x67, 0x9f, 0x3e, 0xe3, 0x99, 0x61, 0x1f, 0x6f, 0x4c, 0xaf, 0x8f, 0xf9, 0x9e, - 0x83, 0x9d, 0xd8, 0xce, 0x45, 0x8f, 0x17, 0x77, 0x0c, 0x12, 0x6c, 0xe5, 0x2e, 0xde, 0xe2, 0xf4, 0xb1, 0x98, 0x2c, 0x0d, 0x60, 0x3f, 0x14, 0x8d, 0xcb, 0x56, 0xe1, 0xaa, 0x9a, 0xed, 0xc8, 0x08, - 0x83, 0xbc, 0x33, 0xac, 0x92, 0x0c, 0x40, 0x93, 0xf3, 0x33, 0xa5, 0xc9, 0x61, 0x33, 0xe9, 0xfa, 0xb5, 0x0a, 0x15, 0x6a, 0x95, 0x18, 0xfd, 0xce, 0xe1, 0xd4, 0xc3, 0x86, 0xb4, 0x38, 0x8d, 0xd0, - 0x21, 0x3c, 0xa1, 0xbf, 0xdb, 0xda, 0x3e, 0x91, 0xdd, 0x4f, 0x5f, 0xc2, 0xf2, 0x1d, 0xeb, 0x82, 0x3a, 0xf8, 0xa4, 0x97, 0x5d, 0x4e, 0x1e, 0x91, 0x6a, 0x74, 0x6c, 0x88, 0xa4, 0xac, 0xab, 0x20, - 0xba, 0xaf, 0xc3, 0xc1, 0x0f, 0x29, 0xd5, 0x57, 0xa2, 0x97, 0x81, 0xba, 0x1c, 0x4d, 0xaf, 0x84, 0xbe, 0x1f, 0x99, 0x98, 0xdd, 0x6e, 0x91, 0x40, 0xd5, 0x76, 0x13, 0x44, 0x5d, 0x61, 0xdd, 0x6e, - 0x76, 0x06, 0xc5, 0xa5, 0xbf, 0x95, 0x55, 0x72, 0x2b, 0x92, 0x54, 0x03, 0x4c, 0xe4, 0xf3, 0x52, 0xc8, 0x42, 0xf9, 0xd8, 0x75, 0x1d, 0x8c, 0x6f, 0xb7, 0x32, 0x19, 0xc7, 0x0b, 0x0c, 0x5c, 0xcc, - 0x33, 0x4f, 0x50, 0x1b, 0x2e, 0x20, 0x98, 0xad, 0x2f, 0x73, 0xe2, 0x32, 0x0e, 0x49, 0x59, 0x1c, 0x4a, 0xf8, 0x88, 0x0b, 0x90, 0xf0, 0xf8, 0x02, 0xfa, 0x32, 0xe7, 0x9f, 0x14, 0x83, 0x47, 0x1a, - 0x07, 0xfe, 0xf8, 0x04, 0xd6, 0xfc, 0x77, 0xb7, 0x3e, 0xe2, 0xa5, 0x41, 0xd0, 0x0f, 0xe4, 0x27, 0xfc, 0x13, 0x9c, 0xda, 0x4e, 0xf3, 0x7a, 0x8e, 0xbc, 0x3b, 0x47, 0xdf, 0x9d, 0xcf, 0xde, 0x9d, - 0x63, 0x9f, 0x9c, 0x9b, 0x4e, 0x65, 0xbc, 0x5e, 0xc0, 0xdf, 0x7d, 0x00, 0x7f, 0xfe, 0xc0, 0x18, 0x49, 0xea, 0x33, 0xe7, 0x55, 0x78, 0x3f, 0xdf, 0x85, 0x1f, 0x09, 0xb0, 0xfd, 0x22, 0xfb, 0xd2, - 0xe7, 0xeb, 0x72, 0x32, 0x05, 0xc7, 0x85, 0xdb, 0xb4, 0xc8, 0x51, 0x53, 0x6b, 0x5e, 0xb7, 0x8c, 0x96, 0x87, 0xc7, 0x56, 0x33, 0x54, 0x45, 0x5f, 0xc4, 0x03, 0x67, 0xad, 0xf4, 0x19, 0x31, 0x23, - 0xa4, 0x05, 0xdc, 0x34, 0x1d, 0xa4, 0x16, 0xb3, 0x6e, 0x6d, 0x05, 0x9d, 0xb6, 0x16, 0x27, 0xc4, 0x2e, 0x59, 0xd1, 0x9e, 0x9c, 0x45, 0x2a, 0x02, 0xd6, 0x25, 0x56, 0x39, 0xb9, 0x1d, 0x95, 0xe7, - 0x95, 0x5b, 0x4f, 0x0c, 0x07, 0xdd, 0xe2, 0x73, 0x21, 0xfd, 0x03, 0xcc, 0x97, 0xac, 0x70, 0xa2, 0xda, 0x76, 0xa6, 0x51, 0xf9, 0x2c, 0x55, 0x8f, 0x74, 0x27, 0xfa, 0x01, 0xfe, 0x1c, 0x69, 0x2e, - 0x7f, 0xdb, 0x78, 0x8d, 0x78, 0x64, 0xd7, 0xba, 0xd3, 0x78, 0x8d, 0x18, 0xb3, 0x79, 0xa1, 0xb6, 0x39, 0xac, 0x87, 0xbc, 0x09, 0x2b, 0x2f, 0xe0, 0x66, 0x45, 0x0b, 0x9d, 0x67, 0xc5, 0x92, 0xad, - 0xc8, 0x05, 0xbf, 0x8d, 0xed, 0xda, 0xf6, 0x99, 0x9e, 0x5c, 0x1a, 0x21, 0x0f, 0x42, 0xee, 0xb2, 0xf7, 0x8d, 0xc5, 0xda, 0x2f, 0xd3, 0x2d, 0xdf, 0x63, 0x3d, 0x3e, 0x59, 0xf3, 0x73, 0x64, 0xed, - 0x66, 0xab, 0xaa, 0x3d, 0xcd, 0x83, 0x3c, 0xc0, 0xcf, 0xf4, 0xa4, 0x6b, 0xb7, 0xbe, 0x54, 0xf2, 0x9b, 0xef, 0x26, 0xf8, 0x3f, 0x61, 0x9a, 0xbd, 0x9d, 0x97, 0x9f, 0xf1, 0x12, 0xfd, 0x09, 0x3f, - 0x90, 0x86, 0xf8, 0x8b, 0xec, 0x33, 0x33, 0x9f, 0xb5, 0xee, 0x0b, 0xb5, 0xef, 0xb9, 0x79, 0x98, 0x38, 0x4d, 0x74, 0x62, 0xf5, 0x44, 0x3a, 0x1b, 0x03, 0xa1, 0xc8, 0x64, 0xdd, 0x29, 0x8b, 0x39, - 0xdc, 0xeb, 0xa4, 0x98, 0x56, 0xc5, 0x8c, 0x9d, 0x1c, 0x7d, 0x09, 0x37, 0x69, 0xc4, 0xd7, 0xd5, 0xc4, 0xee, 0x66, 0x15, 0x23, 0x18, 0x90, 0x5b, 0x53, 0x9e, 0xb3, 0x0f, 0xbb, 0xc5, 0xc0, 0x41, - 0x72, 0xc0, 0xcf, 0xd6, 0x43, 0x63, 0xd8, 0x6b, 0x4d, 0x39, 0x38, 0x6e, 0x5d, 0xb7, 0x3a, 0x25, 0x3f, 0xb0, 0x91, 0x59, 0x2f, 0xfb, 0xd5, 0xd3, 0xe1, 0xff, 0xf5, 0xf6, 0x4e, 0xe9, 0x14, 0x6f, - 0x60, 0x74, 0x5e, 0xcf, 0x7f, 0x57, 0xe4, 0xd1, 0x91, 0x8e, 0xdc, 0x3a, 0x31, 0xd3, 0x6e, 0x9a, 0x15, 0x41, 0x1c, 0x54, 0xc1, 0x17, 0xfd, 0x37, 0x1e, 0x81, 0x01, 0x7f, 0x47, 0x1b, 0x98, 0xbe, - 0xbf, 0x72, 0x09, 0xc9, 0x8e, 0x88, 0xa7, 0x60, 0x50, 0x26, 0x46, 0x14, 0x3d, 0xf7, 0x67, 0xd0, 0x21, 0x2d, 0x9c, 0x7e, 0x03, 0x92, 0xb2, 0x13, 0xd8, 0x0e, 0x87, 0x70, 0xf4, 0x96, 0xdb, 0x26, - 0x3e, 0x36, 0x39, 0xcc, 0x77, 0x20, 0x81, 0x20, 0x50, 0x90, 0xe5, 0x98, 0x44, 0x08, 0x2b, 0x4d, 0x3f, 0x05, 0xb9, 0x88, 0x25, 0x40, 0x65, 0xb2, 0x1d, 0x5a, 0xce, 0xd6, 0xf3, 0x5a, 0xf6, 0xad, - 0xde, 0xc1, 0xc8, 0xc2, 0x3c, 0x07, 0xc3, 0x99, 0xa4, 0x1f, 0x5f, 0x93, 0xbe, 0xa9, 0xfa, 0xf0, 0x8d, 0x72, 0x6a, 0x06, 0x5e, 0xf0, 0xd2, 0x14, 0xef, 0xd3, 0x0f, 0x94, 0x7d, 0x6c, 0xa6, 0xd1, - 0xaf, 0x0f, 0xdc, 0x58, 0x18, 0xad, 0x1f, 0x58, 0xfe, 0xd4, 0x4c, 0x3b, 0xc7, 0xbe, 0x19, 0x9a, 0x17, 0x5a, 0x1f, 0x84, 0xe1, 0x5f, 0x5e, 0x3b, 0x52, 0x27, 0xb6, 0xe3, 0x96, 0x86, 0x7b, 0x4f, - 0x40, 0xe0, 0x9b, 0xf0, 0xe4, 0x78, 0x01, 0x79, 0xa6, 0x7a, 0x11, 0x8d, 0xe7, 0xe3, 0x0b, 0x1c, 0xe6, 0xec, 0x7b, 0xa1, 0x38, 0x76, 0x02, 0x4f, 0x15, 0x65, 0x49, 0x72, 0x84, 0xb2, 0x17, 0xe5, - 0x9c, 0x9f, 0x2d, 0xe3, 0x32, 0x3c, 0x14, 0x65, 0x83, 0x2e, 0x08, 0x0d, 0x82, 0x37, 0xe8, 0xa2, 0x20, 0x83, 0xc0, 0xe8, 0x1b, 0x84, 0xee, 0x7b, 0x06, 0xd1, 0xa3, 0xb5, 0x87, 0xf5, 0x7d, 0x59, - 0xd7, 0xfb, 0x93, 0xad, 0x97, 0x87, 0x01, 0x51, 0xb6, 0x96, 0xe2, 0xc1, 0xae, 0x0d, 0x00, 0x6a, 0x68, 0xa3, 0x14, 0x7b, 0x80, 0x82, 0xdf, 0xae, 0xbb, 0x7e, 0x4d, 0xcb, 0xf8, 0x7c, 0x89, 0x7b, - 0x64, 0x03, 0xbf, 0x92, 0x7c, 0x62, 0xc9, 0xe5, 0x60, 0x8a, 0x8e, 0xdb, 0xb8, 0x49, 0xb0, 0x97, 0x95, 0xe1, 0x64, 0xab, 0x14, 0x95, 0xcc, 0x93, 0xc9, 0x0a, 0x9d, 0x30, 0x3e, 0xda, 0xaf, 0xe9, - 0x8a, 0x93, 0x2c, 0x63, 0x53, 0xc6, 0x27, 0x92, 0x2e, 0x95, 0x3d, 0x43, 0x78, 0x80, 0xe0, 0x84, 0x5b, 0x32, 0xb5, 0x77, 0x12, 0xbc, 0x66, 0x5d, 0x1e, 0x31, 0x39, 0x3c, 0x54, 0x4b, 0x59, 0x4b, - 0xec, 0x34, 0x53, 0x70, 0x61, 0xad, 0x1d, 0xed, 0x53, 0x6e, 0x41, 0x6e, 0x18, 0x1f, 0xb0, 0x91, 0xb0, 0x39, 0x59, 0x9d, 0xf4, 0xd6, 0xf3, 0xda, 0xf3, 0x0c, 0x04, 0x30, 0x42, 0xa6, 0xaa, 0xe0, - 0x1e, 0xea, 0xe4, 0xa5, 0xf2, 0xfe, 0x01, 0x79, 0xaa, 0x82, 0xe8, 0x89, 0x6f, 0x55, 0x10, 0x4d, 0xaf, 0x24, 0xbe, 0x67, 0xdb, 0x59, 0x77, 0x81, 0x2d, 0xe6, 0x2f, 0xd7, 0xc5, 0x91, 0x5d, 0x63, - 0x5a, 0x2e, 0xac, 0xd4, 0x20, 0xe0, 0x8c, 0x09, 0x3e, 0x6f, 0x97, 0x00, 0x4d, 0x48, 0x13, 0x9e, 0xe2, 0x17, 0x47, 0x2b, 0x3a, 0xf7, 0x1e, 0x62, 0xa2, 0x36, 0x7c, 0xc6, 0x4b, 0x50, 0x62, 0x9c, - 0x8c, 0x0f, 0x83, 0x05, 0x69, 0x4d, 0x0c, 0x19, 0xe1, 0x21, 0x71, 0xd1, 0xb3, 0x3b, 0x3c, 0xc3, 0x54, 0x6b, 0x77, 0xc2, 0x76, 0x71, 0xf1, 0x3e, 0x6d, 0xf0, 0x6e, 0x1c, 0xe0, 0x4d, 0xfc, 0xff, - 0x92, 0xf1, 0x73, 0x9b, 0x1d, 0x50, 0x4e, 0x8d, 0xc2, 0xab, 0x63, 0xe7, 0xed, 0x42, 0xf2, 0x3e, 0x43, 0xc0, 0x73, 0x12, 0xa7, 0x30, 0xaa, 0xb4, 0x98, 0xbe, 0xa4, 0x28, 0xbc, 0x7e, 0x14, 0x7f, - 0xf7, 0xd1, 0xa7, 0xdd, 0xd2, 0x9e, 0x1a, 0x45, 0x61, 0x3c, 0xfb, 0x23, 0xde, 0xd7, 0x64, 0x5c, 0x97, 0x9d, 0xcf, 0x3e, 0x36, 0x26, 0x0a, 0x54, 0xd7, 0xc1, 0x3d, 0x77, 0x12, 0xf1, 0x13, 0x79, - 0x64, 0xfb, 0xa8, 0x03, 0xfb, 0x69, 0x34, 0xeb, 0xc0, 0x9e, 0x5e, 0x28, 0x7c, 0x3f, 0x98, 0x13, 0xfe, 0x54, 0xc2, 0x92, 0xc3, 0x1d, 0xfb, 0x09, 0x73, 0x5c, 0x09, 0xcb, 0x78, 0xde, 0x25, 0x09, - 0xc6, 0x52, 0x74, 0x06, 0x46, 0xb8, 0x44, 0xd2, 0x78, 0x1c, 0x11, 0xc3, 0x4e, 0x8d, 0x37, 0x93, 0x39, 0x22, 0xcd, 0xf8, 0x15, 0xc8, 0xa7, 0xd6, 0xb2, 0x48, 0xda, 0xb3, 0x72, 0xd6, 0x0e, 0x2b, - 0x3e, 0xd0, 0x10, 0xc0, 0xcd, 0x28, 0xcc, 0x70, 0xf7, 0x04, 0xed, 0x9b, 0x80, 0x37, 0xe0, 0x32, 0xee, 0xdc, 0xcc, 0x81, 0x0f, 0x7b, 0xf9, 0xf3, 0x6b, 0xbf, 0xba, 0x01, 0xaf, 0x7c, 0xf8, 0x9e, - 0x5d, 0x0d, 0x31, 0xb5, 0xd2, 0xf8, 0xe2, 0x77, 0x7c, 0x81, 0x8e, 0xfe, 0x7c, 0x61, 0x7d, 0x24, 0x30, 0xfd, 0x9e, 0x38, 0x30, 0xfd, 0x70, 0x69, 0x6c, 0x78, 0x3a, 0x22, 0x22, 0x6a, 0x19, 0xef, - 0xac, 0xdd, 0x49, 0xf7, 0xd1, 0xc4, 0xac, 0x13, 0x5e, 0x6f, 0x24, 0x6a, 0x63, 0xcd, 0xb2, 0x06, 0x9f, 0xc8, 0x54, 0x6b, 0x10, 0x39, 0xb0, 0xb3, 0xd5, 0x8e, 0xa8, 0xf1, 0xa8, 0x3c, 0x36, 0x22, - 0xbd, 0x8d, 0xb3, 0xd4, 0xde, 0x2c, 0x36, 0x7c, 0x7b, 0x5e, 0xf8, 0x1b, 0x0a, 0x00, 0xec, 0xd5, 0x09, 0x25, 0xb6, 0xf5, 0x7a, 0x19, 0x87, 0x95, 0x8d, 0xca, 0x87, 0x80, 0x2e, 0x7e, 0x7b, 0x99, - 0xfd, 0xa6, 0x9b, 0xf5, 0xe7, 0xa6, 0xf8, 0x23, 0xf5, 0xab, 0x5f, 0x3d, 0xe8, 0x89, 0x8b, 0x5f, 0xdc, 0xbe, 0x04, 0x5b, 0x46, 0xe8, 0xa0, 0x74, 0xb6, 0x8d, 0x61, 0x35, 0x00, 0x3a, 0x1e, 0x07, - 0x58, 0x69, 0x4b, 0x55, 0x99, 0xde, 0xa5, 0xf2, 0x91, 0xf4, 0xf5, 0xb9, 0x0e, 0x9e, 0xf3, 0xaa, 0xf7, 0x18, 0x42, 0xa3, 0x3c, 0x5e, 0x22, 0xf4, 0x88, 0x4e, 0xba, 0x5a, 0x8a, 0x8f, 0x7e, 0x38, - 0xc3, 0xb0, 0x90, 0x70, 0x79, 0x94, 0xaa, 0x11, 0x60, 0x13, 0x9b, 0x7e, 0x49, 0xa7, 0xb8, 0x6b, 0x2d, 0x36, 0x39, 0x5a, 0xce, 0x7d, 0x18, 0x5f, 0x3e, 0xae, 0xcd, 0xbc, 0xc3, 0x73, 0xba, 0x87, - 0x4d, 0xf4, 0x05, 0x8c, 0xd1, 0xf7, 0xc2, 0x7e, 0x59, 0x59, 0xbe, 0x50, 0x1d, 0x7e, 0x7f, 0x71, 0xb8, 0x50, 0x04, 0xa6, 0xd7, 0xff, 0x63, 0xdb, 0xe1, 0x91, 0xbb, 0x35, 0xa2, 0x44, 0x90, 0x72, - 0x44, 0xc4, 0x26, 0xc2, 0xc1, 0x08, 0xe9, 0x73, 0xe4, 0x84, 0xa1, 0xc1, 0xc4, 0x68, 0xb3, 0x56, 0xcb, 0x4b, 0x86, 0x3c, 0x1d, 0xcf, 0xe7, 0x9c, 0xab, 0x12, 0x53, 0xf3, 0x0a, 0x8e, 0x9e, 0xf4, - 0x21, 0x5e, 0xf8, 0x47, 0xf0, 0x5c, 0x2f, 0xe9, 0x6e, 0xd8, 0x18, 0x27, 0x8d, 0x09, 0x97, 0xc7, 0x59, 0xea, 0x19, 0xd9, 0x96, 0xe7, 0x96, 0x5b, 0x9e, 0x0b, 0x03, 0xf3, 0x3b, 0x5b, 0xea, 0xab, - 0x30, 0xb0, 0xd3, 0x39, 0xaf, 0x6b, 0xff, 0x18, 0xef, 0xed, 0x25, 0x60, 0xf1, 0xc2, 0xcc, 0xd7, 0x38, 0xe4, 0xf3, 0x95, 0x0f, 0x5f, 0xff, 0xce, 0x2a, 0x1e, 0x63, 0xc6, 0xdd, 0x53, 0x45, 0xff, - 0x39, 0x2b, 0xe1, 0xd3, 0x27, 0xbc, 0x8e, 0xec, 0xbb, 0xeb, 0x63, 0x2d, 0x06, 0xb3, 0xd5, 0xed, 0x06, 0x5c, 0x6c, 0x77, 0x59, 0x16, 0xad, 0x4e, 0xf0, 0x56, 0x97, 0x35, 0x4c, 0x69, 0xfa, 0x9a, - 0xc7, 0xd3, 0x30, 0x2c, 0xf0, 0xa8, 0x3d, 0x7b, 0x58, 0x1c, 0x81, 0x45, 0xba, 0xee, 0xe7, 0x27, 0xa7, 0xde, 0x17, 0xf8, 0x66, 0x8f, 0xe0, 0x70, 0x1e, 0xf1, 0x47, 0x88, 0x50, 0xa5, 0xd3, 0xe0, - 0x9d, 0xb6, 0xf3, 0x21, 0x60, 0x2c, 0xa7, 0x38, 0xe6, 0xba, 0x10, 0x2f, 0x93, 0xf9, 0x81, 0xff, 0xce, 0xce, 0xfb, 0x32, 0xe0, 0x7f, 0xb5, 0x08, 0x5e, 0x37, 0x67, 0xe8, 0xdd, 0xe6, 0x6c, 0xa6, - 0x69, 0xe4, 0x18, 0xc9, 0xf4, 0x9a, 0xb8, 0xf7, 0xd7, 0xa7, 0x41, 0xb9, 0xd7, 0xb4, 0x81, 0xdb, 0x4f, 0x7d, 0x54, 0x0a, 0xde, 0xe4, 0x11, 0x7f, 0xc8, 0x1b, 0x0c, 0x5e, 0x6c, 0x8f, 0xbf, 0x7e, - 0x99, 0x1e, 0x1f, 0x24, 0xe7, 0x5f, 0x6e, 0x4f, 0x7c, 0xa6, 0x6a, 0x7c, 0x2e, 0x52, 0xd0, 0xcf, 0xdf, 0x47, 0xf6, 0xfb, 0x40, 0xfd, 0x55, 0x9c, 0xde, 0x5c, 0x9b, 0x5e, 0x68, 0x7f, 0x2f, 0x4a, - 0xed, 0xdc, 0x42, 0xbb, 0x73, 0x87, 0xc5, 0x62, 0x60, 0xb7, 0x19, 0x0e, 0x11, 0xa0, 0x75, 0x3e, 0x1d, 0x5d, 0x2e, 0x6e, 0xba, 0x2c, 0x8c, 0xf4, 0x7a, 0x5d, 0xdb, 0x7c, 0x45, 0xbb, 0x28, 0x0f, - 0x54, 0xca, 0x42, 0x25, 0x89, 0xc3, 0xc6, 0xd4, 0xe0, 0x59, 0xae, 0xa7, 0x8b, 0xb2, 0xa8, 0x98, 0xfa, 0xc4, 0x27, 0x4c, 0x8b, 0x64, 0x06, 0xb8, 0xd0, 0x3c, 0x93, 0xd9, 0xca, 0x24, 0x01, 0x2c, - 0x2d, 0x67, 0xa4, 0x82, 0x68, 0x34, 0x46, 0x10, 0x5d, 0x72, 0xe6, 0xde, 0xfc, 0xf0, 0xf2, 0xf3, 0x81, 0xfd, 0xc6, 0x2a, 0x7d, 0x9b, 0xdf, 0xfa, 0x5f, 0x1f, 0xf2, 0x5b, 0xbd, 0x34, 0xb3, 0x3f, - 0x97, 0xcd, 0x27, 0x63, 0xb5, 0x4a, 0xaf, 0x12, 0x55, 0x19, 0xbf, 0x84, 0xea, 0xbd, 0x64, 0x7e, 0xa6, 0x36, 0xfe, 0x76, 0xb3, 0xf7, 0xff, 0x36, 0x64, 0x94, 0x36, 0x2d, 0xec, 0x69, 0x5b, 0xdc, - 0x45, 0xef, 0x84, 0x1e, 0x82, 0x4a, 0x7a, 0xa5, 0xfa, 0x24, 0x7f, 0x2f, 0xc7, 0x17, 0x9c, 0x9c, 0x11, 0xb9, 0xd7, 0xec, 0x00, 0xc4, 0x05, 0xdf, 0x06, 0x15, 0x2f, 0xfb, 0x00, 0xab, 0x2e, 0x2a, - 0x0e, 0x38, 0x28, 0xc0, 0xec, 0xc0, 0x4e, 0x7a, 0x8f, 0xc6, 0xe8, 0x03, 0x1e, 0x9f, 0xb6, 0xfa, 0xa2, 0x62, 0x85, 0xc2, 0x2c, 0x09, 0x15, 0x8f, 0x1a, 0x71, 0x8f, 0x75, 0x2e, 0xbe, 0xdc, 0x6c, - 0xb9, 0x15, 0x58, 0x1f, 0xa1, 0xed, 0x86, 0x8a, 0x40, 0x16, 0x07, 0x21, 0x0f, 0xd1, 0x99, 0xba, 0x9c, 0xc4, 0xf5, 0x72, 0xd6, 0x7c, 0x97, 0xb3, 0xf4, 0x4f, 0x61, 0x77, 0x3e, 0xbd, 0x68, 0x76, - 0x7f, 0x52, 0x3f, 0xb4, 0x4f, 0x5c, 0x48, 0x3e, 0x71, 0xf2, 0x72, 0x30, 0x66, 0x27, 0x80, 0xa6, 0xd5, 0x5e, 0x9a, 0x87, 0x03, 0x4e, 0xe6, 0xa1, 0xd6, 0xf1, 0xe7, 0xd3, 0xaa, 0x59, 0x80, 0x12, - 0x5f, 0x73, 0xdb, 0x2a, 0x23, 0x7e, 0x53, 0x03, 0xed, 0xaa, 0xfb, 0x40, 0x39, 0xe8, 0x43, 0x2f, 0x74, 0xa1, 0x08, 0x4c, 0xaf, 0xff, 0x2f, 0xb0, 0xca, 0x23, 0x36, 0xb6, 0xdd, 0xf6, 0xa4, 0x42, - 0xc1, 0x42, 0xdb, 0x68, 0xaa, 0xb7, 0xd0, 0x92, 0xb9, 0x2a, 0x87, 0x41, 0x3d, 0xe1, 0x8e, 0x7e, 0xaf, 0x6a, 0x6c, 0xd9, 0xb8, 0x19, 0x1e, 0x5b, 0xf5, 0x29, 0x9e, 0xdb, 0x7b, 0x75, 0xbb, 0x05, - 0x01, 0x2a, 0xac, 0x0a, 0xb5, 0x5d, 0x2d, 0x3a, 0x9a, 0x80, 0x81, 0x98, 0x3a, 0x9a, 0xd5, 0xae, 0x64, 0xc2, 0xd5, 0xda, 0xb0, 0xc1, 0x76, 0x5d, 0xa6, 0x36, 0x3a, 0x14, 0xca, 0x62, 0xf9, 0x3b, - 0xbd, 0x29, 0xc1, 0x51, 0x3d, 0x3c, 0x7b, 0x23, 0x8a, 0x82, 0xbb, 0x6e, 0xf4, 0xc7, 0x00, 0xa9, 0x9f, 0x69, 0x02, 0xd3, 0x97, 0xa3, 0xb1, 0x50, 0xd4, 0x48, 0x6b, 0x33, 0x81, 0xad, 0xf7, 0xf9, - 0x4c, 0x24, 0x41, 0x02, 0xd5, 0x76, 0xcb, 0xfd, 0x4c, 0xc9, 0x84, 0xbd, 0xbc, 0x40, 0xda, 0x50, 0x5b, 0x44, 0xeb, 0x23, 0xe7, 0xd7, 0x31, 0x7c, 0x96, 0xad, 0x06, 0x40, 0xa1, 0x7d, 0x02, 0x3b, - 0xb1, 0x04, 0xda, 0xbd, 0x25, 0x1d, 0xd1, 0x5a, 0xd7, 0x76, 0x4e, 0xd8, 0x6e, 0x1b, 0x0f, 0x5b, 0x96, 0x8d, 0x69, 0x47, 0x87, 0xdd, 0x64, 0x75, 0x5a, 0x5a, 0x15, 0xfe, 0x75, 0x53, 0xc5, 0xde, - 0x28, 0xbc, 0xf2, 0x9b, 0x4e, 0x3b, 0x4f, 0xe3, 0xfd, 0xfb, 0x7b, 0xdb, 0x5b, 0xca, 0x17, 0x56, 0xfc, 0x3a, 0x9d, 0x5e, 0x49, 0x7e, 0xcf, 0x90, 0x1e, 0x82, 0x12, 0x66, 0x19, 0x29, 0xeb, 0xc3, - 0x84, 0x52, 0x10, 0xbd, 0x99, 0x57, 0xf8, 0x61, 0x1b, 0x4d, 0x24, 0xc4, 0x57, 0xa4, 0x54, 0x99, 0x1b, 0x90, 0x34, 0x38, 0x83, 0xef, 0x47, 0x98, 0x9c, 0xc1, 0x90, 0xb7, 0x01, 0xd6, 0x07, 0xe5, - 0x88, 0xeb, 0x48, 0x3f, 0x5f, 0x1e, 0x35, 0xbf, 0x56, 0x49, 0x0a, 0xde, 0xfb, 0x89, 0x3b, 0xa1, 0x35, 0xd0, 0x48, 0x2a, 0xc7, 0xca, 0x16, 0xed, 0x5e, 0x24, 0xbe, 0xb3, 0x40, 0xbe, 0xcb, 0x2a, - 0x18, 0xb3, 0xac, 0xf4, 0xc9, 0x5d, 0x63, 0xef, 0x91, 0x54, 0xaf, 0x3e, 0x79, 0xe2, 0x60, 0x32, 0x16, 0x5d, 0x56, 0xed, 0xd0, 0xde, 0x63, 0x8e, 0x65, 0x0d, 0x5b, 0x78, 0x50, 0xae, 0x8e, 0x0e, - 0x71, 0xaa, 0xa1, 0x53, 0x54, 0x6f, 0xe2, 0xfc, 0xe0, 0x77, 0xf9, 0x16, 0xb6, 0x76, 0x1a, 0x2f, 0x2d, 0x66, 0x0b, 0x8b, 0x42, 0x24, 0xd7, 0x64, 0xf8, 0x8c, 0xc3, 0xdd, 0x1a, 0x3c, 0x11, 0x26, - 0x30, 0x40, 0x58, 0xa6, 0xed, 0x92, 0x55, 0xa7, 0x9f, 0x9a, 0xa3, 0x6f, 0x23, 0xae, 0x4f, 0x9e, 0xe6, 0xf4, 0x2e, 0xa6, 0xb0, 0x3f, 0x5c, 0x91, 0xdf, 0x27, 0x62, 0xfc, 0xc7, 0x33, 0xe7, 0x3e, - 0x57, 0x2a, 0xfe, 0xfa, 0x4f, 0xd3, 0x30, 0x9d, 0x08, 0xb8, 0x60, 0xd8, 0xb9, 0x85, 0x11, 0xdf, 0x53, 0xe5, 0xf1, 0x9f, 0x10, 0xfc, 0x13, 0xfa, 0x7d, 0x8e, 0x7e, 0xa0, 0x0f, 0x4c, 0xdf, 0x9c, - 0x4c, 0x9f, 0xc9, 0x7e, 0xcf, 0x6a, 0xbd, 0x82, 0xfa, 0xd4, 0x26, 0x3b, 0x48, 0xb5, 0xfa, 0xc0, 0x11, 0xb9, 0xfd, 0xf9, 0x98, 0xa8, 0xa8, 0x2f, 0xe6, 0x7e, 0x9b, 0xe3, 0x3e, 0x13, 0xc0, 0xc9, - 0x6a, 0x07, 0xed, 0x9c, 0x05, 0xb2, 0x54, 0xa3, 0x49, 0x0e, 0xef, 0xa4, 0x0e, 0xc2, 0xb8, 0xf5, 0xde, 0xdb, 0x80, 0x93, 0x01, 0xb7, 0x93, 0xd8, 0x6b, 0xc4, 0xb9, 0x54, 0xad, 0x23, 0xa7, 0x5e, - 0x2a, 0x8c, 0x10, 0x08, 0x2c, 0x24, 0x5b, 0xeb, 0xef, 0x24, 0xf4, 0x39, 0x23, 0xee, 0x1d, 0xaf, 0x9f, 0x5f, 0xc9, 0x0f, 0x3c, 0x3f, 0x0a, 0x3c, 0xff, 0xaa, 0x75, 0xe3, 0x4f, 0x1b, 0xe1, 0x9d, - 0x85, 0xf0, 0xe5, 0x0b, 0x4e, 0x94, 0x39, 0xc5, 0xf4, 0xd9, 0x63, 0x90, 0x16, 0xd3, 0xc0, 0x76, 0x92, 0x2f, 0x7b, 0x7f, 0xe0, 0x3f, 0xa1, 0x47, 0xfc, 0xc5, 0xdf, 0x3f, 0x0f, 0x98, 0x7e, 0x75, - 0x77, 0x7a, 0x7d, 0xee, 0xf7, 0x83, 0x72, 0x40, 0xaa, 0x12, 0x1f, 0xb8, 0x7d, 0x3d, 0x8b, 0xdc, 0xa0, 0x3d, 0xd2, 0x87, 0xe3, 0x20, 0xd3, 0xcc, 0x9a, 0x9f, 0x44, 0x09, 0xb5, 0x54, 0x6d, 0x43, - 0xf3, 0xaa, 0x03, 0xbb, 0xf1, 0x76, 0x26, 0x54, 0x30, 0xc6, 0x02, 0x0b, 0xb9, 0xa2, 0x22, 0xe7, 0xcb, 0x78, 0x89, 0xef, 0x20, 0xc2, 0x4d, 0xb5, 0xcd, 0x7a, 0x49, 0xa8, 0x09, 0xb0, 0x00, 0x7c, - 0x8c, 0xdf, 0xb8, 0x8c, 0x94, 0x01, 0x0e, 0xb4, 0x41, 0xc7, 0xb8, 0x82, 0x3e, 0x19, 0x82, 0x7f, 0x01, 0xff, 0x5e, 0xa8, 0x3f, 0x71, 0xeb, 0xe5, 0x78, 0x34, 0x6f, 0x4e, 0x7b, 0x4a, 0x68, 0xbb, - 0x46, 0x39, 0x2d, 0xd7, 0xdc, 0x9e, 0x31, 0x48, 0xc9, 0x9c, 0x9d, 0x69, 0xba, 0xa4, 0xd2, 0x8c, 0xb6, 0x03, 0x95, 0x29, 0xf3, 0xcc, 0xa8, 0x32, 0xc4, 0x15, 0xa2, 0x35, 0x3a, 0x81, 0x59, 0x69, - 0x7f, 0x56, 0xe2, 0xe5, 0xe1, 0x98, 0x1c, 0xea, 0x7e, 0x6f, 0x2f, 0xa8, 0xd9, 0xf2, 0x48, 0xe5, 0xfb, 0xe3, 0x51, 0x69, 0xc0, 0xc0, 0xc4, 0x10, 0x39, 0x94, 0x71, 0x5b, 0x21, 0xed, 0xef, 0x0c, - 0xce, 0xaf, 0x05, 0xf6, 0x4b, 0xf9, 0xbb, 0x88, 0x30, 0xfa, 0x2e, 0x31, 0xd4, 0x37, 0xa2, 0x6b, 0xfb, 0xce, 0x0f, 0xbd, 0x0f, 0xc2, 0x27, 0x23, 0xe0, 0xec, 0x3c, 0x43, 0xfd, 0xde, 0x41, 0x1d, - 0xf8, 0x06, 0x55, 0xeb, 0xb5, 0xfb, 0xc2, 0xaf, 0x1b, 0x1f, 0x92, 0x67, 0x6e, 0x6c, 0x8f, 0xf1, 0x43, 0xf8, 0x86, 0x3e, 0x30, 0x7d, 0x7b, 0x36, 0xbd, 0xd0, 0xbc, 0x19, 0xbe, 0x1f, 0x77, 0xc5, - 0x5b, 0x01, 0xf5, 0x35, 0x76, 0xd6, 0x65, 0x5b, 0xf1, 0x89, 0x53, 0xbf, 0x69, 0x91, 0x3d, 0x67, 0x9e, 0x62, 0xa0, 0x9e, 0xf0, 0xb9, 0x5b, 0x2e, 0xba, 0x65, 0x76, 0x14, 0x40, 0xd1, 0x9d, 0x97, - 0x39, 0x01, 0x38, 0x73, 0xf4, 0xd8, 0x75, 0x42, 0x26, 0x6e, 0xbb, 0xf9, 0x4a, 0x86, 0x56, 0x51, 0x4f, 0x55, 0xc2, 0x81, 0xe6, 0x05, 0x69, 0x42, 0x24, 0x55, 0x94, 0xaf, 0xba, 0x40, 0xb6, 0x26, - 0xc5, 0x2c, 0x7f, 0x2b, 0xde, 0x3f, 0x3e, 0x1f, 0xc6, 0x1f, 0x77, 0x87, 0xf2, 0x72, 0xe7, 0x8a, 0x55, 0x61, 0xa5, 0x49, 0xe3, 0x14, 0x9f, 0x74, 0x92, 0xfa, 0xf1, 0xba, 0xfe, 0xfc, 0x78, 0x3b, - 0x18, 0x6f, 0x86, 0xf3, 0x1e, 0xbb, 0xe1, 0x77, 0xd5, 0xea, 0xe3, 0xd9, 0x7d, 0x6d, 0x3a, 0x31, 0xbd, 0xfe, 0xbf, 0xb4, 0xfb, 0x84, 0xc7, 0xb1, 0x98, 0xab, 0x82, 0x89, 0x3b, 0x8f, 0xb2, 0x0d, - 0x6f, 0xb5, 0x2b, 0xb4, 0x3a, 0x1e, 0x08, 0x40, 0x28, 0x14, 0xa5, 0x5a, 0x41, 0x9e, 0x1e, 0x4c, 0x5c, 0x62, 0x95, 0x47, 0xfd, 0xc2, 0x4e, 0xeb, 0xc2, 0x88, 0xac, 0xd5, 0x71, 0x25, 0x1d, 0x57, - 0xf0, 0x84, 0xf7, 0x28, 0x76, 0xef, 0x87, 0x67, 0xca, 0x9c, 0xac, 0x57, 0xe4, 0x2e, 0x9f, 0x9b, 0xb5, 0xde, 0x2e, 0xa1, 0xce, 0x3a, 0x4b, 0x2a, 0x9a, 0x39, 0xfb, 0x5a, 0xfa, 0x63, 0x16, 0xbf, - 0x6f, 0x0e, 0xf2, 0x51, 0x10, 0x2f, 0x69, 0x9f, 0x96, 0x91, 0xbd, 0x60, 0x52, 0x5d, 0x8b, 0x50, 0x7e, 0xb5, 0x88, 0x98, 0xbd, 0xff, 0xf4, 0x27, 0x00, 0x0f, 0xb3, 0x8b, 0x2b, 0xff, 0xfb, 0x61, - 0x7b, 0x37, 0xde, 0xf7, 0x86, 0xef, 0x49, 0x0a, 0x90, 0xc7, 0x86, 0xef, 0xed, 0x13, 0x2e, 0x1b, 0xf4, 0x9b, 0xf3, 0xe9, 0x85, 0xee, 0xb8, 0xe1, 0x94, 0xdc, 0x85, 0x5a, 0xd9, 0x93, 0x66, 0x65, - 0x2f, 0xaa, 0x95, 0x64, 0x51, 0x04, 0x45, 0xf5, 0xa7, 0x0a, 0x72, 0x4f, 0xc7, 0x6e, 0x9f, 0x2f, 0x82, 0x2d, 0x6c, 0xed, 0x69, 0x6c, 0xa0, 0x49, 0x82, 0x47, 0xac, 0xac, 0x5c, 0x92, 0x8b, 0x46, - 0xee, 0xb2, 0xf9, 0x20, 0x30, 0x1e, 0xc6, 0x00, 0x7b, 0x96, 0xdd, 0x9c, 0x16, 0x0a, 0x41, 0x00, 0xc6, 0x00, 0xac, 0x6b, 0x9a, 0x59, 0xec, 0x4a, 0xfe, 0x60, 0x32, 0xde, 0x1f, 0x0f, 0xe7, 0xf5, - 0x7d, 0x92, 0xab, 0x76, 0xf3, 0xd7, 0x0d, 0xdc, 0xe2, 0x8f, 0x6f, 0xd8, 0x9e, 0xdc, 0xaa, 0x44, 0x3f, 0x3e, 0xf0, 0x1c, 0xfa, 0x23, 0x9e, 0x27, 0x2f, 0x1a, 0xd1, 0xcb, 0xc9, 0xc5, 0x09, 0x35, - 0x82, 0xdb, 0xd0, 0x34, 0x9b, 0x93, 0x87, 0x60, 0x1e, 0x58, 0x52, 0xe3, 0x1c, 0x10, 0x75, 0xdd, 0x87, 0x88, 0xb4, 0xe6, 0xac, 0x4c, 0x69, 0x28, 0xf5, 0x2e, 0xbf, 0x3e, 0x7d, 0xd1, 0x37, 0xc0, - 0x24, 0xf7, 0x17, 0xe2, 0xdb, 0xe5, 0x7f, 0xfc, 0x6b, 0xbe, 0x10, 0x7f, 0xda, 0x43, 0x9f, 0x0f, 0x3f, 0x01, 0x1d, 0xfc, 0xf1, 0xf9, 0x2b, 0x56, 0xb6, 0xac, 0x22, 0x14, 0xa3, 0x17, 0xc1, 0xe6, - 0x18, 0xbb, 0x3c, 0xe3, 0x46, 0x29, 0x4b, 0xe0, 0xd1, 0xa1, 0x6e, 0xc0, 0xdf, 0x7b, 0xc5, 0xaf, 0x41, 0xb7, 0xde, 0xbc, 0xe8, 0xec, 0x1d, 0xaa, 0xc7, 0xf8, 0x17, 0xfd, 0x0e, 0x5b, 0xe8, 0x42, - 0xf9, 0xfb, 0x97, 0xbe, 0xcc, 0xa2, 0xf0, 0x10, 0xb6, 0xb6, 0xb6, 0xae, 0x50, 0x90, 0xe0, 0xd6, 0xc1, 0x22, 0xa7, 0x34, 0x34, 0x55, 0xb7, 0xa5, 0xa7, 0xc2, 0xcb, 0x7c, 0xc1, 0x0c, 0x25, 0x2c, - 0x66, 0xe7, 0x18, 0x35, 0xa4, 0x93, 0x19, 0xc6, 0x13, 0x7d, 0x79, 0x5c, 0x5a, 0x47, 0x74, 0xef, 0xae, 0x78, 0xa5, 0x40, 0x6b, 0x8e, 0xd7, 0x63, 0x03, 0x74, 0x7a, 0xd4, 0x9d, 0x45, 0xde, 0xae, - 0x38, 0x93, 0xa0, 0xa1, 0x81, 0x12, 0x97, 0xb6, 0x7f, 0x3c, 0x8b, 0x6e, 0x00, 0x6c, 0x6e, 0x02, 0x3d, 0x3f, 0x6e, 0x27, 0xd1, 0x7f, 0xbc, 0xfd, 0xff, 0xaa, 0xb2, 0x5d, 0xb3, 0xe4, 0x81, 0xeb, - 0xbf, 0xc2, 0xba, 0xa3, 0xb2, 0x3d, 0x56, 0x52, 0xf9, 0x9e, 0x38, 0x30, 0x7d, 0x3d, 0x9c, 0x8e, 0xac, 0xac, 0x9c, 0x35, 0xb8, 0x42, 0x2f, 0xe7, 0x59, 0x74, 0xf0, 0x9b, 0x4e, 0x72, 0x8e, 0x3b, - 0x8d, 0x56, 0x9a, 0x55, 0xb3, 0x21, 0x6d, 0x16, 0xcb, 0x96, 0xa5, 0x9d, 0x44, 0xb0, 0x07, 0xd8, 0x8b, 0xac, 0x8a, 0xeb, 0xd5, 0x52, 0x74, 0x6c, 0x09, 0x5d, 0x16, 0xf9, 0xac, 0x28, 0xe9, 0x52, - 0x9b, 0xc4, 0xcd, 0x82, 0xc3, 0x20, 0x70, 0xed, 0xf3, 0x86, 0x00, 0x1f, 0x67, 0x07, 0xc8, 0x16, 0x84, 0x84, 0xde, 0x76, 0xdf, 0x22, 0xd3, 0x7d, 0xae, 0xaf, 0xbd, 0x00, 0xd1, 0x60, 0x4f, 0xc6, - 0xd1, 0x8d, 0x2b, 0xff, 0x2d, 0x48, 0xe2, 0xbb, 0x32, 0x1b, 0xa7, 0xcc, 0x0a, 0xc7, 0x79, 0x56, 0xe4, 0x90, 0x8f, 0x35, 0x07, 0xc6, 0x4b, 0x6e, 0xd1, 0x87, 0xb6, 0x0c, 0xbf, 0x40, 0x10, 0x2e, - 0x7a, 0xdc, 0x0d, 0x52, 0x41, 0x10, 0x5f, 0x3a, 0xde, 0xb8, 0x85, 0x53, 0xfa, 0x9f, 0xee, 0x84, 0x4f, 0x8a, 0x60, 0x6f, 0xc4, 0xaf, 0xb0, 0x27, 0xc8, 0xbb, 0x82, 0x86, 0x20, 0x09, 0x62, 0xa3, - 0xb2, 0xfc, 0x57, 0xa1, 0xb9, 0x79, 0x9f, 0x2b, 0x98, 0xcd, 0x05, 0x9c, 0xc3, 0x4a, 0xe3, 0x5f, 0x89, 0x0d, 0x77, 0x8a, 0x80, 0xbe, 0x02, 0x82, 0xb8, 0x85, 0x37, 0xfc, 0xf1, 0xe3, 0xbd, 0x83, - 0x09, 0x79, 0x50, 0x93, 0xfc, 0x08, 0x73, 0x38, 0x52, 0x7b, 0xb4, 0xd3, 0x65, 0x6b, 0x37, 0x31, 0x2a, 0x52, 0xce, 0x16, 0xdd, 0x22, 0xb2, 0xc4, 0xc3, 0x3a, 0x05, 0x93, 0x27, 0x95, 0x34, 0xba, - 0x76, 0xb7, 0x90, 0xa9, 0x5c, 0x8f, 0xb9, 0xb0, 0x5a, 0x11, 0xc6, 0x0c, 0xda, 0xc0, 0xb2, 0x09, 0x76, 0xd9, 0x21, 0x4a, 0x57, 0x72, 0x42, 0x09, 0x74, 0x9b, 0x87, 0x59, 0x9b, 0x2c, 0x52, 0x23, - 0x45, 0x33, 0x27, 0xe2, 0x89, 0x08, 0x91, 0x37, 0x76, 0x83, 0x78, 0xf2, 0x9f, 0xab, 0x36, 0x9f, 0x40, 0x1e, 0xfe, 0xb8, 0xbb, 0x07, 0xfe, 0x12, 0x9c, 0xbb, 0x1b, 0x20, 0xfc, 0x13, 0x7d, 0x70, - 0xc5, 0x7c, 0x26, 0x0e, 0x4c, 0x5f, 0x8e, 0xa6, 0x57, 0x62, 0xe3, 0xd8, 0x4b, 0x1e, 0xd7, 0x54, 0x3d, 0x0c, 0x74, 0x43, 0xa7, 0xec, 0x0c, 0xe5, 0xd9, 0x2d, 0x55, 0x3a, 0xb4, 0x91, 0x2c, 0xfc, - 0x25, 0x42, 0x39, 0x74, 0x5a, 0x78, 0xf4, 0x6e, 0xc6, 0x29, 0xd8, 0x8e, 0xd3, 0xb4, 0x10, 0x3e, 0x52, 0x89, 0x3d, 0x57, 0x29, 0xb8, 0x1c, 0xec, 0x33, 0xba, 0x38, 0xee, 0xdc, 0xd0, 0xf6, 0x78, - 0x92, 0xd2, 0x76, 0xaa, 0x91, 0x68, 0x27, 0x2b, 0x23, 0xc9, 0xad, 0xb0, 0x3f, 0x32, 0xed, 0x9f, 0xab, 0x1a, 0x6f, 0x13, 0x86, 0xff, 0xfa, 0x2f, 0xf0, 0x6d, 0xce, 0xfb, 0x8f, 0xbb, 0x6c, 0x8e, - 0xbf, 0xe2, 0x30, 0xfc, 0x0e, 0x98, 0x64, 0x3c, 0x83, 0xef, 0x43, 0x35, 0xfe, 0xb8, 0xc7, 0xd5, 0x7f, 0x39, 0x5c, 0xe3, 0x8f, 0x1f, 0x23, 0x76, 0xeb, 0x4f, 0x57, 0x85, 0xfb, 0xba, 0x09, 0xf4, - 0xe0, 0xd4, 0xfe, 0xe4, 0x39, 0xaf, 0xf8, 0xc8, 0x37, 0x57, 0x3f, 0xf1, 0x07, 0xfe, 0xb8, 0xc7, 0x41, 0xcc, 0x15, 0xad, 0x89, 0x8c, 0x06, 0x7e, 0x9b, 0x8b, 0x18, 0x0f, 0x18, 0xeb, 0x06, 0x76, - 0x21, 0x8f, 0x63, 0x89, 0x48, 0x38, 0x54, 0x47, 0x89, 0x4d, 0x73, 0x0a, 0xed, 0xb7, 0x58, 0xba, 0xa7, 0x0f, 0x87, 0xd4, 0xaa, 0xe3, 0x45, 0xe9, 0x52, 0x79, 0x78, 0xd6, 0x92, 0x3c, 0x38, 0x71, - 0x7e, 0xcc, 0xb5, 0x7b, 0x20, 0x5e, 0xb2, 0xbb, 0x0c, 0x3f, 0x38, 0x7e, 0x54, 0x21, 0x79, 0x84, 0x45, 0xcb, 0xe0, 0x0b, 0xb9, 0xfc, 0xc5, 0xc1, 0xff, 0x78, 0xfb, 0xff, 0x75, 0xdb, 0x75, 0x8d, - 0xb2, 0x0a, 0xdc, 0xfe, 0x02, 0xb0, 0xf5, 0x9c, 0xef, 0x73, 0xcf, 0xdd, 0x84, 0xdc, 0x28, 0x3f, 0x63, 0xb9, 0xf8, 0xe9, 0x13, 0x9e, 0x11, 0xbd, 0x5e, 0x4e, 0xa7, 0xc8, 0x07, 0xed, 0xe7, 0x53, - 0xe6, 0x39, 0xa6, 0xb9, 0xac, 0xa2, 0x35, 0x6e, 0x77, 0xda, 0x6a, 0x36, 0x04, 0xbc, 0x5d, 0x80, 0xb3, 0x58, 0x38, 0x11, 0x7c, 0x42, 0x07, 0x22, 0x09, 0x69, 0xcd, 0x22, 0xda, 0xb1, 0x56, 0x25, - 0x57, 0x80, 0x6c, 0x4d, 0x28, 0x64, 0x47, 0x09, 0x87, 0xe3, 0x2c, 0x88, 0xd5, 0x83, 0x36, 0x89, 0xfd, 0x46, 0xf5, 0x13, 0x7e, 0x88, 0x45, 0x92, 0x75, 0x5a, 0xf5, 0x2c, 0xac, 0x3c, 0x26, 0xa2, - 0x3a, 0xcf, 0x5e, 0xdc, 0x38, 0x94, 0xbe, 0xde, 0x71, 0x89, 0x0f, 0x20, 0xbe, 0x4f, 0x6f, 0x71, 0x2d, 0xec, 0xbb, 0xee, 0x4c, 0x1f, 0x31, 0x87, 0x8d, 0xb2, 0x9a, 0xd6, 0x45, 0xf0, 0xd7, 0xff, - 0xba, 0x9f, 0xb6, 0xf1, 0x1d, 0xe6, 0xdc, 0x3d, 0xd1, 0x26, 0x9e, 0x14, 0x80, 0xc7, 0x16, 0xd7, 0xb7, 0xa8, 0x6a, 0xd0, 0x7b, 0x74, 0x95, 0x1f, 0x77, 0xa7, 0xbf, 0x5c, 0x43, 0xe7, 0xcc, 0x12, - 0xe6, 0xfd, 0xae, 0x3a, 0x75, 0xe4, 0xb6, 0xc9, 0x5d, 0xc5, 0xf1, 0xe7, 0xdb, 0x41, 0x5f, 0xb6, 0x02, 0xb2, 0x57, 0x7a, 0x0d, 0x62, 0x95, 0x09, 0x4a, 0x19, 0xf4, 0x40, 0x61, 0x6c, 0xa6, 0x30, - 0x27, 0x7f, 0xed, 0x8b, 0xeb, 0x21, 0x9c, 0x6b, 0xf5, 0x56, 0xc5, 0xb7, 0x27, 0xba, 0x4d, 0x0c, 0xc7, 0x9f, 0xf9, 0x96, 0xd0, 0x86, 0x3d, 0x24, 0xd5, 0x9b, 0x81, 0x14, 0x3f, 0x78, 0x3c, 0xee, - 0xaf, 0x9e, 0x63, 0xb0, 0xd4, 0x2e, 0x1f, 0x1c, 0x8d, 0xa7, 0xf6, 0xf6, 0x81, 0xdf, 0x62, 0xaa, 0x5d, 0x3e, 0x7c, 0x0f, 0x57, 0xed, 0xc7, 0xdd, 0xe5, 0xfb, 0x1b, 0x50, 0xb3, 0x1f, 0x3f, 0x3e, - 0x46, 0x3b, 0x1f, 0x1b, 0xd4, 0x3f, 0x03, 0x37, 0xfb, 0x71, 0x6f, 0xd4, 0xff, 0x65, 0x00, 0x67, 0x63, 0xd7, 0xa6, 0xa7, 0x11, 0x8f, 0x9d, 0xe2, 0x2e, 0x54, 0x08, 0xf4, 0x50, 0xce, 0xe3, 0x47, - 0xf2, 0x17, 0x35, 0xee, 0xf9, 0x78, 0x0a, 0x8d, 0x4b, 0x77, 0xdc, 0x10, 0x8a, 0xb0, 0x27, 0x73, 0x64, 0x9f, 0xea, 0x26, 0xed, 0x73, 0xf3, 0x89, 0x0c, 0xd4, 0x38, 0xee, 0x8b, 0x73, 0xc4, 0x1b, - 0x80, 0xc2, 0x08, 0xf7, 0x8b, 0xc9, 0x16, 0x3e, 0x33, 0x7d, 0x10, 0x8a, 0x99, 0x20, 0x8b, 0x47, 0x55, 0x63, 0xd5, 0x4c, 0x31, 0x22, 0x27, 0x0d, 0x27, 0x73, 0x78, 0x51, 0x82, 0xfb, 0x79, 0x2d, - 0xca, 0x22, 0x2e, 0x04, 0xc4, 0x3a, 0xe7, 0x5c, 0xb0, 0x9e, 0x14, 0x29, 0xf6, 0x21, 0x56, 0xf8, 0xfa, 0x5b, 0x5f, 0x0a, 0xe9, 0x3f, 0x5f, 0x9f, 0x1f, 0x01, 0x5d, 0xba, 0x25, 0xfd, 0x64, 0x19, - 0x3d, 0xfd, 0xbf, 0xf8, 0x41, 0x47, 0xbc, 0xfe, 0x76, 0xe1, 0x5a, 0x3b, 0x63, 0x42, 0x25, 0xe7, 0xa4, 0x3d, 0x04, 0x33, 0xf7, 0x98, 0x7a, 0xc5, 0x4e, 0xf3, 0x02, 0x7b, 0x17, 0x58, 0x13, 0x46, - 0x4b, 0x76, 0x61, 0x10, 0x6a, 0x76, 0x16, 0x11, 0x59, 0x73, 0x6e, 0x4c, 0x4d, 0x9d, 0x91, 0x8c, 0x81, 0xe0, 0x81, 0x2e, 0xcc, 0x57, 0x4c, 0x53, 0xfa, 0x73, 0x7d, 0x87, 0xf6, 0x93, 0x74, 0x15, - 0xcc, 0x2c, 0x93, 0x25, 0xe3, 0x99, 0x2a, 0x30, 0x13, 0x3b, 0x96, 0xee, 0xbe, 0xfe, 0x65, 0x01, 0xb8, 0xca, 0xf3, 0x0b, 0xd4, 0xfb, 0x77, 0xbb, 0xd6, 0x63, 0xbd, 0xcc, 0x46, 0x3d, 0x11, 0x98, - 0x7e, 0x79, 0x7b, 0x6c, 0x03, 0xb4, 0x3e, 0xd3, 0xfb, 0x44, 0x6e, 0xb4, 0x05, 0x62, 0x07, 0xa6, 0x2b, 0xf6, 0x67, 0x89, 0x47, 0x64, 0x72, 0xd6, 0x92, 0xf6, 0x52, 0xf5, 0xf6, 0x8c, 0x97, 0xf4, - 0x84, 0x64, 0x61, 0x67, 0x08, 0x43, 0xda, 0x93, 0xb8, 0xa3, 0xd1, 0x78, 0xc9, 0x2c, 0xe9, 0xf3, 0x82, 0xca, 0x26, 0x20, 0x78, 0x8a, 0xf3, 0x33, 0xd3, 0xac, 0x63, 0x82, 0x06, 0xba, 0x53, 0xca, - 0x1a, 0x61, 0xdb, 0x2f, 0xed, 0x23, 0x0d, 0xdc, 0x26, 0x21, 0x7f, 0xbe, 0xab, 0x7d, 0xf2, 0xdb, 0xff, 0xfa, 0x5f, 0xcf, 0x3d, 0x2c, 0xee, 0x04, 0x57, 0xff, 0x33, 0x49, 0x6d, 0x27, 0x0a, 0x4c, - 0xc0, 0x2d, 0x7f, 0x96, 0x96, 0x91, 0xd8, 0xc1, 0xdd, 0x68, 0xf5, 0x4f, 0xe8, 0x81, 0x6c, 0xda, 0x4f, 0xe8, 0x3f, 0x31, 0xf9, 0xf5, 0xe4, 0xa2, 0xab, 0x8e, 0x48, 0x99, 0x45, 0x10, 0x0f, 0xc9, - 0xb8, 0xcd, 0x19, 0x31, 0xbd, 0x59, 0xa2, 0x99, 0x3b, 0x60, 0x42, 0x9d, 0xb0, 0x35, 0xec, 0x6c, 0xe8, 0x41, 0x5f, 0x24, 0x01, 0x3a, 0x17, 0xdd, 0x4d, 0xb2, 0x9b, 0xb9, 0x9e, 0x2f, 0x2a, 0x9e, - 0x27, 0x36, 0xa4, 0x0d, 0x64, 0x2b, 0x7e, 0xef, 0x6d, 0x4a, 0x7b, 0xe1, 0x1d, 0xb3, 0xaa, 0x5e, 0xd5, 0x78, 0x9e, 0x03, 0x4b, 0xb9, 0x11, 0x4e, 0xab, 0xc8, 0x6f, 0xca, 0x9d, 0x42, 0xbd, 0xc7, - 0xc8, 0x1a, 0x69, 0xad, 0xdf, 0xbc, 0x52, 0x65, 0x54, 0x7f, 0x3d, 0xa7, 0xb0, 0xde, 0x18, 0xba, 0x45, 0x7d, 0xc9, 0x92, 0x35, 0xa2, 0xc8, 0x79, 0xc9, 0xb3, 0x83, 0x7e, 0xce, 0x47, 0x8c, 0xc1, - 0x95, 0xe0, 0xe7, 0x03, 0xf0, 0x48, 0x3a, 0xf3, 0x7b, 0xe2, 0xcf, 0xdc, 0xaf, 0x8c, 0xea, 0x92, 0x33, 0x3b, 0x82, 0xf5, 0xeb, 0x53, 0xc4, 0x6e, 0x16, 0xa0, 0x15, 0x55, 0xf0, 0xe4, 0xe0, 0xe1, - 0xa6, 0x65, 0xe5, 0x13, 0x65, 0x90, 0xed, 0x4d, 0xd3, 0x40, 0x73, 0x0b, 0x5e, 0xf3, 0x39, 0xb9, 0x2f, 0x53, 0x61, 0x97, 0x41, 0xa1, 0x83, 0x77, 0x61, 0x55, 0xe0, 0x1b, 0x18, 0x9b, 0x1c, 0x35, - 0x19, 0x87, 0x39, 0xca, 0x6e, 0xd4, 0x79, 0x0e, 0xe5, 0xca, 0xb0, 0x3e, 0xd2, 0xae, 0xcf, 0xb9, 0x13, 0x5a, 0x6e, 0xa4, 0xcd, 0x5d, 0xf8, 0xd5, 0xbb, 0x7c, 0x69, 0x6f, 0x23, 0x19, 0xef, 0x33, - 0xb3, 0xb0, 0x3f, 0xe2, 0x4b, 0x7b, 0x0d, 0x66, 0x3c, 0x1f, 0x5d, 0xd2, 0xb3, 0xb0, 0xef, 0xf9, 0x42, 0x90, 0x45, 0x6a, 0x94, 0x58, 0xa3, 0x54, 0x47, 0x94, 0x59, 0x6b, 0xca, 0x82, 0xa5, 0xd3, - 0x25, 0x02, 0xfb, 0x09, 0x0f, 0x73, 0xb3, 0xfe, 0xec, 0x51, 0xd9, 0x91, 0x31, 0x6b, 0x8d, 0x95, 0xa0, 0x59, 0xb3, 0xe4, 0xf2, 0x02, 0x46, 0x32, 0x12, 0xc7, 0x1c, 0x80, 0xd1, 0xad, 0x53, 0xa9, - 0x53, 0xec, 0x62, 0xd7, 0xcc, 0xc0, 0x73, 0x65, 0xc3, 0x68, 0xee, 0x2f, 0xfb, 0x6d, 0x81, 0xb5, 0x64, 0x95, 0x3e, 0x18, 0xa1, 0xfe, 0x74, 0x16, 0xbf, 0x9b, 0xb2, 0xcf, 0x0b, 0x44, 0xfe, 0x2c, - 0x8e, 0x77, 0x7b, 0xfd, 0x7e, 0x84, 0xc0, 0xf8, 0x7c, 0x15, 0x26, 0x1e, 0x91, 0xc6, 0x5b, 0xda, 0xef, 0x2b, 0x38, 0x89, 0x31, 0xf2, 0x78, 0xe4, 0x56, 0xfc, 0xa1, 0xac, 0xda, 0x23, 0xd3, 0xd3, - 0xb5, 0x2e, 0xc2, 0x3b, 0x46, 0x94, 0xf5, 0xc9, 0x59, 0x64, 0x3b, 0x7d, 0x17, 0xfb, 0xc2, 0x04, 0x4e, 0x8b, 0xb8, 0xac, 0xe8, 0x26, 0xd1, 0x82, 0x3e, 0x25, 0xc5, 0xea, 0x08, 0xe5, 0xf9, 0x5c, - 0xf3, 0xfd, 0xe2, 0xbc, 0x46, 0xf9, 0x43, 0xd5, 0x79, 0xe5, 0x04, 0xd6, 0x03, 0x55, 0x89, 0xe6, 0x0b, 0x06, 0x4f, 0xf8, 0xb5, 0x9c, 0x03, 0x35, 0x35, 0x06, 0xcc, 0xe1, 0x3f, 0x2f, 0xbf, 0xf5, - 0xd9, 0xd1, 0x78, 0x87, 0x2d, 0xf8, 0x4f, 0x78, 0xfe, 0xc8, 0xee, 0xf4, 0x96, 0xf4, 0xab, 0x33, 0x73, 0x7a, 0xa5, 0xf6, 0x3d, 0x4b, 0x0e, 0xbc, 0xd5, 0x04, 0xe9, 0x89, 0x66, 0x09, 0x60, 0xd5, - 0x19, 0x8e, 0xb2, 0x3d, 0x73, 0x28, 0xa0, 0x04, 0x4a, 0x5b, 0x61, 0x19, 0x79, 0x98, 0x2f, 0x11, 0xc1, 0x65, 0xe2, 0xc6, 0x68, 0x89, 0x4a, 0x8c, 0xc0, 0xa2, 0x60, 0xa9, 0x0d, 0xba, 0x8b, 0xa0, - 0x19, 0x2b, 0x2b, 0x93, 0x8c, 0x0b, 0x56, 0x0b, 0x17, 0xe0, 0x76, 0x52, 0xb3, 0x18, 0xa8, 0x09, 0x26, 0x0f, 0x2a, 0xb7, 0xdc, 0xcd, 0x29, 0x27, 0x79, 0x30, 0xf6, 0xfc, 0xf2, 0x26, 0xd5, 0xb3, - 0x77, 0xf2, 0xff, 0xf3, 0x56, 0x00, 0x9f, 0xef, 0xbe, 0x51, 0x60, 0xaf, 0x1f, 0xb9, 0x23, 0x88, 0xb7, 0xa4, 0x3e, 0x9f, 0xfc, 0x8f, 0x24, 0x92, 0xdd, 0x50, 0xbe, 0xb0, 0xfb, 0xe9, 0x60, 0x2c, - 0x3e, 0xf0, 0xb1, 0x8e, 0x72, 0x8d, 0xa3, 0x55, 0xe5, 0xb4, 0xd0, 0xa8, 0x50, 0x4f, 0xce, 0xd8, 0xa6, 0x5a, 0xb3, 0x62, 0xe0, 0x65, 0xb3, 0x99, 0x75, 0xa8, 0x68, 0x8f, 0x2e, 0x04, 0xd8, 0x63, - 0xe5, 0xd6, 0xef, 0x37, 0x55, 0x0a, 0x43, 0x13, 0x68, 0x30, 0x0f, 0x54, 0x25, 0x9c, 0x48, 0x78, 0x07, 0xad, 0xe6, 0x2d, 0x9a, 0x53, 0x12, 0x58, 0x08, 0xcc, 0x91, 0x4c, 0x48, 0x07, 0x5c, 0xf1, - 0x4a, 0xb0, 0xdc, 0xac, 0x47, 0x2d, 0x88, 0x9f, 0x71, 0xef, 0x73, 0x29, 0x7c, 0x5b, 0xfc, 0xf5, 0x9b, 0x5c, 0x79, 0x43, 0xfe, 0x9d, 0xad, 0x71, 0x21, 0xfb, 0x3d, 0x7f, 0xac, 0xee, 0xb8, 0x92, - 0x0e, 0xa5, 0x43, 0xc6, 0x98, 0x30, 0x67, 0xcc, 0x16, 0x5a, 0x1f, 0x4d, 0xa2, 0xc0, 0x84, 0x3d, 0x2a, 0xf8, 0xfb, 0x0a, 0xf1, 0x45, 0x7d, 0x77, 0x5e, 0x2d, 0xb2, 0x5d, 0xc8, 0x11, 0xca, 0x52, - 0x93, 0x05, 0xb2, 0x96, 0x98, 0xdd, 0x82, 0x85, 0x03, 0xd8, 0xd3, 0x33, 0x4b, 0xb3, 0x77, 0xe4, 0xba, 0xc8, 0xb4, 0x5a, 0xa1, 0x7d, 0x16, 0x3f, 0x98, 0x31, 0x14, 0x68, 0x31, 0xcf, 0x8c, 0xca, - 0x12, 0xb9, 0xbe, 0xc0, 0x1b, 0x60, 0xdc, 0x7b, 0xfb, 0xc5, 0xef, 0xe7, 0x6a, 0xbe, 0xa3, 0x0d, 0x4c, 0x5f, 0x0f, 0xc7, 0xb6, 0xbd, 0x0c, 0xfd, 0x7a, 0xbb, 0x5b, 0xcb, 0x85, 0xdf, 0x50, 0xe2, - 0x2e, 0x6f, 0x45, 0xab, 0xc3, 0xd6, 0x7c, 0x1e, 0x6f, 0x9d, 0x60, 0x31, 0x5b, 0x1e, 0x8b, 0x92, 0x12, 0x44, 0xbf, 0x88, 0x56, 0xfb, 0xc2, 0x2c, 0x62, 0x15, 0xd5, 0x39, 0x31, 0x0c, 0x67, 0x6a, - 0x04, 0xa4, 0x3b, 0x8a, 0xa3, 0x85, 0x39, 0xa1, 0xc9, 0xea, 0xba, 0x3d, 0xc4, 0x38, 0xd1, 0xad, 0xa9, 0x01, 0x5d, 0x8a, 0x94, 0x73, 0xae, 0x06, 0xe7, 0x37, 0xc4, 0x26, 0xb9, 0x8f, 0x93, 0x06, - 0x5d, 0x9a, 0x19, 0x3d, 0xd0, 0x46, 0xf9, 0x0d, 0x69, 0x60, 0x7a, 0x2d, 0x45, 0x79, 0xa1, 0xf5, 0x3d, 0x43, 0x26, 0xf0, 0xda, 0xf3, 0x5a, 0x0f, 0x17, 0xbb, 0x54, 0x98, 0x6d, 0x7b, 0xbf, 0x29, - 0xf3, 0xf9, 0xc1, 0x28, 0x62, 0xd1, 0x5c, 0x3b, 0x91, 0x26, 0x82, 0x38, 0xc8, 0x72, 0xeb, 0x78, 0x99, 0x99, 0x15, 0x43, 0xa5, 0xfd, 0x91, 0x5f, 0xf3, 0x52, 0x88, 0xb6, 0x43, 0x68, 0x4a, 0x94, - 0x36, 0xd8, 0xac, 0x22, 0x6b, 0x49, 0x5e, 0xbb, 0x75, 0xb5, 0x31, 0x67, 0xdb, 0x85, 0x2a, 0xeb, 0x0b, 0x9e, 0x27, 0x17, 0xed, 0x07, 0x53, 0xe3, 0xe5, 0x27, 0x16, 0xb1, 0x11, 0x05, 0x83, 0xf3, - 0x5a, 0xb4, 0xf5, 0xdc, 0x37, 0xea, 0x73, 0x55, 0xeb, 0xa1, 0xa0, 0xd4, 0x57, 0x4f, 0xba, 0xb0, 0xe7, 0xb3, 0x1b, 0x97, 0xec, 0x89, 0x11, 0xf1, 0x2a, 0x26, 0xc4, 0xad, 0x35, 0x3e, 0x4c, 0xe6, - 0x04, 0x07, 0x13, 0xb0, 0x92, 0xc7, 0x19, 0xbc, 0x9d, 0x2d, 0xd7, 0x65, 0x9a, 0xd6, 0xea, 0x72, 0x30, 0xc9, 0x8d, 0x2f, 0x49, 0x03, 0xbd, 0x44, 0xc2, 0xfd, 0x5a, 0x3e, 0x63, 0xc5, 0xdc, 0x2b, - 0x07, 0x30, 0x55, 0xd3, 0x73, 0xbe, 0x56, 0x65, 0xb4, 0x86, 0x64, 0xc4, 0xe6, 0xd8, 0x14, 0xcc, 0x68, 0x96, 0xc3, 0x4b, 0x5e, 0x60, 0x7b, 0xbf, 0x8e, 0xfa, 0x6c, 0x4c, 0x63, 0x9d, 0xe7, 0xd7, - 0xfa, 0x0e, 0x8f, 0xfc, 0xe1, 0x55, 0xf8, 0x03, 0x2c, 0xf9, 0x88, 0x25, 0x18, 0x3c, 0x10, 0xd6, 0x36, 0x6d, 0x49, 0xbb, 0x0c, 0x16, 0xf3, 0xc4, 0xec, 0x16, 0x1e, 0x3e, 0x43, 0xa0, 0x72, 0x05, - 0x5b, 0xb6, 0xa8, 0xf3, 0x81, 0x9a, 0x7a, 0x96, 0xbb, 0x56, 0x1d, 0x95, 0x89, 0x27, 0xa6, 0x13, 0xaa, 0xe4, 0x12, 0x30, 0x9b, 0xc0, 0x1c, 0x90, 0x82, 0x45, 0xb0, 0x40, 0x12, 0xe7, 0xa6, 0x14, - 0x0a, 0x40, 0x29, 0x0c, 0xab, 0x56, 0x9d, 0xe3, 0x40, 0x4d, 0xcd, 0x62, 0xaa, 0x4f, 0x1f, 0x34, 0x07, 0x6e, 0x66, 0xd7, 0xd7, 0x7b, 0xd9, 0x55, 0xcf, 0xb9, 0x89, 0x5d, 0x4e, 0xb3, 0xa8, 0xf6, - 0x6e, 0xaa, 0xbc, 0xde, 0xd9, 0xba, 0x0f, 0x25, 0xb4, 0x7d, 0xf3, 0xb4, 0x5f, 0x1a, 0xc6, 0xf5, 0x7c, 0x7a, 0x7d, 0xce, 0xf7, 0x7c, 0xcf, 0x4d, 0xca, 0x3b, 0x8b, 0x1c, 0x4e, 0x1f, 0x95, 0xf2, - 0x24, 0x31, 0x61, 0x37, 0x97, 0x95, 0x5a, 0x62, 0xca, 0x36, 0x98, 0x98, 0xcb, 0x0a, 0x0c, 0xca, 0x9c, 0x26, 0x9d, 0x74, 0x42, 0x6d, 0x0f, 0xe0, 0x7c, 0x86, 0x0c, 0xf9, 0x1a, 0x54, 0x32, 0x9c, - 0xd2, 0xf1, 0x55, 0x30, 0x0f, 0x32, 0x6f, 0xb5, 0xc0, 0x62, 0x4b, 0xca, 0x57, 0x28, 0x2f, 0x1c, 0xf8, 0x76, 0x0f, 0xb8, 0x70, 0x81, 0x75, 0x7b, 0xff, 0x41, 0x9d, 0xf7, 0x93, 0x77, 0xec, 0x32, - 0xe7, 0xd2, 0x4f, 0xb6, 0x32, 0xa2, 0xe9, 0x0b, 0x48, 0xd3, 0x7b, 0x1e, 0x7e, 0xfe, 0xd5, 0xd2, 0x4a, 0x33, 0x67, 0x1a, 0x1b, 0x89, 0xe1, 0x5d, 0xb3, 0xe3, 0x3e, 0x7e, 0xeb, 0x8b, 0x58, 0xec, - 0x4b, 0xe5, 0xf5, 0x05, 0x4b, 0xd9, 0x9e, 0x9a, 0x91, 0x61, 0x9d, 0xa7, 0x2f, 0x0a, 0xd0, 0xc7, 0x8a, 0x9a, 0x6b, 0xe7, 0x90, 0x17, 0x52, 0xf8, 0x4f, 0xe8, 0xa6, 0x8c, 0xe7, 0x9a, 0x58, 0x74, - 0xcd, 0x2c, 0xfa, 0x58, 0x89, 0x79, 0xdb, 0x63, 0xee, 0xa6, 0xc0, 0xe7, 0x17, 0x30, 0xd5, 0xc5, 0x89, 0x8a, 0xff, 0x3b, 0xa2, 0xfa, 0x3f, 0x20, 0xa2, 0xfa, 0xef, 0x50, 0xdf, 0x3d, 0x67, 0xf0, - 0xc8, 0xf9, 0xfb, 0x2f, 0x5e, 0x16, 0x3f, 0x3c, 0xf2, 0x69, 0x6d, 0xfc, 0x70, 0x71, 0xf4, 0x02, 0xb9, 0x6e, 0x15, 0x05, 0x3e, 0xf0, 0xf4, 0x96, 0x85, 0x7c, 0x42, 0xd6, 0x4b, 0x87, 0x63, 0x51, - 0xca, 0x3a, 0x91, 0x03, 0x16, 0x29, 0x8d, 0x9c, 0x0a, 0x3b, 0xba, 0xae, 0x73, 0x5e, 0xd7, 0x53, 0xc5, 0x6f, 0x5c, 0x76, 0xe9, 0x0b, 0x81, 0x2e, 0x4a, 0x54, 0xda, 0x4e, 0x66, 0xcb, 0x08, 0x11, - 0xab, 0xbe, 0xdb, 0x40, 0x01, 0x5d, 0x60, 0xaa, 0xa6, 0xb7, 0xa7, 0x6a, 0x89, 0xf4, 0xba, 0x14, 0xfa, 0xd6, 0x9f, 0x2c, 0x90, 0xef, 0x6d, 0xad, 0x0b, 0x4e, 0x24, 0xf2, 0xe7, 0xab, 0xe1, 0x27, - 0xdf, 0xba, 0x5c, 0xf9, 0xbd, 0x4f, 0xbf, 0x5c, 0x79, 0x59, 0x2b, 0x3f, 0x7e, 0xf3, 0x79, 0x9f, 0xba, 0xfc, 0xa2, 0xbf, 0x7e, 0x39, 0x33, 0x3f, 0x7e, 0xe2, 0xd7, 0xda, 0x07, 0x7f, 0xe1, 0xee, - 0xfc, 0xf8, 0x3b, 0xbe, 0x2c, 0xd1, 0xf9, 0xe7, 0x04, 0xed, 0xb5, 0x5e, 0xe7, 0xb9, 0x52, 0x67, 0xac, 0x40, 0xd9, 0x21, 0xa4, 0xaf, 0x7d, 0x00, 0x95, 0xb6, 0xce, 0x92, 0xda, 0x99, 0xb0, 0x0b, - 0x48, 0xa1, 0xdc, 0x72, 0x31, 0xbd, 0x28, 0xac, 0xd6, 0x82, 0x8f, 0x69, 0x71, 0x14, 0xe5, 0x88, 0x24, 0x54, 0x5e, 0xd1, 0xa3, 0x13, 0xb4, 0xcd, 0x94, 0x43, 0x69, 0x6a, 0xb8, 0x83, 0xe8, 0xba, - 0x9d, 0xf9, 0xae, 0xdc, 0xc2, 0x73, 0x43, 0x59, 0xa9, 0x7b, 0xbe, 0x66, 0x48, 0xa2, 0x9d, 0x6b, 0xb3, 0x72, 0x3f, 0xc7, 0xff, 0x44, 0xa0, 0xfe, 0xa7, 0x0a, 0xca, 0xfb, 0xed, 0xf9, 0x65, 0xfc, - 0xff, 0xbd, 0xf5, 0xfd, 0x7b, 0xeb, 0xfb, 0x9f, 0xbf, 0xf5, 0xbd, 0x9f, 0x48, 0xff, 0xda, 0xc5, 0xe8, 0xe6, 0x69, 0xc0, 0xf4, 0xf6, 0x7c, 0xf4, 0xd2, 0x34, 0x9f, 0x1c, 0x4f, 0x1b, 0x86, 0x4e, - 0x6a, 0x6a, 0x7e, 0xa8, 0x4e, 0xbb, 0x9c, 0xf4, 0xad, 0x7d, 0xcd, 0xe1, 0x76, 0x8d, 0xcf, 0xdc, 0x9e, 0xda, 0x03, 0x7d, 0x46, 0x11, 0xd6, 0xcc, 0xc3, 0xf7, 0x76, 0x8b, 0x67, 0xcc, 0x0e, 0xe5, - 0x69, 0xc5, 0x74, 0x58, 0x84, 0x70, 0x36, 0xa2, 0x3b, 0xac, 0x7b, 0x9b, 0x62, 0x75, 0x3a, 0x15, 0xbc, 0x30, 0x4a, 0xbb, 0xfd, 0x62, 0x81, 0x4c, 0xd0, 0x08, 0x18, 0xca, 0x3f, 0x31, 0xc2, 0xfe, - 0x60, 0x91, 0x69, 0x82, 0x32, 0xa8, 0xd2, 0x62, 0x7a, 0x76, 0xfa, 0xb7, 0x5f, 0x1a, 0x3b, 0x7c, 0x2f, 0x0f, 0xfb, 0xd7, 0x0e, 0xdb, 0x75, 0x43, 0x7f, 0xf6, 0x99, 0x8f, 0x1e, 0xa6, 0xea, 0xac, - 0xab, 0xa4, 0x47, 0x4b, 0x5b, 0xbb, 0x71, 0x4b, 0x62, 0x87, 0xe2, 0x3b, 0x23, 0xef, 0xd2, 0x70, 0x4b, 0x2f, 0x27, 0xf1, 0x5a, 0x8d, 0x85, 0xc1, 0x1e, 0xf0, 0x62, 0x52, 0x4f, 0xd4, 0x19, 0x1a, - 0x21, 0x0c, 0x7d, 0x56, 0xb2, 0xa5, 0x29, 0x41, 0x9b, 0x0c, 0xb1, 0xf8, 0x3c, 0x5f, 0xa8, 0xf3, 0x86, 0x53, 0x29, 0x72, 0x01, 0xb9, 0x41, 0x55, 0xae, 0xfd, 0x18, 0xef, 0x79, 0xb0, 0xe9, 0xe6, - 0xe3, 0xfd, 0x4e, 0xdf, 0xae, 0xe5, 0xff, 0x0f, 0xf0, 0xec, 0xed, 0x13, 0x6f, 0x63, 0x0e, 0xcf, 0x9e, 0xdf, 0xb1, 0xbc, 0x3c, 0x93, 0x74, 0x50, 0xed, 0x00, 0xb3, 0x07, 0xd8, 0x2d, 0xee, 0x11, - 0xd4, 0x69, 0xa7, 0xe0, 0xc6, 0x36, 0x5b, 0xb4, 0x91, 0x4c, 0xd8, 0x69, 0xe9, 0xbb, 0xc7, 0x81, 0xb0, 0x71, 0x28, 0x9c, 0xe3, 0xc9, 0xec, 0xac, 0x1a, 0x33, 0xcb, 0x60, 0x8f, 0xcd, 0x09, 0x94, - 0x9b, 0xa5, 0xba, 0x34, 0x92, 0x1d, 0xb0, 0xcc, 0xc9, 0x4d, 0xba, 0xe0, 0x9d, 0x86, 0xd0, 0x2c, 0x20, 0x96, 0xb0, 0xdd, 0xae, 0xd5, 0xee, 0xb9, 0x36, 0xff, 0x9b, 0x44, 0xfe, 0x8b, 0x2d, 0xf5, - 0xcd, 0xad, 0x2f, 0x51, 0xcd, 0x83, 0x72, 0xfa, 0xd2, 0x0b, 0xed, 0x63, 0xfb, 0x80, 0x7f, 0x5b, 0xb0, 0xff, 0xde, 0xc6, 0xff, 0x8f, 0xdd, 0xc6, 0xdf, 0xcd, 0xa9, 0x7f, 0xed, 0xd2, 0xf6, 0xf6, - 0x61, 0xc0, 0xf4, 0xe6, 0x74, 0xf4, 0x82, 0x86, 0xa6, 0x1d, 0x54, 0x86, 0x31, 0xc3, 0xae, 0xbb, 0x70, 0x49, 0x93, 0x09, 0x47, 0x55, 0xc7, 0xd5, 0xca, 0x5f, 0x16, 0x5a, 0xb5, 0x5d, 0x40, 0x4b, - 0x0b, 0x2c, 0xc9, 0xac, 0x1e, 0x40, 0x37, 0x77, 0x11, 0x71, 0xe2, 0x21, 0x9b, 0x15, 0xd3, 0x2b, 0x5d, 0x67, 0xae, 0x40, 0xcc, 0xec, 0x5b, 0x70, 0x25, 0x97, 0x62, 0x92, 0x98, 0x39, 0x8a, 0x5a, - 0xdb, 0xa0, 0x61, 0xf1, 0x6d, 0x09, 0x01, 0x60, 0xf9, 0x1e, 0x33, 0xf2, 0x5f, 0xb2, 0xa0, 0x3d, 0x5b, 0x7d, 0xef, 0x17, 0xb1, 0xaf, 0x8c, 0x3f, 0xc3, 0x34, 0x0b, 0xa7, 0xb9, 0x1b, 0x15, 0x7a, - 0x04, 0x3f, 0xe0, 0x4a, 0x12, 0x98, 0x3e, 0x1f, 0x5c, 0x8a, 0xb9, 0x46, 0xf8, 0xf2, 0x93, 0xc4, 0x99, 0x03, 0xeb, 0x40, 0x02, 0xfc, 0x61, 0xed, 0x9f, 0xb0, 0xcc, 0xa6, 0x13, 0x93, 0xac, 0x06, - 0x9c, 0x0e, 0x45, 0x65, 0x5b, 0x9c, 0x40, 0x50, 0x04, 0x86, 0x46, 0xdc, 0xc7, 0xb3, 0x4c, 0x58, 0x9d, 0x23, 0xac, 0xab, 0x99, 0x82, 0x49, 0xb4, 0x04, 0x38, 0x54, 0x0a, 0xcf, 0xbb, 0x7c, 0xb5, - 0x70, 0xf5, 0x39, 0x00, 0xc9, 0x95, 0xe3, 0x9f, 0xcb, 0x41, 0x9d, 0xe7, 0x96, 0x12, 0x04, 0xe0, 0x98, 0x2d, 0xd9, 0x30, 0xd3, 0xe2, 0x82, 0x9f, 0x5f, 0x15, 0x69, 0xf4, 0x55, 0x62, 0xf0, 0x23, - 0x51, 0xd5, 0xf7, 0xc4, 0x2f, 0x6c, 0xb9, 0xbd, 0xf4, 0x49, 0x29, 0xd8, 0xa7, 0x0c, 0xf2, 0x89, 0x48, 0x22, 0x2a, 0xc3, 0xd2, 0x4f, 0x89, 0x8c, 0x34, 0xbc, 0xa4, 0x78, 0x81, 0x19, 0x4e, 0x2a, - 0x81, 0x66, 0xd7, 0x33, 0x60, 0x12, 0x81, 0xd8, 0xa2, 0x86, 0x45, 0xab, 0x08, 0x1a, 0x80, 0x89, 0x9d, 0x0a, 0x74, 0x8c, 0x10, 0x55, 0xda, 0x23, 0x8b, 0x42, 0xa5, 0x30, 0x6f, 0x13, 0x96, 0x0e, - 0xa4, 0x72, 0x19, 0x42, 0xf3, 0x1c, 0xb4, 0x8b, 0xc1, 0x3e, 0xda, 0xce, 0x82, 0xad, 0xda, 0x31, 0x19, 0x54, 0x4e, 0xe3, 0x24, 0xd5, 0xb4, 0x32, 0x0a, 0xcf, 0xa9, 0xa6, 0xa5, 0x7f, 0x6d, 0x69, - 0xf9, 0x55, 0xfe, 0x94, 0x61, 0x96, 0x55, 0x61, 0x58, 0xd5, 0x34, 0x4a, 0x3d, 0xef, 0x16, 0xa0, 0xe8, 0x7d, 0xee, 0xce, 0x23, 0xd2, 0x75, 0x4b, 0xfc, 0xc2, 0xd0, 0xdb, 0x4b, 0x97, 0x24, 0x9e, - 0x11, 0x12, 0x07, 0x93, 0xa1, 0xac, 0xe8, 0x9d, 0x22, 0x36, 0xbe, 0x23, 0x34, 0x8c, 0x49, 0x96, 0xd1, 0x6a, 0x7f, 0x12, 0xd4, 0x73, 0x31, 0xd9, 0x87, 0x62, 0x25, 0x24, 0xc5, 0x4e, 0x44, 0x10, - 0x77, 0x72, 0x58, 0x1f, 0x77, 0x83, 0x33, 0x48, 0x99, 0x6e, 0xe5, 0x07, 0x0f, 0x0f, 0x0d, 0x64, 0x87, 0xda, 0xa4, 0x16, 0x0f, 0x83, 0xd7, 0x2a, 0x13, 0x03, 0x84, 0xe7, 0xa1, 0xdc, 0xcd, 0x44, - 0x2a, 0x40, 0x36, 0x75, 0xf0, 0x21, 0xab, 0xd1, 0xb0, 0xd2, 0xe2, 0x5e, 0x28, 0x03, 0x7f, 0x28, 0xa6, 0x76, 0xa1, 0xf8, 0xf4, 0xde, 0x4f, 0xff, 0xa7, 0xf8, 0xb8, 0x50, 0x59, 0x22, 0xf5, 0x19, - 0x98, 0x42, 0x40, 0xcc, 0xdb, 0xa6, 0x22, 0x40, 0xa2, 0x80, 0x9d, 0xd9, 0x73, 0xbb, 0x2f, 0x62, 0x4f, 0x07, 0x39, 0x05, 0x08, 0x29, 0x2a, 0xe3, 0x83, 0xd6, 0x54, 0x43, 0x26, 0x95, 0x79, 0xd4, - 0x8e, 0x48, 0x3f, 0xdf, 0x54, 0xa9, 0x54, 0x53, 0xc9, 0x52, 0xd8, 0x0e, 0x9e, 0x72, 0x68, 0x3d, 0x50, 0x3f, 0x06, 0x54, 0x2a, 0xf5, 0xd8, 0xbe, 0xe3, 0x1c, 0x53, 0x3a, 0xf8, 0xc4, 0x98, 0x00, - 0xf4, 0xf5, 0x57, 0x86, 0x65, 0x77, 0x87, 0x07, 0xb3, 0x1b, 0x0d, 0xe4, 0xb7, 0x78, 0xf0, 0x44, 0xf5, 0x95, 0x0f, 0x61, 0xd9, 0x4d, 0x67, 0x1f, 0xb4, 0x90, 0xcf, 0xf3, 0x39, 0x41, 0xb1, 0x8a, - 0x01, 0x14, 0x17, 0xb6, 0xae, 0x24, 0x67, 0xbc, 0x04, 0x6f, 0x80, 0x74, 0xcd, 0x03, 0x88, 0x74, 0x0a, 0xb6, 0xd8, 0xaa, 0x3d, 0x4e, 0x9c, 0x8d, 0xb9, 0xde, 0xf9, 0xa5, 0xdd, 0xf9, 0xf0, 0x51, - 0xd9, 0xd9, 0xd1, 0x04, 0x01, 0x53, 0xc2, 0x60, 0x6c, 0xc5, 0x8c, 0x67, 0x1b, 0xd3, 0x75, 0xb3, 0xd5, 0x6a, 0xe1, 0x01, 0xde, 0x64, 0x08, 0xa0, 0xe5, 0x24, 0x6c, 0x36, 0xbe, 0x31, 0xfb, 0xad, - 0xd4, 0x90, 0x77, 0xf3, 0xe5, 0x6e, 0x33, 0xf1, 0x4b, 0xf1, 0xdb, 0xef, 0xe7, 0x71, 0xfd, 0xca, 0x7b, 0xbf, 0x12, 0xf8, 0x9e, 0x23, 0x21, 0xe2, 0x1e, 0x76, 0x5e, 0xa3, 0xa4, 0x33, 0x18, 0x37, - 0x92, 0xfe, 0xd4, 0x6f, 0x04, 0x46, 0x39, 0x6d, 0x4c, 0x66, 0xd2, 0x24, 0x89, 0x74, 0x6a, 0x96, 0x60, 0x3c, 0x8b, 0xe3, 0xb3, 0x05, 0x29, 0xdb, 0x49, 0xd2, 0x2d, 0xb2, 0xec, 0x4c, 0xed, 0xb8, - 0xf5, 0x0e, 0x34, 0x74, 0xd4, 0x36, 0xa3, 0x03, 0xc5, 0xa7, 0xcc, 0xde, 0xf7, 0xe3, 0xc9, 0x79, 0x58, 0xa2, 0xba, 0xda, 0x9f, 0xc9, 0x94, 0xf3, 0xd0, 0xdf, 0xe1, 0xc8, 0xaf, 0xe5, 0x66, 0x4c, - 0xfa, 0xfb, 0x4d, 0x56, 0xe7, 0x05, 0x09, 0xee, 0x36, 0xb9, 0xf3, 0x13, 0xa4, 0x86, 0x3b, 0xa9, 0xf2, 0xb7, 0xa5, 0x96, 0x5f, 0x75, 0x14, 0x7f, 0x3f, 0x64, 0x6f, 0x2a, 0x22, 0x3e, 0x5f, 0xdd, - 0x1e, 0xda, 0x3b, 0x7f, 0xd1, 0x7d, 0x1e, 0xc1, 0xe7, 0xb3, 0x8b, 0x4a, 0x38, 0x42, 0xb4, 0x8f, 0x1d, 0xb8, 0xed, 0x66, 0xb0, 0xdf, 0x2d, 0x71, 0x0a, 0x22, 0xfc, 0x33, 0xb7, 0xf4, 0xbc, 0x53, - 0xb4, 0x0c, 0xdc, 0xfc, 0xa8, 0x57, 0x27, 0x43, 0xf6, 0xd2, 0x7a, 0x93, 0x16, 0x93, 0x23, 0x67, 0x8b, 0x89, 0xd4, 0x2f, 0xb7, 0x10, 0xd2, 0x78, 0xcb, 0x63, 0x7f, 0xe0, 0xeb, 0x0c, 0xdf, 0xa7, - 0x8e, 0x93, 0xee, 0xb8, 0xb2, 0x40, 0xcf, 0xee, 0xcc, 0xc7, 0x6c, 0xe1, 0x08, 0x41, 0x6b, 0x68, 0xc6, 0xa9, 0xbf, 0x55, 0x3c, 0xf2, 0x4f, 0x17, 0x7f, 0x40, 0x0f, 0xd6, 0x09, 0xdc, 0x14, 0x7f, - 0xbc, 0xef, 0x1a, 0xf3, 0xe3, 0x1e, 0xff, 0x5a, 0xc6, 0xcb, 0x0a, 0x9b, 0x6a, 0x38, 0x23, 0xa2, 0x40, 0x72, 0xa8, 0xb4, 0x26, 0xa8, 0x68, 0xd8, 0xa7, 0x40, 0xf4, 0xe4, 0xba, 0x8b, 0xa6, 0x2a, - 0xd5, 0x64, 0x8e, 0x6c, 0x4c, 0x46, 0x3b, 0xed, 0x16, 0x15, 0xa5, 0x0a, 0x68, 0x67, 0x43, 0x78, 0x4c, 0x51, 0xba, 0xd4, 0xa9, 0xc2, 0xba, 0x0a, 0xc8, 0x56, 0x6f, 0x36, 0x7b, 0xeb, 0x98, 0x12, - 0xfc, 0xba, 0x91, 0x38, 0x09, 0x87, 0x0a, 0x3b, 0xfb, 0x50, 0xb9, 0xf4, 0xef, 0xe2, 0x8f, 0x07, 0x07, 0xf5, 0xff, 0xb0, 0xe2, 0x8f, 0x0b, 0xc4, 0xc6, 0xa5, 0x34, 0xfe, 0xbe, 0x65, 0xf4, 0xd0, - 0x32, 0xf2, 0x8b, 0xee, 0x0b, 0xf2, 0xcb, 0xf5, 0x6c, 0x8a, 0x8e, 0x5b, 0x46, 0x36, 0xa9, 0x06, 0x1a, 0x19, 0x63, 0xb2, 0x86, 0xba, 0x21, 0xf9, 0x08, 0xeb, 0x57, 0x93, 0x0c, 0xdb, 0x2c, 0x56, - 0x27, 0x1d, 0xc3, 0x30, 0xc0, 0xf7, 0x29, 0x66, 0xcb, 0xcf, 0xaa, 0xb9, 0xb4, 0x0a, 0xcd, 0x8d, 0xb4, 0x55, 0x55, 0xc0, 0x23, 0x38, 0xde, 0x5c, 0xd1, 0x66, 0xe3, 0x16, 0xde, 0x56, 0x6b, 0xd6, - 0x90, 0x94, 0xe9, 0x59, 0x24, 0x0a, 0x49, 0xbb, 0x4e, 0xe7, 0xf3, 0x48, 0x03, 0x16, 0x8b, 0x78, 0x94, 0xb6, 0xf0, 0xf4, 0x5b, 0xaf, 0xa0, 0x22, 0xf7, 0x59, 0xf2, 0x08, 0x6e, 0xfa, 0x5b, 0xc2, - 0x2f, 0x3c, 0x79, 0x3e, 0xbd, 0x38, 0x2f, 0x46, 0xe4, 0x66, 0x79, 0x5b, 0x2d, 0x9c, 0x2d, 0x76, 0xc5, 0xf6, 0x28, 0xed, 0xca, 0x13, 0x33, 0x0f, 0x23, 0x45, 0x8e, 0x65, 0xa0, 0xdb, 0x46, 0x75, - 0xc7, 0x1e, 0x26, 0xfa, 0x5c, 0x5a, 0xb6, 0xfc, 0xda, 0xa3, 0x5c, 0x0e, 0x02, 0xea, 0x56, 0xe4, 0xa8, 0x7a, 0x38, 0x1c, 0x12, 0x7f, 0x16, 0xb7, 0x8a, 0x3d, 0x11, 0x6a, 0x52, 0xb7, 0xda, 0xfd, - 0x9a, 0x33, 0xf3, 0xb2, 0xe4, 0x8f, 0x72, 0x0c, 0x45, 0xcb, 0x19, 0x24, 0x19, 0x8f, 0x55, 0xc7, 0x57, 0xef, 0x2a, 0x6c, 0x61, 0xe8, 0x33, 0xc0, 0xda, 0x2f, 0x3a, 0x52, 0x7d, 0xd2, 0xd2, 0xe7, - 0xc7, 0x3b, 0x3e, 0x3f, 0x53, 0x7d, 0x64, 0x9a, 0x56, 0x77, 0x7a, 0xfb, 0xc0, 0xa3, 0x60, 0x3d, 0x2e, 0x0e, 0x5a, 0xb0, 0x18, 0xc8, 0x9c, 0xc0, 0x63, 0xc4, 0x3d, 0x58, 0x76, 0xcd, 0xd2, 0xea, - 0xca, 0xdf, 0xc6, 0x7d, 0xaf, 0x4d, 0xe6, 0x4e, 0x8a, 0x1d, 0xa5, 0x50, 0x6f, 0xdc, 0x19, 0xb4, 0x34, 0x00, 0x0e, 0x94, 0xf0, 0x89, 0x82, 0xe0, 0xe8, 0x26, 0x83, 0x0c, 0x35, 0xe8, 0xd5, 0x08, - 0x64, 0xb6, 0x5d, 0x46, 0x70, 0x80, 0xb0, 0x54, 0x0e, 0xec, 0x9e, 0x6e, 0xe2, 0x73, 0x2f, 0x7a, 0x8d, 0x36, 0xd1, 0xfe, 0xc0, 0xad, 0x71, 0x11, 0x97, 0x4b, 0x12, 0xca, 0x5d, 0x2d, 0xf6, 0x21, - 0x63, 0xe6, 0x95, 0xec, 0x8b, 0x48, 0x5e, 0xdb, 0x38, 0x8f, 0x6c, 0xe0, 0x9c, 0xd7, 0x1b, 0x49, 0x8b, 0x94, 0xbd, 0xca, 0xec, 0xe0, 0x1d, 0x3b, 0xdf, 0xab, 0x5a, 0x4a, 0x1c, 0xda, 0xf2, 0x84, - 0x96, 0xa9, 0x91, 0xf8, 0x5e, 0x8a, 0xed, 0xf8, 0x7d, 0x4c, 0xa0, 0x4b, 0x68, 0x47, 0x5a, 0x4b, 0xa2, 0x44, 0x04, 0xb0, 0xcd, 0xec, 0x40, 0x1e, 0x7a, 0x79, 0x3e, 0x00, 0xba, 0xbe, 0xe1, 0x22, - 0xee, 0xd8, 0x20, 0x78, 0x2e, 0x08, 0xe6, 0x3c, 0xb3, 0x37, 0x11, 0xa7, 0x2e, 0xb7, 0xab, 0x51, 0x26, 0xf3, 0xa7, 0xc8, 0x55, 0xef, 0x27, 0xe9, 0x03, 0xd6, 0xf2, 0x5d, 0xc4, 0x2a, 0x74, 0x5c, - 0xa1, 0xda, 0x60, 0x92, 0xf3, 0x82, 0xda, 0x2c, 0x14, 0xa8, 0x30, 0xc3, 0xe0, 0x40, 0x9b, 0xb0, 0x9f, 0x6f, 0x57, 0x2c, 0x7f, 0xda, 0x75, 0x5e, 0x75, 0x26, 0x78, 0x55, 0xee, 0x74, 0x64, 0xad, - 0xb7, 0x34, 0xb2, 0xc2, 0xf8, 0xaa, 0x33, 0x35, 0x5d, 0xa2, 0x92, 0x64, 0x1f, 0x40, 0xbb, 0x73, 0x37, 0x59, 0xd3, 0xa9, 0x6f, 0x8b, 0xd1, 0x2a, 0x83, 0x61, 0xb8, 0x3d, 0x2c, 0x76, 0x6b, 0xdf, - 0xd1, 0x37, 0xd2, 0x7e, 0xf9, 0x98, 0x1e, 0xfb, 0x11, 0xa1, 0xea, 0x6a, 0xf0, 0xde, 0x91, 0xaf, 0xfe, 0x05, 0x21, 0xe2, 0x73, 0xdf, 0x03, 0xf4, 0xd0, 0x92, 0x77, 0x25, 0x7a, 0x61, 0xe5, 0xf5, - 0xf0, 0x52, 0xc4, 0x3d, 0x62, 0xa9, 0x13, 0x51, 0xc4, 0x11, 0x5d, 0x61, 0xb1, 0xae, 0xb3, 0xb3, 0x57, 0xb3, 0x6a, 0x6f, 0x15, 0x16, 0x9a, 0x6f, 0xe6, 0xe7, 0x81, 0xd0, 0x83, 0x5a, 0x50, 0x83, - 0xd0, 0x58, 0x2a, 0xad, 0x86, 0x2b, 0x6c, 0x05, 0x9e, 0x00, 0x86, 0xdf, 0xe2, 0x0d, 0x68, 0x18, 0x44, 0x71, 0x22, 0x20, 0xac, 0x3b, 0x86, 0x3a, 0x5e, 0x6c, 0xec, 0xc5, 0x4c, 0xb3, 0x39, 0x2b, - 0x3b, 0xac, 0x94, 0x2d, 0x97, 0x4f, 0xe4, 0xe6, 0xf8, 0x18, 0x1f, 0xdf, 0x66, 0x88, 0x56, 0xbf, 0x20, 0x34, 0x6e, 0xd4, 0xfb, 0x2c, 0xb0, 0xd2, 0x5f, 0x08, 0x1b, 0xd7, 0xa2, 0xa0, 0xcf, 0xf9, - 0x5c, 0x58, 0x7e, 0x7f, 0xd7, 0xdb, 0xf5, 0x90, 0x83, 0xe7, 0x89, 0xe2, 0x13, 0x87, 0x9f, 0xfe, 0x8f, 0xcd, 0x96, 0xd7, 0xbc, 0xc9, 0x5c, 0x6e, 0x29, 0x0f, 0x00, 0x33, 0x04, 0xae, 0x9c, 0xad, - 0xcd, 0x70, 0xa2, 0x22, 0x26, 0x07, 0x6d, 0x4b, 0x83, 0x2d, 0x42, 0xbb, 0x6c, 0xb2, 0x52, 0xdc, 0xc0, 0x4a, 0x87, 0x72, 0xe1, 0x95, 0x4d, 0x0e, 0x6b, 0x4e, 0x22, 0x6e, 0x72, 0x80, 0x3b, 0x65, - 0xc3, 0x20, 0x01, 0x0d, 0x31, 0x14, 0x42, 0xbf, 0x49, 0x30, 0xba, 0x44, 0xe6, 0x87, 0x05, 0xba, 0x59, 0xd3, 0xed, 0xca, 0xcd, 0x3f, 0x64, 0xf9, 0x5e, 0x7b, 0x1d, 0xdf, 0xd3, 0x2a, 0x7e, 0x1f, - 0xb8, 0xd9, 0x28, 0x2e, 0xde, 0x96, 0xc2, 0xbb, 0x68, 0x11, 0x23, 0xc0, 0x9a, 0x67, 0xc4, 0x7e, 0x2e, 0xd1, 0x39, 0x03, 0x6a, 0x1d, 0x8c, 0x9f, 0x5a, 0x71, 0x5f, 0xcd, 0xdd, 0x4d, 0x17, 0x34, - 0xe1, 0x29, 0x42, 0x11, 0xf8, 0x44, 0xb5, 0x2e, 0xcd, 0xb9, 0xfa, 0x04, 0x87, 0xe4, 0x45, 0xae, 0x16, 0xba, 0xe3, 0xe2, 0xbb, 0x62, 0x2b, 0xe9, 0xc8, 0x8e, 0xdd, 0x09, 0x2d, 0xb5, 0x47, 0x57, - 0x3b, 0x9e, 0xcc, 0x22, 0x71, 0x86, 0x20, 0x7a, 0x47, 0xcc, 0x67, 0x7b, 0x47, 0xa0, 0xd8, 0x66, 0x94, 0x16, 0x51, 0x78, 0x2f, 0xed, 0x18, 0xee, 0x8d, 0x34, 0xf4, 0xc8, 0x50, 0x5f, 0xa9, 0x5e, - 0x99, 0x70, 0x39, 0x9c, 0x5e, 0x49, 0x7d, 0xcf, 0x8a, 0x74, 0x26, 0xa7, 0x3d, 0x56, 0xf1, 0x0c, 0xba, 0xdf, 0x01, 0x2b, 0xe1, 0x4c, 0x2d, 0x78, 0x4c, 0x1e, 0xc2, 0xc0, 0x38, 0xeb, 0x7b, 0x78, - 0x26, 0xef, 0x4e, 0xab, 0xc2, 0xe2, 0xaa, 0x6a, 0x93, 0x9b, 0xb6, 0x4d, 0x90, 0xc7, 0x22, 0x59, 0x4c, 0x5c, 0x66, 0x98, 0xe1, 0x01, 0x3f, 0x13, 0x4d, 0x10, 0xcb, 0x1a, 0x92, 0x69, 0xa2, 0x99, - 0x27, 0x81, 0x24, 0x4a, 0xd8, 0x9b, 0xa8, 0x8c, 0xb4, 0x26, 0x55, 0x1e, 0x9b, 0x50, 0x65, 0x56, 0x04, 0x49, 0xe5, 0x3e, 0xab, 0xf8, 0x7f, 0xdf, 0x36, 0xcf, 0x7a, 0xc7, 0xc6, 0xc2, 0xe8, 0xa7, - 0x75, 0x72, 0x65, 0xdb, 0x3d, 0x2b, 0xf7, 0x11, 0x46, 0xbe, 0xd2, 0xbd, 0xf0, 0xf2, 0xf5, 0xec, 0x62, 0xe5, 0x8e, 0xe0, 0x26, 0xcb, 0xf4, 0x5d, 0x2a, 0x28, 0x27, 0xb5, 0xa7, 0x38, 0xac, 0xac, - 0x54, 0x07, 0x5b, 0x6e, 0xbc, 0xc4, 0x46, 0x97, 0xa9, 0xd3, 0x2e, 0xd6, 0xf8, 0xc0, 0xd9, 0x6e, 0x2e, 0x4c, 0xce, 0x4c, 0x98, 0x44, 0x7a, 0x4c, 0xd2, 0x03, 0x60, 0xc9, 0xb3, 0xcc, 0x25, 0x0a, - 0xc0, 0x92, 0xd1, 0x63, 0x8e, 0x81, 0xe5, 0x0e, 0xc8, 0xc0, 0xf5, 0xd9, 0x0a, 0xd5, 0xe5, 0x52, 0x6c, 0xf7, 0x08, 0xb3, 0x2a, 0xd6, 0xfd, 0x98, 0xbc, 0x6f, 0xa3, 0x28, 0xae, 0x3e, 0x86, 0xbb, - 0x62, 0xf5, 0x08, 0x33, 0x02, 0xf7, 0xba, 0x82, 0x3c, 0x1d, 0x5c, 0x25, 0xea, 0x7b, 0x16, 0x20, 0xd4, 0x69, 0x70, 0xba, 0x39, 0x37, 0x5f, 0x31, 0x52, 0x48, 0x31, 0x1c, 0xd3, 0x07, 0x18, 0x80, - 0x40, 0x16, 0xc1, 0x6c, 0x4c, 0xcf, 0x04, 0x73, 0xa6, 0x2f, 0xba, 0x19, 0x7b, 0xec, 0x44, 0x1b, 0x34, 0xa8, 0xd6, 0x47, 0x2d, 0x12, 0x3e, 0x85, 0x9c, 0x09, 0x6b, 0xee, 0x5c, 0xad, 0xd3, 0xd4, - 0x2b, 0xb8, 0x22, 0x12, 0xe6, 0x96, 0x92, 0x27, 0xe4, 0xac, 0x58, 0xcf, 0x18, 0x56, 0x57, 0x2c, 0x75, 0xd4, 0xdc, 0x2a, 0xef, 0xe2, 0xc1, 0xc3, 0x37, 0xc8, 0x49, 0xa3, 0x19, 0x50, 0x5e, 0xa0, - 0xe0, 0x9f, 0xfe, 0x5d, 0x3c, 0xb7, 0x23, 0xdc, 0x55, 0xe4, 0x9e, 0x3d, 0x7a, 0xf4, 0x7e, 0x11, 0x6c, 0xcb, 0x19, 0x98, 0xc2, 0xb2, 0x43, 0x64, 0x59, 0x93, 0x21, 0xa5, 0x73, 0x60, 0xb5, 0xbd, - 0xcc, 0xa1, 0xa8, 0x65, 0xef, 0x4b, 0x65, 0xbe, 0x72, 0xf9, 0xa5, 0xaa, 0xea, 0x3b, 0x81, 0x39, 0x1e, 0xa8, 0x32, 0x38, 0x1a, 0xb2, 0x78, 0xe4, 0x20, 0x3d, 0x49, 0x26, 0x71, 0xae, 0x43, 0x82, - 0x7b, 0xd0, 0x91, 0x01, 0xa1, 0x8f, 0xcb, 0x61, 0x9f, 0xe1, 0xbe, 0x3c, 0xee, 0xe5, 0xab, 0xe2, 0x92, 0xd0, 0x7c, 0x5f, 0x13, 0x84, 0x1f, 0xdb, 0x46, 0xde, 0x10, 0xbe, 0x30, 0xe3, 0xd7, 0xe9, - 0x85, 0x29, 0x23, 0x26, 0x85, 0x8e, 0x57, 0x5c, 0x0b, 0xf5, 0x95, 0xa2, 0x55, 0xb3, 0x30, 0xe7, 0x2c, 0x41, 0x9c, 0x08, 0x52, 0xe5, 0xa8, 0xd0, 0xa1, 0xe6, 0xb7, 0xf3, 0x13, 0x08, 0xd7, 0xf5, - 0xa6, 0xda, 0x4a, 0xd0, 0xbe, 0xc1, 0xe6, 0xa1, 0x26, 0x6d, 0xb7, 0xde, 0xcc, 0x0a, 0xcc, 0x5d, 0xcb, 0x6c, 0xd2, 0x96, 0xe8, 0x07, 0x5d, 0x9c, 0x38, 0x0b, 0x0b, 0x22, 0x96, 0xf1, 0x8e, 0x11, - 0x8d, 0x08, 0x34, 0x33, 0x04, 0x2b, 0xee, 0x41, 0xe3, 0xbf, 0x63, 0x4a, 0x9f, 0x58, 0xe7, 0xe0, 0x7e, 0x7b, 0xd0, 0x47, 0x62, 0x7b, 0x2f, 0x44, 0x2f, 0xcc, 0xb8, 0x1e, 0x8e, 0x6d, 0xd6, 0x2a, - 0x38, 0xc1, 0x5c, 0x60, 0xd1, 0x4a, 0xf6, 0xc1, 0x53, 0xae, 0x22, 0x4c, 0xe7, 0x6b, 0xf8, 0xdc, 0xe6, 0x80, 0xb8, 0x3d, 0x78, 0x8d, 0xa9, 0x6f, 0x8c, 0x3d, 0x6f, 0xc8, 0xe7, 0x89, 0x59, 0xfa, - 0xe7, 0x10, 0xdc, 0xcf, 0x2c, 0x97, 0xb5, 0xbc, 0x93, 0x71, 0x2e, 0x1c, 0x32, 0x2c, 0xd8, 0xd6, 0xa8, 0xb4, 0xad, 0x39, 0x4c, 0xd6, 0xe9, 0xda, 0x3e, 0xed, 0xba, 0x62, 0x1b, 0xc4, 0x30, 0x17, - 0x1e, 0xc7, 0x45, 0x92, 0xaa, 0x34, 0x0e, 0xac, 0x69, 0x19, 0x39, 0xce, 0xfd, 0x96, 0x09, 0x0f, 0x49, 0xc7, 0x1b, 0xc2, 0x4f, 0x0c, 0x79, 0x73, 0x3a, 0x56, 0xe5, 0x38, 0xf3, 0x42, 0x48, 0xe7, - 0x0b, 0x1f, 0xcf, 0x3a, 0x50, 0x3b, 0xf2, 0xeb, 0x09, 0x2a, 0x99, 0x43, 0x1a, 0xc8, 0x40, 0xa2, 0x9c, 0xd9, 0xc5, 0x91, 0xaf, 0x6d, 0xb8, 0x6e, 0x92, 0x4d, 0x5e, 0xd3, 0x10, 0xd0, 0xcd, 0x0c, - 0x7c, 0x29, 0xe9, 0xdc, 0x46, 0x01, 0x17, 0xd6, 0x90, 0x6f, 0x41, 0x29, 0xc1, 0xf0, 0xf4, 0x04, 0x28, 0x8a, 0x04, 0xed, 0x4c, 0x75, 0x6b, 0x84, 0x7a, 0x96, 0x21, 0xeb, 0x79, 0xf5, 0x01, 0xc3, - 0xe0, 0x6e, 0x6b, 0x8e, 0x7b, 0xbc, 0xf8, 0xfd, 0x76, 0x76, 0x9f, 0x3f, 0xe2, 0x89, 0x2b, 0x9f, 0xde, 0xb8, 0xf0, 0x67, 0x44, 0xc7, 0x3b, 0x9a, 0xa3, 0xc1, 0x6d, 0xc0, 0xa3, 0x98, 0x13, 0x64, - 0xce, 0x10, 0xec, 0x15, 0x68, 0x27, 0x8a, 0xc0, 0x5e, 0x71, 0x69, 0x15, 0x2c, 0x6b, 0x77, 0xbd, 0xd7, 0xe2, 0x70, 0xef, 0x35, 0x87, 0x32, 0x55, 0xe1, 0x2a, 0xef, 0xac, 0x4a, 0x72, 0x16, 0x7b, - 0x27, 0x3c, 0x5a, 0x2e, 0x5f, 0x75, 0xa7, 0x6d, 0xbe, 0x54, 0x38, 0x48, 0xed, 0x24, 0xa2, 0xcc, 0x60, 0xa1, 0xd8, 0x93, 0xc7, 0x8c, 0x3d, 0x61, 0xe5, 0x47, 0x95, 0xac, 0x69, 0x82, 0xf4, 0x0e, - 0x3b, 0x88, 0x1b, 0x54, 0xb9, 0xf1, 0xec, 0x68, 0x82, 0xf4, 0xf2, 0xf6, 0x4d, 0x90, 0x4e, 0x89, 0x0f, 0xc0, 0xbe, 0x9f, 0xbe, 0xac, 0xb2, 0x88, 0xb8, 0x53, 0x23, 0xd4, 0x2d, 0xd3, 0xef, 0xb6, - 0x88, 0xe8, 0x92, 0xe6, 0xec, 0xb8, 0x25, 0x35, 0x3d, 0xd6, 0x06, 0xd8, 0x3d, 0x50, 0x5e, 0x03, 0x23, 0x36, 0x36, 0xe8, 0x2b, 0x3b, 0x72, 0x80, 0x1c, 0xf1, 0xc4, 0x30, 0xee, 0x48, 0xc3, 0xa9, - 0x29, 0x30, 0x3b, 0x81, 0xf4, 0x50, 0xce, 0xc4, 0x23, 0xb7, 0xf7, 0xdc, 0x3c, 0x5f, 0xea, 0xe7, 0xa2, 0x77, 0xa0, 0x39, 0x13, 0xd1, 0x8a, 0xd7, 0x8e, 0xf0, 0x12, 0x3f, 0xab, 0xdf, 0x9f, 0x34, - 0x4b, 0x79, 0x9b, 0x57, 0xf3, 0xee, 0xd6, 0x6d, 0x85, 0xf6, 0x3f, 0x9e, 0xfe, 0xf2, 0xb6, 0x1a, 0x7c, 0x3c, 0xdf, 0x3f, 0xa6, 0xbf, 0xa0, 0xe3, 0x3c, 0x1b, 0xa2, 0x7c, 0x5c, 0xb1, 0xf5, 0x5e, - 0x45, 0x1c, 0xba, 0x92, 0x36, 0x62, 0x93, 0xf0, 0x27, 0x7c, 0x63, 0x9d, 0x9d, 0x0a, 0x0a, 0xc1, 0x6a, 0x26, 0xd4, 0x42, 0xb9, 0x1a, 0x44, 0x71, 0x28, 0x9d, 0x33, 0x3d, 0x83, 0xf5, 0x88, 0xc8, - 0x55, 0x77, 0xb5, 0x16, 0x97, 0x41, 0xd9, 0x6a, 0xf9, 0xba, 0x61, 0x8f, 0xcc, 0x81, 0x15, 0x3c, 0x6d, 0x82, 0x33, 0x40, 0x43, 0xf1, 0xbc, 0xef, 0xf8, 0x6d, 0xe7, 0x9e, 0x3f, 0xa4, 0xbf, 0xfc, - 0x3b, 0xcf, 0x65, 0x6c, 0x9e, 0xcb, 0xaf, 0xf7, 0xfe, 0x8f, 0xb7, 0xff, 0x5f, 0x66, 0xac, 0x69, 0x44, 0x46, 0x62, 0x39, 0xf6, 0xf4, 0x2b, 0xfb, 0xfc, 0xb1, 0xde, 0x2d, 0xb7, 0xa4, 0x81, 0xe9, - 0xbb, 0x0b, 0x63, 0x7a, 0xb9, 0x5c, 0x34, 0xc1, 0x74, 0xef, 0xa8, 0x02, 0xa8, 0x70, 0x07, 0x0c, 0xf7, 0x79, 0x68, 0x11, 0x9b, 0x5a, 0xb9, 0x45, 0x7b, 0x23, 0x57, 0xf1, 0x2a, 0x0c, 0xd8, 0xc8, - 0xec, 0x64, 0x5a, 0x17, 0x32, 0x16, 0xdc, 0x1e, 0xe7, 0x13, 0xca, 0xd1, 0x50, 0x53, 0x5e, 0x18, 0x1a, 0xb8, 0x48, 0xba, 0x0a, 0xac, 0x3a, 0x98, 0x2b, 0x32, 0x39, 0x3b, 0xb6, 0x92, 0x21, 0xb6, - 0xeb, 0x68, 0xbd, 0x5f, 0x6e, 0xfc, 0x93, 0x3a, 0x13, 0xc7, 0x28, 0xc3, 0xa6, 0x51, 0x3a, 0x18, 0x7a, 0xbf, 0xd1, 0x2b, 0xf4, 0x73, 0xf6, 0xc0, 0x82, 0xf6, 0x4a, 0xf5, 0xc2, 0x90, 0xe7, 0xe3, - 0xe9, 0x85, 0xd6, 0xf7, 0xbc, 0x58, 0x6c, 0x33, 0xe3, 0x14, 0xb1, 0x09, 0x51, 0xa1, 0xfb, 0x83, 0x29, 0xb0, 0x54, 0x3f, 0x31, 0x67, 0x93, 0xed, 0xd6, 0x6b, 0x64, 0xb4, 0x29, 0x4a, 0x9a, 0x68, - 0xcc, 0xa6, 0x30, 0x03, 0x69, 0x93, 0x95, 0xb8, 0xbb, 0xa5, 0x95, 0x73, 0x78, 0xa6, 0x8b, 0x1e, 0x0b, 0x03, 0xb0, 0x50, 0x37, 0x21, 0x05, 0x9e, 0x07, 0x93, 0x77, 0xc4, 0x5d, 0x3b, 0x74, 0x39, - 0x11, 0xf4, 0x59, 0x8a, 0x42, 0xb9, 0x73, 0xfc, 0x10, 0xd2, 0x37, 0x83, 0xc4, 0x28, 0xfa, 0xa9, 0xd3, 0x55, 0x4e, 0xf2, 0xf4, 0xb2, 0xf7, 0x63, 0x80, 0x8f, 0xa0, 0xf2, 0x7c, 0xa0, 0xfe, 0xc4, - 0x88, 0xf7, 0xd7, 0xa6, 0xf0, 0x38, 0xd8, 0x9d, 0x90, 0xb6, 0xaa, 0x0d, 0xb0, 0x3e, 0x48, 0xa6, 0x9e, 0x6e, 0xfa, 0x73, 0xea, 0xb0, 0xa6, 0xaf, 0x65, 0x42, 0xc4, 0x93, 0x39, 0xc3, 0x5b, 0xad, - 0xb6, 0xd9, 0x6e, 0x52, 0x0f, 0x85, 0x97, 0x33, 0x96, 0x16, 0xd5, 0x56, 0x52, 0xf6, 0x76, 0x48, 0xb1, 0x76, 0xe0, 0x87, 0x21, 0x48, 0x47, 0x89, 0xef, 0x48, 0xb8, 0x19, 0x99, 0x0a, 0x66, 0xb3, - 0x82, 0xe1, 0xf2, 0x8b, 0x60, 0x4f, 0xa4, 0xa9, 0x74, 0x0f, 0x23, 0xe6, 0x3d, 0x8f, 0xaa, 0xc2, 0xb9, 0xeb, 0x1f, 0x7c, 0x70, 0xc6, 0x3c, 0x13, 0xbd, 0x72, 0xe4, 0x72, 0x38, 0x76, 0x96, 0x1c, - 0x04, 0xce, 0x53, 0xb8, 0x36, 0x5c, 0x18, 0x2a, 0x33, 0x23, 0xc0, 0xbd, 0x96, 0x20, 0x3b, 0xc3, 0x3a, 0x78, 0x61, 0x5d, 0x14, 0x26, 0x17, 0x3b, 0xb8, 0xae, 0xf3, 0x27, 0x66, 0xbf, 0x3f, 0xe0, - 0x71, 0x5c, 0x9d, 0x30, 0x49, 0x92, 0x7d, 0x70, 0xe9, 0x21, 0x59, 0xbb, 0xb6, 0x92, 0x4a, 0xc2, 0x71, 0x7a, 0x59, 0x6c, 0xa1, 0x1d, 0xc8, 0x77, 0x67, 0xd3, 0xa9, 0x42, 0x2b, 0xd5, 0x86, 0x43, - 0xbb, 0xfd, 0xb0, 0xbf, 0x9b, 0x85, 0x61, 0x39, 0x53, 0xa7, 0xcb, 0x8c, 0xa4, 0xbc, 0x6f, 0x35, 0x5f, 0x32, 0xa2, 0x1e, 0x98, 0x19, 0xb7, 0xc4, 0x9f, 0x98, 0x70, 0x7b, 0xe5, 0x9a, 0x6a, 0x35, - 0x62, 0x9a, 0x04, 0x54, 0x2d, 0xb2, 0xf4, 0xca, 0x2b, 0x58, 0x0d, 0x67, 0xe1, 0x66, 0xb9, 0x06, 0x66, 0x5d, 0x36, 0x80, 0xf8, 0xb0, 0x67, 0x49, 0x10, 0x54, 0xb2, 0xda, 0xcb, 0xfd, 0xf8, 0x54, - 0x1d, 0x62, 0x4e, 0xc0, 0x66, 0x10, 0x11, 0x53, 0xb5, 0xcc, 0xa5, 0xc2, 0x69, 0x15, 0xd9, 0x4b, 0x32, 0x02, 0x3d, 0x88, 0xc0, 0x6b, 0x37, 0x1d, 0x6c, 0x83, 0xf5, 0x8e, 0x5b, 0xeb, 0xb4, 0x32, - 0x31, 0x28, 0x67, 0xee, 0x75, 0x89, 0xfe, 0x46, 0x25, 0xf8, 0xb0, 0xbe, 0x7e, 0xa2, 0x1b, 0x58, 0x69, 0x62, 0x19, 0xd5, 0x34, 0xbe, 0x18, 0x9e, 0x7f, 0x81, 0xf7, 0xdd, 0xa8, 0x17, 0x7e, 0xdc, - 0x13, 0x39, 0xe4, 0x31, 0x91, 0xbb, 0x90, 0x7c, 0xe1, 0x75, 0x79, 0x49, 0xd6, 0x1a, 0x21, 0x6e, 0x26, 0x51, 0xc7, 0x93, 0x1d, 0x24, 0x0f, 0x1c, 0x72, 0xa4, 0xf7, 0x43, 0xe3, 0xc7, 0x98, 0xb7, - 0x1e, 0xa0, 0xde, 0x55, 0x4c, 0xb2, 0xc2, 0x4e, 0x4a, 0x64, 0x2d, 0xb7, 0x8b, 0xa6, 0x8c, 0x73, 0x4a, 0xd7, 0x57, 0x2d, 0x8a, 0x0d, 0x18, 0x8c, 0x45, 0x87, 0x70, 0x1e, 0x42, 0xfd, 0x52, 0x3c, - 0x22, 0x08, 0x3b, 0x63, 0x27, 0x11, 0x29, 0x65, 0x3a, 0x27, 0x42, 0x67, 0x22, 0x9a, 0xe0, 0x04, 0x6b, 0x80, 0x8f, 0x71, 0xd8, 0x0d, 0xa2, 0x68, 0x5a, 0x18, 0x89, 0xf7, 0x02, 0x8c, 0x7c, 0x9f, - 0x7d, 0xb5, 0xeb, 0xde, 0xcd, 0x7f, 0xc3, 0x6e, 0x6a, 0xe4, 0x46, 0xb3, 0xef, 0x42, 0xf2, 0x89, 0x7d, 0x97, 0x83, 0xe9, 0x85, 0xca, 0xf7, 0xec, 0x5b, 0x29, 0x01, 0x95, 0xf1, 0x5d, 0xd5, 0x06, - 0xba, 0xce, 0x2e, 0x75, 0xd3, 0x32, 0x95, 0xb5, 0xa5, 0x87, 0x4b, 0xf9, 0xb0, 0xa6, 0x92, 0x79, 0x9f, 0x03, 0x19, 0xbd, 0x3a, 0x2b, 0xd1, 0x7c, 0x06, 0x2c, 0xba, 0x81, 0x86, 0x12, 0x83, 0xb4, - 0x2a, 0x1e, 0x3f, 0x09, 0x18, 0x51, 0x04, 0x1c, 0xe0, 0xed, 0xf6, 0xf4, 0x09, 0x2f, 0xed, 0x82, 0x33, 0x7b, 0xc2, 0x4f, 0xdd, 0x05, 0x7d, 0xaa, 0xeb, 0x5c, 0x18, 0x91, 0xc6, 0xf0, 0x76, 0x4b, - 0x7b, 0x12, 0xc4, 0x77, 0x48, 0xce, 0x81, 0xe3, 0x38, 0xf8, 0x0c, 0x7d, 0xbe, 0x09, 0x7f, 0xcd, 0xc7, 0x4b, 0xb0, 0xfd, 0xab, 0x15, 0xe0, 0x41, 0x66, 0x5e, 0xe8, 0xfe, 0xe2, 0xe8, 0x25, 0xa4, - 0x3f, 0x32, 0xc7, 0x92, 0x93, 0x2c, 0x6d, 0xa9, 0x9a, 0xd4, 0xb6, 0x5a, 0xa6, 0xb8, 0xe9, 0xe7, 0xcb, 0x12, 0x9b, 0x61, 0x20, 0xdb, 0xdb, 0xa8, 0x66, 0xa4, 0x8d, 0x1e, 0x09, 0xc0, 0x79, 0x7e, - 0x40, 0xfc, 0xf0, 0xa0, 0xae, 0x80, 0xa1, 0x3d, 0xe2, 0x5b, 0xf2, 0x60, 0xef, 0xb7, 0xa8, 0xb7, 0xae, 0x00, 0x73, 0x68, 0xf7, 0x73, 0xce, 0x94, 0x67, 0x79, 0x6a, 0x4e, 0x56, 0xb3, 0xb0, 0x2e, - 0xf5, 0xd2, 0x04, 0x4f, 0xd2, 0x16, 0x1e, 0xb3, 0x1b, 0xbc, 0x6d, 0xc3, 0xf8, 0xcf, 0x6d, 0x07, 0xaf, 0x54, 0x81, 0xe9, 0xaf, 0xe3, 0xb1, 0x1b, 0x02, 0x2e, 0x4c, 0x56, 0x26, 0x15, 0xf8, 0x05, - 0x39, 0x3b, 0x32, 0xe6, 0xea, 0xe4, 0x94, 0x56, 0xd5, 0xc6, 0xca, 0xd6, 0x70, 0xb0, 0x42, 0x08, 0xd6, 0x43, 0x3c, 0x40, 0x81, 0x55, 0x38, 0xc7, 0xcd, 0x04, 0x34, 0x16, 0xf8, 0x6e, 0xe3, 0xd6, - 0xb9, 0xbf, 0x2c, 0x53, 0x58, 0x99, 0x27, 0x56, 0x66, 0xad, 0xaa, 0x81, 0x93, 0xaa, 0x41, 0x73, 0x61, 0x89, 0x61, 0x6a, 0xe7, 0xb8, 0x61, 0x94, 0x53, 0x99, 0x17, 0x23, 0x44, 0xec, 0xa5, 0x2e, - 0xfe, 0x6d, 0x57, 0xca, 0xf7, 0x85, 0x04, 0x4e, 0x35, 0x7d, 0xda, 0xde, 0x82, 0xa4, 0x0c, 0xac, 0xd7, 0x25, 0xf1, 0x8e, 0x93, 0xf6, 0xe9, 0xc5, 0xcb, 0xa0, 0xfa, 0x62, 0xd9, 0x7b, 0xc4, 0x45, - 0xfb, 0x4a, 0xf5, 0x99, 0xb5, 0x97, 0xe3, 0x4b, 0xf4, 0x68, 0x84, 0xd2, 0x21, 0x12, 0x64, 0xb8, 0x28, 0xb5, 0x46, 0xdf, 0x4f, 0x0e, 0x6b, 0x5a, 0x5d, 0x43, 0x90, 0xcf, 0x52, 0xd2, 0xb2, 0xc1, - 0xd1, 0x93, 0x82, 0xe1, 0x27, 0x35, 0x98, 0x6d, 0x36, 0x2b, 0xfe, 0xb8, 0xce, 0x77, 0x30, 0x32, 0x2b, 0xc9, 0x38, 0xd4, 0xd0, 0x49, 0xde, 0xcd, 0xb9, 0xba, 0x89, 0xca, 0x59, 0xd0, 0xf4, 0xfc, - 0x92, 0xb7, 0xaa, 0x0e, 0xc5, 0x3a, 0x69, 0x27, 0x21, 0x86, 0x52, 0x2f, 0xf1, 0xb2, 0xbc, 0x17, 0x28, 0x7f, 0xc7, 0x8b, 0xd8, 0x89, 0x2c, 0xe3, 0xae, 0xe3, 0xff, 0xb1, 0x5c, 0xc3, 0x57, 0xaa, - 0x17, 0x5e, 0x3c, 0x1f, 0x8f, 0xcd, 0x35, 0xdc, 0xc1, 0xc4, 0x5e, 0x21, 0x21, 0x1c, 0x4c, 0xda, 0xe3, 0x1e, 0x43, 0xd4, 0xb0, 0x8a, 0x96, 0xc2, 0x12, 0xb1, 0x23, 0x5b, 0x5a, 0x64, 0xc6, 0x46, - 0xd3, 0xcf, 0xc2, 0x1a, 0xaa, 0xb9, 0x95, 0x3b, 0xb8, 0x48, 0x21, 0xd7, 0xa2, 0xe3, 0xb1, 0x06, 0xeb, 0x94, 0xbd, 0xe3, 0x4c, 0x4e, 0x9d, 0x34, 0x39, 0x62, 0xfb, 0x46, 0xa6, 0xa5, 0x03, 0xa6, - 0x16, 0xb6, 0x60, 0xcb, 0x81, 0x0c, 0xcd, 0x90, 0x76, 0x33, 0x06, 0x99, 0xeb, 0xd7, 0x2f, 0xfd, 0x22, 0xf1, 0x1e, 0x7b, 0x08, 0xf7, 0xe7, 0x96, 0xf4, 0x0d, 0x57, 0x2e, 0x89, 0xf6, 0xd8, 0x38, - 0xf0, 0x9f, 0x53, 0xd1, 0x1a, 0x0b, 0xb0, 0x59, 0x6e, 0x8d, 0x41, 0x24, 0xcf, 0x09, 0x18, 0x64, 0x4a, 0xc0, 0x65, 0x7b, 0x23, 0x3c, 0xd1, 0x7b, 0x67, 0xb2, 0x0d, 0x25, 0xb7, 0x08, 0x7d, 0x8b, - 0xe4, 0xba, 0x4d, 0x05, 0x0c, 0x89, 0xd9, 0x44, 0xac, 0x4d, 0x88, 0x2d, 0x70, 0x30, 0x62, 0x63, 0x98, 0x2d, 0x49, 0xf4, 0xe8, 0xfa, 0x25, 0xb2, 0x57, 0x65, 0x44, 0x9f, 0xc7, 0xad, 0x5c, 0x03, - 0x22, 0x52, 0x22, 0xa7, 0xc7, 0x62, 0x22, 0x6f, 0x05, 0xe7, 0xda, 0x93, 0xe6, 0x16, 0xc1, 0xdf, 0xc8, 0xa6, 0xa9, 0x19, 0xfe, 0xf5, 0xa9, 0x7b, 0x22, 0xaf, 0x03, 0xeb, 0x3c, 0x8d, 0x8a, 0xfa, - 0xaf, 0x5f, 0xb5, 0x3d, 0x9f, 0xcf, 0x54, 0xff, 0x3e, 0x60, 0x1f, 0xfa, 0x50, 0x84, 0xf7, 0xb6, 0xe5, 0x10, 0x3a, 0x2e, 0xb6, 0x9b, 0x6e, 0x13, 0xd3, 0x5f, 0xf5, 0xf2, 0x5a, 0xcb, 0xd4, 0xda, - 0x19, 0x88, 0x80, 0xe4, 0xe2, 0x7e, 0x69, 0xa0, 0x89, 0x19, 0xa2, 0x6b, 0x41, 0xea, 0x6b, 0xdf, 0x02, 0xda, 0x7e, 0x7e, 0x3e, 0xe1, 0xc0, 0xf1, 0x20, 0x5a, 0xed, 0x5a, 0x98, 0x1f, 0x16, 0x18, - 0x46, 0x88, 0x35, 0x21, 0x9f, 0x05, 0x7c, 0x02, 0x32, 0x38, 0xb6, 0xdf, 0xc9, 0x82, 0xd3, 0xb7, 0x73, 0x2a, 0x93, 0x40, 0x0c, 0x0a, 0xd0, 0x7b, 0xb9, 0x3d, 0xdf, 0xb0, 0xfd, 0x7d, 0x8b, 0x21, - 0xf4, 0x7d, 0x5b, 0x86, 0x4f, 0x1a, 0x06, 0xe1, 0x97, 0xcf, 0xdc, 0x61, 0x70, 0x7a, 0x0e, 0x6c, 0xe3, 0x2b, 0x68, 0xef, 0xdf, 0xd7, 0x60, 0x5e, 0x88, 0x5e, 0xd8, 0x7c, 0x3d, 0xbc, 0x20, 0x79, - 0x8f, 0xd0, 0x62, 0xe8, 0x02, 0x29, 0xdd, 0xad, 0x2c, 0x62, 0xa9, 0x62, 0x85, 0x2e, 0xbc, 0x89, 0xd5, 0x78, 0xb5, 0x71, 0x9d, 0x03, 0xd7, 0x68, 0xa4, 0xed, 0x78, 0x1d, 0x09, 0x06, 0x07, 0x69, - 0xe6, 0x98, 0xf0, 0x01, 0x02, 0xeb, 0xd5, 0x46, 0xa5, 0x16, 0x7b, 0x42, 0x20, 0x7b, 0xdd, 0x3e, 0x2c, 0xfa, 0x83, 0x49, 0x74, 0x1a, 0x3f, 0x20, 0x4c, 0x18, 0x2a, 0x5e, 0x38, 0x3f, 0xef, 0x8e, - 0xa5, 0xae, 0xe4, 0x4b, 0xec, 0xfc, 0x58, 0x9d, 0xfa, 0x9b, 0x04, 0x83, 0xbf, 0xfe, 0x46, 0xde, 0x39, 0x6e, 0x7e, 0xe9, 0xcd, 0x4f, 0xf7, 0xde, 0xb7, 0x48, 0x2e, 0x2f, 0x05, 0x00, 0xd7, 0xbb, - 0xf0, 0xfb, 0xea, 0x34, 0x2f, 0x4a, 0xcd, 0x69, 0x66, 0x14, 0xce, 0xb5, 0x8b, 0xf7, 0xdf, 0xb3, 0xf7, 0xa4, 0x2f, 0x4d, 0xbe, 0x2f, 0xc6, 0xeb, 0x4b, 0xf8, 0xfe, 0xef, 0x8f, 0xcd, 0x37, 0x7e, - 0xd5, 0xc6, 0xfd, 0xfd, 0xa1, 0x36, 0xee, 0x63, 0xfc, 0xff, 0xef, 0x0f, 0xf1, 0xff, 0xc2, 0x31, 0x6c, 0x3b, 0x28, 0xb2, 0xe7, 0xbb, 0x77, 0x61, 0x1c, 0xad, 0x28, 0xad, 0xed, 0xd7, 0xd7, 0xb9, - 0xa7, 0xe5, 0xfe, 0x3e, 0x84, 0xe3, 0x1b, 0xba, 0x4f, 0x62, 0xf2, 0xeb, 0xec, 0xa2, 0xef, 0x8e, 0xc0, 0x6f, 0x3c, 0x18, 0x3d, 0x01, 0x99, 0x4a, 0x59, 0x57, 0xab, 0xb3, 0xde, 0xb1, 0x09, 0x07, - 0x6f, 0xc1, 0xc2, 0x69, 0xe6, 0x33, 0x1b, 0xec, 0x70, 0x43, 0xd1, 0x11, 0x66, 0x42, 0xc6, 0x31, 0x01, 0x30, 0xc9, 0x7a, 0x28, 0x0f, 0x15, 0xe3, 0x3a, 0xe4, 0x79, 0x67, 0x69, 0x2b, 0x1a, 0xb5, - 0x06, 0x1d, 0x24, 0xe4, 0x54, 0x48, 0x30, 0x51, 0xd8, 0x46, 0x93, 0x62, 0xad, 0x19, 0xe4, 0x7e, 0xa2, 0x25, 0x93, 0x70, 0x3d, 0x42, 0x19, 0xf9, 0x03, 0xcc, 0xf7, 0xac, 0x48, 0x2d, 0xa7, 0xbc, - 0xde, 0x04, 0x2f, 0xf0, 0x66, 0x37, 0xdf, 0xaf, 0xab, 0x20, 0x7a, 0xb9, 0xf7, 0xae, 0x81, 0x4b, 0x5d, 0x07, 0xf6, 0xf3, 0x53, 0x91, 0x37, 0x5a, 0xcd, 0x1b, 0xa1, 0xfe, 0x77, 0xb2, 0xf0, 0xcd, - 0x2b, 0xfc, 0x3b, 0x59, 0xf8, 0xa1, 0x41, 0xfd, 0x3f, 0x2c, 0x59, 0xf8, 0x5e, 0x0b, 0xbc, 0xf7, 0xc1, 0xe7, 0x07, 0x14, 0xdc, 0x2f, 0x5b, 0xdf, 0x8d, 0xac, 0xa6, 0x92, 0xe5, 0x25, 0x25, 0x96, - 0x21, 0x1e, 0xd4, 0x40, 0x67, 0xce, 0xd2, 0xed, 0xc9, 0x2a, 0x57, 0xec, 0x3e, 0xcb, 0x56, 0x7c, 0x52, 0x86, 0xc0, 0x0c, 0x16, 0x0e, 0x8a, 0xbc, 0x35, 0xd1, 0x41, 0x9c, 0xa5, 0x89, 0xd6, 0x1e, - 0x56, 0xc8, 0x70, 0x88, 0x63, 0x25, 0xe5, 0x2d, 0xc1, 0x65, 0xa8, 0x09, 0x25, 0xd3, 0x99, 0xbb, 0x05, 0xd4, 0x19, 0x81, 0xba, 0x9c, 0x87, 0x10, 0x3a, 0x4b, 0x19, 0xcb, 0x68, 0xfb, 0x58, 0x76, - 0xec, 0x6d, 0xab, 0xbb, 0xbf, 0xa1, 0x0b, 0xe4, 0xef, 0x17, 0x3c, 0x4d, 0xee, 0xb7, 0xfc, 0x85, 0x1e, 0x42, 0xf8, 0xfe, 0xaa, 0xaf, 0xdd, 0x88, 0xdd, 0xc0, 0x16, 0xfa, 0x09, 0xb2, 0xa8, 0x8f, - 0x88, 0x01, 0xb7, 0xbc, 0xa9, 0xb3, 0xeb, 0x9a, 0xd3, 0x33, 0xc5, 0xf2, 0x42, 0xa6, 0xde, 0xa9, 0x40, 0x4d, 0xee, 0x80, 0xda, 0xb4, 0xf4, 0xd5, 0x5c, 0xd0, 0x4c, 0x3a, 0x25, 0x5c, 0x17, 0x15, - 0x88, 0xfe, 0x90, 0xcd, 0x48, 0x17, 0x74, 0xdc, 0x3d, 0x51, 0x2f, 0xd3, 0x53, 0x3a, 0xcb, 0xd1, 0x55, 0x87, 0xdb, 0xa7, 0xb9, 0xe0, 0x49, 0x8c, 0xe6, 0x2d, 0x4a, 0x69, 0x94, 0x99, 0x9e, 0xc6, - 0x66, 0x90, 0x38, 0xf6, 0xd3, 0xac, 0x77, 0x8c, 0xfb, 0xce, 0x0b, 0xf0, 0x27, 0xf1, 0x00, 0x4f, 0x6e, 0x68, 0x5f, 0x18, 0x73, 0x73, 0xe5, 0x32, 0x07, 0x89, 0xef, 0xb9, 0xb3, 0x92, 0x78, 0x94, - 0x93, 0xdd, 0x7a, 0xe3, 0xb0, 0x2e, 0x6e, 0x91, 0x26, 0xc9, 0x6d, 0x56, 0x9a, 0xbf, 0xdd, 0xd3, 0xf9, 0x04, 0x3e, 0x2f, 0xfe, 0xff, 0xec, 0xfd, 0x59, 0x93, 0xba, 0x5a, 0xb3, 0x2f, 0x8c, 0xde, - 0x9f, 0x4f, 0x31, 0xe3, 0xb9, 0x65, 0x3b, 0xe9, 0xbb, 0x7d, 0xb5, 0x40, 0x50, 0x14, 0x05, 0x41, 0x40, 0xe1, 0x62, 0x47, 0xd0, 0x37, 0xd2, 0x49, 0x2b, 0x44, 0x9c, 0xf3, 0xd9, 0x4f, 0x94, 0x56, - 0x5f, 0xfa, 0x2f, 0xa6, 0x6b, 0xbe, 0xf1, 0x46, 0xec, 0x58, 0x57, 0x45, 0x57, 0x89, 0xfc, 0x46, 0x8e, 0x1c, 0x99, 0x39, 0xb2, 0x61, 0x2a, 0x36, 0xcd, 0x54, 0xb6, 0x73, 0xbb, 0x05, 0x8f, 0xb3, - 0x2c, 0x2c, 0x58, 0xe2, 0xb1, 0xd9, 0x2f, 0x98, 0x3d, 0x17, 0x79, 0xe9, 0x48, 0x8f, 0xb2, 0xd9, 0x5f, 0x22, 0x2a, 0xe5, 0xbc, 0xbc, 0xcb, 0xb6, 0xb2, 0x0f, 0x02, 0xb8, 0xeb, 0x15, 0xfc, 0x93, - 0x4d, 0x65, 0x3d, 0x3f, 0xb5, 0x87, 0xcf, 0x70, 0xdd, 0xc2, 0xa9, 0x1e, 0x69, 0x1f, 0x45, 0x96, 0xd9, 0xb9, 0xf7, 0xd0, 0xc3, 0x06, 0x43, 0x4f, 0x05, 0x07, 0xbc, 0x93, 0xbd, 0x41, 0x7a, 0x3b, - 0x9e, 0xdd, 0x88, 0xfd, 0x8e, 0xe6, 0xb8, 0xc7, 0x77, 0xb9, 0xb6, 0x42, 0x90, 0xc5, 0x4a, 0xdd, 0x12, 0x43, 0x2a, 0x1d, 0xa8, 0x25, 0xc6, 0x94, 0xd0, 0x8a, 0x97, 0x87, 0x13, 0x81, 0x04, 0xd1, - 0x66, 0xcf, 0x41, 0x40, 0x2b, 0xa8, 0x1a, 0xbd, 0x75, 0xd5, 0xf9, 0x66, 0x59, 0x9e, 0x0c, 0xa9, 0xb3, 0x0b, 0xcc, 0x49, 0xe2, 0xac, 0x14, 0xc1, 0xe5, 0x3e, 0x1a, 0xf2, 0x41, 0x39, 0x2d, 0x16, - 0x17, 0x21, 0xea, 0xb7, 0x2e, 0xaf, 0x65, 0x5e, 0xfb, 0x63, 0xc7, 0xc4, 0x2d, 0xb2, 0xb2, 0xc8, 0xfd, 0xbc, 0x99, 0xf9, 0x59, 0xdc, 0x34, 0x8f, 0x21, 0x78, 0x2a, 0x6c, 0xf8, 0x07, 0xf5, 0x1b, - 0x12, 0x5f, 0xaf, 0x4d, 0xed, 0x75, 0xa1, 0x7a, 0x68, 0xed, 0x13, 0x0a, 0x0b, 0xd4, 0x32, 0xac, 0xf5, 0x67, 0x2b, 0xa9, 0x5d, 0xa5, 0x6a, 0xab, 0x92, 0xdf, 0xad, 0x02, 0x19, 0x02, 0x07, 0x33, - 0xdf, 0xc7, 0x39, 0xa1, 0x80, 0x15, 0x87, 0x66, 0x72, 0xdb, 0x08, 0x9d, 0x5e, 0xcd, 0x99, 0x68, 0xdd, 0x3a, 0x68, 0x45, 0x43, 0xad, 0xe4, 0x00, 0x7b, 0x7e, 0xcf, 0xb6, 0x3c, 0xa4, 0x98, 0x05, - 0x4b, 0x43, 0xa6, 0x17, 0xd8, 0x4d, 0xad, 0x4e, 0x32, 0xd8, 0x3f, 0x7b, 0xb9, 0xef, 0x81, 0x03, 0x3d, 0x29, 0xdc, 0xdf, 0xc8, 0x5e, 0x51, 0x79, 0x3b, 0x99, 0x41, 0xd3, 0xc4, 0x3a, 0xb8, 0xaf, - 0x3a, 0xcc, 0xab, 0xfb, 0x41, 0x91, 0xd8, 0xa0, 0x88, 0x96, 0xe5, 0x48, 0x17, 0x84, 0xe9, 0xa0, 0xcb, 0x11, 0xdd, 0x57, 0x3a, 0x77, 0x66, 0x05, 0xbc, 0xd2, 0xda, 0x68, 0xa9, 0x92, 0x76, 0xd4, - 0xa4, 0x8e, 0x29, 0xe6, 0xc6, 0xa5, 0x47, 0x9c, 0xf9, 0x62, 0xab, 0xa6, 0x89, 0xcd, 0x90, 0xfc, 0x51, 0xb0, 0x8f, 0x16, 0xd5, 0xd7, 0x82, 0x57, 0x78, 0x8b, 0xce, 0x39, 0x45, 0x62, 0x76, 0x9e, - 0x06, 0x47, 0x71, 0x8a, 0x1f, 0x89, 0x65, 0xe8, 0xa9, 0x2e, 0x4d, 0x37, 0x92, 0x57, 0x18, 0x5e, 0x0e, 0x66, 0xd0, 0xb4, 0x86, 0x4c, 0xa6, 0x85, 0x2e, 0xf5, 0x21, 0x07, 0x0b, 0x2a, 0x0c, 0xc4, - 0x75, 0x9a, 0xa7, 0x47, 0x32, 0x24, 0x2f, 0x67, 0x2c, 0x1c, 0x64, 0x42, 0xde, 0xb7, 0xd1, 0x72, 0x27, 0xda, 0xf6, 0xb2, 0xae, 0x97, 0x2c, 0x72, 0x0e, 0x39, 0x7d, 0x0f, 0x85, 0xbb, 0xb0, 0xd1, - 0xba, 0x62, 0xb0, 0x36, 0x5a, 0x43, 0x33, 0x0e, 0xe1, 0xcd, 0xb1, 0x28, 0x70, 0x69, 0xcf, 0xc0, 0xed, 0xea, 0xd4, 0xb9, 0xa0, 0x3c, 0xcf, 0xaa, 0x1f, 0x5b, 0x47, 0xb7, 0xdf, 0x94, 0x3c, 0xb4, - 0x5e, 0x9f, 0xeb, 0x35, 0xf1, 0x4e, 0xf5, 0xfd, 0xab, 0x13, 0x7b, 0x72, 0x83, 0x89, 0x0d, 0x77, 0x21, 0x0a, 0xa1, 0x12, 0x81, 0x5d, 0x34, 0x6e, 0xc4, 0xb5, 0x4e, 0x27, 0xf8, 0x9e, 0x04, 0x4d, - 0x34, 0xd9, 0x82, 0x99, 0x2e, 0x74, 0x1c, 0xc8, 0xf9, 0x2b, 0xf8, 0xa0, 0x64, 0xeb, 0x9c, 0xc0, 0x91, 0x78, 0x37, 0xc7, 0x4d, 0x4c, 0x63, 0xc7, 0x39, 0x9d, 0x02, 0xb8, 0xbc, 0x95, 0x8f, 0xe9, - 0xa0, 0x69, 0x0c, 0xb0, 0xcf, 0x0c, 0x7d, 0x97, 0x41, 0x82, 0xa2, 0xf7, 0x25, 0x87, 0xaf, 0xcf, 0x53, 0x76, 0x96, 0xdd, 0xca, 0xb7, 0x1b, 0x7f, 0xf6, 0x2a, 0x74, 0xff, 0x55, 0x1f, 0xfa, 0x57, - 0xd2, 0x2f, 0xa8, 0x7c, 0xb9, 0x30, 0xd5, 0x93, 0xee, 0xb9, 0xe2, 0xe2, 0x88, 0x26, 0x39, 0xb4, 0x2d, 0x57, 0xf6, 0x31, 0x89, 0xeb, 0x42, 0xed, 0xfc, 0xcb, 0x6a, 0x6d, 0xf0, 0xe2, 0x68, 0x9f, - 0xc9, 0x11, 0xa9, 0x2c, 0xf1, 0x12, 0x00, 0xdb, 0x7d, 0x45, 0x6b, 0x27, 0x2f, 0x13, 0xb2, 0x5a, 0xc7, 0x32, 0x24, 0x75, 0x37, 0x45, 0x52, 0x25, 0xe0, 0x42, 0x48, 0xa9, 0xec, 0x84, 0x1b, 0x97, - 0x6d, 0x66, 0x32, 0x40, 0xd0, 0xa8, 0xa7, 0x1d, 0x88, 0x16, 0x8f, 0xb4, 0x9d, 0x6f, 0xd0, 0x14, 0x75, 0x3d, 0xab, 0x4b, 0xbb, 0x7f, 0xb4, 0xbb, 0x48, 0x3e, 0xb5, 0x51, 0xf3, 0x89, 0xee, 0x15, - 0x94, 0xf7, 0xb3, 0x6b, 0x85, 0xf3, 0x09, 0xce, 0x8e, 0x58, 0xe5, 0x76, 0x6b, 0x51, 0xdf, 0x19, 0xbc, 0xc4, 0x91, 0x9e, 0xb0, 0x93, 0xa9, 0xea, 0xe4, 0xc8, 0xf9, 0xae, 0x1c, 0xb8, 0x21, 0x74, - 0xb9, 0x45, 0x73, 0x48, 0x4a, 0xff, 0x20, 0xcd, 0xc3, 0x81, 0x3a, 0xec, 0x90, 0xea, 0xe8, 0x5e, 0x8e, 0x1b, 0x4a, 0xab, 0x4f, 0xaa, 0xaf, 0xa4, 0x84, 0x5c, 0xb1, 0xc8, 0x92, 0x04, 0xf4, 0x75, - 0x65, 0x87, 0x35, 0x7c, 0x86, 0xf1, 0x45, 0xeb, 0xb9, 0xe4, 0x92, 0x78, 0xce, 0xd9, 0x51, 0xda, 0x4d, 0x34, 0x3b, 0xf9, 0xb7, 0x48, 0x23, 0xf4, 0x87, 0x4f, 0x29, 0xf2, 0x1d, 0x3b, 0x0f, 0x67, - 0xaf, 0x6b, 0xe5, 0x7f, 0xfe, 0xf7, 0xbd, 0x84, 0xe1, 0x3e, 0x8a, 0x3f, 0x65, 0x13, 0x3c, 0x70, 0xe8, 0x79, 0xfe, 0xcd, 0x23, 0xf1, 0x88, 0x3b, 0xff, 0xb9, 0x84, 0xba, 0x52, 0xbc, 0x46, 0x15, - 0xbd, 0x7c, 0x02, 0x3c, 0xcd, 0xdd, 0xde, 0xd5, 0x06, 0xb1, 0xc7, 0x44, 0x43, 0xe8, 0xb4, 0xe5, 0xc5, 0xe1, 0xdd, 0x38, 0x21, 0xa3, 0xd3, 0x41, 0xed, 0xa0, 0x55, 0x03, 0xd4, 0xcb, 0xe5, 0xc1, - 0x90, 0xb7, 0x04, 0xe9, 0x29, 0x9e, 0x0f, 0x16, 0xf8, 0x31, 0xc9, 0x2b, 0x40, 0xcc, 0x36, 0xc9, 0xe5, 0xb0, 0x8e, 0x63, 0xa4, 0xe5, 0x65, 0x67, 0x55, 0x35, 0xf0, 0xdc, 0xdd, 0xd2, 0x3d, 0x64, - 0xda, 0x45, 0x77, 0x01, 0x62, 0x39, 0x5d, 0x6d, 0x80, 0x1f, 0xf2, 0xe9, 0x7b, 0x28, 0xd5, 0x57, 0xcf, 0x1a, 0xf2, 0x44, 0x6d, 0xfd, 0xaf, 0x21, 0x54, 0x57, 0x1a, 0xbf, 0x7f, 0xec, 0x7c, 0x91, - 0x8c, 0xa6, 0xc9, 0xc4, 0x98, 0x16, 0x05, 0xb1, 0xd2, 0xc5, 0x63, 0xb5, 0x50, 0xfc, 0x4e, 0xd3, 0x8e, 0x42, 0x93, 0xcf, 0xcf, 0x87, 0xc0, 0x27, 0x2f, 0x30, 0x13, 0x85, 0x7c, 0xed, 0x6a, 0x23, - 0x61, 0x39, 0x1b, 0x27, 0x28, 0x36, 0xea, 0x66, 0xd7, 0x86, 0x9a, 0x32, 0xb0, 0x4d, 0x44, 0x04, 0x94, 0xc5, 0xab, 0x86, 0xbe, 0x1f, 0x0e, 0xc2, 0x82, 0x03, 0xc9, 0x43, 0x8b, 0x35, 0xf0, 0xf1, - 0x39, 0x33, 0x23, 0xfb, 0xec, 0x19, 0x79, 0xc0, 0x20, 0x57, 0xc7, 0x72, 0x3c, 0x3e, 0x96, 0x61, 0xcf, 0x44, 0x88, 0x7c, 0x90, 0xbd, 0xa2, 0xf7, 0x76, 0x72, 0x2d, 0xba, 0x3f, 0x81, 0x5f, 0x46, - 0x64, 0x0f, 0x1c, 0xe8, 0x23, 0x89, 0x46, 0x8c, 0xae, 0x9f, 0x62, 0x40, 0x02, 0x68, 0xcb, 0x46, 0x52, 0x36, 0x6d, 0x73, 0x8a, 0x1e, 0xe3, 0x50, 0x1e, 0x96, 0x55, 0x6d, 0x5f, 0x00, 0x51, 0x57, - 0x88, 0x5e, 0x3c, 0x60, 0x56, 0x71, 0x28, 0x79, 0x93, 0x3d, 0x2d, 0x23, 0x25, 0xe9, 0x99, 0x24, 0xe1, 0xe6, 0xa7, 0xc3, 0x25, 0x32, 0x21, 0x43, 0xe4, 0xa3, 0x13, 0xd5, 0x8f, 0x26, 0xb9, 0xc0, - 0xdd, 0x29, 0xe6, 0xc5, 0xa7, 0x9f, 0xfa, 0x87, 0x3d, 0x89, 0xe7, 0xe4, 0xfa, 0x37, 0xda, 0x5f, 0x81, 0xb9, 0xee, 0x4a, 0x4c, 0x94, 0xec, 0x87, 0x78, 0x77, 0x09, 0xf9, 0xb8, 0x5a, 0x19, 0x10, - 0xe8, 0xaf, 0xe4, 0xad, 0x9b, 0x2f, 0x58, 0x06, 0x05, 0x57, 0x6b, 0x8b, 0xb1, 0xce, 0x62, 0xde, 0x33, 0xfd, 0x61, 0xe8, 0x3a, 0x2f, 0xc6, 0xd2, 0xba, 0x82, 0x0f, 0x73, 0x09, 0x41, 0xf2, 0xc8, - 0x0b, 0x40, 0xd4, 0x73, 0x50, 0xae, 0xb0, 0x5c, 0x3d, 0xd1, 0x0c, 0x64, 0x7f, 0x0e, 0xc6, 0x55, 0x2f, 0x0d, 0x25, 0x31, 0x20, 0x97, 0x1a, 0xcd, 0xb3, 0x67, 0xcd, 0x8b, 0x4f, 0xec, 0x73, 0xdb, - 0x27, 0xfc, 0x22, 0xa4, 0x3e, 0x6f, 0x4b, 0xc0, 0xff, 0x34, 0xf1, 0xfe, 0xe3, 0x9f, 0xff, 0xe4, 0x79, 0x79, 0xae, 0x36, 0xd8, 0x2b, 0x6d, 0x70, 0xf6, 0x76, 0x74, 0x27, 0xab, 0xe1, 0xaf, 0x47, - 0x03, 0x40, 0x4a, 0xe0, 0x19, 0x4d, 0x07, 0x0b, 0xd8, 0x18, 0xf3, 0x92, 0xdc, 0x8d, 0xed, 0xa5, 0x5a, 0x57, 0x98, 0xb8, 0x75, 0x58, 0x1e, 0x89, 0x0e, 0x24, 0xab, 0x91, 0xa6, 0x14, 0xdb, 0x28, - 0x0a, 0xc9, 0x8b, 0xcb, 0x2a, 0xc0, 0x3c, 0xb4, 0xc2, 0x47, 0xa3, 0x8c, 0xdd, 0x1d, 0x42, 0xe0, 0x50, 0x4a, 0xce, 0x77, 0x12, 0xa1, 0x6e, 0xe9, 0x51, 0x5e, 0xab, 0x29, 0x2a, 0x2d, 0xcb, 0xf3, - 0x3e, 0xee, 0x51, 0xfe, 0xf9, 0xe6, 0xa1, 0x5f, 0xfc, 0x6b, 0xff, 0x26, 0xbf, 0xbe, 0x91, 0x7d, 0x6d, 0xc8, 0x77, 0x3b, 0x99, 0xca, 0xa5, 0x83, 0x47, 0xbb, 0x38, 0xe3, 0xc5, 0x67, 0xc3, 0x55, - 0x81, 0x75, 0xe2, 0xf6, 0xba, 0xe2, 0xd0, 0xdc, 0x29, 0x5a, 0xbb, 0x54, 0x1e, 0x4a, 0x15, 0xb4, 0xb5, 0x23, 0x9e, 0x5d, 0x76, 0x5c, 0xbc, 0xee, 0xa9, 0xb2, 0x3d, 0xd8, 0x0e, 0x32, 0x58, 0x69, - 0x04, 0xe4, 0x27, 0xbb, 0x96, 0x73, 0x6b, 0x07, 0xf0, 0x4b, 0x8d, 0xd9, 0x11, 0x95, 0x5a, 0x22, 0xeb, 0x71, 0x1d, 0xad, 0xad, 0xb1, 0x93, 0x16, 0xd4, 0x73, 0x5c, 0x1a, 0xd7, 0x33, 0xbb, 0x0a, - 0xdb, 0x8f, 0xc6, 0xd5, 0xf0, 0xf7, 0xc6, 0x5f, 0x71, 0x3d, 0xf3, 0x5e, 0x74, 0xac, 0xc2, 0x49, 0x7c, 0xb7, 0x79, 0x7f, 0xe6, 0x7b, 0x7d, 0xbc, 0xb7, 0xac, 0x8a, 0x3b, 0x14, 0x6e, 0xff, 0x39, - 0x8b, 0xeb, 0xfb, 0xff, 0xfc, 0x7a, 0xfb, 0xbd, 0xe0, 0xd5, 0x8f, 0x1d, 0xf5, 0x5b, 0xfd, 0xf8, 0xbf, 0xcb, 0xaa, 0x68, 0x8a, 0x66, 0x28, 0xfd, 0xbf, 0x83, 0xd4, 0x0e, 0xdf, 0x9e, 0x45, 0x1e, - 0x19, 0xec, 0xd7, 0x61, 0x89, 0x1f, 0xc9, 0x29, 0xe8, 0xa9, 0x24, 0xba, 0x57, 0x9a, 0x6f, 0x83, 0x1e, 0xd7, 0x33, 0xe8, 0xf7, 0x64, 0x3a, 0x78, 0x56, 0x23, 0xf9, 0x01, 0x80, 0x11, 0x8a, 0x07, - 0xc8, 0x9d, 0x7e, 0x02, 0xd4, 0x5a, 0xe0, 0x00, 0xd2, 0x95, 0x8e, 0xe3, 0xa8, 0x4c, 0x91, 0xbb, 0x41, 0x9c, 0xfb, 0xb3, 0xb2, 0x2a, 0x4a, 0xbf, 0x6a, 0xe2, 0x3f, 0x04, 0xe5, 0x3d, 0xf7, 0x45, - 0xdf, 0xa8, 0x5f, 0xbf, 0xed, 0xdb, 0xb5, 0x2b, 0x5f, 0x4f, 0xd0, 0x22, 0xd1, 0xed, 0x39, 0x30, 0xc5, 0x04, 0x49, 0x37, 0xa3, 0xb7, 0xdd, 0x07, 0x94, 0xb5, 0xb2, 0x78, 0xd0, 0x00, 0xac, 0x76, - 0x00, 0xd8, 0x90, 0x23, 0x02, 0x98, 0xc0, 0x7c, 0x4a, 0x44, 0x7a, 0xd2, 0x0b, 0xf3, 0x52, 0x64, 0x2a, 0x96, 0xf3, 0xab, 0xa5, 0x59, 0x6e, 0x31, 0x62, 0x65, 0x9a, 0x6e, 0x92, 0x9f, 0xbc, 0x9d, - 0xb4, 0x4d, 0x76, 0x27, 0x9a, 0x21, 0x8c, 0x05, 0x4b, 0x01, 0xe8, 0x5e, 0x4c, 0x9f, 0x5c, 0xde, 0x7f, 0x32, 0x15, 0xf4, 0x37, 0xfc, 0x20, 0x08, 0xe3, 0xf6, 0xbd, 0x7f, 0x8a, 0x6e, 0x79, 0x66, - 0x95, 0xbf, 0xd2, 0x7c, 0x47, 0xd3, 0x9b, 0x92, 0xea, 0x01, 0xcf, 0x06, 0x13, 0x71, 0xc6, 0xce, 0x3b, 0x78, 0x6c, 0x2c, 0xf3, 0x4a, 0x5a, 0x2e, 0xd4, 0xa5, 0x85, 0xe1, 0x75, 0x50, 0x96, 0xdb, - 0x29, 0x9c, 0xf2, 0xcd, 0xa1, 0xf5, 0x6f, 0x7e, 0xce, 0x67, 0xd2, 0xd7, 0xaf, 0xfa, 0x7c, 0x61, 0xca, 0xc7, 0xbd, 0x30, 0x88, 0x35, 0xec, 0x39, 0x52, 0x0a, 0x68, 0xd8, 0xde, 0xb0, 0x90, 0x7a, - 0xd9, 0x60, 0xe2, 0xb2, 0x12, 0x05, 0xf6, 0x98, 0x92, 0xbc, 0x57, 0xc3, 0x1c, 0x93, 0xf1, 0x9e, 0x5b, 0x18, 0x76, 0x7f, 0xcc, 0x37, 0x1c, 0xb9, 0xe7, 0xa2, 0x52, 0x0a, 0x9b, 0x76, 0xb5, 0x42, - 0x6c, 0xe6, 0x14, 0x92, 0x36, 0xa9, 0xec, 0x31, 0x38, 0xb9, 0xec, 0xf6, 0x16, 0x4c, 0x96, 0x98, 0xe1, 0x2d, 0xf3, 0xad, 0x70, 0x42, 0xb7, 0x53, 0x0c, 0x2f, 0xcf, 0x1f, 0xed, 0x34, 0x7c, 0x94, - 0xbc, 0x01, 0x3f, 0xb5, 0x6f, 0xf8, 0x4a, 0xf3, 0x0a, 0xc6, 0xf5, 0xe8, 0x8a, 0xc2, 0x04, 0xcb, 0xbc, 0x3a, 0xee, 0x77, 0x90, 0x13, 0x00, 0x78, 0x0e, 0x29, 0x45, 0x5e, 0x3b, 0xc0, 0xde, 0x30, - 0x02, 0x29, 0x58, 0xd5, 0x71, 0x26, 0x63, 0x02, 0xdf, 0x64, 0xf9, 0xaa, 0xdc, 0x09, 0x26, 0xa5, 0xc0, 0xfa, 0x7c, 0x14, 0x53, 0xa5, 0xe2, 0xb6, 0x81, 0x57, 0x38, 0x15, 0x95, 0xaf, 0x65, 0xb9, - 0x56, 0xc3, 0xc3, 0x7c, 0xd8, 0xaa, 0x67, 0x7f, 0xcf, 0x2a, 0x63, 0x76, 0xd0, 0xb7, 0x67, 0x72, 0xec, 0x8c, 0xf8, 0x39, 0xf1, 0xff, 0x9a, 0x0f, 0x78, 0xcf, 0x86, 0xaa, 0xec, 0xb2, 0xbc, 0xfe, - 0xea, 0x47, 0xea, 0x71, 0x1c, 0x04, 0x0f, 0xf0, 0xc4, 0x9e, 0x0a, 0x08, 0x7b, 0x21, 0xf8, 0x02, 0x66, 0x1c, 0x04, 0x33, 0x6c, 0x5a, 0x18, 0x18, 0x4e, 0xa5, 0xd9, 0x45, 0xdc, 0x33, 0x18, 0x2b, - 0x0d, 0x9b, 0x11, 0x10, 0x84, 0xad, 0x3e, 0xa6, 0x32, 0x5f, 0x86, 0x10, 0xbd, 0x30, 0x00, 0xbf, 0x23, 0xac, 0xad, 0x8f, 0x76, 0xeb, 0x38, 0x0a, 0xbd, 0xcb, 0x18, 0xba, 0xbd, 0x45, 0x19, 0x05, - 0xcf, 0xef, 0x32, 0x66, 0x33, 0xb7, 0x96, 0xf4, 0x26, 0x3b, 0x07, 0x46, 0x21, 0x6d, 0xb7, 0x62, 0xd9, 0x34, 0x2b, 0x53, 0x33, 0x96, 0x44, 0xcb, 0x99, 0xe4, 0x24, 0x65, 0x38, 0xae, 0xde, 0x76, - 0xbd, 0xef, 0x9b, 0x54, 0xcf, 0x38, 0xfb, 0xde, 0x88, 0x5e, 0x41, 0xb8, 0x1d, 0x5e, 0x23, 0x56, 0x27, 0x68, 0x14, 0x87, 0x53, 0x75, 0x28, 0xe9, 0xa5, 0x8a, 0x89, 0xc7, 0x40, 0x5c, 0x9a, 0xa3, - 0xbc, 0xc9, 0xb4, 0x76, 0x69, 0xc4, 0xb0, 0x7e, 0x58, 0x04, 0x7d, 0x8d, 0x92, 0x64, 0x4e, 0xbb, 0x2e, 0x8e, 0x83, 0x8d, 0x43, 0x70, 0xed, 0x79, 0x58, 0x10, 0xa5, 0xab, 0xe0, 0x8c, 0x13, 0x0b, - 0x7c, 0x1d, 0xd9, 0x5c, 0x69, 0xd2, 0x1d, 0x51, 0xd8, 0xfb, 0x0a, 0x39, 0xce, 0xb9, 0xd8, 0x5b, 0x66, 0xdb, 0xde, 0x1b, 0x57, 0xcf, 0x85, 0x85, 0x5c, 0xed, 0xf7, 0x97, 0x65, 0xfa, 0x3f, 0x1f, - 0x01, 0x37, 0xf7, 0x19, 0xa8, 0x70, 0x9b, 0x2a, 0xce, 0x1f, 0x59, 0x57, 0xcf, 0x95, 0x6c, 0x7c, 0x23, 0xfa, 0x82, 0xe1, 0xeb, 0xe1, 0xd4, 0x12, 0x8d, 0xc3, 0x1e, 0x50, 0xf0, 0x18, 0x8d, 0xd8, - 0x80, 0x5c, 0xb2, 0x27, 0x0f, 0x13, 0x97, 0x94, 0x4d, 0xfa, 0xac, 0x24, 0x1d, 0xa4, 0xe5, 0x46, 0xb3, 0xf9, 0xbe, 0x37, 0x0f, 0x7a, 0x9c, 0xac, 0xcc, 0x2d, 0x39, 0x56, 0xa9, 0xc9, 0x6d, 0x21, - 0x76, 0x71, 0x14, 0x92, 0x64, 0x77, 0x48, 0x0f, 0x16, 0xac, 0x86, 0xa4, 0x6e, 0x7b, 0x9e, 0xe5, 0xaf, 0xb8, 0x2c, 0xa6, 0x93, 0x05, 0x2a, 0x64, 0xe7, 0x58, 0x41, 0x9e, 0xf3, 0x81, 0xf8, 0xf5, - 0xd7, 0xe6, 0x0f, 0x8f, 0x16, 0xae, 0xa2, 0x89, 0xc3, 0xbc, 0x78, 0xe8, 0x64, 0x83, 0x9e, 0x8a, 0x4b, 0x7a, 0xa7, 0x7a, 0xc5, 0xf0, 0xf5, 0xf8, 0xaa, 0xe8, 0x4c, 0x98, 0x91, 0xfa, 0x72, 0xb9, - 0x3c, 0x04, 0x7b, 0xbb, 0x6d, 0x6b, 0xdb, 0x58, 0xcf, 0x01, 0x2a, 0x08, 0x0d, 0x40, 0x32, 0x3a, 0xf6, 0x78, 0x9a, 0x6b, 0x99, 0xd1, 0x91, 0xf5, 0x89, 0xc8, 0x8b, 0x84, 0xb3, 0xac, 0xae, 0x95, - 0x75, 0x69, 0xa9, 0x0f, 0x90, 0x75, 0xc2, 0xf4, 0x52, 0x50, 0x38, 0x82, 0xe7, 0x92, 0x3d, 0x94, 0x94, 0x6c, 0xef, 0x32, 0xf3, 0x4e, 0xc0, 0xfc, 0x22, 0xe8, 0x86, 0x91, 0x75, 0x55, 0xee, 0x39, - 0x10, 0xaf, 0xed, 0xec, 0xde, 0xe3, 0xd2, 0xd1, 0xc7, 0x75, 0x25, 0xfc, 0xac, 0x48, 0xfe, 0x5c, 0x20, 0x86, 0x7a, 0x8a, 0x17, 0x3f, 0xd1, 0x05, 0x67, 0x9f, 0xcf, 0x66, 0xd4, 0x34, 0x8e, 0xdc, - 0xee, 0x13, 0x73, 0x74, 0x0f, 0x92, 0xcc, 0x40, 0x7e, 0xcf, 0x08, 0xe5, 0x08, 0x6d, 0x2f, 0xa5, 0xb9, 0xe8, 0xfa, 0x90, 0x18, 0x92, 0x01, 0x96, 0x96, 0xe8, 0xa5, 0xf1, 0x8b, 0xf3, 0x48, 0x60, - 0x98, 0x31, 0x2f, 0x40, 0x75, 0x17, 0xe6, 0x15, 0x0c, 0x2e, 0x97, 0x0d, 0x10, 0xbb, 0x68, 0xbc, 0xd6, 0x46, 0x85, 0xe2, 0x5b, 0x54, 0xf3, 0xb6, 0x30, 0xb6, 0xb7, 0xfb, 0xdc, 0xd0, 0xb3, 0x25, - 0x4f, 0x4c, 0x11, 0x6f, 0x7e, 0x7e, 0x05, 0xf4, 0xb1, 0x37, 0x1b, 0x7d, 0x22, 0x55, 0xfc, 0x8d, 0xe8, 0x0b, 0x16, 0xaf, 0x87, 0xb3, 0x2b, 0xa5, 0xdf, 0x81, 0x18, 0x12, 0x29, 0xdf, 0x55, 0x28, - 0x8c, 0x83, 0x8b, 0x64, 0x8f, 0x8d, 0xab, 0x5a, 0xbf, 0x98, 0x61, 0x6b, 0xea, 0xbb, 0x1d, 0xe2, 0xc3, 0x92, 0x88, 0x79, 0x24, 0x4f, 0x5a, 0xf2, 0x26, 0x1e, 0xcc, 0xb9, 0xeb, 0x2c, 0xd8, 0x58, - 0xdb, 0x0e, 0x2b, 0x0e, 0x40, 0xfa, 0x2e, 0x43, 0x7a, 0x02, 0x28, 0x2d, 0xb0, 0xf0, 0xb6, 0x0c, 0xe9, 0xaa, 0xa7, 0x24, 0xaa, 0x77, 0x4e, 0xda, 0xf4, 0xac, 0x5c, 0x6d, 0x9e, 0x5c, 0x31, 0xbf, - 0x54, 0xfd, 0xfa, 0xde, 0x9b, 0xe3, 0x2b, 0x8a, 0xd7, 0x36, 0xe5, 0x0f, 0x99, 0x0a, 0x7e, 0xaa, 0x14, 0xd6, 0x1b, 0xd1, 0xf7, 0x36, 0xe8, 0xfe, 0xe5, 0xba, 0x39, 0x36, 0x61, 0x6e, 0x92, 0xde, - 0x42, 0x90, 0xb2, 0xb3, 0xbf, 0xd8, 0xf3, 0x0d, 0x62, 0xb1, 0xf5, 0xbc, 0x8a, 0x8b, 0x4a, 0xcc, 0x73, 0xd4, 0x42, 0xca, 0x04, 0x08, 0x3c, 0xfa, 0x94, 0xad, 0x08, 0xa5, 0x38, 0xf4, 0x18, 0x08, - 0x72, 0x1b, 0x20, 0x76, 0x79, 0x36, 0x70, 0x21, 0x9d, 0x3c, 0xaf, 0xe7, 0x71, 0x7d, 0xae, 0xb4, 0x5a, 0xd4, 0x92, 0x1e, 0x0b, 0xa4, 0xc5, 0x80, 0x94, 0x07, 0x5a, 0x3e, 0xef, 0x1b, 0x8e, 0x7a, - 0xb2, 0x4e, 0xe4, 0xd5, 0xec, 0xac, 0xec, 0x21, 0x7e, 0xed, 0x1a, 0x06, 0x3d, 0x8e, 0xc7, 0xf7, 0xeb, 0xd9, 0x5b, 0x8d, 0xd8, 0xc7, 0x96, 0x0f, 0xfd, 0x44, 0x2e, 0xf2, 0x27, 0xc2, 0xd7, 0xf6, - 0x71, 0xef, 0x67, 0xb3, 0x1b, 0xc1, 0xdf, 0x01, 0x65, 0x6c, 0x64, 0x89, 0x00, 0xaa, 0x87, 0x3a, 0xc4, 0xe9, 0xc2, 0xeb, 0xa2, 0xb6, 0xc0, 0x34, 0xfb, 0x40, 0x90, 0xee, 0xc8, 0x6e, 0x06, 0xa6, - 0x43, 0x47, 0xd2, 0x90, 0x23, 0x53, 0xd5, 0x71, 0xc8, 0x64, 0x2f, 0x80, 0xe3, 0xd4, 0xa6, 0x45, 0x5f, 0x94, 0x1d, 0x96, 0x6e, 0x25, 0x7b, 0xf4, 0x77, 0xed, 0x22, 0x1d, 0x9c, 0xe3, 0x0a, 0x32, - 0xb0, 0x6d, 0xd5, 0xee, 0x8a, 0x9a, 0x3c, 0xeb, 0x05, 0x1e, 0x3c, 0xb7, 0xea, 0x7e, 0x8e, 0xd1, 0x7f, 0x8b, 0x38, 0xff, 0x5f, 0x1f, 0xb7, 0xfd, 0x7a, 0xd6, 0x14, 0xb3, 0xb2, 0x8a, 0xb3, 0xb8, - 0x89, 0xbb, 0x37, 0x8f, 0x14, 0xf2, 0xad, 0x2e, 0xe7, 0x73, 0xc1, 0xed, 0x77, 0x1e, 0xa9, 0x87, 0xcc, 0x29, 0xd2, 0x99, 0xf7, 0x5a, 0xfd, 0xfa, 0x75, 0x9c, 0x7e, 0xe6, 0x06, 0x45, 0xf6, 0x87, - 0x75, 0x86, 0x7e, 0xbb, 0xf1, 0x4a, 0xe4, 0xc1, 0x03, 0x2f, 0xc3, 0x51, 0xe5, 0x76, 0x3a, 0xab, 0xd3, 0xa2, 0x79, 0xf0, 0x48, 0x3d, 0x7b, 0x41, 0xc5, 0x76, 0xd2, 0x8f, 0xef, 0xfd, 0xee, 0xd9, - 0xc8, 0xfd, 0xd0, 0x7e, 0x01, 0x64, 0x36, 0xfa, 0x55, 0xf1, 0x9f, 0x7b, 0x71, 0x52, 0xdf, 0x7d, 0x1b, 0xf0, 0x0f, 0x1a, 0x75, 0x64, 0x57, 0x6f, 0x19, 0xeb, 0xb3, 0xf7, 0x2c, 0x9c, 0x3b, 0x83, - 0xf0, 0xf2, 0xec, 0x47, 0x40, 0x16, 0xfc, 0xa5, 0xa5, 0xed, 0xed, 0x76, 0xef, 0xdb, 0xa7, 0xca, 0x0f, 0xee, 0xff, 0xfb, 0x9b, 0x1b, 0x25, 0xaf, 0xcb, 0x0f, 0x47, 0x0c, 0x8c, 0x7c, 0x45, 0xf4, - 0x57, 0x67, 0xca, 0xed, 0x81, 0xbf, 0xed, 0xba, 0x8e, 0xc3, 0xfc, 0x5d, 0x82, 0x7d, 0x79, 0xd1, 0xed, 0x47, 0x7e, 0xf2, 0xb7, 0x34, 0xd7, 0xde, 0x61, 0x1f, 0xac, 0x85, 0xfd, 0xfa, 0x74, 0xdd, - 0xd8, 0x55, 0x73, 0xff, 0xf9, 0x36, 0x77, 0x8a, 0xcb, 0x0f, 0x56, 0x84, 0xfe, 0x59, 0x6a, 0xf8, 0xa7, 0x41, 0x79, 0xec, 0x00, 0x85, 0x9f, 0xcc, 0x0e, 0x7f, 0x23, 0x0e, 0xce, 0xde, 0x0f, 0xef, - 0x04, 0xff, 0xfc, 0xf5, 0x48, 0x2a, 0x9c, 0x3a, 0xd5, 0xbb, 0x70, 0xf5, 0xc5, 0x4a, 0xa2, 0x51, 0x3f, 0x42, 0xa4, 0x95, 0x6f, 0x06, 0x6f, 0xdc, 0xc3, 0x9a, 0x0e, 0x6a, 0xeb, 0x54, 0xd3, 0x05, - 0xc1, 0xc4, 0xcc, 0xcd, 0x86, 0x22, 0x7d, 0x94, 0x2c, 0x74, 0x06, 0xa3, 0xb9, 0xe0, 0xb4, 0x39, 0x87, 0x03, 0x60, 0x24, 0x8b, 0xc2, 0x2d, 0xfa, 0x01, 0xa1, 0x5d, 0xb1, 0x73, 0xf7, 0x71, 0x0b, - 0x9c, 0x56, 0x1d, 0x89, 0x50, 0x89, 0xa6, 0x19, 0x7f, 0x70, 0x81, 0x7e, 0xfb, 0xc4, 0x47, 0xf1, 0x86, 0x7f, 0x96, 0x10, 0x7f, 0xbd, 0xcd, 0xba, 0xa6, 0xb8, 0x0d, 0x68, 0x63, 0x87, 0x9f, 0xe6, - 0xec, 0xa7, 0xe7, 0xee, 0xc7, 0x05, 0xfe, 0x60, 0xce, 0x3f, 0x0c, 0x0b, 0xf2, 0x64, 0x48, 0xe0, 0xd7, 0x77, 0x80, 0xb3, 0x6f, 0x17, 0x66, 0x37, 0xd2, 0xd3, 0x06, 0x49, 0x28, 0x90, 0x91, 0x82, - 0x1c, 0x63, 0xd5, 0xad, 0xd3, 0x42, 0x00, 0xcc, 0x51, 0xcd, 0x4a, 0xcb, 0x50, 0x7c, 0x8a, 0x04, 0xce, 0xcc, 0x3e, 0x63, 0x75, 0xd1, 0xe2, 0x0e, 0xe1, 0x85, 0x76, 0x5b, 0x40, 0xe4, 0xaa, 0x23, - 0x62, 0x71, 0x02, 0x88, 0x36, 0xdb, 0x01, 0x08, 0x8f, 0x8e, 0xc5, 0x6b, 0xc6, 0xb2, 0x46, 0xb6, 0x94, 0xe9, 0x5d, 0x64, 0x47, 0x8e, 0xc8, 0x23, 0xd3, 0xc4, 0x19, 0x6d, 0x42, 0xcf, 0xfb, 0xa9, - 0x7f, 0xca, 0xe7, 0x47, 0x1b, 0x4e, 0xff, 0xdc, 0xac, 0xfc, 0x46, 0xfb, 0xb6, 0xd6, 0x7d, 0xbe, 0x72, 0xdd, 0x7a, 0x9a, 0x60, 0x64, 0x2a, 0x73, 0x39, 0x4d, 0x43, 0x6b, 0xdd, 0xd8, 0x7a, 0x41, - 0x67, 0xb1, 0xc9, 0xba, 0x9b, 0x79, 0xa4, 0xe9, 0xb6, 0x20, 0x25, 0xeb, 0x05, 0xba, 0x33, 0x6b, 0xd8, 0x88, 0x3d, 0x8e, 0x64, 0xfa, 0x98, 0x4f, 0xe0, 0x93, 0x79, 0x11, 0x7d, 0x45, 0x73, 0x9b, - 0x0d, 0xe3, 0x8f, 0x8c, 0x2c, 0xe0, 0x96, 0xa8, 0x0a, 0x50, 0x88, 0xac, 0xc2, 0x5d, 0x4e, 0x88, 0x3d, 0x8b, 0xad, 0x34, 0x2a, 0x56, 0xcb, 0x47, 0x15, 0xc1, 0x3e, 0x7d, 0xe4, 0x03, 0xfd, 0xe1, - 0x9b, 0x6c, 0xff, 0x29, 0x97, 0xa7, 0x78, 0xad, 0x6f, 0x6b, 0xcc, 0xa7, 0x19, 0xf1, 0x60, 0x74, 0x5c, 0xbb, 0x7c, 0x2b, 0x53, 0x7d, 0x13, 0x08, 0x7f, 0x2a, 0x11, 0xf3, 0x8c, 0x2a, 0xf2, 0xf3, - 0x05, 0xd7, 0x71, 0xfa, 0x79, 0x79, 0x4a, 0x49, 0x14, 0x78, 0xb6, 0x44, 0x04, 0xc6, 0x88, 0x97, 0xca, 0x59, 0x02, 0x91, 0x2a, 0x69, 0x87, 0xb1, 0x5f, 0x31, 0x43, 0xb4, 0xdd, 0x44, 0xcd, 0x04, - 0x8f, 0xf3, 0xad, 0x13, 0xc5, 0x83, 0x0f, 0x24, 0xff, 0x46, 0x88, 0x67, 0x6c, 0xa1, 0x5b, 0xff, 0x8b, 0xf7, 0x36, 0xbd, 0x37, 0x32, 0xbf, 0xf3, 0x1c, 0xa6, 0xc2, 0xb1, 0xaf, 0x06, 0x38, 0x02, - 0xc6, 0xa3, 0x6b, 0xf1, 0x24, 0x93, 0x6e, 0x06, 0x9c, 0x68, 0x57, 0x82, 0xc0, 0x6d, 0x34, 0x12, 0x33, 0xc7, 0x11, 0x59, 0x75, 0x48, 0x4a, 0x9c, 0x38, 0xdb, 0xec, 0xf8, 0x96, 0xbe, 0x00, 0xfd, - 0x96, 0xc5, 0x3d, 0x8b, 0xa9, 0x8c, 0x0d, 0xb5, 0x37, 0x97, 0xc7, 0xbd, 0x69, 0x20, 0x26, 0x13, 0x92, 0xd0, 0xc2, 0x3d, 0xe0, 0x26, 0x9e, 0x2f, 0x97, 0xd2, 0xea, 0x39, 0x9d, 0xf5, 0xbf, 0x1c, - 0xdb, 0xf1, 0x53, 0xd0, 0x2d, 0x3c, 0x7f, 0x16, 0x54, 0xaf, 0xf1, 0xa9, 0xe4, 0x8b, 0xcc, 0x81, 0xbf, 0xb0, 0xd5, 0x7f, 0xbd, 0x75, 0xe2, 0xbc, 0xfe, 0xa9, 0x6e, 0x6a, 0xd2, 0x8f, 0x52, 0xe5, - 0x6f, 0xc1, 0xfb, 0xc4, 0xdf, 0xf0, 0xf7, 0x84, 0xe9, 0xd7, 0x4c, 0xa3, 0x3b, 0xd9, 0x4a, 0x5f, 0xe3, 0x47, 0x6e, 0xe9, 0xc0, 0x5f, 0x96, 0xee, 0xaf, 0x85, 0x58, 0xbe, 0xbc, 0xf0, 0x93, 0xbb, - 0xe5, 0x4e, 0x11, 0xc6, 0x4f, 0x16, 0xdf, 0x8b, 0x0e, 0x84, 0xfe, 0xfd, 0xa5, 0x83, 0xef, 0x9d, 0x9e, 0x95, 0xdf, 0xd4, 0x8a, 0x3b, 0x3d, 0x2b, 0xbf, 0xed, 0x77, 0xfe, 0xb9, 0xbf, 0xc9, 0x97, - 0x07, 0xcb, 0xb7, 0x46, 0xc3, 0xe4, 0xf7, 0x5c, 0x2e, 0xbf, 0x3e, 0xb7, 0x7e, 0x35, 0xbc, 0x4e, 0xd8, 0x1f, 0x1d, 0x54, 0xbe, 0x7b, 0x4d, 0x3e, 0xdd, 0x0c, 0xe2, 0xd4, 0x9f, 0xf9, 0x79, 0x53, - 0x0d, 0x33, 0xd7, 0x76, 0x23, 0xff, 0x15, 0x7c, 0xe8, 0xbe, 0x0a, 0x3c, 0xb1, 0xef, 0xf1, 0xb7, 0x04, 0x9a, 0x9f, 0xad, 0x3c, 0x5f, 0x1e, 0xb0, 0xdf, 0x74, 0xd8, 0x5b, 0x6e, 0xcb, 0x67, 0x01, - 0xf4, 0xe6, 0xbc, 0xb9, 0x0d, 0x17, 0xf1, 0xe5, 0x5e, 0x56, 0x16, 0x55, 0x33, 0x0b, 0x2a, 0xbf, 0x7e, 0x50, 0x37, 0x33, 0xce, 0xda, 0x2a, 0x6b, 0xab, 0xc8, 0x7e, 0xb7, 0xa1, 0x7e, 0xca, 0xc0, - 0x2f, 0x5d, 0xab, 0xbe, 0xfc, 0x77, 0x52, 0xcf, 0x06, 0x3b, 0x7b, 0x4f, 0x3b, 0xf8, 0x86, 0xf3, 0xdd, 0xea, 0xfc, 0xb3, 0x3e, 0x6e, 0xa2, 0xa2, 0xbd, 0xd5, 0xee, 0x7f, 0xab, 0xd6, 0xff, 0x03, - 0x93, 0xd4, 0xef, 0xf2, 0xfb, 0x2c, 0xff, 0xbd, 0x4b, 0x34, 0xf2, 0x35, 0x4d, 0xef, 0x8e, 0xbb, 0xe6, 0xd3, 0xed, 0xdc, 0x6e, 0xda, 0xca, 0x4e, 0x67, 0x6e, 0x91, 0xbd, 0x00, 0x7e, 0x9f, 0x03, - 0x8a, 0xab, 0xad, 0x61, 0x37, 0xaf, 0xd9, 0x66, 0xd0, 0xdf, 0xf4, 0x8f, 0xb4, 0x97, 0xb0, 0x7a, 0xcb, 0x7b, 0xf9, 0xc1, 0x78, 0x5f, 0xfb, 0x54, 0x7f, 0x0f, 0x3c, 0xfa, 0xdc, 0xe5, 0xeb, 0x9b, - 0xe1, 0xf4, 0x82, 0x50, 0x39, 0xb3, 0xf3, 0x3a, 0x7e, 0xe7, 0x2a, 0xe8, 0xe7, 0xfd, 0x2b, 0xa6, 0x6e, 0x91, 0x7d, 0xec, 0xb5, 0xfe, 0x78, 0x49, 0xf3, 0xbe, 0xa0, 0x11, 0xdf, 0xbf, 0xbf, 0xf1, - 0x2f, 0xcd, 0xec, 0xe3, 0x3e, 0xf4, 0xf7, 0x37, 0xc5, 0xbf, 0xa3, 0xae, 0xd0, 0xbc, 0x70, 0xf9, 0x07, 0x7f, 0x23, 0x57, 0x9b, 0xe8, 0xf5, 0xa1, 0x29, 0x7a, 0xf5, 0x94, 0x92, 0x4b, 0xcf, 0x45, - 0x15, 0xfc, 0x4f, 0xc7, 0xb1, 0x47, 0x98, 0xfe, 0xdf, 0x51, 0x89, 0xe9, 0x01, 0x9a, 0x77, 0xe1, 0xb8, 0x3f, 0x1f, 0x1e, 0xe1, 0xf3, 0x33, 0x29, 0x6a, 0x2a, 0x3e, 0x77, 0xde, 0x03, 0xce, 0xee, - 0x5d, 0xbd, 0xe6, 0xc6, 0x4f, 0xe4, 0x47, 0x22, 0xd8, 0xb9, 0x80, 0x8a, 0xc5, 0x51, 0x7f, 0xde, 0x11, 0x12, 0x68, 0xaf, 0x3a, 0x24, 0x80, 0xc3, 0xad, 0x40, 0xa5, 0xb2, 0xd1, 0x1c, 0x14, 0xa1, - 0x38, 0xcf, 0xb1, 0x41, 0x24, 0x8a, 0x3d, 0x67, 0x18, 0x85, 0xdb, 0x66, 0x4c, 0x1d, 0xcc, 0xcf, 0xc9, 0xe9, 0x98, 0x9f, 0x63, 0x73, 0x1b, 0x65, 0xdb, 0x7e, 0x0f, 0x66, 0xbc, 0xb0, 0x29, 0x49, - 0xc3, 0x8f, 0xd2, 0x06, 0x3d, 0xa7, 0x44, 0xca, 0xc7, 0xff, 0x1d, 0xcb, 0xe1, 0xba, 0xac, 0xba, 0x45, 0x1e, 0xc4, 0xe1, 0xac, 0xac, 0xfc, 0xa6, 0x89, 0x1f, 0x3a, 0x6e, 0xa9, 0xa7, 0x22, 0xf4, - 0xef, 0xbf, 0xe2, 0x43, 0x97, 0xfb, 0x76, 0x63, 0x46, 0x4d, 0x8b, 0xd5, 0x67, 0x43, 0xab, 0xdd, 0xe8, 0x7b, 0x5f, 0x1c, 0xbb, 0x74, 0x03, 0x1a, 0x7a, 0x72, 0x01, 0x4d, 0x87, 0xa4, 0x48, 0x43, - 0x41, 0x08, 0x55, 0x47, 0xc3, 0x65, 0xc2, 0xa0, 0x71, 0xbc, 0xe8, 0xbc, 0xba, 0x04, 0x11, 0x67, 0x1b, 0x18, 0xab, 0x83, 0x6e, 0xec, 0xc8, 0x26, 0xb9, 0x34, 0xc9, 0x1e, 0xf2, 0x01, 0x61, 0x87, - 0x41, 0xb4, 0xbb, 0x4b, 0x77, 0x9d, 0x74, 0x52, 0xd2, 0x62, 0xa4, 0xe6, 0x34, 0xec, 0xff, 0x93, 0xad, 0x82, 0xbb, 0x40, 0xde, 0xd2, 0x26, 0x1b, 0xbf, 0xba, 0x7d, 0xcf, 0xf0, 0x70, 0x8b, 0xf3, - 0x99, 0x08, 0xd1, 0x07, 0xef, 0xf8, 0x80, 0xf2, 0xfb, 0x9d, 0x6b, 0x5a, 0xf8, 0x04, 0x2c, 0x57, 0xb5, 0xae, 0x35, 0xcb, 0xcb, 0x02, 0x8e, 0x2a, 0x81, 0x48, 0xb7, 0x87, 0x78, 0x9f, 0xc2, 0x07, - 0x67, 0x69, 0xc7, 0x3b, 0x08, 0xf6, 0x35, 0xe2, 0x34, 0x0e, 0xbd, 0x67, 0xc2, 0x3a, 0x30, 0x6e, 0x5c, 0x68, 0xbb, 0x03, 0xf2, 0x9e, 0xcf, 0xf5, 0x78, 0x4f, 0xeb, 0x2b, 0x6a, 0x65, 0xcb, 0x9a, - 0x1e, 0x69, 0xbe, 0xb2, 0xde, 0xa4, 0x73, 0xfe, 0xb0, 0x72, 0x8e, 0x2b, 0x89, 0x15, 0x30, 0x73, 0xed, 0xb0, 0xcf, 0x45, 0x5e, 0xbc, 0x76, 0x69, 0x7f, 0x37, 0x22, 0x5e, 0xd7, 0xcb, 0x2f, 0xae, - 0xb9, 0x6f, 0x8d, 0x22, 0x6e, 0xd9, 0x87, 0x5f, 0x96, 0xd4, 0xcf, 0x4a, 0xf0, 0x7d, 0x45, 0xb2, 0x6a, 0x53, 0x7f, 0xe6, 0x15, 0xee, 0x87, 0x9f, 0x0b, 0xff, 0xaa, 0x6c, 0x84, 0x5f, 0x3c, 0x88, - 0x3f, 0x14, 0xa0, 0x32, 0x6d, 0xab, 0xfb, 0x77, 0x5e, 0xed, 0xad, 0x3e, 0xf6, 0x9a, 0xe8, 0xfd, 0xd7, 0x7d, 0x7d, 0xe2, 0x2d, 0xb3, 0x3d, 0x1a, 0x4a, 0xbf, 0x4a, 0xe3, 0xfc, 0xf4, 0x59, 0xa5, - 0xf8, 0xd3, 0x3c, 0x2d, 0xd3, 0x36, 0x8c, 0xf3, 0xdf, 0xe6, 0x29, 0xfa, 0x54, 0xd5, 0xd5, 0xfb, 0xaf, 0xf8, 0x60, 0xae, 0x6f, 0x37, 0x66, 0xe8, 0xb4, 0x8a, 0xac, 0x3a, 0x27, 0x12, 0xd5, 0x5a, - 0x23, 0x56, 0xd2, 0x3e, 0x70, 0xe5, 0x02, 0xc7, 0xf0, 0x24, 0xb6, 0xe5, 0x9e, 0x25, 0x21, 0xb8, 0x65, 0x56, 0x0d, 0x02, 0x7a, 0x2a, 0x79, 0xc8, 0x17, 0x4a, 0xb1, 0x9c, 0x1b, 0x29, 0x0c, 0xf2, - 0xdb, 0xb3, 0xc7, 0x48, 0x6c, 0xd6, 0xeb, 0xf6, 0xf9, 0xac, 0x60, 0xb8, 0x7d, 0x2c, 0xab, 0x5a, 0x5b, 0x8e, 0x7b, 0x1b, 0xa5, 0x37, 0x2b, 0x78, 0x37, 0xb4, 0x2a, 0x7b, 0xb9, 0xfc, 0x93, 0x79, - 0xfa, 0x69, 0xcc, 0xde, 0x7e, 0x7a, 0x7a, 0xf5, 0xff, 0xce, 0x22, 0x3f, 0x2d, 0xfd, 0xea, 0xc3, 0x45, 0xfc, 0x67, 0xec, 0x3f, 0x73, 0xcc, 0x83, 0x7d, 0x84, 0xbf, 0x11, 0xf4, 0x19, 0xeb, 0xfd, - 0x2b, 0xf9, 0x0f, 0xc4, 0xdf, 0x2f, 0xcd, 0x5e, 0x69, 0xff, 0x8e, 0x36, 0xa0, 0x29, 0xc0, 0x05, 0x5b, 0x7b, 0x5a, 0xce, 0x15, 0x0b, 0xfe, 0x78, 0x74, 0xd0, 0x80, 0xeb, 0x82, 0xa5, 0xdc, 0xe7, - 0x83, 0x64, 0x90, 0x5e, 0x2b, 0x50, 0xc1, 0xf1, 0xa0, 0xed, 0x38, 0x38, 0xf6, 0x6d, 0x36, 0x63, 0xa9, 0x22, 0x4b, 0xc8, 0x65, 0x0f, 0x96, 0x5b, 0x96, 0x6d, 0xb1, 0x76, 0x85, 0xb4, 0xeb, 0xf9, - 0x5c, 0xa7, 0x98, 0x1d, 0x67, 0x2b, 0xeb, 0xf1, 0xd0, 0x1e, 0x73, 0xad, 0x16, 0xb0, 0x49, 0x7b, 0x7e, 0x5f, 0x6d, 0xbc, 0x7b, 0x00, 0xe1, 0x4f, 0x05, 0x4b, 0x7e, 0x26, 0xfc, 0x01, 0xcd, 0xad, - 0x43, 0x37, 0x3e, 0x2d, 0x60, 0x12, 0x91, 0x2e, 0xbd, 0xb3, 0x00, 0x23, 0x0b, 0x12, 0x4b, 0xbf, 0x34, 0x25, 0xc8, 0x95, 0x9c, 0x02, 0x58, 0x48, 0xc4, 0xb1, 0x10, 0xc9, 0xa5, 0x2d, 0xa4, 0x4a, - 0x14, 0x5e, 0xc0, 0x68, 0x65, 0xa5, 0x84, 0x61, 0x43, 0xce, 0x02, 0xc3, 0x55, 0x45, 0x96, 0xfb, 0x68, 0xb3, 0x1a, 0xa8, 0x54, 0xe1, 0x9c, 0x76, 0x1e, 0xdb, 0xde, 0x7e, 0x33, 0x67, 0x73, 0x01, - 0x99, 0x2f, 0xcc, 0x73, 0x1b, 0x37, 0xb8, 0xf3, 0x1c, 0x0b, 0xfa, 0x75, 0xe5, 0xbb, 0xed, 0x5b, 0x0a, 0xf6, 0xd7, 0x4e, 0x19, 0xd7, 0xdb, 0x5f, 0x52, 0xb4, 0xff, 0xb4, 0x3b, 0xf8, 0xd5, 0x62, - 0xbe, 0xbf, 0xcf, 0xfa, 0xdf, 0x58, 0x64, 0xae, 0x84, 0x3f, 0xf0, 0xbe, 0x9e, 0x4e, 0x2d, 0xd1, 0xde, 0xd3, 0x98, 0xa7, 0x98, 0x85, 0xdd, 0x0e, 0x5d, 0xca, 0xb9, 0x18, 0x7a, 0xcc, 0x97, 0x2c, - 0x95, 0xea, 0xa8, 0xd5, 0x90, 0x30, 0xda, 0x49, 0xf3, 0x28, 0x6c, 0x30, 0xfe, 0xd0, 0x47, 0x47, 0x66, 0x87, 0x1c, 0x4f, 0x6c, 0x97, 0x7b, 0xc1, 0x65, 0x01, 0x31, 0xe1, 0xea, 0x2c, 0xca, 0xb2, - 0x5d, 0x27, 0xbb, 0xd5, 0x6e, 0x4c, 0xe8, 0xf5, 0x39, 0xec, 0x4f, 0xbd, 0x33, 0x37, 0x39, 0x08, 0x34, 0x50, 0xeb, 0x39, 0xaf, 0xcb, 0x23, 0xb7, 0x01, 0xfc, 0xa5, 0x92, 0xc8, 0x27, 0xba, 0x8f, - 0x4c, 0x9b, 0xfb, 0x84, 0x1e, 0xbb, 0xa9, 0xd1, 0x27, 0xbd, 0xd4, 0x77, 0xde, 0xf3, 0x31, 0x0a, 0x5f, 0x5a, 0xda, 0xfe, 0xcc, 0x69, 0xfc, 0xeb, 0xd1, 0x80, 0x10, 0x6b, 0x12, 0x91, 0x28, 0x5d, - 0xb2, 0x31, 0x02, 0xe9, 0x6d, 0x50, 0x5c, 0xc8, 0x5c, 0x03, 0xee, 0xd6, 0xe8, 0x4a, 0x27, 0xa0, 0x3d, 0x57, 0xce, 0x51, 0xe5, 0x38, 0x87, 0x85, 0xc4, 0x85, 0xd9, 0xe3, 0xb1, 0x0c, 0x36, 0xc8, - 0x9c, 0x56, 0x71, 0x80, 0xd1, 0xc9, 0x24, 0xf2, 0xa1, 0x05, 0xb1, 0x54, 0xf9, 0xb3, 0xb1, 0x8d, 0xb0, 0x75, 0xdb, 0x02, 0x92, 0x49, 0x5e, 0x72, 0x80, 0xf0, 0xe2, 0x52, 0xff, 0x83, 0x11, 0xf4, - 0x7e, 0xf5, 0x8f, 0x4a, 0xe7, 0x84, 0xe6, 0xc0, 0xff, 0x2d, 0x16, 0x9e, 0x80, 0xe1, 0x44, 0x86, 0x86, 0xaa, 0x7d, 0xa6, 0xb2, 0xe3, 0x31, 0xe4, 0xc6, 0x55, 0xcd, 0x11, 0xd9, 0xd2, 0x5b, 0x87, - 0x7e, 0x37, 0x86, 0xfe, 0xb8, 0xc2, 0x51, 0x6c, 0xee, 0x57, 0xf8, 0x06, 0xec, 0x86, 0xed, 0x11, 0x3a, 0x09, 0xa3, 0x06, 0x26, 0x31, 0x8b, 0xa1, 0x89, 0x1a, 0x79, 0xb4, 0xa9, 0xa7, 0xdb, 0xa5, - 0xb9, 0x51, 0x06, 0x64, 0x2c, 0x2b, 0x29, 0x2b, 0x34, 0xea, 0x6c, 0xd7, 0xf3, 0x65, 0x63, 0x02, 0x8a, 0x2d, 0x4e, 0x49, 0x86, 0x7b, 0x77, 0x66, 0xdd, 0xf7, 0xa5, 0x3e, 0x53, 0xd1, 0xea, 0x46, - 0xf2, 0x8a, 0xc7, 0xcb, 0xc1, 0x8c, 0x9c, 0x56, 0xcb, 0xaa, 0x43, 0xd7, 0x73, 0x69, 0xce, 0x13, 0x58, 0x9b, 0x9d, 0x16, 0x65, 0x76, 0x5a, 0x2c, 0xcf, 0xa3, 0x21, 0xd6, 0xb2, 0x06, 0x35, 0x12, - 0x6c, 0x55, 0x40, 0xeb, 0x9f, 0x37, 0x56, 0x50, 0x1a, 0xb0, 0xec, 0x50, 0x3e, 0x30, 0xe7, 0xc3, 0xdd, 0xc1, 0x06, 0xe4, 0xcb, 0xbc, 0x58, 0x0a, 0x68, 0x93, 0x47, 0x71, 0xb6, 0x15, 0x57, 0x36, - 0x9b, 0x61, 0x19, 0xd8, 0xd9, 0x6a, 0xb9, 0x06, 0x4f, 0x95, 0x3a, 0x22, 0xcf, 0xcd, 0xe9, 0xb7, 0xae, 0xaa, 0x2f, 0xaa, 0xe1, 0x37, 0x0f, 0xce, 0xe7, 0x86, 0xa3, 0x77, 0x6a, 0x39, 0x3d, 0x96, - 0x06, 0xe8, 0xff, 0x48, 0x83, 0xff, 0xf7, 0xa4, 0x41, 0x59, 0xc5, 0x99, 0xfd, 0xd0, 0x52, 0x7a, 0x26, 0x16, 0xf2, 0x95, 0xe6, 0x2b, 0x97, 0xc7, 0x99, 0x7d, 0x0d, 0x09, 0x9d, 0xc0, 0xe6, 0xfe, - 0xb2, 0x5d, 0x2c, 0x7a, 0x52, 0x2f, 0x3d, 0x1b, 0x08, 0xb1, 0x12, 0x50, 0x84, 0x2e, 0x3f, 0x40, 0xea, 0xa0, 0x1d, 0xc1, 0xbd, 0xe1, 0xaf, 0x59, 0x6e, 0x0b, 0x86, 0xf3, 0x66, 0xcb, 0xa8, 0x32, - 0xe4, 0x6e, 0x5a, 0x0d, 0x11, 0x5c, 0x5e, 0xcc, 0xb5, 0x5d, 0x17, 0x25, 0x06, 0x61, 0x2f, 0xfd, 0x73, 0x35, 0x67, 0xc1, 0xda, 0x91, 0x8a, 0x12, 0x12, 0xeb, 0x31, 0x83, 0x92, 0xda, 0x3e, 0xe8, - 0x13, 0xf5, 0xa7, 0x37, 0xd7, 0xf4, 0x7d, 0xdd, 0xf2, 0x39, 0x8d, 0xfe, 0x4a, 0xf3, 0x8a, 0xc2, 0xf5, 0x68, 0x06, 0x4f, 0xd3, 0xd9, 0xdd, 0x39, 0x17, 0xd7, 0xe5, 0xa1, 0xc1, 0x3b, 0x41, 0x68, - 0xfa, 0xad, 0x89, 0x98, 0x15, 0xa3, 0x60, 0xb1, 0xb3, 0x38, 0x31, 0x1b, 0x4a, 0x75, 0x04, 0xdc, 0x5c, 0xb2, 0xb9, 0xc5, 0xba, 0x34, 0xb4, 0x2d, 0xd2, 0xae, 0x0b, 0x4e, 0x27, 0xc5, 0x5d, 0x57, - 0x05, 0x68, 0x5b, 0x31, 0xa3, 0xe8, 0xa9, 0x82, 0x9e, 0xc3, 0xca, 0xdc, 0x13, 0x1c, 0xd1, 0x51, 0x4b, 0x17, 0x5f, 0xe2, 0x73, 0xa5, 0x76, 0xe9, 0x67, 0x15, 0xa6, 0x2f, 0x1a, 0x11, 0xfe, 0xcf, - 0xd7, 0xed, 0x09, 0x75, 0x66, 0xf0, 0xbf, 0x9f, 0xdd, 0x54, 0xfe, 0x20, 0x7f, 0x45, 0xf9, 0xbd, 0xa6, 0x0c, 0xfe, 0x23, 0x1d, 0xef, 0xaf, 0x47, 0x60, 0xb3, 0x17, 0x47, 0x5a, 0x2e, 0xa5, 0x0c, - 0x52, 0x07, 0xd5, 0xec, 0x74, 0x4f, 0x28, 0x57, 0x7d, 0x47, 0xaf, 0x0e, 0xa3, 0xbf, 0xa5, 0x8f, 0xf3, 0xd4, 0x91, 0x2f, 0x7d, 0xc1, 0x68, 0xed, 0xc2, 0x93, 0x79, 0xd2, 0xe2, 0x89, 0x5e, 0xd8, - 0x00, 0x82, 0x82, 0x6b, 0x54, 0x54, 0xec, 0xb6, 0xc0, 0x28, 0x74, 0x99, 0x38, 0x8e, 0x35, 0x7f, 0x8e, 0xc2, 0x01, 0x5a, 0x56, 0x0a, 0x7e, 0x84, 0x51, 0x3b, 0x88, 0xff, 0x3b, 0xd3, 0xf1, 0x43, - 0x43, 0xbd, 0x3f, 0x21, 0x9f, 0x73, 0x02, 0xbd, 0x52, 0xbd, 0xc2, 0xf4, 0x7a, 0x3c, 0xb5, 0xb3, 0x9b, 0x98, 0x05, 0xe2, 0x06, 0x75, 0x88, 0x25, 0xa0, 0x1e, 0xbb, 0x1d, 0x25, 0xc1, 0x5d, 0x85, - 0x6a, 0x67, 0xf8, 0xb4, 0x01, 0x8b, 0xf9, 0x22, 0xcc, 0x11, 0xc9, 0x3c, 0xf2, 0xcd, 0x79, 0x47, 0x81, 0x1b, 0xb4, 0x14, 0xed, 0x52, 0x67, 0xb0, 0x25, 0xe5, 0x2e, 0x0c, 0xbb, 0x58, 0xa0, 0x7b, - 0x1d, 0x45, 0xd0, 0x39, 0x87, 0x1d, 0x87, 0x52, 0x05, 0x83, 0x20, 0x2e, 0x84, 0xec, 0xd4, 0xc4, 0x04, 0xa8, 0xd9, 0xcf, 0xad, 0x3d, 0x3f, 0xd8, 0x11, 0xf9, 0x1f, 0x76, 0xfc, 0x7f, 0x98, 0x1d, - 0xef, 0x00, 0xf6, 0x6f, 0xf0, 0xe3, 0x7d, 0xa0, 0x26, 0x72, 0x24, 0x4a, 0xe7, 0xb9, 0x18, 0x04, 0x87, 0x91, 0xba, 0x48, 0x30, 0xab, 0x83, 0x88, 0x4b, 0xd2, 0x39, 0x9d, 0xb3, 0xb4, 0xc0, 0x8d, - 0x05, 0x94, 0xc7, 0xa6, 0x7e, 0xbe, 0x10, 0x97, 0xe1, 0xac, 0xe7, 0x43, 0xc1, 0xe4, 0xca, 0x30, 0x1c, 0x4a, 0x59, 0xf3, 0x2c, 0xde, 0x8f, 0xe7, 0x6e, 0x44, 0xb1, 0x6c, 0x8b, 0xc3, 0x78, 0x83, - 0xf5, 0x25, 0x6d, 0x65, 0xa1, 0x11, 0x18, 0x51, 0x4e, 0xf3, 0x6c, 0x39, 0x4d, 0x21, 0xfc, 0xb3, 0xc5, 0xf7, 0x4c, 0xfa, 0xff, 0x2b, 0xcd, 0x2b, 0x10, 0x6f, 0x76, 0xde, 0xa4, 0xb4, 0xff, 0x93, - 0x51, 0xbb, 0xe7, 0xe3, 0x09, 0x93, 0xe7, 0x25, 0x41, 0xed, 0x2d, 0xc8, 0x3b, 0x85, 0xbc, 0x68, 0xc4, 0x04, 0x48, 0xc5, 0x09, 0x0a, 0x41, 0x22, 0x7b, 0xd0, 0xd6, 0x67, 0x14, 0xd9, 0x81, 0x9e, - 0xe9, 0x1f, 0xb4, 0x7d, 0x2f, 0x62, 0xf0, 0x61, 0xd0, 0x2e, 0x76, 0x2a, 0xc1, 0xbe, 0x9a, 0x31, 0xb8, 0x45, 0xeb, 0x3a, 0xb8, 0x39, 0xd2, 0x1c, 0xb9, 0x38, 0xec, 0x33, 0x83, 0xde, 0x33, 0xe6, - 0x85, 0x98, 0x52, 0x1f, 0xe4, 0x5a, 0x60, 0x6f, 0xd6, 0xd8, 0xd5, 0x35, 0x5a, 0x30, 0x8a, 0x1f, 0x65, 0x2b, 0x3d, 0xd7, 0x99, 0xf3, 0x07, 0xf5, 0x17, 0x64, 0xbe, 0x5f, 0x9b, 0xda, 0xa7, 0x33, - 0x06, 0x91, 0xa3, 0x93, 0xef, 0x47, 0xb0, 0xbd, 0xa8, 0x73, 0x9d, 0x00, 0x24, 0xcf, 0x58, 0x87, 0xe2, 0x81, 0xd3, 0xb6, 0x18, 0x42, 0x02, 0xdb, 0xb3, 0xe9, 0x9c, 0x94, 0x91, 0x43, 0x11, 0x98, - 0x6b, 0xe7, 0xca, 0x5a, 0x3f, 0xcb, 0xed, 0x5a, 0x5c, 0x31, 0xd0, 0x6a, 0x8b, 0x00, 0x07, 0xe4, 0xd2, 0x98, 0x82, 0x27, 0xca, 0x99, 0x85, 0x79, 0x2a, 0x11, 0xf0, 0x97, 0xda, 0xc3, 0xf6, 0xc7, - 0x0d, 0x70, 0xf8, 0xd1, 0x7b, 0xe7, 0x8f, 0x75, 0x0d, 0xd1, 0xe7, 0x66, 0xc8, 0x5b, 0x49, 0xc3, 0xd7, 0x6a, 0x86, 0xe8, 0xb4, 0x99, 0x91, 0x29, 0x3d, 0x80, 0x04, 0x27, 0xc5, 0x61, 0x36, 0xa3, - 0x42, 0x1a, 0xd0, 0xd6, 0x84, 0x56, 0x67, 0x2f, 0x3f, 0x4a, 0xb2, 0xaf, 0x35, 0x3b, 0xac, 0x82, 0x52, 0x89, 0x1e, 0x49, 0x86, 0xb1, 0xfb, 0xf9, 0x31, 0x3c, 0xfb, 0x36, 0xe9, 0x70, 0x71, 0x8c, - 0x40, 0x8c, 0x59, 0xad, 0xd8, 0x6a, 0xe1, 0x81, 0xc2, 0x05, 0xda, 0x22, 0xb2, 0x3b, 0x12, 0x7b, 0x18, 0x86, 0xe7, 0xf6, 0xe2, 0xa4, 0xbb, 0x0e, 0xf4, 0xe3, 0x7b, 0x03, 0xdb, 0xae, 0x67, 0x49, - 0x3d, 0xab, 0xda, 0xbc, 0x89, 0xff, 0x58, 0xc0, 0xeb, 0x9f, 0x7f, 0xf8, 0x37, 0xda, 0xe0, 0xec, 0xfb, 0x95, 0xa9, 0xb5, 0x19, 0xf8, 0xb0, 0x36, 0xf9, 0xfd, 0x82, 0x11, 0x04, 0x31, 0x32, 0xd2, - 0xfc, 0xb0, 0x10, 0xe0, 0xc2, 0xe9, 0xb0, 0xb3, 0x6c, 0x1f, 0xb1, 0xed, 0x22, 0xe6, 0x0d, 0x75, 0x95, 0x38, 0x7b, 0x33, 0xc3, 0x6b, 0xb6, 0x06, 0xd4, 0xc8, 0xb1, 0xc6, 0x4c, 0xeb, 0xb5, 0x1e, - 0x2f, 0xb7, 0x95, 0x74, 0xae, 0xc2, 0x26, 0xcf, 0x45, 0x18, 0xdf, 0x91, 0x54, 0x47, 0xa9, 0x84, 0xbe, 0x1e, 0xb5, 0x8c, 0x0d, 0xc4, 0xfd, 0x84, 0x4e, 0x3b, 0x5f, 0x2b, 0x5d, 0xde, 0xd9, 0x0c, - 0xfe, 0x5c, 0x8c, 0xea, 0x3f, 0xff, 0xe7, 0x5b, 0xe9, 0xa9, 0xeb, 0xac, 0x7b, 0xeb, 0xb6, 0xf9, 0x23, 0xed, 0x3c, 0xb0, 0xeb, 0xe6, 0x6d, 0xef, 0x1e, 0xfb, 0x1b, 0xc6, 0x1f, 0x47, 0x05, 0xfc, - 0x70, 0xbc, 0xe7, 0x85, 0xe7, 0xcf, 0x8a, 0xfa, 0x53, 0x90, 0xc7, 0x8b, 0xcd, 0xf2, 0x25, 0x86, 0xb5, 0xe8, 0xfc, 0x2a, 0x2d, 0x6c, 0x6f, 0x56, 0x56, 0x45, 0xe3, 0xbb, 0x9f, 0x22, 0x7f, 0x91, - 0xaf, 0xc1, 0xb9, 0x65, 0x55, 0x64, 0x33, 0x37, 0x8d, 0xdf, 0x22, 0x27, 0x60, 0xec, 0x7b, 0x44, 0xc9, 0xf9, 0xed, 0xdb, 0x61, 0xf8, 0x9f, 0xc5, 0x86, 0xde, 0xe9, 0x1f, 0xf9, 0xd7, 0x1d, 0x31, - 0xfb, 0xdc, 0x96, 0xe2, 0xbd, 0x36, 0x92, 0x3f, 0x6b, 0xec, 0xfd, 0xf5, 0x88, 0xa3, 0x28, 0x80, 0x3e, 0x9c, 0x7d, 0xc7, 0x59, 0x8c, 0xe5, 0x91, 0x96, 0x55, 0xe0, 0x60, 0x13, 0x32, 0x42, 0xdb, - 0xf5, 0xaa, 0x08, 0x7d, 0x75, 0x3b, 0xba, 0xcb, 0x86, 0x59, 0x49, 0x5e, 0xb9, 0x15, 0x84, 0x81, 0x09, 0x61, 0x28, 0x80, 0x70, 0x7b, 0xbf, 0x30, 0x58, 0xc7, 0xe5, 0xcf, 0xcb, 0x00, 0xdc, 0x1d, - 0x7b, 0x98, 0x4f, 0x18, 0x0b, 0x38, 0x23, 0xa0, 0xc3, 0xb3, 0x21, 0xca, 0x75, 0x6d, 0x25, 0xa2, 0xca, 0x97, 0xf2, 0x83, 0x77, 0x47, 0xf3, 0x11, 0x10, 0xdf, 0xc7, 0x78, 0x3a, 0x10, 0xaf, 0xb4, - 0xaf, 0x25, 0x19, 0xaf, 0x47, 0x77, 0xb6, 0xaa, 0x1e, 0xc2, 0xd0, 0x97, 0x17, 0xab, 0xa6, 0xa5, 0xe2, 0x62, 0xd9, 0x6b, 0x7e, 0xbf, 0x5e, 0xae, 0x2c, 0x6d, 0xe0, 0x78, 0xdb, 0x2c, 0x53, 0x68, - 0x21, 0xee, 0x19, 0x60, 0xc1, 0xd2, 0xf6, 0x3a, 0x1e, 0xfc, 0x4c, 0x8c, 0xb6, 0xfd, 0xe9, 0xa2, 0x84, 0x04, 0x1a, 0x61, 0x1a, 0x2c, 0xae, 0x43, 0x7d, 0x29, 0x94, 0xda, 0x79, 0xc7, 0x49, 0xaa, - 0x9b, 0x65, 0xe6, 0xa6, 0x0d, 0x2b, 0x35, 0x59, 0xa7, 0x6c, 0x73, 0xe8, 0xbe, 0xb4, 0x00, 0xfc, 0xeb, 0xe1, 0xe4, 0xfa, 0xeb, 0x1b, 0x8b, 0x7c, 0xab, 0x11, 0xf3, 0xd7, 0x5f, 0x5f, 0xf6, 0xf0, - 0xff, 0x3f, 0x9f, 0xff, 0x7e, 0xc8, 0xae, 0xfa, 0xba, 0xe9, 0xd9, 0x5c, 0x57, 0x94, 0xa1, 0xf4, 0x67, 0xbf, 0xf5, 0x2b, 0x7d, 0x46, 0x86, 0xdd, 0x7d, 0xc7, 0x55, 0x96, 0xdd, 0xbd, 0x33, 0x35, - 0x05, 0xf7, 0xe8, 0xb8, 0xd8, 0xd1, 0x1d, 0x6a, 0xfd, 0xe8, 0xd6, 0x3b, 0xdc, 0x16, 0x74, 0x9d, 0x94, 0xce, 0xa8, 0xdc, 0x77, 0xc2, 0x99, 0x26, 0xe7, 0xc0, 0x21, 0x77, 0x4e, 0xfe, 0xca, 0x0f, - 0x4a, 0xdf, 0xdc, 0x1c, 0x81, 0x6a, 0x18, 0x17, 0xeb, 0x54, 0x27, 0xe4, 0x7d, 0xb3, 0x58, 0x47, 0x35, 0x21, 0xa7, 0xd0, 0xe6, 0xa4, 0x2f, 0x4b, 0x57, 0x04, 0xfa, 0x0d, 0xb4, 0xee, 0x83, 0x2d, - 0xb0, 0x98, 0xeb, 0xf8, 0xea, 0x47, 0xc9, 0xb8, 0xd7, 0xe2, 0xa6, 0xd7, 0x58, 0xb9, 0xb6, 0x8a, 0x67, 0xef, 0x05, 0xdd, 0xfe, 0x00, 0xd2, 0x3f, 0x5f, 0xe7, 0x1f, 0xbe, 0xe5, 0x0d, 0xa6, 0x7b, - 0xf7, 0xa6, 0xf6, 0xe8, 0x3c, 0x88, 0xa1, 0x78, 0x08, 0x71, 0x5f, 0xbf, 0x74, 0xaa, 0xb5, 0xec, 0x0f, 0xd4, 0xa2, 0x0b, 0x1c, 0x5b, 0x20, 0x99, 0xe3, 0x3e, 0x42, 0xdc, 0x0d, 0x80, 0x26, 0x78, - 0xb0, 0x5d, 0x8e, 0xfa, 0x76, 0x7e, 0x39, 0xb0, 0x6b, 0xd4, 0x33, 0x50, 0x9b, 0x3c, 0x8c, 0xd4, 0x80, 0x04, 0x60, 0xab, 0x40, 0x3e, 0xca, 0x12, 0x87, 0xac, 0xf0, 0x38, 0xb4, 0xd8, 0xe3, 0x58, - 0xa2, 0x29, 0xb4, 0x60, 0x68, 0xab, 0x55, 0xf8, 0x00, 0xa8, 0x5f, 0xaa, 0x54, 0xa0, 0x4f, 0xe5, 0xf6, 0x7f, 0xa3, 0xfd, 0x01, 0xca, 0x7b, 0xbd, 0x0a, 0x74, 0x5a, 0x5e, 0x7f, 0x80, 0x9e, 0x15, - 0xba, 0x50, 0x06, 0x3a, 0x41, 0x98, 0x88, 0xf5, 0x41, 0x81, 0x36, 0xe6, 0x34, 0xdc, 0x6f, 0x32, 0x91, 0x9d, 0xcf, 0x75, 0x30, 0xe4, 0xe4, 0x5c, 0x94, 0x18, 0x73, 0x89, 0x47, 0x75, 0x2f, 0x93, - 0xec, 0x46, 0x4c, 0x20, 0x5a, 0x70, 0x71, 0xc1, 0x94, 0x46, 0xda, 0x5d, 0xae, 0x00, 0xe0, 0x92, 0x96, 0xdc, 0x7c, 0x15, 0x72, 0x76, 0xdc, 0x18, 0x35, 0x84, 0x32, 0x9a, 0x4a, 0x61, 0x77, 0x54, - 0x82, 0x97, 0x1f, 0xf7, 0x38, 0xab, 0xf8, 0xb9, 0x72, 0x3b, 0xef, 0x54, 0xdf, 0x3f, 0x3f, 0x0e, 0x82, 0xa9, 0xc5, 0x76, 0x2e, 0xeb, 0xb6, 0xd0, 0x70, 0x60, 0x43, 0xd3, 0xc7, 0xd4, 0xa2, 0x9a, - 0xde, 0xf7, 0x6c, 0x35, 0x20, 0x98, 0x0b, 0xa2, 0x85, 0x8a, 0x71, 0xe9, 0x42, 0x4b, 0x36, 0x8b, 0x9d, 0x78, 0xb6, 0xda, 0x20, 0x5b, 0xc7, 0x0e, 0xd4, 0x6c, 0x90, 0xc6, 0x0f, 0x77, 0xac, 0x6c, - 0x39, 0x70, 0x69, 0x48, 0xe1, 0x2a, 0x4a, 0xcf, 0x5c, 0xca, 0x40, 0xbe, 0x0c, 0xb9, 0x68, 0xcf, 0x76, 0x8a, 0x9b, 0x8d, 0x17, 0x6c, 0x8a, 0x95, 0x70, 0xfd, 0xa5, 0x7f, 0x4c, 0x30, 0x46, 0x9e, - 0x08, 0x33, 0x7e, 0xa7, 0xfa, 0x86, 0xc5, 0x6b, 0x8a, 0x31, 0xf2, 0x5b, 0x40, 0xf1, 0x75, 0x0f, 0x8e, 0x6b, 0x16, 0x6e, 0xa8, 0x11, 0x54, 0x1f, 0x6b, 0x5a, 0xdc, 0x5b, 0x48, 0x24, 0x79, 0xeb, - 0xc0, 0x15, 0xa4, 0x93, 0x4f, 0x1f, 0xe5, 0x20, 0xef, 0x33, 0x56, 0x3d, 0x1c, 0xa3, 0xcc, 0x17, 0xb7, 0x54, 0xb5, 0x80, 0xb4, 0x65, 0x9f, 0xcd, 0x41, 0xa5, 0x29, 0xd0, 0x3d, 0xa9, 0x16, 0x96, - 0x58, 0xe2, 0x6e, 0x9c, 0x5a, 0xce, 0x65, 0x94, 0xf1, 0x58, 0x93, 0x34, 0xa5, 0x5e, 0x03, 0xbc, 0xcf, 0x3d, 0x67, 0xc3, 0xff, 0xd7, 0x8b, 0x26, 0x92, 0xc6, 0x0e, 0x18, 0xd4, 0x7f, 0xd7, 0x8d, - 0xfd, 0xd1, 0xa0, 0xfd, 0x4b, 0xc4, 0xe7, 0xe7, 0xa7, 0xfa, 0xb7, 0x68, 0x82, 0x1f, 0x8a, 0xc8, 0xcf, 0x10, 0xce, 0xef, 0x75, 0x7a, 0xfc, 0x2a, 0xf4, 0x91, 0xff, 0x7c, 0x78, 0x99, 0x3f, 0xdf, - 0x8b, 0xdd, 0xea, 0x53, 0xef, 0x72, 0xec, 0xfb, 0x4f, 0xf8, 0xde, 0xda, 0xfc, 0x61, 0x92, 0xdb, 0x75, 0x34, 0xee, 0x06, 0x5d, 0xfe, 0xab, 0xfb, 0x2a, 0x8f, 0x5f, 0xf3, 0xc6, 0x11, 0xf7, 0x03, - 0x3f, 0x27, 0xee, 0xb2, 0xa4, 0x91, 0x07, 0xf6, 0x0b, 0x60, 0x73, 0xa2, 0x29, 0xc1, 0x2a, 0xb4, 0x79, 0x93, 0x1a, 0x95, 0x2d, 0x34, 0x41, 0x84, 0x1f, 0xcd, 0x38, 0x59, 0x25, 0x76, 0x7a, 0x74, - 0x4f, 0x64, 0x6d, 0xeb, 0x4d, 0x6b, 0xe7, 0x7b, 0x6e, 0xd8, 0x6c, 0x2f, 0xb9, 0x10, 0xed, 0x8f, 0x3c, 0xb7, 0x3e, 0x0b, 0x17, 0x8e, 0xcc, 0x6a, 0x95, 0xe2, 0xa0, 0x76, 0x9e, 0x9d, 0xd3, 0x53, - 0x9f, 0xcc, 0x0d, 0xea, 0xd2, 0xf5, 0xc2, 0xe4, 0xe9, 0xf2, 0xfa, 0xd3, 0xff, 0x8c, 0x1b, 0xfe, 0x37, 0xf9, 0xdf, 0xc4, 0xed, 0x3e, 0x60, 0x6f, 0x48, 0x5d, 0xe9, 0xff, 0x8e, 0x54, 0xcd, 0x1a, - 0x3b, 0x2d, 0xcc, 0x19, 0xab, 0xf6, 0x37, 0x2d, 0xac, 0x84, 0x09, 0x91, 0xea, 0x8e, 0x02, 0x09, 0x41, 0xb2, 0x88, 0xac, 0xc3, 0x91, 0xc9, 0x4a, 0x0b, 0x67, 0xec, 0xfd, 0xf2, 0x34, 0x6c, 0x22, - 0x3c, 0x64, 0x8e, 0x6c, 0x68, 0x83, 0xed, 0x6e, 0x9d, 0x28, 0x3b, 0xa1, 0xe4, 0x16, 0xc9, 0x9c, 0xb6, 0xbd, 0xc3, 0xaa, 0xf4, 0x64, 0x77, 0xbe, 0xd9, 0x73, 0x5a, 0x58, 0x59, 0x64, 0x9d, 0x17, - 0xca, 0xef, 0x96, 0xc5, 0x7f, 0xbd, 0xaa, 0xff, 0xd7, 0xfa, 0x35, 0x57, 0xce, 0xfe, 0xcf, 0x47, 0xec, 0xc4, 0x27, 0xc6, 0xfd, 0x54, 0x5a, 0xfe, 0xe7, 0x9d, 0x3f, 0x97, 0x96, 0x7f, 0x54, 0xd7, - 0x1c, 0xfd, 0xf1, 0x50, 0x5b, 0xc5, 0xef, 0x24, 0xbe, 0xbc, 0xa3, 0x0a, 0x3c, 0xf7, 0x7d, 0xb6, 0xfe, 0x23, 0xef, 0xdc, 0xaf, 0x35, 0xe6, 0x9f, 0xf5, 0xcb, 0x7d, 0xa9, 0x31, 0x3f, 0xd9, 0x15, - 0x57, 0xab, 0x2d, 0x7c, 0x2a, 0x5d, 0x99, 0x1e, 0x36, 0x8d, 0x79, 0x61, 0xc5, 0xee, 0x1c, 0x68, 0x7e, 0x44, 0x8b, 0xa3, 0xc5, 0xf7, 0x32, 0xba, 0xd7, 0x86, 0x23, 0x2c, 0x68, 0x00, 0x36, 0xb7, - 0xb9, 0x71, 0x4e, 0x08, 0xa5, 0xb6, 0x34, 0xa3, 0x55, 0xb4, 0x5b, 0x8d, 0x09, 0x7d, 0x6c, 0x45, 0x9d, 0x14, 0x4d, 0xae, 0xcf, 0x6d, 0x3f, 0xc2, 0x23, 0x57, 0xee, 0x93, 0x01, 0x56, 0xda, 0xf5, - 0xc8, 0xee, 0xfe, 0x81, 0x9e, 0xfb, 0x3f, 0x35, 0xe6, 0x7f, 0xb1, 0x61, 0xfe, 0xaf, 0xaa, 0x31, 0x7f, 0x1d, 0xed, 0xd4, 0xef, 0xfc, 0xbc, 0x8e, 0x1a, 0x3f, 0xce, 0xff, 0xe0, 0x63, 0xfc, 0xe7, - 0xd9, 0xfb, 0xdf, 0x89, 0xbf, 0xc9, 0xbf, 0x4f, 0x97, 0xa6, 0x34, 0x80, 0x87, 0x67, 0x3b, 0xb3, 0x74, 0xad, 0x22, 0x24, 0x16, 0xe7, 0xed, 0xf6, 0xbc, 0x54, 0x80, 0x48, 0xa5, 0xac, 0xf6, 0xec, - 0xe1, 0xbe, 0xea, 0x4e, 0x14, 0xf4, 0xd7, 0x9d, 0xb0, 0x77, 0xb6, 0x7b, 0xe4, 0x37, 0x7a, 0xd2, 0x9c, 0xf8, 0x44, 0xfc, 0xed, 0x13, 0x3f, 0x5d, 0x9a, 0x5a, 0xe1, 0xed, 0xac, 0x22, 0x15, 0xe0, - 0xa3, 0x42, 0x17, 0xf1, 0x8b, 0xac, 0xf4, 0x84, 0x6d, 0x07, 0x82, 0x3a, 0xb5, 0xc8, 0x17, 0x69, 0x6e, 0x26, 0xf6, 0x9c, 0x50, 0x44, 0xae, 0xb5, 0x8f, 0xcc, 0x86, 0x3b, 0xf5, 0xc8, 0xa9, 0x13, - 0x64, 0xea, 0xc0, 0x25, 0x17, 0x01, 0x08, 0xc0, 0x4a, 0x58, 0xaa, 0xd8, 0xd6, 0xc7, 0xca, 0xfc, 0x44, 0x95, 0xf4, 0x9a, 0x39, 0xa9, 0x92, 0x96, 0x98, 0x02, 0x23, 0xaa, 0x39, 0x32, 0x41, 0xbe, - 0xff, 0xc9, 0xee, 0xfa, 0x9e, 0x66, 0xfb, 0x13, 0xd8, 0xca, 0xf7, 0x1e, 0x67, 0xd9, 0xa3, 0x4f, 0x15, 0x13, 0xf9, 0x44, 0xf7, 0x0d, 0xce, 0xdb, 0xd9, 0xd5, 0xf6, 0x98, 0x50, 0xb4, 0x00, 0x80, - 0xfc, 0x0c, 0x58, 0x0d, 0x36, 0x1d, 0x88, 0xcb, 0x80, 0x57, 0x96, 0xae, 0x47, 0x20, 0x66, 0x47, 0x14, 0x79, 0xc2, 0x66, 0x59, 0x64, 0xc0, 0x6d, 0x44, 0x11, 0x47, 0x23, 0x90, 0x75, 0xca, 0xe8, - 0x19, 0x9f, 0x38, 0xd9, 0x0b, 0x4f, 0x99, 0x1f, 0x56, 0x74, 0x0d, 0x81, 0x52, 0xde, 0x86, 0x17, 0xdc, 0xf0, 0xe8, 0xc6, 0x73, 0x2c, 0xd2, 0x27, 0x42, 0x1e, 0x69, 0x54, 0xda, 0x1b, 0x8f, 0xde, - 0x8f, 0xfa, 0xa8, 0xd7, 0x1f, 0x56, 0xdb, 0xc1, 0x34, 0xc5, 0xeb, 0x49, 0xd6, 0xfa, 0x4a, 0xff, 0x0d, 0x8e, 0xaf, 0x57, 0xaf, 0xaa, 0xd6, 0x04, 0x06, 0x3b, 0x00, 0xe2, 0xda, 0x45, 0xbc, 0x6c, - 0xb5, 0x49, 0x77, 0x65, 0xca, 0x81, 0x02, 0x26, 0xd2, 0x29, 0xbd, 0x71, 0x19, 0x81, 0x09, 0x76, 0xcd, 0x8e, 0x60, 0x4d, 0x0a, 0x6b, 0x8d, 0xcd, 0x51, 0x21, 0xf8, 0xce, 0x1d, 0xe9, 0x8d, 0x1b, - 0xa2, 0xa8, 0x89, 0x8c, 0xf0, 0xca, 0x70, 0x52, 0x8d, 0xb8, 0x78, 0x26, 0x8e, 0xed, 0x8e, 0xa6, 0x21, 0xf0, 0x1d, 0x00, 0x1d, 0xca, 0x33, 0xb5, 0x2a, 0x88, 0xf1, 0x34, 0x65, 0x9b, 0xfb, 0xd3, - 0xca, 0x7d, 0x1f, 0x9e, 0xa7, 0x8d, 0xb4, 0xb6, 0x8a, 0xdf, 0x30, 0x79, 0x61, 0xdd, 0x89, 0x3d, 0x72, 0xdd, 0x55, 0x5b, 0x8b, 0xec, 0xaa, 0x01, 0x55, 0xb0, 0x58, 0x11, 0x23, 0x08, 0xe7, 0x43, - 0xe0, 0x23, 0x8b, 0x6e, 0x29, 0x1a, 0x5a, 0x11, 0x19, 0x6a, 0xd0, 0x9d, 0xe4, 0xa8, 0xbb, 0x40, 0xf9, 0x9c, 0x3f, 0x00, 0x97, 0x00, 0x97, 0x8a, 0xf9, 0x31, 0x61, 0x04, 0xf7, 0x50, 0xd2, 0x68, - 0x2b, 0xeb, 0xac, 0x1b, 0x8d, 0xa6, 0x5b, 0x77, 0xbb, 0xb4, 0xb2, 0x4b, 0xc6, 0x3b, 0xc2, 0xed, 0x01, 0x30, 0x97, 0x77, 0xcd, 0xf4, 0xc7, 0x3c, 0xf1, 0xcd, 0x8f, 0xfa, 0x4f, 0xbe, 0xfa, 0x83, - 0x11, 0x5e, 0x06, 0xff, 0x46, 0xe8, 0xf7, 0x8f, 0xce, 0xc0, 0xb9, 0xad, 0x4a, 0x54, 0x1e, 0xe0, 0xed, 0x60, 0x7a, 0x15, 0xe7, 0x23, 0xe7, 0xf3, 0x19, 0x80, 0x46, 0xb4, 0x58, 0x0e, 0x3c, 0xc0, - 0x00, 0xc0, 0x39, 0x15, 0x95, 0x62, 0xb3, 0xd6, 0x56, 0xd8, 0x61, 0x05, 0xe5, 0x07, 0x91, 0xe6, 0x08, 0x15, 0x5d, 0x5c, 0x8e, 0x0a, 0xba, 0x35, 0xfa, 0x06, 0xcc, 0x3c, 0x9a, 0x24, 0x97, 0x5b, - 0x15, 0x5b, 0x60, 0x68, 0xc9, 0xd3, 0xc5, 0xb9, 0xda, 0x23, 0xe3, 0x04, 0xc7, 0xf4, 0xbb, 0xfa, 0xf8, 0xa2, 0x08, 0xbd, 0xa6, 0x1b, 0x55, 0xaf, 0x5a, 0xc5, 0x37, 0x4f, 0xf2, 0xfb, 0xa3, 0xd7, - 0x2a, 0x25, 0xaf, 0xcf, 0x40, 0x0f, 0x9e, 0xb9, 0xa7, 0x49, 0x7f, 0x21, 0xff, 0x23, 0x02, 0xfb, 0xbd, 0x56, 0x47, 0x5a, 0x84, 0xe1, 0x67, 0xfd, 0xe3, 0x6b, 0x92, 0xe5, 0x6b, 0xc7, 0xfe, 0x17, - 0x45, 0x16, 0xf9, 0xe9, 0x07, 0xbf, 0xef, 0xc4, 0xbb, 0xa3, 0x0e, 0x07, 0x71, 0xee, 0xcd, 0xb2, 0x61, 0xd6, 0xdb, 0x37, 0xc7, 0x39, 0xf9, 0x3d, 0x93, 0x2f, 0x8d, 0xc3, 0xa8, 0x79, 0x79, 0xe2, - 0x05, 0x37, 0xbf, 0x7e, 0x33, 0x25, 0x89, 0x6f, 0xe9, 0x67, 0x71, 0xfe, 0xf6, 0x6b, 0xbe, 0xa1, 0xf5, 0xda, 0x8f, 0x69, 0xd6, 0xdb, 0x55, 0xfe, 0xf9, 0x6b, 0xbe, 0x3f, 0x74, 0x19, 0x66, 0xb6, - 0xe7, 0x55, 0xef, 0xf7, 0xbf, 0x38, 0xdf, 0x3f, 0xa9, 0xcd, 0xdf, 0xec, 0xd4, 0xda, 0x77, 0xdb, 0xca, 0xbf, 0x21, 0xfc, 0xd9, 0xf1, 0x89, 0x7f, 0x7f, 0xec, 0x53, 0x8e, 0xdb, 0x37, 0xcf, 0x7e, - 0x13, 0xe7, 0xc3, 0x7b, 0x9f, 0xbc, 0xd7, 0x1d, 0x87, 0xd7, 0xbb, 0x3f, 0x57, 0x92, 0xf3, 0xe3, 0x75, 0xf9, 0x59, 0xb3, 0xf5, 0xfc, 0x3a, 0x4d, 0xce, 0x33, 0xf8, 0x67, 0x93, 0xa7, 0xbb, 0x93, - 0x84, 0xe4, 0xdd, 0xb1, 0xa6, 0xc2, 0xd5, 0x8e, 0xab, 0x8c, 0x51, 0x03, 0xf8, 0x53, 0x6d, 0xb2, 0x6e, 0x5b, 0x9e, 0xb7, 0xc3, 0x65, 0x2f, 0x1c, 0x8f, 0x95, 0x20, 0x6f, 0x54, 0xf5, 0xa2, 0x23, - 0x20, 0x17, 0xbb, 0x06, 0x45, 0x52, 0xf4, 0x56, 0x65, 0x55, 0x95, 0x02, 0x04, 0x17, 0x69, 0x0f, 0xa3, 0xde, 0x96, 0x72, 0x8d, 0x99, 0x7b, 0x6c, 0x3d, 0xb2, 0x19, 0x7b, 0x49, 0x92, 0xb9, 0xc1, - 0x5e, 0x38, 0x30, 0xfc, 0x7d, 0x92, 0x54, 0x7e, 0x5b, 0x7f, 0xce, 0x8e, 0x7c, 0x50, 0x75, 0xea, 0x4e, 0x42, 0xea, 0x3d, 0xc8, 0x88, 0xe7, 0x3c, 0xa3, 0xdf, 0x88, 0xbf, 0x80, 0xf7, 0xed, 0xd2, - 0xb5, 0xbb, 0xd9, 0x84, 0x95, 0x86, 0x5c, 0x96, 0x35, 0x78, 0x3c, 0x0c, 0x99, 0xb3, 0x39, 0x21, 0xca, 0xc6, 0x14, 0x31, 0x69, 0x2c, 0xb7, 0x72, 0x65, 0x26, 0xdb, 0xc8, 0x5b, 0x5d, 0x8e, 0xed, - 0xaa, 0x1b, 0x10, 0x85, 0xad, 0x37, 0x3c, 0x91, 0x26, 0x6d, 0xe1, 0x89, 0x9d, 0x77, 0x3a, 0xd4, 0xa0, 0x5b, 0x0e, 0xeb, 0x35, 0x3a, 0x37, 0x56, 0x46, 0x29, 0x40, 0x72, 0x0c, 0x0b, 0x5d, 0x08, - 0x17, 0x9d, 0xb3, 0x1d, 0x37, 0xde, 0x82, 0x65, 0x9f, 0xf3, 0xfb, 0x04, 0xa9, 0xdd, 0x7c, 0xca, 0x6e, 0xfc, 0x43, 0x49, 0xaf, 0x2f, 0x6d, 0x93, 0xef, 0xc1, 0x4a, 0x3e, 0x0b, 0xeb, 0x2b, 0xd9, - 0x1b, 0xa0, 0xaf, 0x27, 0xd7, 0x2a, 0xfb, 0x13, 0xa0, 0x3c, 0xcb, 0x05, 0xbd, 0x00, 0xbc, 0xad, 0x9e, 0xcd, 0x91, 0x8d, 0xeb, 0x60, 0xac, 0x63, 0x74, 0xb9, 0xb8, 0xbe, 0x68, 0xbb, 0x64, 0x9e, - 0x01, 0xaa, 0x5a, 0xfa, 0x58, 0xc8, 0xb5, 0xcb, 0x6a, 0x3c, 0x6d, 0xc8, 0x8c, 0x37, 0x52, 0xd0, 0x4b, 0xcc, 0x7d, 0x8b, 0xc8, 0x9e, 0x82, 0xec, 0x6c, 0x14, 0x42, 0x24, 0xac, 0x38, 0x9f, 0xf6, - 0x21, 0x1d, 0x57, 0x44, 0x62, 0x6f, 0x0e, 0x6b, 0x44, 0xdf, 0x1b, 0xe5, 0x73, 0x59, 0x3a, 0x4d, 0xf1, 0x5a, 0xd8, 0xe4, 0xa3, 0xb7, 0x34, 0xfe, 0x07, 0xed, 0xf0, 0x8b, 0xfc, 0xbb, 0x8f, 0xe7, - 0x33, 0x55, 0x01, 0x3e, 0xd1, 0xbd, 0x02, 0xfa, 0x7e, 0x36, 0xbb, 0xd2, 0xfb, 0x1d, 0x51, 0x81, 0x74, 0xfc, 0xea, 0xe0, 0x09, 0x6b, 0x00, 0x9f, 0x4b, 0x46, 0x85, 0xc5, 0xe9, 0xe6, 0xb0, 0xb3, - 0x63, 0x2c, 0x4b, 0x49, 0x13, 0x39, 0x33, 0xf5, 0x25, 0xe9, 0xd1, 0x32, 0xf0, 0xd9, 0xcb, 0x2e, 0x0e, 0xad, 0xcc, 0xe6, 0xb4, 0x71, 0x01, 0xf5, 0xc9, 0x7a, 0x93, 0xd0, 0xd0, 0x45, 0x9d, 0x67, - 0x4b, 0xf7, 0x60, 0xba, 0x43, 0x03, 0xe1, 0xd0, 0x20, 0x01, 0x28, 0x26, 0x5b, 0xdc, 0x3a, 0x83, 0xfd, 0xe9, 0x7a, 0xf6, 0x04, 0x27, 0xc7, 0x57, 0x63, 0xe5, 0xce, 0xda, 0x72, 0xd5, 0xff, 0xae, - 0x63, 0x81, 0x7c, 0x12, 0xfb, 0x8f, 0x87, 0xa1, 0x7d, 0x54, 0x7a, 0xe2, 0xb9, 0x94, 0xb4, 0x57, 0x9a, 0x6f, 0xf0, 0xb7, 0xe5, 0xd4, 0x94, 0xb3, 0x5d, 0x29, 0xf7, 0x8c, 0xa7, 0x80, 0x66, 0x7a, - 0x54, 0x90, 0x2e, 0xa1, 0x6c, 0x34, 0xa2, 0x56, 0x71, 0xc9, 0xb5, 0xa6, 0x1a, 0xa3, 0xbd, 0xeb, 0x1b, 0x8a, 0xb2, 0x34, 0x0f, 0x17, 0x69, 0x25, 0xb9, 0xee, 0x19, 0x83, 0x98, 0xbc, 0x27, 0xd9, - 0xb4, 0xe6, 0x8f, 0xf3, 0xad, 0xd3, 0xc0, 0x56, 0x03, 0xc8, 0x1b, 0x86, 0x58, 0x9c, 0xe9, 0xba, 0x5d, 0x95, 0xab, 0x03, 0x07, 0xc9, 0x75, 0xbe, 0xda, 0xa7, 0xcf, 0x85, 0x18, 0xa6, 0x85, 0x6b, - 0x37, 0x1f, 0x2d, 0x26, 0x7f, 0xa6, 0xe1, 0x5f, 0x6b, 0x52, 0xfa, 0x97, 0xb8, 0x6e, 0xde, 0x1c, 0x11, 0x8f, 0x31, 0xfe, 0x2c, 0x63, 0xee, 0xdb, 0x41, 0xcf, 0x14, 0x8b, 0xfd, 0x20, 0xfb, 0x82, - 0xf4, 0xfb, 0xc9, 0xb5, 0x36, 0xe5, 0x84, 0x92, 0xb1, 0x5e, 0x46, 0xd7, 0xf8, 0xae, 0x27, 0xd7, 0x2e, 0xb4, 0xec, 0xb6, 0xa6, 0x53, 0x47, 0x12, 0x31, 0xba, 0xd1, 0x9c, 0xa1, 0xd5, 0x50, 0x49, - 0xc7, 0x91, 0xb7, 0x8e, 0x68, 0x37, 0xa4, 0x2a, 0xbd, 0x3a, 0x2f, 0x82, 0x3d, 0x75, 0x74, 0x63, 0x27, 0xd5, 0x8f, 0xb2, 0x18, 0x1c, 0x88, 0x7d, 0xdc, 0xae, 0x21, 0x1f, 0x46, 0x7d, 0xce, 0xb4, - 0x0a, 0xcb, 0xc0, 0x7b, 0xaf, 0xf2, 0x3b, 0x72, 0x87, 0x4a, 0xfd, 0xf3, 0x42, 0xb8, 0xb9, 0x7d, 0xef, 0xcf, 0x04, 0xf6, 0x2a, 0xce, 0x2a, 0x3b, 0x78, 0x97, 0xce, 0x0f, 0xea, 0xa9, 0x7c, 0x90, - 0x78, 0x64, 0x68, 0x3e, 0x21, 0x9a, 0x6f, 0x34, 0x5f, 0xd1, 0x6d, 0x7c, 0xef, 0x4e, 0x4e, 0xef, 0x5d, 0x68, 0x47, 0xa6, 0x60, 0x94, 0xb8, 0xf5, 0x06, 0xa0, 0xc2, 0xf7, 0x5d, 0xbe, 0xef, 0x51, - 0x71, 0x3d, 0xe0, 0x45, 0x0d, 0x16, 0xea, 0xda, 0x14, 0xc6, 0x6a, 0x4c, 0x6c, 0xb0, 0x61, 0xb9, 0x73, 0x65, 0x35, 0x52, 0xa4, 0xf7, 0x94, 0xd3, 0x10, 0x03, 0x25, 0xb3, 0xe3, 0xf6, 0xe0, 0x26, - 0x87, 0x0a, 0xa0, 0xd2, 0xd8, 0xa0, 0x78, 0x87, 0x18, 0xe4, 0xa8, 0xa7, 0x0e, 0x16, 0x69, 0x2c, 0x2c, 0xdc, 0x1a, 0x27, 0x59, 0x52, 0x45, 0x35, 0xf3, 0x6d, 0xf7, 0x51, 0x0f, 0x12, 0xe8, 0x6f, - 0xf4, 0x99, 0x3d, 0xbf, 0x57, 0xa2, 0x2f, 0x38, 0xbc, 0x1e, 0xce, 0xae, 0x94, 0x7e, 0x07, 0x22, 0x39, 0x9b, 0xc1, 0xa6, 0x24, 0xb3, 0x82, 0xee, 0x56, 0x83, 0x12, 0x50, 0xc3, 0xe9, 0x80, 0x74, - 0x24, 0x03, 0x20, 0x12, 0xa6, 0x24, 0xfe, 0xdc, 0x5f, 0xe1, 0x00, 0x37, 0xd2, 0xc7, 0xca, 0x8e, 0x65, 0x38, 0x0e, 0x73, 0x0a, 0xee, 0x93, 0x58, 0x20, 0x17, 0x0e, 0xdd, 0xed, 0xe5, 0x43, 0xa7, - 0x04, 0x52, 0x93, 0xed, 0x6d, 0x4c, 0x40, 0xd4, 0x42, 0xd1, 0xaa, 0xea, 0x18, 0x77, 0x9e, 0x6e, 0x65, 0x13, 0x8c, 0x8a, 0x7b, 0xb5, 0x7c, 0xd0, 0x07, 0x8c, 0x53, 0x54, 0xd9, 0xcc, 0xb3, 0x9b, - 0x3f, 0xc5, 0x9a, 0x3f, 0x21, 0x02, 0xdf, 0xa8, 0xde, 0x40, 0xbb, 0x1d, 0x5f, 0xe3, 0xcd, 0x27, 0x88, 0x41, 0x5e, 0xe3, 0x4f, 0xe9, 0x7e, 0x19, 0xe3, 0x0d, 0xa4, 0x6c, 0xad, 0x36, 0x3e, 0x16, - 0x0c, 0xa8, 0x10, 0x9d, 0x9b, 0x5f, 0xdc, 0x8d, 0xb2, 0xc3, 0x3b, 0xaf, 0x0d, 0xf7, 0x65, 0xcb, 0x0c, 0x31, 0xb1, 0x37, 0x96, 0x31, 0xe2, 0xa6, 0xbb, 0x5d, 0x09, 0x5c, 0x42, 0x3e, 0x6a, 0xb7, - 0xb6, 0x30, 0x07, 0xc6, 0x65, 0x98, 0xa3, 0xb0, 0xe8, 0x21, 0x28, 0x7e, 0x40, 0xf1, 0x80, 0x14, 0x86, 0xd3, 0xc9, 0xee, 0x9f, 0x13, 0x83, 0x76, 0x3d, 0xe4, 0xee, 0x29, 0xbe, 0x19, 0x1f, 0xd0, - 0xf7, 0xcc, 0x8a, 0x9f, 0xed, 0x01, 0x6f, 0x8b, 0x11, 0xf5, 0xf9, 0xa1, 0x2c, 0xce, 0xfc, 0xab, 0x35, 0xf4, 0xc9, 0xb9, 0xff, 0x68, 0x12, 0x17, 0x55, 0x16, 0x7b, 0xaf, 0xa3, 0xf6, 0x2f, 0x7a, - 0x4a, 0xde, 0xc9, 0xbe, 0x8e, 0xc6, 0xed, 0x64, 0xaa, 0x5f, 0x04, 0xe2, 0xdd, 0x3d, 0xdd, 0xcf, 0x17, 0xfc, 0xb8, 0xe9, 0x82, 0xf8, 0x54, 0x93, 0x45, 0xb6, 0x06, 0xf6, 0xb1, 0xb9, 0x66, 0x62, - 0x0e, 0xd0, 0x46, 0x11, 0xdb, 0xb9, 0x3d, 0xac, 0xa7, 0x7a, 0xb1, 0xcc, 0x23, 0xfd, 0xc2, 0xb9, 0x5b, 0x31, 0x69, 0xa0, 0x1d, 0x79, 0xa1, 0x7a, 0xde, 0x81, 0x5a, 0x42, 0x16, 0x5a, 0x4a, 0x72, - 0x68, 0xea, 0xb0, 0x44, 0xf3, 0x4b, 0x93, 0x2e, 0xf0, 0x39, 0xe9, 0x74, 0xfa, 0x73, 0x2a, 0xd6, 0x47, 0xcd, 0xf1, 0x3b, 0x55, 0xf0, 0x22, 0xff, 0x52, 0xbc, 0x36, 0xd2, 0xfd, 0xa1, 0x11, 0x14, - 0xb9, 0xfb, 0xa0, 0xbe, 0xc9, 0xe7, 0x98, 0xa8, 0x47, 0xeb, 0x57, 0x51, 0xf5, 0x76, 0xe5, 0x3d, 0x94, 0xae, 0xd0, 0x73, 0x0e, 0x9a, 0x37, 0xaa, 0xb7, 0x41, 0xb9, 0x1d, 0xcf, 0xa0, 0x69, 0x2e, - 0x1a, 0xa7, 0x55, 0x97, 0x50, 0x50, 0xb2, 0x8d, 0x2a, 0xec, 0xb5, 0xb9, 0xcc, 0xec, 0x7d, 0x22, 0xe2, 0x10, 0x9c, 0x6a, 0xf8, 0xd6, 0x59, 0x14, 0xea, 0xc6, 0xc1, 0x2c, 0x89, 0x21, 0xa4, 0xcb, - 0xd6, 0x10, 0xa4, 0x1e, 0x09, 0x65, 0xb7, 0x17, 0x0a, 0xba, 0x1f, 0x6c, 0x27, 0x1d, 0xb7, 0xa3, 0xcc, 0xe0, 0x23, 0x7d, 0x61, 0xe8, 0x0d, 0x2c, 0x4a, 0xc9, 0x09, 0x94, 0x1a, 0x62, 0xab, 0xd1, - 0xb6, 0x59, 0xfc, 0x74, 0xe1, 0xd5, 0x7f, 0x57, 0xbe, 0x9d, 0x96, 0x7f, 0xea, 0xea, 0xf4, 0x94, 0x74, 0xf8, 0xa0, 0xfb, 0xf2, 0xf1, 0x1f, 0x67, 0x53, 0x22, 0x6e, 0xe0, 0xd9, 0x42, 0xd9, 0x37, - 0xeb, 0xfd, 0xd6, 0x48, 0xc4, 0x92, 0x41, 0xa0, 0x22, 0x8f, 0xa8, 0x9a, 0x55, 0xd4, 0x4c, 0x27, 0x4e, 0xd4, 0x84, 0x25, 0xa2, 0xfe, 0x63, 0x5c, 0x28, 0xf2, 0x54, 0x05, 0xd9, 0x37, 0xa2, 0xd7, - 0xaf, 0x79, 0x8d, 0x0d, 0x45, 0xa6, 0x55, 0x90, 0xbd, 0xc4, 0xe7, 0xad, 0xa2, 0x62, 0x17, 0xc6, 0x17, 0xb4, 0x96, 0xa5, 0xdb, 0x43, 0x06, 0x04, 0x0b, 0xd5, 0x5d, 0xc9, 0xa1, 0xc8, 0x6e, 0x63, - 0x99, 0xdd, 0x01, 0xfe, 0x31, 0x1e, 0x34, 0x32, 0xa9, 0x43, 0x63, 0x7e, 0x86, 0x9d, 0x93, 0x31, 0x84, 0x0d, 0x04, 0x15, 0xcc, 0xbe, 0xe8, 0x59, 0x92, 0xf7, 0x9a, 0x52, 0x16, 0x6c, 0x7b, 0x17, - 0x8a, 0x0d, 0x05, 0x23, 0x3b, 0xda, 0x76, 0x00, 0x8e, 0x13, 0x7f, 0xab, 0x00, 0xf7, 0x5a, 0xd4, 0x27, 0xbd, 0x0b, 0xd0, 0xb7, 0x92, 0xa5, 0xff, 0xe2, 0x66, 0xc0, 0x67, 0xca, 0x2f, 0x50, 0x7d, - 0x3e, 0x9f, 0xba, 0x0d, 0x30, 0xac, 0x8a, 0x8e, 0x19, 0xb7, 0x47, 0x8c, 0xae, 0x17, 0x94, 0x99, 0xe2, 0x54, 0xb0, 0x9f, 0x1f, 0xd6, 0x78, 0xdd, 0xed, 0x37, 0xad, 0x1d, 0x3b, 0xbb, 0xcb, 0x51, - 0x59, 0x2f, 0x36, 0x19, 0x2b, 0x3b, 0x5a, 0x3b, 0xaf, 0xa0, 0x6d, 0x00, 0x8b, 0xf1, 0xae, 0x28, 0x97, 0x5b, 0x5a, 0x8a, 0x17, 0x49, 0x6c, 0xb2, 0x73, 0x27, 0xb0, 0x6d, 0x64, 0x11, 0x11, 0x4e, - 0xe5, 0x2b, 0x04, 0x23, 0x19, 0xda, 0x0a, 0xfa, 0x19, 0x6c, 0xf5, 0x87, 0xa2, 0x55, 0x8f, 0xe6, 0xc1, 0xf3, 0x80, 0xfc, 0x78, 0xcb, 0x27, 0x70, 0x7e, 0xdc, 0x9b, 0x12, 0x6c, 0x05, 0xcf, 0x96, - 0xfd, 0x79, 0xec, 0x0c, 0x9d, 0x14, 0x43, 0x38, 0xc9, 0x3c, 0xd1, 0xe5, 0x12, 0x22, 0xac, 0xd3, 0x95, 0x10, 0x0e, 0x13, 0xb6, 0x84, 0xbe, 0x97, 0xa4, 0x7d, 0xc4, 0x02, 0xff, 0x5c, 0x97, 0xfa, - 0x42, 0x19, 0x9c, 0x7d, 0x3d, 0x9f, 0xda, 0x13, 0x45, 0x59, 0x1b, 0x23, 0xac, 0x25, 0xe4, 0x76, 0x0f, 0xd1, 0xf4, 0xce, 0xef, 0xf4, 0x25, 0x9e, 0x74, 0x79, 0x43, 0x37, 0xfb, 0xd3, 0x51, 0xa2, - 0x44, 0x18, 0xf3, 0x2e, 0x4a, 0x1a, 0x9f, 0xd6, 0xed, 0xae, 0xc1, 0x5a, 0x8e, 0x8e, 0x04, 0x46, 0x48, 0x36, 0xc3, 0x86, 0x8d, 0x37, 0x2a, 0x3e, 0xf2, 0x1b, 0x3f, 0x65, 0x3d, 0x8e, 0x56, 0x24, - 0x95, 0x39, 0x5a, 0x63, 0xbd, 0xbe, 0x40, 0x07, 0x9b, 0xdb, 0xd0, 0x13, 0x9a, 0xc3, 0x4f, 0x28, 0xe6, 0xfb, 0x0f, 0xab, 0xef, 0xbe, 0xde, 0xff, 0xff, 0xfe, 0x40, 0xff, 0x6e, 0xb5, 0xdf, 0x7f, - 0x4f, 0x00, 0xdf, 0x7f, 0xc5, 0xeb, 0x78, 0xfc, 0xbc, 0x31, 0x45, 0x2c, 0x5f, 0xe3, 0x99, 0xf8, 0xcc, 0x13, 0x60, 0xb3, 0x5b, 0x29, 0xb1, 0x55, 0xa6, 0xcd, 0x5c, 0x0a, 0x4f, 0x6d, 0xac, 0xe7, - 0x43, 0x7b, 0x1a, 0x2f, 0x5b, 0x50, 0x25, 0x24, 0x6e, 0x7d, 0x44, 0x61, 0xd1, 0x47, 0xd9, 0x25, 0x2c, 0x9d, 0x71, 0x07, 0xda, 0x23, 0xbb, 0xe8, 0x88, 0xd3, 0xba, 0x18, 0xd3, 0x9d, 0x55, 0xee, - 0x38, 0xc5, 0xf0, 0xce, 0x39, 0x00, 0xaf, 0x5c, 0x9b, 0xe9, 0xf3, 0x51, 0xd3, 0xf0, 0x6e, 0x9e, 0x3c, 0xa7, 0xb8, 0xfd, 0x52, 0xbc, 0xf9, 0x51, 0xd1, 0xe5, 0xfb, 0x03, 0xf2, 0x38, 0x68, 0x8c, - 0xfc, 0x1b, 0x7e, 0x62, 0xe3, 0xf7, 0x35, 0x5e, 0xec, 0x1a, 0x27, 0x75, 0xa5, 0xf0, 0x3b, 0xb4, 0x9b, 0xde, 0xbe, 0xf4, 0x83, 0x45, 0x22, 0x9b, 0x13, 0xd9, 0x59, 0x2b, 0xa9, 0x91, 0xa4, 0x6a, - 0xe8, 0x8f, 0x90, 0xd5, 0x6e, 0x86, 0x7d, 0x53, 0x79, 0x5c, 0x63, 0x3b, 0x7e, 0x60, 0x89, 0x8c, 0x89, 0x5b, 0xcb, 0x75, 0x64, 0x34, 0xa1, 0x37, 0xe6, 0x69, 0xab, 0xfa, 0xf5, 0x45, 0xca, 0x76, - 0x71, 0xc3, 0x43, 0x7b, 0x46, 0x06, 0x64, 0x84, 0xa8, 0x0f, 0x9a, 0xe0, 0x8b, 0xfb, 0x15, 0xd2, 0x6f, 0xd9, 0xdf, 0x96, 0x89, 0x07, 0xd3, 0xe0, 0x8b, 0x56, 0x70, 0x47, 0xd9, 0x8a, 0xf3, 0xe0, - 0xea, 0xbc, 0xff, 0xcf, 0x5d, 0x35, 0x2d, 0xce, 0x23, 0xbf, 0x8a, 0x6f, 0x5e, 0x83, 0x2f, 0x63, 0xf2, 0x4b, 0xb5, 0xba, 0x4f, 0x2a, 0x1c, 0x7a, 0xc7, 0x15, 0x11, 0x5f, 0x8b, 0x8d, 0x17, 0x69, - 0xdb, 0x7c, 0xde, 0x70, 0x78, 0x38, 0x9e, 0x1f, 0xf1, 0x69, 0xf7, 0x86, 0x15, 0x7f, 0x6a, 0x63, 0xf6, 0x13, 0xdd, 0xb7, 0xd1, 0xbd, 0x9d, 0x5d, 0x6b, 0x72, 0x4c, 0xd0, 0x05, 0x18, 0x79, 0x15, - 0xee, 0x95, 0xb9, 0x5f, 0xc6, 0x6b, 0xb3, 0xdf, 0xa1, 0x8c, 0x9a, 0x2f, 0x2f, 0x00, 0x6e, 0xe4, 0x5a, 0x8b, 0x08, 0xac, 0xe9, 0x8d, 0xce, 0x72, 0x87, 0xe1, 0xfe, 0xa6, 0x87, 0xbb, 0x0a, 0x1d, - 0x59, 0xb4, 0xb3, 0x36, 0xfe, 0xe0, 0x7b, 0x70, 0x3d, 0xa7, 0xa3, 0xdc, 0x71, 0x65, 0x97, 0x06, 0xf7, 0xd5, 0x76, 0xd8, 0xe2, 0xea, 0x4e, 0xa9, 0x4e, 0xcb, 0x11, 0xb3, 0xf7, 0xb4, 0x55, 0x3c, - 0x37, 0x7f, 0xbe, 0x17, 0x3a, 0xfc, 0xc3, 0xd4, 0xb0, 0x1f, 0xa6, 0x5e, 0xc1, 0xe8, 0xdf, 0xd4, 0x33, 0xd2, 0xe9, 0x46, 0xf4, 0x15, 0x43, 0x3b, 0xad, 0x67, 0x37, 0x42, 0xbf, 0x03, 0x58, 0x09, - 0x8d, 0xc7, 0x10, 0xc0, 0x8e, 0x63, 0x57, 0x89, 0xcf, 0x77, 0x0c, 0x0d, 0x57, 0xe5, 0x79, 0xe4, 0xbb, 0x13, 0x78, 0x42, 0xc1, 0x98, 0xe4, 0x7d, 0x49, 0x89, 0xab, 0x21, 0x3e, 0xb4, 0x6b, 0x01, - 0x12, 0x7a, 0xda, 0x2d, 0x87, 0xf5, 0x96, 0x69, 0x90, 0xa4, 0x71, 0x98, 0x5e, 0xb7, 0x55, 0x2f, 0xe2, 0x00, 0x9c, 0x44, 0x8f, 0x58, 0x77, 0xe8, 0x89, 0x95, 0x9b, 0x88, 0x3b, 0xbb, 0x8e, 0xe9, - 0xe7, 0x4c, 0x95, 0xeb, 0xfe, 0x57, 0xf0, 0xb6, 0x6f, 0x05, 0xfd, 0x8d, 0x7c, 0x76, 0xdd, 0x7c, 0x22, 0xf7, 0x28, 0xec, 0xea, 0xf3, 0xff, 0x7f, 0x5c, 0xfe, 0x61, 0x78, 0x7c, 0x8f, 0x0e, 0x9a, - 0x8a, 0xf1, 0x3b, 0x79, 0x70, 0xf6, 0x71, 0x3c, 0xbb, 0x11, 0x9c, 0x18, 0x92, 0xe3, 0x03, 0x3e, 0x8f, 0x55, 0x10, 0x18, 0x1f, 0xf2, 0x92, 0xb9, 0x70, 0x14, 0x8e, 0x8c, 0x28, 0x03, 0x48, 0x10, - 0xdb, 0xe0, 0xaa, 0x04, 0x82, 0x52, 0xb2, 0xee, 0x55, 0x0f, 0x31, 0x16, 0x02, 0x9f, 0x55, 0x43, 0x7f, 0x09, 0xf0, 0xae, 0xb6, 0xd2, 0x08, 0x53, 0x89, 0x34, 0xbe, 0xa4, 0x04, 0x0b, 0xf4, 0x23, - 0x48, 0x79, 0x40, 0x66, 0x6b, 0x7b, 0xe6, 0x24, 0xc1, 0x8b, 0xd5, 0x69, 0x85, 0x6e, 0x9e, 0xcf, 0x89, 0x7c, 0x61, 0x15, 0xe7, 0x91, 0x2b, 0x1d, 0x86, 0x9f, 0x4a, 0x02, 0xbc, 0xd1, 0x7c, 0xe5, - 0x43, 0x67, 0x98, 0xdd, 0xc8, 0xfc, 0xce, 0x86, 0x41, 0xe0, 0x65, 0x45, 0x9d, 0x30, 0x14, 0x44, 0x0e, 0x24, 0x90, 0x32, 0xb0, 0xb4, 0x85, 0x12, 0x7e, 0xc3, 0xa8, 0x46, 0x66, 0xb6, 0x29, 0x48, - 0xc2, 0xf8, 0x25, 0x5e, 0x6d, 0xf8, 0xa4, 0x40, 0x23, 0x76, 0xb3, 0xd3, 0xdc, 0xb8, 0x0a, 0x15, 0x29, 0x3f, 0xf2, 0xf3, 0x1c, 0x0f, 0xd1, 0xac, 0x51, 0x29, 0x4d, 0xde, 0xcc, 0x0d, 0xe7, 0x14, - 0xb4, 0x36, 0x2c, 0x94, 0x7e, 0x8e, 0xe0, 0xe0, 0xd1, 0x7d, 0xce, 0xb5, 0x78, 0x2b, 0xa1, 0xdf, 0xe6, 0xaf, 0x40, 0xfc, 0x0c, 0x0c, 0xfc, 0xd4, 0x76, 0xe9, 0x26, 0x74, 0x7f, 0x46, 0x1e, 0x7e, - 0xba, 0xfd, 0x4d, 0xdd, 0xf9, 0x54, 0x6d, 0x15, 0xff, 0x5e, 0x2a, 0xf5, 0x4f, 0x41, 0xbe, 0x75, 0x6a, 0x7f, 0x29, 0xc1, 0xfa, 0x0f, 0xe6, 0xc5, 0x8f, 0xee, 0x3c, 0x7f, 0xfd, 0xf5, 0x53, 0x76, - 0x53, 0x4f, 0xcd, 0x89, 0xf7, 0x16, 0x3d, 0xaf, 0xfd, 0x79, 0xae, 0x94, 0xa6, 0x4d, 0x06, 0x76, 0x5b, 0x06, 0x1c, 0xb9, 0x2b, 0x63, 0x5e, 0x2b, 0xd9, 0x14, 0x64, 0x88, 0x3d, 0x46, 0x53, 0xac, - 0xbd, 0x5a, 0x13, 0x26, 0xc8, 0xb0, 0x1a, 0x8d, 0xf2, 0x9a, 0xe3, 0x0c, 0x48, 0xb0, 0x83, 0xa0, 0x0e, 0xe3, 0x9d, 0x6e, 0xc7, 0x1e, 0x0f, 0x7c, 0x61, 0xab, 0xb0, 0xce, 0xee, 0xc4, 0x1a, 0x8d, - 0x55, 0x1c, 0x2d, 0xd7, 0x26, 0xc9, 0x37, 0xd6, 0x09, 0x17, 0x99, 0xf9, 0x0a, 0x27, 0x63, 0x58, 0x9f, 0x54, 0x03, 0xf2, 0xfe, 0x64, 0x28, 0xca, 0xc7, 0xa6, 0xdb, 0x33, 0x96, 0xca, 0x0b, 0xc1, - 0x97, 0x79, 0x50, 0x94, 0xde, 0x14, 0xfb, 0xe3, 0xea, 0x5f, 0x27, 0x70, 0x47, 0x4a, 0x57, 0xb6, 0x77, 0xe9, 0x4a, 0x07, 0x64, 0x10, 0xdb, 0x31, 0xbc, 0xf4, 0x2c, 0x9e, 0x0d, 0x9c, 0x40, 0x93, - 0x56, 0xcd, 0x2d, 0xf8, 0xd0, 0x9c, 0x88, 0x1a, 0xae, 0x57, 0x2a, 0xd5, 0x4a, 0xf5, 0x51, 0x25, 0xa1, 0xcb, 0x79, 0x35, 0x1a, 0xe7, 0x8b, 0x11, 0xc0, 0xbe, 0x76, 0xe6, 0xda, 0xbc, 0xd7, 0x90, - 0xed, 0xc9, 0x1d, 0x79, 0xdf, 0xf6, 0xc7, 0xb9, 0xa8, 0x59, 0x51, 0x3f, 0x41, 0x4b, 0xbf, 0xaf, 0xda, 0x3d, 0xd0, 0xb5, 0x23, 0xbb, 0xf2, 0x66, 0x95, 0x9f, 0xbc, 0xe7, 0xd5, 0x3d, 0xf2, 0xba, - 0xfd, 0xf3, 0x55, 0xec, 0x2b, 0x69, 0x70, 0xf6, 0xed, 0xc2, 0xd4, 0x00, 0x70, 0x63, 0x65, 0xb1, 0x40, 0xec, 0x70, 0xd1, 0x85, 0x94, 0x9d, 0x88, 0xf1, 0x49, 0xd9, 0x68, 0x0a, 0xde, 0x69, 0x77, - 0x58, 0x04, 0x6e, 0x5b, 0x59, 0x13, 0xd6, 0xc0, 0x9a, 0x8a, 0x40, 0x9f, 0x3d, 0x16, 0xcd, 0xda, 0x4c, 0xa1, 0x80, 0x0d, 0x55, 0x12, 0xb9, 0x70, 0x8b, 0xb9, 0x18, 0xae, 0x22, 0x04, 0x91, 0xd7, - 0xd6, 0x4a, 0x36, 0xa4, 0x0b, 0xbb, 0x3d, 0xb4, 0x11, 0x53, 0xc1, 0x50, 0x45, 0x09, 0xde, 0x14, 0x5f, 0xfa, 0xcd, 0x94, 0x79, 0xc4, 0x42, 0xff, 0x5c, 0x98, 0x46, 0x76, 0x7d, 0x05, 0xa1, 0x9e, - 0x4d, 0x95, 0xa2, 0x88, 0xd7, 0xc9, 0x90, 0xa1, 0x13, 0xb2, 0x9f, 0x90, 0xea, 0xe9, 0xb0, 0x5e, 0x56, 0x7e, 0x94, 0x38, 0xe3, 0x96, 0x49, 0x16, 0x25, 0x0e, 0x1a, 0xe2, 0xae, 0xc4, 0x1b, 0xad, - 0x3c, 0xac, 0x0c, 0x6c, 0x2d, 0x08, 0x96, 0x08, 0x83, 0xec, 0xc5, 0x59, 0xa8, 0x4d, 0x00, 0xd6, 0x31, 0x83, 0xec, 0x0f, 0x9a, 0x0f, 0xd1, 0xae, 0xcd, 0x65, 0x46, 0x63, 0x9a, 0xe3, 0x81, 0x5f, - 0x39, 0xec, 0x1e, 0x9b, 0x12, 0x91, 0xf3, 0xc8, 0xcc, 0x7b, 0xc0, 0x40, 0xf5, 0xcc, 0x89, 0xc3, 0xf8, 0xb1, 0x47, 0x09, 0x7e, 0xaa, 0x73, 0xdf, 0x27, 0xba, 0xaf, 0xa8, 0xbd, 0x9e, 0x5d, 0xd1, - 0x9b, 0xa0, 0x4b, 0x36, 0xfb, 0x6e, 0x2e, 0x36, 0x6c, 0x45, 0xa7, 0xa7, 0x05, 0xc4, 0x5f, 0x20, 0x5b, 0x89, 0x77, 0xb4, 0x04, 0xc8, 0xa5, 0x81, 0x8d, 0x31, 0x52, 0x81, 0x92, 0xef, 0xe3, 0xc6, - 0x49, 0xe5, 0x1c, 0xfb, 0xdc, 0xa1, 0xb8, 0xba, 0x31, 0xb7, 0xa3, 0xd3, 0x2b, 0xc1, 0x62, 0x6f, 0x59, 0x02, 0x74, 0x52, 0x01, 0xd5, 0x23, 0x50, 0x08, 0xd1, 0xd7, 0x16, 0x52, 0x82, 0xce, 0x7a, - 0xce, 0x17, 0x2a, 0x6a, 0x14, 0x53, 0xfa, 0x42, 0xbe, 0xfc, 0xd6, 0x20, 0xb5, 0x1f, 0xc5, 0x91, 0x3e, 0xb7, 0x9f, 0xf0, 0x46, 0xf4, 0x15, 0x8b, 0x97, 0xc3, 0xc9, 0xbb, 0x09, 0xc3, 0x69, 0xad, - 0x81, 0x0a, 0x2c, 0x26, 0xda, 0xc1, 0x6d, 0xca, 0x32, 0x5c, 0x31, 0x61, 0xb0, 0x97, 0xa1, 0x46, 0x34, 0x5a, 0x4b, 0x4f, 0xa2, 0x70, 0x5b, 0xc1, 0xe4, 0xe9, 0xac, 0xb5, 0xd9, 0x36, 0x25, 0x98, - 0xa0, 0x43, 0xf9, 0xd5, 0x3e, 0xf5, 0x75, 0xf2, 0x6c, 0xe9, 0x63, 0x71, 0xe4, 0x16, 0x1a, 0x23, 0x68, 0xdc, 0x1c, 0x93, 0xe4, 0x62, 0x09, 0x5a, 0x17, 0x1d, 0xe5, 0xbb, 0x74, 0xbb, 0x9b, 0x0a, - 0xc4, 0x87, 0xc9, 0xff, 0xaf, 0x4e, 0xa4, 0x37, 0xba, 0xaf, 0x70, 0xbc, 0x9e, 0x4d, 0x9d, 0x58, 0x29, 0xba, 0x99, 0xb7, 0x0b, 0x62, 0x1b, 0x72, 0x52, 0xaf, 0x71, 0xe2, 0xc9, 0x33, 0x97, 0x7c, - 0x1c, 0x99, 0x49, 0x83, 0x97, 0xea, 0xce, 0xe1, 0x43, 0x8c, 0xa8, 0x9a, 0x34, 0xcb, 0xf7, 0xbb, 0x54, 0x77, 0xc2, 0x8c, 0xa5, 0x36, 0xf2, 0xaa, 0x12, 0xd7, 0x8e, 0x69, 0x2e, 0xd8, 0xbd, 0x93, - 0xef, 0xec, 0xb5, 0x7f, 0xd9, 0x8a, 0x4d, 0xbc, 0x93, 0xa9, 0x28, 0xf3, 0xd5, 0x44, 0x1d, 0x11, 0xcd, 0x03, 0x7e, 0xb8, 0xd0, 0x7e, 0x76, 0x3e, 0xf9, 0xf7, 0xfc, 0x17, 0xdf, 0x68, 0xbf, 0xc2, - 0xf0, 0xe9, 0xca, 0x54, 0x8f, 0xc5, 0x69, 0x91, 0xb8, 0x7b, 0x29, 0xca, 0xd3, 0xa5, 0x01, 0x9f, 0x86, 0x62, 0x79, 0x22, 0xe5, 0xa3, 0xb8, 0xb7, 0x7b, 0x01, 0x5f, 0xcb, 0x0e, 0xb8, 0x19, 0x75, - 0x17, 0xef, 0x69, 0x16, 0x42, 0x22, 0x59, 0x93, 0x21, 0x2f, 0x58, 0xa8, 0x89, 0x23, 0x28, 0x62, 0x17, 0xc2, 0x1e, 0xe1, 0x06, 0xa8, 0xe0, 0xf8, 0x7a, 0xd6, 0xe8, 0xb4, 0xe1, 0x38, 0x06, 0x7a, - 0x1e, 0x2d, 0x44, 0xf3, 0x23, 0x9a, 0x3c, 0x4c, 0x08, 0x76, 0xb8, 0xe7, 0x0e, 0x7a, 0xb0, 0x29, 0xf4, 0xbe, 0xad, 0xf1, 0x2f, 0xc2, 0x77, 0x25, 0xf9, 0x82, 0xda, 0xf5, 0x60, 0x2a, 0x58, 0xca, - 0x62, 0x63, 0x40, 0x8d, 0x7d, 0x50, 0x64, 0xab, 0xe9, 0x56, 0xea, 0x8a, 0xf1, 0xd8, 0x79, 0xe4, 0xd7, 0x59, 0x11, 0x5a, 0x55, 0xd3, 0x1e, 0x3b, 0xe3, 0x50, 0x2f, 0x04, 0x4b, 0x3b, 0x21, 0x7b, - 0x1d, 0xb0, 0xf3, 0xba, 0x3c, 0x5b, 0x48, 0xb7, 0xcd, 0x8b, 0x4d, 0x48, 0xae, 0x78, 0x18, 0xd0, 0x4f, 0x30, 0x21, 0xc1, 0x34, 0xb3, 0x8b, 0x5d, 0x98, 0x6d, 0x17, 0x94, 0x33, 0xa7, 0x5c, 0x24, - 0xc3, 0xa7, 0x94, 0xb6, 0x88, 0x8a, 0xba, 0xf1, 0xbd, 0x59, 0x18, 0xbf, 0xac, 0xec, 0xc1, 0xa3, 0x96, 0xb3, 0xcf, 0x05, 0x6b, 0x7c, 0xa3, 0xfd, 0x02, 0xca, 0xd7, 0x2b, 0x53, 0x83, 0x37, 0x4e, - 0xc3, 0xbc, 0xe5, 0xe5, 0x43, 0xb2, 0x3e, 0x5b, 0x2d, 0xe7, 0xa8, 0xc2, 0xb8, 0xa1, 0x0c, 0x1a, 0x95, 0x46, 0x25, 0xea, 0x57, 0x2c, 0x09, 0x17, 0x8b, 0xc3, 0x7e, 0x18, 0x8d, 0x02, 0x10, 0x77, - 0xd6, 0x0a, 0x28, 0x73, 0x65, 0xb7, 0xbb, 0xb4, 0xae, 0x77, 0xaa, 0x64, 0xab, 0x3b, 0x6d, 0xd4, 0xbc, 0x0a, 0x70, 0x5d, 0xad, 0x95, 0x2d, 0xb0, 0x5a, 0x43, 0x34, 0xd7, 0x23, 0xb4, 0xab, 0x32, - 0x9b, 0x27, 0xfb, 0x85, 0xa6, 0x55, 0xfb, 0xad, 0x23, 0xc3, 0x03, 0x4f, 0x48, 0xec, 0xfb, 0x3e, 0x89, 0x63, 0x0f, 0x99, 0xeb, 0x99, 0xde, 0x38, 0xaf, 0x34, 0x5f, 0xd4, 0xe8, 0xdb, 0xd1, 0xd4, - 0x5e, 0x38, 0x9e, 0x3b, 0x9c, 0x23, 0xae, 0x3b, 0xc2, 0x73, 0x8c, 0x48, 0x8f, 0x96, 0x6b, 0x9c, 0xe7, 0xa5, 0x08, 0x2c, 0x9a, 0xad, 0xaa, 0x18, 0xde, 0x6a, 0x2b, 0x11, 0x20, 0x17, 0xe0, 0x49, - 0x8d, 0x8c, 0x45, 0xab, 0xd7, 0xe7, 0x25, 0xb9, 0x22, 0xea, 0xc5, 0x25, 0x6e, 0x56, 0x73, 0x80, 0x14, 0x4d, 0x11, 0xa1, 0x45, 0xef, 0x28, 0x6f, 0x04, 0xaf, 0xa5, 0xc7, 0x0d, 0x56, 0x2f, 0xf2, - 0xc2, 0x50, 0xf2, 0xb3, 0xfd, 0x43, 0x2c, 0xfd, 0xb1, 0xbb, 0x27, 0xf6, 0x54, 0x1e, 0xc7, 0x77, 0xbb, 0x01, 0xfb, 0x3d, 0x67, 0xe3, 0xe5, 0x7b, 0xdd, 0x61, 0xc1, 0x89, 0xd5, 0xd9, 0x05, 0x4d, - 0xcf, 0x3d, 0x2c, 0xf2, 0x78, 0x1d, 0x8d, 0x2b, 0x0c, 0x01, 0x98, 0x71, 0x0f, 0x84, 0x52, 0x9f, 0xe9, 0xa3, 0xbc, 0x5f, 0xb8, 0xea, 0x5c, 0x31, 0xfb, 0x61, 0xdf, 0xb2, 0x2c, 0x3b, 0x80, 0x62, - 0xd2, 0x5e, 0x0e, 0x1b, 0x0b, 0x5c, 0x08, 0xbc, 0x40, 0x6c, 0x8b, 0x33, 0x2c, 0xc5, 0xe3, 0x56, 0x66, 0x0f, 0x83, 0xe6, 0x76, 0x94, 0x8c, 0xc9, 0xd6, 0x6a, 0x3b, 0x65, 0x3a, 0xbd, 0xfe, 0x4c, - 0x67, 0x98, 0x79, 0x7e, 0x60, 0xb7, 0xe9, 0xbf, 0x9b, 0x41, 0xfe, 0x83, 0xfa, 0x07, 0x30, 0x1f, 0xd7, 0xa6, 0x18, 0x11, 0xf0, 0x6c, 0xbf, 0x2d, 0x1b, 0xb7, 0x73, 0x96, 0x05, 0x41, 0x31, 0x67, - 0x1b, 0x16, 0xf1, 0xc2, 0xab, 0x30, 0x2c, 0xf6, 0xc5, 0xfe, 0x34, 0xe1, 0x2b, 0xbf, 0x76, 0xfb, 0xb8, 0xf7, 0x81, 0xcf, 0x15, 0x81, 0xf9, 0x4c, 0xf8, 0xe5, 0xdb, 0x3e, 0x9d, 0x4e, 0x2d, 0x08, - 0xd3, 0xf9, 0xa6, 0x19, 0x29, 0x36, 0xc0, 0xc1, 0x0a, 0x2b, 0x8e, 0x79, 0x17, 0xe9, 0xc2, 0xc5, 0xa1, 0x02, 0xfb, 0x92, 0x56, 0xbd, 0x9e, 0x5f, 0x6a, 0x9f, 0x63, 0x1c, 0xa6, 0xc4, 0x70, 0x92, - 0x87, 0xfa, 0x8d, 0x14, 0x17, 0x88, 0x23, 0xef, 0xc5, 0x3c, 0x31, 0xb9, 0x68, 0x9b, 0x00, 0x66, 0xcc, 0x9c, 0x09, 0xf8, 0x52, 0x6d, 0x97, 0x91, 0x72, 0xa2, 0xe3, 0xa3, 0x71, 0xc2, 0x17, 0x63, - 0xa8, 0x6c, 0x9f, 0x73, 0xf4, 0xbd, 0x7a, 0x28, 0xb3, 0xc2, 0x6b, 0xd3, 0x07, 0xa1, 0xda, 0xaf, 0xb8, 0x5c, 0x73, 0xd3, 0xfe, 0xf3, 0xbf, 0xff, 0x1c, 0xeb, 0xf5, 0xb5, 0x83, 0xca, 0x3d, 0xd0, - 0xbf, 0xf6, 0x54, 0x99, 0x0e, 0xfa, 0x3b, 0xdd, 0x2b, 0xe6, 0xef, 0x67, 0xd7, 0x2e, 0xba, 0xbf, 0x84, 0x7b, 0xc1, 0xb3, 0x53, 0x14, 0xe3, 0x75, 0x75, 0x2a, 0x8a, 0x24, 0xbe, 0xec, 0x5c, 0x8d, - 0xb4, 0x11, 0xf8, 0xe8, 0x0c, 0x5b, 0x5d, 0x07, 0x8a, 0x09, 0x9c, 0x94, 0x7b, 0x2f, 0x10, 0xfd, 0x31, 0x3d, 0xea, 0x39, 0xb5, 0xf6, 0x0b, 0xe5, 0x97, 0xef, 0xfa, 0x7c, 0x3e, 0x59, 0xc1, 0xf5, - 0x38, 0xce, 0x6a, 0x31, 0x06, 0x91, 0x87, 0x95, 0x48, 0x6e, 0x2a, 0x10, 0x19, 0x97, 0x40, 0x8f, 0x27, 0x99, 0xd3, 0x9e, 0x60, 0xce, 0x60, 0x73, 0xbe, 0x57, 0x79, 0xa5, 0x63, 0xc7, 0xba, 0x64, - 0xd7, 0xa7, 0x39, 0xef, 0xa8, 0x36, 0xb5, 0xbc, 0xe8, 0x70, 0x1a, 0x46, 0xa6, 0x6b, 0x2f, 0xd7, 0xf3, 0x5c, 0x3d, 0xc4, 0x4e, 0xc2, 0x1d, 0xd3, 0x33, 0x49, 0xd2, 0x47, 0x18, 0x1c, 0xf0, 0xcb, - 0xa3, 0x40, 0xb6, 0x6f, 0xb8, 0xbc, 0xfb, 0xf9, 0x1f, 0x89, 0x8f, 0x27, 0x84, 0xe9, 0x2b, 0xd1, 0x2b, 0x1a, 0xb7, 0xc3, 0xab, 0xb0, 0xf8, 0x35, 0x09, 0x6e, 0xef, 0xc0, 0xc9, 0xd6, 0x0b, 0x94, - 0x8d, 0xd2, 0xaf, 0xbb, 0x35, 0x2f, 0xf2, 0xc2, 0x81, 0x08, 0x0f, 0x07, 0xd8, 0x09, 0xee, 0x0b, 0x8b, 0x5f, 0xe6, 0xc5, 0xe3, 0xed, 0x86, 0x5f, 0xdb, 0xb8, 0x7f, 0xda, 0xe1, 0xb8, 0xef, 0x4e, - 0x78, 0x26, 0xda, 0xf1, 0x8d, 0xe8, 0x15, 0x97, 0xdb, 0xe1, 0x35, 0x39, 0x70, 0x42, 0xa4, 0xe3, 0x09, 0xec, 0x96, 0xf6, 0x11, 0x03, 0xcd, 0xd4, 0x46, 0x0f, 0xe3, 0xb0, 0x9d, 0x77, 0x9a, 0x22, - 0x1f, 0x4d, 0x7f, 0x25, 0x74, 0x67, 0x59, 0x6c, 0xf2, 0x33, 0xeb, 0xb5, 0xa3, 0x26, 0x94, 0x63, 0xa9, 0x58, 0x23, 0x53, 0x9f, 0xc4, 0x6d, 0x64, 0x21, 0x22, 0xc0, 0xe7, 0x6c, 0xbc, 0xdf, 0xd2, - 0xe3, 0x72, 0x5f, 0xac, 0x16, 0xfe, 0xb6, 0x3c, 0x8a, 0x17, 0x1b, 0xf3, 0x4c, 0xdf, 0x5a, 0x29, 0x67, 0xbf, 0xff, 0x51, 0x6b, 0x22, 0xfe, 0xd6, 0x3e, 0xf4, 0xdf, 0x33, 0x78, 0xbe, 0x50, 0xbe, - 0x7e, 0xff, 0xa7, 0xf3, 0xa9, 0x46, 0x8f, 0x0c, 0x71, 0x2c, 0xbc, 0x9e, 0x83, 0xf5, 0x6e, 0xb0, 0x52, 0xd2, 0x5d, 0x15, 0x24, 0x95, 0xe3, 0x9e, 0x4a, 0xfa, 0xfa, 0xbe, 0xef, 0x4b, 0x73, 0x17, - 0x1f, 0xd5, 0x48, 0x1b, 0xa5, 0x8b, 0x65, 0x30, 0x5b, 0xbd, 0x65, 0xa9, 0x2e, 0xcd, 0xd5, 0xc5, 0xb0, 0xb9, 0x78, 0x95, 0xa1, 0x15, 0xa7, 0x9a, 0x38, 0xee, 0x36, 0x46, 0xbe, 0x08, 0x9c, 0xd1, - 0x36, 0x3c, 0xfc, 0xb0, 0x49, 0xa2, 0x30, 0x04, 0x9e, 0xec, 0xb4, 0x77, 0xdf, 0x43, 0xf5, 0x85, 0xc7, 0x1e, 0xee, 0x23, 0xd7, 0xb1, 0xe7, 0xcf, 0xdc, 0xc8, 0xce, 0x73, 0xff, 0xa3, 0xc7, 0xde, - 0x83, 0x88, 0xfd, 0xb8, 0xb4, 0x3d, 0xaf, 0xfa, 0x3b, 0x79, 0x6c, 0x7e, 0xd2, 0xcf, 0xac, 0xef, 0x6f, 0x54, 0x5f, 0x46, 0xe2, 0xed, 0x78, 0x76, 0xa5, 0xf5, 0xfb, 0x28, 0x40, 0xe2, 0x0a, 0x24, - 0x20, 0xf2, 0x52, 0x5c, 0xf6, 0x5a, 0x21, 0x90, 0xcb, 0x44, 0x82, 0x17, 0xc1, 0xde, 0xd9, 0x14, 0x3a, 0x04, 0x38, 0x8d, 0x16, 0xbb, 0x49, 0xad, 0xec, 0x0f, 0x4a, 0x1a, 0x81, 0x91, 0x35, 0x9c, - 0x24, 0x4a, 0x2c, 0xb3, 0x6d, 0x40, 0xb6, 0x66, 0xbf, 0x3b, 0xa0, 0x2a, 0x60, 0x9f, 0x2c, 0x42, 0x05, 0x7b, 0x98, 0xb2, 0xd2, 0xe3, 0x5e, 0x60, 0xcd, 0x63, 0x6c, 0xea, 0x3b, 0x19, 0xfd, 0x91, - 0x5a, 0x16, 0x57, 0x95, 0x1f, 0xb6, 0xa9, 0x5d, 0xcd, 0xca, 0xb4, 0xad, 0x1e, 0xef, 0x4f, 0x3d, 0xb9, 0xfe, 0x7f, 0xa7, 0xfe, 0x02, 0xc4, 0xf7, 0x6b, 0x53, 0x35, 0x81, 0xad, 0xc1, 0x6e, 0x44, - 0x5d, 0xb3, 0xf3, 0x70, 0x8b, 0xf2, 0x81, 0xba, 0x5b, 0xa8, 0x72, 0x94, 0x1d, 0x14, 0x45, 0x54, 0xb9, 0xba, 0x0a, 0x57, 0x14, 0xba, 0xa6, 0x96, 0x7b, 0x34, 0x39, 0x0e, 0x80, 0xdc, 0x9b, 0xe7, - 0x58, 0x45, 0x40, 0xbb, 0x38, 0xe4, 0x9e, 0xa9, 0xe0, 0x18, 0x4c, 0x24, 0x1b, 0x1e, 0x6d, 0xed, 0x65, 0xb8, 0x11, 0xc8, 0xdc, 0xcd, 0x7c, 0xf4, 0x48, 0x0f, 0x10, 0x1d, 0x5a, 0xe8, 0x24, 0xe1, - 0x5d, 0xcf, 0xec, 0x2a, 0x6c, 0xbf, 0x77, 0x0a, 0xfa, 0x3e, 0x5b, 0x9f, 0x10, 0x54, 0x9f, 0x08, 0xdf, 0xda, 0xbd, 0xbe, 0x9f, 0x5e, 0xe7, 0xea, 0x04, 0x81, 0x75, 0xd9, 0x45, 0x90, 0x9a, 0x35, - 0x94, 0xc4, 0x13, 0x78, 0x2d, 0x8d, 0xdd, 0xa0, 0x67, 0x87, 0x70, 0x05, 0x37, 0x23, 0x9a, 0x89, 0x67, 0x12, 0x4b, 0x97, 0x0c, 0x94, 0x6d, 0xa8, 0x8d, 0x69, 0xb9, 0xc5, 0x6a, 0x14, 0xe5, 0x91, - 0x8b, 0x08, 0x21, 0xab, 0xcc, 0x0c, 0xf5, 0x60, 0xea, 0x44, 0x40, 0xb9, 0xe0, 0x57, 0x73, 0x8a, 0xa1, 0xc5, 0x8c, 0x3a, 0x99, 0x2d, 0x45, 0x8e, 0xc1, 0x7e, 0x91, 0x6f, 0x7e, 0x5a, 0x02, 0x5f, - 0x1a, 0x66, 0xdf, 0x57, 0x55, 0x9e, 0x32, 0x80, 0x3e, 0xe8, 0xbe, 0x7d, 0xff, 0xed, 0xec, 0x1a, 0xdc, 0x37, 0x61, 0x92, 0x8c, 0x23, 0x44, 0xec, 0xa9, 0x06, 0x2a, 0xc6, 0x82, 0x3b, 0x6e, 0x97, - 0x40, 0xeb, 0xf8, 0x08, 0x31, 0xfa, 0x73, 0x4d, 0x3a, 0xba, 0xe2, 0x6a, 0xb7, 0xb6, 0xd6, 0x31, 0x15, 0xb1, 0xd5, 0x02, 0x8b, 0xbd, 0xf9, 0x26, 0xab, 0xb1, 0xf9, 0x92, 0x56, 0x1a, 0x91, 0x3c, - 0xb3, 0x29, 0xec, 0x14, 0x31, 0x2e, 0x73, 0xe3, 0xa2, 0x4c, 0xea, 0xde, 0xc1, 0xd7, 0xbb, 0x4c, 0x98, 0x3b, 0xdb, 0x32, 0xb1, 0xcd, 0x71, 0x22, 0x4f, 0xdc, 0xbc, 0x8c, 0xff, 0x36, 0x43, 0xdc, - 0xa8, 0xde, 0xd0, 0xb8, 0x1d, 0x4f, 0x65, 0x85, 0x91, 0xa5, 0xe7, 0x55, 0xbb, 0xb5, 0xb3, 0x64, 0xc8, 0x28, 0x38, 0x46, 0xd6, 0x16, 0xaa, 0x6f, 0x73, 0x1c, 0xdb, 0x89, 0xcb, 0x5a, 0x19, 0xeb, - 0xb5, 0x5f, 0x10, 0x97, 0x4e, 0x42, 0x85, 0xf5, 0x1a, 0x9b, 0x33, 0xb5, 0x22, 0xb1, 0x44, 0xac, 0xb6, 0x4d, 0x89, 0x68, 0x05, 0x49, 0xca, 0xc1, 0x5c, 0x6a, 0x8b, 0x4b, 0x5d, 0xd6, 0xab, 0x68, - 0xb4, 0x77, 0x85, 0x0c, 0x8f, 0xc3, 0x9c, 0x8f, 0x16, 0xf2, 0x73, 0x5b, 0x69, 0x5f, 0x5d, 0xbd, 0x7f, 0x4c, 0xfd, 0xbe, 0x7e, 0x66, 0x6e, 0x57, 0xc3, 0xec, 0x0f, 0xb1, 0x93, 0xcf, 0x6d, 0x2b, - 0x7c, 0x25, 0xfd, 0x06, 0xe9, 0xfb, 0x85, 0xa9, 0xdb, 0x0a, 0xd6, 0x96, 0x57, 0x4d, 0xbf, 0x26, 0x4a, 0x6e, 0xf0, 0x86, 0x76, 0x19, 0x7b, 0xb5, 0x4f, 0xca, 0xb5, 0x70, 0x69, 0x9c, 0x15, 0x79, - 0x30, 0x7c, 0x9d, 0x2f, 0xc6, 0x50, 0x05, 0x43, 0xb2, 0xf2, 0xa0, 0x8b, 0x1e, 0x67, 0xa6, 0x94, 0x76, 0x96, 0xca, 0x83, 0x22, 0xb2, 0x0d, 0x2d, 0x2d, 0x39, 0x0c, 0x24, 0x82, 0xaf, 0x02, 0x3f, - 0xdd, 0xf8, 0x86, 0xcb, 0x6f, 0x69, 0x32, 0xcb, 0x1a, 0x75, 0x79, 0x7c, 0xce, 0x02, 0x79, 0xfd, 0xf5, 0xfe, 0xa5, 0xf1, 0xf3, 0x17, 0x6c, 0x6e, 0xe8, 0xfe, 0x21, 0x67, 0xe7, 0xe5, 0x8b, 0x8b, - 0x22, 0xf5, 0xed, 0xfc, 0xa3, 0x17, 0xed, 0x7d, 0x76, 0x7d, 0x26, 0x8a, 0xe3, 0x07, 0xf5, 0x57, 0x8c, 0xbf, 0x5c, 0xbb, 0x35, 0x9f, 0xf9, 0x1d, 0xe6, 0x90, 0x33, 0x6d, 0x51, 0x58, 0x67, 0x79, - 0x82, 0xd9, 0x87, 0xcb, 0x90, 0x10, 0xa6, 0x30, 0x1c, 0x8d, 0xd2, 0x53, 0xec, 0xbe, 0x31, 0x36, 0x82, 0x8e, 0xbb, 0x0e, 0xe0, 0x8f, 0xcd, 0x6e, 0xe9, 0x8e, 0x01, 0xe1, 0x26, 0xad, 0xe6, 0xf5, - 0x9d, 0x8f, 0x5b, 0x2b, 0x3e, 0x08, 0x8f, 0x67, 0x01, 0xf3, 0x71, 0x92, 0xc9, 0x61, 0x0e, 0x66, 0xc4, 0x80, 0x9a, 0x5b, 0xe8, 0xc9, 0xac, 0x14, 0xf5, 0x6c, 0x3e, 0xa7, 0x75, 0xfc, 0x12, 0x11, - 0xf5, 0x6b, 0xa3, 0xea, 0x1f, 0x63, 0xf0, 0x29, 0xc3, 0xe0, 0x91, 0xf7, 0xe8, 0x29, 0x61, 0xf1, 0x46, 0xf7, 0x86, 0xfb, 0xdb, 0xd9, 0xd5, 0x8b, 0x34, 0x41, 0x60, 0xe4, 0x75, 0xdb, 0x37, 0x17, - 0x2b, 0xd8, 0x1e, 0x09, 0x52, 0xae, 0x86, 0x94, 0xde, 0xcc, 0x15, 0xa0, 0x2d, 0xf3, 0x39, 0x64, 0x41, 0x6c, 0x58, 0xf6, 0x79, 0x53, 0xee, 0x29, 0x3a, 0x83, 0x05, 0x50, 0xdb, 0x2c, 0xa0, 0x51, - 0x0a, 0xc6, 0x60, 0xb3, 0x35, 0x40, 0xfa, 0x60, 0x83, 0xc4, 0xd6, 0xaa, 0x13, 0xc8, 0x76, 0x4b, 0x3e, 0x61, 0x64, 0x48, 0x5c, 0xc0, 0x17, 0x8d, 0xb0, 0xbc, 0x4d, 0x4a, 0xe3, 0x3f, 0x22, 0xa3, - 0x5f, 0x7e, 0x58, 0x51, 0xf9, 0x1f, 0x66, 0xf3, 0x83, 0x09, 0xfe, 0xe4, 0x0c, 0xff, 0x44, 0xfb, 0x15, 0x85, 0x8f, 0x0b, 0x33, 0x64, 0x62, 0xb2, 0xae, 0xaa, 0x26, 0x97, 0xb4, 0xdb, 0x70, 0x27, - 0x0e, 0x36, 0xd7, 0x3d, 0xe7, 0x54, 0x05, 0x2b, 0x6c, 0x1d, 0xc0, 0x6d, 0x4f, 0x6d, 0x75, 0xe2, 0x0e, 0xd2, 0x20, 0x5c, 0x48, 0x0e, 0x2d, 0x24, 0x16, 0xbf, 0xd0, 0x95, 0x83, 0x17, 0xa1, 0x7b, - 0xaa, 0xb7, 0x73, 0xbc, 0x17, 0xe6, 0xb6, 0xe7, 0x1e, 0x8b, 0x82, 0x20, 0x43, 0xa3, 0x02, 0x01, 0x74, 0xb9, 0x18, 0xf6, 0x11, 0x0a, 0xa3, 0xd8, 0x18, 0x13, 0xd5, 0x73, 0x53, 0xfc, 0xab, 0x3a, - 0xfb, 0x88, 0xa1, 0xbe, 0x76, 0x97, 0x7e, 0xb4, 0x00, 0x3d, 0x35, 0xa3, 0x3f, 0x91, 0xbe, 0x01, 0xfa, 0xe9, 0xc2, 0xd4, 0x1d, 0x35, 0x7d, 0x9f, 0x72, 0x1a, 0x8e, 0x60, 0x7d, 0xa1, 0x40, 0x94, - 0x5d, 0x58, 0x8b, 0x31, 0x42, 0x41, 0x8b, 0x70, 0x23, 0xda, 0x04, 0xf9, 0xc3, 0x91, 0x17, 0x14, 0x90, 0xb1, 0x55, 0x09, 0xda, 0x9f, 0xc4, 0x33, 0xd6, 0x20, 0xeb, 0x1e, 0x51, 0x11, 0x14, 0xa5, - 0x9b, 0xfd, 0x31, 0xeb, 0x5b, 0xa3, 0x30, 0xc9, 0xcd, 0x26, 0x65, 0xe7, 0x8e, 0xbc, 0x4a, 0x2f, 0x48, 0x36, 0xec, 0xc0, 0x0d, 0x3e, 0x9e, 0xa0, 0x89, 0xcb, 0xb2, 0x7f, 0x69, 0xfe, 0x10, 0x85, - 0xf8, 0x5c, 0x5a, 0xc8, 0x07, 0xd9, 0x1b, 0x24, 0xaf, 0x27, 0x53, 0xd2, 0x42, 0xe0, 0xd9, 0x79, 0xd5, 0xcf, 0x75, 0xd8, 0x57, 0xa9, 0x39, 0xa9, 0x05, 0x82, 0x1d, 0xb5, 0xfe, 0xf9, 0xe8, 0x52, - 0xe1, 0x08, 0x6c, 0x57, 0x93, 0x3e, 0x28, 0x68, 0xd3, 0xf4, 0xda, 0x0d, 0x6e, 0x76, 0x2d, 0xac, 0x52, 0x16, 0x8f, 0xb5, 0x0e, 0xf4, 0x39, 0xd7, 0xca, 0xfd, 0x77, 0xdc, 0x3e, 0xf5, 0xde, 0x9d, - 0x6b, 0xde, 0xe0, 0x84, 0x69, 0x35, 0x0e, 0x59, 0x86, 0x03, 0x2d, 0x50, 0xcf, 0xeb, 0xfd, 0x61, 0xe0, 0xe8, 0xb3, 0x64, 0xfb, 0x89, 0x81, 0x72, 0x8b, 0x2e, 0x9a, 0x8b, 0x6e, 0x2a, 0x7a, 0xf1, - 0x68, 0xda, 0x6b, 0xbd, 0x15, 0x18, 0x0a, 0x55, 0x37, 0x89, 0x43, 0xe6, 0xfb, 0x76, 0x99, 0x7b, 0xde, 0x5c, 0x58, 0x76, 0x50, 0x74, 0x02, 0x44, 0x93, 0x64, 0xb7, 0x4c, 0x5a, 0x1f, 0x7c, 0x11, - 0xd3, 0xfd, 0x90, 0xe0, 0x0d, 0xe2, 0xa8, 0x4c, 0x64, 0x83, 0xd0, 0xcf, 0xfd, 0xca, 0x6e, 0x8a, 0x6a, 0xf6, 0xb6, 0x49, 0xfd, 0x27, 0xd7, 0xed, 0x53, 0xa0, 0xfd, 0x7c, 0xc5, 0x0d, 0xb2, 0x9f, - 0xd7, 0x6f, 0x3e, 0xdc, 0x09, 0x88, 0x25, 0x35, 0x9f, 0x0c, 0x74, 0x8a, 0x0e, 0xf1, 0x91, 0x57, 0x80, 0x5d, 0x7d, 0xf4, 0x32, 0xb6, 0xe7, 0x77, 0xae, 0x7c, 0xb1, 0x8f, 0x87, 0x4d, 0x5d, 0x8a, - 0x5e, 0x99, 0x2e, 0x74, 0x63, 0x45, 0x77, 0x67, 0x38, 0xb6, 0xc2, 0x95, 0x7f, 0xf2, 0xe7, 0xd0, 0x06, 0x26, 0xc8, 0xb3, 0xdf, 0x52, 0x84, 0x3b, 0x2a, 0xf6, 0xc5, 0xf7, 0xd0, 0x33, 0xa8, 0x8f, - 0x6d, 0x0f, 0xd5, 0xfd, 0x06, 0x8a, 0xab, 0x0d, 0x35, 0x21, 0x12, 0xe4, 0x9f, 0x2f, 0x69, 0x7f, 0x98, 0x63, 0xcf, 0xf5, 0x5c, 0x79, 0xa5, 0xf9, 0x0a, 0xe1, 0xcb, 0xec, 0x9a, 0xd8, 0x73, 0x05, - 0x5f, 0x42, 0x8d, 0xd8, 0xb0, 0xda, 0x62, 0x95, 0xc9, 0x67, 0x2e, 0xdf, 0xb0, 0x48, 0xb4, 0x24, 0xd8, 0x12, 0x39, 0xbb, 0x22, 0xbf, 0xf0, 0xda, 0x02, 0x6b, 0xac, 0x96, 0xde, 0x6a, 0xa0, 0x40, - 0x48, 0x4a, 0x07, 0x86, 0x51, 0x34, 0xa0, 0x50, 0x81, 0xe3, 0x6d, 0x60, 0x07, 0x97, 0x35, 0xb8, 0xf1, 0x04, 0x92, 0xde, 0x6c, 0x6a, 0x44, 0x0c, 0xaa, 0x9c, 0xc2, 0xb5, 0x8d, 0x38, 0x30, 0x24, - 0xab, 0x3f, 0xa7, 0xf7, 0x7e, 0x11, 0x3f, 0x6f, 0xd5, 0xe9, 0x1e, 0x21, 0x98, 0xfb, 0xa1, 0xdd, 0xc4, 0x9d, 0x3f, 0x1b, 0xfd, 0xea, 0xd1, 0x46, 0x1d, 0xf2, 0xac, 0x14, 0xff, 0x42, 0xfc, 0x86, - 0xe9, 0x97, 0x4b, 0x57, 0x87, 0xd8, 0x04, 0x49, 0xee, 0x9d, 0xd7, 0x9d, 0x5d, 0x6d, 0xec, 0xfe, 0x58, 0x2f, 0x1c, 0x89, 0xf3, 0xd7, 0x07, 0x72, 0x64, 0x46, 0x6a, 0xd5, 0xac, 0x69, 0xd7, 0x43, - 0x28, 0xb3, 0x0d, 0xda, 0x76, 0x31, 0x46, 0xd0, 0x92, 0x2a, 0x25, 0x21, 0x59, 0x6f, 0x73, 0x13, 0xa2, 0xb8, 0x8e, 0xac, 0xcd, 0x23, 0xd2, 0x2e, 0x70, 0xbd, 0x54, 0xe4, 0x3e, 0xf6, 0x19, 0x5f, - 0xe6, 0x2f, 0xbc, 0xc9, 0x1c, 0x0e, 0x41, 0x4b, 0x5a, 0x96, 0x3e, 0x25, 0xa6, 0xe6, 0xe5, 0x07, 0xb7, 0x99, 0xf3, 0xb0, 0x49, 0x25, 0xf9, 0xac, 0xa8, 0xbb, 0x51, 0x7d, 0x85, 0xe4, 0x7a, 0x7c, - 0x2d, 0xa0, 0x30, 0x61, 0x72, 0x62, 0xf0, 0x3c, 0x0e, 0x4e, 0x21, 0xe1, 0x53, 0xda, 0x90, 0xee, 0x4b, 0xaf, 0xd1, 0x4a, 0x7f, 0x63, 0x6c, 0xcf, 0xdd, 0x9e, 0xe5, 0x8d, 0x51, 0x6b, 0x1a, 0xa1, - 0xe3, 0x55, 0x8e, 0xc4, 0x60, 0xa0, 0xcc, 0x2d, 0x8a, 0x91, 0x3a, 0x08, 0x82, 0xb0, 0xad, 0xba, 0xc1, 0x50, 0x45, 0xdc, 0x71, 0xa9, 0x48, 0xbb, 0xcb, 0x4e, 0x2a, 0x09, 0xc9, 0x3a, 0x58, 0x3a, - 0x9b, 0x3a, 0xcb, 0xa3, 0x79, 0xb9, 0xe4, 0x13, 0xc5, 0xd9, 0xeb, 0x2f, 0xfd, 0x75, 0xc9, 0x27, 0x9f, 0x87, 0xe4, 0xcb, 0xa2, 0xff, 0xe5, 0xd2, 0x55, 0x7c, 0x91, 0xbf, 0x03, 0x74, 0x82, 0x75, - 0x68, 0xa5, 0x8e, 0x9b, 0x6d, 0x41, 0x5a, 0xa9, 0xb9, 0x0a, 0x46, 0xb5, 0x45, 0x50, 0x39, 0x22, 0xb6, 0xf1, 0x6a, 0x61, 0xd7, 0x61, 0xe9, 0xd0, 0x47, 0x92, 0xf0, 0xcf, 0xc1, 0xc2, 0x62, 0xce, - 0xbd, 0x80, 0x61, 0xfa, 0x0a, 0x13, 0x35, 0xb6, 0x63, 0xcd, 0x95, 0x05, 0x7b, 0xfb, 0x0d, 0x6d, 0x8d, 0xf3, 0x48, 0x63, 0xe9, 0x7d, 0x24, 0x04, 0x9b, 0x93, 0x8a, 0x95, 0xde, 0x01, 0x3f, 0x55, - 0xcf, 0xc5, 0x14, 0xff, 0x73, 0x81, 0x56, 0xa6, 0x76, 0x7c, 0xb5, 0x59, 0xfe, 0x60, 0x22, 0x3d, 0xc5, 0x70, 0xef, 0x84, 0x6f, 0xc8, 0xbe, 0x9f, 0x4e, 0xed, 0x03, 0x30, 0x74, 0x27, 0x75, 0xb8, - 0x64, 0x0b, 0x91, 0x97, 0x15, 0xac, 0x94, 0x8e, 0xf3, 0x6c, 0xbd, 0xc4, 0x19, 0x5e, 0x91, 0xd2, 0xe3, 0x7a, 0x8f, 0x6f, 0x6c, 0x59, 0x3a, 0x16, 0x38, 0xe8, 0x6e, 0x3c, 0xcd, 0xf2, 0x0e, 0x5d, - 0x6d, 0xc1, 0x71, 0xb1, 0xe6, 0x8b, 0x7c, 0xb3, 0x64, 0x8a, 0x5a, 0x4c, 0xb7, 0x07, 0x9e, 0x4a, 0x7b, 0x7d, 0x00, 0x9d, 0xf5, 0xb8, 0x4d, 0xdc, 0x9e, 0xb2, 0x47, 0x12, 0x05, 0x16, 0x13, 0xd9, - 0xee, 0x5a, 0x19, 0xe2, 0x0f, 0xec, 0xf6, 0xcf, 0xab, 0x00, 0xbf, 0x11, 0xbd, 0x81, 0x71, 0xab, 0x02, 0x72, 0xa5, 0xf4, 0x3b, 0x10, 0x5d, 0x2a, 0x1e, 0x60, 0x72, 0x2f, 0x9d, 0x31, 0xac, 0xe8, - 0x3b, 0x9c, 0x51, 0x54, 0x74, 0x7e, 0x86, 0x1c, 0x65, 0xc7, 0x3b, 0x14, 0x70, 0x5a, 0xa0, 0xba, 0x68, 0x21, 0x41, 0x6c, 0x49, 0xf2, 0xa1, 0x19, 0x1b, 0x93, 0xc7, 0x63, 0x68, 0x3e, 0xce, 0xad, - 0xcb, 0x82, 0xeb, 0x65, 0x9c, 0x3a, 0x33, 0xf2, 0xa1, 0xb9, 0x78, 0xac, 0x6a, 0xc8, 0xa0, 0x81, 0x2b, 0x71, 0x0e, 0xf7, 0xc9, 0xfc, 0xbc, 0x30, 0x9f, 0x66, 0xaf, 0xff, 0xfc, 0xae, 0xa5, 0xd7, - 0x91, 0x5d, 0xf9, 0xde, 0xcd, 0xa9, 0x35, 0x73, 0xda, 0x20, 0x78, 0x28, 0xcd, 0x9e, 0xd6, 0xd6, 0xef, 0xbc, 0xe2, 0x86, 0xec, 0x9d, 0x1b, 0x53, 0xb5, 0xf7, 0xfa, 0x2c, 0x21, 0x3a, 0xd7, 0xc2, - 0x20, 0x34, 0x10, 0x6d, 0x77, 0x1c, 0xf6, 0xcd, 0x5c, 0x1e, 0x87, 0x88, 0x49, 0xe6, 0xfb, 0x54, 0x70, 0xfd, 0x45, 0xb1, 0x15, 0xd7, 0x07, 0xea, 0x40, 0xf3, 0x3a, 0xed, 0x76, 0xb1, 0x0b, 0x2a, - 0x5e, 0x6d, 0x41, 0x27, 0x5e, 0xa7, 0x51, 0x81, 0x1f, 0xd0, 0x95, 0xce, 0x2f, 0xac, 0x55, 0x2c, 0x80, 0x68, 0x0f, 0x30, 0x02, 0xa8, 0x2b, 0xce, 0x4e, 0x90, 0xbc, 0xe8, 0xdf, 0xb3, 0xc4, 0x1f, - 0xa2, 0xfd, 0xe7, 0x9a, 0x8c, 0x4f, 0xca, 0xc6, 0x8f, 0x0d, 0xc7, 0xb7, 0xe3, 0xa9, 0xd2, 0xb0, 0xe1, 0x11, 0xfd, 0x38, 0xc6, 0x5d, 0xe2, 0x13, 0x45, 0xb0, 0x3b, 0x90, 0x29, 0x82, 0xba, 0x09, - 0x27, 0x6f, 0x6d, 0x88, 0x0e, 0x1d, 0xf2, 0x92, 0x32, 0xe7, 0x25, 0x91, 0x2c, 0x71, 0x3f, 0x21, 0xda, 0x9d, 0x81, 0x22, 0x5a, 0x7a, 0xd8, 0xa1, 0x92, 0xb8, 0x8b, 0xc3, 0xc6, 0x5e, 0xfa, 0x82, - 0xd4, 0xd2, 0x41, 0x11, 0xb9, 0xae, 0x6a, 0x76, 0xab, 0xd8, 0xda, 0x06, 0xb2, 0x9c, 0xcb, 0xa6, 0xde, 0x3c, 0xa7, 0x97, 0xfc, 0x73, 0x69, 0x78, 0x8b, 0xb8, 0xfa, 0x03, 0x98, 0x4f, 0xec, 0x4d, - 0xbd, 0x51, 0x7d, 0x05, 0xf3, 0x96, 0x3b, 0x37, 0x75, 0x4f, 0xaa, 0x8f, 0x93, 0xc8, 0x56, 0xf7, 0xe1, 0xb9, 0x8b, 0x32, 0x10, 0xb2, 0x3c, 0xc6, 0x3d, 0x4a, 0x56, 0x43, 0xa7, 0xa6, 0x27, 0x2e, - 0x4a, 0x57, 0xe5, 0x34, 0x5c, 0xdf, 0xe8, 0xad, 0x79, 0xdc, 0x15, 0x1a, 0x49, 0x63, 0xba, 0x24, 0x7b, 0x3a, 0x10, 0x96, 0x1a, 0xa1, 0x8e, 0x05, 0xe9, 0x60, 0x06, 0x22, 0xe8, 0x29, 0x58, 0x94, - 0xc4, 0xf2, 0x6c, 0x52, 0x34, 0xc6, 0x58, 0x7d, 0x47, 0x07, 0xf6, 0xd3, 0x73, 0xff, 0x47, 0x40, 0xda, 0x63, 0x2d, 0xaf, 0x19, 0xca, 0xb7, 0x69, 0xf8, 0x87, 0x85, 0xe5, 0x39, 0x03, 0xe4, 0x13, - 0xed, 0x1b, 0xa6, 0x9f, 0x2e, 0xdc, 0x92, 0x84, 0x27, 0x2c, 0x2f, 0xbb, 0xf5, 0x39, 0xe4, 0x85, 0xf8, 0x60, 0x75, 0xdb, 0xd2, 0x5e, 0x58, 0x68, 0xab, 0xb9, 0xd4, 0x49, 0xd8, 0x6d, 0x31, 0x00, - 0x63, 0x38, 0x2d, 0xe5, 0xf2, 0xb8, 0x55, 0x36, 0xa4, 0xab, 0x83, 0x3a, 0xc7, 0x40, 0x4a, 0x4a, 0x2e, 0x48, 0x68, 0x58, 0x06, 0x42, 0x19, 0xa1, 0xee, 0x46, 0xf2, 0x01, 0x97, 0x6e, 0x0a, 0x3b, - 0x0e, 0x3b, 0x80, 0x5b, 0x8c, 0xda, 0x5a, 0x8c, 0x5c, 0x64, 0xde, 0xc8, 0xc4, 0x04, 0x93, 0xc3, 0xee, 0xec, 0xf8, 0xe6, 0xae, 0xfa, 0xf4, 0xab, 0x3f, 0x10, 0xfd, 0xd2, 0x4e, 0xfd, 0x17, 0x87, - 0xdc, 0xa7, 0x5a, 0x26, 0xff, 0xf9, 0x3f, 0x5f, 0x2b, 0x97, 0x7c, 0x44, 0xf8, 0xbf, 0x0d, 0xd4, 0xff, 0xfa, 0xef, 0x4c, 0x8b, 0x36, 0x8f, 0xaf, 0x66, 0xf0, 0x6b, 0x0b, 0xf6, 0xeb, 0x20, 0xdd, - 0xdf, 0x0e, 0x79, 0x52, 0x59, 0xf8, 0xf1, 0x82, 0xdb, 0xc0, 0xfe, 0xb8, 0x7c, 0x8d, 0xe5, 0x98, 0x30, 0xba, 0xa7, 0xfc, 0xb2, 0x44, 0xce, 0x98, 0x3e, 0x47, 0x5b, 0xaa, 0x6e, 0xd4, 0xe5, 0xc0, - 0x18, 0xeb, 0xb9, 0xec, 0x5d, 0x16, 0x59, 0x87, 0x73, 0x56, 0xac, 0xba, 0x5e, 0xba, 0xb2, 0x19, 0xe5, 0xc8, 0x38, 0xfb, 0x60, 0x3d, 0xd8, 0x80, 0x1c, 0x15, 0xa5, 0x54, 0x34, 0x1b, 0xa5, 0xaa, - 0x1b, 0x36, 0x3a, 0xb7, 0xe7, 0x16, 0xb3, 0xca, 0x56, 0x74, 0x38, 0x17, 0xa4, 0xf6, 0x44, 0x16, 0x1e, 0xc3, 0xdd, 0x62, 0x37, 0xa5, 0x28, 0x7a, 0x5c, 0xcf, 0x7a, 0xdf, 0x3e, 0x55, 0xfe, 0xe3, - 0x86, 0x0a, 0x4f, 0x2e, 0x79, 0xaf, 0x64, 0x6f, 0xc0, 0xbc, 0x9e, 0x4c, 0x5d, 0xda, 0xce, 0x6e, 0x53, 0xb7, 0x1b, 0x2b, 0x5b, 0x29, 0x10, 0xd0, 0xed, 0xf7, 0xdb, 0xa0, 0x30, 0xba, 0x61, 0xe1, - 0x23, 0xc0, 0x72, 0xcf, 0x77, 0x79, 0x66, 0x21, 0xfe, 0xa8, 0xb5, 0x25, 0xbc, 0x67, 0x6b, 0x9f, 0x06, 0x9a, 0x7e, 0x3e, 0xf7, 0x63, 0x3b, 0x25, 0x78, 0x3e, 0x46, 0x25, 0x17, 0x11, 0x17, 0x6e, - 0x40, 0x00, 0xe7, 0x11, 0x59, 0xb0, 0xbb, 0x3c, 0x39, 0xd6, 0x27, 0xea, 0x12, 0x89, 0x7b, 0xfb, 0x51, 0x84, 0xf3, 0xbf, 0xb7, 0xb4, 0xf9, 0x97, 0xc7, 0x7e, 0xd3, 0xe7, 0xac, 0x20, 0xff, 0x72, - 0xf3, 0x96, 0xfa, 0x97, 0x5b, 0x03, 0xa1, 0x5f, 0x0b, 0x49, 0x10, 0xbb, 0x6e, 0xf4, 0xa4, 0x8b, 0xe1, 0x80, 0xb1, 0xee, 0x47, 0x9c, 0x5b, 0x2f, 0xdc, 0xc6, 0x1c, 0xa9, 0x1a, 0x88, 0x98, 0xdf, - 0x79, 0x21, 0x79, 0x99, 0x66, 0x27, 0x3f, 0x7f, 0xb4, 0x7b, 0xfa, 0x5c, 0x44, 0xd0, 0x3b, 0xd5, 0x5b, 0x17, 0xa0, 0xdb, 0xf1, 0xd4, 0x48, 0x20, 0xd5, 0x5b, 0xeb, 0x41, 0xea, 0xf2, 0xa8, 0xab, - 0x8f, 0x62, 0xbc, 0x3d, 0x2b, 0x61, 0x3d, 0x6f, 0x21, 0x62, 0xb1, 0x6b, 0x69, 0xdd, 0x5b, 0xad, 0x65, 0xc8, 0xf1, 0x4d, 0x67, 0x17, 0x09, 0x12, 0x76, 0x22, 0xec, 0x32, 0x5c, 0x37, 0x71, 0xe0, - 0x16, 0xf3, 0x46, 0xa3, 0x1d, 0xf7, 0x22, 0x97, 0x26, 0xdb, 0x94, 0x1c, 0x72, 0x9a, 0x6f, 0x89, 0xbd, 0x33, 0x86, 0xd8, 0xdc, 0x6e, 0xeb, 0x03, 0xb8, 0x13, 0xa7, 0x84, 0xba, 0xff, 0xec, 0x8a, - 0xf4, 0xd5, 0x81, 0x07, 0x63, 0x4f, 0xf8, 0x4e, 0x7e, 0xb6, 0x43, 0xba, 0x11, 0xfa, 0x1d, 0x87, 0xe2, 0xb4, 0x15, 0x48, 0xf9, 0x78, 0x5c, 0x93, 0x66, 0x25, 0xd1, 0xf2, 0x09, 0x05, 0xf7, 0xc7, - 0x2a, 0x6f, 0xb1, 0xf8, 0x48, 0x0f, 0xf2, 0x09, 0x40, 0xf0, 0xfc, 0x7c, 0xc4, 0xe2, 0x6c, 0x8f, 0xe4, 0x65, 0xdb, 0x69, 0x26, 0x97, 0x15, 0xa0, 0xc2, 0x5b, 0xc5, 0xb9, 0xb7, 0x4e, 0xa6, 0xbd, - 0xe2, 0x4e, 0x68, 0x62, 0x74, 0xac, 0xac, 0xc9, 0x2b, 0x3e, 0xe4, 0x23, 0x7b, 0x23, 0x0f, 0x39, 0xbb, 0xa7, 0x9f, 0x53, 0x52, 0xbe, 0xb4, 0x45, 0x82, 0xbf, 0x97, 0x17, 0xfd, 0x68, 0xf3, 0xfb, - 0xc7, 0xa0, 0xba, 0x8f, 0x22, 0xa3, 0x33, 0xbf, 0xf3, 0xf3, 0x99, 0xe3, 0x37, 0x8d, 0x5f, 0xcd, 0xae, 0x65, 0x60, 0x1f, 0x47, 0x19, 0x3d, 0xd3, 0x08, 0xfb, 0x8f, 0x6f, 0x7a, 0xab, 0xe3, 0xfe, - 0xe8, 0xfe, 0xb5, 0xe4, 0xc9, 0x84, 0xe1, 0xb9, 0x0c, 0x8b, 0x7e, 0x88, 0xaa, 0x02, 0x5c, 0xf3, 0x45, 0x40, 0x2c, 0x23, 0x1f, 0x89, 0x47, 0x44, 0x72, 0x8f, 0x45, 0x82, 0xd4, 0x69, 0x21, 0xd5, - 0x87, 0x0a, 0x3c, 0xd6, 0xbc, 0xca, 0x89, 0x60, 0x11, 0xef, 0xe6, 0x81, 0x2d, 0x45, 0x29, 0x2e, 0x4b, 0x41, 0x09, 0x24, 0x8a, 0xc7, 0x58, 0xaa, 0xa2, 0x40, 0xab, 0xf5, 0x41, 0x1a, 0x05, 0x7a, - 0x5c, 0x59, 0x0b, 0x32, 0x8d, 0x69, 0xf8, 0x14, 0x21, 0x53, 0xc4, 0xf7, 0x2f, 0x55, 0xf0, 0xbf, 0xae, 0x75, 0xcf, 0xb1, 0xec, 0xf4, 0xea, 0xf7, 0xd7, 0x37, 0x4c, 0x00, 0xcb, 0x71, 0xe6, 0x02, - 0xee, 0xcd, 0x4d, 0x1d, 0xd7, 0xa8, 0x8d, 0xcb, 0x47, 0x51, 0x1b, 0x91, 0xc2, 0x9a, 0xa2, 0x84, 0x63, 0x7b, 0x40, 0xcf, 0xf5, 0x0a, 0x35, 0xa1, 0x51, 0xb6, 0x16, 0x62, 0x60, 0xf1, 0x82, 0x5b, - 0x1e, 0x62, 0x41, 0x07, 0xd7, 0x97, 0xf1, 0x44, 0x20, 0x34, 0x5b, 0xd5, 0xb6, 0x03, 0x66, 0xdb, 0x58, 0x50, 0x9a, 0x98, 0xee, 0xb7, 0x3b, 0x80, 0xc2, 0x70, 0x75, 0xe7, 0xa3, 0xc6, 0x14, 0x43, - 0xf9, 0x7e, 0xdb, 0x92, 0x3e, 0x6e, 0xa2, 0xa2, 0xbd, 0x55, 0x16, 0x7e, 0x5c, 0xbd, 0x19, 0x7e, 0xca, 0x59, 0x3a, 0xe9, 0x8d, 0xef, 0x70, 0xfe, 0xf2, 0xdc, 0xb4, 0x08, 0xe3, 0xdc, 0xf1, 0xe1, - 0x74, 0x6d, 0x37, 0xbb, 0x71, 0x04, 0xa8, 0xbe, 0x84, 0x17, 0x73, 0xa8, 0x39, 0xf5, 0xd5, 0x71, 0x9d, 0xf2, 0xbf, 0x23, 0x74, 0x8a, 0x73, 0x6f, 0x56, 0x3c, 0x52, 0x05, 0x88, 0xa7, 0xec, 0x89, - 0x57, 0x9a, 0xe0, 0xec, 0xed, 0xe8, 0x5a, 0x53, 0x76, 0x82, 0x2d, 0xe1, 0xb9, 0x7b, 0xb8, 0x4d, 0x01, 0xba, 0xc9, 0x7c, 0x8e, 0xc6, 0x35, 0xe0, 0x82, 0x50, 0xa0, 0x1f, 0x6d, 0x42, 0x8f, 0xce, - 0x78, 0xc9, 0x46, 0x37, 0x75, 0xc7, 0x69, 0xcd, 0x98, 0xa1, 0xdd, 0xc0, 0xf2, 0x32, 0xa9, 0xee, 0xca, 0xa6, 0x63, 0x38, 0xa0, 0xc1, 0xb0, 0x83, 0x71, 0xb4, 0xf5, 0x44, 0x63, 0x55, 0xb7, 0x2a, - 0x17, 0xfe, 0x22, 0x9d, 0x53, 0x87, 0x79, 0xd5, 0xea, 0x2a, 0x86, 0x13, 0xd1, 0x94, 0x49, 0x95, 0xfa, 0xdd, 0xa3, 0x5d, 0x88, 0xe7, 0x26, 0xd1, 0x0b, 0x41, 0x70, 0x76, 0xfd, 0x33, 0x75, 0x92, - 0x00, 0x8e, 0x86, 0xb4, 0x02, 0xc6, 0xe3, 0x9b, 0x25, 0x4f, 0x46, 0x60, 0x8e, 0xfa, 0x9d, 0xbb, 0x07, 0x6b, 0x25, 0x5d, 0x1f, 0xe7, 0xe5, 0xaa, 0x24, 0x86, 0x8c, 0x92, 0x0f, 0x6b, 0xdc, 0x37, - 0x08, 0x80, 0x20, 0xb9, 0xfa, 0x9c, 0x82, 0x1b, 0xdb, 0xd6, 0xc8, 0xf3, 0x9a, 0x65, 0x1a, 0xa4, 0x1a, 0x83, 0xc2, 0x06, 0x71, 0x85, 0x5d, 0xb2, 0xd1, 0x85, 0x8b, 0x2f, 0xb0, 0xb7, 0x6d, 0x90, - 0x93, 0xf2, 0x68, 0xe1, 0xfb, 0x45, 0xe0, 0x97, 0x95, 0x9f, 0xb6, 0x9e, 0x3f, 0x7b, 0xb7, 0xa3, 0x90, 0xaf, 0xea, 0xf9, 0x35, 0xd9, 0xde, 0x8d, 0x7c, 0xf7, 0xda, 0x3c, 0xe9, 0xff, 0x77, 0xab, - 0x29, 0xf7, 0x7a, 0xfb, 0xab, 0xd4, 0xbf, 0x53, 0x00, 0xfb, 0x1e, 0xc8, 0xf8, 0x53, 0x51, 0x7c, 0xdf, 0x89, 0xbf, 0x00, 0xfe, 0xed, 0xd2, 0x0c, 0x9f, 0x16, 0xd3, 0xa7, 0x6b, 0x64, 0xa9, 0x9f, - 0xa8, 0x44, 0x9a, 0xab, 0x70, 0xaf, 0x92, 0x3d, 0x1a, 0x1f, 0x82, 0x55, 0x72, 0x41, 0x11, 0x2e, 0x66, 0x91, 0x00, 0x8d, 0x16, 0x9e, 0xb2, 0x97, 0xfb, 0x01, 0x05, 0xf9, 0x9d, 0x82, 0xe6, 0xa8, - 0x51, 0xb8, 0x43, 0x5c, 0xea, 0x17, 0x77, 0x50, 0x2d, 0x15, 0xb2, 0xa3, 0xc2, 0xef, 0x80, 0xe0, 0x34, 0x10, 0x74, 0xcb, 0x00, 0x4b, 0x3f, 0xd9, 0xd9, 0xb4, 0xd8, 0x0a, 0xe2, 0x84, 0xa2, 0xd0, - 0x6e, 0x51, 0x9c, 0xe2, 0xdb, 0xc2, 0x0a, 0x3d, 0x55, 0xfc, 0xbb, 0xf6, 0x9b, 0xd9, 0x8d, 0xc8, 0x6d, 0x49, 0x7b, 0xab, 0x01, 0x8e, 0x3d, 0xb2, 0x7c, 0xd3, 0x38, 0xf7, 0xeb, 0x99, 0x9d, 0x7b, - 0x33, 0xb7, 0x48, 0xdb, 0xec, 0xa1, 0xea, 0xf7, 0x5c, 0xe8, 0xc3, 0x0f, 0xea, 0xd7, 0x31, 0xf9, 0x76, 0x6d, 0x6a, 0x18, 0x04, 0x39, 0xa4, 0x43, 0xea, 0xd7, 0x96, 0x02, 0xee, 0x0c, 0x84, 0x4e, - 0x22, 0x9e, 0x4b, 0x51, 0x3d, 0x48, 0x0a, 0xc2, 0x3a, 0x92, 0xe1, 0xfc, 0xbc, 0xae, 0xf0, 0x05, 0xb9, 0x13, 0xab, 0xb3, 0x4b, 0xa3, 0x1d, 0x19, 0x8c, 0xfb, 0x21, 0x6b, 0x60, 0xb6, 0xec, 0x79, - 0x9d, 0xca, 0x19, 0xfd, 0x58, 0x53, 0xe7, 0x71, 0xec, 0xce, 0x91, 0x93, 0x44, 0x22, 0xae, 0x58, 0x21, 0xb1, 0x6d, 0x40, 0xe1, 0xf4, 0xa8, 0xc4, 0xf4, 0x57, 0x8c, 0xbe, 0x14, 0x8e, 0xbd, 0xcf, - 0xb0, 0xcf, 0x28, 0xc6, 0x9f, 0xe8, 0xbe, 0xe0, 0xf2, 0x71, 0x76, 0x6d, 0x3a, 0x3c, 0x41, 0x39, 0x6e, 0xc8, 0xa8, 0xa7, 0xcb, 0x15, 0x70, 0xe8, 0xda, 0x5e, 0x5a, 0x1f, 0xfb, 0x13, 0x3e, 0x1a, - 0x42, 0x39, 0x44, 0xab, 0xf3, 0x18, 0x22, 0x67, 0x2d, 0x3d, 0xa5, 0x6b, 0x39, 0x80, 0x32, 0xe3, 0xb2, 0xdc, 0x3b, 0x3e, 0xba, 0x28, 0x11, 0x23, 0xf6, 0x2d, 0xd7, 0x6b, 0x25, 0x33, 0xb1, 0x37, - 0x5c, 0x31, 0x10, 0x25, 0xdd, 0x2e, 0x4b, 0x85, 0x5f, 0x1e, 0x96, 0x14, 0x79, 0x28, 0xb7, 0x62, 0x2a, 0x9d, 0xa9, 0xe7, 0x94, 0xc2, 0x72, 0x76, 0xfb, 0xfd, 0xaf, 0x7a, 0xdf, 0xc3, 0xc2, 0x83, - 0x69, 0xe1, 0x3d, 0xce, 0xa3, 0xc0, 0xfe, 0x86, 0xc9, 0xbf, 0x91, 0x27, 0x66, 0xfe, 0x95, 0xe8, 0x15, 0xc3, 0x97, 0x83, 0xd9, 0x2b, 0x9d, 0xdf, 0x01, 0xec, 0x90, 0x13, 0xc7, 0xfb, 0x38, 0x99, - 0xfa, 0xae, 0xd6, 0xa6, 0x36, 0xb7, 0x6a, 0x25, 0x6d, 0x37, 0xa0, 0xea, 0x80, 0x85, 0x9b, 0xe5, 0x9a, 0xb0, 0x60, 0x19, 0xed, 0x78, 0xf8, 0x54, 0x85, 0x47, 0x4b, 0xaa, 0x6a, 0x05, 0xd8, 0x2c, - 0xb4, 0xa5, 0x60, 0x5c, 0x8c, 0xc4, 0x3d, 0xee, 0x6a, 0x98, 0xdc, 0x44, 0x8e, 0x65, 0x2c, 0x7d, 0x8f, 0x59, 0x77, 0xd4, 0xd1, 0x82, 0x9b, 0x2e, 0xc1, 0x17, 0xdd, 0x7e, 0x1a, 0x4b, 0xbd, 0xfc, - 0xd0, 0xbf, 0xdd, 0xb4, 0xc8, 0x7d, 0xcf, 0xf7, 0x1f, 0x17, 0x6b, 0x7e, 0xa6, 0x63, 0xc4, 0x77, 0xe2, 0xef, 0xc0, 0x7c, 0x5c, 0x9a, 0x5d, 0x29, 0xff, 0xa6, 0x4a, 0x60, 0x09, 0x05, 0xe6, 0x3c, - 0xb0, 0xeb, 0x3c, 0x42, 0x58, 0xef, 0x73, 0x96, 0xbd, 0x44, 0xc7, 0x62, 0xe5, 0xa4, 0xa3, 0x3c, 0xa1, 0x2a, 0xe1, 0xeb, 0x2b, 0x9b, 0xaa, 0xcd, 0x5f, 0x19, 0xe3, 0xfe, 0x17, 0x62, 0x4f, 0x78, - 0x17, 0xbe, 0xd1, 0xfe, 0xf8, 0xc0, 0xb7, 0x2b, 0xb3, 0x2b, 0xdd, 0xdf, 0xbe, 0xef, 0x90, 0xe8, 0x52, 0xb1, 0xe1, 0x55, 0x19, 0x93, 0x80, 0x11, 0x04, 0x8d, 0x70, 0x3f, 0x00, 0x07, 0xc9, 0x39, - 0x63, 0xd6, 0x76, 0xca, 0xf7, 0x85, 0xbf, 0xe4, 0x42, 0x3f, 0x97, 0xbd, 0xf9, 0x89, 0xee, 0xf5, 0xbb, 0xde, 0xcf, 0xa6, 0x66, 0x6d, 0x52, 0xc7, 0x5d, 0x57, 0x32, 0x0c, 0xd5, 0x0e, 0x51, 0xd0, - 0xf8, 0x2d, 0x55, 0xae, 0x3a, 0xe5, 0x52, 0xae, 0x2d, 0x72, 0x6f, 0x9a, 0x5e, 0xa9, 0xc7, 0x9d, 0x55, 0x2e, 0x07, 0xa2, 0x5e, 0xd4, 0x6c, 0x2b, 0xaa, 0x26, 0x48, 0x56, 0xca, 0xd2, 0xee, 0x7c, - 0xcf, 0x67, 0x29, 0x5b, 0x04, 0xac, 0xd3, 0x70, 0x26, 0xda, 0x72, 0xbb, 0x30, 0x36, 0x20, 0xcd, 0x1c, 0x88, 0x4e, 0x36, 0xc7, 0x40, 0x1d, 0x36, 0xcf, 0x49, 0x05, 0x37, 0x7a, 0xeb, 0xa8, 0xf8, - 0xa3, 0x4d, 0xf4, 0x03, 0x27, 0xdd, 0xcb, 0xc2, 0xf7, 0x07, 0xe1, 0x51, 0x94, 0x8e, 0x9f, 0x3f, 0x2c, 0x86, 0xfc, 0x5c, 0xef, 0xcf, 0x77, 0xaa, 0x57, 0xb8, 0x5f, 0x8f, 0xa7, 0xf6, 0xfe, 0x0c, - 0x1a, 0x64, 0x97, 0xb5, 0x56, 0xce, 0xf5, 0x00, 0xb7, 0x56, 0x02, 0x0d, 0xcf, 0x4a, 0xfe, 0xd0, 0x7a, 0x3c, 0xab, 0x8e, 0x69, 0xb9, 0xca, 0x22, 0x32, 0xd3, 0x49, 0xd9, 0xdd, 0x2d, 0x33, 0x3f, - 0xa8, 0xc5, 0xf4, 0x40, 0xcd, 0x4f, 0x90, 0x4e, 0xe4, 0xd5, 0x7c, 0xee, 0xb9, 0xbd, 0xb9, 0x00, 0x46, 0x7a, 0x74, 0xa1, 0xbd, 0xc1, 0x8e, 0x4b, 0x8b, 0x81, 0x17, 0x70, 0xa8, 0x07, 0x82, 0xd5, - 0xae, 0x27, 0x54, 0x74, 0xb8, 0x34, 0xfe, 0xab, 0x47, 0xea, 0x0f, 0xa5, 0xac, 0x3e, 0x27, 0xcd, 0x3e, 0xd2, 0xe7, 0x9f, 0xc0, 0xeb, 0x8d, 0xea, 0x0b, 0x5e, 0x6f, 0xc7, 0x57, 0x9d, 0x7e, 0x02, - 0x5e, 0xeb, 0x82, 0xf0, 0xd6, 0x10, 0x36, 0xcf, 0xf6, 0x49, 0x3b, 0xe6, 0xfd, 0x7a, 0xbf, 0x47, 0x4b, 0xdd, 0x3f, 0x64, 0x1e, 0x28, 0x40, 0x41, 0xa0, 0xa5, 0xa7, 0xe3, 0x31, 0xec, 0xad, 0x18, - 0xf0, 0xcf, 0xb0, 0x3e, 0xcf, 0xce, 0x4a, 0x3f, 0x8f, 0x00, 0x7f, 0x53, 0x9b, 0xb2, 0x39, 0xef, 0x4d, 0x9a, 0x86, 0x63, 0x64, 0x61, 0x47, 0x58, 0x04, 0xb3, 0xfc, 0x76, 0x7e, 0xc1, 0xce, 0x5a, - 0xb4, 0x74, 0xea, 0x78, 0x82, 0x17, 0x7b, 0xb0, 0xd3, 0x34, 0x7e, 0xad, 0x5c, 0xf5, 0x07, 0xb7, 0x44, 0x66, 0x9f, 0xfc, 0xd9, 0x5b, 0x2f, 0x9a, 0xfb, 0x2c, 0x86, 0x3e, 0x91, 0x01, 0xf6, 0x41, - 0x16, 0x9c, 0x7d, 0x3a, 0x99, 0x5d, 0xa9, 0xfd, 0x0e, 0x5a, 0x4d, 0xe9, 0x51, 0x2a, 0xf9, 0x64, 0xb7, 0x13, 0x8b, 0x4c, 0x89, 0xe6, 0xf0, 0x79, 0xe1, 0xa7, 0xdb, 0xe2, 0x54, 0x81, 0x7b, 0x17, - 0x65, 0x42, 0xc9, 0xa9, 0x0b, 0x34, 0x27, 0xb1, 0xcc, 0xd8, 0x31, 0xf8, 0x46, 0xb3, 0xfa, 0x13, 0x4b, 0x4b, 0xe9, 0x31, 0xc0, 0x8e, 0x3b, 0x3b, 0xdb, 0x5c, 0xd6, 0x3c, 0x15, 0x41, 0x61, 0x44, - 0xa2, 0xd5, 0x96, 0xc6, 0x2e, 0x5d, 0xaf, 0x6a, 0xc8, 0xdc, 0x58, 0xe5, 0x53, 0x0c, 0xa1, 0xcc, 0x2e, 0xff, 0xb0, 0xd3, 0x8e, 0x3d, 0x95, 0x6b, 0xf2, 0x4a, 0xf3, 0x0a, 0xc4, 0xf5, 0x68, 0x86, - 0x4d, 0xcb, 0x2b, 0x89, 0x3c, 0x09, 0xee, 0x8d, 0xca, 0x72, 0x1c, 0x84, 0xf6, 0xd9, 0x65, 0xbc, 0x4c, 0xd6, 0x8e, 0xbf, 0xa3, 0xd6, 0x8e, 0x98, 0x9c, 0xe1, 0xb6, 0x3a, 0x09, 0x6b, 0x70, 0xb3, - 0xda, 0x81, 0x92, 0x89, 0x51, 0x5b, 0x0b, 0x56, 0x8c, 0xa3, 0x5e, 0x2b, 0xac, 0x01, 0x2f, 0xe1, 0xb1, 0x33, 0x17, 0x42, 0x0e, 0x1f, 0x79, 0x88, 0x70, 0xfb, 0x84, 0xad, 0xe5, 0x15, 0x22, 0xa2, - 0x7a, 0x9a, 0x27, 0xb0, 0x79, 0x9c, 0xe2, 0x0a, 0xcc, 0xfc, 0xa2, 0x7f, 0x00, 0x01, 0xfd, 0xd4, 0x0c, 0x7a, 0x21, 0xf8, 0xf2, 0xfd, 0x7e, 0xd1, 0xcf, 0xe8, 0x69, 0xf3, 0x06, 0x28, 0x9c, 0xbd, - 0x93, 0xca, 0x4a, 0xa6, 0x46, 0xee, 0xc0, 0x36, 0x04, 0x12, 0xb4, 0x95, 0x72, 0x56, 0x19, 0xa5, 0x94, 0x86, 0xc3, 0xb1, 0xa0, 0xd8, 0x56, 0xc1, 0x1d, 0x89, 0xf4, 0x96, 0x54, 0x9f, 0xf5, 0x0a, - 0xd0, 0xf5, 0x82, 0x58, 0x82, 0xd5, 0x7c, 0xc1, 0x61, 0xf3, 0x4a, 0xdb, 0x51, 0xf3, 0x9a, 0x53, 0x38, 0xb8, 0x4e, 0x0a, 0x8b, 0xc6, 0x44, 0x0c, 0x26, 0x8f, 0xbc, 0x7e, 0xa2, 0x56, 0xcf, 0x99, - 0x83, 0xff, 0x75, 0xad, 0xfc, 0x0d, 0x5e, 0x6b, 0x1b, 0xbe, 0x4d, 0x29, 0xf8, 0x7b, 0xe3, 0x24, 0xd7, 0xce, 0xfc, 0xd4, 0xb5, 0x6b, 0x7f, 0x76, 0xf2, 0x5f, 0x77, 0x8b, 0x88, 0x6b, 0x5f, 0xc7, - 0x4f, 0xcf, 0x78, 0xfe, 0xf5, 0xa9, 0x78, 0xf4, 0xef, 0xd3, 0xf8, 0xb8, 0xff, 0x41, 0xe4, 0x4e, 0x5a, 0xd9, 0xb7, 0x72, 0x47, 0x77, 0x0a, 0x82, 0xbd, 0xfd, 0xd4, 0xd9, 0xad, 0x48, 0x70, 0xfd, - 0x73, 0x71, 0xfe, 0xeb, 0xaf, 0xff, 0xe4, 0x45, 0x95, 0xd9, 0xd7, 0x97, 0x95, 0xb6, 0x7b, 0xb2, 0x43, 0xff, 0xad, 0x84, 0xfc, 0x9d, 0x96, 0x54, 0x95, 0x6f, 0x7b, 0xb3, 0xf2, 0x14, 0xde, 0xda, - 0x6c, 0xfc, 0xe7, 0xff, 0x90, 0xdf, 0x77, 0xac, 0x2a, 0xdf, 0x7b, 0x6b, 0xa7, 0xf7, 0xe3, 0x9f, 0x9b, 0x2a, 0xce, 0x66, 0xb9, 0xdf, 0x5f, 0x0d, 0xa1, 0x07, 0x8f, 0x7c, 0xab, 0xb4, 0x07, 0x53, - 0x5f, 0xef, 0x0f, 0x76, 0x15, 0xd6, 0x5f, 0x2c, 0x3c, 0xe8, 0xda, 0xb1, 0xf8, 0x4d, 0xa6, 0x7d, 0x1a, 0xd4, 0xff, 0x5e, 0x31, 0x3e, 0x98, 0xfa, 0xd6, 0x05, 0x74, 0x2a, 0x8b, 0x3f, 0x2a, 0xc6, - 0xf7, 0x42, 0xf0, 0x0b, 0xb7, 0xff, 0xf5, 0x88, 0xe3, 0xe5, 0x15, 0x63, 0x1e, 0x4f, 0x14, 0xb0, 0xda, 0x9b, 0xc0, 0x59, 0x93, 0xfb, 0x93, 0xd0, 0x88, 0xe7, 0x91, 0x69, 0x2f, 0x6e, 0x54, 0x6c, - 0x63, 0x8e, 0xd6, 0xbd, 0x0b, 0xb0, 0xd8, 0x2f, 0x15, 0xae, 0x8d, 0x55, 0x15, 0xd8, 0xad, 0xc5, 0xb5, 0xe0, 0x22, 0xd2, 0x9a, 0x39, 0xa6, 0x4e, 0x74, 0x5a, 0xf6, 0x5a, 0x03, 0x62, 0x60, 0x2e, - 0x5a, 0x17, 0x7e, 0x63, 0xc2, 0x3d, 0xaa, 0xfa, 0x07, 0x79, 0x43, 0x65, 0xcf, 0xd7, 0x1f, 0x7b, 0xaf, 0xfd, 0x76, 0x7f, 0x55, 0x78, 0xc6, 0x2b, 0x74, 0x23, 0x79, 0x15, 0x04, 0x2f, 0x07, 0x33, - 0x78, 0x9a, 0x67, 0x88, 0x3a, 0x93, 0x06, 0x1f, 0x6e, 0xd7, 0x07, 0x6c, 0x4d, 0x35, 0x6e, 0x60, 0xec, 0x06, 0x2a, 0x84, 0x68, 0xc9, 0x55, 0x7a, 0xcb, 0x73, 0xfa, 0x05, 0x7f, 0x8e, 0x7c, 0xf0, - 0x60, 0x9d, 0x8a, 0xd5, 0x98, 0xe4, 0x20, 0xaa, 0x2d, 0xb9, 0xbe, 0x91, 0xe7, 0x66, 0x73, 0x5c, 0x5e, 0x18, 0x54, 0xa6, 0x9a, 0xdd, 0x58, 0xba, 0xe3, 0x7c, 0xce, 0x85, 0x1d, 0xb0, 0x43, 0x76, - 0xf8, 0x00, 0x41, 0xd6, 0x5a, 0x7e, 0x94, 0x3f, 0xf4, 0x0d, 0x82, 0x26, 0x2a, 0xbc, 0xc7, 0x1e, 0x82, 0x67, 0x52, 0x53, 0x5e, 0x69, 0x5e, 0x41, 0xb8, 0x1e, 0x4d, 0x4d, 0x43, 0x89, 0xdd, 0x94, - 0x11, 0x7c, 0xe9, 0x2c, 0x65, 0x04, 0x35, 0x2e, 0x9a, 0xdc, 0x82, 0x7c, 0x00, 0xde, 0x20, 0x83, 0xbe, 0xf2, 0xba, 0x51, 0x2a, 0xec, 0x56, 0xd4, 0xb1, 0x03, 0xcb, 0xa0, 0x46, 0x27, 0x80, 0xdd, - 0x6e, 0x11, 0xfb, 0x0b, 0xf2, 0x1c, 0xa8, 0x69, 0xaf, 0x5b, 0x3a, 0xc0, 0x31, 0xf4, 0x8e, 0x76, 0x76, 0xc7, 0xd5, 0x9e, 0x86, 0xda, 0xf4, 0x52, 0xe8, 0xc5, 0x5c, 0x40, 0xd0, 0xda, 0x98, 0xe4, - 0x71, 0xff, 0xd2, 0xcd, 0xfb, 0xd1, 0x2e, 0xd9, 0x3f, 0x77, 0x95, 0x7c, 0x90, 0x7d, 0xc1, 0xe2, 0xfd, 0xe4, 0xba, 0x4f, 0x36, 0xc1, 0x39, 0x52, 0xaa, 0xd9, 0xd8, 0x83, 0x47, 0xdd, 0xed, 0x8f, - 0xcb, 0x92, 0xa3, 0xed, 0x15, 0x7d, 0x06, 0xa1, 0xa3, 0xdc, 0x6f, 0xa4, 0x21, 0x4c, 0x78, 0x6d, 0x4d, 0x0d, 0x90, 0x5d, 0x40, 0xbd, 0x77, 0x2e, 0xab, 0x6a, 0xe4, 0x6c, 0xcc, 0xcc, 0x2f, 0x1b, - 0x77, 0x24, 0x03, 0x45, 0xb5, 0x2a, 0xaa, 0x2b, 0x22, 0xca, 0x80, 0xa1, 0xd3, 0x32, 0x62, 0x58, 0x47, 0x72, 0x05, 0xe3, 0x84, 0xf7, 0x42, 0x78, 0x78, 0xb2, 0xf5, 0x8b, 0x53, 0xd9, 0xee, 0x27, - 0xc1, 0xf6, 0xad, 0xb7, 0xdd, 0xf7, 0x56, 0xe7, 0xff, 0x48, 0x68, 0x7d, 0xfe, 0xf7, 0x47, 0x42, 0x0b, 0xf9, 0xd6, 0xbb, 0x7d, 0xfa, 0x10, 0xbc, 0x53, 0x07, 0x67, 0x1f, 0xc7, 0xd7, 0x0e, 0x93, - 0xe8, 0x34, 0x91, 0x25, 0x96, 0xfc, 0x26, 0x09, 0x7a, 0x77, 0xce, 0xe9, 0x0e, 0xbd, 0xf3, 0xe3, 0x50, 0xab, 0x91, 0x8c, 0x5d, 0x8f, 0x47, 0x7d, 0x37, 0x32, 0xed, 0x0e, 0x29, 0x76, 0x2e, 0x43, - 0x53, 0xb4, 0xe0, 0x53, 0x6a, 0xe3, 0x43, 0x80, 0xa9, 0x33, 0x49, 0x0f, 0xaf, 0x0d, 0xdf, 0xe3, 0xa2, 0x56, 0x13, 0x77, 0x27, 0x21, 0xd9, 0x9b, 0xe3, 0x56, 0x42, 0xf3, 0x72, 0x4e, 0xa7, 0xad, - 0x16, 0x2d, 0x4d, 0x5e, 0xf4, 0xc2, 0xe7, 0x45, 0x56, 0x9c, 0x3d, 0xde, 0x8f, 0x7e, 0xa6, 0x11, 0xd7, 0x0b, 0xc1, 0x2b, 0x77, 0x66, 0xfe, 0x0c, 0x99, 0xd6, 0x7a, 0x4b, 0xdf, 0xef, 0x4e, 0x5b, - 0x9f, 0xd7, 0x50, 0xb8, 0x92, 0xb7, 0xb1, 0x5d, 0xd5, 0xac, 0xb4, 0x12, 0x2c, 0x71, 0xb3, 0x0c, 0x3b, 0xd1, 0x05, 0x37, 0x55, 0x52, 0x04, 0x4c, 0xce, 0xa6, 0x72, 0xd3, 0x04, 0xb8, 0x9d, 0xa8, - 0xdd, 0x39, 0x56, 0x19, 0x4a, 0xa9, 0xfd, 0xdc, 0x71, 0x8b, 0xc2, 0x6d, 0x44, 0xc2, 0x23, 0xb4, 0x9a, 0xb0, 0xcf, 0xd6, 0x91, 0x65, 0x80, 0xa3, 0x73, 0x12, 0x9b, 0x28, 0x9e, 0x94, 0x5a, 0x70, - 0xfd, 0x91, 0xde, 0xa3, 0xd0, 0x77, 0xf8, 0x6f, 0xfc, 0x19, 0x53, 0xf1, 0x95, 0xe8, 0x1b, 0x06, 0x9e, 0x33, 0xbb, 0x11, 0xfa, 0x1d, 0x87, 0x7a, 0xa7, 0x63, 0xad, 0x41, 0x7a, 0x66, 0xda, 0x35, - 0x87, 0xf5, 0xa5, 0xef, 0x2f, 0x02, 0x07, 0xed, 0xda, 0x38, 0x32, 0xa4, 0x98, 0x27, 0xb5, 0x81, 0x71, 0x14, 0x7c, 0x7f, 0xb8, 0x70, 0x73, 0x96, 0xce, 0x74, 0xb3, 0x93, 0xc3, 0xaa, 0x50, 0xe4, - 0xde, 0x54, 0x14, 0x59, 0xdc, 0xad, 0xa9, 0xf9, 0xca, 0xe1, 0x01, 0x98, 0xd7, 0x8c, 0x54, 0x2e, 0x44, 0x58, 0x9f, 0x23, 0xb9, 0x8e, 0x86, 0x66, 0x37, 0x19, 0x87, 0xb7, 0x5e, 0x2d, 0xf7, 0x59, - 0x01, 0xfe, 0x1b, 0xfd, 0xe7, 0xf1, 0xa1, 0x1f, 0x74, 0xdf, 0xd0, 0xb8, 0x9e, 0xcc, 0x6e, 0xe4, 0x7e, 0x07, 0xc4, 0xe2, 0x4c, 0xc0, 0xd9, 0x65, 0xf8, 0xa8, 0x69, 0x0b, 0xc0, 0x2c, 0xe7, 0x15, - 0xa3, 0xd3, 0xb9, 0x08, 0xe9, 0xe1, 0x6a, 0x6e, 0xee, 0x34, 0x48, 0x69, 0x34, 0x58, 0xb2, 0x0e, 0x8b, 0x0e, 0xab, 0x01, 0x40, 0x93, 0x4e, 0x6e, 0x68, 0xd8, 0x1a, 0x14, 0x12, 0x00, 0xa6, 0x22, - 0xed, 0x0a, 0xdb, 0x26, 0x4a, 0x32, 0x0e, 0xb5, 0xc0, 0xc2, 0xe3, 0xa5, 0x3d, 0x6c, 0x70, 0x28, 0x1a, 0x6d, 0xff, 0x18, 0x3f, 0x97, 0xca, 0xf5, 0xc1, 0x2a, 0x6f, 0x7c, 0xf1, 0x60, 0x3a, 0xe5, - 0xb3, 0x5b, 0x35, 0x93, 0x87, 0x4c, 0xf5, 0xcc, 0x16, 0xe1, 0x07, 0xd9, 0x2b, 0x90, 0x6f, 0x27, 0x53, 0x36, 0xfb, 0x5e, 0x70, 0x5c, 0xd1, 0x49, 0xbf, 0xcd, 0x21, 0x72, 0x3f, 0x80, 0xab, 0x5e, - 0x4e, 0xd0, 0xd1, 0x38, 0x19, 0xf1, 0x09, 0x59, 0x6b, 0x5d, 0x58, 0xda, 0xc3, 0x89, 0xb3, 0xf8, 0x38, 0xdc, 0x10, 0xea, 0x85, 0x90, 0xe8, 0x8d, 0xb3, 0x1d, 0xfa, 0x5e, 0xdf, 0x6f, 0x9b, 0x0b, - 0xaf, 0x01, 0x64, 0x6a, 0x14, 0xdc, 0x66, 0xe3, 0xa1, 0x32, 0xba, 0x3a, 0xf6, 0xeb, 0xbe, 0x6b, 0xdb, 0xbc, 0xa6, 0x74, 0x16, 0x14, 0x7c, 0x66, 0x1a, 0x63, 0x7d, 0xd4, 0x36, 0xbf, 0x87, 0xc6, - 0x73, 0x9d, 0xa0, 0xdf, 0xa9, 0xde, 0xc0, 0xb8, 0x1d, 0x4f, 0xed, 0x02, 0xbd, 0x26, 0x4b, 0x02, 0x8d, 0xd4, 0xf8, 0x45, 0xac, 0x4a, 0x1c, 0xdf, 0xf7, 0xf0, 0x81, 0x8c, 0x51, 0x12, 0x60, 0x87, - 0x55, 0x25, 0x1f, 0x64, 0xfc, 0xa8, 0x28, 0xcc, 0x68, 0xa1, 0x86, 0xec, 0x6e, 0xa0, 0x9d, 0x34, 0x38, 0x7d, 0x19, 0x64, 0x06, 0x28, 0x41, 0xf8, 0xb8, 0x60, 0xc6, 0x5e, 0xa1, 0xf5, 0xfd, 0xc0, - 0xbb, 0x47, 0xa2, 0x41, 0x75, 0x19, 0x10, 0x71, 0xfb, 0xcc, 0x2a, 0xf2, 0x4a, 0x78, 0x8e, 0xa7, 0xae, 0x8b, 0xe0, 0xcc, 0xbf, 0x94, 0x76, 0xfe, 0x06, 0xc8, 0xd5, 0x76, 0x21, 0x1f, 0xf2, 0xd6, - 0x9b, 0x31, 0xf5, 0xc8, 0xb1, 0xf5, 0x84, 0xd7, 0xe1, 0x95, 0xe8, 0x1b, 0x94, 0x2f, 0x16, 0xd0, 0x95, 0xd2, 0x04, 0x24, 0xeb, 0x24, 0x3f, 0x61, 0x4e, 0x8f, 0x9a, 0xeb, 0xb3, 0x39, 0x3a, 0xde, - 0xc0, 0xc6, 0x52, 0xbd, 0x3b, 0x08, 0xbb, 0x40, 0x06, 0x00, 0x7d, 0xb9, 0x24, 0x31, 0x7a, 0x7e, 0xa9, 0x89, 0xd2, 0x9f, 0xb7, 0xf8, 0x31, 0xc4, 0xf2, 0xca, 0xcf, 0x6d, 0x42, 0x36, 0x2e, 0xb2, - 0x79, 0xa9, 0x14, 0xed, 0xdc, 0xf7, 0xd0, 0x3a, 0xeb, 0x1b, 0x40, 0xf5, 0x03, 0xaa, 0x0a, 0xc3, 0x36, 0x3b, 0x69, 0x9b, 0xf1, 0x51, 0xd5, 0xf1, 0xbb, 0x40, 0x7c, 0x32, 0xd5, 0xfe, 0x3d, 0xd7, - 0xea, 0x77, 0xe2, 0x9f, 0x81, 0x79, 0xbd, 0x34, 0xd5, 0xc9, 0xaa, 0x60, 0x15, 0x15, 0x46, 0x1e, 0x05, 0x0d, 0x91, 0x0c, 0x42, 0x09, 0x2c, 0xa3, 0x2c, 0xc2, 0x26, 0xbd, 0x7f, 0x44, 0x83, 0x58, - 0x08, 0x69, 0xd7, 0x93, 0xfb, 0x64, 0xed, 0xfd, 0xff, 0xd9, 0x7b, 0x8f, 0x26, 0xd5, 0x91, 0xe8, 0x5f, 0x70, 0xff, 0x3e, 0x45, 0x47, 0x6f, 0x15, 0xb4, 0xbc, 0x61, 0x56, 0x4f, 0x20, 0x24, 0x8c, - 0x1c, 0x02, 0x21, 0xb3, 0xf8, 0x47, 0xc8, 0x22, 0x09, 0x79, 0x2f, 0xe2, 0x4d, 0x7f, 0xf6, 0x09, 0xa0, 0xaa, 0x6e, 0x15, 0x05, 0xb7, 0x74, 0x99, 0x9e, 0xdd, 0x2c, 0xba, 0x4b, 0xee, 0x1e, 0x91, - 0xbf, 0x4c, 0x65, 0x9e, 0x3c, 0xe6, 0x77, 0x90, 0x35, 0x49, 0x6c, 0x61, 0x14, 0x77, 0x00, 0x91, 0xe9, 0xb9, 0x79, 0xe1, 0x1a, 0x9b, 0x2d, 0xbc, 0xdb, 0xcc, 0x1a, 0xd6, 0x3f, 0x6a, 0x36, 0xad, - 0x9e, 0x67, 0x7e, 0x6b, 0x44, 0xb2, 0xba, 0xf0, 0xc4, 0x63, 0x21, 0xc2, 0xaf, 0xc5, 0x5e, 0x5b, 0x65, 0xf9, 0xb9, 0x90, 0xec, 0x57, 0x36, 0xeb, 0xaf, 0xf9, 0x12, 0x0f, 0xf6, 0xcf, 0xbf, 0x3c, - 0xfe, 0x37, 0x5a, 0xbd, 0x27, 0x51, 0xf2, 0xc9, 0x6f, 0x97, 0x8f, 0x3f, 0xef, 0x89, 0x2b, 0xf6, 0x6f, 0xab, 0xc5, 0xcf, 0x68, 0x13, 0x6c, 0x7c, 0x6e, 0xec, 0x3d, 0x6f, 0x72, 0xe8, 0x1a, 0xb1, - 0x40, 0xf1, 0x30, 0xa7, 0x63, 0x6f, 0x11, 0x44, 0xe7, 0x02, 0xcf, 0xfa, 0xe3, 0x72, 0xb0, 0xe6, 0xea, 0x74, 0x30, 0xf4, 0xd6, 0xe1, 0xab, 0x36, 0x3b, 0x58, 0xcb, 0x75, 0x01, 0x56, 0x78, 0xaf, - 0xaf, 0x08, 0x50, 0xd7, 0x65, 0xa2, 0x3e, 0x93, 0xca, 0xb4, 0xa7, 0xa5, 0x7a, 0x99, 0xee, 0x24, 0xb0, 0xd6, 0x6b, 0x16, 0xd5, 0x94, 0x7d, 0x3c, 0x26, 0xbb, 0x29, 0xb5, 0xea, 0xa6, 0xb4, 0xe2, - 0x6b, 0x99, 0x69, 0xeb, 0x29, 0xc7, 0xde, 0xd7, 0x0a, 0x5c, 0x63, 0x31, 0xb8, 0x93, 0x0d, 0x4e, 0xee, 0xaf, 0x5c, 0x37, 0x84, 0x3f, 0x3a, 0x69, 0x76, 0x25, 0x01, 0x92, 0xb5, 0xab, 0x2e, 0x87, - 0x2e, 0x2d, 0xe5, 0x2a, 0x6f, 0xed, 0x56, 0xd1, 0x57, 0xb0, 0x9d, 0xcb, 0x23, 0xca, 0xe2, 0xa4, 0x99, 0xeb, 0x4d, 0xb2, 0x6a, 0xd2, 0xd4, 0xe1, 0x6f, 0x28, 0x5d, 0xd1, 0x17, 0x42, 0xf2, 0xbf, - 0x48, 0xbe, 0xb4, 0xed, 0xf3, 0xf9, 0xd5, 0xf0, 0x39, 0x22, 0x34, 0xdf, 0x6f, 0x53, 0x7d, 0x5a, 0x9b, 0xb6, 0x42, 0x6a, 0xfe, 0x9c, 0xc3, 0x67, 0xf4, 0x80, 0x0e, 0x12, 0x98, 0xce, 0xf9, 0x21, - 0x3a, 0x68, 0x0c, 0x21, 0x1c, 0x83, 0x45, 0x01, 0x9d, 0x71, 0x96, 0xf1, 0x45, 0xc0, 0xd4, 0x73, 0x5e, 0x13, 0x57, 0xfb, 0x99, 0x6b, 0x87, 0x7e, 0xbf, 0x3d, 0x6d, 0x11, 0xdc, 0xb3, 0x4b, 0x98, - 0xe0, 0x20, 0x91, 0xf4, 0x14, 0x6d, 0x1d, 0x56, 0x92, 0x23, 0x2c, 0x96, 0x1c, 0xfa, 0x8d, 0xe6, 0xe9, 0xf2, 0xd3, 0x92, 0xec, 0x59, 0xc4, 0xc7, 0xb5, 0x5c, 0xf8, 0xf4, 0xa5, 0xf6, 0x27, 0xd7, - 0x4c, 0xd3, 0xb7, 0xa3, 0xc9, 0x4d, 0xd0, 0xcf, 0x8d, 0xc6, 0xf2, 0x16, 0xf6, 0x11, 0x5b, 0x60, 0x22, 0x68, 0xe1, 0x1d, 0x41, 0x21, 0xe0, 0x8a, 0xbe, 0xac, 0x5b, 0xcf, 0xdb, 0xe2, 0x20, 0x07, - 0xaa, 0x07, 0x6f, 0x1a, 0x4a, 0x44, 0xb3, 0x37, 0xcf, 0x51, 0xaa, 0xc4, 0xcd, 0x8e, 0xc6, 0xe4, 0x83, 0xe6, 0x53, 0x73, 0x6d, 0x3a, 0xe5, 0x55, 0xb9, 0xe3, 0x66, 0xa8, 0x27, 0xae, 0x68, 0xf2, - 0xac, 0xb2, 0x99, 0x4c, 0x92, 0x46, 0xb3, 0x22, 0x03, 0xc9, 0x81, 0x5e, 0x9b, 0x5a, 0x9c, 0x20, 0x3b, 0x85, 0xae, 0xf5, 0xab, 0x78, 0xfb, 0x9d, 0xfd, 0xce, 0x6e, 0x8e, 0x6f, 0xb7, 0x90, 0xaf, - 0x51, 0x80, 0x8f, 0xf8, 0x18, 0x1f, 0x4c, 0x4f, 0x3f, 0xd4, 0x47, 0xc9, 0xab, 0xba, 0xf4, 0xbc, 0x7f, 0x4a, 0x2f, 0x19, 0x3e, 0x26, 0xaf, 0x2f, 0x85, 0x08, 0x3f, 0x95, 0x22, 0xc7, 0xff, 0x21, - 0xbf, 0xca, 0xae, 0xc2, 0x24, 0x8f, 0xbd, 0x49, 0x93, 0x5f, 0xf3, 0xe2, 0xd3, 0xac, 0x0e, 0xfd, 0xf0, 0xed, 0xd9, 0x6f, 0x41, 0x8b, 0x6f, 0x1e, 0xa8, 0x6a, 0xe2, 0x64, 0x71, 0xf6, 0x2e, 0xef, - 0x2e, 0xfe, 0xa2, 0xce, 0x9a, 0x8f, 0xdf, 0x79, 0x37, 0x87, 0x36, 0xa9, 0xeb, 0xf9, 0x95, 0xe5, 0xbf, 0x17, 0x4c, 0x87, 0xfe, 0xc1, 0xff, 0x64, 0x57, 0xfb, 0x80, 0x5e, 0xfa, 0xaf, 0xbf, 0xee, - 0x95, 0xa9, 0xaf, 0x16, 0xc2, 0xf1, 0xe3, 0xf0, 0x11, 0xcd, 0xf4, 0xf7, 0xb4, 0xf0, 0xbf, 0x1e, 0xcf, 0x2d, 0xb5, 0xab, 0xa8, 0xe8, 0x9c, 0x33, 0xcb, 0x70, 0xad, 0x25, 0xbe, 0xc8, 0xf9, 0x71, - 0xb6, 0xa4, 0xc8, 0xf8, 0xd0, 0xb4, 0xd0, 0x88, 0x4d, 0xe9, 0xa3, 0x8e, 0x7a, 0xd6, 0xc0, 0xfb, 0xee, 0x1b, 0xdf, 0xc0, 0x9b, 0x68, 0x70, 0xf2, 0x76, 0x30, 0xb9, 0x4a, 0xfa, 0xb9, 0x71, 0xd7, - 0x4d, 0x99, 0xd5, 0x58, 0x8c, 0x0f, 0xca, 0xa6, 0x7b, 0x38, 0x96, 0xfc, 0x5e, 0x34, 0x96, 0x4a, 0x9d, 0xeb, 0x16, 0x1c, 0x2a, 0xe1, 0xc6, 0xb1, 0x3c, 0x3b, 0xdc, 0x6c, 0xe1, 0xd9, 0xda, 0xcd, - 0xb7, 0xb1, 0xb6, 0x44, 0xe2, 0x79, 0xeb, 0xf5, 0x5b, 0x57, 0xc7, 0xf1, 0x2a, 0x95, 0xd9, 0x61, 0x43, 0x6e, 0xcf, 0x79, 0xe3, 0x16, 0xf6, 0x7c, 0x05, 0x15, 0x3a, 0xeb, 0x4b, 0x56, 0xb5, 0x74, - 0x07, 0x91, 0xe1, 0x46, 0xd5, 0xfb, 0xf8, 0xdd, 0xd8, 0x7b, 0x0e, 0x11, 0xfe, 0xe2, 0x18, 0xf8, 0xfa, 0x8a, 0x0b, 0x54, 0x5f, 0x2e, 0x4c, 0xf0, 0x6f, 0xc1, 0x00, 0x7f, 0x3d, 0x83, 0x6c, 0x1b, - 0x1d, 0xa2, 0xce, 0xd5, 0x57, 0x35, 0x06, 0x51, 0xc2, 0x2a, 0xa4, 0x8b, 0xb9, 0x8e, 0x65, 0xea, 0xa6, 0x3a, 0xaa, 0xc8, 0xa2, 0xa0, 0xb9, 0x73, 0x85, 0xc8, 0xf9, 0x29, 0xc1, 0xac, 0xad, 0x61, - 0x47, 0x09, 0x60, 0x2e, 0xb4, 0x85, 0xa3, 0x61, 0x3b, 0x9f, 0x15, 0xf7, 0x25, 0xd6, 0x08, 0xa2, 0x99, 0x58, 0x90, 0x37, 0x60, 0x3e, 0x1e, 0x1f, 0xf9, 0xf2, 0x34, 0x83, 0x2c, 0x1d, 0xda, 0x0a, - 0xd9, 0x6f, 0xac, 0xb2, 0x77, 0xcd, 0x7d, 0x30, 0x49, 0xfd, 0x75, 0xf7, 0x09, 0xdd, 0x15, 0xe0, 0xf8, 0xeb, 0x93, 0x79, 0xe4, 0x99, 0xa1, 0x24, 0xcd, 0xf2, 0xdf, 0xee, 0xe9, 0x5e, 0x58, 0xdb, - 0xb3, 0xbc, 0xbe, 0x4e, 0xfd, 0x79, 0x3d, 0x8a, 0x53, 0x00, 0x9e, 0xd8, 0x2e, 0x14, 0xb4, 0xbb, 0xac, 0xdf, 0xea, 0xcd, 0xce, 0x49, 0xd1, 0x43, 0xe0, 0x87, 0x09, 0x85, 0x1a, 0x2b, 0x02, 0xc0, - 0x5e, 0x99, 0xb9, 0x2d, 0xdb, 0x2e, 0xaf, 0xcf, 0x3e, 0x63, 0x74, 0x7c, 0xea, 0xee, 0x78, 0xbc, 0x97, 0x7b, 0x25, 0xf0, 0xf3, 0xf1, 0x2b, 0xae, 0xb0, 0x3c, 0xba, 0x71, 0x9d, 0x96, 0x46, 0x28, - 0x83, 0x39, 0xa2, 0xc1, 0xd5, 0xb1, 0x08, 0x23, 0xf4, 0x2c, 0x08, 0x83, 0x32, 0x87, 0x08, 0x92, 0x39, 0xc2, 0x84, 0xed, 0x9f, 0x0f, 0x4b, 0xa0, 0x23, 0x83, 0xc1, 0x3b, 0x26, 0xf9, 0xaa, 0x35, - 0xb1, 0xb5, 0x18, 0x15, 0x35, 0x27, 0x1d, 0xe8, 0x55, 0xcb, 0x27, 0xd1, 0xac, 0x47, 0x07, 0x99, 0x34, 0xf6, 0xde, 0xb4, 0xdd, 0xac, 0x8f, 0xa7, 0x4c, 0x94, 0xe4, 0xa8, 0xdb, 0x72, 0xd9, 0x91, - 0xc9, 0x04, 0x9d, 0x7d, 0x6d, 0x7d, 0xfc, 0xce, 0xe2, 0xfd, 0xee, 0x8f, 0xff, 0xbc, 0x16, 0xde, 0x13, 0xeb, 0x5c, 0x96, 0x08, 0xfc, 0x3e, 0x6e, 0xef, 0x63, 0x21, 0x23, 0xff, 0x41, 0xbf, 0xae, - 0x82, 0xad, 0x15, 0x87, 0xb7, 0x35, 0x2c, 0x4f, 0x3e, 0x00, 0x8b, 0x43, 0xc7, 0x4b, 0xdf, 0x62, 0xf0, 0xd1, 0xe7, 0x11, 0x00, 0x9f, 0x91, 0x7e, 0x1a, 0xbd, 0xf6, 0x1a, 0x1b, 0xc9, 0x57, 0xd1, - 0x77, 0xbd, 0x5a, 0x07, 0x63, 0xb9, 0x47, 0x08, 0xcf, 0xac, 0x70, 0xbe, 0x42, 0xb5, 0x7a, 0x1e, 0x56, 0x4b, 0x2d, 0x9f, 0xee, 0x10, 0x4e, 0x1d, 0x28, 0xb7, 0x38, 0xe5, 0x5c, 0x88, 0xcd, 0x0e, - 0xbb, 0x33, 0xca, 0x59, 0x45, 0xb8, 0x20, 0xbc, 0x73, 0x63, 0x43, 0x38, 0x8c, 0x2c, 0x76, 0xe7, 0x5a, 0x57, 0x3b, 0x75, 0x46, 0xcc, 0x89, 0xd5, 0xc6, 0xde, 0x9e, 0x0c, 0x44, 0x4e, 0x6d, 0x30, - 0x61, 0x30, 0xcd, 0xc8, 0xa2, 0xb9, 0xd2, 0x39, 0x1d, 0x3f, 0x46, 0xb5, 0x7f, 0x4b, 0x99, 0x0f, 0xd3, 0x2a, 0xff, 0x5d, 0xaa, 0x3e, 0xf9, 0x02, 0x34, 0x5f, 0x45, 0x83, 0x93, 0xbb, 0x0b, 0x93, - 0xab, 0xd4, 0x9f, 0xa1, 0xb1, 0xc8, 0x7c, 0xb1, 0x74, 0x03, 0xb8, 0xdf, 0xac, 0xe8, 0xe3, 0x7e, 0xd8, 0xa9, 0xdc, 0x91, 0x17, 0x7a, 0xb0, 0xef, 0x18, 0xb3, 0x3a, 0x89, 0xb0, 0xea, 0x12, 0xde, - 0xd1, 0x30, 0x44, 0x74, 0xe1, 0x2a, 0x1a, 0x66, 0x0a, 0xb2, 0xb8, 0x60, 0xd4, 0x3d, 0x0b, 0x04, 0xdd, 0x80, 0xf0, 0xea, 0x1c, 0x98, 0xc5, 0xc0, 0x6e, 0xe0, 0x75, 0x5a, 0x4c, 0xbb, 0x33, 0x18, - 0x0d, 0x01, 0x58, 0x34, 0xf5, 0x46, 0x1d, 0xe3, 0xe2, 0x78, 0xff, 0xb9, 0xbf, 0x73, 0xf5, 0xfc, 0xf9, 0x74, 0xf0, 0x21, 0xf5, 0x13, 0x20, 0xd5, 0xd8, 0x02, 0x99, 0xb5, 0x37, 0x14, 0x7c, 0xcb, - 0x6a, 0x67, 0xfe, 0x54, 0xe0, 0xb3, 0xe9, 0x29, 0xa4, 0xd8, 0x83, 0x46, 0x4f, 0x21, 0x44, 0x5d, 0x28, 0x48, 0x71, 0xea, 0x13, 0x97, 0xc6, 0x52, 0xde, 0x07, 0xba, 0x48, 0xe2, 0x69, 0xed, 0xd8, - 0x9f, 0xe7, 0x9a, 0x29, 0xce, 0xfb, 0x9c, 0x29, 0xa6, 0x42, 0xbb, 0xa0, 0x84, 0x24, 0xd0, 0xc4, 0x12, 0x58, 0x51, 0x1d, 0x3a, 0x13, 0xb1, 0xe9, 0xa1, 0x47, 0x09, 0x83, 0xd0, 0x5f, 0xf3, 0x6f, - 0xb8, 0x9e, 0x1f, 0xa6, 0xde, 0x24, 0x2f, 0xb3, 0xdc, 0x2b, 0xeb, 0xd0, 0xfb, 0xe5, 0x98, 0xfe, 0x92, 0xce, 0xe8, 0x5d, 0xab, 0xf7, 0xd5, 0xa5, 0xe5, 0xbc, 0x2b, 0xbf, 0x30, 0xf5, 0x0f, 0x34, - 0x49, 0xbd, 0xbe, 0x7e, 0xf6, 0xb5, 0xbe, 0xa1, 0xf2, 0xe6, 0xec, 0x7e, 0x86, 0xfc, 0x9f, 0x9b, 0x18, 0x3f, 0xc9, 0xfd, 0x85, 0xfd, 0xe5, 0x6c, 0x6c, 0x85, 0x5a, 0xb1, 0xa1, 0x17, 0x3b, 0x55, - 0x52, 0x85, 0x32, 0x5e, 0xe9, 0x92, 0xbf, 0xdc, 0x9c, 0x19, 0xc2, 0xce, 0xe5, 0x06, 0xad, 0x8d, 0x1a, 0xed, 0xdb, 0x48, 0x74, 0x95, 0xd5, 0x16, 0x60, 0xbd, 0x3d, 0x14, 0x8b, 0x36, 0xb6, 0xa1, - 0x34, 0x85, 0x84, 0xe6, 0x16, 0xd3, 0x07, 0x8d, 0x78, 0x6c, 0x76, 0x88, 0xce, 0x01, 0x5c, 0x74, 0x1a, 0x84, 0x4e, 0x3a, 0x57, 0x22, 0x6e, 0x9e, 0xea, 0x55, 0xe2, 0x07, 0x7f, 0xf0, 0x91, 0xfe, - 0x63, 0x55, 0x55, 0x78, 0x7c, 0xb6, 0x41, 0xc3, 0x5e, 0x32, 0x34, 0x7e, 0x91, 0xfc, 0x81, 0xca, 0xdb, 0xf9, 0xd5, 0x0a, 0x34, 0xc2, 0xe0, 0x18, 0xf6, 0x7b, 0x84, 0xc7, 0xf7, 0x4b, 0xbd, 0xa2, - 0xf3, 0x21, 0x54, 0x65, 0x63, 0x93, 0x68, 0x00, 0xb2, 0x58, 0xe6, 0xba, 0xee, 0xe1, 0xab, 0x10, 0x15, 0x00, 0x1f, 0xf3, 0x00, 0x6b, 0xcd, 0xd2, 0x4b, 0x2b, 0xc3, 0xad, 0x84, 0x55, 0x34, 0x62, - 0x0d, 0x49, 0x12, 0xe1, 0x80, 0xbc, 0x4a, 0xcd, 0x3c, 0x8c, 0x6c, 0xea, 0x79, 0x8f, 0x70, 0x3c, 0x35, 0x0d, 0x7a, 0x6e, 0x46, 0xe8, 0xbb, 0x64, 0xd3, 0xbc, 0x16, 0x95, 0xf1, 0x3d, 0x4d, 0xf1, - 0x2e, 0x96, 0x62, 0xd4, 0xa0, 0x7d, 0x9c, 0x33, 0xfd, 0xe9, 0x81, 0xaf, 0x43, 0xf4, 0xef, 0xdf, 0xd5, 0x11, 0xca, 0xd2, 0x89, 0xd7, 0x87, 0xf5, 0x24, 0xf6, 0xac, 0xd3, 0xc4, 0x7f, 0x5e, 0x68, - 0xf8, 0x35, 0xd2, 0xc8, 0x6f, 0xd2, 0x2f, 0x7d, 0x78, 0x7f, 0x6d, 0x2c, 0x75, 0xe4, 0xa1, 0x99, 0x5b, 0xa6, 0x49, 0x47, 0x8a, 0x67, 0xa2, 0xad, 0xda, 0x1d, 0xa5, 0x19, 0xc5, 0xf7, 0x74, 0x56, - 0xad, 0x9a, 0x92, 0x09, 0x69, 0x0d, 0xaa, 0x60, 0xb4, 0x5c, 0xc1, 0x46, 0x97, 0x58, 0x32, 0x00, 0x44, 0xad, 0xd3, 0xcb, 0x24, 0x49, 0x6b, 0xd9, 0xb6, 0xf5, 0x52, 0xd3, 0xb3, 0xf3, 0x39, 0x8d, - 0x24, 0x94, 0x36, 0x87, 0xc1, 0x45, 0x56, 0xc9, 0x86, 0x2c, 0x44, 0xa9, 0x42, 0xe7, 0xe0, 0x37, 0x86, 0xbd, 0x37, 0xfe, 0xed, 0xff, 0xce, 0x82, 0x74, 0x11, 0x78, 0x6d, 0xb6, 0x33, 0xd2, 0x56, - 0xa4, 0x31, 0x95, 0x95, 0xa3, 0x9a, 0xb6, 0x54, 0x2b, 0x45, 0xaa, 0xd8, 0x69, 0xca, 0xce, 0x09, 0x12, 0x47, 0x75, 0x6b, 0xfa, 0x38, 0x37, 0xe8, 0x87, 0x31, 0xf7, 0x23, 0x6d, 0xf8, 0x5b, 0x51, - 0xee, 0xfa, 0x69, 0x38, 0x1d, 0xf4, 0x52, 0xa6, 0xc7, 0x2f, 0xb1, 0x97, 0xd6, 0x7f, 0x9c, 0x4c, 0xa0, 0x71, 0xd9, 0x1d, 0x24, 0xa6, 0xc4, 0x06, 0xce, 0xce, 0xd3, 0xa0, 0xc0, 0x22, 0xa5, 0x3f, - 0xa8, 0xf2, 0x86, 0xb1, 0x94, 0xae, 0x3c, 0x88, 0xba, 0x50, 0x54, 0x5c, 0x15, 0x6a, 0x04, 0xbd, 0xee, 0x30, 0x7d, 0x43, 0x05, 0x49, 0x9d, 0xc0, 0x50, 0x37, 0x87, 0x86, 0xdc, 0x9c, 0xf1, 0x1d, - 0xbe, 0x5a, 0xe5, 0x14, 0x2e, 0x9a, 0x42, 0x39, 0x85, 0x81, 0xc2, 0x85, 0x95, 0xb6, 0x5d, 0x88, 0xdd, 0x91, 0x8c, 0x22, 0x85, 0x7d, 0xcd, 0x4d, 0x70, 0x8d, 0xc5, 0x0e, 0x6f, 0x9f, 0x12, 0x74, - 0xff, 0x31, 0x5e, 0x2b, 0x15, 0xc6, 0x5e, 0xeb, 0xa5, 0x55, 0x50, 0x7b, 0xe1, 0xcd, 0x89, 0x80, 0x7c, 0xa1, 0xa0, 0xff, 0x95, 0xac, 0x74, 0xf9, 0xf7, 0xd8, 0x9d, 0xb3, 0xfd, 0x8f, 0xf2, 0x76, - 0xfe, 0x07, 0xfa, 0x32, 0x06, 0x2f, 0xdd, 0x9b, 0x95, 0xee, 0xe4, 0xd2, 0xc7, 0x1f, 0xff, 0xfc, 0x89, 0x71, 0x38, 0x6b, 0xbd, 0x32, 0xce, 0x2c, 0xf7, 0x32, 0xbd, 0xd4, 0xbf, 0xad, 0x3b, 0x07, - 0x7f, 0x71, 0xce, 0x8f, 0xee, 0xef, 0xef, 0xf2, 0x2f, 0x1d, 0xff, 0xfd, 0xea, 0xd5, 0xbd, 0x31, 0x42, 0x9b, 0xb0, 0x49, 0xdd, 0xb4, 0x93, 0xa0, 0x89, 0xd2, 0x42, 0xcc, 0x36, 0x90, 0x49, 0x88, - 0xf2, 0x99, 0x06, 0xd3, 0xc0, 0xdf, 0xa6, 0x0b, 0x88, 0x32, 0xf7, 0xcb, 0xdd, 0xf9, 0x1c, 0xed, 0x85, 0xce, 0x3b, 0xda, 0xb8, 0x38, 0xcd, 0x66, 0x34, 0x4d, 0xe7, 0x3d, 0xea, 0x4f, 0x1b, 0x44, - 0x01, 0x7d, 0xf4, 0xc0, 0x59, 0xf4, 0x7c, 0xbf, 0x8d, 0x88, 0xed, 0x3a, 0xe5, 0x54, 0x5f, 0x87, 0x33, 0xb6, 0xae, 0x0b, 0x7f, 0x44, 0x7e, 0xcf, 0xe7, 0x00, 0xe6, 0xf7, 0x80, 0xb7, 0x87, 0x88, - 0xe6, 0x93, 0x38, 0x4c, 0xc2, 0x67, 0x5a, 0x29, 0xf2, 0x52, 0xe0, 0xe5, 0x9b, 0x4c, 0x70, 0xf2, 0x7e, 0x74, 0x4d, 0x6e, 0x1d, 0x31, 0x3b, 0x82, 0x20, 0x45, 0x25, 0xac, 0xb6, 0x5b, 0xf7, 0x54, - 0xdc, 0xcf, 0xcf, 0x9d, 0x4b, 0xd3, 0xb3, 0xfd, 0x9a, 0x47, 0x84, 0x41, 0x9b, 0xc1, 0x08, 0xe0, 0xad, 0x0c, 0x52, 0x60, 0x78, 0x64, 0x57, 0xf0, 0x09, 0x7d, 0xf2, 0x36, 0xea, 0xb4, 0xe8, 0x95, - 0x56, 0x6b, 0x76, 0xc3, 0x3e, 0x4a, 0x50, 0x56, 0x4d, 0xf2, 0xd9, 0x42, 0x68, 0x58, 0xdf, 0x39, 0xd1, 0xab, 0x62, 0x61, 0x1d, 0x38, 0x95, 0xe9, 0x6d, 0xe2, 0xb5, 0xef, 0x25, 0x9f, 0xd4, 0xe5, - 0xf0, 0xf1, 0x1d, 0x3c, 0x07, 0x2f, 0xfb, 0x6d, 0xca, 0xc1, 0x2b, 0xeb, 0xcd, 0xbb, 0xd0, 0x1b, 0x7c, 0xd9, 0x5b, 0x92, 0xc1, 0xa8, 0xd5, 0x45, 0x21, 0xa7, 0xa6, 0x09, 0x42, 0x1d, 0xdd, 0x6f, - 0xb8, 0x06, 0xcd, 0x0c, 0x21, 0x3e, 0x53, 0xd1, 0x00, 0x9e, 0xec, 0xa0, 0x12, 0xcb, 0x1d, 0xb9, 0xdb, 0x98, 0xa4, 0xdc, 0x2f, 0x96, 0xb3, 0xe3, 0x1a, 0x07, 0x58, 0x24, 0xa9, 0x59, 0x0d, 0xf1, - 0x37, 0x88, 0x23, 0xd5, 0xb3, 0x00, 0x76, 0x96, 0xc6, 0x69, 0x5b, 0xd9, 0x67, 0xf6, 0x40, 0xae, 0x80, 0x45, 0xa6, 0x6c, 0x3c, 0xc2, 0xa8, 0xa1, 0x6c, 0x43, 0xbe, 0xb6, 0x61, 0xfd, 0x35, 0xae, - 0x6e, 0xd1, 0x37, 0x4f, 0x11, 0xbc, 0xc1, 0xfc, 0x78, 0xf0, 0xbd, 0x12, 0x39, 0x71, 0x95, 0x78, 0xc5, 0xae, 0x2e, 0x87, 0x6b, 0x4c, 0xcd, 0x18, 0xe0, 0xb0, 0x54, 0xa6, 0x0f, 0x7b, 0x5a, 0x85, - 0x66, 0x53, 0x06, 0xc5, 0x41, 0xee, 0x84, 0x36, 0x6b, 0x1f, 0x24, 0x75, 0xc3, 0xde, 0x3a, 0x43, 0x16, 0xec, 0x36, 0x6e, 0x4b, 0xf7, 0x2b, 0x65, 0x27, 0x1e, 0x03, 0x36, 0xc6, 0x3c, 0x12, 0x0e, - 0x0e, 0x19, 0x97, 0xce, 0xc4, 0xed, 0x79, 0xea, 0x68, 0x96, 0xde, 0x4b, 0xc8, 0x0a, 0x86, 0x36, 0xfb, 0x39, 0x80, 0x46, 0x82, 0xdb, 0xb6, 0xd9, 0xa6, 0x23, 0xdc, 0x31, 0x5e, 0xc8, 0xfb, 0x0a, - 0x32, 0x4f, 0x2d, 0x43, 0x7f, 0x8e, 0xc3, 0x67, 0xc9, 0x17, 0x3c, 0x3e, 0x9f, 0x8f, 0xf5, 0xf9, 0x73, 0x5b, 0x64, 0xa1, 0x29, 0xf9, 0xf6, 0x40, 0x81, 0x19, 0x40, 0x77, 0x94, 0x51, 0xd4, 0xbe, - 0x69, 0xca, 0xbe, 0xa8, 0x68, 0xa6, 0x71, 0xb2, 0x43, 0x77, 0x31, 0x3d, 0xe1, 0x65, 0x1e, 0x83, 0xc1, 0x1c, 0x6d, 0xeb, 0xe5, 0x72, 0xe6, 0x73, 0x09, 0xb2, 0xf2, 0x43, 0xa2, 0xd0, 0x0e, 0x80, - 0x93, 0x31, 0xdc, 0xa9, 0x54, 0x37, 0x26, 0xdd, 0x2f, 0x50, 0x3e, 0xab, 0xf1, 0x93, 0x53, 0x29, 0x71, 0x00, 0xbc, 0xb6, 0x19, 0xba, 0xa8, 0x9d, 0x55, 0x58, 0x7f, 0x09, 0x64, 0x7d, 0x3c, 0xa4, - 0xae, 0x19, 0xf6, 0x51, 0xf5, 0x74, 0x69, 0xc0, 0x5f, 0x1b, 0x57, 0x1f, 0x62, 0x6f, 0x60, 0xbe, 0x9d, 0x4c, 0xf0, 0x71, 0x23, 0xcc, 0x1a, 0xe6, 0x9b, 0x36, 0x01, 0xf3, 0x60, 0xce, 0xf5, 0xd2, - 0xc9, 0x50, 0x76, 0x73, 0x81, 0x42, 0x42, 0xa6, 0x73, 0x6a, 0x0a, 0x5c, 0x64, 0xe9, 0x6e, 0x71, 0x9c, 0xef, 0x7a, 0xad, 0x67, 0xc8, 0xd6, 0x23, 0xa2, 0xe5, 0xf1, 0x58, 0xb1, 0x31, 0xe6, 0x9b, - 0x87, 0xed, 0x4c, 0x56, 0xc4, 0xe3, 0x36, 0xdb, 0x84, 0xcd, 0x01, 0xcc, 0xdc, 0x80, 0x2d, 0xb9, 0xf3, 0x56, 0x37, 0x3b, 0x3b, 0xf4, 0xe7, 0x94, 0xf2, 0x1a, 0x92, 0xff, 0xdb, 0xb6, 0x6c, 0x2f, - 0x06, 0xaf, 0x19, 0x31, 0x7e, 0x69, 0x25, 0x37, 0xdb, 0x0e, 0x79, 0xaf, 0xc8, 0xdf, 0x12, 0x07, 0xae, 0x64, 0x6f, 0x7f, 0x5f, 0x0b, 0xb9, 0x7c, 0x59, 0xd2, 0x7f, 0xa2, 0x55, 0xb8, 0x7c, 0xf5, - 0x77, 0xb5, 0x5f, 0x1e, 0x65, 0x80, 0xde, 0xf4, 0x7a, 0xe2, 0x59, 0x4f, 0xd6, 0xc1, 0x45, 0xcf, 0xae, 0x9e, 0x56, 0x59, 0x78, 0x8d, 0x27, 0xe4, 0x93, 0xdc, 0x6b, 0x5f, 0x7e, 0x9c, 0x8d, 0xe5, - 0x0a, 0xb1, 0x4e, 0xd3, 0xed, 0x80, 0x6f, 0xc9, 0xc8, 0xb0, 0x11, 0xad, 0x73, 0xbc, 0x01, 0x67, 0xf3, 0xf6, 0x88, 0x6c, 0x32, 0xda, 0x01, 0xcd, 0x55, 0xc0, 0xef, 0x78, 0x69, 0x37, 0x4b, 0x94, - 0x64, 0x38, 0xca, 0x15, 0xd7, 0x9d, 0x0e, 0x87, 0x1a, 0xf2, 0x4d, 0x0b, 0x2a, 0xca, 0x5a, 0x38, 0x03, 0x09, 0x51, 0xaf, 0xf7, 0xf4, 0xd2, 0x37, 0xb7, 0x14, 0x9b, 0x26, 0x33, 0x4c, 0xe0, 0x30, - 0x5e, 0x1b, 0x48, 0x70, 0x8c, 0xbd, 0xe4, 0x41, 0xb5, 0xfe, 0xff, 0x72, 0xc6, 0xf8, 0x2a, 0xfc, 0x1d, 0x9b, 0x4f, 0x97, 0xc6, 0xcc, 0x1b, 0xf0, 0x84, 0x85, 0x9a, 0x9d, 0xb5, 0x14, 0x0f, 0xa2, - 0x0c, 0x50, 0x5e, 0x85, 0x97, 0xd3, 0x7d, 0x6e, 0xa5, 0x41, 0xed, 0xe8, 0xf0, 0x88, 0x6c, 0xbe, 0xeb, 0x2b, 0x4f, 0xde, 0xb3, 0x45, 0x01, 0x7d, 0xc9, 0x2e, 0xf1, 0x2e, 0xf4, 0xbd, 0x49, 0x27, - 0x6f, 0xb8, 0x86, 0xfa, 0x8c, 0x98, 0x02, 0xb3, 0x28, 0xf1, 0x44, 0xa8, 0x70, 0x81, 0x01, 0x8a, 0xaa, 0xf3, 0xa2, 0xce, 0x0c, 0x8c, 0x2a, 0x21, 0xd9, 0x2b, 0x70, 0xb7, 0x13, 0x16, 0xa7, 0x55, - 0x3c, 0x97, 0x1a, 0x62, 0x8b, 0xfb, 0x18, 0x1c, 0xfb, 0xa7, 0xaa, 0xd3, 0x9b, 0x4d, 0x6d, 0x94, 0xc1, 0x31, 0xdb, 0xe7, 0x7c, 0x3a, 0xac, 0x9c, 0x65, 0x82, 0x60, 0x6a, 0x50, 0xf4, 0x00, 0xbe, - 0x2f, 0x12, 0x64, 0x95, 0xee, 0x3a, 0x3e, 0x58, 0x10, 0xe3, 0x96, 0x86, 0x3a, 0x98, 0xbc, 0xf3, 0x9f, 0x3c, 0xeb, 0xe5, 0x3f, 0x77, 0x97, 0xff, 0x12, 0xfb, 0x0e, 0xc6, 0xed, 0x2b, 0x86, 0xc7, - 0x71, 0xd8, 0xf1, 0xcc, 0xfa, 0x2c, 0x1f, 0x16, 0x8b, 0x85, 0xac, 0x00, 0x03, 0x46, 0x9d, 0xa7, 0x28, 0x0d, 0x2d, 0x5c, 0x68, 0xd0, 0x6d, 0x2a, 0xa7, 0x67, 0x03, 0xa7, 0x65, 0xe0, 0x09, 0x37, - 0x0c, 0xd7, 0x38, 0xe6, 0x06, 0x02, 0x22, 0x8b, 0x4a, 0xaa, 0x4e, 0xd5, 0xba, 0x2c, 0xc8, 0x58, 0x5a, 0xf6, 0xe5, 0x50, 0x1e, 0xa4, 0x14, 0xf6, 0x22, 0x8e, 0xc8, 0xe8, 0x9c, 0xb2, 0x82, 0x56, - 0x5a, 0x6d, 0x19, 0xaa, 0x1a, 0x3d, 0xf4, 0x2f, 0x1b, 0x89, 0xff, 0x7e, 0x2a, 0xb8, 0x48, 0x7d, 0x07, 0xe3, 0xba, 0x55, 0x19, 0x39, 0x0d, 0x1c, 0x99, 0x8d, 0x4d, 0x59, 0xa6, 0xc0, 0x78, 0x0c, - 0x58, 0x9b, 0x5a, 0x35, 0x95, 0x09, 0xa0, 0x80, 0xd6, 0x53, 0xa1, 0x3b, 0xb9, 0x31, 0xd1, 0x0b, 0x07, 0x6a, 0x1f, 0xa5, 0x9c, 0x8c, 0x16, 0xeb, 0xc3, 0x1a, 0x22, 0x6c, 0x57, 0x38, 0x9e, 0xec, - 0x59, 0xcc, 0xab, 0xd4, 0xca, 0xf5, 0xa5, 0x6a, 0x55, 0xb1, 0x67, 0x64, 0xa6, 0xc1, 0xa5, 0x78, 0xd8, 0xa3, 0x7a, 0x23, 0x2e, 0x62, 0xea, 0x2c, 0xd3, 0xed, 0x28, 0x2c, 0x1e, 0x44, 0x27, 0xdf, - 0x6b, 0x4e, 0x7f, 0x6e, 0xa8, 0x7a, 0x1e, 0x95, 0x3c, 0xc2, 0x40, 0x55, 0x40, 0x02, 0x38, 0xf5, 0xcc, 0xe5, 0x39, 0x29, 0x21, 0xba, 0x89, 0xf5, 0x41, 0xee, 0x44, 0xdf, 0x8c, 0xea, 0xce, 0x04, - 0x95, 0x99, 0x19, 0xdb, 0x22, 0xba, 0x41, 0xe7, 0x8b, 0xf2, 0x50, 0x9e, 0x70, 0x68, 0x8f, 0xd0, 0x3b, 0x63, 0x45, 0xce, 0x06, 0x0f, 0x5a, 0xb4, 0xde, 0x89, 0x35, 0xd0, 0x95, 0x0c, 0x8b, 0x35, - 0xc2, 0x2c, 0x1b, 0xa8, 0xf4, 0x80, 0x03, 0x62, 0x2e, 0x57, 0xb9, 0x70, 0x6a, 0xb4, 0x31, 0xd1, 0x81, 0x79, 0x98, 0x3e, 0xe3, 0x4a, 0xa6, 0x5e, 0xab, 0x21, 0x70, 0x91, 0x78, 0x85, 0x20, 0xcd, - 0x26, 0xd4, 0xc8, 0x7a, 0x01, 0x26, 0xe2, 0x6d, 0x76, 0x6d, 0x5c, 0xc6, 0x48, 0xb9, 0xa4, 0x72, 0xdc, 0x6b, 0x3d, 0x51, 0x4d, 0xf7, 0xae, 0x8b, 0xd1, 0xd1, 0xfa, 0x44, 0xd5, 0x74, 0xc5, 0x9f, - 0x96, 0x86, 0xb9, 0xdd, 0x70, 0x4b, 0x19, 0xd3, 0xf6, 0x01, 0xc2, 0x85, 0xb0, 0x23, 0xed, 0xa4, 0x0a, 0xf5, 0x34, 0xb9, 0xb0, 0x22, 0x20, 0x0d, 0x77, 0xe8, 0x31, 0xc2, 0xd4, 0x53, 0x56, 0x7a, - 0x99, 0xa5, 0x1d, 0x59, 0xd4, 0xd4, 0x8c, 0x11, 0xfb, 0x3c, 0xab, 0xce, 0x92, 0xd0, 0x99, 0x54, 0xf1, 0x2d, 0xb5, 0xfb, 0x81, 0x3d, 0xee, 0xba, 0xb7, 0x2f, 0x3d, 0xf7, 0xdd, 0x3a, 0xfc, 0x75, - 0x02, 0x7d, 0x62, 0x3d, 0x7b, 0x90, 0xda, 0x74, 0x85, 0xe3, 0xdd, 0xce, 0x3c, 0xa9, 0x4b, 0x2b, 0xad, 0xf2, 0xac, 0xbc, 0xca, 0x6c, 0xbf, 0xbd, 0xf4, 0xfa, 0x70, 0x55, 0xbb, 0x93, 0xca, 0x2b, - 0xc3, 0xab, 0xab, 0xe6, 0x4d, 0x29, 0x20, 0xbe, 0x3d, 0x39, 0x86, 0x6c, 0xa2, 0x68, 0x42, 0xe7, 0x34, 0xf1, 0xb3, 0x32, 0xb1, 0xea, 0x49, 0x93, 0x7a, 0x95, 0x63, 0xe5, 0xb7, 0x6e, 0xbc, 0x3a, - 0xc1, 0xbe, 0xd8, 0x32, 0x4a, 0xcf, 0x8a, 0x27, 0x6f, 0x60, 0xfd, 0x7d, 0xb3, 0x36, 0xdc, 0x65, 0x7b, 0x55, 0x96, 0xef, 0x7d, 0xa3, 0xc0, 0xf9, 0x50, 0x59, 0xbe, 0x86, 0x76, 0x64, 0x69, 0xe8, - 0x4c, 0xec, 0xec, 0xad, 0x76, 0xe3, 0xb7, 0x78, 0x8c, 0x3a, 0xb8, 0x26, 0x68, 0x55, 0x75, 0xe9, 0x59, 0xc9, 0xdf, 0x3f, 0xed, 0x16, 0x9f, 0x22, 0xf8, 0x6c, 0x76, 0x7f, 0x6d, 0xec, 0x3e, 0x78, - 0xc7, 0xfb, 0x70, 0xfe, 0x7e, 0x67, 0x6c, 0xfd, 0x62, 0x87, 0x6c, 0x33, 0x5c, 0xca, 0x35, 0xac, 0x5b, 0xed, 0x30, 0x24, 0x50, 0x0f, 0xce, 0x1e, 0x57, 0x16, 0x15, 0x4f, 0x99, 0x71, 0x54, 0xa9, - 0xfe, 0x2c, 0x2a, 0x0e, 0xa0, 0x87, 0x54, 0x6c, 0x9f, 0xb0, 0x0b, 0xd6, 0x0c, 0x0b, 0x58, 0xe7, 0xd5, 0x1c, 0x5f, 0x18, 0x7c, 0xdd, 0x30, 0x4b, 0x42, 0x5e, 0x2c, 0x8b, 0xa9, 0x06, 0x7b, 0x47, - 0xad, 0x50, 0xec, 0x94, 0x57, 0x65, 0x9c, 0x6d, 0xcc, 0x44, 0x1a, 0x91, 0x4e, 0x7b, 0xc1, 0xf7, 0xbd, 0xa7, 0xde, 0x31, 0xc6, 0xbe, 0x91, 0x91, 0xe4, 0x71, 0x58, 0x23, 0x9f, 0xee, 0x3d, 0xc7, - 0xff, 0xfb, 0xa0, 0x7c, 0x04, 0x3e, 0xf1, 0xda, 0x16, 0xe1, 0xc1, 0x0b, 0xde, 0x91, 0xbf, 0xbb, 0x3c, 0x21, 0xc6, 0x6d, 0x1b, 0x56, 0xda, 0x71, 0x77, 0x56, 0x79, 0x4a, 0x87, 0x3b, 0x6c, 0xb6, - 0xd2, 0xf6, 0xdd, 0xa2, 0x54, 0x8e, 0xf5, 0x81, 0x92, 0x07, 0x89, 0x93, 0xa4, 0x90, 0x80, 0x9a, 0xa2, 0x85, 0xb2, 0x4d, 0xb3, 0x03, 0x7d, 0x89, 0xa6, 0x44, 0x27, 0x03, 0x25, 0x6f, 0x45, 0xc4, - 0xb3, 0xc6, 0xc1, 0xdc, 0x41, 0xa6, 0x04, 0xc1, 0x77, 0xd9, 0x6e, 0x58, 0x16, 0x7b, 0xc1, 0x99, 0xad, 0x68, 0x32, 0x65, 0xc2, 0x62, 0x51, 0x7c, 0xab, 0xe6, 0x95, 0xc7, 0xcd, 0x33, 0xbb, 0xe9, - 0x8b, 0xcb, 0x6a, 0xdc, 0x94, 0x97, 0x96, 0xc7, 0x4d, 0x39, 0x76, 0x31, 0xc5, 0x54, 0xce, 0xeb, 0x4a, 0xe3, 0x58, 0x30, 0x6c, 0x37, 0x6d, 0x0f, 0xc4, 0x59, 0x3c, 0x00, 0x34, 0x93, 0xc8, 0xb4, - 0x4a, 0xfb, 0x6b, 0x79, 0x53, 0x73, 0xad, 0x0d, 0x1e, 0xdc, 0x7c, 0x4b, 0xf7, 0x08, 0xae, 0xe3, 0x3e, 0xda, 0xeb, 0x2e, 0xe7, 0x0e, 0xd2, 0xe2, 0xc0, 0x76, 0xa7, 0x98, 0x5a, 0xc6, 0x60, 0x1d, - 0x93, 0x40, 0x6f, 0x7b, 0xcb, 0x62, 0xb7, 0x10, 0x00, 0x06, 0x07, 0xf7, 0x61, 0xf9, 0x2a, 0x69, 0xff, 0x83, 0x12, 0x78, 0xb7, 0xd0, 0xb3, 0x67, 0x23, 0xeb, 0xb3, 0xfd, 0xf3, 0x99, 0x35, 0xf2, - 0x05, 0xad, 0xf5, 0x43, 0xec, 0x05, 0xcb, 0x8f, 0x93, 0xb1, 0x35, 0xa1, 0xdb, 0x93, 0xc3, 0xc8, 0xa5, 0x62, 0x66, 0xf0, 0xd6, 0xe4, 0xed, 0x14, 0x57, 0x78, 0x4e, 0xce, 0x8f, 0xa0, 0x96, 0xac, - 0xb6, 0x04, 0x5e, 0x64, 0x9a, 0x16, 0x38, 0xdc, 0xc6, 0x07, 0x6d, 0xdc, 0xcb, 0xe3, 0xd3, 0xc9, 0x2a, 0x75, 0x28, 0x99, 0x9e, 0xa9, 0x3c, 0x9f, 0x5b, 0x35, 0x96, 0xc4, 0x52, 0xa1, 0x56, 0x5a, - 0x3e, 0x88, 0x8d, 0x71, 0x94, 0xd0, 0x83, 0x32, 0x94, 0xc6, 0x72, 0x77, 0xd6, 0x47, 0x95, 0x1c, 0xcf, 0x4b, 0xaf, 0xae, 0xc3, 0xa7, 0xd4, 0xd6, 0x2f, 0x1a, 0x15, 0xdf, 0x84, 0xde, 0xa0, 0xb8, - 0x1e, 0x8e, 0x35, 0x2b, 0x9e, 0xf4, 0x5a, 0xc2, 0x2a, 0x88, 0x3f, 0x83, 0x8c, 0x06, 0xae, 0xd6, 0xd3, 0xad, 0xab, 0x05, 0xb4, 0x4f, 0x82, 0x62, 0x22, 0x6b, 0x5b, 0xfd, 0xc4, 0x96, 0x60, 0x09, - 0x6a, 0x27, 0x05, 0x6d, 0x87, 0x15, 0x00, 0xb5, 0x94, 0x95, 0xec, 0x99, 0x3e, 0xb4, 0xb6, 0x3b, 0xfe, 0x5c, 0x51, 0xe2, 0x2c, 0x1e, 0x6a, 0x9f, 0xd7, 0x74, 0x90, 0x6c, 0xb6, 0xaa, 0xb0, 0xd2, - 0x08, 0x92, 0x1c, 0xf8, 0x4d, 0x8c, 0x8d, 0xd2, 0xd3, 0xde, 0x7f, 0x68, 0x7c, 0xf9, 0x59, 0xe5, 0x24, 0xf0, 0xe2, 0xfc, 0xf9, 0xa4, 0xf3, 0xe2, 0x8c, 0xff, 0xf8, 0x1d, 0x9f, 0x61, 0xfa, 0x7a, - 0x67, 0xec, 0x8c, 0xcf, 0xd9, 0x1b, 0xc4, 0x91, 0xa7, 0x69, 0x69, 0xed, 0x76, 0x2a, 0x3b, 0x15, 0x11, 0xbd, 0x53, 0xbb, 0xc2, 0x3f, 0xc7, 0x34, 0x1b, 0x0b, 0xa2, 0x61, 0xc4, 0xc0, 0x2e, 0x58, - 0x80, 0x07, 0x60, 0x49, 0x59, 0xd3, 0x46, 0x8c, 0xc1, 0x4c, 0x2d, 0x66, 0x70, 0x87, 0x2c, 0x78, 0x1c, 0x5b, 0x07, 0x90, 0x14, 0x0f, 0xca, 0xce, 0xa5, 0x14, 0x5f, 0x33, 0xd6, 0xa8, 0x93, 0x1d, - 0x76, 0xd8, 0x5e, 0x91, 0xe4, 0x67, 0x79, 0x8f, 0x3f, 0x7c, 0x90, 0x57, 0x1d, 0xc6, 0x0d, 0x7d, 0xff, 0xef, 0x77, 0x8b, 0xc1, 0x13, 0x66, 0xd4, 0x37, 0x6d, 0xe2, 0xa9, 0x0f, 0x08, 0x7e, 0x89, - 0x58, 0xf9, 0x4d, 0xea, 0x15, 0xd2, 0x9b, 0xb6, 0xf2, 0x26, 0xe9, 0x67, 0x10, 0x1d, 0x97, 0xf3, 0x7c, 0xd0, 0x2d, 0x35, 0x36, 0x1b, 0x5c, 0x06, 0x5e, 0x57, 0xc2, 0xb9, 0x61, 0x7d, 0x0a, 0x86, - 0xa0, 0xd4, 0x8c, 0x01, 0x6e, 0x0f, 0x0c, 0x96, 0xe3, 0x20, 0xf6, 0xc2, 0xf1, 0x5c, 0xdc, 0x9f, 0x2a, 0xd1, 0x09, 0x3b, 0x03, 0x5a, 0xcd, 0xaa, 0xfb, 0x59, 0x33, 0x95, 0x03, 0x29, 0x9c, 0x46, - 0x60, 0xe4, 0x27, 0x33, 0xb9, 0x81, 0x12, 0x61, 0x61, 0x60, 0xdd, 0xca, 0xa5, 0x59, 0xea, 0xfb, 0xfc, 0xfd, 0x4d, 0x89, 0xfa, 0x0f, 0xed, 0xa9, 0x5f, 0x65, 0x7f, 0x02, 0xe1, 0xed, 0xca, 0x58, - 0x1b, 0x2b, 0x08, 0x6b, 0x26, 0x05, 0x1c, 0xb6, 0x91, 0x42, 0x58, 0xad, 0x26, 0x1d, 0x97, 0xde, 0x42, 0x76, 0xc9, 0x1d, 0xb3, 0x4d, 0xd8, 0x2d, 0x3c, 0xc3, 0x93, 0x39, 0xec, 0x29, 0x7a, 0x35, - 0x4f, 0xf0, 0xbd, 0x55, 0xc6, 0x62, 0xd2, 0x83, 0xdd, 0xbc, 0xb2, 0x70, 0x6e, 0x61, 0xf5, 0x5c, 0x02, 0xe1, 0x33, 0x49, 0x51, 0xea, 0x81, 0x03, 0x17, 0x3d, 0x88, 0xf6, 0x05, 0xba, 0x6f, 0x94, - 0xb6, 0xc0, 0xc9, 0xe2, 0x5b, 0xf9, 0xd2, 0xbc, 0xcc, 0x8e, 0xe5, 0xf3, 0x21, 0x80, 0xbc, 0x14, 0x5f, 0xf6, 0x2e, 0xf4, 0xd6, 0xf8, 0xeb, 0xe1, 0x35, 0xc8, 0x7a, 0x84, 0x03, 0x88, 0x94, 0xc3, - 0x65, 0xcd, 0xc7, 0x31, 0xce, 0xbb, 0xe9, 0x66, 0x25, 0x74, 0x30, 0x04, 0xad, 0x00, 0xaa, 0x5f, 0xeb, 0x0a, 0x7e, 0xd4, 0x90, 0x6d, 0xa7, 0x19, 0xa7, 0x3d, 0x11, 0xae, 0x5b, 0x0b, 0xb2, 0xf5, - 0xb0, 0x36, 0x37, 0x16, 0xa8, 0x0b, 0xe5, 0xce, 0x76, 0x93, 0x23, 0x5a, 0x22, 0x7a, 0x6a, 0x85, 0xee, 0x79, 0xba, 0x6d, 0x12, 0x17, 0x3a, 0xc8, 0x96, 0x50, 0x9a, 0x31, 0x3b, 0x3d, 0x4c, 0xab, - 0x31, 0x01, 0x0d, 0x79, 0x99, 0x25, 0x13, 0x27, 0x0e, 0x7f, 0x93, 0x45, 0x86, 0xbd, 0x66, 0x4b, 0xf9, 0x25, 0xf8, 0x86, 0xc7, 0xfb, 0xd9, 0xe4, 0x26, 0xf0, 0x67, 0x4c, 0x02, 0x56, 0x45, 0x91, - 0x82, 0x54, 0xcd, 0x2d, 0x3e, 0xb5, 0x0f, 0xeb, 0x2d, 0xa7, 0xd6, 0x09, 0xba, 0x42, 0xe4, 0x72, 0x8d, 0x1e, 0xb5, 0x36, 0x9b, 0x9f, 0xc2, 0x58, 0x9f, 0x56, 0x2c, 0x4c, 0xe0, 0xa7, 0x0a, 0x2e, - 0xfc, 0x38, 0x68, 0x8e, 0x87, 0xb9, 0xb7, 0x01, 0x76, 0xf0, 0x3a, 0x5a, 0x1b, 0xcb, 0x76, 0xa8, 0xd1, 0x0c, 0x3f, 0x45, 0x04, 0x05, 0x14, 0xa8, 0xed, 0x04, 0x59, 0x99, 0x44, 0xe9, 0x79, 0x04, - 0x95, 0x4d, 0xed, 0x86, 0xc7, 0x4f, 0x54, 0x07, 0xcf, 0xc2, 0x09, 0xf2, 0x32, 0xeb, 0x87, 0x89, 0xe5, 0xba, 0xcf, 0x17, 0xb0, 0x97, 0x0c, 0x2f, 0x1f, 0x62, 0x6f, 0xb0, 0xbd, 0x9d, 0x5c, 0x07, - 0xd2, 0x08, 0xc3, 0x4b, 0x1c, 0x6f, 0x2b, 0x81, 0xdf, 0xa9, 0x8c, 0x2a, 0xef, 0x31, 0x2c, 0x72, 0x4b, 0x15, 0x94, 0x50, 0xb2, 0x88, 0xd3, 0xd0, 0x0f, 0x6b, 0x46, 0x06, 0xcc, 0xae, 0x4c, 0x12, - 0xd3, 0xc9, 0x76, 0x9b, 0x81, 0xdf, 0xb4, 0xb5, 0xd9, 0xe7, 0xc3, 0x01, 0x4a, 0x11, 0xd0, 0x66, 0x40, 0x11, 0xab, 0x67, 0x34, 0x6d, 0x82, 0xc7, 0xf5, 0xc2, 0x35, 0x55, 0x72, 0x23, 0x94, 0x56, - 0xb6, 0x81, 0x01, 0xdd, 0xa0, 0x47, 0xec, 0x30, 0xfd, 0xac, 0xec, 0xac, 0xd2, 0xbd, 0x35, 0xef, 0xdb, 0x5e, 0xea, 0x73, 0x99, 0xe4, 0xb7, 0x9a, 0xc8, 0x8f, 0x31, 0xfd, 0x12, 0x60, 0xff, 0x78, - 0xf5, 0xfb, 0x1c, 0x72, 0x3f, 0x1a, 0xd4, 0x5f, 0x72, 0x2f, 0xa8, 0xfe, 0x3a, 0xbb, 0x06, 0x1c, 0x51, 0x3f, 0xc3, 0x4a, 0x92, 0x8c, 0xd9, 0xf5, 0xdb, 0xa4, 0xdf, 0xa4, 0x0d, 0x6a, 0x29, 0x38, - 0x86, 0xa8, 0x80, 0x4e, 0xb1, 0x43, 0x2e, 0x9e, 0x6d, 0x7f, 0x0d, 0xcc, 0x71, 0x7d, 0xcb, 0x9c, 0xd0, 0x46, 0x8b, 0xb4, 0x3e, 0x25, 0x60, 0x1c, 0xb6, 0x56, 0x02, 0x57, 0x07, 0x9a, 0xa1, 0xe8, - 0xfb, 0x62, 0x0f, 0x2f, 0xf0, 0x6c, 0xdd, 0x1e, 0x81, 0x38, 0xb2, 0x2c, 0x44, 0x5a, 0x87, 0xc0, 0xc1, 0x6f, 0xe7, 0xd2, 0x96, 0x1a, 0xa5, 0x1b, 0x34, 0xe9, 0xe0, 0x64, 0xee, 0xef, 0x62, 0x55, - 0x5e, 0xf8, 0x36, 0xdf, 0x84, 0x5e, 0xb0, 0x78, 0x3b, 0x1c, 0x53, 0x92, 0xee, 0x02, 0x84, 0xae, 0x54, 0x4a, 0xe4, 0xfa, 0x40, 0x84, 0x27, 0x31, 0x30, 0x80, 0x04, 0xb7, 0x59, 0xca, 0xa6, 0x5d, - 0xb2, 0x20, 0x95, 0x23, 0xc6, 0xd1, 0x82, 0xd6, 0x72, 0xed, 0x16, 0xfb, 0x95, 0x81, 0xe8, 0x1e, 0x9e, 0x05, 0x6b, 0x99, 0x99, 0x56, 0x16, 0xb3, 0x5e, 0xf3, 0x72, 0x9b, 0x4f, 0x01, 0x71, 0x37, - 0xcb, 0xcb, 0x43, 0xeb, 0xb5, 0xae, 0x6e, 0x0e, 0x76, 0x1a, 0x21, 0x4e, 0x4b, 0x49, 0x0b, 0x17, 0xfa, 0xb6, 0x52, 0x15, 0xcf, 0x77, 0x5c, 0xf0, 0x2b, 0x0d, 0x2e, 0x2e, 0x73, 0x72, 0x71, 0xd9, - 0x4e, 0xc1, 0xa3, 0x5a, 0x09, 0x75, 0x55, 0x79, 0x3e, 0xee, 0xcf, 0xe0, 0x89, 0x3e, 0xac, 0xbc, 0xa6, 0xdf, 0x45, 0x69, 0xce, 0xcd, 0x71, 0xa2, 0x3c, 0x1b, 0x75, 0x49, 0xac, 0xf7, 0x20, 0x32, - 0xeb, 0x16, 0xad, 0x60, 0xc9, 0x01, 0xbb, 0xca, 0x0c, 0x0b, 0xb6, 0x38, 0x89, 0xe2, 0xed, 0x73, 0xa3, 0xc2, 0x0a, 0xd4, 0xa8, 0xc6, 0xf6, 0xc4, 0xe7, 0xda, 0x6c, 0x2f, 0x45, 0x50, 0x0c, 0xce, - 0x79, 0x7a, 0x3d, 0x23, 0xb0, 0x35, 0x91, 0x6e, 0x7f, 0xfe, 0x8a, 0xfe, 0xa4, 0xf4, 0x78, 0xd1, 0x78, 0x8d, 0x37, 0xb9, 0x32, 0x33, 0xd4, 0x56, 0x75, 0xfa, 0xcd, 0x96, 0xe2, 0xcf, 0x57, 0xb2, - 0x3b, 0xd9, 0x17, 0xf0, 0xbe, 0x5e, 0x19, 0x1b, 0xd8, 0x20, 0x36, 0x96, 0xb8, 0xb3, 0x08, 0x3f, 0xde, 0xec, 0xf1, 0xb5, 0xb5, 0x33, 0xb6, 0xe7, 0x75, 0x76, 0x82, 0xb0, 0xf5, 0x79, 0xcf, 0xc3, - 0x73, 0x9a, 0xb0, 0xb8, 0xa0, 0xc5, 0x4b, 0x9f, 0xd7, 0x50, 0xf9, 0x58, 0xd0, 0x80, 0x80, 0xcc, 0x83, 0xdc, 0xdc, 0xa6, 0xf4, 0x9c, 0x0a, 0xa8, 0x10, 0x33, 0xd9, 0xd3, 0x6c, 0x47, 0xe9, 0xb8, - 0x52, 0x9c, 0x98, 0xd9, 0x92, 0x26, 0x4b, 0x2c, 0xf0, 0x22, 0x74, 0x33, 0x1d, 0xb3, 0xae, 0x3d, 0xb5, 0x05, 0x3d, 0xdb, 0xbd, 0xfe, 0x39, 0x43, 0xc6, 0xe3, 0x57, 0x5c, 0xb1, 0x7a, 0x74, 0x63, - 0x2c, 0x73, 0x46, 0x6d, 0xcc, 0xe1, 0x2d, 0x1c, 0x1c, 0x07, 0xa5, 0x59, 0x1e, 0xe3, 0xec, 0x00, 0x1a, 0x7a, 0x85, 0x74, 0x30, 0xde, 0xa4, 0xf2, 0x21, 0xa0, 0x0a, 0xbf, 0x01, 0x8b, 0xf9, 0xde, - 0x0f, 0xf6, 0x86, 0x95, 0x58, 0x1d, 0xe9, 0x0f, 0x41, 0x93, 0x6c, 0x2c, 0x64, 0xe0, 0x72, 0x77, 0x97, 0x51, 0x64, 0x6b, 0xa0, 0x48, 0xb9, 0x72, 0xe2, 0x08, 0xc0, 0x7c, 0xcd, 0xd8, 0xea, 0xaa, - 0x50, 0x4d, 0x17, 0xcb, 0xf6, 0x9b, 0x02, 0x74, 0xfb, 0x8d, 0x71, 0xd9, 0xfc, 0x06, 0x92, 0x17, 0xbe, 0xb3, 0x77, 0xa9, 0x1f, 0x28, 0xc4, 0x65, 0x33, 0xb6, 0x1e, 0x1f, 0xad, 0x04, 0xf3, 0x3c, - 0x21, 0x21, 0xff, 0xec, 0x3a, 0xad, 0xb8, 0xf5, 0xe5, 0x6c, 0xc0, 0xa6, 0x2b, 0xcb, 0x4a, 0x37, 0xa7, 0x7d, 0xac, 0x68, 0x2c, 0xb2, 0x16, 0xce, 0x45, 0xe0, 0xac, 0xed, 0x60, 0xc7, 0x2a, 0x66, - 0x4b, 0xa6, 0xf2, 0xbe, 0x35, 0xd7, 0xae, 0x63, 0x90, 0x28, 0x04, 0xaf, 0xe4, 0xa4, 0xd5, 0x00, 0x30, 0x87, 0x94, 0xe3, 0x4a, 0x4b, 0xb7, 0x0c, 0xbf, 0xee, 0x43, 0xbf, 0xda, 0x92, 0x63, 0x36, - 0xa2, 0xef, 0xec, 0x49, 0x4f, 0xa0, 0x78, 0xcd, 0x11, 0xfc, 0x2e, 0x14, 0x9c, 0x7c, 0x1c, 0x8e, 0x75, 0x02, 0xab, 0x47, 0x62, 0x9a, 0x88, 0x52, 0xee, 0xb7, 0x1b, 0x86, 0x76, 0x90, 0x2d, 0xc5, - 0x28, 0xb9, 0x10, 0x45, 0x67, 0xb7, 0x2e, 0xd3, 0x76, 0xba, 0x74, 0x76, 0x82, 0x0e, 0x60, 0x87, 0xca, 0xec, 0x19, 0xd8, 0x32, 0x09, 0xf3, 0x5c, 0xae, 0x16, 0x64, 0x19, 0x9f, 0xf5, 0x59, 0xad, - 0xed, 0x87, 0x40, 0xe5, 0x77, 0xc2, 0xe6, 0x08, 0x91, 0x04, 0xad, 0x11, 0x9a, 0x82, 0x87, 0x66, 0xce, 0x40, 0xeb, 0xf0, 0xc5, 0x82, 0xdc, 0x6f, 0xdc, 0x5a, 0xbf, 0xe1, 0xa2, 0x42, 0xee, 0xa3, - 0xb4, 0x7e, 0xfb, 0xec, 0x3d, 0x87, 0xf0, 0x67, 0x27, 0xfc, 0xdf, 0xff, 0x83, 0xff, 0xc4, 0x3b, 0x45, 0x7c, 0x32, 0xad, 0x7c, 0x6a, 0xcc, 0xd3, 0x44, 0xb6, 0x6f, 0xe9, 0x10, 0xbf, 0x6e, 0xde, - 0xaf, 0xa3, 0xd4, 0x3f, 0xd3, 0x4f, 0x6f, 0x1e, 0xdf, 0xcf, 0x77, 0xef, 0x00, 0x27, 0xf7, 0x57, 0x26, 0x57, 0xd9, 0x5f, 0x7a, 0xfd, 0xaf, 0x67, 0x3d, 0x9f, 0xf4, 0x2b, 0x86, 0xb6, 0xa7, 0x7c, - 0x95, 0x10, 0x4c, 0x26, 0xad, 0xc9, 0x7e, 0x09, 0xe0, 0x80, 0x8e, 0x0d, 0x30, 0xaf, 0x82, 0xd8, 0x32, 0xc4, 0x21, 0x7e, 0x3a, 0xc7, 0xab, 0x55, 0xd5, 0x6d, 0xd0, 0xf5, 0x59, 0xe5, 0x77, 0x98, - 0xdd, 0x9d, 0x60, 0xb6, 0x8d, 0xdc, 0xd9, 0xb1, 0x35, 0x14, 0xcc, 0x3e, 0xef, 0xb1, 0xba, 0x51, 0xb7, 0xe1, 0x1c, 0xc6, 0xd9, 0x05, 0xe2, 0xe3, 0x4b, 0x9b, 0x6f, 0x8d, 0x51, 0x1c, 0x53, 0x63, - 0x3a, 0xf0, 0x39, 0x78, 0xaf, 0x26, 0x82, 0xfd, 0x69, 0x46, 0x0e, 0x32, 0x3e, 0x31, 0x0c, 0xc4, 0xe7, 0x82, 0x88, 0xee, 0x21, 0x05, 0xd3, 0xf7, 0x11, 0xc6, 0x38, 0x9c, 0xe5, 0xf5, 0x19, 0x50, - 0x66, 0xe6, 0xce, 0xdd, 0xb1, 0x1a, 0x08, 0xd1, 0x92, 0xb4, 0x57, 0xa4, 0x32, 0xea, 0xcf, 0x73, 0x0e, 0xee, 0x4a, 0x4d, 0x5f, 0x54, 0x9c, 0xad, 0x6c, 0xbc, 0x36, 0x8a, 0x57, 0x3c, 0x60, 0x32, - 0x0b, 0xac, 0x32, 0xe3, 0x75, 0x89, 0x2f, 0x18, 0xcc, 0xd0, 0xa0, 0xa1, 0x48, 0x4e, 0x1b, 0xc0, 0xa3, 0x9f, 0x43, 0x79, 0xd7, 0xfc, 0xa7, 0x89, 0x61, 0x0f, 0x32, 0x74, 0x2e, 0xaa, 0x17, 0xf6, - 0x45, 0xee, 0x2f, 0x04, 0xdf, 0xb4, 0x00, 0xf8, 0x3e, 0xdd, 0xf2, 0x4b, 0x8e, 0x0e, 0xf2, 0xd7, 0xff, 0xf9, 0x3f, 0x7f, 0xa1, 0x97, 0xff, 0x61, 0x97, 0xff, 0xe1, 0xf7, 0x4f, 0xfe, 0x59, 0xc6, - 0xce, 0x5f, 0x7f, 0x7d, 0xc9, 0x50, 0xfb, 0x34, 0x32, 0xfe, 0xff, 0xac, 0xc9, 0xa7, 0x1f, 0xcd, 0x38, 0xfa, 0x3a, 0xe2, 0xc5, 0xef, 0xe4, 0x19, 0x7b, 0xdd, 0x3d, 0xe5, 0xd1, 0x5f, 0xcf, 0x30, - 0x2a, 0x00, 0x61, 0x46, 0xa5, 0x86, 0x02, 0x6f, 0x18, 0xbe, 0x3c, 0x96, 0x18, 0x87, 0x0f, 0x5e, 0xe2, 0xd7, 0xb9, 0x30, 0x27, 0xc1, 0x2d, 0x5f, 0x1c, 0x52, 0x77, 0x96, 0x2c, 0x16, 0x6e, 0x71, - 0x4e, 0xc4, 0x08, 0x77, 0x1d, 0x56, 0x92, 0x30, 0x29, 0xa3, 0x8a, 0xb8, 0x33, 0x17, 0xa8, 0xca, 0xef, 0x51, 0xc0, 0x0c, 0x13, 0x98, 0xa5, 0x36, 0x05, 0xe6, 0xcc, 0xd2, 0xf0, 0x24, 0x06, 0xf1, - 0x5c, 0x88, 0x5f, 0x67, 0x82, 0xfa, 0xca, 0x57, 0xf8, 0x68, 0xd1, 0x25, 0x5f, 0xd2, 0x3f, 0x3e, 0xc9, 0xfd, 0xbc, 0xee, 0x36, 0xf9, 0xb5, 0x54, 0xeb, 0x08, 0x1d, 0xe4, 0xbc, 0x81, 0xf6, 0x33, - 0x52, 0x77, 0x89, 0x75, 0x3e, 0xe7, 0x93, 0x98, 0x4f, 0x1a, 0xbf, 0x18, 0x4e, 0xdc, 0x02, 0x00, 0xf7, 0xb1, 0xe4, 0xc9, 0x0c, 0x51, 0x6c, 0xe6, 0xb1, 0xa8, 0x91, 0xc1, 0x92, 0xd9, 0xb0, 0x01, - 0xb8, 0x26, 0x41, 0xf2, 0x38, 0xd7, 0x38, 0x85, 0x8c, 0xb2, 0xc5, 0x76, 0xa1, 0xc1, 0xf6, 0xa6, 0x40, 0x2d, 0x74, 0x50, 0xcd, 0x9d, 0x64, 0x4b, 0x99, 0xc6, 0xb3, 0x5b, 0x2c, 0x0b, 0x5e, 0x5b, - 0x7a, 0xfd, 0x30, 0x75, 0xdf, 0xf9, 0x1c, 0xbf, 0x91, 0x43, 0x7e, 0x52, 0x59, 0x2e, 0xcb, 0x26, 0xf2, 0xfb, 0x65, 0x93, 0x7a, 0xb6, 0xdf, 0xfe, 0xee, 0x36, 0x7b, 0xac, 0x0b, 0xbe, 0x62, 0x89, - 0xbf, 0x93, 0xfd, 0xd6, 0x1f, 0x9f, 0xae, 0x8c, 0xe5, 0x59, 0x15, 0x9a, 0x45, 0x4a, 0x43, 0xb1, 0xbd, 0x0b, 0xc9, 0xf5, 0x8e, 0xd2, 0x05, 0x40, 0x13, 0xd7, 0xb1, 0x66, 0x9e, 0x96, 0x34, 0xed, - 0x26, 0xe4, 0x71, 0xb1, 0x5f, 0xba, 0xec, 0x06, 0x04, 0xb7, 0x60, 0x32, 0x0f, 0xb8, 0x21, 0x42, 0xac, 0xd3, 0x82, 0xad, 0x5d, 0xde, 0x0c, 0x50, 0x24, 0xda, 0xb9, 0x27, 0x8d, 0xb3, 0x95, 0x6e, - 0xae, 0x4d, 0xf3, 0x94, 0x38, 0xa2, 0xbc, 0xc6, 0xb8, 0x8c, 0x67, 0xa6, 0xb3, 0x11, 0x9b, 0x31, 0xcb, 0xce, 0xca, 0x7a, 0xe2, 0x64, 0x69, 0x5d, 0x66, 0x71, 0xec, 0x95, 0x7f, 0xff, 0x5f, 0x8f, - 0xa8, 0x31, 0x3f, 0xca, 0x73, 0xbe, 0xd3, 0x95, 0x7c, 0xba, 0xe7, 0xb5, 0x5e, 0x5a, 0xbf, 0xbb, 0x85, 0xd0, 0x87, 0x1e, 0xed, 0xb7, 0x1e, 0xba, 0x59, 0x9c, 0x9f, 0xf6, 0x91, 0x1b, 0x96, 0xcf, - 0x3e, 0x14, 0xf4, 0x25, 0xe6, 0xb4, 0x77, 0xa1, 0x6f, 0xbd, 0x72, 0x39, 0x9c, 0xa0, 0xe3, 0x18, 0xd4, 0x02, 0x69, 0x07, 0x51, 0xd3, 0x2c, 0xa5, 0x14, 0xb7, 0x29, 0x5c, 0x3b, 0x68, 0xb7, 0xb8, - 0x89, 0x92, 0x34, 0xb4, 0xd8, 0x45, 0x55, 0x71, 0x26, 0x8a, 0x54, 0x71, 0x7c, 0xbf, 0x12, 0x54, 0x14, 0x9b, 0xe2, 0x6c, 0xb3, 0x77, 0x8b, 0x5d, 0x02, 0x90, 0x76, 0xb0, 0x46, 0xa6, 0xeb, 0x76, - 0x25, 0x55, 0x33, 0x66, 0xb1, 0x48, 0xad, 0x14, 0x67, 0xe4, 0x66, 0x5a, 0xa3, 0xfb, 0x6c, 0x7a, 0x50, 0x62, 0xe1, 0xfc, 0x62, 0xf4, 0xf0, 0x37, 0xf6, 0xbe, 0xe7, 0xe3, 0xfc, 0xb3, 0xb7, 0xff, - 0xb1, 0xd5, 0xff, 0x45, 0x2d, 0xff, 0x43, 0xf0, 0x0d, 0xcb, 0x8f, 0xd3, 0x09, 0x34, 0x4e, 0xdb, 0xc7, 0x49, 0xbf, 0x2c, 0x39, 0x01, 0x94, 0xe6, 0x7b, 0xbe, 0xe0, 0x25, 0x3a, 0x80, 0x92, 0xe0, - 0x40, 0x4f, 0x0f, 0x33, 0x61, 0xe9, 0x02, 0x53, 0x95, 0x34, 0x6d, 0x64, 0xbf, 0x14, 0x38, 0x77, 0xa6, 0x66, 0xe6, 0x41, 0xaa, 0x39, 0x7b, 0x7d, 0x8e, 0xfa, 0xca, 0xe0, 0x98, 0x35, 0x4a, 0x4f, - 0x69, 0xc3, 0x98, 0xcb, 0x58, 0x90, 0x12, 0x03, 0xbc, 0x3f, 0xd8, 0x96, 0xe4, 0x9f, 0xb5, 0x3a, 0xc1, 0x39, 0xf6, 0xdb, 0x7e, 0xef, 0x83, 0x00, 0xf6, 0xf1, 0x18, 0x7a, 0xc5, 0xa5, 0x74, 0x13, - 0x79, 0x6d, 0xf5, 0x95, 0x20, 0x6c, 0x6c, 0x82, 0x6d, 0xcd, 0xd0, 0xd4, 0x71, 0x4a, 0x69, 0x1e, 0x74, 0x76, 0x21, 0xae, 0x3d, 0x78, 0xc2, 0x7e, 0x6a, 0x95, 0x0b, 0x29, 0xdd, 0x77, 0xd3, 0x42, - 0x80, 0x50, 0x7e, 0xea, 0xac, 0x75, 0x6b, 0x1e, 0x95, 0x61, 0x0e, 0x4b, 0x12, 0x49, 0x60, 0x0a, 0x33, 0xe3, 0x67, 0x7e, 0x39, 0xc3, 0x9c, 0xee, 0x2c, 0x72, 0x4c, 0x84, 0x4b, 0x34, 0x1e, 0x66, - 0x43, 0x32, 0x9f, 0x72, 0xa7, 0xf0, 0x7c, 0xd4, 0xd6, 0xcc, 0xab, 0x1e, 0xdc, 0x1b, 0xb3, 0xd9, 0x47, 0x01, 0xd8, 0x47, 0x31, 0x03, 0x75, 0x19, 0xe6, 0xbf, 0x68, 0xd6, 0x7e, 0x1b, 0x52, 0x7c, - 0x2d, 0x4a, 0x9c, 0xff, 0x93, 0x97, 0x59, 0x9d, 0x5d, 0xa6, 0xe0, 0x7f, 0xfc, 0xd8, 0x3a, 0x3e, 0x77, 0xe3, 0xbd, 0x36, 0xa9, 0x3e, 0x7a, 0xc5, 0xb5, 0x0f, 0x1e, 0xdd, 0xb8, 0xf2, 0xda, 0x8c, - 0xe8, 0x13, 0x04, 0xd8, 0x42, 0x73, 0xfc, 0x38, 0xc5, 0x61, 0x29, 0x36, 0xe2, 0xf5, 0x99, 0x18, 0x1a, 0x1c, 0x14, 0x50, 0x74, 0xe5, 0x54, 0x8b, 0x1d, 0x1f, 0xf3, 0x7e, 0x35, 0xac, 0x2c, 0x7e, - 0x6d, 0x71, 0x18, 0x4b, 0x23, 0x25, 0x36, 0xc8, 0x94, 0xd0, 0x1e, 0x84, 0xb5, 0xaa, 0xca, 0xa0, 0x7f, 0x98, 0x9d, 0x76, 0xb9, 0x6d, 0xdb, 0x66, 0xbc, 0xc3, 0x8f, 0x43, 0x6a, 0x2f, 0x34, 0x3e, - 0xcc, 0xc3, 0x50, 0x0f, 0x5f, 0xcb, 0x1b, 0x1c, 0x99, 0x18, 0xf8, 0x20, 0x9b, 0x95, 0xfc, 0x21, 0x9b, 0xf5, 0x06, 0xd1, 0xf3, 0x79, 0xf4, 0x95, 0x20, 0xb0, 0x37, 0x99, 0x1f, 0x1d, 0x90, 0x5f, - 0xe3, 0x45, 0x47, 0x20, 0x6e, 0x4a, 0xab, 0xb3, 0x4b, 0x0d, 0x87, 0x6a, 0xbb, 0xa5, 0xc9, 0x88, 0xe2, 0xe6, 0xbb, 0x58, 0xe6, 0xf4, 0xee, 0x88, 0xcb, 0x7e, 0x42, 0xc3, 0x49, 0x59, 0x40, 0x6b, - 0x19, 0x4b, 0xb9, 0x20, 0xc0, 0x31, 0xde, 0xda, 0x88, 0x68, 0xef, 0x5a, 0x21, 0xd8, 0x2e, 0x55, 0xa6, 0x21, 0xb1, 0x7c, 0xd3, 0x1d, 0x28, 0xa9, 0xaf, 0x3c, 0x61, 0x47, 0xe0, 0x0d, 0x22, 0xae, - 0x92, 0xac, 0xda, 0x3a, 0x3b, 0x06, 0x1a, 0x13, 0x2f, 0xfa, 0x3e, 0x3b, 0xf9, 0x65, 0x96, 0xfc, 0xbe, 0xf4, 0x31, 0xf2, 0x52, 0xa1, 0xcd, 0x07, 0xf2, 0xaf, 0xe8, 0x7c, 0xbb, 0x7a, 0xf5, 0x68, - 0x8c, 0x08, 0x19, 0xd4, 0x7d, 0x28, 0xd5, 0x3c, 0x42, 0xa9, 0xbc, 0x73, 0xc8, 0x0a, 0x0d, 0x40, 0xe7, 0x53, 0x3b, 0x0c, 0x55, 0x3b, 0xc9, 0xe3, 0x82, 0xd8, 0x4d, 0xc1, 0x1c, 0x20, 0x3b, 0xd2, - 0xd0, 0x65, 0x70, 0x3d, 0x5b, 0x06, 0xa5, 0xca, 0x30, 0x6a, 0xd0, 0x59, 0x40, 0x4b, 0x8b, 0x43, 0x63, 0x37, 0x85, 0x6f, 0x6a, 0xfb, 0xd6, 0x53, 0x41, 0x90, 0x31, 0x0e, 0x5c, 0xc5, 0x70, 0xa4, - 0xb2, 0xe1, 0xc1, 0x76, 0xf1, 0x2d, 0x17, 0xf2, 0xd7, 0x76, 0xeb, 0x89, 0xd7, 0xe1, 0x95, 0xbc, 0xfb, 0xb7, 0xc7, 0xae, 0xed, 0xbf, 0x1e, 0x4d, 0x6e, 0x82, 0x7e, 0x6e, 0x74, 0xe8, 0x00, 0xe4, - 0xda, 0x08, 0x0f, 0xd4, 0x21, 0x44, 0x86, 0xf3, 0x96, 0x63, 0x35, 0xe9, 0x14, 0x9a, 0x0c, 0x6e, 0x4e, 0xcf, 0xa4, 0x84, 0x98, 0x41, 0x32, 0xd5, 0x05, 0x6b, 0xdf, 0xbb, 0xeb, 0x45, 0xbf, 0xb1, - 0xaa, 0xd0, 0x63, 0xe7, 0x25, 0x30, 0xe8, 0x26, 0xa8, 0x25, 0x7a, 0xe5, 0x9c, 0x96, 0xe1, 0x26, 0x86, 0x11, 0xab, 0x84, 0x06, 0x42, 0x0f, 0x75, 0xa6, 0x47, 0x13, 0x4c, 0x59, 0xa6, 0xf0, 0x6b, - 0x5e, 0xf5, 0x2f, 0x01, 0xc6, 0x37, 0x8b, 0xf4, 0x93, 0x40, 0xfc, 0xf7, 0x46, 0x5e, 0x3a, 0xf9, 0x37, 0x66, 0xc5, 0x97, 0x71, 0xbc, 0x0a, 0xfe, 0x04, 0xe6, 0x75, 0x30, 0x8d, 0x8c, 0x1b, 0xca, - 0x6d, 0x50, 0x30, 0x12, 0xbd, 0xaa, 0xe9, 0xd3, 0x50, 0x29, 0x6c, 0x4f, 0xe5, 0xa1, 0xb8, 0x82, 0x6b, 0x8e, 0x15, 0xb7, 0x2b, 0x96, 0x46, 0xdb, 0xd3, 0x02, 0xe5, 0x0a, 0x6c, 0xd1, 0xd0, 0xb0, - 0xcb, 0x12, 0xc7, 0x65, 0x0e, 0x02, 0xed, 0xd1, 0x2c, 0xaa, 0x39, 0xb7, 0xb6, 0xf2, 0x76, 0xa0, 0x44, 0x74, 0x0b, 0x60, 0x19, 0xc9, 0x76, 0x6d, 0xd1, 0xc8, 0x6b, 0x27, 0x35, 0x49, 0xc5, 0x18, - 0xb0, 0x71, 0xc6, 0xc5, 0xaa, 0x49, 0x9e, 0x06, 0xb9, 0x40, 0xaf, 0xe2, 0x71, 0x91, 0x79, 0x83, 0xe2, 0x72, 0x34, 0x81, 0x7e, 0x46, 0x01, 0x9e, 0x50, 0x5e, 0x04, 0x19, 0xde, 0x96, 0xdb, 0x11, - 0x92, 0x77, 0x2c, 0x28, 0x0a, 0x9d, 0x17, 0x42, 0xb8, 0x87, 0x96, 0x26, 0x7c, 0x7a, 0x65, 0x60, 0xd4, 0x41, 0x99, 0x35, 0xc7, 0xab, 0xee, 0xf5, 0x2f, 0x72, 0x25, 0x09, 0x79, 0x32, 0x2a, 0x9e, - 0xa9, 0x1d, 0xd0, 0x4b, 0xf1, 0xc7, 0xa5, 0x77, 0xd3, 0x39, 0xea, 0xab, 0x82, 0x35, 0x62, 0x02, 0x11, 0x20, 0x1b, 0x35, 0xb4, 0x6d, 0x45, 0x2a, 0xa8, 0x39, 0x85, 0x49, 0x4d, 0xd9, 0x0e, 0xf0, - 0x72, 0x49, 0x93, 0x33, 0x8b, 0x64, 0xa8, 0xa0, 0x35, 0x8f, 0x84, 0xba, 0xc0, 0x13, 0x7e, 0x38, 0xad, 0xfb, 0xed, 0x61, 0x81, 0x44, 0x0d, 0xb4, 0xd2, 0x6d, 0x2e, 0xb6, 0x96, 0xb2, 0x1c, 0x9f, - 0x0c, 0x40, 0x13, 0xc9, 0x8e, 0x95, 0x81, 0x4e, 0x15, 0xf4, 0x64, 0xc6, 0xd2, 0x90, 0x75, 0x20, 0x5a, 0x83, 0xfb, 0x46, 0xda, 0x56, 0x7a, 0x4d, 0xf5, 0xfb, 0x6a, 0x8d, 0x7f, 0xee, 0x61, 0x78, - 0x93, 0x79, 0x6d, 0xee, 0xf5, 0xe8, 0x1a, 0x94, 0x33, 0xc2, 0x87, 0xa0, 0x4e, 0xd3, 0x25, 0x45, 0x59, 0xa8, 0xef, 0x80, 0xde, 0x69, 0xce, 0xc2, 0x31, 0x04, 0xaa, 0x32, 0xbc, 0xca, 0xaa, 0xb0, - 0x59, 0x45, 0xc3, 0x3e, 0x20, 0x83, 0x59, 0xab, 0x1f, 0x84, 0xa5, 0x71, 0x3c, 0x38, 0x3e, 0xd7, 0xd6, 0xd4, 0x94, 0xd4, 0x8f, 0x4d, 0x84, 0xa8, 0x12, 0xcf, 0x78, 0x2b, 0x7c, 0xc6, 0x21, 0x09, - 0x09, 0x36, 0xdd, 0x60, 0xf1, 0x87, 0x3d, 0xe1, 0xdb, 0xf5, 0xbc, 0xdb, 0x0f, 0xe7, 0xef, 0x73, 0xa6, 0xef, 0x3a, 0xff, 0xad, 0x76, 0xe3, 0xbb, 0xce, 0xa5, 0xb1, 0xbe, 0xeb, 0x8c, 0xd5, 0x5c, - 0x0e, 0x48, 0x90, 0xb5, 0xee, 0x99, 0xb5, 0xa5, 0x90, 0x24, 0x41, 0xcd, 0x8a, 0xac, 0x9d, 0xa0, 0x9f, 0x10, 0x89, 0x4f, 0x80, 0x5e, 0x5c, 0x79, 0x5b, 0x57, 0x10, 0x9a, 0x19, 0x19, 0x3a, 0x11, - 0x69, 0x9f, 0x88, 0x73, 0x88, 0xb0, 0x14, 0xc7, 0xd1, 0x7d, 0x78, 0x74, 0x52, 0x86, 0xcd, 0xd7, 0x4b, 0x5b, 0x1c, 0x44, 0xe7, 0x38, 0xac, 0x99, 0x50, 0x06, 0xa8, 0x54, 0x2a, 0x0d, 0xdc, 0x31, - 0xb9, 0xf2, 0x9b, 0x3f, 0xb2, 0x0c, 0x93, 0xd2, 0x7a, 0x56, 0x85, 0x12, 0x7d, 0x6d, 0x9d, 0xbc, 0x8a, 0xbc, 0xb4, 0xf6, 0x7a, 0x70, 0xd5, 0x9e, 0x47, 0x0c, 0xe6, 0xb5, 0x79, 0x5a, 0x0b, 0xe6, - 0x89, 0xe6, 0x58, 0x56, 0x96, 0x11, 0xa3, 0xd0, 0x4d, 0x5d, 0xb6, 0x85, 0x58, 0x98, 0x1d, 0xab, 0xfe, 0xbc, 0xa0, 0x56, 0x7c, 0x85, 0xc5, 0xc2, 0x4a, 0x07, 0x91, 0x0c, 0xe2, 0xa7, 0xea, 0xac, - 0x9b, 0x4a, 0xa0, 0x81, 0x66, 0x44, 0xc7, 0x76, 0x60, 0x38, 0x35, 0x78, 0x2b, 0x77, 0xd4, 0xb5, 0xd6, 0x15, 0x76, 0x88, 0x9e, 0xdc, 0x7e, 0x25, 0xbb, 0x73, 0x02, 0xd9, 0xaf, 0x5e, 0xdb, 0x7d, - 0x1d, 0xe3, 0xec, 0xca, 0x51, 0xfc, 0x3f, 0xe4, 0x55, 0x39, 0x7b, 0xfc, 0xf1, 0x37, 0xd7, 0xf4, 0x2f, 0x2b, 0x8e, 0xbd, 0x67, 0xa5, 0x8b, 0x5f, 0x2b, 0x92, 0xf4, 0x59, 0xf0, 0x05, 0xc4, 0x4f, - 0xa7, 0x63, 0x4b, 0x25, 0xe1, 0x31, 0x76, 0x18, 0x4c, 0x85, 0x22, 0x78, 0x13, 0x8c, 0x99, 0xde, 0xdc, 0x2b, 0x44, 0x54, 0xf0, 0x14, 0xcd, 0x2e, 0x90, 0x1d, 0xb4, 0x62, 0x79, 0x41, 0x46, 0x08, - 0xda, 0x8e, 0x2a, 0xfe, 0x40, 0x33, 0xfd, 0xd2, 0x0d, 0x66, 0xa0, 0x03, 0x71, 0x6a, 0xb5, 0x04, 0x06, 0x74, 0xaa, 0xfa, 0xf3, 0x10, 0x75, 0xcf, 0x67, 0x4a, 0x8a, 0xb7, 0x8d, 0x9c, 0xa4, 0xd6, - 0x5a, 0x12, 0x32, 0x66, 0xb9, 0x9d, 0xbd, 0x06, 0xe5, 0x77, 0x5f, 0xee, 0x2d, 0x1b, 0xfb, 0x49, 0xfc, 0xda, 0x35, 0x34, 0xfd, 0xaa, 0x70, 0x3e, 0x2b, 0x00, 0xf1, 0x5a, 0x7d, 0xef, 0x4f, 0x72, - 0xc1, 0xc9, 0xe7, 0xb3, 0x31, 0xb5, 0xbe, 0x2f, 0x90, 0xca, 0x96, 0xba, 0x63, 0x2b, 0xd5, 0x12, 0xc5, 0x66, 0xd3, 0x9d, 0x66, 0x61, 0x94, 0xd1, 0xf2, 0x92, 0xde, 0x10, 0xa0, 0x27, 0x10, 0x87, - 0xb0, 0x6c, 0x07, 0x59, 0x8b, 0x4d, 0x72, 0x46, 0x6f, 0x07, 0x8c, 0x01, 0x82, 0x79, 0x1b, 0x60, 0x33, 0x22, 0x5e, 0x71, 0x40, 0x2a, 0xbb, 0x81, 0xcd, 0xfa, 0x2b, 0x5b, 0x06, 0x8e, 0x7b, 0x6e, - 0xe6, 0x94, 0x6e, 0x25, 0x59, 0x6a, 0x05, 0xb1, 0x80, 0x39, 0x93, 0x46, 0x98, 0x6a, 0x6e, 0x6b, 0xcc, 0xdf, 0xff, 0x42, 0xcf, 0x83, 0x6f, 0x9f, 0x85, 0xf3, 0x3f, 0x46, 0x0f, 0x7b, 0xc1, 0x69, - 0xfe, 0xf0, 0x0d, 0xef, 0x38, 0x7e, 0xab, 0xa5, 0x7b, 0x7d, 0xc7, 0xcf, 0x88, 0x7a, 0x88, 0xcd, 0xd0, 0x88, 0xb6, 0xde, 0x43, 0x5d, 0x5f, 0x79, 0x07, 0x17, 0x8b, 0x2b, 0x46, 0xc6, 0x00, 0x54, - 0x12, 0x75, 0x62, 0x99, 0x0b, 0xfa, 0xd6, 0x82, 0xcd, 0x80, 0xdd, 0x92, 0x3b, 0x15, 0xe0, 0xa2, 0x56, 0x52, 0xe6, 0xc9, 0x2e, 0xb0, 0xe7, 0x42, 0x5c, 0x97, 0xf5, 0x8a, 0xf1, 0x4f, 0x46, 0x70, - 0x58, 0x96, 0x92, 0x23, 0xd7, 0x11, 0xb0, 0x09, 0x12, 0x66, 0xe6, 0xca, 0xae, 0xc9, 0xc0, 0xdf, 0xac, 0x03, 0x95, 0xe7, 0x34, 0xe5, 0x5b, 0xa6, 0xea, 0xef, 0x72, 0xc9, 0x90, 0x97, 0xe8, 0xa7, - 0xbe, 0x49, 0xbf, 0x9a, 0xf9, 0xef, 0xae, 0x4d, 0x90, 0x71, 0x24, 0x54, 0x84, 0xa5, 0x02, 0x4a, 0x57, 0x79, 0xe7, 0x8e, 0x3c, 0x28, 0x14, 0x98, 0x0e, 0xed, 0x66, 0xdf, 0x53, 0xdb, 0x5c, 0x5b, - 0x4e, 0xd9, 0xd2, 0x31, 0x42, 0x5d, 0x8f, 0x8b, 0x39, 0x76, 0xc6, 0x5d, 0x5c, 0xdf, 0xce, 0x18, 0xa5, 0xa8, 0x6d, 0xbf, 0x52, 0xa2, 0xb4, 0xe3, 0x86, 0xcb, 0xa4, 0x77, 0x74, 0x5d, 0xb1, 0xd6, - 0x96, 0xcd, 0xe2, 0x34, 0x95, 0x68, 0x51, 0xcd, 0x6a, 0x1e, 0x21, 0x8a, 0x1b, 0x09, 0xd5, 0x1d, 0x20, 0x77, 0x9e, 0x8e, 0xaf, 0xb6, 0x69, 0xf4, 0x85, 0x18, 0xa4, 0x7b, 0x0f, 0xc7, 0x55, 0xca, - 0xcf, 0xed, 0x15, 0x67, 0xb0, 0x53, 0x73, 0x3c, 0x5e, 0xc6, 0xcb, 0x52, 0x5e, 0xd7, 0x2c, 0x73, 0x58, 0x1d, 0xce, 0xfb, 0x61, 0x3b, 0xc4, 0x02, 0xdf, 0x4c, 0xc5, 0xe9, 0x61, 0x35, 0xa7, 0x89, - 0xe5, 0x8e, 0x5d, 0x67, 0x94, 0x30, 0xe7, 0x0e, 0x7b, 0x41, 0x23, 0x8e, 0x7e, 0x1e, 0x3a, 0xdd, 0x26, 0x49, 0x36, 0xa0, 0x4b, 0x47, 0x7b, 0xa9, 0x2c, 0x1a, 0x3c, 0x26, 0xd0, 0xf5, 0x5a, 0xca, - 0x99, 0x5d, 0x49, 0x87, 0x15, 0x3a, 0x22, 0xa3, 0xe2, 0x73, 0xad, 0xb6, 0xf7, 0x84, 0x9c, 0xc7, 0x1f, 0xd6, 0x83, 0x12, 0xaf, 0x8f, 0xc7, 0xce, 0x2b, 0x86, 0xca, 0x6f, 0xd2, 0xaf, 0x00, 0xde, - 0x5d, 0x1b, 0x5b, 0xfc, 0x41, 0x39, 0xa4, 0x87, 0x6d, 0xbf, 0xd7, 0x1b, 0xaf, 0x3c, 0x11, 0x38, 0xaa, 0xfb, 0x4d, 0x1c, 0x4a, 0xfd, 0x4c, 0xa6, 0xe0, 0x9d, 0x0f, 0x01, 0x85, 0xbf, 0x5d, 0x90, - 0x28, 0xbf, 0x32, 0x36, 0xce, 0x20, 0x18, 0x4b, 0x6e, 0x8a, 0xd1, 0xcd, 0x12, 0x3a, 0x1d, 0xcb, 0x6d, 0xae, 0x30, 0xcd, 0xde, 0x4c, 0x77, 0x49, 0x94, 0x0f, 0xd5, 0x32, 0x39, 0xf7, 0x6b, 0x7d, - 0x23, 0xfa, 0x16, 0x21, 0x47, 0x6c, 0x30, 0x7c, 0xd3, 0x04, 0xab, 0xc0, 0xb3, 0xad, 0xf4, 0x38, 0x71, 0xb2, 0x24, 0xb1, 0xd2, 0x67, 0x31, 0x27, 0x2f, 0xce, 0xd0, 0x5f, 0x65, 0x5f, 0xc0, 0xf8, - 0x7a, 0x65, 0xec, 0x4c, 0x7d, 0x5a, 0xf6, 0x25, 0x72, 0x36, 0x73, 0xa3, 0x76, 0x93, 0x52, 0x84, 0x0b, 0x26, 0x2a, 0x4b, 0x1d, 0x34, 0xe1, 0x52, 0x81, 0x4f, 0x1c, 0xc5, 0xf4, 0xc0, 0xf1, 0x94, - 0x6f, 0x60, 0x0e, 0xf3, 0xf4, 0xa4, 0xd5, 0xab, 0x2e, 0x71, 0x16, 0x70, 0xb0, 0xd7, 0x66, 0x9a, 0xa1, 0x9e, 0xe3, 0xd2, 0x32, 0x3a, 0x18, 0x1c, 0xcc, 0x9c, 0x30, 0x1a, 0xc6, 0x20, 0x49, 0xa3, - 0x6e, 0x6d, 0x11, 0x72, 0x13, 0xe6, 0xb5, 0xc5, 0xef, 0xbd, 0x05, 0xd7, 0xa5, 0xe6, 0xef, 0x1f, 0x6c, 0x6c, 0xf7, 0x0f, 0xff, 0x77, 0xe6, 0xcc, 0x2f, 0x92, 0x3f, 0x01, 0x7b, 0x3d, 0x1f, 0x6b, - 0xdc, 0x24, 0x01, 0xc0, 0x65, 0x83, 0xda, 0xe9, 0x51, 0x14, 0x47, 0x9b, 0x99, 0x55, 0x50, 0x0c, 0xa3, 0x60, 0x62, 0xd3, 0xcf, 0xbc, 0x7a, 0x76, 0x9e, 0x93, 0xe6, 0x56, 0x0a, 0x92, 0xfd, 0x76, - 0x95, 0x2e, 0x17, 0x2e, 0x61, 0xef, 0x4a, 0xdd, 0x0d, 0x17, 0xc3, 0x79, 0xde, 0x72, 0x10, 0x69, 0x62, 0x98, 0x6a, 0xb8, 0xfc, 0x2e, 0xd0, 0xd4, 0x41, 0xaf, 0x71, 0x01, 0x1c, 0x82, 0x33, 0xe5, - 0x9d, 0x1c, 0xfb, 0x19, 0x0d, 0xfb, 0x57, 0x5c, 0xbe, 0x46, 0x8e, 0xfd, 0x77, 0x7b, 0x90, 0xcf, 0x82, 0x2f, 0xa8, 0x7c, 0x3a, 0x1d, 0xbb, 0x1b, 0x29, 0x70, 0x5d, 0x1e, 0xea, 0x82, 0x5d, 0xac, - 0x36, 0xcb, 0x13, 0xe7, 0x86, 0xc2, 0xaa, 0x34, 0x60, 0x28, 0x69, 0x79, 0xa5, 0x4d, 0xb7, 0x01, 0x86, 0x80, 0x00, 0x97, 0xcd, 0x62, 0x56, 0x43, 0x6d, 0x84, 0xd7, 0xf9, 0x05, 0xd2, 0xf7, 0xeb, - 0xdc, 0x64, 0xdd, 0x64, 0x8a, 0x75, 0x1e, 0x34, 0xb3, 0xb2, 0x03, 0xaa, 0x74, 0xeb, 0x81, 0x2b, 0x8e, 0x78, 0xb7, 0x23, 0xbd, 0xbc, 0xdf, 0xb7, 0x90, 0xd9, 0x8e, 0x08, 0xe4, 0xfd, 0x81, 0x82, - 0xec, 0xe8, 0xd5, 0x93, 0x30, 0xbd, 0x2c, 0xc8, 0x55, 0xe8, 0x7c, 0x3c, 0xf2, 0x85, 0x51, 0xfa, 0x1b, 0x27, 0xe3, 0xe5, 0x99, 0xe9, 0x9f, 0x05, 0xa1, 0x3c, 0xe5, 0x75, 0xfc, 0xeb, 0x5b, 0xff, - 0xc0, 0xf0, 0x8b, 0xde, 0xf3, 0x9f, 0x09, 0x1e, 0xbf, 0xc5, 0x3d, 0xfe, 0xf5, 0xac, 0xb7, 0x56, 0x3e, 0x39, 0x8b, 0xd8, 0x38, 0x3f, 0x9d, 0xcf, 0x33, 0xef, 0x00, 0x3b, 0xc5, 0x71, 0x8f, 0x4a, - 0x3b, 0x6d, 0x8f, 0x5a, 0xe7, 0x21, 0xeb, 0x19, 0xce, 0x8a, 0x14, 0x20, 0xe4, 0x52, 0x76, 0xe6, 0x1f, 0x0e, 0xc8, 0x42, 0x1b, 0x98, 0x41, 0xb3, 0x4c, 0x53, 0x43, 0x16, 0x0a, 0x13, 0xa9, 0x96, - 0x81, 0x6c, 0x05, 0x2a, 0xc4, 0xa3, 0x15, 0xba, 0x8b, 0xc8, 0x24, 0xa8, 0x04, 0x8c, 0x61, 0xe8, 0x42, 0xfb, 0xd8, 0x51, 0xfd, 0xf5, 0xd7, 0x33, 0x9f, 0xf0, 0x53, 0x7e, 0xec, 0x67, 0x63, 0xf9, - 0xcf, 0x63, 0xab, 0x1f, 0xbf, 0xe2, 0x3a, 0xaa, 0x1f, 0xdd, 0x18, 0x9b, 0xec, 0x3e, 0x9b, 0x6d, 0x8e, 0x0a, 0x85, 0xcd, 0xd6, 0xdb, 0x75, 0x42, 0x68, 0x91, 0xc6, 0x0a, 0xcb, 0x23, 0x7f, 0x68, - 0x32, 0x02, 0x66, 0x67, 0xcc, 0x2e, 0x82, 0xcf, 0x60, 0xbf, 0x63, 0xd5, 0x55, 0x76, 0x2e, 0x24, 0xa2, 0x93, 0xc8, 0x30, 0x84, 0xd6, 0xfd, 0xbc, 0x88, 0x57, 0x8d, 0x4b, 0x2e, 0xd2, 0x12, 0x04, - 0xf8, 0x20, 0xb6, 0xc5, 0x15, 0xd4, 0x05, 0x8b, 0xb2, 0x98, 0x12, 0x32, 0x52, 0x2c, 0x45, 0xcd, 0x7b, 0xcd, 0x58, 0xf7, 0x2b, 0x26, 0xe4, 0x5f, 0xf2, 0xcb, 0x24, 0x3a, 0x62, 0xa0, 0xfe, 0x18, - 0xdd, 0x71, 0xcf, 0xfd, 0xf1, 0x07, 0xc0, 0x7f, 0xd3, 0x7d, 0x46, 0x11, 0x7e, 0x5f, 0xc0, 0x05, 0xb8, 0x19, 0x71, 0x3e, 0xd0, 0x53, 0x5e, 0x0b, 0x88, 0x73, 0xd6, 0x1a, 0x5b, 0x9e, 0xe6, 0x97, - 0x5d, 0x8b, 0x97, 0x36, 0x22, 0x2f, 0xb9, 0x78, 0x1d, 0xa2, 0xb1, 0x1f, 0x16, 0xab, 0x65, 0xaf, 0x40, 0x4d, 0xd3, 0xcd, 0x8f, 0x9e, 0xef, 0x48, 0x6b, 0x07, 0x9f, 0xb6, 0x53, 0xbf, 0x85, 0x3b, - 0x8a, 0xb3, 0x77, 0x75, 0xd7, 0x37, 0x4d, 0x51, 0xd0, 0xd1, 0x6a, 0x2a, 0x0a, 0xb4, 0x24, 0x1d, 0x0b, 0xf8, 0x37, 0x71, 0x3c, 0x3f, 0x8d, 0xd2, 0xf8, 0x79, 0xb9, 0xf0, 0x17, 0xd7, 0x9d, 0xf8, - 0x56, 0x2b, 0xfc, 0xfa, 0x77, 0xec, 0x3a, 0x73, 0x9c, 0x6e, 0xe1, 0xc0, 0xf2, 0xec, 0x01, 0x25, 0xa4, 0xdd, 0xae, 0xee, 0x6c, 0x2c, 0xad, 0xe7, 0x1c, 0xc7, 0x59, 0x9b, 0xca, 0x3a, 0xec, 0xa2, - 0x2d, 0x41, 0xf9, 0xb3, 0x3e, 0xdb, 0x3a, 0x4d, 0x1d, 0xe3, 0xfe, 0x0e, 0x6e, 0x1b, 0x03, 0xa6, 0x96, 0x68, 0xb7, 0xab, 0xd1, 0x88, 0x1d, 0xd8, 0xba, 0x3c, 0xf5, 0xc0, 0xe6, 0x0c, 0x1d, 0x60, - 0x8e, 0xc2, 0x69, 0x4c, 0x18, 0x68, 0x97, 0x11, 0x42, 0x64, 0x8c, 0xfb, 0xa0, 0x8a, 0x43, 0xc7, 0x9b, 0x58, 0x69, 0x15, 0xfe, 0xa7, 0x16, 0xde, 0x5f, 0x62, 0xaf, 0x48, 0xbc, 0x9f, 0x8c, 0xb5, - 0xee, 0x16, 0xc2, 0x5c, 0xf0, 0x03, 0x03, 0xc2, 0x20, 0xe7, 0xb0, 0xdc, 0x63, 0xe8, 0x66, 0x3a, 0x63, 0x87, 0x63, 0x61, 0xd8, 0xaa, 0xcc, 0x9a, 0x9b, 0xa5, 0x74, 0x24, 0x37, 0x24, 0x9a, 0xd4, - 0x7b, 0x6d, 0xad, 0xd8, 0x54, 0x3e, 0xc8, 0xa8, 0x7f, 0xf6, 0xb1, 0x55, 0xef, 0xe2, 0xbb, 0xb3, 0xbb, 0x58, 0x6f, 0x09, 0x41, 0x51, 0x8f, 0xa0, 0x36, 0x4b, 0x25, 0xbe, 0x3f, 0x06, 0x66, 0xbd, - 0xd9, 0x34, 0xe5, 0x42, 0x7c, 0xcd, 0x7f, 0x75, 0xfd, 0xd9, 0x55, 0x3d, 0xc4, 0x6f, 0x9e, 0xab, 0x6f, 0x1e, 0x45, 0xab, 0xaa, 0xcb, 0xab, 0x97, 0xf8, 0x5d, 0xdb, 0xf9, 0x96, 0xc7, 0x1e, 0x56, - 0x13, 0xbf, 0x89, 0xe3, 0x2e, 0x74, 0xeb, 0x60, 0x72, 0x0d, 0xce, 0xcf, 0xb3, 0xf0, 0x67, 0xf7, 0xe3, 0x97, 0x2c, 0xf4, 0xc7, 0xe3, 0xf3, 0x15, 0xa3, 0xdc, 0x2f, 0xb1, 0x97, 0xae, 0xf9, 0x38, - 0x99, 0xa0, 0xe3, 0x0c, 0x74, 0xbc, 0xd1, 0xe7, 0x28, 0xb6, 0x89, 0x4d, 0xd8, 0x42, 0xd6, 0x36, 0x65, 0x6e, 0x8f, 0xec, 0x7c, 0x83, 0xa6, 0xe1, 0x6a, 0x79, 0x0e, 0x6d, 0xb7, 0xab, 0x3b, 0x51, - 0xd5, 0x36, 0x47, 0xa8, 0xd8, 0x2a, 0xe7, 0x8a, 0xc9, 0xd6, 0x28, 0xe7, 0x1f, 0x4f, 0x3e, 0xb5, 0x71, 0x67, 0x7b, 0x56, 0x45, 0x77, 0x27, 0x2f, 0x62, 0x16, 0xab, 0x58, 0xeb, 0xd2, 0x5d, 0x9a, - 0x1f, 0x5c, 0xc9, 0x5c, 0x05, 0xac, 0x10, 0x83, 0x23, 0x12, 0x52, 0x9e, 0x50, 0x1e, 0x3c, 0x41, 0xae, 0x29, 0x1d, 0x6f, 0x92, 0x58, 0xcf, 0x9c, 0x83, 0xd0, 0x3f, 0xc4, 0x0b, 0xd1, 0x48, 0xbf, - 0xc4, 0x5e, 0x91, 0x7b, 0x3f, 0xb9, 0xc6, 0x6d, 0x8d, 0x88, 0x45, 0x52, 0xa3, 0xa3, 0x95, 0x37, 0x89, 0x16, 0xdb, 0x42, 0x70, 0x9a, 0x1d, 0xcf, 0x7b, 0xd2, 0x38, 0x39, 0xb8, 0xa1, 0xab, 0x7b, - 0x8c, 0x60, 0xa1, 0x70, 0xd3, 0x50, 0x3b, 0x4e, 0x2f, 0x20, 0xdb, 0xe9, 0x64, 0xdc, 0x3d, 0x83, 0x01, 0x24, 0xc7, 0x11, 0xe1, 0xa5, 0xeb, 0x22, 0x3a, 0xc3, 0xa6, 0x5d, 0x20, 0x31, 0xae, 0x59, - 0x85, 0x91, 0x96, 0x07, 0xbb, 0xd3, 0x24, 0x4d, 0x18, 0x58, 0x94, 0xc5, 0x46, 0xc5, 0x43, 0x7f, 0xfa, 0xa9, 0x6f, 0xc4, 0xfc, 0x4f, 0x61, 0xc1, 0x5f, 0x29, 0x45, 0xf2, 0x5d, 0xfe, 0x57, 0x7c, - 0xde, 0x2e, 0x4e, 0x6e, 0xe2, 0x7f, 0x06, 0x4a, 0xcb, 0xd2, 0x84, 0x3c, 0x4b, 0xf3, 0xd5, 0xfa, 0x3c, 0xe3, 0xb6, 0xee, 0x0c, 0xa8, 0x83, 0x4a, 0xb6, 0x4a, 0xe8, 0x64, 0x34, 0xf3, 0xd5, 0xd9, - 0x68, 0x7b, 0xb3, 0x8b, 0x67, 0x16, 0x45, 0x0e, 0x21, 0x28, 0xb8, 0x51, 0x4b, 0xee, 0xc3, 0x1c, 0x71, 0x86, 0x83, 0xcd, 0x47, 0x78, 0x06, 0x39, 0xac, 0x2c, 0x62, 0x8b, 0xc3, 0xa9, 0xd9, 0x77, - 0x36, 0xca, 0x31, 0xcc, 0xa0, 0xf6, 0x08, 0xc3, 0xa5, 0xdc, 0x6b, 0xeb, 0xef, 0x2d, 0x1a, 0xe8, 0xdd, 0x03, 0xf6, 0x40, 0xe9, 0xfc, 0x32, 0xd4, 0xee, 0x43, 0x9a, 0xbf, 0xf6, 0x42, 0xee, 0xf6, - 0x13, 0x27, 0x2b, 0xcb, 0xe7, 0x6c, 0xe0, 0xaf, 0xb1, 0x1c, 0x7d, 0x16, 0x7c, 0x01, 0xfe, 0xd3, 0xe9, 0x58, 0xb6, 0x23, 0x47, 0x32, 0x1c, 0x55, 0xeb, 0x82, 0x79, 0xb3, 0x9c, 0xeb, 0x21, 0x36, - 0x55, 0x02, 0x56, 0x99, 0x0f, 0xeb, 0xc5, 0x06, 0x0d, 0xe5, 0x08, 0x36, 0xc3, 0xf3, 0x94, 0xc9, 0x0f, 0xe1, 0x01, 0xad, 0x6d, 0x53, 0xea, 0x74, 0x06, 0x9b, 0x6e, 0xcf, 0x2b, 0x11, 0x15, 0x72, - 0x89, 0x5f, 0x8b, 0x7d, 0x80, 0x14, 0x5d, 0x81, 0xc4, 0xeb, 0xb5, 0x69, 0x6d, 0x84, 0x43, 0x37, 0x2d, 0xc4, 0x10, 0x8b, 0xf6, 0x73, 0xe8, 0x35, 0xc4, 0xaf, 0x3f, 0xdf, 0xeb, 0xf3, 0xd2, 0xab, - 0x2e, 0xb0, 0x7c, 0xf2, 0x54, 0x7e, 0x0b, 0xd5, 0xba, 0x3e, 0xfa, 0x16, 0xf6, 0x3a, 0x09, 0xdd, 0xea, 0xc7, 0x09, 0xf5, 0x26, 0xda, 0xf1, 0x7e, 0x5b, 0xfa, 0xeb, 0xb5, 0x3c, 0xf5, 0x3b, 0xd9, - 0xef, 0xfd, 0xf0, 0xeb, 0xca, 0xd8, 0xac, 0x75, 0xb0, 0xde, 0x97, 0x86, 0x34, 0x27, 0x65, 0x79, 0x05, 0xa7, 0x2a, 0x7d, 0xec, 0x51, 0x2c, 0x50, 0xf3, 0x42, 0x6f, 0x86, 0x35, 0x07, 0x30, 0xfb, - 0xe5, 0x7a, 0x9f, 0xae, 0x54, 0x9e, 0xc3, 0x4a, 0x66, 0x38, 0x86, 0x58, 0xdf, 0x80, 0xb5, 0x7f, 0x4c, 0x0a, 0xd8, 0x83, 0x9d, 0x95, 0xd2, 0x29, 0xe7, 0xce, 0x3c, 0x66, 0x98, 0xc8, 0x0f, 0xbb, - 0x10, 0x28, 0x43, 0x87, 0x3f, 0x99, 0xa7, 0x0e, 0x0b, 0xf1, 0x51, 0x3b, 0xce, 0x27, 0xc0, 0x3f, 0xd3, 0x8c, 0x5e, 0x1c, 0xa8, 0xf7, 0x6f, 0xf8, 0x85, 0xd4, 0xd7, 0xeb, 0x57, 0xcd, 0x69, 0xcc, - 0xd0, 0xb5, 0x8b, 0x65, 0x93, 0x56, 0x5b, 0x2d, 0x5d, 0x8b, 0x0b, 0x62, 0x13, 0x1c, 0x76, 0x42, 0x25, 0x78, 0x4b, 0x7c, 0x09, 0xf2, 0xd3, 0x45, 0x3e, 0x24, 0xf6, 0xb9, 0xd8, 0x6f, 0xd1, 0x86, - 0xef, 0xc4, 0x39, 0x6f, 0xc2, 0x5b, 0x8c, 0x82, 0x33, 0xcd, 0xca, 0xfc, 0x62, 0x49, 0xa6, 0x12, 0x71, 0x80, 0xc8, 0x3e, 0xd6, 0x3b, 0x83, 0x90, 0x83, 0xad, 0xbb, 0x45, 0x56, 0x9e, 0xab, 0xf5, - 0xa0, 0xb9, 0xc1, 0x5e, 0x53, 0x15, 0xbe, 0x8f, 0xaf, 0x07, 0x84, 0x3a, 0x2f, 0x0d, 0xda, 0xaf, 0xcf, 0x3f, 0xed, 0x91, 0x3f, 0xf7, 0x5a, 0xdd, 0x4b, 0x7f, 0xef, 0x8d, 0x4f, 0x97, 0x6e, 0x1d, - 0x31, 0xc2, 0x95, 0x55, 0x96, 0xc0, 0xe1, 0xb0, 0xd3, 0x6b, 0x25, 0x90, 0x30, 0x69, 0x69, 0xeb, 0x6a, 0x48, 0xb3, 0x64, 0xaf, 0xa1, 0xb3, 0x6c, 0xca, 0x34, 0x0d, 0x4b, 0xcc, 0xf1, 0x68, 0x09, - 0x14, 0x60, 0x0f, 0xe3, 0x11, 0x12, 0xa5, 0xe1, 0xe0, 0x1c, 0x37, 0x76, 0xaf, 0x42, 0xd3, 0x65, 0x09, 0x69, 0x45, 0xbc, 0xe3, 0xd5, 0x0a, 0x0b, 0xb1, 0xb8, 0x5e, 0x72, 0x7a, 0xb1, 0xf7, 0xc8, - 0xc3, 0xd2, 0x89, 0x0d, 0x6d, 0x18, 0x37, 0x72, 0xdf, 0x78, 0x60, 0x1e, 0xeb, 0xaf, 0xaf, 0xb8, 0xa3, 0x6e, 0x22, 0xaf, 0x68, 0x5c, 0x0e, 0x26, 0xd8, 0x38, 0x17, 0x94, 0xea, 0x44, 0xce, 0x5a, - 0xd2, 0x4e, 0x69, 0x29, 0x9e, 0x58, 0x42, 0xe6, 0x75, 0x0a, 0x2d, 0x9c, 0xa5, 0x40, 0x6c, 0x96, 0xc7, 0xc3, 0x46, 0x3c, 0x1d, 0x08, 0xc4, 0xa0, 0x2c, 0xbc, 0x31, 0x98, 0x43, 0x3b, 0x1d, 0x5c, - 0x6e, 0x7b, 0xe8, 0xe8, 0xa5, 0xb0, 0x29, 0x96, 0xee, 0x3a, 0xf2, 0xe0, 0xc3, 0x5e, 0xcb, 0xe3, 0x88, 0x83, 0x34, 0x23, 0x9f, 0x33, 0x41, 0x39, 0x77, 0x69, 0xc9, 0x58, 0x62, 0x7b, 0xed, 0xbb, - 0x75, 0x3f, 0x2f, 0xc3, 0xb4, 0xf6, 0x27, 0xd1, 0xf3, 0x58, 0xb4, 0x57, 0xd2, 0xdd, 0x7f, 0x89, 0xbd, 0xb6, 0xfb, 0xfd, 0xe4, 0xba, 0x6b, 0xfe, 0xc1, 0xb3, 0x01, 0x4f, 0x66, 0x92, 0xb5, 0xb3, - 0x11, 0x23, 0x8b, 0xf7, 0x07, 0x59, 0x76, 0xe9, 0xc3, 0x8a, 0x31, 0xce, 0x0d, 0xeb, 0xe4, 0x7e, 0xd8, 0x8d, 0xe8, 0xc0, 0x5b, 0x00, 0xd1, 0x55, 0x41, 0xfe, 0x4d, 0x37, 0xbe, 0xd0, 0xa4, 0x4f, - 0x82, 0x2f, 0x8d, 0xfa, 0x74, 0x7a, 0xed, 0xd2, 0x11, 0x0e, 0x9b, 0x6e, 0x33, 0x6c, 0x95, 0x6d, 0x1e, 0xad, 0xa1, 0x6a, 0x95, 0x13, 0xc8, 0xa2, 0xdc, 0x99, 0x2e, 0x57, 0x45, 0xc2, 0x5a, 0xab, - 0xac, 0x1c, 0xcf, 0x14, 0x31, 0x0c, 0x96, 0x41, 0x43, 0x70, 0xe4, 0xfa, 0x20, 0x81, 0xd3, 0x68, 0x35, 0x23, 0xd4, 0xc1, 0x6b, 0x79, 0xa0, 0xd6, 0x1b, 0xa9, 0x28, 0xd3, 0x23, 0x15, 0x81, 0x4e, - 0xbf, 0xd9, 0x6b, 0x83, 0xa6, 0x76, 0xed, 0x6e, 0x5f, 0x86, 0xa1, 0x79, 0x06, 0x5f, 0x0b, 0x6f, 0xf4, 0x92, 0x2c, 0x0a, 0x3f, 0x6d, 0x34, 0xa8, 0x3f, 0xdf, 0x68, 0x7c, 0x9e, 0x88, 0xae, 0x91, - 0x90, 0x6f, 0x3b, 0xbf, 0x9b, 0x47, 0xe0, 0x49, 0xa0, 0xdd, 0x0d, 0xb6, 0x4f, 0xb1, 0x88, 0x75, 0x19, 0x3e, 0xdb, 0x93, 0xc0, 0x2f, 0xc5, 0x80, 0x3c, 0x7c, 0xc3, 0x47, 0x87, 0xdd, 0x5d, 0xbf, - 0xfa, 0x83, 0x47, 0xcc, 0x47, 0x36, 0x3e, 0x94, 0x76, 0x8c, 0xce, 0xf4, 0x55, 0xb4, 0xb4, 0x9a, 0xa9, 0x5c, 0x9e, 0x48, 0x15, 0x52, 0x14, 0xc3, 0x51, 0x0d, 0x57, 0xc4, 0x3a, 0x6e, 0x77, 0xb0, - 0x8a, 0x6c, 0xb6, 0xdd, 0xe1, 0xd0, 0x7c, 0xbe, 0x40, 0x37, 0xb3, 0xc6, 0x50, 0xa1, 0xbd, 0xa1, 0x88, 0x32, 0x3b, 0x97, 0x49, 0xeb, 0x90, 0x89, 0x82, 0x4e, 0x91, 0xcb, 0xcd, 0x3e, 0x70, 0x05, - 0xe5, 0xb0, 0x92, 0xd1, 0x63, 0xe8, 0xc4, 0x9b, 0xd7, 0x7a, 0xee, 0xf5, 0x20, 0xc8, 0x8f, 0x92, 0x1e, 0xcf, 0x96, 0x87, 0x47, 0x08, 0x79, 0x4f, 0xbd, 0x14, 0x2f, 0xda, 0x8c, 0x9f, 0xbc, 0xe4, - 0x59, 0x0f, 0x79, 0xa9, 0x3b, 0xd6, 0x96, 0x3c, 0x4c, 0xfb, 0x79, 0xd4, 0xc1, 0x32, 0x82, 0xd2, 0xdd, 0x89, 0x5a, 0xb4, 0xfb, 0xdc, 0x19, 0x78, 0x44, 0x5c, 0x95, 0x70, 0x44, 0x76, 0x6b, 0x74, - 0xea, 0x03, 0x27, 0x22, 0x6e, 0x95, 0x74, 0x27, 0x9c, 0x81, 0xe4, 0x3c, 0x9d, 0x73, 0xe7, 0xa9, 0x68, 0xc8, 0x5e, 0xcc, 0x9c, 0x30, 0xe4, 0x24, 0x9d, 0x09, 0xa0, 0x88, 0xa9, 0x3e, 0xf2, 0x37, - 0x54, 0x66, 0x9c, 0x07, 0x34, 0xa2, 0x65, 0x7c, 0xab, 0x3e, 0x53, 0x77, 0x7e, 0xe8, 0xa4, 0xef, 0xe6, 0xe5, 0xbb, 0x6a, 0x84, 0xcf, 0xfb, 0x70, 0x7c, 0xd7, 0x54, 0xb5, 0xf5, 0x5b, 0xee, 0xb7, - 0xff, 0xa8, 0x73, 0xae, 0xaf, 0x79, 0xd6, 0x3d, 0xd7, 0x9b, 0x63, 0x3b, 0x28, 0x0a, 0x08, 0x6f, 0x4a, 0x61, 0xd2, 0xcc, 0x6f, 0xfb, 0x1d, 0x0e, 0xd5, 0xae, 0x81, 0xa4, 0x8a, 0x99, 0x66, 0x73, - 0x1c, 0x4c, 0x78, 0x76, 0x23, 0x29, 0x8b, 0xad, 0xdf, 0x51, 0x35, 0x3e, 0x0c, 0xf5, 0x29, 0x53, 0xab, 0xb5, 0x22, 0xf6, 0xed, 0x0a, 0x5c, 0xa0, 0xd3, 0xa2, 0x81, 0x2b, 0x06, 0x92, 0x6a, 0x6d, - 0x85, 0x4a, 0x73, 0x48, 0x3f, 0x6e, 0x76, 0x89, 0xa3, 0x75, 0xe7, 0xb0, 0x33, 0x1a, 0xf3, 0xb5, 0xad, 0xc1, 0xff, 0x17, 0x1d, 0x94, 0xff, 0xce, 0xf6, 0x45, 0xbc, 0xa6, 0xe6, 0x7e, 0x88, 0x7d, - 0xeb, 0x80, 0xdb, 0xc9, 0x84, 0x18, 0xa7, 0xd0, 0x1a, 0x28, 0x75, 0x90, 0x77, 0x4b, 0xa7, 0x38, 0xb1, 0xe5, 0x3c, 0x67, 0xd3, 0xed, 0xb4, 0x6d, 0x76, 0x7a, 0x52, 0x34, 0x4d, 0x8b, 0x67, 0xba, - 0xb4, 0xc9, 0x39, 0x6f, 0x4f, 0x58, 0x5c, 0x59, 0xa2, 0x19, 0xca, 0x39, 0x53, 0x3a, 0x3e, 0x58, 0xc4, 0x7a, 0xe6, 0xab, 0x3b, 0x69, 0x9e, 0xda, 0x3d, 0xc7, 0x99, 0x2c, 0x00, 0x42, 0x59, 0xb6, - 0x22, 0x37, 0xa5, 0xdc, 0xa8, 0xbb, 0x73, 0xad, 0xba, 0xaf, 0x7e, 0x11, 0xd7, 0x9f, 0xfd, 0x6b, 0xbd, 0xc1, 0x7f, 0xbf, 0x44, 0xe4, 0xbf, 0xaf, 0x5e, 0xfe, 0xa2, 0x35, 0xf5, 0x93, 0xe0, 0x0f, - 0x38, 0xdf, 0xe2, 0xfc, 0x47, 0xda, 0x56, 0x63, 0x6b, 0xbd, 0xb7, 0xd0, 0xb5, 0x0d, 0x1c, 0xb6, 0xb9, 0x35, 0x27, 0x98, 0xca, 0x5b, 0x06, 0x2c, 0xe9, 0xea, 0x87, 0x62, 0xb9, 0xf7, 0xd7, 0xf2, - 0x5c, 0x61, 0xac, 0x85, 0x1d, 0xba, 0xa0, 0x5b, 0x4a, 0xc1, 0x31, 0xac, 0x8f, 0xc6, 0xa9, 0x01, 0x63, 0xaf, 0x16, 0xd4, 0x42, 0xd2, 0xd9, 0x4c, 0x3b, 0x40, 0xe7, 0xd5, 0x4a, 0xb5, 0xa3, 0xdc, - 0x5d, 0x22, 0x35, 0x50, 0x1b, 0x11, 0x66, 0x6f, 0x05, 0xe5, 0xb5, 0x1d, 0xc2, 0x97, 0x12, 0xef, 0xbf, 0x37, 0x61, 0x35, 0xb9, 0x57, 0x5a, 0xc7, 0xe7, 0x70, 0x52, 0xaf, 0xe9, 0x78, 0x1f, 0x62, - 0x6f, 0x55, 0x1a, 0xdf, 0x4e, 0x26, 0xd4, 0xcf, 0x3a, 0xde, 0x05, 0xca, 0x6c, 0x36, 0x07, 0x2c, 0xb1, 0x9a, 0x47, 0xe7, 0x73, 0x94, 0x48, 0x38, 0x2d, 0xc9, 0x33, 0x99, 0xdd, 0x01, 0x26, 0xb9, - 0x94, 0xcf, 0x71, 0x0f, 0x30, 0xdb, 0x12, 0xb4, 0x96, 0x9d, 0x00, 0x51, 0xa7, 0x15, 0xa0, 0x20, 0xd8, 0xb1, 0x62, 0x12, 0x7a, 0x07, 0xf3, 0x82, 0x7f, 0xb6, 0x60, 0x7f, 0x03, 0xc8, 0xc0, 0x6e, - 0x13, 0xef, 0xe9, 0x4c, 0x34, 0x73, 0xa9, 0xcd, 0xb2, 0x05, 0x98, 0x2b, 0x12, 0xbc, 0x7c, 0x6d, 0x6c, 0x3a, 0x59, 0x92, 0x67, 0xe9, 0xe5, 0xb7, 0x7b, 0x49, 0x58, 0xd7, 0x1f, 0x95, 0x57, 0xef, - 0xd2, 0xb2, 0x6e, 0x71, 0x05, 0xd1, 0x5b, 0x89, 0x59, 0xe4, 0x7e, 0xc5, 0xfd, 0x55, 0x62, 0x16, 0xbb, 0x2f, 0x8b, 0x77, 0x65, 0x1f, 0x7b, 0x8b, 0xf5, 0xf9, 0xca, 0x16, 0x7a, 0xc7, 0xa4, 0xea, - 0x67, 0x65, 0xf2, 0x2b, 0x27, 0xfe, 0x9b, 0x7d, 0xf8, 0x72, 0x3b, 0xbc, 0xe6, 0xc9, 0xfd, 0xfd, 0x6e, 0x1d, 0xfe, 0x5a, 0xa3, 0xd6, 0xab, 0x83, 0xcc, 0xfd, 0x35, 0x59, 0x7d, 0x99, 0xd3, 0x92, - 0xf0, 0xc6, 0xd3, 0x8e, 0xdc, 0xa5, 0x9a, 0xde, 0x18, 0x55, 0x2e, 0x5a, 0x1b, 0x7c, 0xbf, 0xbf, 0xfc, 0x5a, 0xe9, 0x8f, 0xfa, 0x13, 0x8f, 0xd1, 0x3b, 0x1a, 0xcf, 0x1c, 0x46, 0xf7, 0x18, 0x8d, - 0x1f, 0x77, 0x57, 0xc9, 0xe0, 0xe4, 0xf6, 0xf7, 0x9a, 0x28, 0x88, 0x8d, 0x73, 0x17, 0xc9, 0x8a, 0xc6, 0x2e, 0x9b, 0x9d, 0x8a, 0x7a, 0x4c, 0xbd, 0x5d, 0xcb, 0x6d, 0x2a, 0x1a, 0xe4, 0xda, 0x39, - 0x79, 0x35, 0x1c, 0x41, 0x35, 0x2e, 0x35, 0x52, 0xc5, 0x9e, 0x65, 0xf9, 0x5c, 0x79, 0x27, 0x06, 0x47, 0xcc, 0x98, 0x2a, 0x54, 0x9f, 0x5d, 0xc9, 0x8b, 0xb0, 0xea, 0xf4, 0x62, 0xd5, 0x2e, 0x35, - 0xee, 0xb0, 0x94, 0x8e, 0x3a, 0x40, 0x72, 0x60, 0x3b, 0x17, 0xc5, 0xc0, 0x0b, 0xba, 0xde, 0x3f, 0xfd, 0x26, 0x19, 0xf8, 0xae, 0x71, 0x0f, 0x46, 0xde, 0xf5, 0xce, 0xb5, 0x5c, 0xf9, 0x95, 0xad, - 0x07, 0xf9, 0xfb, 0xd3, 0x9d, 0xc7, 0x69, 0xd6, 0xc9, 0xbd, 0x80, 0xaf, 0xe6, 0xa6, 0xaf, 0x5d, 0x3e, 0x1e, 0xd3, 0xcf, 0x35, 0xce, 0x91, 0x71, 0x68, 0x56, 0xdc, 0x49, 0xee, 0x81, 0x43, 0x24, - 0xd4, 0x09, 0x4d, 0x08, 0x3a, 0x42, 0x66, 0x34, 0xc6, 0xce, 0xd8, 0x05, 0xcf, 0xce, 0x4d, 0x13, 0xdb, 0x61, 0x7a, 0xe1, 0x71, 0x92, 0x3e, 0x6f, 0x09, 0xaa, 0xde, 0x03, 0x91, 0x8d, 0xb6, 0x27, - 0x50, 0x19, 0xac, 0x8d, 0x26, 0x43, 0xf2, 0x7e, 0x33, 0x68, 0x75, 0xc2, 0xef, 0x04, 0xc8, 0x06, 0x2c, 0x57, 0xdd, 0x2f, 0x5a, 0xbb, 0x82, 0xe5, 0x85, 0xb5, 0x44, 0x46, 0xf1, 0x11, 0xfc, 0xaf, - 0xcf, 0x7f, 0xbf, 0x4c, 0x72, 0xf5, 0xd7, 0x24, 0xeb, 0xaf, 0xeb, 0x2f, 0xfa, 0xca, 0xfa, 0xfb, 0x2e, 0xf5, 0x7d, 0x8a, 0xbb, 0x1c, 0x4f, 0xae, 0xb2, 0x7e, 0x9e, 0xe1, 0x02, 0x25, 0x0b, 0x44, - 0x6f, 0xe5, 0x9f, 0x40, 0x87, 0xc6, 0xa8, 0x79, 0x9f, 0x5b, 0x60, 0x87, 0x51, 0xc1, 0xa9, 0x96, 0x09, 0xd3, 0x52, 0x0a, 0xdd, 0x86, 0xb6, 0x07, 0xbc, 0xe4, 0x5b, 0x0d, 0x9a, 0x93, 0xb9, 0xa5, - 0x54, 0x33, 0x15, 0xdd, 0xe2, 0xe7, 0xc1, 0x3d, 0x1b, 0x65, 0x15, 0x4b, 0xeb, 0x3a, 0x02, 0x8f, 0x2e, 0x46, 0x15, 0x3d, 0x8e, 0x41, 0xd1, 0xa6, 0x76, 0x2a, 0xa2, 0xe5, 0x60, 0xff, 0xc5, 0xc5, - 0xe2, 0x77, 0x13, 0xc3, 0x97, 0xf5, 0xe1, 0xb6, 0x15, 0x7c, 0xa6, 0xe5, 0x3c, 0xab, 0xff, 0xfb, 0xd5, 0x15, 0xfc, 0x92, 0x95, 0xe4, 0x87, 0xba, 0xbf, 0xe4, 0x38, 0xab, 0x49, 0x91, 0xcf, 0xe9, - 0x56, 0x89, 0xa7, 0x55, 0xdd, 0x48, 0xcb, 0xd6, 0xdb, 0x54, 0x29, 0xb9, 0x4c, 0x9d, 0xb5, 0xd2, 0xb6, 0x38, 0x04, 0x17, 0x2b, 0xcb, 0xd9, 0x9c, 0xb7, 0xb1, 0x04, 0x02, 0x7c, 0xd7, 0x3b, 0x53, - 0x00, 0x2a, 0x90, 0x8e, 0x1f, 0x5a, 0x8c, 0xf1, 0xdb, 0x9a, 0x82, 0x40, 0x46, 0x4e, 0x91, 0xbc, 0x90, 0x66, 0xd5, 0xda, 0x65, 0xc2, 0xec, 0xa8, 0x73, 0xca, 0x14, 0x90, 0xda, 0x4e, 0x79, 0x4d, - 0xc5, 0xfc, 0x52, 0xe7, 0xf7, 0x37, 0xa4, 0xc2, 0x1f, 0x0d, 0x0d, 0x86, 0xdc, 0x2b, 0xe3, 0x30, 0x3d, 0xfd, 0xc7, 0xe6, 0xe4, 0xef, 0xf2, 0x3f, 0xc3, 0xfb, 0xeb, 0xea, 0x58, 0xb3, 0xb2, 0x92, - 0x57, 0xb4, 0x19, 0xe7, 0x9a, 0xc3, 0x74, 0x92, 0xbc, 0xa5, 0x11, 0xc4, 0x9a, 0x2f, 0xb1, 0x35, 0x54, 0x93, 0x3c, 0xb5, 0x4e, 0xe8, 0xb6, 0x9a, 0xf7, 0xbe, 0xb4, 0x5b, 0x74, 0x09, 0xe9, 0x6c, - 0x2b, 0x94, 0xaf, 0x02, 0x11, 0x25, 0xb6, 0xd6, 0xfe, 0xd4, 0xb9, 0x24, 0xc4, 0xa4, 0x33, 0x49, 0x67, 0x34, 0xae, 0xaa, 0x3a, 0xc4, 0x53, 0x33, 0x87, 0x9a, 0x5b, 0x8a, 0xb6, 0x87, 0xf4, 0x26, - 0x7d, 0x6d, 0xe5, 0x7e, 0x80, 0xf1, 0xd7, 0x81, 0x7d, 0x5f, 0x2a, 0x9d, 0x7c, 0xde, 0x0f, 0xf5, 0xdb, 0xba, 0xfa, 0x78, 0xf6, 0x20, 0x5f, 0x98, 0x3d, 0xae, 0x12, 0xc1, 0xc9, 0xed, 0xef, 0x84, - 0xf8, 0x46, 0x5b, 0xf1, 0x10, 0x5d, 0x93, 0x6b, 0x12, 0x8c, 0x34, 0x42, 0x62, 0x23, 0x49, 0x2c, 0xb3, 0xa0, 0x12, 0x04, 0x41, 0x6b, 0x17, 0x47, 0xad, 0x3a, 0x40, 0xbc, 0x74, 0xe9, 0x18, 0xfc, - 0x51, 0x9a, 0x47, 0x5c, 0x89, 0xa7, 0xc7, 0x86, 0xb2, 0xdd, 0x15, 0xad, 0x6c, 0x4f, 0x44, 0x22, 0x82, 0x9d, 0x22, 0xb4, 0xd8, 0x20, 0x28, 0xce, 0x32, 0x9d, 0xef, 0xd2, 0xa5, 0x3d, 0x5f, 0x04, - 0x16, 0x56, 0x65, 0xf6, 0xb6, 0xc7, 0x87, 0x67, 0x34, 0xf8, 0x3f, 0xa0, 0x6b, 0x45, 0xed, 0xc7, 0x8c, 0xf0, 0x45, 0xcf, 0x88, 0x33, 0xd7, 0xaa, 0x82, 0x7f, 0x9c, 0x38, 0x4b, 0x3d, 0xf7, 0xdd, - 0x89, 0x8a, 0xdd, 0x33, 0xf8, 0xbc, 0x3d, 0x55, 0x97, 0x4d, 0xfa, 0x56, 0xe2, 0xea, 0xf2, 0x10, 0x76, 0x37, 0xf9, 0x7c, 0x0e, 0x1a, 0x78, 0x92, 0x64, 0xfb, 0xc9, 0x9e, 0x77, 0x79, 0xe2, 0x9e, - 0x8c, 0xfd, 0xbb, 0xf1, 0xe9, 0x8f, 0x62, 0x5b, 0x6e, 0xad, 0x7c, 0xb6, 0xa6, 0x52, 0x77, 0x1c, 0x46, 0xe3, 0x7b, 0xdf, 0x8a, 0x5a, 0x70, 0x72, 0xf9, 0xff, 0x84, 0xfa, 0x56, 0xef, 0xf0, 0xaf, - 0x67, 0xbd, 0x4f, 0x6e, 0x19, 0x24, 0x26, 0x80, 0xcd, 0x6c, 0xc7, 0x77, 0x3e, 0x40, 0x0a, 0x8d, 0x91, 0x39, 0xb6, 0xd6, 0x2a, 0xb2, 0x2b, 0x35, 0x04, 0x0a, 0xd6, 0xa5, 0xe2, 0xed, 0xf9, 0x06, - 0xd9, 0xb0, 0xdd, 0xe9, 0xe8, 0xd4, 0x69, 0x63, 0xc3, 0x56, 0x93, 0xb1, 0x80, 0x01, 0x6b, 0x86, 0x93, 0x40, 0xd3, 0xf9, 0x5e, 0x20, 0x8b, 0xa6, 0xa9, 0x9c, 0xf2, 0x5c, 0x24, 0xf4, 0xce, 0xe2, - 0x97, 0x73, 0xf0, 0xab, 0x0b, 0xe2, 0xaf, 0xc7, 0x23, 0xe0, 0xaf, 0xa7, 0xa3, 0xe0, 0x7a, 0xe7, 0x46, 0x9f, 0xeb, 0x79, 0xf9, 0xc4, 0x2b, 0x1a, 0xeb, 0xc6, 0x3f, 0x77, 0x5f, 0x06, 0xe0, 0xfa, - 0xe0, 0x35, 0x68, 0xbb, 0x72, 0x02, 0x2f, 0xb1, 0x26, 0x75, 0x69, 0x5d, 0x80, 0xfc, 0x95, 0x1b, 0x08, 0xdd, 0x3f, 0xfd, 0x38, 0xe1, 0xf4, 0xa6, 0xd8, 0x22, 0xf7, 0x0f, 0x37, 0x65, 0x78, 0x33, - 0x53, 0xdf, 0xc6, 0xc0, 0x08, 0x65, 0xe9, 0xc9, 0x8f, 0x79, 0xd6, 0xd5, 0xdf, 0x7f, 0xe2, 0xd8, 0xae, 0x7e, 0xf4, 0x22, 0x70, 0xf2, 0xf0, 0xf2, 0x03, 0xee, 0xe4, 0xbf, 0x9e, 0x0d, 0x06, 0x51, - 0xa0, 0x40, 0x79, 0x9a, 0xa2, 0x7a, 0xa4, 0x07, 0x2b, 0x33, 0x85, 0x63, 0x3e, 0x38, 0xb1, 0x16, 0x3d, 0xdf, 0x4b, 0xaa, 0xb2, 0xd5, 0x23, 0x2d, 0x38, 0x60, 0x33, 0x1a, 0x54, 0x52, 0xa9, 0xa5, - 0xfa, 0xf6, 0x58, 0xd4, 0x45, 0x4e, 0xeb, 0xd3, 0x95, 0x84, 0x25, 0xca, 0xb6, 0xdf, 0xf5, 0xb0, 0x12, 0x67, 0x58, 0x5d, 0x9c, 0xbd, 0xc2, 0x86, 0x2a, 0x29, 0x2e, 0x1b, 0x4b, 0x1a, 0x50, 0xb7, - 0x79, 0x9d, 0x99, 0xa5, 0xb6, 0x7e, 0x53, 0x3a, 0x05, 0x46, 0x5f, 0xd8, 0x42, 0x5e, 0x24, 0x5e, 0xe7, 0xc7, 0x6b, 0xc5, 0x94, 0x8b, 0x88, 0x9f, 0xe7, 0x47, 0x08, 0x34, 0x10, 0x48, 0xee, 0x94, - 0x95, 0x7a, 0xda, 0x3a, 0xfb, 0xf9, 0x2e, 0xc4, 0x68, 0x7a, 0x57, 0x01, 0x12, 0x2d, 0x9a, 0x66, 0x57, 0xc8, 0x1b, 0x2b, 0xcc, 0xb9, 0xf9, 0xa2, 0xcb, 0x61, 0xc8, 0xdd, 0x0a, 0x61, 0x7e, 0x68, - 0x77, 0x66, 0xa7, 0xaa, 0xf3, 0x10, 0x82, 0x0d, 0x50, 0x3a, 0xc5, 0x2b, 0x6e, 0x58, 0x6e, 0xd8, 0x60, 0xe5, 0x44, 0x99, 0x73, 0x02, 0x98, 0x4d, 0x3a, 0xf3, 0x79, 0xfa, 0xff, 0x4d, 0x45, 0xcc, - 0x8f, 0x0f, 0xe2, 0x5f, 0xf8, 0x7e, 0x37, 0x77, 0xb3, 0x22, 0xb9, 0x6f, 0x37, 0xef, 0x26, 0x36, 0x37, 0xab, 0xc3, 0x63, 0x9a, 0xdd, 0x4a, 0x4c, 0xfc, 0x0b, 0xdd, 0x2b, 0x65, 0x7e, 0x56, 0x4e, - 0x3c, 0xeb, 0x46, 0x5f, 0xf1, 0xef, 0x65, 0x43, 0xfd, 0xb5, 0xdc, 0x66, 0x93, 0xde, 0x8a, 0x48, 0xbe, 0x9b, 0xb0, 0xbe, 0xbf, 0xfc, 0x3d, 0x05, 0xeb, 0x5f, 0xf2, 0x5a, 0x1e, 0xeb, 0xd3, 0x9d, - 0xc0, 0xaa, 0x3e, 0x7e, 0xd2, 0x17, 0xa9, 0x61, 0x1a, 0x78, 0x65, 0x78, 0x63, 0x25, 0xf9, 0x17, 0xf9, 0x62, 0x41, 0xbc, 0x79, 0x04, 0x3e, 0xec, 0x37, 0xd7, 0x7f, 0xfb, 0x99, 0x4b, 0xea, 0xef, - 0x24, 0x4c, 0xc3, 0x24, 0xbc, 0xd1, 0xca, 0xfc, 0x7b, 0xd9, 0x44, 0x7c, 0xb9, 0xfb, 0x3d, 0x58, 0xf6, 0xdf, 0xaf, 0xe5, 0xca, 0x7f, 0x8d, 0x99, 0xf7, 0xd6, 0x7c, 0xbf, 0xfb, 0x96, 0x2b, 0x7b, - 0x81, 0xe3, 0xe1, 0x22, 0xf1, 0xdd, 0xab, 0x70, 0xfb, 0x25, 0x5f, 0x0b, 0x89, 0xde, 0x65, 0xa6, 0x52, 0x4f, 0x94, 0x81, 0x0f, 0xa2, 0xdf, 0x47, 0xc3, 0x1d, 0x7a, 0xa9, 0x8c, 0xf3, 0x9b, 0xcc, - 0xcb, 0x80, 0xbf, 0x1d, 0x4d, 0xa0, 0x71, 0xa5, 0x9b, 0x01, 0x0e, 0xe2, 0xf9, 0x63, 0x14, 0x65, 0xd3, 0x99, 0xa9, 0x23, 0x82, 0xef, 0xb6, 0xb2, 0xbf, 0x04, 0x84, 0x0d, 0x3f, 0x2f, 0xfb, 0x58, - 0xdf, 0x19, 0x9e, 0x83, 0x33, 0x96, 0x6c, 0xc8, 0xb0, 0xef, 0x11, 0xab, 0x21, 0xf0, 0x21, 0xd0, 0xdf, 0x25, 0x6b, 0xc8, 0x66, 0x43, 0x13, 0x66, 0xa9, 0xd9, 0x9e, 0x70, 0x38, 0x3d, 0x46, 0xf8, - 0x3c, 0xae, 0xb7, 0x79, 0x7d, 0x8e, 0xf4, 0x8d, 0xb6, 0x38, 0x6d, 0x46, 0xe4, 0x79, 0xd8, 0x61, 0x5a, 0x97, 0xde, 0xcd, 0xf8, 0x79, 0x33, 0x91, 0x3e, 0xc6, 0xca, 0xeb, 0xeb, 0xc9, 0xef, 0xb4, - 0xa7, 0xd7, 0xf8, 0x53, 0x7e, 0x89, 0xbd, 0x20, 0xf6, 0x71, 0x32, 0x86, 0x3b, 0x05, 0x9e, 0xf8, 0x30, 0x99, 0xad, 0x08, 0x82, 0x56, 0x8f, 0x3e, 0x3d, 0x6f, 0x79, 0x7f, 0x97, 0xed, 0x2b, 0x99, - 0x02, 0x62, 0x87, 0xdf, 0xfe, 0xec, 0x43, 0xbc, 0xaf, 0xc9, 0xf2, 0xdf, 0xe9, 0xe2, 0x5f, 0x24, 0x5f, 0x9a, 0xf5, 0xf9, 0x7c, 0xac, 0xfe, 0x7d, 0xb2, 0x98, 0x22, 0x81, 0x99, 0xc5, 0x7e, 0x9a, - 0xe7, 0xa8, 0xa8, 0x77, 0x0a, 0x85, 0x52, 0x88, 0xb6, 0xb4, 0xd3, 0x5c, 0x4f, 0x95, 0x93, 0x38, 0xed, 0x39, 0x71, 0xea, 0x6e, 0x6b, 0x74, 0x86, 0x00, 0x6e, 0xa2, 0x87, 0x1a, 0xa5, 0xc3, 0x3b, - 0xa9, 0x4b, 0x58, 0xa9, 0xa7, 0x17, 0xe5, 0x62, 0x8b, 0x91, 0x92, 0x1d, 0x98, 0x53, 0x62, 0x4d, 0x0c, 0x81, 0x29, 0xea, 0xcd, 0x30, 0x97, 0x78, 0x72, 0xcc, 0x70, 0x78, 0x52, 0x17, 0xe7, 0xf1, - 0x98, 0xf8, 0xf8, 0xcc, 0x9e, 0x81, 0xf7, 0xe7, 0x59, 0x52, 0x6f, 0x32, 0x6f, 0xb0, 0x5d, 0x8e, 0xae, 0x80, 0xfd, 0x90, 0x27, 0x05, 0x4f, 0x18, 0x77, 0xbf, 0x06, 0x89, 0x82, 0x12, 0xf5, 0xf8, - 0x58, 0xd9, 0xce, 0x69, 0x71, 0x80, 0x01, 0x26, 0xb3, 0x42, 0xcc, 0x57, 0x47, 0x0c, 0x85, 0x30, 0x1d, 0x7e, 0x43, 0x85, 0x0a, 0x7f, 0x2d, 0x64, 0x3c, 0xba, 0x25, 0x6f, 0x52, 0x2f, 0x4d, 0x79, - 0x3b, 0x9c, 0xdc, 0x44, 0xfd, 0xdc, 0xfb, 0x76, 0xc3, 0xaf, 0xce, 0x1d, 0x99, 0xe7, 0xc5, 0x90, 0x34, 0x12, 0x9a, 0xd7, 0x30, 0x14, 0x2d, 0x4f, 0x20, 0xb1, 0x15, 0x3c, 0x93, 0xb7, 0x43, 0x37, - 0x0c, 0x84, 0xad, 0x0a, 0x88, 0x44, 0x95, 0x1d, 0x59, 0x62, 0x91, 0xce, 0xce, 0x1c, 0x54, 0xd4, 0x8c, 0xb6, 0x5a, 0x36, 0x41, 0x07, 0xf7, 0xa8, 0x3b, 0x88, 0xc7, 0x03, 0x0f, 0x6e, 0xf6, 0xdc, - 0xca, 0xac, 0xf6, 0x1b, 0x0a, 0x06, 0x86, 0xf9, 0x99, 0xff, 0x16, 0x17, 0x50, 0x67, 0x6f, 0xc9, 0x2d, 0xa5, 0x95, 0x1e, 0x9f, 0x7d, 0xd7, 0xf8, 0x4b, 0x3e, 0x8d, 0xaf, 0xa2, 0x2f, 0x10, 0x7c, - 0xb9, 0x30, 0xc1, 0xc7, 0xf9, 0x36, 0x08, 0x5c, 0x26, 0xc3, 0x33, 0xa1, 0xe3, 0xc3, 0xa2, 0x84, 0x9d, 0xce, 0x39, 0xb6, 0xdb, 0xde, 0xb6, 0x57, 0x1d, 0xa9, 0x9e, 0xd0, 0xa3, 0x34, 0xe0, 0xee, - 0xca, 0xad, 0x4d, 0xac, 0x64, 0x5a, 0x8f, 0x2f, 0x82, 0xd2, 0x5d, 0xcb, 0x00, 0x1f, 0x82, 0xcb, 0x9e, 0xa8, 0x87, 0x0d, 0x24, 0x2e, 0x6c, 0x00, 0xe1, 0xe6, 0x43, 0xea, 0xcd, 0x85, 0x75, 0xc8, - 0x15, 0x25, 0xcd, 0xcc, 0x77, 0xe2, 0x89, 0xaa, 0x5e, 0xb3, 0xae, 0x84, 0xd5, 0x24, 0x6d, 0x12, 0xdb, 0xfb, 0x79, 0x8b, 0x99, 0x35, 0x4f, 0x2b, 0xae, 0xbd, 0x46, 0x32, 0x73, 0x95, 0x78, 0xc5, - 0xb0, 0x71, 0x82, 0xb1, 0x04, 0x33, 0xda, 0xac, 0xa7, 0xd4, 0x01, 0xdf, 0xf3, 0xb5, 0xb4, 0x53, 0xea, 0x55, 0x01, 0x08, 0x10, 0x0a, 0x56, 0x1b, 0xa6, 0xd4, 0xe7, 0xfc, 0xb2, 0xef, 0x18, 0xa7, - 0x68, 0x76, 0x32, 0xe2, 0x60, 0x28, 0xef, 0x41, 0x28, 0x38, 0xad, 0xbc, 0x32, 0xda, 0xce, 0x56, 0xe7, 0x3a, 0x52, 0xce, 0x04, 0x7b, 0x5a, 0x7b, 0xe7, 0x29, 0x03, 0x06, 0xb1, 0x37, 0xd0, 0xfa, - 0x7e, 0xc6, 0xf1, 0x5d, 0x67, 0xaa, 0xdd, 0x34, 0x7e, 0x6d, 0x03, 0x9f, 0x66, 0x79, 0xfd, 0xa1, 0x50, 0x3c, 0xa3, 0x39, 0xbb, 0x7a, 0xea, 0x53, 0xaf, 0xbb, 0x96, 0xff, 0x7c, 0x0a, 0xdf, 0x4b, - 0x63, 0xf1, 0xb3, 0xe4, 0x0b, 0x8c, 0x9f, 0xcf, 0x47, 0x87, 0x8d, 0xc1, 0xf2, 0xbe, 0xa2, 0xd1, 0xda, 0x28, 0x57, 0x15, 0xcf, 0x9d, 0xd6, 0xa7, 0xf3, 0x92, 0x05, 0xba, 0x29, 0x8b, 0x2c, 0x86, - 0xde, 0xd7, 0xb9, 0x0c, 0x53, 0x87, 0xb5, 0x83, 0xe5, 0x2c, 0x0f, 0x00, 0xac, 0x10, 0xa5, 0x05, 0xb4, 0x5c, 0xef, 0x88, 0xe9, 0x1e, 0x15, 0x48, 0x17, 0x04, 0x8f, 0x9b, 0x92, 0xdd, 0x74, 0x03, - 0x86, 0x4c, 0xed, 0xac, 0x91, 0xbd, 0xca, 0xb9, 0x68, 0x4a, 0x2a, 0xf0, 0xcc, 0xad, 0xf9, 0x15, 0x97, 0x6a, 0x92, 0x3e, 0xe7, 0x7f, 0x9f, 0xbe, 0x14, 0x01, 0xfa, 0x26, 0xf3, 0x82, 0xc5, 0xed, - 0x68, 0x32, 0x1d, 0x17, 0xf7, 0x19, 0xc8, 0x71, 0x4d, 0x9a, 0xf4, 0x7c, 0xa1, 0x6c, 0x39, 0x1f, 0x42, 0x05, 0x04, 0x47, 0x87, 0x9a, 0x37, 0x50, 0x77, 0x69, 0x73, 0x22, 0x57, 0xd2, 0xc5, 0xb4, - 0x58, 0x2d, 0x35, 0xd5, 0x98, 0xea, 0x4b, 0x23, 0x86, 0xcf, 0x64, 0x67, 0xa4, 0xc7, 0x5d, 0x89, 0x4a, 0x5b, 0xbc, 0x4f, 0x9a, 0x90, 0xca, 0x10, 0xda, 0xea, 0x2b, 0x49, 0xec, 0x57, 0xe7, 0xc8, - 0xf2, 0x79, 0x35, 0xd4, 0x66, 0x19, 0xcc, 0xbe, 0x68, 0xb7, 0x28, 0xdf, 0x0d, 0x42, 0x77, 0x0e, 0x0d, 0xa7, 0xf4, 0xac, 0xda, 0xfb, 0xb2, 0x86, 0xc1, 0xf7, 0xcf, 0x7c, 0x14, 0x89, 0xc1, 0xbe, - 0x79, 0x57, 0xac, 0x93, 0x77, 0x2b, 0x4f, 0xfb, 0xf1, 0x2f, 0xef, 0x4a, 0xbd, 0x3d, 0x88, 0x8d, 0xbe, 0xac, 0x92, 0xf8, 0x3f, 0x30, 0xf9, 0xf9, 0xc1, 0xe1, 0x53, 0x84, 0xee, 0xe3, 0x01, 0x5f, - 0x3d, 0x0b, 0xba, 0x80, 0xfe, 0x41, 0x5e, 0x5a, 0x70, 0x2a, 0xf7, 0xda, 0xa3, 0xee, 0xe4, 0x26, 0xe0, 0xe7, 0xee, 0xac, 0x18, 0xa0, 0xa2, 0x60, 0x10, 0xb1, 0x04, 0x4c, 0x51, 0x82, 0x30, 0x99, - 0x33, 0x75, 0xed, 0x62, 0x7d, 0x3e, 0x13, 0x6d, 0x95, 0xd5, 0xd2, 0x4c, 0xd8, 0x2d, 0x4f, 0x60, 0x46, 0x9d, 0xe6, 0xd4, 0xe2, 0x84, 0xa0, 0x51, 0x1c, 0x79, 0x8a, 0xa8, 0x45, 0x55, 0xcf, 0xae, - 0x13, 0x29, 0x31, 0xf8, 0x86, 0xdf, 0x8b, 0xd3, 0xaa, 0x53, 0x6a, 0xd8, 0x26, 0x42, 0xdd, 0x57, 0xf5, 0xbd, 0xb3, 0x0f, 0x5f, 0x24, 0x93, 0xf8, 0xdf, 0x97, 0x5f, 0x7f, 0x25, 0x9b, 0x76, 0xca, - 0xf0, 0x6d, 0xba, 0xc0, 0xfe, 0xa1, 0xee, 0xe3, 0x5d, 0xe2, 0x30, 0xad, 0xdf, 0x98, 0xd5, 0x6b, 0xaf, 0x9c, 0x5c, 0x6b, 0x17, 0x0d, 0x8f, 0xc7, 0xc1, 0x65, 0x6f, 0x64, 0xdf, 0xee, 0x5d, 0x8b, - 0x33, 0xde, 0x39, 0xd1, 0xb2, 0xee, 0x7a, 0x6b, 0x7a, 0xbf, 0xcd, 0xf8, 0x5a, 0x4d, 0xf8, 0x81, 0xb1, 0xea, 0x2b, 0x77, 0xe9, 0xef, 0x97, 0x82, 0x2a, 0x0e, 0xed, 0x67, 0x5a, 0xc5, 0x3f, 0xf0, - 0x6b, 0x9d, 0x1c, 0x87, 0xf6, 0xb5, 0x9b, 0xe3, 0xd0, 0x9e, 0xdc, 0x84, 0xfc, 0xdc, 0xd1, 0x7a, 0x1a, 0xa2, 0xb8, 0xb8, 0x39, 0x47, 0x47, 0xa1, 0xec, 0xbc, 0x76, 0xa8, 0x96, 0xfb, 0x39, 0x5d, - 0xd6, 0x3c, 0x93, 0xcb, 0xed, 0xe0, 0x51, 0xe7, 0x03, 0x08, 0x2d, 0xb0, 0xc5, 0x60, 0xa4, 0x18, 0x2a, 0x93, 0x20, 0x59, 0xb4, 0xdb, 0x4e, 0x0e, 0xa6, 0x33, 0xee, 0xb4, 0xf4, 0x3a, 0x5b, 0x68, - 0xe2, 0x43, 0x5a, 0xdb, 0xe1, 0x31, 0x71, 0xf6, 0x64, 0xe9, 0xea, 0xe8, 0x4c, 0xcc, 0xa6, 0x9d, 0xb2, 0x1e, 0x93, 0x4a, 0x50, 0xdf, 0x7a, 0xcc, 0xc9, 0x52, 0x3f, 0x3c, 0x4e, 0x7e, 0xa8, 0xf8, - 0x75, 0x0b, 0x5f, 0x7a, 0x09, 0x92, 0xef, 0xef, 0x78, 0xc3, 0xe8, 0xfb, 0x8d, 0xc9, 0xed, 0x35, 0x3f, 0x83, 0xd6, 0xcb, 0xdd, 0x54, 0x3e, 0x8a, 0x32, 0xcf, 0xa1, 0xe1, 0x46, 0xe9, 0x93, 0x0d, - 0xc9, 0x68, 0x25, 0xb0, 0xb0, 0xc0, 0xdd, 0xb9, 0x6c, 0xfd, 0x65, 0x1d, 0xb1, 0x35, 0xce, 0xcf, 0x62, 0x02, 0x3e, 0x9e, 0x10, 0x75, 0xc6, 0x81, 0xcc, 0x6c, 0x7a, 0x9a, 0xeb, 0x4a, 0xd4, 0x02, - 0xfd, 0xb0, 0x52, 0xe1, 0x52, 0xad, 0x53, 0x6b, 0xe0, 0x3d, 0x41, 0x3d, 0xac, 0x67, 0x8e, 0xa0, 0x53, 0x26, 0x4c, 0xa6, 0xcc, 0x38, 0xd0, 0x9a, 0x3a, 0x7c, 0x5a, 0x24, 0x0e, 0xfd, 0x07, 0x79, - 0x49, 0x89, 0xb8, 0x09, 0xbd, 0xc2, 0x72, 0x3d, 0x9a, 0xdc, 0x04, 0xfd, 0x8c, 0x43, 0xb2, 0xdc, 0x6c, 0xd0, 0x50, 0xd5, 0x79, 0x00, 0x55, 0x59, 0xa2, 0xe7, 0xf1, 0x13, 0x24, 0x2f, 0x82, 0x8d, - 0xa2, 0xce, 0x36, 0xf2, 0x6c, 0xde, 0x82, 0x80, 0x72, 0x5a, 0x48, 0x79, 0xa4, 0x68, 0x7d, 0xdf, 0x23, 0xe4, 0x66, 0xa3, 0xcc, 0x92, 0x84, 0x26, 0x20, 0x7a, 0x9a, 0x1f, 0x25, 0xb5, 0x15, 0x42, - 0x8a, 0xdb, 0x04, 0x8a, 0x20, 0x2f, 0x92, 0x68, 0xa6, 0xc8, 0xe7, 0x0a, 0xd1, 0x48, 0x09, 0x96, 0x5e, 0x9b, 0x25, 0xde, 0x3f, 0xa8, 0xcb, 0xc4, 0xfc, 0x94, 0xd4, 0xf6, 0xca, 0x7e, 0xeb, 0x04, - 0x9e, 0xf3, 0xac, 0x26, 0x06, 0xf4, 0xc5, 0xdc, 0x3b, 0x1a, 0xc0, 0x0f, 0xb1, 0xef, 0x24, 0xcc, 0xd7, 0x93, 0x09, 0xf4, 0xcd, 0xf0, 0xfb, 0xf8, 0x13, 0x8c, 0x3d, 0x35, 0x73, 0xa6, 0x4d, 0xc7, - 0xe9, 0x45, 0xa4, 0x75, 0xba, 0xa5, 0xee, 0x4d, 0x3a, 0x39, 0x0b, 0x0e, 0x6b, 0xe2, 0x14, 0x4e, 0x6d, 0x69, 0xa4, 0x6d, 0x7b, 0x58, 0x2d, 0xf1, 0x7e, 0xe5, 0x84, 0xbd, 0xbe, 0x92, 0x01, 0x8a, - 0x4f, 0x59, 0xe6, 0xa8, 0xe4, 0xb1, 0x8a, 0x42, 0x4d, 0x45, 0xd4, 0x5e, 0xe1, 0xc6, 0xd5, 0x89, 0xf5, 0x1b, 0xc0, 0xf2, 0xb0, 0x0d, 0x39, 0x95, 0xb2, 0x17, 0x93, 0x44, 0xbf, 0xd4, 0x21, 0xbc, - 0x11, 0xcd, 0xfc, 0x0e, 0x4a, 0xff, 0x77, 0x36, 0x12, 0xea, 0x95, 0x39, 0xec, 0x09, 0x9b, 0x35, 0x35, 0x66, 0x2a, 0xc3, 0x5c, 0xfb, 0xbc, 0x3a, 0x17, 0x6d, 0x54, 0x1f, 0x43, 0x01, 0x2f, 0x3b, - 0xf8, 0x84, 0x97, 0x8b, 0x65, 0x3d, 0xa3, 0xc5, 0x4d, 0xe2, 0x36, 0x6e, 0xc0, 0x0d, 0xb3, 0x85, 0x15, 0x89, 0x10, 0xec, 0x2f, 0x86, 0xc0, 0xa2, 0x57, 0x41, 0x95, 0x6d, 0xc4, 0x81, 0x18, 0x48, - 0x60, 0x25, 0x4e, 0xd1, 0x95, 0x9f, 0xb3, 0x75, 0x67, 0x4c, 0xc3, 0x22, 0x24, 0x4f, 0x0c, 0xd0, 0x77, 0x9b, 0x60, 0x5b, 0x89, 0xeb, 0x31, 0x51, 0xe3, 0x5f, 0x16, 0xa7, 0xc7, 0xf6, 0x51, 0xe4, - 0x85, 0x70, 0xbc, 0x5f, 0x62, 0xdf, 0xd0, 0xb8, 0x9d, 0x5c, 0xc3, 0x8d, 0x47, 0x84, 0xdb, 0x1d, 0x00, 0xaf, 0x8d, 0x8d, 0xa5, 0x99, 0x6e, 0x4f, 0xd6, 0x99, 0xda, 0x2b, 0xb3, 0xa6, 0xdf, 0xd3, - 0x53, 0x64, 0x30, 0x67, 0x72, 0x56, 0x97, 0xf8, 0x12, 0xd0, 0x82, 0x2d, 0x69, 0x33, 0x68, 0x60, 0xaa, 0xa9, 0xdb, 0xe3, 0x35, 0x27, 0x59, 0xb0, 0xdf, 0xcc, 0x8f, 0xde, 0x2e, 0xea, 0xe9, 0xb3, - 0x00, 0x2b, 0xa1, 0x88, 0xaf, 0xce, 0xad, 0xe5, 0xae, 0xf4, 0xfd, 0xc1, 0xf3, 0x9b, 0xa6, 0x33, 0xe7, 0xca, 0x98, 0x49, 0xaa, 0x49, 0xed, 0xac, 0x9f, 0xe4, 0x65, 0x98, 0x84, 0x75, 0xf8, 0x1b, - 0xe2, 0xc4, 0x57, 0xb8, 0xb1, 0xee, 0x64, 0x83, 0x93, 0xfb, 0x2b, 0x57, 0x03, 0xfb, 0x08, 0xa3, 0x1a, 0x01, 0xe7, 0x72, 0x3c, 0x67, 0xa6, 0x01, 0x0e, 0x1f, 0xb2, 0xd2, 0x1b, 0xd6, 0xd0, 0x4c, - 0xf1, 0x42, 0xd7, 0x13, 0x50, 0x81, 0xd9, 0x08, 0x9b, 0x34, 0x20, 0x80, 0xc3, 0x94, 0x87, 0x28, 0x14, 0x85, 0xc3, 0xbc, 0x20, 0xb6, 0x94, 0xc4, 0xea, 0xa6, 0x11, 0x16, 0x32, 0x91, 0x82, 0xb5, - 0xbd, 0xec, 0xb1, 0x0a, 0x5f, 0x4d, 0x1b, 0x25, 0x70, 0x06, 0x8f, 0x98, 0x95, 0xf6, 0x29, 0x3c, 0x9f, 0x66, 0xcc, 0x6b, 0x1f, 0xdd, 0x0f, 0xc1, 0x88, 0x81, 0x55, 0x4d, 0xec, 0xf0, 0x18, 0xbe, - 0xf3, 0x45, 0x3f, 0x7c, 0xa0, 0x1a, 0x12, 0x3b, 0x8b, 0x7f, 0x3d, 0xf0, 0x45, 0x39, 0xea, 0x82, 0xd0, 0x09, 0x26, 0x76, 0xd6, 0x7b, 0xee, 0x97, 0x6e, 0x79, 0x97, 0xf5, 0xf0, 0x03, 0x6f, 0x52, - 0xd7, 0xf3, 0x2b, 0xcb, 0x7f, 0x4e, 0xf8, 0xf3, 0xd9, 0x04, 0x3c, 0xbe, 0xff, 0xde, 0xa4, 0x5e, 0x7b, 0xee, 0xed, 0xf8, 0xca, 0x4c, 0x82, 0xff, 0xdc, 0x67, 0x5a, 0x2f, 0x89, 0xf3, 0xb2, 0xaa, - 0x66, 0x02, 0xb5, 0xdf, 0xc9, 0x4a, 0x21, 0xe2, 0x8b, 0xa4, 0x8a, 0x0e, 0x65, 0xd5, 0x62, 0x34, 0xa5, 0xc3, 0xc8, 0x1a, 0xa3, 0xcb, 0x59, 0x18, 0x5a, 0x43, 0x8b, 0x32, 0xc3, 0xc0, 0xa1, 0x66, - 0xbc, 0x3a, 0x12, 0xc3, 0x50, 0x35, 0xcd, 0xce, 0x70, 0xcd, 0xea, 0x70, 0x46, 0xf7, 0x1b, 0x67, 0x7f, 0x44, 0x7c, 0x17, 0x04, 0xd5, 0xc8, 0xc5, 0xe6, 0xcb, 0x03, 0x1c, 0x8e, 0xf9, 0xc0, 0x3f, - 0x7c, 0x4f, 0x8f, 0x3f, 0xee, 0x57, 0xd6, 0x8c, 0x9b, 0xc8, 0x0b, 0x0a, 0xd7, 0x83, 0x09, 0x36, 0x6e, 0xad, 0x98, 0x41, 0x83, 0xb2, 0x3f, 0x1b, 0xae, 0x3a, 0x9f, 0xa7, 0xd3, 0x14, 0x60, 0x31, - 0x80, 0x0b, 0xb0, 0x61, 0xc5, 0xd4, 0xc2, 0xd6, 0xb1, 0xd6, 0x55, 0x62, 0xcc, 0x98, 0x6a, 0xbf, 0xe3, 0xa8, 0x23, 0x28, 0x79, 0xd1, 0x66, 0x96, 0xb9, 0xfc, 0x16, 0x59, 0x2d, 0x7d, 0x11, 0xb5, - 0x05, 0x32, 0x52, 0x2b, 0x45, 0x4f, 0xdd, 0x2c, 0xdf, 0x93, 0xd2, 0x4a, 0xd7, 0x5c, 0xa3, 0x70, 0x60, 0x3f, 0x4a, 0x0e, 0xc4, 0x88, 0x9c, 0xd9, 0x4f, 0xc5, 0xc6, 0xde, 0x33, 0x91, 0x1e, 0x8f, - 0x9a, 0x3a, 0x7c, 0x46, 0x32, 0x72, 0x4d, 0xfd, 0x79, 0x61, 0xc4, 0xd4, 0x61, 0x7c, 0x81, 0xa9, 0x0e, 0xe3, 0xc9, 0x4d, 0xc4, 0xcf, 0x28, 0x9d, 0x4c, 0x1f, 0xdc, 0x10, 0xc1, 0x62, 0x55, 0x6a, - 0xcb, 0x15, 0xa1, 0x17, 0x12, 0xab, 0x86, 0xa1, 0x60, 0x01, 0xe4, 0xb4, 0x5b, 0x80, 0x0c, 0xb5, 0x05, 0xc4, 0xb9, 0x48, 0x6b, 0x4e, 0x7c, 0x1a, 0x8e, 0xa8, 0x8d, 0xb9, 0xc8, 0x89, 0xac, 0xa0, - 0x2d, 0xe7, 0xe5, 0x62, 0x14, 0xd2, 0x33, 0x07, 0xb0, 0x14, 0x54, 0x84, 0x65, 0x7a, 0x58, 0xf2, 0x64, 0x4e, 0xa8, 0x0e, 0x6f, 0x10, 0x7c, 0x52, 0xa6, 0x23, 0x4c, 0xa4, 0x9f, 0x3d, 0x28, 0xff, - 0x83, 0x7c, 0xf3, 0xaf, 0x54, 0x13, 0xab, 0x3c, 0x36, 0x89, 0xf7, 0xf9, 0x4b, 0xbe, 0xf7, 0xb1, 0x1c, 0xbd, 0xd4, 0x2b, 0xad, 0x3a, 0x2b, 0x27, 0xef, 0x4e, 0x9e, 0x8f, 0x47, 0xc9, 0xbb, 0x47, - 0x2f, 0x4b, 0x82, 0x3b, 0xb1, 0xca, 0xd2, 0x7a, 0xdb, 0xcb, 0xdc, 0x87, 0x24, 0xde, 0xbe, 0xfb, 0x47, 0x8f, 0x3d, 0xfb, 0xe6, 0x9b, 0xf0, 0xd9, 0xce, 0x93, 0xfa, 0x07, 0x7d, 0x65, 0xba, 0x6e, - 0xc2, 0xcb, 0xce, 0xf3, 0xf2, 0x67, 0x72, 0x95, 0xf0, 0x73, 0xdf, 0x01, 0xa2, 0x51, 0x21, 0x5b, 0x4f, 0xd0, 0x06, 0x80, 0xd3, 0x58, 0x69, 0x91, 0x4c, 0xfb, 0x34, 0x25, 0x96, 0x73, 0x26, 0x87, - 0x62, 0x72, 0x3b, 0x63, 0xc8, 0x24, 0xa6, 0xce, 0xbc, 0x9a, 0xac, 0x81, 0x29, 0xba, 0xc5, 0x45, 0x16, 0x12, 0x33, 0x67, 0x51, 0xa6, 0xdd, 0x69, 0x7f, 0xd2, 0x0f, 0xac, 0x18, 0xea, 0x28, 0xe8, - 0xe7, 0x73, 0xc2, 0xf2, 0x77, 0x14, 0x13, 0xd8, 0xe0, 0xf1, 0x4c, 0x2a, 0xa4, 0xf7, 0xcd, 0xc0, 0xd9, 0x52, 0x13, 0x27, 0x4b, 0xf2, 0x30, 0xf6, 0x3e, 0xa8, 0xac, 0xfe, 0x3b, 0x33, 0xff, 0xbd, - 0x70, 0x70, 0xf2, 0xed, 0xd2, 0x58, 0x63, 0x7f, 0x4c, 0xc5, 0xf3, 0x45, 0xc2, 0x3b, 0xbc, 0x61, 0x06, 0x58, 0x6a, 0x37, 0xa9, 0x68, 0xb6, 0xdb, 0xf9, 0xda, 0xc1, 0xf3, 0x96, 0x04, 0x94, 0x79, - 0x67, 0x51, 0x05, 0xc8, 0xbb, 0x6a, 0x4f, 0x35, 0x64, 0x5c, 0x69, 0xad, 0xcc, 0x6c, 0x92, 0x3c, 0x73, 0xd7, 0xf4, 0x5a, 0xec, 0x4e, 0x74, 0xb0, 0x9e, 0x83, 0xa0, 0xcb, 0x1a, 0x18, 0xb5, 0x69, - 0x56, 0x8b, 0x24, 0xaa, 0x5d, 0x4c, 0x39, 0x84, 0x4c, 0x39, 0x66, 0xca, 0xfb, 0xa1, 0x30, 0xcc, 0x33, 0x1b, 0xdc, 0x9f, 0x6b, 0x39, 0xbf, 0x7b, 0xd1, 0x05, 0xb8, 0xdf, 0xdc, 0xbe, 0x5a, 0xe8, - 0x46, 0x68, 0x42, 0x4c, 0xbe, 0x49, 0x10, 0x35, 0x04, 0x7b, 0x91, 0x04, 0x97, 0xdb, 0xcd, 0xbc, 0xce, 0xcd, 0x3e, 0x53, 0xb4, 0x59, 0x60, 0x4e, 0x4d, 0xe8, 0x54, 0xd4, 0xc3, 0x91, 0xa3, 0xf4, - 0xf9, 0x51, 0xdc, 0x52, 0x66, 0xcc, 0xa4, 0x7d, 0xb3, 0x4d, 0xb4, 0x20, 0xc2, 0x09, 0x22, 0xa2, 0x7c, 0x11, 0x9b, 0x37, 0x28, 0xb8, 0x4e, 0xec, 0xa0, 0x62, 0x32, 0xd2, 0x77, 0xe8, 0x75, 0x81, - 0x55, 0xd3, 0x00, 0x21, 0x17, 0xaf, 0xad, 0xf5, 0x77, 0xa9, 0xdb, 0xcf, 0x52, 0x91, 0x7f, 0x93, 0xb5, 0xfc, 0xf0, 0xc3, 0xbd, 0x7e, 0xe9, 0xbf, 0x59, 0xa8, 0xff, 0xfc, 0xcb, 0xbd, 0x4a, 0x04, - 0x27, 0xb7, 0xbf, 0x63, 0x09, 0xb9, 0x67, 0xfc, 0x0a, 0xdd, 0xc7, 0xf0, 0x5e, 0x43, 0xe5, 0x36, 0x26, 0xa1, 0x18, 0x1d, 0x0a, 0xd4, 0x20, 0xb0, 0x10, 0xb0, 0xba, 0xbc, 0xd3, 0x8b, 0x8a, 0x9b, - 0x19, 0xda, 0xe9, 0x54, 0x08, 0x75, 0x6a, 0xeb, 0xc7, 0x52, 0x60, 0x80, 0x21, 0x22, 0xcb, 0x40, 0x83, 0x4e, 0xcd, 0x82, 0xe9, 0xcf, 0x6b, 0xcb, 0xd0, 0xb9, 0x68, 0xa1, 0xe1, 0xd9, 0xd1, 0xca, - 0x37, 0xa2, 0xb0, 0xd8, 0x88, 0x42, 0x14, 0xda, 0xaf, 0xed, 0x07, 0xc3, 0xca, 0xeb, 0x7f, 0x85, 0x49, 0xff, 0x0e, 0xb6, 0x07, 0x8a, 0xd1, 0x7f, 0xa7, 0xaf, 0x3e, 0x7c, 0xc3, 0x07, 0xac, 0x77, - 0xd7, 0xc7, 0xea, 0xae, 0x76, 0x67, 0xba, 0x2d, 0x44, 0x6f, 0xf8, 0x3c, 0x8f, 0x59, 0x03, 0xd9, 0x98, 0x8a, 0x4e, 0xec, 0xdb, 0xa1, 0x11, 0xc9, 0x2c, 0x8a, 0x4a, 0x32, 0xee, 0x4e, 0x47, 0x22, - 0x89, 0xa1, 0x32, 0x5b, 0x0d, 0x53, 0xc3, 0x6b, 0x76, 0x25, 0xb9, 0xde, 0xa1, 0x24, 0x52, 0xc4, 0xa2, 0x06, 0x53, 0xea, 0xd6, 0x38, 0x1f, 0x8d, 0xcd, 0xf4, 0x1c, 0x72, 0x8e, 0x57, 0x6a, 0x85, - 0x29, 0x25, 0x8b, 0x74, 0x7a, 0x10, 0x5f, 0xb3, 0xb5, 0x86, 0xef, 0xba, 0xe9, 0xc7, 0x2a, 0x05, 0xdf, 0xad, 0x52, 0x76, 0x96, 0xc5, 0x9e, 0x95, 0x4e, 0x6e, 0x31, 0x00, 0x7f, 0x3f, 0x34, 0xba, - 0x7e, 0x78, 0x50, 0xbe, 0x3e, 0xf5, 0x7d, 0x75, 0xfc, 0x14, 0x24, 0xf4, 0x2d, 0x04, 0x21, 0x7c, 0xd7, 0x82, 0xff, 0xfe, 0xa5, 0x04, 0xff, 0xa6, 0xd7, 0xbf, 0x2e, 0x8b, 0x4f, 0x8c, 0x4e, 0xff, - 0xfc, 0x39, 0x85, 0xc5, 0x37, 0xe9, 0x1f, 0xbd, 0xfd, 0xe9, 0xda, 0xb5, 0xb8, 0xec, 0x08, 0xfe, 0x8a, 0x6e, 0xea, 0x60, 0xfd, 0xa9, 0x27, 0x12, 0x39, 0x74, 0xbb, 0x9c, 0x84, 0x29, 0xc8, 0x39, - 0x19, 0x9a, 0x2f, 0x24, 0x6d, 0x9f, 0x47, 0xb1, 0xd9, 0xac, 0x1a, 0x57, 0xac, 0x19, 0x1f, 0x13, 0xc1, 0x7a, 0x4f, 0xab, 0x33, 0xea, 0xb0, 0xb6, 0x75, 0x04, 0x2f, 0xcc, 0x8c, 0xae, 0xca, 0x9a, - 0x6b, 0x0c, 0x31, 0xe5, 0x3a, 0x34, 0xb7, 0x20, 0x5a, 0x3f, 0xda, 0xdc, 0x46, 0x99, 0x51, 0xe0, 0xc2, 0xf1, 0x46, 0x28, 0x32, 0x56, 0x6b, 0x85, 0xf1, 0xd5, 0xdd, 0xfe, 0xe9, 0x47, 0x57, 0x8f, - 0x71, 0xff, 0x61, 0xfb, 0xf2, 0x39, 0x92, 0xe5, 0x7f, 0xbe, 0x45, 0xb2, 0x1c, 0xb3, 0xdc, 0x7d, 0x3c, 0x74, 0x2e, 0xbb, 0x9a, 0x3a, 0xbb, 0x75, 0x78, 0x6d, 0xfd, 0xea, 0xf3, 0xfb, 0x81, 0xf3, - 0x48, 0xbd, 0x79, 0xe6, 0x49, 0xea, 0xb2, 0xd2, 0x9d, 0x74, 0xe5, 0x53, 0x32, 0x97, 0xd7, 0x4a, 0xa2, 0x7e, 0x48, 0xbd, 0xf4, 0xf4, 0xfb, 0xf1, 0xd8, 0x32, 0xa8, 0xcb, 0x33, 0x98, 0x94, 0x62, - 0x17, 0xd6, 0xa2, 0x12, 0x80, 0x4b, 0x95, 0xae, 0x05, 0xf0, 0xb0, 0x07, 0xf1, 0xc3, 0x12, 0x18, 0x8e, 0x0c, 0xc1, 0x1c, 0xc8, 0xc4, 0xd8, 0x98, 0x74, 0xbd, 0x94, 0x4a, 0xbb, 0xa2, 0x54, 0x32, - 0x6e, 0xe5, 0x1d, 0xd1, 0xfb, 0xe4, 0x62, 0xbd, 0x11, 0x58, 0xa8, 0xd1, 0xe0, 0xcd, 0x7a, 0x1e, 0x43, 0x4b, 0x12, 0x82, 0x8f, 0xa8, 0xc9, 0x35, 0x15, 0x90, 0x34, 0x0b, 0xbc, 0x1d, 0x43, 0xd7, - 0x74, 0xf9, 0x91, 0xf9, 0xf3, 0xa1, 0xff, 0xd2, 0x64, 0x77, 0x15, 0x79, 0x41, 0xe1, 0x7a, 0x30, 0x66, 0x3a, 0x83, 0x27, 0xf5, 0x6e, 0x3b, 0x8d, 0xce, 0xe4, 0xac, 0x88, 0xf4, 0x5e, 0x3c, 0x19, - 0x6c, 0x4b, 0x43, 0x5b, 0xb1, 0x11, 0x36, 0x75, 0x4e, 0xfd, 0xdc, 0x88, 0xbe, 0x7e, 0x9e, 0xa0, 0x8a, 0xbd, 0xd4, 0x86, 0xab, 0x44, 0x70, 0x72, 0xfb, 0x7b, 0x25, 0x99, 0x1a, 0x31, 0x21, 0xf3, - 0x1b, 0x43, 0x85, 0x43, 0x5a, 0x5f, 0xeb, 0xea, 0x91, 0xd6, 0xd3, 0xa9, 0xaa, 0x44, 0x61, 0x03, 0x08, 0x5a, 0x30, 0xa8, 0xfa, 0xb2, 0x6a, 0xfd, 0x9c, 0x4c, 0x9c, 0xc6, 0x48, 0xa6, 0xee, 0x4e, - 0xdd, 0x6c, 0x20, 0x70, 0x1e, 0xd5, 0xa5, 0xda, 0xb1, 0x74, 0xcf, 0x50, 0x08, 0x98, 0xcc, 0x35, 0xbb, 0xe6, 0x2b, 0x2e, 0x62, 0x57, 0x96, 0x0b, 0x75, 0xab, 0x2a, 0x73, 0xb1, 0x73, 0xb9, 0xa7, - 0x17, 0xdf, 0xd8, 0x43, 0x07, 0x2b, 0x8e, 0xc3, 0xa7, 0x06, 0xb7, 0xd7, 0xd8, 0xb5, 0xde, 0x64, 0x82, 0x93, 0xf7, 0xa3, 0xb1, 0xbc, 0x5a, 0x68, 0xe7, 0x72, 0xa1, 0x6b, 0x0e, 0x05, 0x2e, 0xcf, - 0x20, 0x0a, 0xd3, 0xf9, 0xc5, 0x0e, 0xdf, 0xe7, 0xd2, 0x4e, 0xa1, 0xd1, 0x2e, 0xd2, 0xe9, 0x78, 0xa5, 0x09, 0x41, 0x93, 0x20, 0x27, 0xc5, 0x69, 0x41, 0x0c, 0xde, 0xa5, 0x88, 0x97, 0x6c, 0x21, - 0x77, 0x70, 0xb6, 0x1a, 0xd6, 0x98, 0x3a, 0xef, 0x45, 0xdd, 0xa6, 0x3d, 0x12, 0x8b, 0xaa, 0xb5, 0xdd, 0xf8, 0xc0, 0x03, 0xac, 0xb1, 0x70, 0x6a, 0xf2, 0x1b, 0xbb, 0xfa, 0x60, 0x95, 0xc7, 0xea, - 0x07, 0xf2, 0xd8, 0x4b, 0x0f, 0xfd, 0xf9, 0x34, 0xfd, 0x59, 0xf2, 0xb5, 0xf5, 0xbf, 0x4e, 0x27, 0x37, 0x91, 0x3f, 0x63, 0x30, 0xc0, 0x70, 0xca, 0x2d, 0xe2, 0xfd, 0xea, 0x00, 0xcc, 0xf7, 0xa8, - 0xd9, 0x4e, 0x6b, 0xf2, 0xb0, 0x89, 0x81, 0x2d, 0x1a, 0xec, 0xb7, 0xd9, 0x7e, 0x6a, 0xc1, 0xdb, 0xb3, 0x77, 0x0e, 0x82, 0x98, 0x50, 0x72, 0x04, 0x3e, 0xae, 0xc1, 0xd5, 0x61, 0xaf, 0x91, 0x26, - 0x3a, 0x4c, 0x17, 0x9a, 0x1e, 0x34, 0xea, 0x6c, 0x8e, 0xec, 0x82, 0xd4, 0x07, 0x18, 0x1d, 0xb2, 0xd2, 0xda, 0x73, 0x72, 0xba, 0xdb, 0xc9, 0xa3, 0x4a, 0x7f, 0x5f, 0x3d, 0x88, 0x8f, 0x55, 0xf0, - 0x57, 0x9c, 0xbe, 0x43, 0x7a, 0x41, 0x20, 0x1d, 0x4b, 0xf1, 0xa3, 0xf6, 0xd8, 0x70, 0xe4, 0xb4, 0xaa, 0x41, 0x1c, 0x32, 0xac, 0x58, 0xcd, 0xa3, 0x8c, 0x06, 0x36, 0xe2, 0x66, 0x9d, 0x14, 0x87, - 0xa0, 0x2f, 0x36, 0x88, 0xc3, 0xeb, 0xe2, 0x96, 0xc6, 0x69, 0x67, 0x8e, 0x6e, 0x7d, 0x9b, 0x13, 0x73, 0x81, 0xf4, 0x1b, 0xc8, 0xa0, 0x6c, 0xf0, 0x0c, 0x13, 0xb9, 0xce, 0xa7, 0x6c, 0x6f, 0x1a, - 0xad, 0x16, 0xb8, 0xa8, 0x1f, 0xcc, 0x8c, 0x29, 0xc3, 0x27, 0x73, 0xe2, 0xb7, 0x53, 0xd6, 0xff, 0xba, 0xfc, 0xf7, 0x7f, 0xff, 0xaf, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, - 0x48, 0x12, 0x27, 0x18, 0xbb, 0x3c, 0x01, 0x00, 0xf4, 0x88, 0x04, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0x4d, 0x6f, 0xda, 0x40, 0x10, 0xbd, 0xf3, 0x2b, 0x46, 0x3e, 0xe4, 0x10, 0x65, 0xd7, 0xd8, 0xa0, 0x34, - 0x8d, 0x54, 0xa9, 0x55, 0x4a, 0xdb, 0x03, 0x6a, 0x0f, 0xfd, 0x38, 0x21, 0x90, 0xb1, 0x07, 0xb2, 0xc8, 0xac, 0xb7, 0x3b, 0x6b, 0x04, 0x8a, 0xf8, 0xef, 0xd5, 0x8e, 0x3f, 0xba, 0x7c, 0x34, 0xaa, - 0x14, 0x05, 0xd8, 0x79, 0xf3, 0xe6, 0xcd, 0xdb, 0x67, 0xbf, 0x0c, 0x00, 0x22, 0x9d, 0x6d, 0x31, 0x7a, 0x84, 0x08, 0x77, 0xa8, 0x9d, 0x78, 0xce, 0x74, 0x51, 0xa2, 0x8d, 0xee, 0x7c, 0x69, 0x87, - 0x96, 0x54, 0xa5, 0x7d, 0x75, 0x28, 0x13, 0x39, 0x6c, 0x4e, 0x0b, 0xa4, 0xdc, 0x2a, 0xe3, 0xda, 0xca, 0x8f, 0x83, 0xc1, 0xef, 0x7c, 0x00, 0x4f, 0x65, 0x55, 0x17, 0x13, 0xcf, 0x03, 0x5f, 0x42, - 0x9e, 0x52, 0xe5, 0xa8, 0x89, 0xa7, 0x7c, 0x30, 0x59, 0xfe, 0x8c, 0x22, 0xed, 0xc8, 0x2c, 0x9a, 0x8a, 0x94, 0xab, 0xec, 0x21, 0x7a, 0x04, 0xaf, 0x07, 0x20, 0x72, 0x07, 0xc3, 0xd8, 0xb5, 0x72, - 0x0c, 0x02, 0x88, 0x6a, 0x5b, 0xfa, 0x93, 0x68, 0x00, 0x70, 0xe4, 0xbe, 0x46, 0x02, 0xfd, 0x6d, 0x5a, 0xd6, 0xaa, 0x2c, 0x3c, 0x46, 0x9b, 0x3d, 0x08, 0x03, 0x9e, 0xa4, 0x01, 0x81, 0xa3, 0xbc, - 0xe3, 0x31, 0x16, 0x1d, 0x92, 0x6b, 0x70, 0x5b, 0xb0, 0xb5, 0x86, 0x52, 0x69, 0x07, 0x37, 0x37, 0xd0, 0xfd, 0x6e, 0x88, 0x5a, 0xbc, 0x07, 0x3f, 0xd6, 0x5a, 0x71, 0x87, 0x23, 0xa1, 0xab, 0x02, - 0xc1, 0xff, 0x5b, 0x6c, 0xab, 0xa2, 0x2e, 0x91, 0x62, 0x97, 0x19, 0x8c, 0x97, 0x4a, 0xf3, 0x17, 0xf0, 0xf8, 0xd8, 0xe3, 0xa5, 0xa3, 0x13, 0x0e, 0xa5, 0x1d, 0xae, 0x6d, 0xd6, 0x99, 0xf6, 0xbf, - 0x54, 0x41, 0xdb, 0x19, 0x63, 0xb8, 0x42, 0xaf, 0x32, 0xdc, 0xe3, 0x62, 0x6c, 0xdb, 0x4c, 0x2e, 0xb3, 0xdc, 0xfd, 0xe9, 0xe7, 0xd7, 0xa7, 0xc5, 0xf4, 0xdb, 0xe7, 0xc5, 0x74, 0xf2, 0x6b, 0x32, - 0x7d, 0xa7, 0xf4, 0xaa, 0x82, 0x55, 0x96, 0x91, 0xd8, 0x90, 0xb0, 0xb5, 0x76, 0x6a, 0x8b, 0x20, 0x63, 0xb6, 0x23, 0x56, 0xba, 0xc0, 0xbd, 0xdc, 0xf4, 0x0a, 0xbc, 0x69, 0x1c, 0x1a, 0x62, 0xfb, - 0x66, 0x11, 0xd9, 0x3c, 0xbe, 0xbd, 0x8d, 0x6f, 0xe5, 0xcb, 0x86, 0xee, 0x9c, 0xff, 0xdb, 0x1f, 0x67, 0x11, 0xcc, 0x58, 0xeb, 0xb5, 0x8a, 0x10, 0xbf, 0x6b, 0x85, 0xfd, 0x05, 0x17, 0xb8, 0xac, - 0xd7, 0xbc, 0x53, 0x55, 0xe0, 0xb6, 0xd2, 0x20, 0x84, 0xd2, 0x64, 0x30, 0x77, 0x20, 0xe3, 0x13, 0x97, 0xce, 0x24, 0xb2, 0x61, 0x79, 0xa9, 0xe4, 0x86, 0x2e, 0xd5, 0xf6, 0x71, 0x29, 0x70, 0xf7, - 0x11, 0x0d, 0xea, 0x02, 0x75, 0xae, 0x30, 0x88, 0xcd, 0x7b, 0xce, 0x09, 0x3b, 0xee, 0xa7, 0xcf, 0xc7, 0x32, 0x19, 0xb5, 0xd9, 0xec, 0xab, 0x9c, 0x22, 0xd1, 0xac, 0x1a, 0x37, 0x1f, 0xc2, 0x94, - 0xf5, 0x5a, 0xe9, 0xb6, 0x25, 0x1d, 0xbf, 0xda, 0x62, 0x32, 0x4b, 0x68, 0xaf, 0x60, 0x9b, 0x3a, 0x17, 0xde, 0xc8, 0xf4, 0xfe, 0xbc, 0x20, 0xf2, 0x4a, 0xaf, 0xd4, 0x5a, 0xf8, 0xd0, 0x3a, 0xd5, - 0x32, 0x3c, 0xc8, 0xd1, 0x05, 0xae, 0x11, 0x73, 0x8a, 0x1b, 0xc9, 0x60, 0x50, 0x6b, 0x2a, 0x17, 0x52, 0x39, 0x94, 0xe3, 0xf0, 0x79, 0xe8, 0x5b, 0xd2, 0x90, 0x9a, 0x6a, 0x83, 0xb6, 0x0b, 0xda, - 0xfc, 0x5e, 0x8e, 0x64, 0xd2, 0xc7, 0xef, 0xba, 0x59, 0x6d, 0xa6, 0xb9, 0xf2, 0x56, 0x26, 0x01, 0x9e, 0xf8, 0xc1, 0x9c, 0x0f, 0xfd, 0xf2, 0xc1, 0xe9, 0x3f, 0x77, 0x4c, 0x64, 0xf2, 0x10, 0xf0, - 0xf6, 0x86, 0x76, 0x16, 0xca, 0x71, 0x78, 0xb3, 0xaf, 0x5c, 0x6b, 0xaf, 0x27, 0xb9, 0x97, 0x49, 0x22, 0x93, 0xb4, 0xe3, 0xcc, 0xfd, 0x9b, 0x8a, 0xdf, 0x78, 0xd4, 0xee, 0x17, 0x98, 0x72, 0x96, - 0xb0, 0x4e, 0x92, 0x1c, 0xf2, 0xd4, 0xc1, 0x71, 0xf0, 0x27, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf6, 0x04, 0x7c, 0x2a, 0x21, 0x02, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0xa4, 0x55, 0x4d, 0x6f, 0xdb, 0x46, 0x10, 0xbd, - 0xef, 0xaf, 0x78, 0x45, 0x03, 0x50, 0x32, 0x24, 0xf2, 0x2e, 0xc5, 0x6e, 0x01, 0xc7, 0x40, 0xd2, 0x43, 0x1c, 0xc4, 0x6e, 0x80, 0xdc, 0xb2, 0x5a, 0x8e, 0xc4, 0x75, 0xc8, 0x5d, 0x66, 0x77, 0x29, - 0x59, 0x55, 0xf9, 0xdf, 0x8b, 0xfd, 0x20, 0x29, 0xbb, 0x86, 0x51, 0x34, 0xba, 0x68, 0x35, 0xf3, 0x66, 0xe6, 0xcd, 0xa7, 0x64, 0xd3, 0x6a, 0xe3, 0x70, 0xc2, 0x75, 0xad, 0xbb, 0xf2, 0x66, 0x4f, - 0xca, 0xa1, 0xc7, 0xd6, 0xe8, 0x06, 0x99, 0xf0, 0x22, 0xf2, 0x22, 0x9b, 0xad, 0xd9, 0x84, 0xd4, 0xca, 0xd1, 0xe3, 0x04, 0xdb, 0x72, 0x6e, 0x97, 0x0f, 0x76, 0x69, 0x3a, 0xe5, 0x64, 0x43, 0xd9, - 0x9a, 0xb1, 0xe2, 0xe2, 0x82, 0xe1, 0x02, 0x5f, 0x75, 0x67, 0xce, 0x1c, 0x5b, 0x6c, 0x3b, 0x25, 0x9c, 0xd4, 0x6a, 0x01, 0xa9, 0xf6, 0xfa, 0x3b, 0x95, 0x38, 0x48, 0x57, 0x81, 0xb8, 0xa8, 0x60, - 0xe8, 0x47, 0x47, 0xd6, 0xe5, 0xb8, 0xaf, 0xa4, 0xf5, 0xd6, 0xd2, 0x82, 0x2b, 0xd0, 0x23, 0x6f, 0xda, 0x9a, 0x46, 0x53, 0x1c, 0x2a, 0x29, 0x2a, 0xd4, 0x7a, 0x67, 0xe1, 0x2a, 0x82, 0x54, 0x42, - 0x37, 0x52, 0xed, 0x10, 0x88, 0x82, 0xab, 0x12, 0x24, 0x2a, 0x4d, 0xc1, 0x85, 0x07, 0x18, 0x12, 0x24, 0xf7, 0x54, 0x26, 0x40, 0xc9, 0x1d, 0x87, 0xd3, 0x41, 0x25, 0x78, 0x5d, 0x93, 0xc9, 0x19, - 0x02, 0xdb, 0x0f, 0x0e, 0x82, 0x2b, 0x6c, 0xe8, 0x29, 0xb9, 0xcc, 0x47, 0x4e, 0xa2, 0x2c, 0x7f, 0x0a, 0x74, 0x64, 0xdd, 0x88, 0x53, 0x6d, 0x13, 0x04, 0xd9, 0xe0, 0xf0, 0xf7, 0x96, 0x1b, 0xde, - 0xe0, 0x94, 0x0a, 0xd6, 0x43, 0xa4, 0xca, 0xf1, 0xf1, 0xa5, 0x37, 0x0f, 0x24, 0x5c, 0x7e, 0x8e, 0x8e, 0xa2, 0x11, 0x9c, 0x6f, 0x74, 0x79, 0x4c, 0x89, 0x84, 0x02, 0x21, 0x08, 0xe4, 0x16, 0x5c, - 0x1d, 0x5f, 0xb3, 0xfb, 0xd1, 0x91, 0x89, 0x86, 0xf1, 0x65, 0x9d, 0xf1, 0x65, 0x2a, 0xc9, 0x92, 0x91, 0xbc, 0xfe, 0x8b, 0x4a, 0xf0, 0x50, 0xe1, 0x68, 0xb8, 0xf8, 0x0f, 0x2e, 0x6b, 0xbd, 0xf3, - 0x85, 0xdf, 0x79, 0x3f, 0x51, 0x17, 0x53, 0x6f, 0xc8, 0x55, 0xba, 0xb4, 0xd8, 0x6a, 0x83, 0x4c, 0xaa, 0xad, 0xce, 0x16, 0xc8, 0x0e, 0xdc, 0x28, 0xff, 0x4d, 0xc6, 0x68, 0x93, 0x2d, 0x40, 0x4e, - 0xbc, 0x9a, 0x67, 0x45, 0xbc, 0x24, 0x13, 0x9b, 0xfa, 0xfe, 0xfe, 0xfe, 0xd3, 0x98, 0x6f, 0x52, 0x9c, 0xdb, 0xc6, 0x5c, 0x26, 0xdb, 0x48, 0xe0, 0xdf, 0xa6, 0x51, 0xfe, 0x9a, 0x65, 0xe5, 0x5c, - 0xfb, 0x85, 0x8c, 0xf5, 0x93, 0x35, 0x9a, 0xb7, 0x46, 0x3b, 0x2d, 0x74, 0x8d, 0x7d, 0xd4, 0x78, 0x07, 0x77, 0x44, 0x2b, 0x78, 0xb4, 0x5d, 0x15, 0xc5, 0x4e, 0xba, 0xaa, 0xdb, 0xe4, 0x42, 0x37, - 0xc5, 0x77, 0xc5, 0x9d, 0xdc, 0x53, 0xe1, 0xa7, 0xa4, 0xd8, 0xd4, 0x7a, 0x53, 0x34, 0x5c, 0xaa, 0xa2, 0xd4, 0xc2, 0x16, 0xbb, 0x4e, 0x96, 0x64, 0x0b, 0xa5, 0x4b, 0x7a, 0xb0, 0x79, 0x53, 0xfe, - 0xea, 0x2a, 0x5a, 0xa6, 0xc8, 0xcb, 0x98, 0xff, 0x93, 0x39, 0x19, 0x37, 0xa5, 0xc7, 0xb4, 0x7b, 0x81, 0xd6, 0xa4, 0x62, 0xb8, 0x28, 0x58, 0x51, 0x80, 0x6c, 0x2d, 0x95, 0x5b, 0x96, 0xd2, 0xf2, - 0x4d, 0x4d, 0x4b, 0xe5, 0x5d, 0xd6, 0x52, 0x11, 0x5a, 0x43, 0xce, 0x49, 0x32, 0xc5, 0xf0, 0x60, 0x42, 0x2b, 0x5f, 0x46, 0xae, 0xca, 0x9a, 0x70, 0x09, 0x6e, 0x8f, 0x4a, 0x60, 0x96, 0x78, 0xac, - 0x86, 0x7d, 0x5e, 0x9c, 0xc5, 0xfc, 0x6d, 0x75, 0x16, 0xf1, 0xed, 0x75, 0x67, 0x9d, 0x6e, 0xc8, 0x5c, 0xcd, 0x57, 0xf8, 0x64, 0x74, 0x23, 0x2d, 0xbd, 0x7d, 0x41, 0xfd, 0x77, 0xac, 0xed, 0xd5, - 0x15, 0x2e, 0xaf, 0x70, 0x62, 0x40, 0x51, 0xe0, 0xeb, 0xed, 0x9f, 0x9f, 0x71, 0x7d, 0xfb, 0xee, 0x06, 0xef, 0x6f, 0x3e, 0xdf, 0x30, 0x20, 0x72, 0x69, 0xc8, 0x71, 0x5c, 0x06, 0x10, 0x60, 0x75, - 0x67, 0x04, 0xad, 0xe2, 0xa2, 0xf9, 0x15, 0xcf, 0x03, 0x87, 0x2f, 0x92, 0x0e, 0x64, 0xb2, 0x45, 0xc0, 0xb8, 0x63, 0xeb, 0x11, 0x7e, 0xb3, 0x33, 0x06, 0xf4, 0xeb, 0xe8, 0xfe, 0xfe, 0xfc, 0x00, - 0x9c, 0xd7, 0xc8, 0x0f, 0xf3, 0xec, 0x97, 0x29, 0xa1, 0x79, 0x8a, 0x15, 0xc3, 0x1b, 0xb2, 0xad, 0x56, 0x96, 0x9e, 0x64, 0x99, 0xd8, 0xe3, 0x12, 0x8a, 0x0e, 0x2f, 0x28, 0x66, 0xd1, 0x03, 0x90, - 0xe7, 0x7e, 0xde, 0xf8, 0x62, 0xfa, 0x79, 0x1a, 0xf9, 0xa5, 0x59, 0xf7, 0x47, 0x66, 0x85, 0xec, 0xa3, 0x4e, 0x47, 0x67, 0xb8, 0x41, 0x19, 0xfa, 0x60, 0xd5, 0xcf, 0xd7, 0x03, 0x9d, 0x61, 0xb1, - 0x72, 0xbf, 0x37, 0xb3, 0x81, 0x59, 0xee, 0xf4, 0x5d, 0x08, 0x3b, 0x9b, 0x27, 0xa8, 0x21, 0xd7, 0x19, 0x35, 0x52, 0xf7, 0xc2, 0x9e, 0xbd, 0xe0, 0xe1, 0x1b, 0x5b, 0xfe, 0xff, 0x0f, 0x9b, 0xd2, - 0x5e, 0xb1, 0x37, 0xa7, 0xa9, 0x7e, 0x3d, 0x63, 0xef, 0x7c, 0x4e, 0xec, 0xcd, 0xe9, 0x8f, 0xbb, 0xdb, 0x8f, 0x79, 0xac, 0x89, 0xdc, 0x1e, 0x67, 0x13, 0x26, 0xf7, 0x59, 0xcf, 0xfb, 0x9f, 0x8a, - 0xff, 0x6d, 0x9e, 0x3a, 0x1b, 0xf3, 0x4c, 0xa7, 0x95, 0x3f, 0x6b, 0x09, 0x1b, 0xcb, 0xf1, 0xac, 0x55, 0xe3, 0xa4, 0xce, 0x4e, 0x63, 0x9b, 0x52, 0x33, 0x9e, 0xf1, 0x0c, 0x2d, 0xe8, 0xd7, 0x8c, - 0xd1, 0x63, 0xf8, 0x5b, 0x93, 0xca, 0x91, 0xd9, 0x72, 0x41, 0x18, 0x7c, 0x84, 0x89, 0x51, 0xbc, 0xa1, 0x55, 0x3a, 0x9d, 0x9e, 0x99, 0x48, 0xca, 0x0f, 0xe5, 0x24, 0xed, 0x47, 0x27, 0xa7, 0x61, - 0xc9, 0xfa, 0x35, 0xfb, 0x27, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4d, 0x81, 0x07, 0x66, 0x11, 0x03, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x8c, 0x52, 0x3f, 0x6f, 0xdb, - 0x3e, 0x10, 0xdd, 0xf5, 0x29, 0x6e, 0x23, 0xf5, 0x83, 0x2c, 0xe5, 0x97, 0xb6, 0x8b, 0x8d, 0x74, 0x09, 0x02, 0x24, 0x1d, 0x92, 0x02, 0x35, 0xba, 0x14, 0x1d, 0x18, 0xf1, 0x6c, 0x2b, 0x91, 0x49, - 0xe5, 0x78, 0x72, 0x6a, 0x18, 0xfa, 0xee, 0xc5, 0x51, 0xb2, 0xa4, 0x78, 0xea, 0x46, 0xde, 0x9f, 0x77, 0xf7, 0xde, 0x3d, 0xd5, 0x06, 0x84, 0xc0, 0x54, 0x95, 0xac, 0x56, 0x49, 0xb5, 0x6f, 0x3c, - 0x31, 0x9c, 0xe0, 0xb6, 0xf6, 0xad, 0xbd, 0x3b, 0xa0, 0xe3, 0x0c, 0xee, 0xd7, 0xeb, 0xef, 0xd0, 0xc1, 0x86, 0xfc, 0x1e, 0x54, 0x29, 0x09, 0x94, 0x44, 0x98, 0xd7, 0x07, 0x36, 0xc4, 0x19, 0x3c, - 0xb8, 0x83, 0x7f, 0x45, 0x7a, 0x6a, 0xb8, 0xf2, 0x2e, 0x8c, 0x4d, 0x1b, 0x63, 0xc2, 0xe2, 0x25, 0x2c, 0xa8, 0x75, 0x5c, 0xed, 0x71, 0x6a, 0x24, 0x7c, 0x6b, 0x31, 0xf0, 0x50, 0x16, 0xda, 0x06, - 0x89, 0x31, 0xc8, 0x26, 0xe7, 0x8a, 0xff, 0xc0, 0x04, 0xd8, 0xb4, 0xae, 0x1c, 0x6a, 0xf2, 0xbc, 0x78, 0x6e, 0xab, 0xda, 0x4e, 0x18, 0xd2, 0x90, 0xc1, 0x09, 0xd6, 0x02, 0x74, 0x9e, 0xc8, 0xa6, - 0x91, 0x31, 0x49, 0x51, 0xf4, 0x71, 0x3e, 0x36, 0x68, 0x67, 0xac, 0xc0, 0x1a, 0x36, 0x49, 0xe5, 0x18, 0x69, 0x63, 0x4a, 0x84, 0xdb, 0x36, 0xb0, 0xdf, 0x23, 0xc1, 0x29, 0x01, 0x70, 0x66, 0x8f, - 0xcb, 0x28, 0x8a, 0xdb, 0xae, 0x12, 0x80, 0x72, 0x48, 0x3e, 0xd8, 0x29, 0xda, 0x25, 0x49, 0xe9, 0x5d, 0xe8, 0x81, 0x96, 0x53, 0xff, 0xcd, 0x0c, 0x41, 0x71, 0xb5, 0x45, 0x52, 0xd9, 0x05, 0x84, - 0xba, 0xfa, 0xff, 0xfa, 0xd3, 0x67, 0x95, 0x74, 0xab, 0x33, 0xc6, 0x1e, 0x43, 0x30, 0x5b, 0x84, 0x9b, 0xa8, 0x75, 0xfe, 0x5c, 0x39, 0x43, 0x47, 0x2d, 0x38, 0xf8, 0x3e, 0x5b, 0x5a, 0x0b, 0x34, - 0x40, 0xf0, 0x2d, 0x95, 0x02, 0x5f, 0x08, 0xf5, 0x42, 0x48, 0x6c, 0xc9, 0x88, 0xe2, 0x71, 0x14, 0x44, 0xb2, 0x32, 0x5d, 0x94, 0xec, 0x23, 0x91, 0x2d, 0x40, 0x97, 0x26, 0xe9, 0x38, 0x14, 0x89, - 0xee, 0x8d, 0xb3, 0x75, 0x5c, 0x5a, 0xf3, 0x32, 0x0a, 0x95, 0xc2, 0xcd, 0x57, 0xd0, 0x48, 0xb4, 0x84, 0x3b, 0x22, 0x4f, 0xf1, 0x2f, 0x63, 0x39, 0x47, 0xf9, 0x4b, 0x2a, 0x5d, 0xf5, 0x7f, 0x67, - 0x75, 0xba, 0x8a, 0x2c, 0x64, 0x92, 0x56, 0x0f, 0xd3, 0x22, 0x4b, 0xd8, 0x45, 0xe8, 0x00, 0x06, 0x0e, 0xa6, 0xae, 0x2c, 0x44, 0xcb, 0xa8, 0x0c, 0x34, 0x8f, 0x90, 0xd1, 0x33, 0x5a, 0x6e, 0x9b, - 0xf7, 0xd5, 0x19, 0x9c, 0x3a, 0x39, 0xf7, 0x47, 0x17, 0xa5, 0x39, 0xef, 0xd0, 0x69, 0x1d, 0x90, 0x0e, 0x38, 0x2d, 0x24, 0x2b, 0x34, 0xb5, 0x71, 0xfa, 0x4b, 0xdc, 0x07, 0xce, 0x5e, 0x3a, 0xd7, - 0xc5, 0x18, 0x40, 0xde, 0x78, 0xd9, 0xad, 0x50, 0x63, 0x20, 0xc8, 0xe2, 0x83, 0xe2, 0xf9, 0xb3, 0xb7, 0xc7, 0x59, 0x86, 0xc7, 0xc4, 0x0e, 0x8d, 0x45, 0x0a, 0x63, 0x0e, 0xff, 0x34, 0x58, 0xb2, - 0xbe, 0xbe, 0xba, 0xba, 0x0c, 0xa9, 0x5b, 0xef, 0x18, 0x1d, 0x2f, 0xd6, 0xc7, 0x06, 0x55, 0x06, 0xc5, 0x4b, 0xf0, 0xae, 0x98, 0xaa, 0x9c, 0xd5, 0xa2, 0x5a, 0x06, 0x84, 0xa1, 0xad, 0x79, 0x46, - 0xa0, 0x27, 0x31, 0xea, 0x9a, 0x81, 0x7a, 0xf4, 0x10, 0xbf, 0x6a, 0xe0, 0xd4, 0x57, 0xf8, 0x57, 0x3d, 0xf4, 0xce, 0xa3, 0x16, 0xb1, 0xb9, 0x7b, 0x6b, 0x4d, 0x3d, 0x24, 0x23, 0x97, 0x0c, 0xbe, - 0xfd, 0x78, 0x7a, 0xcc, 0x1b, 0x43, 0x01, 0x3f, 0x90, 0x14, 0x5d, 0x7b, 0xef, 0xa6, 0x1f, 0x50, 0x70, 0x8e, 0x30, 0x90, 0xfe, 0xa5, 0x4a, 0x5c, 0x88, 0x89, 0xd4, 0xef, 0x0c, 0x14, 0x96, 0x3b, - 0xaf, 0xfe, 0xad, 0xa7, 0x77, 0x66, 0xec, 0x92, 0xb3, 0xca, 0xf9, 0xf2, 0x78, 0xf8, 0x9f, 0x15, 0xbe, 0xe3, 0x05, 0xab, 0xc1, 0x3f, 0xe7, 0x40, 0x7f, 0xb6, 0xbc, 0xac, 0x7d, 0xc0, 0x29, 0xde, - 0xc5, 0x57, 0x97, 0xcd, 0xdc, 0xaa, 0x59, 0x18, 0x48, 0xe2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x01, 0x5f, 0xde, 0xc3, 0x35, 0x02, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, - 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, - 0x73, 0x6c, 0x53, 0xcd, 0x6e, 0xdb, 0x3c, 0x10, 0xbc, 0xeb, 0x29, 0xe6, 0x46, 0x19, 0x50, 0xe4, 0xef, 0x6b, 0x73, 0x92, 0xe3, 0x00, 0x45, 0x90, 0x02, 0xb9, 0xb7, 0xbd, 0x06, 0x04, 0xb9, 0x8e, - 0xd8, 0x50, 0xa4, 0x4a, 0x2e, 0xe3, 0x18, 0x86, 0xdf, 0xbd, 0xa0, 0x7e, 0x2c, 0x05, 0xcd, 0x51, 0xb3, 0x43, 0xed, 0xfc, 0x90, 0x22, 0x45, 0x42, 0xe4, 0x60, 0x14, 0x8b, 0x5d, 0x51, 0x98, 0xae, - 0xf7, 0x81, 0xc1, 0x14, 0x19, 0x87, 0xe0, 0x3b, 0x08, 0x96, 0x3d, 0x89, 0xdd, 0x3c, 0x38, 0x83, 0xde, 0x7b, 0x52, 0xfc, 0xe3, 0xd4, 0x13, 0x2e, 0x33, 0x25, 0xea, 0x35, 0xe3, 0xc1, 0xfa, 0xa4, - 0x1f, 0xdf, 0xc8, 0xf1, 0x95, 0xa1, 0x32, 0x44, 0x19, 0x8a, 0x9f, 0x33, 0xbf, 0x27, 0xa7, 0xd8, 0x78, 0x57, 0xe1, 0xc1, 0x3b, 0xa6, 0xf7, 0xe5, 0xe8, 0x41, 0xca, 0x78, 0xf3, 0x3b, 0xde, 0x84, - 0xe4, 0xd8, 0x74, 0x1f, 0xa4, 0xb4, 0xd2, 0x69, 0x4b, 0x15, 0x1e, 0x52, 0x64, 0xdf, 0x51, 0xb8, 0x9e, 0xa9, 0xeb, 0x6d, 0x0c, 0x2a, 0xfb, 0xd9, 0x6e, 0xf1, 0xe8, 0x62, 0x0a, 0x04, 0x6e, 0x25, - 0x83, 0x5b, 0xc2, 0x61, 0x5a, 0x05, 0xe5, 0xbb, 0xde, 0x12, 0x53, 0x84, 0xb2, 0x24, 0x9d, 0x3d, 0xe1, 0xd8, 0x92, 0x43, 0x2f, 0x63, 0x24, 0x0d, 0x89, 0x37, 0x69, 0x8d, 0xc6, 0xa0, 0xba, 0x2e, - 0x72, 0x22, 0xa5, 0xf8, 0xe9, 0x0c, 0x37, 0xd3, 0xde, 0xf8, 0x91, 0x22, 0x2a, 0xc8, 0x78, 0x72, 0x0a, 0x25, 0x6f, 0xb0, 0xbf, 0xc7, 0xb9, 0x00, 0xb8, 0xee, 0xad, 0x74, 0xe5, 0xed, 0x66, 0x57, - 0x00, 0xca, 0xbb, 0xc8, 0xd0, 0x92, 0x65, 0xb3, 0x28, 0xde, 0x0f, 0x3c, 0xc0, 0xc9, 0x8e, 0x1a, 0x08, 0x36, 0x2f, 0x14, 0x44, 0x35, 0x40, 0x6a, 0xe2, 0x3c, 0xe9, 0x06, 0xe2, 0xbf, 0xff, 0xbf, - 0x7c, 0xbd, 0x15, 0x05, 0x70, 0xd9, 0x15, 0x05, 0xb0, 0xdd, 0xe2, 0xdb, 0x7a, 0x39, 0x8c, 0x53, 0x36, 0x69, 0x8a, 0x30, 0xba, 0x02, 0xe7, 0x72, 0xa4, 0xd3, 0x88, 0x3e, 0x05, 0x45, 0x90, 0x0c, - 0x89, 0xce, 0x38, 0xd3, 0xa5, 0xae, 0xbe, 0x2a, 0x59, 0x3a, 0x69, 0x56, 0x45, 0xdc, 0xcd, 0xd2, 0xee, 0xb1, 0x87, 0xa3, 0xe3, 0x6a, 0x54, 0x8e, 0x52, 0xcd, 0xa2, 0x67, 0x14, 0x9a, 0xd7, 0x35, - 0x10, 0xca, 0x77, 0x35, 0xbd, 0xcb, 0x9c, 0x69, 0xbd, 0xea, 0xbb, 0xce, 0xc9, 0x4d, 0xcc, 0x51, 0x4f, 0x03, 0xb1, 0x5d, 0x81, 0x39, 0x91, 0x6c, 0x6c, 0x33, 0x3b, 0x7b, 0x72, 0x6f, 0xfe, 0x95, - 0x3e, 0x76, 0x75, 0x34, 0xdc, 0x0e, 0xc8, 0xca, 0x74, 0x85, 0x63, 0x6b, 0x54, 0x8b, 0xd8, 0xfa, 0x64, 0xf5, 0xb5, 0xce, 0x81, 0xeb, 0x13, 0x83, 0x42, 0xf0, 0x61, 0xf1, 0x1b, 0x28, 0x26, 0xcb, - 0xd8, 0x43, 0x1e, 0xa5, 0xe1, 0xa9, 0xc4, 0xf2, 0x0c, 0xeb, 0x5f, 0x1a, 0x9c, 0x61, 0xdc, 0xc1, 0x37, 0x28, 0x9f, 0x87, 0xf2, 0x9e, 0x71, 0xc1, 0x05, 0x32, 0xce, 0xb7, 0xb1, 0x5a, 0xa5, 0x35, - 0x94, 0xc9, 0xb5, 0x7f, 0x2d, 0xc7, 0x3f, 0x4e, 0xdf, 0x9a, 0xa8, 0x7f, 0xfc, 0x93, 0xa4, 0x9d, 0xe0, 0x3a, 0xfb, 0xaa, 0x06, 0x77, 0x13, 0x83, 0xd6, 0xd3, 0x1c, 0x5a, 0x05, 0x41, 0xaa, 0xf5, - 0xe2, 0xb3, 0xf9, 0x18, 0x55, 0x05, 0x31, 0x47, 0x50, 0x0f, 0xcb, 0x7f, 0x19, 0x3a, 0x52, 0xb8, 0x9e, 0x70, 0xba, 0xdc, 0xec, 0x8a, 0x21, 0xba, 0x4f, 0x6e, 0xfa, 0x68, 0x71, 0x09, 0xd1, 0xc4, - 0xa1, 0xab, 0x1c, 0x55, 0x08, 0xa4, 0xd8, 0x9e, 0xea, 0x62, 0x79, 0xce, 0x77, 0xff, 0xbe, 0xc6, 0xfb, 0x72, 0xfc, 0xc5, 0x66, 0x57, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, - 0xf4, 0x10, 0xe2, 0xe7, 0xfb, 0x01, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xdd, 0x6e, 0x23, 0x37, 0x0f, 0xbd, 0xf7, 0x53, 0x10, 0x73, 0x33, 0x89, 0x91, 0xd8, 0xd9, 0x7c, - 0xf8, 0xb6, 0xad, 0xef, 0x16, 0x8e, 0x17, 0x48, 0xd1, 0x4d, 0x8b, 0x38, 0x05, 0x0a, 0x14, 0x45, 0x21, 0x6b, 0x38, 0x36, 0x53, 0x0d, 0x35, 0x10, 0xa9, 0x24, 0x83, 0xc5, 0xbe, 0x7b, 0x21, 0xc9, - 0x3f, 0x69, 0x7e, 0x8c, 0xf5, 0xcd, 0xd0, 0x33, 0xe2, 0xe1, 0xe1, 0x21, 0x75, 0xbe, 0x8e, 0x00, 0x2a, 0x62, 0xeb, 0x62, 0x83, 0xd5, 0x0c, 0xfe, 0x1c, 0x01, 0x00, 0x54, 0x12, 0xec, 0x74, 0x3c, - 0x9e, 0x8e, 0xab, 0x11, 0xc0, 0x5f, 0x67, 0xe9, 0x08, 0x3e, 0xed, 0x8f, 0x54, 0xec, 0x1b, 0xfc, 0xbb, 0xf3, 0x4d, 0x74, 0x28, 0x55, 0xf9, 0x6c, 0x7d, 0xd7, 0x93, 0xc3, 0xf0, 0x6b, 0xaf, 0xe4, - 0x59, 0xaa, 0x19, 0x7c, 0x2d, 0x48, 0x6a, 0xc2, 0x1a, 0xb5, 0x9a, 0x41, 0xb5, 0x58, 0x5e, 0x5e, 0x5c, 0x5e, 0x54, 0x67, 0xf0, 0xee, 0x6f, 0x3a, 0x86, 0x65, 0x8f, 0x96, 0xda, 0x01, 0x16, 0xf3, - 0x2f, 0x9f, 0x96, 0x36, 0x50, 0xaf, 0x50, 0x10, 0xe0, 0x01, 0x83, 0x90, 0xe7, 0x19, 0xd4, 0x8b, 0xe5, 0xff, 0x6a, 0x38, 0x69, 0xb0, 0x35, 0xd1, 0xe9, 0xe9, 0x59, 0x7a, 0xf1, 0xff, 0x3a, 0x3f, - 0x2e, 0x2f, 0x3e, 0x1c, 0xa2, 0x8f, 0xfb, 0xe8, 0x87, 0x7d, 0xf4, 0xe3, 0x3e, 0xfa, 0x69, 0x17, 0x5d, 0x5e, 0xd4, 0x67, 0xe0, 0x43, 0xfa, 0x73, 0xb3, 0xf8, 0xe3, 0xae, 0x9e, 0xc0, 0x78, 0x5a, - 0xa8, 0x97, 0x0e, 0x13, 0x75, 0xeb, 0xbb, 0xce, 0xf3, 0xbd, 0xbc, 0x4f, 0xfe, 0x19, 0xf5, 0x92, 0x06, 0xd6, 0x37, 0x08, 0x6b, 0x64, 0x0c, 0x46, 0x0b, 0x6f, 0xf6, 0x8c, 0xa9, 0xea, 0x0e, 0x2d, - 0xc5, 0xa6, 0x6b, 0xd2, 0x43, 0x06, 0x51, 0xec, 0x52, 0x14, 0xcb, 0x0b, 0x94, 0x5d, 0x2f, 0x29, 0x7a, 0xce, 0x11, 0x9f, 0xf4, 0x19, 0x47, 0x1f, 0xf5, 0x8a, 0x42, 0xe2, 0x38, 0x99, 0xae, 0x22, - 0xb9, 0xe6, 0x88, 0xbe, 0xd3, 0x31, 0xdc, 0x62, 0x43, 0x01, 0xad, 0x82, 0x8f, 0xda, 0x47, 0x05, 0xd1, 0x10, 0xad, 0xc6, 0x80, 0xa0, 0x1e, 0x74, 0x83, 0x50, 0x3e, 0xfb, 0x30, 0x1c, 0x4a, 0x88, - 0x06, 0xb2, 0x69, 0x82, 0x1a, 0x22, 0x1e, 0x99, 0xde, 0xb6, 0xc4, 0x82, 0xcd, 0xca, 0x21, 0x18, 0xe7, 0xa0, 0x64, 0x82, 0x0e, 0x3d, 0x9e, 0xdb, 0x0d, 0xda, 0x7f, 0x88, 0xd7, 0xe0, 0xcb, 0x86, - 0x1c, 0xf0, 0xd9, 0x5f, 0x77, 0xbd, 0x23, 0x4b, 0xfa, 0x89, 0x87, 0x6a, 0x06, 0xad, 0x71, 0xf2, 0x6e, 0x9d, 0xd4, 0x83, 0x21, 0x41, 0xc0, 0x10, 0x7c, 0x00, 0xcf, 0x80, 0x4f, 0x7d, 0x40, 0x49, - 0xab, 0x21, 0x60, 0xb8, 0x81, 0x06, 0xad, 0x33, 0x45, 0x73, 0x81, 0x47, 0xd2, 0x0d, 0x18, 0x06, 0x4a, 0x15, 0xb0, 0x81, 0xda, 0xf0, 0x50, 0x67, 0x42, 0x2f, 0xfb, 0xbb, 0x89, 0xce, 0xcd, 0x13, - 0x47, 0x39, 0xd6, 0xe9, 0xa1, 0xbf, 0x6d, 0x6f, 0x1c, 0x9d, 0x83, 0xdc, 0x9b, 0xbc, 0x44, 0xfc, 0x1c, 0xd9, 0x26, 0x16, 0x77, 0x43, 0x8f, 0xef, 0x83, 0xbe, 0x42, 0x3c, 0x08, 0xd5, 0x42, 0xbb, - 0x85, 0xc8, 0x8c, 0xdf, 0x94, 0xec, 0x6e, 0x43, 0x47, 0x09, 0xbf, 0xa5, 0x58, 0xad, 0x1b, 0x92, 0xfa, 0x3f, 0xc2, 0x7d, 0x8f, 0x4e, 0xec, 0x7f, 0xe7, 0x28, 0xd8, 0xfc, 0xe2, 0xad, 0x71, 0xdf, - 0x51, 0x14, 0x7b, 0x1f, 0xb4, 0x54, 0x95, 0x54, 0x36, 0xe6, 0x6c, 0x70, 0x39, 0xfd, 0x35, 0xec, 0x6f, 0x26, 0x98, 0x0e, 0x15, 0xc3, 0x11, 0xe8, 0x23, 0xb0, 0xfd, 0x3e, 0xfd, 0x2d, 0x99, 0x6e, - 0x51, 0x63, 0xe0, 0x63, 0xa4, 0x5f, 0x40, 0xc3, 0xe3, 0x06, 0x19, 0xd8, 0x6b, 0x5e, 0xe4, 0x7c, 0x97, 0x7b, 0xa3, 0x1b, 0x01, 0xe2, 0xc3, 0x54, 0x42, 0x46, 0x05, 0x03, 0x0f, 0xc6, 0x45, 0x7c, - 0x69, 0x1c, 0xb7, 0x28, 0xde, 0xc5, 0x74, 0x30, 0x5d, 0xcf, 0xe4, 0x99, 0x6f, 0xdd, 0xcd, 0xd7, 0xc6, 0x11, 0xf6, 0x79, 0x69, 0x25, 0x8c, 0xe2, 0x7a, 0xc8, 0xe6, 0xd1, 0x60, 0x0d, 0x27, 0x37, - 0xbe, 0xc1, 0xc9, 0xbd, 0x9c, 0x66, 0x37, 0xb0, 0xce, 0x88, 0x90, 0xad, 0xe1, 0x24, 0xed, 0xd8, 0xd6, 0x2e, 0xfb, 0x80, 0xe7, 0x1f, 0x26, 0x1f, 0x4f, 0x0f, 0x74, 0x50, 0xbe, 0x64, 0xe4, 0x6b, - 0x56, 0x0c, 0xbe, 0x3f, 0x3a, 0xb9, 0xfd, 0x3a, 0x0a, 0x60, 0x47, 0x0a, 0x54, 0x72, 0x30, 0x98, 0x15, 0x39, 0xd2, 0x01, 0x56, 0xa8, 0x8f, 0x88, 0x0c, 0xf3, 0x6c, 0x62, 0x3f, 0x2f, 0xf3, 0x9d, - 0x5b, 0x2c, 0xa1, 0x94, 0x10, 0x78, 0x20, 0x03, 0x36, 0x60, 0xbe, 0x7f, 0x69, 0x85, 0xd9, 0x74, 0x28, 0xbd, 0xb1, 0x08, 0x7e, 0x75, 0x8f, 0x56, 0x05, 0x5a, 0x1f, 0xb2, 0xa8, 0xd4, 0x25, 0xb9, - 0x65, 0x02, 0x79, 0x48, 0x28, 0x50, 0x1b, 0xe7, 0xfc, 0xe3, 0x72, 0x60, 0xdd, 0xa0, 0x92, 0xbd, 0x2a, 0x06, 0x7f, 0x5d, 0x8e, 0x3d, 0xf3, 0xbc, 0xd6, 0x07, 0x8b, 0x73, 0xcf, 0x42, 0xa2, 0xc8, - 0x3a, 0x37, 0x42, 0xbc, 0xbe, 0xe6, 0xcf, 0xe4, 0xf0, 0x26, 0x55, 0xdb, 0x36, 0xb8, 0xeb, 0xe7, 0x8a, 0x24, 0x03, 0x03, 0xb1, 0xdd, 0x27, 0xb9, 0xe1, 0xdc, 0x9a, 0xb4, 0x37, 0x01, 0x5b, 0x0c, - 0xc8, 0x16, 0x65, 0x67, 0x81, 0x62, 0x3a, 0x84, 0x96, 0xdc, 0x6e, 0xa0, 0xdf, 0x46, 0xdf, 0x46, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, - 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, - 0x70, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x94, 0x91, 0xb1, 0x6a, 0xc4, 0x30, 0x0c, 0x86, 0x77, 0x3f, 0x85, 0xd0, 0x7c, 0xe1, 0xe8, 0xea, 0xa9, 0x0f, 0x70, 0xd0, 0xa5, - 0xdb, 0x91, 0xc1, 0x24, 0xea, 0x61, 0x70, 0xac, 0x54, 0x96, 0x69, 0x4b, 0xc8, 0xbb, 0x17, 0xdb, 0x69, 0x28, 0x21, 0xcb, 0x4d, 0xc6, 0xe8, 0xfb, 0xa4, 0x5f, 0x68, 0x31, 0x00, 0x28, 0xcc, 0x8a, - 0x16, 0x54, 0x32, 0x5d, 0xca, 0x7f, 0x76, 0x92, 0x48, 0xd0, 0x02, 0xbe, 0xea, 0xcf, 0x4c, 0x69, 0x10, 0x3f, 0x6b, 0x47, 0x29, 0xf8, 0xa8, 0xd7, 0xad, 0xd8, 0xc0, 0x90, 0x1f, 0x3e, 0x26, 0xb4, - 0x70, 0x37, 0x00, 0x70, 0xc6, 0x57, 0xb0, 0xa0, 0x42, 0xaa, 0x9e, 0x04, 0x01, 0xfa, 0xea, 0xd2, 0xb7, 0x52, 0x1c, 0xff, 0xb9, 0x8d, 0xb7, 0x42, 0x03, 0x4f, 0x13, 0xc5, 0x91, 0xc6, 0xdd, 0xad, - 0x63, 0xec, 0x49, 0x98, 0xf6, 0x74, 0x4f, 0x39, 0x67, 0xf0, 0x31, 0x9c, 0xe4, 0x40, 0x25, 0xda, 0xd2, 0xea, 0x91, 0xbb, 0x81, 0x63, 0xe2, 0x40, 0x68, 0xe1, 0xe5, 0x20, 0x5d, 0x77, 0xfb, 0x6f, - 0x95, 0xb2, 0x8c, 0x08, 0x0b, 0x5e, 0x60, 0x01, 0xa4, 0x38, 0xbe, 0x7d, 0xdc, 0x7c, 0x2c, 0x2e, 0xba, 0xac, 0x8c, 0xb0, 0x56, 0xac, 0xdf, 0x1a, 0x7d, 0x66, 0xd6, 0x3a, 0xed, 0xbe, 0x6b, 0x98, - 0x7c, 0x7c, 0x04, 0x6a, 0x0d, 0x5c, 0x08, 0xfc, 0xf5, 0x4e, 0xd3, 0x1c, 0x9c, 0xd2, 0xcd, 0x2b, 0x89, 0x0b, 0x69, 0xbb, 0x17, 0xac, 0xbd, 0x01, 0x58, 0xcd, 0x6a, 0x7e, 0x03, 0x00, 0x00, 0xff, - 0xff, 0x50, 0x4b, 0x07, 0x08, 0x84, 0x7e, 0x8c, 0x5d, 0xd6, 0x00, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, - 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0xaa, 0xe6, 0x52, 0x50, 0x50, 0x2a, 0x4e, 0xcd, 0xcd, 0x54, 0xb2, 0x52, 0x28, 0x29, 0x2a, 0x4d, 0xd5, 0x01, 0xf1, 0x4b, 0x8a, 0x12, - 0x33, 0x73, 0x32, 0xf3, 0xd2, 0x9d, 0xf3, 0x73, 0x73, 0x13, 0x95, 0xac, 0x14, 0x94, 0xf2, 0xf2, 0xf3, 0x52, 0x95, 0xc0, 0x52, 0xc5, 0x99, 0x79, 0xe9, 0x39, 0xa9, 0x81, 0xa5, 0xf9, 0x25, 0xa9, - 0xc8, 0x3a, 0x0a, 0x8a, 0x32, 0xf3, 0x4a, 0xc2, 0x33, 0x53, 0x4a, 0x32, 0x94, 0xac, 0x14, 0x0c, 0x8d, 0x0c, 0xb8, 0x6a, 0xb9, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x06, - 0xc9, 0xf3, 0xed, 0x51, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, - 0x6d, 0x64, 0xac, 0x58, 0x6d, 0x73, 0xdc, 0xb6, 0x11, 0xfe, 0xce, 0x5f, 0xb1, 0xb5, 0x3e, 0x58, 0xf2, 0x9c, 0x48, 0x8d, 0x3b, 0x9d, 0xc9, 0x9c, 0x62, 0x6b, 0x62, 0x57, 0xad, 0x94, 0xaa, 0xb1, - 0x47, 0xba, 0x24, 0xed, 0xa8, 0x9a, 0x12, 0x24, 0xf6, 0x8e, 0xb0, 0x41, 0x80, 0x01, 0xc0, 0x3b, 0xb3, 0x71, 0xfe, 0x7b, 0x67, 0x01, 0xf0, 0x4d, 0x77, 0x72, 0x93, 0x69, 0x3e, 0xdd, 0x11, 0x5c, - 0x2c, 0x9e, 0x7d, 0xf6, 0x15, 0x3c, 0x82, 0x55, 0xd7, 0xe0, 0x5d, 0x69, 0x44, 0xe3, 0xe0, 0x6a, 0xb5, 0x7a, 0x0f, 0x7f, 0x69, 0x55, 0xe9, 0x84, 0x56, 0x49, 0xf2, 0x23, 0xca, 0x52, 0xd7, 0x08, - 0x4e, 0x43, 0xa7, 0x5b, 0x03, 0x0a, 0x77, 0x53, 0xe9, 0x75, 0x14, 0x84, 0xc6, 0xe8, 0x0f, 0x58, 0xba, 0x3f, 0xc0, 0xaa, 0x42, 0x28, 0xb4, 0x90, 0x68, 0x1a, 0xc9, 0x1c, 0x8e, 0x12, 0xa5, 0xe6, - 0x08, 0x25, 0x53, 0x50, 0x20, 0xac, 0x75, 0xab, 0x38, 0x08, 0x05, 0xf7, 0xb9, 0x50, 0x1c, 0x3f, 0xa5, 0xce, 0xe6, 0x0f, 0xc7, 0x69, 0xd6, 0x3f, 0x9c, 0xa4, 0xb0, 0xaa, 0x84, 0x1d, 0x37, 0xef, - 0x84, 0x94, 0x60, 0xd0, 0x36, 0x5a, 0x71, 0xc2, 0x22, 0x54, 0xa9, 0x6b, 0xa1, 0x36, 0x01, 0xee, 0x5f, 0x2f, 0x57, 0xc0, 0x14, 0x87, 0xf7, 0xef, 0xee, 0x56, 0x60, 0xf0, 0xa7, 0x16, 0xad, 0xb3, - 0x69, 0x92, 0x1c, 0x1d, 0xc1, 0x8d, 0x2e, 0x99, 0x04, 0xfc, 0x84, 0x65, 0x1b, 0x0c, 0x5a, 0x69, 0x30, 0xad, 0x02, 0x49, 0xeb, 0xb2, 0x4b, 0x92, 0x3c, 0xcf, 0x4b, 0xad, 0xac, 0x96, 0x98, 0xa8, - 0xa6, 0x06, 0xa1, 0xac, 0x63, 0x52, 0xfa, 0xff, 0x24, 0x57, 0xb4, 0x42, 0xf2, 0xe1, 0xc9, 0xef, 0xa2, 0x2d, 0x49, 0x42, 0x76, 0x9a, 0x56, 0x39, 0x51, 0x63, 0x40, 0x87, 0x9f, 0x1a, 0x6d, 0x11, - 0x5c, 0x65, 0x10, 0x01, 0x15, 0x6f, 0xb4, 0x50, 0x1e, 0x05, 0xc0, 0x0b, 0xc8, 0xb3, 0xdc, 0x33, 0xd3, 0xaf, 0xc3, 0x5a, 0x9b, 0x40, 0x68, 0x6f, 0x62, 0x1a, 0xe5, 0x2a, 0x64, 0xd2, 0x55, 0x99, - 0x41, 0xc6, 0x85, 0x42, 0x6b, 0x0f, 0xec, 0x63, 0x30, 0xbc, 0x85, 0x20, 0x0e, 0x65, 0x85, 0xe5, 0xc7, 0xb9, 0x06, 0x29, 0xb6, 0xf8, 0xa4, 0x82, 0xfe, 0xe5, 0x7c, 0xbf, 0x37, 0xaa, 0x61, 0x86, - 0xd5, 0xe8, 0xd0, 0x90, 0x4f, 0xb7, 0x82, 0xa3, 0x27, 0xdc, 0x55, 0x13, 0x57, 0x0e, 0xca, 0x98, 0x03, 0xa1, 0xb6, 0xba, 0x64, 0x7e, 0x59, 0x58, 0x60, 0x90, 0xbf, 0xd5, 0xca, 0xe1, 0x27, 0x97, - 0x83, 0x2e, 0x28, 0x22, 0xa0, 0xd4, 0xca, 0x31, 0xa1, 0x06, 0x67, 0x45, 0xff, 0x80, 0x50, 0x6b, 0x6d, 0x6a, 0x16, 0x6c, 0x27, 0x4e, 0x3f, 0xd8, 0x64, 0x38, 0xa1, 0x62, 0x8a, 0x4b, 0xbc, 0x0d, - 0xa2, 0xc7, 0x65, 0x50, 0x79, 0x02, 0x3f, 0x27, 0x40, 0xfa, 0xac, 0x03, 0xa9, 0x37, 0xf0, 0x0a, 0xe2, 0x8b, 0x54, 0xea, 0xcd, 0x79, 0x02, 0xb4, 0x98, 0x92, 0xda, 0x7e, 0x43, 0x5a, 0x39, 0xd7, - 0xfc, 0x80, 0xc6, 0x0a, 0xad, 0x4e, 0x0e, 0x0a, 0xd4, 0xe8, 0x2a, 0xcd, 0x4f, 0xce, 0x21, 0xcb, 0xbc, 0x89, 0x33, 0x84, 0xe1, 0x25, 0x1c, 0x6b, 0x25, 0x3b, 0x1f, 0x63, 0xda, 0x84, 0x10, 0xb3, - 0x6d, 0xd3, 0x68, 0xe3, 0x90, 0x9f, 0x1c, 0xd2, 0xf9, 0x53, 0x8b, 0xa6, 0x0b, 0x2a, 0xc5, 0x1a, 0xfc, 0xd3, 0x48, 0xaa, 0x05, 0x66, 0x70, 0x64, 0x56, 0x28, 0x60, 0x5e, 0x75, 0x3c, 0xf3, 0x90, - 0xbe, 0x42, 0xf3, 0xa8, 0x2e, 0x52, 0x69, 0x3d, 0xd4, 0x1e, 0x25, 0xbd, 0x8e, 0x5e, 0x9d, 0xc6, 0xff, 0x41, 0x3a, 0x90, 0x71, 0x34, 0x36, 0x28, 0x63, 0x52, 0x06, 0x73, 0xe3, 0x2a, 0x58, 0x54, - 0x0e, 0x76, 0xc2, 0x55, 0x5e, 0x3d, 0x6e, 0x51, 0xb9, 0xe4, 0x97, 0x31, 0xd8, 0xa7, 0x91, 0x62, 0xfb, 0x44, 0x66, 0x65, 0x89, 0xd6, 0x06, 0x43, 0x7c, 0x38, 0x17, 0x46, 0xef, 0x2c, 0x1a, 0x8a, - 0x8c, 0x7b, 0x62, 0x7f, 0x99, 0x65, 0x3e, 0x69, 0x2a, 0x6d, 0xdd, 0xf2, 0xab, 0xb3, 0xaf, 0xce, 0xf6, 0x02, 0xfc, 0xe1, 0xf8, 0xc4, 0x27, 0xef, 0x97, 0xc5, 0xfb, 0x80, 0x7d, 0x38, 0x3e, 0x49, - 0xe1, 0x9f, 0xba, 0xf5, 0x00, 0x5a, 0x8b, 0x90, 0x97, 0xad, 0x91, 0x39, 0x85, 0x68, 0x4e, 0xe6, 0xe7, 0xc0, 0x54, 0xc0, 0xfe, 0x64, 0xd4, 0x2e, 0x67, 0x49, 0x4f, 0xdb, 0xe1, 0xf4, 0x1f, 0x81, - 0xbb, 0x53, 0x0e, 0xcf, 0x7f, 0x7e, 0x56, 0xa1, 0x94, 0xfa, 0xd9, 0x12, 0x9e, 0xed, 0xb4, 0x91, 0xfc, 0xd9, 0x2f, 0xcf, 0xe1, 0x5f, 0x09, 0xc0, 0xe9, 0xd5, 0x73, 0x1f, 0xda, 0xca, 0x9d, 0xba, - 0xae, 0xc1, 0x25, 0xb0, 0xa6, 0x91, 0x22, 0x84, 0x7e, 0xf6, 0xc1, 0x6a, 0x15, 0xc4, 0x0e, 0x5a, 0x31, 0x29, 0x19, 0x43, 0xe6, 0x92, 0xcd, 0x43, 0x1a, 0x0e, 0xf5, 0xc2, 0xdb, 0x74, 0xaf, 0xb7, - 0x68, 0xa4, 0x66, 0xfc, 0xb4, 0x31, 0xda, 0xa1, 0x87, 0xff, 0x70, 0x4c, 0x9a, 0xed, 0x32, 0xcb, 0x76, 0xbb, 0x5d, 0xaa, 0x9a, 0xfa, 0x83, 0x4d, 0x4b, 0x5d, 0x67, 0x0d, 0x2b, 0x3f, 0xb2, 0x0d, - 0x66, 0x07, 0xb6, 0x04, 0x5e, 0x67, 0xa5, 0xd3, 0xbb, 0x37, 0xf7, 0x6e, 0xff, 0xd3, 0xd9, 0x1f, 0xe1, 0x0e, 0xcd, 0x56, 0x94, 0x08, 0xdf, 0x2b, 0xb6, 0x65, 0x42, 0xb2, 0x42, 0x62, 0x1e, 0x64, - 0x28, 0x91, 0xa5, 0x20, 0x63, 0x6f, 0xd1, 0x99, 0x2e, 0x8f, 0x51, 0x42, 0x11, 0x3d, 0x2b, 0x5b, 0x94, 0xf4, 0x9c, 0x02, 0xbb, 0x16, 0x2a, 0x54, 0x8a, 0x02, 0xa1, 0xc7, 0x82, 0x7c, 0x01, 0x05, - 0xa3, 0xf0, 0xd0, 0xca, 0xfb, 0xa2, 0xc6, 0x5a, 0x9b, 0x0e, 0x5a, 0xcb, 0x36, 0xe8, 0xc1, 0x05, 0x4f, 0x49, 0xad, 0x1b, 0xe0, 0x28, 0x59, 0x17, 0x8a, 0x36, 0x11, 0xd5, 0xb7, 0x20, 0xb8, 0x56, - 0x0e, 0xcd, 0x9a, 0x95, 0x18, 0x08, 0xcc, 0xad, 0x29, 0x87, 0x3e, 0x91, 0xc3, 0x5a, 0x48, 0x84, 0x9a, 0x75, 0xbe, 0xfc, 0x1a, 0x07, 0x0c, 0xac, 0x50, 0x1b, 0x39, 0x71, 0xbb, 0xcf, 0x8c, 0xbc, - 0x57, 0x97, 0x27, 0xa1, 0x2c, 0xa5, 0xfe, 0x90, 0x71, 0xb9, 0xaf, 0x56, 0x4c, 0x4a, 0xbd, 0x23, 0x93, 0xb6, 0x28, 0x75, 0x43, 0x69, 0xe1, 0x34, 0x30, 0x4e, 0xae, 0x5a, 0x63, 0xd9, 0x95, 0x12, - 0xa1, 0xd2, 0xfa, 0xa3, 0xa5, 0x8c, 0x4b, 0x84, 0x12, 0x4e, 0x30, 0x29, 0xfe, 0x13, 0xea, 0x1f, 0x19, 0x64, 0xab, 0xd6, 0x71, 0xbd, 0x53, 0x0b, 0x60, 0x16, 0x76, 0x28, 0x25, 0xfd, 0x86, 0x74, - 0xa7, 0x0a, 0xc8, 0x60, 0xc7, 0x3a, 0xdf, 0xc0, 0xea, 0x46, 0x62, 0x4d, 0xc6, 0x97, 0xad, 0x75, 0xba, 0x4e, 0x66, 0xe9, 0x95, 0x46, 0x5b, 0x47, 0x78, 0xa2, 0x67, 0x21, 0x10, 0xbe, 0xf6, 0x6c, - 0x33, 0x1b, 0x62, 0x99, 0xe2, 0xd1, 0xfa, 0x86, 0x9c, 0x44, 0x1a, 0x46, 0xf1, 0x81, 0x47, 0xaa, 0x9d, 0x59, 0xe6, 0xcd, 0x7e, 0x84, 0xbb, 0xa7, 0x6a, 0x01, 0xd4, 0x13, 0x91, 0x43, 0x81, 0x6b, - 0x6d, 0xd0, 0x7b, 0xcc, 0xa2, 0xd9, 0x92, 0xdb, 0x2d, 0x58, 0xc7, 0xa8, 0xe4, 0xf5, 0x5a, 0xa6, 0xdd, 0x59, 0x58, 0xd0, 0x0d, 0xfd, 0x63, 0x32, 0x92, 0xa0, 0x5b, 0x49, 0x6a, 0xc0, 0x76, 0xaa, - 0xac, 0x8c, 0x56, 0xba, 0xb5, 0xd4, 0xe0, 0xe8, 0xe0, 0x8b, 0x25, 0x1c, 0x9f, 0xc0, 0xab, 0xd7, 0xc0, 0x54, 0x77, 0x9e, 0x8c, 0xa0, 0x7a, 0xe6, 0xf6, 0xe1, 0xb0, 0x35, 0x75, 0xa3, 0xc7, 0x68, - 0x74, 0xd3, 0xfc, 0x9f, 0x68, 0xfa, 0x13, 0x9f, 0x42, 0x34, 0x64, 0xe7, 0x1e, 0x22, 0xa7, 0x83, 0xa3, 0x28, 0x1d, 0xe6, 0xb8, 0x18, 0x6d, 0xfa, 0x0d, 0xa8, 0x0c, 0xba, 0xd6, 0x28, 0x78, 0x79, - 0x76, 0x96, 0xbd, 0xfb, 0xdb, 0x13, 0xea, 0x08, 0x6b, 0x8f, 0xe5, 0x62, 0x09, 0x57, 0x3e, 0x52, 0xde, 0xd2, 0xf9, 0x53, 0xb4, 0x63, 0x65, 0xf9, 0x0d, 0x70, 0x69, 0x93, 0x8f, 0x47, 0x2a, 0xe4, - 0x8d, 0x1b, 0x86, 0xa7, 0xdf, 0xcf, 0x02, 0x7f, 0x02, 0x59, 0x30, 0xe0, 0x3b, 0x60, 0x82, 0xd4, 0x9b, 0x1b, 0xca, 0xb8, 0x8b, 0x25, 0xdc, 0xc4, 0xbf, 0x53, 0xd3, 0x06, 0x08, 0x4e, 0xc7, 0xc9, - 0x60, 0xd6, 0xa8, 0x09, 0x6d, 0x58, 0x5e, 0xc2, 0x5b, 0xa9, 0x5b, 0x7e, 0x49, 0x55, 0x65, 0x08, 0xfc, 0xcf, 0x5e, 0xb8, 0x7f, 0x3c, 0xef, 0x7b, 0xda, 0xd1, 0x11, 0x5c, 0x05, 0x5d, 0x77, 0x62, - 0xa3, 0x98, 0x6b, 0x4d, 0xac, 0x30, 0x5e, 0xf5, 0x68, 0xf5, 0xaf, 0x4c, 0xbc, 0x51, 0x6e, 0x7a, 0x9a, 0xcf, 0xba, 0xbe, 0xff, 0x2e, 0x21, 0xce, 0x46, 0x0b, 0xdf, 0xb4, 0x2f, 0x96, 0x70, 0x1d, - 0xc7, 0xd8, 0x37, 0xd4, 0xe2, 0x97, 0xb3, 0x9d, 0xb7, 0x9e, 0xd6, 0x01, 0xed, 0x8f, 0x15, 0xc6, 0x8c, 0xcc, 0xa7, 0x9b, 0x72, 0x42, 0x85, 0xc2, 0x55, 0xd4, 0x72, 0xc1, 0x3a, 0x23, 0xd4, 0x66, - 0x01, 0x0c, 0xde, 0xb4, 0xeb, 0x35, 0x1a, 0xfa, 0xf7, 0x2d, 0xdb, 0xb2, 0x38, 0xac, 0x87, 0x12, 0xb7, 0xa0, 0x8a, 0xd8, 0xaa, 0x68, 0xca, 0x02, 0x38, 0x36, 0xa8, 0x7c, 0x71, 0xa2, 0x39, 0xbb, - 0x62, 0x0e, 0x76, 0xcc, 0xfa, 0x11, 0x47, 0x8a, 0xd0, 0xd8, 0x87, 0xc1, 0xc8, 0xf7, 0xc8, 0x1a, 0xad, 0x2f, 0xdf, 0x64, 0x42, 0xac, 0xa2, 0x57, 0xab, 0x3d, 0xe0, 0x39, 0x10, 0x37, 0xff, 0x83, - 0x33, 0x2f, 0xb2, 0x6f, 0x34, 0xbc, 0x82, 0xf7, 0x46, 0xd7, 0xc2, 0xe2, 0xd7, 0x77, 0xce, 0xb4, 0x25, 0xb9, 0x86, 0x87, 0x57, 0xaf, 0xe1, 0x33, 0x3c, 0x5e, 0x83, 0xcf, 0x70, 0xeb, 0xdb, 0x9b, - 0x45, 0xa2, 0x04, 0x3e, 0xc3, 0x56, 0x0b, 0x7e, 0xbe, 0xc7, 0xdb, 0xe3, 0x7d, 0x79, 0x18, 0x58, 0xf7, 0x08, 0x1a, 0x67, 0xa0, 0xb5, 0xa6, 0x6e, 0x40, 0xd4, 0x34, 0x86, 0x9a, 0x81, 0x13, 0xf8, - 0x25, 0xc7, 0xef, 0x01, 0x23, 0xe7, 0x5b, 0xc7, 0x5c, 0x6b, 0xdf, 0x6a, 0x8e, 0x17, 0x4b, 0x50, 0x6d, 0x5d, 0xa0, 0xa1, 0x49, 0x34, 0x0e, 0x5d, 0x17, 0x4b, 0xb8, 0xc5, 0x52, 0x1b, 0xfe, 0x75, - 0xef, 0xbb, 0xf0, 0xfb, 0x9a, 0x64, 0x62, 0x90, 0x4c, 0x8d, 0x1b, 0xe2, 0xe1, 0x7a, 0x3d, 0x1f, 0x6e, 0x42, 0x16, 0xfa, 0x01, 0x7c, 0xdf, 0xce, 0xde, 0xf1, 0xae, 0xc2, 0xe0, 0xcd, 0x7c, 0x44, - 0x95, 0xfb, 0x5c, 0xce, 0x23, 0x9e, 0x7c, 0x62, 0xa9, 0x9f, 0x54, 0x5b, 0x1b, 0xeb, 0x07, 0x4d, 0xdd, 0xa4, 0x77, 0x3a, 0x26, 0x07, 0x5c, 0x29, 0x44, 0x30, 0x79, 0xe1, 0x23, 0x32, 0x6a, 0xe8, - 0x88, 0xde, 0xc6, 0x20, 0x8d, 0x95, 0x0b, 0x10, 0x8e, 0x1e, 0xbd, 0x36, 0xd6, 0xcf, 0xaf, 0x61, 0x7b, 0x0c, 0xa4, 0xa7, 0x0c, 0xca, 0xc9, 0x99, 0x39, 0xc5, 0x6c, 0x3e, 0x04, 0x6d, 0x3e, 0x31, - 0x65, 0xa6, 0xc6, 0x67, 0x43, 0xdd, 0xb8, 0xae, 0x6f, 0xa0, 0x53, 0xee, 0x9e, 0xca, 0x95, 0xc3, 0x19, 0xd2, 0xe7, 0x50, 0xba, 0xff, 0xde, 0x86, 0x99, 0xaa, 0xf0, 0x65, 0xce, 0xf7, 0xd1, 0x60, - 0xd5, 0xb7, 0x77, 0xef, 0xbe, 0x4b, 0xe3, 0xb6, 0xa9, 0x0c, 0x5d, 0x94, 0x2c, 0x14, 0x42, 0x31, 0xd3, 0x01, 0x67, 0x8e, 0xf9, 0x29, 0xe7, 0x28, 0x56, 0x41, 0xf0, 0x65, 0xd0, 0x7e, 0xa1, 0xe3, - 0x33, 0x69, 0x75, 0x3f, 0x98, 0xd0, 0xa0, 0x4f, 0x66, 0x33, 0xce, 0x45, 0x18, 0x6f, 0xd6, 0xe4, 0xf3, 0xf1, 0xb2, 0xe7, 0xbd, 0x39, 0xb9, 0x3d, 0x0e, 0xf7, 0x4b, 0x4a, 0x55, 0x3b, 0x12, 0x3c, - 0x77, 0xef, 0x38, 0x8e, 0xcc, 0xc7, 0xfc, 0xfe, 0xb8, 0x99, 0x96, 0xe9, 0x71, 0xd3, 0xee, 0xf0, 0x44, 0xb7, 0x99, 0x8a, 0x84, 0x7e, 0x16, 0x94, 0x1c, 0x00, 0xf9, 0x2b, 0xb5, 0x3c, 0xd5, 0xb5, - 0x7c, 0x14, 0x45, 0x0f, 0x6b, 0xbf, 0x6d, 0x66, 0xf0, 0x98, 0x23, 0x4a, 0xab, 0xd3, 0x97, 0x67, 0x67, 0x31, 0x39, 0xfd, 0xa7, 0x89, 0x49, 0x48, 0xcd, 0xd0, 0x68, 0x65, 0x05, 0x47, 0x83, 0x1c, - 0x5a, 0x15, 0xb8, 0xa1, 0xe0, 0xfa, 0x66, 0xc6, 0xd3, 0xa3, 0x69, 0xf8, 0xc9, 0x7a, 0x97, 0xbd, 0x78, 0x91, 0xc0, 0x0b, 0x6f, 0xfd, 0xa4, 0x03, 0x4e, 0x3c, 0xcd, 0xbd, 0x64, 0x41, 0xb9, 0x77, - 0xf8, 0x80, 0x05, 0xed, 0x17, 0xaa, 0x94, 0xad, 0xaf, 0xd8, 0x84, 0x76, 0xe8, 0xc9, 0x0d, 0xa3, 0xb2, 0xa5, 0x61, 0x57, 0x89, 0xb2, 0xa2, 0x84, 0x1b, 0x07, 0x9f, 0x42, 0xb7, 0x8a, 0xa7, 0x09, - 0xbc, 0xc8, 0xf6, 0x07, 0xc4, 0x29, 0x12, 0xdf, 0xad, 0x22, 0x9b, 0x4b, 0xb8, 0x72, 0xae, 0x79, 0x79, 0xe7, 0x3b, 0x79, 0xbc, 0x89, 0x2f, 0xc0, 0x60, 0x23, 0xbb, 0x47, 0xaf, 0x42, 0x8a, 0x9d, - 0x2c, 0xc3, 0xfc, 0x04, 0x1e, 0xc8, 0xc5, 0x32, 0x66, 0xd8, 0x50, 0xb1, 0xde, 0x74, 0x44, 0x0d, 0x6b, 0x65, 0x28, 0x44, 0x8f, 0x02, 0x8d, 0x82, 0xd1, 0xa3, 0xec, 0xaf, 0x6d, 0x07, 0xbe, 0x63, - 0xf8, 0xd0, 0x3e, 0xf0, 0x81, 0x84, 0xce, 0xb3, 0xe3, 0xad, 0x90, 0x6e, 0x1f, 0x46, 0x70, 0xaa, 0xfa, 0xc2, 0x42, 0xd1, 0x81, 0x45, 0xe7, 0x7a, 0xb6, 0x72, 0x12, 0x9e, 0xd4, 0xa8, 0x78, 0x31, - 0xc9, 0x27, 0x2c, 0xe4, 0xd3, 0x32, 0xf0, 0x78, 0xfb, 0xcd, 0xf5, 0x0f, 0x97, 0xdf, 0x5d, 0xde, 0xdd, 0xfd, 0xfb, 0xfb, 0xdb, 0x9b, 0x88, 0xe8, 0xf6, 0xf2, 0x9b, 0x3f, 0x5f, 0x8f, 0x6b, 0xa8, - 0xb6, 0xc2, 0x68, 0xe5, 0x93, 0x69, 0xcb, 0x8c, 0xa0, 0x4b, 0x55, 0xfc, 0x18, 0xb5, 0x42, 0x4b, 0x9a, 0x28, 0xd5, 0xa7, 0x83, 0x55, 0xfc, 0x76, 0x16, 0xfd, 0xea, 0x9d, 0x7f, 0xdf, 0x2a, 0xe1, - 0xc0, 0xa1, 0x75, 0x0f, 0xc7, 0x69, 0x46, 0xbf, 0x19, 0xad, 0xa4, 0xce, 0x86, 0x4b, 0x1d, 0x53, 0x70, 0x4f, 0x2e, 0xdc, 0x98, 0x30, 0xc2, 0xcf, 0x24, 0x27, 0x2f, 0xc2, 0xb7, 0xb4, 0xbf, 0x6b, - 0x2e, 0xd6, 0x5d, 0xc8, 0x87, 0x50, 0xdc, 0x38, 0x1f, 0x2a, 0x08, 0x93, 0x7e, 0xb7, 0x1d, 0x3f, 0x49, 0x15, 0xad, 0x0d, 0x83, 0xa4, 0xd4, 0x1b, 0x51, 0xa6, 0x7b, 0xdf, 0xc8, 0x48, 0xdc, 0xfb, - 0xf4, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x37, 0xb4, 0x4f, 0xba, 0x85, 0x07, 0x00, 0x00, 0x39, 0x14, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, - 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xfd, 0x59, 0x93, 0xfa, 0x4a, 0x92, 0x37, 0x08, 0xdf, - 0xbf, 0x9f, 0xe2, 0xd8, 0xb9, 0x7c, 0xf5, 0x90, 0xda, 0x17, 0xda, 0xa6, 0x6a, 0x5a, 0x0b, 0x20, 0x56, 0x21, 0x21, 0x36, 0x8d, 0x4d, 0x8d, 0x69, 0x5f, 0xd0, 0xbe, 0x82, 0x9e, 0x9e, 0xfa, 0xec, - 0x63, 0x08, 0xc8, 0x84, 0x4c, 0x48, 0x94, 0xfc, 0x4f, 0x75, 0x75, 0x77, 0x9d, 0x9b, 0x4c, 0x49, 0x21, 0xb9, 0xd0, 0xcf, 0x3d, 0xc2, 0x3d, 0x3c, 0xdc, 0x3d, 0xfe, 0xf7, 0xff, 0xef, 0xb7, 0xdf, - 0x7e, 0x0f, 0xd5, 0xc0, 0xfc, 0xfd, 0xdf, 0x7e, 0xfb, 0xdd, 0x2c, 0xcd, 0x30, 0xef, 0x38, 0x6a, 0x68, 0xf8, 0x66, 0xfa, 0xfb, 0xff, 0x3a, 0x36, 0x95, 0x66, 0x9a, 0xb9, 0x51, 0x78, 0x6c, 0x85, - 0xde, 0xe0, 0x37, 0xe8, 0x74, 0xd5, 0x8f, 0xf4, 0x9d, 0xe5, 0xfa, 0xe6, 0xea, 0xbd, 0x15, 0x69, 0xae, 0xa7, 0x66, 0x52, 0xb8, 0xa9, 0x99, 0xfd, 0xfe, 0x6f, 0xbf, 0xe5, 0x69, 0x61, 0x36, 0xd7, - 0x62, 0x55, 0xdf, 0xa9, 0x76, 0x73, 0xed, 0xf8, 0xb2, 0xdf, 0x7e, 0xfb, 0xfd, 0xfd, 0xe8, 0xdb, 0x57, 0x37, 0xcd, 0x77, 0x5f, 0xdf, 0xb4, 0xf8, 0xae, 0x6e, 0x86, 0x59, 0xf3, 0x2c, 0x1d, 0xab, - 0xba, 0x63, 0x76, 0x90, 0xeb, 0x66, 0xc3, 0x8c, 0xcd, 0xd0, 0x30, 0x43, 0xdd, 0xbd, 0x7a, 0x73, 0xd3, 0xf2, 0xef, 0xf9, 0x21, 0x36, 0x33, 0x30, 0x8c, 0x8c, 0xe6, 0xe1, 0xbf, 0xc1, 0xc4, 0x1b, - 0x0c, 0xbf, 0xc1, 0xc8, 0xfb, 0xb3, 0xbf, 0xfd, 0xf6, 0xbb, 0xa5, 0xaa, 0x59, 0xc7, 0xcb, 0x3a, 0x69, 0x11, 0xe6, 0x6e, 0x70, 0xbe, 0xaf, 0x79, 0xff, 0xf9, 0x9e, 0xff, 0xf7, 0xea, 0x45, 0x25, - 0xf7, 0xec, 0x5d, 0xb9, 0x1a, 0x9f, 0x68, 0x60, 0x6f, 0x30, 0x7a, 0xf5, 0x2b, 0xdf, 0xef, 0xd0, 0x53, 0x37, 0xce, 0x3b, 0x66, 0xe6, 0xbb, 0x61, 0x0e, 0x9e, 0xfe, 0x75, 0x62, 0xbf, 0xb0, 0xdd, - 0xf0, 0xfc, 0x18, 0x82, 0x3d, 0x7d, 0x2c, 0x56, 0xd3, 0xcc, 0x4c, 0x1f, 0xdc, 0x7f, 0xba, 0xa7, 0x69, 0x24, 0xdf, 0x10, 0xe2, 0x5e, 0x63, 0x47, 0x8f, 0x42, 0xcb, 0xb5, 0x3b, 0x71, 0x6a, 0xe6, - 0xb9, 0x7b, 0xa6, 0x44, 0xbd, 0xa1, 0x77, 0xef, 0x3d, 0xfd, 0xb8, 0xdb, 0x7b, 0xd1, 0xb7, 0x4f, 0x2f, 0x3d, 0x42, 0x1c, 0x9c, 0x98, 0xf7, 0x37, 0xe4, 0x0d, 0x7a, 0xc3, 0xae, 0x1b, 0x6f, 0x1e, - 0x45, 0x3e, 0xbf, 0x26, 0x2b, 0x62, 0x33, 0xcd, 0xcd, 0xec, 0xf4, 0x93, 0x89, 0x37, 0xf4, 0x0d, 0xbe, 0x6e, 0xfe, 0x06, 0xd0, 0x3c, 0xeb, 0xbc, 0xb3, 0xb6, 0xfb, 0x06, 0x7f, 0x7a, 0x2e, 0x33, - 0x9a, 0x06, 0xe8, 0x08, 0xd0, 0xa7, 0x96, 0x87, 0x18, 0xc0, 0x6f, 0x30, 0xf5, 0xe9, 0x1d, 0xef, 0xe0, 0x5f, 0xe0, 0x7e, 0xc3, 0xde, 0x25, 0xa3, 0xf9, 0x7f, 0x96, 0x8f, 0x06, 0x82, 0xff, 0x27, - 0x88, 0x8c, 0xc2, 0x37, 0x33, 0xf0, 0xdf, 0x35, 0x55, 0x33, 0x7d, 0x50, 0x8f, 0x0c, 0xb3, 0x63, 0xa5, 0x27, 0xc1, 0xff, 0xdf, 0x77, 0x24, 0x9d, 0x7c, 0x83, 0x91, 0x37, 0xf8, 0xe3, 0xe7, 0xfd, - 0x9e, 0x9a, 0x59, 0xe4, 0x97, 0x66, 0xf3, 0xdb, 0x9d, 0x3c, 0x8f, 0xb3, 0x7f, 0x03, 0xc1, 0xd4, 0xb4, 0xdd, 0x2c, 0x4f, 0x0f, 0x6f, 0x61, 0x1c, 0x78, 0xd9, 0x5b, 0x94, 0xda, 0x5f, 0xe9, 0x83, - 0x9d, 0xab, 0x93, 0xce, 0x99, 0xec, 0x5b, 0x6e, 0xd7, 0x1f, 0xa4, 0xdd, 0x30, 0x37, 0xed, 0xd4, 0xcd, 0x0f, 0x47, 0xda, 0x99, 0xa3, 0xe2, 0x30, 0xd2, 0x51, 0x72, 0xf8, 0x10, 0x19, 0xcc, 0x1e, - 0x5e, 0xea, 0x07, 0xd7, 0x9c, 0x4f, 0x17, 0xbb, 0x75, 0xb8, 0xc4, 0x9c, 0x79, 0xe2, 0x54, 0x09, 0xe9, 0x0c, 0x5c, 0x24, 0xec, 0x4f, 0xe0, 0x89, 0x49, 0xa3, 0xbd, 0xa5, 0x0f, 0x24, 0xc8, 0x44, - 0xdc, 0xc3, 0xc4, 0x74, 0xb8, 0xb0, 0x47, 0x10, 0x50, 0x93, 0x46, 0x18, 0xd8, 0xe5, 0xbc, 0x2b, 0xe6, 0x43, 0xdf, 0x2c, 0x7a, 0xf2, 0x40, 0x70, 0x05, 0x1e, 0x96, 0xf4, 0x61, 0xf5, 0x97, 0xbf, - 0x5c, 0xf7, 0xce, 0xf2, 0x6a, 0x88, 0xf8, 0xed, 0x49, 0x87, 0x3d, 0x7d, 0x96, 0xe3, 0xda, 0x8e, 0xef, 0xda, 0xce, 0x45, 0x8a, 0x61, 0xe8, 0x27, 0xa0, 0x3b, 0xa6, 0x1f, 0x9b, 0x69, 0xa7, 0x54, - 0x7d, 0xd7, 0x50, 0xf3, 0x28, 0xed, 0xb8, 0x86, 0x19, 0xe6, 0xae, 0x75, 0x62, 0xf2, 0x03, 0x2e, 0x5c, 0xcb, 0xf3, 0x0f, 0x99, 0xf0, 0xcd, 0xfb, 0xc0, 0xce, 0x77, 0xad, 0x9d, 0xd3, 0x7b, 0x9f, - 0x73, 0x69, 0x85, 0xe6, 0x19, 0x59, 0x4f, 0x17, 0x05, 0xee, 0x5b, 0x6e, 0xb5, 0xe6, 0x56, 0xeb, 0x5a, 0xe2, 0x06, 0xc3, 0x19, 0xe0, 0x87, 0x6c, 0x6f, 0x69, 0xa8, 0x1b, 0x3b, 0x5f, 0xf1, 0x23, - 0x7b, 0xa2, 0xc1, 0xe9, 0x40, 0xa5, 0x09, 0x6f, 0x9a, 0xe6, 0x4c, 0xb7, 0x17, 0xf4, 0xc8, 0x09, 0x4c, 0x59, 0xd1, 0x66, 0x34, 0xec, 0x51, 0xcb, 0x10, 0xa4, 0x41, 0x87, 0x98, 0x8d, 0xac, 0x81, - 0x18, 0x83, 0x26, 0x3c, 0xc2, 0xe8, 0xfb, 0x5c, 0x7a, 0x0e, 0xef, 0x15, 0x73, 0xfe, 0x01, 0x60, 0x5e, 0xa8, 0x1f, 0xa1, 0xbb, 0x1c, 0xb7, 0x06, 0x6a, 0xbb, 0x60, 0x85, 0x6a, 0x5f, 0xca, 0xdb, - 0xde, 0x70, 0xba, 0x18, 0xa8, 0x8c, 0xa8, 0xe1, 0x3b, 0x8e, 0xcb, 0xd8, 0x28, 0xe6, 0x0c, 0x77, 0x39, 0xc8, 0x92, 0x58, 0xcd, 0x63, 0xd4, 0x12, 0xfc, 0x21, 0x06, 0x20, 0xbc, 0xb8, 0xd8, 0xc9, - 0x41, 0x6f, 0xb5, 0x0e, 0x57, 0xc5, 0x61, 0x61, 0xd0, 0x2c, 0xde, 0x5b, 0xb3, 0xc9, 0x62, 0xbd, 0x96, 0x4b, 0xc8, 0xd5, 0x08, 0x54, 0xf2, 0x24, 0xd2, 0x90, 0x19, 0xc3, 0xfe, 0x65, 0x71, 0xfe, - 0x56, 0x20, 0x1b, 0x01, 0xff, 0x34, 0x9c, 0xea, 0x8e, 0xea, 0xef, 0xde, 0x07, 0xd3, 0x9b, 0x26, 0x2f, 0xeb, 0xe4, 0xd1, 0xce, 0x0c, 0xb3, 0xf3, 0x78, 0x04, 0x5d, 0x69, 0xaa, 0xf6, 0xbc, 0x03, - 0x6f, 0x5a, 0xd5, 0x30, 0x73, 0x3b, 0x59, 0x7e, 0xf0, 0x6f, 0x3e, 0xe0, 0x9a, 0xa9, 0xe8, 0x1b, 0xf2, 0xf6, 0xf3, 0x51, 0xea, 0x8a, 0x2e, 0xd8, 0xb9, 0x3e, 0xeb, 0x34, 0xf4, 0x9e, 0xf3, 0x73, - 0x25, 0x43, 0xca, 0x90, 0xd8, 0x29, 0x92, 0x21, 0x3b, 0xd4, 0xf6, 0x30, 0xaa, 0xd0, 0xc5, 0x54, 0xdb, 0x06, 0x60, 0x01, 0xcc, 0x12, 0x2b, 0xa3, 0xf7, 0xbd, 0x78, 0x2d, 0x40, 0x73, 0xab, 0x9b, - 0x25, 0x14, 0x68, 0x76, 0xb1, 0xf5, 0x7e, 0x2f, 0xc4, 0xf3, 0xf1, 0xbe, 0xdb, 0x97, 0xe0, 0xbe, 0x7f, 0x60, 0x73, 0x61, 0xc5, 0xcd, 0x04, 0x11, 0xa0, 0xc2, 0xdc, 0x4f, 0xfa, 0x7b, 0x57, 0xd2, - 0x81, 0x14, 0x4f, 0x1e, 0x08, 0x7e, 0x0b, 0x7e, 0xea, 0x91, 0x1f, 0xa5, 0x47, 0xc5, 0x51, 0x9a, 0x69, 0x7e, 0x56, 0x18, 0xdd, 0x7b, 0x96, 0x82, 0x19, 0xda, 0x6e, 0xf8, 0xf9, 0xe9, 0x8b, 0xae, - 0xfa, 0xeb, 0x5f, 0x7e, 0x32, 0x98, 0xdd, 0xe7, 0xd8, 0x45, 0x40, 0xee, 0xf1, 0x0a, 0x79, 0xc3, 0xde, 0x90, 0x1f, 0xf3, 0xaa, 0xa1, 0x78, 0xd4, 0x22, 0xc7, 0xff, 0x9d, 0x86, 0xc6, 0x73, 0xfe, - 0x4c, 0x73, 0x17, 0xb0, 0xba, 0x7e, 0x3c, 0x9a, 0xe9, 0x55, 0x1f, 0xcb, 0xd7, 0x2b, 0x0a, 0x14, 0x52, 0x59, 0xce, 0xfb, 0xb0, 0xad, 0xb8, 0x80, 0x45, 0xf5, 0x13, 0xff, 0x40, 0x1b, 0x51, 0x91, - 0xaa, 0xbe, 0xde, 0x5f, 0xf7, 0xc5, 0x75, 0x1f, 0x01, 0x66, 0x36, 0xcb, 0x2f, 0x1c, 0x6f, 0xc7, 0x6a, 0xc0, 0xb0, 0xcf, 0x4c, 0x92, 0xae, 0x56, 0x28, 0x55, 0x0f, 0xde, 0xeb, 0x3b, 0x71, 0x89, - 0xc5, 0xe6, 0xa2, 0x10, 0x5f, 0xe6, 0xcf, 0xad, 0x1c, 0x1f, 0xcd, 0x14, 0xe4, 0x56, 0xf5, 0x9b, 0x99, 0xae, 0xc6, 0x66, 0x27, 0xcb, 0x53, 0x37, 0xb4, 0x3b, 0xa9, 0x69, 0x9b, 0xfb, 0xf8, 0xcc, - 0x47, 0xe8, 0x0d, 0xff, 0x64, 0x95, 0xc4, 0x51, 0x9a, 0x67, 0x9d, 0x86, 0xe7, 0xcd, 0x3d, 0x78, 0x63, 0xb9, 0xfc, 0x13, 0x78, 0xfd, 0x49, 0xea, 0xee, 0xf1, 0xfc, 0x28, 0x87, 0xe8, 0xcf, 0x79, - 0x7e, 0x4d, 0xb9, 0xb1, 0x20, 0xae, 0xce, 0x3b, 0x0d, 0xcd, 0xe7, 0x32, 0x20, 0x5a, 0xf4, 0x32, 0x37, 0x80, 0xb2, 0x6f, 0xd0, 0x79, 0x5f, 0xd4, 0x59, 0x8a, 0x65, 0x0f, 0xdb, 0x1c, 0xb6, 0xb6, - 0xeb, 0xfd, 0x22, 0xa1, 0xdd, 0x31, 0xa2, 0x2f, 0x38, 0xa2, 0xe6, 0x18, 0x6a, 0x86, 0xea, 0x71, 0xd6, 0x63, 0xe8, 0x52, 0xda, 0xc7, 0xdd, 0x5a, 0x18, 0xd8, 0xc4, 0x00, 0x5c, 0xf0, 0xfc, 0x68, - 0x4b, 0xcb, 0x14, 0x05, 0xaa, 0x35, 0x38, 0x2c, 0xb8, 0x01, 0x3d, 0xc9, 0x66, 0x2b, 0x6d, 0xf0, 0xfa, 0x98, 0x7b, 0xfa, 0x86, 0xcb, 0x5c, 0xe3, 0x68, 0xc9, 0xa3, 0x7f, 0x10, 0x07, 0xc2, 0xc7, - 0x66, 0xdc, 0xe9, 0x35, 0xaf, 0xc1, 0x1f, 0x5e, 0xac, 0xb7, 0xcb, 0x49, 0xa7, 0xa1, 0xf6, 0x3d, 0xf0, 0x70, 0x27, 0xee, 0x32, 0x2b, 0xb7, 0xeb, 0xea, 0x62, 0x69, 0xae, 0xd0, 0xe5, 0xf0, 0xe0, - 0xa1, 0xe2, 0x70, 0xaa, 0xc7, 0x72, 0xc9, 0x2e, 0x7f, 0x51, 0xaf, 0xdf, 0x7e, 0xbb, 0xa3, 0x66, 0x1d, 0xcb, 0x57, 0xed, 0x87, 0x8a, 0x01, 0x7a, 0x41, 0xd9, 0x5f, 0x88, 0x1e, 0x95, 0xfc, 0xf9, - 0xb0, 0xd3, 0x50, 0x7a, 0xf6, 0xd5, 0xb9, 0x21, 0x2d, 0x51, 0x76, 0xa0, 0xa4, 0xee, 0x68, 0x1d, 0x58, 0xb3, 0x81, 0xe5, 0x47, 0x3c, 0x45, 0xfa, 0xab, 0xa2, 0x84, 0xbe, 0x17, 0x98, 0x7f, 0x78, - 0x2f, 0xfd, 0x32, 0x60, 0xdc, 0x43, 0x0b, 0x7f, 0xc3, 0x5f, 0x40, 0xeb, 0x96, 0x34, 0xd8, 0xf9, 0x74, 0xa1, 0xd3, 0x50, 0x6d, 0xd1, 0x51, 0xbd, 0x95, 0x57, 0x19, 0x9b, 0x61, 0x8e, 0x41, 0xd4, - 0x74, 0xe8, 0xd2, 0x09, 0xbb, 0xc1, 0xa2, 0xe5, 0x38, 0xb3, 0x97, 0x48, 0x2f, 0xa1, 0x07, 0x75, 0x86, 0xcc, 0xe3, 0x5d, 0x80, 0xa9, 0xe2, 0x56, 0xf3, 0x02, 0x40, 0xe9, 0xad, 0x7b, 0xfa, 0x1a, - 0x5b, 0x58, 0xfd, 0x99, 0x9c, 0x62, 0xc5, 0x74, 0xa6, 0x04, 0x2a, 0x64, 0x1e, 0x30, 0x0b, 0xf7, 0xed, 0x49, 0xba, 0x63, 0x20, 0x75, 0x03, 0x89, 0xd3, 0xe8, 0x75, 0x5b, 0xff, 0x4a, 0xb0, 0x8e, - 0x23, 0x35, 0xf4, 0x8f, 0x1a, 0x5b, 0x6f, 0xa6, 0xda, 0xa9, 0xfe, 0x80, 0x33, 0xd0, 0x1b, 0xf6, 0x82, 0x81, 0xf3, 0x99, 0x38, 0xd8, 0x79, 0x3f, 0xec, 0x34, 0x14, 0x9f, 0x73, 0x05, 0x2f, 0x49, - 0x99, 0xeb, 0x75, 0x63, 0x7f, 0xe5, 0x94, 0x7b, 0xd1, 0x5c, 0x4f, 0x36, 0x9c, 0x5c, 0xf6, 0xcb, 0x11, 0x63, 0xf0, 0x44, 0xdc, 0xcb, 0x8c, 0xd0, 0x47, 0x6c, 0xd0, 0xa0, 0xe3, 0x3c, 0x28, 0xfa, - 0xbd, 0xb9, 0x69, 0x88, 0x58, 0x2f, 0x4d, 0xf0, 0x34, 0xe3, 0xb2, 0x0d, 0x10, 0x94, 0xf4, 0x94, 0x80, 0xa1, 0xa1, 0x33, 0x53, 0x05, 0x64, 0x8d, 0xaf, 0x60, 0x43, 0x10, 0x42, 0x6e, 0xbc, 0xdf, - 0xfd, 0x82, 0x0a, 0xf5, 0xca, 0xdf, 0x4f, 0xf3, 0x70, 0x18, 0xb9, 0x9d, 0xc5, 0x1b, 0xa6, 0x56, 0x9c, 0x98, 0x85, 0x7d, 0x9e, 0x6b, 0x9b, 0x59, 0x9c, 0x9a, 0xa7, 0x79, 0x38, 0xf9, 0x79, 0x7a, - 0x6f, 0xfb, 0x91, 0xa6, 0xfa, 0x27, 0x7d, 0x7c, 0x9c, 0x94, 0xde, 0xb6, 0xba, 0x76, 0x18, 0xa5, 0x97, 0xf9, 0x3d, 0xf4, 0x46, 0xdc, 0xb4, 0x05, 0x47, 0x21, 0xef, 0x58, 0xa9, 0x99, 0x39, 0xf7, - 0xd5, 0xb9, 0x97, 0x75, 0x0e, 0x6a, 0xe0, 0x9f, 0x1b, 0xe1, 0x4f, 0x9e, 0x83, 0xc0, 0x0d, 0xdd, 0x40, 0xcd, 0x75, 0xe7, 0x5d, 0xc2, 0x6e, 0xbe, 0xe7, 0x68, 0x04, 0xc4, 0x1d, 0x2f, 0x8b, 0xc2, - 0x8e, 0x1e, 0x05, 0x81, 0x19, 0xe6, 0x17, 0xa3, 0xe1, 0xf8, 0x75, 0x3f, 0x13, 0xc5, 0xbf, 0xc1, 0xd0, 0x11, 0x2f, 0xe8, 0xb7, 0xff, 0xf8, 0x8f, 0xdf, 0xfe, 0xfa, 0x17, 0x18, 0x69, 0x6b, 0x95, - 0x7f, 0x16, 0x9f, 0x9b, 0xd6, 0x0b, 0xe0, 0xf7, 0xc4, 0x15, 0xbb, 0x71, 0x93, 0xb4, 0x15, 0xd7, 0x86, 0x22, 0xd8, 0x39, 0xfd, 0xef, 0x34, 0x34, 0x9e, 0x0b, 0xa8, 0x11, 0xf5, 0x2a, 0xa3, 0x0c, - 0xb0, 0x39, 0x6b, 0x8e, 0xb1, 0x31, 0x2a, 0x89, 0x33, 0x44, 0x61, 0x11, 0x66, 0xbb, 0x64, 0xd4, 0x7d, 0x35, 0xa1, 0x25, 0x36, 0x51, 0x82, 0xa9, 0x97, 0xf7, 0x29, 0x15, 0x87, 0x47, 0x88, 0xa4, - 0x41, 0xfb, 0x78, 0xe5, 0x47, 0x7d, 0x29, 0x64, 0x05, 0xae, 0x4a, 0xbc, 0xb8, 0x0a, 0xe9, 0x48, 0x8d, 0xb0, 0xd8, 0xf4, 0x67, 0x94, 0x8f, 0x4a, 0x23, 0xa3, 0x44, 0x6d, 0xe9, 0x75, 0x01, 0x0d, - 0x1a, 0x2e, 0x1d, 0x05, 0x09, 0xf9, 0x21, 0x93, 0xfe, 0xfa, 0x17, 0xe2, 0xde, 0x18, 0x13, 0x9b, 0x66, 0x7a, 0xed, 0xd6, 0x9b, 0x9a, 0xb9, 0x7a, 0x4b, 0xe0, 0xe1, 0xd0, 0xde, 0xb4, 0x46, 0x71, - 0xee, 0x46, 0xa1, 0xea, 0x5f, 0xeb, 0xd9, 0xdf, 0xde, 0xf9, 0xfe, 0x0b, 0xfc, 0xff, 0xe8, 0x39, 0x77, 0x4d, 0x0e, 0xe4, 0xed, 0x95, 0x69, 0xf6, 0x99, 0x28, 0xd8, 0xb9, 0x1c, 0x75, 0x4e, 0x84, - 0x9e, 0xcb, 0x01, 0xb3, 0x1e, 0xb2, 0x45, 0x5d, 0x73, 0x25, 0x17, 0xf1, 0x38, 0x36, 0xe3, 0xc7, 0x6c, 0x66, 0x72, 0x6a, 0x48, 0x3b, 0x3d, 0x94, 0x35, 0xb9, 0x28, 0xb5, 0xb9, 0x09, 0x3e, 0x95, - 0x89, 0xc9, 0x74, 0xb3, 0xf1, 0x90, 0x35, 0x1b, 0x1a, 0xdd, 0x25, 0x8b, 0x64, 0xb5, 0xb1, 0xc3, 0xe8, 0xf5, 0xc4, 0xf2, 0x0c, 0x7b, 0xc6, 0xb0, 0x9b, 0xc9, 0x52, 0x0d, 0x37, 0x5b, 0x3d, 0x66, - 0x98, 0xb1, 0xb0, 0x58, 0x0f, 0xaa, 0xd7, 0xed, 0xbc, 0xfc, 0x10, 0x9b, 0x1d, 0xeb, 0xe2, 0x36, 0x84, 0xde, 0xa8, 0x1f, 0x77, 0xda, 0xbf, 0xfe, 0x85, 0xfa, 0xfa, 0x84, 0x55, 0x84, 0x86, 0x1b, - 0xda, 0xb7, 0x4f, 0x14, 0xa9, 0x7f, 0x0d, 0xab, 0xed, 0xe6, 0x4e, 0xa1, 0xbd, 0xe9, 0x51, 0x00, 0x66, 0x71, 0x14, 0x66, 0x51, 0x9a, 0x81, 0x99, 0x1b, 0x1a, 0x47, 0x16, 0xa4, 0x4e, 0x91, 0xfd, - 0x72, 0xcf, 0x0f, 0x1e, 0x31, 0xfd, 0x24, 0xf6, 0x3f, 0xe5, 0x79, 0x70, 0x64, 0x77, 0x90, 0x75, 0x9a, 0xa7, 0x9f, 0x33, 0x3a, 0x1b, 0xec, 0xe6, 0x7b, 0x60, 0xe5, 0x4d, 0xf3, 0x80, 0x26, 0xa6, - 0x1b, 0x84, 0x8c, 0x68, 0xac, 0xcf, 0xf4, 0x7b, 0x93, 0x3e, 0xab, 0x28, 0xd8, 0x02, 0xdb, 0x24, 0xe6, 0x40, 0xd8, 0xb0, 0x25, 0x41, 0xe5, 0x32, 0xe0, 0x69, 0x68, 0xb9, 0x03, 0xa5, 0x83, 0x3a, - 0x5e, 0xcf, 0xa1, 0xb9, 0x3c, 0x3e, 0xac, 0xf3, 0x60, 0xb2, 0x98, 0x42, 0x1a, 0xa0, 0x1a, 0x4b, 0xb9, 0x57, 0x6a, 0x19, 0x3c, 0xef, 0xa9, 0x3c, 0xf2, 0xc0, 0x4e, 0x78, 0x15, 0xa1, 0xfb, 0x83, - 0xf7, 0x7d, 0x03, 0x15, 0x7e, 0x61, 0xa4, 0xbc, 0x43, 0xff, 0x68, 0x77, 0x7d, 0xbd, 0xda, 0x69, 0xe8, 0x3f, 0x07, 0x95, 0xb0, 0xe6, 0x3a, 0x20, 0x61, 0xae, 0x53, 0x25, 0x73, 0x62, 0x06, 0xaa, - 0xc3, 0x12, 0xb1, 0x60, 0x7b, 0xca, 0x53, 0xbe, 0xb0, 0xca, 0xd7, 0x22, 0x1f, 0x25, 0x2c, 0x76, 0x18, 0x13, 0xd1, 0x82, 0x5b, 0xad, 0x22, 0xbd, 0x08, 0xe8, 0xcc, 0x62, 0x13, 0x6f, 0xb7, 0x09, - 0x13, 0x77, 0x3b, 0x75, 0x82, 0x69, 0xb5, 0x00, 0x83, 0x1e, 0x3f, 0x89, 0xc9, 0x95, 0xe9, 0xf8, 0x39, 0x9a, 0xf8, 0x84, 0xdf, 0x73, 0x9f, 0xf5, 0x9e, 0xff, 0xba, 0xe2, 0x6f, 0xa9, 0x59, 0xee, - 0x5a, 0x07, 0x50, 0xf5, 0xca, 0x23, 0x94, 0xb1, 0xeb, 0x3f, 0x74, 0xce, 0xa2, 0x2f, 0xd9, 0xcc, 0x77, 0xdf, 0x00, 0x76, 0x6e, 0x4e, 0x3b, 0x68, 0x3b, 0xc3, 0xd9, 0xd4, 0xb4, 0x5e, 0xee, 0x0f, - 0x49, 0x63, 0xbf, 0xe9, 0xe3, 0xb5, 0x3b, 0x33, 0x52, 0x08, 0x0f, 0x84, 0x2d, 0x35, 0x0b, 0x39, 0x77, 0xce, 0xc0, 0x9b, 0x92, 0xf6, 0x27, 0xbc, 0x9e, 0x4b, 0x39, 0x28, 0xe9, 0x00, 0x8b, 0x4e, - 0x58, 0x61, 0xb5, 0xc6, 0xdd, 0x60, 0xb9, 0xda, 0x00, 0x81, 0x53, 0x2e, 0x9d, 0x70, 0x56, 0x07, 0x73, 0x86, 0x37, 0xab, 0xe5, 0x4e, 0xe8, 0xdb, 0x03, 0x9f, 0xdd, 0xdb, 0x06, 0xfd, 0xc9, 0x0b, - 0xf5, 0xcc, 0x1e, 0xa3, 0xde, 0xe0, 0x4f, 0xa6, 0xd3, 0xf1, 0x4b, 0xac, 0x28, 0x0d, 0xd4, 0xb3, 0xdd, 0x82, 0x7c, 0xb6, 0xca, 0x8e, 0x08, 0x74, 0x8a, 0xd4, 0xfd, 0xfd, 0xc3, 0x8f, 0xf8, 0x22, - 0x67, 0x3e, 0x79, 0x0b, 0x9b, 0x9f, 0x74, 0x8f, 0x55, 0x54, 0x63, 0x04, 0xfd, 0x98, 0x57, 0xaa, 0x57, 0x9e, 0x39, 0x73, 0x22, 0xf0, 0x9c, 0x23, 0x99, 0x54, 0xc0, 0xbb, 0x58, 0x17, 0xba, 0x87, - 0x49, 0xbe, 0xdd, 0x33, 0xe3, 0x32, 0xb1, 0x64, 0xd3, 0xe9, 0x8e, 0x6b, 0xa5, 0x57, 0x09, 0xe8, 0x42, 0x3e, 0x6c, 0x60, 0x5e, 0x06, 0x30, 0x56, 0xe5, 0x6a, 0x96, 0xe0, 0x63, 0x79, 0xb0, 0x75, - 0x86, 0xce, 0x7c, 0x58, 0x7b, 0xdd, 0x4d, 0x31, 0x5e, 0x92, 0xe3, 0x2d, 0x57, 0x85, 0xaa, 0xe9, 0xe0, 0x8e, 0x2e, 0x54, 0xde, 0x01, 0x16, 0x8b, 0x51, 0xcd, 0xcc, 0x5b, 0x72, 0xa4, 0x81, 0xd5, - 0x30, 0xcd, 0xb8, 0x63, 0x26, 0x85, 0xea, 0x5f, 0xd9, 0x8c, 0x57, 0xd8, 0x37, 0x63, 0x44, 0xa6, 0x3b, 0x66, 0xa0, 0x76, 0xf2, 0x54, 0x3d, 0x62, 0x74, 0x59, 0x5a, 0xfc, 0xe4, 0xcf, 0x3d, 0xaf, - 0xa3, 0x76, 0xac, 0x34, 0x0a, 0xce, 0x8e, 0xa9, 0x77, 0x86, 0xdd, 0x2c, 0x54, 0x16, 0xa9, 0xdb, 0xf1, 0x2e, 0x5e, 0x5f, 0xe4, 0x9e, 0xf5, 0x73, 0xb7, 0xf3, 0x1e, 0xf5, 0xe4, 0xf1, 0xa1, 0x53, - 0xaf, 0xbd, 0x25, 0xf8, 0xb4, 0x5b, 0x9b, 0x71, 0xa4, 0x99, 0xa9, 0x59, 0xef, 0xdc, 0xf0, 0x8f, 0x91, 0x9d, 0x07, 0xb8, 0xdc, 0xf7, 0xa9, 0xbc, 0xe2, 0x59, 0xb8, 0xf7, 0x02, 0xb0, 0x73, 0xf7, - 0x72, 0x07, 0x7e, 0xee, 0x71, 0x38, 0x0a, 0xdb, 0x6c, 0x4a, 0x81, 0xf3, 0x6e, 0x88, 0x6e, 0xbc, 0x8d, 0x33, 0x54, 0x42, 0xd8, 0x9f, 0x38, 0xbb, 0xbe, 0x4a, 0xb3, 0xb2, 0xb0, 0x94, 0xc4, 0x8d, - 0xb7, 0x76, 0x56, 0x18, 0x43, 0x83, 0x52, 0x28, 0x94, 0xd4, 0xbe, 0xb4, 0x93, 0x3c, 0x89, 0xe9, 0x4d, 0x77, 0x28, 0x60, 0x81, 0x24, 0xee, 0x17, 0x7b, 0x58, 0xf2, 0x23, 0x2c, 0x4f, 0x6a, 0x33, - 0xd1, 0xa0, 0x4c, 0xf0, 0xd3, 0x42, 0x15, 0x0e, 0xa8, 0x51, 0x1c, 0x87, 0xee, 0x16, 0x48, 0x1e, 0xe5, 0x2c, 0x30, 0x53, 0xfb, 0x31, 0x48, 0xe8, 0x0b, 0x20, 0x7d, 0x25, 0xdf, 0x4c, 0x0a, 0xce, - 0xc7, 0x9d, 0x86, 0xe8, 0x73, 0x5c, 0x46, 0x94, 0x2c, 0x2c, 0x98, 0x04, 0x5d, 0x44, 0x8a, 0xc6, 0x39, 0xd3, 0x2e, 0x20, 0x81, 0x05, 0x49, 0x3a, 0xf3, 0x2e, 0x6a, 0xd7, 0x60, 0xaa, 0x7a, 0x0b, - 0x1a, 0x18, 0x23, 0xbb, 0xc1, 0xc1, 0xf5, 0xe6, 0xb1, 0x20, 0xcd, 0xd7, 0xcb, 0x0d, 0xbf, 0x8c, 0x65, 0xd5, 0x37, 0x23, 0x0f, 0xe8, 0x22, 0x74, 0x06, 0x2d, 0xba, 0xc5, 0x5c, 0x9a, 0x93, 0x82, - 0x4b, 0x0d, 0x93, 0xa9, 0x05, 0x15, 0x40, 0x1a, 0x11, 0x74, 0x3b, 0x5c, 0xcc, 0x34, 0x7d, 0xe8, 0x64, 0x39, 0x4e, 0x13, 0x7f, 0x01, 0x93, 0x86, 0xf4, 0x71, 0x22, 0x7f, 0xfc, 0xdf, 0x2c, 0x54, - 0xb4, 0xc0, 0x62, 0x4c, 0x5b, 0xfa, 0x44, 0x05, 0xd8, 0x70, 0x17, 0x56, 0x2b, 0x17, 0xb7, 0xd6, 0x91, 0x9d, 0x4e, 0x36, 0xb6, 0x6b, 0x4c, 0x5c, 0x1d, 0x18, 0x6c, 0xc2, 0x89, 0xe7, 0x7a, 0x1b, - 0x23, 0xf6, 0xa9, 0xb8, 0xdc, 0x95, 0xda, 0x66, 0x89, 0x33, 0x03, 0x15, 0x25, 0x5d, 0x45, 0xe8, 0xf6, 0x07, 0x65, 0xe6, 0x74, 0x95, 0x09, 0x76, 0x00, 0xa2, 0xbe, 0x8b, 0xeb, 0x1a, 0xcf, 0x04, - 0xf8, 0x52, 0x18, 0x00, 0x46, 0x20, 0xb6, 0xc3, 0xa2, 0x19, 0x90, 0x4e, 0x02, 0xde, 0x0c, 0x1f, 0xae, 0x75, 0x78, 0xa6, 0x53, 0xb1, 0x5f, 0x83, 0xe8, 0xbb, 0x37, 0x82, 0x9d, 0x6f, 0x9b, 0x3b, - 0x58, 0x3b, 0x40, 0x0f, 0xb1, 0x72, 0x08, 0xa5, 0x72, 0x43, 0xa3, 0x86, 0xab, 0x59, 0xf3, 0xc3, 0x4e, 0x9c, 0xa1, 0x12, 0x83, 0x57, 0x8c, 0xd1, 0x5b, 0xda, 0x8b, 0x81, 0x1d, 0x1e, 0x28, 0x51, - 0x27, 0x76, 0x30, 0x81, 0x56, 0xdb, 0xf9, 0x84, 0xc3, 0x82, 0xde, 0xa0, 0xc7, 0xed, 0x68, 0x36, 0x06, 0x20, 0x68, 0x1b, 0x24, 0xbb, 0x41, 0x39, 0x0c, 0x28, 0x0e, 0xdc, 0x6f, 0x23, 0x5e, 0xf5, - 0xaa, 0x43, 0xcf, 0x58, 0x73, 0xa0, 0x69, 0xff, 0x60, 0x84, 0xbf, 0xfd, 0xfd, 0xbf, 0x9f, 0x16, 0x00, 0x5a, 0xea, 0xd0, 0xe3, 0x99, 0xef, 0x6a, 0xa0, 0x95, 0xbd, 0x65, 0xba, 0x1a, 0x1a, 0xee, - 0x23, 0x3e, 0x1c, 0x75, 0x36, 0xf6, 0x73, 0x3e, 0x7c, 0xa5, 0x7f, 0x44, 0xfd, 0xfd, 0xa4, 0x31, 0xf4, 0xb1, 0xe7, 0x18, 0xa3, 0xa8, 0x8d, 0xc6, 0xd3, 0xd1, 0x0e, 0xd5, 0x6c, 0x3c, 0xdc, 0x68, - 0x13, 0x10, 0x60, 0xb7, 0xc4, 0x10, 0x31, 0x47, 0x5c, 0xad, 0xd0, 0xa1, 0x8b, 0x75, 0xe7, 0xd6, 0x28, 0x9c, 0xe0, 0x96, 0xed, 0xcc, 0x65, 0xdb, 0x9e, 0x97, 0x8c, 0x01, 0xc6, 0xfd, 0xd9, 0xc2, - 0x1e, 0x65, 0x06, 0x6d, 0xaf, 0xe3, 0xbc, 0xe8, 0x17, 0x64, 0x92, 0x80, 0x3d, 0xa9, 0x14, 0xb6, 0x7d, 0xdf, 0x29, 0xb3, 0x89, 0xcc, 0x8e, 0x5f, 0x5f, 0x5d, 0xbb, 0xf9, 0xac, 0x5c, 0xcd, 0x4f, - 0x00, 0x7d, 0xf2, 0xda, 0xa4, 0x45, 0xd8, 0x89, 0xd5, 0x54, 0xf5, 0x7d, 0xd3, 0x3f, 0x2b, 0x54, 0xf8, 0xad, 0xfb, 0xe3, 0x99, 0xdf, 0x6f, 0xd4, 0x4f, 0xf9, 0x78, 0xfa, 0x41, 0xf7, 0x99, 0x08, - 0xfd, 0x2a, 0x13, 0x73, 0x35, 0x3f, 0x73, 0x30, 0x57, 0xf3, 0x4e, 0x43, 0xf0, 0x39, 0xfb, 0x86, 0x5b, 0x9f, 0x1f, 0xd1, 0x90, 0xee, 0xe7, 0x08, 0xb0, 0xb2, 0x49, 0x4d, 0xd7, 0x13, 0x40, 0xae, - 0x25, 0x63, 0x54, 0x96, 0x70, 0x57, 0x47, 0x86, 0xb3, 0x84, 0x59, 0x64, 0x91, 0x30, 0x89, 0x61, 0xcf, 0x24, 0xf7, 0x5e, 0x9e, 0x92, 0x23, 0x84, 0x00, 0xd6, 0x1b, 0x89, 0x44, 0xa6, 0xac, 0x51, - 0x2e, 0xbb, 0x09, 0x9c, 0xc8, 0xf5, 0x70, 0xcd, 0x59, 0xce, 0xd4, 0x02, 0x38, 0xa9, 0x14, 0x47, 0x63, 0xec, 0x99, 0x63, 0xe6, 0x8f, 0xc6, 0xb5, 0x7a, 0xbc, 0x8e, 0x79, 0x9c, 0xac, 0x12, 0xbf, - 0x84, 0x6b, 0x75, 0x5a, 0xd2, 0x3c, 0x1f, 0x75, 0x1a, 0x82, 0xcf, 0x71, 0xa5, 0x98, 0x34, 0x52, 0x33, 0xa2, 0x94, 0xf3, 0x35, 0x36, 0x18, 0x6e, 0x64, 0x9a, 0xe7, 0xa2, 0x1e, 0x8a, 0x38, 0xe1, - 0x0c, 0x99, 0xe2, 0x87, 0x9d, 0xcd, 0xc6, 0xeb, 0x81, 0x56, 0x6c, 0x78, 0x11, 0xc6, 0xcb, 0xde, 0x34, 0x49, 0x11, 0x34, 0x66, 0x48, 0xc2, 0x04, 0x07, 0x8a, 0xbe, 0xcd, 0x14, 0x96, 0xa7, 0x27, - 0x25, 0x0e, 0xed, 0x72, 0x03, 0xc1, 0x12, 0xa7, 0x77, 0x18, 0xa7, 0x44, 0xc5, 0xe4, 0xbf, 0xe0, 0x27, 0xbf, 0x3f, 0x9a, 0x7c, 0x1a, 0x3a, 0xce, 0xa3, 0x56, 0x72, 0xee, 0x12, 0x77, 0x1d, 0x5d, - 0x7f, 0x08, 0xeb, 0xf2, 0xcc, 0x00, 0x6f, 0x62, 0xa2, 0xee, 0xab, 0x17, 0xea, 0x95, 0x1e, 0x71, 0x4b, 0x1b, 0xec, 0x5c, 0x9d, 0x74, 0x1a, 0x92, 0xcf, 0x79, 0xb7, 0x9e, 0xf6, 0x67, 0xab, 0x2c, - 0xaf, 0xd6, 0x83, 0x03, 0x57, 0x28, 0x73, 0x64, 0x32, 0x98, 0x4b, 0x0a, 0xb0, 0x9b, 0xf3, 0x7b, 0x65, 0x12, 0x38, 0x02, 0x80, 0x44, 0x69, 0x90, 0xe5, 0x5c, 0x19, 0x6e, 0xdc, 0x43, 0xc4, 0xcc, - 0xf3, 0x35, 0x9c, 0x24, 0xdd, 0x8d, 0xe3, 0xa4, 0xbb, 0x21, 0x36, 0x5b, 0xe5, 0x7b, 0x3b, 0x03, 0x10, 0xc5, 0x5d, 0xca, 0x7e, 0x97, 0x1e, 0x90, 0xe1, 0x6c, 0x28, 0x25, 0x60, 0xc1, 0x3e, 0x98, - 0x66, 0x7f, 0x87, 0x52, 0x13, 0x0b, 0xf8, 0x1e, 0x89, 0x77, 0x0f, 0x23, 0xf2, 0x0d, 0xe9, 0xbe, 0xa2, 0x83, 0xaf, 0x49, 0xbf, 0x2f, 0x37, 0x74, 0x4e, 0xd4, 0x9e, 0xe3, 0xb3, 0x9a, 0xe9, 0xa5, - 0x1b, 0x6d, 0x39, 0x9e, 0x02, 0xfb, 0x7b, 0xd5, 0x94, 0xc7, 0xbb, 0x29, 0x06, 0xca, 0xae, 0x5c, 0xe5, 0x44, 0xcc, 0xac, 0xba, 0x3d, 0x54, 0xb0, 0x06, 0x41, 0xa9, 0x56, 0x54, 0x3e, 0xf7, 0xa1, - 0x34, 0xe5, 0xd9, 0x11, 0x36, 0xf1, 0x61, 0x9c, 0x97, 0x64, 0x20, 0x9e, 0xba, 0x7d, 0xda, 0x02, 0xa7, 0x13, 0xb1, 0xa4, 0x6b, 0x16, 0x20, 0xa4, 0x7a, 0x39, 0xed, 0x4d, 0xba, 0xac, 0x19, 0x3e, - 0x73, 0x43, 0x3c, 0x0d, 0xd0, 0x34, 0xb3, 0xfc, 0xbc, 0x7e, 0xf0, 0xff, 0xbf, 0x96, 0xe8, 0x73, 0xeb, 0x95, 0xed, 0x7e, 0xba, 0xa5, 0x8d, 0x98, 0xde, 0xd2, 0xfd, 0xe3, 0xe6, 0x17, 0x37, 0x94, - 0x1b, 0xfc, 0x8f, 0x07, 0x6d, 0xa7, 0x12, 0xeb, 0xc2, 0x4f, 0x36, 0x53, 0x6e, 0x29, 0x6f, 0xe9, 0x0d, 0xeb, 0x29, 0xe1, 0x8e, 0x18, 0xe5, 0x43, 0x7e, 0xee, 0xda, 0x31, 0x8e, 0xeb, 0xab, 0x9c, - 0xb3, 0xb9, 0x54, 0x40, 0x6c, 0x5e, 0xaa, 0x9c, 0xc3, 0x28, 0x8f, 0x10, 0x18, 0x80, 0x6b, 0x6d, 0xc5, 0xe6, 0xc2, 0x96, 0x41, 0x26, 0x70, 0xbf, 0x5b, 0x61, 0x09, 0x2b, 0x42, 0xa9, 0x30, 0x58, - 0x33, 0x21, 0x63, 0x42, 0xfd, 0x99, 0xec, 0xf6, 0x46, 0xc3, 0x07, 0x43, 0xf6, 0x53, 0x74, 0x6e, 0x71, 0xbd, 0x2f, 0xa3, 0xd0, 0x1b, 0xf9, 0x2a, 0x44, 0x57, 0xe4, 0x3f, 0x4d, 0xc0, 0x1a, 0xb2, - 0xcf, 0xc1, 0xd2, 0xf7, 0xeb, 0xbe, 0xb8, 0xca, 0x4c, 0x26, 0x20, 0x84, 0xee, 0x40, 0xab, 0xe0, 0xe1, 0x5a, 0xa3, 0x52, 0x42, 0x58, 0x60, 0x82, 0xb3, 0xc8, 0x51, 0x67, 0xae, 0x4c, 0x76, 0x7d, - 0x3a, 0x9e, 0x78, 0x53, 0x4a, 0xee, 0x6d, 0x24, 0x81, 0x29, 0xc4, 0xc1, 0x84, 0xe6, 0x11, 0x17, 0xb1, 0x95, 0x58, 0xdf, 0x18, 0x13, 0x66, 0x98, 0xc6, 0x9b, 0x42, 0xe6, 0x1c, 0x9e, 0x5c, 0x69, - 0x01, 0xec, 0x6e, 0x82, 0xd9, 0xe0, 0xe7, 0x51, 0x6f, 0xa7, 0xaf, 0x69, 0x16, 0x93, 0xdc, 0xec, 0x71, 0xfc, 0x05, 0xf2, 0x82, 0x63, 0xf6, 0x13, 0x6d, 0xb0, 0xf3, 0x7e, 0xd8, 0xe8, 0xaa, 0x16, - 0xbe, 0x5a, 0xcf, 0x29, 0xc6, 0x93, 0xa1, 0x94, 0x3a, 0x25, 0x3b, 0x9f, 0x24, 0xd5, 0x5c, 0xdf, 0x13, 0xc3, 0x59, 0x12, 0x8c, 0x4d, 0x97, 0xc6, 0x7b, 0xeb, 0x34, 0x63, 0x85, 0xb9, 0x93, 0xfa, - 0xfd, 0x45, 0xaa, 0xa5, 0xc1, 0x12, 0x53, 0xa6, 0x73, 0xcf, 0xc3, 0x97, 0x3e, 0x18, 0x4d, 0xd8, 0x29, 0x27, 0x74, 0xa9, 0x8d, 0xb4, 0x1c, 0x56, 0xab, 0x80, 0xa4, 0xf6, 0x43, 0xb6, 0xc6, 0x7a, - 0x73, 0xd6, 0xdc, 0xe5, 0xb5, 0xf9, 0xaa, 0x40, 0x9d, 0x75, 0xc9, 0x5d, 0x7c, 0x3e, 0x47, 0x5e, 0xff, 0x10, 0xa2, 0x23, 0x69, 0xb0, 0xd3, 0xfc, 0xeb, 0x5c, 0x68, 0x3d, 0x47, 0x07, 0x40, 0x86, - 0xb6, 0x5d, 0xd9, 0xe4, 0x7c, 0x1f, 0x09, 0xf8, 0xf8, 0xe0, 0x94, 0x59, 0xd2, 0x5d, 0xa9, 0x69, 0x30, 0xd7, 0x86, 0xa6, 0xbf, 0x99, 0x43, 0x24, 0xc4, 0x4f, 0x87, 0x41, 0x2f, 0xd6, 0xf2, 0x01, - 0x1b, 0x1d, 0xd6, 0xb3, 0xe1, 0x4c, 0xf4, 0xb0, 0xaa, 0xf6, 0x34, 0x91, 0xdd, 0xd4, 0x06, 0x2f, 0x4b, 0x9b, 0x30, 0x29, 0xac, 0x22, 0x1f, 0x69, 0xf8, 0x98, 0x5e, 0x4a, 0x0a, 0x3d, 0x9b, 0x31, - 0x74, 0xf5, 0xfd, 0xac, 0xec, 0xf2, 0x7b, 0xd3, 0x40, 0xf5, 0xdd, 0xda, 0xec, 0x9c, 0x63, 0xe2, 0x3b, 0x86, 0x9a, 0x3f, 0xea, 0x66, 0xc8, 0x6b, 0x6b, 0xcf, 0xdf, 0xbd, 0xa9, 0xc1, 0xea, 0x5e, - 0x43, 0x13, 0xd9, 0xd5, 0xc2, 0x5f, 0x3d, 0xf0, 0x48, 0x7d, 0x48, 0xd6, 0x40, 0x97, 0x9a, 0x22, 0x14, 0x22, 0x27, 0x41, 0x8c, 0x8c, 0xf1, 0xde, 0x30, 0x8b, 0xa2, 0x62, 0xd9, 0xab, 0x35, 0x66, - 0xe4, 0x88, 0x62, 0xcd, 0xf5, 0x50, 0x6f, 0x31, 0x94, 0x76, 0x44, 0xda, 0xb5, 0xb3, 0x1a, 0x8a, 0x96, 0xd1, 0x2e, 0x19, 0x2e, 0x25, 0xac, 0x80, 0x25, 0xd4, 0x98, 0xf2, 0x11, 0x14, 0x73, 0xfc, - 0x94, 0xcc, 0x66, 0x02, 0x7f, 0x70, 0x0a, 0xff, 0x10, 0xff, 0x7c, 0x11, 0xe0, 0x26, 0xa8, 0xfe, 0xbe, 0xa9, 0x01, 0xbf, 0xe4, 0x01, 0xf9, 0x20, 0x7c, 0xb4, 0x33, 0xd4, 0xd8, 0xec, 0x9c, 0x28, - 0x3d, 0x47, 0x06, 0x5a, 0x51, 0xfa, 0x38, 0xaa, 0x18, 0x23, 0x73, 0xe9, 0x6e, 0xa8, 0xed, 0x69, 0x9b, 0xc4, 0x51, 0x38, 0xeb, 0x23, 0xba, 0x31, 0x57, 0x66, 0xee, 0x32, 0xb2, 0x75, 0x6b, 0xb8, - 0x34, 0x97, 0x83, 0x00, 0xd0, 0x4c, 0x6f, 0xc9, 0xf4, 0x40, 0xad, 0x74, 0xb5, 0x1a, 0x4d, 0x79, 0x94, 0x70, 0xc5, 0x79, 0x57, 0x13, 0x3d, 0x01, 0xcc, 0x84, 0xba, 0x5f, 0x2d, 0xbb, 0x24, 0x58, - 0xb0, 0x78, 0xc0, 0x1e, 0xa2, 0x5f, 0x98, 0x35, 0xdd, 0xe6, 0x38, 0xb4, 0xd7, 0x8e, 0xdf, 0x26, 0x22, 0x3c, 0x70, 0x1a, 0xbc, 0xb2, 0xe2, 0xf8, 0xec, 0x6d, 0x1f, 0x46, 0xcc, 0x39, 0xd3, 0xe0, - 0xf4, 0x9e, 0xe7, 0x8c, 0x48, 0x34, 0xd6, 0xde, 0xcd, 0xa7, 0x24, 0xb7, 0x96, 0xb3, 0xad, 0x38, 0xf0, 0xf6, 0x5d, 0x49, 0x2e, 0xc4, 0x41, 0x56, 0xb9, 0x80, 0xd6, 0xcb, 0x21, 0x37, 0x4b, 0x38, - 0xc6, 0x8c, 0x00, 0x76, 0xbc, 0x82, 0xba, 0x38, 0x5a, 0x27, 0x43, 0x48, 0x8e, 0x49, 0x56, 0x21, 0xfb, 0x6e, 0xd7, 0x8d, 0xed, 0x3e, 0x4d, 0x04, 0xba, 0x98, 0xf4, 0xb1, 0x99, 0xb0, 0x9a, 0x55, - 0x0b, 0xd0, 0x42, 0x52, 0x62, 0xbf, 0x70, 0x7e, 0xc1, 0x4e, 0xbf, 0xf3, 0x9d, 0xfb, 0xd8, 0x4c, 0xdd, 0xc0, 0x0c, 0x73, 0xd5, 0xef, 0x14, 0xb9, 0x7b, 0x0a, 0x83, 0x68, 0x95, 0xe2, 0x91, 0xe9, - 0x51, 0x6c, 0x76, 0x02, 0x35, 0x54, 0xed, 0x53, 0x94, 0xf0, 0xd7, 0xa7, 0xbe, 0x09, 0xc8, 0xb0, 0x8a, 0x50, 0x3f, 0xad, 0x4a, 0x77, 0x52, 0xd3, 0xe8, 0x68, 0xbe, 0xaa, 0xef, 0x3a, 0x17, 0x1b, - 0xab, 0xf1, 0x41, 0xdf, 0xdc, 0xee, 0x47, 0x86, 0x7a, 0x8e, 0xb1, 0xc0, 0xde, 0x60, 0xf2, 0x0d, 0xbe, 0x09, 0x85, 0x3c, 0x85, 0x49, 0x9e, 0xe2, 0x24, 0xd1, 0xcf, 0xee, 0xeb, 0xcc, 0x0c, 0xca, - 0xf7, 0x30, 0x66, 0xf4, 0xd6, 0x63, 0x9d, 0x67, 0xef, 0xdf, 0xfc, 0x37, 0xb4, 0xa1, 0xfb, 0xc3, 0x49, 0xc9, 0xb7, 0x61, 0x15, 0xef, 0x24, 0xbe, 0x75, 0x7b, 0x47, 0xb1, 0x19, 0xea, 0x91, 0xef, - 0x9b, 0x7a, 0xee, 0x96, 0xe6, 0xf5, 0xaf, 0xfb, 0xe4, 0xfe, 0xbe, 0xbd, 0xb1, 0x71, 0x83, 0x7f, 0xe1, 0xca, 0xf3, 0xe0, 0x81, 0xa7, 0x22, 0x71, 0x93, 0xba, 0x03, 0x3d, 0xcc, 0xdc, 0x69, 0x5c, - 0x4d, 0xc7, 0xcf, 0xfe, 0x1b, 0xf1, 0x7e, 0x44, 0xde, 0xff, 0xfc, 0xe7, 0xf1, 0x0b, 0x77, 0xe7, 0x6b, 0x4d, 0xcb, 0xaf, 0xc4, 0x2e, 0x3c, 0xeb, 0xd6, 0xe1, 0x9f, 0xb1, 0x2c, 0x97, 0x4b, 0xff, - 0x12, 0xb1, 0x2c, 0x3f, 0x92, 0x87, 0x3f, 0x23, 0x1c, 0xee, 0x23, 0x76, 0x4f, 0x61, 0xfc, 0x83, 0x75, 0xf1, 0x97, 0x57, 0x1e, 0x15, 0xf2, 0x97, 0x8b, 0xad, 0xb5, 0xf2, 0xb0, 0x92, 0x65, 0x64, - 0x35, 0xe3, 0xc6, 0x3c, 0xec, 0x50, 0x92, 0x92, 0x99, 0x53, 0x1e, 0x63, 0xf5, 0x2d, 0x53, 0x13, 0xbe, 0x5c, 0x4a, 0x91, 0x30, 0xe1, 0x8a, 0x22, 0x99, 0x29, 0x4a, 0x24, 0x3b, 0xa5, 0xc5, 0xf7, - 0x1c, 0xc1, 0x55, 0xe6, 0x22, 0x1b, 0x55, 0x00, 0xde, 0xf3, 0xd1, 0x79, 0x7e, 0xd8, 0x8f, 0x60, 0x97, 0x4b, 0x89, 0xe5, 0x46, 0xa9, 0xb6, 0x79, 0x0f, 0x3d, 0x28, 0xa2, 0xe7, 0xe8, 0xbf, 0xaa, - 0x95, 0x3f, 0xfb, 0x10, 0x9a, 0xb1, 0x14, 0xfd, 0x75, 0x15, 0x7c, 0xe7, 0xa9, 0xe6, 0xca, 0xcf, 0xee, 0xbe, 0x5c, 0xb9, 0x28, 0xe8, 0x47, 0x39, 0x9d, 0x9d, 0xe6, 0x17, 0x7d, 0xe8, 0x87, 0x3b, - 0x77, 0x7c, 0x28, 0xdc, 0x07, 0xca, 0xf2, 0x7f, 0xb4, 0xbe, 0xfd, 0x50, 0xa0, 0x2f, 0x9a, 0xc1, 0xef, 0xda, 0xf9, 0x1f, 0xdb, 0xe7, 0x4e, 0xaf, 0x01, 0x3b, 0xe7, 0x83, 0xd6, 0x7d, 0xcb, 0xf0, - 0x60, 0x65, 0xe8, 0x80, 0x98, 0x38, 0x36, 0x7b, 0xec, 0x44, 0x43, 0x2c, 0x50, 0xf4, 0xa4, 0x6a, 0x1a, 0x70, 0x74, 0xaa, 0x57, 0x3a, 0xb2, 0x8e, 0xd2, 0xf5, 0x5c, 0xf2, 0x19, 0x6a, 0x39, 0x93, - 0x15, 0x7f, 0x0b, 0x8f, 0x63, 0x79, 0x95, 0x69, 0x1b, 0xd2, 0x44, 0x15, 0xc5, 0x88, 0x1d, 0x4b, 0xaa, 0x90, 0xae, 0x2a, 0xf7, 0x97, 0x8b, 0x59, 0x31, 0x60, 0xa8, 0xaa, 0xbb, 0xc1, 0xb3, 0x45, - 0x97, 0xfc, 0xd5, 0xbe, 0xf5, 0x5f, 0xb5, 0xcf, 0x7c, 0x36, 0x8f, 0xff, 0x55, 0xbb, 0xc2, 0x7f, 0x4f, 0x5b, 0xf2, 0xdc, 0x45, 0xfe, 0x34, 0x22, 0xdf, 0x2f, 0xfd, 0x8b, 0x1a, 0x91, 0xf7, 0x04, - 0xe1, 0x4f, 0xeb, 0xf1, 0x2e, 0x54, 0x9f, 0x07, 0xdf, 0x7f, 0xac, 0x12, 0xbb, 0x79, 0x1b, 0xd8, 0xb9, 0x3d, 0x6f, 0xad, 0xd2, 0xba, 0xc0, 0x7a, 0x3b, 0x1a, 0x70, 0x61, 0xc1, 0x76, 0x57, 0xf9, - 0x76, 0x92, 0x30, 0x8e, 0xbe, 0x28, 0xa6, 0xa4, 0x51, 0x90, 0xb8, 0x75, 0x60, 0x17, 0xe0, 0x21, 0x66, 0x29, 0x1d, 0xb7, 0xc9, 0x85, 0x51, 0x91, 0xf1, 0x60, 0x82, 0xcd, 0x38, 0x59, 0x33, 0x79, - 0x94, 0x32, 0x47, 0x73, 0xab, 0x1e, 0x1e, 0x0c, 0x96, 0x57, 0xb8, 0x48, 0xb0, 0x3d, 0x3f, 0xda, 0x2f, 0x68, 0x1a, 0x05, 0x30, 0x1f, 0xac, 0xb3, 0x5f, 0xf5, 0xa6, 0xfd, 0x82, 0x72, 0x2a, 0xdd, - 0xcc, 0xcd, 0xa3, 0xb4, 0xb3, 0x33, 0x0f, 0xd7, 0x0f, 0xfd, 0xac, 0x63, 0xfe, 0x8d, 0x7a, 0x83, 0x2f, 0x23, 0xf5, 0x51, 0x0f, 0xa1, 0xef, 0x7a, 0x08, 0x3e, 0x36, 0xdc, 0xd1, 0x65, 0xff, 0x04, - 0x45, 0xf4, 0x23, 0xd1, 0xbc, 0x80, 0xf8, 0x8f, 0x15, 0xc9, 0x93, 0xad, 0x7f, 0x5e, 0x37, 0x6e, 0x2d, 0x82, 0xf9, 0x4e, 0x59, 0x32, 0x36, 0x27, 0x8e, 0x8d, 0xd2, 0xca, 0xa8, 0x09, 0x46, 0x4e, - 0xd4, 0x64, 0x1f, 0x79, 0x63, 0xae, 0x07, 0x04, 0xc3, 0x65, 0x20, 0xd4, 0x46, 0x4d, 0xa6, 0x40, 0x01, 0x2c, 0x71, 0xcc, 0x47, 0x07, 0xdc, 0x4e, 0x8e, 0x7b, 0x9a, 0x08, 0x8f, 0x62, 0x54, 0x9f, - 0x25, 0x09, 0xbd, 0xec, 0x96, 0xd3, 0x25, 0xcb, 0xd0, 0xb0, 0xe5, 0xe6, 0xd9, 0xd0, 0x09, 0xc8, 0xc3, 0x0c, 0x2a, 0xf7, 0xdd, 0x67, 0xe3, 0xf9, 0xbf, 0x22, 0xff, 0x3f, 0xd9, 0x6c, 0xff, 0x09, - 0xb2, 0x70, 0xfd, 0xc6, 0xdb, 0x78, 0x82, 0xf3, 0xba, 0x6d, 0x5b, 0x19, 0xd9, 0x31, 0x9c, 0x9b, 0x4f, 0x40, 0xed, 0x00, 0xf2, 0x63, 0xd2, 0xa6, 0xd8, 0xed, 0x44, 0x26, 0xd5, 0x71, 0x4c, 0x57, - 0xbe, 0x44, 0x19, 0x51, 0xe6, 0x58, 0xeb, 0x9a, 0x32, 0x48, 0xd8, 0xeb, 0x92, 0x21, 0xbe, 0x5b, 0xaa, 0xb8, 0xae, 0xf2, 0xeb, 0x72, 0x0b, 0x49, 0x65, 0x6f, 0xd9, 0x53, 0xc3, 0x09, 0xd8, 0x4b, - 0x98, 0x51, 0x44, 0xcf, 0xcc, 0x92, 0xda, 0xe8, 0x60, 0x20, 0x12, 0x93, 0x49, 0xb5, 0x79, 0xb4, 0x16, 0xf9, 0x4f, 0x1c, 0xa6, 0xae, 0x1e, 0xfa, 0xc6, 0xbb, 0x6c, 0xfb, 0x91, 0xa6, 0x9d, 0x42, - 0xe2, 0xe0, 0x2f, 0xbe, 0x64, 0x37, 0xeb, 0x1c, 0xdb, 0x7f, 0xbf, 0x78, 0x38, 0x6f, 0x1a, 0xff, 0xf4, 0x16, 0xff, 0x17, 0x31, 0xaf, 0xbf, 0xf6, 0x8e, 0x3f, 0x2d, 0xed, 0xf7, 0x4b, 0xff, 0xa2, - 0x96, 0xf6, 0x13, 0x99, 0xf8, 0xd3, 0xe8, 0xbe, 0x8b, 0xda, 0xa7, 0x91, 0xf4, 0x1f, 0xab, 0xd4, 0xae, 0x5f, 0x06, 0x76, 0x6e, 0x4e, 0x5b, 0xab, 0x32, 0x2c, 0xda, 0xc3, 0x99, 0x17, 0x0c, 0xf8, - 0xe1, 0xde, 0xeb, 0x71, 0x4c, 0x38, 0x65, 0xf3, 0x75, 0xbf, 0xef, 0xf4, 0xd2, 0x4d, 0x3e, 0xa6, 0xe1, 0x9e, 0x0e, 0x65, 0x4c, 0x5c, 0xd4, 0x90, 0x95, 0x58, 0xe8, 0x1c, 0xb0, 0xd1, 0x51, 0x7f, - 0x70, 0x90, 0xf7, 0x7b, 0xad, 0x0f, 0x11, 0xda, 0xa1, 0x82, 0xfa, 0x52, 0x36, 0x0f, 0x43, 0x2d, 0xc1, 0x30, 0x7d, 0xec, 0x96, 0x3c, 0x39, 0xce, 0x60, 0x10, 0xca, 0x88, 0x5f, 0x0d, 0x01, 0x6b, - 0xab, 0xca, 0xce, 0x6e, 0xce, 0xcf, 0xea, 0xeb, 0x35, 0x6f, 0xe7, 0x7f, 0x6f, 0x2b, 0x4b, 0xd5, 0xb4, 0xd4, 0x7c, 0x94, 0x89, 0x05, 0xbf, 0x94, 0xf5, 0x78, 0x22, 0x09, 0x76, 0xce, 0x07, 0x4d, - 0x21, 0x92, 0x16, 0xc3, 0x74, 0x18, 0x9a, 0x5d, 0x70, 0xe8, 0x8a, 0xa0, 0x53, 0x0f, 0x9d, 0x2d, 0x11, 0x1b, 0x5c, 0xa8, 0x31, 0x79, 0x4d, 0x72, 0xde, 0x5c, 0x1e, 0xa7, 0x5b, 0x08, 0x9a, 0x83, - 0x75, 0x39, 0x5f, 0x04, 0x78, 0x2c, 0xf4, 0x77, 0x3e, 0xb1, 0x2f, 0x06, 0xe9, 0x20, 0xdc, 0x84, 0xe0, 0x2a, 0x97, 0x67, 0x33, 0x6b, 0x96, 0xd3, 0x96, 0xd2, 0x05, 0x61, 0x29, 0x37, 0x9d, 0x5d, - 0x56, 0x2f, 0xbb, 0x89, 0x2e, 0xbb, 0x2e, 0xf4, 0xe3, 0x20, 0x24, 0x55, 0x8b, 0xd2, 0xa6, 0xaa, 0x5f, 0x9e, 0x1e, 0xc1, 0x7d, 0x9c, 0x1d, 0xf2, 0x4a, 0xd8, 0xdf, 0x67, 0xe2, 0x0d, 0x46, 0xb7, - 0x97, 0xda, 0x14, 0x30, 0x39, 0xa2, 0xe5, 0x50, 0xbe, 0x48, 0xe5, 0xaa, 0xae, 0x6c, 0x43, 0x09, 0x2d, 0x67, 0xa2, 0x6c, 0xbb, 0x9a, 0x07, 0xe4, 0x02, 0xc7, 0x0f, 0x71, 0x10, 0xf0, 0x21, 0x82, - 0x2e, 0x90, 0xb9, 0x9e, 0xba, 0x25, 0x38, 0x08, 0xcc, 0x1c, 0x32, 0x55, 0x0f, 0x93, 0xab, 0x35, 0x8f, 0xc1, 0x99, 0xd0, 0xad, 0x42, 0x9e, 0x73, 0xc5, 0xac, 0xe7, 0xc1, 0xdd, 0x04, 0x32, 0xd2, - 0xda, 0x58, 0x1b, 0x26, 0xcd, 0xe7, 0x55, 0xdb, 0xcc, 0x86, 0x53, 0xe9, 0xcd, 0x5c, 0x4d, 0x6d, 0x33, 0xef, 0x64, 0x8e, 0x1b, 0xfc, 0xfe, 0x35, 0xaf, 0xa1, 0x5d, 0xe7, 0x39, 0x6a, 0x34, 0xbc, - 0x95, 0x94, 0x66, 0x79, 0xaa, 0xea, 0x79, 0xc7, 0x8f, 0x6c, 0xfb, 0xb6, 0xef, 0x7c, 0x8e, 0xa1, 0x7f, 0x45, 0x5e, 0x6f, 0x89, 0x37, 0x5c, 0xb9, 0xbd, 0xd4, 0x04, 0xd3, 0xb7, 0x90, 0x61, 0x84, - 0xf1, 0x24, 0x59, 0xd9, 0xcb, 0xf3, 0xd2, 0x31, 0x85, 0x72, 0xa0, 0x31, 0x99, 0xdf, 0x5f, 0x6c, 0x85, 0xe5, 0x2e, 0x05, 0x16, 0xde, 0x3c, 0x17, 0xc2, 0x74, 0x32, 0x47, 0x51, 0x0b, 0x58, 0x0d, - 0xd7, 0x93, 0xda, 0xac, 0xc5, 0x58, 0xd1, 0x93, 0x95, 0x4d, 0x7a, 0x2a, 0x3a, 0xc1, 0x0c, 0x66, 0x13, 0xd4, 0xb5, 0x5d, 0xc9, 0x80, 0x0a, 0x21, 0x5d, 0x4f, 0xda, 0xe3, 0x73, 0xd6, 0x45, 0x47, - 0x85, 0xfb, 0x7d, 0x32, 0x93, 0xaa, 0x47, 0xe9, 0xa3, 0x58, 0x1b, 0xf2, 0xa5, 0x90, 0xb0, 0x86, 0xe2, 0x11, 0x84, 0xe3, 0xff, 0x0e, 0xd9, 0x2e, 0xd2, 0x2b, 0x14, 0x0f, 0x31, 0x14, 0xc1, 0x60, - 0x30, 0x33, 0x34, 0x59, 0x80, 0xe7, 0x02, 0xb1, 0xe3, 0x77, 0xd5, 0x22, 0x0d, 0x6c, 0x05, 0x9a, 0xca, 0xa0, 0xc7, 0xb2, 0xf1, 0xcc, 0xad, 0xb4, 0xa5, 0x37, 0x88, 0xa4, 0x19, 0x66, 0xf8, 0x8c, - 0x93, 0x8c, 0xf2, 0x48, 0x2c, 0xd8, 0xb0, 0x27, 0x8c, 0x6b, 0x5b, 0x5e, 0x55, 0x36, 0xa4, 0xac, 0x5d, 0x36, 0x12, 0x0f, 0xc4, 0x62, 0x3f, 0x35, 0x35, 0x71, 0xe5, 0x50, 0xcf, 0xa6, 0x36, 0xda, - 0x4d, 0x94, 0xd1, 0x6f, 0xbf, 0xfd, 0x7e, 0x01, 0xe3, 0xd8, 0x72, 0x46, 0xe6, 0xa7, 0x02, 0x09, 0xbd, 0x61, 0xad, 0xd2, 0x73, 0x4e, 0xe8, 0x78, 0xd9, 0xfe, 0x01, 0xf6, 0xf8, 0x4b, 0x06, 0xee, - 0x3b, 0xd5, 0x77, 0xfc, 0xbd, 0x6c, 0xdf, 0xc1, 0xdb, 0x19, 0xba, 0x63, 0x68, 0x9e, 0x07, 0x20, 0x46, 0x0a, 0x63, 0x4b, 0x94, 0xe2, 0x99, 0x88, 0x8c, 0xc0, 0x68, 0x38, 0x03, 0x51, 0x71, 0xeb, - 0x8e, 0x89, 0x7e, 0xb5, 0x06, 0xcc, 0x91, 0x36, 0x9c, 0x38, 0x99, 0xb1, 0x77, 0x90, 0xb5, 0x3c, 0x31, 0x7c, 0x00, 0x85, 0x22, 0x4a, 0x1d, 0x18, 0xb2, 0x16, 0xe0, 0x23, 0xcd, 0xb2, 0xe2, 0x7e, - 0x9f, 0xb6, 0x41, 0x1b, 0xa8, 0x5d, 0xb8, 0x07, 0x78, 0xe5, 0xc8, 0x51, 0xf1, 0xa7, 0x61, 0xd9, 0xdf, 0x2f, 0x20, 0xbc, 0x33, 0xe4, 0xf3, 0xaa, 0x41, 0x73, 0x44, 0xb5, 0x4c, 0x85, 0x7a, 0x9c, - 0x2b, 0xdc, 0x14, 0x98, 0xf9, 0x79, 0x7a, 0xc7, 0x47, 0xae, 0xf0, 0x89, 0xc0, 0x73, 0x6c, 0x3d, 0xd4, 0x5a, 0x4d, 0xec, 0x52, 0x8e, 0x70, 0x84, 0x54, 0xc3, 0xc3, 0xf6, 0x30, 0x12, 0x06, 0xf2, - 0x76, 0xa4, 0x0d, 0x80, 0x32, 0x0c, 0xc5, 0x6d, 0xd9, 0x83, 0x02, 0x3c, 0x08, 0x76, 0x3a, 0x2c, 0x8f, 0x81, 0x70, 0x4f, 0xc7, 0xf1, 0x8e, 0x9d, 0x4c, 0x87, 0x13, 0x48, 0x55, 0x30, 0x43, 0xf3, - 0x57, 0xec, 0x2c, 0x1a, 0x2c, 0x1c, 0x27, 0x00, 0x76, 0x75, 0x0f, 0x53, 0x96, 0x87, 0x1d, 0x13, 0x4d, 0x6d, 0xec, 0x19, 0xb6, 0xbf, 0x98, 0x3e, 0x7c, 0x9d, 0x81, 0xa6, 0x6a, 0xbe, 0xf9, 0x29, - 0x11, 0xed, 0x4e, 0x51, 0xc8, 0x07, 0xe9, 0xc6, 0xb7, 0x65, 0x8d, 0xfe, 0x5b, 0x64, 0x11, 0xdf, 0xe6, 0xb5, 0x3f, 0x9a, 0x70, 0xbc, 0xd0, 0x41, 0x3f, 0xe8, 0x9e, 0x25, 0xe8, 0x7c, 0xd6, 0x4c, - 0x41, 0x5a, 0x74, 0xd2, 0xf5, 0x1e, 0x1a, 0xef, 0x71, 0xc4, 0xd9, 0xf7, 0x48, 0x16, 0xa6, 0x9c, 0xdd, 0xb4, 0x67, 0xdb, 0x5b, 0xbf, 0xe7, 0x5a, 0xc9, 0x5a, 0xc9, 0xb7, 0xaa, 0x64, 0x47, 0xc5, - 0x28, 0x4a, 0x81, 0xf5, 0xd4, 0x98, 0x87, 0xe2, 0xa1, 0x37, 0x86, 0xd1, 0xd2, 0xee, 0xad, 0x0f, 0xab, 0x59, 0x11, 0x93, 0x8b, 0xc8, 0x34, 0xa3, 0xc9, 0x34, 0x4b, 0xb1, 0x9d, 0x85, 0x3b, 0x84, - 0x21, 0xac, 0x61, 0x78, 0x08, 0xe3, 0xd3, 0x65, 0xcb, 0xa4, 0xf3, 0x8f, 0x32, 0x00, 0xad, 0xd6, 0xed, 0x7e, 0xe9, 0xe1, 0xaf, 0xb3, 0xd0, 0xdb, 0x5e, 0xdc, 0x5c, 0xfa, 0x85, 0xa9, 0xe7, 0x35, - 0x23, 0x5a, 0x0e, 0x16, 0x7f, 0x16, 0x16, 0xb8, 0xdc, 0xf4, 0x2f, 0x59, 0x58, 0xe0, 0xa1, 0xc4, 0xfc, 0x59, 0x4e, 0xa0, 0x55, 0x39, 0x81, 0xa6, 0x2e, 0x6a, 0xe3, 0x41, 0x7a, 0xec, 0xa2, 0x78, - 0x69, 0x48, 0xfd, 0xa0, 0x7b, 0xa9, 0xef, 0x7b, 0x3a, 0xeb, 0x60, 0xed, 0x86, 0xd4, 0x51, 0xb4, 0x81, 0xd4, 0x78, 0xa0, 0xf1, 0xea, 0x72, 0xc4, 0xcc, 0x7c, 0xe2, 0xd0, 0x07, 0x62, 0x62, 0x44, - 0xf7, 0xb7, 0x0a, 0x41, 0x10, 0xa0, 0xe3, 0xb0, 0x83, 0xf1, 0x0c, 0xcf, 0xbb, 0x62, 0xdf, 0xd3, 0x46, 0xe2, 0x78, 0xb9, 0x04, 0x6d, 0x6a, 0x3a, 0xd3, 0xfa, 0x9c, 0x56, 0x5a, 0xa9, 0x3d, 0xde, - 0x94, 0x43, 0x58, 0x8c, 0x95, 0xd8, 0x9f, 0x0b, 0x61, 0x35, 0x8c, 0xba, 0x5d, 0x7f, 0x03, 0xd2, 0x74, 0xf0, 0xcc, 0xf6, 0x7c, 0x36, 0xaf, 0x69, 0x23, 0x90, 0xc7, 0x4f, 0x3d, 0x15, 0x93, 0x7d, - 0x8c, 0x28, 0xfa, 0x82, 0x57, 0xec, 0x9a, 0xf0, 0x05, 0xd2, 0xf3, 0x69, 0xe3, 0x34, 0x6d, 0xe1, 0x29, 0xb3, 0xc7, 0x1b, 0x0f, 0xa7, 0x27, 0xe9, 0x78, 0x2d, 0x4e, 0xb2, 0xed, 0xa0, 0xeb, 0xf9, - 0xb2, 0x14, 0x48, 0xe0, 0x7e, 0xec, 0x17, 0x7b, 0x7e, 0x05, 0x28, 0x5d, 0xb1, 0x57, 0xcd, 0x86, 0x36, 0x6b, 0x4d, 0x61, 0xb0, 0xa8, 0xe6, 0x53, 0xb6, 0xa8, 0x57, 0xab, 0xd0, 0xc1, 0x83, 0x4a, - 0x36, 0x00, 0xa1, 0x60, 0x14, 0xbd, 0x5a, 0x0c, 0xa7, 0x5a, 0x92, 0x65, 0xb3, 0xb5, 0x14, 0xc0, 0x7e, 0x0f, 0x87, 0x45, 0xf5, 0x75, 0xa7, 0x69, 0xfe, 0xa9, 0x4e, 0x17, 0x72, 0x5d, 0x90, 0xb5, - 0x2d, 0x4f, 0xfe, 0x79, 0x95, 0x8a, 0x6e, 0x18, 0x72, 0xd3, 0x72, 0xfd, 0x61, 0xf7, 0x04, 0xe0, 0xfc, 0xa9, 0x3f, 0x95, 0x80, 0x77, 0xb2, 0xe7, 0xf5, 0xaa, 0xe6, 0xb8, 0x73, 0x22, 0xf6, 0x9c, - 0xf9, 0x39, 0x94, 0xd6, 0x4c, 0x42, 0x91, 0x01, 0x6a, 0xad, 0x74, 0xa3, 0xe0, 0xb9, 0x65, 0xdf, 0x19, 0x07, 0x87, 0xc3, 0x06, 0xe8, 0x9a, 0x11, 0xb1, 0x16, 0x3d, 0xa5, 0xb4, 0x70, 0xb8, 0xa7, - 0x82, 0x53, 0x48, 0x24, 0x01, 0x19, 0x25, 0xb1, 0x51, 0x0c, 0xab, 0x4b, 0xf7, 0xb0, 0xf4, 0xa1, 0xc1, 0x78, 0x1f, 0x53, 0x53, 0x50, 0xe8, 0xc9, 0x2b, 0x7e, 0xc1, 0x95, 0xc1, 0xee, 0x30, 0xb7, - 0xcb, 0x0d, 0xb0, 0x79, 0xe4, 0x26, 0x6d, 0xcb, 0x3c, 0xb8, 0xed, 0x2a, 0xcc, 0x3f, 0x88, 0x7b, 0x4d, 0xfe, 0xc2, 0xc3, 0xb9, 0xde, 0x4b, 0x7e, 0x87, 0x77, 0xb2, 0x97, 0x3e, 0xda, 0x9c, 0x74, - 0xf0, 0x76, 0xbe, 0x86, 0xa4, 0x18, 0x89, 0x1b, 0x5f, 0x5e, 0x2c, 0x07, 0x13, 0x64, 0xc2, 0x77, 0x17, 0xcb, 0x4d, 0x44, 0xad, 0xaa, 0x6c, 0x8b, 0x65, 0x91, 0x1a, 0x3a, 0x76, 0x44, 0x4c, 0x66, - 0x8b, 0x80, 0xc2, 0x7a, 0xf0, 0x84, 0xd1, 0x7b, 0x54, 0x86, 0x0a, 0x50, 0x15, 0x1b, 0xae, 0x54, 0x1f, 0xa4, 0x6e, 0x0d, 0x2a, 0xca, 0x68, 0xea, 0x4f, 0xd7, 0x25, 0x4a, 0x26, 0x82, 0xa0, 0x75, - 0x63, 0x63, 0xe4, 0x4f, 0x97, 0xbd, 0x71, 0xff, 0x59, 0x0f, 0x6d, 0xdd, 0xc3, 0x9e, 0xa0, 0xf9, 0x6d, 0x99, 0x78, 0xec, 0xa5, 0x72, 0x34, 0x8f, 0xcb, 0xc4, 0x63, 0xed, 0x2a, 0xd1, 0xd4, 0x1a, - 0xd3, 0x4d, 0xd9, 0x11, 0x2d, 0xc3, 0xa9, 0xe6, 0xb9, 0x2b, 0x4e, 0x43, 0x9c, 0x64, 0xdc, 0xe7, 0x67, 0xdb, 0xc9, 0xde, 0xce, 0x77, 0xd4, 0x6c, 0x29, 0xed, 0x15, 0x74, 0xa8, 0x54, 0x1c, 0xda, - 0x27, 0x66, 0xf9, 0x5e, 0xdb, 0x28, 0x22, 0x1b, 0x86, 0x0b, 0x17, 0x9e, 0xec, 0xf6, 0xc0, 0x90, 0x8b, 0x1c, 0x63, 0xee, 0xf7, 0x63, 0x04, 0x41, 0xaa, 0x15, 0x3d, 0x19, 0x3a, 0xa6, 0x32, 0x12, - 0x17, 0xbd, 0xd7, 0xa7, 0x78, 0x5f, 0xcb, 0xc4, 0x9f, 0xdc, 0x5b, 0x5f, 0x7a, 0x41, 0x6b, 0x9e, 0xbc, 0xda, 0x6f, 0x4e, 0x45, 0xdd, 0xaf, 0x10, 0xfd, 0x3f, 0xcf, 0x3d, 0xe9, 0x2f, 0x70, 0x2b, - 0x7e, 0x1f, 0x2e, 0xf5, 0x53, 0xef, 0x31, 0x1b, 0x7d, 0x69, 0xdd, 0xe7, 0x42, 0xb4, 0xe1, 0xf4, 0xe9, 0xb0, 0xa9, 0xa1, 0xd7, 0x42, 0xb3, 0xcd, 0x31, 0xd4, 0x9c, 0x5b, 0x02, 0x3d, 0x2c, 0xe2, - 0x9d, 0x5d, 0xf0, 0xcb, 0x83, 0x9e, 0xea, 0x58, 0x32, 0xea, 0xee, 0x6a, 0x4a, 0x71, 0x0b, 0x61, 0xe9, 0x7a, 0x6a, 0x4f, 0xae, 0x36, 0xa4, 0xcc, 0xe7, 0xd0, 0x16, 0x1c, 0xcc, 0xc6, 0x64, 0x09, - 0xa9, 0x2a, 0x95, 0x6e, 0x29, 0x98, 0xd8, 0xaf, 0x3d, 0x85, 0x4c, 0x47, 0x06, 0x8d, 0x6f, 0x8c, 0xa9, 0x1e, 0xaf, 0xfa, 0xf2, 0x78, 0x9a, 0x00, 0x52, 0xb9, 0x7e, 0x9d, 0xcd, 0xd7, 0x09, 0x96, - 0xf9, 0x47, 0x91, 0xd9, 0x1b, 0x23, 0x3c, 0x76, 0xf5, 0xe8, 0xa3, 0x06, 0xed, 0xa9, 0x52, 0xc8, 0x4f, 0xc5, 0xa0, 0x55, 0x61, 0x06, 0x35, 0xd5, 0x9d, 0xc3, 0x1f, 0x6a, 0xfa, 0x36, 0x14, 0x8f, - 0x5c, 0x3a, 0xfe, 0x6f, 0x6b, 0xdc, 0x6e, 0x6c, 0xa0, 0x2b, 0x55, 0xac, 0x0d, 0x42, 0x31, 0x8a, 0xe4, 0xe6, 0xd8, 0x18, 0x4c, 0xe7, 0xf2, 0x3c, 0x5c, 0x6d, 0xc6, 0x1c, 0x54, 0xa1, 0x9c, 0xc5, - 0x87, 0x7d, 0xd9, 0x72, 0xf5, 0xa8, 0xce, 0x68, 0x3b, 0x2b, 0x13, 0x64, 0x63, 0x86, 0xf3, 0x51, 0x02, 0x4e, 0xb7, 0x71, 0x5d, 0x8b, 0x60, 0x49, 0xd5, 0xa9, 0x70, 0x18, 0x85, 0x04, 0x97, 0xa1, - 0xdd, 0x15, 0x8d, 0x8d, 0x86, 0x5c, 0xd5, 0xb7, 0x92, 0xef, 0x33, 0x6e, 0xd5, 0xf4, 0xf1, 0x4a, 0xf5, 0x2b, 0x0a, 0x58, 0x4d, 0x1b, 0x3f, 0x72, 0x6a, 0x37, 0x46, 0x6c, 0x0b, 0x9d, 0x8b, 0x53, - 0x8b, 0xae, 0xc8, 0x25, 0x03, 0x68, 0xb3, 0x47, 0xc8, 0x6d, 0x35, 0x5f, 0xe4, 0x5d, 0x6b, 0xb4, 0x77, 0x4b, 0x6f, 0xeb, 0x63, 0x28, 0xb2, 0x65, 0x2b, 0x8b, 0x9b, 0x5a, 0x0a, 0x40, 0xc2, 0x12, - 0x9d, 0x2c, 0x53, 0xc5, 0xb4, 0xc8, 0x49, 0x3a, 0x16, 0x15, 0x74, 0xc2, 0x4f, 0x84, 0x8a, 0x5d, 0x60, 0xfd, 0xc9, 0x8c, 0x89, 0xfd, 0x39, 0x8e, 0xa2, 0xca, 0x9e, 0xea, 0xe2, 0x0b, 0x53, 0x60, - 0xf9, 0xf2, 0xc7, 0x79, 0xea, 0x6a, 0x6a, 0x37, 0xa1, 0x92, 0xdf, 0xc8, 0x00, 0xfc, 0x8a, 0x10, 0x9c, 0xa8, 0x9e, 0x10, 0x69, 0x0e, 0x3b, 0x27, 0x52, 0xcf, 0x71, 0x89, 0x70, 0x29, 0x3a, 0x10, - 0xf9, 0x6c, 0x80, 0x2d, 0x26, 0x60, 0x5f, 0xd8, 0xb1, 0xf4, 0x8c, 0x90, 0x6a, 0xcf, 0x55, 0x77, 0xca, 0x02, 0xc1, 0xa5, 0xc9, 0xb6, 0x9f, 0xea, 0xd3, 0x3c, 0x1f, 0x25, 0x9a, 0x61, 0x50, 0xcc, - 0x3a, 0x0d, 0x69, 0xc0, 0x1a, 0xd4, 0x38, 0xe9, 0xce, 0xf0, 0xb9, 0x06, 0x11, 0x71, 0xc9, 0x0c, 0x4a, 0x1f, 0xb7, 0x45, 0x88, 0xc1, 0x28, 0x63, 0xe4, 0x67, 0xfe, 0xa6, 0x8c, 0xe4, 0xd7, 0xbb, - 0x6b, 0x16, 0xa7, 0x6e, 0x98, 0x5b, 0xe7, 0xa9, 0xee, 0xdf, 0xe1, 0x66, 0x1a, 0xdc, 0xa6, 0x63, 0xa5, 0xea, 0xa1, 0x53, 0x84, 0x27, 0x1c, 0x1f, 0xb9, 0xa3, 0x5e, 0x41, 0xf6, 0x9d, 0x6e, 0x03, - 0xee, 0xfb, 0x59, 0xe3, 0x8e, 0x6a, 0x01, 0x2f, 0x3f, 0x38, 0xec, 0x23, 0x41, 0xde, 0x2e, 0x0f, 0xec, 0x94, 0xc8, 0xf2, 0xa5, 0x49, 0xf4, 0x46, 0x76, 0x68, 0x60, 0xbd, 0xc8, 0xac, 0xe8, 0x21, - 0x59, 0x4f, 0x0d, 0x2b, 0x11, 0x80, 0xdd, 0xc0, 0x0b, 0x7d, 0x25, 0x60, 0xb8, 0x1a, 0xd4, 0x25, 0x3c, 0xb6, 0xa8, 0x14, 0xd4, 0x25, 0x6c, 0x9d, 0x10, 0x50, 0x36, 0x01, 0x63, 0x68, 0xb8, 0xd3, - 0xbd, 0x65, 0xaf, 0x37, 0xaf, 0x16, 0xe8, 0xa0, 0x9f, 0x0e, 0x0f, 0xbf, 0x68, 0xea, 0xb5, 0x1b, 0xa9, 0xd2, 0x93, 0x1f, 0xf3, 0xa1, 0x98, 0xbe, 0x82, 0xa5, 0x6b, 0x9d, 0xc6, 0xaa, 0xe3, 0xc1, - 0x49, 0x42, 0x9f, 0x23, 0x88, 0xb2, 0xdb, 0xda, 0xdc, 0x77, 0xa7, 0xdd, 0xfe, 0x40, 0xf4, 0xd8, 0xc1, 0x74, 0x70, 0x70, 0x09, 0x10, 0x85, 0x75, 0x6a, 0x30, 0xd2, 0x6c, 0x0d, 0x4a, 0x06, 0x87, - 0x74, 0x8f, 0xf3, 0xeb, 0xfd, 0xdc, 0x80, 0x54, 0xb6, 0x72, 0x30, 0x9d, 0x41, 0xb6, 0xde, 0x54, 0x43, 0x36, 0x56, 0x77, 0x59, 0x44, 0x91, 0x9d, 0x4e, 0x53, 0x5f, 0xe8, 0xea, 0x72, 0x12, 0x32, - 0x78, 0x3a, 0xc4, 0x07, 0xbc, 0x22, 0xeb, 0x9f, 0x1d, 0x7a, 0x3f, 0x45, 0xb0, 0xe9, 0x5a, 0xad, 0x3c, 0xeb, 0x99, 0x1a, 0x3f, 0x14, 0x48, 0xe8, 0x15, 0xcf, 0x7a, 0xa6, 0xc6, 0x47, 0x08, 0x33, - 0x35, 0x6e, 0x16, 0xcd, 0x5a, 0xb8, 0xd6, 0x99, 0x05, 0xbf, 0xb6, 0xb9, 0x05, 0xed, 0x8e, 0x33, 0x1c, 0x8a, 0x10, 0xc9, 0xa4, 0xe2, 0xb8, 0x8c, 0xd1, 0xcc, 0x5c, 0xf1, 0x9b, 0x85, 0x34, 0xc5, - 0x30, 0xdd, 0x58, 0x64, 0x72, 0xb7, 0x6f, 0xcd, 0x7a, 0xcb, 0xa5, 0x32, 0x11, 0x06, 0xeb, 0x15, 0x9b, 0xb9, 0x6b, 0x55, 0x9a, 0xaf, 0xa7, 0xb0, 0x12, 0x86, 0x40, 0x90, 0x28, 0xb0, 0x60, 0xad, - 0x14, 0xb4, 0x46, 0xb9, 0x75, 0xaf, 0x5e, 0xc4, 0xa4, 0x23, 0xfd, 0x7c, 0xe4, 0xcb, 0xf2, 0xb4, 0x49, 0x74, 0x7e, 0x6c, 0xe6, 0x23, 0xaf, 0x69, 0xc0, 0x2b, 0xc2, 0x0d, 0x32, 0x1f, 0xa7, 0x0d, - 0x42, 0x2d, 0x3a, 0xa9, 0x42, 0xe6, 0xd3, 0x0a, 0x3e, 0xe4, 0xf2, 0x26, 0xc7, 0xbd, 0x64, 0xaa, 0x0b, 0x73, 0x40, 0x10, 0x73, 0x73, 0x09, 0xaf, 0x8a, 0xd9, 0xb8, 0xbb, 0x85, 0x90, 0xa2, 0x18, - 0xe5, 0x63, 0x11, 0x5e, 0x94, 0x44, 0xd7, 0xdb, 0x88, 0xe3, 0xb1, 0x8d, 0xeb, 0xae, 0x36, 0xa9, 0x06, 0xa3, 0xa8, 0xa2, 0x0e, 0xb5, 0x32, 0x07, 0x4c, 0x5a, 0x87, 0xa9, 0x5e, 0x30, 0x19, 0xcc, - 0x55, 0x1f, 0xd2, 0x62, 0x94, 0x48, 0xcb, 0xff, 0x0c, 0x53, 0x3f, 0x3b, 0x84, 0xfa, 0xce, 0x7d, 0x3c, 0xb7, 0x7d, 0x25, 0xa0, 0xe5, 0x42, 0xb4, 0xc1, 0xf2, 0x74, 0xd8, 0xec, 0x92, 0xd0, 0x02, - 0x47, 0xc1, 0x74, 0xbb, 0x02, 0x8f, 0xe5, 0x92, 0x03, 0x6d, 0x93, 0x25, 0x3a, 0xd8, 0x3b, 0x1b, 0xb2, 0x6b, 0x4c, 0xc1, 0xa0, 0x5a, 0xd9, 0xa5, 0xa6, 0x8c, 0xd4, 0xc5, 0x4c, 0x95, 0x76, 0x80, - 0x96, 0x39, 0x3b, 0x0f, 0x5a, 0xe0, 0xba, 0xc5, 0xeb, 0xf6, 0x56, 0xdd, 0xa5, 0x26, 0xe3, 0xa5, 0x7c, 0xa5, 0xe6, 0x9b, 0xb1, 0x56, 0x03, 0xc3, 0x68, 0x68, 0x6c, 0x27, 0xfb, 0x74, 0xec, 0x06, - 0xc8, 0xd4, 0x5b, 0xbf, 0x10, 0x62, 0x90, 0x47, 0x81, 0xab, 0x77, 0x32, 0xdf, 0x34, 0x1f, 0xf5, 0xbd, 0x17, 0x6d, 0xad, 0x2b, 0xc2, 0x47, 0x74, 0xae, 0x4e, 0xdb, 0x5a, 0x5e, 0xbb, 0x99, 0xe0, - 0x71, 0x09, 0xed, 0x90, 0xf1, 0x1e, 0xda, 0xac, 0x67, 0x43, 0x00, 0x13, 0xb5, 0x3a, 0x72, 0x25, 0x30, 0x94, 0x77, 0x3c, 0xbd, 0x9e, 0x15, 0x06, 0x52, 0x94, 0xe1, 0x28, 0x29, 0x38, 0x18, 0xdc, - 0xe3, 0x2a, 0xd9, 0x13, 0x95, 0xe9, 0x48, 0x86, 0x68, 0xbd, 0x4e, 0xc6, 0x90, 0x18, 0x12, 0x64, 0xb4, 0x05, 0x65, 0x59, 0x84, 0x27, 0xda, 0x72, 0xac, 0x7a, 0x4a, 0x1c, 0xa3, 0xc3, 0x6e, 0x7e, - 0x83, 0xd0, 0x33, 0xb1, 0x6a, 0xbb, 0x24, 0x58, 0xaa, 0xae, 0xdf, 0x2c, 0x6a, 0xe5, 0x87, 0xd8, 0x34, 0x3a, 0x8d, 0xea, 0x7b, 0x34, 0xa1, 0xbc, 0xdd, 0x97, 0xa9, 0x35, 0x9c, 0x77, 0x5f, 0x71, - 0x04, 0xf6, 0x6e, 0x43, 0x03, 0x31, 0xfe, 0x1c, 0x62, 0x6e, 0xca, 0x41, 0x63, 0x77, 0x86, 0x11, 0xa6, 0x1b, 0x9b, 0xb5, 0xbb, 0x90, 0xe1, 0xc9, 0x7c, 0x0e, 0x2e, 0x64, 0x8b, 0x5b, 0x42, 0x59, - 0x61, 0x0d, 0x17, 0x9b, 0xc0, 0x5b, 0xd8, 0xe5, 0x2a, 0x8b, 0x96, 0x48, 0x9e, 0xec, 0xf5, 0x5c, 0x34, 0xe9, 0x85, 0xe9, 0xad, 0x75, 0x6b, 0x96, 0xef, 0xb7, 0xe3, 0xa4, 0x27, 0x4f, 0xe1, 0xe5, - 0x5e, 0xa4, 0xb2, 0x18, 0x11, 0xd2, 0x05, 0xb3, 0x8e, 0xf9, 0x2d, 0x91, 0x55, 0x3f, 0x80, 0xf8, 0xb7, 0xbb, 0xd3, 0x87, 0x1f, 0xce, 0x09, 0xdf, 0x7d, 0x29, 0xbe, 0xe7, 0xa8, 0xa9, 0xd6, 0x8a, - 0x63, 0xa5, 0x1b, 0x3d, 0x60, 0x10, 0xf5, 0xda, 0xc6, 0x70, 0x47, 0x8a, 0x0d, 0x3f, 0x4a, 0x37, 0xea, 0x50, 0xed, 0x36, 0x83, 0x93, 0x69, 0x7f, 0xba, 0x2d, 0x85, 0xa2, 0x1a, 0x1c, 0x26, 0x63, - 0x74, 0x6e, 0x31, 0x1a, 0xbe, 0x1e, 0x33, 0x1b, 0x25, 0xd8, 0xd4, 0x88, 0xb5, 0x62, 0xed, 0x12, 0x41, 0x0d, 0xa2, 0x56, 0xfa, 0x86, 0x6f, 0x82, 0x09, 0x6a, 0xcf, 0xbd, 0x60, 0xcf, 0xa8, 0x66, - 0xc1, 0x42, 0xf1, 0x16, 0xe2, 0xea, 0x0c, 0x9f, 0xaf, 0xa7, 0x0b, 0xdb, 0x4a, 0x92, 0x9e, 0xb2, 0x4b, 0x0f, 0x26, 0xdc, 0x1d, 0xf8, 0x9c, 0x6c, 0x57, 0xed, 0xd6, 0x66, 0x2e, 0xd3, 0xab, 0x3b, - 0xeb, 0x2c, 0xd7, 0x81, 0xd2, 0x9f, 0x9a, 0x6e, 0x4b, 0xf2, 0xb5, 0x9a, 0x72, 0x37, 0xc0, 0xdc, 0x5c, 0x7a, 0x16, 0x8b, 0xfb, 0xf3, 0x42, 0x7b, 0x5f, 0x63, 0x71, 0x5b, 0x54, 0xd6, 0x9b, 0x4b, - 0xeb, 0x3e, 0x5f, 0x2c, 0x96, 0xa8, 0xc9, 0xe5, 0xe2, 0x68, 0x5e, 0x86, 0xb3, 0x2d, 0x39, 0xd2, 0x77, 0x66, 0x0e, 0x7b, 0x50, 0x8e, 0x0b, 0x85, 0x90, 0xf5, 0xeb, 0xf9, 0xbc, 0xce, 0xcc, 0x1d, - 0x87, 0x23, 0x8a, 0x4f, 0x25, 0x4b, 0xab, 0x3f, 0x9c, 0xf7, 0xdc, 0xac, 0xda, 0x24, 0xc3, 0x92, 0x5f, 0x0f, 0x56, 0xbc, 0x60, 0x6f, 0x00, 0x72, 0x00, 0x96, 0xec, 0x6c, 0xe6, 0x98, 0x4e, 0xb5, - 0xb7, 0x3e, 0xef, 0x53, 0xf3, 0xaf, 0x10, 0x78, 0x7b, 0x87, 0xc3, 0xff, 0x43, 0x23, 0x6b, 0x1f, 0x63, 0xa0, 0xa9, 0xbe, 0x1a, 0xea, 0xa6, 0xd1, 0xf9, 0xce, 0xbd, 0x04, 0xdf, 0xac, 0x53, 0xb6, - 0xfd, 0xf8, 0x5b, 0xd2, 0x60, 0xe7, 0xd3, 0x85, 0x66, 0xa8, 0x6f, 0x01, 0x0a, 0x1a, 0x2d, 0xcc, 0xa5, 0x00, 0xc9, 0xd3, 0x15, 0x41, 0x3a, 0x33, 0x98, 0x0e, 0xb4, 0x4d, 0x36, 0xc6, 0x0e, 0x6a, - 0xb2, 0x24, 0x73, 0xcf, 0xe5, 0x7d, 0x6d, 0x2f, 0x71, 0x8a, 0x10, 0xf3, 0xd0, 0x78, 0xdd, 0x05, 0x58, 0x73, 0x83, 0x69, 0x12, 0xad, 0x6e, 0x20, 0x3a, 0xdc, 0xe7, 0x50, 0xbe, 0x47, 0xa6, 0x69, - 0x2c, 0xc5, 0xeb, 0x4a, 0x54, 0xe7, 0xd5, 0xd0, 0x1f, 0x2e, 0x7a, 0x23, 0x67, 0xbb, 0xc4, 0xe7, 0x3f, 0x0e, 0x37, 0xd6, 0xd4, 0xcc, 0x24, 0xb0, 0xd3, 0x8c, 0xf5, 0x3e, 0x44, 0xf8, 0x0b, 0x83, - 0xef, 0x3b, 0xd5, 0x06, 0x9d, 0xf3, 0x71, 0xa7, 0xa1, 0xf5, 0x1c, 0x18, 0x7a, 0x1c, 0xab, 0x5b, 0x9f, 0x0f, 0xa9, 0x1c, 0x5b, 0xac, 0x34, 0x81, 0x67, 0x0f, 0x80, 0x86, 0x03, 0xe3, 0xb1, 0x5d, - 0x4a, 0x58, 0x99, 0x66, 0x1c, 0x55, 0x6a, 0x65, 0xaa, 0xb9, 0xe2, 0x28, 0xce, 0x48, 0x6b, 0xcc, 0xc9, 0x3b, 0x6f, 0xc7, 0xa5, 0x07, 0xc2, 0x73, 0xa1, 0x74, 0x39, 0xf2, 0x58, 0x68, 0x57, 0x6b, - 0x33, 0x73, 0x3e, 0xa9, 0xea, 0x7d, 0x42, 0xb9, 0x87, 0x38, 0xc2, 0xe0, 0xc4, 0x5c, 0xdf, 0x98, 0xfc, 0x1f, 0xea, 0xec, 0xff, 0x7a, 0xef, 0x57, 0x37, 0x9d, 0xef, 0xe1, 0xc2, 0x73, 0x3b, 0xb5, - 0x67, 0x99, 0x69, 0x94, 0xbd, 0x2f, 0x1e, 0x5c, 0x8d, 0x0a, 0x0f, 0x5e, 0x13, 0xab, 0x79, 0x6a, 0x46, 0xe1, 0xb7, 0xef, 0xa9, 0xaa, 0xea, 0xed, 0x7c, 0x5f, 0xf3, 0xb2, 0x9f, 0xbe, 0x43, 0x8f, - 0xc2, 0xac, 0xf0, 0xf3, 0xe3, 0x67, 0x7f, 0xf7, 0x9a, 0x13, 0xd9, 0x86, 0x89, 0xe7, 0xf1, 0xe9, 0xf7, 0x2f, 0x43, 0xcf, 0xff, 0xfd, 0x8d, 0x38, 0xb9, 0xa1, 0x9a, 0x1e, 0x3a, 0xe6, 0x3e, 0x37, - 0xc3, 0xa3, 0x08, 0x3d, 0x1e, 0x76, 0x5e, 0x09, 0xb6, 0xf8, 0x42, 0xfd, 0x28, 0x5e, 0x9f, 0xaf, 0x75, 0x90, 0x76, 0xe5, 0xbf, 0x3d, 0x4e, 0xcf, 0x47, 0xe0, 0x70, 0x25, 0x6a, 0x4a, 0x34, 0x3a, - 0xec, 0x22, 0x93, 0xd7, 0x9c, 0x4d, 0x2c, 0xf8, 0x33, 0x26, 0x19, 0xcc, 0xf4, 0x6a, 0x33, 0x1a, 0x8f, 0x22, 0x1b, 0x43, 0x7a, 0x38, 0xcf, 0xcd, 0x97, 0x95, 0x28, 0x2f, 0x0c, 0x8f, 0xe5, 0x0d, - 0xd7, 0xf1, 0x3c, 0x88, 0xf3, 0x43, 0xc7, 0x14, 0x49, 0xcd, 0xd7, 0x64, 0xc2, 0xe0, 0x05, 0xd5, 0x9a, 0xd1, 0xee, 0x82, 0x8a, 0x22, 0xf1, 0x69, 0x69, 0xea, 0x67, 0x06, 0x6e, 0x0b, 0xfd, 0xad, - 0xb9, 0x61, 0x9e, 0x9a, 0x0f, 0xd7, 0x47, 0x5e, 0x1c, 0xd3, 0xce, 0x44, 0x4f, 0x80, 0x36, 0x87, 0x6d, 0xc7, 0xb1, 0x95, 0x30, 0xb5, 0xe5, 0x69, 0xe5, 0xd1, 0xea, 0x72, 0x80, 0x53, 0xd0, 0x62, - 0x13, 0xa2, 0x13, 0x55, 0x5f, 0xd9, 0x5e, 0x91, 0xa6, 0xda, 0x34, 0x30, 0x49, 0x45, 0x99, 0x6d, 0x07, 0x8b, 0xc5, 0x8a, 0x0c, 0x82, 0x7c, 0x4b, 0x88, 0xa2, 0xe4, 0x40, 0x3d, 0x1b, 0x8d, 0xab, - 0xa1, 0x1e, 0xe6, 0x22, 0x49, 0x72, 0xbd, 0x74, 0x0c, 0x4f, 0xa0, 0xd9, 0x7e, 0xa7, 0x99, 0xb9, 0xa7, 0x47, 0x9b, 0x7a, 0x55, 0x8d, 0x9f, 0x0c, 0xee, 0xa9, 0xaa, 0x9b, 0x1d, 0x73, 0x1f, 0xab, - 0x61, 0xf6, 0xd8, 0x69, 0xd6, 0x84, 0x96, 0xbf, 0x30, 0x76, 0xdd, 0x12, 0x3f, 0x22, 0x72, 0x7b, 0xe5, 0x14, 0xb3, 0xde, 0x62, 0x20, 0x73, 0xd9, 0x62, 0xce, 0x73, 0x7d, 0x3b, 0xe5, 0x37, 0x24, - 0x8f, 0x94, 0xbd, 0x21, 0x88, 0xef, 0xe3, 0x1a, 0x22, 0xeb, 0x05, 0xcf, 0x40, 0x90, 0x1c, 0x17, 0x76, 0xe2, 0x04, 0xdb, 0x7c, 0x15, 0x4c, 0x05, 0x02, 0x87, 0xa9, 0x80, 0x2d, 0xa4, 0x69, 0x24, - 0x6c, 0xfb, 0xbe, 0xd1, 0x63, 0x7c, 0xc8, 0x86, 0x29, 0xb2, 0xb0, 0xa2, 0xda, 0x50, 0x79, 0x7b, 0x3d, 0xd6, 0xb7, 0x7d, 0x8d, 0x80, 0x93, 0x81, 0xfb, 0x4c, 0xc2, 0x1e, 0x9b, 0x38, 0x5f, 0x54, - 0xe2, 0x1d, 0x4b, 0x53, 0x8f, 0x42, 0x5d, 0xcd, 0x3b, 0x41, 0xe3, 0xf8, 0xf9, 0x1d, 0xba, 0x59, 0x53, 0x7a, 0xc2, 0x8f, 0x47, 0x02, 0x89, 0xbe, 0x26, 0x90, 0x0d, 0xc9, 0x0b, 0xf8, 0x59, 0x13, - 0xf9, 0xde, 0x42, 0x18, 0x35, 0xaa, 0x08, 0x80, 0x09, 0x2c, 0xd5, 0x53, 0x74, 0xcd, 0x2d, 0xea, 0xd2, 0x09, 0x08, 0x7b, 0x58, 0xc3, 0x07, 0x4b, 0xd6, 0x98, 0x9c, 0xd8, 0xca, 0xbe, 0xde, 0x1b, - 0xd3, 0x65, 0x16, 0x24, 0xac, 0xa2, 0xf4, 0x2b, 0x8c, 0xa8, 0x09, 0x84, 0xf0, 0x57, 0x5e, 0xd7, 0x83, 0x0f, 0xbd, 0xf9, 0x1a, 0x45, 0x79, 0x9c, 0x07, 0x7c, 0x46, 0x8c, 0x95, 0xe9, 0x1c, 0xde, - 0x51, 0x3e, 0x40, 0x52, 0xbc, 0x0a, 0xbd, 0x0e, 0xb9, 0xe5, 0xfa, 0x7e, 0x27, 0x55, 0x43, 0xfb, 0x14, 0x40, 0x45, 0xfe, 0xe2, 0x1a, 0xdd, 0x37, 0x1c, 0x28, 0x2c, 0xeb, 0x61, 0x3e, 0x02, 0x71, - 0x53, 0x89, 0xa8, 0x35, 0x07, 0x1a, 0x92, 0x47, 0x0e, 0x34, 0x07, 0x9d, 0x86, 0xca, 0x73, 0x0e, 0xf4, 0x65, 0x97, 0x8d, 0x67, 0xfb, 0xbc, 0x72, 0x15, 0x85, 0xef, 0x29, 0x9a, 0xae, 0xc9, 0x43, - 0x5d, 0xf1, 0x7a, 0xd2, 0x6a, 0xc8, 0x86, 0xdd, 0x43, 0x02, 0xc6, 0x5c, 0x7f, 0x27, 0xfb, 0x5d, 0x1c, 0xa4, 0xf7, 0x35, 0x07, 0x87, 0x2a, 0xa3, 0xe7, 0x33, 0x72, 0x2b, 0x10, 0x54, 0xea, 0x4e, - 0x41, 0x7b, 0xb2, 0xe0, 0xb6, 0x64, 0x66, 0xa4, 0x53, 0xed, 0x40, 0x39, 0x91, 0x45, 0x73, 0xdb, 0xa2, 0x48, 0x84, 0x3f, 0xb5, 0xf7, 0x1f, 0xa8, 0xbd, 0x5b, 0xc8, 0xed, 0xb5, 0x55, 0x78, 0x1c, - 0x25, 0x3e, 0x6d, 0x7b, 0xe9, 0x9a, 0xa6, 0x49, 0xe2, 0xd8, 0xb9, 0x11, 0x69, 0x37, 0x46, 0x9c, 0xa4, 0xc8, 0x4a, 0xa3, 0xe0, 0xbb, 0xf1, 0xfa, 0x45, 0x31, 0x6d, 0xe8, 0x7e, 0xc8, 0x6a, 0x13, - 0x90, 0xd8, 0x32, 0xb5, 0x68, 0x2a, 0xea, 0x9b, 0xde, 0x52, 0x63, 0xc7, 0x79, 0x2f, 0x22, 0x35, 0x27, 0xe9, 0x65, 0x04, 0x4e, 0x40, 0xfc, 0xc1, 0xc0, 0x36, 0x6a, 0x54, 0x2a, 0xbe, 0x00, 0xee, - 0xba, 0x2b, 0xd4, 0xf1, 0x56, 0xcb, 0x3e, 0x58, 0x57, 0x6b, 0x72, 0xcc, 0xac, 0x8c, 0xc5, 0x18, 0xb3, 0x87, 0x39, 0xa8, 0xd5, 0xd5, 0xa2, 0x3b, 0xd5, 0x24, 0x3c, 0x89, 0x34, 0xa0, 0x8f, 0x7b, - 0x45, 0xa6, 0x64, 0x1a, 0xb4, 0x15, 0xc7, 0xc8, 0x8f, 0x3d, 0xcc, 0xba, 0xea, 0xfb, 0x1d, 0xcd, 0x0d, 0x8d, 0x3f, 0x54, 0xad, 0xbf, 0x53, 0x05, 0x3b, 0x1f, 0xc7, 0x6d, 0x15, 0x3b, 0x29, 0x00, - 0x7d, 0x8d, 0x75, 0x9d, 0x94, 0xc1, 0xd7, 0x03, 0xad, 0xbf, 0x35, 0x33, 0x3d, 0xaf, 0x02, 0x79, 0xac, 0x9a, 0x44, 0x2a, 0xb8, 0xc3, 0x3a, 0xa8, 0x61, 0x57, 0x4f, 0xcd, 0xf5, 0x08, 0x80, 0x54, - 0x9a, 0x9c, 0x8c, 0xac, 0x22, 0x71, 0x7a, 0x59, 0x84, 0xc8, 0xdd, 0x50, 0x8f, 0xf5, 0x7e, 0x5e, 0x4f, 0xc5, 0xbc, 0xde, 0x58, 0x88, 0x38, 0x18, 0x14, 0xe6, 0x7a, 0x34, 0x90, 0xb7, 0x59, 0x92, - 0xb6, 0x0d, 0x54, 0x3d, 0x57, 0x17, 0xbd, 0x40, 0x72, 0xda, 0x84, 0xe3, 0x36, 0x45, 0xdc, 0xcc, 0x3b, 0x47, 0x53, 0xc5, 0x0d, 0x33, 0x57, 0x7f, 0xd7, 0x66, 0x6d, 0x43, 0x4b, 0x5b, 0x8c, 0x03, - 0xad, 0x9d, 0x57, 0x47, 0x64, 0x33, 0x37, 0xff, 0x46, 0x03, 0xbe, 0xb2, 0x7a, 0xf7, 0x4e, 0xf5, 0xcc, 0xbb, 0xe6, 0xb8, 0x89, 0x63, 0x68, 0x61, 0xdc, 0xce, 0x29, 0xc6, 0xa3, 0xb3, 0x4d, 0xa9, - 0x2c, 0x80, 0xd5, 0x90, 0x5b, 0x0e, 0x61, 0xd8, 0xe1, 0x59, 0xb1, 0x57, 0x92, 0xd8, 0x56, 0x26, 0xc8, 0xed, 0xd2, 0xc5, 0x47, 0xa3, 0xfe, 0x6c, 0x3d, 0x4c, 0x26, 0x08, 0x8a, 0x67, 0x4c, 0xe0, - 0x6d, 0x30, 0x20, 0xd9, 0x77, 0xa7, 0x45, 0xe9, 0x67, 0xb8, 0x5b, 0x1e, 0x66, 0xbd, 0x99, 0x9e, 0xef, 0x31, 0x62, 0x2f, 0x4e, 0x44, 0x54, 0x95, 0x8b, 0x1e, 0x99, 0x65, 0x4f, 0x23, 0xf4, 0x9e, - 0xb9, 0x49, 0x5a, 0x41, 0x19, 0x98, 0xbe, 0xae, 0x3e, 0x5c, 0x63, 0x7e, 0x2d, 0x71, 0xe6, 0x9d, 0x6a, 0x03, 0xe5, 0xf9, 0xb8, 0x6d, 0xe2, 0xcc, 0x04, 0xa1, 0x16, 0x32, 0x03, 0x93, 0x50, 0x58, - 0xad, 0x17, 0x04, 0xba, 0xf4, 0x72, 0xbf, 0x27, 0xf4, 0x50, 0xc3, 0x37, 0x44, 0x3a, 0x56, 0x47, 0x1b, 0x65, 0x27, 0x0c, 0xe1, 0x62, 0xda, 0xb7, 0x6a, 0x0b, 0x4d, 0xa5, 0x62, 0x6e, 0xda, 0xbc, - 0xca, 0x9b, 0xd9, 0xc1, 0x34, 0x81, 0xed, 0x5e, 0x04, 0xd6, 0xc4, 0xa2, 0x94, 0x38, 0x71, 0x45, 0x2c, 0x53, 0x43, 0x30, 0x24, 0x57, 0x82, 0x71, 0xb4, 0x1a, 0x3d, 0x5b, 0x63, 0xfe, 0x23, 0xa1, - 0xfc, 0x2e, 0x6f, 0x98, 0x78, 0xa9, 0xa8, 0xfc, 0x2d, 0xe9, 0x1b, 0x50, 0x9b, 0x3c, 0x61, 0xa2, 0x5d, 0x65, 0xf9, 0x6d, 0x5a, 0xa9, 0x34, 0x54, 0xf6, 0xc6, 0x6a, 0x3d, 0x67, 0x76, 0x21, 0xe4, - 0xc6, 0xb2, 0x3b, 0x8d, 0x17, 0xaa, 0xb7, 0xe5, 0x16, 0x26, 0x30, 0xf6, 0x44, 0x2b, 0xf5, 0x1c, 0x9d, 0x99, 0xee, 0x47, 0x39, 0x58, 0x87, 0x5a, 0xe9, 0xf3, 0x06, 0x35, 0xaf, 0xc0, 0x95, 0x1a, - 0xa8, 0x35, 0xde, 0x63, 0xb0, 0xb5, 0xe5, 0x64, 0xe8, 0x62, 0x29, 0xa1, 0x4a, 0x37, 0xa8, 0xa4, 0x02, 0x9c, 0xa3, 0x19, 0xba, 0x7d, 0x86, 0xec, 0x37, 0x31, 0x55, 0x57, 0xb2, 0xf7, 0xfb, 0xdf, - 0xf0, 0xcf, 0x4a, 0x2f, 0x50, 0xe3, 0x4e, 0xa4, 0x79, 0xbf, 0xdf, 0x75, 0xc3, 0x26, 0x85, 0xab, 0xef, 0x3a, 0x7e, 0x5a, 0xbc, 0x37, 0xff, 0x8a, 0x9d, 0xf7, 0xcb, 0x43, 0xd7, 0x0f, 0x63, 0x18, - 0x9b, 0x18, 0xae, 0x87, 0xfe, 0xdf, 0x57, 0x1c, 0x84, 0xa7, 0xa8, 0xb0, 0xce, 0xe9, 0x7f, 0x13, 0xe5, 0xd2, 0x42, 0x1e, 0xa2, 0x71, 0xa8, 0x39, 0xfd, 0x83, 0x34, 0xdc, 0xc4, 0xcb, 0xc2, 0xac, - 0x29, 0x97, 0x99, 0x06, 0x87, 0x9e, 0x8a, 0x85, 0x9a, 0x87, 0x0d, 0x05, 0xf1, 0x50, 0x38, 0x3a, 0x58, 0x1d, 0xba, 0xbb, 0x2d, 0x09, 0xae, 0x57, 0x73, 0xbd, 0x1a, 0x0a, 0xdd, 0x15, 0x4d, 0x10, - 0xd4, 0xbc, 0xa0, 0xa4, 0x9d, 0x40, 0x02, 0xd0, 0x80, 0x24, 0x16, 0x13, 0x49, 0x30, 0x0f, 0x55, 0x97, 0x8d, 0x45, 0x88, 0x80, 0x5d, 0xec, 0x69, 0xa8, 0xf6, 0x37, 0x0e, 0xf9, 0x9b, 0x58, 0xc4, - 0x53, 0x91, 0x92, 0x1b, 0xa6, 0x7f, 0x71, 0xe0, 0x1e, 0x2d, 0x7c, 0xf8, 0x85, 0x3c, 0xd7, 0x3f, 0x20, 0x7c, 0xf5, 0x04, 0x78, 0xf3, 0xf7, 0x47, 0x01, 0x78, 0xba, 0x13, 0xed, 0x5c, 0x43, 0xfd, - 0x6e, 0x67, 0xd4, 0x9f, 0x4f, 0x1d, 0x2e, 0x44, 0x1b, 0x01, 0x38, 0x1d, 0x36, 0x1b, 0xa1, 0xb6, 0x98, 0x3e, 0x70, 0x29, 0x9a, 0x59, 0x63, 0x69, 0x4e, 0x44, 0xb2, 0xee, 0x59, 0xc8, 0x28, 0x58, - 0x06, 0xfd, 0x91, 0x65, 0xae, 0xa6, 0xe5, 0x86, 0x31, 0x4c, 0x7b, 0xcf, 0x40, 0xee, 0x4a, 0xc4, 0x4d, 0x0d, 0x59, 0xc1, 0x50, 0xd1, 0x1f, 0x2d, 0x59, 0x7a, 0x41, 0x09, 0xcc, 0x41, 0x31, 0x56, - 0xf4, 0x61, 0xa5, 0x51, 0xfb, 0xcd, 0xac, 0x46, 0x07, 0x9e, 0x27, 0xdb, 0x5e, 0x77, 0x37, 0x59, 0x67, 0x8a, 0x9c, 0xf4, 0x88, 0xdd, 0xb3, 0x90, 0x93, 0xd6, 0x33, 0x0a, 0x37, 0x34, 0xdc, 0xd2, - 0x35, 0x0a, 0xd5, 0xff, 0xd6, 0x0c, 0x8f, 0xd5, 0xc2, 0x0f, 0x5c, 0xdf, 0x4f, 0x4f, 0xb6, 0xfe, 0x89, 0x3a, 0xf8, 0x9a, 0x29, 0x7e, 0x15, 0x21, 0xf9, 0xfb, 0xdf, 0x6f, 0xe3, 0x21, 0x8f, 0x86, - 0xfa, 0x65, 0xe6, 0x7d, 0x6c, 0xfb, 0x94, 0x74, 0x63, 0xfb, 0x91, 0xd6, 0x89, 0xd5, 0xd4, 0x3c, 0x15, 0x69, 0xfc, 0x3b, 0xfe, 0xf9, 0x61, 0x37, 0xeb, 0x9c, 0xbd, 0x67, 0x97, 0xe8, 0xc2, 0xbf, - 0x7f, 0xdd, 0x3d, 0xff, 0xa3, 0xd6, 0xce, 0xdf, 0xbf, 0xd4, 0xda, 0xf9, 0x1a, 0x9e, 0xf8, 0xf7, 0x2f, 0xe1, 0x89, 0xa9, 0xa9, 0x1a, 0x86, 0x9b, 0xc6, 0xe7, 0xd6, 0xd7, 0xb6, 0x8d, 0xba, 0x8d, - 0x58, 0x79, 0x7f, 0xee, 0xb2, 0x46, 0xf2, 0x38, 0x2f, 0xcd, 0xca, 0x9a, 0x7c, 0xf4, 0xec, 0xfc, 0x71, 0x68, 0xab, 0x78, 0x2c, 0xdd, 0x8f, 0x0a, 0xe3, 0xfd, 0xb9, 0x47, 0x33, 0xea, 0x9f, 0x2f, - 0x8a, 0x5d, 0xd1, 0x3d, 0xf6, 0x8c, 0x8f, 0xb3, 0x66, 0x6e, 0xdd, 0x62, 0x81, 0x6c, 0xa5, 0x1e, 0x28, 0x58, 0x93, 0xb3, 0x22, 0xef, 0xef, 0x94, 0x3d, 0x1f, 0x4e, 0x91, 0x31, 0x94, 0x9a, 0x65, - 0x17, 0x37, 0xa0, 0x3d, 0xa9, 0xca, 0x0a, 0x3a, 0x00, 0x98, 0x20, 0xa0, 0xc0, 0x41, 0x38, 0xac, 0xb3, 0x55, 0x3e, 0xb0, 0x4c, 0x66, 0x37, 0xd1, 0x37, 0x7d, 0x0e, 0xd3, 0x6b, 0x05, 0xa2, 0xa4, - 0x48, 0x08, 0x89, 0xb9, 0x30, 0xf6, 0x81, 0x74, 0xb8, 0x51, 0x99, 0x05, 0xb0, 0x09, 0x01, 0x6f, 0xd8, 0xd2, 0x22, 0xff, 0x85, 0x5d, 0x82, 0xe3, 0x34, 0xd2, 0xcd, 0xec, 0xd4, 0x08, 0x35, 0x1b, - 0xab, 0xdc, 0x3c, 0x5f, 0xe4, 0xae, 0x7f, 0x69, 0x43, 0x6e, 0x37, 0x1c, 0x2b, 0x0a, 0xd7, 0x38, 0xbf, 0x15, 0x7d, 0x61, 0x61, 0x0e, 0x46, 0x7e, 0xfb, 0x3f, 0x10, 0xa8, 0x65, 0xd0, 0xc0, 0x35, - 0x77, 0x6e, 0x97, 0xd3, 0xfe, 0xcc, 0x19, 0xfc, 0x33, 0x67, 0xf0, 0x47, 0x12, 0xf3, 0x67, 0xce, 0x60, 0xab, 0x9c, 0xc1, 0xcf, 0x49, 0x0c, 0xf7, 0xf0, 0x79, 0xad, 0x6a, 0xc7, 0x0d, 0xe5, 0xe3, - 0x58, 0x7b, 0x7d, 0xde, 0xb6, 0x5e, 0x87, 0x24, 0xf5, 0xd8, 0x79, 0xe6, 0x91, 0x6e, 0x01, 0xee, 0x35, 0x3c, 0x1a, 0x6f, 0xf5, 0xac, 0xcf, 0x2f, 0xe2, 0xb8, 0x3f, 0x0b, 0x33, 0x0f, 0xc4, 0x11, - 0x61, 0x25, 0x4b, 0x63, 0x0d, 0xab, 0xe7, 0x78, 0x14, 0x6e, 0xaa, 0x55, 0x1f, 0xad, 0x57, 0x41, 0x20, 0x47, 0x33, 0x5d, 0xb0, 0x06, 0x2c, 0xc0, 0x4a, 0x5c, 0x6c, 0x8d, 0xc1, 0x25, 0x4e, 0x61, - 0xd6, 0xd4, 0x46, 0x29, 0x85, 0x67, 0xd5, 0x9e, 0x3f, 0x7e, 0x36, 0x87, 0x7e, 0x96, 0xf2, 0x11, 0xaa, 0x41, 0x23, 0xde, 0x7f, 0x87, 0x9b, 0xcd, 0x19, 0x7f, 0x3a, 0x22, 0x92, 0x6d, 0x07, 0xc3, - 0xeb, 0x97, 0x3d, 0x72, 0xd6, 0xbd, 0xa0, 0x01, 0xdf, 0xc9, 0xbe, 0x33, 0xe5, 0x78, 0xd2, 0xb8, 0xea, 0x5a, 0xe8, 0x3f, 0x43, 0x38, 0x00, 0x28, 0x5d, 0xac, 0x51, 0x15, 0xa9, 0x66, 0x9a, 0xc2, - 0x0f, 0x8b, 0xa9, 0x12, 0xcb, 0xba, 0xed, 0x0d, 0x8a, 0xc9, 0x12, 0x2c, 0x98, 0x09, 0x58, 0x68, 0xba, 0xd2, 0xef, 0x0a, 0x1b, 0x8d, 0x8b, 0x28, 0xcb, 0xc2, 0x04, 0xea, 0xb0, 0x8a, 0x71, 0xc6, - 0x82, 0x4c, 0x6b, 0x41, 0x15, 0xbd, 0x68, 0x1b, 0xe1, 0x09, 0xd6, 0xdf, 0x93, 0xc6, 0xb6, 0x2b, 0xd8, 0xe2, 0x60, 0x63, 0xd3, 0x99, 0xf8, 0x73, 0x57, 0x5d, 0x14, 0x68, 0x6e, 0x68, 0x1a, 0xc7, - 0xd1, 0xcb, 0x54, 0x1f, 0x7b, 0x33, 0xa1, 0x37, 0xea, 0x05, 0x80, 0x6e, 0x68, 0x37, 0x28, 0xdd, 0x5c, 0x69, 0xba, 0x33, 0xf5, 0x1c, 0xaa, 0xbe, 0x38, 0xc3, 0xa6, 0x92, 0x55, 0x8c, 0x4c, 0xde, - 0x22, 0x75, 0x46, 0x63, 0xa6, 0xa3, 0xfe, 0xc6, 0x19, 0x2f, 0xb8, 0x04, 0x40, 0x76, 0x34, 0x9d, 0x32, 0x7e, 0x20, 0x31, 0xa5, 0x5e, 0xf6, 0x7b, 0x38, 0xc3, 0xc0, 0xbc, 0x32, 0xde, 0xe4, 0x8b, - 0x3e, 0xbd, 0xe0, 0x1c, 0xc3, 0xaf, 0xbb, 0xb5, 0xb0, 0xad, 0xf6, 0x0e, 0xe5, 0x73, 0x46, 0x58, 0x06, 0x53, 0xc1, 0x04, 0x01, 0x5c, 0x37, 0xa2, 0x9e, 0xf1, 0xfa, 0xdc, 0xda, 0x30, 0x7d, 0xf5, - 0x70, 0x0d, 0xd9, 0x29, 0x3a, 0xfe, 0x05, 0x5b, 0xf0, 0x88, 0x6a, 0x1b, 0xf9, 0x0d, 0x02, 0x35, 0x34, 0x1e, 0x2e, 0x89, 0xc0, 0xd0, 0x4b, 0xe3, 0xee, 0x3b, 0xd9, 0x13, 0x63, 0x4e, 0xc7, 0x9d, - 0x13, 0xb1, 0xe7, 0x3c, 0xa9, 0x17, 0xf8, 0x3c, 0x94, 0x87, 0x08, 0xd2, 0x1f, 0x4a, 0x53, 0xe2, 0xe0, 0xcf, 0xd6, 0xd4, 0x00, 0xa3, 0x63, 0x68, 0xd8, 0x13, 0x0e, 0x3b, 0x02, 0xb1, 0x9c, 0xc9, - 0x82, 0x83, 0x80, 0x82, 0x97, 0xe4, 0xee, 0x54, 0x97, 0xd8, 0xc9, 0x20, 0xde, 0xad, 0x66, 0xa5, 0x1a, 0x61, 0x9a, 0xe7, 0x06, 0xf1, 0x18, 0x1c, 0x2c, 0x9c, 0x43, 0x78, 0x10, 0x77, 0xfd, 0xfe, - 0x9e, 0x77, 0xaa, 0xa9, 0xde, 0x93, 0x03, 0xa3, 0xa0, 0x7f, 0x10, 0xdc, 0x07, 0x63, 0xed, 0xa0, 0x8b, 0xa3, 0xd0, 0x0c, 0xf3, 0x8e, 0x19, 0xb8, 0x79, 0xfe, 0x18, 0xc2, 0x97, 0x12, 0xf1, 0xbe, - 0x50, 0x3f, 0x21, 0x79, 0x7b, 0xad, 0xed, 0xf6, 0xf0, 0x92, 0x81, 0x66, 0x26, 0x21, 0x32, 0x40, 0x26, 0xc0, 0x72, 0x95, 0x28, 0x5e, 0xa6, 0x8b, 0x69, 0x91, 0xc6, 0xbd, 0xf9, 0xd0, 0x12, 0x20, - 0xf0, 0xb0, 0x0d, 0x17, 0x6e, 0x48, 0x88, 0x60, 0xca, 0xa1, 0x81, 0x50, 0xe4, 0x7c, 0xb9, 0x4c, 0x59, 0xda, 0x19, 0x15, 0x1a, 0x9a, 0x76, 0xa1, 0x62, 0xa6, 0x01, 0x8b, 0xde, 0x82, 0x29, 0x7a, - 0x90, 0xb8, 0x8d, 0x98, 0x2e, 0xb4, 0x35, 0x2c, 0x35, 0xcf, 0xa4, 0x1f, 0x6f, 0xc5, 0x7a, 0xb3, 0x66, 0x7a, 0x0f, 0x29, 0xe8, 0x45, 0x1d, 0x76, 0x21, 0xdb, 0x40, 0x74, 0x39, 0xe9, 0x40, 0xed, - 0xb4, 0x17, 0xb8, 0x48, 0x4b, 0xcc, 0xc8, 0xaa, 0x83, 0x38, 0x63, 0xac, 0xc8, 0x19, 0xc4, 0x75, 0x37, 0x22, 0xb6, 0x1a, 0x3a, 0xa8, 0xd1, 0x45, 0xba, 0xe4, 0x12, 0x86, 0xc7, 0x53, 0xb9, 0x70, - 0x06, 0x12, 0xa9, 0x3a, 0xb9, 0xaf, 0x6d, 0xc7, 0xe1, 0x6a, 0x5f, 0x21, 0x1a, 0xdb, 0x9f, 0x4a, 0xbe, 0xa7, 0xd2, 0x64, 0x6f, 0xc3, 0xab, 0x1b, 0x85, 0xaa, 0x32, 0xde, 0x88, 0x8c, 0x7e, 0xa9, - 0xed, 0x9c, 0x71, 0x90, 0xbc, 0x80, 0x4d, 0xb4, 0x73, 0x1f, 0xe9, 0x10, 0xe8, 0x0d, 0x7f, 0x49, 0x82, 0x8e, 0x24, 0x1b, 0x4c, 0x8e, 0x07, 0x9d, 0x86, 0xca, 0x73, 0x3c, 0xb6, 0x0a, 0x3a, 0x58, - 0x1e, 0x42, 0x30, 0xa2, 0x6c, 0x6b, 0x3c, 0xf2, 0x43, 0x7f, 0x43, 0xda, 0xe4, 0x3e, 0xc1, 0xec, 0x83, 0x40, 0x08, 0x8b, 0xc2, 0x19, 0xcc, 0xc7, 0xaa, 0x3a, 0xc8, 0xb2, 0x01, 0x83, 0x24, 0x36, - 0xb7, 0x5c, 0x40, 0xf6, 0xdc, 0xce, 0xe5, 0x32, 0x3a, 0x28, 0x13, 0x39, 0xef, 0xd2, 0x1a, 0x61, 0xb0, 0x98, 0x63, 0xe9, 0x5d, 0x63, 0x85, 0xab, 0xe9, 0xae, 0xd4, 0x41, 0x81, 0x0d, 0xd2, 0x1f, - 0x46, 0xd6, 0xb6, 0x72, 0xdb, 0x36, 0x5f, 0xe5, 0x3d, 0xf4, 0xc8, 0xbc, 0xb6, 0x9f, 0xfb, 0x3b, 0xd5, 0x77, 0xdc, 0x3c, 0xb5, 0xf5, 0x26, 0xee, 0x13, 0x6e, 0x4f, 0x44, 0x7c, 0x3a, 0x06, 0xe6, - 0x4e, 0x3d, 0x19, 0x8f, 0x96, 0x5d, 0x0f, 0x5f, 0x90, 0xe0, 0x16, 0xf5, 0xa6, 0x60, 0xb0, 0xe4, 0x4b, 0x0e, 0xe4, 0xcc, 0x21, 0xbc, 0x16, 0x83, 0x51, 0x48, 0xe0, 0x88, 0x3b, 0x67, 0xf1, 0x2d, - 0x26, 0x33, 0x35, 0xdb, 0xf5, 0x01, 0x5c, 0x98, 0x0a, 0x1b, 0xff, 0x20, 0xcb, 0x34, 0xb0, 0x08, 0x56, 0xcb, 0x79, 0x00, 0xf1, 0xe2, 0xb2, 0x8a, 0x39, 0x7c, 0x94, 0xfc, 0x38, 0x52, 0x4d, 0x4f, - 0x4d, 0x35, 0x37, 0x3b, 0xe7, 0xf9, 0xc3, 0x37, 0x66, 0xc9, 0x0b, 0x5d, 0xed, 0x86, 0xf4, 0x11, 0xa2, 0x9b, 0x0b, 0x6d, 0x57, 0x12, 0x0d, 0x7d, 0xdc, 0xdf, 0xa0, 0x5e, 0x08, 0x4d, 0xe3, 0xa1, - 0xba, 0xf1, 0xdc, 0x2c, 0x92, 0x4a, 0x73, 0x3f, 0x1c, 0xad, 0x7a, 0xe3, 0x5a, 0x4d, 0xc8, 0x1a, 0x49, 0x95, 0xf1, 0xde, 0x02, 0xa6, 0x8b, 0xb4, 0x2b, 0xef, 0x8c, 0x80, 0x0f, 0xb2, 0x25, 0x16, - 0x20, 0xbe, 0x3e, 0x89, 0xbc, 0xd4, 0x03, 0xfb, 0xbc, 0x4f, 0x05, 0x3b, 0x7c, 0xb5, 0x9f, 0x06, 0x5b, 0x1a, 0xb0, 0x72, 0x69, 0x37, 0x07, 0xd1, 0xe8, 0x91, 0xc1, 0xf8, 0x1d, 0x4e, 0x51, 0x96, - 0x75, 0xb2, 0x58, 0xad, 0x1e, 0x05, 0xc6, 0x90, 0x2f, 0xc5, 0x03, 0x5c, 0xd1, 0x6d, 0x10, 0x7a, 0x3f, 0x6b, 0x36, 0xdb, 0x6d, 0xe1, 0xda, 0x73, 0x25, 0x6e, 0x3e, 0x1a, 0x2f, 0xe7, 0xab, 0xde, - 0x8c, 0x23, 0x0d, 0x7e, 0x2e, 0x50, 0xe9, 0x4e, 0x13, 0xc2, 0x79, 0x7c, 0xe0, 0x0e, 0xb6, 0xce, 0xf5, 0xf3, 0xb5, 0x17, 0x9b, 0xeb, 0x19, 0x6b, 0x1f, 0xa8, 0xf5, 0x1c, 0x49, 0x37, 0xfa, 0x7e, - 0x33, 0xa1, 0xe4, 0x6c, 0x27, 0x99, 0xa2, 0x4f, 0x08, 0x29, 0x83, 0x0c, 0x48, 0x60, 0x39, 0x4a, 0x55, 0x3b, 0x83, 0x13, 0x18, 0xef, 0x17, 0x86, 0x4e, 0x0e, 0x88, 0x67, 0xae, 0xbd, 0xc7, 0x26, - 0x49, 0xac, 0xe6, 0x4e, 0x67, 0x67, 0x9e, 0x42, 0xae, 0xd1, 0x2f, 0xbe, 0x5d, 0xc7, 0xd4, 0xd4, 0xd0, 0xee, 0x9c, 0xb5, 0xfc, 0xef, 0xff, 0x76, 0xaf, 0x26, 0x56, 0xe5, 0xb8, 0x57, 0x69, 0xb7, - 0x3f, 0xf7, 0xf8, 0xb7, 0x4a, 0xbb, 0x35, 0xcc, 0x93, 0x6f, 0xed, 0x91, 0xb8, 0xff, 0x7c, 0x04, 0x6d, 0x28, 0x36, 0xc1, 0xd9, 0x47, 0x08, 0xe0, 0xe7, 0x2b, 0x8a, 0x70, 0x87, 0x56, 0x13, 0x5d, - 0x64, 0x48, 0x63, 0x17, 0x2e, 0xfb, 0xfd, 0x9e, 0x3e, 0xb1, 0x83, 0x2d, 0xce, 0x0d, 0xb4, 0x81, 0xbe, 0xb7, 0xbf, 0x9b, 0xe1, 0x7d, 0x17, 0x58, 0x8e, 0xbe, 0x21, 0x2f, 0xec, 0xfc, 0x7c, 0x1b, - 0x58, 0xde, 0xd0, 0x78, 0x2e, 0x79, 0x6c, 0xdf, 0xab, 0xb7, 0x5b, 0xda, 0xc5, 0x64, 0xc7, 0x72, 0xc5, 0xd2, 0xad, 0xd3, 0xbe, 0x68, 0x96, 0xb2, 0xbc, 0xe1, 0xf3, 0x90, 0x4d, 0xd6, 0x96, 0x49, - 0xee, 0x61, 0xda, 0xb1, 0x7b, 0x99, 0x2e, 0xd7, 0x84, 0xa2, 0x4d, 0x34, 0x2b, 0x9a, 0x48, 0x93, 0x79, 0x61, 0xcb, 0xe2, 0x81, 0xc9, 0x1d, 0xc2, 0xa2, 0x94, 0x9e, 0xb4, 0x5a, 0x2e, 0x0e, 0x6b, - 0xbe, 0xcf, 0x81, 0xe4, 0xba, 0xc0, 0x72, 0x78, 0xf3, 0xfa, 0x4c, 0x2e, 0xb8, 0xf6, 0x93, 0xb5, 0x11, 0x80, 0x66, 0x65, 0xca, 0xad, 0x1f, 0x0f, 0x7a, 0xaf, 0x78, 0xa1, 0x3e, 0xc8, 0x36, 0x70, - 0x5e, 0x4e, 0x9a, 0x6d, 0xa1, 0x5b, 0xe8, 0xd3, 0x1a, 0x59, 0x00, 0xeb, 0xee, 0x86, 0x44, 0x1d, 0x7a, 0xb9, 0xdc, 0xb9, 0xc0, 0x0c, 0xe8, 0x2a, 0x2a, 0xe2, 0x33, 0x7e, 0x11, 0x52, 0xdd, 0xda, - 0xb5, 0x85, 0xc3, 0x20, 0xcd, 0xd4, 0x3d, 0x30, 0x5e, 0x8a, 0x44, 0x35, 0x5e, 0x63, 0x4a, 0xb4, 0x8e, 0x7b, 0x5b, 0x66, 0x37, 0x70, 0x44, 0xaf, 0xa2, 0x3d, 0x8f, 0x63, 0x77, 0xeb, 0xbd, 0xb3, - 0x85, 0x56, 0xe3, 0x9e, 0xb3, 0xa3, 0xaa, 0x7a, 0x4b, 0xf6, 0x71, 0xfd, 0xd9, 0x62, 0xcd, 0x1f, 0x95, 0xd9, 0x78, 0xf5, 0xb9, 0xdf, 0x2c, 0x8e, 0xbe, 0xa6, 0x4c, 0x3e, 0xd1, 0xbe, 0x05, 0xb7, - 0x59, 0x1e, 0x6d, 0xa9, 0x4e, 0xd6, 0xee, 0x7c, 0x6f, 0xf7, 0xdc, 0x74, 0xb8, 0x82, 0x40, 0x73, 0x28, 0x4c, 0xf5, 0xb0, 0xcf, 0xd0, 0x28, 0x38, 0x1c, 0x29, 0xb4, 0x92, 0x8c, 0xc3, 0x8a, 0xae, - 0xd6, 0x87, 0xb2, 0x34, 0x5c, 0xcc, 0xcf, 0x52, 0x78, 0xcd, 0xce, 0x10, 0x24, 0x74, 0x0c, 0x0b, 0x44, 0x0d, 0x0d, 0xe5, 0x22, 0x45, 0x5f, 0x7a, 0xf2, 0x0a, 0x59, 0x24, 0x56, 0x3d, 0xac, 0x66, - 0x87, 0x98, 0x38, 0x20, 0xfb, 0x0c, 0x0d, 0x83, 0x5f, 0x99, 0xc2, 0x5d, 0x89, 0xe1, 0x29, 0x1e, 0xe3, 0x66, 0x30, 0xbc, 0x5e, 0x1f, 0x7d, 0x6d, 0x6e, 0x07, 0x3d, 0x70, 0xf3, 0xff, 0x70, 0x29, - 0xec, 0xd5, 0x55, 0xd0, 0xcf, 0x8c, 0xbb, 0x69, 0xfc, 0xf8, 0xba, 0x47, 0x93, 0xfd, 0x9f, 0x4b, 0xca, 0x99, 0x26, 0xd8, 0xb9, 0x1c, 0xb5, 0xcd, 0x2a, 0x26, 0x67, 0x60, 0x82, 0xfa, 0x07, 0x05, - 0x98, 0xac, 0xd8, 0x98, 0x9c, 0xd7, 0xc5, 0x3e, 0x1d, 0xa5, 0xd8, 0x78, 0xaa, 0x31, 0x3d, 0xc4, 0x59, 0x93, 0x8c, 0x4c, 0x6e, 0x67, 0xae, 0x8a, 0xa2, 0x90, 0xd0, 0xdf, 0x0f, 0x2d, 0xcc, 0x40, - 0x53, 0xbc, 0x5e, 0xc5, 0xae, 0x3e, 0x47, 0x08, 0x1c, 0xf2, 0x49, 0x76, 0x3e, 0x23, 0xa4, 0x69, 0xb7, 0x16, 0x46, 0x92, 0x8f, 0xce, 0x06, 0x71, 0xb2, 0x70, 0x2b, 0xf4, 0x69, 0x31, 0x92, 0x9f, - 0x31, 0xef, 0x3b, 0x98, 0xaf, 0x5c, 0xc9, 0x7f, 0x64, 0xb7, 0xbb, 0x90, 0x6d, 0x7a, 0xdc, 0xe5, 0xa4, 0x6d, 0x67, 0x3b, 0x18, 0x5d, 0x1d, 0xa7, 0x0d, 0x37, 0x59, 0xe9, 0x12, 0x30, 0xf2, 0xf4, - 0x6a, 0x29, 0x6a, 0x5d, 0x6e, 0xe7, 0x8c, 0x74, 0x2a, 0xb4, 0x67, 0x29, 0x34, 0x55, 0x9d, 0x1e, 0x33, 0x28, 0x39, 0x77, 0x54, 0x51, 0x71, 0xb1, 0x56, 0x35, 0xe4, 0xa0, 0xf8, 0x0e, 0x10, 0xee, - 0xd4, 0x4c, 0x08, 0x95, 0x39, 0xd0, 0x1b, 0xc8, 0xf4, 0x9c, 0x48, 0xa5, 0x18, 0x19, 0xd5, 0x23, 0x67, 0xa4, 0xd4, 0xe5, 0xac, 0x4f, 0x3d, 0x83, 0xf4, 0x71, 0x67, 0x73, 0xb3, 0x8e, 0x9a, 0xda, - 0x45, 0x70, 0x59, 0xbb, 0x6a, 0x7a, 0xd4, 0xcd, 0xd2, 0x88, 0x9b, 0x75, 0x8c, 0xa3, 0x8d, 0x1a, 0x69, 0x9e, 0xa9, 0xe7, 0xef, 0xf7, 0x7c, 0xde, 0x28, 0xe3, 0x92, 0xb2, 0x7c, 0x87, 0xc2, 0xe9, - 0xc9, 0x8e, 0x9b, 0xdd, 0x7f, 0xf8, 0xdc, 0xfc, 0x5e, 0xff, 0xfc, 0x4b, 0x00, 0xd6, 0x69, 0xd3, 0xe6, 0xb7, 0x38, 0x8d, 0xf2, 0x28, 0x3f, 0xc4, 0xe6, 0x9b, 0xe5, 0xab, 0xf6, 0xe5, 0x5e, 0xe4, - 0x8f, 0xec, 0xc8, 0xad, 0x23, 0xb1, 0x1a, 0xbe, 0xbb, 0x8f, 0xc6, 0x73, 0xe8, 0xa5, 0x62, 0x1d, 0x67, 0x9a, 0x17, 0xa9, 0x72, 0xb3, 0x0e, 0xf4, 0xbc, 0x68, 0x07, 0xdc, 0xc9, 0x90, 0x70, 0x0d, - 0xc0, 0x08, 0xd5, 0x03, 0xc8, 0xf9, 0x72, 0x07, 0x48, 0x19, 0xcf, 0x01, 0xa4, 0x3e, 0xdb, 0xd4, 0xb5, 0xf8, 0x43, 0x83, 0xde, 0x30, 0x2d, 0x37, 0x34, 0x3b, 0x71, 0x1a, 0xc5, 0x66, 0x9a, 0xbb, - 0x0f, 0xc3, 0xcc, 0xe0, 0x17, 0x3f, 0xef, 0x13, 0xf5, 0xe6, 0x43, 0x3f, 0x5d, 0x6b, 0x7a, 0x51, 0x0b, 0x13, 0x1f, 0x9d, 0x26, 0xd6, 0x76, 0xec, 0x21, 0xfe, 0xa4, 0x36, 0xa6, 0x0b, 0x8b, 0x52, - 0x86, 0x4a, 0x0f, 0x5c, 0x01, 0x4a, 0x71, 0x00, 0x18, 0x9b, 0x23, 0x2c, 0x98, 0xc0, 0x4c, 0x6a, 0x8c, 0x54, 0xa4, 0x61, 0x87, 0xf1, 0x98, 0x4e, 0x19, 0xce, 0x4c, 0x07, 0xdb, 0x78, 0x8a, 0x11, - 0xc3, 0xed, 0x56, 0xf7, 0xc2, 0x9d, 0x31, 0x9f, 0x4d, 0xbd, 0xf9, 0xae, 0x4b, 0x13, 0xab, 0x3e, 0x43, 0x01, 0xe8, 0x62, 0xec, 0xff, 0x82, 0xa1, 0xf5, 0x55, 0x84, 0xa1, 0x37, 0xf8, 0xe7, 0xcb, - 0x88, 0x37, 0x39, 0xb1, 0xcf, 0xf8, 0xf4, 0x5d, 0x00, 0xe7, 0x2b, 0x46, 0x5a, 0x43, 0xf3, 0x9d, 0x27, 0x46, 0x9b, 0xe5, 0x1c, 0xb8, 0x73, 0xd8, 0x22, 0x5a, 0x5d, 0x1a, 0x6b, 0x83, 0x71, 0x85, - 0x9e, 0xe8, 0xc7, 0x7d, 0x69, 0xa0, 0x60, 0x78, 0x66, 0xc5, 0xf1, 0xf4, 0xc7, 0xc2, 0xf7, 0xc9, 0x71, 0xfb, 0x47, 0x7e, 0xdb, 0x35, 0xe9, 0xe6, 0x13, 0xaf, 0x2f, 0xb4, 0xf9, 0xd2, 0xa3, 0xcc, - 0x29, 0x87, 0x05, 0x47, 0xce, 0xac, 0x2e, 0xac, 0x4e, 0x18, 0x48, 0xda, 0x4f, 0xb0, 0xf1, 0x20, 0x1d, 0xf3, 0xcc, 0xc6, 0x27, 0x7b, 0x46, 0x06, 0x73, 0x74, 0xd0, 0x33, 0xf4, 0x68, 0xa5, 0x56, - 0x9b, 0x70, 0xc2, 0x91, 0x0b, 0xce, 0x89, 0x67, 0x76, 0x5e, 0x0c, 0x87, 0x88, 0x4a, 0xef, 0x6c, 0x52, 0x25, 0xc5, 0x05, 0x06, 0x7b, 0xfb, 0xf9, 0x42, 0x81, 0xc9, 0x18, 0x5b, 0x19, 0x83, 0x70, - 0xca, 0xef, 0xd0, 0xe9, 0x33, 0x99, 0x7b, 0xaa, 0x0c, 0xdb, 0xd5, 0x09, 0x37, 0xcc, 0x5a, 0xf5, 0xed, 0x47, 0x89, 0xcf, 0xf0, 0x4b, 0x51, 0x06, 0x67, 0x9a, 0x0d, 0x9e, 0xcd, 0x51, 0x03, 0x64, - 0x0b, 0x37, 0x4f, 0xba, 0x59, 0xcc, 0x21, 0xcd, 0x02, 0xf0, 0x10, 0x12, 0xa3, 0x30, 0xd3, 0x80, 0xc5, 0x6a, 0x65, 0xcd, 0xac, 0x61, 0xe6, 0x06, 0x02, 0xc6, 0xf7, 0xf2, 0x20, 0x1c, 0xc6, 0x73, - 0x7e, 0x4b, 0x89, 0xf0, 0x92, 0xad, 0xc7, 0xbe, 0x98, 0x72, 0x53, 0xcb, 0x88, 0xb4, 0x94, 0x0a, 0x47, 0x82, 0x90, 0x49, 0xf6, 0x9a, 0x3d, 0x4c, 0xa5, 0xc4, 0x5c, 0x30, 0x62, 0x1d, 0xac, 0x97, - 0xd3, 0x84, 0xac, 0xcb, 0x95, 0xfb, 0xba, 0x0a, 0x3c, 0x57, 0x1f, 0xb9, 0x37, 0xed, 0x4e, 0xd5, 0x38, 0x6e, 0x7e, 0x79, 0xab, 0xe9, 0x93, 0x6b, 0x59, 0x0f, 0x00, 0xc6, 0x5e, 0x0a, 0xaa, 0x3e, - 0x12, 0x3c, 0xa2, 0xeb, 0x5a, 0x56, 0x07, 0x6b, 0x17, 0x4a, 0x8d, 0x53, 0x7e, 0xb0, 0x1f, 0x2f, 0x68, 0x8c, 0x99, 0x1d, 0x26, 0x35, 0xc0, 0xf3, 0xd3, 0x65, 0xed, 0x0b, 0xbd, 0xd8, 0x86, 0xba, - 0xfd, 0x15, 0x60, 0x96, 0x84, 0x32, 0x35, 0xd1, 0x72, 0xe4, 0x3a, 0xb6, 0xb1, 0xaf, 0x6d, 0xbd, 0x52, 0xa8, 0x55, 0xd4, 0xeb, 0xcd, 0x03, 0x7a, 0xc2, 0x2a, 0x83, 0xee, 0x24, 0x48, 0xac, 0x55, - 0x34, 0x9b, 0x4e, 0xc7, 0x71, 0x9e, 0x0f, 0xb7, 0xf2, 0x6a, 0x40, 0x14, 0xdc, 0x96, 0xfc, 0xe5, 0xc9, 0x12, 0xda, 0x6e, 0xfa, 0xe9, 0xa6, 0x97, 0x10, 0xa0, 0xfb, 0xd3, 0xf8, 0x57, 0x4c, 0xdf, - 0x0b, 0xd1, 0x06, 0xc7, 0xd3, 0x61, 0x93, 0xe2, 0xd3, 0xc2, 0x52, 0x5b, 0xef, 0xd2, 0x75, 0xdc, 0x1d, 0x48, 0xd8, 0x78, 0x63, 0x8d, 0x07, 0xdb, 0x5a, 0x98, 0x04, 0x72, 0x31, 0x58, 0xb9, 0xf0, - 0x72, 0xdd, 0xb7, 0xaa, 0x0c, 0x25, 0xc9, 0xb0, 0xab, 0xeb, 0x38, 0x0e, 0xe6, 0x1a, 0xc1, 0x15, 0xc9, 0xa1, 0x4f, 0xc4, 0xba, 0x88, 0xd3, 0x9a, 0xcb, 0xf7, 0x32, 0x47, 0xe5, 0xe2, 0x6d, 0xb7, - 0x24, 0x22, 0x75, 0x91, 0x22, 0x1b, 0x96, 0x73, 0x8d, 0x41, 0x30, 0xad, 0x8c, 0xfa, 0x73, 0x10, 0xcc, 0x0f, 0xc4, 0xb4, 0x71, 0x23, 0x5d, 0x82, 0x0e, 0xce, 0x81, 0xa1, 0x17, 0x50, 0xdb, 0xb2, - 0xa2, 0x95, 0x1b, 0x28, 0xd2, 0xf3, 0xd4, 0x0d, 0x1f, 0xf9, 0x00, 0x5e, 0xdb, 0x73, 0xe4, 0x42, 0xf4, 0xc8, 0x86, 0xf3, 0x61, 0xdb, 0x3d, 0x46, 0x0e, 0x0b, 0x40, 0xc4, 0x5d, 0xd4, 0x61, 0x2c, - 0x72, 0xc0, 0xec, 0x0c, 0x6c, 0x3c, 0xa0, 0x54, 0xd2, 0x64, 0x66, 0xb3, 0xf5, 0x6c, 0x30, 0x91, 0xd5, 0x5e, 0x55, 0x6d, 0xd7, 0x4b, 0xd7, 0x1b, 0x6e, 0xa7, 0x64, 0x9d, 0xfa, 0x5b, 0x6e, 0x0a, - 0x31, 0xfd, 0x0d, 0xef, 0x79, 0xf3, 0xb5, 0xbf, 0x56, 0x60, 0xc9, 0x26, 0x97, 0xaa, 0x61, 0x28, 0xe6, 0x90, 0x0b, 0xdc, 0xae, 0xd7, 0x47, 0xf9, 0x20, 0x71, 0xc5, 0xa7, 0x65, 0x40, 0xbf, 0xd9, - 0x76, 0x24, 0xbb, 0xdd, 0x97, 0xfc, 0xe7, 0x5a, 0x9e, 0x68, 0xb9, 0x34, 0x6e, 0x44, 0xb9, 0x6b, 0x87, 0xd1, 0x43, 0x17, 0x34, 0xf4, 0x52, 0xc0, 0xec, 0x3b, 0xd5, 0x86, 0x15, 0xe7, 0xe3, 0xc6, - 0xd2, 0x6c, 0x31, 0xbc, 0x2c, 0x07, 0x83, 0xc1, 0xda, 0x5a, 0xa8, 0x45, 0x91, 0xa9, 0xab, 0x11, 0x0b, 0x50, 0x96, 0xbd, 0x02, 0x66, 0xab, 0x92, 0xd9, 0xec, 0x58, 0x39, 0x58, 0x95, 0x64, 0xb6, - 0x23, 0xc2, 0xc8, 0xe3, 0x14, 0xa5, 0x2c, 0x84, 0xe5, 0x6c, 0xb0, 0x3c, 0x40, 0xca, 0x0e, 0x5b, 0xc6, 0xbc, 0xc8, 0x11, 0x3d, 0xce, 0x5b, 0x40, 0x5e, 0xcc, 0x54, 0x3a, 0xcd, 0x96, 0x3c, 0x66, - 0x46, 0x56, 0x79, 0xa8, 0x19, 0x5d, 0xe2, 0x5e, 0xe7, 0x45, 0xe0, 0x86, 0xee, 0x47, 0x8e, 0x21, 0x7a, 0xbf, 0x22, 0xe1, 0x97, 0xed, 0x39, 0x4e, 0x9f, 0xdc, 0xe0, 0xa4, 0xb9, 0x21, 0x78, 0x39, - 0x7d, 0xce, 0x10, 0x33, 0x88, 0xbc, 0xef, 0x4b, 0xb0, 0x52, 0x2f, 0x75, 0x8e, 0x2b, 0xba, 0x60, 0xe7, 0xfa, 0xac, 0x43, 0xb5, 0xeb, 0x22, 0xd3, 0x85, 0xb7, 0xad, 0xf5, 0xf5, 0x4c, 0xa0, 0x21, - 0xb3, 0xa2, 0xf9, 0xb8, 0x86, 0xa6, 0xfb, 0x78, 0xdb, 0x2f, 0x2b, 0x9b, 0x38, 0x78, 0x07, 0x78, 0x36, 0x40, 0xf7, 0xb9, 0x19, 0x25, 0x35, 0x81, 0x61, 0x2b, 0x36, 0x02, 0xa5, 0xb9, 0x1d, 0xa6, - 0x30, 0x38, 0x18, 0xe4, 0x80, 0xab, 0xa3, 0xee, 0x48, 0xae, 0x45, 0xaa, 0x57, 0xa0, 0xb2, 0x31, 0x85, 0xb1, 0x85, 0x5a, 0x85, 0xab, 0x65, 0x30, 0xe8, 0x11, 0x3f, 0x0e, 0x57, 0x30, 0xc3, 0x66, - 0x11, 0xe3, 0xf1, 0x7a, 0x12, 0xfa, 0x42, 0x25, 0xaf, 0x0b, 0xd1, 0x23, 0x30, 0xe7, 0xc3, 0x4e, 0x43, 0xe9, 0x39, 0x2a, 0x07, 0x6f, 0x16, 0xce, 0x53, 0x14, 0xc6, 0xc1, 0xbe, 0xb7, 0xc0, 0xea, - 0x61, 0xb6, 0xdc, 0x6f, 0xed, 0x62, 0xbb, 0x9c, 0xcf, 0x11, 0x13, 0x9e, 0x8d, 0x31, 0x83, 0xec, 0x91, 0x8a, 0x30, 0x71, 0x0f, 0x5b, 0x56, 0xd7, 0xfa, 0x8c, 0x2b, 0x4f, 0x0f, 0x43, 0x0e, 0x40, - 0xaa, 0x32, 0x40, 0x2a, 0x02, 0x88, 0x15, 0x30, 0x32, 0xa6, 0x34, 0xa9, 0x4b, 0x3b, 0xcf, 0xc9, 0xe6, 0x9a, 0x9f, 0x57, 0x8c, 0x90, 0x4e, 0x7e, 0xc1, 0xcc, 0xb8, 0x29, 0x5c, 0xfe, 0xda, 0x4e, - 0xee, 0x7f, 0xfd, 0x0b, 0xd5, 0x6a, 0x6d, 0xcf, 0x4c, 0xd3, 0x28, 0xed, 0x3c, 0x14, 0x53, 0xf8, 0xa5, 0x7a, 0xde, 0x17, 0xa2, 0x47, 0x56, 0x9c, 0x0f, 0x9b, 0xf5, 0xf3, 0x16, 0xe3, 0x06, 0x69, - 0xf4, 0xf9, 0x59, 0x90, 0x98, 0xfd, 0x45, 0x2f, 0x47, 0x14, 0x26, 0x63, 0x53, 0x37, 0x4a, 0xc7, 0x61, 0x88, 0x2a, 0x48, 0xec, 0x01, 0x96, 0xd1, 0xdd, 0x05, 0x43, 0x42, 0x8c, 0xd6, 0x15, 0x06, - 0x82, 0xdc, 0x04, 0x70, 0xf5, 0x1e, 0x63, 0xe9, 0xd0, 0x92, 0x4c, 0x46, 0xac, 0x9b, 0x25, 0xa9, 0x9c, 0x8d, 0x65, 0xaf, 0xc2, 0xac, 0x59, 0xff, 0x80, 0xc4, 0xeb, 0xae, 0x90, 0x2c, 0x72, 0x8e, - 0xfa, 0x85, 0x7d, 0x4b, 0x1a, 0xa7, 0x47, 0xaa, 0x1e, 0xdc, 0xec, 0x34, 0x72, 0x40, 0x2d, 0x53, 0x0b, 0xcd, 0xac, 0x73, 0xd9, 0x93, 0xe9, 0xf1, 0xd4, 0xb8, 0xfb, 0x42, 0x91, 0xa7, 0x2b, 0xc2, - 0x47, 0x74, 0x3f, 0xce, 0x3a, 0x27, 0x82, 0xcf, 0x11, 0xa6, 0x55, 0x64, 0x80, 0x00, 0x92, 0x81, 0x6a, 0xc4, 0x6e, 0xdf, 0x5b, 0x8e, 0xe5, 0x3e, 0x26, 0xab, 0x6b, 0x82, 0xd4, 0x6b, 0x66, 0x72, - 0xa0, 0x4b, 0xb4, 0x26, 0x57, 0x82, 0xb3, 0x95, 0x96, 0x38, 0xb4, 0x65, 0xf6, 0x80, 0xa6, 0x65, 0x5b, 0xa5, 0xbb, 0x17, 0xe7, 0x98, 0x3f, 0x9d, 0xa9, 0xb5, 0x39, 0x2f, 0xfa, 0xfe, 0x41, 0xdb, - 0x0c, 0xa1, 0x15, 0x36, 0x4d, 0x8b, 0x79, 0x94, 0x91, 0xc9, 0x32, 0xc2, 0xad, 0xd7, 0x8d, 0x95, 0xeb, 0x2c, 0xc3, 0x4b, 0xbe, 0xdc, 0xff, 0xfa, 0x68, 0x36, 0xb3, 0x4e, 0x1e, 0x75, 0xe2, 0xd4, - 0x0d, 0xdc, 0x66, 0x83, 0xb9, 0x7f, 0x7b, 0xcf, 0xef, 0xbc, 0xba, 0xe9, 0xc5, 0xd4, 0xbc, 0x3b, 0xb7, 0x64, 0x87, 0x40, 0x8b, 0xfc, 0x8e, 0x71, 0xde, 0x97, 0xee, 0xcc, 0xab, 0xaf, 0x21, 0xa3, - 0x8e, 0xfa, 0x31, 0x7d, 0x47, 0x3f, 0x35, 0x9c, 0x89, 0x3c, 0xb8, 0xe1, 0xc8, 0x92, 0x34, 0x54, 0xfd, 0x4e, 0xe6, 0x47, 0xf9, 0x83, 0x5b, 0xb2, 0xce, 0x11, 0x15, 0x55, 0xf3, 0x3f, 0xbe, 0xf7, - 0xb3, 0xa3, 0x2d, 0x34, 0x6d, 0xf5, 0x08, 0x48, 0xa7, 0x36, 0xd3, 0xe8, 0xf7, 0xbb, 0xd1, 0xaa, 0x9f, 0x5c, 0x6d, 0xf0, 0x17, 0x1a, 0x99, 0xa3, 0xa6, 0x97, 0x72, 0x60, 0x9d, 0xf7, 0x74, 0xed, - 0x3b, 0x4c, 0x38, 0xde, 0xfb, 0x11, 0x16, 0x7b, 0x6c, 0x26, 0x3f, 0x35, 0x57, 0xa6, 0xba, 0x4b, 0x4d, 0xeb, 0xfe, 0xe3, 0x17, 0xaf, 0x5e, 0x98, 0xc5, 0x1f, 0x7e, 0xc1, 0x9b, 0x30, 0xe5, 0x36, - 0xbe, 0xbd, 0xd3, 0x0d, 0x6f, 0x6a, 0x96, 0xb9, 0x76, 0xf8, 0x3e, 0x2e, 0xde, 0xbc, 0xe8, 0xf4, 0x23, 0xaf, 0xdc, 0x7f, 0x79, 0xea, 0x06, 0xe6, 0x95, 0x68, 0x61, 0x4f, 0xef, 0xce, 0x72, 0x35, - 0xcd, 0xef, 0xdf, 0x5f, 0x84, 0x5a, 0xb4, 0xff, 0x22, 0x8a, 0x2f, 0x2d, 0xb2, 0xfe, 0x73, 0x2a, 0x9a, 0x5d, 0x8f, 0x1d, 0x37, 0x0d, 0x57, 0x92, 0xf2, 0xc8, 0x8b, 0xf7, 0xf3, 0x49, 0xff, 0x85, - 0x28, 0xd8, 0x79, 0x3f, 0x6c, 0x1b, 0x54, 0xb9, 0x2b, 0x25, 0x63, 0xcf, 0x65, 0x7b, 0xc5, 0x73, 0xea, 0xe5, 0x06, 0x22, 0x95, 0x70, 0x72, 0x30, 0xea, 0x05, 0x2c, 0x2f, 0x41, 0x79, 0xe4, 0xcb, - 0x4b, 0x9e, 0xdf, 0x62, 0xdb, 0xc9, 0x84, 0x22, 0x4d, 0x94, 0x8c, 0x96, 0x34, 0xd6, 0xe5, 0xac, 0xdd, 0x24, 0xb1, 0x0f, 0xc0, 0xca, 0xeb, 0x47, 0x7a, 0x54, 0x1d, 0x90, 0xae, 0x3e, 0x2e, 0xf5, - 0x85, 0x5b, 0x00, 0xbb, 0x61, 0x49, 0x22, 0x94, 0x27, 0xcb, 0xab, 0xd7, 0x95, 0xc0, 0x93, 0x21, 0xea, 0xd8, 0xe5, 0xf3, 0xe8, 0x24, 0x4d, 0xb9, 0x6a, 0x5f, 0x0d, 0x18, 0xff, 0xdd, 0xe5, 0xe2, - 0x4b, 0xc7, 0x7d, 0x20, 0x1d, 0xaf, 0xac, 0xf5, 0xde, 0xd2, 0x06, 0x3b, 0x9f, 0x2e, 0x74, 0xe0, 0x96, 0x79, 0x08, 0x7c, 0x84, 0xd4, 0x14, 0xa4, 0xad, 0x86, 0xe5, 0xc8, 0x8f, 0x78, 0x60, 0x5b, - 0x4b, 0x41, 0xac, 0xac, 0x44, 0x93, 0x22, 0x81, 0x84, 0x5e, 0x04, 0xcc, 0x72, 0xac, 0x70, 0x6b, 0x7b, 0xdf, 0xd5, 0x0b, 0x60, 0xcc, 0xa5, 0x1b, 0x44, 0xe1, 0x78, 0x10, 0xcd, 0xa7, 0x07, 0xc0, - 0xde, 0x68, 0x4a, 0x4f, 0x5e, 0x0d, 0x32, 0x64, 0x4a, 0x6d, 0x8d, 0xbd, 0xa0, 0x09, 0x0e, 0xb9, 0xa1, 0x73, 0x37, 0xe8, 0x6e, 0xa1, 0x67, 0xb2, 0xf2, 0x9f, 0xc1, 0x92, 0x4f, 0x6a, 0xef, 0x3e, - 0xf4, 0xaf, 0x94, 0x21, 0xfc, 0x44, 0xfb, 0x64, 0x46, 0x5c, 0x5f, 0x69, 0xd6, 0xdb, 0x5b, 0xb8, 0x3d, 0x44, 0x56, 0xf0, 0x7d, 0x5b, 0x19, 0xe5, 0xea, 0x32, 0xea, 0x06, 0xee, 0x96, 0xd1, 0x27, - 0xac, 0x23, 0x2f, 0x55, 0x7e, 0xe6, 0x8d, 0xfa, 0xe8, 0x7c, 0x9b, 0xc1, 0x2b, 0xd7, 0xe0, 0x48, 0xba, 0x72, 0x7b, 0x1e, 0xbc, 0xdb, 0xee, 0xc7, 0xa6, 0x28, 0xeb, 0xf9, 0x84, 0x36, 0x6b, 0x5a, - 0xe0, 0x71, 0x65, 0x2c, 0xf1, 0x90, 0x8d, 0x0c, 0xed, 0x79, 0x48, 0x8c, 0x2b, 0x06, 0x1b, 0xca, 0x94, 0x2b, 0xc5, 0x8f, 0x4a, 0x80, 0xb7, 0xe8, 0xa6, 0x5f, 0xd5, 0xe6, 0x57, 0x95, 0xd7, 0x66, - 0x7d, 0xea, 0xa4, 0xbe, 0xaf, 0xfa, 0xfa, 0x7f, 0x9b, 0x6e, 0xac, 0xab, 0xf1, 0x65, 0xd3, 0xbc, 0xd3, 0x80, 0xfb, 0x5d, 0xbd, 0xd6, 0x57, 0x6c, 0xcf, 0xaf, 0x2f, 0x68, 0xa4, 0xe7, 0xeb, 0xe5, - 0x36, 0xc5, 0x45, 0xe1, 0xce, 0x00, 0xe1, 0xe9, 0x95, 0x3b, 0x10, 0x93, 0x19, 0x88, 0xa4, 0x5e, 0x71, 0xa8, 0xab, 0x21, 0x7d, 0x70, 0xa6, 0x13, 0x27, 0xbf, 0xbf, 0x20, 0xd5, 0x96, 0x01, 0xd0, - 0x1b, 0xd5, 0xca, 0x6f, 0x72, 0xde, 0x75, 0xf8, 0x3e, 0x46, 0xe4, 0x1b, 0x42, 0xbc, 0x30, 0xae, 0x9d, 0x77, 0x73, 0xee, 0x9c, 0x0f, 0x3a, 0x27, 0x32, 0xcf, 0x3b, 0x13, 0x26, 0xc1, 0xae, 0x29, - 0x59, 0x38, 0x02, 0xba, 0xb5, 0xae, 0xf4, 0x48, 0xda, 0x9f, 0x1c, 0x70, 0xa2, 0x18, 0xf2, 0x3c, 0x37, 0x91, 0x49, 0x6c, 0x5b, 0xd7, 0xc8, 0xb0, 0x44, 0x7c, 0x62, 0xc7, 0xa9, 0xdb, 0xb2, 0x57, - 0x74, 0xf7, 0x40, 0x35, 0x65, 0x70, 0x43, 0xa1, 0xd3, 0xd5, 0x84, 0x5a, 0x6c, 0x07, 0x9b, 0xc5, 0x76, 0x85, 0x6c, 0x69, 0x9b, 0x84, 0xfa, 0xfa, 0x1a, 0xdf, 0xe2, 0xe1, 0x60, 0x30, 0x1b, 0x3e, - 0x1b, 0xc7, 0x1e, 0x77, 0xa6, 0x7f, 0xd7, 0x54, 0xcd, 0xf4, 0x41, 0x3d, 0x32, 0xcc, 0x8e, 0x95, 0x9e, 0x33, 0x3c, 0xc8, 0xe3, 0x98, 0x0c, 0xdf, 0xf4, 0x97, 0x7f, 0x3f, 0x7f, 0xef, 0xe9, 0x5f, - 0x7a, 0x32, 0xad, 0xbf, 0xec, 0xbf, 0x78, 0xc9, 0xd4, 0x23, 0x4e, 0x2b, 0xf2, 0x57, 0x2d, 0x97, 0x3c, 0xef, 0x3b, 0x09, 0xec, 0xb7, 0x51, 0x83, 0xa7, 0x52, 0x45, 0x37, 0x8a, 0xf7, 0xb6, 0x06, - 0xe9, 0xcd, 0x0b, 0xaf, 0x5c, 0x93, 0x77, 0xf6, 0xa7, 0xb8, 0xf2, 0x3f, 0x1c, 0xed, 0x66, 0xf4, 0xaa, 0x2f, 0xfc, 0xf6, 0xbe, 0xdb, 0x76, 0xa6, 0x47, 0x67, 0x0f, 0x2a, 0xfe, 0xd9, 0x14, 0x3d, - 0xdf, 0x71, 0xed, 0xde, 0xfb, 0x14, 0x79, 0xf2, 0xfd, 0x8e, 0xdd, 0x37, 0x37, 0xc6, 0xa9, 0x69, 0x9e, 0xbf, 0x0f, 0xfd, 0xfc, 0x9a, 0xa4, 0x30, 0xd3, 0xc3, 0x79, 0x24, 0xfa, 0xb2, 0x27, 0xf8, - 0x67, 0xef, 0xe2, 0x55, 0xa3, 0xe5, 0xfa, 0x66, 0xc7, 0x0c, 0xf3, 0xf4, 0xd0, 0xd1, 0x55, 0xdd, 0x31, 0xcf, 0xe0, 0x43, 0xf7, 0xa7, 0x4d, 0x4d, 0x79, 0x6f, 0xa3, 0xa3, 0xf9, 0xaa, 0xbe, 0xeb, - 0xe4, 0x97, 0x9f, 0xf3, 0x65, 0x68, 0xfc, 0x94, 0xbc, 0x7b, 0xde, 0x40, 0xf9, 0xd3, 0x0d, 0xea, 0x65, 0xde, 0x73, 0xca, 0xab, 0xbd, 0x1e, 0x59, 0x2f, 0x1e, 0xca, 0x13, 0xbb, 0x88, 0x9b, 0xb6, - 0x20, 0x8e, 0xd2, 0xbc, 0x63, 0xa5, 0x66, 0xf6, 0x60, 0x4b, 0x11, 0x37, 0x28, 0xd2, 0xa0, 0x48, 0x1d, 0xf5, 0x7d, 0x22, 0xfe, 0x75, 0x70, 0xbf, 0x64, 0x05, 0x7f, 0x15, 0x25, 0x2f, 0xeb, 0x1c, - 0xd4, 0xe0, 0x3d, 0x51, 0x10, 0xbd, 0x97, 0x29, 0xf8, 0x69, 0xcb, 0xd1, 0x4e, 0xe5, 0xe6, 0x4e, 0x54, 0x9c, 0x36, 0x24, 0xbd, 0x6c, 0x41, 0xfa, 0x05, 0x13, 0xdf, 0x2c, 0xc3, 0xfb, 0x22, 0xef, - 0x47, 0xc6, 0xe5, 0xb7, 0x62, 0x6f, 0x30, 0xf9, 0x86, 0xdc, 0x56, 0x6e, 0xb8, 0xe3, 0x8f, 0xbc, 0x6a, 0x0e, 0xd5, 0xbc, 0x48, 0x55, 0xbf, 0xa3, 0x47, 0xc1, 0x11, 0xf0, 0xfb, 0x12, 0x70, 0x4e, - 0x35, 0xce, 0xcf, 0x79, 0xfe, 0xd0, 0x5b, 0xf7, 0x4b, 0x8e, 0xab, 0x9d, 0x5e, 0x92, 0x5c, 0xbf, 0x08, 0xde, 0x69, 0x9c, 0x8e, 0x2f, 0x90, 0x7c, 0x0a, 0x35, 0x35, 0x83, 0xd2, 0xbc, 0x94, 0x0f, - 0xf8, 0x34, 0xd9, 0x3e, 0x22, 0x14, 0x77, 0xd4, 0x30, 0x73, 0xdf, 0xa5, 0x0a, 0xfa, 0xda, 0xde, 0x60, 0xaa, 0x47, 0xc1, 0x47, 0xb8, 0xc8, 0x97, 0x97, 0xe4, 0xef, 0x9a, 0x9a, 0xf8, 0xfc, 0xfd, - 0xb9, 0xb9, 0xcf, 0x3b, 0x1f, 0xed, 0xd0, 0xdb, 0xa7, 0xc9, 0x62, 0x49, 0x35, 0xd0, 0x1c, 0xa5, 0xfc, 0x43, 0xbe, 0x91, 0x66, 0x1e, 0x7d, 0xbe, 0xe9, 0x1b, 0xaf, 0xee, 0xfb, 0xa8, 0xdf, 0x38, - 0x75, 0x4f, 0x67, 0x6f, 0x5e, 0xf6, 0x43, 0x35, 0xdf, 0x6c, 0x9e, 0x8f, 0xbc, 0x6f, 0x9e, 0xff, 0x60, 0x2b, 0xfe, 0x36, 0x4a, 0xff, 0xce, 0xce, 0xf8, 0xad, 0xb7, 0xc3, 0x3f, 0x8f, 0x33, 0x7a, - 0x14, 0x5a, 0xae, 0xdd, 0x89, 0x53, 0x33, 0xcf, 0xdd, 0x87, 0x7e, 0x55, 0xea, 0xa5, 0xf4, 0x98, 0xfb, 0xaf, 0xf8, 0x50, 0x70, 0x9f, 0x1a, 0x3a, 0x54, 0xbb, 0x44, 0x19, 0xc6, 0x56, 0x8a, 0xc9, - 0x72, 0x61, 0x8e, 0xeb, 0xd2, 0x9f, 0x80, 0xab, 0xa5, 0xb7, 0x07, 0xb7, 0x1a, 0x49, 0x91, 0x2b, 0x11, 0x21, 0xa4, 0x25, 0x6a, 0x0f, 0x3c, 0x1a, 0x75, 0xdd, 0x7e, 0x69, 0x64, 0x31, 0x88, 0x68, - 0x53, 0x6b, 0x35, 0x5c, 0x2f, 0x57, 0x73, 0x32, 0xf7, 0xf6, 0xb9, 0xb7, 0x80, 0x4c, 0x80, 0x9f, 0x63, 0x50, 0x57, 0x9f, 0xfb, 0xf3, 0x72, 0xb6, 0x13, 0xfd, 0xa8, 0xa6, 0xd8, 0x2e, 0x6c, 0x3e, - 0x5b, 0x20, 0x78, 0x20, 0x0b, 0x77, 0xf0, 0x6b, 0x64, 0x43, 0xf7, 0xdd, 0xbb, 0x82, 0xf1, 0xfd, 0xc6, 0xb3, 0x1f, 0xf2, 0xd5, 0x3e, 0xb9, 0xf1, 0xfc, 0x3b, 0x4e, 0x39, 0xeb, 0xb9, 0x99, 0x9e, - 0x7e, 0xca, 0xe1, 0x01, 0x23, 0xb1, 0x97, 0x62, 0xac, 0x1f, 0xbc, 0xe3, 0x83, 0x93, 0x9f, 0x5b, 0x9a, 0x22, 0x29, 0x2d, 0x58, 0x39, 0xcc, 0x96, 0x72, 0x3e, 0xd8, 0xf7, 0x61, 0x27, 0xe5, 0x09, - 0x7f, 0xba, 0x76, 0x17, 0x3e, 0xbc, 0xd6, 0x06, 0xaa, 0x3b, 0x87, 0x60, 0x53, 0x26, 0x76, 0xf5, 0xa1, 0x32, 0xb6, 0xf0, 0x12, 0xa8, 0x27, 0x3a, 0x34, 0x9d, 0x03, 0x61, 0xd5, 0x0b, 0x97, 0xee, - 0xa2, 0xbb, 0x1c, 0x52, 0x43, 0x55, 0x90, 0x97, 0x8e, 0x6c, 0x8a, 0xa3, 0x89, 0xcf, 0xf6, 0xd6, 0x43, 0x6d, 0x33, 0x9c, 0x31, 0x3c, 0xb6, 0x1d, 0x69, 0xcc, 0xb3, 0x70, 0x87, 0x6f, 0x4c, 0x97, - 0xfc, 0x10, 0x5f, 0x1b, 0x77, 0xe7, 0x31, 0xec, 0xc6, 0xc5, 0xf6, 0x69, 0x2b, 0xcb, 0x53, 0x3e, 0xf7, 0xcd, 0x30, 0x77, 0x6d, 0x98, 0xdc, 0x57, 0xee, 0x69, 0xe1, 0x9b, 0x1d, 0x23, 0xd2, 0x3f, - 0xfc, 0x55, 0xf8, 0xad, 0x02, 0xb0, 0x6f, 0x3c, 0x81, 0x5f, 0x94, 0x52, 0xec, 0x17, 0xe9, 0xfd, 0x96, 0xb3, 0x29, 0x5d, 0xb9, 0x46, 0xee, 0xbc, 0xff, 0xba, 0xdb, 0x3b, 0x2e, 0x75, 0x5e, 0x9c, - 0x43, 0x6c, 0xa6, 0xbe, 0x1b, 0xee, 0xae, 0x87, 0xf9, 0x2f, 0x02, 0xfb, 0x2c, 0x09, 0xef, 0xc5, 0x91, 0xeb, 0x0f, 0x88, 0x70, 0x3d, 0x63, 0x19, 0xfb, 0x85, 0xed, 0x86, 0xcf, 0x06, 0x30, 0xf4, - 0xa5, 0x0d, 0x38, 0xee, 0xbf, 0xe2, 0x43, 0xec, 0x3f, 0x35, 0x74, 0xd0, 0x76, 0x9b, 0x73, 0x2c, 0xb9, 0x31, 0x91, 0x8e, 0x64, 0x62, 0x38, 0x5b, 0x58, 0xba, 0x10, 0xe1, 0x18, 0xee, 0xb9, 0xaa, - 0x50, 0x31, 0x24, 0x04, 0x17, 0xf4, 0x30, 0x47, 0x40, 0x43, 0x22, 0xd7, 0x61, 0x5f, 0x8c, 0x06, 0xec, 0xca, 0x87, 0xc1, 0xde, 0x34, 0x31, 0xe8, 0x19, 0x13, 0x54, 0x4b, 0x35, 0x49, 0x44, 0x0c, - 0x57, 0x37, 0x71, 0x9a, 0xc9, 0x83, 0x7a, 0xa1, 0xa2, 0xdd, 0xc9, 0x10, 0x9e, 0x1f, 0x0a, 0x89, 0xd9, 0xef, 0x9f, 0x0d, 0x60, 0xdf, 0x2c, 0xfa, 0x5f, 0x7e, 0xbe, 0xdf, 0x78, 0x98, 0x3b, 0x8e, - 0xe9, 0xc7, 0x66, 0xfa, 0xe1, 0x84, 0xfe, 0xb9, 0x54, 0x10, 0xf7, 0x9f, 0x6a, 0x3f, 0xf8, 0x7d, 0x31, 0x10, 0xaf, 0xc7, 0xd7, 0xbf, 0xfe, 0x05, 0x3e, 0x1a, 0x62, 0x2d, 0x5e, 0xf0, 0xb5, 0x4c, - 0xfd, 0x53, 0xad, 0xd7, 0xdc, 0xf5, 0x0b, 0xe5, 0xea, 0xef, 0xf4, 0xf0, 0x47, 0x8e, 0x51, 0x04, 0x7d, 0x65, 0x22, 0x7d, 0x4b, 0xfe, 0x43, 0x16, 0xdf, 0x2f, 0x75, 0xce, 0xb4, 0x9f, 0xcb, 0x21, - 0x20, 0x8b, 0xc0, 0x1e, 0x1b, 0x19, 0x72, 0xc8, 0x45, 0xfd, 0xde, 0x66, 0xa3, 0xa1, 0x16, 0x57, 0x5a, 0x03, 0xa1, 0x0a, 0x0f, 0xb3, 0x15, 0x69, 0x14, 0x3c, 0x65, 0x6d, 0xd6, 0xf2, 0x9c, 0x83, - 0x5d, 0x53, 0x65, 0x02, 0x86, 0x8a, 0x02, 0x8f, 0x1c, 0x54, 0x60, 0x3c, 0x65, 0x98, 0x02, 0x2b, 0x86, 0x48, 0x31, 0x62, 0xd9, 0x25, 0x45, 0xcf, 0x39, 0x55, 0x1c, 0xd5, 0xeb, 0x62, 0x13, 0xca, - 0x19, 0x8f, 0xfd, 0x7c, 0x49, 0xf7, 0x76, 0xd2, 0x74, 0x0f, 0x2d, 0xfc, 0xa5, 0x20, 0xea, 0x6b, 0xc2, 0x1f, 0x38, 0x35, 0xa7, 0x1d, 0xbc, 0x5d, 0x20, 0x35, 0x32, 0xdb, 0x57, 0x5a, 0x1f, 0x74, - 0x14, 0x68, 0x1c, 0x9b, 0xf1, 0x76, 0x06, 0xe9, 0x33, 0x2d, 0x02, 0xfa, 0x33, 0x62, 0x13, 0x8d, 0xc9, 0x81, 0xca, 0xfb, 0xa2, 0x63, 0xef, 0x41, 0x67, 0xa8, 0xf8, 0xc4, 0x4a, 0x85, 0xb4, 0x3e, - 0x86, 0x4b, 0xa2, 0x20, 0x54, 0xce, 0x64, 0x78, 0xa0, 0x7c, 0x91, 0xd3, 0x0a, 0xd6, 0x55, 0x8d, 0xc5, 0x84, 0x65, 0x42, 0x1e, 0x61, 0xfb, 0xdb, 0xa4, 0x70, 0x73, 0x5c, 0x7b, 0xbd, 0xa7, 0x9a, - 0x59, 0x6a, 0xea, 0xc5, 0xa5, 0x1a, 0xc9, 0xed, 0xe6, 0xa1, 0x4d, 0xf3, 0x4d, 0xb5, 0x92, 0x57, 0x17, 0x7f, 0x7f, 0x64, 0x77, 0x5c, 0xa6, 0x92, 0xf7, 0xd8, 0xf6, 0xda, 0x46, 0x6f, 0xd7, 0x84, - 0x3f, 0xd8, 0xd6, 0x9c, 0xb6, 0xdd, 0xea, 0xad, 0xea, 0x62, 0x86, 0xb8, 0x8d, 0xd4, 0xe2, 0x50, 0xfa, 0x9c, 0x8e, 0xa1, 0x9b, 0x70, 0xc0, 0x50, 0xfe, 0x12, 0x55, 0x72, 0x12, 0x46, 0xcb, 0x19, - 0xeb, 0xd8, 0x39, 0xd6, 0x5b, 0x57, 0xce, 0x86, 0x9e, 0x23, 0x9b, 0x1d, 0x53, 0x86, 0x86, 0xb5, 0xef, 0x43, 0xb4, 0x3d, 0x4c, 0xc6, 0x82, 0xa0, 0x66, 0xde, 0x7c, 0x38, 0xaf, 0xbd, 0xee, 0x28, - 0xb1, 0xab, 0x5d, 0xa5, 0xb1, 0x5b, 0x0e, 0x02, 0x57, 0xa8, 0xf2, 0xba, 0x47, 0xe4, 0xd1, 0x94, 0x1e, 0x7e, 0xa9, 0xbe, 0x1a, 0xf1, 0xc7, 0x69, 0xdc, 0xe0, 0x90, 0xe5, 0xae, 0xae, 0xe6, 0xa6, - 0xfa, 0x43, 0x86, 0x83, 0xf7, 0x5a, 0x3e, 0x7d, 0xdf, 0xfd, 0x61, 0xef, 0x17, 0xe6, 0x11, 0xd7, 0xf4, 0x3f, 0x04, 0xe3, 0xfa, 0x6a, 0xdb, 0x54, 0x7b, 0x62, 0x44, 0x22, 0x33, 0x6a, 0x39, 0x53, - 0x31, 0x02, 0xa9, 0x54, 0x70, 0xdc, 0x17, 0xb8, 0x1c, 0x9c, 0x8f, 0xd0, 0xe1, 0x92, 0x80, 0x16, 0x5c, 0xcc, 0xa2, 0xe2, 0x86, 0x85, 0x79, 0x4f, 0x87, 0x99, 0xcd, 0x26, 0xb6, 0x26, 0x08, 0xdb, - 0x95, 0x70, 0x80, 0x5e, 0x92, 0x9e, 0x63, 0x42, 0x7d, 0x62, 0x20, 0xf5, 0x92, 0xd5, 0xd4, 0xc1, 0x46, 0x45, 0x01, 0xcc, 0xb6, 0xe4, 0x3e, 0x04, 0x08, 0xc3, 0x8d, 0x97, 0xcf, 0xcc, 0xce, 0x27, - 0x6c, 0x6d, 0x13, 0x94, 0xdd, 0x1e, 0xe8, 0x5f, 0xea, 0x7a, 0x2d, 0x80, 0x6e, 0xd9, 0x11, 0xa1, 0x74, 0x11, 0x48, 0x4c, 0xbd, 0xb1, 0xb9, 0x7a, 0x98, 0x71, 0x44, 0x30, 0x30, 0x46, 0xb6, 0x59, - 0xd6, 0xb6, 0x59, 0x0f, 0x71, 0x14, 0x63, 0xcd, 0x14, 0x9f, 0x80, 0xe5, 0x61, 0xba, 0x81, 0x76, 0x7c, 0x2d, 0x83, 0x9e, 0xcb, 0x60, 0xa8, 0x27, 0x39, 0x46, 0x77, 0xbb, 0xf4, 0xa7, 0x83, 0xed, - 0x44, 0x3c, 0x20, 0x75, 0x9c, 0xce, 0x82, 0x48, 0xa6, 0x12, 0x35, 0x63, 0x07, 0xf9, 0x16, 0x10, 0xd5, 0xf1, 0xb3, 0xf1, 0xb3, 0xbd, 0xc9, 0xfa, 0x0c, 0xe9, 0x9f, 0x6d, 0x2c, 0xf4, 0x73, 0x0d, - 0xf5, 0x75, 0x63, 0xa1, 0x16, 0x3a, 0xc9, 0x88, 0x7a, 0x95, 0x51, 0x06, 0xd8, 0x9c, 0x35, 0xc7, 0xd8, 0x18, 0x95, 0xc4, 0x19, 0xa2, 0xb0, 0x08, 0xb3, 0x5d, 0x32, 0xea, 0xbe, 0x9a, 0xd0, 0x12, - 0x9b, 0x28, 0xc1, 0xd4, 0xcb, 0xfb, 0x94, 0x8a, 0xc3, 0x23, 0x44, 0xd2, 0xa0, 0x7d, 0xbc, 0xf2, 0xa3, 0xbe, 0x14, 0xb2, 0x02, 0x57, 0x25, 0x5e, 0x5c, 0x85, 0x74, 0xa4, 0x46, 0x58, 0x6c, 0xfa, - 0x33, 0xca, 0x47, 0xa5, 0x91, 0x51, 0xa2, 0xb6, 0xf4, 0x4c, 0x78, 0x9f, 0xe5, 0x7f, 0xfe, 0xcf, 0xd8, 0x6b, 0xe8, 0x1e, 0xd7, 0xff, 0x87, 0x6e, 0x36, 0x74, 0x87, 0xd9, 0x3f, 0xc3, 0xe5, 0xbe, - 0xb3, 0xee, 0xfe, 0xdc, 0xeb, 0x15, 0xeb, 0xed, 0x0e, 0x7d, 0xb0, 0x73, 0xef, 0x6a, 0x53, 0x45, 0xba, 0x45, 0xbf, 0x21, 0xac, 0xb9, 0x0e, 0x48, 0x98, 0xeb, 0x54, 0xc9, 0x9c, 0x98, 0x81, 0xea, - 0xb0, 0x44, 0x2c, 0xd8, 0x9e, 0xf2, 0x94, 0x2f, 0xac, 0xf2, 0xb5, 0xc8, 0x47, 0x09, 0x8b, 0x1d, 0xc6, 0x44, 0xb4, 0xe0, 0x56, 0xab, 0x48, 0x2f, 0x02, 0x3a, 0xb3, 0xd8, 0xc4, 0xdb, 0x6d, 0xc2, - 0xc4, 0xdd, 0x4e, 0x9d, 0x60, 0x5a, 0x2d, 0xc0, 0xa0, 0xc7, 0x4f, 0x62, 0x72, 0x65, 0x3a, 0x7e, 0x8e, 0x26, 0x3e, 0xe1, 0xf7, 0x9e, 0x66, 0x04, 0x3c, 0x33, 0xb6, 0xfe, 0x38, 0x5d, 0xfe, 0xe3, - 0xd9, 0xf3, 0x79, 0xf5, 0xe0, 0x1e, 0xc7, 0xc8, 0x97, 0x46, 0xb3, 0x13, 0xc9, 0x46, 0x61, 0x1c, 0x0f, 0x3a, 0x64, 0xbb, 0xf1, 0xac, 0x44, 0x47, 0xec, 0x8c, 0xed, 0x11, 0x58, 0x11, 0xec, 0xfa, - 0x71, 0xb0, 0xeb, 0x0f, 0x92, 0x7a, 0x35, 0xce, 0x04, 0x19, 0xca, 0x67, 0xb0, 0x92, 0x02, 0x85, 0x99, 0x4c, 0x14, 0x2b, 0x5e, 0xc1, 0x82, 0x46, 0x99, 0x00, 0xdb, 0xb3, 0xe7, 0x6b, 0x15, 0x10, - 0xf6, 0x6c, 0x34, 0xe0, 0xd1, 0x3c, 0x74, 0xdc, 0x60, 0x3a, 0x1e, 0xaa, 0x4c, 0x80, 0x05, 0x60, 0xa9, 0x4a, 0xf1, 0x08, 0xdc, 0xa5, 0x52, 0x8d, 0x3c, 0xe3, 0xcb, 0x37, 0x21, 0x94, 0x7a, 0x94, - 0x5e, 0x56, 0x8d, 0x3e, 0xb9, 0xcd, 0x9b, 0xa6, 0x8e, 0x97, 0x9d, 0xe2, 0xa2, 0xbe, 0xd4, 0x54, 0x7e, 0x6c, 0xe6, 0xdd, 0x9d, 0xac, 0xbe, 0xee, 0x23, 0x7e, 0xc6, 0xd5, 0x3f, 0xad, 0xb3, 0x7f, - 0x92, 0x75, 0x16, 0xa7, 0x6e, 0xa0, 0x3e, 0xb4, 0x10, 0x5e, 0x49, 0x2d, 0x39, 0xd3, 0x3c, 0x77, 0x2a, 0x37, 0x50, 0x9b, 0x24, 0x9d, 0x16, 0xbd, 0xca, 0x1c, 0x14, 0xfd, 0x7e, 0x45, 0x2e, 0x63, - 0x43, 0x05, 0x6c, 0x2c, 0x06, 0x44, 0xbe, 0x0c, 0xd7, 0x90, 0x74, 0x90, 0x37, 0xe0, 0x62, 0x65, 0x8e, 0x18, 0x6e, 0x0a, 0xda, 0x6c, 0x3e, 0xa5, 0x25, 0x01, 0xd2, 0x27, 0x85, 0x8c, 0xf0, 0x7a, - 0x6f, 0x1c, 0xca, 0xf3, 0xd2, 0xf1, 0x56, 0x84, 0x3a, 0x30, 0x93, 0x94, 0x65, 0xc0, 0x4c, 0x9b, 0x45, 0x31, 0x34, 0xce, 0xea, 0x00, 0xf2, 0x32, 0x75, 0xbd, 0x7c, 0x34, 0xb7, 0x7f, 0xbf, 0x74, - 0xc7, 0x49, 0x7e, 0xd9, 0x63, 0xfd, 0xbc, 0x62, 0xd2, 0x9c, 0xbe, 0x79, 0xd9, 0x6d, 0xbf, 0x29, 0x55, 0xdf, 0x35, 0xd4, 0xfc, 0xea, 0xbe, 0xcb, 0x95, 0x9f, 0xaf, 0xae, 0xb4, 0xe5, 0xd5, 0x65, - 0x81, 0xf4, 0x7e, 0x47, 0x78, 0xcd, 0x5b, 0xd8, 0xd0, 0x6c, 0x78, 0xd5, 0x1c, 0x75, 0xe0, 0x76, 0xfe, 0x40, 0x9d, 0xe5, 0xdc, 0x2c, 0x5e, 0xe7, 0x78, 0xc9, 0xf3, 0x79, 0x35, 0xdd, 0x22, 0xdb, - 0x94, 0x16, 0x31, 0x57, 0xeb, 0xef, 0xe8, 0x09, 0x25, 0x69, 0x3c, 0xbe, 0x1d, 0x30, 0xa1, 0xc2, 0xe8, 0x5d, 0x68, 0x1a, 0xf9, 0x65, 0x69, 0xed, 0x76, 0xa2, 0x3e, 0x4a, 0x23, 0x50, 0x55, 0x5c, - 0x5a, 0x5c, 0xfa, 0x22, 0x9a, 0xd8, 0xe9, 0x76, 0x41, 0x70, 0x44, 0x49, 0x0d, 0x74, 0x7c, 0x80, 0xb3, 0x62, 0xa6, 0x77, 0x9f, 0x59, 0xc9, 0xdf, 0x4d, 0x57, 0x6f, 0xdc, 0x08, 0xf8, 0x4b, 0xb3, - 0xd4, 0x66, 0xf7, 0xfc, 0xd6, 0x7c, 0xf8, 0x3c, 0x62, 0x3d, 0xa9, 0x33, 0x8a, 0xbf, 0x54, 0x23, 0xe4, 0x83, 0x6c, 0xc3, 0xa2, 0xf7, 0x9a, 0xa2, 0x78, 0xbb, 0x1a, 0x21, 0xcc, 0x5e, 0x9b, 0x0d, - 0x06, 0xb3, 0x00, 0x92, 0x0e, 0xd2, 0xb6, 0x5c, 0x1a, 0x7c, 0x3c, 0xac, 0xca, 0xee, 0x70, 0x5d, 0x9b, 0xd3, 0xee, 0x86, 0xf5, 0x35, 0x61, 0x5f, 0x45, 0xb4, 0x5c, 0xf4, 0x0d, 0xa1, 0x47, 0x2a, - 0x3d, 0xa2, 0xe2, 0x27, 0x00, 0x2f, 0xe2, 0x32, 0xe5, 0x44, 0xf3, 0x29, 0x50, 0xf3, 0x65, 0x30, 0xae, 0xeb, 0xac, 0x97, 0x38, 0xf6, 0x01, 0x1a, 0xa4, 0x22, 0xbe, 0x81, 0x51, 0xd5, 0x72, 0x7f, - 0x75, 0x58, 0x6a, 0xa9, 0x15, 0x3e, 0xdc, 0x46, 0x8f, 0x26, 0x2f, 0xaf, 0xc0, 0x79, 0xa6, 0xda, 0xa0, 0x79, 0x3e, 0x6e, 0x26, 0x31, 0x2d, 0xc0, 0x1c, 0x07, 0xd6, 0x78, 0x82, 0x6a, 0xc4, 0x00, - 0x90, 0x36, 0xe5, 0x9c, 0x9a, 0xc1, 0x65, 0x8a, 0xca, 0x09, 0xbc, 0x9b, 0x80, 0x11, 0xdb, 0xb7, 0x43, 0x64, 0xb6, 0xdd, 0xf4, 0xf2, 0x64, 0x4e, 0x81, 0x13, 0x34, 0x1e, 0xab, 0xf1, 0x92, 0xc6, - 0x06, 0x94, 0xde, 0x5f, 0xa9, 0x51, 0x1f, 0x5d, 0x2c, 0x51, 0x04, 0x65, 0x39, 0x6c, 0x73, 0x88, 0x25, 0xd0, 0xb2, 0xdc, 0x88, 0x0f, 0x76, 0xb9, 0x4b, 0x80, 0xb2, 0xfa, 0xba, 0xd2, 0xff, 0x22, - 0xf2, 0x77, 0x33, 0xfe, 0xff, 0x58, 0x66, 0xfc, 0x29, 0xf3, 0xff, 0x58, 0x99, 0x7f, 0x82, 0xe7, 0xab, 0x42, 0x7f, 0x1f, 0xcf, 0x96, 0x62, 0x8f, 0x76, 0xc3, 0x70, 0x6c, 0x59, 0xeb, 0x9a, 0xda, - 0xcf, 0x60, 0x66, 0x09, 0x22, 0x3a, 0xd9, 0x0d, 0xbb, 0x21, 0xd3, 0xe5, 0xb9, 0x3a, 0x82, 0x42, 0x77, 0xbb, 0x4c, 0xf6, 0xc4, 0xfe, 0x90, 0x2c, 0xc3, 0x43, 0x44, 0x87, 0xe2, 0xe1, 0xb0, 0x8e, - 0x05, 0xd9, 0x50, 0x7a, 0xa6, 0xcb, 0xea, 0x0e, 0xc5, 0x30, 0x05, 0x0e, 0xe3, 0x39, 0x56, 0xc5, 0x5d, 0x25, 0xb0, 0x57, 0xd6, 0xca, 0x09, 0xbb, 0x3d, 0x26, 0x7e, 0x36, 0xd2, 0xff, 0x41, 0x78, - 0x7e, 0xef, 0xe9, 0x7d, 0xa5, 0x08, 0xdb, 0x99, 0x66, 0x83, 0xe4, 0xc5, 0xbf, 0xdb, 0xaa, 0xf8, 0xda, 0x6e, 0x95, 0xe9, 0xc9, 0x66, 0x87, 0x09, 0x6c, 0x4c, 0x50, 0x0b, 0x05, 0x32, 0x76, 0x76, - 0x6f, 0xbc, 0x72, 0x09, 0x90, 0x72, 0x3d, 0x14, 0x82, 0xc6, 0xcc, 0x5a, 0x1e, 0x25, 0x28, 0x32, 0x07, 0x8d, 0xad, 0xb9, 0x96, 0x17, 0xd5, 0x18, 0x83, 0xd7, 0x07, 0x79, 0xaf, 0xfa, 0x33, 0xd8, - 0x94, 0x02, 0x1a, 0x57, 0xba, 0xcb, 0x25, 0x38, 0xd9, 0x74, 0x39, 0xb2, 0xbf, 0x5e, 0x04, 0xab, 0xee, 0x82, 0xde, 0xee, 0x89, 0x67, 0xa3, 0x47, 0x0b, 0x85, 0xd7, 0x0e, 0xc9, 0xd2, 0x0c, 0xf3, - 0x4e, 0xae, 0xa6, 0x4d, 0xd6, 0x88, 0xe3, 0x3e, 0xaa, 0x43, 0x80, 0xbf, 0x66, 0x30, 0x7e, 0xa6, 0x7e, 0x44, 0xf7, 0xf3, 0xb5, 0x0e, 0xde, 0xce, 0x88, 0x74, 0x41, 0x64, 0xa3, 0x85, 0x8b, 0x1a, - 0x2c, 0xf6, 0x12, 0xbb, 0x24, 0x80, 0x99, 0xb1, 0x1a, 0xd9, 0xe3, 0x35, 0x27, 0x4f, 0x31, 0x84, 0x04, 0xa6, 0xc9, 0x56, 0xdb, 0x89, 0x35, 0x87, 0x22, 0x30, 0x57, 0xb0, 0xe2, 0x68, 0x99, 0x08, - 0xc5, 0x68, 0x3c, 0xa4, 0xa1, 0xe1, 0x14, 0x01, 0xd6, 0xc8, 0x3e, 0xdf, 0xf2, 0xc6, 0x58, 0x08, 0x14, 0xcc, 0x90, 0x08, 0xab, 0xb7, 0xcf, 0x0c, 0x6c, 0xb1, 0x99, 0x00, 0xeb, 0x9f, 0xec, 0x91, - 0xdf, 0x2a, 0x0f, 0xed, 0xbb, 0xbd, 0x0d, 0xd0, 0xd7, 0x7a, 0xf9, 0x65, 0x5b, 0x83, 0xf3, 0x8e, 0x06, 0x68, 0xbb, 0xde, 0x1d, 0x88, 0x15, 0x80, 0x58, 0x3b, 0x51, 0xa3, 0x27, 0xb5, 0x48, 0xae, - 0xa0, 0xe9, 0x16, 0x1a, 0x26, 0x46, 0xb8, 0x99, 0x09, 0xa6, 0x9c, 0xcf, 0xb1, 0x14, 0xf2, 0x67, 0xdd, 0x9a, 0xa4, 0x69, 0xb5, 0x62, 0x37, 0x76, 0x62, 0xaa, 0xa4, 0xc6, 0xb9, 0x2e, 0x02, 0xd1, - 0xdb, 0x74, 0xc8, 0xa4, 0x7d, 0x03, 0xe4, 0xf7, 0xd0, 0x14, 0x11, 0xf4, 0x9a, 0x58, 0xc0, 0x30, 0xcc, 0xaa, 0xfd, 0xdd, 0x52, 0xd7, 0xa0, 0x9f, 0xc0, 0x05, 0xbd, 0x51, 0x6f, 0xfb, 0x16, 0x90, - 0x59, 0xaa, 0x9a, 0x75, 0xbc, 0xac, 0x93, 0x16, 0x61, 0xee, 0x7e, 0x5b, 0x15, 0xfb, 0xe7, 0xd8, 0x7d, 0xa2, 0x0d, 0x76, 0x3e, 0x5f, 0x69, 0x53, 0xa3, 0xef, 0x88, 0x66, 0xcf, 0xce, 0xb6, 0xbd, - 0x45, 0x9f, 0xe6, 0xf9, 0xb1, 0xb3, 0xf2, 0xc3, 0x75, 0x9f, 0x87, 0x23, 0xad, 0xc4, 0x12, 0x41, 0xdd, 0x60, 0xd3, 0xbe, 0xdb, 0x5b, 0x49, 0x43, 0x4f, 0x5b, 0x6c, 0x03, 0x3c, 0x63, 0x32, 0x40, - 0x72, 0x34, 0xa5, 0x0e, 0xe4, 0x4a, 0xae, 0xf0, 0x78, 0x9a, 0xce, 0x92, 0xd4, 0xce, 0xc3, 0x70, 0x0c, 0xe3, 0x73, 0x92, 0x2a, 0x29, 0x89, 0x58, 0x8e, 0x6a, 0x39, 0x60, 0xac, 0xf1, 0xa2, 0xe5, - 0xf6, 0xf5, 0xb7, 0x9b, 0x66, 0xdc, 0x09, 0x33, 0xbb, 0x2e, 0xc9, 0xdc, 0x4c, 0xd6, 0x3f, 0xad, 0x57, 0x5f, 0xea, 0x1c, 0xfe, 0xfe, 0xb5, 0xb4, 0x98, 0xa5, 0x66, 0xf9, 0x25, 0x2a, 0x10, 0x7b, - 0x83, 0xf1, 0xc7, 0xf1, 0x86, 0x5f, 0xc2, 0x47, 0x8e, 0x4c, 0xec, 0x44, 0xd9, 0x55, 0xf8, 0xe8, 0x71, 0x4a, 0x7d, 0x93, 0x51, 0x15, 0x95, 0x66, 0xea, 0x47, 0xaa, 0xd1, 0x89, 0xd3, 0x28, 0x37, - 0xf5, 0xab, 0x3c, 0x34, 0xe4, 0x36, 0x55, 0x2c, 0x4e, 0xa3, 0xa0, 0xa3, 0xfb, 0xee, 0x25, 0x26, 0x13, 0xc6, 0x3e, 0xc7, 0xaa, 0x26, 0x97, 0x6f, 0x87, 0xef, 0xae, 0x23, 0x7e, 0x99, 0xec, 0x7d, - 0x95, 0xaa, 0x6f, 0x43, 0xa1, 0x9e, 0xf8, 0x3f, 0xa8, 0xdf, 0xfe, 0xe3, 0x3f, 0x7e, 0xfb, 0x1b, 0x4c, 0x9c, 0xfe, 0xb5, 0x99, 0xd3, 0x7d, 0x96, 0xbc, 0x9b, 0x46, 0x35, 0xb5, 0x2f, 0x53, 0xd1, - 0x47, 0x0a, 0xec, 0xe7, 0x83, 0xed, 0x85, 0x28, 0xd8, 0x79, 0x3f, 0x6c, 0x5b, 0x8f, 0x9f, 0x02, 0xba, 0xeb, 0xc4, 0xd4, 0xb4, 0x7e, 0x1d, 0x6f, 0xba, 0x82, 0x04, 0xac, 0x55, 0x42, 0x40, 0xba, - 0x6a, 0x36, 0x8c, 0x6c, 0x53, 0x9a, 0xd6, 0xfa, 0x20, 0xa7, 0x87, 0x33, 0x23, 0x9e, 0xf2, 0xfc, 0x81, 0xb6, 0x61, 0xc8, 0x82, 0x70, 0x75, 0xd1, 0x5f, 0x31, 0x9a, 0xde, 0x4b, 0x06, 0x16, 0x38, - 0xdf, 0x54, 0x70, 0xcf, 0xa3, 0x15, 0x20, 0x41, 0x40, 0xad, 0xc7, 0xd8, 0x28, 0x57, 0x16, 0xe9, 0x18, 0x15, 0xbf, 0xdd, 0xa1, 0xe0, 0x5b, 0x7c, 0x3e, 0xe4, 0xee, 0xbe, 0xb1, 0xf4, 0xca, 0x50, - 0x70, 0xa6, 0xd9, 0xec, 0xe5, 0xd0, 0x1c, 0xb5, 0x0d, 0x0b, 0xab, 0xe2, 0xbd, 0x92, 0x75, 0x67, 0xd1, 0x5e, 0x51, 0x47, 0xbd, 0xc5, 0x68, 0x30, 0x54, 0xe4, 0x03, 0xd7, 0x53, 0xb7, 0xb1, 0x0f, - 0xf5, 0xc7, 0x0b, 0x1a, 0xe8, 0x33, 0x5d, 0x75, 0xe4, 0x1e, 0xcc, 0x60, 0xec, 0x4c, 0xab, 0xdd, 0x5e, 0xb4, 0x09, 0xd4, 0xc1, 0x64, 0x78, 0x3c, 0xb2, 0x97, 0x03, 0x3e, 0x96, 0x93, 0x39, 0x37, - 0x93, 0xf4, 0x20, 0xd8, 0x4e, 0x0a, 0x3b, 0x95, 0xbc, 0x91, 0xcf, 0xe4, 0xeb, 0x52, 0x6a, 0xb9, 0x43, 0xc8, 0x95, 0xa0, 0x3c, 0xac, 0x84, 0xfa, 0x45, 0xf4, 0xaf, 0x7a, 0xed, 0x51, 0xe4, 0xcf, - 0xa7, 0xd7, 0x62, 0xff, 0x1d, 0x5b, 0xb2, 0x26, 0x20, 0x25, 0x6f, 0x94, 0xf4, 0x21, 0x36, 0x3b, 0xdf, 0x09, 0xea, 0x6b, 0xd5, 0x89, 0x1e, 0xbc, 0xa3, 0x19, 0x9c, 0xef, 0xb6, 0xb4, 0xad, 0x57, - 0xb4, 0xd1, 0x74, 0x6c, 0xa3, 0x1f, 0xb2, 0xe5, 0x46, 0xcf, 0xe6, 0xb8, 0xca, 0x2f, 0x97, 0xe4, 0x2c, 0x41, 0x85, 0xaa, 0xe4, 0x93, 0x2e, 0xc9, 0x02, 0xeb, 0x50, 0xdb, 0x99, 0x43, 0xd3, 0x8a, - 0xcd, 0xed, 0x64, 0x03, 0xa4, 0x87, 0xba, 0x3f, 0xf2, 0x97, 0x84, 0xb0, 0xc8, 0xfb, 0x23, 0x27, 0x23, 0x04, 0x1f, 0x9a, 0xec, 0x96, 0x83, 0x58, 0x1f, 0x03, 0xd5, 0x04, 0x1a, 0x55, 0xd6, 0x14, - 0xe8, 0xb3, 0x4b, 0xbc, 0xa9, 0x5f, 0xf2, 0x04, 0x2f, 0xc3, 0x6c, 0xf2, 0x0b, 0x8a, 0xd4, 0xed, 0xbc, 0x17, 0x5c, 0xff, 0x06, 0xb1, 0x9f, 0x77, 0xed, 0x87, 0x6f, 0xb9, 0x60, 0x76, 0xaf, 0xad, - 0x6d, 0xc9, 0xc3, 0xf5, 0xd8, 0x1e, 0xaf, 0x6d, 0xdc, 0x5c, 0xee, 0x4b, 0x49, 0x19, 0x54, 0x6b, 0xaa, 0x5f, 0x5a, 0x9a, 0xca, 0x93, 0xf4, 0x66, 0xe1, 0x20, 0xfa, 0x04, 0x40, 0x3d, 0xdc, 0x9a, - 0x0e, 0xea, 0xe5, 0x94, 0xdd, 0xaf, 0x99, 0x11, 0x6a, 0xac, 0x50, 0x95, 0x5c, 0xd7, 0xd4, 0x01, 0xb1, 0xc0, 0x42, 0x84, 0x4c, 0x94, 0x21, 0xd6, 0x41, 0x64, 0x70, 0x68, 0xb4, 0xc0, 0x31, 0x4f, - 0x16, 0xbb, 0xfc, 0x4a, 0x1e, 0x0e, 0xbf, 0xdf, 0x9e, 0xe4, 0xeb, 0xc6, 0x37, 0xf7, 0xcd, 0xa5, 0x57, 0xaa, 0xae, 0x7d, 0xa2, 0xfd, 0x81, 0xd0, 0x7b, 0xdd, 0x42, 0xb4, 0x5d, 0xc5, 0x35, 0x0b, - 0x4d, 0xc4, 0x6e, 0x24, 0x1e, 0xba, 0x1e, 0x42, 0x3b, 0x8c, 0x09, 0xf2, 0xdd, 0x15, 0xdb, 0x85, 0xab, 0x49, 0x30, 0x66, 0x58, 0x76, 0x09, 0xda, 0x9c, 0x10, 0x8e, 0x67, 0xf4, 0x76, 0x80, 0x3b, - 0x59, 0x25, 0x90, 0xcc, 0x64, 0xec, 0x41, 0x5d, 0x5e, 0xc7, 0xf9, 0xed, 0xac, 0xee, 0xea, 0x83, 0x21, 0x00, 0xec, 0xfd, 0x98, 0x63, 0x87, 0x36, 0xa7, 0xba, 0xf9, 0x2a, 0x83, 0x50, 0x5a, 0x96, - 0x28, 0xec, 0xd9, 0xa0, 0x78, 0xfc, 0xa5, 0x8f, 0xab, 0x2a, 0xbd, 0x56, 0x8e, 0xf6, 0x9d, 0xea, 0x3b, 0x16, 0xae, 0x65, 0xb5, 0x2d, 0x46, 0xbb, 0x1f, 0x15, 0x91, 0x8c, 0x03, 0x93, 0x6e, 0x77, - 0xe3, 0x2b, 0x54, 0x5e, 0x99, 0x86, 0x2a, 0x59, 0x04, 0xbd, 0x47, 0x64, 0x5b, 0x5c, 0xed, 0x4b, 0x5b, 0x11, 0xb6, 0xd1, 0x7c, 0x9c, 0x28, 0x85, 0x15, 0x8c, 0x5c, 0x0d, 0xca, 0x27, 0x48, 0x6e, - 0xda, 0x73, 0x46, 0x50, 0x34, 0x38, 0x5e, 0xcd, 0xec, 0xa1, 0xe3, 0x27, 0x9c, 0x4f, 0x43, 0xa6, 0x00, 0xe9, 0x68, 0xc5, 0x94, 0xa2, 0x1e, 0xd4, 0x7b, 0xec, 0xc7, 0x6b, 0x7e, 0xcd, 0xcf, 0xfe, - 0xb6, 0x54, 0x12, 0xf2, 0x42, 0x22, 0xd8, 0x3b, 0xd5, 0x0b, 0x30, 0xe7, 0x62, 0x49, 0xc8, 0xb3, 0x94, 0xaf, 0x26, 0x1a, 0x8b, 0xcb, 0xfb, 0xba, 0x2d, 0x13, 0x54, 0xe5, 0xca, 0xb2, 0x5b, 0x29, - 0x88, 0x33, 0x33, 0x46, 0x96, 0xce, 0xcf, 0x76, 0x66, 0x77, 0x23, 0x58, 0x61, 0x15, 0x30, 0xd2, 0x7a, 0xe3, 0x04, 0xe6, 0x78, 0x4a, 0xa5, 0x7d, 0x48, 0x1e, 0x54, 0x01, 0x0b, 0x8a, 0x79, 0x84, - 0x2e, 0x48, 0x29, 0x52, 0xc6, 0x31, 0xae, 0xbb, 0xbe, 0xa2, 0xed, 0x6b, 0x01, 0x77, 0xe5, 0x99, 0x2c, 0x66, 0x23, 0xa0, 0x67, 0x72, 0xcf, 0xa6, 0x7d, 0xdf, 0x44, 0x0b, 0x1f, 0xf1, 0xf2, 0x5d, - 0x0d, 0xb4, 0xb2, 0xb7, 0x2c, 0x57, 0xf3, 0x77, 0x8d, 0x71, 0x93, 0x50, 0x73, 0x7d, 0x57, 0x75, 0x09, 0x0c, 0xfe, 0x62, 0x8d, 0x7d, 0xcd, 0x90, 0xf9, 0x5c, 0x90, 0xd6, 0x4c, 0x6d, 0x13, 0xf9, - 0xfd, 0x63, 0x3d, 0xe9, 0xba, 0xcd, 0xd5, 0xd3, 0xe8, 0x23, 0x27, 0x04, 0xfb, 0xfc, 0x13, 0x62, 0x57, 0xbf, 0x6a, 0x46, 0x6e, 0x0a, 0x51, 0xb4, 0x33, 0xc7, 0xda, 0x55, 0x75, 0x6a, 0x18, 0x7a, - 0x37, 0x25, 0xe6, 0xa1, 0xd5, 0xf5, 0x8a, 0x59, 0xf1, 0xf8, 0x35, 0x17, 0xa1, 0xba, 0x9f, 0x96, 0xd3, 0x32, 0x66, 0xc5, 0x77, 0x0c, 0xb0, 0xea, 0x03, 0x93, 0x5d, 0x97, 0xe2, 0x95, 0x48, 0x66, - 0x73, 0x7f, 0x95, 0xaa, 0x7c, 0x6e, 0x39, 0xf8, 0x66, 0xeb, 0x7a, 0x43, 0x4f, 0xf5, 0x37, 0xfa, 0x8e, 0xcc, 0xd4, 0x65, 0x5e, 0xa8, 0xe1, 0x82, 0x3b, 0x4c, 0xa6, 0xfb, 0x90, 0x77, 0x16, 0x9b, - 0x1e, 0x37, 0x4a, 0xf8, 0x3d, 0x47, 0x06, 0x99, 0x44, 0x71, 0x50, 0xc1, 0x06, 0x89, 0xbf, 0xab, 0x3c, 0x76, 0x45, 0xed, 0xcb, 0x8a, 0x7f, 0xad, 0xfb, 0x9d, 0xbf, 0xe3, 0x7b, 0x10, 0xf1, 0x37, - 0xf2, 0x17, 0x41, 0xbc, 0x8f, 0xde, 0x05, 0xb6, 0x86, 0xfe, 0x73, 0xd8, 0x32, 0x66, 0x35, 0x97, 0xed, 0x90, 0x56, 0x32, 0x73, 0x52, 0xc0, 0xa2, 0xed, 0x11, 0xfe, 0x52, 0x13, 0x21, 0xde, 0xf2, - 0xfa, 0x8e, 0xb2, 0xde, 0xd0, 0x41, 0xac, 0xe0, 0xb4, 0xba, 0x18, 0xec, 0x0e, 0x13, 0x07, 0xb7, 0xe9, 0x0d, 0x63, 0xab, 0x60, 0x31, 0x1f, 0x79, 0xe2, 0x9c, 0x8f, 0xb9, 0xbe, 0xc7, 0x76, 0x55, - 0x63, 0x3d, 0x8c, 0x0d, 0x41, 0x67, 0x27, 0x0b, 0x4e, 0xb6, 0x53, 0x85, 0xcc, 0xc2, 0x48, 0x6c, 0x67, 0xb3, 0xfd, 0xfb, 0x79, 0x4e, 0xd5, 0x14, 0x35, 0x6d, 0x7a, 0xca, 0xef, 0x1f, 0xc1, 0xcb, - 0x57, 0x1d, 0xe1, 0x6a, 0xdb, 0xbf, 0xaf, 0x2d, 0xdf, 0x6f, 0xfb, 0xf7, 0x68, 0xe3, 0x38, 0xf4, 0xcb, 0x4d, 0x45, 0xea, 0xbe, 0x93, 0xb8, 0x79, 0x47, 0x6a, 0x19, 0xfa, 0x7b, 0xef, 0x6f, 0xe3, - 0x29, 0xba, 0xc7, 0xa3, 0xdb, 0x49, 0xcd, 0x9f, 0x9b, 0xf9, 0xfd, 0xb9, 0x99, 0xdf, 0x4b, 0x92, 0xf3, 0xe7, 0xa6, 0x7e, 0xad, 0x36, 0xf5, 0x6b, 0x70, 0xf4, 0xcd, 0xd2, 0x0c, 0x33, 0x27, 0x37, - 0x6f, 0x66, 0x7d, 0x9f, 0xbd, 0x07, 0x3f, 0x2f, 0x3b, 0xf6, 0x99, 0xf8, 0x65, 0xfc, 0xbd, 0xba, 0xd4, 0x78, 0x13, 0x9e, 0x94, 0x21, 0x83, 0x3b, 0xf3, 0x6d, 0xac, 0x2b, 0x91, 0x4d, 0xf4, 0x93, - 0xe9, 0x34, 0x19, 0x88, 0x80, 0x23, 0x51, 0x4a, 0x91, 0x18, 0xb8, 0x29, 0xe9, 0xaf, 0x68, 0x9d, 0x66, 0x45, 0xf6, 0x5d, 0xfe, 0x1f, 0x79, 0x06, 0x5f, 0x9c, 0x52, 0x5d, 0x11, 0xbf, 0x7c, 0xef, - 0xd5, 0xa5, 0xb6, 0x05, 0xce, 0x13, 0x09, 0x49, 0x01, 0x13, 0xe5, 0x4b, 0xa7, 0xd7, 0x0f, 0x62, 0x83, 0x9f, 0x96, 0x20, 0xb8, 0xa4, 0xfa, 0x61, 0xdf, 0x0f, 0xb7, 0x9e, 0xca, 0x12, 0xe2, 0x98, - 0x2b, 0xd4, 0x0d, 0x3d, 0xe1, 0x76, 0x15, 0xb2, 0x2b, 0x79, 0x81, 0x5a, 0x73, 0xde, 0x9e, 0x07, 0x2c, 0x30, 0xe5, 0x07, 0x12, 0x36, 0x35, 0xb1, 0x38, 0xdc, 0x51, 0x71, 0x77, 0x44, 0xef, 0xa4, - 0x99, 0xec, 0x6d, 0x79, 0x7a, 0x2c, 0x85, 0x48, 0x4b, 0x65, 0xf3, 0xdd, 0xfc, 0xf3, 0x73, 0x59, 0x9f, 0x27, 0x48, 0xa7, 0xa6, 0xf1, 0xb8, 0xcc, 0x17, 0xfa, 0x52, 0x7c, 0xe1, 0x15, 0xdd, 0x0b, - 0xbe, 0xa7, 0xb3, 0x66, 0x0e, 0xd6, 0x22, 0xe2, 0x10, 0x80, 0xcc, 0x00, 0x18, 0x1e, 0xd4, 0xae, 0x35, 0x1e, 0x58, 0x3d, 0x71, 0xa0, 0x1b, 0x04, 0xb2, 0x2d, 0x89, 0x28, 0xf4, 0x98, 0x20, 0x70, - 0x56, 0x70, 0xe1, 0x50, 0xc4, 0x66, 0x65, 0x09, 0x4b, 0x6a, 0x55, 0xd1, 0x26, 0xb1, 0x53, 0xfb, 0x86, 0xc8, 0xae, 0x87, 0xdd, 0x0c, 0x02, 0x67, 0x61, 0x61, 0xef, 0xf1, 0x95, 0xd1, 0xcd, 0x0d, - 0x4d, 0x21, 0x4d, 0xc2, 0xee, 0x21, 0xb9, 0xd4, 0x35, 0xea, 0x8d, 0xf1, 0x93, 0xad, 0xa5, 0xda, 0xf8, 0xfc, 0x9b, 0xef, 0xca, 0x54, 0xab, 0x9d, 0x89, 0xf9, 0xa2, 0xa8, 0xde, 0xd2, 0xbf, 0xa0, - 0x79, 0x7b, 0xb5, 0x31, 0x2a, 0x5b, 0x08, 0xec, 0x1a, 0x18, 0x8f, 0x74, 0xc4, 0x08, 0x86, 0x13, 0x7f, 0x1e, 0xfb, 0x1c, 0xc8, 0x63, 0xe3, 0xae, 0xdf, 0x9d, 0xe8, 0x34, 0x4f, 0x5b, 0xf3, 0x7c, - 0x4e, 0x30, 0x5b, 0x0a, 0x2b, 0x56, 0x93, 0x8d, 0x48, 0xf4, 0x4a, 0xbd, 0xee, 0x4e, 0x74, 0x1b, 0x45, 0xb7, 0x48, 0x0d, 0x0f, 0x57, 0x9a, 0x2f, 0x13, 0x7b, 0x63, 0x8b, 0x63, 0xf3, 0xcd, 0x76, - 0xc5, 0xf7, 0x4a, 0x00, 0x5a, 0xc7, 0x09, 0x35, 0x8c, 0x88, 0x7a, 0xf7, 0xe3, 0x54, 0x9b, 0x2b, 0xfb, 0xe4, 0x3e, 0x56, 0xaf, 0xd8, 0x0c, 0x17, 0xa2, 0x17, 0x80, 0x8e, 0x7d, 0x02, 0x69, 0x37, - 0xd3, 0xd5, 0x87, 0x45, 0x36, 0x66, 0x86, 0x39, 0x28, 0x81, 0xd1, 0x90, 0xa8, 0x41, 0x38, 0x3c, 0x58, 0x26, 0xd2, 0x2f, 0x07, 0xe3, 0x95, 0x1c, 0x39, 0x2b, 0xc9, 0x2a, 0x77, 0x82, 0x53, 0xee, - 0xa1, 0x90, 0xed, 0xad, 0x81, 0xbd, 0x85, 0xcf, 0x22, 0x76, 0xe3, 0xd1, 0xbc, 0xbe, 0x8e, 0xbb, 0x68, 0x21, 0x2c, 0x19, 0xdd, 0xa9, 0xb7, 0x7a, 0x56, 0xce, 0xfd, 0x54, 0x8d, 0x69, 0x63, 0x03, - 0x17, 0x6b, 0x60, 0x3b, 0x78, 0x3e, 0xa2, 0x3f, 0x96, 0x96, 0x4f, 0xfe, 0xf8, 0x9f, 0x40, 0xf0, 0x21, 0x22, 0x47, 0xb1, 0x38, 0x11, 0x7a, 0x8e, 0x40, 0x00, 0xb2, 0xaa, 0x34, 0xa3, 0x42, 0x0b, - 0x2f, 0x0e, 0x5b, 0x23, 0xe5, 0x4c, 0x24, 0x49, 0x12, 0x00, 0xaa, 0xd1, 0x68, 0x70, 0xe8, 0x01, 0x34, 0x00, 0x24, 0xfe, 0x58, 0x8c, 0x26, 0x23, 0x79, 0x88, 0xad, 0x87, 0x50, 0xb8, 0x1e, 0x77, - 0x39, 0x42, 0xfa, 0xff, 0xd8, 0xfb, 0xcf, 0x1d, 0xd7, 0xd1, 0x27, 0x31, 0x1c, 0xbe, 0x95, 0xc1, 0x7c, 0xb4, 0x5e, 0x1d, 0xe6, 0xb4, 0x80, 0x0d, 0x53, 0x12, 0x15, 0x29, 0x26, 0x89, 0x22, 0x45, - 0xc3, 0x3f, 0x80, 0x39, 0xe7, 0x24, 0x12, 0x86, 0xaf, 0xfd, 0x85, 0x42, 0xc7, 0xd3, 0x6a, 0xb1, 0x35, 0xb3, 0x3b, 0xeb, 0xc5, 0xff, 0xcb, 0x39, 0x4c, 0x5d, 0x14, 0xab, 0xea, 0xa9, 0xa7, 0x72, - 0x21, 0xf3, 0x93, 0x2a, 0x22, 0xdb, 0x43, 0x5b, 0x01, 0xb1, 0x45, 0x11, 0xc4, 0x62, 0x2b, 0xa1, 0x73, 0x14, 0xc9, 0x18, 0x2a, 0xcd, 0x8b, 0x1d, 0xdc, 0x0f, 0x0c, 0x72, 0xbc, 0x6a, 0xcd, 0x67, - 0x7d, 0xef, 0x56, 0x14, 0x5f, 0xdc, 0x94, 0xa8, 0x4f, 0x51, 0x89, 0xd7, 0x47, 0x2f, 0x4d, 0x19, 0x6f, 0xcf, 0x80, 0x77, 0x9e, 0xf9, 0xca, 0x88, 0xf8, 0x00, 0xfe, 0xb7, 0x9a, 0xd4, 0xd7, 0x4e, - 0x84, 0x51, 0xea, 0xba, 0xef, 0xd5, 0xae, 0x8f, 0xad, 0x40, 0x9a, 0xc6, 0xbf, 0x36, 0xac, 0x23, 0x3f, 0x03, 0xb8, 0xbc, 0xf2, 0x4b, 0x1f, 0xea, 0x17, 0x7a, 0x9e, 0xe3, 0x27, 0xd6, 0x38, 0xee, - 0xc6, 0xad, 0x7e, 0x0d, 0xc2, 0x10, 0x9f, 0xfb, 0x4d, 0x44, 0xbe, 0xeb, 0x55, 0xe7, 0x27, 0xce, 0x1a, 0xa1, 0x5d, 0xbe, 0x58, 0xe4, 0xf8, 0xa7, 0x26, 0x09, 0x7e, 0xf2, 0xf2, 0x6b, 0x3e, 0x61, - 0xeb, 0x36, 0x22, 0x7c, 0xdc, 0xea, 0x45, 0xf2, 0xfe, 0x6b, 0x3e, 0x3f, 0x74, 0xea, 0xc6, 0xba, 0x65, 0x15, 0xaf, 0xf7, 0x3f, 0x04, 0x72, 0xde, 0x59, 0x0b, 0x9f, 0xcc, 0xfd, 0xd2, 0x36, 0xeb, - 0xc2, 0xbe, 0x62, 0xf8, 0xbd, 0xab, 0x1a, 0xfb, 0xfc, 0xd8, 0xbb, 0x4e, 0x0c, 0x9f, 0xa2, 0x44, 0x95, 0x9f, 0x74, 0xe3, 0xa8, 0xa8, 0xaf, 0x2f, 0x18, 0x3a, 0x54, 0xfc, 0x8c, 0xe5, 0xfc, 0xbe, - 0x4a, 0xf0, 0xac, 0x2d, 0x9f, 0xdf, 0xd6, 0x4d, 0x3e, 0xbe, 0x02, 0x79, 0xbc, 0x6a, 0x08, 0xc6, 0xec, 0x4b, 0xd2, 0x5d, 0x09, 0xb3, 0xe2, 0xd0, 0xef, 0x47, 0x4c, 0x58, 0x1e, 0x27, 0x66, 0x9d, - 0xe5, 0xdb, 0xee, 0xb4, 0x5b, 0xaa, 0x6a, 0xb1, 0xe4, 0x59, 0x49, 0x3a, 0xc9, 0x30, 0x30, 0xf3, 0xcd, 0x03, 0x49, 0x90, 0xd4, 0x56, 0x9a, 0x48, 0x12, 0x39, 0x5a, 0x9a, 0x70, 0xad, 0xf4, 0x72, - 0x9d, 0xf1, 0x25, 0x7a, 0xdc, 0xa1, 0xeb, 0x7e, 0x12, 0x4f, 0x4e, 0x41, 0x30, 0x3d, 0x4c, 0x4e, 0x33, 0xc0, 0x1d, 0xb6, 0x6a, 0x0a, 0xbb, 0x2e, 0xdf, 0x37, 0xf5, 0x18, 0x14, 0x99, 0xfa, 0xbd, - 0xa9, 0xca, 0x57, 0x38, 0xc4, 0x9f, 0xf3, 0x54, 0x7f, 0x02, 0x7e, 0xc6, 0xe6, 0xa7, 0x4b, 0x97, 0x91, 0xfc, 0x03, 0x76, 0x29, 0x62, 0x91, 0x95, 0x80, 0xaa, 0x74, 0xb1, 0xc1, 0x86, 0xb0, 0xc8, - 0x1e, 0x37, 0x28, 0xd7, 0x67, 0x5b, 0xbe, 0x38, 0x06, 0x5b, 0xcf, 0x5a, 0x9d, 0xd4, 0x7a, 0xd5, 0x74, 0xb0, 0x38, 0x29, 0x59, 0x06, 0x8f, 0x82, 0x3a, 0xb5, 0x36, 0x8d, 0x15, 0x2a, 0x25, 0x60, - 0x66, 0xdd, 0x7a, 0x8d, 0x4c, 0x0f, 0xab, 0x43, 0xb6, 0x04, 0x79, 0x1f, 0x5a, 0x36, 0x2e, 0x94, 0x36, 0xc6, 0xb6, 0x67, 0xad, 0xf9, 0x64, 0xf2, 0xbc, 0x83, 0xcd, 0x89, 0xf4, 0xea, 0x5d, 0x97, - 0x8e, 0x3b, 0xbd, 0x97, 0xff, 0x3d, 0xf2, 0xa8, 0x1d, 0x3f, 0x8a, 0xc6, 0x85, 0x9e, 0xb8, 0xf7, 0x48, 0x45, 0x3c, 0x4b, 0xaa, 0x1b, 0xd8, 0x2b, 0x91, 0x6e, 0x27, 0x97, 0x99, 0x83, 0x03, 0xc8, - 0x93, 0xf3, 0x29, 0x35, 0x1f, 0x59, 0x5b, 0x39, 0x9e, 0xc2, 0xac, 0x69, 0xa0, 0x13, 0xe3, 0xd0, 0x24, 0x9b, 0xf5, 0x69, 0x2f, 0x04, 0xd3, 0x78, 0x24, 0x49, 0x99, 0x8d, 0xba, 0xb3, 0x7a, 0x51, - 0xf4, 0x21, 0x4b, 0xc4, 0xcc, 0x21, 0x02, 0xac, 0xe0, 0xb8, 0xab, 0x61, 0xde, 0x12, 0x61, 0x41, 0x47, 0x40, 0x98, 0x43, 0xd3, 0x3c, 0xdc, 0xb9, 0x94, 0x5f, 0xe0, 0x81, 0xce, 0x2a, 0x6b, 0x58, - 0xde, 0x1d, 0xb2, 0x47, 0xd9, 0x58, 0xf7, 0xc9, 0x53, 0xa5, 0xb7, 0xde, 0x8c, 0x2f, 0x88, 0xba, 0x36, 0xf6, 0xf9, 0x77, 0xf2, 0x2d, 0x7e, 0x10, 0xda, 0x5f, 0x93, 0xe4, 0x99, 0xa6, 0x5b, 0xef, - 0xe0, 0x5e, 0x68, 0xf2, 0x7a, 0x36, 0xbe, 0xc0, 0x7b, 0x4c, 0x94, 0x25, 0x61, 0xd8, 0x85, 0x62, 0x2d, 0xd7, 0x23, 0x6c, 0xca, 0x1d, 0x0a, 0xd4, 0x8f, 0x58, 0x45, 0xd0, 0x7d, 0x34, 0x8e, 0x88, - 0x23, 0x9c, 0xd3, 0xe5, 0x29, 0x68, 0x91, 0xcc, 0xb1, 0x27, 0x27, 0xc1, 0x77, 0xb5, 0x58, 0x9f, 0xed, 0xfb, 0x39, 0xd8, 0x06, 0x6b, 0x36, 0xa0, 0xc0, 0x93, 0x34, 0x8d, 0x17, 0xa6, 0x72, 0x34, - 0xbb, 0x0a, 0xc4, 0xc0, 0x8e, 0x1b, 0x21, 0x28, 0xaf, 0xcd, 0xd6, 0x31, 0x64, 0xff, 0xcc, 0x14, 0x19, 0xe0, 0x94, 0xfa, 0x68, 0xd3, 0x7d, 0xb1, 0x29, 0x5e, 0xd4, 0xda, 0x0b, 0x39, 0xe1, 0x77, - 0xfb, 0xd5, 0x4f, 0x29, 0x39, 0x2c, 0x4e, 0x7f, 0x46, 0x72, 0x7d, 0xaf, 0xc1, 0xdc, 0x73, 0xa1, 0xe6, 0x1b, 0xcc, 0x17, 0x12, 0xd6, 0xd9, 0xd0, 0x50, 0xb3, 0x90, 0xf1, 0x2d, 0x6d, 0x89, 0xc0, - 0x31, 0x52, 0x45, 0xb8, 0x09, 0x48, 0x1d, 0xf1, 0xc8, 0x95, 0x9f, 0xcd, 0xea, 0xa3, 0xe4, 0x23, 0xad, 0x69, 0x1f, 0x44, 0x71, 0x71, 0x54, 0x4e, 0xdc, 0x8a, 0x33, 0xcd, 0x1c, 0x05, 0xe9, 0xa4, - 0x25, 0x26, 0x51, 0xc9, 0xa8, 0xd3, 0xad, 0x51, 0x41, 0x5a, 0x35, 0xe2, 0x59, 0x1a, 0x9f, 0xe7, 0x54, 0x59, 0xaf, 0xb2, 0x95, 0x32, 0x03, 0xf9, 0x32, 0x59, 0xed, 0xa2, 0x47, 0x19, 0x79, 0xf7, - 0x29, 0x1a, 0xa5, 0xa6, 0x5e, 0x9d, 0xb5, 0x97, 0x5b, 0xf6, 0xc8, 0xef, 0x8d, 0x10, 0xf4, 0xca, 0x1b, 0xdb, 0x27, 0xbf, 0xac, 0x5e, 0x1c, 0x50, 0xcf, 0xd0, 0x69, 0xd0, 0x8a, 0x7b, 0x2f, 0x7d, - 0xbf, 0x36, 0x50, 0x9f, 0x99, 0xe8, 0xf2, 0x06, 0xf6, 0x4c, 0xac, 0xd7, 0x93, 0xcb, 0xa4, 0x86, 0x01, 0x0d, 0x5e, 0xad, 0x98, 0x2a, 0x31, 0xa1, 0x25, 0xd6, 0x26, 0xb8, 0x68, 0xb6, 0x47, 0xa3, - 0xf4, 0x38, 0xbc, 0x37, 0xbd, 0x29, 0x4d, 0x49, 0xae, 0x18, 0xf5, 0x3d, 0xa3, 0xa9, 0x48, 0xd3, 0x45, 0x12, 0xb5, 0xca, 0xe7, 0xce, 0x8e, 0x54, 0x4d, 0xdf, 0x88, 0x64, 0x95, 0xdf, 0x38, 0x0a, - 0xbe, 0xf3, 0xeb, 0x35, 0x68, 0x43, 0x88, 0x3d, 0x3b, 0x6a, 0xa9, 0x76, 0xc0, 0x5a, 0xab, 0xb0, 0x1b, 0x42, 0x40, 0xb8, 0xf6, 0xaf, 0x6d, 0x51, 0xd5, 0xf5, 0x9b, 0x7f, 0x6f, 0x53, 0x55, 0xf8, - 0x71, 0xa1, 0x3b, 0xaf, 0x7b, 0xd7, 0x4f, 0xeb, 0x23, 0x9f, 0xdd, 0xbb, 0x5e, 0x7f, 0xd2, 0x3d, 0xaf, 0xc2, 0x13, 0x1b, 0xd7, 0x15, 0xe6, 0x8d, 0x62, 0x95, 0x6d, 0x0d, 0x2d, 0xba, 0xeb, 0xe9, - 0x94, 0x16, 0xfd, 0xda, 0xea, 0x46, 0x05, 0xb6, 0x6b, 0x92, 0x5d, 0x8b, 0x6c, 0xd6, 0x1d, 0x96, 0x96, 0x40, 0x2a, 0xad, 0x8f, 0xcb, 0xbe, 0xe8, 0x03, 0x1d, 0xa8, 0x26, 0xb3, 0xbc, 0xd0, 0x2a, - 0xce, 0x93, 0x5b, 0xd2, 0xa8, 0xf0, 0x8e, 0xe4, 0x27, 0xfd, 0x56, 0x31, 0x03, 0xa5, 0x18, 0x91, 0x91, 0x7f, 0x20, 0x19, 0x03, 0xef, 0x78, 0xaf, 0x25, 0x15, 0x8d, 0x38, 0xcc, 0x35, 0x4c, 0xeb, - 0x7f, 0x6e, 0xf7, 0xa6, 0xc5, 0xd8, 0xd6, 0xcd, 0x7b, 0x83, 0x67, 0xc1, 0x5f, 0xc8, 0x33, 0x51, 0xef, 0x1b, 0xd0, 0x33, 0x52, 0x6e, 0x87, 0xe3, 0x0b, 0xa4, 0xc7, 0x58, 0x09, 0xf2, 0xa3, 0xc3, - 0x66, 0x44, 0x9c, 0x52, 0xcd, 0xaa, 0x13, 0x1d, 0xb2, 0x0b, 0x15, 0xb8, 0x21, 0xe8, 0x11, 0xcc, 0xa1, 0x62, 0x60, 0x4f, 0xed, 0x15, 0x36, 0x9a, 0xf5, 0x94, 0x5a, 0xe8, 0x3e, 0x0f, 0xf9, 0x6e, - 0x42, 0x42, 0x6d, 0xe0, 0x2f, 0x89, 0xb9, 0x41, 0x35, 0x3b, 0x5e, 0x69, 0x44, 0x87, 0xab, 0xe2, 0x9d, 0x8e, 0x2e, 0x61, 0x29, 0x15, 0xf7, 0x45, 0xa1, 0xfa, 0x8d, 0x25, 0x6b, 0xf1, 0x40, 0xab, - 0xef, 0xab, 0x5e, 0xa7, 0xc8, 0x10, 0xb6, 0x4a, 0x8b, 0x78, 0x6c, 0xe9, 0xd5, 0x77, 0xf5, 0x4d, 0x4f, 0xc8, 0xed, 0x17, 0xa8, 0x57, 0x2c, 0x5e, 0x8f, 0x2f, 0x35, 0x4e, 0x03, 0x64, 0x37, 0xb3, - 0x67, 0xc2, 0x68, 0xb7, 0xf0, 0xb1, 0x0a, 0x14, 0xb7, 0x5a, 0xed, 0xab, 0x29, 0x0d, 0x88, 0x78, 0x63, 0x26, 0x27, 0x93, 0x15, 0x05, 0xac, 0xb1, 0x6a, 0x77, 0x97, 0xd5, 0x74, 0xe7, 0xe3, 0xbb, - 0xc3, 0xc2, 0x87, 0xcd, 0x48, 0x10, 0xb2, 0xd1, 0xc9, 0x65, 0xbc, 0x7a, 0xab, 0x2f, 0xa7, 0xa3, 0x7e, 0xe1, 0x26, 0x08, 0xb4, 0xb1, 0x60, 0x04, 0x53, 0x10, 0xcc, 0x21, 0x96, 0x5d, 0x18, 0xea, - 0xed, 0xf3, 0xb2, 0x5b, 0x2f, 0xbb, 0xc4, 0x0c, 0xfd, 0xab, 0xb9, 0x08, 0x7e, 0x2e, 0x1e, 0x34, 0xd3, 0xd8, 0xb8, 0xcc, 0x3c, 0x7b, 0x1d, 0x3e, 0x76, 0xdd, 0x85, 0xc9, 0xf7, 0x0f, 0xc5, 0x7e, - 0x6c, 0x5f, 0xec, 0xd7, 0x77, 0x51, 0xa8, 0x9f, 0x8a, 0x8d, 0xff, 0xf1, 0xdf, 0xff, 0x18, 0xe4, 0x42, 0x4b, 0x8b, 0xd8, 0xb7, 0x6e, 0x6c, 0xf0, 0x37, 0x7a, 0xce, 0x5e, 0xc1, 0xde, 0x28, 0x7a, - 0x3d, 0x19, 0xea, 0x27, 0x03, 0x19, 0x73, 0x47, 0xb5, 0xd3, 0x39, 0xd3, 0xb3, 0x8d, 0xe3, 0x87, 0x25, 0x91, 0xc6, 0xeb, 0xd1, 0xce, 0x3f, 0xae, 0x69, 0x7f, 0x36, 0xda, 0xf7, 0x1b, 0x54, 0x30, - 0x5b, 0x48, 0x8e, 0xe4, 0x74, 0x91, 0x78, 0xf2, 0x69, 0x66, 0x6e, 0x37, 0x41, 0x05, 0x0a, 0xc4, 0x89, 0x6c, 0x19, 0x03, 0xac, 0x71, 0x7e, 0x59, 0x93, 0x9c, 0x41, 0x91, 0xca, 0x02, 0x49, 0x4e, - 0x55, 0x34, 0xc7, 0xa6, 0x84, 0xd1, 0x3c, 0xac, 0xfd, 0xbb, 0x4f, 0xd2, 0xb7, 0x91, 0x66, 0x5f, 0x74, 0x75, 0xf7, 0xec, 0x53, 0xea, 0x5b, 0x7f, 0x7e, 0xa9, 0x4e, 0xa5, 0x89, 0xf9, 0xb2, 0xbc, - 0x3e, 0xf1, 0xc1, 0xfb, 0xac, 0xca, 0x27, 0x9b, 0x67, 0x85, 0xe9, 0xd8, 0xf1, 0x2f, 0xe1, 0xa1, 0xaa, 0x4e, 0x12, 0x33, 0x4c, 0xa7, 0x69, 0x61, 0x03, 0x66, 0x1a, 0xc7, 0x7e, 0x79, 0xa6, 0xde, - 0xa0, 0xac, 0xb3, 0xb4, 0x68, 0xf5, 0xc2, 0xba, 0xbb, 0x4f, 0x80, 0xcf, 0xf9, 0x02, 0x5f, 0xa0, 0x5e, 0x89, 0x7f, 0x3d, 0x1e, 0x83, 0xc3, 0xbc, 0x81, 0x46, 0x2d, 0x2d, 0x40, 0x27, 0x9b, 0x54, - 0xd2, 0x72, 0xb7, 0x9f, 0xf2, 0xf4, 0xce, 0xc6, 0xbd, 0x19, 0x8c, 0x91, 0x15, 0x53, 0x1b, 0xf3, 0x54, 0x62, 0x0d, 0x54, 0xe3, 0x68, 0x9c, 0x3b, 0x6d, 0x0f, 0x4b, 0xae, 0x85, 0x5d, 0xde, 0x6c, - 0x97, 0x29, 0xd5, 0x76, 0xba, 0x11, 0xf5, 0xdb, 0x9e, 0xa7, 0xb1, 0x9e, 0x3a, 0xd1, 0x14, 0x0b, 0x6d, 0xb8, 0x20, 0x04, 0xb8, 0x0a, 0xdf, 0xee, 0x29, 0xfd, 0x98, 0xfe, 0xc4, 0xf3, 0xfc, 0x07, - 0x38, 0x68, 0xf0, 0x89, 0x53, 0xfe, 0x2a, 0x6c, 0x3d, 0xca, 0xbe, 0x9b, 0x64, 0xfe, 0x94, 0x2c, 0x7c, 0x83, 0x7b, 0x46, 0xdf, 0xdb, 0xd9, 0x90, 0x00, 0x19, 0x34, 0x9e, 0x8b, 0xbb, 0x6a, 0xbd, - 0xdb, 0x1e, 0x82, 0x4d, 0x46, 0xc3, 0x60, 0x9a, 0x78, 0x64, 0x39, 0x11, 0xa5, 0x58, 0xc6, 0x43, 0xf2, 0xa7, 0xdb, 0x65, 0xf9, 0x6d, 0x4e, 0x3d, 0xfc, 0xd4, 0x64, 0x97, 0x17, 0xa0, 0x97, 0x4f, - 0xbb, 0xe5, 0xd5, 0xc3, 0xc3, 0x26, 0xbb, 0x9c, 0xfc, 0x7c, 0x2b, 0x4a, 0xe8, 0x89, 0xb6, 0x97, 0xfb, 0x7a, 0x42, 0xd5, 0x4a, 0x3c, 0x72, 0xe6, 0x92, 0xb9, 0xe2, 0xdd, 0xcd, 0x64, 0xeb, 0xf3, - 0x13, 0x61, 0x64, 0xab, 0x7e, 0xb7, 0x27, 0x82, 0xd2, 0x3d, 0x4c, 0x73, 0xc8, 0x08, 0x0f, 0x9d, 0x5b, 0x81, 0x60, 0x4a, 0xef, 0xd2, 0x76, 0x42, 0x30, 0x56, 0x95, 0xf1, 0x4b, 0x5d, 0x17, 0xdc, - 0x4d, 0x45, 0x42, 0xb0, 0x40, 0xe9, 0xc6, 0x68, 0x36, 0xdb, 0x3c, 0xaa, 0x65, 0xf5, 0xf4, 0x72, 0x95, 0x94, 0x95, 0x1e, 0x45, 0xbb, 0xcb, 0x40, 0x8f, 0xcf, 0xf7, 0x3f, 0xb5, 0x99, 0x78, 0xbb, - 0x7e, 0x46, 0xdb, 0xff, 0x7a, 0x27, 0x42, 0xf4, 0xa2, 0x7d, 0x8b, 0xd9, 0xfe, 0xef, 0x61, 0xbc, 0xf8, 0x2f, 0xf2, 0x17, 0x84, 0x5f, 0x35, 0xbf, 0xb3, 0x16, 0x88, 0xbf, 0x2a, 0x81, 0xd0, 0x50, - 0x25, 0xf0, 0xd3, 0x5c, 0x93, 0x3b, 0x2e, 0xbb, 0x67, 0x04, 0xfc, 0x7b, 0xc8, 0x67, 0x62, 0xbe, 0x3f, 0x1f, 0x1a, 0xbf, 0xeb, 0x56, 0x69, 0x43, 0xf7, 0x5b, 0x15, 0xa5, 0xca, 0x39, 0x79, 0x8c, - 0x30, 0xd2, 0xd9, 0x4d, 0x95, 0x35, 0x56, 0x36, 0x3b, 0xb6, 0xd6, 0x7d, 0x43, 0x38, 0xa9, 0xe2, 0x7a, 0xce, 0xc6, 0x13, 0xde, 0xd8, 0xd7, 0xd3, 0x02, 0xdc, 0x3a, 0xd0, 0xc6, 0x17, 0xd2, 0x6c, - 0xb1, 0xa5, 0x38, 0x7f, 0x1e, 0xf8, 0xc7, 0xc9, 0xd4, 0x70, 0x74, 0x1d, 0x9e, 0x7b, 0xb8, 0x51, 0xd8, 0x22, 0x4e, 0x73, 0x87, 0xfd, 0x0a, 0x7c, 0x90, 0x36, 0xfa, 0x4d, 0xcb, 0xe2, 0x7b, 0x6b, - 0xf8, 0x79, 0xec, 0xfc, 0xf6, 0x96, 0x77, 0x98, 0xfa, 0xed, 0xde, 0x90, 0xb4, 0x51, 0x68, 0xbc, 0x68, 0xf3, 0xbe, 0x39, 0xc8, 0xc4, 0xc6, 0x85, 0x82, 0xd8, 0xda, 0x98, 0xb3, 0x00, 0x77, 0xcb, - 0x68, 0xb5, 0x74, 0xbb, 0x9f, 0x46, 0x79, 0x3f, 0x4f, 0xb4, 0xb9, 0xc7, 0x1c, 0x3f, 0xd7, 0x89, 0x3f, 0x40, 0x06, 0xc6, 0x1f, 0xcf, 0x87, 0xce, 0xdd, 0x15, 0xd7, 0x87, 0x1e, 0xda, 0x07, 0xc4, - 0x76, 0x07, 0x52, 0x94, 0x60, 0x37, 0xf2, 0x02, 0x0b, 0x9a, 0xa4, 0xa2, 0xaa, 0x5d, 0xa8, 0x72, 0xe4, 0x06, 0x42, 0xad, 0x93, 0x18, 0xf9, 0xe1, 0xba, 0x16, 0x2a, 0xb4, 0x9e, 0x51, 0xde, 0x92, - 0x5e, 0x06, 0x6c, 0xc7, 0x4e, 0x7c, 0x56, 0xc2, 0x7a, 0x86, 0xb5, 0xa3, 0x89, 0x35, 0xa3, 0x44, 0x4e, 0xa2, 0x55, 0xad, 0x2f, 0xd7, 0x27, 0x50, 0xd1, 0x67, 0x2c, 0x35, 0x34, 0xa5, 0xe4, 0xf1, - 0x3c, 0xa0, 0x1f, 0x0e, 0xf0, 0x79, 0x59, 0xab, 0x3f, 0xda, 0xe1, 0xff, 0x52, 0x37, 0xff, 0xbb, 0xd3, 0x88, 0xfe, 0xbe, 0xad, 0xea, 0xeb, 0x57, 0xdc, 0x08, 0xfe, 0xfb, 0x8d, 0x21, 0x1b, 0xd8, - 0x25, 0xc1, 0x93, 0x89, 0xad, 0x25, 0x74, 0x6c, 0x56, 0xa2, 0xaf, 0x65, 0x51, 0x35, 0xe5, 0xdc, 0xb0, 0xf6, 0xe5, 0xa4, 0xab, 0xc3, 0xfe, 0xb4, 0x05, 0x24, 0x9c, 0x9b, 0xad, 0x55, 0x04, 0xda, - 0xd8, 0xc8, 0x64, 0x01, 0x71, 0x39, 0x66, 0x80, 0x3b, 0x58, 0xf0, 0x54, 0x8c, 0x92, 0x37, 0x3e, 0xd5, 0x68, 0x99, 0x30, 0x13, 0x0f, 0x56, 0x9e, 0x8c, 0xa0, 0x95, 0xa9, 0xd3, 0x6d, 0xd2, 0xef, - 0xf7, 0x58, 0x33, 0x0d, 0x9e, 0x57, 0xe8, 0x1f, 0x4c, 0x6f, 0xb9, 0x37, 0x18, 0xea, 0x37, 0x8a, 0x3f, 0x56, 0x3b, 0xfe, 0x89, 0xa1, 0x0f, 0xdf, 0xe4, 0xf6, 0x12, 0xbf, 0xa0, 0x27, 0xf2, 0x59, - 0x6e, 0x69, 0xbd, 0x97, 0x54, 0xd6, 0x0b, 0x84, 0xc7, 0x04, 0x67, 0x5b, 0xfd, 0xd4, 0x76, 0x1a, 0x01, 0xb3, 0x21, 0xd1, 0x68, 0x2b, 0xae, 0xe2, 0xb8, 0xa2, 0x6b, 0x55, 0x50, 0xab, 0xd9, 0x6e, - 0x57, 0x15, 0xd6, 0xac, 0xd2, 0x0d, 0xdb, 0xd1, 0x36, 0xf4, 0x11, 0xd3, 0x16, 0x6b, 0xef, 0x50, 0xb9, 0x56, 0x9f, 0x44, 0xb5, 0x64, 0x97, 0x27, 0x2e, 0x16, 0xfc, 0x8a, 0x01, 0x77, 0x34, 0x3f, - 0xe2, 0x61, 0xbc, 0x54, 0xf6, 0x4b, 0x7b, 0xb3, 0x5b, 0xc1, 0xed, 0x76, 0xf2, 0x68, 0x67, 0xff, 0x66, 0xf5, 0x7f, 0xd0, 0xec, 0xbe, 0x50, 0xeb, 0xfd, 0xc4, 0xb9, 0x04, 0x07, 0xff, 0xfc, 0xd2, - 0x20, 0xf0, 0x13, 0xcf, 0x2e, 0xfc, 0xab, 0x63, 0xee, 0x03, 0xa7, 0x3c, 0xe8, 0xd9, 0xfe, 0xce, 0x58, 0x40, 0xbe, 0xf0, 0xf6, 0xf9, 0x97, 0x21, 0x3b, 0x69, 0x54, 0x57, 0xef, 0x03, 0x9a, 0x3f, - 0xe3, 0xb2, 0xff, 0xf6, 0xf7, 0x31, 0x98, 0x5f, 0xea, 0xba, 0x39, 0xc4, 0xc4, 0xf8, 0x98, 0xd3, 0xfc, 0x15, 0x9f, 0x61, 0x4f, 0xa5, 0xb8, 0xbc, 0x83, 0xfb, 0xc2, 0x6e, 0xd7, 0xb3, 0x4b, 0x57, - 0xcf, 0x01, 0xfa, 0x24, 0xcd, 0xaf, 0xdc, 0x9d, 0x38, 0xb5, 0x33, 0x7f, 0x7d, 0x6c, 0x05, 0x84, 0x96, 0x92, 0xc5, 0x69, 0x84, 0x1d, 0x92, 0x7d, 0x0d, 0x2f, 0x27, 0x47, 0xab, 0x37, 0x16, 0x02, - 0x8a, 0xd9, 0x6c, 0x0b, 0x35, 0x05, 0xd2, 0x4f, 0x90, 0x46, 0x63, 0xed, 0xce, 0xb6, 0xa0, 0x72, 0x4a, 0x79, 0x89, 0x61, 0xf2, 0x26, 0x05, 0xec, 0x8a, 0x6d, 0xb7, 0xc5, 0x24, 0x41, 0x2c, 0xc2, - 0x45, 0x8f, 0xea, 0x3b, 0x4a, 0x4b, 0x9f, 0x17, 0x33, 0x9f, 0xe7, 0x0f, 0x3c, 0x21, 0x41, 0x86, 0x98, 0x2d, 0x6f, 0x33, 0x16, 0xbe, 0xdc, 0x07, 0x90, 0xcb, 0xe4, 0x93, 0x67, 0x68, 0xa1, 0x5f, - 0x4a, 0xb8, 0x6f, 0x47, 0xe3, 0x2b, 0xa0, 0xc7, 0x44, 0x28, 0x96, 0x95, 0x45, 0xe3, 0x23, 0x61, 0x36, 0x59, 0x05, 0x36, 0xd3, 0xd0, 0x14, 0x54, 0x64, 0x79, 0xcf, 0x34, 0x21, 0x10, 0x22, 0x80, - 0x4f, 0x30, 0x36, 0x27, 0xfa, 0x45, 0xe7, 0x2b, 0xf5, 0x7a, 0x09, 0x2e, 0x5b, 0xca, 0xcc, 0xba, 0xf5, 0x96, 0xae, 0xe0, 0xa0, 0x32, 0xe8, 0x56, 0xd6, 0x25, 0xcb, 0x9b, 0x8d, 0x30, 0x02, 0x51, - 0xd1, 0x46, 0x69, 0xf1, 0x95, 0x19, 0x6c, 0x04, 0xbd, 0xf4, 0xa9, 0xe7, 0x2d, 0xfd, 0x4b, 0xd2, 0x80, 0xf3, 0x12, 0xec, 0x07, 0x7f, 0xc1, 0x3f, 0xf7, 0xd7, 0xfe, 0x93, 0xed, 0xbc, 0x5e, 0xe8, - 0xf0, 0xe1, 0xe2, 0xfb, 0x6f, 0xba, 0x63, 0xe3, 0x3f, 0x33, 0x32, 0xfc, 0x15, 0x2c, 0x30, 0x7e, 0x3b, 0x1e, 0x5f, 0x81, 0x3d, 0xa6, 0x3b, 0x67, 0x8f, 0x6c, 0x06, 0x2d, 0x40, 0xc0, 0x57, 0x92, - 0x8c, 0x3e, 0xcd, 0x48, 0x0c, 0xee, 0x11, 0x7a, 0xc4, 0x81, 0x93, 0x0a, 0x93, 0x38, 0x00, 0xe0, 0x82, 0x75, 0x2b, 0x59, 0xf0, 0x61, 0xbe, 0x64, 0xe2, 0xa2, 0x6b, 0x4f, 0x0e, 0xd6, 0x94, 0x5a, - 0xe4, 0xa1, 0x12, 0x1e, 0xf9, 0xa7, 0x08, 0x9f, 0x8c, 0xda, 0x1e, 0x20, 0xad, 0x51, 0xac, 0xef, 0x77, 0x74, 0xc8, 0x41, 0xf3, 0x55, 0xb8, 0x42, 0xd8, 0x47, 0x74, 0x7f, 0x14, 0xb6, 0x7a, 0xd2, - 0x11, 0xf3, 0x37, 0x11, 0xce, 0xb8, 0x17, 0xd2, 0x84, 0xa0, 0xa7, 0xfa, 0x2a, 0x5c, 0x61, 0xde, 0xd6, 0xa4, 0xd1, 0x8d, 0xaf, 0x60, 0x1e, 0x93, 0xc6, 0x71, 0xac, 0x38, 0x2d, 0x03, 0x9a, 0x04, - 0x89, 0x8e, 0x18, 0x45, 0x34, 0xc4, 0x6d, 0xc1, 0x80, 0x61, 0x69, 0xe9, 0x10, 0x1f, 0xeb, 0x08, 0x20, 0x20, 0xec, 0xe4, 0xaf, 0x58, 0x26, 0x48, 0x11, 0x6f, 0xc2, 0x0a, 0x7b, 0xd3, 0x2f, 0x5c, - 0x91, 0x4b, 0x54, 0x66, 0x9a, 0x60, 0x2e, 0x12, 0x57, 0x12, 0xb9, 0xe7, 0xd9, 0xe9, 0xc1, 0x08, 0x9d, 0x5a, 0x87, 0x96, 0x99, 0x9d, 0xc0, 0x18, 0xa0, 0x9a, 0xcf, 0xc7, 0x56, 0xae, 0xd3, 0x25, - 0xeb, 0xe4, 0x86, 0x8c, 0xdf, 0x13, 0xea, 0xdf, 0x0d, 0x73, 0xbf, 0xee, 0xaa, 0xbf, 0x67, 0xec, 0xbf, 0xbb, 0xfd, 0x49, 0x8d, 0x7f, 0x37, 0x54, 0x06, 0xfb, 0x3c, 0x11, 0xe6, 0xbb, 0x62, 0x9b, - 0x32, 0xd2, 0x3f, 0x4c, 0x9a, 0xf9, 0xa9, 0x8c, 0xf8, 0xc7, 0x79, 0xed, 0xd3, 0x00, 0xc7, 0xef, 0xa6, 0x7f, 0x9f, 0x11, 0x43, 0xfe, 0x98, 0xfd, 0x5e, 0x47, 0x7f, 0xdf, 0xe6, 0x7e, 0x5f, 0xa0, - 0x3c, 0xe6, 0xbe, 0xc9, 0x36, 0x73, 0x66, 0x84, 0x90, 0xf9, 0xcc, 0x3e, 0x9b, 0x44, 0x00, 0x8d, 0xef, 0x50, 0x8a, 0x9c, 0xe8, 0xab, 0x35, 0x7e, 0x04, 0xe8, 0xc9, 0x9e, 0x42, 0x98, 0xbd, 0x61, - 0x74, 0xb0, 0x23, 0x80, 0x60, 0x83, 0x32, 0x46, 0x23, 0x4c, 0x54, 0x85, 0x49, 0x75, 0x09, 0x92, 0x27, 0xc2, 0xa6, 0x44, 0x7c, 0x09, 0x43, 0xb2, 0xf5, 0x91, 0x60, 0x2a, 0x2d, 0xc4, 0x36, 0xf4, - 0x74, 0x85, 0x11, 0x3e, 0x24, 0x3f, 0xda, 0x95, 0x1f, 0x6d, 0xac, 0x43, 0xe2, 0xd9, 0x6e, 0x9a, 0xdd, 0x77, 0xb1, 0x3c, 0xe3, 0x44, 0x38, 0x03, 0x3c, 0xaf, 0xde, 0x34, 0xb3, 0x86, 0xb8, 0x06, - 0x2e, 0x61, 0x51, 0x1c, 0x33, 0xb8, 0x68, 0xa5, 0x5b, 0xa7, 0x26, 0x33, 0x00, 0x1a, 0xd6, 0x8d, 0x83, 0x15, 0xe5, 0x9b, 0xfc, 0x80, 0xe1, 0x48, 0x50, 0x4b, 0x89, 0x06, 0x29, 0x55, 0x88, 0x97, - 0x50, 0xb9, 0x92, 0xc8, 0x9a, 0x2b, 0x55, 0x89, 0x00, 0x4f, 0xf9, 0xaa, 0x3f, 0xe4, 0xa7, 0x83, 0x03, 0xd9, 0xfb, 0x7c, 0x56, 0x27, 0xed, 0x1e, 0xde, 0x86, 0x66, 0xcf, 0xd8, 0xba, 0xdd, 0x4f, - 0x37, 0x7b, 0xcd, 0x6b, 0x07, 0xda, 0xcc, 0x5f, 0xdb, 0x41, 0xff, 0x84, 0xe5, 0xeb, 0xe9, 0x85, 0x35, 0x2e, 0xec, 0xe0, 0xb5, 0xef, 0xc1, 0x57, 0x34, 0x79, 0xae, 0xe8, 0xec, 0x23, 0x68, 0x60, - 0xfc, 0xe9, 0xc2, 0xd0, 0xe2, 0xb2, 0xc3, 0x4a, 0x9b, 0x8c, 0x7c, 0x63, 0xe6, 0x9d, 0x08, 0xde, 0xf0, 0x68, 0x9b, 0xe0, 0x0f, 0x55, 0xca, 0x18, 0xb5, 0x80, 0x7a, 0xc0, 0xb6, 0xe6, 0xf7, 0xcb, - 0xf5, 0x68, 0x4d, 0x7a, 0x80, 0x3d, 0x51, 0xd3, 0x6a, 0x7d, 0x8c, 0x40, 0x67, 0xe2, 0x4a, 0x04, 0x7c, 0x9a, 0xcd, 0xa7, 0x1b, 0x77, 0xe5, 0xc1, 0x30, 0xbf, 0xd6, 0x56, 0xfc, 0x81, 0x3b, 0x4d, - 0xb6, 0x4a, 0xed, 0xd1, 0x05, 0x04, 0x16, 0xe4, 0xd2, 0x7a, 0x64, 0xf0, 0xfc, 0x0d, 0x09, 0xd7, 0x57, 0xa7, 0xc7, 0x3d, 0x16, 0xff, 0xf9, 0x16, 0xe5, 0xe9, 0xe5, 0x05, 0x87, 0xe5, 0x78, 0xe8, - 0xde, 0x04, 0x5b, 0x0d, 0x0f, 0x1e, 0x64, 0x9c, 0xb7, 0x03, 0x42, 0x0a, 0x95, 0xf5, 0xa2, 0xb0, 0xbd, 0xc0, 0xe8, 0xb7, 0x74, 0x30, 0xcf, 0x30, 0xe0, 0xb0, 0x11, 0x32, 0xac, 0xda, 0x67, 0xca, - 0xea, 0x80, 0xae, 0x97, 0x4b, 0x6d, 0x03, 0x01, 0x93, 0x93, 0x31, 0x97, 0x2a, 0x07, 0x28, 0x7d, 0x1a, 0xde, 0x29, 0x7b, 0x1b, 0xa4, 0x4c, 0x7d, 0x16, 0x1f, 0xaa, 0xe3, 0xb1, 0x57, 0x98, 0x95, - 0x31, 0xd9, 0xa1, 0x43, 0x13, 0x65, 0xef, 0x39, 0x85, 0x7e, 0x63, 0xf0, 0x47, 0xd2, 0xe4, 0x1a, 0x14, 0x1c, 0x84, 0xed, 0xb1, 0xe1, 0xbb, 0xfe, 0x7d, 0x1f, 0xfc, 0x47, 0x67, 0xc4, 0x0f, 0xb0, - 0xfe, 0x02, 0xf7, 0x86, 0xfd, 0xdb, 0xd9, 0x85, 0x0a, 0x03, 0x94, 0xb7, 0x6a, 0xd7, 0x4c, 0x37, 0xd5, 0xa4, 0xa0, 0xa2, 0x70, 0x0e, 0x32, 0x27, 0x50, 0x17, 0x7d, 0x81, 0xe2, 0x46, 0x7c, 0x76, - 0x40, 0x7b, 0x1f, 0x2e, 0x00, 0xce, 0xb6, 0xb1, 0x43, 0x28, 0xcd, 0x0c, 0x3d, 0x6f, 0x10, 0x4c, 0x62, 0x8f, 0xdb, 0xde, 0x68, 0x45, 0x67, 0xbe, 0xd3, 0xb4, 0x25, 0x18, 0x4a, 0x23, 0xc9, 0xc2, - 0x11, 0x10, 0x96, 0xd7, 0x1a, 0x9c, 0x01, 0xc6, 0x7a, 0xca, 0xa4, 0x12, 0x72, 0xf8, 0x5c, 0xe4, 0xf7, 0x1b, 0xfb, 0xfe, 0x07, 0x88, 0x8d, 0x72, 0xec, 0x44, 0xfa, 0xfd, 0xde, 0xde, 0xcf, 0xb8, - 0xc8, 0x5e, 0x80, 0xde, 0x10, 0x7d, 0x3e, 0x1c, 0x1c, 0xd7, 0xee, 0xc2, 0xf5, 0x1e, 0x10, 0xa1, 0x4d, 0xb0, 0x57, 0xcc, 0x2a, 0xcb, 0xdc, 0x15, 0xed, 0x3a, 0x3b, 0x1e, 0xac, 0x36, 0x87, 0x5a, - 0x93, 0x03, 0xcf, 0xdd, 0x16, 0x10, 0x11, 0xe6, 0xfb, 0x3a, 0xde, 0x46, 0x38, 0xed, 0x34, 0x08, 0xb3, 0xda, 0x45, 0xb6, 0x4c, 0xe4, 0x9a, 0xdc, 0xa7, 0xea, 0x6c, 0xbe, 0xa7, 0x97, 0xfb, 0xd9, - 0x14, 0xe5, 0xf8, 0x74, 0x01, 0x68, 0x27, 0x19, 0x61, 0x9a, 0x68, 0x2b, 0x3c, 0xc2, 0xf2, 0x60, 0xd3, 0xe6, 0x7b, 0x3c, 0xbe, 0x39, 0x40, 0xff, 0x56, 0x61, 0xf1, 0x02, 0xf7, 0x86, 0xcd, 0xdb, - 0xd9, 0x50, 0xe1, 0x11, 0x21, 0xec, 0xb4, 0x9e, 0xe3, 0x5b, 0x77, 0xc6, 0xb5, 0xfb, 0xd9, 0x26, 0xb4, 0x8e, 0x0b, 0xc6, 0xf7, 0x8e, 0x41, 0x85, 0x65, 0x92, 0x60, 0x30, 0x2e, 0x8a, 0x17, 0x55, - 0x14, 0x27, 0x3b, 0x21, 0x92, 0x0d, 0x37, 0x9e, 0x90, 0x2c, 0xbf, 0x2a, 0x36, 0x6b, 0xe3, 0x78, 0x9c, 0x4f, 0x76, 0x46, 0x22, 0xe8, 0x6b, 0xfb, 0xb4, 0xdd, 0x54, 0xbe, 0xc0, 0x93, 0x5e, 0x6c, - 0x4b, 0x81, 0xd4, 0xc3, 0x7b, 0x6b, 0x44, 0xff, 0x2c, 0xb2, 0xf8, 0x4f, 0xb8, 0xf8, 0x7e, 0x9f, 0x2f, 0x7d, 0x8f, 0x28, 0xcf, 0xf1, 0xf7, 0x3b, 0xd8, 0x37, 0xc2, 0xbc, 0xbb, 0x32, 0xd4, 0xe9, - 0x1b, 0xce, 0x03, 0x73, 0xc7, 0x79, 0x49, 0xb4, 0x38, 0x40, 0x61, 0x97, 0x2e, 0x42, 0x82, 0x57, 0x37, 0x3b, 0xbd, 0x5d, 0x62, 0x6b, 0xde, 0x00, 0xd8, 0x5e, 0x36, 0xb1, 0x96, 0x9a, 0x80, 0xb0, - 0xc7, 0xef, 0x79, 0xd0, 0x72, 0xe6, 0x52, 0x60, 0x2c, 0xc5, 0x4d, 0xe3, 0x42, 0x16, 0x6e, 0x3a, 0xc8, 0xd2, 0xb0, 0xe5, 0xb8, 0x92, 0xa9, 0x83, 0x61, 0x1c, 0x90, 0xbc, 0xd7, 0xe0, 0xbd, 0xed, - 0x51, 0x84, 0x32, 0x30, 0x81, 0xf2, 0x2b, 0x97, 0xfd, 0xcf, 0xcd, 0xfe, 0x7f, 0x8a, 0xba, 0x2f, 0xf9, 0x07, 0x7f, 0x23, 0x51, 0x2f, 0x20, 0xcf, 0xb4, 0xbc, 0x1c, 0x0c, 0x25, 0xa1, 0x38, 0x67, - 0x0f, 0x60, 0xa5, 0x2b, 0x22, 0xaf, 0x55, 0xcd, 0x4a, 0x5a, 0xd1, 0xd6, 0x64, 0xea, 0xd9, 0x65, 0x9c, 0xba, 0x5a, 0x51, 0xd5, 0x6a, 0x73, 0x50, 0xca, 0xf9, 0x52, 0xdb, 0x87, 0xf0, 0x4e, 0x1e, - 0xe9, 0x49, 0x99, 0xe5, 0x1a, 0xdc, 0x6c, 0x93, 0x94, 0x75, 0x89, 0x15, 0x03, 0x8d, 0xe4, 0x10, 0xc2, 0x39, 0x88, 0xa2, 0x05, 0xdf, 0x84, 0x26, 0xf5, 0x9c, 0x34, 0xa6, 0xa4, 0x09, 0xc7, 0xd8, - 0x23, 0xc3, 0xf1, 0xef, 0x10, 0x58, 0x69, 0x59, 0xd9, 0xd6, 0xd8, 0xf5, 0xcf, 0x0a, 0xac, 0x93, 0xde, 0x95, 0xff, 0x4f, 0x29, 0x8c, 0x1f, 0x61, 0x9f, 0x71, 0xfa, 0xf1, 0xca, 0xd0, 0x0c, 0xd5, - 0xb0, 0x9b, 0xd6, 0x0c, 0xaf, 0x04, 0xeb, 0x5c, 0xab, 0x67, 0x86, 0xb4, 0xec, 0x59, 0xf2, 0x40, 0x21, 0x5c, 0x2f, 0x7a, 0xed, 0x6a, 0x42, 0x40, 0xe9, 0x5c, 0xd9, 0x75, 0xfd, 0x21, 0x1d, 0x6d, - 0x04, 0x6d, 0x35, 0xca, 0x12, 0x51, 0x10, 0x4e, 0xb5, 0x69, 0x85, 0x05, 0xaf, 0x35, 0x21, 0x2b, 0x25, 0x85, 0x83, 0xc9, 0x52, 0x29, 0x6e, 0x47, 0xab, 0x35, 0x48, 0xcd, 0x5a, 0x98, 0x32, 0x25, - 0x9a, 0x5d, 0x3d, 0x52, 0x19, 0xbf, 0xc9, 0x50, 0x2d, 0xea, 0x4f, 0x93, 0x61, 0xff, 0x92, 0x0d, 0x7c, 0x9f, 0x38, 0xbe, 0x6d, 0xdb, 0x04, 0x86, 0xde, 0xe5, 0xef, 0x67, 0x06, 0x98, 0xdf, 0x60, - 0x9e, 0x6d, 0xd3, 0xeb, 0xd1, 0xd0, 0x81, 0xe5, 0x96, 0xd9, 0xe5, 0xde, 0xac, 0x51, 0xa1, 0x29, 0x8a, 0x47, 0xaa, 0x66, 0x1e, 0xf2, 0x69, 0xb6, 0x19, 0xcd, 0xab, 0xad, 0x24, 0x1e, 0xac, 0xd5, - 0x96, 0xc3, 0x81, 0x99, 0x83, 0x05, 0x25, 0xdc, 0xa7, 0xb5, 0x5c, 0xe6, 0x0b, 0x62, 0x85, 0x97, 0xf3, 0x93, 0x5f, 0xad, 0xa6, 0x23, 0x62, 0x73, 0xdc, 0xc0, 0xd4, 0xc6, 0x52, 0x79, 0x76, 0x69, - 0xd5, 0x54, 0xcf, 0xa2, 0xe5, 0x3c, 0x49, 0x0f, 0x62, 0x92, 0xeb, 0x1f, 0x88, 0xf0, 0x26, 0x2e, 0xde, 0x92, 0x07, 0xde, 0x90, 0xf7, 0x5d, 0xf9, 0xf8, 0x30, 0xb1, 0xe2, 0xd8, 0x45, 0x5a, 0xbe, - 0x7a, 0x09, 0xde, 0x11, 0xeb, 0xce, 0x6b, 0x32, 0xbd, 0x2a, 0xec, 0x34, 0xf9, 0xf6, 0x3d, 0x6d, 0xdb, 0xfe, 0xba, 0x3d, 0x77, 0x79, 0xd9, 0x4f, 0xdf, 0x61, 0xa6, 0x49, 0x59, 0x47, 0xd5, 0xf9, - 0xb3, 0xbf, 0x7b, 0xcd, 0x15, 0xec, 0x85, 0x80, 0xb7, 0xd1, 0x1f, 0xef, 0x5e, 0x71, 0x3b, 0xfa, 0xdf, 0xdf, 0x30, 0xd2, 0x77, 0x2e, 0x0e, 0xf4, 0xa9, 0xd2, 0xed, 0xcf, 0x2e, 0x0e, 0xf4, 0x71, - 0x99, 0xf6, 0x99, 0x8b, 0xcc, 0x6e, 0x3e, 0xdb, 0x14, 0xb9, 0x09, 0x1c, 0x2d, 0x53, 0x99, 0x27, 0xfe, 0xda, 0xeb, 0x57, 0x28, 0x3c, 0xa2, 0xfb, 0xdd, 0xc8, 0xe5, 0xda, 0x58, 0xee, 0xf9, 0xdd, - 0xdc, 0x94, 0xa6, 0xe2, 0xb1, 0xed, 0x76, 0xf5, 0x64, 0x32, 0xe9, 0x80, 0x4d, 0x50, 0x9f, 0x14, 0x56, 0x03, 0xe6, 0x4b, 0x66, 0x89, 0x6f, 0xd3, 0x1c, 0xe2, 0xfc, 0x7e, 0xcb, 0x4f, 0x94, 0x6e, - 0x6f, 0x36, 0x24, 0x8f, 0xf2, 0xda, 0x6a, 0xfb, 0x17, 0xe5, 0xe4, 0x20, 0x17, 0xc7, 0xed, 0x33, 0x8d, 0x6e, 0x6c, 0xd9, 0x8e, 0x5e, 0x47, 0x7f, 0x6f, 0xaf, 0xad, 0xdf, 0xa0, 0xbf, 0x21, 0xf6, - 0xed, 0xda, 0x10, 0x4f, 0x08, 0x34, 0xde, 0x6d, 0xb3, 0xca, 0x6c, 0x8c, 0x45, 0x8a, 0x93, 0x74, 0xae, 0x43, 0x1b, 0x2c, 0xb5, 0x0a, 0x14, 0xf5, 0xed, 0x4d, 0x1b, 0xfe, 0x30, 0x49, 0xe2, 0xd3, - 0x60, 0xe9, 0xaf, 0xbe, 0xf6, 0xb9, 0xe6, 0xa2, 0xef, 0x01, 0x9f, 0x3f, 0xf4, 0xdd, 0xe9, 0xd0, 0x46, 0xa3, 0x8d, 0x7d, 0x3c, 0x7a, 0xa2, 0x3e, 0x9a, 0x41, 0xe2, 0x64, 0xd3, 0x27, 0x8d, 0x27, - 0x2f, 0x4f, 0x06, 0xe9, 0xe8, 0xa7, 0xa8, 0x68, 0xe5, 0xe4, 0x54, 0xda, 0x33, 0xda, 0xa0, 0x33, 0x14, 0x23, 0x18, 0xb0, 0x65, 0x39, 0x3f, 0x85, 0x0d, 0x7e, 0xb7, 0x49, 0x82, 0xe3, 0xcc, 0xdb, - 0x06, 0xa3, 0xa3, 0x4f, 0xe7, 0x38, 0x74, 0x2a, 0xb6, 0x0b, 0x4f, 0x0c, 0x29, 0x5f, 0x3d, 0x84, 0xd8, 0xbc, 0x77, 0xc5, 0xed, 0x23, 0x57, 0xd9, 0xfd, 0x2d, 0xe1, 0x16, 0x7d, 0xbb, 0x62, 0xee, - 0xcf, 0x2f, 0x03, 0xa7, 0x37, 0xdc, 0x5c, 0x7a, 0x6b, 0xfc, 0xf9, 0x6f, 0x4f, 0xd7, 0x2d, 0xfc, 0x8d, 0xb3, 0xcf, 0x7e, 0xe8, 0x3b, 0xfd, 0x38, 0x45, 0xfc, 0x2b, 0x6e, 0xf8, 0x38, 0x57, 0x7c, - 0x38, 0x37, 0xbc, 0xc2, 0xbd, 0x30, 0xc3, 0xeb, 0xd9, 0xf8, 0x02, 0xef, 0x11, 0xbf, 0x87, 0x9e, 0x8f, 0x95, 0x45, 0x98, 0xa6, 0x81, 0x7f, 0x12, 0xcc, 0x3d, 0xa1, 0xc3, 0x90, 0x6a, 0x74, 0x5b, - 0x59, 0x1e, 0xa5, 0x7f, 0x49, 0x2a, 0x80, 0xbf, 0xc8, 0x5f, 0x10, 0x35, 0x04, 0x2f, 0x67, 0x96, 0xa8, 0xc6, 0xdf, 0xb6, 0x8b, 0x78, 0xce, 0x80, 0xfe, 0x00, 0xf9, 0x8c, 0x9b, 0xf7, 0xe7, 0x83, - 0x4d, 0x69, 0x6b, 0x36, 0xd3, 0x6a, 0x94, 0x86, 0xf9, 0x6e, 0xb5, 0x21, 0xd8, 0x02, 0x80, 0xfb, 0xc5, 0xa8, 0xc5, 0x82, 0xd8, 0xa8, 0x43, 0x68, 0x76, 0x98, 0x24, 0x4c, 0x2b, 0x31, 0x62, 0x33, - 0xe9, 0xcb, 0x6c, 0xb2, 0x0e, 0xa7, 0x8c, 0x21, 0xe9, 0xe4, 0xe2, 0x24, 0x43, 0x91, 0xeb, 0x1d, 0x4d, 0x7d, 0xb1, 0x9e, 0x26, 0x92, 0xe2, 0x1b, 0xc1, 0x4c, 0x8d, 0x72, 0x82, 0xa0, 0x54, 0x08, - 0xe8, 0xb0, 0xd3, 0xc3, 0x72, 0x91, 0xbf, 0x41, 0x33, 0x7d, 0x97, 0x68, 0x70, 0x4f, 0xce, 0x3e, 0xb1, 0x6b, 0xdd, 0x80, 0x5e, 0x90, 0x79, 0x3d, 0xbc, 0x48, 0xd5, 0x87, 0x0d, 0x46, 0x76, 0x06, - 0x14, 0x6c, 0x2d, 0x47, 0x64, 0xc5, 0x76, 0xdd, 0xac, 0x99, 0x0d, 0xb3, 0x54, 0x70, 0x57, 0x51, 0x20, 0xc3, 0xf9, 0x5a, 0xaa, 0x0e, 0x90, 0x19, 0xf7, 0x73, 0x1e, 0xda, 0x42, 0xcf, 0xb2, 0xcb, - 0xbb, 0x87, 0xf4, 0xd1, 0x78, 0x97, 0x73, 0xf1, 0x15, 0xa2, 0xe0, 0xa7, 0x6a, 0x94, 0x5e, 0x80, 0x5e, 0x10, 0x75, 0x3d, 0xbc, 0x74, 0x62, 0x19, 0x50, 0x9f, 0x14, 0x02, 0xcd, 0x42, 0x57, 0x51, - 0xe0, 0x18, 0xe9, 0x88, 0xd2, 0x77, 0xdb, 0x69, 0xb3, 0x17, 0x79, 0xf5, 0x68, 0xaf, 0x96, 0x4d, 0xce, 0x6f, 0xaa, 0x24, 0x9f, 0x58, 0x75, 0xbf, 0x5f, 0x66, 0x7d, 0x26, 0x6a, 0x3d, 0x5d, 0x86, - 0x9b, 0xad, 0xa7, 0xc1, 0x9b, 0x11, 0x93, 0x4c, 0xfc, 0xdd, 0x96, 0xea, 0x17, 0xbb, 0x74, 0x35, 0xb7, 0xb7, 0x99, 0xba, 0x39, 0xe9, 0xa8, 0x75, 0xb4, 0xb5, 0x95, 0x98, 0xdb, 0xed, 0xf7, 0x2d, - 0x0c, 0xcf, 0x3f, 0xa3, 0x48, 0xf4, 0x68, 0x5c, 0x46, 0xe9, 0x77, 0x0c, 0xf3, 0x73, 0xc7, 0xcb, 0x07, 0xc8, 0x17, 0x64, 0xbc, 0x3b, 0x1f, 0xea, 0x7c, 0xe1, 0xc1, 0xd9, 0x04, 0x5a, 0x4f, 0x81, - 0x52, 0xe8, 0xb4, 0x88, 0x30, 0x57, 0x29, 0x41, 0x26, 0x98, 0x25, 0x11, 0xb6, 0xbc, 0x6b, 0xdb, 0xec, 0x28, 0xf8, 0xaa, 0xe4, 0xed, 0x7b, 0xee, 0xa4, 0x1d, 0xe8, 0xad, 0x5c, 0x4f, 0xc8, 0x26, - 0x4a, 0xa4, 0x79, 0xc7, 0x9e, 0xac, 0xe2, 0xb0, 0x4f, 0xc3, 0x12, 0x57, 0x05, 0xf6, 0x90, 0xcc, 0x1d, 0xa3, 0xd7, 0x0f, 0x16, 0xa6, 0xb0, 0x81, 0xe7, 0xba, 0xa3, 0xe6, 0x79, 0xfb, 0xe5, 0xeb, - 0x68, 0xc5, 0x07, 0x0e, 0xbc, 0x9b, 0xe1, 0x57, 0xfa, 0x96, 0x3d, 0x36, 0x3d, 0x3d, 0x49, 0xec, 0xe8, 0xcf, 0x7f, 0xfb, 0xad, 0x00, 0x7c, 0xa8, 0x00, 0xf8, 0x63, 0x58, 0xd5, 0xb8, 0x9f, 0xe9, - 0x96, 0x55, 0xfc, 0x0a, 0xee, 0x3b, 0xd3, 0xa8, 0x67, 0x94, 0xad, 0x17, 0xa8, 0x67, 0x7a, 0xbe, 0x1c, 0x8f, 0x2f, 0xb0, 0x1e, 0xd3, 0x12, 0xdc, 0xac, 0x00, 0x1c, 0x24, 0x4e, 0xe9, 0x69, 0xb7, - 0x4f, 0x97, 0xc4, 0x22, 0xe0, 0xa0, 0xb9, 0xb3, 0x33, 0xd8, 0x54, 0x06, 0x47, 0x46, 0xb5, 0xf7, 0xcd, 0xa0, 0x14, 0x77, 0x8a, 0x18, 0x79, 0x80, 0xa7, 0x75, 0x21, 0x47, 0x6e, 0xb2, 0x78, 0xeb, - 0x10, 0xf5, 0xb1, 0x15, 0x14, 0x44, 0x1a, 0xe9, 0xa1, 0x86, 0x4b, 0x40, 0x0b, 0x91, 0x5a, 0xa4, 0xee, 0x96, 0x93, 0xa3, 0xea, 0x1f, 0x65, 0x81, 0x47, 0xdc, 0x9f, 0x39, 0xd2, 0x86, 0x19, 0x8f, - 0x45, 0x61, 0xbb, 0x75, 0xa4, 0x17, 0xe3, 0x2c, 0xaa, 0x8b, 0xfb, 0x69, 0x2f, 0x4f, 0xaa, 0x70, 0x9f, 0xa1, 0x9f, 0x71, 0xf9, 0xf9, 0xda, 0x50, 0x65, 0x6e, 0x7b, 0x98, 0xb0, 0x1b, 0x79, 0xaf, - 0x27, 0xee, 0x16, 0x61, 0x1c, 0x49, 0x98, 0x4b, 0xbc, 0x17, 0x2b, 0xa2, 0xb8, 0x91, 0x66, 0x65, 0xe1, 0xae, 0x48, 0x64, 0x4d, 0x2e, 0x76, 0x48, 0xa0, 0x76, 0x23, 0xbe, 0x3d, 0xe6, 0xbe, 0x04, - 0x03, 0x7a, 0xaa, 0x24, 0xd6, 0x51, 0xc4, 0x50, 0x08, 0x0f, 0x58, 0x06, 0xa9, 0xf5, 0x85, 0xcb, 0x2e, 0x89, 0xc4, 0x8c, 0x6d, 0x44, 0xa5, 0x3a, 0x90, 0x72, 0x35, 0xe4, 0x3f, 0x62, 0x8b, 0x2a, - 0xc7, 0x7a, 0xe1, 0xd6, 0xdf, 0x4d, 0xfe, 0x83, 0x9e, 0x93, 0xbe, 0xef, 0x00, 0x9f, 0x11, 0xfb, 0xee, 0xf4, 0x22, 0x73, 0x06, 0x48, 0xe1, 0x93, 0xe0, 0x81, 0x52, 0x5c, 0x91, 0x1c, 0x83, 0x63, - 0x25, 0xd7, 0x37, 0x9d, 0x1c, 0x2b, 0xee, 0x0a, 0xaa, 0x7a, 0x24, 0xde, 0xe4, 0x04, 0x1a, 0x2d, 0x68, 0x30, 0x66, 0x49, 0xf6, 0xa8, 0x99, 0xe9, 0xaa, 0xdf, 0xf0, 0xfd, 0xcc, 0xc3, 0x97, 0x71, - 0x71, 0x8c, 0x11, 0x0b, 0x22, 0x43, 0x1c, 0x4c, 0x96, 0x76, 0x31, 0x25, 0x69, 0x6a, 0x13, 0x93, 0xe1, 0xb1, 0x26, 0x89, 0xde, 0xd9, 0xcd, 0x13, 0xf6, 0x69, 0x87, 0xef, 0x03, 0x1c, 0x16, 0x7a, - 0xe7, 0x7f, 0xa3, 0x55, 0x3e, 0xe5, 0xe7, 0x78, 0x83, 0xfb, 0x82, 0xc1, 0xeb, 0xd9, 0xa5, 0x16, 0x67, 0xc0, 0x42, 0xef, 0x7b, 0x10, 0xdf, 0x91, 0x15, 0x98, 0xf6, 0xe9, 0x4c, 0xdd, 0x2e, 0x46, - 0xb5, 0x61, 0xc3, 0x78, 0x6f, 0x4f, 0xf7, 0x9c, 0x6a, 0x6e, 0x56, 0xc2, 0x5a, 0x5b, 0xfb, 0xa4, 0x37, 0x29, 0xe6, 0xa8, 0x6f, 0x4d, 0xd9, 0xb8, 0x44, 0xa7, 0x0b, 0x4a, 0xac, 0x36, 0x44, 0x3e, - 0x89, 0x20, 0x23, 0xf5, 0x31, 0x7e, 0xd6, 0xcf, 0xb3, 0xa0, 0x6c, 0x0d, 0x6c, 0x2d, 0xc4, 0xcb, 0xa9, 0xb1, 0xcd, 0x02, 0xfd, 0xd8, 0xdf, 0x61, 0xca, 0x6f, 0xd1, 0x73, 0x0d, 0x50, 0xfd, 0xdd, - 0xfc, 0x75, 0x85, 0x7a, 0x45, 0xcd, 0xf5, 0x78, 0x28, 0x67, 0xf5, 0x13, 0x6a, 0x5a, 0xd4, 0x5b, 0x3d, 0x0e, 0xba, 0x98, 0x84, 0x7c, 0x78, 0xad, 0x21, 0xf2, 0x36, 0xc1, 0x50, 0x61, 0xb3, 0x28, - 0xc5, 0xbe, 0x5c, 0xdb, 0x29, 0x7e, 0x6a, 0x38, 0x64, 0xb9, 0x5e, 0xa3, 0x53, 0xba, 0x14, 0xb9, 0x09, 0xee, 0x4b, 0x75, 0x95, 0xc1, 0xfb, 0x94, 0x20, 0x78, 0x67, 0xca, 0xd5, 0xe9, 0xa9, 0xcc, - 0xca, 0x95, 0xd7, 0xeb, 0x42, 0xca, 0x43, 0x7d, 0x37, 0x65, 0xbc, 0x39, 0xff, 0x68, 0xb5, 0x7e, 0xef, 0xc0, 0x7e, 0x8b, 0x14, 0x7e, 0x6e, 0x3f, 0xf6, 0x0a, 0xe0, 0x59, 0x23, 0x69, 0xb0, 0x2f, - 0xfa, 0x82, 0xc7, 0x44, 0x2f, 0xba, 0xf1, 0x37, 0x65, 0x51, 0xcf, 0x45, 0xde, 0x3f, 0x82, 0x7e, 0xa1, 0xd9, 0xeb, 0x85, 0xa1, 0x91, 0x77, 0x6d, 0xcb, 0x48, 0x47, 0xbb, 0xc4, 0xb3, 0x59, 0x67, - 0x75, 0xf5, 0xc2, 0xb7, 0x4a, 0x9b, 0xe0, 0xcb, 0xe5, 0xa9, 0x32, 0x56, 0x84, 0x72, 0xb0, 0x65, 0x26, 0xed, 0x5d, 0x09, 0x70, 0x89, 0xc2, 0x02, 0x4f, 0xb2, 0x1f, 0x1f, 0xb9, 0xa8, 0xd1, 0x24, - 0x06, 0xd8, 0xc0, 0x5b, 0x57, 0xdb, 0x07, 0x4a, 0x47, 0xc0, 0xd8, 0xca, 0xb1, 0x23, 0xd6, 0x3e, 0x98, 0xcc, 0x96, 0x22, 0xe2, 0xb8, 0x92, 0x16, 0xea, 0xf3, 0x36, 0xf3, 0xed, 0x0b, 0xec, 0x53, - 0x65, 0x27, 0xe5, 0xa5, 0x66, 0xef, 0xdf, 0x9e, 0xee, 0xba, 0x30, 0x50, 0x5a, 0x1b, 0x69, 0x1a, 0xd9, 0x7a, 0x32, 0x4e, 0x8d, 0xc0, 0xbe, 0xdb, 0x75, 0x0e, 0x7a, 0x2a, 0x25, 0xf7, 0x37, 0xe8, - 0x37, 0x32, 0x7d, 0xb8, 0x76, 0xa9, 0xff, 0x18, 0x10, 0x64, 0x76, 0x67, 0x47, 0x7d, 0xb3, 0x5c, 0xc7, 0x49, 0x80, 0xea, 0xca, 0xa9, 0x0b, 0xf0, 0xe3, 0xb2, 0x53, 0x0f, 0x99, 0x25, 0xea, 0x6d, - 0x75, 0x60, 0x97, 0x32, 0x66, 0x1a, 0x23, 0xbb, 0xaf, 0x84, 0x85, 0xd9, 0x3b, 0xb8, 0x19, 0xd4, 0x7b, 0xab, 0x6d, 0x6c, 0x4c, 0x5b, 0x31, 0x8e, 0xab, 0xe6, 0x4b, 0xd4, 0xc6, 0x08, 0x3a, 0x81, - 0x66, 0x10, 0xbd, 0x71, 0xc8, 0xa9, 0x86, 0x84, 0xc7, 0x42, 0x94, 0xf2, 0xe3, 0xf3, 0x0a, 0xe3, 0x83, 0x2a, 0x80, 0xdf, 0x63, 0x6c, 0xcf, 0x65, 0x68, 0xff, 0x63, 0x61, 0xa4, 0x8f, 0x05, 0xe1, - 0x5f, 0xf3, 0x04, 0xfc, 0x9c, 0x98, 0x7d, 0x81, 0x7b, 0xe5, 0x86, 0x97, 0xb3, 0x8b, 0xcf, 0x7d, 0x80, 0xa8, 0x4d, 0xca, 0xba, 0xad, 0x4e, 0x9a, 0xb3, 0x55, 0x71, 0x82, 0x2f, 0xba, 0x88, 0x62, - 0xa7, 0xe2, 0xa8, 0xce, 0x92, 0x29, 0xa8, 0x81, 0x13, 0x37, 0x6b, 0x93, 0x2a, 0xdb, 0x91, 0x54, 0x0c, 0x2d, 0x81, 0x3d, 0x3b, 0x07, 0x7b, 0xce, 0xe9, 0x1d, 0x76, 0x7b, 0x00, 0x28, 0x45, 0x07, - 0xf0, 0xad, 0x56, 0x06, 0xa0, 0x6e, 0x66, 0x4c, 0x40, 0xf3, 0xe0, 0x66, 0x0e, 0x9d, 0xf6, 0xb8, 0x66, 0xb1, 0x11, 0x85, 0xfd, 0xb0, 0x1e, 0xf4, 0x9f, 0x22, 0x48, 0x5a, 0xd8, 0x6f, 0xfe, 0xb4, - 0x3b, 0xb2, 0xf4, 0x49, 0x61, 0xfa, 0x0e, 0xf6, 0x8d, 0x2e, 0x6f, 0x17, 0xc6, 0xf0, 0xc0, 0x0e, 0x5c, 0x92, 0x14, 0x9c, 0xa2, 0x86, 0x9d, 0x85, 0x33, 0xe8, 0xb8, 0x6e, 0x67, 0x46, 0x91, 0x4e, - 0x96, 0x5b, 0x63, 0x64, 0xd6, 0x61, 0x5d, 0x84, 0x33, 0x85, 0xeb, 0x96, 0x27, 0x62, 0x86, 0xa4, 0xdc, 0x04, 0x3b, 0x51, 0x85, 0x81, 0xa5, 0xae, 0x19, 0x96, 0xdb, 0x29, 0xd6, 0x2e, 0xa7, 0xba, - 0x65, 0xaa, 0x69, 0x8a, 0x13, 0xee, 0xa1, 0x00, 0x46, 0xc8, 0x62, 0xde, 0xed, 0x3c, 0x04, 0x42, 0xd0, 0xde, 0xc7, 0x8b, 0xe7, 0xa5, 0xe9, 0x47, 0x8b, 0xed, 0x1f, 0x21, 0x99, 0xa5, 0x57, 0xf6, - 0x23, 0xd1, 0xfa, 0x4c, 0xce, 0xce, 0x47, 0xd0, 0x57, 0x8a, 0xbd, 0xbb, 0x30, 0x34, 0x73, 0x47, 0xde, 0x45, 0xb3, 0x3d, 0x06, 0xa3, 0x6d, 0x2a, 0x82, 0xa4, 0x9e, 0x6a, 0xf3, 0xde, 0x43, 0x00, - 0x0d, 0x37, 0x3d, 0xea, 0x08, 0x30, 0x8a, 0xca, 0x2c, 0x45, 0x80, 0xd6, 0x25, 0x0e, 0xdc, 0x85, 0x9b, 0x1c, 0xad, 0xe0, 0x75, 0x0b, 0x4b, 0x30, 0x82, 0x50, 0xd5, 0x4e, 0x8d, 0xdb, 0xfa, 0x90, - 0x1e, 0x09, 0x96, 0x8d, 0x26, 0x53, 0x83, 0x5f, 0x45, 0x27, 0x38, 0xee, 0x04, 0x80, 0xc5, 0xfa, 0x10, 0x7c, 0xa4, 0xb7, 0xfc, 0xa7, 0x5d, 0x5f, 0xf6, 0xa9, 0xfa, 0xa6, 0xfc, 0xe9, 0xb9, 0xce, - 0x07, 0x6f, 0x60, 0xaf, 0x44, 0xba, 0x9d, 0x0c, 0xe9, 0x7c, 0x00, 0x8d, 0xf3, 0x55, 0x3b, 0x95, 0x21, 0x5b, 0x22, 0xa7, 0xc4, 0xde, 0x59, 0xea, 0x5e, 0x6d, 0xe7, 0xaa, 0x49, 0xba, 0xfd, 0x68, - 0xbb, 0xfa, 0x4b, 0x28, 0x1e, 0x3c, 0x95, 0xce, 0x2f, 0xc7, 0x4e, 0x1d, 0x45, 0xad, 0x6f, 0x55, 0xde, 0xf8, 0xd2, 0xdb, 0x36, 0x4b, 0xef, 0x2b, 0xde, 0xc8, 0x73, 0x1e, 0xdd, 0xaf, 0xdf, 0x71, - 0x45, 0xd7, 0x57, 0x77, 0x2e, 0x4d, 0x81, 0x06, 0x48, 0xa3, 0xbe, 0x8b, 0x63, 0x6c, 0x54, 0x8f, 0xca, 0x69, 0xb9, 0x53, 0xba, 0x19, 0x95, 0x73, 0xba, 0x1d, 0x1c, 0x90, 0xd9, 0xbc, 0xf1, 0xa6, - 0x1b, 0x33, 0xda, 0x58, 0x7e, 0x7f, 0xd4, 0xd7, 0x72, 0xbd, 0xa4, 0x49, 0x44, 0x62, 0x03, 0x83, 0x48, 0x76, 0xf5, 0x22, 0xb1, 0xac, 0xe9, 0x72, 0xd1, 0x80, 0x5e, 0x38, 0xda, 0x1c, 0x89, 0xc9, - 0x96, 0x8e, 0x4a, 0xc5, 0xde, 0xa0, 0xb2, 0xed, 0xe2, 0xcc, 0x01, 0x57, 0xc5, 0xbf, 0xc8, 0xdc, 0x03, 0x95, 0x32, 0xd7, 0x4e, 0xec, 0x42, 0xaf, 0xd2, 0x62, 0xfc, 0x92, 0x65, 0xf8, 0x8d, 0xf4, - 0x80, 0x9e, 0xc2, 0xf9, 0xef, 0xaf, 0xb8, 0x62, 0xfc, 0xf7, 0xeb, 0xd7, 0x18, 0xdb, 0x00, 0x84, 0x07, 0x25, 0x13, 0x74, 0x54, 0x84, 0x74, 0xbe, 0xca, 0x88, 0x23, 0xa1, 0x54, 0xad, 0x78, 0xd2, - 0x32, 0x82, 0xc9, 0x9f, 0x74, 0x55, 0x61, 0xcb, 0x6c, 0x63, 0x65, 0xd1, 0x5c, 0x3e, 0xac, 0xa8, 0x26, 0x87, 0x7c, 0xcd, 0x5d, 0xd9, 0xa1, 0x3d, 0x05, 0x59, 0x08, 0x27, 0x72, 0xbb, 0x26, 0x71, - 0xb3, 0x17, 0xf5, 0x93, 0x6d, 0x21, 0x39, 0x20, 0xf7, 0x75, 0x0b, 0x96, 0x2d, 0x0b, 0xfa, 0x05, 0x4b, 0x0e, 0x4c, 0x37, 0xfe, 0xaf, 0xa0, 0x70, 0x7d, 0x23, 0x7c, 0x9e, 0x9b, 0x13, 0x7e, 0x83, - 0x79, 0x23, 0xec, 0x59, 0xec, 0x0c, 0x9c, 0x13, 0x8e, 0x2d, 0xc0, 0x6a, 0x53, 0x4d, 0xf6, 0xf3, 0x55, 0xcc, 0xe7, 0xb3, 0x84, 0x9d, 0xc0, 0xde, 0x02, 0x9f, 0x64, 0x70, 0x6e, 0x6e, 0x98, 0xb9, - 0x55, 0xa7, 0x68, 0xa5, 0xd5, 0xd4, 0x76, 0x0f, 0x2c, 0x71, 0x4e, 0x6c, 0x00, 0xd7, 0xf3, 0x3a, 0x04, 0x4c, 0x31, 0xac, 0x76, 0x74, 0xe7, 0xb4, 0x06, 0x58, 0x6b, 0x49, 0x50, 0x2c, 0x5b, 0xc2, - 0x1b, 0xa7, 0x48, 0x48, 0x6c, 0xcf, 0x6e, 0x3a, 0x9a, 0x98, 0xc8, 0x8f, 0x96, 0xce, 0xb7, 0xb5, 0x70, 0x6f, 0xb2, 0xf9, 0x65, 0x0c, 0xc3, 0x4f, 0xe9, 0xfa, 0x13, 0xa1, 0x97, 0xd8, 0xae, 0x5e, - 0xf9, 0x8d, 0x3d, 0xee, 0xed, 0xe2, 0x5e, 0x02, 0x10, 0xfc, 0xec, 0xc6, 0xfd, 0x01, 0xf8, 0x95, 0x36, 0x1f, 0x2e, 0x5d, 0x82, 0x0a, 0x03, 0x36, 0x6f, 0x2b, 0x5f, 0x37, 0x7a, 0xc1, 0xea, 0xad, - 0x5a, 0xce, 0x0d, 0x6e, 0x66, 0xaf, 0x15, 0xa2, 0xa7, 0x7b, 0x72, 0x55, 0xad, 0x29, 0xd3, 0x82, 0xc9, 0x63, 0xed, 0xd4, 0xf5, 0xbc, 0xf7, 0xc0, 0x05, 0x99, 0x71, 0xcb, 0x60, 0xbd, 0x4d, 0x8e, - 0x20, 0x39, 0x6b, 0x88, 0xf2, 0xa8, 0xc2, 0xf5, 0x1c, 0x93, 0x33, 0x91, 0x6f, 0x7d, 0x9b, 0xb6, 0x79, 0xe6, 0xc4, 0x1c, 0x69, 0x45, 0x71, 0x6a, 0x42, 0xd3, 0xe4, 0x47, 0x16, 0xd1, 0x7f, 0xda, - 0xc5, 0x93, 0xd4, 0xb1, 0x71, 0x69, 0x6c, 0xfb, 0x15, 0xad, 0x88, 0x67, 0x77, 0xa6, 0x2b, 0xd4, 0x1b, 0x91, 0x2e, 0xc7, 0x97, 0xb6, 0x9c, 0x03, 0x84, 0x21, 0x0a, 0x4d, 0x7d, 0x27, 0x74, 0x71, - 0x9b, 0xdc, 0x77, 0xd1, 0x2e, 0xb3, 0xaa, 0x7d, 0x66, 0xb3, 0x87, 0x6d, 0xde, 0xec, 0x26, 0xcc, 0xa1, 0xdf, 0x57, 0xd5, 0xb2, 0x61, 0xa4, 0x19, 0x81, 0x42, 0xa3, 0x2c, 0xd1, 0x48, 0x9a, 0x6b, - 0x40, 0x10, 0x44, 0xb7, 0x12, 0x8b, 0x22, 0xe2, 0x46, 0x98, 0x45, 0x1b, 0xca, 0x5c, 0x34, 0x5c, 0x86, 0x73, 0x9a, 0xa2, 0xc9, 0x93, 0xc8, 0x58, 0xa8, 0xc7, 0xd3, 0x29, 0x79, 0xb4, 0x84, 0x1e, - 0x2f, 0x81, 0x61, 0x33, 0x46, 0xde, 0xbe, 0xf6, 0xa1, 0xee, 0x4a, 0x3c, 0x8f, 0xd6, 0x0f, 0xda, 0xeb, 0x87, 0x4b, 0x97, 0x2d, 0x87, 0x78, 0x8c, 0xe4, 0x10, 0x92, 0xc1, 0x95, 0xd4, 0xb3, 0xdb, - 0x94, 0xd0, 0xa2, 0xe3, 0xca, 0xe9, 0xa5, 0x1a, 0x46, 0x78, 0x0f, 0xdf, 0xfa, 0xab, 0xb9, 0x5e, 0xba, 0x99, 0x41, 0xa9, 0x04, 0x6e, 0xe7, 0xce, 0x5c, 0xa3, 0xf3, 0x76, 0x89, 0xa2, 0xf2, 0x0a, - 0xdd, 0xec, 0x27, 0xcd, 0xe4, 0xb8, 0xd2, 0x20, 0x6b, 0xc7, 0x52, 0x5a, 0x3f, 0xf5, 0xf6, 0x13, 0x6a, 0xe7, 0x2d, 0x1d, 0x36, 0x94, 0xd0, 0xcc, 0x52, 0xb0, 0xb0, 0x78, 0x94, 0x13, 0xfd, 0x5f, - 0x7b, 0x13, 0xca, 0x22, 0xdd, 0xbf, 0xf8, 0x66, 0xee, 0xd2, 0xfc, 0x49, 0x0b, 0xf3, 0x15, 0xf0, 0x95, 0xde, 0xaf, 0xa7, 0x43, 0x27, 0xbf, 0x76, 0x4d, 0x28, 0x75, 0xa7, 0x78, 0xbe, 0x61, 0x78, - 0x11, 0xcd, 0x38, 0x75, 0x1a, 0xaf, 0x17, 0x18, 0xcd, 0x88, 0x5c, 0xa4, 0xae, 0x77, 0x18, 0xab, 0xf3, 0x9c, 0x9a, 0x62, 0x80, 0xc9, 0x5a, 0x7b, 0xcd, 0x52, 0x9a, 0x52, 0x83, 0xfc, 0x74, 0xcd, - 0xa4, 0x09, 0xbb, 0xa0, 0xd3, 0x72, 0x13, 0x6d, 0x15, 0x86, 0x8c, 0x5a, 0xb9, 0x03, 0x8c, 0x75, 0xbf, 0x0d, 0xcc, 0x96, 0xd4, 0x7b, 0x02, 0x19, 0xcd, 0xff, 0xfa, 0x82, 0x1a, 0xbc, 0xa7, 0x5c, - 0xda, 0xa8, 0x7e, 0xb3, 0x90, 0x7e, 0x3e, 0x36, 0xed, 0x05, 0xe8, 0x15, 0xa1, 0xd7, 0xae, 0xbb, 0x17, 0x48, 0x8f, 0x91, 0xd9, 0x44, 0x1b, 0x05, 0x22, 0x76, 0x5c, 0x8e, 0xa2, 0x69, 0xdb, 0x60, - 0xb4, 0x28, 0x21, 0xd3, 0x1c, 0x34, 0x44, 0x81, 0x31, 0xc8, 0x51, 0x38, 0x47, 0xe4, 0x8d, 0x06, 0x3b, 0xbe, 0xc6, 0xf1, 0x4a, 0xd5, 0x57, 0x47, 0x06, 0xf3, 0xc1, 0x69, 0x3f, 0xd5, 0x4e, 0xf3, - 0x59, 0xcb, 0x63, 0x64, 0x4e, 0xf3, 0x4a, 0x75, 0xb2, 0x26, 0xd2, 0x81, 0x07, 0x0e, 0x98, 0xe8, 0x27, 0x50, 0x1b, 0x4c, 0xf3, 0xf9, 0xf1, 0x2f, 0x2d, 0x9c, 0x3f, 0xbf, 0xb1, 0xd4, 0xff, 0xd3, - 0x2e, 0x96, 0xd2, 0xd3, 0x0b, 0xdb, 0xba, 0xc6, 0x51, 0xc6, 0x46, 0xed, 0x38, 0x77, 0x77, 0xa0, 0xa7, 0xcd, 0xfc, 0x2f, 0x5e, 0x71, 0xa5, 0xf7, 0x17, 0x37, 0x86, 0x9a, 0xfd, 0x65, 0xce, 0xc1, - 0xf2, 0xac, 0x86, 0x00, 0xb0, 0xc3, 0xeb, 0x46, 0xed, 0x76, 0xd5, 0x94, 0xef, 0x3b, 0x8f, 0x0e, 0xa6, 0xbb, 0x68, 0x69, 0xda, 0xf3, 0x74, 0xbb, 0x59, 0x2b, 0xa4, 0x42, 0x31, 0x32, 0x65, 0x36, - 0xbe, 0x09, 0x88, 0x56, 0xa9, 0x81, 0x21, 0x23, 0x53, 0xc8, 0x92, 0xe9, 0x90, 0x95, 0xcc, 0xcc, 0xb5, 0x95, 0xbf, 0x04, 0x90, 0x76, 0x44, 0x2f, 0x01, 0x59, 0x34, 0x84, 0x25, 0x67, 0x79, 0x8f, - 0x34, 0x87, 0x9f, 0xf9, 0x52, 0xff, 0x19, 0x72, 0x7e, 0x3f, 0xde, 0xe6, 0xc9, 0xcd, 0xee, 0x2d, 0x57, 0xe9, 0xe5, 0x78, 0xe8, 0xf6, 0x56, 0x31, 0xb0, 0xac, 0xf6, 0x7e, 0x13, 0xd8, 0x78, 0xea, - 0x08, 0x0a, 0x11, 0xc1, 0x88, 0x19, 0xcc, 0xf8, 0xad, 0x0e, 0x52, 0xae, 0x41, 0x9c, 0x22, 0x3a, 0x5f, 0xe0, 0xc1, 0x02, 0xb3, 0x03, 0xbc, 0x16, 0x0e, 0x08, 0xbc, 0x8f, 0x14, 0x01, 0xe1, 0x36, - 0x82, 0xef, 0x56, 0xfa, 0xc2, 0x5e, 0x72, 0x35, 0xe5, 0xa4, 0x9e, 0x69, 0x4a, 0xc7, 0x66, 0xe5, 0x6b, 0x5b, 0x87, 0xe7, 0x13, 0xfe, 0x28, 0x57, 0x8f, 0x44, 0xde, 0x7f, 0xed, 0xed, 0xed, 0x5a, - 0xd7, 0xf1, 0x0d, 0x89, 0x9f, 0xc8, 0x87, 0x79, 0x81, 0x7a, 0x23, 0xf1, 0xb5, 0xd1, 0xd1, 0xd0, 0x3c, 0x98, 0xd6, 0x0f, 0x3c, 0x5d, 0xda, 0xb9, 0x79, 0xe3, 0xc5, 0x00, 0xa8, 0x59, 0xb4, 0xa9, - 0x72, 0x5a, 0x45, 0x45, 0x47, 0x6b, 0x33, 0xcf, 0x4c, 0x69, 0xb6, 0xc7, 0x64, 0x56, 0xae, 0x8f, 0xaa, 0x90, 0xee, 0x09, 0x0a, 0x95, 0x39, 0xde, 0x92, 0x47, 0x6e, 0xb6, 0xc7, 0xa5, 0x3e, 0x25, - 0x0c, 0xf4, 0x00, 0x2f, 0xe5, 0x08, 0x48, 0x33, 0x7c, 0x91, 0x1f, 0x49, 0x0a, 0xa5, 0xb5, 0xb6, 0xa1, 0x1c, 0xfd, 0x2f, 0x09, 0xe2, 0xdf, 0x4a, 0x5f, 0x7e, 0x6e, 0x6a, 0xfd, 0x73, 0xe4, 0xad, - 0xba, 0xec, 0x45, 0x26, 0x7e, 0xa3, 0xbf, 0x3c, 0xe7, 0x31, 0x79, 0x07, 0xfb, 0x4a, 0xe9, 0x77, 0x17, 0xae, 0x2d, 0xee, 0x06, 0x68, 0x31, 0xc2, 0x3a, 0x77, 0x99, 0xa5, 0xaf, 0x68, 0xcd, 0x36, - 0xd3, 0xe7, 0x1a, 0x52, 0xef, 0x4d, 0x32, 0x5c, 0x0a, 0x5b, 0x74, 0x84, 0xd2, 0xb3, 0x7d, 0x34, 0x4b, 0xfc, 0x5a, 0x64, 0x09, 0x53, 0x06, 0xe4, 0x19, 0x0d, 0x8a, 0x11, 0x31, 0x27, 0xc0, 0x6e, - 0xe1, 0x2c, 0x33, 0x0f, 0x31, 0x59, 0xce, 0x1e, 0x99, 0x54, 0x95, 0xea, 0xbe, 0xdb, 0x8c, 0x66, 0xf3, 0x7e, 0xbf, 0xde, 0x78, 0x26, 0x3c, 0xad, 0x78, 0x7c, 0xa0, 0x8f, 0x44, 0x6f, 0x74, 0xff, - 0x1a, 0x6b, 0x79, 0xf7, 0xcb, 0xdf, 0xe8, 0xfc, 0xa6, 0x80, 0x3c, 0x8e, 0x6f, 0xbd, 0xeb, 0x9d, 0xfc, 0xe7, 0xbf, 0x3e, 0x76, 0x4a, 0xfe, 0xe3, 0x8f, 0x3f, 0x6f, 0xb5, 0xef, 0x2f, 0xec, 0xf3, - 0xff, 0xfb, 0xc8, 0x5f, 0xff, 0xaf, 0x8b, 0x90, 0x3a, 0xf1, 0x2f, 0xce, 0xc8, 0x5b, 0xd5, 0xc1, 0x85, 0x75, 0xbe, 0xe2, 0x34, 0xf0, 0x59, 0x4d, 0xf9, 0xb7, 0x17, 0x5c, 0xd9, 0xed, 0xb7, 0xcb, - 0x97, 0x64, 0xe0, 0x01, 0x3c, 0x17, 0x26, 0xa7, 0x05, 0x9c, 0xa3, 0xf2, 0x14, 0xa9, 0xc9, 0xb2, 0x92, 0x16, 0x1d, 0x7d, 0x58, 0x4f, 0x79, 0xeb, 0x34, 0x8f, 0x1b, 0x6c, 0xa6, 0xf9, 0x92, 0x69, - 0x45, 0x2b, 0x9d, 0x16, 0x55, 0xda, 0xd8, 0x39, 0xeb, 0x4e, 0x1f, 0xf1, 0x5e, 0x9a, 0x71, 0x69, 0xc5, 0x8a, 0x45, 0x59, 0x4d, 0xbc, 0xbc, 0xce, 0x6b, 0x54, 0xcb, 0xea, 0x8d, 0x31, 0x33, 0x01, - 0x72, 0x87, 0xc7, 0xae, 0xea, 0x0a, 0x73, 0xe1, 0x51, 0x58, 0x66, 0x78, 0xb1, 0xcf, 0x5f, 0x26, 0xde, 0x4f, 0x93, 0xb6, 0xcb, 0x71, 0x6b, 0xeb, 0x61, 0x61, 0xdf, 0x9f, 0xee, 0xfc, 0xa4, 0xae, - 0x76, 0x03, 0x7b, 0x25, 0xd7, 0xed, 0x64, 0xa8, 0x4e, 0x96, 0x9b, 0x55, 0x59, 0xb3, 0x5a, 0xbc, 0x12, 0xc1, 0x51, 0xb3, 0xdb, 0x6d, 0x9d, 0xf4, 0xd0, 0x74, 0x73, 0x1b, 0x1e, 0x2d, 0x76, 0x4c, - 0x93, 0xc4, 0x1a, 0x6c, 0xf7, 0xfb, 0x3a, 0x83, 0x76, 0x93, 0xd2, 0xa6, 0x46, 0x55, 0x3b, 0x9d, 0xda, 0xbe, 0x1e, 0xe1, 0x0c, 0xe3, 0x23, 0x9c, 0x09, 0x6f, 0xe6, 0xa6, 0x83, 0x8f, 0xf2, 0x1e, - 0x9e, 0x4f, 0x84, 0x24, 0x50, 0xcb, 0x90, 0x3c, 0x79, 0x9b, 0x9d, 0xfe, 0xb0, 0xbc, 0xf7, 0x3f, 0xbf, 0x4e, 0x66, 0x9f, 0xee, 0xc7, 0x3a, 0x9f, 0xf3, 0xe9, 0xd8, 0xa7, 0x6b, 0x84, 0xd3, 0x3e, - 0xd9, 0x17, 0x4f, 0xdb, 0xc3, 0x16, 0xba, 0xb8, 0xd0, 0xf4, 0x16, 0x77, 0x3a, 0x18, 0x80, 0x2f, 0xdb, 0xde, 0xcc, 0x2c, 0xe7, 0x66, 0x75, 0xec, 0xc9, 0x72, 0xe4, 0xd1, 0x3f, 0xcc, 0x5c, 0x0a, - 0xce, 0xc2, 0x2f, 0xb4, 0x93, 0xf2, 0xce, 0x27, 0x3d, 0x97, 0x12, 0xff, 0x0a, 0xf5, 0x32, 0x49, 0xf3, 0x76, 0x3c, 0x34, 0x15, 0x5e, 0xb2, 0xd6, 0xb2, 0x13, 0x99, 0x0c, 0x62, 0xca, 0xfd, 0xc6, - 0xdf, 0xe6, 0xa2, 0x5b, 0x4e, 0x6b, 0x10, 0x9f, 0x0b, 0x35, 0x25, 0x5b, 0xab, 0x35, 0x0f, 0x1a, 0xf6, 0xd1, 0x10, 0xbc, 0x25, 0x87, 0x86, 0xb8, 0x9e, 0xb9, 0xeb, 0xca, 0x77, 0xcc, 0x74, 0x5a, - 0xed, 0x29, 0xc3, 0x3c, 0xf1, 0xd9, 0x71, 0x52, 0x65, 0x33, 0x38, 0x9c, 0x6e, 0xf1, 0x9d, 0xd1, 0xbb, 0xe8, 0x54, 0xaf, 0x4b, 0x05, 0x10, 0x36, 0x77, 0xd8, 0xee, 0x5b, 0xc4, 0x74, 0x7a, 0x7c, - 0x4f, 0x2d, 0x43, 0x7e, 0x41, 0xe8, 0x13, 0xde, 0xef, 0x1b, 0xd0, 0x2b, 0x56, 0xce, 0x47, 0xe3, 0x2b, 0xa0, 0xc7, 0x48, 0x49, 0xc3, 0xed, 0x92, 0xe0, 0x55, 0x75, 0x4d, 0x1c, 0x0b, 0x8e, 0xe2, - 0x43, 0x04, 0xd8, 0xa9, 0x45, 0x52, 0xa3, 0xbe, 0x4a, 0x75, 0x7c, 0x38, 0x82, 0xb1, 0x24, 0x57, 0x51, 0x3f, 0xde, 0xc1, 0x49, 0x56, 0x37, 0xfb, 0xe3, 0x2c, 0x4e, 0x01, 0x91, 0xd1, 0xd2, 0xbc, - 0xd5, 0xc2, 0xa3, 0xbe, 0x9a, 0x85, 0x48, 0x70, 0x68, 0x26, 0xfc, 0x9e, 0x5f, 0x31, 0x2e, 0xe3, 0xe9, 0x2c, 0xdf, 0x25, 0x93, 0x1d, 0xf5, 0xbc, 0xde, 0xad, 0x17, 0xee, 0xc7, 0xc1, 0x65, 0x1f, - 0xa6, 0x76, 0xd9, 0x65, 0x56, 0xf8, 0xb1, 0xfe, 0xe7, 0x37, 0xf5, 0x33, 0xc6, 0x87, 0x19, 0xa5, 0x97, 0xf1, 0xb7, 0x2f, 0xf8, 0x3e, 0xdf, 0x7b, 0xc1, 0xcf, 0xaf, 0x60, 0x88, 0xf8, 0x7c, 0x9b, - 0x30, 0x36, 0xb6, 0x1b, 0x3b, 0x19, 0x1b, 0x76, 0x55, 0xd9, 0xc5, 0xf8, 0x32, 0x03, 0xee, 0x1e, 0x63, 0xc3, 0xbf, 0x90, 0xa7, 0x08, 0xf8, 0xcd, 0x9b, 0x5e, 0xc6, 0xc6, 0xde, 0xbb, 0x7f, 0x69, - 0x23, 0x3d, 0x80, 0xd6, 0xa7, 0x6e, 0xde, 0x76, 0x5e, 0x91, 0x02, 0x6b, 0x26, 0x75, 0xf0, 0x85, 0x67, 0xc3, 0x7e, 0x0f, 0x73, 0xa6, 0x9a, 0x06, 0x70, 0x19, 0xa5, 0x5c, 0xa9, 0x14, 0x80, 0x5a, - 0x32, 0xd2, 0x6c, 0x03, 0xa4, 0xbe, 0x30, 0x75, 0x74, 0xce, 0x8b, 0x30, 0x9e, 0x73, 0xb2, 0x51, 0x20, 0x5a, 0xb4, 0x26, 0x89, 0x22, 0xb8, 0x5a, 0x2b, 0x5c, 0xbf, 0xa4, 0xfa, 0x95, 0x36, 0x27, - 0x22, 0x9f, 0x82, 0x42, 0x0f, 0xfe, 0xf1, 0x60, 0xef, 0x1f, 0x4c, 0xde, 0x05, 0x7f, 0x3d, 0xb7, 0x18, 0x86, 0x4f, 0xde, 0xbd, 0xbc, 0x61, 0x00, 0xe6, 0x0c, 0x63, 0xba, 0xc4, 0xac, 0xe9, 0x51, - 0xc6, 0xf6, 0x24, 0x6b, 0x32, 0x9e, 0x57, 0x7b, 0xc4, 0x72, 0x4d, 0x92, 0x4b, 0xb5, 0x56, 0x90, 0xbc, 0x5c, 0x21, 0x47, 0xb0, 0xe7, 0xb5, 0xf9, 0xc6, 0xd1, 0x98, 0xa5, 0x99, 0x29, 0xfe, 0x52, - 0x06, 0xd6, 0xa7, 0x3e, 0xc4, 0x61, 0x6a, 0x52, 0x94, 0xba, 0x01, 0xc4, 0x5b, 0x7f, 0x29, 0x56, 0x3e, 0xd5, 0x6e, 0x85, 0x11, 0x89, 0x62, 0x92, 0x60, 0x23, 0x87, 0x1f, 0x67, 0x83, 0x7e, 0x3d, - 0xd5, 0xbd, 0xf5, 0x2b, 0x2f, 0xad, 0xaf, 0x03, 0x07, 0xef, 0x0f, 0x76, 0x84, 0x9e, 0x8a, 0xaa, 0x0d, 0x7a, 0xe3, 0x2b, 0x6e, 0x1f, 0x3c, 0x37, 0xac, 0x80, 0x31, 0x31, 0x6c, 0x28, 0x5a, 0xeb, - 0x95, 0xd0, 0xf7, 0x23, 0xb2, 0xcd, 0xa0, 0xf9, 0x14, 0xac, 0xc2, 0xb6, 0x50, 0xd7, 0x11, 0xf3, 0x43, 0x74, 0x85, 0x7e, 0x62, 0x8d, 0xd3, 0x7b, 0x9a, 0x0f, 0xfe, 0x94, 0x01, 0x7c, 0x83, 0x09, - 0x8c, 0x5f, 0x8e, 0x2e, 0x93, 0xe5, 0x06, 0x18, 0xbf, 0x96, 0xb9, 0x83, 0xea, 0x68, 0x44, 0x55, 0xb1, 0x3d, 0xa3, 0xb0, 0xfd, 0xe8, 0x04, 0x93, 0x80, 0xed, 0xb1, 0xae, 0x45, 0xc5, 0x0c, 0xa7, - 0x23, 0x6c, 0xd9, 0xcc, 0xf6, 0x55, 0x1f, 0x23, 0x4d, 0x37, 0x61, 0x78, 0x42, 0x12, 0xb2, 0xaa, 0xa1, 0x67, 0xa3, 0x0a, 0x45, 0x95, 0x83, 0xaa, 0xcb, 0xc1, 0x7e, 0x22, 0x99, 0x45, 0x36, 0xb7, - 0xe7, 0xd1, 0x94, 0x54, 0xa6, 0x45, 0x2d, 0x4b, 0x28, 0x86, 0x7b, 0x7f, 0x51, 0x31, 0x1d, 0xec, 0xd2, 0x8d, 0xec, 0xe6, 0x5e, 0x54, 0xfe, 0xb9, 0x25, 0x7a, 0x06, 0x08, 0x8c, 0x2f, 0xff, 0x0d, - 0x5d, 0x82, 0x23, 0x63, 0x0f, 0xd7, 0x4b, 0x94, 0xc1, 0xd8, 0x05, 0x43, 0x78, 0x40, 0x82, 0xd8, 0x8d, 0xb9, 0x03, 0x4a, 0x31, 0x5a, 0xab, 0xd3, 0x6c, 0x95, 0xe1, 0x5d, 0x4c, 0xf2, 0xca, 0x1a, - 0xb3, 0x0f, 0xf8, 0x08, 0x27, 0x66, 0x65, 0x1e, 0x01, 0xac, 0xae, 0xef, 0x89, 0x7c, 0x3d, 0xa1, 0x2b, 0xb8, 0xe8, 0x9d, 0x54, 0x07, 0x30, 0x71, 0xb2, 0x98, 0x78, 0xa7, 0x99, 0x7f, 0x82, 0xac, - 0x6d, 0x05, 0x87, 0xe2, 0xbd, 0xdd, 0x7b, 0xc0, 0x46, 0x95, 0x15, 0x76, 0x54, 0x5b, 0xf6, 0xf8, 0xd5, 0x79, 0x00, 0x7f, 0xb4, 0xfe, 0x2e, 0x7d, 0x21, 0x4d, 0xcf, 0x36, 0xc3, 0xf3, 0xfd, 0xff, - 0xfb, 0xb1, 0xf1, 0xd1, 0x50, 0x02, 0xfd, 0x01, 0x5e, 0x7a, 0x92, 0x0e, 0x20, 0xd0, 0xef, 0x03, 0x3b, 0xbf, 0x22, 0x16, 0xf6, 0x54, 0xc1, 0xcc, 0x67, 0xe0, 0x67, 0xc2, 0x7d, 0xba, 0x34, 0xc6, - 0x86, 0x95, 0xcf, 0xc8, 0x7b, 0x22, 0x93, 0x43, 0x32, 0xe0, 0xa6, 0x12, 0xd4, 0x4a, 0x44, 0x8b, 0xf8, 0x8a, 0xb3, 0x0a, 0x4e, 0x08, 0x3c, 0xf3, 0x27, 0xb0, 0x83, 0x78, 0x73, 0x4b, 0xdc, 0xf1, - 0x6d, 0x87, 0x00, 0x8c, 0x20, 0x22, 0x09, 0x72, 0x48, 0xcd, 0xce, 0xcf, 0xe4, 0x93, 0xd9, 0x49, 0x9a, 0x04, 0xea, 0x5e, 0x6a, 0x37, 0x23, 0x27, 0xec, 0x70, 0xaa, 0xa6, 0x47, 0x0b, 0x3b, 0x10, - 0x74, 0x6a, 0x53, 0x2f, 0x37, 0x03, 0xe7, 0x56, 0x9a, 0x69, 0x1a, 0xfa, 0x57, 0xc5, 0x02, 0x7c, 0x6a, 0x60, 0x69, 0x69, 0x57, 0xe3, 0x2b, 0x90, 0xeb, 0x4e, 0xfc, 0x32, 0xb7, 0x14, 0x1d, 0x34, - 0xef, 0x3a, 0x3a, 0x13, 0x7a, 0xac, 0x27, 0xd6, 0xd8, 0x4c, 0xa3, 0x3a, 0xbe, 0xab, 0x18, 0x3f, 0x97, 0x6b, 0xfa, 0x1b, 0xf4, 0x0b, 0x91, 0x3e, 0x5d, 0x1b, 0x9a, 0x77, 0x4a, 0x74, 0x51, 0x17, - 0xd9, 0xa5, 0x26, 0x02, 0xc2, 0x01, 0xa6, 0x02, 0x8f, 0x99, 0x45, 0x88, 0xec, 0x04, 0x29, 0xae, 0xa9, 0x84, 0x3b, 0xcd, 0xd7, 0x05, 0x36, 0x27, 0x84, 0x4d, 0x91, 0x9b, 0x14, 0xd2, 0x10, 0x4e, - 0xbf, 0xeb, 0xe2, 0x0a, 0x9a, 0x64, 0x2d, 0x23, 0x93, 0x09, 0x2d, 0xab, 0x25, 0x99, 0xf7, 0x7d, 0x93, 0x7b, 0x46, 0xe0, 0x6d, 0x30, 0x51, 0x73, 0xf1, 0x6d, 0x05, 0x2c, 0xc3, 0x7b, 0x53, 0x30, - 0xbf, 0x41, 0xd8, 0x87, 0x49, 0x70, 0x5f, 0xb3, 0xf3, 0x33, 0x36, 0xc4, 0x3b, 0xb8, 0x67, 0x24, 0xbd, 0x9d, 0x8d, 0xb1, 0x61, 0x76, 0x44, 0x45, 0x78, 0x2d, 0x95, 0xad, 0x46, 0x4a, 0x53, 0xb7, - 0xdc, 0x5a, 0x6d, 0x43, 0xac, 0x3f, 0x2c, 0xb3, 0xce, 0x5b, 0xe5, 0xbd, 0x0b, 0xe7, 0xfb, 0x28, 0x8c, 0xd6, 0xbc, 0x03, 0xc6, 0x87, 0xd3, 0x62, 0x67, 0xd8, 0xc8, 0x3c, 0x83, 0x0f, 0xbe, 0xad, - 0x99, 0x56, 0xcd, 0x1d, 0x03, 0x9d, 0x9d, 0xa5, 0x1d, 0x9e, 0x51, 0xf5, 0x22, 0x13, 0x99, 0x85, 0xb2, 0x20, 0x09, 0x25, 0xdb, 0x6e, 0x22, 0x2e, 0x27, 0x9f, 0x57, 0x99, 0xb3, 0xf1, 0xf5, 0x1b, - 0xfe, 0xbc, 0x6a, 0xc5, 0x5f, 0x0e, 0xd5, 0xf9, 0x1b, 0x52, 0xb5, 0xa2, 0xd4, 0xba, 0x5f, 0xfa, 0x8d, 0xfe, 0x82, 0x88, 0x5f, 0xf0, 0x13, 0xa2, 0xe5, 0x02, 0xf4, 0x42, 0x86, 0xf3, 0xc1, 0xf8, - 0x06, 0xe7, 0x31, 0x0d, 0x1a, 0x38, 0x9c, 0x31, 0x36, 0x46, 0x44, 0xb6, 0xb9, 0xaf, 0x23, 0x7d, 0xb6, 0xaa, 0xb9, 0xbd, 0xd0, 0x21, 0x52, 0x87, 0xba, 0xec, 0x62, 0x8d, 0x6b, 0x10, 0x8f, 0x34, - 0x0c, 0x14, 0x16, 0xae, 0xaa, 0x71, 0x45, 0x29, 0x8e, 0xd8, 0xf9, 0x7e, 0xb1, 0x3c, 0x9c, 0x0e, 0x81, 0xa9, 0x0a, 0x25, 0x44, 0xb0, 0x9e, 0xa1, 0x1d, 0x16, 0xb6, 0x45, 0xaf, 0x1b, 0x52, 0xd5, - 0xa0, 0xaa, 0x09, 0xb0, 0x79, 0xb3, 0x7b, 0x82, 0x45, 0xcf, 0xbf, 0xfa, 0x97, 0x19, 0xa5, 0x89, 0x6d, 0xd9, 0xf6, 0xfd, 0x89, 0x8e, 0xcf, 0xcc, 0xd4, 0xfe, 0x0c, 0xfc, 0x15, 0x4b, 0x6f, 0x97, - 0xc6, 0x17, 0xc8, 0x8f, 0x34, 0x2a, 0x34, 0x20, 0x81, 0x84, 0x19, 0x09, 0x8d, 0x85, 0x2f, 0xd7, 0xbb, 0x64, 0x32, 0x39, 0x79, 0x6a, 0xba, 0x32, 0xa2, 0x9e, 0xff, 0xe9, 0x5c, 0x9c, 0xdb, 0xfb, - 0xab, 0xa2, 0x4e, 0x6e, 0x1c, 0xf7, 0xf5, 0xe7, 0xa2, 0x4f, 0xf8, 0x94, 0x3e, 0xc1, 0x7e, 0xfb, 0xda, 0x97, 0x2b, 0xe3, 0x0b, 0xdc, 0x47, 0x1f, 0xab, 0x04, 0x32, 0x97, 0xb2, 0x8c, 0xc4, 0xa3, - 0xdc, 0xa8, 0x07, 0x80, 0x83, 0xbb, 0xeb, 0x46, 0x0a, 0x67, 0xe4, 0xa8, 0xb6, 0xfd, 0xf1, 0xc7, 0xba, 0x0f, 0x9a, 0xb9, 0x3d, 0xd7, 0x17, 0xe9, 0x1d, 0xdc, 0xcb, 0x47, 0xbe, 0x9e, 0x0d, 0xed, - 0x87, 0x44, 0xaa, 0x42, 0x93, 0xd1, 0x34, 0x59, 0x77, 0x9e, 0x53, 0xd9, 0x35, 0x99, 0xad, 0x1a, 0xf1, 0x94, 0xad, 0x35, 0x62, 0x77, 0x3c, 0x5a, 0x99, 0xec, 0x37, 0x5a, 0xb6, 0xe8, 0xf0, 0x72, - 0x5e, 0x4e, 0xea, 0x8d, 0x74, 0x04, 0x88, 0x42, 0x5c, 0xe8, 0x8d, 0x6d, 0xd9, 0x13, 0x52, 0xdf, 0x8c, 0xb4, 0xb0, 0xcb, 0xf1, 0x3a, 0xdb, 0xce, 0x0f, 0x2c, 0x40, 0xd1, 0x0a, 0xde, 0xf0, 0xc7, - 0xde, 0x91, 0x3a, 0xf6, 0x79, 0xf9, 0x63, 0x7a, 0x7a, 0x14, 0xbe, 0x13, 0x3e, 0xef, 0x76, 0xcc, 0x3b, 0x1e, 0xe4, 0xf3, 0x06, 0xfc, 0x8c, 0x98, 0xfa, 0x07, 0x1d, 0xa9, 0x51, 0x9a, 0x66, 0x86, - 0x9d, 0xdc, 0x9d, 0xa0, 0x08, 0x3d, 0x35, 0x2d, 0xec, 0x15, 0xea, 0x85, 0x11, 0x6e, 0xc7, 0x97, 0x5d, 0x7a, 0x00, 0x1b, 0x38, 0x15, 0x2c, 0xc4, 0xb5, 0x96, 0xcc, 0xda, 0xd1, 0x6c, 0x2d, 0x3a, - 0x7b, 0x2c, 0xce, 0x18, 0xa5, 0xb6, 0x98, 0x89, 0xd4, 0x47, 0xd9, 0x2a, 0xf6, 0x88, 0x58, 0x26, 0x78, 0x53, 0x58, 0xc4, 0xb6, 0x53, 0x6e, 0x22, 0x85, 0x9c, 0x86, 0xa0, 0x8c, 0x27, 0xc5, 0x74, - 0x6a, 0x99, 0xed, 0x71, 0x3e, 0xea, 0xa9, 0xde, 0x04, 0x77, 0x87, 0x49, 0xbf, 0xd0, 0x68, 0x68, 0x0e, 0xb9, 0xb2, 0xb3, 0xd4, 0xea, 0xf5, 0xc0, 0x86, 0xa0, 0xa7, 0xca, 0xbe, 0xb9, 0x4b, 0x3f, - 0xf6, 0xeb, 0xff, 0x06, 0x81, 0xef, 0xba, 0x66, 0xdd, 0x33, 0xc7, 0x9e, 0x40, 0xe0, 0x0b, 0xd4, 0x33, 0x02, 0x5f, 0x8e, 0x2f, 0x26, 0xd9, 0x00, 0x04, 0xae, 0x53, 0xdc, 0x5a, 0x83, 0xe8, 0x34, - 0xde, 0x05, 0x75, 0x9f, 0xb4, 0xeb, 0xdd, 0x0e, 0xc9, 0x64, 0x5b, 0x89, 0x2d, 0x60, 0x09, 0x3a, 0xce, 0x3e, 0x0a, 0x55, 0xd5, 0x6d, 0x35, 0x7f, 0x64, 0xe7, 0x90, 0x3c, 0x8d, 0x73, 0xb1, 0x9d, - 0x7a, 0x23, 0x9b, 0x2d, 0x8f, 0xfc, 0x71, 0xda, 0x1e, 0x29, 0x0a, 0xf2, 0xe1, 0xb9, 0xee, 0xa1, 0x1e, 0x34, 0x61, 0xb6, 0xd3, 0x13, 0x9a, 0xef, 0xbd, 0x85, 0x51, 0xfa, 0x03, 0xe3, 0x53, 0x9d, - 0x1e, 0x45, 0xfe, 0xad, 0xd7, 0xfe, 0x73, 0x9d, 0x60, 0x06, 0x55, 0x81, 0xc7, 0x7a, 0x68, 0x5f, 0x9d, 0x44, 0x77, 0xf9, 0x16, 0x79, 0xa2, 0x8f, 0xc6, 0x1b, 0x58, 0x60, 0xfc, 0xee, 0x64, 0x7c, - 0x81, 0xf6, 0x18, 0xf1, 0x25, 0x29, 0x7b, 0x11, 0x67, 0x13, 0x8d, 0xb0, 0x49, 0x63, 0xd1, 0x9b, 0x42, 0xf9, 0xdc, 0x8e, 0xb6, 0x69, 0x58, 0x00, 0x3b, 0x13, 0xa1, 0x5d, 0xce, 0x28, 0x53, 0x24, - 0x21, 0xd0, 0xf8, 0x20, 0xd0, 0x18, 0xbb, 0xd7, 0xda, 0x70, 0x42, 0x71, 0x91, 0xea, 0xa0, 0xaa, 0xa0, 0xc7, 0xec, 0x69, 0xcd, 0x90, 0x1e, 0xe8, 0x7a, 0x04, 0x52, 0x6c, 0x29, 0xf4, 0xd4, 0xb4, - 0xd2, 0x1e, 0x9e, 0x1e, 0x56, 0xc9, 0x8f, 0xfd, 0x50, 0xb1, 0x9e, 0x7d, 0x93, 0xfb, 0x85, 0x3e, 0x55, 0x17, 0x7f, 0x83, 0x79, 0xc1, 0xca, 0xe5, 0x68, 0x8c, 0x0e, 0xab, 0x81, 0xf7, 0x2c, 0x0e, - 0x6a, 0x0f, 0x85, 0x66, 0x18, 0x30, 0x65, 0x4f, 0x16, 0xfe, 0x22, 0x58, 0x1b, 0xb6, 0x40, 0xae, 0x8d, 0x4d, 0x90, 0x43, 0x75, 0x11, 0x2e, 0xd7, 0x00, 0xbb, 0x12, 0x00, 0xee, 0x88, 0x92, 0x5b, - 0x0d, 0x12, 0x0f, 0xaa, 0x5c, 0x8a, 0x93, 0x03, 0xb4, 0x80, 0xfa, 0xe6, 0x38, 0x5f, 0x26, 0x90, 0xca, 0x80, 0xb8, 0xd9, 0x06, 0x93, 0x92, 0x5f, 0xc1, 0x1b, 0x44, 0x8e, 0x92, 0x00, 0x3a, 0xaa, - 0x8f, 0xac, 0xdb, 0xc1, 0x5a, 0xe1, 0x7f, 0xb4, 0xb4, 0x8d, 0xed, 0xb4, 0xbd, 0x43, 0x17, 0xea, 0x29, 0x39, 0x71, 0x06, 0x78, 0x26, 0x8a, 0x9d, 0xb6, 0x63, 0x6a, 0x98, 0x74, 0x18, 0xa5, 0xc6, - 0xce, 0x88, 0x78, 0x31, 0x96, 0x3c, 0xb3, 0x9b, 0x54, 0x38, 0xec, 0xd4, 0x85, 0x98, 0x4b, 0xb4, 0x98, 0x71, 0x9d, 0xa2, 0xa6, 0xe4, 0xa4, 0x16, 0x31, 0x83, 0x23, 0xac, 0x05, 0xd9, 0xc6, 0xad, - 0x38, 0x6a, 0xda, 0xe5, 0x26, 0x03, 0x8a, 0xe9, 0x7c, 0x86, 0x4e, 0x8b, 0xbd, 0x40, 0x4e, 0xcb, 0x99, 0x38, 0x83, 0xca, 0x20, 0xd5, 0x28, 0x74, 0x83, 0x42, 0x84, 0xca, 0xc8, 0x21, 0xb9, 0x7a, - 0x44, 0x91, 0xfb, 0x02, 0xe3, 0x7f, 0x5e, 0x86, 0xa2, 0x02, 0x97, 0x41, 0x3a, 0x2f, 0x82, 0xe3, 0xe3, 0xa6, 0x73, 0x89, 0x64, 0xc5, 0x76, 0x64, 0xea, 0xa5, 0x3d, 0x0e, 0xed, 0x5b, 0xb4, 0x1b, - 0xff, 0x05, 0x7f, 0x0c, 0x67, 0x5b, 0xf6, 0xe5, 0x29, 0xbf, 0xb7, 0xbf, 0x86, 0xf1, 0x76, 0xff, 0x0d, 0xc8, 0x17, 0x0d, 0x42, 0x3e, 0xf5, 0x19, 0xff, 0x62, 0x38, 0xc1, 0xcb, 0x4f, 0x1d, 0x5f, - 0x07, 0x05, 0x96, 0xbf, 0x6b, 0x4c, 0x17, 0xb2, 0x17, 0xb1, 0x7e, 0x79, 0x59, 0xa6, 0x9b, 0xa1, 0xee, 0xda, 0x2f, 0x13, 0x76, 0x5f, 0xa6, 0x0b, 0xbc, 0x7b, 0xb6, 0xb0, 0x75, 0x6b, 0x9c, 0x85, - 0xee, 0x75, 0x74, 0xfa, 0x9f, 0xff, 0x22, 0x3e, 0x47, 0xdc, 0x0b, 0xdb, 0xba, 0x8e, 0xda, 0xf9, 0xe2, 0x8f, 0xab, 0xc2, 0x8f, 0xc7, 0x89, 0xdd, 0x46, 0x37, 0x8e, 0xff, 0xea, 0x91, 0x4f, 0x13, - 0x50, 0x20, 0xf2, 0xe3, 0xfd, 0x4e, 0x2f, 0xdc, 0xf2, 0x83, 0xe9, 0x0f, 0xfe, 0x82, 0x9f, 0xc8, 0xe1, 0xfb, 0x07, 0xd5, 0x98, 0xcb, 0x3a, 0xf8, 0x70, 0xe5, 0xf1, 0x88, 0x14, 0x88, 0x7c, 0xc2, - 0x67, 0x74, 0x6f, 0x44, 0xca, 0x19, 0xd8, 0xe3, 0xb5, 0xc7, 0xaf, 0xe8, 0xa3, 0x1a, 0x92, 0xa3, 0xd5, 0xee, 0x38, 0xca, 0xf7, 0x7c, 0x1b, 0x2e, 0xab, 0x4d, 0xde, 0xd3, 0xf5, 0xc9, 0xf4, 0xd2, - 0xad, 0x3f, 0xa3, 0x64, 0xeb, 0x34, 0x9a, 0xef, 0x16, 0xe2, 0xac, 0xf6, 0x25, 0x69, 0x24, 0xac, 0x37, 0xeb, 0xa5, 0x09, 0x73, 0x6b, 0x5a, 0x8d, 0x0c, 0x2f, 0x5c, 0xb4, 0xfb, 0x0a, 0x40, 0x81, - 0x64, 0xa3, 0x9d, 0x18, 0xf6, 0x08, 0xb5, 0x88, 0x64, 0x2b, 0x3c, 0x4b, 0x7e, 0x1e, 0x0f, 0xfd, 0x53, 0x69, 0xf8, 0x8f, 0x52, 0xed, 0x36, 0x8d, 0xe3, 0xeb, 0x1d, 0xfc, 0x19, 0x07, 0xec, 0x15, - 0xe4, 0x45, 0x24, 0x9e, 0x0f, 0xc6, 0xd0, 0x30, 0x27, 0x2c, 0x99, 0x13, 0x07, 0xc6, 0xdd, 0xae, 0x15, 0x74, 0x4d, 0x56, 0xa6, 0x73, 0x10, 0x3a, 0xd2, 0x05, 0x29, 0xce, 0x14, 0x5b, 0xcd, 0x32, - 0xda, 0x39, 0x93, 0x7b, 0x36, 0xa0, 0x68, 0x61, 0xba, 0xea, 0x83, 0x04, 0x40, 0xf6, 0x8b, 0x59, 0x5b, 0xf1, 0xd3, 0x63, 0xa5, 0x2e, 0x4e, 0x34, 0xc2, 0x93, 0x95, 0xd0, 0x67, 0x66, 0x3f, 0x9d, - 0xce, 0xdc, 0x66, 0x24, 0xc0, 0x02, 0xd6, 0x81, 0xa0, 0xb6, 0xe6, 0x1f, 0x36, 0x7f, 0x78, 0xe4, 0x24, 0x1d, 0xe2, 0xbd, 0x88, 0xed, 0xca, 0x4b, 0xad, 0xfb, 0x3e, 0xb7, 0x67, 0x6a, 0xfe, 0x6f, - 0x30, 0x2f, 0x48, 0xbc, 0x1c, 0x0d, 0xad, 0xef, 0xf7, 0xcd, 0x88, 0x5e, 0xda, 0x5c, 0xce, 0xc5, 0x38, 0xd9, 0xcf, 0xab, 0x44, 0x03, 0xed, 0x11, 0xc4, 0xc2, 0x9d, 0xbc, 0xb2, 0x9a, 0x9e, 0x4b, - 0xf5, 0x7a, 0x23, 0xa3, 0xca, 0x84, 0x46, 0x0e, 0xcd, 0x12, 0x68, 0x84, 0xb9, 0x6f, 0xcf, 0x89, 0xdc, 0x91, 0xa2, 0x56, 0xd6, 0xe4, 0xd1, 0x8c, 0xa6, 0x04, 0xca, 0x10, 0xd4, 0xd5, 0x8e, 0x02, - 0xeb, 0xe8, 0x94, 0xca, 0xe9, 0x74, 0x09, 0x23, 0xe5, 0xe1, 0x5e, 0x1c, 0x6e, 0x30, 0x16, 0x87, 0x8d, 0xfe, 0x8d, 0x7d, 0xb3, 0x48, 0x5f, 0x26, 0xb9, 0x7d, 0xad, 0x37, 0x3d, 0xd3, 0x91, 0xe4, - 0x0d, 0xec, 0x19, 0x9b, 0xaf, 0x27, 0x97, 0xc8, 0xfe, 0x00, 0x87, 0x65, 0x26, 0xc5, 0x7d, 0x0b, 0xa8, 0xb2, 0xd9, 0xaa, 0x8b, 0x6c, 0x46, 0xe9, 0x2b, 0x2a, 0x07, 0x40, 0x95, 0x6f, 0x59, 0xae, - 0x73, 0x03, 0x66, 0xbf, 0x26, 0x3b, 0x50, 0x4f, 0xc1, 0xd6, 0xca, 0xb3, 0xa2, 0xe8, 0x67, 0x3a, 0x7a, 0x4c, 0x4e, 0xac, 0xd9, 0x13, 0x8e, 0x28, 0x69, 0x05, 0xd9, 0xa4, 0x1e, 0x79, 0x80, 0xc0, - 0x70, 0xe1, 0xd1, 0x13, 0x83, 0x33, 0x97, 0x87, 0x10, 0x6b, 0x97, 0xae, 0xf2, 0xb0, 0xc9, 0xdd, 0x37, 0xad, 0x2d, 0x0a, 0xdd, 0x7c, 0xb7, 0xc9, 0x7c, 0xd8, 0xa3, 0x32, 0xdf, 0x4c, 0xdf, 0x26, - 0xe1, 0xc1, 0x4f, 0x6d, 0x20, 0xe4, 0x0f, 0x49, 0xf5, 0x51, 0xe2, 0xbf, 0xff, 0x05, 0x5f, 0x51, 0xf0, 0xfa, 0x9b, 0x7e, 0x4a, 0xc1, 0x57, 0xa8, 0xc0, 0xf8, 0xed, 0x78, 0x7c, 0x81, 0xf5, 0x98, - 0x7e, 0x9b, 0x8c, 0x61, 0x03, 0xa7, 0x35, 0xa7, 0x33, 0xd9, 0xa0, 0x04, 0xdb, 0x77, 0xf7, 0x25, 0x1c, 0x4f, 0xd6, 0xbd, 0x2a, 0x0b, 0x3d, 0x5d, 0x0b, 0x70, 0x2a, 0x98, 0x34, 0x45, 0x52, 0x4b, - 0x9b, 0x94, 0x2a, 0x1b, 0x1c, 0x1d, 0x65, 0x3a, 0x68, 0xa1, 0xf5, 0xc1, 0xb6, 0x66, 0x5e, 0xbd, 0xdf, 0x08, 0xe1, 0x32, 0xd8, 0x1d, 0xfb, 0x2d, 0x87, 0x24, 0xd9, 0x94, 0x8a, 0xea, 0xbd, 0xb7, - 0x38, 0x32, 0x1b, 0xeb, 0x11, 0xfd, 0x7e, 0x80, 0xe4, 0xbf, 0x2c, 0xf0, 0x83, 0x34, 0x29, 0x4d, 0x2f, 0xf2, 0x93, 0xd0, 0x7e, 0xeb, 0xdd, 0xfb, 0x2d, 0xed, 0xe2, 0xfb, 0xb9, 0x40, 0xf8, 0x33, - 0x0a, 0xb0, 0x1f, 0xdb, 0x97, 0xa5, 0x15, 0xdb, 0xe3, 0x0b, 0x84, 0xc7, 0x44, 0x91, 0x77, 0x42, 0xb8, 0xb5, 0x99, 0x3d, 0x02, 0x15, 0xfc, 0xd6, 0xd7, 0x8b, 0x72, 0xc2, 0xad, 0x96, 0xda, 0x86, - 0x5d, 0xb8, 0xcd, 0xc6, 0x04, 0xd8, 0x22, 0x48, 0x1d, 0x3a, 0x99, 0x44, 0x7c, 0x55, 0x39, 0x98, 0x1e, 0x48, 0x4d, 0xee, 0x4b, 0x34, 0x29, 0x96, 0x76, 0x62, 0x98, 0x69, 0x6a, 0x56, 0x1b, 0xdc, - 0xc2, 0xf7, 0x25, 0xae, 0xe7, 0x9a, 0x3a, 0xa1, 0x47, 0xaa, 0x11, 0x6e, 0x2a, 0xcf, 0x7f, 0x58, 0x53, 0xfc, 0x5b, 0xfa, 0xc6, 0x0d, 0x13, 0x7f, 0x9a, 0x91, 0xff, 0x3e, 0x67, 0x63, 0x28, 0x15, - 0x3f, 0xda, 0xd6, 0xdf, 0x23, 0x7c, 0x6c, 0xdd, 0x2b, 0x49, 0x85, 0x7e, 0x61, 0xcf, 0xb8, 0x77, 0x6e, 0x40, 0x5f, 0xf0, 0x6e, 0x19, 0xe3, 0x2b, 0xa0, 0xc7, 0xb8, 0x2f, 0x05, 0x19, 0xad, 0x0f, - 0x84, 0x75, 0x8c, 0x9a, 0x4a, 0x59, 0x9f, 0xda, 0xf6, 0xb4, 0x9c, 0x81, 0x42, 0xed, 0x7b, 0x07, 0xce, 0x67, 0x88, 0x7d, 0x47, 0x1b, 0x22, 0xb6, 0x53, 0x4e, 0xb3, 0xe9, 0x84, 0x8a, 0xe5, 0x63, - 0xc3, 0xbb, 0x45, 0x2a, 0xf2, 0xed, 0x51, 0x14, 0xf9, 0x8d, 0xb0, 0x26, 0xa7, 0x2b, 0x83, 0x19, 0x41, 0xcc, 0xfe, 0x10, 0xf1, 0xe9, 0x06, 0x92, 0xa7, 0x70, 0x22, 0x23, 0xee, 0xb1, 0x79, 0x84, - 0xfb, 0xbf, 0x6b, 0x87, 0x88, 0xaf, 0x49, 0xb7, 0xf7, 0x13, 0x64, 0xa0, 0x5f, 0xc8, 0xcf, 0x2b, 0x80, 0xde, 0xe0, 0xbe, 0xe0, 0xf3, 0x72, 0x32, 0xbe, 0x82, 0x7b, 0x8c, 0x52, 0x6d, 0x76, 0x1c, - 0x19, 0x42, 0x8c, 0xf5, 0xfb, 0xfd, 0x7c, 0x74, 0xcc, 0xa6, 0x05, 0x2d, 0x53, 0xc9, 0x06, 0x94, 0xdd, 0xd5, 0xf4, 0x28, 0xec, 0x41, 0xb1, 0xda, 0x43, 0x9c, 0xa6, 0xcc, 0x1b, 0xb4, 0x1c, 0x8d, - 0xf6, 0x5c, 0x68, 0xba, 0x07, 0x7d, 0x0f, 0xba, 0xf8, 0x08, 0x95, 0xe0, 0x7a, 0x85, 0x6e, 0x03, 0x31, 0xe8, 0xbb, 0x72, 0x39, 0x81, 0xfa, 0x53, 0xad, 0xb0, 0x18, 0xe8, 0xf5, 0xba, 0xad, 0xfa, - 0x8f, 0x36, 0xdd, 0xfb, 0x7b, 0xc4, 0x1b, 0xc3, 0xbd, 0x70, 0xd7, 0x4f, 0x59, 0x7b, 0x30, 0x3d, 0x92, 0xf1, 0xb5, 0x73, 0xec, 0x5d, 0xe6, 0x7e, 0x26, 0x33, 0xe4, 0x0d, 0xec, 0x85, 0x1c, 0x2f, - 0x27, 0x43, 0x72, 0x3c, 0xce, 0xd4, 0x58, 0x51, 0x41, 0xbb, 0x4d, 0x40, 0x62, 0xd7, 0x01, 0xab, 0x96, 0x0f, 0x90, 0xfe, 0x10, 0x1e, 0xfc, 0x10, 0x5e, 0xef, 0x1b, 0x37, 0xd3, 0xbb, 0x70, 0xa6, - 0x31, 0xbe, 0xcb, 0xe2, 0xd2, 0x09, 0xe7, 0x28, 0xd6, 0xd8, 0x76, 0x6d, 0x2b, 0xef, 0xb6, 0xd5, 0x89, 0xd9, 0x8f, 0x88, 0xe8, 0x90, 0xce, 0x58, 0xd6, 0x42, 0x78, 0x64, 0xa5, 0xb6, 0xeb, 0xb6, - 0xa9, 0xeb, 0xa4, 0x24, 0xe5, 0x09, 0xb0, 0xb4, 0xe9, 0xbf, 0xc8, 0xe0, 0x43, 0xfa, 0xd5, 0xbd, 0x1f, 0x64, 0xfb, 0x15, 0x32, 0x91, 0xe7, 0x34, 0xc9, 0x17, 0xa8, 0x57, 0x5c, 0x5e, 0x8f, 0xc7, - 0xc8, 0x30, 0x6d, 0x72, 0x4d, 0x64, 0x38, 0xe2, 0x49, 0xfe, 0x79, 0x4f, 0xe4, 0x66, 0x4c, 0xdb, 0x42, 0x0a, 0xe1, 0x23, 0xc4, 0x68, 0xd2, 0xad, 0x0a, 0x5e, 0xe1, 0x31, 0x55, 0x14, 0xe9, 0x5e, - 0x43, 0x0e, 0xbc, 0xc9, 0x82, 0x02, 0xd7, 0x19, 0x6d, 0xe6, 0xc4, 0x07, 0x80, 0x03, 0xb1, 0x7e, 0x4e, 0xf7, 0xad, 0x48, 0xc9, 0xbb, 0x8e, 0x31, 0x55, 0xbc, 0x42, 0x64, 0x7e, 0xb4, 0xc1, 0xf4, - 0x7c, 0x22, 0xf2, 0xab, 0xe5, 0xf3, 0x8c, 0x7d, 0x51, 0x7e, 0xc6, 0xf6, 0x29, 0xd3, 0x93, 0x17, 0xa4, 0x5c, 0xfc, 0x07, 0xc4, 0x0f, 0x19, 0xfc, 0xbf, 0x0d, 0xa5, 0x86, 0x7f, 0xd7, 0x76, 0x3d, - 0xa3, 0xef, 0x09, 0xe7, 0xe6, 0x0d, 0xe8, 0x0b, 0x2d, 0xfc, 0xb2, 0xba, 0xb8, 0xe4, 0x07, 0x38, 0x36, 0xd7, 0x65, 0x90, 0x84, 0xa8, 0xd1, 0x22, 0xc7, 0x75, 0x7e, 0xec, 0x0d, 0xab, 0x9b, 0xf8, - 0x5c, 0x29, 0x28, 0x4b, 0xc1, 0xe1, 0x47, 0x23, 0x79, 0xb1, 0x20, 0x50, 0x6a, 0x7a, 0x2a, 0xf1, 0xcc, 0x9e, 0xd6, 0x98, 0xea, 0xa2, 0x49, 0x61, 0x27, 0x3a, 0xce, 0x1f, 0x4e, 0xfc, 0xf1, 0x54, - 0x88, 0xfb, 0xbc, 0x6d, 0xc1, 0x75, 0xdc, 0x56, 0x23, 0xc9, 0x76, 0xc8, 0xc2, 0x75, 0xeb, 0x38, 0xdc, 0xb3, 0xfd, 0xbd, 0x91, 0xae, 0x8f, 0xb1, 0xf2, 0xce, 0xf1, 0xf2, 0xb5, 0xa6, 0xfe, 0x4c, - 0xf4, 0xea, 0x33, 0xf0, 0xf7, 0x58, 0xba, 0x5d, 0x1a, 0x1a, 0xc7, 0x12, 0xd1, 0x82, 0x74, 0x3d, 0x8b, 0x04, 0x3b, 0x8f, 0x07, 0xc0, 0x00, 0xe2, 0x91, 0x09, 0x3c, 0x09, 0x5a, 0x5b, 0x45, 0x1c, - 0x7f, 0xe9, 0x52, 0xa6, 0xc5, 0xb7, 0xc1, 0xda, 0x82, 0xd7, 0x04, 0x2e, 0x42, 0x08, 0x66, 0x8e, 0xb8, 0xd9, 0x69, 0x31, 0xcd, 0xad, 0xe3, 0x46, 0x84, 0x76, 0x9b, 0x49, 0x3d, 0x77, 0x5c, 0xc5, - 0xa0, 0xe5, 0x7e, 0xe2, 0x34, 0xc7, 0x40, 0x90, 0x19, 0x9b, 0x73, 0x73, 0x0e, 0x7a, 0xbe, 0x34, 0x4f, 0x2f, 0x8a, 0x6b, 0xfa, 0xdc, 0x17, 0xb5, 0x1c, 0xfe, 0xc7, 0x62, 0xe1, 0x2f, 0x3c, 0x62, - 0x6f, 0xc9, 0x66, 0xd7, 0x99, 0x20, 0x3f, 0xd7, 0xea, 0x07, 0xcd, 0x30, 0x8e, 0xbf, 0xdd, 0x55, 0x7f, 0x4e, 0xcd, 0x0b, 0xfd, 0x6e, 0x9b, 0xe8, 0x63, 0x8a, 0xe1, 0xf3, 0xa8, 0xaf, 0x8d, 0x3d, - 0xab, 0x2d, 0x90, 0x35, 0xac, 0x03, 0xdc, 0x61, 0x4a, 0x47, 0x36, 0xe3, 0x05, 0x7d, 0x8e, 0xa5, 0x27, 0x77, 0xd9, 0xe9, 0x53, 0x99, 0xea, 0x8e, 0x6a, 0x63, 0xb2, 0x65, 0x93, 0x1e, 0xf4, 0xe5, - 0x3a, 0x07, 0x4a, 0xec, 0xa4, 0xae, 0x70, 0x40, 0x55, 0x05, 0xbc, 0xea, 0x09, 0x89, 0x3a, 0xd1, 0x7c, 0xb5, 0x4c, 0x76, 0x3c, 0x50, 0xa9, 0xd5, 0x1c, 0x51, 0xa4, 0x7d, 0x74, 0x87, 0x62, 0xf7, - 0x71, 0x90, 0xe8, 0x55, 0x5d, 0xe8, 0xd1, 0xd8, 0x4c, 0xe3, 0x4c, 0xbf, 0x3b, 0xd7, 0x02, 0xba, 0x64, 0x5c, 0xfd, 0x14, 0x21, 0x9f, 0x60, 0x03, 0xe3, 0xcf, 0x57, 0x2e, 0x9e, 0x92, 0x87, 0x21, - 0xf7, 0x5d, 0x81, 0x03, 0x44, 0x65, 0xc9, 0xcb, 0xae, 0x4d, 0x0a, 0xa1, 0xcc, 0x1a, 0xa3, 0x91, 0xd4, 0x15, 0x64, 0x64, 0x82, 0xf9, 0xd3, 0x8f, 0x4d, 0x2d, 0x7b, 0x9c, 0x96, 0xe3, 0xba, 0xf2, - 0xbf, 0x19, 0x2a, 0x86, 0x3c, 0x51, 0xae, 0xf9, 0x01, 0xf2, 0xf9, 0x43, 0xdf, 0x9f, 0x5f, 0x42, 0x39, 0x03, 0xca, 0x36, 0x9d, 0x26, 0x51, 0xa9, 0x4a, 0x33, 0x24, 0x42, 0x71, 0xa6, 0x0b, 0x6c, - 0x42, 0x77, 0x48, 0xc7, 0x03, 0xc9, 0x94, 0xed, 0x82, 0x83, 0x32, 0xc3, 0xb7, 0xae, 0xc7, 0xe4, 0x60, 0x8f, 0xcd, 0x67, 0x0e, 0x37, 0xd2, 0xd4, 0x8c, 0x55, 0xb8, 0xd5, 0x7e, 0x62, 0x19, 0xbe, - 0x73, 0x12, 0x43, 0x11, 0xc6, 0x6c, 0xa3, 0x80, 0xf0, 0x05, 0xc8, 0x11, 0xb6, 0xa4, 0xac, 0xfd, 0x92, 0x37, 0xb7, 0xcc, 0x72, 0x81, 0x7c, 0xdf, 0xed, 0xfb, 0x7c, 0x12, 0xa7, 0xf7, 0xf2, 0x11, - 0xcf, 0xea, 0x35, 0x44, 0x3d, 0x85, 0x8c, 0xf8, 0xd2, 0x17, 0xe8, 0x76, 0x34, 0xbe, 0x02, 0x7a, 0x8c, 0x01, 0x34, 0x6b, 0x20, 0x07, 0x36, 0xb6, 0xb3, 0x00, 0x64, 0x6c, 0x17, 0xd8, 0x7a, 0x8b, - 0xfc, 0x54, 0x54, 0x8d, 0x6d, 0x8b, 0x18, 0xb0, 0x00, 0xe4, 0x83, 0x4d, 0xf9, 0x3c, 0x5e, 0xef, 0xb5, 0x3e, 0x48, 0xa4, 0xa8, 0xde, 0xd1, 0xa8, 0x70, 0x50, 0x1c, 0x72, 0xaa, 0x50, 0x14, 0x2b, - 0x0b, 0xed, 0x62, 0x82, 0xd8, 0xdc, 0x8a, 0x26, 0x7a, 0x79, 0x9e, 0x0a, 0x04, 0x71, 0xac, 0x57, 0x84, 0xc7, 0x9b, 0xe0, 0x23, 0x29, 0xe6, 0xe9, 0xe5, 0x2a, 0x29, 0x2b, 0x3d, 0x8a, 0x76, 0x66, - 0xe1, 0x67, 0xd5, 0x70, 0x29, 0x67, 0x7a, 0x69, 0xe8, 0x5b, 0xfa, 0xd5, 0x81, 0x8d, 0xfc, 0xc2, 0x3e, 0x07, 0x07, 0x8c, 0xda, 0xbd, 0xdd, 0x82, 0x3f, 0xe6, 0xde, 0x7f, 0x35, 0x01, 0xe5, 0x0b, - 0x49, 0xf9, 0x60, 0xd2, 0x7f, 0x56, 0x56, 0x85, 0x6d, 0xff, 0x2a, 0xec, 0xb8, 0x7b, 0x95, 0xa3, 0xe4, 0xfb, 0x07, 0x4a, 0x3b, 0x6e, 0x6e, 0xee, 0x75, 0xec, 0x17, 0xf1, 0x11, 0x76, 0xe9, 0xc7, - 0x59, 0x64, 0x8f, 0xeb, 0xec, 0xd2, 0xfe, 0x2d, 0x49, 0x2b, 0xdf, 0xf1, 0x6f, 0xcf, 0xfe, 0x56, 0x2a, 0x70, 0xcb, 0x37, 0x28, 0xc7, 0x66, 0x1a, 0xa5, 0x2f, 0xf0, 0x3e, 0x65, 0xfd, 0x55, 0x69, - 0xfd, 0xfa, 0x3b, 0x3f, 0x89, 0xf3, 0x3a, 0xb1, 0x6c, 0xa7, 0xd4, 0x9d, 0x6b, 0x90, 0x04, 0xbe, 0x94, 0x0c, 0xde, 0xee, 0xbe, 0x09, 0xf4, 0xdf, 0x8c, 0xd5, 0x37, 0xd6, 0xbc, 0xd4, 0x1a, 0xdc, - 0x4e, 0x9f, 0xb1, 0x5b, 0xc9, 0x8f, 0xa9, 0xb9, 0xaf, 0x7f, 0xf6, 0xa5, 0x03, 0xe2, 0x65, 0x9a, 0x50, 0x9a, 0xd9, 0x89, 0x99, 0x46, 0x91, 0x6d, 0x56, 0x7e, 0x63, 0x7f, 0xf8, 0x9c, 0x8f, 0x2e, - 0x8a, 0x8f, 0x0f, 0x5e, 0x5c, 0x15, 0x2f, 0x3f, 0xfd, 0xe5, 0x8d, 0x0f, 0xd7, 0xdf, 0x47, 0xa7, 0xd2, 0x83, 0x09, 0x92, 0xcf, 0xb5, 0x4b, 0xfb, 0x6a, 0x82, 0xe4, 0x80, 0x86, 0x68, 0xd0, 0xb8, - 0xb2, 0x24, 0x19, 0x99, 0x2e, 0xb4, 0xc2, 0x5f, 0x2b, 0xb1, 0xc3, 0x2d, 0x9c, 0x28, 0x5d, 0x92, 0x44, 0x74, 0xa8, 0x1b, 0xf0, 0xdf, 0xdd, 0x42, 0xf8, 0x12, 0x3d, 0xaf, 0x5c, 0xfd, 0x15, 0x72, - 0x3e, 0xf2, 0xf9, 0x50, 0xe4, 0x5c, 0x41, 0x02, 0xe3, 0xdb, 0xc1, 0xf8, 0x02, 0xe5, 0xb1, 0xb8, 0x2a, 0xf5, 0x5a, 0x9f, 0x39, 0x80, 0xa0, 0x59, 0x07, 0xb7, 0x60, 0xf7, 0xdc, 0x71, 0x29, 0x55, - 0x99, 0xaa, 0x43, 0xbe, 0xe4, 0x6f, 0x4c, 0xdd, 0x36, 0xfc, 0x8d, 0x08, 0x4d, 0xd6, 0x56, 0x26, 0x46, 0xca, 0x12, 0x8e, 0xa6, 0x8d, 0x7d, 0x12, 0x2d, 0x15, 0xc3, 0xca, 0x44, 0x98, 0x77, 0x1b, - 0x42, 0xec, 0xb3, 0xda, 0xca, 0x8d, 0xe9, 0x0a, 0xcc, 0xd5, 0xb9, 0xc3, 0xeb, 0xe5, 0xd2, 0xea, 0xb8, 0xd9, 0xe2, 0x51, 0x58, 0xf3, 0xb7, 0x85, 0xf2, 0xb6, 0xca, 0xcf, 0xeb, 0xe4, 0x76, 0xf6, - 0x2c, 0x6e, 0x3f, 0xaf, 0xf4, 0xaf, 0x71, 0xfc, 0x4c, 0x0a, 0xde, 0x47, 0xd0, 0x67, 0x5c, 0x7f, 0xb8, 0x30, 0xc6, 0x1e, 0xa7, 0xdf, 0x5d, 0x14, 0xdd, 0xe0, 0x10, 0xb4, 0x96, 0xba, 0xaa, 0x50, - 0x90, 0xdc, 0xae, 0x7c, 0x3a, 0x9f, 0xaa, 0x68, 0x2a, 0x6f, 0x4a, 0x57, 0x86, 0x99, 0x9c, 0x5e, 0xf4, 0x25, 0x2c, 0x64, 0x61, 0x8c, 0xea, 0xe2, 0xd1, 0x08, 0xe2, 0x91, 0xc6, 0x28, 0x8c, 0xa9, - 0xa0, 0x3b, 0x67, 0xce, 0xed, 0x0b, 0xb4, 0xde, 0x72, 0x5a, 0xac, 0x83, 0x76, 0x87, 0x3a, 0x58, 0xe4, 0xb2, 0x45, 0x38, 0x01, 0x75, 0x15, 0x14, 0xb7, 0xe9, 0xf3, 0x16, 0xda, 0xbb, 0xb5, 0xfa, - 0xec, 0x0c, 0xf7, 0x61, 0x0b, 0x21, 0xfb, 0xd6, 0xe5, 0xf0, 0x73, 0x72, 0x9c, 0x21, 0x5e, 0x76, 0xe8, 0xac, 0x1a, 0xd4, 0xa8, 0x0f, 0x1a, 0x1b, 0x16, 0xe8, 0x35, 0xbb, 0xf4, 0x24, 0xaa, 0xf5, - 0xce, 0x4c, 0x90, 0x83, 0xe7, 0xf8, 0x31, 0x89, 0x1c, 0x57, 0xf8, 0x08, 0x7d, 0x16, 0x7b, 0xba, 0x61, 0x14, 0x97, 0xe7, 0xff, 0xfc, 0xa2, 0x59, 0xc0, 0x17, 0x3b, 0xc2, 0x05, 0x09, 0xb7, 0xed, - 0x20, 0xab, 0x7e, 0xbe, 0x17, 0x0c, 0xb1, 0x83, 0xef, 0x46, 0xd1, 0xef, 0xc9, 0xe2, 0x9f, 0x5b, 0x0a, 0x5f, 0xbf, 0xe2, 0x42, 0x8d, 0xaf, 0x6e, 0x5c, 0xe4, 0xf4, 0x00, 0x8b, 0x22, 0x83, 0x15, - 0xa8, 0x74, 0x73, 0x3f, 0x40, 0xfa, 0xed, 0xb6, 0x93, 0xa6, 0x20, 0x4e, 0xcc, 0x5c, 0x08, 0x37, 0x9c, 0xfe, 0xb0, 0x1c, 0xb5, 0x84, 0xd7, 0xd9, 0x6e, 0x9c, 0xad, 0x1a, 0x0d, 0x5d, 0x73, 0x41, - 0x5e, 0x2d, 0xf8, 0x03, 0xbd, 0x6a, 0xd8, 0x38, 0x98, 0x9c, 0x90, 0x4e, 0x20, 0x8e, 0x7b, 0x9b, 0x6a, 0x36, 0x6b, 0x37, 0x4c, 0x39, 0x5e, 0x08, 0x5a, 0x71, 0x91, 0xba, 0xb3, 0x74, 0xab, 0xce, - 0x1f, 0x69, 0x4f, 0xdf, 0x2c, 0x8d, 0xdf, 0xe6, 0x61, 0xbe, 0x64, 0xb8, 0xbd, 0xdb, 0x4c, 0x7f, 0x6b, 0x4f, 0x7c, 0x56, 0x10, 0xb0, 0xcf, 0xb5, 0x02, 0xaf, 0x6a, 0x0c, 0xf1, 0x0b, 0xf9, 0xa8, - 0x03, 0x35, 0x7a, 0xe4, 0x5f, 0x35, 0x98, 0x2c, 0x7e, 0x45, 0x5a, 0xe4, 0x9b, 0x76, 0x72, 0xab, 0x7b, 0x44, 0x9e, 0xea, 0x44, 0x31, 0x28, 0x21, 0xec, 0x3d, 0xb5, 0xee, 0xe6, 0xd5, 0x3f, 0xb7, - 0x5b, 0x7f, 0x04, 0xfd, 0x89, 0x33, 0x2a, 0x6f, 0xc8, 0xce, 0x7d, 0xb1, 0x31, 0x6d, 0xad, 0xc4, 0xd8, 0x12, 0x51, 0xaa, 0xa9, 0x5f, 0x2e, 0x95, 0x8c, 0xda, 0xc1, 0x0b, 0xb9, 0x23, 0xad, 0x3c, - 0xcc, 0x16, 0x3e, 0x3a, 0x39, 0xec, 0x7a, 0x64, 0xa1, 0xe7, 0x3e, 0x83, 0xdb, 0x7d, 0x6d, 0x80, 0x18, 0x04, 0x33, 0xbb, 0xbe, 0x52, 0xe5, 0x56, 0x9e, 0xe0, 0x53, 0x7c, 0xb5, 0x31, 0xc4, 0xf0, - 0x08, 0x0b, 0x89, 0x01, 0xc4, 0x33, 0x54, 0x39, 0xa6, 0xc1, 0x54, 0x6a, 0xcd, 0x96, 0x7d, 0xc4, 0x11, 0x7f, 0x57, 0xa1, 0xd4, 0xad, 0xa5, 0x9b, 0x9f, 0x94, 0xd9, 0x77, 0xad, 0xe4, 0x88, 0x27, - 0xd0, 0xfb, 0x11, 0x34, 0x30, 0xfe, 0x74, 0x61, 0x7c, 0x81, 0xfa, 0x18, 0xbd, 0x3a, 0x91, 0x31, 0x4b, 0xcb, 0x83, 0x4e, 0x9b, 0x15, 0xed, 0xee, 0xbb, 0x9d, 0xbc, 0x70, 0xd9, 0xed, 0x09, 0x38, - 0xb5, 0x33, 0xad, 0x0c, 0x39, 0x48, 0xb6, 0x70, 0xdb, 0x3d, 0x1e, 0x39, 0x84, 0xb1, 0x24, 0x05, 0xd5, 0xb6, 0x02, 0xc7, 0xcc, 0xe4, 0xfd, 0x7c, 0xe4, 0xb5, 0x1d, 0xcc, 0xca, 0xd3, 0xd1, 0x24, - 0x1a, 0xed, 0x3a, 0x56, 0xa5, 0xb9, 0xa4, 0xed, 0x81, 0xa0, 0xf3, 0x80, 0xbc, 0xae, 0x36, 0xf2, 0xa3, 0xbd, 0xe8, 0xd9, 0xb0, 0xd9, 0xe0, 0xe2, 0xf9, 0x17, 0x5c, 0x7c, 0x17, 0xe0, 0xff, 0xb9, - 0xcc, 0x7b, 0x85, 0xfa, 0x0e, 0xdb, 0xd7, 0x20, 0xff, 0x00, 0xc9, 0x56, 0xd9, 0x5d, 0xce, 0x36, 0x73, 0xa5, 0x67, 0xc3, 0x1c, 0x9b, 0x50, 0xa1, 0x4f, 0xce, 0x0f, 0x0a, 0x4d, 0x81, 0xb0, 0xcc, - 0x48, 0x70, 0x1e, 0x9e, 0x62, 0x8b, 0x46, 0x13, 0xd6, 0x19, 0xb5, 0x01, 0xcf, 0xd2, 0x8a, 0x7b, 0xea, 0xa7, 0x8a, 0xc6, 0x4d, 0x4f, 0xd9, 0x2c, 0xa7, 0xb6, 0x0d, 0x43, 0x6e, 0x63, 0x4f, 0xe1, - 0x8a, 0xd1, 0x8a, 0x6c, 0x91, 0x09, 0x87, 0x52, 0x87, 0x13, 0x82, 0x1f, 0x71, 0xf5, 0x91, 0x87, 0xfb, 0xbe, 0x64, 0xb3, 0x6c, 0xc7, 0x4f, 0xec, 0x71, 0x56, 0xa4, 0x99, 0x5d, 0x54, 0xfe, 0x2d, - 0x3c, 0xfd, 0x11, 0x2f, 0x97, 0x0a, 0xeb, 0xb1, 0x6e, 0x94, 0x55, 0xa1, 0x9b, 0x2f, 0xf6, 0x1d, 0x44, 0xfe, 0x02, 0xc7, 0x89, 0x7d, 0xaa, 0x9e, 0x10, 0x49, 0xff, 0x50, 0xe3, 0x92, 0x1b, 0xad, - 0x6e, 0xe9, 0x6b, 0xf7, 0xf8, 0xe1, 0xe7, 0x2a, 0xf7, 0x3b, 0xb8, 0x6f, 0x1c, 0x71, 0x3e, 0xbb, 0xb6, 0xc4, 0x79, 0xcc, 0x13, 0x5c, 0x4d, 0x33, 0x3b, 0x99, 0x97, 0xb7, 0x45, 0xb4, 0x52, 0x79, - 0x67, 0xb9, 0xe9, 0x67, 0xb8, 0x91, 0x09, 0x35, 0x52, 0x1d, 0x2b, 0xe4, 0xd4, 0x04, 0x9c, 0x25, 0xad, 0xc4, 0xd1, 0xdc, 0xde, 0x83, 0x11, 0x67, 0xa0, 0x1b, 0x52, 0x91, 0x08, 0x70, 0xaa, 0xcf, - 0x4e, 0x5e, 0xcd, 0xb9, 0xf5, 0x0e, 0x56, 0x17, 0xa3, 0x45, 0x10, 0x76, 0xdb, 0x96, 0xef, 0x4b, 0x0e, 0xd3, 0xc2, 0x6a, 0x15, 0x3b, 0xde, 0x5f, 0x95, 0x6d, 0x03, 0x07, 0xf5, 0x5c, 0xbf, 0xf6, - 0x97, 0x5e, 0x96, 0xbe, 0x7b, 0xcf, 0xf7, 0x82, 0x3e, 0x15, 0xfc, 0xf8, 0x00, 0xf9, 0x15, 0xaf, 0xb7, 0xf3, 0x8b, 0x2f, 0x79, 0x40, 0x10, 0xc4, 0x3f, 0xed, 0x61, 0x16, 0xdb, 0x2f, 0xd5, 0x92, - 0xce, 0x3a, 0x5f, 0x16, 0x8e, 0x9b, 0x58, 0x19, 0xc1, 0xcc, 0x32, 0x53, 0x55, 0x1b, 0x5b, 0xf9, 0xc8, 0x76, 0xe4, 0xa0, 0xf6, 0x48, 0x5f, 0xcf, 0xe9, 0xa5, 0x9e, 0x62, 0x7a, 0x3c, 0x97, 0x14, - 0x7c, 0x0d, 0xf2, 0x3c, 0x6e, 0x02, 0xac, 0x4c, 0x4e, 0x6c, 0x94, 0xa8, 0xab, 0xe9, 0x09, 0x5e, 0xb0, 0x24, 0xe5, 0x9d, 0x16, 0x13, 0x5c, 0xdd, 0xc5, 0x9b, 0xfa, 0x91, 0x59, 0xf3, 0x93, 0x96, - 0x22, 0x9f, 0x72, 0x2c, 0x07, 0x2d, 0xc6, 0xaf, 0x3b, 0x54, 0xbd, 0x7b, 0xe0, 0x23, 0xa3, 0x5f, 0x21, 0xfc, 0xbf, 0xb3, 0x4a, 0x93, 0xb1, 0x7d, 0xf2, 0xab, 0x71, 0x64, 0xeb, 0xe1, 0xd8, 0x29, - 0xec, 0xfb, 0x09, 0x0f, 0xcf, 0xc4, 0x29, 0x7e, 0x83, 0x7e, 0xe6, 0xac, 0xcf, 0xd7, 0x86, 0x8e, 0xce, 0x39, 0xd4, 0x53, 0x5d, 0xd3, 0xe8, 0x40, 0xb2, 0x35, 0xa4, 0x91, 0x5b, 0x97, 0x9f, 0x90, - 0xec, 0x89, 0x4e, 0xcb, 0x55, 0x5d, 0xcc, 0x7c, 0x5a, 0x01, 0x4b, 0x08, 0x29, 0x56, 0xd0, 0xb1, 0x8d, 0x75, 0x61, 0x34, 0x0a, 0x1a, 0xf3, 0x24, 0x10, 0x04, 0xad, 0xa4, 0x62, 0x63, 0x27, 0x9a, - 0x6d, 0x64, 0x53, 0x1a, 0x8e, 0x49, 0x65, 0x0a, 0x01, 0x4c, 0x5a, 0x0a, 0x47, 0x61, 0x1b, 0x24, 0x12, 0x9d, 0x01, 0xed, 0xb7, 0x5e, 0xce, 0xdb, 0x78, 0xc8, 0xaf, 0x85, 0xd7, 0x33, 0x9e, 0xed, - 0x33, 0xc0, 0x0b, 0x0e, 0xcc, 0x81, 0x3e, 0x6c, 0x65, 0x56, 0xea, 0x19, 0xa2, 0x28, 0x4b, 0xb9, 0x94, 0xf8, 0x72, 0x4e, 0x25, 0xf3, 0x29, 0x4e, 0x60, 0x88, 0xaa, 0x53, 0x5f, 0x17, 0xe2, 0x0f, - 0x58, 0x16, 0x3f, 0x9b, 0x6c, 0x79, 0x0d, 0x27, 0xe9, 0xd5, 0x5d, 0xa3, 0x1e, 0x7c, 0xaa, 0x9c, 0xf9, 0x0d, 0xec, 0x19, 0x1d, 0xaf, 0x27, 0x63, 0x70, 0x58, 0x09, 0x33, 0x81, 0x4a, 0xd1, 0x11, - 0x9b, 0x4f, 0x13, 0x2f, 0x47, 0x03, 0xe9, 0x74, 0x90, 0x85, 0xcd, 0x4c, 0x97, 0xda, 0xe2, 0xc0, 0xa9, 0xdb, 0xbc, 0x5c, 0x94, 0xbe, 0x82, 0xd3, 0xeb, 0x16, 0x55, 0x37, 0xa4, 0x17, 0x57, 0x31, - 0x04, 0xb6, 0x53, 0xb0, 0xcb, 0xb4, 0x09, 0xdb, 0x62, 0xab, 0x55, 0x46, 0x62, 0x9c, 0xb6, 0x2d, 0x28, 0x68, 0x94, 0x5b, 0x90, 0xd4, 0x34, 0x0c, 0xd7, 0xba, 0x44, 0x10, 0x48, 0xf3, 0x47, 0x0a, - 0xd4, 0x77, 0xfb, 0xba, 0x9d, 0x5d, 0xf5, 0x9e, 0x6b, 0x55, 0xd5, 0x07, 0x01, 0xe2, 0xe8, 0xe5, 0x99, 0xdb, 0x1b, 0x3b, 0x29, 0xbd, 0xca, 0xf6, 0xaf, 0xc1, 0x58, 0xf8, 0xc3, 0xe8, 0xd4, 0x3f, - 0xfe, 0xf8, 0xf3, 0x56, 0xdd, 0x7f, 0xfe, 0x7b, 0xf4, 0x53, 0xb2, 0xda, 0x8f, 0x8a, 0xdc, 0xff, 0x05, 0x7e, 0x60, 0xcc, 0x33, 0xbd, 0xd3, 0xc2, 0x1a, 0x9f, 0x89, 0xfe, 0xfa, 0xe7, 0x4f, 0x84, - 0xc5, 0x86, 0xd6, 0xc0, 0xa7, 0x8d, 0x5d, 0x44, 0xa9, 0x6e, 0x9d, 0xc5, 0x6a, 0x65, 0x7f, 0x3f, 0x49, 0xe0, 0x99, 0x0c, 0xb7, 0x2f, 0xe0, 0x9f, 0x19, 0xe8, 0xf7, 0xab, 0x97, 0x68, 0xf1, 0x00, - 0x0d, 0xd1, 0x20, 0x54, 0xcd, 0x88, 0xbd, 0x3a, 0x48, 0x72, 0x2e, 0xdd, 0x80, 0x1a, 0xce, 0x09, 0x3d, 0x0d, 0x24, 0x9e, 0x23, 0x26, 0x0c, 0x48, 0x6a, 0xfb, 0xe5, 0xae, 0xef, 0x83, 0xfd, 0xb6, - 0xb5, 0x5d, 0x03, 0xe3, 0xa8, 0x74, 0x42, 0xd3, 0x74, 0x76, 0x42, 0x1c, 0xaa, 0x86, 0x25, 0xc0, 0x41, 0x0e, 0x0b, 0x9d, 0x9e, 0xee, 0xc5, 0x00, 0x17, 0xd7, 0xc9, 0x42, 0x76, 0x54, 0x28, 0x9d, - 0x57, 0x55, 0xee, 0x0c, 0x2c, 0x86, 0x7f, 0x5f, 0xcf, 0xf6, 0x52, 0x04, 0xf0, 0x18, 0xc5, 0xd9, 0x38, 0xf2, 0x63, 0xff, 0x9e, 0x5d, 0x03, 0x3f, 0x55, 0x32, 0x73, 0x83, 0x09, 0x8c, 0x5f, 0x8e, - 0x2e, 0xdd, 0x6c, 0x06, 0x08, 0x65, 0x00, 0x20, 0xc9, 0x78, 0xae, 0xec, 0xd6, 0x27, 0x32, 0x3a, 0x4d, 0xfb, 0xd6, 0xa2, 0xe9, 0xc9, 0x7e, 0xcd, 0xc2, 0xdb, 0x4e, 0x99, 0x40, 0xf0, 0xc8, 0x5e, - 0x1d, 0x89, 0xed, 0x8c, 0x85, 0x77, 0x39, 0x1b, 0xd3, 0xa1, 0xbd, 0x91, 0xa9, 0xfc, 0x24, 0x35, 0x4a, 0xbd, 0xeb, 0xf6, 0x41, 0x8c, 0xcc, 0xe5, 0x38, 0x9b, 0x30, 0xdb, 0x7a, 0xee, 0x98, 0x21, - 0xbd, 0xca, 0x19, 0xfd, 0xb0, 0x90, 0x67, 0x27, 0x03, 0x7f, 0x7e, 0x21, 0x66, 0xe3, 0xaa, 0xe8, 0x5e, 0x17, 0xd8, 0xcf, 0x5d, 0x6a, 0x7f, 0x63, 0xb6, 0xe1, 0x0f, 0xd3, 0xcb, 0xdf, 0x15, 0x90, - 0xdf, 0xd3, 0xea, 0x9e, 0x22, 0x6b, 0x7a, 0xab, 0xe3, 0x7d, 0x39, 0x1c, 0x9a, 0x17, 0x20, 0x11, 0x94, 0xa6, 0x01, 0x60, 0x4b, 0x9f, 0x36, 0x8b, 0x1a, 0x49, 0x8f, 0xdb, 0xa8, 0x27, 0x83, 0x0e, - 0x08, 0x0d, 0xaf, 0xe4, 0x8a, 0x1d, 0xb1, 0xdb, 0x68, 0x84, 0x70, 0x62, 0x96, 0x13, 0x77, 0x8d, 0x8d, 0xe6, 0x70, 0x5c, 0xcd, 0x15, 0xd8, 0xd9, 0xc0, 0x26, 0x5f, 0x4d, 0x3c, 0xc8, 0x5c, 0x1e, - 0x43, 0xb1, 0x34, 0xfa, 0xf9, 0x81, 0x58, 0x8d, 0x98, 0x54, 0xda, 0xd8, 0xf8, 0xb1, 0x02, 0xd3, 0x0d, 0xf1, 0x48, 0x4b, 0xfe, 0xb6, 0xbe, 0xfe, 0xc6, 0xf4, 0xd7, 0x7c, 0xdd, 0x9f, 0x93, 0x76, - 0x48, 0x82, 0xfa, 0x0b, 0xfb, 0x7c, 0xbd, 0xb0, 0x9e, 0xc9, 0x3e, 0xbc, 0x40, 0xbc, 0xa0, 0xbf, 0x2a, 0xba, 0x4b, 0x26, 0xee, 0x10, 0xdc, 0xa3, 0x89, 0x40, 0x1f, 0xf6, 0xb4, 0x0c, 0x4e, 0xa8, - 0x19, 0x82, 0x01, 0x8b, 0x10, 0xa9, 0xd7, 0x0e, 0x40, 0xa8, 0x47, 0x43, 0x34, 0xbb, 0xd4, 0xdb, 0x6d, 0xac, 0x86, 0x3e, 0xad, 0xa4, 0x1d, 0xe7, 0x7a, 0xf3, 0x08, 0xb5, 0x09, 0xc8, 0x3b, 0xa4, - 0x8b, 0x64, 0xc2, 0x89, 0x3d, 0x65, 0x2a, 0xba, 0x7a, 0xe2, 0xe1, 0x15, 0x04, 0x6e, 0xf6, 0xd3, 0x11, 0x12, 0x6c, 0xad, 0xa6, 0x49, 0x37, 0x2d, 0x6e, 0x3d, 0xd2, 0xa3, 0x07, 0xaf, 0x8c, 0x6f, - 0xd0, 0xf7, 0x69, 0x02, 0xff, 0xd7, 0x62, 0xff, 0x99, 0x44, 0xb7, 0x0f, 0x90, 0xcf, 0xe8, 0x7c, 0x7f, 0x3e, 0x34, 0xdd, 0x6d, 0x21, 0xc2, 0x8c, 0x22, 0x65, 0xe2, 0x81, 0x04, 0xd2, 0x11, 0xdd, - 0x92, 0xc7, 0xbc, 0x72, 0x34, 0x4d, 0x70, 0x38, 0x49, 0xd1, 0x8e, 0xa1, 0xe1, 0x5b, 0x0c, 0x15, 0x62, 0x45, 0x16, 0x01, 0xde, 0x14, 0x69, 0xaa, 0xe5, 0x72, 0xe2, 0x2c, 0x62, 0x78, 0xe5, 0xf8, - 0x78, 0xae, 0x1c, 0x46, 0x66, 0x3a, 0x5b, 0x84, 0x85, 0xbc, 0xd1, 0xe8, 0x13, 0x83, 0xb0, 0x69, 0x85, 0x85, 0x66, 0x29, 0x45, 0xde, 0xe8, 0x79, 0x67, 0xc0, 0xd9, 0x3c, 0x29, 0xfd, 0xea, 0x66, - 0x77, 0x3c, 0x17, 0x02, 0x18, 0x48, 0x95, 0xd2, 0xbe, 0xb4, 0x7f, 0xba, 0x43, 0x12, 0xec, 0x39, 0xce, 0x7e, 0x05, 0x7b, 0xa5, 0xc7, 0xed, 0x64, 0x8c, 0x0d, 0xe3, 0x71, 0xbd, 0x9b, 0x6e, 0x9a, - 0x18, 0xc8, 0xbc, 0xe9, 0xe2, 0xc4, 0x87, 0x47, 0x69, 0x37, 0xdd, 0x92, 0xb0, 0x3f, 0x6b, 0xcd, 0x8a, 0x04, 0x98, 0x34, 0xd9, 0x31, 0xee, 0x74, 0x77, 0x52, 0x4e, 0x33, 0xa2, 0xb1, 0xf1, 0x60, - 0xe9, 0xba, 0xe5, 0x3c, 0x42, 0x1d, 0xed, 0x20, 0x4e, 0x04, 0x89, 0x73, 0xc5, 0x74, 0xe3, 0xd7, 0x07, 0x20, 0xb5, 0xbc, 0x79, 0xb1, 0xe8, 0x45, 0x55, 0x6b, 0x0d, 0xdf, 0x99, 0x92, 0xd2, 0xf3, - 0xc4, 0xf8, 0x9f, 0x86, 0x6e, 0xd8, 0x11, 0x70, 0xa9, 0x92, 0x77, 0x0a, 0xfd, 0x9a, 0xee, 0xfc, 0x2f, 0xe2, 0xb3, 0xcd, 0x78, 0xad, 0xb0, 0xbd, 0xb4, 0xd5, 0xff, 0xf3, 0x32, 0x33, 0xfe, 0x83, - 0x26, 0xf6, 0xa8, 0x53, 0xdd, 0x59, 0x74, 0x7d, 0x1a, 0x33, 0xff, 0x55, 0x43, 0x9a, 0xab, 0x09, 0xf9, 0xc5, 0x56, 0x34, 0x58, 0xc2, 0xfd, 0x87, 0x6f, 0x5e, 0x7a, 0xe5, 0x9d, 0xad, 0xba, 0xf2, - 0xee, 0x0c, 0xe6, 0xe7, 0x3a, 0x4d, 0xbe, 0x83, 0x7b, 0x61, 0xb2, 0xd7, 0xb3, 0xa1, 0xdd, 0x26, 0xf5, 0x90, 0x12, 0x3b, 0x4c, 0x24, 0x82, 0xa3, 0x01, 0x2b, 0xad, 0x69, 0x77, 0xd8, 0x3c, 0x6b, - 0x5c, 0x78, 0x93, 0xd2, 0x26, 0xa0, 0xad, 0x3c, 0x76, 0xc7, 0xf2, 0xbb, 0x49, 0x2c, 0xc5, 0x9d, 0x2b, 0x94, 0x8b, 0x36, 0x3c, 0x1c, 0x2a, 0xd0, 0xd1, 0x74, 0x30, 0x2f, 0xaa, 0x6d, 0x3f, 0x8a, - 0xf1, 0x6a, 0xbd, 0xa7, 0x97, 0x8e, 0x26, 0x92, 0xf3, 0x24, 0x9e, 0xa0, 0xdb, 0x05, 0xca, 0x2a, 0x1d, 0x01, 0x3c, 0x52, 0x4f, 0x06, 0x93, 0xe9, 0x01, 0x42, 0xfd, 0x8b, 0x1b, 0x30, 0x8d, 0xea, - 0xbb, 0x5a, 0xc1, 0xb3, 0xc2, 0xf4, 0x23, 0xf0, 0x17, 0xd4, 0xbe, 0xbb, 0x34, 0x44, 0xa4, 0x42, 0xe3, 0x39, 0x58, 0xef, 0xf4, 0x25, 0x77, 0xe0, 0x84, 0x11, 0x69, 0x97, 0x58, 0x41, 0xed, 0x33, - 0x3d, 0xf1, 0x2a, 0x53, 0x85, 0xbe, 0xee, 0x69, 0x32, 0x14, 0x43, 0x83, 0x3d, 0xfd, 0x97, 0x9f, 0x1d, 0xda, 0xf7, 0xb6, 0x6c, 0xe4, 0x29, 0x07, 0xe3, 0x0b, 0xd0, 0x17, 0xb4, 0x84, 0x76, 0x77, - 0xc9, 0x02, 0x1e, 0xb0, 0xc3, 0xa4, 0x41, 0x6c, 0x73, 0x60, 0x6e, 0x8d, 0x3a, 0x30, 0x28, 0x7b, 0xa6, 0x4a, 0x8f, 0x28, 0x59, 0x80, 0x82, 0x9d, 0x63, 0x56, 0xbb, 0x65, 0xc2, 0x55, 0x34, 0xe5, - 0x6b, 0x5c, 0xc4, 0x1c, 0x14, 0x8a, 0x9c, 0xb0, 0x6c, 0xd5, 0x7a, 0x53, 0x1d, 0x0b, 0xcf, 0x4d, 0xf7, 0x19, 0x9b, 0x74, 0x2b, 0x73, 0x19, 0xc3, 0xa8, 0xec, 0xe5, 0xa7, 0x11, 0xb6, 0xcf, 0x63, - 0x78, 0x95, 0xec, 0x5a, 0xd6, 0x63, 0xf0, 0xbf, 0xb8, 0x71, 0x0f, 0x66, 0xb7, 0x97, 0x96, 0x9f, 0xf7, 0x18, 0xed, 0xe7, 0xc9, 0x6d, 0x6f, 0x60, 0x5f, 0x70, 0x79, 0x15, 0x8e, 0xd0, 0xb0, 0x69, - 0x04, 0xec, 0x6c, 0xdd, 0x0b, 0x07, 0x86, 0x61, 0x04, 0x69, 0xd4, 0xa1, 0x64, 0x4f, 0x21, 0x34, 0xc8, 0x58, 0x60, 0xa7, 0x1a, 0x64, 0x46, 0x4f, 0xba, 0x85, 0x92, 0x02, 0x21, 0x76, 0x3c, 0x5a, - 0x47, 0x37, 0x3b, 0xc2, 0x00, 0xcc, 0x94, 0x7c, 0x19, 0x96, 0xeb, 0x22, 0x27, 0x22, 0x7e, 0x79, 0x2a, 0xba, 0xe2, 0xc0, 0x27, 0x90, 0x1d, 0x2c, 0xf0, 0x94, 0xce, 0x48, 0xdd, 0x6b, 0xf8, 0x95, - 0x38, 0x23, 0xcb, 0x1f, 0x77, 0x28, 0xb8, 0xfc, 0xee, 0x5b, 0x72, 0xcf, 0xdf, 0x2c, 0xd9, 0xce, 0x50, 0x5f, 0x30, 0x73, 0xb1, 0xe2, 0x07, 0x4a, 0x35, 0x77, 0xb6, 0x31, 0x48, 0x5d, 0xdb, 0xce, - 0xec, 0x19, 0x50, 0x69, 0x4a, 0x49, 0x09, 0xf8, 0x28, 0x07, 0xd7, 0xd4, 0xb6, 0x0d, 0xad, 0x08, 0x3f, 0x6d, 0x0f, 0xe4, 0x3e, 0x48, 0x16, 0x02, 0x92, 0xaf, 0x0f, 0x6b, 0x10, 0x37, 0xac, 0xad, - 0x1b, 0x1a, 0x93, 0x88, 0x95, 0xc9, 0x95, 0xe5, 0xf0, 0xe5, 0xaa, 0x9c, 0xf7, 0xf0, 0x44, 0x81, 0x0a, 0xee, 0xb0, 0x47, 0xd4, 0x9a, 0x63, 0x22, 0xb2, 0x17, 0xe8, 0xe6, 0x3f, 0x42, 0xaa, 0x0d, - 0x28, 0x7a, 0xfb, 0xb9, 0xeb, 0xfa, 0x7e, 0xd1, 0xdb, 0x00, 0x97, 0x75, 0x0e, 0x6e, 0x01, 0xca, 0xd6, 0x96, 0x7d, 0x5c, 0x80, 0x74, 0x1d, 0xa9, 0x9d, 0xd0, 0x72, 0x8e, 0x16, 0x54, 0xad, 0x06, - 0x48, 0x13, 0x2d, 0x32, 0x38, 0x64, 0x83, 0x4c, 0x99, 0xe2, 0x50, 0x84, 0x18, 0xb8, 0x87, 0xe9, 0xdd, 0x71, 0x45, 0x4c, 0x3a, 0x1b, 0x64, 0x1a, 0x3b, 0x9c, 0x1f, 0x91, 0x95, 0x00, 0x71, 0x15, - 0x3c, 0x5b, 0xd6, 0x60, 0x61, 0x8f, 0x0e, 0xb0, 0xb6, 0x5c, 0x65, 0xdb, 0xb0, 0x56, 0x1e, 0xa9, 0x21, 0x8f, 0x50, 0xf9, 0x4f, 0x16, 0xbd, 0x65, 0x7e, 0x72, 0x6f, 0x00, 0x1d, 0xf9, 0xdc, 0xb0, - 0xdf, 0x33, 0xc4, 0x0b, 0x69, 0x92, 0x74, 0x4c, 0x0e, 0x1c, 0xec, 0xab, 0xc1, 0xf6, 0x66, 0xd7, 0x44, 0x45, 0x04, 0x17, 0x4b, 0x32, 0xc3, 0xec, 0xc6, 0xe6, 0xe4, 0x64, 0x6f, 0x59, 0x28, 0x1d, - 0xac, 0x43, 0xb2, 0xa2, 0x4b, 0x36, 0x5c, 0x1e, 0x35, 0x71, 0xb3, 0x58, 0x0a, 0xa8, 0xb2, 0xf7, 0xe0, 0x85, 0x0f, 0x99, 0xfc, 0x8e, 0x2f, 0x11, 0x5b, 0x11, 0x72, 0x3d, 0x18, 0x25, 0xfe, 0x0e, - 0x71, 0x03, 0x54, 0x0e, 0xd3, 0xc2, 0x4e, 0x75, 0xc5, 0x9d, 0x23, 0x9a, 0x72, 0x1c, 0xe8, 0x95, 0xd1, 0xab, 0x34, 0xf6, 0xcd, 0x71, 0x19, 0x5d, 0x7b, 0x89, 0x7d, 0x11, 0x39, 0xb8, 0x78, 0xf4, - 0x0a, 0xdb, 0x7a, 0x89, 0xcf, 0x7d, 0xdc, 0x67, 0xfe, 0xf8, 0xe3, 0xcf, 0xaf, 0xbc, 0xea, 0x5f, 0x34, 0x67, 0xb8, 0xa0, 0xe4, 0x25, 0xd2, 0x37, 0xae, 0x0a, 0x3d, 0x29, 0xb3, 0xb4, 0xb8, 0xc0, - 0x6c, 0x7e, 0x7b, 0xe9, 0xe5, 0xe1, 0xb2, 0xb2, 0xc6, 0xa5, 0x5d, 0xf8, 0x97, 0x88, 0xfe, 0x4d, 0xa7, 0xc4, 0x7f, 0x7b, 0x72, 0x48, 0x1f, 0xc5, 0xbc, 0xf6, 0xcd, 0x70, 0xec, 0xa4, 0x45, 0xac, - 0x57, 0xe3, 0x3a, 0xb1, 0x4b, 0x53, 0xcf, 0xae, 0xa4, 0xbc, 0xe4, 0x5a, 0x7c, 0xf0, 0x60, 0x16, 0xb6, 0x1e, 0x5d, 0x9a, 0x4c, 0xfa, 0xc5, 0xf5, 0x4b, 0xc0, 0xcf, 0xfd, 0x2a, 0x4a, 0xdd, 0xb1, - 0x7f, 0x6b, 0x3d, 0xfb, 0xe7, 0x8b, 0xc6, 0xfb, 0x31, 0x7f, 0x34, 0x4d, 0x7c, 0x73, 0x6c, 0xa4, 0x69, 0xfc, 0x8a, 0xbb, 0x8f, 0xf9, 0xa0, 0xde, 0xa5, 0xc5, 0x44, 0x59, 0x15, 0xb6, 0x1e, 0xff, - 0xf9, 0x8d, 0x2b, 0xe7, 0xb7, 0x34, 0x9f, 0x1b, 0xeb, 0x9e, 0x6f, 0x0c, 0xeb, 0x2c, 0x7d, 0x1f, 0xff, 0xf7, 0xf6, 0xc0, 0xe7, 0xb8, 0xff, 0x8b, 0x77, 0xbc, 0x2c, 0x88, 0xdf, 0xef, 0x5c, 0x76, - 0xc7, 0x01, 0x4b, 0xc4, 0x24, 0x9a, 0x14, 0xe3, 0x33, 0x05, 0x6d, 0x57, 0x3b, 0x14, 0xf6, 0xe4, 0x83, 0xb9, 0xc7, 0x24, 0xa6, 0x64, 0x49, 0x2d, 0x0a, 0x4a, 0xd9, 0x99, 0x04, 0xf9, 0x01, 0xb0, - 0xe1, 0x72, 0x7e, 0x8a, 0xe7, 0xcc, 0x5c, 0xf3, 0x73, 0x48, 0x65, 0xe5, 0x0c, 0x63, 0x8e, 0x6c, 0x55, 0xcf, 0x96, 0xb8, 0xc0, 0x2c, 0x73, 0x4a, 0x81, 0x6c, 0x57, 0xc9, 0x25, 0x23, 0x61, 0x65, - 0x01, 0x9b, 0xd7, 0x5a, 0xcc, 0x0f, 0x6c, 0x9c, 0x74, 0xa6, 0xd0, 0x0b, 0xad, 0x5f, 0xa8, 0x84, 0xfe, 0xd6, 0xa9, 0x33, 0x8b, 0xfc, 0x0a, 0x7e, 0x77, 0x6f, 0x20, 0x41, 0x7e, 0xe7, 0xf1, 0xaf, - 0xa8, 0x81, 0x3f, 0x67, 0xb4, 0x7e, 0xf1, 0x82, 0x17, 0x52, 0x7c, 0xba, 0x3c, 0xc6, 0x87, 0x19, 0xb2, 0x2b, 0xc5, 0xdd, 0xf5, 0x32, 0x4b, 0xaa, 0x50, 0x8b, 0x4e, 0x56, 0xca, 0xbe, 0x65, 0x0a, - 0xc9, 0xad, 0x0e, 0xa4, 0xd0, 0xf1, 0x0b, 0x9e, 0xf7, 0x71, 0xb0, 0xce, 0x1b, 0x30, 0xdd, 0xd4, 0x3b, 0xc0, 0xe1, 0x69, 0x92, 0x33, 0x53, 0x80, 0xb7, 0x57, 0x78, 0x34, 0xa9, 0x4d, 0xd4, 0xea, - 0x04, 0x72, 0xbb, 0x75, 0xac, 0x79, 0xdb, 0x2d, 0xf3, 0xfd, 0xd6, 0x9c, 0xac, 0x68, 0x22, 0x99, 0xf9, 0x39, 0x93, 0xd3, 0xdf, 0x86, 0xa5, 0xb2, 0xa8, 0xbe, 0x17, 0x8d, 0x79, 0x52, 0x1b, 0x89, - 0xea, 0xe2, 0x8c, 0x86, 0xa8, 0x2e, 0x86, 0xea, 0x20, 0xa8, 0xbc, 0xb0, 0xdb, 0xe2, 0xe8, 0xe6, 0xb3, 0x79, 0x4b, 0x35, 0x07, 0xbc, 0xe7, 0x0e, 0x23, 0x7a, 0x16, 0x0b, 0xb4, 0x4c, 0x3b, 0x6b, - 0x61, 0x53, 0x2d, 0x1a, 0x03, 0x38, 0x58, 0x99, 0x48, 0x9f, 0x60, 0x4c, 0xc5, 0x1c, 0xe4, 0xa4, 0x5a, 0x0b, 0xab, 0xe3, 0x99, 0xc3, 0xbc, 0x0d, 0x23, 0x72, 0x19, 0x01, 0x55, 0x44, 0x8c, 0x4e, - 0x86, 0xbd, 0xcc, 0x77, 0xcc, 0x76, 0x34, 0xc3, 0x80, 0xbd, 0x5f, 0xfc, 0x95, 0x89, 0xad, 0x45, 0x61, 0xbb, 0x75, 0xa4, 0x17, 0xe3, 0xf3, 0x47, 0xe8, 0xd1, 0x8b, 0x53, 0xe5, 0x19, 0x4f, 0xe1, - 0x3f, 0xd8, 0x64, 0xe4, 0x43, 0xac, 0xe7, 0x6b, 0x21, 0x04, 0x3f, 0x63, 0xd2, 0xbc, 0x82, 0x3d, 0x53, 0xf9, 0xf5, 0xe4, 0x12, 0x23, 0x19, 0x60, 0xd6, 0x34, 0xa1, 0x39, 0x13, 0x0a, 0x49, 0x4b, - 0x21, 0x51, 0x63, 0x8d, 0x04, 0x93, 0xd8, 0x85, 0x90, 0xb9, 0x80, 0x12, 0xaf, 0x44, 0x1c, 0xcb, 0x53, 0x45, 0xf1, 0xcc, 0xc5, 0xc6, 0x01, 0x0c, 0xcc, 0xce, 0xa2, 0x30, 0xd4, 0x0b, 0x15, 0x8c, - 0xa9, 0x9e, 0xcc, 0xb2, 0xa9, 0x5e, 0xa1, 0x71, 0xc4, 0xe7, 0x72, 0xa9, 0x64, 0x1d, 0x57, 0x1f, 0x5d, 0x1e, 0x39, 0x48, 0x5d, 0x71, 0x5c, 0xee, 0x7a, 0x15, 0x7b, 0x44, 0xeb, 0xbf, 0x2b, 0x22, - 0x95, 0x15, 0x76, 0x55, 0xf9, 0x77, 0xf3, 0xbe, 0x9f, 0x8c, 0x97, 0xdc, 0x80, 0x5e, 0xd1, 0x79, 0x39, 0x1c, 0x1a, 0x31, 0x09, 0xd5, 0x8a, 0x47, 0x4b, 0x90, 0xed, 0x81, 0x99, 0x02, 0xac, 0xd6, - 0x94, 0x68, 0x29, 0x1e, 0xed, 0x10, 0x00, 0x17, 0x0b, 0x8a, 0xa8, 0x86, 0xf3, 0x02, 0x28, 0x00, 0x25, 0x94, 0x90, 0xa6, 0x5b, 0x8d, 0xc0, 0x86, 0xd4, 0xe3, 0xfd, 0xec, 0xe4, 0xeb, 0xe2, 0x8e, - 0xed, 0x4b, 0x92, 0x9b, 0x44, 0x5d, 0xe5, 0xb0, 0x8a, 0x0a, 0x10, 0xb5, 0x28, 0x6f, 0x57, 0x0a, 0x4e, 0x10, 0x1d, 0xbb, 0x89, 0xd0, 0x47, 0xca, 0xfb, 0xef, 0x7b, 0xe5, 0x1b, 0x56, 0xce, 0x37, - 0xc7, 0x2f, 0xe7, 0x3f, 0x4f, 0x8d, 0x3d, 0xaf, 0x97, 0x5f, 0x10, 0xf2, 0x23, 0x5a, 0x8c, 0xa3, 0x33, 0x66, 0x8a, 0xb1, 0x67, 0x47, 0xd9, 0x7d, 0x11, 0xff, 0xe4, 0x86, 0xfb, 0xf5, 0x3b, 0xde, - 0x53, 0xea, 0xe3, 0x9d, 0xa1, 0x1b, 0xee, 0xc2, 0xd8, 0xc0, 0xa6, 0x40, 0x25, 0x85, 0xbe, 0xdb, 0xc9, 0x73, 0x8a, 0x83, 0xd5, 0x56, 0x6e, 0x73, 0xa7, 0x8f, 0xe8, 0x79, 0xb4, 0xe5, 0x8e, 0xc7, - 0x68, 0xb4, 0xf3, 0x18, 0xe0, 0x30, 0x5a, 0x92, 0x3a, 0x55, 0x73, 0x11, 0x90, 0xca, 0xf9, 0x04, 0x6a, 0x61, 0x86, 0xc5, 0xd0, 0xb5, 0x07, 0xf2, 0x51, 0x27, 0xed, 0x2c, 0x52, 0x72, 0x94, 0xe3, - 0x1a, 0x31, 0xd3, 0xc3, 0x0e, 0xdd, 0x4b, 0xbc, 0xf0, 0xb0, 0x61, 0xcc, 0x7d, 0x89, 0x77, 0x51, 0x42, 0x2d, 0xdf, 0xb9, 0x56, 0x3b, 0x5e, 0x9b, 0xe7, 0xfc, 0x94, 0x72, 0xf8, 0xd0, 0x7d, 0xf9, - 0xaa, 0x51, 0xde, 0xa1, 0x13, 0x78, 0x56, 0xea, 0x9f, 0xc8, 0x24, 0xbf, 0x41, 0xbd, 0x50, 0xe6, 0xaa, 0xb1, 0xde, 0x20, 0x3d, 0xa6, 0x85, 0x69, 0x2d, 0x6c, 0x07, 0xb0, 0x0a, 0x65, 0x9e, 0x76, - 0xd6, 0x0c, 0x5a, 0x97, 0xdb, 0xbe, 0x9e, 0x3b, 0x24, 0x04, 0x82, 0x89, 0x16, 0x8d, 0x16, 0xfb, 0x51, 0xa7, 0x9b, 0x26, 0x6c, 0x30, 0xa6, 0x6d, 0x61, 0x0e, 0x25, 0x05, 0x21, 0xda, 0x8f, 0x94, - 0x6a, 0x2e, 0xef, 0x27, 0x35, 0x25, 0x78, 0xbc, 0x4f, 0x05, 0x40, 0xe0, 0xc4, 0x13, 0xa1, 0x06, 0xe3, 0x2d, 0x73, 0x44, 0xdb, 0x95, 0x45, 0xcf, 0x3f, 0x4e, 0x7e, 0x7f, 0x2c, 0x7e, 0xf0, 0x9f, - 0xa0, 0xee, 0x9d, 0x32, 0x7e, 0xcf, 0xf2, 0x7d, 0x1a, 0x81, 0x2f, 0xb0, 0xdf, 0x21, 0xf2, 0x76, 0x65, 0x68, 0xc0, 0x09, 0x80, 0x14, 0x8d, 0x1c, 0x1d, 0xc4, 0x40, 0xc2, 0xf5, 0x46, 0xe1, 0xdd, - 0xa5, 0xcd, 0x08, 0x16, 0xb1, 0x9b, 0x89, 0xf1, 0x5c, 0x84, 0x26, 0x58, 0x3c, 0x85, 0x6c, 0x49, 0x2d, 0xa7, 0x31, 0xb6, 0xd7, 0x8b, 0x88, 0x8b, 0x4f, 0x40, 0x3b, 0x2d, 0x75, 0x6c, 0xc1, 0xe8, - 0xa7, 0x45, 0x0c, 0x62, 0x13, 0x5e, 0x92, 0xaa, 0x6e, 0x01, 0x30, 0x27, 0x00, 0x39, 0xe5, 0xc8, 0xbe, 0x96, 0x9a, 0x1c, 0x23, 0x72, 0xf7, 0x7b, 0x1d, 0xa6, 0x48, 0xdd, 0xe2, 0x3e, 0x4f, 0xc1, - 0x4f, 0xe5, 0xc7, 0xbf, 0x00, 0xbd, 0x62, 0xe2, 0x72, 0x78, 0x29, 0x21, 0x1c, 0x90, 0x07, 0x40, 0x08, 0xfe, 0xb2, 0x62, 0xa3, 0x08, 0x63, 0xad, 0x64, 0xb3, 0xda, 0xb6, 0x10, 0x08, 0xae, 0x46, - 0xe4, 0x69, 0xad, 0x4a, 0x98, 0xab, 0xc0, 0x62, 0xab, 0x1c, 0xc3, 0x3d, 0xee, 0xaf, 0x1b, 0x1d, 0x34, 0x54, 0xbf, 0xd2, 0x36, 0x3a, 0xa0, 0x6e, 0x8b, 0x9d, 0x61, 0xc5, 0x2e, 0x52, 0xc0, 0x6a, - 0xa2, 0xfb, 0x56, 0x4f, 0x89, 0x75, 0x6c, 0x81, 0x07, 0x41, 0xdf, 0x16, 0x5a, 0x34, 0xa7, 0x0e, 0x54, 0xf9, 0x28, 0xde, 0xf9, 0xd0, 0x0f, 0x8a, 0x0e, 0xe5, 0xb1, 0x78, 0x6c, 0x46, 0xfe, 0x37, - 0xed, 0x25, 0xd0, 0xe7, 0x5c, 0xa1, 0x6f, 0x80, 0xaf, 0x28, 0x7d, 0x39, 0x1b, 0x5f, 0x01, 0x3e, 0x46, 0xab, 0x37, 0x97, 0x11, 0x38, 0x27, 0x64, 0x4d, 0xc4, 0x28, 0xe3, 0xb0, 0x16, 0x17, 0x72, - 0x15, 0x23, 0x2b, 0x58, 0x28, 0xd6, 0x88, 0xab, 0x34, 0xe9, 0x34, 0xf4, 0x23, 0x95, 0x2a, 0xe7, 0x10, 0x8e, 0x85, 0x25, 0x94, 0x3b, 0x91, 0x57, 0xbb, 0x87, 0xa9, 0xbd, 0x19, 0xed, 0xa0, 0x75, - 0xb0, 0x3e, 0x2e, 0x9b, 0xae, 0x42, 0x52, 0x2c, 0x0c, 0x70, 0x72, 0x94, 0x23, 0x86, 0xe9, 0xa5, 0x45, 0x1c, 0x24, 0xfd, 0xc0, 0xfe, 0xb8, 0x95, 0xe5, 0xbb, 0xef, 0x1a, 0x09, 0x3e, 0x91, 0x94, - 0x37, 0x28, 0x9b, 0x3f, 0x2b, 0xd2, 0x53, 0x37, 0xd6, 0x2d, 0xeb, 0xbe, 0x8a, 0xf1, 0x94, 0xf3, 0xf4, 0x15, 0xec, 0x15, 0xf5, 0xb7, 0x93, 0x0b, 0x3f, 0x0f, 0x70, 0x9e, 0x46, 0x91, 0x58, 0x6e, - 0xd9, 0x9d, 0x3c, 0x93, 0x85, 0x3d, 0x8a, 0x06, 0x56, 0x21, 0x03, 0x3c, 0x42, 0xe4, 0x51, 0xe2, 0x3b, 0x7e, 0x35, 0x13, 0x46, 0x5a, 0x5b, 0xc4, 0xb1, 0x66, 0xa6, 0xbb, 0x4d, 0xc7, 0x6e, 0x9a, - 0x4a, 0x3b, 0x65, 0xdd, 0x01, 0x4c, 0x60, 0xc0, 0x98, 0x01, 0x1c, 0x5a, 0x4d, 0x68, 0x5a, 0x03, 0xdc, 0x35, 0x63, 0x69, 0x32, 0xb1, 0xd9, 0x16, 0x7a, 0xba, 0x81, 0x46, 0xea, 0xf1, 0x73, 0x6f, - 0x8f, 0xbb, 0x5b, 0x53, 0x5a, 0xb4, 0x7a, 0x61, 0x5d, 0x3f, 0xf1, 0x37, 0x5f, 0x81, 0x9f, 0x9d, 0xbf, 0xe3, 0xac, 0x68, 0x5c, 0xf6, 0x78, 0xea, 0x09, 0xba, 0xfc, 0x71, 0xa9, 0x5c, 0x1a, 0x40, - 0x9a, 0x0f, 0x85, 0xae, 0x5f, 0xeb, 0x18, 0xef, 0x4b, 0x5f, 0x07, 0xd3, 0xe6, 0x0d, 0xee, 0x99, 0x38, 0x6f, 0x67, 0x97, 0x1c, 0x64, 0xf2, 0x31, 0x75, 0x08, 0x62, 0xa6, 0xb5, 0x27, 0x31, 0x3e, - 0x6d, 0x92, 0x1a, 0xd1, 0x25, 0x0c, 0x85, 0xe5, 0x91, 0x4a, 0xce, 0xbb, 0x8c, 0xeb, 0x0d, 0x67, 0x3d, 0x9a, 0x62, 0xaa, 0x38, 0x0b, 0x91, 0x5a, 0x09, 0x94, 0x53, 0x82, 0x43, 0x18, 0xa4, 0xaf, - 0xb6, 0x8b, 0xca, 0x53, 0x8e, 0x92, 0xba, 0xcf, 0xf7, 0x10, 0x83, 0xa5, 0xeb, 0xc6, 0x1d, 0x45, 0x81, 0xae, 0xc3, 0xfc, 0xda, 0x1f, 0x1d, 0x9c, 0x66, 0xca, 0x8b, 0xe4, 0xcf, 0x5d, 0xdb, 0x75, - 0xd2, 0x99, 0x57, 0xa4, 0x7e, 0xcd, 0xb7, 0x4f, 0xc9, 0x8c, 0x1b, 0xd0, 0x33, 0x62, 0x6e, 0x87, 0x97, 0x0c, 0xcf, 0x01, 0xc2, 0x42, 0x95, 0x4a, 0x29, 0xb0, 0x9c, 0x51, 0x80, 0xc5, 0xd1, 0xa8, - 0x03, 0xf0, 0xc5, 0x66, 0x29, 0x68, 0x46, 0x31, 0x07, 0xc8, 0x0c, 0x3e, 0xba, 0x3a, 0xb8, 0x16, 0x2a, 0x2b, 0xdf, 0xaf, 0x8e, 0xb0, 0x6a, 0x63, 0xa9, 0xb7, 0x16, 0x66, 0x54, 0xa9, 0xcf, 0xd6, - 0x6b, 0x56, 0x68, 0x32, 0x6a, 0xc4, 0xed, 0x26, 0x59, 0x71, 0x68, 0xec, 0xc6, 0x52, 0xb5, 0xce, 0x48, 0x02, 0xd8, 0x6c, 0x48, 0x9e, 0xb1, 0xc0, 0x9f, 0xec, 0xea, 0x43, 0xc2, 0xe9, 0xf9, 0x7d, - 0x8f, 0x04, 0xf4, 0x0c, 0xbe, 0xf2, 0xf3, 0x6e, 0x95, 0x97, 0xe3, 0xeb, 0x9f, 0x3f, 0x46, 0x12, 0xd8, 0x96, 0x45, 0xef, 0xee, 0x7b, 0x20, 0xa4, 0x0f, 0x2b, 0xbb, 0x3e, 0xed, 0x82, 0x24, 0x5b, - 0x4c, 0x31, 0xbc, 0xe8, 0x8f, 0x55, 0x81, 0xaf, 0xf7, 0x00, 0x3c, 0x69, 0x99, 0x66, 0xab, 0x0b, 0xde, 0x7c, 0x95, 0x1e, 0x75, 0x48, 0x5f, 0xf0, 0x24, 0x6b, 0xf4, 0xb5, 0x0c, 0x49, 0x60, 0x2d, - 0x1f, 0xc5, 0x90, 0xcd, 0x94, 0xc9, 0x9e, 0x0f, 0xc0, 0x08, 0x98, 0xb2, 0xf4, 0x7a, 0x82, 0xa3, 0x6b, 0x3c, 0x11, 0x87, 0x2d, 0xec, 0xd2, 0xb7, 0xec, 0xb1, 0xe9, 0xe9, 0x49, 0x62, 0x5f, 0x2c, - 0xdf, 0x8b, 0x6b, 0xf4, 0x8b, 0xb4, 0xe5, 0x87, 0xfb, 0xda, 0xdf, 0xe8, 0xe0, 0x1e, 0x9c, 0xea, 0x9c, 0xd7, 0x76, 0x6d, 0x8f, 0x2f, 0x0d, 0xf9, 0x2a, 0xbd, 0x0c, 0xbf, 0x31, 0xb0, 0x7f, 0xae, - 0x78, 0x7c, 0x82, 0x7d, 0xa6, 0xe8, 0xc7, 0x2b, 0x43, 0xd3, 0x11, 0xb9, 0x5a, 0xe7, 0x76, 0x3a, 0xee, 0x44, 0x9b, 0x3d, 0xb6, 0xd6, 0x77, 0x47, 0xb1, 0x5f, 0xa7, 0x21, 0x88, 0xae, 0xfb, 0x3d, - 0x0b, 0x4d, 0x69, 0x5c, 0x5f, 0x78, 0x0d, 0x56, 0x38, 0xac, 0x82, 0x08, 0x6e, 0x4e, 0x8f, 0xb6, 0xf0, 0xd4, 0xcb, 0x34, 0x31, 0xa1, 0xa7, 0xa4, 0x47, 0xfa, 0xa8, 0x36, 0x0f, 0x27, 0x3b, 0x52, - 0xc5, 0xa4, 0x3c, 0x9c, 0x4d, 0x96, 0x34, 0x51, 0xa0, 0x9e, 0x1d, 0x20, 0x1b, 0xea, 0x91, 0x1a, 0xf2, 0x86, 0xfa, 0xff, 0xf5, 0x8a, 0xfa, 0x37, 0x22, 0xbc, 0xab, 0x6d, 0xbf, 0xe2, 0xff, 0x9d, - 0x30, 0x1f, 0x46, 0x22, 0xc7, 0x2e, 0xd2, 0xf2, 0xd5, 0xae, 0x7c, 0x47, 0xf4, 0x3b, 0xaf, 0xc9, 0xf4, 0xaa, 0xb0, 0xd3, 0xe4, 0xdb, 0xf7, 0xb4, 0x6d, 0xfb, 0xeb, 0xf6, 0xdc, 0xe5, 0x65, 0x3f, - 0x7d, 0x87, 0x99, 0x26, 0x65, 0x1d, 0x55, 0xe7, 0xcf, 0xfe, 0xee, 0x35, 0x57, 0xb0, 0x17, 0x1a, 0xdf, 0xca, 0x8e, 0xdf, 0xbd, 0xe2, 0x76, 0xf4, 0xbf, 0xbf, 0xe3, 0xb9, 0x3b, 0x5e, 0xf6, 0xaf, - 0x58, 0xef, 0xb9, 0xae, 0x9d, 0x5f, 0xbf, 0xe2, 0xc2, 0x81, 0x5f, 0xdd, 0x18, 0xda, 0xcd, 0xb3, 0x3a, 0x4e, 0x21, 0x11, 0xf2, 0xdc, 0x4e, 0xaa, 0x97, 0x6e, 0x94, 0x1e, 0x80, 0xa3, 0x5a, 0xc2, - 0x2d, 0x84, 0xd5, 0x89, 0x70, 0xf0, 0xc8, 0xdc, 0xa9, 0x81, 0x7c, 0xba, 0x77, 0xbc, 0xfd, 0x51, 0x8f, 0xf5, 0x96, 0x70, 0x3a, 0xaf, 0x8e, 0x37, 0x3a, 0xdc, 0x2d, 0x32, 0x6b, 0x97, 0x92, 0x44, - 0x73, 0x44, 0xe0, 0x62, 0x65, 0x46, 0xc1, 0x08, 0x75, 0x94, 0xa3, 0xa8, 0xca, 0xdb, 0x92, 0x62, 0x96, 0xcd, 0xf7, 0x26, 0xc1, 0xf5, 0x07, 0x47, 0x45, 0xfd, 0x0d, 0x7e, 0x9e, 0x90, 0xaf, 0x2f, - 0x50, 0x5f, 0x51, 0x12, 0x15, 0xf5, 0x05, 0x0b, 0x03, 0x84, 0x2d, 0x2d, 0x79, 0xd3, 0x2c, 0x26, 0x40, 0xa7, 0xb7, 0xcc, 0x86, 0x13, 0x1d, 0x21, 0xed, 0x50, 0x6a, 0xa5, 0xeb, 0xc9, 0x26, 0xdc, - 0x47, 0x92, 0x32, 0x87, 0xd7, 0xdb, 0x3e, 0xf7, 0xcc, 0xb5, 0xe1, 0xed, 0xe6, 0x92, 0xd6, 0x10, 0x89, 0xb0, 0x6f, 0xb4, 0xb5, 0x65, 0x1e, 0x09, 0x04, 0x84, 0x56, 0x42, 0xdc, 0x28, 0x23, 0x20, - 0x03, 0x25, 0x77, 0xa5, 0x24, 0xe2, 0x8c, 0x5d, 0x9f, 0x7c, 0xa7, 0x14, 0x89, 0xbf, 0xe8, 0xf9, 0x1a, 0x12, 0x69, 0x7d, 0xe9, 0xd2, 0x7d, 0x07, 0x93, 0xcf, 0x65, 0x7c, 0xbd, 0x00, 0x05, 0xc6, - 0xaf, 0x87, 0x43, 0xb3, 0xbd, 0x64, 0x17, 0xa7, 0x62, 0x8e, 0xcf, 0x9c, 0x66, 0x33, 0xa3, 0x4d, 0x58, 0x24, 0x67, 0x52, 0xb6, 0x0d, 0x82, 0xde, 0xaa, 0x8a, 0xa4, 0xa1, 0x96, 0xe6, 0x6e, 0xab, - 0x8e, 0xd0, 0x43, 0xa9, 0x9d, 0x66, 0x90, 0xae, 0xe1, 0x5a, 0x5f, 0xac, 0x18, 0xa2, 0x88, 0x7a, 0x75, 0x52, 0x29, 0xfb, 0xce, 0x93, 0xd9, 0xdd, 0x76, 0xe3, 0x82, 0x04, 0x4e, 0x2b, 0xb8, 0x22, - 0x61, 0xbe, 0x96, 0xcd, 0xc0, 0xb5, 0xff, 0xb0, 0x65, 0xf1, 0xc3, 0x3e, 0xee, 0xdf, 0xf4, 0x3d, 0x87, 0x3f, 0x67, 0xd1, 0x7f, 0xfb, 0xec, 0xe7, 0x41, 0x66, 0xef, 0x33, 0xee, 0xfe, 0xfc, 0x17, - 0xf6, 0xa8, 0xc7, 0x39, 0xfe, 0x84, 0x93, 0xfa, 0x27, 0x5c, 0x70, 0xed, 0xd5, 0xfe, 0x15, 0x23, 0x10, 0x4f, 0x2d, 0xa9, 0x77, 0x70, 0xdf, 0xf3, 0x42, 0x9d, 0x8d, 0x89, 0x61, 0xcb, 0xaa, 0xdf, - 0x80, 0xfb, 0x09, 0xa1, 0x5a, 0xf8, 0x3a, 0x9b, 0xb2, 0x71, 0xc4, 0xc6, 0xb5, 0x93, 0x77, 0xe1, 0x82, 0x19, 0x01, 0xfb, 0x88, 0xb7, 0x85, 0x19, 0x9e, 0x6f, 0xa6, 0x11, 0xa7, 0x10, 0xde, 0x72, - 0xb6, 0x99, 0x7b, 0xc0, 0x9a, 0x00, 0x08, 0x77, 0xaa, 0x2c, 0x24, 0x22, 0x48, 0x19, 0x91, 0x51, 0x20, 0x63, 0x93, 0x23, 0x3a, 0xd2, 0xc9, 0xda, 0x8e, 0x37, 0xf8, 0x54, 0x61, 0xe7, 0x22, 0x9a, - 0x7a, 0xcf, 0xb3, 0x83, 0xe3, 0x27, 0xd6, 0x4b, 0x3f, 0xfb, 0xdf, 0x9a, 0xe3, 0xbf, 0x5b, 0x4a, 0x67, 0x52, 0xc2, 0xdf, 0x93, 0x92, 0x7c, 0xc2, 0x9a, 0xf9, 0xe7, 0xf2, 0xf6, 0x5e, 0x57, 0xf4, - 0x87, 0xab, 0xbf, 0xd7, 0xdf, 0x7f, 0x6d, 0x1d, 0x90, 0xbf, 0x7e, 0xde, 0xe2, 0xe9, 0x13, 0x6c, 0x60, 0xfc, 0xf9, 0xca, 0xf8, 0x02, 0xf7, 0x31, 0x0b, 0xc5, 0xa7, 0xd5, 0x8c, 0x36, 0x28, 0xb6, - 0x8c, 0xf1, 0x59, 0xca, 0xaf, 0x89, 0xd3, 0x72, 0x84, 0x8d, 0x54, 0xb4, 0x83, 0x58, 0x19, 0x40, 0x97, 0x3e, 0x06, 0xb2, 0xd4, 0x14, 0x2b, 0x57, 0x65, 0xbb, 0x41, 0xd6, 0xbd, 0xcc, 0xee, 0x50, - 0xa3, 0x0d, 0xa1, 0x79, 0x13, 0x58, 0x13, 0xb7, 0x39, 0x4a, 0xa8, 0xd1, 0xef, 0xd1, 0xaa, 0x96, 0x45, 0x7f, 0x0a, 0x61, 0x73, 0x06, 0x76, 0xb0, 0xa5, 0xc1, 0x36, 0xc7, 0x1f, 0x5b, 0x50, 0x5f, - 0x23, 0xf0, 0x47, 0x9d, 0x20, 0xe0, 0xa7, 0x9a, 0xa2, 0xfc, 0xb4, 0x13, 0x04, 0x3c, 0xac, 0x49, 0x0a, 0x80, 0x4d, 0xb7, 0x1c, 0xb2, 0x07, 0x25, 0x54, 0xdd, 0x07, 0xe8, 0xcc, 0x5c, 0xe8, 0xf6, - 0x29, 0x1d, 0x15, 0xa9, 0xb6, 0xb3, 0x76, 0x73, 0x05, 0x00, 0x69, 0x9e, 0xdf, 0x4b, 0x7c, 0x11, 0x9c, 0xfa, 0xe9, 0x02, 0x6a, 0x0b, 0x45, 0x65, 0xca, 0x85, 0x21, 0x6d, 0xec, 0x26, 0x88, 0x56, - 0xec, 0x48, 0x9b, 0x31, 0x68, 0xa9, 0x45, 0xeb, 0x02, 0x63, 0x66, 0xe8, 0x51, 0x01, 0xbb, 0x3c, 0x0e, 0x37, 0x23, 0xfb, 0x91, 0xfa, 0xf9, 0xb3, 0x4e, 0x10, 0x67, 0x5b, 0x12, 0xfd, 0xb8, 0x40, - 0x2f, 0x18, 0xfb, 0xf3, 0xe6, 0x06, 0xff, 0x1c, 0x85, 0x7e, 0xed, 0x01, 0x01, 0xff, 0xf1, 0x7f, 0xfe, 0xcf, 0x1f, 0xc8, 0xf9, 0x1f, 0xf4, 0xfc, 0x0f, 0xf6, 0xfe, 0xa9, 0x1f, 0x76, 0x83, 0xf8, - 0x29, 0x43, 0xfc, 0x7f, 0x9d, 0x87, 0x3e, 0xd9, 0x91, 0xcf, 0x75, 0x1e, 0xfa, 0x1a, 0xb9, 0x8f, 0x87, 0x67, 0x3c, 0xd3, 0xab, 0xfb, 0xde, 0xec, 0x8c, 0x41, 0x5d, 0xbb, 0xf3, 0xd1, 0x76, 0x42, - 0x26, 0x47, 0x09, 0xda, 0xcc, 0xd8, 0xc2, 0x2d, 0xd0, 0x05, 0xd6, 0xd9, 0xb1, 0x53, 0x65, 0xdb, 0x29, 0x01, 0x88, 0x6c, 0x7e, 0x48, 0xac, 0x49, 0xcc, 0x30, 0x56, 0xde, 0xc7, 0x5c, 0x80, 0x59, - 0xe6, 0x9c, 0xe7, 0x51, 0x3e, 0x25, 0xf3, 0xa8, 0xd5, 0x18, 0x44, 0x66, 0xf7, 0xc8, 0x48, 0xf3, 0x63, 0x68, 0x4e, 0x6e, 0x72, 0xd4, 0x9c, 0x24, 0x7e, 0xc8, 0x79, 0xd1, 0x74, 0x1b, 0x3d, 0xda, - 0xdf, 0x06, 0xef, 0x32, 0xdf, 0x23, 0xf8, 0x63, 0x5e, 0xc7, 0xd7, 0x7a, 0xf8, 0x33, 0x21, 0xd3, 0x4f, 0xb0, 0x6f, 0x8a, 0xc3, 0xbb, 0x2b, 0x43, 0xa7, 0x34, 0x6d, 0x6b, 0x26, 0xa1, 0xc1, 0xc8, - 0xd8, 0xf9, 0xc4, 0x7a, 0x47, 0xaa, 0xdb, 0x91, 0xc2, 0xad, 0x23, 0x45, 0x0b, 0x97, 0x34, 0x6d, 0xc5, 0x84, 0xcb, 0xec, 0x97, 0xd6, 0x7c, 0x03, 0x00, 0x22, 0x10, 0x4f, 0xbd, 0x45, 0x17, 0xc0, - 0x7a, 0xc8, 0xcc, 0x2b, 0x8b, 0xd5, 0x3c, 0x04, 0x0e, 0x76, 0x56, 0xa8, 0x2c, 0x0c, 0xa9, 0x9d, 0x2a, 0x54, 0x96, 0xe0, 0x2e, 0xc2, 0x2a, 0x33, 0x6b, 0x66, 0x6b, 0xc9, 0x64, 0xa0, 0x03, 0x44, - 0x37, 0xd2, 0xa2, 0x1a, 0x9b, 0x69, 0x52, 0x15, 0x69, 0x14, 0xd9, 0xc5, 0x9f, 0xff, 0xf6, 0xd5, 0x0c, 0x1b, 0xa3, 0x76, 0x9c, 0xdb, 0x3d, 0xfc, 0x73, 0x2e, 0x95, 0xdd, 0xd8, 0x49, 0xf5, 0x92, - 0x9d, 0x80, 0x7c, 0x99, 0xb8, 0x75, 0x53, 0x25, 0xae, 0x41, 0xb5, 0x17, 0xa2, 0x0d, 0x23, 0xf3, 0xbf, 0x20, 0xf8, 0x17, 0x0c, 0xff, 0x02, 0xcf, 0x02, 0xee, 0x5f, 0xd0, 0x65, 0x90, 0xe7, 0xe5, - 0xf8, 0x7f, 0xfc, 0x77, 0x68, 0x68, 0xac, 0xef, 0x4c, 0x15, 0xcb, 0x2f, 0xee, 0x69, 0x8c, 0xc8, 0x53, 0xab, 0xe9, 0x05, 0xe8, 0x8d, 0xea, 0xe7, 0xc3, 0x31, 0x32, 0x6c, 0x2d, 0x79, 0xfc, 0x0e, - 0x24, 0xa9, 0x34, 0x21, 0x25, 0xab, 0xce, 0x2d, 0xc3, 0x6b, 0x44, 0x4c, 0x43, 0x08, 0x1a, 0x64, 0x76, 0x41, 0x99, 0xf7, 0x78, 0x9e, 0x48, 0xa6, 0xe3, 0x94, 0x5b, 0x19, 0x41, 0x29, 0x6c, 0x5e, - 0xef, 0xad, 0x7c, 0x17, 0x8f, 0x08, 0xc3, 0x5b, 0xc3, 0xd4, 0xba, 0x59, 0xf1, 0xe5, 0x64, 0xc6, 0x30, 0x89, 0x9e, 0x60, 0x33, 0xa1, 0xa6, 0x2a, 0x64, 0x9f, 0x52, 0x07, 0x29, 0xda, 0xf6, 0xcf, - 0x6f, 0x49, 0xbf, 0x8f, 0x8e, 0x78, 0x42, 0xe1, 0x1b, 0x9a, 0xdf, 0xfe, 0x29, 0xf1, 0xee, 0x6b, 0xe9, 0xf6, 0xa4, 0x29, 0xf7, 0x0a, 0xf8, 0x4a, 0x93, 0xd7, 0xd3, 0x31, 0x38, 0xcc, 0xa4, 0xc3, - 0x08, 0xa7, 0x28, 0x16, 0x5b, 0x80, 0x9f, 0xee, 0xd9, 0x9c, 0xe5, 0x69, 0x0f, 0x8c, 0xbd, 0x03, 0x4d, 0x1d, 0x26, 0xdb, 0xa5, 0x35, 0xa2, 0x64, 0x42, 0x33, 0xe0, 0xfd, 0x72, 0xbb, 0xb0, 0x26, - 0x72, 0xaa, 0x1d, 0xf8, 0x6a, 0x61, 0xac, 0xfb, 0xe0, 0x54, 0x1e, 0x17, 0xb3, 0x35, 0x42, 0x53, 0xf4, 0xf1, 0x38, 0x15, 0x50, 0x2f, 0xc1, 0x3b, 0x68, 0x7f, 0x30, 0x74, 0xde, 0xe9, 0x95, 0x2a, - 0xc6, 0x16, 0x73, 0xf7, 0x07, 0xce, 0xda, 0x3f, 0x20, 0x78, 0x68, 0xde, 0xc1, 0xeb, 0x4c, 0xaa, 0xaf, 0x39, 0xfa, 0x99, 0x34, 0x83, 0x2b, 0xc8, 0x0b, 0xee, 0x2e, 0x2d, 0xd7, 0x87, 0x36, 0x56, - 0xaa, 0x66, 0x34, 0xe9, 0x52, 0xa4, 0x62, 0x83, 0xbd, 0x05, 0x2e, 0x9a, 0x83, 0xbd, 0xdd, 0x53, 0x7a, 0xc1, 0xf0, 0xc9, 0xbe, 0xa5, 0xf2, 0x2d, 0x88, 0xb0, 0x94, 0xb9, 0x56, 0xf5, 0x69, 0x50, - 0xf8, 0x19, 0xc4, 0xf3, 0x04, 0x8e, 0x4a, 0xb3, 0x09, 0x3b, 0x71, 0x8a, 0x09, 0x6a, 0xb6, 0x3d, 0xb7, 0x98, 0x05, 0x18, 0x4f, 0x63, 0x7e, 0xda, 0xc5, 0x53, 0x6a, 0x11, 0xfa, 0xbd, 0xab, 0xac, - 0x67, 0x7f, 0x25, 0x6d, 0xea, 0xda, 0x2f, 0xfe, 0x9a, 0xb2, 0xf9, 0xe7, 0xd7, 0x69, 0x7c, 0x55, 0xe1, 0x67, 0x6f, 0xcd, 0xeb, 0x9f, 0xad, 0x54, 0x1b, 0xb6, 0xfd, 0xb8, 0xf6, 0x29, 0xfb, 0x95, - 0x15, 0x69, 0x95, 0x9e, 0xf7, 0xdc, 0x5f, 0x4e, 0xa4, 0xbb, 0xf7, 0xb3, 0x43, 0x9e, 0xdb, 0x85, 0xbe, 0x7a, 0xc5, 0x85, 0x8c, 0x5f, 0xdd, 0xb8, 0x74, 0xe0, 0x1d, 0x40, 0x56, 0x78, 0x24, 0x82, - 0x53, 0xcc, 0xa5, 0x30, 0x88, 0x8f, 0x8e, 0xd1, 0xba, 0xc7, 0xbb, 0x1a, 0x03, 0xb6, 0x08, 0xb2, 0x32, 0x4b, 0x66, 0xc7, 0x46, 0xac, 0x53, 0x76, 0x2b, 0x9d, 0x5d, 0xeb, 0x0b, 0x74, 0x4e, 0xc3, - 0x05, 0xda, 0x09, 0xe4, 0xb6, 0x39, 0x6c, 0xd7, 0xb2, 0x2c, 0x00, 0xce, 0x61, 0x12, 0xee, 0x32, 0xc3, 0x30, 0xb4, 0x68, 0x87, 0xb9, 0x5d, 0x62, 0x30, 0x0a, 0xeb, 0x67, 0xbe, 0xaf, 0xfa, 0x8f, - 0xd4, 0xaa, 0x7f, 0x8f, 0x3e, 0x43, 0xc4, 0xff, 0x73, 0x7d, 0x86, 0xae, 0x84, 0xbb, 0xbf, 0x5d, 0x3d, 0x93, 0xb2, 0x7e, 0x83, 0xf9, 0xca, 0x16, 0xd9, 0xa5, 0x00, 0x68, 0x00, 0x1f, 0x68, 0xfc, - 0xaa, 0xb7, 0xc8, 0xee, 0x50, 0x8a, 0x22, 0x4d, 0x04, 0xe4, 0x62, 0xba, 0x8b, 0x84, 0x85, 0xda, 0xba, 0x98, 0xe0, 0xc4, 0x34, 0x14, 0x17, 0x39, 0xb8, 0x16, 0xd0, 0x64, 0xe1, 0x79, 0x18, 0xca, - 0xea, 0x1b, 0x0e, 0x39, 0x59, 0xba, 0x0f, 0x34, 0x4b, 0x79, 0x56, 0x13, 0x68, 0xb6, 0x69, 0x0f, 0x24, 0x7f, 0x2a, 0xed, 0xed, 0x0e, 0xc7, 0x6a, 0x98, 0x5b, 0xc5, 0x69, 0x29, 0x9a, 0xbb, 0x19, - 0xf8, 0x88, 0x0f, 0x06, 0xaf, 0xbc, 0xbf, 0x4c, 0x94, 0xb8, 0x2b, 0x2b, 0xdf, 0xd4, 0x2b, 0x5b, 0x1f, 0x44, 0x98, 0xeb, 0x7e, 0xe2, 0x14, 0x69, 0xfc, 0x26, 0x61, 0xbe, 0x36, 0x81, 0xc1, 0x27, - 0xea, 0x3e, 0xbe, 0x80, 0x7f, 0x21, 0xd8, 0x6f, 0x57, 0x2f, 0x21, 0xf3, 0x01, 0xb5, 0x20, 0xaa, 0x03, 0x26, 0x8a, 0x8d, 0x4b, 0xa5, 0xdd, 0xfb, 0xf3, 0x6d, 0x3d, 0xa2, 0x33, 0xca, 0xf0, 0x7d, - 0xd9, 0x88, 0xb3, 0x28, 0xc7, 0x77, 0x14, 0x90, 0x8d, 0x88, 0x96, 0x38, 0xaa, 0x02, 0xb0, 0x9e, 0x2c, 0xbd, 0x42, 0x9e, 0xcd, 0x64, 0xaf, 0xd5, 0x47, 0x0d, 0xcd, 0x75, 0xb5, 0x51, 0xe7, 0x8e, - 0xa6, 0xec, 0x1b, 0x5b, 0x06, 0x80, 0xd9, 0xf1, 0xb0, 0x28, 0x67, 0x0b, 0x42, 0xda, 0xb0, 0x40, 0xc3, 0xb4, 0x3f, 0xd8, 0xd1, 0x06, 0xd7, 0xbd, 0xbd, 0x99, 0xbc, 0x5f, 0x4b, 0x46, 0xe8, 0x99, - 0xde, 0x76, 0xb7, 0xc7, 0x2e, 0x38, 0xbc, 0x1c, 0x8d, 0xaf, 0x80, 0x1e, 0x23, 0xce, 0x37, 0x47, 0xc4, 0xfa, 0xe8, 0x1f, 0xc8, 0x83, 0x0f, 0x77, 0xbd, 0xb8, 0x98, 0x2b, 0x7c, 0xe8, 0x6b, 0x33, - 0x4c, 0xa3, 0x7a, 0x82, 0x87, 0x35, 0x2f, 0xa6, 0xd4, 0xad, 0xbe, 0x3f, 0x59, 0x6b, 0xe6, 0xb4, 0xd1, 0x4b, 0xdf, 0x9e, 0x4f, 0x8b, 0x51, 0xa7, 0x6a, 0x80, 0x12, 0xab, 0xa5, 0x19, 0x2e, 0xfd, - 0x4d, 0x04, 0xc1, 0x7a, 0x01, 0x76, 0xb8, 0xea, 0xab, 0xb3, 0x13, 0x12, 0xa3, 0xd2, 0x32, 0x81, 0x9e, 0xcf, 0x8c, 0xfb, 0x50, 0xcd, 0x76, 0x8d, 0x51, 0xfe, 0x13, 0xf1, 0xc6, 0x17, 0x2c, 0x9e, - 0x39, 0xf1, 0xae, 0x25, 0xf5, 0x9c, 0xea, 0xf1, 0x06, 0xf8, 0x1d, 0xb5, 0x2e, 0x1c, 0x3f, 0x30, 0x7b, 0x3b, 0x33, 0x80, 0xed, 0x31, 0x56, 0xcb, 0x8a, 0x0e, 0xbb, 0x52, 0x9a, 0x9f, 0xc8, 0xcc, - 0xe7, 0x56, 0x50, 0xb5, 0x98, 0x73, 0xe2, 0x6a, 0x4e, 0x23, 0x4d, 0xc8, 0x20, 0x8b, 0x1c, 0x65, 0x6a, 0x1a, 0xb2, 0xe6, 0xb8, 0xbb, 0xcc, 0x80, 0x51, 0xe3, 0x6a, 0x79, 0x39, 0x5d, 0xac, 0xf5, - 0xac, 0xe9, 0x48, 0x0e, 0x11, 0x47, 0x68, 0x4a, 0xcc, 0xdb, 0x26, 0xaf, 0x85, 0xb5, 0x99, 0x68, 0x84, 0x74, 0xec, 0xd0, 0x47, 0x6a, 0xc8, 0x03, 0xee, 0x1f, 0xd2, 0x00, 0xad, 0xb0, 0xcb, 0x3a, - 0xbe, 0xeb, 0x49, 0x01, 0x9f, 0x45, 0xe7, 0x19, 0xe6, 0x15, 0x93, 0xe7, 0xa3, 0x31, 0xf8, 0x18, 0x89, 0xd0, 0x98, 0xb4, 0x03, 0xf0, 0x68, 0x8b, 0x8b, 0x1d, 0xce, 0xdb, 0x6e, 0x4e, 0x92, 0xc8, - 0x34, 0xdf, 0xfa, 0x7b, 0x70, 0xa9, 0x41, 0xe1, 0xb3, 0x8c, 0x5b, 0x79, 0x45, 0x5a, 0xbb, 0x17, 0xcb, 0xe2, 0xff, 0xc2, 0x97, 0x86, 0xa5, 0x43, 0x30, 0x72, 0xdf, 0xef, 0xf1, 0x4c, 0x35, 0x5d, - 0x61, 0x5f, 0x95, 0xda, 0xea, 0x62, 0x07, 0x0c, 0x90, 0x9a, 0x5b, 0xd0, 0x40, 0x8e, 0x8a, 0x58, 0x12, 0x12, 0xa2, 0x51, 0x10, 0xa1, 0x48, 0x62, 0x07, 0x2d, 0x97, 0x34, 0x31, 0xd1, 0x89, 0x19, - 0xe9, 0x35, 0x9a, 0x8b, 0xcb, 0x0c, 0x16, 0xb3, 0x5d, 0xb8, 0x3e, 0x89, 0x07, 0x06, 0x0e, 0x6a, 0x70, 0xa5, 0x1a, 0x8b, 0x48, 0x5f, 0x0a, 0x42, 0x14, 0x1e, 0x47, 0x0a, 0x47, 0xb4, 0x73, 0x61, - 0xd4, 0xca, 0x5b, 0x35, 0x9e, 0xcc, 0x69, 0x50, 0xff, 0xff, 0xb3, 0xf7, 0x67, 0x4d, 0xaa, 0x72, 0xdf, 0x9e, 0x30, 0x7a, 0xbf, 0x3f, 0xc5, 0x8a, 0xe7, 0xf2, 0xf8, 0xba, 0x68, 0x05, 0xac, 0x38, - 0x55, 0x67, 0x0b, 0x28, 0xd8, 0xd0, 0x0a, 0x8a, 0x5e, 0xec, 0x08, 0xfa, 0x46, 0xfa, 0x1e, 0x2e, 0x9e, 0xcf, 0x7e, 0x22, 0x35, 0x33, 0x57, 0x6a, 0x6a, 0x26, 0xcb, 0xf5, 0xfc, 0xab, 0xf6, 0x5b, - 0xf1, 0xbf, 0xc9, 0xa4, 0xd1, 0x81, 0x8c, 0x39, 0xe6, 0x9c, 0xa3, 0xfd, 0x8d, 0x1d, 0x56, 0x1f, 0xae, 0x3d, 0x4a, 0xff, 0x88, 0xdc, 0x54, 0xc5, 0xa5, 0x22, 0xe9, 0xfe, 0x82, 0xf9, 0x4c, 0xe0, - 0xf5, 0x95, 0xe6, 0x99, 0x5b, 0xe7, 0xa3, 0x73, 0x22, 0xf1, 0x80, 0xd0, 0xaa, 0x3a, 0x8d, 0x59, 0x82, 0xd0, 0x11, 0xc7, 0x04, 0xec, 0x13, 0xb5, 0x80, 0x42, 0x10, 0x50, 0x45, 0x68, 0x99, 0x14, - 0x7e, 0xb5, 0x0c, 0x3a, 0xc5, 0xc3, 0x3d, 0xb2, 0xd6, 0x76, 0x1c, 0x7b, 0x70, 0x77, 0xa6, 0xc3, 0xd4, 0x25, 0x31, 0xc5, 0x35, 0xb7, 0x0a, 0x60, 0x55, 0xd8, 0xd0, 0xf6, 0x72, 0x42, 0x32, 0x70, - 0x84, 0x03, 0x55, 0xd3, 0xe9, 0x9b, 0x9d, 0x82, 0x39, 0x46, 0x49, 0x35, 0x4a, 0xd7, 0x7f, 0xbf, 0xcf, 0xf8, 0xc9, 0x25, 0xe5, 0xea, 0x7f, 0xfd, 0xcf, 0x4f, 0xb5, 0x65, 0xcf, 0x6c, 0x41, 0x8e, - 0x65, 0xfe, 0xb3, 0x9a, 0xb9, 0x63, 0x99, 0x2f, 0xbc, 0x74, 0x2c, 0x73, 0xa8, 0xd6, 0xbd, 0x83, 0xbd, 0xa4, 0xb6, 0xfa, 0x85, 0x21, 0xf8, 0x38, 0x0e, 0xec, 0xf5, 0x40, 0xdf, 0x72, 0xda, 0x09, - 0x16, 0x36, 0xd1, 0xa8, 0xe5, 0x97, 0xb6, 0x64, 0x71, 0x5c, 0x45, 0xe2, 0xbe, 0x19, 0xe0, 0xc6, 0x09, 0xeb, 0x7d, 0x78, 0x41, 0x30, 0xcc, 0xac, 0xf5, 0x5d, 0x33, 0xa6, 0x17, 0xe9, 0x8a, 0x35, - 0xf8, 0x8e, 0x37, 0xdd, 0x6e, 0x45, 0xfb, 0xe2, 0x88, 0x88, 0x85, 0xfc, 0x30, 0x31, 0x8f, 0x4c, 0xfe, 0x75, 0xe9, 0x4d, 0xee, 0x47, 0xb9, 0xee, 0x7c, 0x61, 0x49, 0x3e, 0x31, 0xe3, 0xce, 0x24, - 0x5f, 0x5e, 0xfd, 0x7c, 0x70, 0xb6, 0x24, 0x07, 0xcc, 0xbb, 0xd5, 0xf1, 0xb4, 0xe2, 0x8e, 0xa7, 0x19, 0xb3, 0x58, 0x88, 0x22, 0x7c, 0xc8, 0xb4, 0xa3, 0x26, 0x1a, 0x5c, 0xc8, 0x91, 0x6e, 0xd1, - 0xf6, 0x73, 0x62, 0xb9, 0x29, 0xd0, 0x90, 0x5b, 0x6a, 0x00, 0x9c, 0x80, 0x9b, 0xa9, 0x4a, 0x36, 0x53, 0x01, 0x38, 0x20, 0x09, 0xd6, 0x2c, 0x1a, 0xc0, 0x9f, 0x1e, 0x36, 0x7a, 0x6a, 0xaa, 0xab, - 0x7d, 0x93, 0x19, 0x3e, 0x72, 0xb2, 0xda, 0xa5, 0x68, 0x51, 0x18, 0xac, 0x2c, 0x9f, 0xf7, 0x8b, 0xb8, 0x61, 0x72, 0xee, 0xa3, 0xf6, 0x5f, 0xf8, 0xd9, 0xca, 0x78, 0x13, 0xa0, 0xf7, 0x6f, 0x7e, - 0xf2, 0x01, 0xbf, 0x73, 0xf2, 0xb6, 0x5e, 0xef, 0x8f, 0x77, 0x68, 0xbf, 0xd0, 0x75, 0x73, 0x50, 0xf8, 0xab, 0x3a, 0xc3, 0x75, 0xe8, 0x61, 0x78, 0x4e, 0x67, 0xba, 0x2f, 0xcb, 0x4f, 0xb9, 0x57, - 0x3e, 0x10, 0x7e, 0x19, 0xd8, 0x0f, 0xa7, 0xe7, 0x44, 0xa0, 0x01, 0xb2, 0x3d, 0x09, 0xd1, 0x5d, 0x77, 0x94, 0x09, 0x6c, 0x73, 0x04, 0x42, 0xba, 0x3d, 0x2a, 0x32, 0x16, 0x64, 0x1b, 0x62, 0xb6, - 0x98, 0xc3, 0x5b, 0x70, 0xb9, 0xd8, 0x70, 0x22, 0x8c, 0xcd, 0x8c, 0xa0, 0xd8, 0xec, 0x66, 0x74, 0xcb, 0x5a, 0x1e, 0x09, 0x98, 0x20, 0xa3, 0x16, 0xec, 0xa8, 0x43, 0xa6, 0xaa, 0x43, 0xf9, 0x88, - 0xd5, 0xf7, 0x84, 0x10, 0x4a, 0x95, 0x18, 0xc5, 0xfa, 0x4a, 0xe0, 0x12, 0x9a, 0x95, 0xc8, 0xef, 0x86, 0xf7, 0xdf, 0x89, 0x40, 0x0f, 0x1f, 0x33, 0x28, 0x11, 0x68, 0xc0, 0x3c, 0xf9, 0x9c, 0x85, - 0x76, 0x41, 0x7e, 0x83, 0x07, 0xc8, 0xeb, 0xb9, 0xca, 0xf6, 0x6c, 0x91, 0x3e, 0xea, 0x43, 0x0d, 0x3f, 0xa5, 0x01, 0x7d, 0xa0, 0x0b, 0x8c, 0x3f, 0x9e, 0x9d, 0x2d, 0xa7, 0x01, 0xc2, 0x2a, 0xea, - 0xea, 0x76, 0x51, 0xa8, 0x3a, 0xcf, 0x57, 0xeb, 0xe6, 0x44, 0xfa, 0x41, 0x32, 0x13, 0xd9, 0xd9, 0x1a, 0x03, 0x6c, 0x0e, 0xdb, 0xf9, 0x79, 0xdd, 0x89, 0xfb, 0xf0, 0x88, 0x93, 0x33, 0xa9, 0x43, - 0xe9, 0x91, 0x47, 0xd5, 0x1e, 0x4a, 0x62, 0xe1, 0x92, 0x19, 0xc5, 0xa2, 0xe5, 0x19, 0x0b, 0x67, 0x69, 0x88, 0x23, 0x57, 0x61, 0x48, 0x33, 0xb7, 0x0a, 0x41, 0x57, 0x0b, 0x70, 0x31, 0x3a, 0x92, - 0xc2, 0x40, 0x97, 0xfc, 0x45, 0x01, 0xfa, 0xeb, 0x6f, 0x70, 0x20, 0x7c, 0xde, 0xa3, 0x52, 0xe5, 0xfb, 0xec, 0x44, 0x9f, 0x48, 0x06, 0xbc, 0xfb, 0x84, 0x37, 0xc6, 0xde, 0x5e, 0x1f, 0x9f, 0x9f, - 0xf1, 0x3d, 0x8b, 0x6d, 0xd8, 0xa0, 0x67, 0xf0, 0x7e, 0xa5, 0x80, 0x4d, 0x5b, 0xd8, 0x3b, 0x0b, 0x0d, 0x0b, 0x5a, 0x44, 0x47, 0x88, 0xc0, 0x6b, 0x18, 0x9b, 0x72, 0x9a, 0xa4, 0x43, 0x47, 0x6f, - 0x21, 0xe1, 0x5b, 0x75, 0xc4, 0x04, 0xb5, 0x20, 0x53, 0xd1, 0xd6, 0x33, 0x28, 0x2e, 0x2c, 0xf3, 0x72, 0x49, 0x3b, 0xa7, 0x83, 0xb7, 0x63, 0x73, 0xc1, 0x14, 0xcb, 0x60, 0xb4, 0xf6, 0x22, 0x9a, - 0xb4, 0x44, 0xeb, 0x48, 0x43, 0xbf, 0xe3, 0x6e, 0x1d, 0x94, 0x70, 0x5d, 0xd8, 0x66, 0x95, 0xbf, 0x02, 0x41, 0x7d, 0x85, 0x27, 0x02, 0x3f, 0x85, 0xbe, 0xfe, 0x89, 0xfa, 0x39, 0xfc, 0x79, 0x73, - 0x6d, 0x0c, 0x0f, 0xc3, 0x60, 0xc7, 0x74, 0x75, 0x24, 0x37, 0x85, 0xdd, 0x37, 0xf8, 0x4e, 0x26, 0x80, 0xb8, 0xab, 0xd7, 0x4a, 0x4b, 0x48, 0xe9, 0x9e, 0x9d, 0x2e, 0x72, 0xf3, 0xe0, 0x6b, 0x5a, - 0x98, 0x51, 0x68, 0x3f, 0xb1, 0x26, 0x9a, 0x44, 0xd2, 0x72, 0x56, 0x1a, 0x4e, 0x21, 0x07, 0x71, 0xc3, 0x74, 0x2f, 0x7b, 0xa6, 0x6b, 0x59, 0x7c, 0xb9, 0x67, 0xab, 0xf9, 0x69, 0x2a, 0xcc, 0x78, - 0x35, 0x29, 0x37, 0x30, 0x96, 0x5d, 0x30, 0xd8, 0xbf, 0xe2, 0xce, 0x17, 0x61, 0x60, 0xfc, 0x27, 0xf2, 0x44, 0x26, 0xfa, 0x6d, 0x18, 0xf8, 0x4c, 0xe5, 0xfb, 0x97, 0xe7, 0x49, 0xc8, 0x2c, 0x99, - 0xcd, 0x24, 0x0f, 0xd9, 0x5c, 0x5c, 0x95, 0x0b, 0x7a, 0xb7, 0xdc, 0xf5, 0x4a, 0x27, 0x75, 0x21, 0xb7, 0xa9, 0xa6, 0xfc, 0x74, 0xb7, 0xa4, 0x66, 0x18, 0xbb, 0x5d, 0xac, 0x12, 0x82, 0xa3, 0x98, - 0x9d, 0xc2, 0xed, 0x31, 0xd7, 0x49, 0x7d, 0xb3, 0x59, 0x47, 0xd1, 0x1a, 0xb0, 0x66, 0x81, 0x22, 0xe4, 0x59, 0x35, 0x09, 0x31, 0x64, 0xb5, 0x12, 0x52, 0x7a, 0x9b, 0xcf, 0xfc, 0x02, 0x19, 0x58, - 0x3c, 0x1e, 0xe6, 0xd5, 0xd8, 0xd4, 0x4d, 0xef, 0x62, 0x9d, 0x63, 0x03, 0x8b, 0xfb, 0xef, 0x85, 0x8c, 0x9f, 0x2b, 0x56, 0x1c, 0x24, 0xc6, 0xe5, 0xd8, 0x4c, 0x92, 0x93, 0x6f, 0x5f, 0x64, 0xea, - 0x71, 0x65, 0xc7, 0x33, 0xc1, 0xb0, 0x4f, 0xd4, 0xcf, 0xc3, 0x77, 0x73, 0x6d, 0x68, 0x83, 0x68, 0x79, 0x17, 0xef, 0xa4, 0x56, 0xd1, 0x2a, 0x3b, 0x3f, 0x61, 0x13, 0x44, 0x73, 0xaa, 0xd0, 0x17, - 0x5a, 0x52, 0x24, 0xa0, 0xad, 0x03, 0x8e, 0x32, 0x47, 0x9a, 0xe3, 0xc8, 0x66, 0x79, 0x58, 0x9b, 0x1d, 0x77, 0x60, 0x99, 0x29, 0x3a, 0xab, 0x58, 0xf0, 0xe4, 0xe6, 0x52, 0x2a, 0xd3, 0x95, 0x72, - 0x8c, 0xb7, 0x51, 0x90, 0x76, 0x05, 0x1b, 0xf5, 0xed, 0x4a, 0x5b, 0xf3, 0x8e, 0x8e, 0x89, 0xc1, 0xc2, 0xeb, 0xbe, 0xee, 0xfd, 0x56, 0x78, 0xb6, 0xa1, 0xc7, 0xee, 0xd8, 0x4c, 0xa2, 0x48, 0x8f, - 0x1f, 0x65, 0xb3, 0x3e, 0xb9, 0x15, 0x5d, 0xd3, 0x7e, 0xe1, 0xcc, 0xf5, 0x95, 0xa1, 0x5b, 0xd2, 0x89, 0x6d, 0x73, 0xb8, 0x3f, 0xa6, 0x87, 0xd2, 0x8a, 0x72, 0x1e, 0xca, 0xe8, 0x20, 0xcf, 0x35, - 0xe0, 0x08, 0xe5, 0x32, 0x74, 0x62, 0x08, 0xba, 0x1d, 0xb9, 0xa7, 0x74, 0x0d, 0x31, 0xa8, 0xad, 0x45, 0xb5, 0x56, 0x34, 0x91, 0x39, 0x87, 0x3c, 0x65, 0x4f, 0xee, 0x0f, 0x6a, 0x1f, 0xe6, 0xfa, - 0xa1, 0x81, 0x80, 0xee, 0x98, 0x62, 0x87, 0x8a, 0x3e, 0xe0, 0xf8, 0xa1, 0xac, 0x0d, 0x1e, 0xb4, 0x22, 0xfa, 0x3b, 0xfd, 0xe9, 0x8b, 0xcc, 0xf9, 0xd7, 0xb7, 0x38, 0xef, 0xab, 0x7f, 0xfd, 0x6b, - 0xc3, 0x28, 0xb7, 0xcf, 0x7a, 0x64, 0xaa, 0x3c, 0x3f, 0x3a, 0x67, 0xca, 0x1f, 0xc6, 0xe6, 0x7c, 0x3e, 0x34, 0x04, 0x86, 0x8f, 0x46, 0xd6, 0xc2, 0x2b, 0xcd, 0x16, 0x41, 0x26, 0x48, 0x45, 0xea, - 0x19, 0x41, 0xd3, 0x32, 0xca, 0x57, 0x2d, 0x69, 0x97, 0x64, 0x4f, 0xe1, 0x47, 0x49, 0xf0, 0x22, 0x45, 0x5a, 0xc6, 0xec, 0xdc, 0xc2, 0x8c, 0x6d, 0xae, 0x59, 0xfe, 0xbc, 0xeb, 0xa9, 0x9a, 0x01, - 0xf1, 0x23, 0x8a, 0xaa, 0x07, 0x6b, 0xb3, 0xf5, 0xf6, 0x6a, 0xa7, 0x95, 0x13, 0x0e, 0xe8, 0xbc, 0x9e, 0xb0, 0x4f, 0xa6, 0xf1, 0x6d, 0xc7, 0xd1, 0x7f, 0x82, 0xad, 0xd7, 0xc5, 0x0f, 0xff, 0x9c, - 0x23, 0xe1, 0x23, 0xe1, 0x17, 0xa6, 0x7e, 0x38, 0x1d, 0xea, 0x52, 0xc8, 0x26, 0x9a, 0xd8, 0x95, 0xd9, 0x62, 0xbe, 0x5c, 0xb3, 0x27, 0xc6, 0xf2, 0xb9, 0x65, 0x7e, 0x80, 0xc0, 0xa8, 0xde, 0xc8, - 0x75, 0x2c, 0x79, 0x28, 0x0c, 0x8c, 0x98, 0x84, 0x0c, 0x17, 0x7b, 0xc4, 0x80, 0x37, 0xda, 0x66, 0x0e, 0xb7, 0xed, 0x2a, 0x3d, 0x2e, 0xac, 0x68, 0x8a, 0x36, 0x36, 0x48, 0xea, 0xc9, 0x0e, 0x91, - 0x9b, 0x55, 0xc7, 0x64, 0xee, 0xa4, 0xd9, 0xe2, 0x76, 0xda, 0x2a, 0x35, 0x78, 0xbc, 0x45, 0x84, 0x7a, 0x12, 0x66, 0xdf, 0xb5, 0xcb, 0xb1, 0x1f, 0xbf, 0xa8, 0x3b, 0x85, 0x6f, 0xbe, 0x7f, 0xe4, - 0xaa, 0xe1, 0xe1, 0xa7, 0x86, 0x2d, 0x2f, 0x9f, 0x99, 0x0e, 0xee, 0xbc, 0x37, 0xc0, 0xf0, 0x18, 0xec, 0xb4, 0xbd, 0x1a, 0x8b, 0xab, 0x3b, 0x03, 0xbb, 0xca, 0x3c, 0x55, 0x03, 0xf4, 0x7d, 0x5b, - 0x99, 0x61, 0xb5, 0x41, 0x4b, 0x07, 0x27, 0x83, 0x45, 0x98, 0x9e, 0xfa, 0x9e, 0xb4, 0x77, 0x90, 0x99, 0xb9, 0x0a, 0x22, 0x6c, 0xf7, 0x0a, 0xa2, 0xf7, 0x5d, 0xd2, 0xd2, 0x8c, 0x1e, 0xc8, 0x23, - 0x9f, 0x89, 0x17, 0xa4, 0xb3, 0xdb, 0xc1, 0xf3, 0x7d, 0x47, 0x77, 0x7b, 0xfd, 0x78, 0xdc, 0xc3, 0x73, 0x99, 0x0e, 0x54, 0xfd, 0x00, 0x4b, 0x1c, 0xe1, 0x4f, 0x82, 0x25, 0xb2, 0x0d, 0xf0, 0xc8, - 0x2b, 0x38, 0x94, 0xa6, 0x67, 0xd9, 0xfe, 0x6a, 0x6a, 0xfd, 0x6f, 0x18, 0x80, 0x07, 0xed, 0x25, 0x1f, 0xcd, 0xb7, 0xdf, 0xaf, 0xac, 0xbc, 0xff, 0x88, 0xf3, 0xcc, 0xbb, 0x77, 0x63, 0x28, 0x5c, - 0x1d, 0x49, 0xae, 0x5d, 0x99, 0x40, 0xc9, 0x95, 0xb4, 0x8a, 0xb0, 0x7d, 0xb0, 0x5f, 0x70, 0xac, 0xbb, 0xd9, 0x55, 0x09, 0x06, 0x2d, 0x48, 0x7a, 0x1b, 0x40, 0x3d, 0xd0, 0x6e, 0x17, 0xea, 0x32, - 0xe9, 0x33, 0x01, 0x6b, 0x04, 0xdc, 0xf7, 0xc1, 0x55, 0x4b, 0x65, 0xe1, 0xb2, 0xb2, 0xf0, 0x79, 0x9c, 0x03, 0xa3, 0x8d, 0x17, 0x1a, 0xfc, 0x12, 0x6c, 0xbc, 0x79, 0x9e, 0x4d, 0x31, 0x11, 0xce, - 0x58, 0x7e, 0x6f, 0x3f, 0x1f, 0x05, 0xf9, 0xa5, 0x30, 0xfd, 0x8d, 0x3f, 0xb7, 0xd5, 0x0c, 0x75, 0x05, 0x3e, 0xe0, 0xe7, 0xef, 0xa8, 0xbe, 0x4f, 0x6d, 0x46, 0x9f, 0x54, 0xdf, 0x41, 0xdb, 0xcf, - 0x88, 0x21, 0xb1, 0x7e, 0x37, 0x9b, 0x6e, 0xf6, 0x1e, 0xd6, 0x27, 0xf5, 0x41, 0xda, 0xcc, 0x36, 0x6c, 0x53, 0x4f, 0x72, 0x03, 0x16, 0x59, 0x26, 0x5c, 0xf9, 0x48, 0xe8, 0xf8, 0xd9, 0x92, 0x6d, - 0x65, 0xb0, 0xaa, 0x1a, 0xca, 0xb5, 0x1d, 0x53, 0x58, 0x99, 0x93, 0x69, 0x3d, 0x75, 0x6a, 0xa8, 0x21, 0x18, 0x63, 0x5b, 0x36, 0x6d, 0x55, 0x65, 0xd9, 0x2c, 0x58, 0x4e, 0x79, 0x6e, 0x26, 0x08, - 0x6e, 0xf6, 0xed, 0xf6, 0xf3, 0xdb, 0xea, 0xec, 0x17, 0xdc, 0x0e, 0xf5, 0xe2, 0x9f, 0xed, 0x19, 0x76, 0xa6, 0xf8, 0xc2, 0xc7, 0x97, 0xff, 0x43, 0x77, 0x71, 0x77, 0x2a, 0x41, 0x9e, 0x6e, 0x1b, - 0x1d, 0x82, 0x09, 0xdb, 0x6d, 0xd9, 0x18, 0x68, 0x5c, 0x52, 0x0c, 0xc3, 0xe8, 0xeb, 0x42, 0xdf, 0x6d, 0x03, 0x09, 0x23, 0x1c, 0xb2, 0x4d, 0x24, 0xb3, 0x2a, 0xc3, 0x89, 0xb3, 0x85, 0xea, 0xea, - 0x00, 0x11, 0x2c, 0xd2, 0x6c, 0x4b, 0x24, 0x58, 0x74, 0x8b, 0x32, 0x3f, 0xb5, 0xa3, 0x75, 0x0f, 0xee, 0x20, 0x86, 0x98, 0xcc, 0x50, 0xae, 0x9b, 0x59, 0x34, 0xe7, 0xc3, 0xff, 0x58, 0xa4, 0xfb, - 0x2b, 0xf6, 0xf9, 0xa6, 0x3d, 0xd6, 0xe3, 0xc2, 0x7f, 0xc0, 0xc3, 0xe7, 0x62, 0x72, 0xbf, 0xc8, 0x9e, 0x19, 0xf9, 0x76, 0x32, 0x34, 0x1e, 0x97, 0x71, 0x14, 0xe7, 0x78, 0x07, 0x10, 0x05, 0xcd, - 0x1d, 0xab, 0xa0, 0xc8, 0x7a, 0x4a, 0x2e, 0x3a, 0x37, 0x3b, 0x18, 0xaa, 0xb8, 0x38, 0xae, 0x59, 0xc1, 0xc5, 0xd7, 0x38, 0x12, 0x95, 0xca, 0x7e, 0x25, 0x1b, 0x44, 0xda, 0x89, 0x88, 0xd3, 0x3b, - 0xe8, 0xb2, 0xb5, 0x26, 0xdb, 0xde, 0x9a, 0xaf, 0x24, 0x8c, 0x93, 0x55, 0x17, 0xd8, 0x93, 0xb1, 0xb0, 0x69, 0x5d, 0xef, 0x58, 0xae, 0xd7, 0x55, 0x3e, 0xe7, 0xbf, 0xe3, 0xe6, 0x17, 0x69, 0x8e, - 0x2f, 0x3f, 0xbd, 0x28, 0xbb, 0xf0, 0x35, 0x73, 0xe4, 0x53, 0x52, 0x90, 0x5e, 0x94, 0xf9, 0x39, 0x65, 0xec, 0x4d, 0x9b, 0xfd, 0x84, 0x2f, 0xe7, 0x17, 0x63, 0xa7, 0x0a, 0xc3, 0xc6, 0xb7, 0x4a, - 0x6f, 0x7c, 0x2e, 0x02, 0x4e, 0x13, 0xff, 0x8f, 0x32, 0x88, 0xfe, 0x01, 0x58, 0x26, 0xd3, 0xd3, 0xc3, 0xd3, 0x87, 0xe1, 0xf9, 0xff, 0xbd, 0xee, 0x4f, 0xff, 0x73, 0x48, 0x6a, 0xf7, 0x15, 0x70, - 0xdd, 0xfd, 0xd9, 0xf7, 0x4c, 0xdc, 0xe3, 0x17, 0xd9, 0x17, 0xc9, 0x79, 0x3f, 0x19, 0x23, 0xc3, 0x62, 0x20, 0x9b, 0x43, 0x9b, 0x22, 0xe8, 0x3a, 0x3c, 0x42, 0x3a, 0xbc, 0x32, 0x88, 0xa3, 0xe4, - 0x2e, 0xa8, 0x35, 0x12, 0xfb, 0x4b, 0xb6, 0xf7, 0x0d, 0xab, 0x29, 0x1b, 0x5e, 0xdd, 0xaf, 0x5d, 0x30, 0x93, 0xe4, 0xbe, 0xa0, 0x93, 0x15, 0xc2, 0x38, 0xee, 0xc9, 0x21, 0xd6, 0x16, 0xa9, 0x2c, - 0x54, 0x64, 0x7b, 0xb2, 0x03, 0x7a, 0xbe, 0x0c, 0xf7, 0x4d, 0xbc, 0x8d, 0xd3, 0x9d, 0x25, 0x1c, 0x97, 0xde, 0x82, 0x0b, 0x81, 0x81, 0x75, 0xfe, 0x0f, 0x90, 0x12, 0x87, 0xb0, 0xb2, 0xca, 0x4d, - 0x7b, 0x1c, 0xe9, 0x8f, 0xd2, 0x76, 0xc0, 0x9f, 0xd8, 0x13, 0x6a, 0xd4, 0x2f, 0xb2, 0x67, 0x56, 0xbe, 0x9d, 0x9c, 0xb3, 0xb6, 0x07, 0x68, 0x4f, 0x6a, 0xe0, 0xea, 0x69, 0x15, 0xed, 0x43, 0x83, - 0xf3, 0x4e, 0xa4, 0xdb, 0x2b, 0xf8, 0xe1, 0x64, 0x4e, 0x0e, 0x9a, 0xaa, 0xa0, 0xd8, 0x02, 0xf4, 0xd7, 0x15, 0xb1, 0x65, 0xb4, 0x0c, 0x34, 0xcc, 0x46, 0x9c, 0x58, 0x3d, 0xe0, 0x81, 0x62, 0x18, - 0x60, 0x76, 0xbc, 0xca, 0x82, 0x1e, 0x3a, 0x1a, 0x19, 0x1c, 0x4e, 0xf6, 0x7a, 0x76, 0x88, 0xf3, 0x9d, 0xd1, 0xec, 0x85, 0x3d, 0xd7, 0x2d, 0x90, 0x05, 0xfa, 0xa7, 0xc5, 0x7e, 0x83, 0xe3, 0x71, - 0x1f, 0x5e, 0xf7, 0xcd, 0x3f, 0xfd, 0x88, 0xb5, 0x93, 0x67, 0x7a, 0xb3, 0x7f, 0xa6, 0x7f, 0xcd, 0xe3, 0xd7, 0x8b, 0xe3, 0x0b, 0xf9, 0xef, 0x99, 0xbd, 0x4f, 0xe2, 0x08, 0xef, 0x05, 0x6a, 0xb9, - 0xea, 0x49, 0x46, 0xb2, 0xc8, 0x51, 0xe9, 0x15, 0xa2, 0x9e, 0x83, 0xa7, 0x43, 0x45, 0x2d, 0xfb, 0x43, 0xdd, 0x1e, 0x9b, 0x90, 0xd4, 0x09, 0xbc, 0xf3, 0x01, 0xce, 0x0a, 0x6a, 0x5c, 0xf1, 0x53, - 0xd8, 0xec, 0x76, 0xc6, 0x26, 0x98, 0x24, 0xa0, 0xb9, 0x10, 0x79, 0x74, 0xbe, 0x3b, 0x55, 0x4a, 0x63, 0x20, 0x0c, 0x4d, 0x77, 0x6a, 0x0b, 0xd3, 0x4c, 0xcc, 0x3c, 0xaf, 0x2d, 0x5d, 0x52, 0xb6, - 0xdf, 0x72, 0x35, 0xee, 0x98, 0x31, 0x57, 0x22, 0x7b, 0x5b, 0xb4, 0xf7, 0xc5, 0xb0, 0xa4, 0x56, 0x3b, 0x36, 0x93, 0x3c, 0x7f, 0x6c, 0x33, 0x3c, 0x87, 0x52, 0xfd, 0x91, 0xf0, 0xcb, 0x48, 0x7c, - 0x38, 0x1d, 0x8a, 0x56, 0x6d, 0x0a, 0x07, 0x53, 0xdd, 0x37, 0x1e, 0x55, 0xb1, 0x94, 0xe6, 0xa3, 0x53, 0xd9, 0x5b, 0xc8, 0x54, 0xb7, 0x9a, 0xaf, 0x11, 0x5f, 0x0c, 0xa0, 0xa3, 0xdf, 0x4f, 0xe9, - 0x74, 0xe7, 0xef, 0x90, 0xd2, 0x38, 0x0a, 0x8d, 0x46, 0xa3, 0x53, 0xa9, 0x5f, 0xf2, 0x08, 0x97, 0x0a, 0x9b, 0x15, 0xdf, 0x7a, 0x70, 0xd6, 0x64, 0x70, 0xb8, 0x5a, 0x1d, 0xf5, 0x35, 0xb7, 0x6b, - 0xa6, 0x19, 0xef, 0xa3, 0x81, 0x42, 0x81, 0xcf, 0x0f, 0xc1, 0xf9, 0x15, 0xec, 0x36, 0xcd, 0xed, 0xe2, 0x85, 0x35, 0x1f, 0x32, 0x78, 0x3e, 0x25, 0xd8, 0x9f, 0x3f, 0xfa, 0x5a, 0x9e, 0x33, 0xf6, - 0xad, 0xe2, 0xce, 0xae, 0xf2, 0xcd, 0x90, 0xd8, 0xad, 0x69, 0x9f, 0xbb, 0x4e, 0x15, 0x0f, 0xdd, 0x57, 0x4f, 0x2d, 0xe6, 0xd7, 0xb4, 0xdf, 0x06, 0xe6, 0xd7, 0x95, 0xa1, 0x28, 0x71, 0x40, 0xa9, - 0xe4, 0x07, 0x81, 0xc2, 0x45, 0x71, 0x09, 0xc5, 0xea, 0xcc, 0x6d, 0x11, 0xd4, 0x53, 0xd3, 0x4c, 0xab, 0xba, 0x15, 0x33, 0xa2, 0x15, 0x76, 0xa5, 0xc4, 0x4b, 0x75, 0xc3, 0xa0, 0x39, 0xdd, 0xb9, - 0x3e, 0xda, 0x56, 0x40, 0xe9, 0xb8, 0x51, 0x06, 0xd9, 0x90, 0xb9, 0x94, 0x1b, 0xb9, 0x6f, 0x8e, 0x6e, 0x82, 0xf2, 0x9b, 0x6e, 0xeb, 0x8f, 0x72, 0xdf, 0xdc, 0x9c, 0x8e, 0xa7, 0x06, 0xf5, 0x27, - 0x0f, 0xb4, 0xd4, 0x6f, 0x59, 0xf5, 0x69, 0x48, 0x1e, 0xe9, 0x9e, 0x4f, 0x8a, 0xf1, 0xed, 0x13, 0x7e, 0xb1, 0xed, 0xfa, 0xfa, 0x59, 0x37, 0x1d, 0x22, 0xd8, 0x46, 0xc6, 0x56, 0x71, 0x21, 0xed, - 0xe3, 0x15, 0x3f, 0xc7, 0xd6, 0xde, 0x6e, 0xcb, 0x15, 0x9c, 0xcd, 0x4e, 0x58, 0x60, 0x33, 0x9d, 0xa7, 0x5d, 0x64, 0xf4, 0x99, 0x22, 0x21, 0xd5, 0xa6, 0xe1, 0xa9, 0xcd, 0x11, 0x92, 0x50, 0x02, - 0x4a, 0xf6, 0x7a, 0xe2, 0x64, 0x2c, 0x1e, 0x0b, 0xd8, 0x0e, 0xc4, 0xdb, 0x50, 0x6b, 0x0e, 0x98, 0xe8, 0x49, 0x96, 0x04, 0x2f, 0x6d, 0x6b, 0xdf, 0x02, 0xc7, 0x35, 0xfa, 0xbc, 0x36, 0xf5, 0x59, - 0xe0, 0xee, 0x60, 0x01, 0xff, 0xb9, 0x48, 0x5f, 0x7f, 0xf9, 0xe1, 0x10, 0xfd, 0x7e, 0x82, 0xc2, 0x2d, 0xf5, 0xb7, 0xe1, 0xf9, 0x70, 0xe9, 0x32, 0x32, 0x03, 0xb2, 0x16, 0xf2, 0x7c, 0xb4, 0xdb, - 0x6d, 0xb5, 0x52, 0xf6, 0x04, 0x54, 0x60, 0x0d, 0x4d, 0xf5, 0x67, 0x0b, 0xbc, 0xdd, 0x23, 0x64, 0x32, 0xa5, 0xab, 0x6a, 0x81, 0x51, 0x93, 0x80, 0x1d, 0x65, 0x40, 0x0b, 0x4d, 0x02, 0x38, 0x88, - 0xfd, 0xce, 0x74, 0xd7, 0x46, 0xab, 0x82, 0x53, 0x36, 0x07, 0xf7, 0x59, 0xb8, 0xdd, 0xa8, 0x05, 0xea, 0xa3, 0x61, 0xc9, 0x32, 0x5a, 0xa6, 0xd8, 0xf8, 0x8e, 0x35, 0xc3, 0xc3, 0xbe, 0x7b, 0x42, - 0xae, 0x5f, 0xa1, 0x69, 0xef, 0x1b, 0x00, 0xcf, 0x84, 0xfc, 0x2f, 0x24, 0xcf, 0xac, 0x79, 0x39, 0x18, 0xa3, 0xc3, 0xc2, 0xfc, 0xaa, 0x19, 0x98, 0x2b, 0x61, 0x7f, 0x8a, 0x73, 0xfe, 0xb4, 0xc0, - 0xc4, 0x8d, 0x46, 0x20, 0x99, 0xc9, 0x72, 0xd8, 0x9a, 0x75, 0x77, 0x6b, 0xfe, 0xb4, 0xc3, 0xe0, 0x03, 0xa1, 0x4f, 0xaa, 0x03, 0xbd, 0xab, 0xa7, 0x9d, 0xc5, 0x48, 0xbb, 0x66, 0xc6, 0x72, 0xeb, - 0x8c, 0xb5, 0x56, 0x81, 0x0d, 0xed, 0x94, 0x7d, 0x1a, 0x06, 0x0c, 0xb8, 0x3f, 0xa4, 0x14, 0xed, 0xe5, 0x94, 0x35, 0x13, 0x0e, 0x2c, 0xaa, 0xec, 0x7f, 0x27, 0xac, 0xf7, 0x03, 0x02, 0x7f, 0xb6, - 0x83, 0x44, 0x2c, 0xf7, 0xe3, 0xd2, 0x19, 0x07, 0x8f, 0x84, 0x0b, 0x7a, 0x0a, 0xb1, 0xed, 0x17, 0xd9, 0x33, 0xeb, 0xde, 0x4e, 0xce, 0x3e, 0x97, 0x6f, 0xa2, 0xa2, 0xd0, 0x98, 0x14, 0xf4, 0xad, - 0x01, 0x1f, 0x92, 0x50, 0xd9, 0x89, 0xa2, 0x35, 0xdb, 0x2d, 0xe9, 0x43, 0x5f, 0x2d, 0xcc, 0xd4, 0xf1, 0x9b, 0xdf, 0x15, 0x88, 0x4b, 0xa2, 0xf0, 0xd9, 0x5a, 0xf9, 0x42, 0x2c, 0x9e, 0x78, 0xbf, - 0x0f, 0x84, 0x5f, 0xde, 0xf0, 0xc3, 0xe9, 0x59, 0x44, 0x06, 0x44, 0x7e, 0x9b, 0x75, 0x27, 0xc9, 0x52, 0x1a, 0xac, 0xc0, 0x62, 0x99, 0x62, 0xf0, 0x3c, 0xdf, 0x1e, 0x2d, 0xa6, 0x08, 0xb8, 0xd5, - 0xbe, 0xd0, 0xd3, 0x49, 0x22, 0xf3, 0xbe, 0xc7, 0x7a, 0x15, 0xc6, 0xe0, 0xab, 0x9d, 0x00, 0x4c, 0x83, 0x25, 0x89, 0xa9, 0x9d, 0x5d, 0x6f, 0x46, 0xa5, 0x56, 0x09, 0x59, 0x1e, 0xbb, 0x44, 0x00, - 0x98, 0xed, 0x5a, 0xd9, 0x77, 0x7b, 0xb5, 0xa9, 0xb7, 0x4a, 0xee, 0xfb, 0xc7, 0xfe, 0x56, 0xc3, 0xff, 0x8d, 0xd5, 0xcc, 0x8e, 0x92, 0xc0, 0xff, 0x60, 0xf9, 0x11, 0xbf, 0x6f, 0xf9, 0x7d, 0x5c, - 0xf6, 0xce, 0xd5, 0x25, 0xaf, 0xe6, 0xf8, 0x25, 0x1a, 0xf8, 0xfb, 0x95, 0x07, 0x83, 0xec, 0xfe, 0x33, 0xe7, 0x3f, 0xd4, 0x77, 0x94, 0xb9, 0xff, 0xc8, 0x90, 0x83, 0x9e, 0xca, 0x9c, 0xbc, 0xfb, - 0x84, 0xf7, 0x31, 0xbf, 0xb9, 0x7e, 0x4e, 0x03, 0x1a, 0xb0, 0x5e, 0x1a, 0x93, 0x2e, 0x37, 0x42, 0x84, 0xd4, 0x96, 0x01, 0xab, 0x57, 0x53, 0x31, 0x3f, 0xe1, 0x2a, 0x28, 0xcb, 0x07, 0x53, 0x3d, - 0x58, 0x3c, 0xda, 0x30, 0xdb, 0x9d, 0x9e, 0x25, 0xa4, 0xb4, 0x9d, 0x80, 0x14, 0x35, 0x47, 0xd6, 0x64, 0x75, 0x50, 0x41, 0xe5, 0x20, 0xf3, 0xe2, 0x82, 0x12, 0x71, 0x7d, 0x97, 0xf0, 0x9c, 0x46, - 0xe0, 0xec, 0x5a, 0xf1, 0x2c, 0x4e, 0xde, 0x2d, 0x45, 0xc4, 0xf5, 0xcd, 0x70, 0xfd, 0xfc, 0xe0, 0x3f, 0x5f, 0x58, 0xf2, 0xde, 0xc0, 0xfa, 0xf7, 0x0d, 0xff, 0xff, 0x43, 0x85, 0x25, 0x77, 0xc7, - 0xcd, 0x7e, 0x18, 0xef, 0x7c, 0x32, 0xf6, 0xf3, 0xe0, 0x21, 0x8f, 0xe4, 0xc6, 0x8e, 0xad, 0xa1, 0x31, 0xa1, 0x6e, 0xda, 0x52, 0x41, 0x03, 0x89, 0x30, 0x32, 0x6b, 0x4e, 0xc4, 0xbc, 0x56, 0x52, - 0xb3, 0xdb, 0xc0, 0xfc, 0x32, 0x87, 0x02, 0xbc, 0x59, 0x21, 0x53, 0x67, 0x74, 0xc2, 0xc2, 0x5a, 0x8e, 0xb7, 0x5c, 0x3f, 0x8a, 0xfa, 0x29, 0xc5, 0xf4, 0x53, 0xfe, 0x20, 0xda, 0x21, 0x7d, 0x42, - 0xe1, 0x93, 0xd0, 0x63, 0xa3, 0x2c, 0x24, 0xda, 0xc0, 0x59, 0x13, 0xc9, 0xa1, 0xef, 0x90, 0x60, 0x26, 0x4e, 0x24, 0xf5, 0x91, 0x0a, 0x39, 0x40, 0x74, 0x3e, 0x87, 0x89, 0xae, 0x62, 0x40, 0x5f, - 0x49, 0xd6, 0x7f, 0x93, 0xb1, 0x2f, 0x4a, 0xfd, 0xcb, 0xe6, 0x00, 0xff, 0xd0, 0xe8, 0x9f, 0x1f, 0xf3, 0x68, 0xfc, 0xcf, 0x37, 0x87, 0x4a, 0x40, 0xe0, 0x61, 0xf6, 0x94, 0x40, 0x05, 0xd2, 0xa9, - 0xdb, 0xed, 0x04, 0x2c, 0xad, 0x03, 0x1c, 0xcb, 0xc7, 0x38, 0xa1, 0x26, 0x40, 0xb4, 0x59, 0xac, 0x05, 0x79, 0x2e, 0x39, 0x0d, 0x51, 0x4e, 0xba, 0xae, 0x3c, 0x25, 0x6a, 0xb1, 0x92, 0xf9, 0xb6, - 0x5e, 0x02, 0x73, 0x64, 0x9a, 0x55, 0x50, 0x41, 0x83, 0x42, 0xb9, 0x5f, 0x22, 0x02, 0x05, 0x6a, 0xee, 0x7a, 0x1b, 0x99, 0xfb, 0xa6, 0xf7, 0x9b, 0x43, 0x75, 0x7c, 0xde, 0xc0, 0xfb, 0x7f, 0x9d, - 0x04, 0xa4, 0x5f, 0xf9, 0x89, 0xb1, 0xe7, 0xec, 0x9d, 0x77, 0xb2, 0xaf, 0x23, 0x7c, 0x39, 0x19, 0x63, 0xc3, 0x2c, 0x9b, 0x03, 0x42, 0xec, 0xc4, 0x2d, 0x6b, 0x66, 0xa7, 0x45, 0x4e, 0xa5, 0x8b, - 0x58, 0x9a, 0xd6, 0xd5, 0x56, 0x8b, 0xb2, 0xaa, 0xaa, 0x27, 0x89, 0x26, 0xac, 0x53, 0xc6, 0x56, 0x30, 0x9d, 0xc9, 0x73, 0x24, 0x41, 0x18, 0x73, 0x3a, 0x0b, 0x77, 0x3a, 0xb6, 0x22, 0x1d, 0x75, - 0x2b, 0x50, 0xb1, 0xd1, 0x32, 0xcc, 0x71, 0x31, 0x02, 0xc0, 0x24, 0x59, 0xe2, 0xeb, 0x5c, 0xac, 0xd4, 0x6d, 0x5f, 0xaa, 0xd6, 0x9f, 0xcc, 0xe9, 0xf3, 0x4f, 0xff, 0xa5, 0x0a, 0x4c, 0xfe, 0xa5, - 0xbb, 0xf7, 0x87, 0x22, 0xd4, 0x47, 0xc6, 0xcd, 0x13, 0x6a, 0xfb, 0x07, 0xc2, 0xef, 0x23, 0xf2, 0x5a, 0x15, 0x3b, 0x30, 0x12, 0x12, 0xea, 0x2b, 0x45, 0x47, 0x56, 0xc6, 0x68, 0x27, 0xa5, 0x3a, - 0x85, 0xd1, 0x85, 0xcd, 0x7a, 0x0b, 0xdc, 0xd2, 0x76, 0x19, 0xab, 0x38, 0x2b, 0x91, 0x92, 0x69, 0x7d, 0x6e, 0xf8, 0x16, 0x60, 0xe5, 0x82, 0xe7, 0xfa, 0xa5, 0x7b, 0x38, 0x55, 0x40, 0x68, 0x97, - 0x9c, 0x9a, 0x09, 0xda, 0x22, 0xd9, 0xef, 0xc0, 0x7e, 0xb9, 0x54, 0x8d, 0x20, 0xb5, 0x58, 0xb8, 0x1c, 0x95, 0x87, 0x00, 0x35, 0x24, 0x4e, 0x7e, 0xde, 0xda, 0x8c, 0xfc, 0xf8, 0x63, 0xb5, 0x2e, - 0xf4, 0x94, 0xaf, 0x7d, 0xd0, 0x98, 0x54, 0xa9, 0x9d, 0xeb, 0xee, 0xe3, 0x11, 0x21, 0x9e, 0xb3, 0x08, 0xde, 0xc9, 0xbe, 0x8c, 0xc7, 0xfb, 0xc9, 0x98, 0xf8, 0xde, 0x22, 0x78, 0x19, 0x8d, 0x84, - 0xa4, 0x46, 0x3a, 0x5f, 0x50, 0x41, 0xdf, 0x07, 0x91, 0x30, 0x99, 0x09, 0x22, 0x29, 0x2e, 0xb6, 0xa3, 0x23, 0xce, 0x8a, 0x7d, 0xd8, 0x8e, 0x68, 0x29, 0x07, 0x74, 0xb6, 0xe1, 0x40, 0xe2, 0xb4, - 0x1c, 0xc9, 0x30, 0xea, 0x16, 0x74, 0x34, 0xdb, 0x42, 0x1b, 0xce, 0xe9, 0x75, 0xc8, 0x59, 0x8f, 0xc4, 0xd1, 0x76, 0x1d, 0x2a, 0xb3, 0x84, 0x3f, 0xa6, 0x42, 0x9d, 0x24, 0x73, 0x20, 0x95, 0x05, - 0x88, 0x7d, 0x7e, 0x86, 0x98, 0x49, 0x94, 0x26, 0xf1, 0xcb, 0xef, 0xb7, 0x23, 0xbf, 0x2c, 0x5f, 0x51, 0x21, 0xa0, 0x5b, 0xe4, 0x87, 0x4b, 0xea, 0x57, 0xa0, 0x5f, 0x6e, 0xc3, 0xb7, 0xfa, 0x94, - 0x65, 0x1b, 0xd5, 0x5b, 0x79, 0x36, 0x72, 0x8d, 0x7e, 0x73, 0x86, 0x81, 0x7f, 0xcd, 0x2c, 0xbd, 0xee, 0xbb, 0x73, 0xd3, 0x93, 0xc8, 0x49, 0xf2, 0xe8, 0x17, 0x66, 0xd9, 0xa7, 0x88, 0xce, 0xcb, - 0x6d, 0xff, 0x0c, 0xc7, 0xf1, 0xd7, 0x5b, 0x3c, 0xe7, 0xea, 0xeb, 0x91, 0x5d, 0x7a, 0x89, 0xf5, 0x6b, 0x4d, 0xbe, 0x5a, 0xba, 0x23, 0xff, 0xd2, 0x30, 0xf3, 0x3a, 0x1f, 0xee, 0xc7, 0x8f, 0xbf, - 0xb2, 0xcb, 0x17, 0xb0, 0xeb, 0xce, 0x51, 0x57, 0xf1, 0xcf, 0xff, 0xba, 0x24, 0x3e, 0xfe, 0xae, 0x84, 0x62, 0x3f, 0xd1, 0x9f, 0xe0, 0x8f, 0xff, 0x2f, 0x84, 0xbc, 0xc2, 0x5b, 0x0c, 0xa9, 0x02, - 0xfa, 0x20, 0x5a, 0x57, 0xd7, 0xdf, 0xd8, 0x7b, 0xdf, 0xec, 0x43, 0x9e, 0xd8, 0xd8, 0xcf, 0x14, 0x81, 0xf1, 0xe5, 0xff, 0x19, 0xd8, 0x64, 0xc0, 0x76, 0x2d, 0xca, 0xfb, 0x05, 0x5b, 0x6d, 0x55, - 0xc4, 0xa6, 0x4b, 0x69, 0x25, 0xd6, 0x31, 0x7f, 0xc0, 0x57, 0xe6, 0xc9, 0x2e, 0xa1, 0x00, 0x2c, 0x27, 0x42, 0x25, 0x14, 0x8b, 0x5e, 0x14, 0xfb, 0xc2, 0x3e, 0xd1, 0x13, 0xf8, 0x18, 0x12, 0x99, - 0xea, 0x2c, 0x96, 0xe2, 0xdc, 0x2f, 0x1a, 0x2d, 0x5b, 0xd6, 0xec, 0x9e, 0xd9, 0xb1, 0x82, 0xab, 0x8d, 0x70, 0x06, 0xa8, 0x29, 0x9e, 0xf7, 0x6c, 0xaf, 0x69, 0x9d, 0xd3, 0x1f, 0x2c, 0x24, 0xc5, - 0x5f, 0xaf, 0x20, 0xc0, 0x4f, 0x35, 0x16, 0xf8, 0xfc, 0x9d, 0xd4, 0xb6, 0x73, 0xfa, 0xc3, 0xe3, 0x38, 0xfb, 0x0a, 0x14, 0xeb, 0x45, 0x2a, 0x2e, 0x41, 0x84, 0x62, 0x6c, 0x26, 0x61, 0x92, 0x5f, - 0xdd, 0xfb, 0xf1, 0xe3, 0xaf, 0xe4, 0xec, 0x3f, 0xd3, 0xc3, 0x8f, 0xd6, 0xfc, 0x8f, 0x1f, 0xbf, 0xd2, 0xef, 0x9f, 0x18, 0xf9, 0xe8, 0xb1, 0xfb, 0x17, 0x7a, 0xc2, 0x04, 0x8c, 0x0a, 0x60, 0x0c, - 0x44, 0xc5, 0x19, 0xef, 0x78, 0x80, 0x71, 0x57, 0x30, 0x27, 0xb1, 0x1d, 0xed, 0x02, 0xae, 0x8c, 0x66, 0x18, 0xa7, 0xc1, 0x78, 0x32, 0x43, 0x17, 0xe4, 0x62, 0xbe, 0x59, 0x50, 0xc7, 0x23, 0xba, - 0x45, 0xb5, 0xcc, 0x66, 0x04, 0x8d, 0xaa, 0x31, 0xa2, 0x54, 0x46, 0x81, 0x81, 0xd4, 0x27, 0x40, 0xee, 0xf4, 0xf5, 0x5e, 0x04, 0x45, 0x65, 0xdd, 0xed, 0xcb, 0x68, 0xb3, 0xe5, 0x40, 0x63, 0xa4, - 0x5b, 0xaa, 0x32, 0xaf, 0x8d, 0x02, 0x12, 0xe7, 0x3a, 0xfb, 0xa8, 0xa3, 0xc4, 0x37, 0xbc, 0x29, 0x1f, 0xe3, 0x27, 0x61, 0x57, 0x1d, 0xbc, 0x86, 0xb2, 0xe2, 0x9d, 0xea, 0xdb, 0x2a, 0xfe, 0x72, - 0x3c, 0x3e, 0xd3, 0xfa, 0x9e, 0x31, 0x9e, 0x9c, 0x78, 0xbc, 0xbd, 0x74, 0x4e, 0x80, 0x39, 0x43, 0x09, 0xaa, 0x4d, 0x75, 0xa0, 0x41, 0x09, 0xef, 0x54, 0x8a, 0xd8, 0x51, 0x97, 0x33, 0xcd, 0x00, - 0xa5, 0xdd, 0x24, 0xdf, 0xd4, 0x7b, 0x90, 0xc2, 0x53, 0x5d, 0x2e, 0x48, 0x15, 0x91, 0x26, 0x7d, 0x67, 0xf5, 0x87, 0xbc, 0x08, 0x85, 0x55, 0x19, 0x00, 0xae, 0x85, 0x12, 0x59, 0x3b, 0x41, 0xc1, - 0x60, 0x5d, 0x9a, 0x05, 0x56, 0x33, 0x90, 0xf3, 0x07, 0x33, 0xe1, 0xab, 0xb5, 0xef, 0x6a, 0x1b, 0xbc, 0xb8, 0x43, 0xee, 0xe8, 0xab, 0xdf, 0xce, 0x97, 0x61, 0x48, 0xff, 0x0f, 0x27, 0xc8, 0x75, - 0x3a, 0xcd, 0x53, 0x0e, 0xcc, 0x2b, 0xd2, 0x97, 0x51, 0xfb, 0x70, 0x61, 0x8c, 0x0f, 0x73, 0x68, 0x66, 0x29, 0x35, 0xab, 0xe5, 0x70, 0x5a, 0x94, 0x95, 0xc0, 0xd6, 0xf6, 0xba, 0x88, 0x71, 0x36, - 0x36, 0x57, 0x72, 0x5d, 0x4f, 0x40, 0x28, 0x5b, 0xea, 0xe6, 0xba, 0x97, 0x42, 0x01, 0x18, 0x6d, 0x9a, 0xd6, 0x9c, 0x8e, 0xc0, 0x0c, 0x6e, 0x36, 0x5d, 0x8d, 0xd2, 0x4e, 0x5d, 0x12, 0x20, 0x40, - 0x8b, 0x31, 0x9c, 0x66, 0x02, 0x59, 0xac, 0x2c, 0xda, 0x4f, 0x5c, 0x8d, 0x91, 0xa7, 0x23, 0xa1, 0x6e, 0xe4, 0xe7, 0x6d, 0x0e, 0x4f, 0x2f, 0xc6, 0x4e, 0xa8, 0x7f, 0xc4, 0x36, 0xf9, 0xdd, 0xb1, - 0x19, 0xa8, 0x0b, 0x5d, 0x78, 0xe5, 0x75, 0xa9, 0x9d, 0x87, 0x7e, 0x7c, 0x7a, 0xbc, 0xb0, 0x3c, 0x15, 0x57, 0xfa, 0x4c, 0xff, 0xe3, 0x08, 0xfd, 0xba, 0x3a, 0x34, 0xbe, 0x24, 0xa7, 0xc5, 0xec, - 0x18, 0xa6, 0x7b, 0x93, 0x6e, 0x04, 0x51, 0x9a, 0xc1, 0xb0, 0x4e, 0xb1, 0xe8, 0x0a, 0x2c, 0xf1, 0x0d, 0xb1, 0x8a, 0x66, 0x75, 0x41, 0xb5, 0x8e, 0xb0, 0x9d, 0x37, 0x11, 0x6e, 0x4a, 0x05, 0xb2, - 0x29, 0x3c, 0x1e, 0xc1, 0x24, 0x5d, 0x39, 0x35, 0x16, 0x0e, 0xd2, 0x31, 0x29, 0x68, 0xf4, 0x9e, 0x29, 0x8a, 0x06, 0xb6, 0xd5, 0xc4, 0x24, 0x28, 0x5d, 0xde, 0x2b, 0xa0, 0x56, 0xc5, 0xcf, 0xab, - 0x49, 0x77, 0x86, 0xe9, 0x7a, 0x8a, 0x5d, 0x4b, 0xfd, 0x5b, 0x67, 0xee, 0x7f, 0xc5, 0x50, 0x96, 0xaf, 0x3a, 0xd0, 0xfd, 0xa5, 0xf0, 0x19, 0xa8, 0xbe, 0x33, 0x45, 0x60, 0x7c, 0xf9, 0x3f, 0xc6, - 0x86, 0x01, 0xf5, 0x1d, 0x99, 0x2a, 0x42, 0xf1, 0x83, 0x8f, 0xad, 0x05, 0x61, 0x41, 0xcf, 0x89, 0x08, 0x86, 0x91, 0xd2, 0x9a, 0x20, 0x7a, 0xe9, 0xc1, 0x76, 0xcc, 0x9a, 0x87, 0x8d, 0x2b, 0x50, - 0x01, 0x93, 0x4f, 0x62, 0xb7, 0x22, 0x0c, 0x6b, 0x39, 0x93, 0xa5, 0x13, 0x16, 0xf1, 0x40, 0x23, 0x73, 0x35, 0xda, 0x71, 0xb2, 0xc9, 0xc6, 0xd4, 0x36, 0x66, 0x0d, 0x6a, 0xee, 0xe9, 0x68, 0x91, - 0x18, 0x52, 0x3b, 0xe9, 0xbe, 0x6d, 0x4c, 0xfa, 0x85, 0xa5, 0x17, 0xd4, 0xef, 0xcb, 0xdb, 0x95, 0x5e, 0x18, 0x26, 0x96, 0x5e, 0x78, 0x3f, 0xcd, 0x30, 0x89, 0x6d, 0xeb, 0x2d, 0x0f, 0x04, 0xbd, - 0x45, 0xc4, 0x7d, 0xfd, 0x54, 0x99, 0x57, 0xb1, 0xa9, 0x97, 0xf6, 0xeb, 0x87, 0xd0, 0x9b, 0x95, 0xf4, 0x63, 0x6a, 0xd6, 0x03, 0x24, 0xa2, 0x0f, 0x4e, 0xfa, 0x97, 0x4f, 0xdc, 0xb6, 0xa1, 0xfc, - 0xec, 0x4d, 0xfe, 0x7d, 0x21, 0x81, 0xc0, 0x81, 0x51, 0xb7, 0xcb, 0xb8, 0x5e, 0x5d, 0xba, 0xb0, 0xe9, 0xbe, 0x31, 0x84, 0x3e, 0x31, 0xef, 0xf5, 0xa0, 0x06, 0xc6, 0x2f, 0x7f, 0xc7, 0xe7, 0xef, - 0x7f, 0x2f, 0x36, 0xb8, 0x44, 0xc3, 0x21, 0x36, 0x5a, 0x93, 0xdb, 0x4d, 0xe3, 0x8c, 0x70, 0xae, 0x3a, 0x24, 0xa6, 0xb1, 0xaf, 0x65, 0xd1, 0x12, 0x2a, 0x0c, 0x01, 0xca, 0x5c, 0xb6, 0x95, 0x4d, - 0x05, 0xaf, 0x17, 0xcd, 0xc9, 0x35, 0xcb, 0xb8, 0x32, 0x20, 0xbd, 0x4a, 0x16, 0xa3, 0x03, 0xb4, 0x3f, 0x98, 0x11, 0x38, 0xa5, 0x14, 0x0e, 0xcf, 0xaa, 0xaa, 0x30, 0xf3, 0x3e, 0x8b, 0x66, 0x5b, - 0x7d, 0xc3, 0x52, 0xc0, 0x9f, 0x84, 0x3e, 0x2f, 0x4d, 0xaa, 0x6c, 0x3b, 0x1d, 0xdb, 0x59, 0xa5, 0x5f, 0x7a, 0x06, 0x7c, 0xea, 0x96, 0x7a, 0xae, 0xdd, 0x2a, 0x4c, 0xcf, 0x8e, 0xf4, 0x71, 0x99, - 0xeb, 0x2f, 0x4c, 0xb3, 0xff, 0xfa, 0x1f, 0xf7, 0x92, 0x30, 0xee, 0x43, 0xca, 0x5c, 0xac, 0x95, 0x2b, 0x51, 0xaa, 0x72, 0xff, 0x12, 0xa9, 0xba, 0x08, 0xc9, 0x1d, 0x05, 0xf6, 0xae, 0x03, 0xe9, - 0x61, 0x79, 0xeb, 0x10, 0xd7, 0x92, 0x9d, 0x26, 0x86, 0x9d, 0xdb, 0xfd, 0xc9, 0x8f, 0x9f, 0x13, 0x9e, 0x07, 0x7c, 0xb8, 0x27, 0x4d, 0xcf, 0xb5, 0x46, 0xbb, 0xf7, 0x00, 0x60, 0x7c, 0xf7, 0xf2, - 0xd0, 0xa6, 0x68, 0x3c, 0x47, 0x00, 0xe2, 0x34, 0x46, 0xb4, 0x40, 0xf3, 0x96, 0xc7, 0x18, 0x0a, 0x37, 0xde, 0x69, 0xa1, 0xcf, 0x28, 0x45, 0x50, 0x65, 0x49, 0x0b, 0xf6, 0xde, 0x0e, 0x25, 0x67, - 0x80, 0x1c, 0x0b, 0x35, 0xd1, 0xd6, 0x6e, 0x56, 0x66, 0xe9, 0x4c, 0x9b, 0x2e, 0x05, 0x34, 0x92, 0xa5, 0x76, 0xdb, 0x42, 0x72, 0x98, 0xa0, 0x65, 0xd6, 0xdb, 0x99, 0x01, 0x16, 0x42, 0x98, 0x57, - 0xba, 0xd0, 0x21, 0x56, 0xf5, 0x60, 0x99, 0xfa, 0x8a, 0x99, 0x5f, 0xb4, 0xe7, 0x86, 0x90, 0x27, 0xbc, 0x10, 0x2f, 0x14, 0xcf, 0x4b, 0xf6, 0xb9, 0x2b, 0xf7, 0x0b, 0x89, 0xef, 0x79, 0x01, 0x02, - 0x07, 0x18, 0x14, 0x1b, 0x79, 0xa9, 0x9e, 0x24, 0x53, 0xa1, 0xb6, 0x3e, 0x3a, 0x9b, 0x6d, 0x8b, 0x91, 0x30, 0xe3, 0x8f, 0xc7, 0x26, 0x13, 0xd7, 0xba, 0x9f, 0x32, 0xd4, 0xbc, 0x49, 0x21, 0xd0, - 0x92, 0x38, 0x3f, 0xdd, 0xd5, 0xdb, 0x63, 0xa3, 0xaa, 0x94, 0x0f, 0x42, 0x07, 0x40, 0x38, 0x85, 0x4b, 0xa6, 0x63, 0xd7, 0x0b, 0x6f, 0x69, 0x06, 0x89, 0x79, 0x1a, 0xd1, 0xeb, 0x98, 0x74, 0x36, - 0xb3, 0xc5, 0xf3, 0xaa, 0xcf, 0xf5, 0xb4, 0xfb, 0x1b, 0xba, 0x9d, 0x76, 0x17, 0x7f, 0xab, 0xf5, 0x7a, 0xf3, 0x66, 0xa6, 0x59, 0x49, 0xe9, 0xbb, 0x71, 0x72, 0xe9, 0xf7, 0xfb, 0x37, 0x78, 0xab, - 0xf4, 0x3a, 0x49, 0x3e, 0xb6, 0xf5, 0x0b, 0x08, 0xe2, 0xdf, 0xe0, 0x4f, 0xe4, 0xda, 0x5d, 0xe1, 0x54, 0xb1, 0xf9, 0x62, 0xaa, 0xbd, 0x3b, 0x7b, 0x3f, 0x3f, 0xfc, 0x0d, 0x2e, 0xe0, 0xef, 0x97, - 0xcd, 0x10, 0xfb, 0x78, 0xc7, 0xd3, 0x8b, 0xf7, 0x9f, 0x74, 0x45, 0xd5, 0x8f, 0x3d, 0x3b, 0xf7, 0x2f, 0xd8, 0x99, 0x7f, 0xc3, 0x57, 0xfe, 0xf6, 0x4b, 0xd4, 0xf1, 0xdd, 0x11, 0x79, 0xfe, 0xee, - 0x15, 0xbe, 0x6f, 0xe4, 0xc7, 0x7e, 0xe4, 0x5f, 0x50, 0xba, 0xff, 0x7e, 0xb1, 0xcd, 0xae, 0xee, 0x7e, 0xae, 0x3f, 0xf9, 0x1b, 0xba, 0x2a, 0x50, 0xfd, 0x25, 0x37, 0x6f, 0x6f, 0xf3, 0xf9, 0xee, - 0x2b, 0x2e, 0xcd, 0x0b, 0x3b, 0xee, 0xee, 0x5b, 0x9f, 0x43, 0x8f, 0x97, 0x5f, 0x72, 0xc5, 0x96, 0x5b, 0x04, 0x98, 0x3b, 0x7e, 0x91, 0x4f, 0xa9, 0xe4, 0xaf, 0xc2, 0x7f, 0x4e, 0x24, 0x3f, 0x1f, - 0x0f, 0x58, 0x7c, 0xde, 0x3b, 0x63, 0xdd, 0x9b, 0x32, 0xe0, 0x53, 0xb6, 0xef, 0x2b, 0xcd, 0x97, 0x49, 0x73, 0x39, 0x1a, 0x83, 0xc3, 0xac, 0xe0, 0x11, 0x03, 0x6e, 0x36, 0x6e, 0x10, 0x24, 0x53, - 0xf2, 0xa8, 0xc1, 0x9c, 0x63, 0xd5, 0xa2, 0xc3, 0x8e, 0xb8, 0xf5, 0x86, 0xca, 0xdb, 0x50, 0xdb, 0x1e, 0x6c, 0x73, 0x42, 0xeb, 0xe2, 0x41, 0x84, 0x1c, 0x1b, 0x5b, 0x76, 0x9e, 0x03, 0x02, 0xce, - 0x36, 0x5a, 0x81, 0xc6, 0xc2, 0x3f, 0x42, 0x0b, 0x82, 0x54, 0x30, 0x93, 0xd1, 0x42, 0x78, 0x93, 0x86, 0xa5, 0x94, 0x96, 0x7d, 0xa0, 0xad, 0xf7, 0xf3, 0xd3, 0x7a, 0x60, 0x2d, 0xaa, 0xe1, 0xc7, - 0x65, 0x6e, 0x5f, 0x42, 0x0d, 0x97, 0x80, 0xc4, 0x00, 0xe6, 0xd9, 0x6d, 0x39, 0xfe, 0x4a, 0x4b, 0x7c, 0x0e, 0x92, 0xf3, 0x17, 0xd9, 0x17, 0x16, 0xbe, 0x9f, 0x0c, 0x81, 0xe3, 0x84, 0xc6, 0x0e, - 0x84, 0x27, 0x4b, 0x0c, 0x9b, 0xa9, 0xae, 0x33, 0xa3, 0xea, 0x8d, 0xb3, 0x4d, 0x94, 0x42, 0x24, 0x46, 0xa1, 0xb9, 0x91, 0x7e, 0x77, 0x29, 0xbd, 0x69, 0xbf, 0xfd, 0xcf, 0xd9, 0x30, 0x57, 0x94, - 0x5f, 0xde, 0xf1, 0xe3, 0xf9, 0x50, 0xbb, 0xe5, 0xa4, 0xd3, 0x59, 0x04, 0xd1, 0x73, 0x65, 0x9a, 0xa6, 0x08, 0xaf, 0x35, 0x32, 0x81, 0x10, 0xf0, 0x9e, 0x35, 0xe2, 0x54, 0x8b, 0xe5, 0x13, 0x3f, - 0x6d, 0x19, 0x7e, 0x6a, 0x49, 0x25, 0x42, 0xc2, 0x23, 0x2b, 0xd2, 0xfc, 0x3d, 0xa1, 0x41, 0x5b, 0xa1, 0x89, 0x16, 0x42, 0x3b, 0x9b, 0xe7, 0x73, 0x09, 0xc5, 0x05, 0xc3, 0x3b, 0x4e, 0xb1, 0x15, - 0xd6, 0x79, 0x47, 0x5e, 0xab, 0x3a, 0x4a, 0xd8, 0xe0, 0x43, 0x85, 0xe5, 0x41, 0x1b, 0xf4, 0x01, 0x12, 0xf3, 0x3e, 0xab, 0x1f, 0x71, 0xf3, 0xf7, 0x0b, 0xbf, 0x5f, 0x69, 0x5e, 0xf8, 0xf8, 0x72, - 0x74, 0xe6, 0xe0, 0x37, 0xa5, 0xdf, 0xd0, 0x98, 0xb6, 0x94, 0x15, 0x80, 0x65, 0x04, 0xaf, 0x85, 0x6e, 0x61, 0x98, 0xa7, 0xf9, 0x0e, 0x1a, 0xd1, 0x89, 0xee, 0xa3, 0x8e, 0xfa, 0xbb, 0x82, 0xe2, - 0xc7, 0xdd, 0x17, 0xcd, 0x5a, 0x20, 0xf0, 0x27, 0xfa, 0x8c, 0xad, 0xf4, 0x4a, 0xf5, 0xe5, 0xbd, 0x5e, 0x0f, 0xc7, 0x17, 0x52, 0xdf, 0xcb, 0x86, 0x51, 0x6d, 0x96, 0x7d, 0x83, 0xa7, 0x69, 0xd6, - 0x45, 0x95, 0x80, 0xa4, 0x25, 0x04, 0x06, 0xec, 0x09, 0xc0, 0x24, 0xce, 0x3e, 0x6e, 0x0c, 0xdf, 0xf2, 0x3d, 0x4e, 0x52, 0x47, 0x3c, 0x56, 0x24, 0xee, 0x02, 0x9b, 0xc7, 0x64, 0xcf, 0x80, 0x59, - 0x49, 0xef, 0x97, 0x6c, 0xe5, 0x35, 0x50, 0x8b, 0x58, 0x1d, 0xef, 0xee, 0x36, 0xc0, 0x5a, 0x61, 0x96, 0xc7, 0x42, 0x59, 0x13, 0xd0, 0xa8, 0xa3, 0xfa, 0xcd, 0xef, 0xe4, 0x52, 0x41, 0x83, 0x96, - 0x8f, 0xe4, 0xb5, 0x5c, 0x36, 0xd7, 0x63, 0xf7, 0xd1, 0x12, 0x32, 0x79, 0x2a, 0xb8, 0x78, 0x4d, 0xfa, 0x85, 0x85, 0x57, 0x17, 0xc6, 0x93, 0x61, 0x41, 0x46, 0x6c, 0x22, 0xe2, 0x7e, 0x8f, 0x69, - 0x93, 0x6e, 0x9e, 0x43, 0x66, 0x63, 0xba, 0xb5, 0xd4, 0x1a, 0xc6, 0xb2, 0xc1, 0xd5, 0x13, 0xe2, 0x0a, 0xdd, 0xc4, 0x5a, 0x5a, 0xe5, 0x11, 0xcd, 0xe9, 0xda, 0xde, 0x64, 0x5e, 0x6e, 0xad, 0xc4, - 0xd1, 0xc6, 0x07, 0xd8, 0x16, 0x2b, 0xbb, 0x35, 0xc8, 0xcf, 0x8d, 0x11, 0xcc, 0x50, 0x5d, 0x6c, 0x53, 0xdc, 0xca, 0x67, 0xb2, 0x7c, 0x46, 0x53, 0x5b, 0xfe, 0x44, 0x14, 0xcf, 0xdb, 0x10, 0x7e, - 0x31, 0x8e, 0xab, 0xc8, 0xb0, 0xff, 0xc8, 0xf0, 0x1f, 0x36, 0x4f, 0x93, 0xca, 0x7c, 0x5c, 0x5a, 0xf5, 0x0c, 0x90, 0xe8, 0x99, 0xe2, 0x79, 0x20, 0x2a, 0xd3, 0x1b, 0x0a, 0x22, 0xba, 0x27, 0x5b, - 0x42, 0xed, 0x26, 0xca, 0xa6, 0x14, 0xb6, 0x72, 0xb9, 0xcc, 0x46, 0x1c, 0x88, 0x00, 0xc5, 0x9a, 0xce, 0x35, 0x6a, 0xc3, 0xb6, 0x0d, 0x6d, 0x66, 0xd5, 0x56, 0x84, 0x4d, 0x14, 0xd9, 0xd8, 0x20, - 0x02, 0x4c, 0x0b, 0x3b, 0x0f, 0x24, 0x72, 0xd9, 0x97, 0x81, 0xdc, 0x63, 0x8b, 0xd3, 0xca, 0xee, 0xa7, 0x34, 0xe0, 0x85, 0x76, 0x37, 0xd3, 0x14, 0x92, 0xd9, 0x34, 0xcd, 0x51, 0x6d, 0xa6, 0xe1, - 0xf3, 0xbe, 0x99, 0x38, 0x49, 0xdf, 0x74, 0x22, 0xf0, 0x2e, 0x22, 0xf9, 0x27, 0x8d, 0xe4, 0x85, 0xa9, 0x6f, 0xbc, 0x3c, 0xab, 0x25, 0xef, 0x17, 0x86, 0x95, 0xb8, 0x9d, 0x13, 0xa4, 0x62, 0xbb, - 0x09, 0x6f, 0x86, 0xf4, 0xcf, 0xd3, 0x8d, 0xaf, 0x28, 0xbf, 0x8c, 0xcb, 0xc7, 0xf3, 0xc1, 0xe9, 0xc5, 0x90, 0xa8, 0x14, 0x33, 0xa4, 0x3c, 0xe4, 0xcb, 0x62, 0xc3, 0x9c, 0x56, 0xa7, 0x9e, 0x5d, - 0x8c, 0x9a, 0xe9, 0x02, 0x9e, 0x77, 0xad, 0xa3, 0x31, 0x09, 0xaa, 0x76, 0x2b, 0x13, 0x4d, 0x17, 0x9b, 0xd1, 0x68, 0xc1, 0x05, 0x71, 0x06, 0xb2, 0xab, 0x2d, 0x36, 0x55, 0x10, 0x0e, 0xb7, 0x00, - 0xc0, 0x5d, 0xe7, 0x8b, 0x75, 0xd3, 0xa1, 0xf0, 0xd4, 0x48, 0x2a, 0xd1, 0x2e, 0xcc, 0x17, 0xdd, 0x53, 0x1d, 0x7d, 0x9b, 0x56, 0xf1, 0x9d, 0x80, 0x0f, 0x61, 0x6b, 0x31, 0x7e, 0xfd, 0xc2, 0x3d, - 0x86, 0x4e, 0x9f, 0x2a, 0x43, 0x78, 0xa5, 0xf9, 0xc2, 0xca, 0xcb, 0xd1, 0x78, 0x3a, 0xac, 0xf8, 0xc0, 0x13, 0xc3, 0x12, 0x3f, 0xce, 0xa8, 0xb9, 0x2c, 0x31, 0x0e, 0x88, 0x70, 0xf0, 0x04, 0xe9, - 0xca, 0xcd, 0x01, 0xb1, 0x58, 0x83, 0xe1, 0x99, 0x7c, 0x96, 0x4d, 0xb3, 0x25, 0xbb, 0x57, 0x0f, 0x53, 0x8d, 0x3d, 0x84, 0x50, 0x8f, 0x37, 0x87, 0xd8, 0xdd, 0xe6, 0x88, 0x20, 0x4d, 0xda, 0xa8, - 0xf2, 0x89, 0x04, 0x9e, 0xe9, 0x6d, 0x21, 0xf0, 0xed, 0xb2, 0x0f, 0x74, 0x67, 0xa3, 0xfa, 0x7b, 0x32, 0x81, 0x16, 0x7f, 0xe0, 0xdf, 0xca, 0xdf, 0x7c, 0x8f, 0x37, 0x81, 0x4a, 0x33, 0xb7, 0xf5, - 0xd2, 0xbe, 0xda, 0xf6, 0xa1, 0xdb, 0xcf, 0xbc, 0x77, 0xe1, 0x46, 0x3f, 0x45, 0x4d, 0xf5, 0x93, 0x3d, 0xb6, 0xf3, 0x3c, 0xc9, 0xdf, 0xbf, 0x79, 0x75, 0xff, 0x6e, 0xd5, 0xce, 0x8b, 0x62, 0x31, - 0xf9, 0x09, 0xe1, 0x1f, 0x3f, 0xd8, 0xbd, 0x2f, 0x42, 0x77, 0x12, 0x2c, 0x3e, 0x9b, 0x04, 0xef, 0x23, 0xfd, 0x97, 0xe5, 0x17, 0x25, 0xf0, 0x8a, 0xb0, 0xf6, 0xff, 0x7c, 0xfa, 0xc4, 0xb8, 0x30, - 0x73, 0xff, 0x32, 0xbd, 0xdf, 0x3e, 0xf8, 0x7a, 0xe9, 0xc1, 0xe7, 0xcb, 0x5c, 0x8f, 0x8b, 0xd4, 0x0f, 0xed, 0x71, 0x12, 0x87, 0xdd, 0xd5, 0xf7, 0xde, 0x6f, 0x7d, 0xfe, 0xea, 0xc3, 0xa7, 0x8c, - 0x2d, 0x3b, 0xcd, 0x6d, 0x53, 0x2f, 0x6d, 0xeb, 0x39, 0x30, 0x97, 0xfb, 0xbb, 0xc1, 0x6d, 0xa4, 0xf1, 0xb3, 0x97, 0xe7, 0xd7, 0x2f, 0xfa, 0x5f, 0xff, 0x13, 0xfe, 0x89, 0x0f, 0x9a, 0x3d, 0x8f, - 0x32, 0xff, 0xc0, 0x9f, 0xf0, 0x53, 0xaa, 0x4e, 0x61, 0x9d, 0xa7, 0x8d, 0x35, 0xbe, 0x10, 0xf8, 0x7e, 0xce, 0x14, 0xf4, 0xa8, 0x20, 0x20, 0x00, 0xd6, 0x39, 0x54, 0x96, 0x3d, 0x3f, 0xa2, 0xe8, - 0xb2, 0xb4, 0xd0, 0x36, 0x25, 0x79, 0x43, 0x5d, 0xec, 0xe3, 0x84, 0xdb, 0xb2, 0x27, 0x20, 0x21, 0x4e, 0x14, 0x31, 0x3f, 0xc1, 0x48, 0x10, 0x06, 0xb6, 0xcc, 0xef, 0x83, 0xa2, 0x5d, 0xac, 0x22, - 0x21, 0x3a, 0x6c, 0xaa, 0x8d, 0xc2, 0x4f, 0x8b, 0x46, 0x2e, 0x21, 0x03, 0xf3, 0x35, 0x47, 0xd5, 0x14, 0x53, 0xf1, 0xff, 0x00, 0xf2, 0xef, 0x3f, 0x5f, 0xde, 0xe0, 0x9a, 0x99, 0x7f, 0xa3, 0x3f, - 0x89, 0xdb, 0x54, 0xd0, 0xd0, 0x8f, 0xcb, 0xd7, 0x36, 0x84, 0xa5, 0x9d, 0x8f, 0xcf, 0x5d, 0xf8, 0xbb, 0xfb, 0x93, 0xcd, 0x0d, 0x13, 0xc3, 0xb8, 0xdc, 0x83, 0xa0, 0xcf, 0x19, 0x08, 0x49, 0x73, - 0xbe, 0x35, 0xbd, 0x35, 0xb0, 0xcf, 0x80, 0xbf, 0x76, 0xeb, 0x17, 0x65, 0xf1, 0xd7, 0x5d, 0xcf, 0xf1, 0x75, 0x23, 0xb4, 0x87, 0x4a, 0xc4, 0x9d, 0x79, 0x64, 0xbd, 0x0b, 0xad, 0x19, 0xfa, 0x4f, - 0x89, 0x28, 0xfa, 0x13, 0x1a, 0xd2, 0x56, 0xb6, 0x2c, 0x42, 0xdf, 0x78, 0xe8, 0xed, 0x83, 0x9e, 0x13, 0xb0, 0xd0, 0x37, 0xce, 0x22, 0x16, 0xfa, 0xc6, 0xf8, 0x42, 0xe4, 0x7b, 0x21, 0xd3, 0x62, - 0x1f, 0x99, 0xf0, 0xeb, 0x3e, 0x70, 0xb9, 0xbc, 0xb1, 0xeb, 0xae, 0x60, 0x15, 0x6a, 0x96, 0x97, 0x1b, 0x3a, 0x15, 0xeb, 0xce, 0x26, 0xfa, 0x1d, 0x00, 0xce, 0xd1, 0x79, 0x77, 0x88, 0x51, 0x44, - 0xc4, 0x01, 0x3c, 0xab, 0xa5, 0x46, 0xf4, 0xa6, 0x24, 0x73, 0x62, 0xed, 0xc6, 0xe0, 0xaa, 0x70, 0x17, 0x97, 0x86, 0xef, 0x46, 0xa6, 0x82, 0xe7, 0x96, 0x86, 0x90, 0x7c, 0x32, 0x6d, 0xe4, 0xd5, - 0xef, 0x7b, 0xf4, 0x2e, 0x62, 0x63, 0x26, 0xb1, 0xe3, 0xbb, 0x17, 0x99, 0xf9, 0x0a, 0x06, 0x02, 0x22, 0x9e, 0x51, 0xce, 0xee, 0x3e, 0xe3, 0x95, 0x61, 0x9f, 0x6f, 0x8c, 0x2f, 0x8f, 0xf9, 0x9e, - 0x83, 0xad, 0xd8, 0x4c, 0x45, 0x97, 0x17, 0x37, 0x0c, 0xe2, 0xaf, 0xe5, 0x36, 0x5a, 0xe3, 0xf4, 0x3e, 0x1f, 0xcd, 0x75, 0x60, 0xdb, 0xe7, 0xb5, 0xc3, 0x96, 0xc1, 0xa2, 0x9c, 0x6c, 0xc8, 0x10, - 0x83, 0xdc, 0x13, 0xac, 0x92, 0x0c, 0x40, 0x93, 0xd3, 0x13, 0xa5, 0xc9, 0x41, 0x3d, 0x6a, 0xbb, 0xa5, 0x0a, 0xe5, 0x6a, 0x19, 0xeb, 0xdd, 0xc6, 0xe6, 0xd4, 0xdd, 0x8a, 0x34, 0x39, 0x8d, 0x38, - 0x42, 0x78, 0x4c, 0x7f, 0xb7, 0xb5, 0xdd, 0x91, 0xdd, 0xbb, 0x2f, 0x61, 0x7a, 0xb6, 0x79, 0x46, 0x1d, 0x7c, 0xd1, 0xcb, 0xce, 0x27, 0xcf, 0x48, 0x35, 0x3a, 0x34, 0x44, 0x52, 0x54, 0xa5, 0x1f, - 0x3e, 0xd6, 0xe1, 0xe0, 0xa7, 0x94, 0xea, 0x0b, 0xd1, 0xf3, 0x40, 0x9d, 0x8f, 0xc6, 0x17, 0x42, 0xdf, 0x8f, 0x4c, 0xc4, 0xae, 0xd7, 0x88, 0xaf, 0x6a, 0x9b, 0x11, 0xa2, 0x2e, 0xb0, 0x76, 0x33, - 0x39, 0x81, 0xe2, 0xdc, 0x5b, 0xcb, 0x2a, 0xb9, 0x16, 0x49, 0xaa, 0x06, 0x46, 0xf2, 0x69, 0x2e, 0xa4, 0x81, 0xbc, 0x6f, 0xdb, 0x16, 0xc6, 0xd7, 0x6b, 0x99, 0x8c, 0xa2, 0x19, 0x06, 0xce, 0xa6, - 0xa9, 0x2b, 0xa8, 0x35, 0xe7, 0x13, 0xcc, 0xda, 0x93, 0x39, 0x71, 0x1e, 0x05, 0xa4, 0x2c, 0xf6, 0x05, 0xbc, 0xc7, 0x05, 0x48, 0x78, 0x7e, 0x01, 0x7d, 0x9b, 0xf3, 0x2f, 0x8a, 0xc1, 0x33, 0x8d, - 0x03, 0x7f, 0xdc, 0x81, 0x35, 0xff, 0xdd, 0xad, 0x8f, 0x78, 0x6b, 0x10, 0xf4, 0x03, 0xf9, 0x09, 0xff, 0x04, 0xc7, 0x96, 0x5d, 0xbf, 0x9f, 0x23, 0x37, 0xe7, 0xe8, 0xcd, 0xf9, 0xe4, 0xe6, 0x1c, - 0xbb, 0x73, 0x6e, 0xd8, 0xa5, 0xfe, 0x7e, 0x01, 0xbf, 0xf9, 0x00, 0xfe, 0xfa, 0x81, 0x21, 0x92, 0xd4, 0xa5, 0xf6, 0xbb, 0xf0, 0xde, 0xdf, 0x85, 0x9f, 0x09, 0xb0, 0xfd, 0x22, 0xfb, 0xd6, 0xe7, - 0xeb, 0x7c, 0x32, 0x06, 0x87, 0x85, 0xdb, 0xb4, 0xd0, 0x56, 0x13, 0x73, 0x5a, 0x35, 0x8c, 0x96, 0x05, 0xfb, 0x46, 0xd3, 0x55, 0xe5, 0x38, 0x8b, 0x7a, 0xce, 0x5c, 0x1c, 0x27, 0xc4, 0x84, 0x90, - 0x66, 0x70, 0x5d, 0xb7, 0x90, 0x9a, 0x4f, 0xda, 0xa5, 0xe9, 0xb7, 0xda, 0x52, 0x1c, 0x11, 0x9b, 0x78, 0x41, 0xbb, 0x72, 0x1a, 0xaa, 0x08, 0x58, 0x15, 0x58, 0x69, 0x67, 0x56, 0x58, 0x9c, 0x16, - 0x4e, 0x35, 0xd2, 0x6d, 0x74, 0x8d, 0x4f, 0x85, 0xe4, 0x0f, 0x30, 0x5f, 0xd2, 0xdc, 0x0e, 0x2b, 0xcb, 0x1e, 0x87, 0xc5, 0xab, 0x54, 0x3d, 0xd3, 0x9d, 0xe8, 0x07, 0xf8, 0x73, 0xa0, 0xb9, 0xfc, - 0x6d, 0xe3, 0x35, 0xe2, 0x99, 0x5d, 0xeb, 0x41, 0xe3, 0x35, 0x62, 0xc8, 0xe6, 0x85, 0x5a, 0x46, 0xbf, 0xec, 0xb3, 0x3a, 0x28, 0x5d, 0x9f, 0x9b, 0xe4, 0x0d, 0x74, 0x9a, 0xe4, 0x73, 0xb6, 0x24, - 0x67, 0xfc, 0x3a, 0xb2, 0x2a, 0xcb, 0x63, 0x3a, 0x72, 0xae, 0x07, 0x3c, 0x08, 0x39, 0xf3, 0xce, 0xd3, 0x67, 0x4b, 0xaf, 0x48, 0xd6, 0x7c, 0x87, 0x75, 0xf8, 0x68, 0xc9, 0x4f, 0x91, 0xa5, 0x93, - 0x2e, 0xca, 0xe6, 0x30, 0xf5, 0x33, 0x1f, 0x3f, 0xd1, 0xa3, 0xb6, 0x59, 0x7b, 0x52, 0xc1, 0xaf, 0xbe, 0x9b, 0xe0, 0xff, 0x84, 0x69, 0xf6, 0x71, 0x5e, 0xde, 0xe3, 0x25, 0xfa, 0x13, 0x7e, 0x22, - 0x0d, 0xf1, 0x17, 0xd9, 0x57, 0x66, 0xbe, 0x6a, 0xdd, 0x67, 0x6a, 0xdf, 0x73, 0x73, 0x37, 0xb2, 0xeb, 0xf0, 0xc0, 0x1e, 0x63, 0xe9, 0xa4, 0xf7, 0x84, 0x22, 0x93, 0x55, 0xab, 0xcc, 0xa6, 0x70, - 0x77, 0x24, 0xc5, 0xa4, 0xcc, 0x27, 0xec, 0x68, 0xef, 0x49, 0xb8, 0x41, 0x23, 0xde, 0x51, 0x8d, 0xad, 0x76, 0x52, 0x32, 0x82, 0x0e, 0x39, 0x15, 0xe5, 0xda, 0xdb, 0xa0, 0x9d, 0xf5, 0x1c, 0x24, - 0xfb, 0xfc, 0x64, 0xd9, 0xd7, 0xba, 0xb5, 0xd4, 0x94, 0x9d, 0xed, 0x54, 0x55, 0x73, 0xa4, 0xe4, 0x27, 0x36, 0x32, 0xf3, 0x6d, 0xbf, 0x7a, 0x39, 0xfc, 0x7f, 0x3e, 0xde, 0x29, 0xec, 0xfc, 0x03, - 0x8c, 0xce, 0xfb, 0xf9, 0xef, 0x8a, 0x3c, 0x3a, 0xd0, 0x91, 0x5b, 0xc5, 0x46, 0xd2, 0x8e, 0xd3, 0xdc, 0x8f, 0xfc, 0xd2, 0xff, 0xa2, 0xff, 0xc6, 0x33, 0x30, 0xe0, 0x37, 0xb4, 0x81, 0xf1, 0xed, - 0x95, 0x73, 0x48, 0x76, 0x40, 0x3c, 0x05, 0x83, 0x52, 0x31, 0xa4, 0xe8, 0xa9, 0x37, 0x81, 0x76, 0x49, 0x6e, 0x77, 0x2b, 0x90, 0x94, 0x6d, 0xdf, 0xb2, 0x39, 0x84, 0xa3, 0xd7, 0xdc, 0x3a, 0xf6, - 0xb0, 0xd1, 0x6e, 0xba, 0x01, 0x09, 0x04, 0x81, 0xfc, 0x34, 0xc3, 0x24, 0x42, 0x58, 0x68, 0xc7, 0x83, 0x9f, 0x89, 0x58, 0x0c, 0x94, 0x06, 0xdb, 0xa2, 0xc5, 0x64, 0x39, 0xad, 0x64, 0xcf, 0xec, - 0x6c, 0x8c, 0xcc, 0x8d, 0x93, 0xdf, 0x9f, 0x48, 0xfa, 0xf9, 0x35, 0xe9, 0x9b, 0xaa, 0x0f, 0x4f, 0x2f, 0xc6, 0x86, 0xef, 0xfa, 0x6f, 0x4d, 0xf1, 0xee, 0x7e, 0xa0, 0xe8, 0x22, 0x23, 0x09, 0x7f, - 0x7d, 0xe0, 0xca, 0xc2, 0x68, 0x3c, 0xdf, 0xf4, 0xc6, 0x46, 0xd2, 0xda, 0xd6, 0xd5, 0xd0, 0xbc, 0xd1, 0xfa, 0x24, 0x0c, 0xff, 0xf2, 0xda, 0x91, 0x2a, 0xb6, 0x6c, 0xa7, 0xd0, 0x9d, 0x47, 0x02, - 0x02, 0x5f, 0x85, 0x27, 0x87, 0x0b, 0xc8, 0x2b, 0xd5, 0xb3, 0x68, 0xbc, 0x1e, 0x9f, 0xe1, 0x30, 0x27, 0xdf, 0x0b, 0xc5, 0xbe, 0x15, 0x78, 0x2a, 0x2f, 0x0a, 0x92, 0x23, 0x94, 0xad, 0x28, 0x67, - 0xfc, 0x64, 0x1e, 0x15, 0xc1, 0x2e, 0x2f, 0x6a, 0x74, 0x46, 0x68, 0x10, 0xbc, 0x42, 0x67, 0x39, 0xe9, 0xfb, 0x7a, 0x57, 0x23, 0x74, 0xd7, 0x31, 0xc8, 0x31, 0x5c, 0xba, 0x58, 0xd7, 0x15, 0x55, - 0xb5, 0x3d, 0x58, 0xc7, 0x62, 0xd7, 0x23, 0xca, 0xda, 0x54, 0x5c, 0xd8, 0xb1, 0x00, 0x40, 0x0d, 0x2c, 0x94, 0x62, 0x77, 0x90, 0xff, 0xdb, 0x75, 0xd7, 0xef, 0x69, 0x19, 0xf7, 0x97, 0xb8, 0x67, - 0x36, 0xf0, 0x0b, 0xc9, 0x17, 0x96, 0x9c, 0x0f, 0xc6, 0xe8, 0xb0, 0x8d, 0x9b, 0x04, 0x3b, 0x59, 0xe9, 0x0f, 0x96, 0x4a, 0x51, 0xf1, 0x34, 0x1e, 0x2d, 0xd0, 0x11, 0xe3, 0xa1, 0xdd, 0x92, 0x2e, - 0x39, 0xc9, 0xd4, 0x57, 0x45, 0x74, 0x20, 0xe9, 0x42, 0xd9, 0x32, 0x84, 0x0b, 0x08, 0x76, 0xb0, 0x26, 0x13, 0x6b, 0x23, 0xc1, 0x4b, 0xd6, 0xe1, 0x11, 0x83, 0xc3, 0x03, 0xb5, 0x90, 0xb5, 0xd8, - 0x4a, 0x52, 0x05, 0x17, 0x96, 0xda, 0xde, 0x3a, 0x64, 0x26, 0xe4, 0x04, 0xd1, 0x0e, 0x1b, 0x08, 0x9b, 0x93, 0x56, 0x71, 0x67, 0xbe, 0xae, 0x3d, 0xaf, 0x40, 0x00, 0x03, 0x64, 0xaa, 0xf4, 0x1f, - 0xa1, 0x4e, 0x9e, 0x2b, 0xef, 0x9f, 0x90, 0xa7, 0xd2, 0x0f, 0x5f, 0xf8, 0x56, 0xfa, 0xe1, 0xf8, 0x42, 0xe2, 0x7b, 0xb6, 0x9d, 0x8e, 0x0e, 0xb0, 0xc6, 0xbc, 0xf9, 0x32, 0xdf, 0xb3, 0x4b, 0x4c, - 0xcb, 0x84, 0x85, 0xea, 0xfb, 0x9c, 0x3e, 0xc2, 0xa7, 0xcd, 0x1c, 0xa0, 0x09, 0x69, 0xc4, 0x53, 0xfc, 0x6c, 0x6f, 0x86, 0xa7, 0xce, 0x45, 0x0c, 0xd4, 0x82, 0x4f, 0x78, 0x01, 0x4a, 0x8c, 0x9d, - 0xf2, 0x81, 0x3f, 0x23, 0xcd, 0x91, 0x2e, 0x23, 0x3c, 0x24, 0xce, 0x3a, 0x76, 0x83, 0xa7, 0x98, 0x6a, 0x6e, 0x0e, 0xd8, 0x26, 0xca, 0x6f, 0xd3, 0x06, 0x1f, 0xc6, 0x01, 0x3e, 0xc4, 0xff, 0xcf, - 0x19, 0x3f, 0xd7, 0xd9, 0x01, 0xc5, 0x58, 0xcf, 0xdd, 0x2a, 0xb2, 0x3f, 0x2e, 0x24, 0xb7, 0x19, 0x02, 0xae, 0x1d, 0xdb, 0xb9, 0x5e, 0x26, 0xf9, 0xf8, 0x2d, 0x45, 0xe1, 0xfd, 0xa3, 0xf8, 0xcd, - 0x47, 0x5f, 0x76, 0x4b, 0x6b, 0xac, 0xe7, 0xb9, 0xfe, 0xea, 0x8f, 0xb8, 0xad, 0xc9, 0xb8, 0x2c, 0x3b, 0xf7, 0x3e, 0x36, 0x24, 0x0a, 0x54, 0x55, 0xfe, 0x23, 0x77, 0x12, 0xf1, 0x13, 0x79, 0x66, - 0xfb, 0xa8, 0x7c, 0xeb, 0x65, 0x34, 0x2b, 0xdf, 0x1a, 0x9f, 0x29, 0x7c, 0x3f, 0x98, 0x23, 0xfe, 0x50, 0xc0, 0x92, 0xcd, 0xed, 0xbb, 0x11, 0xb3, 0x5f, 0x08, 0xf3, 0x68, 0xda, 0xc6, 0x31, 0xc6, - 0x52, 0x74, 0x0a, 0x86, 0xb8, 0x44, 0xd2, 0x78, 0x14, 0x12, 0xfd, 0x46, 0x8d, 0x56, 0xa3, 0x29, 0x22, 0x4d, 0xf8, 0x05, 0xc8, 0x27, 0xe6, 0x3c, 0x8f, 0x9b, 0x93, 0x72, 0xd2, 0x76, 0x0b, 0xde, - 0xd7, 0x10, 0xc0, 0x49, 0x29, 0x4c, 0x77, 0xb6, 0x04, 0xed, 0x19, 0x80, 0xdb, 0xe3, 0x32, 0x6e, 0x5f, 0xcd, 0x81, 0x4f, 0x7b, 0xf9, 0xeb, 0x6b, 0xbf, 0xbb, 0x01, 0x2f, 0x7c, 0xf8, 0x9e, 0x5d, - 0x35, 0x31, 0x36, 0x93, 0xe8, 0xec, 0x77, 0x7c, 0x83, 0x8e, 0xbe, 0xbf, 0xb0, 0x3e, 0x13, 0x98, 0xbe, 0x25, 0x0e, 0x8c, 0x3f, 0x5d, 0x1a, 0x1a, 0x9e, 0x0e, 0x89, 0x90, 0x9a, 0x47, 0x1b, 0x73, - 0x73, 0x38, 0x7a, 0x68, 0x6c, 0x54, 0x31, 0x7f, 0xac, 0x25, 0x6a, 0x65, 0x4e, 0xd2, 0x1a, 0x1f, 0xc9, 0x54, 0xa3, 0x13, 0x19, 0xb0, 0xb1, 0xd4, 0x96, 0xa8, 0xf0, 0xb0, 0xd8, 0xd7, 0x22, 0xbd, - 0x8e, 0xd2, 0xc4, 0x5a, 0xcd, 0x56, 0x7c, 0x73, 0x9a, 0x79, 0x2b, 0x0a, 0x00, 0xac, 0xc5, 0x01, 0x25, 0xd6, 0xd5, 0x72, 0x1e, 0x05, 0xa5, 0x85, 0xca, 0x3b, 0x9f, 0xce, 0x7f, 0x7b, 0x99, 0xfd, - 0xa6, 0x9b, 0xf5, 0x7d, 0x53, 0xfc, 0x99, 0xfa, 0xd5, 0xaf, 0x1e, 0xf4, 0xc2, 0xc5, 0x2f, 0x6e, 0x9f, 0x83, 0x2d, 0x03, 0x74, 0x50, 0x3a, 0x5d, 0x47, 0xb0, 0xea, 0x03, 0x2d, 0x8f, 0x03, 0xac, - 0xb4, 0xa6, 0xca, 0xf4, 0xd8, 0x26, 0xf2, 0x9e, 0xf4, 0x8e, 0xd3, 0x23, 0x78, 0xca, 0xca, 0xce, 0x65, 0x08, 0x8d, 0x72, 0x79, 0x89, 0x38, 0x86, 0x74, 0xdc, 0x56, 0x52, 0xb4, 0xf7, 0x82, 0x09, - 0x86, 0x05, 0x84, 0xc3, 0xa3, 0x54, 0x85, 0x00, 0xab, 0xc8, 0xf0, 0x0a, 0x3a, 0xc1, 0x1d, 0x73, 0xb6, 0xca, 0xd0, 0x62, 0xea, 0xc1, 0xf8, 0xfc, 0x79, 0x6d, 0xe6, 0x06, 0xcf, 0xe9, 0x11, 0x36, - 0xd1, 0x17, 0x30, 0x46, 0xdf, 0x0b, 0xfb, 0x79, 0x65, 0xf9, 0x42, 0x75, 0xf8, 0xfd, 0xc5, 0xe1, 0x4c, 0x11, 0x18, 0x5f, 0xfe, 0x0f, 0x6d, 0x87, 0x47, 0x6e, 0x96, 0x88, 0x12, 0x42, 0xca, 0x1e, - 0x11, 0xeb, 0x10, 0x07, 0x43, 0xa4, 0xcb, 0x90, 0x03, 0x86, 0xfa, 0x23, 0xbd, 0x49, 0x1b, 0x2d, 0x2b, 0x18, 0xf2, 0xb0, 0x3f, 0x9d, 0x32, 0xae, 0x8c, 0x0d, 0xcd, 0xcd, 0x39, 0x7a, 0xd4, 0x05, - 0x78, 0xee, 0xed, 0xc1, 0x53, 0x35, 0xa7, 0xdb, 0x7e, 0xa5, 0x1f, 0x34, 0x26, 0x98, 0xef, 0x27, 0x89, 0xab, 0xa7, 0x6b, 0x9e, 0x9b, 0xaf, 0x79, 0x2e, 0xf0, 0x8d, 0xef, 0x6c, 0xa9, 0xaf, 0xc2, - 0xc0, 0x76, 0x6b, 0xbf, 0xaf, 0xfd, 0x43, 0xbc, 0xb7, 0xe7, 0x80, 0xc5, 0x1b, 0x33, 0xdf, 0xe3, 0x90, 0xaf, 0x57, 0x3e, 0x7d, 0xfd, 0x3b, 0xab, 0x78, 0x88, 0x19, 0xf7, 0x48, 0x15, 0xfd, 0xe7, - 0xac, 0x84, 0xbb, 0x4f, 0x78, 0x1f, 0xd9, 0x9b, 0xeb, 0x43, 0x2d, 0x06, 0xa3, 0x39, 0x5a, 0x35, 0x38, 0x5b, 0x6f, 0xd2, 0x34, 0x5c, 0x1c, 0xe0, 0xf5, 0x51, 0xd6, 0x30, 0xa5, 0xee, 0x2a, 0x1e, - 0x4f, 0x82, 0x20, 0xc7, 0xc3, 0xe6, 0xe4, 0x62, 0x51, 0x08, 0xe6, 0xc9, 0xb2, 0x9b, 0x1e, 0xec, 0x6a, 0x9b, 0xe3, 0xab, 0x2d, 0x82, 0xc3, 0x59, 0xc8, 0xef, 0x21, 0x42, 0x95, 0x0e, 0xbd, 0x7b, - 0x58, 0x4f, 0x7b, 0x9f, 0x31, 0xed, 0x7c, 0x9f, 0x1d, 0x85, 0x68, 0x1e, 0x4f, 0x77, 0xfc, 0x77, 0x76, 0xde, 0x97, 0x01, 0xff, 0x8b, 0x45, 0xf0, 0xbe, 0x39, 0x43, 0x37, 0x9b, 0xb3, 0x91, 0x24, - 0xa1, 0xad, 0xc7, 0xe3, 0x4b, 0xe2, 0xde, 0x5f, 0x77, 0x83, 0x72, 0xef, 0x69, 0x03, 0xd7, 0x9f, 0xfa, 0xac, 0x14, 0x7c, 0xc8, 0x23, 0xfe, 0x94, 0x37, 0xe8, 0xbf, 0xd9, 0x1e, 0x7f, 0xfd, 0x32, - 0x3d, 0x3e, 0x49, 0xce, 0xbf, 0xdc, 0x9e, 0xb8, 0xa7, 0x6a, 0xdc, 0x17, 0x29, 0xe8, 0xe7, 0xef, 0x23, 0xfb, 0x7d, 0xa2, 0xfe, 0x2e, 0x4e, 0x1f, 0xae, 0x8d, 0xcf, 0xb4, 0xbf, 0x17, 0xa5, 0x66, - 0x6a, 0xa2, 0xed, 0xa9, 0xc5, 0x22, 0xd1, 0xb7, 0x9a, 0x14, 0x87, 0x08, 0xd0, 0x3c, 0x1d, 0xf6, 0x0e, 0x17, 0xd5, 0x6d, 0x1a, 0x84, 0xc7, 0x6a, 0x59, 0x59, 0x7c, 0x49, 0x3b, 0x28, 0x0f, 0x94, - 0xca, 0x4c, 0x25, 0x89, 0xdd, 0xca, 0xd0, 0xe0, 0x49, 0x76, 0x4c, 0x66, 0x45, 0x5e, 0x32, 0xd5, 0x81, 0x8f, 0x99, 0x06, 0x49, 0x75, 0x70, 0xa6, 0xb9, 0x06, 0xb3, 0x96, 0x49, 0x02, 0x98, 0x9b, - 0xf6, 0x40, 0x05, 0x51, 0xaf, 0x75, 0x3f, 0x3c, 0xe7, 0xcc, 0x7d, 0xf8, 0xe1, 0xc5, 0xfd, 0x81, 0xfd, 0xc6, 0x2a, 0xfd, 0x98, 0xdf, 0xfa, 0x5f, 0x9f, 0xf2, 0x5b, 0xdd, 0x24, 0xb5, 0xee, 0xcb, - 0xe6, 0x8b, 0xb1, 0x5a, 0x26, 0x17, 0x89, 0x2a, 0xf5, 0x5f, 0x42, 0x75, 0x2b, 0x99, 0xf7, 0xd4, 0xc6, 0xdf, 0x6e, 0xf6, 0xfe, 0x7f, 0x0c, 0x19, 0xa5, 0x49, 0x72, 0x6b, 0xdc, 0xe4, 0x0f, 0xd1, - 0x3b, 0xa1, 0xa7, 0xa0, 0x92, 0xde, 0xa9, 0xbe, 0xc8, 0xdf, 0xdb, 0xf1, 0x19, 0x27, 0x67, 0x40, 0xee, 0x35, 0xdb, 0x03, 0x51, 0xce, 0x37, 0x7e, 0xc9, 0xcb, 0x1e, 0xc0, 0xaa, 0xb3, 0x92, 0x03, - 0x76, 0x0a, 0x30, 0xd9, 0xb1, 0xa3, 0xce, 0xa5, 0x31, 0x7a, 0x87, 0x47, 0x87, 0xf5, 0x71, 0x56, 0xb2, 0x42, 0x6e, 0x14, 0x84, 0x8a, 0x87, 0xb5, 0xb8, 0xc5, 0x5a, 0x07, 0x9f, 0xaf, 0xd6, 0xdc, - 0x02, 0xac, 0xf6, 0xd0, 0x7a, 0x45, 0x85, 0x20, 0x8b, 0x83, 0x90, 0x8b, 0x1c, 0x99, 0xaa, 0x18, 0x45, 0xd5, 0x7c, 0x52, 0x7f, 0x97, 0xb3, 0xf4, 0x4f, 0x61, 0x77, 0xbe, 0xbc, 0x68, 0xfa, 0x78, - 0x52, 0x3f, 0xb5, 0x4f, 0x9c, 0x49, 0xbe, 0x70, 0xf2, 0x7c, 0x30, 0x64, 0x27, 0x80, 0xc6, 0xe5, 0x56, 0x9a, 0x06, 0x3d, 0x4e, 0x66, 0x81, 0xd6, 0xf2, 0xa7, 0xc3, 0xa2, 0x9e, 0x81, 0x12, 0x5f, - 0x71, 0xeb, 0x32, 0x25, 0x7e, 0x53, 0x03, 0x6d, 0xcb, 0xc7, 0x40, 0x39, 0xe8, 0x53, 0x2f, 0x74, 0xa6, 0x08, 0x8c, 0x2f, 0xff, 0xcf, 0xb0, 0xca, 0x03, 0x36, 0xb6, 0xcd, 0xfa, 0xa0, 0x42, 0xfe, - 0x4c, 0x5b, 0x69, 0xaa, 0x3b, 0xd3, 0xe2, 0xa9, 0x2a, 0x07, 0x7e, 0x35, 0xe2, 0xf6, 0x5e, 0xa7, 0x6a, 0x6c, 0x51, 0x3b, 0x29, 0x1e, 0x99, 0xd5, 0x21, 0x9a, 0x5a, 0x5b, 0x75, 0xbd, 0x06, 0x01, - 0x2a, 0x28, 0x73, 0xb5, 0x59, 0xcc, 0x5a, 0x9a, 0x80, 0x81, 0x88, 0xda, 0x1b, 0xe5, 0xa6, 0x60, 0x82, 0xc5, 0x52, 0xb7, 0xc0, 0x66, 0x59, 0x24, 0x16, 0xda, 0xe7, 0xca, 0x6c, 0xfe, 0x3b, 0xbd, - 0x29, 0xc1, 0x41, 0x3d, 0x3c, 0x3b, 0x3d, 0x0c, 0xfd, 0x87, 0x6e, 0xf4, 0xe7, 0x00, 0xa9, 0x5f, 0x69, 0x02, 0xe3, 0xb7, 0xa3, 0xa1, 0x50, 0xd4, 0x48, 0x63, 0x31, 0xbe, 0x75, 0xec, 0xb2, 0x89, - 0x48, 0x82, 0x04, 0xaa, 0x6d, 0xe6, 0xdb, 0x89, 0x92, 0x0a, 0x5b, 0x79, 0x86, 0x34, 0x81, 0x36, 0x0b, 0x97, 0x7b, 0xce, 0xab, 0x22, 0xf8, 0x24, 0x9b, 0x35, 0x80, 0x42, 0xdb, 0x18, 0xb6, 0x23, - 0x09, 0xb4, 0x3a, 0x53, 0xda, 0xa3, 0xd5, 0x51, 0xdb, 0xd8, 0x41, 0xb3, 0xae, 0x5d, 0x6c, 0x5e, 0xd4, 0x86, 0x15, 0xee, 0x36, 0xa3, 0xc5, 0x61, 0x6e, 0x96, 0xf8, 0xd7, 0x4d, 0x15, 0x3b, 0x3d, - 0x77, 0x8b, 0x6f, 0x3a, 0xed, 0xbc, 0x8c, 0xf7, 0xef, 0xef, 0x6d, 0x1f, 0x29, 0x9f, 0x59, 0xf1, 0xeb, 0x74, 0x7c, 0x21, 0xf9, 0x3d, 0x43, 0x3a, 0x08, 0x8a, 0x99, 0x79, 0xa8, 0x2c, 0x77, 0x23, - 0x4a, 0x41, 0x8e, 0xf5, 0xb4, 0xc4, 0x77, 0xeb, 0x70, 0x24, 0x21, 0x9e, 0x22, 0x25, 0xca, 0x54, 0x87, 0xa4, 0xde, 0xee, 0x3d, 0x2f, 0xc4, 0xe4, 0x14, 0x86, 0xdc, 0x15, 0xb0, 0xdc, 0x29, 0x7b, - 0xfc, 0x88, 0x74, 0xd3, 0xf9, 0x5e, 0xf3, 0x2a, 0x95, 0xa4, 0xe0, 0xad, 0x17, 0x3b, 0x23, 0x5a, 0x03, 0xf5, 0xb8, 0xb4, 0xcd, 0x74, 0xd6, 0x6c, 0x45, 0xe2, 0x3b, 0x0b, 0xe4, 0xbb, 0xac, 0x82, - 0x21, 0xcb, 0x4a, 0x17, 0x3f, 0x34, 0xf6, 0x9e, 0x49, 0xf5, 0xea, 0xe2, 0x17, 0x0e, 0xc6, 0x43, 0xd1, 0x65, 0xd5, 0x16, 0xed, 0x5c, 0x66, 0x5f, 0x54, 0xb0, 0x89, 0xfb, 0xc5, 0x62, 0x6f, 0x13, - 0x87, 0x0a, 0x3a, 0x84, 0xd5, 0x2a, 0xca, 0x76, 0x5e, 0x9b, 0xad, 0x61, 0x73, 0xa3, 0xf1, 0xd2, 0x6c, 0x32, 0x33, 0x29, 0x44, 0x72, 0x0c, 0x86, 0x4f, 0x39, 0xdc, 0xa9, 0xc0, 0x03, 0x61, 0x00, - 0x3d, 0x84, 0xa5, 0xda, 0x26, 0x5e, 0xb4, 0xc7, 0x43, 0xbd, 0xf7, 0x2c, 0xc4, 0xf1, 0xc8, 0xc3, 0x94, 0xde, 0x44, 0x14, 0xf6, 0x87, 0x2b, 0xf2, 0x6d, 0x22, 0xc6, 0x7f, 0xbc, 0x72, 0xee, 0xbe, - 0x52, 0xf1, 0xd7, 0x7f, 0x1a, 0xba, 0x61, 0x87, 0xc0, 0x19, 0xc3, 0xce, 0xc9, 0xf5, 0xe8, 0x91, 0x2a, 0x8f, 0xff, 0x84, 0xe0, 0x9f, 0xd0, 0xef, 0x73, 0xf4, 0x13, 0x7d, 0x60, 0xfc, 0xe1, 0x64, - 0xfc, 0x4a, 0xf6, 0x7b, 0x56, 0x1f, 0x4b, 0xa8, 0x4b, 0x2c, 0xb2, 0x85, 0x54, 0xb3, 0xf3, 0x6d, 0x91, 0xdb, 0x9e, 0xf6, 0xb1, 0x8a, 0x7a, 0x62, 0xe6, 0x35, 0x19, 0xee, 0x31, 0x3e, 0x1c, 0x2f, - 0x36, 0xd0, 0xc6, 0x9e, 0x21, 0x73, 0x35, 0x1c, 0x65, 0xf0, 0x46, 0x6a, 0x21, 0x8c, 0x5b, 0x6e, 0xdd, 0x15, 0x38, 0xea, 0x71, 0x2b, 0x8e, 0xdc, 0x5a, 0x9c, 0x4a, 0xe5, 0x32, 0xb4, 0xab, 0xb9, - 0xc2, 0x08, 0xbe, 0xc0, 0x42, 0xb2, 0xb9, 0xfc, 0x4e, 0x42, 0x5f, 0x33, 0xe2, 0x6e, 0x78, 0xfd, 0xfa, 0x4a, 0x9e, 0xef, 0x7a, 0xa1, 0xef, 0x7a, 0x17, 0xad, 0x1b, 0x7f, 0xd9, 0x08, 0x1f, 0x2c, - 0x84, 0x6f, 0x5f, 0xb0, 0xc3, 0xd4, 0xce, 0xc7, 0xaf, 0x1e, 0x83, 0x24, 0x1f, 0xfb, 0x96, 0x1d, 0x7f, 0xd9, 0xfb, 0x03, 0xff, 0x09, 0x3d, 0xe3, 0x2f, 0xfe, 0xfe, 0x79, 0xc0, 0xf8, 0xab, 0xbb, - 0xe3, 0xcb, 0x73, 0xbf, 0x1f, 0x94, 0x1d, 0x52, 0x16, 0x78, 0xcf, 0x6d, 0xab, 0x49, 0xe8, 0xf8, 0xcd, 0x9e, 0xde, 0xed, 0x7b, 0x99, 0x66, 0x96, 0xfc, 0x28, 0x8c, 0xa9, 0xb9, 0x6a, 0xe9, 0x9a, - 0x5b, 0xee, 0xd8, 0x95, 0xbb, 0x31, 0xa0, 0x9c, 0xd1, 0x67, 0x58, 0xc0, 0xe5, 0x25, 0x39, 0x9d, 0x47, 0x73, 0x7c, 0x03, 0x11, 0x4e, 0xa2, 0xad, 0x96, 0x73, 0x42, 0x8d, 0x81, 0x19, 0xe0, 0x61, - 0xfc, 0xca, 0x61, 0xa4, 0x14, 0xb0, 0xa1, 0x15, 0x3a, 0xc4, 0x15, 0x74, 0x67, 0x08, 0xfe, 0x05, 0xfc, 0x7b, 0xa3, 0xfe, 0xc2, 0xad, 0xb7, 0xe3, 0xc1, 0xbc, 0x39, 0x6c, 0x29, 0xa1, 0x69, 0x6b, - 0xe5, 0x30, 0x5f, 0x72, 0x5b, 0x46, 0x27, 0x25, 0x63, 0x72, 0xa2, 0xe9, 0x82, 0x4a, 0x52, 0xda, 0xf2, 0x55, 0xa6, 0xc8, 0x52, 0xbd, 0x4c, 0x11, 0x47, 0x08, 0x97, 0xe8, 0x08, 0x66, 0xa5, 0xed, - 0x49, 0x89, 0xe6, 0xbb, 0x7d, 0xbc, 0xab, 0xba, 0xad, 0x35, 0xa3, 0x26, 0xf3, 0x3d, 0x95, 0x6d, 0xf7, 0x7b, 0xa5, 0x06, 0x7d, 0x03, 0x43, 0xe4, 0x40, 0xc6, 0x2d, 0x85, 0xb4, 0xbe, 0x33, 0x38, - 0xbf, 0x16, 0xd8, 0x2f, 0xe5, 0xef, 0x2c, 0xc2, 0xe8, 0x4d, 0x62, 0xa8, 0xa7, 0x87, 0x97, 0xf6, 0x9d, 0x9f, 0x7a, 0x1f, 0x04, 0x2f, 0x46, 0xc0, 0xc9, 0x7e, 0x85, 0xfa, 0x7d, 0x80, 0x3a, 0xf0, - 0x0d, 0xaa, 0xd6, 0x7b, 0xf7, 0x85, 0x5f, 0x37, 0x3e, 0x25, 0xcf, 0x5c, 0xd9, 0x1e, 0xc3, 0x87, 0xf0, 0x03, 0x7d, 0x60, 0xfc, 0xf1, 0x6c, 0x7c, 0xa6, 0x79, 0x35, 0x7c, 0x3f, 0x1e, 0x8a, 0xb7, - 0x02, 0x1e, 0x97, 0xd8, 0xe9, 0x28, 0x5b, 0x8a, 0x47, 0x1c, 0xba, 0x55, 0x83, 0x6c, 0x39, 0xe3, 0x10, 0x01, 0xd5, 0x88, 0xcf, 0x9c, 0x62, 0xd6, 0xce, 0xd3, 0xbd, 0x00, 0x8a, 0xce, 0xb4, 0xc8, - 0x08, 0xc0, 0x9e, 0xa2, 0xfb, 0xb6, 0x15, 0x52, 0x71, 0xdd, 0x4e, 0x17, 0x32, 0xb4, 0x08, 0x3b, 0xaa, 0x14, 0x76, 0x34, 0x2f, 0x48, 0x23, 0x22, 0x2e, 0xc3, 0x6c, 0xd1, 0xfa, 0xb2, 0x39, 0xca, - 0x27, 0xd9, 0x47, 0xf1, 0xfe, 0x71, 0x7f, 0x18, 0x7f, 0x3c, 0x1c, 0xca, 0xf3, 0x9d, 0x0b, 0x56, 0x85, 0x99, 0xc4, 0xb5, 0x9d, 0xdf, 0xe9, 0x24, 0xf5, 0xe3, 0x7d, 0xfd, 0xf9, 0xf1, 0x71, 0x30, - 0x3e, 0x0c, 0xe7, 0x23, 0x76, 0xc3, 0x37, 0xd5, 0xea, 0xc3, 0xd9, 0x7d, 0x69, 0x3a, 0x31, 0xbe, 0xfc, 0x3f, 0xb7, 0xfb, 0x84, 0x87, 0xb1, 0x98, 0x2b, 0xfd, 0x91, 0x33, 0x0d, 0xd3, 0x15, 0x6f, - 0x36, 0x0b, 0xb4, 0xdc, 0xef, 0x08, 0x40, 0xc8, 0x15, 0xa5, 0x5c, 0x40, 0xee, 0xd1, 0x1f, 0x39, 0xc4, 0x22, 0x0b, 0xbb, 0x99, 0x95, 0x54, 0xb9, 0x1e, 0x9a, 0x8b, 0xfd, 0x42, 0xda, 0x2f, 0xe0, - 0x11, 0xef, 0x52, 0xec, 0xd6, 0x0b, 0x4e, 0x94, 0x31, 0x5a, 0x2e, 0xc8, 0x4d, 0x36, 0x35, 0xaa, 0x63, 0x33, 0x87, 0x5a, 0xf3, 0x24, 0xa9, 0x68, 0x6a, 0x6f, 0x2b, 0xe9, 0x8f, 0x59, 0x7c, 0xdb, - 0x1c, 0xe4, 0xb3, 0x20, 0x9e, 0xd3, 0x3e, 0x4d, 0x3d, 0x7d, 0xc3, 0xa4, 0xba, 0x14, 0xa1, 0xfc, 0x6a, 0x11, 0x31, 0xb9, 0xfd, 0xf4, 0x1d, 0x80, 0x87, 0xc9, 0xd9, 0x95, 0xff, 0xfd, 0xb0, 0xdd, - 0x8c, 0xf7, 0xa3, 0xe1, 0x7b, 0x91, 0x02, 0xe4, 0xb9, 0xe1, 0xfb, 0xf8, 0x84, 0xf3, 0x06, 0xfd, 0xe1, 0x7c, 0x7c, 0xa6, 0x3b, 0x6c, 0x38, 0x25, 0x67, 0xa6, 0x96, 0xd6, 0xa8, 0x5e, 0x58, 0xb3, - 0x72, 0x21, 0x99, 0x14, 0x41, 0x51, 0xdd, 0xa1, 0x84, 0x9c, 0xc3, 0xbe, 0xdd, 0x66, 0x33, 0x7f, 0x0d, 0x9b, 0x5b, 0x1a, 0xeb, 0x69, 0x92, 0xe0, 0x11, 0x33, 0x2d, 0xe6, 0xe4, 0xac, 0x96, 0xdb, - 0x74, 0xda, 0x0b, 0x8c, 0x8b, 0x31, 0xc0, 0x96, 0x65, 0x57, 0x87, 0x99, 0x42, 0x10, 0x80, 0xde, 0x03, 0xcb, 0x8a, 0x66, 0x66, 0x9b, 0x82, 0xdf, 0x19, 0x8c, 0xfb, 0xc7, 0xc3, 0x79, 0x79, 0x9f, - 0xf8, 0xa2, 0xdd, 0xfc, 0x75, 0x05, 0xb7, 0xf8, 0xe3, 0x1b, 0xb6, 0xc7, 0xd7, 0x2a, 0xd1, 0x8f, 0x4f, 0x3c, 0x87, 0xfe, 0x88, 0xe7, 0xf1, 0x9b, 0x46, 0xf4, 0x76, 0x72, 0x76, 0x42, 0x0d, 0xe0, - 0x36, 0x34, 0x4e, 0xa7, 0xe4, 0xce, 0x9f, 0xfa, 0xa6, 0x54, 0xdb, 0x3b, 0x44, 0x5d, 0x76, 0x01, 0x22, 0x2d, 0x39, 0x33, 0x55, 0x6a, 0x4a, 0x7d, 0xc8, 0xaf, 0xbb, 0x2f, 0xfa, 0x01, 0x98, 0xe4, - 0xf1, 0x42, 0x7c, 0xbd, 0xfc, 0x0f, 0x7f, 0xcd, 0x37, 0xe2, 0x2f, 0x7b, 0xe8, 0xeb, 0xe1, 0x1d, 0xd0, 0xc1, 0x1f, 0xf7, 0x5f, 0xb1, 0xb4, 0x64, 0x15, 0xa1, 0x98, 0x63, 0xee, 0xaf, 0xf6, 0x91, - 0xc3, 0x33, 0x4e, 0x98, 0xb0, 0x04, 0x1e, 0xee, 0xaa, 0x1a, 0xfc, 0xbd, 0x57, 0xfc, 0x1a, 0x74, 0xeb, 0xc3, 0x8b, 0x4e, 0x6e, 0x50, 0x3d, 0x86, 0xbf, 0xe8, 0x77, 0xd8, 0x42, 0x67, 0xca, 0xdf, - 0xbf, 0xf4, 0x79, 0x16, 0x05, 0xbb, 0xa0, 0xb1, 0xb4, 0x65, 0x89, 0x82, 0x04, 0xb7, 0xf4, 0x67, 0x19, 0xa5, 0xa1, 0x89, 0xba, 0x2e, 0x5c, 0x15, 0x9e, 0x67, 0x33, 0xa6, 0x2f, 0x60, 0x31, 0x3d, - 0x45, 0xa8, 0x2e, 0x1d, 0x8c, 0x20, 0x1a, 0x1d, 0xe7, 0xfb, 0xb9, 0xb9, 0x47, 0xb7, 0xce, 0x82, 0x57, 0x72, 0xb4, 0xe2, 0xf8, 0x63, 0xa4, 0x83, 0x76, 0x87, 0x3a, 0x93, 0xd0, 0xdd, 0xe4, 0x27, - 0x12, 0xd4, 0x35, 0x50, 0xe2, 0x92, 0xe6, 0x8f, 0x67, 0xd1, 0x15, 0x80, 0xcd, 0x55, 0xa0, 0xe7, 0xc7, 0xf5, 0x24, 0xfa, 0x8f, 0x8f, 0xff, 0xdf, 0x55, 0xb6, 0x4b, 0x96, 0x3c, 0x70, 0xf9, 0x97, - 0x9b, 0x0f, 0x54, 0xb6, 0xe7, 0x4a, 0x2a, 0x6f, 0x89, 0x03, 0xe3, 0xf7, 0xc3, 0xf1, 0xc0, 0xca, 0xca, 0x49, 0x8d, 0x2b, 0xf4, 0x7c, 0x9a, 0x86, 0x3b, 0xaf, 0x6e, 0x25, 0x7b, 0xbf, 0xd1, 0x68, - 0xa5, 0x5e, 0xd4, 0x2b, 0xd2, 0x62, 0xb1, 0x74, 0x5e, 0x58, 0x71, 0x08, 0xbb, 0x80, 0x35, 0x4b, 0xcb, 0xa8, 0x5a, 0xcc, 0x45, 0xdb, 0x92, 0xd0, 0x79, 0x9e, 0x4d, 0xf2, 0x82, 0x2e, 0xb4, 0x51, - 0x54, 0xcf, 0x38, 0x0c, 0x02, 0x97, 0x1e, 0xaf, 0x0b, 0xf0, 0x7e, 0xb2, 0x83, 0x2c, 0x41, 0x88, 0xe9, 0x75, 0xfb, 0x2d, 0x32, 0xdd, 0x7d, 0x7d, 0xed, 0x0d, 0x88, 0x06, 0x7b, 0x31, 0x8e, 0xae, - 0x5c, 0xf9, 0x1f, 0x41, 0x12, 0x6f, 0xca, 0x6c, 0xec, 0x22, 0xcd, 0x6d, 0xfb, 0x55, 0x91, 0x43, 0x3e, 0xd7, 0x1c, 0xe8, 0x6f, 0xb9, 0x45, 0x9f, 0xda, 0x32, 0xfc, 0x02, 0x41, 0x38, 0xeb, 0x71, - 0x57, 0x48, 0x05, 0x7e, 0x74, 0xee, 0x78, 0xe3, 0xe4, 0x76, 0xe1, 0xdd, 0xdd, 0x09, 0x5f, 0x14, 0xc1, 0x4e, 0x8f, 0xde, 0x61, 0x4f, 0x90, 0x9b, 0x82, 0x06, 0x3f, 0xf6, 0x23, 0xbd, 0x34, 0xbd, - 0x77, 0xa1, 0xb9, 0x7a, 0x9f, 0x0b, 0x98, 0xcd, 0x19, 0x9c, 0xc3, 0x4c, 0xa2, 0x5f, 0x89, 0x0d, 0x0f, 0x8a, 0x80, 0xbe, 0x02, 0x82, 0xb8, 0x86, 0x37, 0xfc, 0xf1, 0xe3, 0xd6, 0xc1, 0x84, 0x3c, - 0xa9, 0x49, 0x7e, 0x86, 0x39, 0x1c, 0xa8, 0x3d, 0x5a, 0xc9, 0xbc, 0xb1, 0xea, 0x08, 0x15, 0x29, 0x7b, 0x8d, 0xae, 0x11, 0x59, 0xe2, 0xe1, 0x23, 0x05, 0x93, 0x07, 0x95, 0xd4, 0xdb, 0x66, 0x33, - 0x93, 0xa9, 0xec, 0x18, 0x71, 0x41, 0xb9, 0x20, 0xf4, 0x09, 0xb4, 0x82, 0x65, 0x03, 0x6c, 0xd3, 0x5d, 0x98, 0x2c, 0xe4, 0x98, 0x12, 0xe8, 0x26, 0x0b, 0xd2, 0x26, 0x9e, 0x25, 0x7a, 0x82, 0xa6, - 0x76, 0xc8, 0x13, 0x21, 0x22, 0xaf, 0xac, 0x1a, 0x71, 0xe5, 0x3f, 0x57, 0x6d, 0xee, 0x40, 0x1e, 0xfe, 0x78, 0xb8, 0x07, 0xfe, 0x12, 0x9c, 0x87, 0x1b, 0x20, 0xfc, 0x13, 0x7d, 0x72, 0xc5, 0x7c, - 0x25, 0x0e, 0x8c, 0xdf, 0x8e, 0xc6, 0x17, 0x62, 0xc3, 0xd8, 0x4b, 0xee, 0x97, 0x54, 0xd5, 0xf7, 0x74, 0x4d, 0x27, 0xec, 0x04, 0xe5, 0xd9, 0x35, 0x55, 0xd8, 0xb4, 0x1e, 0xcf, 0xbc, 0x39, 0x42, - 0xd9, 0x74, 0x92, 0xbb, 0xf4, 0x66, 0xc2, 0x29, 0xd8, 0x86, 0xd3, 0xb4, 0x00, 0xde, 0x53, 0xb1, 0x35, 0x55, 0x29, 0xb8, 0xe8, 0xad, 0x13, 0x3a, 0xdb, 0x6f, 0x9c, 0xc0, 0x72, 0x79, 0x92, 0xd2, - 0x36, 0xaa, 0x1e, 0x6b, 0x07, 0x33, 0x25, 0xc9, 0xb5, 0xb0, 0xdd, 0x33, 0xcd, 0x9f, 0xab, 0x1a, 0x1f, 0x13, 0x86, 0xff, 0xfa, 0x2f, 0xf0, 0x63, 0xce, 0xfb, 0x8f, 0x87, 0x6c, 0x8e, 0xbe, 0xe2, - 0x30, 0x7c, 0x03, 0x4c, 0x32, 0x9c, 0xc1, 0x8f, 0xa1, 0x1a, 0x7f, 0x3c, 0xe2, 0xea, 0xbf, 0x1c, 0xae, 0xf1, 0xc7, 0x8f, 0x01, 0xbb, 0xf5, 0xdd, 0x55, 0xe1, 0xb1, 0x6e, 0x02, 0x3d, 0x39, 0xb5, - 0xef, 0x3c, 0xe7, 0x1d, 0x1f, 0xf9, 0xea, 0xea, 0x1d, 0x7f, 0xe0, 0x8f, 0x47, 0x1c, 0xc4, 0x1c, 0xd1, 0x1c, 0xc9, 0xa8, 0xef, 0x35, 0x99, 0x88, 0xf1, 0x80, 0xbe, 0xac, 0x61, 0x07, 0x72, 0x39, - 0x96, 0x08, 0x85, 0x5d, 0xb9, 0x97, 0xd8, 0x24, 0xa3, 0xd0, 0x6e, 0x8d, 0x25, 0x5b, 0x7a, 0xb7, 0x4b, 0xcc, 0x2a, 0x9a, 0x15, 0x0e, 0x95, 0x05, 0x27, 0x2d, 0xce, 0xfc, 0x03, 0xe7, 0x45, 0x5c, - 0xb3, 0x05, 0xa2, 0x39, 0xbb, 0x49, 0xf1, 0x9d, 0xed, 0x85, 0x25, 0x92, 0x85, 0x58, 0x38, 0xf7, 0xbf, 0x90, 0xcb, 0x5f, 0x1c, 0xfc, 0x8f, 0x8f, 0xff, 0xdf, 0xb7, 0x5d, 0x47, 0x2f, 0x4a, 0xdf, - 0xe9, 0xce, 0x00, 0x5b, 0xaf, 0xf9, 0x3e, 0x8f, 0xdc, 0x4d, 0xc8, 0x95, 0xf2, 0x33, 0x94, 0x8b, 0x77, 0x9f, 0xf0, 0x8a, 0xe8, 0xf5, 0x76, 0x3a, 0x46, 0x3e, 0x69, 0x3f, 0x77, 0x99, 0x67, 0x1b, - 0xc6, 0xbc, 0x0c, 0x97, 0xb8, 0xd5, 0x6a, 0x8b, 0x49, 0xef, 0xf3, 0x56, 0x0e, 0x4e, 0x22, 0xe1, 0x40, 0xf0, 0x31, 0xed, 0x8b, 0x24, 0xa4, 0xd5, 0xb3, 0x70, 0xc3, 0x9a, 0xa5, 0x5c, 0x02, 0xb2, - 0x39, 0xa2, 0x90, 0x0d, 0x25, 0xec, 0xf6, 0x13, 0x3f, 0x52, 0x77, 0xda, 0x28, 0xf2, 0x6a, 0xd5, 0x8b, 0xf9, 0x3e, 0x12, 0x49, 0xd6, 0x6e, 0xd4, 0x93, 0xb0, 0x70, 0x99, 0x90, 0x6a, 0x5d, 0x6b, - 0x76, 0xe5, 0x50, 0xfa, 0x7a, 0xc7, 0x25, 0x3e, 0x81, 0xf8, 0xbe, 0xbc, 0xc5, 0xa5, 0xb0, 0xef, 0xb2, 0x33, 0x7d, 0xc6, 0x1c, 0xd6, 0x8b, 0x72, 0x5c, 0xe5, 0xfe, 0x5f, 0xff, 0xe3, 0x71, 0xda, - 0xc6, 0x77, 0x98, 0x73, 0x8f, 0x44, 0x9b, 0x78, 0x51, 0x00, 0x9e, 0x5b, 0x5c, 0x3f, 0xa2, 0xaa, 0x41, 0xb7, 0xe8, 0x2a, 0x3f, 0x1e, 0x4e, 0x7f, 0xb9, 0x82, 0x4e, 0xa9, 0x29, 0x4c, 0xbb, 0x4d, - 0x79, 0x68, 0xc9, 0x75, 0x9d, 0x39, 0x8a, 0xed, 0x4d, 0xd7, 0xfd, 0x71, 0xde, 0x08, 0xc8, 0x56, 0xe9, 0x34, 0x88, 0x55, 0x46, 0x28, 0xa5, 0xd3, 0x3d, 0x85, 0xb1, 0xa9, 0xc2, 0x1c, 0xbc, 0xa5, - 0x27, 0x2e, 0xfb, 0x60, 0xaa, 0x55, 0x6b, 0x15, 0x5f, 0x1f, 0xe8, 0x26, 0xd6, 0x6d, 0x6f, 0xe2, 0x99, 0x42, 0x13, 0x74, 0x90, 0x54, 0xad, 0x7a, 0x52, 0xfc, 0xe4, 0xf1, 0x78, 0xbc, 0x7a, 0x0e, - 0xc1, 0x52, 0x3b, 0x7f, 0x70, 0x30, 0x9e, 0xda, 0xc7, 0x07, 0x7e, 0x8b, 0xa9, 0x76, 0xfe, 0xf0, 0x23, 0x5c, 0xb5, 0x1f, 0x0f, 0x97, 0xef, 0x6f, 0x40, 0xcd, 0x7e, 0xfc, 0xf8, 0x1c, 0xed, 0x7c, - 0x6e, 0x50, 0xff, 0x0c, 0xdc, 0xec, 0xc7, 0xa3, 0x51, 0xff, 0x97, 0x01, 0x9c, 0x0d, 0x5d, 0x9b, 0x5e, 0x46, 0x3c, 0xb2, 0xf3, 0x87, 0x50, 0x21, 0xd0, 0x53, 0x39, 0x8f, 0x9f, 0xc9, 0x9f, 0xd5, - 0xb8, 0xd7, 0xe3, 0x31, 0x34, 0x2c, 0xdd, 0x71, 0x45, 0x28, 0xc2, 0x96, 0xcc, 0x90, 0x6d, 0x72, 0x34, 0x68, 0x8f, 0x9b, 0x8e, 0x64, 0xa0, 0xc2, 0x71, 0x4f, 0x9c, 0x22, 0x6e, 0x0f, 0xe4, 0x7a, - 0xb0, 0x9d, 0x8d, 0xd6, 0xf0, 0x89, 0xe9, 0xfc, 0x40, 0x4c, 0x05, 0x59, 0xdc, 0xab, 0x1a, 0xab, 0xa6, 0x8a, 0x1e, 0xda, 0x49, 0x30, 0x9a, 0xc2, 0xb3, 0x02, 0xdc, 0x4e, 0x2b, 0x51, 0x16, 0x71, - 0xc1, 0x27, 0x96, 0x19, 0xe7, 0x80, 0xd5, 0x28, 0x4f, 0xb0, 0x4f, 0xb1, 0xc2, 0xf7, 0xdf, 0xfa, 0x56, 0x48, 0x7f, 0x7f, 0x7d, 0x7e, 0x06, 0x74, 0xe9, 0x9a, 0xf4, 0x8b, 0x65, 0xf4, 0xf2, 0xff, - 0xec, 0x07, 0x1d, 0xf0, 0xfa, 0xeb, 0x99, 0x63, 0x6e, 0xf4, 0x11, 0x15, 0x9f, 0xe2, 0x66, 0xe7, 0x4f, 0x9c, 0x7d, 0xe2, 0xe6, 0x1b, 0xcd, 0xf5, 0xad, 0x8d, 0x6f, 0x8e, 0x18, 0x2d, 0xde, 0x04, - 0x7e, 0xa0, 0x59, 0x69, 0x48, 0xa4, 0xf5, 0xa9, 0x36, 0x34, 0x75, 0x42, 0x32, 0x3a, 0x82, 0xfb, 0x47, 0x61, 0xba, 0x60, 0xea, 0xc2, 0x9b, 0x1e, 0x37, 0x68, 0x37, 0x4a, 0x16, 0xfe, 0xc4, 0x34, - 0x58, 0x32, 0x9a, 0xa8, 0x02, 0x33, 0xb2, 0x22, 0xe9, 0xe1, 0xeb, 0x9f, 0x17, 0x80, 0x8b, 0x3c, 0xbf, 0x41, 0xbd, 0x7f, 0xb7, 0x6b, 0x3d, 0xd7, 0xcb, 0x6c, 0xd0, 0x13, 0x81, 0xf1, 0x97, 0xb7, - 0x87, 0x36, 0x40, 0xeb, 0xd2, 0x63, 0x17, 0xcb, 0xb5, 0x36, 0x43, 0x2c, 0xdf, 0x70, 0xc4, 0xee, 0x24, 0xf1, 0x88, 0x4c, 0x4e, 0x1a, 0xd2, 0x9a, 0xab, 0xee, 0x96, 0x71, 0xe3, 0x8e, 0x90, 0x4c, - 0xec, 0x04, 0x61, 0x48, 0x73, 0x10, 0x37, 0x34, 0x1a, 0xcd, 0x99, 0x39, 0x7d, 0x9a, 0x51, 0xe9, 0x08, 0x04, 0x0f, 0x51, 0x76, 0x62, 0xea, 0x65, 0x44, 0xd0, 0x40, 0x7b, 0x48, 0x58, 0x3d, 0x68, - 0xba, 0xb9, 0xb5, 0xa7, 0x81, 0xeb, 0x24, 0xe4, 0xfb, 0xbb, 0xda, 0x9d, 0xdf, 0xfe, 0xd7, 0xff, 0x78, 0xed, 0x61, 0xf1, 0x20, 0xb8, 0xfa, 0x9f, 0x71, 0x62, 0xd9, 0xa1, 0x6f, 0x00, 0x4e, 0xf1, - 0xb3, 0x30, 0xf5, 0xd8, 0xf2, 0x1f, 0x46, 0xab, 0x7f, 0x42, 0x4f, 0x64, 0xd3, 0xde, 0xa1, 0xff, 0xc2, 0xe4, 0xf7, 0x93, 0xb3, 0xae, 0x3a, 0x20, 0x65, 0x16, 0x41, 0x5c, 0x24, 0xe5, 0x56, 0x27, - 0xc4, 0x70, 0x27, 0xb1, 0x66, 0x6c, 0x80, 0x11, 0x75, 0xc0, 0x96, 0xb0, 0xbd, 0xa2, 0xfb, 0xe3, 0x2c, 0xf6, 0xd1, 0xa9, 0xe8, 0xac, 0xe2, 0xcd, 0xc4, 0x71, 0x3d, 0x51, 0x71, 0x5d, 0xb1, 0x26, - 0x2d, 0x20, 0x5d, 0xf0, 0x5b, 0x77, 0x55, 0x58, 0x33, 0x77, 0x9f, 0x96, 0xd5, 0xa2, 0xc2, 0xb3, 0x0c, 0x98, 0xcb, 0xb5, 0x70, 0x58, 0x84, 0x5e, 0x5d, 0x6c, 0x14, 0xea, 0x16, 0x23, 0x6b, 0xa0, - 0xb5, 0x7e, 0xf5, 0x4a, 0xa5, 0x5e, 0xfe, 0xf5, 0x9a, 0xc2, 0x7a, 0x65, 0xe8, 0xe6, 0xd5, 0x39, 0x4b, 0x56, 0x0f, 0x43, 0xfb, 0x2d, 0xcf, 0x0e, 0xfa, 0x39, 0x1d, 0x30, 0x06, 0x17, 0x82, 0xf7, - 0x07, 0xe0, 0x99, 0x74, 0xe6, 0x5b, 0xe2, 0xaf, 0xdc, 0x2f, 0xf5, 0xf2, 0x9c, 0x33, 0x3b, 0x80, 0xf5, 0xcb, 0x43, 0xc8, 0xae, 0x66, 0xa0, 0x19, 0x96, 0xf0, 0x68, 0xe7, 0xe2, 0x86, 0x69, 0x66, - 0x23, 0xa5, 0x97, 0xad, 0x55, 0x5d, 0x43, 0x53, 0x13, 0x5e, 0xf2, 0x19, 0xb9, 0x2d, 0x12, 0x61, 0x93, 0x42, 0x81, 0x8d, 0xb7, 0x41, 0x99, 0xe3, 0x2b, 0x18, 0x1b, 0xed, 0x35, 0x19, 0x87, 0x39, - 0xca, 0xaa, 0xd5, 0x69, 0x06, 0x65, 0x4a, 0xbf, 0xdc, 0xd3, 0x8e, 0xc7, 0x39, 0x23, 0x5a, 0xae, 0xa5, 0xd5, 0x43, 0xf8, 0xd5, 0x87, 0x7c, 0x69, 0xae, 0x23, 0x19, 0xb7, 0x99, 0x59, 0xd8, 0x1f, - 0xf1, 0xa5, 0xb9, 0x04, 0x33, 0x5e, 0x8f, 0xce, 0xe9, 0x59, 0xd8, 0xf7, 0x7c, 0x21, 0xc8, 0x3c, 0xd1, 0x0b, 0xac, 0x56, 0xca, 0x3d, 0xca, 0x2c, 0x35, 0x65, 0xc6, 0xd2, 0xc9, 0x1c, 0x81, 0xbd, - 0x98, 0x87, 0xb9, 0x49, 0x77, 0x72, 0xa9, 0x74, 0xcf, 0x18, 0x95, 0xc6, 0x4a, 0xd0, 0xa4, 0x9e, 0x73, 0x59, 0x0e, 0x23, 0x29, 0x89, 0x63, 0x36, 0xc0, 0x1c, 0xcd, 0x43, 0x71, 0xa4, 0xd8, 0xd9, - 0xa6, 0x9e, 0x80, 0xa7, 0xd2, 0x82, 0xd1, 0xcc, 0x9b, 0x77, 0xeb, 0x1c, 0x6b, 0xc8, 0x32, 0x79, 0x32, 0x42, 0x7d, 0x77, 0x16, 0xdf, 0x4c, 0xd9, 0xd7, 0x05, 0x22, 0x7b, 0x15, 0xc7, 0x87, 0xbd, - 0x7e, 0x3f, 0x43, 0x60, 0xdc, 0x5f, 0x85, 0x89, 0x67, 0xa4, 0xf1, 0x9a, 0xf6, 0x6d, 0x05, 0x27, 0x31, 0x44, 0x1e, 0xf7, 0xdc, 0x82, 0xdf, 0x15, 0x65, 0xb3, 0x67, 0x3a, 0xba, 0x3a, 0x8a, 0xf0, - 0x86, 0x11, 0xe5, 0xe3, 0xe8, 0x24, 0xb2, 0xed, 0x71, 0x13, 0x79, 0xc2, 0x08, 0x4e, 0xf2, 0xa8, 0x28, 0xe9, 0x3a, 0xd6, 0xfc, 0x2e, 0x21, 0xc5, 0x72, 0x0f, 0x65, 0xd9, 0x54, 0xf3, 0xbc, 0xfc, - 0xb4, 0x44, 0xf9, 0x5d, 0xd9, 0xba, 0xc5, 0x08, 0x3e, 0xfa, 0xaa, 0x12, 0x4e, 0x67, 0x0c, 0x1e, 0xf3, 0x4b, 0x39, 0x03, 0x2a, 0x6a, 0x08, 0x98, 0xc3, 0x7f, 0x9e, 0x7f, 0xeb, 0xab, 0xa3, 0xf1, - 0x01, 0x5b, 0xf0, 0x9f, 0xf0, 0xf4, 0x99, 0xdd, 0xe9, 0x23, 0xe9, 0x77, 0x67, 0xe6, 0xf8, 0x42, 0xed, 0x7b, 0x96, 0xec, 0x78, 0xb3, 0xf6, 0x93, 0x03, 0xcd, 0x12, 0xc0, 0xa2, 0xd5, 0x6d, 0x65, - 0x7d, 0xe2, 0x50, 0x40, 0xf1, 0x95, 0xa6, 0xc4, 0x52, 0x72, 0x37, 0x9d, 0x23, 0x82, 0xc3, 0x44, 0xb5, 0xde, 0x10, 0xa5, 0x18, 0x82, 0x79, 0xce, 0x52, 0x2b, 0x74, 0x13, 0x42, 0x13, 0x56, 0x56, - 0x46, 0x29, 0xe7, 0x2f, 0x66, 0x0e, 0xc0, 0x6d, 0xa4, 0x7a, 0xd6, 0x53, 0x23, 0x4c, 0xee, 0x55, 0x6e, 0xbe, 0x99, 0x52, 0x76, 0xfc, 0x64, 0xec, 0xf9, 0xed, 0x4d, 0xca, 0x57, 0xef, 0xe4, 0xff, - 0xe7, 0xa3, 0x00, 0xbe, 0xde, 0xfd, 0xa0, 0xc0, 0x5e, 0x3e, 0xf2, 0x40, 0x10, 0xaf, 0x49, 0xdd, 0x9f, 0xfc, 0xcf, 0x24, 0x92, 0x5d, 0x51, 0x3e, 0xb3, 0xfb, 0xe5, 0x60, 0x28, 0x3e, 0xf0, 0xbe, - 0x0a, 0x33, 0x8d, 0xa3, 0x55, 0xe5, 0x30, 0xd3, 0xa8, 0xe0, 0x18, 0x9f, 0xb0, 0x55, 0xb9, 0x64, 0x45, 0xdf, 0x4d, 0x27, 0x13, 0x73, 0x57, 0xd2, 0x2e, 0x9d, 0x0b, 0xb0, 0xcb, 0xca, 0x8d, 0xd7, - 0xad, 0xca, 0x04, 0x86, 0x46, 0x50, 0x6f, 0xec, 0xa8, 0x52, 0x38, 0x90, 0xf0, 0x06, 0x5a, 0x4c, 0x1b, 0x34, 0xa3, 0x24, 0x30, 0x17, 0x98, 0x3d, 0x19, 0x93, 0x36, 0xb8, 0xe0, 0x15, 0x7f, 0xbe, - 0x5a, 0x0e, 0x5a, 0x10, 0xef, 0x71, 0xef, 0xbe, 0x14, 0x7e, 0x2c, 0xfe, 0xfa, 0x4d, 0xae, 0x7c, 0x20, 0x7f, 0x63, 0x6b, 0x9c, 0xc9, 0x7e, 0xcf, 0x1f, 0xb3, 0xdd, 0x2f, 0xa4, 0x5d, 0x61, 0x93, - 0x11, 0x26, 0x4c, 0x19, 0xa3, 0x81, 0x96, 0x7b, 0x83, 0xc8, 0x31, 0x61, 0x8b, 0x0a, 0xde, 0xb6, 0x44, 0x3c, 0xf1, 0xb8, 0x39, 0x2d, 0x66, 0xe9, 0x26, 0xe0, 0x08, 0x65, 0xae, 0xc9, 0x02, 0x59, - 0x49, 0xcc, 0x66, 0xc6, 0xc2, 0x3e, 0xec, 0x1e, 0x53, 0x53, 0xb3, 0x36, 0xe4, 0x32, 0x4f, 0xb5, 0x4a, 0xa1, 0x3d, 0x16, 0xdf, 0x19, 0x11, 0xe4, 0x6b, 0x11, 0xcf, 0x0c, 0xca, 0x12, 0xb9, 0xbc, - 0xc0, 0x07, 0x60, 0xdc, 0x47, 0xfb, 0xc5, 0xef, 0xe7, 0x6a, 0xde, 0xd0, 0x06, 0xc6, 0xef, 0x87, 0x43, 0xdb, 0x5e, 0x06, 0x5e, 0xb5, 0xde, 0x2c, 0xe5, 0xdc, 0xab, 0x29, 0x71, 0x93, 0x35, 0xa2, - 0xd9, 0x62, 0x4b, 0x3e, 0x8b, 0xd6, 0xb6, 0x3f, 0x9b, 0xcc, 0xf7, 0x79, 0x41, 0x09, 0xa2, 0x97, 0x87, 0x8b, 0x6d, 0x6e, 0xe4, 0x91, 0x8a, 0x1e, 0x39, 0x31, 0x08, 0x26, 0x6a, 0x08, 0x24, 0x1b, - 0x8a, 0xa3, 0x85, 0x29, 0xa1, 0xc9, 0xea, 0xb2, 0xd9, 0x45, 0x38, 0xd1, 0x2e, 0xa9, 0x1e, 0x9d, 0x8b, 0x94, 0x7d, 0x2a, 0x7b, 0xfb, 0x37, 0xc4, 0x26, 0x7e, 0x8c, 0x93, 0x06, 0x9d, 0x9b, 0x19, - 0x3d, 0xd1, 0x46, 0xf9, 0x03, 0x69, 0x60, 0x7c, 0x29, 0x45, 0x79, 0xa3, 0xf5, 0x3d, 0x43, 0x46, 0xf0, 0xd2, 0x75, 0x1b, 0x17, 0x17, 0xdb, 0x44, 0x98, 0xac, 0x3b, 0xaf, 0x2e, 0xb2, 0xe9, 0x4e, - 0xcf, 0x23, 0xd1, 0x58, 0xda, 0xa1, 0x26, 0x82, 0x38, 0xc8, 0x72, 0xcb, 0x68, 0x9e, 0x1a, 0x25, 0x43, 0x25, 0xdd, 0x9e, 0x5f, 0xf2, 0x52, 0x80, 0x36, 0x7d, 0x60, 0x48, 0x94, 0xd6, 0x5b, 0xac, - 0x22, 0x6b, 0x71, 0x56, 0x39, 0x55, 0xb9, 0x32, 0x26, 0xeb, 0x99, 0x2a, 0x1f, 0x67, 0x3c, 0x4f, 0xce, 0x9a, 0x4f, 0xa6, 0xc6, 0xdb, 0x4f, 0xcc, 0x23, 0x3d, 0xf4, 0x7b, 0xfb, 0xbd, 0x68, 0xeb, - 0xb5, 0x6f, 0xd4, 0x7d, 0x55, 0xeb, 0xa9, 0xa0, 0xd4, 0x57, 0x4f, 0x3a, 0xb3, 0xe7, 0xde, 0x8d, 0x73, 0xf6, 0xc4, 0x80, 0x78, 0x15, 0x13, 0xe0, 0xe6, 0x12, 0xef, 0x47, 0x53, 0x82, 0x83, 0x09, - 0x58, 0xc9, 0xa2, 0x14, 0x5e, 0x4f, 0xe6, 0xcb, 0x22, 0x49, 0x2a, 0x75, 0xde, 0x1b, 0xe4, 0xca, 0x93, 0xa4, 0x9e, 0x9e, 0x23, 0xc1, 0x76, 0x29, 0x9f, 0xb0, 0x7c, 0xea, 0x16, 0x3d, 0x98, 0xa8, - 0xc9, 0x29, 0x5b, 0xaa, 0x32, 0x5a, 0x41, 0x32, 0x62, 0x71, 0x6c, 0x02, 0xa6, 0x34, 0xcb, 0xe1, 0x05, 0x2f, 0xb0, 0x9d, 0x57, 0x85, 0x5d, 0x3a, 0xa4, 0xb1, 0xce, 0xeb, 0x6b, 0x7d, 0x87, 0x47, - 0xfe, 0xf4, 0x2a, 0xfc, 0x09, 0x96, 0x7c, 0xc0, 0x12, 0x0c, 0xee, 0x08, 0x73, 0x9d, 0x34, 0xa4, 0x55, 0xf8, 0xb3, 0x69, 0x6c, 0xb4, 0x33, 0x17, 0x9f, 0x20, 0x50, 0xb1, 0x80, 0x4d, 0x4b, 0x3c, - 0xf2, 0xbe, 0x9a, 0xb8, 0xa6, 0xb3, 0x54, 0x6d, 0x95, 0x89, 0x46, 0x86, 0x1d, 0xa8, 0xe4, 0x1c, 0x30, 0x6a, 0xdf, 0xe8, 0x91, 0x9c, 0x45, 0x30, 0x5f, 0x12, 0xa7, 0x86, 0x14, 0x08, 0x40, 0x21, - 0xf4, 0x8b, 0x46, 0x9d, 0xe2, 0x40, 0x45, 0x4d, 0x22, 0xaa, 0x4b, 0x9e, 0x34, 0x07, 0xae, 0x66, 0xd7, 0xd7, 0x7b, 0xd9, 0x45, 0xcf, 0xb9, 0x8a, 0x5d, 0x8e, 0xd3, 0xb0, 0x72, 0xaf, 0xaa, 0xbc, - 0x6e, 0x6c, 0xdd, 0xa7, 0x12, 0xda, 0xbe, 0x79, 0xda, 0x2f, 0x0d, 0xe3, 0x72, 0x3e, 0xbe, 0x3c, 0xe7, 0x7b, 0xbe, 0x67, 0x06, 0xe5, 0x9e, 0x44, 0x0e, 0xa7, 0xf7, 0x4a, 0x71, 0x90, 0x98, 0xa0, - 0x9d, 0xca, 0x4a, 0x25, 0x31, 0x45, 0xe3, 0x8f, 0x8c, 0x79, 0x09, 0xfa, 0x45, 0x46, 0x93, 0x76, 0x32, 0xa2, 0xd6, 0x3b, 0x70, 0x3a, 0x41, 0xfa, 0x6c, 0x09, 0x2a, 0x29, 0x4e, 0x1d, 0xf1, 0x85, - 0x3f, 0xf5, 0x53, 0x77, 0x31, 0xc3, 0x22, 0x53, 0xca, 0x16, 0x28, 0x2f, 0xec, 0xf8, 0x66, 0x0b, 0x38, 0x70, 0x8e, 0xb5, 0x5b, 0xef, 0x49, 0x9d, 0xf7, 0xce, 0x3b, 0xb6, 0xa9, 0x7d, 0xee, 0x27, - 0x5b, 0xea, 0xe1, 0xf8, 0x0d, 0xa4, 0xe9, 0x96, 0x87, 0xf7, 0xbf, 0x5a, 0x98, 0x49, 0x6a, 0x8f, 0x23, 0x3d, 0xd6, 0xdd, 0x4b, 0x76, 0xdc, 0xe7, 0x6f, 0x7d, 0x11, 0x8b, 0x7d, 0xab, 0xbc, 0x3e, - 0x63, 0x29, 0x5b, 0x63, 0x23, 0xd4, 0xcd, 0xd3, 0xf8, 0x4d, 0x01, 0xfa, 0x5c, 0x51, 0x73, 0xe9, 0x1c, 0xf2, 0x46, 0x0a, 0xff, 0x09, 0x5d, 0x95, 0xf1, 0x5c, 0x12, 0x8b, 0x2e, 0x99, 0x45, 0x9f, - 0x2b, 0x31, 0xaf, 0x7b, 0xcc, 0x5d, 0x15, 0xf8, 0xfc, 0x02, 0xa6, 0x3a, 0x3b, 0x51, 0xf1, 0x7f, 0x47, 0x54, 0xff, 0x1b, 0x44, 0x54, 0xff, 0x1d, 0xea, 0x7b, 0xe4, 0x0c, 0x1e, 0x38, 0x7f, 0xff, - 0xc5, 0xcb, 0xe2, 0xa7, 0x47, 0xbe, 0xac, 0x8d, 0x9f, 0x2e, 0x0e, 0x5e, 0x20, 0x97, 0x8d, 0xa2, 0xc0, 0x3b, 0x9e, 0x5e, 0xb3, 0x90, 0x47, 0xc8, 0xc7, 0xc2, 0xe6, 0x58, 0x94, 0x32, 0x0f, 0x64, - 0x8f, 0x85, 0x4a, 0x2d, 0x27, 0xc2, 0x86, 0xae, 0xaa, 0x8c, 0x3f, 0x1e, 0x13, 0xc5, 0xab, 0x1d, 0x76, 0xee, 0x09, 0xfe, 0x51, 0x94, 0xa8, 0xa4, 0x19, 0x4d, 0xe6, 0x21, 0x22, 0x96, 0x5d, 0xbb, - 0x82, 0x7c, 0x3a, 0xc7, 0x54, 0xed, 0xd8, 0x1c, 0xca, 0x39, 0xd2, 0x1d, 0xa5, 0xc0, 0x33, 0xff, 0x64, 0x81, 0xbc, 0xb5, 0xb5, 0xce, 0x38, 0x91, 0xc8, 0x9f, 0xaf, 0x86, 0x77, 0xbe, 0x75, 0xbe, - 0xf2, 0x7b, 0x9f, 0x7e, 0xbb, 0xf2, 0xb6, 0x56, 0x7e, 0xfe, 0xe6, 0xeb, 0x3e, 0x75, 0xfe, 0x45, 0x7f, 0xfd, 0x72, 0x66, 0x7e, 0xfe, 0xc4, 0xaf, 0xb5, 0x0f, 0xfe, 0xc2, 0xdd, 0xf9, 0xf9, 0x77, - 0x7c, 0x59, 0xa2, 0xf3, 0xcf, 0x09, 0xda, 0x7b, 0xbd, 0xce, 0x6b, 0xa5, 0xce, 0x50, 0x81, 0xb2, 0x02, 0xe8, 0xb8, 0xf4, 0x00, 0x54, 0x5a, 0xdb, 0x73, 0x6a, 0x63, 0xc0, 0x0e, 0x20, 0x05, 0x72, - 0xc3, 0x45, 0xf4, 0x2c, 0x37, 0x1b, 0x13, 0xde, 0x27, 0xf9, 0x5e, 0x94, 0x43, 0x92, 0x50, 0x79, 0xe5, 0x18, 0x1e, 0xa0, 0x75, 0xaa, 0xec, 0x0a, 0x43, 0xc3, 0x6d, 0xe4, 0x78, 0xb4, 0x52, 0xcf, - 0x91, 0x1b, 0x78, 0xaa, 0x2b, 0x0b, 0x75, 0xcb, 0x57, 0x0c, 0x49, 0x34, 0x53, 0x6d, 0x52, 0x6c, 0xa7, 0xf8, 0x9f, 0x08, 0xd4, 0x7f, 0x57, 0x41, 0xb9, 0xdd, 0x9e, 0xdf, 0xc6, 0xff, 0xdf, 0x5b, - 0xdf, 0xbf, 0xb7, 0xbe, 0xff, 0xfe, 0x5b, 0xdf, 0xed, 0x44, 0xfa, 0xd7, 0x2e, 0x46, 0x57, 0x4f, 0x03, 0xc6, 0xd7, 0xe7, 0x83, 0x97, 0xa6, 0xe9, 0x68, 0x7f, 0x58, 0x31, 0x74, 0x5c, 0x51, 0xd3, - 0x5d, 0x79, 0xd8, 0x64, 0xa4, 0x67, 0x6e, 0x2b, 0x0e, 0xb7, 0x2a, 0x7c, 0xe2, 0x74, 0xd4, 0x16, 0xe8, 0x52, 0x8a, 0x30, 0x27, 0x2e, 0xbe, 0xb5, 0x1a, 0x3c, 0x65, 0x36, 0x28, 0x4f, 0x2b, 0x86, - 0xcd, 0x22, 0x84, 0xbd, 0x12, 0x9d, 0x7e, 0xd9, 0x59, 0x14, 0x7b, 0xa4, 0x13, 0xc1, 0x0d, 0xc2, 0xa4, 0xdd, 0xce, 0x66, 0xc8, 0x08, 0x0d, 0x81, 0xbe, 0xf8, 0x13, 0x23, 0xec, 0x0f, 0x16, 0x99, - 0xda, 0x2f, 0xfc, 0x32, 0xc9, 0xc7, 0x27, 0xbb, 0xfb, 0xf8, 0xa5, 0xa1, 0xc3, 0xf7, 0xf6, 0xb0, 0x7f, 0xed, 0xb0, 0x5d, 0x36, 0xf4, 0x57, 0x9f, 0xf9, 0xe0, 0x61, 0x2a, 0x4f, 0x47, 0x95, 0x74, - 0x69, 0x69, 0x6d, 0xd5, 0x4e, 0x41, 0x6c, 0x50, 0x7c, 0xa3, 0x67, 0x6d, 0x12, 0xac, 0xe9, 0xf9, 0x28, 0x5a, 0xaa, 0x91, 0xd0, 0x5b, 0x3d, 0x9e, 0x8f, 0xaa, 0x91, 0x3a, 0x41, 0x43, 0x84, 0xa1, - 0x4f, 0x4a, 0x3a, 0x37, 0x24, 0x68, 0x95, 0x22, 0x26, 0x9f, 0x65, 0x33, 0x75, 0x5a, 0x73, 0x2a, 0x45, 0xce, 0x20, 0xc7, 0x2f, 0x8b, 0xa5, 0x17, 0xe1, 0x1d, 0x0f, 0xd6, 0xed, 0x74, 0xb8, 0xdf, - 0xe9, 0xdb, 0xb5, 0xfc, 0x7f, 0x03, 0xcf, 0x3e, 0x3e, 0xf1, 0x3a, 0xe6, 0xf0, 0xea, 0xf9, 0x1d, 0xca, 0xcb, 0x13, 0x49, 0xfb, 0xe5, 0x06, 0x30, 0x3a, 0x80, 0x5d, 0xe3, 0x2e, 0x41, 0x1d, 0x36, - 0x0a, 0xae, 0xaf, 0xd3, 0x59, 0x13, 0xca, 0x84, 0x95, 0x14, 0x9e, 0xb3, 0xef, 0x09, 0x0b, 0x87, 0x82, 0x29, 0x1e, 0x4f, 0x4e, 0xaa, 0x3e, 0x31, 0x75, 0x76, 0x5f, 0x1f, 0x40, 0xb9, 0x9e, 0xab, - 0x73, 0x3d, 0xde, 0x00, 0xf3, 0x8c, 0x5c, 0x25, 0x33, 0xde, 0xae, 0x09, 0xcd, 0x04, 0x22, 0x09, 0xdb, 0x6c, 0x1a, 0xed, 0x91, 0x6b, 0xf3, 0xff, 0x90, 0xc8, 0x7f, 0xb1, 0xa5, 0x7e, 0xb8, 0xf5, - 0x25, 0xaa, 0xb9, 0x5f, 0x8c, 0xdf, 0x7a, 0xa1, 0x7d, 0x6e, 0x1f, 0xf0, 0x6f, 0x0b, 0xf6, 0xdf, 0xdb, 0xf8, 0xff, 0xb5, 0xdb, 0xf8, 0xcd, 0x9c, 0xfa, 0xd7, 0x2e, 0x6d, 0x1f, 0x1f, 0x06, 0x8c, - 0xaf, 0x4e, 0x07, 0x2f, 0x68, 0x68, 0xd2, 0x42, 0x45, 0x10, 0x31, 0xec, 0xb2, 0x0d, 0xe6, 0x34, 0x19, 0x73, 0x54, 0xb9, 0x5f, 0x2c, 0xbc, 0x79, 0xae, 0x95, 0xeb, 0x19, 0x34, 0x37, 0xc1, 0x82, - 0x4c, 0xab, 0x1e, 0x74, 0x32, 0x07, 0x11, 0x47, 0x2e, 0xb2, 0x5a, 0x30, 0x9d, 0xd2, 0xb6, 0xc6, 0x02, 0xc4, 0x8c, 0xae, 0x01, 0x17, 0x72, 0x21, 0xc6, 0xb1, 0x91, 0xa1, 0xa8, 0xb9, 0xf6, 0x6b, - 0x16, 0x5f, 0x17, 0x10, 0x00, 0x16, 0xb7, 0x98, 0x91, 0xff, 0x92, 0x05, 0xed, 0xd5, 0xea, 0xbb, 0x5d, 0xc4, 0xbe, 0x32, 0xfe, 0x74, 0xc3, 0xc8, 0xed, 0xfa, 0x61, 0x54, 0xe8, 0x19, 0xfc, 0x80, - 0x0b, 0x49, 0x60, 0xfc, 0x7a, 0x70, 0x2e, 0xe6, 0x1a, 0xe0, 0xcb, 0x8f, 0x63, 0x7b, 0x0a, 0x2c, 0x7d, 0x09, 0xf0, 0xfa, 0xa5, 0x77, 0xc0, 0x52, 0x8b, 0x8e, 0x0d, 0xb2, 0xec, 0x71, 0x3a, 0x10, - 0x95, 0x75, 0x7e, 0x00, 0x41, 0x11, 0xe8, 0x6b, 0x71, 0x1b, 0x4d, 0x52, 0x61, 0x71, 0x0a, 0xb1, 0xb6, 0x62, 0x72, 0x26, 0xd6, 0x62, 0x60, 0x57, 0x2a, 0x3c, 0xef, 0xf0, 0xe5, 0xcc, 0x39, 0x4e, - 0x01, 0x48, 0x2e, 0x6d, 0xef, 0x54, 0xf4, 0xea, 0x34, 0x33, 0x15, 0xdf, 0x07, 0x87, 0x6c, 0xc9, 0xba, 0x91, 0xe4, 0x67, 0xfc, 0xfc, 0x32, 0x4f, 0xc2, 0xaf, 0x12, 0x83, 0x9f, 0x89, 0xaa, 0xde, - 0x12, 0x3f, 0xb3, 0xe5, 0xfa, 0xd2, 0x9d, 0x52, 0xb0, 0xbb, 0x0c, 0xf2, 0x88, 0x50, 0x22, 0x4a, 0xdd, 0x3c, 0x1e, 0x62, 0x19, 0xa9, 0x79, 0x49, 0x71, 0x7d, 0x23, 0x18, 0x95, 0x02, 0xcd, 0x2e, - 0x27, 0xc0, 0x28, 0x04, 0xb1, 0x59, 0x05, 0x8b, 0x66, 0xee, 0xd7, 0x00, 0x13, 0xd9, 0x25, 0x68, 0xeb, 0x01, 0xaa, 0x34, 0x7b, 0x16, 0x85, 0x0a, 0x61, 0xda, 0xc4, 0x2c, 0xed, 0x4b, 0xc5, 0x3c, - 0x80, 0xa6, 0x19, 0x68, 0xe5, 0xbd, 0xb5, 0xb7, 0xec, 0x19, 0x5b, 0x36, 0x43, 0x32, 0xa8, 0xec, 0xda, 0x8e, 0xcb, 0x71, 0xa9, 0xe7, 0xae, 0x5d, 0x8e, 0x0b, 0xef, 0xd2, 0xd2, 0xf2, 0xab, 0xfc, - 0x29, 0xdd, 0x28, 0xca, 0x5c, 0x37, 0xcb, 0x71, 0x98, 0xb8, 0xee, 0x35, 0x40, 0xd1, 0x6d, 0xee, 0xce, 0x33, 0xd2, 0x75, 0x4d, 0xfc, 0xcc, 0xd0, 0xeb, 0x4b, 0xe7, 0x24, 0x9e, 0x01, 0x12, 0x07, - 0x93, 0x81, 0xac, 0x1c, 0x5b, 0x45, 0xac, 0x3d, 0x5b, 0xa8, 0x19, 0x83, 0x2c, 0xc2, 0xc5, 0xf6, 0x20, 0xa8, 0xa7, 0x7c, 0xb4, 0x0d, 0xc4, 0x52, 0x88, 0xf3, 0x8d, 0x88, 0x20, 0xce, 0x68, 0xb7, - 0xdc, 0x6f, 0x7a, 0xbb, 0x97, 0xd2, 0xa3, 0x99, 0xed, 0x5c, 0x3c, 0xd0, 0x91, 0x0d, 0x6a, 0x91, 0x5a, 0xd4, 0xf7, 0x6e, 0xa3, 0x8c, 0x74, 0x10, 0x9e, 0x06, 0x72, 0x3b, 0x11, 0x29, 0x1f, 0x59, - 0x55, 0xfe, 0xa7, 0xac, 0x46, 0xdd, 0x4c, 0xf2, 0x47, 0xa1, 0x0c, 0xfc, 0xa9, 0x98, 0xda, 0x99, 0xe2, 0xcb, 0x7b, 0xbf, 0xfc, 0x1f, 0xe3, 0xc3, 0x42, 0x65, 0xb1, 0xd4, 0xa5, 0x60, 0x02, 0x01, - 0x11, 0x6f, 0x19, 0x8a, 0x00, 0x89, 0x02, 0x76, 0x62, 0x4f, 0xcd, 0x36, 0x8f, 0xdc, 0x23, 0xc8, 0x29, 0x40, 0x40, 0x51, 0x29, 0xef, 0x37, 0x86, 0x1a, 0x30, 0x89, 0xcc, 0xa3, 0x56, 0x48, 0x7a, - 0xd9, 0xaa, 0x4c, 0xa4, 0x8a, 0x8a, 0xe7, 0xc2, 0xba, 0x77, 0x95, 0x5d, 0xe3, 0x82, 0xc7, 0xbd, 0x4f, 0x25, 0x52, 0x87, 0x6d, 0x5b, 0xce, 0x36, 0xa4, 0x9d, 0x47, 0x0c, 0x09, 0x40, 0x5f, 0x7e, - 0x65, 0x50, 0xb4, 0x0f, 0x78, 0x30, 0xb9, 0xd2, 0x40, 0x7e, 0x8b, 0x07, 0x2f, 0x54, 0xdf, 0xf9, 0x10, 0x14, 0xed, 0x78, 0xf2, 0x49, 0x0b, 0xb9, 0x9f, 0xcf, 0x09, 0x8a, 0x65, 0x04, 0xa0, 0xb8, - 0xb0, 0x76, 0x24, 0x39, 0xe5, 0x25, 0x78, 0x05, 0x24, 0x4b, 0x1e, 0x40, 0xa4, 0x83, 0xbf, 0xc6, 0x16, 0xcd, 0x7e, 0x64, 0xaf, 0x8c, 0xe5, 0xc6, 0x2b, 0xac, 0xd6, 0x83, 0xf7, 0xca, 0xc6, 0x0a, - 0x47, 0x08, 0x98, 0x10, 0x3a, 0x63, 0x29, 0x46, 0x34, 0x59, 0x19, 0x8e, 0x93, 0x2e, 0x16, 0x33, 0x17, 0x70, 0x47, 0xbd, 0x0f, 0xcd, 0x47, 0x41, 0xbd, 0xf2, 0xf4, 0xc9, 0x6f, 0xa5, 0x86, 0xdc, - 0xcc, 0x97, 0x87, 0xcd, 0xc4, 0xcf, 0xc5, 0x6f, 0xbf, 0x9f, 0xc7, 0xf5, 0x2b, 0xef, 0xfd, 0x42, 0xe0, 0x7b, 0x8e, 0x04, 0x88, 0xb3, 0xdb, 0xb8, 0xb5, 0x92, 0x4c, 0x60, 0x5c, 0x8f, 0xbb, 0x43, - 0xb7, 0x12, 0x18, 0xe5, 0xb0, 0x32, 0x98, 0x51, 0x1d, 0xc7, 0xd2, 0xa1, 0x9e, 0x83, 0xd1, 0x24, 0x8a, 0x4e, 0x26, 0xa4, 0xac, 0x47, 0x71, 0x3b, 0x4b, 0xd3, 0x13, 0xb5, 0xe1, 0x96, 0x1b, 0x50, - 0x3f, 0xa2, 0x96, 0x11, 0xee, 0x28, 0x3e, 0x61, 0xb6, 0x9e, 0x17, 0x8d, 0x4e, 0xfd, 0x1c, 0x3d, 0xaa, 0xdd, 0x89, 0x4c, 0x38, 0x17, 0xfd, 0x1d, 0x8e, 0xfc, 0x5a, 0x6e, 0x86, 0xa4, 0xbf, 0x5f, - 0x65, 0x75, 0x9e, 0x91, 0xe0, 0xae, 0x93, 0x3b, 0xef, 0x20, 0x35, 0x3c, 0x48, 0x95, 0xbf, 0x2e, 0xb5, 0xfc, 0xaa, 0xa3, 0xf8, 0xed, 0x90, 0x7d, 0xa8, 0x88, 0xb8, 0xbf, 0xba, 0x3d, 0xb5, 0x77, - 0xfe, 0xa2, 0xfb, 0x3a, 0x82, 0xaf, 0x67, 0x67, 0x95, 0x70, 0x80, 0x68, 0xef, 0x5b, 0x70, 0xdd, 0x4e, 0x60, 0xaf, 0x9d, 0xe3, 0x14, 0x44, 0x78, 0x27, 0x6e, 0xee, 0xba, 0x87, 0x70, 0xee, 0x3b, - 0xd9, 0xfe, 0x58, 0x1e, 0x74, 0xd9, 0x4d, 0xaa, 0x55, 0x92, 0x8f, 0xf6, 0x9c, 0x25, 0xc6, 0x52, 0x37, 0x5f, 0x43, 0x48, 0xed, 0xce, 0xf7, 0xdd, 0x8e, 0xaf, 0x52, 0x7c, 0x9b, 0xd8, 0x76, 0xb2, - 0xe1, 0x8a, 0x1c, 0x3d, 0x39, 0x13, 0x0f, 0xb3, 0x84, 0x3d, 0x04, 0x2d, 0xa1, 0x09, 0xa7, 0xfe, 0x56, 0xf1, 0xc8, 0xbf, 0x8b, 0x3f, 0xfe, 0x5d, 0xfc, 0xf1, 0xef, 0xe2, 0x8f, 0x61, 0xc5, 0x1f, - 0x67, 0x88, 0x8d, 0x73, 0x69, 0xfc, 0x63, 0xcb, 0xe8, 0xa9, 0x65, 0xe4, 0x17, 0xdd, 0x37, 0xe4, 0x97, 0xcb, 0xd9, 0x18, 0x1d, 0xb6, 0x8c, 0xac, 0x12, 0x0d, 0xd4, 0x53, 0xc6, 0x60, 0x75, 0x75, - 0x45, 0xf2, 0x21, 0xd6, 0x2d, 0x46, 0x29, 0xb6, 0x9a, 0x2d, 0x0e, 0x47, 0x0c, 0xc3, 0x00, 0xcf, 0xa3, 0x98, 0x35, 0x3f, 0x29, 0xa7, 0xd2, 0x22, 0x30, 0x56, 0xd2, 0x5a, 0x55, 0x01, 0x97, 0xe0, - 0x78, 0x63, 0x41, 0x1b, 0xb5, 0x93, 0xbb, 0x6b, 0xad, 0x5e, 0x42, 0x52, 0x7a, 0x4c, 0x43, 0x51, 0x88, 0x9b, 0x65, 0x32, 0x9d, 0x86, 0x1a, 0x30, 0x9b, 0x45, 0x83, 0xb4, 0x85, 0x97, 0xdf, 0x7a, - 0x01, 0x15, 0x79, 0xcc, 0x92, 0x67, 0x70, 0xd3, 0x3f, 0x12, 0x7e, 0xe3, 0xc9, 0xeb, 0xe9, 0xd9, 0x79, 0x31, 0x20, 0x37, 0xcb, 0x5d, 0x6b, 0xc1, 0x64, 0xb6, 0xc9, 0xd7, 0x7b, 0x69, 0x53, 0x1c, - 0x98, 0x69, 0x10, 0x2a, 0x72, 0x24, 0x03, 0xed, 0x3a, 0xac, 0x5a, 0x76, 0x37, 0x3a, 0x4e, 0xa5, 0x79, 0xc3, 0x2f, 0x5d, 0xca, 0xe1, 0x20, 0xa0, 0x6a, 0x44, 0x8e, 0xaa, 0xfa, 0xdd, 0x2e, 0xf6, - 0x26, 0x51, 0xa3, 0x58, 0x23, 0xa1, 0x22, 0x8f, 0x66, 0xb3, 0x5d, 0x72, 0x46, 0x56, 0x14, 0xfc, 0x5e, 0x8e, 0xa0, 0x70, 0x3e, 0x81, 0x24, 0xfd, 0xb9, 0xea, 0xf8, 0xf2, 0xa6, 0xc2, 0x16, 0x86, - 0xee, 0x01, 0xd6, 0x7e, 0xd1, 0x91, 0xea, 0x4e, 0x4b, 0x9f, 0x1f, 0x37, 0x7c, 0x7e, 0xa5, 0xfa, 0xcc, 0x34, 0x2d, 0x1f, 0xf4, 0xf6, 0x81, 0x07, 0xc1, 0x7a, 0x9c, 0x1d, 0xb4, 0x60, 0xde, 0x93, - 0x19, 0x81, 0x47, 0x88, 0xb3, 0x33, 0xad, 0x8a, 0xa5, 0xd5, 0x85, 0xb7, 0x8e, 0xba, 0x4e, 0x1b, 0x4d, 0xed, 0x04, 0xdb, 0x4b, 0xc1, 0xb1, 0x76, 0x26, 0xd0, 0x5c, 0x07, 0x38, 0x50, 0xc2, 0x47, - 0x0a, 0x82, 0xa3, 0xab, 0x14, 0xd2, 0x55, 0xbf, 0x53, 0x43, 0x90, 0x59, 0xb7, 0x29, 0xc1, 0x01, 0xc2, 0x5c, 0xd9, 0xb1, 0x5b, 0xba, 0x8e, 0x4e, 0x9d, 0xe8, 0xd6, 0xda, 0x48, 0xfb, 0x03, 0xb7, - 0xc6, 0x59, 0x5c, 0xce, 0x49, 0x28, 0x0f, 0xb5, 0xd8, 0xa7, 0x8c, 0x99, 0x77, 0xb2, 0x6f, 0x22, 0x79, 0x69, 0xe3, 0x3c, 0xb0, 0x81, 0x73, 0x56, 0xad, 0x24, 0x2d, 0x54, 0xb6, 0x2a, 0xb3, 0x81, - 0x37, 0xec, 0x74, 0xab, 0x6a, 0x09, 0xb1, 0x6b, 0x8a, 0x03, 0x5a, 0x24, 0x7a, 0xec, 0xb9, 0x09, 0xb6, 0xe1, 0xb7, 0x11, 0x81, 0xce, 0xa1, 0x0d, 0x69, 0xce, 0x89, 0x02, 0x11, 0xc0, 0x26, 0xb5, - 0x7c, 0xb9, 0xef, 0xe4, 0x69, 0x0f, 0x1c, 0x8f, 0x2b, 0x2e, 0xe4, 0xf6, 0x35, 0x82, 0x67, 0x82, 0x60, 0x4c, 0x53, 0x6b, 0x15, 0x72, 0xea, 0x7c, 0xbd, 0x18, 0x64, 0x32, 0xdf, 0x45, 0xae, 0xba, - 0x9d, 0xa4, 0x4f, 0x58, 0xcb, 0x0f, 0x11, 0xab, 0xd0, 0x61, 0x85, 0x6a, 0xbd, 0x41, 0x4e, 0x73, 0x6a, 0x35, 0x53, 0xa0, 0xdc, 0x08, 0xfc, 0x1d, 0x6d, 0xc0, 0x5e, 0xb6, 0x5e, 0xb0, 0xfc, 0x61, - 0xd3, 0xba, 0xe5, 0x89, 0xe0, 0x55, 0xb9, 0x3d, 0x22, 0xcb, 0x63, 0x43, 0x23, 0x0b, 0x8c, 0x2f, 0x5b, 0x43, 0x3b, 0x4a, 0x54, 0x1c, 0x6f, 0x7d, 0x68, 0x73, 0x6a, 0x47, 0x4b, 0x3a, 0xf1, 0x2c, - 0x31, 0x5c, 0xa4, 0x30, 0x0c, 0x37, 0xbb, 0xd9, 0x66, 0xe9, 0xd9, 0xc7, 0x95, 0xb4, 0x9d, 0x3f, 0xa7, 0xc7, 0x7e, 0x46, 0xa8, 0xba, 0x18, 0xbc, 0x0f, 0xe4, 0xab, 0x7b, 0x43, 0x88, 0xb8, 0xef, - 0x7b, 0x80, 0x9e, 0x5a, 0xf2, 0x2e, 0x44, 0xcf, 0xac, 0xbc, 0x1c, 0x9e, 0x8b, 0xb8, 0x07, 0x2c, 0x75, 0x22, 0x8a, 0xd8, 0xa2, 0x23, 0xcc, 0x96, 0x55, 0x7a, 0x72, 0x2b, 0x56, 0xed, 0xcc, 0xdc, - 0x44, 0xb3, 0xd5, 0xf4, 0xd4, 0x13, 0x47, 0xbf, 0x12, 0x54, 0x3f, 0xd0, 0xe7, 0x4a, 0xa3, 0xe1, 0x0a, 0x5b, 0x82, 0x07, 0x80, 0xe1, 0xd7, 0x78, 0x0d, 0xea, 0x3a, 0x91, 0x1f, 0x08, 0x08, 0x6b, - 0xf7, 0xc1, 0x11, 0xcf, 0x57, 0xd6, 0x6c, 0xa2, 0x59, 0x9c, 0x99, 0xee, 0x16, 0xca, 0x9a, 0xcb, 0x46, 0x72, 0xbd, 0x7f, 0x8e, 0x8f, 0x1f, 0x33, 0x44, 0xcb, 0x5f, 0x10, 0x1a, 0x57, 0xea, 0x7d, - 0xea, 0x9b, 0xc9, 0x2f, 0x84, 0x8d, 0x4b, 0x51, 0xd0, 0x7d, 0x3e, 0xe7, 0xa6, 0xd7, 0x3d, 0xf4, 0x76, 0x3d, 0xe5, 0xe0, 0x79, 0xa1, 0xf8, 0xc2, 0xe1, 0x97, 0xff, 0x43, 0xb3, 0xe5, 0x35, 0x77, - 0x34, 0x95, 0x1b, 0xca, 0x05, 0xc0, 0x14, 0x81, 0x4b, 0x7b, 0x6d, 0x31, 0x9c, 0xa8, 0x88, 0xf1, 0x4e, 0x5b, 0xd3, 0x60, 0x83, 0xd0, 0x0e, 0x1b, 0x2f, 0x14, 0xc7, 0x37, 0x93, 0xbe, 0x98, 0xb9, - 0x45, 0x9d, 0xc1, 0x9a, 0x1d, 0x8b, 0xab, 0x0c, 0xe0, 0x0e, 0x69, 0xdf, 0x4b, 0x40, 0x4d, 0xf4, 0xb9, 0xd0, 0xad, 0x62, 0x8c, 0x2e, 0x90, 0xe9, 0x6e, 0x86, 0xae, 0x96, 0x74, 0xb3, 0x70, 0xb2, - 0x4f, 0x59, 0xbe, 0x97, 0x5e, 0xc7, 0x8f, 0xb4, 0x8a, 0xdf, 0x07, 0x6e, 0xd6, 0xf3, 0xb3, 0xb7, 0x25, 0x77, 0xcf, 0x5a, 0xc4, 0x00, 0xb0, 0xe6, 0x09, 0xb1, 0x9d, 0x4a, 0x74, 0xc6, 0x80, 0x5a, - 0x0b, 0xe3, 0x87, 0x46, 0xdc, 0x96, 0x53, 0x67, 0xd5, 0xfa, 0x75, 0x70, 0x08, 0x51, 0x04, 0x3e, 0x50, 0x8d, 0x43, 0x73, 0xce, 0x71, 0x84, 0x43, 0xf2, 0x2c, 0x53, 0xf3, 0xa3, 0xed, 0xe0, 0x9b, - 0x7c, 0x2d, 0x1d, 0x91, 0x0d, 0xbb, 0x11, 0x1a, 0x6a, 0x8b, 0x2e, 0x36, 0x3c, 0x99, 0x86, 0xe2, 0x04, 0x41, 0x8e, 0x2d, 0x31, 0x9d, 0x6c, 0x6d, 0x81, 0x62, 0xeb, 0x41, 0x5a, 0x44, 0xee, 0xbe, - 0xb5, 0x63, 0x78, 0x34, 0xd2, 0xd0, 0x33, 0x43, 0x7d, 0xa1, 0x7a, 0x61, 0xc2, 0xf9, 0x70, 0x7c, 0x21, 0xf5, 0x3d, 0x2b, 0x92, 0x89, 0x9c, 0x74, 0x58, 0xc9, 0x33, 0xe8, 0x76, 0x03, 0x2c, 0x84, - 0x13, 0x35, 0xe3, 0x31, 0xb9, 0x0f, 0x7c, 0xfd, 0x74, 0xdc, 0xc2, 0x13, 0x79, 0x73, 0x58, 0xe4, 0x26, 0x57, 0x96, 0xab, 0xcc, 0xb0, 0x2c, 0x82, 0xdc, 0xe7, 0xf1, 0x6c, 0xe4, 0x30, 0xfd, 0x04, - 0xf7, 0xf9, 0x89, 0x68, 0x80, 0x58, 0x5a, 0x93, 0x4c, 0x1d, 0x4e, 0x5c, 0x09, 0x24, 0x51, 0xc2, 0x5a, 0x85, 0x45, 0xa8, 0xd5, 0x89, 0xf2, 0xdc, 0x84, 0x2a, 0xd2, 0xdc, 0x8f, 0x4b, 0xe7, 0x55, - 0xc5, 0xff, 0xfb, 0xba, 0x79, 0xd6, 0x0d, 0x1b, 0x73, 0xbd, 0x1b, 0x57, 0xf1, 0x85, 0x6d, 0x8f, 0xac, 0xdc, 0x67, 0x18, 0xf9, 0x4e, 0xf7, 0xcc, 0xcb, 0xf7, 0xb3, 0xb3, 0x95, 0x3b, 0x80, 0x9b, - 0x2c, 0xd3, 0xb5, 0x89, 0xa0, 0x1c, 0xd4, 0x8e, 0xe2, 0xb0, 0xa2, 0x54, 0x6d, 0x6c, 0xbe, 0x72, 0x63, 0x0b, 0x9d, 0x27, 0x76, 0x33, 0x5b, 0xe2, 0x3d, 0x67, 0x39, 0x99, 0x30, 0x3a, 0x31, 0x41, - 0x1c, 0x1e, 0x23, 0x92, 0xee, 0x01, 0x53, 0x9e, 0xa4, 0x0e, 0x91, 0x03, 0xa6, 0x8c, 0xee, 0x33, 0x0c, 0x2c, 0x36, 0x40, 0x0a, 0x2e, 0x4f, 0x66, 0xa0, 0xce, 0xe7, 0x62, 0xb3, 0x45, 0x98, 0x45, - 0xbe, 0xec, 0x86, 0xe4, 0x7d, 0xeb, 0x79, 0x7e, 0xf1, 0x31, 0x3c, 0x14, 0xab, 0x67, 0x98, 0xe1, 0x3b, 0x97, 0x15, 0xe4, 0xe5, 0xe0, 0x22, 0x51, 0xdf, 0xb3, 0x00, 0xa1, 0x0e, 0xbd, 0xdd, 0x4e, - 0xb9, 0xe9, 0x82, 0x91, 0x02, 0x8a, 0xe1, 0x98, 0xce, 0xc7, 0x00, 0x04, 0x32, 0x09, 0x66, 0x65, 0xb8, 0x06, 0x98, 0x31, 0x5d, 0xde, 0x4e, 0xd8, 0x7d, 0x2b, 0x5a, 0xa0, 0x4e, 0x35, 0x1e, 0x6a, - 0x92, 0xf0, 0x21, 0xe0, 0x0c, 0x58, 0x73, 0xa6, 0x6a, 0x95, 0x24, 0x6e, 0xce, 0xe5, 0xa1, 0x30, 0x35, 0x95, 0x2c, 0x26, 0x27, 0xf9, 0x72, 0xc2, 0xb0, 0x47, 0xc5, 0x54, 0x07, 0xcd, 0xad, 0xe2, - 0x21, 0x1e, 0x3c, 0x7c, 0x85, 0x9c, 0x34, 0x98, 0x01, 0xc5, 0x19, 0x0a, 0xfe, 0xe5, 0xdf, 0xd9, 0x73, 0x3b, 0xc0, 0x5d, 0x45, 0x6e, 0xd9, 0xbd, 0x4b, 0x6f, 0x67, 0xfe, 0xba, 0x98, 0x80, 0x09, - 0x2c, 0xdb, 0x44, 0x9a, 0xd6, 0x29, 0x52, 0xd8, 0x3b, 0x56, 0xdb, 0xca, 0x1c, 0x8a, 0x9a, 0xd6, 0xb6, 0x50, 0xa6, 0x0b, 0x87, 0x9f, 0xab, 0xea, 0x71, 0x23, 0x30, 0xfb, 0x1d, 0x55, 0xf8, 0x7b, - 0x5d, 0x16, 0xf7, 0x1c, 0x74, 0x8c, 0xe3, 0x51, 0x94, 0x1d, 0x21, 0xc1, 0xd9, 0x1d, 0x91, 0x1e, 0xa1, 0xf7, 0xf3, 0x7e, 0x9b, 0xe2, 0x9e, 0x3c, 0xec, 0xe5, 0xcb, 0xfc, 0x9c, 0xd0, 0xfc, 0x58, - 0x13, 0x84, 0x9f, 0xdb, 0x46, 0x3e, 0x10, 0x3e, 0x33, 0xe3, 0xd7, 0xe9, 0x99, 0x29, 0x03, 0x26, 0xc5, 0x11, 0x2f, 0xb9, 0x06, 0xea, 0x4a, 0x45, 0x2b, 0x27, 0x41, 0xc6, 0x99, 0x82, 0x38, 0x12, - 0xa4, 0xd2, 0x56, 0xa1, 0x5d, 0xc5, 0xaf, 0xa7, 0x07, 0x10, 0xae, 0xaa, 0x55, 0xb9, 0x96, 0xa0, 0x6d, 0x8d, 0x4d, 0x03, 0x4d, 0x5a, 0xaf, 0xdd, 0x89, 0xe9, 0x1b, 0x9b, 0x86, 0x59, 0x25, 0x0d, - 0xd1, 0xf5, 0x47, 0x71, 0x64, 0xcf, 0x4c, 0x88, 0x98, 0x47, 0x1b, 0x46, 0xd4, 0x43, 0xd0, 0x48, 0x11, 0x2c, 0x7f, 0x04, 0x8d, 0x7f, 0xc3, 0x94, 0x2e, 0x36, 0x4f, 0xfe, 0xe3, 0xf6, 0xa0, 0xcf, - 0xc4, 0xf6, 0xde, 0x88, 0x9e, 0x99, 0x71, 0x39, 0x1c, 0xda, 0xac, 0x55, 0xb0, 0xfd, 0xa9, 0xc0, 0xa2, 0xa5, 0xec, 0x81, 0x87, 0x4c, 0x45, 0x98, 0xd6, 0xd3, 0xf0, 0xa9, 0xc5, 0x01, 0x51, 0xb3, - 0x73, 0x6b, 0xe3, 0xb8, 0xd2, 0xb7, 0xbc, 0x2e, 0x9f, 0x46, 0x46, 0xe1, 0x9d, 0x02, 0x70, 0x3b, 0x31, 0x1d, 0xd6, 0x74, 0x0f, 0xfa, 0x29, 0xb7, 0xc9, 0x20, 0x67, 0x1b, 0xbd, 0xd4, 0xd6, 0x46, - 0x3f, 0x5a, 0x26, 0x4b, 0xeb, 0xb0, 0x69, 0xf3, 0xb5, 0x1f, 0xc1, 0x5c, 0xb0, 0x1f, 0x16, 0x49, 0x2a, 0x93, 0xc8, 0x37, 0xc7, 0x45, 0x68, 0xdb, 0x8f, 0x5b, 0x26, 0x3c, 0x25, 0x1d, 0x1f, 0x08, - 0xbf, 0x30, 0xe4, 0xc3, 0xe9, 0x50, 0x95, 0xe3, 0xc4, 0x0b, 0x01, 0x9d, 0xcd, 0x3c, 0x3c, 0x6d, 0x41, 0x6d, 0xcf, 0x2f, 0x47, 0xa8, 0x64, 0xf4, 0x89, 0x2f, 0x03, 0xb1, 0x72, 0x62, 0x67, 0x7b, - 0xbe, 0xb2, 0xe0, 0xaa, 0x8e, 0x57, 0x59, 0x45, 0x43, 0x40, 0x3b, 0xd1, 0xf1, 0xb9, 0x74, 0xe4, 0x56, 0x0a, 0x38, 0x33, 0xfb, 0x6c, 0x0d, 0x4a, 0x31, 0x86, 0x27, 0x07, 0x40, 0x51, 0x24, 0x68, - 0x63, 0xa8, 0x6b, 0x3d, 0x38, 0xa6, 0x29, 0xb2, 0x9c, 0x96, 0x9f, 0x30, 0x0c, 0x1e, 0xb6, 0xe6, 0x78, 0xc4, 0x8b, 0xdf, 0x6f, 0x67, 0x77, 0xff, 0x11, 0x2f, 0x5c, 0xb9, 0x7b, 0xe3, 0xcc, 0x9f, - 0x01, 0x1d, 0xef, 0x68, 0x8e, 0x06, 0xd7, 0x3e, 0x8f, 0x62, 0xb6, 0x9f, 0xda, 0xbd, 0xbf, 0x55, 0xa0, 0x8d, 0x28, 0x02, 0x5b, 0xc5, 0xa1, 0x55, 0xb0, 0xa8, 0x9c, 0xe5, 0x56, 0x8b, 0x82, 0xad, - 0x5b, 0xef, 0x8a, 0x44, 0x85, 0xcb, 0xac, 0x35, 0x4b, 0xc9, 0x9e, 0x6d, 0xed, 0x60, 0x6f, 0x3a, 0x7c, 0xd9, 0x1e, 0xd6, 0xd9, 0x5c, 0xe1, 0x20, 0xb5, 0x95, 0x88, 0x22, 0x85, 0x85, 0x7c, 0x4b, - 0xee, 0x53, 0xf6, 0x80, 0x15, 0x9f, 0x55, 0xb2, 0xba, 0xf6, 0x93, 0x07, 0xec, 0x20, 0xae, 0x50, 0xe5, 0x86, 0xb3, 0xa3, 0xf6, 0x93, 0xf3, 0xdb, 0xd7, 0x7e, 0x32, 0x26, 0x3e, 0x01, 0xfb, 0xde, - 0x7d, 0x59, 0x65, 0x16, 0x72, 0x87, 0x5a, 0xa8, 0x1a, 0xa6, 0xdb, 0xac, 0x11, 0xd1, 0x21, 0x8d, 0xc9, 0x7e, 0x4d, 0x6a, 0xc7, 0x48, 0xeb, 0x61, 0x67, 0x47, 0xb9, 0x35, 0x8c, 0x58, 0x58, 0x7f, - 0x5c, 0x58, 0xa1, 0x0d, 0x64, 0x88, 0x2b, 0x06, 0x51, 0x4b, 0xea, 0x76, 0x45, 0x81, 0xe9, 0x01, 0xa4, 0xfb, 0x62, 0x22, 0xee, 0xb9, 0xad, 0xeb, 0x64, 0xd9, 0xfc, 0x78, 0xca, 0x3b, 0x1b, 0x9a, - 0x32, 0x21, 0xad, 0xb8, 0xcd, 0x00, 0x2f, 0xf1, 0xab, 0xfa, 0x7d, 0xa7, 0x59, 0xca, 0xc7, 0xbc, 0x9a, 0x9b, 0x5b, 0xd7, 0x15, 0xda, 0xff, 0x78, 0xfa, 0xcb, 0xc7, 0x6a, 0xf0, 0xe1, 0x7c, 0xff, - 0x9c, 0xfe, 0x82, 0x0e, 0xf3, 0x6c, 0x88, 0xf2, 0x7e, 0xc1, 0x56, 0x5b, 0x15, 0xb1, 0xe9, 0x52, 0x5a, 0x89, 0x75, 0xcc, 0x1f, 0xf0, 0x95, 0x79, 0xb2, 0x4b, 0x28, 0x00, 0xcb, 0x89, 0x50, 0x09, - 0xc5, 0xa2, 0x17, 0xc5, 0xbe, 0xb0, 0x4f, 0xf4, 0x04, 0x3e, 0x86, 0x44, 0xa6, 0x3a, 0x8b, 0xa5, 0x38, 0xf7, 0x8b, 0x46, 0xcb, 0x96, 0x35, 0xbb, 0x67, 0x76, 0xac, 0xe0, 0x6a, 0x23, 0x9c, 0x01, - 0x6a, 0x8a, 0xe7, 0x3d, 0xdb, 0x6b, 0x5a, 0xe7, 0xf4, 0x29, 0xfd, 0xe5, 0xdf, 0x79, 0x2e, 0x43, 0xf3, 0x5c, 0x7e, 0xbd, 0xf7, 0x7f, 0x7c, 0xfc, 0xff, 0x36, 0x63, 0x0d, 0x3d, 0xd4, 0x63, 0xd3, - 0xb6, 0xc6, 0x5f, 0xd9, 0xe7, 0xcf, 0xf5, 0x6e, 0xb9, 0x26, 0x0d, 0x8c, 0x6f, 0x2e, 0x0c, 0xe9, 0xe5, 0x72, 0xd6, 0x04, 0x93, 0xad, 0xad, 0x0a, 0xa0, 0xc2, 0xed, 0x30, 0xdc, 0xe3, 0xa1, 0x59, - 0x64, 0x68, 0xc5, 0x1a, 0xed, 0xf4, 0x4c, 0xc5, 0xcb, 0xc0, 0x67, 0x43, 0xa3, 0x95, 0xe9, 0xa3, 0x90, 0xb2, 0xe0, 0x7a, 0x3f, 0x1d, 0x51, 0xb6, 0x86, 0x1a, 0xf2, 0x4c, 0xd7, 0xc0, 0x59, 0xdc, - 0x96, 0x60, 0xd9, 0xc2, 0x5c, 0x9e, 0xca, 0xe9, 0xbe, 0x91, 0x74, 0xb1, 0x59, 0x86, 0xcb, 0xed, 0x7c, 0xe5, 0x1d, 0xd4, 0x89, 0x38, 0x44, 0x19, 0x36, 0xf4, 0xc2, 0xc6, 0xd0, 0xc7, 0x8d, 0x5e, - 0xa1, 0x9f, 0x93, 0x27, 0x16, 0xb4, 0x77, 0xaa, 0x67, 0x86, 0xbc, 0x1e, 0x8f, 0xcf, 0xb4, 0xbe, 0xe7, 0xc5, 0x6c, 0x9d, 0xea, 0x87, 0x90, 0x8d, 0x89, 0x12, 0xdd, 0xee, 0x0c, 0x81, 0xa5, 0xba, - 0x91, 0x31, 0x19, 0xad, 0xd7, 0x6e, 0x2d, 0xa3, 0x75, 0x5e, 0xd0, 0x44, 0x6d, 0xd4, 0xb9, 0xe1, 0x4b, 0xab, 0xb4, 0xc0, 0x9d, 0x35, 0xad, 0x9c, 0x82, 0x13, 0x9d, 0x77, 0x58, 0xe0, 0x83, 0xb9, - 0xba, 0x0a, 0x28, 0xf0, 0xd4, 0x1b, 0xbc, 0x2d, 0x6e, 0x9a, 0xbe, 0xcd, 0x08, 0xbf, 0x4b, 0x13, 0x14, 0xca, 0xec, 0xfd, 0xa7, 0x90, 0xbe, 0xe1, 0xc7, 0x7a, 0xde, 0x8d, 0xed, 0xb6, 0xb4, 0xe3, - 0x97, 0x97, 0x7d, 0x1c, 0x03, 0x7c, 0x06, 0x95, 0xe7, 0x13, 0xf5, 0x17, 0x46, 0xdc, 0x5e, 0x1b, 0xc3, 0xc3, 0x60, 0x77, 0x02, 0xda, 0x2c, 0x57, 0xc0, 0x72, 0x27, 0x19, 0xc7, 0x64, 0xd5, 0x9d, - 0x12, 0x9b, 0x35, 0x3c, 0x2d, 0x15, 0x42, 0x9e, 0xcc, 0x18, 0xde, 0x6c, 0xb4, 0xd5, 0x7a, 0x95, 0xb8, 0x28, 0x3c, 0x9f, 0xb0, 0xb4, 0xa8, 0x36, 0x92, 0xb2, 0xb5, 0x02, 0x8a, 0xb5, 0x7c, 0x2f, - 0x08, 0x40, 0x3a, 0x8c, 0x3d, 0x5b, 0xc2, 0x8d, 0xd0, 0x50, 0x30, 0x8b, 0x15, 0x74, 0x87, 0x9f, 0xf9, 0x5b, 0x22, 0x49, 0xa4, 0x47, 0x18, 0x31, 0xb7, 0x3c, 0x2a, 0x73, 0xfb, 0xa1, 0x7f, 0xf0, - 0xc9, 0x19, 0xf3, 0x4a, 0xf4, 0xc2, 0x91, 0xf3, 0xe1, 0xd0, 0x59, 0xb2, 0x13, 0x38, 0x57, 0xe1, 0x9a, 0x60, 0xa6, 0xab, 0xcc, 0x84, 0x00, 0xb7, 0x5a, 0x8c, 0x6c, 0x74, 0x73, 0xe7, 0x06, 0x55, - 0x9e, 0x1b, 0x5c, 0x64, 0xe3, 0xc7, 0x23, 0x7f, 0x60, 0xb6, 0xdb, 0x1d, 0x1e, 0x45, 0xe5, 0x01, 0x93, 0x24, 0xd9, 0x03, 0xe7, 0x2e, 0x92, 0x36, 0x4b, 0x33, 0x2e, 0x25, 0x1c, 0xa7, 0xe7, 0xf9, - 0x1a, 0xda, 0x80, 0x7c, 0x7b, 0x32, 0xec, 0x32, 0x30, 0x13, 0xad, 0xdf, 0x35, 0xeb, 0x4f, 0xfb, 0xbb, 0x91, 0xeb, 0xa6, 0x3d, 0xb6, 0xdb, 0x54, 0x8f, 0x8b, 0xc7, 0x56, 0xf3, 0x39, 0x23, 0xea, - 0x89, 0x99, 0x71, 0x4d, 0xfc, 0x85, 0x09, 0xd7, 0x57, 0x2e, 0xa9, 0x56, 0x03, 0xa6, 0x89, 0x4f, 0x55, 0x22, 0x4b, 0x2f, 0xdc, 0x9c, 0xd5, 0x70, 0x16, 0xae, 0xe7, 0x4b, 0x60, 0xd2, 0xa6, 0x3d, - 0x88, 0xf7, 0x5b, 0x96, 0x04, 0x41, 0x25, 0xad, 0xdc, 0xcc, 0x8b, 0x0e, 0xe5, 0x2e, 0xe2, 0x04, 0x6c, 0x02, 0x11, 0x11, 0x55, 0xc9, 0x5c, 0x22, 0x1c, 0x16, 0xa1, 0x35, 0x27, 0x43, 0xd0, 0x85, - 0x08, 0xbc, 0x72, 0x92, 0xde, 0xd2, 0x59, 0x77, 0xbf, 0x36, 0x0f, 0x0b, 0x03, 0x83, 0x32, 0xe6, 0x51, 0x97, 0xe8, 0x6f, 0x54, 0x82, 0x4f, 0xeb, 0xeb, 0x1d, 0xdd, 0xc0, 0x4c, 0x62, 0x53, 0x2f, - 0xc7, 0xd1, 0xd9, 0xf0, 0xfc, 0x0b, 0x7c, 0xec, 0x46, 0x3d, 0xf3, 0xe3, 0x91, 0xc8, 0x21, 0xcf, 0x89, 0xdc, 0x99, 0xe4, 0x1b, 0xaf, 0x8b, 0x73, 0xb2, 0xd6, 0x00, 0x71, 0x33, 0x88, 0x2a, 0x1a, - 0x6d, 0x20, 0xb9, 0xe7, 0x90, 0x3d, 0xbd, 0xed, 0x6b, 0x2f, 0xc2, 0xdc, 0x65, 0x0f, 0x75, 0x8e, 0x62, 0x90, 0x25, 0x76, 0x50, 0x42, 0x73, 0xbe, 0x9e, 0xd5, 0x45, 0x94, 0x51, 0xc7, 0xe3, 0xa2, - 0x41, 0xb1, 0x1e, 0x83, 0xb1, 0x70, 0x17, 0x4c, 0x03, 0xa8, 0x9b, 0x8b, 0x7b, 0x04, 0x61, 0x27, 0xec, 0x28, 0x24, 0xa5, 0xf4, 0xc8, 0x89, 0xd0, 0x89, 0x08, 0x47, 0x38, 0xc1, 0xea, 0xe0, 0x73, - 0x1c, 0x76, 0xfc, 0x30, 0x1c, 0xe7, 0x7a, 0xec, 0xbe, 0x01, 0x23, 0x3f, 0x66, 0x5f, 0xe5, 0x38, 0x0f, 0xf3, 0xdf, 0xb0, 0xab, 0x1a, 0xb9, 0xc1, 0xec, 0x3b, 0x93, 0x7c, 0x61, 0xdf, 0xf9, 0x60, - 0x7c, 0xa6, 0xf2, 0x3d, 0xfb, 0x16, 0x8a, 0x4f, 0xa5, 0x7c, 0x5b, 0x36, 0xfe, 0xf1, 0xc8, 0xce, 0x8f, 0x86, 0x69, 0x28, 0x4b, 0xf3, 0x18, 0xcc, 0xe5, 0xdd, 0x92, 0x8a, 0xa7, 0x5d, 0x06, 0xa4, - 0xf4, 0xe2, 0xa4, 0x84, 0xd3, 0x09, 0x30, 0x6b, 0x7b, 0x1a, 0x8a, 0x75, 0xd2, 0x2c, 0x79, 0xfc, 0x20, 0x60, 0x44, 0xee, 0x73, 0x80, 0xbb, 0xd9, 0xd2, 0x07, 0xbc, 0xb0, 0x72, 0xce, 0xe8, 0x08, - 0x2f, 0x71, 0x66, 0xf4, 0xa1, 0xaa, 0x32, 0x61, 0x40, 0x1a, 0xc3, 0xc7, 0x2d, 0xed, 0x45, 0x10, 0x6f, 0x90, 0x9c, 0x7d, 0xdb, 0xb6, 0xf1, 0x09, 0xfa, 0x7a, 0x13, 0xfe, 0x9a, 0x8f, 0xe7, 0x60, - 0xfb, 0x57, 0x2b, 0xc0, 0x93, 0xcc, 0x3c, 0xd3, 0xfd, 0xc5, 0xd1, 0x73, 0x48, 0x7f, 0x60, 0x8e, 0x25, 0x27, 0x99, 0xda, 0x5c, 0x35, 0xa8, 0x75, 0x39, 0x4f, 0x70, 0xc3, 0xcb, 0xe6, 0x05, 0x36, - 0xc1, 0x40, 0xb6, 0xb3, 0x50, 0x4d, 0x4f, 0xea, 0x63, 0x28, 0x00, 0xa7, 0xe9, 0x0e, 0xf1, 0x82, 0x9d, 0xba, 0x00, 0xfa, 0x66, 0x8f, 0xaf, 0xc9, 0x9d, 0xb5, 0x5d, 0xa3, 0xee, 0xb2, 0x04, 0x8c, - 0xbe, 0xd9, 0x4e, 0x39, 0x43, 0x9e, 0x64, 0x89, 0x31, 0x5a, 0x4c, 0x82, 0xaa, 0x38, 0x16, 0x06, 0x78, 0x90, 0xd6, 0xf0, 0x90, 0xdd, 0xe0, 0x63, 0x1b, 0xc6, 0x7f, 0x6e, 0x3b, 0x78, 0xa7, 0x0a, - 0x8c, 0x7f, 0x1d, 0x0f, 0xdd, 0x10, 0x70, 0x61, 0xb4, 0x30, 0x28, 0xdf, 0xcb, 0xc9, 0xc9, 0x9e, 0x31, 0x16, 0x07, 0xbb, 0x30, 0xcb, 0x26, 0x52, 0xd6, 0xba, 0x8d, 0xe5, 0x82, 0xbf, 0xec, 0xa3, - 0x1e, 0xf2, 0xcd, 0xdc, 0xde, 0xaf, 0x46, 0xa0, 0x3e, 0xc3, 0x37, 0x2b, 0xa7, 0xca, 0xbc, 0x79, 0x91, 0xc0, 0xca, 0x34, 0x36, 0x53, 0x73, 0x51, 0xf6, 0x9c, 0x54, 0xf6, 0x9a, 0x03, 0x4b, 0x0c, - 0x53, 0xd9, 0xfb, 0x15, 0xa3, 0x1c, 0x8a, 0x2c, 0x1f, 0x20, 0x62, 0x6f, 0x75, 0xf1, 0x1f, 0xbb, 0x52, 0xde, 0x16, 0x12, 0xd8, 0xe5, 0xf8, 0x65, 0x7b, 0xf3, 0xe3, 0xc2, 0x37, 0xdf, 0x97, 0xc4, - 0x07, 0x4e, 0xda, 0x97, 0x17, 0x2f, 0xfc, 0xf2, 0x8b, 0x65, 0xef, 0x19, 0x17, 0xed, 0x3b, 0xd5, 0x57, 0xd6, 0x9e, 0x8f, 0xcf, 0xd1, 0xa3, 0x01, 0x4a, 0x87, 0x48, 0x90, 0xc1, 0xac, 0xd0, 0xea, - 0xe3, 0x76, 0xb4, 0x5b, 0xd2, 0xea, 0x12, 0x82, 0x3c, 0x96, 0x92, 0xe6, 0x35, 0x8e, 0x1e, 0x14, 0x0c, 0x3f, 0xa8, 0xfe, 0x64, 0xb5, 0x5a, 0xf0, 0xfb, 0x65, 0xb6, 0x81, 0x91, 0x49, 0x41, 0x46, - 0x81, 0x86, 0x8e, 0xb2, 0x76, 0xca, 0x55, 0x75, 0x58, 0x4c, 0xfc, 0xba, 0xe3, 0xe7, 0xbc, 0x59, 0xb6, 0x28, 0xd6, 0x4a, 0x1b, 0x09, 0xd1, 0x95, 0x6a, 0x8e, 0x17, 0xc5, 0xa3, 0x40, 0xf9, 0x0d, - 0x2f, 0x22, 0x3b, 0x34, 0xf5, 0x87, 0x8e, 0xff, 0xe7, 0x72, 0x0d, 0xdf, 0xa9, 0x9e, 0x79, 0xf1, 0x7a, 0x3c, 0x34, 0xd7, 0x70, 0x03, 0x13, 0x5b, 0x85, 0x84, 0x70, 0x30, 0x6e, 0xf6, 0x5b, 0x0c, - 0x51, 0x83, 0x32, 0x9c, 0x0b, 0x73, 0xc4, 0x0a, 0x2d, 0x69, 0x96, 0xea, 0x2b, 0xed, 0x78, 0x12, 0x96, 0x50, 0xc5, 0x2d, 0x9c, 0xde, 0x41, 0x72, 0xb9, 0x12, 0x6d, 0x97, 0xd5, 0x59, 0xbb, 0xe8, - 0x6c, 0x7b, 0x74, 0x68, 0xa5, 0xd1, 0x1e, 0xdb, 0xd6, 0x32, 0x2d, 0xed, 0x30, 0x35, 0xb7, 0x04, 0x4b, 0xf6, 0x65, 0x68, 0x82, 0x34, 0xab, 0x21, 0xc8, 0x5c, 0xbf, 0x7e, 0xe9, 0x17, 0x89, 0xf7, - 0xd8, 0x53, 0xb8, 0x3f, 0xd7, 0xa4, 0xaf, 0xb8, 0x72, 0x4e, 0xb4, 0xc7, 0x86, 0x81, 0xff, 0x1c, 0xf2, 0x46, 0x9f, 0x81, 0xf5, 0x7c, 0xad, 0xf7, 0x22, 0x79, 0x8a, 0x41, 0x3f, 0x55, 0x7c, 0x2e, - 0xdd, 0xea, 0xc1, 0x81, 0xde, 0xda, 0xa3, 0x75, 0x20, 0x39, 0x79, 0xe0, 0x99, 0x24, 0xd7, 0xae, 0x4a, 0xa0, 0x8f, 0x8d, 0x3a, 0x64, 0x2d, 0x42, 0x6c, 0x80, 0x9d, 0x1e, 0xe9, 0xfd, 0x64, 0x4e, - 0xa2, 0x7b, 0xc7, 0x2b, 0x90, 0xad, 0x2a, 0x23, 0xc7, 0x69, 0xd4, 0xc8, 0x15, 0x20, 0x22, 0x05, 0x72, 0x78, 0x2e, 0x26, 0xf2, 0x51, 0x70, 0x2e, 0x3d, 0x69, 0xae, 0x11, 0xfc, 0xf5, 0x74, 0x9c, - 0x18, 0xc1, 0x5f, 0x77, 0xdd, 0x13, 0x59, 0xe5, 0x9b, 0xa7, 0x71, 0x98, 0x57, 0x7f, 0xfd, 0xaa, 0xed, 0xb9, 0x3f, 0x53, 0xbd, 0xc7, 0x80, 0x7d, 0xe8, 0x53, 0x11, 0xde, 0xeb, 0x96, 0x43, 0xe8, - 0xb0, 0xd8, 0x6e, 0xb2, 0x8e, 0x0d, 0x6f, 0xd1, 0xc9, 0x4b, 0x2d, 0x55, 0x2b, 0xbb, 0x27, 0x7c, 0x92, 0x8b, 0xba, 0xb9, 0x8e, 0xc6, 0x46, 0x80, 0x2e, 0x05, 0xa9, 0xab, 0x3c, 0x13, 0x68, 0xba, - 0xe9, 0xe9, 0x80, 0x03, 0xfb, 0x9d, 0x68, 0x36, 0x4b, 0x61, 0xba, 0x9b, 0x61, 0x18, 0x21, 0x56, 0x84, 0x7c, 0x12, 0xf0, 0x11, 0xc8, 0xe0, 0xd8, 0x76, 0x23, 0x0b, 0x76, 0xd7, 0x4c, 0xa9, 0x54, - 0x02, 0x31, 0xc8, 0x47, 0x1f, 0xe5, 0xf6, 0x7c, 0xc3, 0xf6, 0xdb, 0x16, 0x43, 0xe8, 0x6d, 0x5b, 0x86, 0x3b, 0x0d, 0x83, 0xf0, 0xf3, 0x67, 0x1e, 0x30, 0x38, 0x39, 0xf9, 0x96, 0xfe, 0x15, 0xb4, - 0xf7, 0xef, 0x6b, 0x30, 0x6f, 0x44, 0xcf, 0x6c, 0xbe, 0x1c, 0x9e, 0x91, 0xbc, 0x07, 0x68, 0x31, 0x74, 0x8e, 0x14, 0xce, 0x5a, 0x16, 0xb1, 0x44, 0x31, 0x03, 0x07, 0x5e, 0x45, 0x6a, 0xb4, 0x58, - 0x39, 0xf6, 0x8e, 0xab, 0x35, 0xd2, 0xb2, 0xdd, 0x96, 0x04, 0xfd, 0x9d, 0x34, 0xb1, 0x0d, 0x78, 0x07, 0x81, 0xd5, 0x62, 0xa5, 0x52, 0xb3, 0x2d, 0x21, 0x90, 0xdd, 0xd1, 0xda, 0xcd, 0xba, 0x9d, - 0x41, 0xb4, 0x1a, 0xdf, 0x23, 0x4c, 0x10, 0x28, 0x6e, 0x30, 0x3d, 0x6d, 0xf6, 0xc5, 0x51, 0xc9, 0xe6, 0xd8, 0xe9, 0xb9, 0x3a, 0xf5, 0x0f, 0x09, 0x06, 0x7f, 0xfd, 0x8d, 0xdc, 0x38, 0x6e, 0x7e, - 0xe9, 0xcd, 0x2f, 0xf7, 0x6e, 0x5b, 0x24, 0x17, 0xe7, 0x02, 0x80, 0xcb, 0x5d, 0xf8, 0xb6, 0x3a, 0xcd, 0x0d, 0x13, 0x63, 0x9c, 0xea, 0xb9, 0x7d, 0xe9, 0xe2, 0xfd, 0xf7, 0xe4, 0x96, 0xf4, 0xb9, - 0xc9, 0xf7, 0xd9, 0x78, 0x7d, 0x0b, 0xdf, 0xff, 0xfd, 0xb9, 0xf9, 0xc6, 0xaf, 0xda, 0xb8, 0xbf, 0x3f, 0xd5, 0xc6, 0x7d, 0x8e, 0xff, 0xff, 0xfd, 0x29, 0xfe, 0x9f, 0xdb, 0xba, 0x65, 0xf9, 0x79, - 0xfa, 0x7a, 0xf7, 0x21, 0x8c, 0xa3, 0x19, 0x26, 0x95, 0xf5, 0xfe, 0x3a, 0x8f, 0xb4, 0xdc, 0xdf, 0x87, 0x70, 0xfc, 0x40, 0xf7, 0x45, 0x4c, 0x7e, 0x9d, 0x9d, 0xf5, 0xdd, 0x01, 0xf8, 0x8d, 0x3b, - 0xbd, 0x23, 0x20, 0x43, 0x29, 0xaa, 0x72, 0x71, 0x3a, 0xb6, 0x6c, 0xcc, 0xc1, 0x6b, 0x30, 0xb7, 0xeb, 0xe9, 0xc4, 0x02, 0x5b, 0x5c, 0x57, 0x8e, 0x08, 0x33, 0x22, 0xa3, 0x88, 0x00, 0x98, 0x78, - 0xd9, 0x17, 0xbb, 0x92, 0x71, 0x6c, 0xf2, 0xb4, 0x31, 0xb5, 0x05, 0x8d, 0x9a, 0xfd, 0x11, 0x24, 0xe4, 0x44, 0x88, 0x31, 0x51, 0x58, 0x87, 0xa3, 0x7c, 0xa9, 0xe9, 0xe4, 0x76, 0xa4, 0xc5, 0xa3, - 0x60, 0x39, 0x40, 0x19, 0xf9, 0x03, 0xcc, 0xf7, 0x34, 0x4f, 0x4c, 0xbb, 0xb8, 0xdc, 0x04, 0xcf, 0xf0, 0x66, 0x57, 0xdf, 0xaf, 0x4a, 0x3f, 0x7c, 0xbb, 0x77, 0xd3, 0xc0, 0xa5, 0xaa, 0x7c, 0xeb, - 0xf5, 0xa9, 0xc8, 0x07, 0xad, 0xe6, 0x83, 0x50, 0xff, 0x3b, 0x59, 0xf8, 0xea, 0x15, 0xfe, 0x9d, 0x2c, 0xfc, 0xd4, 0xa0, 0xfe, 0x5f, 0x96, 0x2c, 0xfc, 0xa8, 0x05, 0xde, 0x6d, 0xf0, 0xf9, 0x09, - 0x05, 0xf7, 0xcb, 0xd6, 0x77, 0x03, 0xab, 0xa9, 0x64, 0x79, 0x4e, 0x89, 0x45, 0x80, 0xfb, 0x15, 0xd0, 0x1a, 0x93, 0x64, 0x7d, 0x30, 0x8b, 0x05, 0xbb, 0x4d, 0xd3, 0x05, 0x1f, 0x17, 0x01, 0x30, - 0x81, 0x85, 0x9d, 0x22, 0xaf, 0x0d, 0xb4, 0x17, 0x27, 0x49, 0xac, 0x35, 0xbb, 0x05, 0xd2, 0xef, 0xa2, 0x48, 0x49, 0x78, 0x53, 0x70, 0x18, 0x6a, 0x44, 0xc9, 0x74, 0xea, 0xac, 0x01, 0x75, 0x42, - 0xa0, 0x0e, 0xe7, 0x22, 0xc4, 0x91, 0xa5, 0xf4, 0x79, 0xb8, 0x7e, 0x2e, 0x3b, 0xf6, 0xba, 0xd5, 0xdd, 0xdf, 0xd0, 0x19, 0xf2, 0xf7, 0x0b, 0x9e, 0xc6, 0x8f, 0x5b, 0xfe, 0x42, 0x4f, 0x21, 0x7c, - 0x7f, 0xd5, 0xd7, 0x6e, 0xc0, 0x6e, 0x60, 0x09, 0xdd, 0x08, 0x99, 0x55, 0x7b, 0x44, 0x87, 0x1b, 0xde, 0x38, 0xb2, 0xcb, 0x8a, 0x3b, 0xa6, 0x8a, 0xe9, 0x06, 0x4c, 0xb5, 0x51, 0x81, 0x8a, 0xdc, - 0x00, 0x95, 0x61, 0x1e, 0x17, 0x53, 0x41, 0x33, 0xe8, 0x84, 0x70, 0x1c, 0x54, 0x20, 0xba, 0x5d, 0x3a, 0x21, 0x1d, 0xd0, 0x76, 0xb6, 0x44, 0x35, 0x4f, 0x0e, 0xc9, 0x24, 0x43, 0x17, 0x2d, 0x6e, - 0x1d, 0xa6, 0x82, 0x2b, 0x31, 0x9a, 0x3b, 0x2b, 0xa4, 0x41, 0x66, 0x7a, 0x12, 0x19, 0x7e, 0x6c, 0x5b, 0x2f, 0xb3, 0xde, 0xd6, 0x1f, 0x3b, 0x2f, 0xc0, 0x9f, 0xc4, 0x13, 0x3c, 0xb9, 0xa2, 0x7d, - 0x66, 0xcc, 0xd5, 0x95, 0xf3, 0x1c, 0x24, 0xbe, 0xe7, 0xce, 0x42, 0xe2, 0x51, 0x4e, 0x76, 0xaa, 0x95, 0xcd, 0x3a, 0xb8, 0x49, 0x1a, 0x24, 0xb7, 0x5a, 0x68, 0xde, 0x7a, 0x4b, 0x67, 0x23, 0xf8, - 0x34, 0x9b, 0xe5, 0x64, 0x18, 0xc9, 0x64, 0x6d, 0xd6, 0x8b, 0xf9, 0x84, 0x24, 0x21, 0xf6, 0xb8, 0xd6, 0xca, 0xed, 0x62, 0xb6, 0xa5, 0x3d, 0x2b, 0xec, 0xa7, 0xbd, 0x70, 0x68, 0x5a, 0x8f, 0x08, - 0x69, 0x2b, 0xae, 0x23, 0x4e, 0xb0, 0x81, 0xd1, 0xc4, 0xb4, 0x92, 0xf9, 0x93, 0x4d, 0x65, 0x2d, 0x3b, 0xd4, 0xbb, 0x8f, 0xec, 0xba, 0xa4, 0x53, 0x3d, 0xd2, 0x3e, 0x92, 0x28, 0xd2, 0x63, 0xeb, - 0xa1, 0x87, 0x0d, 0x02, 0x9f, 0x4a, 0x0e, 0x78, 0x27, 0x7b, 0x61, 0xe9, 0xe5, 0x78, 0x7c, 0x21, 0xf6, 0x3d, 0x37, 0xfb, 0xed, 0x44, 0x8c, 0x95, 0x25, 0x0c, 0x2f, 0x96, 0x32, 0x87, 0x75, 0x21, - 0xbf, 0x27, 0x18, 0x74, 0x96, 0x82, 0xcb, 0xb9, 0xd0, 0x9d, 0x30, 0xd8, 0xf1, 0x36, 0x5b, 0x1a, 0x1c, 0x55, 0xac, 0xac, 0x4c, 0x39, 0x53, 0xa6, 0x36, 0x4c, 0x7a, 0xda, 0xf1, 0xb5, 0x9e, 0xa0, - 0x46, 0xe0, 0x47, 0xe9, 0x1a, 0x60, 0xb6, 0x5e, 0x17, 0x77, 0xd2, 0x69, 0xb1, 0x68, 0x59, 0xaf, 0xe1, 0xcc, 0xb9, 0x12, 0x59, 0xd5, 0xa7, 0x88, 0x89, 0x99, 0x44, 0x69, 0x12, 0xdb, 0x71, 0x39, - 0xb6, 0x23, 0xbf, 0x2c, 0x1f, 0xb3, 0xe0, 0xa9, 0xb4, 0xe1, 0x4f, 0xd4, 0x2f, 0x9c, 0xb8, 0xbe, 0x36, 0xb4, 0xd7, 0x85, 0x6c, 0x21, 0x85, 0x8d, 0x49, 0xe4, 0xa8, 0x10, 0x20, 0xa5, 0xc9, 0x8e, - 0x41, 0x61, 0x4a, 0x79, 0x95, 0xa7, 0x73, 0x71, 0xe9, 0x08, 0x20, 0xd0, 0x1d, 0xe2, 0xad, 0x1f, 0x63, 0x12, 0x90, 0xd3, 0x48, 0x24, 0x54, 0x25, 0x5b, 0xab, 0x39, 0x35, 0xf3, 0x56, 0x95, 0x81, - 0xe4, 0x53, 0xb0, 0xe2, 0x8d, 0xd1, 0x76, 0xbe, 0x25, 0xab, 0x39, 0x28, 0x1d, 0x12, 0x72, 0x0a, 0x1e, 0x2c, 0x47, 0x2f, 0x0b, 0x79, 0x90, 0xc1, 0xfe, 0xd1, 0xcb, 0x7d, 0x8f, 0x39, 0xe0, 0x93, - 0x8b, 0xfb, 0x1b, 0xd9, 0x33, 0x57, 0xde, 0x4e, 0xc6, 0xe0, 0xb0, 0x65, 0x1d, 0xd8, 0xe6, 0x35, 0x6a, 0x15, 0x4d, 0x27, 0xf1, 0xa4, 0x93, 0x78, 0x4c, 0xda, 0x4f, 0x13, 0xec, 0x60, 0x20, 0x4c, - 0x8f, 0x6c, 0x73, 0x95, 0xce, 0x48, 0x76, 0x92, 0x2b, 0x95, 0xc7, 0xc8, 0xb8, 0xee, 0x95, 0xa1, 0x71, 0x58, 0xc7, 0xbb, 0xff, 0x3f, 0x7b, 0x7f, 0xd2, 0xac, 0x2a, 0xf7, 0xec, 0x0b, 0xa3, 0xfd, - 0xfb, 0x29, 0x9e, 0xf8, 0x77, 0x39, 0x2e, 0xea, 0xea, 0xb4, 0x36, 0x88, 0x8a, 0xa2, 0x20, 0x08, 0x28, 0x34, 0x4e, 0x04, 0x75, 0x21, 0x95, 0x94, 0x42, 0xc4, 0xbd, 0x9f, 0xfd, 0xc6, 0x54, 0x67, - 0xad, 0x73, 0xb2, 0xdc, 0xcf, 0x1b, 0x6f, 0xc4, 0x89, 0xbd, 0x3a, 0x8b, 0x6a, 0xa6, 0x8c, 0x1f, 0x39, 0x72, 0x64, 0xe6, 0xc8, 0xe2, 0xdc, 0x21, 0xf6, 0x74, 0xbe, 0x51, 0x92, 0xd8, 0x62, 0xc8, - 0xd9, 0x81, 0xb7, 0x0e, 0x26, 0xd5, 0x55, 0xbc, 0x9b, 0xbb, 0xf3, 0xd6, 0x3e, 0x86, 0x42, 0x7a, 0x1a, 0x07, 0x47, 0x7e, 0x8c, 0x1e, 0x89, 0x65, 0xe8, 0xa9, 0x2e, 0x4d, 0x57, 0x92, 0x17, 0x18, - 0x5e, 0x0e, 0x26, 0xd0, 0xb8, 0x86, 0x4c, 0x86, 0x89, 0x2e, 0xb4, 0x3e, 0x03, 0x73, 0x2a, 0xf0, 0x85, 0x55, 0x92, 0x25, 0x07, 0x32, 0x20, 0xcf, 0x27, 0x2c, 0xe8, 0x25, 0x42, 0xda, 0x35, 0xe1, - 0x62, 0x2b, 0x58, 0xd6, 0xa2, 0xaa, 0x16, 0x2c, 0x72, 0x0a, 0x38, 0x6d, 0x07, 0x05, 0xdb, 0xa0, 0x56, 0xdb, 0xbc, 0x37, 0xd7, 0x6a, 0x4d, 0x33, 0x36, 0xe1, 0x4e, 0xb1, 0xd0, 0x77, 0x68, 0x57, - 0xc7, 0xad, 0xf2, 0xd8, 0x3a, 0xa0, 0x34, 0x4d, 0xcb, 0x6f, 0x5b, 0x47, 0xd7, 0x77, 0x8a, 0x1f, 0x5a, 0xaf, 0xcf, 0xf5, 0x9a, 0x78, 0xa3, 0xfa, 0x36, 0xea, 0xd8, 0x1a, 0xdd, 0x60, 0x62, 0xcd, - 0x9d, 0x89, 0x9c, 0x2f, 0x05, 0x60, 0x1b, 0x0e, 0x6b, 0x61, 0xa5, 0xd1, 0x31, 0xbe, 0x23, 0x41, 0x03, 0x8d, 0x37, 0x60, 0xaa, 0xf1, 0x2d, 0x07, 0x72, 0xde, 0x12, 0xde, 0xcb, 0xe9, 0x2a, 0x23, - 0x70, 0x24, 0xda, 0x4e, 0x71, 0x03, 0x53, 0xd9, 0x61, 0x4a, 0x27, 0x00, 0x2e, 0x6d, 0xa4, 0x43, 0xd2, 0xab, 0x2a, 0x03, 0xec, 0x52, 0x5d, 0xdb, 0xa6, 0x10, 0x2f, 0x6b, 0x5d, 0xc1, 0xe1, 0xab, - 0xd3, 0x98, 0x9d, 0x65, 0xa7, 0xf4, 0xac, 0xda, 0x9b, 0xdc, 0x84, 0xee, 0xbf, 0xea, 0x43, 0xff, 0x4c, 0xfa, 0x05, 0x95, 0x4f, 0x17, 0xc6, 0x7a, 0xd2, 0x5d, 0x47, 0x98, 0x1f, 0xd0, 0x38, 0x83, - 0x36, 0xc5, 0xd2, 0x3a, 0xc4, 0x51, 0x95, 0x2b, 0xad, 0x77, 0x5e, 0xae, 0xf4, 0x99, 0x30, 0x58, 0x27, 0x72, 0x40, 0x4a, 0x53, 0x38, 0xfb, 0xc0, 0x66, 0x57, 0xd2, 0xea, 0xd1, 0x4d, 0xf9, 0xb4, - 0xd2, 0xb0, 0x14, 0x49, 0x9c, 0x75, 0x1e, 0x97, 0x31, 0x38, 0xe7, 0x13, 0x2a, 0x3d, 0xe2, 0xfa, 0x79, 0x93, 0x1a, 0x0c, 0xe0, 0xd7, 0xca, 0x71, 0x0b, 0xa2, 0xf9, 0x23, 0x6d, 0xe7, 0x0b, 0x34, - 0x79, 0x55, 0x4d, 0xaa, 0xc2, 0xea, 0x1e, 0xed, 0x2e, 0x92, 0x4f, 0x6d, 0xd4, 0x7c, 0xa0, 0x7b, 0x01, 0xe5, 0xed, 0xec, 0x52, 0xe1, 0x7c, 0x84, 0xb3, 0x23, 0x52, 0xb8, 0xed, 0x4a, 0xd0, 0xb6, - 0xfa, 0x4c, 0xe4, 0x48, 0x97, 0xdf, 0x4a, 0x54, 0x79, 0xb4, 0xa5, 0x6c, 0x5b, 0xf4, 0x5c, 0x1f, 0x38, 0xdc, 0xbc, 0xde, 0xc7, 0x85, 0xb7, 0x17, 0xa7, 0x41, 0x4f, 0xed, 0xb7, 0x48, 0x79, 0x70, - 0xce, 0x87, 0x35, 0xa5, 0x56, 0x47, 0xc5, 0x93, 0x13, 0x42, 0x2a, 0x59, 0x64, 0x41, 0x02, 0xda, 0xaa, 0xb4, 0x82, 0x0a, 0x3e, 0xc1, 0xf8, 0xbc, 0x71, 0x1d, 0x72, 0x41, 0x3c, 0xe7, 0xec, 0x28, - 0xac, 0x3a, 0x9c, 0x1c, 0xbd, 0x6b, 0xa4, 0x11, 0xfa, 0xcd, 0xa7, 0x14, 0x7a, 0xb6, 0x95, 0x05, 0x93, 0xdb, 0x5a, 0xf9, 0x9f, 0xff, 0x7d, 0x2f, 0x61, 0xb8, 0x0b, 0xa3, 0x0f, 0xd9, 0x04, 0x0f, - 0x1c, 0x7a, 0xae, 0x77, 0xf5, 0x48, 0x3c, 0xe2, 0xce, 0xbf, 0x97, 0x50, 0x17, 0x8a, 0x97, 0xa8, 0xa2, 0x97, 0x21, 0xc0, 0xbf, 0xbb, 0xdb, 0xe1, 0x09, 0x63, 0x9d, 0x1c, 0x99, 0x25, 0xdd, 0x63, - 0xa6, 0xcd, 0xe7, 0x33, 0x67, 0x1d, 0xa4, 0x06, 0xce, 0x2d, 0xec, 0x85, 0x73, 0x0e, 0xbe, 0x48, 0x98, 0xaf, 0xc1, 0x50, 0x9f, 0x7d, 0x63, 0xc8, 0x13, 0xd5, 0xf1, 0x3f, 0x07, 0x41, 0x5d, 0x68, - 0xfc, 0xce, 0x28, 0xd3, 0x79, 0x3c, 0x18, 0x06, 0x13, 0x61, 0x6a, 0xe8, 0x47, 0x72, 0x1b, 0x0d, 0xe5, 0x5c, 0xf6, 0x5a, 0x55, 0x3d, 0xf0, 0x75, 0x36, 0x3d, 0xed, 0x7d, 0x8f, 0x3c, 0xc3, 0x4c, - 0x18, 0xcc, 0x2a, 0x47, 0x1d, 0x08, 0xd3, 0x5e, 0xdb, 0x7e, 0xbe, 0x56, 0xd6, 0xdb, 0x26, 0x50, 0xe5, 0x9e, 0xad, 0x43, 0xc2, 0xa7, 0xcc, 0x99, 0xa2, 0x6b, 0xbb, 0x7e, 0xcf, 0xcf, 0x39, 0x90, - 0xdc, 0x37, 0x58, 0x0d, 0x1f, 0x9e, 0x33, 0x14, 0xd2, 0x8f, 0xbe, 0x8d, 0x07, 0x9f, 0xf8, 0xe2, 0x1a, 0x8e, 0x86, 0xc7, 0x52, 0xe8, 0x99, 0x18, 0x8f, 0x77, 0xb2, 0x17, 0xf4, 0x5e, 0x4f, 0x2e, - 0x65, 0xf3, 0x47, 0xac, 0x48, 0x03, 0xb2, 0x03, 0xf6, 0xf4, 0x81, 0x44, 0x43, 0x46, 0xd3, 0x8e, 0x11, 0x20, 0x02, 0xb4, 0x69, 0x21, 0x09, 0x9b, 0x34, 0x19, 0x45, 0x0f, 0x51, 0x20, 0xf5, 0x8b, - 0xb2, 0xb2, 0xce, 0x80, 0xa0, 0xc9, 0x44, 0x27, 0xec, 0x31, 0x33, 0xdf, 0x17, 0x33, 0x83, 0x3d, 0x2e, 0x42, 0x39, 0xee, 0x98, 0x38, 0xe6, 0xa6, 0xc7, 0xfd, 0x39, 0x34, 0x20, 0x5d, 0x98, 0x85, - 0x47, 0xaa, 0x1b, 0x0c, 0x72, 0x8e, 0x3b, 0x63, 0x0c, 0x84, 0x0f, 0xaf, 0xfa, 0xc3, 0xae, 0xc2, 0x73, 0x92, 0xf9, 0x0b, 0xed, 0xcf, 0xc0, 0x5c, 0xf6, 0x15, 0x46, 0xca, 0xe6, 0x7d, 0xb4, 0x3d, - 0x07, 0xb3, 0xa8, 0x5c, 0xea, 0x10, 0xe8, 0x2d, 0xa5, 0x8d, 0x93, 0xcd, 0x59, 0x06, 0x05, 0x97, 0x2b, 0x93, 0x31, 0x4f, 0x42, 0xd6, 0x31, 0xdd, 0xbe, 0x6f, 0x5b, 0x37, 0xc2, 0x92, 0xaa, 0x84, - 0xf7, 0x53, 0x11, 0x41, 0xb2, 0xd0, 0xf5, 0x41, 0xd4, 0xb5, 0x51, 0x2e, 0x37, 0x1d, 0x2d, 0x56, 0x75, 0x64, 0x77, 0xf2, 0x87, 0x65, 0x27, 0xf6, 0x05, 0xd1, 0x23, 0xe7, 0x0a, 0xcd, 0xd2, 0x67, - 0x0d, 0x84, 0x0f, 0xec, 0x73, 0xdd, 0xe9, 0xfb, 0x24, 0x66, 0x3e, 0x6e, 0x2c, 0xc0, 0x7f, 0x9b, 0x3a, 0xff, 0xfe, 0xc7, 0x3f, 0xf9, 0x4e, 0x9e, 0xab, 0xee, 0x75, 0xa3, 0x0d, 0x4e, 0x5e, 0x8f, - 0xee, 0xe4, 0x25, 0xfc, 0xf3, 0xe8, 0x03, 0x90, 0x22, 0x78, 0x42, 0x93, 0xde, 0x04, 0xd6, 0xfa, 0xb4, 0x20, 0xb7, 0x43, 0x73, 0x2e, 0x57, 0x25, 0x26, 0x6c, 0x6c, 0x76, 0x86, 0x84, 0x7b, 0x92, - 0x55, 0x49, 0x43, 0x8c, 0x2c, 0x14, 0x85, 0xa4, 0xf9, 0x79, 0xe9, 0x63, 0x2e, 0x5a, 0xe2, 0x83, 0x5e, 0x44, 0xce, 0x16, 0x21, 0x70, 0x28, 0x21, 0xa7, 0x5b, 0x91, 0x50, 0x36, 0xf4, 0x20, 0xad, - 0x94, 0x04, 0x15, 0x17, 0xc5, 0x69, 0x17, 0x75, 0xe8, 0xec, 0xf9, 0xf6, 0x9f, 0x9f, 0x3c, 0x64, 0xff, 0x26, 0xbf, 0xbe, 0x92, 0xbd, 0xb5, 0xd4, 0xbb, 0x9e, 0x8c, 0xe5, 0xd2, 0xde, 0xa5, 0x1d, - 0x9c, 0x71, 0xa3, 0x93, 0xee, 0x28, 0xc0, 0x2a, 0x76, 0x3a, 0x4d, 0xb6, 0x69, 0xee, 0x18, 0xae, 0x1c, 0x2a, 0x0b, 0xc4, 0x12, 0xda, 0x58, 0xe1, 0x8c, 0x5d, 0xb4, 0x5c, 0xb4, 0xea, 0xa8, 0xa2, - 0xd9, 0x5b, 0x36, 0xd2, 0x9b, 0x49, 0x08, 0x64, 0x47, 0xab, 0x92, 0x32, 0x73, 0x0b, 0xcc, 0x16, 0x2a, 0xb3, 0x25, 0x4a, 0xa5, 0x40, 0x56, 0xc3, 0x2a, 0x5c, 0x99, 0x43, 0x2b, 0xce, 0xa9, 0xe7, - 0xb8, 0x34, 0xaa, 0x26, 0x56, 0x19, 0x34, 0xef, 0xad, 0xa7, 0xe1, 0xaf, 0xad, 0xbb, 0xa2, 0x6a, 0xe2, 0xbe, 0x68, 0x49, 0xb9, 0x1d, 0x7b, 0x4e, 0xfd, 0xf6, 0xcc, 0xd7, 0x0a, 0x77, 0xaf, 0x79, - 0x11, 0x77, 0x28, 0x5c, 0xff, 0x72, 0x12, 0x55, 0xf7, 0xff, 0xf8, 0x76, 0xfb, 0xad, 0x64, 0xd5, 0xb7, 0x3d, 0xf1, 0x6b, 0x05, 0xf8, 0x3f, 0x45, 0x99, 0xd7, 0x79, 0xdd, 0x17, 0xde, 0x1f, 0x3f, - 0xb1, 0x82, 0xd7, 0x67, 0x91, 0x47, 0x26, 0xf7, 0xe5, 0xb3, 0x44, 0x8f, 0xe4, 0x14, 0xf4, 0x54, 0x1a, 0xdc, 0x8d, 0xe6, 0xeb, 0x47, 0x8f, 0xaa, 0x09, 0xf4, 0x7b, 0x3a, 0x1c, 0x3c, 0xa9, 0x90, - 0x6c, 0x0f, 0xc0, 0x08, 0x35, 0x03, 0xc8, 0xad, 0x76, 0x04, 0x94, 0x8a, 0xe7, 0x00, 0xd2, 0x11, 0x0f, 0xc3, 0x20, 0x8f, 0x91, 0xbb, 0x7e, 0x94, 0x79, 0x93, 0xa2, 0xcc, 0x0b, 0xaf, 0xac, 0xa3, - 0x1f, 0xc2, 0xea, 0x9e, 0x1b, 0xd1, 0x17, 0xea, 0x97, 0xb1, 0x7d, 0xb9, 0x76, 0xe1, 0xeb, 0x11, 0x7a, 0x20, 0xba, 0x39, 0xf9, 0x86, 0x10, 0x23, 0xc9, 0x7a, 0x70, 0x37, 0x3b, 0x9f, 0x32, 0x97, - 0xe6, 0x0c, 0xd4, 0x01, 0xb3, 0xe9, 0x01, 0x36, 0xe0, 0x08, 0x1f, 0x26, 0x30, 0x8f, 0x12, 0x90, 0x8e, 0x74, 0x83, 0xac, 0x10, 0x98, 0x92, 0xe5, 0xbc, 0x72, 0x61, 0x14, 0x1b, 0x8c, 0x58, 0x1a, - 0x86, 0x13, 0x67, 0x47, 0x77, 0x2b, 0x6e, 0xe2, 0xed, 0x91, 0x66, 0x08, 0x7d, 0xce, 0x52, 0x00, 0xba, 0x13, 0x92, 0x27, 0x97, 0xf7, 0xef, 0x4c, 0x05, 0xfd, 0x81, 0x1f, 0x84, 0x51, 0x5c, 0xc7, - 0xfb, 0x53, 0x7c, 0xca, 0x33, 0xab, 0xfc, 0x85, 0xe6, 0x1b, 0x9a, 0xee, 0x98, 0x64, 0x0d, 0x78, 0xd2, 0x1b, 0x88, 0x3d, 0xb4, 0xee, 0xde, 0x65, 0x23, 0x69, 0x26, 0x27, 0xc5, 0x5c, 0x59, 0x98, - 0x18, 0x5e, 0xf9, 0x45, 0xb1, 0x19, 0xc3, 0x29, 0x5f, 0x5c, 0x52, 0xff, 0xe6, 0x70, 0x3e, 0x92, 0xbe, 0x8c, 0xea, 0xe3, 0x85, 0x31, 0x83, 0x7b, 0x61, 0x10, 0xb3, 0xdf, 0x71, 0xa4, 0xe8, 0xd3, - 0xb0, 0xb5, 0x66, 0x21, 0xe5, 0xbc, 0xc6, 0x84, 0x45, 0x29, 0xf0, 0xec, 0x21, 0x21, 0x67, 0x6e, 0x05, 0x73, 0x4c, 0x3a, 0x73, 0x9d, 0x5c, 0xb7, 0xba, 0x43, 0xb6, 0xe6, 0xc8, 0x1d, 0x17, 0x16, - 0x62, 0x50, 0x37, 0xcb, 0x25, 0x62, 0x31, 0xc7, 0x80, 0xb4, 0x48, 0x79, 0x87, 0xc1, 0xf1, 0x79, 0xbb, 0x33, 0x61, 0xb2, 0xc0, 0x74, 0x77, 0x91, 0x6d, 0xf8, 0x23, 0xba, 0x19, 0x63, 0x3a, 0xb9, - 0xde, 0x60, 0x25, 0xc1, 0xa3, 0xf4, 0x0b, 0xf8, 0xa9, 0x9d, 0xbf, 0x1b, 0xcd, 0x0b, 0x18, 0x97, 0xa3, 0x0b, 0x0a, 0x23, 0x6c, 0xeb, 0xf2, 0xb0, 0xdb, 0x42, 0xb6, 0x0f, 0xe0, 0x19, 0x24, 0xe7, - 0x59, 0x65, 0x03, 0x3b, 0x5d, 0xf7, 0x45, 0x7f, 0x59, 0x45, 0xa9, 0x84, 0xf1, 0xb3, 0x3a, 0xcd, 0x96, 0xc5, 0x96, 0x37, 0x28, 0x19, 0xd6, 0xa6, 0x83, 0x90, 0xc8, 0x25, 0xb7, 0xf1, 0xdd, 0xdc, - 0x2e, 0xa9, 0x6c, 0x25, 0x49, 0x95, 0x12, 0xec, 0xa7, 0xfd, 0x46, 0x39, 0x79, 0x3b, 0x56, 0x1e, 0xd2, 0xbd, 0xb6, 0x39, 0x91, 0x43, 0xab, 0x47, 0xcf, 0x89, 0xff, 0x5b, 0x46, 0xdf, 0x3d, 0x2b, - 0xa8, 0xb4, 0x8a, 0xe2, 0xf2, 0xd6, 0x8f, 0xd4, 0xe3, 0xc8, 0xf7, 0x1f, 0xe0, 0x89, 0x3d, 0x15, 0xd2, 0xf5, 0x42, 0xf0, 0x05, 0xcc, 0xc8, 0xf7, 0x27, 0xd8, 0xb8, 0x40, 0x2e, 0x9c, 0x4a, 0xd2, - 0xb3, 0xb0, 0x63, 0x30, 0x56, 0xec, 0xd7, 0x03, 0xc0, 0xf3, 0x1b, 0x6d, 0x48, 0xa4, 0x59, 0x11, 0x40, 0xf4, 0x5c, 0x07, 0xbc, 0x96, 0x30, 0x37, 0x1e, 0xda, 0xae, 0xa2, 0x30, 0x70, 0xcf, 0x43, - 0xe0, 0x74, 0x26, 0xa5, 0xe7, 0xb3, 0xd9, 0x36, 0x65, 0xd6, 0x53, 0x73, 0x41, 0xaf, 0xd3, 0x93, 0xaf, 0xe7, 0xe2, 0x66, 0x23, 0x14, 0x75, 0xbd, 0x34, 0x54, 0x7d, 0x41, 0x34, 0x9c, 0x41, 0x8e, - 0x52, 0x86, 0xa3, 0xf2, 0x75, 0xdf, 0xfa, 0xbe, 0x49, 0xf5, 0x8c, 0xbb, 0xee, 0x95, 0xe8, 0x05, 0x84, 0xeb, 0xe1, 0x25, 0xe6, 0x74, 0x84, 0x46, 0xb1, 0x3f, 0x96, 0xfb, 0x82, 0x5e, 0x28, 0x98, - 0x70, 0xf0, 0x85, 0x85, 0x31, 0x48, 0xeb, 0x54, 0x6d, 0x16, 0x7a, 0x04, 0x6b, 0xfb, 0xb9, 0xdf, 0x55, 0x28, 0x49, 0x66, 0xb4, 0xe3, 0xe0, 0x38, 0x58, 0xdb, 0x04, 0xd7, 0x9c, 0xfa, 0x39, 0x51, - 0x38, 0x32, 0xce, 0xd8, 0x11, 0x3f, 0xab, 0x42, 0x8b, 0x2b, 0x0c, 0xba, 0x25, 0x72, 0x6b, 0x57, 0x22, 0x87, 0x29, 0x17, 0xb9, 0x8b, 0x74, 0xd3, 0xb9, 0xc3, 0xf2, 0xb9, 0xc0, 0x8e, 0x8b, 0x05, - 0xfe, 0xb2, 0x4c, 0xff, 0xe7, 0x3d, 0x64, 0xe6, 0x3e, 0x03, 0xe5, 0x4e, 0x5d, 0x46, 0xd9, 0x23, 0xeb, 0xea, 0xb9, 0xa2, 0x8b, 0xaf, 0x44, 0x5f, 0x30, 0xbc, 0x1d, 0x8e, 0x2d, 0xb2, 0xd8, 0xef, - 0x00, 0x19, 0x8f, 0xd0, 0x90, 0xf5, 0xc9, 0x05, 0x7b, 0x74, 0x31, 0x61, 0x41, 0x59, 0xa4, 0xc7, 0x8a, 0xe2, 0x5e, 0x5c, 0xac, 0x55, 0x6b, 0xd6, 0x75, 0xc6, 0x5e, 0x8b, 0xe2, 0xa5, 0xb1, 0x21, - 0x87, 0x32, 0x31, 0xb8, 0x0d, 0xc4, 0xce, 0x0f, 0x7c, 0x1c, 0x6f, 0xf7, 0xc9, 0xde, 0x84, 0x95, 0x80, 0xd4, 0x2c, 0xd7, 0x35, 0xbd, 0x25, 0x97, 0x46, 0x74, 0x3c, 0x47, 0xf9, 0xf4, 0x14, 0xc9, - 0xc8, 0x73, 0x5e, 0x0c, 0xaf, 0xfa, 0xdc, 0xbe, 0xe1, 0xd1, 0xc2, 0x95, 0xd7, 0x51, 0x90, 0xe5, 0x0f, 0xdd, 0x64, 0xd0, 0x53, 0x91, 0x45, 0x6f, 0x54, 0x2f, 0x18, 0xde, 0x8e, 0x2f, 0x8a, 0xce, - 0x88, 0x19, 0xa9, 0x2d, 0x16, 0x8b, 0xbd, 0xbf, 0xb3, 0x9a, 0xa6, 0xb2, 0xf4, 0xd5, 0x14, 0xa0, 0xfc, 0x40, 0x07, 0x44, 0xbd, 0x65, 0x0f, 0xc7, 0xa9, 0x9a, 0xea, 0x2d, 0x59, 0x1d, 0x89, 0x2c, - 0x8f, 0x39, 0xd3, 0x6c, 0x1b, 0x49, 0x13, 0x17, 0x5a, 0x0f, 0x99, 0x47, 0x4c, 0x2b, 0x78, 0x99, 0x23, 0x66, 0x5c, 0xbc, 0x83, 0xe2, 0x82, 0xed, 0x1c, 0x66, 0xda, 0xf2, 0x98, 0x97, 0xfb, 0x6d, - 0x3f, 0xb0, 0x8e, 0xc2, 0x3d, 0x07, 0xe2, 0xa5, 0x21, 0xdd, 0x5b, 0x64, 0x39, 0xfa, 0xb8, 0x32, 0x84, 0x97, 0xe6, 0xf1, 0xcf, 0x25, 0x5e, 0xa8, 0xa7, 0x78, 0xf1, 0x03, 0x5d, 0x70, 0xf2, 0xf1, - 0x6c, 0x42, 0x8d, 0xe3, 0xc8, 0xcd, 0x2e, 0x36, 0x06, 0x67, 0x2f, 0x4a, 0x0c, 0xe4, 0x75, 0x0c, 0x5f, 0x0c, 0xd0, 0xe6, 0x5c, 0x18, 0xf3, 0xb6, 0x0b, 0x88, 0x3e, 0xee, 0x61, 0x71, 0x81, 0x9e, - 0x6b, 0x2f, 0x3f, 0x0d, 0x04, 0x86, 0xe9, 0xd3, 0x1c, 0x54, 0xb6, 0x41, 0x56, 0xc2, 0xe0, 0x62, 0x51, 0x03, 0x91, 0x83, 0x46, 0x2b, 0x75, 0x90, 0xa9, 0x59, 0x83, 0xaa, 0xee, 0x06, 0xc6, 0x76, - 0x56, 0x97, 0xe9, 0x5a, 0xba, 0x98, 0x11, 0x63, 0xc4, 0x9b, 0x97, 0x5d, 0x00, 0x7d, 0xec, 0x8f, 0x46, 0x9f, 0x48, 0xf6, 0x7e, 0x25, 0xfa, 0x82, 0xc5, 0xed, 0x70, 0x72, 0xa1, 0xf4, 0x3b, 0x10, - 0x7d, 0x2c, 0x66, 0xdb, 0x12, 0x85, 0x71, 0x70, 0x1e, 0xef, 0xb0, 0x61, 0x59, 0x69, 0x67, 0x23, 0x68, 0x0c, 0x6d, 0xbb, 0x45, 0x3c, 0x58, 0x14, 0x30, 0x97, 0x9c, 0x91, 0xa6, 0xb4, 0x8e, 0x7a, - 0x63, 0xea, 0xd8, 0x73, 0x36, 0x52, 0x37, 0xfd, 0x92, 0x03, 0x90, 0xae, 0x4d, 0x91, 0x8e, 0x00, 0x0a, 0x13, 0xcc, 0xdd, 0x0d, 0x43, 0x3a, 0xca, 0x31, 0x0e, 0xab, 0xad, 0x9d, 0xd4, 0x1d, 0x2b, - 0x95, 0xeb, 0x27, 0x57, 0xcc, 0x4f, 0x75, 0xbb, 0xbe, 0x76, 0xd7, 0xf8, 0x8c, 0xe2, 0xa5, 0xd1, 0xf8, 0x43, 0xa6, 0x82, 0x9f, 0x2a, 0x66, 0xf5, 0x4a, 0xf4, 0xad, 0x91, 0xb9, 0x77, 0xbe, 0x6c, - 0x6f, 0x8d, 0x98, 0x9b, 0xa4, 0x3b, 0xe7, 0xc5, 0xf4, 0xe4, 0xcd, 0x77, 0xb3, 0x1a, 0x31, 0xd9, 0x6a, 0x5a, 0x46, 0x79, 0x29, 0x64, 0x19, 0x6a, 0x22, 0x45, 0x0c, 0xf8, 0x2e, 0x7d, 0x4c, 0x97, - 0x84, 0x9c, 0xef, 0x3b, 0x0c, 0x04, 0xb9, 0x35, 0x10, 0x39, 0x33, 0xd6, 0x77, 0x20, 0x8d, 0x3c, 0xad, 0xa6, 0x51, 0x75, 0x2a, 0xd5, 0x4a, 0x50, 0xe3, 0x0e, 0xf3, 0xc5, 0x79, 0x8f, 0x14, 0x7b, - 0x5a, 0x3a, 0xed, 0x6a, 0x8e, 0x7a, 0xb2, 0xd2, 0xe3, 0xc5, 0xec, 0x2c, 0xad, 0x3e, 0xba, 0xf5, 0xfd, 0x82, 0x1e, 0x47, 0xd4, 0x7b, 0xd5, 0xe4, 0xb5, 0xca, 0xeb, 0x63, 0xcb, 0x87, 0x7e, 0x22, - 0x9b, 0xf8, 0x03, 0xe1, 0x4b, 0x03, 0xb8, 0xb7, 0xb3, 0xc9, 0x95, 0xe0, 0xef, 0x80, 0x32, 0x16, 0xb2, 0x40, 0x00, 0xc5, 0x45, 0x6d, 0xe2, 0x78, 0x9e, 0x69, 0x82, 0x3a, 0xc7, 0x54, 0x6b, 0x4f, - 0x90, 0xce, 0xc0, 0xae, 0x7b, 0xa6, 0x45, 0x07, 0x52, 0x97, 0x42, 0x43, 0xd1, 0x70, 0xc8, 0x60, 0xcf, 0x80, 0x6d, 0x57, 0x86, 0x49, 0x9f, 0xe5, 0x2d, 0x96, 0x6c, 0x44, 0x6b, 0xf0, 0xb6, 0xcd, - 0x3c, 0xe9, 0xed, 0xc3, 0x12, 0xd2, 0xb1, 0x4d, 0xd9, 0x6c, 0xf3, 0x8a, 0x3c, 0x69, 0x39, 0xee, 0x3f, 0xb7, 0xea, 0x7e, 0x8c, 0xb2, 0x7f, 0x8d, 0x19, 0xff, 0x5f, 0xef, 0xb7, 0xbd, 0x6a, 0x52, - 0xe7, 0x93, 0xa2, 0x8c, 0xd2, 0xa8, 0x8e, 0xda, 0x57, 0x8f, 0x14, 0xf2, 0xa5, 0xb2, 0xe6, 0x73, 0xe1, 0xe9, 0x77, 0x1e, 0xa9, 0xfa, 0xd4, 0xce, 0x93, 0x89, 0x7b, 0xab, 0x5f, 0x7d, 0xfb, 0x4e, - 0xdf, 0xb3, 0x7b, 0x42, 0xeb, 0xdd, 0x3a, 0x43, 0xbf, 0xdc, 0xb8, 0x11, 0x79, 0xf0, 0xc0, 0xcb, 0xe7, 0x28, 0x33, 0x2b, 0x99, 0x54, 0x49, 0x5e, 0x3f, 0x78, 0xa4, 0x9a, 0xbc, 0xa0, 0x62, 0xd9, - 0xc9, 0xfb, 0x78, 0xbf, 0x7a, 0x36, 0x32, 0x2f, 0xb0, 0x5e, 0x00, 0x99, 0x0c, 0x5e, 0x99, 0xff, 0xe7, 0x5e, 0xa4, 0xd3, 0x57, 0xdf, 0x06, 0xfc, 0x8d, 0x46, 0x15, 0x5a, 0xe5, 0x6b, 0xce, 0xf9, - 0xe4, 0x2d, 0x8f, 0xe6, 0xce, 0x47, 0x78, 0x79, 0xf6, 0x3d, 0xa4, 0x0a, 0xfe, 0xd4, 0x94, 0xf6, 0x7a, 0xbb, 0xf3, 0xac, 0x63, 0xe9, 0xf9, 0xf7, 0xff, 0xfc, 0xd5, 0x8d, 0x92, 0x55, 0xc5, 0xbb, - 0x23, 0xe6, 0x4b, 0xd8, 0xdb, 0xef, 0xce, 0x94, 0xeb, 0x03, 0x7f, 0xac, 0xaa, 0x8a, 0x82, 0xec, 0x4d, 0x82, 0x7d, 0xfa, 0xa1, 0xeb, 0x4b, 0x7e, 0xf0, 0xb7, 0xd4, 0x97, 0xee, 0x5f, 0xef, 0xac, - 0x85, 0xfd, 0xfa, 0x74, 0x55, 0x5b, 0x65, 0x7d, 0xff, 0xf9, 0x26, 0xb3, 0xf3, 0xf3, 0x37, 0x56, 0x84, 0xfe, 0x2e, 0xb9, 0xfb, 0xc3, 0x47, 0x79, 0xec, 0x00, 0x85, 0x9f, 0xcc, 0xef, 0x7e, 0x25, - 0x0e, 0x4e, 0xde, 0x0e, 0xef, 0x84, 0xef, 0xfc, 0xf3, 0x48, 0x2a, 0x1c, 0x5b, 0xc5, 0x3d, 0x73, 0xd5, 0xd9, 0x8c, 0xc3, 0x41, 0x3b, 0x40, 0xa4, 0x99, 0xad, 0x7b, 0x77, 0xd8, 0xc1, 0xaa, 0x06, - 0xaa, 0xab, 0x44, 0xd5, 0x78, 0xde, 0xc0, 0x8c, 0xf5, 0x9a, 0x22, 0x3d, 0x94, 0xcc, 0x35, 0x06, 0xa3, 0x39, 0xff, 0xb8, 0x3e, 0x05, 0x3d, 0xa0, 0xc7, 0xf3, 0xdc, 0xc9, 0xbb, 0x1e, 0xa1, 0x1d, - 0xa1, 0x75, 0x76, 0x51, 0x03, 0x1c, 0x97, 0x2d, 0x89, 0x50, 0xb1, 0xaa, 0xea, 0x3f, 0xb8, 0x40, 0xbf, 0x0c, 0xf1, 0x51, 0xc4, 0xe0, 0xcf, 0x12, 0xe2, 0x9f, 0xd7, 0x59, 0x57, 0xe7, 0xd7, 0x0f, - 0x5a, 0x5b, 0xc1, 0x87, 0x39, 0xfb, 0xe1, 0xb9, 0xfb, 0x91, 0x7d, 0xdf, 0x98, 0xf3, 0x87, 0xcf, 0xf2, 0x6c, 0xa4, 0xe6, 0xe7, 0xdf, 0x00, 0x27, 0x5f, 0x2e, 0x4c, 0xe0, 0xbf, 0x88, 0xdf, 0xe4, - 0x73, 0x64, 0xa0, 0x20, 0x5b, 0x5f, 0xb6, 0xab, 0x24, 0xe7, 0x01, 0x63, 0x50, 0xd2, 0xc2, 0xd4, 0x65, 0x8f, 0x22, 0x81, 0x13, 0xb3, 0x4b, 0x59, 0x4d, 0x30, 0xb9, 0x7d, 0x70, 0xa6, 0x9d, 0x06, - 0x10, 0xb8, 0xf2, 0x80, 0x98, 0x1c, 0x0f, 0xa2, 0xf5, 0xa6, 0x07, 0x82, 0x83, 0x6d, 0xce, 0x54, 0x7d, 0x51, 0x21, 0x1b, 0xca, 0x70, 0xcf, 0x92, 0x2d, 0x85, 0xe4, 0x81, 0xa9, 0xa3, 0x94, 0x36, - 0xa0, 0xe7, 0xfd, 0xd4, 0xdf, 0xe5, 0xf3, 0xa3, 0x0d, 0xa7, 0xbf, 0x37, 0x2b, 0xbf, 0xd0, 0xbe, 0xae, 0x75, 0x1f, 0xaf, 0x5c, 0xb6, 0x9e, 0x46, 0x18, 0x99, 0xf2, 0x54, 0x4a, 0x92, 0xc0, 0x5c, - 0xd5, 0x96, 0x96, 0xd3, 0x69, 0x64, 0xb0, 0xce, 0x7a, 0x1a, 0xaa, 0x9a, 0xc5, 0x8b, 0xf1, 0x6a, 0x8e, 0x6e, 0x8d, 0x0a, 0xd6, 0x23, 0x97, 0x23, 0x99, 0x2e, 0x9a, 0xc5, 0xf0, 0xd1, 0x38, 0x0b, - 0x9e, 0xac, 0x3a, 0xf5, 0x9a, 0xf1, 0x06, 0x46, 0xe2, 0x71, 0x53, 0x50, 0x78, 0x28, 0x40, 0x96, 0xc1, 0x36, 0x23, 0x84, 0x8e, 0xc5, 0x96, 0x2a, 0x15, 0x29, 0xc5, 0xa3, 0x9a, 0x5e, 0x1f, 0x06, - 0xf9, 0x40, 0x7f, 0xf8, 0x22, 0xdb, 0xbf, 0xcb, 0xe5, 0x31, 0x5e, 0xeb, 0xeb, 0x1a, 0xf3, 0x61, 0x46, 0x3c, 0xf8, 0x3a, 0x8e, 0x55, 0xbc, 0x16, 0x9a, 0xbe, 0x0a, 0x84, 0x9f, 0x8a, 0xbc, 0x3c, - 0xa3, 0x8a, 0x7c, 0xff, 0x81, 0xcb, 0x77, 0xfa, 0x7e, 0x79, 0x4c, 0x51, 0x13, 0x78, 0xb2, 0x40, 0x78, 0x46, 0x8f, 0x16, 0xf2, 0x49, 0x04, 0x91, 0x32, 0x6e, 0xfa, 0xa1, 0x5b, 0x32, 0x7d, 0xb8, - 0x59, 0x87, 0xf5, 0x08, 0x8f, 0xf3, 0xb5, 0x97, 0xc4, 0x83, 0x01, 0x92, 0x7f, 0x10, 0xe2, 0x19, 0x5b, 0xe8, 0xda, 0xc1, 0xe2, 0x63, 0x2b, 0x7f, 0x62, 0x8c, 0x09, 0x84, 0x29, 0x70, 0xe4, 0x29, - 0x3e, 0x8e, 0x80, 0xd1, 0xe0, 0x98, 0x33, 0x92, 0x49, 0xd6, 0x3d, 0x4e, 0x34, 0x4b, 0x9e, 0xe7, 0xd6, 0x2a, 0x89, 0x19, 0xc3, 0x80, 0x2c, 0x5b, 0x24, 0x21, 0x8e, 0x9c, 0x65, 0xb4, 0xb3, 0x86, - 0x3e, 0x03, 0xdd, 0x86, 0xc5, 0x5d, 0x93, 0x29, 0xf5, 0x35, 0xb5, 0x33, 0x16, 0x87, 0x9d, 0xa1, 0x23, 0x06, 0x13, 0x90, 0xd0, 0xdc, 0xd9, 0xe3, 0x06, 0x9e, 0x2d, 0x16, 0xe2, 0xf2, 0x39, 0x9d, - 0xf5, 0xbf, 0x6c, 0xcb, 0xf6, 0x12, 0xd0, 0xc9, 0x5d, 0x6f, 0xe2, 0x97, 0xb7, 0x08, 0x53, 0xf2, 0x45, 0xe6, 0xc0, 0x9f, 0xd8, 0xea, 0xbf, 0x5e, 0x7b, 0x69, 0x5e, 0xfe, 0x2b, 0xaf, 0x6a, 0xd2, - 0xb7, 0x62, 0xe3, 0xaf, 0xe1, 0xf7, 0xc4, 0x1f, 0xf8, 0x6b, 0xca, 0xf3, 0x2d, 0x57, 0xe8, 0x4e, 0xbe, 0xd1, 0xe7, 0x08, 0x90, 0x6b, 0x42, 0xef, 0xa7, 0xa5, 0xfb, 0x73, 0x29, 0x95, 0x4f, 0x3f, - 0xf8, 0xc1, 0xdd, 0x72, 0xa7, 0x8c, 0xe2, 0x07, 0x8b, 0xef, 0x45, 0x07, 0x42, 0xff, 0x7c, 0xea, 0xc1, 0x7b, 0xa7, 0xeb, 0xe4, 0x17, 0xb5, 0xe2, 0x4e, 0xd7, 0xc9, 0x2f, 0xfb, 0x9d, 0x3f, 0x77, - 0x28, 0xf9, 0xf4, 0x60, 0xf1, 0xda, 0x2a, 0x98, 0xfc, 0x9a, 0x8d, 0xe5, 0x55, 0xa7, 0xc6, 0x2b, 0xfb, 0xdb, 0x84, 0xfd, 0xd6, 0x03, 0xe5, 0xab, 0xd7, 0xe4, 0xc3, 0x4d, 0x3f, 0x4a, 0xbc, 0x89, - 0x97, 0xd5, 0x65, 0x3f, 0x71, 0x2c, 0x27, 0xf4, 0x6e, 0xe0, 0x43, 0xf7, 0x55, 0xe0, 0x91, 0x9d, 0x8b, 0xbf, 0xa4, 0xc0, 0x7c, 0x6f, 0xc6, 0xf9, 0xf2, 0x80, 0xf5, 0xaa, 0xc3, 0x5e, 0xb3, 0x53, - 0x3e, 0x0a, 0xa0, 0x57, 0xe7, 0xcd, 0xf5, 0x73, 0x11, 0x9f, 0xee, 0xa5, 0x45, 0x5e, 0xd6, 0x13, 0xbf, 0xf4, 0xaa, 0x07, 0x95, 0x2f, 0xa3, 0xb4, 0x29, 0xd3, 0xa6, 0x0c, 0xad, 0x37, 0x1b, 0xea, - 0xbb, 0x0c, 0xfc, 0xd4, 0x77, 0xea, 0xd3, 0x5f, 0xc7, 0xd5, 0xa4, 0xb7, 0xd2, 0xb7, 0xc4, 0x81, 0x2f, 0x38, 0xdf, 0xad, 0xaf, 0x3f, 0xe9, 0xa2, 0x3a, 0xcc, 0x9b, 0x6b, 0xf5, 0xfd, 0xd7, 0x7a, - 0xfb, 0xdf, 0x30, 0x49, 0xbc, 0x36, 0xbb, 0xcf, 0xf2, 0x5f, 0xfb, 0x3c, 0x23, 0x9f, 0x13, 0xed, 0xee, 0xb8, 0x6b, 0x3e, 0xdc, 0xce, 0xac, 0xba, 0x29, 0xad, 0x64, 0xe2, 0xe4, 0xe9, 0x0b, 0xe0, - 0xf7, 0x39, 0x20, 0xbf, 0xd8, 0x1a, 0x56, 0x7d, 0xcb, 0x17, 0x83, 0xfe, 0xd0, 0xdf, 0x12, 0x57, 0x82, 0xf2, 0x35, 0x73, 0xe5, 0x1b, 0xe3, 0x7d, 0xee, 0x34, 0xfd, 0x35, 0x74, 0xe8, 0x63, 0x9f, - 0xae, 0x2f, 0x86, 0xd3, 0x0b, 0x42, 0xc5, 0xc4, 0xca, 0xaa, 0xe8, 0x8d, 0xab, 0xa0, 0xef, 0xf7, 0x2f, 0x98, 0x3a, 0x79, 0xfa, 0xbe, 0xd7, 0xfa, 0xed, 0x47, 0xea, 0xb7, 0x05, 0x8d, 0xf8, 0x3a, - 0xfe, 0xda, 0x3b, 0xd7, 0x93, 0xf7, 0xfb, 0xd0, 0x9f, 0x2f, 0x8a, 0x7f, 0x4b, 0x5d, 0xa0, 0x79, 0xe1, 0xf2, 0x77, 0xfe, 0x46, 0x2e, 0x36, 0xd1, 0xed, 0xa1, 0x31, 0x7a, 0xf5, 0x98, 0xa2, 0x49, - 0xcf, 0x45, 0x15, 0xfc, 0x4f, 0xcf, 0xb0, 0x47, 0x98, 0xfe, 0xdf, 0x51, 0x4b, 0xe9, 0x01, 0x9a, 0x77, 0xe1, 0xb8, 0x3f, 0x1f, 0x1e, 0xe1, 0xf3, 0x3d, 0xad, 0x69, 0x2c, 0x3e, 0x77, 0x7e, 0x07, - 0x9c, 0xdc, 0xbb, 0x7a, 0xc9, 0x6e, 0x1f, 0xc9, 0x8f, 0x84, 0xbf, 0x75, 0x00, 0x05, 0x8b, 0xc2, 0xee, 0xb4, 0x25, 0x44, 0xd0, 0x5a, 0xb6, 0x88, 0x0f, 0x07, 0x1b, 0x9e, 0x4a, 0x24, 0xbd, 0xde, - 0xcb, 0x7c, 0x7e, 0x9a, 0x62, 0xbd, 0x40, 0xe4, 0x3b, 0x4e, 0xd7, 0x73, 0xa7, 0x49, 0x99, 0xca, 0x9f, 0x9e, 0xe2, 0xe3, 0x21, 0x3b, 0x45, 0xc6, 0x26, 0x4c, 0x37, 0xdd, 0x0e, 0x4c, 0x67, 0xfc, - 0xba, 0x20, 0x75, 0x2f, 0x4c, 0x6a, 0xf4, 0x94, 0x10, 0xc9, 0x2c, 0xfa, 0xef, 0x58, 0x0e, 0x97, 0x65, 0xd5, 0xc9, 0x33, 0x3f, 0x0a, 0x26, 0x45, 0xe9, 0xd5, 0x75, 0xf4, 0xd0, 0x71, 0x4b, 0x3d, - 0x15, 0x63, 0x7f, 0xff, 0x27, 0xde, 0x75, 0xb9, 0x2f, 0x37, 0x26, 0xd4, 0xb8, 0x68, 0x7b, 0x36, 0x30, 0x9b, 0xb5, 0xb6, 0xf3, 0x84, 0xa1, 0x4d, 0xd6, 0xa0, 0xae, 0xc5, 0x67, 0xd0, 0xb0, 0x49, - 0x8a, 0xd4, 0x65, 0x84, 0x50, 0x34, 0x34, 0x58, 0xc4, 0x0c, 0x1a, 0x45, 0xf3, 0xd6, 0xad, 0x0a, 0x10, 0xb1, 0x37, 0xbe, 0xbe, 0xdc, 0x6b, 0xfa, 0x96, 0xac, 0xe3, 0x73, 0x1d, 0xef, 0x20, 0x0f, - 0xe0, 0xb7, 0x18, 0x44, 0x3b, 0xdb, 0x64, 0xdb, 0x8a, 0x47, 0x39, 0xc9, 0x07, 0x6a, 0x4a, 0xc3, 0xde, 0xdf, 0x6c, 0x15, 0xdc, 0x05, 0xf2, 0x9a, 0xf8, 0x58, 0x7b, 0xe5, 0x75, 0x3c, 0xfd, 0xc3, - 0x2d, 0xce, 0x67, 0x62, 0x3c, 0x1f, 0xfc, 0xc6, 0x3b, 0x94, 0x5f, 0xef, 0x5c, 0x12, 0xbb, 0x47, 0x60, 0xb9, 0xac, 0x34, 0xb5, 0x5e, 0x9c, 0xe7, 0x70, 0x58, 0xf2, 0x44, 0xb2, 0xd9, 0x47, 0xbb, - 0x04, 0xde, 0xdb, 0x0b, 0x2b, 0xda, 0x42, 0xb0, 0xa7, 0x12, 0xc7, 0xa1, 0xef, 0x5c, 0x03, 0xd6, 0x80, 0x61, 0xed, 0x40, 0x9b, 0x2d, 0x90, 0x75, 0xb3, 0x4c, 0x8b, 0x76, 0xb4, 0xb6, 0xa4, 0x96, - 0x96, 0xa4, 0x6a, 0xa1, 0xea, 0xc9, 0xab, 0x75, 0x32, 0x9d, 0xed, 0x97, 0xf6, 0x61, 0x29, 0xb2, 0x3c, 0x66, 0xac, 0x6c, 0xf6, 0xb9, 0xc8, 0x8b, 0x5b, 0x9f, 0xf5, 0x37, 0x23, 0xe2, 0xb6, 0x5e, - 0x7e, 0x72, 0xcd, 0x7d, 0x69, 0xf5, 0x70, 0xcd, 0x1f, 0xfc, 0xb4, 0xa4, 0x7e, 0x54, 0x82, 0xef, 0x2b, 0x92, 0x65, 0x93, 0x78, 0x13, 0x37, 0x77, 0xde, 0xfd, 0x5c, 0xf8, 0x67, 0x65, 0x23, 0xf8, - 0xe4, 0x41, 0xfc, 0xa6, 0x00, 0x15, 0x49, 0x53, 0xde, 0xbf, 0x73, 0xb3, 0xb7, 0xba, 0xc8, 0xad, 0xc3, 0xb7, 0xb7, 0xfb, 0xfc, 0xc4, 0x6b, 0x6e, 0x7a, 0xd8, 0x17, 0x5e, 0x99, 0x44, 0xd9, 0xf1, - 0xa3, 0x4a, 0xf1, 0xd3, 0x3c, 0x2d, 0x92, 0x26, 0x88, 0xb2, 0xdf, 0xe6, 0x29, 0xfa, 0x54, 0xdd, 0xd4, 0xfb, 0x3f, 0xf1, 0xce, 0x5c, 0x5f, 0x6e, 0x4c, 0xd0, 0x71, 0x35, 0x55, 0x35, 0x4e, 0x20, - 0xca, 0x95, 0x4a, 0x2c, 0xc5, 0x9d, 0xef, 0x48, 0x39, 0x8e, 0xe1, 0x71, 0x64, 0x49, 0x1d, 0x4b, 0x42, 0x70, 0xc3, 0x2c, 0x6b, 0x04, 0x74, 0x15, 0x72, 0x9f, 0xcd, 0xe5, 0x7c, 0x31, 0xd5, 0x13, - 0x18, 0x9c, 0x6d, 0x4e, 0x2e, 0x23, 0xb2, 0x69, 0xa7, 0x59, 0xa7, 0x93, 0x8c, 0xe1, 0xd6, 0xa1, 0x28, 0x2b, 0x75, 0x31, 0xec, 0x2c, 0x94, 0x5e, 0x2f, 0xe1, 0x6d, 0xdf, 0x28, 0xec, 0xf9, 0xfc, - 0x37, 0xf3, 0xf4, 0xc3, 0x37, 0x7b, 0x7d, 0xf5, 0xe4, 0xe2, 0xff, 0x9d, 0x84, 0x5e, 0x52, 0x78, 0xe5, 0xbb, 0x8b, 0xf8, 0x67, 0xec, 0x3f, 0x72, 0xcc, 0x83, 0x7d, 0x84, 0x3f, 0x08, 0xfa, 0x8c, - 0xf5, 0xfe, 0x99, 0xfc, 0x3b, 0xe2, 0x6f, 0x97, 0x26, 0x37, 0xda, 0xbf, 0xa3, 0x0d, 0xa8, 0x32, 0x70, 0xc6, 0x56, 0xae, 0x9a, 0x71, 0xf9, 0x7c, 0x76, 0x38, 0xd8, 0xa8, 0xcf, 0xb5, 0xfe, 0x42, - 0xea, 0xb2, 0x5e, 0xd4, 0x49, 0xb7, 0xe1, 0x29, 0xff, 0xb0, 0x57, 0xb7, 0x1c, 0x1c, 0x79, 0x16, 0x9b, 0xb2, 0x54, 0x9e, 0xc6, 0xe4, 0xa2, 0x03, 0x8b, 0x0d, 0xcb, 0x36, 0x58, 0xb3, 0x44, 0x9a, - 0xd5, 0x74, 0xaa, 0x51, 0xcc, 0x96, 0xb3, 0xe4, 0xd5, 0xb0, 0x6f, 0x0e, 0x99, 0x5a, 0xf1, 0xd8, 0xa8, 0x3d, 0xbf, 0xcf, 0x36, 0xde, 0x3d, 0x80, 0xf0, 0xa7, 0x82, 0x25, 0x3f, 0x12, 0x7e, 0x87, - 0xe6, 0xda, 0x63, 0x1b, 0x1f, 0x17, 0x30, 0x89, 0x88, 0xe7, 0xce, 0x9e, 0x83, 0xa1, 0x09, 0x09, 0x85, 0x57, 0x18, 0x22, 0xe4, 0x88, 0x76, 0x0e, 0xcc, 0x45, 0xe2, 0x90, 0x0b, 0xe4, 0xc2, 0xe2, - 0x13, 0x39, 0x0c, 0xce, 0x60, 0xb8, 0x34, 0x13, 0x42, 0xb7, 0x20, 0x7b, 0x8e, 0xe1, 0x8a, 0x2c, 0x49, 0x5d, 0xb8, 0x5e, 0xf6, 0x54, 0x22, 0x73, 0x76, 0x33, 0x8d, 0x2c, 0x77, 0xb7, 0x9e, 0xb2, - 0x19, 0x8f, 0x4c, 0xe7, 0xc6, 0xa9, 0x89, 0x6a, 0xdc, 0x7e, 0x8e, 0x05, 0xbd, 0xaa, 0xf4, 0x9c, 0xe6, 0x35, 0x89, 0xfa, 0x73, 0xaf, 0x8b, 0xcb, 0xed, 0x4f, 0x49, 0xd6, 0x3f, 0xed, 0x0e, 0x7e, - 0xb6, 0x98, 0xef, 0xef, 0xb3, 0xfe, 0x37, 0x16, 0x99, 0x0b, 0xe1, 0x77, 0xbc, 0x2f, 0xa7, 0x63, 0x8b, 0xac, 0x77, 0x34, 0xe6, 0xca, 0x46, 0x6e, 0x35, 0x7d, 0x9b, 0x70, 0x0e, 0x86, 0x1e, 0xb2, - 0x05, 0x4b, 0x25, 0x1a, 0x6a, 0xd6, 0x24, 0x8c, 0xb6, 0xe2, 0x34, 0x0c, 0x6a, 0x6c, 0xb6, 0xef, 0xc2, 0x03, 0xb3, 0x45, 0x0e, 0x47, 0xb6, 0xcd, 0x5c, 0xff, 0x3c, 0x87, 0x98, 0x60, 0x79, 0x12, - 0x24, 0xc9, 0xaa, 0xe2, 0xed, 0x72, 0x3b, 0xc4, 0xf4, 0xea, 0x14, 0x74, 0xc7, 0xce, 0x9e, 0x1a, 0x1c, 0x04, 0xea, 0xa8, 0xf9, 0x9c, 0xd7, 0xe5, 0x91, 0xdb, 0x00, 0xfe, 0x54, 0x0b, 0xe4, 0x03, - 0xdd, 0x47, 0xa6, 0xcd, 0x7d, 0x42, 0x8f, 0xdd, 0xd4, 0xe8, 0x93, 0x5e, 0xea, 0x3b, 0xbf, 0xf3, 0xfe, 0x15, 0x3e, 0x35, 0xa5, 0xfd, 0x9e, 0x95, 0xf8, 0xcf, 0xa3, 0x0f, 0x42, 0xac, 0x48, 0x44, - 0xa4, 0x34, 0xd1, 0xc2, 0x08, 0xa4, 0xb3, 0x40, 0x61, 0x2e, 0x71, 0x35, 0xb8, 0x5d, 0xa1, 0x4b, 0x8d, 0x80, 0x76, 0x5c, 0x31, 0x45, 0xe5, 0xc3, 0x14, 0xe6, 0x63, 0x07, 0x66, 0x0f, 0x87, 0xc2, - 0x5f, 0x23, 0x53, 0x5a, 0xc1, 0x01, 0x46, 0x23, 0xe3, 0xd0, 0x83, 0xe6, 0xc4, 0x42, 0x99, 0x9d, 0xf4, 0x4d, 0x88, 0xad, 0x9a, 0x06, 0x10, 0x0d, 0xf2, 0x9c, 0x01, 0x84, 0x1b, 0x15, 0xda, 0x0f, - 0x46, 0xd0, 0xdb, 0xd5, 0x1f, 0x95, 0xce, 0x11, 0xed, 0x7d, 0xff, 0x5b, 0x2c, 0x3c, 0x02, 0xc3, 0x91, 0x0c, 0x0d, 0x95, 0xbb, 0x54, 0x61, 0x87, 0x43, 0xc0, 0x0d, 0xcb, 0x8a, 0x23, 0xd2, 0x85, - 0xbb, 0x0a, 0xbc, 0x76, 0x08, 0xbc, 0x61, 0x89, 0xa3, 0xd8, 0xd4, 0x2b, 0xf1, 0x35, 0xd8, 0xf6, 0x9b, 0x03, 0x74, 0xe4, 0x07, 0x15, 0x8c, 0x23, 0x16, 0x43, 0x63, 0x25, 0x74, 0x69, 0x43, 0x4b, - 0x36, 0x0b, 0x63, 0x2d, 0xf7, 0xc8, 0x50, 0x94, 0x62, 0x9a, 0xab, 0xd4, 0xc9, 0xaa, 0xa6, 0x8b, 0xda, 0x00, 0x64, 0x4b, 0x18, 0x93, 0xce, 0xf6, 0xe6, 0xcc, 0xba, 0xef, 0x4b, 0x7d, 0xa6, 0x26, - 0xd5, 0x95, 0xe4, 0x05, 0x8f, 0x97, 0x83, 0x09, 0x39, 0xae, 0x1a, 0x55, 0x8b, 0xae, 0xa6, 0xe2, 0x74, 0x46, 0x60, 0x4d, 0x7a, 0x9c, 0x17, 0xe9, 0x71, 0xbe, 0x38, 0x0d, 0xba, 0x50, 0x49, 0x2a, - 0x54, 0x8b, 0xb0, 0x59, 0x02, 0x8d, 0x77, 0x5a, 0x9b, 0x7e, 0xa1, 0xc3, 0x92, 0x4d, 0x79, 0xc0, 0x74, 0x16, 0x6c, 0xf7, 0x16, 0x20, 0x9d, 0xa7, 0xf9, 0x82, 0x47, 0xeb, 0x2c, 0x8c, 0xd2, 0x8d, - 0xb0, 0xb4, 0xd8, 0x14, 0x4b, 0xc1, 0xd6, 0x52, 0x8a, 0x15, 0x78, 0x2c, 0x95, 0x01, 0x79, 0x6e, 0x4e, 0xbf, 0xf6, 0x45, 0x7d, 0x51, 0x0d, 0xbf, 0x78, 0x70, 0x3e, 0xb6, 0x0c, 0xbd, 0x53, 0x8d, - 0xe9, 0xb1, 0x34, 0x40, 0xff, 0x47, 0x1a, 0xfc, 0xbf, 0x27, 0x0d, 0x8a, 0x32, 0x4a, 0xad, 0x87, 0x96, 0xd2, 0x33, 0xb1, 0x90, 0x37, 0x9a, 0x37, 0x2e, 0x8f, 0x52, 0xeb, 0x12, 0x12, 0x3a, 0x82, - 0xcd, 0xbd, 0x45, 0x33, 0x9f, 0x77, 0xa4, 0x56, 0xb8, 0x16, 0x10, 0x60, 0x05, 0x20, 0xf3, 0x6d, 0xb6, 0x87, 0x94, 0x5e, 0x3d, 0x80, 0x3b, 0xdd, 0x5b, 0xb1, 0xdc, 0x06, 0x0c, 0xa6, 0xf5, 0x86, - 0x51, 0x24, 0xc8, 0x59, 0x37, 0x2a, 0xc2, 0x3b, 0x33, 0x21, 0x53, 0xb7, 0x6d, 0x18, 0xeb, 0x84, 0xb5, 0xf0, 0x4e, 0xe5, 0x94, 0x05, 0x2b, 0x5b, 0xcc, 0x0b, 0x48, 0xa8, 0x86, 0x14, 0x8a, 0x2b, - 0x6b, 0xaf, 0x8d, 0xd4, 0x9f, 0x5e, 0x5d, 0xd3, 0xf7, 0x75, 0xcb, 0xe7, 0x34, 0xfa, 0x0b, 0xcd, 0x0b, 0x0a, 0x97, 0xa3, 0x09, 0x3c, 0x4e, 0x67, 0x77, 0xa6, 0x5c, 0x54, 0x15, 0xfb, 0x1a, 0x6f, - 0x79, 0xbe, 0xee, 0x36, 0x06, 0x62, 0x94, 0x8c, 0x8c, 0x45, 0xf6, 0xfc, 0xc8, 0xac, 0x29, 0xc5, 0xe6, 0x71, 0x63, 0xc1, 0x66, 0x26, 0xeb, 0xd0, 0xd0, 0x26, 0x4f, 0xda, 0xd6, 0x3f, 0x1e, 0x65, - 0x67, 0x55, 0xe6, 0xa0, 0x65, 0x46, 0x8c, 0xac, 0x25, 0x32, 0x7a, 0x0a, 0x4a, 0x63, 0x47, 0x70, 0x44, 0x4b, 0x2d, 0x1c, 0x7c, 0x81, 0x4f, 0xe5, 0xca, 0xa1, 0x9f, 0x55, 0x98, 0x3e, 0x69, 0x44, - 0xf8, 0xdf, 0xaf, 0xdb, 0x23, 0x2a, 0xc5, 0xe0, 0x7f, 0x9e, 0xdd, 0x54, 0x7e, 0x27, 0x7f, 0x41, 0xf9, 0xad, 0x2a, 0x0c, 0xfe, 0x2d, 0x1d, 0xef, 0x9f, 0x47, 0x60, 0xb3, 0x67, 0x5b, 0x5c, 0x2c, - 0xc4, 0x14, 0x52, 0x7a, 0xc5, 0x68, 0x35, 0x97, 0x2f, 0x96, 0x5d, 0x4b, 0x2f, 0xf7, 0x83, 0xb7, 0xa1, 0x0f, 0xd3, 0xc4, 0x96, 0xce, 0x5d, 0xce, 0xa8, 0xcd, 0xdc, 0x95, 0x66, 0xa4, 0x39, 0x23, - 0x3a, 0x7e, 0x0d, 0xf0, 0x32, 0xae, 0x52, 0x61, 0xbe, 0xdd, 0x00, 0x03, 0xdf, 0xa6, 0xc2, 0x30, 0x54, 0xb3, 0x53, 0x18, 0xf4, 0xd0, 0xa2, 0x94, 0xf1, 0x03, 0x8c, 0x5a, 0x7e, 0xf4, 0xdf, 0x99, - 0x8e, 0xef, 0x1a, 0xea, 0xfd, 0x09, 0xf9, 0x9c, 0x13, 0xe8, 0x46, 0xf5, 0x02, 0xd3, 0xed, 0x78, 0x6c, 0x6f, 0x36, 0x21, 0xf5, 0x85, 0x35, 0x6a, 0x13, 0x0b, 0x40, 0x39, 0xb4, 0x5b, 0x4a, 0x84, - 0xdb, 0x12, 0x55, 0x4f, 0xf0, 0x71, 0x0d, 0xe6, 0xd3, 0x79, 0x90, 0x21, 0xa2, 0x71, 0x98, 0xd5, 0xa7, 0x2d, 0x05, 0xae, 0xd1, 0x42, 0xb0, 0x0a, 0x8d, 0xc1, 0x16, 0x94, 0x33, 0xd7, 0xad, 0x7c, - 0x8e, 0xee, 0x34, 0x14, 0x41, 0xa7, 0x1c, 0x76, 0xe8, 0x0b, 0x05, 0xf4, 0xfd, 0x28, 0xe7, 0xd3, 0x63, 0x1d, 0x11, 0xa0, 0x6a, 0x3d, 0xb7, 0xf6, 0x7c, 0x63, 0x47, 0xe4, 0x7f, 0xd8, 0xf1, 0xff, - 0x61, 0x76, 0xbc, 0x03, 0xd8, 0xbf, 0xc1, 0x8f, 0xf7, 0x81, 0x1a, 0xc9, 0x91, 0x28, 0x9d, 0x65, 0x82, 0xef, 0xef, 0x07, 0xea, 0x2c, 0xc2, 0xac, 0x06, 0x22, 0x0e, 0x49, 0x67, 0x74, 0xc6, 0xd2, - 0x3c, 0x37, 0xe4, 0x50, 0x16, 0x19, 0xda, 0xe9, 0x4c, 0x9c, 0xfb, 0x93, 0x96, 0xf5, 0x39, 0x93, 0xc9, 0x7d, 0xbf, 0x2f, 0x24, 0xd5, 0x35, 0x67, 0x5e, 0x34, 0x75, 0x42, 0x8a, 0x65, 0x1b, 0x1c, - 0xc6, 0x6b, 0xac, 0x2b, 0x68, 0x33, 0x0d, 0x74, 0x5f, 0x0f, 0x33, 0x7a, 0xc6, 0x16, 0xe3, 0x14, 0xc2, 0x9f, 0x2d, 0xbe, 0x67, 0x12, 0xf8, 0x6f, 0x34, 0x2f, 0x40, 0xbc, 0xda, 0x79, 0xa3, 0x12, - 0xf7, 0x8f, 0x7a, 0xe5, 0x9c, 0x0e, 0x47, 0x4c, 0x9a, 0x16, 0x04, 0xb5, 0x33, 0x21, 0xf7, 0x18, 0xcc, 0x04, 0x3d, 0x22, 0x40, 0x2a, 0x8a, 0x51, 0x08, 0x12, 0xd8, 0xbd, 0xba, 0x3a, 0xa1, 0xc8, - 0x16, 0x74, 0x0d, 0x6f, 0xaf, 0xee, 0x3a, 0x01, 0x83, 0xf7, 0xbd, 0x7a, 0xb6, 0x12, 0x11, 0xf6, 0x94, 0x94, 0xc1, 0x4d, 0x5a, 0xd3, 0xc0, 0xf5, 0x81, 0xe6, 0xc8, 0xf9, 0x7e, 0x97, 0xea, 0xf4, - 0x8e, 0x31, 0xce, 0xc4, 0x98, 0x0a, 0x1f, 0x97, 0x12, 0x79, 0x93, 0xda, 0x2a, 0x2f, 0xd1, 0x82, 0x61, 0xf4, 0x28, 0x5b, 0xe9, 0xb9, 0xde, 0x9a, 0xdf, 0xa8, 0xbf, 0x20, 0xf3, 0xf5, 0xda, 0xd8, - 0x4e, 0x9b, 0x11, 0x88, 0x1c, 0xec, 0x6c, 0x37, 0x80, 0xcd, 0x59, 0x99, 0x6a, 0x04, 0x20, 0xba, 0xfa, 0x2a, 0x10, 0xf6, 0x9c, 0xba, 0xc1, 0x10, 0x12, 0xd8, 0x9c, 0x0c, 0xfb, 0x28, 0x0f, 0x1c, - 0x8a, 0xc0, 0x5c, 0x33, 0x95, 0x57, 0xda, 0x49, 0x6a, 0x56, 0xc2, 0x92, 0x81, 0x96, 0x1b, 0x04, 0xd8, 0x23, 0xe7, 0xda, 0xe0, 0x5d, 0x41, 0x4a, 0x4d, 0xcc, 0x55, 0x08, 0x7f, 0x76, 0xae, 0x5c, - 0x6c, 0x77, 0x58, 0x03, 0xfb, 0x6f, 0xdd, 0x73, 0x7e, 0xac, 0x4c, 0x88, 0x3e, 0x37, 0x43, 0x5e, 0x8b, 0x12, 0xde, 0xea, 0x11, 0xa2, 0xe3, 0x66, 0x46, 0x2a, 0x77, 0x00, 0xe2, 0x1f, 0x65, 0x9b, - 0x59, 0x0f, 0x32, 0xa9, 0x43, 0x1b, 0x03, 0x5a, 0x9e, 0xdc, 0xec, 0x20, 0x4a, 0x9e, 0x5a, 0x6f, 0xb1, 0x12, 0x4a, 0x44, 0x7a, 0x20, 0x19, 0xc6, 0xea, 0xa6, 0x87, 0xe0, 0xe4, 0x59, 0xa4, 0xcd, - 0x45, 0x11, 0x02, 0x31, 0x46, 0xb9, 0x64, 0xcb, 0xb9, 0x0b, 0xf2, 0x67, 0x68, 0x83, 0x48, 0xce, 0x40, 0xec, 0x60, 0x18, 0x9e, 0x5a, 0xf3, 0xa3, 0xe6, 0xd8, 0xd0, 0xb7, 0xf1, 0xfa, 0x96, 0x55, - 0x4d, 0xe2, 0x6a, 0x52, 0x36, 0x59, 0x1d, 0xfd, 0x58, 0x82, 0xeb, 0xef, 0x07, 0xfe, 0x85, 0x36, 0x38, 0xf9, 0x7a, 0x65, 0x4c, 0x75, 0x85, 0x17, 0x28, 0x66, 0x41, 0x65, 0xcc, 0x76, 0x73, 0x86, - 0xe7, 0x85, 0x50, 0x4f, 0xb2, 0xfd, 0x9c, 0x87, 0x73, 0xbb, 0xc5, 0x4e, 0x92, 0x75, 0xc0, 0x36, 0xf3, 0x68, 0xa6, 0x2b, 0xcb, 0xd8, 0xde, 0x19, 0x29, 0x5e, 0xb1, 0x15, 0xa0, 0x84, 0xb6, 0x39, - 0xa4, 0x6a, 0xa7, 0x76, 0x78, 0xb1, 0x29, 0xc5, 0x53, 0x19, 0xd4, 0x59, 0x26, 0xc0, 0xf8, 0x96, 0xa4, 0x5a, 0x4a, 0x21, 0xb4, 0xd5, 0xa0, 0xa6, 0xac, 0x2f, 0xec, 0x46, 0xf4, 0xca, 0xf9, 0x5c, - 0xab, 0xf2, 0xce, 0x66, 0xf0, 0xc7, 0x72, 0x52, 0xff, 0xf9, 0x3f, 0x5f, 0x8a, 0x47, 0x5d, 0x66, 0xdd, 0x6b, 0xbf, 0xcc, 0x6f, 0x69, 0xe7, 0xbe, 0x55, 0xd5, 0xaf, 0x7b, 0xf7, 0xd8, 0x1f, 0x18, - 0x7f, 0x1c, 0x15, 0xf0, 0xcd, 0xf1, 0x9e, 0xe5, 0xae, 0x37, 0xc9, 0xab, 0x0f, 0x41, 0x1e, 0x2f, 0x36, 0xcb, 0xa7, 0x18, 0xd6, 0xbc, 0xf5, 0xca, 0x24, 0xb7, 0xdc, 0x49, 0x51, 0xe6, 0xb5, 0xe7, - 0x7c, 0x88, 0xfc, 0x45, 0x3e, 0x07, 0xe7, 0x16, 0x65, 0x9e, 0x4e, 0x9c, 0x24, 0x7a, 0x8d, 0x9c, 0x80, 0xb1, 0xaf, 0x11, 0x25, 0xa7, 0xd7, 0xb1, 0xc3, 0xf0, 0xdf, 0xc5, 0x86, 0xde, 0xe9, 0x00, - 0xf9, 0xcf, 0x1d, 0x31, 0xfb, 0xdc, 0x96, 0xe2, 0xbd, 0x46, 0x90, 0xdf, 0xab, 0xe4, 0xfd, 0xf3, 0x88, 0xa3, 0x28, 0x80, 0xde, 0x9f, 0x3c, 0xdb, 0x9e, 0x0f, 0xc5, 0x81, 0x96, 0x14, 0x60, 0x6f, - 0x11, 0x12, 0x42, 0x5b, 0xd5, 0x32, 0x0f, 0x3c, 0x65, 0x33, 0x38, 0x8b, 0x9a, 0x59, 0x8a, 0x6e, 0xb1, 0xe1, 0xf9, 0x9e, 0x09, 0x60, 0xc8, 0x87, 0x70, 0x6b, 0x37, 0xd7, 0x59, 0xdb, 0x99, 0x9d, - 0x16, 0x3e, 0xb8, 0x3d, 0x74, 0xf0, 0x2c, 0x66, 0x4c, 0xe0, 0x84, 0x80, 0xf6, 0x8c, 0x0d, 0x50, 0xae, 0x6d, 0x4a, 0x01, 0x95, 0x3f, 0x15, 0x10, 0xbc, 0xfb, 0x35, 0x1f, 0x01, 0xf1, 0xf5, 0x1b, - 0x8f, 0x07, 0xe2, 0x46, 0xfb, 0x52, 0x54, 0xf1, 0x72, 0x74, 0x67, 0xab, 0xea, 0x21, 0x0c, 0x5d, 0x71, 0x36, 0x2b, 0x5a, 0xcc, 0xcf, 0xa6, 0xb5, 0x9a, 0xed, 0x56, 0x8b, 0xa5, 0xa9, 0xf6, 0xdc, - 0xcc, 0x32, 0x8a, 0x04, 0x9a, 0x0b, 0x3b, 0x06, 0x98, 0xb3, 0xb4, 0xb5, 0x8a, 0x7a, 0x2f, 0x15, 0xc2, 0x4d, 0x77, 0x3c, 0xcb, 0x01, 0x81, 0x86, 0x98, 0x0a, 0x0b, 0xab, 0x40, 0x5b, 0xf0, 0x85, - 0x7a, 0xda, 0x72, 0xa2, 0xe2, 0xa4, 0xa9, 0xb1, 0x6e, 0x82, 0x52, 0x89, 0x57, 0x09, 0x5b, 0xef, 0x5b, 0xe5, 0x2f, 0xaa, 0x67, 0x7e, 0x60, 0x91, 0x2f, 0x55, 0x5e, 0xfe, 0xf9, 0xe7, 0xd3, 0x1e, - 0xfe, 0xff, 0xe7, 0xe3, 0xff, 0xef, 0xb2, 0xab, 0xba, 0x6c, 0x7a, 0xd6, 0x97, 0x15, 0xa5, 0x2f, 0xbc, 0xc9, 0x6f, 0x1d, 0x47, 0x9f, 0x91, 0x61, 0x77, 0x7f, 0xe3, 0x22, 0xcb, 0xee, 0xde, 0x19, - 0x9b, 0x82, 0x7b, 0xb0, 0x1d, 0xec, 0xe0, 0xf4, 0x95, 0x76, 0x70, 0xaa, 0x2d, 0x6e, 0xf1, 0x9a, 0x46, 0x8a, 0x27, 0x54, 0xea, 0x5a, 0xfe, 0x44, 0x93, 0x53, 0x60, 0x9f, 0xd9, 0x47, 0x6f, 0xe9, - 0xf9, 0x85, 0x67, 0xac, 0x0f, 0x40, 0xd9, 0x0f, 0xf3, 0x55, 0xa2, 0x11, 0xd2, 0xae, 0x9e, 0xaf, 0xc2, 0x8a, 0x90, 0x12, 0x68, 0x7d, 0xd4, 0x16, 0x85, 0x23, 0x00, 0xdd, 0x1a, 0x5a, 0x75, 0xfe, - 0x06, 0x98, 0x4f, 0x35, 0x7c, 0xf9, 0xad, 0xe8, 0xdb, 0xad, 0x3c, 0xe9, 0x25, 0x56, 0xae, 0x29, 0xa3, 0xc9, 0x5b, 0x49, 0xb6, 0x1f, 0x40, 0xfa, 0xfb, 0x75, 0xfe, 0xe1, 0xaf, 0xbc, 0xc2, 0x74, - 0xef, 0xde, 0xd8, 0x2e, 0x9b, 0x7b, 0x21, 0x10, 0xf6, 0x01, 0xee, 0x69, 0xe7, 0x56, 0x31, 0x17, 0xdd, 0x9e, 0x9a, 0xb7, 0xbe, 0x6d, 0xf1, 0x24, 0x73, 0xd8, 0x85, 0x88, 0xb3, 0x06, 0xd0, 0x18, - 0xf7, 0x37, 0x8b, 0x41, 0xdb, 0x4c, 0xcf, 0x7b, 0x76, 0x85, 0xba, 0x3a, 0x6a, 0x91, 0xfb, 0x81, 0xea, 0x11, 0x1f, 0x6c, 0x64, 0xc8, 0x43, 0x59, 0x62, 0x9f, 0xe6, 0x2e, 0x87, 0xe6, 0x3b, 0x1c, - 0x8b, 0x55, 0x99, 0xe6, 0x75, 0x75, 0xb9, 0x0c, 0x1e, 0x00, 0xf5, 0x4b, 0x95, 0x0a, 0xf4, 0xa9, 0xdc, 0xfe, 0x2f, 0xb4, 0xdf, 0x41, 0x79, 0xab, 0x57, 0x81, 0x8e, 0xcb, 0xeb, 0xf7, 0xd1, 0x93, - 0x4c, 0xe7, 0x72, 0x4f, 0xc7, 0x08, 0x13, 0xb2, 0x1e, 0xc8, 0xd3, 0xfa, 0x94, 0x86, 0xbb, 0x75, 0x2a, 0xb0, 0xd3, 0xa9, 0x06, 0x06, 0x9c, 0x94, 0x09, 0x22, 0x63, 0x2c, 0xf0, 0xb0, 0xea, 0x24, - 0x92, 0x5d, 0x0b, 0x31, 0x44, 0xf3, 0x0e, 0xce, 0x1b, 0xe2, 0x40, 0x3b, 0x8b, 0x25, 0x00, 0x9c, 0x93, 0x82, 0x9b, 0x2e, 0x03, 0xce, 0x8a, 0x6a, 0xbd, 0x82, 0x50, 0x46, 0x55, 0x28, 0xec, 0x8e, - 0x4a, 0xf0, 0xf2, 0x72, 0x8f, 0xb3, 0x8a, 0x9f, 0x2b, 0xb7, 0xf3, 0x46, 0xf5, 0x6d, 0xf8, 0x91, 0xef, 0x8f, 0x2d, 0xb6, 0x73, 0x5e, 0x35, 0xb9, 0x8a, 0x03, 0x6b, 0x9a, 0x3e, 0x24, 0x26, 0x55, - 0x77, 0x9e, 0x6b, 0x29, 0x3e, 0xc1, 0x9c, 0x11, 0x35, 0x90, 0xf5, 0x73, 0x1b, 0x98, 0x92, 0x91, 0x6f, 0x85, 0x93, 0xd9, 0xf8, 0xe9, 0x2a, 0xb2, 0xa1, 0x7a, 0x8d, 0xd4, 0x5e, 0xb0, 0x65, 0x25, - 0xd3, 0x86, 0x0b, 0x5d, 0x0c, 0x96, 0x61, 0x72, 0xe2, 0x12, 0x06, 0xf2, 0x24, 0xc8, 0x41, 0x3b, 0xb6, 0x95, 0x9d, 0x74, 0x38, 0x63, 0x63, 0xac, 0x84, 0xcb, 0x9b, 0xfe, 0x98, 0x60, 0x8c, 0x3c, - 0x11, 0x66, 0xfc, 0x46, 0xf5, 0x15, 0x8b, 0x5b, 0x8a, 0x31, 0xf2, 0x5b, 0x40, 0xf1, 0x65, 0x0f, 0x8e, 0xab, 0xe7, 0x4e, 0xa0, 0x12, 0x54, 0x17, 0xa9, 0x6a, 0xd4, 0x99, 0x48, 0x28, 0xba, 0x2b, - 0xdf, 0xe1, 0xc5, 0xa3, 0x47, 0x1f, 0x24, 0x3f, 0xeb, 0x52, 0x56, 0xd9, 0x1f, 0xc2, 0xd4, 0x13, 0x36, 0x54, 0x39, 0x87, 0xd4, 0x45, 0x97, 0x4e, 0x41, 0xb9, 0xce, 0xd1, 0x1d, 0xa9, 0xe4, 0xa6, - 0x50, 0xe0, 0x4e, 0x94, 0x98, 0xf6, 0x79, 0x90, 0xf0, 0x48, 0x15, 0x55, 0xb9, 0x5a, 0x01, 0x33, 0x8f, 0x7b, 0xce, 0x86, 0xff, 0xaf, 0x17, 0x4d, 0x24, 0x89, 0x6c, 0xd0, 0xaf, 0xfe, 0x54, 0xb5, - 0xf5, 0xde, 0x62, 0xfd, 0x53, 0xc4, 0xe7, 0xc7, 0xa7, 0xba, 0xd7, 0x68, 0x82, 0x6f, 0x8a, 0xc8, 0xf7, 0x10, 0xce, 0xaf, 0x75, 0x7a, 0xbc, 0x32, 0xf0, 0x90, 0xff, 0xbc, 0x7b, 0x99, 0x3f, 0xde, - 0x8b, 0x9c, 0xf2, 0x43, 0xf7, 0x71, 0xec, 0xeb, 0x2b, 0x7c, 0x6d, 0x4e, 0xfe, 0x30, 0xc9, 0xed, 0xf2, 0x35, 0xee, 0x06, 0x5d, 0xfe, 0xab, 0xfb, 0x2a, 0x8f, 0x7f, 0xe6, 0x95, 0x23, 0xee, 0x07, - 0x7e, 0x8e, 0xdc, 0x65, 0x49, 0x42, 0x17, 0xec, 0xe6, 0xc0, 0xfa, 0x48, 0x53, 0xbc, 0x99, 0xab, 0xd3, 0x3a, 0xd1, 0x4b, 0x8b, 0xaf, 0xfd, 0x10, 0x3f, 0x18, 0x51, 0xbc, 0x8c, 0xad, 0xe4, 0xe0, - 0x1c, 0xc9, 0xca, 0xd2, 0xea, 0xc6, 0xca, 0x76, 0x5c, 0xbf, 0xde, 0x9c, 0x33, 0x3e, 0xdc, 0x1d, 0x66, 0xdc, 0xea, 0xc4, 0x9f, 0x39, 0x32, 0xad, 0x14, 0x8a, 0x83, 0x9a, 0x69, 0x7a, 0x4a, 0x8e, - 0x5d, 0x3c, 0xd5, 0xa9, 0x73, 0xdb, 0xf1, 0xa3, 0xa7, 0xcb, 0xed, 0xd5, 0x7f, 0xc6, 0x0d, 0xff, 0x43, 0xfe, 0x37, 0x71, 0xbb, 0x0f, 0xd8, 0x2b, 0x52, 0x17, 0xfa, 0xbf, 0x23, 0x55, 0xb1, 0xfa, - 0x56, 0x0d, 0x32, 0xc6, 0xac, 0xbc, 0x75, 0x03, 0xcb, 0x41, 0x4c, 0x24, 0x9a, 0x2d, 0x43, 0xbc, 0x1f, 0xcf, 0x43, 0x73, 0x7f, 0x60, 0xd2, 0xc2, 0xc4, 0x19, 0x6b, 0xb7, 0x38, 0xf6, 0xeb, 0x10, - 0x0f, 0x98, 0x03, 0x1b, 0x58, 0x60, 0xb3, 0x5d, 0xc5, 0xf2, 0x96, 0x2f, 0xb8, 0x79, 0x3c, 0xa5, 0x2d, 0x77, 0xbf, 0x2c, 0x5c, 0xc9, 0x99, 0xae, 0x77, 0x9c, 0x1a, 0x94, 0x26, 0x59, 0x65, 0xb9, - 0xfc, 0xbb, 0x65, 0xf1, 0x5f, 0x37, 0xf5, 0xff, 0x52, 0xbf, 0xe6, 0xc2, 0xd9, 0xff, 0x79, 0x8f, 0x9d, 0xf8, 0xc0, 0xb8, 0x1f, 0x8a, 0xc3, 0x7f, 0xbf, 0xf3, 0x73, 0x71, 0xf8, 0x47, 0x95, 0xc9, - 0xd1, 0x6f, 0x0f, 0x35, 0x65, 0xf4, 0x46, 0xe2, 0xd3, 0x6f, 0x94, 0xbe, 0xeb, 0xbc, 0xcd, 0xd6, 0xbf, 0xf2, 0xce, 0xfd, 0x4f, 0x95, 0xf8, 0x7f, 0x3e, 0xfc, 0xfb, 0x9f, 0x2a, 0xf1, 0xbf, 0xd9, - 0x30, 0xff, 0x57, 0x55, 0x89, 0xbf, 0x7c, 0xed, 0xc4, 0x6b, 0xbd, 0xac, 0x0a, 0x6b, 0x2f, 0xca, 0x7e, 0xf0, 0x31, 0xfe, 0x7d, 0xf6, 0xfe, 0x57, 0xe2, 0xaf, 0xf2, 0xef, 0xc3, 0xa5, 0x31, 0x2d, - 0xdc, 0xe1, 0xc9, 0xd6, 0x28, 0x1c, 0x33, 0x0f, 0x88, 0xf9, 0x69, 0xb3, 0x39, 0x2d, 0x64, 0x20, 0x54, 0x28, 0xb3, 0x39, 0xb9, 0xb8, 0xa7, 0x38, 0x23, 0x05, 0xfd, 0x65, 0x27, 0xec, 0x8d, 0xed, - 0x1e, 0xf9, 0x8d, 0x9e, 0x34, 0x27, 0x3e, 0x10, 0x7f, 0x1d, 0xe2, 0x87, 0x4b, 0x63, 0x2b, 0xbc, 0x9d, 0x14, 0xa4, 0x04, 0x3c, 0x94, 0x6f, 0xc3, 0xd9, 0x3c, 0x2d, 0x5c, 0x7e, 0xd3, 0x82, 0xa0, - 0x46, 0xcd, 0xb3, 0x79, 0x92, 0x19, 0xb1, 0x35, 0x25, 0x64, 0x81, 0x6b, 0xac, 0x03, 0xb3, 0xe6, 0x8e, 0x1d, 0x72, 0x6c, 0x79, 0x89, 0xda, 0x73, 0xf1, 0x99, 0x07, 0x7c, 0xb0, 0xe4, 0x17, 0x0a, - 0xb6, 0xf1, 0xb0, 0x22, 0x3b, 0x52, 0x05, 0xbd, 0x62, 0x8e, 0x8a, 0xa8, 0xc6, 0x06, 0xcf, 0x08, 0x4a, 0x86, 0x8c, 0x90, 0xef, 0x3f, 0xd9, 0x5d, 0x5f, 0xd3, 0x6c, 0xbf, 0x03, 0x5b, 0x7a, 0xee, - 0xe3, 0x2c, 0x7b, 0xf4, 0xa9, 0x62, 0x22, 0x1f, 0xe8, 0xbe, 0xc2, 0x79, 0x3d, 0xbb, 0xd8, 0x1e, 0x23, 0x8a, 0x16, 0x00, 0x90, 0x97, 0x02, 0xcb, 0xde, 0xa2, 0x7d, 0x61, 0xe1, 0xcf, 0xe4, 0x85, - 0xe3, 0x12, 0x88, 0xd1, 0x12, 0x79, 0x16, 0xb3, 0x69, 0x1a, 0xea, 0x70, 0x13, 0x52, 0xc4, 0x41, 0xf7, 0x25, 0x8d, 0xd2, 0x3b, 0xc6, 0x23, 0x8e, 0xd6, 0xdc, 0x95, 0xa7, 0xfb, 0x25, 0x5d, 0x41, - 0xa0, 0x98, 0x35, 0xc1, 0x19, 0xd7, 0x5d, 0xba, 0x76, 0x6d, 0x93, 0xf4, 0x88, 0x60, 0x86, 0xd4, 0x0a, 0xed, 0x0e, 0x07, 0xf7, 0x5b, 0x05, 0xe6, 0xcb, 0x8b, 0x55, 0x96, 0x3f, 0x4e, 0xf1, 0x7a, - 0x92, 0xb5, 0x3e, 0xd3, 0x7f, 0x85, 0xe3, 0xf3, 0xd5, 0x8b, 0xaa, 0x35, 0x82, 0xc1, 0xf6, 0x80, 0xb0, 0x72, 0x10, 0x37, 0x5d, 0xae, 0x93, 0x6d, 0x91, 0x70, 0x20, 0x8f, 0x09, 0x74, 0x42, 0xaf, - 0x1d, 0x86, 0x67, 0xfc, 0x6d, 0xbd, 0x25, 0x58, 0x83, 0xc2, 0x1a, 0x7d, 0x7d, 0x90, 0x89, 0x59, 0xeb, 0x0c, 0xf4, 0xda, 0x09, 0x50, 0xd4, 0x40, 0x06, 0x78, 0xa9, 0xdb, 0x89, 0x4a, 0x9c, 0x5d, - 0x03, 0xc7, 0xb6, 0x07, 0x43, 0xe7, 0x67, 0x2d, 0x00, 0xed, 0x8b, 0x13, 0xb5, 0xcc, 0x89, 0xe1, 0x38, 0x66, 0x9b, 0xfb, 0xc3, 0xca, 0x7d, 0x1f, 0x9e, 0xa7, 0x8d, 0xb4, 0xa6, 0x8c, 0x5e, 0x31, - 0x79, 0x61, 0xdd, 0x91, 0x5d, 0x6e, 0x9d, 0x65, 0x53, 0x09, 0xec, 0xb2, 0x06, 0x15, 0x30, 0x5f, 0x12, 0x03, 0x08, 0x67, 0xbd, 0xef, 0x21, 0xf3, 0x76, 0x21, 0xe8, 0x6a, 0x1e, 0xea, 0x8a, 0xdf, - 0x1e, 0xa5, 0xb0, 0x3d, 0x43, 0xd9, 0x74, 0xb6, 0x07, 0xce, 0x3e, 0x2e, 0xe6, 0xd3, 0x43, 0xcc, 0xf0, 0xce, 0xbe, 0xa0, 0xd1, 0x46, 0xd2, 0x58, 0x27, 0x1c, 0x0c, 0xa7, 0x6a, 0xb7, 0x49, 0x69, - 0x15, 0x8c, 0x7b, 0x80, 0x9b, 0x3d, 0x60, 0x2c, 0xee, 0x9a, 0xe9, 0x8f, 0x79, 0xe2, 0x8b, 0x1f, 0xf5, 0x6f, 0x46, 0xfd, 0xce, 0x08, 0x2f, 0x1f, 0xff, 0x4a, 0xe8, 0xf7, 0x41, 0xa7, 0xe0, 0xd4, - 0x52, 0x44, 0x2a, 0xf3, 0xf1, 0xa6, 0x37, 0xdc, 0x92, 0xf3, 0x90, 0xd3, 0xe9, 0x04, 0x40, 0x03, 0x9a, 0x2f, 0xfa, 0x19, 0xc0, 0x00, 0xc0, 0x29, 0x11, 0xe4, 0x7c, 0xbd, 0x52, 0x97, 0xd8, 0x7e, - 0x09, 0x65, 0x7b, 0x81, 0xe6, 0x08, 0x05, 0x9d, 0x9f, 0x0f, 0x32, 0xba, 0xd1, 0xbb, 0x1a, 0x4c, 0x5d, 0x9a, 0x24, 0x17, 0x1b, 0x05, 0x9b, 0x63, 0x68, 0x31, 0xa3, 0xf3, 0x53, 0xb9, 0x43, 0x86, - 0x11, 0x8e, 0xe9, 0x37, 0xf5, 0xf1, 0x45, 0x11, 0xba, 0xa5, 0x1b, 0x95, 0x37, 0xad, 0xe2, 0x8b, 0x27, 0xf9, 0xed, 0xd1, 0x4b, 0x95, 0x92, 0xdb, 0x33, 0xd0, 0x83, 0x67, 0xee, 0x69, 0xd2, 0x9f, - 0xc8, 0x7f, 0x8b, 0xc0, 0x7e, 0xab, 0xd5, 0x91, 0xe4, 0x41, 0xf0, 0x51, 0xff, 0xf8, 0x9c, 0x64, 0x79, 0xeb, 0xb9, 0xff, 0xa2, 0xc8, 0x22, 0xdf, 0xfd, 0xe0, 0xf7, 0x9d, 0x78, 0x77, 0xd4, 0x61, - 0x3f, 0xca, 0xdc, 0x49, 0xda, 0x4f, 0x3a, 0xeb, 0xea, 0x38, 0x27, 0xbf, 0x66, 0xf2, 0x25, 0x51, 0x10, 0xd6, 0x2f, 0x4f, 0xbc, 0xe0, 0xe6, 0x55, 0xaf, 0xa6, 0x24, 0xf1, 0x25, 0xfd, 0x2c, 0xca, - 0x5e, 0xdf, 0xe6, 0x0b, 0x5a, 0xb7, 0x8e, 0x4a, 0x93, 0xce, 0x2a, 0xb3, 0x8f, 0xa3, 0xf9, 0xfa, 0xd0, 0xb9, 0x9f, 0x58, 0xae, 0x5b, 0xbe, 0xdd, 0xff, 0xe4, 0x7c, 0xff, 0xa0, 0x36, 0x7f, 0xb1, - 0x53, 0x2b, 0xcf, 0x69, 0x4a, 0xef, 0x8a, 0xf0, 0x47, 0xc7, 0x27, 0xfe, 0xf5, 0xb1, 0x0f, 0x39, 0x6e, 0x5f, 0x3c, 0xfb, 0x75, 0x94, 0xf5, 0x6f, 0x9d, 0xee, 0x6e, 0x3b, 0x0e, 0xb7, 0xbb, 0xdf, - 0x57, 0x92, 0xd3, 0xe3, 0x75, 0xf9, 0x59, 0xb3, 0xf5, 0x74, 0x9b, 0x26, 0xa7, 0xc9, 0x95, 0xc8, 0xef, 0x93, 0x84, 0x9c, 0x39, 0x43, 0x45, 0x05, 0xcb, 0x2d, 0x57, 0xea, 0x83, 0x0a, 0xcc, 0x8e, - 0x95, 0xc1, 0x3a, 0x4d, 0x71, 0xda, 0xf4, 0xe7, 0x1d, 0x7f, 0x38, 0x94, 0xbc, 0xb4, 0x56, 0x94, 0xb3, 0x86, 0x80, 0x5c, 0xe4, 0xe8, 0x14, 0x49, 0xd1, 0x1b, 0x85, 0x55, 0x14, 0x0a, 0xe0, 0x1d, - 0xa4, 0xd9, 0x0f, 0x5a, 0x53, 0x48, 0x15, 0x66, 0xec, 0xb0, 0xd5, 0xc0, 0xa6, 0xec, 0x39, 0x8e, 0xa7, 0x3a, 0x7b, 0xe6, 0xc0, 0xe0, 0xf7, 0x49, 0x52, 0x7a, 0x4d, 0xf5, 0x31, 0x3b, 0xf2, 0x41, - 0xd5, 0xa9, 0x3b, 0x09, 0xa9, 0xf7, 0x20, 0x23, 0x9e, 0xf3, 0x8c, 0x7e, 0x21, 0xfe, 0x02, 0xde, 0x97, 0x4b, 0x97, 0xfe, 0x64, 0x23, 0x56, 0x1a, 0x72, 0x51, 0x54, 0xe0, 0x61, 0xdf, 0xa7, 0xf6, - 0xfa, 0x88, 0xc8, 0x6b, 0x43, 0xc0, 0xc4, 0xa1, 0xd8, 0x48, 0xa5, 0x11, 0x6f, 0x42, 0x77, 0x79, 0x3e, 0x34, 0xcb, 0xb6, 0x47, 0x64, 0xb6, 0x5a, 0xcf, 0x88, 0x24, 0x6e, 0x72, 0x57, 0x68, 0xdd, - 0xe3, 0xbe, 0x02, 0x9d, 0xa2, 0x5f, 0xad, 0xd0, 0xa9, 0xbe, 0xd4, 0x0b, 0x1e, 0x92, 0x22, 0x98, 0x6f, 0x03, 0x38, 0x6f, 0xed, 0xcd, 0xb0, 0x76, 0xe7, 0x2c, 0xfb, 0x9c, 0xdf, 0xc7, 0x4f, 0xac, - 0xfa, 0x43, 0x76, 0xe3, 0x0f, 0x25, 0xbd, 0x3e, 0x35, 0x3e, 0xbe, 0x07, 0x2b, 0xf9, 0x2c, 0xac, 0x37, 0xb2, 0x57, 0x40, 0x6f, 0x27, 0x97, 0x3a, 0xf9, 0x23, 0xa0, 0x3c, 0x49, 0x39, 0x3d, 0x07, - 0xdc, 0x8d, 0x96, 0x4e, 0x91, 0xb5, 0x63, 0x63, 0xac, 0xad, 0xb7, 0x99, 0xb0, 0x3a, 0xab, 0xdb, 0x78, 0x9a, 0x02, 0x8a, 0x52, 0x78, 0x58, 0xc0, 0x35, 0x8b, 0x72, 0x38, 0xae, 0xc9, 0x74, 0xa6, - 0x27, 0xa0, 0x1b, 0x1b, 0xbb, 0x06, 0x91, 0x5c, 0x19, 0xd9, 0x5a, 0x28, 0x84, 0x88, 0x58, 0x7e, 0x3a, 0xee, 0x02, 0x3a, 0x2a, 0x89, 0xd8, 0x5a, 0xef, 0x57, 0x88, 0xb6, 0xd3, 0x8b, 0xe7, 0xb2, - 0x74, 0xea, 0xfc, 0x56, 0xd8, 0xe4, 0xbd, 0x3b, 0x34, 0xfe, 0x83, 0x76, 0xf8, 0x49, 0xfe, 0xdd, 0xc7, 0xf3, 0x99, 0xaa, 0x00, 0x1f, 0xe8, 0x5e, 0x00, 0x7d, 0x3b, 0x9b, 0x5c, 0xe8, 0xfd, 0x8e, - 0x28, 0x4f, 0xda, 0x5e, 0xb9, 0x77, 0xf9, 0x15, 0x80, 0x4f, 0x45, 0xbd, 0xc4, 0xa2, 0x64, 0xbd, 0xdf, 0x5a, 0x11, 0x96, 0x26, 0xa4, 0x81, 0x9c, 0x98, 0xea, 0x1c, 0x77, 0x68, 0xe1, 0x7b, 0xec, - 0x79, 0x1b, 0x05, 0x66, 0x6a, 0x71, 0xea, 0x30, 0x87, 0xba, 0x78, 0xb5, 0x8e, 0x69, 0xe8, 0xac, 0x4c, 0xd3, 0x85, 0xb3, 0x37, 0x9c, 0xbe, 0x86, 0x70, 0xa8, 0x17, 0x01, 0x14, 0x93, 0x4c, 0x6e, - 0x95, 0xc2, 0xde, 0x78, 0x3d, 0x7b, 0x84, 0x93, 0xe3, 0xb3, 0xb1, 0x72, 0x67, 0x6d, 0xb9, 0xe8, 0x7f, 0x97, 0x6f, 0x81, 0x7c, 0x10, 0xfb, 0x8f, 0x3f, 0x43, 0xf3, 0xa8, 0xf4, 0xc4, 0x73, 0x29, - 0x69, 0x37, 0x9a, 0xaf, 0xf0, 0x37, 0xc5, 0xd8, 0x94, 0xb3, 0x6d, 0x21, 0x75, 0x8c, 0x2b, 0x83, 0x46, 0x72, 0x90, 0x91, 0x36, 0xa6, 0x2c, 0x34, 0xa4, 0x96, 0x51, 0xc1, 0x35, 0x86, 0x12, 0xa1, - 0x9d, 0xe3, 0xe9, 0xb2, 0xbc, 0x30, 0xf6, 0x67, 0x71, 0x29, 0x3a, 0xce, 0x09, 0x83, 0x98, 0xac, 0x23, 0xd9, 0xa4, 0x9a, 0x1d, 0xa6, 0x1b, 0xbb, 0x86, 0xcd, 0x1a, 0x90, 0xd6, 0x0c, 0x31, 0x3f, - 0xd1, 0x55, 0xb3, 0x2c, 0x96, 0x7b, 0x0e, 0x92, 0xaa, 0x6c, 0xb9, 0x4b, 0x9e, 0x0b, 0x31, 0x4c, 0x72, 0xc7, 0xaa, 0xdf, 0x9b, 0x44, 0x7e, 0x4f, 0xc3, 0xbf, 0xd4, 0xa4, 0xf4, 0xce, 0x51, 0x55, - 0xbf, 0x3a, 0x22, 0x1e, 0x63, 0xfc, 0x51, 0xc6, 0xdc, 0xb7, 0x83, 0x9e, 0x29, 0x16, 0xfb, 0x4e, 0xf6, 0x05, 0xe9, 0xb7, 0x93, 0x4b, 0x6d, 0xca, 0x11, 0x25, 0x63, 0xdd, 0x94, 0xae, 0xf0, 0x6d, - 0x47, 0xae, 0x1c, 0x68, 0xd1, 0x6e, 0x0c, 0xbb, 0x0a, 0x45, 0x62, 0x70, 0xc2, 0x29, 0x43, 0x2b, 0x81, 0x9c, 0x0c, 0xc3, 0xcc, 0x3c, 0xa0, 0x6d, 0x9f, 0x28, 0xf4, 0xf2, 0x34, 0xf7, 0x77, 0xd4, - 0xc1, 0x89, 0xec, 0x44, 0x3b, 0x48, 0x82, 0xbf, 0x27, 0x76, 0x51, 0xb3, 0x82, 0x3c, 0x18, 0xf5, 0x38, 0xc3, 0xcc, 0x4d, 0x1d, 0xef, 0xdc, 0xd2, 0x6b, 0xc9, 0x2d, 0x2a, 0x76, 0xcf, 0x0b, 0xe1, - 0xfa, 0x3a, 0xde, 0xef, 0x09, 0xec, 0x65, 0x94, 0x96, 0x96, 0xff, 0x26, 0x9d, 0x1f, 0xd4, 0x53, 0x79, 0x27, 0xf1, 0xc8, 0xd0, 0x7c, 0x42, 0x34, 0x5f, 0x69, 0xde, 0xd0, 0xad, 0x3d, 0xf7, 0x4e, - 0x4e, 0xef, 0x5d, 0x68, 0x07, 0x26, 0x67, 0xe4, 0xa8, 0x71, 0x7b, 0xa0, 0xc4, 0x77, 0x6d, 0xb6, 0xeb, 0x50, 0x61, 0xd5, 0xe3, 0x79, 0x05, 0xe6, 0xca, 0xca, 0xe0, 0x87, 0x72, 0x88, 0x2d, 0xb0, - 0x66, 0xb9, 0x53, 0x69, 0xd6, 0x62, 0xa8, 0x75, 0x94, 0x5d, 0x13, 0x3d, 0x25, 0xb1, 0xc3, 0x66, 0xef, 0xc4, 0xfb, 0x12, 0xa0, 0x92, 0x48, 0xa7, 0x66, 0x36, 0xd1, 0x4b, 0x61, 0x47, 0xed, 0x4d, - 0x52, 0x9f, 0x9b, 0xb8, 0x39, 0x8c, 0xb2, 0xa4, 0xf2, 0x72, 0xe2, 0x59, 0xce, 0xa3, 0x2e, 0x22, 0xd0, 0x1f, 0xf4, 0x99, 0x3d, 0xbf, 0x1b, 0xd1, 0x17, 0x1c, 0x6e, 0x87, 0x93, 0x0b, 0xa5, 0xdf, - 0x81, 0x88, 0x4f, 0x86, 0xbf, 0x2e, 0xc8, 0x34, 0xa7, 0xdb, 0x65, 0x2f, 0xfb, 0x54, 0x7f, 0xdc, 0x23, 0x2d, 0xc9, 0x00, 0x88, 0x88, 0xc9, 0xb1, 0x37, 0xf5, 0x96, 0x38, 0xc0, 0x0d, 0xf4, 0xa1, - 0xb4, 0x22, 0x09, 0x8e, 0x82, 0x8c, 0x82, 0xbb, 0x38, 0xe2, 0xc9, 0xb9, 0x4d, 0xb7, 0x3b, 0x69, 0xdf, 0xca, 0xbe, 0x58, 0xa7, 0x3b, 0x0b, 0xe3, 0x11, 0x25, 0x97, 0xd5, 0xb2, 0x3c, 0x44, 0xad, - 0xab, 0x99, 0xe9, 0x08, 0xa3, 0xe2, 0x5e, 0x2d, 0x1f, 0xf4, 0x01, 0xe3, 0xe4, 0x65, 0x3a, 0x71, 0xad, 0xfa, 0xa7, 0x58, 0xf3, 0x27, 0x44, 0xe0, 0x2b, 0xd5, 0x2b, 0x68, 0xd7, 0xe3, 0x4b, 0xbc, - 0xf9, 0x08, 0x31, 0x38, 0x53, 0x67, 0xc7, 0x64, 0xb7, 0x88, 0xf0, 0x1a, 0x92, 0x37, 0x66, 0x13, 0x1d, 0x72, 0x06, 0x94, 0x89, 0xd6, 0xc9, 0xce, 0xce, 0x5a, 0xde, 0xe2, 0xad, 0xdb, 0x04, 0xbb, - 0xa2, 0x61, 0xfa, 0x88, 0xd8, 0xe9, 0x8b, 0x08, 0x71, 0x92, 0xed, 0xb6, 0x00, 0xce, 0xc1, 0x2c, 0x6c, 0x36, 0x16, 0x3f, 0x05, 0x86, 0x45, 0x90, 0xa1, 0xb0, 0xe0, 0x22, 0x28, 0xbe, 0x47, 0x71, - 0x9f, 0xe4, 0xfb, 0xe3, 0xd1, 0xea, 0x9e, 0x13, 0x83, 0x56, 0xd5, 0x67, 0xce, 0x31, 0xba, 0x1a, 0x1f, 0xd0, 0xd7, 0xcc, 0x8a, 0xef, 0x0d, 0xfe, 0xae, 0x8b, 0x11, 0xf5, 0xf1, 0xa1, 0x34, 0x4a, - 0xbd, 0x8b, 0x35, 0xf4, 0xc1, 0xb9, 0xff, 0x68, 0x12, 0xe7, 0x65, 0x1a, 0xb9, 0xb7, 0xaf, 0xf6, 0x2f, 0x7a, 0x4a, 0xde, 0xc8, 0xde, 0xbe, 0xc6, 0xf5, 0x64, 0xac, 0x5f, 0x04, 0x9a, 0x39, 0x3b, - 0xba, 0x9b, 0xce, 0x67, 0xc3, 0xba, 0xf5, 0xa3, 0x63, 0x45, 0xe6, 0xe9, 0x0a, 0xd8, 0x45, 0xc6, 0x8a, 0x89, 0x38, 0x40, 0x1d, 0x04, 0x6c, 0xeb, 0x74, 0xb0, 0x96, 0x68, 0xf9, 0x22, 0x0b, 0xb5, - 0x33, 0xe7, 0x6c, 0x84, 0xb8, 0x86, 0xb6, 0xe4, 0x99, 0xea, 0x66, 0x36, 0xd4, 0x10, 0x12, 0xdf, 0x50, 0xa2, 0x4d, 0x53, 0xfb, 0x05, 0x9a, 0x9d, 0xeb, 0x64, 0x8e, 0x4f, 0x49, 0xbb, 0xd5, 0x9e, - 0x53, 0xb1, 0xde, 0x6b, 0x8e, 0xdf, 0xa9, 0x82, 0x17, 0x7a, 0xe7, 0xfc, 0xd6, 0x0a, 0xf7, 0x9b, 0x46, 0x90, 0x67, 0xce, 0x83, 0xfa, 0x26, 0x1f, 0x63, 0xa2, 0x1e, 0xad, 0x5f, 0x79, 0xd9, 0x59, - 0xa5, 0xfb, 0x50, 0xba, 0x42, 0xcf, 0x39, 0x68, 0x5e, 0xa9, 0x5e, 0x3f, 0xca, 0xf5, 0x78, 0x02, 0x8d, 0x73, 0xd1, 0xd8, 0x8d, 0xb2, 0x80, 0xfc, 0x82, 0xad, 0x15, 0x7e, 0xa7, 0x4e, 0x25, 0x66, - 0xe7, 0x11, 0x21, 0x87, 0xe0, 0x54, 0x3d, 0x6b, 0xec, 0x79, 0xae, 0xac, 0x6d, 0xcc, 0x14, 0x19, 0x42, 0x3c, 0x6f, 0x74, 0x5e, 0xec, 0x90, 0x40, 0x72, 0x3a, 0x3e, 0xa7, 0xbb, 0xde, 0xb2, 0x93, - 0x61, 0x33, 0x48, 0x0c, 0x3e, 0xd0, 0x67, 0x86, 0x5e, 0xc3, 0x82, 0x18, 0x1f, 0x41, 0xb1, 0x26, 0x36, 0x2a, 0x6d, 0x19, 0xf9, 0x77, 0x17, 0x5e, 0xf5, 0xa7, 0xf4, 0xac, 0xa4, 0xf8, 0xa9, 0x2f, - 0xd3, 0x53, 0xd2, 0xe1, 0x9d, 0xee, 0xcb, 0xe0, 0xdf, 0xcf, 0xc6, 0x44, 0xdc, 0xc0, 0x93, 0xb9, 0xbc, 0xab, 0x57, 0xbb, 0x8d, 0x1e, 0x0b, 0x05, 0x83, 0x40, 0x79, 0x16, 0x52, 0x15, 0x2b, 0x2b, - 0xa9, 0x46, 0x1c, 0xa9, 0x11, 0x4b, 0x44, 0xf5, 0x63, 0x5c, 0x28, 0xf2, 0x54, 0x05, 0xd9, 0x57, 0xa2, 0x97, 0xd1, 0xdc, 0x62, 0x43, 0x91, 0x71, 0x15, 0x64, 0xcf, 0xd1, 0x69, 0x23, 0x2b, 0xd8, - 0x99, 0xf1, 0x78, 0xb5, 0x61, 0xe9, 0x66, 0x9f, 0x02, 0xfe, 0x5c, 0x71, 0x96, 0x52, 0x20, 0xb0, 0x9b, 0x48, 0x62, 0xb7, 0x80, 0x77, 0x88, 0x7a, 0x95, 0x8c, 0xab, 0x40, 0x9f, 0x9e, 0x60, 0xfb, - 0xa8, 0xf7, 0x41, 0x0d, 0x41, 0x39, 0xb3, 0xcb, 0x3b, 0x96, 0x9c, 0xb9, 0x75, 0x21, 0xf1, 0x96, 0xb5, 0x0d, 0x84, 0x9a, 0x82, 0x91, 0x2d, 0x6d, 0xd9, 0x00, 0xc7, 0x09, 0xbf, 0x55, 0x80, 0xbb, - 0x15, 0xf5, 0x49, 0xee, 0x02, 0xf4, 0xa5, 0x64, 0xe9, 0xbf, 0xb8, 0x19, 0xf0, 0x91, 0xf2, 0x0b, 0x54, 0x1f, 0xcf, 0xc7, 0x6e, 0x03, 0xf4, 0xcb, 0xbc, 0x65, 0x86, 0xcd, 0x01, 0xa3, 0xab, 0x39, - 0x65, 0x24, 0x38, 0xe5, 0xef, 0xa6, 0xfb, 0x15, 0x5e, 0xb5, 0xbb, 0x75, 0x63, 0x45, 0xf6, 0xf6, 0x7c, 0x90, 0x57, 0xf3, 0x75, 0xca, 0x4a, 0xb6, 0xda, 0x4c, 0x4b, 0x68, 0xe3, 0xc3, 0x42, 0xb4, - 0xcd, 0x8b, 0xc5, 0x86, 0x16, 0xa3, 0x79, 0x1c, 0x19, 0xec, 0xd4, 0xf6, 0x2d, 0x0b, 0x99, 0x87, 0x84, 0x5d, 0x7a, 0x32, 0xc1, 0x88, 0xba, 0xba, 0x84, 0xbe, 0x07, 0x5b, 0xfd, 0x50, 0xb4, 0xea, - 0xd1, 0x3c, 0x78, 0x1e, 0x90, 0x6f, 0xbf, 0xf2, 0x01, 0x9c, 0x6f, 0xf7, 0xc6, 0x04, 0x5b, 0xc1, 0x93, 0x45, 0x77, 0x1a, 0x5a, 0x5d, 0x23, 0x85, 0x00, 0x8e, 0x53, 0x57, 0x70, 0xb8, 0x98, 0x08, - 0xaa, 0x64, 0xc9, 0x07, 0xfd, 0x88, 0x2d, 0xa1, 0xaf, 0x25, 0x69, 0x1f, 0xb1, 0xc0, 0xdf, 0xeb, 0x52, 0x9f, 0x28, 0x83, 0x93, 0xcf, 0xe7, 0x63, 0x7b, 0xa2, 0xc8, 0x2b, 0x7d, 0x80, 0xd5, 0x98, - 0xdc, 0xec, 0x20, 0x9a, 0xde, 0x7a, 0xad, 0xb6, 0xc0, 0xe3, 0x36, 0xab, 0xe9, 0x7a, 0x77, 0x3c, 0x88, 0x94, 0x00, 0x63, 0xee, 0x59, 0x4e, 0xa2, 0xe3, 0xaa, 0xd9, 0xd6, 0x58, 0xc3, 0xd1, 0x21, - 0xcf, 0xf0, 0xf1, 0xba, 0x5f, 0xb3, 0xd1, 0x5a, 0xc1, 0x87, 0xd9, 0xda, 0x4b, 0x58, 0x97, 0xa3, 0x65, 0x51, 0x61, 0x0e, 0xe6, 0x50, 0xad, 0xce, 0xd0, 0xde, 0xe2, 0xd6, 0xf4, 0x88, 0xf6, 0xee, - 0x23, 0x8a, 0xf9, 0xfe, 0x65, 0xf5, 0xdd, 0xdb, 0xfd, 0xff, 0xef, 0x37, 0xf4, 0xef, 0x56, 0xfb, 0xfd, 0xf7, 0x04, 0xf0, 0xfd, 0x9f, 0xb8, 0x7d, 0x8f, 0xef, 0x37, 0xc6, 0x88, 0xe5, 0x4b, 0x3c, - 0xd3, 0x2c, 0x75, 0x79, 0xd8, 0x68, 0x97, 0x72, 0x64, 0x16, 0x49, 0x3d, 0x15, 0x83, 0x63, 0x13, 0x69, 0x59, 0xdf, 0x1c, 0x87, 0xf3, 0x06, 0x54, 0x08, 0x91, 0x5b, 0x1d, 0x50, 0x58, 0xf0, 0x50, - 0x76, 0x01, 0x8b, 0x27, 0xdc, 0x86, 0x76, 0xc8, 0x36, 0x3c, 0xe0, 0xb4, 0x26, 0x44, 0x74, 0x6b, 0x16, 0x5b, 0x4e, 0xd6, 0xdd, 0x53, 0x06, 0xc0, 0x4b, 0xc7, 0x62, 0xba, 0x6c, 0x50, 0x55, 0xbc, - 0x9d, 0xc6, 0xcf, 0x29, 0x6e, 0xbf, 0x14, 0x6f, 0x7e, 0x54, 0x74, 0xf9, 0xfe, 0x07, 0x79, 0x1c, 0x34, 0x46, 0xfe, 0x81, 0x9f, 0xd8, 0xf8, 0xbd, 0xc5, 0x8b, 0x5d, 0xe2, 0xa4, 0x2e, 0x14, 0x7e, - 0x87, 0x76, 0xdd, 0x59, 0xe7, 0xae, 0x37, 0x49, 0x64, 0x7d, 0x24, 0x5b, 0x73, 0x29, 0xd6, 0xa2, 0x58, 0xf6, 0xdd, 0x01, 0x32, 0x9b, 0x75, 0xbf, 0xab, 0x4b, 0x97, 0xab, 0x2d, 0xdb, 0xf3, 0x4d, - 0x81, 0x31, 0x70, 0x73, 0xb1, 0x0a, 0xf5, 0x3a, 0x70, 0x87, 0x2c, 0x69, 0x14, 0xaf, 0x3a, 0x8b, 0xe9, 0x36, 0xaa, 0x67, 0xd0, 0x8e, 0x91, 0x00, 0x09, 0x21, 0xaa, 0xbd, 0xca, 0x7b, 0xc2, 0x6e, - 0x89, 0x74, 0x1b, 0xf6, 0xb7, 0x65, 0xe2, 0xc1, 0x34, 0xf8, 0xa4, 0x15, 0xdc, 0x51, 0xb6, 0xa2, 0xcc, 0xbf, 0x38, 0xef, 0xff, 0x73, 0x57, 0x4d, 0x8b, 0xb2, 0xd0, 0x2b, 0xa3, 0xab, 0xd7, 0xe0, - 0xd3, 0x37, 0xf9, 0xa5, 0x5a, 0xdd, 0x07, 0x15, 0x0e, 0xbd, 0xe3, 0x8a, 0x88, 0x2e, 0xc5, 0xc6, 0xf3, 0xa4, 0xa9, 0x3f, 0x6e, 0x38, 0x3c, 0xfc, 0x9e, 0xef, 0xf1, 0x69, 0xf7, 0x3e, 0x2b, 0xfe, - 0xd4, 0xc6, 0xec, 0x07, 0xba, 0xaf, 0x5f, 0xf7, 0x7a, 0x76, 0xa9, 0xc9, 0x31, 0x42, 0x17, 0x60, 0xa4, 0x65, 0xb0, 0x93, 0xa7, 0x5e, 0x11, 0xad, 0x8c, 0x6e, 0x8b, 0x32, 0x4a, 0xb6, 0x38, 0x03, - 0xb8, 0x9e, 0xa9, 0x0d, 0xc2, 0xb3, 0x86, 0x3b, 0xd8, 0x8b, 0x2d, 0x86, 0x7b, 0xeb, 0x0e, 0x6e, 0x4b, 0x74, 0x60, 0xd1, 0xd6, 0x5c, 0x7b, 0xbd, 0xe7, 0xc2, 0xd5, 0x94, 0x0e, 0x33, 0xdb, 0x91, - 0x1c, 0x1a, 0xdc, 0x95, 0x9b, 0x7e, 0x83, 0x2b, 0x5b, 0xb9, 0x3c, 0x2e, 0x06, 0xcc, 0xda, 0xd1, 0x66, 0xfe, 0xdc, 0xfc, 0xf9, 0x5a, 0xe8, 0xf0, 0x87, 0xa9, 0x61, 0x3d, 0x4c, 0xbd, 0x82, 0xd1, - 0x3f, 0xd4, 0x33, 0xd2, 0xe9, 0x4a, 0xf4, 0x86, 0xa1, 0x95, 0x54, 0x93, 0x2b, 0xa1, 0xdf, 0x01, 0x2c, 0xf9, 0xda, 0x65, 0x08, 0x60, 0xcb, 0xb1, 0xcb, 0xd8, 0x9b, 0xb5, 0x0c, 0x0d, 0x97, 0xc5, - 0x69, 0x98, 0xb5, 0x47, 0xf0, 0x88, 0x82, 0x11, 0x39, 0xf3, 0x44, 0x39, 0x2a, 0xfb, 0x68, 0xdf, 0xac, 0x78, 0x88, 0xef, 0x68, 0xa7, 0xe8, 0x57, 0x1b, 0xa6, 0x46, 0xe2, 0xda, 0x66, 0x3a, 0xcd, - 0x52, 0xdc, 0x90, 0x03, 0x70, 0x12, 0x3d, 0x60, 0xed, 0xbe, 0x23, 0x96, 0x4e, 0x2c, 0x6c, 0xad, 0x2a, 0xa2, 0x9f, 0x33, 0x55, 0x2e, 0xfb, 0x5f, 0xfe, 0xeb, 0xbe, 0x15, 0xf4, 0x07, 0xf9, 0xe8, - 0xba, 0xf9, 0x40, 0xee, 0x51, 0xd8, 0xd5, 0xc7, 0xbf, 0x7f, 0xbf, 0xfc, 0xcd, 0xf0, 0xf8, 0x1a, 0x1d, 0x34, 0x16, 0xe3, 0x37, 0xf2, 0xe0, 0xe4, 0xfd, 0x78, 0x72, 0x25, 0x38, 0x32, 0x24, 0xc7, - 0x03, 0xbc, 0x19, 0x56, 0x42, 0x60, 0xb4, 0xcf, 0x0a, 0xe6, 0xcc, 0x51, 0x38, 0x32, 0xa0, 0x0c, 0x20, 0x42, 0x6c, 0x8d, 0x2b, 0x22, 0x08, 0x8a, 0xf1, 0xaa, 0x53, 0x5c, 0x44, 0x9f, 0xf3, 0xb3, - 0xb4, 0xec, 0xbb, 0xb3, 0x8f, 0xb7, 0x95, 0x99, 0x84, 0x98, 0x42, 0x24, 0xd1, 0x39, 0x21, 0x58, 0xa0, 0x1b, 0x40, 0xca, 0x05, 0x52, 0x4b, 0xdd, 0x31, 0x47, 0x11, 0x9e, 0x2f, 0x8f, 0x4b, 0x74, - 0xfd, 0x7c, 0x4e, 0xe4, 0x0b, 0xab, 0xd8, 0x8f, 0x5c, 0xe9, 0x30, 0xfc, 0x54, 0x12, 0xe0, 0x95, 0xe6, 0x8d, 0x0f, 0xed, 0x7e, 0x72, 0x25, 0xf3, 0x3b, 0x1b, 0xfa, 0xbe, 0x9b, 0xe6, 0x55, 0xcc, - 0x50, 0x10, 0xd9, 0x93, 0x40, 0xc2, 0xc0, 0xe2, 0x06, 0x8a, 0x67, 0x6b, 0x46, 0xd1, 0x53, 0xa3, 0x49, 0x40, 0x12, 0xc6, 0xcf, 0xd1, 0x72, 0x3d, 0x8b, 0x73, 0x34, 0x64, 0xd7, 0x5b, 0xd5, 0x89, - 0xca, 0x40, 0x16, 0xb3, 0xc3, 0x6c, 0x9a, 0xe1, 0x01, 0x9a, 0xd6, 0x0a, 0xa5, 0x4a, 0xeb, 0xa9, 0x6e, 0x1f, 0xfd, 0xc6, 0x82, 0xf9, 0xc2, 0xcb, 0x10, 0x1c, 0x3c, 0x38, 0xcf, 0xb9, 0x16, 0xaf, - 0x25, 0xf4, 0x9b, 0xec, 0x06, 0xc4, 0xf7, 0xc0, 0xc0, 0x0f, 0x6d, 0x97, 0xae, 0x42, 0xf7, 0x7b, 0xe4, 0xe1, 0x87, 0xdb, 0x5f, 0xd4, 0x9d, 0x0f, 0xd5, 0x56, 0xf1, 0xaf, 0xa5, 0x52, 0x7f, 0x0a, - 0xf2, 0xad, 0x12, 0xeb, 0x53, 0x09, 0xd6, 0xbf, 0x98, 0x17, 0xdf, 0xba, 0xf3, 0xfc, 0xf3, 0xcf, 0x77, 0xd9, 0x4d, 0x3d, 0x35, 0x27, 0xde, 0x5a, 0xf4, 0xdc, 0xfa, 0xf3, 0x5c, 0x28, 0x8d, 0x9b, - 0x0c, 0xec, 0xa6, 0xf0, 0x39, 0x72, 0x5b, 0x44, 0x33, 0xb5, 0x60, 0x13, 0x90, 0x21, 0x76, 0x18, 0x4d, 0xb1, 0xd6, 0x72, 0x45, 0x18, 0x20, 0xc3, 0xaa, 0x34, 0x3a, 0x53, 0x6d, 0xbb, 0x47, 0xfc, - 0x2d, 0x04, 0xb5, 0xd8, 0xcc, 0x6e, 0xb7, 0xec, 0x61, 0x3f, 0xcb, 0x2d, 0x05, 0xd6, 0xd8, 0xad, 0x50, 0xa1, 0x91, 0x82, 0xa3, 0xc5, 0xca, 0x20, 0x67, 0xb5, 0x79, 0xc4, 0x05, 0x66, 0xba, 0xc4, - 0xc9, 0x08, 0xd6, 0x46, 0xd5, 0x80, 0xbc, 0x3f, 0x19, 0xf2, 0xe2, 0xb1, 0xe9, 0xf6, 0x8c, 0xa5, 0xf2, 0x42, 0xf0, 0x65, 0x1e, 0xe4, 0x85, 0x3b, 0xc6, 0xfe, 0xb8, 0xf8, 0xd7, 0x09, 0xdc, 0x16, - 0x93, 0xa5, 0xe5, 0x9e, 0xdb, 0xc2, 0x06, 0x19, 0xc4, 0xb2, 0x75, 0x37, 0x39, 0x09, 0x27, 0x1d, 0x27, 0xd0, 0xb8, 0x51, 0x32, 0x13, 0xde, 0xd7, 0x47, 0xa2, 0x82, 0xab, 0xa5, 0x42, 0x35, 0x62, - 0x75, 0x50, 0x48, 0xe8, 0x7c, 0x5a, 0x0e, 0xfa, 0xe9, 0xac, 0xfb, 0xb0, 0xa7, 0x9e, 0xb8, 0x26, 0xeb, 0x54, 0x64, 0x73, 0x74, 0x86, 0x99, 0x67, 0x79, 0xc3, 0x54, 0x50, 0xcd, 0xb0, 0x1b, 0xa1, - 0xa5, 0xdf, 0x57, 0xed, 0x1e, 0xe8, 0xda, 0xa1, 0x55, 0xba, 0x93, 0xd2, 0x8b, 0xdf, 0xf2, 0xea, 0x1e, 0x79, 0xdd, 0xfe, 0x7e, 0x15, 0xfb, 0x4c, 0x1a, 0x9c, 0x7c, 0xb9, 0x30, 0x36, 0x00, 0x5c, - 0x5f, 0x9a, 0x2c, 0x10, 0xd9, 0x5c, 0x78, 0x26, 0x25, 0x3b, 0x64, 0x3c, 0x52, 0xd2, 0xeb, 0x7c, 0x66, 0x37, 0x5b, 0x2c, 0x04, 0x37, 0x8d, 0xa4, 0xf2, 0x2b, 0x60, 0x45, 0x85, 0xa0, 0xc7, 0x1e, - 0xf2, 0x7a, 0x65, 0x24, 0x90, 0xcf, 0x06, 0x0a, 0x89, 0x9c, 0xb9, 0xf9, 0x54, 0x08, 0x96, 0x21, 0x82, 0x48, 0x2b, 0x73, 0x29, 0xe9, 0xe2, 0x99, 0xdd, 0xec, 0x9b, 0x90, 0x29, 0x61, 0xa8, 0xa4, - 0x78, 0x77, 0x8c, 0x2f, 0xfd, 0x6a, 0xca, 0x3c, 0x62, 0xa1, 0xbf, 0x17, 0xa6, 0xa1, 0x55, 0x5d, 0x40, 0xa8, 0x26, 0x63, 0xa5, 0x28, 0xe2, 0xb6, 0x12, 0xa4, 0x6b, 0x84, 0xe4, 0xc5, 0xa4, 0x72, - 0xdc, 0xaf, 0x16, 0xa5, 0x17, 0xc6, 0xf6, 0xb0, 0x61, 0xe2, 0x79, 0x81, 0x83, 0xba, 0xb0, 0x2d, 0xf0, 0x5a, 0x2d, 0xf6, 0x4b, 0x1d, 0x5b, 0xf1, 0xbc, 0x29, 0xc0, 0x20, 0x7b, 0xb6, 0xe7, 0x4a, - 0xed, 0x83, 0x55, 0xc4, 0x20, 0xbb, 0xbd, 0xea, 0x41, 0xb4, 0x63, 0x71, 0xa9, 0x5e, 0x1b, 0xc6, 0xb0, 0x9f, 0x2d, 0x6d, 0x76, 0x87, 0x8d, 0x89, 0xc8, 0x79, 0x64, 0xe6, 0x3d, 0x60, 0xa0, 0x6a, - 0x62, 0x47, 0x41, 0xf4, 0xd8, 0xa3, 0x04, 0x3f, 0xd5, 0xb9, 0xef, 0x03, 0xdd, 0x1b, 0x6a, 0xb7, 0xb3, 0x0b, 0x7a, 0x23, 0x74, 0xc9, 0x7a, 0xd7, 0x4e, 0x85, 0x9a, 0x2d, 0xe9, 0xe4, 0x38, 0x87, - 0x66, 0x67, 0xc8, 0x92, 0xa3, 0x2d, 0x2d, 0x02, 0x52, 0xa1, 0x63, 0x43, 0x84, 0x94, 0xa0, 0xe8, 0x79, 0xb8, 0x7e, 0x54, 0x38, 0xdb, 0x3a, 0xb5, 0x28, 0xae, 0xac, 0x8d, 0xcd, 0x60, 0x77, 0xb2, - 0x3f, 0xdf, 0x99, 0x26, 0x0f, 0x1d, 0x15, 0x40, 0x71, 0x09, 0x14, 0x42, 0xb4, 0x95, 0x89, 0x14, 0xa0, 0xbd, 0x9a, 0xce, 0x72, 0x05, 0xd5, 0xf3, 0x31, 0x7d, 0x21, 0x5f, 0xde, 0xd5, 0x4f, 0xac, - 0x47, 0x71, 0xa4, 0xcf, 0xed, 0x27, 0xbc, 0x12, 0xbd, 0x61, 0xf1, 0x72, 0x38, 0x7a, 0x37, 0xa1, 0x3f, 0xae, 0x54, 0x50, 0x86, 0x85, 0x58, 0xdd, 0x3b, 0x75, 0x51, 0x04, 0x4b, 0x26, 0xf0, 0x77, - 0x12, 0x54, 0x0b, 0x7a, 0x63, 0x6a, 0x71, 0x18, 0x6c, 0x4a, 0x98, 0x3c, 0x9e, 0xd4, 0x26, 0xdd, 0x24, 0x04, 0xe3, 0xb7, 0xe8, 0x6c, 0xb9, 0x4b, 0x3c, 0x8d, 0x3c, 0x99, 0xda, 0x90, 0x1f, 0xb8, - 0xb9, 0xca, 0xf0, 0x2a, 0x37, 0xc5, 0x44, 0x29, 0x5f, 0x80, 0xe6, 0x59, 0x43, 0x67, 0x6d, 0xb2, 0xd9, 0x8e, 0x05, 0xe2, 0xdd, 0xe4, 0xff, 0x57, 0x27, 0xd2, 0x2b, 0xdd, 0x1b, 0x1c, 0xb7, 0xb3, - 0xb1, 0x13, 0x2b, 0x41, 0xd7, 0xd3, 0x66, 0x4e, 0x6c, 0x02, 0x4e, 0xec, 0x54, 0x4e, 0x38, 0xba, 0xc6, 0x62, 0x16, 0x85, 0x46, 0x5c, 0xe3, 0x85, 0xb2, 0xb5, 0x67, 0x01, 0x46, 0x94, 0x75, 0x92, - 0x66, 0xbb, 0x6d, 0xa2, 0xd9, 0x41, 0xca, 0x52, 0x6b, 0x69, 0x59, 0x0a, 0x2b, 0xdb, 0x30, 0xe6, 0xec, 0xce, 0xce, 0xb6, 0xd6, 0xca, 0x3b, 0x6f, 0x84, 0x3a, 0xda, 0x4a, 0x54, 0x98, 0x7a, 0x4a, - 0xac, 0x0c, 0x88, 0xea, 0x02, 0xdf, 0x5c, 0x68, 0xdf, 0x3b, 0x9f, 0xfc, 0x7b, 0xfe, 0x8b, 0x2f, 0xb4, 0x6f, 0x30, 0x7c, 0xb8, 0x32, 0xd6, 0x63, 0x71, 0x9c, 0xc7, 0xce, 0x4e, 0x0c, 0xb3, 0x64, - 0xa1, 0xc3, 0xc7, 0x3e, 0x5f, 0x1c, 0x49, 0xe9, 0x20, 0xec, 0xac, 0x8e, 0xc7, 0x57, 0x92, 0x0d, 0xae, 0x07, 0xcd, 0xc1, 0x3b, 0x9a, 0x85, 0x90, 0x50, 0x52, 0x25, 0xc8, 0xf5, 0xe7, 0x4a, 0x6c, - 0xf3, 0xb2, 0xd0, 0x06, 0xb0, 0x4b, 0x38, 0x3e, 0xca, 0xdb, 0x9e, 0x96, 0xd6, 0x1a, 0xad, 0xdb, 0xb6, 0x8e, 0x9e, 0x06, 0x13, 0x51, 0xbd, 0x90, 0x26, 0xf7, 0x23, 0x82, 0x1d, 0xee, 0xb9, 0x83, - 0x1e, 0x6c, 0x0a, 0xbd, 0x6d, 0x6b, 0xfc, 0x8b, 0xf0, 0x5d, 0x48, 0xbe, 0xa0, 0x76, 0x39, 0x18, 0x0b, 0x96, 0x3c, 0x5f, 0xeb, 0x50, 0x6d, 0xed, 0x65, 0xc9, 0xac, 0xdb, 0xa5, 0xb2, 0x64, 0x5c, - 0x76, 0x1a, 0x7a, 0x55, 0x9a, 0x07, 0x66, 0x59, 0x37, 0x87, 0x56, 0xdf, 0x57, 0x73, 0xde, 0x54, 0x8f, 0xc8, 0x4e, 0x03, 0xac, 0xac, 0x2a, 0x4e, 0x26, 0xd2, 0x6e, 0xb2, 0x7c, 0x1d, 0x90, 0xcb, - 0x19, 0x0c, 0x68, 0x47, 0x98, 0x10, 0x61, 0x9a, 0xd9, 0x46, 0x0e, 0xcc, 0x36, 0x73, 0xca, 0x9e, 0x52, 0x0e, 0x92, 0xe2, 0x63, 0x4a, 0x5b, 0x84, 0x79, 0x55, 0x7b, 0xee, 0x24, 0x88, 0x5e, 0x56, - 0x76, 0xff, 0x51, 0xcb, 0xd9, 0xe7, 0x82, 0x35, 0xbe, 0xd0, 0x7e, 0x01, 0xe5, 0xf3, 0x95, 0xb1, 0xc1, 0x1b, 0xc7, 0x7e, 0xda, 0xcc, 0xa4, 0x7d, 0xbc, 0x3a, 0x99, 0x0d, 0x67, 0x2b, 0xfc, 0xb0, - 0xa6, 0x74, 0x1a, 0x15, 0x07, 0x39, 0xec, 0x96, 0x2c, 0x09, 0xe7, 0xf3, 0xfd, 0xae, 0x1f, 0xf4, 0x1c, 0x10, 0xb6, 0xe6, 0x12, 0x28, 0x32, 0x79, 0xbb, 0x3d, 0x37, 0x8e, 0x7b, 0x2c, 0x25, 0xb3, - 0x3d, 0xae, 0x95, 0xac, 0xf4, 0x71, 0x4d, 0xa9, 0xe4, 0x0d, 0xb0, 0x5c, 0x41, 0x34, 0xd7, 0x21, 0xb4, 0xa3, 0x30, 0xeb, 0x27, 0xfb, 0x85, 0x26, 0x65, 0xf3, 0xa5, 0x23, 0xc3, 0x03, 0x4f, 0x48, - 0xe4, 0x79, 0x1e, 0x89, 0x63, 0x0f, 0x99, 0xeb, 0x99, 0xde, 0x38, 0x37, 0x9a, 0x2f, 0x6a, 0xf4, 0xf5, 0x68, 0x6c, 0x2f, 0x1c, 0xd7, 0xe9, 0x4f, 0x21, 0xd7, 0x1e, 0xe0, 0x29, 0x46, 0x24, 0x07, - 0xd3, 0xd1, 0x4f, 0xd3, 0x42, 0x00, 0xe6, 0xf5, 0x46, 0x91, 0x75, 0x77, 0xb9, 0x11, 0x09, 0x90, 0xf3, 0xf1, 0xb8, 0x42, 0x86, 0xbc, 0xd1, 0xaa, 0xd3, 0x82, 0x5c, 0x12, 0xd5, 0xfc, 0x1c, 0xd5, - 0xcb, 0x29, 0x40, 0x0a, 0x86, 0x80, 0xd0, 0x82, 0x7b, 0x90, 0xd6, 0xbc, 0xdb, 0xd0, 0xc3, 0x1a, 0xab, 0xe6, 0x59, 0xae, 0xcb, 0xd9, 0xc9, 0xfa, 0x26, 0x96, 0x7e, 0xec, 0xee, 0x89, 0x3d, 0x95, - 0xc7, 0xf1, 0xd5, 0x6e, 0xc0, 0x7e, 0xcf, 0xd9, 0x78, 0x19, 0xaf, 0xd3, 0xcf, 0x39, 0xa1, 0x3c, 0x39, 0xa0, 0xe1, 0x3a, 0xfb, 0x79, 0x16, 0xad, 0xc2, 0x61, 0x89, 0x21, 0x00, 0x33, 0xec, 0x80, - 0x40, 0xec, 0x52, 0x6d, 0x90, 0x76, 0x73, 0x47, 0x99, 0xca, 0x46, 0xd7, 0xef, 0x1a, 0x96, 0x65, 0x7b, 0x50, 0x88, 0x9b, 0xf3, 0x7e, 0x6d, 0x82, 0x73, 0x7e, 0xc6, 0x13, 0x9b, 0xfc, 0x04, 0x8b, - 0xd1, 0xb0, 0x91, 0xd8, 0x7d, 0xaf, 0x3a, 0x2d, 0x25, 0x61, 0x92, 0xb9, 0xdc, 0x8c, 0x99, 0x4e, 0xb7, 0xd7, 0xb4, 0xfb, 0x89, 0xeb, 0xf9, 0x56, 0x93, 0xfc, 0xbb, 0x19, 0xe4, 0xdf, 0xa8, 0xbf, - 0x03, 0xf3, 0x7e, 0x6d, 0x8c, 0x11, 0x01, 0x4f, 0x76, 0x9b, 0xa2, 0x76, 0x5a, 0x7b, 0x91, 0x13, 0x14, 0x73, 0xb2, 0x60, 0x01, 0xcf, 0xdd, 0x12, 0xc3, 0x22, 0x4f, 0xe8, 0x8e, 0x23, 0x46, 0xf9, - 0xb9, 0xdb, 0xc7, 0xbd, 0x01, 0x3e, 0x57, 0x04, 0xe6, 0x23, 0xe1, 0x97, 0xb1, 0x7d, 0x38, 0x1d, 0x5b, 0x10, 0xa6, 0xf5, 0x0c, 0x23, 0x94, 0x2d, 0x80, 0x83, 0x65, 0x56, 0x18, 0xb2, 0x36, 0xd4, - 0xf8, 0xb3, 0x4d, 0xf9, 0xd6, 0x39, 0x29, 0x3b, 0x2d, 0x3b, 0x57, 0x1e, 0xc7, 0xd8, 0x4c, 0x81, 0xe1, 0xe4, 0x0c, 0xea, 0xd6, 0x62, 0x94, 0x23, 0xb6, 0xb4, 0x13, 0xb2, 0xd8, 0xe0, 0xc2, 0x4d, - 0x0c, 0x18, 0x11, 0x73, 0x22, 0xe0, 0x73, 0xb9, 0x59, 0x84, 0xf2, 0x91, 0x8e, 0x0e, 0xfa, 0x11, 0x9f, 0x0f, 0x81, 0xbc, 0x79, 0xce, 0xd1, 0x77, 0xf3, 0x50, 0xa6, 0xb9, 0xdb, 0x24, 0x0f, 0x42, - 0xb5, 0x6f, 0xb8, 0x5c, 0x72, 0xd3, 0xfe, 0xf3, 0xbf, 0x7f, 0x8e, 0xf5, 0xfa, 0xdc, 0x41, 0xe5, 0x1e, 0xe8, 0x9f, 0x7b, 0xaa, 0x8c, 0x07, 0xfd, 0x8d, 0xee, 0x05, 0xf3, 0xb7, 0xb3, 0x4b, 0x17, - 0xdd, 0x5f, 0xc2, 0xbd, 0xe0, 0xc9, 0x31, 0x8c, 0xf0, 0xaa, 0x3c, 0xe6, 0x79, 0x1c, 0x9d, 0xb7, 0x8e, 0x4a, 0x5a, 0x08, 0x7c, 0xb0, 0xfb, 0x8d, 0xa6, 0x01, 0xf9, 0x08, 0x4e, 0xca, 0xdc, 0x17, - 0x88, 0x7e, 0x4c, 0x8f, 0x7a, 0x4e, 0xad, 0xfd, 0x44, 0xf9, 0x65, 0x5c, 0x1f, 0xcf, 0x47, 0x2b, 0xb8, 0x2e, 0xc7, 0x99, 0x0d, 0xc6, 0x20, 0x52, 0xbf, 0x14, 0xc8, 0x75, 0x09, 0x22, 0xc3, 0x02, - 0xe8, 0xf0, 0x38, 0xb5, 0x9b, 0x23, 0xcc, 0xe9, 0x6c, 0x36, 0xeb, 0x94, 0x99, 0xdc, 0xb2, 0x43, 0x55, 0xb0, 0xab, 0xe3, 0x74, 0x66, 0x2b, 0x16, 0xb5, 0x38, 0x6b, 0x70, 0x12, 0x84, 0x86, 0x63, - 0x2d, 0x56, 0xd3, 0x4c, 0xd9, 0x47, 0x76, 0xcc, 0x1d, 0x92, 0x13, 0x49, 0xd2, 0x07, 0x18, 0xec, 0xf1, 0xf3, 0xa3, 0x40, 0xb6, 0x2f, 0xb8, 0xbc, 0xf9, 0xf9, 0x1f, 0x89, 0x8f, 0x27, 0x84, 0xe9, - 0x8d, 0xe8, 0x05, 0x8d, 0xeb, 0xe1, 0x45, 0x58, 0xfc, 0x9a, 0x04, 0xb7, 0xb3, 0xe1, 0x78, 0xe3, 0xfa, 0xf2, 0x5a, 0xee, 0x56, 0xed, 0x6a, 0x26, 0xcc, 0xf8, 0x3d, 0x11, 0xec, 0xf7, 0xb0, 0xed, - 0xdf, 0x17, 0x16, 0xbf, 0xcc, 0x8b, 0xc7, 0xdb, 0x0d, 0xbf, 0xb6, 0x71, 0xff, 0xb0, 0xc3, 0x71, 0xdf, 0x9d, 0xf0, 0x4c, 0xb4, 0xe3, 0x2b, 0xd1, 0x0b, 0x2e, 0xd7, 0xc3, 0x4b, 0x72, 0xe0, 0x88, - 0x48, 0xc7, 0x23, 0xd8, 0x2e, 0xac, 0x03, 0x06, 0x1a, 0x89, 0x85, 0xee, 0x87, 0x7e, 0x33, 0x6d, 0x55, 0x59, 0x3a, 0x18, 0xde, 0x92, 0x6f, 0x4f, 0x92, 0x50, 0x67, 0x27, 0xd6, 0x6d, 0x06, 0x95, - 0x2f, 0x86, 0x42, 0x36, 0x07, 0xa6, 0x3a, 0x0a, 0x9b, 0xd0, 0x44, 0x04, 0x60, 0x96, 0xb1, 0xd1, 0x6e, 0x43, 0x0f, 0x8b, 0x5d, 0xbe, 0x9c, 0x7b, 0x9b, 0xe2, 0x20, 0x9c, 0x2d, 0xcc, 0x35, 0x3c, - 0x73, 0x29, 0x9f, 0xbc, 0xee, 0x5b, 0xad, 0x89, 0xe8, 0x4b, 0xfb, 0xd0, 0x7f, 0xcf, 0xe0, 0xf9, 0x44, 0xf9, 0x32, 0xfe, 0x0f, 0xe7, 0x63, 0x8d, 0x1e, 0x09, 0xe2, 0x58, 0x78, 0x35, 0x05, 0xab, - 0x6d, 0x6f, 0x26, 0xa4, 0xb3, 0xcc, 0x49, 0x2a, 0xc3, 0x5d, 0x85, 0xf4, 0xb4, 0x5d, 0xd7, 0x15, 0xc6, 0x36, 0x3a, 0x28, 0xa1, 0x3a, 0x88, 0x67, 0x53, 0x67, 0x36, 0x5a, 0xc3, 0x52, 0x6d, 0x92, - 0x29, 0xf3, 0x7e, 0x7d, 0x76, 0x4b, 0x5d, 0xcd, 0x8f, 0x15, 0x71, 0xd8, 0xae, 0xf5, 0x6c, 0xee, 0xdb, 0x83, 0xa5, 0xbb, 0xf8, 0x7e, 0x1d, 0x87, 0x41, 0x00, 0x3c, 0xd9, 0x69, 0xef, 0xbe, 0x87, - 0xea, 0x13, 0x8f, 0x3d, 0xdc, 0x47, 0xae, 0x22, 0xd7, 0x9b, 0x38, 0xa1, 0x95, 0x65, 0xde, 0x7b, 0x8f, 0xbd, 0x07, 0x11, 0xfb, 0x51, 0x61, 0xb9, 0x6e, 0xf9, 0x27, 0x7e, 0x6c, 0x7e, 0xd2, 0xcf, - 0xac, 0xef, 0xaf, 0x54, 0x5f, 0xbe, 0xc4, 0xeb, 0xf1, 0xe4, 0x42, 0xeb, 0xf7, 0xaf, 0x00, 0x09, 0x4b, 0x90, 0x80, 0xc8, 0x73, 0x7e, 0xde, 0xa9, 0x39, 0x4f, 0x2e, 0x62, 0x11, 0x9e, 0xfb, 0x3b, - 0x7b, 0x9d, 0x6b, 0x10, 0x60, 0xd7, 0x6a, 0xe4, 0xc4, 0x95, 0xbc, 0xdb, 0xcb, 0x49, 0x08, 0x86, 0x66, 0x7f, 0x14, 0x29, 0xa1, 0x48, 0x37, 0x3e, 0xd9, 0x18, 0xdd, 0x76, 0x8f, 0x2a, 0x80, 0x75, - 0x34, 0x09, 0x05, 0xec, 0x60, 0xca, 0x4c, 0x0e, 0x3b, 0x9e, 0x35, 0x0e, 0x91, 0xa1, 0x6d, 0x25, 0xf4, 0x5b, 0x6a, 0x59, 0x54, 0x96, 0x5e, 0xd0, 0x24, 0x56, 0x39, 0x29, 0x92, 0xa6, 0x7c, 0xbc, - 0x3f, 0xf5, 0xe4, 0xfa, 0xff, 0x95, 0xfa, 0x0b, 0x10, 0x5f, 0xaf, 0x8d, 0xd5, 0x04, 0x36, 0x3a, 0xbb, 0x16, 0x34, 0xd5, 0xca, 0x82, 0x0d, 0x3a, 0xf3, 0x95, 0xed, 0x5c, 0x91, 0xc2, 0x74, 0x2f, - 0xcb, 0x82, 0xc2, 0x55, 0x65, 0xb0, 0xa4, 0xd0, 0x15, 0xb5, 0xd8, 0xa1, 0xf1, 0xa1, 0x07, 0xa4, 0xce, 0x38, 0x45, 0x0a, 0x02, 0x5a, 0xf9, 0x3e, 0x73, 0x0d, 0x19, 0xc7, 0x60, 0x22, 0x5e, 0xcf, - 0xd0, 0xc6, 0x5a, 0x04, 0x6b, 0x9e, 0xcc, 0x9c, 0xd4, 0x43, 0x0f, 0x74, 0x0f, 0xd1, 0x81, 0x89, 0x8e, 0x12, 0xde, 0xd5, 0xc4, 0x2a, 0x83, 0xe6, 0x6b, 0xa7, 0xa0, 0xaf, 0xb3, 0xf5, 0x09, 0x41, - 0xf5, 0x81, 0xf0, 0xb5, 0xdd, 0xeb, 0xdb, 0xe9, 0x65, 0xae, 0x8e, 0x10, 0x58, 0xe7, 0x6d, 0x08, 0x29, 0x69, 0x4d, 0x89, 0x33, 0x02, 0xaf, 0xc4, 0xa1, 0xed, 0xb5, 0x74, 0x1f, 0x2c, 0xe1, 0x7a, - 0x40, 0x53, 0xe1, 0x44, 0x62, 0xc9, 0x82, 0x81, 0xd2, 0x35, 0xb5, 0x36, 0x4c, 0x27, 0x5f, 0x0e, 0x82, 0x34, 0x70, 0x21, 0xc1, 0xa7, 0xa5, 0x91, 0xa2, 0x2e, 0x4c, 0x1d, 0x09, 0x28, 0xe3, 0xbd, - 0x72, 0x4a, 0x31, 0xb4, 0x90, 0x52, 0x47, 0xa3, 0xa1, 0xc8, 0xc1, 0xdf, 0xcd, 0xb3, 0xf5, 0x77, 0x4b, 0xe0, 0x53, 0xc3, 0xec, 0xfb, 0xaa, 0xca, 0x53, 0x06, 0xd0, 0x3b, 0xdd, 0xd7, 0xf1, 0x5f, - 0xcf, 0x2e, 0xc1, 0x7d, 0x23, 0x26, 0xc9, 0x30, 0x40, 0xc4, 0x8e, 0xaa, 0xa1, 0x7c, 0xc8, 0xb9, 0xc3, 0x66, 0x01, 0x34, 0xb6, 0x87, 0x10, 0x83, 0x37, 0x55, 0xc5, 0x83, 0x23, 0x2c, 0xb7, 0x2b, - 0x73, 0x15, 0x51, 0x21, 0x5b, 0xce, 0xb1, 0xc8, 0x9d, 0xae, 0xd3, 0x0a, 0x9b, 0x2e, 0x68, 0xb9, 0x16, 0xc8, 0x13, 0x9b, 0xc0, 0x76, 0x1e, 0xe1, 0x12, 0x37, 0xcc, 0x8b, 0xb8, 0xea, 0x6c, 0x7c, - 0xb5, 0x4d, 0xf9, 0xa9, 0xbd, 0x29, 0x62, 0xcb, 0x18, 0x46, 0xf2, 0xc4, 0xd5, 0xcb, 0xf8, 0x6f, 0x33, 0xc4, 0x95, 0xea, 0x15, 0x8d, 0xeb, 0xf1, 0x58, 0x56, 0x18, 0x58, 0x7a, 0x5a, 0x36, 0x1b, - 0x2b, 0x8d, 0xfb, 0x94, 0x82, 0x23, 0x64, 0x65, 0xa2, 0xda, 0x26, 0xc3, 0xb1, 0xad, 0xb0, 0xa8, 0xe4, 0xa1, 0x5a, 0x79, 0x39, 0x71, 0x6e, 0x45, 0x94, 0x5f, 0xad, 0xb0, 0x29, 0x53, 0xc9, 0x22, - 0x4b, 0x44, 0x4a, 0x53, 0x17, 0x88, 0x9a, 0x93, 0xa4, 0xe4, 0x4f, 0xc5, 0x26, 0x3f, 0x57, 0x45, 0xb5, 0x0c, 0x07, 0x6b, 0x9b, 0x4b, 0xf0, 0xd0, 0x4f, 0x67, 0xe1, 0x5c, 0x7a, 0x6e, 0x2b, 0xed, - 0xb3, 0xab, 0xf7, 0xc7, 0xd4, 0xef, 0xcb, 0x30, 0x33, 0xab, 0xec, 0x27, 0x3f, 0xc4, 0x4e, 0x3e, 0xb7, 0xad, 0xf0, 0x99, 0xf4, 0x2b, 0xa4, 0x6f, 0x17, 0xc6, 0x6e, 0x2b, 0x98, 0x9b, 0x99, 0x62, - 0x78, 0x15, 0x51, 0x70, 0xbd, 0xdb, 0x37, 0x8b, 0xc8, 0xad, 0x3c, 0x52, 0xaa, 0xf8, 0x73, 0x6d, 0x2f, 0xc9, 0xbd, 0xee, 0x69, 0xb3, 0x7c, 0x08, 0x14, 0x30, 0x20, 0x4b, 0x17, 0x3a, 0x6b, 0x51, - 0x6a, 0x88, 0x49, 0x6b, 0x2a, 0x33, 0x50, 0x40, 0x36, 0x81, 0xa9, 0xc6, 0xfb, 0x9e, 0x44, 0xf0, 0xa5, 0xef, 0x25, 0x6b, 0x4f, 0x77, 0x66, 0x1b, 0x9a, 0x4c, 0xd3, 0x5a, 0x59, 0x1c, 0x9e, 0xb3, - 0x40, 0x6e, 0x6f, 0xef, 0x9d, 0x6b, 0x2f, 0x7b, 0xc1, 0xe6, 0x8a, 0xee, 0x0f, 0x39, 0x3b, 0x2f, 0x23, 0xce, 0xf3, 0xc4, 0xb3, 0xb2, 0xf7, 0x5e, 0xb4, 0xf7, 0xd9, 0xf5, 0x99, 0x28, 0x8e, 0x6f, - 0xd4, 0x6f, 0x18, 0x7f, 0xba, 0x76, 0x6d, 0x3e, 0xf3, 0x3b, 0xcc, 0x01, 0x67, 0x58, 0x02, 0xbf, 0x4a, 0xb3, 0x18, 0xb3, 0xf6, 0xe7, 0x3e, 0x26, 0x0c, 0xbe, 0x3f, 0xe8, 0x85, 0x2b, 0x5b, 0x5d, - 0xad, 0xaf, 0x79, 0x0d, 0x77, 0x6c, 0xc0, 0x1b, 0xea, 0xed, 0xc2, 0x19, 0x7c, 0xc2, 0x89, 0x1b, 0xd5, 0xed, 0x5a, 0x0f, 0x37, 0x97, 0x33, 0x3f, 0x38, 0x9c, 0x78, 0xcc, 0xc3, 0x49, 0x26, 0x83, - 0x39, 0x98, 0x11, 0x7c, 0x6a, 0x6a, 0xa2, 0x47, 0xa3, 0x94, 0x95, 0x93, 0xf1, 0x9c, 0xd6, 0xf1, 0x4b, 0x44, 0xd4, 0xaf, 0x8d, 0xaa, 0xbf, 0x7d, 0x83, 0x0f, 0x19, 0x06, 0x8f, 0xbc, 0x47, 0x4f, - 0x09, 0x8b, 0x57, 0xba, 0x57, 0xdc, 0x5f, 0xcf, 0x2e, 0x5e, 0xa4, 0x11, 0x02, 0x23, 0xab, 0x9a, 0xae, 0x3e, 0x9b, 0xfe, 0xe6, 0x40, 0x90, 0x52, 0xd9, 0x27, 0xf4, 0x7a, 0x2a, 0x03, 0x4d, 0x91, - 0x4d, 0x21, 0x13, 0x62, 0x83, 0xa2, 0xcb, 0xea, 0x62, 0x47, 0xd1, 0x29, 0xcc, 0x83, 0xea, 0x7a, 0x0e, 0x0d, 0xa2, 0x3f, 0xf8, 0xeb, 0x8d, 0x0e, 0xd2, 0x7b, 0x0b, 0x24, 0x36, 0x66, 0x15, 0x43, - 0x96, 0x53, 0xcc, 0x62, 0x46, 0x82, 0x84, 0x39, 0x7c, 0x56, 0x09, 0xd3, 0x5d, 0x27, 0x34, 0xfe, 0x2d, 0x32, 0xfa, 0xe5, 0xc5, 0xf2, 0xd2, 0x7b, 0x37, 0x9b, 0x1f, 0x4c, 0xf0, 0x27, 0x67, 0xf8, - 0x07, 0xda, 0x37, 0x14, 0xde, 0x2f, 0x4c, 0x90, 0x91, 0xc9, 0xba, 0x8a, 0x12, 0x9f, 0x93, 0x76, 0xcd, 0x1d, 0x39, 0xd8, 0x58, 0x75, 0x9c, 0x5d, 0xe6, 0x2c, 0xbf, 0xb1, 0x01, 0xa7, 0x39, 0x36, - 0xe5, 0x91, 0xdb, 0x8b, 0x3d, 0x7f, 0x26, 0x39, 0x34, 0x17, 0x59, 0xfc, 0x4c, 0x97, 0x36, 0x9e, 0x07, 0xce, 0xb1, 0xda, 0x4c, 0xf1, 0x8e, 0x9f, 0x5a, 0xae, 0x73, 0xc8, 0x73, 0x82, 0x0c, 0xf4, - 0x12, 0x04, 0xd0, 0xc5, 0xbc, 0xdf, 0x85, 0x28, 0x8c, 0x62, 0x43, 0x44, 0x94, 0xcf, 0x4d, 0xf1, 0xcf, 0xea, 0xec, 0x23, 0x86, 0xfa, 0xdc, 0x5d, 0xfa, 0xd1, 0x02, 0xf4, 0xd4, 0x8c, 0xfe, 0x40, - 0xfa, 0x0a, 0xe8, 0x87, 0x0b, 0x63, 0x77, 0xd4, 0xb4, 0x5d, 0xc2, 0xa9, 0x38, 0x82, 0x75, 0xb9, 0x0c, 0x51, 0x56, 0x6e, 0xce, 0x87, 0x10, 0x05, 0x4d, 0xc2, 0x09, 0x69, 0x03, 0x9c, 0xed, 0x0f, - 0x33, 0x5e, 0x06, 0x19, 0x4b, 0x11, 0xa1, 0xdd, 0x51, 0x38, 0x61, 0x35, 0xb2, 0xea, 0x10, 0x05, 0x41, 0x51, 0xba, 0xde, 0x1d, 0xd2, 0xae, 0xd1, 0x73, 0x83, 0x5c, 0xaf, 0x13, 0x76, 0x6a, 0x4b, - 0xcb, 0xe4, 0x8c, 0xa4, 0xfd, 0x16, 0x5c, 0xe3, 0xc3, 0x11, 0x1a, 0xb9, 0x2c, 0x7b, 0xe7, 0xfa, 0x87, 0x28, 0xc4, 0xe7, 0xd2, 0x42, 0xde, 0xc9, 0x5e, 0x21, 0xb9, 0x9d, 0x8c, 0x49, 0x0b, 0x81, - 0x27, 0xa7, 0x65, 0x37, 0xd5, 0x60, 0x4f, 0xa1, 0xa6, 0xa4, 0xea, 0xf3, 0x56, 0xd8, 0x78, 0xa7, 0x83, 0x43, 0x05, 0x03, 0xb0, 0x59, 0x8e, 0x1a, 0x90, 0xdf, 0x24, 0xc9, 0xa5, 0x1b, 0xdc, 0xe4, - 0x52, 0x58, 0xa5, 0xc8, 0x1f, 0x6b, 0x1d, 0xe8, 0x73, 0xae, 0x95, 0xfb, 0xbf, 0x71, 0x1d, 0xea, 0xbd, 0x3b, 0x97, 0xbc, 0xc1, 0x11, 0xd3, 0x6a, 0xe8, 0xd3, 0x14, 0x07, 0x1a, 0xa0, 0x9a, 0x56, - 0xbb, 0x7d, 0xcf, 0xd1, 0x27, 0xd1, 0xf2, 0x62, 0x1d, 0xe5, 0xe6, 0x6d, 0x38, 0x15, 0x9c, 0x44, 0x70, 0xa3, 0xc1, 0xb0, 0x56, 0x5a, 0xc3, 0x33, 0x14, 0xaa, 0xac, 0x63, 0x9b, 0xcc, 0x76, 0xcd, - 0x22, 0x73, 0xdd, 0x29, 0xbf, 0x68, 0xa1, 0xf0, 0x08, 0x08, 0x06, 0xc9, 0x6e, 0x98, 0xa4, 0xda, 0x7b, 0x02, 0xa6, 0x79, 0x01, 0x31, 0xd3, 0x89, 0x83, 0x3c, 0x92, 0x0d, 0x02, 0x2f, 0xf3, 0x4a, - 0xab, 0xce, 0xcb, 0xc9, 0xeb, 0x26, 0xf5, 0x4f, 0xae, 0xdb, 0xa7, 0x40, 0xfb, 0xfe, 0x13, 0x57, 0xc8, 0xbe, 0x5f, 0xbf, 0xfa, 0x70, 0x47, 0x20, 0x16, 0x57, 0xb3, 0xb8, 0xa7, 0x13, 0xb4, 0x8f, - 0x0e, 0x33, 0x19, 0xd8, 0x56, 0x07, 0x37, 0x65, 0xbb, 0xd9, 0xd6, 0x91, 0xce, 0xd6, 0x61, 0xbf, 0xae, 0x0a, 0xc1, 0x2d, 0x92, 0xb9, 0xa6, 0x2f, 0xe9, 0xf6, 0x04, 0x47, 0x66, 0xb0, 0xf4, 0x8e, - 0xde, 0x14, 0x5a, 0xc3, 0x04, 0x79, 0xf2, 0x1a, 0x8a, 0x70, 0x06, 0xd9, 0x3a, 0x7b, 0x2e, 0x7a, 0x02, 0xb5, 0xa1, 0xe9, 0xa0, 0xaa, 0x5b, 0x43, 0x51, 0xb9, 0xa6, 0x46, 0x44, 0x82, 0xfc, 0xfd, - 0x92, 0xf6, 0xc3, 0x1c, 0x7b, 0xae, 0xe7, 0xca, 0x8d, 0xe6, 0x0d, 0xc2, 0x97, 0xd9, 0x35, 0xb2, 0xe7, 0x0a, 0xbe, 0x80, 0x6a, 0xa1, 0x66, 0xd5, 0xf9, 0x32, 0x95, 0x4e, 0x5c, 0xb6, 0x66, 0x91, - 0x70, 0x41, 0xb0, 0x05, 0x72, 0x72, 0x84, 0xd9, 0xdc, 0x6d, 0x72, 0xac, 0x36, 0x1b, 0x7a, 0xa3, 0x82, 0x3c, 0x21, 0xca, 0x2d, 0x18, 0x84, 0x61, 0x8f, 0x42, 0x39, 0x8e, 0x37, 0xbe, 0xe5, 0x9f, - 0x57, 0xe0, 0xda, 0xe5, 0x49, 0x7a, 0xbd, 0xae, 0x10, 0xc1, 0x2f, 0x33, 0x0a, 0x57, 0xd7, 0x42, 0xcf, 0x90, 0xac, 0xf6, 0x9c, 0xde, 0xfb, 0x49, 0xfc, 0xbc, 0x56, 0xa7, 0x7b, 0x84, 0x60, 0xe6, - 0x05, 0x56, 0x1d, 0xb5, 0xde, 0x64, 0xf0, 0xca, 0x47, 0x1b, 0x75, 0xc8, 0xb3, 0x52, 0xfc, 0x13, 0xf1, 0x2b, 0xa6, 0x9f, 0x2e, 0x5d, 0x1c, 0x62, 0x23, 0x24, 0xb9, 0x7b, 0x5a, 0xb5, 0x56, 0xb9, - 0xb6, 0xba, 0x43, 0x35, 0xb7, 0x45, 0xce, 0x5b, 0xed, 0xc9, 0x81, 0x19, 0xa8, 0x65, 0xbd, 0xa2, 0x1d, 0x17, 0xa1, 0x8c, 0xc6, 0x6f, 0x9a, 0xf9, 0x10, 0x42, 0x0b, 0xaa, 0x10, 0xf9, 0x78, 0xb5, - 0xc9, 0x0c, 0x88, 0xe2, 0x5a, 0xb2, 0x32, 0x0e, 0x48, 0x33, 0xc7, 0xb5, 0x42, 0x96, 0xba, 0xc8, 0x63, 0x3c, 0x69, 0x76, 0x9e, 0x19, 0xcc, 0x7e, 0xef, 0x37, 0xa4, 0x69, 0x6a, 0x63, 0x62, 0x6a, - 0x5e, 0x5e, 0xb8, 0x49, 0xed, 0x87, 0x4d, 0x2a, 0xc9, 0x67, 0x45, 0xdd, 0x95, 0xea, 0x0d, 0x92, 0xcb, 0xf1, 0xa5, 0x80, 0xc2, 0x88, 0xc9, 0x89, 0xc1, 0xd3, 0xc8, 0x3f, 0x06, 0x84, 0x47, 0xa9, - 0x7d, 0xb2, 0x2b, 0xdc, 0x5a, 0x2d, 0xbc, 0xb5, 0xbe, 0x39, 0xb5, 0x3b, 0x76, 0xa6, 0x0f, 0x6a, 0x5d, 0xf3, 0xed, 0x4c, 0xe1, 0x48, 0x0c, 0x06, 0x8a, 0xcc, 0xa4, 0x18, 0xb1, 0x85, 0x20, 0x08, - 0xdb, 0x28, 0x6b, 0x0c, 0x95, 0x85, 0x2d, 0x97, 0x08, 0xb4, 0xb3, 0x68, 0xc5, 0x82, 0x10, 0xcd, 0xbd, 0xa9, 0xb1, 0x89, 0xbd, 0x38, 0x18, 0xe7, 0x73, 0x36, 0x52, 0x9c, 0xdd, 0xde, 0xf4, 0xd7, - 0x25, 0x9f, 0x7c, 0x1e, 0x92, 0x4f, 0x8b, 0xfe, 0xa7, 0x4b, 0x17, 0xf1, 0x45, 0xfe, 0x0e, 0xd0, 0x11, 0xd6, 0xa0, 0xa5, 0x32, 0xac, 0x37, 0x39, 0x69, 0x26, 0xc6, 0xd2, 0x1f, 0x94, 0x06, 0x41, - 0xa5, 0x90, 0xd8, 0x44, 0xcb, 0xb9, 0x55, 0x05, 0x85, 0x4d, 0x1f, 0x48, 0xc2, 0x3b, 0xf9, 0x73, 0x93, 0x39, 0x75, 0x3c, 0x86, 0x69, 0x4b, 0x4c, 0x50, 0xd9, 0x96, 0x35, 0x96, 0x26, 0xec, 0xee, - 0xd6, 0xb4, 0x39, 0x4c, 0x43, 0x95, 0xa5, 0x77, 0x21, 0xef, 0xaf, 0x8f, 0x0a, 0x56, 0xb8, 0x7b, 0xfc, 0x58, 0x3e, 0x17, 0x53, 0xfc, 0xf7, 0x02, 0xad, 0x48, 0xac, 0xe8, 0x62, 0xb3, 0xfc, 0x60, - 0x22, 0x3d, 0xc5, 0x70, 0x6f, 0x84, 0xaf, 0xc8, 0xbe, 0x9d, 0x8e, 0xed, 0x03, 0xd0, 0xb7, 0x47, 0xa5, 0x3f, 0xa7, 0x73, 0x61, 0x26, 0xc9, 0x58, 0x21, 0x1e, 0xa6, 0xe9, 0x6a, 0x81, 0x33, 0x33, - 0x59, 0x4c, 0x0e, 0xab, 0x1d, 0xbe, 0xb6, 0x24, 0xf1, 0x90, 0xe3, 0xa0, 0xb3, 0x76, 0x55, 0xd3, 0xdd, 0xb7, 0x95, 0x09, 0x47, 0xf9, 0x6a, 0x96, 0x67, 0xeb, 0x05, 0x93, 0x57, 0x42, 0xb2, 0xd9, - 0xcf, 0xa8, 0xa4, 0xd3, 0x7a, 0xd0, 0x5e, 0x0d, 0x9b, 0xd8, 0xe9, 0x28, 0x6b, 0x20, 0x51, 0x60, 0x3e, 0x92, 0xed, 0x2e, 0x95, 0x21, 0x7e, 0x60, 0xb7, 0xbf, 0xaf, 0x02, 0xfc, 0x4a, 0xf4, 0x0a, - 0xc6, 0xb5, 0x0a, 0xc8, 0x85, 0xd2, 0xef, 0x40, 0xb4, 0x89, 0xb0, 0x87, 0xc9, 0x9d, 0x78, 0xc2, 0xb0, 0xbc, 0x6b, 0x71, 0x46, 0x56, 0xd0, 0xe9, 0x09, 0xb2, 0xe5, 0xed, 0xcc, 0xa6, 0x80, 0xe3, - 0x1c, 0xd5, 0x04, 0x13, 0xf1, 0x23, 0x53, 0x94, 0xf6, 0xf5, 0x50, 0x1b, 0x33, 0x3c, 0x82, 0xa6, 0xc3, 0xd4, 0x3c, 0xcf, 0xb9, 0x4e, 0xc2, 0xa9, 0x13, 0x23, 0xed, 0xeb, 0xb3, 0xcb, 0x2a, 0xba, - 0x04, 0xea, 0xb8, 0x1c, 0x65, 0x70, 0x17, 0x4f, 0x4f, 0x73, 0xe3, 0x69, 0xf6, 0xfa, 0xcf, 0xef, 0x5a, 0x7a, 0x15, 0x5a, 0xa5, 0xe7, 0x5e, 0x9d, 0x5a, 0x13, 0xbb, 0xf1, 0xfd, 0x87, 0xd2, 0xec, - 0x69, 0x6d, 0xfd, 0xce, 0x4f, 0x5c, 0x91, 0xbd, 0x73, 0x63, 0xac, 0xf6, 0x5e, 0x9d, 0x44, 0x44, 0xe3, 0x1a, 0x18, 0x84, 0x7a, 0xa2, 0x69, 0x0f, 0xfd, 0xae, 0x9e, 0x4a, 0x43, 0x1f, 0x32, 0xf1, - 0x74, 0x97, 0xf0, 0x8e, 0x37, 0xcf, 0x37, 0xc2, 0x6a, 0x4f, 0xed, 0xe9, 0x99, 0x46, 0x3b, 0x6d, 0xe4, 0x80, 0xb2, 0x5b, 0x99, 0xd0, 0x71, 0xa6, 0xd1, 0x28, 0x3f, 0xeb, 0xd1, 0xa5, 0x36, 0x9b, - 0x9b, 0xcb, 0x88, 0x07, 0xd1, 0x0e, 0x60, 0x78, 0x50, 0x93, 0xed, 0x2d, 0x2f, 0xba, 0xe1, 0xbf, 0x67, 0x89, 0x3f, 0x44, 0xfb, 0xe7, 0x9a, 0x8c, 0x4f, 0xca, 0xc6, 0xf7, 0x0d, 0xc7, 0xd7, 0xe3, - 0xb1, 0xd2, 0xb0, 0x9e, 0x21, 0xda, 0x61, 0x88, 0xda, 0xd8, 0x23, 0x72, 0x7f, 0xbb, 0x27, 0x13, 0x04, 0x75, 0x62, 0x4e, 0xda, 0x58, 0x10, 0x1d, 0xd8, 0xe4, 0x39, 0x61, 0x4e, 0x0b, 0x22, 0x5e, - 0xe0, 0x5e, 0x4c, 0x34, 0x5b, 0x1d, 0x45, 0xd4, 0x64, 0xbf, 0x45, 0x45, 0x61, 0x1b, 0x05, 0xb5, 0xb5, 0xf0, 0x78, 0xb1, 0xa1, 0xfd, 0x3c, 0x74, 0x1c, 0xc5, 0x68, 0x97, 0x91, 0xb9, 0xf1, 0x25, - 0x29, 0x93, 0x0c, 0xad, 0x7e, 0x4e, 0x2f, 0xf9, 0x7b, 0x69, 0x78, 0x8d, 0xb8, 0xfa, 0x01, 0xcc, 0x27, 0xf6, 0xa6, 0x5e, 0xa9, 0xde, 0xc0, 0xbc, 0xe6, 0xce, 0x8d, 0xdd, 0x93, 0xea, 0xa2, 0x38, - 0xb4, 0x94, 0x5d, 0x70, 0x6a, 0xc3, 0x14, 0x84, 0x4c, 0x97, 0x71, 0x0e, 0xa2, 0x59, 0xd3, 0x89, 0xe1, 0x0a, 0xf3, 0xc2, 0x51, 0x38, 0x15, 0xd7, 0xd6, 0x5a, 0x63, 0x1c, 0xb6, 0xb9, 0x4a, 0xd2, - 0x98, 0x26, 0x4a, 0xae, 0x06, 0x04, 0x85, 0x4a, 0x28, 0x43, 0x4e, 0xda, 0x98, 0x8e, 0xf0, 0x5a, 0x02, 0xe6, 0x05, 0xb1, 0x38, 0x19, 0x14, 0x8d, 0x31, 0x66, 0xd7, 0xd2, 0xbe, 0xf5, 0xf4, 0xdc, - 0xff, 0x16, 0x90, 0xf6, 0x58, 0xcb, 0xab, 0xfb, 0xe2, 0x75, 0x1a, 0xfe, 0xb0, 0xb0, 0x3c, 0x67, 0x80, 0x7c, 0xa0, 0x7d, 0xc5, 0xf4, 0xc3, 0x85, 0x6b, 0x92, 0xf0, 0x88, 0xe5, 0x65, 0xbb, 0x3a, - 0x05, 0x33, 0x3e, 0xda, 0x9b, 0xed, 0xa6, 0xb0, 0xe6, 0x26, 0xda, 0xa8, 0x0e, 0x75, 0xe4, 0xb7, 0x1b, 0x0c, 0xc0, 0x18, 0x4e, 0x4d, 0xb8, 0x2c, 0x6a, 0xe4, 0x35, 0xe9, 0x68, 0xa0, 0xc6, 0x31, - 0x90, 0x9c, 0x90, 0x73, 0x12, 0xea, 0x17, 0x3e, 0x5f, 0x84, 0xa8, 0xb3, 0x16, 0x3d, 0xc0, 0xa1, 0xeb, 0xdc, 0x8a, 0x82, 0x16, 0xe0, 0xe6, 0x83, 0xba, 0x12, 0x42, 0x07, 0x99, 0xd6, 0x12, 0x31, - 0xc2, 0xe4, 0xb0, 0x5a, 0x2b, 0xba, 0xba, 0xab, 0x3e, 0xbc, 0xf5, 0x3b, 0xa2, 0x9f, 0xda, 0xa9, 0xff, 0xe2, 0x90, 0xfb, 0x50, 0xcb, 0xe4, 0x3f, 0xff, 0xe7, 0x73, 0xe5, 0x92, 0xf7, 0x08, 0xff, - 0xd7, 0x0f, 0xf5, 0xbf, 0xfe, 0x3b, 0xd3, 0xa2, 0xc9, 0xa2, 0x8b, 0x19, 0x7c, 0x6b, 0xc1, 0x7e, 0xf9, 0x48, 0xf7, 0xb7, 0x43, 0x9e, 0x54, 0x16, 0xbe, 0xfd, 0xc0, 0xf5, 0xc3, 0x7e, 0xbb, 0x7c, - 0x89, 0xe5, 0x18, 0xf1, 0x75, 0x8f, 0xd9, 0x79, 0x81, 0x9c, 0x30, 0x6d, 0x8a, 0x36, 0x54, 0x55, 0x2b, 0x8b, 0x9e, 0xd1, 0x57, 0x53, 0xc9, 0x3d, 0xcf, 0xd3, 0x16, 0xe7, 0xcc, 0x48, 0x71, 0xdc, - 0x64, 0x69, 0x31, 0xf2, 0x81, 0xb1, 0x77, 0xfe, 0xaa, 0xb7, 0x00, 0x29, 0xcc, 0x0b, 0x31, 0xaf, 0xd7, 0x72, 0x59, 0xd5, 0x6c, 0x78, 0x6a, 0x4e, 0x0d, 0x66, 0x16, 0x8d, 0x60, 0x73, 0x0e, 0x48, - 0xed, 0x88, 0x34, 0x38, 0x04, 0xdb, 0xf9, 0x76, 0x4c, 0x51, 0xf4, 0xa8, 0x9a, 0x74, 0x9e, 0x75, 0x2c, 0xbd, 0xc7, 0x0d, 0x15, 0x9e, 0x5c, 0xf2, 0x6e, 0x64, 0xaf, 0xc0, 0xdc, 0x4e, 0xc6, 0x2e, - 0x6d, 0x27, 0xa7, 0xae, 0x9a, 0xb5, 0x99, 0x2e, 0x65, 0x08, 0x68, 0x77, 0xbb, 0x8d, 0x9f, 0xeb, 0x6d, 0x3f, 0xf7, 0x10, 0x60, 0xb1, 0x9b, 0xb5, 0x59, 0x6a, 0x22, 0xde, 0xa0, 0x36, 0x05, 0xbc, - 0x63, 0x2b, 0x8f, 0x06, 0xea, 0x6e, 0x3a, 0xf5, 0x22, 0x2b, 0x21, 0x66, 0xb3, 0x08, 0x15, 0x1d, 0x44, 0x98, 0x3b, 0x3e, 0x01, 0x9c, 0x06, 0x64, 0xce, 0x6e, 0xb3, 0xf8, 0x50, 0x1d, 0xa9, 0x73, - 0x28, 0xec, 0xac, 0x47, 0x11, 0xce, 0xff, 0xde, 0xd2, 0xe6, 0x9d, 0x1f, 0xfb, 0x4d, 0x9f, 0xb3, 0x82, 0xbc, 0xf3, 0xd5, 0x5b, 0xea, 0x9d, 0xaf, 0x0d, 0x84, 0x7e, 0x2d, 0x24, 0x41, 0x6c, 0xdb, - 0xc1, 0x15, 0xcf, 0xba, 0x0d, 0x46, 0x9a, 0x17, 0x72, 0x4e, 0x35, 0x77, 0x6a, 0x63, 0xa0, 0x2a, 0x20, 0x64, 0x7e, 0xe7, 0x85, 0xf8, 0x65, 0x9a, 0x1d, 0xbd, 0xec, 0xd1, 0xee, 0xe9, 0x73, 0x11, - 0x41, 0x6f, 0x54, 0xaf, 0x5d, 0x80, 0xae, 0xc7, 0x63, 0x23, 0x81, 0x14, 0x77, 0xa5, 0xf9, 0x89, 0x33, 0x43, 0x1d, 0x6d, 0x10, 0xa2, 0xcd, 0x49, 0x0e, 0xaa, 0x69, 0x03, 0x11, 0xf3, 0x6d, 0x43, - 0x6b, 0xee, 0x72, 0x25, 0x41, 0xb6, 0x67, 0xd8, 0xdb, 0x90, 0x17, 0xb1, 0x23, 0x61, 0x15, 0xc1, 0xaa, 0x8e, 0x7c, 0x27, 0x9f, 0xd6, 0x2a, 0x6d, 0x3b, 0x67, 0xa9, 0x30, 0xd8, 0xba, 0xe0, 0x90, - 0xe3, 0x74, 0x43, 0xec, 0xec, 0x21, 0xc0, 0xa6, 0x56, 0x53, 0xed, 0xc1, 0xad, 0x30, 0x26, 0xd4, 0xfd, 0x7b, 0x57, 0xa4, 0xcf, 0x0e, 0x3c, 0x18, 0x7b, 0xc2, 0x77, 0xf2, 0xbd, 0x1d, 0xd2, 0x95, - 0xd0, 0xef, 0x38, 0xe4, 0xc7, 0x0d, 0x4f, 0x4a, 0x87, 0xc3, 0x8a, 0x34, 0x4a, 0x91, 0x96, 0x8e, 0x28, 0xb8, 0x3b, 0x94, 0x59, 0x83, 0x45, 0x07, 0xba, 0x97, 0x8e, 0x00, 0x82, 0x67, 0xa7, 0x03, - 0x16, 0xa5, 0x3b, 0x24, 0x2b, 0x9a, 0x56, 0x35, 0xb8, 0x34, 0x07, 0xe5, 0x99, 0x99, 0x9f, 0x3a, 0xf3, 0x68, 0x58, 0x4b, 0xee, 0x88, 0xc6, 0x7a, 0xcb, 0x4a, 0xaa, 0xb4, 0x9c, 0x05, 0xb3, 0xd0, - 0x5a, 0x4b, 0x7d, 0xc6, 0xee, 0xe8, 0xe7, 0x94, 0x94, 0x4f, 0x6d, 0x91, 0xe0, 0xaf, 0xe5, 0x45, 0xdf, 0xdb, 0xfc, 0xfe, 0x18, 0x54, 0xf7, 0x5e, 0x64, 0x74, 0xe2, 0xb5, 0x5e, 0x36, 0xb1, 0xbd, - 0xba, 0xf6, 0xca, 0xc9, 0xa5, 0x0c, 0xec, 0xe3, 0x28, 0xa3, 0x67, 0x1a, 0x61, 0xff, 0xf8, 0x4b, 0xaf, 0x75, 0xdc, 0x1f, 0xdd, 0xbf, 0x94, 0x3c, 0x19, 0xf1, 0x79, 0xce, 0xfd, 0xbc, 0xeb, 0xc3, - 0x32, 0x07, 0x57, 0xb3, 0xdc, 0x27, 0x16, 0xa1, 0x87, 0x44, 0x03, 0x22, 0x3a, 0x87, 0x3c, 0x46, 0xaa, 0x24, 0x17, 0xab, 0x7d, 0x09, 0x1e, 0xaa, 0x99, 0xc2, 0x09, 0x60, 0x1e, 0x6d, 0xa7, 0xbe, - 0x25, 0x86, 0x09, 0x2e, 0x89, 0x7e, 0x01, 0xc4, 0xb2, 0xcb, 0x98, 0x8a, 0x2c, 0x43, 0xcb, 0xd5, 0x5e, 0x1c, 0x78, 0x7a, 0x58, 0x9a, 0x73, 0x32, 0x89, 0x68, 0xf8, 0x18, 0x22, 0x63, 0xc4, 0xf7, - 0x2f, 0x55, 0xf0, 0x3f, 0xaf, 0x75, 0xcf, 0xb1, 0xec, 0xf8, 0xea, 0xf7, 0x97, 0x5f, 0x18, 0x01, 0x96, 0x6d, 0x4f, 0x79, 0xdc, 0x9d, 0x1a, 0x1a, 0xae, 0x52, 0x6b, 0x67, 0x16, 0x86, 0x4d, 0x48, - 0xf2, 0x2b, 0x8a, 0xe2, 0x0f, 0xcd, 0x1e, 0x3d, 0x55, 0x4b, 0xd4, 0x80, 0x06, 0xc9, 0x9c, 0x0b, 0xbe, 0x39, 0xe3, 0x9d, 0x62, 0x1f, 0xf1, 0x1a, 0xb8, 0x3a, 0x0f, 0x47, 0x02, 0xa1, 0xd9, 0xb2, - 0xb2, 0x6c, 0x30, 0xdd, 0x44, 0xbc, 0x5c, 0x47, 0x74, 0xb7, 0xd9, 0x02, 0x14, 0x86, 0x2b, 0x5b, 0x0f, 0xd5, 0xc7, 0x18, 0xca, 0xf7, 0xdb, 0x96, 0x74, 0x51, 0x1d, 0xe6, 0xcd, 0xb5, 0xb2, 0xf0, - 0xe3, 0xea, 0xcd, 0xf0, 0x53, 0xce, 0xd2, 0x51, 0xbf, 0xf8, 0x06, 0xe7, 0x2f, 0xcf, 0x8d, 0x8b, 0x30, 0xce, 0x6c, 0x0f, 0x4e, 0x56, 0x56, 0xbd, 0x1d, 0x06, 0x80, 0xea, 0x0a, 0x78, 0x3e, 0x85, - 0xea, 0x63, 0x57, 0x1e, 0x56, 0xc9, 0xec, 0x77, 0x84, 0x8e, 0x51, 0xe6, 0x4e, 0xf2, 0x47, 0xaa, 0x00, 0xf1, 0x94, 0x3d, 0x71, 0xa3, 0x09, 0x4e, 0x5e, 0x8f, 0x2e, 0x35, 0x65, 0x47, 0xd8, 0x12, - 0xae, 0xb3, 0x83, 0x9b, 0x04, 0xa0, 0xeb, 0xd4, 0xe3, 0x68, 0x5c, 0x05, 0xce, 0x08, 0x05, 0x7a, 0xe1, 0x3a, 0x70, 0xe9, 0x74, 0x26, 0x5a, 0xe8, 0xba, 0x6a, 0x39, 0xb5, 0x1e, 0x52, 0xb4, 0xed, - 0xd9, 0x99, 0x44, 0x2a, 0xdb, 0xa2, 0x6e, 0x19, 0x0e, 0xa8, 0x31, 0x6c, 0xaf, 0x1f, 0x2c, 0x2d, 0x56, 0x59, 0xc5, 0x29, 0x8b, 0xb9, 0x37, 0x4f, 0xa6, 0xd4, 0x7e, 0x5a, 0x36, 0x9a, 0x82, 0xe1, - 0x44, 0x38, 0x66, 0x52, 0x25, 0x5e, 0xfb, 0x68, 0x17, 0xe2, 0xb9, 0x49, 0xf4, 0x42, 0x10, 0x9c, 0x5c, 0xfe, 0x1b, 0x3b, 0x49, 0x00, 0x5b, 0x45, 0x1a, 0x1e, 0x9b, 0xe1, 0xeb, 0xc5, 0x8c, 0x0c, - 0xc1, 0x0c, 0xf5, 0x5a, 0x67, 0x07, 0x56, 0x72, 0xb2, 0x3a, 0x4c, 0x8b, 0x65, 0x41, 0xf4, 0x29, 0x25, 0xed, 0x57, 0xb8, 0xa7, 0x13, 0x00, 0x41, 0x72, 0xd5, 0x29, 0x01, 0xd7, 0x96, 0xa5, 0x92, - 0xa7, 0x15, 0xcb, 0xd4, 0x48, 0x39, 0xf8, 0xb9, 0x05, 0xe2, 0x32, 0xbb, 0x60, 0xc3, 0x33, 0x17, 0x9d, 0x61, 0x77, 0x53, 0x23, 0x47, 0xf9, 0xd1, 0xc2, 0xf7, 0x8b, 0xc0, 0x2f, 0x4a, 0x2f, 0x69, - 0x5c, 0x6f, 0xf2, 0x66, 0x47, 0x21, 0x9f, 0xd5, 0xf3, 0x4b, 0xb2, 0xbd, 0x13, 0x7a, 0xce, 0xa5, 0x79, 0xd2, 0xff, 0xef, 0x5a, 0x53, 0xee, 0x76, 0xfb, 0xb3, 0xd4, 0xbf, 0x53, 0x00, 0xfb, 0x1e, - 0xc8, 0xf8, 0x53, 0x51, 0x7c, 0x5f, 0x89, 0xbf, 0x00, 0xfe, 0xe5, 0xd2, 0x04, 0x1f, 0x17, 0xd3, 0xa7, 0xa9, 0x64, 0xa1, 0x1d, 0xa9, 0x58, 0x9c, 0x2a, 0x70, 0xa7, 0x90, 0x1d, 0x1a, 0xed, 0xfd, - 0x65, 0x7c, 0x46, 0x11, 0x2e, 0x62, 0x11, 0x1f, 0x0d, 0xe7, 0xae, 0xbc, 0x93, 0xba, 0x1e, 0x05, 0x67, 0x5b, 0x19, 0xcd, 0x50, 0x3d, 0x77, 0xfa, 0xa8, 0xd0, 0xce, 0x4e, 0xaf, 0x98, 0x0a, 0x64, - 0x85, 0xb9, 0xd7, 0x02, 0xfe, 0xb1, 0x27, 0xe8, 0x86, 0x01, 0x16, 0x5e, 0xbc, 0xb5, 0x68, 0xa1, 0xe1, 0x85, 0x11, 0x45, 0xa1, 0x9d, 0x3c, 0x3f, 0x46, 0xd7, 0x85, 0x15, 0x7a, 0xaa, 0xf8, 0x77, - 0xe5, 0xd5, 0x93, 0x2b, 0x91, 0xeb, 0x92, 0xf6, 0x5a, 0x03, 0x1c, 0x7b, 0x64, 0xf9, 0x26, 0x51, 0xe6, 0x55, 0x13, 0x2b, 0x73, 0x27, 0x4e, 0x9e, 0x34, 0xe9, 0x43, 0xd5, 0xef, 0xb9, 0xd0, 0x87, - 0x6f, 0xd4, 0x2f, 0xdf, 0xe4, 0xcb, 0xb5, 0xb1, 0x61, 0x10, 0x64, 0x9f, 0xf4, 0x89, 0x57, 0x99, 0x32, 0xb8, 0xd5, 0x11, 0x3a, 0x0e, 0x67, 0x5c, 0x82, 0x6a, 0x7e, 0x9c, 0x13, 0xe6, 0x81, 0x0c, - 0xa6, 0xa7, 0x55, 0x89, 0xcf, 0xc9, 0xad, 0x50, 0x9e, 0x1c, 0x1a, 0x6d, 0x49, 0x7f, 0xd8, 0xf5, 0x69, 0x0d, 0xb3, 0x45, 0x37, 0xd3, 0xa8, 0x8c, 0xd1, 0x0e, 0x15, 0x75, 0x1a, 0x86, 0xf6, 0x14, - 0xda, 0x71, 0x28, 0xe0, 0xb2, 0x19, 0x10, 0x9b, 0x1a, 0xe4, 0x8f, 0x8f, 0x4a, 0x4c, 0x7f, 0xc6, 0xe8, 0x53, 0xe1, 0xd8, 0xfb, 0x0c, 0xfb, 0x8c, 0x62, 0xfc, 0x81, 0xee, 0x0b, 0x2e, 0xef, 0x67, - 0x97, 0xa6, 0xc3, 0x23, 0x94, 0xe3, 0x9a, 0x0c, 0x3b, 0xba, 0x58, 0x02, 0xfb, 0xb6, 0xe9, 0xc4, 0xd5, 0xa1, 0x3b, 0xe2, 0x83, 0xce, 0x17, 0x7d, 0xb8, 0x3c, 0x0d, 0x01, 0x72, 0x52, 0x93, 0x63, - 0xb2, 0x92, 0x7c, 0x28, 0xd5, 0xcf, 0x8b, 0x9d, 0xed, 0xa1, 0xf3, 0x02, 0xd1, 0x23, 0xcf, 0x74, 0xdc, 0x46, 0x34, 0x62, 0x6b, 0xcd, 0xe5, 0x3d, 0x51, 0xd0, 0xcd, 0xa2, 0x90, 0x67, 0x8b, 0xfd, - 0x82, 0x22, 0xf7, 0xc5, 0x46, 0x48, 0xc4, 0x13, 0xf5, 0x9c, 0x52, 0x58, 0x4c, 0xae, 0xef, 0x7f, 0xd3, 0xfb, 0x1e, 0x16, 0x1e, 0x4c, 0x72, 0xf7, 0x71, 0x1e, 0x05, 0xf6, 0x07, 0x26, 0xff, 0x20, - 0x4f, 0xcc, 0xfc, 0x0b, 0xd1, 0x0b, 0x86, 0x2f, 0x07, 0x93, 0x1b, 0x9d, 0xdf, 0x01, 0x6c, 0x91, 0x23, 0x37, 0xf3, 0x70, 0x32, 0xf1, 0x1c, 0xb5, 0x49, 0x2c, 0x6e, 0xd9, 0x88, 0xea, 0xb6, 0x47, - 0x95, 0x1e, 0x0b, 0xd6, 0x8b, 0x15, 0x61, 0xc2, 0x12, 0xda, 0xce, 0xe0, 0x63, 0x19, 0x1c, 0x4c, 0xb1, 0xac, 0x64, 0x60, 0x3d, 0x57, 0x17, 0xbc, 0x7e, 0xd6, 0x63, 0xe7, 0xb0, 0xad, 0x60, 0x72, - 0x1d, 0xda, 0xa6, 0xbe, 0xf0, 0x5c, 0x66, 0xd5, 0x52, 0x07, 0x13, 0xae, 0xdb, 0x18, 0x9f, 0xb7, 0xbb, 0x71, 0x2c, 0xf5, 0xf2, 0xa2, 0x7f, 0x9c, 0x24, 0xcf, 0x3c, 0xd7, 0xf3, 0x1e, 0x17, 0x6b, - 0x7e, 0xa6, 0x63, 0xc4, 0x57, 0xe2, 0x6f, 0xc0, 0xbc, 0x5f, 0x9a, 0x5c, 0x28, 0xff, 0xa6, 0x4a, 0x60, 0x31, 0x05, 0x66, 0x33, 0x60, 0xdb, 0xba, 0x04, 0xbf, 0xda, 0x65, 0x2c, 0x7b, 0x0e, 0x0f, - 0xf9, 0xd2, 0x4e, 0x06, 0x69, 0x44, 0x55, 0xc2, 0xdb, 0x4f, 0xd6, 0x65, 0x93, 0xdd, 0x18, 0xe3, 0xfe, 0x08, 0xb1, 0x27, 0xbc, 0x0b, 0x5f, 0x68, 0xbf, 0x0f, 0xf0, 0xf5, 0xca, 0xe4, 0x42, 0xf7, - 0xb7, 0xf1, 0xed, 0x63, 0x4d, 0xcc, 0xd7, 0x33, 0x45, 0xc2, 0x44, 0x60, 0x00, 0x41, 0x3d, 0xd8, 0xf5, 0xc0, 0x5e, 0xb4, 0x4f, 0x98, 0xb9, 0x19, 0x33, 0xbe, 0xe0, 0x97, 0x5c, 0xe8, 0xe7, 0xb2, - 0x37, 0x3f, 0xd0, 0xbd, 0x8c, 0xeb, 0xed, 0x6c, 0x6c, 0xd6, 0x26, 0x75, 0xd8, 0xb6, 0x05, 0xc3, 0x50, 0x4d, 0x1f, 0xfa, 0xb5, 0xd7, 0x50, 0xc5, 0xb2, 0x95, 0xcf, 0xc5, 0xca, 0x24, 0x77, 0x86, - 0xe1, 0x16, 0x5a, 0xd4, 0x9a, 0xc5, 0xa2, 0x27, 0xaa, 0x79, 0xc5, 0x36, 0x82, 0x62, 0x80, 0x64, 0x29, 0x2f, 0xac, 0xd6, 0x73, 0x3d, 0x96, 0xb2, 0x04, 0xc0, 0x3c, 0xf6, 0x27, 0xa2, 0x29, 0x36, - 0x73, 0x7d, 0x0d, 0xd2, 0xcc, 0x9e, 0x68, 0x25, 0x63, 0xf0, 0x95, 0x7e, 0xfd, 0x9c, 0x54, 0x70, 0xc2, 0xd7, 0x8e, 0x8a, 0xdf, 0xda, 0x44, 0x3f, 0x70, 0xd2, 0xbd, 0x2c, 0x7c, 0x3f, 0x08, 0x8f, - 0xbc, 0xb0, 0xbd, 0xec, 0x61, 0x31, 0xe4, 0xe7, 0x7a, 0x7f, 0xbe, 0x51, 0xbd, 0xc0, 0x7d, 0x3b, 0x1e, 0xdb, 0xfb, 0xd3, 0xaf, 0x91, 0x6d, 0xda, 0x98, 0x19, 0xd7, 0x01, 0xdc, 0x4a, 0xf6, 0x55, - 0x3c, 0x2d, 0x66, 0xfb, 0xc6, 0x9d, 0xb1, 0xca, 0x90, 0x14, 0xcb, 0x34, 0x24, 0x53, 0x8d, 0x94, 0x9c, 0xed, 0x22, 0xf5, 0xfc, 0x4a, 0x48, 0xf6, 0xd4, 0xf4, 0x08, 0x69, 0x44, 0x56, 0x4e, 0xa7, - 0xae, 0xd3, 0x19, 0x73, 0x60, 0xa0, 0x07, 0x07, 0xda, 0xe9, 0xec, 0xb0, 0x30, 0x19, 0x78, 0x0e, 0x07, 0x9a, 0xcf, 0x9b, 0xcd, 0x6a, 0x44, 0x45, 0x87, 0x73, 0xed, 0xdd, 0x3c, 0x52, 0x3f, 0x94, - 0xb2, 0xfa, 0x98, 0x34, 0xfb, 0x48, 0x9f, 0x7f, 0x02, 0xaf, 0x57, 0xaa, 0x2f, 0x78, 0xbd, 0x1e, 0x5f, 0x74, 0xfa, 0x11, 0x78, 0xad, 0x72, 0xc2, 0x5d, 0x41, 0xd8, 0x34, 0xdd, 0xc5, 0xcd, 0x90, - 0x75, 0xab, 0xdd, 0x0e, 0x2d, 0x34, 0x6f, 0x9f, 0xba, 0x20, 0x0f, 0xf9, 0xbe, 0x9a, 0x1c, 0x0f, 0x87, 0xa0, 0x33, 0x23, 0xc0, 0x3b, 0xc1, 0xda, 0x34, 0x3d, 0xc9, 0xdd, 0x34, 0x04, 0xbc, 0x75, - 0x65, 0x48, 0xc6, 0xb4, 0x33, 0x68, 0x1a, 0x8e, 0x90, 0xb9, 0x15, 0x62, 0x21, 0xcc, 0xce, 0x36, 0xd3, 0x33, 0x76, 0x52, 0xc3, 0x85, 0x5d, 0x45, 0x23, 0xbc, 0xd8, 0xbd, 0x95, 0x24, 0xd1, 0xad, - 0x72, 0xd5, 0x0f, 0x6e, 0x89, 0xd4, 0x3a, 0x7a, 0x93, 0xd7, 0x5e, 0x34, 0xf7, 0x59, 0x0c, 0x7d, 0x22, 0x03, 0xec, 0x9d, 0x2c, 0x38, 0xf9, 0x70, 0x32, 0xb9, 0x50, 0xfb, 0x1d, 0xb4, 0x8a, 0xd2, - 0xc2, 0x44, 0xf4, 0xc8, 0x76, 0x2b, 0xe4, 0xa9, 0x1c, 0x4e, 0xe1, 0xd3, 0xdc, 0x4b, 0x36, 0xf9, 0xb1, 0x04, 0x77, 0x0e, 0xca, 0x04, 0xa2, 0x5d, 0xe5, 0x68, 0x46, 0x62, 0xa9, 0xbe, 0x65, 0xf0, - 0xb5, 0x6a, 0x76, 0x47, 0x96, 0x16, 0x93, 0x83, 0x8f, 0x1d, 0xb6, 0x56, 0xba, 0x3e, 0xaf, 0x66, 0x54, 0x08, 0x05, 0x21, 0x89, 0x96, 0x1b, 0x1a, 0x3b, 0xb7, 0x9d, 0xa2, 0x22, 0x53, 0x7d, 0x99, - 0x8d, 0x31, 0x84, 0x52, 0xab, 0xf8, 0x61, 0xa7, 0x1d, 0x7b, 0x2a, 0xd7, 0xe4, 0x46, 0xf3, 0x02, 0xc4, 0xe5, 0x68, 0x82, 0x8d, 0xcb, 0x2b, 0x09, 0x5d, 0x11, 0xee, 0xf4, 0xd2, 0xb4, 0x6d, 0x84, - 0xf6, 0xd8, 0x45, 0xb4, 0x88, 0x57, 0xb6, 0xb7, 0xa5, 0x56, 0xb6, 0x10, 0x9f, 0xe0, 0xa6, 0x3c, 0xf2, 0x2b, 0x70, 0xbd, 0xdc, 0x82, 0xa2, 0x81, 0x51, 0x1b, 0x13, 0x96, 0xf5, 0x83, 0x56, 0xc9, - 0xac, 0x0e, 0x2f, 0xe0, 0xa1, 0x35, 0xe6, 0x7c, 0x06, 0x1f, 0x66, 0x10, 0xe1, 0x74, 0x31, 0x5b, 0x49, 0x4b, 0x44, 0x40, 0xb5, 0x24, 0x8b, 0x61, 0xe3, 0x30, 0xc6, 0x15, 0x98, 0x7a, 0x79, 0xf7, - 0x00, 0x02, 0xfa, 0xa9, 0x19, 0xf4, 0x42, 0xf0, 0x65, 0xfc, 0x5e, 0xde, 0x4d, 0xe8, 0x71, 0xf3, 0x06, 0xc8, 0xed, 0x9d, 0x9d, 0x48, 0x72, 0xaa, 0x84, 0x4e, 0xcf, 0xd6, 0x04, 0xe2, 0x37, 0xa5, - 0x7c, 0x52, 0x18, 0xb9, 0x10, 0xfb, 0xfd, 0x21, 0xa7, 0xd8, 0x46, 0xc6, 0x6d, 0x91, 0x74, 0x17, 0x54, 0x97, 0x76, 0x32, 0xd0, 0x76, 0xbc, 0x50, 0x80, 0xe5, 0x74, 0xce, 0x61, 0xd3, 0x52, 0xdd, - 0x52, 0xd3, 0x8a, 0x93, 0x39, 0xb8, 0x8a, 0x73, 0x93, 0xc6, 0x04, 0x0c, 0x26, 0x0f, 0x33, 0xed, 0x48, 0x2d, 0x9f, 0x33, 0x07, 0xff, 0xeb, 0x52, 0xf9, 0x1b, 0xbc, 0xd4, 0x36, 0x7c, 0x9d, 0x52, - 0xf0, 0xd7, 0xc6, 0x49, 0x8e, 0x95, 0x7a, 0x89, 0x63, 0x55, 0xde, 0xe4, 0xe8, 0xdd, 0x76, 0x8b, 0x88, 0x4b, 0x5f, 0xc7, 0x0f, 0xcf, 0xb8, 0xde, 0xe5, 0xa9, 0x68, 0xf0, 0xee, 0xd3, 0x78, 0xbf, - 0xff, 0x4e, 0xe4, 0x4e, 0x5a, 0xd9, 0x97, 0x72, 0x47, 0x77, 0x0a, 0x82, 0xbd, 0xbe, 0xea, 0xe4, 0x5a, 0x24, 0xb8, 0xfa, 0xbe, 0x38, 0xff, 0xf3, 0xcf, 0x7f, 0xb2, 0xbc, 0x4c, 0xad, 0xcb, 0x8f, - 0x15, 0x96, 0x73, 0xb4, 0x02, 0xef, 0xb5, 0x84, 0xfc, 0x9d, 0x96, 0x54, 0xa5, 0x67, 0xb9, 0x93, 0xe2, 0x18, 0x5c, 0xdb, 0x6c, 0xfc, 0xe7, 0xff, 0x90, 0x5f, 0x77, 0xac, 0x4a, 0xcf, 0x7d, 0x6d, - 0xa7, 0xf7, 0xed, 0x8f, 0xeb, 0x32, 0x4a, 0x27, 0x99, 0xd7, 0x5d, 0x0c, 0xa1, 0x07, 0x8f, 0x7c, 0xa9, 0xb4, 0x07, 0x53, 0x9f, 0xef, 0xf7, 0x56, 0x19, 0x54, 0x9f, 0x2c, 0x3c, 0xe8, 0xd2, 0xb1, - 0xf8, 0x55, 0xa6, 0x7d, 0xf8, 0xa8, 0xff, 0xbd, 0x62, 0x7c, 0x30, 0xf5, 0xa5, 0x0b, 0xe8, 0x58, 0x16, 0x7f, 0x54, 0x8c, 0xef, 0x85, 0xe0, 0x27, 0x6e, 0xff, 0xe7, 0x11, 0xc7, 0x4b, 0x4b, 0xc6, - 0x38, 0x1c, 0x29, 0x60, 0xb9, 0x33, 0x80, 0x93, 0x2a, 0x75, 0x47, 0xbe, 0x16, 0x4e, 0x03, 0xd3, 0x9c, 0x9d, 0x30, 0xdf, 0x44, 0x1c, 0xad, 0xb9, 0x67, 0x60, 0xbe, 0x5b, 0xc8, 0x5c, 0x13, 0x29, - 0x0a, 0xb0, 0x5d, 0x09, 0x2b, 0xde, 0x41, 0xc4, 0x15, 0x73, 0x48, 0xec, 0xf0, 0xb8, 0xe8, 0xd4, 0x1a, 0xc4, 0xc0, 0x4c, 0x30, 0xcf, 0xb3, 0xb5, 0x01, 0x77, 0xa8, 0xe2, 0xed, 0xa5, 0x35, 0x95, - 0x3e, 0x5f, 0x7f, 0xec, 0xad, 0xf6, 0xdb, 0xfd, 0x55, 0xe1, 0x19, 0xaf, 0xd0, 0x95, 0xe4, 0x45, 0x10, 0xbc, 0x1c, 0x4c, 0xe0, 0x71, 0x9e, 0x21, 0xea, 0x44, 0xea, 0xb3, 0x60, 0xb3, 0xda, 0x63, - 0x2b, 0xaa, 0x76, 0x7c, 0x7d, 0xdb, 0x53, 0x01, 0x44, 0x8b, 0x8e, 0xdc, 0x99, 0xae, 0xdd, 0xcd, 0x67, 0xa7, 0xd0, 0x03, 0xf7, 0xe6, 0x31, 0x5f, 0x0e, 0x71, 0x06, 0xa2, 0xea, 0x82, 0xeb, 0x6a, - 0x69, 0x6a, 0xd4, 0x87, 0xc5, 0x99, 0x41, 0x25, 0xaa, 0xde, 0x0e, 0x85, 0x33, 0x4c, 0xa7, 0x5c, 0xd0, 0x02, 0x5b, 0x64, 0x8b, 0xf7, 0x10, 0x64, 0xae, 0xa4, 0x47, 0xf9, 0x43, 0x5f, 0x20, 0xa8, - 0xc3, 0xdc, 0x7d, 0xec, 0x21, 0x78, 0x26, 0x35, 0xe5, 0x46, 0xf3, 0x02, 0xc2, 0xe5, 0x68, 0x6c, 0x1a, 0x4a, 0xe4, 0x24, 0x0c, 0xef, 0x89, 0x27, 0x31, 0x25, 0xa8, 0x61, 0x5e, 0x67, 0x26, 0xe4, - 0x01, 0xf0, 0x1a, 0xe9, 0xb5, 0xa5, 0xdb, 0x0e, 0x62, 0x6e, 0x35, 0x82, 0x86, 0xed, 0x59, 0x06, 0xd5, 0x5b, 0x1e, 0x6c, 0xb7, 0xf3, 0xc8, 0x9b, 0x93, 0x27, 0x5f, 0x49, 0x3a, 0xcd, 0xd4, 0x00, - 0x8e, 0xa1, 0xb7, 0xb4, 0xbd, 0x3d, 0x2c, 0x77, 0x34, 0xd4, 0x24, 0xe7, 0x5c, 0xcb, 0xa7, 0x3c, 0x82, 0x56, 0xfa, 0x28, 0x8f, 0xfb, 0xa7, 0x6e, 0xde, 0x8f, 0x76, 0xc9, 0xfe, 0xde, 0x55, 0xf2, - 0x4e, 0xf6, 0x05, 0x8b, 0xb7, 0x93, 0xcb, 0x3e, 0xd9, 0x08, 0xe7, 0x48, 0xa1, 0xa4, 0x43, 0x07, 0x1e, 0x34, 0xa7, 0x3b, 0x2c, 0x0a, 0x8e, 0xb6, 0x96, 0xf4, 0x09, 0x84, 0x0e, 0x52, 0xb7, 0x16, - 0xfb, 0x20, 0x9e, 0xa9, 0x2b, 0xaa, 0x87, 0xac, 0x1c, 0xea, 0xdc, 0x53, 0x51, 0x96, 0x03, 0x67, 0x61, 0x46, 0x76, 0x5e, 0x3b, 0x03, 0xe9, 0xcb, 0x8a, 0x59, 0x52, 0x6d, 0x1e, 0x52, 0x3a, 0x0c, - 0x1d, 0x17, 0x21, 0xc3, 0xda, 0xa2, 0xc3, 0xeb, 0x47, 0xbc, 0xe3, 0x83, 0xfd, 0x93, 0xad, 0x5f, 0xec, 0xd2, 0x72, 0x3e, 0x08, 0xb6, 0x2f, 0xbd, 0xed, 0xbe, 0xb6, 0x3a, 0xff, 0x2b, 0xa1, 0xf5, - 0xf1, 0xcf, 0x1f, 0x09, 0x2d, 0xe4, 0x4b, 0xef, 0xf6, 0xf1, 0x9f, 0xe0, 0x8d, 0x3a, 0x38, 0x79, 0x3f, 0xbe, 0x74, 0x98, 0x44, 0xc7, 0x89, 0x2c, 0xa1, 0x98, 0xad, 0x63, 0xbf, 0x73, 0xa6, 0x9c, - 0x66, 0xd3, 0x5b, 0x2f, 0x0a, 0xd4, 0x0a, 0x49, 0xd9, 0xd5, 0x70, 0xd0, 0xb6, 0x03, 0xd3, 0x6c, 0x91, 0x7c, 0xeb, 0x30, 0x34, 0x45, 0xf3, 0x1e, 0xa5, 0xd4, 0x1e, 0x04, 0x18, 0x1a, 0x13, 0x77, - 0xf0, 0x4a, 0xf7, 0x5c, 0x2e, 0x6c, 0x54, 0x61, 0x7b, 0xe4, 0xe3, 0x9d, 0x31, 0x6c, 0x44, 0x34, 0x2b, 0xa6, 0x74, 0xd2, 0xa8, 0xe1, 0xc2, 0x98, 0x09, 0x6e, 0xf0, 0xbc, 0xc8, 0x8a, 0xd2, 0xc7, - 0xfb, 0xd1, 0xcf, 0x34, 0xe2, 0x7a, 0x21, 0x78, 0xe1, 0xce, 0xd4, 0x9b, 0x20, 0xe3, 0x5a, 0x6f, 0x69, 0xbb, 0xed, 0x71, 0xe3, 0xcd, 0x54, 0x14, 0x2e, 0xa5, 0x4d, 0x64, 0x95, 0x15, 0x2b, 0x2e, - 0x79, 0x53, 0x58, 0x2f, 0x82, 0x56, 0x70, 0xc0, 0x75, 0x19, 0xe7, 0x3e, 0x93, 0xb1, 0x89, 0x54, 0xd7, 0x3e, 0x6e, 0xc5, 0x4a, 0x7b, 0x8a, 0x14, 0x86, 0x92, 0x2b, 0x2f, 0xb3, 0x9d, 0x3c, 0x77, - 0x6a, 0x81, 0x70, 0x09, 0xb5, 0x22, 0xac, 0x93, 0x79, 0x60, 0x19, 0xe0, 0x60, 0x1f, 0x85, 0x3a, 0x8c, 0x46, 0xa5, 0x16, 0x5c, 0x5e, 0xd2, 0x7d, 0x14, 0xfa, 0x0e, 0xff, 0xc1, 0x9f, 0x31, 0x15, - 0x6f, 0x44, 0x5f, 0x31, 0x70, 0xed, 0xc9, 0x95, 0xd0, 0xef, 0x38, 0x54, 0x5b, 0x0d, 0x6b, 0x74, 0xd2, 0x35, 0x92, 0xb6, 0xde, 0xaf, 0xce, 0x5d, 0x77, 0xe6, 0x39, 0x68, 0xdb, 0x44, 0xa1, 0x2e, - 0x46, 0x33, 0x52, 0xed, 0x19, 0x5b, 0xc6, 0x77, 0xfb, 0x33, 0x37, 0x65, 0xe9, 0x54, 0x33, 0x5a, 0x29, 0x28, 0x73, 0x59, 0xea, 0x0c, 0x59, 0x96, 0x84, 0xed, 0x8a, 0x9a, 0x2e, 0xed, 0x19, 0x00, - 0xcf, 0x54, 0x3d, 0x91, 0x72, 0x01, 0xd6, 0xa6, 0x48, 0xa6, 0xa1, 0x81, 0xd1, 0x8e, 0xc6, 0xe1, 0xb5, 0x57, 0xcb, 0x7d, 0x56, 0x80, 0xff, 0xa0, 0x7f, 0x1f, 0x1f, 0xfa, 0x4e, 0xf7, 0x15, 0x8d, - 0xcb, 0xc9, 0xe4, 0x4a, 0xee, 0x77, 0x40, 0x4c, 0xce, 0x00, 0xec, 0x6d, 0x8a, 0x0f, 0xaa, 0x3a, 0x07, 0x8c, 0x62, 0x5a, 0x32, 0x1a, 0x9d, 0x09, 0x90, 0x16, 0x2c, 0xa7, 0xc6, 0x56, 0x85, 0xe4, - 0x5a, 0x85, 0x45, 0x73, 0x3f, 0x6f, 0xb1, 0x0a, 0x00, 0x54, 0xf1, 0xe8, 0x04, 0xba, 0xa5, 0x42, 0x01, 0x01, 0x60, 0x0a, 0xd2, 0x2c, 0xb1, 0x4d, 0x2c, 0xc7, 0x43, 0x5f, 0xf1, 0x2c, 0x3c, 0x9c, - 0x9b, 0xfd, 0x1a, 0x87, 0xc2, 0xc1, 0xf2, 0x0e, 0xd1, 0x73, 0xa9, 0x5c, 0xef, 0xac, 0xf2, 0xca, 0x17, 0x0f, 0xa6, 0x53, 0x36, 0xb9, 0x56, 0x33, 0x79, 0xc8, 0x54, 0xcf, 0x6c, 0x11, 0xbe, 0x93, - 0xbd, 0x00, 0xf9, 0x7a, 0x32, 0x66, 0xb3, 0xef, 0x05, 0xc7, 0x25, 0x1d, 0x77, 0x9b, 0x0c, 0x22, 0x77, 0x3d, 0xb8, 0xec, 0xa4, 0x18, 0x1d, 0xf4, 0xa3, 0x1e, 0x1d, 0x91, 0x95, 0xda, 0x06, 0x85, - 0xd5, 0x1f, 0x39, 0x73, 0x16, 0x05, 0x6b, 0x42, 0x39, 0x13, 0x22, 0xbd, 0xb6, 0x37, 0x7d, 0xd7, 0x69, 0xbb, 0x4d, 0x7d, 0x9e, 0xa9, 0x00, 0x99, 0xe8, 0x39, 0xb7, 0x5e, 0xbb, 0xa8, 0x84, 0x2e, - 0x0f, 0xdd, 0xaa, 0x6b, 0x9b, 0x26, 0xab, 0x28, 0x8d, 0x05, 0x79, 0x8f, 0x19, 0xc7, 0x58, 0xef, 0xb5, 0xcd, 0xef, 0xa1, 0xf1, 0x5c, 0x27, 0xe8, 0x37, 0xaa, 0x57, 0x30, 0xae, 0xc7, 0x63, 0xbb, - 0x40, 0xaf, 0xc8, 0x82, 0x40, 0x43, 0x25, 0x7a, 0x11, 0xab, 0x22, 0x37, 0xeb, 0x3a, 0x78, 0x4f, 0x46, 0x28, 0x09, 0xb0, 0xfd, 0xb2, 0x94, 0xf6, 0x12, 0x7e, 0x90, 0x65, 0x66, 0x30, 0x51, 0x5d, - 0x72, 0xd6, 0xd0, 0x56, 0xec, 0xed, 0xae, 0xf0, 0x53, 0x1d, 0x14, 0x21, 0x7c, 0x98, 0x33, 0x43, 0x27, 0xd3, 0xda, 0xae, 0x9f, 0x39, 0x07, 0xa2, 0x46, 0x35, 0x09, 0x10, 0x70, 0xeb, 0xc4, 0xca, - 0xd2, 0x92, 0x7f, 0x8e, 0xa7, 0x2e, 0x8b, 0xe0, 0xc4, 0x3b, 0x17, 0x56, 0xf6, 0x0a, 0xc8, 0xc5, 0x76, 0x21, 0x1f, 0xf2, 0xd6, 0xab, 0x31, 0xf5, 0xc8, 0xb1, 0xf5, 0x84, 0xd7, 0xe1, 0x46, 0xf4, - 0x15, 0xca, 0x17, 0x0b, 0xe8, 0x42, 0x69, 0x04, 0x92, 0x55, 0x9c, 0x1d, 0x31, 0xbb, 0x43, 0x8d, 0xd5, 0xc9, 0x18, 0x6c, 0xb7, 0x67, 0x23, 0xb1, 0xda, 0xee, 0xf9, 0xad, 0x2f, 0x01, 0x80, 0xb6, - 0x58, 0x90, 0x18, 0x3d, 0x3d, 0x57, 0x44, 0xe1, 0x4d, 0x1b, 0xfc, 0x10, 0x60, 0x59, 0xe9, 0x65, 0x16, 0x21, 0xe9, 0x67, 0xc9, 0x38, 0x97, 0xb2, 0x7a, 0xea, 0x3a, 0x68, 0x95, 0x76, 0x35, 0xa0, - 0x78, 0x3e, 0x55, 0x06, 0x41, 0x93, 0x1e, 0xd5, 0xf5, 0xf0, 0xa8, 0xea, 0xf8, 0x5d, 0x20, 0x3e, 0x98, 0x6a, 0xff, 0x9e, 0x6b, 0xf5, 0x2b, 0xf1, 0x8f, 0xc0, 0xdc, 0x2e, 0x8d, 0x75, 0xb2, 0xca, - 0x58, 0x49, 0x05, 0xa1, 0x4b, 0x41, 0x7d, 0x28, 0x81, 0x50, 0x0c, 0x4b, 0x28, 0x8b, 0xb0, 0x71, 0xe7, 0x1d, 0x50, 0x3f, 0xe2, 0x03, 0xda, 0x71, 0xa5, 0x2e, 0x5e, 0xb9, 0xc8, 0x8a, 0x24, 0x64, - 0x18, 0xc5, 0x1d, 0x40, 0xe4, 0xce, 0x8b, 0xe9, 0xc9, 0x35, 0x04, 0x19, 0xde, 0x09, 0x6c, 0x33, 0xf7, 0x83, 0xbd, 0xcd, 0x68, 0x03, 0xeb, 0xb7, 0x46, 0xbc, 0xd5, 0x66, 0x9e, 0x18, 0x9c, 0x44, - 0xf8, 0xb9, 0xd8, 0x6b, 0xab, 0x2c, 0x3f, 0x36, 0x92, 0xfd, 0x5c, 0xcd, 0xfa, 0x73, 0xbe, 0xc4, 0x1d, 0xfb, 0xf9, 0x7d, 0xc7, 0xff, 0x5a, 0x56, 0xef, 0x41, 0x94, 0x7c, 0xfa, 0xe3, 0xf2, 0xf1, - 0xf7, 0x5f, 0xe2, 0x82, 0xfd, 0x6d, 0xb5, 0xf8, 0x1d, 0x6d, 0x62, 0x9e, 0x0c, 0x8d, 0xad, 0xae, 0xcd, 0x05, 0xba, 0x42, 0x2c, 0x50, 0xd4, 0xa7, 0x4c, 0xe2, 0xcd, 0xc2, 0x78, 0x38, 0xe1, 0xf9, - 0x39, 0xe0, 0x7b, 0x6b, 0xaa, 0xd1, 0xbd, 0x71, 0x68, 0x9d, 0x75, 0xd5, 0xe6, 0xba, 0xc5, 0xaf, 0x4e, 0x60, 0x85, 0x9f, 0x0f, 0x4b, 0x02, 0x3c, 0x1c, 0xb6, 0x44, 0x3d, 0x90, 0x0a, 0x7d, 0x66, - 0xa4, 0x9a, 0xcf, 0x76, 0x12, 0x58, 0x1f, 0xea, 0x39, 0xba, 0x57, 0xd4, 0x64, 0x4c, 0x76, 0x53, 0x66, 0xd5, 0x4d, 0x69, 0x25, 0x97, 0x36, 0xd3, 0xd6, 0xc3, 0x1a, 0x7b, 0x9f, 0x3b, 0x70, 0x8d, - 0xc5, 0xe0, 0x0b, 0x6d, 0x70, 0xf2, 0xf5, 0xca, 0xc5, 0x20, 0xfc, 0x75, 0x93, 0x66, 0x57, 0x12, 0x20, 0x59, 0xbb, 0x1a, 0xdf, 0x77, 0x59, 0xb9, 0xad, 0x8a, 0xd6, 0x6e, 0x95, 0xc3, 0x12, 0xb6, - 0x8b, 0xed, 0x88, 0xb6, 0x38, 0x59, 0xee, 0x7a, 0x93, 0xbc, 0x9a, 0x34, 0x75, 0xf4, 0x43, 0x49, 0x57, 0xf4, 0x89, 0x90, 0xfc, 0x4f, 0x94, 0x5f, 0xc6, 0xf6, 0xf1, 0xfc, 0xe2, 0xf8, 0x1c, 0x11, - 0x9a, 0xef, 0xb7, 0xd9, 0x81, 0xae, 0x4d, 0x5b, 0x21, 0xf7, 0xfe, 0x74, 0x81, 0xb3, 0x4c, 0x8f, 0xf6, 0x12, 0x98, 0x4d, 0xd7, 0x7d, 0xac, 0xef, 0x39, 0x62, 0x13, 0x84, 0xb3, 0x13, 0x34, 0xe0, - 0x73, 0xce, 0x17, 0x01, 0xf3, 0x50, 0xac, 0xf7, 0xe2, 0x52, 0x65, 0x5d, 0x3b, 0xf2, 0xcf, 0xf2, 0x51, 0x46, 0x70, 0xcf, 0x2e, 0x61, 0x62, 0x01, 0x89, 0xa4, 0xa7, 0xec, 0x57, 0x51, 0x25, 0x39, - 0x9b, 0x19, 0xbf, 0x40, 0xbf, 0x95, 0x79, 0x7a, 0x79, 0xb5, 0x34, 0x7f, 0x14, 0xf1, 0x71, 0x69, 0x17, 0x4e, 0x3f, 0x35, 0xfe, 0xf4, 0x92, 0x69, 0x7a, 0x3b, 0x9a, 0x5c, 0x09, 0xfd, 0x3e, 0x68, - 0xac, 0x68, 0x61, 0x1f, 0xb1, 0x37, 0x5c, 0x0c, 0xcd, 0xbc, 0x00, 0xdc, 0x84, 0x8b, 0xd3, 0xb9, 0xac, 0x5b, 0xcf, 0x93, 0x71, 0x70, 0x01, 0x6a, 0xba, 0x47, 0x47, 0x12, 0xd1, 0xa8, 0xe6, 0x10, - 0x67, 0x4a, 0xd2, 0xec, 0x18, 0x6c, 0xab, 0xef, 0x7d, 0x6a, 0xba, 0xa7, 0xe9, 0xb5, 0xb6, 0xed, 0x16, 0x2c, 0xea, 0x89, 0x4b, 0x86, 0x1c, 0xb4, 0x79, 0xbe, 0x25, 0x49, 0xa3, 0x59, 0x92, 0xa1, - 0xe4, 0x40, 0xcf, 0x89, 0x16, 0x27, 0xcc, 0x8f, 0x91, 0x6b, 0xbd, 0x37, 0x6f, 0xff, 0xe2, 0xbf, 0xb3, 0x9b, 0xe0, 0x76, 0x0b, 0xf9, 0x1c, 0x05, 0x78, 0xaf, 0x1e, 0xe3, 0x1d, 0xf1, 0xf4, 0x4b, - 0x7f, 0x94, 0xa2, 0xaa, 0x4b, 0xcf, 0xfb, 0x53, 0x7a, 0x69, 0xff, 0x26, 0xbc, 0x3e, 0x35, 0x22, 0xfc, 0xd0, 0x8a, 0x1c, 0xff, 0x43, 0x7e, 0xa6, 0x5d, 0x45, 0x69, 0x91, 0x78, 0x93, 0xa6, 0xb8, - 0xe4, 0xc5, 0x67, 0x79, 0x1d, 0xf9, 0xd1, 0xed, 0xd9, 0x6f, 0x41, 0x8b, 0xb7, 0x1d, 0xa8, 0x6a, 0xe2, 0xe4, 0x49, 0xfe, 0x4a, 0xef, 0x4b, 0xfc, 0x45, 0x9d, 0x37, 0x6f, 0xef, 0xf9, 0x45, 0x86, - 0x36, 0x99, 0xeb, 0xf9, 0x95, 0xe5, 0xbf, 0x36, 0x4c, 0x87, 0xfe, 0xe0, 0x7f, 0x63, 0xd5, 0xde, 0x29, 0x2f, 0xfd, 0xff, 0x67, 0xef, 0x3d, 0x9a, 0x54, 0x47, 0xa2, 0x7f, 0xc1, 0xfd, 0xfb, 0x14, - 0x1d, 0xbd, 0x55, 0xd0, 0xf2, 0x86, 0x59, 0x3d, 0x81, 0x90, 0x00, 0x49, 0x48, 0x08, 0x84, 0xcc, 0xe2, 0x1f, 0x21, 0x8b, 0xbc, 0xb7, 0xc4, 0x9b, 0xfe, 0xec, 0x13, 0x40, 0x55, 0xdd, 0x72, 0xdc, - 0xd2, 0x65, 0x7a, 0x76, 0xb3, 0xe8, 0x2e, 0xb9, 0x7b, 0x44, 0xfe, 0x32, 0x95, 0x79, 0xf2, 0x98, 0xdf, 0xf9, 0xeb, 0xaf, 0xcf, 0xca, 0xd4, 0x47, 0x0b, 0xe1, 0xf4, 0x71, 0xf8, 0x1d, 0xcd, 0xf4, - 0xd7, 0xb4, 0xf0, 0xbf, 0xbe, 0x9f, 0x5b, 0x1a, 0x57, 0x51, 0xd1, 0x25, 0x67, 0x56, 0xe1, 0x56, 0x4b, 0xfd, 0x1d, 0xe7, 0x27, 0xf9, 0x9a, 0x22, 0x93, 0x53, 0xdb, 0x41, 0x13, 0x36, 0xa5, 0xdf, - 0x75, 0xd4, 0xa3, 0x06, 0x7e, 0xee, 0xbe, 0xe9, 0x0d, 0xbc, 0x8b, 0x06, 0x67, 0x2f, 0x07, 0xb3, 0x9b, 0xa4, 0x9f, 0x1b, 0x77, 0xdb, 0x94, 0x59, 0xad, 0xc5, 0xf8, 0xa0, 0x6c, 0xba, 0xa7, 0x73, - 0x25, 0x1c, 0x77, 0xc6, 0x5a, 0x69, 0x0a, 0xdd, 0x82, 0x43, 0x25, 0xe4, 0x1d, 0xcb, 0xb3, 0x43, 0x7e, 0x0f, 0x2f, 0xb6, 0x6e, 0xb1, 0x4f, 0xb4, 0x35, 0x92, 0x2c, 0x3b, 0x6f, 0xd8, 0xbb, 0x3a, - 0x8e, 0xd7, 0x99, 0xcc, 0x8e, 0x3c, 0xb9, 0xbf, 0x14, 0xad, 0x5b, 0xda, 0xcb, 0x0d, 0x54, 0xea, 0xac, 0x2f, 0x59, 0xf5, 0xda, 0x1d, 0x77, 0x0c, 0x37, 0xa9, 0xde, 0xc7, 0xef, 0xc6, 0xde, 0x63, - 0x88, 0xf0, 0x27, 0xc7, 0xc0, 0xc7, 0x57, 0x5c, 0xa1, 0xfa, 0x70, 0x61, 0x86, 0x7f, 0x09, 0x06, 0xf8, 0xeb, 0x11, 0x64, 0xfb, 0xe8, 0x14, 0xf5, 0xae, 0xbe, 0x69, 0x30, 0x88, 0x12, 0x37, 0x21, - 0x5d, 0x2e, 0x75, 0x2c, 0x57, 0xf9, 0xfa, 0xac, 0x22, 0xab, 0x92, 0xe6, 0x2e, 0x35, 0x22, 0x17, 0x71, 0x8a, 0x59, 0x7b, 0xc3, 0x8e, 0x52, 0xc0, 0x5c, 0x69, 0x2b, 0x47, 0xc3, 0x0e, 0x3e, 0xbb, - 0x3b, 0x56, 0x58, 0x2b, 0xee, 0xcc, 0xd4, 0x82, 0xbc, 0x11, 0xf3, 0xf1, 0xe4, 0x2c, 0x54, 0xf1, 0x02, 0xb2, 0x74, 0x68, 0x2f, 0xe6, 0xbf, 0xb1, 0xca, 0x7e, 0x6a, 0xee, 0x37, 0x93, 0xd4, 0x5f, - 0x9f, 0x3e, 0xa1, 0x4f, 0x05, 0x38, 0xfe, 0x7a, 0x67, 0x1e, 0x79, 0x64, 0x28, 0xc9, 0xf2, 0xe2, 0xb7, 0x7b, 0xba, 0x27, 0xd6, 0xf6, 0xbc, 0x68, 0x6e, 0x53, 0x7f, 0xd1, 0x4c, 0xe2, 0x14, 0x80, - 0x67, 0xb6, 0x0b, 0x05, 0xdd, 0x21, 0x1f, 0xf6, 0x7a, 0x7b, 0x70, 0x32, 0xf4, 0x14, 0xf8, 0x61, 0x4a, 0xa1, 0xc6, 0x86, 0x00, 0xb0, 0x67, 0x66, 0x6e, 0xcb, 0xb6, 0xab, 0xdb, 0xb3, 0x8f, 0x18, - 0x1d, 0x1f, 0xba, 0x3b, 0xbe, 0xdf, 0xcb, 0x3d, 0x13, 0xf8, 0xf9, 0xfd, 0x2b, 0x6e, 0xb0, 0x7c, 0x77, 0xe3, 0x36, 0x2d, 0x4d, 0x50, 0x06, 0x0b, 0x44, 0x83, 0xeb, 0x73, 0x19, 0x46, 0xe8, 0x45, - 0x14, 0x47, 0x65, 0x09, 0x11, 0x24, 0x73, 0x86, 0x09, 0xdb, 0xbf, 0x9c, 0xd6, 0x40, 0x4f, 0x06, 0xa3, 0x77, 0x4e, 0x8b, 0x4d, 0x67, 0x62, 0xdb, 0x5d, 0x54, 0x36, 0x9c, 0x74, 0xa2, 0x37, 0x9d, - 0x90, 0x46, 0x8b, 0x01, 0x1d, 0x65, 0xd2, 0x38, 0x7a, 0xf3, 0x8e, 0xdf, 0x9e, 0xe3, 0x7c, 0x27, 0xc9, 0x51, 0xbf, 0xe7, 0xf2, 0x33, 0x93, 0x8b, 0x3a, 0xfb, 0xdc, 0xfa, 0xf8, 0x95, 0xc5, 0xfb, - 0xd5, 0x1f, 0xff, 0x7e, 0x2d, 0xfc, 0x4c, 0xac, 0x73, 0x5d, 0x22, 0xf0, 0xcf, 0x71, 0x7b, 0x6f, 0x0b, 0x19, 0xf9, 0x0f, 0xfa, 0x71, 0x15, 0xec, 0xac, 0x24, 0xbc, 0xaf, 0x61, 0x45, 0xfa, 0x06, - 0x58, 0x12, 0x3a, 0x5e, 0xf6, 0x12, 0x83, 0x8f, 0x3e, 0x8e, 0x00, 0x78, 0x8f, 0xf4, 0xc3, 0xe8, 0xb5, 0xe7, 0xd8, 0x48, 0x3e, 0x8a, 0xfe, 0xd4, 0xab, 0x4d, 0x30, 0x95, 0x7b, 0x84, 0xf0, 0xcc, - 0x1a, 0x17, 0x6a, 0x54, 0x6b, 0x96, 0x61, 0xbd, 0xd6, 0x8a, 0xf9, 0x01, 0xe1, 0xd4, 0x91, 0x72, 0xcb, 0xb8, 0xe0, 0x42, 0x6c, 0x71, 0x3a, 0x5c, 0x50, 0xce, 0x2a, 0xc3, 0x15, 0xe1, 0x5d, 0x5a, - 0x1b, 0xc2, 0x61, 0x64, 0x75, 0xb8, 0x34, 0xba, 0xda, 0xab, 0x0b, 0x62, 0x49, 0x6c, 0x78, 0x7b, 0x1f, 0x1b, 0x88, 0x9c, 0xd9, 0x60, 0xca, 0x60, 0x9a, 0x91, 0x47, 0x4b, 0xa5, 0x77, 0x7a, 0x61, - 0x8a, 0x6a, 0xff, 0x92, 0x32, 0x1f, 0x66, 0x75, 0xf1, 0xbb, 0x54, 0x7d, 0xf2, 0x09, 0x68, 0x3e, 0x8a, 0x06, 0x67, 0x9f, 0x2e, 0xcc, 0x6e, 0x52, 0x7f, 0x86, 0xc6, 0x22, 0x8b, 0xd5, 0xda, 0x0d, - 0xe0, 0x81, 0xdf, 0xd0, 0xe7, 0xe3, 0x78, 0x50, 0xb9, 0xb3, 0x20, 0x0e, 0xe0, 0xd0, 0x33, 0x66, 0x1d, 0xef, 0x60, 0xd5, 0x25, 0xbc, 0xb3, 0x61, 0xec, 0xd0, 0x95, 0xab, 0x68, 0x98, 0x29, 0xca, - 0xbb, 0x15, 0xa3, 0x1e, 0x59, 0x20, 0xe8, 0x47, 0x44, 0x50, 0x97, 0xc0, 0x22, 0x01, 0x0e, 0xa3, 0xa0, 0xd3, 0xbb, 0xac, 0xbf, 0x80, 0xd1, 0x18, 0x80, 0x65, 0xdb, 0xf0, 0xea, 0x14, 0x17, 0xc7, - 0xeb, 0xcf, 0xfd, 0x9d, 0xab, 0xe7, 0xcf, 0xa7, 0x83, 0x37, 0xa9, 0xef, 0x00, 0xa9, 0xa7, 0x16, 0xc8, 0x6c, 0xbc, 0xb1, 0x14, 0x3a, 0x56, 0xbb, 0x08, 0x71, 0x89, 0x2f, 0xe6, 0x71, 0x48, 0xb1, - 0x27, 0x8d, 0x9e, 0x43, 0x88, 0xba, 0x52, 0x90, 0x32, 0x1e, 0x52, 0x97, 0xc6, 0x32, 0xc1, 0x07, 0xfa, 0x48, 0x12, 0x68, 0xed, 0x3c, 0x5c, 0x96, 0x9a, 0xb9, 0x5b, 0x0e, 0x05, 0x53, 0xce, 0xc5, - 0x6e, 0x45, 0x89, 0x69, 0xa0, 0xed, 0x2a, 0x60, 0x43, 0xf5, 0xe8, 0x62, 0x87, 0xcd, 0x4f, 0x03, 0x4a, 0x18, 0x84, 0xfe, 0x9c, 0x7f, 0xc3, 0xf5, 0xfc, 0x30, 0xf3, 0x66, 0x45, 0x95, 0x17, 0x5e, - 0xd5, 0x84, 0xde, 0x2f, 0xc7, 0xf4, 0x87, 0x74, 0x46, 0xef, 0x56, 0xbd, 0xaf, 0xa9, 0x2c, 0xe7, 0x55, 0xf9, 0x85, 0xa9, 0x7f, 0xa0, 0x59, 0xe6, 0x0d, 0xcd, 0xa3, 0xaf, 0xf5, 0x05, 0x95, 0x17, - 0x67, 0xf7, 0x23, 0xe4, 0xff, 0xdc, 0xc4, 0xf8, 0x4e, 0xee, 0x2f, 0xec, 0xaf, 0x67, 0x53, 0x2b, 0xd4, 0xee, 0x5a, 0x7a, 0x75, 0x50, 0x25, 0x55, 0xac, 0x92, 0x8d, 0x2e, 0xf9, 0x6b, 0xfe, 0xc2, - 0x10, 0x76, 0x21, 0xb7, 0x68, 0x63, 0x34, 0xe8, 0xd0, 0x45, 0x3b, 0x57, 0xd9, 0xec, 0x01, 0xd6, 0x3b, 0x42, 0xc9, 0xce, 0xc6, 0x78, 0x4a, 0x53, 0x48, 0x68, 0x69, 0x31, 0x43, 0xd0, 0xee, 0xce, - 0xed, 0x01, 0xd1, 0x39, 0x80, 0x8b, 0xe2, 0x51, 0xec, 0xa5, 0x4b, 0xbd, 0xc3, 0xcd, 0xb8, 0xd9, 0xa4, 0x7e, 0xf0, 0x07, 0x1f, 0xe9, 0x3f, 0x56, 0x5d, 0x87, 0xe7, 0x47, 0x1b, 0x34, 0xec, 0x29, - 0x43, 0xe3, 0x07, 0xc9, 0x6f, 0xa8, 0xbc, 0x9c, 0xdf, 0xac, 0x40, 0x13, 0x0c, 0x8e, 0xe1, 0x70, 0x44, 0x04, 0xfc, 0xb8, 0xd6, 0x6b, 0xba, 0x18, 0x43, 0x55, 0x36, 0xf8, 0x54, 0x03, 0x90, 0xd5, - 0xba, 0xd0, 0x75, 0x0f, 0xdf, 0x84, 0xa8, 0x08, 0xf8, 0x98, 0x07, 0x58, 0x5b, 0x96, 0x5e, 0x5b, 0x39, 0x6e, 0xa5, 0xac, 0xa2, 0x11, 0x5b, 0x48, 0x92, 0x08, 0x07, 0x14, 0x54, 0x6a, 0xe1, 0x61, - 0x64, 0xdb, 0x2c, 0x07, 0x84, 0x13, 0xa8, 0x79, 0x30, 0x70, 0x0b, 0x42, 0x3f, 0xa4, 0x7c, 0xfb, 0x5c, 0x54, 0xc6, 0xd7, 0x34, 0xc5, 0x4f, 0xb1, 0x14, 0x93, 0x06, 0xed, 0xf7, 0x39, 0xd3, 0xef, - 0x1e, 0xf8, 0x38, 0x44, 0xff, 0xfe, 0x5d, 0x1d, 0xa1, 0x3c, 0x9b, 0x79, 0x43, 0xd8, 0xcc, 0x12, 0xcf, 0x8a, 0x67, 0xfe, 0xe3, 0x42, 0xc3, 0xcf, 0x91, 0x46, 0x7e, 0x91, 0x7e, 0xed, 0xc3, 0xcf, - 0xd7, 0xa6, 0x52, 0x47, 0x9e, 0xda, 0xa5, 0x65, 0x9a, 0x74, 0xa4, 0x78, 0x26, 0xda, 0xa9, 0xfd, 0x59, 0x5a, 0x50, 0xc2, 0x40, 0xe7, 0xf5, 0xa6, 0xad, 0x98, 0x90, 0xd6, 0xa0, 0x1a, 0x46, 0xab, - 0x0d, 0x6c, 0xf4, 0xa9, 0x25, 0x03, 0x40, 0xd4, 0x39, 0x83, 0x4c, 0x92, 0xb4, 0x96, 0xef, 0x3b, 0x2f, 0x33, 0x3d, 0xbb, 0x58, 0xd2, 0x48, 0x4a, 0x69, 0x4b, 0x18, 0x5c, 0xe5, 0xb5, 0x6c, 0xc8, - 0x62, 0x94, 0x29, 0x74, 0x01, 0x7e, 0x61, 0xd8, 0x7b, 0xe1, 0xdf, 0xfe, 0xef, 0x2c, 0x48, 0x57, 0x81, 0xb7, 0x66, 0x3b, 0x13, 0x6d, 0x45, 0x1a, 0x53, 0x5b, 0x05, 0xaa, 0x69, 0x6b, 0xb5, 0x56, - 0xa4, 0x9a, 0x9d, 0x67, 0xec, 0x92, 0x20, 0x71, 0x54, 0xb7, 0xe6, 0xdf, 0xe7, 0x06, 0xfd, 0x30, 0xe6, 0x7e, 0xa4, 0x0d, 0x7f, 0x29, 0xca, 0xdd, 0x3c, 0x0c, 0xa7, 0x83, 0x9e, 0xca, 0xf4, 0xf8, - 0x25, 0xf6, 0xda, 0xfa, 0xb7, 0x93, 0x19, 0x34, 0x2d, 0xbb, 0x83, 0xc4, 0x94, 0xc4, 0xc0, 0xd9, 0x65, 0x16, 0x94, 0x58, 0xa4, 0x0c, 0x27, 0x55, 0xe6, 0x19, 0x4b, 0xe9, 0xab, 0xd3, 0x4e, 0x17, - 0xcb, 0x9a, 0xab, 0x43, 0x8d, 0xa0, 0xb7, 0x3d, 0xa6, 0xf3, 0x54, 0x90, 0x36, 0x29, 0x0c, 0xf5, 0x4b, 0x68, 0x2c, 0xcc, 0x85, 0xd0, 0xe3, 0x9b, 0x4d, 0x41, 0xe1, 0x3b, 0x53, 0xac, 0xe6, 0x30, - 0x50, 0xba, 0xb0, 0xd2, 0x75, 0xab, 0x5d, 0x7f, 0x26, 0xa3, 0x48, 0x61, 0x9f, 0x73, 0x13, 0xdc, 0x62, 0xb1, 0xc3, 0xfb, 0xa7, 0x04, 0x7d, 0xfe, 0x18, 0x6f, 0x95, 0x0a, 0x13, 0xaf, 0xf3, 0xb2, - 0x3a, 0x68, 0xbc, 0xf0, 0xee, 0x44, 0x40, 0x3e, 0x50, 0xd0, 0xff, 0x4a, 0x56, 0xba, 0xfe, 0x7b, 0xec, 0x93, 0xb3, 0xfd, 0x8f, 0xf2, 0x76, 0xfe, 0x07, 0xfa, 0x30, 0x06, 0xaf, 0xdd, 0x9b, 0x57, - 0xee, 0xec, 0xda, 0xc7, 0x6f, 0xff, 0xfc, 0x81, 0x71, 0x38, 0xef, 0xbc, 0x2a, 0xc9, 0x2d, 0xf7, 0x3a, 0xbd, 0x34, 0xbf, 0xad, 0x3b, 0x07, 0x7f, 0x70, 0xce, 0x4f, 0xee, 0xef, 0xaf, 0xf2, 0xaf, - 0x1d, 0xff, 0xf5, 0xea, 0xcd, 0xbd, 0x31, 0x41, 0x9b, 0xb0, 0x49, 0xdd, 0xb4, 0xd3, 0xa0, 0x8d, 0xb2, 0x72, 0x97, 0xf3, 0x90, 0x49, 0xec, 0xe4, 0x0b, 0x0d, 0x66, 0x81, 0xbf, 0xcf, 0x56, 0x10, - 0x65, 0x1e, 0xd7, 0x87, 0xcb, 0x25, 0x3a, 0x8a, 0xbd, 0x77, 0xb6, 0xf1, 0xdd, 0x3c, 0x5f, 0xd0, 0x34, 0x5d, 0x0c, 0xa8, 0x3f, 0x6f, 0x11, 0x05, 0xf4, 0xd1, 0x13, 0x67, 0xd1, 0xcb, 0xe3, 0x3e, - 0x22, 0xf6, 0xdb, 0x8c, 0x53, 0x7d, 0x1d, 0xce, 0xd9, 0xa6, 0x29, 0xfd, 0x09, 0xf9, 0x3d, 0xef, 0x03, 0x98, 0x5f, 0x03, 0xde, 0xbe, 0x45, 0xb4, 0x98, 0x25, 0x61, 0x1a, 0x3e, 0xd2, 0x4a, 0x91, - 0xa7, 0x02, 0x2f, 0x5f, 0x64, 0x82, 0xb3, 0xd7, 0xa3, 0x5b, 0x72, 0xeb, 0x84, 0xd9, 0x11, 0x04, 0x29, 0x2a, 0x65, 0xb5, 0xc3, 0x76, 0xa0, 0x92, 0x61, 0x79, 0xe9, 0x5d, 0x9a, 0x5e, 0x1c, 0xb7, - 0x02, 0x22, 0x8e, 0xda, 0x02, 0x46, 0x00, 0x6f, 0x63, 0x90, 0x22, 0x23, 0x20, 0x87, 0x52, 0x48, 0xe9, 0xd8, 0xe3, 0xd5, 0x79, 0x39, 0x28, 0x9d, 0xd6, 0x1e, 0xc6, 0x63, 0x94, 0xa2, 0xac, 0x9a, - 0x16, 0x8b, 0x95, 0xd8, 0xb2, 0xbe, 0x13, 0xd3, 0x9b, 0x72, 0x65, 0x9d, 0x38, 0x95, 0x19, 0x6c, 0xe2, 0xb9, 0xef, 0xa5, 0x98, 0x35, 0xd5, 0xf8, 0xf6, 0x1d, 0x3c, 0x06, 0x2f, 0xff, 0x6d, 0xca, - 0xc1, 0x33, 0xeb, 0xcd, 0xab, 0xd0, 0x3b, 0x7c, 0xf9, 0x4b, 0x92, 0xc1, 0xa4, 0xd5, 0x45, 0x21, 0xe7, 0xa6, 0x09, 0x42, 0x3d, 0x3d, 0xf0, 0x5c, 0x8b, 0xe6, 0x86, 0x98, 0x5c, 0xa8, 0x68, 0x04, - 0x63, 0x3b, 0xa8, 0x77, 0xd5, 0x81, 0x3c, 0xf0, 0x26, 0x29, 0x0f, 0xab, 0xf5, 0xe2, 0xbc, 0xc5, 0x01, 0x16, 0x49, 0x1b, 0x56, 0x43, 0x7c, 0x1e, 0x71, 0xa4, 0x66, 0x11, 0xc0, 0xce, 0xda, 0x88, - 0xf7, 0xb5, 0x7d, 0x61, 0x4f, 0xe4, 0x06, 0x58, 0xe5, 0x0a, 0xef, 0x11, 0x46, 0x03, 0xe5, 0x3c, 0xf9, 0xdc, 0x86, 0xf5, 0xd7, 0xb8, 0xba, 0x47, 0xdf, 0x3c, 0x44, 0xf0, 0x0e, 0xf3, 0xf7, 0x83, - 0xef, 0x99, 0xc8, 0x89, 0x9b, 0xc4, 0x1b, 0x76, 0x4d, 0x35, 0xde, 0x62, 0x6a, 0xa6, 0x00, 0x87, 0x65, 0x32, 0x7d, 0x3a, 0xd2, 0x2a, 0xb4, 0x98, 0x33, 0x28, 0x0e, 0x72, 0x31, 0xda, 0x6e, 0x7d, - 0x90, 0xd4, 0x0d, 0x7b, 0xef, 0x8c, 0x79, 0x70, 0xe0, 0xdd, 0x8e, 0x1e, 0x36, 0xca, 0x61, 0x77, 0x0e, 0xd8, 0x04, 0xf3, 0x48, 0x38, 0x38, 0xe5, 0x5c, 0xb6, 0xd8, 0xed, 0x2f, 0x73, 0x47, 0xb3, - 0xf4, 0x41, 0x42, 0x36, 0x30, 0xc4, 0x1f, 0x97, 0x00, 0x1a, 0x89, 0x6e, 0xd7, 0xe5, 0x7c, 0x4f, 0xb8, 0x53, 0xbc, 0x90, 0x9f, 0x2b, 0xc8, 0x3c, 0xb4, 0x0c, 0xfd, 0x39, 0x0e, 0xef, 0x25, 0x5f, - 0xf1, 0x78, 0x7f, 0x3e, 0xd5, 0xe7, 0xcf, 0xed, 0x91, 0x95, 0xa6, 0x14, 0xfb, 0x13, 0x05, 0xe6, 0x00, 0xdd, 0x53, 0x46, 0xd9, 0xf8, 0xa6, 0x29, 0xfb, 0x3b, 0x45, 0x33, 0x8d, 0xd8, 0x0e, 0xdd, - 0xd5, 0x3c, 0xc6, 0xab, 0x22, 0x01, 0x83, 0x25, 0xda, 0x35, 0xeb, 0xf5, 0xc2, 0xe7, 0x52, 0x64, 0xe3, 0x87, 0x44, 0xa9, 0x9d, 0x00, 0x27, 0x67, 0xb8, 0xb8, 0x52, 0x79, 0x93, 0x1e, 0x56, 0xa8, - 0x90, 0x37, 0x78, 0xec, 0xd4, 0x4a, 0x12, 0x00, 0xcf, 0x6d, 0x86, 0xae, 0x6a, 0x67, 0x1d, 0x36, 0x1f, 0x02, 0x59, 0xbf, 0x1f, 0x52, 0xb7, 0x0c, 0xfb, 0xa8, 0x7e, 0xb8, 0x34, 0xe0, 0xcf, 0x8d, - 0xab, 0x37, 0xb1, 0x77, 0x30, 0x5f, 0x4e, 0x66, 0xf8, 0xb4, 0x11, 0x66, 0x8d, 0x4b, 0xbe, 0x4b, 0xc1, 0x22, 0x58, 0x72, 0x83, 0x14, 0x1b, 0xca, 0x61, 0x29, 0x52, 0x48, 0xc8, 0xf4, 0x4e, 0x43, - 0x81, 0xab, 0x3c, 0x3b, 0xac, 0xce, 0xcb, 0xc3, 0xa0, 0x0d, 0x0c, 0xd9, 0x79, 0x44, 0xb4, 0x3e, 0x9f, 0x6b, 0x36, 0xc1, 0x7c, 0xf3, 0xb4, 0x5f, 0xc8, 0xca, 0xee, 0xbc, 0xcf, 0xf9, 0xb0, 0x3d, - 0x81, 0xb9, 0x1b, 0xb0, 0x15, 0x77, 0xd9, 0xeb, 0x66, 0x6f, 0x87, 0xfe, 0x92, 0x52, 0x9e, 0x43, 0xf2, 0x7f, 0xdb, 0x96, 0xed, 0x25, 0xe0, 0x2d, 0x23, 0xc6, 0xaf, 0xac, 0xf4, 0x6e, 0xdb, 0x21, - 0x3f, 0x2b, 0xf2, 0xf7, 0xc4, 0x81, 0x1b, 0xd9, 0xdb, 0xdf, 0xb7, 0x42, 0x2e, 0x1f, 0x96, 0xf4, 0x9f, 0x68, 0x15, 0xae, 0x5f, 0xfd, 0xa7, 0xda, 0x2f, 0xdf, 0x65, 0x80, 0xde, 0xf5, 0x7a, 0xe2, - 0x51, 0x4f, 0x36, 0xc1, 0x55, 0xcf, 0xae, 0x1f, 0x56, 0x59, 0x78, 0x8e, 0x27, 0xe4, 0x9d, 0xdc, 0x5b, 0x5f, 0xbe, 0x9d, 0x4d, 0xe5, 0x0a, 0xb1, 0xe2, 0xf9, 0x7e, 0xc4, 0xf7, 0x64, 0x64, 0xd8, - 0x88, 0xd6, 0x3b, 0xde, 0x88, 0xb3, 0x45, 0x77, 0x46, 0xf8, 0x9c, 0x76, 0x40, 0x73, 0x13, 0x08, 0x07, 0x41, 0x3a, 0x2c, 0x52, 0x25, 0x1d, 0xcf, 0x72, 0xcd, 0xf5, 0xf1, 0xe9, 0xd4, 0x40, 0xbe, - 0x69, 0x41, 0x65, 0xd5, 0x88, 0x17, 0x20, 0x25, 0x9a, 0xed, 0x91, 0x5e, 0xfb, 0xe6, 0x9e, 0x62, 0xb3, 0x74, 0x81, 0x89, 0x1c, 0x26, 0x68, 0x23, 0x09, 0x4e, 0xb1, 0x97, 0x7c, 0x53, 0xad, 0xff, - 0xbf, 0x9c, 0x31, 0x3e, 0x0a, 0x7f, 0xc5, 0xe6, 0xdd, 0xa5, 0x29, 0xf3, 0x06, 0x3c, 0x63, 0xa1, 0xf6, 0x60, 0xad, 0x77, 0xa7, 0x9d, 0x0c, 0x50, 0x5e, 0x8d, 0x57, 0xf3, 0x63, 0x61, 0x65, 0x41, - 0xe3, 0xe8, 0xf0, 0x84, 0x6c, 0xbe, 0xdb, 0x2b, 0x63, 0xef, 0xd1, 0xa2, 0x80, 0x3e, 0x65, 0x97, 0x78, 0x15, 0xfa, 0xda, 0xa4, 0xd8, 0x1b, 0x6f, 0xa1, 0x3e, 0x13, 0xa6, 0xc0, 0x3c, 0x4a, 0xbd, - 0x1d, 0x54, 0xba, 0xc0, 0x08, 0x45, 0xf5, 0x65, 0xd5, 0xe4, 0x06, 0x46, 0x55, 0x90, 0xec, 0x95, 0xb8, 0xdb, 0x8b, 0xab, 0x78, 0x93, 0x2c, 0xa5, 0x96, 0xd8, 0xe3, 0x3e, 0x06, 0x27, 0x7e, 0x5c, - 0xf7, 0x7a, 0xcb, 0x37, 0x46, 0x15, 0x9c, 0xf3, 0x63, 0x21, 0x64, 0xe3, 0xc6, 0x59, 0xa7, 0x08, 0xa6, 0x06, 0xe5, 0x00, 0xe0, 0xc7, 0x32, 0x45, 0x36, 0xd9, 0xa1, 0x17, 0x82, 0x15, 0x31, 0x6d, - 0x69, 0x68, 0x82, 0xd9, 0x2b, 0xff, 0xc9, 0xa3, 0x5e, 0xfe, 0x73, 0x77, 0xf9, 0x2f, 0xb1, 0xaf, 0x60, 0xdc, 0xbf, 0x62, 0x78, 0x1a, 0x87, 0x9d, 0xc0, 0x6c, 0x2f, 0xf2, 0x69, 0xb5, 0x5a, 0xc9, - 0x0a, 0x30, 0x62, 0xd4, 0x65, 0x8e, 0xd2, 0xd0, 0xca, 0x85, 0x46, 0xdd, 0xa6, 0x0a, 0x7a, 0x31, 0x72, 0x5a, 0x0e, 0xc6, 0xb8, 0x61, 0xb8, 0xc6, 0xb9, 0x30, 0x10, 0x10, 0x59, 0xd5, 0x52, 0x1d, - 0xd7, 0xdb, 0xaa, 0x24, 0x13, 0x69, 0x3d, 0x54, 0x63, 0x75, 0x92, 0x32, 0xd8, 0x8b, 0x38, 0x22, 0xa7, 0x0b, 0xca, 0x0a, 0x3a, 0x69, 0xb3, 0x67, 0xa8, 0x7a, 0xf2, 0xd0, 0xbf, 0x6e, 0x24, 0xfe, - 0xfb, 0xa9, 0xe0, 0x2a, 0xf5, 0x15, 0x8c, 0xdb, 0x56, 0x65, 0xe2, 0x34, 0x70, 0x66, 0x78, 0x9b, 0xb2, 0x4c, 0x91, 0xf1, 0x18, 0xb0, 0x31, 0xb5, 0x7a, 0x2e, 0x13, 0x40, 0x09, 0x6d, 0xe7, 0x62, - 0x1f, 0xbb, 0x09, 0x31, 0x88, 0x27, 0xea, 0x18, 0x65, 0x9c, 0x8c, 0x96, 0xdb, 0xd3, 0x16, 0x22, 0x6c, 0x57, 0x3c, 0xc7, 0xf6, 0x22, 0x11, 0x54, 0x6a, 0xe3, 0xfa, 0x52, 0xbd, 0xa9, 0xd9, 0x0b, - 0xb2, 0xd0, 0xe0, 0x6a, 0x77, 0x3a, 0xa2, 0x7a, 0xbb, 0x5b, 0x25, 0xd4, 0x45, 0xa6, 0xbb, 0x49, 0x58, 0x7c, 0x13, 0x9d, 0xfc, 0x59, 0x73, 0xfa, 0x73, 0x43, 0xd5, 0xe3, 0xa8, 0xe4, 0x09, 0x06, - 0xaa, 0x12, 0x12, 0xc1, 0xb9, 0x67, 0xae, 0x2f, 0x69, 0x05, 0xd1, 0x6d, 0xa2, 0x8f, 0x72, 0xbf, 0xf3, 0xcd, 0xa8, 0xe9, 0x4d, 0x50, 0x59, 0x98, 0x89, 0xbd, 0x43, 0x79, 0x74, 0xb9, 0xaa, 0x4e, - 0x55, 0x8c, 0x43, 0x47, 0x84, 0x3e, 0x18, 0x1b, 0x72, 0x31, 0x7a, 0xd0, 0xaa, 0xf3, 0x62, 0xd6, 0x40, 0x37, 0x32, 0xbc, 0x6b, 0x10, 0x66, 0xdd, 0x42, 0x95, 0x07, 0x9c, 0x10, 0x73, 0xbd, 0x29, - 0xc4, 0xb8, 0xd5, 0xa6, 0x44, 0x07, 0x16, 0x61, 0xf6, 0x88, 0x2b, 0x99, 0x7a, 0xae, 0x86, 0xc0, 0x55, 0xe2, 0x0d, 0x82, 0x2c, 0x9f, 0x51, 0x13, 0xeb, 0x05, 0x98, 0x88, 0xc7, 0x1f, 0xba, 0xa4, - 0x4a, 0x90, 0x6a, 0x4d, 0x15, 0xb8, 0xd7, 0x79, 0x3b, 0x35, 0x3b, 0xba, 0x2e, 0x46, 0x47, 0xdb, 0x98, 0x6a, 0xe8, 0x5a, 0x88, 0xd7, 0x86, 0xb9, 0xe7, 0xb9, 0xb5, 0x8c, 0x69, 0xc7, 0x00, 0xe1, - 0x42, 0xd8, 0x91, 0x0e, 0x52, 0x8d, 0x7a, 0x9a, 0x5c, 0x5a, 0x11, 0x90, 0x85, 0x07, 0xf4, 0x1c, 0x61, 0x6a, 0x9c, 0x57, 0x5e, 0x6e, 0x69, 0x67, 0x16, 0x35, 0x35, 0x63, 0xc2, 0x3e, 0xcf, 0x6a, - 0xf2, 0x34, 0x74, 0x66, 0x75, 0x72, 0x4f, 0xed, 0xfe, 0xc6, 0x1e, 0x77, 0xdb, 0xdb, 0x57, 0x9e, 0xfb, 0x6a, 0x1d, 0xfe, 0x38, 0x81, 0x3e, 0xb0, 0x9e, 0x7d, 0x93, 0xda, 0x74, 0x83, 0xe3, 0xd5, - 0xce, 0x3c, 0x6b, 0x2a, 0x2b, 0xab, 0x8b, 0xbc, 0xba, 0xc9, 0xec, 0xbe, 0xbc, 0xf4, 0xf6, 0x70, 0xdd, 0xb8, 0xb3, 0xda, 0xab, 0xc2, 0x9b, 0xab, 0xe6, 0x45, 0x29, 0x20, 0xbe, 0x3c, 0x39, 0x85, - 0x6c, 0xa2, 0x6c, 0x43, 0x27, 0x9e, 0xf9, 0x79, 0x95, 0x5a, 0xcd, 0xac, 0xcd, 0xbc, 0xda, 0xb1, 0x8a, 0x7b, 0x37, 0xde, 0x9c, 0x60, 0x1f, 0x6c, 0x19, 0x95, 0x67, 0x25, 0xb3, 0x17, 0xb0, 0xfe, - 0xbe, 0x5b, 0x1b, 0x3e, 0x65, 0x7b, 0xd5, 0x96, 0xef, 0x7d, 0xa1, 0xc0, 0x79, 0x53, 0x59, 0x3e, 0x86, 0x76, 0xe4, 0x59, 0xe8, 0xcc, 0xec, 0xfc, 0xa5, 0x76, 0xe3, 0x97, 0x78, 0x8c, 0x26, 0xb8, - 0x25, 0x68, 0xd5, 0x4d, 0xe5, 0x59, 0xe9, 0xdf, 0x3f, 0xed, 0x16, 0x1f, 0x22, 0xf8, 0x68, 0x76, 0x7f, 0x6e, 0xec, 0x7e, 0xf3, 0x8e, 0xd7, 0xe1, 0xfc, 0xf5, 0xce, 0xd4, 0xfa, 0xc5, 0x0e, 0xd9, - 0xe5, 0xb8, 0x54, 0x68, 0x58, 0xbf, 0x39, 0x60, 0x48, 0xa0, 0x9e, 0x9c, 0x23, 0xae, 0xac, 0x6a, 0x81, 0x32, 0x93, 0xa8, 0x56, 0xfd, 0x45, 0x54, 0x9e, 0x40, 0x0f, 0xa9, 0xd9, 0x21, 0x65, 0x57, - 0xac, 0x19, 0x96, 0xb0, 0x2e, 0xa8, 0x05, 0xbe, 0x32, 0x84, 0xa6, 0x65, 0xd6, 0x84, 0xbc, 0x5a, 0x97, 0x73, 0x0d, 0xf6, 0xce, 0x5a, 0xa9, 0xd8, 0x99, 0xa0, 0xca, 0x38, 0xdb, 0x9a, 0xa9, 0x34, - 0x21, 0x9d, 0xf6, 0x8a, 0xef, 0x6b, 0x4f, 0xbd, 0x62, 0x8c, 0x7d, 0x21, 0x23, 0x29, 0x92, 0xb0, 0x41, 0xde, 0xdd, 0x7b, 0x8c, 0xff, 0xd7, 0x41, 0xf9, 0x1d, 0xf8, 0xc4, 0x73, 0x5b, 0x84, 0x6f, - 0x5e, 0xf0, 0x8a, 0xfc, 0xa7, 0xcb, 0x33, 0x62, 0xda, 0xb6, 0x61, 0xa3, 0x9d, 0x0f, 0x17, 0x55, 0xa0, 0x74, 0xb8, 0xc7, 0x16, 0x1b, 0xed, 0xd8, 0xaf, 0x2a, 0xe5, 0xdc, 0x9c, 0x28, 0x79, 0x94, - 0x38, 0x49, 0x0a, 0x09, 0xa8, 0x2d, 0x3b, 0x28, 0xe7, 0xdb, 0x03, 0xe8, 0x4b, 0x34, 0xb5, 0x73, 0x72, 0x50, 0xf2, 0x36, 0x44, 0xb2, 0x68, 0x1d, 0xcc, 0x1d, 0x65, 0x4a, 0x14, 0x7d, 0x97, 0xed, - 0xc7, 0x75, 0x79, 0x14, 0x9d, 0xc5, 0x86, 0x26, 0x33, 0x26, 0x2c, 0x57, 0xe5, 0x97, 0x6a, 0x5e, 0x45, 0xd2, 0x3e, 0xb2, 0x9b, 0x3e, 0xb9, 0xac, 0x26, 0x6d, 0x75, 0x6d, 0x79, 0xd2, 0x56, 0x53, - 0x17, 0x53, 0x4c, 0xe5, 0xbc, 0xbe, 0x32, 0xce, 0x25, 0xc3, 0xf6, 0xf3, 0xee, 0x44, 0x5c, 0x76, 0x27, 0x80, 0x66, 0x52, 0x99, 0x56, 0x69, 0x7f, 0x2b, 0xf3, 0x0d, 0xd7, 0xd9, 0xe0, 0xc9, 0x2d, - 0xf6, 0xf4, 0x80, 0xe0, 0x3a, 0xee, 0xa3, 0x83, 0xee, 0x72, 0xee, 0x28, 0xad, 0x4e, 0x6c, 0x1f, 0x27, 0xd4, 0x3a, 0x01, 0x9b, 0x84, 0x04, 0x06, 0xdb, 0x5b, 0x97, 0x87, 0x95, 0x08, 0x30, 0x38, - 0x78, 0x0c, 0xab, 0x67, 0x49, 0xfb, 0xbf, 0x29, 0x81, 0x77, 0x0f, 0x3d, 0x7b, 0x34, 0xb2, 0xde, 0xdb, 0x3f, 0x1f, 0x59, 0x23, 0x9f, 0xd0, 0x5a, 0xdf, 0xc4, 0x5e, 0xb1, 0x7c, 0x3b, 0x99, 0x5a, - 0x13, 0xba, 0x8b, 0x1d, 0x46, 0xae, 0x14, 0x33, 0x87, 0xf7, 0xa6, 0x60, 0x67, 0xb8, 0x22, 0x70, 0x72, 0x71, 0x06, 0xb5, 0x74, 0xb3, 0x27, 0xf0, 0x32, 0xd7, 0xb4, 0xc0, 0xe1, 0x78, 0x1f, 0xb4, - 0x71, 0xaf, 0x48, 0xe2, 0xd8, 0xaa, 0x74, 0x28, 0x9d, 0x5f, 0xa8, 0xa2, 0x58, 0x5a, 0x0d, 0x96, 0x26, 0x52, 0xa9, 0xd6, 0x5a, 0x31, 0xee, 0x5a, 0xe3, 0x2c, 0xa1, 0x27, 0x65, 0xac, 0x8c, 0xf5, - 0xe1, 0xa2, 0x4f, 0x2a, 0x39, 0x5e, 0x54, 0x5e, 0xd3, 0x84, 0x0f, 0xa9, 0xad, 0x9f, 0x34, 0x2a, 0xbe, 0x08, 0xbd, 0x43, 0x71, 0x3b, 0x9c, 0x6a, 0x56, 0x8c, 0xf5, 0x46, 0xc2, 0x6a, 0x48, 0xb8, - 0x80, 0x8c, 0x06, 0x6e, 0xb6, 0xf3, 0xbd, 0xab, 0x05, 0xb4, 0x4f, 0x82, 0xbb, 0x54, 0xd6, 0xf6, 0x7a, 0xcc, 0x56, 0x60, 0x05, 0x6a, 0xb1, 0x82, 0x76, 0xe3, 0x06, 0x80, 0x3a, 0xca, 0x4a, 0x8f, - 0xcc, 0x10, 0x5a, 0xfb, 0x83, 0x70, 0xa9, 0xa9, 0xdd, 0x22, 0x19, 0x1b, 0x5f, 0xd0, 0x74, 0x90, 0x6c, 0xf7, 0xaa, 0xb8, 0xd1, 0x08, 0x92, 0x1c, 0x05, 0x3e, 0xc1, 0x26, 0xe9, 0x69, 0xaf, 0x3f, - 0x34, 0xb9, 0xfe, 0xac, 0x6a, 0x16, 0x78, 0x49, 0xf1, 0x78, 0xd2, 0x79, 0x72, 0xc6, 0xff, 0xfe, 0x1d, 0xef, 0x61, 0xfa, 0x78, 0x67, 0xea, 0x8c, 0xcf, 0xd9, 0x3c, 0xe2, 0xc8, 0xf3, 0xac, 0xb2, - 0x0e, 0x07, 0x95, 0x9d, 0xef, 0x10, 0xbd, 0x57, 0xfb, 0xd2, 0xbf, 0x24, 0x34, 0x9b, 0x88, 0x3b, 0xc3, 0x48, 0x80, 0x43, 0xb0, 0x02, 0x4f, 0xc0, 0x9a, 0xb2, 0xe6, 0xed, 0x2e, 0x01, 0x73, 0xb5, - 0x5c, 0xc0, 0x3d, 0xb2, 0x12, 0x70, 0x6c, 0x1b, 0x40, 0x52, 0x32, 0x2a, 0x07, 0x97, 0x52, 0x7c, 0xcd, 0xd8, 0xa2, 0x4e, 0x7e, 0x3a, 0x60, 0x47, 0x45, 0x92, 0x1f, 0xe5, 0x3d, 0xfe, 0xf0, 0x41, - 0xde, 0x74, 0x18, 0x37, 0xf4, 0xfd, 0xbf, 0x5f, 0x2d, 0x06, 0x0f, 0x98, 0x51, 0x5f, 0xb4, 0x89, 0x87, 0x3e, 0x20, 0xf8, 0x29, 0x62, 0xe5, 0x17, 0xa9, 0x37, 0x48, 0xef, 0xda, 0xca, 0x8b, 0xa4, - 0x9f, 0x41, 0x74, 0x5c, 0xce, 0xf3, 0x41, 0xb7, 0xd2, 0xd8, 0x7c, 0x74, 0x19, 0x78, 0x5b, 0x8b, 0x97, 0x96, 0xf5, 0x29, 0x18, 0x82, 0x32, 0x33, 0x01, 0xb8, 0x23, 0x30, 0x5a, 0x8e, 0x83, 0xd8, - 0x2b, 0xc7, 0x73, 0x71, 0x7f, 0xae, 0x44, 0x31, 0x76, 0x01, 0xb4, 0x86, 0x55, 0x8f, 0x8b, 0x76, 0x2e, 0x07, 0x52, 0x38, 0x8f, 0xc0, 0xc8, 0x4f, 0x17, 0x72, 0x0b, 0xa5, 0xe2, 0xca, 0xc0, 0xfa, - 0x8d, 0x4b, 0xb3, 0xd4, 0xd7, 0xf9, 0xfb, 0x8b, 0x12, 0xf5, 0x1f, 0xda, 0x53, 0x3f, 0xca, 0x7e, 0x07, 0xc2, 0xcb, 0x95, 0xa9, 0x36, 0x56, 0x10, 0xd6, 0x4c, 0x0a, 0x38, 0xed, 0x23, 0x85, 0xb0, - 0x3a, 0x4d, 0x3a, 0xaf, 0xbd, 0x95, 0xec, 0x92, 0x07, 0x66, 0x9f, 0xb2, 0x7b, 0x78, 0x81, 0xa7, 0x4b, 0xd8, 0x53, 0xf4, 0x7a, 0x99, 0xe2, 0x47, 0xab, 0x4a, 0x76, 0xe9, 0x00, 0xf6, 0xcb, 0xda, - 0xc2, 0xb9, 0x95, 0x35, 0x70, 0x29, 0x84, 0x2f, 0x24, 0x45, 0x69, 0x46, 0x0e, 0x5c, 0x0d, 0x20, 0x3a, 0x94, 0xe8, 0xb1, 0x55, 0xba, 0x12, 0x27, 0xcb, 0x2f, 0xe5, 0x4b, 0x8b, 0x2a, 0x3f, 0x57, - 0x8f, 0x87, 0x00, 0xf2, 0x54, 0x7c, 0xd9, 0xab, 0xd0, 0x7b, 0xe3, 0x6f, 0x87, 0xb7, 0x20, 0xeb, 0x09, 0x0e, 0x20, 0x52, 0x0e, 0xd7, 0x8d, 0x90, 0x24, 0xb8, 0xe0, 0x66, 0xfc, 0x46, 0xec, 0x61, - 0x08, 0xda, 0x00, 0xd4, 0xb0, 0xd5, 0x15, 0xfc, 0xac, 0x21, 0xfb, 0x5e, 0x33, 0xe2, 0x23, 0x11, 0x6e, 0x3b, 0x0b, 0xb2, 0xf5, 0xb0, 0x31, 0x79, 0x0b, 0xd4, 0xc5, 0xea, 0x60, 0xbb, 0xe9, 0x19, - 0xad, 0x10, 0x3d, 0xb3, 0x42, 0xf7, 0x32, 0xdf, 0xb7, 0xa9, 0x0b, 0x9d, 0x64, 0x4b, 0xac, 0xcc, 0x84, 0x9d, 0x9f, 0xe6, 0xf5, 0x94, 0x80, 0x86, 0xa2, 0xca, 0xd3, 0x99, 0x93, 0x84, 0xbf, 0xc9, - 0x22, 0xc3, 0x9e, 0xb3, 0xa5, 0xfc, 0x12, 0x7c, 0xc7, 0xe3, 0xf5, 0x6c, 0x76, 0x17, 0xf8, 0x33, 0x26, 0x01, 0xab, 0xa2, 0x48, 0x49, 0xaa, 0xe6, 0x1e, 0x9f, 0xdb, 0xa7, 0xed, 0x9e, 0x53, 0x9b, - 0x14, 0xdd, 0x20, 0x72, 0xb5, 0x45, 0xcf, 0x5a, 0x97, 0x2f, 0xe3, 0x30, 0xd1, 0xe7, 0x35, 0x0b, 0x13, 0x78, 0x5c, 0xc3, 0xa5, 0x9f, 0x04, 0xed, 0xf9, 0xb4, 0xf4, 0x78, 0xe0, 0x00, 0x6f, 0xa3, - 0xad, 0xb1, 0xee, 0xc6, 0x06, 0xcd, 0xf1, 0x38, 0x22, 0x28, 0xa0, 0x44, 0x6d, 0x27, 0xc8, 0xab, 0x34, 0xca, 0x2e, 0x13, 0xa8, 0x6c, 0x1a, 0x37, 0x3c, 0xbf, 0xa3, 0x3a, 0x78, 0x14, 0x4e, 0x50, - 0x54, 0xf9, 0x30, 0xce, 0x2c, 0xd7, 0x7d, 0xbc, 0x80, 0x3d, 0x65, 0x78, 0x79, 0x13, 0x7b, 0x87, 0xed, 0xe5, 0xe4, 0x36, 0x90, 0x26, 0x18, 0x5e, 0x92, 0x64, 0x5f, 0x8b, 0xc2, 0x41, 0x65, 0x54, - 0xf9, 0x88, 0x61, 0x91, 0x5b, 0xa9, 0xa0, 0x84, 0x92, 0x65, 0x92, 0x85, 0x7e, 0xd8, 0x30, 0x32, 0x60, 0xf6, 0x55, 0x9a, 0x9a, 0x4e, 0x7e, 0xe0, 0x47, 0x81, 0xef, 0x1a, 0x73, 0x28, 0xc6, 0x13, - 0x94, 0x21, 0xa0, 0xcd, 0x80, 0x3b, 0xac, 0x59, 0xd0, 0xb4, 0x09, 0x9e, 0xb7, 0x2b, 0xd7, 0x54, 0x49, 0x5e, 0xac, 0xac, 0x9c, 0x87, 0x01, 0xdd, 0xa0, 0x27, 0xec, 0x30, 0xfd, 0xbc, 0xea, 0xad, - 0xca, 0xbd, 0x37, 0xef, 0xcb, 0x5e, 0xea, 0x7d, 0x99, 0xe4, 0x97, 0x9a, 0xc8, 0xdf, 0x63, 0xfa, 0x21, 0xc0, 0xfe, 0xfb, 0xd5, 0xef, 0x7d, 0xc8, 0xfd, 0x64, 0x50, 0x7f, 0xc9, 0xbd, 0xa2, 0xfa, - 0xeb, 0xec, 0x16, 0x70, 0x44, 0xfd, 0x0c, 0x2b, 0x49, 0x32, 0x66, 0x3f, 0xec, 0xd3, 0x81, 0xcf, 0x5a, 0xd4, 0x52, 0x70, 0x0c, 0x51, 0x01, 0x9d, 0x62, 0xc7, 0x62, 0x77, 0xb1, 0xfd, 0x2d, 0xb0, - 0xc4, 0xf5, 0x3d, 0x13, 0xa3, 0xad, 0x16, 0x69, 0x43, 0x46, 0xc0, 0x38, 0x6c, 0x6d, 0x44, 0xae, 0x09, 0x34, 0x43, 0xd1, 0x8f, 0xe5, 0x11, 0x5e, 0xe1, 0xf9, 0xb6, 0x3b, 0x03, 0x49, 0x64, 0x59, - 0x88, 0xb4, 0x0d, 0x81, 0x93, 0xdf, 0x2d, 0xa5, 0x3d, 0x35, 0x49, 0x37, 0x68, 0xb3, 0xd1, 0xc9, 0xdd, 0xdf, 0xc5, 0xaa, 0x3c, 0xf1, 0x6d, 0xbe, 0x08, 0xbd, 0x62, 0xf1, 0x72, 0x38, 0xa5, 0x24, - 0xdd, 0x15, 0x08, 0x5d, 0xa9, 0x95, 0xc8, 0xf5, 0x81, 0x08, 0x4f, 0x13, 0x60, 0x04, 0x09, 0x8e, 0x5f, 0xcb, 0xa6, 0x5d, 0xb1, 0x20, 0x55, 0x20, 0xc6, 0xd9, 0x82, 0xb6, 0x72, 0xe3, 0x96, 0xc7, - 0x8d, 0x81, 0xe8, 0x1e, 0x9e, 0x07, 0x5b, 0x99, 0x99, 0xd7, 0x16, 0xb3, 0xdd, 0x0a, 0x72, 0x57, 0xcc, 0x81, 0xdd, 0x61, 0x51, 0x54, 0xa7, 0xce, 0xeb, 0x5c, 0xdd, 0x1c, 0xed, 0x2c, 0x42, 0x9c, - 0x8e, 0x92, 0x56, 0x2e, 0xf4, 0x65, 0xa5, 0x2a, 0x1f, 0xef, 0xb8, 0xe0, 0x67, 0x1a, 0x5c, 0x5e, 0xe7, 0xe4, 0xf2, 0xba, 0x9d, 0x82, 0x27, 0xb5, 0x12, 0xea, 0xeb, 0xea, 0x72, 0x3e, 0x5e, 0xc0, - 0x98, 0x3e, 0x6d, 0xbc, 0x76, 0x38, 0x44, 0x59, 0xc1, 0x2d, 0x71, 0xa2, 0xba, 0x18, 0x4d, 0x45, 0x6c, 0x8f, 0x20, 0xb2, 0xe8, 0x57, 0x9d, 0x68, 0xc9, 0x01, 0xbb, 0xc9, 0x0d, 0x0b, 0xb6, 0x38, - 0x89, 0x12, 0xec, 0x4b, 0xab, 0xc2, 0x0a, 0xd4, 0xaa, 0xc6, 0x3e, 0x16, 0x0a, 0x6d, 0x71, 0x94, 0x22, 0x28, 0x01, 0x97, 0x02, 0xbd, 0x5d, 0x10, 0xd8, 0x96, 0xc8, 0xf6, 0x3f, 0x7f, 0x45, 0x7f, - 0x52, 0x7a, 0xbc, 0x6c, 0xbd, 0xd6, 0x9b, 0xdd, 0x98, 0x19, 0x1a, 0xab, 0x8e, 0x7f, 0xb3, 0xa5, 0xf8, 0xf3, 0x95, 0xec, 0x93, 0xec, 0x2b, 0x78, 0x1f, 0xaf, 0x4c, 0x0d, 0x6c, 0xd8, 0xb5, 0xd6, - 0xee, 0x60, 0x11, 0x7e, 0xc2, 0x1f, 0xf1, 0xad, 0x75, 0x30, 0xf6, 0x97, 0x6d, 0x1e, 0x43, 0xd8, 0xf6, 0x72, 0x14, 0xe0, 0x25, 0x4d, 0x58, 0x5c, 0xd0, 0xe1, 0x95, 0x2f, 0x68, 0xa8, 0x7c, 0x2e, - 0x69, 0x40, 0x44, 0x96, 0x41, 0x61, 0xee, 0x33, 0x7a, 0x49, 0x05, 0x54, 0x88, 0x99, 0x6c, 0xbc, 0x38, 0x50, 0x3a, 0xae, 0x94, 0x31, 0xb3, 0x58, 0xd3, 0x64, 0x85, 0x05, 0x5e, 0x84, 0xf2, 0xf3, - 0x29, 0xeb, 0xda, 0x43, 0x5b, 0xd0, 0xa3, 0xdd, 0xeb, 0x9f, 0x33, 0x64, 0x7c, 0xff, 0x8a, 0x1b, 0x56, 0xdf, 0xdd, 0x98, 0xca, 0x9c, 0xd1, 0x18, 0x4b, 0x78, 0x0f, 0x07, 0xe7, 0x51, 0x69, 0xd7, - 0xe7, 0x24, 0x3f, 0x81, 0x86, 0x5e, 0x23, 0x3d, 0x8c, 0xb7, 0x99, 0x7c, 0x0a, 0xa8, 0xd2, 0x6f, 0xc1, 0x72, 0x79, 0xf4, 0x83, 0xa3, 0x61, 0xa5, 0x56, 0x4f, 0xfa, 0x63, 0xd0, 0xa6, 0xbc, 0x85, - 0x8c, 0x5c, 0xe1, 0x1e, 0x72, 0x8a, 0xec, 0x0c, 0x14, 0xa9, 0x36, 0x4e, 0x12, 0x01, 0x98, 0xaf, 0x19, 0x7b, 0x5d, 0x15, 0xeb, 0xf9, 0x6a, 0xdd, 0x7d, 0x51, 0x80, 0xee, 0xbf, 0x31, 0xa9, 0xda, - 0xdf, 0x40, 0xf2, 0xc4, 0x77, 0xf6, 0x2a, 0xf5, 0x0d, 0x85, 0xa4, 0x6a, 0xa7, 0xd6, 0xe3, 0xa3, 0x95, 0x60, 0x59, 0xa4, 0x24, 0xe4, 0x5f, 0x5c, 0xa7, 0xdb, 0xed, 0x7d, 0x39, 0x1f, 0xb1, 0xf9, - 0xc6, 0xb2, 0x32, 0x3e, 0x3e, 0x26, 0x8a, 0xc6, 0x22, 0x5b, 0xf1, 0x52, 0x06, 0xce, 0xd6, 0x0e, 0x0e, 0xac, 0x62, 0x76, 0x64, 0x26, 0x1f, 0x3b, 0x73, 0xeb, 0x3a, 0x06, 0x89, 0x42, 0xf0, 0x46, - 0x4e, 0x3b, 0x0d, 0x00, 0x0b, 0x48, 0x39, 0x6f, 0xb4, 0x6c, 0xcf, 0x08, 0xdb, 0x21, 0xf4, 0xeb, 0x3d, 0x39, 0x65, 0x23, 0xfa, 0xca, 0x9e, 0xf4, 0x00, 0x8a, 0xe7, 0x1c, 0xc1, 0xaf, 0x42, 0xc1, - 0xd9, 0xdb, 0xe1, 0x54, 0x27, 0xb0, 0x7a, 0x26, 0xe6, 0xe9, 0x4e, 0x2a, 0xfc, 0x8e, 0x67, 0x68, 0x07, 0xd9, 0x53, 0x8c, 0x52, 0x88, 0x51, 0x74, 0x71, 0x9b, 0x2a, 0xeb, 0xe6, 0x6b, 0xe7, 0x20, - 0xea, 0x00, 0x76, 0xaa, 0xcd, 0x81, 0x81, 0x2d, 0x93, 0x30, 0x2f, 0xd5, 0x66, 0x45, 0x56, 0xc9, 0x45, 0x5f, 0x34, 0xda, 0x71, 0x0c, 0x54, 0xe1, 0x20, 0xf2, 0x67, 0x88, 0x24, 0x68, 0x8d, 0xd0, - 0x14, 0x3c, 0x34, 0x0b, 0x06, 0xda, 0x86, 0x4f, 0x16, 0xe4, 0x7e, 0xe1, 0xd6, 0xfa, 0x0d, 0x17, 0x15, 0xf2, 0x39, 0x4a, 0xeb, 0xb7, 0xcf, 0x7e, 0xe6, 0x10, 0x7e, 0xef, 0x84, 0xff, 0xfb, 0x7f, - 0xf0, 0x9f, 0x78, 0xa7, 0x88, 0x77, 0xa6, 0x95, 0x77, 0x8d, 0x79, 0x98, 0xc8, 0xf6, 0x25, 0x1d, 0xe2, 0xd7, 0xcd, 0xcf, 0xeb, 0x28, 0xf5, 0xcf, 0xfc, 0xdd, 0x9b, 0xa7, 0xf7, 0xf3, 0xa7, 0x77, - 0x80, 0xb3, 0xcf, 0x57, 0x66, 0x37, 0xd9, 0x1f, 0x7a, 0xfd, 0xaf, 0x47, 0x3d, 0x9f, 0x0e, 0x1b, 0x86, 0xb6, 0xe7, 0x42, 0x9d, 0x12, 0x4c, 0x2e, 0x6d, 0xc9, 0x61, 0x0d, 0xe0, 0x80, 0x8e, 0x8d, - 0xb0, 0xa0, 0x82, 0xd8, 0x3a, 0xc4, 0x21, 0x61, 0xbe, 0xc4, 0xeb, 0x4d, 0xdd, 0xf3, 0xe8, 0xf6, 0xa2, 0x0a, 0x07, 0xcc, 0xee, 0x63, 0x98, 0xed, 0x22, 0x77, 0x71, 0xee, 0x0c, 0x05, 0xb3, 0x2f, - 0x47, 0xac, 0x69, 0xd5, 0x7d, 0xb8, 0x84, 0x71, 0x76, 0x85, 0xf8, 0xf8, 0xda, 0x16, 0x3a, 0x63, 0x12, 0xc7, 0xd4, 0x94, 0x0e, 0x7c, 0x0c, 0xde, 0xb3, 0x89, 0x60, 0x7f, 0x9a, 0x91, 0x83, 0x4c, - 0x4f, 0x0c, 0x03, 0xf1, 0xa5, 0xb8, 0x43, 0x8f, 0x90, 0x82, 0xe9, 0xc7, 0x08, 0x63, 0x1c, 0xce, 0xf2, 0x86, 0x1c, 0xa8, 0x72, 0xf3, 0xe0, 0x1e, 0x58, 0x0d, 0x84, 0x68, 0x49, 0x3a, 0x2a, 0x52, - 0x15, 0x0d, 0x97, 0x25, 0x07, 0xf7, 0x95, 0xa6, 0xaf, 0x6a, 0xce, 0x56, 0x78, 0xaf, 0x8b, 0x92, 0x8d, 0x00, 0x98, 0xcc, 0x0a, 0xab, 0xcd, 0x64, 0x5b, 0xe1, 0x2b, 0x06, 0x33, 0x34, 0x68, 0x2c, - 0xd3, 0x98, 0x07, 0x3c, 0xfa, 0x31, 0x94, 0x9f, 0x9a, 0xff, 0x30, 0x31, 0xec, 0x9b, 0x0c, 0x9d, 0xab, 0xea, 0x85, 0x7d, 0x90, 0xfb, 0x0b, 0xc1, 0x17, 0x2d, 0x00, 0xfe, 0x9c, 0x6e, 0xf9, 0x21, - 0x47, 0x07, 0xf9, 0xeb, 0xff, 0xfc, 0x9f, 0xbf, 0xd0, 0xeb, 0xff, 0xb0, 0xeb, 0xff, 0xf0, 0xcf, 0x4f, 0xfe, 0x59, 0xc6, 0xce, 0x5f, 0x7f, 0x7d, 0xc8, 0x50, 0x7b, 0x37, 0x32, 0xfe, 0xff, 0xac, - 0xc9, 0x87, 0x1f, 0xcd, 0x34, 0xfa, 0x3a, 0xe2, 0xc9, 0xef, 0xe4, 0x11, 0x7b, 0xdd, 0x67, 0xca, 0xa3, 0xbf, 0x1e, 0x61, 0x54, 0x02, 0xe2, 0x82, 0xca, 0x0c, 0x05, 0xe6, 0x19, 0xa1, 0x3a, 0x57, - 0x18, 0x87, 0x8f, 0x5e, 0xea, 0x37, 0x85, 0xb8, 0x24, 0xc1, 0xbd, 0x50, 0x9e, 0x32, 0x77, 0x91, 0xae, 0x56, 0x6e, 0x79, 0x49, 0x77, 0x11, 0xee, 0x3a, 0xac, 0x24, 0x61, 0x52, 0x4e, 0x95, 0x49, - 0x6f, 0xae, 0x50, 0x55, 0x38, 0xa2, 0x80, 0x19, 0xa6, 0x30, 0x4b, 0xf1, 0x25, 0xe6, 0x2c, 0xb2, 0x30, 0xde, 0x05, 0xc9, 0x52, 0x4c, 0x9e, 0x67, 0x82, 0xfa, 0xc8, 0x57, 0xf8, 0xdd, 0xa2, 0x4b, - 0x3e, 0xa5, 0x7f, 0xbc, 0x93, 0xfb, 0x7e, 0xdd, 0x6d, 0x8b, 0x5b, 0xa9, 0xd6, 0x09, 0x3a, 0xc8, 0x85, 0x87, 0x8e, 0x0b, 0x52, 0x77, 0x89, 0x6d, 0xb1, 0x14, 0xd2, 0x44, 0x48, 0x5b, 0xbf, 0x1c, - 0x63, 0x6e, 0x05, 0x80, 0xc7, 0x44, 0xf2, 0x64, 0x86, 0x28, 0xf9, 0x65, 0xb2, 0xd3, 0xc8, 0x60, 0xcd, 0xf0, 0x6c, 0x00, 0x6e, 0x49, 0x90, 0x3c, 0x2f, 0x35, 0x4e, 0x21, 0xa3, 0x7c, 0xb5, 0x5f, - 0x69, 0xb0, 0xcd, 0x97, 0xa8, 0x85, 0x8e, 0xaa, 0x79, 0x90, 0x6c, 0x29, 0xd7, 0x04, 0x76, 0x8f, 0xe5, 0xc1, 0x73, 0x4b, 0xaf, 0x1f, 0x66, 0xee, 0x2b, 0x9f, 0xe3, 0x17, 0x72, 0xc8, 0x77, 0x2a, - 0xcb, 0x75, 0xd9, 0x44, 0x7e, 0xbf, 0x6c, 0x52, 0x8f, 0xf6, 0xdb, 0x5f, 0xdd, 0x66, 0xdf, 0xeb, 0x82, 0xcf, 0x58, 0xe2, 0x3f, 0xc9, 0x7e, 0xe9, 0x8f, 0x77, 0x57, 0xa6, 0xf2, 0xac, 0x8a, 0xed, - 0x2a, 0xa3, 0xa1, 0xc4, 0x3e, 0x84, 0xe4, 0xf6, 0x40, 0xe9, 0x22, 0xa0, 0xed, 0xb6, 0x89, 0x66, 0xc6, 0x6b, 0x9a, 0x76, 0x53, 0xf2, 0xbc, 0x3a, 0xae, 0x5d, 0x96, 0x07, 0xc1, 0x3d, 0x98, 0x2e, - 0x03, 0x6e, 0x8c, 0x10, 0x2b, 0x5e, 0xb1, 0x8d, 0x2b, 0x98, 0x01, 0x8a, 0x44, 0x07, 0x37, 0xd6, 0x38, 0x5b, 0xe9, 0x97, 0xda, 0xbc, 0xc8, 0x88, 0x33, 0x2a, 0x68, 0x8c, 0xcb, 0x78, 0x66, 0xb6, - 0x98, 0xb0, 0x19, 0xb3, 0xec, 0xbc, 0x6a, 0x66, 0x4e, 0x9e, 0x35, 0x55, 0x9e, 0x24, 0x5e, 0xf5, 0xf7, 0xff, 0xf5, 0x1d, 0x35, 0xe6, 0x5b, 0x79, 0xce, 0x57, 0xba, 0x92, 0x77, 0xf7, 0xbc, 0xce, - 0xcb, 0x9a, 0x57, 0xb7, 0x10, 0xfa, 0xad, 0x47, 0xfb, 0xa5, 0x87, 0xee, 0x16, 0xe7, 0x87, 0x7d, 0xe4, 0x86, 0xd5, 0xa3, 0x0f, 0x05, 0x7d, 0x8a, 0x39, 0xed, 0x55, 0xe8, 0x4b, 0xaf, 0x5c, 0x0f, - 0x67, 0xe8, 0x34, 0x06, 0xb5, 0x40, 0x3a, 0x40, 0xd4, 0x3c, 0xcf, 0x28, 0xc5, 0x6d, 0x4b, 0xd7, 0x0e, 0xba, 0x3d, 0x6e, 0xa2, 0x24, 0x0d, 0xad, 0x0e, 0x51, 0x5d, 0x5e, 0x88, 0x32, 0x53, 0x1c, - 0xdf, 0xaf, 0x45, 0x15, 0xc5, 0xe6, 0x38, 0xdb, 0x1e, 0xdd, 0xf2, 0x90, 0x02, 0xa4, 0x1d, 0x6c, 0x91, 0xf9, 0xb6, 0xdb, 0x48, 0xf5, 0x82, 0x59, 0xad, 0x32, 0x2b, 0xc3, 0x19, 0xb9, 0x9d, 0x37, - 0xe8, 0x31, 0x9f, 0x9f, 0x94, 0x44, 0xbc, 0x3c, 0x19, 0x3d, 0xfc, 0x85, 0xbd, 0xef, 0xf1, 0x38, 0x7f, 0xef, 0xed, 0xff, 0xde, 0xea, 0xff, 0xa4, 0x96, 0xff, 0x26, 0xf8, 0x8e, 0xe5, 0xdb, 0xe9, - 0x0c, 0x9a, 0xa6, 0xed, 0xe3, 0xa4, 0x5f, 0x55, 0x9c, 0x08, 0x4a, 0xcb, 0xa3, 0x50, 0x0a, 0x12, 0x1d, 0x40, 0x69, 0x70, 0xa2, 0xe7, 0xa7, 0x85, 0xb8, 0x76, 0x81, 0xb9, 0x4a, 0x9a, 0x36, 0x72, - 0x5c, 0x8b, 0x9c, 0xbb, 0x50, 0x73, 0xf3, 0x24, 0x35, 0x9c, 0xbd, 0xbd, 0x44, 0x43, 0x6d, 0x70, 0xcc, 0x16, 0xa5, 0xe7, 0xb4, 0x61, 0x2c, 0x65, 0x2c, 0xc8, 0x88, 0x11, 0x3e, 0x9e, 0x6c, 0x4b, - 0xf2, 0x2f, 0x5a, 0x93, 0xe2, 0x1c, 0xfb, 0x65, 0xbf, 0xf7, 0x46, 0x00, 0xfb, 0xfd, 0x18, 0x7a, 0xc6, 0xa5, 0x74, 0x17, 0x79, 0x6b, 0xf5, 0x8d, 0x20, 0x6c, 0x6a, 0x82, 0x6d, 0xc3, 0xd0, 0xd4, - 0x79, 0x4e, 0x69, 0x1e, 0x74, 0x71, 0x21, 0xae, 0x3b, 0x79, 0xe2, 0x71, 0x6e, 0x55, 0x2b, 0x29, 0x3b, 0xf6, 0xf3, 0x52, 0x84, 0x50, 0x61, 0xee, 0x6c, 0x75, 0x6b, 0x19, 0x55, 0x61, 0x01, 0x4b, - 0x12, 0x49, 0x60, 0x0a, 0xb3, 0x10, 0x16, 0x7e, 0xb5, 0xc0, 0x9c, 0xfe, 0xb2, 0xe3, 0x98, 0x08, 0x97, 0x68, 0x3c, 0xcc, 0xc7, 0x74, 0x39, 0xe7, 0xe2, 0xf0, 0x72, 0xd6, 0xb6, 0xcc, 0xb3, 0x1e, - 0xdc, 0x3b, 0xb3, 0xd9, 0x5b, 0x01, 0xd8, 0xef, 0x62, 0x06, 0x9a, 0x2a, 0x2c, 0x7e, 0xd1, 0xac, 0xfd, 0x36, 0xa4, 0xf8, 0x56, 0x94, 0xb8, 0xf8, 0xa7, 0xa8, 0xf2, 0x26, 0xbf, 0x4e, 0xc1, 0xff, - 0xf8, 0x89, 0x75, 0x7e, 0xec, 0xc6, 0x7b, 0x6e, 0x52, 0xfd, 0xee, 0x15, 0xb7, 0x3e, 0xf8, 0xee, 0xc6, 0x8d, 0xd7, 0x66, 0x42, 0x9f, 0x20, 0xc0, 0x1e, 0x5a, 0xe2, 0xe7, 0x39, 0x0e, 0x4b, 0x89, - 0x91, 0x6c, 0x2f, 0xc4, 0xd8, 0xe2, 0xa0, 0x88, 0xa2, 0x1b, 0xa7, 0x5e, 0x1d, 0x84, 0x44, 0xf0, 0xeb, 0x71, 0x63, 0x09, 0x5b, 0x8b, 0xc3, 0x58, 0x1a, 0xa9, 0xb0, 0x51, 0xa6, 0xc4, 0xee, 0x24, - 0x6e, 0x55, 0x55, 0x06, 0xfd, 0xd3, 0x22, 0x3e, 0x14, 0xb6, 0x6d, 0x9b, 0xc9, 0x01, 0x3f, 0x8f, 0x99, 0xbd, 0xd2, 0x84, 0xb0, 0x08, 0x43, 0x3d, 0x7c, 0x2e, 0x6f, 0x70, 0x62, 0x62, 0xe0, 0x37, - 0xd9, 0xac, 0xe4, 0x0f, 0xd9, 0xac, 0x77, 0x88, 0x1e, 0xcf, 0xa3, 0xcf, 0x04, 0x81, 0xbd, 0xc8, 0x7c, 0xeb, 0x80, 0xe2, 0x16, 0x2f, 0x3a, 0x01, 0x71, 0x53, 0xda, 0x5c, 0x5c, 0x6a, 0x3c, 0xd5, - 0xfb, 0x3d, 0x4d, 0x46, 0x14, 0xb7, 0x3c, 0x24, 0x32, 0xa7, 0xf7, 0x67, 0x5c, 0xf6, 0x53, 0x1a, 0x4e, 0xab, 0x12, 0xda, 0xca, 0x58, 0xc6, 0x05, 0x01, 0x8e, 0x09, 0x16, 0xbf, 0x43, 0x07, 0xd7, - 0x0a, 0xc1, 0x6e, 0xad, 0x32, 0x2d, 0x89, 0x15, 0x7c, 0x7f, 0xa2, 0xa4, 0xa1, 0xf6, 0xc4, 0x03, 0x81, 0xb7, 0xc8, 0x6e, 0x93, 0xe6, 0xf5, 0xde, 0x39, 0x30, 0xd0, 0x94, 0x78, 0xd1, 0xd7, 0xd9, - 0xc9, 0xaf, 0xf2, 0xf4, 0xf7, 0xa5, 0x8f, 0x91, 0xa7, 0x0a, 0x6d, 0x7e, 0x23, 0xff, 0x86, 0xce, 0x97, 0xab, 0x37, 0x8f, 0xc6, 0x84, 0x90, 0x41, 0xdd, 0x87, 0x32, 0xcd, 0x23, 0x94, 0xda, 0xbb, - 0x84, 0xac, 0xd8, 0x02, 0x74, 0x31, 0xb7, 0xc3, 0x50, 0xb5, 0xd3, 0x22, 0x29, 0x89, 0xc3, 0x1c, 0x2c, 0x00, 0xb2, 0x27, 0x0d, 0x5d, 0x06, 0xb7, 0x8b, 0x75, 0x50, 0xa9, 0x0c, 0xa3, 0x06, 0xbd, - 0x05, 0x74, 0xf4, 0x6e, 0x6c, 0xed, 0xb6, 0xf4, 0x4d, 0xed, 0xd8, 0x79, 0x2a, 0x08, 0x32, 0xc6, 0x89, 0xab, 0x19, 0x8e, 0x54, 0x78, 0x01, 0xec, 0x56, 0x5f, 0x72, 0x21, 0x7f, 0x6d, 0xb7, 0x1e, - 0x78, 0x1d, 0x9e, 0xc9, 0xbb, 0x7f, 0x79, 0xec, 0xd6, 0xfe, 0xdb, 0xd1, 0xec, 0x2e, 0xe8, 0xe7, 0x46, 0x87, 0x0e, 0x40, 0x6e, 0x8d, 0xf0, 0x44, 0x9d, 0x42, 0x64, 0xbc, 0xec, 0x39, 0x56, 0x93, - 0xe2, 0xd0, 0x64, 0x70, 0x73, 0x7e, 0x21, 0x25, 0xc4, 0x0c, 0xd2, 0xb9, 0x2e, 0x5a, 0xc7, 0xc1, 0xdd, 0xae, 0x06, 0xde, 0xaa, 0x43, 0x8f, 0x5d, 0x56, 0xc0, 0xa8, 0x9b, 0xa0, 0x96, 0xea, 0xb5, - 0x13, 0xaf, 0x43, 0x3e, 0x81, 0x11, 0xab, 0x82, 0x46, 0x42, 0x0f, 0x75, 0x66, 0x40, 0x53, 0x4c, 0x59, 0x67, 0xf0, 0x73, 0x5e, 0xf5, 0x0f, 0x01, 0xc6, 0x77, 0x8b, 0xf4, 0x83, 0x40, 0xfc, 0xd7, - 0x46, 0x5e, 0x3b, 0xf9, 0x37, 0x66, 0xc5, 0xa7, 0x71, 0xbc, 0x09, 0x7e, 0x07, 0xe6, 0x6d, 0x30, 0x4d, 0x8c, 0x1b, 0x2a, 0x6c, 0x50, 0x34, 0x52, 0xbd, 0x6e, 0xe8, 0x78, 0xac, 0x15, 0x76, 0xa0, - 0x8a, 0x70, 0xb7, 0x81, 0x1b, 0x8e, 0xdd, 0xed, 0x37, 0x2c, 0x8d, 0x76, 0xf1, 0x0a, 0xe5, 0x4a, 0x6c, 0xd5, 0xd2, 0xb0, 0xcb, 0x12, 0xe7, 0x75, 0x01, 0x02, 0xdd, 0xd9, 0x2c, 0xeb, 0x25, 0xb7, - 0xb5, 0x8a, 0x6e, 0xa4, 0x76, 0xe8, 0x1e, 0xc0, 0x72, 0x92, 0xed, 0xbb, 0xb2, 0x95, 0xb7, 0x4e, 0x66, 0x92, 0x8a, 0x31, 0x62, 0xd3, 0x8c, 0x8b, 0x75, 0x9b, 0x3e, 0x0c, 0x72, 0x81, 0x9e, 0xc5, - 0xe3, 0x2a, 0xf3, 0x0e, 0xc5, 0xf5, 0x68, 0x06, 0xfd, 0x8c, 0x02, 0x3c, 0xa3, 0xbc, 0x08, 0x32, 0xbc, 0x3d, 0x77, 0x20, 0x24, 0xef, 0x5c, 0x52, 0x14, 0xba, 0x2c, 0xc5, 0xf0, 0x08, 0xad, 0x4d, - 0x38, 0x7e, 0x66, 0x60, 0x34, 0x41, 0x95, 0xb7, 0xe7, 0x9b, 0xee, 0xf5, 0x2f, 0x72, 0x23, 0x09, 0x79, 0x30, 0x2a, 0x1e, 0xa9, 0x1d, 0xd0, 0x53, 0xf1, 0xc7, 0x95, 0x77, 0xd7, 0x39, 0x9a, 0x9b, - 0x82, 0x35, 0x61, 0x02, 0x11, 0x21, 0x1b, 0x35, 0xb4, 0x7d, 0x4d, 0x2a, 0xa8, 0x39, 0x87, 0x49, 0x4d, 0xd9, 0x8f, 0xf0, 0x7a, 0x4d, 0x93, 0x0b, 0x8b, 0x64, 0xa8, 0xa0, 0x33, 0xcf, 0x84, 0xba, - 0xc2, 0x53, 0x61, 0x8c, 0xb7, 0xc3, 0xfe, 0xb4, 0x42, 0xa2, 0x16, 0xda, 0xe8, 0x36, 0x97, 0x58, 0x6b, 0x59, 0x4e, 0x62, 0x03, 0xd0, 0x76, 0x64, 0xcf, 0xca, 0x40, 0xaf, 0x8a, 0x7a, 0xba, 0x60, - 0x69, 0xc8, 0x3a, 0x11, 0x9d, 0xc1, 0x7d, 0x21, 0x6d, 0xab, 0xbc, 0xb6, 0xfe, 0x7d, 0xb5, 0xc6, 0x3f, 0xf7, 0x30, 0xbc, 0xc8, 0xbc, 0x35, 0xf7, 0x76, 0x74, 0x0b, 0xca, 0x99, 0xe0, 0x43, 0x50, - 0xe7, 0xd9, 0x9a, 0xa2, 0x2c, 0xd4, 0x77, 0x40, 0x2f, 0x5e, 0xb2, 0x70, 0x02, 0x81, 0xaa, 0x0c, 0x6f, 0xf2, 0x3a, 0x6c, 0x37, 0xd1, 0x78, 0x0c, 0xc8, 0x60, 0xd1, 0xe9, 0x27, 0x71, 0x6d, 0x9c, - 0x4f, 0x8e, 0xcf, 0x75, 0x0d, 0x35, 0x27, 0xf5, 0x73, 0x1b, 0x21, 0xaa, 0x24, 0x30, 0xde, 0x06, 0x5f, 0x70, 0x48, 0x4a, 0x82, 0x6d, 0x3f, 0x5a, 0xc2, 0xe9, 0x48, 0xf8, 0x76, 0xb3, 0xec, 0x8f, - 0xe3, 0xe5, 0xeb, 0x9c, 0xe9, 0xbb, 0xce, 0x7f, 0xab, 0xdd, 0xf8, 0xae, 0x73, 0x6d, 0xac, 0xef, 0x3a, 0x53, 0x35, 0x97, 0x13, 0x12, 0xe4, 0x9d, 0x7b, 0x61, 0x6d, 0x29, 0x24, 0x49, 0x50, 0xb3, - 0x22, 0xeb, 0x20, 0xea, 0x31, 0x22, 0x09, 0x29, 0x30, 0xec, 0x36, 0xde, 0xde, 0x15, 0xc5, 0x76, 0x41, 0x86, 0x4e, 0x44, 0xda, 0x31, 0x71, 0x09, 0x11, 0x96, 0xe2, 0x38, 0x7a, 0x08, 0xcf, 0x4e, - 0xc6, 0xb0, 0xc5, 0x76, 0x6d, 0xef, 0xc6, 0x9d, 0x73, 0x1e, 0xb7, 0x4c, 0x28, 0x03, 0x54, 0x26, 0x55, 0x06, 0xee, 0x98, 0x5c, 0xf5, 0xc5, 0x1f, 0x59, 0x85, 0x69, 0x65, 0x3d, 0xaa, 0x42, 0x89, - 0x3e, 0xb7, 0x4e, 0xde, 0x44, 0x5e, 0x5b, 0x7b, 0x3b, 0xb8, 0x69, 0xcf, 0x13, 0x06, 0xf3, 0xd6, 0x8c, 0xb7, 0xa2, 0x19, 0xd3, 0x1c, 0xcb, 0xca, 0x32, 0x62, 0x94, 0xba, 0xa9, 0xcb, 0xb6, 0x98, - 0x88, 0x8b, 0x73, 0x3d, 0x5c, 0x56, 0xd4, 0x46, 0xa8, 0xb1, 0x44, 0xdc, 0xe8, 0x20, 0x92, 0x43, 0xc2, 0x5c, 0x5d, 0xf4, 0x73, 0x09, 0x34, 0xd0, 0x9c, 0xe8, 0xd9, 0x1e, 0x0c, 0xe7, 0x86, 0x60, - 0x15, 0x8e, 0xba, 0xd5, 0xfa, 0xd2, 0x0e, 0xd1, 0xd8, 0x1d, 0x36, 0xb2, 0xbb, 0x24, 0x90, 0xe3, 0xe6, 0xb9, 0xdd, 0xd7, 0x39, 0xc9, 0x6f, 0x1c, 0xc5, 0xff, 0x43, 0xde, 0x94, 0xb3, 0xef, 0x3f, - 0xfe, 0xf6, 0x96, 0xfe, 0x65, 0x25, 0x89, 0xf7, 0xa8, 0x74, 0xf1, 0x73, 0x45, 0x92, 0xde, 0x0b, 0xbe, 0x82, 0xf8, 0xee, 0x74, 0x6a, 0xa9, 0x24, 0x3c, 0xc1, 0x4e, 0xa3, 0xa9, 0x50, 0x84, 0x60, - 0x82, 0x09, 0x33, 0x98, 0x47, 0x85, 0x88, 0x4a, 0x81, 0xa2, 0xd9, 0x15, 0x72, 0x80, 0x36, 0xac, 0x20, 0xca, 0x08, 0x41, 0xdb, 0x51, 0x2d, 0x9c, 0x68, 0x66, 0x58, 0xbb, 0xc1, 0x02, 0x74, 0x20, - 0x4e, 0xad, 0xd7, 0xc0, 0x88, 0xce, 0x55, 0x7f, 0x19, 0xa2, 0xee, 0xe5, 0x42, 0x49, 0xc9, 0xbe, 0x95, 0xd3, 0xcc, 0xda, 0x4a, 0x62, 0xce, 0xac, 0xf7, 0x8b, 0xe7, 0xa0, 0xfc, 0xea, 0xcb, 0xbd, - 0x67, 0x63, 0x3f, 0x88, 0x5f, 0xbb, 0x85, 0xa6, 0xdf, 0x14, 0xce, 0x47, 0x05, 0x20, 0x9e, 0xab, 0xef, 0xfd, 0x4e, 0x2e, 0x38, 0x7b, 0x7f, 0x36, 0xa5, 0xd6, 0xf7, 0x15, 0x52, 0xd9, 0x52, 0x0f, - 0x6c, 0xad, 0x5a, 0xbb, 0x5d, 0xcb, 0xf7, 0xf1, 0x22, 0x8c, 0x72, 0x5a, 0x5e, 0xd3, 0x3c, 0x01, 0x7a, 0x22, 0x71, 0x0a, 0xab, 0x6e, 0x94, 0xb5, 0xc4, 0x24, 0x17, 0xf4, 0x7e, 0xc4, 0x18, 0x20, - 0x58, 0x76, 0x01, 0xb6, 0x20, 0x92, 0x0d, 0x07, 0x64, 0xb2, 0x1b, 0xd8, 0xac, 0xbf, 0xb1, 0x65, 0xe0, 0x7c, 0xe4, 0x16, 0x4e, 0xe5, 0xd6, 0x92, 0xa5, 0xd6, 0x10, 0x0b, 0x98, 0x0b, 0x69, 0x82, - 0xa9, 0xe6, 0xbe, 0xc6, 0xfc, 0xfd, 0x2f, 0xf4, 0x38, 0xf8, 0xf6, 0x51, 0x38, 0xff, 0xf7, 0xe8, 0x61, 0x4f, 0x38, 0xcd, 0xbf, 0x7d, 0xc3, 0x2b, 0x8e, 0x5f, 0x6a, 0xe9, 0xde, 0xde, 0xf1, 0x33, - 0xa2, 0x1e, 0x62, 0x33, 0x34, 0xa2, 0x6d, 0x8f, 0x50, 0x3f, 0xd4, 0xde, 0xc9, 0xc5, 0x92, 0x9a, 0x91, 0x31, 0x00, 0x95, 0x76, 0x3a, 0xb1, 0x2e, 0x44, 0x7d, 0x6f, 0xc1, 0x66, 0xc0, 0xee, 0xc9, - 0x83, 0x0a, 0x70, 0x51, 0x27, 0x29, 0xcb, 0xf4, 0x10, 0xd8, 0x4b, 0x31, 0x69, 0xaa, 0x66, 0xc3, 0xf8, 0xb1, 0x11, 0x9c, 0xd6, 0x95, 0xe4, 0xc8, 0x4d, 0x04, 0xf0, 0x41, 0xca, 0x2c, 0x5c, 0xd9, - 0x35, 0x19, 0xf8, 0x8b, 0x75, 0xa0, 0xf6, 0x9c, 0xb6, 0x7a, 0xc9, 0x54, 0xfd, 0x5d, 0x2e, 0x19, 0xf2, 0x14, 0xfd, 0xd4, 0x17, 0xe9, 0x37, 0x33, 0xff, 0xa7, 0x6b, 0x33, 0x64, 0x1a, 0x09, 0x15, - 0x61, 0xa9, 0x80, 0xd2, 0xd7, 0xde, 0xa5, 0x27, 0x4f, 0x0a, 0x05, 0x66, 0x63, 0xc7, 0x1f, 0x07, 0x6a, 0x5f, 0x68, 0xeb, 0x39, 0x5b, 0x39, 0x46, 0xa8, 0xeb, 0x49, 0xb9, 0xc4, 0x2e, 0xb8, 0x8b, - 0xeb, 0xfb, 0x05, 0xa3, 0x94, 0x8d, 0xed, 0xd7, 0x4a, 0x94, 0xf5, 0xdc, 0x78, 0x9d, 0xf4, 0xce, 0xae, 0xbb, 0x6b, 0xb4, 0x75, 0xbb, 0x8a, 0xe7, 0x12, 0xbd, 0x53, 0xf3, 0x46, 0x40, 0x88, 0xf2, - 0x4e, 0x42, 0xf5, 0x09, 0x90, 0x4f, 0x9e, 0x8e, 0x8f, 0xb6, 0x69, 0xf4, 0x89, 0x18, 0xa4, 0xcf, 0x1e, 0x8e, 0x9b, 0x94, 0x9f, 0xdb, 0xbb, 0x5b, 0xc0, 0x4e, 0xc3, 0x09, 0x78, 0x95, 0xac, 0x2b, - 0x79, 0xdb, 0xb0, 0xcc, 0x69, 0x73, 0xba, 0x1c, 0xc7, 0xfd, 0x98, 0x88, 0x42, 0x3b, 0xdf, 0xcd, 0x4f, 0x9b, 0x25, 0x4d, 0xac, 0x0f, 0xec, 0x36, 0xa7, 0xc4, 0x25, 0x77, 0x3a, 0x8a, 0x1a, 0x71, - 0xf6, 0x8b, 0xd0, 0xe9, 0xf9, 0x34, 0xe5, 0x41, 0x97, 0x8e, 0x8e, 0x52, 0x55, 0xb6, 0x78, 0x42, 0xa0, 0xdb, 0xad, 0x54, 0x30, 0x87, 0x8a, 0x0e, 0x6b, 0x74, 0x42, 0x46, 0xc5, 0xfb, 0x5a, 0x6d, - 0xaf, 0x09, 0x39, 0xdf, 0x7f, 0x58, 0xdf, 0x94, 0x78, 0xfd, 0x7e, 0xec, 0x3c, 0x63, 0xa8, 0xfc, 0x22, 0xfd, 0x06, 0xe0, 0xa7, 0x6b, 0x53, 0x8b, 0x3f, 0x28, 0xa7, 0xec, 0xb4, 0x1f, 0x8e, 0x7a, - 0xeb, 0x55, 0x31, 0x81, 0xa3, 0xba, 0xdf, 0x26, 0xa1, 0x34, 0x2c, 0x64, 0x0a, 0x3e, 0xf8, 0x10, 0x50, 0xfa, 0xfb, 0x15, 0x89, 0x0a, 0x1b, 0x83, 0x77, 0x46, 0xd1, 0x58, 0x73, 0x73, 0x8c, 0x6e, - 0xd7, 0x50, 0x7c, 0xae, 0xf6, 0x85, 0xc2, 0xb4, 0x47, 0x33, 0x3b, 0xa4, 0x51, 0x31, 0xd6, 0xeb, 0xf4, 0x32, 0x6c, 0x75, 0x7e, 0xe7, 0x5b, 0x84, 0x1c, 0xb1, 0xc1, 0xf8, 0x45, 0x13, 0xac, 0x03, - 0xcf, 0xb6, 0xb2, 0xf3, 0xcc, 0xc9, 0xd3, 0xd4, 0xca, 0x1e, 0xc5, 0x9c, 0x3c, 0x39, 0x43, 0x7f, 0x94, 0x7d, 0x05, 0xe3, 0xe3, 0x95, 0xa9, 0x33, 0x75, 0xbc, 0x1e, 0x2a, 0xe4, 0x62, 0x16, 0x46, - 0xe3, 0xa6, 0xd5, 0x0e, 0x2e, 0x99, 0xa8, 0xaa, 0x74, 0xd0, 0x84, 0x2b, 0x05, 0x8e, 0x39, 0x8a, 0x19, 0x80, 0x73, 0x5c, 0xf0, 0x30, 0x87, 0x79, 0x7a, 0xda, 0xe9, 0x75, 0x9f, 0x3a, 0x2b, 0x38, - 0x38, 0x6a, 0x0b, 0xcd, 0x50, 0x2f, 0x49, 0x65, 0x19, 0x3d, 0x0c, 0x8e, 0x66, 0x41, 0x18, 0x2d, 0x63, 0x90, 0xa4, 0xd1, 0x74, 0xf6, 0x0e, 0x72, 0x53, 0xe6, 0xb9, 0xc5, 0xef, 0xb5, 0x05, 0xb7, - 0xa5, 0xe6, 0xef, 0x1f, 0x6c, 0x6c, 0x9f, 0x1f, 0xfe, 0xef, 0xcc, 0x99, 0x1f, 0x24, 0xbf, 0x03, 0xf6, 0x76, 0x3e, 0xd5, 0xb8, 0x49, 0x02, 0x80, 0xcb, 0x06, 0x8d, 0x33, 0xa0, 0x28, 0x8e, 0xb6, - 0x0b, 0xab, 0xa4, 0x18, 0x46, 0xc1, 0x76, 0xed, 0xb0, 0xf0, 0x9a, 0xc5, 0x65, 0x49, 0x9a, 0x7b, 0x29, 0x48, 0x8f, 0xfb, 0x4d, 0xb6, 0x5e, 0xb9, 0x84, 0x7d, 0xa8, 0x74, 0x37, 0x5c, 0x8d, 0x97, - 0x65, 0xc7, 0x41, 0xa4, 0x89, 0x61, 0xaa, 0xe1, 0x0a, 0x87, 0x40, 0x53, 0x47, 0xbd, 0xc1, 0x45, 0x70, 0x0c, 0x2e, 0x94, 0x17, 0x3b, 0xf6, 0x23, 0x1a, 0xf6, 0x8f, 0xb8, 0x7c, 0x8c, 0x1c, 0xfb, - 0xef, 0xf6, 0x20, 0xef, 0x05, 0x5f, 0x51, 0x79, 0x77, 0x3a, 0x75, 0x37, 0x52, 0xe2, 0xba, 0x3c, 0x36, 0x25, 0xbb, 0xda, 0xf0, 0xeb, 0x98, 0x73, 0x43, 0x71, 0x53, 0x19, 0x30, 0x94, 0x76, 0x82, - 0xd2, 0x65, 0xfb, 0x00, 0x43, 0x40, 0x80, 0xcb, 0x17, 0x09, 0xab, 0xa1, 0x36, 0x22, 0xe8, 0xc2, 0x0a, 0x19, 0x86, 0x6d, 0x61, 0xb2, 0x6e, 0x3a, 0xc7, 0x7a, 0x0f, 0x5a, 0x58, 0xf9, 0x09, 0x55, - 0xfa, 0xed, 0xc8, 0x95, 0x67, 0xbc, 0x3f, 0x90, 0x5e, 0x31, 0x1c, 0x3b, 0xc8, 0xec, 0x26, 0x04, 0xf2, 0xfe, 0x40, 0x41, 0x76, 0xf6, 0x9a, 0x59, 0x98, 0x5d, 0x17, 0xe4, 0x3a, 0x74, 0xde, 0x1e, - 0xf9, 0xc0, 0x28, 0xfd, 0x85, 0x93, 0xf1, 0xfa, 0xcc, 0xfc, 0xcf, 0x82, 0x50, 0x1e, 0xf2, 0x3a, 0xfe, 0xf5, 0xa5, 0x7f, 0x60, 0xf8, 0x49, 0xef, 0xf9, 0xcf, 0x04, 0x8f, 0x5f, 0xe2, 0x1e, 0xff, - 0x7a, 0xd4, 0x5b, 0x1b, 0x9f, 0x5c, 0x44, 0x6c, 0x52, 0xc4, 0x97, 0xcb, 0xc2, 0x3b, 0xc1, 0x4e, 0x79, 0x3e, 0xa2, 0xd2, 0x41, 0x3b, 0xa2, 0xd6, 0x65, 0xcc, 0x07, 0x86, 0xb3, 0x22, 0x05, 0x08, - 0xb9, 0x8c, 0x5d, 0xf8, 0xa7, 0x13, 0xb2, 0xd2, 0x46, 0x66, 0xd4, 0x2c, 0xd3, 0xd4, 0x90, 0x95, 0xc2, 0x44, 0xaa, 0x65, 0x20, 0x7b, 0x91, 0x0a, 0xf1, 0x68, 0x83, 0x1e, 0x22, 0x32, 0x0d, 0x6a, - 0x11, 0x63, 0x18, 0xba, 0xd4, 0xde, 0x76, 0x54, 0x7f, 0xfd, 0xf5, 0xc8, 0x27, 0xfc, 0x90, 0x1f, 0xfb, 0xd1, 0x58, 0xfe, 0xf3, 0xd8, 0xea, 0xef, 0x5f, 0x71, 0x1b, 0xd5, 0xdf, 0xdd, 0x98, 0x9a, - 0xec, 0xbe, 0x58, 0xf0, 0x67, 0x85, 0xc2, 0x16, 0xdb, 0xfd, 0x36, 0x25, 0xb4, 0x48, 0x63, 0xc5, 0xf5, 0x59, 0x38, 0xb5, 0x39, 0x01, 0xb3, 0x0b, 0xe6, 0x10, 0xc1, 0x17, 0x70, 0x38, 0xb0, 0xea, - 0x26, 0xbf, 0x94, 0x12, 0xd1, 0x4b, 0x64, 0x18, 0x42, 0xdb, 0x61, 0x59, 0x26, 0x9b, 0xd6, 0x25, 0x57, 0x59, 0x05, 0x02, 0x42, 0x90, 0xd8, 0xbb, 0x0d, 0xd4, 0x07, 0xab, 0xaa, 0x9c, 0x13, 0x32, - 0x52, 0xae, 0x77, 0x9a, 0xf7, 0x9c, 0xb1, 0xee, 0x57, 0x4c, 0xc8, 0xbf, 0xe4, 0x87, 0x49, 0x74, 0xc2, 0x40, 0xfd, 0x31, 0xba, 0xe3, 0x33, 0xf7, 0xc7, 0x1f, 0x00, 0xff, 0x45, 0xf7, 0x99, 0x44, - 0xf8, 0x7d, 0x05, 0x17, 0xe0, 0x16, 0xc4, 0xe5, 0x44, 0xcf, 0x05, 0x2d, 0x20, 0x2e, 0x79, 0x67, 0xec, 0x05, 0x5a, 0x58, 0xf7, 0x1d, 0x5e, 0xd9, 0x88, 0xbc, 0xe6, 0x92, 0x6d, 0x88, 0x26, 0x7e, - 0x58, 0x6e, 0xd6, 0x83, 0x02, 0xb5, 0x6d, 0xbf, 0x3c, 0x7b, 0xbe, 0x23, 0x6d, 0x1d, 0x7c, 0xde, 0xcd, 0xfd, 0x0e, 0xee, 0x29, 0xce, 0x3e, 0x34, 0xfd, 0xd0, 0xb6, 0x65, 0x49, 0x47, 0x9b, 0xf9, - 0x4e, 0xa4, 0x25, 0xe9, 0x5c, 0xc2, 0xbf, 0x89, 0xe3, 0xf9, 0x69, 0x94, 0x26, 0x8f, 0xcb, 0x85, 0x3f, 0xb9, 0xee, 0x24, 0xf7, 0x5a, 0xe1, 0xb7, 0xbf, 0x53, 0xd7, 0x99, 0xf3, 0x7c, 0x0f, 0x07, - 0x96, 0x67, 0x8f, 0x28, 0x21, 0x1d, 0x0e, 0x4d, 0x6f, 0x63, 0x59, 0xb3, 0xe4, 0x38, 0xce, 0xe2, 0x6b, 0xeb, 0x74, 0x88, 0xf6, 0x04, 0xe5, 0x2f, 0x86, 0x7c, 0xef, 0xb4, 0x4d, 0x82, 0xfb, 0x07, - 0xb8, 0x6b, 0x0d, 0x98, 0x5a, 0xa3, 0xfd, 0xa1, 0x41, 0x23, 0x76, 0x64, 0x9b, 0x2a, 0x1e, 0x00, 0xfe, 0x02, 0x9d, 0x60, 0x8e, 0xc2, 0x69, 0x4c, 0x1c, 0x69, 0x97, 0x11, 0x43, 0x64, 0x8a, 0xfb, - 0xa0, 0x4e, 0x42, 0xc7, 0x9b, 0x59, 0x59, 0x1d, 0xfe, 0xa7, 0x16, 0xde, 0x5f, 0x62, 0x6f, 0x48, 0xbc, 0x9e, 0x4c, 0xb5, 0xee, 0x96, 0xe2, 0x52, 0xf4, 0x03, 0x03, 0xc2, 0x20, 0xe7, 0xb4, 0x3e, - 0x62, 0x28, 0x3f, 0x5f, 0xb0, 0xe3, 0xb9, 0x34, 0x6c, 0x55, 0x66, 0x4d, 0x7e, 0x2d, 0x9d, 0x49, 0x9e, 0x44, 0xd3, 0xe6, 0xa8, 0x6d, 0x15, 0x9b, 0x2a, 0x46, 0x19, 0xf5, 0x2f, 0x3e, 0xb6, 0x19, - 0x5c, 0xfc, 0x70, 0x71, 0x57, 0xdb, 0x3d, 0x21, 0x2a, 0xea, 0x19, 0xd4, 0x16, 0x99, 0x24, 0x0c, 0xe7, 0xc0, 0x6c, 0x78, 0xbe, 0xad, 0x56, 0xbb, 0xe7, 0xfc, 0x57, 0xb7, 0x9f, 0x5d, 0x37, 0x63, - 0xf2, 0xe2, 0xb9, 0xfa, 0xe2, 0x51, 0xb4, 0xea, 0xa6, 0xba, 0x79, 0x89, 0x5f, 0xb5, 0x9d, 0x2f, 0x79, 0xec, 0x61, 0x3d, 0xf3, 0xdb, 0x24, 0xe9, 0x43, 0xb7, 0x09, 0x66, 0xb7, 0xe0, 0xfc, 0x22, - 0x0f, 0x7f, 0x76, 0x3f, 0x7e, 0xc8, 0x42, 0xff, 0x7e, 0x7c, 0x3e, 0x63, 0x94, 0xfb, 0x25, 0xf6, 0xda, 0x35, 0x6f, 0x27, 0x33, 0x74, 0x9a, 0x81, 0x4e, 0x30, 0x86, 0x02, 0xc5, 0xf8, 0xc4, 0x84, - 0x2d, 0x64, 0x6b, 0x53, 0xe6, 0xfe, 0xcc, 0x2e, 0x79, 0x34, 0x0b, 0x37, 0xeb, 0x4b, 0x68, 0xbb, 0x7d, 0xd3, 0xef, 0x54, 0x8d, 0x3f, 0x43, 0xe5, 0x5e, 0xb9, 0xd4, 0x4c, 0xbe, 0x45, 0x39, 0xff, - 0x1c, 0xfb, 0x14, 0xef, 0x2e, 0x8e, 0xac, 0x8a, 0x1e, 0x62, 0x2f, 0x62, 0x56, 0x9b, 0x44, 0xeb, 0xb3, 0x43, 0x56, 0x9c, 0x5c, 0xc9, 0xdc, 0x04, 0xac, 0x98, 0x80, 0x13, 0x12, 0x52, 0x1e, 0x50, - 0x1e, 0x3c, 0x40, 0xae, 0xad, 0x1c, 0x6f, 0x96, 0x5a, 0x8f, 0x9c, 0x83, 0xd0, 0x3f, 0xc4, 0x13, 0xd1, 0x48, 0xbf, 0xc4, 0xde, 0x90, 0x7b, 0x3d, 0xb9, 0xc5, 0x6d, 0x4d, 0x88, 0x45, 0x52, 0xa3, - 0xb3, 0x55, 0xb4, 0xa9, 0x96, 0xd8, 0x62, 0x10, 0x2f, 0xce, 0x97, 0x23, 0x69, 0xc4, 0x0e, 0x6e, 0xe8, 0xea, 0x11, 0x23, 0x58, 0x28, 0xe4, 0x5b, 0xea, 0xc0, 0xe9, 0x25, 0x64, 0x3b, 0xbd, 0x8c, - 0xbb, 0x17, 0x30, 0x80, 0xe4, 0x24, 0x22, 0xbc, 0x6c, 0x5b, 0x46, 0x17, 0xd8, 0xb4, 0x4b, 0x24, 0xc1, 0x35, 0xab, 0x34, 0xb2, 0xea, 0x64, 0xf7, 0x9a, 0xa4, 0x89, 0x23, 0x8b, 0xb2, 0xd8, 0xa4, - 0x78, 0xe8, 0x77, 0x3f, 0xf5, 0x85, 0x98, 0xff, 0x21, 0x2c, 0xf8, 0x33, 0xa5, 0x48, 0xbe, 0xca, 0xff, 0x88, 0xcf, 0xcb, 0xc5, 0xd9, 0x5d, 0xfc, 0xcf, 0x40, 0x69, 0x79, 0x96, 0x92, 0x17, 0x69, - 0xb9, 0xd9, 0x5e, 0x16, 0xdc, 0xde, 0x5d, 0x00, 0x4d, 0x50, 0xcb, 0x56, 0x05, 0xc5, 0x46, 0xbb, 0xdc, 0x5c, 0x8c, 0x6e, 0x30, 0xfb, 0x64, 0x61, 0x51, 0xe4, 0x18, 0x82, 0xa2, 0x1b, 0x75, 0xe4, - 0x31, 0x2c, 0x10, 0x67, 0x3c, 0xd9, 0x42, 0x84, 0xe7, 0x90, 0xc3, 0xca, 0x3b, 0x6c, 0x75, 0x8a, 0xdb, 0x63, 0x6f, 0xa3, 0x1c, 0xc3, 0x8c, 0xea, 0x80, 0x30, 0x5c, 0xc6, 0x3d, 0xb7, 0xfe, 0xde, - 0xa3, 0x81, 0x5e, 0x3d, 0x60, 0xdf, 0x28, 0x9d, 0x1f, 0x86, 0xda, 0xe7, 0x90, 0xe6, 0x8f, 0xbd, 0x50, 0xb8, 0xc3, 0xcc, 0xc9, 0xab, 0xea, 0x31, 0x1b, 0xf8, 0x73, 0x2c, 0x47, 0xef, 0x05, 0x5f, - 0x81, 0x7f, 0x77, 0x3a, 0x95, 0xed, 0xc8, 0x91, 0x0c, 0x47, 0xd5, 0xfa, 0x60, 0xd9, 0xae, 0x97, 0x7a, 0x88, 0xcd, 0x95, 0x80, 0x55, 0x96, 0xe3, 0x76, 0xc5, 0xa3, 0xa1, 0x1c, 0xc1, 0x66, 0x78, - 0x99, 0x33, 0xc5, 0x29, 0x3c, 0xa1, 0x8d, 0x6d, 0x4a, 0xbd, 0xce, 0x60, 0xf3, 0xfd, 0x65, 0xb3, 0x43, 0xc5, 0x42, 0x12, 0xb6, 0xbb, 0x21, 0x40, 0xca, 0xbe, 0x44, 0x92, 0xed, 0xd6, 0xb4, 0x78, - 0xf1, 0xd4, 0xcf, 0xcb, 0x5d, 0x88, 0x45, 0xc7, 0x25, 0xf4, 0x1c, 0xe2, 0xb7, 0x9f, 0xef, 0x0d, 0x45, 0xe5, 0xd5, 0x57, 0x58, 0xde, 0x79, 0x2a, 0xbf, 0x84, 0x6a, 0xdd, 0x1e, 0x7d, 0x09, 0x7b, - 0x9d, 0x85, 0x6e, 0xfd, 0xe3, 0x84, 0x7a, 0x17, 0xed, 0x78, 0xbf, 0x2d, 0xfd, 0xf5, 0x5c, 0x9e, 0xfa, 0x27, 0xd9, 0xaf, 0xfd, 0xf0, 0xeb, 0xca, 0xd4, 0xac, 0x75, 0xb0, 0x39, 0x56, 0x86, 0xb4, - 0x24, 0x65, 0x79, 0x03, 0x67, 0x2a, 0x7d, 0x1e, 0x50, 0x2c, 0x50, 0x8b, 0x52, 0x6f, 0xc7, 0x2d, 0x07, 0x30, 0xc7, 0xf5, 0xf6, 0x98, 0x6d, 0x54, 0x81, 0xc3, 0x2a, 0x66, 0x3c, 0x87, 0xd8, 0xd0, - 0x82, 0x8d, 0x7f, 0x4e, 0x4b, 0xd8, 0x83, 0x9d, 0x8d, 0xd2, 0x2b, 0x97, 0xde, 0x3c, 0xe7, 0xd8, 0x4e, 0x18, 0x0f, 0x21, 0x50, 0x85, 0x8e, 0x10, 0x9b, 0x71, 0x8f, 0x85, 0xf8, 0xa4, 0x1d, 0xe7, - 0x03, 0xe0, 0x1f, 0x69, 0x46, 0x4f, 0x0e, 0xd4, 0xcf, 0x6f, 0xf8, 0x85, 0xd4, 0xc7, 0xeb, 0x37, 0xcd, 0x69, 0xca, 0xd0, 0xb5, 0xcb, 0x75, 0x9b, 0xd5, 0x7b, 0x2d, 0xdb, 0xee, 0x56, 0x04, 0x1f, - 0x9c, 0x0e, 0x62, 0x2d, 0x7a, 0x6b, 0x7c, 0x0d, 0x0a, 0xf3, 0x55, 0x31, 0xa6, 0xf6, 0xa5, 0x3c, 0xee, 0xd1, 0x56, 0xe8, 0x77, 0x4b, 0xc1, 0x84, 0xf7, 0x18, 0x05, 0xe7, 0x9a, 0x95, 0xfb, 0xe5, - 0x9a, 0xcc, 0x24, 0xe2, 0x04, 0x91, 0x43, 0xa2, 0xf7, 0x06, 0x21, 0x07, 0x7b, 0x77, 0x8f, 0x6c, 0x3c, 0x57, 0x1b, 0x40, 0x93, 0xc7, 0x9e, 0x53, 0x15, 0xbe, 0x8e, 0xaf, 0x6f, 0x08, 0x75, 0x9e, - 0x1a, 0xb4, 0x1f, 0x9f, 0x7f, 0xd8, 0x23, 0x7f, 0xee, 0xb5, 0xfa, 0x2c, 0xfd, 0xb5, 0x37, 0xde, 0x5d, 0xba, 0x77, 0xc4, 0x04, 0x57, 0x56, 0x55, 0x01, 0xa7, 0xd3, 0x41, 0x6f, 0x94, 0x40, 0xc2, - 0xa4, 0xb5, 0xad, 0xab, 0x21, 0xcd, 0x92, 0x83, 0x86, 0x2e, 0xf2, 0x39, 0xd3, 0xb6, 0x2c, 0xb1, 0xc4, 0xa3, 0x35, 0x50, 0x82, 0x03, 0x8c, 0x47, 0x48, 0x94, 0x85, 0xa3, 0x73, 0xe6, 0xed, 0x41, - 0x85, 0xe6, 0xeb, 0x0a, 0xd2, 0xca, 0xe4, 0x20, 0xa8, 0x35, 0x16, 0x62, 0x49, 0xb3, 0xe6, 0xf4, 0xf2, 0xe8, 0x91, 0xa7, 0xb5, 0x93, 0x18, 0xda, 0x38, 0x6d, 0xe4, 0xbe, 0xf0, 0xc0, 0x7c, 0xaf, - 0xbf, 0x3e, 0xe3, 0x8e, 0xba, 0x8b, 0xbc, 0xa1, 0x71, 0x3d, 0x98, 0x61, 0xd3, 0x5c, 0x50, 0xaa, 0x13, 0x39, 0x5b, 0x49, 0x8b, 0xb3, 0x6a, 0x17, 0xb3, 0x84, 0x2c, 0xe8, 0x14, 0x5a, 0x3a, 0x6b, - 0x91, 0xe0, 0xd7, 0xe7, 0x13, 0xbf, 0x8b, 0x4f, 0x04, 0x62, 0x50, 0x16, 0xde, 0x1a, 0xcc, 0xa9, 0x9b, 0x8f, 0x2e, 0xb7, 0x3f, 0xf5, 0xf4, 0x5a, 0xe4, 0xcb, 0xb5, 0xbb, 0x8d, 0x3c, 0xf8, 0x74, - 0xd4, 0x8a, 0x24, 0xe2, 0x20, 0xcd, 0x28, 0x96, 0x4c, 0x50, 0x2d, 0x5d, 0x5a, 0x32, 0xd6, 0xd8, 0x51, 0xfb, 0x6a, 0xdd, 0x2f, 0xaa, 0x30, 0x6b, 0xfc, 0x59, 0xf4, 0x38, 0x16, 0xed, 0x99, 0x74, - 0xf7, 0x5f, 0x62, 0x6f, 0xed, 0x7e, 0x3d, 0xb9, 0xed, 0x9a, 0x7f, 0xf0, 0x6c, 0xc0, 0xb3, 0x85, 0x64, 0x1d, 0x6c, 0xc4, 0xc8, 0x93, 0xe3, 0x49, 0x96, 0x5d, 0xfa, 0xb4, 0x61, 0x8c, 0x4b, 0xcb, - 0x3a, 0x85, 0x1f, 0xf6, 0x13, 0x3a, 0xf0, 0x1e, 0x40, 0x74, 0x53, 0x90, 0x7f, 0xd3, 0x8d, 0x4f, 0x34, 0xe9, 0x9d, 0xe0, 0x6b, 0xa3, 0xde, 0x9d, 0xde, 0xba, 0x74, 0x82, 0xc3, 0xa6, 0xe7, 0xc7, - 0xbd, 0xb2, 0x2f, 0xa2, 0x2d, 0x54, 0x6f, 0x0a, 0x02, 0x59, 0x55, 0x07, 0xd3, 0xe5, 0xea, 0x48, 0xdc, 0x6a, 0xb5, 0x55, 0xe0, 0xb9, 0xb2, 0x0b, 0x83, 0x75, 0xd0, 0x12, 0x1c, 0xb9, 0x3d, 0x49, - 0xe0, 0x3c, 0xda, 0x2c, 0x08, 0x75, 0xf4, 0x3a, 0x01, 0x68, 0xf4, 0x56, 0x2a, 0xab, 0xec, 0x4c, 0x45, 0xa0, 0x33, 0xf0, 0x47, 0x6d, 0xd4, 0xd4, 0xbe, 0x3b, 0x1c, 0xab, 0x30, 0x34, 0x2f, 0xe0, - 0x73, 0xe1, 0x8d, 0x5e, 0x9a, 0x47, 0xe1, 0xbb, 0x8d, 0x06, 0xf5, 0xe7, 0x1b, 0x8d, 0xf7, 0x13, 0xd1, 0x2d, 0x12, 0xf2, 0x65, 0xe7, 0x77, 0xf7, 0x08, 0x3c, 0x08, 0xb4, 0xbb, 0xc3, 0xf6, 0x2e, - 0x16, 0xb1, 0xa9, 0xc2, 0x47, 0x7b, 0x12, 0xf8, 0xa9, 0x18, 0x90, 0x6f, 0xdf, 0xf0, 0xd6, 0x61, 0x9f, 0xae, 0xdf, 0xfc, 0xc1, 0x13, 0xe6, 0x23, 0x1b, 0x1f, 0x2b, 0x3b, 0x41, 0x17, 0xfa, 0x26, - 0x5a, 0x5b, 0xed, 0x5c, 0xae, 0x62, 0x52, 0x85, 0x14, 0xc5, 0x70, 0x54, 0xc3, 0xdd, 0x61, 0x3d, 0x77, 0x38, 0x59, 0x65, 0xbe, 0xd8, 0x1f, 0x70, 0x68, 0xb9, 0x5c, 0xa1, 0xfc, 0xa2, 0x35, 0x54, - 0xe8, 0x68, 0x28, 0x3b, 0x99, 0x5d, 0xca, 0xa4, 0x75, 0xca, 0x77, 0xa2, 0x4e, 0x91, 0x6b, 0xfe, 0x18, 0xb8, 0xa2, 0x72, 0xda, 0xc8, 0xe8, 0x39, 0x74, 0x12, 0xfe, 0xb9, 0x9e, 0x7b, 0x3e, 0x08, - 0xf2, 0xad, 0xa4, 0xc7, 0xa3, 0xe5, 0xe1, 0x3b, 0x84, 0xbc, 0x87, 0x5e, 0x8a, 0x27, 0x6d, 0xc6, 0x0f, 0x5e, 0xf2, 0xa8, 0x87, 0xbc, 0xcc, 0x9d, 0x6a, 0x4b, 0x1e, 0xe7, 0xc3, 0x32, 0xea, 0x61, - 0x19, 0x41, 0xe9, 0x3e, 0xa6, 0x56, 0xdd, 0xb1, 0x70, 0x46, 0x01, 0xd9, 0x6d, 0x2a, 0x38, 0x22, 0xfb, 0x2d, 0x3a, 0xf7, 0x81, 0x98, 0x48, 0x3a, 0x25, 0x3b, 0x88, 0x17, 0x20, 0xbd, 0xcc, 0x97, - 0xdc, 0x65, 0xbe, 0x33, 0x64, 0x2f, 0x61, 0x62, 0x0c, 0x89, 0xa5, 0x0b, 0x01, 0x94, 0x09, 0x35, 0x44, 0x3e, 0x4f, 0xe5, 0xc6, 0x65, 0x44, 0x23, 0x5a, 0xc6, 0xf7, 0xea, 0x23, 0x75, 0xe7, 0x87, - 0x4e, 0xfa, 0x6a, 0x5e, 0xfe, 0x54, 0x8d, 0xf0, 0x71, 0x1f, 0x4e, 0xef, 0x9a, 0xba, 0xb1, 0x7e, 0xcb, 0xfd, 0xf6, 0x1f, 0x75, 0xce, 0xed, 0x35, 0x8f, 0xba, 0xe7, 0x76, 0x73, 0x6a, 0x07, 0x45, - 0x01, 0xe1, 0xcd, 0x29, 0x4c, 0x5a, 0xf8, 0xdd, 0x70, 0xc0, 0xa1, 0xc6, 0x35, 0x90, 0x4c, 0x31, 0xb3, 0x7c, 0x89, 0x83, 0xa9, 0xc0, 0xf2, 0x92, 0xb2, 0xda, 0xfb, 0x3d, 0xd5, 0xe0, 0xe3, 0xd8, - 0xc4, 0xb9, 0x5a, 0x6f, 0x95, 0xdd, 0xd0, 0x6d, 0xc0, 0x15, 0x3a, 0x2f, 0x5b, 0xb8, 0x66, 0x20, 0xa9, 0xd1, 0x36, 0xa8, 0xb4, 0x84, 0xf4, 0x33, 0x7f, 0x48, 0x1d, 0xad, 0xbf, 0x84, 0xbd, 0xd1, - 0x9a, 0xcf, 0x6d, 0x0d, 0xfe, 0xbf, 0xe8, 0xa0, 0xe2, 0x77, 0xb6, 0x2f, 0xe2, 0x39, 0x35, 0xf7, 0x4d, 0xec, 0x4b, 0x07, 0xdc, 0x4f, 0x66, 0xc4, 0x34, 0x85, 0xd6, 0x40, 0xa9, 0x93, 0x7c, 0x58, - 0x3b, 0x65, 0xcc, 0x56, 0xcb, 0x82, 0xcd, 0xf6, 0xf3, 0xae, 0x3d, 0xe8, 0x69, 0xd9, 0xb6, 0x1d, 0x9e, 0xeb, 0x12, 0x5f, 0x70, 0xde, 0x91, 0xb0, 0xb8, 0xaa, 0x42, 0x73, 0x94, 0x73, 0xe6, 0x74, - 0x72, 0xb2, 0x88, 0xed, 0xc2, 0x57, 0x0f, 0xd2, 0x32, 0xb3, 0x07, 0x8e, 0x33, 0x59, 0x00, 0x84, 0xf2, 0x7c, 0x43, 0xf2, 0x95, 0xdc, 0xaa, 0x87, 0x4b, 0xa3, 0xba, 0xcf, 0x7e, 0x11, 0xb7, 0x9f, - 0xfd, 0x6b, 0xbd, 0xc1, 0x7f, 0xbf, 0x44, 0x14, 0xbf, 0xaf, 0x5e, 0xfe, 0xa4, 0x35, 0xf5, 0x9d, 0xe0, 0x37, 0x38, 0x5f, 0xe2, 0xfc, 0x27, 0xda, 0x56, 0x13, 0x6b, 0x7b, 0xb4, 0xd0, 0xad, 0x0d, - 0x9c, 0xf6, 0x85, 0xb5, 0x24, 0x98, 0xda, 0x5b, 0x07, 0x2c, 0xe9, 0xea, 0xa7, 0x72, 0x7d, 0xf4, 0xb7, 0xf2, 0x52, 0x61, 0xac, 0x95, 0x1d, 0xba, 0xa0, 0x5b, 0x49, 0xc1, 0x39, 0x6c, 0xce, 0x46, - 0xdc, 0x82, 0x89, 0xd7, 0x88, 0x6a, 0x29, 0xe9, 0x6c, 0xae, 0x9d, 0xa0, 0xcb, 0x66, 0xa3, 0xda, 0x51, 0xe1, 0xae, 0x91, 0x06, 0x68, 0x8c, 0x08, 0xb3, 0xf7, 0xa2, 0xf2, 0xdc, 0x0e, 0xe1, 0x43, - 0x89, 0xf7, 0xdf, 0x9b, 0xb0, 0xda, 0xc2, 0xab, 0xac, 0xf3, 0x63, 0x38, 0xa9, 0xe7, 0x74, 0xbc, 0x37, 0xb1, 0xf7, 0x2a, 0x8d, 0x2f, 0x27, 0x33, 0xea, 0x67, 0x1d, 0xef, 0x0a, 0x65, 0xbe, 0x58, - 0x02, 0xd6, 0xae, 0x5e, 0x46, 0x97, 0x4b, 0x94, 0x4a, 0x38, 0x2d, 0xc9, 0x0b, 0x99, 0x3d, 0x00, 0x26, 0xb9, 0x96, 0x2f, 0xc9, 0x00, 0x30, 0xfb, 0x0a, 0xb4, 0xd6, 0xbd, 0x08, 0x51, 0xf1, 0x06, - 0x50, 0x10, 0xec, 0x5c, 0x33, 0x29, 0x7d, 0x80, 0x05, 0xd1, 0xbf, 0x58, 0xb0, 0xcf, 0x03, 0x32, 0x70, 0xe0, 0x93, 0x23, 0x9d, 0xef, 0xcc, 0x42, 0xea, 0xf2, 0x7c, 0x05, 0x16, 0x8a, 0x04, 0xaf, - 0x9f, 0x1b, 0x9b, 0x4e, 0x9e, 0x16, 0x79, 0x76, 0xfd, 0xed, 0x5e, 0x1a, 0x36, 0xcd, 0x5b, 0xe5, 0xd5, 0x4f, 0x69, 0x59, 0xf7, 0xb8, 0x82, 0xe8, 0xa5, 0xc4, 0x2c, 0xf2, 0x79, 0xc5, 0xfd, 0x55, - 0x62, 0x16, 0xfb, 0x5c, 0x16, 0xef, 0xc6, 0x3e, 0xf6, 0x12, 0xeb, 0xf3, 0x91, 0x2d, 0xf4, 0x13, 0x93, 0xaa, 0x9f, 0x57, 0xe9, 0xaf, 0x9c, 0xf8, 0x2f, 0xf6, 0xe1, 0xeb, 0xed, 0xf0, 0x96, 0x27, - 0xf7, 0xf7, 0xab, 0x75, 0xf8, 0x63, 0x8d, 0x5a, 0xaf, 0x09, 0x72, 0xf7, 0xd7, 0x64, 0xf5, 0x61, 0x4e, 0x4b, 0xc3, 0x3b, 0x4f, 0x3b, 0xf2, 0x29, 0xd5, 0xf4, 0xce, 0xa8, 0x72, 0xd5, 0xda, 0xe0, - 0xcf, 0xfb, 0xcb, 0x8f, 0x95, 0xfe, 0xa8, 0x3f, 0xf1, 0x18, 0xbd, 0xa2, 0xf1, 0xc8, 0x61, 0xf4, 0x19, 0xa3, 0xe9, 0xe3, 0xee, 0x26, 0x19, 0x9c, 0xdd, 0xff, 0xde, 0x12, 0x05, 0xb1, 0x69, 0xee, - 0x22, 0x59, 0xd1, 0xd8, 0x75, 0x7b, 0x50, 0x51, 0x8f, 0x69, 0xf6, 0x5b, 0xb9, 0xcb, 0x76, 0x06, 0xb9, 0x75, 0x62, 0xaf, 0x81, 0x23, 0xa8, 0xc1, 0xa5, 0x56, 0xaa, 0xd9, 0x8b, 0x2c, 0x5f, 0x6a, - 0x2f, 0x66, 0x70, 0xc4, 0x4c, 0xa8, 0x52, 0xf5, 0xd9, 0x8d, 0xbc, 0x0a, 0xeb, 0x5e, 0x2f, 0x37, 0xdd, 0x5a, 0xe3, 0x4e, 0x6b, 0xe9, 0xac, 0x03, 0x24, 0x07, 0x76, 0xcb, 0xdd, 0x2e, 0xf0, 0x82, - 0x7e, 0xf0, 0xe3, 0xdf, 0x24, 0x03, 0x7f, 0x6a, 0xdc, 0x37, 0x23, 0xef, 0x76, 0xe7, 0x56, 0xae, 0xfc, 0xc6, 0xd6, 0x83, 0xfc, 0xfd, 0xee, 0xce, 0xf7, 0x69, 0xd6, 0xe9, 0x67, 0x01, 0x1f, 0xcd, - 0x4d, 0x1f, 0xbb, 0x7c, 0x3a, 0xa6, 0xef, 0x6b, 0x9c, 0x23, 0xd3, 0xd0, 0xac, 0xb9, 0x58, 0x1e, 0x80, 0x53, 0x24, 0x36, 0x29, 0x4d, 0x88, 0x3a, 0x42, 0xe6, 0x34, 0xc6, 0x2e, 0xd8, 0x95, 0xc0, - 0x2e, 0x4d, 0x13, 0x3b, 0x60, 0x7a, 0xe9, 0x71, 0x92, 0xbe, 0xec, 0x08, 0xaa, 0x39, 0x02, 0x91, 0x8d, 0x76, 0x31, 0xa8, 0x8c, 0x16, 0xaf, 0xc9, 0x90, 0x7c, 0xe4, 0x47, 0xad, 0x49, 0x85, 0x83, - 0x08, 0xd9, 0x80, 0xe5, 0xaa, 0xc7, 0x55, 0x67, 0xd7, 0xb0, 0xbc, 0xb2, 0xd6, 0xc8, 0x24, 0x3e, 0x82, 0xff, 0xf5, 0xfe, 0xef, 0x87, 0x49, 0xae, 0xf9, 0x98, 0x64, 0xfd, 0x71, 0xfd, 0x45, 0x9f, - 0x59, 0x7f, 0x5f, 0xa5, 0xbe, 0x4e, 0x71, 0xd7, 0xe3, 0xd9, 0x4d, 0xd6, 0xcf, 0x33, 0x5c, 0xa0, 0xe4, 0xc1, 0xce, 0xdb, 0xf8, 0x31, 0xe8, 0xd0, 0x18, 0xb5, 0x1c, 0x0a, 0x0b, 0xec, 0x31, 0x2a, - 0x88, 0x1b, 0x99, 0x30, 0x2d, 0xa5, 0xd4, 0x6d, 0x68, 0x7f, 0xc2, 0x2b, 0xa1, 0xd3, 0xa0, 0x25, 0x59, 0x58, 0x4a, 0xbd, 0x50, 0xd1, 0x3d, 0x7e, 0x19, 0xdd, 0x8b, 0x51, 0xd5, 0x89, 0xb4, 0x6d, - 0x22, 0xf0, 0xec, 0x62, 0x54, 0x39, 0xe0, 0x18, 0x14, 0xf1, 0x8d, 0x53, 0x13, 0x1d, 0x07, 0xfb, 0x4f, 0x2e, 0x16, 0xbf, 0x9b, 0x18, 0x3e, 0xac, 0x0f, 0xf7, 0xad, 0xe0, 0x23, 0x2d, 0xe7, 0x51, - 0xfd, 0xdf, 0x8f, 0xae, 0xe0, 0xa7, 0xac, 0x24, 0x3f, 0xd4, 0xfd, 0x25, 0xa7, 0x59, 0x4d, 0xca, 0x62, 0x49, 0x77, 0x4a, 0x32, 0xaf, 0x9b, 0x56, 0x5a, 0x77, 0x1e, 0x5f, 0x67, 0xe4, 0x3a, 0x73, - 0xb6, 0x4a, 0xd7, 0xe1, 0x10, 0x5c, 0x6e, 0x2c, 0x87, 0xbf, 0xec, 0x13, 0x09, 0x04, 0x84, 0x7e, 0x70, 0xe6, 0x00, 0x54, 0x22, 0xbd, 0x30, 0x76, 0x18, 0xe3, 0x77, 0x0d, 0x05, 0x81, 0x8c, 0x9c, - 0x21, 0x45, 0x29, 0x2d, 0xea, 0xad, 0xcb, 0x84, 0xf9, 0x59, 0xe7, 0x94, 0x39, 0x20, 0x75, 0xbd, 0xf2, 0x9c, 0x8a, 0xf9, 0xa1, 0xce, 0xef, 0x6f, 0x48, 0x85, 0xdf, 0x1a, 0x1a, 0x8c, 0x85, 0x57, - 0x25, 0x61, 0x16, 0xff, 0xc7, 0xe6, 0xe4, 0xaf, 0xf2, 0xdf, 0xc3, 0xfb, 0xeb, 0xea, 0x54, 0xb3, 0xb2, 0x52, 0xd4, 0xb4, 0x99, 0x14, 0x9a, 0xc3, 0xf4, 0x92, 0xbc, 0xa7, 0x11, 0xc4, 0x5a, 0xae, - 0xb1, 0x2d, 0xd4, 0x90, 0x02, 0xb5, 0x4d, 0xe9, 0xae, 0x5e, 0x0e, 0xbe, 0x74, 0x58, 0xf5, 0x29, 0xe9, 0xec, 0x6b, 0x54, 0xa8, 0x83, 0x1d, 0x4a, 0xec, 0xad, 0x63, 0xdc, 0xbb, 0x24, 0xc4, 0x64, - 0x0b, 0x49, 0x67, 0x34, 0xae, 0xae, 0x7b, 0xc4, 0x53, 0x73, 0x87, 0x5a, 0x5a, 0x8a, 0x76, 0x84, 0xf4, 0x36, 0x7b, 0x6e, 0xe5, 0xfe, 0x06, 0xe3, 0x8f, 0x03, 0xfb, 0x73, 0xa9, 0x74, 0xf2, 0x71, - 0x3f, 0x34, 0x2f, 0xeb, 0xea, 0xf7, 0xb3, 0x07, 0xf9, 0xc4, 0xec, 0x71, 0x93, 0x08, 0xce, 0xee, 0x7f, 0x67, 0xc4, 0x17, 0xda, 0x8a, 0x6f, 0xd1, 0x35, 0xb9, 0x36, 0xc5, 0x48, 0x23, 0x24, 0x78, - 0x49, 0x62, 0x99, 0x15, 0x95, 0x22, 0x08, 0xda, 0xb8, 0x38, 0x6a, 0x35, 0x01, 0xe2, 0x65, 0x6b, 0xc7, 0x10, 0xce, 0xd2, 0x32, 0xe2, 0x2a, 0x3c, 0x3b, 0xb7, 0x94, 0xed, 0x6e, 0x68, 0x65, 0x1f, - 0x13, 0xe9, 0x0e, 0xec, 0x15, 0xb1, 0xc3, 0x46, 0x51, 0x71, 0xd6, 0xd9, 0xf2, 0x90, 0xad, 0xed, 0xe5, 0x2a, 0xb0, 0xb0, 0x3a, 0xb7, 0xf7, 0x03, 0x3e, 0x3e, 0xa2, 0xc1, 0xff, 0x01, 0x5d, 0x2b, - 0xea, 0xde, 0x66, 0x84, 0x0f, 0x7a, 0x46, 0x92, 0xbb, 0x56, 0x1d, 0xfc, 0xe3, 0x24, 0x79, 0xe6, 0xb9, 0xaf, 0x4e, 0x54, 0xec, 0x33, 0x83, 0xcf, 0xcb, 0x53, 0x4d, 0xd5, 0x66, 0x2f, 0x25, 0xae, - 0xae, 0x0f, 0x61, 0x9f, 0x26, 0x9f, 0xf7, 0x41, 0x03, 0x0f, 0x92, 0x6c, 0xdf, 0xd9, 0xf3, 0xae, 0x4f, 0x7c, 0x26, 0x63, 0xff, 0x6a, 0x7c, 0xfa, 0xa3, 0xd8, 0x96, 0x7b, 0x2b, 0x1f, 0xad, 0xa9, - 0xd4, 0x27, 0x0e, 0xa3, 0xe9, 0xbd, 0x6f, 0x45, 0x1d, 0x38, 0xbb, 0xfe, 0x7f, 0x46, 0x7d, 0xa9, 0x77, 0xf8, 0xd7, 0xa3, 0xde, 0x27, 0xf7, 0x0c, 0x92, 0x10, 0x00, 0xbf, 0x38, 0x08, 0xbd, 0x0f, - 0x90, 0x62, 0x6b, 0xe4, 0x8e, 0xad, 0x75, 0x8a, 0xec, 0x4a, 0x2d, 0x81, 0x82, 0x4d, 0xa5, 0x78, 0x47, 0xa1, 0x45, 0x78, 0xb6, 0x8f, 0xcf, 0x4e, 0x93, 0xb5, 0x36, 0x6c, 0xb5, 0x39, 0x0b, 0x18, - 0xb0, 0x66, 0x38, 0x29, 0x34, 0x5f, 0x1e, 0x45, 0xb2, 0x6c, 0xdb, 0xda, 0xa9, 0x2e, 0x65, 0x4a, 0x1f, 0x2c, 0x61, 0xbd, 0x04, 0x3f, 0xba, 0x20, 0xfe, 0xfa, 0x7e, 0x04, 0xfc, 0xf5, 0x70, 0x14, - 0xdc, 0xee, 0xdc, 0xe9, 0x73, 0x3d, 0xaf, 0x98, 0x79, 0x65, 0x6b, 0xdd, 0xf9, 0xe7, 0x3e, 0x97, 0x01, 0xb8, 0x3d, 0x78, 0x0b, 0xda, 0xae, 0x9d, 0xc0, 0x4b, 0xad, 0x59, 0x53, 0x59, 0x57, 0x20, - 0x7f, 0xe5, 0x06, 0x42, 0x9f, 0x9f, 0xfe, 0x3e, 0xe1, 0xf4, 0xae, 0xd8, 0x22, 0x9f, 0x1f, 0x6e, 0xab, 0xf0, 0x6e, 0xa6, 0xbe, 0x8f, 0x81, 0x09, 0xca, 0xd2, 0x83, 0x1f, 0xf3, 0xa8, 0xab, 0xbf, - 0xfe, 0xc4, 0xa9, 0x5d, 0xfd, 0xdd, 0x8b, 0xc0, 0xd9, 0xb7, 0x97, 0xbf, 0xe1, 0x4e, 0xfe, 0xeb, 0xd1, 0x60, 0xd8, 0x89, 0x14, 0x28, 0xcf, 0x33, 0x54, 0x8f, 0xf4, 0x60, 0x63, 0x66, 0x70, 0x22, - 0x04, 0x31, 0x6b, 0xd1, 0xcb, 0xa3, 0xa4, 0x2a, 0x7b, 0x3d, 0xd2, 0x82, 0x13, 0xb6, 0xa0, 0x41, 0x25, 0x93, 0x3a, 0x6a, 0xe8, 0xce, 0x65, 0x53, 0x16, 0xb4, 0x3e, 0xdf, 0x48, 0x58, 0xaa, 0xec, - 0x87, 0xc3, 0x00, 0x2b, 0x49, 0x8e, 0x35, 0xe5, 0xc5, 0x2b, 0x6d, 0xa8, 0x96, 0x92, 0xaa, 0xb5, 0xa4, 0x11, 0x75, 0xdb, 0xe7, 0x99, 0x59, 0x1a, 0xeb, 0x37, 0xa5, 0x53, 0x60, 0xf4, 0x89, 0x2d, - 0xe4, 0x55, 0xe2, 0x6d, 0x7e, 0xbc, 0x55, 0x4c, 0xb9, 0x8a, 0xf8, 0x79, 0x7e, 0x84, 0x40, 0x03, 0x81, 0xe4, 0x5e, 0xd9, 0xa8, 0xf1, 0xde, 0x39, 0x2e, 0x0f, 0x21, 0x46, 0xd3, 0x87, 0x1a, 0x90, - 0xe8, 0x9d, 0x69, 0xf6, 0xa5, 0xcc, 0x5b, 0x61, 0xc1, 0x2d, 0x57, 0x7d, 0x01, 0x43, 0xee, 0x5e, 0x0c, 0x8b, 0x53, 0x77, 0x30, 0x7b, 0x55, 0x5d, 0x86, 0x10, 0x6c, 0x80, 0x52, 0x9c, 0x6c, 0xb8, - 0x71, 0xcd, 0xb3, 0xc1, 0xc6, 0x89, 0x72, 0x27, 0x06, 0x18, 0x3e, 0x5b, 0xf8, 0x02, 0xfd, 0xff, 0xa6, 0x22, 0xe6, 0xdb, 0x07, 0xf1, 0x2f, 0xfc, 0x79, 0x37, 0x77, 0xb7, 0x22, 0xb9, 0x2f, 0x37, - 0x3f, 0x4d, 0x6c, 0x6e, 0xde, 0x84, 0xe7, 0x2c, 0xbf, 0x97, 0x98, 0xf8, 0x17, 0xfa, 0xac, 0x94, 0xf9, 0x79, 0x35, 0xf3, 0xac, 0x3b, 0x7d, 0xc5, 0xbf, 0xd7, 0x0d, 0xf5, 0xc7, 0x72, 0x9b, 0x6d, - 0x76, 0x2f, 0x22, 0xf9, 0x6a, 0xc2, 0xfa, 0xfa, 0xf2, 0xd7, 0x14, 0xac, 0x7f, 0xc9, 0x5b, 0x79, 0xac, 0x77, 0x77, 0x02, 0xab, 0x7e, 0xfb, 0x49, 0x1f, 0xa4, 0x86, 0x59, 0xe0, 0x55, 0xe1, 0x9d, - 0x95, 0xe4, 0x5f, 0xe4, 0x83, 0x05, 0xf1, 0xee, 0x11, 0x78, 0xb3, 0xdf, 0xdc, 0xfe, 0xed, 0x7b, 0x2e, 0xa9, 0xbf, 0xd3, 0x30, 0x0b, 0xd3, 0xf0, 0x4e, 0x2b, 0xf3, 0xef, 0x75, 0x13, 0xf1, 0xe1, - 0xee, 0xd7, 0x60, 0xd9, 0x7f, 0x3f, 0x96, 0x2b, 0xff, 0x35, 0x66, 0x5e, 0x5b, 0xf3, 0xf5, 0xee, 0x4b, 0xae, 0xec, 0x15, 0x8e, 0x6f, 0x17, 0x89, 0xaf, 0x5e, 0x85, 0xfb, 0x2f, 0xf9, 0x58, 0x48, - 0xf4, 0x53, 0x66, 0x2a, 0xf5, 0x40, 0x19, 0x78, 0x23, 0xfa, 0xfd, 0x6e, 0xb8, 0x43, 0x4f, 0x95, 0x71, 0x7e, 0x91, 0x79, 0x1d, 0xf0, 0xf7, 0xa3, 0x19, 0x34, 0xad, 0x74, 0x33, 0xc0, 0x41, 0x82, - 0x70, 0x8e, 0xa2, 0x7c, 0xbe, 0x30, 0x75, 0x44, 0xf4, 0xdd, 0x4e, 0xf6, 0xd7, 0x80, 0xc8, 0x0b, 0xcb, 0x6a, 0x48, 0xf4, 0x83, 0xe1, 0x39, 0x38, 0x63, 0xc9, 0x86, 0x0c, 0xfb, 0x1e, 0xb1, 0x19, - 0x03, 0x1f, 0x02, 0xfd, 0x43, 0xba, 0x85, 0x6c, 0x36, 0x34, 0x61, 0x96, 0x5a, 0x1c, 0x09, 0x87, 0xd3, 0x13, 0x44, 0x28, 0x92, 0x66, 0x5f, 0x34, 0x97, 0x48, 0xe7, 0xb5, 0x55, 0xcc, 0x4f, 0xc8, - 0xf3, 0xb0, 0xc3, 0xac, 0xa9, 0xbc, 0xbb, 0xf1, 0xf3, 0x6e, 0x22, 0xfd, 0x1e, 0x2b, 0x6f, 0x68, 0x66, 0xbf, 0xd3, 0x9e, 0x9e, 0xe3, 0x4f, 0xf9, 0x25, 0xf6, 0x8a, 0xd8, 0xdb, 0xc9, 0x14, 0xee, - 0x14, 0x78, 0xe6, 0xc3, 0x64, 0xbe, 0x21, 0x08, 0x5a, 0x3d, 0xfb, 0xf4, 0xb2, 0x13, 0xfc, 0x43, 0x7e, 0xac, 0x65, 0x0a, 0x48, 0x1c, 0x61, 0xff, 0xb3, 0x0f, 0xf1, 0x73, 0x4d, 0x96, 0xff, 0x4e, - 0x17, 0xff, 0x20, 0xf9, 0xda, 0xac, 0xf7, 0xe7, 0x53, 0xf5, 0xef, 0xd8, 0x62, 0xca, 0x14, 0x66, 0x56, 0xc7, 0x79, 0x51, 0xa0, 0x3b, 0xbd, 0x57, 0x28, 0x94, 0x42, 0xb4, 0xb5, 0x9d, 0x15, 0x7a, - 0xa6, 0xc4, 0xbb, 0xf9, 0xc0, 0xed, 0xe6, 0xee, 0xbe, 0x41, 0x17, 0x08, 0xe0, 0xa6, 0x7a, 0xa8, 0x51, 0x3a, 0x7c, 0x90, 0xfa, 0x94, 0x95, 0x06, 0x7a, 0x55, 0xad, 0xf6, 0x18, 0x29, 0xd9, 0x81, - 0x39, 0x27, 0xb6, 0xc4, 0x18, 0x98, 0x3b, 0xbd, 0x1d, 0x97, 0x92, 0x40, 0x4e, 0x19, 0x0e, 0x0f, 0xea, 0xe2, 0x7c, 0x3f, 0x26, 0xde, 0x3e, 0xb3, 0x47, 0xe0, 0xfd, 0x79, 0x96, 0xd4, 0x8b, 0xcc, - 0x3b, 0x6c, 0xd7, 0xa3, 0x1b, 0x60, 0x3f, 0xe4, 0x49, 0xc1, 0x33, 0xc6, 0x3d, 0x6e, 0x41, 0xa2, 0xa4, 0x76, 0x7a, 0x72, 0xae, 0x6d, 0x27, 0x5e, 0x9d, 0x60, 0x80, 0xc9, 0xad, 0x10, 0xf3, 0xd5, - 0x09, 0x43, 0x21, 0xcc, 0xc6, 0xdf, 0x50, 0xa1, 0xc2, 0x1f, 0x0b, 0x19, 0x4f, 0x6e, 0xc9, 0x8b, 0xd4, 0x6b, 0x53, 0x5e, 0x0e, 0x67, 0x77, 0x51, 0x3f, 0xf7, 0xbe, 0xdd, 0x0a, 0x9b, 0x4b, 0x4f, - 0x16, 0x45, 0x39, 0xa6, 0xad, 0x84, 0x16, 0x0d, 0x0c, 0x45, 0xeb, 0x18, 0x24, 0xf6, 0xa2, 0x67, 0x0a, 0x76, 0xe8, 0x86, 0x81, 0xb8, 0x57, 0x81, 0x1d, 0x51, 0xe7, 0x67, 0x96, 0x58, 0x65, 0x8b, - 0x0b, 0x07, 0x95, 0x0d, 0xa3, 0x6d, 0xd6, 0x6d, 0xd0, 0xc3, 0x03, 0xea, 0x8e, 0xbb, 0xf3, 0x49, 0x00, 0xf9, 0x23, 0xb7, 0x31, 0xeb, 0x23, 0x4f, 0xc1, 0xc0, 0xb8, 0xbc, 0x08, 0x5f, 0xe2, 0x02, - 0x9a, 0xfc, 0x25, 0xb9, 0xa5, 0xb2, 0xb2, 0xf3, 0xa3, 0xef, 0x1a, 0x7f, 0xca, 0xa7, 0xf1, 0x51, 0xf4, 0x15, 0x82, 0x0f, 0x17, 0x66, 0xf8, 0x34, 0xdf, 0x06, 0x81, 0xcb, 0x64, 0x78, 0x21, 0x74, - 0x7c, 0x5c, 0x55, 0xb0, 0xd3, 0x3b, 0xe7, 0x6e, 0x3f, 0xd8, 0xf6, 0xa6, 0x27, 0xd5, 0x18, 0x3d, 0x4b, 0x23, 0xee, 0x6e, 0xdc, 0xc6, 0xc4, 0x2a, 0xa6, 0xf3, 0x84, 0x32, 0xa8, 0xdc, 0xad, 0x0c, - 0x08, 0x21, 0xb8, 0x1e, 0x88, 0x66, 0xe4, 0xa1, 0xdd, 0xca, 0x06, 0x10, 0x6e, 0x39, 0x66, 0xde, 0x52, 0xdc, 0x86, 0x5c, 0x59, 0xd1, 0xcc, 0xf2, 0xb0, 0x8b, 0xa9, 0xfa, 0x39, 0xeb, 0x4a, 0x58, - 0xcf, 0xb2, 0x36, 0xb5, 0xbd, 0x9f, 0xb7, 0x98, 0x79, 0xfb, 0xb0, 0xe2, 0xda, 0x73, 0x24, 0x33, 0x37, 0x89, 0x37, 0x0c, 0x5b, 0x27, 0x98, 0x4a, 0x30, 0xa3, 0x2d, 0x06, 0x4a, 0x1d, 0xf1, 0xa3, - 0xd0, 0x48, 0x07, 0xa5, 0xd9, 0x94, 0x80, 0x08, 0xa1, 0x60, 0xcd, 0x33, 0x95, 0xbe, 0x14, 0xd6, 0x43, 0xcf, 0x38, 0x65, 0x7b, 0x90, 0x11, 0x07, 0x43, 0x05, 0x0f, 0x42, 0xc1, 0x79, 0xed, 0x55, - 0xd1, 0x7e, 0xb1, 0xb9, 0x34, 0x91, 0x72, 0x21, 0xd8, 0x78, 0xeb, 0x5d, 0xe6, 0x0c, 0x18, 0x24, 0xde, 0x48, 0xeb, 0xc7, 0x05, 0x27, 0xf4, 0xbd, 0xa9, 0xf6, 0xf3, 0xe4, 0xb9, 0x0d, 0x7c, 0x96, - 0x17, 0xcd, 0x9b, 0x42, 0xf1, 0x88, 0xe6, 0xec, 0xe6, 0xa9, 0xcf, 0xbc, 0xfe, 0x56, 0xfe, 0xf3, 0x21, 0x7c, 0x4f, 0x8d, 0xc5, 0xf7, 0x92, 0xaf, 0x30, 0xbe, 0x3f, 0x9f, 0x1c, 0x36, 0x06, 0xcb, - 0xc7, 0x9a, 0x46, 0x1b, 0xa3, 0xda, 0xd4, 0x02, 0x17, 0x6f, 0xe3, 0xcb, 0x9a, 0x05, 0xfa, 0x39, 0x8b, 0xac, 0xc6, 0xc1, 0xd7, 0xb9, 0x1c, 0x53, 0xc7, 0xad, 0x83, 0x15, 0xac, 0x00, 0x00, 0xac, - 0x18, 0x65, 0x25, 0xb4, 0xde, 0x1e, 0x88, 0xf9, 0x11, 0x15, 0x49, 0x17, 0x04, 0xcf, 0x7c, 0xc5, 0xf2, 0xfd, 0x88, 0x21, 0x73, 0x3b, 0x6f, 0x65, 0xaf, 0x76, 0xae, 0x9a, 0x92, 0x0a, 0x3c, 0x72, - 0x6b, 0x7e, 0xc4, 0xa5, 0x9e, 0x65, 0x8f, 0xf9, 0xdf, 0xe7, 0x4f, 0x45, 0x80, 0xbe, 0xc8, 0xbc, 0x62, 0x71, 0x3f, 0x9a, 0xcd, 0xa7, 0xc5, 0x7d, 0x06, 0x72, 0xd2, 0x90, 0x26, 0xbd, 0x5c, 0x29, - 0x7b, 0xce, 0x87, 0x50, 0x11, 0xc1, 0xd1, 0xb1, 0x11, 0x0c, 0xd4, 0x5d, 0xdb, 0xdc, 0x8e, 0xab, 0xe8, 0x72, 0x5e, 0x6e, 0xd6, 0x9a, 0x6a, 0xcc, 0xf5, 0xb5, 0x91, 0xc0, 0x17, 0xb2, 0x37, 0xb2, - 0xf3, 0xa1, 0x42, 0xa5, 0x3d, 0x3e, 0xa4, 0x6d, 0x48, 0xe5, 0x08, 0x6d, 0x0d, 0xb5, 0xb4, 0x1b, 0x36, 0x97, 0xc8, 0xf2, 0x05, 0x35, 0xd4, 0x16, 0x39, 0xcc, 0x3e, 0x69, 0xb7, 0xa8, 0x5e, 0x0d, - 0x42, 0x9f, 0x1c, 0x1a, 0x4e, 0xe5, 0x59, 0x8d, 0xf7, 0x61, 0x0d, 0x83, 0x3f, 0x3f, 0xf3, 0x56, 0x24, 0x06, 0xfb, 0xe2, 0x5d, 0xb1, 0x62, 0xef, 0x5e, 0x9e, 0xf6, 0xed, 0x5f, 0x7e, 0x2a, 0xf5, - 0xf6, 0x4d, 0x6c, 0xf4, 0x75, 0x95, 0xc4, 0xff, 0x81, 0xc9, 0xf7, 0x0f, 0x8e, 0xef, 0x22, 0x74, 0xbf, 0x1f, 0xf0, 0xf5, 0xa3, 0xa0, 0x0b, 0xe8, 0x1f, 0xe4, 0xa9, 0x05, 0xa7, 0x76, 0x6f, 0x3d, - 0xea, 0xce, 0xee, 0x02, 0x7e, 0xee, 0xce, 0x9a, 0x01, 0x6a, 0x0a, 0x06, 0x11, 0x4b, 0xc4, 0x14, 0x25, 0x08, 0xd3, 0x25, 0xd3, 0x34, 0x2e, 0x36, 0x14, 0x8b, 0x9d, 0xad, 0xb2, 0x5a, 0x96, 0x8b, - 0x87, 0x75, 0x0c, 0xe6, 0x54, 0xbc, 0xa4, 0x56, 0x31, 0x82, 0x46, 0x49, 0xe4, 0x29, 0x3b, 0x2d, 0xaa, 0x07, 0x76, 0x9b, 0x4a, 0xa9, 0x21, 0xb4, 0xc2, 0x71, 0x37, 0xaf, 0x7b, 0xa5, 0x81, 0x6d, - 0x22, 0xd4, 0x7d, 0x55, 0x3f, 0x3a, 0xc7, 0xf0, 0x49, 0x32, 0x89, 0xff, 0x7d, 0xfd, 0xf5, 0x37, 0xb2, 0x69, 0xa7, 0x0a, 0x5f, 0xa6, 0x0b, 0xec, 0x1f, 0xea, 0x73, 0xbc, 0x4b, 0x12, 0x66, 0xcd, - 0x0b, 0xb3, 0x7a, 0xe3, 0x55, 0xb3, 0x5b, 0xed, 0xa2, 0xf1, 0xfb, 0x71, 0x70, 0xdd, 0x1b, 0xd9, 0xf7, 0x7b, 0xb7, 0xe2, 0x8c, 0x9f, 0x9c, 0x68, 0x79, 0x7f, 0xbb, 0x35, 0xff, 0xbc, 0xcd, 0xf8, - 0x58, 0x4d, 0xf8, 0x1b, 0x63, 0xd5, 0x47, 0xee, 0xd2, 0xdf, 0x2f, 0x05, 0x75, 0x12, 0xda, 0x8f, 0xb4, 0x8a, 0x7f, 0xe0, 0xe7, 0x3a, 0x39, 0x09, 0xed, 0x5b, 0x37, 0x27, 0xa1, 0x3d, 0xbb, 0x0b, - 0xf9, 0xb9, 0xa3, 0xf5, 0x2c, 0x44, 0xf1, 0x1d, 0x7f, 0x89, 0xce, 0x62, 0xd5, 0x7b, 0xdd, 0x58, 0xaf, 0x8f, 0x4b, 0xba, 0x6a, 0x04, 0xa6, 0x90, 0xbb, 0xd1, 0xa3, 0x2e, 0x27, 0x10, 0x5a, 0x61, - 0xab, 0xd1, 0xc8, 0x30, 0x54, 0x26, 0x41, 0xb2, 0xec, 0xf6, 0xbd, 0x1c, 0xcc, 0x17, 0x5c, 0xbc, 0xf6, 0x7a, 0x5b, 0x6c, 0x93, 0x53, 0xd6, 0xd8, 0xe1, 0x39, 0x75, 0x8e, 0x64, 0xe5, 0xea, 0xe8, - 0x62, 0x97, 0xcf, 0x7b, 0x65, 0x3b, 0x25, 0x95, 0xa0, 0xb9, 0xf7, 0x98, 0x93, 0x67, 0x7e, 0x78, 0x9e, 0xfd, 0x50, 0xf1, 0xeb, 0x1e, 0xbe, 0xf4, 0x14, 0x24, 0x5f, 0xdf, 0xf1, 0x82, 0xd1, 0xd7, - 0x1b, 0xb3, 0xfb, 0x6b, 0x7e, 0x06, 0x6d, 0x90, 0xfb, 0xb9, 0x7c, 0xde, 0xc9, 0x02, 0x87, 0x86, 0xbc, 0x32, 0xa4, 0x3c, 0xc9, 0x68, 0x15, 0xb0, 0xb2, 0xc0, 0xc3, 0xa5, 0xea, 0xfc, 0x75, 0x13, - 0xb1, 0x0d, 0x2e, 0x2c, 0x12, 0x02, 0x3e, 0xc7, 0x88, 0xba, 0xe0, 0x40, 0x66, 0x31, 0x8f, 0x97, 0xba, 0x12, 0x75, 0xc0, 0x30, 0x6e, 0x54, 0xb8, 0x52, 0x9b, 0xcc, 0x1a, 0x05, 0x4f, 0x54, 0x4f, - 0xdb, 0x85, 0x23, 0xea, 0x94, 0x09, 0x93, 0x19, 0x33, 0x0d, 0xb4, 0xb6, 0x09, 0x1f, 0x16, 0x89, 0x43, 0xff, 0x41, 0x9e, 0x52, 0x22, 0xee, 0x42, 0x6f, 0xb0, 0xdc, 0x8e, 0x66, 0x77, 0x41, 0x3f, - 0xe3, 0x90, 0xae, 0x79, 0x1e, 0x0d, 0x55, 0x5d, 0x00, 0x50, 0x95, 0x25, 0x06, 0x01, 0x8f, 0x21, 0x79, 0x15, 0xf0, 0x8a, 0xba, 0xe0, 0xe5, 0xc5, 0xb2, 0x03, 0x01, 0x25, 0x5e, 0x49, 0x45, 0xa4, - 0x68, 0xc3, 0x30, 0x20, 0x24, 0xcf, 0x2b, 0x8b, 0x34, 0xa5, 0x09, 0x88, 0x9e, 0x17, 0x67, 0x49, 0xed, 0xc4, 0x90, 0xe2, 0xf8, 0x40, 0x11, 0xe5, 0x55, 0x1a, 0x2d, 0x14, 0xf9, 0x52, 0x23, 0x1a, - 0x29, 0xc1, 0xd2, 0x73, 0xb3, 0xc4, 0xeb, 0x07, 0x75, 0x9d, 0x98, 0x1f, 0x92, 0xda, 0xde, 0xd8, 0x6f, 0x9d, 0xc0, 0x73, 0x1e, 0xd5, 0xc4, 0x80, 0x3e, 0x98, 0x7b, 0x27, 0x03, 0xf8, 0x26, 0xf6, - 0x95, 0x84, 0xf9, 0x76, 0x32, 0x83, 0xbe, 0x18, 0x7e, 0xbf, 0xff, 0x04, 0x13, 0x4f, 0xcd, 0x9d, 0x79, 0xdb, 0x73, 0x7a, 0x19, 0x69, 0xbd, 0x6e, 0xa9, 0x47, 0x93, 0x4e, 0x2f, 0xa2, 0xc3, 0x9a, - 0x38, 0x85, 0x53, 0x7b, 0x1a, 0xe9, 0xba, 0x01, 0x56, 0x2b, 0x7c, 0xd8, 0x38, 0xe1, 0xa0, 0x6f, 0x64, 0x80, 0x12, 0x32, 0x96, 0x39, 0x2b, 0x45, 0xa2, 0xa2, 0x50, 0x5b, 0x13, 0x8d, 0x57, 0xba, - 0x49, 0x1d, 0xb3, 0x7e, 0x0b, 0x58, 0x1e, 0xc6, 0x93, 0x73, 0x29, 0x7f, 0x32, 0x49, 0xf4, 0x43, 0x1d, 0xc2, 0x3b, 0xd1, 0xcc, 0xef, 0xa0, 0xf4, 0x7f, 0x67, 0x23, 0xa1, 0x9e, 0x99, 0xc3, 0x1e, - 0xb0, 0x59, 0x53, 0x53, 0xa6, 0x32, 0xcc, 0xb5, 0x2f, 0x9b, 0x4b, 0xd9, 0x45, 0xcd, 0x39, 0x14, 0xf1, 0xaa, 0x87, 0x63, 0xbc, 0x5a, 0xad, 0x9b, 0x05, 0xbd, 0xe3, 0x53, 0xb7, 0x75, 0x03, 0x6e, - 0x5c, 0xac, 0xac, 0x68, 0x07, 0xc1, 0xfe, 0x6a, 0x0c, 0x2c, 0x7a, 0x13, 0xd4, 0x39, 0xbf, 0x1b, 0x89, 0x91, 0x04, 0x36, 0xbb, 0x39, 0xba, 0xf1, 0x0b, 0xb6, 0xe9, 0x8d, 0x79, 0x58, 0x86, 0x64, - 0xcc, 0x00, 0x43, 0xcf, 0x07, 0xfb, 0x7a, 0xb7, 0x9d, 0x12, 0x35, 0xfe, 0x61, 0x71, 0xfa, 0xde, 0x3e, 0x8a, 0x3c, 0x11, 0x8e, 0xf7, 0x4b, 0xec, 0x0b, 0x1a, 0xf7, 0x93, 0x5b, 0xb8, 0xf1, 0x84, - 0x70, 0xbb, 0x13, 0xe0, 0x75, 0x89, 0xb1, 0x36, 0xb3, 0x7d, 0x6c, 0x5d, 0xa8, 0xa3, 0xb2, 0x68, 0x87, 0x23, 0x3d, 0x47, 0x46, 0x73, 0x21, 0xe7, 0x4d, 0x85, 0xaf, 0x01, 0x2d, 0xd8, 0x93, 0x36, - 0x83, 0x06, 0xa6, 0x9a, 0xb9, 0x03, 0xde, 0x70, 0x92, 0x05, 0xfb, 0xed, 0xf2, 0xec, 0x1d, 0xa2, 0x81, 0xbe, 0x88, 0xb0, 0x12, 0xee, 0xf0, 0xcd, 0xa5, 0xb3, 0xdc, 0x8d, 0x7e, 0x3c, 0x79, 0x7e, - 0xdb, 0xf6, 0xe6, 0x52, 0x99, 0x32, 0x49, 0xb5, 0x99, 0x9d, 0x0f, 0xb3, 0xa2, 0x0a, 0xd3, 0xb0, 0x09, 0x7f, 0x43, 0x9c, 0xf8, 0x0c, 0x37, 0xd6, 0x27, 0xd9, 0xe0, 0xec, 0xf3, 0x95, 0x9b, 0x81, - 0x7d, 0x82, 0x51, 0x8d, 0x80, 0x0b, 0x39, 0x59, 0x32, 0xf3, 0x00, 0x87, 0x4f, 0x79, 0xe5, 0x8d, 0x5b, 0x68, 0xa1, 0x78, 0xa1, 0xeb, 0x89, 0xa8, 0xc8, 0xf0, 0x22, 0x9f, 0x05, 0x04, 0x70, 0x9a, - 0x0b, 0x10, 0x85, 0xa2, 0x70, 0x58, 0x94, 0xc4, 0x9e, 0x92, 0x58, 0xdd, 0x34, 0xc2, 0x52, 0x26, 0x32, 0xb0, 0xb1, 0xd7, 0x03, 0x56, 0xe3, 0x9b, 0x79, 0xab, 0x04, 0xce, 0xe8, 0x11, 0x8b, 0xca, - 0x8e, 0xc3, 0x4b, 0xbc, 0x60, 0x9e, 0xfb, 0xe8, 0x7e, 0x08, 0x46, 0x0c, 0xac, 0x7a, 0x66, 0x87, 0xe7, 0xf0, 0x95, 0x2f, 0xfa, 0xdb, 0x07, 0xea, 0x31, 0xb5, 0xf3, 0xe4, 0xd7, 0x03, 0x1f, 0x94, - 0xa3, 0x3e, 0x08, 0x9d, 0x60, 0x66, 0xe7, 0x83, 0xe7, 0x7e, 0xe8, 0x96, 0x57, 0x59, 0xdf, 0x7e, 0xe0, 0x6d, 0xe6, 0x7a, 0x7e, 0x6d, 0xf9, 0x8f, 0x09, 0x7f, 0xde, 0x9b, 0x80, 0xa7, 0xf7, 0xdf, - 0x8b, 0xd4, 0x5b, 0xcf, 0xbd, 0x1c, 0xdf, 0x98, 0x49, 0xf0, 0x9f, 0xfb, 0x4c, 0x1b, 0xa4, 0xdd, 0xb2, 0xaa, 0xeb, 0x85, 0x48, 0x1d, 0x0f, 0xb2, 0x52, 0xee, 0xf0, 0x55, 0x5a, 0x47, 0xa7, 0xaa, - 0xee, 0x30, 0x9a, 0xd2, 0x61, 0x64, 0x8b, 0xd1, 0xd5, 0x22, 0x0c, 0xad, 0xb1, 0x43, 0x99, 0x71, 0xe4, 0x50, 0x33, 0xd9, 0x9c, 0x89, 0x71, 0xac, 0xdb, 0xf6, 0x60, 0xb8, 0x66, 0x7d, 0xba, 0xa0, - 0x47, 0xde, 0x39, 0x9e, 0x11, 0xdf, 0x05, 0x41, 0x35, 0x72, 0xb1, 0xe5, 0xfa, 0x04, 0x87, 0x53, 0x3e, 0xf0, 0x37, 0xdf, 0xd3, 0xf7, 0x1f, 0xf7, 0x33, 0x6b, 0xc6, 0x5d, 0xe4, 0x15, 0x85, 0xdb, - 0xc1, 0x0c, 0x9b, 0xb6, 0x56, 0x2c, 0xa0, 0x51, 0x39, 0x5e, 0x0c, 0x57, 0x5d, 0x2e, 0xb3, 0x79, 0x06, 0xb0, 0x18, 0xc0, 0x05, 0xd8, 0xb8, 0x61, 0x1a, 0x71, 0xef, 0x58, 0xdb, 0x3a, 0x35, 0x16, - 0x4c, 0x7d, 0x3c, 0x70, 0xd4, 0x19, 0x94, 0xbc, 0x88, 0x5f, 0xe4, 0xae, 0xb0, 0x47, 0x36, 0x6b, 0x7f, 0x87, 0xda, 0x22, 0x19, 0xa9, 0xb5, 0xa2, 0x67, 0x6e, 0x5e, 0x1c, 0x49, 0x69, 0xa3, 0x6b, - 0xae, 0x51, 0x3a, 0xb0, 0x1f, 0xa5, 0x27, 0x62, 0x42, 0xce, 0xec, 0xbb, 0x62, 0x63, 0xaf, 0x99, 0x48, 0xdf, 0x8f, 0x9a, 0x26, 0x7c, 0x44, 0x32, 0x72, 0x4b, 0xfd, 0x79, 0x62, 0xc4, 0x34, 0x61, - 0x72, 0x85, 0xa9, 0x09, 0x93, 0xd9, 0x5d, 0xc4, 0xcf, 0x28, 0xc5, 0xa6, 0x0f, 0xf2, 0x44, 0xb0, 0xda, 0x54, 0xda, 0x7a, 0x43, 0xe8, 0xa5, 0xc4, 0xaa, 0x61, 0x28, 0x5a, 0x00, 0x39, 0xef, 0x57, - 0x20, 0x43, 0xed, 0x81, 0xdd, 0x72, 0x47, 0x6b, 0x4e, 0x12, 0x8f, 0x67, 0xd4, 0xc6, 0x5c, 0x24, 0x26, 0x6b, 0x68, 0xcf, 0x79, 0xc5, 0x2e, 0x0a, 0xe9, 0x85, 0x03, 0x58, 0x0a, 0xba, 0x83, 0x65, - 0x7a, 0x5c, 0x0b, 0x64, 0x41, 0xa8, 0x8e, 0x60, 0x10, 0x42, 0x5a, 0x65, 0x13, 0x4c, 0xa4, 0xef, 0x3d, 0x28, 0xff, 0x83, 0x7c, 0xf1, 0xaf, 0xd4, 0x33, 0xab, 0x3a, 0xb7, 0xa9, 0xf7, 0xfe, 0x4b, - 0xfe, 0xec, 0x63, 0x39, 0x7b, 0x99, 0x57, 0x59, 0x4d, 0x5e, 0xcd, 0x5e, 0x9d, 0x3c, 0x6f, 0x8f, 0x92, 0x9f, 0x1e, 0xbd, 0x2e, 0x09, 0xee, 0xcc, 0xaa, 0x2a, 0xeb, 0x65, 0x2f, 0xf3, 0x39, 0x24, - 0xf1, 0xfe, 0xdd, 0x7f, 0xf7, 0xd8, 0xa3, 0x6f, 0xbe, 0x0d, 0x1f, 0xed, 0x3c, 0xa9, 0x7f, 0xd0, 0x67, 0xa6, 0xeb, 0x36, 0xbc, 0xee, 0x3c, 0xaf, 0x7f, 0x66, 0x37, 0x09, 0x3f, 0xf7, 0x1d, 0xb0, - 0x33, 0x6a, 0x64, 0xef, 0x89, 0xda, 0x08, 0x70, 0x1a, 0x2b, 0xad, 0xd2, 0xf9, 0x90, 0x65, 0xc4, 0x7a, 0xc9, 0x14, 0x50, 0x42, 0xee, 0x17, 0x0c, 0x99, 0x26, 0xd4, 0x45, 0x50, 0xd3, 0x2d, 0x30, - 0x47, 0xf7, 0xf8, 0x8e, 0x85, 0x76, 0xb9, 0xb3, 0xaa, 0xb2, 0x3e, 0x3e, 0xc6, 0xfa, 0x89, 0xdd, 0x85, 0x3a, 0x0a, 0xfa, 0xc5, 0x92, 0xb0, 0xfc, 0x03, 0xc5, 0x04, 0x36, 0x78, 0xbe, 0x90, 0x0a, - 0xe9, 0x7d, 0x31, 0x70, 0x76, 0xd4, 0xcc, 0xc9, 0xd3, 0x22, 0x4c, 0xbc, 0x37, 0x2a, 0xab, 0xff, 0xce, 0xcc, 0xff, 0x59, 0x38, 0x38, 0xfb, 0x72, 0x69, 0xaa, 0xb1, 0x3f, 0xa1, 0x92, 0xe5, 0x2a, - 0x15, 0x1c, 0xc1, 0x30, 0x03, 0x2c, 0xb3, 0xdb, 0x6c, 0x67, 0x76, 0xfb, 0xe5, 0xd6, 0xc1, 0x8b, 0x8e, 0x04, 0x94, 0x65, 0x6f, 0x51, 0x25, 0x28, 0xb8, 0xea, 0x40, 0xb5, 0x64, 0x52, 0x6b, 0x9d, - 0xcc, 0xf0, 0x69, 0x91, 0xbb, 0x5b, 0x7a, 0xbb, 0xeb, 0x63, 0x3a, 0xd8, 0x2e, 0x41, 0xd0, 0x65, 0x0d, 0x8c, 0xe2, 0xdb, 0xcd, 0x2a, 0x8d, 0x1a, 0x17, 0x53, 0x4e, 0x21, 0x53, 0x4d, 0x99, 0xf2, - 0x7e, 0x28, 0x0c, 0xf3, 0xc8, 0x06, 0xf7, 0xe7, 0x5a, 0xce, 0xef, 0x5e, 0x74, 0x05, 0xee, 0x37, 0xb7, 0x6f, 0x16, 0xba, 0x09, 0x9a, 0x10, 0x53, 0xf0, 0x29, 0xa2, 0x86, 0xe0, 0xb0, 0x23, 0xc1, - 0xf5, 0x9e, 0x5f, 0x36, 0x85, 0x39, 0xe4, 0x8a, 0xb6, 0x08, 0xcc, 0xb9, 0x09, 0xc5, 0x65, 0x33, 0x9e, 0x39, 0x4a, 0x5f, 0x9e, 0x77, 0x7b, 0xca, 0x4c, 0x98, 0x6c, 0x68, 0xf7, 0xa9, 0x16, 0x44, - 0x38, 0x41, 0x44, 0x94, 0xbf, 0xc3, 0x96, 0x2d, 0x0a, 0x6e, 0x53, 0x3b, 0xa8, 0x99, 0x9c, 0xf4, 0x1d, 0x7a, 0x5b, 0x62, 0xf5, 0x3c, 0x40, 0xc8, 0xd5, 0x73, 0x6b, 0xfd, 0xa7, 0xd4, 0xed, 0x47, - 0xa9, 0xc8, 0xbf, 0xc9, 0x5a, 0xfe, 0xf6, 0xc3, 0xbd, 0x7d, 0xe9, 0xbf, 0x59, 0xa8, 0xff, 0xfc, 0xcb, 0xbd, 0x49, 0x04, 0x67, 0xf7, 0xbf, 0x53, 0x09, 0xb9, 0x17, 0xc2, 0x06, 0x3d, 0x26, 0xf0, - 0x51, 0x43, 0xe5, 0x2e, 0x21, 0xa1, 0x04, 0x1d, 0x4b, 0xd4, 0x20, 0xb0, 0x10, 0xb0, 0xfa, 0xa2, 0xd7, 0xcb, 0x9a, 0x5b, 0x18, 0x5a, 0x1c, 0x97, 0x62, 0x93, 0xd9, 0xfa, 0xb9, 0x12, 0x19, 0x60, - 0x8c, 0xc8, 0x2a, 0xd0, 0xa0, 0xb8, 0x5d, 0x31, 0xc3, 0x65, 0x6b, 0x19, 0x3a, 0x17, 0xad, 0x34, 0x3c, 0x3f, 0x5b, 0x05, 0xbf, 0x13, 0x57, 0xfc, 0x4e, 0x8c, 0x42, 0xfb, 0xb9, 0xfd, 0x60, 0x58, - 0x7b, 0xc3, 0xaf, 0x30, 0xe9, 0xdf, 0xc1, 0xf6, 0x8d, 0x62, 0xf4, 0xdf, 0xe9, 0xab, 0xdf, 0xbe, 0xe1, 0x0d, 0xd6, 0x4f, 0xd7, 0xa7, 0xea, 0xae, 0x76, 0x6f, 0xba, 0x1d, 0x44, 0xf3, 0x42, 0x51, - 0x24, 0xac, 0x81, 0xf0, 0xa6, 0xa2, 0x13, 0xc7, 0x6e, 0x6c, 0x77, 0x64, 0x1e, 0x45, 0x15, 0x99, 0xf4, 0xf1, 0x99, 0x48, 0x13, 0xa8, 0xca, 0x37, 0xe3, 0xdc, 0xf0, 0xda, 0x43, 0x45, 0x6e, 0x0f, - 0x28, 0x89, 0x94, 0xc9, 0x4e, 0x83, 0x29, 0x75, 0x6f, 0x5c, 0xce, 0x06, 0x3f, 0xbf, 0x84, 0x9c, 0xe3, 0x55, 0x5a, 0x69, 0x4a, 0xe9, 0x2a, 0x9b, 0x9f, 0x76, 0xcf, 0xd9, 0x5a, 0xc3, 0x57, 0xdd, - 0xf4, 0x6d, 0x95, 0x82, 0x3f, 0xad, 0x52, 0x76, 0x9e, 0x27, 0x9e, 0x95, 0xcd, 0xee, 0x31, 0x00, 0x7f, 0x7f, 0x6b, 0x74, 0x7d, 0xf3, 0xa0, 0x7c, 0x7c, 0xea, 0xeb, 0xea, 0xf8, 0x2e, 0x48, 0xe8, - 0x4b, 0x08, 0x42, 0xf8, 0xaa, 0x05, 0xff, 0xfd, 0x4b, 0x09, 0xfe, 0x4d, 0xaf, 0x7f, 0x5c, 0x16, 0x1f, 0x18, 0x9d, 0xfe, 0xf9, 0x73, 0x0a, 0x8b, 0x2f, 0xd2, 0xdf, 0x7a, 0xfb, 0xdd, 0xb5, 0x5b, - 0x71, 0xd9, 0x09, 0xfc, 0x15, 0xfd, 0xdc, 0xc1, 0x86, 0x78, 0x20, 0x52, 0x39, 0x74, 0xfb, 0x82, 0x84, 0x29, 0xc8, 0x89, 0x0d, 0xcd, 0x17, 0xd3, 0x6e, 0x28, 0xa2, 0xc4, 0x6c, 0x37, 0xad, 0xbb, - 0x6b, 0x18, 0x1f, 0xdb, 0x81, 0xcd, 0x91, 0x56, 0x17, 0xd4, 0x69, 0x6b, 0xeb, 0x08, 0x5e, 0x9a, 0x39, 0x5d, 0x57, 0x0d, 0xd7, 0x1a, 0xbb, 0x8c, 0xeb, 0xd1, 0xc2, 0x82, 0x68, 0xfd, 0x6c, 0x73, - 0xbc, 0xb2, 0xa0, 0xc0, 0x95, 0xe3, 0x4d, 0x50, 0x64, 0xac, 0xce, 0x0a, 0x93, 0x9b, 0xbb, 0xfd, 0xdd, 0x8f, 0xae, 0xbf, 0xc7, 0xfd, 0x87, 0xed, 0xcb, 0xfb, 0x48, 0x96, 0xff, 0xf9, 0x12, 0xc9, - 0x72, 0xce, 0x0b, 0xf7, 0xfb, 0xa1, 0x73, 0xdd, 0xd5, 0x34, 0xf9, 0xbd, 0xc3, 0x1b, 0xeb, 0x57, 0x9f, 0x7f, 0x1e, 0x38, 0xdf, 0xa9, 0x37, 0x8f, 0x3c, 0x49, 0x7d, 0x5e, 0xb9, 0xb3, 0xbe, 0x7a, - 0x48, 0xe6, 0xf2, 0x5c, 0x49, 0xd4, 0x37, 0xa9, 0xd7, 0x9e, 0x7e, 0x3d, 0x9e, 0x5a, 0x06, 0x75, 0x7d, 0x01, 0xd3, 0x6a, 0xd7, 0x87, 0xcd, 0x4e, 0x09, 0xc0, 0xb5, 0x4a, 0x37, 0x22, 0x78, 0x3a, - 0x82, 0xf8, 0x69, 0x0d, 0x8c, 0x67, 0x86, 0x60, 0x4e, 0x64, 0x6a, 0xf0, 0x26, 0xdd, 0xac, 0xa5, 0xca, 0xae, 0x29, 0x95, 0x4c, 0x3a, 0xf9, 0x40, 0x0c, 0x3e, 0xb9, 0xda, 0xf2, 0x22, 0x0b, 0xb5, - 0x1a, 0xcc, 0x6f, 0x97, 0x09, 0xb4, 0x26, 0x21, 0xf8, 0x8c, 0x9a, 0x5c, 0x5b, 0x03, 0x69, 0xbb, 0xc2, 0xbb, 0x29, 0x74, 0x4d, 0xd7, 0x1f, 0x59, 0x3c, 0x1e, 0xfa, 0x4f, 0x4d, 0x76, 0x37, 0x91, - 0x57, 0x14, 0x6e, 0x07, 0x53, 0xa6, 0x33, 0x78, 0xd6, 0x1c, 0xf6, 0xf3, 0xe8, 0x42, 0x2e, 0xca, 0x48, 0x1f, 0x76, 0xb1, 0xc1, 0x76, 0x34, 0xb4, 0xdf, 0xb5, 0x22, 0xdf, 0x14, 0xd4, 0xcf, 0x8d, - 0x18, 0x9a, 0xc7, 0x09, 0xaa, 0xd8, 0x53, 0x6d, 0xb8, 0x49, 0x04, 0x67, 0xf7, 0xbf, 0x37, 0x92, 0xa9, 0x09, 0x13, 0xb2, 0xc0, 0x1b, 0x2a, 0x1c, 0xd2, 0xfa, 0x56, 0x57, 0xcf, 0xb4, 0x9e, 0xcd, - 0x55, 0x25, 0x0a, 0x5b, 0x40, 0xd4, 0x82, 0x51, 0xd5, 0xd7, 0x75, 0xe7, 0x17, 0x64, 0xea, 0xb4, 0x46, 0x3a, 0x77, 0x0f, 0x2a, 0xcf, 0x43, 0xe0, 0x32, 0x6a, 0x2a, 0xb5, 0x67, 0xe9, 0x81, 0xa1, - 0x10, 0x30, 0x5d, 0x6a, 0x76, 0x23, 0xd4, 0x5c, 0xc4, 0x6e, 0x2c, 0x17, 0xea, 0x37, 0x75, 0xee, 0x62, 0x97, 0xea, 0x48, 0xaf, 0xbe, 0xb0, 0x87, 0x8e, 0x56, 0x92, 0x84, 0x0f, 0x0d, 0x6e, 0xcf, - 0xb1, 0x6b, 0xbd, 0xc8, 0x04, 0x67, 0xaf, 0x47, 0x53, 0x79, 0xb5, 0xd0, 0xde, 0xe5, 0x42, 0xd7, 0x1c, 0x4b, 0x5c, 0x5e, 0x40, 0x14, 0xa6, 0x0b, 0xab, 0x03, 0x7e, 0x2c, 0xa4, 0x83, 0x42, 0xa3, - 0x7d, 0xa4, 0xd3, 0xc9, 0x46, 0x13, 0x83, 0x36, 0x45, 0x62, 0xc5, 0xe9, 0x40, 0x0c, 0x3e, 0x64, 0x88, 0x97, 0xee, 0x21, 0x77, 0x74, 0xf6, 0x1a, 0xd6, 0x9a, 0xba, 0xe0, 0x45, 0x3d, 0xdf, 0x9d, - 0x89, 0x55, 0xdd, 0xd9, 0x6e, 0x72, 0x12, 0x00, 0xd6, 0x58, 0x39, 0x0d, 0xf9, 0x85, 0x5d, 0x7d, 0xb4, 0xaa, 0x73, 0xfd, 0x03, 0x79, 0xec, 0xb5, 0x87, 0xfe, 0x7c, 0x9a, 0x7e, 0x2f, 0xf9, 0xd6, - 0xfa, 0x5f, 0xa7, 0xb3, 0xbb, 0xc8, 0x9f, 0x31, 0x18, 0x61, 0x38, 0xe3, 0x56, 0xc9, 0x71, 0x73, 0x02, 0x96, 0x47, 0xd4, 0xec, 0xe6, 0x0d, 0x79, 0xe2, 0x13, 0x60, 0x8f, 0x06, 0xc7, 0x7d, 0x7e, - 0x9c, 0x5b, 0xf0, 0xfe, 0xe2, 0x5d, 0x82, 0x20, 0x21, 0x94, 0x02, 0x81, 0xcf, 0x5b, 0x70, 0x73, 0x3a, 0x6a, 0xa4, 0x89, 0x8e, 0xf3, 0x95, 0xa6, 0x07, 0xad, 0xba, 0x58, 0x22, 0x87, 0x20, 0xf3, - 0x01, 0x46, 0x87, 0xac, 0xac, 0xf1, 0x9c, 0x82, 0xee, 0x0f, 0xf2, 0xa4, 0xd2, 0xdf, 0x37, 0x0f, 0xe2, 0xf7, 0x2a, 0xf8, 0x33, 0x4e, 0xdf, 0x31, 0xbb, 0x22, 0x90, 0x4d, 0xa5, 0xf8, 0x51, 0x07, - 0x6c, 0x3c, 0x73, 0x5a, 0xdd, 0x22, 0x0e, 0x19, 0xd6, 0xac, 0xe6, 0x51, 0x46, 0x0b, 0x1b, 0x49, 0xbb, 0x4d, 0xcb, 0x53, 0x30, 0x94, 0x3c, 0xe2, 0x08, 0xfa, 0x6e, 0x4f, 0xe3, 0xb4, 0xb3, 0x44, - 0xf7, 0xbe, 0xcd, 0xed, 0x0a, 0x91, 0xf4, 0x5b, 0xc8, 0xa0, 0x6c, 0xf0, 0x02, 0x13, 0x85, 0x2e, 0x64, 0xec, 0x60, 0x1a, 0x9d, 0x16, 0xb8, 0xa8, 0x1f, 0x2c, 0x8c, 0x39, 0x23, 0xa4, 0x4b, 0xe2, - 0xb7, 0x53, 0xd6, 0xff, 0xba, 0xfe, 0xf7, 0x7f, 0xff, 0xaf, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x66, 0x06, 0x1e, 0x61, 0x1a, 0x3b, 0x01, 0x00, 0x57, 0x88, 0x04, 0x00, - 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x53, 0x4d, 0x6f, 0xda, 0x40, - 0x10, 0xbd, 0xf3, 0x2b, 0x46, 0x3e, 0xe4, 0x10, 0x65, 0xc7, 0xd8, 0xa0, 0x34, 0x8d, 0x54, 0xa9, 0x55, 0x9b, 0x36, 0x87, 0xa8, 0xad, 0x54, 0xda, 0x13, 0x02, 0x19, 0x7b, 0x20, 0x8b, 0xcc, 0x7a, - 0xbb, 0xbb, 0x46, 0xa0, 0x88, 0xff, 0x5e, 0xed, 0xf8, 0xa3, 0xcb, 0x47, 0xa3, 0x4a, 0x08, 0xf0, 0xbe, 0x37, 0x6f, 0x66, 0xde, 0x3e, 0xbf, 0x0c, 0x00, 0x22, 0x95, 0x6d, 0x28, 0xba, 0x87, 0x88, - 0xb6, 0xa4, 0x9c, 0x78, 0xce, 0x54, 0x51, 0x92, 0x89, 0x6e, 0x3c, 0xb4, 0x25, 0x63, 0x65, 0xa5, 0x3c, 0x3a, 0xc4, 0x04, 0x87, 0xcd, 0x69, 0x41, 0x36, 0x37, 0x52, 0xbb, 0x16, 0x99, 0xec, 0x35, - 0xfd, 0xe0, 0x03, 0x78, 0x9c, 0x4c, 0xbe, 0xc3, 0x63, 0xa8, 0x50, 0xca, 0x9c, 0x94, 0x65, 0xfd, 0x0f, 0x3a, 0xcb, 0x9f, 0x49, 0xa4, 0x9d, 0x8c, 0x21, 0x5d, 0x59, 0xe9, 0x2a, 0xb3, 0x8f, 0xee, - 0xc1, 0x4f, 0x02, 0x10, 0xb9, 0xbd, 0x66, 0xee, 0x4a, 0x3a, 0x26, 0x01, 0x44, 0xb5, 0x29, 0xfd, 0x49, 0x34, 0x00, 0x38, 0x70, 0x5d, 0xd3, 0xdc, 0xfe, 0x2d, 0x5a, 0xd4, 0xb2, 0x2c, 0x3c, 0x47, - 0xe9, 0x1d, 0x08, 0x0d, 0x5e, 0xa4, 0x21, 0x81, 0xb3, 0x79, 0xa7, 0xa3, 0x0d, 0x39, 0xb2, 0xae, 0xe1, 0x6d, 0xc0, 0xd4, 0x0a, 0x4a, 0xa9, 0x1c, 0x5c, 0x5d, 0x41, 0xf7, 0xdc, 0x08, 0xb5, 0x7c, - 0x4f, 0xbe, 0xaf, 0x95, 0xe4, 0x0a, 0x67, 0x85, 0xaa, 0x0a, 0x02, 0xff, 0x35, 0xdf, 0x54, 0x45, 0x5d, 0x92, 0x8d, 0x5d, 0xa6, 0x29, 0x5e, 0x48, 0xc5, 0x7f, 0xc0, 0xf3, 0x63, 0xcf, 0x47, 0x67, - 0x8f, 0x34, 0xa4, 0x72, 0xb4, 0x32, 0x59, 0x67, 0xd7, 0xff, 0x4a, 0x05, 0x65, 0x27, 0x8a, 0xe1, 0x0a, 0xfd, 0x94, 0xe1, 0x1e, 0x67, 0x6d, 0xdb, 0x62, 0xeb, 0x32, 0xc3, 0xd5, 0x9f, 0x7f, 0x7e, - 0xfd, 0x38, 0x7f, 0xfa, 0xf6, 0x65, 0xfe, 0xf4, 0xf0, 0xeb, 0xe1, 0xe9, 0x9d, 0x54, 0xcb, 0x0a, 0x96, 0x59, 0x66, 0xc5, 0xda, 0x0a, 0x53, 0x2b, 0x27, 0x37, 0x04, 0x18, 0xb3, 0x1d, 0xb1, 0x54, - 0x05, 0xed, 0x70, 0xdd, 0x4f, 0xe0, 0x4d, 0xe3, 0xb8, 0x58, 0xb6, 0x6f, 0x1a, 0x59, 0x93, 0xc7, 0xd7, 0xd7, 0xf1, 0x35, 0xbe, 0xac, 0xed, 0x8d, 0xf3, 0x9f, 0xdd, 0x61, 0x1a, 0xc1, 0x94, 0x67, - 0xbd, 0x84, 0x08, 0xf1, 0xbb, 0x96, 0xd4, 0x5f, 0x70, 0x41, 0x8b, 0x7a, 0xc5, 0x3b, 0x55, 0x05, 0x6d, 0x2a, 0x05, 0x42, 0x48, 0x65, 0x35, 0xe5, 0x0e, 0x30, 0x3e, 0x72, 0xe9, 0x64, 0x44, 0x36, - 0x2c, 0x2f, 0x25, 0xae, 0xed, 0xf9, 0xb4, 0x7d, 0x5c, 0x0a, 0xda, 0x7e, 0x22, 0x4d, 0xaa, 0x20, 0x95, 0x4b, 0x0a, 0x62, 0xf3, 0x9e, 0x73, 0xc2, 0x8e, 0xfb, 0xee, 0xb3, 0x31, 0x26, 0xa3, 0x36, - 0x9b, 0x3d, 0xca, 0x29, 0x12, 0xcd, 0xaa, 0x71, 0xf3, 0x23, 0x74, 0x59, 0xaf, 0xa4, 0x6a, 0x4b, 0xd2, 0xf1, 0xab, 0x25, 0x3a, 0x33, 0x96, 0xcc, 0x05, 0x6e, 0x83, 0x33, 0xf0, 0x06, 0xd3, 0xdb, - 0x53, 0x40, 0xe4, 0x95, 0x5a, 0xca, 0x95, 0xf0, 0xa1, 0x75, 0xb2, 0x55, 0xb8, 0xc3, 0xd1, 0x19, 0xaf, 0x19, 0xe6, 0x98, 0x37, 0xc2, 0xa0, 0x51, 0x6b, 0x2a, 0x03, 0x29, 0x0e, 0x71, 0x1c, 0xbe, - 0x0f, 0x7d, 0x49, 0x1a, 0x4a, 0xdb, 0x5a, 0x93, 0xe9, 0x82, 0x36, 0xbb, 0xc5, 0x11, 0x26, 0x7d, 0xfc, 0x2e, 0x9b, 0xd5, 0x66, 0x9a, 0x91, 0xb7, 0x98, 0x04, 0x7c, 0xcb, 0x2f, 0xe6, 0x6c, 0xe8, - 0x97, 0x0f, 0x4e, 0xff, 0xb9, 0x63, 0x82, 0xc9, 0x5d, 0xa0, 0xdb, 0x1b, 0xda, 0x59, 0x88, 0xe3, 0xf0, 0x66, 0x5f, 0xb9, 0xd6, 0x7e, 0x9e, 0xe4, 0x16, 0x93, 0x04, 0x93, 0xb4, 0xd3, 0x3c, 0x09, - 0x51, 0xd7, 0x15, 0x87, 0x2c, 0x3c, 0x38, 0x0c, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x16, 0xab, 0x51, 0x14, 0x02, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, - 0x63, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0xb4, 0x54, 0x4d, 0x6f, 0xdb, 0x3a, 0x10, 0xbc, 0xf3, 0x57, 0x0c, 0xf0, 0x1e, 0xa0, 0xd8, 0xb0, 0xa5, 0xbb, 0xfc, 0x12, 0x3c, 0x34, - 0x0d, 0x90, 0xf6, 0xd0, 0xa4, 0x49, 0x5a, 0x20, 0x37, 0xd3, 0xd4, 0xca, 0xa2, 0x23, 0x91, 0x0a, 0xb9, 0x4a, 0xe2, 0x1a, 0xfa, 0xef, 0x05, 0x45, 0xe5, 0x1b, 0x30, 0x8a, 0x16, 0xf5, 0xc1, 0xa6, - 0x97, 0x33, 0xcb, 0x9d, 0x9d, 0x25, 0x75, 0xd3, 0x5a, 0xc7, 0xd8, 0xe1, 0xd8, 0x1a, 0xa6, 0x07, 0x9e, 0xe1, 0x92, 0x5d, 0xa7, 0xb8, 0x73, 0x54, 0x5c, 0x10, 0x77, 0xce, 0xa0, 0x47, 0xe9, 0x6c, - 0x83, 0xa4, 0x94, 0xd2, 0xcf, 0x37, 0x7e, 0xee, 0x3a, 0xc3, 0xba, 0xa1, 0x64, 0x21, 0x44, 0x36, 0x9d, 0x0a, 0x4c, 0x71, 0x6d, 0x3b, 0x87, 0xd3, 0xab, 0xab, 0x73, 0x54, 0xd2, 0x14, 0xb5, 0x36, - 0x6b, 0x94, 0x9d, 0x51, 0xac, 0xad, 0x99, 0x41, 0x9b, 0x3b, 0x7b, 0x43, 0x05, 0xee, 0x35, 0x57, 0x20, 0xa9, 0x2a, 0x38, 0xba, 0xed, 0xc8, 0x73, 0x8a, 0xab, 0x4a, 0x7b, 0x68, 0x0f, 0x69, 0x40, - 0x0f, 0xb2, 0x69, 0x6b, 0x0a, 0xd9, 0x1e, 0xa9, 0xe0, 0x4a, 0x32, 0x6a, 0xbb, 0xf6, 0xe0, 0x8a, 0xa0, 0x8d, 0xb2, 0x4d, 0x48, 0x3d, 0xd2, 0x21, 0x4d, 0x01, 0x52, 0x95, 0x25, 0x0f, 0xcd, 0x1e, - 0xda, 0xb4, 0x1d, 0x83, 0xed, 0x00, 0x56, 0xb2, 0xae, 0xc9, 0xa5, 0x02, 0x43, 0x7d, 0x9f, 0x18, 0x4a, 0x1a, 0xac, 0xe8, 0x75, 0x31, 0xcb, 0x70, 0xd2, 0x18, 0x5a, 0xbe, 0xc6, 0x31, 0x79, 0x7e, - 0x82, 0x99, 0xb6, 0x19, 0x02, 0xcb, 0xbf, 0x93, 0xee, 0xff, 0x56, 0x3a, 0xd9, 0x60, 0x37, 0x3a, 0xd0, 0x43, 0xc5, 0x05, 0xe4, 0xd3, 0xca, 0xae, 0x36, 0xa4, 0x38, 0x7d, 0x89, 0x8e, 0xa1, 0x27, - 0x70, 0xba, 0xb2, 0xc5, 0x76, 0x90, 0xfe, 0xd8, 0x9e, 0x21, 0xa0, 0x4b, 0x48, 0xb3, 0xdd, 0xc7, 0xbb, 0xed, 0xc8, 0x45, 0x62, 0x5c, 0x79, 0x76, 0xa1, 0xc9, 0x05, 0x79, 0x72, 0x5a, 0xd6, 0xfa, - 0x07, 0x15, 0x90, 0x83, 0x45, 0x91, 0x39, 0xfb, 0x85, 0x9c, 0xb5, 0x5d, 0x07, 0xdf, 0xd6, 0x21, 0x51, 0xdc, 0x8b, 0xd2, 0x1b, 0xe2, 0xca, 0x16, 0x1e, 0xa5, 0x75, 0x48, 0xb4, 0x29, 0x6d, 0x32, - 0x43, 0x72, 0x2f, 0x9d, 0x09, 0xbf, 0xe4, 0x9c, 0x75, 0xc9, 0x0c, 0xc4, 0x6a, 0xaf, 0xd0, 0x8a, 0x64, 0x41, 0x2e, 0xce, 0xc4, 0x30, 0x73, 0x8f, 0x82, 0xc7, 0x8d, 0x97, 0xdc, 0x28, 0xe6, 0x99, - 0x1b, 0x0b, 0x78, 0x4f, 0x8d, 0xf1, 0x7d, 0xcc, 0x8a, 0xb9, 0xfd, 0x4e, 0xce, 0xc7, 0xb9, 0x1c, 0xe9, 0xad, 0xb3, 0x6c, 0x95, 0xad, 0x71, 0x17, 0x77, 0x42, 0x82, 0x4b, 0xa2, 0x1c, 0x01, 0xed, - 0xf3, 0x2c, 0x5b, 0x6b, 0xae, 0xba, 0x55, 0xaa, 0x6c, 0x93, 0xdd, 0x18, 0xc9, 0xfa, 0x8e, 0xb2, 0x30, 0x24, 0xd9, 0xaa, 0xb6, 0xab, 0xac, 0x91, 0xda, 0x64, 0x85, 0x55, 0x3e, 0x5b, 0x77, 0xba, - 0x20, 0x9f, 0x19, 0x5b, 0xd0, 0xc6, 0xa7, 0x4d, 0xf1, 0x0f, 0x57, 0x34, 0x1f, 0x4f, 0x9e, 0x47, 0xfd, 0x02, 0xd3, 0x4c, 0x28, 0x6b, 0x82, 0xce, 0x70, 0xc7, 0x08, 0x87, 0x90, 0x7e, 0x6b, 0x14, - 0x0e, 0x46, 0x60, 0xfe, 0x7c, 0x85, 0x83, 0xf5, 0xf9, 0xe8, 0xe4, 0x24, 0xc7, 0xb9, 0xb3, 0x8d, 0xf6, 0xf4, 0xdf, 0xdb, 0x9b, 0x7d, 0x84, 0xc3, 0x23, 0xec, 0x04, 0x90, 0x65, 0xb8, 0x3e, 0xfb, - 0x76, 0x81, 0xe3, 0xb3, 0x8f, 0x27, 0x38, 0x3d, 0xb9, 0x38, 0x11, 0x78, 0xe9, 0x65, 0x1a, 0xac, 0x3a, 0x58, 0x8a, 0xf9, 0xef, 0x7f, 0xc4, 0x69, 0x34, 0x27, 0x17, 0xff, 0xee, 0x3e, 0x5f, 0x9e, - 0x7d, 0x49, 0x63, 0x71, 0xba, 0xdc, 0x1e, 0xbc, 0xf1, 0x75, 0xd2, 0x0b, 0xf1, 0x35, 0x4c, 0xe2, 0x1e, 0xe8, 0x30, 0xa9, 0x01, 0xf8, 0x21, 0x08, 0x7d, 0x8f, 0x0b, 0xfa, 0x27, 0xfd, 0x1f, 0xd5, - 0xbb, 0x9c, 0x2c, 0x04, 0xe0, 0xe2, 0x0b, 0x18, 0x7a, 0x84, 0xb1, 0xab, 0xe1, 0x7b, 0x36, 0xfc, 0x1f, 0x0b, 0xce, 0xc7, 0x6d, 0x20, 0x19, 0xea, 0x33, 0x3c, 0xe7, 0x6d, 0x4b, 0x49, 0x8e, 0x44, - 0xb6, 0x6d, 0xad, 0x95, 0x0c, 0x8f, 0x59, 0xb6, 0xf1, 0xd6, 0x24, 0x03, 0xb0, 0x17, 0x40, 0xbf, 0x10, 0xfd, 0x42, 0x08, 0x7a, 0x18, 0x5f, 0xdf, 0xd1, 0xd3, 0x7e, 0x21, 0x7e, 0x06, 0x00, 0x00, - 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf8, 0xc1, 0xc9, 0x51, 0x58, 0x02, 0x00, 0x00, 0x91, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, - 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x5c, 0x52, 0xcb, 0x6e, 0xdb, 0x30, 0x10, 0xbc, 0xfb, 0x2b, 0xe6, 0x46, 0xba, 0xa0, 0x65, 0x37, 0xe9, 0xc9, 0x86, 0x7b, 0x29, 0x0a, 0xd4, 0x3d, 0x24, 0x87, - 0xe6, 0x07, 0x18, 0x69, 0xed, 0x28, 0x91, 0x48, 0x65, 0xb9, 0x32, 0x6a, 0x18, 0xfa, 0xf7, 0x80, 0xd4, 0xcb, 0xc9, 0x4d, 0x3b, 0x3b, 0x3b, 0x3b, 0x1a, 0xae, 0x6a, 0x03, 0x21, 0x08, 0x97, 0xb9, - 0xa8, 0xdd, 0xa2, 0xac, 0x1b, 0xcf, 0x82, 0x2b, 0x82, 0x58, 0x16, 0x83, 0x83, 0x3b, 0xfb, 0x37, 0xe2, 0xc7, 0x46, 0x4a, 0xef, 0x02, 0x3a, 0x1c, 0xd9, 0xd7, 0x50, 0x47, 0x6b, 0xc3, 0xea, 0x35, - 0xac, 0xb8, 0x75, 0x52, 0xd6, 0x34, 0x0f, 0x32, 0xbd, 0xb7, 0x14, 0x64, 0xa0, 0x85, 0xb6, 0x21, 0x16, 0x0a, 0x51, 0x79, 0x64, 0x7c, 0x83, 0x0d, 0x38, 0xb6, 0x2e, 0x1f, 0x38, 0x59, 0xb6, 0x7e, - 0x6e, 0xcb, 0xaa, 0x98, 0x35, 0xe2, 0x80, 0xc1, 0x15, 0x4f, 0x51, 0x68, 0xdc, 0x28, 0xb6, 0x89, 0x6b, 0x16, 0xb9, 0x77, 0x41, 0x50, 0x58, 0xb1, 0xd8, 0xe3, 0xba, 0x00, 0x9c, 0xad, 0x69, 0x0b, - 0x25, 0xe5, 0x89, 0x58, 0x99, 0x05, 0x90, 0xb7, 0x41, 0x7c, 0x4d, 0x7c, 0x28, 0xb6, 0x50, 0x9b, 0xef, 0x77, 0xf7, 0x3f, 0xd4, 0xa2, 0x9b, 0x26, 0x89, 0xf9, 0x8f, 0x75, 0x45, 0x45, 0x8c, 0x3d, - 0xb4, 0x6c, 0xd3, 0x96, 0x25, 0xf6, 0x3f, 0xa1, 0x89, 0x79, 0x8b, 0xdf, 0xcc, 0x9e, 0x53, 0x1d, 0xc5, 0x25, 0xa3, 0x58, 0xc7, 0xd6, 0x72, 0xd7, 0xd7, 0xae, 0xd0, 0xcb, 0x5d, 0x12, 0x8c, 0x3e, - 0xb5, 0x3a, 0x38, 0xa1, 0x13, 0xdb, 0x98, 0xcf, 0x16, 0x2f, 0x49, 0x3a, 0xc0, 0xe2, 0x6c, 0xab, 0xb2, 0x18, 0xe3, 0x50, 0x06, 0x5a, 0x26, 0xd1, 0x14, 0xad, 0x8e, 0x11, 0x64, 0x3d, 0xdf, 0xe0, - 0xda, 0xc5, 0x54, 0x3e, 0x87, 0xbd, 0xcc, 0xe4, 0x85, 0x9c, 0xd6, 0x81, 0xf8, 0x4c, 0xb3, 0xa5, 0x68, 0xa2, 0xa9, 0xac, 0xd3, 0xf7, 0xc9, 0x11, 0xc6, 0x1d, 0x23, 0x2f, 0x61, 0x40, 0xd6, 0xf8, - 0xe8, 0x6e, 0xad, 0x26, 0x20, 0x44, 0xeb, 0x31, 0xb8, 0x09, 0xa1, 0xff, 0x0d, 0xe5, 0xa2, 0xef, 0x36, 0x9b, 0xaf, 0x90, 0xfa, 0xe5, 0x9d, 0x90, 0x93, 0xd5, 0xd3, 0xa5, 0x21, 0x65, 0xb0, 0x7e, - 0x0d, 0xde, 0xad, 0x67, 0x96, 0x2b, 0x74, 0xcc, 0xc4, 0x80, 0x29, 0xb4, 0x95, 0xdc, 0x98, 0xeb, 0x0d, 0x4e, 0xa9, 0x19, 0xa8, 0x07, 0x8f, 0x54, 0xaa, 0xc1, 0x6f, 0xcf, 0xf0, 0x6f, 0x7a, 0x98, - 0xbd, 0x45, 0xe9, 0xbd, 0xb5, 0x95, 0xfe, 0xfb, 0xef, 0xf1, 0x21, 0x8b, 0x27, 0xe9, 0x4e, 0xe5, 0xf1, 0x32, 0xf0, 0xb2, 0x67, 0x5f, 0x5c, 0x96, 0x06, 0x5f, 0x9a, 0xe9, 0x87, 0x3e, 0x6b, 0xf4, - 0x2f, 0x34, 0x02, 0x7d, 0x2c, 0x59, 0x5e, 0xf9, 0x40, 0x33, 0xde, 0xa5, 0xaf, 0xce, 0xdc, 0xdc, 0x83, 0x96, 0xa8, 0x13, 0x1b, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x04, - 0x6d, 0x41, 0x6c, 0x95, 0x01, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, - 0x69, 0x74, 0x2e, 0x74, 0x73, 0x6c, 0x92, 0xcb, 0x6e, 0xdb, 0x3c, 0x10, 0x85, 0xf7, 0x7c, 0x8a, 0xb3, 0xa3, 0x0c, 0x38, 0xd2, 0xff, 0xa7, 0x5d, 0x49, 0xb1, 0x37, 0x45, 0x8b, 0x66, 0x57, 0x14, - 0xee, 0x3a, 0x60, 0xc8, 0xb1, 0xc5, 0x84, 0x22, 0x15, 0x72, 0x68, 0x5b, 0x30, 0xfc, 0xee, 0x85, 0x7c, 0x91, 0x63, 0xa0, 0x2b, 0x82, 0xc3, 0x33, 0x97, 0x8f, 0x67, 0x64, 0x4e, 0x84, 0xc4, 0xd1, - 0x6a, 0x96, 0x8d, 0x10, 0xb6, 0xeb, 0x43, 0x64, 0x30, 0x25, 0xc6, 0x3a, 0x86, 0x0e, 0x92, 0x55, 0x4f, 0xb2, 0xb9, 0x3e, 0x1c, 0x40, 0xfb, 0x9e, 0x34, 0xaf, 0x86, 0x9e, 0x70, 0xbc, 0x4a, 0x92, - 0xf9, 0xac, 0xf8, 0x16, 0x3c, 0xd3, 0x9e, 0xe7, 0xf8, 0xb9, 0x5a, 0xfd, 0xfa, 0x91, 0xbd, 0x66, 0x1b, 0xfc, 0x24, 0x5e, 0x2b, 0x95, 0x1e, 0xde, 0xd2, 0x43, 0xcc, 0x9e, 0x6d, 0x77, 0x57, 0xba, - 0x55, 0xde, 0xb8, 0x5b, 0xd9, 0xb2, 0xac, 0x5e, 0xb3, 0x75, 0xa6, 0xb2, 0xde, 0xd0, 0xbe, 0x7c, 0x4b, 0xe3, 0x80, 0x55, 0x85, 0xef, 0x3e, 0xe5, 0x48, 0xe0, 0x56, 0x31, 0xb8, 0x25, 0xac, 0xaf, - 0x2d, 0x74, 0xe8, 0x7a, 0x47, 0x4c, 0x09, 0xda, 0x91, 0xf2, 0x6e, 0xc0, 0xae, 0x25, 0x8f, 0x5e, 0xa5, 0x44, 0x06, 0x0a, 0x5b, 0xe5, 0xac, 0x01, 0x6d, 0xc9, 0x73, 0x29, 0x46, 0xc4, 0x42, 0xfe, - 0xf1, 0x96, 0xeb, 0x4b, 0xe3, 0x34, 0x49, 0x22, 0x7d, 0x64, 0x4a, 0x2c, 0xe7, 0x50, 0x69, 0xf0, 0x1a, 0x05, 0xcf, 0xb0, 0x58, 0xe2, 0x20, 0x00, 0x2e, 0x7b, 0xa7, 0x7c, 0xf1, 0x38, 0x6b, 0x04, - 0xa0, 0x83, 0x4f, 0x8c, 0xd7, 0x60, 0x86, 0x1a, 0xbf, 0x49, 0x87, 0x68, 0x9e, 0xc6, 0xaf, 0xf4, 0x9b, 0x39, 0xce, 0xe7, 0x12, 0x8b, 0x53, 0x16, 0xe0, 0x55, 0x47, 0x35, 0x24, 0xdb, 0x0d, 0x45, - 0x39, 0x3f, 0x85, 0x74, 0x4e, 0x1c, 0x3a, 0x8a, 0xcf, 0xa6, 0x86, 0xfc, 0xef, 0xff, 0xc7, 0x2f, 0x5f, 0xa5, 0x00, 0x8e, 0x8d, 0x10, 0x40, 0x55, 0xe1, 0xd9, 0x6f, 0xc3, 0x3b, 0xdd, 0x13, 0xee, - 0x5a, 0xab, 0x5b, 0xa4, 0x36, 0x64, 0x67, 0x26, 0x5c, 0xec, 0x2c, 0xb7, 0x21, 0x33, 0x28, 0xc6, 0x10, 0xa1, 0xbc, 0x01, 0xe9, 0x36, 0x9c, 0x32, 0x8d, 0x62, 0x35, 0x0d, 0x1a, 0x29, 0x65, 0xc7, - 0x58, 0x40, 0xed, 0x94, 0xe5, 0x0b, 0x75, 0x71, 0x80, 0x0b, 0x9b, 0x1a, 0x07, 0x58, 0xbf, 0x0e, 0x35, 0x8a, 0x97, 0x13, 0xeb, 0x0b, 0x8e, 0x38, 0x42, 0xa5, 0x9b, 0x9b, 0x23, 0xe6, 0x89, 0x9a, - 0xcb, 0xf0, 0x5e, 0x9c, 0x6b, 0x5d, 0xee, 0xf4, 0x91, 0x95, 0xbb, 0x84, 0xca, 0x51, 0x77, 0xa7, 0x26, 0x6f, 0x8a, 0x59, 0x23, 0x8e, 0xb3, 0x7f, 0xdb, 0x77, 0x71, 0x7d, 0x62, 0xb4, 0x09, 0x3c, - 0xf4, 0x34, 0xf2, 0xc5, 0x48, 0x9a, 0xdd, 0x50, 0x8a, 0xdb, 0xd2, 0x3d, 0x7d, 0x5e, 0xaa, 0x65, 0x71, 0x4e, 0x9e, 0x35, 0xe2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x69, - 0x9c, 0xe5, 0x16, 0x96, 0x01, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xdd, 0x6e, 0x23, 0x37, 0x0f, 0xbd, 0xf7, 0x53, 0x10, 0x73, 0x33, 0x89, 0x91, 0xd8, 0xd9, 0x7c, 0xf8, 0xb6, 0xad, 0xef, 0x16, 0x8e, 0x17, 0x48, - 0xd1, 0x4d, 0x8b, 0x38, 0x05, 0x0a, 0x14, 0x45, 0x21, 0x6b, 0x38, 0x36, 0x53, 0x0d, 0x35, 0x10, 0xa9, 0x24, 0x83, 0xc5, 0xbe, 0x7b, 0x21, 0xc9, 0x3f, 0x69, 0x7e, 0x8c, 0xf5, 0xcd, 0xd0, 0x33, - 0xe2, 0xe1, 0xe1, 0x21, 0x75, 0xbe, 0x8e, 0x00, 0x2a, 0x62, 0xeb, 0x62, 0x83, 0xd5, 0x0c, 0xfe, 0x1c, 0x01, 0x00, 0x54, 0x12, 0xec, 0x74, 0x3c, 0x9e, 0x8e, 0xab, 0x11, 0xc0, 0x5f, 0x67, 0xe9, - 0x08, 0x3e, 0xed, 0x8f, 0x54, 0xec, 0x1b, 0xfc, 0xbb, 0xf3, 0x4d, 0x74, 0x28, 0x55, 0xf9, 0x6c, 0x7d, 0xd7, 0x93, 0xc3, 0xf0, 0x6b, 0xaf, 0xe4, 0x59, 0xaa, 0x19, 0x7c, 0x2d, 0x48, 0x6a, 0xc2, - 0x1a, 0xb5, 0x9a, 0x41, 0xb5, 0x58, 0x5e, 0x5e, 0x5c, 0x5e, 0x54, 0x67, 0xf0, 0xee, 0x6f, 0x3a, 0x86, 0x65, 0x8f, 0x96, 0xda, 0x01, 0x16, 0xf3, 0x2f, 0x9f, 0x96, 0x36, 0x50, 0xaf, 0x50, 0x10, - 0xe0, 0x01, 0x83, 0x90, 0xe7, 0x19, 0xd4, 0x8b, 0xe5, 0xff, 0x6a, 0x38, 0x69, 0xb0, 0x35, 0xd1, 0xe9, 0xe9, 0x59, 0x7a, 0xf1, 0xff, 0x3a, 0x3f, 0x2e, 0x2f, 0x3e, 0x1c, 0xa2, 0x8f, 0xfb, 0xe8, - 0x87, 0x7d, 0xf4, 0xe3, 0x3e, 0xfa, 0x69, 0x17, 0x5d, 0x5e, 0xd4, 0x67, 0xe0, 0x43, 0xfa, 0x73, 0xb3, 0xf8, 0xe3, 0xae, 0x9e, 0xc0, 0x78, 0x5a, 0xa8, 0x97, 0x0e, 0x13, 0x75, 0xeb, 0xbb, 0xce, - 0xf3, 0xbd, 0xbc, 0x4f, 0xfe, 0x19, 0xf5, 0x92, 0x06, 0xd6, 0x37, 0x08, 0x6b, 0x64, 0x0c, 0x46, 0x0b, 0x6f, 0xf6, 0x8c, 0xa9, 0xea, 0x0e, 0x2d, 0xc5, 0xa6, 0x6b, 0xd2, 0x43, 0x06, 0x51, 0xec, - 0x52, 0x14, 0xcb, 0x0b, 0x94, 0x5d, 0x2f, 0x29, 0x7a, 0xce, 0x11, 0x9f, 0xf4, 0x19, 0x47, 0x1f, 0xf5, 0x8a, 0x42, 0xe2, 0x38, 0x99, 0xae, 0x22, 0xb9, 0xe6, 0x88, 0xbe, 0xd3, 0x31, 0xdc, 0x62, - 0x43, 0x01, 0xad, 0x82, 0x8f, 0xda, 0x47, 0x05, 0xd1, 0x10, 0xad, 0xc6, 0x80, 0xa0, 0x1e, 0x74, 0x83, 0x50, 0x3e, 0xfb, 0x30, 0x1c, 0x4a, 0x88, 0x06, 0xb2, 0x69, 0x82, 0x1a, 0x22, 0x1e, 0x99, - 0xde, 0xb6, 0xc4, 0x82, 0xcd, 0xca, 0x21, 0x18, 0xe7, 0xa0, 0x64, 0x82, 0x0e, 0x3d, 0x9e, 0xdb, 0x0d, 0xda, 0x7f, 0x88, 0xd7, 0xe0, 0xcb, 0x86, 0x1c, 0xf0, 0xd9, 0x5f, 0x77, 0xbd, 0x23, 0x4b, - 0xfa, 0x89, 0x87, 0x6a, 0x06, 0xad, 0x71, 0xf2, 0x6e, 0x9d, 0xd4, 0x83, 0x21, 0x41, 0xc0, 0x10, 0x7c, 0x00, 0xcf, 0x80, 0x4f, 0x7d, 0x40, 0x49, 0xab, 0x21, 0x60, 0xb8, 0x81, 0x06, 0xad, 0x33, - 0x45, 0x73, 0x81, 0x47, 0xd2, 0x0d, 0x18, 0x06, 0x4a, 0x15, 0xb0, 0x81, 0xda, 0xf0, 0x50, 0x67, 0x42, 0x2f, 0xfb, 0xbb, 0x89, 0xce, 0xcd, 0x13, 0x47, 0x39, 0xd6, 0xe9, 0xa1, 0xbf, 0x6d, 0x6f, - 0x1c, 0x9d, 0x83, 0xdc, 0x9b, 0xbc, 0x44, 0xfc, 0x1c, 0xd9, 0x26, 0x16, 0x77, 0x43, 0x8f, 0xef, 0x83, 0xbe, 0x42, 0x3c, 0x08, 0xd5, 0x42, 0xbb, 0x85, 0xc8, 0x8c, 0xdf, 0x94, 0xec, 0x6e, 0x43, - 0x47, 0x09, 0xbf, 0xa5, 0x58, 0xad, 0x1b, 0x92, 0xfa, 0x3f, 0xc2, 0x7d, 0x8f, 0x4e, 0xec, 0x7f, 0xe7, 0x28, 0xd8, 0xfc, 0xe2, 0xad, 0x71, 0xdf, 0x51, 0x14, 0x7b, 0x1f, 0xb4, 0x54, 0x95, 0x54, - 0x36, 0xe6, 0x6c, 0x70, 0x39, 0xfd, 0x35, 0xec, 0x6f, 0x26, 0x98, 0x0e, 0x15, 0xc3, 0x11, 0xe8, 0x23, 0xb0, 0xfd, 0x3e, 0xfd, 0x2d, 0x99, 0x6e, 0x51, 0x63, 0xe0, 0x63, 0xa4, 0x5f, 0x40, 0xc3, - 0xe3, 0x06, 0x19, 0xd8, 0x6b, 0x5e, 0xe4, 0x7c, 0x97, 0x7b, 0xa3, 0x1b, 0x01, 0xe2, 0xc3, 0x54, 0x42, 0x46, 0x05, 0x03, 0x0f, 0xc6, 0x45, 0x7c, 0x69, 0x1c, 0xb7, 0x28, 0xde, 0xc5, 0x74, 0x30, - 0x5d, 0xcf, 0xe4, 0x99, 0x6f, 0xdd, 0xcd, 0xd7, 0xc6, 0x11, 0xf6, 0x79, 0x69, 0x25, 0x8c, 0xe2, 0x7a, 0xc8, 0xe6, 0xd1, 0x60, 0x0d, 0x27, 0x37, 0xbe, 0xc1, 0xc9, 0xbd, 0x9c, 0x66, 0x37, 0xb0, - 0xce, 0x88, 0x90, 0xad, 0xe1, 0x24, 0xed, 0xd8, 0xd6, 0x2e, 0xfb, 0x80, 0xe7, 0x1f, 0x26, 0x1f, 0x4f, 0x0f, 0x74, 0x50, 0xbe, 0x64, 0xe4, 0x6b, 0x56, 0x0c, 0xbe, 0x3f, 0x3a, 0xb9, 0xfd, 0x3a, - 0x0a, 0x60, 0x47, 0x0a, 0x54, 0x72, 0x30, 0x98, 0x15, 0x39, 0xd2, 0x01, 0x56, 0xa8, 0x8f, 0x88, 0x0c, 0xf3, 0x6c, 0x62, 0x3f, 0x2f, 0xf3, 0x9d, 0x5b, 0x2c, 0xa1, 0x94, 0x10, 0x78, 0x20, 0x03, - 0x36, 0x60, 0xbe, 0x7f, 0x69, 0x85, 0xd9, 0x74, 0x28, 0xbd, 0xb1, 0x08, 0x7e, 0x75, 0x8f, 0x56, 0x05, 0x5a, 0x1f, 0xb2, 0xa8, 0xd4, 0x25, 0xb9, 0x65, 0x02, 0x79, 0x48, 0x28, 0x50, 0x1b, 0xe7, - 0xfc, 0xe3, 0x72, 0x60, 0xdd, 0xa0, 0x92, 0xbd, 0x2a, 0x06, 0x7f, 0x5d, 0x8e, 0x3d, 0xf3, 0xbc, 0xd6, 0x07, 0x8b, 0x73, 0xcf, 0x42, 0xa2, 0xc8, 0x3a, 0x37, 0x42, 0xbc, 0xbe, 0xe6, 0xcf, 0xe4, - 0xf0, 0x26, 0x55, 0xdb, 0x36, 0xb8, 0xeb, 0xe7, 0x8a, 0x24, 0x03, 0x03, 0xb1, 0xdd, 0x27, 0xb9, 0xe1, 0xdc, 0x9a, 0xb4, 0x37, 0x01, 0x5b, 0x0c, 0xc8, 0x16, 0x65, 0x67, 0x81, 0x62, 0x3a, 0x84, - 0x96, 0xdc, 0x6e, 0xa0, 0xdf, 0x46, 0xdf, 0x46, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x50, 0x4b, - 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x52, 0x56, 0x08, 0x2d, 0x4e, 0x4d, 0x51, 0x48, 0xaa, 0x54, 0x48, 0x2a, - 0xcd, 0xcc, 0x49, 0x49, 0x4a, 0x4c, 0xce, 0x86, 0xb0, 0x52, 0x8b, 0x8a, 0x75, 0x20, 0x2c, 0xd7, 0xbc, 0xb2, 0x62, 0x85, 0xc4, 0xa2, 0x54, 0x85, 0x82, 0xc4, 0x62, 0x90, 0xda, 0x92, 0x7c, 0x85, - 0x92, 0x8c, 0x54, 0x88, 0x9c, 0x42, 0x66, 0x6e, 0x62, 0x7a, 0x2a, 0x17, 0x5c, 0x9d, 0x15, 0x97, 0xae, 0x42, 0x5e, 0x62, 0x6e, 0xaa, 0x95, 0x82, 0x53, 0x40, 0xbc, 0x9f, 0xbf, 0x8b, 0x6b, 0x7c, - 0x50, 0xa8, 0x5f, 0x7c, 0xb0, 0x73, 0x90, 0x67, 0x40, 0x48, 0x30, 0x97, 0x82, 0x42, 0x59, 0x62, 0x4e, 0x69, 0xaa, 0x15, 0x44, 0x2f, 0x17, 0x20, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, - 0xdd, 0x81, 0x1f, 0xc3, 0x68, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x5f, 0x62, 0x3f, - 0x47, 0x02, 0x00, 0x00, 0x72, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00, 0x00, 0x00, 0x00, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, - 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7e, 0x02, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x9f, 0x02, - 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x80, 0x38, 0xa2, 0xec, 0x01, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd6, 0x02, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xe8, 0xdf, 0xc0, 0x6e, - 0x03, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x12, 0x05, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, - 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd2, 0x08, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb7, 0x09, 0xae, 0x51, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x9e, 0x0a, - 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, - 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x26, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x3c, 0x0b, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x5b, - 0x0c, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x6e, 0xec, 0xbd, 0x69, 0x97, 0xba, 0xdc, 0x92, 0x2f, 0xf8, 0xfe, 0x7e, 0x8a, 0x67, 0xfd, 0x5f, 0x36, 0xd7, 0x64, 0x1e, 0xac, 0xd5, 0xa7, 0xba, 0x00, 0x07, 0x1c, 0x10, 0x51, 0x70, 0xa0, 0x57, + 0x9f, 0x5e, 0xcc, 0x83, 0x4c, 0x32, 0x0a, 0x7d, 0x6f, 0x7d, 0xf6, 0x5e, 0xa2, 0x66, 0x6a, 0xa6, 0xa6, 0xa4, 0xff, 0xe7, 0xdc, 0xba, 0x55, 0xe7, 0x79, 0x93, 0x09, 0x6c, 0x0c, 0xe0, 0x17, 0xb1, + 0x63, 0xc7, 0x8e, 0x1d, 0x11, 0xfb, 0xff, 0xfb, 0x6f, 0x7f, 0xfc, 0xf1, 0x2b, 0x54, 0x03, 0xf3, 0xd7, 0xbf, 0xfc, 0xf1, 0xcb, 0x2c, 0xcc, 0x30, 0xeb, 0x38, 0x6a, 0x68, 0xf8, 0x66, 0xf2, 0xeb, + 0xbf, 0x1f, 0x9b, 0x0a, 0x33, 0x49, 0xdd, 0x28, 0x3c, 0xb6, 0x42, 0x6f, 0xf0, 0x1b, 0x74, 0xba, 0xea, 0x47, 0xfa, 0xce, 0x72, 0x7d, 0x73, 0xf5, 0xde, 0x8a, 0x34, 0xd7, 0x13, 0x73, 0x9f, 0xbb, + 0x89, 0x99, 0xfe, 0xfa, 0x97, 0x3f, 0xb2, 0x24, 0x37, 0x9b, 0x6b, 0xb1, 0xaa, 0xef, 0x54, 0xbb, 0xb9, 0x76, 0x7c, 0xd8, 0x1f, 0x7f, 0xfc, 0x7a, 0x3f, 0xfa, 0xf6, 0xd1, 0x4d, 0xf3, 0xdd, 0xc7, + 0x37, 0x2d, 0xbe, 0xab, 0x9b, 0x61, 0xda, 0xfc, 0x96, 0x8e, 0x55, 0xdd, 0x31, 0x3b, 0xc8, 0x75, 0xb3, 0x61, 0xc6, 0x66, 0x68, 0x98, 0xa1, 0xee, 0x5e, 0x3d, 0xb9, 0x69, 0xf9, 0xb7, 0xac, 0x8a, + 0xcd, 0x14, 0x0c, 0x23, 0xa3, 0xf9, 0xf1, 0xdf, 0x11, 0xe8, 0x0d, 0x7b, 0x43, 0xde, 0x7f, 0xf9, 0xc7, 0x1f, 0xbf, 0x74, 0x3f, 0xca, 0x8d, 0xe6, 0x85, 0x8e, 0x3f, 0xfd, 0x45, 0xbe, 0x41, 0xb7, + 0xed, 0x96, 0xaa, 0xa6, 0x1d, 0x2f, 0xed, 0x24, 0x79, 0x98, 0xb9, 0xa7, 0xd7, 0x47, 0xde, 0x90, 0xdb, 0x7b, 0xa2, 0x38, 0x73, 0xa3, 0x50, 0xcd, 0xa2, 0xa4, 0x79, 0x08, 0xf4, 0xd6, 0x7d, 0x43, + 0xaf, 0xdb, 0x13, 0x53, 0x35, 0x3a, 0xf1, 0xce, 0x6e, 0x5a, 0xa9, 0x37, 0xe8, 0xea, 0xdd, 0xff, 0xf8, 0xe3, 0x57, 0x6a, 0x06, 0x85, 0x79, 0xfa, 0x25, 0xf9, 0x86, 0xbf, 0x61, 0xbf, 0xce, 0x4d, + 0xff, 0xf3, 0xea, 0xfb, 0x8a, 0xde, 0xb3, 0x4f, 0xcc, 0xd4, 0xf8, 0xf4, 0x89, 0xd8, 0x1b, 0x8c, 0xde, 0x3e, 0xe0, 0x74, 0x87, 0x9e, 0xb8, 0x71, 0xd6, 0x31, 0x53, 0xdf, 0x0d, 0x33, 0xf0, 0xf4, + 0xaf, 0x13, 0xfb, 0xb9, 0xed, 0x86, 0xe7, 0x9f, 0x21, 0xd8, 0xd3, 0x9f, 0xc5, 0x6a, 0x92, 0x9e, 0x5f, 0xf5, 0xeb, 0xfd, 0xa7, 0x7b, 0xce, 0xdf, 0x81, 0x10, 0xf7, 0x1a, 0x3b, 0x7a, 0x14, 0x5a, + 0xae, 0xdd, 0x89, 0x13, 0x33, 0xcb, 0xdc, 0x33, 0x25, 0xea, 0x0d, 0xbd, 0x7b, 0xef, 0xe9, 0xe5, 0x6e, 0xef, 0x45, 0xdf, 0x3e, 0x3d, 0xf4, 0xc8, 0xd9, 0xe0, 0x24, 0x33, 0x7f, 0x47, 0xdf, 0xa0, + 0x37, 0xf8, 0xba, 0xf1, 0xe6, 0xa7, 0xc8, 0xe7, 0xc7, 0xa4, 0x79, 0x6c, 0x26, 0x99, 0x99, 0x9e, 0x5e, 0x99, 0x78, 0x43, 0x6f, 0x7f, 0xfc, 0x0d, 0xa0, 0x59, 0xda, 0x79, 0x97, 0xa8, 0xee, 0x1b, + 0xfc, 0xe9, 0x77, 0xa9, 0x71, 0x96, 0x02, 0x04, 0xfb, 0xdc, 0xf2, 0x10, 0x03, 0xf8, 0x0d, 0xa6, 0x3e, 0x3d, 0xe3, 0x1d, 0xfc, 0xe6, 0x06, 0xfc, 0x0d, 0x7e, 0x23, 0xde, 0x25, 0xa3, 0xf9, 0x7f, + 0x96, 0x8f, 0x06, 0x82, 0xff, 0x37, 0x88, 0x8c, 0xdc, 0x37, 0x53, 0xf0, 0xdf, 0x54, 0x35, 0x75, 0xf2, 0x2c, 0x4a, 0x9d, 0x44, 0xcd, 0x1c, 0x17, 0x2c, 0xa3, 0xc4, 0xe8, 0x94, 0x89, 0x1a, 0x5f, + 0xf7, 0xc3, 0xab, 0x8e, 0x06, 0xbf, 0x21, 0x6f, 0xc4, 0x47, 0x4f, 0x4a, 0xcc, 0x34, 0xf2, 0x0b, 0xb3, 0xf9, 0x02, 0x27, 0xcb, 0xe2, 0xf4, 0x5f, 0x40, 0x30, 0x31, 0x6d, 0x37, 0xcd, 0x92, 0xea, + 0x2d, 0x8c, 0x03, 0x2f, 0x7d, 0x8b, 0x12, 0xfb, 0xf1, 0x53, 0xc0, 0xce, 0xc7, 0x71, 0xa7, 0xa1, 0xfd, 0x96, 0xd9, 0xf5, 0x07, 0x7d, 0x37, 0xcc, 0x4c, 0x3b, 0x71, 0xb3, 0xea, 0xf8, 0x80, 0xd4, + 0x51, 0x71, 0x18, 0xe9, 0xc0, 0x5b, 0x2f, 0x45, 0x96, 0x05, 0x4f, 0x49, 0x96, 0xdf, 0x5f, 0x80, 0x42, 0x0f, 0xd5, 0x05, 0xcf, 0x59, 0xaf, 0x05, 0x45, 0xc3, 0x29, 0x1a, 0xc9, 0xc8, 0x32, 0xee, + 0x23, 0xcb, 0xee, 0xc6, 0x62, 0xb6, 0x92, 0x3b, 0xf2, 0x81, 0xcd, 0xc0, 0x11, 0x87, 0x88, 0xe6, 0x55, 0xd8, 0x3c, 0x87, 0x47, 0x40, 0x9f, 0xf6, 0xd9, 0x99, 0x5c, 0x2f, 0x7a, 0xdb, 0x9e, 0x31, + 0x28, 0x07, 0x5b, 0x79, 0x52, 0x6c, 0xf4, 0x11, 0xfd, 0xb7, 0xbf, 0x7d, 0x3c, 0xd5, 0x0c, 0x6d, 0x37, 0xfc, 0xdc, 0x6f, 0x2e, 0x1c, 0xfc, 0xd7, 0xbf, 0x41, 0x6f, 0xf0, 0xb1, 0x4b, 0xb6, 0x00, + 0x57, 0x53, 0x35, 0xd3, 0x07, 0xf5, 0xc8, 0x30, 0x3b, 0x56, 0x72, 0x52, 0x66, 0xf7, 0x40, 0x25, 0xdf, 0x60, 0xe4, 0x0d, 0x86, 0x7f, 0x0e, 0xeb, 0x67, 0xfa, 0x60, 0xe7, 0xea, 0xa4, 0x73, 0x26, + 0xfb, 0x1c, 0x51, 0x25, 0x83, 0xab, 0xc8, 0x60, 0x0e, 0xb0, 0xac, 0x57, 0xae, 0x39, 0xe7, 0x97, 0xbb, 0x75, 0x28, 0x63, 0xce, 0x7c, 0xef, 0x94, 0x7b, 0xd2, 0x19, 0xba, 0x48, 0x38, 0x98, 0xc2, + 0x53, 0x93, 0x46, 0xfb, 0xb2, 0x0f, 0xec, 0x91, 0xa9, 0x78, 0x80, 0x09, 0x7e, 0xb4, 0xb4, 0xc7, 0x10, 0x50, 0x93, 0x46, 0x18, 0xd8, 0xc5, 0xbc, 0x2b, 0x66, 0x23, 0xdf, 0xcc, 0xfb, 0xd2, 0x50, + 0x70, 0x05, 0x0e, 0x5e, 0xe8, 0xa3, 0xf2, 0x1a, 0x51, 0xc3, 0x2c, 0xae, 0xd4, 0xfe, 0xf9, 0xd2, 0x43, 0x0d, 0x75, 0xfa, 0x2c, 0xc7, 0xb5, 0x1d, 0xdf, 0xb5, 0x9d, 0x8b, 0x8a, 0x80, 0xa1, 0x2b, + 0x5d, 0xf7, 0x14, 0x74, 0xc7, 0xf4, 0x63, 0x33, 0xe9, 0x14, 0xaa, 0xef, 0x1a, 0x47, 0x4d, 0xdb, 0x71, 0x0d, 0x33, 0xcc, 0x5c, 0xeb, 0xd4, 0x83, 0xee, 0x73, 0x01, 0x41, 0xde, 0xf0, 0x57, 0x99, + 0xf0, 0xcd, 0xf3, 0xc0, 0xce, 0x77, 0xad, 0x9d, 0xd3, 0x73, 0x9f, 0x73, 0x49, 0x1d, 0x6f, 0x72, 0x80, 0xf0, 0xfb, 0xc9, 0x9e, 0xf2, 0xb3, 0x18, 0x18, 0x3b, 0xbb, 0xb1, 0x6c, 0xed, 0x60, 0x5e, + 0x1a, 0x56, 0x39, 0x8d, 0x15, 0xa4, 0x85, 0xc6, 0x34, 0xc0, 0x8c, 0x71, 0x6e, 0x6a, 0xcd, 0x58, 0x22, 0xa4, 0x45, 0x88, 0x8d, 0xdd, 0x6e, 0x2e, 0xec, 0x73, 0xd9, 0xa3, 0x38, 0xd3, 0xb1, 0x21, + 0x55, 0x76, 0xb9, 0x7a, 0x2d, 0x6a, 0xc2, 0x6a, 0x3c, 0x54, 0x23, 0xa2, 0xce, 0x18, 0x5a, 0xfc, 0x81, 0xdc, 0x13, 0x6f, 0xdd, 0x9f, 0x88, 0xfd, 0x35, 0xff, 0xfe, 0x01, 0x78, 0x5f, 0xa8, 0x1f, + 0xd1, 0xbd, 0x1c, 0xb7, 0xc6, 0x92, 0x59, 0x4e, 0xfc, 0x1e, 0xec, 0xd8, 0xa1, 0x69, 0x2c, 0xf1, 0xcd, 0x22, 0x1c, 0x0a, 0xbe, 0xa7, 0xa8, 0x65, 0xa6, 0xda, 0x24, 0x07, 0x57, 0x73, 0x4b, 0x8c, + 0xa1, 0xcc, 0x98, 0x8d, 0x59, 0x2e, 0xe2, 0x08, 0x5a, 0x01, 0xe6, 0x7a, 0xd0, 0x5d, 0x15, 0xbb, 0x64, 0x82, 0x77, 0xc1, 0x6d, 0x85, 0x77, 0xd1, 0x6d, 0x6c, 0x43, 0x35, 0x7f, 0xe0, 0x10, 0xe6, + 0xd0, 0x83, 0x57, 0xf3, 0xad, 0x2c, 0x92, 0xf2, 0x67, 0x89, 0x7f, 0x26, 0xde, 0xdf, 0x0a, 0x68, 0x33, 0x26, 0x5e, 0xc3, 0x73, 0x34, 0x3d, 0x1c, 0xd5, 0xdf, 0x9d, 0xc7, 0xa6, 0x4f, 0x36, 0x81, + 0x97, 0x76, 0xb2, 0x68, 0x67, 0x86, 0xe9, 0x79, 0x04, 0xba, 0xd6, 0x4f, 0xff, 0x68, 0xf6, 0x82, 0x37, 0xad, 0x6a, 0x98, 0xba, 0x9d, 0x34, 0xab, 0xfc, 0x9b, 0x07, 0x5d, 0xf3, 0x1d, 0x7d, 0x43, + 0xde, 0x7e, 0xae, 0xeb, 0xae, 0xe8, 0x82, 0x9d, 0xeb, 0xb3, 0x4e, 0x43, 0xef, 0x39, 0xcb, 0x57, 0x12, 0xa4, 0x8c, 0x88, 0x9d, 0xb2, 0x30, 0x24, 0x87, 0xda, 0x56, 0xe3, 0x12, 0x5d, 0xf2, 0xda, + 0x36, 0x00, 0x73, 0x60, 0xb6, 0xb7, 0x52, 0xfa, 0xd0, 0x8f, 0xd7, 0x02, 0x34, 0xb7, 0xba, 0xe9, 0x9e, 0x02, 0xcd, 0x2e, 0xb6, 0x3e, 0x1c, 0x84, 0x78, 0x3e, 0x39, 0x74, 0x07, 0x0b, 0x78, 0xe0, + 0x57, 0x6c, 0x26, 0xac, 0x7a, 0x33, 0x41, 0x04, 0xa8, 0x30, 0xf3, 0xf7, 0x83, 0x83, 0xbb, 0xd0, 0x81, 0x04, 0xdf, 0xd3, 0xed, 0x58, 0xae, 0x47, 0x7e, 0x94, 0x1c, 0x07, 0xf2, 0xc2, 0x4c, 0xb2, + 0xf3, 0x00, 0xde, 0x7d, 0x81, 0x45, 0x3f, 0xd1, 0x7f, 0xf7, 0xd9, 0x73, 0x91, 0xa1, 0x7b, 0x8c, 0x41, 0x6e, 0x6c, 0xdd, 0xb6, 0x8c, 0x69, 0x28, 0x1e, 0x07, 0x9e, 0xe3, 0xff, 0x4e, 0x43, 0xe3, + 0x39, 0x33, 0xf8, 0xcc, 0x05, 0xac, 0xae, 0x1f, 0x8f, 0x67, 0x7a, 0x39, 0xc0, 0xb2, 0xf5, 0x8a, 0x02, 0x85, 0x44, 0x92, 0xb2, 0x01, 0x6c, 0x2b, 0x2e, 0x60, 0x51, 0x83, 0xbd, 0x5f, 0xd1, 0x46, + 0x94, 0x27, 0xaa, 0xaf, 0x0f, 0xd6, 0x03, 0x71, 0x3d, 0x40, 0x80, 0x99, 0xcd, 0x72, 0x4b, 0xc7, 0xdb, 0xb1, 0x1a, 0x30, 0x1a, 0x30, 0xd3, 0x7d, 0x57, 0xcb, 0x95, 0xb2, 0x0f, 0x1f, 0xf4, 0x9d, + 0x28, 0x63, 0xb1, 0xb9, 0xcc, 0xc5, 0x76, 0xcc, 0xb8, 0x95, 0xd0, 0xa3, 0x19, 0x88, 0xdc, 0xda, 0x5d, 0x66, 0xaa, 0xab, 0xb1, 0xd9, 0x49, 0xb3, 0xc4, 0x0d, 0xed, 0x4e, 0x62, 0xda, 0xe6, 0x21, + 0x3e, 0x33, 0x0d, 0xba, 0xed, 0x91, 0x69, 0x1e, 0xc7, 0x51, 0x92, 0xa5, 0x9d, 0x86, 0xc1, 0x67, 0xc3, 0x0b, 0xfd, 0x8f, 0x61, 0xec, 0x27, 0x11, 0xbb, 0x6f, 0xbc, 0x5d, 0x4f, 0x34, 0x5a, 0x33, + 0xf8, 0x9a, 0x72, 0x63, 0x61, 0x5c, 0x9d, 0x77, 0x1a, 0x9a, 0xcf, 0x19, 0x2e, 0x5a, 0xb4, 0x9c, 0x19, 0x40, 0x31, 0x30, 0xe8, 0x6c, 0x20, 0xea, 0x2c, 0xc5, 0xb2, 0xd5, 0x36, 0x83, 0xad, 0xed, + 0xfa, 0xb0, 0xdc, 0xd3, 0xee, 0x04, 0xd1, 0x97, 0x3d, 0xa2, 0xee, 0x31, 0xd4, 0x0c, 0xd5, 0xe3, 0xb4, 0xcf, 0xd0, 0xc5, 0xe2, 0x10, 0x77, 0x6b, 0x61, 0x68, 0x13, 0x43, 0x70, 0xc9, 0x71, 0xe3, + 0x2d, 0x2d, 0x51, 0x14, 0xa8, 0xd6, 0xe0, 0x28, 0xef, 0x0d, 0xe9, 0x69, 0x3a, 0x5b, 0x69, 0x43, 0xbb, 0x1d, 0xc3, 0x4f, 0x2f, 0x7c, 0x99, 0x4c, 0xc2, 0x6f, 0xf0, 0x1b, 0xfa, 0x27, 0xc1, 0x1d, + 0x3e, 0xb6, 0xe9, 0x4e, 0x8f, 0x79, 0x0d, 0xeb, 0xf0, 0x62, 0xca, 0x5d, 0x4e, 0x3a, 0x0d, 0xb5, 0xef, 0x51, 0x86, 0x3b, 0x71, 0x97, 0x59, 0xb9, 0x5d, 0x57, 0x17, 0x0b, 0x73, 0x85, 0xca, 0xa3, + 0xca, 0x43, 0xc5, 0x11, 0xaf, 0xc7, 0x52, 0xc1, 0xca, 0x7f, 0xfb, 0xf5, 0xea, 0x87, 0x3a, 0x6a, 0xda, 0xb1, 0x7c, 0xd5, 0x7e, 0xa8, 0xcc, 0xaf, 0x47, 0xa2, 0xb6, 0x9f, 0x79, 0x21, 0x7a, 0x1c, + 0xbb, 0xcf, 0x87, 0x9d, 0x86, 0xd2, 0xb3, 0x4f, 0xcc, 0x8c, 0x85, 0x8c, 0xb2, 0x43, 0x25, 0x71, 0xc7, 0xeb, 0xc0, 0x9a, 0x0d, 0x2d, 0x3f, 0xe2, 0x28, 0xd2, 0x5f, 0xe5, 0x05, 0xd4, 0xde, 0x8e, + 0xf9, 0xfd, 0xce, 0xf6, 0xa5, 0xdf, 0xdf, 0x83, 0x06, 0x7f, 0xc3, 0x5f, 0x80, 0xe6, 0x96, 0x34, 0xd8, 0xf9, 0x74, 0xa1, 0xd3, 0x50, 0x6d, 0xd1, 0xdf, 0xbc, 0x95, 0x57, 0x1a, 0x9b, 0x51, 0x86, + 0x41, 0x14, 0x3f, 0x72, 0xe9, 0x3d, 0xbb, 0xc1, 0x22, 0x79, 0x92, 0xda, 0x32, 0xd2, 0xdf, 0xd3, 0xc3, 0x3a, 0x45, 0xe6, 0xf1, 0x2e, 0xc0, 0x54, 0x71, 0xab, 0x79, 0x01, 0xa0, 0xf4, 0xd7, 0x7d, + 0x7d, 0x8d, 0x2d, 0xad, 0xc1, 0x4c, 0x4a, 0xb0, 0x9c, 0x9f, 0x29, 0x81, 0x0a, 0x99, 0x15, 0x66, 0xe1, 0xbe, 0x3d, 0x4d, 0x76, 0x0c, 0xa4, 0x6e, 0x20, 0x91, 0x8f, 0x5a, 0x1a, 0x38, 0x57, 0x22, + 0x73, 0x9a, 0x64, 0xff, 0x83, 0xf4, 0xe1, 0x8d, 0x6f, 0x22, 0xd1, 0x1f, 0xb0, 0x01, 0x7a, 0xc3, 0x5e, 0x30, 0x37, 0x3e, 0x13, 0x07, 0x3b, 0xef, 0x87, 0x9d, 0x86, 0xe2, 0x73, 0x16, 0xe0, 0x05, + 0x29, 0xf5, 0xfa, 0xdd, 0xd8, 0x5f, 0x39, 0xc5, 0x41, 0x34, 0xd7, 0xd3, 0x4d, 0x4f, 0x2a, 0x06, 0xc5, 0x98, 0x31, 0x38, 0x22, 0xee, 0xa7, 0x46, 0xe8, 0x23, 0x36, 0x68, 0xd0, 0x71, 0x16, 0xe4, + 0x83, 0xfe, 0xdc, 0x34, 0x44, 0xac, 0x9f, 0xec, 0xf1, 0x24, 0xed, 0xa5, 0x1b, 0x20, 0x28, 0x68, 0x9e, 0x80, 0xa1, 0x91, 0x33, 0x53, 0x05, 0x64, 0x8d, 0xaf, 0x60, 0x43, 0x10, 0xc2, 0xde, 0xe4, + 0xb0, 0x13, 0x5f, 0x9e, 0x55, 0xa9, 0x5e, 0xf1, 0xeb, 0xe4, 0xb8, 0x80, 0x91, 0x37, 0xec, 0x7a, 0x14, 0x33, 0x4c, 0x2d, 0x3f, 0x31, 0x0b, 0xfb, 0xec, 0x9c, 0x30, 0xd3, 0x38, 0x31, 0x4f, 0x8e, + 0x0b, 0xf2, 0xb3, 0x3f, 0xc4, 0xf6, 0x23, 0x4d, 0xf5, 0x4f, 0x63, 0xe8, 0x71, 0xa2, 0x79, 0xdb, 0xea, 0xda, 0x61, 0x94, 0x5c, 0x1c, 0x22, 0xd0, 0x95, 0xcf, 0xe0, 0xd8, 0x16, 0x1c, 0x25, 0xba, + 0x63, 0x25, 0x66, 0xea, 0xdc, 0x1f, 0x82, 0xbd, 0xb4, 0x53, 0xa9, 0x81, 0x7f, 0x6e, 0x84, 0x3f, 0xb9, 0x5a, 0x02, 0x37, 0x74, 0x03, 0x35, 0xd3, 0x9d, 0x77, 0x09, 0xbb, 0xf9, 0x9e, 0xe3, 0xc0, + 0x1d, 0x77, 0xbc, 0x34, 0x0a, 0x3b, 0x7a, 0x14, 0x04, 0x17, 0x57, 0xdd, 0x91, 0xd0, 0x1b, 0xfc, 0x43, 0x51, 0xfc, 0x3b, 0x0c, 0x1d, 0xf1, 0x82, 0xfe, 0xf8, 0x1f, 0xff, 0xe3, 0x8f, 0x7f, 0xfd, + 0x1b, 0x8c, 0xbc, 0xb5, 0x9c, 0xf9, 0x7f, 0x16, 0x9f, 0x9b, 0xd6, 0x0b, 0xe0, 0xf7, 0xc4, 0x15, 0xbb, 0xf1, 0x2b, 0xb5, 0x15, 0xd7, 0x86, 0x22, 0xd8, 0x39, 0xfd, 0xef, 0x34, 0x34, 0x9e, 0x0b, + 0xa8, 0x11, 0xf5, 0x4b, 0xa3, 0x08, 0xb0, 0x39, 0x6b, 0x4e, 0xb0, 0x09, 0xba, 0x10, 0x67, 0x88, 0xc2, 0x22, 0xcc, 0x56, 0x66, 0xd4, 0x43, 0x39, 0xa5, 0x17, 0xec, 0x5e, 0x09, 0x78, 0x2f, 0x1b, + 0x50, 0x2a, 0x0e, 0x8f, 0x91, 0x85, 0x06, 0x1d, 0xe2, 0x95, 0x1f, 0x0d, 0x16, 0x21, 0x2b, 0xf4, 0xca, 0xbd, 0x17, 0x97, 0x21, 0x1d, 0xa9, 0x11, 0x16, 0x9b, 0xfe, 0x8c, 0xf2, 0xd1, 0xc5, 0xd8, + 0x28, 0x50, 0x7b, 0xf1, 0xba, 0x80, 0x06, 0x0d, 0x97, 0x8e, 0x82, 0x84, 0xfc, 0x90, 0x49, 0xc7, 0xb9, 0xcb, 0x1d, 0x1d, 0x13, 0x9b, 0x66, 0x72, 0xed, 0x07, 0xe5, 0xcd, 0x4c, 0xbd, 0x25, 0xf0, + 0x50, 0x8f, 0x37, 0xad, 0x67, 0x37, 0xad, 0x7f, 0xfe, 0x84, 0xf7, 0xa6, 0xff, 0xf9, 0xbb, 0xfc, 0xff, 0xe8, 0x39, 0x77, 0x2d, 0x07, 0xe4, 0xc6, 0x69, 0xd9, 0x56, 0x04, 0xce, 0x44, 0xc1, 0xce, + 0xe5, 0xa8, 0x73, 0x22, 0xf4, 0x5c, 0x0e, 0x98, 0xf5, 0x88, 0xcd, 0xeb, 0xba, 0x57, 0xf4, 0x22, 0x0e, 0xc7, 0x66, 0xdc, 0x84, 0x4d, 0xcd, 0x9e, 0x1a, 0xd2, 0x4e, 0x1f, 0x65, 0xcd, 0x5e, 0x94, + 0xd8, 0xbd, 0x29, 0xce, 0x4b, 0xc4, 0x94, 0xdf, 0x6c, 0x3c, 0x64, 0xcd, 0x86, 0x46, 0x57, 0x66, 0x91, 0xb4, 0x36, 0x76, 0x18, 0xbd, 0x9e, 0x5a, 0x9e, 0x61, 0xcf, 0x18, 0x76, 0x33, 0x95, 0xd5, + 0x70, 0xb3, 0xd5, 0x63, 0x86, 0x99, 0x08, 0xcb, 0xf5, 0xb0, 0xb4, 0x5f, 0x96, 0x83, 0xac, 0x8a, 0xcd, 0x8e, 0x75, 0xf1, 0xb3, 0x42, 0x6f, 0xd4, 0x8f, 0x3b, 0xed, 0xbf, 0xfe, 0x8d, 0xfa, 0xfa, + 0x0b, 0x2b, 0x0f, 0x0d, 0x37, 0xb4, 0x6f, 0x7f, 0x91, 0x27, 0xfe, 0x35, 0xac, 0xb6, 0x9b, 0x39, 0xb9, 0xf6, 0xa6, 0x47, 0x01, 0x98, 0xc6, 0x51, 0x98, 0x46, 0x49, 0x0a, 0xa6, 0x6e, 0x68, 0x1c, + 0x59, 0x90, 0x38, 0x79, 0xfa, 0xdb, 0x3d, 0x3f, 0x78, 0xc4, 0xf4, 0x93, 0xd8, 0xff, 0x94, 0xe7, 0xc1, 0x91, 0xdd, 0x41, 0xda, 0x69, 0x7e, 0xfd, 0x9c, 0xd1, 0xe9, 0x70, 0x37, 0x3f, 0x00, 0x2b, + 0x8f, 0xcf, 0x02, 0x9a, 0xe0, 0x37, 0x08, 0x19, 0xd1, 0xd8, 0x80, 0x19, 0xf4, 0xa7, 0x03, 0x56, 0x51, 0xb0, 0x25, 0xb6, 0xd9, 0x9b, 0x43, 0x61, 0xc3, 0x16, 0x04, 0x95, 0x49, 0x80, 0xa7, 0xa1, + 0xc5, 0x0e, 0x5c, 0x54, 0xea, 0x64, 0x3d, 0x87, 0xe6, 0xd2, 0xa4, 0x5a, 0x67, 0xc1, 0x74, 0xc9, 0x43, 0x1a, 0xa0, 0x1a, 0xb2, 0xd4, 0x2f, 0xb4, 0x14, 0x9e, 0xf7, 0x55, 0x0e, 0x79, 0xe0, 0xe7, + 0x7b, 0x15, 0xa1, 0xfb, 0xca, 0xfb, 0xbe, 0xe9, 0x09, 0xbf, 0xa0, 0x29, 0xef, 0xd0, 0x3f, 0x1a, 0x59, 0x5f, 0xaf, 0x76, 0x1a, 0xfa, 0xcf, 0x41, 0x25, 0xac, 0xb9, 0x0e, 0x2c, 0x30, 0xd7, 0x29, + 0xf7, 0x73, 0x62, 0x06, 0xaa, 0xa3, 0x02, 0xb1, 0x60, 0x9b, 0xe7, 0x28, 0x5f, 0x58, 0x65, 0x6b, 0x91, 0x8b, 0xf6, 0x2c, 0x56, 0x4d, 0x88, 0x68, 0xd9, 0x5b, 0xad, 0x22, 0x3d, 0x0f, 0xe8, 0xd4, + 0x62, 0xf7, 0xde, 0x6e, 0x13, 0xee, 0xdd, 0x2d, 0xef, 0x04, 0x7c, 0xb9, 0x04, 0x83, 0x3e, 0x37, 0x8d, 0xc9, 0x95, 0xe9, 0xf8, 0x19, 0xba, 0xf7, 0x09, 0xbf, 0xef, 0x3e, 0xeb, 0x3d, 0xff, 0xfb, + 0x8a, 0xbf, 0xa5, 0xa6, 0x99, 0x6b, 0x55, 0xa0, 0xea, 0x15, 0x47, 0x28, 0x63, 0xd7, 0x7f, 0xe8, 0x70, 0x45, 0x5f, 0x32, 0x90, 0xef, 0x3e, 0x01, 0xec, 0xdc, 0x9c, 0x76, 0xd0, 0x76, 0x56, 0xb2, + 0xa9, 0x69, 0xfd, 0xcc, 0x1f, 0x91, 0xc6, 0x61, 0x33, 0xc0, 0x6b, 0x77, 0x66, 0x24, 0x10, 0x1e, 0x08, 0x5b, 0x6a, 0x16, 0xf6, 0xdc, 0x39, 0x03, 0x6f, 0x0a, 0xda, 0x9f, 0x72, 0x7a, 0xb6, 0xc8, + 0xc0, 0x85, 0x0e, 0xb0, 0xe8, 0x94, 0x15, 0x56, 0x6b, 0xdc, 0x0d, 0xe4, 0xd5, 0x06, 0x08, 0x9c, 0x42, 0x76, 0xc2, 0x59, 0x1d, 0xcc, 0x19, 0xce, 0x2c, 0xe5, 0x9d, 0x30, 0xb0, 0x87, 0x3e, 0x7b, + 0xb0, 0x0d, 0xba, 0xa5, 0x4f, 0xe8, 0x62, 0x8f, 0x51, 0x6f, 0xf0, 0x27, 0xd3, 0xe9, 0xf8, 0x25, 0x56, 0x94, 0x04, 0xea, 0xd9, 0x6e, 0x41, 0x3e, 0x5b, 0x65, 0x47, 0x04, 0x3a, 0x79, 0xe2, 0xfe, + 0xfa, 0xf0, 0x05, 0xbe, 0xc8, 0x99, 0x4f, 0xbe, 0xbb, 0xe6, 0x95, 0xee, 0xb1, 0x8a, 0x6a, 0x8c, 0xa0, 0x1f, 0xf3, 0x4a, 0xf5, 0x8a, 0x33, 0x67, 0x4e, 0x04, 0x9e, 0x73, 0x24, 0x5d, 0xe4, 0xf0, + 0x2e, 0xd6, 0x85, 0x6e, 0x35, 0xcd, 0xb6, 0x07, 0x66, 0x52, 0xec, 0x2d, 0xc9, 0x74, 0xba, 0x93, 0x5a, 0xe9, 0x97, 0x02, 0xba, 0x94, 0xaa, 0x0d, 0xcc, 0x49, 0x00, 0xc6, 0xaa, 0xbd, 0x9a, 0x25, + 0xb8, 0x58, 0x1a, 0x6e, 0x9d, 0x91, 0x33, 0x1f, 0xd5, 0x5e, 0x77, 0x93, 0x4f, 0x64, 0x72, 0xb2, 0xed, 0x95, 0xa1, 0x6a, 0x3a, 0xb8, 0xa3, 0x0b, 0xa5, 0x57, 0xc1, 0x62, 0x3e, 0xae, 0x99, 0x79, + 0x4b, 0x8e, 0x34, 0xb0, 0x1a, 0xa6, 0x19, 0x77, 0xcc, 0x7d, 0xae, 0xfa, 0x57, 0x36, 0xe3, 0x15, 0xf6, 0x8d, 0x8e, 0x48, 0x75, 0xc7, 0x0c, 0xd4, 0x4e, 0x96, 0xa8, 0x47, 0x8c, 0xce, 0x86, 0xe2, + 0x67, 0x9f, 0xec, 0x79, 0xbd, 0xbb, 0x63, 0x25, 0x51, 0x70, 0x76, 0x26, 0xbd, 0x33, 0xec, 0x66, 0x39, 0x38, 0x4f, 0xdc, 0x8e, 0x77, 0xf1, 0xdc, 0x22, 0xf7, 0xac, 0x9f, 0xbb, 0x9d, 0xf7, 0x38, + 0x4e, 0x1e, 0x7f, 0x74, 0xea, 0xb5, 0xb7, 0x04, 0x9f, 0x76, 0x6b, 0x33, 0x8e, 0x34, 0x33, 0x31, 0xeb, 0x9d, 0x1b, 0xfe, 0x39, 0xb2, 0xf3, 0x00, 0x97, 0xfb, 0xae, 0x91, 0x57, 0x7c, 0x06, 0xf7, + 0x1e, 0x00, 0x76, 0xee, 0x5e, 0xee, 0xc0, 0xcf, 0x7d, 0x09, 0x47, 0x61, 0x9b, 0xf1, 0x14, 0x38, 0xef, 0x86, 0xe8, 0xc6, 0xdb, 0x38, 0x23, 0x25, 0x84, 0xfd, 0xa9, 0xb3, 0x1b, 0xa8, 0x34, 0x2b, + 0x09, 0xf2, 0x42, 0xdc, 0x78, 0x6b, 0x67, 0x85, 0x31, 0x34, 0xb8, 0x08, 0x85, 0x82, 0x3a, 0x14, 0xf6, 0x3e, 0xdb, 0xc7, 0xf4, 0xa6, 0x3b, 0x12, 0xb0, 0x60, 0x21, 0x1e, 0x96, 0x07, 0x78, 0xe1, + 0x47, 0x58, 0xb6, 0xaf, 0xcd, 0xbd, 0x06, 0xa5, 0x82, 0x9f, 0xe4, 0xaa, 0x50, 0xa1, 0x46, 0x7e, 0x54, 0xdd, 0x2d, 0x90, 0x3c, 0xca, 0x59, 0x60, 0x26, 0xf6, 0x63, 0x90, 0xd0, 0x17, 0x40, 0xfa, + 0x4a, 0xbe, 0x99, 0x14, 0x9c, 0x8f, 0x3b, 0x0d, 0xd1, 0xe7, 0xb8, 0x8c, 0x29, 0x49, 0x58, 0x32, 0x7b, 0x74, 0x19, 0x29, 0x5a, 0xcf, 0xe1, 0xbb, 0xc0, 0x02, 0xcc, 0x49, 0xd2, 0x99, 0x77, 0x51, + 0xbb, 0x06, 0x13, 0xd5, 0x5b, 0xd2, 0xc0, 0x04, 0xd9, 0x0d, 0x2b, 0xd7, 0x9b, 0xc7, 0xc2, 0x62, 0xbe, 0x96, 0x37, 0x9c, 0x1c, 0x4b, 0xaa, 0x6f, 0x46, 0x1e, 0xd0, 0x45, 0xe8, 0x14, 0x5a, 0x76, + 0xf3, 0xf9, 0x62, 0x4e, 0x0a, 0x2e, 0x35, 0xda, 0xf3, 0x16, 0x94, 0x03, 0x49, 0x44, 0xd0, 0xed, 0x70, 0x31, 0x93, 0xe4, 0xa1, 0x47, 0x05, 0xfd, 0x3d, 0x4c, 0x1a, 0xd2, 0xc7, 0x89, 0xfc, 0xf1, + 0x7f, 0x07, 0x6d, 0x87, 0x85, 0xe1, 0x91, 0x85, 0x37, 0x0a, 0x61, 0x3a, 0xa1, 0xd2, 0xd5, 0xc6, 0x43, 0x2a, 0x7a, 0xe3, 0xf2, 0x33, 0x76, 0xdc, 0x0b, 0x96, 0x5d, 0x5e, 0xec, 0x6e, 0x78, 0x7f, + 0x64, 0xea, 0x1b, 0xc4, 0x18, 0xd5, 0xb5, 0xe3, 0x2d, 0x39, 0xb6, 0x9a, 0x44, 0x58, 0xcf, 0xd8, 0x78, 0x1b, 0x3e, 0x25, 0xcb, 0xc9, 0x1a, 0xd9, 0x79, 0x44, 0x55, 0xac, 0x16, 0xcb, 0x38, 0x17, + 0x3d, 0x41, 0x41, 0xb7, 0xd3, 0xc4, 0xc1, 0x89, 0xb2, 0x1d, 0x16, 0x8d, 0x42, 0x3a, 0x09, 0x78, 0xa3, 0x3e, 0x5c, 0xab, 0x7a, 0x36, 0xa6, 0x62, 0xbf, 0x07, 0xd1, 0x77, 0x4f, 0x04, 0x3b, 0xdf, + 0x36, 0x37, 0xb3, 0xce, 0x16, 0x80, 0xaa, 0x0a, 0xbd, 0x19, 0x6e, 0x23, 0x22, 0x40, 0x90, 0xc1, 0x0e, 0xae, 0x95, 0xba, 0x2f, 0x4f, 0x98, 0x22, 0xcf, 0x40, 0x76, 0x34, 0x12, 0x4d, 0x90, 0x51, + 0xe3, 0xbe, 0xb0, 0x08, 0x0f, 0x6e, 0x0f, 0x17, 0x13, 0x68, 0x37, 0xe7, 0xf6, 0xfb, 0x11, 0xd1, 0x9d, 0x65, 0x7d, 0x9e, 0x0d, 0x4c, 0x12, 0x73, 0x00, 0x35, 0x23, 0x91, 0x74, 0xee, 0x68, 0x3b, + 0x0d, 0x53, 0x92, 0xa9, 0x01, 0xaf, 0xd1, 0xc9, 0x62, 0xfa, 0x13, 0x0d, 0x7f, 0xfb, 0xfe, 0xbf, 0x4e, 0x4e, 0x7b, 0xb2, 0xdd, 0x18, 0x7a, 0x3c, 0xf3, 0x5d, 0x0d, 0xb4, 0xd2, 0xb7, 0x54, 0x57, + 0x43, 0xc3, 0x7d, 0xc4, 0x87, 0xe3, 0x98, 0x8d, 0xfd, 0x9c, 0x0f, 0x5f, 0xe9, 0x1f, 0x51, 0x7f, 0x3f, 0x69, 0x0c, 0x7d, 0xec, 0x39, 0xc6, 0x28, 0x6a, 0xa3, 0x31, 0x3f, 0xde, 0xa1, 0x9a, 0x8d, + 0x87, 0x1b, 0x6d, 0x0a, 0x02, 0xec, 0x96, 0x18, 0x21, 0xe6, 0xb8, 0x57, 0x2b, 0x74, 0xe8, 0x62, 0xdd, 0xb9, 0x35, 0x0e, 0xa7, 0xb8, 0x65, 0x3b, 0x73, 0xc9, 0xb6, 0xe7, 0x05, 0x63, 0x80, 0xf1, + 0x60, 0xb6, 0xb4, 0xc7, 0xa9, 0x41, 0xdb, 0xeb, 0x38, 0xcb, 0x07, 0x39, 0xb9, 0xdf, 0x83, 0xfd, 0x45, 0x21, 0x6c, 0x07, 0xbe, 0x53, 0xa4, 0x53, 0x89, 0x9d, 0xd0, 0x2f, 0xcf, 0xe8, 0x6e, 0x3e, + 0x2b, 0x53, 0xb3, 0x13, 0x40, 0x9f, 0xbc, 0x36, 0x49, 0x1e, 0x76, 0x62, 0x35, 0x51, 0x7d, 0xdf, 0xf4, 0xcf, 0x03, 0x2a, 0xfc, 0xd6, 0xfd, 0xf1, 0xcc, 0xef, 0x0f, 0xea, 0xa7, 0x7c, 0x3c, 0xbd, + 0xd0, 0x7d, 0x26, 0x42, 0xbf, 0xcb, 0xc4, 0x4c, 0xcd, 0xce, 0x1c, 0xcc, 0xd4, 0xac, 0xd3, 0x10, 0x7c, 0xce, 0xbe, 0xd1, 0xd6, 0xe7, 0xc6, 0x34, 0xa4, 0xfb, 0x19, 0x02, 0xac, 0x6c, 0x52, 0xd3, + 0xf5, 0x3d, 0x20, 0xd5, 0x0b, 0x63, 0x5c, 0x14, 0x70, 0x57, 0x47, 0x46, 0xb3, 0x3d, 0xb3, 0x4c, 0x23, 0x61, 0x1a, 0xc3, 0x9e, 0x49, 0x1e, 0xbc, 0x2c, 0x21, 0xc7, 0x08, 0x01, 0xac, 0x37, 0x0b, + 0x12, 0xe1, 0x59, 0xa3, 0x90, 0xbb, 0x7b, 0x78, 0x2f, 0xd5, 0xa3, 0x75, 0xcf, 0x72, 0x78, 0x0b, 0xe8, 0x2d, 0x0a, 0x71, 0x3c, 0xc1, 0x9e, 0x39, 0x66, 0xfe, 0x6c, 0x5c, 0xcb, 0xc7, 0x0b, 0x8d, + 0x2f, 0x06, 0x11, 0x7d, 0x22, 0x7e, 0xc2, 0xf5, 0x78, 0xd4, 0x36, 0x72, 0x88, 0x62, 0x92, 0x48, 0x4d, 0x89, 0x42, 0xca, 0xd6, 0xd8, 0x70, 0xb4, 0x91, 0x68, 0xae, 0x17, 0xf5, 0x51, 0xc4, 0x09, + 0x67, 0x08, 0x8f, 0x57, 0x3b, 0x9b, 0x8d, 0xd7, 0x43, 0x2d, 0xdf, 0x70, 0x22, 0x8c, 0x17, 0x7d, 0x7e, 0x9f, 0x20, 0x68, 0xcc, 0x90, 0x84, 0x09, 0x0e, 0x15, 0x7d, 0x9b, 0x2a, 0x2c, 0x47, 0x4f, + 0x0b, 0x1c, 0xda, 0x65, 0x06, 0x82, 0xed, 0x9d, 0x7e, 0x35, 0x49, 0x88, 0x92, 0xc9, 0x3e, 0x3b, 0xc5, 0x5f, 0xed, 0x16, 0xef, 0xda, 0xe4, 0x93, 0xea, 0x38, 0x6b, 0xad, 0xfd, 0xb9, 0x4b, 0xdc, + 0x75, 0x74, 0xfd, 0x29, 0xac, 0xcb, 0x52, 0x03, 0xbc, 0x09, 0x22, 0xbb, 0x3f, 0xbc, 0x50, 0xaf, 0xf4, 0x88, 0x5b, 0xda, 0x60, 0xe7, 0xea, 0xa4, 0xd3, 0x90, 0x7c, 0xce, 0xbb, 0x35, 0x3f, 0x98, + 0xad, 0xd2, 0xac, 0x5c, 0x0f, 0xab, 0x5e, 0xae, 0xcc, 0x91, 0xe9, 0x70, 0xbe, 0x50, 0x80, 0xdd, 0x9c, 0x3b, 0x28, 0xd3, 0xc0, 0x11, 0x00, 0x24, 0x4a, 0x82, 0x34, 0xeb, 0x15, 0xe1, 0xc6, 0xad, + 0x22, 0x66, 0x9e, 0xad, 0xe1, 0xfd, 0xbe, 0xbb, 0x71, 0x9c, 0x64, 0x37, 0xc2, 0x66, 0xab, 0xec, 0x60, 0xa7, 0x00, 0xa2, 0xb8, 0xb2, 0xe4, 0x77, 0xe9, 0x21, 0x19, 0xce, 0x46, 0x8b, 0x3d, 0x98, + 0xb3, 0x0f, 0xa6, 0xd9, 0xdf, 0xa1, 0xd4, 0x04, 0x4f, 0xbe, 0x87, 0x2e, 0xde, 0xc3, 0x88, 0x7c, 0x43, 0xba, 0xaf, 0x8c, 0xc1, 0xd7, 0xa4, 0xdf, 0x97, 0x1b, 0x3a, 0x27, 0x6a, 0xcf, 0xf1, 0x59, + 0xcd, 0xf4, 0xc2, 0x8d, 0xb6, 0x3d, 0x8e, 0x02, 0x07, 0x07, 0xd5, 0x94, 0x26, 0x3b, 0x1e, 0x03, 0x25, 0x57, 0x2a, 0x33, 0x22, 0x66, 0x56, 0xdd, 0x3e, 0x2a, 0x58, 0xc3, 0xa0, 0x50, 0x4b, 0x2a, + 0x9b, 0xfb, 0x50, 0x92, 0x70, 0xec, 0x18, 0x9b, 0xfa, 0x30, 0xce, 0x2d, 0x24, 0x20, 0xe6, 0xdd, 0x01, 0x6d, 0x81, 0xfc, 0x54, 0x2c, 0xe8, 0x9a, 0x05, 0x88, 0x45, 0x2d, 0xf3, 0xfd, 0x69, 0x97, + 0x35, 0xc3, 0x67, 0x6e, 0x88, 0xa7, 0x81, 0xb4, 0x66, 0x9a, 0x9d, 0xd7, 0x0f, 0xfe, 0x8f, 0x6b, 0x89, 0x3e, 0xb7, 0x5e, 0xd9, 0xee, 0xa7, 0x5b, 0xda, 0x88, 0xe9, 0x2d, 0xdd, 0x3f, 0x6f, 0x7e, + 0x71, 0x43, 0xb9, 0xc1, 0xff, 0x78, 0xd0, 0x76, 0x2a, 0xb1, 0xce, 0xfd, 0xfd, 0x86, 0xef, 0xc9, 0xd2, 0x96, 0xde, 0xb0, 0x9e, 0x12, 0xee, 0x88, 0x71, 0x36, 0xe2, 0xe6, 0xae, 0x1d, 0xe3, 0xb8, + 0xbe, 0xca, 0x7a, 0x76, 0x2f, 0x11, 0x10, 0x9b, 0x5b, 0x94, 0x4e, 0x35, 0xce, 0x22, 0x04, 0x06, 0xe0, 0x5a, 0x5b, 0xb1, 0x99, 0xb0, 0x65, 0x90, 0x29, 0x3c, 0xe8, 0x96, 0xd8, 0x9e, 0x15, 0xa1, + 0x44, 0x18, 0xae, 0x99, 0x90, 0x31, 0xa1, 0xc1, 0x4c, 0x72, 0xfb, 0xe3, 0xd1, 0x03, 0x95, 0xfd, 0x14, 0x9d, 0x5b, 0x5c, 0xef, 0xcb, 0x28, 0xf4, 0x46, 0xbe, 0x0a, 0xd1, 0x15, 0xf9, 0x4f, 0x13, + 0xb0, 0x86, 0xec, 0x73, 0xb0, 0xf4, 0xc3, 0x7a, 0x20, 0xae, 0x52, 0x93, 0x09, 0x08, 0xa1, 0x3b, 0xd4, 0x4a, 0x78, 0xb4, 0xd6, 0xa8, 0x84, 0x10, 0x96, 0x98, 0xe0, 0x2c, 0x33, 0xd4, 0x99, 0x2b, + 0xd3, 0xdd, 0x80, 0x8e, 0xa7, 0x1e, 0x4f, 0x49, 0xfd, 0xcd, 0x42, 0x60, 0x72, 0x71, 0x38, 0xa5, 0x39, 0xc4, 0x45, 0x6c, 0x25, 0xd6, 0x37, 0xc6, 0x94, 0x19, 0x25, 0xf1, 0x26, 0x97, 0x7a, 0x0e, + 0x47, 0xae, 0xb4, 0x00, 0x76, 0x37, 0xc1, 0x6c, 0xf8, 0xc0, 0x3c, 0x79, 0x0a, 0x56, 0xb3, 0x98, 0xe4, 0xa6, 0x8f, 0x63, 0x26, 0x90, 0x17, 0x1c, 0xb3, 0x9f, 0x68, 0x83, 0x9d, 0xf7, 0xc3, 0x66, + 0xac, 0x6a, 0xe1, 0xab, 0xf5, 0x9c, 0x7c, 0x32, 0x1d, 0x2d, 0x12, 0xa7, 0x60, 0xe7, 0xd3, 0x7d, 0x39, 0xd7, 0x0f, 0xc4, 0x68, 0xb6, 0x0f, 0x26, 0xa6, 0x4b, 0xe3, 0xfd, 0x75, 0x92, 0xb2, 0xc2, + 0xdc, 0x49, 0xfc, 0xc1, 0x32, 0xd1, 0x92, 0x40, 0xc6, 0x14, 0x7e, 0xee, 0x79, 0xb8, 0xec, 0x83, 0xd1, 0x94, 0xe5, 0x7b, 0x42, 0x97, 0xda, 0x2c, 0xe4, 0x51, 0xb9, 0x0a, 0x48, 0xea, 0x30, 0x62, + 0x6b, 0xac, 0x3f, 0x67, 0xcd, 0x5d, 0x56, 0x9b, 0xaf, 0x0a, 0xd4, 0x79, 0x2c, 0xb9, 0x6b, 0x23, 0x41, 0x2f, 0x45, 0x0d, 0x5d, 0x11, 0x06, 0x3b, 0xcd, 0xbf, 0xce, 0x89, 0xd2, 0x73, 0x64, 0x7a, + 0x06, 0xc4, 0x6c, 0xb3, 0xb5, 0x1d, 0xae, 0xc7, 0x93, 0x52, 0x80, 0xbd, 0x5d, 0x20, 0x25, 0x75, 0x64, 0x79, 0x13, 0x44, 0xdc, 0x6c, 0x74, 0xd5, 0x85, 0x8c, 0x20, 0xab, 0x8b, 0x11, 0xe3, 0xe8, + 0x34, 0xb0, 0x48, 0x87, 0xb8, 0x43, 0x2d, 0xd0, 0x83, 0x5f, 0x65, 0x2a, 0xb4, 0x1b, 0x0a, 0xca, 0x62, 0x66, 0x4d, 0xbb, 0xc3, 0x7c, 0x91, 0x69, 0xf0, 0x2e, 0x0c, 0xe6, 0x7d, 0x47, 0x4c, 0xcc, + 0x39, 0xdb, 0x7f, 0x32, 0x23, 0xbb, 0xbc, 0x6d, 0x12, 0xa8, 0xbe, 0x5b, 0x9b, 0x9d, 0x73, 0xde, 0x42, 0xc7, 0x50, 0xb3, 0x47, 0x5d, 0x0c, 0x79, 0x6d, 0xdd, 0xf9, 0xbb, 0x27, 0x35, 0x48, 0xdd, + 0x6b, 0x68, 0xc2, 0xae, 0x5a, 0xf8, 0xaa, 0x87, 0x1e, 0xa9, 0x8f, 0xc8, 0x1a, 0xe8, 0x52, 0x3c, 0x42, 0x21, 0xd2, 0x3e, 0x88, 0x91, 0x09, 0xde, 0x1f, 0xa5, 0x51, 0x94, 0xcb, 0xfd, 0x5a, 0x63, + 0xc6, 0x8e, 0x28, 0xd6, 0xbd, 0x3e, 0xea, 0x2d, 0x47, 0x8b, 0x1d, 0x91, 0x74, 0xed, 0xb4, 0x86, 0x22, 0x39, 0xda, 0xed, 0x47, 0xf2, 0x02, 0xcb, 0xe1, 0x05, 0x6a, 0xf0, 0x5c, 0x04, 0xc5, 0x3d, + 0x8e, 0x27, 0xd3, 0x99, 0xc0, 0x55, 0x4e, 0xee, 0x57, 0x71, 0x2b, 0xe8, 0xce, 0xd1, 0xf1, 0xf7, 0x6d, 0x0a, 0xf8, 0xa5, 0x39, 0xeb, 0x07, 0xe1, 0xa3, 0x41, 0xa1, 0xc6, 0x66, 0xe7, 0x44, 0xe9, + 0x39, 0x0c, 0xd0, 0x8a, 0xd2, 0x27, 0x51, 0xc9, 0x18, 0xa9, 0x4b, 0x77, 0x43, 0xed, 0x40, 0xdb, 0x24, 0x8e, 0xc2, 0xe9, 0x00, 0xd1, 0x8d, 0xb9, 0x32, 0x73, 0xe5, 0xc8, 0xd6, 0xad, 0x91, 0x6c, + 0xca, 0xc3, 0x00, 0xd0, 0x4c, 0x4f, 0x66, 0xfa, 0xa0, 0x56, 0xb8, 0x5a, 0x8d, 0x26, 0x1c, 0x4a, 0xb8, 0xe2, 0xbc, 0xab, 0x89, 0x9e, 0x00, 0xa6, 0x42, 0x3d, 0x28, 0xe5, 0x2e, 0x09, 0xe6, 0x2c, + 0x1e, 0xb0, 0x55, 0xf4, 0x1b, 0xd3, 0xa3, 0xdb, 0xa4, 0x93, 0xf6, 0xc3, 0xe0, 0xb7, 0x29, 0x1a, 0xf7, 0xa1, 0x46, 0x5e, 0x59, 0x5a, 0x7c, 0xf6, 0xb4, 0x0f, 0x6b, 0xe5, 0x9c, 0x83, 0x71, 0x7a, + 0xce, 0x73, 0x46, 0xec, 0x35, 0xd6, 0xde, 0xcd, 0x79, 0xb2, 0xb7, 0x96, 0xd2, 0xad, 0x38, 0xf4, 0x0e, 0xdd, 0x85, 0x94, 0x8b, 0xc3, 0xb4, 0x74, 0x01, 0xad, 0x9f, 0x41, 0x6e, 0xba, 0xef, 0x31, + 0x66, 0x04, 0xb0, 0x93, 0x15, 0xd4, 0xc5, 0xd1, 0x7a, 0x3f, 0x82, 0xa4, 0x98, 0x64, 0x15, 0x72, 0xe0, 0x76, 0xdd, 0xd8, 0x1e, 0xd0, 0x44, 0xa0, 0x8b, 0xfb, 0x01, 0x36, 0x13, 0x56, 0xb3, 0x72, + 0x09, 0x5a, 0x48, 0x42, 0x1c, 0x96, 0xce, 0x6f, 0x18, 0xe4, 0x77, 0xbe, 0xf3, 0x10, 0x9b, 0x89, 0x1b, 0x98, 0x61, 0xa6, 0xfa, 0x9d, 0x3c, 0x73, 0x4f, 0xf1, 0x0e, 0xad, 0x92, 0x5f, 0x52, 0x3d, + 0x8a, 0xcd, 0x4e, 0xa0, 0x86, 0xaa, 0x7d, 0x0a, 0xe9, 0xfd, 0xfa, 0xab, 0x6f, 0x22, 0x2f, 0xac, 0x3c, 0xd4, 0x4f, 0xcb, 0xcf, 0x9d, 0xc4, 0x34, 0x3a, 0x9a, 0xaf, 0xea, 0xbb, 0xce, 0xc5, 0x98, + 0x6a, 0x9c, 0xcd, 0x37, 0xb7, 0xfb, 0x91, 0xa1, 0x9e, 0x83, 0x29, 0xb0, 0x37, 0x98, 0x7c, 0x83, 0x6f, 0xe2, 0x14, 0x4f, 0x31, 0x8c, 0xa7, 0x20, 0x46, 0xf4, 0xdb, 0x7c, 0x22, 0xf4, 0xd6, 0x35, + 0x9d, 0xa5, 0xef, 0xdf, 0xfc, 0x77, 0xb4, 0xa1, 0xfb, 0xc3, 0xd9, 0xc7, 0xb7, 0xf1, 0x13, 0xef, 0x24, 0xbe, 0xf5, 0x6f, 0x47, 0xb1, 0x19, 0xea, 0x91, 0xef, 0x9b, 0x7a, 0xe6, 0x16, 0xe6, 0xf5, + 0xdb, 0x7d, 0xf2, 0x73, 0xdf, 0xde, 0xd8, 0xf8, 0xbb, 0xbf, 0x70, 0xe5, 0x79, 0x94, 0xc0, 0x53, 0x91, 0xb8, 0x49, 0x6a, 0x82, 0x1e, 0xe6, 0x34, 0xe1, 0xc7, 0xb6, 0xe3, 0x67, 0xff, 0x9d, 0x78, + 0x3f, 0x22, 0xef, 0x7f, 0xfe, 0xf3, 0x40, 0x85, 0xbb, 0x13, 0xb3, 0xa6, 0xe5, 0x77, 0x82, 0x14, 0x9e, 0x75, 0xeb, 0xf0, 0xaf, 0xa0, 0x95, 0xcb, 0xa5, 0x7f, 0x8a, 0xa0, 0x95, 0x1f, 0xc9, 0xc3, + 0x5f, 0xa1, 0x0c, 0xf7, 0x11, 0xbb, 0x37, 0x60, 0xfc, 0x83, 0xc7, 0xe2, 0x2f, 0x8f, 0x3c, 0x0e, 0xc8, 0x5f, 0x2e, 0xb6, 0x1e, 0x95, 0x47, 0xa5, 0x24, 0x21, 0xab, 0x59, 0x6f, 0xc2, 0xc1, 0x0e, + 0xb5, 0x50, 0x52, 0x93, 0xe7, 0x30, 0x56, 0xdf, 0x32, 0x35, 0xe1, 0x4b, 0xc5, 0x22, 0x12, 0xa6, 0xbd, 0x3c, 0xdf, 0xcf, 0x14, 0x25, 0x92, 0x9c, 0xc2, 0xe2, 0xfa, 0x8e, 0xe0, 0x2a, 0x73, 0x91, + 0x8d, 0x4a, 0x00, 0xef, 0xfb, 0xe8, 0x3c, 0xab, 0x0e, 0x63, 0xd8, 0xed, 0x25, 0x84, 0xbc, 0x51, 0xca, 0x6d, 0xd6, 0x47, 0x2b, 0x45, 0xf4, 0x1c, 0xfd, 0x77, 0x47, 0xe5, 0xcf, 0xce, 0x82, 0x46, + 0x97, 0xa2, 0xbf, 0x3f, 0x04, 0xdf, 0xf9, 0x55, 0x73, 0xe5, 0x67, 0x77, 0x5f, 0xae, 0x5c, 0x06, 0xe8, 0x47, 0xd9, 0xae, 0x9d, 0xe6, 0x8d, 0x3e, 0xc6, 0x87, 0x3b, 0x77, 0x7c, 0x0c, 0xb8, 0x0f, + 0x06, 0xcb, 0xff, 0xd2, 0xe3, 0xed, 0xc7, 0x00, 0xfa, 0xa2, 0x19, 0xfc, 0x3e, 0x3a, 0xff, 0x63, 0xfb, 0xdc, 0xe9, 0x31, 0x60, 0xe7, 0x7c, 0xd0, 0xba, 0x6f, 0x19, 0x1e, 0xac, 0x8c, 0x1c, 0x10, + 0x13, 0x27, 0x66, 0x9f, 0x9d, 0x6a, 0x88, 0x05, 0x8a, 0xde, 0xa2, 0xe4, 0x83, 0x1e, 0x9d, 0xe8, 0xa5, 0x8e, 0xac, 0xa3, 0x64, 0x3d, 0x5f, 0xf8, 0x0c, 0x25, 0xcf, 0x24, 0xc5, 0xdf, 0xc2, 0x93, + 0x58, 0x5a, 0xa5, 0xda, 0x86, 0x34, 0x51, 0x45, 0x31, 0x62, 0xc7, 0x5a, 0x94, 0x48, 0x57, 0x95, 0x06, 0xf2, 0x72, 0x96, 0x0f, 0x19, 0xaa, 0xec, 0x6e, 0xf0, 0x74, 0xd9, 0x25, 0x7f, 0xb7, 0x6f, + 0xfd, 0xef, 0xda, 0x67, 0x3e, 0x9b, 0xc7, 0xff, 0xac, 0x5d, 0xe1, 0x3f, 0xa7, 0x2d, 0x79, 0xee, 0x22, 0x7f, 0x19, 0x91, 0xef, 0x97, 0xfe, 0x49, 0x8d, 0xc8, 0x7b, 0x82, 0xf0, 0x97, 0xf5, 0x78, + 0x17, 0xaa, 0xcf, 0xca, 0xf7, 0x1f, 0x3b, 0x88, 0xdd, 0x3c, 0x0d, 0xec, 0xdc, 0x9e, 0xb7, 0x1e, 0xd2, 0xba, 0xc0, 0x7a, 0x3b, 0x1e, 0xf6, 0xc2, 0x9c, 0xed, 0xae, 0xb2, 0xed, 0x74, 0xcf, 0x38, + 0xfa, 0x32, 0xe7, 0x49, 0x23, 0x27, 0x71, 0xab, 0x62, 0x97, 0x60, 0x15, 0xb3, 0x94, 0x8e, 0xdb, 0xe4, 0xd2, 0x28, 0xc9, 0x78, 0x38, 0xc5, 0x66, 0x3d, 0x49, 0x33, 0x39, 0x94, 0x32, 0xc7, 0x73, + 0xab, 0x1e, 0x55, 0x06, 0xcb, 0x29, 0xbd, 0x48, 0xb0, 0x3d, 0x3f, 0x3a, 0x2c, 0x69, 0x1a, 0x05, 0x30, 0x1f, 0xac, 0xd3, 0xdf, 0xf5, 0xa6, 0xfd, 0xc6, 0xe0, 0x54, 0xb8, 0xa9, 0x9b, 0x45, 0x49, + 0x67, 0x67, 0x56, 0xd7, 0x3f, 0xfa, 0x59, 0xc7, 0xfc, 0x3b, 0xd5, 0x14, 0x89, 0x68, 0x34, 0xf5, 0x71, 0x1c, 0x42, 0xdf, 0xc7, 0x21, 0xf8, 0xd8, 0x70, 0x67, 0x2c, 0xfb, 0x0f, 0x18, 0x88, 0x7e, + 0x24, 0x9a, 0x17, 0x10, 0xff, 0xb1, 0x22, 0x79, 0xb2, 0xf5, 0xcf, 0x0b, 0xc4, 0xad, 0x45, 0x30, 0xdb, 0x29, 0x32, 0x63, 0xf7, 0xc4, 0x89, 0x51, 0x58, 0x29, 0x35, 0xc5, 0xc8, 0xa9, 0xba, 0x3f, + 0x44, 0xde, 0xa4, 0xd7, 0x07, 0x82, 0x91, 0x1c, 0x08, 0xb5, 0x51, 0x93, 0x09, 0x90, 0x03, 0x32, 0x8e, 0xf9, 0xe8, 0xb0, 0xb7, 0x93, 0xe2, 0xbe, 0x26, 0xc2, 0xe3, 0x18, 0xd5, 0x67, 0xfb, 0x3d, + 0x2d, 0x77, 0x0b, 0x5e, 0x66, 0x19, 0x1a, 0xb6, 0xdc, 0x2c, 0x1d, 0x39, 0x01, 0x59, 0xcd, 0xa0, 0xe2, 0xd0, 0x7d, 0xa6, 0xcf, 0xff, 0x19, 0xf9, 0xff, 0xc9, 0x66, 0xfb, 0x5f, 0x20, 0x0b, 0xd7, + 0x4f, 0xbc, 0x0d, 0x1c, 0x38, 0x2f, 0xd0, 0xb6, 0x95, 0x91, 0x1d, 0xd3, 0x73, 0xb3, 0x29, 0xa8, 0x55, 0x20, 0x37, 0x21, 0x6d, 0x8a, 0xdd, 0x4e, 0x25, 0x52, 0x9d, 0xc4, 0x74, 0xe9, 0x2f, 0x28, + 0x23, 0x4a, 0x1d, 0x6b, 0x5d, 0x53, 0x06, 0x09, 0x7b, 0x5d, 0x32, 0xc4, 0x77, 0xb2, 0x8a, 0xeb, 0x2a, 0xb7, 0x2e, 0xb6, 0xd0, 0xa2, 0xe8, 0xcb, 0x7d, 0x35, 0x9c, 0x82, 0xfd, 0x3d, 0x33, 0x8e, + 0xe8, 0x99, 0x59, 0x50, 0x1b, 0x1d, 0x0c, 0x44, 0x62, 0x3a, 0x2d, 0x37, 0x8f, 0x16, 0x1d, 0xff, 0x03, 0xd5, 0xd4, 0xd5, 0x8f, 0xbe, 0xf1, 0x2e, 0xdb, 0x7e, 0xa4, 0x69, 0xa7, 0xd8, 0x37, 0xf8, + 0x8b, 0x2f, 0xd9, 0x4d, 0x3b, 0xc7, 0xf6, 0x5f, 0x17, 0x0f, 0xe7, 0x4d, 0xe3, 0x5f, 0xde, 0xe2, 0xff, 0x4d, 0xcc, 0xeb, 0xaf, 0xbd, 0xe3, 0x2f, 0x4b, 0xfb, 0xfd, 0xd2, 0x3f, 0xa9, 0xa5, 0xfd, + 0x44, 0x26, 0xfe, 0x32, 0xba, 0xef, 0xa2, 0xf6, 0x49, 0x93, 0xfe, 0x63, 0x07, 0xb5, 0xeb, 0x87, 0x81, 0x9d, 0x9b, 0xd3, 0xd6, 0x43, 0x19, 0x16, 0x1d, 0xe0, 0xd4, 0x0b, 0x86, 0xdc, 0xe8, 0xe0, + 0xf5, 0x7b, 0x4c, 0xc8, 0xb3, 0xd9, 0x7a, 0x30, 0x70, 0xfa, 0xc9, 0x26, 0x9b, 0xd0, 0x70, 0x5f, 0x87, 0x52, 0x26, 0xce, 0x6b, 0xc8, 0xda, 0x5b, 0xe8, 0x1c, 0xb0, 0xd1, 0xf1, 0x60, 0x58, 0x49, + 0x87, 0x83, 0x36, 0x80, 0x08, 0xad, 0x2a, 0xa1, 0xc1, 0x22, 0x9d, 0x87, 0xa1, 0xb6, 0xc7, 0x30, 0x7d, 0xe2, 0x16, 0x1c, 0x39, 0x49, 0x61, 0x10, 0x4a, 0x89, 0xdf, 0x8d, 0xf5, 0x6a, 0x3b, 0x94, + 0x9d, 0xdd, 0x9c, 0x9f, 0x87, 0xaf, 0xd7, 0xbc, 0x9d, 0xff, 0xb9, 0xad, 0x2c, 0x55, 0xd3, 0x12, 0xf3, 0x51, 0xca, 0x15, 0xfc, 0x52, 0x7a, 0xe3, 0x89, 0x24, 0xd8, 0x39, 0x1f, 0x34, 0x85, 0x43, + 0x5a, 0xa8, 0xe9, 0x30, 0x34, 0xbb, 0xe0, 0xc8, 0x15, 0x41, 0xa7, 0x1e, 0x39, 0x5b, 0x22, 0x36, 0x7a, 0xa1, 0xc6, 0x64, 0x35, 0xd9, 0xf3, 0xe6, 0xd2, 0x24, 0xd9, 0x42, 0xd0, 0x1c, 0xac, 0x8b, + 0xf9, 0x32, 0xc0, 0x63, 0x61, 0xb0, 0xf3, 0x89, 0x43, 0x3e, 0x4c, 0x86, 0xe1, 0x26, 0x04, 0x57, 0x99, 0x34, 0x9b, 0x59, 0xb3, 0x8c, 0xb6, 0x94, 0x2e, 0x08, 0x2f, 0x32, 0xd3, 0xd9, 0xa5, 0xb5, + 0xdc, 0xdd, 0xeb, 0x92, 0xeb, 0x42, 0x3f, 0x8e, 0x36, 0x52, 0xb5, 0x28, 0x69, 0xea, 0x1d, 0x66, 0xc9, 0x11, 0xdc, 0xc7, 0x69, 0x20, 0xaf, 0xc4, 0xf7, 0x7d, 0x26, 0xde, 0x60, 0x74, 0x7b, 0xa9, + 0x4d, 0x0d, 0x92, 0x23, 0x5a, 0x0e, 0xe5, 0x8b, 0x54, 0xa6, 0xea, 0xca, 0x36, 0x5c, 0xa0, 0xc5, 0x4c, 0x94, 0x6c, 0x57, 0xf3, 0x80, 0x4c, 0xe8, 0x71, 0x23, 0x1c, 0x04, 0x7c, 0x88, 0xa0, 0x73, + 0x64, 0xae, 0x27, 0x6e, 0x01, 0x0e, 0x03, 0x33, 0x83, 0x4c, 0xd5, 0xc3, 0xa4, 0x72, 0xcd, 0x61, 0x70, 0x2a, 0x74, 0xcb, 0x90, 0xeb, 0xb9, 0x62, 0xda, 0xf7, 0xe0, 0xee, 0x1e, 0x32, 0x92, 0xda, + 0x58, 0x1b, 0x26, 0xcd, 0x65, 0xa5, 0xd9, 0xb2, 0x98, 0xcd, 0xa9, 0x16, 0x6a, 0xa6, 0x26, 0xb6, 0x99, 0x75, 0x52, 0xc7, 0x0d, 0x7e, 0x7d, 0x2c, 0x26, 0xfc, 0xac, 0xf3, 0x1c, 0x47, 0x34, 0xbc, + 0x95, 0x94, 0xa6, 0x59, 0xa2, 0xea, 0x59, 0xc7, 0x8f, 0x6c, 0xfb, 0xb6, 0xef, 0x7c, 0x0e, 0x96, 0x7f, 0x45, 0x5e, 0x6f, 0x89, 0x37, 0x5c, 0xb9, 0xbd, 0xd4, 0x44, 0xcd, 0xb7, 0x90, 0x61, 0x84, + 0xf1, 0x16, 0x92, 0x72, 0x90, 0xe6, 0x85, 0x63, 0x0a, 0xc5, 0x50, 0x63, 0x52, 0x7f, 0xb0, 0xdc, 0x0a, 0xf2, 0x2e, 0x01, 0x96, 0xde, 0x3c, 0x13, 0xc2, 0x64, 0x3a, 0x47, 0x51, 0x0b, 0x58, 0x8d, + 0xd6, 0xd3, 0xda, 0xac, 0xc5, 0x58, 0xd1, 0xf7, 0x2b, 0x9b, 0xf4, 0x54, 0x74, 0x8a, 0x19, 0xcc, 0x26, 0xa8, 0x6b, 0xbb, 0x94, 0x00, 0x15, 0x42, 0xba, 0xde, 0xe2, 0x80, 0xcf, 0x59, 0x17, 0x1d, + 0xe7, 0xee, 0xf7, 0x59, 0x4b, 0xaa, 0x1e, 0x25, 0x8f, 0x62, 0x6d, 0xc8, 0x97, 0xe2, 0xbf, 0x1a, 0x8a, 0x47, 0x10, 0x8e, 0xff, 0x3b, 0x64, 0xbb, 0xb0, 0xae, 0x50, 0xac, 0x62, 0x28, 0x82, 0xc1, + 0x60, 0x66, 0x68, 0x92, 0x00, 0xcf, 0x05, 0x62, 0xc7, 0xed, 0xca, 0x65, 0x12, 0xd8, 0x0a, 0xc4, 0x4b, 0xa0, 0xc7, 0xb2, 0xf1, 0xcc, 0x2d, 0x35, 0xd9, 0x1b, 0x46, 0x8b, 0x19, 0x66, 0xf8, 0x8c, + 0xb3, 0x1f, 0x67, 0x91, 0x98, 0xb3, 0x61, 0x5f, 0x98, 0xd4, 0xb6, 0xb4, 0x2a, 0x6d, 0x48, 0x59, 0xbb, 0x6c, 0x24, 0x56, 0xc4, 0xf2, 0xc0, 0x9b, 0x9a, 0xb8, 0x72, 0xa8, 0x67, 0x53, 0x1b, 0xed, + 0x26, 0xca, 0xe8, 0x8f, 0x3f, 0x7e, 0x5d, 0xc0, 0x38, 0xb6, 0x9c, 0x91, 0xf9, 0xa9, 0x40, 0x42, 0x6f, 0x58, 0xab, 0x3c, 0x9c, 0x13, 0x3a, 0x5e, 0x7a, 0x78, 0x80, 0x3d, 0xfe, 0x92, 0x81, 0xfb, + 0x4e, 0xf5, 0x1d, 0x7f, 0x2f, 0x3d, 0x74, 0xf0, 0x76, 0x86, 0xee, 0x04, 0x9a, 0x67, 0x01, 0x88, 0x91, 0xc2, 0xc4, 0x12, 0x17, 0xf1, 0x4c, 0x44, 0xc6, 0x60, 0x34, 0x9a, 0x81, 0xa8, 0xb8, 0x75, + 0x27, 0xc4, 0xa0, 0x5c, 0x03, 0xe6, 0x58, 0x1b, 0x4d, 0x9d, 0xd4, 0x38, 0x38, 0xc8, 0x5a, 0x9a, 0x1a, 0x3e, 0x80, 0x42, 0x11, 0xa5, 0x0e, 0x0d, 0x49, 0x0b, 0xf0, 0xb1, 0x66, 0x59, 0xf1, 0x60, + 0x40, 0xdb, 0xa0, 0x0d, 0xd4, 0x2e, 0xdc, 0x07, 0xbc, 0x62, 0xec, 0xa8, 0xf8, 0xd3, 0xf8, 0xeb, 0xef, 0x17, 0x10, 0xde, 0x19, 0xf2, 0x79, 0xd5, 0xa0, 0x39, 0xa2, 0x5a, 0xe6, 0x0d, 0x3f, 0x4e, + 0x0a, 0x6e, 0x2a, 0xc9, 0xfc, 0x3c, 0x8f, 0xe3, 0x23, 0x29, 0xf8, 0x44, 0xe0, 0x39, 0xb6, 0x1e, 0x6a, 0xad, 0xa6, 0x76, 0x21, 0x45, 0x38, 0x42, 0xaa, 0x61, 0xb5, 0xad, 0xc6, 0xc2, 0x50, 0xda, + 0x8e, 0xb5, 0x21, 0x50, 0x84, 0xa1, 0xb8, 0x2d, 0xfa, 0x50, 0x80, 0x07, 0xc1, 0x4e, 0x87, 0xa5, 0x09, 0x10, 0x1e, 0xe8, 0x38, 0xde, 0xb1, 0x53, 0x7e, 0x34, 0x85, 0x54, 0x05, 0x33, 0x34, 0x7f, + 0xc5, 0xce, 0xa2, 0xe1, 0xd2, 0x71, 0x02, 0x60, 0x57, 0xf7, 0x31, 0x45, 0xae, 0x76, 0x4c, 0xc4, 0xdb, 0xd8, 0x33, 0x6c, 0x7f, 0x33, 0x4f, 0xf8, 0x3a, 0xd5, 0x4c, 0xd5, 0x7c, 0xf3, 0x53, 0xc6, + 0xd9, 0x9d, 0x0a, 0x8e, 0x0f, 0xf2, 0x8a, 0x6f, 0xeb, 0x17, 0xfd, 0xa7, 0x48, 0x17, 0xbe, 0x4d, 0x60, 0x7f, 0x34, 0xe1, 0x78, 0xa1, 0x83, 0x7e, 0xd0, 0x3d, 0x4b, 0xd0, 0xf9, 0xac, 0x99, 0x82, + 0xb4, 0xe8, 0xa4, 0xeb, 0x03, 0x34, 0x39, 0xe0, 0x88, 0x73, 0xe8, 0x93, 0x2c, 0x4c, 0x39, 0x3b, 0xbe, 0x6f, 0xdb, 0x5b, 0xbf, 0xef, 0x5a, 0xfb, 0xb5, 0x92, 0x6d, 0xd5, 0x85, 0x1d, 0xe5, 0xe3, + 0x28, 0x01, 0xd6, 0xbc, 0x31, 0x0f, 0xc5, 0xaa, 0x3f, 0x81, 0xd1, 0xc2, 0xee, 0xaf, 0xab, 0xd5, 0x2c, 0x8f, 0xc9, 0x65, 0x64, 0x9a, 0xd1, 0x94, 0x4f, 0x13, 0x6c, 0x67, 0xe1, 0x0e, 0x61, 0x08, + 0x6b, 0x18, 0x1e, 0xc1, 0x38, 0x2f, 0xb7, 0xcc, 0x3d, 0xfc, 0xc8, 0xf7, 0x6f, 0xb5, 0x6e, 0xf7, 0x5b, 0x3f, 0xfe, 0x3a, 0x0b, 0xbd, 0xed, 0xc5, 0xcd, 0xa5, 0xdf, 0x98, 0x7a, 0x5e, 0x33, 0xa2, + 0xa5, 0xb2, 0xf8, 0x54, 0xe6, 0xe0, 0x07, 0x2c, 0xff, 0xa8, 0x20, 0x00, 0xb7, 0x31, 0xce, 0xca, 0xa1, 0x1d, 0x27, 0x06, 0x5b, 0xf0, 0xaa, 0xcf, 0x42, 0x4c, 0x9d, 0x6d, 0x0a, 0x37, 0xeb, 0x21, + 0x0e, 0x0b, 0x61, 0x5b, 0xcb, 0xa2, 0x8b, 0x2c, 0x95, 0xc3, 0x2e, 0x3a, 0xd6, 0x86, 0x9b, 0xed, 0x94, 0xce, 0x58, 0x59, 0xc0, 0x0e, 0x06, 0x4c, 0x06, 0x2c, 0xab, 0x88, 0x07, 0x59, 0x18, 0x65, + 0x2e, 0x53, 0x2a, 0xc5, 0x78, 0xa9, 0xaf, 0x23, 0x6a, 0x36, 0x2a, 0x44, 0x5e, 0x24, 0xe1, 0xc4, 0x88, 0x5b, 0x1a, 0x67, 0xad, 0x34, 0xc3, 0x3f, 0x65, 0x05, 0x81, 0x87, 0x12, 0xf3, 0x57, 0xdd, + 0x80, 0x56, 0x75, 0x03, 0x9a, 0xa2, 0xa5, 0x8d, 0x07, 0xe9, 0xb1, 0x8b, 0xe2, 0x25, 0x95, 0xfa, 0x41, 0xf7, 0x52, 0x56, 0xf7, 0x74, 0xd6, 0xc1, 0xda, 0xa9, 0xd4, 0x71, 0xb4, 0x81, 0xd4, 0x78, + 0xa8, 0x71, 0xaa, 0x3c, 0x66, 0x66, 0x3e, 0x51, 0x0d, 0x80, 0x98, 0x18, 0xd3, 0x83, 0xad, 0x42, 0x10, 0x04, 0xe8, 0x38, 0xec, 0x70, 0x32, 0xc3, 0xb3, 0xae, 0x38, 0xf0, 0xb4, 0xb1, 0x38, 0x91, + 0x65, 0xd0, 0xa6, 0xf8, 0x99, 0x36, 0xe8, 0x69, 0x85, 0x95, 0xd8, 0x93, 0x4d, 0x31, 0x82, 0xc5, 0x58, 0x89, 0xfd, 0xb9, 0x10, 0x96, 0xa3, 0xa8, 0xdb, 0xf5, 0x37, 0x20, 0x4d, 0x07, 0xcf, 0x6c, + 0xcf, 0x67, 0xf3, 0x9a, 0x36, 0x02, 0x79, 0xfc, 0xd4, 0x53, 0xa5, 0xd7, 0xc7, 0x88, 0xa2, 0x2f, 0x78, 0xc5, 0xae, 0x09, 0x5f, 0x20, 0x3d, 0x9f, 0x36, 0x4e, 0xd3, 0x16, 0x9e, 0x32, 0x7b, 0xb2, + 0xf1, 0x70, 0x7a, 0x9a, 0x4c, 0xd6, 0xe2, 0x34, 0xdd, 0x0e, 0xbb, 0x9e, 0x2f, 0x2d, 0x82, 0x05, 0x78, 0x98, 0xf8, 0xf9, 0x81, 0x5b, 0x01, 0x4a, 0x57, 0xec, 0x97, 0xb3, 0x91, 0xcd, 0x5a, 0x3c, + 0x0c, 0xe6, 0xe5, 0x9c, 0x67, 0xf3, 0x7a, 0xb5, 0x0a, 0x1d, 0x3c, 0x28, 0x25, 0x03, 0x10, 0x72, 0x46, 0xd1, 0xcb, 0xe5, 0x88, 0xd7, 0xf6, 0x69, 0x3a, 0x5b, 0x2f, 0x02, 0xd8, 0xef, 0xe3, 0xb0, + 0xa8, 0xbe, 0xee, 0x34, 0xcd, 0x3e, 0x15, 0xe4, 0x42, 0xae, 0x0b, 0xa8, 0xb6, 0xe5, 0xc9, 0x7f, 0x5c, 0x49, 0xa2, 0x1b, 0x86, 0xdc, 0xb4, 0x5c, 0x7f, 0xd8, 0x3d, 0x01, 0x38, 0x7f, 0xea, 0x4f, + 0x25, 0xe0, 0x9d, 0xec, 0x79, 0xbd, 0xaa, 0x39, 0xee, 0x9c, 0x88, 0x3d, 0x67, 0x7e, 0x06, 0x25, 0x35, 0xb3, 0xa7, 0xc8, 0x00, 0xb5, 0x56, 0xba, 0x91, 0x73, 0x3d, 0x79, 0xe0, 0x4c, 0x82, 0xaa, + 0xda, 0x00, 0x5d, 0x33, 0x22, 0xd6, 0xa2, 0xa7, 0x14, 0x16, 0x0e, 0xf7, 0x55, 0x90, 0x87, 0x44, 0x12, 0x90, 0x50, 0x12, 0x1b, 0xc7, 0xb0, 0x2a, 0xbb, 0x95, 0xec, 0x43, 0xc3, 0xc9, 0x21, 0xa6, + 0x78, 0x50, 0xe8, 0x4b, 0x2b, 0x6e, 0xd9, 0x2b, 0x82, 0x5d, 0x35, 0xb7, 0x8b, 0x0d, 0xb0, 0x79, 0xe4, 0x26, 0x6d, 0xcb, 0x3c, 0xb8, 0xed, 0x2a, 0xcc, 0x3f, 0x88, 0x7b, 0x4d, 0xfe, 0xc2, 0xc3, + 0xb9, 0xde, 0x4b, 0x7e, 0x87, 0x77, 0xb2, 0x97, 0x3e, 0xda, 0x9c, 0x74, 0xf0, 0x76, 0xbe, 0x86, 0x7d, 0x3e, 0x16, 0x37, 0xbe, 0xb4, 0x94, 0x87, 0x53, 0x64, 0xca, 0x75, 0x97, 0xf2, 0x26, 0xa2, + 0x56, 0x65, 0xba, 0xc5, 0xd2, 0x48, 0x0d, 0x1d, 0x3b, 0x22, 0xa6, 0xb3, 0x65, 0x40, 0x61, 0x7d, 0x78, 0xca, 0xe8, 0x7d, 0x2a, 0x45, 0x05, 0xa8, 0x8c, 0x0d, 0x77, 0x51, 0x57, 0x8b, 0x6e, 0x0d, + 0x2a, 0xca, 0x98, 0xf7, 0xf9, 0x75, 0x81, 0x92, 0x7b, 0x41, 0xd0, 0xba, 0xb1, 0x31, 0xf6, 0x79, 0xb9, 0x3f, 0x19, 0x3c, 0xeb, 0xa1, 0xad, 0x7b, 0xd8, 0x13, 0x34, 0xbf, 0xad, 0xce, 0xfe, 0x5a, + 0x01, 0x91, 0xc7, 0xd5, 0xd9, 0x5b, 0x56, 0x05, 0xa9, 0x35, 0xa6, 0x9b, 0xb0, 0x63, 0x5a, 0x82, 0x13, 0xcd, 0x73, 0x57, 0x3d, 0x0d, 0x71, 0xf6, 0x93, 0x01, 0x37, 0xdb, 0x4e, 0x0f, 0x76, 0xb6, + 0xa3, 0x66, 0xf2, 0xe2, 0xa0, 0xa0, 0x23, 0xa5, 0xec, 0xa1, 0x03, 0x62, 0x96, 0x1d, 0xb4, 0x8d, 0x22, 0xb2, 0x61, 0xb8, 0x74, 0xe1, 0xe9, 0xee, 0x00, 0x8c, 0x7a, 0x91, 0x63, 0xcc, 0xfd, 0x41, + 0x8c, 0x20, 0x48, 0xb9, 0xa2, 0xa7, 0x23, 0xc7, 0x54, 0xc6, 0xe2, 0xb2, 0xff, 0xfa, 0x14, 0xef, 0x6b, 0xc1, 0xf6, 0x93, 0x7b, 0xeb, 0x4b, 0x2f, 0x68, 0xcd, 0x93, 0x57, 0xfb, 0xcd, 0xa9, 0xbc, + 0xfa, 0x15, 0xa2, 0xff, 0xd7, 0xb9, 0x27, 0xfd, 0x0d, 0x6e, 0xc5, 0xef, 0xea, 0x52, 0x28, 0xf5, 0x1e, 0xb3, 0xd1, 0x97, 0xd6, 0x7d, 0x2e, 0x44, 0x1b, 0x4e, 0x9f, 0x0e, 0x9b, 0x62, 0x79, 0x2d, + 0x46, 0xb6, 0x39, 0x86, 0x9a, 0x73, 0x4b, 0xa0, 0x47, 0x79, 0xbc, 0xb3, 0x73, 0x4e, 0xae, 0xf4, 0x44, 0xc7, 0xf6, 0xe3, 0xee, 0xae, 0xa6, 0x14, 0x37, 0x17, 0x64, 0xd7, 0x53, 0xfb, 0x52, 0xb9, + 0x21, 0x25, 0x2e, 0x83, 0xb6, 0xe0, 0x70, 0x36, 0x21, 0x0b, 0x48, 0x55, 0xa9, 0x64, 0x4b, 0xc1, 0xc4, 0x61, 0xed, 0x29, 0x64, 0x32, 0x36, 0x68, 0x7c, 0x63, 0xf0, 0x7a, 0xbc, 0x1a, 0x48, 0x13, + 0x7e, 0x0f, 0x2c, 0x8a, 0xf5, 0xeb, 0x6c, 0xbe, 0xce, 0xa6, 0xcc, 0x3e, 0xaa, 0xc9, 0xde, 0x18, 0xe1, 0xb1, 0xab, 0x47, 0x1f, 0xc5, 0x66, 0x4f, 0x25, 0x41, 0x7e, 0x2a, 0x06, 0xad, 0x2a, 0x30, + 0xa8, 0x89, 0xee, 0x54, 0x7f, 0xaa, 0xe9, 0xdb, 0x50, 0x3c, 0x72, 0xe9, 0xf8, 0xbf, 0xad, 0x71, 0xbb, 0xb1, 0x81, 0xee, 0xa2, 0x64, 0x6d, 0x10, 0x8a, 0x51, 0x24, 0x33, 0x27, 0xc6, 0x90, 0x9f, + 0x4b, 0xf3, 0x70, 0xb5, 0x99, 0xf4, 0xa0, 0x12, 0xed, 0x59, 0x5c, 0x38, 0x90, 0x2c, 0x57, 0x8f, 0xea, 0x94, 0xb6, 0xd3, 0x62, 0x8f, 0x6c, 0xcc, 0x70, 0x3e, 0xde, 0x83, 0xfc, 0x36, 0xae, 0x6b, + 0x11, 0x2c, 0xa8, 0x3a, 0x11, 0xaa, 0x71, 0x48, 0xf4, 0x52, 0xb4, 0xbb, 0xa2, 0xb1, 0xf1, 0xa8, 0x57, 0x0e, 0xac, 0xfd, 0xf7, 0x39, 0xa2, 0x6a, 0xf2, 0x78, 0xa5, 0xfa, 0x95, 0x01, 0x58, 0x4d, + 0x1a, 0x3f, 0x72, 0x62, 0x37, 0x46, 0x6c, 0x8b, 0x31, 0x17, 0xa7, 0x96, 0x5d, 0xb1, 0xb7, 0x1f, 0x42, 0x9b, 0x03, 0x42, 0x6e, 0xcb, 0xf9, 0x32, 0xeb, 0x5a, 0xe3, 0x83, 0x5b, 0x78, 0x5b, 0x1f, + 0x43, 0x91, 0x2d, 0x5b, 0x5a, 0x3d, 0xde, 0x52, 0x00, 0x12, 0x5e, 0xd0, 0x7b, 0x39, 0x51, 0x4c, 0x8b, 0x9c, 0x26, 0x13, 0x51, 0x41, 0xa7, 0xdc, 0x54, 0x28, 0xd9, 0x25, 0x36, 0x98, 0xce, 0x98, + 0xd8, 0x9f, 0xe3, 0x28, 0xaa, 0x1c, 0xa8, 0x2e, 0xbe, 0x34, 0x05, 0x96, 0x2b, 0x7e, 0x9c, 0x90, 0xae, 0x26, 0x76, 0x13, 0x2a, 0xf9, 0x8d, 0x0c, 0xc0, 0xaf, 0x08, 0xc1, 0x89, 0xea, 0x09, 0x91, + 0xe6, 0xb0, 0x73, 0x22, 0xf5, 0x1c, 0x97, 0x08, 0x5f, 0x44, 0x15, 0x91, 0xcd, 0x86, 0xd8, 0x72, 0x0a, 0x0e, 0x84, 0x1d, 0x4b, 0xcf, 0x88, 0x45, 0xed, 0xb9, 0xea, 0x4e, 0x59, 0x22, 0xf8, 0x62, + 0xba, 0x1d, 0x24, 0x3a, 0x9f, 0x65, 0xe3, 0xbd, 0x66, 0x18, 0x14, 0xb3, 0x4e, 0x42, 0x1a, 0xb0, 0x86, 0x35, 0x4e, 0xba, 0x33, 0x7c, 0xae, 0x41, 0x44, 0x5c, 0x30, 0xc3, 0xc2, 0xc7, 0x6d, 0x11, + 0x62, 0x30, 0xca, 0x18, 0xfb, 0xa9, 0xbf, 0x29, 0x22, 0xe9, 0xf5, 0xee, 0x9a, 0xc6, 0x89, 0x1b, 0x66, 0xd6, 0x79, 0xaa, 0xfb, 0xef, 0x70, 0x33, 0x0d, 0x6e, 0xd3, 0xb1, 0x12, 0xb5, 0xea, 0xe4, + 0xe1, 0x09, 0xc7, 0x47, 0xee, 0xa8, 0x57, 0x90, 0x7d, 0xa7, 0xdb, 0x80, 0xfb, 0x7e, 0xd6, 0xb8, 0xa3, 0x5a, 0xc0, 0xcb, 0x0d, 0xab, 0x43, 0x24, 0x48, 0x5b, 0xb9, 0x62, 0x79, 0x22, 0xcd, 0x64, + 0x93, 0xe8, 0x8f, 0xed, 0xd0, 0xc0, 0xfa, 0x91, 0x59, 0xd2, 0x23, 0xb2, 0xe6, 0x0d, 0x6b, 0x2f, 0x00, 0xbb, 0xa1, 0x17, 0xfa, 0x4a, 0xc0, 0xf4, 0x6a, 0x50, 0x5f, 0xe0, 0xb1, 0x45, 0x25, 0xa0, + 0xbe, 0xc0, 0xd6, 0x7b, 0x02, 0x4a, 0xa7, 0x60, 0x0c, 0x8d, 0x76, 0xba, 0x27, 0xf7, 0xfb, 0xf3, 0x72, 0x89, 0x0e, 0x07, 0xc9, 0xa8, 0xfa, 0x4d, 0x53, 0xaf, 0x9d, 0xa6, 0x4a, 0x4e, 0x7e, 0xcc, + 0x87, 0x62, 0xfa, 0x0a, 0x96, 0xae, 0x75, 0xd2, 0x55, 0xc7, 0x83, 0x93, 0x84, 0x3e, 0x47, 0x10, 0x65, 0xb7, 0xb5, 0x79, 0xe8, 0xf2, 0xdd, 0xc1, 0x50, 0xf4, 0xd8, 0x21, 0x3f, 0xac, 0x5c, 0x02, + 0x44, 0x61, 0x9d, 0x1a, 0x8e, 0x35, 0x5b, 0x83, 0xf6, 0xc3, 0x2a, 0x39, 0xe0, 0xdc, 0xfa, 0x30, 0x37, 0x20, 0x95, 0x2d, 0x1d, 0x4c, 0x67, 0x90, 0xad, 0xc7, 0x6b, 0xc8, 0xc6, 0xea, 0xca, 0x79, + 0x14, 0xd9, 0x09, 0x9f, 0xf8, 0x42, 0x57, 0x97, 0xf6, 0x21, 0x83, 0x27, 0x23, 0x7c, 0xc8, 0x29, 0x92, 0xfe, 0xd9, 0xa1, 0xf7, 0x53, 0x04, 0x5b, 0x6f, 0x0f, 0xa6, 0xa6, 0x0f, 0xb7, 0x59, 0x43, + 0x6e, 0x4a, 0xa6, 0xb7, 0x06, 0x31, 0x6d, 0x76, 0x54, 0x3b, 0xfe, 0x6b, 0x16, 0xcd, 0x5a, 0xb8, 0xd6, 0x99, 0x25, 0xb7, 0xb6, 0x7b, 0x4b, 0xda, 0x9d, 0xa4, 0x38, 0x14, 0x21, 0x0b, 0x93, 0x8a, + 0xe3, 0x22, 0x46, 0x53, 0x73, 0xc5, 0x6d, 0x96, 0x0b, 0x1e, 0xc3, 0x74, 0x63, 0x99, 0x4a, 0xdd, 0x81, 0x35, 0xeb, 0xcb, 0xb2, 0x32, 0x15, 0x86, 0xeb, 0x15, 0x9b, 0xba, 0x6b, 0x75, 0x31, 0x5f, + 0xf3, 0xb0, 0x12, 0x86, 0x40, 0xb0, 0x57, 0x60, 0xc1, 0x5a, 0x29, 0x68, 0x8d, 0xf6, 0xd6, 0xfd, 0x7a, 0x19, 0x93, 0xce, 0xe2, 0xe7, 0x9a, 0x2f, 0xcd, 0x92, 0x26, 0xd1, 0xf9, 0xb1, 0x99, 0x8f, + 0xbc, 0x36, 0x02, 0x5e, 0x11, 0x6e, 0x90, 0xf9, 0x38, 0x6d, 0x10, 0x6a, 0xd1, 0x49, 0x15, 0x32, 0xe3, 0x4b, 0xb8, 0xca, 0xa4, 0x4d, 0x86, 0x7b, 0x7b, 0x5e, 0x17, 0xe6, 0x80, 0x20, 0x66, 0xa6, + 0x0c, 0xaf, 0xf2, 0xd9, 0xa4, 0xbb, 0x85, 0x90, 0x3c, 0x1f, 0x67, 0x13, 0x11, 0x5e, 0x16, 0x44, 0xd7, 0xdb, 0x88, 0x93, 0x89, 0x8d, 0xeb, 0xae, 0x36, 0x2d, 0x87, 0xe3, 0xa8, 0xa4, 0xaa, 0x5a, + 0x99, 0x03, 0x26, 0xad, 0xc3, 0x54, 0x3f, 0x98, 0x0e, 0xe7, 0xaa, 0x0f, 0x69, 0x31, 0x4a, 0x24, 0xc5, 0xff, 0x0a, 0x53, 0x3f, 0xad, 0x42, 0x7d, 0xe7, 0x3e, 0x9e, 0xdb, 0xbe, 0x12, 0xd0, 0x72, + 0x21, 0xda, 0x60, 0x79, 0x3a, 0x6c, 0xb6, 0x43, 0x68, 0x81, 0xa3, 0x60, 0xba, 0x5d, 0x81, 0xc3, 0xb2, 0x85, 0x03, 0x6d, 0xf7, 0x32, 0x3a, 0x3c, 0x38, 0x1b, 0xb2, 0x6b, 0xf0, 0x60, 0x50, 0xae, + 0xec, 0x42, 0x53, 0xc6, 0xea, 0x72, 0xa6, 0x2e, 0x76, 0x80, 0x96, 0x3a, 0x3b, 0x0f, 0x5a, 0xe2, 0xba, 0xc5, 0xe9, 0xf6, 0x56, 0xdd, 0x25, 0x26, 0xe3, 0x25, 0x5c, 0xa9, 0x66, 0x9b, 0x89, 0x56, + 0x03, 0xa3, 0x68, 0x64, 0x6c, 0xa7, 0x87, 0x64, 0xe2, 0x06, 0x08, 0xef, 0xad, 0x5f, 0x08, 0x31, 0xc8, 0xa2, 0xc0, 0xd5, 0x3b, 0xa9, 0x6f, 0x9a, 0x8f, 0xb7, 0x38, 0x7c, 0x49, 0xd2, 0xae, 0x08, + 0x1f, 0xd1, 0xb9, 0x3a, 0x6d, 0x6b, 0x79, 0xed, 0x66, 0x82, 0xd7, 0xdb, 0xd3, 0x0e, 0x19, 0x1f, 0xa0, 0xcd, 0x7a, 0x36, 0x02, 0x30, 0x51, 0xab, 0x23, 0x77, 0x01, 0x86, 0xd2, 0x8e, 0xa3, 0xd7, + 0xb3, 0xdc, 0x40, 0xf2, 0x22, 0x1c, 0xef, 0xf3, 0x1e, 0x0c, 0x1e, 0x70, 0x95, 0xec, 0x8b, 0x0a, 0x3f, 0x96, 0x20, 0x5a, 0xaf, 0xf7, 0x13, 0x48, 0x0c, 0x09, 0x32, 0xda, 0x82, 0x92, 0x24, 0xc2, + 0x53, 0x4d, 0x9e, 0xa8, 0x9e, 0x12, 0xc7, 0xe8, 0xa8, 0x9b, 0xfd, 0x64, 0x83, 0xb7, 0xd6, 0x4b, 0x82, 0x85, 0xea, 0xfa, 0xcd, 0xa2, 0x56, 0x56, 0xc5, 0xa6, 0xd1, 0x69, 0x86, 0xbe, 0x47, 0x13, + 0xca, 0xdb, 0x4d, 0x93, 0x5a, 0xc3, 0x79, 0xf7, 0x11, 0x47, 0x60, 0xef, 0x36, 0x34, 0x10, 0xb7, 0xd8, 0xf7, 0xad, 0xc7, 0xf7, 0xa0, 0x89, 0x3b, 0xc3, 0x08, 0xd3, 0x8d, 0xcd, 0xda, 0x5d, 0x4a, + 0xf0, 0x74, 0x3e, 0x07, 0x97, 0x92, 0xd5, 0x93, 0xa1, 0x34, 0xb7, 0x46, 0xcb, 0x4d, 0xe0, 0x2d, 0xed, 0x62, 0x95, 0x46, 0x32, 0x92, 0xed, 0x0f, 0x7a, 0x26, 0x9a, 0xf4, 0xd2, 0xf4, 0xd6, 0xba, + 0x35, 0xcb, 0x0e, 0xdb, 0xc9, 0xbe, 0x2f, 0xf1, 0xb0, 0x7c, 0x10, 0xa9, 0x34, 0x46, 0x84, 0x64, 0xc9, 0xac, 0x63, 0x6e, 0x4b, 0xa4, 0xe5, 0x0f, 0x20, 0xfe, 0xe3, 0xee, 0xf4, 0xe1, 0x87, 0x73, + 0xc2, 0x77, 0x5f, 0x8a, 0xef, 0x39, 0x6a, 0xa2, 0xb5, 0xe2, 0x58, 0xe1, 0x46, 0x0f, 0x18, 0x44, 0xbd, 0xb6, 0x1f, 0xdb, 0x91, 0x62, 0xc3, 0x8f, 0xc2, 0x8d, 0x3a, 0x54, 0xbb, 0x3d, 0xd8, 0x24, + 0xda, 0xe7, 0xb7, 0x85, 0x90, 0x97, 0xc3, 0x6a, 0x3a, 0x41, 0xe7, 0x16, 0xa3, 0xe1, 0xeb, 0x09, 0xb3, 0x51, 0x82, 0x4d, 0x8d, 0x58, 0x2b, 0xd6, 0x2e, 0x10, 0xd4, 0x20, 0x6a, 0x65, 0x60, 0xf8, + 0x26, 0xb8, 0x47, 0xed, 0xb9, 0x17, 0x1c, 0x18, 0xd5, 0xcc, 0x59, 0x28, 0xde, 0x42, 0xbd, 0x3a, 0xc5, 0xe7, 0x6b, 0x7e, 0x69, 0x5b, 0xfb, 0x7d, 0x5f, 0xd9, 0x25, 0x95, 0x09, 0x77, 0x87, 0x7e, + 0x4f, 0xb2, 0x5b, 0xee, 0x4a, 0x73, 0x99, 0x5e, 0xdd, 0x59, 0x67, 0xb9, 0x0e, 0x94, 0xfe, 0xd4, 0x74, 0x5b, 0x7b, 0xaf, 0xd5, 0x94, 0xbb, 0x01, 0xe6, 0xe6, 0xd2, 0xb3, 0x58, 0xdc, 0x9f, 0x57, + 0xd4, 0xfb, 0x1a, 0x8b, 0xdb, 0xa2, 0x84, 0xde, 0x7c, 0xb1, 0x1e, 0x70, 0xf9, 0x52, 0x46, 0xcd, 0x5e, 0x26, 0x8e, 0xe7, 0x45, 0x38, 0xdb, 0x92, 0x63, 0x7d, 0x67, 0x66, 0xb0, 0x07, 0x65, 0xb8, + 0x90, 0x0b, 0xe9, 0xa0, 0x9e, 0xcf, 0xeb, 0xd4, 0xdc, 0xf5, 0x70, 0x44, 0xf1, 0xa9, 0xbd, 0x6c, 0x0d, 0x46, 0xf3, 0xbe, 0x9b, 0x96, 0x9b, 0xfd, 0xa8, 0xe0, 0xd6, 0xc3, 0x15, 0x27, 0xd8, 0x1b, + 0x80, 0x1c, 0x82, 0x05, 0x3b, 0x9b, 0x39, 0xa6, 0x53, 0x1e, 0xac, 0xcf, 0x1b, 0xd2, 0xfc, 0x33, 0x04, 0xde, 0xde, 0xe1, 0xf0, 0x7f, 0xd1, 0xc8, 0xda, 0xc7, 0x18, 0x68, 0xaa, 0xaf, 0x86, 0xba, + 0x69, 0x74, 0xbe, 0x73, 0x2f, 0xc1, 0x37, 0xeb, 0x94, 0x6d, 0x3f, 0xfe, 0x96, 0x34, 0xd8, 0xf9, 0x74, 0xa1, 0x51, 0xf5, 0x2d, 0x40, 0x41, 0xa3, 0xa5, 0x29, 0x0b, 0x90, 0xc4, 0xaf, 0x08, 0xd2, + 0x99, 0xc1, 0x74, 0xa0, 0x6d, 0xd2, 0x09, 0x56, 0xa9, 0x7b, 0x99, 0xcc, 0x3c, 0x97, 0xf3, 0xb5, 0xc3, 0xa2, 0xa7, 0x08, 0x31, 0x07, 0x4d, 0xd6, 0x5d, 0x80, 0x35, 0x37, 0x98, 0xb6, 0xa0, 0xd5, + 0x0d, 0x44, 0x87, 0x87, 0x0c, 0xca, 0x0e, 0x08, 0x9f, 0xc4, 0x8b, 0x78, 0x5d, 0x8a, 0xea, 0xbc, 0x1c, 0xf9, 0xa3, 0x65, 0x7f, 0xec, 0x6c, 0x65, 0x7c, 0xfe, 0xe3, 0x70, 0x63, 0x4d, 0x4d, 0x4d, + 0x02, 0x3b, 0xcd, 0x58, 0xef, 0x43, 0x84, 0xbf, 0xa0, 0x7c, 0xdf, 0xa9, 0x36, 0xe8, 0x9c, 0x8f, 0x3b, 0x0d, 0xad, 0xe7, 0xc0, 0xd0, 0x93, 0x58, 0xdd, 0xfa, 0x5c, 0x48, 0x65, 0xd8, 0x72, 0xa5, + 0x09, 0x1c, 0x5b, 0x01, 0x1a, 0x0e, 0x4c, 0x26, 0x76, 0xb1, 0xc0, 0x8a, 0x24, 0xed, 0x51, 0x85, 0x56, 0x24, 0x9a, 0x2b, 0x8e, 0xe3, 0x94, 0xb4, 0x26, 0x3d, 0x69, 0xe7, 0xed, 0x7a, 0x49, 0x45, + 0x78, 0x2e, 0x94, 0xc8, 0x63, 0x8f, 0x85, 0x76, 0xb5, 0x36, 0x33, 0xe7, 0xd3, 0xb2, 0x3e, 0xec, 0x29, 0xb7, 0x8a, 0x23, 0x0c, 0xde, 0x9b, 0xeb, 0x1b, 0x93, 0xff, 0x63, 0x38, 0xfb, 0xbf, 0xdf, + 0xfb, 0xd5, 0x4d, 0xe7, 0x7b, 0xb8, 0xf0, 0xdc, 0x6e, 0xd8, 0xb3, 0xcc, 0x24, 0x4a, 0xdf, 0x17, 0x0f, 0xae, 0xb4, 0xc2, 0x83, 0xc7, 0xc4, 0x6a, 0x96, 0x98, 0x51, 0xf8, 0xed, 0x73, 0xca, 0xb2, + 0x7c, 0x3b, 0xdf, 0xd7, 0x3c, 0xec, 0xa7, 0xcf, 0xd0, 0xa3, 0x30, 0xcd, 0xfd, 0xec, 0xf8, 0xd9, 0xdf, 0x3d, 0xe6, 0x44, 0xb6, 0x61, 0xe2, 0x59, 0x3f, 0xfd, 0xfa, 0xa2, 0x7a, 0xfe, 0x9f, 0x6f, + 0xc4, 0xc9, 0xb5, 0xc3, 0x3c, 0xd0, 0xcc, 0xe4, 0xed, 0xa1, 0x44, 0x75, 0x5f, 0x5a, 0x07, 0xbe, 0x26, 0x7c, 0x14, 0xaa, 0xab, 0xd3, 0x4e, 0xb7, 0xdd, 0x4a, 0x70, 0xcc, 0x05, 0xd8, 0x34, 0xe5, + 0xc7, 0x84, 0x5f, 0xdb, 0xb3, 0xe1, 0xca, 0x52, 0x38, 0x8f, 0x8f, 0x04, 0x2a, 0x35, 0xa2, 0x85, 0x23, 0xd4, 0x02, 0x87, 0xf1, 0xd3, 0x60, 0x4b, 0xe0, 0x63, 0x9b, 0x84, 0xb4, 0xf8, 0xc0, 0x4e, + 0x72, 0xdc, 0x15, 0xb8, 0xd9, 0xb8, 0xb2, 0x06, 0x84, 0x50, 0x15, 0xdb, 0x92, 0xcc, 0xa8, 0x41, 0x6c, 0xa1, 0xf8, 0x22, 0xaf, 0xe5, 0x6a, 0x1f, 0x8a, 0xa9, 0x47, 0xad, 0x6e, 0x37, 0x42, 0xf9, + 0x76, 0x9c, 0x68, 0x53, 0x2f, 0x42, 0x73, 0x43, 0x35, 0xa9, 0x3a, 0xe6, 0x21, 0x33, 0xc3, 0x23, 0x5e, 0x8f, 0xb5, 0xf6, 0x2b, 0xbb, 0x5d, 0x7c, 0xa1, 0xde, 0x00, 0xf9, 0xe9, 0x5a, 0xa7, 0xa1, + 0xfd, 0x1c, 0x4d, 0xaf, 0xa7, 0x67, 0x63, 0x70, 0xb4, 0x12, 0x35, 0x25, 0x1a, 0x57, 0xbb, 0xc8, 0xe4, 0x34, 0x67, 0x13, 0x0b, 0xfe, 0x8c, 0xd9, 0x0f, 0x67, 0x7a, 0xb9, 0x19, 0x4f, 0xc6, 0x91, + 0x8d, 0x21, 0x7d, 0x9c, 0xeb, 0xcd, 0xe5, 0x52, 0x94, 0x96, 0x86, 0xc7, 0x72, 0x86, 0xeb, 0x78, 0x1e, 0xd4, 0xf3, 0x43, 0xc7, 0x14, 0x49, 0xcd, 0xd7, 0x24, 0xc2, 0xe0, 0x04, 0xd5, 0x9a, 0xd1, + 0xee, 0x92, 0x8a, 0x22, 0xf1, 0x69, 0x09, 0xef, 0x67, 0xf3, 0x83, 0x76, 0x10, 0x67, 0x89, 0xf9, 0x70, 0x79, 0xe9, 0xc5, 0x21, 0xe1, 0x4c, 0xf4, 0x04, 0x68, 0x73, 0xd8, 0x76, 0x18, 0x58, 0x09, + 0xbc, 0x2d, 0xf1, 0xa5, 0x47, 0xab, 0xf2, 0x10, 0xa7, 0xa0, 0xe5, 0x26, 0x44, 0xa7, 0xaa, 0xbe, 0xb2, 0xbd, 0x3c, 0x49, 0x34, 0x3e, 0x30, 0x49, 0x45, 0x99, 0x6d, 0x87, 0xcb, 0xe5, 0x8a, 0x0c, + 0x82, 0x6c, 0x4b, 0x88, 0xe2, 0xc2, 0x81, 0xfa, 0x36, 0x1a, 0x97, 0x23, 0x3d, 0xcc, 0x44, 0x92, 0xec, 0xf5, 0x93, 0x09, 0x3c, 0x85, 0x66, 0x87, 0x9d, 0x66, 0x66, 0x9e, 0x1e, 0x6d, 0xea, 0x55, + 0x39, 0x79, 0x32, 0x36, 0x26, 0xaa, 0x6e, 0x76, 0xcc, 0x43, 0xac, 0x86, 0xe9, 0x63, 0x9f, 0x63, 0x13, 0x99, 0xff, 0x42, 0x47, 0xbd, 0x25, 0x7e, 0x44, 0xe4, 0xf6, 0xca, 0x29, 0xe4, 0xbf, 0x45, + 0x7f, 0x75, 0xd9, 0x7c, 0xce, 0xf5, 0x06, 0x76, 0xc2, 0x6d, 0x48, 0x0e, 0x29, 0xfa, 0x23, 0x10, 0x3f, 0xc4, 0x35, 0x44, 0xd6, 0x4b, 0x8e, 0x81, 0x20, 0x29, 0xce, 0xed, 0xbd, 0x13, 0x6c, 0xb3, + 0x55, 0xc0, 0x0b, 0x04, 0x0e, 0x53, 0x01, 0x9b, 0x2f, 0xf8, 0x48, 0xd8, 0x0e, 0x7c, 0xa3, 0xcf, 0xf8, 0x90, 0x0d, 0x53, 0x64, 0x6e, 0x45, 0xb5, 0xa1, 0x72, 0xf6, 0x7a, 0xa2, 0x6f, 0x07, 0x1a, + 0x01, 0xef, 0x87, 0xee, 0x33, 0x09, 0x7b, 0x6c, 0x21, 0x7e, 0xb1, 0x28, 0xee, 0x18, 0xea, 0x7a, 0x14, 0xea, 0x6a, 0xd6, 0x09, 0x1a, 0xbf, 0xd9, 0x2f, 0xe8, 0x66, 0x49, 0xee, 0x09, 0x3f, 0x1e, + 0x09, 0x24, 0xfa, 0x9a, 0x40, 0x36, 0x24, 0x2f, 0xe0, 0xa7, 0x4d, 0xe2, 0x40, 0x0b, 0x61, 0xd4, 0xa8, 0x3c, 0x00, 0xa6, 0xf0, 0xa2, 0xe6, 0xd1, 0x75, 0x6f, 0x59, 0x17, 0x4e, 0x40, 0xd8, 0xa3, + 0x1a, 0xae, 0x2c, 0x49, 0x63, 0x32, 0x62, 0x2b, 0xf9, 0x7a, 0x7f, 0x42, 0x17, 0x69, 0xb0, 0x67, 0x15, 0x65, 0x50, 0x62, 0x44, 0x4d, 0x20, 0x84, 0xbf, 0xf2, 0xba, 0x1e, 0x5c, 0xf5, 0xe7, 0x6b, + 0x14, 0xe5, 0x70, 0x0e, 0xf0, 0x19, 0x31, 0x56, 0xf8, 0x39, 0xbc, 0xa3, 0x7c, 0x80, 0xa4, 0x38, 0x15, 0x7a, 0x1d, 0x72, 0xcb, 0xf5, 0xfd, 0x4e, 0xa2, 0x86, 0xf6, 0x29, 0xfe, 0x8c, 0xfc, 0xcd, + 0x25, 0xce, 0x6f, 0x38, 0x90, 0x5b, 0xd6, 0xc3, 0x74, 0x0e, 0xe2, 0xa6, 0x90, 0x53, 0x6b, 0x0e, 0x34, 0x24, 0x8f, 0x1c, 0x68, 0x0e, 0x3a, 0x0d, 0x95, 0xe7, 0x1c, 0x18, 0x48, 0x2e, 0x1b, 0xcf, + 0x0e, 0x59, 0xe9, 0x2a, 0x0a, 0xd7, 0x57, 0x34, 0x5d, 0x93, 0x46, 0xba, 0xe2, 0xf5, 0x17, 0xab, 0x11, 0x1b, 0x76, 0xab, 0x3d, 0x18, 0xf7, 0x06, 0x3b, 0xc9, 0xef, 0xe2, 0x20, 0x7d, 0xa8, 0x7b, + 0x70, 0xa8, 0x32, 0x7a, 0x36, 0x23, 0xb7, 0x02, 0x41, 0x25, 0x2e, 0x0f, 0xda, 0xd3, 0x65, 0x6f, 0x4b, 0xa6, 0x46, 0xc2, 0x6b, 0x15, 0xe5, 0x44, 0x16, 0xdd, 0xdb, 0xe6, 0xf9, 0x5e, 0xf8, 0xcb, + 0xf8, 0xf9, 0x13, 0x8d, 0x9f, 0x16, 0x72, 0x7b, 0x6d, 0x54, 0x1f, 0xb5, 0xc4, 0xa7, 0xed, 0x41, 0x5d, 0xd3, 0x34, 0x49, 0x1c, 0x3b, 0x37, 0x22, 0xed, 0x74, 0xc4, 0x49, 0x8a, 0xac, 0x24, 0x0a, + 0xbe, 0xd3, 0xd7, 0x2f, 0x8a, 0x69, 0x43, 0xf7, 0x43, 0x56, 0x9b, 0x78, 0xce, 0x96, 0x99, 0x59, 0xbc, 0xa8, 0x6f, 0xfa, 0xb2, 0xc6, 0x4e, 0xb2, 0x7e, 0x44, 0x6a, 0xce, 0xbe, 0x9f, 0x12, 0x38, + 0x01, 0x71, 0x95, 0x81, 0x6d, 0xd4, 0xa8, 0x50, 0x7c, 0x01, 0xdc, 0x75, 0x57, 0xa8, 0xe3, 0xad, 0xe4, 0x01, 0x58, 0x97, 0x6b, 0x72, 0xc2, 0xac, 0x8c, 0xe5, 0x04, 0xb3, 0x47, 0x19, 0xa8, 0xd5, + 0xe5, 0xb2, 0xcb, 0x6b, 0x0b, 0x7c, 0x1f, 0x69, 0xc0, 0x00, 0xf7, 0xf2, 0x54, 0x49, 0x35, 0x68, 0x2b, 0x4e, 0x90, 0x1f, 0x3b, 0xe8, 0xb5, 0x2a, 0xfb, 0x46, 0x83, 0xbe, 0x32, 0xc5, 0x6d, 0x28, + 0x1e, 0x21, 0x39, 0xfe, 0x6f, 0x1b, 0x3e, 0x00, 0xce, 0x2c, 0x52, 0xaa, 0x6a, 0xe9, 0x40, 0x2c, 0xd1, 0x6a, 0x31, 0x16, 0x34, 0x81, 0x5e, 0x91, 0x5d, 0x9c, 0x48, 0x28, 0x3d, 0x41, 0x00, 0xc1, + 0xa3, 0x68, 0x16, 0x37, 0x32, 0xaa, 0x5c, 0xce, 0x51, 0x46, 0xa4, 0x23, 0x73, 0x83, 0x53, 0xb3, 0x88, 0xab, 0x58, 0x99, 0x9a, 0x53, 0xf5, 0x70, 0x37, 0xdb, 0x2c, 0x33, 0x4f, 0x5a, 0xba, 0x84, + 0x55, 0x0b, 0xc4, 0x00, 0x8a, 0x19, 0x43, 0xdf, 0x6a, 0xfd, 0xf6, 0x26, 0x66, 0xe3, 0xbe, 0x6b, 0xa3, 0xef, 0x74, 0xd5, 0xf7, 0x3b, 0x9a, 0x1b, 0x1a, 0x7f, 0xaa, 0x15, 0xf4, 0x4e, 0x15, 0xec, + 0x7c, 0x1c, 0xb7, 0xb5, 0x83, 0x48, 0x01, 0x18, 0x68, 0xac, 0xeb, 0x24, 0x0c, 0xbe, 0x1e, 0x6a, 0x83, 0xad, 0x99, 0xea, 0x59, 0x19, 0x48, 0x13, 0xd5, 0x24, 0x12, 0xc1, 0x1d, 0xd5, 0x41, 0x0d, + 0xbb, 0x7a, 0x62, 0xae, 0xc7, 0x00, 0xa4, 0xd2, 0xe4, 0x74, 0x6c, 0xe5, 0x7b, 0xa7, 0x9f, 0x46, 0x88, 0xd4, 0x0d, 0xf5, 0x58, 0x1f, 0x64, 0x35, 0x2f, 0x66, 0xf5, 0xc6, 0x42, 0xc4, 0xe1, 0x30, + 0x37, 0xd7, 0xe3, 0xa1, 0xb4, 0x4d, 0xf7, 0x49, 0xcb, 0xd0, 0xf7, 0x4b, 0x2d, 0xdb, 0x0b, 0x24, 0xa7, 0xbd, 0x5d, 0x6e, 0x0b, 0x12, 0x98, 0x59, 0xe7, 0x68, 0xd9, 0xb9, 0x61, 0xea, 0xea, 0xef, + 0x83, 0x7f, 0xdb, 0x40, 0xe6, 0x16, 0x6a, 0xb3, 0xb5, 0xab, 0xf4, 0x88, 0x6c, 0xea, 0x7e, 0x2f, 0xee, 0x3f, 0x9f, 0x1b, 0xbc, 0x53, 0x3d, 0xf3, 0xae, 0x39, 0x6e, 0xc4, 0xbe, 0xc5, 0x5c, 0x60, + 0x4e, 0x31, 0x1e, 0x9d, 0x6e, 0x0a, 0x65, 0x09, 0xac, 0x46, 0x3d, 0x79, 0x04, 0xc3, 0x0e, 0xc7, 0x8a, 0xfd, 0x82, 0xc4, 0xb6, 0x12, 0x41, 0x6e, 0x65, 0x17, 0x1f, 0x8f, 0x07, 0xb3, 0xf5, 0x68, + 0x3f, 0x45, 0x50, 0x3c, 0x65, 0x02, 0x6f, 0x83, 0x01, 0xfb, 0x43, 0x97, 0xcf, 0x0b, 0x3f, 0xc5, 0xdd, 0xa2, 0x9a, 0xf5, 0x67, 0x7a, 0x76, 0xc0, 0x88, 0x83, 0x38, 0x15, 0x51, 0x55, 0xca, 0xfb, + 0x64, 0x9a, 0x3e, 0x8d, 0x07, 0x7d, 0xe6, 0x94, 0x6b, 0x05, 0x65, 0x60, 0xfa, 0xba, 0xfa, 0x30, 0xa2, 0xe1, 0xb5, 0x34, 0xad, 0x77, 0xaa, 0x0d, 0x94, 0xe7, 0xe3, 0xb6, 0x69, 0x5a, 0x53, 0x84, + 0x5a, 0x4a, 0x0c, 0x4c, 0x42, 0x61, 0xb9, 0x5e, 0x12, 0xa8, 0xec, 0x65, 0x7e, 0x5f, 0xe8, 0xa3, 0x86, 0x6f, 0x88, 0x74, 0xac, 0x8e, 0x37, 0xca, 0x4e, 0x18, 0xc1, 0x39, 0x3f, 0xb0, 0x6a, 0x0b, + 0x4d, 0x16, 0xf9, 0xdc, 0xb4, 0x39, 0x95, 0x33, 0xd3, 0xca, 0x34, 0x81, 0xed, 0x41, 0x04, 0xd6, 0xc4, 0xb2, 0x58, 0xf4, 0xc4, 0x15, 0x21, 0x27, 0x86, 0x60, 0x2c, 0xdc, 0x05, 0x8c, 0xa3, 0xe5, + 0xf8, 0x59, 0x44, 0xc3, 0x9f, 0x09, 0xe5, 0x77, 0x59, 0xea, 0xc4, 0x4b, 0x7b, 0x15, 0xdc, 0x92, 0xbe, 0x01, 0xb5, 0xc9, 0x4a, 0x27, 0xda, 0x6d, 0x58, 0xb0, 0x4d, 0x4a, 0x95, 0x86, 0x8a, 0xfe, + 0x44, 0xad, 0xe7, 0xcc, 0x2e, 0x84, 0xdc, 0x58, 0x72, 0xf9, 0x78, 0xa9, 0x7a, 0xdb, 0xde, 0xd2, 0x04, 0x26, 0x9e, 0x68, 0x25, 0x9e, 0xa3, 0x33, 0xfc, 0x61, 0x9c, 0x81, 0x75, 0xa8, 0x15, 0x3e, + 0x67, 0x50, 0xf3, 0x12, 0x5c, 0xa9, 0x81, 0x5a, 0xe3, 0x7d, 0x06, 0x5b, 0x5b, 0x4e, 0x8a, 0x2e, 0xe5, 0x05, 0xaa, 0x74, 0x83, 0x72, 0x91, 0x83, 0x73, 0x34, 0x45, 0xb7, 0xcf, 0x90, 0xfd, 0x26, + 0x82, 0xef, 0x4a, 0xf6, 0x7e, 0xfd, 0x1d, 0xff, 0x6c, 0x23, 0x04, 0x6a, 0xdc, 0x89, 0x34, 0xef, 0xd7, 0x5d, 0xa7, 0xff, 0x3e, 0x77, 0xf5, 0x5d, 0xc7, 0x4f, 0xf2, 0xf7, 0xe6, 0xdf, 0x31, 0x8b, + 0x7f, 0x5b, 0x75, 0xfd, 0x30, 0x62, 0xb6, 0x89, 0x18, 0x7c, 0x20, 0x21, 0xd8, 0x4b, 0x63, 0xf5, 0x29, 0x06, 0xb1, 0x73, 0xfa, 0xdf, 0xc4, 0x54, 0xb5, 0x90, 0x87, 0x68, 0x12, 0x6a, 0xce, 0xa0, + 0x5a, 0x8c, 0x36, 0xb1, 0x9c, 0x9b, 0x35, 0xe5, 0x32, 0x7c, 0x50, 0xf5, 0x55, 0x2c, 0xd4, 0x3c, 0x6c, 0x24, 0x88, 0x55, 0xee, 0xe8, 0x60, 0x59, 0x75, 0x77, 0x5b, 0x12, 0x5c, 0xaf, 0xe6, 0x7a, + 0x39, 0x12, 0xba, 0x2b, 0x9a, 0x20, 0xa8, 0x79, 0x4e, 0x2d, 0x76, 0x02, 0x09, 0x40, 0x43, 0x92, 0x58, 0x4e, 0x17, 0x82, 0x59, 0x95, 0x5d, 0x36, 0x16, 0x21, 0x02, 0x76, 0xb1, 0xa7, 0x89, 0x01, + 0xdf, 0x2c, 0xff, 0xdc, 0x44, 0xbe, 0x9e, 0x4a, 0xe2, 0xdc, 0x30, 0xfd, 0xcb, 0x72, 0xc1, 0x71, 0x42, 0x04, 0xbf, 0x90, 0x55, 0xfd, 0x27, 0x04, 0x4b, 0x9f, 0x00, 0x6f, 0xfe, 0xfe, 0x28, 0xdc, + 0x53, 0x77, 0xa2, 0x9d, 0x6b, 0xa8, 0xdf, 0x6d, 0xb8, 0xfb, 0xf3, 0x99, 0xd6, 0x85, 0x68, 0x23, 0x00, 0xa7, 0xc3, 0x66, 0x7f, 0xdd, 0x16, 0xb3, 0xad, 0x5e, 0x82, 0xa6, 0xd6, 0x64, 0x31, 0x27, + 0x22, 0x49, 0xf7, 0x2c, 0x64, 0x1c, 0xc8, 0xc1, 0x60, 0x6c, 0x99, 0x2b, 0xbe, 0xd8, 0x30, 0x86, 0x69, 0x1f, 0x18, 0xc8, 0x5d, 0x89, 0xb8, 0xa9, 0x21, 0x2b, 0x18, 0xca, 0x07, 0x63, 0x99, 0xa5, + 0x97, 0x94, 0xc0, 0x54, 0x8a, 0xb1, 0xa2, 0xab, 0x95, 0x46, 0x1d, 0x36, 0xb3, 0x1a, 0x1d, 0x7a, 0x9e, 0x64, 0x7b, 0xdd, 0xdd, 0x74, 0x9d, 0x2a, 0xd2, 0xbe, 0x4f, 0xec, 0x9e, 0x05, 0x38, 0xb5, + 0x9e, 0x80, 0xb9, 0xa1, 0xe1, 0x16, 0xae, 0x91, 0xab, 0xfe, 0xb7, 0xb3, 0x96, 0x58, 0xcd, 0xfd, 0xc0, 0xf5, 0xfd, 0xe4, 0x34, 0x35, 0x3a, 0x51, 0x07, 0x5f, 0x9b, 0xb9, 0x5c, 0xc5, 0xe3, 0xfe, + 0xfa, 0xf7, 0x5b, 0xc3, 0xf9, 0x38, 0xaf, 0xb9, 0x38, 0x2a, 0x8e, 0x6d, 0x9f, 0x52, 0xbc, 0x6c, 0x3f, 0xd2, 0x3a, 0xb1, 0x9a, 0x98, 0xa7, 0x92, 0xa0, 0xff, 0x8e, 0x7f, 0xfe, 0xb1, 0x9b, 0x76, + 0xce, 0xce, 0xc6, 0x4b, 0x2c, 0xeb, 0xbf, 0x23, 0x9f, 0x65, 0xfc, 0xaa, 0xb2, 0xd3, 0xbf, 0x7f, 0xa9, 0xec, 0xf4, 0x35, 0x18, 0xf6, 0xdf, 0xbf, 0x04, 0xc3, 0x26, 0xa6, 0x6a, 0x18, 0x6e, 0x12, + 0x9f, 0x5b, 0x5f, 0xdb, 0x8d, 0xec, 0x36, 0x3e, 0xea, 0xfd, 0x77, 0x97, 0x15, 0xb9, 0xc7, 0x59, 0x90, 0x56, 0xda, 0x54, 0x3f, 0x48, 0xcf, 0x1f, 0x87, 0xb6, 0x8a, 0xfe, 0xd3, 0xfd, 0x28, 0x37, + 0xde, 0x7f, 0x77, 0xaf, 0x5b, 0x90, 0xaf, 0x59, 0xe3, 0x1f, 0x74, 0x8f, 0x3d, 0xe3, 0xe3, 0xac, 0xd9, 0x05, 0xa9, 0x85, 0x82, 0x5c, 0xbb, 0xc2, 0x7e, 0x9d, 0xce, 0x76, 0xbc, 0x12, 0xf0, 0xbc, + 0x42, 0x1c, 0x54, 0x74, 0x57, 0x1f, 0x40, 0x9e, 0x06, 0x28, 0x60, 0x05, 0xe8, 0xb8, 0x39, 0xdc, 0x2d, 0x33, 0x65, 0xa4, 0xbb, 0x3b, 0x60, 0x7e, 0x40, 0x0e, 0x6c, 0xa4, 0x05, 0xb5, 0xae, 0xea, + 0x25, 0xdc, 0x17, 0x86, 0x95, 0xe5, 0x08, 0x3d, 0x55, 0x9c, 0xec, 0x46, 0x05, 0x25, 0x1d, 0x36, 0x82, 0x30, 0xad, 0x57, 0x44, 0x37, 0xda, 0x0c, 0xf6, 0x2d, 0x2d, 0xf2, 0xdf, 0xd8, 0x7c, 0xba, + 0x49, 0x9c, 0xd3, 0x5c, 0xfb, 0x52, 0x9b, 0xf6, 0x8b, 0x93, 0x2e, 0x4e, 0x22, 0xdd, 0x4c, 0x4f, 0xbf, 0x86, 0xde, 0x9a, 0x4a, 0x2c, 0xd7, 0xcd, 0x79, 0xe6, 0xfa, 0x97, 0x36, 0xe4, 0x76, 0xa3, + 0xbb, 0x3c, 0x77, 0x8d, 0xf3, 0x6b, 0xa1, 0x2f, 0xac, 0x13, 0xc3, 0xc4, 0x1f, 0xff, 0xe7, 0xdf, 0x90, 0x36, 0x01, 0x2c, 0xd7, 0xbc, 0xbb, 0x5d, 0xda, 0xfd, 0x2b, 0x7f, 0xf5, 0xaf, 0xfc, 0xd5, + 0x1f, 0x49, 0xcc, 0x5f, 0xf9, 0xab, 0xad, 0xf2, 0x57, 0x3f, 0x27, 0xd4, 0xdc, 0xc3, 0xe7, 0xb5, 0x0a, 0x32, 0x37, 0x94, 0x8f, 0x9a, 0xf8, 0xfa, 0xbc, 0x6d, 0xed, 0x98, 0xc5, 0xa2, 0xcf, 0xce, + 0x53, 0x8f, 0x74, 0x73, 0xf0, 0xa0, 0xe1, 0xd1, 0x64, 0xab, 0xa7, 0x03, 0x6e, 0x19, 0xc7, 0x83, 0x59, 0x98, 0x7a, 0x20, 0x8e, 0x08, 0x2b, 0x69, 0x31, 0xd1, 0xb0, 0x7a, 0x8e, 0x47, 0xe1, 0xa6, + 0x5c, 0x0d, 0xd0, 0x7a, 0x15, 0x04, 0x52, 0x34, 0xd3, 0x05, 0x6b, 0xc8, 0x02, 0xec, 0xa2, 0x17, 0x5b, 0x13, 0x50, 0xc6, 0x29, 0xcc, 0xe2, 0x6d, 0x94, 0x52, 0x38, 0x56, 0xed, 0xfb, 0x93, 0x67, + 0x33, 0xec, 0x67, 0xe9, 0x47, 0xa1, 0x1a, 0x34, 0xe2, 0xfd, 0xef, 0x70, 0xb3, 0x23, 0xe8, 0x4f, 0xd5, 0x21, 0xd9, 0x32, 0x9a, 0xef, 0xe6, 0x61, 0xf7, 0xe5, 0xf6, 0x95, 0xbd, 0x8c, 0x3f, 0xc8, + 0xbe, 0x33, 0xe5, 0x78, 0xd2, 0xf8, 0x3d, 0x5b, 0x04, 0x2b, 0x19, 0x42, 0x05, 0xa0, 0x74, 0xbe, 0x46, 0x55, 0xa4, 0x9c, 0x69, 0x0a, 0x37, 0xca, 0x79, 0x25, 0x96, 0x74, 0xdb, 0x1b, 0xe6, 0x53, + 0x19, 0xcc, 0x99, 0x29, 0x98, 0x6b, 0xba, 0x32, 0xe8, 0x0a, 0x1b, 0xad, 0x17, 0x51, 0x96, 0x85, 0x09, 0x54, 0xb5, 0x8a, 0x71, 0xc6, 0x82, 0x4c, 0x6b, 0x49, 0xe5, 0xfd, 0x68, 0x1b, 0xe1, 0x7b, + 0x6c, 0x70, 0x20, 0x8d, 0x6d, 0x57, 0xb0, 0xc5, 0xe1, 0xc6, 0xa6, 0x53, 0xf1, 0xc7, 0x7e, 0x4f, 0x3d, 0x0a, 0x34, 0x37, 0x34, 0x8d, 0xa3, 0xf6, 0x32, 0xd5, 0xc7, 0xae, 0x61, 0xe8, 0x8d, 0x7a, + 0x01, 0xa0, 0x1b, 0xda, 0x0d, 0x4a, 0x37, 0x57, 0x9a, 0xee, 0x4c, 0x3d, 0x87, 0x6a, 0x20, 0xce, 0x30, 0x7e, 0x61, 0xe5, 0x63, 0x93, 0xb3, 0x48, 0x9d, 0xd1, 0x18, 0x7e, 0x3c, 0xd8, 0x38, 0x93, + 0x65, 0x6f, 0x0f, 0x20, 0x3b, 0x9a, 0x4e, 0x18, 0x3f, 0x58, 0x30, 0x85, 0x5e, 0x0c, 0xfa, 0x38, 0xc3, 0xc0, 0x9c, 0x32, 0xd9, 0x64, 0xcb, 0x01, 0xbd, 0xec, 0x39, 0x86, 0x5f, 0x77, 0x6b, 0x61, + 0x5b, 0x1e, 0x1c, 0xca, 0xef, 0x19, 0x61, 0x11, 0xf0, 0x82, 0x09, 0x02, 0xb8, 0x6e, 0x44, 0x7d, 0xe3, 0xf5, 0x99, 0xb7, 0x61, 0xfa, 0x6a, 0x75, 0x0d, 0xd9, 0x29, 0x53, 0xe3, 0x05, 0x4b, 0xb1, + 0xa5, 0xb3, 0x35, 0x0a, 0x02, 0x35, 0x34, 0x1e, 0xae, 0x2f, 0xc1, 0xaf, 0xe9, 0xdd, 0x77, 0xb2, 0x27, 0xc6, 0x9c, 0x8e, 0x3b, 0x70, 0x4b, 0x15, 0xdb, 0xe5, 0x78, 0x7f, 0x93, 0x65, 0x20, 0x33, + 0x8b, 0xb6, 0x09, 0x15, 0x45, 0x95, 0xe7, 0xcd, 0x16, 0xc6, 0xc8, 0xf5, 0x05, 0x69, 0xb7, 0x1a, 0x6f, 0x18, 0x60, 0xe8, 0x1c, 0x78, 0x29, 0x13, 0x26, 0xe5, 0x0e, 0x5a, 0x60, 0x1e, 0xe6, 0x2f, + 0xb1, 0x59, 0xec, 0xe5, 0xfb, 0x60, 0x71, 0x48, 0x22, 0xc6, 0x0a, 0x2d, 0x69, 0xc9, 0x89, 0x23, 0x4e, 0x64, 0xc8, 0x32, 0xa9, 0x38, 0x67, 0xa3, 0x26, 0x33, 0x2f, 0xf8, 0x49, 0x2c, 0x2f, 0xdc, + 0xca, 0xab, 0x14, 0x05, 0x71, 0x14, 0x9a, 0x61, 0xd6, 0x31, 0x03, 0x37, 0xcb, 0x1e, 0x43, 0xf8, 0x52, 0x52, 0xe8, 0x17, 0xea, 0x27, 0x24, 0x6f, 0xaf, 0x75, 0xe0, 0x76, 0x09, 0xa2, 0x0b, 0x03, + 0x4d, 0x4d, 0x42, 0x64, 0x80, 0x54, 0x80, 0xa5, 0x72, 0xaf, 0x78, 0xa9, 0x2e, 0x26, 0x79, 0x12, 0xf7, 0xe7, 0x23, 0x4b, 0x80, 0xc0, 0x6a, 0x1b, 0x2e, 0xdd, 0x90, 0x10, 0xc1, 0xa4, 0x87, 0x06, + 0x42, 0x9e, 0x71, 0x85, 0x9c, 0xb0, 0xb4, 0x33, 0xce, 0x35, 0x34, 0xe9, 0x42, 0xf9, 0x4c, 0x03, 0x96, 0xfd, 0x25, 0x93, 0xf7, 0x21, 0x71, 0x1b, 0x31, 0x5d, 0x68, 0x6b, 0x58, 0x6a, 0x96, 0x2e, + 0x7e, 0xbc, 0xff, 0xef, 0xcd, 0x02, 0xf4, 0x3d, 0xa4, 0xa0, 0x17, 0xc7, 0xb0, 0x0b, 0xd9, 0x06, 0xa2, 0xcb, 0x49, 0x07, 0x6a, 0x37, 0x7a, 0x81, 0xcb, 0xa4, 0xc0, 0x8c, 0xb4, 0xac, 0xc4, 0x19, + 0x63, 0x45, 0xce, 0x30, 0xae, 0xbb, 0x11, 0xb1, 0xd5, 0xd0, 0x61, 0x8d, 0x2e, 0x13, 0xb9, 0xb7, 0x67, 0x38, 0x3c, 0x91, 0x72, 0x67, 0xb8, 0x20, 0x55, 0x27, 0xf3, 0xb5, 0xed, 0x24, 0x5c, 0x1d, + 0x4a, 0x44, 0x63, 0x07, 0xfc, 0xc2, 0xf7, 0x54, 0x9a, 0xec, 0x6f, 0x38, 0x75, 0xa3, 0x50, 0x65, 0xca, 0x19, 0x91, 0x31, 0x28, 0xb4, 0x9d, 0x33, 0x09, 0xf6, 0x2f, 0x60, 0x13, 0xed, 0xdc, 0x47, + 0x63, 0x08, 0xf4, 0x86, 0xbf, 0x24, 0x41, 0x47, 0x92, 0x0d, 0x26, 0xc7, 0x83, 0x4e, 0x43, 0xe5, 0x39, 0x1e, 0x5b, 0x05, 0x1d, 0xca, 0x55, 0x08, 0x46, 0x94, 0x6d, 0x4d, 0xc6, 0x7e, 0xe8, 0x6f, + 0x48, 0x9b, 0x3c, 0xec, 0x31, 0xbb, 0x12, 0x08, 0x61, 0x99, 0x3b, 0xc3, 0xf9, 0x44, 0x55, 0x87, 0x69, 0x3a, 0x64, 0x90, 0xbd, 0xdd, 0x93, 0x97, 0x90, 0x3d, 0xb7, 0x33, 0xa9, 0x88, 0x2a, 0x65, + 0x2a, 0x65, 0x5d, 0x5a, 0x23, 0x0c, 0x16, 0x73, 0x2c, 0xbd, 0x6b, 0xac, 0x70, 0x35, 0xd9, 0x15, 0x3a, 0x28, 0xb0, 0x41, 0xf2, 0xc3, 0x28, 0xef, 0x76, 0xdd, 0xef, 0xf8, 0x55, 0xde, 0x43, 0x7f, + 0x0d, 0xf2, 0xe2, 0xc0, 0x7b, 0xa6, 0xfa, 0x8e, 0x9b, 0xa7, 0x26, 0x4d, 0x28, 0x69, 0x8b, 0x61, 0x77, 0xda, 0x3b, 0x10, 0x11, 0x97, 0x4c, 0x80, 0xb9, 0x53, 0x4f, 0x27, 0x63, 0xb9, 0xeb, 0xe1, + 0x4b, 0x12, 0xdc, 0xa2, 0x1e, 0x0f, 0x06, 0x32, 0x57, 0xf4, 0xc0, 0x9e, 0x39, 0x82, 0xd7, 0x62, 0x30, 0x0e, 0x09, 0x1c, 0x71, 0xe7, 0x2c, 0xbe, 0xc5, 0x24, 0xa6, 0x66, 0xbb, 0x3e, 0x80, 0x0b, + 0xbc, 0xb0, 0xf1, 0x2b, 0x49, 0xa2, 0x81, 0x65, 0xb0, 0x92, 0xe7, 0x01, 0xc4, 0x89, 0x72, 0x19, 0xf7, 0xf0, 0xf1, 0xfe, 0xc7, 0x51, 0x93, 0x7a, 0x62, 0xaa, 0x99, 0xd9, 0x39, 0xcf, 0x1f, 0xbe, + 0x31, 0x4b, 0x5e, 0xe8, 0x6a, 0x37, 0xa4, 0x8f, 0x10, 0xdd, 0x5c, 0x68, 0xbb, 0x2c, 0x6b, 0xe8, 0x93, 0xc1, 0x06, 0xf5, 0x42, 0x88, 0x8f, 0x47, 0xea, 0xc6, 0x73, 0xd3, 0x68, 0x51, 0x98, 0x87, + 0xd1, 0x78, 0xd5, 0x9f, 0xd4, 0xea, 0x9e, 0xac, 0x91, 0x44, 0x99, 0x1c, 0x2c, 0x80, 0x5f, 0x26, 0x5d, 0x69, 0x67, 0x04, 0x5c, 0x90, 0xca, 0x58, 0x80, 0xf8, 0xfa, 0x34, 0xf2, 0x12, 0x0f, 0x1c, + 0x70, 0x3e, 0x15, 0xec, 0xf0, 0xd5, 0x81, 0x0f, 0xb6, 0x34, 0x60, 0x65, 0x8b, 0xdd, 0x1c, 0x44, 0xa3, 0x47, 0x06, 0xe3, 0x77, 0x38, 0x45, 0x69, 0xda, 0x49, 0x63, 0xb5, 0x7c, 0x14, 0x65, 0x44, + 0xbe, 0x14, 0x5c, 0x71, 0x45, 0xb7, 0x41, 0xe8, 0xfd, 0xac, 0xf1, 0x6d, 0xb4, 0x70, 0xfc, 0xb9, 0x8b, 0xde, 0x7c, 0x3c, 0x91, 0xe7, 0xab, 0xfe, 0xac, 0x47, 0x1a, 0xdc, 0x5c, 0xa0, 0x92, 0x9d, + 0x26, 0x84, 0xf3, 0xb8, 0xea, 0x55, 0xb6, 0xde, 0x1b, 0x64, 0x6b, 0x2f, 0x36, 0xd7, 0x33, 0xd6, 0xae, 0xa8, 0xf5, 0x1c, 0x49, 0x36, 0xfa, 0x61, 0x33, 0xa5, 0xa4, 0x74, 0xb7, 0x30, 0x45, 0x9f, + 0x10, 0x12, 0x06, 0x19, 0x92, 0x80, 0x3c, 0x4e, 0x54, 0x3b, 0x85, 0xf7, 0x30, 0x3e, 0xc8, 0x0d, 0x9d, 0x1c, 0x12, 0xcf, 0x1c, 0x7f, 0x8f, 0x4d, 0x92, 0x58, 0xcd, 0x9c, 0xce, 0xce, 0x3c, 0x85, + 0xff, 0xa3, 0x5f, 0x3c, 0xbf, 0x8e, 0xa9, 0xa9, 0xa1, 0xdd, 0x39, 0x8f, 0xf2, 0xbf, 0xfe, 0xe5, 0x5e, 0x7d, 0xb6, 0xd2, 0x71, 0xaf, 0x52, 0xc0, 0x7f, 0xbe, 0x1e, 0xd0, 0x2a, 0x05, 0xdc, 0x30, + 0x4f, 0x9e, 0xb7, 0x47, 0xe2, 0xfe, 0x73, 0x0d, 0xda, 0x50, 0x6c, 0x12, 0x05, 0x8e, 0x10, 0xc0, 0xed, 0xd6, 0x1b, 0x8b, 0x74, 0x45, 0x2c, 0xb1, 0xc9, 0x8a, 0x2b, 0xa4, 0xe1, 0x41, 0xeb, 0xeb, + 0xae, 0x47, 0x3a, 0xbb, 0xf5, 0xa2, 0x80, 0x46, 0x19, 0x90, 0x0e, 0x87, 0xeb, 0x95, 0xc0, 0x13, 0xa4, 0x21, 0x1a, 0x26, 0x18, 0xe1, 0x1b, 0x2f, 0x4c, 0x80, 0x49, 0x30, 0xf5, 0x0e, 0xeb, 0xb1, + 0xeb, 0x22, 0x79, 0x5f, 0xd0, 0x46, 0x49, 0x06, 0xb3, 0x3a, 0xdf, 0x2d, 0xa1, 0xad, 0x1a, 0x15, 0x07, 0xc0, 0x15, 0xfc, 0xd1, 0x14, 0xf8, 0x3e, 0x66, 0xee, 0xbb, 0x14, 0x09, 0xf4, 0x0d, 0x79, + 0x61, 0xb3, 0xf2, 0xdb, 0x14, 0x89, 0x86, 0xc6, 0xf3, 0x2f, 0x67, 0x07, 0x5e, 0xbd, 0xdd, 0xd2, 0x2e, 0x26, 0x39, 0x96, 0x2b, 0x16, 0x6e, 0x9d, 0x0c, 0x44, 0xb3, 0x90, 0xa4, 0x0d, 0x97, 0x85, + 0xec, 0x7e, 0x6d, 0x99, 0xe4, 0x01, 0xa6, 0x1d, 0xbb, 0x9f, 0xea, 0x52, 0x4d, 0x28, 0xda, 0x54, 0xb3, 0xa2, 0xe9, 0x62, 0x3a, 0xcf, 0x6d, 0x49, 0xac, 0x98, 0xcc, 0x21, 0x2c, 0x4a, 0xe9, 0x2f, + 0x56, 0xf2, 0xb2, 0x5a, 0x73, 0x83, 0x1e, 0x48, 0xae, 0x73, 0x2c, 0x83, 0x37, 0xaf, 0xcf, 0x03, 0x83, 0x6b, 0x1f, 0x5c, 0x1b, 0xf1, 0x69, 0x56, 0xbd, 0xdc, 0xfa, 0xb1, 0xca, 0x7c, 0x25, 0xae, + 0xf5, 0x83, 0x6c, 0x03, 0xe7, 0xe5, 0xa4, 0xd9, 0xc9, 0xbc, 0x85, 0x34, 0xd5, 0xc8, 0x12, 0x58, 0x77, 0x37, 0x24, 0xea, 0xd0, 0xb2, 0xbc, 0x73, 0x81, 0x19, 0xd0, 0x55, 0x54, 0xc4, 0x67, 0xfc, + 0x3c, 0xa4, 0xba, 0xb5, 0x6b, 0x0b, 0xd5, 0x30, 0x49, 0xd5, 0x03, 0x30, 0x91, 0x45, 0xa2, 0x9c, 0xac, 0x31, 0x25, 0x5a, 0xc7, 0xfd, 0x2d, 0xb3, 0x1b, 0x3a, 0xa2, 0x57, 0xd2, 0x9e, 0xd7, 0x63, + 0x77, 0xeb, 0x83, 0xb3, 0x85, 0x56, 0x93, 0xbe, 0xb3, 0xa3, 0xca, 0x7a, 0x4b, 0x0e, 0x70, 0xfd, 0xd9, 0x42, 0xd0, 0x9f, 0x95, 0xa3, 0x7b, 0xf5, 0xb9, 0xdf, 0x2c, 0xbc, 0xbe, 0x36, 0x14, 0x7d, + 0xa2, 0x7d, 0x0b, 0x6e, 0xb3, 0xf4, 0xda, 0x72, 0x30, 0x5a, 0xbb, 0xf3, 0x83, 0xdd, 0x77, 0x93, 0xd1, 0x0a, 0x02, 0xcd, 0x91, 0xc0, 0xeb, 0xe1, 0x80, 0xa1, 0x51, 0x70, 0x34, 0x56, 0x68, 0x65, + 0x3f, 0x09, 0x4b, 0xba, 0x5c, 0x57, 0x45, 0x61, 0xb8, 0x98, 0x9f, 0x26, 0xf0, 0x9a, 0x9d, 0x21, 0x48, 0xe8, 0x18, 0x16, 0x88, 0x1a, 0x1a, 0xda, 0x8b, 0x14, 0x5d, 0xf6, 0xa4, 0x15, 0xb2, 0xdc, + 0x5b, 0xf5, 0xa8, 0x9c, 0x55, 0x31, 0x51, 0x21, 0x87, 0x14, 0x0d, 0x83, 0xdf, 0x99, 0x00, 0x5e, 0x89, 0xe1, 0x29, 0xd6, 0xe3, 0x46, 0x95, 0x5e, 0xaf, 0xbd, 0xbe, 0x36, 0x33, 0x84, 0x1e, 0x2c, + 0x21, 0xfc, 0x70, 0x99, 0xed, 0xd5, 0x15, 0xd6, 0xcf, 0x8c, 0xbb, 0x69, 0xfc, 0xf8, 0xba, 0x47, 0xae, 0x82, 0x9f, 0x4b, 0xca, 0x99, 0x26, 0xd8, 0xb9, 0x1c, 0xb5, 0xcd, 0x8f, 0x27, 0x67, 0xe0, + 0x1e, 0xf5, 0x2b, 0x05, 0x98, 0xae, 0xd8, 0x98, 0x9c, 0xd7, 0xf9, 0x21, 0x19, 0x27, 0xd8, 0x84, 0xd7, 0x98, 0x3e, 0xe2, 0xac, 0x49, 0x46, 0x22, 0xb7, 0x33, 0x57, 0x45, 0x51, 0x48, 0x18, 0x1c, + 0x46, 0x16, 0x66, 0xa0, 0x09, 0x5e, 0xaf, 0x62, 0x57, 0x9f, 0x23, 0x04, 0x0e, 0xf9, 0x24, 0x3b, 0x9f, 0x11, 0x0b, 0xbe, 0x5b, 0x0b, 0xe3, 0x85, 0x8f, 0xce, 0x86, 0xf1, 0x7e, 0xe9, 0x96, 0xe8, + 0xd3, 0xb2, 0x3a, 0x3f, 0x63, 0xde, 0x77, 0x30, 0x5f, 0x39, 0xa2, 0xff, 0xcc, 0x6e, 0x77, 0x21, 0xdb, 0xf4, 0xb8, 0xcb, 0x49, 0xdb, 0xce, 0x56, 0x19, 0x5d, 0x1d, 0xa7, 0x0d, 0x77, 0xbf, 0xd2, + 0x17, 0xc0, 0xd8, 0xd3, 0x4b, 0x59, 0xd4, 0xba, 0xbd, 0x9d, 0x33, 0xd6, 0xa9, 0xd0, 0x9e, 0x25, 0x10, 0xaf, 0x3a, 0x7d, 0x66, 0x58, 0xf4, 0xdc, 0x71, 0x49, 0xc5, 0xf9, 0x5a, 0xd5, 0x90, 0x4a, + 0xf1, 0x1d, 0x20, 0xdc, 0xa9, 0xa9, 0x10, 0x2a, 0x73, 0xa0, 0x3f, 0x94, 0xe8, 0x39, 0x91, 0x2c, 0x62, 0x64, 0x5c, 0x8f, 0x9d, 0xb1, 0x52, 0x17, 0xb3, 0x01, 0xf5, 0x0c, 0xd2, 0xc7, 0x9d, 0xcd, + 0x4d, 0x3b, 0x6a, 0x62, 0xe7, 0xc1, 0x65, 0x5d, 0xac, 0xe9, 0x51, 0x37, 0xab, 0x2a, 0x6e, 0xda, 0x31, 0x8e, 0x16, 0x6e, 0xa4, 0x79, 0xa6, 0xfe, 0xb1, 0x66, 0xf3, 0x79, 0xcb, 0x97, 0x4b, 0xf2, + 0xfd, 0x1d, 0x0a, 0xa7, 0x5f, 0x76, 0xdc, 0xf4, 0xfe, 0x8f, 0xcf, 0xcd, 0xef, 0x95, 0xfc, 0xbf, 0x04, 0x77, 0x9d, 0xb6, 0x1f, 0x7f, 0x8b, 0x93, 0x28, 0x8b, 0xb2, 0x2a, 0x36, 0xdf, 0x2c, 0x5f, + 0xb5, 0x2f, 0xf7, 0x22, 0x7f, 0x66, 0x47, 0x6e, 0x1d, 0xe5, 0xd5, 0xf0, 0xdd, 0x7d, 0xa4, 0xcf, 0xa1, 0x97, 0xca, 0xce, 0x9c, 0x69, 0x5e, 0xa4, 0xca, 0x4d, 0x3b, 0xd0, 0xf3, 0xf2, 0x33, 0x70, + 0x27, 0x45, 0xc2, 0x35, 0x00, 0x23, 0x54, 0x1f, 0x20, 0xe7, 0xf2, 0x0e, 0x58, 0xa4, 0x5c, 0x0f, 0x20, 0xf5, 0xd9, 0xa6, 0xae, 0xc5, 0xef, 0x2d, 0x26, 0xcb, 0x0d, 0xcd, 0x4e, 0x9c, 0x44, 0xb1, + 0x99, 0x64, 0xee, 0xc3, 0x78, 0x35, 0xf8, 0xc5, 0x6f, 0xf9, 0x44, 0xbd, 0xf9, 0xaa, 0x4f, 0xd7, 0x9a, 0x2e, 0xd3, 0x62, 0x36, 0x80, 0xf2, 0x7b, 0x6b, 0x3b, 0xf1, 0x10, 0x7f, 0x5a, 0x1b, 0xfc, + 0xd2, 0xa2, 0x94, 0x91, 0xd2, 0x07, 0x57, 0x80, 0x92, 0x57, 0x00, 0x63, 0xf7, 0x08, 0x0b, 0x26, 0x30, 0x93, 0x9a, 0x20, 0x25, 0x69, 0xd8, 0x61, 0x3c, 0xa1, 0x13, 0xa6, 0x67, 0x26, 0xc3, 0x6d, + 0xcc, 0x63, 0xc4, 0x68, 0xbb, 0xd5, 0xbd, 0x70, 0x67, 0xcc, 0x67, 0xbc, 0x37, 0xdf, 0x75, 0x69, 0x62, 0x35, 0x60, 0x28, 0x00, 0x5d, 0x4e, 0xfc, 0xdf, 0xb0, 0xaa, 0xbe, 0xca, 0x2b, 0xf4, 0x06, + 0xff, 0x7c, 0xb9, 0xf1, 0x26, 0x95, 0xfb, 0x19, 0x9f, 0xbe, 0x8b, 0x04, 0x7d, 0xc5, 0x22, 0x6b, 0x68, 0xbe, 0xf3, 0xc4, 0x68, 0xb3, 0xf2, 0x03, 0x77, 0xaa, 0x2d, 0xa2, 0xd5, 0x85, 0xb1, 0x36, + 0x18, 0x57, 0xe8, 0x8b, 0x7e, 0x3c, 0x58, 0x0c, 0x15, 0x0c, 0x4f, 0xad, 0x38, 0xe6, 0x7f, 0x38, 0xf1, 0xfc, 0xe2, 0xe3, 0xfd, 0x33, 0xbf, 0xed, 0x9a, 0x74, 0xf3, 0x89, 0xd7, 0x17, 0xda, 0x7c, + 0xe9, 0x51, 0xe6, 0x94, 0x6a, 0xd9, 0x23, 0x67, 0x56, 0x17, 0x56, 0xa7, 0x0c, 0xb4, 0x38, 0x4c, 0xb1, 0xc9, 0x30, 0x99, 0x70, 0xcc, 0xc6, 0x27, 0xfb, 0x46, 0x0a, 0xf7, 0xe8, 0xa0, 0x6f, 0xe8, + 0xd1, 0x4a, 0x2d, 0x37, 0xe1, 0xb4, 0x47, 0x2e, 0x7b, 0x4e, 0x3c, 0xb3, 0xb3, 0x7c, 0x34, 0x42, 0x54, 0x7a, 0x67, 0x93, 0x2a, 0x29, 0x2e, 0x31, 0xd8, 0x3b, 0xcc, 0x97, 0x0a, 0x4c, 0xc6, 0xd8, + 0xca, 0x18, 0x86, 0x3c, 0xb7, 0x43, 0xf9, 0x67, 0x32, 0xf7, 0x74, 0xe4, 0x6b, 0x57, 0xde, 0xde, 0x30, 0xe3, 0x47, 0xf2, 0xf2, 0x5a, 0x19, 0x94, 0x23, 0xc1, 0x06, 0xc9, 0xd8, 0x68, 0x5b, 0xf6, + 0xc4, 0x26, 0x43, 0x8e, 0x98, 0x13, 0x46, 0xd5, 0x73, 0xa3, 0x71, 0x64, 0xd3, 0xf4, 0x30, 0x4e, 0x86, 0x31, 0x9b, 0xad, 0x46, 0xc1, 0xd8, 0x89, 0xe7, 0x3b, 0x30, 0x89, 0xd8, 0xda, 0xd0, 0x50, + 0x6b, 0xe4, 0x10, 0x30, 0x98, 0x82, 0xe1, 0x3c, 0xb5, 0x16, 0x44, 0x14, 0x56, 0x7c, 0xb9, 0x63, 0xe9, 0x05, 0x28, 0xf8, 0x2c, 0x5a, 0x31, 0x2c, 0xe4, 0xf7, 0x97, 0x85, 0x1c, 0x89, 0x7d, 0x3a, + 0x4d, 0x47, 0x3f, 0xf5, 0xa1, 0xb5, 0x9b, 0x32, 0xd7, 0xaa, 0x6f, 0x3f, 0xaa, 0x6d, 0x70, 0x3b, 0x94, 0xb5, 0x87, 0xab, 0xa1, 0xd9, 0x20, 0xd6, 0x1c, 0x35, 0x42, 0xd7, 0xc2, 0x7b, 0x96, 0x6c, + 0x96, 0x73, 0x48, 0xb3, 0x00, 0x3c, 0x84, 0xc4, 0x28, 0x4c, 0x35, 0x60, 0xb9, 0x5a, 0x59, 0x33, 0x6b, 0x94, 0xba, 0x81, 0x80, 0x71, 0xfd, 0x2c, 0x08, 0x47, 0xf1, 0x9c, 0xdb, 0x52, 0x22, 0x2c, + 0xb3, 0xf5, 0xc4, 0x17, 0x93, 0x1e, 0x6f, 0x19, 0x91, 0x96, 0x50, 0xe1, 0x58, 0x10, 0xd2, 0x85, 0xbd, 0x66, 0x2b, 0x7e, 0xb1, 0x37, 0x97, 0x8c, 0x58, 0x07, 0x6b, 0x99, 0xdf, 0x93, 0x75, 0xf1, + 0x29, 0x05, 0xf2, 0x47, 0x8a, 0xee, 0x5c, 0x60, 0xe8, 0x9e, 0x37, 0x23, 0x51, 0xe3, 0xb8, 0x79, 0xf3, 0x56, 0xf3, 0x4a, 0xd7, 0xb2, 0x1e, 0x00, 0x8c, 0xbd, 0x14, 0x3b, 0x73, 0x24, 0x78, 0x44, + 0xd7, 0xb5, 0xac, 0x0e, 0xd6, 0x2e, 0x5a, 0x06, 0xa7, 0xfc, 0xe0, 0x30, 0x59, 0xd2, 0x18, 0x33, 0xab, 0xa6, 0x35, 0xc0, 0x71, 0xbc, 0x5c, 0xfb, 0x42, 0x3f, 0xb6, 0xa1, 0xee, 0x60, 0x05, 0x98, + 0x05, 0xa1, 0xf0, 0x26, 0x5a, 0x8c, 0x5d, 0xc7, 0x36, 0x0e, 0xb5, 0xad, 0x97, 0x0a, 0xb5, 0x8a, 0xfa, 0xfd, 0x79, 0x40, 0x4f, 0x59, 0x65, 0xd8, 0x9d, 0x06, 0x7b, 0x6b, 0x15, 0xcd, 0x78, 0x7e, + 0x12, 0x67, 0xd9, 0x68, 0x2b, 0xad, 0x86, 0x44, 0xde, 0xdb, 0x92, 0xbf, 0x3d, 0x8b, 0x44, 0xdb, 0xcd, 0xcb, 0xdd, 0xe4, 0x12, 0x77, 0x75, 0xdf, 0xbf, 0xf1, 0xca, 0x9c, 0xe0, 0x42, 0xb4, 0xc1, + 0xf1, 0x74, 0xd8, 0xa4, 0xa1, 0xb5, 0x30, 0x61, 0xd7, 0xbb, 0x64, 0x1d, 0x77, 0x87, 0x0b, 0x6c, 0xb2, 0xb1, 0x26, 0xc3, 0x6d, 0x2d, 0x4c, 0x03, 0x29, 0x1f, 0xae, 0x5c, 0x58, 0x5e, 0x0f, 0xac, + 0x32, 0x45, 0x49, 0x32, 0xec, 0xea, 0x3a, 0x8e, 0x83, 0x99, 0x46, 0xf4, 0xf2, 0x7d, 0x35, 0x20, 0x62, 0x5d, 0xc4, 0x69, 0xcd, 0xe5, 0xfa, 0xa9, 0xa3, 0xf6, 0xe2, 0x6d, 0xb7, 0x20, 0x22, 0x75, + 0x99, 0x20, 0x1b, 0xb6, 0xe7, 0x1a, 0xc3, 0x80, 0x2f, 0x8d, 0x7a, 0xf4, 0x0c, 0xcb, 0x27, 0xde, 0xb9, 0x4b, 0x2c, 0xc7, 0x39, 0x1a, 0xf7, 0x02, 0x6a, 0x5b, 0x56, 0xb4, 0x52, 0x15, 0x91, 0x9e, + 0x25, 0x6e, 0xf8, 0xc8, 0x39, 0xf2, 0xda, 0xb6, 0x42, 0x17, 0xa2, 0x47, 0x36, 0x9c, 0x0f, 0xdb, 0x6e, 0x23, 0x54, 0x2d, 0x01, 0x11, 0x77, 0x51, 0x87, 0xb1, 0xc8, 0x21, 0xb3, 0x33, 0xb0, 0xc9, + 0x90, 0x52, 0x49, 0x93, 0x99, 0xcd, 0xd6, 0xb3, 0xe1, 0x54, 0x52, 0xfb, 0x65, 0xb9, 0x5d, 0xcb, 0xae, 0x37, 0xda, 0xf2, 0x64, 0x9d, 0xf8, 0xdb, 0x1e, 0x0f, 0x31, 0x83, 0x0d, 0xe7, 0x79, 0xf3, + 0xb5, 0xbf, 0x56, 0xe0, 0x85, 0x4d, 0xca, 0xaa, 0x61, 0x28, 0xe6, 0xa8, 0x17, 0xb8, 0x5d, 0x6f, 0x80, 0x72, 0xc1, 0xde, 0x15, 0x9f, 0x56, 0xfa, 0xfd, 0x66, 0x67, 0xa1, 0xab, 0xdd, 0x1b, 0x91, + 0xfb, 0xc9, 0x17, 0xcf, 0x02, 0xd9, 0x5b, 0x46, 0x1c, 0x18, 0x51, 0xe6, 0xda, 0x61, 0xf4, 0xd0, 0xb3, 0x0f, 0xbd, 0x14, 0xa5, 0xfc, 0x4e, 0xb5, 0x61, 0xc5, 0xf9, 0xb8, 0x31, 0xc1, 0x5b, 0xa8, + 0x17, 0x79, 0x38, 0x1c, 0xae, 0xad, 0xa5, 0x9a, 0xe7, 0xa9, 0xba, 0x1a, 0xb3, 0x00, 0x65, 0xd9, 0x2b, 0x60, 0xb6, 0x2a, 0x98, 0xcd, 0x8e, 0x95, 0x82, 0x55, 0x41, 0xa6, 0x3b, 0x22, 0x8c, 0xbc, + 0x9e, 0xa2, 0x14, 0xb9, 0x20, 0xcf, 0x86, 0x72, 0x05, 0x29, 0x3b, 0x4c, 0x8e, 0x39, 0xb1, 0x47, 0xf4, 0x7b, 0xde, 0x12, 0xf2, 0x62, 0xa6, 0xd4, 0x69, 0xb6, 0xe0, 0x30, 0x33, 0xb2, 0x8a, 0xaa, + 0x66, 0xf4, 0x45, 0xef, 0x75, 0x5e, 0x04, 0x6e, 0xe8, 0x7e, 0xe4, 0xc1, 0xa2, 0xf7, 0x8b, 0x8e, 0x7e, 0xd9, 0x81, 0xe7, 0xf4, 0xc9, 0x0d, 0x4e, 0x9a, 0x1b, 0x82, 0x97, 0xd3, 0xe7, 0x0c, 0x31, + 0x83, 0xc8, 0xfb, 0xbe, 0xca, 0x32, 0xf5, 0x52, 0xe7, 0xb8, 0xa2, 0x0b, 0x76, 0xae, 0xcf, 0x3a, 0x54, 0xbb, 0x2e, 0xc2, 0x2f, 0xbd, 0x6d, 0xad, 0xaf, 0x67, 0x02, 0x0d, 0x99, 0x25, 0xcd, 0xc5, + 0x35, 0xc4, 0x1f, 0xe2, 0xed, 0xa0, 0x28, 0x6d, 0xa2, 0xf2, 0x2a, 0x78, 0x36, 0x44, 0x0f, 0x99, 0x19, 0xed, 0x6b, 0x02, 0xc3, 0x56, 0x6c, 0x04, 0x2e, 0xe6, 0x76, 0x98, 0xc0, 0xe0, 0x70, 0x98, + 0x01, 0xae, 0x8e, 0xba, 0x63, 0xa9, 0x16, 0xa9, 0x7e, 0x8e, 0x4a, 0x06, 0x0f, 0x63, 0x4b, 0xb5, 0x0c, 0x57, 0x72, 0x30, 0xec, 0x13, 0x3f, 0x8e, 0x02, 0x31, 0xc3, 0x66, 0x6d, 0xe8, 0xf1, 0x32, + 0x1d, 0xfa, 0x42, 0xb1, 0xbe, 0x0b, 0xd1, 0x23, 0x30, 0xe7, 0xc3, 0x4e, 0x43, 0xe9, 0x39, 0x2a, 0x95, 0x37, 0x0b, 0xe7, 0x09, 0x0a, 0xe3, 0xe0, 0xc0, 0x5b, 0x62, 0xf5, 0x28, 0x95, 0x0f, 0x5b, + 0x3b, 0xdf, 0xca, 0xf3, 0x39, 0x62, 0xc2, 0xb3, 0x09, 0x66, 0x90, 0x7d, 0x52, 0x11, 0xa6, 0x6e, 0xb5, 0x65, 0x75, 0x6d, 0xc0, 0xb8, 0x12, 0x5f, 0x8d, 0x7a, 0x00, 0x52, 0x16, 0x01, 0x52, 0x12, + 0x40, 0xac, 0x80, 0x91, 0xc1, 0xd3, 0xa4, 0xbe, 0xd8, 0x79, 0x4e, 0x3a, 0xd7, 0xfc, 0xac, 0x64, 0x84, 0x64, 0xfa, 0x1b, 0x66, 0xc6, 0xcd, 0xde, 0x04, 0x97, 0xdd, 0x66, 0x7f, 0xaa, 0x3c, 0xa8, + 0x56, 0x4b, 0xa6, 0x66, 0x92, 0x44, 0x49, 0xe7, 0xa1, 0x98, 0xc2, 0x2f, 0x95, 0xec, 0xbf, 0x10, 0x3d, 0xb2, 0xe2, 0x7c, 0xd8, 0x84, 0x25, 0xb4, 0xd0, 0x1b, 0xa4, 0x31, 0xe0, 0x66, 0xc1, 0xde, + 0x1c, 0x2c, 0xfb, 0x19, 0xa2, 0x30, 0x29, 0x9b, 0xb8, 0x51, 0x32, 0x09, 0x43, 0x54, 0x41, 0x62, 0x0f, 0xb0, 0x8c, 0xee, 0x2e, 0x18, 0x11, 0x62, 0xb4, 0x2e, 0x31, 0x10, 0xec, 0x4d, 0x01, 0x57, + 0xef, 0x33, 0x96, 0x0e, 0xc9, 0xe4, 0x7e, 0xcc, 0xba, 0xe9, 0x3e, 0x91, 0xd2, 0x89, 0xe4, 0x95, 0x98, 0x35, 0x1b, 0x54, 0x48, 0xbc, 0xee, 0x0a, 0xfb, 0x65, 0xd6, 0xa3, 0x3e, 0x6f, 0x4d, 0xf4, + 0xad, 0xeb, 0x27, 0x51, 0x2b, 0x37, 0x3d, 0xa9, 0x09, 0xa8, 0x65, 0xae, 0xab, 0x99, 0x76, 0x2e, 0x7b, 0xac, 0x3d, 0xf6, 0x19, 0x74, 0x5f, 0x28, 0xda, 0x76, 0x45, 0xf8, 0x08, 0xe5, 0xc7, 0x59, + 0xe7, 0x44, 0xf0, 0x39, 0x9c, 0xb4, 0x8a, 0x0c, 0x11, 0x60, 0x61, 0xa0, 0x1a, 0xb1, 0x3b, 0xf4, 0xe5, 0x89, 0x34, 0xc0, 0x24, 0x75, 0x4d, 0x90, 0x7a, 0xcd, 0x4c, 0x2b, 0xba, 0x40, 0x6b, 0x72, + 0x25, 0x38, 0xdb, 0x85, 0x8c, 0x43, 0x5b, 0xe6, 0x00, 0x68, 0x5a, 0xba, 0x55, 0xba, 0x07, 0x71, 0x8e, 0xf9, 0xfc, 0x4c, 0xad, 0xcd, 0x79, 0x3e, 0xf0, 0x2b, 0x6d, 0x33, 0x82, 0x56, 0x18, 0x9f, + 0xe4, 0xf3, 0x28, 0x25, 0xf7, 0x72, 0x84, 0x5b, 0xaf, 0x5b, 0x26, 0xd7, 0x79, 0x9c, 0x97, 0x8c, 0xc4, 0xff, 0xfe, 0xd1, 0x6c, 0xa6, 0x9d, 0x2c, 0xea, 0xc4, 0x89, 0x1b, 0xb8, 0xcd, 0x86, 0x91, + 0xff, 0xf2, 0x9e, 0x70, 0x7c, 0x75, 0xd3, 0x8b, 0xc9, 0x8f, 0x77, 0x6e, 0x49, 0xab, 0x40, 0x8b, 0xfc, 0x8e, 0x71, 0xde, 0x67, 0xf2, 0xcc, 0xab, 0xaf, 0x61, 0xb7, 0x8e, 0xfa, 0xe1, 0xd7, 0x40, + 0x3f, 0x35, 0x9c, 0x89, 0x3c, 0xb8, 0xe1, 0xc8, 0x92, 0x24, 0x54, 0xfd, 0x4e, 0xea, 0x47, 0xd9, 0x83, 0x5b, 0xd2, 0xce, 0x11, 0x15, 0x55, 0xf3, 0x3f, 0xbe, 0xf7, 0xb3, 0xbb, 0x31, 0x34, 0x6d, + 0xf5, 0x08, 0x48, 0xa7, 0x36, 0x93, 0xe8, 0xd7, 0xdd, 0x88, 0xdf, 0x4f, 0x0e, 0x47, 0xf8, 0x0b, 0x8d, 0xd4, 0x51, 0x93, 0x4b, 0x79, 0xbf, 0xce, 0x7b, 0xfd, 0x80, 0x3b, 0x4c, 0x38, 0xde, 0xfb, + 0x11, 0x5a, 0x7c, 0x6c, 0x26, 0x3f, 0x35, 0x97, 0xa6, 0xba, 0x4b, 0x4c, 0xeb, 0xfe, 0xcf, 0x2f, 0xbe, 0xcd, 0x30, 0x8d, 0x3f, 0xbc, 0xa3, 0x30, 0x72, 0x8b, 0xe8, 0x53, 0x0f, 0xe7, 0xe9, 0x86, + 0x37, 0x35, 0x4d, 0x5d, 0x3b, 0x7c, 0x57, 0x82, 0x37, 0x0f, 0x3a, 0xbd, 0xe4, 0x95, 0x13, 0x34, 0x4b, 0xdc, 0xc0, 0xbc, 0x12, 0x2d, 0xec, 0xe9, 0xdd, 0x69, 0xa6, 0x26, 0xd9, 0xfd, 0xfb, 0xf3, + 0x50, 0x8b, 0x0e, 0x5f, 0x44, 0xf1, 0xa5, 0x85, 0xea, 0xff, 0x98, 0x0a, 0x85, 0xd7, 0xba, 0xe3, 0xa6, 0xe1, 0x4a, 0x52, 0x1e, 0xb9, 0x37, 0x7f, 0x3e, 0xc3, 0xbf, 0x10, 0x05, 0x3b, 0xef, 0x87, + 0x6d, 0x03, 0x53, 0x77, 0xc5, 0xc2, 0x38, 0xf4, 0xd2, 0x83, 0xe2, 0x39, 0xb5, 0xbc, 0x81, 0x48, 0x25, 0x9c, 0x56, 0x46, 0xbd, 0x84, 0x25, 0x19, 0x94, 0xc6, 0xbe, 0x24, 0x73, 0xdc, 0x16, 0xdb, + 0x4e, 0xa7, 0x14, 0x69, 0xa2, 0x64, 0x24, 0xd3, 0x58, 0xb7, 0x67, 0xed, 0xa6, 0x7b, 0xbb, 0x02, 0x56, 0xde, 0x20, 0xd2, 0xa3, 0xb2, 0x42, 0xba, 0xfa, 0xa4, 0xd0, 0x97, 0x6e, 0x0e, 0xec, 0x46, + 0x05, 0x89, 0x50, 0x9e, 0x24, 0xad, 0x5e, 0x1f, 0x7c, 0x9f, 0xa8, 0xa8, 0x63, 0x97, 0xcf, 0xa2, 0x93, 0x34, 0x65, 0xaa, 0x7d, 0xa5, 0x30, 0xfe, 0xb3, 0xcb, 0xc5, 0x97, 0x8e, 0xfb, 0x40, 0x3a, + 0x5e, 0x59, 0xf1, 0xbe, 0xa5, 0x0d, 0x76, 0x3e, 0x5d, 0xe8, 0x9c, 0xc8, 0x3e, 0x97, 0x15, 0x2e, 0x42, 0x6a, 0x0a, 0xd2, 0x56, 0xa3, 0x62, 0xec, 0x47, 0x1c, 0xb0, 0xad, 0x17, 0x41, 0xac, 0xac, + 0x44, 0x93, 0x22, 0x81, 0x3d, 0xbd, 0x0c, 0x18, 0x79, 0xa2, 0xf4, 0xd6, 0xf6, 0xa1, 0xab, 0xe7, 0xc0, 0xa4, 0x97, 0x6c, 0x10, 0xa5, 0xc7, 0x81, 0x68, 0xc6, 0x57, 0x80, 0xbd, 0xd1, 0x94, 0xbe, + 0xb4, 0x1a, 0xa6, 0x08, 0x4f, 0x6d, 0x8d, 0x83, 0xa0, 0x09, 0x0e, 0xb9, 0xa1, 0x33, 0x37, 0xe8, 0x6e, 0xa1, 0x67, 0xb2, 0xf2, 0xbf, 0x82, 0x25, 0x9f, 0x86, 0xbd, 0xfb, 0xd0, 0xbf, 0x52, 0x56, + 0xf4, 0x13, 0xed, 0x93, 0x19, 0x71, 0x7d, 0xa5, 0x89, 0x3a, 0x68, 0xe1, 0xe3, 0x10, 0x59, 0xc1, 0xf7, 0x6d, 0x65, 0x9c, 0xa9, 0x72, 0xd4, 0x0d, 0xdc, 0x2d, 0xa3, 0x4f, 0x59, 0x47, 0x92, 0x55, + 0x6e, 0xe6, 0x8d, 0x07, 0xe8, 0x7c, 0x9b, 0xc2, 0x2b, 0xd7, 0xe8, 0x91, 0x74, 0xe9, 0xf6, 0x3d, 0x78, 0xb7, 0x3d, 0x4c, 0x4c, 0x51, 0xd2, 0xb3, 0x29, 0x6d, 0xd6, 0xb4, 0xc0, 0xe1, 0xca, 0x64, + 0xc1, 0x41, 0x36, 0x32, 0xb2, 0xe7, 0x21, 0x31, 0x29, 0x19, 0x6c, 0x24, 0x51, 0xee, 0x22, 0x7e, 0x54, 0xd2, 0xbf, 0x45, 0x37, 0xfd, 0x3a, 0x6c, 0x7e, 0x1d, 0xf2, 0xda, 0xac, 0xd2, 0x9d, 0x86, + 0xef, 0xab, 0xbe, 0xfe, 0x9f, 0xa6, 0x1b, 0xeb, 0x6a, 0x7c, 0xd9, 0x04, 0xf3, 0xa4, 0x70, 0xbf, 0xab, 0xbf, 0xfc, 0x8a, 0xed, 0xf9, 0xf5, 0x01, 0x8d, 0xf4, 0x7c, 0xbd, 0xdc, 0xa6, 0x58, 0x30, + 0xdc, 0x19, 0x22, 0x1c, 0xbd, 0x72, 0x87, 0xe2, 0x7e, 0x06, 0x22, 0x89, 0x97, 0x57, 0x75, 0x39, 0xa2, 0x2b, 0x87, 0x9f, 0x3a, 0x99, 0xd8, 0xde, 0x89, 0x0d, 0xbd, 0x51, 0xad, 0x3c, 0x22, 0xe7, + 0x2d, 0xc3, 0xef, 0x03, 0x42, 0xbe, 0x21, 0xc4, 0x0b, 0x4a, 0xec, 0xbc, 0x15, 0x7b, 0xe7, 0x7c, 0xd0, 0x39, 0x91, 0x79, 0xde, 0x73, 0xb0, 0x05, 0xec, 0x9a, 0x0b, 0x0b, 0x47, 0x40, 0xb7, 0xd6, + 0x95, 0x3e, 0x49, 0xfb, 0xd3, 0x0a, 0x27, 0xf2, 0x11, 0xc7, 0xf5, 0xa6, 0x12, 0x89, 0x6d, 0xeb, 0x1a, 0x19, 0x15, 0x88, 0x4f, 0xec, 0x7a, 0xea, 0xb6, 0xe8, 0xe7, 0xdd, 0x03, 0x50, 0xf2, 0x0c, + 0x6e, 0x28, 0x74, 0xb2, 0x9a, 0x52, 0xcb, 0xed, 0x70, 0xb3, 0xdc, 0xae, 0x90, 0x2d, 0x6d, 0x93, 0xd0, 0x40, 0x5f, 0xe3, 0x5b, 0x3c, 0x1c, 0x0e, 0x67, 0xa3, 0x67, 0x4a, 0xeb, 0x71, 0xcf, 0xf9, + 0x37, 0x4d, 0xd5, 0x4c, 0x1f, 0xd4, 0x23, 0xc3, 0xec, 0x58, 0xc9, 0x39, 0x25, 0x86, 0x3c, 0x2a, 0x60, 0xf8, 0xa6, 0x73, 0xfc, 0xdb, 0xf9, 0x7b, 0x4f, 0xff, 0x92, 0x93, 0x1d, 0xfd, 0x65, 0xf3, + 0xd4, 0x4b, 0xe2, 0x23, 0x71, 0x0a, 0x42, 0xb8, 0x6a, 0xb9, 0xa4, 0xcd, 0xdf, 0xa9, 0x07, 0x70, 0x1b, 0x66, 0x79, 0x2a, 0x94, 0x75, 0x33, 0xca, 0xde, 0x16, 0x10, 0xbe, 0x79, 0xe0, 0x95, 0xd3, + 0xf1, 0xce, 0xe6, 0x32, 0x57, 0x9e, 0x85, 0xa3, 0x91, 0x8c, 0x5e, 0x09, 0xfe, 0x1f, 0xef, 0x5b, 0xe5, 0xa7, 0x7a, 0x74, 0xf6, 0x8d, 0xe2, 0x9f, 0xed, 0xce, 0xf3, 0x1d, 0xd7, 0x8e, 0xbb, 0x4f, + 0xc1, 0x36, 0xdf, 0x6f, 0xb7, 0x7f, 0x73, 0x63, 0x9c, 0x98, 0xe6, 0xf9, 0xfb, 0xd0, 0xcf, 0x8f, 0xd9, 0xe7, 0x66, 0x52, 0x9d, 0xd5, 0xce, 0x97, 0x0d, 0xfd, 0x3f, 0xfb, 0x0d, 0xaf, 0x1a, 0x2d, + 0xd7, 0x37, 0x3b, 0x66, 0x98, 0x25, 0x55, 0x47, 0x57, 0x75, 0xc7, 0x3c, 0x83, 0x0f, 0xdd, 0x9f, 0x23, 0x35, 0xb5, 0xf9, 0x8d, 0x8e, 0xe6, 0xab, 0xfa, 0xae, 0x93, 0x5d, 0x5e, 0xe7, 0x8b, 0x1e, + 0xfc, 0x94, 0x0b, 0x7d, 0xde, 0xfd, 0xfc, 0xd3, 0x0d, 0xea, 0x65, 0x92, 0x73, 0x4a, 0x53, 0xbe, 0x56, 0xa3, 0x17, 0xdf, 0xe3, 0x89, 0x5d, 0xc4, 0x4d, 0x5b, 0x10, 0x47, 0x49, 0xd6, 0xb1, 0x12, + 0x33, 0x7d, 0xb0, 0x1f, 0x90, 0x1b, 0xe4, 0x49, 0x90, 0x27, 0x8e, 0xfa, 0x3e, 0xeb, 0xfe, 0xaa, 0xc9, 0x2f, 0x49, 0xd6, 0x5f, 0x45, 0xc9, 0x4b, 0x3b, 0x95, 0x1a, 0xbc, 0x67, 0x56, 0xa2, 0xf7, + 0x52, 0x2b, 0x3f, 0xed, 0x17, 0xdc, 0x29, 0xdd, 0xcc, 0x89, 0xf2, 0xd3, 0x6e, 0xc2, 0x97, 0xfd, 0x83, 0xbf, 0x60, 0xe2, 0x9b, 0x45, 0x78, 0x5f, 0xe4, 0xfd, 0xc8, 0xb8, 0xbc, 0x2b, 0xf6, 0x06, + 0x93, 0x6f, 0xc8, 0x6d, 0x21, 0x8c, 0x3b, 0x9e, 0xc6, 0xab, 0xe6, 0x50, 0xcd, 0xf2, 0x44, 0xf5, 0x3b, 0x7a, 0x14, 0x1c, 0x01, 0xbf, 0x2f, 0x01, 0xe7, 0xcc, 0xed, 0xec, 0x5c, 0x36, 0x01, 0x7a, + 0xeb, 0xde, 0xbe, 0x41, 0x9c, 0x44, 0x76, 0x72, 0x49, 0x09, 0xfe, 0x22, 0x78, 0x27, 0xa5, 0x1c, 0x5f, 0x20, 0xf9, 0x14, 0x9b, 0x6b, 0x06, 0x85, 0x79, 0xa9, 0xc6, 0xf0, 0x69, 0x66, 0x7d, 0x44, + 0x28, 0xee, 0xa8, 0x61, 0xea, 0xbe, 0x4b, 0x15, 0xf4, 0xb5, 0xbd, 0xc1, 0x54, 0x8f, 0x82, 0x8f, 0x08, 0x99, 0x2f, 0x0f, 0xc9, 0xde, 0x87, 0x65, 0xe2, 0xf3, 0xf7, 0x67, 0xe6, 0x21, 0xeb, 0x7c, + 0xb4, 0x43, 0x6f, 0x9f, 0x66, 0x86, 0x05, 0xd5, 0x40, 0x73, 0x94, 0xf2, 0x0f, 0xf9, 0x46, 0x9a, 0x49, 0xf3, 0xf9, 0xa6, 0x6f, 0xfc, 0xb5, 0xef, 0x5a, 0xbf, 0x71, 0xd7, 0x9e, 0xce, 0xde, 0xbc, + 0xf4, 0x87, 0x63, 0xfa, 0xdf, 0xe1, 0x26, 0x93, 0xba, 0xd9, 0xd5, 0xfb, 0x5f, 0xff, 0x06, 0x23, 0xf7, 0xad, 0xfb, 0x36, 0x23, 0x7c, 0x14, 0x9b, 0xa1, 0x1e, 0xf9, 0xbe, 0xa9, 0x1f, 0x2d, 0xad, + 0x66, 0xa4, 0x3f, 0xbf, 0xe2, 0x85, 0xdc, 0x7f, 0xfb, 0xe3, 0xfb, 0x11, 0xac, 0xa3, 0x47, 0xa1, 0xe5, 0xda, 0x9d, 0x38, 0x31, 0xb3, 0xcc, 0x7d, 0xe8, 0x31, 0xa5, 0x5e, 0xca, 0x27, 0xba, 0xff, + 0x88, 0x8f, 0x01, 0xee, 0x53, 0x43, 0x87, 0x6a, 0x97, 0x59, 0xc4, 0xd8, 0x4a, 0x3e, 0x95, 0x97, 0xe6, 0xa4, 0x2e, 0xfc, 0x29, 0xb8, 0x92, 0xbd, 0x03, 0xb8, 0xd5, 0x48, 0x8a, 0x5c, 0x89, 0x08, + 0xb1, 0x90, 0x51, 0x7b, 0xe8, 0xd1, 0xa8, 0xeb, 0x0e, 0x0a, 0x23, 0x8d, 0x41, 0x44, 0xe3, 0xad, 0xd5, 0x68, 0x2d, 0xaf, 0xe6, 0x64, 0xe6, 0x1d, 0x32, 0x6f, 0x09, 0x99, 0x00, 0x37, 0xc7, 0xa0, + 0xae, 0x3e, 0xf7, 0xe7, 0xc5, 0x6c, 0x27, 0xfa, 0x51, 0x4d, 0xb1, 0x5d, 0xd8, 0x7c, 0xe6, 0xfa, 0x7f, 0x20, 0x0b, 0x77, 0xf0, 0x6b, 0x64, 0x43, 0xf7, 0xdd, 0xbb, 0x82, 0xf1, 0xfd, 0xae, 0xd1, + 0x1f, 0xf2, 0xd5, 0x3e, 0x1b, 0xf4, 0xfc, 0x1e, 0xa7, 0x12, 0x00, 0x99, 0x99, 0x9c, 0x5e, 0xa5, 0x7a, 0xc0, 0x48, 0xec, 0xa5, 0xa0, 0xf4, 0x07, 0xcf, 0xf8, 0xe0, 0xe4, 0xe7, 0x96, 0xa6, 0xe6, + 0x4c, 0x0b, 0x56, 0x8e, 0x52, 0x59, 0xca, 0x86, 0x87, 0x01, 0xec, 0x24, 0x1c, 0xe1, 0xf3, 0x6b, 0x77, 0xe9, 0xc3, 0x6b, 0x6d, 0xa8, 0xba, 0x73, 0x08, 0x36, 0x25, 0x62, 0x57, 0x57, 0xa5, 0xb1, + 0x85, 0x65, 0xa0, 0x9e, 0xea, 0x10, 0x3f, 0x07, 0xc2, 0xb2, 0x1f, 0xca, 0xee, 0xb2, 0x2b, 0x8f, 0xa8, 0x91, 0x2a, 0x48, 0xb2, 0x23, 0x99, 0xe2, 0x78, 0xea, 0xb3, 0xfd, 0xf5, 0x48, 0xdb, 0x8c, + 0x66, 0x0c, 0x87, 0x6d, 0xc7, 0x1a, 0xf3, 0x2c, 0xe8, 0xe3, 0x1b, 0xd3, 0x25, 0xab, 0xe2, 0x6b, 0xe3, 0xee, 0xac, 0xc3, 0x6e, 0xfc, 0x69, 0x9f, 0xf6, 0xa1, 0x3d, 0x25, 0xc0, 0xdf, 0xa8, 0xb9, + 0x6b, 0xc3, 0xe4, 0xfe, 0xe0, 0x9e, 0xe4, 0xbe, 0xd9, 0x31, 0x22, 0xfd, 0xc3, 0x39, 0x85, 0xdf, 0x0e, 0x00, 0xf6, 0x8d, 0xdb, 0xef, 0xcb, 0xa0, 0x14, 0xfb, 0x79, 0x72, 0xbf, 0xe5, 0x6c, 0x37, + 0x97, 0xae, 0x91, 0x39, 0xef, 0x6f, 0x77, 0x7b, 0xc7, 0xa5, 0x6c, 0x8e, 0x53, 0xc5, 0x66, 0xe2, 0xbb, 0xe1, 0xee, 0x5a, 0xcd, 0x7f, 0x11, 0xd8, 0x67, 0x59, 0x8b, 0x2f, 0x6a, 0xae, 0x3f, 0x21, + 0xa8, 0xf7, 0x8c, 0x65, 0xec, 0xe7, 0xb6, 0x1b, 0x3e, 0x53, 0x60, 0xe8, 0x4b, 0xbb, 0xe7, 0xdc, 0x7f, 0xc4, 0x87, 0xd8, 0x7f, 0x6a, 0xe8, 0xa0, 0xed, 0x76, 0xd6, 0x91, 0x7b, 0x13, 0x22, 0x19, + 0x4b, 0xc4, 0x68, 0xb6, 0xb4, 0x74, 0x21, 0xc2, 0x31, 0xdc, 0x73, 0x55, 0xa1, 0x64, 0x48, 0x08, 0xce, 0xe9, 0x51, 0x86, 0x80, 0xc6, 0x82, 0x5c, 0x87, 0x03, 0x31, 0x1a, 0xb2, 0x2b, 0x1f, 0x06, + 0xfb, 0xfc, 0xde, 0xa0, 0x67, 0x4c, 0x50, 0xca, 0xea, 0x7e, 0x2f, 0x62, 0xb8, 0xba, 0x89, 0x93, 0x54, 0x1a, 0xd6, 0x4b, 0x15, 0xed, 0x4e, 0x47, 0xf0, 0xbc, 0xca, 0x17, 0xcc, 0xe1, 0xf0, 0x4c, + 0x81, 0x7d, 0xb3, 0x9c, 0x7f, 0x79, 0x7d, 0xbf, 0x71, 0x27, 0x77, 0x1c, 0xd3, 0x8f, 0xcd, 0xe4, 0xc3, 0xe3, 0xfc, 0x73, 0xa9, 0x20, 0xee, 0xff, 0xaa, 0xbd, 0xf2, 0xfb, 0x62, 0x20, 0x5e, 0xeb, + 0xd7, 0x7f, 0xfd, 0x1b, 0x7c, 0x34, 0xc4, 0x5a, 0x3c, 0xe0, 0xeb, 0x1e, 0x13, 0x4f, 0x47, 0xbd, 0xe6, 0xae, 0xdf, 0xd8, 0x6b, 0xe2, 0x4e, 0x0f, 0x7f, 0xe4, 0x05, 0x45, 0xd0, 0x57, 0x66, 0xcd, + 0xb7, 0xe4, 0x3f, 0x64, 0xf1, 0xfd, 0x52, 0xe7, 0x4c, 0xfb, 0xb9, 0x1c, 0x02, 0x92, 0x08, 0x1c, 0xb0, 0xb1, 0x21, 0x85, 0xbd, 0x68, 0xd0, 0xdf, 0x6c, 0x34, 0xd4, 0xea, 0x15, 0xd6, 0x50, 0x28, + 0xc3, 0x6a, 0xb6, 0x22, 0x8d, 0x9c, 0xa3, 0xac, 0xcd, 0x5a, 0x9a, 0xf7, 0x60, 0xd7, 0x54, 0x99, 0x80, 0xa1, 0xa2, 0xc0, 0x23, 0x87, 0x25, 0x18, 0xf3, 0x0c, 0x93, 0x63, 0xf9, 0x08, 0xc9, 0xc7, + 0x2c, 0x2b, 0x53, 0xf4, 0xbc, 0xa7, 0x8a, 0xe3, 0x7a, 0x9d, 0x6f, 0x42, 0x29, 0xe5, 0xb0, 0x9f, 0x2f, 0xd6, 0xde, 0x4e, 0x9a, 0xee, 0xa1, 0x85, 0xbf, 0x14, 0x37, 0x7e, 0x4d, 0xf8, 0x03, 0xa7, + 0xe6, 0xb4, 0x83, 0xb7, 0x8b, 0x1d, 0x47, 0x66, 0x87, 0x52, 0x1b, 0x80, 0x8e, 0x02, 0x4d, 0x62, 0x33, 0xde, 0xce, 0x20, 0x7d, 0xa6, 0x45, 0xc0, 0x60, 0x46, 0x6c, 0xa2, 0x09, 0x39, 0x54, 0x39, + 0x5f, 0x74, 0xec, 0x03, 0xe8, 0x8c, 0x14, 0x9f, 0x58, 0xa9, 0x90, 0x36, 0xc0, 0xf0, 0x85, 0x28, 0x08, 0xa5, 0x33, 0x1d, 0x55, 0x94, 0x2f, 0xf6, 0xb4, 0x9c, 0x75, 0x55, 0x63, 0x39, 0x65, 0x99, + 0x90, 0x43, 0xd8, 0xc1, 0x76, 0x9f, 0xbb, 0x19, 0xae, 0xbd, 0xde, 0x53, 0xcd, 0x34, 0x31, 0xf5, 0xfc, 0x52, 0xbe, 0xe5, 0x76, 0xe7, 0xdf, 0xa6, 0xf9, 0xa6, 0xbc, 0xcb, 0xab, 0xcb, 0xba, 0x3f, + 0xb2, 0x3b, 0x2e, 0x53, 0xc9, 0x7b, 0x6c, 0x7b, 0x6d, 0x97, 0xc6, 0x6b, 0xc2, 0x1f, 0x6c, 0x6b, 0x4e, 0xdb, 0xee, 0xd3, 0x58, 0x76, 0x31, 0x43, 0xdc, 0x46, 0x6a, 0x5e, 0x15, 0x7e, 0x4f, 0xc7, + 0xd0, 0x4d, 0x38, 0x64, 0x28, 0x5f, 0x46, 0x95, 0x8c, 0x84, 0xd1, 0x62, 0xc6, 0x3a, 0x76, 0x86, 0xf5, 0xd7, 0xa5, 0xb3, 0xa1, 0xe7, 0xc8, 0x66, 0xc7, 0x14, 0xa1, 0x61, 0x1d, 0x06, 0x10, 0x6d, + 0x8f, 0xf6, 0x13, 0x41, 0x50, 0x53, 0x6f, 0x3e, 0x9a, 0xd7, 0x5e, 0x77, 0xbc, 0xb7, 0xcb, 0x5d, 0xa9, 0xb1, 0xdb, 0x1e, 0x04, 0xae, 0x50, 0xe5, 0x75, 0x8f, 0xc8, 0xa3, 0x29, 0x3d, 0xfc, 0x52, + 0xb9, 0x3a, 0xe2, 0xcf, 0x1b, 0x71, 0x83, 0x2a, 0xcd, 0x5c, 0x5d, 0xcd, 0x4c, 0xf5, 0x87, 0x0c, 0x07, 0xef, 0xb5, 0x7c, 0xfa, 0xbe, 0xfb, 0x6a, 0xef, 0x37, 0xe6, 0x11, 0xd7, 0xf4, 0x3f, 0x04, + 0xe3, 0xfa, 0x6a, 0xdb, 0xda, 0x04, 0xc4, 0x98, 0x44, 0x66, 0x94, 0x3c, 0x53, 0x31, 0x02, 0x29, 0x55, 0x70, 0x32, 0x10, 0x7a, 0x19, 0x38, 0x1f, 0xa3, 0x23, 0x99, 0x80, 0x96, 0xbd, 0x98, 0x45, + 0xc5, 0x0d, 0x0b, 0x73, 0x9e, 0x0e, 0x33, 0x9b, 0x4d, 0x6c, 0x4d, 0x11, 0xb6, 0xbb, 0xc0, 0x01, 0x5a, 0x26, 0x3d, 0xc7, 0x84, 0x06, 0xc4, 0x70, 0xd1, 0xdf, 0xaf, 0x78, 0x07, 0x1b, 0xe7, 0x39, + 0x30, 0xdb, 0x92, 0x87, 0x10, 0x20, 0x0c, 0x37, 0x96, 0x9f, 0x99, 0x9d, 0x4f, 0xd8, 0xda, 0x26, 0x34, 0xbd, 0x3d, 0xd0, 0xbf, 0xd5, 0xf5, 0x5a, 0x00, 0xdd, 0xb2, 0x23, 0x42, 0xc9, 0x32, 0x58, + 0x30, 0xf5, 0xc6, 0xee, 0xd5, 0xa3, 0xb4, 0x47, 0x04, 0x43, 0x63, 0x6c, 0x9b, 0x45, 0x6d, 0x9b, 0xf5, 0x08, 0x47, 0x31, 0xd6, 0x4c, 0xf0, 0x29, 0x58, 0x54, 0xfc, 0x06, 0xda, 0x71, 0xb5, 0x04, + 0x7a, 0x2e, 0x83, 0xa1, 0xde, 0xc2, 0x31, 0xba, 0x5b, 0xd9, 0xe7, 0x87, 0xdb, 0xa9, 0x58, 0x21, 0x75, 0x9c, 0xcc, 0x82, 0x48, 0xa2, 0xf6, 0x6a, 0xca, 0x0e, 0xb3, 0x2d, 0x20, 0xaa, 0x93, 0x67, + 0xfa, 0xb3, 0xbd, 0xc9, 0xfa, 0x0c, 0xe9, 0x9f, 0xed, 0x0a, 0xf6, 0xf3, 0x11, 0xea, 0xeb, 0xae, 0x60, 0x2d, 0xc6, 0x24, 0x23, 0xea, 0x97, 0x46, 0x11, 0x60, 0x73, 0xd6, 0x9c, 0x60, 0x13, 0x74, + 0x21, 0xce, 0x10, 0x85, 0x45, 0x98, 0xad, 0xcc, 0xa8, 0x87, 0x72, 0x4a, 0x2f, 0xd8, 0xbd, 0x12, 0xf0, 0x5e, 0x36, 0xa0, 0x54, 0x1c, 0x1e, 0x23, 0x0b, 0x0d, 0x3a, 0xc4, 0x2b, 0x3f, 0x1a, 0x2c, + 0x42, 0x56, 0xe8, 0x95, 0x7b, 0x2f, 0x2e, 0x43, 0x3a, 0x52, 0x23, 0x2c, 0x36, 0xfd, 0x19, 0xe5, 0xa3, 0x8b, 0xb1, 0x51, 0xa0, 0xf6, 0xe2, 0x99, 0xf0, 0x3e, 0x4b, 0x79, 0xfd, 0xaf, 0xb1, 0x51, + 0xd8, 0x3d, 0xae, 0xff, 0x17, 0xdd, 0x29, 0xec, 0x0e, 0xb3, 0x7f, 0x86, 0xcb, 0x7d, 0x67, 0xdd, 0xfd, 0xb9, 0xd7, 0x2b, 0xd6, 0xdb, 0x1d, 0xfa, 0x60, 0xe7, 0xde, 0xd5, 0xa6, 0x28, 0x77, 0x8b, + 0x7e, 0x43, 0x58, 0x73, 0x1d, 0x58, 0x60, 0xae, 0x53, 0xee, 0xe7, 0xc4, 0x0c, 0x54, 0x47, 0x05, 0x62, 0xc1, 0x36, 0xcf, 0x51, 0xbe, 0xb0, 0xca, 0xd6, 0x22, 0x17, 0xed, 0x59, 0xac, 0x9a, 0x10, + 0xd1, 0xb2, 0xb7, 0x5a, 0x45, 0x7a, 0x1e, 0xd0, 0xa9, 0xc5, 0xee, 0xbd, 0xdd, 0x26, 0xdc, 0xbb, 0x5b, 0xde, 0x09, 0xf8, 0x72, 0x09, 0x06, 0x7d, 0x6e, 0x1a, 0x93, 0x2b, 0xd3, 0xf1, 0x33, 0x74, + 0xef, 0x13, 0x7e, 0xff, 0x69, 0xac, 0xff, 0x33, 0x63, 0xeb, 0xcf, 0x1b, 0xcb, 0x7f, 0x3c, 0x7b, 0x3e, 0xaf, 0x1e, 0xdc, 0xe3, 0x18, 0xf9, 0x92, 0x36, 0x3b, 0x91, 0x6c, 0x06, 0x8c, 0xe3, 0x41, + 0x87, 0x6c, 0xa7, 0xcf, 0x0a, 0x74, 0xcc, 0xce, 0xd8, 0x3e, 0x81, 0xe5, 0xc1, 0x6e, 0x10, 0x07, 0xbb, 0xc1, 0x70, 0x5f, 0xaf, 0x26, 0xa9, 0x20, 0x41, 0xd9, 0x0c, 0x56, 0x12, 0x20, 0x37, 0xf7, + 0x53, 0xc5, 0x8a, 0x57, 0xb0, 0xa0, 0x51, 0x26, 0xc0, 0xf6, 0xed, 0xf9, 0x5a, 0x05, 0x84, 0x03, 0x1b, 0x0d, 0x39, 0x34, 0x0b, 0x1d, 0x37, 0xe0, 0x27, 0x23, 0x95, 0x09, 0xb0, 0x00, 0x2c, 0xd4, + 0x45, 0x3c, 0x06, 0x77, 0xc9, 0xa2, 0x46, 0x9e, 0xf1, 0xe5, 0x9b, 0xe0, 0x48, 0x3d, 0x4a, 0x2e, 0xab, 0x46, 0x9f, 0xdc, 0xe6, 0x4d, 0x53, 0xc7, 0x4b, 0x4f, 0x41, 0x50, 0x5f, 0x4a, 0x54, 0x3f, + 0x36, 0xf3, 0xee, 0x4e, 0x56, 0x5f, 0xf7, 0x11, 0x3f, 0xe3, 0xea, 0x5f, 0xd6, 0xd9, 0x7f, 0x90, 0x75, 0x16, 0x27, 0x6e, 0xa0, 0x3e, 0xb4, 0x10, 0x5e, 0x49, 0x1a, 0x39, 0xd3, 0x3c, 0x77, 0x2a, + 0x37, 0x50, 0x9b, 0xf4, 0x9b, 0x16, 0xbd, 0xca, 0x1c, 0xe6, 0x83, 0x41, 0x49, 0xca, 0xb1, 0xa1, 0x02, 0x36, 0x16, 0x03, 0x22, 0x57, 0x84, 0x6b, 0x68, 0x51, 0x49, 0x1b, 0x70, 0xb9, 0x32, 0xc7, + 0x4c, 0x8f, 0x07, 0x6d, 0x36, 0xe3, 0xe9, 0x85, 0x00, 0xe9, 0xd3, 0x5c, 0x42, 0x38, 0xbd, 0x3f, 0x09, 0xa5, 0x79, 0xe1, 0x78, 0x2b, 0x42, 0x1d, 0x9a, 0xfb, 0x84, 0x65, 0xc0, 0x54, 0x9b, 0x45, + 0x31, 0x34, 0x49, 0xeb, 0x00, 0xf2, 0x52, 0x75, 0x2d, 0x3f, 0x9a, 0xdb, 0xbf, 0x5f, 0xba, 0xe3, 0x24, 0x8f, 0xd5, 0xf3, 0x74, 0xf4, 0xb4, 0x62, 0xd2, 0x9c, 0xbe, 0x79, 0xe9, 0x6d, 0xbf, 0x29, + 0x54, 0xdf, 0x35, 0xd4, 0xec, 0xea, 0xbe, 0xcb, 0x95, 0x9f, 0xaf, 0xae, 0xb4, 0xe5, 0xd5, 0x65, 0x81, 0xf4, 0x7e, 0x47, 0x78, 0xcd, 0x5b, 0xd8, 0xd0, 0x6c, 0x78, 0xd5, 0x1c, 0x75, 0xe0, 0x76, + 0xfe, 0x40, 0x9d, 0xed, 0xb9, 0x69, 0xbc, 0xce, 0xf0, 0x82, 0xe3, 0xb2, 0x92, 0xdf, 0x22, 0xdb, 0x84, 0x16, 0x31, 0x57, 0x1b, 0xec, 0xe8, 0x29, 0xb5, 0xd0, 0x38, 0x7c, 0x3b, 0x64, 0x42, 0x85, + 0xd1, 0xbb, 0x10, 0x1f, 0xf9, 0x45, 0x61, 0xed, 0x76, 0xa2, 0x3e, 0x4e, 0x22, 0x50, 0x55, 0x5c, 0x5a, 0x94, 0x7d, 0x11, 0xdd, 0xdb, 0xc9, 0x76, 0x49, 0xf4, 0x88, 0x82, 0x1a, 0xea, 0xf8, 0x10, + 0x67, 0xc5, 0x54, 0xef, 0x3e, 0xb3, 0x92, 0xbf, 0x9b, 0xae, 0xde, 0xb8, 0x11, 0xf0, 0x97, 0x66, 0xa9, 0xd0, 0x5b, 0x4b, 0x3b, 0xfb, 0x84, 0xd9, 0xa7, 0x8b, 0x4f, 0x0a, 0xb3, 0xe2, 0x2f, 0x95, + 0x45, 0xf9, 0x20, 0xdb, 0xb0, 0xe8, 0xbd, 0x08, 0x2b, 0xde, 0xae, 0x2c, 0x0a, 0x73, 0xd0, 0x66, 0xc3, 0xe1, 0x2c, 0x80, 0x16, 0xd5, 0x62, 0x5b, 0xc8, 0x06, 0x17, 0x8f, 0xca, 0xa2, 0x3b, 0x5a, + 0xd7, 0x26, 0xdf, 0xdd, 0xb0, 0xbe, 0x26, 0x1c, 0xca, 0x88, 0x96, 0xf2, 0x81, 0x21, 0xf4, 0x49, 0xa5, 0x4f, 0x94, 0xdc, 0x14, 0xe0, 0x44, 0x5c, 0xa2, 0x9c, 0x68, 0xce, 0x03, 0x35, 0x57, 0x04, + 0x93, 0xba, 0x4e, 0xfb, 0x7b, 0xc7, 0xae, 0xa0, 0x61, 0x22, 0xe2, 0x1b, 0x18, 0x55, 0x2d, 0xf7, 0x77, 0xd5, 0x52, 0xcb, 0x51, 0xe1, 0xc3, 0x6d, 0xf4, 0x68, 0xf2, 0xf2, 0x0a, 0x9c, 0x67, 0xaa, + 0x0d, 0x9a, 0xe7, 0xe3, 0x66, 0x12, 0xd3, 0x02, 0xcc, 0x49, 0x60, 0x4d, 0xa6, 0xa8, 0x46, 0x0c, 0x81, 0xc5, 0xa6, 0x98, 0x53, 0x33, 0xb8, 0x48, 0x50, 0x69, 0x0f, 0xef, 0xa6, 0x60, 0xc4, 0x0e, + 0xec, 0x10, 0x99, 0x6d, 0x37, 0xfd, 0x6c, 0x3f, 0xa7, 0xc0, 0x29, 0x1a, 0x4f, 0xd4, 0x58, 0xa6, 0xb1, 0x21, 0xa5, 0x0f, 0x56, 0x6a, 0x34, 0x40, 0x97, 0x32, 0x8a, 0xa0, 0x6c, 0x0f, 0xdb, 0x54, + 0xf1, 0x02, 0xb4, 0x2c, 0x37, 0xe2, 0x82, 0x5d, 0xe6, 0x12, 0xa0, 0xa4, 0xbe, 0x3e, 0xe8, 0x7f, 0x11, 0xf9, 0xbb, 0x45, 0x0e, 0xfe, 0x5c, 0x66, 0xfc, 0x25, 0xf3, 0xff, 0x58, 0x99, 0x7f, 0x82, + 0xe7, 0xab, 0x42, 0x7f, 0x1f, 0xcf, 0x96, 0x62, 0x8f, 0x76, 0xc3, 0x70, 0x62, 0x59, 0xeb, 0x9a, 0x3a, 0xcc, 0x60, 0x46, 0x06, 0x11, 0x9d, 0xec, 0x86, 0xdd, 0x90, 0xe9, 0x72, 0xbd, 0x3a, 0x82, + 0x42, 0x77, 0x2b, 0xef, 0x0f, 0xc4, 0xa1, 0xda, 0xcb, 0x61, 0x15, 0xd1, 0xa1, 0x58, 0x55, 0xeb, 0x58, 0x90, 0x0c, 0xa5, 0x6f, 0xba, 0xac, 0xee, 0x50, 0x0c, 0x93, 0xe3, 0x30, 0x9e, 0x61, 0x65, + 0xdc, 0x55, 0x02, 0x7b, 0x65, 0xad, 0x9c, 0xb0, 0xdb, 0x67, 0xe2, 0x67, 0x9a, 0xfe, 0x4f, 0xc2, 0xf3, 0x7b, 0x4f, 0xef, 0x2b, 0x55, 0xeb, 0xce, 0x34, 0x1b, 0x24, 0x2f, 0xfe, 0xdd, 0x56, 0xd5, + 0xea, 0x76, 0xab, 0x54, 0xdf, 0x6f, 0x76, 0x98, 0xc0, 0xc6, 0x04, 0xb5, 0x54, 0x20, 0x63, 0x67, 0xf7, 0x27, 0x2b, 0x97, 0x00, 0x29, 0xd7, 0x43, 0x21, 0x68, 0xc2, 0xac, 0xa5, 0xf1, 0x1e, 0x45, + 0xe6, 0xa0, 0xb1, 0x35, 0xd7, 0xd2, 0xb2, 0x9c, 0x60, 0xf0, 0xba, 0x92, 0x0e, 0xaa, 0x3f, 0x83, 0xcd, 0x45, 0x40, 0xe3, 0x4a, 0x57, 0x96, 0xc1, 0xe9, 0xa6, 0xdb, 0x23, 0x07, 0xeb, 0x65, 0xb0, + 0xea, 0x2e, 0xe9, 0xed, 0x81, 0x78, 0xa6, 0x3d, 0x5a, 0x0c, 0x78, 0xed, 0x90, 0x2c, 0xcc, 0x30, 0xeb, 0x64, 0x6a, 0xd2, 0xa4, 0x88, 0x38, 0xee, 0xa3, 0x6a, 0x0c, 0xf8, 0x6b, 0x06, 0xe3, 0x67, + 0xea, 0x47, 0x74, 0x3f, 0x5f, 0xeb, 0xe0, 0xed, 0x8c, 0x48, 0x17, 0x44, 0x36, 0x5a, 0xb8, 0xac, 0xc1, 0xfc, 0xb0, 0x60, 0x65, 0x02, 0x98, 0x19, 0xab, 0xb1, 0x3d, 0x59, 0xf7, 0x24, 0x1e, 0x43, + 0x48, 0x80, 0xdf, 0x6f, 0xb5, 0x9d, 0x58, 0xf7, 0x50, 0x04, 0xee, 0xe5, 0xac, 0x38, 0x96, 0xf7, 0x42, 0x3e, 0x9e, 0x8c, 0x68, 0x68, 0xc4, 0x23, 0xc0, 0x1a, 0x39, 0x64, 0x5b, 0xce, 0x98, 0x08, + 0x81, 0x82, 0x19, 0x0b, 0xc2, 0xea, 0x1f, 0x52, 0x03, 0x5b, 0x6e, 0xa6, 0xc0, 0xfa, 0x27, 0x45, 0x71, 0x5b, 0x65, 0x98, 0x7d, 0xb7, 0x55, 0x04, 0xfa, 0x5a, 0x2f, 0xbf, 0xec, 0x12, 0x71, 0xde, + 0x20, 0x02, 0x6d, 0xd7, 0xbb, 0x03, 0xb1, 0x04, 0x10, 0x6b, 0x27, 0x6a, 0xf4, 0xb4, 0x16, 0xc9, 0x15, 0xc4, 0x6f, 0xa1, 0xd1, 0xde, 0x08, 0x37, 0x33, 0xc1, 0x94, 0xb2, 0x39, 0x96, 0x40, 0xfe, + 0xac, 0x5b, 0x93, 0x34, 0xad, 0x96, 0xec, 0xc6, 0xde, 0x9b, 0x2a, 0xa9, 0xf5, 0x5c, 0x17, 0x81, 0xe8, 0x6d, 0x32, 0x62, 0x92, 0x81, 0x01, 0x72, 0x07, 0x88, 0x47, 0x04, 0xbd, 0x26, 0x96, 0x30, + 0x0c, 0xb3, 0xea, 0x60, 0x27, 0xeb, 0x1a, 0xf4, 0x13, 0xb8, 0xa0, 0x37, 0xea, 0xed, 0xd0, 0x02, 0x32, 0x4b, 0x55, 0xd3, 0x8e, 0x97, 0x76, 0x92, 0x3c, 0xcc, 0xdc, 0x87, 0x65, 0xc4, 0x91, 0x97, + 0x76, 0xa7, 0xfa, 0x44, 0x1b, 0xec, 0x7c, 0xbe, 0xd2, 0x6c, 0xa8, 0xdc, 0xc2, 0xf5, 0x65, 0x89, 0x21, 0x63, 0x96, 0x79, 0x86, 0xa8, 0x80, 0xd6, 0xdd, 0xc0, 0xa8, 0xbc, 0x75, 0xbc, 0x43, 0xb2, + 0xe7, 0x97, 0x2a, 0x45, 0xf8, 0x28, 0xc4, 0xeb, 0x94, 0x98, 0x0e, 0xc6, 0x7e, 0x77, 0x0e, 0x90, 0xe9, 0x84, 0xc9, 0x55, 0x25, 0x3b, 0x6c, 0xf8, 0x72, 0x8e, 0x0c, 0xd7, 0x23, 0x72, 0x82, 0x08, + 0x74, 0x6c, 0x04, 0xc4, 0x61, 0x04, 0xf3, 0x48, 0x6f, 0x9e, 0x1a, 0xf5, 0x76, 0x4a, 0x21, 0xc6, 0x74, 0xd0, 0x72, 0xbb, 0x8d, 0xdb, 0x3d, 0x48, 0x2e, 0x3b, 0xad, 0xfe, 0xf7, 0xab, 0x1b, 0xae, + 0x6a, 0x58, 0xff, 0xfa, 0x3b, 0xfc, 0x25, 0xa5, 0xeb, 0x52, 0x18, 0xf2, 0xd7, 0xd7, 0x6a, 0x6a, 0x96, 0x9a, 0x66, 0x97, 0xa8, 0x40, 0xec, 0x0d, 0xa6, 0xee, 0xb6, 0x76, 0x12, 0xb5, 0xec, 0x68, + 0x91, 0x71, 0xb9, 0x0d, 0x79, 0x1c, 0x95, 0xf8, 0x25, 0xc8, 0xe4, 0xc8, 0xea, 0x4e, 0x94, 0x5e, 0x05, 0x99, 0x1e, 0x27, 0xde, 0x37, 0x49, 0x56, 0x51, 0x61, 0x26, 0x7e, 0xa4, 0x1a, 0x9d, 0x38, + 0x89, 0x32, 0x53, 0xbf, 0x4a, 0x4d, 0x43, 0x6e, 0xb3, 0xc7, 0xe2, 0x24, 0x0a, 0x3a, 0xba, 0xef, 0x5e, 0x22, 0x37, 0x61, 0xec, 0x73, 0x44, 0xeb, 0xfe, 0xf4, 0x08, 0xe2, 0x0d, 0xbe, 0xeb, 0x01, + 0xfe, 0x32, 0x25, 0xfc, 0x2a, 0x7b, 0xdf, 0x06, 0x4c, 0x7d, 0xef, 0x25, 0x41, 0x1a, 0x07, 0xc9, 0xdf, 0x61, 0xea, 0xf4, 0xaf, 0x8d, 0xba, 0xf8, 0x2c, 0x9f, 0x37, 0x8d, 0x6a, 0x62, 0x5f, 0x26, + 0xac, 0x8f, 0x86, 0xb9, 0x9f, 0xab, 0xe4, 0x0b, 0x51, 0xb0, 0xf3, 0x7e, 0xd8, 0x76, 0x9b, 0x03, 0x0a, 0xe8, 0xae, 0xf7, 0xa6, 0xa6, 0x0d, 0xea, 0x78, 0xd3, 0x15, 0x16, 0xc0, 0x5a, 0x25, 0x04, + 0xa4, 0xab, 0xa6, 0xa3, 0xc8, 0x36, 0x17, 0x7c, 0xad, 0x0f, 0x33, 0x7a, 0x34, 0x33, 0x62, 0x9e, 0xe3, 0x2a, 0xda, 0x86, 0x21, 0x0b, 0xc2, 0xd5, 0xe5, 0x60, 0xc5, 0x68, 0x7a, 0x7f, 0x3f, 0xb4, + 0xc0, 0xf9, 0xa6, 0x84, 0xfb, 0x1e, 0xad, 0x00, 0x7b, 0x04, 0xd4, 0xfa, 0x8c, 0x8d, 0xf6, 0x8a, 0x3c, 0x99, 0xa0, 0xe2, 0xb7, 0x85, 0x3d, 0xbf, 0xc5, 0xe7, 0x43, 0xee, 0xee, 0x9b, 0x54, 0xaf, + 0x2c, 0x3a, 0x9d, 0x69, 0x36, 0x5b, 0x64, 0x34, 0x47, 0x6d, 0x83, 0xc7, 0xca, 0xf8, 0xa0, 0xa4, 0xdd, 0x59, 0x74, 0x50, 0xd4, 0x71, 0x7f, 0x39, 0x1e, 0x8e, 0x14, 0xa9, 0xea, 0xf5, 0xd5, 0x6d, + 0xec, 0x43, 0x83, 0xc9, 0x92, 0x06, 0x06, 0x4c, 0x57, 0x1d, 0xbb, 0x95, 0x19, 0x4c, 0x1c, 0xbe, 0xdc, 0x1d, 0x44, 0x9b, 0x40, 0x1d, 0x4c, 0x82, 0x27, 0x63, 0x5b, 0x1e, 0x72, 0xb1, 0xb4, 0x9f, + 0xf7, 0x66, 0x0b, 0x3d, 0x08, 0xb6, 0xd3, 0xdc, 0x4e, 0x16, 0xde, 0xd8, 0x67, 0xb2, 0x75, 0xb1, 0x68, 0xa9, 0x20, 0xae, 0x04, 0xe5, 0x61, 0x81, 0xd9, 0x2f, 0xa2, 0x7f, 0xd5, 0x6b, 0x8f, 0x22, + 0x7f, 0x3e, 0xbd, 0x16, 0xfb, 0xef, 0xd8, 0x92, 0x36, 0x61, 0x2b, 0x59, 0x33, 0x94, 0x57, 0xb1, 0xd9, 0xf9, 0x4e, 0x50, 0x5f, 0xab, 0xe4, 0xf4, 0xe0, 0x19, 0x8d, 0x0a, 0xbf, 0xdb, 0xd2, 0xb6, + 0xb6, 0xd3, 0x46, 0xd3, 0xb1, 0x8d, 0x5e, 0xa5, 0xf2, 0x46, 0x4f, 0xe7, 0xb8, 0xca, 0xc9, 0x32, 0x39, 0xdb, 0xa3, 0x42, 0x59, 0x70, 0xfb, 0x2e, 0xc9, 0x02, 0xeb, 0x50, 0xdb, 0x99, 0x23, 0xd3, + 0x8a, 0xcd, 0xed, 0x74, 0x03, 0x24, 0x55, 0x3d, 0x18, 0xfb, 0x32, 0x21, 0x2c, 0xb3, 0xc1, 0xd8, 0x49, 0x09, 0xc1, 0x87, 0xa6, 0x3b, 0x79, 0x18, 0xeb, 0x13, 0xa0, 0x9c, 0x42, 0xe3, 0xd2, 0xe2, + 0x81, 0x01, 0x2b, 0xe3, 0x4d, 0xfd, 0x92, 0x27, 0x78, 0x19, 0x66, 0x93, 0x85, 0x90, 0x27, 0x6e, 0xe7, 0xbd, 0x8e, 0xfd, 0x37, 0x88, 0xfd, 0xbc, 0x6b, 0x3f, 0x7c, 0xca, 0x05, 0xb3, 0x7b, 0x6d, + 0x6d, 0x6b, 0x41, 0xae, 0x27, 0xf6, 0x64, 0x6d, 0xe3, 0xa6, 0x7c, 0x28, 0x16, 0xca, 0xb0, 0x5c, 0x53, 0x83, 0xc2, 0xd2, 0x54, 0x8e, 0xa4, 0x37, 0x4b, 0x07, 0xd1, 0xa7, 0x00, 0xea, 0xe1, 0x16, + 0x3f, 0xac, 0x65, 0x9e, 0x3d, 0xac, 0x99, 0x31, 0x6a, 0xac, 0x50, 0x95, 0x5c, 0xd7, 0x54, 0x85, 0x58, 0x60, 0x2e, 0x42, 0x26, 0xca, 0x10, 0xeb, 0x20, 0x32, 0x7a, 0x68, 0xb4, 0xc4, 0x31, 0x4f, + 0x12, 0xbb, 0xdc, 0x4a, 0x1a, 0x8d, 0xbe, 0xdf, 0xf5, 0xe5, 0xeb, 0x7e, 0x42, 0xf7, 0x8d, 0xaa, 0x57, 0x2a, 0xd4, 0x7d, 0xa2, 0xfd, 0x81, 0xd0, 0x7b, 0x41, 0x47, 0xb4, 0x5d, 0x75, 0x3a, 0x0b, + 0xdd, 0x8b, 0xdd, 0x48, 0xac, 0xba, 0x1e, 0x42, 0x3b, 0x8c, 0x09, 0x72, 0xdd, 0x15, 0xdb, 0x85, 0xcb, 0x69, 0x30, 0x61, 0x58, 0x56, 0x06, 0xed, 0x9e, 0x10, 0x4e, 0x66, 0xf4, 0x76, 0x88, 0x3b, + 0x69, 0x29, 0x90, 0xcc, 0x74, 0xe2, 0x41, 0x5d, 0x4e, 0xc7, 0xb9, 0xed, 0xac, 0xee, 0xea, 0xc3, 0x11, 0x00, 0x1c, 0xfc, 0xb8, 0xc7, 0x8e, 0xec, 0x9e, 0xea, 0x66, 0xab, 0x14, 0x42, 0x69, 0x69, + 0x41, 0x61, 0xcf, 0x94, 0xe2, 0xf1, 0x4d, 0x1f, 0x57, 0x55, 0x7a, 0xad, 0x4e, 0xef, 0x3b, 0xd5, 0x77, 0x2c, 0x5c, 0xcb, 0x6a, 0x5b, 0xa5, 0xf7, 0x30, 0xce, 0x23, 0x09, 0x07, 0xa6, 0xdd, 0xee, + 0xc6, 0x57, 0xa8, 0xac, 0x34, 0x0d, 0x75, 0x61, 0x11, 0xf4, 0x01, 0x91, 0x6c, 0x71, 0x75, 0x28, 0x6c, 0x45, 0xd8, 0x46, 0xf3, 0xc9, 0x5e, 0xc9, 0xad, 0x60, 0xec, 0x6a, 0x50, 0x36, 0x45, 0x32, + 0xd3, 0x9e, 0x33, 0x82, 0xa2, 0xc1, 0xf1, 0x6a, 0x66, 0x8f, 0x1c, 0x7f, 0xdf, 0xf3, 0x69, 0xc8, 0x14, 0x20, 0x1d, 0x2d, 0x99, 0x42, 0xd4, 0x83, 0xfa, 0x80, 0xfd, 0x78, 0x65, 0xb0, 0x79, 0xed, + 0x6f, 0x4b, 0x25, 0x21, 0x2f, 0xe4, 0x86, 0xbd, 0x53, 0xbd, 0x00, 0x73, 0x2e, 0x96, 0x84, 0x3c, 0xcb, 0x02, 0x6b, 0x62, 0xb6, 0x7a, 0xd9, 0x40, 0xb7, 0x25, 0x82, 0x2a, 0x5d, 0x49, 0x72, 0x4b, + 0x05, 0x71, 0x66, 0xc6, 0xd8, 0xd2, 0xb9, 0xd9, 0xce, 0xec, 0x6e, 0x04, 0x2b, 0x2c, 0x03, 0x66, 0xb1, 0xde, 0x38, 0x81, 0x39, 0xe1, 0xa9, 0x64, 0x00, 0x49, 0xc3, 0x32, 0x60, 0x41, 0x31, 0x8b, + 0xd0, 0x25, 0xb9, 0x88, 0x94, 0x49, 0x8c, 0xeb, 0xae, 0xaf, 0x68, 0x87, 0x5a, 0xc0, 0x5d, 0x69, 0x26, 0x89, 0xe9, 0x18, 0xe8, 0x9b, 0xbd, 0x67, 0x93, 0xc3, 0x6f, 0x62, 0x8a, 0x8f, 0x78, 0xf9, + 0xae, 0x06, 0x5a, 0xe9, 0x5b, 0x9a, 0xa9, 0xd9, 0xfb, 0x88, 0x71, 0x93, 0x76, 0x73, 0x7d, 0x57, 0x79, 0x09, 0x1f, 0xfe, 0x62, 0x8d, 0x7d, 0xcd, 0xa3, 0xf9, 0x5c, 0xa9, 0xd7, 0x4c, 0x6c, 0x13, + 0xf9, 0xf5, 0xb1, 0xea, 0x74, 0xdd, 0xe6, 0xea, 0x49, 0xf4, 0x91, 0x39, 0x82, 0x7d, 0x7e, 0x85, 0xd8, 0xd5, 0xaf, 0x9a, 0x91, 0x9b, 0xda, 0x14, 0xed, 0xcc, 0xb1, 0x76, 0x55, 0x9d, 0x1a, 0x86, + 0xde, 0x4d, 0x9c, 0x79, 0x68, 0x75, 0xbd, 0x62, 0x56, 0x3c, 0x7e, 0xcc, 0x45, 0xa8, 0xee, 0x27, 0xef, 0xb4, 0x8c, 0x6c, 0xf1, 0x1d, 0x03, 0x2c, 0x07, 0xc0, 0x74, 0xd7, 0xa5, 0x38, 0x25, 0x92, + 0xd8, 0xcc, 0x5f, 0x25, 0x2a, 0x97, 0x59, 0x0e, 0xbe, 0xd9, 0xba, 0xde, 0xc8, 0x53, 0xfd, 0x8d, 0xbe, 0x23, 0x53, 0x55, 0xce, 0x72, 0x35, 0x5c, 0xfe, 0xff, 0xec, 0xbd, 0x59, 0x93, 0xe2, 0xda, + 0x93, 0x27, 0xf8, 0x55, 0xae, 0xe5, 0x63, 0x6b, 0x48, 0x6d, 0x68, 0x2b, 0x9b, 0x9e, 0x69, 0x01, 0x02, 0x01, 0x42, 0x1b, 0xa0, 0xad, 0xad, 0xff, 0x66, 0x5a, 0x91, 0xd0, 0xbe, 0x23, 0x3d, 0xcc, + 0x67, 0x1f, 0x0b, 0x20, 0xf6, 0x20, 0x50, 0x70, 0xb3, 0xea, 0x56, 0x97, 0xf5, 0x53, 0xea, 0x08, 0xe5, 0x4f, 0x21, 0x77, 0x3f, 0x7e, 0xfc, 0xf8, 0xf1, 0x65, 0xd6, 0x71, 0x9b, 0x53, 0xc2, 0xfa, + 0x5b, 0x8d, 0x99, 0xad, 0x72, 0xf6, 0x34, 0x23, 0xe2, 0x52, 0x26, 0x67, 0x50, 0x3d, 0x8d, 0xf3, 0x28, 0x6c, 0x8f, 0x53, 0x85, 0x3c, 0x35, 0x2d, 0xfb, 0xd8, 0xf4, 0xbb, 0x7e, 0xc7, 0xf7, 0x44, + 0xc4, 0x7e, 0x13, 0x7f, 0x93, 0x88, 0x5f, 0x53, 0xef, 0x99, 0x6c, 0x67, 0xfc, 0xfb, 0x64, 0x2b, 0x27, 0x8a, 0xb8, 0x3b, 0x24, 0xb4, 0x51, 0xba, 0x5c, 0x0d, 0x4b, 0x87, 0x23, 0x1e, 0xed, 0x2d, + 0x09, 0x62, 0xbd, 0xe3, 0xdc, 0x37, 0x54, 0x8d, 0x8e, 0x33, 0x03, 0xa3, 0xcd, 0xed, 0x22, 0xec, 0x38, 0x1f, 0x3b, 0xd0, 0xda, 0xe4, 0x60, 0x82, 0xb5, 0xb8, 0x3a, 0x4a, 0x22, 0x9b, 0xcd, 0xe6, + 0xc7, 0x29, 0x65, 0x3a, 0xea, 0x32, 0x73, 0x04, 0x7b, 0xca, 0x6d, 0x67, 0xbb, 0x43, 0x61, 0x10, 0x65, 0x92, 0x4a, 0xc3, 0x6c, 0xb6, 0xff, 0x71, 0xdd, 0x5b, 0x9d, 0xab, 0xbd, 0x9e, 0x67, 0xca, + 0xaf, 0xd7, 0x10, 0xe7, 0x37, 0x13, 0xe1, 0x4d, 0xaf, 0xc5, 0xcf, 0xbf, 0x7c, 0xdf, 0x6b, 0xf1, 0x56, 0x3f, 0x3e, 0xf4, 0xd3, 0x43, 0x75, 0x11, 0xbc, 0x40, 0xbc, 0x7b, 0x47, 0xe1, 0x39, 0xf6, + 0xcb, 0xec, 0x1f, 0xe2, 0x4f, 0xfa, 0x8a, 0x47, 0xef, 0x37, 0x35, 0xdf, 0xf5, 0x48, 0x7c, 0x64, 0xdd, 0x7a, 0xd7, 0x23, 0x71, 0xd0, 0x62, 0x55, 0xca, 0x35, 0x1c, 0x66, 0xb6, 0x40, 0x75, 0x5c, + 0xa5, 0x9f, 0x26, 0xeb, 0x26, 0xf7, 0x76, 0xae, 0x4f, 0xad, 0x7b, 0x83, 0x69, 0x05, 0x74, 0xbb, 0xeb, 0x34, 0x98, 0xdd, 0x01, 0xe3, 0xa9, 0x39, 0xeb, 0xa7, 0x38, 0x9b, 0xed, 0x16, 0xba, 0xbf, + 0xf4, 0xc5, 0x65, 0x7f, 0xa4, 0xb4, 0x7a, 0xbd, 0x27, 0xd6, 0xfa, 0xac, 0x4d, 0x4c, 0xd7, 0xc7, 0x7c, 0x5b, 0x68, 0x8f, 0x1d, 0x2c, 0xd5, 0xab, 0x7e, 0x22, 0x0e, 0x34, 0xd5, 0xff, 0x4f, 0x8f, + 0xc4, 0x87, 0x25, 0xe7, 0xff, 0xf4, 0x4a, 0x1c, 0xd4, 0x2b, 0xf1, 0x4c, 0xc7, 0xc8, 0x6d, 0xdc, 0xa4, 0xf4, 0x2b, 0xf7, 0xdd, 0xae, 0xef, 0xa3, 0xf7, 0xe0, 0xe7, 0x65, 0xc7, 0x3e, 0x82, 0x3f, + 0xeb, 0xdf, 0x37, 0xb7, 0xce, 0xde, 0x84, 0x3b, 0x65, 0xc8, 0xe0, 0x91, 0xa8, 0x67, 0xb6, 0x91, 0x1e, 0xf0, 0x79, 0xbe, 0xd9, 0xe4, 0x0b, 0x09, 0xf0, 0x65, 0xd2, 0xa8, 0x73, 0x07, 0x73, 0x65, + 0xfb, 0xee, 0xc7, 0x9d, 0x0f, 0x69, 0x5f, 0x84, 0xfd, 0x6b, 0xfe, 0x3f, 0x12, 0x0d, 0xf7, 0x11, 0xfc, 0xf9, 0xe3, 0xde, 0xdc, 0xba, 0xa4, 0x33, 0xdc, 0xe7, 0xfb, 0x01, 0x5f, 0xd7, 0x6b, 0x35, + 0x9e, 0x6b, 0x36, 0xe4, 0x2d, 0x67, 0xa4, 0xaa, 0xb2, 0xd0, 0x31, 0xa8, 0xc6, 0x07, 0x88, 0x5e, 0x4c, 0xd2, 0x95, 0x3f, 0x0d, 0x57, 0x1b, 0x0b, 0x96, 0x63, 0xab, 0xdc, 0x32, 0x7b, 0xbe, 0x91, + 0x00, 0x63, 0x4a, 0xce, 0xf0, 0xe9, 0xde, 0x00, 0x16, 0xd5, 0x9c, 0x4c, 0x36, 0xfd, 0x56, 0xd4, 0x12, 0x3f, 0x70, 0xc5, 0xae, 0xcb, 0xf3, 0x20, 0xeb, 0x79, 0x9e, 0x49, 0xd8, 0xe3, 0xc0, 0xc2, + 0x5e, 0xdf, 0x6d, 0x36, 0x3f, 0x96, 0xf5, 0xb9, 0x43, 0xe9, 0xc2, 0x75, 0x6e, 0x97, 0xf9, 0x42, 0x1f, 0xdf, 0x66, 0x5c, 0x70, 0x9f, 0xe9, 0x7b, 0x19, 0x9d, 0x2d, 0xea, 0x01, 0x53, 0xaa, 0x37, + 0x77, 0xa6, 0x33, 0xf5, 0x0b, 0x80, 0x77, 0xc3, 0xae, 0x37, 0xa3, 0x88, 0xde, 0x68, 0xf4, 0x4e, 0xe3, 0x04, 0x99, 0xdc, 0xf0, 0x27, 0xb4, 0xcf, 0x33, 0x03, 0xda, 0xec, 0xe7, 0x88, 0xb9, 0xf0, + 0xc6, 0x8c, 0x59, 0xf9, 0xc9, 0x02, 0xf2, 0x50, 0x44, 0xe1, 0x84, 0x19, 0x1f, 0xe9, 0xe4, 0xb2, 0x5e, 0xe8, 0x28, 0x9b, 0xca, 0x02, 0xc2, 0xe1, 0x20, 0xee, 0x6d, 0x7b, 0xbe, 0xe4, 0x4c, 0x76, + 0xf9, 0x93, 0xd2, 0xc2, 0xc3, 0xfc, 0x7a, 0x65, 0x35, 0x2a, 0x4d, 0x6f, 0x98, 0x3d, 0xf9, 0xe0, 0x56, 0xff, 0x3d, 0xfe, 0x33, 0x35, 0xdf, 0xdf, 0x3d, 0x5b, 0x90, 0x43, 0xb6, 0xf7, 0xc0, 0x7a, + 0x65, 0x23, 0x4e, 0xbc, 0xe4, 0x22, 0x31, 0x8b, 0x66, 0x20, 0x3b, 0x5e, 0x53, 0x11, 0xc5, 0xd9, 0x34, 0x4b, 0x7b, 0x62, 0x25, 0xe2, 0x13, 0x9d, 0x1c, 0xd7, 0x0a, 0xa7, 0x49, 0x38, 0xd3, 0xd8, + 0x3d, 0xc5, 0xd9, 0x07, 0x14, 0xd5, 0x91, 0x1e, 0x5e, 0x2a, 0x56, 0xb4, 0xc3, 0x4f, 0x8e, 0x8e, 0x8d, 0x45, 0x4d, 0x57, 0x58, 0xa6, 0x01, 0x20, 0x35, 0xcb, 0xc9, 0x65, 0x8a, 0xf7, 0xe1, 0x8f, + 0xb3, 0x6f, 0xde, 0x18, 0x23, 0xb7, 0xce, 0x00, 0x1e, 0x94, 0xb8, 0xba, 0x08, 0x9e, 0x09, 0xf4, 0x34, 0x27, 0x90, 0x61, 0xb2, 0x66, 0x2f, 0xeb, 0x72, 0x3d, 0x59, 0x56, 0xa0, 0x0c, 0xa6, 0x4b, + 0xbc, 0x07, 0xe1, 0xa4, 0xf3, 0x5c, 0x64, 0xde, 0x2c, 0xd6, 0xca, 0x2e, 0xf5, 0x15, 0xd9, 0x6b, 0x42, 0xc1, 0x6f, 0x4e, 0x50, 0x32, 0x65, 0x54, 0xe0, 0xe4, 0x61, 0x7c, 0x3a, 0xd5, 0x8e, 0x34, + 0x6b, 0xab, 0x19, 0x85, 0xd6, 0xc2, 0x7e, 0x62, 0xfb, 0xbd, 0x6e, 0x97, 0x8d, 0x18, 0x15, 0x66, 0x46, 0x3b, 0x1a, 0x5c, 0xab, 0x80, 0xbe, 0xb8, 0xaf, 0xbe, 0x6f, 0x4b, 0xcb, 0xf8, 0x37, 0xf2, + 0xc8, 0xca, 0xf6, 0x6c, 0x6b, 0x8e, 0x9e, 0xaf, 0x46, 0x17, 0xa0, 0xfb, 0x14, 0xe8, 0x55, 0x35, 0xc0, 0xd6, 0x0b, 0xda, 0x82, 0x75, 0x03, 0xf7, 0xba, 0x22, 0x99, 0x27, 0x34, 0x3c, 0xa5, 0x61, + 0xc6, 0x60, 0xc3, 0xc5, 0x06, 0xd7, 0x6b, 0x86, 0x3b, 0x4c, 0x50, 0x29, 0xdb, 0xa2, 0xd1, 0x38, 0xe2, 0xe4, 0x0e, 0x1e, 0xab, 0xb0, 0x6d, 0xc3, 0xb8, 0x35, 0x5e, 0x2f, 0x44, 0x16, 0xec, 0x25, + 0x8a, 0x54, 0xa7, 0x5b, 0x67, 0x0b, 0xec, 0xc6, 0xf0, 0x2a, 0x64, 0x75, 0xd4, 0xcd, 0xe1, 0x74, 0xa0, 0xad, 0xf4, 0x62, 0x22, 0x3f, 0x19, 0x77, 0xd7, 0x3c, 0xf9, 0xe2, 0x6a, 0x31, 0x61, 0xef, + 0xed, 0xa0, 0x97, 0x47, 0xcf, 0x15, 0x18, 0xaf, 0xcf, 0x20, 0x37, 0x9e, 0xf9, 0x6a, 0xc7, 0xf0, 0x0e, 0xfe, 0x53, 0x2e, 0xd3, 0x4b, 0x25, 0xc2, 0x28, 0x3d, 0x1c, 0xde, 0xda, 0x58, 0xef, 0xab, + 0x83, 0x34, 0x4d, 0x70, 0x29, 0x58, 0x47, 0x7e, 0x2a, 0xe3, 0x67, 0xde, 0x72, 0x98, 0x7e, 0x61, 0xd4, 0x7d, 0xf1, 0xf7, 0xfd, 0xba, 0x6c, 0xb0, 0x89, 0x0f, 0x0f, 0x06, 0x89, 0x33, 0x8a, 0xbb, + 0x51, 0x6b, 0x5e, 0x1e, 0x20, 0x3e, 0xd6, 0xaa, 0x88, 0x82, 0x83, 0x5f, 0x3d, 0x3d, 0xf1, 0x64, 0x27, 0xba, 0xe5, 0xf3, 0x3e, 0xfd, 0x63, 0x81, 0x85, 0x20, 0x79, 0xfe, 0xb3, 0x3f, 0x96, 0xae, + 0xbb, 0x76, 0x63, 0x1f, 0xb5, 0x66, 0x91, 0xbc, 0x7e, 0xf7, 0xe7, 0x87, 0x4e, 0xdd, 0xc8, 0x74, 0x9c, 0xe2, 0x85, 0x2e, 0xef, 0xce, 0x77, 0xde, 0x6c, 0x22, 0x3e, 0xd0, 0xb5, 0x74, 0xed, 0xba, + 0x70, 0x2f, 0xdf, 0xfa, 0xd6, 0x83, 0x8d, 0x7d, 0x7c, 0xec, 0x4d, 0x19, 0x87, 0x0f, 0xbf, 0x55, 0x41, 0xd2, 0x8d, 0xa2, 0xa2, 0xbe, 0xbc, 0xe0, 0x27, 0xab, 0xdb, 0x13, 0xdb, 0x2f, 0x39, 0xb3, + 0x37, 0x27, 0xdb, 0x23, 0x5d, 0x27, 0xdf, 0x43, 0xbf, 0x99, 0x72, 0xd7, 0xfc, 0xdc, 0xf1, 0xb0, 0x2e, 0x94, 0x04, 0x65, 0x86, 0xd0, 0xea, 0xe4, 0x38, 0x02, 0x54, 0x57, 0xb4, 0x46, 0x4b, 0x98, + 0x6d, 0xaf, 0xfd, 0xa6, 0xc4, 0x1b, 0x0d, 0xd9, 0x2c, 0x3a, 0x96, 0xdd, 0x6c, 0xca, 0xd8, 0x08, 0x27, 0x34, 0x5f, 0xe4, 0xa8, 0xaf, 0xd9, 0xf0, 0x94, 0xed, 0x1b, 0x5e, 0x64, 0x05, 0xbb, 0xd9, + 0x95, 0xca, 0x86, 0x11, 0x23, 0x6c, 0x09, 0xf0, 0x3b, 0x40, 0x16, 0xc6, 0xfa, 0x7a, 0xb3, 0x70, 0x7d, 0xc1, 0xdb, 0x0e, 0xf0, 0xb7, 0x7e, 0x38, 0xed, 0xbb, 0xa1, 0x83, 0x1e, 0x5c, 0xb1, 0xde, + 0x82, 0xbf, 0x21, 0xcc, 0xf3, 0xad, 0xd1, 0x78, 0x58, 0x71, 0x2e, 0x4a, 0x51, 0x16, 0x11, 0x31, 0x45, 0x80, 0x3d, 0xac, 0x05, 0x94, 0x88, 0xa4, 0xc2, 0x8e, 0x55, 0xab, 0x55, 0x07, 0x1b, 0x42, + 0xd8, 0x3b, 0x33, 0xe1, 0xe8, 0x6c, 0x03, 0x65, 0x9b, 0xf4, 0x07, 0x88, 0xf6, 0x40, 0xb2, 0x3d, 0x38, 0x65, 0x76, 0x50, 0x4e, 0x6b, 0x2d, 0xd1, 0x27, 0x6e, 0x27, 0x92, 0xec, 0x22, 0xb1, 0xd7, + 0xd8, 0x16, 0xb4, 0xf4, 0xd5, 0x2c, 0xc7, 0x23, 0x84, 0x86, 0x74, 0x21, 0xfd, 0x98, 0xa7, 0xff, 0x9d, 0x71, 0xf5, 0x4e, 0x70, 0xbe, 0x48, 0x7b, 0x7f, 0x77, 0x5a, 0xfa, 0x24, 0xcc, 0xf0, 0x10, + 0x99, 0x1f, 0x3f, 0x10, 0xe4, 0xf5, 0xd7, 0x1f, 0xc8, 0x78, 0x67, 0xd2, 0x38, 0xfe, 0xc4, 0x8a, 0xff, 0xf7, 0xba, 0x89, 0xfb, 0xef, 0x43, 0x27, 0x53, 0x7e, 0xdb, 0x12, 0x7f, 0xd4, 0x5f, 0x96, + 0x5f, 0x45, 0x24, 0x1f, 0x5d, 0x40, 0xee, 0x0b, 0x06, 0xc1, 0xd8, 0x7d, 0x49, 0x1e, 0x96, 0xe2, 0xac, 0x50, 0xfa, 0x1d, 0xc0, 0x84, 0xa5, 0x3e, 0xb1, 0xeb, 0x2c, 0xdf, 0x74, 0xa7, 0x2d, 0xab, + 0x69, 0x05, 0x2b, 0x70, 0xb2, 0x7c, 0xda, 0x23, 0xe0, 0x2c, 0xb0, 0x15, 0x92, 0x20, 0xa9, 0x8d, 0x3c, 0x91, 0x65, 0x12, 0x60, 0x6d, 0xa4, 0x56, 0xfb, 0x7d, 0x9d, 0x09, 0xe5, 0x58, 0xdf, 0x8e, + 0x57, 0xfd, 0x24, 0x9e, 0x9c, 0x8e, 0xc7, 0xa9, 0x32, 0x39, 0xcd, 0xc0, 0x81, 0x56, 0x77, 0xe1, 0xd6, 0xe5, 0xdb, 0xf2, 0x3a, 0x43, 0xe2, 0x7e, 0xbf, 0x28, 0x6f, 0xf4, 0x15, 0x0d, 0xf1, 0xc7, + 0x4e, 0x83, 0x3e, 0x80, 0x3f, 0x51, 0xf3, 0xc3, 0xad, 0x11, 0x3e, 0xec, 0xec, 0x87, 0x58, 0x64, 0x25, 0xa8, 0xa9, 0x5d, 0x6c, 0x71, 0x21, 0x22, 0x71, 0xfa, 0x7a, 0xcc, 0xf7, 0xd9, 0x46, 0x28, + 0xf4, 0xe3, 0xc6, 0x77, 0x96, 0x27, 0xad, 0x5e, 0x36, 0x1d, 0x22, 0x4d, 0x4a, 0x8e, 0xc1, 0xa3, 0x63, 0x9d, 0x3a, 0xeb, 0xc6, 0x09, 0xd5, 0x12, 0xb4, 0xb3, 0x6e, 0xb5, 0x42, 0xa7, 0xca, 0x52, + 0xc9, 0x58, 0x48, 0x08, 0x60, 0xb6, 0x39, 0xc0, 0x69, 0x63, 0x6d, 0x7a, 0xce, 0x99, 0x4f, 0x26, 0x8f, 0x3b, 0xb1, 0xbd, 0xc8, 0xac, 0xde, 0xd4, 0xcb, 0xb9, 0x51, 0xdf, 0xfc, 0xdf, 0x23, 0xa3, + 0xc1, 0x0b, 0xa2, 0x68, 0x54, 0x98, 0xc9, 0xe1, 0x16, 0xab, 0x88, 0x47, 0x59, 0x75, 0x85, 0xbd, 0x30, 0xe9, 0x3a, 0x38, 0xb7, 0x4b, 0x1d, 0xc0, 0x9e, 0x5c, 0x48, 0xa9, 0x39, 0xe0, 0x6c, 0xf6, + 0xf1, 0x14, 0xe1, 0x6c, 0x6b, 0x3c, 0xb1, 0x94, 0x26, 0x59, 0xaf, 0x4e, 0x3b, 0xf1, 0x38, 0x8d, 0x01, 0x59, 0xce, 0xdc, 0xf1, 0x61, 0x56, 0x2f, 0x8a, 0x3e, 0xe4, 0x88, 0x98, 0x51, 0x22, 0xd0, + 0x39, 0xea, 0xdb, 0x1a, 0x11, 0x1c, 0x09, 0x11, 0x4d, 0x14, 0x42, 0xf8, 0x71, 0x9a, 0x87, 0xdb, 0x03, 0x15, 0x14, 0xf8, 0xd1, 0xe4, 0xd4, 0x15, 0xb2, 0xdf, 0x2a, 0xd9, 0xbd, 0xb8, 0xc8, 0xdb, + 0xec, 0xa9, 0xd2, 0x6b, 0x49, 0xd4, 0x67, 0x42, 0x5d, 0x4a, 0x6c, 0xfd, 0x3b, 0xf9, 0xef, 0xdf, 0x99, 0x40, 0x5f, 0xb3, 0x04, 0x7f, 0xc4, 0x17, 0xf0, 0x8a, 0x7b, 0xe6, 0xc9, 0xcb, 0x68, 0x74, + 0xc6, 0xbb, 0xcf, 0x14, 0x48, 0x38, 0xb2, 0x09, 0x6c, 0xc1, 0xc9, 0x54, 0x43, 0x5d, 0xc5, 0x8a, 0xa9, 0x49, 0xe7, 0x32, 0x6c, 0x50, 0xda, 0xa2, 0x1e, 0xb0, 0x9c, 0xe7, 0xbb, 0x01, 0xdc, 0x0a, + 0xfb, 0x3d, 0x95, 0x7b, 0x9e, 0x14, 0x86, 0x14, 0xd9, 0x32, 0x10, 0x97, 0x92, 0x4a, 0xa1, 0xe8, 0xde, 0x76, 0xb1, 0x39, 0x24, 0xdb, 0x64, 0xe6, 0x93, 0xf8, 0xec, 0xe4, 0x3a, 0x4e, 0x4d, 0x27, + 0x13, 0x6f, 0x9c, 0xb4, 0x7b, 0xa6, 0x1d, 0xa6, 0x8b, 0xbc, 0xc1, 0x8e, 0xdf, 0xf7, 0xae, 0x94, 0x2f, 0x6c, 0xd1, 0xf3, 0x6e, 0xf2, 0xcc, 0x4e, 0xe4, 0xd7, 0xbf, 0x3d, 0x5e, 0x98, 0x65, 0x98, + 0x36, 0x4c, 0x9c, 0x51, 0x7d, 0xab, 0xae, 0xe3, 0x63, 0xe1, 0x1c, 0x57, 0xcc, 0x67, 0x16, 0xd6, 0xd9, 0xd0, 0x70, 0x0e, 0x31, 0x13, 0x5a, 0xda, 0x91, 0x40, 0x3d, 0xd2, 0x24, 0xa4, 0x39, 0x92, + 0x26, 0xea, 0x93, 0xcb, 0x20, 0x9b, 0xd5, 0xba, 0x1c, 0xa0, 0xad, 0xed, 0x2a, 0x92, 0xb4, 0xd0, 0xd5, 0x13, 0xbf, 0xe4, 0x6d, 0x3b, 0x1f, 0x43, 0x74, 0xd2, 0x12, 0x93, 0xa8, 0x64, 0xb4, 0xe9, + 0xc6, 0xaa, 0x60, 0xa3, 0x02, 0x04, 0x8e, 0xc6, 0xe7, 0x39, 0x55, 0xd6, 0xcb, 0x6c, 0xa9, 0xce, 0x20, 0xa1, 0x4c, 0x96, 0xdb, 0xe8, 0x5e, 0x6c, 0xec, 0x6d, 0x8e, 0x46, 0xa9, 0x6d, 0x56, 0x4f, + 0x9b, 0x86, 0x6b, 0x1c, 0xd7, 0xe7, 0x92, 0x24, 0x66, 0xe5, 0x8f, 0xdc, 0x53, 0x50, 0x56, 0xe5, 0x1b, 0xa3, 0xe4, 0xa7, 0x7c, 0x1a, 0x34, 0xe3, 0xde, 0x6a, 0xdf, 0xaf, 0xfd, 0x42, 0x8f, 0x74, + 0x4d, 0x7a, 0x85, 0x7d, 0x62, 0xd6, 0xcb, 0xe0, 0xdc, 0x0d, 0x65, 0x40, 0x5d, 0x65, 0x27, 0xa6, 0x4a, 0x4c, 0x6c, 0x89, 0x95, 0x0d, 0x2d, 0x9a, 0x8d, 0x6e, 0x95, 0x3e, 0x8f, 0xf7, 0xb6, 0x3f, + 0xa5, 0x29, 0xf9, 0x20, 0x45, 0x7d, 0xcf, 0x18, 0x1a, 0xda, 0x74, 0x91, 0x4c, 0x2d, 0xf3, 0xb9, 0xb7, 0x25, 0x35, 0x3b, 0xb0, 0xa2, 0xbd, 0x26, 0xac, 0x3d, 0x15, 0xdf, 0x06, 0xf5, 0x0a, 0x72, + 0x61, 0xd4, 0x9d, 0xe9, 0x46, 0x6a, 0x28, 0x58, 0xeb, 0x14, 0x6e, 0x43, 0x88, 0x28, 0xdf, 0xfe, 0xbd, 0x25, 0xaa, 0xba, 0x7c, 0xf3, 0xe7, 0x82, 0x71, 0x45, 0x10, 0x17, 0xa6, 0xf7, 0xb2, 0x76, + 0xfd, 0x34, 0x53, 0xf9, 0xd1, 0xb5, 0xeb, 0xe5, 0x4f, 0xfa, 0x9a, 0x69, 0x0f, 0xb9, 0xa1, 0x2e, 0x98, 0x57, 0x8e, 0x55, 0xae, 0x33, 0x34, 0xfd, 0xb5, 0xa7, 0x53, 0x5a, 0x0a, 0x6a, 0xa7, 0x03, + 0x0a, 0x6c, 0xdb, 0x24, 0xdb, 0x16, 0x5d, 0xaf, 0x3a, 0x2c, 0x2d, 0xc1, 0x54, 0x5e, 0xe9, 0x6c, 0x5f, 0xf4, 0x47, 0x13, 0xac, 0x26, 0xb3, 0xbc, 0x30, 0x2a, 0xde, 0xdf, 0xb7, 0xa4, 0x55, 0xe1, + 0x1d, 0x29, 0x4c, 0xfa, 0x8d, 0x6a, 0x1f, 0xd5, 0x02, 0x20, 0xa3, 0x40, 0x21, 0x19, 0x0b, 0xef, 0x04, 0xbf, 0x25, 0x55, 0x83, 0x50, 0xe6, 0x06, 0x66, 0xf4, 0x3f, 0x77, 0x37, 0xa5, 0xc5, 0xc8, + 0x35, 0xed, 0x5b, 0x3d, 0xb3, 0xa1, 0xdf, 0xe8, 0x23, 0x91, 0x25, 0x57, 0xd0, 0x27, 0xa2, 0x5c, 0x2f, 0x47, 0x67, 0xa4, 0xfb, 0x54, 0x39, 0xe6, 0xba, 0xc7, 0x65, 0x44, 0x9c, 0x52, 0xcd, 0xb2, + 0x93, 0x3c, 0xb2, 0x0b, 0x55, 0xa4, 0x21, 0x68, 0x00, 0xe1, 0xc7, 0xd2, 0xd1, 0x9d, 0xba, 0x4b, 0x0c, 0x98, 0xf5, 0x94, 0x56, 0x98, 0x81, 0x00, 0x07, 0x87, 0x84, 0x84, 0xdb, 0x63, 0xc0, 0x12, + 0x73, 0x8b, 0x6a, 0xb6, 0x82, 0xda, 0x48, 0x1e, 0x5f, 0xc5, 0x5b, 0x73, 0xcc, 0x22, 0x72, 0x2a, 0xed, 0x8a, 0x42, 0x0b, 0x1a, 0x67, 0x6f, 0xc4, 0x03, 0xd7, 0x8c, 0xaf, 0x4a, 0x0c, 0xa3, 0x43, + 0xc4, 0x2a, 0x2d, 0xe2, 0x91, 0x63, 0x56, 0xdf, 0x65, 0x1a, 0x3e, 0xa0, 0xb7, 0x9f, 0x51, 0x2f, 0x54, 0xbc, 0x5c, 0x9f, 0xb3, 0x0d, 0x07, 0xe8, 0x6e, 0x66, 0xc7, 0x84, 0xd1, 0x76, 0x11, 0x60, + 0x15, 0x24, 0x6d, 0x8c, 0x3a, 0xd0, 0x52, 0x1a, 0x94, 0xf0, 0xc6, 0x4e, 0x4e, 0x36, 0x27, 0x89, 0x58, 0xe3, 0xd4, 0x87, 0x6d, 0x56, 0xd3, 0x5d, 0x80, 0x6f, 0x95, 0x45, 0x80, 0xd8, 0x91, 0x28, + 0x66, 0xc0, 0xe9, 0xc0, 0xf8, 0xf5, 0xc6, 0x64, 0xa7, 0x40, 0xbf, 0x38, 0x24, 0x28, 0xbc, 0x76, 0x10, 0x14, 0x53, 0x51, 0xcc, 0x23, 0xd8, 0x2e, 0x0c, 0xcd, 0xf6, 0x71, 0xdd, 0x6d, 0x96, 0x5d, + 0x62, 0x87, 0xc1, 0xc5, 0xf9, 0x02, 0x7d, 0x4c, 0xe3, 0xb5, 0xd3, 0xd8, 0x3a, 0xf7, 0x60, 0x7c, 0x69, 0x86, 0x78, 0x59, 0x85, 0xc9, 0xb7, 0x0f, 0xc5, 0x41, 0xec, 0x9e, 0xdd, 0x46, 0x6f, 0x4e, + 0x7a, 0x7f, 0xaa, 0x36, 0xfe, 0x9f, 0xff, 0xfe, 0xd7, 0x20, 0xcf, 0x75, 0x5a, 0xc4, 0x81, 0x73, 0x15, 0x83, 0x3f, 0xe8, 0xb0, 0x7e, 0x81, 0xbd, 0x72, 0xf4, 0x32, 0x18, 0xea, 0x9e, 0x86, 0x18, + 0x7b, 0x4b, 0xb5, 0xd3, 0x39, 0xd3, 0x73, 0x8d, 0x17, 0x84, 0x25, 0x91, 0xc6, 0x2b, 0x60, 0x1b, 0xe8, 0x2b, 0x3a, 0x98, 0x01, 0xbb, 0x7e, 0x3d, 0x16, 0xed, 0x16, 0xde, 0x47, 0xfb, 0x74, 0x91, + 0xf8, 0xfb, 0xd3, 0xcc, 0xde, 0xac, 0x8f, 0x15, 0x24, 0x12, 0x27, 0xb2, 0x65, 0x2c, 0xa8, 0xc6, 0x05, 0xb6, 0x26, 0x79, 0x8b, 0x22, 0xd5, 0x05, 0x9a, 0x9c, 0xaa, 0x68, 0x8e, 0x4d, 0x09, 0xab, + 0xb9, 0x9b, 0x85, 0x7b, 0x9b, 0xa5, 0xaf, 0x6d, 0x03, 0xbf, 0x68, 0xa6, 0xe0, 0xbb, 0xa7, 0x34, 0x70, 0x7e, 0x7d, 0x69, 0x4e, 0xa5, 0x89, 0xfd, 0x3c, 0xbd, 0x3e, 0xc8, 0xc1, 0xdb, 0xc8, 0xe5, + 0x07, 0x37, 0xf5, 0x61, 0x3a, 0xf2, 0x82, 0xf3, 0x9e, 0xbe, 0xaa, 0x93, 0xc4, 0x0e, 0xd3, 0x69, 0x5a, 0xb8, 0xa0, 0x9d, 0xc6, 0x71, 0x50, 0x3e, 0x71, 0x6f, 0x50, 0x64, 0x67, 0x5a, 0xb4, 0x66, + 0xe1, 0xdc, 0x5c, 0x27, 0xa0, 0xc7, 0x5c, 0xf0, 0xcf, 0xa8, 0x17, 0xe6, 0x5f, 0xae, 0x47, 0xd0, 0x30, 0x27, 0xbc, 0x55, 0xcb, 0x0b, 0xc8, 0xcb, 0x26, 0x95, 0xcc, 0x6e, 0x77, 0x53, 0x81, 0xde, + 0xba, 0xb8, 0x3f, 0x43, 0x30, 0xb2, 0x62, 0x6a, 0x6b, 0x9e, 0xca, 0x9c, 0x35, 0x36, 0x78, 0x1a, 0xe7, 0x4f, 0x1b, 0x85, 0xe5, 0x5b, 0xe4, 0x20, 0xd8, 0x2d, 0x9b, 0x52, 0x6d, 0x67, 0x5a, 0x51, + 0xbf, 0xe9, 0x05, 0x1a, 0xeb, 0xa9, 0x13, 0x4d, 0x71, 0xf0, 0x9a, 0x3f, 0x86, 0x20, 0x5f, 0xe1, 0x9b, 0x1d, 0x65, 0xea, 0xe9, 0x4f, 0x0e, 0x7c, 0xfe, 0x82, 0x06, 0x35, 0x17, 0xf2, 0xca, 0xdf, + 0x85, 0x6b, 0x46, 0x57, 0x1b, 0xed, 0x6b, 0x67, 0xc8, 0x43, 0xba, 0xf0, 0x15, 0xf7, 0x89, 0x7c, 0xaf, 0xa3, 0x21, 0x87, 0xd0, 0xf0, 0x68, 0x2e, 0x6d, 0xab, 0xd5, 0x76, 0xa3, 0x1c, 0xd7, 0x19, + 0x8d, 0x40, 0x69, 0xe2, 0x93, 0xe5, 0x44, 0x92, 0xe3, 0x3d, 0x1e, 0x92, 0x3f, 0x5d, 0x2e, 0xcb, 0x6f, 0xb3, 0x5b, 0x90, 0x87, 0xba, 0x27, 0x3d, 0x83, 0x9e, 0x3f, 0xed, 0x9a, 0xe1, 0x82, 0x0c, + 0xeb, 0x9e, 0x74, 0x0a, 0xf2, 0x8d, 0x24, 0x8f, 0x4f, 0xb4, 0xcb, 0xee, 0xea, 0x09, 0x55, 0xab, 0x31, 0xe0, 0xcd, 0x65, 0x7b, 0x29, 0x1c, 0xd6, 0x93, 0x4d, 0x20, 0x4c, 0x44, 0xc0, 0xd5, 0x82, + 0x6e, 0x47, 0x1c, 0xcb, 0x83, 0x32, 0xcd, 0x61, 0x2b, 0x54, 0xba, 0x43, 0x05, 0x41, 0x29, 0xbd, 0x4d, 0xdb, 0x09, 0xc1, 0x38, 0x55, 0x26, 0xb0, 0xa6, 0x29, 0x1e, 0xd6, 0x15, 0x09, 0x23, 0x22, + 0x65, 0x5a, 0xc0, 0x6c, 0xb6, 0xbe, 0x97, 0x55, 0xee, 0x9b, 0xe5, 0x32, 0x29, 0x2b, 0x33, 0x8a, 0xb6, 0xe7, 0x3e, 0x3a, 0x1f, 0x7f, 0xff, 0x50, 0xf0, 0xe5, 0xf5, 0xfe, 0x13, 0xd9, 0xfe, 0xe7, + 0x1b, 0x15, 0x62, 0x16, 0xed, 0x6b, 0x5c, 0xc4, 0xff, 0x1a, 0x26, 0x8b, 0xff, 0x22, 0x7f, 0xc3, 0xf8, 0xef, 0x6b, 0x9a, 0x01, 0xf4, 0x1b, 0x7f, 0x31, 0x02, 0xe1, 0xa1, 0x46, 0xe0, 0x87, 0x76, + 0x42, 0x37, 0x5c, 0x76, 0x8f, 0x28, 0xf8, 0xb7, 0xc8, 0x4f, 0xcc, 0x7c, 0x3b, 0x1e, 0xdc, 0x1d, 0x7d, 0x99, 0x36, 0x74, 0xbf, 0xd1, 0xc6, 0x54, 0x39, 0x27, 0xf5, 0x08, 0x23, 0xbd, 0xed, 0x54, + 0x5d, 0x61, 0x65, 0xb3, 0xe5, 0x6a, 0x33, 0xb0, 0xc4, 0x93, 0x26, 0xad, 0xe6, 0x5c, 0x3c, 0x11, 0xac, 0x5d, 0x3d, 0x2d, 0xa0, 0x8d, 0x07, 0xaf, 0x03, 0x31, 0xcd, 0x16, 0x1b, 0x8a, 0x0f, 0xe6, + 0xc7, 0x40, 0x9f, 0x4c, 0x2d, 0xcf, 0x34, 0x91, 0xb9, 0x8f, 0x5b, 0x85, 0x2b, 0xe1, 0x34, 0xaf, 0xec, 0x96, 0xd0, 0x9d, 0xd0, 0xec, 0x6f, 0x8a, 0x87, 0xdf, 0x9a, 0xc3, 0x8f, 0x53, 0xe7, 0xd3, + 0x5b, 0xde, 0x50, 0xea, 0xd3, 0x6f, 0x43, 0x42, 0xb3, 0xe1, 0xd1, 0xa2, 0xcd, 0xfb, 0x46, 0xd9, 0x13, 0xeb, 0x03, 0x7c, 0x8c, 0x9d, 0xb5, 0x3d, 0x3b, 0xe2, 0x87, 0x32, 0x5a, 0xb2, 0x87, 0xce, + 0xfe, 0xe1, 0xfc, 0xfe, 0xd8, 0x48, 0xea, 0x96, 0x70, 0xfc, 0xdc, 0x26, 0x7e, 0x87, 0x0c, 0x8e, 0xde, 0x8f, 0x87, 0xf6, 0x01, 0x97, 0x56, 0x4a, 0x0f, 0xef, 0x8e, 0xc4, 0x66, 0x0b, 0x51, 0x94, + 0xe8, 0x36, 0xfb, 0x05, 0x76, 0x6c, 0x92, 0x8a, 0xaa, 0xb6, 0xa1, 0xc6, 0x93, 0x6b, 0x78, 0xec, 0x9c, 0xa4, 0x28, 0x08, 0x57, 0xb5, 0x58, 0x8d, 0xeb, 0x19, 0xe5, 0xb3, 0x34, 0x7b, 0xe4, 0x3a, + 0x6e, 0x12, 0x70, 0x32, 0xd6, 0x33, 0x9c, 0x1b, 0x4d, 0x9c, 0x19, 0x25, 0xf1, 0x32, 0xad, 0x19, 0x7d, 0xb9, 0x3a, 0x41, 0xaa, 0x39, 0xe3, 0xa8, 0x81, 0x47, 0x91, 0x03, 0xda, 0x70, 0xfd, 0xb0, + 0x6f, 0xd6, 0xf3, 0x5c, 0xfd, 0xd1, 0x0a, 0xff, 0xb7, 0x9a, 0x68, 0xdc, 0x6c, 0x02, 0xf6, 0xe7, 0x96, 0xaa, 0xaf, 0x5f, 0x71, 0x65, 0xf8, 0xe7, 0x1f, 0x86, 0x2c, 0x60, 0xe7, 0x20, 0x6a, 0x26, + 0x76, 0x58, 0x58, 0x6f, 0x96, 0x52, 0x60, 0x64, 0x51, 0x35, 0xe5, 0x0f, 0x61, 0x1d, 0xec, 0x93, 0xae, 0x0e, 0xfb, 0xd3, 0x06, 0x94, 0x71, 0x7e, 0xb6, 0xd2, 0x50, 0x78, 0xed, 0xa2, 0x93, 0x05, + 0xcc, 0xe7, 0x98, 0x05, 0x6d, 0x11, 0xd1, 0xd7, 0x30, 0x6a, 0xbf, 0x0e, 0xa8, 0xc6, 0xc8, 0xc4, 0x99, 0xa4, 0x38, 0x79, 0x02, 0xc0, 0x4b, 0xdb, 0xa4, 0xdb, 0xa4, 0xdf, 0xed, 0xb0, 0x66, 0x7a, + 0x7c, 0xdc, 0xa0, 0xbf, 0xd3, 0x34, 0xe9, 0x56, 0x3f, 0xb6, 0x4f, 0x1c, 0xbf, 0x6f, 0x76, 0xfc, 0x13, 0xbd, 0x56, 0xbe, 0x89, 0x9f, 0x27, 0x7e, 0xc3, 0x0f, 0xc4, 0x8c, 0x5d, 0x43, 0xe7, 0xcf, + 0xe1, 0xe2, 0x67, 0x84, 0xfb, 0x0c, 0xe7, 0x5a, 0xf3, 0xd4, 0x76, 0x06, 0x81, 0x70, 0x21, 0xd1, 0x18, 0x4b, 0xbe, 0xe2, 0xf9, 0xa2, 0x6b, 0x35, 0xc8, 0xa8, 0xb9, 0x6e, 0x5b, 0x15, 0xce, 0xac, + 0x32, 0x2d, 0xd7, 0x33, 0xd6, 0xb4, 0x8e, 0x19, 0x8b, 0x95, 0xaf, 0x54, 0x07, 0xa7, 0x4f, 0xa2, 0x5a, 0x76, 0xcb, 0x13, 0x1f, 0x8b, 0x41, 0xc5, 0x40, 0x5b, 0x5a, 0x00, 0x04, 0x04, 0x2f, 0xd5, + 0x1d, 0xeb, 0xae, 0xb7, 0x4b, 0xa4, 0xdd, 0x4c, 0xee, 0xad, 0xec, 0xdf, 0xcc, 0xfe, 0x77, 0x96, 0xdd, 0x17, 0x66, 0x7d, 0x90, 0x78, 0xe7, 0xa3, 0xf6, 0x5f, 0x5f, 0x6e, 0x08, 0x82, 0xc4, 0x77, + 0x8b, 0xe0, 0xe2, 0x98, 0x7b, 0x27, 0x29, 0x77, 0xba, 0x27, 0xbc, 0xd9, 0x2c, 0xa0, 0x5f, 0x78, 0xfb, 0x82, 0x73, 0x6f, 0xab, 0x34, 0xaa, 0xab, 0xb7, 0x71, 0x04, 0x3f, 0x93, 0xb2, 0xff, 0xf6, + 0xe7, 0x04, 0x2c, 0x28, 0x4d, 0xd3, 0x1e, 0xb2, 0xc5, 0x78, 0x9f, 0x37, 0xf0, 0x95, 0x9c, 0x61, 0x0f, 0x85, 0xef, 0xbd, 0xc1, 0x7d, 0x16, 0xb7, 0xcb, 0xe8, 0x5c, 0x5f, 0x77, 0x80, 0x3d, 0x49, + 0x0b, 0xcb, 0xc3, 0x56, 0x9a, 0xba, 0x59, 0xb0, 0xd2, 0x5b, 0x11, 0xa5, 0xe5, 0x64, 0x71, 0x02, 0x30, 0x25, 0xd9, 0xd5, 0x08, 0x3b, 0xd1, 0x9d, 0xde, 0x5a, 0x88, 0x63, 0xcc, 0xe5, 0x5a, 0xb8, + 0x29, 0xd0, 0x7e, 0x82, 0x36, 0x06, 0xe7, 0x76, 0xae, 0x03, 0x97, 0x53, 0xca, 0x4f, 0x2c, 0x5b, 0xb0, 0x29, 0x70, 0x5b, 0x6c, 0xba, 0x0d, 0x26, 0x8b, 0x52, 0x11, 0x2e, 0xfa, 0xb1, 0xb9, 0xa5, + 0x8c, 0xf4, 0x71, 0x35, 0xf3, 0xb1, 0x13, 0xc8, 0x03, 0x1a, 0x64, 0xc8, 0xb6, 0xe5, 0xb5, 0xdb, 0xc9, 0x97, 0xeb, 0x00, 0xfa, 0x9b, 0x7c, 0x64, 0x21, 0xb8, 0x80, 0x5e, 0xf9, 0x60, 0x46, 0xe5, + 0xe8, 0x02, 0x74, 0x9f, 0x09, 0x05, 0x5b, 0x39, 0x34, 0x0e, 0x88, 0xb3, 0xc9, 0xf2, 0xe8, 0x32, 0x0d, 0x4d, 0xc1, 0x45, 0x96, 0xf7, 0x4c, 0x13, 0x82, 0x21, 0x0a, 0x06, 0x04, 0xe3, 0xf2, 0x52, + 0x50, 0x74, 0x81, 0x5a, 0xaf, 0x58, 0x88, 0x6d, 0x29, 0x3b, 0xeb, 0x56, 0x1b, 0xba, 0x42, 0x8e, 0x95, 0x45, 0xb7, 0x7b, 0x53, 0x76, 0xfc, 0x19, 0x80, 0x11, 0xa8, 0x36, 0x6e, 0xd4, 0x16, 0x5f, + 0xda, 0xc7, 0xb5, 0x68, 0x96, 0x01, 0xf5, 0xf8, 0x4e, 0xff, 0x1c, 0xab, 0xe3, 0x3d, 0x87, 0xce, 0x40, 0xbf, 0x91, 0x9f, 0xfb, 0x6b, 0xff, 0xc9, 0xc2, 0x7a, 0xcf, 0x7c, 0x78, 0x77, 0xf3, 0xed, + 0x37, 0xdd, 0xd8, 0xe3, 0x3f, 0xd2, 0x96, 0xff, 0x05, 0x16, 0x1c, 0xbd, 0x5e, 0x8f, 0x2e, 0x60, 0xf7, 0xf9, 0xce, 0xbb, 0x80, 0xcb, 0x8c, 0x0b, 0x08, 0x0c, 0xd4, 0x24, 0xa3, 0x4f, 0x33, 0x12, + 0x43, 0x7a, 0x94, 0x06, 0x78, 0x68, 0x52, 0x61, 0x32, 0x0f, 0x82, 0xfc, 0x71, 0xd5, 0xca, 0x0e, 0xa2, 0xcc, 0x59, 0x26, 0x2e, 0xba, 0xf6, 0xe4, 0x61, 0x4d, 0x69, 0x44, 0xfe, 0x58, 0xc6, 0xa3, + 0xe0, 0x14, 0xe1, 0x13, 0xa0, 0xed, 0x41, 0xd2, 0x01, 0x62, 0x73, 0xb7, 0xa5, 0x43, 0x1e, 0x9e, 0x2f, 0xc3, 0x25, 0xca, 0xdd, 0xe3, 0xfb, 0xbd, 0x63, 0xab, 0x07, 0x1d, 0x31, 0x7f, 0x88, 0x71, + 0xd6, 0xad, 0x23, 0x4d, 0x18, 0x7e, 0xa8, 0xc2, 0xc9, 0x05, 0xf3, 0x3a, 0x27, 0xad, 0x6e, 0x74, 0x81, 0xb9, 0xcf, 0x1a, 0xcf, 0x73, 0xe2, 0xb4, 0x3c, 0xd2, 0x24, 0x44, 0x74, 0x04, 0x10, 0xd1, + 0x30, 0xbf, 0x81, 0x8e, 0x0c, 0x47, 0xcb, 0x4a, 0xac, 0xd7, 0x11, 0x48, 0xc0, 0xd8, 0x29, 0x58, 0x72, 0xcc, 0x31, 0x45, 0xfd, 0x09, 0x27, 0xee, 0xec, 0xa0, 0x38, 0x48, 0x7c, 0xa2, 0x31, 0xd3, + 0x04, 0x3b, 0xa0, 0x71, 0x25, 0x93, 0x3b, 0x81, 0x9b, 0x2a, 0x56, 0xe8, 0xd5, 0x26, 0xcc, 0x66, 0x6e, 0x82, 0x60, 0xa0, 0x66, 0x3f, 0x7e, 0xb6, 0x72, 0x69, 0xea, 0x5a, 0x27, 0x57, 0x62, 0x7c, + 0x4e, 0x5a, 0x71, 0x82, 0xe2, 0x55, 0x73, 0xa2, 0x9f, 0xba, 0x45, 0x99, 0xaf, 0x49, 0x82, 0x5f, 0xe4, 0x5e, 0xbc, 0x69, 0xef, 0x84, 0x7d, 0xec, 0xcd, 0xf4, 0x5d, 0x42, 0x5b, 0x19, 0x99, 0xef, + 0x7a, 0x3e, 0xfd, 0x54, 0x47, 0xfc, 0xe3, 0xb2, 0xf6, 0xa1, 0x6f, 0xea, 0x77, 0x1d, 0xf6, 0x9f, 0x08, 0x43, 0xfe, 0x58, 0xfc, 0x5e, 0xda, 0xeb, 0x5f, 0x7b, 0xeb, 0x9f, 0x51, 0xee, 0x4b, 0xdf, + 0x64, 0x93, 0x79, 0x33, 0x42, 0xcc, 0x02, 0x66, 0x97, 0x4d, 0x22, 0x90, 0xc6, 0xb7, 0x63, 0x8a, 0x9c, 0x98, 0xcb, 0x15, 0xae, 0x83, 0xf4, 0x64, 0x47, 0xa1, 0xcc, 0xce, 0xb2, 0x3a, 0xc4, 0x13, + 0x21, 0xa8, 0x19, 0x33, 0x56, 0x23, 0x4e, 0x34, 0x95, 0x49, 0x4d, 0x19, 0xde, 0x4f, 0xc4, 0x75, 0x89, 0x06, 0x32, 0x86, 0x66, 0x2b, 0x9d, 0x60, 0x2a, 0x23, 0xc4, 0xd6, 0xf4, 0x74, 0x89, 0x11, + 0x01, 0xbc, 0xbf, 0xb7, 0x2a, 0xdf, 0x5b, 0x58, 0x87, 0x9c, 0x67, 0x1f, 0xd2, 0xec, 0xb6, 0x8b, 0xe5, 0x11, 0x27, 0xc2, 0x13, 0xe0, 0xd3, 0xec, 0x4d, 0x33, 0x67, 0x88, 0x6b, 0xe0, 0x7c, 0x2c, + 0x8a, 0x63, 0x16, 0x1f, 0x2d, 0x4d, 0xe7, 0xd4, 0x64, 0x16, 0x48, 0x23, 0xa6, 0xa5, 0x38, 0x51, 0xbe, 0xce, 0x15, 0x0c, 0x47, 0x8f, 0xb5, 0x9c, 0x18, 0xb0, 0x5a, 0x85, 0x78, 0x09, 0x97, 0x4b, + 0x99, 0xac, 0xf9, 0x52, 0x93, 0x09, 0xe8, 0x94, 0x2f, 0x7b, 0x25, 0x3f, 0x29, 0x1e, 0xec, 0xee, 0xf2, 0x59, 0x9d, 0xb4, 0x3b, 0x64, 0x13, 0xda, 0x3d, 0xe3, 0x9a, 0x6e, 0x3f, 0x5d, 0xef, 0x0c, + 0xbf, 0x1d, 0xb8, 0x67, 0xfe, 0x7a, 0x1f, 0xf4, 0x4f, 0xec, 0x7c, 0x7d, 0xb3, 0x70, 0x46, 0x85, 0x7b, 0x7c, 0xa9, 0x2d, 0xf2, 0x15, 0x4f, 0x1e, 0x4b, 0xec, 0x7c, 0x0f, 0x0d, 0x8e, 0x3e, 0xdc, + 0x18, 0x9a, 0xc0, 0xa9, 0x2c, 0x8d, 0x09, 0x10, 0x58, 0x33, 0xff, 0x44, 0x08, 0x96, 0x4f, 0xbb, 0x84, 0xa0, 0x54, 0x29, 0x63, 0xd5, 0xe2, 0xd8, 0x07, 0x37, 0xb5, 0xb0, 0x63, 0x57, 0xc0, 0x8a, + 0xf4, 0x41, 0x77, 0xa2, 0xa5, 0xd5, 0x4a, 0x8f, 0x20, 0x6f, 0x72, 0x90, 0x09, 0xe4, 0x34, 0x9b, 0x4f, 0xd7, 0x87, 0xa5, 0x8f, 0x20, 0xc2, 0xca, 0x58, 0x0a, 0x0a, 0x7f, 0x9a, 0x6c, 0xd4, 0xda, + 0xa7, 0x0b, 0x18, 0x2a, 0x48, 0xd6, 0xb9, 0xb7, 0xe1, 0xf9, 0x03, 0x79, 0x0e, 0x17, 0xa7, 0xc7, 0x2d, 0x11, 0xff, 0xf9, 0x12, 0xe5, 0x9b, 0xe5, 0x99, 0x86, 0xe5, 0x68, 0xe8, 0xda, 0x84, 0x38, + 0x8d, 0x00, 0x29, 0x7b, 0x5c, 0x70, 0x8f, 0x84, 0x1c, 0xaa, 0xab, 0x45, 0xe1, 0xfa, 0x47, 0xab, 0xdf, 0xd0, 0xc7, 0x79, 0x86, 0x81, 0xca, 0x5a, 0xcc, 0xb0, 0x6a, 0x97, 0xa9, 0x4b, 0x65, 0xbc, + 0x62, 0x59, 0x63, 0x0d, 0x83, 0x93, 0x93, 0x35, 0x97, 0x2b, 0x0f, 0x2c, 0x03, 0x1a, 0xd9, 0xaa, 0x3b, 0x17, 0xa2, 0x6c, 0x73, 0x16, 0x2b, 0x95, 0xae, 0xf7, 0x2a, 0xb3, 0xb4, 0x26, 0xdb, 0x71, + 0x3f, 0xf0, 0xc8, 0xf4, 0x96, 0x53, 0xe8, 0x93, 0x80, 0xdf, 0xd3, 0x26, 0xd0, 0xef, 0x61, 0x65, 0xcf, 0x9e, 0xe8, 0x62, 0x05, 0x87, 0xe0, 0xb6, 0x0f, 0xfe, 0xbd, 0x33, 0xe2, 0x07, 0x54, 0x7f, + 0xc6, 0xbd, 0x52, 0xff, 0x3a, 0x3a, 0x73, 0x61, 0x80, 0xf1, 0x56, 0x6d, 0x9b, 0xe9, 0xba, 0x9a, 0x14, 0x54, 0x14, 0xce, 0x21, 0xe6, 0x04, 0x99, 0x52, 0x20, 0x52, 0x3c, 0x20, 0x64, 0xca, 0xb8, + 0x0f, 0x90, 0x02, 0xe4, 0x5d, 0x17, 0x53, 0x42, 0x79, 0x66, 0x99, 0x79, 0x83, 0x62, 0x32, 0xa7, 0x6f, 0x7a, 0xab, 0x95, 0xbc, 0xf9, 0xd6, 0x30, 0x58, 0x28, 0x94, 0x01, 0xd9, 0xc1, 0x51, 0x08, + 0xd9, 0xaf, 0x0c, 0x24, 0x03, 0xad, 0xd5, 0x94, 0x49, 0x65, 0x54, 0xf9, 0x98, 0x48, 0xfb, 0x49, 0x7c, 0xff, 0x03, 0xd4, 0x46, 0x39, 0xf2, 0x22, 0xf3, 0x76, 0x95, 0xfd, 0x47, 0x5c, 0x64, 0xcf, + 0xa0, 0x57, 0x42, 0x3f, 0x5d, 0x0e, 0x3e, 0xd7, 0xee, 0xc2, 0xd5, 0x0e, 0x94, 0xe0, 0xf5, 0x71, 0xa7, 0xda, 0x55, 0x96, 0x1d, 0x96, 0xf4, 0xc1, 0xdb, 0x0a, 0x50, 0xb5, 0x56, 0x6a, 0x63, 0x7f, + 0xf4, 0x0f, 0x9b, 0x02, 0x26, 0xc2, 0x7c, 0x57, 0xc7, 0x9b, 0x08, 0xa7, 0xbd, 0x06, 0x65, 0x96, 0xdb, 0xc8, 0xdd, 0x13, 0xb9, 0xb1, 0xef, 0x53, 0x6d, 0x36, 0xdf, 0xd1, 0xec, 0x6e, 0x36, 0x1d, + 0xf3, 0x42, 0xba, 0x00, 0x8d, 0xd3, 0x1e, 0x65, 0x9a, 0x68, 0x23, 0xde, 0xa3, 0xf2, 0xe0, 0xad, 0xcd, 0xf7, 0x74, 0x7c, 0x75, 0x80, 0xfe, 0x51, 0x65, 0xf1, 0x8c, 0x7b, 0xa5, 0xe6, 0x75, 0x34, + 0x54, 0x79, 0x44, 0x28, 0x37, 0xad, 0xe7, 0xf8, 0xe6, 0x30, 0xe3, 0xdb, 0xdd, 0x6c, 0x1d, 0x3a, 0xfa, 0x82, 0x09, 0x7c, 0xfd, 0x58, 0x61, 0x99, 0x2c, 0x5a, 0xcc, 0x61, 0x8c, 0x17, 0x55, 0x14, + 0x27, 0x5b, 0x31, 0xda, 0x5b, 0x87, 0x78, 0x42, 0x72, 0xc2, 0xb2, 0x58, 0xaf, 0x2c, 0x5d, 0x9f, 0x4f, 0xb6, 0x56, 0x22, 0x9a, 0x2b, 0xf7, 0xb4, 0x59, 0x57, 0x81, 0x28, 0x90, 0x7e, 0xec, 0xca, + 0x47, 0xb9, 0x47, 0x76, 0x0e, 0x40, 0xff, 0xec, 0x64, 0xf1, 0x9f, 0x70, 0xf1, 0x7d, 0x6e, 0xeb, 0x7e, 0x8b, 0x29, 0x8f, 0xc9, 0xf7, 0x1b, 0xec, 0x2b, 0x63, 0xde, 0xdc, 0x19, 0xea, 0xf4, 0x0d, + 0xe7, 0x47, 0x7b, 0xcb, 0xfb, 0x49, 0xb4, 0x50, 0xe0, 0xb0, 0x4b, 0x17, 0x21, 0x21, 0x68, 0xeb, 0xad, 0xd9, 0xb2, 0xd8, 0x4a, 0xb0, 0x40, 0xae, 0xdf, 0xdb, 0x58, 0x4b, 0x4d, 0x20, 0xc4, 0x17, + 0x76, 0x02, 0xe4, 0x78, 0x73, 0xf9, 0x68, 0xb1, 0xd2, 0xba, 0x39, 0xc0, 0x0e, 0x6e, 0x7b, 0x28, 0x6b, 0xb9, 0xfb, 0xb8, 0xda, 0x53, 0x8a, 0x65, 0x29, 0x68, 0xde, 0x1b, 0xc8, 0xce, 0xf5, 0x29, + 0x42, 0x1d, 0x18, 0xe5, 0xff, 0x95, 0xcb, 0xfe, 0xe7, 0xdb, 0xfe, 0x7f, 0x8a, 0xbb, 0xcf, 0xf1, 0x07, 0x7f, 0x90, 0xa9, 0x67, 0xc8, 0x27, 0x5e, 0x9e, 0x2f, 0x86, 0xb2, 0x50, 0x9a, 0x73, 0x0a, + 0x54, 0x99, 0xaa, 0x24, 0x18, 0x55, 0xb3, 0x94, 0x97, 0xb4, 0x33, 0x99, 0xfa, 0x6e, 0x19, 0xa7, 0x07, 0xa3, 0xa8, 0x6a, 0xad, 0x51, 0xd4, 0x72, 0xce, 0x1a, 0xbb, 0x10, 0xd9, 0xee, 0x01, 0x33, + 0x29, 0xb3, 0xdc, 0x40, 0x9a, 0x4d, 0x92, 0x72, 0x07, 0x62, 0xc9, 0xc0, 0xc0, 0x3e, 0x84, 0x71, 0x1e, 0xa6, 0x68, 0x31, 0xb0, 0xe1, 0x49, 0x3d, 0x27, 0xad, 0x29, 0x69, 0x23, 0x31, 0x76, 0x6f, + 0xe3, 0xf8, 0x27, 0x14, 0x56, 0x5a, 0x56, 0xae, 0x33, 0x3a, 0x04, 0x4f, 0x06, 0xac, 0x97, 0xde, 0xd4, 0xff, 0x0f, 0x19, 0x8c, 0xef, 0xb1, 0x9f, 0x68, 0xfa, 0xfe, 0xce, 0xd0, 0x08, 0xd5, 0xb0, + 0x9b, 0xd6, 0x8c, 0xa0, 0x1e, 0x57, 0xb9, 0x51, 0xcf, 0x2c, 0x99, 0xed, 0x39, 0x52, 0xa1, 0x50, 0xbe, 0x97, 0xfc, 0x76, 0x39, 0x21, 0xe0, 0x74, 0xae, 0x6e, 0xbb, 0x5e, 0x49, 0x81, 0xb5, 0x68, + 0x2c, 0x81, 0x2c, 0x91, 0x44, 0xf1, 0x54, 0xdb, 0x4e, 0x58, 0x08, 0x46, 0x13, 0x72, 0x72, 0x52, 0x78, 0xd8, 0x5e, 0x2e, 0xa5, 0x0d, 0xb0, 0x5c, 0x41, 0xd4, 0xac, 0x45, 0x28, 0x5b, 0xa6, 0xb9, + 0xe5, 0x3d, 0x93, 0xf1, 0x9b, 0x08, 0xd5, 0xa2, 0xfe, 0xd0, 0xa3, 0xf9, 0x6f, 0xed, 0x81, 0xbf, 0x61, 0x4e, 0x55, 0x65, 0xa3, 0x73, 0x9a, 0xdf, 0xad, 0xd5, 0x04, 0x79, 0x4c, 0xc6, 0x5f, 0x71, + 0x9f, 0x98, 0xf2, 0x3a, 0x3a, 0x27, 0xb4, 0x0f, 0x60, 0xc8, 0xbc, 0x6a, 0x8b, 0x05, 0xe8, 0xd6, 0x93, 0xde, 0x64, 0x8e, 0xba, 0x2b, 0xe7, 0xc2, 0x21, 0xea, 0x88, 0x05, 0x94, 0x37, 0x41, 0xa0, + 0xa5, 0x2b, 0x35, 0x69, 0x18, 0x16, 0x31, 0xe0, 0x2c, 0x9a, 0x38, 0xda, 0xc1, 0xea, 0x8e, 0x0d, 0x3a, 0xce, 0xd8, 0xdd, 0xd6, 0xa2, 0xfa, 0xd4, 0x65, 0x37, 0xdd, 0xac, 0x43, 0x51, 0x60, 0xa6, + 0x76, 0x98, 0x5a, 0x51, 0x6a, 0x0a, 0xec, 0xf6, 0x72, 0x25, 0xe8, 0xdb, 0x81, 0x0a, 0xcb, 0x71, 0xcf, 0x7b, 0xcd, 0x5f, 0x9f, 0xda, 0x23, 0xbf, 0x3b, 0x7b, 0xf8, 0x78, 0xc0, 0x50, 0xba, 0x55, + 0x56, 0xa4, 0x55, 0x5a, 0x75, 0x99, 0x9b, 0x7a, 0xbf, 0x3e, 0x95, 0x8e, 0x3a, 0xb7, 0xf0, 0x34, 0xab, 0xba, 0x74, 0x5f, 0xfe, 0xff, 0x3b, 0x5f, 0x49, 0x95, 0x06, 0x8e, 0x9b, 0x54, 0x81, 0x77, + 0xed, 0x85, 0x08, 0x3f, 0xe6, 0xa5, 0x86, 0x7e, 0x0f, 0x99, 0x94, 0x81, 0x9d, 0x26, 0xcd, 0x28, 0x0a, 0xaa, 0x5b, 0x5e, 0x89, 0x27, 0x2b, 0x1a, 0xf9, 0x79, 0xe0, 0xf1, 0x2b, 0x2e, 0x38, 0x7a, + 0x33, 0x18, 0x5d, 0xe0, 0xee, 0xb3, 0xbd, 0x41, 0x37, 0x5a, 0x62, 0xd0, 0x76, 0x93, 0x74, 0x6d, 0xb8, 0xdb, 0x33, 0x46, 0x1a, 0x2f, 0x69, 0xbb, 0x8a, 0x5c, 0x42, 0xd6, 0x34, 0xd7, 0x75, 0x04, + 0x19, 0x85, 0xdb, 0x36, 0x22, 0x94, 0xa8, 0x4b, 0x35, 0x61, 0x2c, 0x05, 0x94, 0x59, 0x34, 0x5b, 0x37, 0xe1, 0x25, 0x35, 0x71, 0xe1, 0x9d, 0x2d, 0xb7, 0xfe, 0x94, 0x83, 0xd9, 0x96, 0x5b, 0x22, + 0xb0, 0xc5, 0xe4, 0x4e, 0x76, 0x24, 0xc1, 0x62, 0xe0, 0x16, 0xbb, 0x34, 0x3d, 0xb7, 0x18, 0x59, 0xb5, 0xe7, 0x3d, 0x37, 0xa3, 0xfc, 0xeb, 0xdc, 0xca, 0xe7, 0xaf, 0xff, 0xfb, 0xaf, 0x2f, 0xf6, + 0xd9, 0x77, 0xeb, 0xb5, 0x0e, 0xac, 0x19, 0x1c, 0xb8, 0xae, 0x4b, 0x60, 0xe3, 0x9b, 0x2b, 0xcc, 0x23, 0xe9, 0x81, 0x57, 0xcc, 0x27, 0x16, 0x5c, 0xae, 0xce, 0x95, 0xc7, 0x86, 0x78, 0x38, 0xec, + 0x2e, 0xf7, 0x67, 0x8d, 0x06, 0x4f, 0xc7, 0x78, 0xa4, 0x19, 0xb6, 0x92, 0x4f, 0xb3, 0x35, 0x30, 0xaf, 0x36, 0xb2, 0xa4, 0x38, 0xcb, 0x0d, 0x8f, 0x83, 0x33, 0x0f, 0x3b, 0x96, 0x48, 0x9f, 0xd6, + 0xfb, 0x32, 0x5f, 0x10, 0x4b, 0xbc, 0x9c, 0x9f, 0x82, 0x6a, 0x39, 0x05, 0x88, 0xb5, 0xbe, 0x46, 0xa8, 0xb5, 0xa3, 0x09, 0x1c, 0xeb, 0xd4, 0x54, 0xcf, 0x8d, 0xcb, 0x79, 0x92, 0x2a, 0x52, 0x92, + 0x9b, 0xef, 0xc8, 0xff, 0xba, 0x60, 0xbf, 0x86, 0xef, 0xbc, 0x12, 0xf0, 0xbb, 0x22, 0x29, 0xc3, 0x16, 0x76, 0xcf, 0x2d, 0xd2, 0xf2, 0xc5, 0x4f, 0xf7, 0x86, 0x61, 0x37, 0x5e, 0x93, 0x99, 0x55, + 0xe1, 0xa6, 0xc9, 0xb7, 0xef, 0x69, 0xdb, 0xf6, 0xf7, 0xf5, 0xb9, 0xf3, 0xcb, 0x7e, 0xfa, 0x0e, 0x3b, 0x4d, 0xca, 0x3a, 0xaa, 0x9e, 0x3e, 0xfb, 0xbb, 0xd7, 0x5c, 0x60, 0xcf, 0x0c, 0xbc, 0xb6, + 0xc1, 0x7a, 0xf3, 0x8a, 0xeb, 0xd5, 0xff, 0xfa, 0x46, 0x90, 0xbe, 0x73, 0x32, 0x8e, 0x1f, 0x2a, 0x50, 0xf2, 0xd1, 0xc9, 0x38, 0xbe, 0x5f, 0x8c, 0xe4, 0x49, 0x8a, 0xec, 0x6e, 0x3e, 0x5b, 0x17, + 0xb9, 0x0d, 0xea, 0x8e, 0xad, 0xce, 0x93, 0x60, 0xe5, 0xf7, 0xcb, 0x31, 0x02, 0xd0, 0xfd, 0x16, 0x38, 0xf0, 0x6d, 0xbc, 0xef, 0x85, 0xed, 0xdc, 0x96, 0xa7, 0x92, 0xde, 0x76, 0xdb, 0x7a, 0x32, + 0x99, 0x74, 0xe0, 0xfa, 0x58, 0x9f, 0x54, 0xce, 0x00, 0xe7, 0x2c, 0xc3, 0xe2, 0x9b, 0x34, 0x87, 0xf9, 0xa0, 0xdf, 0x08, 0x13, 0xb5, 0xdb, 0xd9, 0x0d, 0x29, 0x8c, 0x05, 0x63, 0xb9, 0xf9, 0x9b, + 0x96, 0xca, 0x20, 0x27, 0xe3, 0xf5, 0x33, 0xad, 0x6e, 0xe4, 0xb8, 0x9e, 0x59, 0x47, 0x7f, 0xb6, 0xa2, 0xe4, 0x27, 0xf4, 0x57, 0xc2, 0xbe, 0xde, 0x1b, 0xe2, 0x8b, 0x84, 0x47, 0xdb, 0x4d, 0x56, + 0xd9, 0x8d, 0xb5, 0x48, 0x71, 0x92, 0xce, 0x4d, 0x78, 0x8d, 0xa5, 0x4e, 0x31, 0x1e, 0x07, 0xee, 0xba, 0x0d, 0x7f, 0x18, 0xa6, 0x14, 0xc4, 0x4f, 0x82, 0x36, 0xf2, 0x0a, 0xb7, 0xbc, 0x15, 0x68, + 0xf9, 0x58, 0xa1, 0xed, 0xb7, 0xc0, 0x4f, 0x1f, 0xfa, 0x66, 0x38, 0xb4, 0xe8, 0x76, 0xe3, 0xea, 0xba, 0x2f, 0x99, 0xc0, 0x0c, 0x96, 0x26, 0xeb, 0x3e, 0x69, 0xfc, 0x3d, 0x7b, 0xb2, 0x48, 0xcf, + 0x3c, 0x45, 0x45, 0xbb, 0x4f, 0x4e, 0xa5, 0x3b, 0xa3, 0x2d, 0x3a, 0x1b, 0x63, 0x04, 0x03, 0xb5, 0x1c, 0x1f, 0xa4, 0x88, 0x25, 0x6c, 0xd7, 0xc9, 0x51, 0x9f, 0xf9, 0x9b, 0x23, 0xa0, 0x07, 0x74, + 0x8e, 0xc3, 0xa7, 0x62, 0xb3, 0xf0, 0xa5, 0x90, 0x0a, 0x34, 0x25, 0xc4, 0xe6, 0xfd, 0x41, 0xda, 0xdc, 0x73, 0x56, 0xdf, 0x5e, 0x1f, 0xae, 0xe7, 0xdf, 0x17, 0xca, 0xfd, 0xfa, 0x32, 0x74, 0xe1, + 0x4a, 0x9b, 0x73, 0x05, 0xa9, 0x5f, 0xff, 0xf6, 0x70, 0xe6, 0xd0, 0x1f, 0xec, 0x03, 0xfa, 0xc3, 0xd3, 0x8b, 0x20, 0xae, 0x8b, 0xb8, 0x2e, 0x7c, 0xf3, 0xa6, 0x34, 0x40, 0xef, 0xce, 0x71, 0x86, + 0x4b, 0xc3, 0x0b, 0xee, 0x59, 0x18, 0x5e, 0x46, 0xa3, 0x33, 0xde, 0x3d, 0x79, 0x0f, 0xfd, 0x00, 0x2b, 0x8b, 0x30, 0x4d, 0x8f, 0xc1, 0x49, 0xb4, 0x77, 0x84, 0x89, 0xc0, 0x9a, 0xd5, 0x6d, 0xf6, + 0x7b, 0x20, 0xfd, 0x5b, 0x5a, 0x01, 0xfa, 0x4d, 0xfe, 0x86, 0xa9, 0x21, 0x74, 0x79, 0x12, 0x89, 0x6a, 0xf4, 0x6d, 0x9d, 0xa4, 0xc7, 0x5c, 0x58, 0xef, 0x90, 0x9f, 0x68, 0xf3, 0x76, 0x3c, 0xd8, + 0x99, 0xe5, 0xcc, 0x66, 0x46, 0x3d, 0xa6, 0x11, 0xa1, 0x5b, 0xae, 0x09, 0xae, 0x00, 0x91, 0x7e, 0x01, 0xb4, 0xd8, 0x31, 0xb6, 0xea, 0x10, 0x9e, 0x29, 0x93, 0x84, 0x69, 0x65, 0x46, 0x6a, 0x26, + 0x7d, 0x99, 0x4d, 0x56, 0xe1, 0x94, 0xb1, 0x64, 0x93, 0x5c, 0x9c, 0xf6, 0x70, 0x74, 0xf0, 0x75, 0xdb, 0x5c, 0xac, 0xa6, 0x89, 0xac, 0x06, 0xd6, 0x71, 0xa6, 0x45, 0x39, 0x41, 0x50, 0x1a, 0x0c, + 0x76, 0xd8, 0xe9, 0x6e, 0xc2, 0xd6, 0x1f, 0xd8, 0x1b, 0xbe, 0x09, 0xf5, 0xb9, 0xa5, 0x67, 0x1f, 0x58, 0xb5, 0xae, 0xa0, 0x67, 0x62, 0x5e, 0x2e, 0xcf, 0x5a, 0xf5, 0x6e, 0x19, 0xad, 0xad, 0x05, + 0x1f, 0x37, 0x8e, 0x27, 0x71, 0x52, 0xbb, 0x6a, 0x56, 0xcc, 0x9a, 0x61, 0x55, 0xfc, 0xa0, 0xaa, 0xb0, 0xe5, 0x7d, 0xad, 0x55, 0x07, 0xe8, 0x8c, 0xdb, 0x51, 0x47, 0x6d, 0x61, 0x66, 0xd9, 0xf9, + 0xdd, 0x43, 0xaa, 0x02, 0xbc, 0xd9, 0x79, 0xdc, 0xda, 0xa4, 0x3d, 0x30, 0x29, 0xaf, 0xa0, 0x67, 0x42, 0x5d, 0x2e, 0xcf, 0xdb, 0xb3, 0x01, 0x76, 0x7a, 0x08, 0x36, 0x0b, 0x53, 0x1b, 0x83, 0x7a, + 0x64, 0xa2, 0x6a, 0xdf, 0x6d, 0xa6, 0xcd, 0x4e, 0x12, 0x34, 0xdd, 0x5d, 0xb2, 0x4d, 0x2e, 0xac, 0xab, 0x24, 0x9f, 0x38, 0x75, 0xbf, 0x63, 0xb3, 0x3e, 0x93, 0x8c, 0x9e, 0x2e, 0xc3, 0xf5, 0xc6, + 0x37, 0x90, 0x35, 0xc0, 0x24, 0x93, 0x60, 0xbb, 0xa1, 0xfa, 0xc5, 0x36, 0x5d, 0xce, 0xdd, 0x4d, 0xa6, 0xad, 0x4f, 0xe6, 0xd8, 0xd1, 0x5d, 0x63, 0x29, 0xe5, 0x6e, 0xfb, 0x7d, 0xa1, 0xde, 0xa7, + 0x3f, 0xa3, 0x48, 0xcc, 0x68, 0x54, 0x46, 0xe9, 0x77, 0x02, 0xf3, 0x73, 0xd7, 0xe7, 0x3b, 0xe4, 0x33, 0x31, 0xde, 0x8c, 0x87, 0xba, 0x3f, 0x05, 0x68, 0x36, 0x81, 0x57, 0x53, 0xb0, 0x14, 0x3b, + 0x23, 0x22, 0xec, 0x65, 0x4a, 0x90, 0x09, 0xe6, 0xc8, 0x84, 0xbb, 0xdf, 0xb6, 0x6d, 0xa6, 0x8b, 0x81, 0x26, 0xfb, 0xbb, 0x9e, 0x3f, 0x19, 0x0a, 0xbd, 0xd9, 0xd7, 0x13, 0xb2, 0x89, 0x12, 0x79, + 0xde, 0x71, 0x27, 0xa7, 0x50, 0x76, 0x69, 0x58, 0xe2, 0x9a, 0xc8, 0x29, 0xc9, 0xdc, 0xb3, 0x7a, 0x53, 0x71, 0x30, 0x95, 0x3b, 0xfa, 0x87, 0x03, 0xd0, 0x3c, 0xee, 0x41, 0xf8, 0xfa, 0xbc, 0xf0, + 0x9d, 0x04, 0xde, 0x8c, 0xb1, 0x2d, 0x03, 0xc7, 0x1d, 0xd9, 0xbe, 0x99, 0x24, 0x6e, 0xf4, 0xeb, 0xdf, 0x3e, 0x95, 0x60, 0x18, 0xaa, 0x00, 0xfe, 0x1a, 0x56, 0xb7, 0x21, 0xc8, 0x4c, 0xc7, 0x29, + 0x7e, 0x1f, 0x6f, 0xbb, 0xb3, 0xa9, 0x47, 0x8c, 0xad, 0x67, 0xd4, 0x27, 0x7e, 0x3e, 0x5f, 0x8f, 0xce, 0x58, 0xf7, 0x79, 0x09, 0xad, 0x97, 0x20, 0x0e, 0x11, 0xa7, 0xf4, 0xb4, 0xdd, 0xa5, 0x2c, + 0xb1, 0x38, 0xf2, 0xf0, 0xdc, 0xdb, 0x5a, 0x5c, 0xba, 0x87, 0x00, 0xab, 0xda, 0x05, 0xf6, 0xb1, 0x94, 0xb6, 0xaa, 0x14, 0xf9, 0xa0, 0x6f, 0x74, 0x21, 0x4f, 0xae, 0xb3, 0x78, 0xe3, 0x11, 0xb5, + 0xde, 0x8a, 0x2a, 0x2a, 0x03, 0x66, 0x68, 0xe0, 0x32, 0xd8, 0xc2, 0xa4, 0x11, 0x69, 0x5b, 0x76, 0xa2, 0x6b, 0x81, 0xbe, 0x17, 0x05, 0xf4, 0xf0, 0x33, 0x57, 0xf6, 0x20, 0xf7, 0x4d, 0x50, 0x14, + 0xee, 0xa1, 0x8e, 0xcc, 0x62, 0x94, 0x45, 0x75, 0x71, 0x3b, 0xf0, 0xec, 0x41, 0x13, 0xee, 0x23, 0xfa, 0x13, 0x2d, 0x3f, 0xde, 0x1b, 0x6a, 0xcc, 0x6d, 0x94, 0x09, 0xb7, 0xde, 0xef, 0xcc, 0xe4, + 0xb0, 0x41, 0x19, 0x4f, 0x16, 0xe7, 0xb2, 0xe0, 0xc7, 0xaa, 0x24, 0xad, 0xe5, 0x59, 0x59, 0x1c, 0x96, 0x24, 0xba, 0x22, 0x17, 0x5b, 0xf4, 0xa8, 0x75, 0x80, 0xd0, 0xea, 0x79, 0x20, 0x23, 0xa0, + 0x99, 0xaa, 0x89, 0xa3, 0x4b, 0xd8, 0x18, 0xc6, 0x8f, 0x1c, 0x83, 0xd6, 0xe6, 0xe2, 0xc0, 0xb1, 0x44, 0x62, 0xc7, 0x2e, 0xaa, 0x51, 0x1d, 0x44, 0x1d, 0x0c, 0xf4, 0x3f, 0x62, 0x89, 0x2a, 0x47, + 0x66, 0x71, 0xa8, 0xbf, 0xeb, 0x82, 0x0b, 0x3f, 0xa6, 0x7d, 0xdf, 0x00, 0x3f, 0x11, 0xf6, 0xcd, 0xf0, 0xac, 0x73, 0x06, 0x68, 0xe1, 0x93, 0xe8, 0x43, 0x72, 0x5c, 0x91, 0x3c, 0x83, 0x63, 0x25, + 0xdf, 0x37, 0xdd, 0x3e, 0x56, 0x0f, 0x4b, 0xb8, 0xea, 0xd1, 0x78, 0x9d, 0x13, 0xe3, 0x68, 0x41, 0x43, 0x31, 0x47, 0x72, 0xba, 0x61, 0xa7, 0xcb, 0x7e, 0x2d, 0xf4, 0x33, 0x1f, 0x67, 0xe3, 0x42, + 0x8f, 0x51, 0x07, 0x26, 0x43, 0x1c, 0x4a, 0x58, 0xb7, 0x98, 0x92, 0x34, 0xb5, 0x8e, 0xc9, 0x50, 0xaf, 0x49, 0xa2, 0xf7, 0xb6, 0xf3, 0x84, 0x7b, 0xf8, 0xc8, 0xe5, 0x0e, 0x0d, 0x0b, 0xb3, 0x0b, + 0xbe, 0xb1, 0x2a, 0x1f, 0xf2, 0x73, 0xbc, 0xe2, 0x3e, 0x53, 0xf0, 0x32, 0x3a, 0x67, 0xc3, 0x0d, 0x98, 0xe8, 0x7d, 0x0f, 0xe1, 0x5b, 0xb2, 0x82, 0xd2, 0x3e, 0x9d, 0x69, 0x9b, 0x05, 0x50, 0x5b, + 0x2e, 0x82, 0xf7, 0xee, 0x74, 0xc7, 0x6b, 0xf6, 0x7a, 0x29, 0xae, 0x8c, 0x55, 0x40, 0xfa, 0x93, 0x62, 0x3e, 0x0e, 0x9c, 0x29, 0x17, 0x97, 0xe3, 0xe9, 0x82, 0x92, 0xaa, 0x35, 0x91, 0x4f, 0x22, + 0xd8, 0x4a, 0x03, 0x4c, 0x98, 0xf5, 0xf3, 0xec, 0x58, 0xb6, 0x16, 0xb6, 0x12, 0x63, 0x76, 0x6a, 0x6d, 0xb2, 0xa3, 0xa9, 0xf7, 0xdf, 0xd7, 0x85, 0x0a, 0x9e, 0xcf, 0x83, 0xff, 0xb4, 0x30, 0x5d, + 0x50, 0x2f, 0x74, 0xb8, 0x5c, 0x0f, 0x15, 0xa3, 0x7e, 0x42, 0x4d, 0x8b, 0x7a, 0x63, 0xc6, 0xc7, 0x2e, 0x26, 0xe1, 0x00, 0x59, 0x19, 0xe8, 0x7e, 0x93, 0x60, 0x63, 0x71, 0xbd, 0x28, 0xa5, 0xbe, + 0x5c, 0xb9, 0x29, 0x7e, 0x6a, 0x78, 0x94, 0x5d, 0xad, 0xc6, 0x53, 0xba, 0x94, 0xf8, 0x09, 0x1e, 0xc8, 0x75, 0x95, 0x21, 0xbb, 0x94, 0x20, 0x04, 0x6f, 0xca, 0xd7, 0xe9, 0xa9, 0xcc, 0xca, 0xa5, + 0xdf, 0x9b, 0x62, 0x2a, 0xc0, 0x7d, 0x37, 0x65, 0xfc, 0xb9, 0x70, 0x6f, 0x6a, 0x7e, 0x7f, 0x5e, 0xf4, 0x7a, 0x30, 0xff, 0xb1, 0xc8, 0xe6, 0x0b, 0xc0, 0xa3, 0x3b, 0xa2, 0xc1, 0x47, 0x3f, 0x67, + 0x3a, 0x26, 0x66, 0xd1, 0x8d, 0xbe, 0xc9, 0x42, 0x7c, 0x2c, 0xd0, 0xe5, 0x3d, 0xf4, 0x33, 0xcf, 0x5e, 0x6e, 0x0c, 0x0d, 0x74, 0x31, 0x36, 0x8c, 0xac, 0xbb, 0x25, 0x9e, 0xcd, 0x3a, 0xa7, 0xab, + 0x17, 0x81, 0x53, 0xba, 0x84, 0x50, 0xb2, 0xa7, 0xca, 0x5a, 0x12, 0xaa, 0xe2, 0xee, 0x99, 0xb4, 0x3f, 0xc8, 0xe0, 0x81, 0x28, 0x1c, 0xe8, 0xb4, 0x0f, 0x62, 0x9d, 0x8f, 0x1a, 0x43, 0x66, 0xc0, + 0x35, 0xb2, 0x39, 0x18, 0xbb, 0xa3, 0xda, 0x11, 0x08, 0xb6, 0xf4, 0xdc, 0x88, 0x73, 0x15, 0x9b, 0xd9, 0x50, 0x44, 0x1c, 0x57, 0xf2, 0x42, 0x7b, 0x7c, 0x83, 0x7c, 0xfd, 0x02, 0xf7, 0x54, 0xb9, + 0x49, 0x79, 0x4e, 0x91, 0xfd, 0xb7, 0x87, 0x8b, 0x9c, 0x0c, 0x54, 0xcd, 0x56, 0x9a, 0x46, 0xae, 0x99, 0x8c, 0x52, 0xeb, 0xe8, 0xde, 0xac, 0xad, 0xfa, 0x58, 0x01, 0xdb, 0x4f, 0xe8, 0x57, 0x36, + 0xbd, 0xbb, 0x37, 0xb8, 0x84, 0xed, 0x4c, 0x37, 0xd7, 0xec, 0x2a, 0x4e, 0x8e, 0x63, 0x53, 0x3d, 0x75, 0x47, 0x5c, 0x67, 0x3b, 0x4d, 0xc9, 0x1c, 0xc9, 0x6c, 0x2b, 0x85, 0x63, 0xf7, 0x98, 0x6d, + 0x01, 0x6e, 0x5f, 0x89, 0x0b, 0xbb, 0xf7, 0x70, 0xfb, 0x58, 0xef, 0x9c, 0xb6, 0x71, 0x31, 0x63, 0xc9, 0x78, 0x07, 0x2d, 0x67, 0xc7, 0x2e, 0x46, 0xd0, 0x09, 0x3c, 0x83, 0xe9, 0xb5, 0x47, 0x4e, + 0x0d, 0x34, 0xd4, 0x0b, 0x49, 0xce, 0xf5, 0xc7, 0xad, 0xc3, 0x3b, 0x49, 0x37, 0x9f, 0x8f, 0xb4, 0x1f, 0x4b, 0x88, 0xf8, 0xc7, 0x4e, 0x6d, 0xdf, 0xd7, 0x5f, 0xf8, 0x5a, 0x26, 0x90, 0xc7, 0xd4, + 0xec, 0x33, 0xee, 0x45, 0x1a, 0x9e, 0x47, 0x67, 0x07, 0xfb, 0x00, 0x55, 0x9b, 0x94, 0x75, 0x5b, 0x9d, 0x0c, 0x6f, 0xa3, 0xe1, 0x84, 0x50, 0x74, 0x11, 0xc5, 0x4d, 0x25, 0xa0, 0xce, 0x92, 0x29, + 0x64, 0x40, 0x93, 0x43, 0xd6, 0x26, 0x55, 0xb6, 0x25, 0xa9, 0x18, 0x66, 0xc1, 0x1d, 0x37, 0x87, 0x7a, 0xde, 0xeb, 0x3d, 0x6e, 0xa3, 0x80, 0x94, 0x6a, 0x82, 0xf8, 0xc6, 0x28, 0x8f, 0x90, 0x69, + 0x67, 0xcc, 0x91, 0x16, 0xa0, 0xf5, 0x1c, 0x3e, 0xed, 0x70, 0xc3, 0xe1, 0x22, 0x0a, 0xfb, 0x61, 0xfa, 0xf5, 0x3f, 0xc5, 0x90, 0xb4, 0x70, 0x5f, 0x9d, 0x67, 0x37, 0x74, 0xe9, 0x83, 0xca, 0xf4, + 0x0d, 0xf6, 0x95, 0x2f, 0xaf, 0x37, 0x46, 0xc8, 0xc0, 0x82, 0x77, 0xb2, 0x7c, 0x3c, 0x45, 0x0d, 0x37, 0x0b, 0x67, 0xb0, 0xbe, 0x6a, 0x67, 0x56, 0x91, 0x4e, 0xd8, 0x8d, 0x05, 0xd8, 0x75, 0x58, + 0x17, 0xe1, 0x4c, 0xe5, 0x3b, 0xf6, 0x44, 0xcc, 0xd0, 0x94, 0x9f, 0x60, 0x27, 0xaa, 0xb0, 0xb0, 0xf4, 0x60, 0x87, 0xe5, 0x66, 0x8a, 0xb5, 0xec, 0xd4, 0x74, 0x6c, 0x2d, 0x4d, 0x71, 0xe2, 0xa0, + 0x14, 0x20, 0x80, 0x2e, 0xe6, 0xdd, 0xd6, 0x47, 0x61, 0x74, 0xdc, 0x07, 0x78, 0x31, 0x30, 0xfa, 0xed, 0xfd, 0x5e, 0xec, 0x1f, 0xe1, 0x8f, 0x63, 0x56, 0xee, 0x3d, 0x3d, 0xfa, 0x48, 0x3c, 0xdc, + 0x7b, 0xe8, 0x0b, 0x7b, 0xde, 0xdc, 0x18, 0x1a, 0x15, 0xb7, 0xdf, 0x46, 0xb3, 0x1d, 0x86, 0x8c, 0xdb, 0x54, 0x82, 0x48, 0x33, 0x35, 0xe6, 0xbd, 0x8f, 0x82, 0x06, 0x6e, 0xfb, 0x94, 0x0e, 0x32, + 0xaa, 0xc6, 0xb0, 0x12, 0x48, 0x9b, 0x32, 0x0f, 0x6d, 0xc3, 0x75, 0x3e, 0xae, 0x90, 0x55, 0x8b, 0xc8, 0x08, 0x8a, 0x52, 0xd5, 0x56, 0x8b, 0xdb, 0x5a, 0x49, 0x75, 0x82, 0xe3, 0xa2, 0xc9, 0xd4, + 0x12, 0x96, 0xd1, 0x09, 0x89, 0x3b, 0x11, 0xe4, 0xb0, 0x3e, 0x84, 0xee, 0x19, 0x29, 0xff, 0x69, 0x27, 0x93, 0x7b, 0xaa, 0xbe, 0x49, 0x2d, 0x7c, 0xac, 0xaa, 0xc8, 0x2b, 0xec, 0x85, 0x49, 0xd7, + 0xc1, 0x90, 0xaa, 0x22, 0xf0, 0x28, 0x5f, 0xb6, 0xd3, 0x3d, 0xec, 0xca, 0xe4, 0x94, 0xd8, 0x79, 0xac, 0xe9, 0xd7, 0x6e, 0xae, 0xd9, 0xe4, 0xa1, 0x07, 0x36, 0xcb, 0xbf, 0x45, 0xe2, 0xe1, 0xe7, + 0xa8, 0xe5, 0xc8, 0xab, 0xa3, 0xa8, 0x0d, 0x9c, 0xca, 0x1f, 0x9d, 0xcb, 0xb5, 0x67, 0xe9, 0x6d, 0x2b, 0x1b, 0x7d, 0xcc, 0x57, 0xfb, 0xf5, 0x3b, 0x2e, 0xe4, 0xfa, 0xea, 0x97, 0x73, 0xc1, 0xad, + 0x01, 0xaa, 0xa7, 0xef, 0xe2, 0x18, 0x03, 0x6a, 0xa0, 0x9c, 0x96, 0x5b, 0xb5, 0x9b, 0x51, 0x39, 0x6f, 0xba, 0x47, 0x05, 0x9d, 0xcd, 0x1b, 0x7f, 0xba, 0xb6, 0xa3, 0xb5, 0x13, 0xf4, 0xba, 0xb9, + 0xda, 0xd7, 0x2c, 0x4d, 0xa2, 0x32, 0x77, 0xb4, 0x88, 0x64, 0x5b, 0x2f, 0x12, 0xc7, 0x99, 0xb2, 0x8b, 0x06, 0xf2, 0x43, 0x60, 0xad, 0x13, 0x93, 0x0d, 0x1d, 0x95, 0xaa, 0xbb, 0x1e, 0xef, 0xdd, + 0x03, 0xce, 0x28, 0xb8, 0x26, 0xfd, 0x4d, 0xe1, 0x1e, 0x68, 0x81, 0x1d, 0xdc, 0xc4, 0x2d, 0xcc, 0x2a, 0x2d, 0x46, 0xcf, 0x11, 0xbc, 0xdf, 0x68, 0x0f, 0xf8, 0x21, 0x9a, 0x7f, 0x7e, 0xc5, 0x85, + 0xe2, 0x9f, 0xef, 0x5f, 0x4e, 0xcf, 0x06, 0x10, 0xfc, 0x58, 0x32, 0xc7, 0x8e, 0x8a, 0xd0, 0x2e, 0xd0, 0x18, 0x09, 0x10, 0x4b, 0xcd, 0x89, 0x27, 0x2d, 0x23, 0xda, 0xc2, 0xc9, 0xd4, 0x54, 0xae, + 0xcc, 0xd6, 0x4e, 0x16, 0xcd, 0xf7, 0xca, 0x92, 0x6a, 0x72, 0x38, 0x30, 0x0e, 0x4b, 0x37, 0x74, 0xa7, 0x10, 0x07, 0xe3, 0x44, 0xee, 0xd6, 0x24, 0x6e, 0xf7, 0x92, 0x79, 0x72, 0x1d, 0x34, 0x07, + 0xf7, 0x7d, 0xdd, 0x42, 0x65, 0xcb, 0x41, 0x41, 0xc1, 0x91, 0x03, 0xe3, 0x0c, 0xfe, 0x2b, 0x58, 0x57, 0xdf, 0x28, 0x9f, 0xf1, 0x63, 0x87, 0xa3, 0xe5, 0xe8, 0x55, 0xf3, 0x9c, 0xd5, 0xce, 0xf8, + 0xfe, 0x41, 0xe8, 0x13, 0x27, 0xb1, 0x05, 0x54, 0xad, 0xab, 0xc9, 0x6e, 0xbe, 0x8c, 0x85, 0x7c, 0x96, 0x70, 0x13, 0xc4, 0x5f, 0xe0, 0x93, 0x0c, 0xc9, 0xed, 0x35, 0x33, 0x77, 0xea, 0x74, 0x5c, + 0x19, 0x35, 0xb5, 0xd9, 0x81, 0x2c, 0xce, 0x4b, 0x0d, 0x78, 0xf0, 0xfd, 0x0e, 0x85, 0x52, 0x0c, 0xab, 0x3d, 0xd3, 0x3b, 0xad, 0x40, 0xce, 0x61, 0x09, 0x8a, 0xe3, 0x4a, 0x64, 0xed, 0x15, 0x09, + 0x89, 0xed, 0xb8, 0x75, 0x47, 0x13, 0x93, 0xfd, 0xbd, 0xa9, 0xf3, 0x6d, 0x9e, 0xe9, 0xab, 0x6e, 0x7e, 0x6e, 0x23, 0xf4, 0x53, 0xbe, 0xfe, 0x44, 0xe9, 0x25, 0xee, 0xc1, 0xac, 0x82, 0xc6, 0x1d, + 0xf5, 0x6e, 0x71, 0x2b, 0xb8, 0x0e, 0x79, 0x74, 0xe1, 0x7e, 0x07, 0x7e, 0xe1, 0xcd, 0xbb, 0x5b, 0xe7, 0xe3, 0x82, 0x01, 0x8b, 0xb7, 0x93, 0xaf, 0x1a, 0xb3, 0xe0, 0xcc, 0x56, 0x2b, 0xe7, 0x16, + 0x3f, 0x73, 0x57, 0x2a, 0xd1, 0xd3, 0x3d, 0xb9, 0xac, 0x56, 0x94, 0xed, 0x20, 0xa4, 0x5e, 0x7b, 0x75, 0x3d, 0xef, 0x7d, 0x68, 0x41, 0x66, 0x3c, 0x7b, 0x5c, 0x6d, 0x12, 0x1d, 0x22, 0x67, 0x0d, + 0x51, 0xea, 0x1a, 0x52, 0xcf, 0xb1, 0x7d, 0x26, 0x09, 0x6d, 0xe0, 0xd2, 0xae, 0xc0, 0x9c, 0x18, 0x9d, 0x56, 0x55, 0xaf, 0x26, 0x0c, 0x63, 0x7f, 0x6f, 0xfb, 0xf3, 0x9f, 0x76, 0xf2, 0x24, 0x75, + 0x6c, 0x9d, 0x43, 0x8c, 0xbe, 0xe2, 0x15, 0xf1, 0xe8, 0xca, 0x74, 0x41, 0xbd, 0x32, 0xe9, 0x7c, 0x7d, 0x2e, 0x79, 0x3b, 0x40, 0x19, 0x8e, 0xe1, 0x69, 0xe0, 0x85, 0x07, 0xdc, 0x25, 0x77, 0x5d, + 0xb4, 0xcd, 0x9c, 0x6a, 0x97, 0xb9, 0x9c, 0xb2, 0xc9, 0x9b, 0xed, 0x84, 0x51, 0xfa, 0x5d, 0x55, 0xb1, 0x0d, 0x23, 0xcf, 0x88, 0x31, 0x0c, 0x64, 0x89, 0x41, 0xd2, 0x7c, 0x03, 0x41, 0xd0, 0x78, + 0x23, 0x73, 0x63, 0x54, 0x5a, 0x8b, 0xb3, 0x68, 0x4d, 0xd9, 0x8b, 0x86, 0xcf, 0x70, 0xde, 0x50, 0x8d, 0xfd, 0x24, 0xb2, 0x16, 0x9a, 0x7e, 0x3a, 0x25, 0xf7, 0xa6, 0xd0, 0xfd, 0x29, 0x30, 0xac, + 0x47, 0xd6, 0xeb, 0xd7, 0xde, 0xb5, 0x5d, 0x89, 0xc7, 0xc9, 0xfa, 0xce, 0x7a, 0x7d, 0x77, 0xeb, 0xbc, 0xe4, 0x10, 0xf7, 0x89, 0x1c, 0xc2, 0x7b, 0x68, 0x29, 0xf7, 0xdc, 0x26, 0x25, 0x8c, 0x48, + 0x5f, 0x7a, 0xbd, 0x5c, 0x23, 0xa8, 0xe0, 0xe3, 0x9b, 0x60, 0x39, 0x37, 0xcb, 0x43, 0x66, 0x51, 0x1a, 0x81, 0xbb, 0xb9, 0x37, 0x37, 0xe8, 0xbc, 0x65, 0xc7, 0xe3, 0xfd, 0x72, 0xbc, 0xde, 0x4d, + 0x9a, 0x89, 0xbe, 0x34, 0x60, 0x67, 0xcb, 0x51, 0x46, 0x3f, 0xf5, 0x77, 0x13, 0x6a, 0xeb, 0xb3, 0x1e, 0x17, 0xca, 0xe3, 0xcc, 0x51, 0xb1, 0xb0, 0xb8, 0x97, 0x6f, 0xf0, 0x5f, 0x7b, 0x11, 0xca, + 0x22, 0x33, 0x38, 0x3b, 0x62, 0x6e, 0xf2, 0xfc, 0xc1, 0xed, 0xe4, 0x0b, 0xf0, 0x85, 0xdf, 0x2f, 0xc3, 0xb3, 0xb7, 0x67, 0xc0, 0x84, 0xea, 0x9a, 0x50, 0xee, 0x4e, 0xf1, 0x7c, 0xcd, 0x08, 0xd2, + 0x38, 0xe3, 0xb5, 0x69, 0xbc, 0x5a, 0x60, 0x34, 0x23, 0xf1, 0x91, 0xb6, 0xda, 0x62, 0x9c, 0x29, 0xf0, 0x5a, 0x8a, 0x81, 0x36, 0xe7, 0xec, 0x0c, 0x47, 0x6d, 0x4a, 0x03, 0x0e, 0xd2, 0x15, 0x93, + 0x26, 0xdc, 0x82, 0x4e, 0xcb, 0x75, 0xb4, 0x51, 0x19, 0x32, 0x6a, 0xf7, 0x1d, 0x68, 0xad, 0xfa, 0xcd, 0xd1, 0x6e, 0x49, 0xb3, 0x27, 0x50, 0x60, 0xfe, 0xf7, 0x27, 0xd4, 0xe0, 0x35, 0xe5, 0x5c, + 0xa2, 0xf8, 0x9b, 0x89, 0xf4, 0xf3, 0xb6, 0x9f, 0xcf, 0xa0, 0x17, 0x82, 0x5e, 0x2a, 0x5a, 0x9f, 0x91, 0xee, 0x13, 0xb3, 0x89, 0xd6, 0x2a, 0x4c, 0x6c, 0xf9, 0x7c, 0x3c, 0x4e, 0xdb, 0x06, 0xa3, + 0x25, 0x19, 0x9d, 0xe6, 0x90, 0x25, 0x89, 0x8c, 0x45, 0x02, 0xe1, 0x1c, 0xdd, 0xaf, 0x0d, 0xc4, 0x0b, 0x0c, 0x5e, 0x50, 0xab, 0xbe, 0xd2, 0x19, 0x2c, 0x80, 0xa6, 0xfd, 0xd4, 0x38, 0xcd, 0x67, + 0xad, 0x80, 0x91, 0x39, 0x2d, 0xa8, 0xd5, 0xc9, 0x99, 0xc8, 0x8a, 0x00, 0x2a, 0x98, 0x14, 0x24, 0x70, 0x7b, 0x9c, 0xe6, 0x73, 0xfd, 0x6f, 0x4d, 0x9c, 0x5f, 0xdf, 0xec, 0xd4, 0xff, 0xd3, 0x4e, + 0x96, 0xd2, 0x37, 0x0b, 0xd7, 0xb9, 0x9c, 0x90, 0xbc, 0x06, 0xb9, 0xfe, 0xd1, 0x6d, 0xfe, 0x17, 0xaf, 0xb8, 0xf0, 0xfb, 0x8b, 0x1f, 0x86, 0x6e, 0xfb, 0xcb, 0x9c, 0x47, 0xf6, 0xb3, 0x1a, 0x06, + 0xa1, 0x0e, 0xaf, 0x1b, 0xad, 0xdb, 0x56, 0x53, 0xa1, 0xef, 0x7c, 0xfa, 0x38, 0xdd, 0x46, 0xac, 0xed, 0xce, 0xd3, 0xcd, 0x7a, 0xa5, 0x92, 0x2a, 0xc5, 0xec, 0x29, 0xbb, 0x09, 0x6c, 0x50, 0x72, + 0x4a, 0x03, 0x0a, 0x99, 0x3d, 0x85, 0xb2, 0x4c, 0x87, 0x2e, 0xf7, 0xcc, 0xdc, 0x58, 0x06, 0x2c, 0x88, 0xb6, 0x00, 0xcd, 0x82, 0x7b, 0xc9, 0x12, 0x59, 0xde, 0xf1, 0xef, 0x59, 0x0e, 0x3f, 0x73, + 0x9c, 0xfe, 0x33, 0xec, 0xfc, 0xbe, 0x63, 0xdb, 0x83, 0x8b, 0xdd, 0x6b, 0x14, 0xd2, 0xf3, 0xf5, 0xd0, 0xe5, 0xad, 0x62, 0x90, 0xbd, 0xd6, 0x07, 0xcd, 0xd1, 0xc5, 0x53, 0x4f, 0x54, 0x89, 0x08, + 0x41, 0xed, 0xe3, 0x4c, 0xd8, 0x98, 0x10, 0x75, 0xb0, 0x88, 0x53, 0x44, 0xe7, 0x0b, 0xfc, 0xb8, 0xc0, 0xdc, 0x23, 0x5e, 0x8b, 0x0a, 0x8a, 0xec, 0x22, 0x55, 0x44, 0xf9, 0xb5, 0x18, 0x1c, 0x2a, + 0x73, 0xe1, 0xb2, 0x7c, 0x4d, 0x79, 0xa9, 0x6f, 0xdb, 0xb2, 0xde, 0x2c, 0x03, 0x63, 0xe3, 0x09, 0x42, 0x22, 0xe8, 0xfb, 0xea, 0x9e, 0xca, 0xfb, 0xaf, 0xbd, 0xbc, 0x5d, 0x72, 0xa6, 0xbe, 0x61, + 0xf1, 0x03, 0x91, 0x2e, 0xcf, 0xa8, 0x57, 0x16, 0x5f, 0x8a, 0x88, 0x0d, 0x8d, 0x70, 0x69, 0x83, 0xa3, 0x6f, 0xca, 0xdb, 0x43, 0xde, 0xf8, 0x31, 0x08, 0x19, 0x0e, 0x6d, 0x6b, 0xbc, 0x51, 0x51, + 0x91, 0xee, 0xac, 0xe7, 0x99, 0x2d, 0xcf, 0x76, 0xd8, 0x9e, 0xdb, 0xd7, 0xba, 0x26, 0xa6, 0x3b, 0x82, 0x1a, 0xef, 0x79, 0xc1, 0xd9, 0x03, 0x87, 0x6c, 0x87, 0xcb, 0x7d, 0x4a, 0x58, 0x63, 0x05, + 0x61, 0xf7, 0x11, 0x98, 0x66, 0xf8, 0x22, 0xd7, 0x49, 0x6a, 0x4c, 0x1b, 0x6d, 0x43, 0x79, 0xe6, 0xdf, 0x52, 0xc4, 0x9f, 0xd2, 0xca, 0x7e, 0xbe, 0xd5, 0xfa, 0xe7, 0xd8, 0x5b, 0x75, 0xd9, 0xb3, + 0x4e, 0xfc, 0xc6, 0x7e, 0x79, 0xcc, 0x63, 0xf2, 0x06, 0xfb, 0xc2, 0xe9, 0x37, 0x37, 0x2e, 0xe5, 0x23, 0x07, 0x58, 0x31, 0xe2, 0x2a, 0x3f, 0x30, 0x6c, 0xa0, 0x1a, 0xcd, 0x26, 0x33, 0xe7, 0x06, + 0x5a, 0xef, 0x6c, 0x32, 0x64, 0xc5, 0xcd, 0x18, 0x18, 0xd3, 0xb3, 0x5d, 0x34, 0x4b, 0x82, 0x5a, 0xe2, 0x08, 0x7b, 0x0f, 0xee, 0x67, 0x34, 0x24, 0x45, 0xc4, 0x9c, 0x80, 0xba, 0x85, 0xc7, 0x66, + 0x3e, 0x6a, 0x73, 0xbc, 0x0b, 0xd8, 0x54, 0x95, 0x9a, 0xc1, 0xa1, 0x01, 0x66, 0xf3, 0x7e, 0xb7, 0x5a, 0xfb, 0x36, 0x32, 0xad, 0x04, 0x7c, 0xa0, 0x8f, 0xc4, 0x6c, 0xcc, 0xe0, 0x72, 0xb0, 0xf2, + 0xe6, 0x2f, 0x7f, 0xe5, 0xf3, 0xab, 0x01, 0x72, 0xff, 0x30, 0xeb, 0x4d, 0x5d, 0xf2, 0x5f, 0xff, 0x7a, 0x5f, 0x85, 0xfc, 0xaf, 0xbf, 0x7e, 0x5d, 0xeb, 0x4a, 0x3c, 0x8b, 0xcf, 0xff, 0xf5, 0x5e, + 0xbe, 0xfe, 0x77, 0x57, 0x21, 0x75, 0x12, 0x9c, 0x9d, 0x91, 0xd7, 0x7c, 0x82, 0xb3, 0xe8, 0x7c, 0x25, 0x69, 0xd0, 0xa3, 0x96, 0xf2, 0xa7, 0x17, 0x5c, 0xc4, 0xed, 0xd3, 0xed, 0x73, 0x98, 0xef, + 0x00, 0x99, 0x0b, 0x93, 0xd3, 0x02, 0xc9, 0xc7, 0xfb, 0x29, 0x5a, 0x93, 0x65, 0x25, 0x2f, 0x3a, 0x5a, 0x59, 0x4d, 0x05, 0xe7, 0x34, 0x8f, 0x1b, 0x6c, 0x66, 0x04, 0xb2, 0xed, 0x44, 0x4b, 0x93, + 0x96, 0x34, 0xda, 0xda, 0x7a, 0xab, 0xce, 0x04, 0x04, 0x3f, 0xcd, 0xf8, 0xb4, 0xe2, 0xa4, 0xa2, 0xac, 0x26, 0x7e, 0x5e, 0xe7, 0xf5, 0xd8, 0xc8, 0xea, 0xb5, 0x35, 0xb3, 0x41, 0x72, 0x8b, 0xc7, + 0x07, 0xed, 0x20, 0xce, 0xc5, 0x7b, 0x27, 0xda, 0xc3, 0x13, 0xe9, 0xfe, 0x36, 0xf3, 0x7e, 0x1a, 0x8e, 0x5d, 0x8e, 0x5a, 0xd7, 0x0c, 0x0b, 0xd7, 0xfb, 0xd3, 0xb6, 0xda, 0x15, 0xf6, 0xc2, 0xae, + 0xeb, 0x60, 0xa8, 0x4d, 0x96, 0xdb, 0x55, 0x59, 0x73, 0x46, 0xbc, 0x94, 0x20, 0xa0, 0xd9, 0x6e, 0x37, 0x5e, 0xaa, 0x34, 0xdd, 0xdc, 0x45, 0x80, 0xc5, 0x96, 0x69, 0x92, 0xd8, 0x40, 0xdc, 0x7e, + 0x57, 0x67, 0xf0, 0x76, 0x52, 0xba, 0x14, 0x50, 0xb5, 0xd3, 0xa9, 0x1b, 0x98, 0x11, 0xce, 0x30, 0x01, 0xca, 0xdb, 0xc8, 0x7a, 0x6e, 0x7b, 0x38, 0x90, 0xf7, 0xc8, 0x7c, 0x22, 0x26, 0x47, 0xad, + 0x0c, 0xc9, 0x93, 0xbf, 0xde, 0x9a, 0x77, 0x53, 0xe7, 0xff, 0xf3, 0xdb, 0x64, 0xee, 0xe9, 0xf6, 0xc1, 0xe6, 0x63, 0x3e, 0x1d, 0xf7, 0x74, 0x39, 0xce, 0x74, 0x4f, 0xee, 0x90, 0xbc, 0x49, 0x78, + 0x84, 0x8b, 0x4d, 0xef, 0xf0, 0x27, 0xc5, 0x02, 0x83, 0xbd, 0xeb, 0xcf, 0xec, 0x72, 0x6e, 0x57, 0x7a, 0x4f, 0x96, 0x80, 0x4f, 0xff, 0x30, 0x2f, 0xe4, 0xf8, 0xa4, 0xfc, 0x42, 0x37, 0x29, 0x6f, + 0x7c, 0xd2, 0x63, 0xc1, 0xee, 0x2f, 0xa8, 0xe7, 0x4e, 0xd0, 0xd7, 0xeb, 0xa1, 0x41, 0xee, 0xb2, 0xb3, 0xda, 0x7b, 0x91, 0xcd, 0xa0, 0xf6, 0xbe, 0x5f, 0x07, 0x9b, 0x5c, 0x3a, 0x94, 0xd3, 0x1a, + 0xc2, 0xe7, 0x62, 0x4d, 0xed, 0x9d, 0xe5, 0x4a, 0x80, 0x2c, 0x57, 0xb7, 0x44, 0x9f, 0xe5, 0xc7, 0x21, 0x6e, 0x66, 0x87, 0x55, 0x15, 0x78, 0x76, 0x3a, 0xad, 0x76, 0x94, 0x65, 0x9f, 0x84, 0x4c, + 0x9f, 0x54, 0xd9, 0x0c, 0x09, 0xa7, 0x1b, 0x7c, 0x6b, 0xf5, 0x87, 0xf1, 0xd4, 0xac, 0x4b, 0x15, 0x14, 0xd7, 0xdf, 0xc7, 0x1c, 0x1f, 0xcb, 0x51, 0x67, 0xc6, 0xb7, 0x6c, 0x30, 0xf4, 0x37, 0x3c, + 0x7e, 0xc0, 0xd5, 0x7d, 0x05, 0xbd, 0x90, 0xe0, 0xe9, 0x6a, 0x74, 0x01, 0xba, 0x4f, 0x81, 0x34, 0xdc, 0xb0, 0x84, 0xa0, 0x69, 0x2b, 0x42, 0x2f, 0x78, 0x4a, 0x08, 0x51, 0x70, 0xab, 0x15, 0x49, + 0x3d, 0x0e, 0x34, 0xaa, 0x13, 0x42, 0x00, 0xc1, 0x92, 0x5c, 0x1b, 0x07, 0xf1, 0x16, 0x49, 0xb2, 0xba, 0xd9, 0xe9, 0xb3, 0x38, 0x05, 0x25, 0xc6, 0x48, 0xf3, 0xd6, 0x08, 0x75, 0x73, 0x39, 0x0b, + 0xd1, 0xa3, 0xd2, 0x4c, 0x84, 0x9d, 0xb0, 0x64, 0x0e, 0x8c, 0x6f, 0x72, 0x42, 0x97, 0x4c, 0xb6, 0xd4, 0xe3, 0x46, 0xb6, 0x59, 0x1c, 0xde, 0x37, 0xde, 0x7c, 0xd7, 0xa8, 0xd2, 0x2d, 0xb3, 0x22, + 0x88, 0xcd, 0x5f, 0xdf, 0xa4, 0xc1, 0x58, 0xef, 0xba, 0x45, 0x9e, 0x7b, 0xb5, 0x3f, 0xd3, 0xfb, 0xe9, 0xb7, 0x67, 0xfa, 0xfc, 0x3e, 0x0e, 0xd1, 0x95, 0xe7, 0x1e, 0x80, 0x77, 0x43, 0xeb, 0x1e, + 0x91, 0xd9, 0x17, 0xdc, 0xe7, 0xfe, 0xe5, 0x6f, 0xc2, 0xeb, 0x06, 0xc8, 0xed, 0x36, 0x10, 0x1b, 0x90, 0x54, 0x32, 0xa3, 0x56, 0xad, 0x86, 0xdb, 0x6e, 0xaa, 0xdd, 0x6c, 0x4f, 0xfa, 0x8c, 0x57, + 0x18, 0xea, 0x01, 0x8c, 0x59, 0x30, 0x51, 0x40, 0x6b, 0x9c, 0x42, 0x53, 0xdd, 0xda, 0x9e, 0x6a, 0x78, 0xbf, 0x94, 0x44, 0xce, 0x69, 0xd7, 0xc2, 0x74, 0xd9, 0x71, 0x92, 0x06, 0x28, 0x4b, 0x51, + 0xc0, 0x9a, 0x82, 0xd3, 0xd0, 0x80, 0xcc, 0xab, 0x7c, 0xde, 0xf9, 0x8e, 0xb8, 0xdd, 0x0f, 0x4d, 0x65, 0xb6, 0x82, 0xc3, 0xc5, 0x5b, 0xf9, 0xfb, 0xda, 0xaf, 0x9e, 0xfa, 0x3d, 0xcc, 0x0b, 0xf4, + 0xda, 0x51, 0x71, 0xe4, 0x36, 0x6e, 0x32, 0xb2, 0xdc, 0xaa, 0x72, 0x8b, 0xef, 0x53, 0xc5, 0x1f, 0x3b, 0x54, 0xfd, 0xf6, 0x4d, 0xcf, 0x14, 0xbf, 0xf5, 0xfb, 0xd0, 0x03, 0xd6, 0xc0, 0xb0, 0x16, + 0xac, 0xe9, 0x69, 0x20, 0x46, 0x15, 0x28, 0x75, 0x10, 0x5b, 0x45, 0x94, 0x27, 0x8b, 0x16, 0x92, 0xa4, 0x75, 0x42, 0x13, 0x55, 0xe5, 0x62, 0xd9, 0x76, 0x53, 0xf8, 0xaa, 0xa0, 0x12, 0x65, 0xbb, + 0x28, 0x95, 0x46, 0xd9, 0x1d, 0x63, 0xaf, 0xa3, 0x15, 0x2a, 0xe3, 0xf3, 0x90, 0xd4, 0x17, 0x3b, 0xa2, 0x92, 0xa7, 0xce, 0x49, 0xae, 0xc9, 0xba, 0xb7, 0x0f, 0x46, 0x9b, 0xce, 0xd2, 0x74, 0x78, + 0xa4, 0xec, 0xbf, 0x9e, 0xe6, 0x37, 0xf1, 0x5c, 0x6b, 0x1e, 0xff, 0x0d, 0xa3, 0x2f, 0xc5, 0xe6, 0xc9, 0x9f, 0x30, 0x64, 0x58, 0xc3, 0x7e, 0xe8, 0xf7, 0x63, 0x6a, 0x69, 0x78, 0xc3, 0xfe, 0xf3, + 0x1b, 0xee, 0x53, 0xfd, 0x64, 0x59, 0x53, 0x16, 0x73, 0xa6, 0xfa, 0x1e, 0xdb, 0x91, 0x9c, 0xcd, 0xf8, 0x7e, 0xed, 0x13, 0xec, 0x8a, 0x24, 0x59, 0xad, 0x56, 0xd1, 0xbc, 0x5c, 0xa2, 0x3a, 0xd4, + 0x0b, 0xc6, 0x7c, 0xed, 0x19, 0x0c, 0x6b, 0x67, 0x6a, 0xc0, 0xee, 0xc1, 0xd5, 0xa9, 0x0f, 0x71, 0x84, 0x9a, 0x14, 0xa5, 0x69, 0x81, 0xf1, 0x26, 0x60, 0xa5, 0x2a, 0xa0, 0xda, 0x8d, 0x08, 0x90, + 0x63, 0x4c, 0x16, 0x5d, 0x54, 0xb9, 0xa1, 0xaf, 0xee, 0x51, 0xae, 0x3a, 0xef, 0x26, 0x5e, 0x7b, 0x14, 0xb7, 0x41, 0xe5, 0xa7, 0xf5, 0xa5, 0x35, 0xf0, 0xed, 0x16, 0xd1, 0xf0, 0x43, 0x87, 0x99, + 0x83, 0xde, 0xf8, 0x42, 0xdb, 0x3b, 0xcf, 0x0d, 0xcb, 0x08, 0x4d, 0x2c, 0x17, 0x8e, 0x56, 0x66, 0x25, 0xf6, 0x3d, 0x40, 0xb6, 0x19, 0x3c, 0x9f, 0x42, 0x55, 0xd8, 0x16, 0xda, 0x2a, 0x62, 0x7e, + 0x48, 0xae, 0x30, 0x48, 0x9c, 0x51, 0x7a, 0xcb, 0xe0, 0xc4, 0x1f, 0xf2, 0x3b, 0x5c, 0x31, 0xc1, 0xd1, 0xf3, 0xd5, 0xb9, 0x59, 0xe6, 0x00, 0x9f, 0x83, 0x63, 0x6f, 0xe1, 0x3a, 0x02, 0xa8, 0x2a, + 0x76, 0x67, 0x14, 0xb6, 0x03, 0x4e, 0x08, 0x09, 0xba, 0x3e, 0x77, 0x70, 0xa8, 0x98, 0xe1, 0x4d, 0x94, 0x2b, 0x9b, 0xd9, 0xae, 0xea, 0x63, 0xb4, 0xe9, 0x26, 0x8c, 0x40, 0xc8, 0x62, 0x56, 0x35, + 0xf4, 0x0c, 0xa8, 0xc6, 0x63, 0x55, 0xd1, 0xcc, 0xfd, 0x71, 0x37, 0x91, 0xed, 0x22, 0x9b, 0xbb, 0xf3, 0x68, 0x4a, 0xaa, 0xd3, 0xa2, 0xde, 0xcb, 0x63, 0x0c, 0xf7, 0xff, 0xe6, 0x7e, 0x60, 0xb0, + 0x27, 0x3d, 0x72, 0x9b, 0x5b, 0xc1, 0x10, 0x8f, 0x4d, 0xd1, 0x27, 0x40, 0x70, 0x74, 0xfe, 0x67, 0xe8, 0x14, 0x04, 0xac, 0x1d, 0x52, 0xb3, 0x63, 0x06, 0xe3, 0x16, 0x0c, 0xe1, 0x83, 0x09, 0xea, + 0x36, 0xf6, 0x16, 0x2c, 0xa5, 0x68, 0xa5, 0x4d, 0xb3, 0x65, 0x86, 0x77, 0x31, 0x29, 0xa8, 0x2b, 0xcc, 0x55, 0x70, 0x00, 0x27, 0x66, 0x65, 0x1e, 0x81, 0x9c, 0x69, 0xee, 0x88, 0x7c, 0x35, 0xa1, + 0x2b, 0xa4, 0xe8, 0xbd, 0xd4, 0x04, 0x31, 0x69, 0xb2, 0x98, 0xf8, 0xa7, 0x59, 0x70, 0x82, 0x9d, 0x4d, 0x85, 0x84, 0xd2, 0x7a, 0xe0, 0xe2, 0x93, 0x15, 0x6e, 0x54, 0x3b, 0xee, 0xe8, 0xc5, 0x41, + 0xf3, 0xa1, 0x8f, 0xf7, 0xb9, 0xae, 0xad, 0xed, 0xbb, 0x76, 0xf8, 0xf4, 0xfb, 0xff, 0x07, 0x3d, 0xd6, 0xb5, 0x17, 0x3a, 0xd7, 0x54, 0x1e, 0xc0, 0x8d, 0xcf, 0xed, 0xbb, 0xbf, 0xe2, 0x0c, 0x76, + 0xe1, 0xee, 0x8f, 0x59, 0xf3, 0x01, 0xfd, 0x89, 0x4d, 0x1f, 0x6e, 0x8d, 0x2e, 0xd0, 0xf7, 0x79, 0x66, 0xec, 0x91, 0x19, 0xb5, 0x88, 0x69, 0x5b, 0xd8, 0xdb, 0x75, 0xb4, 0xdb, 0x39, 0x2c, 0x05, + 0xf6, 0x45, 0xe7, 0x1e, 0xf1, 0x84, 0xdc, 0xf5, 0x3b, 0xc0, 0xe3, 0x17, 0x0e, 0x5f, 0xc5, 0xf8, 0x76, 0x96, 0x61, 0x9b, 0xcd, 0x26, 0x63, 0x8b, 0xd5, 0x2a, 0x6c, 0x68, 0x87, 0x41, 0x6d, 0xdc, + 0x21, 0x1d, 0xc4, 0xf6, 0x19, 0x2a, 0x00, 0x4c, 0x10, 0x74, 0xb6, 0xd4, 0x54, 0x35, 0xaa, 0xa0, 0x0c, 0x93, 0x7c, 0xa0, 0xe3, 0xc5, 0x4e, 0xd3, 0x30, 0xb8, 0xac, 0x59, 0xd0, 0xc7, 0xee, 0xe0, + 0x5f, 0xf7, 0x2f, 0xff, 0x90, 0x02, 0x5d, 0xba, 0xd5, 0xe8, 0x02, 0x72, 0x59, 0xb4, 0x9f, 0xdb, 0x98, 0x8f, 0x07, 0xb5, 0x12, 0x8f, 0x9e, 0x58, 0x3d, 0x32, 0x13, 0x67, 0x64, 0xa7, 0x51, 0x1d, + 0xdf, 0xdc, 0x7e, 0x20, 0x0f, 0xa9, 0xa1, 0x4f, 0xe8, 0x67, 0x2e, 0x7d, 0xb8, 0x77, 0xde, 0x69, 0x0d, 0x50, 0x4d, 0x36, 0x2f, 0x1c, 0x0f, 0xd3, 0x84, 0x9b, 0x00, 0xf3, 0xa4, 0x51, 0xd5, 0xaa, + 0x93, 0x77, 0x7d, 0x3c, 0x41, 0x45, 0x61, 0x05, 0xd8, 0xda, 0x69, 0x47, 0x93, 0x30, 0x97, 0xaa, 0x44, 0x4d, 0xae, 0x9c, 0xd8, 0xf7, 0xb4, 0xbe, 0x08, 0x8a, 0x34, 0xd3, 0xdb, 0xec, 0xb8, 0xf5, + 0x93, 0x1e, 0x96, 0x38, 0x4e, 0x2d, 0xa5, 0x56, 0x27, 0x92, 0xe5, 0x29, 0x9d, 0xc5, 0xb6, 0xb8, 0x6b, 0x33, 0x7f, 0xb6, 0xa6, 0x86, 0x87, 0xf2, 0xfe, 0x0b, 0x46, 0x7e, 0x23, 0xd0, 0xb3, 0x49, + 0x31, 0x7e, 0x32, 0x29, 0xe0, 0xab, 0x49, 0x81, 0x0f, 0x34, 0x29, 0xde, 0xf7, 0xc1, 0xfc, 0x7a, 0x32, 0x3c, 0x34, 0x17, 0x5e, 0x71, 0x9f, 0x08, 0xfc, 0x3a, 0x1a, 0x61, 0xc3, 0xac, 0xb5, 0x8a, + 0xf0, 0x5b, 0x2a, 0x5b, 0x02, 0x6a, 0x53, 0xb7, 0xfc, 0x4a, 0x6b, 0x43, 0xac, 0x57, 0xd8, 0xac, 0xf3, 0x97, 0x79, 0x7f, 0x40, 0xf2, 0x5d, 0x14, 0x46, 0x2b, 0xc1, 0x83, 0x62, 0xe5, 0xb4, 0xd8, + 0x5a, 0x2e, 0x3a, 0xcf, 0x10, 0x25, 0x70, 0x0d, 0xdb, 0xa9, 0x79, 0xfd, 0x68, 0x72, 0xb3, 0xb4, 0xc3, 0x33, 0xaa, 0x5e, 0x64, 0x12, 0xb3, 0x50, 0x17, 0x24, 0xa1, 0x66, 0x9b, 0x75, 0xc4, 0xe7, + 0xe4, 0xe3, 0xfb, 0x9c, 0x6c, 0x74, 0xf9, 0x86, 0x5f, 0x97, 0xad, 0xcc, 0x97, 0x2d, 0xc5, 0xfe, 0x40, 0x30, 0x5d, 0x94, 0x3a, 0xb7, 0xd3, 0xee, 0xcf, 0xf6, 0x23, 0xf2, 0xc0, 0x92, 0x71, 0x06, + 0x3d, 0xb3, 0xe1, 0xe9, 0x62, 0x74, 0xc5, 0xb9, 0xcf, 0x83, 0x06, 0x09, 0x67, 0x8c, 0x8b, 0x11, 0x91, 0x6b, 0xef, 0xea, 0xc8, 0x9c, 0x2d, 0x6b, 0x7e, 0x27, 0x76, 0xa8, 0xdc, 0x8d, 0x0f, 0xdc, + 0x62, 0x85, 0x1b, 0xb0, 0x80, 0x36, 0x0c, 0x1c, 0x16, 0x07, 0xcd, 0xe0, 0x8b, 0x52, 0x02, 0xb8, 0xf9, 0x6e, 0xc1, 0x2a, 0x27, 0xe5, 0x68, 0x6b, 0x62, 0x09, 0x13, 0x9c, 0x6f, 0x19, 0xca, 0xc2, + 0x75, 0xe8, 0x55, 0x43, 0x6a, 0x06, 0x5c, 0x35, 0x47, 0x6c, 0xde, 0x6c, 0x7f, 0x6c, 0xbb, 0x5d, 0xfe, 0xea, 0xdf, 0x76, 0x94, 0x26, 0xae, 0xe3, 0xba, 0xb7, 0xfb, 0xd9, 0x62, 0x0f, 0xc9, 0xe9, + 0x7b, 0xf0, 0x17, 0x2a, 0xbd, 0xde, 0x1a, 0x9d, 0x91, 0xef, 0x19, 0x5f, 0xe3, 0x23, 0x09, 0x26, 0x0c, 0x20, 0x36, 0x0e, 0xce, 0xae, 0xb6, 0xc9, 0x64, 0x72, 0xf2, 0xb5, 0x74, 0x69, 0x45, 0xbd, + 0xf0, 0xd3, 0xae, 0x60, 0xd7, 0xf7, 0x57, 0x45, 0x9d, 0x5c, 0x25, 0xee, 0xeb, 0xcf, 0x1d, 0x3f, 0xe0, 0xf5, 0xfb, 0x80, 0xfd, 0xfa, 0xb5, 0xcf, 0x77, 0x46, 0x67, 0xdc, 0x7b, 0x1f, 0xab, 0x1e, + 0xf7, 0x7c, 0xca, 0x31, 0xb2, 0x30, 0xe6, 0x81, 0x1e, 0x04, 0x95, 0xc3, 0xb6, 0x03, 0x54, 0xde, 0xca, 0xc7, 0xc6, 0xe6, 0xc7, 0x1f, 0x7b, 0xb8, 0x53, 0xca, 0xf2, 0xb1, 0xaa, 0x70, 0x6f, 0x70, + 0xcf, 0x1f, 0xf9, 0x32, 0x1a, 0x5a, 0x0d, 0x8e, 0xd4, 0xc4, 0x26, 0xa3, 0x69, 0xb2, 0xee, 0x7c, 0xaf, 0x72, 0x6b, 0x32, 0x5b, 0x36, 0xd2, 0x29, 0x5b, 0x19, 0xc4, 0x56, 0xd7, 0x9d, 0x6c, 0x1f, + 0x34, 0x46, 0xb6, 0xe8, 0xf0, 0x72, 0x5e, 0x4e, 0xea, 0xb5, 0xac, 0x83, 0x44, 0x21, 0x2d, 0xcc, 0xc6, 0x75, 0xdc, 0x09, 0x69, 0xae, 0x01, 0x23, 0xec, 0x72, 0xbc, 0xce, 0x36, 0x73, 0x85, 0x03, + 0x29, 0x5a, 0xc5, 0x1b, 0x41, 0xef, 0x3d, 0xb9, 0xe3, 0x1e, 0xd7, 0x3f, 0xb6, 0x6f, 0x46, 0xe1, 0x1b, 0xe5, 0xf3, 0x66, 0xb5, 0xbd, 0xe1, 0xe3, 0x7f, 0x5a, 0xbc, 0x1f, 0x51, 0x53, 0xff, 0xa0, + 0xab, 0x3b, 0x4a, 0xd3, 0xcc, 0x72, 0x93, 0x9b, 0xfd, 0x63, 0xe1, 0x87, 0x7a, 0x25, 0xbe, 0xa0, 0x9e, 0x05, 0xe1, 0x7a, 0x7d, 0x4e, 0xd6, 0x19, 0x20, 0x06, 0x5e, 0x85, 0x88, 0x71, 0x6d, 0x24, + 0xb3, 0x16, 0x98, 0xad, 0x24, 0x6f, 0x87, 0xc5, 0x19, 0xa3, 0xd6, 0x0e, 0x33, 0x91, 0xfb, 0x28, 0x5b, 0xc6, 0x3e, 0x11, 0xef, 0x09, 0xc1, 0x16, 0x17, 0xb1, 0xeb, 0x95, 0xeb, 0x48, 0x25, 0xa7, + 0x21, 0xb4, 0xc7, 0x93, 0x62, 0x3a, 0x75, 0xec, 0x56, 0x9f, 0x03, 0x3d, 0xd5, 0xdb, 0xd0, 0x56, 0x99, 0xf4, 0x0b, 0x83, 0x86, 0xe7, 0xf0, 0x61, 0xef, 0xb1, 0x46, 0xbd, 0x1a, 0x98, 0x10, 0x72, + 0xaa, 0xdc, 0xab, 0x43, 0xfb, 0x7d, 0xb7, 0x92, 0x6f, 0x08, 0xf8, 0xa6, 0x66, 0xe0, 0xad, 0x9d, 0xdb, 0x03, 0x04, 0x7c, 0x46, 0x7d, 0x22, 0xe0, 0xf3, 0xf5, 0x79, 0xf7, 0x36, 0x80, 0x80, 0xab, + 0x14, 0x77, 0x56, 0xd0, 0x78, 0x1a, 0x6f, 0x8f, 0x75, 0x9f, 0xb4, 0xab, 0xed, 0x16, 0xcd, 0xf6, 0xae, 0x1a, 0x3b, 0x20, 0x0b, 0x79, 0xde, 0x2e, 0x0a, 0x35, 0xed, 0xd0, 0x1a, 0x01, 0xe0, 0xe6, + 0xf0, 0x7e, 0x1a, 0xe7, 0x52, 0x3b, 0xf5, 0x01, 0x97, 0x2b, 0x75, 0x41, 0x9f, 0xb6, 0x3a, 0x45, 0xc1, 0x01, 0x32, 0x37, 0xfd, 0xb1, 0x0f, 0x4f, 0x98, 0xcd, 0xf4, 0x34, 0xce, 0x77, 0xfe, 0xc2, + 0x2a, 0x83, 0x81, 0x86, 0x6c, 0x67, 0x46, 0x51, 0x70, 0xed, 0x34, 0xf2, 0x58, 0x15, 0x9e, 0x41, 0x19, 0xf8, 0xb1, 0x19, 0xba, 0x17, 0x5f, 0xd4, 0x4d, 0xb9, 0x45, 0x1f, 0xa8, 0x61, 0xf2, 0x0a, + 0x0b, 0x8e, 0xde, 0x0c, 0x46, 0x67, 0xb4, 0xfb, 0x84, 0x2f, 0xc9, 0xbd, 0x1f, 0xf1, 0x2e, 0xd1, 0x88, 0xeb, 0x34, 0x96, 0xfc, 0x29, 0x9c, 0xcf, 0xdd, 0x68, 0x93, 0x86, 0x05, 0xb8, 0xb5, 0x51, + 0xfa, 0xc0, 0x5b, 0x65, 0x8a, 0x26, 0xc4, 0x38, 0x56, 0x44, 0x1a, 0xe3, 0x76, 0x46, 0x1b, 0x4e, 0x28, 0x3e, 0xd2, 0xbc, 0xb1, 0x26, 0x9a, 0x31, 0x77, 0x5a, 0x31, 0xa4, 0x0f, 0x1d, 0x7c, 0x02, + 0x2d, 0x36, 0xd4, 0xf8, 0xd4, 0xb4, 0xf2, 0x0e, 0x99, 0x2a, 0xcb, 0xe4, 0xc6, 0xb6, 0xf9, 0x3b, 0xda, 0x64, 0xdf, 0x44, 0xe7, 0x8d, 0x1f, 0xaa, 0x49, 0x70, 0xc5, 0x3c, 0x53, 0xe5, 0x7c, 0x35, + 0x1a, 0x0f, 0xab, 0x3f, 0xe0, 0x3b, 0x3c, 0xdc, 0x2a, 0x85, 0x61, 0x59, 0x08, 0xe5, 0x4e, 0x16, 0xc1, 0xe2, 0xb8, 0xb2, 0x5c, 0x91, 0x5c, 0x59, 0xeb, 0x63, 0x0e, 0xd7, 0x45, 0xc8, 0xae, 0x40, + 0x6e, 0x29, 0x82, 0xbc, 0x3e, 0x26, 0x37, 0x06, 0x2c, 0x29, 0xda, 0xbe, 0x94, 0x26, 0x0a, 0xbc, 0x80, 0xfb, 0x46, 0x9f, 0xb3, 0x09, 0xac, 0x31, 0x10, 0x6e, 0xb7, 0xc7, 0x49, 0x29, 0x2c, 0x91, + 0x35, 0xba, 0x8f, 0x92, 0x23, 0xac, 0x6b, 0xf7, 0x0e, 0xad, 0x06, 0x5b, 0x85, 0xff, 0xd1, 0xda, 0x36, 0x76, 0xd3, 0xf6, 0x06, 0x5f, 0xa8, 0x87, 0xf4, 0xc4, 0x13, 0xe0, 0x13, 0x53, 0xdc, 0xb4, + 0x1d, 0x51, 0xc3, 0xb4, 0x03, 0x90, 0x5a, 0x5b, 0x2b, 0x12, 0xa4, 0x58, 0xf6, 0xed, 0x6e, 0x52, 0xe1, 0x88, 0x57, 0x17, 0x52, 0x2e, 0xd3, 0x52, 0xc6, 0x77, 0xaa, 0x96, 0x92, 0x93, 0x5a, 0xc2, + 0x2c, 0x9e, 0x70, 0x16, 0x64, 0x1b, 0xb7, 0x12, 0xd0, 0xb4, 0xec, 0x3a, 0x03, 0x8b, 0xe9, 0x7c, 0x36, 0x9e, 0x16, 0x3b, 0x91, 0x9c, 0x96, 0x33, 0x69, 0x06, 0x97, 0xc7, 0xd4, 0xa0, 0xc6, 0xeb, + 0x31, 0x4c, 0x68, 0xcc, 0x3e, 0x24, 0x97, 0xf7, 0x38, 0x72, 0x5b, 0x61, 0xfc, 0x8f, 0x73, 0x4b, 0x68, 0xf0, 0xdc, 0x46, 0xec, 0x59, 0x71, 0x7c, 0xaa, 0xe0, 0x69, 0x9b, 0xb1, 0x1b, 0xd9, 0x66, + 0xe9, 0x8e, 0x42, 0xf7, 0x1a, 0x8f, 0x80, 0xff, 0x46, 0xde, 0x07, 0x1c, 0x38, 0xee, 0xf9, 0xa9, 0xa0, 0x77, 0xbf, 0xc6, 0x78, 0xfd, 0xfd, 0x15, 0xe4, 0x8b, 0xe2, 0x2c, 0x1f, 0xba, 0x2c, 0x7c, + 0xd1, 0x9a, 0xe5, 0xf9, 0x4f, 0x1d, 0x5d, 0xda, 0xa4, 0x96, 0x9f, 0x2d, 0xa6, 0x33, 0xdb, 0x8b, 0xd8, 0x3c, 0xbf, 0x2c, 0x33, 0xed, 0xd0, 0x3c, 0xb8, 0xcf, 0xfd, 0xc5, 0x9f, 0x7b, 0xab, 0xbc, + 0x79, 0xb6, 0x70, 0x4d, 0x67, 0x94, 0x85, 0x87, 0x51, 0x9d, 0x9d, 0x1f, 0x20, 0x3e, 0xc6, 0x44, 0x14, 0xae, 0x73, 0x69, 0x34, 0xf6, 0xc5, 0x7f, 0xae, 0x8a, 0x20, 0x1e, 0x25, 0x6e, 0x1b, 0x5d, + 0x25, 0xfe, 0xab, 0x47, 0x3e, 0xf4, 0x7f, 0x82, 0xc9, 0xf7, 0xbf, 0x77, 0x66, 0x71, 0x28, 0xdf, 0xb9, 0x0d, 0xa0, 0xdf, 0xc8, 0x03, 0x51, 0x96, 0xff, 0xa0, 0x19, 0x73, 0x9e, 0x07, 0xef, 0xee, + 0xdc, 0x6f, 0x10, 0x05, 0x93, 0x0f, 0xf8, 0x02, 0x6f, 0x35, 0x88, 0x7a, 0x02, 0xbb, 0x3f, 0xf7, 0x84, 0x25, 0xad, 0x6b, 0x21, 0x09, 0x2c, 0xb7, 0x3a, 0x90, 0xef, 0x84, 0x36, 0x64, 0xab, 0x75, + 0xde, 0xd3, 0xf5, 0xc9, 0xf6, 0xd3, 0x4d, 0x30, 0xa3, 0xf6, 0xce, 0x09, 0x98, 0x6f, 0x17, 0xd2, 0xac, 0x0e, 0x64, 0x19, 0x10, 0x57, 0xeb, 0x15, 0x6b, 0x23, 0xfc, 0x8a, 0xd6, 0x22, 0xcb, 0x0f, + 0x17, 0xed, 0xae, 0x02, 0xc7, 0x60, 0xb2, 0x36, 0x4e, 0x0c, 0xa7, 0xc3, 0x2d, 0x2a, 0xbb, 0xaa, 0xc0, 0x91, 0x1f, 0x9b, 0xe3, 0xff, 0x54, 0x1b, 0xfe, 0xa3, 0x5c, 0xbb, 0xf6, 0x22, 0xfa, 0x7a, + 0x05, 0x7f, 0xc4, 0x57, 0x7b, 0x81, 0x3c, 0xab, 0xc4, 0xa7, 0x8b, 0x11, 0x3c, 0xcc, 0x5f, 0x4b, 0xe6, 0x84, 0xc2, 0x1c, 0x36, 0x2b, 0x75, 0xbc, 0x22, 0x2b, 0xdb, 0x53, 0xc4, 0x8e, 0x3c, 0x40, + 0x14, 0x6f, 0x4b, 0xad, 0xe1, 0x58, 0xed, 0x9c, 0xc9, 0x7d, 0x17, 0x54, 0x8d, 0x30, 0x5d, 0xf6, 0xc7, 0x04, 0x44, 0x77, 0x8b, 0x59, 0x5b, 0x09, 0x53, 0xbd, 0xd2, 0x16, 0x27, 0x1a, 0x15, 0xc8, + 0x4a, 0xec, 0x33, 0xbb, 0x9f, 0x4e, 0x67, 0x87, 0x06, 0x10, 0x11, 0x11, 0xeb, 0x20, 0xc8, 0x58, 0x09, 0x77, 0x6b, 0x71, 0xdc, 0x73, 0xb1, 0x0e, 0xf1, 0x5e, 0xc4, 0x6e, 0xe5, 0xa7, 0xce, 0xad, + 0x8d, 0xdc, 0x63, 0x25, 0x18, 0xae, 0x98, 0x67, 0x22, 0x9e, 0xaf, 0x86, 0x96, 0x5b, 0x08, 0xec, 0x88, 0x66, 0x5d, 0x3e, 0xe7, 0x63, 0x9c, 0xec, 0xe7, 0x55, 0x62, 0x40, 0x2e, 0x00, 0x73, 0x48, + 0xb7, 0x5f, 0x3a, 0x4d, 0xcf, 0xa7, 0x66, 0xbd, 0xde, 0x8f, 0xd5, 0x09, 0x8d, 0x2a, 0x0d, 0x0b, 0x36, 0xe2, 0x3c, 0x70, 0xe7, 0x44, 0xee, 0xc9, 0x51, 0xbb, 0x37, 0xf6, 0xc0, 0x8c, 0xa6, 0x44, + 0xca, 0x12, 0xb5, 0xe5, 0x96, 0x82, 0xea, 0xe8, 0x94, 0xee, 0xd3, 0x29, 0x8b, 0xa0, 0xa5, 0x82, 0xfc, 0x4d, 0xf1, 0x1e, 0xd8, 0xf8, 0x3c, 0x0e, 0xec, 0x22, 0x7d, 0xee, 0x63, 0xf9, 0xb5, 0xdd, + 0xf4, 0x48, 0x81, 0x98, 0x57, 0xd8, 0x27, 0x6a, 0xbe, 0x0c, 0xce, 0xb1, 0x17, 0x03, 0xea, 0x16, 0x64, 0x72, 0xdc, 0xb7, 0xa0, 0xb6, 0xb7, 0x5b, 0x6d, 0x91, 0xcd, 0x28, 0x73, 0x49, 0xe5, 0x20, + 0xa4, 0x09, 0x2d, 0xc7, 0x77, 0x87, 0x23, 0xb3, 0x5b, 0x91, 0x1d, 0x64, 0xa6, 0x50, 0xeb, 0xe4, 0x59, 0x51, 0xf4, 0x33, 0x73, 0xac, 0x27, 0x27, 0xce, 0xee, 0x09, 0x4f, 0x92, 0x8d, 0x82, 0x6c, + 0x52, 0x9f, 0x54, 0x60, 0x28, 0x5c, 0xf8, 0xf4, 0xc4, 0xe2, 0x6d, 0x56, 0x09, 0xb1, 0x96, 0x3d, 0xa8, 0x77, 0x0b, 0x0c, 0x7e, 0x73, 0xac, 0x5d, 0x98, 0xf6, 0x9b, 0x45, 0xe6, 0xdd, 0x1a, 0x95, + 0x05, 0x76, 0xfa, 0xda, 0x07, 0x14, 0x79, 0x68, 0x01, 0x21, 0x7f, 0xc8, 0xaa, 0xf7, 0x1a, 0xff, 0xed, 0x5f, 0xf0, 0x15, 0x07, 0x2f, 0x7f, 0xd3, 0x4f, 0x39, 0xf8, 0x82, 0x0a, 0x8e, 0x5e, 0xaf, + 0x47, 0x67, 0xac, 0xfb, 0xfc, 0x5b, 0x67, 0x0c, 0x77, 0xf4, 0x5a, 0x7b, 0x3a, 0xdb, 0x5b, 0x94, 0xe8, 0x06, 0x87, 0x5d, 0x89, 0xc4, 0x93, 0x55, 0xaf, 0xed, 0xc5, 0x9e, 0xae, 0x45, 0x24, 0x15, + 0x6d, 0x9a, 0x22, 0x29, 0xd6, 0x25, 0xe5, 0xca, 0x85, 0x00, 0x7d, 0x4f, 0x1f, 0x5b, 0x78, 0xa5, 0xb8, 0xce, 0xcc, 0xaf, 0x77, 0x6b, 0x31, 0x64, 0x8f, 0x5b, 0xbd, 0xdf, 0xf0, 0x68, 0x92, 0x4d, + 0xa9, 0xa8, 0xde, 0xf9, 0x0b, 0x9d, 0x59, 0x3b, 0xf7, 0xf8, 0xf7, 0x03, 0x22, 0xff, 0x6d, 0x85, 0x7f, 0x4c, 0x93, 0xd2, 0xf6, 0xa3, 0x20, 0x09, 0xdd, 0xd7, 0xba, 0xc9, 0xdf, 0xf2, 0x2e, 0xbe, + 0x1d, 0xad, 0x85, 0x3f, 0x62, 0x00, 0x07, 0xb1, 0x7b, 0x9e, 0x5a, 0xb1, 0x3b, 0x3a, 0x23, 0xdc, 0x67, 0xca, 0x7e, 0x2b, 0x86, 0x1b, 0x97, 0xd9, 0xa1, 0x70, 0x21, 0x6c, 0x02, 0xb3, 0x28, 0x27, + 0xfc, 0x92, 0x35, 0xd6, 0xdc, 0xe2, 0xd0, 0xac, 0x6d, 0x90, 0x2b, 0x8e, 0xa9, 0x47, 0x27, 0x93, 0x48, 0xa8, 0x2a, 0x0f, 0x33, 0x8f, 0x72, 0x93, 0x07, 0x32, 0x4d, 0x4a, 0xa5, 0x9b, 0x58, 0x76, + 0x9a, 0xda, 0xd5, 0x1a, 0x77, 0xf0, 0x5d, 0x89, 0x9b, 0xb9, 0xa1, 0x4d, 0x68, 0x40, 0xb3, 0xc2, 0x75, 0xe5, 0x07, 0x77, 0xb3, 0xbe, 0x3f, 0xc5, 0xdc, 0x5c, 0x29, 0xf1, 0xcb, 0x8e, 0x82, 0xb7, + 0x81, 0x36, 0x43, 0xb9, 0x38, 0x1e, 0x78, 0xd8, 0x70, 0x26, 0x8c, 0x73, 0x2b, 0x69, 0x18, 0xfe, 0x8d, 0x3d, 0xe2, 0xde, 0xb9, 0x82, 0x3e, 0xd3, 0xdd, 0xb1, 0x46, 0x17, 0xa0, 0xfb, 0xb4, 0x2f, + 0xc5, 0xfd, 0xb8, 0x56, 0x08, 0x47, 0x8f, 0x9a, 0x4a, 0x5d, 0x9d, 0xda, 0xf6, 0xc4, 0xce, 0x20, 0xb1, 0x0e, 0x7c, 0x85, 0x0f, 0x18, 0x62, 0xd7, 0xd1, 0x96, 0x84, 0x6d, 0xd5, 0xd3, 0x6c, 0x3a, + 0xa1, 0xe2, 0xbd, 0xde, 0x08, 0x87, 0x22, 0x95, 0x84, 0x56, 0x97, 0x24, 0x61, 0x2d, 0xae, 0xc8, 0xe9, 0xd2, 0x62, 0x00, 0x98, 0xd9, 0x29, 0x91, 0x90, 0xae, 0xe1, 0xfd, 0x14, 0x49, 0xf6, 0xe8, + 0x41, 0x6f, 0xee, 0xd1, 0xfe, 0x4f, 0xad, 0x10, 0xf1, 0x25, 0x2c, 0xfa, 0xf6, 0xe1, 0x18, 0xfc, 0x1b, 0xfd, 0x79, 0x8e, 0xd6, 0x2b, 0xee, 0x33, 0x3d, 0xcf, 0x83, 0xd1, 0x05, 0xee, 0x3e, 0x49, + 0x8d, 0x99, 0x0e, 0x58, 0x62, 0x8c, 0xf5, 0xbb, 0xdd, 0x1c, 0xd0, 0xb3, 0x69, 0x41, 0xef, 0xa9, 0x64, 0x0d, 0xed, 0x0f, 0xcb, 0xa9, 0x2e, 0xee, 0x20, 0xa9, 0xda, 0xc1, 0xbc, 0xa1, 0xce, 0x9b, + 0x71, 0x09, 0x00, 0x3b, 0x3e, 0xb4, 0x0f, 0x8a, 0xb9, 0x83, 0x0e, 0x38, 0x30, 0x96, 0x91, 0x7a, 0x39, 0xde, 0x1c, 0xa5, 0x63, 0xdf, 0x95, 0xec, 0x04, 0xee, 0x4f, 0xb5, 0xca, 0x61, 0x90, 0xdf, + 0x9b, 0xae, 0x16, 0xdc, 0x5b, 0x74, 0x6f, 0xaf, 0x11, 0xaf, 0x02, 0xf7, 0x2c, 0x5d, 0x3f, 0x15, 0xed, 0xc1, 0xfc, 0x48, 0x46, 0x97, 0xaa, 0xbd, 0x37, 0x85, 0xfb, 0x91, 0x20, 0x92, 0x57, 0xd8, + 0x33, 0x3b, 0x9e, 0x07, 0x43, 0xc2, 0x41, 0x9e, 0xb8, 0xb1, 0xa4, 0x8e, 0xed, 0x26, 0x81, 0x88, 0x6d, 0x07, 0x2e, 0x5b, 0xe1, 0x88, 0xf6, 0x4a, 0xa8, 0x04, 0x21, 0xb2, 0xda, 0x35, 0x87, 0xcc, + 0xec, 0xc2, 0x99, 0xc1, 0x04, 0x07, 0x0e, 0x97, 0x4f, 0x38, 0x4f, 0x71, 0xd6, 0xa6, 0x6b, 0xdb, 0xfd, 0x76, 0x53, 0x9d, 0x98, 0x1d, 0x40, 0x44, 0x4a, 0x3a, 0xe3, 0x38, 0x07, 0x15, 0xd0, 0xa5, + 0xd6, 0xae, 0xda, 0xa6, 0xae, 0x93, 0x92, 0xdc, 0x4f, 0x40, 0xd6, 0xa5, 0xff, 0xa6, 0x80, 0x0f, 0xa9, 0x15, 0xf8, 0xb6, 0x8d, 0xf7, 0x57, 0xc4, 0x44, 0x1f, 0xb3, 0x24, 0x9f, 0x51, 0x2f, 0xb4, + 0xbc, 0x5c, 0x8f, 0xd0, 0x61, 0xd6, 0xe4, 0x8a, 0xc8, 0x70, 0xd4, 0x97, 0x83, 0xa7, 0x35, 0x91, 0x9f, 0x31, 0x6d, 0x0b, 0xab, 0x44, 0x80, 0x12, 0xc0, 0xa4, 0x5b, 0x16, 0x82, 0x2a, 0x60, 0x9a, + 0x24, 0xd1, 0xbd, 0x81, 0x2a, 0x82, 0xcd, 0x41, 0x22, 0xdf, 0x59, 0x6d, 0xe6, 0xc5, 0x0a, 0xc8, 0x43, 0x58, 0x3f, 0xa7, 0xfb, 0x56, 0xa2, 0xf6, 0xdb, 0x8e, 0xb1, 0x35, 0xbc, 0x42, 0xf7, 0x02, + 0xb0, 0xc6, 0xcc, 0x7c, 0x22, 0x09, 0x4b, 0xf6, 0x71, 0xc1, 0x3e, 0x1b, 0x3f, 0x23, 0xf7, 0x94, 0x99, 0xc9, 0x33, 0x51, 0xce, 0xfe, 0x03, 0xe2, 0x87, 0x02, 0xfe, 0xdf, 0x86, 0x72, 0x23, 0xb8, + 0xb9, 0x77, 0x7d, 0x22, 0xdf, 0x03, 0xce, 0xcd, 0x2b, 0xe8, 0x33, 0x2f, 0x82, 0xb2, 0x3a, 0xbb, 0xe4, 0x07, 0x38, 0x36, 0x57, 0xe5, 0x31, 0x09, 0xc7, 0x56, 0x8b, 0xea, 0xab, 0x5c, 0xef, 0x2d, + 0xa7, 0x9b, 0x04, 0x7c, 0x29, 0xaa, 0xac, 0xe8, 0x09, 0x00, 0xb0, 0x5f, 0x2c, 0x88, 0x31, 0x35, 0x3d, 0x95, 0x78, 0xe6, 0x4e, 0x6b, 0x4c, 0x3b, 0x8c, 0x93, 0xc2, 0x4d, 0x4c, 0x5c, 0x50, 0x4e, + 0x82, 0x7e, 0x2a, 0xa4, 0x5d, 0xde, 0xb6, 0xd0, 0x2a, 0x6e, 0x2b, 0x40, 0x76, 0x3d, 0xb2, 0x38, 0x1c, 0xea, 0x38, 0xdc, 0x71, 0xfd, 0xad, 0x86, 0xd6, 0xf7, 0xa9, 0xf2, 0xc6, 0xf1, 0xf2, 0xb5, + 0xa5, 0xfe, 0xc8, 0xe9, 0xd5, 0x47, 0xf0, 0xb7, 0x54, 0xba, 0xde, 0x1a, 0x7a, 0x8e, 0x25, 0x8d, 0x0b, 0xf2, 0xe0, 0x3b, 0x24, 0xd4, 0xf9, 0x02, 0x08, 0x1d, 0x61, 0x01, 0x9d, 0x20, 0x93, 0x63, + 0xeb, 0x6a, 0xa8, 0x17, 0xb0, 0x07, 0xca, 0x76, 0x84, 0xf6, 0xb8, 0x72, 0x90, 0x15, 0x81, 0x4b, 0x30, 0x8a, 0xd9, 0x00, 0x3f, 0x3b, 0x2d, 0xa6, 0xb9, 0xa3, 0xaf, 0x25, 0x78, 0xbb, 0x9e, 0xd4, + 0x73, 0xef, 0xa0, 0x5a, 0xf4, 0xbe, 0x9f, 0x78, 0x8d, 0x7e, 0x14, 0xf7, 0x8c, 0xcb, 0x1f, 0x72, 0x1e, 0x7e, 0x3c, 0x79, 0xd2, 0x2c, 0x8a, 0x4b, 0xa4, 0xdd, 0x17, 0xd9, 0x36, 0xc1, 0xfb, 0x74, + 0xee, 0x2f, 0x3c, 0x62, 0xaf, 0x71, 0x69, 0x97, 0x8e, 0x48, 0x3f, 0xb7, 0xea, 0x07, 0x75, 0x70, 0x8f, 0xbf, 0x5d, 0x55, 0x7f, 0xce, 0xcd, 0x33, 0xff, 0xae, 0x8b, 0xe8, 0x7d, 0x8e, 0xe1, 0xf3, + 0xa8, 0xaf, 0xad, 0x1d, 0x67, 0x2c, 0xd0, 0x15, 0x62, 0x82, 0xbc, 0x32, 0xa5, 0x23, 0x97, 0xf1, 0x8f, 0x7d, 0x8e, 0xa5, 0xa7, 0x03, 0xdb, 0x99, 0xd3, 0x3d, 0xd5, 0xe9, 0x5a, 0x63, 0x73, 0x65, + 0x93, 0x2a, 0x26, 0xbb, 0xca, 0xc1, 0x12, 0x3b, 0x69, 0x4b, 0x1c, 0xd4, 0x34, 0x11, 0xaf, 0x7a, 0x42, 0xa6, 0x4e, 0xb4, 0x50, 0xb1, 0xc9, 0x56, 0x00, 0x2b, 0xad, 0x9a, 0xa3, 0xaa, 0xbc, 0x8b, + 0x6e, 0x70, 0xec, 0x36, 0x0d, 0x12, 0xb3, 0xaa, 0x0b, 0x33, 0x1a, 0xd9, 0x69, 0x9c, 0x99, 0x37, 0x7b, 0x8a, 0xc0, 0xe7, 0x78, 0xad, 0x9f, 0x12, 0xe4, 0x03, 0x36, 0x38, 0xfa, 0x78, 0xe7, 0xec, + 0x29, 0xb9, 0x7b, 0xe4, 0xbe, 0x2d, 0x70, 0x90, 0xa8, 0x9c, 0x3d, 0xdb, 0xb5, 0x49, 0x21, 0x96, 0x59, 0x63, 0x35, 0xb2, 0xb6, 0x84, 0xad, 0x4c, 0xb4, 0x7f, 0xfa, 0xb1, 0xa9, 0xe3, 0x8e, 0xd2, + 0x72, 0x54, 0x57, 0xc1, 0x37, 0x2d, 0x15, 0xd1, 0x07, 0x12, 0x6a, 0xdf, 0x21, 0x3f, 0x7d, 0xe8, 0xdb, 0xf1, 0xf9, 0x28, 0x67, 0x40, 0x62, 0xad, 0xd7, 0x24, 0x1a, 0x55, 0x19, 0x96, 0x4c, 0xa8, + 0xde, 0x74, 0x81, 0x4d, 0xe8, 0x0e, 0xed, 0x04, 0x30, 0x99, 0x72, 0xdd, 0x51, 0x51, 0x67, 0xf8, 0xe6, 0xe0, 0x33, 0x39, 0xd4, 0x63, 0xf3, 0x99, 0xc7, 0x03, 0x86, 0x96, 0x71, 0x2a, 0xbf, 0xdc, + 0x4d, 0x1c, 0x2b, 0xf0, 0x4e, 0x52, 0x28, 0x21, 0x98, 0x6b, 0x15, 0x30, 0xbe, 0x80, 0x78, 0xc2, 0x95, 0xd5, 0x55, 0x50, 0x0a, 0xf6, 0x86, 0x61, 0x17, 0xe8, 0xf7, 0x59, 0x0f, 0x4f, 0x83, 0x38, + 0xbd, 0x15, 0xba, 0x88, 0x3e, 0x64, 0xcd, 0x5c, 0x31, 0xaf, 0x54, 0x88, 0xd3, 0xe4, 0x1c, 0xb9, 0x3d, 0xc0, 0x8e, 0x39, 0x50, 0xb4, 0x41, 0xb0, 0x71, 0xe8, 0x4b, 0x61, 0xae, 0x85, 0xb2, 0x8d, + 0x40, 0x2d, 0x60, 0x78, 0x12, 0x81, 0xda, 0x2c, 0x67, 0x31, 0xa4, 0x9f, 0x88, 0x56, 0x65, 0xce, 0xad, 0x79, 0x35, 0xad, 0x63, 0xa3, 0x3c, 0x76, 0x1b, 0x7f, 0x1d, 0x52, 0x9c, 0x79, 0x94, 0x20, + 0x62, 0x8f, 0xed, 0x4f, 0x08, 0x19, 0x35, 0xf3, 0xa3, 0x81, 0x69, 0x04, 0xdb, 0xa8, 0x32, 0x7c, 0xea, 0xf7, 0xe4, 0x91, 0x55, 0x1e, 0x5f, 0x7c, 0x6d, 0x3f, 0x0d, 0x03, 0xc7, 0xbc, 0xb8, 0xa7, + 0xd1, 0xdf, 0xd8, 0x47, 0xd7, 0xbf, 0x55, 0x1f, 0xae, 0x3f, 0x21, 0xef, 0xd3, 0x21, 0xbe, 0xea, 0x2d, 0xf3, 0x85, 0x1e, 0x7c, 0x6b, 0xfe, 0x5c, 0x1a, 0xaa, 0xbf, 0x7b, 0x41, 0x56, 0x56, 0x85, + 0xeb, 0xfe, 0x2e, 0xdc, 0xb8, 0x7b, 0xd1, 0x92, 0xe4, 0xdb, 0x07, 0x4a, 0x37, 0x6e, 0xae, 0xce, 0x73, 0xe2, 0x37, 0xf6, 0xb1, 0xae, 0x7b, 0x9c, 0x45, 0xee, 0xa8, 0xce, 0xce, 0xe5, 0xf7, 0x92, + 0xf4, 0xb5, 0xd7, 0xd8, 0x17, 0x61, 0x7c, 0x97, 0x68, 0x82, 0x72, 0x64, 0xa7, 0x51, 0x7a, 0x79, 0x06, 0xfb, 0x18, 0x0f, 0x58, 0xa5, 0xf5, 0x9b, 0xbf, 0xf3, 0xdd, 0x4f, 0x75, 0xe2, 0xb8, 0x5e, + 0x69, 0x7a, 0xee, 0x0b, 0x3a, 0xf6, 0x59, 0x5d, 0x7f, 0xda, 0x8a, 0xbe, 0x0a, 0xde, 0x39, 0xfd, 0xe3, 0x3a, 0x7c, 0x64, 0x57, 0x3a, 0xd8, 0x97, 0xfc, 0xdc, 0xa3, 0x29, 0xcd, 0xdc, 0xc4, 0x4e, + 0xa3, 0xc8, 0xb5, 0xab, 0xa0, 0x71, 0xdf, 0x7d, 0xca, 0x7b, 0xe7, 0xc3, 0xfb, 0x07, 0xcf, 0x4e, 0x88, 0xe7, 0x3f, 0xfb, 0xf9, 0x8d, 0x77, 0x67, 0xd6, 0x7b, 0x77, 0xd1, 0x9d, 0xce, 0xb8, 0x8f, + 0x65, 0x55, 0x7c, 0xd5, 0x19, 0x77, 0x40, 0xae, 0x04, 0x3c, 0xaa, 0x1c, 0x79, 0x8f, 0x4e, 0x17, 0x46, 0x11, 0xac, 0xd4, 0xd8, 0xe3, 0x17, 0x5e, 0x94, 0xb2, 0x24, 0x11, 0x29, 0x75, 0x03, 0xfd, + 0xbb, 0xdb, 0xfe, 0x5f, 0x92, 0xe7, 0x93, 0x24, 0x7e, 0x45, 0x24, 0xec, 0xa1, 0x00, 0xb0, 0xf7, 0xd0, 0xe0, 0xe8, 0xc3, 0x8d, 0x11, 0x76, 0x3f, 0xf8, 0xeb, 0x6c, 0x66, 0x1d, 0x95, 0x63, 0xeb, + 0x68, 0xcb, 0x6a, 0x0c, 0x91, 0x9b, 0x65, 0x40, 0xe7, 0x53, 0x6d, 0x9c, 0xee, 0xd7, 0xe5, 0x61, 0x8f, 0x30, 0x39, 0xbd, 0xe8, 0x4b, 0x44, 0xcc, 0xc2, 0x78, 0x6c, 0x4a, 0xba, 0x75, 0x8c, 0x01, + 0x83, 0x51, 0x19, 0x5b, 0x1d, 0x6f, 0xbd, 0x39, 0xbf, 0x2b, 0xc6, 0xf5, 0x86, 0x37, 0x62, 0x13, 0x72, 0xbb, 0xb1, 0x87, 0x45, 0x07, 0xae, 0x08, 0x27, 0x90, 0xa9, 0x41, 0xd2, 0x26, 0x7d, 0x5c, + 0x45, 0xbd, 0x91, 0xa7, 0xe7, 0x33, 0xb8, 0x9f, 0x4e, 0x9f, 0x61, 0xcc, 0xca, 0xbe, 0xdd, 0xf0, 0xfe, 0x9c, 0x1d, 0x4f, 0x88, 0xe7, 0x05, 0x22, 0xab, 0x06, 0x15, 0xf2, 0x83, 0x47, 0x96, 0x03, + 0xf9, 0xcd, 0x36, 0x3d, 0x49, 0x5a, 0xbd, 0xb5, 0x13, 0x54, 0xf1, 0xbd, 0x20, 0x26, 0x51, 0x7d, 0x89, 0x03, 0xe3, 0x47, 0xa9, 0x67, 0x5a, 0x56, 0x71, 0x7e, 0xfe, 0xd7, 0x17, 0xc5, 0x04, 0xbe, + 0xd0, 0x58, 0x67, 0x22, 0x5c, 0xd5, 0x55, 0x56, 0xfd, 0x5c, 0x57, 0x0d, 0xd9, 0x85, 0xdd, 0x3c, 0xc3, 0xbd, 0xa5, 0x2f, 0x7e, 0x6e, 0xa7, 0x7e, 0xfd, 0x8a, 0x33, 0x37, 0xbe, 0xfa, 0xe1, 0xac, + 0x4b, 0x06, 0xd8, 0xb3, 0x19, 0xa2, 0xc2, 0xe5, 0x21, 0x0f, 0x8e, 0x68, 0xbf, 0xd9, 0x74, 0xf2, 0x14, 0xc2, 0x89, 0xd9, 0x01, 0xc6, 0x2d, 0xaf, 0x57, 0x58, 0xa0, 0x25, 0xfc, 0xce, 0x3d, 0xc4, + 0xd9, 0xb2, 0x31, 0xc6, 0x2b, 0xfe, 0x98, 0x57, 0x0b, 0x41, 0xa1, 0x97, 0x0d, 0x17, 0x1f, 0x27, 0x27, 0xb4, 0x13, 0x09, 0x7d, 0xe7, 0x52, 0xcd, 0x7a, 0x75, 0x08, 0x53, 0x5e, 0x10, 0x8f, 0xad, + 0xb4, 0x48, 0x0f, 0xb3, 0x74, 0xa3, 0xcd, 0x1f, 0xdf, 0x81, 0x7c, 0xee, 0x45, 0xfb, 0x1c, 0x5f, 0xf5, 0x46, 0xe1, 0x7f, 0xaa, 0x55, 0xfc, 0xb4, 0x80, 0x61, 0x1f, 0xa3, 0xdc, 0xdf, 0x2c, 0xb3, + 0xe8, 0xfb, 0x46, 0xa0, 0x8d, 0x19, 0x05, 0x97, 0x15, 0x36, 0x8b, 0x5f, 0x88, 0x16, 0x05, 0xb6, 0x9b, 0x5c, 0x53, 0x25, 0xd1, 0x87, 0x2a, 0x55, 0x0c, 0x0a, 0x47, 0x7a, 0xcb, 0xad, 0x9b, 0x51, + 0xdd, 0x8f, 0xad, 0x28, 0xef, 0xa1, 0x3f, 0x48, 0x46, 0xe5, 0x0f, 0x59, 0x5d, 0xce, 0x3b, 0x1c, 0xd7, 0x28, 0x31, 0xae, 0x44, 0xd5, 0x6a, 0x1a, 0x94, 0xac, 0x9a, 0x51, 0x5b, 0x64, 0xb1, 0xef, + 0x48, 0x27, 0x0f, 0xb3, 0x45, 0x30, 0x9e, 0x28, 0xdb, 0x1e, 0x5d, 0x98, 0x79, 0xc0, 0xe0, 0x6e, 0x5f, 0x5b, 0x10, 0x06, 0x23, 0xcc, 0xb6, 0xaf, 0xb4, 0x7d, 0xbb, 0x9f, 0xe0, 0x53, 0x7c, 0xb9, + 0xb6, 0xa4, 0x50, 0x47, 0xc4, 0xc4, 0x02, 0xe3, 0xd9, 0x58, 0xd5, 0xd3, 0xe3, 0x54, 0x6e, 0xed, 0x96, 0xbb, 0x27, 0x11, 0x7f, 0x2a, 0xa3, 0xe7, 0x5a, 0xf2, 0x2d, 0x48, 0xca, 0xec, 0xbb, 0x52, + 0x73, 0xc4, 0x03, 0xe4, 0x7d, 0x0f, 0x0d, 0x8e, 0x3e, 0xdc, 0x18, 0x9d, 0x51, 0xef, 0x93, 0xd7, 0x24, 0x32, 0x86, 0x75, 0x7c, 0xf8, 0xb4, 0x5e, 0xd2, 0x87, 0x5d, 0xb7, 0xdd, 0x2f, 0x0e, 0xdc, + 0xe6, 0x04, 0x9e, 0xda, 0x99, 0x51, 0x86, 0x3c, 0xbc, 0x77, 0x70, 0xf7, 0xa0, 0xeb, 0x3c, 0xca, 0x38, 0xb2, 0x3a, 0x36, 0x36, 0x22, 0xcf, 0xcc, 0xf6, 0xbb, 0x39, 0xe0, 0xb7, 0x1d, 0xc2, 0xed, + 0xa7, 0xc0, 0x24, 0x02, 0xb6, 0x1d, 0xa7, 0xd1, 0x7c, 0xd2, 0xf6, 0xe0, 0xb1, 0xf3, 0xc1, 0xbc, 0xae, 0xd6, 0xfb, 0x7b, 0x6b, 0xd1, 0xa3, 0x87, 0x36, 0x83, 0x93, 0xeb, 0x9f, 0x69, 0xf1, 0xdd, + 0xf1, 0xf2, 0xcf, 0x75, 0xde, 0x0b, 0xea, 0x1b, 0x6a, 0x5f, 0x8e, 0x98, 0x07, 0x68, 0xb6, 0xca, 0xed, 0x72, 0xae, 0x99, 0xab, 0x3d, 0x17, 0xe6, 0xd8, 0x84, 0x0a, 0x03, 0x72, 0xae, 0xa8, 0x34, + 0x05, 0x21, 0x7b, 0x46, 0x46, 0xf2, 0xf0, 0x14, 0x3b, 0xf4, 0x38, 0xe1, 0x3c, 0xa0, 0x3d, 0x0a, 0x1c, 0xad, 0x1e, 0x4e, 0xfd, 0x54, 0x35, 0xf8, 0xe9, 0x29, 0x9b, 0xe5, 0xd4, 0xa6, 0x61, 0xc8, + 0x4d, 0xec, 0xab, 0x7c, 0x01, 0x2c, 0xc9, 0x16, 0x9d, 0xf0, 0x63, 0x4a, 0x39, 0xa1, 0xb8, 0x8e, 0x6b, 0xf7, 0xfc, 0xab, 0xb7, 0x35, 0x9b, 0xe3, 0x7a, 0x41, 0xe2, 0x8e, 0xb2, 0x22, 0xcd, 0xdc, + 0xa2, 0x0a, 0xae, 0x87, 0xa3, 0xef, 0xe9, 0x72, 0x4e, 0xca, 0x1e, 0x99, 0x56, 0x59, 0x15, 0xa6, 0xfd, 0xbc, 0xff, 0x80, 0xc9, 0xdf, 0xd0, 0x28, 0x71, 0x4f, 0xd5, 0x03, 0x2a, 0xe9, 0x1f, 0x2a, + 0x6c, 0x72, 0xe5, 0xd5, 0x35, 0x78, 0xea, 0x96, 0x3c, 0xfc, 0x7c, 0x8f, 0xfa, 0x06, 0xf7, 0x55, 0x22, 0x9e, 0x46, 0x97, 0x92, 0x39, 0xf7, 0x65, 0x82, 0xaf, 0x69, 0x66, 0xbb, 0x17, 0xf6, 0x9b, + 0x22, 0x5a, 0x6a, 0x82, 0xc7, 0xae, 0xfb, 0x19, 0x6e, 0x65, 0x62, 0x8d, 0x56, 0x7a, 0x85, 0x9e, 0x9a, 0x23, 0xef, 0xc8, 0x4b, 0x09, 0x98, 0xbb, 0x3b, 0x28, 0xe2, 0xad, 0xf1, 0x9a, 0x54, 0x65, + 0x02, 0x9a, 0x9a, 0xb3, 0x93, 0x5f, 0xf3, 0x87, 0x7a, 0x8b, 0x68, 0x0b, 0x60, 0x71, 0x0c, 0xbb, 0x4d, 0x2b, 0xf4, 0x25, 0x8f, 0x19, 0x61, 0xb5, 0x8c, 0x3d, 0xff, 0xef, 0xea, 0xb6, 0x81, 0x2d, + 0x7a, 0x2e, 0x5f, 0xfb, 0xdb, 0x2c, 0xcb, 0xe0, 0x70, 0x6b, 0xe7, 0x3f, 0x7e, 0xc8, 0xf5, 0xfe, 0x0e, 0xf9, 0x85, 0xae, 0xd7, 0xf1, 0xd9, 0x93, 0x39, 0xc0, 0x05, 0x1f, 0x9c, 0x76, 0x08, 0x87, + 0xed, 0x58, 0xad, 0xa4, 0xb3, 0x2e, 0xd8, 0x8b, 0xfa, 0x3a, 0x56, 0x01, 0x84, 0x61, 0x33, 0x4d, 0x73, 0xb1, 0x65, 0x80, 0x6e, 0x00, 0x6f, 0xec, 0x02, 0xe6, 0x6a, 0x4e, 0xb3, 0x66, 0x8a, 0x99, + 0xf1, 0x5c, 0x56, 0xf1, 0x15, 0x24, 0x08, 0xb8, 0x0d, 0x72, 0x7b, 0x72, 0xe2, 0x8e, 0x89, 0xba, 0x9a, 0x9e, 0x90, 0x05, 0x47, 0x52, 0xfe, 0x69, 0x31, 0xc1, 0xb5, 0x6d, 0xbc, 0xae, 0x1f, 0x8f, + 0x15, 0xfc, 0x5c, 0x72, 0xe4, 0x43, 0x84, 0xdf, 0xa0, 0xc9, 0xf8, 0x75, 0x05, 0xab, 0x37, 0x0f, 0xbc, 0x17, 0xf4, 0x0b, 0xc2, 0xff, 0x3e, 0xb3, 0x34, 0x19, 0xb9, 0xa7, 0xa0, 0x1a, 0x45, 0xae, + 0x19, 0x8e, 0xbc, 0xc2, 0xbd, 0x7d, 0xdc, 0xfe, 0x88, 0x97, 0xfc, 0x13, 0xfa, 0x93, 0x64, 0x7d, 0xbc, 0x37, 0xb4, 0x8f, 0x8e, 0x52, 0x4f, 0x4d, 0xc3, 0xa0, 0x8f, 0xb2, 0x6b, 0xa0, 0xcd, 0xbe, + 0x3d, 0x08, 0x13, 0x92, 0x3b, 0xd1, 0x69, 0xb9, 0xac, 0x8b, 0x59, 0x40, 0xab, 0x50, 0x09, 0xa3, 0xc5, 0x12, 0xd6, 0xdb, 0xd8, 0x14, 0x01, 0xe0, 0xd8, 0xd8, 0x27, 0x91, 0x20, 0x68, 0x35, 0x95, + 0x1a, 0x37, 0x31, 0x5c, 0x2b, 0x9b, 0xd2, 0x48, 0x4c, 0xaa, 0x53, 0x18, 0x64, 0xd2, 0x52, 0xd4, 0xc5, 0xcd, 0x31, 0x91, 0xe9, 0x0c, 0x6c, 0xbf, 0xf5, 0xb1, 0x5d, 0x1b, 0x43, 0x7e, 0xad, 0xbc, + 0x1e, 0xf1, 0xab, 0x3e, 0x01, 0x9e, 0x69, 0x60, 0x0f, 0xf4, 0xa0, 0xaa, 0xb3, 0xd2, 0xcc, 0x50, 0x55, 0x65, 0xf7, 0xa5, 0x2c, 0x94, 0x73, 0x2a, 0x99, 0x4f, 0x71, 0x02, 0x43, 0x35, 0x93, 0xfa, + 0x3a, 0x63, 0x7c, 0xc0, 0xb4, 0xf8, 0x59, 0x4f, 0xcb, 0xcb, 0x61, 0x86, 0x59, 0xdd, 0xdc, 0xd4, 0x43, 0xbf, 0xa9, 0x47, 0x56, 0xf5, 0x17, 0xd8, 0x27, 0x72, 0xbc, 0x0c, 0x46, 0x67, 0xb4, 0xfb, + 0xb2, 0xb0, 0x3a, 0x4e, 0xd3, 0x2e, 0xcb, 0x80, 0xe3, 0x3a, 0x81, 0xab, 0x8a, 0x99, 0x33, 0xa7, 0x93, 0xef, 0x56, 0xd3, 0xb5, 0xbb, 0xaa, 0xa8, 0xde, 0xa7, 0x0f, 0x74, 0xe3, 0x62, 0x73, 0x8d, + 0x0d, 0x4e, 0xbb, 0x66, 0x3e, 0x53, 0x41, 0xcc, 0x64, 0xc2, 0x4a, 0xa3, 0xac, 0xda, 0x9b, 0xac, 0x39, 0x59, 0xde, 0x38, 0x7b, 0xc2, 0xe2, 0xab, 0x8c, 0xf3, 0xec, 0x45, 0x4d, 0x8d, 0x27, 0xa8, + 0xed, 0x30, 0xab, 0xc3, 0xf1, 0x30, 0x2c, 0x67, 0xe1, 0x7f, 0x98, 0x66, 0xe9, 0xd7, 0x55, 0x5a, 0xfa, 0x85, 0x59, 0xf9, 0x01, 0xd8, 0xa6, 0x85, 0x33, 0x7a, 0x22, 0xea, 0x75, 0xf6, 0x23, 0xef, + 0xf5, 0xc7, 0x39, 0x41, 0x2d, 0xb8, 0xa8, 0x06, 0xe8, 0xa3, 0x72, 0xf1, 0xcc, 0xf2, 0x69, 0x26, 0x34, 0x6e, 0x52, 0xfa, 0x95, 0x1b, 0x5c, 0x8e, 0x09, 0x91, 0x77, 0x0d, 0x55, 0xff, 0xfa, 0xeb, + 0xd7, 0x35, 0x45, 0xfd, 0xe9, 0xff, 0x8f, 0x3f, 0x84, 0x51, 0xfd, 0x28, 0x79, 0xfb, 0x5f, 0xff, 0xce, 0xc9, 0xdb, 0x69, 0xe3, 0x16, 0x51, 0x6a, 0x3a, 0x4f, 0x3a, 0xb5, 0x72, 0xbf, 0x6f, 0x33, + 0xf0, 0x48, 0x70, 0xd5, 0x17, 0xf8, 0x4f, 0xd2, 0xf3, 0xf9, 0xee, 0xf9, 0xa0, 0x72, 0x80, 0x18, 0x59, 0x84, 0x66, 0x58, 0xb1, 0x5f, 0x1f, 0x93, 0x9c, 0x4f, 0xd7, 0x90, 0x81, 0xf3, 0x62, 0x4f, + 0x83, 0x89, 0xef, 0x49, 0x09, 0x03, 0x91, 0xc6, 0x8e, 0xdd, 0xf6, 0xfd, 0x71, 0xb7, 0x69, 0xdd, 0x83, 0x85, 0xf1, 0x54, 0x3a, 0xa1, 0x69, 0x3a, 0x3b, 0xa1, 0x1e, 0x55, 0x23, 0x32, 0xe8, 0xa1, + 0xca, 0xc2, 0xa4, 0xa7, 0x3b, 0xe9, 0x88, 0x4b, 0xab, 0x64, 0xb1, 0xf7, 0x34, 0x38, 0x9d, 0x57, 0x55, 0xee, 0x0d, 0x14, 0xa3, 0xb7, 0xa9, 0x54, 0xcf, 0xf1, 0xe7, 0xf7, 0x49, 0x9c, 0x8d, 0xa2, + 0x20, 0x0e, 0x6e, 0x6d, 0x6a, 0x90, 0x87, 0xb2, 0x35, 0xae, 0x98, 0xe0, 0xe8, 0xf9, 0x6a, 0x84, 0x0c, 0xcb, 0xd6, 0x00, 0x41, 0x92, 0x8c, 0xe7, 0xea, 0x76, 0x75, 0x22, 0xa3, 0xd3, 0xb4, 0x6f, + 0x1d, 0x9a, 0x9e, 0xec, 0x56, 0x1c, 0xb2, 0xe9, 0xd4, 0x09, 0x8c, 0x00, 0xee, 0x52, 0x27, 0x36, 0x33, 0x0e, 0xd9, 0xe6, 0x5c, 0x4c, 0x87, 0xee, 0x7a, 0x4f, 0xe5, 0x27, 0xb9, 0x51, 0xeb, 0x6d, + 0xb7, 0x3b, 0xc6, 0xe8, 0x7c, 0x1f, 0x67, 0x13, 0x66, 0x53, 0xcf, 0x3d, 0x3b, 0xa4, 0x97, 0x39, 0x63, 0x2a, 0x8b, 0xfd, 0xec, 0x64, 0xe1, 0xf7, 0xb6, 0x31, 0xdf, 0x65, 0x00, 0x57, 0x45, 0xf7, + 0xeb, 0xdf, 0x1e, 0xee, 0x66, 0xf6, 0x07, 0x03, 0xdd, 0x7e, 0x18, 0xd9, 0xfc, 0x26, 0x77, 0xf9, 0x96, 0x49, 0xf7, 0x10, 0x5b, 0xd3, 0x6b, 0x0a, 0xe9, 0xf3, 0xe5, 0xd0, 0x23, 0x69, 0x99, 0xa0, + 0x0c, 0x03, 0x84, 0x5a, 0xfa, 0xb4, 0x5e, 0xd4, 0x68, 0xaa, 0x6f, 0xa2, 0x9e, 0x3c, 0x76, 0x60, 0x68, 0xf9, 0x25, 0x5f, 0x6c, 0x89, 0xed, 0xda, 0x20, 0xc4, 0x13, 0xc3, 0x4e, 0x0e, 0x2b, 0x0c, + 0x98, 0x23, 0x71, 0x35, 0x57, 0x11, 0x6f, 0x8d, 0xd8, 0x42, 0x35, 0xf1, 0x61, 0x9b, 0xd5, 0x43, 0xa9, 0xb4, 0xfa, 0xb9, 0x42, 0x2c, 0x01, 0x26, 0x95, 0xd7, 0x2e, 0xae, 0x57, 0x50, 0xba, 0x26, + 0xee, 0x99, 0xc8, 0xdf, 0xa6, 0x76, 0x5f, 0x85, 0xfe, 0x12, 0x2a, 0xfa, 0x73, 0xd6, 0x0e, 0x89, 0x8d, 0x7e, 0x16, 0x9f, 0xaf, 0x27, 0xd6, 0x23, 0x81, 0x6f, 0x67, 0xc4, 0x33, 0xf9, 0xab, 0xa2, + 0x3b, 0x07, 0x81, 0x0e, 0xa1, 0xfd, 0x38, 0x11, 0x69, 0x65, 0x47, 0xef, 0xa1, 0x09, 0x35, 0x43, 0x31, 0x70, 0x11, 0xa2, 0xf5, 0xca, 0x03, 0x09, 0x4d, 0xb7, 0x24, 0xbb, 0x4b, 0xfd, 0xed, 0xda, + 0x69, 0xe8, 0xd3, 0x52, 0xde, 0xf2, 0x07, 0x7f, 0x1e, 0x8d, 0x5d, 0x02, 0xf6, 0x95, 0x74, 0x91, 0x4c, 0x78, 0xa9, 0xa7, 0x6c, 0xd5, 0xd4, 0x4e, 0x02, 0xb2, 0x84, 0xa1, 0xf5, 0x6e, 0x0a, 0xa0, + 0xc7, 0x8d, 0xd3, 0x34, 0xe9, 0xba, 0xc5, 0x9d, 0x7b, 0x46, 0xf4, 0xe0, 0x99, 0xf1, 0x0d, 0xf9, 0x3e, 0x34, 0xde, 0xff, 0x5a, 0xed, 0x3f, 0x72, 0x2a, 0xf9, 0x0e, 0xf9, 0x89, 0x9c, 0x6f, 0xc7, + 0x43, 0x23, 0xad, 0x16, 0x12, 0xc2, 0xa8, 0x72, 0x26, 0x29, 0x24, 0x98, 0x02, 0x74, 0x4b, 0xea, 0x79, 0xe5, 0x19, 0x86, 0xe8, 0xf1, 0xb2, 0x6a, 0xe8, 0xa1, 0x15, 0x38, 0x0c, 0x15, 0x62, 0x45, + 0x16, 0x81, 0xfe, 0x14, 0x6d, 0x2a, 0x96, 0x9d, 0x78, 0x8b, 0x18, 0x59, 0x7a, 0x01, 0x9e, 0xab, 0x0a, 0x60, 0xa7, 0xb3, 0x45, 0x58, 0xec, 0xd7, 0x06, 0x7d, 0x62, 0x50, 0x2e, 0xad, 0xb0, 0xd0, + 0x2e, 0xe5, 0xc8, 0x07, 0x1e, 0xf7, 0x04, 0x3c, 0xed, 0x4d, 0xca, 0xa0, 0xba, 0x6e, 0x3a, 0x1e, 0xf3, 0xff, 0x0f, 0xe4, 0x4a, 0xe9, 0x9e, 0x8b, 0x14, 0xdd, 0x60, 0xc9, 0x63, 0x9d, 0x2c, 0x5e, + 0x61, 0x2f, 0xfc, 0xb8, 0x0e, 0x86, 0xf6, 0xb2, 0x08, 0x45, 0x60, 0x27, 0xe9, 0x74, 0x4f, 0x07, 0x4a, 0xd2, 0x0b, 0x91, 0x2a, 0xb8, 0x90, 0x13, 0xcc, 0x70, 0x0e, 0xc5, 0x4a, 0xca, 0x5a, 0xf9, + 0xd0, 0x76, 0x9a, 0x50, 0x98, 0xb8, 0xb4, 0x8c, 0xf9, 0xba, 0x10, 0xf4, 0x7a, 0x29, 0x4b, 0xa5, 0x14, 0xba, 0x2a, 0xa3, 0x9f, 0x7a, 0x65, 0x56, 0xb3, 0xbb, 0x8a, 0x52, 0x28, 0x3d, 0x6f, 0xf4, + 0xe9, 0x0a, 0x91, 0xd2, 0x71, 0x4f, 0xb5, 0x8e, 0x67, 0x7c, 0x2c, 0x20, 0x7a, 0xd3, 0x7c, 0xb3, 0x4c, 0xcb, 0x8d, 0xc0, 0x73, 0x36, 0xb6, 0x57, 0x98, 0x97, 0xb0, 0xda, 0x7f, 0x9d, 0xcb, 0x2d, + 0xbc, 0x73, 0x10, 0x5f, 0x52, 0x39, 0xcf, 0x15, 0xf6, 0x7f, 0x9d, 0x1b, 0xc3, 0xbf, 0x3b, 0xe2, 0xbd, 0x57, 0x79, 0xed, 0x8b, 0xbc, 0xaa, 0xaf, 0xaa, 0xa6, 0x5c, 0x96, 0x2a, 0xf4, 0x93, 0xc9, + 0xf6, 0x92, 0x7e, 0x85, 0xbe, 0x33, 0xbd, 0x86, 0x4a, 0x06, 0xfc, 0x0f, 0x2e, 0x65, 0xaf, 0x92, 0xf1, 0xee, 0xfe, 0x57, 0x64, 0xff, 0x5a, 0x1e, 0x11, 0xe4, 0x81, 0xd6, 0x05, 0x9f, 0xe0, 0xc1, + 0xd1, 0x9b, 0xc1, 0xe8, 0x82, 0x7a, 0x5f, 0x30, 0xb5, 0xb8, 0x4d, 0x10, 0x1c, 0x6f, 0x4c, 0x07, 0xc0, 0x67, 0x74, 0xce, 0x4c, 0x10, 0x1a, 0x57, 0xc0, 0xa9, 0x6d, 0x28, 0x19, 0x8e, 0x4c, 0xac, + 0x56, 0x89, 0x6d, 0x61, 0x65, 0x23, 0xb2, 0x58, 0xb7, 0x81, 0x0f, 0x87, 0x2d, 0x84, 0xec, 0x8e, 0x52, 0xa3, 0x2a, 0x6a, 0x64, 0xaf, 0x17, 0xd6, 0x44, 0x74, 0x00, 0x12, 0x84, 0x14, 0x6c, 0xc6, + 0x84, 0x82, 0x1d, 0xf4, 0xf2, 0x42, 0x2f, 0xcb, 0xec, 0x63, 0x1b, 0x83, 0x3b, 0x82, 0xe9, 0x07, 0x07, 0xff, 0x5c, 0x94, 0xe8, 0x59, 0x2e, 0x91, 0xaf, 0x4e, 0xe5, 0xef, 0xa9, 0x86, 0xdf, 0xd4, + 0x30, 0x73, 0xf2, 0x06, 0xb7, 0xee, 0xa5, 0xc3, 0xa1, 0xe7, 0x4a, 0x36, 0x3f, 0xe6, 0xd2, 0xd7, 0xe9, 0x70, 0x17, 0xb0, 0xfb, 0xcc, 0xa9, 0xb8, 0x1c, 0xb5, 0xb6, 0xfc, 0x09, 0x38, 0x6d, 0xb3, + 0xb6, 0xa1, 0x57, 0x49, 0x5f, 0xac, 0x21, 0x26, 0xc3, 0xa6, 0x1c, 0xaf, 0x1e, 0x9b, 0xf9, 0x4e, 0xc8, 0x08, 0x78, 0x2f, 0x6f, 0x4c, 0x9a, 0x51, 0x27, 0x9e, 0x6c, 0x51, 0x49, 0xb2, 0x0a, 0x26, + 0xe9, 0xde, 0x85, 0xaa, 0x39, 0x69, 0x2d, 0xc7, 0xc6, 0x5c, 0x40, 0xd3, 0xf8, 0x30, 0x91, 0x71, 0xbe, 0x49, 0xac, 0x5e, 0xd9, 0xef, 0x50, 0xae, 0x1b, 0xff, 0xa4, 0xe1, 0x3b, 0x3c, 0xfe, 0xfd, + 0x8f, 0xce, 0xac, 0xca, 0x1f, 0xb9, 0xa7, 0xa0, 0xbc, 0xd9, 0xe2, 0xfc, 0xb1, 0x72, 0xaf, 0x6f, 0x70, 0xcf, 0xca, 0xfc, 0x65, 0x34, 0xb4, 0xe4, 0xab, 0x19, 0x52, 0x52, 0x87, 0x49, 0xc4, 0x51, + 0xb7, 0x10, 0xb5, 0xb5, 0xdd, 0x0e, 0x9b, 0x67, 0xcd, 0x01, 0x59, 0xa7, 0xb4, 0x0d, 0x1a, 0x4b, 0x9f, 0xdb, 0x72, 0xc2, 0x76, 0x12, 0xcb, 0x71, 0x77, 0x10, 0xcb, 0x45, 0x1b, 0x2a, 0x4a, 0x05, + 0x79, 0x86, 0x09, 0xe5, 0x45, 0xb5, 0xe9, 0x81, 0x18, 0xaf, 0x56, 0x3b, 0x9a, 0xf5, 0x0c, 0x89, 0x9c, 0x27, 0xf1, 0x64, 0xbc, 0x59, 0x8c, 0x39, 0xb5, 0x23, 0xc0, 0x7b, 0xdb, 0x80, 0x3f, 0x61, + 0xf0, 0x3d, 0x7d, 0x6a, 0x70, 0xf6, 0xb5, 0xa7, 0x51, 0x7d, 0xd3, 0xfa, 0x7e, 0xd4, 0x68, 0x79, 0x0f, 0xfe, 0x4c, 0xda, 0x37, 0xb7, 0x86, 0x98, 0x2e, 0xf0, 0x68, 0x0e, 0xd5, 0x5b, 0x93, 0xe5, + 0x15, 0x5e, 0x04, 0x48, 0xb7, 0xc4, 0x0a, 0x6a, 0x97, 0x99, 0x89, 0x5f, 0xd9, 0x1a, 0xfc, 0x75, 0xd9, 0x9a, 0xa1, 0x14, 0x1a, 0x7c, 0x9c, 0x76, 0xfe, 0xb3, 0x43, 0xf7, 0x96, 0x69, 0x8c, 0x3e, + 0xe4, 0xc5, 0x7f, 0x06, 0x7d, 0x26, 0x4b, 0xe8, 0x76, 0xe7, 0x40, 0xef, 0x01, 0x6a, 0x20, 0x3d, 0xc6, 0x2e, 0x0f, 0xe5, 0x0e, 0xd0, 0x41, 0xc7, 0xb2, 0x67, 0xaa, 0x54, 0x1f, 0x93, 0x05, 0x24, + 0xba, 0x39, 0xe6, 0xb4, 0x1b, 0x26, 0x5c, 0x46, 0x53, 0xa1, 0xc6, 0x25, 0xcc, 0x1b, 0xc3, 0x91, 0x17, 0x96, 0xad, 0x56, 0xaf, 0x2b, 0xbd, 0xf0, 0x0f, 0xe9, 0x2e, 0xe3, 0x92, 0x6e, 0x69, 0xb3, + 0x31, 0x32, 0xde, 0xfb, 0xf9, 0x09, 0xc0, 0x76, 0x79, 0x8c, 0x2c, 0x93, 0x6d, 0xcb, 0xf9, 0x0c, 0xfe, 0x37, 0x0d, 0xe4, 0xc1, 0xe2, 0xf6, 0x5c, 0x8a, 0xf7, 0x96, 0xa0, 0xfd, 0x3c, 0x7e, 0xf1, + 0x15, 0xf6, 0x99, 0x96, 0x17, 0xa5, 0x0e, 0x0f, 0x6b, 0x09, 0xc2, 0xcd, 0x56, 0xbd, 0xa8, 0x30, 0x0c, 0x23, 0xca, 0x40, 0x37, 0x26, 0x7b, 0x0a, 0xa5, 0x21, 0xc6, 0x81, 0x3a, 0xcd, 0x22, 0x33, + 0x7a, 0xd2, 0x2d, 0xd4, 0x14, 0x0c, 0x31, 0x5d, 0x77, 0xf4, 0x43, 0xa6, 0x23, 0x20, 0xc2, 0x94, 0x42, 0x19, 0x96, 0xab, 0x22, 0x27, 0x22, 0x81, 0x3d, 0x15, 0x5d, 0xa1, 0x08, 0x09, 0xec, 0x1e, + 0x17, 0x78, 0x4a, 0x67, 0xa4, 0xe9, 0x37, 0xc2, 0x52, 0x9a, 0x91, 0xe5, 0x8f, 0x8b, 0x50, 0x9c, 0xff, 0xee, 0x6b, 0x94, 0xd7, 0x1f, 0xd6, 0x6c, 0x4f, 0xa8, 0xcf, 0x94, 0x39, 0xaf, 0x39, 0x03, + 0xb5, 0xda, 0x61, 0xb6, 0xb6, 0x48, 0xd3, 0xd8, 0xcc, 0xdc, 0x19, 0x58, 0x19, 0x6a, 0x49, 0x89, 0x38, 0x90, 0x43, 0x2b, 0x6a, 0xd3, 0x86, 0x4e, 0x84, 0x9f, 0x36, 0x0a, 0xb9, 0x3b, 0x26, 0x0b, + 0x11, 0xcd, 0x57, 0xca, 0x0a, 0xc2, 0x2d, 0x67, 0x73, 0x08, 0xad, 0x49, 0xc4, 0xed, 0xc9, 0xa5, 0xe3, 0x09, 0xe5, 0xb2, 0x9c, 0xf7, 0xc8, 0x44, 0x85, 0x0b, 0x5e, 0xd9, 0xa1, 0x5a, 0xcd, 0x33, + 0x11, 0xd9, 0x8b, 0x74, 0xf3, 0x1f, 0xa1, 0xd5, 0x06, 0xe4, 0x35, 0xfe, 0xfc, 0x7c, 0xe8, 0x76, 0x5e, 0xe3, 0x80, 0x73, 0xa1, 0x1c, 0xda, 0x80, 0x94, 0x6b, 0xb0, 0x7d, 0x5c, 0x40, 0x74, 0x1d, + 0x69, 0x9d, 0xd8, 0xf2, 0x9e, 0x71, 0xac, 0x5a, 0x03, 0x94, 0x27, 0x46, 0x64, 0xf1, 0xe8, 0x1a, 0x9d, 0x32, 0x85, 0x52, 0x84, 0x18, 0xb4, 0x43, 0xe8, 0xad, 0xbe, 0x24, 0x26, 0x9d, 0x0b, 0x31, + 0x8d, 0x1b, 0xce, 0x75, 0x74, 0x29, 0xc2, 0x7c, 0x85, 0xcc, 0xd8, 0x1a, 0x2a, 0x5c, 0x40, 0x41, 0x0c, 0x76, 0x99, 0x6d, 0xc2, 0x5a, 0xbd, 0xb7, 0xf7, 0xba, 0x47, 0xca, 0x7f, 0x32, 0xaf, 0x31, + 0x0b, 0x92, 0x5b, 0x5d, 0x20, 0xc9, 0xc7, 0xca, 0x95, 0x3f, 0x21, 0x9e, 0x59, 0x93, 0xa4, 0x23, 0x72, 0x60, 0xa1, 0x72, 0x92, 0xd3, 0xf9, 0x86, 0x98, 0xac, 0x55, 0x6d, 0xeb, 0x6d, 0x81, 0x10, + 0x4f, 0x19, 0x1b, 0x4f, 0x6d, 0xbb, 0xc3, 0x38, 0x13, 0xc8, 0x91, 0x52, 0x6c, 0xf7, 0x68, 0x8e, 0x44, 0xc7, 0x9d, 0x86, 0xd1, 0x46, 0x48, 0x34, 0x00, 0x16, 0xf2, 0x33, 0x24, 0xc5, 0x54, 0x82, + 0x1a, 0xcf, 0x3b, 0xd9, 0xcc, 0x7d, 0x13, 0x9f, 0xad, 0xcc, 0x63, 0x1c, 0xf2, 0x72, 0xa9, 0x56, 0x62, 0x36, 0xef, 0x36, 0x7b, 0x67, 0xe0, 0x2e, 0xcc, 0xac, 0xd2, 0x38, 0xb0, 0x47, 0x65, 0x74, + 0x29, 0x17, 0xf7, 0xc5, 0xf1, 0xdc, 0xd9, 0x35, 0x5e, 0xb8, 0xce, 0xf3, 0x21, 0xf8, 0xfb, 0x75, 0xe6, 0xaf, 0xbf, 0x7e, 0x7d, 0x75, 0x74, 0xf5, 0x45, 0xfd, 0x8d, 0x33, 0x49, 0x9e, 0x8f, 0xd3, + 0x47, 0x55, 0x61, 0x26, 0x65, 0x96, 0x16, 0x67, 0xcc, 0xe6, 0xd3, 0x4b, 0xcf, 0x0f, 0x97, 0x95, 0x33, 0x2a, 0xdd, 0x22, 0x38, 0x87, 0xcd, 0x5c, 0x77, 0x73, 0xf8, 0xa7, 0x27, 0x87, 0x94, 0xd9, + 0xcc, 0xeb, 0xc0, 0x0e, 0x47, 0x5e, 0x5a, 0xc4, 0x66, 0x35, 0xaa, 0x13, 0xb7, 0xb4, 0xcd, 0xec, 0xc2, 0xca, 0x73, 0x40, 0xd3, 0xbb, 0x7d, 0x5f, 0xe1, 0x9a, 0xd1, 0xb9, 0x08, 0x69, 0x50, 0x5c, + 0xbe, 0x04, 0xfa, 0x58, 0x92, 0xa4, 0x34, 0x3d, 0xf7, 0x53, 0x21, 0xe2, 0xeb, 0x8b, 0xd1, 0xf7, 0xb4, 0x29, 0xd3, 0x24, 0xb0, 0x47, 0x56, 0x9a, 0xc6, 0x2f, 0xb4, 0x7b, 0x1f, 0x14, 0xec, 0x9f, + 0xab, 0x88, 0x94, 0x55, 0xe1, 0x9a, 0xf1, 0xaf, 0x6f, 0x5c, 0xa6, 0x9f, 0x62, 0xe9, 0xae, 0xa2, 0xfb, 0xf4, 0xc3, 0xb0, 0x8a, 0xef, 0xb7, 0xe9, 0x7f, 0x6b, 0x0d, 0x7c, 0x40, 0xd1, 0x7f, 0xfd, + 0x8e, 0xe7, 0x09, 0xf1, 0xf9, 0x97, 0xa1, 0x55, 0xe1, 0x6d, 0xa2, 0x49, 0x31, 0x21, 0x53, 0xc7, 0xed, 0x72, 0x3b, 0x46, 0xfc, 0xbd, 0x62, 0xef, 0x30, 0x99, 0x29, 0x39, 0xd2, 0x88, 0x8e, 0xe5, + 0xde, 0x9b, 0x1c, 0x73, 0x05, 0x74, 0x91, 0x72, 0x7e, 0x8a, 0xe7, 0xcc, 0xdc, 0x08, 0x72, 0x58, 0xe3, 0xf6, 0x19, 0xc6, 0xe8, 0x5c, 0x55, 0xcf, 0x58, 0x5c, 0x64, 0xd8, 0x9c, 0x52, 0x61, 0xf7, + 0xa0, 0xe6, 0xb2, 0x95, 0x70, 0x7b, 0x11, 0x9b, 0xd7, 0x46, 0x2c, 0x0c, 0xac, 0x8d, 0xf5, 0xc4, 0xa1, 0x67, 0x5e, 0x3f, 0x73, 0x69, 0xfc, 0x29, 0x02, 0x3c, 0x8b, 0x82, 0x0a, 0x79, 0xf3, 0xdb, + 0x40, 0x86, 0x7c, 0x96, 0xf1, 0xaf, 0xb8, 0x81, 0x3f, 0xb8, 0x56, 0x7c, 0x7e, 0xc1, 0x33, 0x2b, 0x3e, 0xdc, 0x1e, 0xe1, 0xc3, 0x56, 0x10, 0x9b, 0x3d, 0x8a, 0x62, 0xc9, 0x00, 0x8d, 0x7f, 0x04, + 0xab, 0xc4, 0x9f, 0x76, 0x60, 0x1b, 0x6c, 0x7c, 0x74, 0x83, 0xf6, 0xa8, 0x0f, 0x1e, 0x61, 0xac, 0x67, 0x25, 0x0d, 0xd8, 0x52, 0x8b, 0x70, 0x37, 0x39, 0xe4, 0xab, 0x7a, 0x57, 0xaf, 0x7a, 0x7d, + 0x35, 0x3e, 0xec, 0x3b, 0x7a, 0xca, 0xf9, 0x33, 0x73, 0x45, 0x84, 0x21, 0x65, 0x99, 0x54, 0x20, 0xcf, 0x62, 0x8b, 0x45, 0xaa, 0xd5, 0x1e, 0x42, 0x85, 0x73, 0x8d, 0xb2, 0x6f, 0xc8, 0x14, 0xd5, + 0xb7, 0x8e, 0x3c, 0x1f, 0xb4, 0x46, 0xa2, 0xba, 0x78, 0x22, 0x43, 0x54, 0x17, 0x43, 0x6d, 0x90, 0xf1, 0x7e, 0xe1, 0xb6, 0x85, 0x7e, 0xc8, 0x67, 0xf3, 0x96, 0x6a, 0x14, 0xbc, 0xe7, 0x15, 0x80, + 0x9e, 0xc5, 0x22, 0xbd, 0xa7, 0xbd, 0x95, 0xb8, 0xae, 0x16, 0x8d, 0x05, 0x2a, 0x4e, 0x26, 0xd1, 0x27, 0x04, 0xd3, 0x30, 0x0f, 0x3d, 0x69, 0xce, 0xc2, 0xe9, 0x04, 0x46, 0x99, 0xb7, 0x61, 0x44, + 0xb2, 0x11, 0x58, 0x45, 0x04, 0x70, 0xb2, 0x5c, 0x36, 0xdf, 0x32, 0x1b, 0x60, 0x86, 0x81, 0xbb, 0xa0, 0xf8, 0x3b, 0x6d, 0x93, 0x8b, 0xc2, 0x3d, 0xd4, 0x91, 0x59, 0x8c, 0x9e, 0x3e, 0xc2, 0x8c, + 0x9e, 0x1d, 0x5d, 0x8f, 0x78, 0xe4, 0x07, 0xc7, 0xfe, 0x0f, 0x58, 0x7e, 0x7f, 0xba, 0x91, 0x7e, 0x7b, 0x68, 0xfa, 0xb5, 0x12, 0x42, 0x1e, 0x59, 0x82, 0x5f, 0x60, 0x9f, 0xb8, 0xfc, 0x32, 0x38, + 0x9f, 0x45, 0x0e, 0x58, 0x8d, 0x9b, 0xd0, 0x9e, 0x89, 0x85, 0x6c, 0xa4, 0xb0, 0x64, 0x70, 0x56, 0x82, 0xc9, 0xdc, 0x42, 0xcc, 0x0e, 0xa0, 0x1a, 0x2f, 0x25, 0x1c, 0xcb, 0x53, 0x55, 0xf5, 0xed, + 0xc5, 0xda, 0x03, 0x2d, 0xcc, 0xcd, 0xa2, 0x30, 0x34, 0x0b, 0x0d, 0x8a, 0xa9, 0x9e, 0xcc, 0xb2, 0xa9, 0x59, 0x8d, 0xe3, 0x48, 0xc8, 0xf7, 0xa5, 0x9a, 0x75, 0x7c, 0xad, 0x1f, 0x04, 0x54, 0x91, + 0xbb, 0x42, 0x67, 0xb7, 0xbd, 0x86, 0xfd, 0xc4, 0xbb, 0x31, 0xf8, 0x98, 0x37, 0x2b, 0xdc, 0xaa, 0x0a, 0x6e, 0x76, 0xa6, 0x7c, 0xf0, 0x10, 0xf2, 0x0a, 0x7a, 0xa1, 0xdd, 0xf9, 0x72, 0xe8, 0x31, + 0x64, 0xa8, 0x55, 0xc2, 0xb8, 0x84, 0xb8, 0x1e, 0x9c, 0xa9, 0xe0, 0x72, 0x45, 0x49, 0x8e, 0xea, 0xd3, 0x1e, 0x01, 0xf2, 0xb1, 0xa8, 0x4a, 0x5a, 0x38, 0x2f, 0xc0, 0x02, 0x54, 0x43, 0x19, 0x6d, + 0xba, 0x25, 0x00, 0x35, 0xa4, 0x19, 0xef, 0x66, 0xa7, 0xc0, 0x94, 0xb6, 0x5c, 0x5f, 0x92, 0xfc, 0x24, 0xea, 0x2a, 0x8f, 0x53, 0x35, 0x90, 0xa8, 0xa5, 0xfd, 0x66, 0xa9, 0xe2, 0x04, 0xd1, 0x71, + 0xeb, 0x68, 0x7c, 0xcf, 0x52, 0xff, 0xbc, 0x30, 0xbe, 0x52, 0xe5, 0xe9, 0xc7, 0xd1, 0xf3, 0xf8, 0xe7, 0xc1, 0xe6, 0x4f, 0x93, 0xe3, 0xdc, 0x7c, 0xe2, 0x07, 0xbc, 0x18, 0x45, 0x4f, 0x94, 0x29, + 0x46, 0xbe, 0x1b, 0x65, 0xb7, 0xf5, 0xf9, 0x83, 0xab, 0xeb, 0xd7, 0xef, 0x78, 0xcb, 0xa9, 0xf7, 0xbf, 0x0c, 0x5d, 0x5d, 0x17, 0xd6, 0x1a, 0xb1, 0x45, 0x2a, 0x29, 0xcc, 0xed, 0x76, 0x3f, 0xa7, + 0x78, 0x44, 0x6b, 0xf7, 0x6d, 0xee, 0xf5, 0x11, 0x3d, 0x8f, 0x36, 0xbc, 0xae, 0x47, 0xc0, 0xd6, 0x67, 0x40, 0x05, 0x60, 0x49, 0x93, 0xaa, 0xf9, 0x08, 0x4c, 0xf7, 0xf9, 0x04, 0x6e, 0x11, 0x86, + 0xc3, 0xc6, 0x2b, 0x1f, 0x12, 0xa2, 0x4e, 0xde, 0x3a, 0xa4, 0xec, 0xa9, 0xfa, 0x0a, 0xb5, 0x53, 0x65, 0x3b, 0xde, 0xc9, 0x82, 0x78, 0xb7, 0x00, 0xd0, 0x6d, 0xf5, 0x76, 0xb6, 0x38, 0x9d, 0xc0, + 0xbb, 0x64, 0xaf, 0x5e, 0x8a, 0x21, 0xfd, 0x94, 0x73, 0x43, 0xab, 0x7a, 0x5f, 0xcd, 0xc7, 0x1b, 0x7c, 0x82, 0x7e, 0xc3, 0x0f, 0x35, 0x15, 0xbc, 0xa2, 0x9e, 0x39, 0x73, 0x31, 0x4f, 0xaf, 0x48, + 0xf7, 0x79, 0x61, 0x3b, 0x0b, 0xd7, 0x03, 0x9d, 0x42, 0x9d, 0xa7, 0x9d, 0x33, 0x83, 0x57, 0xe5, 0xa6, 0xaf, 0xe7, 0x1e, 0x09, 0x43, 0x50, 0x62, 0x44, 0xc0, 0x62, 0x07, 0x74, 0xa6, 0x6d, 0x23, + 0x16, 0x63, 0xbb, 0x0e, 0xe6, 0x51, 0xf2, 0x31, 0x1c, 0xf7, 0x80, 0x5a, 0xcd, 0xf7, 0xbb, 0x49, 0x4d, 0x89, 0xbe, 0x10, 0x50, 0x47, 0xf0, 0xe8, 0xc5, 0x13, 0xb1, 0x86, 0xe2, 0x0d, 0xa3, 0x8f, + 0xdb, 0xa5, 0x43, 0xcf, 0xc9, 0xe1, 0xbd, 0x57, 0x2e, 0x75, 0x1c, 0x7e, 0x42, 0xba, 0x37, 0x96, 0xf7, 0xad, 0x6d, 0xee, 0xc3, 0x04, 0x7c, 0xc6, 0x7e, 0x43, 0xc8, 0xeb, 0x9d, 0xa1, 0xa7, 0xb8, + 0x20, 0xac, 0x1a, 0x24, 0xa0, 0x48, 0x47, 0x19, 0x37, 0x1b, 0x55, 0x38, 0xb0, 0x2e, 0x23, 0x3a, 0xc4, 0x76, 0x26, 0xc5, 0x73, 0x09, 0x9e, 0x60, 0xf1, 0x14, 0x76, 0x65, 0xad, 0x9c, 0xc6, 0xd8, + 0xce, 0x2c, 0x22, 0x3e, 0x3e, 0x81, 0xed, 0xb4, 0x34, 0xb1, 0x05, 0x63, 0x9e, 0x16, 0x31, 0x84, 0x4d, 0x04, 0x59, 0xae, 0xba, 0x05, 0xc8, 0x9c, 0x40, 0xf4, 0x94, 0xa3, 0xbb, 0x5a, 0x6e, 0x72, + 0x8c, 0xc8, 0x0f, 0xdf, 0x1b, 0x2c, 0x45, 0x7a, 0x28, 0x6e, 0xcb, 0xd4, 0x63, 0xc5, 0xf8, 0x9f, 0x41, 0x2f, 0x94, 0x38, 0x5f, 0x0e, 0x2d, 0xbd, 0x4f, 0x88, 0x01, 0x5b, 0x71, 0x51, 0x84, 0x71, + 0x4e, 0xb2, 0x5e, 0x6e, 0x5a, 0x18, 0x82, 0x96, 0x00, 0x79, 0x5a, 0x69, 0x32, 0x76, 0x50, 0x11, 0xa9, 0x55, 0xf5, 0x70, 0x87, 0x07, 0xab, 0xc6, 0x84, 0x2c, 0x2d, 0xa8, 0x8c, 0xb5, 0x09, 0x6a, + 0x9b, 0x62, 0x6b, 0x39, 0xf1, 0x01, 0x2d, 0x10, 0x2d, 0x31, 0x03, 0xa7, 0xa7, 0xa4, 0x3a, 0x76, 0x20, 0x45, 0x34, 0x37, 0x85, 0x11, 0xcd, 0x29, 0x85, 0x2a, 0xef, 0x05, 0x11, 0xdc, 0x75, 0x7a, + 0x8e, 0x87, 0xca, 0x58, 0x3c, 0xb2, 0xa3, 0xe0, 0x9b, 0x72, 0x21, 0xe3, 0xc7, 0xfc, 0x9e, 0xaf, 0xc0, 0x17, 0x92, 0x3e, 0x8f, 0x46, 0x17, 0xc0, 0xfb, 0x64, 0xf5, 0xe7, 0x7b, 0x14, 0xc9, 0x89, + 0xbd, 0x21, 0x61, 0x94, 0xa5, 0xac, 0xa4, 0xc5, 0xbe, 0x8a, 0xd1, 0x25, 0x22, 0x16, 0x2b, 0xf4, 0xa0, 0x36, 0xe9, 0x34, 0x0c, 0x22, 0x8d, 0x2a, 0xe7, 0x30, 0x8e, 0x85, 0x25, 0x9c, 0x7b, 0x91, + 0x5f, 0x1f, 0x94, 0xa9, 0xbb, 0x06, 0xb6, 0xf0, 0xea, 0xb8, 0xd2, 0xd9, 0xa6, 0xab, 0xd0, 0x14, 0x0b, 0x8f, 0x38, 0x09, 0xe4, 0xa8, 0x65, 0xfb, 0x69, 0x11, 0x1f, 0x93, 0x7e, 0xe0, 0xae, 0xbd, + 0x72, 0x82, 0xc3, 0x9b, 0xc2, 0x90, 0x0f, 0x84, 0xb9, 0x0e, 0xca, 0x8f, 0xc9, 0x8a, 0xf4, 0xd4, 0x8d, 0x4c, 0xc7, 0xb9, 0x6d, 0x62, 0x3c, 0xe4, 0x29, 0x7d, 0x81, 0xbd, 0x90, 0xfe, 0x3a, 0x38, + 0xcb, 0xf3, 0x00, 0x4f, 0x69, 0x14, 0x49, 0xe5, 0x86, 0xdb, 0xee, 0x67, 0x7b, 0x71, 0x37, 0x1e, 0x1f, 0x9d, 0x62, 0x0f, 0x0a, 0x28, 0x91, 0x47, 0x49, 0xe0, 0x05, 0xd5, 0x4c, 0x04, 0x8c, 0xb6, + 0x88, 0x63, 0xc3, 0x4e, 0xb7, 0xeb, 0x8e, 0x5b, 0x37, 0x95, 0x71, 0xca, 0x3a, 0x05, 0x4a, 0x10, 0xd0, 0x9a, 0x81, 0xfc, 0xb8, 0x9a, 0xd0, 0xb4, 0x01, 0x1e, 0x56, 0x8c, 0x63, 0xec, 0x89, 0xf5, + 0xa6, 0x30, 0xd3, 0x35, 0x0c, 0x68, 0xfa, 0xc7, 0x5a, 0x2d, 0x37, 0x97, 0xa6, 0xb4, 0x68, 0xcd, 0xc2, 0xb9, 0x7c, 0xe2, 0x27, 0xc7, 0x40, 0x90, 0x3d, 0x7d, 0xc7, 0xb5, 0x79, 0x18, 0xfc, 0x9b, + 0x7a, 0x80, 0x2f, 0x7f, 0x9d, 0x73, 0x01, 0x07, 0xb0, 0xe6, 0x5d, 0x6a, 0xf3, 0xd7, 0x36, 0xc6, 0xdb, 0x64, 0xe7, 0xc1, 0xbc, 0x79, 0xc5, 0x7d, 0x62, 0xce, 0xeb, 0xe8, 0x1c, 0xd5, 0x4f, 0xde, + 0xe7, 0x0e, 0x41, 0xcc, 0x8c, 0xf6, 0x24, 0xc5, 0xa7, 0x75, 0x52, 0xa3, 0xa6, 0x8c, 0x8d, 0x91, 0x3d, 0xa0, 0x91, 0xf3, 0x2e, 0xe3, 0x7b, 0xcb, 0x5b, 0x01, 0x53, 0x4c, 0x93, 0x66, 0x21, 0x5a, + 0xab, 0x47, 0xf5, 0x94, 0xe0, 0x30, 0x06, 0x9b, 0xcb, 0xcd, 0xa2, 0xf2, 0x55, 0x5d, 0xd6, 0x76, 0xf9, 0x0e, 0x66, 0xb0, 0x74, 0xd5, 0x1c, 0x80, 0xe8, 0x68, 0x9a, 0x88, 0xb0, 0x0a, 0x00, 0xc5, + 0x6b, 0xa6, 0x82, 0x44, 0xfe, 0xdc, 0x8f, 0x5d, 0x27, 0x9d, 0x7d, 0x21, 0xea, 0xd7, 0x72, 0xfb, 0x90, 0xce, 0xb8, 0x82, 0x3e, 0x11, 0xe6, 0x7a, 0x79, 0x8e, 0x99, 0x1e, 0xa0, 0x2c, 0x34, 0xb9, + 0x94, 0x8f, 0x8e, 0x07, 0x1c, 0xb1, 0x38, 0x02, 0x3a, 0x10, 0x5f, 0xac, 0x59, 0xd1, 0xb0, 0x8a, 0x39, 0x48, 0x66, 0x88, 0x7e, 0x30, 0xa1, 0x95, 0x58, 0x39, 0xf9, 0x6e, 0xa9, 0x23, 0x9a, 0x8b, + 0xa5, 0xfe, 0x4a, 0x9c, 0x51, 0xa5, 0x39, 0x5b, 0xad, 0x38, 0xb1, 0xc9, 0x28, 0x80, 0xdf, 0x4e, 0xb2, 0x42, 0x69, 0xdc, 0xc6, 0xd1, 0x8c, 0xce, 0x4a, 0x8e, 0x88, 0xdd, 0x90, 0x02, 0xe3, 0x40, + 0x3f, 0x59, 0xd5, 0x87, 0xc4, 0xa8, 0xe4, 0xb7, 0xdd, 0x0f, 0xf0, 0x23, 0xb9, 0x0c, 0xf9, 0xd3, 0x6a, 0x95, 0x97, 0xa3, 0xcb, 0x7f, 0xbf, 0x4f, 0xa4, 0x6a, 0xc6, 0x2f, 0x7b, 0x04, 0x31, 0x27, + 0xfd, 0x74, 0x76, 0xe2, 0x2a, 0x85, 0x05, 0x00, 0x25, 0xd9, 0x79, 0xfd, 0x29, 0xf2, 0xdc, 0x35, 0x36, 0xb5, 0xf2, 0xd4, 0xcf, 0xb6, 0x79, 0xb6, 0x3a, 0x1c, 0x61, 0xf5, 0x00, 0xda, 0x92, 0xb5, + 0xad, 0x78, 0xba, 0x47, 0xf9, 0x3a, 0x9f, 0x96, 0x58, 0xa3, 0x00, 0xd9, 0x71, 0x52, 0xae, 0xc7, 0xa7, 0x71, 0xc6, 0x53, 0x6c, 0xa4, 0xf8, 0x44, 0x61, 0xeb, 0xf2, 0xd0, 0x02, 0xe8, 0x65, 0xe0, + 0xb8, 0x23, 0xdb, 0x37, 0x93, 0xc4, 0x3d, 0x6f, 0x73, 0xcf, 0x7e, 0xd0, 0x2f, 0x12, 0x01, 0xee, 0xae, 0x6b, 0x7f, 0xd0, 0x9b, 0x3d, 0x38, 0x79, 0x20, 0xaf, 0xdd, 0xda, 0x1d, 0x9d, 0x0b, 0x2c, + 0x56, 0x66, 0x19, 0x7e, 0xb3, 0x9b, 0xfe, 0xb9, 0xe1, 0xf1, 0x01, 0xfb, 0x89, 0xa3, 0xef, 0xef, 0x0c, 0x8d, 0xf1, 0xe5, 0x6b, 0x93, 0xdf, 0x9a, 0xb8, 0x17, 0xad, 0x77, 0xd8, 0xca, 0xdc, 0xea, + 0x52, 0xbf, 0x4a, 0x43, 0x68, 0xbc, 0xea, 0x77, 0x1c, 0x3c, 0xa5, 0x71, 0x73, 0xe1, 0x37, 0x58, 0xe1, 0x71, 0x2a, 0x2a, 0x1e, 0x72, 0x1a, 0xd8, 0x20, 0x53, 0x3f, 0x33, 0xa4, 0x84, 0x9e, 0x92, + 0x3e, 0x19, 0x8c, 0x8d, 0x79, 0x38, 0xd9, 0x92, 0x1a, 0x26, 0xe7, 0xe1, 0x6c, 0xc2, 0xd2, 0x44, 0x31, 0xf6, 0xdd, 0x23, 0xba, 0xa6, 0xee, 0x99, 0x21, 0xaf, 0xa4, 0xff, 0x9f, 0x2f, 0xa4, 0x7f, + 0x65, 0xc2, 0x9b, 0x8a, 0x06, 0x17, 0xfa, 0xbf, 0x51, 0xe6, 0xc3, 0x58, 0xe4, 0xb9, 0x45, 0x5a, 0xbe, 0xec, 0x2b, 0xdf, 0x30, 0xfd, 0xc6, 0x6b, 0x32, 0xb3, 0x2a, 0xdc, 0x34, 0xf9, 0xf6, 0x3d, + 0x6d, 0xdb, 0xfe, 0xbe, 0x3e, 0x77, 0x7e, 0xd9, 0x4f, 0xdf, 0x61, 0xa7, 0x49, 0x59, 0x47, 0xd5, 0xd3, 0x67, 0x7f, 0xf7, 0x9a, 0x0b, 0xec, 0x99, 0xc7, 0xd7, 0x44, 0xfe, 0x37, 0xaf, 0xb8, 0x5e, + 0xfd, 0xaf, 0xef, 0x64, 0xee, 0x86, 0x4b, 0xfd, 0x2b, 0xd1, 0x7b, 0xac, 0x0a, 0xeb, 0xd7, 0xaf, 0x38, 0x4b, 0xe0, 0x57, 0x3f, 0x0c, 0xad, 0xce, 0x5a, 0xe9, 0x53, 0x58, 0x82, 0xfd, 0x43, 0x27, + 0xd7, 0xec, 0x21, 0x4a, 0x15, 0x50, 0xd7, 0x4a, 0xa4, 0x85, 0xb1, 0x3a, 0x11, 0x15, 0x9f, 0xcc, 0xbd, 0x1a, 0xcc, 0xa7, 0x3b, 0xcf, 0xdf, 0xe9, 0x66, 0x6c, 0xb6, 0x84, 0xd7, 0xf9, 0x75, 0xbc, + 0x36, 0x91, 0x6e, 0x91, 0x39, 0xdb, 0x94, 0x24, 0x1a, 0x1d, 0x45, 0x8a, 0xa5, 0x1d, 0x1d, 0x81, 0xb1, 0xa7, 0xea, 0x92, 0xb6, 0xdf, 0x94, 0x14, 0xc3, 0x36, 0xdf, 0x6f, 0x09, 0x2e, 0x7f, 0x70, + 0x54, 0xd4, 0xdf, 0xd0, 0xe7, 0xe7, 0xeb, 0xd1, 0x0b, 0xea, 0x0b, 0x49, 0xa2, 0xa2, 0x3e, 0x53, 0x61, 0xc0, 0x8a, 0x44, 0xcb, 0xfe, 0x34, 0x8b, 0x09, 0xc8, 0xeb, 0x1d, 0xbb, 0xe1, 0x25, 0x4f, + 0x4c, 0xbb, 0x31, 0xb5, 0x34, 0xcd, 0x64, 0x1d, 0xee, 0x22, 0x59, 0x9d, 0x23, 0xab, 0x4d, 0x9f, 0xfb, 0xf6, 0xca, 0xf2, 0xb7, 0x73, 0xd9, 0x68, 0x88, 0x44, 0xdc, 0x35, 0xc6, 0xca, 0xb1, 0x75, + 0x02, 0x85, 0xe0, 0xa5, 0x18, 0x37, 0x2a, 0x00, 0x66, 0x90, 0x7c, 0x58, 0xaa, 0x89, 0x34, 0xe3, 0x56, 0xa7, 0xc0, 0x2b, 0x25, 0xe2, 0x9e, 0x4b, 0xf3, 0xde, 0x59, 0xe0, 0x00, 0x5d, 0x57, 0x98, + 0xed, 0xc8, 0x4a, 0x9d, 0x5b, 0x56, 0x0f, 0xf2, 0xae, 0xc8, 0xcc, 0x50, 0x4a, 0x3e, 0x83, 0x82, 0xa3, 0x97, 0xcb, 0xd1, 0x19, 0xe9, 0x3e, 0x1d, 0xc9, 0x7e, 0x91, 0x77, 0x99, 0xc7, 0xf0, 0xc7, + 0xe9, 0x32, 0x5f, 0xf8, 0x07, 0x6d, 0x97, 0x4e, 0x49, 0x73, 0x82, 0x14, 0x84, 0x5e, 0x4c, 0x34, 0x80, 0x96, 0x68, 0x6f, 0x29, 0x96, 0xe0, 0x26, 0x0a, 0x81, 0x49, 0x25, 0xee, 0xfa, 0x4a, 0x68, + 0x76, 0x5b, 0x08, 0xe6, 0x65, 0x15, 0x44, 0x19, 0x1f, 0x87, 0x56, 0x80, 0x39, 0x26, 0xa3, 0x8a, 0xcc, 0xcb, 0x69, 0x1f, 0x14, 0x12, 0x1e, 0xa5, 0x53, 0xc5, 0x1b, 0xb8, 0x68, 0x59, 0xdd, 0x35, + 0x70, 0xf5, 0x53, 0xe5, 0x9b, 0xa7, 0x6f, 0x7d, 0x13, 0x04, 0xf9, 0xe9, 0x40, 0x2c, 0xb0, 0xd3, 0xa4, 0x19, 0x45, 0xc1, 0xa5, 0x4d, 0xd7, 0xd3, 0xb4, 0x41, 0xde, 0x05, 0x5d, 0xd6, 0x49, 0x16, + 0x5c, 0xb4, 0x09, 0xfc, 0x50, 0x48, 0xec, 0x5f, 0xd0, 0xef, 0x41, 0xcc, 0xbc, 0x96, 0xd0, 0xbf, 0xc1, 0x4c, 0xf2, 0x21, 0x37, 0xd9, 0x33, 0xe8, 0x13, 0x33, 0x9f, 0x4b, 0xf4, 0x93, 0xc3, 0x1c, + 0x61, 0xff, 0x3f, 0x7b, 0x7f, 0xd6, 0xa4, 0xaa, 0xd7, 0xe5, 0x8b, 0xc2, 0xf7, 0xfb, 0x53, 0xac, 0x58, 0x97, 0x2f, 0xdb, 0x45, 0x2b, 0x4d, 0xc5, 0x5b, 0x75, 0x4a, 0x41, 0x51, 0x01, 0x69, 0x14, + 0x41, 0x2f, 0x9e, 0x13, 0xf4, 0x8d, 0xf4, 0x3d, 0xc6, 0x8e, 0xe7, 0xb3, 0x9f, 0x48, 0xcd, 0xcc, 0x95, 0x66, 0x6a, 0x26, 0xe9, 0xfa, 0xff, 0x4f, 0x55, 0x9d, 0x78, 0x6e, 0x32, 0x01, 0x71, 0x20, + 0x63, 0x8e, 0x39, 0xe7, 0x68, 0x7f, 0x63, 0x12, 0x9a, 0x54, 0xba, 0x09, 0x3b, 0x7d, 0xda, 0x42, 0xfb, 0x5e, 0x0c, 0xda, 0x4a, 0x46, 0x6c, 0xce, 0x9c, 0x4c, 0xc0, 0x46, 0x48, 0x54, 0x29, 0xd9, + 0xe3, 0xa8, 0x6e, 0xd1, 0x47, 0x20, 0xd6, 0x53, 0x68, 0xda, 0x2e, 0x6d, 0x79, 0x26, 0x78, 0x07, 0xfe, 0x10, 0x08, 0x1a, 0x5b, 0x55, 0xf2, 0xc2, 0x52, 0x7d, 0xd5, 0x33, 0x39, 0x28, 0x5e, 0x90, + 0x63, 0xa7, 0xf2, 0x05, 0x89, 0xd3, 0xbb, 0xd3, 0x7b, 0x50, 0xce, 0x2f, 0x3a, 0x2a, 0x7c, 0xd2, 0x81, 0x00, 0x79, 0x5f, 0x75, 0xf4, 0xc9, 0xbd, 0xe3, 0x0f, 0x71, 0xd2, 0xb7, 0x09, 0xc8, 0x97, + 0x66, 0x05, 0xd7, 0x91, 0xc8, 0xff, 0xd9, 0xe9, 0xae, 0xd7, 0xcd, 0x18, 0x6e, 0x09, 0x13, 0xf1, 0xd0, 0x1a, 0xfb, 0x86, 0xee, 0x5b, 0x79, 0xaa, 0xb3, 0x73, 0x8a, 0xf5, 0x80, 0x75, 0xf6, 0xc4, + 0x41, 0xdb, 0x29, 0xa1, 0xdb, 0xf8, 0x2a, 0xa3, 0xf9, 0x38, 0xe2, 0xe3, 0xda, 0xcd, 0xfb, 0x23, 0x3b, 0x03, 0xc0, 0x6d, 0x24, 0x3a, 0x12, 0x83, 0xe7, 0x1c, 0x1d, 0xad, 0x35, 0xc2, 0x5f, 0x30, + 0xdc, 0xdc, 0x07, 0x57, 0x04, 0x48, 0x78, 0xb4, 0xc6, 0x2a, 0x44, 0x98, 0xce, 0xe4, 0x99, 0x06, 0x9b, 0x5c, 0x8e, 0x1a, 0x68, 0xaf, 0x1e, 0x36, 0xa2, 0x29, 0xa6, 0x1a, 0x3f, 0x97, 0xb1, 0xd4, + 0xff, 0x6a, 0x9d, 0xfd, 0xc4, 0x80, 0x0d, 0x12, 0xfb, 0xa5, 0x61, 0xc5, 0x87, 0xee, 0x17, 0x6f, 0xa6, 0xe3, 0x93, 0x04, 0x21, 0x9f, 0x49, 0x08, 0xf4, 0x8b, 0x7c, 0xc0, 0xbc, 0xfd, 0xaf, 0xeb, + 0xe1, 0xf2, 0x76, 0x20, 0xaf, 0x3e, 0xf8, 0x88, 0x72, 0x72, 0x7b, 0x5f, 0x21, 0x7f, 0x51, 0xdf, 0x96, 0x9e, 0x77, 0xb4, 0xc1, 0xd1, 0xfb, 0x2b, 0xa3, 0x33, 0xdd, 0xaf, 0xa5, 0x28, 0xee, 0x96, + 0xcc, 0xc4, 0xa4, 0xf8, 0x32, 0xc6, 0x99, 0x54, 0x5c, 0x11, 0xdd, 0x02, 0x18, 0x03, 0x3a, 0xd6, 0xc3, 0xbc, 0x0a, 0x62, 0x8b, 0x60, 0x0c, 0xf1, 0x14, 0x3d, 0x2e, 0x97, 0x65, 0xcb, 0xa1, 0xab, + 0x93, 0xca, 0x6f, 0x30, 0xb3, 0x3d, 0xc2, 0xf3, 0x26, 0xb4, 0xa7, 0x5e, 0xb3, 0x57, 0x30, 0xf3, 0xb4, 0xc5, 0xaa, 0x5a, 0x95, 0x03, 0x1a, 0x1e, 0xcf, 0x67, 0x88, 0x3b, 0x5e, 0x98, 0x7c, 0xb3, + 0xff, 0xb6, 0x55, 0x7d, 0x97, 0x87, 0x5f, 0x65, 0xe1, 0xdf, 0xe6, 0xe8, 0x23, 0x99, 0xcb, 0x7f, 0xd6, 0xff, 0xfc, 0xfc, 0xcc, 0xaf, 0xb9, 0xdd, 0xf5, 0xf3, 0xb6, 0xf7, 0x8b, 0x14, 0x5c, 0xcd, + 0x52, 0x17, 0x67, 0x7d, 0x07, 0x09, 0x4e, 0xc8, 0xda, 0xd2, 0xd3, 0x10, 0x29, 0xa3, 0x74, 0x5d, 0x6a, 0x05, 0xa8, 0x97, 0x33, 0x85, 0xe1, 0xc0, 0x34, 0x90, 0x68, 0xd7, 0x58, 0xfb, 0xd1, 0x58, + 0x5c, 0xbb, 0x19, 0x10, 0xca, 0xf6, 0xe4, 0xa0, 0xc8, 0x32, 0xb4, 0x5c, 0x69, 0xeb, 0xd3, 0x82, 0x3a, 0x2d, 0x0f, 0x73, 0x22, 0x0a, 0x28, 0xf8, 0xe8, 0xdf, 0x8b, 0x87, 0x3c, 0xc0, 0xed, 0xa1, + 0x6d, 0x5f, 0x9f, 0x0c, 0xb3, 0xef, 0x6b, 0xdd, 0xc3, 0xda, 0xbe, 0x9e, 0x69, 0x7f, 0xcd, 0x49, 0xa2, 0x8f, 0xfa, 0xc8, 0x29, 0x0f, 0x32, 0x28, 0xed, 0x10, 0x2a, 0xf4, 0x67, 0x4c, 0x84, 0xaa, + 0x6e, 0x98, 0xe2, 0x07, 0x9d, 0xf0, 0xe8, 0x7c, 0x55, 0x8c, 0xe7, 0x84, 0xc4, 0x15, 0xb9, 0x45, 0xa1, 0x0d, 0xe1, 0x9e, 0x36, 0x7d, 0x5c, 0xc1, 0xd3, 0xac, 0x9d, 0xa9, 0x64, 0x32, 0x51, 0xf5, + 0x92, 0xcc, 0x4f, 0xa7, 0x26, 0xf7, 0xcd, 0xd0, 0xe7, 0xc6, 0xf2, 0xc1, 0xc3, 0x85, 0x0a, 0x5c, 0x1c, 0xa7, 0xdf, 0xee, 0x8b, 0x79, 0x97, 0x93, 0xdf, 0x82, 0x8a, 0x42, 0x1e, 0x42, 0x4d, 0xfb, + 0x2e, 0x54, 0x14, 0x32, 0x0c, 0x45, 0x0d, 0x1c, 0xd3, 0xc2, 0x1a, 0xdd, 0x42, 0x0a, 0xa6, 0x6f, 0x43, 0x8c, 0xb1, 0x58, 0xc3, 0xe9, 0x52, 0xa0, 0x48, 0x0f, 0x1b, 0x7b, 0x33, 0xd7, 0x40, 0x68, + 0x22, 0x8a, 0x5b, 0x45, 0x2c, 0xc2, 0xee, 0x44, 0xb3, 0x70, 0x5b, 0x68, 0xfa, 0xac, 0x64, 0x4d, 0x85, 0x73, 0x9a, 0x30, 0x5a, 0xf2, 0xc0, 0x81, 0x99, 0x61, 0xe5, 0x21, 0x5a, 0x15, 0xe3, 0x19, + 0x83, 0xed, 0x35, 0xa8, 0xcf, 0xe3, 0x23, 0x07, 0x38, 0x5f, 0x59, 0xd3, 0xdf, 0x83, 0x8a, 0x42, 0x7e, 0xbd, 0xab, 0xe4, 0x79, 0xe6, 0xd8, 0xcf, 0xe7, 0xa8, 0xde, 0xfb, 0x0c, 0x9a, 0x57, 0x90, + 0x28, 0xe4, 0xc7, 0xff, 0xf9, 0x3f, 0x3f, 0xd0, 0xa7, 0x3f, 0xd8, 0xd3, 0x9f, 0xf1, 0xdb, 0xbb, 0xbe, 0x09, 0x17, 0xf5, 0x80, 0x4c, 0x7c, 0x59, 0xa9, 0x35, 0x7e, 0x2c, 0xa2, 0x75, 0xa7, 0x52, + 0x6b, 0x3c, 0x2c, 0x8e, 0x65, 0xf4, 0x34, 0xd7, 0xc4, 0x60, 0xe6, 0xd3, 0x6c, 0x27, 0x1e, 0xf7, 0xca, 0x86, 0x16, 0x48, 0x24, 0x60, 0x5a, 0xab, 0x22, 0xc1, 0x59, 0x9a, 0x6c, 0x66, 0x1e, 0xbd, + 0xe9, 0xb4, 0x8e, 0x21, 0x1a, 0x07, 0x0f, 0x17, 0x9e, 0x57, 0xce, 0x23, 0xcc, 0x3d, 0xec, 0xe4, 0xa9, 0xa4, 0xac, 0x3d, 0x39, 0xe5, 0x82, 0x7a, 0x07, 0xa6, 0xb6, 0x3f, 0x2f, 0xd8, 0x93, 0xac, + 0x1f, 0x5a, 0x33, 0x70, 0x69, 0x52, 0x79, 0x5c, 0x8d, 0xb8, 0x57, 0xbc, 0xf5, 0x6e, 0x4c, 0x3f, 0xd4, 0x6e, 0x5d, 0xa9, 0xaf, 0x5f, 0xed, 0x1a, 0x97, 0x7c, 0xba, 0x01, 0xb5, 0x5b, 0xf0, 0x2f, + 0xf8, 0x96, 0xdf, 0xed, 0x7f, 0x9e, 0x2e, 0xf2, 0x85, 0x3d, 0xf4, 0x98, 0xe4, 0xdd, 0xb2, 0x87, 0x06, 0x4a, 0x9d, 0xea, 0xe1, 0x54, 0xbc, 0x16, 0x33, 0xb7, 0xe1, 0x98, 0x89, 0x85, 0xc8, 0x24, + 0xa3, 0x64, 0x42, 0x18, 0x9e, 0xec, 0xaa, 0x48, 0x1a, 0x6a, 0x61, 0x6d, 0x04, 0x1d, 0xc0, 0x76, 0xe5, 0xa1, 0x63, 0x60, 0xe3, 0x80, 0x1f, 0x4e, 0xc5, 0x72, 0x46, 0x14, 0xd1, 0x49, 0x9f, 0x56, + 0xda, 0xb6, 0xf7, 0x55, 0x7e, 0x23, 0x70, 0x1e, 0x44, 0xe0, 0x13, 0x0d, 0xd7, 0x94, 0x71, 0x70, 0xc8, 0x18, 0x68, 0x15, 0x7c, 0xd9, 0x5f, 0xe9, 0x4f, 0x4d, 0x24, 0x68, 0xa0, 0x89, 0xf4, 0x01, + 0xa6, 0xee, 0x9d, 0x89, 0xf4, 0xc1, 0x84, 0x7a, 0xaf, 0x00, 0xe3, 0x0f, 0x98, 0x48, 0xdf, 0xb1, 0x8a, 0xef, 0x8a, 0xc7, 0xf7, 0x6a, 0xc4, 0xa0, 0x87, 0x3a, 0xb4, 0xdc, 0xeb, 0x98, 0x36, 0xa8, + 0x57, 0x4b, 0x0e, 0x08, 0x53, 0x32, 0xd9, 0x2b, 0x30, 0xc7, 0xf0, 0x85, 0x57, 0x60, 0xec, 0xb8, 0x77, 0x62, 0xb7, 0xca, 0x04, 0x9a, 0x00, 0x65, 0x3e, 0xdf, 0x25, 0xf6, 0x34, 0x9e, 0xcd, 0xec, + 0xfc, 0x14, 0xaf, 0xc3, 0xb1, 0x6d, 0xcd, 0x45, 0x11, 0x13, 0x53, 0x32, 0x8f, 0xda, 0xc3, 0x0c, 0x55, 0xf9, 0x2d, 0x0a, 0x1c, 0x82, 0x18, 0x9e, 0x93, 0x5c, 0x8e, 0x59, 0xd3, 0x24, 0x38, 0xae, + 0xfd, 0x88, 0x16, 0xa2, 0xaf, 0xe4, 0xe6, 0xef, 0xe4, 0xfc, 0xeb, 0xe6, 0x74, 0x7b, 0x5a, 0x12, 0x0f, 0xf8, 0x9c, 0x2e, 0x24, 0xc1, 0xd1, 0xf3, 0xc1, 0xe8, 0x4c, 0xe5, 0x6b, 0xd6, 0x5a, 0xd3, + 0x53, 0x92, 0xc8, 0x14, 0x17, 0xae, 0x72, 0x15, 0x27, 0xa6, 0x63, 0x44, 0x11, 0x68, 0x7c, 0x4c, 0x0b, 0x46, 0xc1, 0x21, 0x38, 0x04, 0x69, 0xf3, 0xc4, 0x3c, 0x5a, 0x46, 0xd0, 0x6a, 0x39, 0xda, + 0xf5, 0xe0, 0xd8, 0x37, 0xe6, 0xab, 0xa8, 0xf4, 0xbd, 0x24, 0x0b, 0xd3, 0x46, 0xd8, 0xad, 0x80, 0x85, 0xeb, 0x62, 0x94, 0x4d, 0xb2, 0xb3, 0x04, 0x32, 0x49, 0x82, 0x1e, 0x67, 0x8c, 0x0c, 0x43, + 0x5f, 0xb1, 0xf6, 0x43, 0x92, 0xd5, 0xef, 0xcd, 0xda, 0x0c, 0x92, 0x17, 0xee, 0x0c, 0xe7, 0xef, 0x23, 0x16, 0x18, 0xfe, 0x50, 0xcc, 0xee, 0x6b, 0x0b, 0x0c, 0x1f, 0x16, 0xc1, 0x2b, 0xa0, 0xd9, + 0x12, 0x58, 0x4c, 0x05, 0x4b, 0x37, 0x6c, 0xa1, 0xa8, 0xbd, 0x23, 0xc4, 0xd2, 0x32, 0x80, 0x4f, 0xe5, 0x1d, 0x4a, 0x49, 0x81, 0x36, 0x39, 0xec, 0xdc, 0x9c, 0x48, 0x97, 0xd6, 0xd1, 0x61, 0x83, + 0x35, 0x51, 0x86, 0x0a, 0xdb, 0xcb, 0x9d, 0x64, 0xbb, 0x15, 0x9a, 0xc8, 0xce, 0x71, 0xbe, 0xa5, 0x65, 0x73, 0xdf, 0xf1, 0xd3, 0x05, 0x00, 0x1a, 0xdd, 0x41, 0x70, 0x16, 0xa4, 0xaa, 0xe3, 0xc0, + 0x40, 0xd7, 0xd0, 0xdb, 0x66, 0xc5, 0x17, 0xa4, 0xea, 0xef, 0x5a, 0xde, 0xff, 0x80, 0xcf, 0xad, 0xec, 0xa1, 0x27, 0x7d, 0xea, 0x1f, 0x30, 0x7e, 0xce, 0x6a, 0x7b, 0x3a, 0xfe, 0x8f, 0x7f, 0x87, + 0xc9, 0x81, 0x99, 0x52, 0xb7, 0xc7, 0xee, 0xab, 0x3e, 0xca, 0xc4, 0x2f, 0x98, 0x7c, 0x20, 0xea, 0x74, 0xbb, 0x91, 0xf2, 0x85, 0xd8, 0xd7, 0x63, 0x15, 0xd6, 0x71, 0x64, 0x41, 0xd3, 0xa5, 0x5a, + 0x6c, 0xd0, 0x7c, 0xc5, 0x7a, 0xcb, 0xa3, 0x76, 0x28, 0x7b, 0x77, 0x22, 0x10, 0x6b, 0x5a, 0x0b, 0xa6, 0x16, 0xcd, 0xf8, 0x89, 0x0d, 0xa0, 0xeb, 0xb5, 0x30, 0xe6, 0xcc, 0x69, 0xcc, 0x6f, 0xbd, + 0xc5, 0xce, 0xd5, 0xa6, 0x96, 0x87, 0x6b, 0x40, 0xc1, 0xab, 0xe5, 0x32, 0x3b, 0x65, 0x33, 0x45, 0x2a, 0x9b, 0x56, 0x95, 0x08, 0xda, 0x3a, 0x4e, 0xe4, 0x8d, 0x98, 0x7e, 0x27, 0xda, 0x0a, 0x23, + 0x0f, 0x33, 0xf4, 0x5b, 0x26, 0xc9, 0xf8, 0x21, 0x07, 0xe9, 0x77, 0x4d, 0x92, 0xf1, 0x30, 0xe7, 0xa9, 0x4f, 0x05, 0xd2, 0x6e, 0xe9, 0x16, 0xbb, 0x03, 0xd5, 0xee, 0xf6, 0x72, 0xd2, 0xcd, 0xbd, + 0xaa, 0x85, 0x6b, 0x6f, 0xd3, 0xb0, 0x33, 0x41, 0x8c, 0x7a, 0x49, 0xd3, 0xaa, 0x98, 0x9c, 0x0a, 0x2b, 0x3f, 0x69, 0xfb, 0x19, 0x0f, 0xce, 0x79, 0x73, 0x6f, 0x6e, 0xf7, 0xe8, 0x0e, 0x95, 0xb2, + 0x70, 0x09, 0x4e, 0x55, 0x0e, 0x27, 0x12, 0x4a, 0x9a, 0x69, 0x4c, 0x8d, 0x3b, 0x8b, 0x53, 0x0d, 0xbb, 0x53, 0x78, 0x3c, 0xb0, 0x66, 0xfb, 0x96, 0xfd, 0xf1, 0xa1, 0x54, 0xe4, 0x26, 0x54, 0x2d, + 0xf9, 0xae, 0x60, 0xe3, 0x1a, 0xaa, 0xf6, 0xfb, 0xb6, 0xc7, 0x77, 0x63, 0xc6, 0x7f, 0xdb, 0xcc, 0xfc, 0x4a, 0x2d, 0xf8, 0x57, 0xe9, 0xf8, 0x7f, 0x8d, 0xe2, 0x7f, 0x5d, 0x4a, 0x72, 0x6b, 0x64, + 0xb0, 0x5f, 0xd8, 0x03, 0xfa, 0xc4, 0x3b, 0xda, 0xcf, 0xda, 0xfe, 0x9b, 0x2b, 0xa3, 0x33, 0xdd, 0xaf, 0xc7, 0x88, 0x3f, 0x82, 0xee, 0x92, 0xde, 0xf4, 0x4b, 0x3f, 0xb5, 0xbb, 0x1e, 0x5e, 0x32, + 0x1c, 0xb2, 0x30, 0x4e, 0x47, 0x87, 0x0d, 0x37, 0xb1, 0x73, 0x9a, 0x68, 0x3a, 0xe2, 0x78, 0x76, 0xb5, 0x4a, 0xf6, 0x7e, 0x75, 0xe2, 0x66, 0xe5, 0x54, 0x5a, 0xa5, 0x6d, 0xb4, 0xc4, 0xe7, 0x38, + 0x2f, 0x99, 0xe3, 0x2a, 0x5f, 0xca, 0x4b, 0xbe, 0x10, 0xcc, 0x0e, 0x41, 0x36, 0xe3, 0x14, 0x65, 0xeb, 0x95, 0xd1, 0x48, 0xf5, 0xfb, 0x7c, 0xc1, 0xfb, 0x78, 0xe2, 0x69, 0x51, 0x8d, 0xac, 0x34, + 0xa9, 0x8a, 0x34, 0x8a, 0x9c, 0xe2, 0x75, 0x5a, 0x5d, 0x4d, 0x64, 0xb3, 0x76, 0xdd, 0xe7, 0xcf, 0xf0, 0xf7, 0xe5, 0x5b, 0x4f, 0x96, 0x64, 0x55, 0x3e, 0x7f, 0x0f, 0xbd, 0x59, 0x2b, 0xf6, 0xf3, + 0x39, 0x6d, 0xee, 0x2a, 0xb5, 0xf7, 0x69, 0xee, 0x9f, 0x6b, 0xb9, 0xfe, 0x6f, 0xdb, 0x79, 0x32, 0x6b, 0x2f, 0xe4, 0xe1, 0x5f, 0xe8, 0xb7, 0x95, 0xfc, 0x7f, 0xc0, 0xc8, 0x2f, 0x04, 0x79, 0x99, + 0xd1, 0xbf, 0x67, 0xf7, 0x7f, 0xfc, 0x3b, 0x3c, 0x34, 0x2b, 0xf9, 0x69, 0xe4, 0xec, 0xa0, 0xb8, 0x17, 0xca, 0x40, 0x1f, 0xd2, 0xe8, 0x5f, 0x88, 0x3e, 0x4b, 0xc6, 0xd3, 0xe1, 0x08, 0x1d, 0xa6, + 0xcf, 0xfb, 0xe2, 0x06, 0x22, 0xa9, 0x34, 0x21, 0x15, 0xbb, 0xce, 0x6d, 0xd3, 0x6f, 0xe4, 0xf1, 0x01, 0x25, 0x26, 0xd0, 0x6c, 0x13, 0x96, 0xf9, 0x09, 0xcf, 0x13, 0xc5, 0x72, 0xdd, 0x52, 0x50, + 0x51, 0x8c, 0x1a, 0xcf, 0xeb, 0xad, 0x9d, 0x6f, 0x62, 0x80, 0x30, 0xfd, 0x15, 0x42, 0xad, 0x9a, 0xa5, 0x58, 0x4e, 0x99, 0xd9, 0x2c, 0x31, 0x92, 0x31, 0x23, 0xd5, 0x54, 0x85, 0x6e, 0x53, 0x6a, + 0xa7, 0x44, 0xc2, 0xe9, 0x71, 0x6f, 0xd3, 0xc7, 0xa6, 0xa5, 0xdf, 0xd5, 0x87, 0xfe, 0xe3, 0xdf, 0xc9, 0xa1, 0x65, 0xf7, 0xef, 0xea, 0x01, 0x6f, 0x5b, 0x58, 0x0f, 0xda, 0xe5, 0xaf, 0x84, 0x2f, + 0x63, 0xf2, 0x7a, 0x3a, 0x82, 0x86, 0xd9, 0xe7, 0x63, 0xc2, 0x2d, 0x0a, 0x56, 0x00, 0x45, 0x7a, 0xcb, 0xe7, 0xbc, 0x38, 0xf1, 0xa1, 0xd8, 0xdf, 0x4d, 0xa8, 0xdd, 0x54, 0x58, 0xd8, 0x00, 0xa5, + 0x12, 0x07, 0x13, 0xd9, 0x2e, 0x04, 0xd6, 0x9e, 0xaa, 0xe9, 0x61, 0x27, 0x56, 0xac, 0xb9, 0x3a, 0x85, 0x5d, 0xb9, 0x67, 0x99, 0x15, 0x3a, 0xa1, 0x26, 0xfb, 0x3d, 0x2d, 0x61, 0x7e, 0x82, 0xf7, + 0xf0, 0x76, 0x67, 0x1a, 0xa2, 0x7b, 0xd2, 0xaa, 0x78, 0xcc, 0xce, 0xbf, 0xb3, 0x9c, 0xfe, 0x80, 0x91, 0xa1, 0x15, 0x12, 0xaf, 0xdd, 0xd0, 0x6f, 0x4b, 0xf4, 0x23, 0x8a, 0xcc, 0x85, 0xe4, 0x99, + 0x77, 0xe7, 0x66, 0x7f, 0x43, 0x41, 0xd5, 0x2b, 0x66, 0x42, 0x7a, 0x14, 0xa9, 0x39, 0xd0, 0xc9, 0x86, 0xd8, 0x66, 0xe7, 0x08, 0x5b, 0xca, 0x28, 0x66, 0x62, 0xb2, 0x6d, 0xa9, 0x5c, 0x80, 0x50, + 0x9e, 0xb2, 0x56, 0xba, 0x41, 0x87, 0x45, 0x90, 0xc1, 0xa2, 0x48, 0xe0, 0x98, 0xc2, 0x4c, 0xf9, 0xa9, 0x5b, 0x4c, 0x31, 0xab, 0x3d, 0xad, 0x59, 0x26, 0x1c, 0x8b, 0x93, 0x71, 0x90, 0xf6, 0x31, + 0x4d, 0xb1, 0xc7, 0xe0, 0xe4, 0x69, 0x2b, 0xe6, 0x4f, 0xaa, 0xb9, 0x92, 0xf3, 0x8f, 0xbf, 0xac, 0x3e, 0x3f, 0xff, 0xed, 0x66, 0x75, 0x61, 0x55, 0x04, 0xd9, 0xef, 0xb6, 0x89, 0x8f, 0x02, 0x55, + 0x0d, 0x33, 0x81, 0x3d, 0xa7, 0xcb, 0x7e, 0x65, 0x45, 0x5a, 0xa5, 0x4f, 0xfb, 0xfb, 0x2f, 0x37, 0x32, 0xbc, 0xfb, 0x11, 0x86, 0x47, 0x4a, 0x8c, 0x6e, 0x3f, 0xe2, 0x3c, 0x8c, 0xb7, 0x3e, 0x38, + 0xf7, 0x7e, 0x1a, 0x30, 0xac, 0x08, 0x20, 0x43, 0xf4, 0xd8, 0xa3, 0xc6, 0xb0, 0x18, 0xed, 0xa3, 0xd5, 0x09, 0xef, 0xeb, 0x31, 0x28, 0xa0, 0xe8, 0xd2, 0x2a, 0x67, 0x1b, 0x3e, 0xe2, 0xdd, 0xb2, + 0x5f, 0x1a, 0xfc, 0xca, 0x60, 0xb1, 0xf9, 0x04, 0x29, 0xb0, 0x5e, 0x22, 0x85, 0x66, 0x27, 0xac, 0x54, 0x55, 0x02, 0xdd, 0xdd, 0xf4, 0xb8, 0xc9, 0x4c, 0xd3, 0x3c, 0x44, 0x9b, 0xb1, 0xd7, 0x27, + 0xe6, 0x4c, 0xe3, 0x83, 0x2c, 0x08, 0xf4, 0xe0, 0x2b, 0x3c, 0x8a, 0xbf, 0x03, 0x63, 0x9c, 0xf8, 0x1f, 0x87, 0x31, 0x7e, 0x19, 0xb8, 0xfb, 0xdb, 0xd5, 0x23, 0xb0, 0x89, 0xcf, 0x34, 0x5f, 0xc5, + 0x22, 0x3b, 0xe3, 0x92, 0x0c, 0x90, 0x83, 0x83, 0xb8, 0x3c, 0xd9, 0x64, 0xbf, 0x2b, 0x65, 0x79, 0x42, 0x84, 0x24, 0x4b, 0x6f, 0x22, 0x89, 0xd5, 0x5b, 0x6f, 0x2c, 0xb9, 0xf1, 0x04, 0x8e, 0x8b, + 0x1c, 0x5a, 0x49, 0x58, 0xc2, 0xfa, 0xfe, 0x18, 0xe3, 0x0d, 0x6e, 0x8d, 0x76, 0xb6, 0x11, 0x80, 0xcd, 0x42, 0x65, 0x6a, 0x02, 0xcb, 0xb8, 0x76, 0x47, 0x8a, 0x5d, 0xe9, 0x08, 0x1b, 0x7c, 0x5c, + 0x23, 0xeb, 0x65, 0x9c, 0x96, 0xb2, 0xb5, 0x61, 0xa0, 0xaf, 0xe4, 0x60, 0xf0, 0xcc, 0xfb, 0xe3, 0x41, 0x89, 0xfb, 0xb2, 0x0a, 0x2c, 0xa3, 0x72, 0x8c, 0x41, 0x03, 0x73, 0xd9, 0x4f, 0xdc, 0x22, + 0x8d, 0x7f, 0xaf, 0x30, 0xb7, 0x06, 0xe9, 0x69, 0xbf, 0x79, 0x44, 0xe9, 0xfc, 0x40, 0xff, 0x3c, 0x60, 0x1f, 0xae, 0x9e, 0x93, 0xfb, 0x07, 0x28, 0x9f, 0xba, 0x0b, 0x25, 0x9a, 0x83, 0x2b, 0xa5, + 0x73, 0x0a, 0xe6, 0x42, 0x0d, 0x4c, 0x32, 0xca, 0x0c, 0x02, 0xd5, 0x8c, 0xb3, 0x28, 0xc7, 0x37, 0x14, 0x98, 0x01, 0x44, 0x4b, 0xec, 0x75, 0x09, 0x5c, 0x4d, 0x17, 0x7e, 0xa1, 0x32, 0x8c, 0xea, + 0xb7, 0x06, 0xd0, 0x4c, 0xd6, 0x7d, 0x6d, 0xd6, 0xb9, 0x7b, 0xd0, 0xb6, 0x8d, 0xa3, 0x82, 0x20, 0xb3, 0xdf, 0xb1, 0x25, 0xc3, 0x12, 0x0a, 0xc7, 0x83, 0xcd, 0xac, 0xfd, 0xc6, 0x8e, 0x36, 0x18, + 0x8e, 0xe7, 0x77, 0x34, 0xeb, 0xf6, 0xca, 0x08, 0x3f, 0xd2, 0xd7, 0xe2, 0xf9, 0xb6, 0x33, 0x0f, 0xcf, 0x47, 0xa3, 0x0b, 0xa1, 0xaf, 0x19, 0x17, 0x58, 0x00, 0xb1, 0xda, 0x07, 0x3b, 0x72, 0x17, + 0x20, 0xfd, 0x49, 0x66, 0xe7, 0x9a, 0x78, 0x0c, 0x0e, 0xcc, 0xf8, 0x40, 0x9d, 0x08, 0x11, 0x39, 0xf8, 0x31, 0xa5, 0x0b, 0xc6, 0xb6, 0xb3, 0x57, 0xb3, 0x8e, 0x33, 0xca, 0xc0, 0x99, 0xd3, 0x05, + 0xd0, 0xeb, 0x07, 0x50, 0x8b, 0xf5, 0xd2, 0x3a, 0x2e, 0x02, 0x2e, 0x82, 0x11, 0xa3, 0x80, 0x7a, 0x5c, 0x0f, 0x74, 0xa6, 0x43, 0x63, 0x4c, 0x59, 0x24, 0xf0, 0xe3, 0x35, 0x7c, 0x57, 0x20, 0x3b, + 0x97, 0x6c, 0xea, 0xbf, 0xd0, 0xec, 0xfa, 0xc6, 0xc2, 0x74, 0xe1, 0xe2, 0x93, 0x24, 0xde, 0xb5, 0xb6, 0x1e, 0x53, 0x3d, 0x7e, 0x13, 0x7e, 0x33, 0x5a, 0x67, 0x89, 0x1f, 0x58, 0x54, 0x9e, 0x99, + 0xa0, 0xb0, 0x8f, 0xf5, 0xb2, 0x9a, 0x1c, 0xfb, 0x52, 0x99, 0x77, 0x64, 0x16, 0xac, 0x97, 0x70, 0xc5, 0xce, 0xd7, 0xf2, 0x72, 0x3e, 0x41, 0x9b, 0xe3, 0x0c, 0x65, 0x73, 0x6c, 0x56, 0x4f, 0x60, + 0x7b, 0x8e, 0x7b, 0x8b, 0x0c, 0x04, 0x1a, 0xef, 0x90, 0x97, 0x34, 0xbb, 0x32, 0xb2, 0xa6, 0x27, 0xd7, 0xa8, 0x0c, 0x60, 0x29, 0x31, 0x6f, 0x9b, 0xbc, 0x96, 0x56, 0x56, 0x72, 0x20, 0x94, 0xfd, + 0x3b, 0x5b, 0xf8, 0xfb, 0xeb, 0xd4, 0x90, 0xe6, 0x07, 0x85, 0x53, 0xd6, 0xf1, 0x5d, 0x67, 0x38, 0xf4, 0x28, 0x3b, 0x9f, 0x68, 0x5e, 0x38, 0xf9, 0x74, 0x34, 0x82, 0xbe, 0x66, 0x22, 0x3c, 0x22, + 0x9d, 0x10, 0xda, 0x3b, 0x32, 0xbb, 0xc1, 0x45, 0xc7, 0xcb, 0x49, 0x12, 0xa5, 0x73, 0x21, 0xd8, 0x42, 0x8b, 0x03, 0x7c, 0x7c, 0x54, 0x70, 0x2b, 0xbf, 0x48, 0x6b, 0xef, 0x6c, 0x59, 0xfc, 0x13, + 0x39, 0x37, 0x2b, 0x1a, 0xc2, 0x91, 0xfb, 0xb1, 0x97, 0x47, 0x80, 0x1b, 0x0a, 0xe7, 0xa2, 0xd4, 0x56, 0x67, 0x3b, 0x60, 0xc0, 0xaa, 0x29, 0x40, 0x26, 0xba, 0xd7, 0xe4, 0x92, 0x50, 0xd0, 0x03, + 0x05, 0x13, 0x9a, 0x22, 0xf7, 0xf0, 0x62, 0x31, 0x21, 0xa6, 0x06, 0xc1, 0x90, 0x7e, 0x73, 0xf0, 0x70, 0x75, 0x36, 0x8e, 0xf9, 0xfe, 0xb8, 0xea, 0xe4, 0xdd, 0x0c, 0x09, 0x6b, 0x68, 0xa9, 0x9b, + 0x6c, 0x64, 0x2c, 0x24, 0x29, 0x3a, 0xee, 0x01, 0x6d, 0x4d, 0xb4, 0x73, 0x09, 0x68, 0x55, 0x41, 0x8f, 0xa7, 0xf3, 0x09, 0x64, 0xec, 0xf0, 0x66, 0xcf, 0xca, 0xdf, 0x58, 0x35, 0x87, 0x71, 0xa9, + 0x2e, 0x2f, 0x40, 0x29, 0xb7, 0x17, 0xcc, 0x47, 0x52, 0xc4, 0x9f, 0x69, 0x9e, 0xb9, 0x75, 0x3e, 0x3a, 0x97, 0x3c, 0x0f, 0x48, 0x4c, 0x51, 0xa9, 0x64, 0x41, 0x92, 0x06, 0xea, 0x5a, 0xa0, 0x73, + 0xa4, 0xe7, 0x70, 0x04, 0x81, 0xaa, 0x04, 0x2f, 0xd3, 0x32, 0xa8, 0x97, 0x61, 0xbf, 0xf5, 0x09, 0x7f, 0xda, 0xe8, 0x3b, 0x61, 0xb1, 0xf7, 0x76, 0x96, 0xcb, 0x36, 0x15, 0x49, 0x11, 0xba, 0x57, + 0x87, 0x88, 0x2a, 0xf2, 0x8c, 0xb3, 0x1c, 0x4f, 0x59, 0x24, 0x26, 0xc0, 0xba, 0xed, 0x0d, 0x7e, 0xb7, 0xc5, 0x5d, 0xb3, 0xa2, 0xdb, 0x6d, 0x7f, 0xfa, 0x7a, 0x9f, 0x09, 0xd2, 0x4b, 0x71, 0xd8, + 0x7f, 0xfc, 0xfb, 0x07, 0xc8, 0x9b, 0x47, 0xb6, 0x20, 0xd7, 0xb6, 0xfe, 0x5a, 0xcd, 0xdc, 0xb5, 0xad, 0x27, 0x5e, 0xba, 0xb6, 0x35, 0x54, 0xeb, 0xde, 0x21, 0x7e, 0xda, 0xd8, 0xa7, 0xb9, 0x29, + 0x06, 0x04, 0x01, 0x6a, 0x46, 0x68, 0x6c, 0x04, 0xfd, 0x88, 0x88, 0x7c, 0x0c, 0x74, 0xeb, 0xa5, 0x23, 0xdb, 0x82, 0x50, 0x4f, 0x89, 0xc0, 0x0a, 0x09, 0xf3, 0x88, 0x9f, 0x02, 0x64, 0x4e, 0xb2, + 0xec, 0xa4, 0x0b, 0x3c, 0x2b, 0x61, 0xe6, 0xd9, 0x6a, 0x61, 0xae, 0xfb, 0xb5, 0xe5, 0xf5, 0x2b, 0x26, 0x90, 0x00, 0x32, 0x11, 0x8b, 0xfd, 0xd8, 0x3a, 0xb0, 0xc5, 0xe7, 0x88, 0x20, 0x45, 0x10, + 0x17, 0x86, 0xfb, 0x89, 0x25, 0xf9, 0xc0, 0x8c, 0x3b, 0x93, 0x7c, 0x7a, 0xf5, 0xf3, 0xc1, 0xd9, 0x92, 0x1c, 0x30, 0xef, 0x56, 0x87, 0xe3, 0x4a, 0x38, 0x1c, 0x27, 0xec, 0x7c, 0x2e, 0x49, 0xc8, + 0x3e, 0xd7, 0x0f, 0xba, 0x64, 0x0a, 0x91, 0x30, 0xf5, 0xca, 0xee, 0x34, 0x23, 0x97, 0x7c, 0x89, 0x45, 0xc2, 0x52, 0x07, 0x91, 0x14, 0xe2, 0x29, 0x75, 0xda, 0x52, 0x22, 0xb8, 0x47, 0x53, 0xbc, + 0x9d, 0xb7, 0x60, 0x40, 0xed, 0x79, 0x23, 0xb3, 0xd4, 0x95, 0xd6, 0xe6, 0x66, 0x80, 0x1e, 0xed, 0x6e, 0x29, 0xd9, 0x34, 0x8e, 0x6c, 0x97, 0x8f, 0xfb, 0x45, 0xbc, 0x28, 0x3d, 0x77, 0xf0, 0xff, + 0x07, 0x71, 0xb6, 0x32, 0x5e, 0x04, 0xe8, 0xf5, 0x9b, 0x1f, 0xc2, 0x78, 0xaf, 0x9c, 0x7c, 0x0f, 0x23, 0xf4, 0xc7, 0x3b, 0x74, 0x50, 0x1a, 0x86, 0x35, 0xc8, 0x25, 0x5a, 0x9f, 0x73, 0x40, 0x8c, + 0x28, 0x3a, 0x17, 0x5e, 0xdd, 0x96, 0xe5, 0x87, 0xdc, 0x2b, 0x6f, 0x08, 0x3f, 0x0d, 0xec, 0x9b, 0xd3, 0x73, 0xf6, 0xda, 0x00, 0xd9, 0x1e, 0x47, 0xd8, 0xae, 0x3f, 0x28, 0x24, 0xce, 0x1f, 0xc0, + 0x88, 0xe9, 0x0e, 0x5b, 0x05, 0x0f, 0x73, 0x9e, 0x9c, 0xcc, 0x67, 0xc8, 0x06, 0x5a, 0xce, 0x79, 0x41, 0x42, 0xf0, 0x89, 0x19, 0x96, 0xfc, 0x6e, 0xc2, 0x74, 0x0b, 0xdb, 0x9f, 0x82, 0x16, 0xc4, + 0xaa, 0xe5, 0x02, 0xe8, 0x51, 0x4a, 0x75, 0xe9, 0x00, 0xb5, 0x4f, 0x27, 0x52, 0x8c, 0xe4, 0x5a, 0x8a, 0x13, 0x63, 0x25, 0x0a, 0x29, 0xb3, 0x90, 0xa7, 0x5f, 0x0d, 0xef, 0xbf, 0x4a, 0x96, 0xee, + 0x3e, 0x66, 0x50, 0xc9, 0xd2, 0x80, 0x79, 0xf2, 0xb1, 0x5e, 0xee, 0xd2, 0xf8, 0x61, 0x48, 0xd4, 0xee, 0x0c, 0xfe, 0xf5, 0xea, 0x80, 0xbe, 0x25, 0xae, 0xe3, 0x87, 0x50, 0x6b, 0xde, 0xd0, 0x05, + 0x47, 0x6f, 0xcf, 0xce, 0xb9, 0x3a, 0x03, 0x42, 0x2b, 0x45, 0x86, 0x6e, 0x52, 0x88, 0xe0, 0x2c, 0x3b, 0x8e, 0x39, 0x93, 0x6d, 0x3c, 0x63, 0xdd, 0xc9, 0x9b, 0x55, 0x41, 0x98, 0xec, 0x6e, 0xb3, + 0x3b, 0x8e, 0x37, 0xd4, 0x2c, 0x87, 0xe7, 0x40, 0x96, 0x99, 0x4a, 0x4a, 0x40, 0xc0, 0xde, 0x31, 0x98, 0xee, 0xd8, 0x8e, 0x19, 0x9b, 0x5c, 0x4b, 0x6b, 0x80, 0x65, 0x70, 0x33, 0x4c, 0xf6, 0x31, + 0xb2, 0xab, 0xa5, 0x9a, 0xd6, 0xe3, 0xac, 0xde, 0x37, 0x31, 0xad, 0x5f, 0xe9, 0x00, 0xff, 0x92, 0xcc, 0xbb, 0x8f, 0x19, 0x24, 0x99, 0x5f, 0x08, 0xd5, 0xd9, 0xcd, 0x81, 0x7c, 0x62, 0x9e, 0x7f, + 0x7f, 0x0d, 0x7c, 0x43, 0xf7, 0x45, 0xa8, 0x2e, 0x67, 0x67, 0x73, 0x7c, 0xc0, 0x0a, 0x28, 0x19, 0xea, 0x66, 0x5e, 0xaa, 0xc6, 0x7a, 0x5d, 0x73, 0xed, 0x71, 0x1a, 0x84, 0xe9, 0x44, 0x5a, 0x4c, + 0x38, 0x1c, 0x74, 0x04, 0x7c, 0x17, 0x14, 0x4d, 0x2f, 0x69, 0xd1, 0x81, 0x98, 0x4e, 0xe4, 0x1e, 0x63, 0x00, 0x9f, 0x6e, 0x7c, 0x6c, 0x8a, 0x47, 0x4b, 0x16, 0x48, 0x24, 0xdb, 0x37, 0xe7, 0xee, + 0xd2, 0x94, 0x00, 0x6f, 0xcb, 0x4e, 0xad, 0xc2, 0x2e, 0x45, 0x43, 0x2d, 0xa1, 0x39, 0x70, 0x98, 0x8a, 0x03, 0x63, 0xba, 0x17, 0xad, 0xfa, 0xe7, 0x3f, 0xa1, 0x81, 0x2d, 0x59, 0xee, 0xc1, 0xf2, + 0xdd, 0x66, 0x27, 0xf6, 0x40, 0x56, 0xc2, 0xcd, 0x27, 0xbc, 0x30, 0xf6, 0xfd, 0xf5, 0xd1, 0xf9, 0x19, 0x5f, 0xb3, 0xd8, 0x41, 0x4c, 0x66, 0x82, 0x68, 0xab, 0x2d, 0xd4, 0x76, 0xa5, 0xb3, 0xb3, + 0xb1, 0xa8, 0x64, 0x24, 0x0c, 0x40, 0xc5, 0xb5, 0x8e, 0x2f, 0x32, 0x41, 0x97, 0x0d, 0xf8, 0xe0, 0xcf, 0x65, 0x62, 0xa3, 0x02, 0x6c, 0xd8, 0x88, 0x0a, 0x1d, 0x6f, 0x7c, 0x93, 0x16, 0xa2, 0xaa, + 0xa8, 0x96, 0x8c, 0x7b, 0xdc, 0xfb, 0xbb, 0x45, 0x21, 0x5a, 0x52, 0x15, 0x02, 0x9c, 0x1f, 0x33, 0x53, 0x5b, 0xb2, 0x0f, 0x0c, 0xfc, 0x1d, 0x1f, 0xfe, 0x20, 0xbc, 0x81, 0xa7, 0x57, 0x2c, 0x3e, + 0x5f, 0xf7, 0x90, 0x87, 0x1a, 0xde, 0xbd, 0x25, 0xfc, 0xcc, 0xca, 0x97, 0xd3, 0x73, 0x71, 0xfd, 0x00, 0x2d, 0x6c, 0x7f, 0x48, 0x51, 0x8e, 0x44, 0x36, 0x0c, 0xa1, 0x04, 0x7d, 0x00, 0xcd, 0xe0, + 0x99, 0x2c, 0xa5, 0x21, 0x7f, 0x22, 0x8e, 0x99, 0x93, 0x25, 0x1b, 0x79, 0x49, 0x2d, 0x7b, 0xc9, 0x5c, 0x2c, 0x3c, 0x58, 0xd7, 0x75, 0xa7, 0x31, 0xc7, 0xf6, 0x6a, 0x49, 0x54, 0x59, 0xbf, 0x46, + 0x26, 0x4c, 0xc7, 0x5a, 0xb2, 0xb9, 0x60, 0x89, 0xc6, 0xea, 0x95, 0xc5, 0x11, 0xb2, 0xcc, 0x36, 0xb7, 0xe4, 0x22, 0x50, 0xab, 0xcf, 0x0b, 0x3a, 0x4b, 0xc7, 0xaa, 0x8b, 0xe7, 0x0c, 0xde, 0xcf, + 0xa0, 0x84, 0x91, 0x87, 0xba, 0x9b, 0x7e, 0xa0, 0x7e, 0xce, 0x12, 0x7b, 0x77, 0x6d, 0x84, 0x0c, 0xeb, 0x71, 0x8a, 0x1b, 0x2a, 0xa0, 0xb4, 0xa5, 0x73, 0x6a, 0x89, 0x9d, 0x42, 0x82, 0x49, 0xdf, + 0x70, 0xdb, 0x8e, 0x94, 0x33, 0x6d, 0x41, 0xcd, 0x0b, 0x6b, 0x1f, 0xe8, 0x7a, 0x94, 0xd3, 0xd8, 0x69, 0x6c, 0x8f, 0x75, 0x79, 0xca, 0x28, 0x79, 0x65, 0xba, 0xa5, 0x12, 0x26, 0x2d, 0xdb, 0x3f, + 0xe9, 0xa5, 0x9e, 0x6d, 0xaf, 0x2b, 0x6d, 0x51, 0xcf, 0x8e, 0x94, 0x38, 0x59, 0xab, 0x69, 0xc5, 0x23, 0x78, 0x7e, 0xe9, 0x71, 0xfa, 0x19, 0x77, 0x3e, 0xc9, 0x96, 0x23, 0x7e, 0x8d, 0x1f, 0x30, + 0xf4, 0xde, 0x67, 0xcb, 0x9d, 0xa9, 0x7c, 0xfd, 0xf2, 0xb0, 0x49, 0x6f, 0x66, 0x9b, 0x1d, 0x2e, 0x35, 0x40, 0x80, 0xc0, 0x8b, 0x26, 0xeb, 0x32, 0x94, 0xe9, 0x80, 0x6c, 0xc3, 0x90, 0xd1, 0x52, + 0xaa, 0xc8, 0x7a, 0x17, 0x2a, 0x45, 0x37, 0x51, 0x2b, 0x30, 0x31, 0xcb, 0x76, 0x6f, 0x01, 0x15, 0x87, 0xef, 0x11, 0xb3, 0x0a, 0x54, 0x3e, 0xb4, 0x31, 0xc0, 0x4d, 0x72, 0x78, 0x2c, 0xe9, 0x40, + 0x92, 0xcb, 0x0c, 0x4d, 0x88, 0x6e, 0x45, 0x68, 0xc7, 0xd6, 0x1a, 0x18, 0xcb, 0xbe, 0xce, 0xda, 0xc2, 0x6f, 0x47, 0x6c, 0x06, 0x65, 0xd6, 0x3d, 0x06, 0x5d, 0x36, 0x64, 0x56, 0x3b, 0xd5, 0xc8, + 0x4a, 0xd3, 0x63, 0xe0, 0x5c, 0x64, 0xea, 0xfe, 0xd4, 0x7e, 0x24, 0xe0, 0xfc, 0x81, 0xfa, 0x79, 0xf8, 0xde, 0x5d, 0x1b, 0x21, 0xc3, 0x42, 0xd0, 0xca, 0x2e, 0xd9, 0xc9, 0xdd, 0x56, 0xaf, 0x9d, + 0xe2, 0x88, 0x8f, 0x51, 0xdd, 0xad, 0xa3, 0x40, 0xec, 0xa6, 0x12, 0x09, 0x6f, 0x5c, 0x08, 0xc8, 0x5d, 0x79, 0x46, 0xa0, 0xfc, 0x72, 0xcf, 0x59, 0xbd, 0xb0, 0x5f, 0xb0, 0x14, 0x36, 0xa9, 0x17, + 0xd0, 0xd1, 0x2b, 0xe4, 0x4c, 0x61, 0xea, 0xed, 0x21, 0xd9, 0xc4, 0x61, 0xd6, 0x97, 0x8b, 0xf8, 0xd4, 0xad, 0x74, 0x6e, 0xed, 0x1a, 0xb8, 0x14, 0xce, 0xfd, 0x5e, 0xfe, 0x42, 0x8c, 0xab, 0xd7, + 0x50, 0x54, 0x7a, 0xcf, 0xde, 0x7c, 0xcc, 0x38, 0xb9, 0x26, 0x7d, 0xe1, 0xcb, 0x9b, 0x0b, 0x43, 0x0d, 0x94, 0xd9, 0x98, 0x67, 0x74, 0x42, 0x2b, 0x32, 0x72, 0xcc, 0x05, 0xd1, 0xd8, 0xf4, 0x0f, + 0x0d, 0x86, 0x87, 0x64, 0x28, 0x3a, 0x66, 0xca, 0xe5, 0xe3, 0x95, 0x10, 0xef, 0x05, 0xd4, 0xdb, 0xb1, 0x36, 0xbb, 0x20, 0xbb, 0x79, 0x26, 0x69, 0xba, 0x2a, 0x94, 0xeb, 0x22, 0x12, 0x19, 0xba, + 0x38, 0xa6, 0x9d, 0x30, 0x73, 0xd6, 0x01, 0xa8, 0x1f, 0x96, 0x6d, 0xad, 0x34, 0x7b, 0x4c, 0x5f, 0xb7, 0x7b, 0x61, 0x95, 0x7d, 0x31, 0xb7, 0x7d, 0xc7, 0x34, 0x12, 0x6f, 0x64, 0xa5, 0x71, 0x6c, + 0x9c, 0x5b, 0x7a, 0xfe, 0x85, 0xea, 0xca, 0x35, 0xed, 0x27, 0xb6, 0x5c, 0x5f, 0x19, 0xaa, 0xb6, 0x1c, 0x17, 0x5d, 0x81, 0x9c, 0x0e, 0xd9, 0xbe, 0xb2, 0xe3, 0x62, 0x0d, 0xe7, 0x4c, 0x58, 0x14, + 0x3a, 0x78, 0x80, 0x0b, 0x05, 0x3e, 0xb2, 0x24, 0xd3, 0x01, 0xde, 0x31, 0xe3, 0x60, 0x16, 0x73, 0xf4, 0xb8, 0xd1, 0xcb, 0x36, 0xb6, 0x66, 0xb0, 0xbf, 0xd5, 0xa6, 0xda, 0x5e, 0x3d, 0x45, 0x85, + 0xb1, 0x6f, 0x61, 0xb0, 0x3f, 0x64, 0xf8, 0xbe, 0x66, 0xf6, 0x04, 0xb1, 0xaf, 0x1a, 0x73, 0x0d, 0xd9, 0x31, 0xf3, 0x95, 0xe1, 0xf6, 0x09, 0xb8, 0xc8, 0xf3, 0x5b, 0x9c, 0x75, 0xaf, 0x9f, 0x7f, + 0x6f, 0xfc, 0xf6, 0xfd, 0xb3, 0xee, 0xf9, 0x48, 0x1e, 0x1f, 0x9d, 0x33, 0xe5, 0x37, 0x63, 0x73, 0x3e, 0x1f, 0x1a, 0x7b, 0x27, 0x00, 0xc0, 0x9e, 0xfb, 0x95, 0xd5, 0xa1, 0xe8, 0x18, 0xad, 0xa7, + 0x46, 0x4e, 0x32, 0x8c, 0x82, 0xad, 0xeb, 0x6e, 0xea, 0x54, 0xd3, 0x13, 0x4d, 0x1c, 0x64, 0xd1, 0x8f, 0xb7, 0xf2, 0x32, 0x59, 0xcc, 0x6c, 0xdc, 0xdc, 0x14, 0xba, 0x1d, 0xcc, 0xfa, 0x13, 0xdd, + 0xb0, 0x10, 0x71, 0xc0, 0x30, 0x75, 0x6f, 0xf3, 0x1b, 0x5f, 0x53, 0x7b, 0xbd, 0x1a, 0x0b, 0x60, 0xef, 0x9f, 0x48, 0xe7, 0x68, 0x99, 0xf0, 0x57, 0x23, 0xf3, 0x57, 0xb0, 0xf5, 0x1a, 0x1f, 0xe6, + 0xf6, 0x4a, 0xf0, 0x88, 0x07, 0xf3, 0x2d, 0xe1, 0x27, 0xa6, 0xbe, 0x39, 0x1d, 0xea, 0xcb, 0xcc, 0xc7, 0xba, 0xd4, 0x57, 0xf9, 0x7c, 0xb6, 0xe4, 0x16, 0x47, 0xd6, 0x0e, 0x84, 0x65, 0xb1, 0x87, + 0xa1, 0xb8, 0xe1, 0x95, 0x26, 0x91, 0x7d, 0x0c, 0x01, 0x01, 0x36, 0x9d, 0x46, 0x73, 0x0d, 0x35, 0x11, 0x5e, 0xe7, 0x67, 0x48, 0xd7, 0xad, 0xb2, 0xc3, 0xdc, 0x8e, 0x29, 0xac, 0x75, 0xa0, 0xa9, + 0x91, 0xee, 0x50, 0xa5, 0x5d, 0xf5, 0x6c, 0xee, 0x8d, 0xdb, 0x0d, 0xe1, 0x64, 0xdd, 0xb6, 0x81, 0x0e, 0xef, 0x11, 0xf2, 0x3f, 0xeb, 0x9f, 0xf5, 0x49, 0x6f, 0x5f, 0xcf, 0xa9, 0x46, 0x41, 0xf2, + 0xa4, 0x12, 0x97, 0x81, 0xf5, 0x7a, 0xcb, 0x15, 0x54, 0xc1, 0x87, 0x2e, 0xf1, 0x4f, 0xf7, 0x50, 0xb7, 0x66, 0xc7, 0xa3, 0xbe, 0xa8, 0xc1, 0xd1, 0xa2, 0xab, 0xb1, 0xb8, 0xfa, 0x64, 0x60, 0x2b, + 0x7b, 0xf8, 0x91, 0x14, 0xf5, 0xaf, 0x7b, 0xd9, 0xc3, 0x83, 0x32, 0xd4, 0x97, 0x2e, 0x31, 0x0d, 0xe7, 0x51, 0x76, 0x3c, 0x9d, 0xa6, 0xce, 0x0e, 0xb6, 0x72, 0x6f, 0x8b, 0x8a, 0x1b, 0x6d, 0x8b, + 0x1a, 0xa7, 0x3e, 0xed, 0x18, 0xd6, 0x08, 0x15, 0x20, 0x60, 0x93, 0xf9, 0xd4, 0xdd, 0xed, 0x90, 0x99, 0xd6, 0x33, 0xbd, 0x66, 0x1c, 0x0e, 0x1a, 0x32, 0x53, 0x98, 0x50, 0x35, 0xf6, 0x88, 0x2c, + 0x90, 0xc1, 0x38, 0x5c, 0xa2, 0x9b, 0x90, 0x88, 0xfd, 0x52, 0xc0, 0x18, 0x66, 0x92, 0x6b, 0x93, 0xdb, 0x0e, 0x80, 0xbf, 0x6d, 0x00, 0xe2, 0x2c, 0x72, 0x46, 0x75, 0x76, 0x49, 0xb3, 0x4d, 0xab, + 0xc0, 0xfd, 0x0c, 0xdf, 0xf6, 0xa1, 0x55, 0xec, 0xe6, 0x23, 0xce, 0x33, 0xef, 0xd6, 0x07, 0x43, 0x77, 0x1c, 0x03, 0x99, 0x52, 0x7b, 0x88, 0x8b, 0xd6, 0x7a, 0x44, 0xd5, 0x60, 0x53, 0x6a, 0x78, + 0xb9, 0x5d, 0xd6, 0x54, 0xc3, 0xce, 0x32, 0x97, 0xab, 0x91, 0x56, 0xd9, 0xe1, 0x11, 0xbc, 0x40, 0xf5, 0x99, 0x51, 0x82, 0x90, 0xa7, 0x2e, 0x4f, 0xec, 0x69, 0x9a, 0x4a, 0xe0, 0x32, 0xad, 0xb7, + 0x96, 0x2a, 0x9b, 0x31, 0xb5, 0xd2, 0x0e, 0xfc, 0x02, 0xa5, 0xc5, 0xae, 0x4f, 0x20, 0x74, 0xbb, 0x8f, 0xe6, 0x46, 0xf7, 0x07, 0x2d, 0x38, 0xaf, 0xd2, 0x98, 0xc7, 0xb7, 0x7c, 0xc1, 0x7f, 0x89, + 0xfa, 0x18, 0x19, 0xe5, 0xbd, 0xf6, 0x16, 0x0f, 0xee, 0x31, 0x4f, 0x14, 0x9f, 0x06, 0xe3, 0xe9, 0xff, 0xd0, 0x3d, 0xc5, 0xa3, 0x64, 0xd8, 0x37, 0x1c, 0xb3, 0x47, 0x71, 0x71, 0xb3, 0xa9, 0x5a, + 0x13, 0x4b, 0x2a, 0x9a, 0x65, 0x59, 0x83, 0x2b, 0x8d, 0xdd, 0x26, 0x94, 0x71, 0xd2, 0x9d, 0x76, 0xa9, 0x6c, 0xd5, 0x55, 0x34, 0x76, 0x37, 0x70, 0x53, 0xef, 0x61, 0x72, 0x81, 0xb6, 0x9b, 0x0a, + 0x0d, 0xe7, 0xfd, 0xbc, 0x2a, 0x8e, 0x1d, 0xc0, 0x9d, 0xa0, 0x1d, 0xcc, 0x92, 0xe3, 0x09, 0x26, 0xf4, 0x13, 0x9b, 0x11, 0x02, 0xe4, 0x2f, 0x4b, 0xf8, 0xf8, 0x8c, 0x7d, 0x81, 0xe5, 0x8c, 0x8c, + 0xa4, 0x0c, 0xee, 0xf0, 0xf0, 0xb1, 0xd0, 0xf4, 0x6f, 0xb2, 0x67, 0x46, 0xbe, 0x9c, 0x0c, 0x0d, 0x4b, 0xe7, 0x02, 0x2d, 0xb8, 0xfe, 0x1e, 0xc2, 0x20, 0x6b, 0xb7, 0xd8, 0x62, 0x28, 0x47, 0x4d, + 0xe7, 0xbd, 0x97, 0xef, 0x4d, 0x55, 0x9a, 0x1f, 0xb8, 0x85, 0xe8, 0x11, 0x1c, 0x81, 0xc6, 0xd5, 0x56, 0x5b, 0x29, 0x26, 0x99, 0xf5, 0x12, 0xea, 0x9e, 0x5c, 0x6c, 0xd9, 0xd9, 0xe3, 0xcd, 0xc9, + 0x9e, 0xad, 0x64, 0x5c, 0x50, 0x54, 0x0f, 0xd4, 0xa6, 0x89, 0xc8, 0x77, 0x9e, 0x7f, 0xa8, 0x38, 0xae, 0x2e, 0x66, 0xeb, 0xaf, 0xb8, 0xf9, 0x49, 0x46, 0xf0, 0xd3, 0x4f, 0x2f, 0xab, 0x3e, 0x7a, + 0x4e, 0xa0, 0xfa, 0x90, 0x1b, 0x67, 0x94, 0x55, 0x71, 0xce, 0x9c, 0x7c, 0xd1, 0xad, 0x3e, 0x82, 0xdd, 0x94, 0x23, 0xb7, 0x8e, 0xa2, 0x36, 0xb0, 0x2b, 0x7f, 0x74, 0x2e, 0x59, 0xcd, 0xd2, 0xe0, + 0x8f, 0x12, 0xe9, 0xfe, 0x02, 0xd0, 0x74, 0xcb, 0x37, 0xa2, 0xe3, 0x9b, 0xe1, 0xf9, 0xbf, 0x9e, 0x57, 0xcb, 0x7f, 0x1f, 0x52, 0xbc, 0x7c, 0xd5, 0x56, 0xe2, 0xf6, 0xec, 0x7b, 0x24, 0xfc, 0xf7, + 0x9b, 0xec, 0x93, 0xe4, 0xbc, 0x9e, 0x8c, 0xd0, 0x61, 0xa1, 0x40, 0x7e, 0xdf, 0x65, 0x28, 0xc6, 0x45, 0x07, 0xd8, 0x40, 0x56, 0x26, 0x79, 0x90, 0xbd, 0x39, 0xcd, 0xa1, 0x49, 0xb0, 0x5c, 0x9c, + 0x02, 0xd3, 0x6e, 0xab, 0x76, 0xad, 0x6a, 0x9c, 0x07, 0xe5, 0xb2, 0x72, 0x2a, 0x99, 0x74, 0x85, 0xb2, 0xae, 0x77, 0x74, 0x49, 0xce, 0x9e, 0x6e, 0xe7, 0x2a, 0xba, 0x39, 0x3a, 0x21, 0x33, 0x5b, + 0x46, 0x5a, 0x9b, 0x6c, 0x92, 0x6c, 0x67, 0x8b, 0x87, 0xa5, 0x3f, 0x17, 0x22, 0x70, 0x20, 0x30, 0xe7, 0x9d, 0x3e, 0x26, 0x43, 0x58, 0x59, 0x17, 0x96, 0x33, 0x8a, 0x8d, 0x7b, 0xd9, 0x6b, 0xd0, + 0x2f, 0xfc, 0x81, 0x4d, 0xfd, 0x37, 0xd9, 0x33, 0x2b, 0x5f, 0x4e, 0xce, 0x05, 0x94, 0x03, 0xf6, 0x72, 0x35, 0xf4, 0x8c, 0xac, 0x8e, 0xb5, 0xc8, 0x14, 0xfc, 0xe3, 0xd4, 0x3b, 0x6d, 0x89, 0xfd, + 0xd1, 0x1a, 0xef, 0x75, 0x75, 0x8b, 0xe1, 0x73, 0x28, 0xe0, 0x6a, 0x72, 0xc3, 0xea, 0x39, 0x64, 0x5a, 0xad, 0x34, 0xb6, 0x4f, 0xa0, 0x0f, 0x49, 0x51, 0x88, 0x3b, 0xc9, 0x2a, 0x0f, 0x4f, 0xf0, + 0xc1, 0xcc, 0x91, 0x68, 0xac, 0x19, 0xf9, 0x3e, 0x29, 0x76, 0x66, 0xab, 0x89, 0x9a, 0xd0, 0xcf, 0xd1, 0x39, 0xf6, 0xa7, 0xe8, 0x5c, 0x83, 0xc3, 0xd2, 0x6f, 0x5e, 0xf7, 0xc5, 0x19, 0x7e, 0x8f, + 0xb5, 0xe3, 0x5f, 0xf0, 0xf7, 0x51, 0x55, 0x3e, 0xd2, 0xbf, 0xe6, 0xf1, 0xf3, 0xc5, 0xd1, 0x85, 0xfc, 0xd7, 0xcc, 0xd6, 0xd2, 0x24, 0x26, 0x4e, 0x22, 0xbd, 0x5c, 0x9d, 0xa6, 0xac, 0x6c, 0x4f, + 0x81, 0xca, 0x2f, 0x25, 0xa3, 0x80, 0x8e, 0xfb, 0x9a, 0x5e, 0x9e, 0xf6, 0x4d, 0x77, 0x68, 0xa3, 0xa9, 0x41, 0x12, 0x7d, 0x00, 0x0a, 0x76, 0xd8, 0x10, 0xdb, 0x20, 0x43, 0xac, 0x7e, 0x67, 0xf2, + 0xe1, 0x38, 0x85, 0xac, 0xb9, 0xb4, 0xc6, 0x66, 0xbb, 0x63, 0xbd, 0x6d, 0x4d, 0x94, 0x65, 0x98, 0x5e, 0xed, 0x10, 0x86, 0x4d, 0xd8, 0xc7, 0xf7, 0xee, 0x67, 0xe7, 0xe7, 0x73, 0xca, 0xd2, 0x0d, + 0xa5, 0xfa, 0x4a, 0x64, 0xdf, 0x17, 0x22, 0x7f, 0x32, 0x2c, 0x99, 0xdd, 0x8d, 0xac, 0xb4, 0x28, 0xee, 0x6b, 0xb0, 0x8f, 0xf5, 0x90, 0x7b, 0x4b, 0xf8, 0x69, 0x24, 0xde, 0x9c, 0x0e, 0xed, 0x25, + 0x67, 0x89, 0x7b, 0x4b, 0xd5, 0x5a, 0x9f, 0xae, 0x17, 0xb4, 0x1e, 0x60, 0x94, 0xe2, 0xcf, 0x15, 0xba, 0x5f, 0xcd, 0x38, 0x34, 0x90, 0x42, 0xf8, 0x10, 0x9c, 0x28, 0x26, 0xdb, 0x05, 0x3b, 0xb4, + 0x32, 0x0f, 0x62, 0xab, 0x33, 0x18, 0x25, 0x9f, 0x96, 0x6b, 0x54, 0xc8, 0x44, 0x7e, 0xb5, 0xee, 0x7c, 0x24, 0x6f, 0x73, 0x24, 0x5a, 0xad, 0x0e, 0x06, 0x27, 0xec, 0x5a, 0x2a, 0x5f, 0x07, 0x58, + 0xb8, 0xa5, 0xa1, 0x81, 0x26, 0xcc, 0xf9, 0xf7, 0x3a, 0x5d, 0x56, 0x38, 0xe5, 0x13, 0x1f, 0xde, 0x64, 0xad, 0x7d, 0x28, 0x3c, 0x39, 0xdf, 0xfa, 0x5c, 0xf1, 0x35, 0x0a, 0xec, 0xf2, 0xc6, 0x16, + 0xf2, 0x05, 0xff, 0x9d, 0xce, 0x72, 0xb2, 0x2a, 0x48, 0xef, 0x82, 0xb6, 0x3c, 0xd6, 0xb5, 0xe1, 0x1d, 0xed, 0x97, 0x51, 0xf8, 0x7d, 0x65, 0x68, 0x0f, 0x07, 0xb0, 0xda, 0x16, 0x7b, 0x91, 0x26, + 0x24, 0x69, 0x09, 0x27, 0xea, 0xc4, 0xeb, 0x50, 0xcc, 0x57, 0xb3, 0x5c, 0xaf, 0xfb, 0x15, 0x0b, 0x30, 0xdb, 0xc5, 0x6a, 0x9b, 0x2c, 0x55, 0x9e, 0xc5, 0x0a, 0xa6, 0xf7, 0x02, 0xac, 0xab, 0xc1, + 0xca, 0xf5, 0xe2, 0x1c, 0x76, 0x60, 0x6b, 0xa9, 0xb4, 0xca, 0xa9, 0x3d, 0x78, 0x29, 0xb6, 0xe6, 0xfb, 0x4d, 0x00, 0x14, 0x81, 0xc5, 0x1f, 0x0f, 0xc7, 0x16, 0x0b, 0xc6, 0x9f, 0xa7, 0x73, 0xdc, + 0xe3, 0xff, 0x3d, 0xad, 0xf2, 0x41, 0x01, 0x7d, 0xff, 0x84, 0xdf, 0x3c, 0xba, 0xbe, 0x7e, 0xd6, 0x3a, 0x87, 0x88, 0xac, 0x99, 0x2f, 0xea, 0xa4, 0x94, 0xb5, 0x64, 0xb5, 0x9e, 0xe1, 0x9c, 0xbf, + 0xdb, 0x08, 0xa5, 0xe0, 0x2c, 0xc6, 0x0b, 0x90, 0xa7, 0x66, 0x59, 0x1f, 0x9b, 0xa7, 0x7c, 0x2b, 0xa3, 0x35, 0xdf, 0xae, 0x69, 0xfe, 0x00, 0xcb, 0x18, 0x09, 0xa7, 0x9a, 0x91, 0xba, 0xf9, 0x82, + 0x48, 0x44, 0x7c, 0x07, 0x11, 0x5d, 0xa4, 0xb7, 0x7b, 0x5c, 0xf2, 0x65, 0x5b, 0x46, 0x96, 0x8e, 0xad, 0x75, 0xe0, 0x81, 0xc3, 0x06, 0x86, 0xc6, 0x3e, 0x8a, 0xd2, 0x8d, 0x86, 0x5b, 0x7f, 0x2e, + 0xac, 0xd7, 0x5f, 0xbe, 0x3b, 0x1e, 0x0f, 0x04, 0x7d, 0xde, 0x51, 0x7f, 0x19, 0x8b, 0x37, 0x97, 0x2e, 0xc3, 0x30, 0x20, 0xfa, 0x53, 0x14, 0xc0, 0x6e, 0xb7, 0xd1, 0x2b, 0xc5, 0x17, 0x31, 0x71, + 0x61, 0xea, 0x6a, 0x30, 0x99, 0x13, 0x9d, 0x86, 0x4e, 0x53, 0x8a, 0xa9, 0xeb, 0x39, 0x4e, 0x8f, 0xc3, 0x05, 0x90, 0x83, 0x1d, 0x3c, 0x0e, 0x91, 0x30, 0x09, 0x7a, 0xcb, 0xe3, 0xcc, 0x4e, 0x85, + 0xa8, 0x45, 0x01, 0x69, 0x79, 0xb4, 0xe1, 0xd5, 0x12, 0x0b, 0xb0, 0xa8, 0x5a, 0xb0, 0x7a, 0xbe, 0x75, 0x88, 0xdd, 0xc2, 0x8a, 0xf6, 0x5a, 0xff, 0x95, 0xc4, 0x3e, 0x37, 0x7b, 0xba, 0xad, 0xb4, + 0x3f, 0xe4, 0x10, 0x3e, 0x93, 0x3c, 0xf3, 0xe1, 0xe9, 0x60, 0x84, 0x0d, 0x73, 0x00, 0xab, 0x56, 0x68, 0xad, 0x44, 0xed, 0x98, 0x14, 0xeb, 0xe3, 0x1c, 0x97, 0x78, 0x9d, 0x44, 0x73, 0x6b, 0x21, + 0xe0, 0xdc, 0xc2, 0xdb, 0x71, 0xeb, 0xe3, 0x0e, 0x47, 0xf6, 0xa4, 0x31, 0xae, 0xf7, 0xcc, 0xae, 0xa1, 0x7a, 0x9b, 0x95, 0x77, 0xed, 0x64, 0x21, 0x70, 0xf9, 0xc2, 0x5e, 0x85, 0x0e, 0xbc, 0xdb, + 0x6a, 0x59, 0x14, 0xb2, 0x90, 0xb6, 0xcf, 0x68, 0xc6, 0x2f, 0x68, 0x7b, 0x22, 0xee, 0x17, 0xd8, 0x56, 0xfb, 0x4e, 0xf0, 0xf0, 0x07, 0x0c, 0xfd, 0xea, 0x06, 0xc9, 0x53, 0x11, 0x24, 0x95, 0x3b, + 0x0a, 0xef, 0x49, 0x12, 0xfc, 0x50, 0x5b, 0x84, 0xdf, 0x64, 0xcf, 0xac, 0x7b, 0x39, 0x39, 0x7b, 0xce, 0xbe, 0x88, 0xbd, 0xc2, 0xa3, 0xa9, 0x68, 0x6c, 0x4c, 0x64, 0x9f, 0x46, 0xdb, 0x9d, 0x24, + 0xd9, 0x93, 0xdd, 0x92, 0xd9, 0x9f, 0xea, 0xb9, 0x95, 0xb9, 0x41, 0x7b, 0x73, 0xef, 0xfe, 0xe4, 0xed, 0x2a, 0xa3, 0xaa, 0x4b, 0xe7, 0xfe, 0x9a, 0xfe, 0xd0, 0xaa, 0xf5, 0x4c, 0xf4, 0xe9, 0xcd, + 0x9e, 0x0f, 0xcf, 0xde, 0x88, 0x01, 0x6b, 0x93, 0xd2, 0xae, 0x27, 0xd4, 0x01, 0x24, 0xa4, 0x82, 0x83, 0xf0, 0x62, 0xcf, 0x2f, 0x4f, 0x73, 0x21, 0x32, 0xe6, 0x40, 0x44, 0xa0, 0x41, 0x9b, 0x9d, + 0xca, 0x5c, 0x59, 0xce, 0x3d, 0x53, 0xe0, 0xcd, 0xad, 0xc5, 0x33, 0xb8, 0x25, 0x1a, 0x29, 0x89, 0x6c, 0x0d, 0xcd, 0x71, 0x25, 0x5d, 0x6e, 0xa6, 0x88, 0x2b, 0xd2, 0xd8, 0x24, 0xac, 0xf7, 0x9b, + 0x59, 0x62, 0x6f, 0x88, 0x35, 0x18, 0x6f, 0x69, 0xf3, 0x68, 0x7f, 0x27, 0x1f, 0x74, 0x20, 0xfe, 0xe7, 0x87, 0x8a, 0xcb, 0xdb, 0x92, 0xf1, 0xd0, 0x8e, 0x78, 0x45, 0xfa, 0xcc, 0xc3, 0xb7, 0x17, + 0x86, 0xa6, 0x37, 0xfa, 0x47, 0x45, 0x27, 0x55, 0x58, 0x0b, 0x57, 0x73, 0x9b, 0xe4, 0x4b, 0x66, 0x85, 0xf4, 0x32, 0xd8, 0x6a, 0x5a, 0x67, 0xa4, 0xd9, 0xac, 0x9c, 0x4c, 0x55, 0x58, 0x77, 0x8f, + 0x02, 0x39, 0x01, 0x42, 0x08, 0x20, 0xc7, 0xab, 0x09, 0x9b, 0x65, 0x15, 0x8c, 0x5b, 0x05, 0xac, 0xf9, 0x1e, 0xce, 0x2d, 0x4d, 0x13, 0x4b, 0x8f, 0x2a, 0x2e, 0xe4, 0x11, 0x3e, 0x15, 0x43, 0xa0, + 0xae, 0x33, 0xb0, 0xe5, 0xde, 0xe3, 0x6c, 0xdd, 0x5d, 0xe5, 0xaf, 0x52, 0x8d, 0x7e, 0xfe, 0x73, 0x3c, 0x34, 0x11, 0xe2, 0x52, 0x71, 0x71, 0xb6, 0x77, 0x3f, 0x59, 0xa4, 0x1e, 0x98, 0x6d, 0x6f, + 0x08, 0xbf, 0x72, 0xf4, 0x72, 0x7a, 0x5e, 0xb0, 0x06, 0x64, 0x3b, 0xb4, 0x5c, 0x2f, 0x2b, 0x72, 0x16, 0xae, 0xa0, 0x72, 0x99, 0xe1, 0xc8, 0xac, 0xd8, 0x1c, 0x6c, 0xb6, 0x0c, 0x85, 0x95, 0x56, + 0x1a, 0xd9, 0x38, 0x55, 0xd6, 0x81, 0xbf, 0xf0, 0x6b, 0x9c, 0x25, 0x56, 0x3b, 0x11, 0xa4, 0xc2, 0xe5, 0x14, 0x57, 0x7b, 0xa7, 0xe1, 0x81, 0x4a, 0xaf, 0xc5, 0xbc, 0x48, 0x3c, 0x32, 0x04, 0xad, + 0x8e, 0xdb, 0x6a, 0xbd, 0xa6, 0xb6, 0xcd, 0x66, 0x5b, 0x04, 0xc1, 0xe1, 0xf4, 0xde, 0x46, 0xfc, 0x86, 0xae, 0xed, 0xc4, 0x69, 0x18, 0xbc, 0xf1, 0x1d, 0x90, 0xdf, 0xf7, 0x1d, 0xbc, 0xdd, 0x71, + 0xcf, 0x65, 0x7a, 0xcf, 0x0e, 0x9d, 0x4b, 0xc8, 0xf7, 0xfb, 0x25, 0x5c, 0xc3, 0xe7, 0xcd, 0x9b, 0x42, 0xb9, 0xaa, 0x08, 0xee, 0xb9, 0x02, 0xe0, 0x87, 0x52, 0xd0, 0x6f, 0x3e, 0xe1, 0x75, 0xcc, + 0xdf, 0x5d, 0x3f, 0x87, 0x2b, 0x07, 0x6c, 0xd5, 0xe6, 0xb8, 0x2f, 0xcc, 0x08, 0x9d, 0xea, 0xcb, 0x70, 0x61, 0xd4, 0x94, 0x54, 0x1c, 0x09, 0x15, 0x52, 0x94, 0xbd, 0xa5, 0xee, 0xed, 0x35, 0xd6, + 0xb2, 0x9b, 0x9d, 0x91, 0xa7, 0x53, 0x79, 0x33, 0x86, 0x68, 0x7a, 0x86, 0x72, 0xd3, 0x7a, 0xaf, 0x42, 0xdb, 0xbd, 0xb2, 0x96, 0xe6, 0xb4, 0x44, 0x18, 0xbb, 0x74, 0x2d, 0xe8, 0x24, 0xb1, 0xe0, + 0xb6, 0xbe, 0x2d, 0x28, 0xbb, 0xa5, 0x84, 0x7a, 0x81, 0x15, 0x71, 0x8f, 0x0f, 0xfe, 0xe3, 0x15, 0x7a, 0xe4, 0x4b, 0x85, 0xde, 0xf7, 0x5d, 0x47, 0xff, 0x45, 0x15, 0x7a, 0x37, 0xc7, 0xcd, 0xb9, + 0x1b, 0xbf, 0x7d, 0x30, 0x96, 0x75, 0xe7, 0x21, 0xf7, 0xe4, 0xc6, 0x49, 0xec, 0xa1, 0x31, 0xae, 0x9e, 0xea, 0xe8, 0xb0, 0x85, 0x25, 0x04, 0x9d, 0xb4, 0x47, 0x72, 0xd6, 0x6c, 0x33, 0xab, 0xe7, + 0x91, 0xf5, 0xb2, 0x80, 0x43, 0xa2, 0x5d, 0xa1, 0x94, 0x0b, 0x1c, 0xf1, 0xa8, 0x51, 0x92, 0x8d, 0x70, 0x02, 0xe2, 0x13, 0x45, 0xb3, 0x27, 0x6a, 0xbd, 0x97, 0x9c, 0x88, 0x39, 0x62, 0xc8, 0x51, + 0x3c, 0xe1, 0x40, 0x1e, 0x91, 0x5d, 0xe8, 0x72, 0x64, 0xba, 0x3f, 0xf5, 0x68, 0x38, 0x91, 0xc6, 0xb2, 0x3a, 0xfe, 0x2a, 0x6e, 0xf8, 0x9d, 0xb0, 0xd7, 0x55, 0x4c, 0xeb, 0x33, 0xc9, 0xfa, 0x6f, + 0x32, 0xf6, 0x65, 0x65, 0x7c, 0xda, 0xfc, 0xf5, 0x2f, 0x1a, 0xfd, 0xf3, 0x63, 0xee, 0x8d, 0xff, 0xf9, 0xc3, 0xa1, 0x12, 0x10, 0xfa, 0xb8, 0x43, 0x91, 0x98, 0x38, 0x75, 0x9b, 0x6e, 0x33, 0x86, + 0x2a, 0x7b, 0x8f, 0x24, 0xca, 0x21, 0x49, 0xe9, 0x31, 0x18, 0xf3, 0x73, 0x4e, 0x54, 0x66, 0xb2, 0xdb, 0x92, 0xd5, 0xb8, 0xef, 0xab, 0x63, 0xaa, 0x96, 0x2b, 0x65, 0xdd, 0x35, 0x4b, 0x70, 0x86, + 0x52, 0x79, 0x0d, 0x97, 0x0c, 0x24, 0x56, 0xda, 0x12, 0x15, 0x69, 0x48, 0xf7, 0xb8, 0x4d, 0x6c, 0x69, 0xed, 0x29, 0x68, 0xf7, 0xf5, 0xe1, 0x71, 0x2f, 0xcd, 0xff, 0x38, 0x09, 0xc8, 0x3e, 0x8b, + 0x34, 0xe0, 0x0f, 0x6a, 0xa8, 0x2f, 0x64, 0x9f, 0x47, 0xf8, 0x72, 0x32, 0xc2, 0x87, 0x69, 0xa9, 0x7b, 0x94, 0xdc, 0x49, 0x9b, 0x85, 0x95, 0x1f, 0xe7, 0x05, 0x9d, 0xcd, 0x13, 0x99, 0x6a, 0xea, + 0x8d, 0x1e, 0xe7, 0x75, 0xdd, 0x8c, 0x53, 0x5d, 0xe4, 0x32, 0xd6, 0xd9, 0xe2, 0x06, 0x5b, 0x14, 0x68, 0x8a, 0xb2, 0x16, 0x35, 0x89, 0x76, 0x06, 0xbe, 0x9a, 0xba, 0xea, 0x46, 0xa4, 0x13, 0xb3, + 0x63, 0xd9, 0xc3, 0x1c, 0x00, 0xa1, 0x34, 0x5d, 0x12, 0x5c, 0x21, 0xd5, 0xea, 0xe6, 0x54, 0xa9, 0xf6, 0x9f, 0xcc, 0xe9, 0xf3, 0x4f, 0xff, 0xad, 0x0a, 0x8c, 0xff, 0xd6, 0xdd, 0xfb, 0x4d, 0x35, + 0xff, 0x3d, 0xbb, 0xfa, 0x31, 0x9d, 0xf7, 0x85, 0xf0, 0xeb, 0x88, 0x3c, 0xc3, 0x0b, 0x0c, 0x8c, 0xa5, 0x45, 0xc6, 0x6a, 0x6b, 0xa0, 0x2b, 0x13, 0xd8, 0xc9, 0x99, 0x41, 0xe3, 0x4c, 0xe9, 0x2c, + 0xfc, 0x39, 0x61, 0xeb, 0xbb, 0x7c, 0xb1, 0x75, 0x57, 0x12, 0xad, 0x30, 0xc6, 0xcc, 0x0c, 0x6c, 0xd0, 0x2e, 0x44, 0xdf, 0x0b, 0x2a, 0x6f, 0x7f, 0xac, 0xc1, 0xc8, 0xa9, 0x04, 0x35, 0x17, 0xf5, + 0x79, 0xaa, 0xed, 0xa0, 0xd3, 0x72, 0xa9, 0x9a, 0x61, 0x66, 0x2f, 0x90, 0x0a, 0xa8, 0xf6, 0x21, 0x66, 0xca, 0x82, 0xf2, 0x78, 0xf4, 0x27, 0x0e, 0x92, 0xb7, 0xb0, 0x07, 0x8f, 0x35, 0x23, 0x18, + 0x34, 0x26, 0x75, 0xe6, 0x14, 0x86, 0x77, 0x7f, 0x44, 0xc8, 0xc7, 0xec, 0xd3, 0x57, 0xb2, 0x4f, 0xe3, 0xf1, 0x7a, 0x72, 0xee, 0x47, 0x30, 0x40, 0x5b, 0x4e, 0xa7, 0x34, 0x60, 0xac, 0x4b, 0x3a, + 0x3c, 0x9d, 0xc2, 0x58, 0x1c, 0x4f, 0x44, 0x69, 0x2a, 0xcd, 0x37, 0xc0, 0x81, 0x58, 0x48, 0xa7, 0xa8, 0x03, 0x18, 0xb9, 0x00, 0x8d, 0x45, 0x2b, 0x40, 0xe4, 0x71, 0x09, 0x28, 0x08, 0xe6, 0x95, + 0x4c, 0x3c, 0xd9, 0xc0, 0xbc, 0xe0, 0x9e, 0x0c, 0xd8, 0xe5, 0x00, 0x09, 0xd8, 0x70, 0xd1, 0x76, 0x92, 0xae, 0x0f, 0x99, 0xd8, 0xa4, 0xe9, 0x0c, 0xcc, 0x14, 0x11, 0x5e, 0x3c, 0x3e, 0x43, 0xac, + 0x34, 0xce, 0xd2, 0xe4, 0xe9, 0xf7, 0x3b, 0x71, 0x50, 0x55, 0x57, 0x18, 0x39, 0xff, 0xfb, 0xed, 0x6d, 0xe9, 0x31, 0x70, 0x42, 0xe3, 0xf2, 0x31, 0xf2, 0x5e, 0x9f, 0xb2, 0x1d, 0xb3, 0x7e, 0xc1, + 0xb9, 0x40, 0xaf, 0x11, 0x82, 0xcf, 0x9d, 0x3f, 0x9f, 0xb3, 0xa9, 0xaf, 0xfb, 0xaa, 0xbf, 0xeb, 0x39, 0xef, 0xa6, 0x45, 0xfc, 0x1b, 0xc9, 0xf3, 0x43, 0x4c, 0xf0, 0xe9, 0xe3, 0xe0, 0x8c, 0x7d, + 0xf4, 0xf3, 0x25, 0x22, 0x78, 0xf5, 0xf5, 0xd8, 0xa9, 0xfc, 0xd4, 0xfe, 0xbd, 0x26, 0x5f, 0x2d, 0xdd, 0x71, 0x70, 0x81, 0xb3, 0xbd, 0x4e, 0x7a, 0xfc, 0xf1, 0xe3, 0x67, 0x7e, 0xf9, 0xc2, 0xb9, + 0x9d, 0xd5, 0xb5, 0xde, 0x7f, 0x0d, 0x1a, 0x76, 0xa3, 0xd8, 0xff, 0x0b, 0x09, 0xc5, 0x7f, 0x61, 0xbf, 0xa0, 0x1f, 0xff, 0x7f, 0x18, 0x7d, 0xc6, 0x09, 0x1a, 0x52, 0x4e, 0xf9, 0x46, 0xb4, 0xae, + 0xae, 0xbf, 0xb0, 0xf7, 0xb6, 0xd9, 0x87, 0x3e, 0xb0, 0xb1, 0x9f, 0x29, 0x82, 0xa3, 0xcb, 0xff, 0xd1, 0x99, 0xc6, 0xd7, 0xa2, 0x2b, 0x29, 0xda, 0x7c, 0x51, 0x6f, 0x54, 0xd4, 0x61, 0x2a, 0x79, + 0x25, 0x35, 0xc9, 0x7a, 0x4f, 0xac, 0xac, 0xa3, 0x53, 0xc1, 0x21, 0x54, 0x8d, 0xc5, 0x5a, 0x2c, 0xe7, 0x27, 0x49, 0x3a, 0x95, 0xce, 0x91, 0x19, 0x23, 0x87, 0x88, 0xcc, 0x55, 0x77, 0xbe, 0x94, + 0x66, 0x41, 0xd9, 0xea, 0xf9, 0xb2, 0x59, 0x68, 0xec, 0x6e, 0x21, 0x7a, 0x3a, 0x40, 0xb0, 0x60, 0x43, 0xaf, 0xd7, 0xbe, 0xe3, 0xb7, 0x9d, 0x7b, 0xfc, 0x83, 0x85, 0xa4, 0xfc, 0xf9, 0x9a, 0xa2, + 0xfe, 0xfd, 0xd1, 0xb9, 0xb1, 0xe6, 0x64, 0x8e, 0x53, 0x30, 0x6f, 0x1e, 0x27, 0x38, 0x57, 0x28, 0x7d, 0x4f, 0x52, 0x71, 0x09, 0x43, 0x95, 0x23, 0x2b, 0x8d, 0xd2, 0xe2, 0xea, 0xb3, 0x1f, 0x3f, + 0x7e, 0xa6, 0x67, 0xd7, 0xad, 0x11, 0xbd, 0xf5, 0x2d, 0xfd, 0xf8, 0xf1, 0xbb, 0x5a, 0xe4, 0x81, 0x91, 0x8f, 0xef, 0xfb, 0x9f, 0x1e, 0xc9, 0xcc, 0x8f, 0x4b, 0x70, 0x04, 0xc6, 0xe5, 0xd0, 0x2c, + 0xfc, 0x92, 0x3d, 0x4a, 0x1d, 0xb0, 0x0b, 0x85, 0x2a, 0x9e, 0xe0, 0x82, 0x8e, 0x10, 0xe9, 0x04, 0x9b, 0x4f, 0xe7, 0x33, 0x7e, 0x4e, 0x1f, 0x0e, 0xd8, 0x06, 0xd3, 0x73, 0x87, 0x15, 0x75, 0xba, + 0xc1, 0xc9, 0x6a, 0x0b, 0x84, 0x26, 0xda, 0x1c, 0x41, 0xa5, 0x37, 0x38, 0x4d, 0x82, 0xa4, 0x2d, 0xd7, 0x6b, 0x55, 0xcc, 0x6f, 0x04, 0xc8, 0x04, 0x0c, 0x5b, 0xdd, 0xce, 0x1a, 0xb3, 0x84, 0xa5, + 0x99, 0xb1, 0xf8, 0x3e, 0x68, 0xfe, 0x99, 0x37, 0xd5, 0x7d, 0xd4, 0x3b, 0xfc, 0xa1, 0xae, 0x03, 0xaf, 0x54, 0x5f, 0x56, 0xf1, 0xa7, 0xe3, 0x11, 0x3e, 0xac, 0x9b, 0x80, 0xaf, 0xa4, 0xfe, 0xda, + 0x59, 0xba, 0x47, 0xd0, 0x9a, 0x60, 0x24, 0xdd, 0x65, 0x06, 0xd8, 0x62, 0xa4, 0x7f, 0xac, 0x24, 0xfc, 0x60, 0x28, 0xb9, 0x6e, 0x42, 0xf2, 0x6e, 0x5c, 0xf0, 0x8d, 0x06, 0xd1, 0x44, 0x66, 0x28, + 0xe5, 0x54, 0x45, 0xe5, 0xf1, 0xa9, 0xb7, 0x4f, 0xfb, 0xa2, 0x8c, 0xc4, 0x55, 0x15, 0x82, 0x9e, 0x8d, 0x91, 0x79, 0x37, 0xc6, 0xa0, 0x90, 0xab, 0xac, 0x12, 0x6f, 0x58, 0xd8, 0xfd, 0x83, 0x99, + 0xf0, 0xd9, 0xda, 0x77, 0xb5, 0x0d, 0x5e, 0xdc, 0x21, 0xdf, 0xcf, 0x1d, 0xc2, 0x07, 0x36, 0x77, 0xbd, 0x3b, 0x41, 0xae, 0xcb, 0x05, 0x1e, 0x72, 0xa7, 0x5f, 0x91, 0xbe, 0x8c, 0xda, 0x9b, 0x0b, + 0x23, 0x62, 0x98, 0x7b, 0x3d, 0xcf, 0xe8, 0x49, 0xa3, 0x44, 0x54, 0x59, 0xd5, 0xe2, 0xa2, 0x71, 0xb8, 0x32, 0x21, 0x16, 0x89, 0xb5, 0x52, 0x9a, 0x66, 0x0c, 0xc1, 0xf9, 0xd2, 0xb0, 0xb8, 0x93, + 0x1c, 0x89, 0x20, 0xc0, 0xb7, 0x9d, 0x45, 0x01, 0x50, 0x8e, 0xb4, 0x7c, 0xdf, 0x60, 0x8c, 0xdb, 0x54, 0x24, 0x04, 0x32, 0x52, 0x82, 0x64, 0xb9, 0x38, 0x2d, 0x57, 0x36, 0x13, 0xa4, 0x9e, 0xce, + 0x2a, 0x14, 0x20, 0x36, 0xad, 0xf2, 0xb8, 0xcd, 0xe1, 0x1b, 0xe5, 0xc8, 0x8d, 0x8c, 0xb7, 0x20, 0x51, 0xdf, 0x1d, 0x9b, 0x81, 0xba, 0xd0, 0x85, 0x57, 0x7e, 0x9f, 0x39, 0x45, 0x14, 0x24, 0xc7, + 0xfb, 0x0b, 0xcb, 0x43, 0xae, 0xd9, 0x8f, 0xf4, 0xdf, 0x8e, 0xd0, 0xef, 0xab, 0x43, 0x83, 0x96, 0x4a, 0x56, 0x4e, 0x0e, 0x51, 0xa6, 0x59, 0x4c, 0x2b, 0x4a, 0xf2, 0x04, 0x41, 0x0c, 0x7a, 0x81, + 0xad, 0xa0, 0x8a, 0xe0, 0xc9, 0x55, 0x3c, 0x69, 0x4a, 0xba, 0x73, 0xc5, 0xcd, 0xac, 0x8d, 0x09, 0x4b, 0x2e, 0x51, 0xbe, 0xf4, 0xd7, 0x28, 0x2e, 0x1b, 0xdb, 0x63, 0x6b, 0x13, 0x10, 0x93, 0x4c, + 0x45, 0x9d, 0xd1, 0xd8, 0xb2, 0x6c, 0x11, 0x47, 0x4d, 0x2d, 0x92, 0x36, 0x14, 0x6d, 0x0b, 0xe9, 0x75, 0xf2, 0xb8, 0x9a, 0x74, 0x63, 0x98, 0xae, 0xa7, 0xd8, 0xb5, 0xd4, 0xbf, 0xe0, 0xe6, 0xff, + 0x1d, 0x43, 0x59, 0x3d, 0xeb, 0x40, 0xb7, 0x97, 0x42, 0xe2, 0x81, 0xa5, 0xf0, 0x4c, 0x11, 0x1c, 0x5d, 0xfe, 0x8f, 0xce, 0x34, 0xbe, 0x1e, 0xa0, 0x03, 0x5b, 0xc7, 0x18, 0xb1, 0x0f, 0x70, 0x4e, + 0x14, 0xe7, 0xcc, 0x8c, 0x8c, 0x11, 0x04, 0xad, 0xec, 0x31, 0x6a, 0x54, 0x3e, 0xe2, 0x24, 0x0b, 0x6b, 0xcf, 0x7b, 0x22, 0x1d, 0xb2, 0xc5, 0x38, 0xf1, 0x6a, 0xd2, 0xb4, 0x97, 0x13, 0x45, 0x3e, + 0xe2, 0xf1, 0x1a, 0x6c, 0x15, 0xa1, 0xc1, 0x7a, 0x41, 0xb1, 0x16, 0x09, 0xbd, 0x49, 0x16, 0x26, 0x3d, 0xf3, 0x0d, 0xac, 0x4c, 0x4d, 0xb9, 0x1b, 0xf7, 0xda, 0xe3, 0x8e, 0x3f, 0x23, 0x6c, 0x5e, + 0x97, 0xb7, 0x2b, 0xbd, 0x30, 0x4a, 0x6d, 0xa3, 0xf4, 0x7f, 0x59, 0x51, 0x9a, 0x38, 0xf6, 0x4b, 0x26, 0x11, 0xf6, 0x1e, 0x27, 0xfe, 0xf9, 0xae, 0xaa, 0xa8, 0x13, 0xcb, 0xb8, 0x74, 0x50, 0xfb, + 0xc7, 0x35, 0x66, 0xe7, 0xd3, 0x30, 0xbf, 0x4d, 0xee, 0xbb, 0x03, 0xe9, 0xf6, 0xc6, 0x49, 0xff, 0x74, 0x07, 0xf2, 0xa5, 0x37, 0xf9, 0xfb, 0x42, 0x02, 0x43, 0x03, 0x03, 0xbe, 0x97, 0x71, 0xbd, + 0xba, 0x74, 0x61, 0xd3, 0x6d, 0x63, 0x08, 0x7b, 0x60, 0xde, 0x1b, 0x61, 0x03, 0x8e, 0x9e, 0xfe, 0x8e, 0xce, 0xdf, 0xff, 0x5a, 0x6c, 0x08, 0x99, 0x41, 0x22, 0x1c, 0xe0, 0xa6, 0x1b, 0xbe, 0x75, + 0x01, 0x42, 0xa8, 0xf7, 0xa9, 0x65, 0x6a, 0x8d, 0x22, 0xd9, 0x62, 0x8d, 0xa3, 0x60, 0x55, 0x28, 0xce, 0x96, 0xaf, 0x11, 0x6e, 0xde, 0x1e, 0x3d, 0xab, 0x4a, 0x6a, 0x13, 0x36, 0xea, 0x74, 0x0e, + 0xec, 0x61, 0x6d, 0x6f, 0xc5, 0x10, 0x45, 0x6f, 0x05, 0x22, 0xaf, 0xeb, 0xd2, 0x2a, 0x4e, 0x79, 0x3c, 0xd9, 0x18, 0xfc, 0x82, 0x06, 0x3f, 0x84, 0xd8, 0xbf, 0x21, 0x36, 0x67, 0xeb, 0xe4, 0x49, + 0x2c, 0x46, 0x4e, 0x5e, 0x1b, 0x97, 0x36, 0xb1, 0xe8, 0x7b, 0xcb, 0xe4, 0x5c, 0xa0, 0x57, 0x5a, 0xbe, 0x13, 0x1b, 0xa3, 0xaa, 0x30, 0x9e, 0x98, 0xe6, 0xfc, 0xfc, 0xb7, 0x5b, 0x69, 0x3c, 0xb7, + 0xb1, 0xb9, 0x2e, 0xd6, 0xca, 0x95, 0x28, 0xd5, 0x45, 0x70, 0x89, 0x9b, 0x5e, 0x84, 0xe4, 0x86, 0x02, 0x7b, 0xd3, 0x81, 0x74, 0xb7, 0x1a, 0x7b, 0x88, 0x6b, 0xc9, 0xc9, 0x52, 0xd3, 0x29, 0x9c, + 0xd3, 0x31, 0x48, 0x1e, 0x13, 0x9e, 0x3b, 0x7c, 0xb8, 0x25, 0x4d, 0xf0, 0x43, 0xce, 0x8e, 0x5b, 0x0f, 0x78, 0x69, 0x00, 0xf5, 0xee, 0xf2, 0xd9, 0xc5, 0x38, 0x40, 0xde, 0xd6, 0x02, 0x09, 0x4a, + 0x54, 0x82, 0xea, 0xa1, 0xee, 0x2f, 0x0f, 0x09, 0x1c, 0xf1, 0xfe, 0x71, 0x6e, 0x4c, 0xe8, 0xad, 0xa8, 0x2a, 0xb2, 0x1e, 0x6a, 0xfe, 0x0e, 0x9b, 0x4e, 0x40, 0x25, 0x11, 0x1b, 0xb2, 0x6b, 0xbc, + 0xbc, 0xca, 0xb3, 0x89, 0x4e, 0x2d, 0x45, 0x2c, 0x56, 0xe4, 0x6e, 0xd3, 0xc1, 0x4a, 0x94, 0x62, 0x55, 0x7e, 0x72, 0x72, 0x13, 0x2a, 0xc5, 0xa8, 0xa8, 0x0d, 0xb1, 0x47, 0xed, 0xfa, 0xdb, 0xdd, + 0x8a, 0x2a, 0x23, 0xbb, 0xc7, 0x29, 0xec, 0x17, 0x8c, 0x3e, 0xe0, 0x85, 0x78, 0xa2, 0x78, 0x5e, 0xb2, 0x33, 0x67, 0x74, 0x21, 0xf1, 0x35, 0x2f, 0x20, 0x70, 0x8f, 0x40, 0x52, 0xab, 0x2c, 0xd5, + 0xa3, 0x6c, 0x6d, 0xe9, 0x4d, 0x80, 0x4d, 0x26, 0x9b, 0x12, 0x10, 0x27, 0xeb, 0xc3, 0xa1, 0xcd, 0x25, 0xce, 0x08, 0x32, 0x96, 0x9e, 0xb5, 0x19, 0x0c, 0xd9, 0xb2, 0x10, 0x64, 0xbb, 0x66, 0x73, + 0x68, 0x55, 0x95, 0x0e, 0x20, 0x78, 0x0f, 0x8a, 0xc7, 0x68, 0xc9, 0xf6, 0x0b, 0x6e, 0xee, 0x2f, 0xad, 0x30, 0xb5, 0x8e, 0x00, 0xc3, 0x25, 0x53, 0x97, 0x9f, 0xcc, 0x1f, 0x57, 0x7d, 0xae, 0xa7, + 0xdd, 0x3f, 0xe1, 0xf7, 0xd3, 0xee, 0xe2, 0x6f, 0xb5, 0x9f, 0x3f, 0x7c, 0x37, 0xd3, 0xec, 0xb4, 0x0a, 0xbc, 0x24, 0x3d, 0xe3, 0xb7, 0xfe, 0xfc, 0x27, 0xf4, 0x5e, 0xe9, 0x75, 0xd3, 0x62, 0xe4, + 0x18, 0x17, 0x34, 0xd9, 0x7f, 0x42, 0xbf, 0xd0, 0x6b, 0x77, 0x85, 0x5b, 0x27, 0xd6, 0x93, 0xa9, 0xf6, 0xea, 0xec, 0xfd, 0xf8, 0xf0, 0x17, 0xdc, 0x95, 0x7f, 0x12, 0xe7, 0x46, 0x34, 0x6f, 0x3e, + 0xf1, 0x8d, 0xf2, 0xf5, 0x27, 0x5d, 0x51, 0x0d, 0x12, 0xdf, 0x29, 0x82, 0x0b, 0x50, 0xf1, 0x3f, 0x91, 0x2b, 0x7f, 0xfb, 0x25, 0xea, 0xf8, 0xea, 0x88, 0x3c, 0x7f, 0xf7, 0x0a, 0x87, 0x3c, 0x0e, + 0x92, 0x20, 0x0e, 0x2e, 0x6d, 0x48, 0xfe, 0xf9, 0x64, 0x9b, 0x5d, 0x7d, 0xfa, 0xb1, 0x9e, 0xe6, 0x9f, 0xf0, 0x55, 0x15, 0xf2, 0x6f, 0xb9, 0x79, 0x79, 0x9b, 0x8f, 0x9f, 0x3e, 0x03, 0x7c, 0x3d, + 0xb1, 0xe3, 0xe6, 0xbe, 0xf5, 0x31, 0xf4, 0x78, 0xf9, 0x25, 0x57, 0x6c, 0x79, 0x0f, 0xa5, 0x75, 0xc3, 0x2f, 0xf2, 0xa1, 0xfc, 0xf5, 0x59, 0xf8, 0xcf, 0xc5, 0xaf, 0xe7, 0xe3, 0x01, 0x8b, 0x8f, + 0x1d, 0x78, 0x9f, 0x75, 0x3f, 0x79, 0xc4, 0xf6, 0x7d, 0xa6, 0xf9, 0x34, 0x69, 0x2e, 0x47, 0x23, 0x68, 0x98, 0x15, 0x0c, 0xb0, 0x10, 0xcf, 0x7b, 0x61, 0x98, 0x52, 0xd3, 0x83, 0x8e, 0x08, 0xae, + 0xdd, 0x48, 0xee, 0x02, 0x10, 0x38, 0x9e, 0x2e, 0xba, 0x48, 0xdf, 0xec, 0x1d, 0x6b, 0xcc, 0x18, 0xd2, 0x5e, 0x82, 0x5d, 0x07, 0x5f, 0xf6, 0xbe, 0x0b, 0x81, 0xee, 0x26, 0x5e, 0x41, 0xe6, 0x3c, + 0x38, 0xc0, 0x73, 0x72, 0xba, 0xc5, 0x2d, 0x56, 0x8f, 0x10, 0x3e, 0x8b, 0x2a, 0x39, 0xab, 0x4e, 0xa1, 0xce, 0x69, 0xb3, 0x23, 0x37, 0x30, 0x5f, 0xc0, 0x0c, 0x92, 0xaa, 0x70, 0x2e, 0xa1, 0x86, + 0x4b, 0x40, 0x62, 0x00, 0xf3, 0x9c, 0xae, 0x1a, 0x7d, 0xa6, 0x25, 0x3e, 0x86, 0x6d, 0xfc, 0x9b, 0xec, 0x13, 0x0b, 0x5f, 0x4f, 0x86, 0xe0, 0x1a, 0xc3, 0x23, 0x17, 0x26, 0xd2, 0x25, 0x8e, 0x4f, + 0x54, 0xcf, 0x9d, 0xd0, 0x0d, 0xef, 0x6e, 0xd2, 0x6d, 0x29, 0x91, 0x40, 0x64, 0xf1, 0xf2, 0x77, 0x97, 0x52, 0xff, 0x8c, 0x8d, 0xff, 0x29, 0xda, 0xfa, 0x63, 0x36, 0xcc, 0x15, 0xe5, 0xa7, 0x77, + 0x7c, 0x7b, 0x3e, 0xd4, 0x6e, 0x39, 0x1a, 0x4c, 0x1e, 0xc3, 0xcc, 0x6c, 0x4b, 0x65, 0x19, 0xba, 0xd6, 0x5b, 0x85, 0x44, 0x49, 0x44, 0x5b, 0x98, 0x49, 0xa6, 0x27, 0xca, 0x71, 0x4d, 0x75, 0xec, + 0x9a, 0xb2, 0xe5, 0x0a, 0x9d, 0x22, 0x80, 0x1d, 0xeb, 0x81, 0x46, 0xea, 0xf0, 0x46, 0x6c, 0xe3, 0xb9, 0xd8, 0x4d, 0x66, 0xc5, 0x4c, 0xc6, 0x08, 0xd1, 0xf4, 0x0f, 0x14, 0xbe, 0xc2, 0x7b, 0xff, + 0xb0, 0xd6, 0xeb, 0x9e, 0x16, 0x79, 0x62, 0xa8, 0xb0, 0xbc, 0x83, 0xb5, 0xfe, 0xf9, 0x8f, 0xa1, 0x30, 0x1b, 0xbf, 0x67, 0xf5, 0x3d, 0x6e, 0x92, 0x8f, 0x70, 0xf3, 0x89, 0xe6, 0x85, 0x8f, 0x4f, + 0x47, 0x67, 0x0e, 0x92, 0x5f, 0x09, 0x0a, 0x63, 0x6f, 0x57, 0x20, 0x9e, 0x93, 0x6b, 0x3d, 0xf2, 0x4a, 0xd3, 0x3a, 0xce, 0x76, 0x30, 0xc0, 0xa4, 0x46, 0x80, 0xb9, 0xea, 0x77, 0x05, 0x25, 0x48, + 0xfa, 0x4f, 0xfa, 0x73, 0xc3, 0xf0, 0x43, 0xf1, 0xb1, 0x17, 0xaa, 0x4f, 0xef, 0xf5, 0x7c, 0x38, 0xba, 0x90, 0xfa, 0x5a, 0x36, 0x82, 0xb5, 0x37, 0xaf, 0xbd, 0x5d, 0x2d, 0x7b, 0x53, 0xae, 0xc8, + 0x1d, 0x11, 0x8c, 0xb3, 0x60, 0xbb, 0xf5, 0xe2, 0x69, 0xb9, 0x95, 0x20, 0x8d, 0xc7, 0x7b, 0xa7, 0xe6, 0x5d, 0xbe, 0x04, 0xe9, 0xca, 0x85, 0xb2, 0x25, 0x18, 0x74, 0x6c, 0xbe, 0x54, 0x62, 0xb2, + 0x64, 0xe8, 0x56, 0xb0, 0x74, 0xd6, 0xa1, 0x34, 0xad, 0xa9, 0x90, 0x92, 0xd5, 0x97, 0xe3, 0x78, 0x9d, 0x1f, 0xcc, 0x9d, 0x11, 0xc5, 0xab, 0xef, 0x64, 0xf6, 0x0d, 0xea, 0x61, 0x52, 0xa5, 0xcf, + 0xe5, 0xbf, 0x85, 0x91, 0x78, 0xf7, 0x96, 0x90, 0xf1, 0x63, 0xcc, 0xbb, 0x22, 0xfd, 0xc4, 0xc2, 0xab, 0x0b, 0xe7, 0xae, 0x24, 0x03, 0xf8, 0x88, 0x8f, 0x25, 0x22, 0x38, 0xe1, 0xfa, 0xb8, 0x9f, + 0x15, 0xb0, 0xd5, 0x5a, 0x5e, 0x23, 0x77, 0xa6, 0xb9, 0x6c, 0x09, 0xf5, 0x88, 0x7a, 0x62, 0x3f, 0xb6, 0x97, 0x76, 0x75, 0xc0, 0x0a, 0xa6, 0x71, 0xf8, 0xdc, 0x2f, 0xec, 0x95, 0x04, 0xf0, 0x01, + 0xb8, 0xe8, 0xf0, 0xaa, 0xe7, 0xa0, 0xf5, 0xcc, 0x04, 0x10, 0x96, 0xee, 0x13, 0x87, 0x16, 0x56, 0x01, 0x9b, 0x17, 0x13, 0x86, 0xde, 0xac, 0x8f, 0x64, 0xf9, 0xb8, 0x0d, 0x11, 0x94, 0xa3, 0xa4, + 0x8e, 0x4d, 0xe7, 0x8f, 0x0c, 0xff, 0x61, 0xf3, 0x34, 0x0d, 0x6c, 0x27, 0xf9, 0xb4, 0x82, 0xf2, 0x41, 0xa9, 0x7e, 0x43, 0xf8, 0x3c, 0x2c, 0xbf, 0x4f, 0x47, 0x03, 0x85, 0x3b, 0x1d, 0x97, 0x1b, + 0x89, 0x9b, 0x1d, 0x3d, 0x90, 0x59, 0xca, 0xeb, 0x78, 0x81, 0xa1, 0x3b, 0x08, 0xac, 0x9d, 0x82, 0x2f, 0xb2, 0xd3, 0xce, 0xb1, 0x8f, 0xaa, 0x4f, 0x56, 0xec, 0xba, 0x31, 0x1c, 0x3d, 0x73, 0xb3, + 0xba, 0x0d, 0x39, 0x27, 0x89, 0x36, 0x69, 0x07, 0x22, 0x22, 0x38, 0xdd, 0x46, 0x07, 0xb5, 0x9a, 0x39, 0xc0, 0x8a, 0x25, 0xca, 0xf1, 0xde, 0x9f, 0x9d, 0x70, 0x88, 0x94, 0xa2, 0xc9, 0x42, 0xf9, + 0x4e, 0x83, 0x9e, 0xb7, 0x68, 0xb4, 0x9f, 0xb1, 0xb0, 0xb6, 0xee, 0xd7, 0x37, 0x3e, 0x02, 0x6a, 0x7d, 0xa6, 0x78, 0x66, 0x5a, 0x6d, 0xf9, 0x43, 0x01, 0xad, 0xb5, 0x69, 0x47, 0xaa, 0xfd, 0x78, + 0xcb, 0x57, 0xe2, 0x46, 0xa9, 0x96, 0x39, 0x20, 0x40, 0x28, 0x58, 0x72, 0x4c, 0xa1, 0xd3, 0xfc, 0xa2, 0x6b, 0x19, 0x2b, 0xaf, 0x37, 0x12, 0x62, 0x61, 0x28, 0xef, 0x40, 0x28, 0x48, 0x95, 0x4e, + 0x11, 0xca, 0xd3, 0xe5, 0xa9, 0x0a, 0x95, 0x13, 0x3e, 0x3f, 0xae, 0x9c, 0x13, 0xc5, 0x80, 0x7e, 0xe4, 0xf4, 0x13, 0x7d, 0x3b, 0x65, 0xf9, 0xb6, 0x3d, 0xa8, 0x2d, 0x15, 0x3d, 0xee, 0xde, 0x4a, + 0xd2, 0xec, 0x45, 0xad, 0x84, 0x7e, 0xdd, 0xaa, 0x84, 0xfb, 0xa0, 0xd4, 0x3d, 0x31, 0xf5, 0x85, 0x97, 0x67, 0xcd, 0xee, 0xf5, 0xc2, 0x5b, 0x64, 0x93, 0x4f, 0xc6, 0xa1, 0x08, 0xe2, 0x51, 0xe2, + 0xb4, 0xd1, 0xbb, 0x21, 0xfd, 0xf3, 0xca, 0x80, 0x2b, 0xca, 0x4f, 0xe3, 0xf2, 0xf6, 0x7c, 0x70, 0x25, 0x00, 0x2c, 0x6d, 0xcb, 0x09, 0x5a, 0xed, 0x8b, 0x65, 0xc9, 0xb3, 0xc7, 0xd5, 0xf1, 0xb4, + 0x98, 0x03, 0x2d, 0x35, 0x47, 0x66, 0x7d, 0xe7, 0xea, 0x6c, 0x8a, 0xa9, 0xfd, 0xca, 0xc2, 0xb2, 0x39, 0x0f, 0x00, 0x73, 0x21, 0x4c, 0x72, 0x68, 0xb1, 0xda, 0xe0, 0xd4, 0x16, 0x15, 0x08, 0x1b, + 0x04, 0x3d, 0xae, 0x98, 0x73, 0x6d, 0x8f, 0x21, 0x94, 0x99, 0xd6, 0x92, 0x53, 0x5a, 0x4f, 0xea, 0xbb, 0x0a, 0x7c, 0x99, 0x99, 0xf2, 0xd5, 0x1a, 0x31, 0x84, 0xad, 0xe5, 0xe8, 0xf9, 0x0b, 0xb7, + 0x18, 0x4a, 0x3d, 0x54, 0x0b, 0xf4, 0x4c, 0xf3, 0x89, 0x95, 0x97, 0xa3, 0x11, 0x35, 0xac, 0x02, 0xc8, 0x97, 0xa2, 0x8a, 0x38, 0x4c, 0xe8, 0x99, 0x22, 0xb3, 0x2e, 0x84, 0x0a, 0xc8, 0x18, 0xed, + 0x2b, 0x7e, 0x8f, 0xda, 0x0b, 0x93, 0x5d, 0xb3, 0xc5, 0x24, 0xa7, 0xf2, 0xe5, 0x42, 0x53, 0xf7, 0x94, 0xbe, 0xd8, 0x47, 0xf0, 0x89, 0x68, 0xf7, 0x89, 0xb7, 0x29, 0x50, 0x51, 0x1e, 0x77, 0x71, + 0x1d, 0x90, 0x29, 0x32, 0x31, 0xba, 0x52, 0x5c, 0x77, 0xcb, 0x53, 0x68, 0xb8, 0xbc, 0x1a, 0x68, 0xd3, 0x14, 0x9e, 0xff, 0x81, 0x8b, 0xb0, 0x78, 0x71, 0xdf, 0xbe, 0x8b, 0xf5, 0x5a, 0x85, 0x63, + 0x54, 0xce, 0x95, 0xe6, 0x04, 0xbf, 0xbf, 0xc7, 0x0e, 0x5c, 0xf7, 0xe7, 0x8b, 0xd7, 0xef, 0x3a, 0xf0, 0x6c, 0x1c, 0x9d, 0x4b, 0x83, 0xd3, 0xd7, 0x6f, 0x5e, 0xb7, 0x9f, 0xba, 0x55, 0x3a, 0xf7, + 0xa4, 0x9b, 0x8d, 0x7f, 0xc1, 0xc4, 0xdb, 0x1b, 0xfb, 0xd7, 0x45, 0xe8, 0x46, 0x8e, 0xca, 0x47, 0xab, 0xea, 0x75, 0xa4, 0x7f, 0xda, 0x41, 0x59, 0x81, 0xcf, 0x68, 0x9f, 0xff, 0xfb, 0xc3, 0x1d, + 0xa3, 0xd2, 0x2a, 0x82, 0xcb, 0xf4, 0x7e, 0xb9, 0xf1, 0xf9, 0xd2, 0x9d, 0xfb, 0xab, 0xc2, 0x48, 0xca, 0x2c, 0x88, 0x9c, 0x51, 0x9a, 0x44, 0xfd, 0xd5, 0xf7, 0x5e, 0x3f, 0xfa, 0xf8, 0xd5, 0xbb, + 0x4f, 0x19, 0xd9, 0x4e, 0x56, 0x38, 0x96, 0x51, 0x39, 0xf6, 0x63, 0xa0, 0x47, 0xb7, 0x37, 0xd4, 0xf7, 0xc1, 0xda, 0x8f, 0x8e, 0xb2, 0xdf, 0xbf, 0xe8, 0x3f, 0xfe, 0x1d, 0xf9, 0x45, 0x0c, 0x9a, + 0x3d, 0xf7, 0x92, 0x27, 0xa1, 0x5f, 0x08, 0xf6, 0xd0, 0xd4, 0xb1, 0xcf, 0xd3, 0xc6, 0x1e, 0x5d, 0x08, 0x7c, 0x3d, 0x67, 0x4a, 0x06, 0x28, 0x49, 0x18, 0x44, 0x0c, 0x01, 0x53, 0x14, 0x3f, 0x88, + 0x69, 0xa6, 0xaa, 0x6c, 0xac, 0xcb, 0xa6, 0x6b, 0x53, 0x9d, 0x6b, 0x49, 0x2a, 0x6c, 0x16, 0x47, 0x30, 0x25, 0x8f, 0x34, 0x39, 0x3b, 0x22, 0x68, 0x18, 0x85, 0x8e, 0xb2, 0xd6, 0xc2, 0xb2, 0x9b, + 0xaf, 0x62, 0x31, 0xde, 0xf3, 0x35, 0xbf, 0x5d, 0x53, 0x65, 0xab, 0x54, 0xb0, 0x89, 0x07, 0xba, 0xab, 0xea, 0x5b, 0x6b, 0x1b, 0xfc, 0x01, 0xfc, 0xec, 0x7f, 0x3e, 0xbd, 0xc1, 0x35, 0x33, 0xff, + 0x89, 0xfd, 0x22, 0xdf, 0x67, 0xd3, 0x46, 0x41, 0x52, 0x8d, 0xdc, 0xb4, 0x88, 0x8d, 0x73, 0xbb, 0xdf, 0xac, 0x70, 0xaa, 0xcb, 0x5b, 0x7d, 0x9c, 0x6c, 0x5e, 0x94, 0x9a, 0xe6, 0xe5, 0xb3, 0x77, + 0x2a, 0xf8, 0x39, 0x90, 0x99, 0xb6, 0xe7, 0x8f, 0xa8, 0xf7, 0x3e, 0x8a, 0x33, 0xf8, 0xbc, 0xd3, 0x05, 0x65, 0x55, 0xfe, 0xbc, 0xe9, 0x7c, 0x7f, 0xd3, 0xe7, 0xf3, 0xe7, 0x27, 0x7a, 0xd8, 0x8d, + 0x79, 0x64, 0xbf, 0x0a, 0xad, 0x15, 0x05, 0x0f, 0x89, 0xe8, 0x55, 0x03, 0xb2, 0xcf, 0xc4, 0x2b, 0x0a, 0xcc, 0xbb, 0x7a, 0x1b, 0xfc, 0x98, 0x80, 0x45, 0x81, 0x79, 0x16, 0xb1, 0x28, 0x30, 0x47, + 0x17, 0x22, 0x5f, 0x0b, 0x99, 0x9e, 0x04, 0xe8, 0x78, 0xcd, 0x9d, 0x42, 0x4f, 0x28, 0x5a, 0xa7, 0xe9, 0xcb, 0xc5, 0x96, 0x9e, 0x14, 0x15, 0xcf, 0x64, 0x52, 0xd3, 0x3b, 0xe4, 0x69, 0x07, 0x42, + 0x33, 0x6c, 0xd6, 0xef, 0x13, 0x0c, 0x95, 0x08, 0x90, 0xc8, 0x1b, 0xb9, 0x95, 0x7c, 0x6a, 0xca, 0x1e, 0x17, 0x4e, 0x6b, 0x0a, 0x75, 0xb4, 0x4b, 0x2a, 0x33, 0xf0, 0x62, 0x6b, 0x4b, 0x14, 0xb6, + 0x8e, 0x4e, 0xd7, 0x29, 0xd5, 0x2a, 0xab, 0xef, 0x3b, 0x45, 0x2f, 0x62, 0x63, 0xa5, 0x89, 0x1b, 0x78, 0x17, 0x99, 0xf9, 0x4c, 0xaf, 0x85, 0xc9, 0x47, 0x94, 0xb3, 0x9b, 0xcf, 0x78, 0x66, 0xd8, + 0xc7, 0x0f, 0x46, 0x97, 0xc7, 0x7c, 0xcd, 0xc1, 0x4e, 0x6a, 0x29, 0xc9, 0x5b, 0x4b, 0x3c, 0x8b, 0x06, 0x9c, 0xd2, 0xc5, 0x1c, 0xc1, 0x68, 0x05, 0x30, 0x33, 0xc0, 0xcd, 0xa9, 0x68, 0xdc, 0x45, + 0x15, 0xce, 0xab, 0x31, 0x3f, 0x8d, 0x70, 0xd8, 0x3b, 0x22, 0xea, 0x94, 0x05, 0x99, 0x29, 0x75, 0xa4, 0x75, 0x25, 0x6c, 0x80, 0xae, 0x5f, 0xaa, 0x70, 0xa1, 0x56, 0x89, 0xd1, 0xf3, 0x8e, 0xa0, + 0xee, 0x56, 0x53, 0x4b, 0xd0, 0xc9, 0x03, 0x4c, 0x24, 0xcc, 0x57, 0x5b, 0xdb, 0x0d, 0xd9, 0xbd, 0xf9, 0x12, 0x96, 0xef, 0x58, 0x67, 0x04, 0xdc, 0x27, 0xbd, 0xec, 0x7c, 0xf2, 0x88, 0x54, 0x63, + 0x43, 0xa3, 0x4c, 0x65, 0x5d, 0x05, 0xd1, 0x7d, 0x1d, 0x0e, 0x79, 0x48, 0xa9, 0xbe, 0x10, 0x3d, 0x0f, 0xd4, 0xf9, 0x68, 0x74, 0x21, 0xf4, 0xf5, 0xc8, 0xc4, 0x0b, 0x8e, 0x43, 0x03, 0x55, 0xe7, + 0x01, 0x54, 0x9d, 0xe3, 0x1d, 0x3f, 0x3e, 0x42, 0xd2, 0xcc, 0xe7, 0x14, 0x75, 0xca, 0x49, 0x53, 0xba, 0x01, 0x01, 0xe5, 0x38, 0x13, 0xb3, 0x50, 0xd1, 0xba, 0xae, 0x43, 0x08, 0x8e, 0x53, 0xa6, + 0x71, 0x3c, 0xc1, 0xa1, 0x09, 0x95, 0x79, 0xa2, 0xda, 0x08, 0x01, 0xc9, 0x72, 0xbe, 0x22, 0x48, 0xb3, 0x38, 0x9c, 0x2a, 0xd2, 0xa9, 0x44, 0x34, 0x42, 0x84, 0xc5, 0xc7, 0x17, 0xd0, 0x97, 0x39, + 0xff, 0xa4, 0x18, 0x90, 0x0f, 0x24, 0x9f, 0xfe, 0xb8, 0xd1, 0x62, 0xe3, 0xbb, 0x5b, 0x1f, 0xf9, 0xd2, 0xac, 0xee, 0x07, 0xfa, 0x0b, 0xf9, 0x05, 0x8d, 0x6c, 0xa7, 0x79, 0x3d, 0x47, 0xdf, 0x9d, + 0x63, 0xef, 0xce, 0xc7, 0xef, 0xce, 0xf1, 0x1b, 0xe7, 0xa6, 0x53, 0x19, 0xaf, 0x17, 0x88, 0x77, 0x37, 0x10, 0xcf, 0x37, 0x0c, 0x91, 0xa4, 0x3e, 0x73, 0x5e, 0x85, 0xf7, 0xf6, 0x2e, 0xfc, 0x48, + 0x8c, 0xf2, 0x37, 0xd9, 0x97, 0xfe, 0x96, 0xe7, 0x93, 0x11, 0x34, 0x2c, 0x62, 0xa9, 0x47, 0x8e, 0x9a, 0x5a, 0x54, 0xdd, 0xb2, 0x7a, 0x1e, 0x6a, 0xad, 0x6e, 0xa8, 0xdb, 0xc3, 0x24, 0x3e, 0x09, + 0xd6, 0xfc, 0x30, 0x26, 0xc7, 0xa4, 0x3c, 0x41, 0x9a, 0xa6, 0x83, 0xd5, 0x62, 0xdc, 0x2d, 0xad, 0xa0, 0xd3, 0x97, 0x12, 0x40, 0xf2, 0xc9, 0x9c, 0xf1, 0x94, 0x2c, 0x52, 0x51, 0xa8, 0x2e, 0xf1, + 0xca, 0xc9, 0xed, 0xa8, 0x3c, 0xce, 0xdd, 0x1a, 0x30, 0x1c, 0x8c, 0x23, 0x28, 0x31, 0x75, 0x06, 0xd6, 0xb1, 0x67, 0x85, 0x13, 0xd5, 0xb6, 0x33, 0x8a, 0xca, 0x67, 0x11, 0x7a, 0xa4, 0x2d, 0xde, + 0x0f, 0xe8, 0xd7, 0x40, 0xf7, 0xc2, 0x97, 0x5d, 0xc7, 0xc9, 0x47, 0xb6, 0xa8, 0x3b, 0x5d, 0xc7, 0xc9, 0x21, 0x3b, 0x15, 0x66, 0x9b, 0xa7, 0xe5, 0x29, 0x6f, 0xc2, 0xca, 0x0b, 0x84, 0x71, 0xd1, + 0xc2, 0xc7, 0x71, 0x31, 0x5b, 0x54, 0xd3, 0xc9, 0x9a, 0x8b, 0xed, 0xda, 0xf6, 0xd9, 0x7e, 0x3a, 0x33, 0xc2, 0x35, 0x04, 0xbb, 0xb3, 0xde, 0x37, 0x26, 0x4b, 0xbf, 0x4c, 0xb9, 0x75, 0x8f, 0xf7, + 0x04, 0xb0, 0x5c, 0x53, 0xe8, 0xd2, 0xcd, 0xe6, 0x55, 0xbb, 0xa7, 0x82, 0x3c, 0x20, 0x8e, 0x0c, 0xd0, 0xb5, 0x9c, 0x2f, 0x97, 0xeb, 0xd5, 0x57, 0xb3, 0xf9, 0xaf, 0xb0, 0xc3, 0xde, 0x4e, 0xc2, + 0xdb, 0x0e, 0xb4, 0xb7, 0x61, 0xa5, 0xef, 0xf0, 0xf2, 0x42, 0xf6, 0x99, 0x99, 0xcf, 0x2a, 0xf6, 0x99, 0xda, 0xd7, 0xdc, 0x3c, 0x19, 0x1a, 0x9d, 0x9e, 0x94, 0x03, 0xce, 0xf0, 0x33, 0x6d, 0xa2, + 0xcd, 0x8b, 0x1d, 0x73, 0x82, 0x17, 0xf8, 0x7c, 0xa7, 0x9f, 0xd4, 0x8d, 0xbb, 0xed, 0xc7, 0x73, 0x55, 0xd0, 0x4a, 0x39, 0x52, 0xc9, 0x7d, 0x3c, 0x5e, 0x49, 0x94, 0x23, 0x62, 0xdd, 0x71, 0xbb, + 0x54, 0xc4, 0x39, 0x2d, 0x37, 0xbe, 0xec, 0xe2, 0xf0, 0x09, 0x17, 0x41, 0x16, 0xaf, 0xbd, 0x16, 0xdd, 0x78, 0x93, 0xa4, 0x69, 0x62, 0xe0, 0xcb, 0xdc, 0xe3, 0x1b, 0xbb, 0x96, 0xf5, 0xb2, 0x39, + 0x3d, 0x1d, 0xfe, 0xef, 0xb7, 0x9f, 0x94, 0x4e, 0xf1, 0x06, 0x2a, 0xf5, 0xf5, 0xfc, 0xbb, 0x22, 0x7f, 0x6e, 0xd1, 0x39, 0x60, 0x98, 0xea, 0xc4, 0x4c, 0xbb, 0x51, 0x56, 0x04, 0x71, 0x50, 0x05, + 0x9f, 0x34, 0x7e, 0x7a, 0xa4, 0xff, 0xc4, 0x3b, 0xda, 0xe0, 0xe8, 0xfd, 0x95, 0xb3, 0x67, 0x6d, 0x40, 0xfc, 0x09, 0x87, 0x33, 0x29, 0xa2, 0x19, 0xca, 0x1f, 0xc3, 0xbb, 0xb4, 0x70, 0xfa, 0x15, + 0x34, 0x55, 0x9c, 0xc0, 0x76, 0x04, 0x54, 0x60, 0x38, 0x81, 0x4b, 0x7c, 0x1c, 0xd8, 0x51, 0x3c, 0x44, 0xa2, 0x28, 0x1c, 0x64, 0x39, 0x2e, 0x93, 0xe2, 0x5c, 0x3f, 0xec, 0x83, 0x5c, 0xc2, 0x13, + 0xb0, 0x32, 0x17, 0x1d, 0x56, 0x8e, 0x97, 0x54, 0xad, 0xf8, 0x56, 0xef, 0xe0, 0xd3, 0xc2, 0x3c, 0x06, 0xa7, 0xe3, 0x94, 0xf9, 0xca, 0x17, 0xf1, 0x70, 0x95, 0x8c, 0x6f, 0x94, 0x23, 0x33, 0xf0, + 0x82, 0x97, 0x8e, 0xad, 0x37, 0x6f, 0x28, 0xfb, 0xd8, 0x4c, 0xa3, 0xdf, 0x37, 0x5c, 0x99, 0x13, 0xad, 0x1f, 0x58, 0xfe, 0xc8, 0x4c, 0x3b, 0xc7, 0xbe, 0x1a, 0x9a, 0x17, 0x5a, 0x1f, 0x84, 0xe1, + 0x6f, 0xaf, 0xb5, 0xa9, 0x13, 0xdb, 0x71, 0x4b, 0xc3, 0xbd, 0x27, 0x20, 0xc8, 0x55, 0x38, 0x77, 0xb8, 0x80, 0x3c, 0x53, 0x3d, 0x8b, 0xc6, 0xf3, 0xf1, 0xb9, 0x1c, 0x7c, 0xfc, 0xb5, 0x50, 0x68, + 0x9d, 0xb8, 0xa6, 0x8b, 0xb2, 0x9c, 0x0a, 0xe4, 0x76, 0x23, 0x29, 0xf9, 0x7a, 0x3c, 0x8b, 0xcb, 0x70, 0x57, 0x94, 0x0d, 0x36, 0x21, 0x75, 0x18, 0x59, 0x61, 0x93, 0x62, 0x1a, 0x04, 0x46, 0xdf, + 0xa0, 0x4c, 0xdf, 0xb3, 0xe8, 0x21, 0x5a, 0x7a, 0x78, 0xdf, 0x97, 0x75, 0xbd, 0xd9, 0xdb, 0x87, 0x72, 0x77, 0x42, 0xb7, 0x9c, 0xb5, 0xf5, 0x10, 0xd7, 0x06, 0x41, 0x35, 0xb4, 0x31, 0x7a, 0xb1, + 0x83, 0x83, 0x3b, 0x53, 0xf9, 0x33, 0xc6, 0x64, 0xc1, 0xdd, 0xcc, 0x86, 0xc7, 0x72, 0x40, 0x2e, 0x24, 0xcf, 0x2c, 0x79, 0x3a, 0x18, 0x9a, 0xe7, 0x91, 0x85, 0x3d, 0x62, 0xee, 0xfd, 0x4d, 0x59, + 0xbb, 0xad, 0x16, 0x71, 0xad, 0x64, 0x01, 0x11, 0x6a, 0xad, 0x09, 0xa0, 0xad, 0x57, 0x11, 0x87, 0xd7, 0x27, 0x68, 0x6f, 0xaf, 0x66, 0x62, 0x24, 0x33, 0x66, 0x84, 0x87, 0x29, 0xb8, 0x8f, 0xa4, + 0x00, 0x8b, 0x4d, 0xd2, 0xf0, 0xd4, 0xe3, 0x8e, 0x26, 0xa7, 0x73, 0x62, 0x47, 0xae, 0xeb, 0x93, 0xd3, 0x4b, 0xeb, 0x5c, 0x39, 0x96, 0x13, 0xd4, 0x3f, 0x55, 0xdc, 0xdf, 0x50, 0x1e, 0xff, 0x9a, + 0xf8, 0x73, 0x8b, 0x63, 0xd8, 0x43, 0xfa, 0xcd, 0x85, 0xe4, 0x13, 0xc7, 0xce, 0x07, 0xe7, 0x9e, 0xd0, 0x03, 0x38, 0x36, 0x85, 0x7a, 0x65, 0x7b, 0xda, 0xdb, 0x2a, 0x4d, 0x27, 0x54, 0x02, 0xcc, + 0x31, 0x80, 0xf5, 0xb1, 0x7e, 0xc9, 0x54, 0x82, 0x6c, 0x19, 0xab, 0x32, 0xde, 0x4f, 0x99, 0x72, 0xbb, 0x61, 0x49, 0x0f, 0x14, 0x9d, 0x90, 0x9b, 0xa6, 0x36, 0x2f, 0x23, 0xcb, 0x85, 0xbb, 0x46, + 0x4d, 0x81, 0x08, 0xd5, 0x52, 0xd1, 0x13, 0x3b, 0xcd, 0xb6, 0x84, 0xb8, 0xd4, 0x35, 0x7b, 0x9f, 0x5b, 0xb0, 0x1b, 0xc6, 0x3b, 0x7c, 0x20, 0xb4, 0x57, 0x56, 0x27, 0xbd, 0xf5, 0xcc, 0xba, 0x67, + 0x94, 0x93, 0x01, 0xac, 0xab, 0x82, 0x7b, 0x38, 0xad, 0x67, 0x58, 0x91, 0x07, 0x66, 0x60, 0x15, 0x44, 0x4f, 0x7c, 0xab, 0x82, 0x68, 0x74, 0x21, 0xf1, 0x35, 0xdb, 0x8e, 0x07, 0x17, 0xe4, 0x70, + 0x7f, 0xb6, 0x2c, 0xb4, 0xc5, 0x12, 0xd7, 0x73, 0x71, 0xae, 0x06, 0x81, 0x60, 0x00, 0x04, 0xd5, 0xce, 0x40, 0x86, 0x94, 0x81, 0x35, 0xbd, 0x9e, 0x68, 0x56, 0x74, 0xec, 0x3d, 0xd4, 0xc4, 0x6c, + 0xe4, 0x48, 0x94, 0x90, 0xcc, 0x3a, 0xd9, 0x3a, 0x0c, 0x26, 0x53, 0x0b, 0x30, 0x14, 0x74, 0x0d, 0x4b, 0x93, 0x7e, 0xc1, 0x13, 0x19, 0xae, 0x5a, 0xfc, 0x1e, 0xe7, 0xe3, 0xe2, 0x7d, 0x62, 0xea, + 0xdd, 0x48, 0xd3, 0x9b, 0x0c, 0x93, 0x73, 0x4e, 0xd9, 0x75, 0xfe, 0x49, 0x39, 0x32, 0x0a, 0xaf, 0x8e, 0x9d, 0xb7, 0x4b, 0xef, 0xfb, 0x1c, 0x14, 0xcf, 0x49, 0x9c, 0xc2, 0xa8, 0xd2, 0x62, 0xf4, + 0x92, 0x04, 0xf3, 0x7a, 0x2b, 0xf1, 0xee, 0xd6, 0x27, 0xfd, 0xc2, 0x1e, 0x19, 0x45, 0x61, 0x3c, 0xbb, 0x6b, 0xde, 0x57, 0xfd, 0x5c, 0x16, 0xea, 0x5b, 0xb7, 0x0d, 0x89, 0x33, 0xd6, 0x75, 0x70, + 0xcf, 0xdb, 0x46, 0xfe, 0x42, 0x1f, 0xd9, 0x70, 0xeb, 0xc0, 0x7e, 0x1a, 0xcd, 0x3a, 0xb0, 0x47, 0x67, 0x0a, 0x5f, 0x0f, 0x26, 0xb0, 0xde, 0x97, 0x88, 0xec, 0x08, 0x5a, 0x0f, 0xb0, 0xda, 0x5c, + 0x9c, 0xc5, 0x54, 0x97, 0x24, 0xf8, 0x82, 0x66, 0x32, 0x28, 0x22, 0xe4, 0x29, 0x43, 0xc4, 0x11, 0x79, 0xe2, 0xd5, 0x78, 0x05, 0x50, 0xa8, 0x3c, 0x5e, 0xcf, 0xa1, 0x75, 0x6a, 0xcd, 0x8a, 0xa4, + 0x3d, 0x6e, 0x8f, 0xfa, 0x6e, 0xbe, 0x0e, 0x74, 0x14, 0x74, 0x33, 0x1a, 0x37, 0xdc, 0x0d, 0xc9, 0xf8, 0x26, 0xe8, 0x9d, 0x08, 0x85, 0x70, 0xae, 0xe6, 0xc0, 0x07, 0xed, 0xe7, 0xf9, 0xb5, 0x5f, + 0xbd, 0xa4, 0x17, 0x3e, 0x7c, 0xcd, 0xae, 0x86, 0x1c, 0x59, 0x69, 0x7c, 0x76, 0xcb, 0xbe, 0x20, 0xd0, 0xdf, 0xde, 0x8a, 0x1e, 0x49, 0x7d, 0x78, 0x4f, 0x1c, 0x1c, 0x7d, 0xb8, 0x34, 0x34, 0x01, + 0x22, 0x22, 0x23, 0x7a, 0x16, 0xf3, 0x16, 0xbf, 0x3f, 0xf8, 0x58, 0x62, 0xd6, 0xc9, 0xfa, 0xd0, 0xc8, 0xf4, 0xca, 0x1a, 0x67, 0x0d, 0x01, 0x28, 0x74, 0x6b, 0x90, 0x39, 0xc8, 0xdb, 0x6a, 0x47, + 0xd6, 0x44, 0x54, 0x6a, 0x8d, 0xc4, 0x70, 0x71, 0x96, 0xda, 0xab, 0xc9, 0x6a, 0xdd, 0x1e, 0x27, 0xfe, 0x8a, 0x06, 0x41, 0x7b, 0xbe, 0xc7, 0x48, 0xae, 0x5e, 0xce, 0xe2, 0xb0, 0xb2, 0x31, 0x65, + 0x17, 0x30, 0xc5, 0xb7, 0x37, 0xa6, 0xc6, 0x88, 0x82, 0x0b, 0xe8, 0x6b, 0x16, 0x8f, 0x32, 0xc3, 0x3a, 0x1a, 0x9e, 0xf3, 0x02, 0x45, 0x74, 0xd7, 0x53, 0xf1, 0x48, 0x85, 0xf4, 0x67, 0x0f, 0x7a, + 0xe2, 0xe2, 0x27, 0x1f, 0x9f, 0x63, 0x51, 0x03, 0xca, 0xae, 0x98, 0x8c, 0x8b, 0x11, 0x35, 0x00, 0xbb, 0x35, 0x01, 0x2e, 0x64, 0x8e, 0xae, 0xb2, 0x43, 0x97, 0x2a, 0xda, 0xd4, 0x3f, 0x50, 0x07, + 0xe8, 0x98, 0x57, 0xbd, 0xc7, 0x92, 0x3a, 0xed, 0xad, 0x65, 0xf2, 0x10, 0x31, 0x49, 0x57, 0xcb, 0xb1, 0xe6, 0x87, 0x63, 0x1c, 0x0f, 0x49, 0x77, 0x8d, 0xd1, 0x35, 0x0a, 0xae, 0x62, 0xd3, 0x2f, + 0x99, 0x94, 0x70, 0xad, 0xc9, 0x2a, 0xc7, 0x4a, 0xca, 0x47, 0x88, 0xd9, 0x40, 0x03, 0xf4, 0x1d, 0xc0, 0xdc, 0x3d, 0xfc, 0xb4, 0x4f, 0xa0, 0xd6, 0xbe, 0x96, 0xec, 0xf3, 0x32, 0xf2, 0x89, 0x66, + 0xf5, 0xfd, 0x95, 0xe0, 0x4c, 0x11, 0x1c, 0x5d, 0xfe, 0x0f, 0x6d, 0x53, 0x3b, 0xe5, 0x97, 0xe8, 0x36, 0x82, 0xb7, 0x1a, 0x2a, 0x35, 0x11, 0x01, 0x45, 0x68, 0x9f, 0xa3, 0x7b, 0x1c, 0x0b, 0x00, + 0xa3, 0xcd, 0x5a, 0x3d, 0x2f, 0xd9, 0xe9, 0x5e, 0x3b, 0x1e, 0x73, 0xa1, 0x4a, 0x4c, 0xdd, 0x2b, 0x04, 0x06, 0xe8, 0x43, 0xa2, 0xf0, 0x35, 0xe8, 0x58, 0xcf, 0x98, 0xee, 0xb4, 0x32, 0xf6, 0x3a, + 0x1b, 0xce, 0xb4, 0x71, 0xea, 0x19, 0x19, 0xb7, 0x16, 0x66, 0xdc, 0x5a, 0x08, 0x03, 0xf3, 0x2b, 0xe3, 0xe8, 0xb3, 0xac, 0x02, 0xa7, 0x73, 0x5e, 0x17, 0xfa, 0x21, 0x9e, 0xec, 0x73, 0xf0, 0xe6, + 0x85, 0x99, 0xaf, 0x31, 0xd9, 0xe7, 0x2b, 0x1f, 0xbe, 0xfe, 0x95, 0x3a, 0x33, 0x44, 0x99, 0xb9, 0xa7, 0xa9, 0xff, 0x75, 0x46, 0xd4, 0xcd, 0x27, 0xbc, 0x8e, 0xec, 0xbb, 0xeb, 0x43, 0x0d, 0x2a, + 0xb3, 0x3d, 0xd8, 0x0d, 0x34, 0xe1, 0xf8, 0x2c, 0x8b, 0xe6, 0x7b, 0x84, 0x3b, 0x28, 0x3a, 0xbe, 0x6d, 0xfa, 0x7a, 0x4d, 0xa4, 0x61, 0x58, 0x10, 0x51, 0x7b, 0xf4, 0xf0, 0x38, 0x82, 0x8a, 0x74, + 0xd9, 0x53, 0x7b, 0xa7, 0xde, 0x14, 0xc4, 0x6a, 0x83, 0x12, 0x48, 0x1e, 0xad, 0x35, 0x98, 0x54, 0xe5, 0xfd, 0xc9, 0xdb, 0x73, 0xd4, 0x29, 0x60, 0x2d, 0xa7, 0xd0, 0xf2, 0x83, 0x18, 0xcf, 0x12, + 0x6a, 0xb7, 0xfe, 0xca, 0x79, 0xfb, 0x69, 0xfe, 0xc8, 0xc5, 0x60, 0x7a, 0xdd, 0x89, 0xe1, 0x77, 0x3b, 0xb1, 0x99, 0xa6, 0x91, 0x63, 0x24, 0xa3, 0x4b, 0x1e, 0xe8, 0xcf, 0x9b, 0x01, 0xca, 0xd7, + 0x2c, 0x94, 0xeb, 0xbb, 0x3e, 0x6a, 0x00, 0x6f, 0xd2, 0xd2, 0x3f, 0xa4, 0xa1, 0x06, 0x2f, 0xa6, 0xd9, 0xcf, 0xdf, 0x96, 0xd9, 0x07, 0xc9, 0xf9, 0xdb, 0xcd, 0xad, 0x5b, 0x7a, 0xc5, 0x6d, 0x91, + 0x82, 0x7f, 0x7d, 0x1f, 0x6a, 0xf4, 0x03, 0xf5, 0x57, 0x71, 0x7a, 0x73, 0x6d, 0x74, 0xa6, 0xfd, 0xb5, 0x28, 0xb5, 0x94, 0x85, 0x75, 0xc7, 0x0e, 0x8f, 0xa5, 0xc0, 0x6e, 0x33, 0x02, 0x26, 0x21, + 0xeb, 0xb8, 0xd7, 0x5c, 0x21, 0x6e, 0xba, 0x2c, 0x8c, 0x0e, 0xf5, 0xb2, 0xb6, 0xd7, 0x15, 0xe3, 0x62, 0x6b, 0xb0, 0xda, 0x4e, 0xd4, 0x29, 0xb9, 0x5b, 0x99, 0x3a, 0x32, 0xce, 0x0f, 0xe9, 0xa4, + 0x2c, 0x2a, 0xb6, 0xde, 0xaf, 0x13, 0xb6, 0x45, 0x33, 0x03, 0x9a, 0xe8, 0x9e, 0xc9, 0x72, 0xca, 0x94, 0x04, 0x67, 0xd6, 0x50, 0x2c, 0x29, 0xa3, 0x31, 0x82, 0xe8, 0x9c, 0x82, 0xf9, 0xe6, 0x87, + 0x97, 0xb7, 0x07, 0xf6, 0x0b, 0xa3, 0xfd, 0x6d, 0xba, 0xf4, 0x3f, 0x3e, 0xa4, 0x4b, 0x7b, 0x69, 0x66, 0xdf, 0x96, 0xcd, 0x27, 0x5b, 0xbe, 0x4a, 0x2f, 0x12, 0x55, 0x19, 0xbf, 0x85, 0xea, 0xbd, + 0x64, 0xde, 0xd2, 0x11, 0x6f, 0xa5, 0x99, 0x7c, 0xb5, 0x28, 0xfd, 0xd7, 0x00, 0xed, 0xb4, 0x85, 0x91, 0x65, 0xf7, 0x85, 0xf0, 0xa1, 0x75, 0xed, 0x4c, 0xf2, 0x49, 0xf2, 0xce, 0x07, 0x43, 0x56, + 0x2e, 0x78, 0x54, 0x6d, 0x64, 0x2a, 0x3c, 0x11, 0xd3, 0x3c, 0xd4, 0xbb, 0xf5, 0x71, 0x3f, 0x6f, 0x26, 0x90, 0xbc, 0xae, 0x05, 0xae, 0xca, 0xc8, 0x6f, 0xaa, 0x47, 0x5d, 0x75, 0x1f, 0x27, 0x08, + 0x7b, 0xe8, 0x85, 0xce, 0x14, 0xc1, 0xd1, 0xe5, 0xff, 0x19, 0x97, 0x7c, 0xc0, 0x42, 0xcc, 0x73, 0x7b, 0x15, 0x0e, 0x26, 0xfa, 0x4a, 0x57, 0xbd, 0x89, 0x9e, 0x50, 0xaa, 0x12, 0x06, 0x35, 0x20, + 0x68, 0x7e, 0xaf, 0xea, 0x8b, 0xb2, 0x71, 0x33, 0x22, 0xb6, 0xea, 0x7d, 0x4c, 0xd9, 0x1b, 0x95, 0xe3, 0x20, 0x90, 0x0e, 0xab, 0x42, 0x6d, 0xe7, 0x93, 0x8e, 0x21, 0x11, 0x30, 0xa6, 0x35, 0xb3, + 0xe2, 0x4b, 0x36, 0x9c, 0x2f, 0x0d, 0x1b, 0x6a, 0x97, 0x65, 0x6a, 0x63, 0xa7, 0x62, 0x3b, 0x99, 0x7d, 0xc7, 0x68, 0x87, 0x06, 0xf5, 0x82, 0xee, 0x8d, 0x28, 0x0a, 0xee, 0x7a, 0xc5, 0x1f, 0x43, + 0x74, 0x7f, 0xa6, 0x09, 0x8e, 0x5e, 0x8e, 0x86, 0x62, 0xb9, 0xa3, 0xad, 0xcd, 0x06, 0xf6, 0xa1, 0xcf, 0xc7, 0xd2, 0x14, 0x22, 0x31, 0x9d, 0x9f, 0x6d, 0xc6, 0xdb, 0x4c, 0xdc, 0x28, 0x13, 0xb4, + 0x0d, 0xf5, 0x49, 0xb4, 0xd4, 0x04, 0xbf, 0x8e, 0x91, 0xa3, 0x62, 0x35, 0x20, 0x06, 0x6f, 0x12, 0xc4, 0x89, 0x65, 0xc8, 0xee, 0x2d, 0x59, 0xc3, 0xea, 0x83, 0xce, 0x3b, 0x61, 0xcb, 0x35, 0x1e, + 0x3e, 0x2b, 0x1b, 0xd3, 0x8e, 0x76, 0x3c, 0x30, 0xdf, 0xcf, 0xac, 0x8a, 0xf8, 0x1c, 0x1b, 0xb3, 0x37, 0x0a, 0xaf, 0xfc, 0xa2, 0x9b, 0xd4, 0xd3, 0x78, 0x7f, 0x7f, 0x2d, 0x7e, 0x4b, 0xf9, 0xcc, + 0x8a, 0xdf, 0xa7, 0xa3, 0x0b, 0xc9, 0xaf, 0x19, 0xd2, 0xc3, 0x70, 0xc2, 0xce, 0xa2, 0xed, 0x72, 0x07, 0xd0, 0x5b, 0xf4, 0xd0, 0x50, 0x15, 0xb1, 0xe3, 0x22, 0x40, 0x46, 0xfd, 0xad, 0x9c, 0x6e, + 0x29, 0x03, 0x96, 0x4f, 0xce, 0xc9, 0xf7, 0x23, 0x5c, 0xc9, 0x10, 0xd8, 0x5b, 0x81, 0xcb, 0xdd, 0x56, 0x23, 0x0e, 0x68, 0x4f, 0xcd, 0x34, 0xdd, 0xaf, 0xd5, 0x29, 0x8d, 0x6c, 0xfc, 0xc4, 0x05, + 0x18, 0x1d, 0x32, 0x92, 0xca, 0xb1, 0xb2, 0x49, 0xbb, 0x91, 0xc8, 0xaf, 0xdc, 0xa3, 0x5f, 0xf9, 0x9f, 0x87, 0xe8, 0xbd, 0x7d, 0x72, 0xd7, 0x12, 0x79, 0x24, 0x4d, 0xab, 0x4f, 0x9e, 0x38, 0x98, + 0x0c, 0x85, 0x67, 0x56, 0x3b, 0xac, 0xf7, 0x58, 0xad, 0xac, 0x11, 0x8b, 0x08, 0xca, 0xb9, 0xe6, 0x90, 0xfb, 0x1a, 0xde, 0x47, 0xf5, 0x2a, 0xce, 0x77, 0x7e, 0x97, 0x73, 0x88, 0xc5, 0xeb, 0x6b, + 0x79, 0x32, 0x9e, 0x58, 0x34, 0x2a, 0xbb, 0x26, 0xbb, 0xce, 0x04, 0xc2, 0xad, 0xa1, 0x3d, 0x69, 0x82, 0x27, 0x18, 0xcf, 0x74, 0x3e, 0x99, 0x77, 0x87, 0x7d, 0xa3, 0xf9, 0x36, 0xea, 0xfa, 0xd3, + 0x3d, 0xc5, 0xf0, 0x31, 0x8d, 0x7f, 0x95, 0x44, 0xfb, 0x55, 0x95, 0xf9, 0x3b, 0xae, 0xfd, 0xaf, 0x67, 0xce, 0xdd, 0xde, 0x04, 0x7f, 0xfe, 0xa7, 0x61, 0x94, 0x7e, 0x5d, 0xa5, 0xa5, 0x5f, 0x18, + 0x95, 0x1f, 0x80, 0x6d, 0x5a, 0xd8, 0xa3, 0xa7, 0x05, 0xf5, 0xee, 0x52, 0x8d, 0x3c, 0x10, 0x73, 0xb9, 0xfb, 0x94, 0xa7, 0xd5, 0xfb, 0xe5, 0xf8, 0x0c, 0x97, 0x37, 0x20, 0x02, 0x03, 0xef, 0xc3, + 0x12, 0xd9, 0x34, 0x02, 0xb9, 0x75, 0xa3, 0x99, 0x02, 0x8a, 0x0c, 0x6a, 0x89, 0xa1, 0xaf, 0x69, 0xe2, 0xc1, 0x1c, 0x93, 0x13, 0xa4, 0x22, 0xda, 0x6c, 0x86, 0x6c, 0x28, 0xdd, 0x9d, 0xee, 0xb7, + 0xc1, 0x32, 0x02, 0xf4, 0xb9, 0x2f, 0xb3, 0x88, 0x19, 0xf6, 0x98, 0x54, 0xc3, 0x4b, 0x60, 0x36, 0x89, 0xe8, 0xb5, 0x7a, 0x52, 0x98, 0x3d, 0x63, 0xcf, 0xdb, 0xf9, 0x5e, 0xe5, 0x1a, 0xdd, 0x5a, + 0x7e, 0x98, 0xbd, 0xff, 0x69, 0x1a, 0xa6, 0x13, 0x81, 0x67, 0x6c, 0x43, 0xb7, 0x30, 0xe2, 0x7b, 0x3a, 0x39, 0xf1, 0x0b, 0x46, 0x7e, 0xc1, 0xdf, 0x17, 0xb5, 0x0f, 0xf4, 0xc1, 0xd1, 0x9b, 0x93, + 0xd1, 0x33, 0xd9, 0xaf, 0xb9, 0x71, 0xa8, 0xe0, 0x3e, 0xb5, 0xa7, 0x1d, 0xac, 0x5a, 0x7d, 0xe0, 0x48, 0xc2, 0xe6, 0xa8, 0x25, 0x2a, 0xe6, 0x4b, 0xb9, 0xdf, 0xe6, 0x84, 0xcf, 0x06, 0x48, 0x32, + 0xe7, 0x61, 0xde, 0x99, 0xa0, 0x33, 0x35, 0x02, 0x72, 0x84, 0x97, 0x3b, 0x18, 0x17, 0x96, 0x1b, 0x6f, 0x05, 0x01, 0x27, 0xc2, 0x4e, 0x62, 0xaf, 0x91, 0x28, 0xb9, 0x5a, 0x46, 0x4e, 0x3d, 0xdb, + 0xb2, 0x62, 0x20, 0x2e, 0x60, 0xc5, 0x5a, 0x7e, 0x35, 0x75, 0x9f, 0xd3, 0xfc, 0xde, 0x09, 0xe1, 0xf3, 0x2b, 0xf9, 0x81, 0xe7, 0x47, 0x81, 0xe7, 0x5f, 0xd4, 0x67, 0xe2, 0x17, 0x7c, 0x77, 0x87, + 0x78, 0xf9, 0x82, 0x13, 0x65, 0x4e, 0x31, 0x7a, 0xb6, 0xf3, 0xd3, 0x62, 0xf4, 0x65, 0x86, 0x36, 0xf1, 0x0b, 0x79, 0xc4, 0x57, 0xf9, 0xf5, 0xf3, 0xc0, 0xd1, 0x67, 0x9f, 0x8e, 0x2e, 0xcf, 0xfd, + 0x7a, 0x50, 0x8c, 0x95, 0x5e, 0x03, 0x78, 0x34, 0x2b, 0x72, 0x32, 0xaa, 0x32, 0x60, 0xe5, 0x1f, 0x57, 0xaa, 0x7b, 0x84, 0x85, 0x2d, 0xdb, 0xd7, 0x13, 0xac, 0x21, 0x5c, 0x34, 0x9b, 0x00, 0xd3, + 0xd5, 0x78, 0xc1, 0xbb, 0x6b, 0x1a, 0x4f, 0x26, 0x32, 0x44, 0x67, 0x01, 0x55, 0x8b, 0x79, 0xad, 0x86, 0xe4, 0xc2, 0xf1, 0x3d, 0xc8, 0x50, 0x83, 0xc5, 0x49, 0x93, 0x4d, 0x71, 0xb7, 0x62, 0x8d, + 0x14, 0x3f, 0x55, 0xd3, 0xc9, 0x87, 0xae, 0x7c, 0x37, 0xf8, 0xfd, 0x37, 0x30, 0xeb, 0x85, 0xfa, 0x13, 0x6b, 0x5e, 0x8e, 0x07, 0x33, 0x62, 0xba, 0xe1, 0x22, 0x06, 0xf6, 0xbd, 0xc4, 0xb1, 0x37, + 0x63, 0x5d, 0x49, 0x58, 0x31, 0x0a, 0x0f, 0x46, 0x5b, 0x19, 0x1e, 0xb1, 0x80, 0x7b, 0xc9, 0x95, 0x33, 0xa8, 0xb2, 0xd7, 0x2b, 0x7a, 0x91, 0x2e, 0xf0, 0xc9, 0x01, 0x90, 0xac, 0x98, 0xda, 0x35, + 0xc7, 0x82, 0x1b, 0x53, 0xe0, 0xbe, 0x1f, 0x53, 0xe8, 0x3e, 0xf3, 0xa0, 0x93, 0xd0, 0x2d, 0x90, 0x69, 0xc7, 0xc0, 0x3b, 0x69, 0xaf, 0xca, 0x84, 0x7a, 0x2d, 0x9d, 0x9f, 0x8b, 0xe2, 0xa7, 0x92, + 0xf5, 0x24, 0x9c, 0xc8, 0xbb, 0x32, 0xc1, 0x73, 0xff, 0x91, 0x9f, 0xff, 0x76, 0xab, 0x5f, 0x4a, 0xf8, 0xa4, 0xa7, 0x1f, 0x9d, 0x67, 0x5c, 0xf1, 0x3b, 0x38, 0x13, 0x5f, 0xe0, 0xa8, 0xbd, 0x76, + 0x6c, 0xf9, 0xfd, 0xc1, 0x87, 0x5c, 0x9f, 0x2b, 0xf3, 0x60, 0xf8, 0x78, 0xbd, 0xa1, 0x0f, 0x8e, 0xde, 0x9e, 0x8d, 0xd0, 0x0f, 0x9d, 0xb2, 0x7f, 0xdc, 0x1b, 0xaf, 0xdd, 0x16, 0x3a, 0x2c, 0xf1, + 0xe3, 0x41, 0xb1, 0xb7, 0x3e, 0xb9, 0xef, 0x57, 0x2d, 0xba, 0x11, 0xcc, 0x7d, 0x0c, 0xd6, 0xc0, 0x3a, 0x77, 0xcb, 0x49, 0x37, 0xcb, 0x34, 0x11, 0x92, 0x5c, 0xaa, 0xcc, 0x49, 0xd0, 0xa1, 0x30, + 0xad, 0xeb, 0xc4, 0x4c, 0xe2, 0x3a, 0x6a, 0xae, 0xc0, 0xf3, 0xa8, 0xa7, 0x2b, 0x71, 0xc7, 0xac, 0x45, 0x19, 0x20, 0x93, 0x2a, 0xca, 0xe7, 0x5d, 0xa0, 0x58, 0x40, 0x31, 0xce, 0xdf, 0xda, 0x62, + 0x3f, 0xee, 0x8e, 0xd9, 0xf9, 0x93, 0x0b, 0x0c, 0x89, 0x95, 0x26, 0x8d, 0x53, 0xdc, 0x68, 0x7a, 0xf6, 0xe3, 0x75, 0x09, 0xf9, 0xf1, 0x96, 0xeb, 0x6f, 0xc6, 0xed, 0x1e, 0x5f, 0x91, 0x77, 0x40, + 0x04, 0xc3, 0xf9, 0x7a, 0xe9, 0x48, 0x33, 0xba, 0xfc, 0x3f, 0x77, 0x2f, 0x46, 0x86, 0xf1, 0x52, 0xa8, 0x02, 0xc0, 0xa5, 0xa2, 0x6c, 0xb5, 0xb6, 0xda, 0x39, 0x56, 0x69, 0x3b, 0x12, 0x14, 0x8b, + 0xed, 0xb6, 0x9a, 0xc3, 0xde, 0x21, 0x00, 0x5c, 0x72, 0x9e, 0x47, 0xfd, 0xc4, 0x4e, 0xeb, 0xc2, 0x88, 0xac, 0xb9, 0x36, 0x97, 0xb5, 0x39, 0x02, 0xac, 0x3d, 0x7a, 0xb1, 0xf1, 0xc3, 0x23, 0x6d, + 0x02, 0xcb, 0xf9, 0x94, 0xcf, 0x29, 0xb3, 0x3e, 0xb4, 0x33, 0xb8, 0xb3, 0x8e, 0xb2, 0x8a, 0x65, 0xce, 0xa6, 0x96, 0x87, 0xf3, 0xf2, 0x7d, 0x8b, 0xa0, 0x8f, 0xa2, 0x75, 0xce, 0x3b, 0xb5, 0x8c, + 0xec, 0x05, 0x57, 0xec, 0x52, 0x48, 0xf4, 0xbb, 0x51, 0xcc, 0xf8, 0xfd, 0xdd, 0x37, 0x40, 0x3a, 0xc6, 0x67, 0x67, 0xf9, 0xd7, 0xe3, 0xf3, 0x6e, 0x60, 0xef, 0x8d, 0xd3, 0xd3, 0x70, 0xa3, 0x8f, + 0x8d, 0xd3, 0xdb, 0x27, 0x9c, 0x37, 0xd3, 0x37, 0xe7, 0xa3, 0x33, 0xdd, 0x61, 0xe3, 0x26, 0xbb, 0x13, 0xb5, 0xb2, 0x81, 0x66, 0x6e, 0x4f, 0xaa, 0xb9, 0x6c, 0xd1, 0x24, 0x4d, 0xf7, 0xfb, 0x0a, + 0x76, 0xf7, 0x5a, 0xb7, 0xc9, 0x27, 0x01, 0x87, 0x58, 0x1b, 0x06, 0x3f, 0x31, 0x53, 0x72, 0x8d, 0x5a, 0x59, 0x39, 0x9b, 0x4e, 0x1a, 0xa5, 0xcb, 0xa8, 0x93, 0xc8, 0x7a, 0x38, 0x0b, 0x6e, 0x16, + 0x8b, 0xd5, 0x7e, 0xb2, 0x25, 0x49, 0xd0, 0x38, 0x81, 0xcb, 0x9a, 0x61, 0x27, 0x7c, 0xb9, 0xde, 0x99, 0xac, 0x37, 0x7c, 0xdc, 0x2e, 0x3f, 0x3c, 0xb9, 0xa8, 0x1c, 0x3f, 0xaf, 0xb0, 0x31, 0x7f, + 0x7c, 0xc1, 0xdf, 0xe4, 0x5a, 0x4f, 0xf9, 0xf1, 0x81, 0xb9, 0xf0, 0x1f, 0x31, 0x37, 0x79, 0x51, 0x53, 0x5e, 0x4e, 0xce, 0x2e, 0x9e, 0x01, 0x6c, 0x85, 0x47, 0x19, 0x35, 0xdd, 0x05, 0x54, 0x60, + 0xc9, 0x8d, 0xb3, 0x43, 0xd5, 0x65, 0x1f, 0xa2, 0xf2, 0x52, 0xb0, 0xb2, 0x6d, 0x43, 0xab, 0xff, 0xfe, 0xf3, 0xe6, 0x1b, 0xbd, 0x81, 0x8b, 0xb9, 0xbf, 0x58, 0x5e, 0x2f, 0xd1, 0xc3, 0xdf, 0xe7, + 0x85, 0xf8, 0xd3, 0xa6, 0xf6, 0x7c, 0x78, 0x03, 0x0a, 0xf2, 0xce, 0xbb, 0x54, 0xb6, 0xa2, 0xa2, 0x34, 0x7b, 0x28, 0x82, 0x95, 0x16, 0xbb, 0x6b, 0xd6, 0x8d, 0xd2, 0x05, 0x49, 0x44, 0xbb, 0xba, + 0x81, 0xee, 0xbc, 0xcb, 0xe7, 0x98, 0x67, 0x57, 0x29, 0x4d, 0xe3, 0x07, 0xdf, 0xe8, 0x2b, 0x68, 0xa7, 0x33, 0xe5, 0xaf, 0xdf, 0xee, 0x3c, 0x01, 0xc2, 0x5d, 0xd8, 0xda, 0xfa, 0xb2, 0xc2, 0x20, + 0x52, 0x58, 0x06, 0x93, 0x9c, 0xd6, 0xb1, 0x54, 0xe5, 0x4a, 0x4f, 0x45, 0x66, 0xf9, 0x84, 0x3d, 0x95, 0x88, 0x94, 0x1d, 0x63, 0xcc, 0x90, 0xf7, 0x66, 0x18, 0x03, 0x87, 0x99, 0x36, 0xb3, 0x34, + 0x6c, 0xe3, 0xce, 0xd7, 0xdb, 0x02, 0xab, 0x85, 0xf5, 0x21, 0x36, 0x20, 0xa7, 0xc7, 0xdc, 0x71, 0xe4, 0xf1, 0xc5, 0x71, 0x0a, 0x19, 0x3a, 0x24, 0x0b, 0x69, 0x3b, 0x7c, 0x02, 0x5c, 0x01, 0x05, + 0x5d, 0x45, 0x40, 0x7e, 0x5c, 0xcb, 0xff, 0xff, 0x7a, 0xfb, 0xff, 0x55, 0x2b, 0xba, 0xa4, 0xd2, 0x83, 0x97, 0x7f, 0x85, 0x75, 0x47, 0x2b, 0x82, 0x7e, 0x3d, 0x92, 0x2b, 0xfe, 0x9e, 0x38, 0x38, + 0x7a, 0x3d, 0x3c, 0xe7, 0x42, 0x0e, 0x50, 0xd8, 0xc7, 0x0d, 0xb1, 0x65, 0x66, 0x54, 0x16, 0xed, 0xfc, 0xa6, 0x93, 0x1d, 0x8d, 0xd7, 0x99, 0x6d, 0x33, 0x6f, 0x56, 0x53, 0x7b, 0x81, 0x67, 0xb3, + 0xd2, 0x4e, 0x22, 0xc4, 0x03, 0xed, 0x49, 0x56, 0xc5, 0xf5, 0x7c, 0x26, 0x39, 0xb6, 0x8c, 0xcd, 0x8a, 0x7c, 0x5c, 0x94, 0x4c, 0xa9, 0x03, 0x71, 0x33, 0x11, 0x70, 0x18, 0x5a, 0xfa, 0x6b, 0x43, + 0x44, 0xb4, 0xf1, 0x0e, 0xb6, 0x45, 0x31, 0x61, 0xb8, 0xee, 0x4b, 0x04, 0xc0, 0xdb, 0x5a, 0xd2, 0x0b, 0xe0, 0x0f, 0xfe, 0x64, 0x6c, 0x5c, 0xf9, 0xb8, 0xdf, 0x82, 0x51, 0xbe, 0xab, 0xc5, 0x71, + 0xca, 0xac, 0x70, 0x9c, 0x67, 0xf5, 0x09, 0xfd, 0x58, 0x98, 0x60, 0xbc, 0xe4, 0x24, 0x7d, 0xe8, 0xbc, 0xf2, 0x1b, 0x6c, 0xe2, 0xac, 0x3d, 0x5d, 0x21, 0x42, 0x04, 0xf1, 0xb9, 0x37, 0x95, 0x5b, + 0x38, 0xa5, 0x7f, 0x73, 0xb7, 0x7a, 0x52, 0xbf, 0x7a, 0x23, 0x7e, 0x85, 0x97, 0x41, 0xdf, 0x55, 0x3d, 0x04, 0x49, 0x10, 0x1b, 0x95, 0xe5, 0xbf, 0x0a, 0xcd, 0xd5, 0xfb, 0x5c, 0x40, 0x83, 0xce, + 0x20, 0x28, 0x56, 0x1a, 0xff, 0x0e, 0xef, 0xdf, 0xa9, 0x14, 0xfa, 0x0c, 0x70, 0xe3, 0x1a, 0x46, 0xf2, 0xc7, 0x8f, 0xf7, 0x9e, 0x2c, 0xf4, 0x41, 0xfd, 0xed, 0x23, 0x9c, 0xe4, 0x40, 0x9d, 0xcd, + 0x4e, 0x67, 0xad, 0xdd, 0xc4, 0x98, 0x44, 0x3b, 0x1c, 0xc6, 0xa1, 0x8a, 0xbc, 0x46, 0x0e, 0x34, 0x32, 0xdd, 0xab, 0x53, 0xa3, 0x6b, 0xf9, 0x89, 0x42, 0xe7, 0x87, 0x58, 0x08, 0xab, 0x39, 0x69, + 0x8c, 0xe1, 0x15, 0xa2, 0x98, 0x50, 0x97, 0xed, 0xa2, 0x74, 0xae, 0x24, 0xb4, 0xc8, 0xb4, 0x79, 0x98, 0xb5, 0xc9, 0x24, 0x35, 0x52, 0x2c, 0x73, 0xa2, 0x35, 0x19, 0xa1, 0xca, 0xca, 0x6e, 0x50, + 0x4f, 0xf9, 0xa0, 0x67, 0x7c, 0x14, 0xaa, 0x1f, 0x9f, 0xcf, 0xe2, 0x1b, 0xd0, 0x92, 0x3f, 0xee, 0x6e, 0x5f, 0xbf, 0x05, 0xe7, 0xee, 0xde, 0x85, 0x5c, 0x25, 0xf6, 0xfc, 0xf8, 0x06, 0x67, 0x9f, + 0x89, 0x83, 0xa3, 0x97, 0xa3, 0xd1, 0x85, 0xd8, 0x30, 0xf6, 0x4e, 0xb5, 0x25, 0x5d, 0x9f, 0x4e, 0x4c, 0xc3, 0xa4, 0x8b, 0x31, 0xb6, 0x5e, 0x70, 0x74, 0xe9, 0x30, 0x46, 0x32, 0xf1, 0x67, 0x28, + 0xed, 0x30, 0x69, 0xe1, 0x31, 0xfc, 0x58, 0xd8, 0xe2, 0xbc, 0xa0, 0xeb, 0x21, 0xa2, 0xd1, 0x89, 0x4d, 0xa9, 0x34, 0x52, 0x9e, 0xec, 0x23, 0x36, 0xd1, 0x78, 0x37, 0xb4, 0xbd, 0xf5, 0x94, 0xd6, + 0x79, 0xd5, 0x48, 0xf4, 0xbd, 0x95, 0x4d, 0xa7, 0x9c, 0xb8, 0xd1, 0xd8, 0xf6, 0x83, 0x3a, 0xf0, 0x6d, 0xf6, 0xbe, 0x4d, 0x34, 0xfe, 0xf9, 0x0f, 0xe8, 0x6d, 0x62, 0xfc, 0x8f, 0xbb, 0x6c, 0x8e, + 0x3f, 0xe3, 0x30, 0xf2, 0x0e, 0x00, 0x66, 0x38, 0x83, 0xef, 0x43, 0x62, 0xfe, 0xb8, 0xc7, 0xd5, 0xbf, 0x1d, 0x16, 0xf3, 0xc7, 0x8f, 0x8f, 0x7e, 0xfc, 0x1f, 0xef, 0xb7, 0xe5, 0x9b, 0xab, 0xc2, + 0x7d, 0x6d, 0x03, 0x7e, 0x70, 0x6a, 0xdf, 0x78, 0xce, 0x2b, 0x0e, 0xf5, 0xd5, 0xd5, 0x1b, 0x8e, 0xc7, 0x1f, 0xf7, 0x38, 0x88, 0xbb, 0x92, 0x05, 0x28, 0x58, 0xe0, 0xb7, 0xb9, 0x84, 0xaf, 0x41, + 0x63, 0xd9, 0x20, 0x2e, 0xec, 0x09, 0x0b, 0x32, 0x12, 0x77, 0x95, 0x26, 0x2f, 0xd2, 0x9c, 0xc6, 0x7a, 0x0e, 0x4f, 0x37, 0xcc, 0x6e, 0x97, 0x5a, 0x75, 0x3c, 0x29, 0x5d, 0x3a, 0x0f, 0x8f, 0x7a, + 0x92, 0x07, 0x7b, 0xc1, 0x8f, 0x85, 0x76, 0x03, 0xc6, 0xb3, 0x05, 0x9f, 0x11, 0x3b, 0xc7, 0x8f, 0x2a, 0x34, 0x8f, 0xf0, 0x68, 0x16, 0x7c, 0x22, 0x97, 0xbf, 0x39, 0xf8, 0xbf, 0xde, 0xfe, 0x7f, + 0xdd, 0x76, 0x5d, 0xa3, 0xac, 0x02, 0xb7, 0x3f, 0x03, 0x99, 0x3d, 0x67, 0xbd, 0xdc, 0x73, 0xdf, 0xa0, 0x57, 0x5a, 0xce, 0x50, 0x2e, 0xde, 0x7c, 0xc2, 0x33, 0x72, 0xda, 0xcb, 0xe9, 0x08, 0xfd, + 0xa0, 0xe6, 0xdc, 0x64, 0x9e, 0x63, 0x9a, 0xb3, 0x2a, 0x5a, 0x12, 0x76, 0xa7, 0xcf, 0xc7, 0xa7, 0x60, 0x6d, 0x17, 0xd0, 0x38, 0x16, 0xf7, 0xe4, 0x3a, 0x61, 0x02, 0x69, 0x0a, 0xeb, 0xcd, 0x24, + 0xe2, 0x17, 0x56, 0xa5, 0x54, 0xa0, 0x62, 0x01, 0x34, 0xca, 0xd3, 0xe2, 0x4e, 0x1b, 0x07, 0xb1, 0xba, 0xd3, 0x81, 0xd8, 0x6f, 0x54, 0x3f, 0x59, 0x9f, 0x62, 0x69, 0xba, 0x70, 0x5a, 0xf5, 0x28, + 0xce, 0x3d, 0x36, 0xa2, 0x3b, 0xcf, 0x9e, 0x4c, 0xbe, 0xf6, 0x4b, 0xfc, 0x86, 0xd8, 0x7b, 0x0f, 0x96, 0xfc, 0xf4, 0x16, 0x97, 0xea, 0xbf, 0xcb, 0xce, 0xf4, 0x11, 0xdb, 0xd9, 0x28, 0xab, 0x51, + 0x5d, 0x04, 0x3f, 0xff, 0xed, 0x7e, 0x3e, 0xc3, 0x57, 0xd8, 0x7e, 0xf7, 0x44, 0x9b, 0x7c, 0x52, 0x00, 0x1e, 0x5b, 0x5c, 0xdf, 0xa2, 0xd7, 0xc1, 0xef, 0x51, 0x6c, 0x7e, 0xdc, 0x9d, 0xfe, 0x4a, + 0x0d, 0x1f, 0x33, 0x4b, 0xa4, 0x7a, 0xbe, 0xda, 0x77, 0x53, 0xae, 0xc9, 0xdd, 0xad, 0xe3, 0x53, 0xdc, 0xe9, 0x30, 0x6b, 0x45, 0x74, 0xb3, 0xed, 0x75, 0x78, 0xb1, 0x05, 0x30, 0xda, 0x60, 0x4e, + 0x34, 0xbe, 0xc8, 0xb6, 0xec, 0xde, 0x5f, 0xfa, 0xd2, 0xf2, 0x14, 0x52, 0x7a, 0xcd, 0xa9, 0x04, 0xb7, 0x67, 0xda, 0xc4, 0x70, 0xfc, 0xb1, 0x6f, 0x89, 0x6d, 0xd8, 0xc3, 0x72, 0xbd, 0x3a, 0x4d, + 0xa5, 0x6f, 0xf8, 0x19, 0x86, 0x60, 0xd6, 0x9d, 0x6f, 0x1c, 0x8c, 0x5b, 0xf7, 0xf6, 0x81, 0x5f, 0x62, 0xd7, 0x9d, 0x6f, 0xbe, 0x87, 0x5f, 0xf7, 0xe3, 0xee, 0xf2, 0xfd, 0x05, 0x78, 0xdc, 0x8f, + 0x1f, 0x9f, 0x25, 0x0f, 0xff, 0xf8, 0xc6, 0xa0, 0xfe, 0x19, 0x88, 0xdc, 0x8f, 0x7b, 0xa3, 0xfe, 0xb7, 0x01, 0xc9, 0x0d, 0x5d, 0x9b, 0x9e, 0x46, 0x3c, 0x76, 0x8a, 0xbb, 0x90, 0x2c, 0x8f, 0xf5, + 0xd4, 0xfa, 0x48, 0xfe, 0xac, 0xc6, 0x3d, 0x1f, 0x0f, 0x6d, 0xa9, 0xb5, 0x22, 0xb7, 0xe2, 0x66, 0x9a, 0xa3, 0x9b, 0xf4, 0x60, 0x32, 0xbe, 0x40, 0x01, 0x0a, 0x58, 0x13, 0x84, 0x2f, 0x51, 0xa8, + 0x77, 0x02, 0x0b, 0x23, 0xdc, 0x4c, 0x00, 0x0e, 0x39, 0xb2, 0x7d, 0x10, 0x4a, 0x99, 0xa8, 0x48, 0x9a, 0xaa, 0x2f, 0xd4, 0x6c, 0x6b, 0x44, 0x4e, 0x1a, 0x02, 0x14, 0x32, 0x29, 0xa1, 0x0d, 0x55, + 0x4b, 0x8a, 0x44, 0x88, 0x01, 0xb9, 0xcc, 0x05, 0x17, 0xaa, 0x81, 0x22, 0xc5, 0x3f, 0x86, 0x35, 0x5e, 0x7e, 0xeb, 0x4b, 0xb5, 0xfd, 0xed, 0xf5, 0xf9, 0x8f, 0xd8, 0x70, 0x26, 0xfd, 0x64, 0x19, + 0x3d, 0xfd, 0x1f, 0xda, 0x25, 0xd9, 0x0e, 0x89, 0x26, 0x5c, 0x26, 0xf0, 0xa4, 0x20, 0xcb, 0x9d, 0x1e, 0x22, 0xfd, 0x44, 0x0f, 0x84, 0x35, 0xbd, 0x62, 0xe2, 0x0d, 0x25, 0xc8, 0x94, 0x2e, 0x44, + 0x4b, 0xc7, 0xd2, 0x11, 0x7b, 0x79, 0x3a, 0xf9, 0xe1, 0x66, 0x41, 0xf7, 0x5c, 0x8a, 0x31, 0xb6, 0x1e, 0xea, 0x42, 0x49, 0xb4, 0x9c, 0x86, 0x1c, 0x43, 0xbc, 0x6f, 0x76, 0xca, 0x26, 0xab, 0xe5, + 0x50, 0x3c, 0xa0, 0x7b, 0xbe, 0xf0, 0xc7, 0xe7, 0x4e, 0xf1, 0xb7, 0x5f, 0xff, 0xbc, 0x00, 0x5c, 0xe4, 0xf9, 0x05, 0x52, 0xff, 0xab, 0x5d, 0x0b, 0xfb, 0x33, 0xae, 0x7c, 0xf6, 0x44, 0x70, 0xf4, + 0xe9, 0xc7, 0x67, 0x6b, 0x60, 0x00, 0x0f, 0x8d, 0xc3, 0x44, 0x67, 0xf7, 0x29, 0x1e, 0x23, 0xc8, 0xfc, 0x08, 0x9f, 0x0e, 0xa7, 0x99, 0xca, 0x4d, 0x9b, 0xba, 0x02, 0xe9, 0xe5, 0x52, 0x76, 0xc0, + 0xa9, 0x91, 0xcd, 0x44, 0x25, 0xe9, 0x02, 0x66, 0x2c, 0x17, 0xd0, 0x51, 0x5a, 0xe4, 0xf9, 0x12, 0xa7, 0xd6, 0xd5, 0x4c, 0xa0, 0x63, 0x87, 0xc0, 0x7c, 0xc0, 0xa8, 0x08, 0xa4, 0x94, 0x7c, 0xf3, + 0x68, 0x62, 0x87, 0x82, 0xb7, 0x61, 0x0d, 0xe5, 0x14, 0x7e, 0xc0, 0xae, 0x76, 0xe3, 0xb7, 0xff, 0xbc, 0xf8, 0x06, 0x89, 0x7b, 0xd9, 0x8b, 0xff, 0x99, 0xa4, 0xb6, 0x13, 0x05, 0x26, 0xe8, 0x96, + 0xbf, 0x4a, 0xcb, 0x48, 0xec, 0xe0, 0x6e, 0x58, 0xfc, 0x17, 0xfc, 0x40, 0x4e, 0xe9, 0x0d, 0xfa, 0x4f, 0x4c, 0x7e, 0x3d, 0x39, 0xeb, 0xaa, 0x03, 0x12, 0x47, 0x51, 0xd4, 0x43, 0x33, 0x61, 0x75, + 0x44, 0x4d, 0x6f, 0x9c, 0xe8, 0x26, 0x0f, 0x02, 0xf4, 0x1e, 0x5f, 0x22, 0xce, 0x8a, 0x39, 0x1d, 0x26, 0x49, 0x80, 0x51, 0x92, 0xbb, 0x4a, 0xf8, 0xb1, 0xeb, 0xf9, 0xd2, 0xd6, 0xf3, 0xa4, 0x66, + 0x6a, 0x83, 0xd9, 0x7c, 0xbd, 0xf1, 0x56, 0xa5, 0x3d, 0xf1, 0xb4, 0xac, 0xaa, 0xe7, 0x35, 0x91, 0xe7, 0xe0, 0x4c, 0x69, 0xc4, 0xfd, 0x3c, 0xf2, 0x9b, 0x92, 0xdf, 0xd2, 0xef, 0xb1, 0xc8, 0x06, + 0x5a, 0xeb, 0x57, 0xaf, 0x54, 0x19, 0xd5, 0xcf, 0xe7, 0xdc, 0xce, 0x2b, 0x43, 0xb7, 0xa8, 0xcf, 0xe9, 0xa3, 0x46, 0x14, 0x39, 0x2f, 0x09, 0x68, 0xf0, 0x2f, 0x6a, 0xc0, 0x18, 0x5c, 0x08, 0xde, + 0x1e, 0x80, 0x47, 0x92, 0x7a, 0xdf, 0x13, 0x7f, 0xe6, 0x7e, 0x65, 0x54, 0xe7, 0x64, 0xd2, 0x01, 0xac, 0x5f, 0xee, 0xa3, 0xc5, 0x6a, 0x02, 0x59, 0x51, 0x85, 0x00, 0x3b, 0x8f, 0x30, 0x2d, 0x2b, + 0x07, 0xb6, 0x27, 0xc5, 0x5e, 0x35, 0x0d, 0x4c, 0x59, 0xc8, 0x72, 0x9d, 0x4f, 0x37, 0x65, 0x2a, 0xf2, 0x19, 0x1c, 0x3a, 0x44, 0x17, 0x56, 0x05, 0xb1, 0x42, 0x70, 0x40, 0xd3, 0x15, 0x02, 0x11, + 0x68, 0xbb, 0x51, 0xa9, 0x1c, 0xce, 0xb7, 0xa7, 0xa5, 0xc6, 0xb8, 0xbe, 0xe0, 0x02, 0x8c, 0xd2, 0xc8, 0xab, 0xbb, 0x30, 0xb7, 0x77, 0xf9, 0xd2, 0x5e, 0x87, 0x15, 0xfe, 0x82, 0x50, 0xf8, 0x3b, + 0xe2, 0x17, 0xbe, 0x3c, 0x1d, 0x0d, 0x8d, 0x7f, 0x93, 0xd3, 0x22, 0x35, 0x4a, 0xbc, 0xd9, 0x56, 0x1a, 0xc6, 0x2e, 0xf5, 0xed, 0x64, 0xc1, 0xa4, 0x33, 0x14, 0xf1, 0x93, 0x35, 0x22, 0x8c, 0xfb, + 0xa3, 0x47, 0x67, 0x1a, 0x6b, 0xd6, 0xfa, 0x42, 0x86, 0xc7, 0xcd, 0x4c, 0xc8, 0x0b, 0x04, 0xcd, 0xa6, 0x04, 0xee, 0x80, 0xec, 0xc1, 0xda, 0x97, 0x07, 0x7a, 0x31, 0xe1, 0x9b, 0x31, 0x74, 0xac, + 0x6c, 0x04, 0xcb, 0xfd, 0x59, 0xcf, 0x15, 0x78, 0x3b, 0xad, 0xd2, 0x07, 0x23, 0xbe, 0x37, 0x67, 0xf1, 0xbb, 0x29, 0xfb, 0xbc, 0x40, 0xe4, 0xcf, 0xe2, 0x78, 0xb7, 0x2b, 0xf7, 0x47, 0x9c, 0x8c, + 0xdb, 0xab, 0x30, 0xf9, 0x88, 0x34, 0x5e, 0xd3, 0xbe, 0xae, 0xfc, 0x3c, 0x93, 0xfc, 0x9a, 0xef, 0x9a, 0x30, 0x5f, 0xef, 0xca, 0xaa, 0xd5, 0xd8, 0x9e, 0xa9, 0x0f, 0x12, 0xc2, 0xb3, 0x92, 0x72, + 0x00, 0x8e, 0xd2, 0xa2, 0x3b, 0xf0, 0xb1, 0x2f, 0x02, 0x48, 0x5a, 0xc4, 0x65, 0xc5, 0x34, 0x89, 0x1e, 0xf4, 0xe9, 0x54, 0xaa, 0x34, 0x38, 0xcf, 0x29, 0xdd, 0xf7, 0x8b, 0xe3, 0x12, 0x5b, 0xef, + 0xaa, 0xce, 0x2b, 0x01, 0xe4, 0x10, 0xa8, 0xdb, 0x88, 0x9a, 0xb0, 0x44, 0xb2, 0x5e, 0x2a, 0x39, 0x58, 0xd3, 0x43, 0x10, 0x1f, 0xfe, 0xf3, 0xfc, 0x5b, 0x9f, 0x1d, 0x8d, 0x77, 0xd8, 0x42, 0xfc, + 0x42, 0xa8, 0x47, 0x76, 0xa7, 0xb7, 0xa4, 0x5f, 0x9d, 0x99, 0xa3, 0x0b, 0xb5, 0xaf, 0x59, 0xb2, 0x5b, 0x5b, 0x4d, 0x90, 0xee, 0x99, 0x05, 0x09, 0xce, 0x3b, 0xc3, 0xd9, 0x72, 0x47, 0x01, 0x03, + 0xb7, 0xc1, 0xb6, 0xad, 0xf0, 0x6c, 0xba, 0xa3, 0x66, 0xa8, 0xe8, 0xb2, 0x71, 0x63, 0xb4, 0x64, 0x25, 0x45, 0x50, 0x51, 0x2c, 0xe8, 0x15, 0xc6, 0x47, 0xf0, 0x78, 0xa1, 0x6c, 0x81, 0x4c, 0x08, + 0xe6, 0x13, 0x17, 0x14, 0x78, 0xb9, 0x99, 0x9c, 0x68, 0x00, 0x57, 0x4e, 0xaa, 0x30, 0xe3, 0x29, 0xda, 0x49, 0xbe, 0xca, 0x02, 0xbe, 0x23, 0x8a, 0x2f, 0x6f, 0x52, 0x3d, 0x7b, 0x27, 0xff, 0x7f, + 0x6f, 0x05, 0xf0, 0xf9, 0xd3, 0x37, 0x0a, 0xec, 0xe5, 0x96, 0x3b, 0x82, 0x78, 0x4d, 0xea, 0xf6, 0xe4, 0x7f, 0x24, 0x63, 0xed, 0x8a, 0xf2, 0x99, 0xdd, 0x4f, 0x07, 0x43, 0xeb, 0xf3, 0xb4, 0x3a, + 0xca, 0x75, 0x81, 0x51, 0xb7, 0xfb, 0x89, 0x4e, 0x87, 0x87, 0xe4, 0x88, 0xaf, 0xaa, 0xe5, 0x42, 0x0a, 0xbc, 0x6c, 0x3c, 0xb6, 0x76, 0x15, 0xe3, 0x31, 0x85, 0x88, 0x78, 0x0b, 0xa5, 0xf5, 0xfb, + 0x55, 0x95, 0x22, 0x30, 0x00, 0x9f, 0xcc, 0x1d, 0x5d, 0x89, 0xfb, 0x29, 0xc2, 0xc3, 0x73, 0xaa, 0xc5, 0x72, 0x5a, 0x86, 0x0a, 0x91, 0xd5, 0xa6, 0xc9, 0xd4, 0x81, 0xe6, 0xeb, 0x6d, 0x30, 0x5b, + 0x2d, 0x07, 0x2d, 0x88, 0xb7, 0xb8, 0x77, 0x5b, 0x0a, 0xdf, 0x96, 0x40, 0x7d, 0x93, 0x2b, 0x6f, 0xc8, 0xbf, 0xb3, 0x35, 0xce, 0x64, 0xbf, 0xe6, 0x8f, 0xd5, 0x69, 0x73, 0x79, 0x57, 0x3a, 0xd3, + 0x18, 0x17, 0x29, 0xd6, 0x6c, 0xe1, 0xa5, 0x66, 0x92, 0x05, 0x2e, 0x6e, 0x30, 0xd1, 0xdf, 0x54, 0xa8, 0x2f, 0x1d, 0xf8, 0xe3, 0x7c, 0x92, 0xf1, 0xa1, 0x40, 0x6e, 0x67, 0xba, 0x22, 0x4e, 0x6b, + 0x99, 0xe5, 0x27, 0x0b, 0x24, 0x40, 0xbc, 0x43, 0x66, 0xe9, 0x36, 0x3f, 0x5d, 0x16, 0x99, 0x5e, 0x6f, 0x19, 0x7f, 0x41, 0xec, 0xcc, 0x18, 0x0e, 0xf4, 0x78, 0xcd, 0x0e, 0x29, 0x9b, 0x79, 0x7e, + 0x81, 0x37, 0x00, 0xc4, 0xf7, 0xf6, 0x8b, 0xef, 0x27, 0x85, 0xbe, 0xa3, 0x0d, 0x8e, 0x5e, 0x0f, 0x87, 0xb6, 0x17, 0x0d, 0xfd, 0x9a, 0xe3, 0x97, 0x4a, 0xe1, 0x37, 0xb4, 0xc4, 0xe7, 0xad, 0x64, + 0x75, 0xf8, 0x72, 0x9d, 0xc7, 0x9c, 0x13, 0x4c, 0xc6, 0x33, 0xad, 0x28, 0x69, 0x51, 0xf2, 0x8b, 0x68, 0xbe, 0x29, 0xcc, 0x22, 0x56, 0xb1, 0x83, 0x20, 0x85, 0xe1, 0x58, 0x8d, 0xc0, 0x94, 0xa7, + 0x05, 0x46, 0xa4, 0x48, 0x5d, 0x51, 0x97, 0xed, 0x2e, 0x26, 0xc8, 0x6e, 0x49, 0x9f, 0xb0, 0x99, 0x44, 0x3b, 0xc7, 0xea, 0xe4, 0x7c, 0x43, 0x6c, 0x92, 0xfb, 0x60, 0x6a, 0x08, 0x74, 0x15, 0x96, + 0xff, 0x26, 0x4f, 0x92, 0x0b, 0xa2, 0xda, 0xb9, 0x42, 0xe3, 0x42, 0xe9, 0x6b, 0x66, 0x30, 0x36, 0x34, 0xdd, 0x57, 0x9a, 0x97, 0x68, 0x2b, 0xae, 0x15, 0xe1, 0xf0, 0x18, 0x6f, 0x8b, 0x53, 0xea, + 0x86, 0x1c, 0x22, 0xeb, 0xba, 0x65, 0x04, 0x90, 0x1d, 0x57, 0xa7, 0x66, 0x39, 0xf5, 0xad, 0x09, 0xa0, 0x94, 0xec, 0xd8, 0x27, 0x15, 0xb4, 0x8b, 0xfa, 0xca, 0x80, 0x8e, 0xac, 0x78, 0x50, 0xd6, + 0x2e, 0x4f, 0xb1, 0xb5, 0x52, 0x99, 0xf0, 0x31, 0x89, 0xa5, 0x99, 0x2f, 0x17, 0x8e, 0x44, 0xcf, 0x3e, 0x9a, 0x19, 0x2f, 0x3f, 0xb0, 0x88, 0x8d, 0x28, 0x38, 0x39, 0xaf, 0x65, 0x4b, 0xcf, 0xbd, + 0xb9, 0x6e, 0xab, 0x59, 0x0f, 0x05, 0xa4, 0x3e, 0x7b, 0xd2, 0x99, 0x39, 0xb7, 0x3e, 0x38, 0xa7, 0x31, 0x0c, 0x88, 0x55, 0xb1, 0x21, 0x61, 0x2d, 0x89, 0x13, 0x40, 0x91, 0x02, 0x42, 0x22, 0xdb, + 0x3c, 0xce, 0x10, 0x6e, 0x3c, 0x5b, 0x96, 0x69, 0x5a, 0xab, 0xb3, 0x93, 0x39, 0x5d, 0xf9, 0xb2, 0x7c, 0x62, 0x66, 0x68, 0xb8, 0x59, 0x2a, 0x47, 0xbc, 0xa0, 0xbc, 0xf2, 0x04, 0xa5, 0x6a, 0x7a, + 0xcc, 0x97, 0xaa, 0x82, 0xd5, 0xb0, 0x82, 0xda, 0xc2, 0x22, 0x85, 0x32, 0x66, 0x21, 0x10, 0xe5, 0x5a, 0x5c, 0xf4, 0x7e, 0x1d, 0xf5, 0xd9, 0x3d, 0x6e, 0x7d, 0x05, 0xf0, 0xfe, 0xf0, 0x72, 0xfb, + 0x01, 0xe7, 0x7d, 0xc0, 0x5a, 0x0b, 0xed, 0x48, 0x8b, 0x4b, 0xdb, 0xa9, 0x5d, 0x06, 0x13, 0x2a, 0x31, 0xbb, 0x89, 0x47, 0x8c, 0x51, 0xb8, 0x9c, 0x23, 0x96, 0x2d, 0x1d, 0xd6, 0x81, 0x9a, 0x7a, + 0x96, 0xbb, 0x54, 0x1d, 0x95, 0x8d, 0x01, 0xd3, 0x09, 0xd5, 0xe9, 0x0c, 0x34, 0x9b, 0xc0, 0x3c, 0xa1, 0xc5, 0x02, 0xc5, 0x03, 0x59, 0xa2, 0x4c, 0x39, 0x14, 0xc1, 0x52, 0x3c, 0xcd, 0x5b, 0x95, + 0x22, 0xc0, 0x9a, 0x1e, 0xc7, 0x74, 0x9f, 0x3e, 0xa8, 0xf7, 0x5f, 0x4d, 0xa3, 0xcf, 0x37, 0xad, 0x8b, 0x42, 0x73, 0x15, 0xa4, 0x1c, 0x65, 0x51, 0xed, 0x5d, 0xd5, 0x39, 0x5d, 0x73, 0x16, 0x79, + 0xa4, 0x5e, 0xfa, 0xab, 0xa7, 0xfd, 0x56, 0x25, 0x2e, 0xe7, 0xa3, 0xcb, 0x73, 0xbe, 0xe6, 0x7b, 0x6e, 0xd2, 0xde, 0x51, 0x12, 0x08, 0x46, 0xdb, 0x96, 0x7b, 0x99, 0x0d, 0x3b, 0x4a, 0xd9, 0xd6, + 0x32, 0x5b, 0xb6, 0x01, 0x60, 0xce, 0x2a, 0x28, 0x28, 0x73, 0x66, 0xea, 0xa4, 0x00, 0xcd, 0xed, 0x20, 0x6a, 0x8c, 0x9e, 0xf2, 0x25, 0xb4, 0xcd, 0x08, 0xfa, 0x40, 0xcc, 0x03, 0x2a, 0xc8, 0xbc, + 0xf9, 0x04, 0x8f, 0x2d, 0x39, 0x9f, 0x63, 0x6b, 0x71, 0xb7, 0x6e, 0x37, 0xa0, 0x8b, 0x14, 0x78, 0xb7, 0xf1, 0x1f, 0x54, 0x6e, 0x6f, 0xbc, 0x63, 0x97, 0x39, 0xe7, 0x06, 0xbd, 0x95, 0x11, 0x8d, + 0x5e, 0x20, 0x9b, 0xde, 0xf3, 0xf0, 0xf6, 0x57, 0x4b, 0x2b, 0xcd, 0x9c, 0x51, 0x6c, 0x24, 0x86, 0x77, 0x49, 0x3e, 0xfb, 0xf8, 0xad, 0x4f, 0x82, 0xae, 0x2f, 0x85, 0xc6, 0x67, 0x70, 0x6a, 0x7b, + 0x64, 0x46, 0x86, 0x75, 0x1c, 0xbd, 0x68, 0x3a, 0x1f, 0x6b, 0x4a, 0x2e, 0xad, 0x58, 0x5e, 0x48, 0x11, 0xbf, 0xe0, 0xab, 0x1c, 0xb7, 0x4b, 0x96, 0xcf, 0x25, 0xcd, 0xe7, 0x63, 0x2d, 0xe2, 0x75, + 0xd3, 0xbe, 0xab, 0x12, 0x97, 0xdf, 0x30, 0x55, 0x67, 0x6f, 0x29, 0xf1, 0xaf, 0xd0, 0xe9, 0x7f, 0x83, 0xd0, 0xe9, 0xbf, 0x62, 0x7a, 0xf7, 0xbc, 0xbe, 0x03, 0xe7, 0xef, 0xdf, 0xbc, 0x2c, 0x7e, + 0x78, 0xe4, 0xd3, 0xda, 0xf8, 0xe1, 0xe2, 0xe0, 0x05, 0x72, 0xd9, 0x6e, 0xb7, 0xc8, 0x6e, 0xcd, 0x70, 0x0b, 0xd8, 0x27, 0x95, 0x43, 0xe9, 0x08, 0x0b, 0x8c, 0xb6, 0xf6, 0xd3, 0x13, 0x1e, 0x6d, + 0x1b, 0x25, 0x15, 0x79, 0xa6, 0xae, 0xf3, 0xf5, 0xe1, 0x90, 0x6e, 0xfd, 0xc6, 0x5d, 0xcc, 0x7c, 0x31, 0x38, 0x48, 0x32, 0x9d, 0xb6, 0xc0, 0x78, 0x16, 0xa1, 0x52, 0xd5, 0x77, 0x2b, 0x38, 0x60, + 0x0a, 0x5c, 0xd5, 0x0f, 0xed, 0xbe, 0x9a, 0xa1, 0xfd, 0x41, 0x0e, 0x7d, 0xeb, 0x4f, 0x16, 0xc8, 0xf7, 0x46, 0xd5, 0x19, 0x35, 0x12, 0xfd, 0xf3, 0xd5, 0xf0, 0xc6, 0xb7, 0xce, 0x57, 0xbe, 0x77, + 0xf7, 0xcb, 0x95, 0x97, 0xb5, 0xf2, 0xe3, 0x37, 0x9f, 0xf7, 0xa9, 0xf3, 0x2f, 0xfa, 0xf9, 0x6f, 0xcf, 0x1d, 0x8e, 0x6f, 0xdd, 0xf1, 0x7b, 0xed, 0x43, 0xee, 0x57, 0x65, 0xdf, 0xf8, 0x1d, 0x9f, + 0x16, 0xfd, 0xfc, 0x75, 0x82, 0xf6, 0x5a, 0x01, 0xf4, 0x5c, 0xfb, 0x33, 0x54, 0xa0, 0xec, 0x10, 0x3e, 0x2c, 0x7d, 0x10, 0x93, 0x39, 0x67, 0x46, 0xf3, 0x26, 0xe2, 0x82, 0x72, 0xa8, 0xb4, 0x42, + 0xcc, 0x4c, 0x0a, 0xab, 0xb5, 0x10, 0x2d, 0x2d, 0x34, 0x49, 0x89, 0xa6, 0xa4, 0xba, 0xde, 0x1e, 0xa2, 0x3d, 0xcc, 0x65, 0xdb, 0x5d, 0x69, 0xea, 0x84, 0x83, 0x1e, 0x0e, 0x76, 0xe6, 0xbb, 0x4a, + 0x8b, 0x50, 0xc6, 0x76, 0xae, 0x6e, 0xd6, 0x35, 0x3b, 0x25, 0x5b, 0x4a, 0x1f, 0x97, 0x1b, 0x8a, 0xf8, 0x13, 0x81, 0xfa, 0xef, 0x2a, 0x28, 0xef, 0xb7, 0xe7, 0x97, 0xf1, 0xff, 0xd7, 0xd6, 0xf7, + 0xaf, 0xad, 0xef, 0xbf, 0xff, 0xd6, 0xf7, 0x7e, 0x22, 0xfd, 0xbd, 0x8b, 0xd1, 0xd5, 0xd3, 0xc0, 0xd1, 0xf5, 0xf9, 0xe0, 0xa5, 0x89, 0x02, 0xb4, 0xfd, 0x8a, 0x65, 0x92, 0x9a, 0xa6, 0x76, 0xd5, + 0x9e, 0xcf, 0xa7, 0xbe, 0xb5, 0xa9, 0x05, 0xc2, 0xae, 0x89, 0xb1, 0xdb, 0xd3, 0x1b, 0xb0, 0xcf, 0x68, 0xd2, 0x1a, 0x7b, 0xc4, 0xc6, 0x6e, 0x89, 0x8c, 0xe5, 0xb1, 0x35, 0xb3, 0x35, 0x9d, 0x05, + 0x4a, 0x3a, 0x2b, 0xc9, 0x3d, 0x2d, 0x7b, 0x9b, 0x5e, 0x1c, 0x98, 0x54, 0xf4, 0xc2, 0x28, 0xed, 0x36, 0x93, 0x09, 0x0a, 0x60, 0x11, 0x78, 0x2a, 0xff, 0xc4, 0x08, 0xfb, 0x83, 0x45, 0xa6, 0x09, + 0xca, 0xa0, 0x4a, 0x8b, 0xd1, 0xd1, 0xe9, 0xdf, 0x7e, 0x69, 0xe8, 0xf0, 0xbd, 0x3c, 0xec, 0xef, 0x1d, 0xb6, 0xcb, 0x86, 0xfe, 0xec, 0x1c, 0x1f, 0x3c, 0x4c, 0xd5, 0xf1, 0xa0, 0x4e, 0x3d, 0x46, + 0xe6, 0xec, 0xc6, 0x2d, 0x49, 0x1e, 0x23, 0x78, 0x23, 0xef, 0xd2, 0x90, 0x63, 0x66, 0x40, 0xbc, 0x54, 0x63, 0xf1, 0x64, 0x9f, 0x88, 0x02, 0xa8, 0x01, 0x75, 0x8c, 0x45, 0x28, 0xcb, 0x1c, 0xb7, + 0xd9, 0xcc, 0x94, 0xe1, 0x55, 0x86, 0x5a, 0xeb, 0x3c, 0x9f, 0xa8, 0x54, 0x23, 0xa8, 0xf4, 0x74, 0x02, 0xbb, 0x41, 0x55, 0x2e, 0xfd, 0x98, 0xe8, 0xd7, 0x50, 0xd3, 0x51, 0xc3, 0x1d, 0x4c, 0x5f, + 0xae, 0xe5, 0xff, 0x2f, 0xf0, 0xec, 0xed, 0x13, 0xaf, 0x83, 0x0b, 0xcf, 0x2e, 0xde, 0xa1, 0xbc, 0x3c, 0x4e, 0x99, 0xa0, 0xe2, 0x41, 0xb3, 0x07, 0x17, 0x1c, 0xe1, 0x91, 0xf4, 0x9e, 0xdf, 0x12, + 0x06, 0x97, 0x4d, 0xda, 0x48, 0x21, 0xed, 0xb4, 0xf4, 0x5d, 0xed, 0x44, 0xda, 0x04, 0x1c, 0x52, 0x44, 0x32, 0x3e, 0xaa, 0xc6, 0xd8, 0x32, 0x16, 0x5a, 0xb3, 0x87, 0x94, 0x66, 0xa6, 0xce, 0x8c, + 0x84, 0x07, 0x67, 0xf9, 0x74, 0x95, 0x4e, 0xd6, 0x4e, 0x43, 0xea, 0x16, 0x18, 0xcb, 0x38, 0xcf, 0xb7, 0xfa, 0x3d, 0x1f, 0xe6, 0x7f, 0x91, 0xc8, 0x7f, 0xb2, 0xa5, 0xbe, 0xf9, 0xe8, 0x53, 0x8c, + 0xf3, 0xa0, 0x1c, 0xbd, 0x34, 0x97, 0xfb, 0xd8, 0x4c, 0xe0, 0x5f, 0x16, 0xec, 0xbf, 0xb6, 0xf1, 0xff, 0xcf, 0x6e, 0xe3, 0xef, 0xe6, 0xd4, 0xdf, 0xbb, 0xb4, 0xbd, 0x7d, 0x18, 0x38, 0xba, 0x3a, + 0x1d, 0xbc, 0xa0, 0x61, 0x69, 0x07, 0x97, 0x61, 0xcc, 0x2e, 0x96, 0x5d, 0x38, 0x63, 0xa6, 0x89, 0x40, 0x57, 0xda, 0x7c, 0xee, 0xcf, 0x0a, 0xbd, 0xe2, 0x26, 0xf0, 0xcc, 0x82, 0xca, 0x69, 0x56, + 0x9f, 0x20, 0x37, 0x77, 0x51, 0x09, 0xf0, 0xd0, 0xd5, 0x9c, 0xed, 0xb7, 0x5d, 0x67, 0xce, 0x21, 0xdc, 0xec, 0x5b, 0x68, 0xae, 0x94, 0x52, 0x92, 0x98, 0x39, 0x86, 0x59, 0x5c, 0xd0, 0x2c, 0x08, + 0xae, 0x84, 0x41, 0xa8, 0x7c, 0x0f, 0x91, 0xf8, 0xb7, 0x2c, 0x68, 0xcf, 0x56, 0xdf, 0xfb, 0x45, 0xec, 0x33, 0xe3, 0xcf, 0x30, 0xcd, 0xc2, 0x69, 0xee, 0x86, 0x7f, 0x1e, 0x41, 0x24, 0xb8, 0x90, + 0x04, 0x47, 0xcf, 0x07, 0xe7, 0x82, 0xab, 0x01, 0x8e, 0xfb, 0x24, 0x71, 0x28, 0x70, 0x19, 0xc8, 0xa0, 0x7f, 0x5a, 0xfa, 0x7b, 0x3c, 0xb3, 0x99, 0xc4, 0x9c, 0x56, 0x27, 0x82, 0x09, 0xa5, 0x2d, + 0x57, 0xec, 0x21, 0x48, 0x02, 0x4f, 0x8d, 0xb4, 0x89, 0xc7, 0x99, 0x38, 0x3f, 0x46, 0x78, 0x57, 0xb3, 0x05, 0x9b, 0xe8, 0x09, 0xb8, 0xab, 0xb6, 0xeb, 0xb5, 0xbb, 0xae, 0x26, 0xee, 0x81, 0x02, + 0x61, 0xa5, 0x72, 0xfc, 0x63, 0x79, 0x52, 0xa9, 0xdc, 0xda, 0x06, 0x01, 0x34, 0x64, 0x4b, 0x36, 0xcc, 0xb4, 0x38, 0xa3, 0xe9, 0x57, 0x45, 0x1a, 0x7d, 0x96, 0x01, 0xfc, 0x48, 0xf8, 0xf4, 0x3d, + 0xf1, 0x33, 0x5b, 0xae, 0x2f, 0xdd, 0xa8, 0xe2, 0xba, 0xc9, 0x20, 0x9f, 0x8c, 0x64, 0xb2, 0x32, 0xac, 0xc3, 0x3e, 0x51, 0xd0, 0x66, 0x2d, 0x6f, 0xbd, 0xc0, 0x0c, 0x81, 0x4a, 0x64, 0x16, 0xcb, + 0x31, 0x08, 0x44, 0x10, 0x3e, 0xa9, 0x11, 0xc9, 0x2a, 0x82, 0x06, 0x64, 0x63, 0xa7, 0x82, 0x1c, 0x23, 0xc4, 0xb6, 0xad, 0xb6, 0xc0, 0xe0, 0x52, 0xa4, 0xda, 0x64, 0xc1, 0x04, 0x72, 0x39, 0x0b, + 0x61, 0x2a, 0x87, 0xec, 0xe2, 0x64, 0x6b, 0xb6, 0x33, 0x59, 0x54, 0xed, 0x35, 0x6a, 0xe1, 0x6d, 0x19, 0x74, 0x1a, 0x27, 0xa9, 0x46, 0x95, 0x51, 0x78, 0x4e, 0x35, 0x2a, 0xfd, 0x4b, 0x8f, 0xd0, + 0x67, 0x97, 0xc3, 0x1d, 0x99, 0x2a, 0xab, 0xc2, 0xb0, 0xaa, 0x51, 0x94, 0x7a, 0xde, 0x35, 0x44, 0xcf, 0xfb, 0x24, 0x9d, 0x47, 0xa4, 0xeb, 0x9a, 0xf8, 0x99, 0xa1, 0xd7, 0x97, 0xce, 0xd9, 0x3a, + 0x03, 0x24, 0x0e, 0x99, 0x86, 0xca, 0xf6, 0xd0, 0x6d, 0xa5, 0xc6, 0x77, 0xc4, 0x86, 0x35, 0xa7, 0x65, 0x34, 0xdf, 0xec, 0x45, 0xf5, 0x58, 0x00, 0x9b, 0x50, 0xaa, 0xc4, 0xa4, 0xe0, 0x25, 0x14, + 0x75, 0x81, 0xdd, 0x52, 0xe3, 0x4f, 0xce, 0x49, 0xce, 0x0e, 0x56, 0xbe, 0xf3, 0x88, 0xd0, 0x40, 0x79, 0xcc, 0x9e, 0xea, 0xf1, 0xe9, 0xe4, 0xb5, 0x5b, 0xc0, 0x80, 0x10, 0x2a, 0x54, 0xba, 0xb1, + 0x44, 0x07, 0xe8, 0xaa, 0x0e, 0x3e, 0xa4, 0x2f, 0x1a, 0x56, 0x5a, 0xdc, 0x0b, 0x65, 0x10, 0x0f, 0x05, 0xd0, 0xce, 0x14, 0x9f, 0xde, 0xfb, 0xe9, 0xff, 0x88, 0x18, 0x16, 0x17, 0x4b, 0xe4, 0x3e, + 0x83, 0x52, 0x18, 0x8c, 0xd7, 0xb6, 0xb9, 0x15, 0x61, 0x49, 0xc4, 0x8f, 0x8b, 0x63, 0xbb, 0x29, 0x62, 0xef, 0x00, 0x09, 0x5b, 0x30, 0xa4, 0xe9, 0x6c, 0x1d, 0xb4, 0xa6, 0x1a, 0xb2, 0xa9, 0xb2, + 0xc6, 0xec, 0x68, 0xea, 0xe7, 0xab, 0x2a, 0x95, 0x6b, 0x3a, 0x99, 0x89, 0xdc, 0xc9, 0xdb, 0xee, 0x5a, 0x0f, 0x3a, 0x68, 0x01, 0x9d, 0xca, 0x3d, 0xbe, 0xe9, 0x04, 0xc7, 0x94, 0x77, 0x3e, 0x39, + 0x24, 0xd2, 0x7c, 0xf9, 0x95, 0x61, 0xd9, 0xdd, 0xe1, 0xc1, 0xf8, 0x4a, 0x03, 0xf9, 0x16, 0x0f, 0x9e, 0xa8, 0xbe, 0xf2, 0x21, 0x2c, 0xbb, 0xd1, 0xf8, 0x83, 0x16, 0x72, 0x93, 0x17, 0x1c, 0x24, + 0x55, 0x31, 0x88, 0x11, 0x22, 0xe7, 0xca, 0x4a, 0xb6, 0x96, 0x91, 0x15, 0x98, 0x2e, 0xd7, 0x20, 0x2a, 0xef, 0x03, 0x0e, 0x9f, 0xb7, 0x1a, 0xe0, 0xac, 0xcc, 0x25, 0xef, 0x97, 0x76, 0xe7, 0x23, + 0xda, 0x96, 0xb7, 0x23, 0x00, 0x85, 0x52, 0xd2, 0x60, 0xed, 0xad, 0x19, 0x8f, 0x57, 0xa6, 0xeb, 0x66, 0xf3, 0xf9, 0xc4, 0x03, 0x3d, 0xe0, 0x14, 0xc0, 0x33, 0x20, 0x6c, 0x56, 0xbe, 0x31, 0xfe, + 0x56, 0x0e, 0xc8, 0xbb, 0xf9, 0x72, 0xb7, 0x3b, 0xfb, 0xb9, 0xca, 0xed, 0xfb, 0x09, 0x5b, 0xbf, 0x13, 0xdc, 0x2f, 0x04, 0xbe, 0xe6, 0x48, 0x88, 0xba, 0x3b, 0xde, 0x6b, 0xb6, 0xe9, 0x18, 0x21, + 0x8c, 0xa4, 0xdf, 0xf7, 0x2b, 0x91, 0xdd, 0xee, 0x57, 0x26, 0x0b, 0x34, 0x49, 0x22, 0xef, 0x9b, 0x19, 0x14, 0x8f, 0xe3, 0xf8, 0x68, 0xc1, 0x5b, 0x0e, 0x48, 0xba, 0x49, 0x96, 0x1d, 0x69, 0x5e, + 0x58, 0xf2, 0x90, 0x71, 0xc0, 0x6c, 0x33, 0xda, 0xd1, 0xeb, 0x94, 0xdd, 0xf8, 0x7e, 0x0c, 0x1c, 0x4f, 0x33, 0xec, 0xa0, 0xf6, 0xc7, 0x69, 0x2a, 0x78, 0xd8, 0x77, 0x38, 0xf2, 0x7b, 0xb9, 0x19, + 0x92, 0xe7, 0x7e, 0x95, 0xbe, 0x79, 0xc6, 0x42, 0xbb, 0xce, 0xe2, 0xbc, 0x01, 0x84, 0x70, 0x27, 0x27, 0xfe, 0xba, 0xa6, 0xf2, 0xb3, 0x16, 0xed, 0xef, 0x87, 0xec, 0x4d, 0xe9, 0xc3, 0xed, 0xd5, + 0xed, 0xa1, 0xbd, 0xf3, 0x37, 0xdd, 0xe7, 0x11, 0x7c, 0x3e, 0x3b, 0xab, 0x84, 0x03, 0x44, 0x5b, 0xeb, 0x20, 0xae, 0x1b, 0x23, 0x7e, 0x37, 0x23, 0x68, 0x98, 0xf4, 0x8f, 0xc2, 0xcc, 0xf3, 0xf6, + 0xd1, 0x2c, 0x70, 0x73, 0xed, 0x50, 0xed, 0x0d, 0xc5, 0x4b, 0xeb, 0x55, 0x5a, 0x00, 0x9a, 0x60, 0x4b, 0x89, 0xdc, 0xcf, 0x38, 0x18, 0x6d, 0xbc, 0x99, 0xd6, 0xef, 0xd6, 0x75, 0x46, 0x6c, 0x52, + 0xc7, 0x49, 0x79, 0xa1, 0x2c, 0xb0, 0xa3, 0x3b, 0xf6, 0x71, 0x5b, 0xd4, 0x60, 0x78, 0x09, 0x8f, 0x05, 0x75, 0x40, 0x3e, 0xed, 0xef, 0x2a, 0x91, 0xbf, 0xba, 0xca, 0x03, 0x7e, 0xb0, 0x20, 0xe0, + 0xaa, 0xca, 0xe3, 0x7d, 0x0f, 0x99, 0x1f, 0xf7, 0xf8, 0xd7, 0xb2, 0x5e, 0x56, 0xd8, 0x74, 0x23, 0x18, 0x11, 0x0d, 0x4d, 0x4f, 0x95, 0xde, 0x04, 0x15, 0x83, 0xf8, 0x34, 0x84, 0xed, 0x5d, 0x77, + 0xd2, 0x54, 0xa5, 0x9a, 0x50, 0xe8, 0xca, 0x64, 0xf5, 0x3d, 0x3f, 0xa9, 0x68, 0x55, 0xc4, 0x3a, 0x1b, 0x26, 0x62, 0x9a, 0x3e, 0xc8, 0x9d, 0x2a, 0x2e, 0xab, 0x60, 0xda, 0x1e, 0x9a, 0xd5, 0xc6, + 0xd2, 0x52, 0x72, 0xbd, 0x6c, 0x64, 0x41, 0x26, 0xe0, 0xc2, 0xce, 0xbe, 0x51, 0x49, 0x3f, 0x44, 0xfa, 0x7f, 0x7c, 0x2a, 0xd1, 0xff, 0xaa, 0xf2, 0xf8, 0x9f, 0x53, 0xe5, 0x71, 0xc6, 0xbb, 0x38, + 0x17, 0xbb, 0xdf, 0xb7, 0x8c, 0x1e, 0x5a, 0x46, 0x7e, 0xd3, 0x7d, 0x01, 0x56, 0xb9, 0x9c, 0x8d, 0xb0, 0x61, 0xcb, 0xc8, 0x2a, 0xd5, 0x21, 0x23, 0x63, 0xcd, 0x85, 0xa1, 0xae, 0xa6, 0xeb, 0x08, + 0xef, 0xe7, 0x40, 0x86, 0xaf, 0x26, 0xf3, 0xfd, 0x01, 0xc7, 0x71, 0xd0, 0xf7, 0x69, 0x96, 0x5b, 0x8f, 0x2b, 0x4a, 0x9e, 0x87, 0xe6, 0x4a, 0xe6, 0x54, 0x15, 0xf4, 0x48, 0x61, 0x6d, 0xce, 0x19, + 0xb3, 0x71, 0x0b, 0x8f, 0xd3, 0x9b, 0x25, 0x2c, 0x67, 0x87, 0x2c, 0x92, 0xc4, 0xa4, 0x5d, 0xa6, 0x14, 0x15, 0xe9, 0xe0, 0x64, 0x12, 0x0f, 0xd2, 0x16, 0x9e, 0x7e, 0xeb, 0x05, 0xe1, 0xe3, 0x3e, + 0x4b, 0x1e, 0x81, 0x09, 0x7f, 0x4b, 0xf8, 0x85, 0x27, 0xcf, 0xa7, 0x67, 0xe7, 0xc5, 0x80, 0x44, 0x2c, 0x8f, 0xd3, 0xc3, 0xf1, 0x84, 0x2f, 0x38, 0x4d, 0xe6, 0xcb, 0x3d, 0x4b, 0x85, 0xd1, 0x56, + 0x89, 0x15, 0xb0, 0xe3, 0xa2, 0xba, 0x5b, 0xec, 0x80, 0x03, 0x25, 0xcf, 0xda, 0xf5, 0xd2, 0xa3, 0x5d, 0x01, 0x06, 0xeb, 0x56, 0x12, 0xe8, 0xfa, 0xb4, 0xdb, 0x25, 0xfe, 0x38, 0x6e, 0xb7, 0x36, + 0x20, 0xd6, 0xd3, 0x83, 0xd5, 0x6e, 0x96, 0x82, 0x99, 0x97, 0xe5, 0x5a, 0x53, 0x62, 0x38, 0x9a, 0x8d, 0x61, 0xd9, 0x78, 0xac, 0x0c, 0xbe, 0x7a, 0x57, 0x4a, 0x8b, 0xc0, 0xb7, 0x20, 0x5b, 0x3f, + 0xe9, 0x4f, 0x75, 0xa3, 0xe7, 0xcf, 0x8f, 0x77, 0x7c, 0x7e, 0xa6, 0xfa, 0xc8, 0x34, 0xad, 0xee, 0x34, 0xff, 0x41, 0x06, 0x41, 0x6f, 0x9c, 0x1d, 0xb4, 0x50, 0x71, 0x9a, 0xe6, 0x24, 0x11, 0xa3, + 0xee, 0xce, 0xb2, 0xeb, 0x05, 0xa3, 0xce, 0x7d, 0x2e, 0xee, 0x7b, 0x1d, 0xa0, 0x9c, 0x14, 0xd7, 0xe4, 0xf0, 0xd0, 0xb8, 0x63, 0x78, 0x66, 0x80, 0x02, 0x24, 0x13, 0xc0, 0x16, 0x25, 0xb0, 0x55, + 0x06, 0x1b, 0x6a, 0xd0, 0xab, 0x11, 0xc4, 0x72, 0x5d, 0x46, 0x0a, 0xa0, 0x38, 0xdb, 0xee, 0x16, 0x1b, 0xa6, 0x89, 0x8f, 0xbd, 0xe4, 0x35, 0x3a, 0xa0, 0xff, 0x81, 0x5b, 0xe3, 0x2c, 0x2e, 0xe7, + 0x24, 0x94, 0xbb, 0x5a, 0xec, 0x43, 0xc6, 0xcc, 0x2b, 0xd9, 0x17, 0x91, 0xbc, 0xf4, 0xc5, 0x1e, 0xd8, 0x11, 0x3b, 0xaf, 0x57, 0xb2, 0x1e, 0x6d, 0x37, 0x2a, 0xcb, 0x23, 0xfc, 0x82, 0xda, 0xa8, + 0x7a, 0x4a, 0xee, 0xda, 0x72, 0x8f, 0x95, 0xa9, 0x91, 0xf8, 0x5e, 0x8a, 0xf3, 0xeb, 0x4d, 0x4c, 0x62, 0x33, 0x98, 0x9f, 0x5a, 0x33, 0xb2, 0x44, 0x45, 0xa8, 0xcd, 0xec, 0x40, 0x39, 0xf5, 0x0a, + 0x75, 0x02, 0x0f, 0x87, 0x95, 0x10, 0x09, 0x5a, 0x83, 0x12, 0xb9, 0x28, 0x9a, 0x54, 0x66, 0xaf, 0x22, 0x41, 0x9d, 0x71, 0xf3, 0x41, 0x26, 0xf3, 0x4d, 0x60, 0xa8, 0xf7, 0x93, 0xf4, 0x01, 0x6b, + 0xf9, 0x2e, 0x20, 0xd4, 0xc0, 0x72, 0xa2, 0x93, 0x39, 0xa5, 0x0a, 0x7a, 0x35, 0xd9, 0xc2, 0x85, 0x19, 0x06, 0x3b, 0xc6, 0x44, 0xfc, 0x9c, 0x9b, 0x2f, 0xd6, 0x7b, 0xbe, 0xf3, 0xaa, 0x23, 0xb9, + 0x56, 0x95, 0xee, 0x80, 0x2e, 0x0f, 0x2d, 0x83, 0xce, 0xf1, 0x75, 0xd5, 0x99, 0xfa, 0x41, 0xa6, 0x93, 0x64, 0x13, 0xc0, 0xfc, 0xb1, 0x03, 0x96, 0x4c, 0xea, 0xdb, 0x52, 0x34, 0xcf, 0x10, 0x04, + 0x69, 0x77, 0x13, 0x7e, 0xe9, 0x3b, 0x87, 0x95, 0xbc, 0x99, 0x3d, 0xa6, 0xc7, 0x7e, 0xc4, 0x85, 0xba, 0x18, 0xbc, 0x77, 0xe4, 0xab, 0x7f, 0x81, 0x82, 0xb8, 0xed, 0x7b, 0x80, 0x1f, 0x5a, 0xf2, + 0x2e, 0x44, 0xcf, 0xac, 0xbc, 0x1c, 0x9e, 0xab, 0xb5, 0x07, 0x2c, 0x75, 0x12, 0x86, 0x3a, 0x92, 0x2b, 0x4e, 0x96, 0x75, 0x76, 0xf4, 0xea, 0x85, 0xda, 0x5b, 0x85, 0x85, 0xe5, 0x2b, 0xea, 0x78, + 0x22, 0x0f, 0x41, 0x2d, 0xaa, 0x41, 0x68, 0xcc, 0xb6, 0xad, 0x4e, 0x6c, 0x17, 0x15, 0xb4, 0x07, 0xd9, 0x35, 0x47, 0x34, 0x90, 0x61, 0x90, 0xc5, 0x9e, 0x84, 0xf1, 0x4e, 0x0b, 0x0f, 0x44, 0xb1, + 0xb2, 0x27, 0x63, 0xdd, 0x16, 0xac, 0x6c, 0x37, 0xdf, 0x72, 0x42, 0x0e, 0x28, 0x8d, 0xf6, 0x18, 0x1f, 0xdf, 0xa6, 0x83, 0x56, 0xbf, 0xb1, 0x32, 0xae, 0xd4, 0xfb, 0x2c, 0xb0, 0xd2, 0xdf, 0x50, + 0x1a, 0x97, 0xea, 0x9f, 0xdb, 0x7c, 0x2e, 0x2c, 0xbf, 0xbf, 0xeb, 0xed, 0x7a, 0xc8, 0xc1, 0xf3, 0x44, 0xf1, 0x89, 0xc3, 0x4f, 0xff, 0x87, 0xa6, 0xc5, 0xeb, 0x1e, 0x40, 0x29, 0x2d, 0xed, 0x81, + 0x50, 0x86, 0x22, 0x95, 0xc3, 0xd9, 0xac, 0x20, 0x6d, 0xa5, 0x64, 0xa7, 0x73, 0x0c, 0xd4, 0xa2, 0x8c, 0xbb, 0x48, 0xe6, 0x5b, 0x37, 0xb0, 0xd2, 0x53, 0x39, 0xf1, 0xca, 0x26, 0x47, 0x74, 0x27, + 0x91, 0x56, 0x39, 0x28, 0xec, 0xb3, 0xd3, 0x49, 0x06, 0x1b, 0xf2, 0x54, 0x88, 0xfd, 0x2a, 0xc1, 0x99, 0x12, 0xa5, 0x76, 0x13, 0x6c, 0xb5, 0x64, 0xda, 0xb9, 0x9b, 0x7f, 0x48, 0x52, 0xbd, 0x74, + 0x3e, 0xbe, 0xa7, 0x55, 0xa0, 0x0f, 0xbc, 0xea, 0xd9, 0xdb, 0x52, 0x78, 0x67, 0x2d, 0x02, 0xfd, 0xfa, 0x35, 0xc7, 0xe4, 0x86, 0x92, 0x99, 0x9c, 0x85, 0xf4, 0x0e, 0x21, 0xf6, 0xad, 0xb4, 0xa9, + 0x28, 0x77, 0xd5, 0x05, 0x4d, 0xb8, 0x8f, 0x30, 0x14, 0xd9, 0xd3, 0xad, 0xcb, 0x08, 0xee, 0x01, 0x20, 0x60, 0x65, 0x92, 0xab, 0xc5, 0xc1, 0x71, 0x09, 0xbe, 0xe0, 0xe4, 0x03, 0xca, 0x2f, 0x78, + 0xb1, 0xa5, 0x37, 0xd8, 0x9c, 0x5f, 0x4f, 0xb3, 0x48, 0x1a, 0xa3, 0xe8, 0xa1, 0x23, 0xa9, 0xf1, 0xc6, 0x11, 0xe9, 0x45, 0x33, 0x48, 0x8b, 0x28, 0xbc, 0x97, 0x86, 0x04, 0xf7, 0x46, 0x1a, 0x7e, + 0x64, 0xa8, 0x2f, 0x54, 0x2f, 0x4c, 0x38, 0x1f, 0x5e, 0xda, 0xe4, 0x0f, 0x18, 0xf1, 0x74, 0xac, 0xa4, 0x3d, 0x5e, 0xad, 0x59, 0x6c, 0xc3, 0x83, 0xff, 0x0f, 0x7b, 0x6f, 0xd6, 0xa4, 0x2c, 0xb7, + 0xec, 0x0f, 0xde, 0xff, 0x3f, 0xc5, 0x1b, 0xef, 0xad, 0x7f, 0x1f, 0x99, 0xc1, 0x13, 0xdd, 0x1d, 0x07, 0x04, 0x45, 0x11, 0x91, 0x41, 0x04, 0x2e, 0x3a, 0x82, 0x79, 0x90, 0x49, 0x66, 0x88, 0xe8, + 0xfd, 0xd9, 0x3b, 0x4a, 0x6b, 0xb2, 0x4a, 0xeb, 0xe1, 0x71, 0xbf, 0x1d, 0x1d, 0x71, 0x62, 0x5f, 0x15, 0x53, 0xa5, 0xac, 0x1f, 0xb9, 0x72, 0x65, 0xe6, 0xca, 0x61, 0x29, 0x9c, 0x16, 0xe4, 0x0e, + 0x93, 0x86, 0x28, 0x34, 0x4f, 0x86, 0x0c, 0xa1, 0xd2, 0x56, 0x5f, 0x16, 0x36, 0x5f, 0x55, 0x9b, 0xb3, 0xe5, 0x38, 0x04, 0x75, 0x2c, 0x52, 0x72, 0xe2, 0xad, 0x06, 0x14, 0x0f, 0x77, 0xe8, 0xde, + 0x02, 0xb0, 0xbc, 0xa1, 0x56, 0x4d, 0x8c, 0xfa, 0x22, 0x40, 0x21, 0x84, 0xb3, 0x89, 0xcb, 0x58, 0x6b, 0x32, 0xe5, 0xb9, 0x09, 0x55, 0xe6, 0x45, 0x98, 0x56, 0xde, 0xab, 0x8a, 0xff, 0x2f, 0xf0, + 0xa6, 0xbb, 0xd6, 0x17, 0x18, 0x0b, 0xb3, 0x9f, 0xd6, 0xe9, 0x15, 0xb6, 0x47, 0x56, 0xee, 0x33, 0x40, 0xbe, 0xd3, 0xbd, 0x60, 0xf9, 0x7e, 0x76, 0xb1, 0x72, 0x47, 0xa0, 0xc9, 0xae, 0xfa, 0x2e, + 0x13, 0x14, 0xfd, 0xd0, 0x2f, 0x78, 0xac, 0xac, 0x0e, 0x2e, 0xc6, 0x6c, 0xfc, 0xd4, 0x41, 0x98, 0xcc, 0x6d, 0xc9, 0x35, 0x3e, 0xf0, 0x8e, 0x77, 0x16, 0x26, 0xa7, 0x55, 0x94, 0xc6, 0x46, 0x42, + 0xd1, 0xc3, 0xcc, 0x96, 0xd0, 0xdc, 0x23, 0x8a, 0x99, 0x2d, 0x21, 0xc7, 0x33, 0x06, 0x94, 0xdb, 0x59, 0x0e, 0xac, 0x4f, 0x76, 0x74, 0x60, 0x98, 0x7d, 0x2b, 0xc3, 0xab, 0x65, 0xb1, 0xee, 0x1f, + 0x04, 0x00, 0x7d, 0x45, 0xe4, 0xea, 0x63, 0x78, 0xc8, 0x56, 0xcf, 0x80, 0x11, 0x7a, 0x57, 0x09, 0xf2, 0x72, 0x70, 0xe5, 0xa8, 0xdf, 0x43, 0x00, 0x2f, 0xf4, 0xc1, 0xed, 0xe6, 0xfc, 0x7c, 0xb9, + 0x12, 0xa3, 0xc5, 0x8a, 0x5f, 0xf5, 0x21, 0x36, 0x83, 0x41, 0x9b, 0x58, 0x6d, 0x2c, 0xdf, 0x02, 0xce, 0xab, 0xbe, 0xe8, 0x50, 0xf6, 0xd8, 0xed, 0x1d, 0xc0, 0x5c, 0xb4, 0x01, 0x62, 0x53, 0x90, + 0x1e, 0xf1, 0x16, 0xa4, 0x79, 0xf3, 0x43, 0x9d, 0x65, 0x7e, 0xc1, 0x17, 0xb1, 0x30, 0xb7, 0x95, 0x73, 0x4a, 0xa1, 0xc5, 0x1a, 0x5d, 0xb1, 0x86, 0x62, 0x1f, 0x46, 0xcd, 0xad, 0xf2, 0x61, 0xa5, + 0x5d, 0xe8, 0xa6, 0x44, 0xd2, 0x68, 0x00, 0xca, 0x4b, 0x51, 0xdd, 0x97, 0x3f, 0x17, 0xcf, 0xed, 0x08, 0x77, 0x15, 0x25, 0xb3, 0x47, 0x9f, 0x96, 0xc9, 0x90, 0x2b, 0x51, 0x20, 0x83, 0x24, 0x97, + 0xc8, 0xf3, 0x26, 0x87, 0x4b, 0x57, 0x65, 0x35, 0x59, 0xe2, 0x11, 0xc4, 0x76, 0xe4, 0x52, 0x99, 0x2f, 0xbd, 0x1d, 0x73, 0x38, 0x18, 0x5b, 0x61, 0x75, 0x54, 0x17, 0x65, 0x78, 0x34, 0xa5, 0xfd, + 0x91, 0x07, 0x8d, 0x34, 0x9d, 0x24, 0x67, 0x03, 0x14, 0x3c, 0xd5, 0x80, 0x07, 0x98, 0x3e, 0x32, 0x83, 0x9c, 0xe3, 0x81, 0x34, 0x6e, 0xf0, 0x55, 0x71, 0x09, 0x68, 0x7e, 0xac, 0x09, 0x42, 0xcf, + 0x2d, 0x23, 0x9f, 0x08, 0x5f, 0xc0, 0xf8, 0x38, 0xbd, 0x80, 0x32, 0x62, 0x52, 0x18, 0x78, 0xc5, 0xb7, 0x60, 0x5f, 0x29, 0x5a, 0x85, 0x46, 0x67, 0xde, 0x16, 0xf6, 0x13, 0x41, 0xac, 0xdc, 0x03, + 0xa8, 0xd6, 0x3b, 0x6e, 0xae, 0x03, 0x50, 0x5d, 0x6f, 0x2a, 0x4e, 0x04, 0xe5, 0x06, 0x9b, 0x47, 0x9a, 0xc8, 0x71, 0x3e, 0x6a, 0x87, 0xd6, 0xb6, 0x5d, 0x6d, 0xb2, 0x96, 0xe8, 0x07, 0x63, 0x3f, + 0x71, 0x49, 0x1b, 0x24, 0x98, 0x64, 0xbb, 0xda, 0x9b, 0x31, 0x60, 0xe5, 0x30, 0x56, 0x34, 0xa3, 0xb4, 0xc1, 0xb2, 0x4f, 0xed, 0x53, 0xf8, 0xb8, 0x7f, 0xe8, 0x33, 0x7b, 0x7b, 0x6f, 0x44, 0x2f, + 0x60, 0x5c, 0x0f, 0xc7, 0xb6, 0x6e, 0x15, 0xdc, 0x70, 0x2e, 0xb0, 0x48, 0x25, 0x05, 0x80, 0x7e, 0x3e, 0xc0, 0xab, 0x2e, 0xd0, 0xf0, 0xb9, 0xc3, 0xcf, 0x92, 0x56, 0xf5, 0x1b, 0xcb, 0xd8, 0x98, + 0xf2, 0xce, 0x94, 0x4e, 0x13, 0xab, 0x0c, 0x4e, 0x11, 0x20, 0xa3, 0xb6, 0xc7, 0xda, 0xbe, 0x6e, 0x9e, 0x0a, 0x97, 0x8a, 0x0a, 0xb6, 0x35, 0x2b, 0x8d, 0xb3, 0x86, 0xc9, 0x3a, 0x5b, 0x3b, 0xfa, + 0xb6, 0x2b, 0xb8, 0x30, 0x81, 0xf8, 0xe8, 0x38, 0x6e, 0x27, 0xa9, 0xca, 0x92, 0xd0, 0x9e, 0x96, 0xb1, 0xeb, 0x3e, 0x2e, 0x46, 0xfd, 0x14, 0x77, 0x7c, 0x22, 0xfc, 0x02, 0xc8, 0xa7, 0xd3, 0xb1, + 0x2a, 0xc7, 0x69, 0x27, 0x44, 0xf4, 0x99, 0x0c, 0xf0, 0xbc, 0x03, 0xb4, 0xe3, 0x6e, 0x3d, 0x41, 0x44, 0x6b, 0xc8, 0x42, 0x69, 0x96, 0x2a, 0x27, 0x96, 0x3c, 0xee, 0x6a, 0x07, 0xaa, 0x9b, 0x74, + 0x73, 0xae, 0x69, 0x70, 0xd6, 0xa1, 0x26, 0xce, 0x88, 0x06, 0xbf, 0x51, 0x00, 0xd2, 0x1e, 0xce, 0x1c, 0x20, 0xa6, 0x18, 0x9e, 0xe9, 0x33, 0x45, 0x11, 0xc1, 0xad, 0x75, 0xe0, 0xcc, 0xc8, 0xc8, + 0x73, 0x78, 0x3d, 0xaf, 0xbe, 0xd5, 0xf7, 0x7d, 0xd8, 0x9c, 0xe2, 0x11, 0x16, 0x7f, 0x5e, 0xe4, 0xf7, 0xfe, 0x4f, 0xbc, 0xa0, 0x72, 0xf7, 0xc6, 0x05, 0x9f, 0x11, 0x65, 0x7f, 0x69, 0x9e, 0x06, + 0xb8, 0x70, 0x87, 0x60, 0x6e, 0x98, 0xbb, 0x43, 0x28, 0x2b, 0xe0, 0x76, 0xbf, 0x9f, 0xc9, 0x8a, 0x47, 0x1f, 0x80, 0xb2, 0xf6, 0xd6, 0xb2, 0x96, 0x44, 0xb2, 0xdf, 0xa8, 0x65, 0x76, 0x80, 0xaa, + 0x73, 0x67, 0x57, 0xa2, 0x4b, 0xca, 0x6e, 0x74, 0xb4, 0xbd, 0x5d, 0xd5, 0xe9, 0xdc, 0x99, 0x51, 0x78, 0xf0, 0xd0, 0x89, 0x44, 0x99, 0x43, 0x42, 0x21, 0x53, 0xc7, 0x9c, 0xd5, 0xb1, 0xf2, 0xbb, + 0x4a, 0xd6, 0x34, 0x61, 0xf6, 0x00, 0x0e, 0xe2, 0xa6, 0x7c, 0xdc, 0x78, 0x38, 0x9a, 0x30, 0xbb, 0x8c, 0xbe, 0x09, 0xb3, 0x29, 0xf1, 0xad, 0x6e, 0xee, 0xdd, 0xc1, 0x2a, 0x64, 0xcc, 0xeb, 0x8d, + 0x50, 0xb7, 0xab, 0x7e, 0xcb, 0xc1, 0x7b, 0x8f, 0xb2, 0xd0, 0x23, 0x47, 0x69, 0x46, 0xa2, 0x0d, 0x90, 0xa7, 0x2e, 0xfc, 0x06, 0x82, 0x1d, 0x6c, 0x30, 0x96, 0x4e, 0xec, 0xce, 0xce, 0xb0, 0xbf, + 0x8f, 0x92, 0x8e, 0x32, 0xdd, 0x7a, 0x01, 0xe4, 0x3a, 0x40, 0x0f, 0x25, 0xba, 0x3f, 0xf2, 0xb2, 0xef, 0x9d, 0xcf, 0x8c, 0x71, 0x2a, 0x7a, 0x17, 0x9c, 0xaf, 0x62, 0x5a, 0xf1, 0x47, 0xd4, 0x38, + 0x7e, 0x53, 0xbf, 0xef, 0xb4, 0x0b, 0xf9, 0x1c, 0x57, 0xf3, 0xe5, 0xd6, 0x6d, 0x2a, 0xf6, 0x3f, 0x1e, 0xfe, 0xf2, 0x39, 0xed, 0x7b, 0x3c, 0xee, 0xdf, 0xc3, 0x5f, 0x90, 0x71, 0x9e, 0x8d, 0xbd, + 0x74, 0x5c, 0xb2, 0xb5, 0x7c, 0x80, 0x5d, 0xba, 0x12, 0x37, 0xfb, 0x26, 0xdd, 0xe9, 0xf8, 0xc6, 0x3e, 0xb9, 0x15, 0x18, 0x01, 0x15, 0x2a, 0xd4, 0x42, 0xb9, 0x1c, 0xf6, 0xfb, 0xa1, 0x74, 0x4f, + 0x34, 0x0a, 0x19, 0x31, 0x71, 0x3e, 0x78, 0xcb, 0xf5, 0x9e, 0x09, 0xcb, 0x56, 0x3b, 0xaf, 0x1b, 0xf6, 0xb8, 0x52, 0x59, 0xc1, 0xd7, 0x26, 0xf8, 0x6a, 0xd6, 0x2c, 0x76, 0xbb, 0xc0, 0x0d, 0xda, + 0xce, 0x3b, 0xfd, 0x41, 0x8d, 0xdd, 0xff, 0xc4, 0xb9, 0xdc, 0xc6, 0xb9, 0x7c, 0x8c, 0xfb, 0x7f, 0x7d, 0xfe, 0xfb, 0x36, 0x63, 0x2d, 0x33, 0x36, 0x53, 0xdb, 0x75, 0xa6, 0x3f, 0xd9, 0xe7, 0xcf, + 0x75, 0x83, 0xb9, 0x25, 0x3d, 0x9b, 0x7e, 0xb9, 0x30, 0xa6, 0x3b, 0xcc, 0x45, 0x13, 0xcc, 0x64, 0xf7, 0x20, 0x00, 0x0a, 0xaf, 0x62, 0x78, 0xb0, 0x03, 0xc9, 0xc4, 0xd2, 0x4a, 0x0e, 0xe9, 0xcd, + 0xf3, 0x01, 0xaf, 0xa2, 0x90, 0x8d, 0xad, 0x4e, 0xa2, 0x0d, 0x21, 0x67, 0x01, 0xee, 0x38, 0x9f, 0x2c, 0x5c, 0x0d, 0xb1, 0x24, 0xd2, 0xd4, 0x00, 0x32, 0xed, 0x2a, 0xa0, 0xea, 0x20, 0xbe, 0xc8, + 0xa5, 0xfc, 0xd8, 0x8a, 0xe6, 0xbe, 0x5d, 0xc7, 0x6b, 0x99, 0xd9, 0x04, 0xfa, 0x01, 0xdd, 0x8f, 0x51, 0x86, 0x2d, 0xb3, 0x74, 0x31, 0xe4, 0x71, 0x5f, 0x53, 0xf0, 0x17, 0xfa, 0x84, 0x40, 0x7b, + 0xa7, 0x7a, 0x01, 0xe4, 0xf5, 0x78, 0x7a, 0xa1, 0xf5, 0x7b, 0x2c, 0x48, 0x2e, 0x37, 0xf5, 0x98, 0x4d, 0x89, 0x0a, 0x91, 0x55, 0x4b, 0x60, 0x17, 0xfd, 0xc4, 0x42, 0x27, 0x1c, 0xe7, 0x37, 0x12, + 0xd2, 0x14, 0x25, 0x4d, 0x34, 0x56, 0x53, 0x58, 0xa1, 0xb8, 0xc9, 0x4b, 0xdc, 0xe3, 0x68, 0xe5, 0x14, 0x9d, 0xe8, 0xa2, 0xc7, 0xa2, 0x10, 0x28, 0x0e, 0x9b, 0x68, 0x01, 0x9c, 0x06, 0x6b, 0xe7, + 0xee, 0xb7, 0xed, 0xd0, 0x9d, 0x89, 0xb0, 0xcf, 0x33, 0x04, 0x3c, 0xbb, 0xc7, 0x6f, 0x5b, 0xfa, 0x56, 0xe8, 0x5f, 0x9b, 0x6e, 0xfd, 0x7a, 0x38, 0xf6, 0xf9, 0x53, 0x7e, 0xfb, 0xcf, 0x84, 0x5f, + 0x86, 0xff, 0xe9, 0x74, 0x3a, 0x1f, 0xe7, 0xb9, 0xcf, 0xd9, 0x04, 0xd9, 0x96, 0xfc, 0x06, 0x8b, 0x07, 0x7f, 0xb7, 0x52, 0x3d, 0x83, 0x8d, 0xf8, 0x4c, 0x20, 0x4a, 0x27, 0x93, 0x02, 0x61, 0x10, + 0x58, 0x84, 0xdf, 0x26, 0x3a, 0x86, 0x6e, 0x7c, 0x1c, 0xb0, 0xf2, 0x6e, 0xc1, 0xd5, 0x68, 0x28, 0xb0, 0xbb, 0x4d, 0xef, 0x2d, 0x31, 0xa1, 0x6f, 0xf4, 0x16, 0xaf, 0x88, 0x65, 0xee, 0xc1, 0xa8, + 0x54, 0x0f, 0x87, 0xfe, 0x9c, 0x8a, 0x65, 0x44, 0xa8, 0xa1, 0xff, 0x1d, 0x81, 0xd4, 0x2c, 0xfa, 0xa9, 0xdb, 0x55, 0x6e, 0xfa, 0x32, 0xe4, 0xc7, 0xbb, 0xa0, 0xd0, 0x13, 0xea, 0xce, 0x37, 0xea, + 0x17, 0x2c, 0xbe, 0x5c, 0x9b, 0x5e, 0x68, 0xff, 0x1e, 0x90, 0x88, 0xb6, 0xab, 0xcd, 0x6c, 0xad, 0x8a, 0x96, 0x91, 0x6d, 0xfa, 0x53, 0xe6, 0xb2, 0x56, 0xa0, 0xe5, 0x42, 0xbc, 0xa3, 0xce, 0xab, + 0x9d, 0xdd, 0x6a, 0x1b, 0x6e, 0x93, 0xf9, 0x08, 0xc4, 0xa0, 0x2c, 0xbd, 0x3f, 0xb4, 0xa2, 0x22, 0x3b, 0xd1, 0x82, 0x75, 0xc2, 0x20, 0x8a, 0x00, 0x3a, 0x4e, 0x03, 0x57, 0xc4, 0xad, 0xd8, 0x52, + 0x30, 0x87, 0x15, 0x4c, 0x6f, 0x47, 0x86, 0x32, 0x91, 0x65, 0xe2, 0xa3, 0x72, 0x38, 0x5f, 0x31, 0xaa, 0x0a, 0xf7, 0xa1, 0x87, 0xf4, 0x49, 0x99, 0xf1, 0x4a, 0xf4, 0x8a, 0xc8, 0xe5, 0x70, 0xac, + 0x9c, 0x50, 0x05, 0xde, 0x57, 0xf8, 0x36, 0x22, 0xcd, 0xc3, 0x0a, 0x25, 0x00, 0x59, 0x4b, 0xe1, 0xad, 0x69, 0xab, 0x7e, 0x54, 0x17, 0x85, 0xc5, 0x27, 0x2e, 0x6e, 0x18, 0x3b, 0x7d, 0x25, 0xcb, + 0x2a, 0x9e, 0x24, 0x95, 0x8e, 0x89, 0xa2, 0x14, 0x00, 0x8c, 0x0f, 0xe7, 0xed, 0xda, 0x4e, 0x2b, 0x11, 0xc7, 0x69, 0xa6, 0xe0, 0xc0, 0x2d, 0xb0, 0xeb, 0x4e, 0x96, 0x5b, 0x45, 0x76, 0xa6, 0x0d, + 0x6a, 0xcb, 0x7d, 0xd3, 0x70, 0xac, 0xc2, 0xb4, 0xdd, 0xa9, 0xdb, 0xe5, 0x66, 0x5a, 0x3e, 0xf6, 0x1b, 0x5c, 0x62, 0xc2, 0x9e, 0x98, 0x1f, 0xb7, 0xc4, 0x5f, 0x40, 0xb8, 0xbd, 0x72, 0x0d, 0x36, + 0x1b, 0x31, 0x4d, 0xc2, 0x45, 0xbd, 0x67, 0xe9, 0xa5, 0x5f, 0xb0, 0x1a, 0xce, 0x42, 0x0d, 0xb3, 0x9e, 0xa1, 0x5d, 0x3e, 0x00, 0xf8, 0x20, 0xb3, 0x14, 0x00, 0x28, 0x79, 0xed, 0x9f, 0x83, 0x44, + 0xaf, 0xd4, 0x84, 0x17, 0x30, 0x14, 0x24, 0x92, 0x45, 0x2d, 0xf1, 0x99, 0xa0, 0x2f, 0x63, 0x87, 0xa1, 0x62, 0xc0, 0x07, 0x09, 0xbc, 0xf6, 0xb2, 0xc1, 0x31, 0x59, 0xff, 0xc8, 0xd9, 0xfa, 0xd2, + 0xc2, 0xc0, 0xf3, 0xea, 0x51, 0x23, 0xed, 0xdf, 0x28, 0x45, 0xdf, 0x56, 0x98, 0x3b, 0xda, 0x91, 0x9d, 0xa5, 0xb6, 0x59, 0x4d, 0x93, 0x8b, 0xe9, 0xfd, 0x37, 0xf0, 0xd8, 0x91, 0x7c, 0xc1, 0xe3, + 0x11, 0xcb, 0xc1, 0xcf, 0xb1, 0xdc, 0x85, 0xe4, 0x1b, 0xd6, 0xe5, 0x25, 0x5c, 0x6d, 0x04, 0xbb, 0x59, 0x44, 0x9d, 0x4c, 0xb6, 0xa0, 0x34, 0xf0, 0xf0, 0x91, 0x96, 0x87, 0x26, 0x48, 0x30, 0x7f, + 0x3d, 0x80, 0xbd, 0xa7, 0x58, 0x54, 0x85, 0xe9, 0x4a, 0x6c, 0x33, 0x1c, 0xd9, 0x94, 0xc9, 0x79, 0x61, 0x18, 0xcb, 0x16, 0xc1, 0x06, 0x0c, 0xc2, 0x62, 0x35, 0x9a, 0x47, 0x60, 0xcf, 0xec, 0x8f, + 0x30, 0xcc, 0xa2, 0xec, 0x24, 0xa6, 0xc4, 0xdc, 0xe0, 0xf7, 0xe0, 0x89, 0x88, 0x27, 0x38, 0xc1, 0x9a, 0xc0, 0x73, 0x08, 0x7b, 0x61, 0x1c, 0x4f, 0x0b, 0x33, 0xf5, 0xdf, 0x6a, 0x40, 0x3f, 0x86, + 0xaf, 0xf6, 0xbc, 0x87, 0x11, 0x80, 0xd8, 0x4d, 0x96, 0xe0, 0x68, 0xf8, 0x2e, 0x24, 0x5f, 0xe0, 0xbb, 0x1c, 0x4c, 0x2f, 0x54, 0x7e, 0x0f, 0xdf, 0x52, 0x09, 0x17, 0xf9, 0xae, 0xab, 0xda, 0xd0, + 0x30, 0x58, 0xc6, 0xb0, 0x6c, 0x4b, 0x59, 0xdb, 0x46, 0xc4, 0x48, 0xea, 0x7a, 0x91, 0xce, 0xfb, 0xf3, 0x2c, 0xa7, 0x97, 0x27, 0x25, 0x9e, 0xa3, 0x33, 0xb2, 0x1b, 0x68, 0x30, 0x35, 0x29, 0xbb, + 0xda, 0xe1, 0xba, 0x80, 0x11, 0x45, 0xc8, 0xcf, 0xfc, 0xad, 0x4c, 0xeb, 0x78, 0xe9, 0x14, 0xbc, 0xd5, 0x13, 0x41, 0xe6, 0x91, 0xb4, 0x5e, 0xd7, 0x67, 0x61, 0x44, 0x20, 0xc7, 0xe7, 0x45, 0xfd, + 0x85, 0x11, 0xbf, 0x14, 0xad, 0x0e, 0x5d, 0xd7, 0xc5, 0x51, 0xe4, 0xf5, 0x26, 0xf4, 0x33, 0x8e, 0x97, 0x70, 0x83, 0x9f, 0x24, 0xc0, 0x93, 0x60, 0x5e, 0xe8, 0x7e, 0x20, 0x7a, 0x09, 0x6a, 0x18, + 0x19, 0x65, 0xca, 0x8b, 0xb6, 0xc6, 0x1c, 0xac, 0x05, 0x57, 0x31, 0x19, 0x6e, 0x05, 0x67, 0xa6, 0xc4, 0x50, 0x0c, 0x60, 0x7b, 0x07, 0xd1, 0xcc, 0xac, 0x31, 0x62, 0x61, 0x76, 0x9a, 0xab, 0x70, + 0x10, 0xa9, 0x87, 0xe5, 0x6c, 0x68, 0x8f, 0x38, 0x47, 0xa9, 0x8e, 0xcc, 0x21, 0xfe, 0xba, 0x9a, 0x59, 0x43, 0x2b, 0xcf, 0x79, 0x4b, 0x42, 0xcf, 0x99, 0x35, 0x59, 0xa2, 0x51, 0x5d, 0x1a, 0xa5, + 0x05, 0xe8, 0x22, 0x07, 0x8d, 0x5a, 0x0d, 0xfa, 0xea, 0x87, 0x79, 0xf9, 0xcc, 0xf6, 0xce, 0x85, 0xe2, 0x0b, 0x0a, 0x2f, 0x7f, 0xc7, 0x6e, 0xec, 0xcc, 0x76, 0x1e, 0xae, 0xf4, 0x83, 0xd2, 0x61, + 0x32, 0xdc, 0x4b, 0x1b, 0xc1, 0x12, 0x48, 0x15, 0x9f, 0xa3, 0x58, 0x41, 0xd8, 0x05, 0x34, 0x11, 0x22, 0x82, 0x5c, 0xa0, 0x4e, 0x45, 0xb4, 0xf2, 0x1e, 0xa6, 0x44, 0x32, 0x73, 0x35, 0x94, 0xd8, + 0x65, 0x6c, 0xbf, 0x38, 0x10, 0x7b, 0x62, 0x58, 0x9d, 0x76, 0x9a, 0x5c, 0x45, 0x8a, 0x1c, 0x62, 0xde, 0x20, 0x60, 0x4b, 0x20, 0xa7, 0x1c, 0x5b, 0xb7, 0x98, 0x6f, 0xea, 0xc1, 0xe7, 0xbe, 0x93, + 0xff, 0xdc, 0xda, 0xf7, 0x4e, 0x75, 0x36, 0xfd, 0x38, 0x1e, 0xbb, 0xfa, 0xe1, 0xc2, 0x64, 0x69, 0x2d, 0xc2, 0xa0, 0xa0, 0xd0, 0xe3, 0xca, 0x5a, 0xea, 0x6e, 0x69, 0x57, 0x6d, 0xa2, 0x70, 0xa6, + 0x8b, 0x15, 0x42, 0xb8, 0x1e, 0x92, 0x01, 0x0c, 0xed, 0xc2, 0x3d, 0x6e, 0x26, 0x80, 0x49, 0xe2, 0xdb, 0x8d, 0x57, 0x9f, 0x03, 0xa6, 0xcc, 0x20, 0x65, 0x9e, 0xda, 0xb9, 0xbd, 0xac, 0x06, 0x5e, + 0xac, 0x06, 0xcd, 0x83, 0xc4, 0xd5, 0xaa, 0x76, 0x8f, 0x9b, 0x95, 0xa2, 0x97, 0xe7, 0x62, 0xc4, 0x7c, 0x7a, 0x2b, 0x83, 0xf0, 0xb9, 0x0d, 0xe7, 0xd7, 0xbc, 0x11, 0xb7, 0x9a, 0xbe, 0xac, 0xe5, + 0x61, 0x5a, 0x86, 0xf6, 0xbb, 0xfc, 0x7f, 0xe0, 0x93, 0x7f, 0x19, 0x78, 0x19, 0xfe, 0xcc, 0x4b, 0x7f, 0xae, 0x71, 0xbd, 0x53, 0x7d, 0x85, 0xf6, 0x72, 0x7c, 0xe1, 0xa9, 0x11, 0x1a, 0xd6, 0x9e, + 0xa0, 0x22, 0xb2, 0xd4, 0x1a, 0x43, 0x9e, 0xa8, 0x6b, 0xfa, 0xb0, 0x06, 0xc1, 0x80, 0x5d, 0x88, 0x4c, 0x83, 0x23, 0xba, 0x82, 0xe1, 0xfa, 0x21, 0x44, 0x37, 0x9b, 0xe5, 0xee, 0xb8, 0x3e, 0x6f, + 0x21, 0x18, 0x2d, 0xa9, 0x24, 0xd2, 0x90, 0xc9, 0xb9, 0x9b, 0xf3, 0x75, 0x13, 0x97, 0x68, 0xd8, 0xf4, 0x3b, 0x66, 0x67, 0x57, 0x1d, 0x82, 0x75, 0xe2, 0x56, 0x84, 0x4d, 0xa5, 0x66, 0xf0, 0xb2, + 0x7c, 0x14, 0x17, 0xf1, 0x05, 0x8b, 0xc4, 0x8d, 0x6d, 0xf3, 0xe1, 0x3e, 0xcf, 0x73, 0xa1, 0xa5, 0xef, 0x54, 0x2f, 0x58, 0xbc, 0x1e, 0x8f, 0x0d, 0x2d, 0xdd, 0x42, 0x84, 0xac, 0x50, 0x20, 0x0e, + 0xa4, 0xed, 0x51, 0xc6, 0xe0, 0x43, 0x54, 0xc5, 0x8c, 0xc0, 0xc0, 0x4e, 0xec, 0x88, 0x64, 0x6e, 0x6e, 0x34, 0xe3, 0x24, 0xac, 0xc1, 0x9a, 0x5f, 0x7a, 0x83, 0x07, 0x17, 0x52, 0xbd, 0x77, 0x7d, + 0xd6, 0x64, 0xdd, 0xb2, 0x77, 0xdd, 0x89, 0xde, 0x89, 0x93, 0x23, 0x26, 0x37, 0x12, 0x2d, 0xaa, 0xd8, 0xa1, 0x70, 0x04, 0x47, 0x0a, 0x25, 0x10, 0x85, 0xdb, 0xcd, 0x98, 0x8a, 0x6b, 0x1f, 0x6f, + 0xfa, 0x43, 0x9e, 0x05, 0xf6, 0x54, 0x3d, 0xa7, 0x5b, 0xd2, 0x37, 0xa8, 0x5c, 0xf2, 0x2a, 0xb0, 0x71, 0x45, 0x9d, 0xf4, 0xa2, 0x35, 0x49, 0xa0, 0x61, 0x38, 0x73, 0xd8, 0x53, 0xa7, 0x14, 0x08, + 0x73, 0x25, 0xe4, 0x73, 0xd9, 0x8c, 0x74, 0x5a, 0x76, 0x27, 0x5c, 0x24, 0x7a, 0x45, 0x14, 0xd8, 0x14, 0xdf, 0x6d, 0xaa, 0xd9, 0x90, 0x5a, 0x4d, 0xcc, 0x3a, 0xc4, 0xbe, 0x9d, 0xa9, 0x66, 0x62, + 0x0e, 0x28, 0x43, 0x21, 0x47, 0x2f, 0x28, 0x61, 0xf9, 0x20, 0xc1, 0xc6, 0x3c, 0x69, 0xa5, 0x7a, 0xb6, 0x87, 0x4b, 0x58, 0x7f, 0x6e, 0x0b, 0xec, 0x33, 0xe3, 0x5c, 0xfb, 0x01, 0xdd, 0x4c, 0xc8, + 0xc4, 0xcc, 0xa7, 0x99, 0x15, 0xfd, 0x7d, 0xd7, 0x1b, 0x75, 0xae, 0x43, 0xfb, 0x34, 0x8d, 0x8b, 0xfa, 0xef, 0x8f, 0x54, 0xae, 0xfb, 0x33, 0x35, 0x78, 0x5c, 0x88, 0x11, 0x79, 0x4a, 0xe2, 0xdf, + 0xf6, 0x75, 0x42, 0xc6, 0x49, 0xfc, 0x8c, 0x4b, 0xad, 0x60, 0xd9, 0x4b, 0x6b, 0x2d, 0x3f, 0xd4, 0xee, 0x40, 0x84, 0x14, 0x9f, 0xf4, 0x8c, 0x89, 0xa4, 0x56, 0x84, 0xac, 0x05, 0xb1, 0xaf, 0x03, + 0x7b, 0xd6, 0xf6, 0xf3, 0x93, 0x8e, 0xcf, 0x8e, 0xea, 0xde, 0x6e, 0xd7, 0xc2, 0x5c, 0x25, 0x31, 0x8c, 0xd8, 0xd7, 0x84, 0x74, 0x12, 0xf0, 0x09, 0xb0, 0xc2, 0x31, 0x79, 0x2b, 0x09, 0x6e, 0xdf, + 0xce, 0x17, 0xb9, 0x08, 0x60, 0x60, 0x88, 0x3c, 0x0a, 0xe5, 0xfa, 0x0d, 0xec, 0x5f, 0xdb, 0x3b, 0x21, 0x5f, 0xdb, 0x6d, 0xdc, 0x69, 0xd6, 0x84, 0x5f, 0x9e, 0x79, 0x00, 0x70, 0x76, 0x0a, 0x1d, + 0xf3, 0xa7, 0x92, 0xed, 0x7f, 0xae, 0xae, 0xbd, 0x11, 0xbd, 0xc0, 0x7c, 0x3d, 0xbc, 0x54, 0x68, 0x1f, 0xa1, 0xb2, 0xd1, 0x05, 0x5c, 0x7a, 0x9c, 0xb4, 0xc7, 0x32, 0xc5, 0x8e, 0x3c, 0x68, 0x93, + 0x1c, 0x92, 0xe5, 0xc6, 0x73, 0x55, 0xbe, 0xd1, 0x28, 0xc7, 0xf5, 0x3b, 0x0a, 0x08, 0x55, 0x11, 0x75, 0x2d, 0x48, 0x05, 0x81, 0x7a, 0xb9, 0x39, 0x2c, 0x48, 0x99, 0x10, 0xa8, 0xde, 0x70, 0x54, + 0xb2, 0x57, 0x2d, 0xa2, 0xd3, 0x76, 0x03, 0xbc, 0x8a, 0x22, 0xc5, 0x8f, 0xe6, 0xa7, 0xed, 0xb1, 0x34, 0x94, 0x33, 0x83, 0x9d, 0x9e, 0x2b, 0x4b, 0xf0, 0x29, 0x9e, 0xe4, 0xef, 0x7f, 0xc1, 0x5f, + 0xfc, 0x74, 0x1f, 0x46, 0xc2, 0xcb, 0xbd, 0xaf, 0x3d, 0xa1, 0xcb, 0x4b, 0xbe, 0xc7, 0xf5, 0x2e, 0xf4, 0x35, 0x19, 0xd1, 0x8f, 0x33, 0x6b, 0x9a, 0x9b, 0x85, 0x7b, 0x6d, 0x5b, 0xfe, 0x2f, 0xf4, + 0x2b, 0xe9, 0x4b, 0x57, 0xf3, 0x8b, 0xa5, 0xfe, 0x16, 0xad, 0xf1, 0xaf, 0xef, 0x4d, 0x55, 0x3e, 0x52, 0x21, 0xff, 0xf5, 0x2d, 0x15, 0xf2, 0x7b, 0xb8, 0xc7, 0xbf, 0xbe, 0x85, 0x7b, 0x14, 0xae, + 0xe9, 0x38, 0x61, 0x91, 0xbf, 0xde, 0x7d, 0x58, 0x9e, 0xd3, 0x8e, 0xb3, 0xda, 0x79, 0x1f, 0xce, 0x3d, 0x1e, 0xc1, 0x9f, 0x53, 0x44, 0x3e, 0xe8, 0xbe, 0xb0, 0xc9, 0xc7, 0xd9, 0xa5, 0xec, 0xdf, + 0x88, 0x39, 0x79, 0x0c, 0x85, 0xf3, 0xb1, 0xdc, 0x9d, 0x78, 0x23, 0xe1, 0x79, 0x03, 0xeb, 0x4c, 0xf8, 0x34, 0x74, 0x33, 0x9e, 0x9c, 0x10, 0x13, 0x75, 0x62, 0xa3, 0xee, 0xea, 0x24, 0x57, 0xc6, + 0xda, 0x0e, 0x4f, 0x93, 0x7d, 0x07, 0x75, 0x8b, 0xcc, 0x4a, 0x06, 0xdb, 0xb4, 0x5b, 0x90, 0x11, 0x56, 0xbd, 0x17, 0x08, 0xb4, 0x29, 0x72, 0xa7, 0x75, 0x43, 0x28, 0x9d, 0x26, 0x08, 0xdb, 0x41, + 0xc5, 0xe6, 0x99, 0xb6, 0x3c, 0x8f, 0x50, 0x46, 0xfe, 0x8d, 0x5a, 0xfe, 0x97, 0x10, 0xdb, 0x2f, 0x0d, 0xeb, 0x6f, 0x63, 0x70, 0x8a, 0xcc, 0x76, 0xcb, 0xeb, 0x7f, 0x03, 0x2f, 0xf4, 0xc1, 0x9b, + 0xdb, 0x75, 0x15, 0xc6, 0x6f, 0xf7, 0xbe, 0x74, 0xee, 0xa9, 0xeb, 0xd0, 0x79, 0x7d, 0x2d, 0xf8, 0x93, 0xda, 0xf3, 0x89, 0xeb, 0xff, 0x13, 0x3c, 0x7e, 0x33, 0x84, 0xff, 0x04, 0x8f, 0x3f, 0xf5, + 0x51, 0xff, 0x87, 0x05, 0x8f, 0x3f, 0xea, 0x4f, 0xf8, 0x35, 0x18, 0xe1, 0x09, 0x0d, 0xf8, 0xc7, 0xbe, 0x84, 0x23, 0xb3, 0xeb, 0x24, 0x89, 0x59, 0xec, 0xcb, 0x08, 0x0f, 0xeb, 0x59, 0x67, 0xa1, + 0x19, 0xa7, 0xdb, 0xe5, 0x92, 0x95, 0xf3, 0x7c, 0xb9, 0x4b, 0xcb, 0x68, 0x86, 0x42, 0x82, 0xaa, 0x48, 0x9c, 0x85, 0x0c, 0x7b, 0x34, 0x4b, 0xb5, 0x56, 0x5d, 0xc2, 0x83, 0x9a, 0x24, 0x4a, 0xb6, + 0xb3, 0x05, 0x6f, 0xb5, 0x98, 0x2c, 0x24, 0x3a, 0xf7, 0xb8, 0xd9, 0x01, 0x25, 0x10, 0x8f, 0xf7, 0x61, 0xc2, 0x60, 0x17, 0x26, 0x13, 0x73, 0xcf, 0x45, 0x4b, 0xdf, 0xb6, 0x27, 0xfc, 0x17, 0x78, + 0xa9, 0xf5, 0xfc, 0x03, 0xa6, 0xe9, 0xe3, 0xde, 0xc9, 0xe0, 0x53, 0xa5, 0xdd, 0x7f, 0xea, 0x45, 0x38, 0xa2, 0x8c, 0xb3, 0x23, 0xf4, 0x13, 0x98, 0xac, 0x8f, 0xb0, 0x09, 0xb5, 0x3b, 0xcb, 0x60, + 0xd7, 0x35, 0x6f, 0xe4, 0x8a, 0xed, 0x47, 0xab, 0x7a, 0x7b, 0x98, 0xd5, 0xd4, 0x76, 0x56, 0x5b, 0xb6, 0xb1, 0x9c, 0x0b, 0x9a, 0x45, 0x67, 0x84, 0xe7, 0x21, 0x02, 0xd1, 0xab, 0x39, 0x4a, 0x79, + 0x80, 0xeb, 0xc9, 0x44, 0xcd, 0x64, 0x7a, 0x86, 0x9e, 0x91, 0x65, 0x87, 0x3b, 0xfa, 0x5c, 0xf0, 0xc5, 0x95, 0xe6, 0x93, 0xa5, 0x38, 0xc6, 0x69, 0x61, 0x67, 0x89, 0x15, 0xa6, 0xae, 0xf3, 0x32, + 0xeb, 0x5d, 0xf3, 0xb1, 0x2b, 0x07, 0xf8, 0x45, 0x3c, 0x81, 0xc9, 0x0d, 0xed, 0x0b, 0x30, 0x37, 0x57, 0x2e, 0x73, 0x90, 0xf8, 0x3d, 0x3a, 0x4b, 0x71, 0x87, 0xf0, 0x92, 0x57, 0x6f, 0x5c, 0xd6, + 0xc3, 0x6d, 0xca, 0xa2, 0xf8, 0xcd, 0x52, 0x0b, 0x38, 0x99, 0x3e, 0x4f, 0xa0, 0x13, 0x49, 0x16, 0x54, 0x9c, 0x48, 0x54, 0x63, 0x37, 0x4b, 0x06, 0xa5, 0x28, 0x90, 0x35, 0x38, 0xad, 0x92, 0x97, + 0xa4, 0x4c, 0x07, 0x4e, 0x3c, 0xcc, 0x07, 0x41, 0x6f, 0xbb, 0x80, 0x88, 0x69, 0x27, 0x6d, 0x12, 0x5e, 0x70, 0x67, 0x13, 0xd4, 0x76, 0x32, 0xc6, 0x79, 0xce, 0xae, 0x70, 0xdc, 0xd8, 0xec, 0x3f, + 0xc3, 0x75, 0x0d, 0xaf, 0x7b, 0xa4, 0x9e, 0x64, 0x49, 0x62, 0xa6, 0xce, 0x43, 0x7f, 0x23, 0xf8, 0x5c, 0xb0, 0xc8, 0x3b, 0xd9, 0x2b, 0xa4, 0xd7, 0xe3, 0x29, 0x38, 0x32, 0x4e, 0x64, 0xce, 0xf2, + 0xb1, 0x56, 0x55, 0x33, 0x6a, 0x97, 0xe9, 0x05, 0x91, 0x65, 0x7d, 0x14, 0xed, 0x24, 0x67, 0x1d, 0xc6, 0x82, 0x72, 0x52, 0x37, 0x1a, 0x35, 0x59, 0x05, 0x1d, 0xaf, 0x54, 0x02, 0xd7, 0x9e, 0x00, + 0x09, 0x89, 0x90, 0x58, 0x46, 0x76, 0x79, 0x54, 0x9f, 0x13, 0xa9, 0x2b, 0x32, 0xca, 0x4b, 0x3d, 0x45, 0x66, 0xc5, 0x35, 0x2b, 0x52, 0x78, 0x5b, 0xf4, 0x6c, 0xa0, 0x99, 0xc5, 0x2e, 0x4a, 0xbe, + 0xc5, 0x89, 0xd8, 0x59, 0x92, 0x67, 0xa9, 0x9b, 0x56, 0x53, 0x37, 0x09, 0xab, 0xea, 0x31, 0x04, 0x4f, 0x85, 0x91, 0x7f, 0xa3, 0x7e, 0x45, 0xe2, 0xf6, 0xda, 0xd8, 0x26, 0x27, 0x92, 0x03, 0x97, + 0x2e, 0x26, 0x52, 0x93, 0x52, 0x00, 0x95, 0xf6, 0x6c, 0x44, 0xa5, 0x2d, 0x16, 0x75, 0x91, 0x33, 0xfb, 0xb5, 0x27, 0x00, 0xb3, 0x5e, 0x4f, 0xe5, 0x30, 0xc5, 0xc4, 0x59, 0x41, 0xc3, 0x89, 0x50, + 0x57, 0x6c, 0x73, 0x28, 0x16, 0x64, 0xb0, 0xa9, 0x2d, 0xb8, 0x98, 0x03, 0xf5, 0xce, 0x9a, 0xc8, 0x8c, 0x4c, 0xd5, 0x0c, 0x20, 0xea, 0x19, 0x35, 0x07, 0x74, 0xc7, 0x33, 0xab, 0x52, 0x1a, 0x65, + 0xd1, 0x7f, 0xf6, 0xf9, 0xdf, 0x03, 0x07, 0x78, 0x52, 0xb8, 0xbf, 0x91, 0xbd, 0xa0, 0xf2, 0x76, 0x32, 0x05, 0xc6, 0x89, 0xf5, 0x99, 0x5c, 0x34, 0x88, 0x53, 0xb6, 0xbd, 0xb8, 0xa3, 0xbc, 0x2c, + 0x58, 0xe5, 0xc3, 0x3c, 0xc3, 0x74, 0x0b, 0x5e, 0x0d, 0xb0, 0x5c, 0x1c, 0xe8, 0x33, 0xc5, 0xa2, 0x85, 0x52, 0x07, 0x2b, 0x09, 0x37, 0x83, 0x2a, 0xb6, 0x74, 0x2e, 0x55, 0xbb, 0x16, 0xb2, 0x16, + 0x4b, 0x5e, 0x8a, 0x23, 0x93, 0xc4, 0x19, 0x8d, 0x35, 0x35, 0x83, 0x68, 0x4b, 0xd6, 0xc9, 0x9c, 0x65, 0x63, 0x9d, 0x02, 0x2e, 0x39, 0x8f, 0x83, 0x23, 0x3b, 0x85, 0x8f, 0xc4, 0x32, 0xf0, 0x54, + 0x7b, 0xae, 0x2b, 0xc9, 0x0b, 0x0c, 0x2f, 0x07, 0x53, 0x60, 0x5c, 0x27, 0x2e, 0xdd, 0x80, 0x57, 0x87, 0x3e, 0x9d, 0x65, 0x84, 0xef, 0x71, 0x9b, 0x38, 0x8d, 0x35, 0xdc, 0xc7, 0xbb, 0x33, 0xe2, + 0xf7, 0x02, 0x26, 0xc8, 0x75, 0xb0, 0xda, 0x73, 0xa6, 0xb9, 0x2a, 0xcb, 0x15, 0x05, 0x9d, 0x7d, 0xfa, 0x20, 0x03, 0xfe, 0xde, 0xaf, 0x94, 0x26, 0xeb, 0x8d, 0xad, 0x52, 0xcd, 0x49, 0x0b, 0x73, + 0x16, 0x48, 0xe0, 0xd9, 0x73, 0x47, 0x45, 0xcd, 0xe2, 0xd4, 0xd8, 0x33, 0x61, 0x91, 0x14, 0xdf, 0x36, 0xd2, 0xae, 0xef, 0x14, 0x3d, 0x34, 0x6f, 0x9f, 0x6b, 0x32, 0xf2, 0x4e, 0xf5, 0x7d, 0xd4, + 0x91, 0x39, 0xba, 0xb3, 0xc8, 0x96, 0xee, 0xb0, 0x8c, 0x2d, 0xb8, 0xc9, 0x3e, 0x18, 0xb6, 0xdc, 0xe6, 0x30, 0x8f, 0x50, 0x19, 0x9f, 0xe9, 0x70, 0xc4, 0xcf, 0x92, 0x03, 0xdb, 0xd0, 0x33, 0xda, + 0x5d, 0x83, 0x47, 0x31, 0xd9, 0xa4, 0x18, 0x0a, 0x85, 0xfb, 0x05, 0xaa, 0x23, 0x0a, 0x35, 0x2c, 0xe6, 0xf1, 0x04, 0x15, 0x78, 0x41, 0x8b, 0x7b, 0x45, 0x21, 0x27, 0x72, 0xa2, 0x1e, 0xf6, 0x09, + 0xc0, 0x8a, 0x87, 0x36, 0xa7, 0xd1, 0xcd, 0x79, 0x4c, 0xa4, 0x81, 0x5d, 0xb8, 0x66, 0xe5, 0x4e, 0x5f, 0x85, 0xee, 0x3f, 0xba, 0xa3, 0x70, 0x4b, 0xfa, 0x05, 0x95, 0x9b, 0x0b, 0x63, 0xf7, 0x15, + 0x1c, 0x9b, 0x5b, 0x6a, 0x70, 0x94, 0x02, 0x7c, 0xbe, 0x36, 0xb5, 0x28, 0x2c, 0x33, 0xa9, 0x71, 0xbb, 0xf5, 0x46, 0x65, 0xb8, 0xc1, 0x3c, 0xe3, 0x03, 0x54, 0x18, 0x5c, 0xe7, 0x4d, 0x78, 0xb9, + 0x98, 0x2b, 0x27, 0x27, 0x61, 0x93, 0xf2, 0x80, 0x24, 0x50, 0x6c, 0x6f, 0xb3, 0xa8, 0x88, 0x66, 0x4b, 0x36, 0x26, 0x92, 0x13, 0xaa, 0x76, 0x7c, 0xa2, 0x93, 0x13, 0xaf, 0x92, 0x4e, 0xfb, 0x19, + 0x9c, 0x3d, 0xd2, 0x76, 0xbe, 0x40, 0x93, 0x95, 0xe5, 0xb4, 0xcc, 0xcd, 0xf6, 0xd1, 0x5e, 0x2b, 0xfe, 0xd4, 0xb6, 0xd5, 0x27, 0xba, 0x17, 0x50, 0xde, 0xcf, 0x2e, 0x36, 0xee, 0x08, 0x6f, 0x48, + 0x28, 0xd1, 0xfb, 0x0d, 0x77, 0xd8, 0xab, 0xcc, 0x8e, 0xc6, 0x1d, 0x76, 0x2f, 0x10, 0xc5, 0xc9, 0x12, 0xd2, 0x7d, 0xde, 0xd3, 0xbd, 0x6f, 0xd3, 0xcb, 0xea, 0x18, 0xe5, 0xee, 0x71, 0xb7, 0xf0, + 0x7b, 0xe2, 0xb8, 0x87, 0x0a, 0xcd, 0xee, 0xb4, 0x2d, 0xa1, 0x94, 0x27, 0xc9, 0x15, 0x63, 0x4c, 0x28, 0x28, 0x68, 0x85, 0x4f, 0x0e, 0x9b, 0xc2, 0xf4, 0x4b, 0xf0, 0x0c, 0xa2, 0xcb, 0xda, 0xb1, + 0xf1, 0x15, 0xf6, 0x9c, 0x37, 0x24, 0x37, 0xab, 0x60, 0x7a, 0x72, 0xaf, 0x91, 0x67, 0xf0, 0x37, 0xa7, 0x53, 0xe0, 0x5a, 0x66, 0xea, 0x4f, 0x5f, 0xd7, 0xca, 0xbf, 0xff, 0xeb, 0x5e, 0x02, 0x79, + 0x1b, 0x84, 0x9f, 0xb2, 0x4b, 0x1e, 0x78, 0xfc, 0x1c, 0xf7, 0xea, 0xb2, 0x78, 0xc4, 0x9d, 0x7f, 0x2e, 0xa1, 0x2e, 0x14, 0x2f, 0x51, 0x66, 0x2f, 0x43, 0x00, 0xc7, 0xf9, 0xe3, 0x9b, 0x52, 0xc5, + 0x64, 0x84, 0x53, 0xd9, 0x46, 0x59, 0x75, 0x16, 0x63, 0x87, 0x11, 0x1e, 0x9c, 0x8e, 0x52, 0x03, 0xac, 0xab, 0x49, 0xb9, 0x5a, 0x1d, 0x55, 0x81, 0xc7, 0x70, 0x47, 0x74, 0xdc, 0x59, 0x86, 0x6a, + 0x51, 0x5a, 0x4c, 0xb8, 0x64, 0x1b, 0x75, 0xc7, 0x4d, 0x18, 0x42, 0x35, 0x23, 0x58, 0xeb, 0xa2, 0x02, 0x17, 0x36, 0x3f, 0x6f, 0x01, 0xdd, 0xcc, 0x9a, 0x6e, 0x12, 0x0a, 0xf1, 0x7a, 0x3b, 0xf9, + 0x26, 0x9f, 0xbe, 0x86, 0xd6, 0xdd, 0xba, 0xde, 0xa0, 0x27, 0x9a, 0x2a, 0xdc, 0x86, 0xd4, 0x5d, 0x68, 0xfc, 0x7e, 0xb0, 0x8b, 0x65, 0x34, 0xe8, 0x3a, 0x19, 0x22, 0x4a, 0xe0, 0x85, 0x62, 0x13, + 0x0e, 0xc5, 0x52, 0x74, 0x1b, 0x45, 0xd1, 0xd8, 0x2a, 0x5d, 0x9c, 0x8f, 0x9e, 0x8b, 0x77, 0x20, 0x19, 0xf8, 0x4c, 0x69, 0x2b, 0x03, 0x66, 0x58, 0x5b, 0xcb, 0xcb, 0xb6, 0xd2, 0x76, 0x5f, 0xfb, + 0x8a, 0xd8, 0x53, 0x55, 0x80, 0x79, 0x84, 0xc1, 0x48, 0xea, 0x41, 0xee, 0x8f, 0xec, 0x92, 0x9e, 0xe1, 0xc7, 0x1a, 0xa9, 0x40, 0xed, 0x39, 0x33, 0x23, 0xf9, 0xec, 0x3a, 0x79, 0xc0, 0x20, 0x17, + 0xcf, 0x73, 0x38, 0x3c, 0x96, 0x61, 0xcf, 0xc4, 0xcb, 0x7c, 0x90, 0xbd, 0xa0, 0xf7, 0x76, 0x72, 0xe9, 0xb6, 0x30, 0x82, 0x5f, 0x06, 0x48, 0x9e, 0x1c, 0xe7, 0x1a, 0x0e, 0x07, 0xe4, 0xe1, 0x70, + 0x0a, 0x27, 0xbb, 0xc9, 0xdc, 0x30, 0xa1, 0x98, 0x8a, 0xeb, 0x94, 0x98, 0x0f, 0xa1, 0x2f, 0xf4, 0xab, 0xa2, 0x34, 0xbb, 0x09, 0x77, 0x10, 0xb1, 0x96, 0x3b, 0x22, 0x46, 0x76, 0xcc, 0x19, 0x9d, + 0x3a, 0xad, 0x02, 0x31, 0x6a, 0xc9, 0x28, 0xa2, 0x17, 0xa7, 0x63, 0x17, 0xe8, 0x80, 0xca, 0x31, 0xc1, 0x89, 0x68, 0x07, 0x1d, 0x5f, 0xa2, 0xf6, 0x18, 0xf3, 0xe2, 0xd3, 0xab, 0xfe, 0xb0, 0x69, + 0xf1, 0x9c, 0x5c, 0xff, 0x42, 0xfb, 0x16, 0x98, 0xcb, 0xb6, 0xc5, 0x48, 0xc9, 0x7e, 0x0c, 0xf7, 0x9d, 0xcf, 0x84, 0xc5, 0x5a, 0x05, 0x66, 0xee, 0x5a, 0xe0, 0xed, 0x74, 0x49, 0x91, 0xf0, 0x6c, + 0xbd, 0x31, 0x48, 0xe3, 0xcc, 0xa5, 0x2d, 0xd9, 0x1e, 0xfb, 0xa6, 0x71, 0x42, 0x24, 0x2e, 0x0b, 0xf0, 0xb8, 0xd8, 0x41, 0x50, 0x1a, 0x38, 0xde, 0x0c, 0x76, 0x2c, 0x98, 0xce, 0x0c, 0xfb, 0x10, + 0x29, 0x2a, 0x24, 0x9f, 0xbd, 0x61, 0xdd, 0xee, 0xfa, 0x1c, 0xeb, 0xa1, 0xae, 0x84, 0xd3, 0xe4, 0x59, 0xf3, 0xe2, 0x13, 0xfb, 0x5c, 0x37, 0x12, 0x6f, 0x84, 0xd4, 0xe7, 0x7d, 0x0b, 0xf0, 0x4f, + 0x0b, 0x31, 0x7c, 0xfc, 0xf3, 0x4f, 0x9e, 0x97, 0xe7, 0x6a, 0xc5, 0xbd, 0xd2, 0x9e, 0x4d, 0xdf, 0x8e, 0xee, 0x64, 0xb9, 0xfc, 0xf5, 0xe8, 0x03, 0xe0, 0xbb, 0xd9, 0x19, 0x8e, 0x7b, 0x63, 0xb2, + 0x55, 0x17, 0x39, 0xbe, 0x1f, 0xea, 0xae, 0xd8, 0x14, 0x08, 0xc7, 0x5b, 0x14, 0x03, 0x05, 0x47, 0x9c, 0x52, 0x70, 0x7d, 0x17, 0x9a, 0x30, 0x0c, 0x08, 0xcb, 0x6e, 0xed, 0x21, 0x0e, 0x5c, 0xa0, + 0x83, 0x9a, 0x87, 0xf6, 0x1e, 0xc2, 0x50, 0x20, 0xc6, 0x17, 0xfb, 0x1d, 0x26, 0xf1, 0xf3, 0x41, 0xd8, 0x48, 0x31, 0xbc, 0x5b, 0xe5, 0x67, 0x39, 0x6c, 0x61, 0xe6, 0xf9, 0xae, 0xb1, 0x37, 0xfe, + 0xb5, 0x7f, 0x92, 0x5f, 0xdf, 0xc8, 0xbe, 0x76, 0x62, 0xbc, 0x9e, 0x8c, 0xe5, 0xd2, 0xde, 0x99, 0xdb, 0x28, 0xe9, 0x84, 0x67, 0xd5, 0x96, 0x26, 0x9b, 0xc8, 0x6e, 0x0f, 0xa2, 0x35, 0xa7, 0x4f, + 0xc1, 0xc6, 0x26, 0x52, 0x7f, 0x57, 0x00, 0xbc, 0x19, 0x30, 0xd4, 0xaa, 0xa1, 0xc3, 0x4d, 0x4b, 0xe4, 0xf5, 0xd1, 0xb4, 0xa0, 0xde, 0x88, 0x83, 0x49, 0x7a, 0x32, 0x4b, 0x21, 0x35, 0xf6, 0x13, + 0x66, 0xa5, 0x90, 0x7b, 0xac, 0x90, 0x72, 0x68, 0x33, 0x6c, 0x82, 0x8d, 0x31, 0x34, 0xbb, 0x25, 0xf1, 0x1c, 0x97, 0x86, 0xe5, 0xd4, 0x2c, 0xfc, 0xfa, 0xa3, 0x63, 0x39, 0xf8, 0xb5, 0xe3, 0x5b, + 0x58, 0x4e, 0x9d, 0x17, 0x1d, 0x2b, 0xb3, 0x22, 0xd7, 0xfe, 0x70, 0x27, 0x7f, 0xad, 0x97, 0xf8, 0x96, 0x65, 0x73, 0x87, 0xc2, 0xf5, 0x3f, 0xa7, 0x61, 0x79, 0xff, 0x9f, 0x5f, 0x6f, 0xbf, 0x17, + 0x40, 0xfb, 0xb6, 0xe5, 0x7e, 0xed, 0x27, 0xf0, 0x2b, 0x2f, 0xb2, 0x2a, 0xab, 0xfa, 0xdc, 0xfd, 0xe5, 0xc5, 0xa6, 0xff, 0xf6, 0x2c, 0xf4, 0xc8, 0x60, 0xbf, 0x7c, 0x96, 0xf0, 0x91, 0x9c, 0x02, + 0x9e, 0x4a, 0xaa, 0x7c, 0xa5, 0xf9, 0xf6, 0xd1, 0xc3, 0x72, 0x0a, 0xfc, 0x3e, 0xb9, 0x12, 0x9c, 0x96, 0x50, 0x7a, 0x9c, 0x80, 0x10, 0xc1, 0x4c, 0xf0, 0xfd, 0xe1, 0x34, 0x91, 0x4a, 0x96, 0x9e, + 0xe0, 0xf6, 0x4e, 0x1b, 0x06, 0xf1, 0xdb, 0x3a, 0xed, 0x85, 0xa9, 0x3b, 0xcd, 0x8b, 0x2c, 0x77, 0x8b, 0x2a, 0xfc, 0x21, 0x1e, 0xf1, 0xb9, 0xd7, 0xff, 0x42, 0xfd, 0x32, 0x90, 0x2f, 0xd7, 0x2e, + 0x4c, 0x3c, 0x42, 0x65, 0x84, 0xf9, 0xb3, 0xa7, 0x73, 0x11, 0x14, 0x6f, 0x07, 0x87, 0x97, 0x3d, 0xc2, 0x58, 0x1b, 0xcc, 0x4c, 0x9d, 0x18, 0x75, 0x3f, 0xa1, 0x7c, 0x1a, 0xf3, 0x40, 0x0c, 0x71, + 0x09, 0x0e, 0x6a, 0x71, 0xc7, 0x4f, 0x73, 0x8e, 0x2c, 0x28, 0xda, 0x2d, 0x56, 0x7a, 0xce, 0x23, 0xd8, 0x5a, 0xd7, 0xed, 0x28, 0x3d, 0x39, 0xfb, 0x1d, 0x1f, 0xed, 0x4f, 0x73, 0x12, 0x53, 0x97, + 0x14, 0x31, 0x81, 0x65, 0x2e, 0x7e, 0x72, 0x2d, 0xff, 0xce, 0x41, 0xc0, 0x2f, 0xf0, 0x41, 0x48, 0xc6, 0x75, 0xbc, 0x3f, 0xc5, 0xba, 0x3c, 0xb3, 0xa4, 0x5f, 0x68, 0xbe, 0xa3, 0xe9, 0x8c, 0xc9, + 0xf3, 0x01, 0xa7, 0xbd, 0x0e, 0x59, 0x43, 0xe3, 0x1c, 0x1d, 0x2a, 0x14, 0x18, 0x31, 0xce, 0x97, 0xd2, 0xca, 0x40, 0xd0, 0xd2, 0xcb, 0x73, 0x7e, 0xcc, 0x72, 0xfc, 0xc5, 0x7b, 0xf5, 0x4f, 0x0e, + 0xe7, 0x33, 0xe9, 0xcb, 0xa8, 0x3e, 0x5f, 0x18, 0x33, 0xb8, 0x17, 0x06, 0x31, 0x7a, 0x99, 0xc6, 0x77, 0xde, 0x1c, 0x34, 0xb7, 0x14, 0x20, 0x75, 0x5b, 0x84, 0x5b, 0x15, 0x1c, 0x4b, 0x69, 0x31, + 0xce, 0x38, 0x25, 0x48, 0x93, 0x09, 0xe3, 0xd8, 0x99, 0x6a, 0xb6, 0x5a, 0xba, 0xa5, 0x71, 0x99, 0x0e, 0xf2, 0x9d, 0x5f, 0xd5, 0xeb, 0x35, 0x64, 0x92, 0x27, 0x1f, 0x37, 0x71, 0x51, 0x46, 0xc0, + 0xa8, 0xdb, 0xcb, 0x06, 0x88, 0xe7, 0x88, 0xea, 0xac, 0x52, 0x9e, 0x3d, 0xc1, 0xfc, 0x18, 0x2b, 0xcb, 0x71, 0xf3, 0x47, 0xdf, 0xf7, 0xb9, 0x7c, 0xbf, 0x17, 0x82, 0x17, 0x18, 0x72, 0x67, 0x6c, + 0x7e, 0x9f, 0x8f, 0xa7, 0x2c, 0xb6, 0xc7, 0x9c, 0x9e, 0x0e, 0xb3, 0x4d, 0xe6, 0x93, 0xe4, 0x2a, 0x2f, 0x56, 0xf9, 0xa2, 0x52, 0xd7, 0xc9, 0x26, 0xc8, 0xf7, 0xa7, 0x59, 0x91, 0x2d, 0x06, 0xc7, + 0x82, 0xbd, 0x75, 0x80, 0x81, 0xb3, 0x72, 0x96, 0xee, 0x4b, 0x4f, 0xc2, 0xb2, 0xb4, 0xe7, 0xdb, 0xd3, 0x82, 0x94, 0x66, 0x42, 0xbc, 0x80, 0x7b, 0x6a, 0x01, 0xc4, 0x8c, 0xdc, 0x1c, 0x32, 0x91, + 0x21, 0xcb, 0x72, 0xfd, 0xdd, 0xed, 0xe0, 0xb8, 0x83, 0x19, 0xfb, 0x8f, 0x72, 0x94, 0xc0, 0xa7, 0x1a, 0x6b, 0xbe, 0xd2, 0xbc, 0x8c, 0xf7, 0x72, 0x74, 0xf9, 0xde, 0x23, 0x1c, 0x0e, 0x85, 0x26, + 0xef, 0x01, 0xcb, 0x9b, 0xa0, 0x29, 0x20, 0x66, 0x69, 0x69, 0x4d, 0x64, 0x55, 0xf5, 0x76, 0xde, 0xba, 0x0c, 0x13, 0x01, 0x61, 0x99, 0x2a, 0x49, 0xd7, 0xf9, 0x9e, 0xd5, 0x09, 0x11, 0x3c, 0x2c, + 0x06, 0x2e, 0x16, 0x0b, 0x9a, 0xf7, 0x9c, 0xcc, 0x2a, 0x88, 0x74, 0x23, 0x08, 0xa5, 0xe4, 0x1f, 0x17, 0x3d, 0x2f, 0x9d, 0x5d, 0x99, 0x12, 0x87, 0xe4, 0x78, 0xe0, 0xcf, 0xf8, 0xd0, 0xa8, 0xe1, + 0x73, 0xab, 0xda, 0x6b, 0xda, 0xeb, 0x3d, 0xd3, 0xb0, 0x30, 0xf3, 0xfc, 0xf2, 0xd6, 0x8f, 0xb4, 0xfe, 0xd0, 0xf3, 0x1e, 0xe0, 0x89, 0x3c, 0xb5, 0xff, 0xfc, 0x42, 0xf0, 0x05, 0xcc, 0xd0, 0xf3, + 0xa6, 0xc8, 0xb8, 0x1d, 0x67, 0x94, 0x88, 0x93, 0x8e, 0x93, 0x49, 0x84, 0xda, 0xf5, 0xdb, 0x61, 0xc2, 0xb2, 0xfc, 0x61, 0x88, 0x05, 0x26, 0xf7, 0x81, 0xf9, 0x52, 0x9d, 0xb8, 0x0d, 0x66, 0xf0, + 0x2e, 0xdc, 0x6c, 0xc2, 0xc0, 0x77, 0xba, 0xc1, 0xb7, 0x5b, 0x83, 0x50, 0x33, 0x86, 0xd9, 0x27, 0xe4, 0x76, 0x61, 0xac, 0xe6, 0xdb, 0xe4, 0xec, 0xa9, 0xd9, 0x8e, 0xe7, 0xb9, 0xbc, 0xaa, 0xd6, + 0xba, 0xa2, 0xae, 0xb0, 0x9a, 0xd6, 0xf1, 0x51, 0x3a, 0x7e, 0x58, 0xbc, 0xed, 0xf6, 0xdf, 0xb7, 0x14, 0x9f, 0xf1, 0x61, 0xbe, 0x11, 0xbd, 0x80, 0x70, 0x3d, 0xbc, 0x84, 0x25, 0x8f, 0x50, 0x94, + 0x8e, 0xa7, 0xe2, 0x98, 0xcf, 0x57, 0x12, 0xc2, 0x69, 0x1e, 0xb7, 0xd2, 0x07, 0x61, 0x9b, 0x28, 0xf5, 0x4a, 0x0d, 0xc1, 0xc3, 0x71, 0xe9, 0xb5, 0x25, 0x8c, 0xe3, 0xe9, 0xdc, 0xb6, 0x51, 0x74, + 0x56, 0x59, 0x18, 0x5d, 0x9f, 0xfb, 0x25, 0x96, 0xdb, 0x22, 0x4a, 0x5a, 0x21, 0xcb, 0x94, 0x81, 0x49, 0xe7, 0xfa, 0xbc, 0xc1, 0x32, 0x53, 0x2e, 0x20, 0x6d, 0x41, 0x87, 0xce, 0x2a, 0xe1, 0x5b, + 0x67, 0x58, 0x3f, 0x17, 0x0e, 0x73, 0x71, 0x4b, 0xbc, 0x68, 0x1f, 0x7f, 0x7f, 0x04, 0x1a, 0xdd, 0x67, 0xa0, 0xcc, 0xae, 0x8a, 0x30, 0x7d, 0x64, 0x34, 0x3e, 0x57, 0x99, 0xf4, 0x8d, 0xe8, 0x0b, + 0x86, 0xaf, 0x87, 0x63, 0x2b, 0x91, 0xf6, 0xf2, 0x44, 0x44, 0x43, 0x38, 0xa0, 0x3c, 0x7c, 0x45, 0x9d, 0x1c, 0x84, 0x5b, 0x11, 0x26, 0xee, 0x52, 0xbb, 0xdd, 0x71, 0xb7, 0xda, 0x2a, 0x26, 0xd3, + 0xb6, 0xfa, 0xf1, 0x10, 0x46, 0x6b, 0x9d, 0xc7, 0x87, 0x22, 0xd6, 0x69, 0x1e, 0xa0, 0x96, 0x1a, 0x1b, 0x45, 0xfb, 0x63, 0x7c, 0x34, 0x40, 0xc9, 0xc7, 0x0f, 0xa6, 0xe3, 0x18, 0xee, 0x9a, 0x4e, + 0xc2, 0x79, 0xb4, 0x84, 0xd9, 0xe4, 0x1c, 0x8a, 0xd0, 0x73, 0xae, 0x1d, 0xb7, 0xbc, 0xed, 0x71, 0xf2, 0x68, 0x89, 0xce, 0xaa, 0xd0, 0x4f, 0xb3, 0x87, 0xbe, 0x43, 0xe0, 0xa9, 0x78, 0xac, 0x77, + 0xaa, 0x17, 0x0c, 0x5f, 0x8f, 0x2f, 0xfa, 0xdb, 0x88, 0x19, 0x79, 0x58, 0xad, 0x56, 0x47, 0x4f, 0x36, 0xeb, 0xba, 0x34, 0xd5, 0xcd, 0x62, 0x42, 0x78, 0xbe, 0x3a, 0xd9, 0xa9, 0x0d, 0xa5, 0x9d, + 0x16, 0x4a, 0xa2, 0x36, 0x78, 0x79, 0xc2, 0xd2, 0x2c, 0xa2, 0x0d, 0xa3, 0xa9, 0x85, 0xc3, 0x6e, 0x75, 0xe8, 0x01, 0xe3, 0x84, 0x1c, 0x72, 0x56, 0xa4, 0x31, 0x86, 0x8e, 0x64, 0x20, 0xca, 0xa9, + 0xd6, 0x26, 0x17, 0x0d, 0x8b, 0xb8, 0x99, 0xd7, 0xf4, 0x03, 0x65, 0x4b, 0xf4, 0x73, 0x20, 0x5e, 0xda, 0x33, 0xbe, 0x27, 0x1f, 0xc0, 0x8f, 0xcb, 0xa7, 0xb8, 0x49, 0x16, 0xfd, 0x5c, 0x07, 0x89, + 0x78, 0x8a, 0x17, 0x3f, 0xd1, 0x9d, 0x4d, 0x3f, 0x9f, 0x4d, 0x89, 0x71, 0x1c, 0xc9, 0xcb, 0x91, 0x3e, 0xd8, 0xc7, 0x9d, 0x40, 0x02, 0x6e, 0x4b, 0xb2, 0xf9, 0x00, 0xf0, 0x5d, 0xae, 0x2f, 0x9b, + 0xd6, 0xc7, 0xfa, 0xa8, 0x07, 0x77, 0x2b, 0xb8, 0xab, 0xdc, 0xec, 0x3c, 0x60, 0x08, 0xa2, 0x2e, 0xb2, 0x99, 0xb4, 0xf7, 0xd3, 0x02, 0x9c, 0xad, 0x56, 0xd5, 0x24, 0xb4, 0xe1, 0x70, 0xa3, 0x0c, + 0x22, 0xc1, 0xd4, 0xb0, 0xe2, 0xf0, 0x20, 0x22, 0x9b, 0x6d, 0xaa, 0x1e, 0x92, 0x15, 0x83, 0x8d, 0x11, 0x6f, 0x6e, 0x7a, 0x01, 0xf4, 0xb1, 0x93, 0x1e, 0x7e, 0xa2, 0x22, 0xc2, 0x1b, 0xd1, 0x17, + 0x2c, 0x5e, 0x0f, 0xa7, 0x17, 0x4a, 0xbf, 0x07, 0xa2, 0x8f, 0x76, 0xe9, 0xbe, 0x80, 0x41, 0x74, 0xb6, 0x8c, 0x64, 0x64, 0x58, 0x97, 0x87, 0x4e, 0xf7, 0x6b, 0xfd, 0xb0, 0xdf, 0x43, 0x2e, 0xb8, + 0xe3, 0x10, 0x07, 0x67, 0x70, 0x43, 0xd8, 0x86, 0xbd, 0xbe, 0xb0, 0xad, 0x25, 0x15, 0x2a, 0x7c, 0xbf, 0xa6, 0x27, 0x50, 0xdb, 0x24, 0x50, 0x8b, 0x4d, 0x72, 0x63, 0x96, 0x39, 0x3c, 0x89, 0xdb, + 0xd2, 0x29, 0x0a, 0xca, 0xbd, 0x15, 0x57, 0x2d, 0x25, 0x14, 0xdb, 0x27, 0x57, 0xcc, 0x9b, 0xe2, 0x76, 0x5f, 0x5b, 0xd0, 0xdc, 0xa2, 0x78, 0x69, 0xbb, 0xff, 0x90, 0xa9, 0xc0, 0xa7, 0x2a, 0xbe, + 0xbd, 0x11, 0x7d, 0x6f, 0xeb, 0xef, 0x76, 0x97, 0x3d, 0xbf, 0x11, 0x73, 0x13, 0x77, 0x96, 0xec, 0x2e, 0x39, 0xbb, 0x4b, 0x99, 0xa9, 0x20, 0x83, 0x2a, 0x17, 0x45, 0x98, 0x15, 0x5c, 0x9a, 0xc2, + 0x06, 0x94, 0x47, 0x13, 0xcf, 0x99, 0x9f, 0x92, 0x35, 0x26, 0x66, 0xc7, 0x16, 0x99, 0xcd, 0xe8, 0xed, 0x24, 0xb4, 0x19, 0xca, 0xb3, 0x81, 0x03, 0x7e, 0xde, 0x2c, 0xc2, 0xf2, 0x5c, 0x28, 0x25, + 0xa7, 0x44, 0x2d, 0xe2, 0xed, 0x96, 0x3d, 0x94, 0x1f, 0xe7, 0xc2, 0x59, 0xae, 0x68, 0x02, 0x19, 0x51, 0x6a, 0xf9, 0x62, 0x3a, 0x17, 0x66, 0x1f, 0xbe, 0x76, 0xc2, 0x03, 0x1e, 0x67, 0x58, 0xb8, + 0xe5, 0xf4, 0xad, 0xee, 0xf1, 0x63, 0x83, 0x6e, 0xfe, 0x44, 0x7e, 0xfd, 0x27, 0xc2, 0x97, 0x96, 0x88, 0xef, 0x67, 0xd3, 0x2b, 0xc1, 0xdf, 0xa3, 0x47, 0x9a, 0xd0, 0x0a, 0x9a, 0x48, 0x0e, 0x6c, + 0x61, 0xa7, 0x8e, 0x39, 0x70, 0xca, 0x12, 0x51, 0xcc, 0x23, 0x86, 0xdb, 0x03, 0xb5, 0xed, 0xc9, 0x06, 0x1e, 0x70, 0x55, 0x08, 0x74, 0xe9, 0x80, 0x02, 0x3a, 0xd5, 0x4d, 0x2c, 0xab, 0xd4, 0x8d, + 0x79, 0x27, 0xee, 0x91, 0x98, 0xdf, 0x99, 0x83, 0xbb, 0xaf, 0x97, 0x71, 0x6f, 0x69, 0x6b, 0x40, 0x45, 0xf8, 0xa2, 0xde, 0x67, 0x25, 0x7e, 0x3e, 0x64, 0xa8, 0xf7, 0xdc, 0x12, 0xfb, 0x39, 0x11, + 0xe1, 0x2d, 0xac, 0xfe, 0x7f, 0x7f, 0xdc, 0x76, 0xcb, 0x69, 0x95, 0x4d, 0xf3, 0x22, 0x4c, 0xc2, 0x2a, 0x6c, 0xde, 0xbc, 0x6a, 0xd0, 0x97, 0x5a, 0xb3, 0xcf, 0x45, 0xf0, 0xdf, 0x79, 0xa4, 0xec, + 0x13, 0x2b, 0x8b, 0xa7, 0xce, 0x6b, 0x45, 0xf7, 0xd7, 0xef, 0xf4, 0x3d, 0x94, 0x2e, 0x30, 0x3f, 0x8c, 0x4e, 0xf8, 0xcb, 0x8d, 0x57, 0x22, 0x0f, 0x1e, 0x78, 0xf9, 0x1c, 0x45, 0x6a, 0xc6, 0xd3, + 0x32, 0xce, 0xaa, 0x07, 0x8f, 0x94, 0xd3, 0x17, 0x54, 0x4c, 0x2b, 0xfe, 0x18, 0xef, 0x57, 0xef, 0x4c, 0xea, 0xfa, 0xe6, 0x0b, 0x20, 0xd3, 0xc1, 0x2d, 0xb2, 0xbf, 0xef, 0xc5, 0x7a, 0x7d, 0xf5, + 0xcf, 0x80, 0xdf, 0x68, 0x94, 0x81, 0x59, 0xbc, 0x55, 0x61, 0x98, 0xbe, 0xe7, 0x55, 0xdd, 0xf9, 0x08, 0x2f, 0xcf, 0x7e, 0x04, 0x95, 0x81, 0x37, 0xfd, 0x98, 0xaf, 0xb7, 0x5b, 0xd7, 0x3c, 0x15, + 0xae, 0x77, 0xff, 0xdf, 0xdf, 0x5c, 0x41, 0x69, 0x99, 0x7f, 0x38, 0x93, 0x40, 0xe8, 0x16, 0xd1, 0xdf, 0x3a, 0x84, 0xae, 0x0f, 0xfc, 0x32, 0xcb, 0x32, 0xf4, 0xd3, 0x77, 0x71, 0x75, 0xf3, 0x43, + 0xd7, 0x97, 0xfc, 0xe4, 0x33, 0xaa, 0x2e, 0xfd, 0xf0, 0x3e, 0x58, 0x0b, 0xf9, 0xed, 0xd3, 0x65, 0x65, 0x16, 0xd5, 0xfd, 0xe7, 0xeb, 0xd4, 0xca, 0xba, 0x6f, 0xac, 0x08, 0xfc, 0x59, 0xb9, 0x83, + 0x4f, 0x1f, 0xe5, 0xb1, 0x13, 0x17, 0x7c, 0xb2, 0xe2, 0xc1, 0x1b, 0xf1, 0xd9, 0xf4, 0xfd, 0xf0, 0x4e, 0x00, 0xd3, 0x5f, 0x8f, 0xa4, 0xc2, 0xa9, 0x91, 0x9c, 0x8e, 0x2e, 0x3b, 0x23, 0x0a, 0x86, + 0x83, 0x06, 0xe0, 0x46, 0xba, 0xed, 0x9d, 0x41, 0x06, 0x95, 0xc3, 0x4c, 0xd9, 0xc4, 0xca, 0x81, 0x65, 0x75, 0x44, 0xdf, 0x6e, 0x09, 0xdc, 0x85, 0xf1, 0xec, 0x40, 0x22, 0x73, 0xda, 0x3b, 0x6d, + 0xcf, 0x7e, 0x3f, 0x51, 0xa3, 0x65, 0x66, 0x67, 0x6d, 0x0f, 0xcd, 0x6d, 0xae, 0xb1, 0xe5, 0xb0, 0x9e, 0x9c, 0xd6, 0x0d, 0x0e, 0x11, 0x91, 0xa2, 0xa8, 0x3f, 0xb8, 0x71, 0xbf, 0x0c, 0xf1, 0x51, + 0xcc, 0xe4, 0xcf, 0x12, 0xe2, 0xaf, 0xb7, 0x59, 0x57, 0x65, 0xd7, 0x0f, 0x5a, 0x99, 0xfe, 0xa7, 0x39, 0xfb, 0xe9, 0xb9, 0xfb, 0xb1, 0x8d, 0xdf, 0x98, 0xf3, 0x87, 0xcf, 0x02, 0x3d, 0x19, 0xd6, + 0x78, 0xfb, 0x1b, 0xb3, 0xe9, 0x97, 0x0b, 0xd3, 0x2b, 0xe9, 0x71, 0x1f, 0x89, 0xcd, 0xa0, 0x81, 0x00, 0x2c, 0x75, 0xdd, 0x6c, 0xe2, 0x8c, 0x9d, 0xe8, 0x83, 0x94, 0xe4, 0x86, 0x2a, 0xba, 0x04, + 0x3e, 0x39, 0x93, 0x72, 0x42, 0x1d, 0x38, 0x83, 0x3e, 0xfa, 0xdd, 0xdc, 0xae, 0x27, 0x1c, 0x5d, 0x68, 0x90, 0x41, 0xb3, 0x33, 0xb8, 0xe2, 0xfb, 0x89, 0xaf, 0x59, 0x06, 0xa3, 0xa8, 0xab, 0x12, + 0xe2, 0x09, 0xdd, 0xe9, 0x04, 0x4b, 0x08, 0x70, 0x8d, 0xac, 0xc2, 0x64, 0xae, 0x03, 0xcf, 0xfb, 0xda, 0xbf, 0xcb, 0xe7, 0xfb, 0x0b, 0xdd, 0x33, 0x85, 0x53, 0xbe, 0xd0, 0xbe, 0xae, 0x75, 0x9f, + 0xaf, 0x5c, 0xb6, 0xcf, 0x46, 0x58, 0x94, 0xe2, 0x42, 0x88, 0x63, 0xdf, 0xd8, 0x54, 0xe6, 0x21, 0x9b, 0x27, 0xa1, 0x4e, 0xd9, 0xdb, 0x45, 0xa0, 0x1c, 0x4c, 0x76, 0x17, 0x6d, 0x96, 0xf0, 0x5e, + 0x2f, 0x41, 0x35, 0x74, 0x68, 0x9c, 0x6c, 0x43, 0x26, 0x02, 0x4f, 0x7a, 0xc7, 0xb9, 0xa2, 0x62, 0x57, 0x5b, 0xd2, 0x1d, 0x48, 0x81, 0x45, 0x0d, 0x4e, 0x62, 0x01, 0x1f, 0x5a, 0xfb, 0xfb, 0x14, + 0xe3, 0x5a, 0x0a, 0x59, 0x2b, 0x44, 0x28, 0xe5, 0x8f, 0xaa, 0xdc, 0x7d, 0x1a, 0xe4, 0x03, 0xfd, 0xe1, 0x8b, 0x6c, 0xff, 0x2e, 0x97, 0xc7, 0x78, 0xde, 0xaf, 0x6b, 0xcc, 0xa7, 0x19, 0xf1, 0xe0, + 0xeb, 0xd8, 0x66, 0xfe, 0x56, 0x7a, 0xfd, 0x2a, 0x10, 0x7e, 0x2a, 0x7b, 0xf4, 0x8c, 0x2a, 0xf2, 0xfd, 0x07, 0x2e, 0xdf, 0xe9, 0xfb, 0xe5, 0x31, 0x65, 0x7e, 0xc0, 0xe9, 0x0a, 0x62, 0x49, 0x35, + 0x5c, 0x89, 0xe7, 0xdd, 0x0c, 0x2a, 0xa2, 0xba, 0x1f, 0xda, 0x35, 0xd9, 0x07, 0xfc, 0x36, 0xa8, 0xbe, 0x7a, 0xcd, 0xaf, 0xad, 0x54, 0x1e, 0x8c, 0x06, 0xff, 0x05, 0x61, 0xcf, 0x58, 0x39, 0xd7, + 0x06, 0x2e, 0xef, 0x7d, 0xa6, 0xaf, 0x64, 0x7e, 0xcf, 0x60, 0x88, 0x04, 0x86, 0xae, 0xe4, 0xa1, 0xd0, 0x2c, 0x1c, 0x6c, 0x83, 0xc1, 0xc9, 0x78, 0xdb, 0xa3, 0x58, 0xbd, 0x66, 0x59, 0x7a, 0xab, + 0xe0, 0x88, 0x3e, 0x0c, 0xd0, 0xba, 0x81, 0x62, 0xec, 0x44, 0x9b, 0x7a, 0xc3, 0xd4, 0xf3, 0x6e, 0xd2, 0xf2, 0x14, 0xea, 0x18, 0x64, 0xa1, 0x6e, 0x09, 0x59, 0x5f, 0x69, 0xb2, 0xae, 0x42, 0x3a, + 0xe9, 0xe3, 0xc0, 0xd2, 0x3e, 0xa2, 0x3a, 0x9a, 0xae, 0x56, 0xbb, 0xf5, 0x73, 0x3a, 0xfd, 0x7f, 0x5b, 0xa6, 0xe5, 0xc6, 0x33, 0x3b, 0x73, 0xdc, 0xa9, 0x57, 0xbc, 0x06, 0xd4, 0xe2, 0x2f, 0x02, + 0x06, 0xbc, 0xe1, 0xa1, 0xff, 0x7e, 0x6b, 0x25, 0x7b, 0xf9, 0x53, 0x5c, 0x75, 0xa2, 0x6f, 0xb5, 0xf6, 0xdf, 0xd2, 0x11, 0xb0, 0x5f, 0xe0, 0xd7, 0x7c, 0xf7, 0xd7, 0xdc, 0xa9, 0x3b, 0xf9, 0x57, + 0xb7, 0x01, 0x2f, 0xd7, 0x6c, 0xee, 0x9b, 0x75, 0xfa, 0xb6, 0x92, 0xd0, 0xcd, 0x0f, 0x7e, 0x72, 0xa4, 0xdc, 0xa9, 0x22, 0xfa, 0xc9, 0x96, 0x7b, 0x51, 0x78, 0xe0, 0x5f, 0x37, 0x2d, 0xa8, 0xef, + 0x34, 0x5d, 0xfd, 0xa2, 0x43, 0xdc, 0x69, 0xba, 0xfa, 0x65, 0x83, 0xf6, 0xe7, 0x06, 0x3d, 0x37, 0x0f, 0xe6, 0x6f, 0x9d, 0xb2, 0xf1, 0xaf, 0xd9, 0x69, 0x6e, 0x79, 0xae, 0xdd, 0xa2, 0x7f, 0x9d, + 0x9d, 0xdf, 0x5a, 0x00, 0x7d, 0xf5, 0x87, 0x7c, 0xba, 0xe9, 0x85, 0xb1, 0x3b, 0x75, 0xd3, 0xaa, 0xe8, 0xa7, 0xb6, 0x69, 0x07, 0xee, 0x2b, 0xf8, 0xc0, 0x7d, 0x7d, 0x77, 0x64, 0xe3, 0xee, 0x2f, + 0x29, 0x41, 0xdf, 0x7b, 0xd1, 0xbe, 0x3c, 0x60, 0xbe, 0x29, 0xac, 0xd7, 0x6c, 0x9d, 0xcf, 0xd2, 0xe6, 0xcd, 0x2d, 0x73, 0xfd, 0x5c, 0xd8, 0xcd, 0xbd, 0x24, 0xcf, 0x8a, 0x6a, 0xea, 0x15, 0x6e, + 0xf9, 0xa0, 0xf0, 0x6b, 0x98, 0xd4, 0x45, 0x52, 0x17, 0x81, 0xf9, 0x6e, 0x30, 0x7d, 0x17, 0x78, 0x37, 0x6d, 0xd7, 0x6e, 0xfe, 0x3b, 0x2a, 0xa7, 0xbd, 0x99, 0xbc, 0xe7, 0x49, 0xc0, 0x77, 0x32, + 0x5e, 0xbe, 0xb6, 0x97, 0x98, 0xb6, 0x61, 0x15, 0x64, 0xf5, 0xb5, 0xf9, 0xc4, 0x5b, 0xbb, 0x89, 0x6f, 0x98, 0xc4, 0x6e, 0x93, 0xde, 0x67, 0xf9, 0xaf, 0x6d, 0xce, 0xa1, 0xdb, 0xc4, 0xc3, 0x3b, + 0x8e, 0x98, 0x4f, 0xb7, 0x53, 0xb3, 0xaa, 0x0b, 0x33, 0x9e, 0xda, 0x59, 0xf2, 0x02, 0xf8, 0x7d, 0x0e, 0xc8, 0x2e, 0x86, 0x85, 0x59, 0xbd, 0xe6, 0xcf, 0x01, 0xbf, 0xe6, 0xb7, 0x6f, 0x90, 0x17, + 0x99, 0x5f, 0xbc, 0x25, 0xea, 0x7c, 0x63, 0xbc, 0xdb, 0x46, 0xeb, 0x5f, 0x23, 0xa5, 0x3e, 0xb7, 0xa9, 0xfb, 0x62, 0x25, 0xbd, 0x20, 0x94, 0x4f, 0x5f, 0x6c, 0xfe, 0x77, 0xae, 0x02, 0xbe, 0xdf, + 0xbf, 0x60, 0x6a, 0x67, 0xc9, 0xc7, 0xe6, 0xf0, 0xb7, 0x1f, 0xa9, 0xde, 0x57, 0x2f, 0xec, 0xeb, 0xf8, 0x2b, 0xb7, 0xab, 0xa6, 0x1f, 0xf7, 0x81, 0x5f, 0x5f, 0xb4, 0xfc, 0x86, 0xb8, 0x40, 0xf3, + 0xc2, 0xe5, 0x1f, 0xfc, 0x0d, 0x5d, 0x0c, 0xa0, 0xd7, 0x87, 0xc6, 0x28, 0xd1, 0x63, 0x6a, 0x86, 0x3d, 0x17, 0x06, 0xf1, 0x9f, 0x96, 0x79, 0x8f, 0x30, 0xfd, 0x9f, 0x51, 0x4a, 0xec, 0x01, 0x9a, + 0x77, 0xe1, 0xb8, 0x3f, 0x1f, 0x1e, 0xe1, 0xf3, 0x3d, 0x8b, 0x6b, 0x2c, 0x3e, 0x77, 0x7e, 0x67, 0x36, 0xbd, 0x77, 0xf5, 0x92, 0xed, 0x3f, 0x92, 0x1f, 0x31, 0x6f, 0x6f, 0x4f, 0x24, 0x24, 0x0c, + 0xda, 0xf3, 0x1e, 0xdb, 0xcd, 0xcc, 0x75, 0x03, 0x79, 0xa0, 0xcf, 0xb3, 0x44, 0x2c, 0xa8, 0xd5, 0x51, 0x64, 0xb3, 0xf3, 0x02, 0xe9, 0x39, 0x2c, 0x93, 0x69, 0x55, 0xcd, 0xec, 0x3a, 0x21, 0x4b, + 0x6f, 0x71, 0x8e, 0x4e, 0x5a, 0x7a, 0x0e, 0x75, 0x3e, 0x48, 0xf8, 0x56, 0x9e, 0x25, 0x0c, 0xbb, 0xcd, 0x71, 0xd5, 0x0d, 0xe2, 0x0a, 0x3e, 0xc7, 0x58, 0xcc, 0x84, 0xff, 0x8e, 0x99, 0x70, 0x59, + 0x56, 0xed, 0x2c, 0xf5, 0x42, 0x7f, 0x9a, 0x17, 0x6e, 0x55, 0x85, 0x0f, 0x5d, 0xb2, 0xc4, 0x53, 0x29, 0x05, 0xf7, 0x7f, 0xe2, 0x43, 0x97, 0xfb, 0x72, 0x63, 0x4a, 0x8c, 0x4b, 0x2e, 0xa0, 0x7c, + 0xa3, 0xde, 0x1e, 0x64, 0x97, 0x1b, 0x9a, 0x78, 0x3b, 0x53, 0x0f, 0x51, 0x37, 0xd3, 0x2d, 0x9c, 0xc0, 0x55, 0x11, 0xc2, 0xa4, 0x03, 0xec, 0xaf, 0x22, 0x12, 0x0e, 0xc3, 0x65, 0xe3, 0x94, 0xf9, + 0x0c, 0xb2, 0x78, 0x4f, 0x5d, 0x1f, 0x0f, 0xea, 0x1e, 0xaf, 0xa2, 0xae, 0x8a, 0x64, 0xc0, 0x9d, 0xb0, 0x7b, 0x04, 0x98, 0xdb, 0xfb, 0x78, 0xdf, 0xec, 0x4e, 0x62, 0x9c, 0x0d, 0xc4, 0x62, 0x0e, + 0xba, 0x7f, 0xb2, 0x09, 0x70, 0x17, 0xc8, 0x6b, 0x22, 0x68, 0xe5, 0x16, 0xd7, 0xf1, 0xf4, 0x0f, 0x37, 0x2f, 0x9f, 0x09, 0x69, 0x7d, 0xf0, 0x1b, 0x1f, 0x50, 0x7e, 0xbd, 0x73, 0x49, 0x74, 0x1f, + 0x81, 0xe5, 0xba, 0x3c, 0x28, 0xd5, 0xaa, 0x5b, 0x82, 0x41, 0xc1, 0x62, 0x31, 0x7f, 0x0c, 0xe5, 0x18, 0x3c, 0x5a, 0x2b, 0x33, 0xdc, 0x03, 0xa0, 0xab, 0x60, 0xa7, 0xa1, 0x6f, 0x1d, 0x1d, 0x3c, + 0x4c, 0x86, 0xad, 0x0d, 0xf0, 0xfb, 0x49, 0xda, 0x32, 0xe9, 0x21, 0x94, 0xe7, 0x87, 0x35, 0xb1, 0x36, 0x05, 0xe5, 0x10, 0x28, 0xae, 0xb8, 0xd9, 0xc6, 0x0b, 0xe6, 0xb8, 0xb6, 0xb4, 0xf5, 0x8e, + 0x62, 0x11, 0x7d, 0x63, 0x51, 0xcf, 0x45, 0x8f, 0x5c, 0xdb, 0x36, 0xce, 0xde, 0x8d, 0x88, 0xd7, 0xf5, 0xf2, 0xc6, 0x0f, 0xf7, 0xa5, 0xd3, 0xc9, 0x35, 0x5d, 0xf2, 0x66, 0x49, 0xfd, 0xac, 0x04, + 0xdf, 0x57, 0x24, 0x8b, 0x3a, 0x76, 0xa7, 0x4e, 0x66, 0x7f, 0x38, 0xb5, 0xd0, 0x5b, 0x65, 0xc3, 0xbf, 0x71, 0x17, 0x7e, 0x53, 0x80, 0xf2, 0xb8, 0x2e, 0xee, 0xdf, 0x79, 0x35, 0xae, 0xda, 0xd0, + 0xa9, 0x82, 0xf7, 0xb7, 0xbb, 0x7d, 0xe2, 0x2d, 0x57, 0x3f, 0xe8, 0x73, 0xb7, 0x88, 0xc3, 0xf4, 0xf4, 0x59, 0xa5, 0xf8, 0x69, 0x9e, 0xe6, 0x71, 0xed, 0x87, 0xe9, 0xef, 0xe6, 0x29, 0xfc, 0x54, + 0xd9, 0xe0, 0xfb, 0x3f, 0xf1, 0xc1, 0x5c, 0x5f, 0x6e, 0x4c, 0xe1, 0x71, 0x25, 0x85, 0x0f, 0x34, 0x87, 0x15, 0x1b, 0x05, 0x5b, 0xef, 0x64, 0xcf, 0x16, 0x32, 0x14, 0x41, 0xa3, 0xd0, 0x14, 0x5a, + 0x0a, 0x07, 0xc0, 0x9a, 0x5c, 0x57, 0xd0, 0xcc, 0x91, 0xf0, 0x63, 0xba, 0x14, 0xb3, 0xd5, 0x42, 0x8d, 0xc1, 0x19, 0xc3, 0x9f, 0x1d, 0x72, 0x47, 0x25, 0xed, 0xc1, 0x3c, 0x9f, 0x45, 0x04, 0x35, + 0xb5, 0xbc, 0x28, 0x95, 0xd5, 0x20, 0x9b, 0xf0, 0x7c, 0xbb, 0x06, 0xf7, 0x7d, 0x2d, 0x51, 0x5d, 0xf7, 0x27, 0xf3, 0xf4, 0xd3, 0x37, 0x7b, 0x7b, 0xf5, 0xf8, 0xe2, 0xec, 0x9d, 0x06, 0x6e, 0x9c, + 0xbb, 0xc5, 0x87, 0x3f, 0xf8, 0x67, 0xec, 0x3f, 0x73, 0xcc, 0x83, 0x4d, 0x83, 0x5f, 0x10, 0xfc, 0x8c, 0xa9, 0x7e, 0x4b, 0xfe, 0x03, 0xf1, 0xf7, 0x4b, 0xd3, 0x57, 0xda, 0xbf, 0x47, 0x7b, 0xa2, + 0x88, 0x93, 0x0e, 0xd9, 0x38, 0x4a, 0x4a, 0x67, 0x4b, 0x46, 0xd3, 0x2c, 0xd8, 0xa3, 0x1b, 0x6f, 0x25, 0xb4, 0x69, 0xbf, 0x53, 0x71, 0xa7, 0x66, 0x09, 0x4f, 0x3b, 0x2a, 0x7b, 0x1a, 0x0c, 0x5d, + 0x93, 0x4a, 0x28, 0x22, 0x4b, 0x22, 0x7c, 0xd5, 0xce, 0x72, 0x9e, 0xa2, 0x6a, 0xa4, 0x5e, 0x43, 0xf5, 0x66, 0xb1, 0x38, 0x10, 0xe4, 0x9e, 0x36, 0xc5, 0xcd, 0x70, 0xac, 0xb5, 0x54, 0x29, 0x59, + 0x64, 0xd4, 0x6e, 0xde, 0xad, 0x8d, 0x77, 0x0f, 0x20, 0xf4, 0xa9, 0xe8, 0xce, 0xcf, 0x84, 0x3f, 0xa0, 0xb9, 0xb6, 0x98, 0x47, 0xc7, 0x45, 0x78, 0x42, 0xbb, 0xae, 0xb5, 0x96, 0xb3, 0xc0, 0x00, + 0xb8, 0xdc, 0xcd, 0xf5, 0x1d, 0x60, 0xef, 0xac, 0x6c, 0xb2, 0xdc, 0x61, 0x5a, 0xc6, 0xe1, 0x2b, 0x93, 0x8d, 0xc5, 0xc0, 0xef, 0x66, 0xc1, 0xda, 0x88, 0x31, 0xd5, 0x04, 0xac, 0x25, 0x82, 0x4a, + 0xa2, 0x20, 0xb4, 0xc1, 0x76, 0xdd, 0x13, 0xb1, 0x48, 0x5b, 0xf5, 0x22, 0x34, 0x1d, 0x79, 0xbb, 0xa0, 0x52, 0x16, 0x5a, 0x2c, 0xf5, 0x73, 0x1d, 0x56, 0xa8, 0xf5, 0x1c, 0x0b, 0xba, 0x65, 0xe1, + 0xda, 0xf5, 0x5b, 0xce, 0xf8, 0x6d, 0xab, 0x97, 0xcb, 0xed, 0x9b, 0x9c, 0xf2, 0x9f, 0xf6, 0xfd, 0x6e, 0x2d, 0xe6, 0xfb, 0x3b, 0xa8, 0xff, 0xc6, 0x22, 0x73, 0x21, 0xfc, 0x81, 0xf7, 0xe5, 0x74, + 0x6c, 0x8f, 0x81, 0x76, 0x8e, 0x38, 0xa2, 0x9e, 0x99, 0x75, 0xdf, 0xc4, 0xb4, 0x8d, 0xc0, 0x5a, 0xba, 0xa2, 0x88, 0xf8, 0x00, 0x1b, 0x15, 0x0e, 0xc2, 0xcd, 0x6e, 0x11, 0xf8, 0x15, 0xc2, 0x1c, + 0xdb, 0x40, 0x23, 0xf7, 0x90, 0x76, 0xa2, 0x9a, 0xd4, 0xf1, 0xba, 0x25, 0x40, 0xfa, 0xeb, 0x33, 0x27, 0x08, 0x66, 0x19, 0xed, 0xd7, 0xfb, 0x21, 0x9a, 0x6f, 0xce, 0x7e, 0x7b, 0x6a, 0xad, 0x85, + 0x4e, 0x03, 0x33, 0x15, 0x36, 0x9e, 0xf3, 0xba, 0x3c, 0x72, 0x1b, 0x80, 0x37, 0xb5, 0x51, 0x3e, 0xd1, 0x7d, 0x64, 0xda, 0xdc, 0x27, 0xf4, 0xd8, 0x27, 0x0d, 0x3f, 0xe9, 0x92, 0xbe, 0xf3, 0x3b, + 0x1f, 0x5f, 0xe1, 0xa6, 0x27, 0xf3, 0xf7, 0x24, 0xcc, 0xbf, 0x1e, 0x7d, 0x10, 0x6c, 0x83, 0x43, 0x3b, 0xe2, 0xb0, 0x33, 0x11, 0x0c, 0x6a, 0xcd, 0x19, 0xb7, 0x14, 0xe8, 0x6a, 0xb6, 0xdf, 0xc0, + 0xeb, 0x03, 0x06, 0xc8, 0x74, 0xbe, 0x80, 0x45, 0x6d, 0x01, 0xb2, 0x91, 0x0d, 0x52, 0x9a, 0x96, 0x7b, 0x5b, 0x68, 0x31, 0x97, 0xd0, 0x09, 0x79, 0xc0, 0xa3, 0xc0, 0x05, 0x96, 0xd8, 0x4a, 0x62, + 0xce, 0x2a, 0x1f, 0x20, 0x9b, 0xba, 0x9e, 0xec, 0x74, 0xbc, 0x4b, 0x27, 0x98, 0x13, 0xe6, 0x87, 0x1f, 0x8c, 0xa0, 0xf7, 0xab, 0x3f, 0x2a, 0x9d, 0x23, 0xba, 0x5b, 0xff, 0x5b, 0x2c, 0x3c, 0x02, + 0xc3, 0x91, 0x0c, 0x0d, 0x14, 0x72, 0x22, 0x51, 0x83, 0xe6, 0xd3, 0xc3, 0xba, 0xa4, 0xb1, 0x64, 0xe5, 0x6c, 0x7c, 0xb7, 0x19, 0x7c, 0x77, 0x58, 0xa3, 0x30, 0xb2, 0x70, 0x0b, 0x74, 0x3b, 0x6b, + 0x7a, 0x5e, 0x03, 0x4e, 0xec, 0xa0, 0xcc, 0xa2, 0x90, 0x42, 0xe0, 0x48, 0x0a, 0x9c, 0xb9, 0x7e, 0x88, 0xf9, 0x95, 0xbe, 0x15, 0x7b, 0x68, 0xc8, 0x8b, 0x5d, 0x92, 0x29, 0xc4, 0xd9, 0x2c, 0x17, + 0xab, 0x4a, 0x9f, 0x88, 0x26, 0x37, 0x26, 0x7b, 0xef, 0xdd, 0x99, 0x75, 0xdf, 0x97, 0xfa, 0x4c, 0x8d, 0xae, 0x2b, 0xc9, 0x0b, 0x1e, 0x2f, 0x07, 0x53, 0x7c, 0x5c, 0x75, 0xae, 0x06, 0xde, 0x2c, + 0x76, 0x0b, 0x06, 0x43, 0xea, 0xe4, 0xb4, 0xcc, 0x93, 0xd3, 0x72, 0x75, 0x1e, 0x54, 0xae, 0x14, 0x14, 0xa0, 0xda, 0x81, 0x46, 0x31, 0xa9, 0xdd, 0xf3, 0xd6, 0xf0, 0x72, 0x15, 0x14, 0x2c, 0xc2, + 0x9d, 0x2c, 0x18, 0x7f, 0x7f, 0x34, 0x27, 0x42, 0xb7, 0xc8, 0x56, 0x2c, 0x5c, 0xa5, 0x41, 0x98, 0xf0, 0xdc, 0xda, 0xa4, 0x12, 0x24, 0x99, 0x35, 0xa6, 0x94, 0x6f, 0x66, 0xa7, 0x42, 0x1a, 0xa0, + 0xe7, 0xe6, 0xf4, 0x5b, 0x5b, 0xe0, 0x17, 0xd5, 0xf0, 0x8b, 0x07, 0xe7, 0x73, 0xc7, 0xdc, 0x3b, 0xd5, 0xa9, 0x1e, 0x4b, 0x03, 0xf8, 0x3f, 0xd2, 0xe0, 0xff, 0x3f, 0x69, 0x90, 0x17, 0x61, 0x62, + 0x3e, 0xb4, 0x94, 0x9e, 0x89, 0x72, 0x7c, 0xa5, 0xf9, 0xca, 0xe5, 0x61, 0x62, 0x5e, 0x82, 0x3d, 0x47, 0xb0, 0xb9, 0xbb, 0xaa, 0x97, 0xcb, 0x16, 0x3f, 0xe4, 0x8e, 0x39, 0xf1, 0x91, 0x7c, 0x22, + 0xb2, 0x4d, 0x7a, 0x04, 0xa4, 0x5e, 0xd1, 0x66, 0xb2, 0xea, 0x6e, 0x28, 0x9a, 0x9f, 0xf9, 0x8b, 0x8a, 0x27, 0x25, 0x01, 0xb0, 0xb7, 0xb5, 0x02, 0xb1, 0x36, 0xc3, 0xa5, 0xca, 0xbe, 0x09, 0x22, + 0x15, 0x33, 0x57, 0xee, 0xb9, 0x58, 0x50, 0xb3, 0xd2, 0xda, 0x65, 0x39, 0xc0, 0x95, 0x43, 0x02, 0x44, 0xa5, 0x79, 0x3c, 0x8c, 0xd4, 0x9f, 0xde, 0x5c, 0xd3, 0xf7, 0x75, 0xcb, 0xe7, 0x34, 0xfa, + 0x0b, 0xcd, 0x0b, 0x0a, 0x97, 0xa3, 0x29, 0x38, 0x4e, 0x67, 0xb7, 0x17, 0x74, 0x58, 0xe6, 0xc7, 0x0a, 0x6d, 0x58, 0xb6, 0x6a, 0x79, 0x1d, 0xd2, 0x0b, 0x52, 0x44, 0x42, 0x6b, 0x79, 0x22, 0xb7, + 0x84, 0x64, 0xb1, 0xa8, 0xbe, 0xa2, 0x52, 0x83, 0xb2, 0xe7, 0x00, 0x9f, 0xc5, 0x4d, 0xe3, 0x9d, 0x4e, 0xa2, 0xbd, 0x29, 0xb2, 0x99, 0x69, 0x84, 0xa4, 0x78, 0x88, 0x45, 0xf8, 0xec, 0x17, 0xba, + 0x8c, 0xd1, 0x58, 0x43, 0xac, 0x6c, 0x74, 0x85, 0x2e, 0xc4, 0xd2, 0x9e, 0x3f, 0xab, 0x30, 0xdd, 0x68, 0x44, 0xe8, 0x9f, 0xaf, 0xdb, 0x23, 0x0a, 0xe3, 0xa0, 0xbf, 0x9e, 0xdd, 0x41, 0xfe, 0x20, + 0x7f, 0x41, 0xf9, 0xbd, 0x08, 0x0e, 0xfa, 0x2d, 0x7f, 0xf0, 0xaf, 0x47, 0x60, 0x53, 0x9d, 0xb5, 0x5b, 0xad, 0x76, 0x09, 0x20, 0xf5, 0x92, 0xde, 0x1c, 0x1c, 0x36, 0x5f, 0xb7, 0xcd, 0x7c, 0x7d, + 0x1c, 0x5c, 0x7e, 0xae, 0x2d, 0x62, 0x4b, 0xe8, 0xda, 0x8c, 0x54, 0xea, 0xa5, 0x23, 0x30, 0xb8, 0xc1, 0x60, 0x2d, 0xbb, 0x9d, 0xb0, 0x22, 0xaa, 0x10, 0x41, 0xb6, 0xe7, 0x27, 0x03, 0xdb, 0x24, + 0xdc, 0x30, 0x94, 0xcc, 0x39, 0xf0, 0x7b, 0x60, 0x55, 0x88, 0xa8, 0x06, 0xc2, 0xa6, 0x17, 0xfe, 0x3b, 0xd3, 0xf1, 0x43, 0x43, 0xbd, 0x3f, 0x21, 0x9f, 0x73, 0x02, 0xbd, 0x52, 0xbd, 0xc0, 0xf4, + 0x7a, 0x3c, 0xb6, 0x35, 0x21, 0x97, 0x78, 0xdc, 0x16, 0xb6, 0xb0, 0xd5, 0x44, 0xd2, 0x9a, 0x3d, 0xb1, 0x03, 0x9b, 0x02, 0x56, 0xce, 0xe0, 0x69, 0x3b, 0xcb, 0x16, 0x4b, 0x3f, 0x85, 0x76, 0xba, + 0xc6, 0x54, 0xe7, 0x3d, 0x31, 0xdb, 0xc2, 0x39, 0x67, 0xe6, 0x07, 0x12, 0x59, 0x11, 0xf6, 0x52, 0x35, 0xb3, 0x25, 0x2c, 0x1f, 0x60, 0x08, 0x5e, 0xd0, 0x88, 0xd6, 0xe7, 0xd2, 0xcc, 0xf3, 0xc2, + 0x8c, 0x4d, 0x4e, 0x55, 0x88, 0xcd, 0x14, 0xf3, 0xb9, 0xb5, 0xe7, 0x1b, 0x3b, 0x42, 0xff, 0x61, 0xc7, 0xff, 0x8f, 0xd9, 0xf1, 0x0e, 0x60, 0xff, 0x04, 0x3f, 0xde, 0x07, 0x6a, 0x24, 0x47, 0xc2, + 0xf3, 0x34, 0xe5, 0x3c, 0xef, 0x38, 0x10, 0xdd, 0x0e, 0xa4, 0x0e, 0x33, 0xc8, 0xc6, 0xe7, 0xe9, 0x3c, 0xa5, 0xe6, 0x2c, 0x3d, 0x64, 0x40, 0x1a, 0xea, 0x87, 0x73, 0x87, 0x75, 0xfd, 0xf9, 0x90, + 0xf6, 0x19, 0x99, 0x8a, 0x7d, 0x7f, 0xcc, 0x05, 0xc5, 0x31, 0x18, 0x37, 0x5c, 0xd8, 0x01, 0x41, 0x51, 0x35, 0x0a, 0xa2, 0x15, 0xd2, 0xe6, 0x73, 0x23, 0xf1, 0x55, 0x4f, 0x0d, 0xd2, 0x39, 0x43, + 0xe5, 0xe3, 0x14, 0xc2, 0x9f, 0x2d, 0xbe, 0x67, 0xea, 0x15, 0xbc, 0xd2, 0xbc, 0x00, 0xf1, 0x66, 0xe7, 0x8d, 0xaa, 0x53, 0x70, 0x52, 0x4b, 0xfb, 0xac, 0x9d, 0x10, 0x61, 0x91, 0x63, 0x84, 0x6c, + 0x00, 0xce, 0xc9, 0x67, 0x38, 0x35, 0xc4, 0x66, 0x44, 0x18, 0xc1, 0x00, 0xc0, 0x51, 0x47, 0x65, 0x73, 0x86, 0xa1, 0xfd, 0xcc, 0xd1, 0xdd, 0xa3, 0x22, 0xb7, 0x1c, 0x02, 0x1e, 0x7b, 0xa5, 0x33, + 0xe3, 0x1d, 0xe8, 0x4a, 0x09, 0x89, 0x1a, 0xf3, 0xc3, 0x61, 0xb6, 0xd5, 0xe6, 0x34, 0xbe, 0x3c, 0xca, 0x89, 0x3a, 0x97, 0x49, 0xbd, 0xc3, 0xc6, 0x14, 0x34, 0xb9, 0x94, 0x0c, 0x9c, 0x56, 0x66, + 0x71, 0x09, 0x0d, 0x0c, 0xc2, 0x47, 0x19, 0x57, 0xcf, 0xb5, 0x96, 0xfd, 0x46, 0xfd, 0x05, 0x99, 0xaf, 0xd7, 0xc6, 0x36, 0x9a, 0x0d, 0x67, 0x90, 0x66, 0xa5, 0xf2, 0x30, 0xab, 0x3b, 0x69, 0x71, + 0xc0, 0x26, 0x3b, 0x47, 0xdd, 0xf8, 0xdc, 0x91, 0x56, 0x78, 0x04, 0xc2, 0x27, 0xfc, 0x59, 0xb7, 0x4e, 0xe2, 0x40, 0xc3, 0x10, 0x48, 0xd7, 0x0b, 0x71, 0x73, 0x38, 0x0b, 0xf5, 0x86, 0x5b, 0x93, + 0xc0, 0x9a, 0x87, 0x26, 0x47, 0xa8, 0xab, 0x74, 0xd6, 0xe1, 0x84, 0xc4, 0x40, 0x1c, 0x09, 0xf3, 0x98, 0xae, 0x74, 0x10, 0x59, 0xdb, 0x4e, 0x8e, 0xdf, 0x8a, 0x02, 0xfd, 0x58, 0xa9, 0x11, 0x7e, + 0x6e, 0x86, 0xbc, 0x15, 0x69, 0x7c, 0xad, 0xcf, 0x08, 0x8f, 0x9b, 0x19, 0x89, 0xd8, 0x4e, 0x20, 0xef, 0x24, 0x5a, 0xe4, 0x76, 0x10, 0x71, 0x15, 0xe0, 0x75, 0x60, 0x7d, 0x76, 0x52, 0x6d, 0x27, + 0xb8, 0x4a, 0xb5, 0x47, 0x0a, 0x20, 0xde, 0xcd, 0x07, 0x9c, 0x24, 0xcd, 0x76, 0xa1, 0xf9, 0x67, 0xd7, 0xc4, 0x2d, 0x3a, 0x0c, 0x21, 0x80, 0xd4, 0x8b, 0x35, 0x55, 0x2c, 0x9d, 0x19, 0xdb, 0x01, + 0x3c, 0x24, 0xd8, 0x03, 0x26, 0x83, 0x20, 0xb8, 0x30, 0x97, 0xa7, 0x83, 0x6d, 0x01, 0xdf, 0xc6, 0xeb, 0x99, 0x66, 0x39, 0x8d, 0xca, 0x69, 0x51, 0xa7, 0x55, 0xf8, 0xb0, 0xe2, 0x18, 0xf4, 0x54, + 0xcd, 0xde, 0x2f, 0xb4, 0x67, 0xd3, 0xaf, 0x57, 0x2e, 0xed, 0x33, 0x46, 0x84, 0x42, 0x7b, 0x62, 0x4a, 0xb9, 0x6d, 0x5d, 0x41, 0xe6, 0xc4, 0x9a, 0x6b, 0x20, 0x7c, 0xd0, 0x83, 0xa8, 0x2b, 0xce, + 0xbc, 0x6c, 0x12, 0x58, 0x0c, 0x03, 0xbc, 0x4d, 0x88, 0xe5, 0x72, 0x13, 0xcf, 0xf7, 0x13, 0xbc, 0xe4, 0xa8, 0xda, 0x34, 0xaa, 0x4e, 0xe3, 0xdb, 0x3d, 0xb4, 0x3a, 0xae, 0x71, 0x0e, 0x12, 0xc8, + 0xdc, 0x49, 0xb0, 0x6e, 0x0d, 0xf2, 0x10, 0xbd, 0x2f, 0x9d, 0x41, 0xdf, 0x12, 0x90, 0xb3, 0x5d, 0x8e, 0x28, 0x55, 0x79, 0x5b, 0xbb, 0xf3, 0xad, 0x68, 0xff, 0xff, 0xfe, 0xf4, 0xc0, 0xa7, 0xea, + 0x59, 0x7f, 0xff, 0xdf, 0xe0, 0xb7, 0x20, 0xda, 0xb7, 0x62, 0x1c, 0x7f, 0x7f, 0xcf, 0x93, 0xf7, 0xcc, 0xb2, 0x7a, 0xdb, 0xbb, 0x47, 0x7e, 0x81, 0xc4, 0xdd, 0xbb, 0xd3, 0xc2, 0x6c, 0xa7, 0x56, + 0xe6, 0xbc, 0x3d, 0x06, 0x3d, 0x8e, 0x1d, 0xf8, 0xe6, 0x9e, 0x4f, 0x33, 0xc7, 0x9d, 0x66, 0xe5, 0xa7, 0x50, 0x90, 0x17, 0xcb, 0xe6, 0x26, 0xac, 0x35, 0x6b, 0xdc, 0x22, 0xce, 0x4c, 0x67, 0x9a, + 0x17, 0x59, 0xe5, 0xda, 0x9f, 0x82, 0x81, 0xa1, 0xdb, 0x78, 0xdd, 0xbc, 0xc8, 0x92, 0xa9, 0x1d, 0x87, 0x6f, 0xf1, 0x15, 0x20, 0xf2, 0x35, 0xee, 0xe4, 0x7c, 0xfd, 0x09, 0xec, 0x17, 0x08, 0xfe, + 0x61, 0xf9, 0xcc, 0xef, 0x6d, 0x52, 0xff, 0xba, 0x23, 0x8c, 0x9f, 0xdb, 0x78, 0xbc, 0xd7, 0x2d, 0xf5, 0x7b, 0xe9, 0xc0, 0xbf, 0x1e, 0xf1, 0x1d, 0x31, 0x99, 0x1f, 0xcf, 0xae, 0x65, 0x2d, 0x87, + 0x5c, 0x9b, 0x0b, 0xd2, 0xe4, 0x68, 0x62, 0x02, 0x34, 0x37, 0xcb, 0x75, 0xe6, 0xbb, 0x12, 0x3f, 0xd8, 0xab, 0x8a, 0x5c, 0xef, 0x9c, 0x9c, 0x67, 0xd9, 0x9e, 0xf4, 0x41, 0xc0, 0x03, 0x50, 0x53, + 0x5e, 0xaa, 0x94, 0x65, 0x33, 0xe7, 0x95, 0x37, 0xdb, 0x6b, 0x2d, 0xc8, 0x44, 0xa4, 0x31, 0x39, 0x43, 0x33, 0x8b, 0xa1, 0x7c, 0x98, 0x6e, 0xea, 0x82, 0x83, 0xc5, 0x9b, 0xaa, 0x8a, 0x77, 0xbf, + 0xe6, 0x23, 0x20, 0xbe, 0x7e, 0xe3, 0xf1, 0x40, 0xbc, 0xd2, 0xbe, 0x54, 0x9a, 0xbc, 0x1c, 0xdd, 0xd9, 0xd0, 0x7a, 0x08, 0x43, 0x9b, 0x77, 0x46, 0x39, 0xdf, 0x65, 0x9d, 0x61, 0x6e, 0x18, 0x79, + 0xb3, 0x5a, 0x1b, 0x4a, 0x4f, 0x33, 0xa6, 0x9e, 0xc7, 0xc0, 0x92, 0x93, 0xc9, 0xc9, 0x92, 0x9a, 0x9b, 0x9b, 0xb0, 0x77, 0x13, 0x2e, 0xe0, 0xdb, 0x53, 0x27, 0xfa, 0x18, 0x1c, 0x20, 0x0a, 0xc8, + 0x6d, 0xfc, 0xc3, 0x8a, 0xcd, 0x95, 0xf3, 0x9e, 0xde, 0x49, 0x76, 0x92, 0xe8, 0xdb, 0xda, 0x2f, 0xa4, 0x68, 0x13, 0x53, 0xd5, 0xb1, 0xb9, 0xe9, 0x74, 0xf9, 0xd7, 0xc3, 0x29, 0xf8, 0xd7, 0x17, + 0x16, 0xf9, 0x52, 0xfa, 0xe6, 0xaf, 0xbf, 0x6e, 0x76, 0xfa, 0xff, 0xd7, 0xe7, 0xbf, 0x1f, 0x12, 0xae, 0xbc, 0x6c, 0x8d, 0x56, 0x97, 0x75, 0xa7, 0xcf, 0xdd, 0xe9, 0xef, 0xda, 0xf2, 0xfe, 0xb9, + 0x88, 0x7f, 0xf0, 0x1b, 0x17, 0x89, 0x77, 0xf7, 0xce, 0xd8, 0x64, 0x63, 0xcd, 0xb2, 0x11, 0xcd, 0xee, 0xcb, 0x83, 0x66, 0x97, 0x7b, 0xd4, 0x64, 0x0f, 0x07, 0x7c, 0x77, 0x86, 0x85, 0xb6, 0x61, + 0xcf, 0x73, 0x7c, 0x31, 0x39, 0xa6, 0xd6, 0xc9, 0x5d, 0xbb, 0x5e, 0xee, 0xea, 0x5b, 0x6d, 0x52, 0xf4, 0xc3, 0x72, 0x13, 0x1f, 0x30, 0x41, 0xae, 0x96, 0x9b, 0xa0, 0xc4, 0x84, 0x18, 0xd8, 0x9e, + 0x0e, 0xab, 0xdc, 0xe6, 0x26, 0xed, 0x16, 0xd8, 0xb4, 0x1e, 0x3f, 0x59, 0x2e, 0x0e, 0xe8, 0xfa, 0x5b, 0x2f, 0xa9, 0xd7, 0x9a, 0xad, 0x97, 0x88, 0xba, 0xba, 0x08, 0xa7, 0xef, 0x75, 0xea, 0x7e, + 0x00, 0xe9, 0xcf, 0xb5, 0x81, 0x87, 0xbf, 0xf2, 0x06, 0xd3, 0xbd, 0x7b, 0x63, 0x5b, 0xd1, 0x1e, 0x39, 0x9f, 0x3b, 0xfa, 0xa8, 0x7b, 0xe8, 0x1a, 0xc9, 0x58, 0xb5, 0x47, 0x62, 0xd9, 0x78, 0x96, + 0xc9, 0xe2, 0xa4, 0x26, 0x07, 0x90, 0xbd, 0x9d, 0xc0, 0x11, 0xea, 0xf1, 0xab, 0xe1, 0xc0, 0x2f, 0xba, 0x23, 0xb5, 0x81, 0x1d, 0x15, 0x36, 0xf1, 0xe3, 0x40, 0xf4, 0x90, 0x37, 0xab, 0x45, 0xc0, + 0x85, 0x29, 0xec, 0x98, 0x64, 0x0e, 0x0d, 0x67, 0x32, 0x8a, 0x44, 0x8a, 0x38, 0x67, 0x55, 0x65, 0xbd, 0xfe, 0xd6, 0x53, 0xe2, 0x7b, 0x71, 0xdb, 0xfb, 0x6a, 0xc2, 0x33, 0x55, 0x0c, 0xbe, 0xd0, + 0xfe, 0x00, 0xe5, 0xbd, 0x0c, 0x07, 0x3c, 0xae, 0x82, 0x81, 0x07, 0x9f, 0xc5, 0x79, 0x26, 0xf6, 0xf3, 0x08, 0x22, 0x03, 0xca, 0x9d, 0xb1, 0x73, 0x75, 0x31, 0x07, 0xdb, 0x6d, 0xc2, 0x51, 0x8b, + 0xc5, 0x61, 0xe6, 0xd3, 0x42, 0xca, 0xed, 0x48, 0x7d, 0x85, 0x06, 0x65, 0x2b, 0xe0, 0xd4, 0x96, 0x8b, 0x80, 0x39, 0x6b, 0xa3, 0xac, 0xbe, 0x1b, 0xe6, 0xf6, 0x6a, 0x3d, 0x99, 0x74, 0x71, 0x4e, + 0x2f, 0xd6, 0x3e, 0x6d, 0x86, 0x95, 0x5a, 0x02, 0x30, 0xa9, 0x48, 0x04, 0x72, 0x47, 0x71, 0x78, 0x79, 0xb9, 0xc7, 0x59, 0xc5, 0xcf, 0x55, 0x11, 0x7a, 0xa7, 0xfa, 0x3e, 0xfc, 0xd0, 0xf3, 0xc6, + 0xd6, 0x10, 0xea, 0x36, 0x75, 0xa6, 0xa0, 0x93, 0xed, 0x7c, 0xae, 0xc5, 0x06, 0x51, 0xb5, 0xae, 0x63, 0x4a, 0x1e, 0x46, 0x76, 0x90, 0xe2, 0x8b, 0x6a, 0xd7, 0xf8, 0x86, 0xa0, 0x67, 0x7b, 0xee, + 0x6c, 0xd4, 0x5e, 0xb2, 0x09, 0x2d, 0xa0, 0xda, 0x42, 0x95, 0xeb, 0xef, 0x29, 0xc1, 0xb0, 0xc0, 0x5c, 0xdd, 0xf9, 0xeb, 0x20, 0x3e, 0xd3, 0x31, 0x09, 0xb8, 0x02, 0x60, 0xc3, 0x2d, 0xd5, 0x88, + 0x76, 0x32, 0x74, 0xc8, 0x18, 0x5b, 0xe2, 0xf2, 0xa6, 0x3f, 0x26, 0x18, 0x43, 0x4f, 0x44, 0x1e, 0xbf, 0x53, 0x7d, 0xc3, 0xe2, 0x35, 0xc5, 0x18, 0xfa, 0x5d, 0x8c, 0xf1, 0x65, 0xa7, 0x8e, 0xae, + 0x96, 0xb6, 0xaf, 0x60, 0x44, 0x1b, 0x2a, 0x4a, 0xd8, 0x1a, 0x50, 0xb0, 0x73, 0x36, 0x9e, 0xcd, 0xee, 0x4e, 0xee, 0x5c, 0x13, 0xbc, 0xb4, 0x4d, 0x28, 0xe9, 0xa8, 0x05, 0x89, 0xcb, 0xf1, 0x44, + 0xb1, 0x04, 0x94, 0x55, 0x9b, 0x2c, 0x66, 0x62, 0x95, 0xc1, 0x32, 0x2e, 0x65, 0x06, 0x97, 0xa3, 0x76, 0x18, 0x1b, 0x56, 0x37, 0x08, 0x68, 0xa8, 0xec, 0x14, 0xb1, 0xdc, 0x4c, 0x18, 0x97, 0x7e, + 0xce, 0xd2, 0xff, 0xef, 0x17, 0x4d, 0x24, 0x0e, 0xad, 0x99, 0x57, 0xfe, 0x2a, 0x2b, 0xb3, 0x7a, 0x17, 0xe3, 0x37, 0x71, 0xa1, 0x9f, 0x9f, 0x6a, 0xdf, 0x62, 0x0e, 0xbe, 0x29, 0x22, 0xdf, 0x03, + 0x3d, 0xbf, 0x96, 0x1f, 0x72, 0x0b, 0xdf, 0x85, 0xfe, 0xfe, 0xf0, 0x45, 0x7f, 0xbe, 0x17, 0xda, 0xc5, 0xa7, 0x16, 0xfd, 0xc8, 0xd7, 0x57, 0xf8, 0xda, 0xc1, 0xff, 0x61, 0xde, 0xdb, 0xe5, 0x6b, + 0xdc, 0x0d, 0xcd, 0xfc, 0x47, 0x77, 0x5f, 0x1e, 0xff, 0xcc, 0x1b, 0x47, 0xdc, 0x0f, 0x0f, 0x1d, 0xb9, 0x17, 0x13, 0x07, 0xce, 0xac, 0x5d, 0x4e, 0xb6, 0xa7, 0x39, 0xc1, 0x1a, 0x99, 0xb2, 0xa8, + 0x62, 0xb5, 0x30, 0xd9, 0xca, 0x0b, 0x50, 0x4d, 0x0f, 0xa3, 0x75, 0x64, 0xc6, 0x9a, 0x7d, 0xc2, 0x4b, 0xf3, 0x50, 0xd5, 0x66, 0x2a, 0xd3, 0xfd, 0x96, 0xef, 0x52, 0x36, 0x90, 0x35, 0x86, 0xde, + 0x9c, 0xd9, 0x8e, 0xc6, 0x93, 0x52, 0x22, 0x68, 0xa0, 0x5e, 0x24, 0xe7, 0xf8, 0xd4, 0x46, 0x0b, 0x95, 0xe8, 0x9a, 0x96, 0x1d, 0x3d, 0x5d, 0x5e, 0x5f, 0xfd, 0x67, 0xdc, 0xd0, 0x5f, 0xf8, 0xbf, + 0x89, 0xdb, 0x7d, 0xc0, 0xde, 0x90, 0xba, 0xd0, 0xff, 0x3d, 0x52, 0x25, 0xa5, 0xee, 0x15, 0x3f, 0x25, 0x8d, 0xd2, 0xdd, 0xd6, 0xa0, 0xe8, 0x47, 0x58, 0x7c, 0xb0, 0x44, 0x80, 0xf5, 0xa2, 0x65, + 0x60, 0x1c, 0x35, 0x32, 0xc9, 0x0d, 0x94, 0x34, 0xe5, 0xd5, 0xa9, 0xdf, 0x06, 0xa8, 0x4f, 0x6a, 0x94, 0x6f, 0xce, 0xea, 0xfd, 0x26, 0x12, 0xf7, 0x6c, 0x4e, 0x2f, 0xa3, 0xc5, 0xdc, 0x74, 0x8e, + 0xeb, 0xdc, 0x11, 0xec, 0xc5, 0x56, 0xa6, 0x15, 0xbf, 0x30, 0xf0, 0x32, 0xcd, 0xc4, 0xdf, 0xdb, 0x1f, 0xff, 0xfd, 0x6a, 0x06, 0x5c, 0xca, 0xf2, 0x5c, 0x38, 0xfb, 0xef, 0x8f, 0x08, 0x8b, 0x4f, + 0x8c, 0xfb, 0xa9, 0xa4, 0xfe, 0xf7, 0x3b, 0x3f, 0x97, 0xd4, 0x7f, 0x54, 0xae, 0x1d, 0xfe, 0xf6, 0x50, 0x5d, 0x84, 0xef, 0x24, 0x6e, 0x7e, 0xa3, 0xf0, 0x1c, 0xfb, 0x7d, 0xb6, 0xfe, 0x91, 0x0f, + 0xef, 0xb7, 0xa5, 0xf3, 0x9f, 0xf5, 0xde, 0xdd, 0x94, 0xce, 0x1f, 0xed, 0xb0, 0x2b, 0xa5, 0x1a, 0x3c, 0xe5, 0xb6, 0x30, 0xef, 0xb7, 0x95, 0xde, 0x51, 0x5c, 0x73, 0xf6, 0x14, 0x37, 0x98, 0x73, + 0x83, 0xc1, 0xb4, 0x02, 0x2c, 0x2b, 0xbd, 0x06, 0xb2, 0xca, 0x04, 0x59, 0x98, 0xf4, 0xb0, 0xc0, 0xd8, 0x5c, 0x59, 0xe9, 0xc1, 0x3a, 0xd8, 0xaf, 0x87, 0x68, 0xae, 0xd5, 0xdc, 0x01, 0xe7, 0x74, + 0xba, 0x4d, 0x4d, 0x37, 0x40, 0x03, 0x5b, 0x68, 0xa3, 0x1e, 0x14, 0xeb, 0xcd, 0x40, 0xed, 0xff, 0x40, 0xcf, 0xfd, 0x4f, 0xe9, 0xfc, 0xdf, 0xd8, 0x30, 0xff, 0xa3, 0x4a, 0xe7, 0x5f, 0xbe, 0x76, + 0xec, 0x36, 0x6e, 0x5a, 0x06, 0x95, 0x1b, 0xa6, 0x3f, 0x78, 0x22, 0xff, 0x3c, 0x7b, 0xff, 0x2b, 0xf1, 0x37, 0xf9, 0xf7, 0xe9, 0xd2, 0xc5, 0x10, 0xfe, 0x4d, 0x36, 0x3f, 0x38, 0xdd, 0xeb, 0xb9, + 0x6d, 0x64, 0x3e, 0xb6, 0x3c, 0xf3, 0xfc, 0x79, 0x25, 0x4e, 0x02, 0x89, 0x30, 0xea, 0xb3, 0x83, 0xba, 0x92, 0x7d, 0x4f, 0x21, 0xbc, 0x6c, 0x8e, 0xbd, 0xf3, 0xd8, 0x7d, 0xbd, 0xf0, 0x99, 0x2a, + 0x17, 0x5f, 0x89, 0xbf, 0x8d, 0xe7, 0xd3, 0xa5, 0x6b, 0x68, 0xd7, 0xef, 0x85, 0xb9, 0x8f, 0x71, 0x35, 0x77, 0x4c, 0x96, 0x9a, 0x0d, 0x78, 0x6b, 0x9a, 0x38, 0x1e, 0x59, 0x20, 0x0a, 0x2b, 0xc4, + 0x07, 0xc8, 0x15, 0x95, 0x6d, 0x82, 0xc5, 0x69, 0xc3, 0x5b, 0xa0, 0x94, 0x58, 0xa5, 0xcc, 0x1c, 0x76, 0x8d, 0x38, 0x31, 0x16, 0x04, 0x8d, 0x2d, 0x0e, 0xc6, 0x64, 0x55, 0x2d, 0x89, 0x94, 0x1f, + 0xe4, 0xbd, 0x96, 0x06, 0xa1, 0xbb, 0xef, 0xfb, 0xf3, 0x39, 0xcc, 0x87, 0xdd, 0x8e, 0x49, 0xd9, 0x68, 0x44, 0x5e, 0xfd, 0x4f, 0x46, 0xd6, 0xd7, 0x34, 0xdb, 0xef, 0xc0, 0x16, 0xae, 0xf3, 0x38, + 0xcb, 0x1e, 0x7e, 0x5e, 0xd7, 0xbe, 0xd2, 0x7d, 0x83, 0xf3, 0x7a, 0x76, 0xd1, 0x31, 0x47, 0x2c, 0x8b, 0x83, 0xa9, 0x98, 0xce, 0x22, 0x28, 0x26, 0x3b, 0xf7, 0xd4, 0x0f, 0x66, 0x1c, 0x93, 0xbc, + 0x46, 0x2a, 0xda, 0x56, 0x90, 0x08, 0x7e, 0xd7, 0xc1, 0xc3, 0x39, 0x37, 0x00, 0xfe, 0xb0, 0x84, 0xcc, 0x95, 0x87, 0x30, 0x66, 0x15, 0xa4, 0x2b, 0xc0, 0x83, 0x21, 0x75, 0x2b, 0xd0, 0xbb, 0x58, + 0x27, 0xd6, 0xf5, 0x4a, 0x87, 0xd9, 0x4c, 0x12, 0xa0, 0x2d, 0x36, 0xc3, 0x3c, 0x79, 0xd8, 0x95, 0x5b, 0x93, 0x5d, 0x7f, 0x2b, 0x06, 0x75, 0x79, 0xb1, 0xd2, 0xf4, 0xc6, 0x69, 0x59, 0x4f, 0x9a, + 0xa5, 0xb7, 0xf4, 0xdf, 0xe0, 0xb8, 0xbd, 0x7a, 0xd1, 0xab, 0xc6, 0x98, 0xa2, 0x13, 0x6e, 0x63, 0x43, 0x4e, 0xb2, 0xde, 0xc6, 0xfb, 0x3c, 0xa6, 0x67, 0x2c, 0xc2, 0xcd, 0xe3, 0xf9, 0xd6, 0x26, + 0x59, 0xd2, 0xdb, 0x57, 0x7b, 0x8c, 0xd2, 0x09, 0xa4, 0x56, 0xb7, 0x9a, 0x88, 0x31, 0x8d, 0x3d, 0xcc, 0xb7, 0xb6, 0x0f, 0xc3, 0x3a, 0x34, 0x80, 0x6b, 0xd5, 0x8a, 0x15, 0xac, 0x73, 0x74, 0x14, + 0xd9, 0x6b, 0xba, 0xca, 0x32, 0xcd, 0x04, 0x38, 0xe6, 0x67, 0x62, 0x9d, 0x61, 0xc3, 0x69, 0xcc, 0xce, 0xf7, 0xa7, 0x65, 0xfa, 0x91, 0x13, 0xf7, 0x49, 0x2e, 0xa9, 0x8b, 0xf0, 0x0d, 0x93, 0x17, + 0xd6, 0x1d, 0xd9, 0xf5, 0xd8, 0x5e, 0xd7, 0x25, 0x47, 0xad, 0xab, 0x99, 0x34, 0xcb, 0xd6, 0xd8, 0x30, 0x03, 0xd3, 0xde, 0x73, 0xa1, 0x65, 0xb3, 0xe2, 0x54, 0x25, 0x0b, 0x54, 0xc9, 0x6b, 0x4e, + 0x42, 0xd0, 0x74, 0x40, 0xba, 0x60, 0x8e, 0x93, 0xce, 0x43, 0x77, 0xd9, 0x42, 0x8b, 0x48, 0xd6, 0x3e, 0xe6, 0x73, 0xb8, 0x16, 0x0e, 0x94, 0x1d, 0x0c, 0xba, 0x5d, 0x36, 0xfb, 0xb8, 0x30, 0x73, + 0xd2, 0xd1, 0xc0, 0xfa, 0x38, 0xd1, 0x57, 0x77, 0x6d, 0xf2, 0xc7, 0x3c, 0x81, 0xfc, 0x82, 0x9e, 0x75, 0xe8, 0x7c, 0x30, 0xc2, 0xcb, 0xc7, 0xbf, 0x12, 0xfa, 0xfd, 0xa0, 0x87, 0xe3, 0x31, 0x44, + 0xb9, 0x15, 0x69, 0x81, 0xba, 0x81, 0x79, 0x7d, 0x91, 0x2e, 0x53, 0x12, 0x5c, 0x90, 0x20, 0x63, 0xb0, 0xa7, 0x15, 0x8f, 0xe9, 0x35, 0xb3, 0xf5, 0x29, 0x58, 0xcc, 0x65, 0x38, 0x46, 0xe2, 0xad, + 0xd4, 0x83, 0xc8, 0x11, 0xb4, 0x6d, 0x10, 0xb3, 0x10, 0x6e, 0xb5, 0x67, 0x67, 0x83, 0x38, 0x27, 0x8e, 0x0b, 0xd9, 0x91, 0x27, 0x0a, 0x02, 0x6e, 0x4e, 0xac, 0x0e, 0xbb, 0x67, 0x30, 0x1b, 0xe1, + 0xab, 0x7e, 0xd7, 0x15, 0x5f, 0xb4, 0x9e, 0xd7, 0x0c, 0xa4, 0xe2, 0x55, 0x85, 0x40, 0x6f, 0x15, 0xb6, 0xf7, 0x47, 0x2f, 0x25, 0x49, 0x5e, 0x9f, 0x81, 0x1e, 0x3c, 0x73, 0x4f, 0x6d, 0xbe, 0x21, + 0xff, 0x2d, 0xf4, 0xf2, 0xbd, 0x56, 0x47, 0x9c, 0xf9, 0xfe, 0x67, 0x65, 0xe3, 0x36, 0xef, 0xb2, 0x69, 0xc2, 0x6b, 0x59, 0x07, 0xe2, 0x5b, 0xb1, 0x0b, 0xf3, 0x91, 0xc7, 0xee, 0x8e, 0xee, 0x7b, + 0xdf, 0x98, 0x78, 0xb1, 0x0c, 0xf1, 0x2f, 0x0f, 0x86, 0xa9, 0x33, 0x4d, 0xfa, 0x69, 0x6b, 0x5e, 0x1f, 0xc0, 0xbf, 0x66, 0x01, 0xc6, 0xa1, 0x1f, 0x54, 0x2f, 0x4f, 0xbc, 0x00, 0xec, 0x96, 0x6f, + 0x06, 0xe6, 0xd7, 0xd4, 0xb5, 0x30, 0x7d, 0x7b, 0xed, 0xaf, 0x05, 0x1e, 0x5e, 0xbb, 0x4f, 0x4d, 0x5b, 0xb3, 0x48, 0x3f, 0xc6, 0xfd, 0xfd, 0xa1, 0xae, 0x9f, 0x9a, 0x8e, 0x53, 0xbc, 0xe3, 0x72, + 0xe3, 0x93, 0xff, 0xa4, 0x4d, 0x7f, 0xc1, 0xb5, 0x74, 0xed, 0xba, 0x70, 0xaf, 0x63, 0xfd, 0xec, 0x0f, 0x45, 0xbf, 0x3e, 0xf6, 0x29, 0x41, 0xee, 0xcb, 0xbd, 0x2a, 0x4c, 0xfb, 0xf7, 0xb6, 0x81, + 0xe0, 0x6f, 0xd6, 0x9c, 0x97, 0x2f, 0x7d, 0x0d, 0x55, 0x7f, 0x38, 0xb7, 0x9e, 0x69, 0x78, 0x70, 0x4b, 0xfa, 0xd3, 0x0c, 0x7b, 0x0d, 0x8b, 0x47, 0xc6, 0x35, 0x40, 0xc0, 0xe7, 0xe6, 0x09, 0xd8, + 0x74, 0x8e, 0x23, 0x00, 0x75, 0x45, 0x6a, 0xa4, 0x88, 0xda, 0x36, 0x17, 0x34, 0x25, 0xd6, 0x68, 0x10, 0xbf, 0xea, 0x59, 0x96, 0xe7, 0xcb, 0xc4, 0x38, 0x51, 0xe4, 0xae, 0x38, 0xc3, 0x81, 0x66, + 0x83, 0x0b, 0x76, 0x68, 0x76, 0x7b, 0x56, 0xb0, 0x1b, 0xa5, 0x54, 0x79, 0x66, 0x1f, 0xa3, 0xeb, 0xc9, 0x4e, 0x99, 0x48, 0x02, 0xa2, 0x73, 0xfc, 0xca, 0x0d, 0x04, 0x4f, 0xbe, 0xef, 0xf0, 0xfb, + 0xb2, 0x0f, 0xf3, 0x40, 0xca, 0x3c, 0xb9, 0xf2, 0x7c, 0x26, 0xfe, 0x09, 0x8b, 0xb7, 0x4b, 0x53, 0x64, 0x5c, 0xfe, 0xff, 0x5c, 0x55, 0x57, 0x31, 0xbe, 0x80, 0x26, 0x07, 0x50, 0x0b, 0xe7, 0x7b, + 0x28, 0x13, 0x14, 0xf6, 0x58, 0x6d, 0x7a, 0xd0, 0x10, 0x4e, 0x83, 0x43, 0x0b, 0x91, 0x23, 0x87, 0xaa, 0x9c, 0x0e, 0x3e, 0x40, 0x7a, 0x33, 0xa2, 0xf5, 0x9d, 0x32, 0xf7, 0xd5, 0x8e, 0xd3, 0x52, + 0x9d, 0x72, 0xfb, 0x3d, 0xc1, 0xae, 0x52, 0x9b, 0x43, 0xe5, 0x99, 0xa5, 0x6f, 0xe8, 0x33, 0x16, 0x43, 0x24, 0xa0, 0x0b, 0x19, 0x35, 0xc2, 0x42, 0xfd, 0xc6, 0x27, 0x77, 0xd2, 0x38, 0x6e, 0xf6, + 0xb0, 0x5e, 0xd8, 0x15, 0x1c, 0xc3, 0xd5, 0xc8, 0xa3, 0x24, 0x82, 0x97, 0x9f, 0x3c, 0x3f, 0x56, 0x2e, 0x9f, 0x75, 0xb4, 0x9c, 0x5f, 0xd1, 0x3f, 0x4f, 0xc1, 0xef, 0xdd, 0xd6, 0xee, 0x73, 0x20, + 0x63, 0x0f, 0x25, 0xe1, 0xaf, 0xf7, 0x74, 0xa1, 0x0e, 0xca, 0x84, 0x39, 0x95, 0x3a, 0x65, 0xd7, 0xf9, 0x99, 0xef, 0x3b, 0x99, 0xd5, 0xb4, 0x82, 0x15, 0xb6, 0x92, 0xd4, 0x1d, 0xa0, 0x19, 0x1d, + 0xda, 0x2a, 0x81, 0x13, 0x73, 0x5e, 0xa2, 0x24, 0x89, 0x98, 0xb0, 0x36, 0x54, 0x1f, 0x87, 0x43, 0x9d, 0x0b, 0x25, 0xa2, 0xcb, 0xc8, 0x66, 0xa0, 0x12, 0xaa, 0x8b, 0xa2, 0x85, 0x4a, 0x75, 0xf4, + 0x6c, 0x84, 0x22, 0x59, 0xb8, 0x75, 0xf9, 0x39, 0xeb, 0xf7, 0x41, 0x9d, 0xb4, 0x3b, 0x89, 0xd6, 0xf7, 0x20, 0xc3, 0x9e, 0xf3, 0xe5, 0x7f, 0x21, 0xfe, 0x02, 0xde, 0x97, 0x4b, 0x97, 0x26, 0xe3, + 0x23, 0x58, 0x17, 0x5f, 0xe5, 0xe5, 0x4c, 0x3b, 0xf6, 0x89, 0xb5, 0x3d, 0x41, 0xe2, 0x56, 0xe7, 0x90, 0xdd, 0x90, 0xf3, 0x42, 0xa1, 0x47, 0x7c, 0xe0, 0xac, 0x3b, 0xad, 0x5e, 0x37, 0x3d, 0x24, + 0x52, 0xe5, 0x96, 0xc1, 0xe2, 0xa8, 0xce, 0x1c, 0xae, 0x71, 0x4e, 0xc7, 0x72, 0x66, 0xe7, 0xfd, 0x66, 0x03, 0x2f, 0xd4, 0xb5, 0x9a, 0xb3, 0x80, 0x10, 0x82, 0x6c, 0xe3, 0x83, 0x59, 0x63, 0xf1, + 0xc3, 0xd6, 0x59, 0x52, 0xd4, 0x73, 0x9e, 0x4a, 0x2f, 0x36, 0xab, 0x4f, 0x59, 0xbb, 0x3f, 0x14, 0xa1, 0xbb, 0xe9, 0xe6, 0x7e, 0x0f, 0x56, 0xfc, 0x59, 0x58, 0x5f, 0xc9, 0x5e, 0x01, 0x7d, 0x3d, + 0xb9, 0xb4, 0xbb, 0x18, 0x01, 0xe5, 0x59, 0xc8, 0xe6, 0xcb, 0x89, 0xc3, 0x1f, 0x92, 0x05, 0xb4, 0xb5, 0x2d, 0x84, 0xb2, 0xd4, 0x26, 0xe5, 0x36, 0x9d, 0xb2, 0x8f, 0x16, 0xc9, 0x44, 0x92, 0x72, + 0x17, 0xf1, 0xe9, 0x7a, 0x55, 0x0c, 0xa7, 0x2d, 0x9e, 0x30, 0x6a, 0x3c, 0x73, 0x22, 0x5d, 0xae, 0x21, 0xc1, 0x11, 0xa1, 0xbd, 0x09, 0x03, 0xd0, 0x0e, 0xc9, 0xce, 0x27, 0xd9, 0x9f, 0x87, 0x05, + 0x16, 0x99, 0xdb, 0xe3, 0x06, 0x3a, 0xc8, 0x6a, 0xfe, 0x5c, 0xf6, 0x59, 0x95, 0xbd, 0x56, 0xe7, 0xf9, 0x68, 0x79, 0x8f, 0xfe, 0xb0, 0xdc, 0xdc, 0xac, 0xcd, 0xf7, 0xf1, 0xc4, 0x9e, 0x31, 0x1b, + 0x3f, 0xe8, 0x5e, 0x00, 0x7d, 0x3f, 0x9b, 0x5e, 0xe8, 0xfd, 0x1e, 0x51, 0x40, 0x88, 0xd8, 0x14, 0xb4, 0xc0, 0x74, 0xa1, 0xc1, 0xae, 0x6a, 0x25, 0x73, 0xaa, 0x77, 0x19, 0x36, 0x2c, 0xed, 0xbd, + 0x1e, 0xb2, 0x5b, 0x2f, 0x70, 0x43, 0xb0, 0x15, 0x0e, 0x87, 0xf9, 0xd9, 0xf3, 0xc4, 0xd3, 0x69, 0x4e, 0xb4, 0x0c, 0xb0, 0xcd, 0x08, 0xb5, 0x50, 0x75, 0x4f, 0x5e, 0xf1, 0x7e, 0x2a, 0xa7, 0x74, + 0x40, 0x60, 0x74, 0xe7, 0x3a, 0x4e, 0x4d, 0xa6, 0x94, 0x87, 0xa4, 0xed, 0x81, 0x69, 0x7f, 0x3f, 0xc7, 0xbd, 0xd1, 0x6e, 0xb9, 0x5b, 0x8b, 0xfb, 0x8e, 0x82, 0x74, 0x31, 0x62, 0x2e, 0xdf, 0x02, + 0x7a, 0xd7, 0x38, 0x1e, 0x89, 0xd6, 0x17, 0x80, 0xea, 0x47, 0xf5, 0x53, 0x9e, 0x4b, 0xb5, 0x7c, 0xa5, 0xf9, 0x06, 0x7f, 0x9d, 0x8f, 0x4d, 0xa5, 0xdc, 0xe7, 0x42, 0x4b, 0x3a, 0xe2, 0x4c, 0x8f, + 0x35, 0x11, 0x6a, 0x22, 0xc2, 0x84, 0x03, 0x62, 0x1d, 0xe6, 0x74, 0xad, 0x4b, 0x21, 0xdc, 0xda, 0xae, 0x2a, 0x8a, 0x2b, 0xfd, 0xd8, 0xed, 0xd6, 0x3b, 0xdb, 0x3e, 0x23, 0x00, 0x99, 0xb6, 0x38, + 0x15, 0x97, 0x8c, 0xb6, 0xe0, 0xad, 0x0a, 0x34, 0xaa, 0x89, 0xb0, 0x25, 0xb1, 0xe5, 0x79, 0x5e, 0xd6, 0xeb, 0x7c, 0x7d, 0xa4, 0x01, 0xa1, 0x4c, 0xd7, 0x72, 0xfc, 0x5c, 0xe8, 0x6c, 0x9c, 0xd9, + 0x66, 0xf5, 0xd1, 0x0c, 0xf6, 0x7b, 0x79, 0x89, 0x4b, 0x15, 0x55, 0xb7, 0x0b, 0xcb, 0xaa, 0xfc, 0xb4, 0x06, 0xde, 0xc7, 0xf8, 0xb3, 0x8c, 0xb9, 0x6f, 0xcc, 0x3f, 0x53, 0xde, 0xf8, 0x83, 0xec, + 0x0b, 0xd2, 0xef, 0x27, 0x97, 0x6a, 0xaa, 0x23, 0x8a, 0x1c, 0x3b, 0xc9, 0xbc, 0x44, 0xf7, 0x2d, 0xbe, 0xb1, 0x81, 0x55, 0xc3, 0xeb, 0x56, 0x19, 0xec, 0xb0, 0xc1, 0x0e, 0x16, 0xe4, 0x5c, 0xf2, + 0xc5, 0x78, 0x18, 0x18, 0x43, 0x83, 0x9b, 0x3e, 0x96, 0xe6, 0xeb, 0xf3, 0xd2, 0x93, 0x09, 0xcd, 0x0e, 0xad, 0xf8, 0xa0, 0x09, 0x9c, 0x77, 0xc4, 0xe4, 0xb0, 0xde, 0x00, 0x2e, 0x08, 0xbb, 0xb4, + 0x6e, 0x64, 0x86, 0x8a, 0xb6, 0x4e, 0xe1, 0x36, 0xf8, 0x1e, 0xde, 0xb5, 0xcf, 0x0b, 0xe1, 0xea, 0x3a, 0xde, 0xef, 0x85, 0x19, 0x8a, 0x30, 0x29, 0x4c, 0xef, 0x5d, 0x3a, 0x3f, 0x28, 0x0a, 0xf4, + 0x41, 0xe2, 0x3e, 0xc0, 0x4f, 0xb9, 0x09, 0xae, 0x34, 0x5f, 0xd1, 0xad, 0x5c, 0xe7, 0x4e, 0xae, 0xfa, 0x7d, 0x83, 0x90, 0xcc, 0x48, 0x31, 0xac, 0x9d, 0x7e, 0x52, 0xa0, 0x72, 0x93, 0xca, 0x2d, + 0xcc, 0x6d, 0x7a, 0x34, 0x2b, 0x67, 0x99, 0xb4, 0xd1, 0xd9, 0xa1, 0x18, 0x22, 0x73, 0x56, 0x51, 0xf4, 0xb9, 0x30, 0xaa, 0x5d, 0x70, 0x68, 0x09, 0xab, 0xc2, 0x7a, 0x42, 0xa0, 0x06, 0xfe, 0x68, + 0x47, 0xc7, 0x62, 0x42, 0xc4, 0xa1, 0x4a, 0x30, 0x16, 0xd6, 0x0b, 0x41, 0x4b, 0x1c, 0x0d, 0x5c, 0x5d, 0x1a, 0xa8, 0x31, 0x8c, 0x72, 0x07, 0x64, 0xc5, 0xd4, 0x35, 0xed, 0x47, 0xcd, 0x80, 0x80, + 0x5f, 0xf0, 0x33, 0xbb, 0xd4, 0xaf, 0x44, 0x5f, 0x70, 0x78, 0x3d, 0x9c, 0x5e, 0x28, 0xfd, 0x1e, 0x88, 0xe8, 0xac, 0x7b, 0xdb, 0x1c, 0x4f, 0xb2, 0x79, 0xb3, 0xee, 0x45, 0x8f, 0xe8, 0x4f, 0x47, + 0xa8, 0xc1, 0xc9, 0x09, 0xb4, 0x43, 0xc4, 0xc8, 0x5d, 0xb8, 0x6b, 0x74, 0x42, 0x0f, 0x73, 0xad, 0x30, 0x43, 0x01, 0x0c, 0xfd, 0x94, 0x00, 0xdb, 0x28, 0x64, 0xf1, 0xa5, 0x35, 0x6f, 0x64, 0xe1, + 0xd8, 0x88, 0xde, 0xae, 0x4a, 0x64, 0x13, 0x61, 0x21, 0x29, 0x13, 0x95, 0xa2, 0xd0, 0xc2, 0xc6, 0x39, 0x18, 0xc9, 0x08, 0x59, 0x7a, 0xaf, 0x20, 0x15, 0xfc, 0x80, 0x71, 0xb2, 0x22, 0x99, 0x3a, + 0x66, 0xf5, 0x53, 0x0e, 0xc5, 0x13, 0x22, 0xf0, 0x8d, 0xea, 0x15, 0xb4, 0xeb, 0xf1, 0x25, 0x8f, 0x62, 0x84, 0x18, 0x64, 0x14, 0xe6, 0x14, 0xcb, 0xab, 0x10, 0xad, 0x00, 0x91, 0x37, 0xea, 0x50, + 0xcb, 0xc8, 0x99, 0x88, 0x35, 0x76, 0xda, 0xd9, 0x5b, 0x71, 0x8f, 0x36, 0x4e, 0xed, 0xcb, 0x79, 0x4d, 0xf6, 0x21, 0x26, 0xab, 0xab, 0x10, 0xb2, 0xe3, 0xfd, 0x3e, 0x9f, 0x74, 0x3e, 0x13, 0xd4, + 0xbc, 0xc9, 0x2e, 0x26, 0xc3, 0xca, 0x4f, 0x61, 0x90, 0x73, 0x20, 0x18, 0x3d, 0xc2, 0xa8, 0x87, 0xb3, 0xfd, 0xe9, 0x64, 0xb6, 0xcf, 0x89, 0x41, 0xb3, 0xec, 0x53, 0xfb, 0x14, 0x5e, 0x0d, 0x63, + 0xe0, 0x6b, 0xc6, 0xd0, 0xf7, 0x3e, 0x9d, 0xd7, 0xc5, 0x88, 0xf8, 0xfc, 0x50, 0x12, 0x26, 0xee, 0xc5, 0xa4, 0xff, 0xb4, 0x1d, 0xf5, 0x68, 0x12, 0x67, 0x45, 0x12, 0x3a, 0xaf, 0x5f, 0xed, 0x1f, + 0x74, 0xf7, 0xbd, 0x93, 0x7d, 0xfd, 0x1a, 0xd7, 0x93, 0xb1, 0xce, 0x3d, 0x80, 0xb1, 0xe5, 0x79, 0xbb, 0x58, 0x32, 0xc3, 0xb6, 0xf1, 0xc2, 0x53, 0x89, 0x67, 0xc9, 0x66, 0x22, 0x87, 0xfa, 0x86, + 0x0c, 0xe9, 0x89, 0x32, 0x70, 0xc8, 0xde, 0x6e, 0xc1, 0x43, 0x7c, 0xc8, 0x56, 0x69, 0x70, 0xe8, 0x68, 0x9b, 0xe7, 0xa2, 0x0a, 0xd8, 0xe3, 0x1d, 0xd1, 0x32, 0x16, 0x50, 0x63, 0x02, 0x5b, 0x13, + 0x3b, 0x6b, 0x4e, 0x1c, 0x57, 0x70, 0xda, 0x55, 0xf1, 0x12, 0x5d, 0xe0, 0x56, 0x73, 0x78, 0x4e, 0xc5, 0xfa, 0xa8, 0x92, 0x7f, 0xa7, 0x94, 0x63, 0xe0, 0x76, 0xd9, 0x6b, 0x47, 0xeb, 0x6f, 0x1a, + 0x41, 0x96, 0xda, 0x0f, 0xea, 0xf6, 0x7c, 0x8e, 0xe2, 0x7b, 0xb4, 0x7e, 0x65, 0x45, 0x6b, 0x16, 0xce, 0x43, 0xe9, 0x0a, 0x3c, 0xe7, 0x65, 0x7c, 0xa3, 0x7a, 0xfd, 0x28, 0xd7, 0xe3, 0x29, 0x30, + 0xce, 0xcf, 0x68, 0xd5, 0xd2, 0x0a, 0xf0, 0x72, 0xaa, 0x92, 0x58, 0x59, 0x59, 0x08, 0xa4, 0xec, 0x62, 0x01, 0x0d, 0xa1, 0x44, 0xc5, 0xd4, 0xd6, 0x32, 0x93, 0xb6, 0x16, 0x62, 0xec, 0x48, 0x6c, + 0xd7, 0xf1, 0x2a, 0xbb, 0x6b, 0x21, 0x5f, 0xb0, 0x5b, 0x36, 0x9b, 0xb7, 0xbd, 0x69, 0xc5, 0x03, 0x3f, 0x08, 0x24, 0x3a, 0xcc, 0x3b, 0x72, 0xbe, 0x05, 0xb9, 0x5d, 0x74, 0x9a, 0xed, 0x2a, 0x8c, + 0x57, 0xe6, 0xa6, 0x9e, 0x7d, 0xf7, 0x43, 0x97, 0xbf, 0x0a, 0xd7, 0x8c, 0xf3, 0x9f, 0xda, 0xab, 0x3d, 0x25, 0x1d, 0x3e, 0xe8, 0xbe, 0x0c, 0xfe, 0xe3, 0x6c, 0x4c, 0x8c, 0x18, 0x38, 0x5d, 0x8a, + 0x72, 0xb5, 0x91, 0x79, 0x35, 0xe2, 0x72, 0x12, 0x02, 0xb2, 0x34, 0x20, 0x4a, 0x4a, 0x94, 0x92, 0x03, 0x76, 0x22, 0x46, 0x2c, 0x11, 0xe5, 0x8f, 0xf1, 0xce, 0xd0, 0x53, 0x35, 0x8f, 0xdf, 0x88, + 0x5e, 0x46, 0xf3, 0x1a, 0xf3, 0x0c, 0x8d, 0xab, 0x79, 0xdc, 0x85, 0x67, 0x5e, 0x94, 0x90, 0x8e, 0x74, 0x59, 0xa5, 0xa6, 0xe6, 0xf5, 0x31, 0x99, 0x78, 0x4b, 0xc9, 0x5e, 0x0b, 0x3e, 0x47, 0xf1, + 0xa1, 0x40, 0xed, 0x27, 0xae, 0x16, 0xf6, 0x0a, 0x1e, 0x95, 0xbe, 0xba, 0x38, 0x83, 0xd6, 0x49, 0xed, 0xfd, 0x0a, 0x00, 0x32, 0x52, 0xce, 0x5a, 0x0a, 0x67, 0x9c, 0x2a, 0x17, 0x58, 0xd3, 0xdc, + 0xfb, 0x5c, 0x45, 0x80, 0xd0, 0x7e, 0x6e, 0x5a, 0x13, 0x9a, 0xe6, 0x7e, 0x57, 0xc6, 0xf0, 0xb5, 0x58, 0x55, 0x7c, 0x17, 0xa0, 0x2f, 0x75, 0x77, 0x1f, 0xed, 0x68, 0x3d, 0x21, 0x87, 0x3e, 0x53, + 0x7e, 0x81, 0xea, 0xf3, 0xf9, 0xe8, 0x8e, 0x4b, 0xeb, 0xac, 0x21, 0x07, 0x5e, 0x43, 0xe6, 0xe5, 0x92, 0xd0, 0x63, 0x94, 0xf0, 0xe4, 0xc5, 0x71, 0x83, 0x96, 0x8d, 0xbc, 0xad, 0xcd, 0xd0, 0xda, + 0x77, 0x9a, 0xb8, 0x59, 0x6e, 0x13, 0x4a, 0xb0, 0x94, 0x7a, 0x51, 0x00, 0xbc, 0x07, 0x72, 0xe1, 0x3e, 0xcb, 0x57, 0xfc, 0x7c, 0x17, 0x2e, 0xa3, 0x50, 0xa7, 0x16, 0x96, 0x67, 0x9a, 0xd0, 0x32, + 0xc0, 0xac, 0xc2, 0x15, 0x31, 0x72, 0xa7, 0x2a, 0x6b, 0xe0, 0x7b, 0x78, 0xe0, 0x0f, 0xc5, 0xd8, 0x1e, 0xcd, 0x83, 0xe7, 0x01, 0xf9, 0xf6, 0x2b, 0x9f, 0xc0, 0xf9, 0x76, 0x6f, 0x4c, 0x78, 0x20, + 0x38, 0x5d, 0xb5, 0xe7, 0xa1, 0x51, 0x0f, 0x38, 0xe7, 0x83, 0x51, 0xe2, 0x70, 0x36, 0x1d, 0x61, 0x7e, 0x19, 0xaf, 0x59, 0xbf, 0xb7, 0x7f, 0x3f, 0x47, 0xbe, 0xd6, 0x55, 0x7e, 0xc4, 0x02, 0x7f, + 0xae, 0x4b, 0xdd, 0x50, 0x9e, 0x4d, 0x6f, 0xcf, 0xc7, 0xf6, 0x2b, 0x12, 0x37, 0xea, 0x00, 0x2a, 0x11, 0xce, 0xcb, 0xc0, 0x7c, 0xbe, 0x77, 0x9b, 0xc3, 0x0a, 0x8d, 0x9a, 0xb4, 0x9a, 0x57, 0xf2, + 0x49, 0xdb, 0x11, 0x1c, 0x88, 0x38, 0x9d, 0x18, 0x87, 0xa7, 0x4d, 0xbd, 0xaf, 0x90, 0x9a, 0x9e, 0x07, 0x2c, 0xc9, 0x46, 0xdb, 0x7e, 0x4b, 0x85, 0x5b, 0x09, 0x1d, 0x98, 0xad, 0x1b, 0x53, 0x0e, + 0x3d, 0x17, 0x77, 0x12, 0xa9, 0x19, 0x43, 0xb9, 0xe9, 0x80, 0xa3, 0x49, 0x6f, 0xe7, 0x23, 0xf6, 0x1b, 0x46, 0x54, 0xa4, 0xfe, 0xc3, 0x12, 0xd2, 0xaf, 0xf7, 0xff, 0x9f, 0x6f, 0xe8, 0xdf, 0x2d, + 0x59, 0xfd, 0xcf, 0x09, 0xe0, 0xfb, 0x3f, 0xf1, 0xfa, 0x3d, 0xbe, 0xdf, 0x18, 0x23, 0x96, 0x2f, 0x11, 0x78, 0x4c, 0xe2, 0xb0, 0xa0, 0xde, 0xac, 0xc5, 0xd0, 0xc8, 0xe3, 0x6a, 0xb1, 0xf3, 0x4f, + 0x75, 0x78, 0x48, 0xfb, 0xfa, 0x34, 0x74, 0xfc, 0x4c, 0xc2, 0x76, 0xf4, 0x46, 0x83, 0x41, 0xce, 0x85, 0xa9, 0x15, 0xb8, 0x3b, 0xa3, 0x16, 0x20, 0x43, 0xfb, 0x40, 0x43, 0xe7, 0x07, 0x2e, 0x9c, + 0x37, 0x46, 0xbe, 0xa7, 0x45, 0xd5, 0x39, 0xa7, 0x13, 0x70, 0x6d, 0x9b, 0x64, 0x9b, 0x0e, 0x8a, 0x82, 0x36, 0x8b, 0xe8, 0x39, 0xc5, 0xed, 0x37, 0x15, 0xc8, 0x1f, 0x55, 0x0e, 0xbf, 0xff, 0x41, + 0x1e, 0x87, 0x39, 0xe2, 0xbf, 0xc0, 0x27, 0x42, 0x15, 0x5e, 0x23, 0x1c, 0x2f, 0x91, 0x7d, 0x17, 0x0a, 0xbf, 0x87, 0x76, 0xdb, 0x9a, 0x5d, 0xdb, 0x1b, 0x38, 0xb4, 0x3d, 0xe1, 0x8d, 0xb1, 0xde, + 0x55, 0xbb, 0x5d, 0xd1, 0xb7, 0x1a, 0x60, 0xd4, 0xdb, 0x5e, 0xae, 0x0a, 0x87, 0xae, 0x4c, 0xcb, 0xf5, 0x0c, 0x8e, 0xd4, 0x51, 0x63, 0xb5, 0x09, 0xd4, 0xca, 0x77, 0x86, 0x34, 0xae, 0x25, 0xb7, + 0xec, 0x76, 0xc9, 0x3e, 0xac, 0x18, 0x40, 0x26, 0x85, 0x89, 0x00, 0x61, 0xe5, 0x51, 0x61, 0x5d, 0x4e, 0x5e, 0x43, 0x2d, 0x4f, 0xfd, 0x6e, 0x99, 0x78, 0x30, 0x0d, 0x6e, 0xb4, 0x82, 0x3b, 0xca, + 0x56, 0x98, 0x7a, 0x97, 0x8d, 0xa5, 0xbf, 0xef, 0xaa, 0x69, 0x61, 0x1a, 0xb8, 0x45, 0x78, 0xf5, 0x1a, 0xdc, 0x7c, 0x93, 0xdf, 0x54, 0x61, 0xfc, 0xa4, 0xc2, 0xc1, 0x77, 0x5c, 0x11, 0xe1, 0xa5, + 0x62, 0x7e, 0x16, 0xd7, 0xd5, 0xe7, 0x5d, 0xb3, 0x87, 0xdf, 0xf3, 0x23, 0xa2, 0xf2, 0xde, 0x67, 0x45, 0x9f, 0x8a, 0xd8, 0xf8, 0x44, 0xf7, 0xed, 0xeb, 0x5e, 0xcf, 0x2e, 0xb5, 0x66, 0x46, 0xe8, + 0x02, 0xa4, 0xb0, 0xf6, 0x65, 0x71, 0xe1, 0xe6, 0xe1, 0x46, 0x6f, 0xf7, 0x30, 0x29, 0xa5, 0xab, 0x6e, 0x82, 0xaa, 0xa9, 0x52, 0x43, 0x2c, 0xa5, 0x3b, 0x83, 0xb5, 0xda, 0x23, 0xa8, 0xbb, 0x6d, + 0xc1, 0xa6, 0x80, 0x07, 0x0a, 0x6e, 0x8c, 0xad, 0xdb, 0xbb, 0x0e, 0x58, 0x2e, 0xe6, 0x41, 0x6a, 0xd9, 0x82, 0x3d, 0x9f, 0xc9, 0x05, 0xdf, 0xf3, 0xa8, 0xb4, 0x17, 0x8b, 0xd3, 0x6a, 0x40, 0x4c, + 0x79, 0x6e, 0x64, 0xcf, 0xcd, 0x9f, 0xaf, 0x05, 0x3c, 0x7f, 0x98, 0x1a, 0xe6, 0xc3, 0x94, 0x42, 0x10, 0xfe, 0x45, 0x3c, 0x23, 0x9d, 0xae, 0x44, 0x5f, 0x31, 0x34, 0xe3, 0x72, 0x7a, 0x25, 0xf4, + 0x7b, 0x00, 0x0b, 0xb6, 0x72, 0x48, 0x6c, 0xb2, 0xa7, 0xa9, 0x75, 0xe4, 0x32, 0x0d, 0x39, 0x07, 0x8b, 0xfc, 0x3c, 0x30, 0xcd, 0x69, 0x76, 0x82, 0x67, 0x21, 0xce, 0xb8, 0x3b, 0x31, 0x2c, 0xfa, + 0xf0, 0x58, 0x6f, 0x58, 0x80, 0x6d, 0xe7, 0x76, 0xde, 0x6f, 0x78, 0xb2, 0x82, 0xa2, 0xca, 0x22, 0xdb, 0x83, 0x29, 0x39, 0x01, 0x3d, 0x41, 0x71, 0x58, 0x43, 0x9a, 0x63, 0x8b, 0xad, 0xed, 0x88, + 0xdb, 0x9b, 0x65, 0x38, 0x7f, 0xce, 0x54, 0xb9, 0x6c, 0xe2, 0x7a, 0x6f, 0x7b, 0xaa, 0xc0, 0x2f, 0x08, 0xf8, 0xb3, 0x24, 0xa1, 0xcf, 0xff, 0xff, 0x71, 0xf9, 0x9b, 0xe1, 0xf1, 0x35, 0x9e, 0x6d, + 0x2c, 0xc6, 0xef, 0xe4, 0x67, 0xd3, 0x8f, 0xe3, 0xe9, 0x95, 0xe0, 0xc8, 0x20, 0x32, 0x77, 0xe2, 0x32, 0x48, 0x01, 0xcc, 0xc2, 0x63, 0x9a, 0x93, 0x1d, 0x4d, 0xa0, 0xd0, 0x00, 0x93, 0x93, 0x1d, + 0x40, 0x55, 0xa8, 0xb4, 0x9b, 0xcd, 0x76, 0xd1, 0xa6, 0x95, 0x1c, 0x48, 0x5d, 0xb2, 0x4c, 0x52, 0xf4, 0x6d, 0xe7, 0xa1, 0x4d, 0x69, 0xc4, 0x01, 0x22, 0x61, 0x71, 0xd8, 0xc5, 0x18, 0x35, 0x69, + 0x87, 0x19, 0xe1, 0x4c, 0x12, 0x53, 0x91, 0xc9, 0xd3, 0x0e, 0x5c, 0xae, 0x4f, 0x6b, 0x78, 0xfb, 0x7c, 0xae, 0xef, 0x0b, 0xab, 0x58, 0x8f, 0x5c, 0xe9, 0x20, 0xf8, 0x54, 0x72, 0xeb, 0x95, 0xe6, + 0x2b, 0x1f, 0x5a, 0xfd, 0xf4, 0x4a, 0xe6, 0xf7, 0x6c, 0xe8, 0x79, 0x4e, 0x92, 0x95, 0x11, 0x49, 0x00, 0x78, 0x8f, 0x4f, 0x62, 0x12, 0xdc, 0xf1, 0x40, 0xc4, 0x6c, 0x49, 0x49, 0x4d, 0xf4, 0x3a, + 0x9e, 0xe1, 0x20, 0xda, 0x85, 0xeb, 0x2d, 0x13, 0x65, 0x70, 0x40, 0x6d, 0xf7, 0x8a, 0x1d, 0x16, 0xbe, 0xb8, 0x4b, 0x35, 0x66, 0x91, 0xa2, 0x3e, 0x9c, 0x54, 0x12, 0xa1, 0x08, 0xdb, 0x85, 0x6a, + 0x9d, 0xbc, 0xda, 0x04, 0xd9, 0xdc, 0x4d, 0x21, 0x74, 0xa6, 0xd9, 0xcf, 0xb9, 0x16, 0xaf, 0x7d, 0x20, 0xea, 0xf4, 0x15, 0x88, 0xef, 0xa1, 0xac, 0x9f, 0x1a, 0x85, 0x5d, 0x85, 0xee, 0xf7, 0xb8, + 0x84, 0x4f, 0xb7, 0xbf, 0xa8, 0x3b, 0x9f, 0xaa, 0x08, 0xa3, 0x5f, 0x4b, 0x00, 0xff, 0x14, 0x96, 0x5e, 0xc6, 0xe6, 0x4d, 0x69, 0xe1, 0x3f, 0x98, 0x17, 0xdf, 0xfa, 0x49, 0xfd, 0xf5, 0xd7, 0x77, + 0xd9, 0x4d, 0x3c, 0x35, 0x27, 0xde, 0x9b, 0x4a, 0xbd, 0x76, 0x94, 0xba, 0x50, 0x1a, 0x37, 0x19, 0x28, 0x3e, 0xf7, 0x68, 0x7c, 0x9f, 0x87, 0x8c, 0x92, 0x53, 0xf1, 0x8c, 0xc4, 0x64, 0x64, 0x4e, + 0x50, 0xe6, 0x7a, 0x83, 0xe9, 0x33, 0x92, 0x52, 0xe6, 0x30, 0xa3, 0x58, 0x56, 0x0f, 0x79, 0x7b, 0x00, 0x68, 0x10, 0xc6, 0x6a, 0xf6, 0x94, 0x76, 0x64, 0x32, 0x53, 0x02, 0x0f, 0xd4, 0x9e, 0x2b, + 0xe1, 0x50, 0x42, 0xe1, 0x7c, 0xa3, 0xe3, 0x4c, 0x65, 0x9c, 0x50, 0x8e, 0x5c, 0xac, 0x51, 0x3c, 0x04, 0x0f, 0xa3, 0x6a, 0x9b, 0xde, 0x9f, 0x0c, 0xd9, 0xc3, 0xbe, 0x89, 0xcf, 0x59, 0x2a, 0x2f, + 0x04, 0x5f, 0xe6, 0x41, 0x96, 0x3b, 0x63, 0xec, 0x8f, 0x8b, 0x7f, 0x1d, 0x43, 0xad, 0x5d, 0xbc, 0x36, 0x9d, 0xae, 0xc9, 0xad, 0x19, 0x09, 0x99, 0x96, 0xea, 0xc4, 0x67, 0xee, 0xac, 0xa2, 0x18, + 0x1c, 0xd5, 0x52, 0x6a, 0x80, 0xc7, 0xea, 0x84, 0x95, 0x60, 0xb9, 0x96, 0x88, 0x7a, 0x57, 0x6a, 0x12, 0x0e, 0x74, 0xe7, 0xf5, 0xa0, 0x9e, 0x3b, 0xd5, 0x03, 0x5d, 0xe5, 0x4c, 0xd7, 0x69, 0xab, + 0x40, 0xfc, 0xc9, 0x1e, 0x18, 0xd7, 0x74, 0x87, 0x05, 0xa7, 0x18, 0x41, 0x3b, 0x42, 0x4b, 0xbf, 0xaf, 0xda, 0x3d, 0xd0, 0xb5, 0x03, 0xb3, 0x70, 0xa6, 0x85, 0x1b, 0xbd, 0x67, 0x82, 0x3e, 0xf2, + 0xba, 0xfd, 0xf9, 0x2a, 0x76, 0x4b, 0x7a, 0x36, 0xfd, 0x72, 0x61, 0x6c, 0xca, 0x82, 0xba, 0x36, 0xa8, 0x49, 0x68, 0xd1, 0x41, 0x87, 0x0b, 0x56, 0x40, 0xba, 0xb8, 0xa0, 0x56, 0x19, 0x63, 0xd5, + 0x7b, 0x24, 0x98, 0xf1, 0xb5, 0xa0, 0xb0, 0x9b, 0xc9, 0x86, 0x08, 0x66, 0x2e, 0xa5, 0x65, 0xd5, 0x46, 0x8f, 0x01, 0x8f, 0xf2, 0x25, 0x1c, 0xea, 0xe8, 0xe5, 0x82, 0xf3, 0xd7, 0x01, 0x04, 0x09, + 0x1b, 0x63, 0x2d, 0xa8, 0xbb, 0x8e, 0xe2, 0x8f, 0x75, 0x40, 0x16, 0x20, 0x50, 0x10, 0xac, 0x33, 0xc6, 0x97, 0x7e, 0x35, 0x65, 0x1e, 0xb1, 0xd0, 0x9f, 0x0b, 0xd3, 0xc0, 0x2c, 0x2f, 0x20, 0x94, + 0xd3, 0xb1, 0x52, 0x14, 0x72, 0x1a, 0x01, 0x50, 0x0f, 0x98, 0xe0, 0x46, 0xb8, 0x74, 0x3a, 0x6e, 0x56, 0x85, 0x1b, 0x44, 0xd6, 0xc0, 0x93, 0xd1, 0x32, 0x47, 0x67, 0x2a, 0xb7, 0xcf, 0xd1, 0x4a, + 0xc9, 0x8f, 0x6b, 0x15, 0xd9, 0xb0, 0xac, 0xc1, 0x81, 0x33, 0xaa, 0xb3, 0x96, 0x52, 0xe5, 0xcd, 0xca, 0x90, 0x84, 0xe4, 0xa3, 0xe2, 0x02, 0x73, 0xdb, 0xa4, 0x13, 0xb5, 0xd2, 0xf5, 0xe1, 0xc8, + 0xac, 0x2d, 0x4a, 0x46, 0x86, 0x11, 0xce, 0xf3, 0x47, 0x66, 0xde, 0x03, 0x06, 0x2a, 0xa7, 0x56, 0xe8, 0x87, 0x8f, 0x3d, 0x4a, 0xe0, 0x53, 0xbd, 0x26, 0x3f, 0xd1, 0x7d, 0x45, 0xed, 0xf5, 0xec, + 0x82, 0xde, 0x08, 0x5d, 0xb2, 0x92, 0x9b, 0x05, 0x57, 0x51, 0xc5, 0x3c, 0x3e, 0x2d, 0x01, 0xa6, 0x03, 0x4c, 0x31, 0xdc, 0xcf, 0x77, 0x13, 0x21, 0x57, 0x91, 0x21, 0x84, 0x8a, 0xd9, 0xce, 0x75, + 0x51, 0xf5, 0x24, 0xd1, 0x96, 0x79, 0x6e, 0x60, 0x54, 0xda, 0xea, 0xfc, 0x60, 0xb5, 0xa2, 0xb7, 0x94, 0x0d, 0x83, 0x05, 0x4e, 0xd2, 0x44, 0x72, 0x30, 0x18, 0x80, 0x0e, 0x1b, 0x03, 0xca, 0x67, + 0xd6, 0x66, 0xc1, 0x64, 0x12, 0xac, 0x66, 0x63, 0x7a, 0xb6, 0xbe, 0xbc, 0xab, 0x17, 0x9b, 0x8f, 0x82, 0xa1, 0x9f, 0xdb, 0x4f, 0x78, 0x23, 0xfa, 0x8a, 0xc5, 0xcb, 0xe1, 0xe8, 0xdd, 0x84, 0xfe, + 0xb4, 0x51, 0x66, 0x22, 0xc8, 0x45, 0xca, 0xd1, 0xae, 0xf2, 0xdc, 0x5f, 0x93, 0xbe, 0x27, 0x0b, 0x40, 0xc5, 0xa9, 0xb5, 0x71, 0x88, 0x02, 0x9f, 0x2f, 0x40, 0xfc, 0x74, 0x56, 0xea, 0x84, 0x8f, + 0x31, 0xd2, 0x6b, 0x60, 0x66, 0x2d, 0xc7, 0xee, 0x01, 0x3f, 0x1b, 0x87, 0x21, 0xd3, 0xe8, 0xa5, 0x42, 0xb2, 0x0a, 0xbd, 0x40, 0x76, 0x42, 0xb6, 0x9a, 0x19, 0xdd, 0x01, 0x66, 0x9a, 0x98, 0xdf, + 0x8f, 0x05, 0xe2, 0xc3, 0xe4, 0xff, 0x47, 0x27, 0xd2, 0x1b, 0xdd, 0x57, 0x38, 0x5e, 0xcf, 0xc6, 0x4e, 0xac, 0x18, 0xde, 0x2e, 0xea, 0x25, 0xc6, 0xfb, 0xf4, 0xae, 0x55, 0x68, 0xee, 0xe4, 0xe8, + 0x2b, 0x26, 0x0c, 0xf4, 0xa8, 0x42, 0x73, 0x69, 0x6f, 0x31, 0x3e, 0x82, 0x15, 0x55, 0x9c, 0xa4, 0xf2, 0x3e, 0x3e, 0x58, 0x7e, 0x42, 0x11, 0x5b, 0x61, 0x5d, 0x70, 0x1b, 0x4b, 0xd7, 0x97, 0x94, + 0x6c, 0xa5, 0x7b, 0x73, 0xe3, 0x76, 0x3c, 0x57, 0x85, 0x7b, 0x81, 0x08, 0x12, 0x57, 0x8a, 0xa4, 0x01, 0x52, 0x9c, 0xc9, 0x37, 0x17, 0xda, 0xf7, 0xf6, 0x3d, 0xff, 0x9c, 0xff, 0xe2, 0x0b, 0xed, + 0x57, 0x18, 0x3e, 0x5d, 0x19, 0xeb, 0xb1, 0x38, 0x2d, 0x23, 0x5b, 0xde, 0x05, 0x69, 0xbc, 0x52, 0xc1, 0x53, 0x9f, 0xad, 0x4e, 0xb8, 0xa0, 0x71, 0xb2, 0xd9, 0xb2, 0xe8, 0x46, 0xb0, 0x66, 0xdb, + 0xe1, 0x60, 0xa3, 0xed, 0x9c, 0x02, 0xa0, 0x40, 0x50, 0x04, 0xc0, 0xf1, 0x96, 0x52, 0x64, 0xb1, 0x22, 0xd7, 0xf8, 0xa0, 0x83, 0xd9, 0x1e, 0xcc, 0x5a, 0xee, 0x21, 0xa9, 0x0e, 0x73, 0xd5, 0xb2, + 0x54, 0xf8, 0x3c, 0x18, 0x90, 0xe2, 0x06, 0x73, 0xfc, 0x38, 0x22, 0x88, 0xec, 0x9e, 0x3b, 0xe8, 0xc1, 0xa6, 0xd0, 0xfb, 0xb6, 0xc6, 0x3f, 0x08, 0xdf, 0x85, 0xe4, 0x0b, 0x6a, 0x97, 0x83, 0xb1, + 0x60, 0x89, 0xcb, 0xad, 0x0a, 0x54, 0xe6, 0x51, 0x14, 0x8c, 0xaa, 0x59, 0x4b, 0x6b, 0xd2, 0xa1, 0x16, 0x81, 0x5b, 0x26, 0x99, 0x6f, 0x14, 0x55, 0xad, 0x35, 0xea, 0xb1, 0x5c, 0xb2, 0x86, 0x72, + 0x82, 0xe4, 0xc3, 0xc4, 0x4c, 0xcb, 0xfc, 0x6c, 0x40, 0x0d, 0x9f, 0x66, 0x5b, 0x1f, 0x5f, 0x33, 0xe0, 0xe4, 0x70, 0x02, 0xb1, 0x1d, 0x38, 0x27, 0xf7, 0xa1, 0x0d, 0x52, 0xf5, 0x92, 0xb0, 0x16, + 0x84, 0x0d, 0x25, 0xe8, 0x98, 0x92, 0x2d, 0x41, 0x56, 0x56, 0xae, 0x33, 0xf5, 0xc3, 0x97, 0x95, 0xdd, 0x7b, 0xd4, 0x24, 0xf9, 0xb9, 0x60, 0x8d, 0x2f, 0xb4, 0x5f, 0x40, 0xb9, 0xbd, 0x32, 0x36, + 0x78, 0xe3, 0xd4, 0x2f, 0x6a, 0x46, 0x38, 0x46, 0x9b, 0xb3, 0x51, 0xd3, 0x96, 0xc4, 0x0e, 0x5b, 0x42, 0x9d, 0xc3, 0xbb, 0x41, 0x0c, 0xda, 0x35, 0x85, 0x83, 0xd9, 0xf2, 0x28, 0xf7, 0x83, 0x9a, + 0x4d, 0xb8, 0xbd, 0xb1, 0x9e, 0xe4, 0xa9, 0xb8, 0xdf, 0x77, 0xb5, 0xed, 0x9c, 0x0a, 0xc1, 0x68, 0x4e, 0x5b, 0x29, 0x2d, 0x3c, 0xf4, 0x20, 0x95, 0x22, 0x3f, 0x59, 0x6f, 0x80, 0x39, 0xdd, 0x42, + 0x73, 0x5b, 0x22, 0xb7, 0x4f, 0x76, 0xb8, 0x8d, 0x8b, 0xfa, 0x4b, 0xa7, 0x91, 0x07, 0x9e, 0x90, 0x17, 0x5c, 0xa6, 0x97, 0x90, 0xe8, 0xc7, 0xfb, 0x21, 0x4f, 0x31, 0xd8, 0x07, 0xdd, 0x17, 0x40, + 0x3f, 0xce, 0xc6, 0x36, 0xdd, 0x5e, 0x56, 0x6d, 0xb1, 0x9a, 0xb9, 0x35, 0x35, 0x98, 0x4c, 0xa4, 0xbb, 0xd2, 0x59, 0xf0, 0xe3, 0x1e, 0x5f, 0x01, 0xe7, 0x26, 0x0c, 0xb5, 0x6c, 0x73, 0x4c, 0x1b, + 0x86, 0x85, 0x0c, 0x30, 0x8f, 0x29, 0x47, 0xf3, 0xad, 0x3e, 0x6a, 0x60, 0x24, 0x67, 0x15, 0xd9, 0x9a, 0x0f, 0x99, 0xcb, 0xf2, 0x3d, 0xdd, 0xc3, 0xf0, 0x84, 0x3e, 0xf6, 0xe8, 0xb1, 0x9a, 0x1f, + 0xb3, 0x89, 0x72, 0x90, 0x2a, 0x41, 0x97, 0x47, 0xcc, 0xcb, 0xd7, 0x86, 0xe3, 0x7f, 0x7f, 0x6b, 0xd0, 0x71, 0xe3, 0xb5, 0xfa, 0xd6, 0x74, 0xce, 0xad, 0xde, 0x1b, 0xce, 0x65, 0xde, 0xdf, 0xdf, + 0x52, 0xc1, 0x2f, 0x85, 0xbd, 0xcd, 0xaa, 0x2e, 0xdd, 0xf7, 0xff, 0xbf, 0x31, 0xa3, 0xaa, 0x2c, 0x74, 0xdc, 0xb4, 0x0a, 0xbd, 0x6b, 0x59, 0xee, 0x57, 0x1d, 0xfd, 0xee, 0x17, 0x0b, 0xed, 0x2c, + 0x6d, 0xa6, 0x71, 0x58, 0x3d, 0xda, 0x89, 0x00, 0x7e, 0x21, 0xbf, 0xa0, 0x3f, 0x0f, 0xa6, 0xf9, 0xa0, 0xfb, 0x62, 0xff, 0xbc, 0x9f, 0x4c, 0xaf, 0xe4, 0x7e, 0xff, 0xc1, 0x1a, 0x98, 0xd7, 0x52, + 0x83, 0xb4, 0x9b, 0xb4, 0x6f, 0x4f, 0xca, 0x81, 0x31, 0xb2, 0x64, 0x4d, 0xda, 0x55, 0xec, 0xe2, 0x92, 0xa6, 0xb9, 0xae, 0x23, 0x48, 0x30, 0xd8, 0xb6, 0x31, 0xae, 0xc6, 0x7d, 0xa6, 0x09, 0x88, + 0x18, 0xce, 0xcd, 0xa2, 0x91, 0xdd, 0x74, 0x27, 0x1e, 0x53, 0x17, 0x54, 0x6c, 0xa9, 0x0d, 0x16, 0x5b, 0x90, 0x6d, 0xb7, 0x6b, 0x08, 0xb4, 0x98, 0xb3, 0x93, 0x47, 0xc4, 0xac, 0x18, 0xa1, 0xed, + 0x97, 0xa6, 0xe7, 0x16, 0x9f, 0xfa, 0x1c, 0xfe, 0x5f, 0xff, 0xe7, 0x5f, 0x97, 0x96, 0x14, 0x7f, 0xfd, 0x1f, 0x7f, 0x3d, 0x50, 0xf9, 0x43, 0xd7, 0x75, 0x71, 0x14, 0x79, 0x28, 0x50, 0x9f, 0x09, + 0x6b, 0x7e, 0xa5, 0xf9, 0x02, 0xdd, 0xf5, 0x68, 0x6c, 0x13, 0x33, 0xc7, 0xee, 0xcf, 0x01, 0xdd, 0x68, 0xe0, 0x02, 0xc1, 0x62, 0xcd, 0xb0, 0xd5, 0xf3, 0x22, 0xe7, 0x26, 0xcb, 0x8a, 0x97, 0x44, + 0xd5, 0x59, 0xf3, 0x3b, 0x6c, 0x46, 0x7b, 0x68, 0x54, 0x42, 0x43, 0x56, 0x1f, 0xca, 0xf3, 0x0a, 0x5f, 0x63, 0xe5, 0xb2, 0x0b, 0xab, 0xf5, 0x62, 0x82, 0x73, 0x3a, 0x07, 0xcd, 0x39, 0x47, 0x13, + 0xb6, 0xac, 0x53, 0xcf, 0x87, 0x2d, 0x52, 0x2e, 0xd3, 0x4c, 0x15, 0xd3, 0xb3, 0xf9, 0x6d, 0x29, 0xfe, 0xb1, 0x07, 0x33, 0xf2, 0x54, 0xb6, 0xdd, 0x57, 0x5b, 0x19, 0xf9, 0x7d, 0x66, 0xdd, 0xcb, + 0x78, 0xed, 0x7e, 0x49, 0x73, 0xc5, 0xd9, 0x9e, 0xe9, 0x8e, 0x7d, 0x5c, 0xa6, 0xe1, 0x26, 0x18, 0xd6, 0x08, 0x34, 0x21, 0x07, 0x79, 0xe2, 0xef, 0xda, 0xe4, 0x30, 0x08, 0xf2, 0xd2, 0x96, 0x16, + 0xa2, 0xde, 0xf6, 0x72, 0x4d, 0x51, 0x54, 0x3f, 0xe3, 0xa2, 0xba, 0x3b, 0x6e, 0x8d, 0xd9, 0x92, 0x65, 0x58, 0x8c, 0xcf, 0xce, 0xe0, 0x2e, 0x1c, 0x78, 0x81, 0x3a, 0xf6, 0x8a, 0xdd, 0x10, 0x02, + 0x22, 0x18, 0x6b, 0x7e, 0xcc, 0x12, 0xf2, 0xfa, 0x9a, 0x56, 0x3f, 0x75, 0x5c, 0xcf, 0xac, 0xe3, 0x7f, 0xb6, 0xce, 0xc7, 0x37, 0xea, 0x1f, 0xc0, 0x7c, 0x5c, 0x1b, 0x63, 0x38, 0x83, 0x53, 0x99, + 0xcf, 0x2b, 0xbb, 0xb1, 0x56, 0x19, 0x46, 0x90, 0x67, 0x13, 0xe4, 0xd0, 0xcc, 0x29, 0x10, 0x24, 0x74, 0xb9, 0xf6, 0x34, 0x62, 0x94, 0xb7, 0x9d, 0x9b, 0xee, 0x0d, 0xf0, 0xb9, 0x82, 0x5e, 0x9f, + 0x09, 0xbf, 0x8c, 0xed, 0xd3, 0xe9, 0xd8, 0xe2, 0x5e, 0x8d, 0xab, 0xeb, 0x81, 0x68, 0x4e, 0x68, 0x50, 0xa4, 0xb8, 0x21, 0x6d, 0x82, 0x03, 0xdb, 0x59, 0x84, 0x67, 0x76, 0x71, 0xd1, 0x1e, 0xd2, + 0xae, 0x74, 0x69, 0xd2, 0x22, 0x73, 0x04, 0xc5, 0x19, 0xa0, 0xdd, 0xee, 0xc2, 0x0c, 0xb2, 0x04, 0x99, 0x4b, 0x23, 0x9d, 0x0e, 0xf8, 0x68, 0xa2, 0x87, 0xe4, 0x19, 0x03, 0xbb, 0x82, 0x5f, 0x05, + 0xe2, 0x69, 0x1e, 0x6a, 0xea, 0x09, 0x5d, 0x0e, 0xbe, 0xc8, 0x3f, 0xe7, 0xdc, 0x7e, 0xf5, 0xca, 0x27, 0x99, 0x53, 0xc7, 0x0f, 0x72, 0x6c, 0x5e, 0x71, 0xb9, 0x64, 0x10, 0xff, 0xfd, 0x5f, 0x3f, + 0xc7, 0x37, 0xde, 0x76, 0xc3, 0xba, 0x2f, 0x94, 0xc1, 0x27, 0x02, 0x1c, 0x3f, 0xd1, 0xbd, 0x60, 0xfe, 0x7e, 0x76, 0xe9, 0x75, 0xfe, 0x1b, 0xa1, 0x0c, 0x4e, 0x4f, 0x41, 0x88, 0x96, 0xc5, 0x29, + 0xcb, 0xa2, 0xb0, 0xdb, 0xdb, 0x0a, 0x6e, 0x42, 0xa0, 0x66, 0xf5, 0xfc, 0xe1, 0x30, 0xc9, 0x46, 0x70, 0x52, 0xfa, 0xb2, 0x22, 0x4d, 0x7f, 0xcc, 0x6b, 0x7d, 0xce, 0x94, 0xbb, 0xa1, 0xfc, 0x32, + 0xae, 0xcf, 0xe7, 0xa3, 0x8d, 0x3a, 0x87, 0xa6, 0x8d, 0x1a, 0x21, 0x21, 0xa1, 0x5f, 0x73, 0xf8, 0xb6, 0x98, 0x41, 0xc3, 0x6a, 0xd2, 0xa2, 0x51, 0x62, 0xd5, 0x27, 0x90, 0x56, 0xa9, 0x94, 0x69, + 0x25, 0x46, 0x6c, 0xa8, 0xa1, 0xcc, 0xa9, 0xcd, 0x69, 0xc1, 0x58, 0x92, 0x49, 0xac, 0xba, 0x03, 0x18, 0xfb, 0x81, 0x6e, 0x9b, 0xab, 0xcd, 0x22, 0x95, 0x8e, 0xa1, 0x15, 0xd1, 0x5a, 0x7c, 0xc6, + 0xf1, 0xb9, 0x06, 0xce, 0x7a, 0xb4, 0x7b, 0x14, 0xbc, 0xf9, 0x05, 0x97, 0xf7, 0xbd, 0xad, 0x47, 0xe2, 0xe3, 0x09, 0x61, 0xfa, 0x4a, 0xf4, 0x82, 0xc6, 0xf5, 0xf0, 0x22, 0x2c, 0x7e, 0x9b, 0xaa, + 0x2c, 0x5b, 0x60, 0xc4, 0x3b, 0x9e, 0xb8, 0x15, 0xdb, 0x4d, 0xb3, 0x61, 0x38, 0x86, 0x3d, 0x62, 0xfe, 0xf1, 0x08, 0x5a, 0xde, 0x7d, 0x61, 0xf1, 0x9b, 0x79, 0xf1, 0x78, 0x8b, 0xad, 0x2d, 0xcc, + 0x3c, 0xbf, 0xfc, 0xee, 0x23, 0xbd, 0xe4, 0x43, 0x3f, 0x7a, 0xa4, 0x46, 0x3e, 0x31, 0x01, 0x5e, 0x89, 0x5e, 0x70, 0xb9, 0x1e, 0x5e, 0x14, 0xc8, 0x11, 0xfa, 0xc8, 0x69, 0xd6, 0xac, 0x4c, 0x0d, + 0x99, 0xe9, 0xb1, 0x09, 0x1f, 0x87, 0x9e, 0x5f, 0x34, 0x8a, 0x28, 0x68, 0xba, 0xbb, 0x66, 0x9b, 0xb3, 0xc0, 0x55, 0xe9, 0x99, 0x72, 0xea, 0x41, 0x61, 0xf3, 0x21, 0x17, 0x8d, 0x81, 0x2c, 0x4f, + 0x1c, 0x1f, 0x18, 0x10, 0x37, 0x61, 0x52, 0x2a, 0x94, 0xf9, 0xf9, 0xb0, 0x92, 0xb3, 0xf5, 0xd2, 0xe5, 0x73, 0x8d, 0xeb, 0x4c, 0xc4, 0xd1, 0x5d, 0x63, 0x2d, 0x9e, 0xdd, 0xf6, 0x5b, 0x45, 0xa0, + 0xf0, 0x4b, 0xdf, 0xe7, 0x7f, 0xce, 0xc8, 0xbf, 0xa1, 0x7c, 0x19, 0xff, 0xa7, 0xf3, 0xb1, 0x86, 0xbe, 0x00, 0xd0, 0x14, 0xb8, 0x59, 0xcc, 0xca, 0x7d, 0x6f, 0xc4, 0xb8, 0xbd, 0xce, 0x70, 0x22, + 0x45, 0x1d, 0x09, 0x77, 0x0f, 0x72, 0xdb, 0xe6, 0xfa, 0x3e, 0xd4, 0xa4, 0x40, 0x19, 0x76, 0x9d, 0xa1, 0x92, 0xfc, 0xa1, 0xa6, 0x88, 0x26, 0x4e, 0xa5, 0x65, 0xbf, 0xed, 0x9c, 0x42, 0x55, 0xb2, + 0x53, 0x89, 0x69, 0xfb, 0xad, 0x9a, 0x2e, 0x3d, 0x6b, 0x30, 0x55, 0x07, 0x3d, 0x6e, 0xa3, 0xc0, 0xf7, 0x27, 0x4f, 0xb6, 0x48, 0xbd, 0xef, 0x95, 0xbd, 0xe1, 0xb1, 0x87, 0xb1, 0x13, 0x65, 0xe8, + 0xb8, 0x53, 0x3b, 0x30, 0xd3, 0xd4, 0xfd, 0x68, 0x8e, 0xfa, 0x20, 0x4b, 0x25, 0xcc, 0x4d, 0xc7, 0x29, 0x7e, 0x45, 0x8f, 0x5d, 0x2e, 0xf3, 0x67, 0xd6, 0xf7, 0x37, 0xaa, 0x2f, 0x5f, 0xe2, 0xed, + 0x78, 0x7a, 0xa1, 0xf5, 0xfb, 0xaf, 0x00, 0x70, 0xeb, 0x19, 0x06, 0xe0, 0x5d, 0xd6, 0xc9, 0x4a, 0xc6, 0xe2, 0xab, 0x68, 0x07, 0x2e, 0x3d, 0xd9, 0xda, 0x66, 0x07, 0x60, 0x62, 0x55, 0x4a, 0x68, + 0x47, 0xa5, 0x28, 0x1f, 0xc5, 0x38, 0x98, 0x05, 0x46, 0x7f, 0xda, 0x11, 0x5c, 0x9e, 0xf0, 0x1e, 0x5e, 0xeb, 0xed, 0xfe, 0x08, 0x4b, 0x13, 0xf3, 0x64, 0x60, 0xd2, 0xac, 0x05, 0x09, 0x23, 0xd6, + 0x64, 0x96, 0xd2, 0xb5, 0x50, 0x3f, 0xec, 0x05, 0xf8, 0x5b, 0xda, 0x5e, 0x58, 0x14, 0xae, 0x5f, 0xc7, 0x66, 0x31, 0xcd, 0xe3, 0xba, 0x78, 0xbc, 0x27, 0xfb, 0xe4, 0xfa, 0xff, 0x95, 0xfa, 0x0b, + 0x10, 0x5f, 0xaf, 0x8d, 0xd5, 0x04, 0x78, 0x95, 0xda, 0x72, 0x07, 0xc5, 0x4c, 0x7d, 0x1e, 0x66, 0x3c, 0x69, 0xbf, 0x94, 0x84, 0x20, 0x39, 0x8a, 0x22, 0x27, 0xd1, 0x65, 0xe1, 0xaf, 0x09, 0x78, + 0x43, 0xac, 0x64, 0x38, 0xd2, 0xfa, 0x89, 0xd0, 0xea, 0xe7, 0x50, 0x82, 0x66, 0x66, 0x76, 0x4c, 0x1d, 0x5d, 0x44, 0x11, 0x10, 0x8b, 0xb6, 0x0c, 0x5c, 0x9b, 0x2b, 0x7f, 0xcb, 0xe2, 0xa9, 0x9d, + 0xb8, 0xb0, 0x36, 0xef, 0x81, 0xb9, 0x6f, 0xc0, 0xa3, 0x84, 0x77, 0x39, 0x35, 0x0b, 0xbf, 0xfe, 0xda, 0xf5, 0xed, 0xeb, 0x6c, 0x7d, 0x42, 0x50, 0x7d, 0x22, 0x7c, 0xed, 0xd3, 0xfd, 0x7e, 0x7a, + 0x99, 0xab, 0x23, 0x04, 0x56, 0xb7, 0x0f, 0x00, 0x29, 0xa9, 0x88, 0x1d, 0x83, 0xa1, 0xe5, 0x6e, 0x68, 0xfa, 0x43, 0x72, 0xf4, 0xd7, 0x60, 0x35, 0xc0, 0x09, 0x77, 0xc6, 0x91, 0x78, 0x45, 0x02, + 0xc9, 0x96, 0xd8, 0xea, 0x86, 0x9d, 0xad, 0x07, 0x4e, 0x18, 0xe8, 0x00, 0x63, 0x93, 0x42, 0x4f, 0x60, 0x07, 0x24, 0x4e, 0x18, 0x90, 0xb2, 0x6e, 0xb1, 0x20, 0xc8, 0x39, 0x97, 0x10, 0x27, 0xbd, + 0x26, 0xf0, 0xc1, 0x93, 0x97, 0xe9, 0xf6, 0xbb, 0x25, 0x50, 0x5e, 0x3b, 0xc3, 0x87, 0x3f, 0xa8, 0x2a, 0x4f, 0x19, 0x40, 0x1f, 0x74, 0xdf, 0xc6, 0x7f, 0x3d, 0xbb, 0x04, 0xb4, 0x8e, 0x98, 0x24, + 0xc3, 0x00, 0x60, 0x32, 0x51, 0x01, 0xd9, 0x90, 0xd1, 0x1a, 0xbf, 0x9a, 0xd4, 0x96, 0x0b, 0x61, 0x83, 0xbb, 0x50, 0x76, 0x9a, 0xcd, 0xad, 0xf7, 0x1b, 0x63, 0x13, 0x12, 0x01, 0x55, 0x2c, 0x91, + 0xd0, 0x59, 0x6c, 0x93, 0x12, 0x59, 0xac, 0xe6, 0x62, 0xc5, 0xe1, 0x67, 0x2a, 0x06, 0xad, 0x2c, 0x44, 0x05, 0x7a, 0x58, 0xe6, 0x51, 0xd9, 0x5a, 0xe8, 0x66, 0x9f, 0xb0, 0x0b, 0x8b, 0xcf, 0x23, + 0x53, 0x1f, 0xbe, 0x4f, 0x92, 0x37, 0x37, 0xfa, 0x3f, 0xfd, 0xf5, 0xaf, 0x54, 0xaf, 0x43, 0xbf, 0x1e, 0x8f, 0xfd, 0xee, 0x03, 0x35, 0x5f, 0x14, 0x35, 0x6f, 0x26, 0x51, 0x9f, 0x10, 0x60, 0x08, + 0x6d, 0x0c, 0xf8, 0xc0, 0xa7, 0x28, 0xb2, 0xe7, 0x56, 0xa5, 0x38, 0x94, 0x1b, 0x37, 0xc3, 0xba, 0x66, 0x07, 0xb3, 0x9b, 0x0d, 0xb2, 0x20, 0x4b, 0x71, 0x47, 0x61, 0xa1, 0x54, 0x57, 0x39, 0xa4, + 0x64, 0x38, 0x2e, 0x78, 0x8b, 0x5d, 0x9d, 0x75, 0x65, 0x5e, 0xae, 0x83, 0xc1, 0xdc, 0x67, 0x02, 0x38, 0xf4, 0x0b, 0x26, 0x58, 0x0a, 0xcf, 0xed, 0x15, 0xdf, 0xee, 0x65, 0xfc, 0x58, 0xa0, 0xe3, + 0x32, 0xcc, 0xd4, 0x2c, 0xfa, 0xe9, 0x0f, 0xc1, 0xc1, 0xcf, 0xed, 0x9b, 0xdd, 0x92, 0x7e, 0x83, 0xf4, 0xfd, 0xc2, 0xd8, 0x7d, 0x33, 0x83, 0x67, 0x24, 0xdd, 0x2d, 0xb1, 0x9c, 0xee, 0x9d, 0xbe, + 0x5e, 0x85, 0x4e, 0xe9, 0xe2, 0x42, 0xc9, 0x76, 0x95, 0xb5, 0xc6, 0x8f, 0xaa, 0x7b, 0x60, 0xb2, 0xc1, 0x97, 0x66, 0x3e, 0x5e, 0x38, 0x40, 0x77, 0x08, 0x13, 0x7d, 0x17, 0x37, 0x86, 0xc4, 0xcc, + 0x38, 0x88, 0xf7, 0x0d, 0x25, 0x3a, 0xf6, 0x38, 0x84, 0xae, 0x3d, 0x37, 0xde, 0xba, 0xaa, 0xcd, 0xf0, 0x73, 0x3c, 0x49, 0x2a, 0x69, 0xa5, 0x3d, 0x67, 0x6e, 0xbc, 0xbe, 0xbd, 0xdb, 0x55, 0x6e, + 0xfa, 0x82, 0xcd, 0x15, 0xdd, 0x1f, 0x92, 0xd2, 0x5e, 0x46, 0x9c, 0x65, 0xb1, 0x6b, 0xa6, 0x1f, 0x1d, 0xc3, 0xef, 0xb3, 0xeb, 0x33, 0x61, 0x4a, 0xdf, 0xa8, 0xbf, 0x62, 0x7c, 0x73, 0x6d, 0x74, + 0x69, 0x19, 0x5a, 0x37, 0x39, 0x76, 0x93, 0xa4, 0x11, 0x62, 0x1e, 0xbb, 0x3e, 0xc2, 0x74, 0xb6, 0xd7, 0xd4, 0xdc, 0x11, 0xcd, 0xb6, 0x52, 0xb7, 0xec, 0x01, 0xb5, 0xad, 0x89, 0x3b, 0x54, 0xfb, + 0x95, 0x3d, 0x78, 0x98, 0x1d, 0xd5, 0x8a, 0xd3, 0x36, 0x2e, 0x6a, 0xac, 0x19, 0xcf, 0xd7, 0xce, 0x2c, 0xe2, 0xa2, 0x38, 0x99, 0x82, 0x34, 0x48, 0x72, 0x1e, 0xb1, 0x30, 0xe0, 0x93, 0x5e, 0x88, + 0xd2, 0x59, 0x7f, 0x4e, 0xc5, 0xf8, 0x4d, 0xc8, 0xdf, 0xf7, 0xfd, 0x88, 0x1f, 0x83, 0xc4, 0x6e, 0x53, 0x68, 0x1e, 0xb9, 0x8a, 0x9e, 0x12, 0x16, 0x6f, 0x74, 0xaf, 0xb8, 0xbf, 0x9d, 0x5d, 0x5c, + 0x46, 0x23, 0x04, 0x46, 0x5a, 0xd6, 0x6d, 0xd5, 0x19, 0x1e, 0xaf, 0x61, 0xb8, 0x50, 0xf4, 0xf1, 0x7c, 0xbb, 0x10, 0x27, 0x75, 0x9e, 0x2e, 0x00, 0x03, 0xa0, 0xfc, 0xbc, 0x4d, 0xab, 0x5c, 0x26, + 0xe6, 0x09, 0xc8, 0xce, 0x94, 0xed, 0x12, 0x18, 0x76, 0xde, 0xe0, 0x6d, 0x79, 0x75, 0x36, 0x3f, 0x9a, 0x33, 0x8c, 0x37, 0xca, 0x08, 0x30, 0xed, 0x9c, 0x89, 0x48, 0x01, 0xe0, 0x96, 0x60, 0xa7, + 0x60, 0x86, 0xb3, 0x8d, 0xe7, 0xe8, 0xb7, 0xd0, 0xff, 0x97, 0x17, 0xcb, 0x0a, 0xf7, 0xc3, 0x46, 0x7e, 0x30, 0xc1, 0x9f, 0x9c, 0xe1, 0x9f, 0x68, 0xbf, 0xa2, 0xf0, 0x71, 0x61, 0x0a, 0x8d, 0xcc, + 0x46, 0x97, 0xa4, 0xa8, 0x8b, 0x9b, 0x2d, 0x7d, 0xa2, 0x41, 0x7d, 0xd3, 0xd2, 0x56, 0x91, 0x51, 0x2c, 0x6f, 0x4d, 0xec, 0xfa, 0x54, 0x17, 0x27, 0xfa, 0xb8, 0xeb, 0xd9, 0x0e, 0xa7, 0xe1, 0x6c, + 0x47, 0xa1, 0xdd, 0xbc, 0xb0, 0xd0, 0xcc, 0xb7, 0x4f, 0x25, 0xbf, 0x40, 0x5b, 0x76, 0x61, 0x3a, 0xb6, 0x96, 0x65, 0x18, 0xee, 0xab, 0xc5, 0x6c, 0x02, 0xaf, 0x96, 0xbd, 0x1c, 0xc0, 0x20, 0x8c, + 0x0c, 0x21, 0x56, 0x8c, 0xd8, 0x20, 0xbe, 0x55, 0x54, 0x1f, 0x71, 0xcf, 0x6d, 0xc3, 0xff, 0x47, 0xab, 0xcd, 0x53, 0xd3, 0xf7, 0x13, 0xe9, 0x2b, 0x7a, 0x9f, 0x2e, 0x8c, 0xdd, 0x1f, 0x3e, 0xc8, + 0x31, 0xad, 0xa0, 0x10, 0xd2, 0x66, 0x22, 0x40, 0x98, 0x99, 0xb1, 0x1c, 0x02, 0x78, 0x66, 0x60, 0x76, 0x30, 0xd7, 0x67, 0xcc, 0x51, 0x63, 0x58, 0x71, 0x46, 0x9a, 0xd2, 0x0e, 0x90, 0x4f, 0xdc, + 0x19, 0xa9, 0xa0, 0x4d, 0x0b, 0x49, 0x10, 0x0c, 0xcf, 0x2b, 0x59, 0x4b, 0xda, 0x5a, 0xcd, 0x74, 0x7c, 0xbb, 0x8d, 0xa9, 0x85, 0x25, 0xac, 0xe3, 0x0e, 0x4a, 0xfa, 0xfd, 0x6c, 0x8b, 0x0e, 0x27, + 0x60, 0xa4, 0x12, 0xe6, 0x76, 0xd5, 0x0f, 0x31, 0xb5, 0xcf, 0x25, 0x39, 0x7d, 0x90, 0xbd, 0x42, 0xf2, 0x7a, 0x32, 0x26, 0xc9, 0x09, 0x9c, 0x9e, 0xd7, 0xed, 0xe2, 0x00, 0xba, 0x12, 0xb1, 0xc0, + 0x15, 0x8f, 0x35, 0x83, 0xda, 0x3d, 0x6b, 0x36, 0xe1, 0x0f, 0x13, 0x7e, 0x3d, 0x6a, 0x40, 0x5e, 0x1d, 0xc7, 0x97, 0x9e, 0x9d, 0xd3, 0x4b, 0xad, 0xab, 0x3c, 0x7b, 0xac, 0x62, 0xc0, 0xcf, 0x39, + 0x4d, 0xee, 0xff, 0xc6, 0x75, 0xa8, 0xf7, 0xee, 0x5c, 0xb2, 0x60, 0x47, 0xcc, 0xa1, 0xa1, 0x4f, 0x12, 0x74, 0x52, 0x4f, 0xca, 0x45, 0x29, 0x1f, 0x7b, 0x7a, 0x7e, 0xde, 0x99, 0x6e, 0xa4, 0xc2, + 0xf4, 0xb2, 0x09, 0x16, 0x9c, 0x1d, 0x73, 0x4e, 0x38, 0xe8, 0xe6, 0xe6, 0x50, 0xb3, 0x24, 0x01, 0x4b, 0xdb, 0xc8, 0xc2, 0x53, 0xb9, 0x5e, 0xa5, 0x8e, 0xb3, 0x60, 0x57, 0x0d, 0x10, 0x9c, 0x26, + 0x9c, 0x8e, 0x53, 0x3c, 0x19, 0x97, 0x47, 0x97, 0x43, 0x0e, 0xae, 0x8f, 0x31, 0x2a, 0xa6, 0x89, 0x23, 0xd9, 0xc0, 0x77, 0x53, 0xb7, 0x30, 0xab, 0xac, 0x98, 0xbe, 0x85, 0x5c, 0xfc, 0xe4, 0x94, + 0x7d, 0x0a, 0xb4, 0xef, 0x3f, 0x71, 0x85, 0xec, 0xfb, 0xf5, 0xab, 0x77, 0x76, 0x04, 0x62, 0x51, 0xc9, 0x44, 0xfd, 0x3c, 0x86, 0xfb, 0x50, 0x63, 0xc4, 0xc9, 0xbe, 0xd4, 0x9c, 0x84, 0x6a, 0x99, + 0xbd, 0x2d, 0x74, 0xa6, 0x76, 0xdc, 0x96, 0x39, 0xe7, 0xe4, 0xf1, 0xf2, 0xa0, 0xae, 0xe7, 0xcd, 0x19, 0x0c, 0x0d, 0x7f, 0xed, 0x9e, 0xdc, 0x05, 0xb0, 0x05, 0x31, 0xfc, 0xec, 0xd6, 0x04, 0x66, + 0x0f, 0xa2, 0xd9, 0xb9, 0x0e, 0x7c, 0x9e, 0x1d, 0x86, 0xba, 0x05, 0xca, 0x76, 0x0b, 0x84, 0xc5, 0x96, 0x18, 0xb1, 0xd3, 0xf1, 0xe7, 0xeb, 0xd7, 0x0f, 0x73, 0xec, 0xb9, 0xce, 0x58, 0xaf, 0x34, + 0x5f, 0x21, 0x7c, 0x99, 0x5d, 0x23, 0x3b, 0x63, 0xa1, 0x2b, 0xa0, 0xe2, 0x2a, 0x4a, 0x59, 0xae, 0x13, 0xe1, 0x4c, 0xa7, 0x5b, 0x0a, 0x0a, 0x56, 0x18, 0x95, 0x43, 0x67, 0x9b, 0x63, 0x96, 0x4e, + 0x9d, 0x21, 0x95, 0x51, 0xcf, 0x79, 0x65, 0xc6, 0x62, 0x3b, 0xb1, 0x99, 0xf9, 0x41, 0xd0, 0xc3, 0x40, 0x86, 0xa2, 0xb5, 0x67, 0x7a, 0xdd, 0x66, 0xb6, 0x75, 0x58, 0x7c, 0xbe, 0xdd, 0x96, 0x10, + 0xe7, 0x15, 0x29, 0x81, 0x2a, 0x5b, 0xae, 0x27, 0x71, 0xea, 0xf0, 0x9c, 0x92, 0x7b, 0x23, 0x7e, 0xde, 0xaa, 0x83, 0x3e, 0x42, 0x30, 0x75, 0x7d, 0xb3, 0x0a, 0x1b, 0x77, 0x3a, 0xb8, 0xc5, 0xa3, + 0x6d, 0x67, 0xe8, 0x59, 0x29, 0x7e, 0x43, 0xfc, 0x8a, 0xe9, 0xcd, 0xa5, 0x8b, 0xab, 0x6b, 0x84, 0x24, 0x77, 0xce, 0x9b, 0xc6, 0x2c, 0xb6, 0x66, 0xab, 0x95, 0x4b, 0x6b, 0x47, 0xbb, 0x9b, 0x23, + 0x3e, 0x90, 0x03, 0xb1, 0xae, 0x36, 0x73, 0xdb, 0x81, 0x08, 0xbd, 0xf6, 0xea, 0x7a, 0x39, 0x04, 0xc0, 0x8a, 0xc8, 0x77, 0x6c, 0xb4, 0xe1, 0x53, 0x1d, 0x20, 0xe8, 0x06, 0x2f, 0x75, 0x0d, 0xaa, + 0x97, 0xe8, 0x21, 0x17, 0x85, 0x36, 0x74, 0x49, 0x57, 0x60, 0x3a, 0x46, 0x27, 0x8f, 0x47, 0xaf, 0xc6, 0x0d, 0xe3, 0x30, 0x26, 0x42, 0xec, 0xe5, 0x85, 0xeb, 0xc4, 0x7a, 0xd8, 0x4a, 0x18, 0x7f, + 0x56, 0xd4, 0x5d, 0xa9, 0xbe, 0x42, 0x72, 0x39, 0xbe, 0x94, 0x03, 0x19, 0x31, 0x39, 0x11, 0x70, 0x11, 0x7a, 0x27, 0x1f, 0x73, 0x09, 0xa5, 0x8f, 0xe5, 0xdc, 0xa9, 0x94, 0xdc, 0xdd, 0xaa, 0xfc, + 0xb9, 0x91, 0x29, 0x46, 0x1d, 0x94, 0xaa, 0x62, 0x1b, 0x46, 0xa2, 0x71, 0x04, 0x9c, 0xe4, 0xa9, 0x41, 0x90, 0xbb, 0x06, 0x00, 0x00, 0x84, 0x97, 0xb6, 0x08, 0x2c, 0x72, 0x7b, 0x3a, 0xe6, 0xe6, + 0xf6, 0xaa, 0xd9, 0xe5, 0xd8, 0xce, 0x38, 0x1a, 0x07, 0x2a, 0xb6, 0x56, 0x9a, 0xde, 0x75, 0xe9, 0x48, 0x71, 0xf6, 0xfa, 0xa6, 0xbf, 0x5d, 0xf2, 0xf1, 0xe7, 0x21, 0xb9, 0x59, 0xf4, 0x6f, 0x2e, + 0x5d, 0xc4, 0x17, 0xfe, 0x7b, 0x80, 0x4e, 0xe0, 0x01, 0x58, 0x4b, 0xc3, 0x96, 0xcf, 0x70, 0x23, 0xd6, 0xd7, 0xde, 0x20, 0xd5, 0x10, 0x2c, 0x04, 0x18, 0x1f, 0xae, 0x97, 0x66, 0xe9, 0xe7, 0xd6, + 0x5c, 0xc3, 0x31, 0xf7, 0xec, 0x2d, 0x0d, 0xf2, 0xdc, 0xb2, 0x08, 0x72, 0x58, 0x23, 0x9c, 0x42, 0x35, 0x94, 0xbe, 0x36, 0x40, 0x47, 0xde, 0xce, 0x8d, 0x61, 0x11, 0x28, 0xd4, 0x5c, 0x0e, 0x58, + 0x6f, 0x7b, 0x92, 0x90, 0xdc, 0x39, 0xa2, 0xa7, 0xe2, 0xb9, 0x08, 0xf9, 0x3f, 0x17, 0x68, 0x79, 0x6c, 0x86, 0x17, 0x03, 0xe5, 0x07, 0x7b, 0xe8, 0x29, 0x86, 0x7b, 0x27, 0x7c, 0x45, 0xf6, 0xfd, + 0xf4, 0x62, 0x05, 0x8d, 0x60, 0xbb, 0xbe, 0x39, 0x49, 0x7d, 0x97, 0x2c, 0x39, 0x46, 0x10, 0x91, 0x7c, 0xa7, 0x2d, 0x92, 0xcd, 0x0a, 0x25, 0x19, 0x71, 0x17, 0x6b, 0x1b, 0x19, 0xdd, 0x9a, 0xc2, + 0x4e, 0xcb, 0xd0, 0x99, 0xbd, 0x75, 0x14, 0xc3, 0x39, 0x36, 0xa5, 0x01, 0x86, 0xd9, 0x86, 0xc9, 0xd2, 0xed, 0x8a, 0xcc, 0x4a, 0x2e, 0xe6, 0x8f, 0x0c, 0x11, 0xb7, 0x87, 0x7e, 0x66, 0x6d, 0x06, + 0x3e, 0xb2, 0x5b, 0xc2, 0x1c, 0x70, 0x78, 0xb2, 0x1c, 0xc9, 0x76, 0x97, 0x3a, 0x27, 0x3f, 0xb0, 0xdb, 0x9f, 0x57, 0x61, 0x7f, 0x23, 0x7a, 0x05, 0xe3, 0x5a, 0xd3, 0xe6, 0x42, 0xe9, 0xf7, 0x40, + 0x34, 0x31, 0x77, 0x04, 0x71, 0x79, 0x77, 0x46, 0x90, 0xac, 0x6d, 0x50, 0x52, 0x94, 0xe0, 0xc5, 0x19, 0xb0, 0xc4, 0x3d, 0x63, 0x11, 0x93, 0xd3, 0x12, 0x3e, 0x70, 0x06, 0xe4, 0x85, 0xc6, 0x4e, + 0x38, 0x56, 0x43, 0xa5, 0x33, 0x68, 0x08, 0x2c, 0x86, 0x85, 0xd1, 0x2d, 0xe9, 0x56, 0x40, 0x89, 0x33, 0x29, 0x1c, 0xab, 0xce, 0xa1, 0x24, 0x55, 0x98, 0xa9, 0xa8, 0x18, 0xa6, 0x60, 0x1b, 0x2d, + 0xce, 0x4b, 0xfd, 0x69, 0xf6, 0xfa, 0xfb, 0xf7, 0x5a, 0x7a, 0x19, 0x98, 0x85, 0xeb, 0x5c, 0xdd, 0x55, 0x1f, 0x61, 0x04, 0xff, 0x2f, 0x7b, 0xff, 0xd1, 0xa4, 0x3a, 0xd3, 0xfd, 0x09, 0x80, 0xfb, + 0xfe, 0x14, 0x37, 0x9e, 0xad, 0x9a, 0x47, 0xde, 0xf5, 0xaa, 0x41, 0x02, 0x61, 0x04, 0x92, 0x00, 0x21, 0xb3, 0xf8, 0x4f, 0xc8, 0x22, 0xef, 0x7d, 0x74, 0xbc, 0x9f, 0x7d, 0xa2, 0xa0, 0x3c, 0x70, + 0x4b, 0x97, 0xf7, 0xce, 0x6e, 0x36, 0x85, 0x5c, 0x1d, 0x29, 0x7f, 0x99, 0x79, 0xf2, 0xe4, 0xb1, 0x7f, 0x55, 0x5a, 0xbf, 0xf3, 0x8a, 0x2b, 0xb2, 0x77, 0x6e, 0x8c, 0x95, 0xde, 0xcb, 0x7c, 0x87, + 0xc8, 0x6c, 0x0d, 0x83, 0x50, 0x4f, 0xd4, 0x8d, 0xda, 0x1f, 0x2a, 0x46, 0x18, 0x7a, 0x6f, 0x1a, 0x30, 0x87, 0x68, 0x69, 0x39, 0x8b, 0x74, 0xbb, 0x59, 0x2b, 0x94, 0x42, 0xcf, 0x65, 0xda, 0x6a, + 0x7c, 0x0b, 0x94, 0xec, 0x52, 0x87, 0xc2, 0xb9, 0x4c, 0xa3, 0xcb, 0x79, 0x8f, 0xae, 0xe4, 0xf9, 0x42, 0x5f, 0xf9, 0x4b, 0x10, 0x6d, 0x81, 0xe9, 0x12, 0x94, 0x25, 0x53, 0x5c, 0xee, 0x6c, 0xef, + 0xef, 0x6d, 0xbb, 0x1f, 0xa2, 0xfd, 0xfb, 0x34, 0xb9, 0x4f, 0xf2, 0xc6, 0x0f, 0x53, 0xe2, 0xdb, 0xf1, 0x58, 0x6e, 0x58, 0xcd, 0x11, 0x59, 0x1d, 0xfc, 0x26, 0x70, 0x88, 0xd4, 0x15, 0x15, 0x32, + 0x42, 0x50, 0x2b, 0x60, 0x85, 0xad, 0x01, 0xd1, 0x67, 0x93, 0xec, 0xa2, 0x69, 0xce, 0x11, 0x01, 0x87, 0x3b, 0x01, 0x51, 0x8b, 0x27, 0x14, 0x39, 0x46, 0x8a, 0x88, 0xee, 0x36, 0xa2, 0x7f, 0xae, + 0x0c, 0xce, 0x59, 0xee, 0x6a, 0xda, 0x4d, 0x3d, 0xcb, 0xda, 0x6b, 0xcd, 0xca, 0xd7, 0xb7, 0xae, 0x20, 0x24, 0x82, 0x26, 0x57, 0xcf, 0xc9, 0x25, 0x7f, 0xce, 0x0d, 0xaf, 0xfe, 0x83, 0xbf, 0x01, + 0xf3, 0x09, 0xab, 0xd3, 0x1b, 0xd5, 0x57, 0x30, 0xaf, 0x91, 0xa0, 0x63, 0xad, 0x4d, 0xad, 0x1f, 0x78, 0xc6, 0xfe, 0x70, 0xce, 0x1b, 0x2f, 0x06, 0x21, 0xdd, 0x9e, 0x5a, 0xea, 0x4e, 0xaf, 0xe8, + 0x48, 0xb3, 0x37, 0x8b, 0xcc, 0xda, 0xb3, 0x47, 0x5c, 0xe6, 0xe5, 0x5a, 0x53, 0xc5, 0xf4, 0x48, 0xd2, 0x98, 0xbc, 0x13, 0x6c, 0x19, 0x38, 0x67, 0x47, 0x62, 0x3f, 0xa4, 0xa4, 0x89, 0x9d, 0x90, + 0xa5, 0x1c, 0x81, 0x69, 0x46, 0x70, 0xb9, 0x46, 0xd1, 0xd8, 0x54, 0x6f, 0x1b, 0xda, 0x35, 0x9e, 0x9e, 0xfb, 0x37, 0xee, 0x95, 0x8f, 0xa5, 0xbc, 0xaa, 0xcf, 0xde, 0xa6, 0xe1, 0x6f, 0x16, 0x96, + 0xe7, 0x36, 0x20, 0x9f, 0x68, 0x5f, 0x31, 0xfd, 0x74, 0xe1, 0x1a, 0xf2, 0x3e, 0x62, 0x79, 0x11, 0xd7, 0xf9, 0x79, 0xbe, 0xf4, 0x15, 0xbd, 0xd9, 0x66, 0xc6, 0x42, 0x47, 0xeb, 0xa3, 0x45, 0x85, + 0x4b, 0x71, 0x8b, 0x01, 0xd8, 0x94, 0x3d, 0x46, 0x6c, 0xe2, 0xd7, 0x12, 0x4f, 0x5a, 0x32, 0x28, 0xb3, 0x53, 0x48, 0x8a, 0xc8, 0x05, 0x09, 0xf5, 0x9c, 0xbb, 0xcc, 0x3c, 0xd4, 0xe2, 0x77, 0x0e, + 0x60, 0xd1, 0x55, 0x6a, 0xf8, 0xe7, 0x06, 0x60, 0x17, 0xc3, 0x71, 0xbd, 0xf1, 0x2c, 0x84, 0xa9, 0x04, 0x62, 0xc4, 0x96, 0xc3, 0x68, 0x0c, 0xff, 0xaa, 0x9b, 0xfa, 0xf4, 0xd5, 0x1f, 0x88, 0x7e, + 0xac, 0x2c, 0x3f, 0x6b, 0xdf, 0x3e, 0x65, 0xe6, 0xf9, 0xe7, 0x7f, 0xbe, 0xe6, 0xe1, 0xf9, 0x88, 0x57, 0x79, 0xeb, 0xa8, 0xff, 0xfd, 0xdf, 0x4c, 0x8b, 0x3a, 0xf1, 0x2f, 0xdb, 0xe0, 0xb2, 0xce, + 0xb2, 0xb4, 0x78, 0x9c, 0x13, 0x09, 0x7a, 0x56, 0x58, 0xb8, 0x79, 0xc1, 0xb5, 0x63, 0x6f, 0x2e, 0x5f, 0xbc, 0x34, 0x46, 0xf4, 0x6e, 0x98, 0x74, 0x1c, 0x92, 0x63, 0x32, 0x83, 0xd6, 0x54, 0x59, + 0xed, 0xb9, 0x7e, 0x7a, 0x5a, 0x33, 0x82, 0xdd, 0x2d, 0xe2, 0x06, 0x67, 0x75, 0x7f, 0x6f, 0xd9, 0xd1, 0xca, 0x98, 0x4a, 0xea, 0xd4, 0x3c, 0xb8, 0xeb, 0xde, 0x00, 0x04, 0x2f, 0xcd, 0x76, 0x69, + 0xc5, 0x4b, 0x45, 0x59, 0xcd, 0xbc, 0xbc, 0xce, 0x6b, 0x4c, 0xcf, 0xea, 0x8d, 0xc9, 0x5a, 0x20, 0x75, 0x20, 0xe2, 0xb3, 0x7a, 0x16, 0x17, 0xe2, 0x98, 0xa2, 0x14, 0x7e, 0x39, 0x69, 0x1d, 0x23, + 0x2c, 0x9c, 0xc7, 0x05, 0x6d, 0x9e, 0x5c, 0xf2, 0x5e, 0xc9, 0x5e, 0x81, 0x79, 0x3d, 0x19, 0xbb, 0xb4, 0xe5, 0x56, 0x55, 0xd6, 0xbc, 0x1e, 0xaf, 0x24, 0x08, 0x68, 0x0e, 0x87, 0xad, 0x9b, 0x9e, + 0x9a, 0x7e, 0xe1, 0x20, 0x00, 0x77, 0x98, 0x37, 0x49, 0xac, 0x23, 0xce, 0x70, 0xac, 0x33, 0xf8, 0x30, 0x2b, 0x1d, 0x1a, 0xa8, 0x5a, 0x86, 0x71, 0x7c, 0x23, 0x22, 0xe6, 0x73, 0x1f, 0xdd, 0x59, + 0xc8, 0x66, 0x61, 0xb9, 0x04, 0x90, 0x0f, 0xc8, 0x62, 0x26, 0x26, 0x81, 0x5a, 0x86, 0x54, 0xe7, 0x6d, 0x0e, 0xc6, 0x23, 0x7f, 0xfd, 0xbf, 0xb7, 0xb4, 0x39, 0xdd, 0x63, 0x25, 0xe9, 0x73, 0xbb, + 0x20, 0xa7, 0xbb, 0xaa, 0x46, 0x9d, 0xce, 0x19, 0xe3, 0x35, 0x0b, 0x4f, 0x08, 0xb1, 0x19, 0xec, 0x5d, 0x77, 0x32, 0x41, 0x5f, 0x76, 0x3c, 0xd6, 0x2a, 0x17, 0x56, 0xa5, 0x0d, 0x54, 0x09, 0x78, + 0xd3, 0x9f, 0xc7, 0x42, 0xf0, 0x32, 0xcd, 0x42, 0x27, 0x79, 0x64, 0x17, 0x7d, 0xce, 0xd7, 0xe7, 0x9d, 0xea, 0xb5, 0x0a, 0xdb, 0xf5, 0x78, 0xac, 0x8f, 0xcf, 0xde, 0x5e, 0xcb, 0x6e, 0x64, 0xcd, + 0x51, 0x4b, 0x1e, 0x36, 0xfe, 0x36, 0x97, 0xce, 0x25, 0x53, 0x43, 0xc4, 0x42, 0xac, 0x69, 0xd9, 0x5e, 0xad, 0x05, 0xc8, 0x74, 0x34, 0x53, 0xf4, 0x96, 0x3b, 0x2c, 0x24, 0x8c, 0xec, 0xbc, 0xae, + 0x7c, 0xd7, 0x4a, 0x99, 0xea, 0x48, 0x9b, 0x56, 0x27, 0x64, 0xda, 0xac, 0xca, 0x58, 0x24, 0x64, 0xb6, 0xc4, 0xc1, 0x1c, 0xce, 0x18, 0x63, 0xd4, 0xa5, 0x02, 0x8a, 0x9b, 0x1b, 0x17, 0x8e, 0xdb, + 0x12, 0x74, 0x5f, 0xb5, 0x75, 0x30, 0xf6, 0x84, 0xa2, 0xe4, 0xb6, 0xf6, 0xdc, 0x95, 0xd0, 0xcf, 0x8d, 0x4e, 0xc3, 0xed, 0x92, 0x14, 0x54, 0x75, 0x4d, 0x6a, 0xc5, 0x8e, 0x16, 0x42, 0x14, 0x3c, + 0xa8, 0x45, 0x52, 0x63, 0xbe, 0x4a, 0xf7, 0x42, 0x08, 0x20, 0x78, 0x92, 0xab, 0x98, 0x1f, 0x1f, 0x90, 0x24, 0xab, 0x9b, 0xa3, 0xc6, 0xc6, 0x29, 0x28, 0xcd, 0xf5, 0x34, 0x6f, 0xf5, 0x50, 0x33, + 0x56, 0x6c, 0x88, 0x06, 0xa7, 0x66, 0x26, 0x1c, 0x85, 0xd5, 0xfc, 0x3c, 0xf7, 0x0c, 0x5e, 0xe8, 0x93, 0xd9, 0x81, 0x7e, 0x4e, 0x22, 0xf9, 0x52, 0x83, 0x0e, 0xfe, 0x9e, 0xb4, 0xf9, 0xa3, 0xf2, + 0xfa, 0x6f, 0x7d, 0xe3, 0x2e, 0x49, 0x6e, 0x7f, 0xb4, 0xb9, 0x3e, 0x33, 0xb2, 0xde, 0xe9, 0xbe, 0x15, 0xc4, 0xf8, 0x64, 0x77, 0x1d, 0x31, 0xba, 0x0e, 0xbe, 0xd8, 0x80, 0xd4, 0x29, 0xd3, 0x6b, + 0xc5, 0x6c, 0xf8, 0xc3, 0xb6, 0x3a, 0xb2, 0x32, 0xe5, 0xcd, 0xdd, 0x42, 0x57, 0xce, 0x60, 0xbc, 0x04, 0x93, 0x13, 0x68, 0x62, 0x29, 0xc4, 0x68, 0xe6, 0xa1, 0xab, 0x61, 0x79, 0x25, 0x89, 0xbc, + 0xdd, 0x6e, 0x04, 0x66, 0xd5, 0xf3, 0x92, 0x0a, 0x9c, 0x56, 0xa2, 0x80, 0x37, 0x05, 0xaf, 0xa2, 0x3e, 0x95, 0x57, 0xf9, 0xa2, 0xf7, 0x6c, 0xf1, 0x20, 0x8f, 0xf1, 0x30, 0x37, 0xfd, 0xf3, 0x75, + 0xe3, 0xfe, 0xef, 0x6b, 0xcd, 0x11, 0xfa, 0x07, 0xf0, 0xae, 0xc5, 0xf3, 0x9c, 0xc6, 0x49, 0x26, 0xa6, 0x53, 0x55, 0x4e, 0xf1, 0x7b, 0x87, 0xfd, 0xe7, 0xf4, 0xcb, 0xbf, 0x7d, 0xd3, 0x1b, 0xc0, + 0x8f, 0xee, 0x8f, 0xd5, 0x35, 0xfb, 0xba, 0xc9, 0x2d, 0x0d, 0x57, 0x05, 0x71, 0xba, 0x40, 0xe9, 0xb3, 0xd8, 0x9e, 0xc4, 0xfd, 0x8c, 0x6b, 0x21, 0x49, 0xda, 0x24, 0x53, 0xb2, 0xaa, 0x1c, 0x3c, + 0x3b, 0x6c, 0x0b, 0x4f, 0x11, 0x14, 0xb2, 0x6c, 0xb9, 0xf2, 0xd4, 0x9c, 0x8e, 0x41, 0xec, 0xf6, 0xd3, 0x13, 0x9d, 0xed, 0xf2, 0x90, 0xd2, 0xb8, 0x23, 0x59, 0xed, 0x19, 0xbb, 0xdb, 0xd7, 0x54, + 0x3d, 0x58, 0x67, 0xbd, 0x4d, 0xd9, 0x34, 0xbd, 0x71, 0x71, 0xf8, 0xa1, 0x38, 0xcb, 0x57, 0x11, 0xe0, 0xb9, 0xc9, 0x3d, 0xbe, 0x28, 0xcb, 0xe5, 0x0d, 0x3f, 0x23, 0xd3, 0x99, 0x26, 0xb3, 0xc4, + 0x6d, 0x46, 0x93, 0xf1, 0x23, 0xc5, 0x5b, 0x73, 0xcf, 0xab, 0x3d, 0x72, 0xb9, 0xa6, 0xa8, 0xa5, 0x5a, 0x2b, 0x68, 0x5e, 0xae, 0x50, 0x0d, 0x1a, 0x04, 0x7d, 0xb1, 0x71, 0xf5, 0xf9, 0xd2, 0xca, + 0x14, 0x7f, 0x29, 0x83, 0xeb, 0x6e, 0x08, 0x09, 0x84, 0x9e, 0x15, 0xa5, 0x61, 0x82, 0xf1, 0xd6, 0x5f, 0x4a, 0x95, 0x4f, 0xb7, 0x5b, 0x11, 0xa0, 0x30, 0x7c, 0x2f, 0x3a, 0xe8, 0x69, 0x8c, 0xfe, + 0xe0, 0x7e, 0x35, 0xad, 0xd6, 0xaf, 0xbc, 0xb4, 0xbe, 0xe6, 0x98, 0x7f, 0x5c, 0x67, 0x00, 0x7e, 0x4a, 0x87, 0x3c, 0xea, 0x8d, 0xef, 0x70, 0xfe, 0xf0, 0xdc, 0x38, 0x97, 0xea, 0xc4, 0x74, 0xe0, + 0x68, 0x6d, 0x54, 0xe2, 0x30, 0x00, 0x54, 0x9b, 0xc1, 0x0b, 0x06, 0xaa, 0xc2, 0xb6, 0x50, 0xd7, 0xd1, 0xfc, 0x67, 0x84, 0x42, 0x3f, 0xb1, 0x27, 0xe9, 0x23, 0x09, 0x89, 0x78, 0x6a, 0x9b, 0xf5, + 0x4a, 0x13, 0x9c, 0xbc, 0x1d, 0x5d, 0x12, 0x47, 0x8f, 0xd8, 0x62, 0xd9, 0xd6, 0x01, 0xae, 0x23, 0x80, 0xae, 0x62, 0x87, 0xa5, 0xf1, 0x23, 0xd0, 0x21, 0x14, 0xe8, 0x78, 0xfc, 0xd9, 0xa6, 0xe3, + 0xf9, 0xce, 0x40, 0xf9, 0xb2, 0x61, 0x8f, 0xd5, 0x10, 0xa3, 0x4d, 0x3f, 0x9b, 0x0b, 0xe4, 0x5e, 0xcc, 0xaa, 0x66, 0xca, 0x02, 0x15, 0x86, 0x29, 0x27, 0xd5, 0x90, 0x83, 0xe3, 0x6c, 0x6f, 0x15, + 0xd9, 0xc2, 0x59, 0x44, 0x0c, 0xa5, 0x30, 0x45, 0x2d, 0xef, 0x31, 0x9c, 0xf0, 0xc6, 0x88, 0x8a, 0x91, 0xd3, 0x3c, 0x32, 0xce, 0x3c, 0x37, 0x89, 0x5e, 0x08, 0x82, 0x93, 0xcb, 0xcf, 0xd8, 0x49, + 0x02, 0x98, 0x47, 0xa4, 0x5e, 0x62, 0x73, 0x9c, 0xe7, 0xe6, 0xa4, 0x07, 0x26, 0xa8, 0xd3, 0x58, 0x07, 0xb0, 0x94, 0xa2, 0xb5, 0xca, 0x64, 0xab, 0x8c, 0xe8, 0x63, 0x4a, 0x50, 0xd6, 0xb8, 0x73, + 0x22, 0x00, 0x82, 0x64, 0xcb, 0x3c, 0x02, 0x79, 0xc3, 0x38, 0x92, 0xf9, 0x7a, 0x36, 0xad, 0x90, 0x62, 0x70, 0x53, 0x03, 0xc4, 0xa5, 0x19, 0x37, 0xf3, 0x3a, 0xd6, 0xef, 0x60, 0x7b, 0x5b, 0x21, + 0xa1, 0xb4, 0x19, 0xc1, 0xb1, 0xb3, 0xc2, 0x89, 0x6a, 0xdb, 0x99, 0xbc, 0xef, 0x25, 0xbf, 0xd5, 0x6e, 0xb8, 0xa4, 0xcf, 0xb0, 0x3c, 0xc7, 0xba, 0x14, 0xf0, 0xfb, 0x0f, 0xf4, 0x38, 0x8f, 0xfb, + 0x9d, 0x72, 0x0b, 0xf7, 0x10, 0xc5, 0xbf, 0xd6, 0x34, 0x1b, 0x0d, 0xe9, 0x37, 0xea, 0x2f, 0xf0, 0x7e, 0xbb, 0x34, 0xb9, 0x92, 0xfe, 0x19, 0x6b, 0x5d, 0x46, 0x58, 0x9a, 0x8b, 0xa7, 0x96, 0x20, + 0x5b, 0x75, 0x74, 0x3c, 0xda, 0x4b, 0x1a, 0x1c, 0x8a, 0xde, 0x09, 0x88, 0x84, 0x3a, 0x0e, 0x47, 0xc0, 0xdd, 0x71, 0xf6, 0xae, 0x8a, 0x89, 0x03, 0x9b, 0xe1, 0xdb, 0xed, 0x36, 0x5b, 0x16, 0xeb, + 0x75, 0xd8, 0x4c, 0xed, 0x39, 0x6a, 0x11, 0x36, 0x65, 0x23, 0x96, 0x37, 0xa7, 0x7d, 0xc0, 0x00, 0x41, 0xfb, 0x40, 0x33, 0x8a, 0x5e, 0xf9, 0x65, 0x98, 0xe4, 0x23, 0x76, 0x9c, 0x56, 0x9a, 0x86, + 0xfe, 0x55, 0xe2, 0x80, 0xbe, 0x57, 0x72, 0xb8, 0x5f, 0x6b, 0xe2, 0x9b, 0xdf, 0x7e, 0xe9, 0x54, 0x93, 0x2b, 0x91, 0xeb, 0x72, 0xf5, 0x56, 0x72, 0x02, 0x7b, 0xb4, 0xff, 0x8f, 0xfc, 0xc4, 0x29, + 0x27, 0x46, 0x62, 0x4f, 0xac, 0x34, 0xaa, 0xe3, 0x87, 0x02, 0xf0, 0x73, 0xe5, 0xf1, 0x6f, 0xa8, 0x5f, 0x3a, 0xe5, 0xdb, 0xb5, 0xb1, 0x25, 0xf3, 0xad, 0x9d, 0x10, 0x9c, 0x99, 0x84, 0x9f, 0x01, + 0x8b, 0xa4, 0x51, 0x94, 0xaa, 0xdf, 0x1f, 0x87, 0x78, 0x86, 0x8a, 0xc2, 0x1a, 0xb0, 0xd4, 0xee, 0x38, 0xa5, 0x60, 0x3e, 0x55, 0xc8, 0x9a, 0x5a, 0xdb, 0xb1, 0xe7, 0xaa, 0x43, 0xe1, 0x17, 0x69, + 0xa6, 0xb5, 0x59, 0x70, 0xf0, 0x92, 0x01, 0x96, 0x78, 0x5e, 0x29, 0xa5, 0x56, 0x23, 0x93, 0x55, 0x97, 0xb2, 0xb1, 0x25, 0x1e, 0xdb, 0xcc, 0x63, 0x37, 0xf4, 0x8d, 0xe7, 0xc7, 0xd7, 0xcc, 0xcf, + 0xf7, 0xc7, 0xe7, 0x53, 0xc3, 0xf3, 0x83, 0xee, 0x0b, 0x08, 0x1f, 0x67, 0x97, 0x6a, 0xf8, 0x23, 0xc6, 0x64, 0x45, 0x7a, 0x2d, 0x9d, 0xad, 0x00, 0xa5, 0xa9, 0xdb, 0xdd, 0x5a, 0x6d, 0x43, 0x7c, + 0x38, 0x2d, 0xb3, 0xde, 0x5b, 0xe5, 0xc3, 0x19, 0xc9, 0x8f, 0x51, 0x18, 0xad, 0x05, 0x17, 0x8a, 0x4f, 0x1d, 0x77, 0x30, 0x1d, 0x74, 0x91, 0x21, 0x27, 0xdf, 0xd1, 0x2d, 0xbb, 0xde, 0x69, 0x81, + 0xc1, 0xb3, 0x69, 0x4f, 0x64, 0x74, 0xcd, 0x65, 0xd2, 0x9c, 0x53, 0x38, 0x8a, 0x54, 0xb2, 0xed, 0x26, 0xda, 0xe5, 0xd4, 0x73, 0xa2, 0x71, 0x36, 0xb9, 0x7e, 0xff, 0x3f, 0xff, 0xe7, 0xbd, 0x0c, + 0xf9, 0xfd, 0xc1, 0x95, 0xda, 0x8f, 0x83, 0x42, 0xb0, 0x7f, 0x61, 0xf2, 0x5f, 0xe4, 0x09, 0xd6, 0x79, 0x21, 0x7a, 0xc1, 0xf0, 0xe5, 0x60, 0xf2, 0x4a, 0xe7, 0x67, 0x00, 0x1b, 0x24, 0x64, 0xe7, + 0x0e, 0x4e, 0x46, 0x8e, 0x75, 0xac, 0x23, 0x83, 0x5d, 0xd5, 0xbb, 0xa3, 0xd8, 0xa3, 0xfb, 0x1e, 0x3b, 0xf3, 0xdc, 0x9a, 0xd0, 0x61, 0x01, 0x6d, 0xe6, 0x70, 0x58, 0x9c, 0x55, 0x7d, 0x57, 0x94, + 0x12, 0xc0, 0x2f, 0x8e, 0xdc, 0xf2, 0xd4, 0x9d, 0x02, 0x4b, 0x15, 0x4b, 0x98, 0xe4, 0x3d, 0x53, 0x3f, 0x71, 0x8e, 0x3d, 0x5d, 0x37, 0x94, 0xaa, 0xc3, 0x55, 0x13, 0xe0, 0x8b, 0xe6, 0x30, 0x46, + 0xca, 0xb8, 0x7e, 0xe8, 0xbf, 0x56, 0x94, 0x26, 0x8e, 0xed, 0x38, 0x8f, 0xb3, 0xad, 0x3f, 0x53, 0x5c, 0xe5, 0x3b, 0xf1, 0x77, 0x60, 0x3e, 0x2e, 0x8d, 0x29, 0xb0, 0x02, 0x4f, 0xb0, 0x80, 0x02, + 0x93, 0x39, 0x20, 0x36, 0x36, 0xb1, 0x5c, 0x1f, 0x92, 0xd9, 0xac, 0xf3, 0xd4, 0x74, 0x65, 0x46, 0x83, 0x30, 0x22, 0xad, 0xe8, 0xeb, 0x2b, 0xab, 0xa2, 0x4e, 0x5e, 0x07, 0xc6, 0xfd, 0x16, 0x62, + 0x4f, 0x28, 0x54, 0xbe, 0xd1, 0xfe, 0x68, 0xe0, 0xdb, 0x95, 0xc9, 0x85, 0xee, 0x4f, 0xed, 0x53, 0x02, 0x79, 0x97, 0xf2, 0xf3, 0xbd, 0x80, 0xed, 0x80, 0x01, 0x04, 0x4f, 0xe7, 0x43, 0x0f, 0x28, + 0x3b, 0x33, 0xc7, 0xf4, 0xed, 0x98, 0xf6, 0x9d, 0x7f, 0x48, 0x66, 0xf0, 0x5c, 0xf8, 0xf5, 0x27, 0xba, 0x97, 0x76, 0xbd, 0x9f, 0x8d, 0x0d, 0xbb, 0xa6, 0x54, 0xb1, 0xc9, 0xa6, 0x53, 0xaa, 0xee, + 0x3d, 0xb7, 0x72, 0x6a, 0x2a, 0x5b, 0x35, 0x52, 0x97, 0xad, 0x75, 0xf2, 0xa0, 0x69, 0x76, 0x26, 0xfb, 0x8d, 0x9e, 0x71, 0x3d, 0x51, 0x2e, 0xca, 0x59, 0xbd, 0xd9, 0x6b, 0x20, 0x59, 0x48, 0x9c, + 0xd1, 0x38, 0xb6, 0x33, 0xa3, 0x8c, 0x0d, 0xa0, 0x87, 0x7d, 0x4e, 0xd4, 0xd9, 0x76, 0x71, 0xe2, 0x41, 0x7a, 0xaa, 0x10, 0x8d, 0xa0, 0x0d, 0xee, 0xbe, 0xe7, 0x9f, 0xe3, 0x0a, 0x96, 0xf7, 0x56, + 0xc4, 0xf7, 0x7b, 0xd5, 0xfa, 0x47, 0x7a, 0xc9, 0x97, 0x55, 0xee, 0x37, 0xcc, 0x23, 0xcd, 0x4c, 0x27, 0x79, 0x98, 0xcd, 0xfc, 0xb9, 0x72, 0xd3, 0xef, 0x54, 0x2f, 0x70, 0xbf, 0x1e, 0x8f, 0x2d, + 0x37, 0xed, 0x56, 0x88, 0x18, 0xd7, 0x7a, 0xc2, 0xb6, 0x00, 0xbb, 0x96, 0xdc, 0x23, 0x1e, 0x67, 0x73, 0xa5, 0xb6, 0xe7, 0xb3, 0xfd, 0x10, 0x65, 0xab, 0xd8, 0x23, 0x63, 0x99, 0x14, 0x2c, 0x91, + 0x8b, 0x1d, 0xb7, 0xdc, 0x44, 0x0a, 0xc5, 0x84, 0x90, 0x4c, 0x24, 0x05, 0xc3, 0xd8, 0x56, 0xab, 0x2d, 0x80, 0x81, 0x1e, 0x2c, 0xe8, 0x70, 0x9a, 0x0d, 0x9c, 0x3e, 0x85, 0x17, 0xf0, 0x59, 0x76, + 0x97, 0x7a, 0xbd, 0x1e, 0xe1, 0x71, 0xd7, 0x55, 0xce, 0xab, 0x12, 0xee, 0x37, 0xb9, 0xe8, 0x3e, 0x47, 0xbd, 0x3f, 0x92, 0xd5, 0x9f, 0xc0, 0xeb, 0x8d, 0xea, 0x0b, 0x5e, 0x6f, 0xc7, 0x17, 0x79, + 0x7d, 0x04, 0x5e, 0xeb, 0x94, 0xb0, 0xd7, 0x10, 0xc6, 0xc4, 0x87, 0xa0, 0x1e, 0x92, 0x76, 0x7d, 0x38, 0xa0, 0x99, 0xec, 0x28, 0xb1, 0x0d, 0x2e, 0x21, 0xd7, 0x3d, 0x46, 0xa1, 0xaa, 0x9e, 0x5b, + 0xdd, 0x07, 0x9c, 0x1c, 0x96, 0x99, 0x38, 0x97, 0x5a, 0xc6, 0x03, 0x1c, 0xbe, 0xd4, 0x04, 0x8d, 0x69, 0x35, 0x9a, 0x86, 0x7d, 0x64, 0x61, 0x78, 0x98, 0x07, 0xcf, 0xe6, 0x5b, 0xa6, 0xc3, 0xf2, + 0xa3, 0xc7, 0x99, 0xa5, 0x3f, 0x42, 0x8c, 0xea, 0x8d, 0x28, 0xf2, 0x5f, 0x53, 0xcf, 0xfd, 0x46, 0x39, 0x13, 0x1b, 0xa1, 0x33, 0x79, 0xab, 0x88, 0x76, 0x7f, 0x88, 0xa1, 0x4f, 0x84, 0xb3, 0x7d, + 0x90, 0x05, 0x27, 0x9f, 0x4e, 0x26, 0x17, 0x6a, 0x3f, 0x83, 0x56, 0x52, 0xb2, 0x17, 0xed, 0x1c, 0xb2, 0x11, 0x37, 0x69, 0x2c, 0x79, 0x0c, 0x9c, 0x2f, 0x9c, 0x68, 0x9b, 0x86, 0x05, 0x78, 0xb0, + 0xd0, 0xe9, 0x79, 0x67, 0x96, 0x29, 0x9a, 0x90, 0x58, 0x7c, 0x12, 0xa7, 0x38, 0x7f, 0xd4, 0xdb, 0x70, 0x46, 0xef, 0x22, 0xd5, 0xc5, 0x54, 0xd1, 0x88, 0xf9, 0x6e, 0x3d, 0xa7, 0x3c, 0xe8, 0xec, + 0x91, 0x68, 0xb1, 0xa5, 0xb1, 0xae, 0x69, 0xf7, 0x47, 0x84, 0x39, 0xad, 0x92, 0x31, 0x9b, 0x9c, 0xd8, 0xc8, 0x7e, 0xe3, 0x5c, 0x80, 0x3d, 0x15, 0x38, 0xf3, 0x4a, 0xf3, 0x02, 0xc4, 0xe5, 0x68, + 0x82, 0x8d, 0x0b, 0x92, 0xf1, 0xec, 0x1d, 0xdc, 0x9e, 0x0a, 0xdd, 0x34, 0x11, 0xda, 0x99, 0x71, 0x3e, 0x17, 0xac, 0x4d, 0x47, 0xa4, 0xd6, 0xe6, 0x26, 0xc8, 0xe1, 0xba, 0x08, 0x97, 0x6b, 0x90, + 0x5f, 0x89, 0xe0, 0x4e, 0xc3, 0xa8, 0xad, 0x0e, 0x4b, 0x27, 0x55, 0x2e, 0xa5, 0xd9, 0x09, 0xe6, 0xe0, 0xa1, 0xd1, 0x16, 0xcb, 0x04, 0x56, 0xe7, 0x10, 0x61, 0xb5, 0xc1, 0xac, 0x14, 0x56, 0xc8, + 0x06, 0x95, 0xa3, 0x24, 0x80, 0x35, 0x75, 0x4c, 0xda, 0x9a, 0xd8, 0x49, 0xdb, 0x07, 0x10, 0xd0, 0x4f, 0xcd, 0xa0, 0x17, 0x82, 0x2f, 0xed, 0x77, 0xd2, 0x76, 0x42, 0x8f, 0x9b, 0x37, 0x40, 0x6a, + 0x1e, 0xcc, 0x48, 0x90, 0xe2, 0xbd, 0x67, 0xf5, 0xb3, 0x8a, 0x40, 0xdc, 0xba, 0x90, 0xf2, 0xfd, 0x54, 0xca, 0x76, 0xbd, 0xa2, 0xa6, 0xd4, 0xac, 0x96, 0x70, 0x73, 0x47, 0xda, 0x1c, 0xd5, 0xc6, + 0xad, 0x04, 0x34, 0xed, 0x72, 0x93, 0x81, 0x05, 0xb3, 0x60, 0x31, 0xa6, 0x38, 0x8a, 0x14, 0x53, 0xb2, 0x12, 0x0b, 0x97, 0x41, 0xaa, 0xd3, 0xd8, 0x06, 0x83, 0x49, 0x75, 0x2e, 0x87, 0xd4, 0xea, + 0x39, 0x1b, 0xc0, 0xff, 0xbd, 0xa4, 0xee, 0x07, 0x2f, 0xc9, 0x49, 0xdf, 0xa6, 0xd4, 0x4d, 0x76, 0x07, 0xcb, 0x88, 0x9d, 0xc8, 0x32, 0x4a, 0x67, 0x12, 0x3a, 0xaf, 0x06, 0x32, 0xe2, 0x52, 0x4a, + 0xf8, 0xd3, 0x33, 0xb6, 0x73, 0x79, 0xca, 0x1f, 0x9c, 0xfb, 0x34, 0x3e, 0xee, 0x7f, 0x10, 0xb9, 0x13, 0x23, 0xf7, 0x2d, 0x5f, 0xd9, 0x9d, 0x8c, 0x7e, 0x6f, 0x9f, 0x3a, 0xb9, 0x66, 0xf9, 0x2e, + 0x6f, 0x17, 0xe7, 0x5f, 0xbf, 0xfe, 0x49, 0xd2, 0x22, 0x36, 0x2e, 0x2f, 0xcb, 0x0c, 0x2b, 0x34, 0xce, 0xce, 0x5b, 0x0d, 0x88, 0xb7, 0x94, 0x7c, 0x9f, 0x9e, 0x2d, 0x1c, 0xc3, 0x9e, 0x64, 0xe1, + 0xf9, 0x5a, 0x27, 0xe7, 0x9f, 0xff, 0x21, 0xbf, 0x1b, 0xe9, 0x0a, 0xc7, 0x7e, 0x2b, 0xea, 0x7a, 0xf3, 0xcf, 0x55, 0xe1, 0xc7, 0x93, 0xc4, 0x69, 0x2f, 0xbb, 0x9e, 0x07, 0x8f, 0x7c, 0x4b, 0x95, + 0x09, 0x53, 0x5f, 0xef, 0xf7, 0x46, 0x71, 0x2e, 0xbf, 0x6c, 0xe7, 0xa0, 0x4b, 0x91, 0xfc, 0x37, 0x9e, 0xf6, 0xa9, 0x53, 0xff, 0xbb, 0x6c, 0x9a, 0x30, 0xf5, 0xad, 0xf0, 0xf4, 0xd8, 0x21, 0xfe, + 0x28, 0x9b, 0xe6, 0x0b, 0xc1, 0x2f, 0xa3, 0xfd, 0xd7, 0xa3, 0x11, 0x2f, 0xac, 0xa6, 0x9a, 0x1a, 0x52, 0xc0, 0xea, 0xa0, 0x01, 0xf9, 0x51, 0x68, 0xc3, 0x65, 0xb5, 0xc9, 0x87, 0x69, 0xdd, 0x59, + 0x5e, 0xba, 0xf5, 0x59, 0x5a, 0xb6, 0x3b, 0x60, 0x71, 0xe0, 0x24, 0xb6, 0xf6, 0xf7, 0x7b, 0x40, 0x5c, 0x6f, 0xd6, 0x4b, 0x0b, 0xd9, 0xad, 0xa7, 0x6a, 0x64, 0x7a, 0x21, 0xd7, 0x1e, 0x2b, 0x10, + 0x03, 0x93, 0x8d, 0xde, 0xcd, 0x79, 0x0d, 0x6e, 0xd1, 0xbd, 0xa3, 0x08, 0x3c, 0x15, 0x3f, 0x9f, 0x40, 0xf0, 0x3d, 0x79, 0xe3, 0xfd, 0x55, 0xe1, 0x19, 0x8d, 0xcf, 0x95, 0xe4, 0x85, 0x11, 0xbc, + 0x1c, 0x4c, 0xe0, 0x71, 0x5a, 0x1f, 0x2a, 0x27, 0x4f, 0xf3, 0xf3, 0x76, 0xad, 0x60, 0x6b, 0xaa, 0xb2, 0xdc, 0x93, 0xd8, 0x53, 0x67, 0x88, 0xde, 0x59, 0x52, 0xab, 0xdb, 0x66, 0xbb, 0x98, 0xe7, + 0x9e, 0x03, 0x2a, 0x7a, 0x98, 0xae, 0x86, 0x20, 0x01, 0xd1, 0x23, 0xc7, 0xb6, 0x95, 0xc0, 0x68, 0x95, 0xca, 0x75, 0x53, 0x54, 0xa0, 0x2a, 0x71, 0xc8, 0xac, 0x81, 0x61, 0xd8, 0x73, 0x03, 0x88, + 0x88, 0x88, 0xf7, 0x10, 0xa4, 0xaf, 0x85, 0x47, 0xf1, 0x51, 0xdf, 0x20, 0xa8, 0xbc, 0xd4, 0x7e, 0x24, 0xed, 0x3e, 0x17, 0x7a, 0xf3, 0x4a, 0xf3, 0x02, 0xc2, 0xe5, 0x68, 0x6c, 0x98, 0x8d, 0x6f, + 0x45, 0xd3, 0xa5, 0xb3, 0xcb, 0x77, 0x31, 0x41, 0x0d, 0x8b, 0x2a, 0xd1, 0x21, 0x07, 0x80, 0x79, 0xa4, 0x97, 0x57, 0x76, 0x33, 0xec, 0x52, 0xa3, 0xde, 0xc8, 0x98, 0x32, 0x9b, 0xa2, 0xa7, 0x66, + 0x09, 0x36, 0xe2, 0xc2, 0x77, 0x16, 0x64, 0xee, 0xee, 0xa3, 0x56, 0xd6, 0x65, 0x80, 0x9d, 0xd2, 0x22, 0x6d, 0x8a, 0xea, 0xea, 0x40, 0x43, 0x75, 0xd4, 0xa5, 0x72, 0xca, 0x2c, 0x11, 0xb4, 0x3c, + 0x21, 0xa3, 0xd6, 0x44, 0xdf, 0x2a, 0xd2, 0xb7, 0xac, 0xcc, 0xf7, 0x97, 0xc5, 0x67, 0x42, 0xe6, 0x3e, 0xc8, 0xbe, 0x60, 0xf1, 0x7e, 0x72, 0x31, 0x0d, 0x8e, 0x88, 0x81, 0xc9, 0xf6, 0xf1, 0xd0, + 0x82, 0xaa, 0x6c, 0xb5, 0x2a, 0x97, 0xb1, 0xb4, 0xb1, 0xa2, 0x73, 0x10, 0x52, 0x85, 0x96, 0xdf, 0xf5, 0xe7, 0x60, 0x7e, 0x5c, 0x53, 0x3d, 0x64, 0xa4, 0x50, 0x6b, 0xe7, 0x59, 0x51, 0x0c, 0xac, + 0x81, 0x69, 0x49, 0xc7, 0x5b, 0x03, 0xe9, 0x4a, 0x7b, 0xbd, 0xa0, 0x9a, 0xd4, 0xa3, 0x4e, 0x30, 0x14, 0x72, 0xde, 0x74, 0x66, 0xee, 0xac, 0xe5, 0x29, 0xc4, 0xdb, 0xe5, 0x59, 0x79, 0xb2, 0x76, + 0x93, 0x59, 0x18, 0xd6, 0x27, 0xc6, 0xf6, 0xad, 0x70, 0xaa, 0x95, 0x7e, 0x64, 0xb4, 0x46, 0xfe, 0x94, 0x69, 0x7d, 0xfe, 0xf7, 0x47, 0x4c, 0xeb, 0x4a, 0xf4, 0x19, 0x9e, 0xf5, 0x4e, 0x1d, 0x9c, + 0x7c, 0x1c, 0x5f, 0xea, 0x1c, 0xa3, 0xe3, 0x58, 0xd6, 0x26, 0x9b, 0xf3, 0x81, 0xdb, 0x5a, 0x0c, 0x2b, 0x9b, 0xb4, 0xe8, 0xf8, 0xe7, 0x63, 0x89, 0xc4, 0xb3, 0xf5, 0xa0, 0xca, 0xe2, 0x30, 0xad, + 0x45, 0x24, 0x15, 0xad, 0x29, 0x4d, 0xd1, 0x4b, 0x87, 0xda, 0x57, 0x0e, 0x04, 0x68, 0xf2, 0x34, 0x68, 0xe1, 0xf5, 0xc9, 0xb1, 0x59, 0xaf, 0x3e, 0x6e, 0xc4, 0x70, 0x19, 0x1c, 0xb4, 0x61, 0xbb, + 0x43, 0x93, 0x8c, 0xa1, 0xa3, 0xfa, 0xe8, 0x71, 0xda, 0x7c, 0x63, 0x9f, 0x9f, 0x67, 0x59, 0x7e, 0xfc, 0xd8, 0x04, 0x4f, 0x3c, 0x23, 0xb7, 0xf8, 0xb1, 0x73, 0x19, 0x9d, 0xb1, 0x33, 0xb9, 0x50, + 0xf8, 0x79, 0x5c, 0xca, 0x07, 0x31, 0xdc, 0x3a, 0xf3, 0x23, 0x0a, 0x17, 0xc2, 0xd6, 0x37, 0x8a, 0x72, 0xb6, 0x5b, 0x2d, 0xf5, 0x0d, 0xcf, 0x9d, 0x9b, 0x8d, 0x05, 0xf2, 0x45, 0x90, 0xba, 0xd3, + 0x64, 0x16, 0x09, 0x55, 0xe5, 0xe2, 0x46, 0xb0, 0x6f, 0x72, 0x7f, 0x3f, 0xa5, 0xa4, 0xd2, 0x49, 0x4c, 0x2b, 0x4d, 0xad, 0x6a, 0x43, 0xd8, 0xc4, 0xb1, 0x24, 0x8c, 0x5c, 0x57, 0x67, 0x53, 0x40, + 0x35, 0xc3, 0x4d, 0xe5, 0xf9, 0xa3, 0xa2, 0x29, 0x2e, 0x1f, 0x69, 0x3f, 0xf2, 0xf6, 0x87, 0xff, 0xc5, 0x9f, 0xd9, 0x2a, 0xbe, 0x12, 0x7d, 0xc3, 0xc0, 0x36, 0x27, 0x57, 0x42, 0x3f, 0xe3, 0x50, + 0x8a, 0x32, 0x56, 0x9f, 0x48, 0x5b, 0x8b, 0x9a, 0x4a, 0x59, 0x77, 0x6d, 0xdb, 0x2d, 0x59, 0x48, 0xac, 0x7d, 0xef, 0xb4, 0xf3, 0xe7, 0xe4, 0xb1, 0x9f, 0x9a, 0x12, 0x7e, 0x50, 0x3a, 0x96, 0x99, + 0xd1, 0xb1, 0xac, 0x35, 0xc2, 0xb9, 0x48, 0x25, 0xa1, 0xd5, 0x24, 0x49, 0xd8, 0x88, 0x6b, 0x8a, 0x59, 0x99, 0x73, 0x00, 0x9e, 0x1f, 0x4f, 0x91, 0x90, 0x6e, 0x60, 0x99, 0x41, 0x12, 0x19, 0x3d, + 0x6b, 0xcd, 0x68, 0x1c, 0xde, 0x8a, 0x2d, 0xdd, 0x1f, 0x0a, 0xf0, 0xbf, 0xe8, 0x9f, 0xbb, 0xc4, 0x7e, 0xd0, 0x7d, 0x43, 0xe3, 0x72, 0x32, 0xb9, 0x92, 0xfb, 0x19, 0x10, 0x9d, 0xd5, 0x00, 0x53, + 0x8c, 0xf1, 0xe1, 0x78, 0x5c, 0x00, 0x5a, 0xc6, 0x14, 0x53, 0x99, 0x4e, 0x36, 0x90, 0x7c, 0x5e, 0x31, 0x9a, 0x78, 0x84, 0xa4, 0xea, 0x08, 0xef, 0x74, 0x65, 0xd1, 0x60, 0x25, 0x00, 0x1c, 0x77, + 0xa1, 0x75, 0x3e, 0x19, 0x47, 0xe8, 0x4c, 0x00, 0xd8, 0x1e, 0xa9, 0x57, 0xd8, 0x36, 0x90, 0x82, 0xa1, 0x2f, 0x97, 0x33, 0x78, 0xe8, 0x6a, 0x85, 0xc7, 0x21, 0x6f, 0x30, 0x1c, 0xd5, 0x7f, 0x2e, + 0x1a, 0xf5, 0x63, 0xa8, 0xbc, 0x8d, 0x8b, 0x07, 0xd3, 0x29, 0x99, 0x5c, 0x53, 0xb3, 0x3c, 0x1c, 0x54, 0xcf, 0x98, 0xff, 0x3e, 0xc8, 0x5e, 0x80, 0x7c, 0x3b, 0x19, 0x63, 0xc8, 0x7b, 0xc1, 0x71, + 0x45, 0x07, 0xed, 0x36, 0x81, 0xc8, 0x43, 0x0f, 0xae, 0x5a, 0x21, 0x40, 0x87, 0x53, 0x78, 0xf2, 0x43, 0x64, 0x7d, 0x6c, 0xce, 0x99, 0xd1, 0x87, 0xac, 0x3e, 0xf7, 0xcf, 0x3c, 0xb1, 0xef, 0x88, + 0x1d, 0xcd, 0x9b, 0xdb, 0xbe, 0x6d, 0xe5, 0xc3, 0xb6, 0xea, 0xe6, 0x47, 0x80, 0x8c, 0x4e, 0x29, 0xcb, 0xf3, 0x36, 0x2a, 0xa0, 0x2b, 0xb5, 0x5d, 0xb7, 0x4d, 0x5d, 0x27, 0x25, 0x25, 0xcf, 0xc0, + 0xa5, 0x33, 0x1d, 0x37, 0xb0, 0x3e, 0x8a, 0x13, 0xdc, 0x43, 0x03, 0x7d, 0x4e, 0x1e, 0x78, 0xa3, 0x7a, 0x05, 0xe3, 0x7a, 0x7c, 0xa9, 0xb2, 0x37, 0x42, 0x26, 0x58, 0x93, 0x19, 0x81, 0x7a, 0x7b, + 0xff, 0x85, 0xad, 0xee, 0xd8, 0x79, 0xdb, 0xc2, 0x0a, 0xe9, 0xa3, 0x24, 0x30, 0xeb, 0x57, 0x85, 0xa0, 0x08, 0xb8, 0x2a, 0x49, 0xd3, 0x41, 0x47, 0x4f, 0x82, 0xc5, 0x43, 0xe2, 0xae, 0x37, 0xdb, + 0xcc, 0x8d, 0x4f, 0xe0, 0x0e, 0xc2, 0x87, 0xc5, 0x74, 0x68, 0x25, 0x5a, 0x3e, 0xf4, 0x73, 0x4b, 0x25, 0x2a, 0x54, 0x16, 0x80, 0x0d, 0x6e, 0xe4, 0x33, 0x49, 0x58, 0x2d, 0x9f, 0x1b, 0x53, 0x97, + 0x45, 0x70, 0xe2, 0x74, 0x99, 0x91, 0xbc, 0x01, 0x72, 0xd9, 0xbb, 0x90, 0x0f, 0xc7, 0xd6, 0xdb, 0x66, 0xea, 0x91, 0x62, 0xeb, 0x09, 0xad, 0xc3, 0x2b, 0xd1, 0x37, 0x28, 0x5f, 0x76, 0x40, 0x17, + 0x4a, 0x23, 0x90, 0x2c, 0x83, 0x24, 0xc4, 0xcc, 0x16, 0xd5, 0xd6, 0xb9, 0x36, 0x98, 0x76, 0x3f, 0xf3, 0x77, 0xa5, 0xa8, 0x2c, 0x45, 0x57, 0x00, 0x00, 0x99, 0xe3, 0x48, 0x8c, 0x66, 0xba, 0x92, + 0xc8, 0x1c, 0xa6, 0xc6, 0xd5, 0x33, 0x96, 0x14, 0x4e, 0x62, 0x10, 0xc2, 0xa9, 0x13, 0xb4, 0xae, 0x90, 0x8e, 0x79, 0xdb, 0x42, 0xeb, 0xb8, 0xad, 0x80, 0xbd, 0xe3, 0x52, 0xc5, 0xf9, 0x5c, 0xc7, + 0xe1, 0x91, 0x1f, 0x1e, 0x95, 0x0d, 0xb8, 0x0b, 0xc4, 0xa7, 0xad, 0xda, 0xdf, 0x53, 0xad, 0x7e, 0x27, 0xfe, 0x19, 0x98, 0xd7, 0x4b, 0x63, 0x95, 0xac, 0x12, 0x56, 0x50, 0x67, 0xcf, 0xa6, 0xa0, + 0xde, 0x13, 0x40, 0x28, 0x80, 0x05, 0x74, 0x86, 0xcc, 0x82, 0xd6, 0x51, 0x51, 0xd7, 0x5f, 0x9e, 0x69, 0xcb, 0x16, 0xda, 0x60, 0x6d, 0x23, 0x6b, 0x92, 0x90, 0x60, 0x14, 0xb7, 0x80, 0x1d, 0xdb, + 0x71, 0x4c, 0x6e, 0x6b, 0x1b, 0x09, 0x3e, 0x6c, 0x66, 0xf5, 0xc2, 0x3d, 0x2b, 0xe6, 0x54, 0x1e, 0x66, 0x6e, 0xa3, 0x05, 0xa2, 0x3c, 0x77, 0x76, 0xe7, 0x7c, 0x07, 0x3f, 0xe7, 0x6e, 0x6e, 0x14, + 0xc5, 0xe7, 0x4a, 0xd0, 0x5f, 0xd3, 0xd1, 0x7f, 0x0d, 0x11, 0xb9, 0xb3, 0x7f, 0xfe, 0xb0, 0xe6, 0x5f, 0xf3, 0x62, 0x3e, 0x08, 0x0c, 0x88, 0x7f, 0xbb, 0x7c, 0xfc, 0x79, 0x4f, 0x5c, 0xb0, 0x7f, + 0x5d, 0x2d, 0x7e, 0x46, 0x9b, 0x58, 0x44, 0x43, 0x6d, 0x1e, 0x79, 0x9d, 0x43, 0xd7, 0x88, 0x01, 0xee, 0x4e, 0xcc, 0x34, 0x72, 0xe6, 0x5e, 0x30, 0xe4, 0x78, 0xda, 0x9d, 0x97, 0xbd, 0xc1, 0xc8, + 0x74, 0xaf, 0xa9, 0x8d, 0xc5, 0x97, 0x4d, 0x7a, 0x32, 0x96, 0xeb, 0x1c, 0x2c, 0xf1, 0x4e, 0x5d, 0x11, 0xa0, 0xaa, 0x8a, 0x44, 0x35, 0x90, 0x7b, 0xba, 0x9b, 0x0a, 0xd5, 0x32, 0x39, 0x08, 0x60, + 0xa5, 0x56, 0x0b, 0x54, 0xd9, 0x1f, 0xa3, 0x31, 0x01, 0x5d, 0x89, 0x51, 0xd5, 0x85, 0x11, 0x4d, 0xac, 0x34, 0xce, 0x8c, 0x87, 0x09, 0x03, 0xbf, 0x96, 0xd0, 0x1b, 0x8b, 0xc1, 0x37, 0xda, 0xe0, + 0xe4, 0xfb, 0x95, 0xcb, 0x86, 0xf0, 0x47, 0x23, 0xcd, 0xa1, 0x20, 0x40, 0xb2, 0xb2, 0xe5, 0x65, 0xdf, 0x26, 0x85, 0x58, 0x66, 0x8d, 0xd9, 0xec, 0xd5, 0x15, 0x6c, 0x66, 0xe2, 0x88, 0xba, 0x56, + 0x49, 0x6a, 0x3b, 0x93, 0xb4, 0x9c, 0xd4, 0x95, 0xff, 0x9b, 0x9c, 0xcc, 0xe8, 0x13, 0x51, 0x08, 0x5f, 0x28, 0xbf, 0xb4, 0xed, 0xf3, 0xf9, 0x45, 0xf1, 0x39, 0x22, 0x1a, 0xc1, 0x6d, 0x12, 0x95, + 0xae, 0x74, 0x73, 0x4f, 0x2a, 0x2e, 0xc3, 0xe1, 0xb3, 0x69, 0x8f, 0xf6, 0x02, 0x98, 0x30, 0x7c, 0x1f, 0x9c, 0x14, 0x96, 0xd8, 0x9e, 0xbd, 0x79, 0x0e, 0x0d, 0xf8, 0x82, 0x75, 0x77, 0x80, 0xae, + 0x66, 0xbc, 0xb2, 0x5b, 0x1d, 0x67, 0xb6, 0xe9, 0xbb, 0x9d, 0x14, 0x4a, 0x08, 0xee, 0x98, 0x05, 0x4c, 0x70, 0xd0, 0x8e, 0x74, 0xf6, 0xca, 0xda, 0x2f, 0x05, 0x6b, 0x3b, 0x5f, 0x72, 0xe8, 0x8d, + 0xc3, 0xe3, 0xcb, 0xa7, 0xc5, 0xe9, 0x23, 0x6f, 0x0e, 0xf4, 0xa9, 0x55, 0xfd, 0x95, 0xe6, 0x6b, 0xc3, 0xe3, 0x34, 0xb9, 0xb8, 0x84, 0x8d, 0x58, 0xcf, 0xcf, 0xf4, 0x54, 0x27, 0x97, 0x71, 0xe8, + 0x49, 0x61, 0xae, 0x86, 0x7b, 0x0b, 0x81, 0x5a, 0x40, 0x77, 0x25, 0x12, 0xb5, 0x96, 0xbc, 0x39, 0xa7, 0xbc, 0x44, 0x34, 0x2b, 0x63, 0x61, 0x2e, 0x2a, 0xa6, 0x8e, 0xf5, 0x32, 0xe8, 0xb7, 0xde, + 0x26, 0xa4, 0x79, 0x23, 0x90, 0x20, 0x52, 0xc6, 0xe5, 0x0e, 0xa1, 0xa2, 0x66, 0x11, 0xe8, 0xb8, 0x4a, 0x2e, 0x1b, 0x65, 0x0f, 0x77, 0x83, 0x4c, 0x05, 0xcb, 0xd3, 0x73, 0x6b, 0x98, 0xe5, 0xa5, + 0xa1, 0x6f, 0x1b, 0x57, 0x0d, 0x13, 0xfa, 0x2f, 0xfe, 0x5d, 0x7b, 0x67, 0xd6, 0xe7, 0xd7, 0x5b, 0xc8, 0x57, 0x4f, 0xc8, 0x7b, 0xa9, 0x25, 0xef, 0x30, 0xa7, 0xef, 0xe5, 0x8d, 0xe0, 0xaf, 0x2f, + 0xc8, 0xca, 0xaa, 0x70, 0x9c, 0x7f, 0x0b, 0x27, 0xee, 0xdf, 0x59, 0xd7, 0x97, 0x3a, 0xa2, 0xa5, 0x13, 0x37, 0xaf, 0xfa, 0x2f, 0xf2, 0x5f, 0xfc, 0x7b, 0x86, 0xac, 0x38, 0x8b, 0x9c, 0x49, 0x9d, + 0x5d, 0x12, 0x01, 0x24, 0xe9, 0x47, 0x2a, 0xd9, 0x3b, 0x1e, 0x12, 0x57, 0xfb, 0x53, 0x39, 0xb1, 0xd2, 0x28, 0xbd, 0x3e, 0x83, 0x7f, 0x77, 0xb5, 0xa8, 0xd2, 0xfa, 0xd3, 0x77, 0x7e, 0xb9, 0x55, + 0x27, 0xb6, 0xe3, 0x96, 0x86, 0xeb, 0xbc, 0x53, 0xc7, 0xff, 0x64, 0x4f, 0x7b, 0x27, 0x3b, 0xfc, 0xaf, 0x3b, 0x43, 0xf0, 0xf3, 0x2b, 0xc7, 0x0f, 0xc3, 0x7b, 0x59, 0xe2, 0x6f, 0x7d, 0x13, 0x7f, + 0xdd, 0xe7, 0x2c, 0x95, 0xbd, 0x97, 0x51, 0x86, 0xd3, 0x0b, 0x7f, 0xad, 0xc4, 0xee, 0x8e, 0x73, 0xa3, 0x74, 0x49, 0x91, 0xd1, 0xa9, 0x6e, 0xa0, 0x11, 0x5b, 0xd2, 0xdf, 0x01, 0xfc, 0xa8, 0xa1, + 0xdf, 0x61, 0x1f, 0xdf, 0xd0, 0xaf, 0xaf, 0x00, 0x27, 0xdf, 0x2e, 0x4c, 0xf0, 0x1b, 0x7b, 0xf7, 0xaf, 0x47, 0x33, 0x50, 0x0a, 0x4e, 0x41, 0x6b, 0xab, 0xab, 0x0a, 0x83, 0xa8, 0xed, 0xca, 0x9f, + 0xe6, 0x8c, 0x8a, 0xa5, 0xf2, 0xa6, 0x3c, 0xcb, 0xc8, 0x3c, 0x9f, 0x72, 0x43, 0x89, 0x88, 0x59, 0x18, 0x63, 0x86, 0xa4, 0x99, 0x41, 0x0c, 0xe8, 0x73, 0x65, 0x6e, 0x29, 0xd8, 0xc1, 0x5d, 0xec, + 0x8e, 0x05, 0x56, 0x6f, 0x77, 0x7a, 0x6c, 0x40, 0x4e, 0x8f, 0xb9, 0x78, 0x74, 0xe6, 0x8b, 0x70, 0x06, 0x19, 0x2a, 0x24, 0x6d, 0xd3, 0xdf, 0x28, 0x1e, 0xbf, 0x35, 0xf7, 0xce, 0x4c, 0xfc, 0xf5, + 0x6d, 0x9c, 0x7c, 0x2b, 0x12, 0xf3, 0xeb, 0x93, 0x06, 0xe0, 0x91, 0x2e, 0x20, 0x49, 0xb3, 0xdf, 0x6e, 0x5b, 0x9e, 0x58, 0xbe, 0xd2, 0xac, 0xba, 0xb0, 0xb7, 0xac, 0x1a, 0x95, 0x29, 0x00, 0x9e, + 0x98, 0x36, 0xe4, 0x35, 0x87, 0xb4, 0x93, 0xd4, 0xfa, 0x60, 0x25, 0xe8, 0xc9, 0x73, 0xfd, 0x98, 0x42, 0xb5, 0x15, 0x01, 0x60, 0xcf, 0xb0, 0x27, 0xc3, 0x34, 0x8b, 0xcb, 0xb3, 0x8f, 0x32, 0x30, + 0x3e, 0xd4, 0xe8, 0x3f, 0x62, 0xf3, 0x7f, 0x2e, 0xc7, 0xdc, 0x7f, 0xc5, 0x05, 0x96, 0x7b, 0x37, 0x2e, 0x73, 0x6f, 0x84, 0xbc, 0x93, 0x21, 0x0a, 0x5c, 0x9e, 0x73, 0x3f, 0x40, 0x87, 0xed, 0xb6, + 0xdf, 0x33, 0x10, 0x41, 0xb2, 0x67, 0x98, 0x30, 0xdd, 0xe1, 0xb4, 0x04, 0x5a, 0xd2, 0xeb, 0x9d, 0x73, 0x9c, 0xad, 0x1a, 0x1d, 0x5b, 0xef, 0x82, 0xbc, 0xe2, 0x84, 0xd3, 0x74, 0xd5, 0xf0, 0x71, + 0x30, 0xeb, 0xd0, 0x5e, 0x24, 0xb5, 0xa3, 0x43, 0x37, 0x9b, 0xf5, 0x39, 0x4c, 0x77, 0x82, 0x18, 0xb4, 0x12, 0x97, 0x9e, 0xd9, 0x74, 0xab, 0x2e, 0x9e, 0x93, 0x2e, 0x6f, 0x33, 0xcd, 0xbf, 0x99, + 0x9c, 0x3f, 0x33, 0xfc, 0xef, 0xb9, 0x71, 0x5e, 0xf8, 0x20, 0xfe, 0xdd, 0x0f, 0xed, 0x13, 0xb7, 0x46, 0xbf, 0xa6, 0x0b, 0x6f, 0x8c, 0xc8, 0xbf, 0x32, 0xea, 0x2c, 0x7e, 0x07, 0x2c, 0xf2, 0x2d, + 0x27, 0x79, 0x75, 0xb6, 0x47, 0x1f, 0x1b, 0xb9, 0x3f, 0x23, 0xfd, 0xd0, 0x41, 0xeb, 0x39, 0x1f, 0xf0, 0xaf, 0xa4, 0xbf, 0xf5, 0x6a, 0xe5, 0x8d, 0xf5, 0xf2, 0x26, 0x1c, 0xbd, 0xc4, 0xf9, 0x12, + 0x55, 0x2a, 0xc6, 0x2f, 0x97, 0x4a, 0x46, 0x1f, 0x10, 0x4e, 0xee, 0x29, 0x3b, 0x0f, 0x33, 0xce, 0xc7, 0x66, 0xa7, 0xc3, 0x80, 0x72, 0x46, 0xee, 0xcf, 0x09, 0x67, 0xa8, 0x4d, 0x08, 0x87, 0x91, + 0xf9, 0x61, 0xa8, 0x54, 0xb9, 0x95, 0x67, 0x04, 0x43, 0xac, 0x36, 0xa6, 0x14, 0x6a, 0x88, 0x98, 0x98, 0x60, 0xcc, 0x62, 0x8a, 0x96, 0x06, 0xcc, 0xbe, 0xb5, 0x5a, 0x7e, 0x8c, 0xf4, 0xfa, 0x1a, + 0x08, 0xef, 0x27, 0x65, 0xf6, 0xbb, 0x00, 0x7c, 0xf2, 0x09, 0x68, 0xbe, 0x92, 0x06, 0x27, 0xdf, 0x2e, 0x4c, 0x2e, 0x54, 0x7f, 0x86, 0xc6, 0x20, 0xb3, 0xf9, 0xd2, 0xf6, 0xe0, 0x6e, 0xb3, 0x9a, + 0x9e, 0x8f, 0xfd, 0x41, 0xe6, 0xce, 0xfc, 0xb6, 0x03, 0xbb, 0x96, 0xd5, 0xcb, 0x70, 0x07, 0xcb, 0x36, 0xe1, 0x9c, 0x35, 0x6d, 0x87, 0xce, 0xed, 0xbd, 0x82, 0xe9, 0x5b, 0x71, 0x37, 0x67, 0xe5, + 0xe3, 0x02, 0xf0, 0xda, 0x1e, 0xe1, 0x65, 0x06, 0x98, 0x45, 0xc0, 0xa1, 0xe7, 0xd5, 0xe9, 0x2e, 0x69, 0x07, 0x30, 0xe8, 0x3d, 0x30, 0xaf, 0xab, 0x8d, 0x3c, 0x46, 0x8b, 0xff, 0xf6, 0xb9, 0xbf, + 0xb3, 0x66, 0xfc, 0x39, 0x3b, 0x78, 0xa7, 0xfa, 0x09, 0x90, 0x72, 0x6c, 0x11, 0xd7, 0xca, 0xe9, 0x73, 0xbe, 0x59, 0x28, 0x03, 0x1f, 0xe6, 0xf8, 0x8c, 0x0e, 0x7d, 0x6a, 0x71, 0x52, 0xa6, 0x34, + 0x84, 0xc8, 0xf3, 0x3d, 0x92, 0x87, 0x5d, 0x6c, 0x4f, 0xb1, 0x84, 0x77, 0x81, 0x36, 0x10, 0xf8, 0xa9, 0x72, 0xee, 0x06, 0x46, 0xd1, 0x77, 0x4c, 0x97, 0xb1, 0x39, 0xbd, 0x6d, 0xe6, 0xd4, 0x36, + 0xf6, 0x94, 0x5d, 0x01, 0xac, 0xa8, 0x16, 0x9d, 0xed, 0x30, 0xfa, 0xd4, 0xa1, 0x84, 0x46, 0xa8, 0xcf, 0xa9, 0xf0, 0x6d, 0xc7, 0xf5, 0x13, 0x67, 0x92, 0x15, 0x69, 0xe6, 0x14, 0x95, 0xef, 0x7c, + 0xd8, 0x5e, 0xbf, 0x08, 0x59, 0xce, 0xa5, 0xc2, 0x64, 0x55, 0x18, 0xd6, 0x9b, 0x84, 0x07, 0x53, 0xff, 0x42, 0x93, 0xc4, 0xe9, 0xaa, 0x47, 0xb3, 0xf5, 0x15, 0x95, 0x57, 0x7b, 0xee, 0x23, 0xe4, + 0xff, 0x5c, 0xde, 0xfe, 0x44, 0xf7, 0x03, 0xfb, 0x97, 0xb3, 0xb1, 0x55, 0x94, 0x77, 0xf5, 0x74, 0x7e, 0x90, 0x05, 0x79, 0x5b, 0x44, 0x2b, 0x55, 0x70, 0x97, 0x9b, 0x81, 0x25, 0xcc, 0x4c, 0xac, + 0xd1, 0x4a, 0xab, 0xd0, 0xae, 0x09, 0x76, 0xf6, 0x7e, 0x25, 0x01, 0x0b, 0xe7, 0x08, 0x45, 0x3b, 0x13, 0xdb, 0x50, 0xca, 0x9e, 0x84, 0x18, 0x83, 0xed, 0xbc, 0x7a, 0x77, 0xae, 0x0f, 0x88, 0xca, + 0x01, 0x5c, 0x10, 0xf6, 0xdb, 0x56, 0x18, 0xca, 0x1d, 0xae, 0x87, 0xd5, 0x2a, 0x76, 0xbd, 0x3f, 0x98, 0xa4, 0xff, 0x1a, 0x65, 0xe9, 0x9f, 0x1f, 0xed, 0x41, 0xb0, 0xa7, 0x74, 0x69, 0x5f, 0x28, + 0xbf, 0xa3, 0xf2, 0x7a, 0x7e, 0x51, 0x74, 0x8c, 0xd0, 0xa9, 0xf9, 0xdd, 0x11, 0xe1, 0xf1, 0xe3, 0x52, 0x2d, 0xa7, 0x59, 0xef, 0xcb, 0xa2, 0xb6, 0x89, 0x15, 0x00, 0x99, 0x2f, 0x33, 0x55, 0x75, + 0xf0, 0x95, 0x8f, 0x6e, 0x01, 0x17, 0x73, 0x00, 0x63, 0xbd, 0x98, 0x2e, 0x8d, 0x14, 0x37, 0xe2, 0xc5, 0x5e, 0x21, 0xd6, 0x90, 0x20, 0x10, 0x16, 0xc8, 0xcb, 0xd4, 0xcc, 0xc1, 0xc8, 0xba, 0x62, + 0x3a, 0x84, 0xe3, 0x29, 0xda, 0xeb, 0xb8, 0x19, 0xa1, 0x1e, 0xe2, 0x4d, 0xfd, 0x9c, 0xe3, 0xc1, 0x6d, 0xf0, 0xe1, 0x37, 0x77, 0x81, 0x51, 0x83, 0xf6, 0x7e, 0x24, 0xf4, 0xa7, 0x07, 0xbe, 0x0e, + 0xd1, 0x7f, 0x7e, 0x57, 0xeb, 0x2a, 0x4d, 0x26, 0x4e, 0xe7, 0x57, 0x93, 0xc8, 0x31, 0xc2, 0x89, 0xfb, 0xb8, 0x18, 0xf6, 0x73, 0x79, 0x1f, 0x6f, 0xa8, 0xbf, 0xf4, 0xe1, 0xf7, 0x6b, 0x63, 0xb3, + 0x3f, 0x9e, 0x6a, 0xc6, 0xd0, 0xf5, 0x69, 0xb0, 0x77, 0x74, 0xb4, 0x91, 0xdb, 0xb3, 0x30, 0xa3, 0xf8, 0x6e, 0x9a, 0x96, 0xab, 0xba, 0x60, 0xfd, 0xa9, 0x02, 0x95, 0x30, 0x5a, 0xac, 0x60, 0xad, + 0x8d, 0x0d, 0x11, 0x00, 0x82, 0xc6, 0xea, 0x44, 0x92, 0x9c, 0x2a, 0xa9, 0xd4, 0x38, 0x89, 0xee, 0x98, 0x19, 0x33, 0x45, 0x62, 0x4a, 0x61, 0x60, 0x70, 0x9e, 0x96, 0xa2, 0x26, 0x6e, 0x83, 0x64, + 0x3f, 0xcd, 0xc0, 0x1b, 0x57, 0xe9, 0xd7, 0x7c, 0xd9, 0x7f, 0x4f, 0x49, 0xf2, 0x42, 0xf0, 0xd2, 0x6c, 0x6b, 0xa4, 0x3a, 0x44, 0x61, 0x4b, 0x23, 0x43, 0x15, 0x65, 0x29, 0x97, 0x7b, 0xa1, 0x5c, + 0xd0, 0xc9, 0x82, 0x21, 0x48, 0x1c, 0x55, 0x0d, 0xfa, 0x7e, 0x68, 0xcb, 0x0f, 0x63, 0xee, 0xc7, 0x34, 0xdf, 0xaf, 0x85, 0xe3, 0xab, 0x87, 0x1e, 0x63, 0xd0, 0xbf, 0xf4, 0x33, 0x2b, 0xc9, 0x3b, + 0xd9, 0x97, 0xd6, 0xbf, 0x9f, 0x4c, 0x2e, 0xd4, 0x7e, 0xee, 0xed, 0x75, 0xc0, 0xa4, 0x7d, 0x96, 0x01, 0xc1, 0x26, 0x81, 0xab, 0x6a, 0xbe, 0x98, 0x77, 0x9d, 0xe7, 0x54, 0xcc, 0xc6, 0x59, 0x57, + 0xf4, 0xe0, 0x4d, 0xcf, 0xd3, 0xc6, 0xc1, 0x17, 0xea, 0xd2, 0xef, 0x8e, 0xcd, 0x82, 0x55, 0x40, 0xdc, 0x98, 0x87, 0x95, 0x4a, 0x9b, 0xb5, 0x3b, 0xdb, 0xf0, 0xfb, 0xfd, 0xd6, 0x96, 0x49, 0x73, + 0x57, 0x65, 0xbc, 0x6b, 0x71, 0x35, 0x8d, 0xcd, 0x50, 0xcb, 0x9e, 0xaf, 0xcf, 0xc1, 0xf9, 0x67, 0x37, 0xbb, 0xff, 0x6b, 0x18, 0xa5, 0x57, 0x57, 0x69, 0xe9, 0x15, 0x46, 0xe5, 0xf9, 0x60, 0x9b, + 0x16, 0xf6, 0xe4, 0x05, 0xc3, 0xd7, 0x99, 0xf4, 0xd5, 0x34, 0xfb, 0xcf, 0xc5, 0x15, 0xd9, 0xbf, 0x4e, 0x33, 0xe8, 0xfb, 0x44, 0xbd, 0x54, 0xda, 0x8c, 0x9c, 0xc6, 0x49, 0x4a, 0xaf, 0x72, 0xfc, + 0x37, 0xdf, 0x9e, 0xcf, 0xe9, 0xe4, 0x3f, 0xe2, 0x70, 0x5e, 0xfe, 0x1f, 0xfb, 0x66, 0x6b, 0xfe, 0xa3, 0x28, 0x95, 0xff, 0xf9, 0x4d, 0x94, 0x4a, 0xda, 0x38, 0x45, 0x94, 0x1a, 0xf6, 0x0b, 0x6f, + 0xa9, 0x7e, 0x5b, 0x18, 0xf1, 0x6b, 0x0b, 0x47, 0x77, 0xf6, 0x2d, 0xfd, 0x97, 0x5e, 0xbf, 0xbd, 0x7a, 0x51, 0xdf, 0x8f, 0xe8, 0x7e, 0x93, 0x54, 0x75, 0x33, 0xf6, 0xea, 0x20, 0xc9, 0x77, 0xe9, + 0x06, 0xd2, 0x89, 0x9d, 0x38, 0x4c, 0xc1, 0xc4, 0x73, 0xa5, 0x64, 0x0e, 0x51, 0xfa, 0x71, 0x79, 0x18, 0x86, 0xe0, 0xb8, 0x6d, 0x9d, 0xb3, 0x89, 0xef, 0xe8, 0x74, 0x36, 0x9d, 0x4e, 0xb3, 0x0e, + 0x75, 0xe9, 0x1a, 0xd9, 0x83, 0x2e, 0x7a, 0xe2, 0x8c, 0x29, 0x73, 0x94, 0x02, 0x42, 0x5a, 0x27, 0x9c, 0xec, 0xaa, 0x70, 0xba, 0xa8, 0xaa, 0xdc, 0x1d, 0xd1, 0xfd, 0x9f, 0x1d, 0x74, 0xdf, 0x1c, + 0xba, 0xee, 0x22, 0x9a, 0x4d, 0x22, 0x3f, 0xf6, 0x1f, 0x89, 0xa4, 0xc8, 0x53, 0x8e, 0x85, 0xaf, 0x34, 0xc1, 0xc9, 0xdb, 0xd1, 0x04, 0x19, 0xe7, 0x58, 0x08, 0x82, 0x14, 0x15, 0x2f, 0x94, 0xc3, + 0xba, 0xa3, 0xa2, 0x8e, 0x19, 0x5a, 0x7b, 0x3a, 0x9d, 0x1d, 0xd7, 0x3c, 0xb2, 0xed, 0x95, 0x19, 0x8c, 0x00, 0xce, 0x4a, 0x23, 0xb7, 0x2c, 0x8f, 0x1c, 0x72, 0x3e, 0x9e, 0x86, 0xce, 0x46, 0xa6, + 0xf3, 0x6e, 0xdf, 0x28, 0xf5, 0xa1, 0x3f, 0x06, 0x31, 0xba, 0x90, 0xe3, 0x6c, 0x36, 0xdf, 0xd6, 0x0b, 0xd7, 0x0a, 0xa7, 0xab, 0x7c, 0x6e, 0x9c, 0x38, 0x99, 0xed, 0x4c, 0xe2, 0x39, 0x95, 0x5b, + 0x36, 0xa9, 0x8a, 0xfe, 0x9f, 0xff, 0xf3, 0xfb, 0x64, 0xb8, 0x9f, 0x62, 0x2d, 0xfe, 0x9e, 0x6d, 0xe4, 0x8d, 0xe8, 0x15, 0xbe, 0xf4, 0xd5, 0x89, 0x7e, 0xd4, 0xd2, 0xb2, 0x27, 0x69, 0x5d, 0x07, + 0xa1, 0x76, 0xda, 0x6d, 0xb8, 0x1a, 0x4d, 0xb5, 0x6d, 0x34, 0x50, 0x41, 0x0f, 0x86, 0xa6, 0x57, 0xee, 0x8a, 0x03, 0x79, 0xd8, 0xe8, 0xa4, 0xd8, 0xcd, 0x97, 0xb3, 0xf3, 0x1a, 0x07, 0x16, 0x48, + 0x5c, 0x2d, 0x14, 0xc4, 0xdd, 0x20, 0x96, 0x50, 0xcd, 0x3c, 0xd8, 0x5a, 0x6a, 0xa1, 0x54, 0x9a, 0xc3, 0xe2, 0x44, 0xae, 0x80, 0x79, 0xba, 0xdf, 0x38, 0x84, 0x56, 0x41, 0xe9, 0x86, 0x7c, 0x6e, + 0xb7, 0xfa, 0x31, 0xae, 0xae, 0xde, 0x25, 0x0f, 0x11, 0xbc, 0xc2, 0x7c, 0x7f, 0xf0, 0x3d, 0xe3, 0x19, 0x70, 0xa1, 0x78, 0xc1, 0xae, 0x2a, 0xfa, 0x8b, 0xcf, 0xc8, 0x18, 0xe0, 0xb0, 0x44, 0x9c, + 0x9e, 0x8e, 0x53, 0x19, 0x9a, 0xd1, 0x2c, 0x8a, 0x83, 0x5c, 0x88, 0xd6, 0x6b, 0x17, 0x24, 0x55, 0xcd, 0x94, 0xac, 0x3e, 0xf5, 0x0e, 0x1b, 0xbb, 0x99, 0x76, 0xab, 0xfd, 0x61, 0x77, 0xf6, 0x16, + 0x11, 0xe6, 0x90, 0xb0, 0x77, 0x4a, 0xb9, 0x64, 0xb6, 0x93, 0x06, 0xda, 0x52, 0x0c, 0xb5, 0x13, 0x90, 0x15, 0x0c, 0x6d, 0x8e, 0x0c, 0x80, 0x06, 0x5b, 0xbb, 0x69, 0xd2, 0x4d, 0x4b, 0xd8, 0x63, + 0xac, 0x6c, 0xdf, 0xcb, 0xbd, 0x3c, 0x54, 0x0b, 0xfd, 0x39, 0x0e, 0x9f, 0x29, 0xbf, 0xe0, 0xf1, 0xf9, 0x7c, 0xac, 0x4d, 0x9b, 0x93, 0x90, 0xb9, 0xb2, 0xcf, 0xa4, 0x13, 0x05, 0xa6, 0xc0, 0xb4, + 0xa5, 0xb4, 0xbc, 0x72, 0x75, 0x5d, 0x74, 0x77, 0x7b, 0x45, 0xd7, 0x42, 0xd3, 0xb7, 0xe7, 0x74, 0x88, 0x17, 0x59, 0x04, 0x7a, 0x0c, 0xda, 0x54, 0xcb, 0xe5, 0xcc, 0xe5, 0x62, 0x64, 0xe5, 0xfa, + 0x44, 0xae, 0x9c, 0x00, 0x2b, 0x65, 0xb9, 0xb0, 0x90, 0x37, 0xfa, 0xb4, 0x9b, 0xa3, 0x7c, 0x5a, 0xe1, 0xa1, 0x55, 0xee, 0x23, 0x0f, 0x78, 0x6e, 0x27, 0xf4, 0x22, 0x73, 0x96, 0x7e, 0xf5, 0xc5, + 0x51, 0xf3, 0xfe, 0x90, 0xba, 0x84, 0x82, 0x07, 0xe5, 0xc3, 0xa5, 0xe1, 0xb9, 0xdc, 0x7f, 0x1f, 0x64, 0xaf, 0x60, 0xbe, 0x9e, 0x8c, 0xcd, 0xfe, 0x17, 0x8a, 0xc0, 0x51, 0xd2, 0xa6, 0xc3, 0xd4, + 0x3f, 0x25, 0x83, 0x10, 0x29, 0x82, 0x03, 0xd9, 0x3e, 0x4b, 0xf0, 0x28, 0x5e, 0xd2, 0xe6, 0xda, 0x83, 0x0e, 0x4c, 0x42, 0xe3, 0xe2, 0xca, 0xd4, 0x17, 0x9b, 0x42, 0xd0, 0xea, 0xd5, 0x5e, 0x2a, + 0xa5, 0xd0, 0x51, 0xe6, 0x5a, 0x37, 0x9c, 0xd8, 0x7a, 0x79, 0xac, 0xe8, 0x13, 0xad, 0xe5, 0x8d, 0xc6, 0xac, 0x11, 0x29, 0xc5, 0x06, 0xba, 0xb5, 0x5d, 0x5d, 0x1c, 0x11, 0x9e, 0xf0, 0x7f, 0x4d, + 0xc3, 0x74, 0x22, 0xf0, 0x12, 0xde, 0xe1, 0x16, 0x46, 0x7c, 0xd5, 0xe2, 0x5c, 0x82, 0xb2, 0xbe, 0x28, 0x7e, 0xae, 0x6e, 0xf0, 0x97, 0x6c, 0x6d, 0xff, 0x5c, 0x6a, 0xac, 0x7c, 0xb1, 0x00, 0xfc, + 0x14, 0xed, 0x7f, 0xc7, 0x73, 0xf6, 0x5e, 0xf0, 0xe2, 0x95, 0x99, 0xa2, 0x37, 0x6b, 0xff, 0xbb, 0x83, 0xed, 0xb5, 0x28, 0xff, 0x5b, 0xb7, 0x7e, 0x1a, 0x24, 0x8f, 0x74, 0xf6, 0xf7, 0x9a, 0xf7, + 0x48, 0xa7, 0x4d, 0xfe, 0x8b, 0x20, 0x5f, 0x12, 0x03, 0x8d, 0xef, 0xfc, 0x9b, 0xd7, 0x80, 0x93, 0x4f, 0x27, 0x93, 0x2b, 0xe5, 0x71, 0x4a, 0x6d, 0x35, 0x6e, 0x13, 0x84, 0x20, 0x1a, 0xc3, 0x06, + 0x08, 0x76, 0x9a, 0xcf, 0x67, 0xc8, 0x94, 0x38, 0x81, 0x8c, 0xa5, 0x9f, 0x32, 0x02, 0x99, 0x99, 0xed, 0x29, 0xb6, 0x84, 0xb5, 0x85, 0xec, 0xc5, 0xba, 0xf5, 0x3d, 0x38, 0x6c, 0x21, 0xe4, 0x18, + 0x48, 0x8d, 0x72, 0x52, 0x22, 0x6b, 0xc3, 0x99, 0x33, 0xd1, 0x06, 0x28, 0x10, 0x3a, 0xe1, 0xec, 0x3c, 0x14, 0x2c, 0x7f, 0xd8, 0x73, 0x5a, 0x59, 0x66, 0xda, 0x4d, 0x6d, 0xfa, 0xc7, 0xda, 0xeb, + 0xd7, 0xa6, 0x78, 0xfe, 0xd9, 0x7b, 0xab, 0x16, 0x74, 0x19, 0x0f, 0xc8, 0x87, 0xb1, 0xe4, 0xd7, 0x57, 0x35, 0xf6, 0x83, 0xde, 0x7a, 0x04, 0x33, 0xfa, 0x2f, 0x8c, 0xfe, 0x55, 0x5f, 0xe5, 0x2b, + 0xc1, 0x71, 0xe8, 0x56, 0x7c, 0x8e, 0x9a, 0x87, 0x5d, 0x07, 0x74, 0x87, 0xac, 0x6d, 0xa6, 0xeb, 0x64, 0x28, 0x36, 0xd0, 0x3c, 0xc3, 0x19, 0x7e, 0xa7, 0x04, 0xcd, 0xe2, 0x28, 0x64, 0x24, 0x2c, + 0xef, 0xb7, 0xc6, 0x74, 0xae, 0xcc, 0xdc, 0xbd, 0x49, 0x27, 0xc9, 0xda, 0x9f, 0xa5, 0xb2, 0x03, 0x55, 0x0b, 0xca, 0x5c, 0x61, 0xfa, 0x42, 0x40, 0xd3, 0xf8, 0x3c, 0xdb, 0x13, 0xbb, 0x26, 0x31, + 0x87, 0x93, 0x7c, 0x44, 0xf9, 0x1e, 0x7b, 0xaf, 0xd5, 0xf0, 0xeb, 0xa1, 0x56, 0xff, 0xa2, 0x85, 0x74, 0x3a, 0xbf, 0x7c, 0x58, 0xbd, 0xe3, 0xb9, 0x2c, 0x35, 0x9f, 0xe8, 0x5e, 0xd8, 0xce, 0xfb, + 0xd9, 0xd8, 0x4c, 0x35, 0x46, 0x48, 0x4b, 0x3d, 0x2e, 0x91, 0x81, 0x66, 0x22, 0x4a, 0x6b, 0x39, 0x3d, 0xbe, 0xc8, 0x9a, 0x33, 0xb2, 0x49, 0xa7, 0x16, 0xa8, 0xaf, 0x3c, 0xfe, 0xc0, 0x0b, 0x87, + 0x59, 0xbc, 0x8f, 0xfb, 0xb3, 0x58, 0x72, 0x6d, 0x78, 0x3a, 0x55, 0x90, 0xab, 0x1b, 0x50, 0x5e, 0x54, 0xdb, 0x01, 0x88, 0x89, 0x6a, 0x7d, 0x9c, 0x2e, 0x5d, 0x5d, 0xa2, 0x16, 0x49, 0x3c, 0xc3, + 0xb6, 0x1c, 0xc6, 0x2b, 0x3d, 0x09, 0x8e, 0xd1, 0xeb, 0x5d, 0xbe, 0xd5, 0xbf, 0xe8, 0xa5, 0xd2, 0xa8, 0x7e, 0x28, 0x23, 0x3d, 0xbb, 0xb8, 0x7d, 0x25, 0xfe, 0x86, 0xcd, 0xa7, 0x4b, 0x63, 0x96, + 0x38, 0x78, 0xb2, 0x80, 0xea, 0x83, 0xb1, 0xdc, 0x9d, 0x76, 0x22, 0x40, 0x39, 0x25, 0x5e, 0xd0, 0xc7, 0xcc, 0x48, 0xbc, 0xca, 0x52, 0xe1, 0x11, 0x81, 0x95, 0x97, 0x57, 0x86, 0xce, 0x23, 0xf9, + 0x05, 0x7d, 0x4a, 0x7f, 0xf6, 0x46, 0xf4, 0xad, 0x49, 0xa1, 0xd3, 0x5f, 0xbc, 0xae, 0x46, 0xac, 0xd6, 0x69, 0x10, 0x3b, 0x3b, 0x28, 0xb7, 0x81, 0x1e, 0x0a, 0xca, 0x61, 0x5e, 0xa5, 0x1a, 0x46, + 0x15, 0x90, 0xe8, 0xe4, 0xb8, 0xdd, 0x6e, 0xe7, 0xe1, 0x2a, 0x62, 0x84, 0x9a, 0x90, 0x70, 0x17, 0x83, 0x23, 0x37, 0x2c, 0x5b, 0xb5, 0xde, 0x54, 0x5a, 0xe1, 0x9d, 0xd3, 0x63, 0xc6, 0x27, 0xfd, + 0xca, 0x5a, 0xc6, 0x08, 0x26, 0x7b, 0x79, 0x07, 0xe0, 0xc7, 0x3c, 0x46, 0x56, 0xc9, 0xa1, 0xe5, 0xbd, 0x39, 0x31, 0x4e, 0x8a, 0xa9, 0xbc, 0xc9, 0x5b, 0x42, 0x9e, 0x47, 0xbd, 0xfc, 0xe7, 0x9e, + 0x0b, 0x1f, 0x64, 0xdf, 0xc0, 0xb8, 0x2e, 0x41, 0xf0, 0xb8, 0x0c, 0x8a, 0x3c, 0xbb, 0x1e, 0xc4, 0xd3, 0x7c, 0x3e, 0x17, 0xf7, 0x40, 0x8f, 0x51, 0x03, 0x8d, 0x4e, 0xa1, 0xb9, 0x0d, 0xf5, 0xaa, + 0x49, 0x65, 0xd3, 0x59, 0xcf, 0x29, 0x29, 0x18, 0xe2, 0x9a, 0x66, 0x6b, 0xe7, 0x4c, 0x43, 0x40, 0x64, 0x5e, 0x0a, 0x65, 0x58, 0xae, 0x8b, 0x9c, 0x8c, 0x84, 0x65, 0x57, 0xf4, 0xc5, 0x49, 0x48, + 0x60, 0x27, 0xe0, 0x88, 0x74, 0x9a, 0x51, 0x86, 0xd7, 0x08, 0x2b, 0x89, 0xa5, 0xca, 0xd1, 0x43, 0xff, 0x85, 0x7f, 0xfd, 0x7d, 0x56, 0xf0, 0x42, 0xf5, 0x0d, 0x8c, 0x0b, 0x87, 0x1c, 0xc9, 0x06, + 0xce, 0xec, 0xc6, 0xa4, 0x0c, 0x7d, 0xcb, 0x3a, 0x2c, 0x58, 0xe9, 0x4a, 0x49, 0x8b, 0x04, 0x90, 0x43, 0x6b, 0x7a, 0xdb, 0x86, 0x76, 0x44, 0x74, 0xdb, 0x13, 0x75, 0x0c, 0x12, 0x4e, 0x44, 0xf3, + 0xf5, 0x69, 0x0d, 0x11, 0xa6, 0xbd, 0x3d, 0x87, 0xe6, 0x2c, 0xe2, 0x65, 0x6a, 0x65, 0xbb, 0x42, 0xb9, 0x2a, 0x17, 0x03, 0x32, 0x53, 0xe0, 0x62, 0x77, 0x3a, 0xa2, 0x6a, 0xbd, 0x9b, 0x47, 0xd4, + 0x20, 0x4e, 0x9b, 0x51, 0x58, 0xdc, 0x71, 0x14, 0xff, 0x2e, 0xe4, 0xff, 0xb9, 0x42, 0xf5, 0xb1, 0x83, 0xf8, 0x08, 0x45, 0x6a, 0x0e, 0x6d, 0x41, 0xda, 0xd1, 0x97, 0x43, 0x5c, 0x40, 0xd3, 0x3a, + 0x52, 0x7b, 0xb1, 0xdd, 0xb9, 0x7a, 0x50, 0xb5, 0x3a, 0xb8, 0x9f, 0xe9, 0x91, 0xb9, 0x43, 0x37, 0x28, 0x33, 0x2f, 0x4e, 0x45, 0x88, 0x43, 0x47, 0x64, 0x7a, 0xd0, 0x56, 0xe4, 0xac, 0x77, 0xa0, + 0x79, 0xe3, 0x84, 0x0b, 0x0d, 0x5d, 0x89, 0xf0, 0xae, 0x42, 0xd8, 0x65, 0x0d, 0x15, 0x0e, 0x70, 0x42, 0xf4, 0xe5, 0x2a, 0xdb, 0x86, 0xb5, 0x32, 0xc6, 0x51, 0x33, 0xf3, 0x93, 0x47, 0x99, 0xba, + 0xa9, 0xe7, 0x92, 0x79, 0xbd, 0x50, 0xbc, 0x40, 0x90, 0xa4, 0x13, 0x6a, 0x64, 0x1a, 0x2f, 0x8a, 0xd7, 0x76, 0x0d, 0x39, 0xdb, 0x28, 0xea, 0xc1, 0x3d, 0x00, 0x21, 0x91, 0xce, 0x2d, 0x22, 0xb5, + 0xac, 0x1e, 0xe7, 0x0d, 0x20, 0x47, 0x4a, 0xb1, 0x95, 0xd1, 0x1c, 0x89, 0x82, 0xa3, 0x8a, 0x4f, 0xf5, 0x90, 0x6c, 0x00, 0x3c, 0xdc, 0xb1, 0x48, 0x8a, 0x2b, 0x24, 0x8d, 0x2d, 0xfa, 0xbd, 0x91, + 0x7b, 0x06, 0xc1, 0xae, 0x8d, 0x20, 0x0e, 0x77, 0xfb, 0x52, 0xa9, 0xc4, 0x6c, 0xd1, 0x6f, 0x65, 0x7b, 0x84, 0x24, 0x6a, 0x54, 0x69, 0xec, 0x5b, 0x93, 0x32, 0xba, 0x46, 0xd9, 0xdf, 0xd1, 0x1b, + 0x5f, 0xf4, 0x4c, 0x85, 0x63, 0xbf, 0x59, 0x31, 0xbe, 0x32, 0xd0, 0x07, 0x5a, 0xde, 0x3b, 0x51, 0x66, 0x17, 0x38, 0xde, 0xec, 0x21, 0x93, 0xaa, 0x30, 0x92, 0x32, 0x4b, 0x8b, 0x0b, 0xcd, 0xe6, + 0xe6, 0xa5, 0x97, 0x87, 0xcb, 0xca, 0x9e, 0x94, 0x4e, 0xe1, 0x5f, 0x4c, 0x8a, 0xaf, 0x12, 0x2d, 0x71, 0xf3, 0xe4, 0x98, 0x24, 0x1f, 0x79, 0xed, 0x5b, 0xe1, 0xc4, 0x4d, 0x8b, 0xd8, 0xa8, 0x26, + 0x75, 0xe2, 0x94, 0x96, 0x91, 0x5d, 0xbb, 0xf1, 0x62, 0xac, 0xfd, 0x22, 0xfb, 0x16, 0x8e, 0x11, 0x4d, 0x5e, 0xc1, 0xfa, 0xe7, 0xaa, 0xf9, 0xfa, 0x5e, 0x9a, 0xd9, 0x70, 0x9d, 0x9b, 0x4c, 0x43, + 0xaf, 0x2f, 0xfe, 0x2a, 0x64, 0xfd, 0x53, 0xa6, 0x89, 0x6f, 0x4d, 0xcc, 0xf4, 0xb5, 0x26, 0xe8, 0x8d, 0x73, 0x4c, 0xe5, 0x5d, 0x62, 0xe5, 0xca, 0xaa, 0x70, 0x8c, 0xf8, 0x9f, 0x9f, 0x14, 0x1b, + 0x0f, 0x11, 0x7c, 0xc4, 0xdd, 0x9f, 0xe0, 0x67, 0xf7, 0xdf, 0xf1, 0x36, 0x9c, 0x6f, 0xef, 0x8c, 0x4d, 0x9f, 0x66, 0x91, 0x4d, 0x8a, 0x0b, 0x99, 0x82, 0xb5, 0xab, 0x03, 0x86, 0x78, 0xf2, 0xc9, + 0x3a, 0xe2, 0xfb, 0x79, 0xc9, 0x53, 0x7a, 0x14, 0x94, 0xb2, 0x3b, 0x0b, 0xf2, 0x13, 0xe8, 0x20, 0xe5, 0xa2, 0x8b, 0x17, 0xf3, 0x85, 0xee, 0xe7, 0xb0, 0xca, 0xcb, 0x19, 0x3e, 0xd7, 0xf8, 0xaa, + 0x66, 0x97, 0x84, 0x38, 0x5f, 0xe6, 0xb4, 0x02, 0x3b, 0x67, 0x25, 0xdf, 0x9b, 0x09, 0x2f, 0x8b, 0xf8, 0xa2, 0xd6, 0x63, 0x61, 0x44, 0x64, 0xf3, 0x0b, 0xbe, 0x6f, 0x3d, 0xf5, 0x86, 0x31, 0x76, + 0xe3, 0xe2, 0x94, 0x45, 0x7e, 0x85, 0x7c, 0xba, 0xf7, 0x18, 0xff, 0xdb, 0x41, 0x79, 0x0f, 0x7c, 0xe2, 0x49, 0x06, 0x7a, 0xfb, 0x82, 0x37, 0xe4, 0xbf, 0x5d, 0x9e, 0x10, 0xe3, 0xd8, 0xaa, 0xb5, + 0x0c, 0x44, 0xb1, 0x9c, 0x03, 0x8d, 0x17, 0x80, 0x55, 0xe2, 0x31, 0x3d, 0xd8, 0xfa, 0x5b, 0x0f, 0xdd, 0xa2, 0x03, 0xea, 0x81, 0x01, 0x8c, 0x0f, 0x4b, 0x49, 0x05, 0x0e, 0x34, 0x17, 0x1e, 0x67, + 0xe7, 0x7c, 0x5d, 0x1f, 0xeb, 0xf5, 0xa0, 0xad, 0xb1, 0xb3, 0xdc, 0x4f, 0x19, 0xde, 0x63, 0x8d, 0x35, 0x19, 0x86, 0xb4, 0x69, 0xd0, 0xfe, 0x9e, 0x8d, 0xcd, 0x25, 0x52, 0xad, 0x65, 0x08, 0x15, + 0xfc, 0x9b, 0x14, 0x6a, 0x59, 0x54, 0x3f, 0xd2, 0xef, 0x3f, 0xb9, 0xac, 0x46, 0x75, 0xf1, 0xd2, 0xf2, 0xa8, 0x2e, 0xc6, 0x2e, 0xa6, 0x98, 0xcc, 0x39, 0x6d, 0xa1, 0x9d, 0x73, 0x76, 0xd1, 0xd2, + 0xcd, 0x89, 0x18, 0x76, 0x27, 0x60, 0xca, 0xc6, 0xe2, 0x54, 0x9e, 0xba, 0x6b, 0x71, 0x53, 0x71, 0x8d, 0x09, 0x9e, 0xec, 0x4c, 0x9a, 0x76, 0x08, 0xae, 0xe2, 0x2e, 0xda, 0xa9, 0x36, 0x67, 0xf7, + 0xc2, 0xfc, 0xb4, 0x68, 0xc3, 0x88, 0x5a, 0x46, 0x60, 0x15, 0x91, 0x40, 0x67, 0x3a, 0xcb, 0xfc, 0x30, 0xdf, 0x02, 0x2c, 0x0e, 0x1e, 0xfd, 0xe2, 0xd9, 0x92, 0x11, 0x77, 0x4a, 0x2b, 0x5e, 0xfd, + 0x00, 0x1f, 0x8d, 0xac, 0xcf, 0xba, 0xf8, 0x47, 0x8a, 0xf3, 0x27, 0x16, 0xa2, 0x77, 0xb2, 0x2f, 0x58, 0xbe, 0x9f, 0x8c, 0xad, 0x35, 0xde, 0x84, 0x16, 0x2b, 0x16, 0x7b, 0x3d, 0x85, 0x25, 0x9d, + 0x37, 0x13, 0x7c, 0xcf, 0x73, 0x62, 0x76, 0x06, 0x95, 0x78, 0x25, 0x11, 0x78, 0x9e, 0x2a, 0x8a, 0x67, 0x71, 0x1b, 0x17, 0x34, 0x71, 0x27, 0x8b, 0xc2, 0xd0, 0x28, 0x54, 0x28, 0xa6, 0x07, 0x2a, + 0xcb, 0x18, 0xa3, 0xc2, 0xe2, 0x48, 0xc8, 0xe5, 0x52, 0xc9, 0xfa, 0x5d, 0xad, 0x9d, 0x05, 0xf4, 0xb4, 0xef, 0x0b, 0x6d, 0x79, 0x18, 0x54, 0xfc, 0xa6, 0xc4, 0x5e, 0x56, 0x38, 0x55, 0xe5, 0x3f, + 0xcc, 0xa2, 0xfe, 0xa4, 0xb2, 0xfb, 0x95, 0xe8, 0xb5, 0xdd, 0x97, 0xc3, 0xb1, 0xea, 0xee, 0x50, 0xad, 0x04, 0xac, 0x84, 0xf8, 0x01, 0x64, 0x15, 0x70, 0xb5, 0xa6, 0x25, 0x5b, 0xf1, 0xa6, 0x2e, + 0x09, 0xee, 0x62, 0x51, 0x91, 0xd4, 0x70, 0x51, 0x80, 0x05, 0xa8, 0x84, 0x7b, 0xb4, 0xe9, 0x57, 0x00, 0xd4, 0x50, 0x46, 0x7c, 0x64, 0x3b, 0xdf, 0x90, 0x0e, 0xfc, 0x50, 0x52, 0xbb, 0x59, 0xd4, + 0x57, 0x2e, 0xaf, 0xa8, 0x20, 0x59, 0x4b, 0xf2, 0x76, 0xa5, 0x10, 0x24, 0xd9, 0xf3, 0x9b, 0x08, 0x1b, 0x25, 0x94, 0xbd, 0x7d, 0x68, 0xf4, 0xf2, 0x59, 0xc5, 0xc4, 0x73, 0xa2, 0xec, 0x31, 0x87, + 0x79, 0x92, 0xbd, 0xdf, 0x7f, 0xc7, 0x67, 0x98, 0xbe, 0xde, 0x19, 0xcb, 0xde, 0x39, 0x73, 0x83, 0x58, 0x22, 0x9d, 0x14, 0xc6, 0xe1, 0x20, 0x2f, 0xe8, 0x1d, 0xa2, 0xb6, 0x72, 0x9b, 0xbb, 0x43, + 0x34, 0x5d, 0x44, 0xdb, 0x9d, 0xa6, 0x45, 0xc0, 0xc1, 0x9b, 0x83, 0x27, 0x60, 0x49, 0x19, 0x74, 0xbd, 0x8b, 0xc0, 0x54, 0xce, 0x67, 0x70, 0x8b, 0xcc, 0x79, 0x1c, 0x5b, 0x7b, 0x90, 0x10, 0xf5, + 0xfb, 0x83, 0x4d, 0xed, 0x5d, 0x45, 0x5b, 0xa3, 0x56, 0x7a, 0x3a, 0x60, 0xc7, 0xbd, 0x20, 0x3e, 0x8a, 0x37, 0xfd, 0x61, 0xf6, 0x5d, 0x04, 0x16, 0xdb, 0x77, 0xdd, 0x7f, 0xde, 0xcc, 0xd3, 0x0f, + 0x92, 0xf0, 0xbe, 0x8a, 0x0e, 0x0f, 0x00, 0x86, 0xfe, 0x85, 0x9f, 0xca, 0xe1, 0xfd, 0x4a, 0xf5, 0x02, 0xe9, 0x55, 0x34, 0x79, 0xa5, 0xf4, 0x33, 0x88, 0x96, 0xcd, 0x39, 0x2e, 0x68, 0x17, 0xca, + 0x22, 0xed, 0x6d, 0x16, 0x5e, 0x97, 0xdb, 0xa1, 0x5e, 0xb8, 0x14, 0x0c, 0x41, 0x89, 0x1e, 0x01, 0xdc, 0x11, 0xe8, 0x0d, 0xcb, 0x42, 0xcc, 0xb9, 0xe5, 0xd8, 0xb8, 0x4b, 0xef, 0x83, 0x10, 0x1b, + 0x00, 0xa5, 0x5a, 0xc8, 0xc7, 0x59, 0x4d, 0x8b, 0x9e, 0xe0, 0xd3, 0x01, 0x18, 0xb8, 0xf1, 0x4c, 0xac, 0xa1, 0x78, 0x3b, 0xd7, 0xb0, 0x76, 0x65, 0x4f, 0x17, 0xd4, 0x2d, 0xb3, 0xbe, 0x91, 0x98, + 0xfe, 0xa2, 0x9e, 0xff, 0x2b, 0xed, 0x4f, 0x20, 0xbc, 0x5e, 0x19, 0xab, 0xfb, 0x07, 0x61, 0x45, 0xa7, 0x80, 0x93, 0x14, 0xec, 0x09, 0xa3, 0x51, 0x84, 0xf3, 0xd2, 0x99, 0x8b, 0x36, 0x79, 0x60, + 0xa5, 0x78, 0x21, 0xc1, 0x33, 0x3c, 0x66, 0x60, 0x67, 0xaf, 0x96, 0x4c, 0x8c, 0x1f, 0x8d, 0x22, 0xda, 0xc5, 0x1d, 0xd8, 0x32, 0xa5, 0x81, 0x73, 0x73, 0xa3, 0xe3, 0x62, 0x08, 0x9f, 0x09, 0xfb, + 0x7d, 0xd5, 0x73, 0xe0, 0xbc, 0x03, 0xd1, 0x2e, 0x47, 0x8f, 0xf5, 0xbe, 0xc9, 0x71, 0x32, 0xbf, 0xc3, 0x7b, 0xd2, 0x73, 0xf1, 0x78, 0x08, 0x3c, 0x97, 0xc2, 0xed, 0x8d, 0xe8, 0xb5, 0xf1, 0x97, + 0xc3, 0xb1, 0x09, 0xdb, 0x48, 0xd1, 0x5f, 0x56, 0x7c, 0x14, 0xe1, 0xbc, 0x9d, 0x6c, 0x56, 0xdb, 0x16, 0x86, 0xa0, 0x15, 0x40, 0x75, 0x6b, 0x75, 0x8f, 0x9f, 0x15, 0x44, 0x6a, 0x15, 0x2d, 0x3c, + 0x12, 0xfe, 0xba, 0x31, 0x20, 0x53, 0xf5, 0x2b, 0x7d, 0x63, 0x80, 0xea, 0xb6, 0x38, 0x98, 0x76, 0x7c, 0x46, 0x0b, 0x44, 0x4d, 0x0c, 0xdf, 0x1e, 0x68, 0xa9, 0x8e, 0x6d, 0xe8, 0x24, 0x1a, 0xdb, + 0x42, 0x8f, 0x16, 0xf4, 0x89, 0x2e, 0xc7, 0x78, 0xd9, 0x64, 0x45, 0x1a, 0x4f, 0xac, 0xc8, 0xff, 0x4d, 0xf4, 0x1e, 0xf6, 0x9c, 0xe2, 0xe4, 0x83, 0xf0, 0x15, 0x8f, 0xb7, 0xb3, 0xc9, 0x95, 0xe0, + 0xcf, 0x98, 0x78, 0x0b, 0x19, 0x45, 0x72, 0x52, 0xd6, 0x25, 0x9c, 0x36, 0x4f, 0x6b, 0x89, 0x93, 0xab, 0x18, 0x5d, 0x21, 0x62, 0xb1, 0x46, 0xcf, 0x4a, 0x93, 0x32, 0xa1, 0x1f, 0xa9, 0x74, 0xb9, + 0x80, 0x09, 0x3c, 0x2c, 0xe1, 0xdc, 0x8d, 0xbc, 0xfa, 0x7c, 0x62, 0x9c, 0x0d, 0x70, 0x80, 0xd7, 0xc1, 0x5a, 0x5b, 0x36, 0x7d, 0x85, 0xa6, 0x78, 0x18, 0x10, 0x14, 0x90, 0xa3, 0xa6, 0xe5, 0xa5, + 0x45, 0x1c, 0x24, 0xc3, 0x88, 0x9d, 0x51, 0x65, 0xfb, 0xe7, 0x4f, 0x29, 0x26, 0x1e, 0xf9, 0xb8, 0x64, 0x45, 0xda, 0xf5, 0x13, 0xc3, 0xb6, 0x1f, 0x2f, 0x60, 0x4f, 0x69, 0x59, 0xde, 0xc9, 0x5e, + 0x61, 0x7b, 0x3d, 0xb9, 0x0c, 0xa4, 0x11, 0x5a, 0x96, 0x28, 0x92, 0xca, 0x2d, 0x7f, 0x90, 0x59, 0x59, 0x3c, 0x62, 0x58, 0x60, 0x17, 0x32, 0x28, 0xa0, 0x64, 0x1e, 0x25, 0xbe, 0xeb, 0x57, 0xac, + 0x08, 0xe8, 0x6d, 0x11, 0xc7, 0xba, 0x95, 0x1e, 0x36, 0x3d, 0xbf, 0x69, 0x2a, 0xbd, 0xcb, 0xfa, 0x13, 0x94, 0x20, 0xa0, 0xc9, 0x82, 0x3b, 0xac, 0x9a, 0x4d, 0xa7, 0x3a, 0x78, 0x5e, 0xcf, 0x6d, + 0x5d, 0x26, 0x37, 0xdb, 0xc2, 0x48, 0x37, 0x30, 0xa0, 0x6a, 0xd3, 0x11, 0x16, 0x6e, 0x37, 0x2d, 0x5a, 0xa3, 0xb0, 0xaf, 0xcd, 0xbb, 0xd9, 0x38, 0x7d, 0xae, 0xb5, 0xfd, 0x5a, 0x58, 0xfb, 0x3e, + 0xa6, 0x5f, 0x42, 0x1b, 0xee, 0xaf, 0x7e, 0x9f, 0x83, 0x1d, 0x46, 0x83, 0xfa, 0x41, 0xf7, 0x05, 0xd5, 0x8f, 0xb3, 0x8b, 0x17, 0x1c, 0xf5, 0x33, 0xac, 0x24, 0xc9, 0xea, 0x6d, 0x27, 0xc5, 0xdd, + 0x26, 0xa9, 0x51, 0x63, 0x8f, 0x63, 0x88, 0x0c, 0xa8, 0xd4, 0xa2, 0xcf, 0x76, 0x83, 0xe9, 0xae, 0x01, 0x06, 0x57, 0x25, 0x36, 0x44, 0x6b, 0x25, 0x50, 0xba, 0x84, 0x80, 0x71, 0xd8, 0x58, 0x6d, + 0xb9, 0xca, 0x53, 0xb4, 0xbd, 0x7a, 0xcc, 0x8f, 0xf0, 0x1c, 0x4f, 0xd7, 0xcd, 0x19, 0x88, 0x02, 0xc3, 0x40, 0x84, 0xb5, 0x0f, 0x9c, 0xdc, 0x86, 0x11, 0x24, 0x6a, 0x94, 0x6c, 0x50, 0x27, 0xbd, + 0x95, 0xda, 0xbf, 0x73, 0xa0, 0x7a, 0x62, 0x6e, 0xbe, 0x12, 0x7d, 0xc1, 0xe2, 0xf5, 0x70, 0x4c, 0xf5, 0xc3, 0x8b, 0xbd, 0x64, 0x5f, 0xee, 0x03, 0xdb, 0x05, 0x02, 0x3c, 0x8e, 0x80, 0x1e, 0x24, + 0xb8, 0xcd, 0x52, 0xd4, 0xcd, 0x62, 0x01, 0x52, 0x19, 0xa2, 0x9d, 0x0d, 0x68, 0x2d, 0x56, 0x76, 0x7e, 0x5c, 0x69, 0x88, 0xea, 0xe0, 0xa9, 0xb7, 0x16, 0x59, 0xba, 0x34, 0xd8, 0xf5, 0x9a, 0x17, + 0x9b, 0x8c, 0x06, 0x76, 0x87, 0x59, 0x56, 0x9c, 0x1a, 0xa7, 0xb1, 0x55, 0xbd, 0x37, 0x93, 0x00, 0xb1, 0x1a, 0x4a, 0x98, 0xdb, 0xd0, 0xcd, 0x4a, 0x95, 0x3f, 0xde, 0x5e, 0xc1, 0xcf, 0x78, 0xfc, + 0xe5, 0x2f, 0x3c, 0x39, 0x7f, 0xd9, 0x3b, 0xc1, 0xa3, 0x9c, 0xfb, 0x2a, 0x76, 0xb7, 0x1a, 0x10, 0xc4, 0x98, 0x0d, 0x0c, 0xdb, 0xf1, 0xd5, 0x69, 0x09, 0x00, 0xa7, 0xe4, 0xe8, 0x0e, 0x5d, 0xe4, + 0x3a, 0x1b, 0x9c, 0x31, 0xf3, 0xd4, 0xcb, 0x0e, 0x79, 0xb6, 0x3e, 0x07, 0xb0, 0x72, 0x06, 0x2d, 0xc9, 0x3c, 0x54, 0xbb, 0xe9, 0x80, 0xee, 0xea, 0x9c, 0x29, 0xf1, 0xe6, 0x04, 0x64, 0xc1, 0xac, + 0xdc, 0x60, 0x1d, 0x96, 0xed, 0xe8, 0x65, 0x74, 0xf2, 0xc8, 0xc2, 0xd2, 0xf6, 0x63, 0xb2, 0x71, 0xfd, 0x49, 0xfd, 0xfa, 0xbc, 0x76, 0x6a, 0x67, 0x72, 0xc9, 0x88, 0x51, 0x19, 0x65, 0xf8, 0x9b, + 0xfd, 0xc3, 0x9f, 0xaf, 0x64, 0xdf, 0x68, 0xbf, 0x80, 0xf7, 0xf5, 0xca, 0x58, 0x87, 0x9b, 0x5d, 0x6d, 0xec, 0x0e, 0x06, 0xe1, 0x46, 0x9b, 0x23, 0xbe, 0x36, 0x0e, 0x9a, 0x34, 0xac, 0xd3, 0x10, + 0xc2, 0xd6, 0xc3, 0x91, 0x87, 0x99, 0x29, 0x61, 0x70, 0x5e, 0x83, 0x17, 0x2e, 0xaf, 0xa0, 0xe2, 0x39, 0x9f, 0x02, 0x5b, 0x84, 0xf1, 0x32, 0x5d, 0x4a, 0xa6, 0x0c, 0xe5, 0x51, 0x3e, 0xa6, 0x2f, + 0xc2, 0xd9, 0x81, 0x52, 0xf1, 0x7d, 0x1e, 0xb2, 0xb3, 0xe5, 0x94, 0x2c, 0x30, 0xcf, 0x09, 0xd0, 0x0d, 0x3d, 0x66, 0x5d, 0x7b, 0xa8, 0xf8, 0x79, 0xb4, 0x55, 0xfd, 0xf3, 0xcc, 0x24, 0xf7, 0x5f, + 0x71, 0xc1, 0xea, 0xde, 0x8d, 0xb1, 0x19, 0x4b, 0x2a, 0x8d, 0x81, 0x25, 0xd8, 0x3b, 0xf7, 0xfb, 0x7a, 0x79, 0x8e, 0xd2, 0x13, 0xa8, 0xa9, 0x25, 0xd2, 0xc2, 0x78, 0x9d, 0x88, 0x27, 0x8f, 0xca, + 0xdd, 0x1a, 0xcc, 0x99, 0xa3, 0xeb, 0x1d, 0x35, 0x23, 0x36, 0x5a, 0xd2, 0xed, 0xbd, 0x3a, 0xde, 0x18, 0x48, 0xcf, 0x65, 0xf6, 0x21, 0xa5, 0xc8, 0x46, 0x43, 0x91, 0x62, 0x65, 0x45, 0x01, 0x80, + 0xb9, 0x8a, 0x26, 0xa9, 0xf2, 0xb6, 0xa4, 0xe7, 0xcb, 0xe6, 0x46, 0x00, 0xba, 0x7e, 0x63, 0x54, 0xd4, 0xbf, 0x81, 0xe4, 0xcf, 0x19, 0xcb, 0x3b, 0xd5, 0x77, 0x14, 0xa2, 0xa2, 0x1e, 0x5b, 0xfa, + 0x71, 0xba, 0xf7, 0x98, 0x2c, 0x26, 0x21, 0x77, 0xb0, 0xad, 0x66, 0x27, 0xb9, 0x62, 0xda, 0x63, 0xf4, 0xca, 0x30, 0x92, 0x4d, 0x78, 0x8c, 0xf6, 0xca, 0x02, 0x59, 0x6f, 0x87, 0xdc, 0xb3, 0xd6, + 0xa6, 0x77, 0x58, 0xec, 0xf5, 0x86, 0x4c, 0xc4, 0x63, 0xa3, 0xaf, 0x6d, 0x4b, 0x23, 0x51, 0x08, 0x5e, 0x89, 0x71, 0xa3, 0x00, 0x60, 0x06, 0xed, 0xcf, 0x2b, 0x25, 0x91, 0x58, 0x7e, 0xdd, 0xf9, + 0x6e, 0x29, 0x91, 0x63, 0x14, 0xc1, 0x85, 0xd1, 0x4e, 0xcc, 0xd4, 0x7e, 0xb4, 0xe4, 0x20, 0x5f, 0x22, 0xfc, 0xc6, 0x42, 0xf1, 0x46, 0x14, 0x9c, 0xbc, 0x1f, 0x4e, 0x2e, 0x94, 0x7e, 0x06, 0x82, + 0x1a, 0xb8, 0xbc, 0xcf, 0xdc, 0xf9, 0x2e, 0x60, 0x56, 0x39, 0xe7, 0x9d, 0xd5, 0x63, 0xca, 0x50, 0xc6, 0x0c, 0x29, 0x48, 0xad, 0x98, 0xa9, 0xc0, 0x54, 0x9a, 0xba, 0x2b, 0xb1, 0x04, 0xb7, 0x51, + 0x08, 0xcc, 0x2a, 0xf1, 0x38, 0x54, 0x42, 0x73, 0x3c, 0x40, 0xf0, 0x6e, 0xaf, 0x80, 0xe8, 0xdc, 0x23, 0xa0, 0x35, 0x60, 0x60, 0x54, 0x54, 0x51, 0x79, 0xc9, 0x0c, 0x7e, 0x21, 0x11, 0x51, 0xca, + 0x9c, 0xdc, 0x11, 0xdc, 0xc7, 0xec, 0x5f, 0xfd, 0x39, 0x6e, 0x42, 0x0e, 0x5f, 0xda, 0xf9, 0xc9, 0xbd, 0xe0, 0x46, 0xcd, 0xea, 0x5b, 0x69, 0xd2, 0x4c, 0x22, 0xff, 0x9a, 0xe7, 0xf6, 0x65, 0x98, + 0x23, 0x5f, 0xdc, 0x19, 0xea, 0x24, 0xf3, 0x2f, 0xf6, 0x97, 0xd7, 0xdd, 0xeb, 0x5d, 0x86, 0xf6, 0x96, 0x3c, 0xec, 0xa1, 0x4e, 0xfe, 0x99, 0x7d, 0xef, 0x1b, 0xd1, 0x97, 0x6e, 0x78, 0x4b, 0x4e, + 0x46, 0x8d, 0xdb, 0xd9, 0x4e, 0x03, 0x93, 0x4e, 0x0f, 0x41, 0xa7, 0xce, 0x5a, 0x48, 0xeb, 0x05, 0xbf, 0xad, 0x24, 0xc4, 0xde, 0x98, 0xd3, 0x29, 0xd8, 0x6c, 0x13, 0x59, 0x4c, 0x34, 0x02, 0x55, + 0x2d, 0x26, 0x04, 0x62, 0x35, 0x85, 0x66, 0xed, 0xca, 0x96, 0xe6, 0xdb, 0xb3, 0xce, 0xeb, 0xfe, 0x56, 0xe1, 0xaa, 0x4a, 0x5a, 0x5a, 0xb2, 0x27, 0x9f, 0xcd, 0x0d, 0x14, 0x2f, 0x29, 0xdc, 0xa9, + 0xbc, 0xad, 0xb8, 0x51, 0xbb, 0xc1, 0x1f, 0x21, 0x7f, 0xbe, 0xe6, 0x91, 0xfb, 0x4d, 0xde, 0x35, 0xe4, 0xbb, 0x4b, 0xe7, 0x6f, 0x9e, 0xc5, 0x6f, 0xf4, 0xe6, 0x9f, 0x1d, 0x72, 0xae, 0x29, 0xda, + 0xbe, 0x6a, 0xa6, 0xff, 0x3b, 0x17, 0x90, 0xdb, 0xb8, 0xa8, 0x8f, 0x9b, 0x37, 0x6b, 0xf9, 0x93, 0x8e, 0x09, 0xdf, 0xde, 0x01, 0x4e, 0xbe, 0x5f, 0x99, 0x10, 0x37, 0xd2, 0xcc, 0xaf, 0x47, 0xdd, + 0x5c, 0x40, 0xf3, 0x15, 0xb0, 0x9c, 0x6d, 0x2d, 0xd5, 0xb0, 0xb7, 0x45, 0x7d, 0x0e, 0x21, 0x8e, 0x91, 0x00, 0x62, 0x26, 0x9d, 0x50, 0x5a, 0xf4, 0x95, 0xa9, 0x7e, 0x72, 0x73, 0x32, 0x5d, 0x59, + 0xa1, 0xc3, 0xf9, 0x3b, 0xb2, 0x0c, 0xf6, 0x5c, 0x2f, 0x75, 0xa2, 0xed, 0x56, 0x68, 0x22, 0x39, 0xe1, 0xe2, 0xc8, 0x48, 0xa6, 0xd6, 0xf1, 0xb3, 0x25, 0x00, 0x1a, 0x9d, 0xbe, 0x75, 0x96, 0x94, + 0xac, 0x12, 0xc0, 0x4d, 0x58, 0xe3, 0x63, 0x0f, 0x90, 0xcf, 0xc9, 0x48, 0xaf, 0x01, 0xbb, 0xf0, 0xcf, 0x9e, 0x1f, 0xf7, 0x32, 0x98, 0xfe, 0xfa, 0xf5, 0xdd, 0xc1, 0x06, 0xa6, 0x9e, 0xcc, 0xf8, + 0x74, 0x3f, 0x95, 0xe9, 0x95, 0xe0, 0x38, 0x54, 0x83, 0x3a, 0x8e, 0x2c, 0x68, 0xb6, 0x92, 0x8b, 0x03, 0x9a, 0xaf, 0xb9, 0xf3, 0x2a, 0x54, 0xf4, 0xb2, 0x77, 0xa7, 0x5b, 0x72, 0xc7, 0x28, 0xfe, + 0xcc, 0x62, 0x58, 0x2f, 0xb1, 0x01, 0x74, 0xb7, 0xdb, 0xe2, 0x1b, 0x73, 0x16, 0xf3, 0xc7, 0xf3, 0xf2, 0xe4, 0x2a, 0x33, 0xeb, 0x4c, 0x28, 0x40, 0xc1, 0xcb, 0xe5, 0x2a, 0x1b, 0xb2, 0xf9, 0x5e, + 0x2c, 0x9b, 0x56, 0x16, 0x49, 0xc6, 0x0a, 0xa7, 0xd2, 0x41, 0xf8, 0xa8, 0xe0, 0xf1, 0x1d, 0x8e, 0x1f, 0x23, 0x1a, 0xbf, 0x63, 0xf3, 0x7d, 0x56, 0x8c, 0x87, 0xe6, 0x4f, 0x23, 0x1b, 0x6f, 0x53, + 0x96, 0x3f, 0xc4, 0xcc, 0xa3, 0x7d, 0xf1, 0xb4, 0x72, 0x8b, 0x93, 0x4e, 0xb7, 0x27, 0x4d, 0x4a, 0xba, 0xc5, 0xb9, 0x6a, 0xe1, 0xfa, 0x7c, 0x68, 0xb8, 0xf9, 0x56, 0x88, 0x7a, 0x51, 0x51, 0xaa, + 0x98, 0x9a, 0x6d, 0xd7, 0x5e, 0xd2, 0xf6, 0x73, 0x1e, 0x5c, 0xf0, 0xa6, 0x66, 0x1e, 0x35, 0xf4, 0x84, 0x8a, 0x59, 0xb0, 0x02, 0x67, 0xf2, 0x86, 0x20, 0x13, 0x5a, 0x9c, 0x2b, 0x6c, 0x4d, 0x38, + 0xcb, 0xa1, 0x86, 0xdd, 0x19, 0x8c, 0xff, 0x81, 0x2f, 0xd2, 0xbd, 0x90, 0xc6, 0xef, 0x66, 0xb7, 0xeb, 0xc7, 0xdf, 0x0b, 0x6b, 0xfc, 0x9e, 0x11, 0xf1, 0x36, 0xb4, 0x11, 0xff, 0x7e, 0x7f, 0x54, + 0x78, 0x23, 0xf6, 0xf3, 0x6c, 0xf8, 0xff, 0xfb, 0x41, 0x3d, 0xf0, 0x83, 0xfa, 0x9a, 0x8f, 0xf3, 0xde, 0xaa, 0x4a, 0x3e, 0x25, 0xe7, 0x7d, 0xa2, 0xfb, 0x79, 0x61, 0xad, 0xb3, 0x8b, 0xff, 0xe5, + 0x08, 0x59, 0x6f, 0xd8, 0x40, 0xc7, 0x19, 0xa9, 0xda, 0xc4, 0x3a, 0x63, 0xf8, 0x38, 0xe2, 0xe3, 0xda, 0xcd, 0xfb, 0x90, 0x9b, 0x03, 0xe0, 0x31, 0x12, 0x1c, 0x91, 0x25, 0xf2, 0x0d, 0x13, 0xed, + 0x14, 0xd2, 0x5b, 0xb2, 0x9b, 0x85, 0x07, 0xae, 0x49, 0x90, 0x3c, 0x33, 0x0a, 0xb7, 0x27, 0x83, 0x74, 0x2e, 0xcd, 0x15, 0xd8, 0xdc, 0xe4, 0xa8, 0x81, 0xf6, 0xb2, 0x7e, 0x10, 0x4c, 0x21, 0x55, + 0xf8, 0x85, 0x84, 0xa5, 0xde, 0x73, 0x36, 0x1b, 0xd7, 0x4f, 0xec, 0xb7, 0x7c, 0xa5, 0x37, 0xc9, 0x4f, 0x3f, 0xc9, 0x24, 0x2f, 0x4b, 0x29, 0xf2, 0xbb, 0xa5, 0x12, 0xba, 0x4c, 0x81, 0xb7, 0x7e, + 0xf8, 0xab, 0x4b, 0xe5, 0xcb, 0xec, 0xa2, 0x9f, 0x1a, 0xbb, 0x3f, 0x2f, 0x95, 0x17, 0xda, 0xe3, 0x86, 0x71, 0xdc, 0xad, 0xd8, 0xa9, 0x49, 0xf3, 0x65, 0x4c, 0xb0, 0xa9, 0xb0, 0x26, 0xbb, 0x25, + 0x80, 0x03, 0x2a, 0xd6, 0xc3, 0xbc, 0x0c, 0x62, 0x4b, 0x1f, 0x87, 0x78, 0x9a, 0xc1, 0xcb, 0x55, 0xd9, 0x6e, 0xd0, 0xf5, 0x20, 0xf3, 0x07, 0xcc, 0x6c, 0x43, 0x78, 0xd1, 0x04, 0xf6, 0xec, 0xdc, + 0x68, 0x7b, 0xcc, 0x1c, 0x8e, 0x58, 0x55, 0xcb, 0x92, 0xcf, 0xc0, 0xf8, 0x62, 0x8e, 0xb8, 0xf8, 0xd2, 0xe4, 0x1b, 0x6d, 0x54, 0xea, 0xd1, 0x4f, 0xa0, 0xff, 0xe4, 0xfc, 0xfa, 0x18, 0xc3, 0x67, + 0xe7, 0xff, 0x7f, 0x57, 0xf2, 0xea, 0xf2, 0xde, 0x71, 0xf8, 0x76, 0xfd, 0xa2, 0xed, 0xbd, 0x22, 0x05, 0xd7, 0xf3, 0xd4, 0x25, 0x38, 0xcf, 0x41, 0xfc, 0x01, 0xd9, 0x59, 0x6a, 0x1a, 0x20, 0x65, + 0x94, 0xee, 0x4a, 0xa5, 0x00, 0xd5, 0x72, 0xbe, 0x67, 0x37, 0x60, 0xea, 0x8b, 0x8c, 0x6b, 0xec, 0xbc, 0x08, 0x17, 0x76, 0x6e, 0x06, 0x04, 0x92, 0x3d, 0xd5, 0xf7, 0x92, 0x04, 0xad, 0xd6, 0xca, + 0x6e, 0x58, 0xd2, 0xc3, 0x4a, 0x5f, 0x90, 0x91, 0x4f, 0xc3, 0xa1, 0x87, 0xfc, 0x29, 0xbe, 0xbf, 0x2b, 0x73, 0xf2, 0xeb, 0xd7, 0xad, 0x76, 0x01, 0x7b, 0x0a, 0xd3, 0x71, 0xe5, 0x4e, 0x2e, 0xf4, + 0xc7, 0x61, 0x47, 0xf6, 0x51, 0x1f, 0x39, 0xa5, 0x2e, 0x81, 0xe2, 0x09, 0xa1, 0x03, 0x6f, 0xce, 0x46, 0xa8, 0xec, 0x06, 0x29, 0xa1, 0xab, 0xe4, 0x99, 0xc9, 0xd7, 0x05, 0xbe, 0x20, 0xc5, 0x4d, + 0x91, 0x5b, 0x34, 0xda, 0x90, 0xee, 0x70, 0xe8, 0xe3, 0x0a, 0x9e, 0x65, 0xed, 0x5c, 0xa6, 0x92, 0xa9, 0xac, 0x96, 0x54, 0x3e, 0x0c, 0x4d, 0xee, 0x99, 0x81, 0xb7, 0xc1, 0x25, 0xfd, 0x4c, 0x6c, + 0x2b, 0x70, 0x19, 0xce, 0x46, 0xe5, 0x98, 0xfc, 0x6f, 0xe4, 0x90, 0xef, 0xd9, 0x00, 0xc6, 0x03, 0xf8, 0xa7, 0x72, 0x08, 0x32, 0x3e, 0xd1, 0x07, 0x88, 0x33, 0xdb, 0x1d, 0x7a, 0x84, 0xf6, 0x98, + 0x7a, 0x0c, 0x30, 0xd6, 0xe2, 0x0c, 0xa7, 0x4b, 0x81, 0x22, 0xd5, 0x0f, 0xf6, 0x61, 0xa1, 0x80, 0xd0, 0x54, 0x10, 0x8e, 0x7b, 0xa1, 0x08, 0xba, 0x81, 0xe1, 0xe0, 0xb6, 0x50, 0xd4, 0x79, 0xc9, + 0x99, 0xfb, 0x8d, 0xd3, 0x04, 0xd1, 0x8a, 0x07, 0x74, 0x76, 0x8e, 0x95, 0x7a, 0xb4, 0x2e, 0xf0, 0x39, 0x8b, 0x69, 0x0a, 0xd4, 0xe7, 0x71, 0xb8, 0x01, 0x9c, 0xe9, 0x63, 0x28, 0xff, 0x0b, 0xf1, + 0x04, 0xf9, 0x17, 0xfe, 0x36, 0x00, 0x3f, 0x10, 0xfc, 0xe7, 0xd5, 0x0a, 0x78, 0x47, 0x80, 0xf9, 0x10, 0x4c, 0x90, 0x5f, 0xff, 0xef, 0xff, 0xfd, 0x42, 0x5f, 0xfe, 0x60, 0x2f, 0x7f, 0x9e, 0x13, + 0x51, 0x46, 0x08, 0xec, 0x77, 0xc3, 0x20, 0x7e, 0xfd, 0xfa, 0x2e, 0x95, 0x22, 0x4f, 0x8e, 0x86, 0x47, 0xe1, 0x10, 0xf8, 0x8d, 0xd1, 0xed, 0xd7, 0xa3, 0x5e, 0x37, 0x7a, 0x66, 0xd3, 0xc4, 0x60, + 0xe6, 0x31, 0x5c, 0x27, 0x84, 0xda, 0xfe, 0xc0, 0x6c, 0x29, 0xc4, 0x67, 0x5b, 0xab, 0xa2, 0xc0, 0x79, 0x9a, 0x1c, 0xe6, 0x67, 0xe6, 0xd0, 0x29, 0x1d, 0x4b, 0x36, 0x0e, 0x11, 0x2c, 0xcf, 0xe7, + 0x72, 0x11, 0x61, 0xae, 0x7e, 0x92, 0x66, 0xe2, 0x7e, 0x77, 0x96, 0xd2, 0x8d, 0x5f, 0x9f, 0xc0, 0xd4, 0xf6, 0x16, 0x05, 0x37, 0x48, 0xaa, 0xde, 0x9a, 0xbe, 0xcb, 0x50, 0xfb, 0xdf, 0x4c, 0xa0, + 0x91, 0xbd, 0xfe, 0x28, 0x62, 0xe2, 0x4e, 0xaf, 0xde, 0x04, 0x4d, 0xdc, 0x08, 0xa4, 0x3f, 0xad, 0x1d, 0x57, 0x47, 0xae, 0x1b, 0xc2, 0xf7, 0x83, 0x27, 0x5e, 0x76, 0x98, 0xc4, 0xcf, 0x3d, 0x7f, + 0x47, 0xad, 0xf1, 0xeb, 0xaf, 0xf5, 0xfb, 0x3d, 0xf5, 0xc6, 0x1f, 0xf4, 0xb9, 0x7c, 0x26, 0xe8, 0x78, 0x27, 0x64, 0x6e, 0xb3, 0x61, 0xa7, 0x16, 0x22, 0x51, 0xec, 0x3e, 0xdb, 0x06, 0xc1, 0x60, + 0x57, 0x45, 0xd2, 0xd0, 0x4b, 0xeb, 0xb0, 0x55, 0x01, 0xec, 0x54, 0xea, 0x1d, 0x0b, 0x1b, 0x3a, 0xa1, 0x0f, 0xc5, 0x6a, 0x4e, 0x16, 0xd1, 0xa0, 0xce, 0x2a, 0xe5, 0xd8, 0x7b, 0x32, 0x7f, 0xd8, + 0x6e, 0xce, 0x10, 0x49, 0x4c, 0x15, 0x42, 0xd9, 0xe3, 0xbe, 0x9e, 0xb1, 0xd0, 0xda, 0x17, 0xfe, 0x42, 0x9f, 0x8f, 0xd2, 0x80, 0xdc, 0x74, 0xd3, 0x6f, 0x9f, 0xff, 0xce, 0x67, 0x6f, 0x35, 0x21, + 0xb7, 0x7b, 0xc2, 0x3b, 0x22, 0x1e, 0xf1, 0x2d, 0xbd, 0xd0, 0xb7, 0x86, 0x3e, 0x10, 0xf5, 0x6e, 0x48, 0x7d, 0xbd, 0xf5, 0xdd, 0xff, 0x80, 0xb8, 0xf9, 0x8e, 0xf1, 0x23, 0xe2, 0x51, 0x82, 0xf9, + 0xef, 0x59, 0x89, 0xdf, 0xe9, 0xde, 0x1b, 0x17, 0x39, 0xb0, 0x9d, 0x51, 0x89, 0xb6, 0x87, 0x37, 0x2c, 0x5f, 0x9c, 0x0b, 0x8c, 0xc3, 0x7b, 0x27, 0x76, 0xab, 0x6c, 0xcb, 0x90, 0xa0, 0xc4, 0xe7, + 0xa7, 0xc4, 0x9e, 0xc5, 0xf3, 0xb9, 0x9d, 0x0f, 0xf1, 0x2e, 0xc0, 0x6d, 0x6b, 0x21, 0x08, 0x98, 0x90, 0x52, 0x79, 0xd4, 0xea, 0x73, 0x54, 0xe6, 0x8f, 0x28, 0xa0, 0xfb, 0x31, 0xbc, 0xa0, 0x36, + 0x39, 0x66, 0xcd, 0x12, 0x3f, 0xdc, 0x79, 0x11, 0xb3, 0x8d, 0xbe, 0x8f, 0x8b, 0x5f, 0xbf, 0xee, 0x2f, 0xa8, 0xbf, 0xbe, 0x4c, 0xa5, 0x47, 0xd3, 0xea, 0x9d, 0x85, 0x3f, 0x9e, 0x54, 0xe4, 0x17, + 0x25, 0xe6, 0x78, 0x08, 0xaf, 0xa4, 0xc1, 0xc9, 0xeb, 0xc1, 0xe4, 0x42, 0x69, 0xdc, 0x84, 0xb2, 0x66, 0x43, 0x92, 0x48, 0xf4, 0x26, 0x58, 0xe7, 0x32, 0x41, 0xce, 0x70, 0x64, 0xbf, 0x65, 0x08, + 0x9c, 0xd9, 0x1a, 0xc5, 0x06, 0x21, 0x20, 0x48, 0x59, 0x24, 0x66, 0x68, 0x19, 0x7e, 0xab, 0xe4, 0x68, 0xd7, 0x83, 0xb8, 0x67, 0x2c, 0xd6, 0x51, 0xe9, 0x9d, 0x93, 0x2c, 0x48, 0x9b, 0xed, 0x69, + 0x0d, 0x2c, 0x5d, 0x17, 0xa3, 0x6d, 0x8a, 0x9b, 0x27, 0x90, 0x49, 0x91, 0x0c, 0x9e, 0xb1, 0x12, 0x0c, 0x8d, 0x92, 0x42, 0xfe, 0xd7, 0xe7, 0xdf, 0xcf, 0xfb, 0xbf, 0xaf, 0x3e, 0x90, 0xf7, 0x75, + 0xfd, 0xcf, 0xd4, 0x9a, 0xfa, 0x46, 0xfb, 0x95, 0x03, 0x7d, 0xba, 0x32, 0xa6, 0xd6, 0xd4, 0x0b, 0x66, 0x7c, 0x08, 0xba, 0x2b, 0xe6, 0xd0, 0xaf, 0xbc, 0xd4, 0xee, 0x7a, 0x78, 0xc5, 0x6e, 0x90, + 0xa5, 0x31, 0x84, 0x0e, 0x17, 0x1c, 0x62, 0x67, 0x98, 0x2a, 0x2a, 0xe2, 0x9c, 0xed, 0x6a, 0x9d, 0x68, 0x5e, 0x35, 0x6c, 0xe6, 0xe5, 0x4c, 0x5c, 0xa7, 0x6d, 0xb4, 0x22, 0x16, 0x04, 0x2f, 0x9a, + 0x78, 0x95, 0xaf, 0xa4, 0x15, 0x5f, 0x6c, 0xcd, 0x0e, 0x41, 0x0e, 0x78, 0x8a, 0x72, 0xf5, 0xda, 0x68, 0xc4, 0xba, 0x1c, 0xa1, 0xee, 0x36, 0xcc, 0xb4, 0xa8, 0x26, 0x56, 0x9a, 0x54, 0x45, 0x1a, + 0x45, 0x4e, 0xf1, 0xbe, 0x9c, 0x7f, 0xd9, 0xe3, 0x99, 0xb5, 0xeb, 0xbe, 0xde, 0x23, 0xbe, 0x7b, 0x0c, 0xbf, 0xac, 0x21, 0xd5, 0x9b, 0x8f, 0x1f, 0x7a, 0xd7, 0x3d, 0xf9, 0x95, 0x6d, 0x7c, 0xf5, + 0x28, 0x7a, 0x19, 0xbe, 0x17, 0xf7, 0xe1, 0xff, 0x8f, 0xed, 0xbc, 0x2c, 0x6c, 0xc5, 0xfb, 0x8a, 0xf5, 0x1b, 0xd5, 0xb8, 0xed, 0x17, 0x8f, 0x36, 0xf1, 0xe8, 0x53, 0x59, 0xcb, 0xdf, 0x88, 0xbe, + 0xf6, 0xdc, 0xcb, 0xe1, 0x04, 0x1d, 0x97, 0xbd, 0xdc, 0x13, 0x0e, 0x10, 0x45, 0xa7, 0x09, 0xb5, 0xb7, 0xeb, 0xdc, 0x36, 0xbd, 0x46, 0xc2, 0x75, 0x94, 0x9c, 0x42, 0xf3, 0x43, 0x50, 0xe6, 0x03, + 0x91, 0x27, 0x7b, 0xcb, 0x75, 0xcb, 0xad, 0x8c, 0x62, 0x34, 0xbe, 0xa8, 0x8f, 0x76, 0x7e, 0x88, 0x01, 0xd2, 0xf4, 0xd6, 0x08, 0xbd, 0x6e, 0x56, 0x42, 0x39, 0x63, 0xe7, 0xf3, 0xc4, 0x48, 0x70, + 0x56, 0xac, 0xe9, 0x0a, 0x3d, 0xa6, 0xf4, 0x69, 0x1f, 0x6d, 0x87, 0x27, 0x23, 0x9b, 0x6f, 0x32, 0xe7, 0x3f, 0xf0, 0x2d, 0xf8, 0xe6, 0xde, 0x7d, 0x0f, 0x47, 0xe8, 0x29, 0xd7, 0xa7, 0xcf, 0x84, + 0xaf, 0x58, 0xbe, 0x9f, 0x4e, 0xa0, 0x71, 0x4e, 0x4f, 0x38, 0xe9, 0x16, 0x05, 0xb7, 0x05, 0x05, 0xe6, 0xc8, 0xe7, 0xbc, 0x30, 0xf5, 0xa0, 0xd8, 0x3b, 0x4d, 0xe9, 0xd3, 0x6c, 0xbb, 0xb4, 0x01, + 0x5a, 0x26, 0x75, 0x13, 0x39, 0x2e, 0xb7, 0x9c, 0x3d, 0x93, 0x53, 0xfd, 0x24, 0x54, 0x9c, 0xb9, 0x1e, 0x82, 0xae, 0xd4, 0x38, 0x76, 0x8d, 0x4e, 0xe9, 0xa9, 0xa6, 0x31, 0x22, 0xe6, 0x25, 0x44, + 0x0f, 0x1f, 0x4f, 0xa6, 0x21, 0xb8, 0x83, 0x52, 0xc5, 0x38, 0xb7, 0xb8, 0xb1, 0xf9, 0xbd, 0x17, 0x5f, 0xb9, 0x3f, 0x86, 0x9e, 0x33, 0xaf, 0xbc, 0x26, 0xe8, 0xbe, 0x1e, 0x8c, 0xce, 0xfc, 0x55, + 0xb1, 0x53, 0xea, 0x4c, 0x53, 0x8a, 0x03, 0x0d, 0x36, 0xc4, 0x35, 0x27, 0x67, 0x7b, 0xa4, 0x8d, 0x62, 0x2e, 0x24, 0xc7, 0x96, 0xce, 0xb7, 0x10, 0xca, 0xd3, 0xd6, 0x5a, 0x35, 0x98, 0xa0, 0xf0, + 0x33, 0x58, 0x10, 0x48, 0x02, 0xdb, 0xb3, 0x33, 0x7e, 0xe6, 0x16, 0x33, 0xcc, 0x6a, 0x87, 0x1d, 0xc7, 0x06, 0xb8, 0x30, 0xc5, 0xfd, 0xb4, 0x8f, 0x19, 0x9a, 0x0b, 0xfd, 0xe1, 0xac, 0xac, 0xd9, + 0x67, 0x5d, 0x76, 0xaf, 0x59, 0xc5, 0xaf, 0xf3, 0xf1, 0x9f, 0xff, 0x73, 0xd7, 0x49, 0xbc, 0x2a, 0xfc, 0xec, 0x23, 0xc5, 0xf9, 0x6f, 0xc3, 0x9d, 0x0b, 0xe7, 0xec, 0x74, 0xd9, 0xbf, 0x59, 0x91, + 0x56, 0xe9, 0xcb, 0xf2, 0xfb, 0xaf, 0x1b, 0x19, 0xe7, 0xc7, 0xae, 0x9c, 0xcf, 0xb8, 0xb8, 0xde, 0x7f, 0xc5, 0xa5, 0x0f, 0xee, 0xdd, 0xb8, 0xe4, 0x94, 0x1d, 0xd1, 0x27, 0x08, 0x20, 0x41, 0x0c, + 0x7e, 0xa6, 0x71, 0x58, 0x88, 0xb4, 0x68, 0x3d, 0x10, 0x7d, 0x8d, 0x83, 0x5b, 0x14, 0x5d, 0x59, 0xe5, 0xfc, 0xc0, 0x47, 0xbc, 0x5b, 0xf6, 0x2b, 0x83, 0x5f, 0x1b, 0x1c, 0xb6, 0x98, 0x22, 0x05, + 0xd6, 0x8b, 0xd4, 0xb6, 0x39, 0x6d, 0xd7, 0xb2, 0x2c, 0x82, 0xee, 0x69, 0x16, 0x1e, 0x32, 0xd3, 0x34, 0xf5, 0xe8, 0x80, 0x9f, 0xfb, 0xc4, 0x9c, 0x2b, 0xbc, 0x9f, 0xf9, 0xbe, 0xea, 0x3f, 0x97, + 0xd0, 0x68, 0x64, 0xc6, 0xa2, 0x3b, 0x69, 0xb6, 0xc8, 0x1f, 0xd2, 0x6c, 0x5d, 0x21, 0x7a, 0xcc, 0x47, 0x9f, 0xc9, 0x10, 0xf1, 0x4a, 0xf3, 0xbd, 0x03, 0xb2, 0x4b, 0x80, 0xe0, 0x08, 0xc4, 0x75, + 0x61, 0x35, 0xd8, 0x54, 0x7f, 0x2a, 0x25, 0x69, 0x4a, 0x06, 0x14, 0xc7, 0x1c, 0x22, 0x91, 0x53, 0xdb, 0x33, 0x2e, 0xba, 0xf1, 0x14, 0x8e, 0x8b, 0x1c, 0x5a, 0x8b, 0x58, 0xc2, 0x79, 0x1e, 0x8e, + 0xf1, 0xc6, 0x66, 0x87, 0x76, 0xb6, 0xe1, 0x83, 0xcd, 0x52, 0x66, 0x6b, 0x12, 0xcb, 0x36, 0xed, 0x89, 0x12, 0xba, 0xd2, 0xd9, 0x1e, 0x08, 0xbc, 0x46, 0x76, 0xab, 0x38, 0x2d, 0x25, 0xeb, 0xc0, + 0x42, 0x63, 0x02, 0x04, 0xdf, 0xb8, 0x93, 0x5b, 0xa4, 0xf1, 0xc7, 0xc8, 0xbf, 0x87, 0xc8, 0x0b, 0xf7, 0x7a, 0x46, 0x34, 0xb8, 0xa1, 0x7f, 0x41, 0xe7, 0xe6, 0xea, 0xc5, 0xab, 0x6d, 0x84, 0x88, + 0xa0, 0xba, 0x50, 0xa2, 0x38, 0xc4, 0xbe, 0x74, 0x06, 0x7f, 0xb1, 0xad, 0x81, 0x69, 0x46, 0x9b, 0xbe, 0x2f, 0x9b, 0x71, 0x16, 0xe5, 0xc4, 0x81, 0x06, 0x33, 0x80, 0x6c, 0x49, 0x4d, 0x15, 0xc1, + 0xf5, 0x6c, 0xe9, 0x15, 0x32, 0xcb, 0xca, 0x5e, 0x6b, 0x00, 0xcd, 0x74, 0xd7, 0xd7, 0x66, 0x9d, 0xbb, 0xba, 0x72, 0x6c, 0x1c, 0x19, 0x04, 0x59, 0xed, 0xc4, 0x95, 0x2c, 0x47, 0xee, 0x37, 0x3c, + 0xd8, 0xcc, 0x6f, 0x92, 0x34, 0x7d, 0xe8, 0x0d, 0xee, 0x4f, 0x56, 0xf8, 0x99, 0x84, 0x80, 0xaf, 0x8f, 0x5d, 0xda, 0x7f, 0x39, 0x9a, 0x5c, 0x09, 0xfd, 0xdc, 0x68, 0xdf, 0x02, 0xc8, 0xb5, 0xe6, + 0x9f, 0xa8, 0x93, 0x8f, 0xf4, 0x83, 0xc4, 0x2d, 0x14, 0x21, 0xf4, 0x75, 0x16, 0xd7, 0xe9, 0x81, 0x14, 0x10, 0xdd, 0x8b, 0x69, 0x75, 0x6b, 0x1c, 0x3b, 0x7b, 0x3d, 0xef, 0x36, 0x46, 0xe9, 0x3b, + 0x0b, 0xa6, 0x00, 0x7a, 0x55, 0x07, 0x95, 0x58, 0x2d, 0xad, 0x70, 0xe9, 0x6f, 0x22, 0x18, 0x31, 0x0a, 0xa8, 0x27, 0x54, 0x5f, 0x65, 0x3b, 0x34, 0xc6, 0xf6, 0xcb, 0x04, 0x7e, 0xce, 0xb3, 0xfa, + 0x4b, 0x44, 0xe9, 0xd5, 0x2b, 0x89, 0x78, 0x34, 0xc1, 0xae, 0x8d, 0x7c, 0xe9, 0xe4, 0x87, 0xe2, 0xe6, 0x73, 0x2b, 0xcd, 0x07, 0xe1, 0x4f, 0x60, 0x5e, 0x06, 0xd3, 0xc8, 0x40, 0x91, 0xcc, 0x04, + 0xb7, 0x5a, 0xac, 0x96, 0xd5, 0x34, 0xec, 0xcb, 0xfd, 0xa2, 0xa3, 0x32, 0x7f, 0xb7, 0x82, 0x2b, 0x6e, 0xb1, 0x93, 0x56, 0x8b, 0x29, 0xda, 0x84, 0x73, 0x94, 0xcb, 0xb1, 0x79, 0x3d, 0x85, 0xed, + 0x05, 0x71, 0x5e, 0x66, 0x20, 0xd0, 0x9c, 0xf5, 0xbc, 0x64, 0xb8, 0xb5, 0x91, 0x35, 0x3d, 0xb5, 0x43, 0x25, 0x00, 0x4b, 0xc9, 0x45, 0xdb, 0xe4, 0xb5, 0xb8, 0xb6, 0x12, 0x9d, 0xdc, 0x6b, 0x57, + 0x2b, 0xcc, 0xcf, 0xf3, 0xad, 0xac, 0xe3, 0x87, 0x81, 0x0e, 0xd0, 0xb3, 0x78, 0xbc, 0xd0, 0xbc, 0x42, 0xf1, 0x72, 0x34, 0x81, 0x7e, 0x46, 0x01, 0x9e, 0x50, 0x4e, 0x00, 0x69, 0x8e, 0xc4, 0x1d, + 0x08, 0xc1, 0x39, 0xe7, 0x14, 0x85, 0x32, 0xf9, 0xd6, 0x3f, 0x42, 0x4b, 0x1d, 0x0e, 0x9f, 0x19, 0x18, 0x95, 0x57, 0xa4, 0xf5, 0xf9, 0x22, 0x7b, 0xfd, 0x07, 0xb9, 0x64, 0x2f, 0x7d, 0x30, 0x2a, + 0x1e, 0x89, 0x1d, 0xd0, 0x53, 0xf1, 0x52, 0x85, 0x73, 0x95, 0x39, 0xaa, 0x8b, 0x80, 0x35, 0x82, 0x81, 0x6c, 0x21, 0x13, 0xd5, 0x14, 0xa9, 0x24, 0xf7, 0xa8, 0x4e, 0xc3, 0xa4, 0xb2, 0x97, 0x7a, + 0x78, 0xb9, 0x9c, 0x92, 0x33, 0x83, 0x64, 0x29, 0xaf, 0xd1, 0xcf, 0x84, 0x3c, 0xc7, 0x63, 0xbe, 0x0f, 0xd7, 0x9d, 0x74, 0x9a, 0x23, 0x41, 0x0d, 0xad, 0x54, 0x93, 0x8b, 0x8c, 0xa5, 0x28, 0x46, + 0xa1, 0x06, 0x28, 0x3b, 0xb2, 0x5d, 0x88, 0x40, 0x2b, 0x6f, 0xd5, 0x78, 0xb6, 0x98, 0x42, 0xc6, 0x89, 0x68, 0x34, 0xee, 0x26, 0x61, 0x7a, 0xe1, 0xd4, 0xe5, 0x35, 0x22, 0xf0, 0x3e, 0x03, 0x79, + 0xc6, 0xcb, 0xec, 0x95, 0xe6, 0xa5, 0xb9, 0x97, 0xa3, 0x4b, 0x60, 0xc6, 0x08, 0x3f, 0x32, 0x99, 0x4e, 0x96, 0x14, 0x65, 0xa0, 0xae, 0x05, 0x3a, 0x21, 0xb3, 0x80, 0x23, 0x08, 0x94, 0x45, 0x78, + 0x95, 0x96, 0x7e, 0xbd, 0x0a, 0xfa, 0xa3, 0x47, 0x7a, 0xb3, 0x46, 0x3d, 0x6d, 0x97, 0xda, 0xf9, 0x64, 0xb9, 0x5c, 0x53, 0x51, 0x34, 0xa9, 0x9e, 0xeb, 0x00, 0x91, 0x05, 0x9e, 0x75, 0x56, 0xf8, + 0x8c, 0x43, 0x62, 0x12, 0xac, 0xdb, 0xde, 0xe0, 0x4f, 0x47, 0xc2, 0x35, 0x2b, 0xa6, 0x3d, 0xf6, 0xc3, 0x2d, 0xcf, 0x74, 0x6d, 0xeb, 0xef, 0x4a, 0x37, 0xae, 0x6d, 0xbd, 0x34, 0xd6, 0xb5, 0xad, + 0xb1, 0x92, 0xcb, 0x09, 0xf1, 0xd2, 0xc6, 0x1e, 0x16, 0xa6, 0xe0, 0x93, 0x24, 0xa8, 0x18, 0x81, 0x71, 0xd8, 0xaa, 0x21, 0x22, 0xf0, 0x31, 0xd0, 0xed, 0x56, 0x8e, 0x64, 0x6f, 0xb7, 0xf5, 0x8c, + 0xf4, 0xad, 0x80, 0x34, 0x43, 0x62, 0xf0, 0x91, 0x05, 0xc5, 0x71, 0xd3, 0xce, 0x3f, 0x5b, 0x09, 0xbb, 0xc8, 0xd6, 0x4b, 0x73, 0xd7, 0xef, 0xac, 0x73, 0xbf, 0x66, 0x7d, 0x11, 0xa0, 0x12, 0xa1, + 0xd0, 0x70, 0x4b, 0xe7, 0x8a, 0x1b, 0x9f, 0xd4, 0xc2, 0x8f, 0x0b, 0xc3, 0xfd, 0x8d, 0xf4, 0xfc, 0xc4, 0x30, 0xbe, 0x90, 0x7c, 0x69, 0xed, 0xe5, 0xe0, 0x22, 0x3d, 0x8f, 0x18, 0xcc, 0x6b, 0x3d, + 0x5c, 0x6f, 0xf5, 0x70, 0xca, 0x2d, 0x16, 0xa2, 0x88, 0x68, 0xb9, 0xaa, 0xab, 0xa2, 0xb9, 0x8d, 0xb6, 0xb3, 0x73, 0xd9, 0x0d, 0x73, 0x6a, 0xc5, 0x97, 0x58, 0xb4, 0x5d, 0xa9, 0x20, 0x92, 0x42, + 0x3c, 0x2d, 0xcf, 0x5a, 0x5a, 0x00, 0x35, 0x34, 0x25, 0xda, 0x45, 0x0b, 0xfa, 0xb4, 0xc6, 0x1b, 0x99, 0x25, 0xaf, 0x95, 0x36, 0x37, 0x7d, 0x34, 0xb4, 0xbb, 0x95, 0x68, 0x33, 0x04, 0x72, 0x5c, + 0x3d, 0xb7, 0xfb, 0x3a, 0x47, 0xe9, 0xa5, 0x3e, 0xd0, 0xff, 0x90, 0x17, 0xe1, 0xec, 0xfe, 0xe4, 0xaf, 0x2f, 0x3a, 0x57, 0x23, 0x8a, 0x2e, 0x4e, 0xad, 0xf7, 0x87, 0xca, 0x53, 0x1b, 0xaf, 0x4f, + 0x84, 0x5f, 0x40, 0xfc, 0x74, 0x3a, 0xb6, 0x4c, 0x31, 0x1e, 0x61, 0xa7, 0x5e, 0xdf, 0x53, 0x04, 0xaf, 0x83, 0x11, 0xdb, 0xe9, 0xc7, 0x3d, 0x11, 0xe4, 0x3c, 0x35, 0x5d, 0xcc, 0x91, 0x03, 0xb4, + 0x5a, 0xf0, 0x5b, 0x11, 0x21, 0xa6, 0x66, 0x50, 0xf2, 0xa7, 0x29, 0xdb, 0x2d, 0x6d, 0x6f, 0x06, 0x5a, 0x10, 0x27, 0x97, 0x4b, 0xa0, 0x47, 0x69, 0xd9, 0x65, 0x7c, 0xd4, 0x1e, 0x06, 0x4a, 0x88, + 0xa4, 0x5a, 0x8c, 0x13, 0x63, 0x2d, 0x6c, 0x53, 0x76, 0x29, 0xcd, 0x9e, 0x83, 0xf2, 0xd6, 0x9f, 0xf7, 0x9a, 0x29, 0xee, 0x41, 0x0c, 0xd3, 0x25, 0x16, 0xf9, 0x5d, 0x39, 0x71, 0x0f, 0x54, 0xfc, + 0xa9, 0xd0, 0xc1, 0x4f, 0x74, 0xc1, 0xc9, 0xe7, 0xb3, 0x8b, 0x5e, 0x79, 0x84, 0x69, 0xbf, 0xc8, 0xd0, 0x43, 0x0a, 0x91, 0x1b, 0xcb, 0x8e, 0xe3, 0x8d, 0xc9, 0x35, 0x67, 0x63, 0xd7, 0x49, 0x87, + 0x75, 0x41, 0x9a, 0xdc, 0xe9, 0x70, 0x0a, 0xf1, 0x03, 0x3d, 0xcf, 0xe1, 0x05, 0x90, 0x65, 0xe6, 0x3e, 0x25, 0x21, 0x40, 0x73, 0x0c, 0xb6, 0x0b, 0x5b, 0x9c, 0xb5, 0xa9, 0x9d, 0xb8, 0x03, 0x38, + 0x96, 0x30, 0x83, 0x44, 0x8b, 0x91, 0x53, 0x2d, 0xd6, 0x8c, 0x1a, 0x67, 0xb5, 0xd6, 0xc4, 0x8c, 0x7a, 0xc3, 0x6a, 0x2f, 0x1f, 0x76, 0x91, 0xb7, 0x1f, 0xd5, 0x9e, 0x44, 0x9e, 0x5a, 0x56, 0x3f, + 0xd1, 0x7d, 0x6b, 0xfe, 0xf5, 0xec, 0x22, 0xaa, 0x8e, 0x18, 0x51, 0xa2, 0x21, 0x1f, 0x16, 0xa5, 0x6c, 0xec, 0x76, 0xf5, 0xa6, 0x0d, 0x67, 0x7e, 0x90, 0x4e, 0xc5, 0xe5, 0x74, 0x43, 0x80, 0xce, + 0x96, 0x38, 0xf9, 0x45, 0xd3, 0x8b, 0x4a, 0xa4, 0x93, 0xb3, 0xa9, 0xd4, 0x63, 0x2c, 0xe0, 0x31, 0x8d, 0x87, 0xcd, 0x88, 0x68, 0xc5, 0x01, 0x89, 0x68, 0x7b, 0xe6, 0xc2, 0x5d, 0x99, 0x22, 0x70, + 0x3e, 0x72, 0x33, 0xab, 0xb0, 0x4b, 0xc1, 0x90, 0x4b, 0x68, 0x01, 0xe8, 0x33, 0x41, 0xfa, 0x59, 0x9b, 0x75, 0x5d, 0x62, 0xff, 0xf9, 0x0f, 0xf4, 0x38, 0xd8, 0xf4, 0x51, 0xf8, 0xfa, 0x7d, 0xf4, + 0xb0, 0x27, 0xfc, 0xc6, 0xef, 0xbe, 0xe1, 0x0d, 0xc7, 0xef, 0xd7, 0x27, 0x97, 0x77, 0xfc, 0x8c, 0xa8, 0x83, 0x98, 0xec, 0x14, 0x51, 0xd6, 0x47, 0xa8, 0xed, 0x4a, 0xe7, 0x64, 0x63, 0x51, 0xc9, + 0x8a, 0x18, 0x80, 0x0a, 0x3b, 0x95, 0x58, 0x66, 0x5b, 0x55, 0x32, 0x60, 0xdd, 0x5b, 0x48, 0xe4, 0x41, 0x06, 0xb8, 0xa0, 0x11, 0xf6, 0x4c, 0x7c, 0xf0, 0x4c, 0x66, 0x1b, 0x55, 0x45, 0xb5, 0x62, + 0xdd, 0x50, 0xf3, 0x4e, 0xcb, 0x42, 0xb0, 0xc4, 0x2a, 0x00, 0x36, 0x5e, 0xcc, 0xce, 0x6c, 0xd1, 0xd6, 0x59, 0xf8, 0x46, 0x39, 0xf2, 0xf2, 0x89, 0xc5, 0xef, 0x27, 0x14, 0xf2, 0x54, 0xb6, 0xe1, + 0xcf, 0x84, 0x5f, 0xa1, 0x78, 0x3b, 0xbd, 0x04, 0x5d, 0x8c, 0x60, 0xf8, 0x9a, 0x9e, 0xa2, 0x1b, 0x0a, 0x39, 0xb0, 0xe4, 0xde, 0xef, 0x7d, 0x68, 0x0e, 0xcf, 0x25, 0x31, 0x0d, 0xf8, 0x81, 0x0c, + 0x33, 0x27, 0x4b, 0x0e, 0xd2, 0x8a, 0x5e, 0xf5, 0xa2, 0xb9, 0x5c, 0x9e, 0x61, 0x55, 0x55, 0x9d, 0xc6, 0xc4, 0xed, 0xf5, 0x8a, 0xac, 0xb2, 0x7e, 0x87, 0x4c, 0xd9, 0x8e, 0xb3, 0x24, 0x73, 0xc9, + 0x91, 0x8d, 0xd5, 0xef, 0x97, 0x21, 0x64, 0x99, 0x6d, 0x6e, 0x49, 0x85, 0x2f, 0x57, 0xb7, 0x08, 0x38, 0x56, 0x5d, 0xbc, 0xda, 0x0d, 0x7f, 0x97, 0x3d, 0x06, 0x79, 0x2a, 0x31, 0xfa, 0x0d, 0xf5, + 0x8b, 0x7e, 0xfd, 0xdb, 0xb5, 0x09, 0x32, 0x2e, 0x3d, 0x3a, 0x61, 0xc8, 0xc0, 0xbe, 0x2d, 0x9d, 0xa1, 0x25, 0x4f, 0x7b, 0x0a, 0x4c, 0xfa, 0x66, 0x73, 0xec, 0x28, 0x29, 0x53, 0x96, 0xf4, 0xa2, + 0xb0, 0x34, 0x5f, 0x55, 0xa3, 0x9c, 0xc1, 0x06, 0xdc, 0xc6, 0x55, 0x69, 0xc6, 0xee, 0xf3, 0xca, 0x74, 0xcb, 0x7d, 0x90, 0xb4, 0x5c, 0xff, 0xb2, 0xea, 0x9d, 0x6d, 0x7b, 0x57, 0x29, 0xcb, 0x7a, + 0x1e, 0xd2, 0xc2, 0x74, 0x27, 0xa7, 0x15, 0x8f, 0x10, 0xf9, 0x35, 0x3d, 0xfa, 0x37, 0x40, 0xbe, 0x99, 0x18, 0xbe, 0x3a, 0x4e, 0xe1, 0x4f, 0x48, 0x73, 0xdf, 0x4d, 0x0b, 0x17, 0x2a, 0x3f, 0xb7, + 0x17, 0x36, 0x99, 0xc3, 0xfc, 0x70, 0x22, 0xc4, 0x06, 0xf0, 0x11, 0x78, 0xd9, 0x64, 0x5d, 0x86, 0xb2, 0x1d, 0x90, 0x1d, 0x58, 0x2a, 0x5a, 0x89, 0x15, 0x55, 0x9f, 0x82, 0x7d, 0xd1, 0x4d, 0xe5, + 0x0a, 0x4c, 0xcc, 0xb2, 0xd5, 0x2c, 0xa0, 0xda, 0x10, 0x1a, 0x62, 0x56, 0xbe, 0xcc, 0x07, 0x36, 0x06, 0xb8, 0x49, 0x0e, 0xe3, 0xa2, 0x0a, 0x24, 0xb9, 0xc4, 0x32, 0xa4, 0xe0, 0x56, 0xa4, 0x12, + 0xb6, 0xd6, 0x08, 0x15, 0xf9, 0x57, 0xdf, 0x54, 0xe2, 0xb1, 0xda, 0xab, 0x74, 0xaa, 0x89, 0x95, 0xa6, 0xa1, 0xef, 0x7c, 0x54, 0x5f, 0xbe, 0x3f, 0x76, 0x9e, 0xd1, 0x54, 0xdf, 0x50, 0xbf, 0x00, + 0xf8, 0xed, 0xda, 0xd8, 0xca, 0x9b, 0xfb, 0x53, 0x72, 0x92, 0xba, 0xa3, 0x5a, 0x3b, 0x45, 0x48, 0xe0, 0xa8, 0xea, 0xd6, 0x91, 0x2f, 0x74, 0x33, 0x91, 0x82, 0x0f, 0x2e, 0x04, 0xe4, 0xae, 0x34, + 0x27, 0x51, 0x7e, 0xa5, 0x6d, 0xac, 0x7e, 0xab, 0x2d, 0x39, 0x1a, 0x9b, 0xd6, 0x4b, 0x28, 0x3c, 0x17, 0x52, 0xb6, 0x67, 0xeb, 0xa3, 0x9e, 0x1c, 0xe2, 0x20, 0xeb, 0xcb, 0x65, 0x3c, 0x74, 0x6b, + 0x75, 0xb3, 0x73, 0x0d, 0x42, 0x0c, 0x16, 0x5e, 0x7f, 0xbb, 0x3e, 0x39, 0xd5, 0xbb, 0x1e, 0x2e, 0x7d, 0x24, 0x35, 0x3e, 0x27, 0xf6, 0x7c, 0x25, 0x7d, 0x85, 0xe2, 0xd3, 0x85, 0xb1, 0xa2, 0xcf, + 0x1c, 0xe7, 0x59, 0x95, 0x54, 0x8a, 0x8c, 0xc2, 0x37, 0x7e, 0x84, 0x9b, 0x9e, 0xde, 0x60, 0x44, 0x40, 0x05, 0x82, 0x63, 0xa6, 0x9b, 0x1c, 0x5f, 0x6f, 0x63, 0x6d, 0x8b, 0x9e, 0x4f, 0x9c, 0xcd, + 0x2d, 0xa9, 0x6e, 0x91, 0x89, 0x8a, 0x2a, 0x6f, 0xcb, 0x5d, 0x11, 0x09, 0x2c, 0x53, 0x84, 0x69, 0xb7, 0x9d, 0x3b, 0x3b, 0x1f, 0x54, 0xf5, 0x55, 0x5b, 0xef, 0x1b, 0x0d, 0x53, 0x77, 0xad, 0xb6, + 0x5d, 0x67, 0xb7, 0x73, 0xc8, 0x73, 0x4c, 0x23, 0x39, 0x4f, 0xac, 0x34, 0x8e, 0x8d, 0x4b, 0x86, 0xf2, 0xbf, 0xb8, 0x56, 0x7f, 0xa5, 0xfd, 0x82, 0xc4, 0xd7, 0x2b, 0x63, 0xd7, 0xec, 0x70, 0xd9, + 0x15, 0xc8, 0xa0, 0x67, 0x5a, 0x65, 0xc7, 0xc5, 0x0e, 0xce, 0xd9, 0xa0, 0x28, 0x54, 0x50, 0x87, 0x8b, 0x3d, 0x1c, 0x72, 0x14, 0xdb, 0x01, 0xe7, 0x30, 0xdb, 0xc0, 0x1c, 0xe6, 0xa8, 0x71, 0xa3, + 0x96, 0x6d, 0x6c, 0xcd, 0x61, 0xef, 0xa8, 0xcc, 0x14, 0x4d, 0x1e, 0xa2, 0xc2, 0xd0, 0x5a, 0x18, 0xec, 0xf5, 0x8c, 0xd0, 0x6a, 0x56, 0x23, 0x49, 0xad, 0x6a, 0xcc, 0x1d, 0x64, 0xc7, 0xec, 0x73, + 0x52, 0xe0, 0x5b, 0x0b, 0x2e, 0x42, 0xc7, 0x3f, 0x3f, 0x28, 0x9b, 0xbf, 0x3f, 0xfc, 0xf7, 0xf4, 0xfa, 0x5f, 0x28, 0x7f, 0x02, 0xf6, 0x72, 0x3e, 0x56, 0xcb, 0x4f, 0x02, 0x80, 0xbd, 0xf0, 0x2a, + 0xab, 0x43, 0x51, 0x1c, 0xad, 0x67, 0x46, 0x4e, 0xb1, 0xec, 0x1e, 0xdb, 0xd5, 0xdd, 0xcc, 0xa9, 0x66, 0x03, 0x43, 0xea, 0x92, 0xe0, 0xc5, 0x47, 0x69, 0x95, 0x2c, 0xe7, 0x36, 0x61, 0x1e, 0x0a, + 0xd5, 0xf6, 0xe7, 0xfd, 0xc0, 0x34, 0x1c, 0x44, 0xea, 0x18, 0x26, 0x6b, 0x36, 0x7f, 0xf0, 0x14, 0xb9, 0x57, 0x2b, 0x7c, 0x0b, 0xf6, 0xde, 0x40, 0x39, 0xa1, 0x65, 0x3e, 0xaa, 0x05, 0xf8, 0x15, + 0x97, 0xaf, 0x61, 0x74, 0x7f, 0x6f, 0x33, 0xfe, 0x99, 0xf0, 0x0b, 0x2a, 0x9f, 0x4e, 0xc7, 0x6e, 0xcb, 0x73, 0x5c, 0x15, 0xfb, 0x2a, 0x5f, 0xcc, 0x57, 0x9b, 0x65, 0xc8, 0xd9, 0xfe, 0x76, 0x55, + 0x68, 0x30, 0x14, 0x37, 0xfc, 0xbe, 0x49, 0x24, 0x0f, 0x43, 0x40, 0x80, 0x4b, 0x67, 0xd1, 0x42, 0x41, 0x4d, 0x84, 0x57, 0xf9, 0x39, 0xd2, 0x75, 0xeb, 0x4c, 0x5f, 0xd8, 0x31, 0x8d, 0xb5, 0x0e, + 0x34, 0x33, 0xd2, 0x13, 0xba, 0x6f, 0xd7, 0x3d, 0x97, 0x9f, 0xf1, 0xf6, 0x40, 0x3a, 0x59, 0x77, 0x6c, 0x20, 0xbd, 0x19, 0x11, 0x55, 0xf2, 0x43, 0x91, 0x80, 0xb3, 0x53, 0x4d, 0xfc, 0xe4, 0x45, + 0x34, 0x2b, 0x7d, 0xeb, 0xfd, 0x91, 0x2f, 0x41, 0x40, 0x37, 0x55, 0x53, 0x5e, 0x9e, 0xa1, 0xff, 0x2c, 0x3a, 0xe4, 0x61, 0xe5, 0x95, 0x5f, 0x37, 0xfd, 0x03, 0x3f, 0x1b, 0x1d, 0xf2, 0x73, 0x09, + 0x16, 0x78, 0x74, 0x70, 0xc8, 0xca, 0x25, 0x67, 0xc1, 0x22, 0xca, 0xc2, 0x61, 0x98, 0x39, 0x27, 0xd8, 0xca, 0xcf, 0x47, 0x54, 0x38, 0x28, 0x47, 0xd4, 0x18, 0xfa, 0xb4, 0x63, 0x39, 0x23, 0xd8, + 0x03, 0x3e, 0x97, 0x2c, 0x66, 0xee, 0xe9, 0x84, 0xcc, 0x95, 0x9e, 0xed, 0x15, 0x43, 0xd7, 0x15, 0x64, 0xbe, 0x67, 0x03, 0xd9, 0xd0, 0x10, 0x69, 0x4b, 0xf9, 0x78, 0xb0, 0x42, 0x0f, 0x01, 0x19, + 0x7b, 0xe5, 0x16, 0x63, 0xd9, 0x69, 0xae, 0x4c, 0x7f, 0x76, 0xdc, 0x7e, 0x58, 0xa6, 0xed, 0x2f, 0x72, 0xcf, 0xbb, 0xaf, 0xb8, 0x8c, 0xea, 0x7b, 0x37, 0xc6, 0xf2, 0x52, 0x03, 0x99, 0xd1, 0x1a, + 0xb4, 0x89, 0x76, 0x6a, 0x44, 0xd7, 0x60, 0x53, 0x2a, 0x44, 0x79, 0x5c, 0xd5, 0x74, 0xc3, 0xcd, 0x33, 0x77, 0x53, 0x23, 0xed, 0xfe, 0x44, 0x44, 0xf0, 0x12, 0x55, 0xe7, 0x46, 0x09, 0x42, 0x67, + 0x79, 0x35, 0x70, 0xc3, 0x2c, 0x15, 0xc1, 0x55, 0x5a, 0x1f, 0x2d, 0x59, 0x32, 0x63, 0x7a, 0xad, 0xe8, 0xfc, 0x12, 0x65, 0x84, 0xae, 0x4f, 0x20, 0xf4, 0xa8, 0x45, 0x0b, 0xa3, 0x7b, 0x32, 0x69, + 0xf8, 0x4d, 0x1d, 0xbc, 0xfb, 0x50, 0x47, 0x46, 0xf9, 0x77, 0xcb, 0x23, 0x5d, 0x28, 0xbe, 0x00, 0xf9, 0xf2, 0x3b, 0x96, 0x59, 0x9e, 0x69, 0x09, 0xf6, 0x0c, 0xc7, 0xec, 0x51, 0x42, 0x38, 0x1c, + 0xaa, 0xd6, 0xc4, 0x92, 0x8a, 0xe1, 0x38, 0xce, 0xd8, 0x94, 0xc6, 0xe9, 0x10, 0x48, 0x04, 0xe5, 0xce, 0xba, 0x54, 0xb2, 0xea, 0x2a, 0xc2, 0xdd, 0x03, 0xdc, 0xd4, 0x1a, 0x4c, 0x2d, 0xd1, 0xf6, + 0x50, 0xa1, 0xc1, 0xa2, 0x5f, 0x54, 0x45, 0xd8, 0x01, 0x9b, 0x01, 0x3a, 0xc1, 0x1c, 0x85, 0x4f, 0xb1, 0x6d, 0x3f, 0xb5, 0xd9, 0xad, 0x8f, 0x8c, 0x31, 0x06, 0x95, 0x91, 0x6f, 0x39, 0x13, 0x23, + 0x29, 0xfd, 0xbf, 0xaa, 0xaf, 0xff, 0x20, 0x7b, 0x41, 0xe2, 0xed, 0x64, 0xac, 0xae, 0x3e, 0xdf, 0x32, 0x5b, 0xd7, 0xd3, 0x20, 0x0c, 0xb2, 0x4e, 0xcb, 0x23, 0x86, 0x6e, 0xe8, 0xd9, 0xa2, 0x3f, + 0xe7, 0x9a, 0x29, 0x8b, 0x0b, 0x7d, 0xb3, 0x14, 0xce, 0xe4, 0x86, 0x44, 0xe3, 0xea, 0xa8, 0xac, 0xf7, 0x26, 0x95, 0xf5, 0x22, 0xea, 0x0e, 0x2e, 0xb6, 0xea, 0x6c, 0xfc, 0x30, 0xd8, 0xf3, 0xb5, + 0x44, 0x6c, 0xf7, 0xf2, 0x19, 0x54, 0x66, 0x89, 0xc0, 0x77, 0x67, 0x4f, 0xaf, 0x36, 0x9b, 0xba, 0x98, 0xef, 0x9e, 0xb3, 0x46, 0x5e, 0x3e, 0xbb, 0xac, 0xfa, 0xe8, 0xd5, 0x0e, 0x79, 0x63, 0x1f, + 0x36, 0xca, 0xaa, 0xb8, 0xd8, 0xfc, 0xdf, 0x96, 0xec, 0xdb, 0xf8, 0xc8, 0x72, 0xe2, 0xd6, 0x51, 0xd4, 0xfa, 0x76, 0xe5, 0x4d, 0x2e, 0xae, 0x8c, 0x59, 0xea, 0xff, 0x6c, 0x4c, 0xfe, 0x92, 0x44, + 0xee, 0xfe, 0xf8, 0x7c, 0x46, 0xc5, 0xfa, 0x41, 0xf6, 0xa5, 0x6b, 0xde, 0x4f, 0x26, 0xe8, 0x38, 0x75, 0x2b, 0xaf, 0x75, 0x19, 0x8a, 0x6d, 0x22, 0x1d, 0x36, 0x90, 0xb5, 0x49, 0xe9, 0xd2, 0x79, + 0xc1, 0x6c, 0xd0, 0xc4, 0x5f, 0x2d, 0x07, 0xdf, 0xb4, 0xdb, 0xaa, 0xdd, 0xc9, 0xca, 0xe6, 0x0c, 0xe5, 0xd2, 0x7e, 0x28, 0xd9, 0x74, 0x8d, 0x72, 0xee, 0x39, 0x74, 0xa9, 0x8d, 0x3d, 0x3b, 0x2e, + 0x64, 0xf4, 0x10, 0x3a, 0x01, 0x3b, 0x5f, 0x45, 0x4a, 0x9b, 0x1c, 0x92, 0xec, 0x64, 0x0b, 0xfa, 0xca, 0x5b, 0x6c, 0x23, 0x70, 0x44, 0x8a, 0x89, 0x07, 0x19, 0x0b, 0x1f, 0x20, 0x57, 0x17, 0x96, + 0x33, 0x89, 0x8d, 0x47, 0xa6, 0x5e, 0xe8, 0x5f, 0xe2, 0x19, 0xe5, 0xd8, 0x3b, 0xd9, 0x0b, 0x72, 0x6f, 0x27, 0x17, 0xf7, 0xba, 0x11, 0xaa, 0x31, 0x39, 0x38, 0x1b, 0x59, 0x1d, 0x2b, 0x91, 0xb9, + 0xf5, 0xc2, 0xd9, 0x79, 0x38, 0x92, 0x5a, 0x68, 0xe1, 0x9a, 0x2a, 0x1f, 0x31, 0x62, 0x01, 0xf9, 0x9b, 0x9a, 0x3a, 0x70, 0x6a, 0x0e, 0x99, 0x56, 0x2b, 0xe2, 0xf6, 0x00, 0x7a, 0x90, 0x18, 0x05, + 0x84, 0x93, 0xac, 0xf3, 0x60, 0x80, 0x75, 0x33, 0x47, 0x22, 0x5c, 0x31, 0x72, 0x2d, 0x29, 0x4e, 0x66, 0xab, 0x08, 0xca, 0xb6, 0x5f, 0xa0, 0x0b, 0x6c, 0x54, 0x84, 0xf3, 0xa7, 0x4f, 0x7d, 0xad, + 0xff, 0xf8, 0x10, 0x16, 0xfc, 0x5f, 0x98, 0xfe, 0x2f, 0x70, 0x79, 0xa3, 0xff, 0x15, 0x9f, 0xd7, 0x8b, 0x93, 0x2b, 0xf9, 0x9f, 0x81, 0x52, 0xd2, 0x24, 0x26, 0x07, 0x81, 0x59, 0xad, 0x87, 0x19, + 0x27, 0xd9, 0x33, 0xa0, 0xf2, 0x4a, 0xd1, 0x28, 0xa0, 0x50, 0xab, 0x99, 0xd5, 0xa0, 0x35, 0x9d, 0xde, 0x46, 0x33, 0x83, 0x22, 0x7b, 0x1f, 0xdc, 0xda, 0x41, 0x43, 0x1e, 0xfd, 0x0c, 0xb1, 0xfa, + 0x93, 0xc9, 0x07, 0x78, 0x0a, 0x59, 0x0b, 0x71, 0x87, 0xcd, 0x4f, 0x61, 0x7d, 0x6c, 0x4d, 0x94, 0x63, 0xd9, 0x5e, 0xee, 0x10, 0x96, 0x4b, 0xb8, 0xe7, 0x16, 0x91, 0x57, 0x4d, 0xcd, 0xab, 0x3d, + 0xf3, 0x8e, 0xe4, 0xf4, 0x65, 0xa8, 0x7d, 0x73, 0x11, 0xfd, 0x36, 0x28, 0x33, 0xbb, 0x9b, 0x58, 0x69, 0x51, 0x3c, 0x2e, 0x3a, 0xf7, 0x5c, 0x92, 0xe2, 0xcf, 0x84, 0x5f, 0x80, 0xff, 0x74, 0x3a, + 0x36, 0x59, 0xb1, 0x25, 0x68, 0x96, 0xac, 0xb4, 0x1e, 0x53, 0x2f, 0x19, 0xd5, 0xc7, 0xe8, 0xbd, 0xb7, 0xd8, 0x33, 0xfd, 0x7a, 0xbe, 0x41, 0x7d, 0x31, 0x80, 0x75, 0x7f, 0xa0, 0xd9, 0xec, 0xe4, + 0x9f, 0xd0, 0xca, 0xd4, 0x85, 0x56, 0x65, 0x31, 0x5a, 0x1a, 0x56, 0x3b, 0x74, 0x9b, 0x09, 0xfc, 0x7a, 0xd7, 0x79, 0x48, 0xde, 0xe6, 0x48, 0xb4, 0x5e, 0xeb, 0xc6, 0x66, 0x7b, 0x6a, 0xe9, 0x7c, + 0xe7, 0x63, 0xc1, 0x91, 0x81, 0x46, 0x88, 0xa5, 0x97, 0x6f, 0x75, 0xba, 0xac, 0x70, 0xca, 0x17, 0x0c, 0x3e, 0x19, 0x99, 0x6f, 0x3c, 0xf1, 0x2e, 0x8f, 0xbe, 0xba, 0xde, 0x4f, 0x7c, 0xbb, 0xfc, + 0x91, 0x7b, 0x5e, 0x49, 0x5b, 0xce, 0x6f, 0x2b, 0xa6, 0x3f, 0x97, 0x66, 0xee, 0x1b, 0xed, 0x37, 0xd0, 0x3f, 0xae, 0x8c, 0x4d, 0x3a, 0x07, 0x56, 0xc7, 0x42, 0x13, 0x18, 0x52, 0x14, 0x57, 0x70, + 0x22, 0x4f, 0xcf, 0x1d, 0x8a, 0x79, 0x72, 0x96, 0xab, 0x75, 0xbf, 0xe6, 0x00, 0xf6, 0xb8, 0x5c, 0x1f, 0x93, 0x95, 0xcc, 0x73, 0x58, 0xc1, 0xf6, 0x67, 0x1f, 0xeb, 0x6a, 0xb0, 0x72, 0xcf, 0x71, + 0x0e, 0x3b, 0xb0, 0xb5, 0xda, 0xb7, 0xfb, 0xa1, 0xd5, 0xcf, 0x29, 0xb6, 0xe3, 0xfb, 0x83, 0x0f, 0x14, 0xbe, 0xc5, 0x87, 0x7a, 0xd8, 0x62, 0x3e, 0x7e, 0x63, 0xbb, 0x7a, 0x84, 0xf2, 0x23, 0x99, + 0xe7, 0xc9, 0x21, 0xf8, 0xfd, 0x0d, 0x1f, 0xb0, 0x7c, 0xbd, 0x3e, 0xb6, 0xe6, 0xb3, 0x65, 0xe6, 0xcb, 0x3a, 0x29, 0x25, 0x25, 0x59, 0xef, 0xe6, 0xc4, 0xc6, 0x3b, 0x1d, 0xb6, 0xe5, 0xd6, 0x59, + 0xe2, 0x4b, 0x90, 0xa7, 0xe7, 0x59, 0x1f, 0x9b, 0x43, 0x7e, 0x94, 0xd0, 0x9a, 0x6f, 0x77, 0x0c, 0xaf, 0xc3, 0x12, 0x46, 0xc1, 0xa9, 0x62, 0xa4, 0x6e, 0xbe, 0x24, 0x13, 0x81, 0x38, 0x41, 0x64, + 0x17, 0xa9, 0xad, 0x46, 0x88, 0x9e, 0x64, 0x4b, 0xc8, 0xca, 0xb1, 0x95, 0x0e, 0xd4, 0x37, 0xd8, 0x08, 0x5d, 0xfa, 0xed, 0xc8, 0xb9, 0x93, 0xd6, 0xf6, 0xa9, 0xe1, 0xf8, 0xf5, 0xf9, 0x87, 0xf0, + 0x3f, 0xa1, 0x65, 0xfe, 0x46, 0xfd, 0x0d, 0xfa, 0x4f, 0x97, 0xae, 0xa8, 0x8f, 0x50, 0x37, 0x17, 0x05, 0x70, 0x3a, 0x1d, 0xd4, 0x6a, 0xef, 0x09, 0x98, 0xb0, 0x34, 0x55, 0xd9, 0x9f, 0x2e, 0xc8, + 0x4e, 0x41, 0x67, 0x29, 0xcd, 0xd6, 0xf5, 0x82, 0x60, 0xf0, 0x60, 0x09, 0xe4, 0x60, 0x07, 0xe3, 0x01, 0x12, 0x24, 0x7e, 0x6f, 0x9d, 0x37, 0x66, 0x27, 0x43, 0xf4, 0xb2, 0x80, 0x94, 0x3c, 0x3a, + 0xf0, 0x72, 0x89, 0xf9, 0x58, 0x54, 0x2d, 0x39, 0x35, 0x3f, 0x3a, 0xe4, 0x69, 0x69, 0x45, 0x9a, 0xd2, 0xdf, 0x19, 0x93, 0xaf, 0xa9, 0x57, 0xef, 0xcb, 0x9c, 0x4f, 0x69, 0xc6, 0x2e, 0x24, 0x2f, + 0x4d, 0x7f, 0x39, 0x98, 0x60, 0xe3, 0x34, 0x61, 0xb2, 0x15, 0x58, 0x6b, 0x41, 0x09, 0x93, 0x62, 0x17, 0x2e, 0x08, 0x91, 0x57, 0x29, 0x34, 0xb7, 0x96, 0x5b, 0x62, 0xb3, 0x3c, 0x9f, 0x36, 0xbb, + 0xf0, 0x44, 0x20, 0x1a, 0x65, 0xe0, 0xb5, 0xc6, 0x9e, 0x1a, 0xba, 0xb7, 0x39, 0xe9, 0xd4, 0x4e, 0x97, 0xdb, 0x4d, 0xbe, 0xb4, 0xd7, 0x81, 0x03, 0x9f, 0x8e, 0x4a, 0x16, 0x05, 0x1c, 0xa4, 0x68, + 0x19, 0xc3, 0x7a, 0x05, 0x63, 0x4f, 0x05, 0x6d, 0x89, 0x1d, 0x95, 0x5b, 0xf5, 0x7a, 0x56, 0xf8, 0x49, 0xe5, 0x4e, 0x82, 0xc7, 0xde, 0x80, 0xcf, 0x24, 0x9d, 0xfb, 0x20, 0x7b, 0x69, 0xf7, 0xdb, + 0xc9, 0x45, 0x1d, 0xf1, 0x83, 0x71, 0x05, 0x9e, 0xcc, 0x04, 0xe3, 0x60, 0x22, 0x5a, 0x1a, 0x1d, 0x4f, 0xa2, 0x68, 0x4f, 0x4f, 0x2b, 0x56, 0x1b, 0xea, 0x85, 0x95, 0xb9, 0x7e, 0x3b, 0x42, 0xa8, + 0xa8, 0x8c, 0xaa, 0x2e, 0x9d, 0xc7, 0x8c, 0xf5, 0x29, 0x3e, 0xf2, 0x4a, 0xf4, 0xa5, 0x31, 0xaf, 0x87, 0x97, 0x9d, 0xe7, 0x08, 0x6e, 0xb1, 0x6f, 0x77, 0x53, 0x5a, 0x07, 0x49, 0xb1, 0xd8, 0x40, + 0x44, 0xa1, 0xf1, 0xab, 0x61, 0xb1, 0x8d, 0x8c, 0x05, 0x10, 0x91, 0xa8, 0xdf, 0x66, 0x43, 0x99, 0xef, 0x57, 0x8b, 0xb3, 0xb9, 0xe5, 0xcd, 0xa3, 0xc5, 0xb3, 0x84, 0x25, 0x18, 0x29, 0x85, 0x1c, + 0x0d, 0xc5, 0x71, 0x45, 0x55, 0x6a, 0x66, 0x88, 0x2b, 0x30, 0xd8, 0x34, 0xa8, 0xb5, 0xc3, 0x3c, 0xb1, 0x0f, 0xe4, 0x0e, 0x8c, 0x8f, 0x8c, 0x19, 0xda, 0xb7, 0x8a, 0xdd, 0xef, 0x8e, 0xdb, 0xf7, + 0xbb, 0xf2, 0xa9, 0x45, 0xe5, 0x0b, 0xe9, 0x0b, 0x02, 0x9f, 0x2f, 0x8c, 0x75, 0x87, 0xf0, 0xc2, 0xbd, 0x4a, 0xc9, 0xb0, 0x12, 0xac, 0x17, 0x36, 0xc5, 0x97, 0xec, 0x1a, 0xe9, 0x25, 0xb0, 0x55, + 0x94, 0xce, 0x48, 0xb3, 0x79, 0x39, 0x9d, 0xc9, 0xb0, 0xea, 0x86, 0x5b, 0x6a, 0x0a, 0x04, 0x10, 0x40, 0xe1, 0xeb, 0x29, 0x97, 0x65, 0x15, 0x4c, 0x58, 0x05, 0xac, 0x78, 0x67, 0x62, 0xb3, 0x32, + 0x4d, 0x2c, 0x0d, 0x65, 0x62, 0x9b, 0x47, 0xc4, 0x4c, 0x08, 0x80, 0xba, 0xce, 0xc0, 0x76, 0xe3, 0x8c, 0x30, 0x16, 0x7c, 0xb5, 0x48, 0xff, 0xf3, 0x1f, 0xfc, 0x37, 0x96, 0xc8, 0xab, 0xf7, 0xdf, + 0x65, 0x3f, 0xf4, 0x1b, 0x0e, 0xf0, 0xc4, 0x6c, 0xf8, 0x44, 0xf8, 0x1d, 0xc0, 0xeb, 0xe9, 0x85, 0x1b, 0x8c, 0x30, 0x37, 0xb6, 0x9b, 0x5e, 0xda, 0x4b, 0x59, 0xb0, 0x86, 0xca, 0x55, 0x46, 0x20, + 0xf3, 0xe2, 0xa0, 0xdb, 0x5c, 0x19, 0x6c, 0xd7, 0x4a, 0x69, 0x64, 0x78, 0xba, 0xdf, 0xf9, 0xde, 0xd2, 0xab, 0x09, 0x8e, 0x5c, 0x9f, 0x04, 0x90, 0x0e, 0x56, 0x33, 0x42, 0xee, 0x9d, 0x86, 0x07, + 0x2a, 0xb5, 0x16, 0xf2, 0x22, 0x39, 0x53, 0x01, 0x68, 0x75, 0x9b, 0xa3, 0xd2, 0x2b, 0x72, 0xdb, 0x1c, 0x8e, 0x85, 0xef, 0xeb, 0x03, 0xf8, 0x9c, 0x6f, 0xb2, 0x13, 0xa7, 0x81, 0xff, 0x69, 0x5f, + 0x49, 0xfd, 0xf9, 0xbe, 0xf2, 0xf3, 0x82, 0x75, 0x71, 0x63, 0x7e, 0xdd, 0xe8, 0x5f, 0xad, 0x39, 0x0f, 0xbc, 0x64, 0xaf, 0xb0, 0x7d, 0x72, 0x24, 0xae, 0x0a, 0xff, 0xd1, 0x16, 0x14, 0x7e, 0xca, + 0x81, 0xeb, 0xee, 0x1b, 0xde, 0x3b, 0xec, 0xdb, 0xf5, 0x8b, 0x45, 0x63, 0xc4, 0xba, 0x65, 0xe2, 0x7d, 0x61, 0x46, 0xe8, 0x4c, 0x5d, 0x05, 0x4b, 0xa3, 0xa6, 0xc5, 0x22, 0x24, 0x65, 0x68, 0xbf, + 0xd7, 0x2c, 0x59, 0xb3, 0x77, 0x58, 0xcb, 0x1d, 0x4e, 0x46, 0x9e, 0xce, 0xa4, 0x03, 0x0e, 0x31, 0xcc, 0x1c, 0xdd, 0xcc, 0x6a, 0x4d, 0x86, 0x8e, 0xda, 0x7e, 0x27, 0x2e, 0x18, 0x91, 0x34, 0x4e, + 0xe9, 0x6e, 0xab, 0x52, 0xe4, 0x72, 0x73, 0xf4, 0xec, 0xed, 0xfe, 0xb4, 0x12, 0xd1, 0xb3, 0x6f, 0x45, 0x9b, 0xe7, 0x7a, 0xee, 0x79, 0x0f, 0xe6, 0xf7, 0x42, 0xc1, 0xbf, 0x9d, 0x3a, 0xdf, 0x10, + 0x72, 0x1e, 0x5a, 0x56, 0x9e, 0xd4, 0x73, 0x3f, 0x78, 0xc9, 0xa3, 0x1e, 0x72, 0x12, 0x7b, 0xac, 0xfe, 0xbb, 0xa7, 0x3b, 0x26, 0x68, 0x61, 0x11, 0x41, 0xa7, 0x6d, 0x48, 0xcd, 0x9b, 0x63, 0x66, + 0xf5, 0x3c, 0xb2, 0x5b, 0x15, 0x70, 0x40, 0xb6, 0x6b, 0x94, 0x76, 0x81, 0x90, 0x88, 0x9a, 0x7d, 0x72, 0xd8, 0x0e, 0x40, 0x3c, 0xd0, 0x0c, 0x37, 0xd0, 0x3b, 0x4d, 0x74, 0x22, 0x36, 0xc4, 0x90, + 0x50, 0x18, 0x08, 0x20, 0x8f, 0xa8, 0x2e, 0x70, 0x37, 0x54, 0xaa, 0x0d, 0x3d, 0x1a, 0x4c, 0x45, 0x5c, 0x92, 0xf1, 0xe7, 0x6c, 0x2d, 0xb7, 0x2a, 0xf1, 0x2f, 0xfa, 0xee, 0xdf, 0xf5, 0xe1, 0xf8, + 0xae, 0x29, 0x2b, 0xe3, 0xb7, 0x99, 0xfa, 0xff, 0x52, 0xe7, 0x5c, 0x5e, 0xf3, 0xa8, 0x7b, 0x2e, 0x37, 0xc7, 0x76, 0x50, 0xe0, 0x11, 0x0e, 0x4d, 0x61, 0xc2, 0xcc, 0x6d, 0xba, 0x03, 0x0e, 0x55, + 0xb6, 0x86, 0x24, 0x7b, 0x3d, 0x49, 0x19, 0x1c, 0x8c, 0xf9, 0xc5, 0x46, 0xd8, 0xcf, 0x25, 0xb7, 0xa5, 0x2a, 0xbc, 0xef, 0xab, 0x30, 0x95, 0xcb, 0xf5, 0x7e, 0xd7, 0x35, 0x2b, 0x70, 0x8e, 0xd2, + 0x79, 0x0d, 0x97, 0x2c, 0x24, 0x54, 0xca, 0x0a, 0x15, 0x18, 0x48, 0x3d, 0x6f, 0x0e, 0xb1, 0xa5, 0xb4, 0x83, 0xdf, 0x6a, 0xb5, 0xfe, 0xdc, 0xde, 0xfb, 0xff, 0x17, 0x1d, 0x94, 0xfd, 0x4e, 0xd5, + 0x49, 0x3c, 0x29, 0xb3, 0xbc, 0x91, 0x7d, 0xed, 0x80, 0xeb, 0xc9, 0x84, 0x18, 0x27, 0xb7, 0x68, 0x28, 0x75, 0x12, 0x0f, 0x4b, 0x2b, 0x0f, 0x17, 0x05, 0x93, 0x2d, 0x12, 0x89, 0x6e, 0xea, 0x83, + 0x1a, 0xe7, 0x75, 0xdd, 0xe0, 0xa9, 0x2a, 0x6c, 0x32, 0xce, 0x39, 0x12, 0x06, 0x57, 0x14, 0x68, 0x8a, 0x72, 0x16, 0x3d, 0x8d, 0x4e, 0x06, 0xb1, 0x9e, 0xb9, 0xf2, 0x41, 0x60, 0x12, 0xb3, 0xe3, + 0x38, 0x7d, 0x01, 0x80, 0x50, 0x9a, 0xae, 0xc8, 0x4d, 0x21, 0xd6, 0xf2, 0x61, 0xa8, 0x64, 0xfb, 0xd9, 0x19, 0x71, 0xf9, 0xec, 0x8f, 0xf5, 0x06, 0xff, 0xfd, 0x12, 0xf1, 0x29, 0x26, 0xe6, 0x2f, + 0x2a, 0xcf, 0x3f, 0x11, 0x7e, 0x87, 0xf3, 0x35, 0x48, 0x67, 0xa4, 0x2a, 0x3d, 0x32, 0xd6, 0x47, 0x03, 0x5d, 0x9b, 0xc0, 0x49, 0xca, 0x0c, 0x86, 0x60, 0x4b, 0x67, 0xe9, 0x2d, 0x48, 0x5b, 0x3d, + 0xe5, 0xcb, 0xa3, 0xbb, 0x16, 0x99, 0x3d, 0x6b, 0xcc, 0x4d, 0xdf, 0x06, 0xed, 0x42, 0xf0, 0xce, 0x7e, 0x75, 0xd6, 0xc2, 0x1a, 0x8c, 0x9c, 0x6a, 0x2b, 0xe7, 0x82, 0xba, 0x48, 0x95, 0x13, 0x34, + 0xac, 0x56, 0xb2, 0x19, 0x64, 0xf6, 0x12, 0xa9, 0x80, 0x4a, 0x0b, 0x30, 0x53, 0xda, 0xee, 0x9f, 0xd3, 0x1d, 0xc7, 0x7e, 0xf2, 0x39, 0x70, 0xe8, 0x77, 0x1a, 0xcb, 0x3a, 0x73, 0x0a, 0xe3, 0xfc, + 0x18, 0x4e, 0xea, 0xb9, 0xed, 0xc1, 0x3b, 0xd9, 0x17, 0x30, 0xdf, 0x4f, 0x2e, 0x39, 0xf0, 0x46, 0x08, 0x43, 0xe9, 0x8c, 0x01, 0x8c, 0x5d, 0xc9, 0x04, 0xc3, 0x10, 0xc4, 0x02, 0x3e, 0x15, 0xc4, + 0x99, 0xb8, 0x38, 0x00, 0x3a, 0xb9, 0x14, 0x87, 0xa8, 0x03, 0x58, 0xa9, 0x00, 0x8d, 0x65, 0xbb, 0x85, 0xa8, 0x70, 0x05, 0xec, 0x11, 0xec, 0x5c, 0xb2, 0xf1, 0xf4, 0x00, 0xf3, 0x5b, 0x77, 0x30, + 0x60, 0x77, 0x03, 0x88, 0xc0, 0x61, 0x13, 0x1d, 0xa7, 0xe9, 0x4e, 0xcf, 0x84, 0x26, 0x4d, 0xe7, 0x60, 0xb6, 0x17, 0xe0, 0xe5, 0x73, 0x63, 0xd3, 0x4a, 0xe3, 0x2c, 0x4d, 0x5e, 0xbe, 0xdd, 0x89, + 0xfd, 0xaa, 0xfa, 0x12, 0x34, 0xf9, 0xbf, 0x3f, 0x3f, 0x96, 0x86, 0xbe, 0x13, 0x18, 0xd7, 0xdb, 0xc8, 0xf7, 0x15, 0xd7, 0x76, 0xcc, 0xfa, 0x2d, 0xcc, 0x0b, 0xfd, 0x5a, 0x73, 0xf1, 0x92, 0x3e, + 0xfe, 0xd5, 0x53, 0xed, 0x6b, 0x6d, 0x97, 0x6f, 0x75, 0x6f, 0xdc, 0xb4, 0x88, 0x3f, 0x42, 0xcb, 0x6f, 0xcc, 0x01, 0x2f, 0xb7, 0xfd, 0x4b, 0x20, 0xec, 0x3f, 0x6f, 0xc6, 0x80, 0x2f, 0xff, 0x1e, + 0x3b, 0x95, 0x97, 0xda, 0x1f, 0xcc, 0xea, 0x0b, 0x4f, 0x8b, 0xfd, 0x6b, 0x86, 0x03, 0xe4, 0x5b, 0x10, 0xf8, 0x35, 0x25, 0xee, 0x8b, 0xd4, 0x06, 0x7f, 0xd7, 0x43, 0x7c, 0x4d, 0xb2, 0x45, 0xfd, + 0x89, 0x39, 0xf6, 0x0d, 0x8d, 0x8f, 0x4b, 0xdf, 0x85, 0x70, 0xf4, 0xc9, 0xfc, 0x2e, 0x17, 0xca, 0xe0, 0xe4, 0xfa, 0x3b, 0xb9, 0xd0, 0x19, 0x67, 0x71, 0x15, 0xf7, 0xca, 0x62, 0x59, 0x1f, 0x64, + 0xd4, 0x61, 0x2b, 0x69, 0x2d, 0x36, 0xc9, 0x4e, 0x23, 0xd7, 0x56, 0xe8, 0x54, 0x70, 0x00, 0x55, 0xb8, 0x50, 0x0b, 0xe5, 0x62, 0x10, 0xc5, 0xa1, 0x74, 0x42, 0x16, 0x47, 0xf4, 0x88, 0xca, 0x65, + 0x77, 0xb1, 0x12, 0xe7, 0x7e, 0xd9, 0xaa, 0xf9, 0xaa, 0x59, 0x2a, 0xdc, 0x69, 0x29, 0x9c, 0x55, 0x80, 0xe4, 0xc0, 0x86, 0xd9, 0xed, 0x3c, 0xc7, 0x6b, 0x3b, 0x37, 0xbc, 0x49, 0x82, 0xf6, 0xc7, + 0x29, 0x09, 0xe2, 0xf2, 0x9f, 0x77, 0x0f, 0xc0, 0x4f, 0x77, 0xee, 0xc7, 0xa6, 0xc7, 0xdf, 0x09, 0x3c, 0xf6, 0x22, 0xfc, 0xf5, 0x07, 0x98, 0xc6, 0x2f, 0xbb, 0xe2, 0xb8, 0xbc, 0xe3, 0x35, 0xf8, + 0xeb, 0x11, 0x9a, 0x25, 0x17, 0x8a, 0x1d, 0x70, 0x0a, 0xb6, 0x55, 0x3c, 0x25, 0xb6, 0x2a, 0x42, 0xa6, 0x53, 0x6c, 0x31, 0x5b, 0xcc, 0xf9, 0x05, 0xa3, 0xeb, 0xd8, 0x01, 0x53, 0x73, 0x87, 0x13, + 0x54, 0xa6, 0x21, 0xa8, 0xea, 0x08, 0x04, 0x26, 0xda, 0x84, 0xe0, 0xbe, 0x37, 0x36, 0x8a, 0x08, 0x89, 0xc7, 0x4d, 0xaf, 0x54, 0x31, 0x7f, 0xd8, 0x42, 0x26, 0x60, 0xd8, 0xf2, 0x71, 0xde, 0x98, + 0x25, 0x2c, 0xce, 0x8d, 0xe5, 0xb8, 0x8c, 0x42, 0xff, 0xeb, 0xf3, 0xef, 0x17, 0x26, 0x57, 0x7d, 0x4d, 0x81, 0xf0, 0x75, 0xfd, 0x45, 0x9f, 0x59, 0x7f, 0xdf, 0xa8, 0xbe, 0xb1, 0xb8, 0x97, 0xe3, + 0x09, 0x71, 0x93, 0x77, 0xe9, 0xfe, 0x6e, 0x79, 0x9f, 0x7a, 0x3b, 0x67, 0xe5, 0x86, 0xa0, 0x35, 0xc5, 0x28, 0xa6, 0xcb, 0x0c, 0xb0, 0xc5, 0x28, 0x2f, 0xac, 0x44, 0x42, 0x37, 0xf6, 0xb9, 0x6a, + 0x42, 0xd2, 0x09, 0x2f, 0xf8, 0x46, 0x81, 0x18, 0x32, 0x33, 0xf6, 0xe5, 0x4c, 0x46, 0x25, 0x7c, 0xe8, 0xed, 0x41, 0x2b, 0xca, 0x48, 0x58, 0x57, 0x01, 0x78, 0xb6, 0x31, 0x2a, 0xef, 0x70, 0x0c, + 0x0a, 0x36, 0x95, 0x55, 0x12, 0x0d, 0x07, 0xbb, 0x4f, 0x2e, 0x16, 0xbf, 0x63, 0x0c, 0x5f, 0xd6, 0x87, 0xeb, 0x56, 0xf0, 0x91, 0x94, 0x73, 0x35, 0xb6, 0x94, 0x13, 0x2b, 0x8d, 0x1e, 0x56, 0xdf, + 0x27, 0x9f, 0x53, 0xb0, 0x7d, 0x21, 0x7d, 0x85, 0xfb, 0xd3, 0x85, 0x09, 0x39, 0x4e, 0xe1, 0x96, 0x67, 0xcc, 0xb4, 0xd9, 0x47, 0x74, 0x59, 0xd5, 0xc2, 0xb2, 0x71, 0x36, 0x65, 0x42, 0x2e, 0x13, + 0x6b, 0xbd, 0x6f, 0x1a, 0x1c, 0x82, 0xf3, 0x95, 0x61, 0x6d, 0x06, 0x29, 0x12, 0x40, 0x80, 0x6f, 0x3b, 0x8b, 0x06, 0xa0, 0x1c, 0x69, 0xf9, 0xbe, 0xc1, 0x58, 0xb7, 0xa9, 0x28, 0x08, 0x64, 0xc5, + 0x04, 0xc9, 0x72, 0x61, 0x56, 0xae, 0x6d, 0xd6, 0x4f, 0xcf, 0x2a, 0xb7, 0xa7, 0x01, 0xa1, 0x69, 0xf7, 0xcf, 0x89, 0x98, 0x9e, 0x51, 0x4e, 0xdc, 0xc8, 0xf8, 0x1c, 0xf9, 0xfb, 0x7b, 0x50, 0xbd, + 0x3e, 0x73, 0x8a, 0xc8, 0x4f, 0xc2, 0xbf, 0x6c, 0x50, 0xb8, 0xa5, 0xff, 0x19, 0xde, 0x8f, 0xab, 0x63, 0x0d, 0x0b, 0xfb, 0xac, 0x9c, 0xea, 0x51, 0xa6, 0x58, 0x6c, 0x2b, 0x88, 0xd2, 0x14, 0x41, + 0x0c, 0x66, 0x89, 0xad, 0xa1, 0x8a, 0xe4, 0xa9, 0x75, 0x3c, 0x6d, 0x4a, 0xa6, 0x73, 0x85, 0xc3, 0xbc, 0x8d, 0x49, 0x4b, 0x2a, 0x51, 0xbe, 0xf4, 0x76, 0x28, 0x21, 0x19, 0xc7, 0xb0, 0xb5, 0x49, + 0x88, 0x4d, 0x66, 0x82, 0xca, 0x2a, 0x5c, 0x59, 0xb6, 0x88, 0x23, 0xa7, 0x16, 0xc5, 0x18, 0x7b, 0xe5, 0x08, 0xa9, 0x75, 0xf2, 0xdc, 0xca, 0x7d, 0x07, 0xe3, 0xaf, 0x03, 0xfb, 0xeb, 0x70, 0x7d, + 0xcb, 0xee, 0x73, 0xb7, 0x1f, 0xaa, 0xd7, 0x75, 0xf5, 0x3e, 0xf7, 0x20, 0x9f, 0xe0, 0x1e, 0x17, 0x8a, 0xe0, 0xe4, 0xfa, 0x3b, 0xb9, 0xd0, 0xf8, 0x19, 0x5d, 0x9d, 0xab, 0x63, 0x8c, 0xd4, 0x7c, + 0x62, 0x23, 0x08, 0x0b, 0x76, 0x4e, 0xc5, 0x08, 0x82, 0x56, 0x36, 0x8e, 0x1a, 0x95, 0x87, 0x38, 0xc9, 0xd2, 0xd2, 0xf8, 0xb3, 0xc0, 0x04, 0x5c, 0x81, 0x27, 0xe7, 0x9a, 0x32, 0xed, 0xd5, 0x74, + 0x2f, 0x85, 0x44, 0xbc, 0x03, 0xdb, 0xfd, 0xb6, 0xc1, 0xfa, 0xed, 0xde, 0x5a, 0x26, 0xcc, 0x21, 0x59, 0x9a, 0xcc, 0xdc, 0x33, 0xb0, 0x32, 0x35, 0xa5, 0x0e, 0xef, 0x1f, 0x15, 0x2d, 0xfc, 0x01, + 0x5d, 0x23, 0x68, 0xde, 0x39, 0xc2, 0x17, 0x39, 0x23, 0x4a, 0x6d, 0xa3, 0xf4, 0xfe, 0xb5, 0xa2, 0x34, 0x71, 0xec, 0x37, 0x9b, 0x39, 0xf6, 0x2d, 0x11, 0xce, 0xdb, 0x53, 0x55, 0x51, 0x27, 0xaf, + 0xb5, 0xf3, 0x5f, 0x1e, 0xc2, 0xbe, 0x31, 0x9f, 0xcf, 0x3e, 0x22, 0x0f, 0x22, 0xe4, 0x3f, 0xe9, 0xf3, 0x5e, 0x9e, 0xf8, 0x5e, 0x3a, 0xef, 0x56, 0xf9, 0xf4, 0x47, 0x8e, 0x63, 0xd7, 0x56, 0x3e, + 0x5a, 0x53, 0xa9, 0x9b, 0x74, 0x40, 0x63, 0x7b, 0xdf, 0x08, 0x1a, 0x70, 0xf2, 0xf2, 0x77, 0x72, 0xa1, 0x31, 0x6e, 0x55, 0x25, 0x25, 0x16, 0x89, 0x08, 0x60, 0x33, 0x3b, 0xf0, 0xad, 0x0b, 0x90, + 0xdb, 0x5a, 0x4b, 0x2d, 0x53, 0x69, 0xf6, 0xa2, 0x2d, 0xd4, 0x04, 0x0a, 0x56, 0xc5, 0xde, 0x39, 0xf2, 0x35, 0xb2, 0x59, 0xb4, 0xe1, 0xd9, 0xaa, 0x92, 0xda, 0x84, 0x8d, 0x3a, 0x5d, 0x00, 0x1a, + 0xac, 0x68, 0x56, 0x0c, 0xd1, 0xcc, 0x71, 0x4b, 0xe6, 0x75, 0x5d, 0x5a, 0xc5, 0x90, 0xc7, 0xd3, 0x83, 0xc1, 0x2f, 0x19, 0xf0, 0xab, 0x5d, 0xea, 0xd7, 0xfd, 0x11, 0xf0, 0xeb, 0xe1, 0x28, 0xb8, + 0xdc, 0xb9, 0xd6, 0x3f, 0x72, 0x9c, 0x6c, 0xe2, 0xe4, 0xb5, 0x71, 0x2d, 0x20, 0xf0, 0xbd, 0x68, 0xe3, 0xe5, 0xc1, 0x8b, 0xc3, 0x7d, 0x69, 0x79, 0x4e, 0x6c, 0x4c, 0xaa, 0xc2, 0x78, 0x01, 0xf2, + 0x23, 0xb0, 0x17, 0xfa, 0xfe, 0xf4, 0xfd, 0x68, 0xf1, 0xab, 0x60, 0x8b, 0x7c, 0x7f, 0xb8, 0x2e, 0xfc, 0xab, 0x85, 0xe3, 0x3a, 0x06, 0x46, 0x08, 0x4b, 0x0f, 0x3e, 0xe6, 0x51, 0x57, 0xdf, 0x7e, + 0xe2, 0xd8, 0xae, 0xbe, 0xf7, 0xa2, 0xb7, 0xec, 0x8d, 0xdf, 0x2e, 0xdf, 0x29, 0x7e, 0xf5, 0xeb, 0xd1, 0x60, 0xd8, 0x6d, 0x29, 0x50, 0xa4, 0x13, 0x54, 0x0d, 0x54, 0x6f, 0xa5, 0x27, 0x70, 0xc4, + 0x7b, 0xe1, 0xc2, 0x98, 0x32, 0x47, 0x41, 0xde, 0x4b, 0x6a, 0xa0, 0x78, 0x27, 0x6c, 0x36, 0x05, 0xf7, 0x89, 0xd0, 0x50, 0x5d, 0x73, 0xce, 0xab, 0x3c, 0x9b, 0xaa, 0xf4, 0x4a, 0xc0, 0xe2, 0xbd, + 0xd4, 0x1d, 0x3a, 0x78, 0x1f, 0xa5, 0x58, 0x95, 0x0f, 0x4e, 0x6e, 0x42, 0xa5, 0x10, 0x15, 0xb5, 0x21, 0xf4, 0xa8, 0x5d, 0x3f, 0x9f, 0xf2, 0xa7, 0x32, 0x7e, 0x53, 0xe8, 0x16, 0x46, 0x9f, 0xd8, + 0x42, 0xbe, 0x50, 0xbc, 0xf0, 0xc7, 0x4b, 0x7d, 0xdb, 0x17, 0x12, 0x3f, 0xf3, 0x47, 0x08, 0xd4, 0x10, 0x48, 0x6c, 0xf7, 0x2b, 0x39, 0x94, 0xac, 0x23, 0x73, 0xf0, 0xb1, 0xe9, 0xf4, 0x50, 0x02, + 0xc2, 0x74, 0xa7, 0xeb, 0x6d, 0x2e, 0x6e, 0x0c, 0x3f, 0xe3, 0x98, 0x79, 0x9b, 0xc1, 0x90, 0x2d, 0x6d, 0xfd, 0xec, 0xd4, 0x1c, 0xf4, 0x56, 0x96, 0x19, 0x1f, 0x82, 0x35, 0x50, 0x08, 0xa3, 0x15, + 0xd7, 0x2f, 0x37, 0x0b, 0x6f, 0x65, 0x05, 0xa9, 0x15, 0x02, 0xec, 0x26, 0x99, 0xb9, 0xfc, 0x74, 0xf1, 0xdc, 0x0a, 0xff, 0x75, 0x42, 0xfc, 0x07, 0xfe, 0xbe, 0x9b, 0xbb, 0x6a, 0x91, 0xec, 0xd7, + 0x9b, 0xdf, 0x18, 0x9b, 0x9d, 0x56, 0xfe, 0x39, 0x49, 0xaf, 0x05, 0x41, 0xff, 0x03, 0x7d, 0x17, 0xca, 0xdc, 0xb4, 0x98, 0x38, 0xc6, 0x35, 0xf7, 0xcc, 0x7f, 0x5e, 0x36, 0xd4, 0x5f, 0xf6, 0x9a, + 0x6e, 0x9d, 0x58, 0x95, 0x9f, 0x26, 0xef, 0x2a, 0xac, 0xdb, 0x97, 0xbf, 0xc5, 0x4f, 0xfe, 0x87, 0xbc, 0x24, 0x93, 0xfb, 0x74, 0xc7, 0x33, 0xca, 0xf7, 0x4f, 0xfa, 0x42, 0xd5, 0x4f, 0x3c, 0xa7, + 0xf0, 0xaf, 0x69, 0x87, 0xfe, 0x83, 0x7c, 0xd1, 0x20, 0x5e, 0x2d, 0x02, 0xef, 0xfa, 0x9b, 0xcb, 0xff, 0x7e, 0xce, 0x68, 0xf8, 0x4f, 0xec, 0x27, 0x7e, 0xec, 0x5f, 0x93, 0x99, 0xfd, 0xe7, 0x65, + 0x13, 0xf1, 0xe5, 0xee, 0xad, 0x83, 0xef, 0x7f, 0xe0, 0x2f, 0xb1, 0x3e, 0x1f, 0x63, 0xe6, 0xad, 0x35, 0xb7, 0x77, 0x5f, 0x03, 0xdd, 0x5f, 0xe0, 0xb8, 0xbb, 0x48, 0xdc, 0x5a, 0x15, 0xae, 0x5f, + 0xf2, 0x05, 0x96, 0xef, 0x61, 0xe5, 0xd4, 0x03, 0x61, 0xe0, 0xbd, 0x52, 0xd3, 0xbd, 0xe1, 0x0e, 0x3d, 0x15, 0xae, 0xf5, 0x4a, 0xf3, 0x65, 0xc0, 0x5f, 0x8f, 0x26, 0xd0, 0xb8, 0x20, 0x2d, 0x80, + 0x83, 0x78, 0xfe, 0x1c, 0x04, 0x29, 0x3d, 0xd3, 0x55, 0x64, 0xeb, 0xda, 0x8d, 0xe8, 0x2e, 0x81, 0xed, 0x86, 0x67, 0x8a, 0x2e, 0x52, 0x0f, 0x9a, 0x63, 0xe1, 0xac, 0x21, 0x6a, 0x22, 0xec, 0x3a, + 0xc4, 0xaa, 0xf7, 0x5c, 0x08, 0x74, 0x0f, 0xf1, 0x1a, 0x32, 0x17, 0xbe, 0x0e, 0x2f, 0xa8, 0xd9, 0x91, 0xb0, 0x38, 0x35, 0x42, 0xf8, 0x2c, 0xaa, 0xa4, 0xac, 0x1a, 0x02, 0x75, 0xa3, 0xcc, 0xc3, + 0xcd, 0x08, 0xb3, 0x9b, 0xe9, 0x27, 0x55, 0xe1, 0x5c, 0x95, 0x9f, 0x57, 0x15, 0xe9, 0x7d, 0xac, 0x9c, 0xae, 0x9a, 0xfc, 0x4e, 0x7a, 0x7a, 0x2e, 0xf9, 0xd1, 0x07, 0xd9, 0x17, 0xc4, 0xde, 0x4f, + 0xc6, 0x24, 0x3e, 0x82, 0x27, 0x2e, 0x4c, 0xa6, 0x2b, 0x82, 0x98, 0xca, 0x67, 0x77, 0xca, 0x34, 0xbc, 0x7b, 0x48, 0x8f, 0xa5, 0x48, 0x01, 0x91, 0xc5, 0x4b, 0x3f, 0x9b, 0x9f, 0xbf, 0x57, 0xd0, + 0xfd, 0x7b, 0xb2, 0xf8, 0x17, 0xca, 0x2f, 0xcd, 0xfa, 0x7c, 0x3e, 0x56, 0xfe, 0x0e, 0x0d, 0x36, 0x8f, 0x61, 0x76, 0x7e, 0xa4, 0xb3, 0x0c, 0xdd, 0xa9, 0xed, 0x9e, 0x42, 0x29, 0x44, 0x59, 0x9a, + 0x49, 0xa6, 0x26, 0xfb, 0x70, 0x47, 0x77, 0xdc, 0x8e, 0xb6, 0xa5, 0x0a, 0x9d, 0x21, 0x80, 0x1d, 0xab, 0xbe, 0x42, 0xa9, 0xf0, 0x41, 0x68, 0xe3, 0x85, 0xd0, 0x4d, 0xe7, 0xc5, 0x5c, 0xc2, 0x48, + 0xc1, 0xf4, 0x74, 0x9a, 0x58, 0x13, 0xbd, 0xa7, 0xef, 0xd4, 0xba, 0x67, 0x04, 0x9e, 0x1c, 0x33, 0x1c, 0x1e, 0x54, 0x31, 0xbe, 0x3f, 0x26, 0xde, 0xa7, 0xd9, 0x23, 0xf0, 0xfe, 0xbc, 0xd4, 0xd6, + 0x2b, 0xcd, 0x2b, 0x6c, 0x2f, 0x47, 0x17, 0xc0, 0x7e, 0x28, 0xb1, 0x05, 0x4f, 0x58, 0xfb, 0xb8, 0x06, 0x89, 0x9c, 0xda, 0xa9, 0xd1, 0xb9, 0x34, 0xad, 0x70, 0x7e, 0x82, 0x01, 0x36, 0x35, 0x7c, + 0xcc, 0x95, 0x47, 0x0c, 0x05, 0x3f, 0xe9, 0x7f, 0x53, 0xcb, 0x06, 0x86, 0x9f, 0x52, 0xeb, 0xbf, 0x51, 0x7d, 0x69, 0xca, 0xeb, 0xe1, 0xe4, 0x4a, 0xea, 0xe7, 0xde, 0xf7, 0x77, 0xe7, 0x45, 0x7d, + 0x3e, 0xd5, 0xd2, 0x79, 0xb6, 0x29, 0x72, 0x47, 0x00, 0xe3, 0xcc, 0x3f, 0x1e, 0xcf, 0xf1, 0xac, 0x3c, 0x8a, 0x90, 0xc2, 0x13, 0xbd, 0x53, 0xf3, 0x2e, 0x5f, 0x82, 0x4c, 0xe5, 0x42, 0xd9, 0x0a, + 0xf4, 0x3b, 0x2e, 0x5f, 0xed, 0x63, 0xaa, 0x64, 0x99, 0x76, 0x6b, 0xa9, 0x9c, 0x43, 0x2b, 0x4a, 0x53, 0x21, 0x25, 0xa7, 0xae, 0xf0, 0x78, 0x97, 0xeb, 0xe6, 0xc9, 0x88, 0xe2, 0xf5, 0x8d, 0x4b, + 0x49, 0x95, 0xbe, 0x06, 0xe4, 0x14, 0x46, 0x72, 0x7e, 0x34, 0xaf, 0xf1, 0xe7, 0x1a, 0xff, 0x85, 0xf4, 0x0b, 0x04, 0x5f, 0x2e, 0x5c, 0xca, 0x1a, 0x8c, 0xc0, 0x81, 0xc0, 0x45, 0xd2, 0x1f, 0x08, + 0x15, 0xef, 0xe7, 0x05, 0x6c, 0xb5, 0xd6, 0xb9, 0x91, 0x3a, 0xd3, 0x5c, 0xb5, 0xa4, 0x1c, 0xa2, 0x67, 0xa1, 0xc7, 0xed, 0x95, 0x5d, 0xe9, 0x58, 0xc1, 0x36, 0x0e, 0x9f, 0xff, 0x7f, 0x59, 0xbb, + 0xb2, 0x25, 0x45, 0x9d, 0xa5, 0x7f, 0xff, 0x7f, 0x8c, 0xb9, 0x25, 0x1c, 0x40, 0x90, 0xe5, 0xbb, 0xfa, 0xd8, 0x55, 0x10, 0x05, 0x45, 0xc0, 0x8b, 0x13, 0xc1, 0x26, 0xfb, 0x22, 0x8b, 0x2c, 0x11, + 0xe7, 0xdd, 0x4f, 0x88, 0xdd, 0x3d, 0xbd, 0x68, 0xb7, 0xe3, 0x39, 0x17, 0x13, 0x16, 0x50, 0x93, 0x34, 0x99, 0x55, 0x95, 0x59, 0xb9, 0xfc, 0x2a, 0x28, 0xdd, 0xe5, 0x06, 0x90, 0x42, 0x70, 0xde, + 0x61, 0x75, 0x2f, 0x42, 0x32, 0x67, 0x03, 0x53, 0x81, 0xe9, 0x33, 0x8f, 0x59, 0x2d, 0x43, 0xe1, 0x54, 0x52, 0x2c, 0xb3, 0x95, 0x63, 0xa2, 0x7a, 0xce, 0xbb, 0x12, 0x56, 0x93, 0xac, 0x49, 0x6d, + 0xef, 0xe7, 0x2d, 0x66, 0x1e, 0xba, 0x5e, 0xf6, 0x6d, 0xc5, 0xc5, 0x93, 0x03, 0xea, 0x1d, 0xe1, 0x91, 0xa3, 0x7f, 0x2e, 0x27, 0x0f, 0x8e, 0xab, 0x7c, 0x56, 0x6d, 0x37, 0x22, 0x17, 0xfb, 0x20, + 0xbb, 0x50, 0xe4, 0x74, 0x8e, 0x22, 0x7b, 0x08, 0x6c, 0xbc, 0x52, 0x2a, 0x8b, 0x61, 0xef, 0xb9, 0xb1, 0x16, 0x10, 0xb5, 0x20, 0x9f, 0x2d, 0xcf, 0x28, 0x8e, 0x45, 0xd3, 0x46, 0xa2, 0x97, 0x25, + 0xdb, 0xbc, 0x03, 0xa7, 0x6b, 0x90, 0xde, 0x25, 0x07, 0xad, 0xe6, 0x3c, 0x60, 0x29, 0xe0, 0xd5, 0xcc, 0x0c, 0xb8, 0x01, 0x83, 0x88, 0x4d, 0x42, 0xcd, 0xd5, 0x2f, 0xa9, 0x59, 0x75, 0xde, 0x38, + 0xf7, 0x4b, 0x22, 0x9e, 0xc1, 0xc8, 0x1a, 0x29, 0x8e, 0xdf, 0xdc, 0x38, 0xc1, 0xa3, 0xf8, 0x58, 0x3a, 0xdd, 0x11, 0x5a, 0x3f, 0xdb, 0x49, 0xf5, 0x7a, 0xab, 0xd6, 0x8b, 0x13, 0xb0, 0x82, 0x10, + 0xb0, 0x12, 0xd9, 0xd2, 0x60, 0xa4, 0x79, 0xd7, 0xb2, 0xce, 0xa9, 0xd9, 0x6e, 0xa6, 0x0e, 0x8a, 0x48, 0x1e, 0x84, 0x80, 0x64, 0xe5, 0x95, 0x91, 0x42, 0x2f, 0x86, 0x3a, 0x52, 0x07, 0x8c, 0x8f, + 0x97, 0xde, 0x40, 0xb2, 0x60, 0x90, 0x78, 0x3d, 0x65, 0xec, 0x68, 0x41, 0x6a, 0xdb, 0x83, 0xd6, 0x92, 0xc9, 0x73, 0x2e, 0x8c, 0x2c, 0x2f, 0x5e, 0x0d, 0x22, 0xe8, 0x37, 0x7c, 0x6f, 0xe0, 0x94, + 0x61, 0x3a, 0xc9, 0xbc, 0x76, 0x84, 0x0b, 0xbe, 0xcb, 0xbe, 0xa7, 0x46, 0xce, 0x7b, 0xca, 0x17, 0x36, 0xbe, 0xbf, 0x7e, 0x38, 0x9b, 0x12, 0xde, 0xec, 0x2a, 0x0a, 0xa9, 0xcd, 0x72, 0x51, 0x49, + 0x42, 0xbc, 0x8c, 0x87, 0x39, 0x0f, 0xb4, 0x24, 0x3f, 0xe5, 0xfa, 0xee, 0x68, 0x08, 0x39, 0xaa, 0xf5, 0x4b, 0x07, 0x2d, 0x78, 0x09, 0x00, 0xf8, 0x55, 0x94, 0x9d, 0xa0, 0xf9, 0x72, 0x8b, 0x91, + 0x3b, 0x64, 0x85, 0xbb, 0x20, 0xe8, 0x8b, 0x25, 0x2f, 0xb6, 0x3d, 0x3a, 0x25, 0xed, 0xbc, 0xd9, 0x78, 0x95, 0x73, 0xb1, 0x15, 0x35, 0xe0, 0x5e, 0x60, 0xf7, 0x23, 0x5f, 0xaa, 0x49, 0x76, 0xff, + 0x08, 0x43, 0xf2, 0xa9, 0x94, 0xe7, 0x17, 0x9a, 0x17, 0x5e, 0x5c, 0x5b, 0x13, 0xf2, 0xb1, 0x44, 0xe7, 0x60, 0x93, 0xd4, 0xf8, 0x81, 0x62, 0x38, 0x55, 0x11, 0x8e, 0x10, 0xb2, 0x9a, 0xce, 0x90, + 0xbe, 0x96, 0x4c, 0xc4, 0x9d, 0xdb, 0x82, 0x2c, 0x94, 0xd4, 0x89, 0x3c, 0x2d, 0xe6, 0xba, 0x66, 0x92, 0xc6, 0xdc, 0x4c, 0xe0, 0x01, 0x6f, 0xcd, 0xcc, 0xdf, 0x96, 0xc8, 0x5a, 0x99, 0x75, 0x69, + 0x13, 0x12, 0xf9, 0x94, 0xb2, 0xba, 0x6a, 0x2d, 0x77, 0x8b, 0x21, 0xb2, 0x8e, 0x92, 0x16, 0xea, 0x74, 0x0e, 0xf3, 0x4f, 0x7a, 0x6e, 0xca, 0x57, 0x97, 0xd8, 0xa7, 0x90, 0x8e, 0x53, 0x7a, 0x56, + 0xed, 0x7d, 0xd0, 0xe2, 0xf0, 0xe7, 0x3e, 0x6f, 0xe7, 0x1c, 0xa3, 0x5f, 0xe2, 0x4b, 0x56, 0xec, 0x5d, 0x21, 0xad, 0xdf, 0xfe, 0xe7, 0x87, 0xe7, 0x37, 0x8b, 0x01, 0x2e, 0x76, 0xc2, 0xec, 0x37, + 0x8c, 0xbf, 0xef, 0xd8, 0xbf, 0x4d, 0xf8, 0x3b, 0x41, 0xe0, 0xba, 0xba, 0x97, 0x76, 0x02, 0xfd, 0x9e, 0xa2, 0x4f, 0x49, 0xd5, 0x1d, 0x25, 0xea, 0x4e, 0xae, 0x04, 0x7e, 0x16, 0x67, 0xc5, 0x02, + 0x15, 0x01, 0x83, 0x53, 0x6b, 0x85, 0xaa, 0x6a, 0x10, 0xa6, 0x0c, 0x5b, 0xd7, 0x2e, 0xda, 0x15, 0xb4, 0x6c, 0x6b, 0xbc, 0x9e, 0xe5, 0xab, 0xed, 0x3c, 0x06, 0x73, 0x22, 0x66, 0x08, 0x2e, 0x9e, + 0x22, 0x51, 0x12, 0x79, 0xaa, 0xac, 0x47, 0x55, 0xc7, 0x2f, 0xd3, 0x75, 0x6a, 0x4a, 0x8d, 0xb4, 0x93, 0xc9, 0xaa, 0x55, 0x6b, 0xd8, 0xc6, 0x42, 0xe3, 0xa8, 0x19, 0x3b, 0x67, 0x17, 0x3e, 0x89, + 0x85, 0xf3, 0xff, 0x97, 0xbf, 0x7e, 0x44, 0xae, 0x76, 0xca, 0xf0, 0x65, 0xb9, 0x40, 0x7f, 0x13, 0x9f, 0x33, 0x7e, 0x92, 0x30, 0xab, 0x5f, 0x0e, 0x07, 0xac, 0xbd, 0x72, 0x32, 0x1e, 0xbf, 0xdd, + 0xdf, 0x1e, 0x07, 0x97, 0xdd, 0xa1, 0x7d, 0x7d, 0xf6, 0xc9, 0x86, 0x19, 0xa3, 0x05, 0x79, 0x3b, 0x3e, 0x22, 0x3f, 0x6f, 0xb4, 0x46, 0xb4, 0x36, 0xaf, 0x0b, 0xab, 0xba, 0xfa, 0x75, 0xd3, 0x5d, + 0xf7, 0xf1, 0x58, 0x98, 0xef, 0x95, 0x61, 0x95, 0x84, 0xf6, 0x5d, 0x2d, 0x08, 0x3f, 0x27, 0xe4, 0x24, 0xb4, 0x47, 0x31, 0x27, 0xa1, 0x3d, 0xb9, 0x12, 0xf9, 0x59, 0xd0, 0x46, 0x16, 0x22, 0x33, + 0x59, 0x1c, 0x22, 0x7f, 0x55, 0xb6, 0xde, 0xb9, 0xaf, 0xe6, 0x3b, 0x86, 0x2a, 0x6b, 0x89, 0x2d, 0x36, 0xe7, 0xde, 0x23, 0x86, 0x3d, 0x08, 0x71, 0x28, 0xd7, 0x9b, 0x19, 0x8a, 0x6c, 0x70, 0x10, + 0x3f, 0x9d, 0x95, 0x76, 0x13, 0x90, 0xb4, 0x10, 0xcf, 0xbd, 0xd6, 0x5e, 0x35, 0xc9, 0x3e, 0xab, 0xed, 0xd0, 0x4f, 0x9d, 0x1d, 0x5e, 0xba, 0x06, 0x42, 0xcb, 0x39, 0xd9, 0xaa, 0xcb, 0x47, 0x6a, + 0x67, 0xea, 0xab, 0xc4, 0x9c, 0x3c, 0x3b, 0x86, 0xfe, 0xe4, 0x87, 0x43, 0xeb, 0xaf, 0x09, 0x5c, 0x4f, 0xb1, 0xe4, 0xeb, 0x3b, 0x5e, 0x78, 0xf4, 0xf5, 0xc1, 0xe4, 0xfa, 0x9a, 0x9f, 0x99, 0xd6, + 0x6d, 0x5a, 0x72, 0xe3, 0xcb, 0x1b, 0x49, 0x40, 0x42, 0x51, 0xed, 0x52, 0x11, 0x67, 0xf5, 0x12, 0xe0, 0x2c, 0x70, 0x3b, 0x94, 0xe7, 0xe3, 0xbc, 0x8e, 0xf8, 0x7a, 0x26, 0xd1, 0x09, 0x06, 0xfb, + 0xf1, 0x54, 0xa3, 0x05, 0x90, 0xa5, 0xc9, 0x98, 0x31, 0xd4, 0xe8, 0x0c, 0x74, 0xfd, 0x42, 0x83, 0x4b, 0xad, 0xce, 0xac, 0x5e, 0xf2, 0x56, 0xda, 0x7e, 0x49, 0x3b, 0x2b, 0x83, 0x38, 0xc0, 0x78, + 0xc6, 0x3e, 0xc6, 0xb4, 0xa6, 0x0e, 0x93, 0xfb, 0x4a, 0x70, 0xfa, 0x94, 0x11, 0x71, 0x25, 0x3a, 0xb2, 0x65, 0x6c, 0x4d, 0xae, 0x84, 0x7e, 0xe6, 0x43, 0x3a, 0x17, 0x45, 0x24, 0xd4, 0x0c, 0x09, + 0x40, 0x34, 0x1e, 0xeb, 0xa4, 0x59, 0x0c, 0x6d, 0xb8, 0x40, 0x54, 0x35, 0x5a, 0xdc, 0xd0, 0xcc, 0x19, 0x04, 0xd4, 0x98, 0x5b, 0x17, 0x91, 0xaa, 0x77, 0x5d, 0x37, 0xc5, 0x45, 0x51, 0xa5, 0xd3, + 0x94, 0xc2, 0x20, 0x8a, 0x2c, 0xfc, 0xb5, 0x76, 0x5e, 0x85, 0x84, 0x20, 0x06, 0xea, 0x6a, 0xc3, 0xa5, 0x11, 0xad, 0x6e, 0x86, 0x6a, 0xaa, 0xe3, 0x6b, 0x78, 0xfd, 0xdc, 0x2a, 0xf1, 0x3a, 0xa1, + 0x2e, 0x0b, 0x33, 0x71, 0x77, 0x61, 0xed, 0x0b, 0x6f, 0xe2, 0x04, 0x9e, 0x73, 0xef, 0x58, 0x57, 0xe8, 0x83, 0xc3, 0xfb, 0x61, 0x06, 0xbe, 0x91, 0x7d, 0x05, 0x87, 0x1f, 0x2f, 0x26, 0xd0, 0x17, + 0xd7, 0xf7, 0xed, 0x29, 0x98, 0x78, 0x5a, 0xee, 0x90, 0x4d, 0x2b, 0x18, 0xa7, 0x48, 0x6f, 0x0d, 0x4b, 0xdb, 0x1d, 0xa8, 0x74, 0x58, 0x39, 0xfc, 0x61, 0x46, 0xcc, 0x08, 0x85, 0x9a, 0x9e, 0xcf, + 0x1d, 0xac, 0x95, 0xb3, 0x6e, 0xe1, 0x84, 0x9d, 0xb1, 0xd8, 0x00, 0x84, 0x94, 0xf1, 0xac, 0xaf, 0x16, 0x89, 0x86, 0x40, 0x4d, 0x85, 0xd5, 0xde, 0xc9, 0x4d, 0xaa, 0x98, 0x3f, 0x36, 0x80, 0xe5, + 0xa1, 0x22, 0x4e, 0xae, 0x73, 0xef, 0x81, 0x1a, 0xa1, 0xa2, 0xf4, 0x92, 0xc6, 0xf5, 0x26, 0xc9, 0x6b, 0x68, 0xf4, 0x2e, 0xc6, 0xf3, 0x2d, 0x88, 0xfd, 0x8f, 0x6c, 0x23, 0x9e, 0x59, 0xb0, 0xee, + 0x40, 0xea, 0x13, 0x8f, 0xac, 0x5b, 0xa8, 0x6b, 0x0f, 0x8b, 0xe1, 0x74, 0x8e, 0x6a, 0x3f, 0x5c, 0xcd, 0xca, 0x16, 0x8e, 0x67, 0x25, 0x37, 0xaf, 0x69, 0x4a, 0x16, 0x53, 0xb7, 0x71, 0x03, 0xa1, + 0xa7, 0x39, 0x2b, 0x92, 0x21, 0xf8, 0xc8, 0xf5, 0x81, 0x45, 0x2d, 0x82, 0x2a, 0x17, 0xe5, 0x1e, 0xeb, 0x71, 0x60, 0x21, 0x93, 0xc8, 0xe2, 0x58, 0xf0, 0x75, 0x6b, 0x92, 0xe1, 0x29, 0xc4, 0x63, + 0x16, 0xe8, 0x5a, 0x31, 0x50, 0x2a, 0x79, 0xf9, 0x08, 0x08, 0xc2, 0x07, 0x4d, 0x74, 0x7b, 0x63, 0xf8, 0xde, 0xe5, 0xf8, 0x37, 0xcc, 0xb8, 0x92, 0x7d, 0xe1, 0xc6, 0xf5, 0x62, 0x32, 0x52, 0xfb, + 0x99, 0x1d, 0x83, 0xa5, 0x33, 0xf9, 0xa0, 0x1e, 0x30, 0x56, 0xe2, 0x74, 0x4a, 0xe7, 0xcb, 0x3d, 0x3b, 0xc0, 0x73, 0x8c, 0xdf, 0x1b, 0x83, 0xb6, 0x3d, 0xee, 0xfa, 0x19, 0xaf, 0xad, 0xf4, 0x4a, + 0x49, 0x34, 0xc2, 0x4c, 0x67, 0xcb, 0x0d, 0xe9, 0xad, 0xd1, 0x2e, 0xde, 0x2d, 0xd4, 0x35, 0xcf, 0x28, 0xe7, 0x40, 0x39, 0x62, 0xf0, 0x80, 0xad, 0x41, 0x01, 0x6b, 0xfc, 0x16, 0xd9, 0xfa, 0x54, + 0x76, 0x3e, 0xa7, 0xc0, 0xbd, 0x84, 0xa2, 0x0f, 0xec, 0x68, 0x32, 0x3b, 0xef, 0x26, 0x45, 0x19, 0xa6, 0x61, 0x1d, 0x7e, 0x03, 0xf2, 0xfa, 0x0c, 0x8e, 0xdf, 0x27, 0xda, 0xe0, 0xe4, 0xf3, 0x9d, + 0x71, 0x7b, 0xf7, 0x80, 0x0f, 0x11, 0x83, 0x8b, 0x4d, 0xc2, 0xb0, 0x64, 0x30, 0x83, 0xf7, 0x79, 0xe9, 0xf5, 0x4b, 0x88, 0x56, 0xbd, 0xd0, 0xf5, 0x56, 0xc8, 0x8a, 0x15, 0x57, 0x62, 0x16, 0x60, + 0xc0, 0x9e, 0x94, 0x20, 0x02, 0x41, 0xe0, 0xb0, 0x38, 0x61, 0x0a, 0xb1, 0xe6, 0x8d, 0x83, 0x19, 0x9e, 0x36, 0x58, 0x06, 0xd6, 0xf6, 0xbc, 0x43, 0xab, 0xd9, 0x82, 0x6c, 0xd4, 0xc0, 0xe9, 0x3d, + 0x8c, 0x2e, 0xed, 0x38, 0x1c, 0x62, 0x9a, 0x7d, 0xce, 0x6d, 0xfe, 0x43, 0xee, 0x65, 0x60, 0x55, 0x13, 0x3b, 0xf4, 0xc3, 0x57, 0xfc, 0xfb, 0x9b, 0x1d, 0xaa, 0x3e, 0xb5, 0xf3, 0xe4, 0x4f, 0x87, + 0x0f, 0x96, 0x50, 0x1b, 0x84, 0x4e, 0x30, 0xb1, 0xf3, 0xce, 0x73, 0x3f, 0x88, 0xe5, 0x95, 0xd6, 0xcd, 0x09, 0xde, 0x64, 0xae, 0x77, 0xac, 0xac, 0xe3, 0x7d, 0x6c, 0xaa, 0xf7, 0x1e, 0xef, 0xc7, + 0xe5, 0xf7, 0x42, 0x75, 0x94, 0xdc, 0x4b, 0x7b, 0x2c, 0x3b, 0x99, 0xfd, 0x2c, 0x33, 0xbd, 0x5b, 0xcb, 0x4c, 0x59, 0x55, 0xf4, 0x8a, 0xd8, 0x6d, 0x37, 0xea, 0x49, 0x9e, 0x71, 0x69, 0x15, 0xed, + 0xcb, 0xea, 0x8c, 0x52, 0x84, 0x01, 0x4f, 0x97, 0x28, 0x55, 0xd2, 0x61, 0x68, 0xf5, 0x67, 0x84, 0xed, 0x7b, 0x01, 0x39, 0x24, 0x0b, 0x1f, 0xeb, 0xfb, 0xaa, 0x69, 0xb6, 0xa6, 0x7b, 0xa8, 0xf6, + 0x03, 0xb2, 0x13, 0x9d, 0x9d, 0x3f, 0x3d, 0xba, 0x20, 0xa8, 0x45, 0x2e, 0xca, 0xcc, 0xf7, 0x70, 0xf8, 0xd8, 0x88, 0x7e, 0x39, 0x54, 0xf7, 0xde, 0x40, 0xfe, 0x7b, 0x05, 0x71, 0x25, 0x39, 0x72, + 0xe1, 0xd2, 0xb8, 0x11, 0x06, 0xbb, 0xc9, 0x82, 0x22, 0xea, 0xa7, 0xb6, 0x19, 0x6c, 0xab, 0xe6, 0xd8, 0xea, 0x89, 0xd8, 0x6e, 0x1c, 0x20, 0x41, 0x1c, 0x19, 0x07, 0xda, 0x66, 0x99, 0x88, 0x58, + 0x33, 0x40, 0xa6, 0xbb, 0xe4, 0xd6, 0x89, 0xc2, 0xda, 0x09, 0x16, 0xe5, 0xa0, 0x99, 0x6c, 0x42, 0x34, 0xb5, 0x09, 0xcb, 0xd7, 0xe2, 0x3d, 0x43, 0xd0, 0x3c, 0xbe, 0x27, 0xe4, 0x66, 0xf0, 0xfa, + 0x8d, 0x7c, 0x52, 0xe3, 0x8a, 0x42, 0x82, 0xa1, 0x16, 0xbf, 0x54, 0xde, 0xbc, 0x85, 0x16, 0x6f, 0xc7, 0xb6, 0x9e, 0x51, 0x88, 0x57, 0x92, 0x97, 0xef, 0x1d, 0x1b, 0xe3, 0x89, 0x15, 0x0f, 0x7c, + 0x2f, 0x0d, 0xf5, 0xea, 0x6e, 0x30, 0x5d, 0x8d, 0x61, 0x32, 0x32, 0x03, 0x78, 0x14, 0x10, 0x02, 0xb4, 0x5f, 0xb0, 0xf5, 0x4a, 0x71, 0xac, 0x65, 0x95, 0x9a, 0x34, 0x5b, 0xed, 0xb6, 0x02, 0xe1, + 0x83, 0x6b, 0x2f, 0x12, 0xe9, 0xdc, 0x95, 0x94, 0xe9, 0x62, 0x7e, 0x94, 0x11, 0x7b, 0x85, 0x47, 0x5a, 0xa5, 0x1a, 0x99, 0x9b, 0x17, 0x3b, 0x7c, 0xbd, 0x30, 0x74, 0xd7, 0x3c, 0x39, 0xf0, 0x31, + 0x4a, 0xf7, 0xd8, 0x03, 0x15, 0xf0, 0xaf, 0x87, 0xf5, 0xff, 0xfa, 0xbf, 0xb7, 0x82, 0xc4, 0xdb, 0xb3, 0xa4, 0x0e, 0xef, 0xe1, 0xde, 0x8c, 0x15, 0x80, 0x4f, 0xcc, 0x90, 0x3a, 0x4c, 0x2e, 0x6c, + 0xaa, 0xc3, 0x64, 0x72, 0x25, 0xf1, 0x33, 0x97, 0xe2, 0xc3, 0x11, 0x14, 0xb1, 0x80, 0x5b, 0x94, 0xfa, 0x7c, 0x81, 0x19, 0xa7, 0x35, 0xaf, 0x85, 0xe1, 0xca, 0x02, 0x70, 0xb2, 0xe5, 0x40, 0x96, + 0x50, 0x00, 0x99, 0x91, 0x29, 0xdd, 0x49, 0xe2, 0xde, 0x47, 0x6c, 0xd4, 0x9d, 0xc6, 0x78, 0x05, 0x29, 0x82, 0x57, 0xc8, 0x51, 0x48, 0xd1, 0x0e, 0x60, 0xa9, 0x88, 0x0c, 0x6f, 0xa8, 0x7e, 0x2e, + 0xe1, 0x05, 0xa6, 0x39, 0x92, 0x89, 0x49, 0x69, 0x99, 0x3d, 0xe0, 0x01, 0x7f, 0x1f, 0x20, 0x1b, 0x83, 0xd4, 0x1f, 0xc3, 0x67, 0xd5, 0xc4, 0x2a, 0xfd, 0x26, 0xf5, 0xde, 0xaf, 0x5c, 0x9f, 0x43, + 0x68, 0xbe, 0x97, 0x79, 0xa5, 0x55, 0xe7, 0xe5, 0xe4, 0x35, 0x86, 0xf7, 0xd6, 0x15, 0xff, 0xd4, 0xf5, 0xa2, 0x02, 0xdd, 0x89, 0x55, 0x96, 0xd6, 0xcb, 0x46, 0xed, 0x73, 0xc6, 0xe9, 0x75, 0x9d, + 0xbb, 0xd5, 0xed, 0xde, 0x1a, 0xd7, 0x84, 0xf7, 0xb6, 0xd5, 0xc4, 0x6f, 0xe4, 0x19, 0xf5, 0xd4, 0x84, 0x97, 0x6d, 0xf5, 0xe5, 0x67, 0x32, 0x52, 0xf8, 0x59, 0x76, 0x80, 0x6c, 0x56, 0x53, 0xc5, + 0x5b, 0xe9, 0x3d, 0x20, 0xe8, 0xfc, 0x9a, 0x4b, 0xc9, 0x2e, 0xcb, 0xb0, 0x39, 0xc3, 0x16, 0x50, 0x82, 0x2b, 0x34, 0x8b, 0xa7, 0x09, 0x31, 0x48, 0x5a, 0xba, 0x04, 0x48, 0x44, 0x99, 0xc9, 0x3c, + 0x24, 0xe7, 0x0e, 0x57, 0x66, 0x6d, 0xbc, 0x8b, 0x8d, 0x3d, 0x2f, 0x87, 0x06, 0x02, 0x1e, 0x0b, 0x06, 0xb3, 0x8e, 0x5b, 0x82, 0x0d, 0x6c, 0xd0, 0x1f, 0x70, 0x15, 0xf7, 0xbe, 0xf8, 0xaf, 0xcf, + 0xc4, 0xc4, 0xc9, 0xd3, 0x22, 0x4c, 0xbc, 0x2f, 0x87, 0x19, 0xff, 0xf7, 0x51, 0x9c, 0xcf, 0xc4, 0xc1, 0xc9, 0x97, 0x5b, 0x8f, 0xc6, 0x72, 0x12, 0x22, 0x61, 0xb8, 0x54, 0x72, 0x24, 0xf3, 0x10, + 0xa0, 0x99, 0xdd, 0x64, 0xf2, 0xe1, 0xac, 0x30, 0x4b, 0x67, 0x56, 0x9c, 0x71, 0x40, 0x65, 0x5a, 0x8b, 0x38, 0x81, 0x92, 0xab, 0x75, 0x44, 0x83, 0x27, 0x95, 0x7e, 0xde, 0xb0, 0x62, 0x5a, 0xe4, + 0xee, 0x92, 0x5a, 0xca, 0x6d, 0x4c, 0x05, 0x4b, 0x06, 0x04, 0x5d, 0xde, 0x44, 0x09, 0xb1, 0x59, 0x70, 0x69, 0x54, 0xbb, 0xa8, 0xba, 0x0f, 0xd9, 0xf2, 0x91, 0x25, 0xfe, 0x87, 0xd3, 0xe7, 0xee, + 0x39, 0x18, 0xff, 0xbe, 0xa6, 0xe4, 0xbb, 0x17, 0x5d, 0x18, 0xf7, 0xcd, 0xe3, 0xd1, 0xfd, 0xf8, 0x40, 0x5d, 0x09, 0x5b, 0x88, 0xe9, 0x54, 0x0b, 0xc1, 0x4e, 0xc6, 0xc1, 0xb9, 0x22, 0x32, 0x75, + 0x71, 0xe8, 0x72, 0x55, 0xa7, 0x83, 0x03, 0x79, 0x80, 0xe2, 0x53, 0xdd, 0xfb, 0x02, 0x61, 0x30, 0xbe, 0xac, 0x10, 0x87, 0x84, 0xcd, 0xba, 0x46, 0x49, 0xf5, 0x20, 0x9a, 0x61, 0x58, 0x44, 0x1c, + 0x65, 0x94, 0x69, 0x10, 0x70, 0x99, 0xda, 0x41, 0xc5, 0xe6, 0xf8, 0xd1, 0xa1, 0x96, 0x27, 0xb4, 0x22, 0x83, 0x29, 0xce, 0x3d, 0xb0, 0x7b, 0xf8, 0x84, 0xba, 0x70, 0x0f, 0x58, 0xe0, 0x1b, 0x0c, + 0x82, 0x9b, 0xb3, 0x74, 0x9c, 0xd6, 0xdf, 0x58, 0x21, 0x7f, 0x3f, 0x4d, 0x47, 0x8a, 0xe0, 0xe4, 0xfa, 0xfb, 0xe8, 0xc9, 0x08, 0xb4, 0xb4, 0x40, 0x76, 0x09, 0xbc, 0xd3, 0x91, 0xcd, 0x39, 0xc1, + 0xa1, 0x04, 0xe9, 0x4f, 0x88, 0x89, 0xa1, 0x21, 0x60, 0xb5, 0x45, 0x6b, 0x9c, 0x2a, 0x81, 0x36, 0xf5, 0x38, 0x3e, 0xad, 0xea, 0xcc, 0x36, 0xfc, 0x72, 0xc5, 0x02, 0x7d, 0x84, 0x97, 0x81, 0x0e, + 0xc5, 0x0d, 0xc7, 0x76, 0xc3, 0xd2, 0x32, 0x0d, 0x21, 0xe2, 0xf4, 0x59, 0xee, 0x5b, 0x85, 0x28, 0xaf, 0x38, 0x51, 0x5e, 0x45, 0xa1, 0xfd, 0xdc, 0xce, 0x36, 0xac, 0xbc, 0xee, 0x4f, 0xca, 0xfb, + 0x77, 0x6c, 0xbb, 0x61, 0xf5, 0xfd, 0xef, 0x8c, 0xf1, 0x9b, 0x6f, 0x78, 0x63, 0xeb, 0xa7, 0xfb, 0x8f, 0x1a, 0xe6, 0x76, 0x7b, 0x70, 0xcf, 0x10, 0x25, 0x4a, 0x45, 0x91, 0xf0, 0xe6, 0x54, 0x3c, + 0xa8, 0x06, 0xb6, 0x3b, 0xf7, 0x8d, 0x8c, 0xe7, 0x51, 0x54, 0xe2, 0x49, 0x1b, 0xfb, 0x58, 0x9a, 0x40, 0x65, 0xbe, 0xe8, 0x49, 0xd3, 0x6b, 0xb6, 0x25, 0xbe, 0xdc, 0x22, 0xf8, 0xf4, 0x94, 0xc8, + 0x3a, 0x4c, 0x68, 0x8a, 0x39, 0xf8, 0xa6, 0x48, 0x0e, 0xa1, 0xe0, 0x78, 0xa5, 0x7e, 0x3a, 0xac, 0x53, 0x2e, 0x23, 0xf7, 0xf2, 0x73, 0x5e, 0xe3, 0xf0, 0xd5, 0xf0, 0x7e, 0x53, 0x49, 0xf0, 0x27, + 0x95, 0x64, 0xe7, 0x79, 0xe2, 0x59, 0xd9, 0xe4, 0x9a, 0xcf, 0xf1, 0xeb, 0xa6, 0xfb, 0xf8, 0x2d, 0x1a, 0xf6, 0xb1, 0xd7, 0x57, 0x55, 0xf8, 0x2e, 0xe1, 0xeb, 0x4b, 0x3a, 0x49, 0xf8, 0x6a, 0xe2, + 0xff, 0xfa, 0x63, 0xe1, 0x7f, 0x23, 0xf5, 0x8f, 0x3a, 0xf0, 0x8e, 0xfb, 0xec, 0xf7, 0xdf, 0xa3, 0xcf, 0x7c, 0xa1, 0xfe, 0x26, 0xed, 0x77, 0xf7, 0x26, 0x23, 0xed, 0x9f, 0x25, 0xdd, 0x92, 0x0e, + 0xda, 0xc5, 0x1d, 0x96, 0x6e, 0x42, 0xb7, 0x2d, 0x70, 0x98, 0x80, 0x9c, 0xd8, 0xd4, 0x8f, 0xab, 0xf4, 0xdc, 0x15, 0x51, 0x72, 0x68, 0x16, 0x8d, 0x2b, 0xd7, 0xec, 0x11, 0x95, 0xc1, 0x7a, 0x47, + 0x69, 0x34, 0xb1, 0x5f, 0xda, 0xc6, 0x74, 0x76, 0x3a, 0xe4, 0x54, 0x55, 0xd6, 0x42, 0x63, 0xca, 0x99, 0xd0, 0x22, 0x85, 0x05, 0x51, 0x86, 0x6f, 0x0b, 0xa2, 0x4a, 0x13, 0x20, 0xe7, 0x3c, 0x52, + 0x3d, 0x6d, 0x9d, 0xad, 0x30, 0x19, 0x53, 0x27, 0xde, 0xfd, 0xd1, 0xd5, 0x6d, 0xbe, 0xff, 0xb0, 0x37, 0x7b, 0x9f, 0x95, 0xf4, 0xaf, 0x2f, 0x59, 0x49, 0x7e, 0x5e, 0xb8, 0xb7, 0x87, 0xce, 0x65, + 0xcb, 0x56, 0xe7, 0x57, 0x81, 0xd7, 0xd6, 0x1f, 0x99, 0x7f, 0x1e, 0x38, 0xb7, 0x6c, 0x99, 0x7b, 0x31, 0xb1, 0xb6, 0xb4, 0x8a, 0xe2, 0xbe, 0xb8, 0x9f, 0x9a, 0xe0, 0x23, 0xc9, 0x8b, 0x8c, 0xc7, + 0xc6, 0x23, 0x53, 0x18, 0x9e, 0xd4, 0x5b, 0x85, 0x8c, 0x06, 0x9c, 0x3e, 0x45, 0x46, 0x27, 0xc7, 0x26, 0x7f, 0xa6, 0x20, 0x45, 0x6e, 0x56, 0x62, 0x5d, 0x10, 0x3f, 0xab, 0xe1, 0xae, 0xbe, 0x5f, + 0x60, 0x8b, 0x3e, 0xf5, 0x0d, 0x23, 0x45, 0x70, 0x72, 0xfd, 0x1d, 0x31, 0xd1, 0x1e, 0x58, 0x84, 0x24, 0xd1, 0xd4, 0xe0, 0x90, 0x32, 0x96, 0x86, 0xe6, 0x53, 0x46, 0x46, 0x6a, 0x6a, 0x14, 0x36, + 0xc0, 0x4a, 0x0f, 0x7a, 0xcd, 0x98, 0x57, 0xe7, 0x63, 0x81, 0xa7, 0x4e, 0x63, 0xa6, 0xa4, 0xbb, 0xd5, 0x44, 0x11, 0x02, 0x99, 0xa8, 0x2e, 0xb5, 0x96, 0xa7, 0x3a, 0x96, 0x98, 0x82, 0x29, 0xa3, + 0xdb, 0xb5, 0x54, 0x09, 0x11, 0xbf, 0xb0, 0x5c, 0xa8, 0x5d, 0x54, 0xb9, 0x8b, 0x0e, 0xe5, 0x8e, 0xe2, 0xbe, 0x6c, 0xb3, 0x7a, 0x2b, 0x49, 0xc2, 0xbb, 0x1e, 0xb4, 0xe7, 0xc0, 0xe0, 0x5e, 0x68, + 0x82, 0x93, 0xd7, 0xd6, 0xa3, 0x30, 0x70, 0x48, 0xeb, 0x0a, 0xa1, 0x7b, 0xe8, 0x4f, 0xb3, 0x0d, 0x0d, 0x11, 0xa8, 0x21, 0x71, 0xdb, 0xd9, 0xae, 0x58, 0x6f, 0x55, 0x0a, 0x69, 0x23, 0x83, 0x4a, + 0x16, 0xfa, 0x2a, 0x68, 0xd2, 0x69, 0xac, 0x3a, 0x67, 0x10, 0x85, 0xb7, 0xd9, 0xd4, 0x4b, 0x15, 0xc8, 0xed, 0x1d, 0x45, 0x47, 0x9b, 0x83, 0x21, 0x79, 0x51, 0x2b, 0x9e, 0x7d, 0x8c, 0xab, 0xce, + 0xb6, 0x9b, 0xec, 0x25, 0x80, 0x37, 0x39, 0xa7, 0xc6, 0xbf, 0xc4, 0xbb, 0x7b, 0xab, 0xf4, 0xab, 0x1f, 0x80, 0x8b, 0x2f, 0x12, 0xfa, 0xfb, 0xa5, 0xe9, 0x3d, 0xe5, 0xf1, 0xeb, 0xff, 0x5c, 0x4e, + 0xae, 0x24, 0x7f, 0xe6, 0x41, 0x0f, 0xc3, 0x99, 0xc0, 0x25, 0xbb, 0xc5, 0x1e, 0x60, 0x76, 0xc8, 0xe1, 0x4c, 0xd6, 0xf8, 0x5e, 0x4c, 0x00, 0x05, 0x09, 0x76, 0x4a, 0xbe, 0x23, 0x2d, 0x58, 0x19, + 0xbc, 0x21, 0x08, 0x12, 0x4c, 0x2d, 0xa6, 0xb0, 0xbf, 0x04, 0x17, 0xfb, 0x9d, 0x8e, 0x1f, 0x90, 0x9e, 0xe4, 0x74, 0x23, 0x68, 0x34, 0x9a, 0x99, 0x6e, 0x83, 0xec, 0x08, 0xb0, 0x06, 0x64, 0x65, + 0xb5, 0xe7, 0x14, 0x54, 0xbb, 0xdd, 0x10, 0x8f, 0xc4, 0x6d, 0xc7, 0xf8, 0xdf, 0x6d, 0x1b, 0xf3, 0x99, 0x90, 0x6d, 0x9f, 0x5d, 0x38, 0x90, 0x3d, 0x8a, 0x48, 0xa5, 0x75, 0x68, 0xef, 0x0b, 0x7a, + 0xd5, 0x4c, 0x1d, 0x3c, 0xac, 0x78, 0xdd, 0x23, 0xcc, 0x06, 0x36, 0x93, 0x66, 0x99, 0x9e, 0xf6, 0x41, 0x77, 0x12, 0xa7, 0x8e, 0x64, 0xc8, 0x0a, 0x35, 0xa3, 0x1c, 0x06, 0x51, 0x8e, 0xb6, 0x20, + 0x17, 0x2b, 0xfc, 0xd8, 0x40, 0x26, 0x61, 0x83, 0x03, 0x8c, 0x15, 0x86, 0x94, 0xf1, 0xdd, 0xc1, 0x3c, 0xeb, 0x81, 0x8b, 0x1c, 0x03, 0xda, 0x24, 0x59, 0x29, 0x65, 0xb0, 0x6f, 0x01, 0x11, 0xff, + 0xb9, 0xfc, 0xfb, 0xf7, 0x3f, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5a, 0x05, 0xf2, 0xde, 0xea, 0x51, 0x01, 0x00, 0xd2, 0xcc, 0x04, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xc9, 0x6e, + 0xdb, 0x3c, 0x10, 0xbe, 0xfb, 0x29, 0x06, 0x3a, 0xe4, 0x10, 0x84, 0xa3, 0xc5, 0xce, 0x0a, 0xfc, 0xc0, 0x5f, 0xa4, 0x69, 0x7b, 0x08, 0xda, 0x43, 0x97, 0x53, 0x90, 0x40, 0x91, 0x26, 0x0e, 0x5d, + 0x89, 0x62, 0x49, 0xca, 0x48, 0x10, 0xe4, 0xdd, 0x0b, 0x8e, 0x28, 0x99, 0xb1, 0x93, 0xa0, 0x80, 0x61, 0x5b, 0xfc, 0x16, 0xce, 0x7c, 0x1c, 0xf1, 0x69, 0x06, 0x90, 0xa8, 0xb2, 0xa5, 0xe4, 0x0c, + 0x12, 0x5a, 0x93, 0x72, 0xe2, 0xbe, 0x54, 0x75, 0x43, 0x26, 0x39, 0xf0, 0xd0, 0x9a, 0x8c, 0x95, 0x9d, 0xf2, 0x68, 0x86, 0x39, 0x66, 0xc3, 0x6a, 0x4d, 0xb6, 0x32, 0x52, 0xbb, 0x80, 0xfc, 0x78, + 0xd4, 0xf4, 0x9d, 0x17, 0xe0, 0xbc, 0xe9, 0xfa, 0xfa, 0xc2, 0xfb, 0xc0, 0x97, 0xd8, 0xa7, 0x91, 0x15, 0x29, 0xcb, 0xbb, 0x7c, 0xd0, 0x65, 0x75, 0x4f, 0xa2, 0x18, 0xcd, 0x0c, 0xe9, 0xce, 0x4a, + 0xd7, 0x99, 0xc7, 0xe4, 0x0c, 0x7c, 0x3d, 0x00, 0x89, 0x7b, 0xd4, 0xcc, 0x5d, 0x4a, 0xc7, 0x24, 0x80, 0xa4, 0x37, 0x8d, 0x5f, 0x49, 0x66, 0x00, 0xcf, 0xac, 0x1b, 0x4a, 0xb0, 0x1b, 0xd1, 0x6d, + 0x2f, 0x9b, 0xda, 0x73, 0x94, 0x7e, 0x00, 0xa1, 0xc1, 0x9b, 0x0c, 0x24, 0x70, 0xb6, 0x1a, 0x7d, 0xb4, 0x21, 0x47, 0xd6, 0x0d, 0xbc, 0x16, 0x4c, 0xaf, 0xa0, 0x91, 0xca, 0xc1, 0xde, 0x1e, 0x8c, + 0xcf, 0x83, 0x51, 0xe0, 0x7b, 0xf2, 0x59, 0xaf, 0x24, 0x2b, 0x9c, 0x15, 0xaa, 0xab, 0x09, 0xfc, 0xd7, 0x4d, 0xdb, 0xd5, 0x7d, 0x43, 0x36, 0x75, 0xa5, 0xa6, 0xf4, 0x56, 0x2a, 0xfe, 0x03, 0x9e, + 0x9f, 0x7a, 0x3e, 0x3a, 0xfb, 0xc2, 0x43, 0x2a, 0x47, 0x4b, 0x53, 0x8e, 0xa1, 0xfd, 0xab, 0x55, 0x24, 0xdb, 0x72, 0x8c, 0x5b, 0x98, 0xaa, 0x8c, 0xfb, 0xd8, 0xd9, 0x36, 0x88, 0xad, 0x2b, 0x0d, + 0xab, 0x3f, 0xfd, 0xfc, 0x7a, 0x7e, 0x73, 0xf9, 0xed, 0xf3, 0xcd, 0xe5, 0xc5, 0xaf, 0x8b, 0xcb, 0xff, 0xa4, 0xba, 0xeb, 0xe0, 0xae, 0x2c, 0xad, 0x58, 0x59, 0x61, 0x7a, 0xe5, 0x64, 0x4b, 0x80, + 0x29, 0xc7, 0x91, 0x4a, 0x55, 0xd3, 0x03, 0xae, 0xa6, 0x0a, 0x7c, 0x68, 0x3c, 0x34, 0x96, 0xe3, 0xbb, 0x4a, 0xac, 0xa9, 0xd2, 0xfd, 0xfd, 0x74, 0x1f, 0x9f, 0x56, 0xf6, 0xc0, 0xf9, 0xcf, 0xc3, + 0xf3, 0x55, 0x02, 0x57, 0x5c, 0xeb, 0x6b, 0x88, 0x10, 0x7f, 0x7a, 0x49, 0xd3, 0x01, 0xd7, 0x74, 0xdb, 0x2f, 0xb9, 0xa7, 0xae, 0xa6, 0xb6, 0x53, 0x20, 0x84, 0x54, 0x56, 0x53, 0xe5, 0x00, 0xd3, + 0x17, 0x29, 0x6d, 0x95, 0xc8, 0x81, 0x55, 0x8d, 0xc4, 0x95, 0xdd, 0xad, 0x76, 0x1a, 0x97, 0x9a, 0xd6, 0x1f, 0x49, 0x93, 0xaa, 0x49, 0x55, 0x92, 0xa2, 0xb1, 0xf9, 0x9f, 0xe7, 0x84, 0x13, 0xf7, + 0xbb, 0x5f, 0x2f, 0x30, 0x9f, 0x87, 0xd9, 0x9c, 0x50, 0x9e, 0x22, 0x31, 0xb4, 0x9a, 0x0e, 0x3f, 0x42, 0x37, 0xfd, 0x52, 0xaa, 0x20, 0x29, 0x16, 0xef, 0x4a, 0x74, 0x69, 0x2c, 0x99, 0x57, 0xb8, + 0x03, 0xce, 0xc0, 0x31, 0x16, 0x47, 0xdb, 0x80, 0xa8, 0x3a, 0x75, 0x27, 0x97, 0xc2, 0x0f, 0xad, 0x93, 0xc1, 0xe1, 0x04, 0xe7, 0x3b, 0xbc, 0xa1, 0x98, 0x97, 0xbc, 0x39, 0x46, 0x1b, 0x85, 0x50, + 0x03, 0x90, 0x61, 0x1e, 0xbf, 0x0f, 0x93, 0xa4, 0x88, 0xad, 0x6d, 0xaf, 0xc9, 0x8c, 0x83, 0x76, 0x7d, 0x84, 0xf3, 0x8d, 0xe8, 0x8d, 0xb0, 0xc2, 0x4c, 0x33, 0x72, 0x8a, 0x79, 0xc4, 0xb7, 0xfc, + 0x62, 0x5e, 0x67, 0xbe, 0xf9, 0x68, 0xf5, 0xcd, 0x1e, 0x73, 0xcc, 0x4f, 0x22, 0xdf, 0x29, 0x50, 0x06, 0x0f, 0x31, 0xc7, 0xa3, 0xf8, 0x64, 0xdf, 0x39, 0xd6, 0xa9, 0x9e, 0x22, 0xc3, 0x05, 0x16, + 0xa3, 0x63, 0xe5, 0xef, 0x29, 0xbe, 0xef, 0xbc, 0x24, 0x39, 0xc6, 0x6c, 0x83, 0x6d, 0x8d, 0x97, 0xc7, 0x0b, 0x2c, 0x36, 0x78, 0xc7, 0x17, 0x5f, 0xe9, 0x3a, 0x13, 0x7a, 0x3a, 0xc5, 0xf9, 0x88, + 0x19, 0x2a, 0x6b, 0xa1, 0x7f, 0x2f, 0xc3, 0x41, 0x65, 0x51, 0x9a, 0xd4, 0xae, 0x43, 0x73, 0xc7, 0x78, 0x88, 0x0b, 0xae, 0x7f, 0xf6, 0x3c, 0xfb, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0xa0, 0x0f, 0x78, 0x27, 0x41, 0x02, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0xa4, 0x55, 0x4d, 0x6f, 0xdb, 0x46, 0x10, 0xbd, 0xef, 0xaf, 0x78, 0x45, 0x03, 0x50, 0x32, 0x24, 0xf2, 0x2e, 0xc5, 0x6e, 0x01, 0xc7, 0x40, 0xd2, 0x43, + 0x1c, 0xc4, 0x6e, 0x80, 0xdc, 0xb2, 0x5a, 0x8e, 0xc4, 0x75, 0xc8, 0x5d, 0x66, 0x77, 0x29, 0x59, 0x55, 0xf9, 0xdf, 0x8b, 0xfd, 0x20, 0x29, 0xbb, 0x86, 0x51, 0x34, 0xba, 0x68, 0x35, 0xf3, 0x66, + 0xe6, 0xcd, 0xa7, 0x64, 0xd3, 0x6a, 0xe3, 0x70, 0xc2, 0x75, 0xad, 0xbb, 0xf2, 0x66, 0x4f, 0xca, 0xa1, 0xc7, 0xd6, 0xe8, 0x06, 0x99, 0xf0, 0x22, 0xf2, 0x22, 0x9b, 0xad, 0xd9, 0x84, 0xd4, 0xca, + 0xd1, 0xe3, 0x04, 0xdb, 0x72, 0x6e, 0x97, 0x0f, 0x76, 0x69, 0x3a, 0xe5, 0x64, 0x43, 0xd9, 0x9a, 0xb1, 0xe2, 0xe2, 0x82, 0xe1, 0x02, 0x5f, 0x75, 0x67, 0xce, 0x1c, 0x5b, 0x6c, 0x3b, 0x25, 0x9c, + 0xd4, 0x6a, 0x01, 0xa9, 0xf6, 0xfa, 0x3b, 0x95, 0x38, 0x48, 0x57, 0x81, 0xb8, 0xa8, 0x60, 0xe8, 0x47, 0x47, 0xd6, 0xe5, 0xb8, 0xaf, 0xa4, 0xf5, 0xd6, 0xd2, 0x82, 0x2b, 0xd0, 0x23, 0x6f, 0xda, + 0x9a, 0x46, 0x53, 0x1c, 0x2a, 0x29, 0x2a, 0xd4, 0x7a, 0x67, 0xe1, 0x2a, 0x82, 0x54, 0x42, 0x37, 0x52, 0xed, 0x10, 0x88, 0x82, 0xab, 0x12, 0x24, 0x2a, 0x4d, 0xc1, 0x85, 0x07, 0x18, 0x12, 0x24, + 0xf7, 0x54, 0x26, 0x40, 0xc9, 0x1d, 0x87, 0xd3, 0x41, 0x25, 0x78, 0x5d, 0x93, 0xc9, 0x19, 0x02, 0xdb, 0x0f, 0x0e, 0x82, 0x2b, 0x6c, 0xe8, 0x29, 0xb9, 0xcc, 0x47, 0x4e, 0xa2, 0x2c, 0x7f, 0x0a, + 0x74, 0x64, 0xdd, 0x88, 0x53, 0x6d, 0x13, 0x04, 0xd9, 0xe0, 0xf0, 0xf7, 0x96, 0x1b, 0xde, 0xe0, 0x94, 0x0a, 0xd6, 0x43, 0xa4, 0xca, 0xf1, 0xf1, 0xa5, 0x37, 0x0f, 0x24, 0x5c, 0x7e, 0x8e, 0x8e, + 0xa2, 0x11, 0x9c, 0x6f, 0x74, 0x79, 0x4c, 0x89, 0x84, 0x02, 0x21, 0x08, 0xe4, 0x16, 0x5c, 0x1d, 0x5f, 0xb3, 0xfb, 0xd1, 0x91, 0x89, 0x86, 0xf1, 0x65, 0x9d, 0xf1, 0x65, 0x2a, 0xc9, 0x92, 0x91, + 0xbc, 0xfe, 0x8b, 0x4a, 0xf0, 0x50, 0xe1, 0x68, 0xb8, 0xf8, 0x0f, 0x2e, 0x6b, 0xbd, 0xf3, 0x85, 0xdf, 0x79, 0x3f, 0x51, 0x17, 0x53, 0x6f, 0xc8, 0x55, 0xba, 0xb4, 0xd8, 0x6a, 0x83, 0x4c, 0xaa, + 0xad, 0xce, 0x16, 0xc8, 0x0e, 0xdc, 0x28, 0xff, 0x4d, 0xc6, 0x68, 0x93, 0x2d, 0x40, 0x4e, 0xbc, 0x9a, 0x67, 0x45, 0xbc, 0x24, 0x13, 0x9b, 0xfa, 0xfe, 0xfe, 0xfe, 0xd3, 0x98, 0x6f, 0x52, 0x9c, + 0xdb, 0xc6, 0x5c, 0x26, 0xdb, 0x48, 0xe0, 0xdf, 0xa6, 0x51, 0xfe, 0x9a, 0x65, 0xe5, 0x5c, 0xfb, 0x85, 0x8c, 0xf5, 0x93, 0x35, 0x9a, 0xb7, 0x46, 0x3b, 0x2d, 0x74, 0x8d, 0x7d, 0xd4, 0x78, 0x07, + 0x77, 0x44, 0x2b, 0x78, 0xb4, 0x5d, 0x15, 0xc5, 0x4e, 0xba, 0xaa, 0xdb, 0xe4, 0x42, 0x37, 0xc5, 0x77, 0xc5, 0x9d, 0xdc, 0x53, 0xe1, 0xa7, 0xa4, 0xd8, 0xd4, 0x7a, 0x53, 0x34, 0x5c, 0xaa, 0xa2, + 0xd4, 0xc2, 0x16, 0xbb, 0x4e, 0x96, 0x64, 0x0b, 0xa5, 0x4b, 0x7a, 0xb0, 0x79, 0x53, 0xfe, 0xea, 0x2a, 0x5a, 0xa6, 0xc8, 0xcb, 0x98, 0xff, 0x93, 0x39, 0x19, 0x37, 0xa5, 0xc7, 0xb4, 0x7b, 0x81, + 0xd6, 0xa4, 0x62, 0xb8, 0x28, 0x58, 0x51, 0x80, 0x6c, 0x2d, 0x95, 0x5b, 0x96, 0xd2, 0xf2, 0x4d, 0x4d, 0x4b, 0xe5, 0x5d, 0xd6, 0x52, 0x11, 0x5a, 0x43, 0xce, 0x49, 0x32, 0xc5, 0xf0, 0x60, 0x42, + 0x2b, 0x5f, 0x46, 0xae, 0xca, 0x9a, 0x70, 0x09, 0x6e, 0x8f, 0x4a, 0x60, 0x96, 0x78, 0xac, 0x86, 0x7d, 0x5e, 0x9c, 0xc5, 0xfc, 0x6d, 0x75, 0x16, 0xf1, 0xed, 0x75, 0x67, 0x9d, 0x6e, 0xc8, 0x5c, + 0xcd, 0x57, 0xf8, 0x64, 0x74, 0x23, 0x2d, 0xbd, 0x7d, 0x41, 0xfd, 0x77, 0xac, 0xed, 0xd5, 0x15, 0x2e, 0xaf, 0x70, 0x62, 0x40, 0x51, 0xe0, 0xeb, 0xed, 0x9f, 0x9f, 0x71, 0x7d, 0xfb, 0xee, 0x06, + 0xef, 0x6f, 0x3e, 0xdf, 0x30, 0x20, 0x72, 0x69, 0xc8, 0x71, 0x5c, 0x06, 0x10, 0x60, 0x75, 0x67, 0x04, 0xad, 0xe2, 0xa2, 0xf9, 0x15, 0xcf, 0x03, 0x87, 0x2f, 0x92, 0x0e, 0x64, 0xb2, 0x45, 0xc0, + 0xb8, 0x63, 0xeb, 0x11, 0x7e, 0xb3, 0x33, 0x06, 0xf4, 0xeb, 0xe8, 0xfe, 0xfe, 0xfc, 0x00, 0x9c, 0xd7, 0xc8, 0x0f, 0xf3, 0xec, 0x97, 0x29, 0xa1, 0x79, 0x8a, 0x15, 0xc3, 0x1b, 0xb2, 0xad, 0x56, + 0x96, 0x9e, 0x64, 0x99, 0xd8, 0xe3, 0x12, 0x8a, 0x0e, 0x2f, 0x28, 0x66, 0xd1, 0x03, 0x90, 0xe7, 0x7e, 0xde, 0xf8, 0x62, 0xfa, 0x79, 0x1a, 0xf9, 0xa5, 0x59, 0xf7, 0x47, 0x66, 0x85, 0xec, 0xa3, + 0x4e, 0x47, 0x67, 0xb8, 0x41, 0x19, 0xfa, 0x60, 0xd5, 0xcf, 0xd7, 0x03, 0x9d, 0x61, 0xb1, 0x72, 0xbf, 0x37, 0xb3, 0x81, 0x59, 0xee, 0xf4, 0x5d, 0x08, 0x3b, 0x9b, 0x27, 0xa8, 0x21, 0xd7, 0x19, + 0x35, 0x52, 0xf7, 0xc2, 0x9e, 0xbd, 0xe0, 0xe1, 0x1b, 0x5b, 0xfe, 0xff, 0x0f, 0x9b, 0xd2, 0x5e, 0xb1, 0x37, 0xa7, 0xa9, 0x7e, 0x3d, 0x63, 0xef, 0x7c, 0x4e, 0xec, 0xcd, 0xe9, 0x8f, 0xbb, 0xdb, + 0x8f, 0x79, 0xac, 0x89, 0xdc, 0x1e, 0x67, 0x13, 0x26, 0xf7, 0x59, 0xcf, 0xfb, 0x9f, 0x8a, 0xff, 0x6d, 0x9e, 0x3a, 0x1b, 0xf3, 0x4c, 0xa7, 0x95, 0x3f, 0x6b, 0x09, 0x1b, 0xcb, 0xf1, 0xac, 0x55, + 0xe3, 0xa4, 0xce, 0x4e, 0x63, 0x9b, 0x52, 0x33, 0x9e, 0xf1, 0x0c, 0x2d, 0xe8, 0xd7, 0x8c, 0xd1, 0x63, 0xf8, 0x5b, 0x93, 0xca, 0x91, 0xd9, 0x72, 0x41, 0x18, 0x7c, 0x84, 0x89, 0x51, 0xbc, 0xa1, + 0x55, 0x3a, 0x9d, 0x9e, 0x99, 0x48, 0xca, 0x0f, 0xe5, 0x24, 0xed, 0x47, 0x27, 0xa7, 0x61, 0xc9, 0xfa, 0x35, 0xfb, 0x27, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4d, 0x81, 0x07, 0x66, + 0x11, 0x03, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, + 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x8c, 0x52, 0x3f, 0x6f, 0xdb, 0x3e, 0x10, 0xdd, 0xf5, 0x29, 0x6e, 0x23, 0xf5, 0x83, 0x2c, 0xe5, 0x97, 0xb6, 0x8b, 0x8d, 0x74, 0x09, + 0x02, 0x24, 0x1d, 0x92, 0x02, 0x35, 0xba, 0x14, 0x1d, 0x18, 0xf1, 0x6c, 0x2b, 0x91, 0x49, 0xe5, 0x78, 0x72, 0x6a, 0x18, 0xfa, 0xee, 0xc5, 0x51, 0xb2, 0xa4, 0x78, 0xea, 0x46, 0xde, 0x9f, 0x77, + 0xf7, 0xde, 0x3d, 0xd5, 0x06, 0x84, 0xc0, 0x54, 0x95, 0xac, 0x56, 0x49, 0xb5, 0x6f, 0x3c, 0x31, 0x9c, 0xe0, 0xb6, 0xf6, 0xad, 0xbd, 0x3b, 0xa0, 0xe3, 0x0c, 0xee, 0xd7, 0xeb, 0xef, 0xd0, 0xc1, + 0x86, 0xfc, 0x1e, 0x54, 0x29, 0x09, 0x94, 0x44, 0x98, 0xd7, 0x07, 0x36, 0xc4, 0x19, 0x3c, 0xb8, 0x83, 0x7f, 0x45, 0x7a, 0x6a, 0xb8, 0xf2, 0x2e, 0x8c, 0x4d, 0x1b, 0x63, 0xc2, 0xe2, 0x25, 0x2c, + 0xa8, 0x75, 0x5c, 0xed, 0x71, 0x6a, 0x24, 0x7c, 0x6b, 0x31, 0xf0, 0x50, 0x16, 0xda, 0x06, 0x89, 0x31, 0xc8, 0x26, 0xe7, 0x8a, 0xff, 0xc0, 0x04, 0xd8, 0xb4, 0xae, 0x1c, 0x6a, 0xf2, 0xbc, 0x78, + 0x6e, 0xab, 0xda, 0x4e, 0x18, 0xd2, 0x90, 0xc1, 0x09, 0xd6, 0x02, 0x74, 0x9e, 0xc8, 0xa6, 0x91, 0x31, 0x49, 0x51, 0xf4, 0x71, 0x3e, 0x36, 0x68, 0x67, 0xac, 0xc0, 0x1a, 0x36, 0x49, 0xe5, 0x18, + 0x69, 0x63, 0x4a, 0x84, 0xdb, 0x36, 0xb0, 0xdf, 0x23, 0xc1, 0x29, 0x01, 0x70, 0x66, 0x8f, 0xcb, 0x28, 0x8a, 0xdb, 0xae, 0x12, 0x80, 0x72, 0x48, 0x3e, 0xd8, 0x29, 0xda, 0x25, 0x49, 0xe9, 0x5d, + 0xe8, 0x81, 0x96, 0x53, 0xff, 0xcd, 0x0c, 0x41, 0x71, 0xb5, 0x45, 0x52, 0xd9, 0x05, 0x84, 0xba, 0xfa, 0xff, 0xfa, 0xd3, 0x67, 0x95, 0x74, 0xab, 0x33, 0xc6, 0x1e, 0x43, 0x30, 0x5b, 0x84, 0x9b, + 0xa8, 0x75, 0xfe, 0x5c, 0x39, 0x43, 0x47, 0x2d, 0x38, 0xf8, 0x3e, 0x5b, 0x5a, 0x0b, 0x34, 0x40, 0xf0, 0x2d, 0x95, 0x02, 0x5f, 0x08, 0xf5, 0x42, 0x48, 0x6c, 0xc9, 0x88, 0xe2, 0x71, 0x14, 0x44, + 0xb2, 0x32, 0x5d, 0x94, 0xec, 0x23, 0x91, 0x2d, 0x40, 0x97, 0x26, 0xe9, 0x38, 0x14, 0x89, 0xee, 0x8d, 0xb3, 0x75, 0x5c, 0x5a, 0xf3, 0x32, 0x0a, 0x95, 0xc2, 0xcd, 0x57, 0xd0, 0x48, 0xb4, 0x84, + 0x3b, 0x22, 0x4f, 0xf1, 0x2f, 0x63, 0x39, 0x47, 0xf9, 0x4b, 0x2a, 0x5d, 0xf5, 0x7f, 0x67, 0x75, 0xba, 0x8a, 0x2c, 0x64, 0x92, 0x56, 0x0f, 0xd3, 0x22, 0x4b, 0xd8, 0x45, 0xe8, 0x00, 0x06, 0x0e, + 0xa6, 0xae, 0x2c, 0x44, 0xcb, 0xa8, 0x0c, 0x34, 0x8f, 0x90, 0xd1, 0x33, 0x5a, 0x6e, 0x9b, 0xf7, 0xd5, 0x19, 0x9c, 0x3a, 0x39, 0xf7, 0x47, 0x17, 0xa5, 0x39, 0xef, 0xd0, 0x69, 0x1d, 0x90, 0x0e, + 0x38, 0x2d, 0x24, 0x2b, 0x34, 0xb5, 0x71, 0xfa, 0x4b, 0xdc, 0x07, 0xce, 0x5e, 0x3a, 0xd7, 0xc5, 0x18, 0x40, 0xde, 0x78, 0xd9, 0xad, 0x50, 0x63, 0x20, 0xc8, 0xe2, 0x83, 0xe2, 0xf9, 0xb3, 0xb7, + 0xc7, 0x59, 0x86, 0xc7, 0xc4, 0x0e, 0x8d, 0x45, 0x0a, 0x63, 0x0e, 0xff, 0x34, 0x58, 0xb2, 0xbe, 0xbe, 0xba, 0xba, 0x0c, 0xa9, 0x5b, 0xef, 0x18, 0x1d, 0x2f, 0xd6, 0xc7, 0x06, 0x55, 0x06, 0xc5, + 0x4b, 0xf0, 0xae, 0x98, 0xaa, 0x9c, 0xd5, 0xa2, 0x5a, 0x06, 0x84, 0xa1, 0xad, 0x79, 0x46, 0xa0, 0x27, 0x31, 0xea, 0x9a, 0x81, 0x7a, 0xf4, 0x10, 0xbf, 0x6a, 0xe0, 0xd4, 0x57, 0xf8, 0x57, 0x3d, + 0xf4, 0xce, 0xa3, 0x16, 0xb1, 0xb9, 0x7b, 0x6b, 0x4d, 0x3d, 0x24, 0x23, 0x97, 0x0c, 0xbe, 0xfd, 0x78, 0x7a, 0xcc, 0x1b, 0x43, 0x01, 0x3f, 0x90, 0x14, 0x5d, 0x7b, 0xef, 0xa6, 0x1f, 0x50, 0x70, + 0x8e, 0x30, 0x90, 0xfe, 0xa5, 0x4a, 0x5c, 0x88, 0x89, 0xd4, 0xef, 0x0c, 0x14, 0x96, 0x3b, 0xaf, 0xfe, 0xad, 0xa7, 0x77, 0x66, 0xec, 0x92, 0xb3, 0xca, 0xf9, 0xf2, 0x78, 0xf8, 0x9f, 0x15, 0xbe, + 0xe3, 0x05, 0xab, 0xc1, 0x3f, 0xe7, 0x40, 0x7f, 0xb6, 0xbc, 0xac, 0x7d, 0xc0, 0x29, 0xde, 0xc5, 0x57, 0x97, 0xcd, 0xdc, 0xaa, 0x59, 0x18, 0x48, 0xe2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0x01, 0x5f, 0xde, 0xc3, 0x35, 0x02, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x6c, 0x53, 0xcd, 0x6e, 0xdb, 0x3c, 0x10, 0xbc, 0xeb, 0x29, 0xe6, 0x46, 0x19, 0x50, 0xe4, 0xef, + 0x6b, 0x73, 0x92, 0xe3, 0x00, 0x45, 0x90, 0x02, 0xb9, 0xb7, 0xbd, 0x06, 0x04, 0xb9, 0x8e, 0xd8, 0x50, 0xa4, 0x4a, 0x2e, 0xe3, 0x18, 0x86, 0xdf, 0xbd, 0xa0, 0x7e, 0x2c, 0x05, 0xcd, 0x51, 0xb3, + 0x43, 0xed, 0xfc, 0x90, 0x22, 0x45, 0x42, 0xe4, 0x60, 0x14, 0x8b, 0x5d, 0x51, 0x98, 0xae, 0xf7, 0x81, 0xc1, 0x14, 0x19, 0x87, 0xe0, 0x3b, 0x08, 0x96, 0x3d, 0x89, 0xdd, 0x3c, 0x38, 0x83, 0xde, + 0x7b, 0x52, 0xfc, 0xe3, 0xd4, 0x13, 0x2e, 0x33, 0x25, 0xea, 0x35, 0xe3, 0xc1, 0xfa, 0xa4, 0x1f, 0xdf, 0xc8, 0xf1, 0x95, 0xa1, 0x32, 0x44, 0x19, 0x8a, 0x9f, 0x33, 0xbf, 0x27, 0xa7, 0xd8, 0x78, + 0x57, 0xe1, 0xc1, 0x3b, 0xa6, 0xf7, 0xe5, 0xe8, 0x41, 0xca, 0x78, 0xf3, 0x3b, 0xde, 0x84, 0xe4, 0xd8, 0x74, 0x1f, 0xa4, 0xb4, 0xd2, 0x69, 0x4b, 0x15, 0x1e, 0x52, 0x64, 0xdf, 0x51, 0xb8, 0x9e, + 0xa9, 0xeb, 0x6d, 0x0c, 0x2a, 0xfb, 0xd9, 0x6e, 0xf1, 0xe8, 0x62, 0x0a, 0x04, 0x6e, 0x25, 0x83, 0x5b, 0xc2, 0x61, 0x5a, 0x05, 0xe5, 0xbb, 0xde, 0x12, 0x53, 0x84, 0xb2, 0x24, 0x9d, 0x3d, 0xe1, + 0xd8, 0x92, 0x43, 0x2f, 0x63, 0x24, 0x0d, 0x89, 0x37, 0x69, 0x8d, 0xc6, 0xa0, 0xba, 0x2e, 0x72, 0x22, 0xa5, 0xf8, 0xe9, 0x0c, 0x37, 0xd3, 0xde, 0xf8, 0x91, 0x22, 0x2a, 0xc8, 0x78, 0x72, 0x0a, + 0x25, 0x6f, 0xb0, 0xbf, 0xc7, 0xb9, 0x00, 0xb8, 0xee, 0xad, 0x74, 0xe5, 0xed, 0x66, 0x57, 0x00, 0xca, 0xbb, 0xc8, 0xd0, 0x92, 0x65, 0xb3, 0x28, 0xde, 0x0f, 0x3c, 0xc0, 0xc9, 0x8e, 0x1a, 0x08, + 0x36, 0x2f, 0x14, 0x44, 0x35, 0x40, 0x6a, 0xe2, 0x3c, 0xe9, 0x06, 0xe2, 0xbf, 0xff, 0xbf, 0x7c, 0xbd, 0x15, 0x05, 0x70, 0xd9, 0x15, 0x05, 0xb0, 0xdd, 0xe2, 0xdb, 0x7a, 0x39, 0x8c, 0x53, 0x36, + 0x69, 0x8a, 0x30, 0xba, 0x02, 0xe7, 0x72, 0xa4, 0xd3, 0x88, 0x3e, 0x05, 0x45, 0x90, 0x0c, 0x89, 0xce, 0x38, 0xd3, 0xa5, 0xae, 0xbe, 0x2a, 0x59, 0x3a, 0x69, 0x56, 0x45, 0xdc, 0xcd, 0xd2, 0xee, + 0xb1, 0x87, 0xa3, 0xe3, 0x6a, 0x54, 0x8e, 0x52, 0xcd, 0xa2, 0x67, 0x14, 0x9a, 0xd7, 0x35, 0x10, 0xca, 0x77, 0x35, 0xbd, 0xcb, 0x9c, 0x69, 0xbd, 0xea, 0xbb, 0xce, 0xc9, 0x4d, 0xcc, 0x51, 0x4f, + 0x03, 0xb1, 0x5d, 0x81, 0x39, 0x91, 0x6c, 0x6c, 0x33, 0x3b, 0x7b, 0x72, 0x6f, 0xfe, 0x95, 0x3e, 0x76, 0x75, 0x34, 0xdc, 0x0e, 0xc8, 0xca, 0x74, 0x85, 0x63, 0x6b, 0x54, 0x8b, 0xd8, 0xfa, 0x64, + 0xf5, 0xb5, 0xce, 0x81, 0xeb, 0x13, 0x83, 0x42, 0xf0, 0x61, 0xf1, 0x1b, 0x28, 0x26, 0xcb, 0xd8, 0x43, 0x1e, 0xa5, 0xe1, 0xa9, 0xc4, 0xf2, 0x0c, 0xeb, 0x5f, 0x1a, 0x9c, 0x61, 0xdc, 0xc1, 0x37, + 0x28, 0x9f, 0x87, 0xf2, 0x9e, 0x71, 0xc1, 0x05, 0x32, 0xce, 0xb7, 0xb1, 0x5a, 0xa5, 0x35, 0x94, 0xc9, 0xb5, 0x7f, 0x2d, 0xc7, 0x3f, 0x4e, 0xdf, 0x9a, 0xa8, 0x7f, 0xfc, 0x93, 0xa4, 0x9d, 0xe0, + 0x3a, 0xfb, 0xaa, 0x06, 0x77, 0x13, 0x83, 0xd6, 0xd3, 0x1c, 0x5a, 0x05, 0x41, 0xaa, 0xf5, 0xe2, 0xb3, 0xf9, 0x18, 0x55, 0x05, 0x31, 0x47, 0x50, 0x0f, 0xcb, 0x7f, 0x19, 0x3a, 0x52, 0xb8, 0x9e, + 0x70, 0xba, 0xdc, 0xec, 0x8a, 0x21, 0xba, 0x4f, 0x6e, 0xfa, 0x68, 0x71, 0x09, 0xd1, 0xc4, 0xa1, 0xab, 0x1c, 0x55, 0x08, 0xa4, 0xd8, 0x9e, 0xea, 0x62, 0x79, 0xce, 0x77, 0xff, 0xbe, 0xc6, 0xfb, + 0x72, 0xfc, 0xc5, 0x66, 0x57, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf4, 0x10, 0xe2, 0xe7, 0xfb, 0x01, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xdd, + 0x6e, 0x23, 0x37, 0x0f, 0xbd, 0xf7, 0x53, 0x10, 0x73, 0x33, 0x89, 0x91, 0xd8, 0xd9, 0x7c, 0xf8, 0xb6, 0xad, 0xef, 0x16, 0x8e, 0x17, 0x48, 0xd1, 0x4d, 0x8b, 0x38, 0x05, 0x0a, 0x14, 0x45, 0x21, + 0x6b, 0x38, 0x36, 0x53, 0x0d, 0x35, 0x10, 0xa9, 0x24, 0x83, 0xc5, 0xbe, 0x7b, 0x21, 0xc9, 0x3f, 0x69, 0x7e, 0x8c, 0xf5, 0xcd, 0xd0, 0x33, 0xe2, 0xe1, 0xe1, 0x21, 0x75, 0xbe, 0x8e, 0x00, 0x2a, + 0x62, 0xeb, 0x62, 0x83, 0xd5, 0x0c, 0xfe, 0x1c, 0x01, 0x00, 0x54, 0x12, 0xec, 0x74, 0x3c, 0x9e, 0x8e, 0xab, 0x11, 0xc0, 0x5f, 0x67, 0xe9, 0x08, 0x3e, 0xed, 0x8f, 0x54, 0xec, 0x1b, 0xfc, 0xbb, + 0xf3, 0x4d, 0x74, 0x28, 0x55, 0xf9, 0x6c, 0x7d, 0xd7, 0x93, 0xc3, 0xf0, 0x6b, 0xaf, 0xe4, 0x59, 0xaa, 0x19, 0x7c, 0x2d, 0x48, 0x6a, 0xc2, 0x1a, 0xb5, 0x9a, 0x41, 0xb5, 0x58, 0x5e, 0x5e, 0x5c, + 0x5e, 0x54, 0x67, 0xf0, 0xee, 0x6f, 0x3a, 0x86, 0x65, 0x8f, 0x96, 0xda, 0x01, 0x16, 0xf3, 0x2f, 0x9f, 0x96, 0x36, 0x50, 0xaf, 0x50, 0x10, 0xe0, 0x01, 0x83, 0x90, 0xe7, 0x19, 0xd4, 0x8b, 0xe5, + 0xff, 0x6a, 0x38, 0x69, 0xb0, 0x35, 0xd1, 0xe9, 0xe9, 0x59, 0x7a, 0xf1, 0xff, 0x3a, 0x3f, 0x2e, 0x2f, 0x3e, 0x1c, 0xa2, 0x8f, 0xfb, 0xe8, 0x87, 0x7d, 0xf4, 0xe3, 0x3e, 0xfa, 0x69, 0x17, 0x5d, + 0x5e, 0xd4, 0x67, 0xe0, 0x43, 0xfa, 0x73, 0xb3, 0xf8, 0xe3, 0xae, 0x9e, 0xc0, 0x78, 0x5a, 0xa8, 0x97, 0x0e, 0x13, 0x75, 0xeb, 0xbb, 0xce, 0xf3, 0xbd, 0xbc, 0x4f, 0xfe, 0x19, 0xf5, 0x92, 0x06, + 0xd6, 0x37, 0x08, 0x6b, 0x64, 0x0c, 0x46, 0x0b, 0x6f, 0xf6, 0x8c, 0xa9, 0xea, 0x0e, 0x2d, 0xc5, 0xa6, 0x6b, 0xd2, 0x43, 0x06, 0x51, 0xec, 0x52, 0x14, 0xcb, 0x0b, 0x94, 0x5d, 0x2f, 0x29, 0x7a, + 0xce, 0x11, 0x9f, 0xf4, 0x19, 0x47, 0x1f, 0xf5, 0x8a, 0x42, 0xe2, 0x38, 0x99, 0xae, 0x22, 0xb9, 0xe6, 0x88, 0xbe, 0xd3, 0x31, 0xdc, 0x62, 0x43, 0x01, 0xad, 0x82, 0x8f, 0xda, 0x47, 0x05, 0xd1, + 0x10, 0xad, 0xc6, 0x80, 0xa0, 0x1e, 0x74, 0x83, 0x50, 0x3e, 0xfb, 0x30, 0x1c, 0x4a, 0x88, 0x06, 0xb2, 0x69, 0x82, 0x1a, 0x22, 0x1e, 0x99, 0xde, 0xb6, 0xc4, 0x82, 0xcd, 0xca, 0x21, 0x18, 0xe7, + 0xa0, 0x64, 0x82, 0x0e, 0x3d, 0x9e, 0xdb, 0x0d, 0xda, 0x7f, 0x88, 0xd7, 0xe0, 0xcb, 0x86, 0x1c, 0xf0, 0xd9, 0x5f, 0x77, 0xbd, 0x23, 0x4b, 0xfa, 0x89, 0x87, 0x6a, 0x06, 0xad, 0x71, 0xf2, 0x6e, + 0x9d, 0xd4, 0x83, 0x21, 0x41, 0xc0, 0x10, 0x7c, 0x00, 0xcf, 0x80, 0x4f, 0x7d, 0x40, 0x49, 0xab, 0x21, 0x60, 0xb8, 0x81, 0x06, 0xad, 0x33, 0x45, 0x73, 0x81, 0x47, 0xd2, 0x0d, 0x18, 0x06, 0x4a, + 0x15, 0xb0, 0x81, 0xda, 0xf0, 0x50, 0x67, 0x42, 0x2f, 0xfb, 0xbb, 0x89, 0xce, 0xcd, 0x13, 0x47, 0x39, 0xd6, 0xe9, 0xa1, 0xbf, 0x6d, 0x6f, 0x1c, 0x9d, 0x83, 0xdc, 0x9b, 0xbc, 0x44, 0xfc, 0x1c, + 0xd9, 0x26, 0x16, 0x77, 0x43, 0x8f, 0xef, 0x83, 0xbe, 0x42, 0x3c, 0x08, 0xd5, 0x42, 0xbb, 0x85, 0xc8, 0x8c, 0xdf, 0x94, 0xec, 0x6e, 0x43, 0x47, 0x09, 0xbf, 0xa5, 0x58, 0xad, 0x1b, 0x92, 0xfa, + 0x3f, 0xc2, 0x7d, 0x8f, 0x4e, 0xec, 0x7f, 0xe7, 0x28, 0xd8, 0xfc, 0xe2, 0xad, 0x71, 0xdf, 0x51, 0x14, 0x7b, 0x1f, 0xb4, 0x54, 0x95, 0x54, 0x36, 0xe6, 0x6c, 0x70, 0x39, 0xfd, 0x35, 0xec, 0x6f, + 0x26, 0x98, 0x0e, 0x15, 0xc3, 0x11, 0xe8, 0x23, 0xb0, 0xfd, 0x3e, 0xfd, 0x2d, 0x99, 0x6e, 0x51, 0x63, 0xe0, 0x63, 0xa4, 0x5f, 0x40, 0xc3, 0xe3, 0x06, 0x19, 0xd8, 0x6b, 0x5e, 0xe4, 0x7c, 0x97, + 0x7b, 0xa3, 0x1b, 0x01, 0xe2, 0xc3, 0x54, 0x42, 0x46, 0x05, 0x03, 0x0f, 0xc6, 0x45, 0x7c, 0x69, 0x1c, 0xb7, 0x28, 0xde, 0xc5, 0x74, 0x30, 0x5d, 0xcf, 0xe4, 0x99, 0x6f, 0xdd, 0xcd, 0xd7, 0xc6, + 0x11, 0xf6, 0x79, 0x69, 0x25, 0x8c, 0xe2, 0x7a, 0xc8, 0xe6, 0xd1, 0x60, 0x0d, 0x27, 0x37, 0xbe, 0xc1, 0xc9, 0xbd, 0x9c, 0x66, 0x37, 0xb0, 0xce, 0x88, 0x90, 0xad, 0xe1, 0x24, 0xed, 0xd8, 0xd6, + 0x2e, 0xfb, 0x80, 0xe7, 0x1f, 0x26, 0x1f, 0x4f, 0x0f, 0x74, 0x50, 0xbe, 0x64, 0xe4, 0x6b, 0x56, 0x0c, 0xbe, 0x3f, 0x3a, 0xb9, 0xfd, 0x3a, 0x0a, 0x60, 0x47, 0x0a, 0x54, 0x72, 0x30, 0x98, 0x15, + 0x39, 0xd2, 0x01, 0x56, 0xa8, 0x8f, 0x88, 0x0c, 0xf3, 0x6c, 0x62, 0x3f, 0x2f, 0xf3, 0x9d, 0x5b, 0x2c, 0xa1, 0x94, 0x10, 0x78, 0x20, 0x03, 0x36, 0x60, 0xbe, 0x7f, 0x69, 0x85, 0xd9, 0x74, 0x28, + 0xbd, 0xb1, 0x08, 0x7e, 0x75, 0x8f, 0x56, 0x05, 0x5a, 0x1f, 0xb2, 0xa8, 0xd4, 0x25, 0xb9, 0x65, 0x02, 0x79, 0x48, 0x28, 0x50, 0x1b, 0xe7, 0xfc, 0xe3, 0x72, 0x60, 0xdd, 0xa0, 0x92, 0xbd, 0x2a, + 0x06, 0x7f, 0x5d, 0x8e, 0x3d, 0xf3, 0xbc, 0xd6, 0x07, 0x8b, 0x73, 0xcf, 0x42, 0xa2, 0xc8, 0x3a, 0x37, 0x42, 0xbc, 0xbe, 0xe6, 0xcf, 0xe4, 0xf0, 0x26, 0x55, 0xdb, 0x36, 0xb8, 0xeb, 0xe7, 0x8a, + 0x24, 0x03, 0x03, 0xb1, 0xdd, 0x27, 0xb9, 0xe1, 0xdc, 0x9a, 0xb4, 0x37, 0x01, 0x5b, 0x0c, 0xc8, 0x16, 0x65, 0x67, 0x81, 0x62, 0x3a, 0x84, 0x96, 0xdc, 0x6e, 0xa0, 0xdf, 0x46, 0xdf, 0x46, 0xff, + 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x94, 0x91, 0xb1, 0x6a, 0xc4, 0x30, + 0x0c, 0x86, 0x77, 0x3f, 0x85, 0xd0, 0x7c, 0xe1, 0xe8, 0xea, 0xa9, 0x0f, 0x70, 0xd0, 0xa5, 0xdb, 0x91, 0xc1, 0x24, 0xea, 0x61, 0x70, 0xac, 0x54, 0x96, 0x69, 0x4b, 0xc8, 0xbb, 0x17, 0xdb, 0x69, + 0x28, 0x21, 0xcb, 0x4d, 0xc6, 0xe8, 0xfb, 0xa4, 0x5f, 0x68, 0x31, 0x00, 0x28, 0xcc, 0x8a, 0x16, 0x54, 0x32, 0x5d, 0xca, 0x7f, 0x76, 0x92, 0x48, 0xd0, 0x02, 0xbe, 0xea, 0xcf, 0x4c, 0x69, 0x10, + 0x3f, 0x6b, 0x47, 0x29, 0xf8, 0xa8, 0xd7, 0xad, 0xd8, 0xc0, 0x90, 0x1f, 0x3e, 0x26, 0xb4, 0x70, 0x37, 0x00, 0x70, 0xc6, 0x57, 0xb0, 0xa0, 0x42, 0xaa, 0x9e, 0x04, 0x01, 0xfa, 0xea, 0xd2, 0xb7, + 0x52, 0x1c, 0xff, 0xb9, 0x8d, 0xb7, 0x42, 0x03, 0x4f, 0x13, 0xc5, 0x91, 0xc6, 0xdd, 0xad, 0x63, 0xec, 0x49, 0x98, 0xf6, 0x74, 0x4f, 0x39, 0x67, 0xf0, 0x31, 0x9c, 0xe4, 0x40, 0x25, 0xda, 0xd2, + 0xea, 0x91, 0xbb, 0x81, 0x63, 0xe2, 0x40, 0x68, 0xe1, 0xe5, 0x20, 0x5d, 0x77, 0xfb, 0x6f, 0x95, 0xb2, 0x8c, 0x08, 0x0b, 0x5e, 0x60, 0x01, 0xa4, 0x38, 0xbe, 0x7d, 0xdc, 0x7c, 0x2c, 0x2e, 0xba, + 0xac, 0x8c, 0xb0, 0x56, 0xac, 0xdf, 0x1a, 0x7d, 0x66, 0xd6, 0x3a, 0xed, 0xbe, 0x6b, 0x98, 0x7c, 0x7c, 0x04, 0x6a, 0x0d, 0x5c, 0x08, 0xfc, 0xf5, 0x4e, 0xd3, 0x1c, 0x9c, 0xd2, 0xcd, 0x2b, 0x89, + 0x0b, 0x69, 0xbb, 0x17, 0xac, 0xbd, 0x01, 0x58, 0xcd, 0x6a, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x84, 0x7e, 0x8c, 0x5d, 0xd6, 0x00, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0xaa, 0xe6, 0x52, 0x50, 0x50, 0x2a, 0x4e, + 0xcd, 0xcd, 0x54, 0xb2, 0x52, 0x28, 0x29, 0x2a, 0x4d, 0xd5, 0x01, 0xf1, 0x4b, 0x8a, 0x12, 0x33, 0x73, 0x32, 0xf3, 0xd2, 0x9d, 0xf3, 0x73, 0x73, 0x13, 0x95, 0xac, 0x14, 0x94, 0xf2, 0xf2, 0xf3, + 0x52, 0x95, 0xc0, 0x52, 0xc5, 0x99, 0x79, 0xe9, 0x39, 0xa9, 0x81, 0xa5, 0xf9, 0x25, 0xa9, 0xc8, 0x3a, 0x0a, 0x8a, 0x32, 0xf3, 0x4a, 0xc2, 0x33, 0x53, 0x4a, 0x32, 0x94, 0xac, 0x14, 0x0c, 0x8d, + 0x0c, 0xb8, 0x6a, 0xb9, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x06, 0xc9, 0xf3, 0xed, 0x51, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xac, 0x58, 0x6d, 0x73, 0xdc, 0xb6, 0x11, 0xfe, 0xce, 0x5f, 0xb1, 0xb5, 0x3e, 0x58, 0xf2, + 0x9c, 0x48, 0x8d, 0x3b, 0x9d, 0xc9, 0x9c, 0x62, 0x6b, 0x62, 0x57, 0xad, 0x94, 0xaa, 0xb1, 0x47, 0xba, 0x24, 0xed, 0xa8, 0x9a, 0x12, 0x24, 0xf6, 0x8e, 0xb0, 0x41, 0x80, 0x01, 0xc0, 0x3b, 0xb3, + 0x71, 0xfe, 0x7b, 0x67, 0x01, 0xf0, 0x4d, 0x77, 0x72, 0x93, 0x69, 0x3e, 0xdd, 0x11, 0x5c, 0x2c, 0x9e, 0x7d, 0xf6, 0x15, 0x3c, 0x82, 0x55, 0xd7, 0xe0, 0x5d, 0x69, 0x44, 0xe3, 0xe0, 0x6a, 0xb5, + 0x7a, 0x0f, 0x7f, 0x69, 0x55, 0xe9, 0x84, 0x56, 0x49, 0xf2, 0x23, 0xca, 0x52, 0xd7, 0x08, 0x4e, 0x43, 0xa7, 0x5b, 0x03, 0x0a, 0x77, 0x53, 0xe9, 0x75, 0x14, 0x84, 0xc6, 0xe8, 0x0f, 0x58, 0xba, + 0x3f, 0xc0, 0xaa, 0x42, 0x28, 0xb4, 0x90, 0x68, 0x1a, 0xc9, 0x1c, 0x8e, 0x12, 0xa5, 0xe6, 0x08, 0x25, 0x53, 0x50, 0x20, 0xac, 0x75, 0xab, 0x38, 0x08, 0x05, 0xf7, 0xb9, 0x50, 0x1c, 0x3f, 0xa5, + 0xce, 0xe6, 0x0f, 0xc7, 0x69, 0xd6, 0x3f, 0x9c, 0xa4, 0xb0, 0xaa, 0x84, 0x1d, 0x37, 0xef, 0x84, 0x94, 0x60, 0xd0, 0x36, 0x5a, 0x71, 0xc2, 0x22, 0x54, 0xa9, 0x6b, 0xa1, 0x36, 0x01, 0xee, 0x5f, + 0x2f, 0x57, 0xc0, 0x14, 0x87, 0xf7, 0xef, 0xee, 0x56, 0x60, 0xf0, 0xa7, 0x16, 0xad, 0xb3, 0x69, 0x92, 0x1c, 0x1d, 0xc1, 0x8d, 0x2e, 0x99, 0x04, 0xfc, 0x84, 0x65, 0x1b, 0x0c, 0x5a, 0x69, 0x30, + 0xad, 0x02, 0x49, 0xeb, 0xb2, 0x4b, 0x92, 0x3c, 0xcf, 0x4b, 0xad, 0xac, 0x96, 0x98, 0xa8, 0xa6, 0x06, 0xa1, 0xac, 0x63, 0x52, 0xfa, 0xff, 0x24, 0x57, 0xb4, 0x42, 0xf2, 0xe1, 0xc9, 0xef, 0xa2, + 0x2d, 0x49, 0x42, 0x76, 0x9a, 0x56, 0x39, 0x51, 0x63, 0x40, 0x87, 0x9f, 0x1a, 0x6d, 0x11, 0x5c, 0x65, 0x10, 0x01, 0x15, 0x6f, 0xb4, 0x50, 0x1e, 0x05, 0xc0, 0x0b, 0xc8, 0xb3, 0xdc, 0x33, 0xd3, + 0xaf, 0xc3, 0x5a, 0x9b, 0x40, 0x68, 0x6f, 0x62, 0x1a, 0xe5, 0x2a, 0x64, 0xd2, 0x55, 0x99, 0x41, 0xc6, 0x85, 0x42, 0x6b, 0x0f, 0xec, 0x63, 0x30, 0xbc, 0x85, 0x20, 0x0e, 0x65, 0x85, 0xe5, 0xc7, + 0xb9, 0x06, 0x29, 0xb6, 0xf8, 0xa4, 0x82, 0xfe, 0xe5, 0x7c, 0xbf, 0x37, 0xaa, 0x61, 0x86, 0xd5, 0xe8, 0xd0, 0x90, 0x4f, 0xb7, 0x82, 0xa3, 0x27, 0xdc, 0x55, 0x13, 0x57, 0x0e, 0xca, 0x98, 0x03, + 0xa1, 0xb6, 0xba, 0x64, 0x7e, 0x59, 0x58, 0x60, 0x90, 0xbf, 0xd5, 0xca, 0xe1, 0x27, 0x97, 0x83, 0x2e, 0x28, 0x22, 0xa0, 0xd4, 0xca, 0x31, 0xa1, 0x06, 0x67, 0x45, 0xff, 0x80, 0x50, 0x6b, 0x6d, + 0x6a, 0x16, 0x6c, 0x27, 0x4e, 0x3f, 0xd8, 0x64, 0x38, 0xa1, 0x62, 0x8a, 0x4b, 0xbc, 0x0d, 0xa2, 0xc7, 0x65, 0x50, 0x79, 0x02, 0x3f, 0x27, 0x40, 0xfa, 0xac, 0x03, 0xa9, 0x37, 0xf0, 0x0a, 0xe2, + 0x8b, 0x54, 0xea, 0xcd, 0x79, 0x02, 0xb4, 0x98, 0x92, 0xda, 0x7e, 0x43, 0x5a, 0x39, 0xd7, 0xfc, 0x80, 0xc6, 0x0a, 0xad, 0x4e, 0x0e, 0x0a, 0xd4, 0xe8, 0x2a, 0xcd, 0x4f, 0xce, 0x21, 0xcb, 0xbc, + 0x89, 0x33, 0x84, 0xe1, 0x25, 0x1c, 0x6b, 0x25, 0x3b, 0x1f, 0x63, 0xda, 0x84, 0x10, 0xb3, 0x6d, 0xd3, 0x68, 0xe3, 0x90, 0x9f, 0x1c, 0xd2, 0xf9, 0x53, 0x8b, 0xa6, 0x0b, 0x2a, 0xc5, 0x1a, 0xfc, + 0xd3, 0x48, 0xaa, 0x05, 0x66, 0x70, 0x64, 0x56, 0x28, 0x60, 0x5e, 0x75, 0x3c, 0xf3, 0x90, 0xbe, 0x42, 0xf3, 0xa8, 0x2e, 0x52, 0x69, 0x3d, 0xd4, 0x1e, 0x25, 0xbd, 0x8e, 0x5e, 0x9d, 0xc6, 0xff, + 0x41, 0x3a, 0x90, 0x71, 0x34, 0x36, 0x28, 0x63, 0x52, 0x06, 0x73, 0xe3, 0x2a, 0x58, 0x54, 0x0e, 0x76, 0xc2, 0x55, 0x5e, 0x3d, 0x6e, 0x51, 0xb9, 0xe4, 0x97, 0x31, 0xd8, 0xa7, 0x91, 0x62, 0xfb, + 0x44, 0x66, 0x65, 0x89, 0xd6, 0x06, 0x43, 0x7c, 0x38, 0x17, 0x46, 0xef, 0x2c, 0x1a, 0x8a, 0x8c, 0x7b, 0x62, 0x7f, 0x99, 0x65, 0x3e, 0x69, 0x2a, 0x6d, 0xdd, 0xf2, 0xab, 0xb3, 0xaf, 0xce, 0xf6, + 0x02, 0xfc, 0xe1, 0xf8, 0xc4, 0x27, 0xef, 0x97, 0xc5, 0xfb, 0x80, 0x7d, 0x38, 0x3e, 0x49, 0xe1, 0x9f, 0xba, 0xf5, 0x00, 0x5a, 0x8b, 0x90, 0x97, 0xad, 0x91, 0x39, 0x85, 0x68, 0x4e, 0xe6, 0xe7, + 0xc0, 0x54, 0xc0, 0xfe, 0x64, 0xd4, 0x2e, 0x67, 0x49, 0x4f, 0xdb, 0xe1, 0xf4, 0x1f, 0x81, 0xbb, 0x53, 0x0e, 0xcf, 0x7f, 0x7e, 0x56, 0xa1, 0x94, 0xfa, 0xd9, 0x12, 0x9e, 0xed, 0xb4, 0x91, 0xfc, + 0xd9, 0x2f, 0xcf, 0xe1, 0x5f, 0x09, 0xc0, 0xe9, 0xd5, 0x73, 0x1f, 0xda, 0xca, 0x9d, 0xba, 0xae, 0xc1, 0x25, 0xb0, 0xa6, 0x91, 0x22, 0x84, 0x7e, 0xf6, 0xc1, 0x6a, 0x15, 0xc4, 0x0e, 0x5a, 0x31, + 0x29, 0x19, 0x43, 0xe6, 0x92, 0xcd, 0x43, 0x1a, 0x0e, 0xf5, 0xc2, 0xdb, 0x74, 0xaf, 0xb7, 0x68, 0xa4, 0x66, 0xfc, 0xb4, 0x31, 0xda, 0xa1, 0x87, 0xff, 0x70, 0x4c, 0x9a, 0xed, 0x32, 0xcb, 0x76, + 0xbb, 0x5d, 0xaa, 0x9a, 0xfa, 0x83, 0x4d, 0x4b, 0x5d, 0x67, 0x0d, 0x2b, 0x3f, 0xb2, 0x0d, 0x66, 0x07, 0xb6, 0x04, 0x5e, 0x67, 0xa5, 0xd3, 0xbb, 0x37, 0xf7, 0x6e, 0xff, 0xd3, 0xd9, 0x1f, 0xe1, + 0x0e, 0xcd, 0x56, 0x94, 0x08, 0xdf, 0x2b, 0xb6, 0x65, 0x42, 0xb2, 0x42, 0x62, 0x1e, 0x64, 0x28, 0x91, 0xa5, 0x20, 0x63, 0x6f, 0xd1, 0x99, 0x2e, 0x8f, 0x51, 0x42, 0x11, 0x3d, 0x2b, 0x5b, 0x94, + 0xf4, 0x9c, 0x02, 0xbb, 0x16, 0x2a, 0x54, 0x8a, 0x02, 0xa1, 0xc7, 0x82, 0x7c, 0x01, 0x05, 0xa3, 0xf0, 0xd0, 0xca, 0xfb, 0xa2, 0xc6, 0x5a, 0x9b, 0x0e, 0x5a, 0xcb, 0x36, 0xe8, 0xc1, 0x05, 0x4f, + 0x49, 0xad, 0x1b, 0xe0, 0x28, 0x59, 0x17, 0x8a, 0x36, 0x11, 0xd5, 0xb7, 0x20, 0xb8, 0x56, 0x0e, 0xcd, 0x9a, 0x95, 0x18, 0x08, 0xcc, 0xad, 0x29, 0x87, 0x3e, 0x91, 0xc3, 0x5a, 0x48, 0x84, 0x9a, + 0x75, 0xbe, 0xfc, 0x1a, 0x07, 0x0c, 0xac, 0x50, 0x1b, 0x39, 0x71, 0xbb, 0xcf, 0x8c, 0xbc, 0x57, 0x97, 0x27, 0xa1, 0x2c, 0xa5, 0xfe, 0x90, 0x71, 0xb9, 0xaf, 0x56, 0x4c, 0x4a, 0xbd, 0x23, 0x93, + 0xb6, 0x28, 0x75, 0x43, 0x69, 0xe1, 0x34, 0x30, 0x4e, 0xae, 0x5a, 0x63, 0xd9, 0x95, 0x12, 0xa1, 0xd2, 0xfa, 0xa3, 0xa5, 0x8c, 0x4b, 0x84, 0x12, 0x4e, 0x30, 0x29, 0xfe, 0x13, 0xea, 0x1f, 0x19, + 0x64, 0xab, 0xd6, 0x71, 0xbd, 0x53, 0x0b, 0x60, 0x16, 0x76, 0x28, 0x25, 0xfd, 0x86, 0x74, 0xa7, 0x0a, 0xc8, 0x60, 0xc7, 0x3a, 0xdf, 0xc0, 0xea, 0x46, 0x62, 0x4d, 0xc6, 0x97, 0xad, 0x75, 0xba, + 0x4e, 0x66, 0xe9, 0x95, 0x46, 0x5b, 0x47, 0x78, 0xa2, 0x67, 0x21, 0x10, 0xbe, 0xf6, 0x6c, 0x33, 0x1b, 0x62, 0x99, 0xe2, 0xd1, 0xfa, 0x86, 0x9c, 0x44, 0x1a, 0x46, 0xf1, 0x81, 0x47, 0xaa, 0x9d, + 0x59, 0xe6, 0xcd, 0x7e, 0x84, 0xbb, 0xa7, 0x6a, 0x01, 0xd4, 0x13, 0x91, 0x43, 0x81, 0x6b, 0x6d, 0xd0, 0x7b, 0xcc, 0xa2, 0xd9, 0x92, 0xdb, 0x2d, 0x58, 0xc7, 0xa8, 0xe4, 0xf5, 0x5a, 0xa6, 0xdd, + 0x59, 0x58, 0xd0, 0x0d, 0xfd, 0x63, 0x32, 0x92, 0xa0, 0x5b, 0x49, 0x6a, 0xc0, 0x76, 0xaa, 0xac, 0x8c, 0x56, 0xba, 0xb5, 0xd4, 0xe0, 0xe8, 0xe0, 0x8b, 0x25, 0x1c, 0x9f, 0xc0, 0xab, 0xd7, 0xc0, + 0x54, 0x77, 0x9e, 0x8c, 0xa0, 0x7a, 0xe6, 0xf6, 0xe1, 0xb0, 0x35, 0x75, 0xa3, 0xc7, 0x68, 0x74, 0xd3, 0xfc, 0x9f, 0x68, 0xfa, 0x13, 0x9f, 0x42, 0x34, 0x64, 0xe7, 0x1e, 0x22, 0xa7, 0x83, 0xa3, + 0x28, 0x1d, 0xe6, 0xb8, 0x18, 0x6d, 0xfa, 0x0d, 0xa8, 0x0c, 0xba, 0xd6, 0x28, 0x78, 0x79, 0x76, 0x96, 0xbd, 0xfb, 0xdb, 0x13, 0xea, 0x08, 0x6b, 0x8f, 0xe5, 0x62, 0x09, 0x57, 0x3e, 0x52, 0xde, + 0xd2, 0xf9, 0x53, 0xb4, 0x63, 0x65, 0xf9, 0x0d, 0x70, 0x69, 0x93, 0x8f, 0x47, 0x2a, 0xe4, 0x8d, 0x1b, 0x86, 0xa7, 0xdf, 0xcf, 0x02, 0x7f, 0x02, 0x59, 0x30, 0xe0, 0x3b, 0x60, 0x82, 0xd4, 0x9b, + 0x1b, 0xca, 0xb8, 0x8b, 0x25, 0xdc, 0xc4, 0xbf, 0x53, 0xd3, 0x06, 0x08, 0x4e, 0xc7, 0xc9, 0x60, 0xd6, 0xa8, 0x09, 0x6d, 0x58, 0x5e, 0xc2, 0x5b, 0xa9, 0x5b, 0x7e, 0x49, 0x55, 0x65, 0x08, 0xfc, + 0xcf, 0x5e, 0xb8, 0x7f, 0x3c, 0xef, 0x7b, 0xda, 0xd1, 0x11, 0x5c, 0x05, 0x5d, 0x77, 0x62, 0xa3, 0x98, 0x6b, 0x4d, 0xac, 0x30, 0x5e, 0xf5, 0x68, 0xf5, 0xaf, 0x4c, 0xbc, 0x51, 0x6e, 0x7a, 0x9a, + 0xcf, 0xba, 0xbe, 0xff, 0x2e, 0x21, 0xce, 0x46, 0x0b, 0xdf, 0xb4, 0x2f, 0x96, 0x70, 0x1d, 0xc7, 0xd8, 0x37, 0xd4, 0xe2, 0x97, 0xb3, 0x9d, 0xb7, 0x9e, 0xd6, 0x01, 0xed, 0x8f, 0x15, 0xc6, 0x8c, + 0xcc, 0xa7, 0x9b, 0x72, 0x42, 0x85, 0xc2, 0x55, 0xd4, 0x72, 0xc1, 0x3a, 0x23, 0xd4, 0x66, 0x01, 0x0c, 0xde, 0xb4, 0xeb, 0x35, 0x1a, 0xfa, 0xf7, 0x2d, 0xdb, 0xb2, 0x38, 0xac, 0x87, 0x12, 0xb7, + 0xa0, 0x8a, 0xd8, 0xaa, 0x68, 0xca, 0x02, 0x38, 0x36, 0xa8, 0x7c, 0x71, 0xa2, 0x39, 0xbb, 0x62, 0x0e, 0x76, 0xcc, 0xfa, 0x11, 0x47, 0x8a, 0xd0, 0xd8, 0x87, 0xc1, 0xc8, 0xf7, 0xc8, 0x1a, 0xad, + 0x2f, 0xdf, 0x64, 0x42, 0xac, 0xa2, 0x57, 0xab, 0x3d, 0xe0, 0x39, 0x10, 0x37, 0xff, 0x83, 0x33, 0x2f, 0xb2, 0x6f, 0x34, 0xbc, 0x82, 0xf7, 0x46, 0xd7, 0xc2, 0xe2, 0xd7, 0x77, 0xce, 0xb4, 0x25, + 0xb9, 0x86, 0x87, 0x57, 0xaf, 0xe1, 0x33, 0x3c, 0x5e, 0x83, 0xcf, 0x70, 0xeb, 0xdb, 0x9b, 0x45, 0xa2, 0x04, 0x3e, 0xc3, 0x56, 0x0b, 0x7e, 0xbe, 0xc7, 0xdb, 0xe3, 0x7d, 0x79, 0x18, 0x58, 0xf7, + 0x08, 0x1a, 0x67, 0xa0, 0xb5, 0xa6, 0x6e, 0x40, 0xd4, 0x34, 0x86, 0x9a, 0x81, 0x13, 0xf8, 0x25, 0xc7, 0xef, 0x01, 0x23, 0xe7, 0x5b, 0xc7, 0x5c, 0x6b, 0xdf, 0x6a, 0x8e, 0x17, 0x4b, 0x50, 0x6d, + 0x5d, 0xa0, 0xa1, 0x49, 0x34, 0x0e, 0x5d, 0x17, 0x4b, 0xb8, 0xc5, 0x52, 0x1b, 0xfe, 0x75, 0xef, 0xbb, 0xf0, 0xfb, 0x9a, 0x64, 0x62, 0x90, 0x4c, 0x8d, 0x1b, 0xe2, 0xe1, 0x7a, 0x3d, 0x1f, 0x6e, + 0x42, 0x16, 0xfa, 0x01, 0x7c, 0xdf, 0xce, 0xde, 0xf1, 0xae, 0xc2, 0xe0, 0xcd, 0x7c, 0x44, 0x95, 0xfb, 0x5c, 0xce, 0x23, 0x9e, 0x7c, 0x62, 0xa9, 0x9f, 0x54, 0x5b, 0x1b, 0xeb, 0x07, 0x4d, 0xdd, + 0xa4, 0x77, 0x3a, 0x26, 0x07, 0x5c, 0x29, 0x44, 0x30, 0x79, 0xe1, 0x23, 0x32, 0x6a, 0xe8, 0x88, 0xde, 0xc6, 0x20, 0x8d, 0x95, 0x0b, 0x10, 0x8e, 0x1e, 0xbd, 0x36, 0xd6, 0xcf, 0xaf, 0x61, 0x7b, + 0x0c, 0xa4, 0xa7, 0x0c, 0xca, 0xc9, 0x99, 0x39, 0xc5, 0x6c, 0x3e, 0x04, 0x6d, 0x3e, 0x31, 0x65, 0xa6, 0xc6, 0x67, 0x43, 0xdd, 0xb8, 0xae, 0x6f, 0xa0, 0x53, 0xee, 0x9e, 0xca, 0x95, 0xc3, 0x19, + 0xd2, 0xe7, 0x50, 0xba, 0xff, 0xde, 0x86, 0x99, 0xaa, 0xf0, 0x65, 0xce, 0xf7, 0xd1, 0x60, 0xd5, 0xb7, 0x77, 0xef, 0xbe, 0x4b, 0xe3, 0xb6, 0xa9, 0x0c, 0x5d, 0x94, 0x2c, 0x14, 0x42, 0x31, 0xd3, + 0x01, 0x67, 0x8e, 0xf9, 0x29, 0xe7, 0x28, 0x56, 0x41, 0xf0, 0x65, 0xd0, 0x7e, 0xa1, 0xe3, 0x33, 0x69, 0x75, 0x3f, 0x98, 0xd0, 0xa0, 0x4f, 0x66, 0x33, 0xce, 0x45, 0x18, 0x6f, 0xd6, 0xe4, 0xf3, + 0xf1, 0xb2, 0xe7, 0xbd, 0x39, 0xb9, 0x3d, 0x0e, 0xf7, 0x4b, 0x4a, 0x55, 0x3b, 0x12, 0x3c, 0x77, 0xef, 0x38, 0x8e, 0xcc, 0xc7, 0xfc, 0xfe, 0xb8, 0x99, 0x96, 0xe9, 0x71, 0xd3, 0xee, 0xf0, 0x44, + 0xb7, 0x99, 0x8a, 0x84, 0x7e, 0x16, 0x94, 0x1c, 0x00, 0xf9, 0x2b, 0xb5, 0x3c, 0xd5, 0xb5, 0x7c, 0x14, 0x45, 0x0f, 0x6b, 0xbf, 0x6d, 0x66, 0xf0, 0x98, 0x23, 0x4a, 0xab, 0xd3, 0x97, 0x67, 0x67, + 0x31, 0x39, 0xfd, 0xa7, 0x89, 0x49, 0x48, 0xcd, 0xd0, 0x68, 0x65, 0x05, 0x47, 0x83, 0x1c, 0x5a, 0x15, 0xb8, 0xa1, 0xe0, 0xfa, 0x66, 0xc6, 0xd3, 0xa3, 0x69, 0xf8, 0xc9, 0x7a, 0x97, 0xbd, 0x78, + 0x91, 0xc0, 0x0b, 0x6f, 0xfd, 0xa4, 0x03, 0x4e, 0x3c, 0xcd, 0xbd, 0x64, 0x41, 0xb9, 0x77, 0xf8, 0x80, 0x05, 0xed, 0x17, 0xaa, 0x94, 0xad, 0xaf, 0xd8, 0x84, 0x76, 0xe8, 0xc9, 0x0d, 0xa3, 0xb2, + 0xa5, 0x61, 0x57, 0x89, 0xb2, 0xa2, 0x84, 0x1b, 0x07, 0x9f, 0x42, 0xb7, 0x8a, 0xa7, 0x09, 0xbc, 0xc8, 0xf6, 0x07, 0xc4, 0x29, 0x12, 0xdf, 0xad, 0x22, 0x9b, 0x4b, 0xb8, 0x72, 0xae, 0x79, 0x79, + 0xe7, 0x3b, 0x79, 0xbc, 0x89, 0x2f, 0xc0, 0x60, 0x23, 0xbb, 0x47, 0xaf, 0x42, 0x8a, 0x9d, 0x2c, 0xc3, 0xfc, 0x04, 0x1e, 0xc8, 0xc5, 0x32, 0x66, 0xd8, 0x50, 0xb1, 0xde, 0x74, 0x44, 0x0d, 0x6b, + 0x65, 0x28, 0x44, 0x8f, 0x02, 0x8d, 0x82, 0xd1, 0xa3, 0xec, 0xaf, 0x6d, 0x07, 0xbe, 0x63, 0xf8, 0xd0, 0x3e, 0xf0, 0x81, 0x84, 0xce, 0xb3, 0xe3, 0xad, 0x90, 0x6e, 0x1f, 0x46, 0x70, 0xaa, 0xfa, + 0xc2, 0x42, 0xd1, 0x81, 0x45, 0xe7, 0x7a, 0xb6, 0x72, 0x12, 0x9e, 0xd4, 0xa8, 0x78, 0x31, 0xc9, 0x27, 0x2c, 0xe4, 0xd3, 0x32, 0xf0, 0x78, 0xfb, 0xcd, 0xf5, 0x0f, 0x97, 0xdf, 0x5d, 0xde, 0xdd, + 0xfd, 0xfb, 0xfb, 0xdb, 0x9b, 0x88, 0xe8, 0xf6, 0xf2, 0x9b, 0x3f, 0x5f, 0x8f, 0x6b, 0xa8, 0xb6, 0xc2, 0x68, 0xe5, 0x93, 0x69, 0xcb, 0x8c, 0xa0, 0x4b, 0x55, 0xfc, 0x18, 0xb5, 0x42, 0x4b, 0x9a, + 0x28, 0xd5, 0xa7, 0x83, 0x55, 0xfc, 0x76, 0x16, 0xfd, 0xea, 0x9d, 0x7f, 0xdf, 0x2a, 0xe1, 0xc0, 0xa1, 0x75, 0x0f, 0xc7, 0x69, 0x46, 0xbf, 0x19, 0xad, 0xa4, 0xce, 0x86, 0x4b, 0x1d, 0x53, 0x70, + 0x4f, 0x2e, 0xdc, 0x98, 0x30, 0xc2, 0xcf, 0x24, 0x27, 0x2f, 0xc2, 0xb7, 0xb4, 0xbf, 0x6b, 0x2e, 0xd6, 0x5d, 0xc8, 0x87, 0x50, 0xdc, 0x38, 0x1f, 0x2a, 0x08, 0x93, 0x7e, 0xb7, 0x1d, 0x3f, 0x49, + 0x15, 0xad, 0x0d, 0x83, 0xa4, 0xd4, 0x1b, 0x51, 0xa6, 0x7b, 0xdf, 0xc8, 0x48, 0xdc, 0xfb, 0xf4, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x37, 0xb4, 0x4f, 0xba, 0x85, 0x07, + 0x00, 0x00, 0x39, 0x14, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xfd, 0x59, 0x97, 0xfa, 0xca, 0x92, 0x27, 0x0a, 0xbe, 0xd7, 0xa7, 0xd8, 0xeb, 0xff, 0xd8, 0x14, 0xa1, 0x79, 0x20, 0x57, 0x9f, 0xec, 0xd4, 0xc0, 0x8c, 0x10, + 0x02, 0x89, 0x41, 0xbd, 0xfa, 0xf4, 0xd2, 0x3c, 0xa0, 0x79, 0x44, 0xba, 0x75, 0xcf, 0x67, 0xbf, 0x0b, 0x01, 0x11, 0x10, 0x01, 0x81, 0x82, 0xff, 0x3e, 0x95, 0x95, 0x79, 0xf6, 0x4b, 0x84, 0x24, + 0x97, 0x4c, 0xe8, 0x67, 0xe6, 0x6e, 0xe6, 0xe6, 0x66, 0xe6, 0xff, 0xd7, 0xff, 0xf8, 0xe3, 0x8f, 0x5f, 0x81, 0xe2, 0x1b, 0xbf, 0xfe, 0xed, 0x8f, 0x5f, 0x46, 0x61, 0x04, 0x59, 0xd7, 0x56, 0x02, + 0xdd, 0x33, 0x92, 0x5f, 0xff, 0xf3, 0xd8, 0x54, 0x18, 0x49, 0xea, 0x84, 0xc1, 0xb1, 0x15, 0x7c, 0x83, 0xde, 0xc0, 0xd3, 0x55, 0x2f, 0xd4, 0xf6, 0xa6, 0xe3, 0x19, 0xeb, 0xf7, 0x56, 0xb8, 0xb9, + 0x9e, 0x18, 0x71, 0xee, 0x24, 0x46, 0xfa, 0xeb, 0xdf, 0xfe, 0xc8, 0x92, 0xdc, 0x68, 0xae, 0x45, 0x8a, 0xb6, 0x57, 0xac, 0xe6, 0xda, 0xf1, 0x65, 0x7f, 0xfc, 0xf1, 0xeb, 0xfd, 0xe8, 0xdb, 0x57, + 0x37, 0xcd, 0x77, 0x5f, 0xdf, 0xb4, 0x78, 0x8e, 0x66, 0x04, 0x69, 0xf3, 0x2c, 0x15, 0x29, 0x9a, 0x6d, 0x74, 0xe1, 0xeb, 0x66, 0xdd, 0x88, 0x8c, 0x40, 0x37, 0x02, 0xcd, 0xb9, 0x7a, 0x73, 0xd3, + 0xf2, 0x1f, 0x59, 0x15, 0x19, 0x29, 0x10, 0x84, 0x7a, 0xf3, 0xf0, 0xdf, 0x61, 0xf0, 0x0d, 0x7d, 0x83, 0xdf, 0x9f, 0xfc, 0xe3, 0x8f, 0x5f, 0xa6, 0xa2, 0xa4, 0x5d, 0x37, 0xed, 0x26, 0x79, 0x90, + 0x39, 0xfe, 0xf9, 0xae, 0x37, 0xf8, 0x0d, 0xfe, 0x75, 0xbe, 0xe7, 0xff, 0xbe, 0x7a, 0x4d, 0xc1, 0x3e, 0x7b, 0x53, 0xa6, 0x44, 0x27, 0x1a, 0xe8, 0x1b, 0x84, 0x5c, 0xfd, 0xc6, 0xf7, 0x3b, 0xb4, + 0xc4, 0x89, 0xb2, 0xae, 0x91, 0x7a, 0x4e, 0x90, 0x01, 0xa7, 0x7f, 0xdd, 0xc8, 0xcb, 0x2d, 0x27, 0x38, 0x3f, 0x06, 0xa3, 0x4f, 0x1f, 0x8b, 0x94, 0x24, 0x35, 0x92, 0x07, 0xf7, 0x9f, 0xee, 0x69, + 0x1a, 0x89, 0x37, 0x18, 0xbf, 0xd7, 0xd8, 0xd5, 0xc2, 0xc0, 0x74, 0xac, 0x6e, 0x94, 0x18, 0x59, 0xe6, 0x9c, 0x29, 0x91, 0x6f, 0xc8, 0xdd, 0x7b, 0x4f, 0x3f, 0xee, 0xf6, 0x5e, 0xe4, 0xed, 0xd3, + 0x4b, 0x8f, 0x00, 0xfb, 0x27, 0xd6, 0xfd, 0x1d, 0x79, 0x03, 0xdf, 0xa0, 0xeb, 0xc6, 0x9b, 0x47, 0xe1, 0xcf, 0xaf, 0x49, 0xf3, 0xc8, 0x48, 0x32, 0x23, 0x3d, 0xfd, 0x64, 0xfc, 0x0d, 0xb9, 0x7d, + 0xf8, 0x1b, 0x40, 0xb3, 0xb4, 0xfb, 0xce, 0xd8, 0xde, 0x1b, 0xf4, 0xe9, 0xb9, 0x54, 0x6f, 0x1a, 0xc0, 0x23, 0x40, 0x9f, 0x5a, 0x1e, 0x62, 0x00, 0xbd, 0x41, 0xe4, 0xa7, 0x77, 0xbc, 0x83, 0xdf, + 0xdc, 0x80, 0xbd, 0x41, 0x6f, 0xf8, 0xbb, 0x64, 0x34, 0xff, 0xcf, 0xf2, 0xd1, 0x40, 0xf0, 0xff, 0xf7, 0x43, 0x3d, 0xf7, 0x8c, 0x14, 0xf8, 0x0f, 0x45, 0x49, 0xed, 0x3c, 0x0b, 0x53, 0x3b, 0x51, + 0x32, 0xdb, 0x01, 0xca, 0x30, 0xd1, 0xbb, 0x65, 0xa2, 0x44, 0xd7, 0xdd, 0xe1, 0x4a, 0xde, 0xa1, 0x37, 0xf8, 0x0d, 0xff, 0x10, 0xe8, 0xc4, 0x48, 0x43, 0xaf, 0x30, 0x9a, 0x2f, 0xb0, 0xb3, 0x2c, + 0x4a, 0xff, 0x0d, 0x00, 0x12, 0xc3, 0x72, 0xd2, 0x2c, 0xa9, 0xde, 0x82, 0xc8, 0x77, 0xd3, 0xb7, 0x30, 0xb1, 0x1e, 0xbf, 0x05, 0xe8, 0x7e, 0x1c, 0x77, 0x1b, 0xda, 0x6f, 0x99, 0x55, 0x7f, 0xd0, + 0x77, 0x82, 0xcc, 0xb0, 0x12, 0x27, 0xab, 0x8e, 0x2f, 0x48, 0x6d, 0x05, 0x83, 0xe0, 0x2e, 0xb4, 0x73, 0x53, 0x78, 0x55, 0x70, 0xa4, 0x68, 0x7a, 0xfd, 0x25, 0xc0, 0xb3, 0x88, 0xc6, 0xbb, 0xf6, + 0x66, 0xc3, 0xcb, 0x2a, 0x46, 0x52, 0x70, 0x46, 0x94, 0x51, 0x1f, 0x5e, 0xf5, 0xb6, 0x26, 0xbd, 0x13, 0x9d, 0xb1, 0xd7, 0xd9, 0x0e, 0x6c, 0x61, 0x08, 0xab, 0x6e, 0x85, 0x2e, 0x72, 0x68, 0xdc, + 0xe9, 0x53, 0x1e, 0x33, 0x97, 0xea, 0x25, 0xbb, 0x63, 0xf5, 0x41, 0x39, 0xd8, 0x49, 0xd3, 0x62, 0xab, 0x8d, 0xa9, 0xbf, 0xfd, 0xed, 0xba, 0x9b, 0x16, 0x57, 0x63, 0x45, 0x73, 0xc9, 0x08, 0x2c, + 0x27, 0xf8, 0xdc, 0x95, 0x2e, 0x4c, 0xfd, 0xf7, 0xbf, 0x81, 0x6f, 0x10, 0xf8, 0x06, 0xb6, 0xc1, 0x5b, 0x55, 0x54, 0xc3, 0x03, 0xb4, 0x50, 0x37, 0xba, 0x66, 0x72, 0x1a, 0x66, 0xee, 0xe1, 0x4c, + 0xbc, 0x41, 0xf0, 0x1b, 0x04, 0xfd, 0x1c, 0xe9, 0xcf, 0xf4, 0x81, 0xee, 0xd5, 0x49, 0xf7, 0x4c, 0xf6, 0x39, 0xc8, 0x72, 0x06, 0x55, 0xa1, 0x4e, 0x1f, 0x20, 0x49, 0xab, 0x1c, 0x63, 0xc1, 0xad, + 0xf6, 0x9b, 0x40, 0x42, 0xed, 0x45, 0x6c, 0x97, 0x31, 0x61, 0x0f, 0x1d, 0x38, 0x18, 0xcc, 0xa0, 0x99, 0x41, 0x21, 0x7d, 0xc9, 0xeb, 0xc4, 0xf0, 0x4c, 0x38, 0x40, 0x38, 0x37, 0x5e, 0x59, 0x13, + 0xb0, 0x53, 0x13, 0x7a, 0xe0, 0x5b, 0xc5, 0xa2, 0x27, 0x64, 0x63, 0xcf, 0xc8, 0xfb, 0xe2, 0x90, 0x77, 0xf8, 0x11, 0xb4, 0xd4, 0xc6, 0xe5, 0x13, 0x90, 0xbf, 0x19, 0x1e, 0x4f, 0x9f, 0x65, 0x3b, + 0x96, 0xed, 0x39, 0x96, 0x7d, 0x19, 0x35, 0x20, 0xf0, 0x0d, 0x6d, 0x0f, 0xba, 0x6d, 0x78, 0x91, 0x91, 0x74, 0x0b, 0xc5, 0x73, 0x74, 0x25, 0x0b, 0x93, 0xae, 0xa3, 0x1b, 0x41, 0xe6, 0x98, 0xa7, + 0x4e, 0xf5, 0x80, 0x0b, 0xd7, 0xe3, 0xc7, 0x0f, 0x99, 0xf0, 0xcd, 0xfb, 0x80, 0xee, 0x77, 0xad, 0xdd, 0xd3, 0x7b, 0x9f, 0x73, 0x69, 0x8d, 0x64, 0x29, 0x51, 0x73, 0xab, 0x1c, 0xf3, 0x4c, 0xa7, + 0xdc, 0xb0, 0xeb, 0x4d, 0xbd, 0x64, 0x87, 0xe3, 0x79, 0xc7, 0x0b, 0x98, 0xbe, 0xa4, 0x2b, 0x5b, 0x2b, 0x5b, 0x8f, 0x26, 0xd6, 0x4c, 0x85, 0x92, 0xa1, 0x42, 0xe1, 0x2e, 0x97, 0x64, 0x74, 0xaf, + 0xef, 0xf7, 0x89, 0x19, 0x44, 0x9a, 0xe1, 0x76, 0x32, 0xee, 0x93, 0x52, 0x00, 0x50, 0x80, 0x8d, 0xcf, 0x27, 0xe6, 0x50, 0x88, 0x00, 0x03, 0x9a, 0xa0, 0x0f, 0xba, 0xc2, 0x73, 0x78, 0xaf, 0x98, + 0xf3, 0x4f, 0x00, 0xf3, 0x42, 0xfd, 0x08, 0xdd, 0xe5, 0xb8, 0x35, 0x50, 0xbb, 0x15, 0xc3, 0x97, 0x87, 0x42, 0xdc, 0xf5, 0xc7, 0xdc, 0x6a, 0xa8, 0xd0, 0x82, 0x8a, 0xed, 0x59, 0x36, 0x65, 0xc2, + 0x88, 0xd5, 0x1d, 0x69, 0x98, 0xc6, 0x91, 0x92, 0x45, 0x88, 0xc9, 0x7b, 0x63, 0xb4, 0x03, 0x8f, 0x84, 0xd5, 0x5e, 0xf4, 0xfb, 0xeb, 0x4d, 0xb0, 0xce, 0xab, 0x95, 0x4e, 0x31, 0x58, 0x7f, 0xc3, + 0xc4, 0xab, 0xcd, 0x46, 0x2c, 0x40, 0x47, 0xc5, 0x91, 0xa5, 0xbb, 0x24, 0x74, 0x91, 0xd6, 0xad, 0xdf, 0x16, 0xe7, 0x6f, 0x05, 0xb2, 0x11, 0xf0, 0x4f, 0xea, 0x4b, 0xb3, 0x15, 0x6f, 0x7f, 0x56, + 0x4f, 0xe0, 0x6d, 0x93, 0x9b, 0x76, 0xb3, 0x70, 0x6f, 0x04, 0xe9, 0x59, 0x09, 0xfd, 0x68, 0x3c, 0xfa, 0x40, 0xf7, 0xa6, 0x55, 0x09, 0x52, 0xa7, 0x9b, 0x66, 0x95, 0x77, 0xf3, 0x01, 0xd7, 0x4c, + 0x45, 0xde, 0xe0, 0xb7, 0x9f, 0x8f, 0x52, 0x57, 0x74, 0x81, 0xee, 0xf5, 0x59, 0xb7, 0xa1, 0xf7, 0x9c, 0x9f, 0x6b, 0x11, 0x94, 0xc7, 0xf8, 0x5e, 0x5e, 0xea, 0xa2, 0x4d, 0xee, 0xaa, 0x49, 0x89, + 0xac, 0x38, 0x75, 0xe7, 0x03, 0x79, 0x67, 0x1e, 0x9b, 0x29, 0x75, 0xe8, 0x47, 0x1b, 0x1e, 0x5c, 0x98, 0xbd, 0x34, 0x26, 0x01, 0xa3, 0x87, 0x6e, 0x0e, 0x07, 0x3e, 0x5a, 0x4c, 0x0f, 0xbd, 0xc1, + 0x12, 0x1a, 0x78, 0x15, 0x93, 0xf1, 0x6b, 0x76, 0xce, 0x0b, 0x1d, 0x32, 0xc8, 0xbc, 0x78, 0x70, 0x70, 0x96, 0x5a, 0x27, 0xc1, 0xe2, 0x67, 0x3a, 0xe0, 0x31, 0x3f, 0xb5, 0xd0, 0x0b, 0x93, 0xa3, + 0xa2, 0x2e, 0x8c, 0x24, 0x3b, 0x2b, 0xe8, 0xde, 0x15, 0xfe, 0x6d, 0xd5, 0xc8, 0x4f, 0x06, 0xb3, 0xfb, 0x1c, 0xbb, 0x08, 0xc8, 0x3d, 0x5e, 0xc1, 0x37, 0x26, 0x65, 0x5b, 0x5e, 0x35, 0x14, 0x8f, + 0x5a, 0xe4, 0xf8, 0xbf, 0xdb, 0xd0, 0x78, 0xce, 0x1f, 0x2e, 0x73, 0x3a, 0x66, 0xcf, 0x8b, 0x26, 0x73, 0xad, 0x1c, 0xa0, 0xd9, 0x66, 0x4d, 0x02, 0x7c, 0x22, 0x8a, 0xd9, 0x00, 0xb2, 0x64, 0xa7, + 0x63, 0x92, 0x83, 0xd8, 0xab, 0x28, 0x3d, 0xcc, 0x13, 0xc5, 0xd3, 0x06, 0x9b, 0x81, 0xb0, 0x19, 0xc0, 0x9d, 0xb9, 0xc5, 0x8c, 0x56, 0xb6, 0xbb, 0x67, 0xd4, 0xce, 0x78, 0x40, 0xcf, 0xe2, 0x9e, + 0x9a, 0xcb, 0x65, 0x1f, 0x3a, 0x68, 0x7b, 0x41, 0x42, 0x23, 0x63, 0x95, 0x0b, 0x2f, 0xf3, 0xe7, 0x56, 0x8e, 0x8f, 0x96, 0x1f, 0x7c, 0x6b, 0x6a, 0x19, 0xa9, 0xa6, 0x44, 0x46, 0x37, 0xcd, 0x12, + 0x27, 0xb0, 0xba, 0x89, 0x61, 0x19, 0x87, 0xe8, 0xcc, 0x47, 0xf0, 0x0d, 0xfb, 0x64, 0x05, 0x46, 0x61, 0x92, 0xa5, 0xdd, 0x86, 0xe7, 0x67, 0x5b, 0x0b, 0xf9, 0xcf, 0xe1, 0xf5, 0x27, 0xa9, 0xbb, + 0x6f, 0xaf, 0xf5, 0xde, 0x90, 0x9f, 0xf3, 0xfc, 0x9a, 0x72, 0x63, 0x41, 0x5c, 0x9d, 0x77, 0x1b, 0x9a, 0xcf, 0x65, 0x40, 0x30, 0x29, 0x29, 0xd3, 0x3b, 0xc5, 0x40, 0xa7, 0xb2, 0x81, 0xa0, 0x31, + 0x24, 0xc3, 0x54, 0xbb, 0x0c, 0x32, 0x77, 0x9b, 0xc3, 0x2a, 0xa6, 0x9c, 0x29, 0xac, 0xad, 0x58, 0xbc, 0x66, 0x69, 0x72, 0x8e, 0x68, 0x51, 0xda, 0xa7, 0xa9, 0x62, 0x79, 0x88, 0x7a, 0x35, 0x3f, + 0xb4, 0xf0, 0x21, 0xb0, 0x1a, 0x8d, 0x26, 0x3b, 0x4a, 0x24, 0x49, 0x40, 0xa9, 0x81, 0x71, 0xce, 0x0e, 0xa9, 0x59, 0x3a, 0x5f, 0xab, 0xc3, 0xd7, 0xc7, 0xdc, 0xd3, 0x37, 0x5c, 0x66, 0x76, 0xd0, + 0x1b, 0xf4, 0x86, 0xfc, 0x49, 0x1c, 0x08, 0x1e, 0x9b, 0x71, 0xa7, 0xd7, 0xbc, 0x06, 0x7f, 0x70, 0xb1, 0xde, 0x2e, 0x27, 0xdd, 0x86, 0xda, 0xf7, 0xc0, 0x43, 0xdd, 0xa8, 0x47, 0xaf, 0x9d, 0x9e, + 0xa3, 0x09, 0x85, 0xb1, 0x46, 0xa4, 0x71, 0xe5, 0x22, 0xc2, 0x98, 0xd3, 0x22, 0xb1, 0x60, 0xa4, 0xdf, 0xd4, 0xeb, 0xb7, 0xdf, 0x6e, 0x2b, 0x69, 0xd7, 0xf4, 0x14, 0xeb, 0xa1, 0x62, 0x00, 0x5f, + 0x50, 0xf6, 0x17, 0xa2, 0x47, 0x25, 0x7f, 0x3e, 0xec, 0x36, 0x94, 0x9e, 0x7d, 0x75, 0xa6, 0x2f, 0x25, 0x84, 0x19, 0xca, 0x89, 0x33, 0xd9, 0xf8, 0xe6, 0x7c, 0x68, 0x7a, 0xe1, 0x88, 0x24, 0xbc, + 0x75, 0x5e, 0x80, 0xbf, 0x65, 0xd8, 0xff, 0x7e, 0x2f, 0xfd, 0x32, 0x60, 0xdc, 0x43, 0x0b, 0x7b, 0xc3, 0x5e, 0x40, 0xeb, 0x96, 0x34, 0xd0, 0xfd, 0x74, 0xa1, 0xdb, 0x50, 0x6d, 0xd1, 0x51, 0xdd, + 0xb5, 0x5b, 0xea, 0xdb, 0x71, 0x86, 0x82, 0x24, 0x37, 0x76, 0xa8, 0x98, 0xd9, 0xa2, 0xa1, 0x34, 0x4d, 0x2d, 0x09, 0xee, 0xc7, 0xd4, 0xb0, 0x4e, 0xe1, 0x45, 0xb4, 0xf7, 0x51, 0x45, 0xd8, 0xa9, + 0xae, 0xdf, 0x91, 0xfb, 0x9b, 0xbe, 0xb6, 0x41, 0x57, 0xe6, 0x60, 0x2e, 0x26, 0x68, 0xce, 0xcd, 0x65, 0x5f, 0x01, 0x8d, 0x0a, 0x35, 0x31, 0xcf, 0x9a, 0x25, 0x7b, 0x1a, 0x54, 0xb6, 0xa0, 0xc0, + 0x85, 0xaf, 0xdb, 0xfa, 0x57, 0x82, 0x75, 0x9a, 0xa3, 0xff, 0x93, 0xc6, 0xd6, 0x1b, 0xd7, 0x46, 0xa2, 0x3d, 0xe0, 0x0c, 0xf8, 0x86, 0xbe, 0x60, 0xe0, 0x7c, 0x26, 0x0e, 0x74, 0xdf, 0x0f, 0xbb, + 0x0d, 0xc5, 0xe7, 0x5c, 0xc1, 0x0a, 0x42, 0x64, 0xfb, 0xbd, 0xc8, 0x5b, 0xdb, 0xc5, 0x41, 0x30, 0x36, 0xb3, 0x2d, 0x2b, 0x16, 0x83, 0x62, 0x42, 0xeb, 0x23, 0x3c, 0xea, 0xa7, 0x7a, 0xe0, 0xc1, + 0x16, 0xa0, 0x53, 0x51, 0xe6, 0xe7, 0x83, 0xfe, 0xc2, 0xd0, 0x05, 0xb4, 0x9f, 0xc4, 0x58, 0x92, 0xb2, 0xe9, 0xb6, 0xe3, 0x17, 0x14, 0x87, 0x43, 0xe0, 0xd8, 0x9e, 0x2b, 0x3c, 0xbc, 0xc1, 0xd6, + 0x90, 0xce, 0xf3, 0x01, 0x3b, 0x3d, 0xec, 0x7f, 0x43, 0x85, 0xba, 0xc5, 0xaf, 0x93, 0xdf, 0x03, 0x82, 0xdf, 0xd0, 0x6b, 0x8d, 0xa8, 0x1b, 0x6a, 0x7e, 0x62, 0x16, 0xfa, 0xd9, 0xb7, 0x61, 0xa4, + 0x51, 0x62, 0x9c, 0xfc, 0x1e, 0xc4, 0x67, 0x77, 0x8a, 0xe5, 0x85, 0xaa, 0xe2, 0x9d, 0xf4, 0xf1, 0x71, 0x52, 0x7a, 0xdb, 0xea, 0x58, 0x41, 0x98, 0x5c, 0xfc, 0x29, 0xe0, 0x95, 0xcb, 0xe1, 0xd8, + 0xe6, 0x1f, 0x85, 0xbc, 0x6b, 0x26, 0x46, 0x6a, 0xdf, 0x57, 0xe7, 0x6e, 0xda, 0xad, 0x14, 0xdf, 0x3b, 0x37, 0x42, 0x9f, 0x3c, 0x35, 0xbe, 0x13, 0x38, 0xbe, 0x92, 0x69, 0xf6, 0xbb, 0x84, 0xdd, + 0x7c, 0xcf, 0xd1, 0x08, 0x88, 0xba, 0x6e, 0x1a, 0x06, 0x5d, 0x2d, 0xf4, 0x7d, 0x23, 0xc8, 0x2e, 0x46, 0xc3, 0xf1, 0xeb, 0x7e, 0x26, 0x8a, 0x7f, 0x87, 0xc0, 0x23, 0x5e, 0xe0, 0x1f, 0xff, 0xeb, + 0x7f, 0xfd, 0xf1, 0xef, 0x7f, 0x83, 0xe0, 0xb6, 0x56, 0xf9, 0x67, 0xf1, 0xb9, 0x69, 0xbd, 0x00, 0x7e, 0x4f, 0x5c, 0xd1, 0x1b, 0xb7, 0x54, 0x5b, 0x71, 0x6d, 0x28, 0x02, 0xdd, 0xd3, 0xff, 0x6e, + 0x43, 0xe3, 0xb9, 0x80, 0xea, 0x61, 0xbf, 0xd4, 0x0b, 0x1f, 0x5d, 0x30, 0xc6, 0x14, 0x9d, 0x22, 0x4b, 0x61, 0x0e, 0xcb, 0x0c, 0x4c, 0xef, 0x24, 0x5a, 0x39, 0x94, 0x33, 0x6a, 0xc9, 0xc4, 0xb2, + 0xcf, 0xb9, 0xd9, 0x80, 0x54, 0x30, 0x68, 0x02, 0x2f, 0x55, 0xf0, 0x10, 0xad, 0xbd, 0x70, 0xb0, 0x0c, 0x18, 0x9e, 0x2d, 0x63, 0x37, 0x2a, 0x03, 0x2a, 0x54, 0x42, 0x34, 0x32, 0xbc, 0x39, 0xe9, + 0x21, 0xcb, 0x89, 0x5e, 0x20, 0xd6, 0xf2, 0x75, 0x01, 0xf5, 0x1b, 0x2e, 0x1d, 0x05, 0xe9, 0x8e, 0x47, 0xf4, 0xc9, 0x78, 0x81, 0xdf, 0x1b, 0x63, 0x22, 0xc3, 0x48, 0xae, 0xdd, 0xa8, 0x9c, 0x91, + 0x29, 0xb7, 0x04, 0x1e, 0x0e, 0xed, 0x4d, 0x6b, 0x18, 0x65, 0x4e, 0x18, 0x28, 0xde, 0xb5, 0x9e, 0xfd, 0xe3, 0x9d, 0xef, 0xbf, 0xc1, 0xff, 0x8f, 0x9e, 0x73, 0xd7, 0xe4, 0x80, 0xdf, 0x5e, 0x99, + 0x66, 0x9f, 0x89, 0x02, 0xdd, 0xcb, 0x51, 0xf7, 0x44, 0xe8, 0xb9, 0x1c, 0xd0, 0x9b, 0x31, 0x93, 0xd7, 0x35, 0x5b, 0xb0, 0xe1, 0x08, 0x43, 0xe7, 0xa3, 0x29, 0x93, 0x1a, 0xac, 0x12, 0x50, 0x76, + 0x1f, 0x61, 0x0c, 0x36, 0x4c, 0x2c, 0x76, 0x86, 0x71, 0x22, 0x3e, 0xe3, 0xb6, 0x5b, 0x17, 0xde, 0x30, 0x81, 0xde, 0x93, 0x18, 0x38, 0xad, 0xf5, 0x3d, 0x4a, 0x6d, 0x66, 0xa6, 0xab, 0x5b, 0x73, + 0x9a, 0xd9, 0xce, 0x24, 0x25, 0xd8, 0xee, 0xb4, 0x88, 0xa6, 0xa7, 0xfc, 0x6a, 0x33, 0x2c, 0x5f, 0xb7, 0xf3, 0xb2, 0x2a, 0x32, 0xba, 0xe6, 0xc5, 0x4d, 0x0b, 0xbe, 0x91, 0x3f, 0xee, 0xb4, 0xff, + 0xfe, 0x37, 0xf2, 0xeb, 0x13, 0x66, 0x1e, 0xe8, 0x4e, 0x60, 0xdd, 0x3e, 0x91, 0x27, 0xde, 0x35, 0xac, 0x96, 0x93, 0xd9, 0xb9, 0xfa, 0xa6, 0x85, 0x3e, 0x90, 0x46, 0x61, 0x90, 0x86, 0x49, 0x0a, + 0xa4, 0x4e, 0xa0, 0x1f, 0x59, 0x90, 0xd8, 0x79, 0xfa, 0xdb, 0x3d, 0xdf, 0x7f, 0xc4, 0xf4, 0x93, 0xd8, 0xff, 0x94, 0xe7, 0xfe, 0x91, 0xdd, 0x7e, 0xda, 0x6d, 0x9e, 0x7e, 0xce, 0xe8, 0x74, 0xb8, + 0x5f, 0x1c, 0x3a, 0x6b, 0x97, 0xcb, 0x7c, 0x0a, 0xe7, 0xb6, 0x30, 0x11, 0x52, 0xe8, 0x80, 0x1e, 0xf4, 0x67, 0x03, 0x46, 0x96, 0xd1, 0x15, 0xba, 0x8d, 0x8d, 0x21, 0xbf, 0x65, 0x0a, 0x9c, 0xcc, + 0xc4, 0x8e, 0xab, 0x22, 0xc5, 0x1e, 0x58, 0x56, 0xca, 0x74, 0xb3, 0x00, 0x17, 0xe2, 0xb4, 0xda, 0x64, 0xfe, 0x6c, 0xc5, 0x81, 0x6a, 0x47, 0xd1, 0x25, 0xb1, 0x5f, 0xa8, 0x29, 0xb4, 0xe8, 0x2b, + 0x23, 0xf8, 0x81, 0x9d, 0xf0, 0x2a, 0x42, 0xf7, 0x07, 0xef, 0xfb, 0x06, 0x2a, 0xf4, 0xc2, 0x48, 0x79, 0x87, 0xfe, 0xd1, 0xee, 0xfa, 0x7a, 0xb5, 0xdb, 0xd0, 0x7f, 0x0e, 0x2a, 0x6e, 0x2e, 0xb4, + 0xce, 0x12, 0x75, 0xec, 0x32, 0x5e, 0xe0, 0x73, 0x40, 0x19, 0x17, 0xb0, 0x09, 0x59, 0xdc, 0x88, 0xf4, 0xf8, 0x75, 0xb6, 0x11, 0x46, 0x61, 0xcc, 0xa0, 0xd5, 0x14, 0x0f, 0x57, 0xec, 0x7a, 0x1d, + 0x6a, 0xb9, 0x4f, 0xa5, 0x26, 0x13, 0xbb, 0xfb, 0x6d, 0x10, 0x3b, 0x3b, 0xce, 0xf6, 0xb9, 0x72, 0x05, 0xf8, 0xfd, 0xd1, 0x2c, 0x22, 0xd6, 0x86, 0xed, 0x65, 0x48, 0xec, 0xe1, 0x5e, 0xdf, 0x79, + 0xd6, 0x7b, 0xfe, 0xcf, 0x15, 0x7f, 0x53, 0x49, 0x33, 0xc7, 0xac, 0x00, 0xc5, 0x2d, 0x8e, 0x50, 0x46, 0x8e, 0xf7, 0xd0, 0x39, 0x8b, 0xbc, 0x64, 0x33, 0xdf, 0x7d, 0x03, 0xd0, 0xbd, 0x39, 0xed, + 0x22, 0xed, 0x0c, 0x67, 0x43, 0x55, 0xfb, 0x99, 0x37, 0x26, 0xf4, 0xc3, 0x76, 0x80, 0xd5, 0xce, 0x5c, 0x4f, 0x40, 0xcc, 0xe7, 0x77, 0xe4, 0x3c, 0x60, 0x9d, 0x05, 0x0d, 0x6d, 0x0b, 0xca, 0x9b, + 0x8d, 0xb4, 0x6c, 0x99, 0x01, 0x4b, 0xad, 0xc3, 0x20, 0x33, 0x86, 0x5f, 0x6f, 0x30, 0xc7, 0x97, 0xd6, 0xdb, 0x8e, 0x6f, 0x17, 0x92, 0x1d, 0xcc, 0x6b, 0x7f, 0x41, 0x8f, 0x8c, 0x52, 0xda, 0xf3, + 0x03, 0x6b, 0xe8, 0x31, 0x07, 0x4b, 0xa7, 0x3e, 0x79, 0xa1, 0x9e, 0xd9, 0x63, 0xe4, 0x1b, 0xf4, 0xc9, 0x74, 0x3a, 0x7e, 0x89, 0x19, 0x26, 0xbe, 0x72, 0xb6, 0x5b, 0xe0, 0xcf, 0x56, 0xd9, 0x11, + 0x81, 0x6e, 0x9e, 0x38, 0xbf, 0x3e, 0xfc, 0x88, 0x2f, 0x72, 0xe6, 0x93, 0xb7, 0xb0, 0xf9, 0x49, 0xf7, 0x58, 0x45, 0x36, 0x46, 0xd0, 0x8f, 0x79, 0xa5, 0xb8, 0xc5, 0x99, 0x33, 0x27, 0x02, 0xcf, + 0x39, 0x92, 0x2e, 0x73, 0x68, 0x1f, 0x69, 0x7c, 0xaf, 0x9a, 0x65, 0xbb, 0x03, 0x3d, 0x2d, 0x62, 0x53, 0x34, 0xec, 0xde, 0xb4, 0x96, 0xfb, 0x25, 0x8f, 0xac, 0xc4, 0x6a, 0x0b, 0x8d, 0xc4, 0x0e, + 0xca, 0x28, 0x6c, 0xcd, 0xe0, 0xa3, 0x48, 0x1c, 0xee, 0xec, 0xb1, 0xbd, 0x18, 0xd7, 0x6e, 0x6f, 0x9b, 0x4f, 0x25, 0x62, 0xba, 0x63, 0xcb, 0x40, 0x31, 0x6c, 0xcc, 0xd6, 0xf8, 0xd2, 0xad, 0x20, + 0x21, 0x9f, 0xd4, 0xf4, 0xa2, 0x25, 0x47, 0x1a, 0x58, 0x75, 0xc3, 0x88, 0xba, 0x46, 0x9c, 0x2b, 0xde, 0x95, 0xcd, 0x78, 0x85, 0x7d, 0x33, 0x46, 0xa4, 0x9a, 0x6d, 0xf8, 0x4a, 0x37, 0x4b, 0x94, + 0x23, 0x46, 0x67, 0x43, 0xf1, 0xb3, 0x3f, 0xf7, 0xbc, 0x6a, 0xdd, 0x35, 0x93, 0xd0, 0x3f, 0x3b, 0xa6, 0xde, 0x19, 0x76, 0xb3, 0x30, 0x9c, 0x27, 0x4e, 0xd7, 0xbd, 0x78, 0x7d, 0xef, 0xae, 0x07, + 0xdf, 0xed, 0xbc, 0x47, 0x3d, 0x79, 0x7c, 0xe8, 0xd4, 0x6b, 0x6f, 0x09, 0x3e, 0xed, 0xd6, 0x46, 0x14, 0xaa, 0x46, 0x62, 0xd4, 0x7b, 0x27, 0xf8, 0x73, 0x64, 0xe7, 0x01, 0x2e, 0xf7, 0x7d, 0x2a, + 0xaf, 0x78, 0x16, 0xee, 0xbd, 0x00, 0xe8, 0xde, 0xbd, 0xdc, 0x85, 0x9e, 0x7b, 0x1c, 0x8e, 0xc2, 0x36, 0xe7, 0x48, 0x60, 0xd1, 0x0b, 0x90, 0xad, 0xbb, 0xb5, 0xc7, 0x72, 0x00, 0x79, 0x33, 0x7b, + 0x3f, 0x50, 0x28, 0x46, 0xe4, 0xa5, 0xa5, 0xb0, 0x75, 0x37, 0xf6, 0x1a, 0xa5, 0x29, 0x60, 0x19, 0xf0, 0x05, 0x79, 0x28, 0xac, 0x38, 0x8b, 0x23, 0x6a, 0xdb, 0x1b, 0xf3, 0xa8, 0xbf, 0x14, 0x0e, + 0xab, 0x03, 0xb4, 0xf4, 0x42, 0x34, 0x8b, 0x6b, 0x23, 0x56, 0xc1, 0x94, 0xf7, 0x92, 0x5c, 0xe1, 0x2b, 0x44, 0xcf, 0x8f, 0x43, 0x77, 0x0b, 0x24, 0x8f, 0x72, 0xe6, 0x1b, 0x89, 0xf5, 0x18, 0x24, + 0xe4, 0x05, 0x90, 0xbe, 0x92, 0x6f, 0x26, 0x05, 0xe7, 0xe3, 0x6e, 0x43, 0xf4, 0x39, 0x2e, 0x13, 0x52, 0xe4, 0x57, 0x74, 0x8c, 0xac, 0x42, 0x59, 0x65, 0x6d, 0xae, 0xd7, 0x59, 0x02, 0x39, 0x41, + 0xd8, 0x8b, 0x1e, 0x62, 0xd5, 0x40, 0xa2, 0xb8, 0x2b, 0xaa, 0x33, 0x85, 0xf7, 0xc3, 0xca, 0x71, 0x17, 0x11, 0xbf, 0x5c, 0x6c, 0xa4, 0xed, 0x48, 0x8a, 0x44, 0xc5, 0x33, 0x42, 0xb7, 0xd3, 0x83, + 0xa9, 0x14, 0x5c, 0xf5, 0xf2, 0xc5, 0x72, 0x41, 0xf0, 0x0e, 0x39, 0x8e, 0x39, 0x13, 0xcc, 0x3b, 0x49, 0x88, 0x53, 0xed, 0x70, 0x31, 0x92, 0xe4, 0xa1, 0x93, 0x05, 0xf9, 0x3d, 0x4c, 0x1a, 0xd2, + 0xc7, 0x89, 0xfc, 0xf1, 0x7f, 0x17, 0x69, 0x87, 0x85, 0xee, 0x12, 0x85, 0x3b, 0x0e, 0x20, 0x2a, 0x21, 0xd3, 0xf5, 0xd6, 0x85, 0x2b, 0x6a, 0xeb, 0x70, 0x73, 0x66, 0xc2, 0xfa, 0xab, 0x1e, 0x27, + 0xf4, 0xb6, 0x9c, 0x37, 0x36, 0xb4, 0x2d, 0xac, 0x8f, 0xeb, 0xda, 0x76, 0x57, 0x23, 0xa6, 0x9a, 0x86, 0x28, 0xab, 0x6f, 0xdd, 0x2d, 0x97, 0x12, 0xe5, 0x74, 0x03, 0xef, 0x5d, 0xbc, 0x2a, 0xd6, + 0xcb, 0x55, 0x94, 0x0b, 0x2e, 0x2f, 0x23, 0xbb, 0x59, 0x62, 0x63, 0x78, 0xd9, 0x0e, 0x8b, 0x66, 0x40, 0x3a, 0x09, 0x78, 0x33, 0x7c, 0x38, 0x66, 0xf5, 0x4c, 0xa7, 0xa2, 0xbf, 0x07, 0xd1, 0x77, + 0x6f, 0x04, 0xba, 0xdf, 0x36, 0x37, 0xb3, 0xce, 0x16, 0x80, 0x2a, 0x32, 0xb5, 0x1d, 0xee, 0x42, 0xdc, 0x87, 0xe1, 0xc1, 0x1e, 0xaa, 0xe5, 0xba, 0x2f, 0x4d, 0xe9, 0x22, 0xcf, 0x00, 0x66, 0x3c, + 0x16, 0x0c, 0x80, 0x56, 0xa2, 0x3e, 0xbf, 0x0c, 0x0e, 0x0e, 0x8b, 0x09, 0x09, 0xb8, 0x5f, 0x8c, 0xe2, 0x78, 0x8c, 0xf7, 0xe6, 0x59, 0x9f, 0x63, 0x7c, 0x83, 0x40, 0xed, 0x8e, 0x92, 0x11, 0x70, + 0xba, 0xb0, 0xd5, 0xbd, 0x8a, 0xca, 0xc9, 0x4c, 0x87, 0x36, 0xc8, 0x74, 0x39, 0xfb, 0xc9, 0x08, 0x7f, 0xfb, 0xfb, 0x7f, 0x9d, 0x16, 0x00, 0x88, 0x76, 0x3a, 0xf4, 0x78, 0xe6, 0x39, 0x2a, 0x60, + 0xa6, 0x6f, 0xa9, 0xa6, 0x04, 0xba, 0xf3, 0x88, 0x0f, 0x47, 0x9d, 0x8d, 0xfe, 0x9c, 0x0f, 0x5f, 0xe9, 0x1f, 0x51, 0x7f, 0x3f, 0x69, 0x0c, 0x7d, 0xf4, 0x39, 0xc6, 0x08, 0x62, 0x21, 0x11, 0x37, + 0xd9, 0x23, 0xaa, 0x85, 0x05, 0x5b, 0x75, 0x06, 0x74, 0x98, 0x1d, 0x3e, 0x86, 0x8d, 0x09, 0x5b, 0xcb, 0x54, 0xe0, 0xa0, 0xbd, 0x85, 0x39, 0x09, 0x66, 0x98, 0x69, 0xd9, 0x0b, 0xd1, 0xb2, 0x16, + 0x05, 0xad, 0x03, 0xd1, 0x60, 0xbe, 0xb2, 0x26, 0xa9, 0x4e, 0x59, 0x9b, 0x28, 0xcb, 0x07, 0x39, 0x11, 0xc7, 0x40, 0x7f, 0x59, 0xf0, 0xbb, 0x81, 0x67, 0x17, 0xe9, 0x4c, 0x64, 0xa6, 0xaf, 0xaf, + 0xae, 0xdd, 0x7c, 0x56, 0xa6, 0x64, 0x27, 0x80, 0x3e, 0x79, 0x6d, 0x92, 0x3c, 0xe8, 0x46, 0x4a, 0xa2, 0x78, 0x9e, 0xe1, 0x9d, 0x15, 0x2a, 0xf4, 0xd6, 0xfb, 0xf1, 0xcc, 0xef, 0x0f, 0xf2, 0xa7, + 0x7c, 0x3c, 0xfd, 0xa0, 0xfb, 0x4c, 0x04, 0x7f, 0x97, 0x89, 0x99, 0x92, 0x9d, 0x39, 0x98, 0x29, 0x59, 0xb7, 0x21, 0xf8, 0x9c, 0x7d, 0xe3, 0x9d, 0x37, 0x9a, 0x50, 0xa0, 0xe6, 0x65, 0x70, 0x67, + 0x6d, 0x11, 0xaa, 0xa6, 0xc5, 0x1d, 0xb1, 0x5e, 0xea, 0x93, 0xa2, 0x80, 0x7a, 0x1a, 0x3c, 0x9e, 0xc7, 0xf4, 0x2a, 0x0d, 0xf9, 0x59, 0x04, 0xb9, 0x06, 0x71, 0x70, 0xb3, 0x84, 0x98, 0xc0, 0x78, + 0x67, 0xb3, 0x5d, 0x12, 0x30, 0xc7, 0xe8, 0x85, 0xd4, 0x8b, 0xa1, 0x58, 0xac, 0xc7, 0x1b, 0xd6, 0xb4, 0x39, 0xb3, 0xc3, 0x2e, 0x0b, 0x61, 0x32, 0x45, 0x9f, 0x39, 0x66, 0xfe, 0x6c, 0x5c, 0xcb, + 0xc7, 0xeb, 0x98, 0x2f, 0xc6, 0x20, 0x7d, 0x22, 0x7e, 0xc2, 0xf5, 0x78, 0xd4, 0x36, 0xf0, 0x88, 0xa4, 0x93, 0x50, 0x49, 0xf1, 0x42, 0xcc, 0x36, 0xe8, 0x70, 0xbc, 0x15, 0xa9, 0x11, 0x1b, 0xf6, + 0x11, 0xd8, 0x0e, 0xe6, 0x30, 0x87, 0x55, 0x7b, 0x8b, 0x89, 0x36, 0x43, 0x35, 0xdf, 0x8e, 0x04, 0x08, 0x2b, 0xfa, 0x5c, 0x9c, 0xc0, 0x48, 0x44, 0x13, 0xb8, 0x01, 0x0c, 0x65, 0x6d, 0x97, 0xca, + 0xcc, 0x88, 0x9a, 0x15, 0x18, 0xb8, 0xcf, 0x74, 0x18, 0x8d, 0xed, 0x7e, 0x35, 0x4d, 0xf0, 0x92, 0xce, 0x7e, 0xc3, 0x4f, 0x7e, 0x7f, 0x34, 0xf9, 0x34, 0x74, 0x9c, 0x47, 0xad, 0xf8, 0xdc, 0x25, + 0xee, 0x3a, 0xba, 0xfe, 0x14, 0xd6, 0x65, 0xa9, 0x0e, 0xdc, 0xc4, 0xa0, 0xdd, 0x57, 0x2f, 0xe4, 0x2b, 0x3d, 0xe2, 0x96, 0x36, 0xd0, 0xbd, 0x3a, 0xe9, 0x36, 0x24, 0x9f, 0xf3, 0x6e, 0xc3, 0x0d, + 0xe6, 0xeb, 0x34, 0x2b, 0x37, 0xc3, 0x8a, 0xcd, 0xe5, 0x05, 0x3c, 0x1b, 0x2e, 0x96, 0x72, 0x67, 0xbf, 0x18, 0x1d, 0xe4, 0x99, 0x6f, 0xf3, 0x1d, 0x38, 0x4c, 0xfc, 0x34, 0x63, 0x8b, 0x60, 0xeb, + 0x54, 0x21, 0xbd, 0xc8, 0x36, 0x50, 0x1c, 0xf7, 0xb6, 0xb6, 0x9d, 0xec, 0xc7, 0xe8, 0x7c, 0x9d, 0x1d, 0xac, 0xb4, 0x03, 0xcb, 0x8e, 0x24, 0x7a, 0x3d, 0x6a, 0x48, 0x04, 0xf3, 0xf1, 0x32, 0x06, + 0x72, 0xe6, 0xc1, 0x34, 0xfb, 0x3b, 0x94, 0x9a, 0xd8, 0xcb, 0xf7, 0xc8, 0xc7, 0x7b, 0x18, 0x11, 0x6f, 0x70, 0xef, 0x15, 0x1d, 0x7c, 0x4d, 0xfa, 0x7d, 0xb9, 0xa1, 0x7b, 0xa2, 0xf6, 0x1c, 0x9f, + 0xf5, 0x5c, 0x2b, 0x9c, 0x70, 0xc7, 0x8e, 0x48, 0x60, 0x70, 0x50, 0x0c, 0x71, 0xba, 0xe7, 0x50, 0x40, 0x74, 0xc4, 0x32, 0xc3, 0x23, 0x7a, 0xdd, 0xeb, 0x23, 0xbc, 0x39, 0xf4, 0x0b, 0xa5, 0x24, + 0xb3, 0x85, 0x07, 0x26, 0xc9, 0x88, 0x99, 0xa0, 0x33, 0x0f, 0xc2, 0x46, 0x4b, 0xb1, 0x13, 0x71, 0xce, 0x80, 0x32, 0x01, 0x6e, 0x26, 0x14, 0x54, 0xcd, 0x74, 0xf0, 0x65, 0x2d, 0x71, 0xfd, 0x59, + 0x8f, 0x31, 0x82, 0x67, 0x6e, 0x88, 0xa7, 0xe1, 0xb0, 0x46, 0x9a, 0x9d, 0xd7, 0x0f, 0xfe, 0x5f, 0xd7, 0x12, 0x7d, 0x6e, 0xbd, 0xb2, 0xdd, 0x4f, 0xb7, 0xb4, 0x11, 0xd3, 0x5b, 0xba, 0x7f, 0xde, + 0xfc, 0xe2, 0x86, 0x72, 0x83, 0xff, 0xf1, 0xa0, 0xed, 0x54, 0x62, 0x93, 0x7b, 0xf1, 0x96, 0x63, 0x25, 0x71, 0x47, 0x6d, 0x19, 0x57, 0x0e, 0xf6, 0xf8, 0x24, 0x1b, 0x8f, 0x16, 0x8e, 0x15, 0x61, + 0x98, 0xb6, 0xce, 0x58, 0x8b, 0x4d, 0x78, 0xd8, 0x1a, 0x2d, 0x4b, 0xbb, 0x9a, 0x64, 0x21, 0x0c, 0x75, 0xa0, 0x5a, 0x5d, 0x33, 0x19, 0xbf, 0xa3, 0xe1, 0x19, 0x34, 0xe8, 0x95, 0x68, 0xcc, 0x08, + 0x60, 0xc2, 0x0f, 0x37, 0x74, 0x40, 0x1b, 0xe0, 0x60, 0x2e, 0x3a, 0xfd, 0xc9, 0xf8, 0xc1, 0x90, 0xfd, 0x14, 0x9d, 0x5b, 0x5c, 0xef, 0xcb, 0x28, 0xf8, 0x46, 0xbc, 0x0a, 0xd1, 0x15, 0xf9, 0x4f, + 0x13, 0xb0, 0x86, 0xec, 0x73, 0xb0, 0xb4, 0xc3, 0x66, 0x20, 0xac, 0x53, 0x83, 0xf6, 0x71, 0xbe, 0x37, 0x54, 0x4b, 0x68, 0xbc, 0x51, 0xc9, 0x04, 0xe7, 0x57, 0x28, 0x6f, 0xaf, 0x32, 0xc4, 0x5e, + 0xc8, 0xb3, 0xfd, 0x80, 0x8a, 0x66, 0x2e, 0x47, 0x8a, 0xfd, 0xed, 0x92, 0xa7, 0x73, 0x61, 0x38, 0xa3, 0x46, 0xb0, 0x03, 0x5b, 0x72, 0xa4, 0x6d, 0xf5, 0x19, 0x3d, 0x4e, 0xa2, 0x6d, 0x2e, 0xb2, + 0xf6, 0x88, 0x58, 0xab, 0x3e, 0xe4, 0x6c, 0xfd, 0xf9, 0xf0, 0xe7, 0x51, 0x6f, 0xa7, 0xaf, 0x69, 0x16, 0x93, 0x9c, 0xf4, 0x71, 0xfc, 0x05, 0xfc, 0x82, 0x63, 0xf6, 0x13, 0x6d, 0xa0, 0xfb, 0x7e, + 0xd8, 0xe8, 0xaa, 0x16, 0xbe, 0x5a, 0xd7, 0xce, 0xa7, 0xb3, 0xf1, 0x32, 0xb1, 0x0b, 0x66, 0x31, 0x8b, 0xcb, 0x85, 0x76, 0xc0, 0xc7, 0xf3, 0xd8, 0x9f, 0x1a, 0x0e, 0x85, 0xf5, 0x37, 0x49, 0xca, + 0xf0, 0x0b, 0x3b, 0xf1, 0x06, 0xab, 0x44, 0x4d, 0x7c, 0x09, 0x95, 0xb9, 0x85, 0xeb, 0x62, 0x92, 0x07, 0x84, 0x33, 0x86, 0x63, 0xf9, 0x1e, 0xb9, 0x5d, 0x4a, 0xe3, 0x72, 0xed, 0x13, 0xe4, 0x61, + 0xcc, 0xd4, 0x68, 0x7f, 0xc1, 0x18, 0xfb, 0xac, 0x36, 0x5e, 0x15, 0xa8, 0xb3, 0x2e, 0xb9, 0x6b, 0x23, 0x81, 0x2f, 0x05, 0x25, 0x5d, 0x11, 0x06, 0xba, 0xcd, 0xbf, 0xee, 0x89, 0xd2, 0x73, 0x64, + 0x58, 0x1d, 0xa4, 0x77, 0xd9, 0xc6, 0x0a, 0x36, 0x93, 0x69, 0xc9, 0x43, 0xee, 0xde, 0x17, 0x93, 0x3a, 0x34, 0xdd, 0x29, 0x2c, 0x6c, 0xb7, 0x9a, 0xe2, 0x80, 0xba, 0x9f, 0xd5, 0xc5, 0x98, 0xb6, + 0x35, 0xaa, 0xb3, 0x4c, 0x87, 0x98, 0x4d, 0x2e, 0x91, 0x83, 0x57, 0x65, 0x0a, 0xb8, 0x1f, 0xf2, 0xf2, 0x72, 0x6e, 0xce, 0x7a, 0xc3, 0x7c, 0x99, 0xa9, 0xd0, 0x3e, 0xf0, 0x17, 0x7d, 0x5b, 0x48, + 0x8c, 0x05, 0xd3, 0x7f, 0x32, 0x23, 0xbb, 0xfc, 0xda, 0xc4, 0x57, 0x3c, 0xa7, 0x36, 0xba, 0xe7, 0xec, 0x83, 0xae, 0xae, 0x64, 0x8f, 0xba, 0x18, 0xfc, 0xda, 0xba, 0xf3, 0x77, 0x6f, 0x6a, 0x90, + 0xba, 0xd7, 0xd0, 0x44, 0x75, 0xb5, 0xf0, 0x55, 0x0f, 0x5d, 0x42, 0x1b, 0x13, 0x75, 0xa7, 0x47, 0x72, 0x30, 0x09, 0x8b, 0xb1, 0x1f, 0xc1, 0x53, 0xac, 0x3f, 0x4e, 0xc3, 0x30, 0x97, 0xfa, 0xb5, + 0x4a, 0x4f, 0x6c, 0x41, 0xa8, 0xd9, 0x3e, 0xe2, 0xae, 0xc6, 0xcb, 0x3d, 0x9e, 0xf4, 0xac, 0xb4, 0x06, 0x43, 0x29, 0xdc, 0xc7, 0x63, 0x69, 0x89, 0xe6, 0xd0, 0x12, 0xd1, 0xb9, 0x51, 0x08, 0x46, + 0xec, 0x88, 0x23, 0xd2, 0x39, 0x3f, 0xaa, 0xec, 0xdc, 0xab, 0xa2, 0x9f, 0x2f, 0x00, 0xdc, 0x24, 0x30, 0xdc, 0x37, 0x33, 0xa0, 0x97, 0xa6, 0xb1, 0x1f, 0x84, 0x8f, 0x36, 0x86, 0x12, 0x19, 0xdd, + 0x13, 0xa5, 0xe7, 0xc8, 0x80, 0x6b, 0x52, 0x9b, 0x86, 0x25, 0xad, 0xa7, 0x0e, 0xd5, 0x0b, 0xd4, 0x03, 0x65, 0x11, 0x18, 0x02, 0xa5, 0x03, 0x58, 0xd3, 0x17, 0xf2, 0xdc, 0x91, 0x42, 0x4b, 0x33, + 0xc7, 0x92, 0x21, 0x0d, 0xfd, 0x8e, 0x6a, 0xb8, 0x12, 0xdd, 0x07, 0xd4, 0xc2, 0x51, 0x6b, 0x24, 0x19, 0x21, 0xb8, 0x23, 0x2c, 0x7a, 0xaa, 0xe0, 0xf2, 0x40, 0xca, 0xd7, 0x83, 0x52, 0xea, 0x11, + 0x40, 0xce, 0x60, 0x3e, 0x53, 0x85, 0xbf, 0x31, 0x63, 0xba, 0xcd, 0x26, 0x69, 0xaf, 0x19, 0xbf, 0x4d, 0xfa, 0xb8, 0x0f, 0x35, 0xfc, 0xca, 0x6a, 0xe3, 0xb3, 0xb7, 0x7d, 0x18, 0x30, 0xe7, 0xac, + 0x8e, 0xd3, 0x7b, 0x9e, 0x33, 0x22, 0x56, 0x19, 0x6b, 0xbf, 0xe0, 0x08, 0x76, 0x23, 0xa6, 0x3b, 0x61, 0xe8, 0x1e, 0x7a, 0x4b, 0x31, 0x17, 0x86, 0x69, 0xe9, 0x74, 0xd4, 0x7e, 0x06, 0x3a, 0x69, + 0xcc, 0xd2, 0x46, 0xd8, 0x61, 0xa6, 0x6b, 0xb0, 0x87, 0x21, 0x75, 0x3c, 0x06, 0xc5, 0x88, 0x60, 0x64, 0x62, 0xe0, 0xf4, 0x9c, 0xc8, 0x1a, 0x50, 0xb8, 0xaf, 0x09, 0xf1, 0x00, 0x9d, 0xf3, 0xeb, + 0x79, 0xb9, 0x02, 0x4c, 0x38, 0xc1, 0x0f, 0x2b, 0xfb, 0x37, 0x6c, 0xf4, 0x3b, 0xdf, 0x79, 0x88, 0x8c, 0xc4, 0xf1, 0x8d, 0x20, 0x53, 0xbc, 0x6e, 0x9e, 0x39, 0xa7, 0x10, 0x88, 0x56, 0xe9, 0x34, + 0xa9, 0x16, 0x46, 0x46, 0xd7, 0x57, 0x02, 0xc5, 0x3a, 0x45, 0x08, 0x7f, 0x7d, 0xea, 0x9b, 0x60, 0x0c, 0x33, 0x0f, 0xb4, 0xd3, 0x8a, 0x74, 0x37, 0x31, 0xf4, 0xae, 0xea, 0x29, 0xda, 0xbe, 0x7b, + 0xb1, 0xaf, 0x1a, 0xff, 0xf3, 0xcd, 0xed, 0x5e, 0xa8, 0x2b, 0xe7, 0xf8, 0x0a, 0xf4, 0x0d, 0x22, 0xde, 0xa0, 0x9b, 0x30, 0xc8, 0x53, 0x88, 0xe4, 0x29, 0x46, 0x12, 0xf9, 0xec, 0xba, 0x4e, 0x0d, + 0xbf, 0x78, 0x0f, 0x61, 0x46, 0x6e, 0xbd, 0xd5, 0x59, 0xfa, 0xfe, 0xcd, 0x7f, 0x47, 0x1a, 0xba, 0x3f, 0x9c, 0x90, 0x7c, 0x1b, 0x52, 0xf1, 0x4e, 0xe2, 0x5b, 0x97, 0x77, 0x18, 0x19, 0x81, 0x16, + 0x7a, 0x9e, 0xa1, 0x65, 0x4e, 0x61, 0x5c, 0xff, 0xba, 0x4f, 0xae, 0xef, 0xdb, 0x1b, 0x1b, 0x17, 0xf8, 0x17, 0xae, 0x3c, 0x0f, 0x1c, 0x78, 0x2a, 0x12, 0x37, 0x69, 0x52, 0xe0, 0xc3, 0x2c, 0x29, + 0xec, 0xd8, 0x76, 0xfc, 0xec, 0xbf, 0xe3, 0xef, 0x47, 0xc4, 0xfd, 0xcf, 0x7f, 0x1e, 0xbb, 0x70, 0x77, 0xae, 0xd6, 0xb4, 0xfc, 0x4e, 0xdc, 0xc2, 0xb3, 0x6e, 0x1d, 0xfc, 0x15, 0xc7, 0x72, 0xb9, + 0xf4, 0x2f, 0x11, 0xc7, 0xf2, 0x23, 0x79, 0xf8, 0x2b, 0xba, 0xe1, 0x3e, 0x62, 0xf7, 0x14, 0xc6, 0x3f, 0x59, 0x17, 0x7f, 0x79, 0xe5, 0x51, 0x21, 0x7f, 0xb9, 0xd8, 0x5a, 0x2b, 0x8f, 0x4b, 0x51, + 0x84, 0xd7, 0x73, 0x76, 0x3a, 0x82, 0x6c, 0x72, 0x29, 0xa7, 0x06, 0x37, 0x42, 0x19, 0x6d, 0x47, 0xd7, 0xb8, 0x27, 0x16, 0xcb, 0x90, 0x9f, 0xb1, 0x79, 0x1e, 0xcf, 0x65, 0x39, 0x14, 0xed, 0xc2, + 0x1c, 0xf5, 0x6d, 0xde, 0x91, 0x17, 0x02, 0x13, 0x96, 0x1d, 0xac, 0xef, 0x21, 0x8b, 0xac, 0x3a, 0x4c, 0x20, 0x87, 0x4d, 0x70, 0x69, 0x2b, 0x97, 0xbb, 0xac, 0x8f, 0x54, 0xb2, 0xe0, 0xda, 0xda, + 0xef, 0x6a, 0xe5, 0xcf, 0xfe, 0x83, 0x66, 0x2c, 0x45, 0x7e, 0x5f, 0x05, 0xdf, 0x79, 0xaa, 0xb9, 0xf2, 0xb3, 0xbb, 0x2f, 0x57, 0x2e, 0x0a, 0xfa, 0x51, 0xfe, 0x6c, 0xb7, 0xf9, 0x45, 0x1f, 0xfa, + 0xe1, 0xce, 0x1d, 0x1f, 0x0a, 0xf7, 0x81, 0xb2, 0xfc, 0x6f, 0xad, 0x6f, 0x3f, 0x14, 0xe8, 0x8b, 0x66, 0xf0, 0xbb, 0x76, 0xfe, 0xe7, 0xf6, 0xb9, 0xd3, 0x6b, 0x80, 0xee, 0xf9, 0xa0, 0x75, 0xdf, + 0xd2, 0x5d, 0x48, 0x1e, 0xdb, 0x00, 0x2a, 0x4c, 0x8d, 0x3e, 0x33, 0x53, 0x61, 0x13, 0x10, 0xdc, 0x65, 0xc9, 0xf9, 0x2c, 0x95, 0x68, 0xa5, 0x06, 0x6f, 0xc2, 0x64, 0xb3, 0x58, 0x7a, 0x34, 0x29, + 0xcd, 0x45, 0xd9, 0xdb, 0x41, 0xd3, 0x48, 0x5c, 0xa7, 0xea, 0x96, 0x30, 0x10, 0x59, 0xd6, 0x23, 0xdb, 0x5c, 0x96, 0x70, 0x4f, 0x11, 0x07, 0xd2, 0x6a, 0x9e, 0x0f, 0x69, 0xb2, 0xec, 0x6d, 0xb1, + 0x74, 0xd5, 0x23, 0x7e, 0xb7, 0x6f, 0xfd, 0x9f, 0xda, 0x67, 0x3e, 0x9b, 0xc7, 0xff, 0xaa, 0x5d, 0xe1, 0xbf, 0xa6, 0x2d, 0x79, 0xee, 0x22, 0x7f, 0x19, 0x91, 0xef, 0x97, 0xfe, 0x45, 0x8d, 0xc8, + 0x7b, 0x82, 0xf0, 0x97, 0xf5, 0x78, 0x17, 0xaa, 0xcf, 0x83, 0xef, 0x3f, 0x57, 0x89, 0xdd, 0xbc, 0x0d, 0xe8, 0xde, 0x9e, 0xb7, 0x56, 0x69, 0xbd, 0xce, 0x66, 0x37, 0x19, 0xb2, 0x41, 0xce, 0xf4, + 0xd6, 0xd9, 0x6e, 0x16, 0xd3, 0xb6, 0xb6, 0xca, 0x39, 0x42, 0xcf, 0x09, 0xcc, 0xac, 0x98, 0x15, 0x50, 0x45, 0x0c, 0xa9, 0x61, 0x16, 0xb1, 0xd2, 0x4b, 0x22, 0x1a, 0xce, 0xd0, 0x39, 0x2b, 0xaa, + 0xc6, 0x08, 0x21, 0x8d, 0xc9, 0xc2, 0xac, 0xc7, 0x95, 0xce, 0x8c, 0x64, 0x36, 0xe4, 0x2d, 0xd7, 0x0b, 0x0f, 0x2b, 0x8a, 0x42, 0x3a, 0xa8, 0x07, 0xd4, 0xe9, 0xef, 0x7a, 0xd3, 0x7e, 0x43, 0x39, + 0x15, 0x4e, 0xea, 0x64, 0x61, 0xd2, 0xdd, 0x1b, 0xd5, 0xf5, 0x43, 0x3f, 0xeb, 0x98, 0x7f, 0x27, 0x9b, 0x1a, 0x13, 0xcd, 0x48, 0x7d, 0xd4, 0x43, 0xc8, 0xbb, 0x1e, 0x82, 0x8e, 0x0d, 0x77, 0x74, + 0xd9, 0x7f, 0x82, 0x22, 0xfa, 0x91, 0x68, 0x5e, 0x40, 0xfc, 0xe7, 0x8a, 0xe4, 0xc9, 0xd6, 0x3f, 0xaf, 0x19, 0xb7, 0x16, 0xc1, 0x6c, 0x2f, 0x4b, 0xb4, 0xc5, 0x0a, 0x53, 0xbd, 0x30, 0x53, 0x72, + 0x86, 0x12, 0x33, 0x25, 0x3e, 0x84, 0xee, 0x94, 0xed, 0x77, 0xfc, 0xb1, 0xe4, 0xf3, 0xb5, 0x5e, 0x13, 0x49, 0x27, 0xef, 0x48, 0x18, 0xea, 0x21, 0x43, 0x76, 0x2f, 0x46, 0x7d, 0x55, 0x80, 0x26, + 0x11, 0xa2, 0xcd, 0xe3, 0x98, 0x92, 0x7a, 0x05, 0x27, 0x31, 0x34, 0x05, 0x99, 0x4e, 0x96, 0x8e, 0x6d, 0x9f, 0xa8, 0xe6, 0x60, 0x71, 0xe8, 0x3d, 0x1b, 0xcf, 0xff, 0x15, 0xf9, 0xff, 0xc9, 0x66, + 0xfb, 0xdf, 0x20, 0x0b, 0xd7, 0x6f, 0xbc, 0x8d, 0x25, 0x38, 0xaf, 0xd9, 0xb6, 0x95, 0x91, 0x3d, 0xcd, 0x3a, 0xd9, 0x0c, 0x50, 0x2b, 0x60, 0x34, 0x25, 0x2c, 0x92, 0xd9, 0xcd, 0x44, 0x42, 0x99, + 0x46, 0x54, 0xe9, 0x2d, 0x49, 0x3d, 0x4c, 0x6d, 0x73, 0x53, 0x93, 0x3a, 0x01, 0xb9, 0x3d, 0x22, 0xc0, 0xf6, 0x92, 0x82, 0x69, 0xca, 0x68, 0x53, 0xec, 0xc0, 0x65, 0xd1, 0x97, 0xfa, 0x4a, 0x30, + 0x03, 0xfa, 0x31, 0x3d, 0x09, 0xa9, 0xb9, 0x51, 0x90, 0x5b, 0x0d, 0xf0, 0x05, 0x7c, 0x36, 0x2b, 0xb7, 0x8f, 0xd6, 0x21, 0xff, 0x13, 0x87, 0xa9, 0xab, 0x87, 0xbe, 0xf1, 0x2e, 0x5b, 0x5e, 0xa8, + 0xaa, 0xa7, 0x70, 0x38, 0xe8, 0x8b, 0x2f, 0xd9, 0x49, 0xbb, 0xc7, 0xf6, 0x5f, 0x17, 0x0f, 0xe7, 0x4d, 0xe3, 0x5f, 0xde, 0xe2, 0xff, 0x43, 0xcc, 0xeb, 0xaf, 0xbd, 0xe3, 0x2f, 0x4b, 0xfb, 0xfd, + 0xd2, 0xbf, 0xa8, 0xa5, 0xfd, 0x44, 0x26, 0xfe, 0x32, 0xba, 0xef, 0xa2, 0xf6, 0x69, 0x24, 0xfd, 0xe7, 0x2a, 0xb5, 0xeb, 0x97, 0x01, 0xdd, 0x9b, 0xd3, 0xd6, 0xaa, 0x0c, 0x0d, 0x0f, 0x50, 0xea, + 0xfa, 0xc3, 0xd1, 0xf8, 0xe0, 0xf6, 0x59, 0x3a, 0xe0, 0x98, 0x6c, 0x33, 0x18, 0xd8, 0xfd, 0x64, 0x9b, 0x4d, 0x29, 0xa8, 0xaf, 0x81, 0x29, 0x1d, 0xe5, 0x35, 0x68, 0xc6, 0x26, 0xb2, 0xe8, 0x58, + 0xc8, 0x64, 0x30, 0xac, 0xc4, 0xc3, 0x41, 0x1d, 0x80, 0xb8, 0x5a, 0x95, 0xe0, 0x60, 0x99, 0x2e, 0x82, 0x40, 0x8d, 0x51, 0x54, 0x9b, 0x3a, 0xc5, 0x88, 0x98, 0xa6, 0x10, 0x00, 0xa6, 0xf8, 0xef, + 0x86, 0x7f, 0xb5, 0x55, 0x65, 0x67, 0x37, 0xe7, 0x67, 0xf5, 0xf5, 0x9a, 0xb7, 0xf3, 0xbf, 0xb6, 0x95, 0xa5, 0xa8, 0x6a, 0x62, 0x3c, 0xca, 0xc2, 0x82, 0x5e, 0xca, 0x78, 0x3c, 0x91, 0x04, 0xba, + 0xe7, 0x83, 0xa6, 0x08, 0x49, 0x8b, 0x61, 0x3a, 0x08, 0x8c, 0x1e, 0x30, 0x76, 0x04, 0xc0, 0xae, 0xc7, 0xf6, 0x0e, 0x8f, 0x74, 0x36, 0x50, 0xe9, 0xac, 0x26, 0x58, 0x77, 0x21, 0x4e, 0x93, 0x1d, + 0x08, 0x2e, 0x80, 0xba, 0x58, 0xac, 0x7c, 0x2c, 0xe2, 0x07, 0x7b, 0x0f, 0x3f, 0xe4, 0xc3, 0x64, 0x18, 0x6c, 0x03, 0x60, 0x9d, 0x89, 0xf3, 0xb9, 0x39, 0xcf, 0x28, 0x53, 0xee, 0x01, 0xd0, 0x32, + 0x33, 0xec, 0x7d, 0x5a, 0x4b, 0xbd, 0x58, 0x13, 0x1d, 0x07, 0xfc, 0x71, 0x00, 0x92, 0xa2, 0x86, 0x49, 0x53, 0x41, 0x31, 0x4b, 0x8e, 0xe0, 0x3e, 0xce, 0x0c, 0x79, 0x25, 0xe4, 0xef, 0x33, 0xf1, + 0x06, 0xa3, 0xdb, 0x4b, 0x6d, 0x8a, 0x97, 0x1c, 0xd1, 0xb2, 0x49, 0x4f, 0x20, 0x33, 0x45, 0x93, 0x77, 0xc1, 0x12, 0x29, 0xe6, 0x82, 0x68, 0x39, 0xaa, 0xdb, 0xc9, 0x78, 0x76, 0x34, 0xc6, 0x80, + 0x8e, 0x07, 0xe2, 0x54, 0x0e, 0x2f, 0xb4, 0xc4, 0x29, 0x80, 0xa1, 0x6f, 0x64, 0xa0, 0xa1, 0xb8, 0xa8, 0x58, 0x6e, 0x46, 0x28, 0x94, 0xf2, 0xbd, 0x32, 0x18, 0xb1, 0x8e, 0x90, 0xf6, 0x5d, 0xa8, + 0x17, 0x83, 0x7a, 0x52, 0xeb, 0x1b, 0xdd, 0xa0, 0x46, 0x59, 0x69, 0x58, 0xed, 0xb2, 0x1a, 0x4e, 0x45, 0x4e, 0x33, 0x25, 0xb1, 0x8c, 0xac, 0x9b, 0xda, 0x8e, 0xff, 0xeb, 0x63, 0x31, 0xe1, 0x67, + 0x9d, 0xe7, 0xa8, 0xd1, 0xb0, 0x56, 0x52, 0x9a, 0x66, 0x89, 0xa2, 0x65, 0x5d, 0x2f, 0xb4, 0xac, 0xdb, 0xbe, 0xf3, 0x39, 0x7e, 0xfe, 0x15, 0x79, 0xbd, 0x25, 0xde, 0x70, 0xe5, 0xf6, 0x52, 0x13, + 0x48, 0xdf, 0x42, 0x86, 0x61, 0xda, 0x5d, 0x8a, 0xf2, 0x41, 0x5c, 0x14, 0xb6, 0xc1, 0x17, 0x43, 0x95, 0x4e, 0xbd, 0xc1, 0x6a, 0xc7, 0x4b, 0xfb, 0xa4, 0xb3, 0x72, 0x17, 0x19, 0x1f, 0x24, 0xb3, + 0x05, 0x82, 0x98, 0x9d, 0xf5, 0x78, 0x33, 0xab, 0x8d, 0x5a, 0x88, 0x64, 0x2d, 0x5e, 0x5b, 0x84, 0xab, 0x20, 0x33, 0x54, 0xa7, 0xb7, 0x7e, 0x5d, 0x5b, 0xa5, 0xd8, 0x51, 0x40, 0xb8, 0xe7, 0x2e, + 0x0f, 0xd8, 0x82, 0x71, 0x90, 0x49, 0xee, 0x7c, 0x9f, 0xc8, 0xa4, 0x68, 0x61, 0xf2, 0x28, 0xd6, 0x86, 0x78, 0x29, 0x24, 0xac, 0xa1, 0x78, 0x04, 0xe1, 0xf8, 0xbf, 0x4b, 0xb4, 0x8b, 0xf4, 0x0a, + 0x84, 0x2a, 0x02, 0x43, 0x08, 0xf0, 0xe7, 0xba, 0x2a, 0xf2, 0xd0, 0x82, 0xc7, 0xf7, 0xa3, 0x7d, 0xb9, 0x4a, 0x7c, 0x4b, 0x06, 0x39, 0x11, 0x70, 0x19, 0x26, 0x9a, 0x3b, 0xa5, 0x2a, 0xb9, 0xc3, + 0x70, 0x39, 0x47, 0x75, 0x8f, 0xb6, 0xe3, 0x49, 0x16, 0x0a, 0x39, 0x13, 0xf4, 0xf9, 0x69, 0x6d, 0x89, 0xeb, 0xd2, 0x02, 0xe5, 0x8d, 0xc3, 0x84, 0x42, 0x85, 0xaf, 0x0e, 0x9c, 0xa1, 0x0a, 0x6b, + 0x9b, 0x7c, 0x36, 0xb5, 0x51, 0x6f, 0xa2, 0x8c, 0xfe, 0xf8, 0xe3, 0xd7, 0x05, 0x8c, 0x63, 0xcb, 0x19, 0x99, 0x9f, 0x0a, 0x24, 0xf8, 0x86, 0xb6, 0x4a, 0xcd, 0x39, 0xa1, 0xe3, 0xa6, 0x87, 0x07, + 0xd8, 0x63, 0x2f, 0x19, 0xb8, 0xef, 0x54, 0xdf, 0xf1, 0x77, 0xd3, 0x43, 0x17, 0x6b, 0x67, 0xe8, 0x4e, 0xc1, 0x45, 0xe6, 0x03, 0x28, 0xc1, 0x4f, 0x4d, 0x61, 0x19, 0xcd, 0x05, 0x78, 0x02, 0x84, + 0xe3, 0x39, 0x80, 0x08, 0x3b, 0x67, 0x8a, 0x0f, 0xca, 0x4d, 0xc7, 0x98, 0xa8, 0xe3, 0x99, 0x9d, 0xea, 0x07, 0x1b, 0xde, 0x88, 0x33, 0xdd, 0xeb, 0x20, 0x60, 0x48, 0x2a, 0x43, 0x5d, 0x54, 0x7d, + 0x6c, 0xa2, 0x9a, 0x66, 0x34, 0x18, 0x50, 0x16, 0x60, 0x75, 0x6a, 0x07, 0xea, 0x77, 0xdc, 0x62, 0x62, 0x2b, 0xd8, 0xd3, 0x90, 0xec, 0xef, 0x17, 0x10, 0xde, 0x19, 0xf2, 0x79, 0xd5, 0xa0, 0x39, + 0x22, 0x5b, 0xa6, 0x12, 0x3f, 0xce, 0x13, 0x6e, 0x8a, 0xcb, 0xfc, 0x3c, 0xb5, 0xe3, 0x23, 0x4f, 0xf8, 0x44, 0xe0, 0x39, 0xb6, 0x2e, 0x62, 0xae, 0x67, 0x56, 0x21, 0x86, 0x18, 0x4c, 0x28, 0x41, + 0xb5, 0xab, 0x26, 0xfc, 0x50, 0xdc, 0x4d, 0xd4, 0x61, 0xa7, 0x08, 0x02, 0x61, 0x57, 0xf4, 0x41, 0x1f, 0xf3, 0xfd, 0xbd, 0x06, 0x89, 0xd3, 0x4e, 0x70, 0xa0, 0xa2, 0x68, 0xcf, 0xcc, 0xb8, 0xf1, + 0x0c, 0x54, 0x64, 0x54, 0x57, 0xbd, 0x35, 0x33, 0x0f, 0x87, 0x2b, 0xdb, 0xf6, 0x3b, 0xfb, 0xba, 0x8f, 0xca, 0x52, 0xb5, 0xa7, 0x43, 0xce, 0x42, 0x9f, 0x61, 0xfb, 0x9b, 0xa9, 0xc3, 0xd7, 0xd9, + 0x67, 0x8a, 0xea, 0x19, 0x9f, 0x92, 0xd0, 0xee, 0x14, 0x84, 0x7c, 0x90, 0x6a, 0x7c, 0x5b, 0xd2, 0xe8, 0xbf, 0x44, 0x06, 0xf1, 0x6d, 0x4e, 0xfb, 0xa3, 0x09, 0xc7, 0x0b, 0x1d, 0xf4, 0x83, 0xee, + 0x59, 0x82, 0xce, 0x67, 0xcd, 0x14, 0xa4, 0x45, 0x27, 0xdd, 0x1c, 0xc0, 0xe9, 0x01, 0x83, 0xed, 0x43, 0x9f, 0x60, 0x20, 0xd2, 0xde, 0x73, 0x7d, 0xcb, 0xda, 0x79, 0x7d, 0xc7, 0x8c, 0x37, 0x72, + 0xb6, 0x53, 0x96, 0x56, 0x98, 0x4f, 0xc2, 0xa4, 0xb3, 0xe1, 0xf4, 0x45, 0x20, 0x54, 0xfd, 0x29, 0x84, 0x14, 0x56, 0x7f, 0x53, 0xad, 0xe7, 0x79, 0x44, 0xac, 0x42, 0xc3, 0x08, 0x67, 0x5c, 0x9a, + 0xa0, 0x7b, 0x13, 0xb3, 0x71, 0x9d, 0xdf, 0x40, 0xd0, 0x18, 0xc2, 0x38, 0xa9, 0x65, 0x3a, 0xe2, 0x47, 0x09, 0x80, 0x56, 0xeb, 0x76, 0xbf, 0xf5, 0xf0, 0xd7, 0x59, 0xe8, 0x6d, 0x2f, 0x6e, 0x2e, + 0xfd, 0xc6, 0xd4, 0xf3, 0x9a, 0x11, 0x2d, 0x07, 0x8b, 0xbf, 0x8a, 0x0a, 0x5c, 0x6e, 0xfa, 0x97, 0x2c, 0x2a, 0xf0, 0x50, 0x62, 0xfe, 0x2a, 0x25, 0xd0, 0xaa, 0x94, 0x40, 0x53, 0x13, 0xb5, 0xf1, + 0x20, 0x3d, 0x76, 0x51, 0xbc, 0x34, 0xa4, 0x7e, 0xd0, 0xbd, 0xd4, 0xf6, 0x3d, 0x9d, 0x75, 0xd1, 0x76, 0x43, 0xea, 0x24, 0xdc, 0x82, 0x4a, 0x34, 0x54, 0x47, 0x8a, 0x34, 0xa1, 0xe7, 0x1e, 0x5e, + 0x0d, 0x3a, 0x11, 0x3e, 0xa1, 0x06, 0x3b, 0x19, 0xc7, 0x71, 0xc0, 0xb6, 0x99, 0xe1, 0x74, 0x8e, 0x65, 0x3d, 0x61, 0xe0, 0xaa, 0x13, 0x61, 0x2a, 0x49, 0x80, 0x45, 0x72, 0x73, 0x75, 0xc0, 0xaa, + 0x85, 0x99, 0x58, 0xd3, 0x6d, 0x31, 0x86, 0x84, 0x48, 0x8e, 0xbc, 0x05, 0x1f, 0x94, 0xe3, 0xb0, 0xd7, 0xf3, 0xb6, 0x00, 0x45, 0xf9, 0xcf, 0x6c, 0xcf, 0x67, 0xf3, 0x9a, 0x36, 0x02, 0x79, 0xfc, + 0xd4, 0x53, 0x21, 0xd9, 0xc7, 0x88, 0x22, 0x2f, 0x78, 0xc5, 0xae, 0x09, 0x5f, 0x20, 0x3d, 0x9f, 0x36, 0x4e, 0xd3, 0x16, 0x9e, 0x32, 0x6b, 0xba, 0x75, 0x31, 0x6a, 0x96, 0x4c, 0x37, 0xc2, 0x2c, + 0xdd, 0x0d, 0x7b, 0xae, 0x27, 0x2e, 0xfd, 0x25, 0x70, 0x98, 0x7a, 0xf9, 0x61, 0xb4, 0xee, 0xc8, 0x3d, 0xa1, 0x5f, 0xce, 0xc7, 0x16, 0x63, 0x72, 0x10, 0x90, 0x97, 0x0b, 0x8e, 0xc9, 0xeb, 0xf5, + 0x3a, 0xb0, 0x31, 0xbf, 0x14, 0xf5, 0x0e, 0x9f, 0xd3, 0xb2, 0x56, 0xae, 0xc6, 0x9c, 0x1a, 0xa7, 0xe9, 0x7c, 0xb3, 0xf4, 0x21, 0xaf, 0x8f, 0x41, 0x82, 0xf2, 0xba, 0xd3, 0x34, 0xfb, 0x54, 0xa3, + 0x0b, 0xbe, 0x2e, 0xc6, 0xda, 0x96, 0x27, 0xff, 0x79, 0x55, 0x8a, 0x6e, 0x18, 0x72, 0xd3, 0x72, 0xfd, 0x61, 0xf7, 0x04, 0xe0, 0xfc, 0xa9, 0x3f, 0x95, 0x80, 0x77, 0xb2, 0xe7, 0xf5, 0xaa, 0xe6, + 0xb8, 0x7b, 0x22, 0xf6, 0x9c, 0xf9, 0x19, 0x98, 0xd4, 0x74, 0x4c, 0x12, 0x3e, 0x62, 0xae, 0x35, 0x3d, 0x1f, 0xb1, 0xd2, 0xc0, 0x9e, 0xfa, 0x55, 0xb5, 0xed, 0xf4, 0x8c, 0x10, 0xdf, 0x08, 0xae, + 0x5c, 0x98, 0x18, 0xd4, 0x57, 0x00, 0x0e, 0x14, 0x88, 0x8e, 0x88, 0x10, 0xe8, 0x24, 0x82, 0x14, 0xc9, 0xa9, 0x24, 0x0f, 0x1c, 0x4e, 0x0f, 0x11, 0xc9, 0x01, 0x7c, 0x5f, 0x5c, 0x8f, 0x56, 0x6c, + 0xe1, 0xef, 0xab, 0x85, 0x55, 0x6c, 0x3b, 0xdb, 0x47, 0x6e, 0xd2, 0xb6, 0xcc, 0x83, 0xda, 0xae, 0xc2, 0xfc, 0x93, 0xb8, 0xd7, 0xe4, 0x2f, 0x3c, 0x9c, 0xeb, 0xbd, 0xe4, 0x77, 0x78, 0x27, 0x7b, + 0xe9, 0xa3, 0xcd, 0x49, 0x17, 0x6b, 0xe7, 0x6b, 0x88, 0xf3, 0x89, 0xb0, 0xf5, 0xc4, 0x95, 0x34, 0x9c, 0xc1, 0xb3, 0x51, 0x6f, 0x25, 0x6d, 0x43, 0x72, 0x5d, 0xa6, 0x3b, 0x34, 0x0d, 0x95, 0xc0, + 0xb6, 0x42, 0x7c, 0x36, 0x5f, 0xf9, 0x24, 0xda, 0x87, 0x66, 0xb4, 0xd6, 0x27, 0x53, 0x84, 0x07, 0xcb, 0x48, 0x77, 0x96, 0x75, 0xb5, 0xec, 0xd5, 0x80, 0x2c, 0x4f, 0x38, 0x8f, 0xdb, 0x14, 0x08, + 0x11, 0xf3, 0xbc, 0xda, 0x8b, 0xf4, 0x89, 0xc7, 0x49, 0xfd, 0xe9, 0xe0, 0x59, 0x0f, 0x6d, 0xdd, 0xc3, 0x9e, 0xa0, 0xf9, 0x6d, 0x89, 0xf8, 0xd7, 0x6a, 0x8a, 0x3c, 0x2e, 0x11, 0xdf, 0xb2, 0x50, + 0x48, 0xad, 0xd2, 0xbd, 0x84, 0x99, 0x50, 0x22, 0x94, 0xa8, 0xae, 0xb3, 0x66, 0x55, 0xd8, 0x8e, 0xa7, 0x83, 0xd1, 0x7c, 0x37, 0x3b, 0x58, 0xd9, 0x9e, 0x9c, 0x4b, 0xcb, 0x83, 0x8c, 0x8c, 0xe5, + 0x92, 0x45, 0x06, 0xf8, 0x3c, 0x3b, 0xa8, 0x5b, 0x59, 0x60, 0x82, 0x60, 0xe5, 0x40, 0xb3, 0xfd, 0xa1, 0x33, 0x66, 0x43, 0x5b, 0x5f, 0x78, 0x83, 0x08, 0x86, 0xe1, 0x72, 0x4d, 0xcd, 0xc6, 0xb6, + 0x21, 0x4f, 0x84, 0x55, 0xff, 0xf5, 0x29, 0xde, 0xd7, 0x12, 0xf1, 0x27, 0xf7, 0xd6, 0x97, 0x5e, 0xd0, 0x9a, 0x27, 0xaf, 0xf6, 0x9b, 0x53, 0x41, 0xf7, 0x2b, 0x44, 0xff, 0x3f, 0xe7, 0x9e, 0xf4, + 0x37, 0xa8, 0x15, 0xbf, 0xab, 0x4b, 0xed, 0xd4, 0x7b, 0xcc, 0x46, 0x5e, 0x5a, 0xf7, 0xb9, 0x10, 0x6d, 0x38, 0x7d, 0x3a, 0x6c, 0xea, 0xe7, 0xb5, 0xd0, 0x6c, 0x0b, 0x14, 0x31, 0x16, 0x26, 0x4f, + 0x8d, 0xf3, 0x68, 0x6f, 0xe5, 0x23, 0xa9, 0xd2, 0x12, 0x0d, 0x8d, 0x27, 0xbd, 0x7d, 0x4d, 0xca, 0x4e, 0xce, 0x4b, 0x8e, 0xab, 0xf4, 0xc5, 0x72, 0x4b, 0x88, 0xa3, 0x0c, 0xdc, 0x01, 0xc3, 0xf9, + 0x94, 0x28, 0x40, 0x45, 0x21, 0x93, 0x1d, 0x09, 0xe1, 0x87, 0x8d, 0x2b, 0x13, 0xc9, 0x44, 0xa7, 0xb0, 0xad, 0xce, 0x69, 0xd1, 0x7a, 0x20, 0x4e, 0xb9, 0xb8, 0xb3, 0x2c, 0x36, 0xaf, 0xb3, 0xf9, + 0x3a, 0xc1, 0x32, 0xfb, 0x28, 0x30, 0x7b, 0x63, 0x84, 0x47, 0x8e, 0x16, 0x7e, 0xd4, 0x9f, 0x3d, 0x55, 0x09, 0xf9, 0xa9, 0x18, 0xb4, 0x2a, 0xca, 0xa0, 0x24, 0x9a, 0x5d, 0xfd, 0xa9, 0xa6, 0x6f, + 0x43, 0xf1, 0xc8, 0xa5, 0xe3, 0xff, 0xb6, 0xc6, 0xed, 0xd6, 0xea, 0xf4, 0x96, 0x25, 0x63, 0x01, 0x60, 0x84, 0xc0, 0x99, 0x31, 0xd5, 0x87, 0xdc, 0x42, 0x5c, 0x04, 0xeb, 0xed, 0x94, 0x05, 0x4b, + 0x84, 0x35, 0x47, 0xc1, 0x40, 0x34, 0x1d, 0x2d, 0xac, 0x53, 0xca, 0x4a, 0x8b, 0x18, 0xde, 0x1a, 0xc1, 0x62, 0x12, 0x03, 0xdc, 0x2e, 0xaa, 0x6b, 0x01, 0x28, 0xc8, 0x3a, 0xe1, 0xab, 0x49, 0x80, + 0xb3, 0x29, 0xd2, 0x5b, 0x53, 0xe8, 0x64, 0xcc, 0x96, 0x03, 0x33, 0xfe, 0x3e, 0xe3, 0x56, 0x49, 0x1e, 0xaf, 0x54, 0xbf, 0xa2, 0x80, 0x95, 0xa4, 0xf1, 0x23, 0x27, 0x56, 0x63, 0xc4, 0xb6, 0xd0, + 0xb9, 0x18, 0xb9, 0xea, 0x09, 0x6c, 0x3c, 0x04, 0xb7, 0x07, 0x98, 0xd8, 0x95, 0x8b, 0x55, 0xd6, 0x33, 0x27, 0x07, 0xa7, 0x70, 0x77, 0x1e, 0x8a, 0xc0, 0x3b, 0xa6, 0x34, 0x59, 0xce, 0x94, 0x3b, + 0x04, 0xb4, 0xa4, 0x62, 0x29, 0x91, 0x0d, 0x93, 0x98, 0x25, 0x53, 0x41, 0x46, 0x66, 0xa3, 0x19, 0x5f, 0x32, 0x2b, 0x74, 0x30, 0x9b, 0xd3, 0x91, 0xb7, 0xc0, 0x10, 0x44, 0x3e, 0x90, 0x3d, 0x6c, + 0x65, 0xf0, 0xcc, 0xa8, 0xf8, 0x71, 0x8e, 0xba, 0x92, 0x58, 0x4d, 0xa8, 0xe4, 0x37, 0x32, 0x00, 0xbd, 0x22, 0x04, 0x27, 0xaa, 0x27, 0x44, 0x9a, 0xc3, 0xee, 0x89, 0xd4, 0x73, 0x5c, 0x42, 0x6c, + 0x19, 0x56, 0x78, 0x36, 0x1f, 0xa2, 0xab, 0x19, 0x30, 0xe0, 0xf7, 0x0c, 0x35, 0xc7, 0x97, 0xb5, 0xeb, 0x28, 0x7b, 0x79, 0x05, 0x63, 0xcb, 0xd9, 0x6e, 0x90, 0x68, 0x5c, 0x96, 0x4d, 0x62, 0x55, + 0xd7, 0x49, 0x7a, 0x93, 0x04, 0x54, 0xc7, 0x1c, 0xd6, 0x18, 0xe1, 0xcc, 0xb1, 0x85, 0x0a, 0xe2, 0x51, 0x41, 0x0f, 0x0b, 0x0f, 0xb3, 0x04, 0x90, 0x46, 0x49, 0x7d, 0xe2, 0xa5, 0xde, 0xb6, 0x08, + 0xc5, 0xd7, 0xbb, 0x6b, 0x1a, 0x25, 0x4e, 0x90, 0x99, 0xe7, 0xa9, 0xee, 0x3f, 0xa0, 0x66, 0x1a, 0xdc, 0xa6, 0x63, 0x25, 0x4a, 0xd5, 0xcd, 0x83, 0x13, 0x8e, 0x8f, 0xdc, 0x51, 0xaf, 0x20, 0xfb, + 0x4e, 0xb7, 0x01, 0xf7, 0xfd, 0xac, 0x71, 0x47, 0xb5, 0x80, 0x77, 0x34, 0xac, 0x0e, 0x21, 0x2f, 0xee, 0xa4, 0x8a, 0xe1, 0xf0, 0x34, 0x93, 0x0c, 0xbc, 0x3f, 0xb1, 0x02, 0x1d, 0xed, 0x87, 0x46, + 0x49, 0x8d, 0x89, 0x9a, 0xd3, 0xcd, 0x98, 0xef, 0xec, 0x87, 0x6e, 0xe0, 0xc9, 0x3e, 0xcd, 0xd6, 0x80, 0xb6, 0xc4, 0x22, 0x93, 0x4c, 0x00, 0x6d, 0x89, 0x6e, 0x62, 0x1c, 0x4c, 0x67, 0x40, 0x04, + 0x8e, 0xf7, 0x9a, 0x2b, 0xf5, 0xfb, 0x8b, 0x72, 0x85, 0x0c, 0x07, 0xc9, 0xb8, 0xfa, 0x4d, 0x53, 0xaf, 0xdd, 0x48, 0x95, 0x9c, 0xfc, 0x98, 0x0f, 0xc5, 0xf4, 0x15, 0x2c, 0x1d, 0xf3, 0x34, 0x56, + 0x1d, 0x0f, 0x4e, 0x12, 0xfa, 0x1c, 0x41, 0x84, 0xd9, 0xd5, 0xc6, 0xa1, 0xc7, 0xf5, 0x06, 0x43, 0xc1, 0x65, 0x86, 0xdc, 0xb0, 0x72, 0x70, 0x00, 0x81, 0x34, 0x72, 0x38, 0x51, 0x2d, 0x15, 0x8c, + 0x87, 0x55, 0x72, 0xc0, 0x46, 0x9b, 0xc3, 0x42, 0x07, 0x15, 0xa6, 0xb4, 0x51, 0x8d, 0x86, 0x77, 0x2e, 0xa7, 0xc2, 0x5b, 0xb3, 0x27, 0xe5, 0x61, 0x68, 0x25, 0x5c, 0xe2, 0xf1, 0x3d, 0x4d, 0x8c, + 0x03, 0x1a, 0x4b, 0xc6, 0xd8, 0x70, 0x24, 0x8b, 0xda, 0x67, 0x87, 0xde, 0x4f, 0x11, 0x6c, 0xbd, 0xbb, 0x98, 0x92, 0x3e, 0xdc, 0xb8, 0x0d, 0xbe, 0xa9, 0xa2, 0xde, 0x1a, 0xc4, 0xb4, 0xd9, 0xa3, + 0xed, 0xf8, 0xaf, 0x59, 0x34, 0x6b, 0xe1, 0x5a, 0xa7, 0x57, 0xa3, 0x8d, 0xc5, 0xae, 0x28, 0x67, 0x9a, 0x62, 0x60, 0x08, 0x2f, 0x0d, 0x32, 0x8a, 0x8a, 0x08, 0x49, 0x8d, 0xf5, 0x68, 0xbb, 0x5a, + 0x72, 0x28, 0xaa, 0xe9, 0xab, 0x54, 0xec, 0x0d, 0xcc, 0x79, 0x5f, 0x92, 0xe4, 0x19, 0x3f, 0xdc, 0xac, 0x99, 0xd4, 0xd9, 0x28, 0xcb, 0xc5, 0x86, 0x83, 0xe4, 0x20, 0xe8, 0xf8, 0xb1, 0x0c, 0xf1, + 0xe6, 0x5a, 0x46, 0x6a, 0x84, 0xdd, 0xf4, 0xeb, 0x55, 0x44, 0xd8, 0xcb, 0x9f, 0x8f, 0x7c, 0x69, 0x96, 0x34, 0x89, 0xce, 0x8f, 0xcd, 0x7c, 0xf8, 0x35, 0x0d, 0x78, 0x45, 0xb8, 0x41, 0xe6, 0xe3, + 0xb4, 0x41, 0xa8, 0x45, 0x27, 0x95, 0x89, 0x8c, 0x2b, 0xa1, 0x2a, 0x13, 0xb7, 0x19, 0xe6, 0xc6, 0x9c, 0xc6, 0x2f, 0x3a, 0xbc, 0x90, 0x19, 0x12, 0xb4, 0xce, 0xe7, 0xd3, 0xde, 0x0e, 0x84, 0xf3, + 0x7c, 0x92, 0x4d, 0x05, 0x68, 0x55, 0xe0, 0x3d, 0x77, 0x2b, 0x4c, 0xa7, 0x16, 0xa6, 0x39, 0xea, 0xac, 0x1c, 0x4e, 0xc2, 0x92, 0xac, 0x6a, 0x79, 0xd1, 0x31, 0x28, 0x0d, 0x22, 0xfb, 0xfe, 0x6c, + 0xb8, 0x50, 0x3c, 0x50, 0x8d, 0x10, 0x3c, 0x29, 0xfe, 0x77, 0x98, 0xfa, 0x69, 0x15, 0x68, 0x7b, 0xe7, 0xf1, 0xdc, 0xf6, 0x95, 0x80, 0x96, 0x0b, 0xd1, 0x06, 0xcb, 0xd3, 0x61, 0xb3, 0x43, 0x42, + 0x0b, 0x1c, 0x79, 0xc3, 0xe9, 0xf1, 0x23, 0x34, 0x5b, 0xda, 0xe0, 0x2e, 0x96, 0x90, 0xe1, 0xc1, 0xde, 0x12, 0x3d, 0x9d, 0x03, 0xfc, 0x72, 0x6d, 0x15, 0xaa, 0x3c, 0x51, 0x56, 0x73, 0x65, 0xb9, + 0xef, 0xa8, 0xa9, 0xbd, 0x77, 0xc1, 0x15, 0xa6, 0x99, 0x23, 0xcd, 0xda, 0x29, 0xfb, 0xc4, 0xa0, 0xdd, 0x64, 0x54, 0x2a, 0xd9, 0x76, 0xaa, 0xd6, 0x9d, 0x71, 0x38, 0xd6, 0x77, 0xb3, 0x43, 0x32, + 0x75, 0x7c, 0x98, 0x73, 0x37, 0x2f, 0x84, 0x18, 0x64, 0xa1, 0xef, 0x68, 0xdd, 0xd4, 0x33, 0x8c, 0xc7, 0x9b, 0x26, 0xbe, 0x24, 0x69, 0x57, 0x84, 0x8f, 0xe8, 0x5c, 0x9d, 0xb6, 0xb5, 0xbc, 0xf6, + 0x73, 0xde, 0x65, 0x63, 0xca, 0x26, 0xa2, 0x03, 0xb8, 0xdd, 0xcc, 0xc7, 0x1d, 0x54, 0x50, 0xeb, 0xd0, 0x59, 0x02, 0x81, 0xb8, 0x1f, 0x51, 0x9b, 0x79, 0xae, 0xc3, 0x79, 0x11, 0x4c, 0xe2, 0x9c, + 0x85, 0x80, 0x03, 0xa6, 0x10, 0x7d, 0x41, 0xe6, 0x26, 0x22, 0x48, 0x69, 0x75, 0x3c, 0x05, 0x85, 0x00, 0x27, 0xc2, 0x1d, 0x20, 0x8a, 0x02, 0x34, 0x53, 0xa5, 0xa9, 0xe2, 0xca, 0x51, 0x84, 0x8c, + 0x7b, 0xd9, 0x0d, 0x42, 0xcf, 0xc4, 0xaa, 0xed, 0x92, 0x60, 0xa1, 0x38, 0x5e, 0xb3, 0xa8, 0x95, 0x55, 0x91, 0xa1, 0x77, 0x1b, 0xd5, 0xf7, 0x68, 0x42, 0x79, 0xbb, 0x27, 0x53, 0x6b, 0x38, 0xef, + 0xbe, 0xe2, 0x08, 0xec, 0xdd, 0x86, 0x06, 0x62, 0xec, 0x39, 0xc4, 0x2c, 0xc7, 0x82, 0x53, 0x67, 0x8e, 0xe2, 0x86, 0x13, 0x19, 0xb5, 0xb3, 0x12, 0xa1, 0xd9, 0x62, 0x01, 0xac, 0x44, 0x93, 0x95, + 0xc0, 0x34, 0x37, 0xc7, 0xab, 0xad, 0xef, 0xae, 0xac, 0x62, 0x9d, 0x86, 0x12, 0x9c, 0xc5, 0x07, 0x2d, 0x13, 0x0c, 0x6a, 0x65, 0xb8, 0x1b, 0xcd, 0x9c, 0x67, 0x87, 0xdd, 0x34, 0xee, 0x8b, 0x1c, + 0x24, 0x1d, 0x04, 0x32, 0x8d, 0x60, 0x3e, 0x59, 0xd1, 0x9b, 0x68, 0xb4, 0xc3, 0xd3, 0xf2, 0x07, 0x10, 0xff, 0x71, 0x77, 0xfa, 0xf0, 0xc3, 0x39, 0xe1, 0xbb, 0x2f, 0xc5, 0x73, 0x6d, 0x25, 0x51, + 0x5b, 0x71, 0xac, 0x70, 0xc2, 0x07, 0x0c, 0x22, 0x5f, 0xdb, 0x14, 0xee, 0x48, 0xb1, 0xe1, 0x47, 0xe1, 0x84, 0x5d, 0xb2, 0xdd, 0x46, 0x70, 0x22, 0xe5, 0x71, 0xbb, 0x82, 0xcf, 0xcb, 0x61, 0x35, + 0x9b, 0x22, 0x0b, 0x93, 0x56, 0xb1, 0xcd, 0x94, 0xde, 0xca, 0xfe, 0xb6, 0x86, 0xcd, 0x35, 0x63, 0x15, 0x30, 0xa2, 0xe3, 0xb5, 0x3c, 0xd0, 0x3d, 0x03, 0x88, 0x11, 0x6b, 0xe1, 0xfa, 0x07, 0x5a, + 0x31, 0x72, 0x06, 0x8c, 0x76, 0x20, 0x5b, 0xa7, 0xd8, 0x62, 0xc3, 0xad, 0x2c, 0x33, 0x8e, 0xfb, 0xf2, 0x3e, 0xa9, 0x0c, 0xa8, 0x37, 0xf4, 0x58, 0xd1, 0x2a, 0xdb, 0xad, 0xcd, 0x5c, 0xa6, 0x57, + 0x77, 0xd6, 0x59, 0xae, 0x03, 0xa5, 0x3f, 0x35, 0xdd, 0x96, 0xe3, 0x6b, 0x35, 0xe5, 0x6e, 0x80, 0xb9, 0xb9, 0xf4, 0x2c, 0x16, 0xf7, 0xe7, 0x45, 0xf6, 0xbe, 0xc6, 0xe2, 0xb6, 0xa8, 0xaa, 0xb7, + 0x58, 0x6e, 0x06, 0xa3, 0x7c, 0x25, 0x21, 0x06, 0x9b, 0x09, 0x93, 0x45, 0x11, 0xcc, 0x77, 0xc4, 0x44, 0xdb, 0x1b, 0x19, 0xe4, 0x82, 0x19, 0xc6, 0xe7, 0x7c, 0x3a, 0xa8, 0x17, 0x8b, 0x3a, 0x35, + 0xf6, 0x2c, 0x06, 0xcb, 0x1e, 0x19, 0x4b, 0xe6, 0x60, 0xbc, 0xe8, 0x3b, 0x69, 0xb9, 0x8d, 0xc7, 0xc5, 0x68, 0x33, 0x5c, 0x8f, 0x78, 0x6b, 0xdb, 0x21, 0x86, 0x40, 0xc1, 0xcc, 0xe7, 0xb6, 0x61, + 0x97, 0x07, 0xf3, 0xf3, 0x1e, 0x35, 0xff, 0x0a, 0x81, 0xb7, 0x77, 0x38, 0xfc, 0xdf, 0x34, 0xb2, 0xf6, 0x31, 0x06, 0xaa, 0xe2, 0x29, 0x81, 0x66, 0xe8, 0xdd, 0xef, 0xdc, 0x4b, 0xd0, 0xcd, 0x3a, + 0x65, 0xdb, 0x8f, 0xbf, 0x25, 0x0d, 0x74, 0x3f, 0x5d, 0x68, 0x86, 0xfa, 0x16, 0xa0, 0x20, 0xe1, 0xca, 0x90, 0x78, 0x50, 0xe4, 0xd6, 0x38, 0x61, 0xcf, 0x21, 0xca, 0x57, 0xb7, 0xe9, 0x14, 0xad, + 0x94, 0x58, 0x22, 0x32, 0xd7, 0x19, 0x79, 0xea, 0x61, 0xc9, 0xca, 0x7c, 0x34, 0x02, 0xa7, 0x9b, 0x5e, 0x87, 0x31, 0xb6, 0xa8, 0xba, 0xa4, 0x94, 0x2d, 0x48, 0x05, 0x87, 0x0c, 0xcc, 0x0e, 0x30, + 0x97, 0x44, 0xcb, 0x68, 0x53, 0x0a, 0xca, 0xa2, 0x1c, 0x7b, 0xe3, 0x55, 0x7f, 0x62, 0xef, 0x24, 0x6c, 0xf1, 0xe3, 0x70, 0x63, 0x55, 0x49, 0x0d, 0x1c, 0x3d, 0xcd, 0x58, 0xef, 0x43, 0x84, 0xbd, + 0x30, 0xf8, 0xbe, 0x53, 0x6d, 0xd0, 0x39, 0x1f, 0x77, 0x1b, 0x5a, 0xcf, 0x81, 0xa1, 0xa6, 0x91, 0xb2, 0xf3, 0x46, 0x01, 0x99, 0xa1, 0xab, 0xb5, 0xca, 0x8f, 0x98, 0xaa, 0xa3, 0x62, 0x9d, 0xe9, + 0xd4, 0x2a, 0x96, 0x68, 0x91, 0xa4, 0x2c, 0x59, 0xa8, 0x45, 0xa2, 0x3a, 0xc2, 0x24, 0x4a, 0x09, 0x73, 0xca, 0x8a, 0x7b, 0x77, 0xcf, 0x26, 0x15, 0xee, 0x3a, 0x60, 0x22, 0x4d, 0x5c, 0x06, 0xdc, + 0xd7, 0xea, 0xdc, 0x58, 0xcc, 0xca, 0xfa, 0x10, 0x93, 0x4e, 0x15, 0x85, 0x28, 0x14, 0x1b, 0x9b, 0x1b, 0x93, 0xff, 0x43, 0x9d, 0xfd, 0x7f, 0xdf, 0xfb, 0xd5, 0x4d, 0xe7, 0x7b, 0xb8, 0xf0, 0xdc, + 0x4e, 0xed, 0x99, 0x46, 0x12, 0xa6, 0xef, 0x8b, 0x07, 0x57, 0xa3, 0xc2, 0x83, 0xd7, 0x44, 0x4a, 0x96, 0x18, 0x61, 0xf0, 0xed, 0x7b, 0xca, 0xb2, 0x7c, 0x3b, 0xdf, 0xd7, 0xbc, 0xec, 0xa7, 0xef, + 0xd0, 0xc2, 0x20, 0xcd, 0xbd, 0xec, 0xf8, 0xd9, 0xdf, 0xbd, 0xe6, 0x44, 0xb6, 0x61, 0xe2, 0x79, 0x7c, 0xfa, 0xf5, 0x65, 0xe8, 0xf9, 0xff, 0x7d, 0x23, 0x4e, 0x8e, 0x15, 0xe4, 0xbe, 0x6a, 0x24, + 0x6f, 0x0f, 0x25, 0xaa, 0xf7, 0xd2, 0x3a, 0xf0, 0x35, 0xe1, 0xa3, 0x50, 0x5d, 0x9d, 0x76, 0x7b, 0xed, 0x56, 0x82, 0xa3, 0x91, 0x8f, 0xce, 0x52, 0x6e, 0x82, 0x7b, 0xb5, 0x35, 0x1f, 0xae, 0x4d, + 0x79, 0xe4, 0x72, 0x21, 0x4f, 0xa6, 0x7a, 0xb8, 0xb4, 0xf9, 0x9a, 0x1f, 0xa1, 0xdc, 0xcc, 0xdf, 0xe1, 0xd8, 0xc4, 0x22, 0x40, 0x35, 0x3a, 0x30, 0xd3, 0x1c, 0x73, 0xf8, 0xd1, 0x7c, 0x52, 0x99, + 0x03, 0x9c, 0xaf, 0x8a, 0x5d, 0x49, 0x64, 0xe4, 0x20, 0x32, 0x11, 0x6c, 0x99, 0xd7, 0x52, 0x15, 0x07, 0x42, 0xea, 0x92, 0xeb, 0xdb, 0xbd, 0x51, 0xbe, 0xd5, 0x13, 0x6d, 0xea, 0x45, 0xa8, 0x4e, + 0xa0, 0x24, 0x55, 0xd7, 0x38, 0x64, 0x46, 0x70, 0xc4, 0xeb, 0xf1, 0xa8, 0xfd, 0x4a, 0xac, 0xca, 0x17, 0xea, 0x0d, 0x90, 0x9f, 0xae, 0x75, 0x1b, 0xda, 0xcf, 0xd1, 0x74, 0x59, 0x2d, 0x9b, 0x00, + 0xe3, 0xb5, 0xa0, 0xca, 0xe1, 0xa4, 0xda, 0x87, 0xc6, 0x48, 0xb5, 0xb7, 0x11, 0xef, 0xcd, 0xe9, 0x78, 0x38, 0xd7, 0xca, 0xed, 0x64, 0x3a, 0x09, 0x2d, 0x14, 0xee, 0x63, 0x23, 0x76, 0x21, 0x95, + 0x82, 0xb8, 0xd2, 0x5d, 0x66, 0xa4, 0x3b, 0xb6, 0xeb, 0x82, 0xac, 0x17, 0xd8, 0x86, 0x40, 0xa8, 0x9e, 0x2a, 0xe2, 0xfa, 0x88, 0x57, 0xcc, 0x39, 0xe5, 0xac, 0xc8, 0x30, 0x14, 0x9e, 0x56, 0xf5, + 0x7e, 0x36, 0x3f, 0x68, 0x07, 0x71, 0x96, 0x18, 0x0f, 0x97, 0x97, 0x5e, 0x54, 0x09, 0x67, 0xa2, 0x27, 0x40, 0x9b, 0xc3, 0xb6, 0x6a, 0x60, 0xcd, 0x73, 0x96, 0xc8, 0x95, 0x2e, 0xa5, 0x48, 0x43, + 0x8c, 0x04, 0x57, 0xdb, 0x00, 0x99, 0x29, 0xda, 0xda, 0x72, 0xf3, 0x24, 0x51, 0x39, 0xdf, 0x20, 0x64, 0x79, 0xbe, 0x1b, 0xae, 0x56, 0x6b, 0xc2, 0xf7, 0xb3, 0x1d, 0x2e, 0x08, 0x4b, 0x1b, 0xec, + 0x5b, 0x48, 0x54, 0x8e, 0xb5, 0x20, 0x13, 0x08, 0x82, 0xed, 0x27, 0x53, 0x68, 0x06, 0xce, 0x0f, 0x7b, 0xd5, 0xc8, 0x5c, 0x2d, 0xdc, 0xd6, 0xeb, 0x72, 0xfa, 0x44, 0x37, 0x26, 0x8a, 0x66, 0x74, + 0x8d, 0x43, 0xa4, 0x04, 0xe9, 0x63, 0x9f, 0x63, 0x13, 0x99, 0xff, 0x42, 0x47, 0xbd, 0x25, 0x7e, 0x44, 0xe4, 0xf6, 0xca, 0x29, 0xe4, 0xbf, 0x45, 0x7f, 0x75, 0x98, 0x7c, 0x31, 0x62, 0x07, 0x56, + 0x32, 0xda, 0x12, 0x23, 0xb8, 0xe8, 0x8f, 0x01, 0xec, 0x10, 0xd5, 0x20, 0x51, 0xaf, 0x46, 0x34, 0x08, 0x8a, 0x51, 0x6e, 0xc5, 0xb6, 0xbf, 0xcb, 0xd6, 0x3e, 0xc7, 0xe3, 0x18, 0x44, 0xfa, 0x4c, + 0xbe, 0xe4, 0x42, 0x7e, 0x37, 0xf0, 0xf4, 0x3e, 0xed, 0x81, 0x16, 0x44, 0x12, 0xb9, 0x19, 0xd6, 0xba, 0x32, 0xb2, 0x36, 0x53, 0x6d, 0x37, 0x50, 0x71, 0x28, 0x1e, 0x3a, 0xcf, 0x24, 0xec, 0xb1, + 0x85, 0xf8, 0xc5, 0xa2, 0xb8, 0x63, 0xa8, 0x6b, 0x61, 0xa0, 0x29, 0x59, 0xd7, 0x6f, 0xfc, 0x66, 0xbf, 0xc0, 0x9b, 0x25, 0xb9, 0x27, 0xfc, 0x78, 0x24, 0x90, 0xc8, 0x6b, 0x02, 0xd9, 0x90, 0xbc, + 0x80, 0x9f, 0x36, 0x89, 0x03, 0x2d, 0x84, 0x51, 0x25, 0x73, 0xbf, 0x33, 0x83, 0x96, 0x35, 0x87, 0x6c, 0xd8, 0x55, 0x5d, 0xd8, 0x3e, 0x6e, 0x8d, 0x6b, 0xa8, 0x32, 0x45, 0x95, 0xce, 0xf0, 0x9d, + 0xe8, 0x69, 0xfd, 0x29, 0x55, 0xa4, 0x7e, 0xcc, 0xc8, 0xf2, 0xa0, 0x44, 0xf1, 0x1a, 0x87, 0x71, 0x6f, 0xed, 0xf6, 0x5c, 0xa8, 0xea, 0x2f, 0x36, 0x08, 0x32, 0xc2, 0x46, 0x1d, 0x8f, 0x16, 0x22, + 0x99, 0x5b, 0x40, 0x7b, 0xd2, 0xeb, 0x10, 0xe4, 0x48, 0x01, 0x5f, 0x87, 0xdc, 0x74, 0x3c, 0xaf, 0x9b, 0x28, 0x81, 0x75, 0x8a, 0x3f, 0x23, 0x7e, 0x73, 0x89, 0xf3, 0x1b, 0x0e, 0xe4, 0xa6, 0xf9, + 0x30, 0x9d, 0x03, 0xbf, 0x29, 0xe4, 0xd4, 0x9a, 0x03, 0x0d, 0xc9, 0x23, 0x07, 0x9a, 0x83, 0x6e, 0x43, 0xe5, 0x39, 0x07, 0x06, 0xa2, 0xc3, 0x44, 0xf3, 0x43, 0x56, 0x3a, 0xb2, 0x3c, 0xea, 0xcb, + 0xaa, 0xa6, 0x8a, 0x63, 0x4d, 0x76, 0xfb, 0xcb, 0xf5, 0x98, 0x09, 0x7a, 0x55, 0x0c, 0x44, 0xec, 0x60, 0x2f, 0x7a, 0x3d, 0x0c, 0xa0, 0x0e, 0x35, 0x0b, 0x05, 0x0a, 0xad, 0x65, 0x73, 0x62, 0xc7, + 0xe3, 0x64, 0xe2, 0x70, 0x80, 0x35, 0x5b, 0xb1, 0x3b, 0x22, 0xd5, 0x13, 0x4e, 0xad, 0x48, 0x3b, 0x34, 0x29, 0x76, 0x97, 0xe7, 0x31, 0xff, 0x97, 0xf1, 0xf3, 0x27, 0x1a, 0x3f, 0x2d, 0xe4, 0xf6, + 0xda, 0xa8, 0x3e, 0x8e, 0x12, 0x9f, 0x76, 0x0c, 0x75, 0x0c, 0xc3, 0x20, 0x30, 0xf4, 0xdc, 0x08, 0xb7, 0x1b, 0x23, 0x4e, 0x52, 0x64, 0x26, 0xa1, 0xff, 0xdd, 0x78, 0xfd, 0xa2, 0x98, 0x36, 0x74, + 0x3f, 0x64, 0xb5, 0x89, 0xe7, 0x6c, 0x99, 0x99, 0xc5, 0x09, 0xda, 0xb6, 0x2f, 0xa9, 0xcc, 0x34, 0xeb, 0x87, 0x84, 0x6a, 0xc7, 0xfd, 0x14, 0xc7, 0x70, 0x70, 0x54, 0xe9, 0xe8, 0x56, 0x09, 0x0b, + 0xd9, 0xe3, 0x81, 0x7d, 0x6f, 0x8d, 0xd8, 0xee, 0x5a, 0x1a, 0x00, 0x75, 0xb9, 0x21, 0xa6, 0xf4, 0x5a, 0x5f, 0x4d, 0x51, 0x6b, 0x9c, 0x01, 0x6a, 0x5d, 0xae, 0x7a, 0x9c, 0xba, 0xc4, 0xe2, 0x50, + 0xed, 0x0c, 0x30, 0x37, 0x4f, 0xe5, 0x54, 0x05, 0x77, 0xc2, 0x14, 0xfe, 0xb1, 0x83, 0x5e, 0xad, 0xb2, 0x6f, 0x46, 0xd0, 0x57, 0xa6, 0xb8, 0x0d, 0xc5, 0x23, 0x24, 0xc7, 0xff, 0x6d, 0xc3, 0x07, + 0x80, 0xb9, 0x49, 0x88, 0x55, 0x2d, 0x1e, 0xf0, 0x15, 0x52, 0x2d, 0x27, 0xbc, 0xca, 0x53, 0x6b, 0xa2, 0x87, 0xe1, 0x09, 0xa9, 0x25, 0x70, 0x87, 0x77, 0x49, 0x8a, 0xc1, 0xf4, 0x8c, 0x2c, 0x57, + 0x0b, 0x84, 0x16, 0xa8, 0xd0, 0xd8, 0x62, 0xe4, 0x3c, 0x1c, 0x55, 0x8c, 0x44, 0x2e, 0xc8, 0x7a, 0xb8, 0x9f, 0x6f, 0x57, 0x99, 0x2b, 0xae, 0x1c, 0xdc, 0xac, 0x79, 0x7c, 0x00, 0x46, 0xb4, 0xae, + 0xed, 0xd4, 0x7e, 0x7b, 0x13, 0xb3, 0x71, 0xdf, 0xb5, 0x19, 0xef, 0x34, 0xc5, 0xf3, 0xba, 0xaa, 0x13, 0xe8, 0x7f, 0xaa, 0x15, 0xf4, 0x4e, 0x15, 0xe8, 0x7e, 0x1c, 0xb7, 0xb5, 0x83, 0x08, 0xbe, + 0x33, 0x50, 0x19, 0xc7, 0x4e, 0x68, 0x6c, 0x33, 0x54, 0x07, 0x3b, 0x23, 0xd5, 0xb2, 0xd2, 0x17, 0xa7, 0x8a, 0x81, 0x27, 0xbc, 0x33, 0xae, 0xfd, 0x1a, 0x72, 0xb4, 0xc4, 0xd8, 0x4c, 0x3a, 0xa0, + 0x42, 0x11, 0xb3, 0x89, 0x99, 0xc7, 0x76, 0x3f, 0x0d, 0x61, 0xb1, 0x17, 0x68, 0x91, 0x36, 0xc8, 0x6a, 0x4e, 0xc8, 0xea, 0xad, 0x09, 0x0b, 0xc3, 0x61, 0x6e, 0x6c, 0x26, 0x43, 0x71, 0x97, 0xc6, + 0x49, 0xdb, 0xb0, 0xe8, 0x73, 0x2d, 0xdb, 0x0b, 0x24, 0xa7, 0xed, 0x5e, 0x6e, 0x0b, 0x12, 0x18, 0x59, 0xf7, 0x68, 0xd9, 0x39, 0x41, 0xea, 0x68, 0xef, 0xca, 0xbf, 0x6d, 0x20, 0x73, 0x8b, 0x61, + 0xb3, 0xb5, 0xab, 0xf4, 0x88, 0x6c, 0xea, 0x7c, 0x2f, 0xee, 0x3f, 0x9f, 0x1b, 0xbc, 0x53, 0x3d, 0xf3, 0xae, 0x39, 0x6e, 0xc4, 0xbe, 0xc5, 0x5c, 0x60, 0x41, 0xd2, 0x2e, 0x95, 0x6e, 0x0b, 0x79, + 0xd5, 0x59, 0x8f, 0x59, 0x69, 0x0c, 0x41, 0xf6, 0x88, 0x11, 0xfa, 0x05, 0x81, 0xee, 0x44, 0x9c, 0xd8, 0x49, 0x0e, 0x36, 0x99, 0x0c, 0xe6, 0x9b, 0x71, 0x3c, 0x83, 0x11, 0x2c, 0xa5, 0x7d, 0x77, + 0x8b, 0x76, 0xe2, 0x43, 0x8f, 0xcb, 0x0b, 0x2f, 0xc5, 0x9c, 0xa2, 0x9a, 0xf7, 0xe7, 0x5a, 0x76, 0x40, 0xf1, 0x83, 0x30, 0x13, 0x10, 0x45, 0xcc, 0xfb, 0x44, 0x9a, 0x3e, 0x8d, 0x07, 0x7d, 0xe6, + 0x94, 0x6b, 0x05, 0xa5, 0x6f, 0x78, 0x9a, 0xf2, 0x30, 0xa2, 0xe1, 0xb5, 0x34, 0xad, 0x77, 0xaa, 0x0d, 0x94, 0xe7, 0xe3, 0xb6, 0x69, 0x5a, 0x33, 0x98, 0x5c, 0x89, 0x34, 0x44, 0x80, 0x41, 0xb9, + 0x59, 0xe1, 0x88, 0xe4, 0x66, 0x5e, 0x9f, 0xef, 0x23, 0xba, 0xa7, 0x0b, 0x54, 0xa4, 0x4c, 0xb6, 0xf2, 0x9e, 0x1f, 0x43, 0x39, 0x37, 0x30, 0x6b, 0x13, 0x49, 0x96, 0xf9, 0xc2, 0xb0, 0x46, 0xca, + 0xc8, 0x48, 0x2b, 0xc3, 0xe8, 0xec, 0x0e, 0x42, 0x67, 0x83, 0xaf, 0x8a, 0x25, 0x2b, 0xac, 0x71, 0x29, 0xd1, 0x79, 0x7d, 0xe9, 0x2c, 0x21, 0x0c, 0x29, 0x27, 0xcf, 0x22, 0x1a, 0xfe, 0x4c, 0x28, + 0xbf, 0xcb, 0x52, 0xc7, 0x5f, 0xda, 0xbe, 0xe0, 0x96, 0xf4, 0x0d, 0xa8, 0x4d, 0x56, 0x3a, 0xde, 0x6e, 0x0f, 0x83, 0x5d, 0x52, 0x2a, 0x14, 0x58, 0xf4, 0xa7, 0x4a, 0xbd, 0xa0, 0xf7, 0x01, 0xe8, + 0x44, 0xa2, 0xc3, 0x45, 0x2b, 0xc5, 0xdd, 0xb1, 0x2b, 0xa3, 0x33, 0x75, 0x05, 0x33, 0x71, 0x6d, 0x8d, 0xe6, 0x0e, 0x93, 0x0c, 0xa8, 0x03, 0xb5, 0xf0, 0x46, 0x3a, 0xb9, 0x28, 0x81, 0xb5, 0xe2, + 0x2b, 0x35, 0xd6, 0xa7, 0xd1, 0x8d, 0x69, 0xa7, 0xc8, 0x4a, 0x5a, 0x22, 0x72, 0xcf, 0x2f, 0x97, 0x39, 0xb0, 0x40, 0x52, 0x64, 0xf7, 0x0c, 0xd9, 0x6f, 0x22, 0xf8, 0xae, 0x64, 0xef, 0xd7, 0xdf, + 0xb1, 0xcf, 0x36, 0x82, 0xaf, 0x44, 0xdd, 0x50, 0x75, 0x7f, 0xdd, 0x75, 0xfa, 0xc7, 0xb9, 0xa3, 0xed, 0xbb, 0x5e, 0x92, 0xbf, 0x37, 0xff, 0x8e, 0x59, 0xfc, 0xdb, 0x43, 0xd7, 0x0f, 0x23, 0x66, + 0x9b, 0x88, 0xc1, 0x07, 0x12, 0x82, 0xbe, 0xa4, 0xab, 0x4f, 0x31, 0x88, 0xdd, 0xd3, 0xff, 0x26, 0xa6, 0xaa, 0x85, 0x3c, 0x84, 0xd3, 0x40, 0xb5, 0x07, 0xd5, 0x72, 0xbc, 0x8d, 0xa4, 0xdc, 0xa8, + 0x49, 0x87, 0xe6, 0xfc, 0xaa, 0xaf, 0xa0, 0x81, 0xea, 0xa2, 0x63, 0x5e, 0xa8, 0x72, 0x5b, 0x03, 0xca, 0xaa, 0xb7, 0xdf, 0x11, 0xc0, 0x66, 0xbd, 0xd0, 0xca, 0x31, 0xdf, 0x5b, 0x53, 0x38, 0x4e, + 0x2e, 0x72, 0x72, 0xb9, 0xe7, 0x89, 0x0e, 0x38, 0x24, 0xf0, 0xd5, 0x6c, 0xc9, 0x1b, 0x55, 0xd9, 0x63, 0x22, 0x01, 0xc4, 0x21, 0x07, 0x7d, 0x9a, 0x18, 0xf0, 0xcd, 0xf2, 0xcf, 0x4d, 0xe4, 0xeb, + 0xa9, 0x24, 0xce, 0x0d, 0xd3, 0xbf, 0x2c, 0x17, 0x1c, 0x27, 0x44, 0xd0, 0x0b, 0x59, 0xd5, 0x7f, 0x42, 0xb0, 0xf4, 0x09, 0xf0, 0xe6, 0xef, 0x8f, 0xc2, 0x3d, 0x35, 0x3b, 0xdc, 0x3b, 0xba, 0xf2, + 0xdd, 0x1e, 0xbc, 0x3f, 0x9f, 0x69, 0x5d, 0x88, 0x36, 0x02, 0x70, 0x3a, 0x6c, 0xb6, 0xdc, 0x6d, 0x31, 0xdb, 0x62, 0x13, 0x24, 0x35, 0xa7, 0xcb, 0x05, 0x1e, 0x8a, 0x9a, 0x6b, 0xc2, 0x13, 0x5f, + 0xf2, 0x07, 0x13, 0xd3, 0x58, 0x73, 0xc5, 0x96, 0xd6, 0x0d, 0xeb, 0x40, 0x83, 0xce, 0x5a, 0xc0, 0x0c, 0x15, 0x5e, 0x43, 0x60, 0x3e, 0x98, 0x48, 0x0c, 0xb5, 0x22, 0x79, 0xba, 0x92, 0xf5, 0x35, + 0x55, 0xad, 0x55, 0xf2, 0xb0, 0x9d, 0xd7, 0xc8, 0xd0, 0x75, 0x45, 0xcb, 0xed, 0xed, 0x67, 0x9b, 0x54, 0x16, 0xe3, 0x3e, 0xbe, 0x7f, 0x16, 0xe0, 0xd4, 0x7a, 0x02, 0xe6, 0x04, 0xba, 0x53, 0x38, + 0x7a, 0xae, 0x78, 0xdf, 0xce, 0x5a, 0x22, 0x25, 0xf7, 0x7c, 0xc7, 0xf3, 0x92, 0xd3, 0xd4, 0xe8, 0x44, 0x1d, 0x78, 0x6d, 0xe6, 0x72, 0x15, 0x8f, 0xfb, 0xeb, 0x1f, 0xb7, 0x86, 0xf3, 0x71, 0x5e, + 0x73, 0x71, 0x54, 0x1c, 0xdb, 0x3e, 0xa5, 0x78, 0x59, 0x5e, 0xa8, 0x76, 0x23, 0x25, 0x31, 0x4e, 0x25, 0x41, 0xff, 0x81, 0x7d, 0x7e, 0xd8, 0x49, 0xbb, 0x67, 0x67, 0xe3, 0x25, 0x96, 0xf5, 0x1f, + 0xf0, 0x67, 0x19, 0xbf, 0xaa, 0xec, 0xf4, 0x8f, 0x2f, 0x95, 0x9d, 0xbe, 0x06, 0xc3, 0xfe, 0xe3, 0x4b, 0x30, 0x6c, 0x62, 0x28, 0xba, 0xee, 0x24, 0xd1, 0xb9, 0xf5, 0xb5, 0x0d, 0xca, 0x6e, 0xe3, + 0xa3, 0xde, 0x9f, 0xbb, 0xac, 0xc8, 0x3d, 0xce, 0x82, 0x34, 0xd3, 0xa6, 0xfa, 0x41, 0x7a, 0xfe, 0x38, 0xa4, 0x55, 0xf4, 0x9f, 0xe6, 0x85, 0xb9, 0xfe, 0xfe, 0xdc, 0xbd, 0x6e, 0x41, 0xbc, 0x66, + 0x8d, 0x7f, 0xd0, 0x3d, 0xf6, 0x8c, 0x8f, 0xb3, 0x66, 0x63, 0xa4, 0x16, 0x03, 0xe4, 0xc6, 0xe1, 0xe3, 0x4d, 0x3a, 0xdf, 0x73, 0xb2, 0xcf, 0x71, 0x32, 0x7e, 0x50, 0x90, 0x7d, 0x7d, 0x00, 0x38, + 0xaa, 0x43, 0x76, 0xd6, 0x1d, 0x0d, 0x33, 0x86, 0xfb, 0x55, 0x26, 0x8f, 0x35, 0x67, 0xdf, 0x59, 0x1c, 0xe0, 0x03, 0x13, 0xaa, 0x7e, 0xad, 0x29, 0x5a, 0x09, 0xf5, 0xf9, 0x61, 0x65, 0xda, 0x3c, + 0xab, 0x08, 0xd3, 0xfd, 0xb8, 0x20, 0xc5, 0xc3, 0x96, 0xe7, 0x67, 0xf5, 0x1a, 0xef, 0x85, 0xdb, 0x41, 0xdc, 0xd2, 0x22, 0xff, 0x8d, 0xfd, 0xa8, 0x9b, 0xc4, 0x39, 0xd5, 0xb1, 0x2e, 0xb5, 0x69, + 0xbf, 0x38, 0xe9, 0xa2, 0x24, 0xd4, 0x8c, 0xf4, 0xf4, 0x34, 0xf8, 0xd6, 0x54, 0x62, 0xb9, 0x6e, 0xce, 0x33, 0xc7, 0xbb, 0xb4, 0xc1, 0xb7, 0x7b, 0xdf, 0xe5, 0xb9, 0xa3, 0x9f, 0x7f, 0x16, 0xf2, + 0xc2, 0x3a, 0x31, 0x84, 0xff, 0xf1, 0xff, 0xfe, 0x1b, 0xdc, 0x26, 0x80, 0xe5, 0x9a, 0x77, 0xb7, 0x4b, 0xbb, 0x7f, 0xe5, 0xaf, 0xfe, 0x95, 0xbf, 0xfa, 0x23, 0x89, 0xf9, 0x2b, 0x7f, 0xb5, 0x55, + 0xfe, 0xea, 0xe7, 0x84, 0x9a, 0x7b, 0xf8, 0xbc, 0x56, 0x41, 0xe6, 0x86, 0xf2, 0x71, 0x24, 0xbe, 0x3e, 0x6f, 0x5b, 0x3b, 0x66, 0xb9, 0xec, 0x33, 0x8b, 0xd4, 0x25, 0x9c, 0x1c, 0x38, 0xa8, 0x58, + 0x38, 0xdd, 0x69, 0xe9, 0x60, 0xb4, 0x8a, 0xa2, 0xc1, 0x3c, 0x48, 0x5d, 0x00, 0x83, 0xf9, 0xb5, 0xb8, 0x9c, 0xaa, 0x68, 0xbd, 0xc0, 0xc2, 0x60, 0x5b, 0xae, 0x07, 0x48, 0xbd, 0xf6, 0x7d, 0x31, + 0x9c, 0x6b, 0xbc, 0x39, 0x64, 0x3a, 0xcc, 0x92, 0x8d, 0xcc, 0x29, 0x20, 0x61, 0x24, 0x6a, 0x72, 0x16, 0x42, 0xca, 0x23, 0x46, 0xe9, 0x7b, 0xd3, 0x67, 0x33, 0xec, 0x67, 0xe9, 0x47, 0x81, 0xe2, + 0x37, 0xe2, 0xfd, 0x0f, 0xa8, 0xd9, 0x24, 0xf4, 0xa7, 0xc3, 0x21, 0xd1, 0x32, 0x9a, 0xef, 0xe6, 0x65, 0xf7, 0xe5, 0xf6, 0x95, 0xed, 0x8d, 0x3f, 0xc8, 0xbe, 0x33, 0xe5, 0x78, 0xd2, 0xf8, 0x3d, + 0x5b, 0x04, 0x2b, 0xe9, 0x7c, 0xd5, 0x41, 0xa8, 0x7c, 0x83, 0x28, 0x70, 0x39, 0x57, 0xe5, 0xd1, 0x38, 0xe7, 0xe4, 0x48, 0xd4, 0x2c, 0x77, 0x98, 0xcf, 0x24, 0x20, 0xa7, 0x67, 0x40, 0xae, 0x6a, + 0xf2, 0xa0, 0xc7, 0x6f, 0x55, 0x36, 0x24, 0x4d, 0x13, 0xe5, 0xc9, 0x6a, 0x1d, 0x61, 0xb4, 0x09, 0x1a, 0xe6, 0x8a, 0xcc, 0xfb, 0xe1, 0x2e, 0xc4, 0x62, 0x74, 0x70, 0x20, 0xf4, 0x5d, 0x8f, 0xb7, + 0x84, 0xe1, 0xd6, 0xa2, 0x52, 0xe1, 0xc7, 0x7e, 0x4f, 0x2d, 0xf4, 0x55, 0x27, 0x30, 0xf4, 0xe3, 0xe8, 0x65, 0x28, 0x8f, 0x5d, 0xc3, 0xe0, 0x1b, 0xf9, 0x02, 0x40, 0x37, 0xb4, 0x1b, 0x94, 0x6e, + 0xae, 0x34, 0xdd, 0x99, 0x7c, 0x0e, 0xd5, 0x40, 0x98, 0xa3, 0xdc, 0xd2, 0xcc, 0x27, 0xc6, 0xc8, 0x24, 0x34, 0x5a, 0xa5, 0xb9, 0xc9, 0x60, 0x6b, 0x4f, 0x57, 0x6c, 0xdc, 0x81, 0xf7, 0x14, 0x95, + 0xd0, 0x9e, 0xbf, 0xa4, 0x0b, 0xad, 0x18, 0xf4, 0x31, 0x9a, 0x86, 0x46, 0xf2, 0x74, 0x9b, 0xad, 0x06, 0xd4, 0x8a, 0xb5, 0x75, 0xaf, 0xee, 0xd5, 0xfc, 0xae, 0x3c, 0xd8, 0xa4, 0xc7, 0xea, 0x41, + 0xe1, 0x73, 0xbc, 0x01, 0x74, 0x30, 0x4d, 0x0f, 0xfb, 0xfa, 0xeb, 0x33, 0x6f, 0xdd, 0xf0, 0x94, 0xea, 0x1a, 0xb2, 0x53, 0xa6, 0xc6, 0x0b, 0x96, 0x62, 0x4b, 0x67, 0x6b, 0xe8, 0xfb, 0x4a, 0xa0, + 0x3f, 0x5c, 0x5f, 0x82, 0x5e, 0x1b, 0x77, 0xdf, 0xc9, 0x9e, 0x18, 0x73, 0x3a, 0xee, 0x42, 0x2d, 0x87, 0xd8, 0xde, 0x88, 0xf3, 0xb6, 0x59, 0x06, 0xd0, 0xf3, 0x70, 0x97, 0x90, 0x61, 0x58, 0xb9, + 0xee, 0x7c, 0xa9, 0x8f, 0x1d, 0x8f, 0x17, 0xf7, 0xeb, 0xc9, 0x96, 0xee, 0x0c, 0xed, 0x03, 0x27, 0x66, 0xfc, 0xb4, 0xdc, 0x83, 0x4b, 0xd4, 0x45, 0xbd, 0x15, 0x3a, 0x8f, 0xdc, 0x3c, 0xf6, 0x97, + 0x87, 0x24, 0xa4, 0xcd, 0xc0, 0x14, 0x57, 0x23, 0x61, 0x3c, 0x12, 0x68, 0xa2, 0x4c, 0xaa, 0x91, 0xbd, 0x55, 0x92, 0xb9, 0xeb, 0xff, 0x24, 0x96, 0x17, 0x6a, 0xe5, 0x55, 0x0a, 0xfd, 0x28, 0x0c, + 0x8c, 0x20, 0xeb, 0x1a, 0xbe, 0x93, 0x65, 0x8f, 0x21, 0x7c, 0x29, 0x29, 0xf4, 0x0b, 0xf5, 0x13, 0x92, 0xb7, 0xd7, 0xba, 0x50, 0xbb, 0x04, 0xd1, 0xa5, 0x8e, 0xa4, 0x06, 0x2e, 0xd0, 0x9d, 0x94, + 0x87, 0xc4, 0x32, 0x96, 0xdd, 0x54, 0x13, 0x92, 0x3c, 0x89, 0xfa, 0x8b, 0xb1, 0xc9, 0x83, 0x40, 0xb5, 0x0b, 0x56, 0x4e, 0x80, 0x0b, 0x40, 0xc2, 0x22, 0x3e, 0x9f, 0x67, 0xa3, 0x42, 0x4a, 0x18, + 0xca, 0x9e, 0xe4, 0x2a, 0x92, 0xf4, 0xc0, 0x7c, 0xae, 0x76, 0x56, 0xfd, 0x15, 0x9d, 0xf7, 0x41, 0x61, 0x17, 0xd2, 0x3d, 0x70, 0xa7, 0x9b, 0x4a, 0x96, 0x2e, 0x7f, 0xbc, 0x25, 0xf0, 0xcd, 0x02, + 0xf4, 0x3d, 0xa4, 0xc0, 0x17, 0x75, 0xd8, 0x85, 0x6c, 0x03, 0xd1, 0xe5, 0xa4, 0x0b, 0xb6, 0xd3, 0x5e, 0xc0, 0x2a, 0x29, 0x50, 0x3d, 0x2d, 0x2b, 0x61, 0x4e, 0x9b, 0xa1, 0x3d, 0x8c, 0xea, 0x5e, + 0x88, 0xef, 0x54, 0x64, 0x58, 0x23, 0xab, 0x44, 0x62, 0x63, 0x7a, 0x84, 0x25, 0x62, 0x6e, 0x0f, 0x97, 0x84, 0x62, 0x67, 0x9e, 0xba, 0x9b, 0x06, 0xeb, 0x43, 0x09, 0xab, 0xcc, 0x80, 0x5b, 0x7a, + 0xae, 0x42, 0x11, 0xfd, 0xed, 0x48, 0xd9, 0xca, 0x64, 0x99, 0x8e, 0xf4, 0x50, 0x1f, 0x14, 0xea, 0xde, 0x9e, 0xfa, 0xf1, 0x0b, 0xd8, 0x84, 0x7b, 0xe7, 0x91, 0x0e, 0x01, 0xdf, 0xb0, 0x97, 0x24, + 0xe8, 0x48, 0xb2, 0xc1, 0xe4, 0x78, 0xd0, 0x6d, 0xa8, 0x3c, 0xc7, 0x63, 0x27, 0x23, 0x43, 0xa9, 0x0a, 0x80, 0x90, 0xb4, 0xcc, 0xe9, 0xc4, 0x0b, 0xbc, 0x2d, 0x61, 0x11, 0x87, 0x18, 0xb5, 0x2a, + 0x1e, 0xe7, 0x57, 0xb9, 0x3d, 0x5c, 0x4c, 0x15, 0x65, 0x98, 0xa6, 0x43, 0x1a, 0x8e, 0x2d, 0x56, 0x5a, 0x81, 0xd6, 0xc2, 0xca, 0xc4, 0x22, 0xac, 0xe4, 0x99, 0x98, 0xf5, 0x28, 0x15, 0xd7, 0x19, + 0xd4, 0x36, 0xb5, 0x9e, 0xbe, 0xc6, 0x94, 0x64, 0x5f, 0x68, 0x00, 0xcf, 0xf8, 0xc9, 0x0f, 0xa3, 0xbc, 0xdb, 0x75, 0xbf, 0xe3, 0x57, 0xb9, 0x0f, 0xfd, 0x35, 0xf0, 0x8b, 0x8a, 0xf7, 0x4c, 0xf5, + 0x1d, 0x37, 0x57, 0x49, 0x9a, 0x50, 0xd2, 0x16, 0x6a, 0x77, 0xc6, 0x1e, 0xf0, 0x70, 0x94, 0x4c, 0x3b, 0x0b, 0xbb, 0x9e, 0x4d, 0x27, 0x52, 0xcf, 0xc5, 0x56, 0x04, 0xb0, 0x43, 0x5c, 0x0e, 0xf0, + 0xa5, 0x51, 0xc1, 0x02, 0xac, 0x31, 0x86, 0x36, 0x82, 0x3f, 0x09, 0x70, 0x0c, 0x76, 0x16, 0x0c, 0xb6, 0x43, 0x45, 0xba, 0x66, 0x7a, 0x5e, 0x07, 0xe3, 0x39, 0x7e, 0xeb, 0x55, 0xa2, 0x48, 0x75, + 0x56, 0xfe, 0x5a, 0x5a, 0xf8, 0xe0, 0x48, 0x90, 0xca, 0x88, 0xc5, 0x26, 0xf1, 0x8f, 0xa3, 0x26, 0xb5, 0xc4, 0x50, 0x32, 0xa3, 0x7b, 0x9e, 0x3f, 0x7c, 0x63, 0x96, 0xbc, 0xd0, 0xd5, 0x6e, 0x48, + 0x1f, 0x21, 0xba, 0xb9, 0xd0, 0x76, 0x59, 0x56, 0xd7, 0xa6, 0x83, 0x2d, 0xe2, 0x06, 0x20, 0x17, 0x8d, 0x95, 0xad, 0xeb, 0xa4, 0xe1, 0xb2, 0x30, 0x0e, 0xe3, 0xc9, 0xba, 0x3f, 0xad, 0x95, 0x98, + 0xa8, 0xe1, 0x44, 0x9e, 0x1e, 0xcc, 0x0e, 0xb7, 0x4a, 0x7a, 0xe2, 0x5e, 0xf7, 0x47, 0x7e, 0x2a, 0xa1, 0x3e, 0xec, 0x69, 0xb3, 0xd0, 0x4d, 0x5c, 0x60, 0x30, 0xf2, 0x48, 0x7f, 0x8f, 0xad, 0x0f, + 0x9c, 0xbf, 0xa3, 0x3a, 0x66, 0xb6, 0xdc, 0x2f, 0x00, 0x24, 0x7c, 0x64, 0x30, 0x7e, 0x87, 0x53, 0x98, 0xa6, 0xdd, 0x34, 0x52, 0xca, 0x47, 0x51, 0x46, 0xc4, 0x4b, 0xc1, 0x15, 0x57, 0x74, 0x1b, + 0x84, 0xde, 0xcf, 0x1a, 0xdf, 0x46, 0x0b, 0xc7, 0x9f, 0xb3, 0x64, 0x17, 0x93, 0xa9, 0xb4, 0x58, 0xf7, 0xe7, 0x2c, 0xa1, 0x8f, 0x16, 0x3c, 0x99, 0xec, 0x55, 0x3e, 0x58, 0x44, 0x15, 0x5b, 0x59, + 0x1a, 0x3b, 0xc8, 0x36, 0x6e, 0x64, 0x6c, 0xe6, 0x8c, 0x55, 0x91, 0x9b, 0x05, 0x9c, 0x6c, 0xb5, 0xc3, 0x76, 0x46, 0x8a, 0xe9, 0x7e, 0x69, 0x08, 0x1e, 0xce, 0x27, 0x34, 0x3c, 0x24, 0x3a, 0xd2, + 0x24, 0x51, 0xac, 0x14, 0x8a, 0x21, 0x6c, 0x90, 0xeb, 0x1a, 0x31, 0xc4, 0x9f, 0x39, 0xfe, 0x1e, 0x9b, 0x24, 0x91, 0x92, 0xd9, 0xdd, 0xbd, 0x71, 0x0a, 0xff, 0x47, 0xbe, 0x78, 0x7e, 0x6d, 0x43, + 0x55, 0x02, 0xab, 0x7b, 0xd6, 0xf2, 0xbf, 0xfe, 0xed, 0x5e, 0x7d, 0xb6, 0xd2, 0x76, 0xae, 0x52, 0xc0, 0x7f, 0xbe, 0x1e, 0xd0, 0x2a, 0x05, 0x5c, 0x37, 0x4e, 0x9e, 0xb7, 0x47, 0xe2, 0xfe, 0xf3, + 0x11, 0xb4, 0xa1, 0xd8, 0x24, 0x0a, 0x1c, 0x21, 0x80, 0x9e, 0xaf, 0x37, 0x42, 0x5d, 0x4a, 0x89, 0x35, 0x81, 0x26, 0xf4, 0x7d, 0x20, 0x0d, 0x06, 0x7d, 0x6d, 0x66, 0xf9, 0x3b, 0x8c, 0x1d, 0xaa, + 0x43, 0xed, 0x60, 0x7d, 0x37, 0xc3, 0xfb, 0x2e, 0xc9, 0x01, 0x79, 0x83, 0x5f, 0xd8, 0x81, 0xfc, 0x36, 0xc9, 0xa1, 0xa1, 0xf1, 0x5c, 0xf2, 0x98, 0x81, 0x5b, 0xef, 0x76, 0x94, 0x83, 0x8a, 0xb6, + 0xe9, 0x08, 0x85, 0x53, 0x27, 0x03, 0xc1, 0x28, 0x44, 0x71, 0x3b, 0xca, 0x02, 0x26, 0xde, 0x98, 0x06, 0x71, 0x80, 0x28, 0xdb, 0xea, 0xa7, 0x9a, 0x58, 0xe3, 0xb2, 0x3a, 0x53, 0xcd, 0x70, 0xb6, + 0x9c, 0x2d, 0x72, 0x4b, 0x14, 0x2a, 0x3a, 0xb3, 0x71, 0x93, 0x94, 0xfb, 0xcb, 0xb5, 0xb4, 0xaa, 0x36, 0xa3, 0x01, 0x0b, 0x10, 0x9b, 0x1c, 0xcd, 0xa0, 0xed, 0xeb, 0x33, 0x39, 0xff, 0xda, 0x8b, + 0xd6, 0x46, 0x00, 0x9a, 0x75, 0x2b, 0xa7, 0x7e, 0x3c, 0xe8, 0xbd, 0xe2, 0x85, 0xfa, 0x20, 0xdb, 0xc0, 0x79, 0x39, 0x69, 0xb6, 0x27, 0x6f, 0xa1, 0x4f, 0x6b, 0x78, 0xd5, 0xd9, 0xf4, 0xb6, 0x04, + 0x62, 0x53, 0x92, 0xb4, 0x77, 0x3a, 0xf3, 0x4e, 0x4f, 0x56, 0x60, 0x8f, 0xf6, 0xf2, 0x80, 0xec, 0xd5, 0x8e, 0xc5, 0x57, 0xc3, 0x24, 0x55, 0x0e, 0x9d, 0xa9, 0x24, 0xe0, 0xe5, 0x74, 0x83, 0xca, + 0xe1, 0x26, 0xea, 0xef, 0xe8, 0xfd, 0xd0, 0x16, 0xdc, 0x92, 0x72, 0x5d, 0x96, 0xd9, 0x6f, 0x0e, 0xf6, 0x0e, 0x5c, 0x4f, 0xfb, 0xf6, 0x9e, 0x2c, 0xeb, 0x1d, 0x31, 0xc0, 0xb4, 0x67, 0x4b, 0x39, + 0x7f, 0x56, 0x96, 0xed, 0xd5, 0xe7, 0x7e, 0xb3, 0x74, 0xfa, 0x9a, 0x32, 0xf9, 0x44, 0xfb, 0x16, 0xdc, 0x66, 0xf1, 0xb4, 0xa5, 0x3a, 0xd9, 0x38, 0x8b, 0x83, 0xd5, 0x77, 0x92, 0xf1, 0x1a, 0x04, + 0x8c, 0x31, 0xcf, 0x69, 0xc1, 0x80, 0xa6, 0x10, 0x60, 0x3c, 0x91, 0x29, 0x39, 0x9e, 0x06, 0x25, 0x55, 0x6e, 0xaa, 0xa2, 0xd0, 0x1d, 0xd4, 0x4b, 0x13, 0x68, 0xc3, 0xcc, 0x61, 0x38, 0xb0, 0x75, + 0x13, 0x40, 0x74, 0x15, 0x61, 0x43, 0x59, 0x93, 0x5c, 0x71, 0x0d, 0xaf, 0x62, 0xb3, 0x1e, 0x97, 0xf3, 0x2a, 0xc2, 0x2b, 0xf8, 0x90, 0x22, 0x81, 0xff, 0x3b, 0x53, 0xb8, 0x2b, 0x31, 0x3c, 0x45, + 0x6b, 0xdc, 0x0c, 0x86, 0xd7, 0xab, 0xa7, 0xaf, 0xcd, 0xed, 0xc0, 0x07, 0x8b, 0x00, 0x3f, 0x5c, 0x28, 0x7b, 0x75, 0x8d, 0xf4, 0x33, 0xe3, 0x6e, 0x1a, 0x3f, 0xbe, 0xee, 0xd1, 0x64, 0xff, 0xe7, + 0x92, 0x72, 0xa6, 0x09, 0x74, 0x2f, 0x47, 0x6d, 0x33, 0xdc, 0x89, 0x39, 0x10, 0x23, 0x5e, 0x25, 0x77, 0x66, 0x6b, 0x26, 0x22, 0x16, 0x75, 0x7e, 0x48, 0x26, 0x09, 0x3a, 0xe5, 0x54, 0xba, 0x0f, + 0xdb, 0x1b, 0x82, 0x16, 0x89, 0xdd, 0xdc, 0x51, 0x10, 0x04, 0xe4, 0x07, 0x87, 0xb1, 0x89, 0xea, 0x48, 0x82, 0xd5, 0xeb, 0xc8, 0xd1, 0x16, 0x30, 0x8e, 0x81, 0x1e, 0xc1, 0x2c, 0xe6, 0xf8, 0x92, + 0xeb, 0xd5, 0xfc, 0x64, 0xe9, 0x21, 0xf3, 0x61, 0x14, 0xaf, 0x9c, 0x12, 0x79, 0x5a, 0x18, 0xe7, 0x67, 0xcc, 0xfb, 0x0e, 0xe6, 0x2b, 0x57, 0xf2, 0x9f, 0xd9, 0xed, 0x2e, 0x64, 0x9b, 0x1e, 0x77, + 0x39, 0x69, 0xdb, 0xd9, 0x2a, 0xbd, 0xa7, 0x61, 0x94, 0xee, 0xc4, 0x6b, 0x6d, 0xd9, 0x99, 0xb8, 0x5a, 0x29, 0x09, 0x6a, 0x8f, 0xdd, 0xdb, 0x13, 0x8d, 0x0c, 0xac, 0x79, 0x02, 0x72, 0x8a, 0xdd, + 0xa7, 0x87, 0x05, 0xeb, 0x4c, 0x4a, 0x32, 0xca, 0x37, 0x8a, 0x0a, 0x57, 0xb2, 0x67, 0x77, 0x82, 0xbd, 0x92, 0xf2, 0x81, 0xbc, 0xe8, 0xf4, 0x87, 0x22, 0xb5, 0xc0, 0x93, 0x65, 0x04, 0x4f, 0xea, + 0x89, 0x3d, 0x91, 0xeb, 0x62, 0x3e, 0x20, 0x9f, 0x41, 0xfa, 0xb8, 0xb3, 0x39, 0x69, 0x57, 0x49, 0xac, 0xdc, 0xbf, 0xac, 0x6c, 0x35, 0x3d, 0xea, 0x66, 0x5d, 0xc4, 0x49, 0xbb, 0xfa, 0xd1, 0x46, + 0x0d, 0x55, 0xd7, 0xd0, 0x3e, 0x56, 0x5d, 0x3e, 0x6f, 0xda, 0x72, 0x49, 0x9f, 0xbf, 0x43, 0xe1, 0xf4, 0x64, 0xd7, 0x49, 0xef, 0x3f, 0x7c, 0x6e, 0x7e, 0xaf, 0xc5, 0xff, 0x25, 0x3c, 0xeb, 0xb4, + 0x81, 0xf8, 0x5b, 0x94, 0x84, 0x59, 0x98, 0x55, 0x91, 0xf1, 0x66, 0x7a, 0x8a, 0x75, 0xb9, 0x17, 0xfe, 0x33, 0x3b, 0x72, 0xeb, 0x38, 0xad, 0x86, 0xef, 0xce, 0xa3, 0xf1, 0x1c, 0x7c, 0xa9, 0x70, + 0xcc, 0x99, 0xe6, 0x45, 0xaa, 0x9c, 0xb4, 0x0b, 0x3e, 0x2f, 0x20, 0x03, 0x75, 0x53, 0x38, 0xd8, 0x74, 0x20, 0x98, 0xec, 0x77, 0x88, 0x85, 0xb4, 0xef, 0x2c, 0xd3, 0x11, 0xdb, 0x21, 0xb4, 0xf9, + 0xb6, 0xae, 0x85, 0x1f, 0x1a, 0xf4, 0xba, 0x61, 0x3a, 0x81, 0xd1, 0x8d, 0x92, 0x30, 0x32, 0x92, 0xcc, 0x79, 0x18, 0x84, 0x06, 0xbd, 0xf8, 0x79, 0x9f, 0xa8, 0x37, 0x1f, 0xfa, 0xe9, 0x5a, 0xd3, + 0x8b, 0x5a, 0x98, 0xf8, 0x08, 0x17, 0x9b, 0xbb, 0xa9, 0x0b, 0x7b, 0xb3, 0x5a, 0xe7, 0x56, 0x26, 0x29, 0x8f, 0xe5, 0x3e, 0xb0, 0xee, 0xc8, 0x79, 0xd5, 0xa1, 0x2d, 0x16, 0x37, 0x21, 0x1c, 0x35, + 0xc8, 0x29, 0x5c, 0x12, 0xba, 0x15, 0x44, 0x53, 0x2a, 0xa1, 0x59, 0x23, 0x19, 0xee, 0x22, 0x0e, 0xc5, 0xc7, 0xbb, 0x9d, 0xe6, 0x06, 0x7b, 0x7d, 0x31, 0xe7, 0xdc, 0xc5, 0xbe, 0x47, 0xe1, 0xeb, + 0x01, 0x4d, 0x76, 0x90, 0xd5, 0xd4, 0xfb, 0x0d, 0x43, 0xeb, 0xab, 0x08, 0x83, 0x6f, 0xd0, 0xcf, 0xd7, 0x10, 0x6f, 0xf2, 0xb3, 0x9f, 0xf1, 0xe9, 0xbb, 0xf0, 0xce, 0x57, 0x8c, 0xb4, 0x86, 0xe6, + 0x3b, 0x4f, 0xf4, 0x36, 0xcb, 0x39, 0x50, 0xb7, 0xda, 0xc1, 0x6a, 0x5d, 0xe8, 0x1b, 0x9d, 0x76, 0xf8, 0xbe, 0xe0, 0x45, 0x83, 0xe5, 0x50, 0x46, 0xb1, 0xd4, 0x8c, 0x22, 0xee, 0xc7, 0xc2, 0xf7, + 0xc9, 0x71, 0xfb, 0x67, 0x7e, 0xdb, 0x35, 0xe9, 0xe6, 0x13, 0xaf, 0x2f, 0xb4, 0xf9, 0xd2, 0xa3, 0xcc, 0xc9, 0xd5, 0x8a, 0x25, 0xe6, 0x66, 0x0f, 0x52, 0x66, 0x34, 0xb8, 0x3c, 0xcc, 0xd0, 0xe9, + 0x30, 0x99, 0x8e, 0xe8, 0xad, 0x47, 0xf4, 0xf5, 0x14, 0x62, 0x29, 0xbf, 0xaf, 0x6b, 0xe1, 0x5a, 0x29, 0xb7, 0xc1, 0x8c, 0x25, 0x56, 0xac, 0x1d, 0xcd, 0xad, 0x2c, 0x1f, 0x8f, 0x61, 0x85, 0xda, + 0x5b, 0x84, 0x42, 0x08, 0x2b, 0x14, 0x72, 0x0f, 0x8b, 0x95, 0x0c, 0x11, 0x11, 0xba, 0xd6, 0x87, 0x01, 0x37, 0xda, 0x23, 0xdc, 0x33, 0x99, 0x7b, 0xaa, 0x0c, 0xdb, 0xd5, 0xac, 0xd7, 0x8d, 0xe8, + 0x91, 0xbc, 0xbc, 0x56, 0xdb, 0xe4, 0x48, 0xb0, 0x41, 0x32, 0xd2, 0xdb, 0xd6, 0x32, 0xb1, 0x88, 0x60, 0x84, 0x2f, 0x70, 0xbd, 0x62, 0x9d, 0x70, 0x12, 0x5a, 0x14, 0x35, 0x8c, 0x92, 0x61, 0xc4, + 0x64, 0xeb, 0xb1, 0x3f, 0xb1, 0xa3, 0xc5, 0x1e, 0x48, 0x42, 0xa6, 0xd6, 0x55, 0xc4, 0x1c, 0xdb, 0x38, 0x04, 0xa4, 0x40, 0xb0, 0x48, 0xcd, 0x25, 0x1e, 0x06, 0x15, 0x57, 0xee, 0x19, 0x6a, 0x09, + 0xf0, 0x1e, 0x83, 0x54, 0x34, 0x03, 0x7a, 0xfd, 0x55, 0x21, 0x85, 0x42, 0x9f, 0x4a, 0xd3, 0xf1, 0x4f, 0x1d, 0x63, 0xed, 0xe6, 0xc1, 0xb5, 0xe2, 0x59, 0x8f, 0x0a, 0x16, 0xdc, 0x6a, 0xb7, 0xf6, + 0x70, 0x35, 0x34, 0x1b, 0xc4, 0x9a, 0xa3, 0x46, 0xe8, 0x5a, 0xb8, 0xc4, 0x92, 0xed, 0x6a, 0x01, 0xaa, 0x66, 0x07, 0x0b, 0x40, 0x21, 0x0c, 0x52, 0xb5, 0xb3, 0x5a, 0xaf, 0xcd, 0xb9, 0x39, 0x4e, + 0x1d, 0x9f, 0x47, 0x47, 0xfd, 0xcc, 0x0f, 0xc6, 0xd1, 0x62, 0xb4, 0x23, 0x05, 0x48, 0x62, 0xea, 0xa9, 0x27, 0x24, 0x2c, 0x67, 0xea, 0xa1, 0x9a, 0x90, 0xc1, 0x84, 0xe7, 0xd3, 0xa5, 0xb5, 0x61, + 0x2a, 0x6e, 0x19, 0x1b, 0x2b, 0x5a, 0xa8, 0xfd, 0x8d, 0xc4, 0xc5, 0x44, 0x5d, 0x7c, 0xca, 0x6b, 0xfc, 0xd1, 0x40, 0x77, 0xae, 0x1a, 0x74, 0xcf, 0x45, 0x91, 0x28, 0x51, 0xd4, 0xfc, 0xf2, 0x56, + 0x53, 0x4d, 0xc7, 0x34, 0x1f, 0x00, 0x8c, 0xbe, 0x14, 0x10, 0x73, 0x24, 0x78, 0x44, 0xd7, 0x31, 0xcd, 0x2e, 0xda, 0x2e, 0x04, 0x06, 0x23, 0x3d, 0xff, 0x30, 0x5d, 0x51, 0x28, 0x3d, 0xaf, 0x66, + 0x75, 0x67, 0x34, 0xe2, 0xa4, 0xda, 0xe3, 0xfb, 0x91, 0x05, 0xf6, 0x06, 0xeb, 0x8e, 0x51, 0xe0, 0x32, 0x67, 0x20, 0xc5, 0xc4, 0xb1, 0x2d, 0xfd, 0x50, 0x5b, 0x5a, 0x29, 0x93, 0xeb, 0xb0, 0xdf, + 0x5f, 0xf8, 0xd4, 0x8c, 0x91, 0x87, 0xbd, 0x99, 0x1f, 0x9b, 0xeb, 0x70, 0xce, 0x71, 0xd3, 0x28, 0xcb, 0xc6, 0x3b, 0x71, 0x3d, 0xc4, 0x73, 0x76, 0x47, 0xfc, 0xf6, 0xc4, 0x12, 0x69, 0x37, 0x55, + 0x77, 0x92, 0x4b, 0x30, 0xd5, 0x7d, 0x97, 0xc7, 0x2b, 0xd3, 0x84, 0x0b, 0xd1, 0x06, 0xc7, 0xd3, 0x61, 0x93, 0x5b, 0xd6, 0xc2, 0xaa, 0xdd, 0xec, 0x93, 0x4d, 0xd4, 0x1b, 0x2e, 0xd1, 0xe9, 0xd6, + 0x9c, 0x0e, 0x77, 0x35, 0x3f, 0xf3, 0xc5, 0x7c, 0xb8, 0x76, 0x20, 0x69, 0x33, 0x30, 0xcb, 0x14, 0x21, 0x88, 0xa0, 0xa7, 0x69, 0x18, 0x06, 0x64, 0x2a, 0xce, 0xe6, 0x71, 0x35, 0xc0, 0x23, 0x4d, + 0xc0, 0x28, 0xd5, 0x19, 0xf5, 0x53, 0x5b, 0x61, 0xa3, 0x5d, 0xaf, 0xc0, 0x43, 0x65, 0x95, 0xc0, 0x5b, 0x86, 0x75, 0xf4, 0xa1, 0xcf, 0x95, 0x7a, 0x3d, 0x7e, 0x86, 0xe5, 0x13, 0x97, 0xdb, 0x25, + 0x40, 0xe3, 0x1c, 0x62, 0x7b, 0x01, 0xb5, 0x2d, 0x2b, 0x5a, 0x0d, 0x15, 0xa1, 0x96, 0x25, 0x4e, 0xf0, 0xc8, 0x5f, 0xf2, 0xda, 0x5e, 0x41, 0x17, 0xa2, 0x47, 0x36, 0x9c, 0x0f, 0xdb, 0xee, 0x0d, + 0x54, 0xad, 0x3a, 0x02, 0xe6, 0x20, 0x36, 0x6d, 0x12, 0x43, 0x7a, 0xaf, 0xa3, 0xd3, 0x21, 0xa9, 0x10, 0x06, 0x3d, 0x9f, 0x6f, 0xe6, 0xc3, 0x99, 0xa8, 0xf4, 0xcb, 0x72, 0xb7, 0x91, 0x1c, 0x77, + 0xbc, 0xe3, 0x88, 0x3a, 0xf1, 0x76, 0x2c, 0x07, 0xd2, 0x83, 0xed, 0xc8, 0x75, 0x17, 0x1b, 0x6f, 0x23, 0x43, 0x4b, 0x8b, 0x90, 0x14, 0x5d, 0x97, 0x8d, 0x31, 0xeb, 0x3b, 0x3d, 0x77, 0x80, 0x8c, + 0xfc, 0xd8, 0x11, 0x9e, 0x96, 0xef, 0xfd, 0x66, 0xbb, 0xa0, 0xab, 0x2d, 0x19, 0xe1, 0xfb, 0x19, 0x15, 0xcf, 0xa2, 0xd3, 0x5b, 0x86, 0x11, 0xe8, 0x61, 0xe6, 0x58, 0x41, 0xf8, 0xd0, 0x5d, 0x0f, + 0xbe, 0x14, 0x7a, 0xfc, 0x4e, 0xb5, 0x61, 0xc5, 0xf9, 0xb8, 0xb1, 0xca, 0x5b, 0x0c, 0x2f, 0xd2, 0x70, 0x38, 0xdc, 0x98, 0x2b, 0x25, 0xcf, 0x53, 0x65, 0x3d, 0x61, 0x3a, 0xa4, 0x69, 0xad, 0x3b, + 0xf3, 0x75, 0x41, 0x6f, 0xf7, 0x8c, 0xe8, 0xaf, 0x0b, 0x22, 0xdd, 0xe3, 0x41, 0xe8, 0xb2, 0xb2, 0x5c, 0xe4, 0xbc, 0x34, 0x1f, 0x4a, 0x15, 0x28, 0xef, 0x51, 0x29, 0x1a, 0x09, 0x2c, 0xde, 0x67, + 0xdd, 0x15, 0xe8, 0x46, 0x74, 0xa9, 0x51, 0x4c, 0x31, 0x42, 0x8d, 0xd0, 0x2c, 0xaa, 0x9a, 0xd6, 0x96, 0xec, 0xeb, 0xbc, 0xf0, 0x9d, 0xc0, 0xf9, 0x48, 0x6e, 0x45, 0xee, 0x57, 0x12, 0xfd, 0xb2, + 0xad, 0xce, 0xe9, 0x93, 0x1b, 0x9c, 0x54, 0x27, 0x00, 0x2e, 0xa7, 0xcf, 0x19, 0x62, 0xf8, 0xa1, 0xfb, 0x7d, 0xe9, 0x64, 0xf2, 0xa5, 0xce, 0x71, 0x45, 0x17, 0xe8, 0x5e, 0x9f, 0x75, 0xc9, 0x76, + 0x5d, 0x84, 0x5b, 0xb9, 0xbb, 0x5a, 0xdb, 0xcc, 0x79, 0x0a, 0x34, 0x4a, 0x6a, 0x14, 0xd5, 0x20, 0x77, 0x88, 0x76, 0x83, 0xa2, 0xb4, 0xf0, 0xca, 0xad, 0xa0, 0xf9, 0x10, 0x39, 0x64, 0x46, 0x18, + 0xd7, 0x38, 0x8a, 0xae, 0x99, 0x10, 0x58, 0x2e, 0xac, 0x20, 0x81, 0x80, 0xe1, 0x30, 0xeb, 0x38, 0x1a, 0xe2, 0x4c, 0xc4, 0x5a, 0x20, 0xfb, 0x39, 0x22, 0xea, 0x1c, 0x84, 0xae, 0x94, 0x32, 0x58, + 0x4b, 0xfe, 0xb0, 0x8f, 0xff, 0x38, 0xb4, 0xc3, 0x08, 0x9a, 0x05, 0x9f, 0xc7, 0x6b, 0x6f, 0xc8, 0x0b, 0x15, 0xf8, 0x2e, 0x44, 0x8f, 0xc0, 0x9c, 0x0f, 0xbb, 0x0d, 0xa5, 0xe7, 0xa8, 0x54, 0xee, + 0x3c, 0x58, 0x24, 0x08, 0x84, 0x01, 0x03, 0x77, 0x85, 0xd6, 0xe3, 0x54, 0x3a, 0xec, 0xac, 0x7c, 0x27, 0x2d, 0x16, 0xb0, 0x01, 0xcd, 0xa7, 0xa8, 0x4e, 0xf4, 0x09, 0x99, 0x9f, 0x39, 0xd5, 0x8e, + 0xd1, 0xd4, 0x01, 0xed, 0x88, 0x5c, 0x35, 0x66, 0x3b, 0x70, 0x59, 0xf8, 0x70, 0x89, 0x77, 0x22, 0x19, 0x08, 0x75, 0x8e, 0x22, 0xb4, 0xe5, 0xde, 0xb5, 0xd3, 0x85, 0xea, 0x65, 0x25, 0xcd, 0x27, + 0xb3, 0xdf, 0x30, 0x33, 0x6e, 0x36, 0x1c, 0xb8, 0x6c, 0x21, 0xfb, 0xd3, 0xc1, 0x83, 0x6c, 0xb5, 0x0e, 0x6a, 0x24, 0x49, 0x98, 0x74, 0x1f, 0x8a, 0x29, 0xf4, 0x52, 0x1d, 0xfe, 0x0b, 0xd1, 0x23, + 0x2b, 0xce, 0x87, 0x4d, 0xac, 0x41, 0x8b, 0x71, 0x83, 0xd0, 0x07, 0xa3, 0xb9, 0x1f, 0x1b, 0x83, 0x55, 0x3f, 0x83, 0x65, 0x3a, 0x65, 0x12, 0x27, 0x4c, 0xa6, 0x41, 0x80, 0xc8, 0x70, 0xe4, 0x76, + 0x4c, 0xbd, 0xb7, 0xf7, 0xc7, 0xb8, 0x10, 0x6e, 0x4a, 0x14, 0x00, 0xd8, 0x59, 0xc7, 0xd1, 0xfa, 0xb4, 0xa9, 0x81, 0x12, 0x11, 0x4f, 0x18, 0x27, 0x8d, 0x13, 0x31, 0x9d, 0x8a, 0x6e, 0x89, 0x9a, + 0xf3, 0x41, 0x05, 0x47, 0x9b, 0x1e, 0x1f, 0xaf, 0x32, 0x96, 0xfc, 0x8d, 0xfd, 0x86, 0x1a, 0x07, 0x51, 0xa2, 0x54, 0x4e, 0x7a, 0x1a, 0x39, 0xc0, 0x96, 0x39, 0xad, 0x46, 0xda, 0xbd, 0xec, 0xa5, + 0xf6, 0xd8, 0x8d, 0xd0, 0x7b, 0xa1, 0x38, 0xdb, 0x15, 0xe1, 0x23, 0xba, 0x1f, 0x67, 0xdd, 0x13, 0xc1, 0xe7, 0x08, 0x53, 0x0a, 0x3c, 0x84, 0x3b, 0x4b, 0x1d, 0x51, 0xf1, 0xfd, 0xa1, 0x2f, 0x4d, + 0xc5, 0x01, 0x2a, 0x2a, 0x1b, 0x9c, 0xd0, 0x6a, 0x7a, 0x56, 0x51, 0x05, 0x52, 0x13, 0x6b, 0xde, 0xde, 0x2d, 0x25, 0x0c, 0xdc, 0xd1, 0x87, 0x8e, 0xaa, 0xa6, 0x3b, 0xb9, 0x77, 0x10, 0x16, 0xa8, + 0xc7, 0xcd, 0x95, 0xda, 0x58, 0xe4, 0x03, 0xaf, 0x52, 0xb7, 0x63, 0x70, 0x8d, 0x72, 0x49, 0xbe, 0x08, 0x53, 0x22, 0x96, 0x42, 0xcc, 0x7c, 0xdd, 0x58, 0xb9, 0xce, 0xd7, 0xbc, 0x64, 0x1e, 0xfe, + 0xcf, 0x8f, 0x66, 0x23, 0xed, 0x66, 0x61, 0x37, 0x4a, 0x1c, 0xdf, 0x69, 0x36, 0x86, 0xfc, 0xb7, 0xf7, 0xc4, 0xe2, 0xab, 0x9b, 0x5e, 0x4c, 0x72, 0xbc, 0x73, 0x4b, 0x5a, 0xf9, 0x6a, 0xe8, 0x75, + 0xf5, 0xf3, 0x7e, 0x92, 0x67, 0x5e, 0x7d, 0x0d, 0xaf, 0xb5, 0x95, 0x0f, 0x57, 0x07, 0xf2, 0xa9, 0xe1, 0x4c, 0xe4, 0xc1, 0x0d, 0x47, 0x96, 0x24, 0x81, 0xe2, 0x75, 0x53, 0x2f, 0xcc, 0x1e, 0xdc, + 0x92, 0x76, 0x8f, 0xa8, 0x28, 0xaa, 0xf7, 0xf1, 0xbd, 0x9f, 0x9d, 0x92, 0x81, 0x61, 0x29, 0x47, 0x40, 0xba, 0xb5, 0x91, 0x84, 0xbf, 0xee, 0x46, 0xf6, 0x7e, 0x72, 0x4b, 0x42, 0x5f, 0x68, 0xa4, + 0xb6, 0x92, 0x5c, 0xca, 0xf8, 0x75, 0xdf, 0xeb, 0x04, 0xdc, 0x61, 0xc2, 0xf1, 0xde, 0x8f, 0x10, 0xe2, 0x63, 0x33, 0xf1, 0xa9, 0xb9, 0x34, 0x94, 0x7d, 0x62, 0x98, 0xf7, 0x1f, 0xbf, 0x78, 0x40, + 0x83, 0x34, 0xfa, 0xf0, 0xa1, 0xde, 0x84, 0x74, 0xb7, 0xf1, 0x83, 0x9e, 0x6e, 0x78, 0x53, 0xd2, 0xd4, 0xb1, 0x82, 0xf7, 0x71, 0xf1, 0xe6, 0x45, 0xa7, 0x1f, 0x79, 0xe5, 0x2a, 0xcd, 0x12, 0xc7, + 0x37, 0xae, 0x44, 0x0b, 0x7d, 0x7a, 0x77, 0x9a, 0x29, 0x49, 0x76, 0xff, 0xfe, 0x3c, 0x50, 0xc3, 0xc3, 0x17, 0x51, 0x7c, 0x69, 0x41, 0xfa, 0x3f, 0xa7, 0x12, 0xe1, 0xf5, 0xd8, 0x71, 0xd3, 0x70, + 0x25, 0x29, 0x8f, 0x3c, 0x9e, 0x3f, 0x9f, 0xf4, 0x5f, 0x88, 0x02, 0xdd, 0xf7, 0xc3, 0xb6, 0x01, 0xa8, 0xfb, 0x62, 0xa9, 0x1f, 0xd8, 0xf4, 0x20, 0xbb, 0x76, 0x2d, 0x6d, 0x41, 0x42, 0x0e, 0x66, + 0x95, 0x5e, 0xaf, 0x20, 0x51, 0x02, 0xc4, 0x89, 0x27, 0x4a, 0xa3, 0xd1, 0x0e, 0xdd, 0xcd, 0x66, 0x24, 0x61, 0x20, 0x44, 0x28, 0x51, 0x68, 0x8f, 0x35, 0xf7, 0xb3, 0xd8, 0xaa, 0x3a, 0x6b, 0x77, + 0x10, 0x6a, 0x61, 0x59, 0xc1, 0x3d, 0x6d, 0x5a, 0x68, 0x2b, 0x27, 0xef, 0xec, 0xc7, 0x05, 0x01, 0x93, 0xae, 0x28, 0xae, 0x5f, 0x57, 0x02, 0x4f, 0x86, 0xa8, 0x63, 0x97, 0xcf, 0xc2, 0x93, 0x34, + 0x65, 0x8a, 0x75, 0x35, 0x60, 0xfc, 0x57, 0x97, 0x8b, 0x2f, 0x1d, 0xf7, 0x81, 0x74, 0xbc, 0xb2, 0x2e, 0x7e, 0x4b, 0x1b, 0xe8, 0x7e, 0xba, 0xd0, 0x85, 0x5a, 0xe6, 0x6c, 0x8c, 0x42, 0xb8, 0x26, + 0x41, 0x75, 0x3d, 0x2e, 0x26, 0x5e, 0x38, 0xea, 0xec, 0xea, 0xa5, 0x1f, 0xc9, 0x6b, 0xc1, 0x20, 0x89, 0x4e, 0x4c, 0xad, 0x7c, 0x5a, 0x9a, 0xca, 0xec, 0xc6, 0x3a, 0xf4, 0xb4, 0xbc, 0x33, 0x65, + 0x93, 0x2d, 0x2c, 0xb3, 0x23, 0x00, 0xc9, 0xb8, 0xaa, 0x63, 0x6d, 0x55, 0xb9, 0x2f, 0xae, 0x87, 0x29, 0xcc, 0x91, 0x3b, 0xfd, 0xc0, 0xab, 0xbc, 0x4d, 0x6c, 0xa9, 0xcc, 0xf1, 0x7b, 0x3b, 0xf0, + 0x99, 0xac, 0xfc, 0xef, 0x60, 0xc9, 0x27, 0xb5, 0x77, 0x1f, 0xfa, 0x57, 0xca, 0x87, 0x7e, 0xa2, 0x7d, 0x32, 0x23, 0xae, 0xaf, 0x34, 0xb1, 0x09, 0x2d, 0xdc, 0x1e, 0x02, 0xc3, 0x7b, 0x9e, 0x25, + 0x4f, 0x32, 0x45, 0x0a, 0x7b, 0xbe, 0xb3, 0xa3, 0xb5, 0x19, 0x63, 0x8b, 0x92, 0x32, 0x9a, 0xbb, 0x93, 0x01, 0xb2, 0xd8, 0xa5, 0xd0, 0xda, 0xd1, 0x59, 0x82, 0x2a, 0x9d, 0xbe, 0x0b, 0xed, 0x77, + 0x87, 0xa9, 0x21, 0x88, 0x5a, 0x36, 0xa3, 0x8c, 0x9a, 0xe2, 0x47, 0x98, 0x3c, 0x5d, 0x8e, 0x40, 0x0b, 0x1e, 0x5b, 0x8b, 0x00, 0x9f, 0x96, 0x34, 0x3a, 0x16, 0x49, 0x67, 0x19, 0x3d, 0x2a, 0xdd, + 0xdf, 0xa2, 0x9b, 0x7e, 0x55, 0x9b, 0x5f, 0x55, 0x5e, 0x9b, 0xb5, 0xbc, 0x93, 0xfa, 0xbe, 0xea, 0xeb, 0xff, 0x65, 0xba, 0xb1, 0xa6, 0x44, 0x97, 0xcd, 0x2e, 0x4f, 0x03, 0xee, 0x77, 0x75, 0x96, + 0x5f, 0xb1, 0x3d, 0xbf, 0xbe, 0xa0, 0x91, 0x9e, 0xaf, 0x97, 0xdb, 0x14, 0x05, 0x86, 0xba, 0x43, 0x78, 0x44, 0xad, 0x9d, 0xa1, 0x10, 0xcf, 0x01, 0x38, 0x71, 0xf3, 0xaa, 0x2e, 0xc7, 0x54, 0x65, + 0x73, 0x33, 0x3b, 0xbb, 0xbf, 0x78, 0xd7, 0x96, 0x01, 0xe0, 0x1b, 0xd9, 0xca, 0x6f, 0x72, 0xde, 0x2d, 0xfc, 0x3e, 0x46, 0xc4, 0x1b, 0x8c, 0xbf, 0x30, 0xae, 0x9d, 0x77, 0x61, 0xef, 0x9e, 0x0f, + 0xba, 0x27, 0x32, 0xcf, 0x3b, 0x13, 0xba, 0x84, 0x1c, 0x63, 0x69, 0x62, 0x30, 0xe0, 0xd4, 0x9a, 0xdc, 0x27, 0x28, 0x6f, 0x56, 0x61, 0x78, 0x3e, 0x1e, 0x8d, 0xd8, 0x99, 0x48, 0xa0, 0xbb, 0xba, + 0x86, 0xc7, 0x05, 0xec, 0xe1, 0x7b, 0x56, 0xd9, 0x15, 0xfd, 0xbc, 0x77, 0xe8, 0x94, 0x1c, 0x8d, 0xe9, 0x32, 0x95, 0xac, 0x67, 0xe4, 0x6a, 0x37, 0xdc, 0xae, 0x76, 0x6b, 0x78, 0x47, 0x59, 0x04, + 0x38, 0xd0, 0x36, 0xd8, 0x0e, 0x0b, 0x86, 0xc3, 0xf9, 0xf8, 0xd9, 0x38, 0xf6, 0xb8, 0x33, 0xfd, 0x87, 0xaa, 0xa8, 0x86, 0x07, 0x68, 0xa1, 0x6e, 0x74, 0xcd, 0xe4, 0x9c, 0x0d, 0x43, 0x1c, 0xc7, + 0x64, 0xe8, 0xa6, 0xbf, 0xfc, 0xc7, 0xf9, 0x7b, 0x4f, 0xff, 0x92, 0x93, 0x69, 0xfd, 0x65, 0xdf, 0xd4, 0x4b, 0xce, 0x23, 0x7e, 0x8a, 0x5e, 0xb8, 0x6a, 0xb9, 0x64, 0xcc, 0xdf, 0x29, 0x05, 0x70, + 0x1b, 0x61, 0x79, 0xaa, 0x91, 0x75, 0xa3, 0x78, 0x6f, 0x6b, 0x07, 0xdf, 0xbc, 0xf0, 0xca, 0x35, 0x79, 0x67, 0x5f, 0x99, 0x2b, 0xff, 0xc3, 0xd1, 0x6e, 0x46, 0xae, 0xfa, 0xc2, 0x1f, 0xef, 0xbb, + 0xe4, 0xa7, 0x5a, 0x78, 0xf6, 0xa0, 0x62, 0x9f, 0x4d, 0xd1, 0xf3, 0x1d, 0xd7, 0xee, 0xbd, 0x4f, 0x51, 0x3a, 0xdf, 0xef, 0xb4, 0x7f, 0x73, 0x63, 0x94, 0x18, 0xc6, 0xf9, 0xfb, 0x90, 0xcf, 0xaf, + 0x89, 0x73, 0x23, 0xa9, 0xce, 0x23, 0xd1, 0x97, 0xbd, 0xfc, 0x3f, 0x7b, 0x17, 0xaf, 0x1a, 0x4d, 0xc7, 0x33, 0xba, 0x46, 0x90, 0x25, 0x55, 0x57, 0x53, 0x34, 0xdb, 0x38, 0x83, 0x0f, 0xde, 0x9f, + 0x36, 0x35, 0x65, 0xf9, 0xf5, 0xae, 0xea, 0x29, 0xda, 0xbe, 0x9b, 0x5d, 0x7e, 0xce, 0x97, 0xa1, 0xf1, 0x53, 0x1a, 0xf4, 0x79, 0xe3, 0xf3, 0x4f, 0x37, 0x28, 0x97, 0x79, 0xcf, 0x29, 0x43, 0xf9, + 0x7a, 0x64, 0xbd, 0x78, 0x28, 0x4f, 0xec, 0xc2, 0x6f, 0xda, 0xfc, 0x28, 0x4c, 0xb2, 0xae, 0x99, 0x18, 0xe9, 0x83, 0xad, 0x80, 0x1c, 0x3f, 0x4f, 0xfc, 0x3c, 0xb1, 0x95, 0xf7, 0x89, 0xf8, 0xd7, + 0xc1, 0xfd, 0x92, 0x5f, 0xfd, 0x55, 0x94, 0xdc, 0xb4, 0x5b, 0x29, 0xfe, 0x7b, 0x52, 0x25, 0x72, 0x2f, 0xab, 0xf2, 0xd3, 0x56, 0xc1, 0xdd, 0xd2, 0xc9, 0xec, 0x30, 0x3f, 0x6d, 0x24, 0x7c, 0xd9, + 0x3a, 0xf8, 0x0b, 0x26, 0x9e, 0x51, 0x04, 0xf7, 0x45, 0xde, 0x0b, 0xf5, 0xcb, 0x6f, 0x45, 0xdf, 0x20, 0xe2, 0x0d, 0xbe, 0xad, 0x81, 0x71, 0xc7, 0x1f, 0x79, 0xd5, 0x1c, 0x28, 0x59, 0x9e, 0x28, + 0x5e, 0x57, 0x0b, 0xfd, 0x23, 0xe0, 0xf7, 0x25, 0xe0, 0x9c, 0xb4, 0x9d, 0x9d, 0x2b, 0x26, 0x80, 0x6f, 0xbd, 0xdb, 0x5f, 0x10, 0x25, 0xa1, 0x95, 0x5c, 0xb2, 0x81, 0xbf, 0x08, 0xde, 0x69, 0x9c, + 0x8e, 0x2e, 0x90, 0x7c, 0x0a, 0xcb, 0x35, 0xfc, 0xc2, 0xb8, 0x14, 0x62, 0xf8, 0x34, 0xd9, 0x3e, 0x22, 0x14, 0x75, 0x95, 0x20, 0x75, 0xde, 0xa5, 0x0a, 0xfc, 0xda, 0xde, 0x60, 0xaa, 0x85, 0xfe, + 0x47, 0x68, 0xcd, 0x97, 0x97, 0x64, 0xef, 0x9a, 0x1a, 0xff, 0xfc, 0xfd, 0x99, 0x71, 0xc8, 0xba, 0x1f, 0xed, 0xe0, 0xdb, 0xa7, 0xc9, 0x62, 0x41, 0x36, 0xd0, 0x1c, 0xa5, 0xfc, 0x43, 0xbe, 0xe1, + 0x66, 0x1e, 0x7d, 0xbe, 0xe9, 0x1b, 0xaf, 0xee, 0xfb, 0xa8, 0xdf, 0x38, 0x75, 0x4f, 0x67, 0x6f, 0x6e, 0xfa, 0x43, 0x35, 0xff, 0x77, 0xa8, 0x49, 0xa2, 0x6e, 0x36, 0xf4, 0xfe, 0xf7, 0xbf, 0x41, + 0xf0, 0x7d, 0x83, 0xbf, 0x8d, 0xd2, 0x0f, 0x23, 0x23, 0xd0, 0x42, 0xcf, 0x33, 0xb4, 0xa3, 0xf1, 0xd5, 0x28, 0xff, 0xf3, 0x4f, 0xbc, 0x90, 0xfb, 0x1f, 0x7f, 0x7c, 0xaf, 0xc1, 0xba, 0x5a, 0x18, + 0x98, 0x8e, 0xd5, 0x8d, 0x12, 0x23, 0xcb, 0x9c, 0x87, 0x7e, 0x55, 0xf2, 0xa5, 0x54, 0xa2, 0xfb, 0xaf, 0xf8, 0x50, 0x70, 0x9f, 0x1a, 0xba, 0x64, 0xbb, 0xa4, 0x22, 0xda, 0x92, 0xf3, 0x99, 0xb4, + 0x32, 0xa6, 0x75, 0xe1, 0xcd, 0x80, 0xb5, 0xe4, 0x1e, 0x80, 0x9d, 0x4a, 0x90, 0xc4, 0x5a, 0x80, 0xf1, 0xa5, 0x84, 0x58, 0x43, 0x97, 0x42, 0x1c, 0x67, 0x50, 0xe8, 0x69, 0x04, 0xc0, 0x2a, 0x67, + 0xae, 0xc7, 0x1b, 0x69, 0xbd, 0x20, 0x32, 0xf7, 0x90, 0xb9, 0x2b, 0xd0, 0xe8, 0x8c, 0x16, 0x28, 0xd8, 0xd3, 0x16, 0xde, 0xa2, 0x98, 0xef, 0x05, 0x2f, 0xac, 0x49, 0xa6, 0x07, 0x19, 0xcf, 0x16, + 0x08, 0x1e, 0xc8, 0xc2, 0x1d, 0xfc, 0x1a, 0xd9, 0xd0, 0x3c, 0xe7, 0xae, 0x60, 0x7c, 0xbf, 0x61, 0xf4, 0x87, 0x7c, 0xb5, 0x4f, 0x04, 0x3d, 0xff, 0x8e, 0x53, 0xf6, 0x7f, 0x66, 0x24, 0xa7, 0x9f, + 0x52, 0x3d, 0x60, 0x24, 0xfa, 0x52, 0x3c, 0xfa, 0x83, 0x77, 0x7c, 0x70, 0xf2, 0x73, 0x4b, 0x53, 0x6e, 0xa6, 0x05, 0x2b, 0xc7, 0xa9, 0x24, 0x66, 0xc3, 0xc3, 0x00, 0xb2, 0x93, 0x11, 0xee, 0x71, + 0x1b, 0x67, 0xe5, 0x41, 0x1b, 0x75, 0xa8, 0x38, 0x0b, 0x10, 0x32, 0x44, 0x7c, 0x5f, 0x57, 0xa5, 0xbe, 0x83, 0xa4, 0x4e, 0x3d, 0xd3, 0x40, 0x6e, 0xd1, 0x09, 0xca, 0x7e, 0x20, 0x39, 0xab, 0x9e, + 0x34, 0x26, 0xc7, 0x0a, 0x2f, 0x4a, 0xb6, 0x68, 0x08, 0x93, 0x99, 0xc7, 0xf4, 0x37, 0x63, 0x75, 0x3b, 0x9e, 0xd3, 0x23, 0x74, 0x37, 0x51, 0xe9, 0x67, 0xa1, 0x21, 0xdf, 0x98, 0x2e, 0x59, 0x15, + 0x5d, 0x1b, 0x77, 0xe7, 0x31, 0xec, 0xc6, 0xc5, 0xf6, 0x69, 0x0b, 0xda, 0x53, 0xee, 0xfb, 0xcd, 0x30, 0x77, 0x6d, 0x98, 0xdc, 0x57, 0xee, 0x49, 0xee, 0x19, 0x5d, 0x3d, 0xd4, 0x3e, 0xfc, 0x55, + 0xd8, 0xad, 0x02, 0xb0, 0x6e, 0x3c, 0x81, 0x5f, 0x94, 0x52, 0xe4, 0xe5, 0xc9, 0xfd, 0x96, 0xb3, 0x29, 0x5d, 0x3a, 0x7a, 0x66, 0xbf, 0xff, 0xba, 0xdb, 0x3b, 0x2e, 0x15, 0x73, 0xec, 0x2a, 0x32, + 0x12, 0xcf, 0x09, 0xf6, 0xd7, 0xc3, 0xfc, 0x17, 0x81, 0x7d, 0x96, 0xb0, 0xf8, 0xe2, 0xc8, 0xf5, 0x27, 0x44, 0x03, 0x9f, 0xb1, 0x8c, 0xbc, 0xdc, 0x72, 0x82, 0x67, 0x03, 0x18, 0xf2, 0xd2, 0xc6, + 0x39, 0xf7, 0x5f, 0xf1, 0x21, 0xf6, 0x9f, 0x1a, 0xba, 0x48, 0xbb, 0x4d, 0x75, 0x24, 0x76, 0x8a, 0x27, 0x13, 0x11, 0x1f, 0xcf, 0x57, 0xa6, 0xc6, 0x87, 0x18, 0x8a, 0xb9, 0x8e, 0xc2, 0x97, 0x34, + 0x01, 0x42, 0x39, 0x35, 0xce, 0x60, 0x40, 0x5f, 0x12, 0x9b, 0x60, 0x20, 0x84, 0x43, 0x66, 0xed, 0x41, 0x40, 0x9f, 0x8b, 0x75, 0x6a, 0x4e, 0xfb, 0xa5, 0xa4, 0xc4, 0xb1, 0x80, 0x62, 0xca, 0x36, + 0x4a, 0x52, 0x71, 0x58, 0xaf, 0x14, 0xa4, 0x37, 0x1b, 0x43, 0x8b, 0x2a, 0x5f, 0xd2, 0x87, 0xc3, 0xb3, 0x01, 0xec, 0x9b, 0x45, 0xff, 0xcb, 0xcf, 0xf7, 0x1a, 0x0f, 0x73, 0xd7, 0x36, 0xbc, 0xc8, + 0x48, 0x3e, 0x9c, 0xd0, 0x3f, 0x97, 0x0a, 0xfc, 0xfe, 0x53, 0xed, 0x07, 0xbf, 0x2f, 0x06, 0xe2, 0xf5, 0xf8, 0xfa, 0xef, 0x7f, 0x83, 0x8e, 0x86, 0x58, 0x8b, 0x17, 0x7c, 0xdd, 0x5e, 0xe2, 0xa9, + 0xd6, 0x6b, 0xee, 0xfa, 0x8d, 0x6d, 0x26, 0xee, 0xf4, 0xf0, 0x47, 0x8e, 0x51, 0x18, 0x79, 0x65, 0x22, 0x7d, 0x4b, 0xfe, 0x43, 0x16, 0xdf, 0x2f, 0x75, 0xcf, 0xb4, 0x9f, 0xcb, 0x61, 0x47, 0x14, + 0x3a, 0x07, 0x74, 0xa2, 0x8b, 0x01, 0x1b, 0x0e, 0xfa, 0xdb, 0xad, 0x8a, 0x98, 0x6c, 0x61, 0x0e, 0xf9, 0x32, 0xa8, 0xe6, 0x6b, 0x42, 0xcf, 0x47, 0xa4, 0xb9, 0xdd, 0x88, 0x0b, 0x16, 0x72, 0x0c, + 0x85, 0xf6, 0x69, 0x32, 0xf4, 0x5d, 0x62, 0x58, 0x02, 0x11, 0x47, 0xd3, 0x39, 0x9a, 0x8f, 0xe1, 0x7c, 0xc2, 0x30, 0x12, 0x49, 0x2d, 0x58, 0x45, 0x98, 0xd4, 0x9b, 0x7c, 0x1b, 0x88, 0xe9, 0x08, + 0xfd, 0xf9, 0x92, 0xee, 0xed, 0xa4, 0xe9, 0x1e, 0x5a, 0xd8, 0x4b, 0x01, 0xe7, 0xd7, 0x84, 0x3f, 0x70, 0x6a, 0x4e, 0xbb, 0x58, 0xbb, 0xa0, 0x73, 0x78, 0x7e, 0x28, 0xd5, 0x01, 0x60, 0xcb, 0xe0, + 0x34, 0x32, 0xa2, 0xdd, 0x1c, 0xd4, 0xe6, 0x6a, 0xd8, 0x19, 0xcc, 0xf1, 0x6d, 0x38, 0x25, 0x86, 0xca, 0xc8, 0x13, 0x6c, 0xeb, 0x00, 0xd8, 0x63, 0xd9, 0xc3, 0xd7, 0x0a, 0xa8, 0x0e, 0x50, 0x6c, + 0x29, 0xf0, 0x7c, 0x69, 0xcf, 0xc6, 0x15, 0xe9, 0x09, 0xac, 0x9a, 0x33, 0x8e, 0xa2, 0xaf, 0x66, 0x0c, 0x1d, 0x8c, 0x60, 0x66, 0xb0, 0x8b, 0x73, 0x27, 0xc3, 0xd4, 0xd7, 0x7b, 0xaa, 0x91, 0x26, + 0x86, 0x96, 0x5f, 0x2a, 0xb7, 0xdc, 0x6e, 0xfa, 0xdb, 0x34, 0xdf, 0x54, 0x76, 0x79, 0x75, 0xf1, 0xf7, 0x47, 0x76, 0xc7, 0x65, 0x2a, 0x79, 0x8f, 0x6d, 0xaf, 0x6d, 0xd0, 0x78, 0x4d, 0xf8, 0x83, + 0x6d, 0xcd, 0x69, 0xdb, 0x2d, 0x1a, 0xcb, 0x1e, 0xaa, 0x0b, 0xbb, 0x50, 0xc9, 0xab, 0xc2, 0x63, 0x35, 0x14, 0xd9, 0x06, 0x43, 0x9a, 0xf4, 0x24, 0x44, 0xce, 0x08, 0x08, 0x29, 0xe6, 0x8c, 0x6d, + 0x65, 0x68, 0x7f, 0x53, 0xda, 0x5b, 0x6a, 0x01, 0x6f, 0xf7, 0x74, 0x11, 0xe8, 0xe6, 0x61, 0x00, 0x52, 0xd6, 0x38, 0x9e, 0xf2, 0xbc, 0x92, 0xba, 0x8b, 0xf1, 0xa2, 0x76, 0x7b, 0x93, 0xd8, 0x2a, + 0xf7, 0xa5, 0xca, 0xec, 0x58, 0x10, 0x58, 0x23, 0xf2, 0xeb, 0x1e, 0x91, 0x47, 0x53, 0x7a, 0xe8, 0xa5, 0x4a, 0x75, 0xf8, 0x9f, 0xa7, 0x71, 0xfd, 0x2a, 0xcd, 0x1c, 0x4d, 0xc9, 0x0c, 0xe5, 0x87, + 0x0c, 0x07, 0xee, 0xb5, 0x7c, 0xfa, 0xbe, 0xfb, 0xc3, 0xde, 0x6f, 0xcc, 0x23, 0xae, 0xe9, 0x7f, 0x08, 0xc6, 0xf5, 0xd5, 0xb6, 0x65, 0x09, 0xf0, 0x09, 0x01, 0xcf, 0x49, 0x69, 0xae, 0xa0, 0x38, + 0x5c, 0x2a, 0xc0, 0x74, 0xc0, 0xb3, 0x19, 0xb0, 0x98, 0x20, 0x63, 0x09, 0x07, 0x57, 0x6c, 0xc4, 0x20, 0xc2, 0x96, 0x81, 0x46, 0xae, 0x06, 0xd1, 0xdb, 0x6d, 0x64, 0xce, 0x60, 0xa6, 0xb7, 0xc4, + 0x3a, 0x94, 0x44, 0xb8, 0xb6, 0x01, 0x0e, 0xf0, 0xe1, 0xb2, 0x1f, 0xaf, 0x39, 0x1b, 0x9d, 0xe4, 0x79, 0x67, 0xbe, 0x23, 0x0e, 0x41, 0x07, 0xd7, 0x9d, 0x48, 0x7a, 0x66, 0x76, 0x3e, 0x61, 0x6b, + 0x9b, 0x00, 0xf6, 0xf6, 0x40, 0xff, 0x56, 0xd7, 0x6b, 0x01, 0x74, 0xcb, 0x8e, 0x08, 0x26, 0x2b, 0x7f, 0x49, 0xd7, 0x5b, 0x8b, 0xad, 0xc7, 0x29, 0x8b, 0xfb, 0x43, 0x7d, 0x62, 0x19, 0x45, 0x6d, + 0x19, 0xf5, 0x18, 0x43, 0x50, 0xc6, 0x48, 0xb0, 0x19, 0x50, 0x54, 0xdc, 0x16, 0xdc, 0x8f, 0x6a, 0x11, 0x70, 0x1d, 0x1a, 0x45, 0xdc, 0xa5, 0xad, 0xf7, 0x76, 0x92, 0xc7, 0x0d, 0x77, 0x33, 0xa1, + 0x82, 0xeb, 0x28, 0x99, 0xfb, 0xa1, 0x48, 0xc6, 0x4a, 0xca, 0x0c, 0xb3, 0x5d, 0x47, 0x50, 0xa6, 0xcf, 0xc6, 0xcf, 0xf6, 0x26, 0xeb, 0x33, 0xa4, 0x7f, 0xb6, 0x21, 0xd8, 0xcf, 0x35, 0xd4, 0xd7, + 0x0d, 0xc1, 0x5a, 0xe8, 0x24, 0x3d, 0xec, 0x97, 0x7a, 0xe1, 0xa3, 0x0b, 0xc6, 0x98, 0xa2, 0x53, 0x64, 0x29, 0xcc, 0x61, 0x99, 0x81, 0xe9, 0x9d, 0x44, 0x2b, 0x87, 0x72, 0x46, 0x2d, 0x99, 0x58, + 0xf6, 0x39, 0x37, 0x1b, 0x90, 0x0a, 0x06, 0x4d, 0xe0, 0xa5, 0x0a, 0x1e, 0xa2, 0xb5, 0x17, 0x0e, 0x96, 0x01, 0xc3, 0xb3, 0x65, 0xec, 0x46, 0x65, 0x40, 0x85, 0x4a, 0x88, 0x46, 0x86, 0x37, 0x27, + 0x3d, 0x64, 0x39, 0xd1, 0x0b, 0xc4, 0x5a, 0x3e, 0x13, 0xde, 0x67, 0xb9, 0xb2, 0xff, 0x3d, 0xf6, 0x08, 0xbb, 0xc7, 0xf5, 0xff, 0xa6, 0x9b, 0x84, 0xdd, 0x61, 0xf6, 0xcf, 0x70, 0xb9, 0xef, 0xac, + 0xbb, 0x3f, 0xf7, 0x7a, 0xc5, 0x7a, 0xbb, 0x43, 0x1f, 0xe8, 0xde, 0xbb, 0xda, 0xd4, 0xe3, 0x6e, 0xd1, 0x6f, 0x70, 0x73, 0xa1, 0x75, 0x96, 0xa8, 0x63, 0x97, 0xf1, 0x02, 0x9f, 0x03, 0xca, 0xb8, + 0x80, 0x4d, 0xc8, 0xe2, 0x46, 0xa4, 0xc7, 0xaf, 0xb3, 0x8d, 0x30, 0x0a, 0x63, 0x06, 0xad, 0xa6, 0x78, 0xb8, 0x62, 0xd7, 0xeb, 0x50, 0xcb, 0x7d, 0x2a, 0x35, 0x99, 0xd8, 0xdd, 0x6f, 0x83, 0xd8, + 0xd9, 0x71, 0xb6, 0xcf, 0x95, 0x2b, 0xc0, 0xef, 0x8f, 0x66, 0x11, 0xb1, 0x36, 0x6c, 0x2f, 0x43, 0x62, 0x0f, 0xf7, 0xfa, 0x4f, 0x33, 0x02, 0x9e, 0x19, 0x5b, 0x7f, 0x9e, 0x2e, 0xff, 0xf1, 0xec, + 0xf9, 0xbc, 0x7a, 0x70, 0x8f, 0x63, 0xc4, 0x4b, 0xa3, 0xd9, 0x89, 0x64, 0xa3, 0x30, 0x8e, 0x07, 0x5d, 0xa2, 0xdd, 0x78, 0x56, 0x20, 0x13, 0x66, 0xce, 0xf4, 0x71, 0x34, 0xf7, 0xf7, 0x83, 0xc8, + 0xdf, 0x0f, 0x86, 0x71, 0xbd, 0x9e, 0xa6, 0xbc, 0x08, 0x66, 0x73, 0x48, 0x4e, 0x3a, 0xb9, 0x11, 0xcf, 0x64, 0x33, 0x5a, 0x43, 0xbc, 0x4a, 0x1a, 0x1d, 0xa6, 0x6f, 0x2d, 0x36, 0x4a, 0x87, 0x3f, + 0x30, 0xe1, 0x70, 0x84, 0x64, 0x81, 0xed, 0xf8, 0xdc, 0x74, 0xac, 0xd0, 0x3e, 0xea, 0x03, 0x85, 0xb2, 0x8c, 0x26, 0xc0, 0x3e, 0x59, 0xd6, 0xf0, 0x33, 0xbe, 0x7c, 0x13, 0x42, 0xa9, 0x85, 0xc9, + 0x65, 0xd5, 0xe8, 0x93, 0xdb, 0xbc, 0x69, 0xea, 0xba, 0xe9, 0x29, 0x2e, 0xea, 0x4b, 0x75, 0xea, 0xc7, 0x66, 0xde, 0xdd, 0xc9, 0xea, 0xeb, 0x3e, 0xe2, 0x67, 0x5c, 0xfd, 0xcb, 0x3a, 0xfb, 0x4f, + 0xb2, 0xce, 0xa2, 0xc4, 0xf1, 0x95, 0x87, 0x16, 0xc2, 0x2b, 0xa9, 0x25, 0x67, 0x9a, 0xe7, 0x4e, 0xe5, 0xf8, 0x4a, 0x93, 0xa4, 0xd3, 0xa2, 0x57, 0x19, 0xc3, 0x7c, 0x30, 0x28, 0x09, 0x29, 0xd2, + 0x95, 0x8e, 0x85, 0x46, 0x1d, 0x61, 0x54, 0x04, 0x1b, 0x70, 0x59, 0x89, 0x5b, 0x60, 0xb5, 0x36, 0x26, 0x34, 0xcb, 0x01, 0x16, 0x93, 0x71, 0xd4, 0x92, 0x07, 0xb5, 0x59, 0x2e, 0xc2, 0x23, 0xad, + 0x3f, 0x0d, 0xc4, 0x45, 0x61, 0xbb, 0x6b, 0x5c, 0x19, 0x1a, 0x71, 0xc2, 0xd0, 0x40, 0xaa, 0xce, 0xc3, 0x08, 0x9c, 0xa6, 0xb5, 0x0f, 0xba, 0xa9, 0xb2, 0x91, 0x1e, 0xcd, 0xed, 0xdf, 0x2f, 0xdd, + 0x71, 0x92, 0x47, 0xca, 0x79, 0x3a, 0x7a, 0x5a, 0x31, 0x69, 0x4e, 0xdf, 0xdc, 0xf4, 0xb6, 0xdf, 0x14, 0x8a, 0xe7, 0xe8, 0x4a, 0x76, 0x75, 0xdf, 0xe5, 0xca, 0xcf, 0x57, 0x57, 0xda, 0xf2, 0xea, + 0xb2, 0x40, 0x7a, 0xbf, 0x23, 0xbc, 0xe6, 0x2d, 0x6c, 0x68, 0x36, 0xbc, 0x6a, 0x8e, 0xba, 0x50, 0x3b, 0x7f, 0xa0, 0xc6, 0xb0, 0x4e, 0x1a, 0x6d, 0x32, 0xac, 0x18, 0x8d, 0xb2, 0x92, 0xdb, 0xc1, + 0xbb, 0x84, 0x12, 0x50, 0x47, 0x1d, 0xec, 0xa9, 0x19, 0xb9, 0x54, 0x47, 0xd8, 0x6e, 0x48, 0x07, 0x32, 0xad, 0xf5, 0x40, 0x2e, 0xf4, 0x8a, 0xc2, 0xdc, 0xef, 0x05, 0x6d, 0x92, 0x84, 0x80, 0x22, + 0x3b, 0x94, 0x20, 0x79, 0x02, 0x12, 0x5b, 0xc9, 0x6e, 0x85, 0xb3, 0x78, 0x41, 0x0e, 0x35, 0x6c, 0x88, 0x31, 0x42, 0xaa, 0xf5, 0x9e, 0x59, 0xc9, 0xdf, 0x4d, 0x57, 0x6f, 0xdc, 0x08, 0xd8, 0x4b, + 0xb3, 0x54, 0xf0, 0xad, 0xa5, 0x9d, 0x7d, 0xc2, 0xec, 0xd3, 0xc5, 0x27, 0x35, 0x59, 0xb1, 0x97, 0xea, 0xa9, 0x7c, 0x90, 0x6d, 0x58, 0xf4, 0x5e, 0x7f, 0x15, 0x6b, 0x57, 0x4f, 0x85, 0x3e, 0xa8, + 0xf3, 0xe1, 0x70, 0xee, 0x83, 0xcb, 0x6a, 0xb9, 0x2b, 0x24, 0x7d, 0x14, 0x8d, 0xcb, 0xa2, 0x37, 0xde, 0xd4, 0x06, 0xd7, 0xdb, 0x32, 0x9e, 0xca, 0x1f, 0xca, 0x90, 0x12, 0xf3, 0x81, 0xce, 0xf7, + 0x09, 0xb9, 0x8f, 0x97, 0xa3, 0x59, 0x67, 0x24, 0x60, 0x22, 0x69, 0x87, 0x0b, 0xae, 0x53, 0x8f, 0x0a, 0x7f, 0x5a, 0xd7, 0x69, 0x3f, 0xb6, 0xad, 0x0a, 0x1c, 0x26, 0x02, 0xb6, 0x85, 0x10, 0xc5, + 0x74, 0x7e, 0x77, 0x58, 0x6a, 0xa9, 0x15, 0x3e, 0xdc, 0x46, 0x8f, 0x26, 0x2f, 0xaf, 0xc0, 0x79, 0xa6, 0xda, 0xa0, 0x79, 0x3e, 0x6e, 0x26, 0x31, 0x2d, 0xc0, 0x9c, 0xfa, 0xe6, 0x74, 0x86, 0xa8, + 0xf8, 0xb0, 0xb3, 0xdc, 0x16, 0x0b, 0x72, 0x0e, 0x15, 0x09, 0x22, 0xc6, 0xd0, 0x7e, 0x06, 0x84, 0xcc, 0xc0, 0x0a, 0xe0, 0xf9, 0x6e, 0xdb, 0xcf, 0xe2, 0x05, 0x09, 0xcc, 0x90, 0x68, 0xaa, 0x44, + 0x12, 0x85, 0x0e, 0x49, 0x6d, 0xb0, 0x56, 0xc2, 0x01, 0xb2, 0x92, 0x10, 0x18, 0x61, 0x58, 0x74, 0x5b, 0x45, 0x4b, 0xc0, 0x34, 0x9d, 0x70, 0xe4, 0xef, 0x33, 0x07, 0x07, 0x44, 0xe5, 0x75, 0xa5, + 0xff, 0x45, 0xe4, 0xef, 0x56, 0x47, 0xf8, 0x73, 0x99, 0xf1, 0x97, 0xcc, 0xff, 0x73, 0x65, 0xfe, 0x09, 0x9e, 0xaf, 0x0a, 0xfd, 0x7d, 0x3c, 0x5b, 0x8a, 0x3d, 0xd2, 0x0b, 0x82, 0xa9, 0x69, 0x6e, + 0x6a, 0xf2, 0x30, 0x87, 0x68, 0x09, 0x80, 0x35, 0xa2, 0x17, 0xf4, 0x02, 0xba, 0x37, 0x62, 0xeb, 0x10, 0x0c, 0x9c, 0x9d, 0x14, 0x1f, 0xf0, 0x43, 0x15, 0x4b, 0x41, 0x15, 0x52, 0x81, 0x50, 0x55, + 0x9b, 0x88, 0x17, 0x75, 0xb9, 0x6f, 0x38, 0x8c, 0x66, 0x93, 0x34, 0x9d, 0x63, 0x10, 0x96, 0xa1, 0x65, 0xd4, 0x93, 0x7d, 0x6b, 0x6d, 0xae, 0xed, 0xa0, 0xd7, 0xa7, 0xa3, 0x67, 0x23, 0xfd, 0x9f, + 0x84, 0xe7, 0xf7, 0x9e, 0xde, 0x57, 0x0a, 0xd6, 0x9d, 0x69, 0x36, 0x48, 0x5e, 0xfc, 0xbb, 0xad, 0x0a, 0xd5, 0xed, 0xd7, 0xa9, 0x16, 0x6f, 0xf7, 0x28, 0xcf, 0x44, 0x38, 0xb9, 0x92, 0x41, 0x7d, + 0x6f, 0xf5, 0xa7, 0x6b, 0x07, 0x07, 0x48, 0xc7, 0x45, 0x40, 0x70, 0x4a, 0x6f, 0xc4, 0x49, 0x8c, 0xc0, 0x0b, 0x40, 0xdf, 0x19, 0x1b, 0x71, 0x55, 0x4e, 0x51, 0x68, 0x53, 0x89, 0x07, 0xc5, 0x9b, + 0x43, 0xc6, 0xd2, 0xa7, 0x30, 0xb9, 0x27, 0x49, 0xc0, 0x6c, 0xdb, 0x63, 0x89, 0xc1, 0x66, 0xe5, 0xaf, 0x7b, 0x2b, 0x6a, 0x77, 0xc0, 0x9f, 0x8d, 0x1e, 0x2d, 0x14, 0x5e, 0x3b, 0x24, 0x0b, 0x23, + 0xc8, 0xba, 0x99, 0x92, 0x34, 0x59, 0x23, 0xb6, 0xf3, 0xa8, 0x66, 0x03, 0xf6, 0x9a, 0xc1, 0xf8, 0x99, 0xfa, 0x11, 0xdd, 0xcf, 0xd7, 0xba, 0x58, 0x3b, 0x23, 0xd2, 0x01, 0xe0, 0xad, 0x1a, 0xac, + 0x6a, 0x20, 0x3f, 0x2c, 0x19, 0x09, 0xef, 0xcc, 0xf5, 0xf5, 0xc4, 0x9a, 0x6e, 0x58, 0x91, 0x43, 0x61, 0xa2, 0xc3, 0xc5, 0x3b, 0x75, 0x2f, 0xd4, 0x2c, 0x02, 0x43, 0x6c, 0xce, 0x08, 0x13, 0x29, + 0xe6, 0xf3, 0xc9, 0x74, 0x4c, 0x81, 0x63, 0x0e, 0xee, 0x6c, 0xe0, 0x43, 0xb6, 0x1b, 0xe9, 0x53, 0xde, 0x97, 0x51, 0x7d, 0x89, 0x9b, 0xfd, 0x43, 0xaa, 0xa3, 0xab, 0xed, 0xac, 0xb3, 0xf9, 0x49, + 0x3d, 0xdc, 0x56, 0x79, 0x68, 0xdf, 0xed, 0x12, 0x81, 0xbc, 0xd6, 0xcb, 0x2f, 0x1b, 0x44, 0x9c, 0xf7, 0x86, 0x40, 0xda, 0xf5, 0x6e, 0x5f, 0x28, 0x3b, 0xb0, 0xb9, 0x17, 0x54, 0x6a, 0x56, 0x0b, + 0xc4, 0x1a, 0xe4, 0x76, 0xe0, 0x38, 0xd6, 0x83, 0xed, 0x9c, 0x37, 0xc4, 0x6c, 0x81, 0x26, 0xa0, 0x37, 0xef, 0xd5, 0x04, 0x45, 0x29, 0x25, 0xb3, 0xb5, 0x62, 0x43, 0x21, 0x54, 0xd6, 0x71, 0x60, + 0x90, 0xda, 0x25, 0x63, 0x3a, 0x19, 0xe8, 0xc0, 0xe8, 0x00, 0x72, 0x30, 0xaf, 0xd5, 0xf8, 0x0a, 0x82, 0x20, 0x46, 0x19, 0xec, 0x25, 0x4d, 0x05, 0x7f, 0x02, 0x17, 0xf8, 0x46, 0xbe, 0x1d, 0x5a, + 0x40, 0x66, 0x2a, 0x4a, 0xda, 0x75, 0xd3, 0x6e, 0x92, 0x07, 0x99, 0xf3, 0xb0, 0x82, 0x38, 0xfc, 0xd2, 0xc6, 0x54, 0x9f, 0x68, 0x03, 0xdd, 0xcf, 0x57, 0x9a, 0xbd, 0x94, 0x5b, 0xb8, 0xbe, 0x4c, + 0x21, 0xa0, 0x8d, 0x32, 0xcf, 0x60, 0xa5, 0xa3, 0xf6, 0xb6, 0x10, 0x22, 0xed, 0x6c, 0xf7, 0x90, 0xc4, 0xdc, 0x4a, 0x21, 0x71, 0x0f, 0x01, 0x39, 0x8d, 0x14, 0xd2, 0xc1, 0xc4, 0xeb, 0x2d, 0x3a, + 0x44, 0x3a, 0xa5, 0x73, 0x45, 0xce, 0x0e, 0x5b, 0xae, 0x5c, 0xc0, 0xc3, 0xcd, 0x98, 0x98, 0xc2, 0x3c, 0x15, 0xe9, 0x3e, 0x7e, 0x18, 0x43, 0x1c, 0xcc, 0x2e, 0x52, 0xbd, 0xde, 0xcd, 0x48, 0x58, + 0x9f, 0x0d, 0x5a, 0x6e, 0xa9, 0x70, 0xbb, 0xfd, 0xc8, 0x65, 0x93, 0xd5, 0xff, 0x79, 0x75, 0xc3, 0x55, 0xf9, 0xea, 0x5f, 0x7f, 0x87, 0xbe, 0x64, 0x79, 0x5d, 0x6a, 0x42, 0xfe, 0xfa, 0x5a, 0x86, + 0xcd, 0x54, 0xd2, 0xec, 0x12, 0x15, 0x88, 0xbe, 0x41, 0xe4, 0xdd, 0xd6, 0x6e, 0xa2, 0x94, 0x5d, 0x35, 0xd4, 0x2f, 0xb7, 0xc1, 0x8f, 0xa3, 0x12, 0xbf, 0x04, 0x99, 0x1c, 0x59, 0xdd, 0x0d, 0xd3, + 0xab, 0x20, 0xd3, 0xe3, 0xc4, 0xfb, 0x26, 0xef, 0x2a, 0x2c, 0x8c, 0xc4, 0x0b, 0x15, 0xbd, 0x1b, 0x25, 0x61, 0x66, 0x68, 0x57, 0xd9, 0x6a, 0xf0, 0x6d, 0x42, 0x59, 0x94, 0x84, 0x7e, 0x57, 0xf3, + 0x9c, 0x4b, 0xe4, 0x26, 0x84, 0x7e, 0x8e, 0x68, 0x8d, 0x4f, 0xaf, 0xc0, 0xdf, 0xa0, 0xbb, 0x1e, 0xe0, 0x2f, 0x53, 0xc2, 0xaf, 0xb2, 0xf7, 0x6d, 0xc0, 0xd4, 0xf7, 0x5e, 0x12, 0xb8, 0x71, 0x90, + 0xfc, 0x1d, 0x22, 0x4f, 0xff, 0xda, 0x0c, 0x17, 0x9f, 0xe5, 0xf3, 0xa6, 0x51, 0x49, 0xac, 0xcb, 0x84, 0xf5, 0x91, 0x9a, 0xfb, 0xf9, 0x90, 0x7c, 0x21, 0x0a, 0x74, 0xdf, 0x0f, 0xdb, 0xee, 0x70, + 0x40, 0x76, 0x7a, 0x9b, 0xd8, 0x50, 0xd5, 0x41, 0x1d, 0x6d, 0x7b, 0xfc, 0xb2, 0xb3, 0x51, 0x70, 0x1e, 0xee, 0x29, 0xe9, 0x38, 0xb4, 0x8c, 0x25, 0x57, 0x6b, 0xc3, 0x8c, 0x1a, 0xcf, 0xf5, 0x88, + 0x1b, 0x8d, 0x2a, 0xca, 0x82, 0x40, 0x13, 0xc4, 0x94, 0xd5, 0x60, 0x4d, 0xab, 0x5a, 0x3f, 0x1e, 0x9a, 0xc0, 0x62, 0x5b, 0x42, 0x7d, 0x97, 0x92, 0x3b, 0x31, 0x0c, 0xa8, 0x7d, 0xda, 0x42, 0xd8, + 0x22, 0x4f, 0xa6, 0x88, 0xf0, 0xed, 0x9e, 0x0f, 0xdf, 0xe2, 0xf3, 0x21, 0x77, 0xf7, 0x4d, 0xaa, 0x57, 0x16, 0x9d, 0xce, 0x34, 0x9b, 0xdd, 0x31, 0x9a, 0xa3, 0xb6, 0xc1, 0x63, 0x65, 0x74, 0x90, + 0xd3, 0xde, 0x3c, 0x3c, 0xc8, 0xca, 0xa4, 0xbf, 0x9a, 0x0c, 0xc7, 0xb2, 0x58, 0xb1, 0x7d, 0x65, 0x17, 0x79, 0xe0, 0x60, 0xba, 0xa2, 0x3a, 0x03, 0xba, 0xa7, 0x4c, 0x9c, 0xca, 0xf0, 0xa7, 0x36, + 0x57, 0xee, 0x0f, 0x82, 0x85, 0x23, 0x36, 0x2a, 0x42, 0xd3, 0x89, 0x25, 0x0d, 0x47, 0x91, 0x18, 0x2f, 0xd8, 0xf9, 0x52, 0xf3, 0xfd, 0xdd, 0x2c, 0xb7, 0x92, 0xa5, 0x3b, 0xf1, 0xe8, 0x6c, 0x53, + 0x2c, 0x5b, 0x0e, 0x10, 0x57, 0x82, 0xf2, 0xb0, 0xb6, 0xec, 0x17, 0xd1, 0xbf, 0xea, 0xb5, 0x47, 0x91, 0x3f, 0x9f, 0x5e, 0x8b, 0xfd, 0x77, 0x6c, 0x49, 0x9b, 0xb0, 0x95, 0xac, 0x51, 0xe5, 0x55, + 0x64, 0x74, 0xbf, 0x13, 0xd4, 0xd7, 0xea, 0x3d, 0x3d, 0x78, 0x47, 0x33, 0x84, 0xdf, 0x6d, 0x69, 0x5b, 0x01, 0x6a, 0xab, 0x6a, 0xe8, 0x56, 0xab, 0x52, 0x69, 0xab, 0xa5, 0x0b, 0x4c, 0x19, 0x49, + 0x12, 0x31, 0x8f, 0x11, 0xbe, 0x2c, 0x46, 0x71, 0x8f, 0x60, 0x3a, 0x9b, 0x40, 0xdd, 0x1b, 0x63, 0xc3, 0x8c, 0x8c, 0xdd, 0x6c, 0xdb, 0x49, 0xaa, 0x7a, 0x30, 0xf1, 0x24, 0x9c, 0x5f, 0x65, 0x83, + 0x89, 0x9d, 0xe2, 0xbc, 0x07, 0xce, 0xf6, 0xd2, 0x30, 0xd2, 0xa6, 0x9d, 0x72, 0x06, 0x4e, 0x4a, 0x93, 0xeb, 0x0c, 0x18, 0x09, 0x6b, 0xaa, 0x9c, 0x3c, 0xc1, 0x4b, 0x37, 0x9a, 0x2c, 0x84, 0x3c, + 0x71, 0xba, 0xef, 0x25, 0xec, 0xbf, 0x41, 0xec, 0xe7, 0x5d, 0xfb, 0xe1, 0x5b, 0x2e, 0x98, 0xdd, 0x6b, 0x6b, 0x5b, 0x44, 0x72, 0x33, 0xb5, 0xa6, 0x1b, 0x0b, 0x33, 0xa4, 0x43, 0xb1, 0x94, 0x87, + 0xe5, 0x86, 0x1c, 0x14, 0xa6, 0xaa, 0x8c, 0x08, 0x6a, 0xbb, 0xb2, 0x61, 0x6d, 0xd6, 0x41, 0x5c, 0xcc, 0xe4, 0x86, 0xb5, 0xc4, 0x31, 0x87, 0x0d, 0x3d, 0x41, 0xf4, 0x35, 0xa2, 0x10, 0x9b, 0x9a, + 0xac, 0x60, 0x13, 0xc8, 0x05, 0xd0, 0x40, 0x68, 0x7c, 0xe3, 0x87, 0x3a, 0x8b, 0x84, 0x2b, 0x0c, 0x75, 0x45, 0xa1, 0x37, 0x5a, 0x8b, 0xe3, 0xf1, 0xf7, 0x1b, 0xbe, 0x7c, 0xdd, 0x4a, 0xe8, 0xbe, + 0x51, 0xf5, 0x4a, 0x1d, 0xbb, 0x4f, 0xb4, 0x3f, 0x10, 0x7a, 0xaf, 0x04, 0x89, 0xb4, 0xab, 0x61, 0x67, 0x22, 0xb1, 0xd0, 0x0b, 0x85, 0xaa, 0xe7, 0xc2, 0x94, 0x4d, 0x1b, 0xc0, 0xa8, 0xb7, 0x66, + 0x7a, 0x50, 0x39, 0xf3, 0xa7, 0x34, 0xc3, 0x48, 0x80, 0xc5, 0xf2, 0xc1, 0x74, 0x4e, 0xed, 0x86, 0x98, 0x9d, 0x96, 0x3c, 0x41, 0xcf, 0xa6, 0x2e, 0xd8, 0x1b, 0x69, 0xd8, 0x68, 0x37, 0xaf, 0x7b, + 0xda, 0x70, 0xdc, 0xe9, 0x1c, 0xbc, 0x88, 0x65, 0xc6, 0x16, 0xab, 0x38, 0xd9, 0x3a, 0x05, 0x11, 0x4a, 0x5c, 0x92, 0xe8, 0xb3, 0x41, 0xf1, 0xf8, 0x4b, 0x1f, 0xd7, 0x5e, 0x7a, 0xad, 0xc0, 0xef, + 0x3b, 0xd5, 0x77, 0x2c, 0x1c, 0xd3, 0x6c, 0x5b, 0xde, 0xf7, 0x30, 0xc9, 0x43, 0x11, 0xeb, 0xcc, 0x7a, 0xbd, 0xad, 0x27, 0x93, 0x59, 0x69, 0xe8, 0xca, 0xd2, 0xc4, 0xa9, 0x03, 0x2c, 0x5a, 0xc2, + 0xfa, 0x50, 0x58, 0x32, 0xbf, 0x0b, 0x17, 0xd3, 0x58, 0xce, 0x4d, 0x7f, 0xe2, 0xa8, 0x60, 0x36, 0x83, 0x33, 0xc3, 0x5a, 0xd0, 0xbc, 0xac, 0x42, 0xd1, 0x7a, 0x6e, 0x8d, 0x6d, 0x2f, 0x66, 0x3d, + 0x0a, 0x34, 0x78, 0x50, 0x43, 0x4a, 0xba, 0x10, 0x34, 0xbf, 0x3e, 0xa0, 0x3f, 0x5e, 0x19, 0x6c, 0x7e, 0xf6, 0xb7, 0x05, 0x95, 0xe0, 0x17, 0xd2, 0xc5, 0xde, 0xa9, 0x5e, 0x80, 0x39, 0x97, 0x54, + 0x82, 0x9f, 0x25, 0x86, 0x35, 0x31, 0x5b, 0x6c, 0x36, 0xd0, 0x2c, 0x11, 0x27, 0x4b, 0x47, 0x14, 0x9d, 0x52, 0x86, 0xed, 0xb9, 0x3e, 0x31, 0xb5, 0xd1, 0x7c, 0x6f, 0xf4, 0xb6, 0xbc, 0x19, 0x94, + 0x3e, 0xbd, 0xdc, 0x6c, 0x6d, 0xdf, 0x98, 0x72, 0x64, 0x32, 0x00, 0xc5, 0x61, 0xe9, 0x33, 0x80, 0x90, 0x85, 0xc8, 0x8a, 0x58, 0x86, 0xf2, 0x34, 0xc2, 0x34, 0xc7, 0x93, 0xd5, 0x43, 0xcd, 0x63, + 0x8e, 0x38, 0x17, 0x85, 0x74, 0xd2, 0xe9, 0x1b, 0xec, 0xb3, 0xc9, 0xe1, 0x37, 0x31, 0xc5, 0x47, 0xbc, 0x3c, 0x47, 0x05, 0xcc, 0xf4, 0x2d, 0xcd, 0x94, 0xec, 0x5d, 0x63, 0xdc, 0xa4, 0xdd, 0x5c, + 0xdf, 0x55, 0x5e, 0xc2, 0x87, 0xbf, 0x58, 0x63, 0x5f, 0xf3, 0x68, 0x3e, 0x97, 0xf8, 0x35, 0x12, 0xcb, 0x80, 0x7f, 0x7d, 0xac, 0x3a, 0x5d, 0xb7, 0x39, 0x5a, 0x12, 0x7e, 0x64, 0x8e, 0xa0, 0x9f, + 0x7f, 0x42, 0xe4, 0x68, 0x57, 0xcd, 0xf0, 0x4d, 0xb9, 0x8a, 0x76, 0xe6, 0x58, 0xbb, 0xda, 0x4f, 0x0d, 0x43, 0xef, 0x26, 0xce, 0x3c, 0xb4, 0xba, 0x5e, 0x31, 0x2b, 0x1e, 0xbf, 0xe6, 0x22, 0x54, + 0xf7, 0x93, 0x77, 0x5a, 0x46, 0xb6, 0x78, 0xb6, 0x0e, 0x94, 0x83, 0xce, 0x6c, 0xdf, 0x23, 0x47, 0x72, 0x28, 0x32, 0x99, 0xb7, 0x4e, 0x94, 0x51, 0x66, 0xda, 0xd8, 0x76, 0xe7, 0xb8, 0x63, 0x57, + 0xf1, 0xb6, 0xda, 0x9e, 0x48, 0x15, 0x29, 0xcb, 0x95, 0x60, 0xc5, 0x56, 0x33, 0xee, 0x10, 0x8c, 0xec, 0xd5, 0xb6, 0xcf, 0x4e, 0xe2, 0xd1, 0x81, 0x25, 0xfc, 0x74, 0x49, 0xb2, 0x60, 0xce, 0xf8, + 0xb1, 0xb7, 0x2f, 0x5d, 0x66, 0x4d, 0x1e, 0x8a, 0x72, 0xf4, 0x5a, 0xf7, 0x3b, 0x7f, 0xc7, 0xf7, 0x20, 0x62, 0x6f, 0xc4, 0x6f, 0x82, 0x78, 0x1f, 0xbd, 0x0b, 0x6c, 0x0d, 0xfd, 0xe7, 0xb0, 0xa5, + 0xf4, 0x7a, 0x21, 0x5a, 0x01, 0x25, 0xa7, 0xc6, 0x2c, 0x87, 0x04, 0xcb, 0xc5, 0x3d, 0x49, 0x15, 0xc0, 0x91, 0xe9, 0x0e, 0x6c, 0x79, 0xb3, 0xa5, 0xfc, 0x48, 0xc6, 0x28, 0x65, 0x35, 0xdc, 0x57, + 0x33, 0x1b, 0xb3, 0xa8, 0x2d, 0x6d, 0x29, 0x40, 0xbe, 0x98, 0xb8, 0xc2, 0x62, 0x14, 0xb1, 0x03, 0x97, 0xe9, 0x29, 0xfa, 0x66, 0x1c, 0xe9, 0xbc, 0xc6, 0xcc, 0x56, 0xac, 0x68, 0x25, 0x32, 0x91, + 0x06, 0xa1, 0xd0, 0xce, 0x66, 0xfb, 0x8f, 0xf3, 0xdc, 0xaa, 0x29, 0x13, 0xdb, 0xf4, 0x94, 0x5f, 0x1f, 0x21, 0xce, 0x57, 0x1d, 0xe1, 0x6a, 0x9b, 0xc5, 0xaf, 0x2d, 0xdf, 0x6f, 0xb3, 0xf8, 0x68, + 0x2b, 0x3e, 0xe4, 0xcb, 0x4d, 0x79, 0xe2, 0xbc, 0x93, 0xb8, 0x79, 0x47, 0x62, 0xea, 0xda, 0x7b, 0xef, 0x6f, 0xe3, 0x4f, 0xba, 0xc7, 0xa3, 0xdb, 0x49, 0xcd, 0x5f, 0xdb, 0x23, 0xfe, 0xb5, 0x3d, + 0xe2, 0x4b, 0x92, 0xf3, 0xd7, 0x36, 0x89, 0xad, 0xb6, 0x49, 0x6c, 0x70, 0xf4, 0x8c, 0xc2, 0x08, 0x52, 0x3b, 0x33, 0x6e, 0x66, 0x7d, 0x9f, 0xbd, 0x07, 0x3f, 0x2f, 0x4e, 0xf6, 0x99, 0xf8, 0x65, + 0xfc, 0xbd, 0xba, 0xd4, 0x78, 0x13, 0x9e, 0x14, 0x2b, 0x83, 0xba, 0x8b, 0x5d, 0xf4, 0xff, 0x70, 0xf7, 0xa6, 0xcd, 0xaa, 0x6a, 0x41, 0xa2, 0xe0, 0x5f, 0xb9, 0x71, 0x3e, 0x3e, 0xda, 0xc3, 0x3c, + 0x55, 0xf4, 0xeb, 0x2e, 0x54, 0x14, 0x15, 0x41, 0x50, 0x04, 0x79, 0x51, 0x15, 0xc1, 0x28, 0xf3, 0x3c, 0x08, 0xf1, 0xa2, 0x7f, 0x7b, 0xc7, 0x56, 0xf7, 0xbc, 0xdd, 0xb2, 0xbd, 0xa7, 0xea, 0xd6, + 0xab, 0x2f, 0xf7, 0xb2, 0x90, 0x93, 0x6c, 0x32, 0x73, 0x65, 0xe6, 0xca, 0xd1, 0xd2, 0xd3, 0x23, 0x31, 0xcb, 0xd7, 0xeb, 0x7c, 0x2e, 0x01, 0x9e, 0x4c, 0xe9, 0x75, 0x6e, 0xe3, 0x8e, 0x6c, 0x3d, + 0xa2, 0x75, 0xce, 0x71, 0xdb, 0x17, 0xfe, 0xff, 0x9a, 0x25, 0x1e, 0x49, 0x90, 0xfb, 0x08, 0xfc, 0xf9, 0x7b, 0xdf, 0xdc, 0xba, 0x54, 0x38, 0xdc, 0x67, 0x85, 0x23, 0xb1, 0xaa, 0x57, 0x6a, 0x3c, + 0xd3, 0x2c, 0xc8, 0x5d, 0x4c, 0x29, 0x55, 0xe5, 0xa0, 0xc0, 0xaf, 0xb0, 0x23, 0xc4, 0xcc, 0xc7, 0xe9, 0xd2, 0x9b, 0x84, 0xcb, 0xb5, 0x09, 0xcb, 0xb1, 0x59, 0x6e, 0x59, 0x45, 0x68, 0x24, 0x40, + 0x9f, 0x50, 0x53, 0x62, 0xa2, 0xe8, 0xc0, 0xbc, 0x9a, 0x51, 0xc9, 0xba, 0xdf, 0x6e, 0xb4, 0xc4, 0xf3, 0x9d, 0x4d, 0xd7, 0xe5, 0xb9, 0x9f, 0xf5, 0x82, 0xc0, 0x26, 0x5c, 0x70, 0xfc, 0x91, 0xd4, + 0xf9, 0xf2, 0xfc, 0xf9, 0xb1, 0xf9, 0xcf, 0x1d, 0x4c, 0x17, 0x8e, 0x7d, 0xbb, 0x19, 0x18, 0xfa, 0xf8, 0xc9, 0xe3, 0x02, 0xf7, 0x19, 0xbf, 0x97, 0xd5, 0xd9, 0xc8, 0x1e, 0xb0, 0xcb, 0x7a, 0x63, + 0x67, 0xd8, 0x13, 0xaf, 0x00, 0x04, 0x27, 0xec, 0x7a, 0x23, 0x8a, 0x98, 0xb5, 0xc6, 0xec, 0x34, 0x5e, 0x94, 0xa9, 0xb5, 0x70, 0x42, 0xfb, 0x3c, 0xd3, 0xa1, 0xb5, 0x32, 0x43, 0x8c, 0xb9, 0x8b, + 0xb1, 0x46, 0xe5, 0x25, 0x73, 0xc8, 0x45, 0x91, 0x3d, 0x2f, 0x4e, 0x85, 0xe8, 0x40, 0x2d, 0xea, 0xf9, 0x01, 0xe5, 0x52, 0x59, 0x44, 0x78, 0x02, 0x24, 0xdc, 0x6d, 0x2f, 0x94, 0xbc, 0xc1, 0x2d, + 0x7e, 0xd2, 0x93, 0x78, 0x98, 0xab, 0xaf, 0xac, 0x46, 0xa5, 0xe1, 0x0e, 0x33, 0x31, 0x1f, 0x3c, 0xfd, 0xbf, 0x87, 0xff, 0x8c, 0xcd, 0xf7, 0x77, 0xcf, 0x46, 0xe5, 0x90, 0x13, 0x3f, 0xb0, 0x5a, + 0x5a, 0x88, 0x1d, 0x2f, 0xf8, 0x68, 0x93, 0x45, 0x53, 0x90, 0xc3, 0x56, 0x74, 0x44, 0xf3, 0x16, 0xc3, 0x31, 0xee, 0xa6, 0xda, 0x10, 0xe3, 0x03, 0x85, 0xd5, 0x7b, 0x5e, 0x93, 0x08, 0xb6, 0xb1, + 0x7a, 0x9a, 0xb7, 0x8e, 0x28, 0x7a, 0x40, 0x7a, 0x78, 0xb1, 0x37, 0xa3, 0x1d, 0x71, 0xb2, 0x0f, 0x38, 0xb6, 0xd1, 0x0e, 0x7b, 0x8e, 0x6d, 0x00, 0x48, 0xcd, 0x72, 0x6a, 0x91, 0x12, 0x7d, 0xf8, + 0xe3, 0x82, 0x9c, 0x37, 0xf6, 0xc9, 0xad, 0xb0, 0xc0, 0x83, 0x1c, 0x57, 0x17, 0xfe, 0x33, 0x82, 0x9e, 0xf6, 0x04, 0x32, 0x8c, 0xd7, 0xac, 0x45, 0x5d, 0xae, 0xc6, 0x8b, 0x0a, 0x94, 0xc1, 0x74, + 0x41, 0xf4, 0x20, 0x9c, 0x74, 0xae, 0x83, 0xcc, 0x9a, 0xf9, 0x6a, 0xbf, 0x4b, 0xbd, 0xbd, 0xec, 0x36, 0xa1, 0xe8, 0x35, 0x27, 0x28, 0x99, 0xb0, 0x2a, 0x70, 0x72, 0x71, 0x21, 0x9d, 0x68, 0x01, + 0xc3, 0x59, 0x6a, 0x46, 0xa3, 0xb5, 0xa8, 0x8c, 0x2d, 0xaf, 0x3f, 0x58, 0x65, 0xb3, 0x89, 0x0a, 0x23, 0x63, 0x6c, 0x0d, 0xae, 0x55, 0xe0, 0x30, 0xbf, 0x2f, 0xd1, 0x6f, 0x73, 0x0b, 0xf6, 0x1b, + 0x79, 0x44, 0xd9, 0x3d, 0x9b, 0x9f, 0xa3, 0xe7, 0xab, 0xd1, 0x05, 0xd0, 0x7d, 0x0c, 0xf4, 0xaa, 0xea, 0xe3, 0xab, 0x39, 0x63, 0xc2, 0x07, 0x9d, 0x70, 0xbb, 0x22, 0x99, 0x25, 0x0c, 0x3c, 0x61, + 0x60, 0x56, 0xe7, 0xc2, 0xf9, 0x9a, 0x38, 0xd4, 0x2c, 0x7f, 0x1c, 0xa3, 0x52, 0xb6, 0x45, 0x23, 0x2c, 0xe2, 0xe5, 0x0e, 0xc6, 0x54, 0xd8, 0xb2, 0x60, 0xc2, 0xc4, 0x56, 0xf3, 0x0d, 0x07, 0xf6, + 0x12, 0x4d, 0xa9, 0x93, 0xad, 0xbd, 0x05, 0x76, 0x18, 0xbc, 0x0c, 0xb9, 0x03, 0xea, 0xe4, 0x70, 0x3a, 0xd0, 0x7c, 0x7a, 0xb1, 0x9a, 0x9f, 0xec, 0xbd, 0x6b, 0xe9, 0x7c, 0x71, 0x35, 0xa2, 0xf0, + 0xf7, 0xa6, 0xd1, 0xcb, 0xa3, 0xe7, 0xd6, 0x8d, 0xd7, 0x67, 0x90, 0x1b, 0xcf, 0x7c, 0x75, 0x88, 0x78, 0x07, 0xfe, 0x53, 0x79, 0xd3, 0x4b, 0xbf, 0xc2, 0x28, 0x3d, 0x1e, 0xdf, 0x9a, 0x5d, 0xef, + 0x1b, 0x86, 0x34, 0x8d, 0x7f, 0x69, 0x6b, 0x47, 0x7d, 0x6a, 0xf6, 0x67, 0xdc, 0xf2, 0xa1, 0x7e, 0x61, 0xe7, 0x7d, 0xf1, 0xf7, 0xfd, 0xba, 0x9c, 0xb9, 0xc9, 0x0f, 0x0f, 0xfa, 0x89, 0x3d, 0x8a, + 0xbb, 0x51, 0x6b, 0x5c, 0x1e, 0x20, 0x3f, 0xb6, 0xaf, 0x88, 0xfc, 0xa3, 0x57, 0x3d, 0x3d, 0xf1, 0x64, 0x3a, 0x3a, 0xe5, 0xf3, 0xd1, 0xfd, 0x63, 0xcf, 0x05, 0x3f, 0x79, 0xfe, 0xb3, 0x3f, 0x36, + 0xb8, 0xbb, 0xce, 0x66, 0x1f, 0xb5, 0x46, 0x91, 0xbc, 0x7e, 0xf7, 0xe7, 0x87, 0x4e, 0xdd, 0xc8, 0xb0, 0xed, 0xe2, 0x05, 0x2f, 0xef, 0x42, 0x3e, 0x6f, 0xce, 0x15, 0x1f, 0xf0, 0x5a, 0x3a, 0x56, + 0x5d, 0x38, 0x97, 0x6f, 0x7d, 0xeb, 0xd4, 0xc6, 0x3f, 0x3e, 0xf6, 0xa6, 0xb3, 0xc3, 0x87, 0xdf, 0x2a, 0x3f, 0xe9, 0x46, 0x51, 0x51, 0x5f, 0x5e, 0xf0, 0x13, 0xed, 0xf6, 0x44, 0xf6, 0x4b, 0x19, + 0xed, 0xcd, 0xcd, 0xf6, 0xc8, 0x0c, 0xca, 0xf7, 0xa0, 0xdf, 0x6c, 0xb9, 0x6b, 0xc9, 0x2e, 0x36, 0x6c, 0x26, 0x25, 0x49, 0x1b, 0x21, 0xb4, 0x3c, 0xd9, 0xb6, 0x08, 0xd5, 0x15, 0xa3, 0x31, 0x12, + 0x6e, 0x59, 0x2b, 0xaf, 0x29, 0x89, 0x46, 0x43, 0xd6, 0xf3, 0x8e, 0xe3, 0xd6, 0xeb, 0x32, 0xd6, 0xc3, 0x31, 0x23, 0x14, 0x39, 0xea, 0x69, 0x16, 0x3c, 0xe1, 0xfa, 0x46, 0xd8, 0x70, 0xa2, 0xd5, + 0xec, 0xca, 0xfd, 0x9a, 0xdd, 0x44, 0xf8, 0x02, 0x10, 0x76, 0x80, 0x2c, 0x62, 0x87, 0xd5, 0x7a, 0xee, 0x78, 0xa2, 0xbb, 0x1d, 0xe0, 0x82, 0xfd, 0x10, 0x00, 0xbc, 0x21, 0x83, 0x1e, 0xd4, 0x58, + 0x6f, 0x81, 0xbf, 0x41, 0xcc, 0xf3, 0xad, 0x11, 0x36, 0xac, 0x85, 0x17, 0xbd, 0xdf, 0xcf, 0x23, 0x72, 0x82, 0x00, 0x0a, 0xac, 0xf9, 0xf4, 0x06, 0x49, 0xc5, 0x1d, 0xa7, 0x56, 0xcb, 0x0e, 0xd6, + 0xc5, 0xb0, 0xb7, 0xa7, 0x62, 0x60, 0x6f, 0xfd, 0xfd, 0x36, 0xe9, 0x8f, 0x10, 0xe3, 0x82, 0x54, 0x7b, 0xb4, 0xcb, 0xec, 0xb8, 0x3f, 0xad, 0xb4, 0xe4, 0x30, 0x76, 0xba, 0x0d, 0xc5, 0xcd, 0x13, + 0x6b, 0x85, 0x6f, 0x41, 0xf3, 0xb0, 0x9c, 0xe6, 0x44, 0x84, 0x30, 0xd0, 0x41, 0x4c, 0x3f, 0x96, 0xee, 0x7f, 0x67, 0x5c, 0xbd, 0x63, 0x9c, 0x2f, 0x2a, 0xe1, 0xdf, 0x05, 0x50, 0x9f, 0x98, 0x19, + 0x1e, 0xc2, 0xf3, 0xd8, 0x03, 0x79, 0x5f, 0x7f, 0xfd, 0x81, 0x22, 0x78, 0x36, 0x8d, 0xe3, 0x4f, 0xa4, 0xf8, 0x7f, 0xaf, 0xe7, 0xba, 0xff, 0x39, 0x74, 0x33, 0xe5, 0xb7, 0x2d, 0xf1, 0x47, 0x5d, + 0x68, 0xf9, 0x95, 0x45, 0xf2, 0xd1, 0x05, 0xc8, 0x7d, 0xc6, 0x20, 0x59, 0xab, 0x2f, 0xa9, 0xe3, 0x62, 0x33, 0x2d, 0xf6, 0xfd, 0x0e, 0x60, 0xc3, 0xf2, 0x30, 0xb6, 0xea, 0x2c, 0x5f, 0x77, 0xa7, + 0x2d, 0xa7, 0x69, 0x05, 0x27, 0xf2, 0xb2, 0x7c, 0x52, 0x10, 0x70, 0xea, 0x5b, 0x7b, 0x8a, 0xa4, 0xe8, 0xb5, 0x3c, 0x96, 0x65, 0x0a, 0xe0, 0x2c, 0xa4, 0x56, 0x7b, 0xa5, 0xce, 0xc4, 0x12, 0x3b, + 0x6c, 0xb1, 0x65, 0x3f, 0x8e, 0xc7, 0xa7, 0x20, 0x98, 0xec, 0xc7, 0xa7, 0x29, 0x38, 0xd0, 0xea, 0x2e, 0x9c, 0xba, 0x7c, 0xdb, 0x71, 0x67, 0x48, 0x2a, 0xf0, 0x17, 0x1d, 0x8f, 0xbe, 0xc2, 0x21, + 0xf1, 0x58, 0x80, 0xe8, 0x03, 0xf0, 0x27, 0x6c, 0x7e, 0xb8, 0x35, 0x22, 0x86, 0x85, 0x83, 0xc8, 0x79, 0x56, 0x82, 0x9a, 0xda, 0xc5, 0x26, 0x1f, 0x22, 0x12, 0x7f, 0x58, 0x61, 0x42, 0x9f, 0xad, + 0xc5, 0xe2, 0x10, 0xac, 0x3d, 0x7b, 0x71, 0xd2, 0xea, 0x45, 0xd3, 0x21, 0xd2, 0xb8, 0xe4, 0x59, 0x22, 0x0a, 0xea, 0xd4, 0x5e, 0x35, 0x76, 0xa8, 0x96, 0xa0, 0x95, 0x75, 0xcb, 0x25, 0x3a, 0xd9, + 0x2f, 0xf6, 0x19, 0x07, 0x89, 0x3e, 0xcc, 0x35, 0x47, 0x38, 0x6d, 0xcc, 0x75, 0xcf, 0xdb, 0xb3, 0xf1, 0xf8, 0x71, 0xbf, 0xb6, 0x1b, 0x19, 0xd5, 0x9b, 0x16, 0x3a, 0x37, 0x1a, 0xa3, 0xff, 0x47, + 0x14, 0x39, 0xb8, 0x7e, 0x14, 0x8d, 0x0a, 0x23, 0x39, 0xde, 0x22, 0x15, 0xf9, 0x28, 0xa9, 0xae, 0x60, 0x2f, 0x44, 0xba, 0x2e, 0xce, 0xc3, 0x53, 0x07, 0x90, 0x27, 0x17, 0x53, 0x7a, 0x06, 0xd8, + 0x6b, 0x25, 0x9e, 0x20, 0xbc, 0x65, 0x62, 0x63, 0x73, 0xdf, 0x24, 0xab, 0xe5, 0x69, 0xb7, 0x09, 0x26, 0x31, 0x20, 0xcb, 0x99, 0x83, 0x1d, 0xa7, 0xf5, 0xbc, 0xe8, 0x43, 0x9e, 0x8c, 0xd9, 0x7d, + 0x04, 0xda, 0xc1, 0x61, 0x5b, 0x23, 0xa2, 0x2d, 0x21, 0x1b, 0x03, 0x85, 0x10, 0x01, 0x4b, 0xf3, 0x70, 0x7b, 0xa4, 0xfd, 0x82, 0x08, 0x0c, 0x5e, 0x5d, 0x22, 0xca, 0x76, 0x9f, 0xdd, 0x4b, 0x95, + 0xbc, 0x4d, 0x9e, 0x2a, 0xbd, 0x36, 0x4e, 0x7d, 0x46, 0xd4, 0xa5, 0xeb, 0xd6, 0x7f, 0x90, 0x4b, 0xff, 0x9d, 0x09, 0xf4, 0x35, 0x49, 0x88, 0x47, 0x7c, 0x01, 0xaf, 0x70, 0xcf, 0x34, 0x79, 0x59, + 0x8d, 0xce, 0xf0, 0xee, 0x13, 0x05, 0x12, 0x03, 0x2e, 0x81, 0x4d, 0x38, 0x99, 0x68, 0xa8, 0xb3, 0x37, 0x63, 0x7a, 0xdc, 0x39, 0x2c, 0xe7, 0x97, 0xd6, 0xe6, 0xe0, 0x73, 0xbc, 0xeb, 0x39, 0x3e, + 0xdc, 0x8a, 0x8a, 0x42, 0xe7, 0xae, 0x2b, 0x85, 0x21, 0x4d, 0xb5, 0x2c, 0xc4, 0xa7, 0xd4, 0xbe, 0xd8, 0x1f, 0xdc, 0xed, 0x7c, 0x7d, 0x4c, 0xb6, 0xc9, 0xd4, 0xa3, 0x88, 0xe9, 0xc9, 0xb1, 0xed, + 0x9a, 0x49, 0xc6, 0x2e, 0x96, 0xb4, 0x0a, 0xdb, 0x0e, 0x93, 0x45, 0xee, 0x60, 0x5f, 0xf0, 0x7b, 0x57, 0xca, 0x17, 0xb6, 0xe8, 0xf9, 0x34, 0x79, 0x26, 0x27, 0xf2, 0xeb, 0x5f, 0x1e, 0xef, 0xd5, + 0x32, 0x4c, 0x1a, 0x26, 0xf6, 0xa8, 0xbe, 0xd5, 0xfd, 0xf1, 0xb1, 0x0c, 0x8f, 0x2b, 0xcc, 0x67, 0x12, 0xd6, 0xd9, 0xd0, 0x0c, 0x8f, 0x4d, 0x26, 0xb6, 0x8c, 0x2d, 0x81, 0x87, 0x48, 0x93, 0x90, + 0x26, 0xa0, 0x0c, 0xd4, 0xa3, 0x16, 0x7e, 0x36, 0xad, 0x0f, 0xb2, 0x8f, 0xb6, 0x96, 0xb3, 0x97, 0xa4, 0xf9, 0x41, 0x3d, 0x09, 0x0b, 0xc1, 0xb2, 0x72, 0x0c, 0x62, 0x92, 0x96, 0x1c, 0x47, 0x25, + 0xab, 0x4d, 0xd6, 0x66, 0x05, 0xeb, 0x15, 0x20, 0xf2, 0x0c, 0x31, 0xcb, 0xe9, 0xb2, 0x5e, 0x64, 0x0b, 0x75, 0x0a, 0x89, 0x65, 0xb2, 0xd8, 0x46, 0xf7, 0xd2, 0x65, 0x6f, 0x53, 0x34, 0x4a, 0x2d, + 0xa3, 0x7a, 0x3a, 0x34, 0x5c, 0x53, 0xbb, 0x3e, 0x77, 0x29, 0x31, 0x2a, 0x6f, 0xe4, 0x9c, 0xfc, 0xb2, 0x2a, 0xdf, 0x18, 0x25, 0x3f, 0xa5, 0xd3, 0xa0, 0x1d, 0xf7, 0x56, 0xfa, 0x7e, 0xed, 0x17, + 0x7a, 0x64, 0xdc, 0xd2, 0x2b, 0xd8, 0x27, 0x62, 0xbd, 0x2c, 0xce, 0x63, 0x54, 0x06, 0x74, 0x5f, 0xb6, 0x63, 0xba, 0xc4, 0x37, 0x2d, 0xb9, 0xb4, 0xa0, 0x79, 0xb3, 0x3e, 0x98, 0xa5, 0x27, 0x10, + 0xbd, 0xe5, 0x4d, 0x18, 0x5a, 0x3e, 0x4a, 0x51, 0xdf, 0xb3, 0xba, 0x86, 0x36, 0x5d, 0x24, 0xd3, 0x8b, 0x7c, 0xe6, 0x6e, 0x29, 0xcd, 0xf2, 0xcd, 0x48, 0xd1, 0xc4, 0x95, 0xab, 0x12, 0x5b, 0xbf, + 0x5e, 0x42, 0x0e, 0x8c, 0x3a, 0xd3, 0x83, 0x9e, 0xea, 0x7b, 0xbc, 0xb5, 0x0b, 0xa7, 0x21, 0x37, 0xa8, 0xd0, 0xfe, 0x3d, 0x15, 0x55, 0x5d, 0xbe, 0xf9, 0x73, 0x0f, 0xb9, 0xc2, 0x8f, 0x0b, 0xc3, + 0x7d, 0xd1, 0x5d, 0x3f, 0x2d, 0x5e, 0x7e, 0x54, 0x77, 0xbd, 0xfc, 0x49, 0x5f, 0x13, 0xed, 0x21, 0x37, 0xd4, 0x05, 0xe6, 0x95, 0x62, 0x95, 0x63, 0x0f, 0xad, 0x88, 0xed, 0x99, 0x94, 0x91, 0xfc, + 0xda, 0xee, 0x80, 0x02, 0xdf, 0x36, 0xc9, 0xb6, 0x45, 0x57, 0xcb, 0x0e, 0x4f, 0x4b, 0x30, 0x95, 0x97, 0x07, 0xae, 0x2f, 0xfa, 0xc0, 0x00, 0xab, 0xf1, 0x34, 0x2f, 0xf4, 0x4a, 0xf0, 0x94, 0x96, + 0x32, 0x2b, 0xa2, 0xa3, 0xc4, 0x71, 0xbf, 0x56, 0xad, 0x40, 0x2d, 0x00, 0x2a, 0xf2, 0xf7, 0x14, 0x6b, 0x12, 0x9d, 0xe8, 0xb5, 0x94, 0xaa, 0x93, 0xfb, 0x99, 0x8e, 0xeb, 0xfd, 0xcf, 0xdd, 0x4d, + 0x69, 0x31, 0x72, 0x0c, 0xeb, 0xd6, 0x04, 0x6d, 0xe8, 0x37, 0xfa, 0x48, 0xb2, 0xc9, 0x15, 0xe8, 0x13, 0x52, 0xae, 0x97, 0xa3, 0x33, 0xa4, 0xfb, 0x58, 0x09, 0xf2, 0x83, 0xcb, 0x67, 0x64, 0x9c, + 0xd2, 0xcd, 0xa2, 0x93, 0x5c, 0xaa, 0x0b, 0x55, 0xa4, 0x21, 0x19, 0x00, 0x11, 0x30, 0x29, 0x70, 0x26, 0xce, 0x02, 0x07, 0xa6, 0x3d, 0xad, 0x15, 0x86, 0x2f, 0xc2, 0xfe, 0x31, 0xa1, 0xe0, 0x36, + 0xf0, 0x39, 0x72, 0x66, 0xd2, 0xcd, 0x56, 0x54, 0x1b, 0xc9, 0x15, 0xaa, 0x78, 0x6b, 0x60, 0x1c, 0x22, 0xa7, 0xd2, 0xae, 0x28, 0x34, 0xbf, 0xb1, 0x15, 0x3d, 0x1e, 0xa8, 0x33, 0xbe, 0x6a, 0x44, + 0x8c, 0x0e, 0x61, 0xab, 0xb4, 0x88, 0x47, 0xb6, 0x51, 0x7d, 0x57, 0x7c, 0xf8, 0x80, 0xdc, 0x7e, 0x86, 0x7a, 0xc1, 0xe2, 0xe5, 0xfa, 0x5c, 0x80, 0x38, 0x40, 0x76, 0xb3, 0x3b, 0x36, 0x8c, 0xb6, + 0x73, 0x1f, 0xaf, 0x20, 0x69, 0xad, 0xd7, 0xbe, 0x96, 0x32, 0xa0, 0x44, 0x34, 0x56, 0x72, 0xb2, 0x78, 0x69, 0x83, 0x37, 0x76, 0x7d, 0xdc, 0x66, 0x35, 0xd3, 0xf9, 0xc4, 0x76, 0x3f, 0xf7, 0x11, + 0x2b, 0xda, 0x6c, 0x32, 0xe0, 0x74, 0x64, 0xbd, 0x7a, 0x6d, 0x70, 0x13, 0xa0, 0x9f, 0x1f, 0x13, 0x14, 0x5e, 0xd9, 0x08, 0x8a, 0xab, 0x28, 0xee, 0x92, 0x5c, 0x17, 0x86, 0x46, 0xfb, 0xb8, 0xec, + 0x36, 0xca, 0x2e, 0xb1, 0x42, 0xff, 0xe2, 0x7c, 0x81, 0x3e, 0x56, 0xf6, 0x5a, 0x69, 0x6c, 0x9e, 0x87, 0x37, 0xbe, 0x4c, 0x51, 0xbc, 0x68, 0x61, 0xea, 0xed, 0x43, 0xb1, 0x1f, 0x3b, 0x67, 0xb7, + 0xd1, 0x9b, 0xe0, 0xef, 0x4f, 0xc5, 0xc6, 0xff, 0xf3, 0x3f, 0xff, 0x1a, 0xe4, 0xb9, 0x4e, 0x8b, 0xd8, 0xb7, 0xaf, 0x6c, 0xf0, 0x07, 0x1d, 0xd6, 0x2f, 0x60, 0xaf, 0x14, 0xbd, 0x2c, 0x86, 0xba, + 0xa7, 0x21, 0xd6, 0xda, 0xd2, 0xed, 0x64, 0xc6, 0xf6, 0x7c, 0xe3, 0xfa, 0x61, 0x49, 0xa6, 0xf1, 0x12, 0xd8, 0xfa, 0x87, 0x25, 0xe3, 0x4f, 0x81, 0x5d, 0xbf, 0xc2, 0x36, 0x56, 0x0b, 0x2b, 0x91, + 0x92, 0xce, 0x13, 0x4f, 0x39, 0x4d, 0xad, 0xf5, 0x2a, 0xa8, 0xa0, 0x0d, 0x79, 0xa2, 0x5a, 0xd6, 0x84, 0x6a, 0x42, 0xe4, 0x6a, 0x4a, 0x30, 0x69, 0x4a, 0x9d, 0xa3, 0xc9, 0xa9, 0x8a, 0x66, 0xf8, + 0x84, 0x34, 0x9b, 0xbb, 0x85, 0xb9, 0xb7, 0x49, 0xfa, 0x3a, 0x6f, 0xf0, 0x8b, 0x91, 0x0b, 0x9e, 0x73, 0x4a, 0x7d, 0xfb, 0xd7, 0x97, 0xe6, 0x54, 0x9a, 0x58, 0xcf, 0xdb, 0xeb, 0x03, 0x1f, 0xbc, + 0x4d, 0x66, 0x7e, 0xf0, 0x50, 0x1f, 0xa6, 0x23, 0xd7, 0x3f, 0x9f, 0xe9, 0xab, 0x3a, 0x49, 0xac, 0x30, 0x9d, 0xa4, 0x85, 0x03, 0x5a, 0x69, 0x1c, 0xfb, 0xe5, 0x13, 0xf5, 0x06, 0x25, 0x7b, 0xa6, + 0x45, 0x6b, 0x14, 0xf6, 0x4d, 0x3d, 0x01, 0x3d, 0xe6, 0x82, 0x7f, 0x86, 0x7a, 0x21, 0xfe, 0xe5, 0x7a, 0x04, 0x0d, 0x73, 0xc2, 0x9b, 0xb5, 0x3c, 0x87, 0xdc, 0x6c, 0x5c, 0xc9, 0xdc, 0x76, 0x37, + 0x11, 0x99, 0xad, 0x43, 0x78, 0x53, 0x04, 0xa7, 0x2a, 0xb6, 0x36, 0x67, 0xa9, 0xcc, 0x9b, 0x98, 0x2e, 0x30, 0x84, 0x70, 0x5a, 0xef, 0x39, 0xa1, 0x45, 0x8e, 0xa2, 0xd5, 0x72, 0x29, 0xdd, 0x76, + 0x86, 0x19, 0xf5, 0xeb, 0x5e, 0x64, 0xf0, 0x9e, 0x3e, 0x31, 0x34, 0x0f, 0xaf, 0x84, 0x20, 0x04, 0x85, 0x8a, 0x58, 0xef, 0x68, 0xe3, 0x90, 0xfe, 0x24, 0xe0, 0xf3, 0x17, 0x34, 0x68, 0x2a, 0x91, + 0x5b, 0xfe, 0x2e, 0x1c, 0x23, 0xba, 0xda, 0x68, 0x5f, 0x3b, 0x43, 0x1e, 0x92, 0x85, 0xaf, 0x70, 0x9f, 0xd0, 0xf7, 0xba, 0x1a, 0x12, 0x97, 0x86, 0x47, 0x33, 0x69, 0x5b, 0x2d, 0xb7, 0xeb, 0x7d, + 0xb0, 0xca, 0x18, 0x04, 0x4a, 0x13, 0x8f, 0x2a, 0xc7, 0x92, 0x1c, 0x2b, 0x44, 0x48, 0xfd, 0x54, 0x5d, 0x96, 0xdf, 0x16, 0xbc, 0x20, 0x0f, 0x8d, 0x5d, 0x7a, 0x06, 0x7a, 0xfe, 0xb4, 0x6b, 0xd1, + 0x0b, 0x32, 0x6c, 0xec, 0xd2, 0xc9, 0xcf, 0xd7, 0x92, 0x8c, 0x9d, 0x18, 0x87, 0xdb, 0xd5, 0x63, 0xba, 0x56, 0x63, 0xc0, 0x9d, 0xc9, 0xd6, 0x42, 0x3c, 0xae, 0xc6, 0x6b, 0x5f, 0x1c, 0x6f, 0x00, + 0x47, 0xf3, 0xbb, 0x1d, 0x19, 0x94, 0xc7, 0xfd, 0x24, 0x87, 0xcd, 0x70, 0xdf, 0x1d, 0x2b, 0x08, 0x4a, 0x99, 0x6d, 0xda, 0x8e, 0x49, 0xd6, 0xae, 0x32, 0x91, 0x33, 0x8c, 0xcd, 0x71, 0x55, 0x51, + 0x30, 0xb2, 0xa1, 0x0d, 0x13, 0x98, 0x4e, 0x57, 0xf7, 0x0a, 0xcd, 0x3d, 0xa3, 0x5c, 0x24, 0x65, 0x65, 0x44, 0xd1, 0xf6, 0x3c, 0x6d, 0xe7, 0xe3, 0xef, 0x1f, 0x7a, 0xc0, 0xbc, 0xde, 0x7f, 0x42, + 0xdb, 0xff, 0x7a, 0x23, 0x42, 0x8c, 0xa2, 0x7d, 0x4d, 0x95, 0xf8, 0xb7, 0x61, 0xbc, 0xf8, 0xef, 0xd4, 0x6f, 0x98, 0xf8, 0x7d, 0xad, 0x3c, 0x80, 0x7e, 0x13, 0x2f, 0x46, 0x20, 0x3c, 0xd4, 0x08, + 0xfc, 0x30, 0x74, 0xe8, 0x86, 0xcb, 0xee, 0x11, 0x01, 0xff, 0x16, 0xf2, 0x13, 0x31, 0xdf, 0xae, 0x07, 0x4f, 0x5a, 0x5f, 0xa4, 0x0d, 0xd3, 0xaf, 0x35, 0x8c, 0x2e, 0x67, 0xd4, 0x21, 0xc2, 0x29, + 0x77, 0x3b, 0x51, 0x97, 0x78, 0xd9, 0x6c, 0xf9, 0xda, 0xf0, 0xcd, 0xcd, 0x49, 0x93, 0x96, 0x33, 0x3e, 0x1e, 0x8b, 0xe6, 0xae, 0x9e, 0x14, 0xd0, 0xda, 0x85, 0x57, 0xfe, 0x26, 0xcd, 0xe6, 0x6b, + 0x5a, 0xf0, 0x67, 0x81, 0x7f, 0x18, 0x4f, 0x4c, 0xd7, 0x30, 0x90, 0x99, 0x47, 0x98, 0x85, 0x23, 0x11, 0x8c, 0xb0, 0xdf, 0x2d, 0xa0, 0x3b, 0xd9, 0xda, 0xdf, 0xf4, 0x13, 0xbf, 0xb5, 0x87, 0x1f, + 0xc7, 0xce, 0xa7, 0xb7, 0xbc, 0xc1, 0xd4, 0xa7, 0xdf, 0x86, 0x64, 0x6b, 0xc3, 0xa3, 0x79, 0x9b, 0xf7, 0xcd, 0x5e, 0x21, 0x57, 0x47, 0x38, 0x88, 0xed, 0x95, 0x35, 0x0d, 0x88, 0x63, 0x19, 0x2d, + 0xb8, 0x63, 0xf7, 0xd3, 0xe4, 0x8a, 0x8f, 0xe3, 0xa6, 0x6e, 0x31, 0xc7, 0xcf, 0x6d, 0xe2, 0x77, 0x90, 0xc1, 0xd1, 0xfb, 0xf5, 0xd0, 0x01, 0xe2, 0xd2, 0x72, 0xdf, 0xc3, 0xbb, 0x80, 0x5c, 0x6f, + 0x21, 0x9a, 0xde, 0x38, 0x8d, 0x32, 0xc7, 0x83, 0x26, 0xa9, 0xe8, 0x6a, 0x1b, 0x6a, 0x02, 0xb5, 0x82, 0x31, 0xfb, 0x24, 0x45, 0x7e, 0xb8, 0xac, 0x37, 0x15, 0x56, 0x4f, 0x69, 0x8f, 0x63, 0xb8, + 0x80, 0xef, 0xf8, 0xb1, 0xcf, 0xcb, 0x78, 0xcf, 0xf2, 0x4e, 0x34, 0xb6, 0xa7, 0xb4, 0x24, 0xc8, 0x8c, 0xa6, 0xf7, 0xe5, 0xf2, 0x04, 0xa9, 0xc6, 0x94, 0xa7, 0x07, 0x86, 0x22, 0x07, 0x0c, 0xeb, + 0xfa, 0xe1, 0x74, 0xad, 0xe7, 0xbd, 0xfa, 0x23, 0x0d, 0xff, 0xb7, 0x46, 0x6d, 0xdc, 0x1c, 0x15, 0xf6, 0xe7, 0x54, 0xd5, 0xd7, 0xaf, 0xb8, 0x12, 0xfc, 0xf3, 0x0f, 0x43, 0x14, 0xd8, 0x39, 0xaf, + 0x9a, 0x8d, 0x6d, 0x0e, 0x3e, 0x34, 0x0b, 0xc9, 0xd7, 0xb3, 0xa8, 0x9a, 0x08, 0xc7, 0xb0, 0xf6, 0x95, 0xa4, 0xab, 0xc3, 0xfe, 0xb4, 0x06, 0x65, 0x42, 0x98, 0x2e, 0x35, 0x14, 0x5e, 0x39, 0xe8, + 0x78, 0x0e, 0x0b, 0x39, 0x6e, 0x42, 0x5b, 0x64, 0xe3, 0x69, 0x38, 0xad, 0xac, 0x7c, 0xba, 0xd1, 0xb3, 0xcd, 0x54, 0xda, 0xdb, 0x79, 0x02, 0xc0, 0x0b, 0xcb, 0x60, 0xda, 0xa4, 0xdf, 0xed, 0xf0, + 0x66, 0x12, 0x3c, 0x6e, 0xd0, 0xdf, 0x19, 0xad, 0x74, 0x6b, 0x6a, 0xdb, 0x27, 0x8a, 0xdf, 0x37, 0x3b, 0xfe, 0x89, 0x89, 0x2c, 0xdf, 0xa4, 0xd4, 0x93, 0xbf, 0xe1, 0x07, 0xd2, 0xc8, 0xae, 0xd9, + 0xf4, 0xe7, 0x0c, 0xf2, 0x33, 0x84, 0xfb, 0x04, 0xe7, 0x5b, 0xe3, 0xd4, 0x76, 0x3a, 0x89, 0xf0, 0x21, 0xd9, 0xe8, 0x0b, 0xa1, 0x12, 0x84, 0xa2, 0x6b, 0x35, 0x48, 0xaf, 0xf9, 0x6e, 0x5b, 0x15, + 0xf6, 0xb4, 0x32, 0x4c, 0xc7, 0xd5, 0x57, 0xcc, 0x01, 0xd7, 0xe7, 0x4b, 0x6f, 0x5f, 0x1d, 0xed, 0x3e, 0x89, 0x6a, 0xd9, 0x29, 0x4f, 0x42, 0xbc, 0xf1, 0x2b, 0x16, 0xda, 0x32, 0x22, 0x20, 0x22, + 0x44, 0xa9, 0xee, 0x38, 0x67, 0xb5, 0x5d, 0x20, 0xed, 0x7a, 0x7c, 0x4f, 0xb3, 0x7f, 0xb3, 0xfb, 0xdf, 0x59, 0x76, 0x5f, 0x98, 0xf5, 0x7e, 0xe2, 0x9e, 0x43, 0xed, 0xbf, 0xbe, 0x3c, 0x10, 0xf8, + 0x89, 0xe7, 0x14, 0xfe, 0xc5, 0x31, 0xf7, 0x8e, 0x53, 0xee, 0x0c, 0x54, 0x78, 0x73, 0x58, 0x40, 0xbf, 0xf0, 0xf6, 0xf9, 0xe7, 0x09, 0x58, 0x69, 0x54, 0x57, 0x6f, 0xf3, 0x08, 0x7e, 0xc6, 0x65, + 0xff, 0xe3, 0xcf, 0x31, 0x98, 0x5f, 0x1a, 0x86, 0x35, 0xe4, 0x88, 0xf1, 0xbe, 0x94, 0xe0, 0x2b, 0x3e, 0xc3, 0x1f, 0x4a, 0xdf, 0x7b, 0x03, 0xf7, 0x99, 0xdd, 0x2e, 0xab, 0x73, 0xcb, 0xdd, 0x01, + 0xf6, 0x24, 0x23, 0x2e, 0x8e, 0x5b, 0x69, 0xe2, 0x64, 0xfe, 0xf2, 0xd0, 0x6e, 0x50, 0x46, 0x4e, 0xe6, 0x27, 0x00, 0xdf, 0x27, 0xbb, 0x1a, 0xe1, 0xc6, 0x07, 0xbb, 0x37, 0xe7, 0x1b, 0x0c, 0x77, + 0xf8, 0x16, 0x6e, 0x0a, 0xb4, 0x1f, 0xa3, 0x8d, 0xce, 0x3b, 0x9d, 0x63, 0xc3, 0xe5, 0x84, 0xf6, 0x12, 0xd3, 0x12, 0x2d, 0x1a, 0xdc, 0x16, 0xeb, 0x6e, 0x8d, 0xcb, 0x1b, 0xa9, 0x08, 0xe7, 0x3d, + 0x66, 0x6c, 0x69, 0x3d, 0x7d, 0x5c, 0xcc, 0x7c, 0x1c, 0x0e, 0xf2, 0x80, 0x04, 0x19, 0x72, 0x6c, 0x79, 0x1d, 0x80, 0xf2, 0xa5, 0x1e, 0x40, 0x7f, 0x53, 0x8f, 0x28, 0x82, 0x0b, 0xd0, 0x2b, 0x1d, + 0x8c, 0xa8, 0x1c, 0x5d, 0x00, 0xdd, 0x27, 0x42, 0xc1, 0x55, 0x36, 0x43, 0x00, 0x9b, 0xe9, 0x78, 0x11, 0x38, 0x6c, 0xc3, 0xd0, 0x70, 0x91, 0xe5, 0x3d, 0xdb, 0x84, 0x60, 0x88, 0x82, 0x3e, 0xc9, + 0x3a, 0x82, 0xe4, 0x17, 0x9d, 0xaf, 0xd6, 0x4b, 0x0e, 0xe2, 0x5a, 0xda, 0xca, 0xba, 0xe5, 0x9a, 0xa9, 0x90, 0xa0, 0x32, 0x99, 0x56, 0x31, 0x64, 0xdb, 0x9b, 0x02, 0x38, 0x89, 0x6a, 0x58, 0xa3, + 0xb6, 0xc4, 0xc2, 0x0a, 0x56, 0x1b, 0xa3, 0xf4, 0xe9, 0xc7, 0x4f, 0xfa, 0xe7, 0x5c, 0x1d, 0xf7, 0x39, 0x75, 0x06, 0xfa, 0x8d, 0xfc, 0xdc, 0x5f, 0xfb, 0x4f, 0xf6, 0xda, 0x7b, 0xa6, 0xc3, 0xbb, + 0x9b, 0x6f, 0xbf, 0xe9, 0xc6, 0x19, 0xff, 0x91, 0x79, 0xfe, 0x2f, 0x60, 0xc1, 0xd1, 0xeb, 0xf5, 0xe8, 0x02, 0xec, 0x3e, 0xdd, 0x05, 0x07, 0x70, 0x58, 0xac, 0x80, 0x40, 0x5f, 0x4d, 0x32, 0xe6, + 0x34, 0xa5, 0x70, 0xa4, 0x47, 0x19, 0x40, 0x80, 0xc6, 0x15, 0x2e, 0x0b, 0x20, 0x28, 0x04, 0xcb, 0x56, 0xb6, 0x91, 0xfd, 0x8c, 0x63, 0xe3, 0xa2, 0x6b, 0x4f, 0x2e, 0xde, 0x94, 0x7a, 0xe4, 0x61, + 0x32, 0x11, 0xf9, 0xa7, 0x88, 0x18, 0x03, 0x6d, 0x0f, 0x52, 0x36, 0x10, 0x1b, 0xbb, 0x2d, 0x13, 0x0a, 0xf0, 0x6c, 0x11, 0x2e, 0x50, 0xfe, 0x1e, 0xdd, 0xef, 0x85, 0xad, 0x1e, 0x74, 0xc4, 0xfc, + 0x21, 0xc2, 0x99, 0xb7, 0x42, 0x9a, 0x30, 0xfc, 0x50, 0xd3, 0x93, 0x0b, 0xcc, 0xeb, 0x9e, 0x34, 0xbb, 0xd1, 0x05, 0xcc, 0x7d, 0xd2, 0xb8, 0xae, 0x1d, 0xa7, 0x65, 0xc0, 0x50, 0x10, 0xd9, 0x91, + 0x40, 0xc4, 0xc0, 0xc2, 0x1a, 0x0a, 0x58, 0x9e, 0x91, 0xf7, 0xf1, 0xa1, 0x8e, 0x40, 0x12, 0xc6, 0x4f, 0xfe, 0x82, 0x67, 0x83, 0x14, 0xf5, 0xc6, 0xfc, 0x66, 0x67, 0xf9, 0xc5, 0x51, 0x12, 0x12, + 0x8d, 0x9d, 0x24, 0xf8, 0x11, 0x8d, 0x2b, 0x99, 0xda, 0x89, 0xfc, 0x64, 0x6f, 0x86, 0x6e, 0x6d, 0xc0, 0x5c, 0xe6, 0x24, 0x08, 0x0e, 0x6a, 0xd6, 0xe3, 0xb1, 0x95, 0xcb, 0xe8, 0xd7, 0x3a, 0xb9, + 0x22, 0xe3, 0x73, 0x1d, 0x8b, 0xed, 0x17, 0xaf, 0x92, 0x13, 0xfd, 0x34, 0x40, 0xca, 0x78, 0xad, 0x1b, 0xfc, 0xa2, 0x1c, 0xe3, 0xcd, 0xc4, 0x27, 0xfc, 0xe3, 0xb8, 0xa6, 0xef, 0x6a, 0xdc, 0xca, + 0xc8, 0x78, 0x37, 0x06, 0xea, 0xa7, 0x32, 0xe2, 0x1f, 0xe7, 0xb5, 0x0f, 0xd3, 0x55, 0xbf, 0x1b, 0xcd, 0xff, 0x84, 0x18, 0xea, 0xc7, 0xec, 0xf7, 0x32, 0x97, 0xff, 0x3a, 0x94, 0xff, 0x0c, 0xe5, + 0x3e, 0xf7, 0x8d, 0xd7, 0x99, 0x3b, 0x25, 0x37, 0x99, 0xcf, 0xee, 0xb2, 0x71, 0x04, 0x32, 0xc4, 0x16, 0xa3, 0xa9, 0xb1, 0xb1, 0x58, 0x12, 0x07, 0x90, 0x19, 0xef, 0x68, 0x94, 0xdd, 0x99, 0x66, + 0x87, 0xb8, 0x1b, 0x08, 0x6a, 0x30, 0xd6, 0x6c, 0x36, 0x63, 0x4d, 0x65, 0x53, 0x43, 0x86, 0x95, 0xf1, 0x66, 0x55, 0xa2, 0xbe, 0x8c, 0xa3, 0xd9, 0xf2, 0x40, 0xb2, 0x95, 0x1e, 0xe2, 0x2b, 0x66, + 0xb2, 0xc0, 0x49, 0x1f, 0x56, 0xee, 0x69, 0xe5, 0x7b, 0x8a, 0x75, 0x48, 0x3c, 0xfb, 0x98, 0x66, 0xb7, 0x5d, 0x2c, 0x8f, 0x38, 0x11, 0x9e, 0x00, 0x3e, 0xed, 0xde, 0x34, 0xb3, 0x87, 0xb8, 0x06, + 0xce, 0x61, 0x51, 0x02, 0x37, 0x85, 0x68, 0x61, 0xd8, 0xa7, 0x26, 0x33, 0x41, 0x06, 0x31, 0xcc, 0xbd, 0x1d, 0xe5, 0xab, 0x7c, 0x8f, 0x13, 0x68, 0x50, 0xcb, 0x89, 0x0e, 0xab, 0x55, 0x48, 0x94, + 0x70, 0xb9, 0x90, 0xa9, 0x5a, 0x28, 0x35, 0x99, 0x84, 0x4e, 0xf9, 0xa2, 0xdf, 0xe7, 0xa7, 0xbd, 0x0b, 0x3b, 0xbb, 0x7c, 0x5a, 0x27, 0xed, 0x0e, 0x59, 0x87, 0x56, 0xcf, 0x3a, 0x86, 0xd3, 0x4f, + 0x56, 0x3b, 0xdd, 0x6b, 0x07, 0x9e, 0x99, 0xbf, 0x3e, 0x07, 0xfd, 0x13, 0x27, 0x5f, 0xcf, 0x28, 0xec, 0x51, 0xe1, 0x04, 0x2f, 0xed, 0x46, 0xbe, 0xa2, 0xc9, 0x63, 0xb5, 0x9e, 0xef, 0x41, 0x83, + 0xa3, 0x0f, 0x37, 0x86, 0xd6, 0x74, 0xee, 0x17, 0xfa, 0x18, 0xf0, 0xcd, 0xa9, 0x77, 0x22, 0x45, 0xd3, 0x63, 0x1c, 0x52, 0xdc, 0x57, 0x29, 0x6b, 0xd6, 0x1b, 0xcc, 0x03, 0xd7, 0xb5, 0xb8, 0xe3, + 0x96, 0xc0, 0x92, 0xf2, 0x40, 0x67, 0xac, 0xa5, 0xd5, 0xf2, 0x10, 0x41, 0xee, 0xf8, 0x28, 0x93, 0xc8, 0x69, 0x3a, 0x9b, 0xac, 0x8e, 0x0b, 0x0f, 0x41, 0xc4, 0xa5, 0xbe, 0x10, 0xf7, 0xc2, 0x69, + 0xbc, 0x56, 0x6b, 0x8f, 0x29, 0x60, 0xa8, 0xa0, 0x38, 0xfb, 0xde, 0x81, 0xe7, 0x0f, 0xd4, 0x39, 0x5c, 0x9c, 0x1e, 0xb7, 0x58, 0xfc, 0xe7, 0x2a, 0xca, 0x33, 0xca, 0x33, 0x0e, 0xcb, 0xd1, 0x50, + 0xdd, 0x84, 0xd8, 0x8d, 0x08, 0xed, 0x15, 0x42, 0x74, 0x02, 0x52, 0x0e, 0xd5, 0xe5, 0xbc, 0x70, 0xbc, 0xc0, 0xec, 0xd7, 0x4c, 0x30, 0xcb, 0x70, 0x70, 0xbf, 0xda, 0x64, 0x78, 0xb5, 0xcb, 0xd4, + 0xc5, 0x1e, 0x5b, 0x72, 0x9c, 0xbe, 0x82, 0xc1, 0xf1, 0xc9, 0x9c, 0xc9, 0x95, 0x0b, 0x96, 0x3e, 0x83, 0x6c, 0xd5, 0x9d, 0x03, 0xd1, 0x96, 0x31, 0x8d, 0xf7, 0xd5, 0xe1, 0xd0, 0xab, 0xec, 0xc2, + 0x1c, 0x6f, 0xb1, 0x7e, 0x60, 0xc8, 0xf4, 0x96, 0x53, 0xe8, 0x13, 0x83, 0xdf, 0x93, 0x26, 0xd0, 0xef, 0x61, 0x9d, 0xd0, 0x9e, 0xf0, 0x62, 0xfa, 0x47, 0xff, 0xb6, 0x0f, 0xfe, 0xbd, 0x33, 0xe2, + 0x07, 0x58, 0x7f, 0x86, 0x7b, 0xc5, 0xfe, 0x75, 0x75, 0xa6, 0xc2, 0x00, 0xe3, 0xad, 0xda, 0x36, 0x93, 0x55, 0x35, 0x2e, 0xe8, 0x28, 0x9c, 0x41, 0xec, 0x09, 0x32, 0x24, 0x7f, 0x43, 0x0b, 0x80, + 0x98, 0xed, 0xb1, 0xde, 0x47, 0x0a, 0x50, 0x70, 0x1c, 0x7c, 0x1f, 0xca, 0x53, 0xd3, 0xc8, 0x1b, 0x14, 0x97, 0xf9, 0xc3, 0xba, 0x37, 0x5b, 0xc9, 0x9d, 0x6d, 0x75, 0x9d, 0x83, 0x42, 0x19, 0x90, + 0x6d, 0x02, 0x85, 0x10, 0x65, 0xa9, 0x23, 0x19, 0x68, 0x2e, 0x27, 0x6c, 0x2a, 0xa3, 0xfb, 0x8f, 0xb5, 0xb5, 0x9f, 0xd8, 0xf7, 0x3f, 0x41, 0x6c, 0x94, 0x23, 0x37, 0x32, 0x6e, 0x37, 0xde, 0x7f, + 0xc4, 0x45, 0xf6, 0x0c, 0xf4, 0x8a, 0xe8, 0xa7, 0xcb, 0xc1, 0x71, 0xed, 0x2e, 0x5c, 0xee, 0x40, 0x09, 0x5e, 0x05, 0x3b, 0xd5, 0xaa, 0xb2, 0xec, 0xb8, 0x60, 0x8e, 0xee, 0x56, 0x84, 0xaa, 0xd5, + 0xbe, 0xd6, 0x95, 0xc0, 0x3b, 0xae, 0x0b, 0x98, 0x0c, 0xf3, 0x5d, 0x1d, 0xaf, 0x23, 0x82, 0x71, 0x1b, 0x94, 0x5d, 0x6c, 0x23, 0x47, 0x21, 0x73, 0x5d, 0xe9, 0x53, 0x6d, 0x3a, 0xdb, 0x31, 0xdc, + 0x6e, 0x3a, 0xc1, 0x04, 0x31, 0x9d, 0x83, 0xfa, 0x49, 0x41, 0xd9, 0x26, 0x5a, 0x6f, 0xee, 0x61, 0x79, 0xf0, 0xd1, 0xe6, 0x7b, 0x3c, 0xbe, 0x3a, 0x40, 0xff, 0xa8, 0xb0, 0x78, 0x86, 0x7b, 0xc5, + 0xe6, 0x75, 0x35, 0x54, 0x78, 0x44, 0x28, 0x3f, 0xa9, 0x67, 0xc4, 0xfa, 0x38, 0x15, 0xda, 0xdd, 0x74, 0x15, 0xda, 0x87, 0x39, 0xeb, 0x7b, 0x87, 0xa0, 0xc2, 0x33, 0x79, 0x63, 0xb2, 0x47, 0x8c, + 0x28, 0xaa, 0x28, 0x4e, 0xb6, 0x9b, 0x48, 0x31, 0x8f, 0xf1, 0x98, 0xe2, 0xc5, 0x45, 0xb1, 0x5a, 0x9a, 0x87, 0xc3, 0x6c, 0xbc, 0x35, 0x93, 0x8d, 0xb1, 0x74, 0x4e, 0xeb, 0x55, 0xe5, 0x6f, 0x44, + 0xca, 0x8b, 0x1d, 0x39, 0x90, 0x7b, 0x64, 0x67, 0x03, 0xcc, 0xcf, 0x22, 0x8b, 0xff, 0x84, 0x8b, 0xef, 0xf3, 0xf0, 0xf7, 0x5b, 0x44, 0x79, 0x8c, 0xbf, 0xdf, 0xc0, 0xbe, 0x12, 0xe6, 0xcd, 0x9d, + 0xa1, 0x4e, 0xdf, 0x70, 0x16, 0x58, 0x5b, 0xc1, 0x4b, 0xa2, 0xf9, 0x1e, 0x0e, 0xbb, 0x74, 0x1e, 0x92, 0xa2, 0xb6, 0xda, 0x1a, 0x2d, 0x87, 0x2f, 0x45, 0x13, 0xe4, 0x7b, 0xc5, 0xc2, 0x5b, 0x7a, + 0x0c, 0x21, 0x9e, 0xb8, 0x13, 0x21, 0xdb, 0x9d, 0xc9, 0x81, 0xc9, 0x49, 0xab, 0xe6, 0x08, 0xdb, 0x84, 0xe5, 0xa2, 0x9c, 0xe9, 0x28, 0x71, 0xa5, 0xd0, 0x7b, 0xd3, 0xdc, 0xa3, 0x79, 0xaf, 0x23, + 0x3b, 0xc7, 0xa3, 0x49, 0x75, 0x60, 0x96, 0xff, 0x57, 0x2e, 0xfb, 0x9f, 0x1f, 0xfb, 0xff, 0x29, 0xea, 0x3e, 0xe7, 0x1f, 0xfc, 0x41, 0xa2, 0x9e, 0x41, 0x3e, 0xd1, 0xf2, 0x7c, 0x31, 0x94, 0x84, + 0xd2, 0x8c, 0xdf, 0x43, 0x95, 0xa1, 0x4a, 0xa2, 0x5e, 0x35, 0x0b, 0x79, 0xc1, 0xd8, 0xe3, 0x89, 0xe7, 0x94, 0x71, 0x7a, 0xd4, 0x8b, 0xaa, 0xd6, 0x9a, 0xbd, 0x5a, 0xce, 0x38, 0x7d, 0x17, 0x22, + 0x5b, 0x05, 0x30, 0x92, 0x32, 0xcb, 0x75, 0xa4, 0x59, 0x27, 0x29, 0x7f, 0x24, 0x17, 0x2c, 0x0c, 0x28, 0x21, 0x4c, 0x08, 0x30, 0xcd, 0x6c, 0x7c, 0x0b, 0x1e, 0xd7, 0x33, 0xca, 0x9c, 0x50, 0x16, + 0x12, 0xe3, 0xf7, 0x0e, 0x8e, 0x7f, 0x42, 0x60, 0xa5, 0x65, 0xe5, 0xd8, 0xa3, 0xa3, 0xff, 0x64, 0xc0, 0xba, 0xe9, 0x4d, 0xf9, 0xff, 0x90, 0xc1, 0xf8, 0x1e, 0xf6, 0x13, 0x4e, 0xdf, 0xdf, 0x19, + 0x9a, 0xa1, 0x1a, 0x76, 0x93, 0x9a, 0x15, 0xd5, 0x60, 0x99, 0xeb, 0xf5, 0xd4, 0x94, 0xb9, 0x9e, 0xa7, 0xf6, 0x34, 0x2a, 0xf4, 0x92, 0xd7, 0x2e, 0xc6, 0x24, 0x9c, 0xce, 0xd4, 0x6d, 0xd7, 0xef, + 0x53, 0x60, 0xb5, 0xd1, 0x17, 0x40, 0x96, 0x48, 0x9b, 0xcd, 0xa9, 0xb6, 0xec, 0xb0, 0x10, 0xf5, 0x26, 0xe4, 0xe5, 0xa4, 0x70, 0x71, 0x45, 0x2e, 0xa5, 0x35, 0xb0, 0x58, 0x42, 0xf4, 0xb4, 0x45, + 0x68, 0x4b, 0x66, 0xf8, 0xc5, 0x3d, 0x93, 0xf1, 0x9b, 0x0c, 0xd5, 0xa2, 0xfe, 0x30, 0xb6, 0xf9, 0x6f, 0x9d, 0x81, 0xbf, 0x21, 0x4e, 0x55, 0x65, 0xa3, 0x73, 0x99, 0xdf, 0x2d, 0x6d, 0x82, 0x3c, + 0xc6, 0xe3, 0xaf, 0x70, 0x9f, 0x88, 0xf2, 0xba, 0x3a, 0xd7, 0xb8, 0x0f, 0x20, 0xc8, 0xac, 0x6a, 0x8b, 0x39, 0xe8, 0xd4, 0xe3, 0xde, 0x60, 0x83, 0x83, 0x23, 0xe7, 0xe2, 0x31, 0xea, 0xc8, 0x39, + 0x94, 0x37, 0xbe, 0xaf, 0xa5, 0x4b, 0x35, 0x69, 0x58, 0x0e, 0xd1, 0xe1, 0x2c, 0x1a, 0xdb, 0xda, 0xd1, 0xec, 0x82, 0x06, 0xc5, 0x32, 0x6e, 0xb7, 0x35, 0xe9, 0x3e, 0x75, 0xb8, 0x75, 0x37, 0xed, + 0x50, 0x14, 0x98, 0xaa, 0x1d, 0xae, 0x56, 0xb4, 0x9a, 0x02, 0x3b, 0x45, 0xae, 0xc4, 0xc3, 0x76, 0xa0, 0xc0, 0xb2, 0x9d, 0xf3, 0x59, 0xf3, 0xd7, 0xa7, 0x89, 0xc9, 0xef, 0x62, 0x0f, 0x1f, 0x03, + 0x0c, 0xa5, 0x53, 0x65, 0x45, 0x5a, 0xa5, 0x55, 0x97, 0x39, 0xa9, 0xfb, 0xeb, 0x53, 0x37, 0xa9, 0xf3, 0x54, 0x4f, 0xa3, 0xaa, 0x4b, 0xe7, 0xe5, 0xdf, 0xbf, 0xf3, 0x95, 0x54, 0xa9, 0x6f, 0x3b, + 0x49, 0xe5, 0xbb, 0xd7, 0xf1, 0x88, 0xf0, 0x63, 0x5e, 0x6a, 0xe8, 0xf7, 0x90, 0x4d, 0xe9, 0x5b, 0x69, 0xd2, 0x8c, 0x22, 0xbf, 0xba, 0xe5, 0x95, 0x78, 0xb2, 0xa2, 0x91, 0x9f, 0x27, 0x1e, 0xbf, + 0xc2, 0x05, 0x47, 0x6f, 0x16, 0xa3, 0x0b, 0xb8, 0xfb, 0x64, 0x6f, 0xd0, 0xb5, 0x96, 0xe8, 0x8c, 0xd5, 0x24, 0x5d, 0x1b, 0xee, 0x14, 0x56, 0x4f, 0xe3, 0x05, 0x63, 0x55, 0x91, 0x43, 0xca, 0x9a, + 0xe6, 0x38, 0xb6, 0x28, 0xa3, 0x70, 0xdb, 0x46, 0xe4, 0x3e, 0xea, 0x52, 0x4d, 0xc4, 0x24, 0x9f, 0x36, 0x8a, 0x66, 0xeb, 0x24, 0x82, 0xa4, 0x26, 0x0e, 0xbc, 0xb3, 0xe4, 0xd6, 0x9b, 0xf0, 0x30, + 0xd7, 0xf2, 0x0b, 0x04, 0x36, 0xd9, 0xdc, 0xce, 0x02, 0x0a, 0x2c, 0x06, 0x1e, 0xb1, 0x4b, 0xc3, 0x75, 0x8a, 0x91, 0x59, 0xbb, 0xee, 0xf3, 0x7c, 0xca, 0xbf, 0xce, 0xd3, 0x7d, 0xfe, 0xfa, 0xbf, + 0xff, 0xfa, 0xe2, 0x9c, 0x7d, 0xb7, 0x85, 0xeb, 0xc0, 0x36, 0xc2, 0xbe, 0xe3, 0x38, 0x24, 0x8e, 0xdd, 0xd4, 0x30, 0x8f, 0x94, 0x07, 0x5e, 0x61, 0x3e, 0x91, 0xe0, 0x72, 0x75, 0x6e, 0x46, 0x36, + 0xc4, 0xc3, 0x61, 0x75, 0xb9, 0x37, 0x6d, 0x34, 0x78, 0x82, 0x11, 0x91, 0xa6, 0x5b, 0xfb, 0x7c, 0x92, 0xad, 0x80, 0x59, 0xb5, 0x96, 0xa5, 0xbd, 0xbd, 0x58, 0x0b, 0x04, 0x38, 0x75, 0xf1, 0xa0, + 0x44, 0xfa, 0xb4, 0x56, 0xca, 0x7c, 0x4e, 0x2e, 0x88, 0x72, 0x76, 0xf2, 0xab, 0xc5, 0x04, 0x20, 0x57, 0x87, 0x15, 0x42, 0xaf, 0x6c, 0x4d, 0xe4, 0x39, 0xbb, 0xa6, 0x7b, 0x1e, 0x2b, 0x67, 0x49, + 0xba, 0x97, 0x92, 0xdc, 0x78, 0x87, 0xfe, 0x57, 0x85, 0xfd, 0x9a, 0xbe, 0xf3, 0x8a, 0xc0, 0xef, 0xfa, 0xa6, 0x0c, 0x53, 0xec, 0xae, 0x53, 0xa4, 0xe5, 0x8b, 0x9f, 0xee, 0x0d, 0xc1, 0x6e, 0xbc, + 0x26, 0x33, 0xaa, 0xc2, 0x49, 0x93, 0x6f, 0xdf, 0xd3, 0xb6, 0xed, 0xef, 0xeb, 0x73, 0xe7, 0x97, 0xfd, 0xf4, 0x1d, 0x56, 0x9a, 0x94, 0x75, 0x54, 0x3d, 0x7d, 0xf6, 0x77, 0xaf, 0xb9, 0x80, 0x3d, + 0x13, 0xf0, 0x3a, 0x19, 0xeb, 0xcd, 0x2b, 0xae, 0x57, 0xff, 0xf6, 0x0d, 0x23, 0x7d, 0xe7, 0x64, 0xc4, 0x1e, 0xea, 0x59, 0xf2, 0xd1, 0xc9, 0x88, 0xdd, 0xef, 0x4f, 0xf2, 0xc4, 0x45, 0x56, 0x37, + 0x9b, 0xae, 0x8a, 0xdc, 0x02, 0x0f, 0xb6, 0xa5, 0xce, 0x12, 0x7f, 0xe9, 0xf5, 0x0b, 0x0c, 0x01, 0x98, 0x7e, 0x0b, 0x1c, 0x85, 0x36, 0x56, 0x7a, 0x71, 0x3b, 0xb3, 0xe4, 0x89, 0x74, 0x68, 0xbb, + 0x6d, 0x3d, 0x1e, 0x8f, 0x3b, 0x70, 0x15, 0xd4, 0x27, 0x95, 0xd7, 0xc1, 0x19, 0xc7, 0x72, 0xc4, 0x3a, 0xcd, 0x61, 0xc1, 0xef, 0xd7, 0xe2, 0x58, 0xed, 0x76, 0x56, 0x43, 0x89, 0x98, 0xa8, 0x2f, + 0xd6, 0x7f, 0xd3, 0x52, 0x19, 0xe4, 0x64, 0xbc, 0x7e, 0xa6, 0xd9, 0x8d, 0x6c, 0xc7, 0x35, 0xea, 0xe8, 0xcf, 0x36, 0x99, 0xfc, 0x04, 0xfd, 0x15, 0xb1, 0xaf, 0xf7, 0x86, 0xf8, 0x22, 0xe1, 0xd1, + 0x76, 0x9d, 0x55, 0x56, 0x63, 0xce, 0x53, 0x82, 0x62, 0x72, 0x03, 0x5e, 0xe1, 0xa9, 0x5d, 0x60, 0x98, 0xef, 0xac, 0xda, 0xf0, 0x87, 0x69, 0x4a, 0x7e, 0xfc, 0xc4, 0x68, 0x23, 0xb7, 0x70, 0xca, + 0x5b, 0x89, 0x96, 0x8f, 0xf5, 0xde, 0x7e, 0x0b, 0xf8, 0xe9, 0x43, 0xdf, 0x2c, 0x87, 0xf6, 0xe1, 0x6e, 0x9c, 0xc3, 0xc1, 0x93, 0x0c, 0x60, 0x0a, 0x4b, 0xe3, 0x55, 0x9f, 0x34, 0x9e, 0xc2, 0x9d, + 0x4c, 0xca, 0x35, 0x4e, 0x51, 0xd1, 0x2a, 0xc9, 0xa9, 0x74, 0xa6, 0x8c, 0xc9, 0x64, 0x18, 0x4e, 0xb2, 0x50, 0xcb, 0x0b, 0x7e, 0x8a, 0x98, 0xe2, 0x76, 0x95, 0x04, 0x87, 0xa9, 0xb7, 0x0e, 0x80, + 0x83, 0xcf, 0xe4, 0x04, 0x7c, 0x2a, 0xd6, 0x73, 0x4f, 0x0a, 0x69, 0x5f, 0xdb, 0x87, 0xf8, 0xac, 0x3f, 0x4a, 0xeb, 0x7b, 0xce, 0xea, 0xdb, 0xfa, 0xe1, 0x1a, 0xff, 0xbe, 0x60, 0xee, 0xd7, 0x97, + 0xa9, 0x0b, 0x57, 0xdc, 0x9c, 0x9b, 0x4a, 0xfd, 0xfa, 0x97, 0x87, 0x2b, 0x87, 0xfe, 0xe0, 0x68, 0xd0, 0x1f, 0x46, 0x2f, 0xfc, 0xb8, 0x2e, 0xe2, 0xba, 0xf0, 0x8c, 0x9b, 0xdc, 0x00, 0xbd, 0x8b, + 0xe3, 0x0c, 0xe7, 0x86, 0x17, 0xb8, 0x67, 0x66, 0x78, 0x59, 0x8d, 0xce, 0xf0, 0xee, 0xf1, 0x7b, 0xe8, 0xf9, 0x78, 0x59, 0x84, 0x69, 0x1a, 0xf8, 0xa7, 0x8d, 0xb5, 0x23, 0x0d, 0x04, 0xd6, 0xcc, + 0x6e, 0xad, 0x28, 0x40, 0xfa, 0xb7, 0xa4, 0x02, 0xf4, 0x9b, 0xfa, 0x0d, 0xd3, 0x43, 0xf0, 0xf2, 0xc4, 0x12, 0xd5, 0xe8, 0xdb, 0x3e, 0x49, 0x8f, 0xb9, 0xb0, 0xde, 0x41, 0x7e, 0xc2, 0xcd, 0xdb, + 0xf5, 0x60, 0x67, 0x96, 0x3d, 0x9d, 0xea, 0x35, 0xc6, 0x20, 0x62, 0xb7, 0x58, 0x91, 0x7c, 0x01, 0x22, 0xfd, 0x1c, 0x68, 0xf1, 0x20, 0x36, 0xeb, 0x10, 0x9e, 0xee, 0xc7, 0x09, 0xdb, 0xca, 0xac, + 0xd4, 0x8c, 0xfb, 0x32, 0x1b, 0x2f, 0xc3, 0x09, 0x6b, 0xca, 0x06, 0x35, 0x3f, 0x29, 0x70, 0x74, 0xf4, 0x0e, 0x96, 0x31, 0x5f, 0x4e, 0x12, 0x59, 0xf5, 0xcd, 0x60, 0xaa, 0x45, 0x39, 0x49, 0xd2, + 0x1a, 0x0c, 0x76, 0xf8, 0xe9, 0x6e, 0xc1, 0xd6, 0x1f, 0x38, 0x1b, 0xbe, 0x49, 0xf5, 0xb9, 0x25, 0x67, 0x1f, 0xd0, 0x5a, 0x57, 0xa0, 0x67, 0x64, 0x5e, 0x2e, 0xcf, 0x52, 0xf5, 0x6e, 0x67, 0xad, + 0xad, 0x09, 0x07, 0x6b, 0xdb, 0x95, 0x78, 0xa9, 0x5d, 0x36, 0x4b, 0x76, 0xc5, 0x72, 0x2a, 0x71, 0x54, 0x55, 0xd8, 0x74, 0xbf, 0x96, 0xaa, 0x03, 0x64, 0xc6, 0xed, 0xac, 0xa3, 0xb6, 0x30, 0xb2, + 0xec, 0xfc, 0xee, 0x21, 0x5d, 0x01, 0xde, 0x9c, 0x3c, 0x6e, 0x1d, 0xd2, 0x1e, 0xd8, 0x94, 0x57, 0xa0, 0x67, 0x44, 0x5d, 0x2e, 0xcf, 0xc7, 0xb3, 0x01, 0x76, 0x7a, 0x08, 0x36, 0x73, 0x43, 0xc3, + 0xc0, 0x43, 0x64, 0xa0, 0x6a, 0xdf, 0xad, 0x27, 0xcd, 0x4e, 0x12, 0xb5, 0x83, 0xb3, 0xe0, 0x9a, 0x5c, 0x5c, 0x55, 0x49, 0x3e, 0xb6, 0xeb, 0x7e, 0xc7, 0x65, 0x7d, 0x26, 0xe9, 0x3d, 0x53, 0x86, + 0xab, 0xb5, 0xa7, 0x23, 0x2b, 0x80, 0x4d, 0xc6, 0xfe, 0x76, 0x4d, 0xf7, 0xf3, 0x6d, 0xba, 0x98, 0x39, 0xeb, 0x4c, 0x5b, 0x9d, 0x0c, 0xcc, 0x3e, 0x38, 0xfa, 0x42, 0xca, 0x9d, 0xf6, 0xfb, 0xde, + 0xbd, 0x4f, 0x7f, 0x46, 0x91, 0x18, 0xd1, 0xa8, 0x8c, 0xd2, 0xef, 0x18, 0xe6, 0xe7, 0xae, 0xcf, 0x77, 0x90, 0xcf, 0xc8, 0x78, 0xb3, 0x1e, 0xea, 0xfe, 0x14, 0xa1, 0xe9, 0x18, 0x5e, 0x4e, 0xc0, + 0x72, 0xd3, 0xe9, 0x11, 0x69, 0x2d, 0x52, 0x92, 0x4a, 0x70, 0x5b, 0x26, 0x1d, 0x65, 0xdb, 0xb6, 0xd9, 0x61, 0xe3, 0x6b, 0xb2, 0xb7, 0xeb, 0x85, 0x93, 0xbe, 0x67, 0xd6, 0x4a, 0x3d, 0xa6, 0x9a, + 0x28, 0x91, 0x67, 0x1d, 0x7f, 0xb2, 0x8b, 0xfd, 0x2e, 0x0d, 0x4b, 0x42, 0xdb, 0xf0, 0xfb, 0x64, 0xe6, 0x9a, 0xbd, 0xb1, 0xb7, 0x71, 0x95, 0x0f, 0xbc, 0xe3, 0x11, 0x68, 0x1e, 0xf7, 0x20, 0x7c, + 0x1d, 0x2f, 0x7c, 0xc7, 0x81, 0x37, 0x73, 0x6c, 0x4b, 0xdf, 0x76, 0x46, 0x96, 0x67, 0x24, 0x89, 0x13, 0xfd, 0xfa, 0x97, 0x4f, 0x2d, 0x18, 0x86, 0x0a, 0x80, 0xbf, 0x86, 0xf5, 0x6d, 0xf0, 0x33, + 0xc3, 0xb6, 0x8b, 0xdf, 0xc1, 0x6d, 0x77, 0x36, 0xfd, 0x88, 0xb1, 0xf5, 0x0c, 0xf5, 0x89, 0x9e, 0xcf, 0xd7, 0xa3, 0x33, 0xac, 0xfb, 0xb4, 0x84, 0x56, 0x0b, 0x90, 0x80, 0xc8, 0x53, 0x7a, 0xda, + 0xee, 0x52, 0x8e, 0x9c, 0x07, 0x02, 0x3c, 0x73, 0xb7, 0x26, 0x9f, 0x2a, 0x10, 0x60, 0x56, 0x3b, 0xdf, 0x0a, 0x4a, 0x69, 0xab, 0x4a, 0x91, 0x07, 0x7a, 0x7a, 0x17, 0x0a, 0xd4, 0x2a, 0x8b, 0xd7, + 0x2e, 0x59, 0x1f, 0xda, 0x8d, 0x8a, 0xca, 0x80, 0x11, 0xea, 0x84, 0x0c, 0xb6, 0x30, 0xa5, 0x47, 0xda, 0x96, 0x1b, 0x1f, 0x34, 0xff, 0xa0, 0x6c, 0x44, 0xf4, 0xf8, 0x33, 0x57, 0xf6, 0x20, 0xf7, + 0x8d, 0x5f, 0x14, 0xce, 0xb1, 0x8e, 0x8c, 0x62, 0x94, 0x45, 0x75, 0x71, 0x3b, 0xf1, 0xec, 0x41, 0x13, 0xee, 0x23, 0xf4, 0x27, 0x5c, 0x7e, 0xbc, 0x37, 0xd4, 0x98, 0x5b, 0xef, 0xc7, 0xfc, 0x4a, + 0xd9, 0x19, 0xc9, 0x71, 0x8d, 0xb2, 0xae, 0xbc, 0x99, 0xc9, 0xa2, 0x17, 0xab, 0x92, 0xb4, 0x92, 0xa7, 0x65, 0x71, 0x5c, 0x50, 0xe8, 0x92, 0x9a, 0x6f, 0xd1, 0x40, 0xeb, 0x00, 0xb1, 0x3d, 0xe4, + 0xbe, 0x8c, 0x80, 0x46, 0xaa, 0x26, 0xf6, 0x41, 0xc2, 0x31, 0x98, 0x08, 0x78, 0x16, 0xad, 0x8d, 0xf9, 0x91, 0xe7, 0xc8, 0xc4, 0x8a, 0x1d, 0x54, 0xa3, 0x3b, 0x88, 0x3e, 0xea, 0xe8, 0x7f, 0x86, + 0x8a, 0x2a, 0x47, 0x46, 0x71, 0xac, 0xbf, 0x1b, 0x8c, 0x0b, 0x3f, 0x26, 0x7d, 0xdf, 0x00, 0x7e, 0x42, 0xec, 0x9b, 0xe5, 0x59, 0xe6, 0x0c, 0x90, 0xc2, 0xa7, 0x8d, 0x07, 0xc9, 0x71, 0x45, 0x09, + 0x2c, 0x81, 0x97, 0x42, 0xdf, 0x74, 0x4a, 0xac, 0x1e, 0x17, 0x70, 0xd5, 0xa3, 0xf1, 0x2a, 0x27, 0xb1, 0x68, 0xce, 0x40, 0x31, 0x4f, 0xf1, 0x07, 0xdd, 0x4a, 0x17, 0xfd, 0x4a, 0xec, 0xa7, 0x1e, + 0xc1, 0xc5, 0xc5, 0x21, 0x46, 0x6d, 0x98, 0x0a, 0x09, 0x28, 0xe1, 0x9c, 0x62, 0x42, 0x31, 0xf4, 0x2a, 0xa6, 0xc2, 0x43, 0x4d, 0x91, 0xbd, 0xbb, 0x9d, 0x25, 0xfc, 0xc3, 0x21, 0x97, 0x3b, 0x38, + 0x2c, 0x8c, 0xce, 0xff, 0xc6, 0xaa, 0x7c, 0xc8, 0xcf, 0xf1, 0x0a, 0xf7, 0x19, 0x83, 0x97, 0xd5, 0xb9, 0x1a, 0x6e, 0xc0, 0x46, 0xef, 0x7b, 0x88, 0xd8, 0x52, 0x15, 0x94, 0xf6, 0xe9, 0x54, 0x5b, + 0xcf, 0x81, 0xda, 0x74, 0x10, 0xa2, 0x77, 0x26, 0x3b, 0x41, 0xb3, 0x56, 0x8b, 0xcd, 0x52, 0x5f, 0xfa, 0x94, 0x37, 0x2e, 0x66, 0x98, 0x6f, 0x4f, 0xf8, 0xb8, 0xc4, 0x26, 0x73, 0x5a, 0xaa, 0x56, + 0x64, 0x3e, 0x8e, 0x60, 0x33, 0xf5, 0x71, 0x71, 0xda, 0xcf, 0xb2, 0xa0, 0x6c, 0x4d, 0x7c, 0xb9, 0x89, 0xb9, 0x89, 0xb9, 0xce, 0x02, 0xe3, 0xd0, 0xdf, 0x60, 0xca, 0x6f, 0xd1, 0x73, 0x09, 0x11, + 0xff, 0x69, 0xfe, 0xba, 0x40, 0xbd, 0xa0, 0xe6, 0x72, 0x3d, 0x94, 0xb3, 0xfa, 0x31, 0x3d, 0x29, 0xea, 0xb5, 0x11, 0x07, 0x5d, 0x4c, 0xc1, 0x3e, 0xb2, 0xd4, 0x51, 0x65, 0x9d, 0xe0, 0xd8, 0x66, + 0x35, 0x2f, 0xa5, 0xbe, 0x5c, 0x3a, 0x29, 0x71, 0x6a, 0x04, 0x94, 0x5b, 0x2e, 0xb1, 0x09, 0x53, 0x4a, 0xc2, 0x98, 0xf0, 0xe5, 0xba, 0xca, 0x90, 0x5d, 0x4a, 0x92, 0xa2, 0x3b, 0x11, 0xea, 0xf4, + 0x54, 0x66, 0xe5, 0xc2, 0xeb, 0x8d, 0x4d, 0x2a, 0xc2, 0x7d, 0x37, 0x61, 0xbd, 0x99, 0x78, 0x6f, 0xb7, 0x7e, 0x1f, 0x42, 0x7a, 0x8d, 0xd5, 0x7f, 0xec, 0xbb, 0xf9, 0x02, 0xe0, 0xd1, 0x43, 0xd2, + 0xe0, 0x68, 0xd0, 0x19, 0x8f, 0x89, 0x51, 0x74, 0xa3, 0x6f, 0x0a, 0x13, 0x1f, 0xcb, 0x7d, 0x79, 0x0f, 0xfa, 0x99, 0x66, 0x2f, 0x37, 0x86, 0xe6, 0xbe, 0xe8, 0x6b, 0x56, 0x3e, 0x38, 0x25, 0x91, + 0x4d, 0x3b, 0xbb, 0xab, 0xe7, 0xbe, 0x5d, 0x3a, 0xa4, 0x58, 0x72, 0xa7, 0xca, 0x5c, 0x90, 0xea, 0xde, 0x51, 0xd8, 0xb4, 0x3f, 0xca, 0xe0, 0x91, 0x2c, 0x6c, 0xe8, 0xa4, 0xf8, 0xf1, 0x41, 0x88, + 0x1a, 0x5d, 0x66, 0xc1, 0x15, 0xb2, 0x3e, 0xea, 0xbb, 0x40, 0xed, 0x48, 0x04, 0x5f, 0xb8, 0x4e, 0xc4, 0x3b, 0x7b, 0x8b, 0x5d, 0xd3, 0x64, 0x1c, 0x57, 0xf2, 0x5c, 0x7b, 0xfc, 0xcc, 0x7c, 0xfd, + 0x02, 0xe7, 0x54, 0x39, 0x49, 0x79, 0xae, 0x9a, 0xfd, 0x97, 0x87, 0xfb, 0x9e, 0x0c, 0x94, 0xd6, 0x66, 0x9a, 0x46, 0x8e, 0x91, 0x8c, 0x52, 0x33, 0x70, 0x6e, 0xb6, 0x5b, 0x7d, 0xac, 0xa7, 0xed, + 0x27, 0xe8, 0x57, 0x32, 0xbd, 0xbb, 0x37, 0xb8, 0xab, 0xed, 0xf4, 0x60, 0xac, 0xb8, 0x65, 0x9c, 0x04, 0x98, 0xa1, 0x9e, 0xba, 0x80, 0x38, 0x70, 0x9d, 0xb6, 0xcf, 0x6c, 0xc9, 0x68, 0xab, 0x3d, + 0xcf, 0x29, 0xb8, 0x65, 0x02, 0x4e, 0x5f, 0x6d, 0xe6, 0x56, 0xef, 0x12, 0x56, 0x50, 0xef, 0xec, 0xb6, 0x71, 0x70, 0x7d, 0xc1, 0xba, 0x47, 0x2d, 0xe7, 0x30, 0x07, 0x27, 0x99, 0x04, 0x9e, 0xc2, + 0xcc, 0xca, 0xa5, 0x26, 0x3a, 0x1a, 0x1e, 0x0a, 0x49, 0xce, 0x0f, 0x8f, 0x1b, 0x8c, 0x77, 0xea, 0x70, 0x3e, 0x47, 0xb9, 0x1f, 0xab, 0x91, 0xf8, 0xc7, 0x02, 0xb9, 0xef, 0x5b, 0x32, 0x7c, 0xcd, + 0x13, 0xc8, 0x63, 0x62, 0xf6, 0x19, 0xee, 0x85, 0x1b, 0x9e, 0x57, 0x67, 0x9f, 0xfb, 0x00, 0x51, 0x9b, 0x94, 0x75, 0x5b, 0x9d, 0x74, 0x77, 0xad, 0x11, 0xa4, 0x58, 0x74, 0x11, 0xcd, 0x4f, 0x24, + 0xa0, 0xce, 0x92, 0x09, 0xa4, 0x43, 0xe3, 0x63, 0xd6, 0x26, 0x55, 0xb6, 0xa5, 0xe8, 0x18, 0xe6, 0xc0, 0x1d, 0x3f, 0x83, 0x7a, 0xc1, 0xed, 0x5d, 0x7e, 0xbd, 0x07, 0x69, 0xd5, 0x00, 0x89, 0xb5, + 0x5e, 0x06, 0x90, 0x61, 0x65, 0x6c, 0xc0, 0x88, 0xd0, 0x6a, 0x06, 0x9f, 0x76, 0x84, 0x6e, 0xf3, 0x11, 0x8d, 0xff, 0xb0, 0x22, 0xfb, 0x9f, 0x22, 0x48, 0x5a, 0x38, 0xaf, 0xfe, 0xb4, 0x1b, 0xb2, + 0xf4, 0x41, 0x61, 0xfa, 0x06, 0xf6, 0x95, 0x2e, 0xaf, 0x37, 0x46, 0xc8, 0xc0, 0x1e, 0x78, 0xb2, 0x1c, 0x9c, 0xa2, 0x86, 0x9f, 0x86, 0x53, 0xf8, 0xb0, 0x6c, 0xa7, 0x66, 0x91, 0x8e, 0xb9, 0xb5, + 0x09, 0x58, 0x75, 0x58, 0x17, 0xe1, 0x54, 0x15, 0x3a, 0xee, 0x44, 0x4e, 0xd1, 0x54, 0x18, 0xe3, 0x27, 0xba, 0x30, 0xf1, 0xf4, 0x68, 0x85, 0xe5, 0x7a, 0x82, 0xb7, 0xdc, 0xc4, 0xb0, 0x2d, 0x2d, + 0x4d, 0x09, 0xf2, 0xb8, 0x2f, 0x40, 0x00, 0x9d, 0xcf, 0xba, 0xad, 0x87, 0xc2, 0x28, 0xd6, 0xfb, 0x44, 0xf1, 0xb8, 0x34, 0x7d, 0x7f, 0x62, 0xfb, 0x47, 0x48, 0x66, 0x1b, 0x95, 0x73, 0x4f, 0xb4, + 0x3e, 0x92, 0x35, 0xf7, 0x1e, 0xf4, 0x85, 0x62, 0x6f, 0x6e, 0x0c, 0xcd, 0x9d, 0x53, 0xb6, 0xd1, 0x74, 0x87, 0x23, 0x58, 0x9b, 0x4a, 0x10, 0x65, 0xa4, 0xfa, 0xac, 0xf7, 0x50, 0x50, 0x27, 0x2c, + 0x8f, 0x3e, 0x80, 0xac, 0xaa, 0xb1, 0x9c, 0x04, 0x32, 0x86, 0x2c, 0x40, 0xdb, 0x70, 0x95, 0x63, 0x15, 0xb2, 0x6c, 0x11, 0x19, 0x41, 0x51, 0xba, 0xda, 0x6a, 0x71, 0x5b, 0xef, 0xd3, 0x03, 0xc9, + 0xf3, 0xd1, 0x78, 0x62, 0x8a, 0x8b, 0xe8, 0x84, 0xc4, 0xdd, 0x06, 0xe4, 0xf1, 0x3e, 0x84, 0xee, 0xd9, 0x2d, 0xff, 0x65, 0xf7, 0x97, 0x73, 0xaa, 0xbe, 0x29, 0x40, 0x7c, 0xac, 0xf7, 0xc8, 0x2b, + 0xd8, 0x0b, 0x91, 0xae, 0x8b, 0x21, 0xbd, 0x47, 0xe0, 0x51, 0xbe, 0x68, 0x27, 0x0a, 0xec, 0xc8, 0xd4, 0x84, 0xdc, 0xb9, 0x9c, 0xe1, 0xd5, 0x4e, 0xae, 0x59, 0xd4, 0xb1, 0x07, 0xd6, 0x8b, 0xbf, + 0x85, 0xe2, 0xe1, 0xd1, 0xd6, 0x72, 0xe4, 0xd6, 0x51, 0xd4, 0xfa, 0x76, 0xe5, 0x8d, 0xce, 0x4d, 0xdd, 0xb3, 0xf4, 0xb6, 0xe1, 0x8d, 0x3e, 0xe6, 0xd1, 0xfd, 0xfa, 0x1d, 0x17, 0x74, 0x7d, 0xf5, + 0xcb, 0xb9, 0x2d, 0xd7, 0x00, 0x69, 0xd4, 0x77, 0x71, 0x8c, 0x03, 0x35, 0x50, 0x4e, 0xca, 0xad, 0xda, 0x4d, 0xe9, 0x5c, 0x30, 0x9c, 0x60, 0x8f, 0x4e, 0x67, 0x8d, 0x37, 0x59, 0x59, 0xd1, 0xca, + 0xf6, 0xfb, 0x83, 0xb1, 0x54, 0x6a, 0x8e, 0xa1, 0x50, 0x99, 0x0f, 0x4c, 0x32, 0xd9, 0xd6, 0xf3, 0xc4, 0xb6, 0x27, 0xdc, 0xbc, 0x81, 0xbc, 0x10, 0x58, 0x1d, 0xc8, 0xf1, 0x9a, 0x89, 0x4a, 0xd5, + 0x59, 0x61, 0x8a, 0x73, 0x24, 0xd8, 0x3d, 0xa1, 0x49, 0x7f, 0x93, 0xb9, 0x07, 0x1a, 0x65, 0x47, 0x27, 0x71, 0x0a, 0xa3, 0x4a, 0x8b, 0xd1, 0x73, 0x9e, 0xef, 0x37, 0xd2, 0x03, 0x7e, 0x08, 0xe7, + 0x9f, 0x5f, 0x71, 0xc1, 0xf8, 0xe7, 0xfb, 0x97, 0x18, 0xdb, 0x00, 0x84, 0x07, 0x25, 0x1b, 0x74, 0x74, 0x84, 0x76, 0xbe, 0xc6, 0x4a, 0xc0, 0xa6, 0xd4, 0xec, 0x78, 0xdc, 0xb2, 0x1b, 0x4b, 0x3c, + 0x19, 0x9a, 0xca, 0x97, 0xd9, 0xca, 0xce, 0xa2, 0x99, 0xb2, 0x5f, 0xd0, 0x4d, 0x0e, 0xfb, 0xfa, 0x71, 0xe1, 0x84, 0xce, 0x04, 0xe2, 0x61, 0x82, 0xcc, 0x9d, 0x9a, 0x22, 0xac, 0x5e, 0x32, 0x4e, + 0x8e, 0x8d, 0xe6, 0xa0, 0xd2, 0xd7, 0x2d, 0x54, 0xb6, 0x3c, 0xe4, 0x17, 0x3c, 0x35, 0x30, 0x1b, 0xe1, 0xbf, 0x83, 0xc1, 0xf5, 0x8d, 0xf0, 0xc1, 0x1e, 0x0b, 0xa1, 0x96, 0xa3, 0x57, 0xc9, 0x73, + 0x16, 0x3b, 0xd8, 0xfd, 0x70, 0xe9, 0x13, 0x25, 0xf1, 0x39, 0x54, 0xad, 0xaa, 0xf1, 0x6e, 0xb6, 0x88, 0xc5, 0x7c, 0x9a, 0xf0, 0x63, 0xc4, 0x9b, 0x13, 0xe3, 0x0c, 0xc9, 0xad, 0x15, 0x3b, 0xb3, + 0xeb, 0x14, 0xab, 0xf4, 0x9a, 0x5e, 0xef, 0x40, 0x8e, 0x10, 0xa4, 0x06, 0x3c, 0x7a, 0x5e, 0x87, 0x42, 0x29, 0x8e, 0xd7, 0xae, 0xe1, 0x9e, 0x96, 0x20, 0x6f, 0x73, 0x24, 0xcd, 0xf3, 0x25, 0xb2, + 0x72, 0x8b, 0x84, 0xc2, 0x77, 0xfc, 0xaa, 0x63, 0xc8, 0xb1, 0x72, 0x6f, 0xeb, 0x7c, 0x5b, 0x8d, 0xfa, 0x2a, 0x9b, 0x9f, 0xe7, 0x0f, 0xfd, 0x94, 0xae, 0x3f, 0x11, 0x7a, 0x89, 0x73, 0x34, 0x2a, + 0xbf, 0x71, 0x46, 0xbd, 0x53, 0xdc, 0x4a, 0xc1, 0x43, 0x1e, 0x55, 0xdc, 0xef, 0x80, 0x5f, 0x68, 0xf3, 0xee, 0xd6, 0x39, 0xa8, 0x30, 0x40, 0x79, 0xdb, 0xf9, 0xb2, 0x31, 0x0a, 0xde, 0x68, 0xb5, + 0x72, 0x66, 0x0a, 0x53, 0x67, 0xa9, 0x92, 0x3d, 0xd3, 0x53, 0x8b, 0x6a, 0x49, 0x5b, 0x36, 0x42, 0x1d, 0x6a, 0xb7, 0xae, 0x67, 0xbd, 0x07, 0xcd, 0xa9, 0x4c, 0xe0, 0x82, 0xe5, 0x3a, 0x39, 0x40, + 0xd4, 0xb4, 0x21, 0xcb, 0x83, 0x86, 0xd4, 0x33, 0x5c, 0xc9, 0x24, 0xb1, 0xf5, 0x1d, 0xc6, 0x11, 0xd9, 0x13, 0x7b, 0x60, 0x54, 0xd5, 0xad, 0x49, 0x5d, 0x57, 0xee, 0x9d, 0x88, 0xfe, 0xcb, 0x6e, + 0x9e, 0xa4, 0x8e, 0xcd, 0x73, 0x22, 0xd2, 0x57, 0xb4, 0x22, 0x1f, 0xd5, 0x4c, 0x17, 0xa8, 0x57, 0x22, 0x9d, 0xaf, 0xcf, 0x8d, 0x71, 0x07, 0x08, 0x43, 0x0c, 0x9e, 0xf8, 0x6e, 0x78, 0x24, 0x1c, + 0x6a, 0xd7, 0x45, 0xdb, 0xcc, 0xae, 0x76, 0x99, 0xc3, 0xef, 0xd7, 0x79, 0xb3, 0x1d, 0xb3, 0xfb, 0x7e, 0x57, 0x55, 0x5c, 0xc3, 0xca, 0x53, 0x12, 0x83, 0x81, 0x2c, 0xd1, 0x29, 0x46, 0x68, 0x20, + 0x08, 0xc2, 0xd6, 0x32, 0x8f, 0xa1, 0xd2, 0x6a, 0x33, 0x8d, 0x56, 0xb4, 0x35, 0x6f, 0x84, 0x8c, 0x10, 0x74, 0x55, 0x57, 0xc6, 0x91, 0x39, 0xd7, 0x0e, 0xa7, 0x53, 0x72, 0x6f, 0x0b, 0xdd, 0xdf, + 0x02, 0xc3, 0x86, 0x6b, 0xbd, 0x7e, 0xed, 0x5d, 0xdb, 0x95, 0x7c, 0x1c, 0xad, 0xef, 0xac, 0xd7, 0x77, 0xb7, 0xce, 0x2a, 0x87, 0xbc, 0x8f, 0xe4, 0x10, 0x56, 0xa0, 0x85, 0xdc, 0xf3, 0xeb, 0x94, + 0xd4, 0xa3, 0xc3, 0xc2, 0xed, 0xe5, 0x1a, 0x41, 0x45, 0x8f, 0x58, 0xfb, 0x8b, 0x99, 0x51, 0x1e, 0x33, 0x93, 0xd6, 0x48, 0xc2, 0xc9, 0xdd, 0x99, 0xce, 0xe4, 0x2d, 0x87, 0x61, 0xca, 0x02, 0x5b, + 0xed, 0xc6, 0xcd, 0xf8, 0xb0, 0xd0, 0x61, 0x7b, 0xcb, 0xd3, 0x7a, 0x3f, 0xf1, 0x76, 0x63, 0x7a, 0xeb, 0x71, 0x2e, 0x1f, 0xca, 0x58, 0x66, 0xab, 0x78, 0x58, 0xdc, 0xab, 0x4a, 0xf8, 0xef, 0xad, + 0x84, 0xb2, 0xc8, 0xf0, 0xcf, 0xbe, 0x99, 0x9b, 0x34, 0x7f, 0xf0, 0x84, 0xf9, 0x02, 0xf8, 0x42, 0xef, 0x97, 0xe5, 0xd9, 0x01, 0x34, 0x60, 0x43, 0x75, 0x4d, 0x28, 0x77, 0xa7, 0x78, 0xb6, 0x62, + 0x45, 0x09, 0xcb, 0x04, 0x6d, 0x12, 0x2f, 0xe7, 0x38, 0xc3, 0x4a, 0x42, 0xa4, 0x2d, 0xb7, 0x38, 0x6f, 0x88, 0x82, 0x96, 0xe2, 0xa0, 0xc5, 0xdb, 0x3b, 0xdd, 0x56, 0x9b, 0x52, 0x87, 0xfd, 0x74, + 0xc9, 0xa6, 0x09, 0x3f, 0x67, 0xd2, 0x72, 0x15, 0xad, 0x55, 0x96, 0x8a, 0x5a, 0xa5, 0x03, 0xcd, 0x65, 0xbf, 0x0e, 0xac, 0x96, 0x32, 0x7a, 0x12, 0x05, 0x66, 0x7f, 0x7f, 0x43, 0x0d, 0xd6, 0x29, + 0xe7, 0x46, 0xc6, 0xdf, 0x6c, 0xa4, 0x9f, 0xcf, 0x0b, 0x7d, 0x06, 0x7a, 0x41, 0xe8, 0xa5, 0xef, 0xf5, 0x19, 0xd2, 0x7d, 0x64, 0x36, 0xd1, 0x4a, 0x85, 0xc9, 0xad, 0x90, 0x63, 0x58, 0xda, 0x36, + 0x38, 0x23, 0xc9, 0xe8, 0x24, 0x87, 0x4c, 0x69, 0xc3, 0x9a, 0x14, 0x10, 0xce, 0x50, 0x65, 0xa5, 0x23, 0xae, 0xaf, 0x0b, 0xa2, 0x5a, 0xf5, 0xd5, 0x81, 0xc5, 0x7d, 0x68, 0xd2, 0x4f, 0xf4, 0xd3, + 0x6c, 0xda, 0x8a, 0x38, 0x95, 0x33, 0xa2, 0x5a, 0x9d, 0xec, 0xb1, 0xbc, 0x17, 0xc1, 0x3d, 0x2e, 0xf9, 0x09, 0xdc, 0x06, 0x93, 0x7c, 0x76, 0xf8, 0x5b, 0x1b, 0xe7, 0xd7, 0x37, 0x27, 0xf5, 0xff, + 0xb2, 0x9b, 0xa5, 0xf4, 0x8c, 0xc2, 0xb1, 0x2f, 0x71, 0x94, 0xd7, 0x54, 0xd8, 0x3f, 0x7a, 0xcc, 0xff, 0xe2, 0x15, 0x17, 0x7a, 0x7f, 0xf1, 0xc3, 0xd0, 0x63, 0x7f, 0x99, 0x0b, 0x88, 0x32, 0xad, + 0x61, 0x10, 0xea, 0x88, 0xba, 0xd1, 0xba, 0x6d, 0x35, 0x11, 0xfb, 0xce, 0x63, 0x82, 0xc9, 0x36, 0xe2, 0x2c, 0x67, 0x96, 0xae, 0x57, 0x4b, 0x95, 0x52, 0x69, 0x56, 0xa1, 0xad, 0xc6, 0xb7, 0x40, + 0xc9, 0x2e, 0x75, 0x28, 0x64, 0x15, 0x1a, 0xe5, 0xd8, 0x0e, 0x5d, 0x28, 0xec, 0x4c, 0x5f, 0xf8, 0x1c, 0x88, 0xb6, 0x00, 0xc3, 0x81, 0x8a, 0x64, 0x6e, 0x38, 0xc1, 0xf6, 0xee, 0x59, 0x0e, 0x3f, + 0xf3, 0xa5, 0xfe, 0x33, 0xe4, 0xfc, 0x7e, 0xae, 0xdb, 0x83, 0xca, 0xee, 0x35, 0x57, 0xe9, 0xf9, 0x7a, 0xa8, 0x7a, 0xab, 0x58, 0x44, 0xd1, 0x7a, 0xbf, 0x09, 0x1c, 0x22, 0x75, 0x37, 0x2a, 0x19, + 0x21, 0xa8, 0x15, 0x4c, 0xc5, 0xb5, 0x01, 0xd1, 0x47, 0x93, 0x3c, 0x45, 0x4c, 0x3e, 0x27, 0x82, 0x39, 0xee, 0x04, 0x44, 0xbd, 0xd9, 0xa3, 0xc8, 0x2e, 0x52, 0x37, 0xa8, 0xb0, 0xda, 0xf8, 0xc7, + 0xca, 0x98, 0x3b, 0x9c, 0x50, 0xd3, 0x6e, 0xea, 0x59, 0x96, 0x7c, 0x68, 0x16, 0xbe, 0xbe, 0x76, 0x45, 0x31, 0x11, 0x0f, 0x4a, 0x75, 0x4f, 0xe4, 0xfd, 0xf7, 0x56, 0x6f, 0x97, 0xca, 0xaa, 0x6f, + 0x48, 0xfc, 0x40, 0x3e, 0xcc, 0x33, 0xd4, 0x2b, 0x89, 0x2f, 0xad, 0xc6, 0x86, 0xe6, 0xc1, 0xb4, 0x7e, 0xe0, 0x19, 0xf2, 0xf6, 0x98, 0x37, 0x5e, 0x0c, 0x42, 0xba, 0xcd, 0x58, 0x9a, 0xa0, 0x57, + 0x74, 0x74, 0xb0, 0x57, 0xb3, 0xcc, 0x92, 0xa7, 0x3b, 0x5c, 0xe1, 0x95, 0xfa, 0xa0, 0x6d, 0xd2, 0x1d, 0x49, 0x63, 0x8a, 0x20, 0xda, 0x0a, 0x70, 0xcc, 0x76, 0x84, 0xdc, 0xa7, 0xa4, 0x89, 0xed, + 0x11, 0x4e, 0x89, 0xc0, 0x34, 0x23, 0xe6, 0xf9, 0x81, 0xa2, 0x31, 0x46, 0x6f, 0x1b, 0xda, 0x35, 0xfe, 0x96, 0x20, 0xfe, 0x54, 0x7c, 0xf6, 0xf3, 0xa3, 0xd6, 0x3f, 0x47, 0xde, 0xaa, 0xcb, 0x9e, + 0x65, 0xe2, 0x37, 0xf6, 0xcb, 0x63, 0x1e, 0x93, 0x37, 0xb0, 0x2f, 0x94, 0x7e, 0x73, 0xe3, 0xd2, 0x64, 0x72, 0x80, 0x15, 0xb3, 0x59, 0xe6, 0x47, 0x96, 0xf3, 0x55, 0xbd, 0x59, 0x67, 0xc6, 0x4c, + 0x47, 0xeb, 0x9d, 0x45, 0x85, 0xdc, 0x66, 0x8d, 0x01, 0x18, 0x33, 0xdd, 0x45, 0xd3, 0xc4, 0xaf, 0x25, 0x9e, 0xb4, 0x14, 0x50, 0x99, 0x32, 0x90, 0x14, 0x91, 0x33, 0x12, 0xea, 0xe6, 0x2e, 0x97, + 0x79, 0xa8, 0xc5, 0x0b, 0x0e, 0x60, 0xd1, 0x55, 0x6a, 0xf8, 0xc7, 0x06, 0x98, 0xce, 0xfa, 0xdd, 0x72, 0xe5, 0x59, 0xc8, 0xa4, 0x12, 0x89, 0x81, 0x3e, 0x12, 0xa3, 0x31, 0xfc, 0x4b, 0xac, 0xe5, + 0xcd, 0x5f, 0xfe, 0x4a, 0xe7, 0x57, 0x03, 0xe4, 0x7e, 0x7c, 0xeb, 0x4d, 0xf7, 0xf2, 0x5f, 0xff, 0xfe, 0xbe, 0x57, 0xf9, 0x5f, 0x7f, 0xfd, 0xba, 0x76, 0x9f, 0x78, 0x66, 0x9f, 0xff, 0xeb, 0x3d, + 0x7f, 0xfd, 0x9f, 0x2e, 0x42, 0xea, 0xc4, 0x3f, 0x3b, 0x23, 0xaf, 0x55, 0x07, 0x67, 0xd6, 0xf9, 0x8a, 0xd3, 0xa0, 0x47, 0x2d, 0xe5, 0x4f, 0x2f, 0xb8, 0xb0, 0xdb, 0xa7, 0xdb, 0xe7, 0x64, 0xe0, + 0x01, 0x3c, 0x17, 0x26, 0xa7, 0x39, 0x92, 0x63, 0xca, 0x04, 0xad, 0xa9, 0xb2, 0x92, 0xe7, 0x1d, 0xb3, 0x5f, 0x4e, 0x44, 0xfb, 0x34, 0x8b, 0x1b, 0x7c, 0xaa, 0xfb, 0xb2, 0x65, 0x47, 0x0b, 0x83, + 0x91, 0x34, 0xc6, 0xdc, 0xba, 0xcb, 0xce, 0x00, 0x44, 0x2f, 0xcd, 0x84, 0xb4, 0xe2, 0xa5, 0xa2, 0xac, 0xc6, 0x5e, 0x5e, 0xe7, 0x35, 0xa6, 0x67, 0xf5, 0xca, 0x9c, 0x5a, 0x20, 0xb5, 0x25, 0xe2, + 0xa3, 0x76, 0xdc, 0xcc, 0x36, 0xf7, 0xc2, 0x32, 0xc3, 0xcb, 0xed, 0xfe, 0x36, 0xf1, 0x7e, 0x9a, 0xb4, 0x5d, 0x8e, 0x5a, 0xc7, 0x08, 0x0b, 0xc7, 0xfd, 0xd3, 0xb6, 0xda, 0x15, 0xec, 0x85, 0x5c, + 0xd7, 0xc5, 0x50, 0x9b, 0x2c, 0xb7, 0xaa, 0xb2, 0xe6, 0xf5, 0x78, 0x21, 0x41, 0x40, 0xb3, 0xdd, 0xae, 0xdd, 0x74, 0xdf, 0x74, 0x33, 0x07, 0x01, 0xe6, 0x5b, 0xb6, 0x49, 0x62, 0x1d, 0x71, 0xfa, + 0x5d, 0x9d, 0xc1, 0xdb, 0x71, 0xe9, 0xd0, 0x40, 0xd5, 0x4e, 0x26, 0x8e, 0x6f, 0x44, 0x04, 0xcb, 0xfa, 0xa8, 0x60, 0x21, 0xab, 0x99, 0xe5, 0x12, 0x40, 0xde, 0x23, 0xb3, 0xf1, 0x26, 0x09, 0xb4, + 0x32, 0xa4, 0x4e, 0xde, 0x6a, 0x6b, 0xdc, 0x2d, 0xb0, 0xff, 0xaf, 0x6f, 0x93, 0x39, 0xa7, 0xdb, 0xb1, 0xce, 0xc7, 0x7c, 0x3a, 0xce, 0xe9, 0x12, 0xe1, 0x74, 0x4e, 0xce, 0x90, 0xea, 0x4a, 0x78, + 0x44, 0x6c, 0x9a, 0xde, 0x16, 0x4e, 0x7b, 0x13, 0xf4, 0x15, 0xc7, 0x9b, 0x5a, 0xe5, 0xcc, 0xaa, 0x0e, 0x3d, 0x55, 0x02, 0x1e, 0xf3, 0xc3, 0xcc, 0xa5, 0xe0, 0x49, 0xf8, 0x85, 0x4e, 0x52, 0xde, + 0xf8, 0xa4, 0xc7, 0x52, 0xe2, 0x5f, 0xa0, 0x9e, 0x47, 0x48, 0x5f, 0xaf, 0x87, 0xa6, 0xc2, 0xcb, 0xf6, 0x52, 0x71, 0x23, 0x8b, 0x45, 0x2d, 0xa5, 0x5f, 0xf9, 0xeb, 0x5c, 0x3a, 0x96, 0x93, 0x1a, + 0x22, 0x66, 0x9b, 0x9a, 0x56, 0xec, 0xc5, 0x52, 0x84, 0x4c, 0xe7, 0x60, 0x6e, 0x3c, 0x4e, 0xc0, 0x42, 0xc2, 0xc8, 0x8e, 0xcb, 0xca, 0x77, 0xad, 0x74, 0x52, 0xed, 0x68, 0xd3, 0x3a, 0x89, 0xd9, + 0x61, 0x5c, 0x65, 0x53, 0x24, 0x9c, 0xac, 0x89, 0xad, 0xd9, 0x1f, 0xb1, 0x89, 0x51, 0x97, 0x2a, 0xb8, 0x59, 0xdd, 0x60, 0xbb, 0x6f, 0x11, 0xd3, 0x19, 0xf1, 0x2d, 0xb3, 0x0c, 0xfd, 0x0d, 0x63, + 0x0f, 0x78, 0xbf, 0xaf, 0x40, 0x2f, 0x58, 0x79, 0xba, 0x1a, 0x5d, 0x00, 0xdd, 0x47, 0x4a, 0x1a, 0xae, 0x39, 0x52, 0xd4, 0xb4, 0x25, 0x79, 0x28, 0x04, 0x5a, 0x0c, 0x51, 0x70, 0xab, 0x15, 0x49, + 0x8d, 0xf9, 0x1a, 0xdd, 0x89, 0x21, 0x80, 0xe0, 0x49, 0xae, 0x61, 0x7e, 0xbc, 0x45, 0x92, 0xac, 0x6e, 0x76, 0x87, 0x69, 0x9c, 0x82, 0x12, 0xab, 0xa7, 0x79, 0xab, 0x87, 0x07, 0x63, 0x31, 0x0d, + 0xd1, 0x60, 0xdf, 0x8c, 0xc5, 0x9d, 0xb8, 0x60, 0x8f, 0xac, 0x67, 0xf0, 0x62, 0x97, 0x8c, 0xb7, 0xf4, 0xe3, 0x76, 0xb7, 0x51, 0x1c, 0xdf, 0x4f, 0xec, 0x7c, 0x37, 0xe1, 0xd2, 0x29, 0xb3, 0xc2, + 0x8f, 0x8d, 0x5f, 0xdf, 0xd4, 0xcf, 0x98, 0xef, 0xc6, 0x4c, 0x9e, 0xe7, 0xbe, 0x3f, 0xe3, 0xfb, 0xe9, 0xb7, 0x67, 0xfc, 0xfc, 0x0e, 0x86, 0x88, 0xcf, 0xf3, 0xf0, 0xc0, 0xbb, 0x09, 0x78, 0x8f, + 0xb0, 0xf1, 0x0b, 0xdc, 0xe7, 0x59, 0xe8, 0x6f, 0x92, 0xf0, 0x06, 0xb0, 0xf2, 0xd6, 0xdf, 0x34, 0x20, 0xb5, 0xcf, 0xf4, 0x5a, 0x35, 0x1b, 0x7e, 0xbb, 0xae, 0x76, 0x53, 0x85, 0xf2, 0x58, 0xb7, + 0xd0, 0xd5, 0x23, 0x18, 0x73, 0x60, 0xb2, 0x07, 0x4d, 0x2c, 0x85, 0x26, 0x07, 0x73, 0x7b, 0xaa, 0x61, 0x65, 0x21, 0x6d, 0x78, 0xbb, 0x5d, 0x89, 0x93, 0x45, 0xc7, 0x4b, 0x1a, 0xb0, 0x5f, 0x6c, + 0x44, 0xbc, 0x29, 0x78, 0x0d, 0xf5, 0xa9, 0xbc, 0xca, 0x67, 0x9d, 0x67, 0x6f, 0xb6, 0xca, 0xd0, 0x1a, 0x68, 0xd3, 0x3f, 0x5e, 0x1c, 0x98, 0xbf, 0xaf, 0xb3, 0xef, 0xe9, 0xdf, 0xc3, 0x1c, 0x43, + 0xaf, 0xa3, 0x18, 0x47, 0x4e, 0xe3, 0x24, 0x23, 0xd3, 0xa9, 0x2a, 0xa7, 0xb8, 0x57, 0x63, 0x8e, 0x3e, 0xb4, 0x1d, 0xbe, 0x79, 0xd3, 0x33, 0xc6, 0x6f, 0xfd, 0x7e, 0x6e, 0x8b, 0x3f, 0x60, 0xe7, + 0x9c, 0xba, 0x59, 0xdb, 0x79, 0x45, 0x0a, 0x2e, 0xd9, 0xd4, 0x25, 0xe6, 0x9e, 0x83, 0xf8, 0x3d, 0x22, 0x58, 0x5a, 0x1a, 0x20, 0x65, 0x94, 0x0a, 0xa5, 0x5a, 0x80, 0x5a, 0xc9, 0xca, 0xd3, 0x15, + 0x98, 0xfa, 0x9b, 0x89, 0x6b, 0x08, 0x5e, 0x84, 0x8b, 0x82, 0x9b, 0x01, 0x81, 0x64, 0x33, 0xba, 0x2c, 0x49, 0xd0, 0x62, 0xa9, 0x0a, 0x3d, 0x47, 0xf7, 0x0b, 0x7d, 0x46, 0x46, 0x3e, 0x0d, 0x87, + 0x1e, 0x72, 0xc3, 0xd4, 0xb8, 0x83, 0xd4, 0x61, 0x03, 0xfc, 0xa1, 0xdf, 0x8f, 0x89, 0x96, 0xe1, 0x03, 0xfc, 0xcf, 0x6f, 0x18, 0x80, 0x39, 0xd3, 0x9c, 0x70, 0xb8, 0x3d, 0x39, 0x28, 0xf8, 0x8e, + 0xe2, 0x2d, 0xd6, 0xf3, 0x6a, 0x8f, 0xe4, 0x96, 0x14, 0xc5, 0x69, 0xb5, 0x8a, 0xe6, 0xe5, 0x02, 0x3d, 0x40, 0xbd, 0xa8, 0xcf, 0x56, 0xae, 0xce, 0x72, 0x56, 0xa6, 0xfa, 0x9c, 0x02, 0x2e, 0x4f, + 0x7d, 0x48, 0x20, 0xf4, 0xb8, 0x28, 0x0d, 0x13, 0x8c, 0xd7, 0x3e, 0x27, 0x55, 0x3e, 0xdd, 0xae, 0x37, 0x00, 0x85, 0xe1, 0xf2, 0xc6, 0x41, 0xf7, 0x3f, 0xce, 0xad, 0xbd, 0x4e, 0xfe, 0x3d, 0x1f, + 0x12, 0x5e, 0x07, 0x14, 0xb7, 0x7e, 0xe5, 0xa5, 0xf5, 0x65, 0x2e, 0xf0, 0xed, 0xf9, 0xd0, 0xf0, 0x43, 0x31, 0xca, 0x41, 0x6f, 0x7c, 0xc1, 0xed, 0x9d, 0xe7, 0x86, 0x95, 0x83, 0x26, 0xa6, 0x03, + 0x47, 0x4b, 0xa3, 0xda, 0xf4, 0x3d, 0x40, 0xb5, 0x19, 0x3c, 0x9b, 0x40, 0x55, 0xd8, 0x16, 0xda, 0x32, 0x62, 0x7f, 0x88, 0xae, 0xd0, 0x4f, 0xec, 0x51, 0x7a, 0xcb, 0x8e, 0x24, 0x1e, 0x72, 0x27, + 0x5c, 0x61, 0x82, 0xa3, 0xe7, 0xab, 0xf3, 0xa4, 0xcc, 0x01, 0xae, 0x04, 0xdb, 0xda, 0xc2, 0x75, 0x04, 0xd0, 0x55, 0xec, 0x4c, 0x69, 0x7c, 0x07, 0x9c, 0x10, 0x0a, 0x74, 0x3c, 0xfe, 0x68, 0xd3, + 0x31, 0x2b, 0x18, 0x28, 0x5f, 0x36, 0xd3, 0x5d, 0xd5, 0xc7, 0x68, 0xd3, 0x8d, 0x59, 0x91, 0x94, 0x37, 0x59, 0xd5, 0x30, 0x53, 0xa0, 0xc2, 0x30, 0x75, 0xaf, 0x19, 0x4a, 0xb0, 0x1b, 0xcb, 0x56, + 0x91, 0xcd, 0x9c, 0x59, 0x34, 0xa1, 0xd4, 0x49, 0x51, 0x2b, 0x32, 0x86, 0x13, 0xde, 0xdf, 0x34, 0xf3, 0x07, 0x3b, 0xc8, 0x23, 0xa7, 0xb9, 0x95, 0xe3, 0xf0, 0xd8, 0x16, 0x7d, 0x02, 0x08, 0x8e, + 0xce, 0xff, 0x1b, 0xba, 0x05, 0x01, 0x73, 0x87, 0xd4, 0x1c, 0xc6, 0xe2, 0xfc, 0x9c, 0x25, 0x3d, 0x30, 0x41, 0x9d, 0xc6, 0xda, 0x82, 0xa5, 0x14, 0x2d, 0xb5, 0x49, 0xb6, 0xc8, 0x88, 0x2e, 0xa6, + 0x44, 0x75, 0x89, 0x3b, 0x7b, 0x02, 0x20, 0xc8, 0x69, 0x99, 0x47, 0x20, 0x6f, 0x18, 0x3b, 0x32, 0x5f, 0x8e, 0x99, 0x0a, 0x29, 0x7a, 0x37, 0x35, 0x40, 0x5c, 0x1a, 0xcf, 0xc7, 0xde, 0x69, 0xea, + 0x9f, 0x60, 0x7b, 0x5d, 0x21, 0xa1, 0x74, 0xcb, 0x16, 0x1a, 0xa0, 0x53, 0xb2, 0xc2, 0x89, 0x6a, 0xdb, 0x19, 0xbd, 0xb8, 0x62, 0x3e, 0xcc, 0xf5, 0x3e, 0xf7, 0xb9, 0xb5, 0x3c, 0xc7, 0x0a, 0x9f, + 0x7e, 0xff, 0xff, 0xa0, 0xc7, 0xa6, 0xf8, 0x42, 0xe7, 0x1e, 0xcb, 0x03, 0x08, 0xf4, 0x79, 0x9c, 0xf7, 0x57, 0xc4, 0xc2, 0x2f, 0x04, 0xff, 0x31, 0xb5, 0x3e, 0x40, 0x7f, 0xa2, 0xdc, 0x87, 0x5b, + 0xa3, 0x0b, 0xe8, 0xfb, 0x64, 0xd4, 0x15, 0x64, 0x4a, 0xcf, 0x63, 0xc6, 0x12, 0x15, 0xab, 0x8e, 0x76, 0x3b, 0x9b, 0xa3, 0xc1, 0xbe, 0xe8, 0x9c, 0x80, 0x48, 0xa8, 0x5d, 0xbf, 0x03, 0x5c, 0x61, + 0x6e, 0x0b, 0x55, 0x4c, 0x6c, 0xa7, 0x19, 0xbe, 0x5e, 0xaf, 0x33, 0xae, 0x58, 0x2e, 0xc3, 0x86, 0xb1, 0x59, 0xd4, 0x22, 0x6c, 0xca, 0x46, 0x2c, 0x8f, 0xa5, 0x7d, 0xc0, 0x00, 0x41, 0x7b, 0x4b, + 0x4f, 0x54, 0xbd, 0xf2, 0xcb, 0x30, 0xc9, 0x07, 0xba, 0x58, 0xac, 0x34, 0x0d, 0xfd, 0x8b, 0xa1, 0x06, 0x7d, 0x9c, 0x16, 0xfe, 0xf5, 0x3c, 0xf3, 0x0f, 0x25, 0xd1, 0xa5, 0x53, 0x8d, 0x2e, 0x40, + 0x2e, 0xba, 0xf8, 0x79, 0xac, 0x39, 0x36, 0x68, 0xb4, 0x78, 0xf4, 0x44, 0xea, 0x91, 0x91, 0xd8, 0x23, 0x2b, 0x8d, 0xea, 0xf8, 0xe6, 0x41, 0xe3, 0xb1, 0xdc, 0xdd, 0x4f, 0xd0, 0xcf, 0x54, 0xfa, + 0x70, 0x6f, 0x68, 0x1e, 0x2f, 0xd9, 0x45, 0x5d, 0xe4, 0x94, 0xba, 0x04, 0x6e, 0xf6, 0x08, 0x1d, 0x78, 0xec, 0x34, 0x42, 0x15, 0x37, 0x48, 0x09, 0x5d, 0x23, 0x8f, 0x93, 0x7c, 0x59, 0xe0, 0x33, + 0x72, 0xb3, 0x2a, 0x72, 0x8b, 0x46, 0x1b, 0xd2, 0xed, 0xb7, 0x5d, 0x5c, 0xc1, 0xe3, 0xac, 0x65, 0x15, 0x2a, 0x61, 0x14, 0xad, 0xa4, 0xf2, 0xbe, 0x6f, 0x72, 0xcf, 0x0c, 0xbc, 0x15, 0x2e, 0xe9, + 0x47, 0x62, 0x5d, 0x81, 0x5c, 0x78, 0x6b, 0xae, 0xef, 0x37, 0x08, 0x7b, 0x37, 0xdb, 0xf2, 0x6b, 0x86, 0x7e, 0x88, 0x9f, 0x5f, 0xe1, 0x3e, 0x21, 0xe9, 0x75, 0x35, 0xc2, 0x87, 0x19, 0xb3, 0x15, + 0xe9, 0xb5, 0x74, 0xb6, 0x00, 0xd4, 0xa6, 0x6e, 0x85, 0xa5, 0xd6, 0x86, 0x78, 0xbf, 0xe7, 0xb2, 0xce, 0x5b, 0xe4, 0xfd, 0x11, 0xc9, 0x77, 0x51, 0x18, 0x2d, 0x45, 0x17, 0x8a, 0xf7, 0xa7, 0xf9, + 0xd6, 0x74, 0xd0, 0x59, 0x86, 0xec, 0x7d, 0x47, 0xb7, 0xec, 0x5a, 0x38, 0x04, 0x06, 0x3f, 0x4d, 0x3b, 0x22, 0xa3, 0xeb, 0x79, 0x26, 0xb1, 0x73, 0x75, 0x4e, 0x91, 0x6a, 0xb6, 0x5e, 0x45, 0x42, + 0x4e, 0x3d, 0x7e, 0x04, 0xc9, 0x46, 0x97, 0x6f, 0xf8, 0x75, 0x39, 0x65, 0x7c, 0x39, 0x26, 0xec, 0x0f, 0xa4, 0xbe, 0x45, 0xa9, 0x7d, 0xbb, 0x94, 0x1e, 0xfb, 0x0d, 0x93, 0xbf, 0x91, 0x07, 0x34, + 0xc1, 0x19, 0xe8, 0x99, 0x0c, 0x4f, 0x17, 0xa3, 0x2b, 0x9c, 0xfb, 0x34, 0x68, 0x90, 0x70, 0xca, 0x3a, 0x38, 0x19, 0x39, 0xd6, 0xae, 0x8e, 0x8c, 0xe9, 0xa2, 0x16, 0x76, 0x9b, 0x0e, 0x95, 0x3b, + 0xec, 0xc8, 0xcf, 0x97, 0x84, 0x0e, 0x8b, 0x68, 0xc3, 0xc2, 0x61, 0x71, 0xd4, 0x74, 0xa1, 0x28, 0x25, 0x80, 0x9f, 0xed, 0xe6, 0xdc, 0xfe, 0xb4, 0x0f, 0x2c, 0x6d, 0x53, 0xc2, 0x24, 0xef, 0x99, + 0xfa, 0x7e, 0xee, 0xd8, 0xcc, 0xb2, 0xa1, 0x34, 0x1d, 0xae, 0x9a, 0x00, 0x9f, 0x35, 0xdb, 0x07, 0x58, 0xf4, 0xe9, 0xaf, 0xfe, 0x6d, 0x45, 0x69, 0xe2, 0xd8, 0x8e, 0x73, 0x7b, 0x46, 0x2d, 0xfe, + 0x10, 0x9f, 0xbe, 0x07, 0xfe, 0x82, 0xa5, 0xd7, 0x5b, 0xa3, 0x33, 0xe4, 0x7b, 0x36, 0x15, 0x16, 0x50, 0x60, 0xc2, 0x02, 0x9b, 0xc6, 0x26, 0xb8, 0xe5, 0x36, 0x19, 0x8f, 0x4f, 0x9e, 0x96, 0x2e, + 0xcc, 0xa8, 0x17, 0x7f, 0x3a, 0xe9, 0xeb, 0xfa, 0xfe, 0xaa, 0xa8, 0x93, 0x2b, 0xc7, 0x7d, 0xfd, 0xb9, 0xd8, 0x03, 0x3e, 0xba, 0x0f, 0xb0, 0x5f, 0xbf, 0xf6, 0xf9, 0xce, 0xe8, 0x0c, 0xf7, 0xde, + 0xc7, 0xaa, 0x81, 0x22, 0xa4, 0x3c, 0x2b, 0x8b, 0x98, 0x00, 0xf4, 0x20, 0xb8, 0x3f, 0x6e, 0x3b, 0x40, 0x15, 0xcc, 0x1c, 0xd3, 0xd7, 0x3f, 0xfe, 0xd8, 0xe3, 0x9d, 0xf6, 0x94, 0x8f, 0x75, 0x7a, + 0x7b, 0x03, 0xf7, 0xfc, 0x91, 0x2f, 0xab, 0xa1, 0x1d, 0xde, 0x28, 0x6d, 0xd3, 0x64, 0x0c, 0x43, 0xd5, 0x9d, 0xe7, 0x56, 0x4e, 0x4d, 0x65, 0x8b, 0x46, 0x3a, 0x65, 0x4b, 0x9d, 0xdc, 0x1e, 0x0e, + 0x76, 0xa6, 0xf8, 0x8d, 0x9e, 0xcd, 0x3b, 0xa2, 0x9c, 0x95, 0xe3, 0x7a, 0x25, 0x1f, 0x40, 0xb2, 0x90, 0xe6, 0x46, 0xe3, 0xd8, 0xce, 0x98, 0x32, 0x56, 0x80, 0x1e, 0x76, 0x39, 0x51, 0x67, 0xeb, + 0xd9, 0x9e, 0x07, 0x69, 0x46, 0x25, 0x1a, 0xf1, 0xd0, 0xbb, 0x72, 0xc7, 0x3f, 0x2e, 0x7f, 0x2c, 0xcf, 0x88, 0xc2, 0x37, 0xc2, 0xe7, 0x8d, 0xc6, 0xbc, 0xe1, 0x91, 0x7f, 0x52, 0xc0, 0x8f, 0x88, + 0xa9, 0x7f, 0xd0, 0x31, 0x1d, 0xa5, 0x69, 0x66, 0x3a, 0xc9, 0xcd, 0x99, 0xb0, 0xf0, 0x43, 0xf3, 0x0f, 0x5f, 0xa0, 0x9e, 0x19, 0xe1, 0x7a, 0x7d, 0xd6, 0xd2, 0x03, 0xd8, 0xc0, 0xad, 0x90, 0x4d, + 0x5c, 0xeb, 0xc9, 0xb4, 0x05, 0xa6, 0x4b, 0xc9, 0xdd, 0xe1, 0x71, 0xc6, 0xaa, 0xb5, 0xcd, 0x8e, 0xe5, 0x3e, 0xca, 0x16, 0xb1, 0x47, 0xc6, 0x0a, 0x29, 0x5a, 0x9b, 0x79, 0xec, 0xb8, 0xe5, 0x2a, + 0x52, 0xa9, 0x49, 0x08, 0x29, 0x44, 0x52, 0x4c, 0x26, 0xb6, 0xd5, 0x1e, 0x66, 0x40, 0x4f, 0xf7, 0x16, 0xb4, 0xdd, 0x8f, 0xfb, 0xb9, 0xce, 0xc0, 0x33, 0xf8, 0xa8, 0xb8, 0x9c, 0x5e, 0x2f, 0x07, + 0xb6, 0x38, 0x3e, 0x55, 0xce, 0xd5, 0xfd, 0xfc, 0x7e, 0x02, 0xc9, 0x37, 0x08, 0x7c, 0xd3, 0x07, 0xf0, 0xd6, 0x81, 0xec, 0x01, 0x04, 0x3e, 0x43, 0x7d, 0x42, 0xe0, 0xf3, 0xf5, 0xf9, 0x50, 0x36, + 0x00, 0x81, 0xcb, 0x94, 0xb0, 0x97, 0x10, 0x36, 0x89, 0xb7, 0x41, 0xdd, 0x27, 0xed, 0x72, 0xbb, 0x45, 0x33, 0xc5, 0x51, 0x63, 0x1b, 0xe4, 0x20, 0xd7, 0xdd, 0x45, 0xa1, 0xa6, 0x1d, 0x5b, 0xdd, + 0x07, 0x9c, 0x1c, 0x56, 0x26, 0x71, 0x2e, 0xb5, 0x13, 0x0f, 0x70, 0xf8, 0xf2, 0x20, 0x1e, 0x26, 0xed, 0x81, 0xa6, 0x61, 0x1f, 0x99, 0x19, 0x1e, 0xe6, 0xc1, 0x63, 0x76, 0x3d, 0x39, 0x61, 0xf9, + 0xce, 0x9b, 0x9b, 0xa5, 0x3f, 0xd0, 0x18, 0xed, 0x8c, 0x28, 0xf2, 0xaf, 0xd3, 0x43, 0x1e, 0xeb, 0xac, 0x33, 0xa8, 0xaa, 0x3e, 0x36, 0x42, 0xe7, 0xe2, 0x26, 0xba, 0xc9, 0xb7, 0xe8, 0x03, 0x7d, + 0x49, 0x5e, 0xc1, 0x82, 0xa3, 0x37, 0x8b, 0xd1, 0x19, 0xda, 0x7d, 0xc4, 0x97, 0x94, 0xe2, 0x45, 0x82, 0x43, 0x36, 0x9b, 0x55, 0x1a, 0x4b, 0xde, 0x04, 0xce, 0x67, 0x4e, 0xb4, 0x4e, 0xc3, 0x02, + 0xdc, 0x5a, 0x28, 0x73, 0x14, 0xcc, 0x32, 0x45, 0x13, 0x12, 0x8b, 0xf7, 0x1b, 0x06, 0xe7, 0x77, 0x7a, 0x1b, 0x8e, 0x69, 0x21, 0xd2, 0x5c, 0x4c, 0xdb, 0x18, 0x31, 0x7f, 0x5a, 0xb2, 0x94, 0x07, + 0x1d, 0x3d, 0x12, 0x2d, 0xd6, 0x34, 0x76, 0x6a, 0x5a, 0x79, 0x87, 0x4c, 0xf6, 0x8b, 0xe4, 0xc7, 0x9e, 0xa8, 0xd8, 0xc8, 0xbe, 0xc9, 0xa5, 0xc3, 0x1e, 0xea, 0x33, 0x70, 0x85, 0x79, 0xc6, 0xca, + 0xf9, 0x6a, 0x84, 0x0d, 0xeb, 0x29, 0xe0, 0xd9, 0x02, 0xdc, 0xee, 0x0b, 0xdd, 0x34, 0x11, 0xda, 0x19, 0xcf, 0xfd, 0x79, 0xb0, 0x34, 0x9d, 0x0d, 0xb5, 0x34, 0x57, 0x41, 0x0e, 0xd7, 0x45, 0xc8, + 0x2d, 0x41, 0x7e, 0xb1, 0x01, 0x85, 0x03, 0x46, 0xad, 0x75, 0x58, 0xda, 0x6b, 0x4a, 0x29, 0x8d, 0xf7, 0xf0, 0x1c, 0xee, 0x9b, 0xc3, 0x8c, 0x4b, 0x60, 0x8d, 0x85, 0x08, 0xab, 0x0d, 0xc6, 0xa5, + 0xb8, 0x40, 0x56, 0xa8, 0x12, 0x25, 0x01, 0x7c, 0xd0, 0xee, 0x9d, 0x6f, 0x07, 0x5b, 0x85, 0xff, 0xd9, 0xd2, 0x36, 0x76, 0xd2, 0xf6, 0x06, 0x5d, 0xe8, 0x87, 0xe4, 0xc4, 0x13, 0xc0, 0x27, 0xa2, + 0x38, 0x69, 0x3b, 0xa2, 0x87, 0x49, 0x07, 0x20, 0x35, 0xb7, 0x66, 0x24, 0x4a, 0xb1, 0xec, 0x59, 0xdd, 0xb8, 0x22, 0x10, 0xb7, 0x2e, 0xa4, 0x5c, 0x66, 0xa4, 0x4c, 0xe8, 0x54, 0x2d, 0xa5, 0xc6, + 0xb5, 0x84, 0x9b, 0x02, 0x69, 0xcf, 0xa9, 0x36, 0x6e, 0x25, 0xa0, 0x69, 0xb9, 0x55, 0x06, 0x16, 0x93, 0xd9, 0x14, 0x9b, 0x14, 0xbb, 0x0d, 0x35, 0x29, 0xa7, 0xd2, 0x14, 0x2e, 0x83, 0x54, 0xa7, + 0xb1, 0x15, 0x06, 0x93, 0x1a, 0xab, 0x84, 0xd4, 0xe2, 0x1e, 0x45, 0x6e, 0x0b, 0x8c, 0x7f, 0x3d, 0x8f, 0x79, 0x06, 0xcf, 0xa3, 0xc1, 0x9e, 0x05, 0xc7, 0xa7, 0xae, 0x9c, 0x96, 0x11, 0x3b, 0x91, + 0x65, 0x94, 0xce, 0x28, 0x74, 0xae, 0xd9, 0x03, 0xc4, 0x6f, 0xe4, 0x7d, 0x7a, 0x80, 0xed, 0x9c, 0x9f, 0xf2, 0x7b, 0xe7, 0x6b, 0x18, 0xaf, 0xbf, 0xbf, 0x02, 0xf9, 0xa2, 0xe1, 0xca, 0x87, 0xc9, + 0x09, 0x5f, 0x8c, 0x5b, 0x79, 0xfe, 0x53, 0x47, 0x97, 0xd1, 0xa7, 0xe5, 0x67, 0x8b, 0xe9, 0x4c, 0xf6, 0x22, 0x36, 0xce, 0x2f, 0xcb, 0x0c, 0x2b, 0x34, 0x8e, 0xce, 0xf3, 0xcc, 0xf0, 0xe7, 0x79, + 0x29, 0x6f, 0x9e, 0x2d, 0x1c, 0xc3, 0x1e, 0x65, 0xe1, 0x71, 0x54, 0x67, 0xe7, 0x07, 0xc8, 0x8f, 0x19, 0x0c, 0x85, 0x63, 0x5f, 0x86, 0x87, 0x7d, 0xf1, 0x8f, 0xab, 0xc2, 0x8f, 0x47, 0x89, 0xd3, + 0x46, 0x57, 0x8e, 0xff, 0xea, 0x91, 0x0f, 0x33, 0x9d, 0x60, 0xea, 0xfd, 0xef, 0x9d, 0x51, 0x1c, 0xcb, 0x77, 0x47, 0x7f, 0xe8, 0x37, 0xf2, 0x40, 0x4e, 0xe4, 0x3f, 0x68, 0xc6, 0x9c, 0xf7, 0xc1, + 0xbb, 0x3b, 0xf7, 0x87, 0x3e, 0xc1, 0xd4, 0x03, 0x2e, 0xbe, 0x5b, 0x43, 0x9f, 0x9e, 0x80, 0xdd, 0xdf, 0x7b, 0xe2, 0x82, 0x39, 0x68, 0x21, 0x05, 0x2c, 0xb6, 0x07, 0x20, 0xdf, 0x89, 0x6d, 0xc8, + 0x55, 0xab, 0xbc, 0x67, 0xea, 0x93, 0xe5, 0xa5, 0x6b, 0x7f, 0x4a, 0x2b, 0xf6, 0x09, 0x98, 0x6d, 0xe7, 0xd2, 0xb4, 0xf6, 0x65, 0x19, 0xd8, 0x2c, 0x57, 0x4b, 0xce, 0x42, 0x84, 0x25, 0xa3, 0x45, + 0xa6, 0x17, 0xce, 0xdb, 0x5d, 0x05, 0x62, 0x60, 0xb2, 0xd2, 0x4f, 0x2c, 0x7f, 0x80, 0x5b, 0x54, 0x76, 0x54, 0x91, 0xa7, 0x3e, 0x0e, 0xbc, 0xff, 0xa9, 0x34, 0xfc, 0x47, 0xa9, 0x76, 0x9d, 0x2f, + 0xf4, 0xb5, 0x06, 0x7f, 0xc4, 0x05, 0x7b, 0x01, 0x79, 0x16, 0x89, 0x4f, 0x17, 0x23, 0x78, 0x98, 0x1b, 0x96, 0xca, 0xc9, 0x3d, 0x7b, 0x5c, 0x2f, 0x55, 0x6c, 0x49, 0x55, 0x96, 0xbb, 0xdf, 0x74, + 0xd4, 0x11, 0xa2, 0x05, 0x4b, 0x6a, 0x75, 0xdb, 0x6c, 0x67, 0x6c, 0xee, 0x39, 0xa0, 0xaa, 0x87, 0xe9, 0xa2, 0x0f, 0x12, 0x10, 0xdd, 0xcd, 0xa7, 0x6d, 0x25, 0x4e, 0x0e, 0x95, 0x36, 0x3f, 0x31, + 0xa8, 0x48, 0x55, 0x9b, 0x3e, 0xb3, 0xfa, 0xc9, 0x64, 0x7a, 0x6c, 0x80, 0x0d, 0xb2, 0xc1, 0x3b, 0x08, 0xd2, 0x97, 0xe2, 0xdd, 0x66, 0x1a, 0xf7, 0xdc, 0xa4, 0x43, 0xbc, 0x17, 0xb1, 0x53, 0x79, + 0xa9, 0x7d, 0xdb, 0xe7, 0xf6, 0x48, 0x0f, 0x85, 0x2b, 0xcc, 0x33, 0x12, 0xcf, 0x57, 0x43, 0xfb, 0x25, 0xf8, 0x56, 0xc4, 0x70, 0x8e, 0x90, 0x0b, 0x31, 0x41, 0xf5, 0xb3, 0x2a, 0xd1, 0x21, 0x07, + 0x80, 0x79, 0xa4, 0x53, 0x16, 0x76, 0xd3, 0x0b, 0xa9, 0x51, 0xaf, 0x14, 0x4c, 0x1d, 0x33, 0xe8, 0xbe, 0xe1, 0xc0, 0x66, 0x33, 0xf3, 0x9d, 0x19, 0x99, 0xbb, 0x72, 0xd4, 0x2a, 0xba, 0x02, 0x4c, + 0x19, 0x7a, 0x43, 0x9b, 0x1b, 0x6d, 0xb1, 0xa5, 0xa1, 0x3a, 0x3a, 0xa5, 0x4a, 0x3a, 0xe1, 0x10, 0xb4, 0xdc, 0xdf, 0x8a, 0xc4, 0x0d, 0xc6, 0xe2, 0xb0, 0x61, 0xe6, 0xb1, 0x6f, 0x15, 0xe9, 0xf3, + 0x6c, 0xca, 0xaf, 0xed, 0xa6, 0x47, 0x3a, 0xbc, 0xbc, 0x82, 0x7d, 0xc2, 0xe6, 0xcb, 0xe2, 0x9c, 0x29, 0x31, 0xc0, 0x61, 0x99, 0xc9, 0x71, 0xdf, 0x82, 0x9a, 0x62, 0xb5, 0xda, 0x3c, 0x9b, 0xd2, + 0xc6, 0x82, 0xce, 0x41, 0x48, 0x13, 0x5b, 0x5e, 0xe8, 0x8e, 0x01, 0xbb, 0x5b, 0x52, 0x1d, 0x64, 0xa4, 0x50, 0x6b, 0xe7, 0x59, 0x51, 0xf4, 0x53, 0x03, 0x3b, 0x24, 0x27, 0xde, 0xea, 0x49, 0x57, + 0x92, 0xf5, 0x82, 0x6a, 0x52, 0x8f, 0xda, 0xc3, 0x50, 0x38, 0xf7, 0x98, 0xb1, 0x29, 0x58, 0xdc, 0x3e, 0xc4, 0x5b, 0xee, 0xa8, 0xde, 0x6d, 0x1a, 0xf8, 0x4d, 0xc4, 0xb9, 0x30, 0xac, 0x37, 0x4a, + 0xe6, 0x9d, 0x8e, 0xca, 0x7c, 0x2b, 0x7d, 0x9d, 0xed, 0x89, 0x3c, 0xa4, 0x40, 0xa8, 0x1f, 0x92, 0xea, 0xbd, 0xc4, 0x7f, 0xfb, 0x17, 0x7c, 0x45, 0xc1, 0xcb, 0xdf, 0xf4, 0x53, 0x0a, 0xbe, 0x40, + 0x05, 0x47, 0xaf, 0xd7, 0xa3, 0x33, 0xac, 0xfb, 0xf4, 0x5b, 0x65, 0x2c, 0x1f, 0xb8, 0xad, 0x35, 0x99, 0x2a, 0x26, 0xbd, 0x71, 0xfc, 0xe3, 0xae, 0x44, 0xe2, 0xf1, 0xb2, 0xd7, 0x94, 0x4d, 0xcf, + 0xd4, 0x1b, 0x24, 0xdd, 0x58, 0x0c, 0x4d, 0xd1, 0x9c, 0x43, 0xc9, 0x95, 0x03, 0x01, 0x07, 0x85, 0x09, 0x5a, 0x78, 0xb9, 0x77, 0xec, 0xa9, 0x57, 0xef, 0x56, 0x9b, 0x90, 0x0b, 0xb6, 0x87, 0x7e, + 0x2d, 0xa0, 0x49, 0x36, 0xa1, 0xa3, 0x7a, 0xe7, 0xcd, 0x0f, 0xec, 0xca, 0xbe, 0x47, 0xbf, 0x1f, 0x20, 0xf9, 0x6f, 0x0b, 0xfc, 0x20, 0x4d, 0x4a, 0xcb, 0x8b, 0xfc, 0x24, 0x74, 0x5e, 0x7b, 0x21, + 0x7f, 0x4b, 0xbb, 0xf8, 0x76, 0x6e, 0x15, 0xf1, 0x88, 0x01, 0xec, 0xc7, 0xce, 0x79, 0x6b, 0xc5, 0xce, 0xe8, 0x0c, 0xe1, 0x3e, 0x51, 0x94, 0xed, 0x26, 0x5c, 0x3b, 0xec, 0x0e, 0x85, 0x0b, 0x71, + 0xed, 0x1b, 0x45, 0x39, 0x16, 0x16, 0x9c, 0xbe, 0xe2, 0xe7, 0xc7, 0x66, 0x65, 0x81, 0x7c, 0x11, 0xa4, 0x2e, 0x93, 0x8c, 0x23, 0xb1, 0xaa, 0x5c, 0xdc, 0x08, 0xe4, 0x26, 0xf7, 0x65, 0x86, 0x92, + 0x4a, 0x27, 0x31, 0xad, 0x34, 0xb5, 0xaa, 0x15, 0x61, 0x13, 0xbb, 0x92, 0x30, 0x72, 0x5d, 0x1b, 0x33, 0x80, 0x66, 0x86, 0xab, 0xca, 0xf3, 0xef, 0xd6, 0x68, 0x7f, 0x4a, 0x87, 0xb9, 0x62, 0xe2, + 0x97, 0x15, 0xf9, 0x6f, 0x73, 0x60, 0x86, 0x52, 0x11, 0x1b, 0x98, 0xeb, 0x71, 0x46, 0x8c, 0x7d, 0xab, 0xc4, 0x17, 0xfe, 0x8d, 0x3f, 0xe2, 0xde, 0xb9, 0x02, 0x7d, 0xc6, 0xbb, 0x6d, 0x8e, 0x2e, + 0x80, 0xee, 0xe3, 0xbe, 0xdc, 0x28, 0x58, 0xbd, 0x27, 0xed, 0x43, 0xd4, 0x54, 0xea, 0xf2, 0xd4, 0xb6, 0x27, 0x6e, 0x0a, 0x6d, 0x6a, 0xdf, 0xdb, 0x0b, 0x3e, 0x4b, 0xee, 0x3a, 0xc6, 0x94, 0xf0, + 0xad, 0x7a, 0x9a, 0x4e, 0xc6, 0x74, 0xac, 0x1c, 0x1a, 0xf1, 0x58, 0xa4, 0x92, 0xd8, 0x1e, 0x24, 0x49, 0x5c, 0x6d, 0x96, 0xd4, 0x64, 0x61, 0xb2, 0x00, 0xcc, 0xee, 0xf6, 0x91, 0x98, 0xae, 0x60, + 0x65, 0x82, 0x24, 0x0a, 0x7a, 0x3c, 0x34, 0xf7, 0x70, 0xff, 0xa7, 0x34, 0x44, 0x7c, 0x49, 0x62, 0xbe, 0x9d, 0x22, 0x03, 0xff, 0x46, 0x7f, 0x5e, 0x51, 0xf5, 0x0a, 0xf7, 0x19, 0x9f, 0xe7, 0xc5, + 0xe8, 0x02, 0xee, 0x3e, 0x4a, 0xf5, 0xe9, 0x01, 0x30, 0x37, 0x31, 0xde, 0xef, 0x76, 0x33, 0xe0, 0x90, 0x4d, 0x0a, 0x46, 0xa1, 0x93, 0x15, 0xa4, 0x1c, 0x17, 0x93, 0xc3, 0x66, 0x07, 0x49, 0xd5, + 0x0e, 0x16, 0x74, 0x75, 0xd6, 0x60, 0x25, 0x00, 0xec, 0x84, 0xd0, 0x3a, 0xee, 0x8d, 0x1d, 0x74, 0x24, 0x00, 0x4c, 0x46, 0xea, 0x05, 0xb6, 0x0e, 0xa4, 0xa0, 0xef, 0x4a, 0x6e, 0x0c, 0xf7, 0xa7, + 0x5a, 0xe5, 0x71, 0xc8, 0xeb, 0x0d, 0x47, 0xf3, 0xef, 0x29, 0xdd, 0xdb, 0x3a, 0xe2, 0x95, 0xe1, 0x9e, 0xb9, 0xeb, 0xa7, 0xac, 0x3d, 0x98, 0x1e, 0xc9, 0xe8, 0xd2, 0x89, 0xf7, 0x26, 0x73, 0x3f, + 0x92, 0x1b, 0xf2, 0x0a, 0xf6, 0x4c, 0x8e, 0xe7, 0xc5, 0x90, 0x2c, 0x8f, 0x27, 0x6a, 0x2c, 0xe8, 0xa0, 0x5d, 0x27, 0x10, 0xb9, 0xed, 0xc0, 0x45, 0x2b, 0x06, 0x68, 0xbf, 0x0f, 0xf7, 0x7e, 0x88, + 0x2c, 0x77, 0xcd, 0x31, 0x33, 0xba, 0x70, 0xaa, 0xb3, 0xfe, 0x91, 0x27, 0xe4, 0x13, 0x21, 0xd0, 0xbc, 0xb9, 0xee, 0xda, 0x56, 0xd9, 0xae, 0xab, 0x13, 0xbb, 0x03, 0xc8, 0x68, 0x9f, 0x4e, 0x79, + 0xde, 0x46, 0x45, 0x74, 0xa1, 0xb5, 0xcb, 0xb6, 0xa9, 0xeb, 0xa4, 0xa4, 0x94, 0x31, 0xc8, 0x39, 0xcc, 0xdf, 0x64, 0xf0, 0x21, 0xfd, 0xff, 0xde, 0x8e, 0xe6, 0xfe, 0x0a, 0x99, 0xe8, 0x63, 0x96, + 0xe4, 0x33, 0xd4, 0x0b, 0x2e, 0x2f, 0xd7, 0x23, 0x74, 0x98, 0x35, 0xb9, 0x24, 0x33, 0x02, 0xf5, 0x64, 0xff, 0x49, 0x27, 0x0a, 0x53, 0xb6, 0x6d, 0x61, 0x95, 0xf4, 0x51, 0x12, 0x18, 0x77, 0x8b, + 0x42, 0x54, 0x45, 0x5c, 0x93, 0x24, 0xa6, 0xd7, 0xd1, 0xbd, 0x68, 0xf1, 0xd0, 0x46, 0xe8, 0xcc, 0x36, 0x73, 0xe3, 0x3d, 0x28, 0x40, 0x78, 0x3f, 0x63, 0xfa, 0x56, 0xa2, 0x95, 0x6d, 0xc7, 0x5a, + 0x1a, 0x51, 0xa1, 0x8a, 0x08, 0xac, 0x70, 0x23, 0x1f, 0x4b, 0xe2, 0x82, 0x7b, 0x9c, 0xb1, 0xcf, 0xc6, 0xcf, 0xc8, 0x39, 0x65, 0x46, 0xf2, 0x8c, 0x94, 0xb3, 0xff, 0x80, 0xfc, 0x21, 0x83, 0xff, + 0x8f, 0xa1, 0xd4, 0xf0, 0x6f, 0x9e, 0x5d, 0x9f, 0xd0, 0xf7, 0x80, 0x73, 0xf3, 0x0a, 0xf4, 0x99, 0x16, 0x7e, 0x59, 0x9d, 0x5d, 0xf2, 0x03, 0x1c, 0x9b, 0xcb, 0x32, 0x48, 0x42, 0xcc, 0x6c, 0xd1, + 0xc3, 0x32, 0x3f, 0xf4, 0xa6, 0xdd, 0x8d, 0x7d, 0xa1, 0xdc, 0xa8, 0xdc, 0xc6, 0x15, 0x01, 0x40, 0x99, 0xcf, 0x49, 0x8c, 0x9e, 0x9c, 0x4a, 0x22, 0x73, 0x26, 0x35, 0xae, 0x1d, 0xb1, 0xa4, 0x70, + 0x12, 0x83, 0x10, 0xf7, 0x27, 0xf1, 0x70, 0x2a, 0xa4, 0x5d, 0xde, 0xb6, 0xd0, 0x32, 0x6e, 0x2b, 0x40, 0x76, 0x5c, 0xaa, 0x38, 0x1e, 0xeb, 0x38, 0xdc, 0xf1, 0xfd, 0xad, 0x21, 0xd5, 0xf7, 0xb1, + 0xf2, 0xc6, 0xf1, 0xf2, 0xb5, 0xa5, 0xfe, 0x48, 0xf4, 0xea, 0x23, 0xf0, 0xb7, 0x58, 0xba, 0xde, 0x1a, 0x1a, 0xc7, 0x92, 0xb0, 0x82, 0x3a, 0x7a, 0x36, 0x05, 0x75, 0x9e, 0x08, 0x42, 0x01, 0x2c, + 0xa2, 0x63, 0x64, 0x1c, 0xb4, 0x8e, 0x86, 0xba, 0x3e, 0x77, 0xa4, 0x2d, 0x5b, 0x6c, 0x83, 0xa5, 0x8d, 0x2c, 0x49, 0x42, 0x82, 0x51, 0xdc, 0x02, 0x84, 0xe9, 0x69, 0x3e, 0xc9, 0xed, 0xc3, 0x4a, + 0x82, 0xb7, 0xab, 0x71, 0x3d, 0x73, 0x8f, 0xaa, 0xc9, 0x28, 0xfd, 0xd8, 0x6d, 0x0e, 0xc1, 0x46, 0x61, 0x1d, 0xe1, 0x98, 0x0b, 0xf0, 0xe3, 0xa5, 0x8e, 0x46, 0x51, 0x5c, 0x12, 0xe8, 0xbe, 0xa8, + 0x8d, 0xf1, 0xdf, 0x17, 0x5f, 0x7f, 0xe1, 0x11, 0x7b, 0x4d, 0x37, 0xbb, 0x4c, 0x39, 0xfa, 0xb9, 0x55, 0x3f, 0x68, 0x2a, 0x7b, 0xfc, 0xad, 0x56, 0xfd, 0x39, 0x35, 0xcf, 0xf4, 0xbb, 0x2a, 0xd1, + 0xfb, 0x14, 0x23, 0x66, 0x51, 0x5f, 0x9b, 0x3b, 0x5e, 0x9f, 0xa3, 0x4b, 0xc4, 0x00, 0x85, 0xfd, 0x84, 0x89, 0x1c, 0xd6, 0x0b, 0xfa, 0x1c, 0x4f, 0x4f, 0x47, 0xae, 0x33, 0x26, 0x0a, 0xdd, 0x1d, + 0xb4, 0xc6, 0xe2, 0xcb, 0x26, 0xdd, 0x1b, 0xdc, 0x32, 0x07, 0x4b, 0xfc, 0xa4, 0x2d, 0x08, 0x50, 0xd3, 0x36, 0x44, 0xd5, 0x93, 0x32, 0x7d, 0x62, 0xc4, 0x8a, 0x4b, 0xb6, 0x22, 0x58, 0x69, 0xd5, + 0x0c, 0x55, 0xe5, 0x5d, 0x74, 0x83, 0x62, 0xb7, 0x71, 0x90, 0x18, 0x55, 0x5d, 0x18, 0xd1, 0xc8, 0x4a, 0xe3, 0xcc, 0xb8, 0x39, 0x27, 0x04, 0x3e, 0xe7, 0x5c, 0xfd, 0x14, 0x21, 0x1f, 0x60, 0x83, + 0xa3, 0x8f, 0x77, 0xce, 0x9e, 0x92, 0xbb, 0x21, 0xf7, 0x6d, 0x41, 0x80, 0x64, 0x65, 0x2b, 0x5c, 0xd7, 0x26, 0xc5, 0xa6, 0xcc, 0x1a, 0xb3, 0x91, 0xb5, 0x05, 0x6c, 0x66, 0x1b, 0xeb, 0xa7, 0x1f, + 0x9b, 0xda, 0xce, 0x28, 0x2d, 0x47, 0x75, 0xe5, 0x7f, 0x33, 0x26, 0x11, 0x7d, 0xa0, 0xfc, 0xf5, 0x1d, 0xe4, 0xa7, 0x0f, 0x7d, 0xbb, 0x3e, 0x87, 0x72, 0x06, 0x94, 0xc1, 0xba, 0x4d, 0xa2, 0xd1, + 0x95, 0x6e, 0xca, 0xa4, 0xea, 0x4e, 0xe6, 0xf8, 0x98, 0xe9, 0xd0, 0x4e, 0x04, 0x93, 0x09, 0xdf, 0x05, 0x7b, 0x75, 0x4a, 0xac, 0x8f, 0x1e, 0x9b, 0x43, 0x3d, 0x3e, 0x9b, 0xba, 0x02, 0xa0, 0x6b, + 0x19, 0xaf, 0x0a, 0x8b, 0xdd, 0xd8, 0x36, 0x7d, 0xf7, 0x24, 0x85, 0x12, 0x82, 0x3b, 0x66, 0x01, 0x13, 0x73, 0x48, 0x20, 0x1d, 0x59, 0x5d, 0xfa, 0xa5, 0x68, 0xad, 0x59, 0x6e, 0x8e, 0x7e, 0xdf, + 0x3d, 0xfd, 0x69, 0x11, 0xa7, 0xb7, 0x32, 0x12, 0xd1, 0x87, 0xac, 0x99, 0x2b, 0xcc, 0x2b, 0x16, 0xe2, 0x34, 0x39, 0x37, 0xb2, 0x1a, 0x60, 0xc7, 0x1c, 0x69, 0x46, 0x27, 0xb9, 0x38, 0xf4, 0xa4, + 0x30, 0xd7, 0x42, 0xd9, 0x42, 0xa0, 0x16, 0xd0, 0x5d, 0x89, 0x44, 0x2d, 0x8e, 0x37, 0x59, 0xca, 0x4b, 0x36, 0x66, 0x65, 0xcc, 0xcc, 0x59, 0x35, 0xa9, 0x63, 0xbd, 0x0c, 0xba, 0xb5, 0xb7, 0x0a, + 0x69, 0xde, 0x08, 0x24, 0x88, 0x54, 0x70, 0xe5, 0x84, 0x50, 0x51, 0x33, 0x0b, 0x74, 0x5c, 0x23, 0xb9, 0x46, 0x95, 0xe1, 0x53, 0xaf, 0x50, 0x01, 0xb7, 0x7f, 0x5c, 0xf9, 0x5a, 0x5e, 0x1a, 0xfa, + 0xb6, 0x71, 0x71, 0x4f, 0xa3, 0xbf, 0xf1, 0x8f, 0xae, 0x7f, 0xb3, 0x3e, 0x5e, 0x7f, 0x42, 0xde, 0x57, 0x2a, 0x7c, 0x35, 0x2f, 0xe6, 0x0b, 0x39, 0xf8, 0xd6, 0xfc, 0xb9, 0x0c, 0x49, 0x7f, 0xf7, + 0x82, 0xac, 0xac, 0x0a, 0xc7, 0xf9, 0x5d, 0x38, 0x71, 0xf7, 0x22, 0x25, 0xa9, 0xb7, 0x0f, 0x94, 0x4e, 0xdc, 0x5c, 0x9d, 0xe7, 0xe4, 0x6f, 0xfc, 0x63, 0xaf, 0xf6, 0x38, 0x8b, 0x9c, 0x51, 0x9d, + 0x9d, 0x9b, 0xe5, 0x25, 0xe9, 0xeb, 0xfc, 0xb0, 0x2f, 0x52, 0xf1, 0x2e, 0xd9, 0x04, 0xe5, 0xc8, 0x4a, 0xa3, 0xf4, 0xf2, 0x0c, 0xfe, 0x31, 0xa7, 0xaf, 0x4a, 0xeb, 0x37, 0x7f, 0xe7, 0xbb, 0x9f, + 0xea, 0xc4, 0x76, 0xdc, 0xd2, 0x70, 0x9d, 0x17, 0xe8, 0xf8, 0x67, 0x71, 0xfd, 0xe9, 0x28, 0xfa, 0xca, 0x78, 0xe7, 0xca, 0x8c, 0xeb, 0xf2, 0x91, 0x53, 0xe9, 0x60, 0x5f, 0xf2, 0xf3, 0xdc, 0xa5, + 0x34, 0x73, 0x12, 0x2b, 0x8d, 0x22, 0xc7, 0xaa, 0xfc, 0xc6, 0x79, 0xf7, 0x29, 0xef, 0x9d, 0x0f, 0xef, 0x1f, 0x3c, 0x3b, 0x21, 0x9e, 0xff, 0xec, 0xe7, 0x37, 0xde, 0xdd, 0x59, 0xef, 0xdd, 0x45, + 0x77, 0xa6, 0xdd, 0x3e, 0xd6, 0x58, 0xee, 0xab, 0x69, 0xb7, 0x03, 0x5a, 0xc7, 0xc1, 0xa3, 0xca, 0x96, 0x15, 0x74, 0x32, 0xd7, 0x0b, 0x7f, 0xa9, 0xc6, 0xae, 0x30, 0x77, 0xa3, 0x94, 0xa3, 0xc8, + 0x68, 0x5f, 0x37, 0xd0, 0x7f, 0xb8, 0xed, 0xff, 0x25, 0x7a, 0x3e, 0x71, 0xe2, 0x57, 0x48, 0xc2, 0x1f, 0x4a, 0x00, 0x7b, 0x0f, 0x1a, 0x1c, 0x7d, 0xb8, 0x31, 0xc2, 0xef, 0x27, 0x7f, 0x9d, 0xcd, + 0xac, 0x60, 0x1f, 0xb4, 0xb6, 0xb6, 0xa8, 0x30, 0x88, 0x5a, 0x2f, 0x7c, 0x26, 0x9f, 0x68, 0x58, 0xaa, 0xac, 0xca, 0xa3, 0x82, 0xb0, 0x39, 0x33, 0xef, 0x4b, 0x64, 0x93, 0x85, 0x31, 0x66, 0x48, + 0x07, 0x33, 0x88, 0x01, 0x9d, 0x55, 0x59, 0x4b, 0xc5, 0xb6, 0xee, 0x4c, 0xd8, 0x15, 0x58, 0xbd, 0x16, 0xf4, 0xd8, 0x80, 0x9c, 0x0e, 0x73, 0xf1, 0xe8, 0xc8, 0x17, 0xe1, 0x18, 0x32, 0x34, 0x48, + 0x5a, 0xa7, 0x8f, 0x8b, 0xa8, 0x37, 0xfc, 0xf4, 0x1c, 0x83, 0xfb, 0xe9, 0xf6, 0x19, 0x46, 0xac, 0xec, 0xdb, 0x03, 0xef, 0xcf, 0xc9, 0xf1, 0x04, 0xf1, 0xac, 0x20, 0xb2, 0x6a, 0x50, 0xdb, 0x3d, + 0x78, 0x64, 0xda, 0x90, 0xd7, 0x6c, 0xd3, 0x93, 0xa4, 0xd5, 0x5b, 0x2b, 0x41, 0xf7, 0x9e, 0xeb, 0xc7, 0x14, 0x7a, 0x58, 0x10, 0x00, 0xf6, 0x28, 0xf6, 0x0c, 0xd3, 0x2c, 0xce, 0xcf, 0xff, 0xfa, + 0xa2, 0xf4, 0xff, 0x0b, 0x89, 0x75, 0x46, 0xc2, 0x55, 0x5c, 0x65, 0xd5, 0xcf, 0x65, 0xd5, 0x90, 0x53, 0xd8, 0xcd, 0x18, 0xee, 0x2d, 0x79, 0xf1, 0x73, 0x3b, 0xf5, 0xeb, 0x57, 0x9c, 0xa9, 0xf1, + 0xd5, 0x0f, 0x67, 0x59, 0x32, 0xc0, 0x9e, 0xcd, 0x10, 0x15, 0x2e, 0x8f, 0xb9, 0x1f, 0xa0, 0xfd, 0x7a, 0xdd, 0xc9, 0x13, 0x88, 0x20, 0xa7, 0x47, 0x98, 0x30, 0xdd, 0x7e, 0xcf, 0x01, 0x2d, 0xe9, + 0x75, 0xce, 0x31, 0xce, 0x16, 0x8d, 0x8e, 0x2d, 0x85, 0x20, 0xaf, 0xe6, 0xe2, 0x9e, 0x59, 0x34, 0x7c, 0x1c, 0x8c, 0x4f, 0x68, 0xb7, 0x21, 0x0f, 0x3b, 0x87, 0x6e, 0x56, 0xcb, 0x63, 0x98, 0x0a, + 0xe2, 0x26, 0x68, 0xa5, 0x79, 0x7a, 0x9c, 0xa6, 0x6b, 0x6d, 0xf6, 0xf8, 0x09, 0xe4, 0xf3, 0x7c, 0xd9, 0xe7, 0xfc, 0xaa, 0x37, 0x02, 0xff, 0x53, 0xb3, 0xe1, 0x27, 0x05, 0x86, 0x7f, 0xcc, 0x54, + 0x7f, 0xa3, 0x66, 0xd1, 0xf7, 0xc3, 0x3d, 0x1b, 0x23, 0xf2, 0x2f, 0x1a, 0x36, 0x8b, 0x5f, 0x90, 0x16, 0xf9, 0x96, 0x93, 0x5c, 0xab, 0x18, 0xd1, 0x87, 0xfa, 0x4a, 0x0c, 0x4a, 0x47, 0x7a, 0x4b, + 0xad, 0x9b, 0x59, 0xdd, 0x8f, 0x69, 0x94, 0xf7, 0xa0, 0x3f, 0x70, 0x46, 0xe5, 0x0d, 0xd1, 0x2e, 0xe7, 0x13, 0x8e, 0xa3, 0x97, 0x38, 0x5f, 0xa2, 0x6a, 0x35, 0xf1, 0x4b, 0x4e, 0xcd, 0xe8, 0x2d, + 0x32, 0x57, 0x3a, 0xca, 0xce, 0xc3, 0x6c, 0xee, 0x63, 0xe3, 0xfd, 0xb6, 0x47, 0xe7, 0x46, 0xee, 0xb3, 0x84, 0xd3, 0xd7, 0x26, 0x84, 0xc3, 0x08, 0xbb, 0xed, 0x2b, 0x4d, 0x69, 0x95, 0x31, 0x31, + 0x21, 0x16, 0x2b, 0x53, 0x0a, 0x0f, 0xc8, 0x26, 0x31, 0xc1, 0x78, 0x8a, 0xa9, 0x87, 0x34, 0x98, 0xc8, 0xad, 0xd5, 0xf2, 0xf7, 0x38, 0xe2, 0x4f, 0x15, 0xea, 0x5c, 0x1b, 0xb4, 0xf9, 0x49, 0x99, + 0x7d, 0xd7, 0x18, 0x8e, 0x7c, 0x00, 0xbd, 0xef, 0x41, 0x83, 0xa3, 0x0f, 0x37, 0x46, 0x67, 0xa8, 0xf7, 0xd1, 0x6b, 0x90, 0x19, 0xcb, 0xd9, 0x1e, 0x7c, 0x5a, 0x2d, 0x98, 0xe3, 0xae, 0xdb, 0x2a, + 0xf3, 0x23, 0xbf, 0x3e, 0x81, 0xa7, 0x76, 0xaa, 0x97, 0xa1, 0x00, 0x2b, 0x36, 0xe1, 0x1c, 0x0f, 0x07, 0x01, 0x65, 0x6d, 0x59, 0xc5, 0xf4, 0xf5, 0x46, 0x60, 0xa7, 0xca, 0x6e, 0x06, 0x78, 0x6d, + 0x87, 0xf0, 0xca, 0x04, 0x18, 0x47, 0xc0, 0xb6, 0xe3, 0x35, 0x46, 0x48, 0xda, 0x1e, 0x0c, 0x3a, 0x0f, 0xcc, 0xeb, 0x6a, 0xa5, 0xdc, 0xd3, 0x45, 0x8f, 0x06, 0x6d, 0x06, 0x97, 0xc2, 0x3f, 0xe3, + 0xe2, 0xbb, 0xf0, 0xf2, 0xcf, 0x65, 0xde, 0x0b, 0xd4, 0x37, 0xd8, 0xbe, 0x84, 0x98, 0x07, 0x48, 0xb6, 0xca, 0xe9, 0x72, 0xbe, 0x99, 0xa9, 0x3d, 0x1f, 0xe6, 0xf8, 0x98, 0x0e, 0x7d, 0x6a, 0xb6, + 0x57, 0x19, 0x1a, 0x42, 0x14, 0x56, 0x46, 0xf2, 0xf0, 0x14, 0xdb, 0x0c, 0x96, 0xf0, 0x2e, 0xd0, 0x06, 0x22, 0xcf, 0xa8, 0xc7, 0x53, 0x3f, 0x51, 0x75, 0x61, 0x72, 0xca, 0xa6, 0x39, 0xbd, 0x6e, + 0x58, 0x6a, 0x1d, 0x7b, 0xaa, 0x50, 0x00, 0x0b, 0xaa, 0x45, 0xc7, 0x02, 0x46, 0xef, 0x4f, 0x28, 0x71, 0x20, 0xb4, 0x7b, 0xfe, 0xd5, 0xdb, 0x92, 0xcd, 0x76, 0x5c, 0x3f, 0x71, 0x46, 0x59, 0x91, + 0x66, 0x4e, 0x51, 0xf9, 0xd7, 0xe0, 0xe8, 0x7b, 0xbc, 0x9c, 0xeb, 0xa5, 0x47, 0x86, 0x59, 0x56, 0x85, 0x61, 0x3d, 0x9f, 0x3f, 0x60, 0xea, 0x37, 0x34, 0x4a, 0x9c, 0x53, 0xf5, 0x80, 0x48, 0xfa, + 0x87, 0xda, 0x90, 0x5c, 0x69, 0x75, 0x4d, 0x9e, 0xba, 0xc5, 0x0f, 0x3f, 0x3f, 0xa3, 0xbe, 0x81, 0xfb, 0xca, 0x11, 0x4f, 0xab, 0x4b, 0x83, 0x9b, 0xfb, 0x3c, 0x21, 0xd4, 0x0c, 0xbb, 0x55, 0x44, + 0x65, 0x5d, 0x44, 0x0b, 0x4d, 0x74, 0xb9, 0x55, 0x3f, 0x25, 0xcc, 0x6c, 0x53, 0xa3, 0xd5, 0xa1, 0x42, 0x4f, 0x4d, 0x20, 0xd8, 0xf2, 0x42, 0x02, 0x66, 0xce, 0x0e, 0x8a, 0x04, 0x13, 0x5b, 0x51, + 0xaa, 0x4c, 0x42, 0x13, 0x63, 0x7a, 0xf2, 0x6a, 0xe1, 0x58, 0x6f, 0x11, 0x6d, 0x0e, 0xcc, 0x83, 0xb0, 0x5b, 0xb7, 0x62, 0x5f, 0x0a, 0xb8, 0x1e, 0x56, 0x8b, 0xd8, 0xf5, 0xfe, 0xae, 0x6c, 0x1b, + 0x38, 0x76, 0xe7, 0xf2, 0xb5, 0xbf, 0x8d, 0xb2, 0xf4, 0x8f, 0xb7, 0x4e, 0xfe, 0xd8, 0x43, 0xae, 0xf7, 0x77, 0x90, 0x5f, 0xf0, 0x7a, 0x5d, 0x9f, 0x3d, 0x99, 0x03, 0x5c, 0xf0, 0xfe, 0x69, 0x87, + 0xf0, 0xf8, 0x8e, 0xd3, 0x4a, 0x26, 0xeb, 0x7c, 0x65, 0x73, 0x58, 0xc5, 0x2a, 0x80, 0xb0, 0x5c, 0xa6, 0x69, 0x0e, 0xbe, 0xf0, 0xd1, 0x35, 0xe0, 0x62, 0x0e, 0x60, 0x2c, 0x67, 0x0c, 0x67, 0xa4, + 0xb8, 0x11, 0xcf, 0x64, 0x95, 0x58, 0x42, 0xa2, 0x48, 0x58, 0x20, 0xaf, 0x50, 0x63, 0x07, 0x23, 0xeb, 0x6a, 0x72, 0x42, 0xe6, 0x3c, 0x45, 0x7b, 0xa7, 0xf9, 0x98, 0xd0, 0xb6, 0xf1, 0xaa, 0x7e, + 0x3c, 0x57, 0xf0, 0x73, 0x83, 0x90, 0x0f, 0x19, 0x7e, 0x83, 0x36, 0xe3, 0xd7, 0xfd, 0xa6, 0xde, 0x3c, 0xf0, 0x9e, 0xd1, 0x2f, 0x10, 0xfe, 0xcf, 0xd9, 0xa5, 0xc9, 0xc8, 0x39, 0xf9, 0xd5, 0x28, + 0x72, 0x8c, 0x70, 0xe4, 0x16, 0xce, 0xed, 0x70, 0xfb, 0x23, 0x5e, 0xf2, 0x4f, 0xd0, 0x9f, 0x38, 0xeb, 0xe3, 0xbd, 0xa1, 0x83, 0x70, 0xf6, 0xf5, 0xc4, 0xd0, 0x75, 0x26, 0x90, 0x1d, 0x1d, 0x6d, + 0x94, 0xf6, 0x28, 0x8e, 0x29, 0xfe, 0xc4, 0xa4, 0xe5, 0xa2, 0x2e, 0xa6, 0x3e, 0xa3, 0x42, 0x25, 0x8c, 0x16, 0x0b, 0xf8, 0xd0, 0xc6, 0xc6, 0x06, 0x00, 0x82, 0xc6, 0x3a, 0x6d, 0x48, 0x92, 0x51, + 0x53, 0xa9, 0x71, 0x12, 0xdd, 0x31, 0xb3, 0x09, 0x83, 0xc4, 0x94, 0x3a, 0x81, 0x41, 0x36, 0x2d, 0x37, 0x87, 0xcd, 0x3a, 0x48, 0x64, 0x26, 0x03, 0xdb, 0x6f, 0x7d, 0x6c, 0xd7, 0x61, 0x8f, 0x5f, + 0x0b, 0xaf, 0x47, 0xfc, 0xaa, 0x4f, 0x00, 0xcf, 0x38, 0xb0, 0x06, 0x7a, 0x50, 0xd5, 0x69, 0x69, 0x64, 0xa8, 0xaa, 0x72, 0x4a, 0x29, 0x8b, 0xe5, 0x8c, 0x4e, 0x66, 0x13, 0x82, 0xc4, 0x51, 0xcd, + 0xa0, 0xbf, 0x2e, 0x04, 0x1f, 0xb0, 0x2d, 0x7e, 0x36, 0xa7, 0xf2, 0x12, 0xcc, 0x30, 0xaa, 0x9b, 0x87, 0x7a, 0xe8, 0x37, 0xfd, 0x88, 0x56, 0x7f, 0x01, 0xfb, 0x84, 0x8e, 0x97, 0xc5, 0xe8, 0x0c, + 0xed, 0x3e, 0x2f, 0x2c, 0x83, 0x49, 0xda, 0x65, 0x19, 0x10, 0xac, 0x12, 0xb8, 0xaa, 0xd8, 0x19, 0x7b, 0x3a, 0x79, 0x4e, 0x35, 0x59, 0x39, 0xcb, 0x8a, 0xee, 0x3d, 0xe6, 0xc8, 0x34, 0x0e, 0x3e, + 0xd3, 0x38, 0xff, 0xb4, 0x6b, 0x66, 0x53, 0x15, 0xc4, 0x0d, 0x36, 0xac, 0x34, 0xda, 0xac, 0xdd, 0xf1, 0x8a, 0x97, 0xe5, 0xb5, 0xad, 0x90, 0xa6, 0x50, 0x65, 0xbc, 0x6b, 0xcd, 0x6b, 0x1a, 0x1b, + 0xa3, 0x96, 0xcd, 0x2e, 0x8f, 0xc1, 0xe3, 0x7a, 0xfd, 0x5f, 0x0d, 0xa3, 0xf4, 0xea, 0x2a, 0x2d, 0xbd, 0xc2, 0xa8, 0x3c, 0x1f, 0x6c, 0xd3, 0xc2, 0x1e, 0x3d, 0xe1, 0xf9, 0x2a, 0x10, 0x90, 0xf7, + 0x22, 0xe5, 0x5c, 0xb3, 0xe6, 0x5f, 0xa4, 0x05, 0xf4, 0x51, 0xde, 0xb8, 0x46, 0xf9, 0xb4, 0x39, 0x1a, 0x27, 0x29, 0xbd, 0xca, 0xf1, 0x2f, 0x91, 0x43, 0xe4, 0xdd, 0xdc, 0xd4, 0xbf, 0xfe, 0xfa, + 0x75, 0x2d, 0x46, 0x7f, 0xfa, 0xf7, 0xd8, 0x87, 0xcc, 0xaa, 0x1f, 0xd5, 0x64, 0xff, 0xfb, 0x7f, 0x70, 0x4d, 0x76, 0xda, 0x38, 0x45, 0x94, 0x1a, 0xf6, 0x93, 0x98, 0xad, 0x9c, 0xef, 0xe7, 0x04, + 0x3c, 0x92, 0x6f, 0xf5, 0x05, 0xfc, 0x27, 0x86, 0xfa, 0x7c, 0xf7, 0x1c, 0xbb, 0x1c, 0xc0, 0x59, 0x26, 0xa9, 0xe9, 0x66, 0xec, 0xd5, 0x41, 0x92, 0x0b, 0xe9, 0x0a, 0xd2, 0x09, 0x61, 0xd3, 0x33, + 0x60, 0xe2, 0xb9, 0x52, 0xc2, 0x42, 0x94, 0xbe, 0xe3, 0xb6, 0x7d, 0x1f, 0xec, 0xd6, 0xad, 0x73, 0x34, 0x71, 0x81, 0x4e, 0xc7, 0x0c, 0xc3, 0x64, 0x27, 0xd4, 0xa5, 0x6b, 0x44, 0x06, 0x5d, 0x74, + 0x3f, 0x37, 0x98, 0xc9, 0x4e, 0x0a, 0x08, 0x69, 0x99, 0xcc, 0x15, 0x57, 0x83, 0xd3, 0x59, 0x55, 0xe5, 0xee, 0x71, 0x58, 0x35, 0xcc, 0xdb, 0xea, 0xaa, 0xe7, 0x94, 0xf4, 0xfb, 0x28, 0xce, 0x46, + 0x91, 0x1f, 0xfb, 0xb7, 0xce, 0x39, 0xc8, 0x43, 0x05, 0x1c, 0x57, 0x98, 0xe0, 0xe8, 0xf9, 0xea, 0xdc, 0x5d, 0x65, 0x80, 0x90, 0x06, 0x41, 0x8a, 0x8a, 0x67, 0xea, 0x76, 0x79, 0xa2, 0xa2, 0xd3, + 0xa4, 0x6f, 0x6d, 0x86, 0x19, 0xef, 0x96, 0x3c, 0xb2, 0xee, 0xd4, 0x31, 0x8c, 0x00, 0xce, 0xe2, 0x40, 0xae, 0xa7, 0x3c, 0xb2, 0xcd, 0xf9, 0x98, 0x09, 0x9d, 0x95, 0x42, 0xe7, 0x27, 0xb9, 0x51, + 0xeb, 0x6d, 0xb7, 0x0b, 0x62, 0x74, 0xa6, 0xc4, 0xd9, 0x98, 0x5d, 0xd7, 0x33, 0xd7, 0x0a, 0x99, 0x45, 0xce, 0x1a, 0xfb, 0xb9, 0x32, 0x3d, 0x99, 0xc4, 0xbd, 0x93, 0xcd, 0x77, 0x45, 0xc1, 0x55, + 0xd1, 0xfd, 0xfa, 0x97, 0x87, 0x27, 0x94, 0xfd, 0xc1, 0xdc, 0xb7, 0x1f, 0x26, 0x3b, 0xbf, 0x29, 0x67, 0xbe, 0x65, 0xe5, 0x3d, 0x44, 0xd6, 0xf4, 0x5a, 0x55, 0xfa, 0x7c, 0x39, 0x34, 0x4a, 0x2d, + 0x93, 0xb4, 0xae, 0x83, 0x50, 0xcb, 0x9c, 0x56, 0xf3, 0x1a, 0x4d, 0x0f, 0xeb, 0xa8, 0xa7, 0x82, 0x0e, 0x0c, 0x4d, 0xaf, 0x14, 0x8a, 0x2d, 0xb9, 0x5d, 0xe9, 0xe4, 0xe6, 0xc4, 0x72, 0xe3, 0xe3, + 0x12, 0x07, 0x66, 0x48, 0x5c, 0xcd, 0x54, 0xc4, 0x5d, 0x21, 0x96, 0x58, 0x8d, 0x3d, 0xd8, 0xe2, 0x0e, 0xa1, 0x54, 0x9a, 0xfd, 0x6c, 0x4f, 0x2e, 0x00, 0x36, 0x95, 0x57, 0x0e, 0x71, 0xa8, 0xa0, + 0x74, 0x45, 0xde, 0xb3, 0x9a, 0xbf, 0xad, 0xf6, 0xbe, 0x32, 0xfd, 0x25, 0x7b, 0xf4, 0xe7, 0xa4, 0x1d, 0x92, 0x2e, 0xfd, 0xcc, 0x3e, 0x5f, 0x6f, 0xac, 0x47, 0x72, 0xe1, 0xce, 0x10, 0xcf, 0xe8, + 0xaf, 0x8a, 0xee, 0x9c, 0x17, 0x3a, 0x04, 0xf7, 0x58, 0xb2, 0x61, 0xf6, 0x3b, 0x46, 0x81, 0xc6, 0xf4, 0x14, 0xc5, 0xc1, 0x79, 0x88, 0xd6, 0x4b, 0x17, 0x24, 0xb5, 0x83, 0x29, 0x59, 0x5d, 0xea, + 0x6d, 0x57, 0x76, 0xc3, 0x9c, 0x16, 0xf2, 0x56, 0x38, 0x7a, 0xb3, 0x08, 0x73, 0x48, 0xd8, 0xdb, 0xa7, 0xf3, 0x64, 0x2c, 0x48, 0x3d, 0x6d, 0xa9, 0x86, 0x76, 0x12, 0x91, 0x05, 0x0c, 0xad, 0x76, + 0x13, 0x00, 0x0d, 0xd6, 0x76, 0xd3, 0xa4, 0xab, 0x96, 0xb0, 0xef, 0xd9, 0xd5, 0x83, 0x77, 0xc6, 0x37, 0xe8, 0xfb, 0x30, 0x5f, 0xff, 0x6b, 0xb1, 0xff, 0x48, 0xa0, 0xf2, 0x1d, 0xe4, 0x27, 0x74, + 0xbe, 0x5d, 0x0f, 0x4d, 0xbe, 0x9a, 0x4b, 0x08, 0xab, 0xca, 0x99, 0xb4, 0xa7, 0xc0, 0x14, 0x60, 0x5a, 0xea, 0x90, 0x57, 0xae, 0xae, 0x6f, 0x5c, 0x41, 0x56, 0xf5, 0x43, 0x68, 0xfa, 0x36, 0x4b, + 0x87, 0x78, 0x91, 0x45, 0xa0, 0x37, 0x41, 0x9b, 0x8a, 0xe3, 0xc6, 0xee, 0x3c, 0x46, 0x16, 0xae, 0x4f, 0xe4, 0xea, 0x1e, 0xb0, 0xd2, 0xe9, 0x3c, 0x2c, 0x94, 0x95, 0xce, 0x9c, 0x58, 0x94, 0x4f, + 0x2b, 0x3c, 0xb4, 0x4a, 0x39, 0xf2, 0x80, 0xc7, 0x8d, 0x88, 0xa7, 0xe3, 0x4a, 0xe9, 0x57, 0xd7, 0x73, 0xc8, 0x63, 0x21, 0x81, 0x81, 0x54, 0x29, 0x9d, 0x73, 0x3b, 0xa2, 0x1b, 0x24, 0xc1, 0x1f, + 0xe3, 0xec, 0x17, 0xb0, 0x17, 0x7a, 0x5c, 0x17, 0x23, 0x7c, 0x18, 0x8f, 0x1b, 0xdd, 0x64, 0xd5, 0xc4, 0x60, 0xe6, 0x4d, 0xe6, 0x27, 0x31, 0x3c, 0xc8, 0xdb, 0xc9, 0x9a, 0x42, 0xfc, 0x69, 0x6b, + 0x55, 0x14, 0xc8, 0xa6, 0xc9, 0x96, 0x3d, 0x4e, 0xb6, 0x27, 0xf5, 0x34, 0x25, 0x1b, 0x87, 0x08, 0xb8, 0xe3, 0xb1, 0x9c, 0x45, 0x98, 0xab, 0xef, 0xa5, 0xf1, 0x46, 0x16, 0x8e, 0x52, 0xba, 0xf2, + 0xeb, 0x3d, 0x98, 0xda, 0xde, 0xac, 0x98, 0xf7, 0x92, 0xa6, 0xb7, 0xa6, 0xef, 0x4e, 0x28, 0xf9, 0x71, 0x62, 0xfc, 0xab, 0x69, 0x98, 0x4e, 0x04, 0x9e, 0x6b, 0xb6, 0xdd, 0xc2, 0xb8, 0x24, 0xdf, + 0xfe, 0x3b, 0xf9, 0xf1, 0x0c, 0x79, 0xa9, 0xf7, 0x3c, 0x37, 0xcd, 0xff, 0x75, 0x9e, 0x08, 0xff, 0xce, 0xd4, 0xba, 0xd7, 0x39, 0xed, 0x49, 0x74, 0x7d, 0x18, 0x22, 0xff, 0x55, 0x7b, 0x94, 0xcb, + 0x91, 0xf2, 0x0b, 0x55, 0x34, 0x58, 0xc2, 0xfd, 0xa7, 0x2b, 0x2f, 0xa3, 0xf2, 0x9e, 0x4e, 0x79, 0xe5, 0xcd, 0x09, 0xcb, 0x8f, 0xf5, 0x91, 0x7c, 0x03, 0xf7, 0xcc, 0x64, 0x2f, 0xab, 0xa1, 0xbd, + 0x24, 0x8d, 0x90, 0x96, 0x3a, 0x5c, 0x22, 0x83, 0x83, 0x89, 0xa8, 0xad, 0xe5, 0x74, 0xf8, 0x2c, 0x6b, 0x8e, 0xc8, 0x2a, 0x65, 0x2c, 0x50, 0x5f, 0x78, 0xfc, 0x96, 0x17, 0xb7, 0xe3, 0x58, 0x8e, + 0xbb, 0xe3, 0xa6, 0x9c, 0xb7, 0xe1, 0x7e, 0x5f, 0x41, 0xae, 0x6e, 0x40, 0x79, 0x51, 0xad, 0x7b, 0x20, 0x26, 0xaa, 0xe5, 0x8e, 0xe1, 0x5c, 0x5d, 0xa2, 0x66, 0x49, 0x3c, 0xc6, 0xd6, 0x73, 0x8c, + 0x57, 0x3b, 0x12, 0xbc, 0x67, 0x9e, 0x0c, 0x26, 0xd3, 0x1d, 0x84, 0xfa, 0x67, 0xb7, 0x60, 0x1a, 0xd5, 0x37, 0xad, 0x82, 0x47, 0x85, 0xe9, 0x7b, 0xe0, 0xcf, 0xa8, 0x7d, 0x73, 0x6b, 0x88, 0x48, + 0x85, 0x47, 0x33, 0xa8, 0xde, 0x1a, 0x9c, 0xb0, 0x17, 0x36, 0x00, 0xe5, 0x94, 0x78, 0x41, 0xef, 0x32, 0x23, 0xf1, 0x2a, 0x4b, 0x83, 0xbf, 0xee, 0xb0, 0x31, 0x14, 0x43, 0x83, 0x3d, 0xff, 0xe7, + 0x3f, 0x3b, 0x74, 0x6e, 0xa9, 0x6c, 0xf4, 0x21, 0x87, 0xe3, 0x33, 0xd0, 0x67, 0xb4, 0x84, 0x4e, 0x77, 0xce, 0x49, 0x1d, 0xa0, 0x61, 0xd2, 0x20, 0x76, 0x04, 0x28, 0xb7, 0x81, 0x0e, 0x0a, 0xca, + 0x9e, 0xad, 0xd2, 0x03, 0x46, 0x15, 0xd0, 0xc6, 0xc9, 0x71, 0xbb, 0x5d, 0xb3, 0xe1, 0x22, 0x9a, 0x88, 0x35, 0x21, 0xe1, 0x2e, 0x06, 0x47, 0x6e, 0x58, 0xb6, 0x5a, 0xbd, 0xaa, 0x0e, 0x85, 0x77, + 0x4c, 0x77, 0x19, 0x9f, 0x74, 0x0b, 0x8b, 0x8b, 0x11, 0x4c, 0xf1, 0xf2, 0x13, 0x80, 0xef, 0xf2, 0x18, 0x59, 0x24, 0xdb, 0x96, 0xf7, 0x58, 0xe2, 0x6f, 0x2a, 0xee, 0xc1, 0xec, 0xf6, 0xdc, 0xd0, + 0xf3, 0x16, 0xa3, 0xfd, 0x3c, 0xd5, 0xea, 0x15, 0xec, 0x33, 0x2e, 0x2f, 0xc2, 0x11, 0x1e, 0x36, 0x6b, 0x80, 0x9f, 0x2e, 0xfb, 0xcd, 0x9e, 0x65, 0xd9, 0x8d, 0x0c, 0x74, 0x18, 0xd5, 0xd3, 0x28, + 0x03, 0xb1, 0x36, 0xd4, 0x69, 0x26, 0x95, 0x31, 0xe3, 0x6e, 0xae, 0xa6, 0x60, 0x88, 0x1f, 0x0e, 0xf6, 0xe1, 0x98, 0x1d, 0x10, 0x10, 0x61, 0x4b, 0xb1, 0x0c, 0xcb, 0x65, 0x91, 0x93, 0x91, 0xc8, + 0x9d, 0x8a, 0xae, 0xd8, 0x8b, 0x09, 0xec, 0x04, 0x73, 0x22, 0x65, 0x32, 0xca, 0xf0, 0x1a, 0x71, 0x21, 0x4d, 0xa9, 0xf2, 0xc7, 0xf5, 0xf2, 0xe7, 0xbf, 0xfb, 0x9a, 0x90, 0xf2, 0x87, 0x25, 0xdb, + 0x13, 0xd4, 0x67, 0xcc, 0x9c, 0x8f, 0xe9, 0x03, 0xa5, 0xda, 0x71, 0xba, 0x32, 0x29, 0x43, 0x5f, 0x4f, 0x9d, 0x29, 0x58, 0xe9, 0x6a, 0x49, 0x6f, 0x08, 0x20, 0x87, 0x96, 0xf4, 0xba, 0x0d, 0xed, + 0x88, 0x38, 0xad, 0xf7, 0xd4, 0x2e, 0x48, 0xe6, 0x1b, 0x34, 0x5f, 0xee, 0x97, 0x10, 0x61, 0xda, 0xeb, 0x63, 0x68, 0x8e, 0x23, 0x5e, 0xa1, 0x16, 0xb6, 0x2b, 0x96, 0x8b, 0x72, 0xd6, 0x23, 0x63, + 0x15, 0x2e, 0x84, 0xfd, 0x0e, 0xd5, 0x6a, 0x81, 0x8d, 0xa8, 0x7e, 0xc3, 0x34, 0xff, 0x19, 0x52, 0x6d, 0x40, 0x09, 0xd6, 0xcf, 0x5d, 0xd9, 0xb7, 0x4b, 0xb0, 0x06, 0xb8, 0xb0, 0x73, 0x68, 0x0d, + 0xd2, 0x8e, 0xce, 0xf5, 0x71, 0x01, 0x31, 0x75, 0xa4, 0x75, 0x9b, 0x56, 0x70, 0xf5, 0xa0, 0x6a, 0x75, 0x50, 0x1e, 0xeb, 0x91, 0x29, 0xa0, 0x2b, 0x74, 0xc2, 0x16, 0xfb, 0x22, 0xc4, 0xa1, 0x1d, + 0xc2, 0x6c, 0x0f, 0x0b, 0x72, 0xdc, 0x39, 0x10, 0xdb, 0x38, 0xe1, 0xec, 0x80, 0x2e, 0x36, 0xb0, 0x50, 0x21, 0x53, 0xae, 0x86, 0x0a, 0x07, 0xd8, 0x23, 0x3a, 0xb7, 0xc8, 0xd6, 0x61, 0xad, 0xde, + 0x33, 0x43, 0xee, 0xa1, 0xf2, 0x9f, 0x2c, 0xc1, 0xca, 0xfc, 0xe4, 0xd6, 0x78, 0x39, 0xea, 0xb1, 0xa6, 0xc7, 0x4f, 0x10, 0xcf, 0xa4, 0x49, 0xd2, 0x11, 0x35, 0xb0, 0xdd, 0x31, 0xc5, 0x1f, 0x84, + 0x86, 0x1c, 0xaf, 0x54, 0x6d, 0xeb, 0x6e, 0x81, 0x90, 0x48, 0x59, 0x8b, 0x48, 0x2d, 0xab, 0xc3, 0x79, 0x03, 0xc8, 0x91, 0x72, 0xd3, 0x2a, 0x68, 0x8e, 0x44, 0xc1, 0x4e, 0xc3, 0x19, 0x3d, 0x24, + 0x1b, 0x00, 0x0f, 0x85, 0x29, 0x92, 0xe2, 0x2a, 0x49, 0x63, 0xb3, 0x4e, 0x36, 0x72, 0xcf, 0x20, 0xa6, 0x4b, 0x23, 0x88, 0x43, 0x41, 0x2e, 0xd5, 0x6a, 0x93, 0xcd, 0xba, 0xb5, 0x62, 0x0f, 0x6c, + 0xf2, 0x62, 0x54, 0x69, 0xec, 0x5b, 0xa3, 0x32, 0xba, 0x74, 0xb6, 0xfa, 0x22, 0x92, 0x70, 0x76, 0xd9, 0x15, 0x8e, 0xfd, 0x1c, 0xaf, 0x7b, 0xaf, 0x67, 0xfe, 0xfa, 0xeb, 0xd7, 0x57, 0x5e, 0xf6, + 0x2f, 0x5a, 0x05, 0x9c, 0x51, 0xf2, 0x1c, 0xf9, 0x1b, 0x55, 0x85, 0x91, 0x94, 0x59, 0x5a, 0x9c, 0x61, 0x36, 0x9f, 0x5e, 0x7a, 0x7e, 0xb8, 0xac, 0xec, 0x51, 0xe9, 0x14, 0xfe, 0x39, 0xc2, 0x7f, + 0xb5, 0x29, 0x89, 0x4f, 0x4f, 0x0e, 0xe9, 0xea, 0x97, 0xd7, 0xbe, 0x15, 0x8e, 0xdc, 0xb4, 0x88, 0x8d, 0x6a, 0x54, 0x27, 0x4e, 0x69, 0x19, 0xd9, 0x85, 0x94, 0xe7, 0xdc, 0x8b, 0x77, 0x2e, 0xca, + 0xc2, 0x31, 0xa2, 0x73, 0xcf, 0x43, 0xbf, 0xb8, 0x7c, 0x09, 0xf4, 0xb1, 0x7b, 0x42, 0x69, 0xb8, 0xce, 0xa7, 0x56, 0xa8, 0xbf, 0x9e, 0x2d, 0xde, 0x77, 0xb8, 0x29, 0xd3, 0xc4, 0xb7, 0x46, 0x66, + 0x9a, 0xc6, 0x2f, 0xb8, 0x7b, 0x9f, 0xbf, 0xe8, 0x9d, 0x1b, 0x1e, 0x94, 0x55, 0xe1, 0x18, 0xf1, 0xaf, 0x6f, 0x5c, 0x39, 0x9f, 0xd2, 0x7e, 0xae, 0xac, 0xfb, 0xf4, 0xc3, 0xb0, 0xbe, 0xd1, 0xb7, + 0xf1, 0x7f, 0x4b, 0x07, 0x3e, 0x20, 0xe8, 0xbf, 0x7e, 0xc7, 0xf3, 0x86, 0xf8, 0xfc, 0xcb, 0xd0, 0xde, 0xd2, 0x16, 0xd9, 0xa4, 0xb8, 0x98, 0xa9, 0x58, 0xbb, 0xd8, 0x62, 0x88, 0xa7, 0xec, 0xad, + 0x1d, 0x2e, 0xb3, 0x25, 0x4f, 0xe9, 0x51, 0x50, 0x2a, 0xee, 0x38, 0xc8, 0xf7, 0xa0, 0x83, 0x94, 0xb3, 0x53, 0x3c, 0x63, 0x67, 0xba, 0x9f, 0xc3, 0x1a, 0xaf, 0x64, 0x38, 0x7b, 0xe0, 0xab, 0x7a, + 0xca, 0x11, 0x1b, 0x96, 0xcb, 0x69, 0x15, 0x76, 0x8e, 0x6a, 0x2e, 0x9b, 0x09, 0xaf, 0x6c, 0xf0, 0x59, 0xad, 0xc7, 0xe2, 0xc0, 0x36, 0x3e, 0x4f, 0x14, 0x7a, 0xa6, 0xf5, 0x33, 0x95, 0xb0, 0x4f, + 0xc9, 0xaa, 0x59, 0xe4, 0x57, 0xc8, 0x9b, 0xdf, 0x06, 0x12, 0xe4, 0x33, 0x8f, 0x7f, 0x45, 0x0d, 0xe2, 0x41, 0x5d, 0xf1, 0xf9, 0x05, 0xcf, 0xa4, 0xf8, 0x70, 0x7b, 0x44, 0x0c, 0xd3, 0x20, 0x16, + 0x17, 0x6c, 0x36, 0x25, 0x0b, 0x34, 0x5e, 0x00, 0x56, 0x89, 0x37, 0xe9, 0xc0, 0xd6, 0x5f, 0x7b, 0xe8, 0x1a, 0xed, 0x51, 0x0f, 0x0c, 0x60, 0xbc, 0xe7, 0x24, 0x0d, 0xd8, 0xd2, 0xf3, 0x70, 0x37, + 0x3e, 0xe6, 0xcb, 0x7a, 0x57, 0x2f, 0xfb, 0xc3, 0x12, 0x3b, 0x2a, 0x1d, 0x33, 0xe1, 0xbd, 0xa9, 0xb1, 0x24, 0xc3, 0x90, 0x36, 0x0d, 0xda, 0x97, 0xa7, 0xb1, 0xc9, 0x21, 0xd5, 0x52, 0x81, 0x50, + 0xf1, 0xdc, 0x4e, 0xe9, 0x1b, 0x34, 0x45, 0xf5, 0xad, 0xe8, 0xcc, 0x83, 0xd6, 0x48, 0x54, 0x17, 0x4f, 0x68, 0x88, 0xea, 0x62, 0xa8, 0x0d, 0x82, 0x29, 0x73, 0xa7, 0x2d, 0x0e, 0xc7, 0x7c, 0x3a, + 0x6b, 0xe9, 0x66, 0x4f, 0xf4, 0xc2, 0x1e, 0x60, 0xa6, 0xf1, 0x86, 0x51, 0x18, 0x77, 0xb9, 0x59, 0x55, 0xf3, 0xc6, 0x04, 0xf7, 0x76, 0x26, 0x31, 0x27, 0x04, 0xd7, 0x70, 0x17, 0x3d, 0x69, 0xf6, + 0xdc, 0xee, 0x44, 0x76, 0x3f, 0x6b, 0xc3, 0x88, 0xe2, 0x22, 0xb0, 0x8a, 0x48, 0xe0, 0x64, 0x3a, 0x5c, 0xbe, 0x65, 0xd7, 0xc0, 0x14, 0x07, 0x77, 0x7e, 0xf1, 0x77, 0xe6, 0xb1, 0x16, 0x85, 0x73, + 0xac, 0x23, 0xa3, 0x18, 0x3d, 0x7d, 0x84, 0x11, 0x3d, 0x3b, 0x55, 0x1e, 0xf1, 0x14, 0x0e, 0x4e, 0x53, 0x1e, 0xa0, 0x7e, 0x7f, 0x7a, 0x90, 0x7e, 0x1b, 0xcc, 0xf9, 0x5a, 0x08, 0x21, 0x8f, 0xa8, + 0xe0, 0x17, 0xb0, 0x4f, 0x54, 0x7e, 0x59, 0x9c, 0x63, 0x24, 0x03, 0xb4, 0x71, 0x13, 0x5a, 0xd3, 0x4d, 0x21, 0xeb, 0x29, 0x2c, 0xe9, 0xbc, 0x99, 0xe0, 0x32, 0x3f, 0xdf, 0x64, 0x47, 0x50, 0x8d, + 0x17, 0x12, 0x81, 0xe7, 0xa9, 0xaa, 0x7a, 0xd6, 0x7c, 0xe5, 0x82, 0x26, 0xee, 0x64, 0x51, 0x18, 0x1a, 0x85, 0x06, 0xc5, 0x74, 0x4f, 0x65, 0xd9, 0xc4, 0xa8, 0xb0, 0x38, 0x12, 0x73, 0xa5, 0x54, + 0xb3, 0x4e, 0xa8, 0x0f, 0x47, 0x11, 0xdd, 0xcb, 0x5d, 0x71, 0xe0, 0xb6, 0xbd, 0x86, 0xdf, 0xa3, 0xf5, 0x9f, 0x8a, 0x48, 0x65, 0x85, 0x53, 0x55, 0xfe, 0xcd, 0x29, 0x78, 0x0f, 0xc6, 0x4b, 0xae, + 0x40, 0x2f, 0xe8, 0x3c, 0x5f, 0x0e, 0x8d, 0x98, 0x84, 0x5a, 0x25, 0x62, 0x25, 0xc4, 0xf7, 0xe0, 0x54, 0x05, 0x17, 0x4b, 0x5a, 0xb2, 0x55, 0x8f, 0x71, 0x49, 0x50, 0x88, 0x37, 0xaa, 0xa4, 0x85, + 0xb3, 0x02, 0x2c, 0x40, 0x35, 0x94, 0xd1, 0xa6, 0x5b, 0x00, 0x50, 0x43, 0x19, 0xf1, 0x6e, 0x7a, 0xf2, 0x0d, 0x69, 0xcb, 0xf7, 0x25, 0x25, 0x8c, 0xa3, 0xae, 0x72, 0x79, 0x55, 0x03, 0xc9, 0x5a, + 0x52, 0xd6, 0x0b, 0x95, 0x20, 0xc9, 0x8e, 0x5f, 0x45, 0xd8, 0x3d, 0xe3, 0xfd, 0xb3, 0xae, 0x7c, 0xc5, 0xca, 0xd3, 0x8f, 0xa3, 0xe7, 0xf5, 0xcf, 0x53, 0x65, 0x9f, 0xf6, 0xcb, 0x6f, 0x18, 0xfd, + 0x11, 0x2d, 0x46, 0xd1, 0x13, 0x66, 0x8a, 0x91, 0xe7, 0x44, 0xd9, 0x6d, 0x11, 0xff, 0xa0, 0xc2, 0xfd, 0xfa, 0x1d, 0x6f, 0x29, 0xf5, 0xfe, 0x97, 0xa1, 0x0a, 0x77, 0x6e, 0xae, 0x10, 0x6b, 0x43, + 0x27, 0x85, 0xb1, 0xdd, 0x2a, 0x33, 0x5a, 0x40, 0xb4, 0x56, 0x69, 0x73, 0xb7, 0x8f, 0x98, 0x59, 0xb4, 0x16, 0x0e, 0x87, 0x08, 0xd8, 0x7a, 0x2c, 0xb8, 0x07, 0x38, 0xca, 0xa0, 0x6b, 0x21, 0x02, + 0x53, 0x25, 0x1f, 0xc3, 0x2d, 0xc2, 0xf2, 0x38, 0xb6, 0xf4, 0x20, 0x31, 0xea, 0xe4, 0xad, 0x4d, 0xc9, 0xae, 0x7a, 0x58, 0xa2, 0x56, 0xba, 0xdf, 0x62, 0x3b, 0x59, 0xdc, 0xdc, 0x6d, 0x5f, 0x72, + 0x5b, 0xe2, 0x9d, 0x8d, 0x50, 0xdb, 0x77, 0x2f, 0xb5, 0x77, 0x97, 0x56, 0x2e, 0x3f, 0xa5, 0x1c, 0x31, 0x54, 0x2f, 0x5f, 0x2c, 0xca, 0x1b, 0x74, 0x82, 0x7e, 0xc3, 0x0f, 0x0d, 0x30, 0xbb, 0x42, + 0x3d, 0x53, 0xe6, 0x62, 0xb1, 0x5e, 0x21, 0xdd, 0xa7, 0x85, 0x65, 0xcf, 0x1d, 0x17, 0xb4, 0x0b, 0x75, 0x96, 0x76, 0xf6, 0x14, 0x5e, 0x96, 0xeb, 0xbe, 0x9e, 0xb9, 0x14, 0x0c, 0x41, 0x89, 0x1e, + 0x01, 0xf3, 0x1d, 0xd0, 0x19, 0x96, 0x85, 0x98, 0xac, 0xe5, 0xd8, 0xb8, 0x4b, 0xcb, 0x41, 0x88, 0xf5, 0x80, 0x5a, 0xcd, 0x94, 0xdd, 0xb8, 0xa6, 0x37, 0x9e, 0xe8, 0xd3, 0x01, 0x18, 0xb8, 0xf1, + 0x78, 0x53, 0x43, 0xf1, 0x9a, 0x3d, 0x60, 0xed, 0xc2, 0x66, 0x66, 0xef, 0xe7, 0xba, 0xdf, 0x17, 0x3f, 0xc4, 0x4f, 0x50, 0xf7, 0xc6, 0x18, 0xbf, 0x75, 0xf2, 0x7d, 0x18, 0x81, 0xcf, 0xb0, 0xdf, + 0x20, 0xf2, 0x7a, 0x67, 0x68, 0xc0, 0x09, 0x84, 0x55, 0x9d, 0x02, 0xf6, 0x52, 0x20, 0x13, 0x46, 0xa3, 0x8a, 0x47, 0xce, 0x61, 0x37, 0x36, 0xb9, 0x9d, 0x4a, 0xf1, 0x4c, 0x82, 0xc7, 0x78, 0x3c, + 0x81, 0x1d, 0x59, 0x2b, 0x27, 0x31, 0xbe, 0x33, 0x8a, 0x48, 0x88, 0x4f, 0x60, 0x3b, 0x29, 0x0d, 0x7c, 0xce, 0x1a, 0xa7, 0x79, 0x0c, 0xe1, 0x63, 0x51, 0x96, 0xab, 0x6e, 0x0e, 0xb2, 0x27, 0x10, + 0x3d, 0xe5, 0xe8, 0xae, 0x96, 0x9b, 0x1c, 0x27, 0xf3, 0xe3, 0xf7, 0x36, 0x4c, 0x91, 0x1e, 0x8b, 0xdb, 0x3c, 0x85, 0x3c, 0x94, 0x2f, 0xff, 0x0c, 0xf4, 0x82, 0x89, 0xf3, 0xe5, 0x79, 0xa0, 0xd2, + 0x80, 0x3c, 0x00, 0x72, 0xe3, 0x73, 0x15, 0x1f, 0x45, 0x38, 0x6f, 0x27, 0xab, 0xc5, 0xba, 0x85, 0x21, 0x68, 0x01, 0x50, 0xa7, 0xa5, 0x26, 0xe3, 0x47, 0x15, 0x91, 0x5a, 0xf5, 0x10, 0xee, 0x08, + 0x7f, 0xd9, 0x18, 0x90, 0xa9, 0xf9, 0x95, 0xbe, 0x32, 0x40, 0x6d, 0x5d, 0x6c, 0x4d, 0x3b, 0x3e, 0xa2, 0x05, 0xa2, 0x25, 0x86, 0x6f, 0xf7, 0xb4, 0x54, 0xc7, 0x36, 0xb4, 0xdf, 0x18, 0xeb, 0x42, + 0x8f, 0x66, 0xf4, 0x9e, 0x2e, 0xef, 0xc5, 0x3b, 0xef, 0xfa, 0x41, 0xb1, 0xa1, 0x3c, 0x16, 0x8f, 0xac, 0xc8, 0xff, 0xa6, 0xd9, 0x01, 0xf6, 0x98, 0x2b, 0xf4, 0x15, 0xf0, 0x05, 0xa5, 0xcf, 0xab, + 0xd1, 0x05, 0xe0, 0x7d, 0xb4, 0x7a, 0x33, 0x05, 0x45, 0x72, 0x52, 0xd1, 0x25, 0x9c, 0x36, 0xf7, 0x4b, 0x69, 0xae, 0x54, 0x31, 0xba, 0x40, 0x36, 0xc5, 0x12, 0x3d, 0xaa, 0x4d, 0x3a, 0x09, 0xfd, + 0x48, 0xa3, 0xcb, 0x19, 0x4c, 0xe0, 0x61, 0x09, 0xe7, 0x6e, 0xe4, 0xd5, 0xc7, 0xfd, 0xc4, 0x59, 0x01, 0x5b, 0x78, 0x19, 0x2c, 0x0f, 0x5c, 0xd3, 0x55, 0x68, 0x8a, 0x87, 0x01, 0x41, 0x01, 0x39, + 0x6a, 0x5a, 0x5e, 0x5a, 0xc4, 0x41, 0xd2, 0x0f, 0x3c, 0xc8, 0x57, 0xb6, 0x7f, 0x7c, 0xd3, 0xd6, 0xee, 0x81, 0x24, 0xbd, 0x41, 0xd9, 0xfd, 0x59, 0x91, 0x9e, 0xba, 0x91, 0x61, 0xdb, 0xb7, 0x4d, + 0x8c, 0x87, 0x9c, 0xa7, 0x2f, 0x60, 0x2f, 0xa8, 0xbf, 0x2e, 0xce, 0xfc, 0x3c, 0xc0, 0x79, 0x1a, 0x45, 0x52, 0xb9, 0xe6, 0xb7, 0xca, 0x54, 0xd9, 0xec, 0x30, 0x2c, 0xb0, 0x0b, 0x05, 0x14, 0x51, + 0x32, 0x8f, 0x12, 0xdf, 0xf5, 0xab, 0xe9, 0x06, 0xd0, 0xdb, 0x22, 0x8e, 0x75, 0x2b, 0xdd, 0xae, 0x3a, 0x7e, 0xd5, 0x54, 0xfa, 0x29, 0xeb, 0xf6, 0x50, 0x82, 0x80, 0xe6, 0x14, 0x14, 0xb0, 0x6a, + 0xcc, 0x30, 0x3a, 0x78, 0x5c, 0xb2, 0xb6, 0xae, 0x90, 0xab, 0x75, 0x61, 0xa4, 0x2b, 0x18, 0xd0, 0x0e, 0x1f, 0x3b, 0x4d, 0xdc, 0x54, 0x4d, 0x69, 0xd1, 0x1a, 0x85, 0x7d, 0xf9, 0xc4, 0x4f, 0xbe, + 0x02, 0x3f, 0x7b, 0xfa, 0x8e, 0xeb, 0x54, 0x22, 0xf8, 0x37, 0xfd, 0x00, 0x5d, 0xfe, 0x3a, 0x57, 0x32, 0x0d, 0x20, 0xcd, 0xbb, 0xc2, 0xcc, 0xaf, 0x6d, 0x8c, 0xb7, 0xa5, 0x9a, 0x83, 0x69, 0xf3, + 0x0a, 0xf7, 0x89, 0x38, 0xaf, 0xab, 0x73, 0x4e, 0x32, 0x75, 0x9f, 0x3a, 0x24, 0x39, 0xd5, 0xdb, 0x93, 0x14, 0x9f, 0x56, 0x49, 0x8d, 0x1a, 0x32, 0x8e, 0x21, 0x0a, 0xa0, 0x51, 0xb3, 0x2e, 0x13, + 0x7a, 0xd3, 0x5d, 0x02, 0x13, 0x5c, 0x93, 0xa6, 0x21, 0x5a, 0xab, 0x81, 0x7a, 0x4a, 0x08, 0x18, 0x87, 0x8d, 0xc5, 0x7a, 0x5e, 0x79, 0xea, 0x41, 0xd6, 0x76, 0xf9, 0x0e, 0x66, 0xf1, 0x74, 0xd9, + 0x1c, 0x81, 0x28, 0x30, 0x0c, 0x44, 0x5c, 0xfa, 0xc0, 0xde, 0x6d, 0x26, 0xa2, 0x44, 0xfd, 0xdc, 0xb5, 0x5d, 0x27, 0x9d, 0x75, 0x41, 0xea, 0xd7, 0x7c, 0xfb, 0x90, 0xcc, 0xb8, 0x02, 0x7d, 0x42, + 0xcc, 0xf5, 0xf2, 0x9c, 0xf1, 0x39, 0x40, 0x58, 0x68, 0x72, 0x29, 0x07, 0xb6, 0x0b, 0x04, 0x78, 0x1c, 0x01, 0x1d, 0x48, 0xcc, 0x57, 0xdc, 0x46, 0x37, 0x8b, 0x19, 0x48, 0x65, 0xc8, 0xe1, 0x68, + 0x40, 0xcb, 0x4d, 0x65, 0xe7, 0xbb, 0xc5, 0x01, 0xd1, 0x1c, 0x3c, 0xf5, 0x96, 0x9b, 0x29, 0x5d, 0x1a, 0xd3, 0xe5, 0x92, 0xdf, 0x34, 0x19, 0x0d, 0x08, 0xdb, 0x71, 0x56, 0xec, 0x1b, 0xa7, 0xb1, + 0x35, 0xbd, 0x33, 0x93, 0x00, 0xb1, 0x1a, 0x4a, 0x64, 0x6d, 0xe8, 0x27, 0x5a, 0x7d, 0x48, 0x38, 0x3d, 0xbf, 0xed, 0x91, 0x80, 0x1f, 0xc9, 0xc4, 0xce, 0x9f, 0xb4, 0x55, 0x5e, 0x8e, 0x2e, 0xff, + 0xfc, 0x3e, 0x92, 0xaa, 0xa9, 0xb0, 0xe8, 0x11, 0xc4, 0x18, 0xf7, 0x93, 0xe9, 0x89, 0xaf, 0xf6, 0x1c, 0x00, 0xec, 0x93, 0x9d, 0xdb, 0x9f, 0x22, 0xd7, 0x59, 0xe1, 0x13, 0x33, 0x4f, 0xbd, 0x6c, + 0x9b, 0x67, 0xcb, 0x63, 0x00, 0xab, 0x47, 0xd0, 0x92, 0xcc, 0x6d, 0x25, 0x30, 0x3d, 0x2a, 0xd4, 0xf9, 0xa4, 0xc4, 0x9b, 0x3d, 0x90, 0x05, 0xe3, 0x72, 0x85, 0x9d, 0xb0, 0x4c, 0xa0, 0xb9, 0x68, + 0xef, 0x91, 0x85, 0x75, 0x90, 0x87, 0xb6, 0x6f, 0x2e, 0x7d, 0xdb, 0x19, 0x59, 0x9e, 0x91, 0x24, 0xce, 0xf9, 0xe4, 0x7b, 0x76, 0x8d, 0x7e, 0x91, 0xc6, 0x7c, 0x57, 0xaf, 0xfd, 0x41, 0x07, 0xf7, + 0xe0, 0xd4, 0xe7, 0xbc, 0x76, 0x6a, 0x67, 0x74, 0x6e, 0x0f, 0x57, 0x19, 0x65, 0xf8, 0xcd, 0x01, 0xfb, 0xe7, 0x86, 0xc7, 0x07, 0xd8, 0x4f, 0x14, 0x7d, 0x7f, 0x67, 0x68, 0x3a, 0xa2, 0x50, 0x1b, + 0xc2, 0xd6, 0x20, 0xdc, 0x68, 0xb5, 0xc3, 0x97, 0xc6, 0xf6, 0x20, 0xf5, 0xcb, 0x34, 0x84, 0xb0, 0x65, 0xbf, 0xe3, 0xe1, 0x09, 0x43, 0x18, 0x73, 0xaf, 0xc1, 0x0b, 0x97, 0x57, 0xd1, 0xcd, 0x31, + 0x67, 0x80, 0x35, 0x32, 0xf1, 0x32, 0x5d, 0x4a, 0x98, 0x09, 0xe5, 0x51, 0x3e, 0xa6, 0xcf, 0xc2, 0xf1, 0x96, 0xd2, 0x70, 0x39, 0x0f, 0xa7, 0x63, 0x8e, 0x21, 0x0b, 0xcc, 0x73, 0x02, 0x74, 0x45, + 0xdf, 0x33, 0x43, 0x5e, 0x51, 0xff, 0xbf, 0x5e, 0x50, 0xff, 0x4a, 0x84, 0x37, 0xf5, 0xd8, 0x17, 0xfc, 0xbf, 0x11, 0xe6, 0xc3, 0x48, 0xe4, 0x3a, 0x45, 0x5a, 0xbe, 0x9c, 0x2b, 0xdf, 0x10, 0xfd, + 0xc6, 0x6b, 0x32, 0xa3, 0x2a, 0x9c, 0x34, 0xf9, 0xf6, 0x3d, 0x6d, 0xdb, 0xfe, 0xbe, 0x3e, 0x77, 0x7e, 0xd9, 0x4f, 0xdf, 0x61, 0xa5, 0x49, 0x59, 0x47, 0xd5, 0xd3, 0x67, 0x7f, 0xf7, 0x9a, 0x0b, + 0xd8, 0x33, 0x8d, 0xaf, 0x65, 0xc8, 0x6f, 0x5e, 0x71, 0xbd, 0xfa, 0xb7, 0xef, 0x78, 0xee, 0x86, 0x97, 0xfd, 0x2b, 0xd6, 0x7b, 0xac, 0x87, 0xe4, 0xd7, 0xaf, 0x38, 0x73, 0xe0, 0x57, 0x3f, 0x0c, + 0xed, 0x2d, 0x59, 0x1d, 0x26, 0xb0, 0x04, 0x7b, 0xc7, 0x4e, 0xae, 0xb9, 0x63, 0x94, 0xee, 0xc1, 0x83, 0x56, 0x22, 0x2d, 0x8c, 0xd7, 0xc9, 0x66, 0xef, 0x51, 0xb9, 0x5b, 0x83, 0xf9, 0x64, 0xe7, + 0x7a, 0xbb, 0x83, 0x11, 0x1b, 0x2d, 0xe9, 0x76, 0x5e, 0x1d, 0xaf, 0x0c, 0xa4, 0x9b, 0x67, 0xf6, 0x36, 0xa5, 0xc8, 0xe6, 0x80, 0x22, 0xc5, 0xc2, 0x8a, 0x02, 0x00, 0x73, 0xd5, 0x83, 0xa4, 0x29, + 0xeb, 0x92, 0x66, 0xb9, 0xe6, 0xfb, 0x23, 0xc1, 0xe5, 0x0f, 0x8e, 0x8a, 0xfa, 0x1b, 0xfc, 0xfc, 0x5c, 0x1f, 0xbd, 0x40, 0x7d, 0x41, 0x49, 0x54, 0xd4, 0x67, 0x2c, 0x0c, 0xd0, 0x48, 0x8c, 0xec, + 0x4d, 0xb2, 0x98, 0x84, 0xdc, 0xde, 0xb6, 0x1a, 0x41, 0x72, 0x37, 0x69, 0x87, 0xd1, 0x0b, 0xc3, 0x48, 0x56, 0xe1, 0x2e, 0x92, 0xd5, 0x19, 0xb2, 0x5c, 0xf7, 0xb9, 0x67, 0x2d, 0x4d, 0x6f, 0x3b, + 0x93, 0xf5, 0x86, 0x4c, 0x36, 0xbb, 0x46, 0x5f, 0xda, 0xd6, 0x81, 0x44, 0x21, 0x78, 0xb1, 0x89, 0x1b, 0x15, 0x00, 0x33, 0x48, 0x3e, 0x2e, 0xd4, 0x44, 0x9a, 0xf2, 0xcb, 0x93, 0xef, 0x96, 0x12, + 0xf9, 0x37, 0x3d, 0x5f, 0x43, 0x22, 0xad, 0x85, 0xd1, 0x8e, 0xcc, 0xd4, 0xbe, 0x9d, 0xcb, 0x88, 0x3f, 0xa0, 0xa9, 0x9e, 0x81, 0x82, 0xa3, 0x97, 0xcb, 0xd1, 0x19, 0xd2, 0x7d, 0x3c, 0x52, 0xfd, + 0x3c, 0xef, 0x32, 0x97, 0x15, 0x82, 0xc9, 0x22, 0x9f, 0x7b, 0x47, 0x6d, 0x97, 0x4e, 0x28, 0x63, 0x8c, 0x14, 0xe4, 0xa1, 0x18, 0x6b, 0x00, 0x23, 0x31, 0xee, 0x62, 0x53, 0x82, 0xeb, 0x28, 0x04, + 0xc6, 0xd5, 0x66, 0xd7, 0x57, 0x62, 0xb3, 0xdb, 0x42, 0xb0, 0x20, 0xab, 0x20, 0xca, 0x7a, 0x04, 0xb4, 0x04, 0x0c, 0x8c, 0x8a, 0x2a, 0x2a, 0x2f, 0x27, 0xbd, 0x5f, 0x48, 0x44, 0x94, 0x4e, 0xf6, + 0xee, 0x40, 0xa5, 0x65, 0x76, 0xd7, 0x1c, 0xbb, 0x4f, 0x7d, 0x3b, 0x9e, 0xbe, 0xf5, 0x4d, 0x76, 0xd6, 0xa7, 0x18, 0x99, 0x6f, 0xa5, 0x49, 0x33, 0x8a, 0xfc, 0xcb, 0x90, 0xa1, 0xa7, 0x6d, 0x83, + 0xbc, 0xab, 0x29, 0xae, 0x93, 0xcc, 0xbf, 0x48, 0x13, 0xf8, 0xa1, 0xec, 0xbd, 0xbf, 0xa0, 0xdf, 0x83, 0x88, 0x79, 0x6d, 0x00, 0x7e, 0x83, 0x98, 0x8f, 0xa5, 0xef, 0x3d, 0x03, 0x7d, 0x22, 0xe6, + 0x73, 0x83, 0xf1, 0x81, 0xa9, 0x7b, 0xca, 0x91, 0xa0, 0x63, 0x41, 0xcc, 0xdc, 0x66, 0x35, 0x65, 0x2c, 0x44, 0xa2, 0xa6, 0x72, 0xb6, 0x0e, 0x82, 0xde, 0xae, 0x8a, 0xa4, 0xa1, 0x39, 0x6b, 0xbb, + 0xd6, 0x00, 0x6c, 0x5f, 0xea, 0xa7, 0x29, 0x6c, 0xe8, 0x84, 0xde, 0x17, 0x0b, 0x96, 0x2c, 0xa2, 0x5e, 0x1b, 0x57, 0xea, 0xae, 0xf3, 0x14, 0x7e, 0xbb, 0x5e, 0x1d, 0x21, 0x92, 0x60, 0x54, 0x42, + 0x95, 0x71, 0x5f, 0xcf, 0xa6, 0xd0, 0xd2, 0xbf, 0xdb, 0x0d, 0xf9, 0x6e, 0x8b, 0xf8, 0x6f, 0x5a, 0xaa, 0x23, 0xef, 0x6a, 0x77, 0xce, 0xe8, 0xfd, 0xe6, 0xd9, 0x8f, 0x33, 0xd2, 0xde, 0xa6, 0x4f, + 0xfe, 0xfa, 0x77, 0xfc, 0x5e, 0xfb, 0x74, 0xe2, 0x01, 0x46, 0xf8, 0x09, 0x17, 0x5c, 0xda, 0xc0, 0x7f, 0xc5, 0x08, 0xe4, 0x43, 0xf2, 0xf1, 0x0d, 0xdc, 0xb7, 0xbc, 0x50, 0x67, 0x23, 0x72, 0x98, + 0x8c, 0xec, 0x57, 0xd0, 0x6e, 0x4c, 0x6a, 0x36, 0xb1, 0xcc, 0x26, 0x7c, 0x1c, 0xf1, 0x71, 0xed, 0xe6, 0x5d, 0x38, 0x67, 0x01, 0x70, 0x17, 0x89, 0xce, 0x66, 0x4a, 0xe4, 0xab, 0x49, 0x24, 0xa8, + 0xa4, 0xc7, 0x4d, 0x57, 0x33, 0x0f, 0x5c, 0x92, 0x20, 0x79, 0x9c, 0xa8, 0x73, 0x99, 0x0c, 0x52, 0x56, 0x62, 0x55, 0xd8, 0x5c, 0xe5, 0xa8, 0x81, 0x76, 0x8a, 0xbe, 0x15, 0x4d, 0x31, 0x55, 0xf9, + 0x99, 0x84, 0xa5, 0xde, 0xe3, 0xec, 0xe0, 0xfa, 0x89, 0xfd, 0xdc, 0x2a, 0xff, 0x53, 0xdf, 0xfd, 0x37, 0x5b, 0xe9, 0x89, 0x94, 0xc8, 0xf7, 0xa4, 0xa4, 0x1e, 0x38, 0x9a, 0xfe, 0x73, 0x49, 0x98, + 0x2f, 0x3b, 0xfa, 0xdd, 0xdd, 0xcf, 0xcd, 0x15, 0xbe, 0x56, 0x08, 0xd4, 0x6f, 0xfa, 0xc7, 0xac, 0xf3, 0x01, 0x36, 0x38, 0xfa, 0x78, 0x67, 0x74, 0x86, 0x7b, 0x9f, 0x85, 0xe2, 0xd3, 0x62, 0xca, + 0x98, 0x34, 0x5f, 0xc6, 0xc4, 0x34, 0x15, 0x97, 0xe4, 0x89, 0x03, 0x70, 0x40, 0xc3, 0x3a, 0x98, 0x57, 0x40, 0x8c, 0xf3, 0x71, 0x88, 0xa7, 0x27, 0x78, 0xb9, 0x28, 0xdb, 0x15, 0xba, 0xec, 0x15, + 0x7e, 0x8b, 0x99, 0x6d, 0x08, 0xcf, 0x9a, 0xc0, 0x1e, 0x1f, 0x9b, 0x83, 0x8c, 0x99, 0xfd, 0x0e, 0xab, 0x6a, 0x45, 0xf2, 0x27, 0x30, 0x3e, 0x63, 0x11, 0x17, 0xe7, 0x4c, 0xbe, 0x39, 0xfc, 0xf8, + 0x38, 0xfc, 0x35, 0x02, 0x7f, 0xd4, 0xe6, 0x03, 0x79, 0xa8, 0xe3, 0xcd, 0x4f, 0xdb, 0x7c, 0x20, 0xc3, 0x3a, 0xe0, 0x80, 0xf8, 0x64, 0x2d, 0xa0, 0x3b, 0x48, 0xc6, 0xb4, 0x5d, 0x80, 0x4d, 0xad, + 0xb9, 0xe1, 0x9c, 0x52, 0xa0, 0x48, 0xf5, 0xad, 0xbd, 0x9d, 0xa9, 0x20, 0xc4, 0x88, 0xe2, 0x4e, 0x16, 0x8b, 0xe0, 0xd4, 0x4f, 0xe6, 0x70, 0x5b, 0xa8, 0x1a, 0x5b, 0xce, 0x4d, 0x79, 0xe5, 0x34, + 0x41, 0xb4, 0xe0, 0x01, 0x7d, 0xca, 0x62, 0xa5, 0x1e, 0x2d, 0x0b, 0x9c, 0x9d, 0x62, 0x07, 0x15, 0xea, 0xf2, 0x38, 0x5c, 0x01, 0xce, 0xbd, 0xb3, 0xc4, 0xcf, 0xda, 0x7c, 0x20, 0xbf, 0xe1, 0xf7, + 0x6d, 0x3a, 0xae, 0x18, 0xfb, 0x75, 0x8d, 0x69, 0x7c, 0x4c, 0x29, 0x78, 0x69, 0xf0, 0x81, 0xfc, 0xf5, 0xbf, 0xff, 0xf7, 0x5f, 0xe8, 0xd3, 0x7f, 0xb0, 0xa7, 0xff, 0xe0, 0x6f, 0x9f, 0xfa, 0x61, + 0xab, 0x8f, 0x9f, 0x32, 0xc4, 0xcb, 0x1f, 0xf1, 0xb5, 0x32, 0x26, 0x1f, 0xb0, 0xac, 0x2e, 0x20, 0xc1, 0xd1, 0xf5, 0x62, 0x74, 0x86, 0x72, 0x9f, 0xc0, 0xd6, 0xb8, 0x4f, 0x12, 0x89, 0x5e, 0x05, + 0xcb, 0x5c, 0x21, 0xc8, 0x31, 0x8e, 0xc8, 0xeb, 0x09, 0x81, 0x4f, 0xd6, 0x46, 0xb1, 0x42, 0x08, 0x08, 0x52, 0x67, 0x89, 0x19, 0x5a, 0x86, 0xdf, 0xaa, 0x39, 0x7a, 0xea, 0x40, 0xdc, 0x33, 0x66, + 0xcb, 0xa8, 0xf4, 0x8e, 0x49, 0x16, 0xa4, 0xcd, 0x7a, 0xbf, 0x04, 0x38, 0xd7, 0xc5, 0x68, 0x9b, 0x9a, 0xb3, 0x09, 0x64, 0xfe, 0xff, 0xec, 0xfd, 0x59, 0x97, 0xaa, 0x5e, 0x93, 0x2f, 0x0a, 0xdf, + 0xd7, 0xa7, 0x58, 0xe3, 0x7f, 0xf9, 0xba, 0x5d, 0xb4, 0x02, 0xd6, 0x78, 0x6b, 0x9f, 0x52, 0x50, 0x6c, 0x40, 0x1a, 0x41, 0xc0, 0x8b, 0x3a, 0x83, 0xbe, 0x91, 0xbe, 0x87, 0x8b, 0xe7, 0xb3, 0x9f, + 0xa1, 0x66, 0xe6, 0x4a, 0x33, 0x35, 0x93, 0xe5, 0x7a, 0xfe, 0xa7, 0x6a, 0x9f, 0xf1, 0xdc, 0x64, 0xd2, 0x68, 0x20, 0x31, 0x63, 0xc6, 0x8c, 0x19, 0xcd, 0x2f, 0x08, 0x9c, 0x9c, 0xa4, 0x94, 0x00, + 0x81, 0xdf, 0x69, 0xde, 0x4f, 0xa1, 0xc4, 0x5f, 0x83, 0x62, 0xf8, 0xf1, 0x2b, 0x77, 0x9e, 0x65, 0xee, 0xf7, 0x7d, 0x39, 0x9e, 0x81, 0x01, 0x7f, 0xd4, 0x96, 0x63, 0x10, 0x20, 0x78, 0x36, 0x62, + 0xe7, 0x44, 0xac, 0x89, 0xd0, 0x96, 0x62, 0x72, 0x37, 0x47, 0xe9, 0x49, 0x67, 0x47, 0x4e, 0x99, 0xb2, 0x24, 0x0e, 0x08, 0x4c, 0x76, 0x88, 0xad, 0x79, 0xb4, 0x58, 0x58, 0x59, 0x1f, 0xed, 0x82, + 0x89, 0x65, 0x2e, 0x39, 0x0e, 0xe5, 0x12, 0x22, 0x0b, 0x9b, 0xe3, 0x02, 0x91, 0x19, 0x09, 0x19, 0x1d, 0xfd, 0x08, 0x5a, 0x12, 0xdb, 0x0c, 0x35, 0xe7, 0xb1, 0x7f, 0xda, 0x79, 0x21, 0xc9, 0x86, + 0xdf, 0x71, 0x79, 0xf0, 0x2a, 0xf3, 0x35, 0x83, 0x6f, 0x93, 0x74, 0xee, 0x6f, 0xaa, 0x9e, 0xe9, 0x5a, 0xf8, 0x81, 0xf6, 0x8b, 0xe1, 0xf0, 0xee, 0xca, 0x90, 0xae, 0x85, 0x97, 0x1c, 0xdf, 0x13, + 0xe0, 0xac, 0xc9, 0x7d, 0xb7, 0xf6, 0x12, 0xab, 0xed, 0xa0, 0x35, 0xb5, 0x85, 0x57, 0x7a, 0x7f, 0xb2, 0xe9, 0x60, 0x1f, 0xd9, 0xfd, 0x4c, 0x51, 0x61, 0xdb, 0xb5, 0xca, 0x4d, 0xac, 0x79, 0x65, + 0xbf, 0x5d, 0x14, 0x73, 0x7e, 0x93, 0x34, 0xe1, 0x1a, 0x5b, 0x62, 0x0c, 0x6f, 0x4c, 0xca, 0x6c, 0x2d, 0xac, 0x99, 0x9c, 0x35, 0x5a, 0x18, 0xde, 0x4f, 0x12, 0x84, 0xae, 0x36, 0x7a, 0xcd, 0x57, + 0x1f, 0xc3, 0x2e, 0x8f, 0x41, 0xa5, 0x92, 0xbc, 0x1c, 0x9b, 0x49, 0x5c, 0xe6, 0x49, 0x18, 0xda, 0xf9, 0x5f, 0xff, 0x7e, 0xaf, 0x3d, 0x8e, 0x51, 0x39, 0xce, 0xcb, 0x3d, 0xec, 0x63, 0x62, 0x9c, + 0x5d, 0xdb, 0xf1, 0xa5, 0xe4, 0xe1, 0xfc, 0x3d, 0xe4, 0x6e, 0x16, 0xde, 0x8b, 0x29, 0x71, 0x1b, 0x21, 0x3d, 0xcf, 0x9a, 0x4b, 0x96, 0xdc, 0xff, 0x6d, 0xd9, 0x66, 0x62, 0xbd, 0x90, 0x87, 0x7e, + 0x22, 0xbf, 0x6d, 0x3b, 0xfe, 0x17, 0x04, 0xff, 0x84, 0xe1, 0x9f, 0xe0, 0x59, 0x09, 0xfe, 0x17, 0x74, 0xe9, 0x23, 0x7a, 0x39, 0xfe, 0xdf, 0xff, 0x01, 0x0d, 0x0d, 0xee, 0x9e, 0x47, 0xce, 0xf2, + 0xf3, 0x47, 0x56, 0x25, 0xf2, 0xd4, 0x8c, 0x7b, 0x25, 0xfa, 0x22, 0x19, 0xe7, 0xc3, 0x31, 0x32, 0x6c, 0xbe, 0x79, 0xdc, 0x1e, 0x24, 0xa6, 0x49, 0x4c, 0x88, 0x56, 0x95, 0x59, 0x86, 0x57, 0x0b, + 0x93, 0x23, 0x82, 0xcf, 0xc0, 0xc5, 0x3e, 0x28, 0xb2, 0x1e, 0xcb, 0x62, 0xd1, 0x74, 0x9c, 0x82, 0x95, 0x11, 0x74, 0x3a, 0x59, 0x56, 0x92, 0x95, 0xed, 0xa3, 0x11, 0x6e, 0x78, 0x1b, 0x78, 0xba, + 0xa9, 0xd7, 0x5c, 0x31, 0xa7, 0x16, 0x8b, 0x58, 0x8f, 0x27, 0x14, 0x5f, 0x4d, 0x4b, 0x44, 0x4a, 0xa6, 0x07, 0x31, 0x64, 0xfb, 0xe7, 0x97, 0xad, 0xcf, 0x9d, 0x2b, 0x9e, 0x30, 0x0a, 0x87, 0x16, + 0x34, 0x7c, 0xc8, 0xb4, 0xbc, 0xaf, 0x01, 0x9f, 0xdc, 0xee, 0xbd, 0x11, 0xbe, 0x8e, 0xc9, 0xdb, 0xe9, 0x18, 0x1c, 0xb6, 0xed, 0x9b, 0xe0, 0x4e, 0x9e, 0xd3, 0x2c, 0xc0, 0x91, 0x12, 0x93, 0x31, + 0xdc, 0xcc, 0x03, 0x23, 0xef, 0x30, 0x9b, 0x1e, 0xe6, 0xec, 0xca, 0x1a, 0x4d, 0x65, 0xfc, 0x68, 0xc0, 0xd2, 0x8a, 0xa5, 0xad, 0xb9, 0x9c, 0x1c, 0x0f, 0x5c, 0x49, 0x1b, 0x9b, 0x3e, 0x68, 0x0b, + 0x8d, 0xa6, 0x36, 0xc8, 0x6c, 0x3a, 0xd3, 0x34, 0x92, 0x47, 0xbd, 0x18, 0xeb, 0x20, 0xe9, 0x60, 0xe8, 0x9c, 0xd3, 0x2b, 0x65, 0x34, 0xa1, 0x97, 0xee, 0x6f, 0x78, 0xe7, 0x7f, 0x40, 0xf0, 0xd0, + 0x44, 0x93, 0xb7, 0x96, 0x58, 0xf7, 0x25, 0xfa, 0x99, 0xbc, 0x92, 0x2b, 0xc9, 0x0b, 0xef, 0x2e, 0x88, 0xef, 0x43, 0x91, 0xb5, 0x4a, 0x6a, 0x46, 0xb8, 0x53, 0x42, 0xb1, 0xc1, 0xde, 0x02, 0xe9, + 0xfa, 0x60, 0xb3, 0xd2, 0x54, 0xcf, 0x17, 0x5c, 0x2c, 0x35, 0xd3, 0x8c, 0x05, 0x11, 0x66, 0x6a, 0x6e, 0x54, 0x9d, 0x0c, 0x72, 0x3f, 0x85, 0x38, 0x0e, 0xc7, 0x50, 0x91, 0x9a, 0x33, 0x73, 0x27, + 0x9f, 0xa3, 0x66, 0xd3, 0xef, 0x68, 0x2a, 0x98, 0x70, 0xb3, 0x89, 0x9f, 0x74, 0x11, 0x39, 0xa5, 0x4f, 0x7e, 0xef, 0x2a, 0x1b, 0xea, 0x4f, 0xf2, 0xe4, 0xae, 0x70, 0xf5, 0x57, 0xed, 0xf3, 0xd7, + 0xfd, 0xbc, 0xcd, 0x32, 0xf7, 0xd3, 0x5f, 0xd8, 0xf9, 0xcf, 0x96, 0x26, 0x0e, 0x5b, 0xa2, 0x5c, 0xbb, 0x4d, 0x7f, 0xa6, 0x79, 0x52, 0x26, 0xe7, 0x75, 0xf9, 0xa7, 0x13, 0xea, 0xee, 0xa3, 0xf8, + 0x0a, 0xf4, 0x54, 0xa6, 0xd6, 0xfd, 0x47, 0x5c, 0x86, 0xf1, 0xde, 0x8d, 0x0b, 0x00, 0xf0, 0x80, 0x61, 0x85, 0x47, 0x02, 0x48, 0x4e, 0xdc, 0xe9, 0x04, 0xe2, 0x42, 0x2d, 0xdc, 0xf4, 0x58, 0x57, + 0x4d, 0x00, 0x16, 0x41, 0xd6, 0x66, 0xb1, 0xd8, 0x33, 0x21, 0xe3, 0x14, 0xdd, 0x5a, 0x67, 0x36, 0x3a, 0x8d, 0x2e, 0x67, 0x70, 0x8e, 0x76, 0x3c, 0xc1, 0xd6, 0x07, 0x76, 0x23, 0xcb, 0x3c, 0xe0, + 0x1c, 0xe6, 0xa7, 0x7d, 0x6a, 0x18, 0xc6, 0x31, 0xdc, 0x4f, 0xdc, 0x2e, 0x36, 0x16, 0x0a, 0xe3, 0xa7, 0xbe, 0xaf, 0xfa, 0xdf, 0x55, 0xfa, 0xfc, 0x1d, 0x40, 0x53, 0xf8, 0xff, 0x71, 0x40, 0x53, + 0xd7, 0x81, 0x7b, 0xbc, 0x5c, 0x3d, 0x53, 0x28, 0xff, 0x42, 0xf3, 0x4d, 0x2c, 0xd2, 0x4b, 0xc5, 0xd7, 0x00, 0x39, 0x38, 0x72, 0xeb, 0xde, 0x22, 0xba, 0x43, 0x21, 0x08, 0x33, 0x3c, 0x20, 0x68, + 0x72, 0x1f, 0xf2, 0xb4, 0xda, 0xb8, 0x13, 0xde, 0x89, 0x66, 0x50, 0x94, 0x67, 0xe0, 0x86, 0x47, 0x63, 0xda, 0xf3, 0x26, 0x28, 0xa3, 0x6f, 0x77, 0x48, 0x6b, 0xe9, 0x3e, 0x50, 0xaf, 0x64, 0xaa, + 0xc2, 0xd1, 0x74, 0xdb, 0x1c, 0x08, 0xae, 0x2d, 0x6c, 0x76, 0x8f, 0x4d, 0x2a, 0x78, 0xb7, 0x8e, 0x92, 0x42, 0x30, 0xf7, 0x14, 0xf8, 0x9d, 0x1c, 0x0c, 0x9e, 0x79, 0x7f, 0x3c, 0x28, 0x51, 0x57, + 0x94, 0xbe, 0xa9, 0x97, 0xb6, 0x3e, 0x68, 0x60, 0xae, 0xeb, 0x89, 0x93, 0x27, 0xd1, 0x2f, 0x0d, 0x73, 0x7f, 0x9b, 0x0c, 0x3e, 0x65, 0x74, 0x7e, 0xa2, 0x7f, 0x19, 0xb0, 0x4f, 0x57, 0x2f, 0x39, + 0x12, 0x03, 0x8c, 0x4f, 0xd5, 0x01, 0x63, 0xc5, 0xc6, 0xc4, 0xc2, 0xee, 0xfd, 0x25, 0x5b, 0x8d, 0x66, 0xe9, 0xd4, 0xf0, 0x7d, 0xd9, 0x88, 0xd2, 0x30, 0xc3, 0xf6, 0x53, 0x20, 0x1d, 0xe1, 0x0d, + 0xae, 0xa9, 0x3c, 0xb0, 0x99, 0xaf, 0xbc, 0x5c, 0xa6, 0x28, 0xd9, 0x6b, 0xf4, 0x51, 0x3d, 0xdb, 0x75, 0x95, 0x51, 0x65, 0xce, 0x51, 0x91, 0x6a, 0x5b, 0x06, 0x00, 0x4a, 0x3b, 0xd0, 0x05, 0x45, + 0xe3, 0xe2, 0x96, 0x01, 0xea, 0x45, 0xf3, 0x1b, 0x2b, 0xda, 0xe0, 0x42, 0xc7, 0x5f, 0xdb, 0xe2, 0xfb, 0x9a, 0x11, 0x7a, 0x06, 0xdc, 0xf0, 0xe5, 0x63, 0x17, 0x1e, 0x5e, 0x8e, 0xc6, 0x57, 0x42, + 0xdf, 0x33, 0xce, 0x37, 0x47, 0xf8, 0x46, 0xf3, 0x0f, 0xc4, 0xc1, 0x87, 0xbb, 0x5e, 0xa0, 0x97, 0x0a, 0x77, 0xf2, 0x8f, 0xd4, 0xe4, 0x38, 0xed, 0x71, 0x0e, 0x3e, 0x7a, 0xd1, 0x54, 0x65, 0x75, + 0xa9, 0xb5, 0x36, 0x8b, 0x76, 0xab, 0x17, 0xbe, 0xbd, 0x24, 0xf3, 0x51, 0xa7, 0x1e, 0x01, 0x25, 0x52, 0x0b, 0xf3, 0xb4, 0xf2, 0xb7, 0x21, 0x04, 0xeb, 0x39, 0xd8, 0x61, 0xaa, 0xaf, 0x52, 0x2d, + 0x12, 0xa1, 0xe2, 0x2a, 0x86, 0x9e, 0x4f, 0x85, 0xbc, 0x29, 0x5f, 0xbc, 0x06, 0xa5, 0xff, 0x3b, 0x02, 0xcc, 0xaf, 0x5c, 0x3c, 0x4b, 0xe2, 0xc3, 0xdd, 0xd6, 0x73, 0xa6, 0xc7, 0x2f, 0xc2, 0xef, + 0x46, 0xeb, 0x22, 0xf1, 0x03, 0xd3, 0xf5, 0x53, 0x03, 0x60, 0xb5, 0x48, 0x2d, 0xca, 0xd9, 0xa9, 0x2b, 0xc4, 0x65, 0x4b, 0xa4, 0xfe, 0x6e, 0x0d, 0x95, 0xf4, 0x72, 0x27, 0xac, 0x97, 0x33, 0xa4, + 0x3e, 0x2d, 0x10, 0x3a, 0x43, 0x17, 0xd5, 0x0c, 0xb2, 0x96, 0x98, 0xbb, 0x4a, 0x81, 0x51, 0xed, 0x1e, 0xb3, 0x82, 0xa4, 0x37, 0x7a, 0x5a, 0x77, 0xc4, 0x0e, 0x11, 0x46, 0x68, 0x82, 0x2f, 0x9b, + 0x3a, 0xab, 0xf8, 0x8d, 0x19, 0x1f, 0x71, 0x51, 0xeb, 0xd0, 0xef, 0xcc, 0x90, 0x6f, 0xa4, 0x7f, 0x08, 0x02, 0x5e, 0x6e, 0x17, 0x55, 0xf4, 0xd0, 0xdb, 0x02, 0x3e, 0xcb, 0xce, 0x33, 0xcd, 0x2b, + 0x27, 0xcf, 0x47, 0x63, 0xf0, 0x7b, 0x26, 0x42, 0x63, 0xc2, 0x0e, 0x40, 0xcd, 0x16, 0xe8, 0x3d, 0xc6, 0xd9, 0x6e, 0x46, 0x10, 0x08, 0x99, 0xb1, 0xbe, 0x04, 0xae, 0x8e, 0xd0, 0xe9, 0x59, 0xc1, + 0x2d, 0xbd, 0x3c, 0xa9, 0xdc, 0xcb, 0xce, 0xe2, 0x1f, 0xf0, 0x05, 0xb1, 0x76, 0x08, 0x47, 0x1e, 0xfb, 0x46, 0x9e, 0x29, 0x89, 0xc9, 0xed, 0xab, 0x51, 0x5b, 0x5e, 0xf6, 0x01, 0x03, 0xb4, 0x26, + 0x0b, 0x1a, 0x88, 0xa6, 0x08, 0x05, 0x2e, 0x22, 0xc7, 0x29, 0x84, 0x2b, 0xa2, 0xd0, 0x41, 0xab, 0xd5, 0x0c, 0x9f, 0xeb, 0x38, 0x45, 0x78, 0xf5, 0xd1, 0xc5, 0xe4, 0xc5, 0x24, 0x62, 0xba, 0xd3, + 0xa6, 0x15, 0x0e, 0x0b, 0x38, 0xa8, 0xc0, 0xb5, 0x6a, 0xd0, 0xa1, 0xbe, 0xe2, 0xf9, 0xf0, 0xa4, 0x8d, 0x94, 0x1d, 0xde, 0x2c, 0xf9, 0x51, 0x23, 0xb3, 0x6a, 0x34, 0x5f, 0xce, 0x40, 0xfd, 0x80, + 0xd5, 0x1a, 0x2d, 0xfc, 0x86, 0xd6, 0x1c, 0xc6, 0xa5, 0xaa, 0xb8, 0x96, 0xa0, 0xdd, 0x57, 0x98, 0xcf, 0x44, 0xda, 0x5f, 0x68, 0x5e, 0xb8, 0x75, 0x39, 0xba, 0x64, 0x8e, 0x0f, 0x88, 0xa5, 0xcb, + 0xd3, 0x78, 0x45, 0x10, 0x3a, 0xe2, 0x98, 0x80, 0x7d, 0x22, 0x97, 0x50, 0x08, 0x02, 0x32, 0x0f, 0xad, 0x93, 0xc2, 0xaf, 0xd6, 0x41, 0x27, 0x79, 0xb8, 0x37, 0xaf, 0xd5, 0x03, 0xbb, 0xd2, 0xdc, + 0x83, 0xe9, 0xd0, 0x75, 0x49, 0x4c, 0x71, 0xd5, 0xad, 0x02, 0x58, 0xe6, 0x18, 0xca, 0x5e, 0x4f, 0xe6, 0x34, 0x1c, 0xe1, 0x40, 0xd5, 0x74, 0x3a, 0x73, 0x90, 0x30, 0xc7, 0x28, 0xc9, 0x46, 0xea, + 0xfa, 0xef, 0xd7, 0x19, 0x3f, 0xb9, 0xe6, 0xd8, 0xfd, 0xef, 0xff, 0xf8, 0x54, 0x4c, 0xf8, 0xcc, 0x12, 0xe4, 0x58, 0xe6, 0x3f, 0xd7, 0x32, 0x77, 0x2c, 0xf3, 0xcc, 0x4b, 0xc7, 0x32, 0x87, 0x5a, + 0xdd, 0x07, 0xd8, 0x4b, 0x6a, 0xab, 0x5f, 0x1a, 0x9c, 0x8f, 0xe3, 0x80, 0xa2, 0x07, 0xfa, 0x9e, 0x55, 0x4f, 0x30, 0xc7, 0x44, 0xa3, 0x76, 0xb7, 0xb6, 0x05, 0x8b, 0x65, 0xab, 0x39, 0xee, 0x9b, + 0x01, 0x6e, 0x9c, 0xb0, 0xde, 0x87, 0x97, 0x04, 0x4d, 0xcf, 0x5a, 0xdf, 0x35, 0x63, 0x6a, 0x99, 0x6e, 0x56, 0xc6, 0xae, 0xdb, 0x99, 0x6e, 0xb7, 0xa1, 0x7c, 0x7e, 0x44, 0xc4, 0x5c, 0xae, 0x4d, + 0xcc, 0x23, 0x9d, 0x7f, 0x5d, 0x6b, 0x95, 0xfb, 0x51, 0xae, 0x3b, 0x5f, 0xec, 0x24, 0x9f, 0x98, 0x71, 0x17, 0x92, 0xe7, 0x57, 0xbf, 0x1c, 0x5c, 0x76, 0x92, 0x03, 0xe6, 0xdd, 0xe6, 0x78, 0xda, + 0xb0, 0xc7, 0xd3, 0x8c, 0x5e, 0x2e, 0x79, 0x1e, 0xd6, 0x32, 0xf5, 0xa8, 0xf2, 0x06, 0x1b, 0xb2, 0x73, 0xb7, 0x68, 0xfb, 0x05, 0xb1, 0x66, 0x0a, 0x34, 0x64, 0xd7, 0x2a, 0x00, 0x27, 0x20, 0x33, + 0x95, 0xe7, 0xcd, 0x94, 0x03, 0x34, 0x24, 0xc1, 0x9a, 0x65, 0x03, 0xf8, 0x53, 0x8d, 0xd1, 0x53, 0x53, 0xde, 0x28, 0x4d, 0x66, 0xf8, 0xc8, 0xc9, 0x6a, 0xd7, 0xbc, 0x45, 0x62, 0xb0, 0xb4, 0x7e, + 0xde, 0x2f, 0xe2, 0x86, 0xc9, 0xa5, 0x8d, 0xdb, 0x7f, 0xe1, 0x97, 0x5d, 0xc6, 0xab, 0x00, 0xbd, 0x7d, 0xf3, 0x93, 0x9f, 0xf8, 0x8d, 0x93, 0x1f, 0x0b, 0x34, 0xff, 0x78, 0x85, 0xf6, 0x0b, 0x5d, + 0x37, 0x07, 0x85, 0xc8, 0xaa, 0x0b, 0x3e, 0x8b, 0x1e, 0x86, 0x97, 0xfc, 0xb5, 0xfb, 0xb2, 0xfc, 0x94, 0x7b, 0xe5, 0x1d, 0xe1, 0xf3, 0xc0, 0xbe, 0x3b, 0xbd, 0x64, 0x7e, 0x0d, 0x90, 0xed, 0x49, + 0x88, 0x1e, 0xba, 0xa3, 0x48, 0x60, 0xcc, 0x11, 0x08, 0xa9, 0xf6, 0x28, 0x89, 0x58, 0x90, 0x31, 0xc4, 0x6c, 0xb9, 0x80, 0xf7, 0xe0, 0x7a, 0xc9, 0xb0, 0x3c, 0x8c, 0xcd, 0x8c, 0xa0, 0x60, 0x0e, + 0x33, 0xaa, 0x5d, 0x59, 0xde, 0x1c, 0x30, 0x41, 0x5a, 0x2e, 0x56, 0xa3, 0x0e, 0x99, 0xca, 0x0e, 0xe9, 0x23, 0x56, 0xdf, 0x13, 0x5c, 0x28, 0x54, 0x7c, 0x14, 0xeb, 0x1b, 0x8e, 0x4d, 0xa8, 0x95, + 0x30, 0xff, 0x6e, 0x78, 0xff, 0x95, 0xf9, 0xf5, 0xf0, 0x31, 0x83, 0x32, 0xbf, 0x06, 0xcc, 0x93, 0xcf, 0x69, 0x87, 0x57, 0xa8, 0x3f, 0x78, 0x80, 0xbc, 0x5e, 0xca, 0xaa, 0xdf, 0x1c, 0xd0, 0xf7, + 0xc4, 0x75, 0xf2, 0x54, 0x3d, 0xe0, 0x3b, 0xba, 0xc0, 0xf8, 0xfd, 0xd9, 0x25, 0x05, 0x64, 0x40, 0xcc, 0x3f, 0x4f, 0x91, 0x7d, 0x02, 0xe2, 0x5b, 0xd3, 0x8a, 0xa2, 0xad, 0x41, 0xd7, 0xae, 0xbe, + 0x6b, 0x85, 0xfd, 0x26, 0xc7, 0x0d, 0xfa, 0xb0, 0x3f, 0x9c, 0x26, 0xfb, 0xe9, 0x22, 0x83, 0x96, 0xa3, 0x34, 0x35, 0xc4, 0x04, 0x07, 0x47, 0x9a, 0xad, 0x53, 0xed, 0xa9, 0x99, 0x50, 0x16, 0xb1, + 0xe3, 0x77, 0x23, 0x9a, 0xc2, 0x8c, 0x20, 0xd6, 0x22, 0xf8, 0x50, 0xf1, 0x15, 0xa9, 0x46, 0x69, 0xa5, 0xd5, 0x11, 0xa9, 0xde, 0xd8, 0x00, 0xff, 0x92, 0xcc, 0x87, 0x8f, 0x19, 0x24, 0x99, 0xdf, + 0x08, 0xd5, 0xc5, 0xcd, 0xf1, 0xa8, 0xb7, 0x3a, 0xfc, 0x94, 0x59, 0xfd, 0x8e, 0xee, 0xab, 0x50, 0x5d, 0xcf, 0x2e, 0xdb, 0xf1, 0x01, 0x1a, 0x90, 0xd7, 0xe5, 0xfd, 0xb2, 0x90, 0xf5, 0xdd, 0xae, + 0xda, 0x36, 0xa7, 0xb9, 0x1f, 0x24, 0x33, 0x7e, 0x35, 0xdb, 0x62, 0x80, 0xcd, 0x62, 0x07, 0x3f, 0xaf, 0x3b, 0x5e, 0x09, 0x8f, 0xf8, 0x7c, 0x26, 0x74, 0x28, 0x35, 0xf2, 0xc8, 0xda, 0x43, 0xe7, + 0x58, 0xb8, 0xa6, 0x47, 0x31, 0x6f, 0x79, 0xc6, 0xd2, 0x59, 0x1b, 0xfc, 0xc8, 0x95, 0xe8, 0xb9, 0x99, 0x5b, 0x05, 0xa7, 0xcb, 0x05, 0xb8, 0x1c, 0x1d, 0xe7, 0x9c, 0x30, 0x2c, 0x16, 0x74, 0xb5, + 0xaa, 0xff, 0xfa, 0x07, 0x38, 0x10, 0x84, 0xf3, 0x11, 0xe0, 0xc1, 0x7d, 0x76, 0xa2, 0x4f, 0xa4, 0x14, 0xdf, 0x7d, 0xc2, 0x2b, 0x63, 0x3f, 0x5e, 0x1f, 0x5f, 0x9e, 0xf1, 0x3d, 0x8b, 0x6d, 0xd8, + 0xa0, 0x66, 0xb0, 0xb2, 0x91, 0xc0, 0xa6, 0x2d, 0xec, 0x83, 0x85, 0x86, 0x05, 0xc5, 0xa3, 0x23, 0x84, 0xdb, 0xa9, 0xd8, 0x2a, 0x65, 0x55, 0x41, 0x87, 0x8e, 0xde, 0x52, 0xc0, 0xf7, 0xf2, 0x88, + 0x0e, 0x6a, 0x4e, 0x24, 0xa3, 0xbd, 0x67, 0x90, 0x6c, 0x58, 0xe6, 0xe5, 0x9a, 0x72, 0x4e, 0x9a, 0x77, 0x58, 0xe5, 0x9c, 0xc9, 0x97, 0xc1, 0x68, 0xeb, 0x45, 0xd4, 0xdc, 0xe2, 0xad, 0x23, 0x05, + 0xfd, 0x8e, 0x0f, 0x7f, 0x50, 0xd9, 0xc6, 0xf9, 0x15, 0xf3, 0xaf, 0xf5, 0x1e, 0xfc, 0x14, 0xea, 0xf9, 0x7b, 0xc2, 0x2f, 0xac, 0x7c, 0x3d, 0xbd, 0xd4, 0x28, 0x0c, 0xb0, 0xc2, 0xb4, 0x63, 0x82, + 0x6c, 0x09, 0x78, 0x4f, 0xe1, 0xa2, 0xdf, 0xf9, 0xe0, 0x02, 0x5a, 0x08, 0x7c, 0x12, 0x30, 0x3d, 0x7e, 0x4a, 0xed, 0x34, 0xde, 0x0b, 0xeb, 0xe9, 0xba, 0xe3, 0x8d, 0xd5, 0xca, 0x85, 0x54, 0x55, + 0xb5, 0x6b, 0x63, 0x62, 0x6d, 0xd6, 0x78, 0x99, 0x76, 0x3b, 0x78, 0x46, 0xb5, 0xb4, 0x29, 0x18, 0x2b, 0x1a, 0xaf, 0xcd, 0x4e, 0x5c, 0x9d, 0x40, 0xd3, 0x68, 0x32, 0x53, 0xc8, 0x7d, 0xb9, 0xfc, + 0x3a, 0x2f, 0xb6, 0xb0, 0xcd, 0x2a, 0x7f, 0x41, 0xd7, 0xfb, 0x0a, 0xa4, 0x09, 0x7e, 0xaa, 0xc5, 0xc5, 0x27, 0xea, 0x97, 0x34, 0x84, 0x0f, 0xd7, 0xc6, 0xf0, 0xb0, 0x46, 0x17, 0x98, 0x2e, 0x8f, + 0xc4, 0xa6, 0xb0, 0xfb, 0x06, 0x3f, 0x88, 0x04, 0x10, 0x77, 0xf5, 0x56, 0x6a, 0x09, 0x21, 0x55, 0x56, 0xd3, 0x65, 0x6e, 0x6a, 0xbe, 0xaa, 0x86, 0x19, 0x89, 0xf6, 0x13, 0x6b, 0xa2, 0x0a, 0x73, + 0x4a, 0xcc, 0x4a, 0xc3, 0x29, 0xc4, 0x20, 0x6e, 0xe8, 0xee, 0x6c, 0x97, 0xba, 0x96, 0xb5, 0x2b, 0x95, 0x55, 0xb5, 0x38, 0x4d, 0xb9, 0xd9, 0x4e, 0x4e, 0x4a, 0x06, 0xc6, 0xb2, 0x6b, 0xa3, 0x8b, + 0xaf, 0xb8, 0xf3, 0x45, 0x3a, 0x06, 0xfe, 0x73, 0xf2, 0xc4, 0x46, 0xef, 0x63, 0x3a, 0xc6, 0x85, 0xca, 0xf7, 0x2f, 0x0f, 0x19, 0xe4, 0x7e, 0xb1, 0x3f, 0x60, 0x7c, 0x3d, 0xf2, 0x61, 0x68, 0x55, + 0xa7, 0x6d, 0x8a, 0x50, 0xed, 0x28, 0xdd, 0x53, 0x44, 0xb8, 0xe6, 0x4b, 0xa2, 0x3a, 0x04, 0x62, 0xde, 0xce, 0xe4, 0x12, 0x88, 0x8d, 0xa2, 0xd1, 0xcc, 0x51, 0xb9, 0xc5, 0x34, 0xd8, 0x28, 0x7d, + 0x99, 0x09, 0x2c, 0x74, 0xe4, 0xc4, 0x19, 0x34, 0xe1, 0xd5, 0x51, 0x9c, 0x09, 0x14, 0x89, 0x73, 0x4e, 0x89, 0x2b, 0xa7, 0xc6, 0x1c, 0x18, 0xcb, 0x0e, 0xf3, 0x6a, 0x6c, 0xea, 0xa6, 0x77, 0xf5, + 0x80, 0x61, 0x03, 0x11, 0x53, 0xee, 0xa5, 0x6e, 0x3c, 0x57, 0x01, 0x3e, 0x64, 0x56, 0xdb, 0xe5, 0xd8, 0x4c, 0x92, 0x93, 0x6f, 0x5f, 0x65, 0xea, 0xf1, 0xd4, 0x7e, 0x26, 0xe0, 0xfc, 0x89, 0xfa, + 0x65, 0xf8, 0x3e, 0x5c, 0x1b, 0xda, 0x03, 0x5e, 0x3c, 0xc4, 0x07, 0xa1, 0x95, 0xd4, 0xca, 0xce, 0x4f, 0xd8, 0x04, 0x51, 0x9d, 0x2a, 0xf4, 0xb9, 0x76, 0xce, 0x13, 0xd0, 0xde, 0x01, 0x47, 0x99, + 0x23, 0x2c, 0x70, 0x84, 0x59, 0x6b, 0x5b, 0xb3, 0x63, 0xb5, 0x15, 0x3d, 0x45, 0x67, 0xd5, 0x0a, 0x3c, 0xb9, 0xb9, 0x90, 0x8a, 0x54, 0x25, 0x1d, 0xe3, 0x7d, 0x14, 0xa4, 0x5d, 0xb1, 0x8a, 0xfa, + 0x76, 0xa3, 0x6e, 0x77, 0x8e, 0x8e, 0xf1, 0xc1, 0xd2, 0xeb, 0xbe, 0x6e, 0xef, 0x58, 0xd8, 0xe5, 0x5b, 0x28, 0x2a, 0x79, 0xb4, 0xdf, 0x7c, 0x6e, 0x73, 0x72, 0x4b, 0xfa, 0xca, 0x97, 0x77, 0x17, + 0x86, 0x6e, 0x50, 0x16, 0x13, 0x86, 0x52, 0x71, 0x25, 0x4f, 0x89, 0xc9, 0xd6, 0x0f, 0x27, 0x86, 0x77, 0xac, 0x51, 0x2c, 0x20, 0x02, 0xce, 0x36, 0x92, 0x6d, 0x36, 0xd9, 0xb0, 0x91, 0xc6, 0x22, + 0xee, 0x81, 0xb6, 0xe8, 0x15, 0xd1, 0x2e, 0x53, 0x5e, 0x51, 0x65, 0xb6, 0xd8, 0xe5, 0x21, 0x47, 0x91, 0xf9, 0x29, 0x69, 0xd9, 0x85, 0xbd, 0xf3, 0x01, 0xf5, 0xb8, 0x6e, 0x2a, 0xb1, 0xd6, 0x50, + 0x75, 0xd7, 0x68, 0xec, 0x26, 0xfd, 0x66, 0x6e, 0x7b, 0xb6, 0xa1, 0xc7, 0xee, 0xd8, 0x4c, 0xa2, 0x48, 0xbf, 0xf4, 0x75, 0xf8, 0x27, 0x9a, 0x2b, 0xb7, 0xb4, 0xcf, 0x6c, 0xb9, 0xbd, 0x32, 0xd4, + 0x6c, 0x39, 0xad, 0xda, 0x1c, 0xee, 0x8f, 0xa9, 0x56, 0x5a, 0x51, 0xbe, 0x83, 0x32, 0x2a, 0xc8, 0x73, 0x15, 0x38, 0x42, 0xb9, 0x08, 0x9d, 0x68, 0x82, 0x6a, 0x47, 0xee, 0x29, 0xdd, 0x42, 0x34, + 0x6a, 0xab, 0x51, 0xad, 0x16, 0x4d, 0x64, 0x2e, 0x20, 0x4f, 0x52, 0xe6, 0x8a, 0x26, 0xf7, 0x61, 0xae, 0x6b, 0x0d, 0x04, 0x74, 0xc7, 0x14, 0xd3, 0x2a, 0x4a, 0xc3, 0x71, 0xad, 0xac, 0x8d, 0x1d, + 0x68, 0x45, 0xd4, 0x77, 0x1b, 0xb7, 0x2f, 0x6a, 0xb4, 0x5e, 0xde, 0xe2, 0x62, 0x7b, 0xfd, 0xf5, 0xf7, 0xc6, 0x6f, 0x3f, 0x3e, 0xeb, 0x91, 0x8f, 0xe4, 0xf9, 0xd1, 0xb9, 0x50, 0x7e, 0x37, 0x36, + 0x97, 0xf3, 0xa1, 0xb1, 0x77, 0x7c, 0x34, 0xb2, 0x96, 0x5e, 0x69, 0xb6, 0x08, 0x32, 0x41, 0xaa, 0xb9, 0x9e, 0x11, 0x14, 0x25, 0xa2, 0xbb, 0xaa, 0x9d, 0xdb, 0xe5, 0xbc, 0x27, 0xf1, 0xa3, 0xc0, + 0x79, 0x91, 0x24, 0xac, 0xe3, 0xd5, 0xc2, 0xc2, 0x8c, 0x7d, 0xae, 0x5a, 0xfe, 0xa2, 0xeb, 0xc9, 0x9a, 0x06, 0xf1, 0x23, 0x8a, 0xca, 0x9a, 0xc5, 0xec, 0x3d, 0x45, 0xee, 0xd4, 0x72, 0xc2, 0x02, + 0x9d, 0xd7, 0x13, 0xf6, 0xc9, 0x34, 0xbe, 0xed, 0xb4, 0xfc, 0xcf, 0x60, 0xeb, 0x6d, 0x99, 0xdd, 0x7d, 0x4d, 0xf0, 0x8c, 0x07, 0xf3, 0x3d, 0xe1, 0x33, 0x53, 0xdf, 0x9d, 0x0e, 0xf5, 0x65, 0x66, + 0x13, 0x95, 0xef, 0xca, 0x6c, 0xb9, 0x58, 0x6f, 0x57, 0x27, 0xda, 0xf2, 0xd9, 0x75, 0xae, 0x41, 0x60, 0x54, 0x33, 0x62, 0x1d, 0x0b, 0x1e, 0x0a, 0x03, 0x23, 0x3a, 0x99, 0x87, 0x4b, 0x05, 0x31, + 0x60, 0x46, 0x65, 0x16, 0x70, 0xdb, 0x6e, 0xd2, 0xe3, 0xd2, 0x8a, 0xa6, 0x68, 0x63, 0x83, 0x73, 0x3d, 0x39, 0x20, 0x62, 0xb3, 0xe9, 0xe8, 0xcc, 0x9d, 0x34, 0x7b, 0xdc, 0x4e, 0x5b, 0xa9, 0x06, + 0x8f, 0x1f, 0xb1, 0x07, 0x9f, 0x6c, 0xf0, 0xe2, 0xda, 0xe5, 0xd8, 0x8f, 0xcf, 0x26, 0x71, 0xe1, 0x9b, 0x6f, 0x1f, 0xb9, 0xa9, 0xf8, 0xf8, 0xd4, 0x2a, 0xec, 0xfc, 0x99, 0xe9, 0xbd, 0xd9, 0xf1, + 0xac, 0x2f, 0x6a, 0x70, 0xb4, 0xe8, 0x66, 0x2c, 0x6e, 0xee, 0x0c, 0xec, 0x67, 0x06, 0x3d, 0x53, 0x9d, 0xfb, 0x7d, 0x43, 0x33, 0x68, 0x50, 0xa9, 0xee, 0xda, 0xc1, 0xe7, 0xc1, 0x32, 0x4c, 0x4f, + 0x7d, 0x3f, 0xb7, 0x0f, 0x90, 0x99, 0xb9, 0x12, 0xc2, 0xed, 0x15, 0x09, 0xd1, 0xfb, 0x2e, 0x69, 0x29, 0x5a, 0x0f, 0xc4, 0x91, 0x4f, 0xc7, 0xcb, 0xb9, 0x73, 0x38, 0xc0, 0x0b, 0xa5, 0xa3, 0x3a, + 0x45, 0x3f, 0x1e, 0x15, 0x78, 0x21, 0x52, 0x81, 0xac, 0x6b, 0xb0, 0xc0, 0x12, 0xfe, 0x24, 0x58, 0x23, 0xfb, 0x00, 0x8f, 0xbc, 0x82, 0x45, 0x29, 0x6a, 0x96, 0x29, 0xb3, 0xfb, 0x0e, 0x80, 0xbf, + 0x6d, 0x00, 0x1e, 0x34, 0xde, 0xfd, 0x27, 0xae, 0x31, 0x77, 0x1f, 0x71, 0x99, 0x79, 0xf7, 0x6e, 0x0c, 0x5d, 0x71, 0x74, 0x78, 0x3e, 0xd5, 0xc0, 0x6d, 0xb8, 0x53, 0xc3, 0x69, 0x05, 0xd4, 0x85, + 0x82, 0x15, 0xd2, 0xba, 0x9a, 0xd6, 0xf4, 0x22, 0x75, 0xb6, 0x15, 0xdc, 0x88, 0x07, 0x2c, 0x84, 0x56, 0x88, 0xba, 0xd0, 0x0b, 0x00, 0x74, 0xe5, 0x75, 0x4f, 0xf7, 0xf3, 0x84, 0x07, 0xd6, 0x49, + 0x25, 0x99, 0xb2, 0x60, 0x44, 0xd3, 0x8d, 0x72, 0x64, 0x56, 0x08, 0xc9, 0xb5, 0x5d, 0x0c, 0x22, 0x92, 0x16, 0x2e, 0xf5, 0xf6, 0x0f, 0x9a, 0x2e, 0x7c, 0xea, 0x6e, 0xfc, 0x69, 0x32, 0xfd, 0x53, + 0xcc, 0xc7, 0x50, 0x2f, 0xfe, 0xb9, 0xbd, 0x13, 0x2f, 0x14, 0xcf, 0x83, 0x71, 0xfe, 0x3f, 0x74, 0x4d, 0x71, 0xa7, 0x02, 0xe4, 0xe9, 0xb6, 0xd1, 0x21, 0x18, 0xb7, 0xdf, 0x97, 0x8d, 0x81, 0xc6, + 0x25, 0x49, 0xd3, 0xb4, 0xbe, 0x2d, 0xf4, 0xc3, 0x3e, 0x10, 0x30, 0xc2, 0x99, 0xb7, 0x89, 0x60, 0x56, 0x65, 0x38, 0x71, 0xf6, 0x50, 0x5d, 0x69, 0x10, 0xb1, 0x42, 0x9a, 0x7d, 0x89, 0x04, 0xcb, + 0x6e, 0x59, 0xe6, 0xa7, 0x76, 0xb4, 0xed, 0xc1, 0x03, 0x44, 0x13, 0x93, 0x19, 0xca, 0x76, 0x33, 0x8b, 0x62, 0x7d, 0xf8, 0x9f, 0x96, 0xf0, 0xf1, 0x15, 0xfb, 0x7c, 0xd3, 0x1e, 0xeb, 0x71, 0xe1, + 0x3f, 0xe0, 0xe1, 0x73, 0xa1, 0xe9, 0x5f, 0x64, 0x2f, 0x8c, 0x7c, 0x3d, 0x19, 0x1a, 0x96, 0xce, 0x58, 0x92, 0x75, 0x3c, 0x0d, 0x44, 0x41, 0xf3, 0xb0, 0x92, 0x50, 0x64, 0x3b, 0x9d, 0x2f, 0x3b, + 0x37, 0xd3, 0x0c, 0x99, 0x5f, 0x1e, 0xb7, 0x2b, 0xce, 0xc5, 0xb7, 0x38, 0x12, 0x95, 0x92, 0xb2, 0x11, 0x0d, 0x22, 0xed, 0x78, 0xc4, 0xe9, 0x1d, 0x74, 0xdd, 0x5a, 0x93, 0x7d, 0x6f, 0x2d, 0x36, + 0x02, 0xc6, 0x8a, 0xb2, 0x0b, 0x28, 0xf3, 0x98, 0x63, 0x5a, 0xd7, 0x3b, 0x96, 0xdb, 0x6d, 0x95, 0x2f, 0x76, 0xdf, 0x71, 0xf3, 0x8b, 0x8c, 0xe0, 0xf3, 0x4f, 0x2f, 0xca, 0x2e, 0x7c, 0x49, 0xa0, + 0xfa, 0x94, 0x1b, 0xa7, 0x17, 0x65, 0x7e, 0xc9, 0x9c, 0x7c, 0xb5, 0xad, 0x3e, 0xd7, 0x0c, 0x16, 0x63, 0xa7, 0x0a, 0xc3, 0xc6, 0xb7, 0x4a, 0x6f, 0x7c, 0x01, 0x3f, 0x48, 0x13, 0xff, 0x8f, 0x12, + 0xe9, 0xfe, 0x09, 0x70, 0x74, 0xa6, 0xa7, 0x87, 0xa7, 0x77, 0xc3, 0xf3, 0x7f, 0xbd, 0x68, 0xcb, 0xff, 0x18, 0x52, 0x05, 0x71, 0x03, 0xd8, 0x79, 0x7f, 0xf6, 0x3d, 0x13, 0xfe, 0xfb, 0x45, 0xf6, + 0x2c, 0x39, 0x6f, 0x27, 0x63, 0x64, 0x58, 0x28, 0x90, 0xd1, 0xda, 0x14, 0x41, 0xb7, 0xe1, 0x11, 0xd2, 0xe1, 0x8d, 0x41, 0x1c, 0x05, 0x77, 0x49, 0x6e, 0x91, 0xd8, 0x5f, 0xaf, 0x7a, 0xdf, 0xb0, + 0x9a, 0xb2, 0xd9, 0xc9, 0xca, 0xd6, 0x05, 0x33, 0x41, 0xec, 0x0b, 0x2a, 0xd9, 0x20, 0xb4, 0xe3, 0x9e, 0x1c, 0x62, 0x6b, 0xcd, 0xa5, 0xa5, 0x8c, 0xec, 0x4f, 0x76, 0x40, 0x2d, 0xd6, 0xa1, 0xd2, + 0xc4, 0xfb, 0x38, 0x3d, 0x58, 0xdc, 0x71, 0xed, 0x2d, 0xd9, 0x10, 0x18, 0x88, 0x6f, 0xf2, 0x00, 0x21, 0x76, 0x08, 0x2b, 0xab, 0xdc, 0xb4, 0xc7, 0x91, 0xfe, 0x28, 0x7b, 0x0d, 0xfc, 0x89, 0x3d, + 0xb1, 0xa8, 0xff, 0x22, 0x7b, 0x61, 0xe5, 0xeb, 0xc9, 0xa5, 0xc0, 0x61, 0xc0, 0x5a, 0x2e, 0x07, 0xae, 0x9e, 0x56, 0x91, 0x12, 0x1a, 0xac, 0x77, 0x9a, 0xbb, 0xbd, 0x84, 0x6b, 0x27, 0x73, 0xa2, + 0xa9, 0xb2, 0x84, 0x62, 0x4b, 0xd0, 0xdf, 0x56, 0xc4, 0x9e, 0x56, 0x33, 0xd0, 0x30, 0x1b, 0x7e, 0x62, 0xf5, 0x80, 0x07, 0xf2, 0x61, 0x80, 0xd9, 0xf1, 0x26, 0x0b, 0x7a, 0xe8, 0x68, 0x64, 0x70, + 0x38, 0x51, 0xf4, 0x4c, 0x8b, 0xf3, 0x83, 0xd1, 0x28, 0x9c, 0xc2, 0x76, 0x4b, 0x64, 0x89, 0xfe, 0x69, 0x91, 0xf3, 0xe0, 0xb0, 0xf4, 0xbb, 0xd7, 0x7d, 0x75, 0x86, 0x3f, 0x62, 0xed, 0xe4, 0x27, + 0xf4, 0xfb, 0x35, 0x6e, 0x9f, 0xe9, 0xdf, 0xf2, 0xf8, 0xe5, 0xe2, 0xf8, 0x4a, 0xfe, 0x7b, 0x66, 0x2b, 0x49, 0x1c, 0xe1, 0x3d, 0x47, 0xae, 0x37, 0xfd, 0x9c, 0x16, 0xac, 0xf9, 0xa8, 0xf4, 0x0a, + 0x5e, 0xcf, 0xc1, 0x93, 0x56, 0x91, 0xeb, 0x5e, 0xab, 0xdb, 0x63, 0x13, 0xce, 0x75, 0x02, 0xef, 0x7c, 0x80, 0xb5, 0x82, 0x1a, 0x97, 0xfc, 0x14, 0x36, 0xbb, 0x83, 0xc1, 0x04, 0x93, 0x04, 0x34, + 0x97, 0xfc, 0x0e, 0x5d, 0x1c, 0x4e, 0x95, 0xd4, 0x18, 0x08, 0x4d, 0x51, 0x9d, 0xdc, 0xc2, 0x14, 0x1d, 0xd3, 0xcf, 0xaf, 0xdd, 0x2f, 0xce, 0xcf, 0x97, 0x94, 0xa5, 0x3b, 0x46, 0xf5, 0x8d, 0xc8, + 0x7e, 0xac, 0x6f, 0xfd, 0x62, 0x58, 0x52, 0xab, 0x1d, 0x9b, 0x49, 0x9e, 0x3f, 0xb6, 0x60, 0x9f, 0x43, 0xe7, 0x7f, 0x4f, 0xf8, 0x3c, 0x12, 0xef, 0x4e, 0x87, 0xa2, 0xf4, 0x9b, 0x9c, 0x66, 0xca, + 0x4a, 0xe3, 0x91, 0xd5, 0x8a, 0x54, 0x7d, 0x74, 0x2a, 0x7a, 0x4b, 0x91, 0xec, 0x36, 0x8b, 0x2d, 0xe2, 0xf3, 0x01, 0x74, 0xf4, 0xfb, 0x29, 0x95, 0x1e, 0xfc, 0x03, 0x52, 0x1a, 0x47, 0xae, 0x51, + 0x29, 0x74, 0x2a, 0xf4, 0xeb, 0x1d, 0xc2, 0xa6, 0x1c, 0xb3, 0xd9, 0xb5, 0x1e, 0x9c, 0x35, 0x19, 0x1c, 0x6e, 0x36, 0x47, 0x7d, 0xcb, 0x1e, 0x9a, 0x69, 0xb6, 0xf3, 0xd1, 0x40, 0x22, 0xc1, 0xe7, + 0x87, 0xe0, 0xf2, 0x0a, 0x76, 0x9b, 0xe6, 0x76, 0x71, 0x66, 0xcd, 0xbb, 0x44, 0xb6, 0x4f, 0xb5, 0x28, 0x97, 0x8f, 0xbe, 0x54, 0xb2, 0x8d, 0x7d, 0xab, 0xb8, 0xb3, 0xaa, 0x7c, 0x33, 0x24, 0x76, + 0x6b, 0xda, 0x97, 0xee, 0x7b, 0xc5, 0x43, 0x43, 0xf7, 0x29, 0x65, 0x7e, 0x4b, 0xfb, 0x75, 0x60, 0x7e, 0x5d, 0x19, 0x8a, 0x8e, 0x09, 0x94, 0x52, 0xae, 0x71, 0x24, 0xce, 0xf3, 0x6b, 0x28, 0x96, + 0x67, 0x6e, 0x8b, 0xa0, 0x9e, 0x9c, 0x66, 0x6a, 0xd5, 0x6d, 0xe8, 0x11, 0x25, 0xad, 0x36, 0x52, 0xbc, 0x96, 0x19, 0x1a, 0xcd, 0xa9, 0xce, 0xf5, 0xd1, 0xb6, 0x02, 0x4a, 0xc7, 0x8d, 0x32, 0xc8, + 0x86, 0xcc, 0xb5, 0xd8, 0x88, 0x7d, 0x73, 0x74, 0x13, 0x74, 0xc7, 0x74, 0x7b, 0x7f, 0x94, 0xfb, 0x26, 0x73, 0x3a, 0x9e, 0x1a, 0xd4, 0x9f, 0x3c, 0xd8, 0xb2, 0x7f, 0xcb, 0xaa, 0x4f, 0x43, 0xf2, + 0xc8, 0xf6, 0x7c, 0x52, 0x8c, 0x3f, 0x3e, 0xe1, 0x17, 0xdb, 0x6e, 0xaf, 0x5f, 0x6c, 0xd3, 0x21, 0x82, 0x6d, 0x64, 0xab, 0x2a, 0x2e, 0x04, 0x25, 0xde, 0xec, 0x16, 0xd8, 0xd6, 0x3b, 0xec, 0xd9, + 0x82, 0xb5, 0x57, 0x93, 0x15, 0xc0, 0x4c, 0x17, 0x69, 0x17, 0x19, 0x7d, 0x26, 0x09, 0x48, 0xc5, 0x34, 0x3b, 0x92, 0x39, 0x42, 0x02, 0x4a, 0x40, 0x89, 0xa2, 0x27, 0x4e, 0xb6, 0xc2, 0x63, 0x0e, + 0x3b, 0x80, 0x78, 0x1b, 0xaa, 0x8d, 0x86, 0xf1, 0x9e, 0x60, 0x09, 0xf0, 0xda, 0xb6, 0x94, 0x16, 0x38, 0x6e, 0xd1, 0xe7, 0xad, 0xa9, 0xcf, 0x02, 0x77, 0x07, 0x03, 0xfd, 0xcf, 0x45, 0xfa, 0xf6, + 0xcb, 0x0f, 0x87, 0xe8, 0x89, 0x68, 0xd1, 0x07, 0xea, 0xaf, 0xc3, 0xf3, 0xee, 0xd2, 0x75, 0x64, 0x06, 0x84, 0x8d, 0xf2, 0x7c, 0x74, 0x38, 0xec, 0xd5, 0x52, 0xf4, 0x38, 0x94, 0x5b, 0x19, 0xaa, + 0xec, 0xcf, 0x96, 0x78, 0xab, 0x20, 0xf3, 0x64, 0x4a, 0x55, 0xd5, 0x12, 0x23, 0x27, 0xc1, 0x6a, 0x94, 0x01, 0x2d, 0x34, 0x09, 0xe0, 0x20, 0xf6, 0x3b, 0xd3, 0xdd, 0x1a, 0xad, 0x0c, 0x4e, 0x57, + 0x39, 0xa8, 0x64, 0xe1, 0x9e, 0x91, 0x0b, 0xd4, 0x47, 0xc3, 0x72, 0x45, 0xab, 0x99, 0x64, 0xe3, 0x87, 0x95, 0x19, 0x6a, 0x4a, 0xf7, 0x84, 0x5c, 0xbf, 0x40, 0x72, 0xdf, 0xdf, 0x00, 0x3c, 0xe5, + 0x5c, 0xbe, 0x90, 0xbc, 0xb0, 0xe6, 0x7c, 0x30, 0x46, 0x87, 0x39, 0x93, 0x65, 0x33, 0x30, 0x37, 0x9c, 0x72, 0x8a, 0xf3, 0xdd, 0x69, 0x89, 0xf1, 0x8c, 0x4a, 0x20, 0x99, 0xb9, 0x62, 0xb1, 0xed, + 0xca, 0x3d, 0x6c, 0x77, 0xa7, 0x03, 0x06, 0x6b, 0x84, 0x3e, 0xa9, 0x34, 0xea, 0x50, 0x4f, 0x3b, 0x8b, 0x16, 0x0e, 0xcd, 0x6c, 0xc5, 0x6e, 0xb3, 0x95, 0xb5, 0x09, 0x6c, 0xe8, 0x20, 0x29, 0x69, + 0x18, 0xd0, 0xa0, 0xa2, 0xa5, 0x24, 0xe5, 0xe5, 0xa4, 0x35, 0xe3, 0xb4, 0x15, 0x2a, 0x29, 0xbf, 0x13, 0x88, 0xfc, 0x01, 0x81, 0x3f, 0xdb, 0x41, 0x22, 0x96, 0xfb, 0x71, 0xe9, 0x8c, 0x83, 0x47, + 0xc2, 0x05, 0x3d, 0x85, 0x54, 0xf9, 0x8b, 0xec, 0x85, 0x75, 0xaf, 0x27, 0x17, 0x2f, 0xdc, 0x37, 0x71, 0x5c, 0x68, 0x3c, 0xe7, 0xf4, 0xbd, 0x01, 0x6b, 0x49, 0x28, 0x1d, 0x78, 0xde, 0x9a, 0x1d, + 0xd6, 0x94, 0xd6, 0x57, 0x4b, 0x33, 0x75, 0xfc, 0xe6, 0x77, 0x05, 0xa2, 0xd4, 0xcb, 0xaa, 0xb0, 0x1f, 0x2f, 0x06, 0x4f, 0xe9, 0xb6, 0x17, 0xa2, 0xe7, 0x37, 0x7b, 0x39, 0xbc, 0x78, 0x36, 0x06, + 0x68, 0x30, 0xb1, 0xd9, 0xcd, 0xa6, 0x47, 0x00, 0xe7, 0xf3, 0x2d, 0x88, 0xe5, 0x1a, 0xb3, 0xee, 0x97, 0x6c, 0xa8, 0x2f, 0x47, 0x21, 0x8e, 0xf8, 0x4d, 0xda, 0x17, 0x99, 0xb8, 0x5e, 0xba, 0x06, + 0xcb, 0x18, 0x92, 0xc9, 0x50, 0x98, 0xc9, 0xe9, 0x09, 0x01, 0x4b, 0xba, 0x62, 0x3b, 0xbc, 0x2a, 0xd4, 0x73, 0xd8, 0xe1, 0x48, 0x74, 0x16, 0x54, 0xda, 0x7e, 0x11, 0x5b, 0x7b, 0x7c, 0x07, 0x44, + 0x12, 0x69, 0x9c, 0xac, 0xdf, 0xc9, 0x2d, 0x1d, 0x08, 0xc9, 0xf2, 0xa9, 0x7a, 0xf3, 0xbe, 0x64, 0x3c, 0xb5, 0x94, 0xde, 0x90, 0xbe, 0xf0, 0xf0, 0xfd, 0x85, 0xa1, 0xa9, 0x92, 0xde, 0x49, 0x54, + 0x09, 0x19, 0x52, 0x82, 0xcd, 0xd2, 0x22, 0x98, 0x82, 0xda, 0xc0, 0x9d, 0x00, 0x34, 0x8a, 0xd2, 0xea, 0x49, 0xba, 0x28, 0x66, 0x73, 0x19, 0x52, 0x9d, 0x13, 0x4b, 0xcc, 0x46, 0x01, 0x38, 0x22, + 0x26, 0x9b, 0x19, 0x9d, 0xa6, 0x25, 0x84, 0x99, 0x39, 0xa4, 0x78, 0x2e, 0xb6, 0x5d, 0x1b, 0x06, 0x9a, 0x9c, 0x64, 0x8c, 0xcd, 0x42, 0x6c, 0xce, 0x05, 0xa3, 0xaa, 0x4a, 0x81, 0x66, 0xfb, 0xb1, + 0xf8, 0xff, 0xa1, 0xe2, 0xbf, 0x49, 0x5b, 0xfa, 0xeb, 0x1f, 0x93, 0xa1, 0x49, 0x15, 0xd7, 0xea, 0x8d, 0xcb, 0xde, 0xf9, 0x0b, 0x25, 0xf5, 0xc4, 0x6c, 0x7b, 0x47, 0xf8, 0x8d, 0xa3, 0xd7, 0xd3, + 0x8b, 0xc2, 0x1a, 0x90, 0x39, 0xd1, 0x6c, 0x3b, 0x41, 0x14, 0xd2, 0x60, 0x03, 0x16, 0xeb, 0x14, 0x83, 0x17, 0xf9, 0xfe, 0x68, 0xd1, 0x45, 0xc0, 0x6e, 0x94, 0x42, 0x4f, 0x27, 0x89, 0xb8, 0xf3, + 0xbd, 0x95, 0x57, 0x61, 0x34, 0xbe, 0x39, 0x70, 0xc0, 0x34, 0x58, 0xcf, 0x31, 0xb9, 0xb3, 0x6b, 0x66, 0x54, 0xaa, 0x15, 0x97, 0xe5, 0xb1, 0x4b, 0x04, 0x80, 0xd9, 0x6e, 0x25, 0xa5, 0x53, 0xe4, + 0xa6, 0xde, 0x4b, 0xb9, 0xef, 0x1f, 0xfb, 0x8f, 0xfb, 0xcd, 0xdf, 0x58, 0x5b, 0xed, 0x28, 0x09, 0xfc, 0x77, 0x7e, 0x08, 0xe2, 0xf7, 0xfd, 0x10, 0xef, 0x17, 0xe1, 0x4b, 0xc9, 0xdf, 0x8b, 0x73, + 0xe8, 0x1a, 0x3e, 0xfe, 0xfd, 0x72, 0xb0, 0xe1, 0xf3, 0xe6, 0x5d, 0xd1, 0x5d, 0x99, 0xfb, 0x8f, 0xdc, 0x0a, 0xd0, 0x53, 0xe9, 0xec, 0x77, 0x9f, 0xf0, 0x36, 0xe6, 0x1f, 0xae, 0x5f, 0x42, 0x9f, + 0x03, 0x56, 0x6f, 0x63, 0xd2, 0xe5, 0x46, 0x88, 0xcc, 0xd5, 0x75, 0xb0, 0xd2, 0xab, 0x29, 0x9f, 0x9f, 0x70, 0x19, 0x14, 0x45, 0xcd, 0x94, 0x35, 0x6b, 0x87, 0x36, 0xf4, 0xfe, 0xa0, 0x67, 0xc9, + 0x5c, 0xd8, 0x4f, 0x40, 0x92, 0x5c, 0x20, 0xdb, 0x79, 0xa5, 0xc9, 0xa0, 0xa4, 0x89, 0x3b, 0x7e, 0x49, 0xf2, 0xb8, 0x7e, 0x48, 0x76, 0xac, 0x4a, 0xe0, 0xab, 0xad, 0xe4, 0x59, 0xac, 0x78, 0x58, + 0xf3, 0x88, 0xeb, 0x9b, 0xe1, 0xf6, 0xf9, 0xc1, 0x7f, 0xbe, 0xda, 0x8f, 0x78, 0xad, 0xf6, 0xfb, 0x7d, 0x37, 0xd4, 0x7f, 0x53, 0xb5, 0xdf, 0xdd, 0x71, 0xb3, 0x1f, 0xc6, 0x82, 0x9f, 0x8c, 0x8b, + 0x3d, 0x78, 0xc8, 0x23, 0xb9, 0xb1, 0x63, 0x6b, 0x68, 0xbc, 0xac, 0x9b, 0xb6, 0x64, 0xd0, 0x40, 0x3c, 0x8c, 0xcc, 0x9a, 0x13, 0xb1, 0xa8, 0xa5, 0xd4, 0xec, 0x18, 0x78, 0xb7, 0xce, 0xa1, 0x00, + 0x6f, 0x36, 0xc8, 0xd4, 0x19, 0x9d, 0xb0, 0xb0, 0x16, 0xe3, 0x3d, 0xdb, 0x8f, 0xa2, 0x7e, 0x4a, 0xd2, 0xfd, 0x74, 0xa7, 0xf1, 0x76, 0x48, 0x9d, 0x50, 0xf8, 0xc4, 0xf5, 0xd8, 0x28, 0x0b, 0x89, + 0x36, 0x70, 0xb6, 0x44, 0xa2, 0xf5, 0x1d, 0x12, 0xcc, 0xf8, 0x89, 0x20, 0x3f, 0xda, 0xd0, 0x0c, 0x10, 0x9d, 0xcf, 0x21, 0xb4, 0x9b, 0xf8, 0xd8, 0x57, 0x92, 0xf5, 0x3f, 0x64, 0xec, 0x8b, 0x52, + 0xff, 0xb2, 0x45, 0xcf, 0x3f, 0x69, 0xf4, 0x2f, 0x8f, 0x79, 0x34, 0xfe, 0x97, 0x9b, 0x43, 0x25, 0x20, 0xf0, 0x30, 0x7b, 0x4a, 0xa0, 0xdc, 0xdc, 0xa9, 0xdb, 0xfd, 0x04, 0x2c, 0x2d, 0x0d, 0x8e, + 0xc5, 0x63, 0x9c, 0x90, 0x13, 0x20, 0x62, 0x96, 0x5b, 0x4e, 0x5c, 0x08, 0x4e, 0x43, 0x94, 0x93, 0xae, 0x2b, 0x4f, 0x89, 0x5c, 0x6c, 0xc4, 0x5d, 0x5b, 0xaf, 0x81, 0x05, 0x32, 0xcd, 0x2a, 0xa8, + 0xa0, 0x40, 0xae, 0x54, 0xd6, 0x08, 0x47, 0x82, 0xaa, 0xbb, 0xdd, 0x47, 0xa6, 0xd2, 0xf4, 0x7e, 0xa3, 0x55, 0xc7, 0xe7, 0xdd, 0x0d, 0xff, 0xc7, 0x49, 0x40, 0xfa, 0x55, 0xd4, 0x02, 0x7b, 0xd2, + 0x42, 0x7d, 0x25, 0xfb, 0x32, 0xc2, 0xd7, 0x93, 0x31, 0x36, 0xcc, 0x4a, 0xd5, 0x10, 0xe2, 0xc0, 0xef, 0x57, 0x66, 0x76, 0x5a, 0xe6, 0x64, 0xba, 0x8c, 0x85, 0x69, 0x5d, 0xed, 0xd5, 0x28, 0xab, + 0xaa, 0x7a, 0x92, 0xa8, 0xdc, 0x36, 0xa5, 0x6d, 0x09, 0xd3, 0xe9, 0x3c, 0x47, 0x12, 0x84, 0x36, 0xa7, 0xb3, 0xf0, 0xa0, 0x63, 0x9b, 0xb9, 0x23, 0xef, 0x39, 0x32, 0x36, 0x5a, 0x9a, 0x3e, 0x2e, + 0x47, 0x00, 0x98, 0x24, 0x6b, 0x7c, 0x9b, 0xf3, 0x95, 0xbc, 0xef, 0x4b, 0xd9, 0xfa, 0x93, 0x39, 0x7d, 0xf9, 0xe9, 0xbf, 0x4c, 0x81, 0xc9, 0xdf, 0xba, 0x7a, 0xbf, 0x43, 0x06, 0x78, 0xb4, 0xd5, + 0x7e, 0xce, 0xe6, 0x7d, 0x25, 0xfc, 0x36, 0x22, 0x2f, 0x50, 0x05, 0x03, 0xe3, 0x72, 0xa1, 0xbe, 0x91, 0x74, 0x64, 0x63, 0x8c, 0x0e, 0x42, 0xaa, 0x93, 0x18, 0x55, 0xd8, 0x2b, 0x6f, 0x89, 0x5b, + 0xea, 0x21, 0x5b, 0x49, 0xce, 0x86, 0x27, 0x45, 0x4a, 0x5f, 0x18, 0xbe, 0x05, 0x58, 0x39, 0xe7, 0xb9, 0x7e, 0xe9, 0x6a, 0xa7, 0x0a, 0x08, 0xed, 0x92, 0x95, 0x33, 0x4e, 0x5d, 0x26, 0xca, 0x01, + 0xec, 0xd7, 0x6b, 0xd9, 0x08, 0x52, 0x6b, 0x05, 0x97, 0xa3, 0x52, 0x0b, 0x50, 0x43, 0x60, 0xc5, 0xe7, 0x7d, 0x1f, 0x91, 0x1f, 0xbf, 0x87, 0x50, 0x78, 0x0e, 0x1f, 0x72, 0xd0, 0x98, 0x54, 0xa9, + 0x9d, 0xeb, 0xee, 0xe3, 0x11, 0x21, 0x9e, 0xdb, 0x9f, 0xbe, 0x91, 0x3d, 0x8f, 0xc7, 0xdb, 0xc9, 0x98, 0xf8, 0x7e, 0x7f, 0x7a, 0x1e, 0x8d, 0x64, 0x4e, 0x8e, 0xf4, 0x5d, 0x41, 0x06, 0x7d, 0x1f, + 0x44, 0xdc, 0x64, 0xc6, 0xf1, 0x73, 0x7e, 0xb9, 0x1f, 0x1d, 0xf1, 0x15, 0xdf, 0x87, 0xed, 0x88, 0x12, 0x72, 0x40, 0x5f, 0x35, 0x2c, 0x48, 0x9c, 0xd6, 0x23, 0x11, 0x46, 0xdd, 0x82, 0x8a, 0x66, + 0x7b, 0x88, 0x61, 0x9d, 0x5e, 0x87, 0x9c, 0xed, 0x88, 0x1f, 0xed, 0xb7, 0xa1, 0x34, 0x4b, 0x76, 0xc7, 0x94, 0xab, 0x93, 0x64, 0x01, 0xa4, 0x22, 0x07, 0xad, 0x9e, 0x9f, 0x21, 0x66, 0x12, 0xa5, + 0x49, 0x7c, 0xfe, 0xfd, 0x76, 0xe4, 0x97, 0xe5, 0x0d, 0xde, 0xce, 0xff, 0x7a, 0xff, 0xb1, 0xe4, 0xe4, 0xdb, 0x81, 0x7e, 0xbd, 0x0d, 0x7f, 0xb4, 0xa7, 0x2c, 0xdb, 0xa8, 0x5e, 0x31, 0x33, 0x90, + 0x5b, 0xd8, 0xb2, 0x4b, 0x33, 0x96, 0x97, 0xcc, 0xec, 0xdb, 0xee, 0x77, 0x1f, 0x3a, 0x03, 0x3a, 0x49, 0x1e, 0xfd, 0x02, 0x9b, 0xfc, 0x14, 0x5f, 0x3c, 0xdf, 0xf6, 0x2f, 0x38, 0x4a, 0x7f, 0xbd, + 0x46, 0x17, 0x6f, 0xbe, 0x1e, 0xd9, 0xa5, 0x97, 0x58, 0xbf, 0x74, 0xf2, 0x8d, 0xea, 0x8e, 0xfc, 0x6b, 0xdb, 0xea, 0xdb, 0x04, 0xca, 0x1f, 0x3f, 0xfe, 0xca, 0xae, 0x5f, 0xb8, 0x20, 0x8c, 0xdf, + 0xda, 0xfd, 0xef, 0x23, 0xf7, 0xc8, 0xcf, 0x3b, 0xc0, 0x01, 0xdf, 0x01, 0xa6, 0xff, 0x44, 0x7f, 0x82, 0x3f, 0xfe, 0xff, 0x10, 0xf2, 0x82, 0x39, 0x34, 0xa4, 0x34, 0xf3, 0x9d, 0x68, 0xdd, 0x5c, + 0x7f, 0x65, 0xef, 0xfd, 0x6d, 0x1f, 0xf2, 0xc4, 0xc2, 0x7e, 0xa1, 0x08, 0x8c, 0xaf, 0xff, 0xc7, 0x17, 0x1a, 0xdf, 0x8b, 0x2e, 0x2f, 0x2a, 0xcb, 0x55, 0xb5, 0x97, 0x11, 0x9b, 0x2a, 0x85, 0x0d, + 0x5f, 0xc7, 0x3b, 0x0d, 0xdf, 0x98, 0x27, 0xbb, 0x84, 0x02, 0xb0, 0x9c, 0x70, 0x15, 0x57, 0x2c, 0x7b, 0x9e, 0xef, 0x0b, 0xfb, 0x44, 0x4d, 0xe0, 0x63, 0x48, 0x64, 0xb2, 0xb3, 0x5c, 0xf3, 0x0b, + 0xbf, 0x68, 0xd4, 0x6c, 0x5d, 0xaf, 0x14, 0xfa, 0xb0, 0xe2, 0x5c, 0x75, 0x84, 0xd3, 0x40, 0x4d, 0xee, 0x76, 0x9e, 0xed, 0x35, 0xad, 0x73, 0xfa, 0x03, 0x45, 0x52, 0xfc, 0xf5, 0x96, 0xee, 0xfe, + 0xfb, 0xa3, 0x73, 0x47, 0xe7, 0xa4, 0xb6, 0x9d, 0x53, 0xef, 0x1e, 0xc7, 0xda, 0x37, 0x68, 0x86, 0x67, 0xa9, 0xb8, 0x86, 0xb4, 0x8a, 0xb1, 0x99, 0x84, 0x49, 0x7e, 0x73, 0xef, 0xc7, 0x8f, 0xbf, + 0x92, 0x8b, 0x37, 0x57, 0x0f, 0xdf, 0xfb, 0x96, 0x7e, 0xfc, 0xf8, 0x55, 0x79, 0xf2, 0xc4, 0xc8, 0x47, 0x8f, 0xfd, 0x4f, 0xcf, 0x64, 0xf9, 0x47, 0x05, 0x30, 0x06, 0xa2, 0x62, 0x68, 0x46, 0x7f, + 0x41, 0x9f, 0xf8, 0x76, 0x74, 0x08, 0xd8, 0x32, 0x9a, 0x61, 0xac, 0x0a, 0xe3, 0xc9, 0x0c, 0x5d, 0xce, 0x97, 0x0b, 0x66, 0x49, 0x1e, 0x8f, 0xe8, 0x1e, 0x55, 0x33, 0x9b, 0xe6, 0x54, 0xb2, 0xc6, + 0x88, 0x52, 0x1a, 0x05, 0x06, 0x52, 0x9f, 0x00, 0xb1, 0xd3, 0xb7, 0x0a, 0x0f, 0xf2, 0xd2, 0xb6, 0x53, 0xca, 0x88, 0xd9, 0xb3, 0xa0, 0x31, 0xd2, 0x2d, 0x59, 0x5a, 0xd4, 0x46, 0x01, 0xf1, 0x0b, + 0x7d, 0xf5, 0xa8, 0xaf, 0xd3, 0x37, 0xbc, 0x29, 0x1f, 0x03, 0xdf, 0x61, 0x37, 0x7d, 0x34, 0x87, 0xb2, 0xe2, 0x8d, 0xea, 0xab, 0x16, 0x3f, 0x1f, 0x8f, 0x2f, 0xb4, 0xbe, 0x67, 0x8c, 0x27, 0x26, + 0xde, 0xce, 0x5e, 0x3b, 0x27, 0xc0, 0x9c, 0xa1, 0x04, 0xd9, 0xa6, 0x3a, 0xd0, 0xa0, 0x84, 0x77, 0x2a, 0x79, 0xec, 0xa8, 0x8b, 0x99, 0x6a, 0x80, 0xc2, 0x61, 0x92, 0x33, 0xb5, 0x02, 0x92, 0x78, + 0xaa, 0x8b, 0xc5, 0x5c, 0x46, 0x84, 0x49, 0xdf, 0x59, 0xbd, 0x96, 0x17, 0x21, 0xb7, 0x29, 0x03, 0xc0, 0xb5, 0x50, 0x22, 0x6b, 0x27, 0x28, 0x18, 0x6c, 0x4b, 0xb3, 0xc0, 0x6a, 0x1a, 0x72, 0xfe, + 0x60, 0x26, 0x7c, 0xa5, 0xfb, 0x6e, 0x96, 0xc1, 0xab, 0x3b, 0xe4, 0xf7, 0xf3, 0x90, 0xb0, 0x81, 0xfd, 0x76, 0x1e, 0x4e, 0x90, 0xdb, 0xd2, 0x83, 0xa7, 0xdc, 0xe9, 0x37, 0xa4, 0xaf, 0xa3, 0xf6, + 0xee, 0xc2, 0x18, 0x1f, 0xe6, 0x5e, 0xcf, 0x52, 0x72, 0x56, 0x8b, 0xe1, 0xb4, 0x28, 0x2b, 0x6e, 0x55, 0xdb, 0xdb, 0x22, 0xc6, 0x57, 0xb1, 0xb9, 0x11, 0xeb, 0x7a, 0x02, 0x42, 0xd9, 0x5a, 0x37, + 0xb7, 0xbd, 0x10, 0x72, 0xc0, 0x88, 0x69, 0x5a, 0x73, 0x3a, 0x02, 0x33, 0xb8, 0x61, 0xba, 0x1a, 0xa5, 0x9c, 0xba, 0x24, 0x40, 0x80, 0xe2, 0x63, 0x38, 0xcd, 0xb8, 0x79, 0xb1, 0xb1, 0x28, 0x3f, + 0x71, 0x55, 0x5a, 0x9c, 0x8e, 0xb8, 0xba, 0x11, 0x9f, 0xdf, 0x73, 0x78, 0x7a, 0x31, 0x76, 0x42, 0xfd, 0x3d, 0xe0, 0xd4, 0xef, 0x8e, 0xcd, 0x40, 0x5b, 0xe8, 0xca, 0x2b, 0xaf, 0x4b, 0xed, 0x3c, + 0xf4, 0xe3, 0xd3, 0x63, 0xc5, 0xf2, 0x94, 0x6b, 0xf6, 0x33, 0xfd, 0xf7, 0x23, 0xf4, 0xeb, 0xea, 0xd0, 0x68, 0xa7, 0x98, 0x16, 0xb3, 0x63, 0x98, 0x2a, 0x26, 0xd5, 0x70, 0xbc, 0x30, 0x83, 0x61, + 0x9d, 0x5c, 0xa1, 0x1b, 0xb0, 0xc4, 0x19, 0x62, 0x13, 0xcd, 0xea, 0x82, 0x6c, 0x1d, 0x6e, 0xbf, 0x68, 0x22, 0xdc, 0x14, 0x0a, 0x84, 0x29, 0xbc, 0x1d, 0x82, 0x09, 0xba, 0x74, 0x6a, 0x2c, 0x1c, + 0xa4, 0xe2, 0x39, 0xa7, 0x52, 0x0a, 0x5d, 0x14, 0x0d, 0x6c, 0xcb, 0x89, 0x49, 0x90, 0xba, 0xa8, 0x48, 0xa0, 0x5a, 0xc5, 0xcf, 0x9b, 0x49, 0x77, 0x86, 0xe9, 0x76, 0x8a, 0xdd, 0x4a, 0xfd, 0xd9, + 0x68, 0xf8, 0xbb, 0x86, 0xb2, 0x7c, 0xb1, 0x81, 0xee, 0xab, 0x42, 0xfc, 0x09, 0x55, 0x78, 0xa1, 0x08, 0x8c, 0xaf, 0xff, 0xc7, 0x17, 0x1a, 0xdf, 0x0f, 0xd0, 0x91, 0xae, 0x22, 0x14, 0xd7, 0x7c, + 0x6c, 0xcb, 0x71, 0x4b, 0x6a, 0x41, 0x44, 0x30, 0x8c, 0x94, 0xd6, 0x04, 0xd1, 0x4b, 0x0f, 0xb6, 0xe3, 0x95, 0xa9, 0x31, 0x2e, 0x47, 0x06, 0x74, 0x3e, 0x89, 0xdd, 0x8a, 0x30, 0xac, 0xf5, 0x4c, + 0x14, 0x4e, 0x58, 0xb4, 0x03, 0x1a, 0x91, 0xad, 0xd1, 0x8e, 0x15, 0xcd, 0x55, 0x4c, 0xee, 0xe3, 0x95, 0x41, 0x2e, 0x3c, 0x1d, 0x2d, 0x12, 0x43, 0x68, 0x27, 0xdd, 0xb7, 0xed, 0xc1, 0xbf, 0xd8, + 0xe9, 0x05, 0xf5, 0x9b, 0x7a, 0xbb, 0xb1, 0x0b, 0xc3, 0xc4, 0xd2, 0x0b, 0xef, 0xa7, 0x19, 0x26, 0xb1, 0x6d, 0xbd, 0x66, 0x25, 0xa1, 0x1f, 0xa1, 0xcc, 0x5f, 0x3e, 0x55, 0xe6, 0x55, 0x6c, 0xea, + 0x57, 0x50, 0xfb, 0xff, 0xba, 0xc5, 0xff, 0x3c, 0x0f, 0xf3, 0xfb, 0x44, 0xc1, 0x07, 0xf0, 0x70, 0xef, 0x9c, 0xf4, 0xe7, 0x4f, 0x7c, 0x6c, 0x06, 0xfd, 0xd9, 0x9b, 0xfc, 0xfb, 0x42, 0x02, 0x81, + 0x03, 0x63, 0xc0, 0xd7, 0x71, 0xbd, 0xb9, 0x74, 0x65, 0xd3, 0xfd, 0xcd, 0x10, 0xfa, 0xc4, 0xbc, 0xd7, 0x83, 0x1a, 0x18, 0x9f, 0xff, 0x8e, 0x2f, 0xdf, 0xff, 0x5e, 0x6c, 0x70, 0x81, 0x82, 0x43, + 0x6c, 0xb4, 0x9d, 0xef, 0x99, 0xc6, 0x19, 0xe1, 0x6c, 0xa5, 0x25, 0xa6, 0xa1, 0xd4, 0x22, 0x6f, 0x71, 0x15, 0x86, 0x00, 0x65, 0x2e, 0xda, 0x12, 0x53, 0xc1, 0xdb, 0x65, 0x73, 0x72, 0xcd, 0x32, + 0xae, 0x0c, 0x48, 0xaf, 0x92, 0xe5, 0x48, 0x83, 0x14, 0xcd, 0x8c, 0xc0, 0x29, 0x29, 0xb1, 0x78, 0x56, 0x55, 0x85, 0x99, 0xf7, 0x59, 0x34, 0xdb, 0xeb, 0xcc, 0x8a, 0x04, 0xfe, 0x24, 0x10, 0x7f, + 0x6d, 0x15, 0x69, 0xdb, 0xe9, 0xd8, 0xce, 0x2a, 0xfd, 0xda, 0xb9, 0xe7, 0x53, 0xcf, 0xf2, 0x4b, 0xb1, 0x5f, 0x61, 0x7a, 0x76, 0xa4, 0x8f, 0xcb, 0x5c, 0x3f, 0x33, 0xcd, 0xfe, 0xeb, 0xdf, 0xef, + 0xa5, 0x04, 0xdd, 0xc7, 0xf9, 0xba, 0xee, 0x56, 0x6e, 0x44, 0xa9, 0xca, 0xfd, 0x6b, 0xdc, 0xf4, 0x2a, 0x24, 0x77, 0x0c, 0xd8, 0xbb, 0x0e, 0xa4, 0x87, 0x95, 0xdd, 0x43, 0x5c, 0x4b, 0x76, 0x9a, + 0x18, 0x76, 0x6e, 0xf7, 0x27, 0x3f, 0x7e, 0x4e, 0x78, 0x1e, 0xf0, 0xe1, 0x9e, 0x34, 0x3d, 0xd7, 0xa0, 0xf4, 0xde, 0x03, 0x80, 0xf1, 0xdd, 0xcb, 0x43, 0x5b, 0x93, 0xee, 0x58, 0x02, 0xe0, 0xa7, + 0x31, 0xa2, 0x06, 0xaa, 0xb7, 0x3e, 0xc6, 0x50, 0xc8, 0x78, 0xa7, 0xa5, 0x3e, 0x23, 0x25, 0x4e, 0x16, 0x05, 0x35, 0x50, 0xbc, 0x03, 0x3a, 0x9f, 0x01, 0x62, 0xcc, 0xd5, 0x44, 0x5b, 0xbb, 0x59, + 0x99, 0xa5, 0x33, 0x75, 0xba, 0xe6, 0xd0, 0x48, 0x14, 0xda, 0x7d, 0x0b, 0x89, 0x61, 0x82, 0x96, 0x59, 0x6f, 0x67, 0x06, 0x58, 0x70, 0x61, 0x5e, 0xe9, 0x5c, 0x87, 0x58, 0xd5, 0x03, 0x35, 0xf5, + 0x15, 0x33, 0xd3, 0x47, 0x9c, 0x42, 0x7f, 0x42, 0xc8, 0x13, 0x5e, 0x88, 0x33, 0xc5, 0x8b, 0xca, 0x4e, 0xed, 0xf1, 0x95, 0xc4, 0xf7, 0xbc, 0x00, 0x01, 0x0d, 0x06, 0xf9, 0x46, 0x5c, 0xcb, 0x27, + 0xc1, 0x94, 0xc8, 0xbd, 0x8f, 0xce, 0x66, 0xfb, 0x62, 0xc4, 0xcd, 0x76, 0xc7, 0x63, 0x93, 0xf1, 0x5b, 0xdd, 0x4f, 0x69, 0x72, 0xd1, 0xa4, 0x10, 0x68, 0x09, 0xac, 0x9f, 0x1e, 0xea, 0xfd, 0xb1, + 0x91, 0x65, 0xd2, 0x07, 0x21, 0x0d, 0xe0, 0x4e, 0xe1, 0x9a, 0xee, 0x56, 0xdb, 0xa5, 0xb7, 0x36, 0x83, 0xc4, 0x3c, 0x8d, 0xa8, 0x6d, 0x3c, 0x77, 0x98, 0xd9, 0xf2, 0x79, 0xd3, 0xe7, 0x76, 0xda, + 0xfd, 0x03, 0xfa, 0x38, 0xed, 0xae, 0xfe, 0x56, 0xeb, 0xe5, 0xe6, 0x87, 0x99, 0x66, 0x25, 0xa5, 0xef, 0xc6, 0xc9, 0xb5, 0xeb, 0xfe, 0x3f, 0xc0, 0x8f, 0x46, 0xaf, 0x93, 0xe4, 0x63, 0x5b, 0xbf, + 0x22, 0xd3, 0xfe, 0x03, 0xfc, 0x89, 0xdc, 0xba, 0x2b, 0x9c, 0x2a, 0x36, 0xcf, 0x5b, 0xb5, 0x37, 0x67, 0xef, 0xe7, 0x87, 0xbf, 0x62, 0xb8, 0xfc, 0xe3, 0xbc, 0x18, 0x62, 0xef, 0xef, 0x78, 0x7a, + 0xf1, 0xf6, 0x93, 0x6e, 0xa8, 0xfa, 0xb1, 0x67, 0xe7, 0xfe, 0x15, 0xf4, 0xf8, 0x1f, 0xf0, 0x8d, 0xbf, 0xfd, 0x1a, 0x75, 0x7c, 0x73, 0x44, 0x5e, 0xbe, 0x7b, 0x03, 0xcc, 0x1e, 0xf9, 0xb1, 0x1f, + 0xf9, 0xd7, 0xf6, 0x0a, 0xff, 0x38, 0xef, 0xcd, 0x6e, 0xee, 0x7e, 0xae, 0xcd, 0xf9, 0x07, 0x74, 0x53, 0xd1, 0xfc, 0x4b, 0x6e, 0x5e, 0xdf, 0xe6, 0xf3, 0xdd, 0x17, 0xb0, 0xb0, 0x33, 0x3b, 0xee, + 0xae, 0x5b, 0x9f, 0x43, 0x8f, 0xd7, 0x5f, 0x72, 0xc3, 0x96, 0x8f, 0xb0, 0x5c, 0x77, 0xfc, 0x22, 0x9f, 0x4a, 0x69, 0x5f, 0x84, 0xff, 0x52, 0x48, 0x7b, 0x39, 0x1e, 0xa0, 0x7c, 0xde, 0xfa, 0x53, + 0xde, 0x9b, 0x32, 0xe0, 0x53, 0x7b, 0xdf, 0x17, 0x9a, 0xe7, 0x49, 0x73, 0x3d, 0x1a, 0x83, 0xc3, 0x76, 0xc1, 0x23, 0x1a, 0x64, 0x18, 0x37, 0x08, 0x92, 0xe9, 0xfc, 0xa8, 0xc2, 0xac, 0x63, 0xd5, + 0xbc, 0xb3, 0x1a, 0xb1, 0x5b, 0x86, 0xcc, 0xdb, 0x50, 0xdd, 0x6b, 0xb6, 0x39, 0xa1, 0x74, 0x5e, 0xe3, 0x21, 0xc7, 0xc6, 0xd6, 0x9d, 0xe7, 0x80, 0x80, 0xb3, 0x8f, 0x36, 0xa0, 0xb1, 0xf4, 0x8f, + 0xd0, 0x92, 0x98, 0x4b, 0x98, 0x49, 0xab, 0x21, 0xcc, 0xa4, 0x61, 0x29, 0xa4, 0x65, 0x1f, 0xa8, 0x5b, 0x65, 0x71, 0xda, 0x0e, 0xcc, 0x17, 0x30, 0xfc, 0xb8, 0xcc, 0xed, 0x6b, 0xa8, 0xe1, 0x1a, + 0x90, 0x18, 0xc0, 0x3c, 0xbb, 0x2d, 0xc7, 0x5f, 0x59, 0x89, 0xcf, 0xe1, 0x24, 0xff, 0x22, 0x7b, 0x66, 0xe1, 0xdb, 0xc9, 0x10, 0x8c, 0x64, 0x68, 0xec, 0x40, 0x78, 0xb2, 0xc6, 0xb0, 0x99, 0xec, + 0x3a, 0x33, 0xb2, 0x66, 0x9c, 0x7d, 0x22, 0x15, 0x3c, 0x31, 0x0a, 0x4d, 0x46, 0xf8, 0x5d, 0x55, 0xea, 0x5d, 0xe0, 0xf1, 0xbf, 0x44, 0x6e, 0x7f, 0x6e, 0x0f, 0x73, 0x43, 0xf9, 0xfc, 0x8e, 0xef, + 0xcf, 0x87, 0xee, 0x5b, 0x4e, 0x3a, 0x95, 0x45, 0x10, 0xb5, 0x90, 0xa6, 0x69, 0x8a, 0xec, 0xd4, 0x46, 0x24, 0x10, 0x02, 0x56, 0x56, 0x46, 0x9c, 0xaa, 0xb1, 0x78, 0xda, 0x4d, 0x5b, 0x7a, 0x37, + 0xb5, 0x84, 0x12, 0x99, 0xc3, 0x23, 0x2b, 0x52, 0x7d, 0x85, 0x50, 0xa1, 0x3d, 0xd7, 0x44, 0x4b, 0xae, 0x9d, 0x2d, 0xf2, 0x85, 0x80, 0xe2, 0x9c, 0xe1, 0x1d, 0xa7, 0xd8, 0x06, 0xeb, 0xbc, 0xe3, + 0x4e, 0xad, 0x3a, 0x92, 0x63, 0xf0, 0xa1, 0xc2, 0xf2, 0x01, 0x22, 0xfb, 0xaf, 0xff, 0x1a, 0x0a, 0xd9, 0xf1, 0x6b, 0x56, 0x3f, 0xe2, 0xe6, 0xef, 0x37, 0x02, 0x7d, 0xa1, 0x79, 0xe5, 0xe3, 0xf9, + 0xe8, 0xc2, 0xc1, 0x6f, 0x1a, 0x80, 0x42, 0x63, 0xca, 0x92, 0x36, 0x00, 0x96, 0x11, 0x3b, 0x35, 0x74, 0x0b, 0xc3, 0x3c, 0x2d, 0x0e, 0xd0, 0x88, 0x4a, 0x74, 0x1f, 0x75, 0xe4, 0xdf, 0x15, 0x14, + 0x3f, 0xee, 0xbe, 0x68, 0x99, 0x06, 0x41, 0x4f, 0xc5, 0xc7, 0x5e, 0xa9, 0x9e, 0xdf, 0xeb, 0xe5, 0x70, 0x7c, 0x25, 0xf5, 0xbd, 0x6c, 0xf8, 0x3b, 0x77, 0x59, 0xb9, 0x87, 0x4a, 0x70, 0xe7, 0xdb, + 0x3c, 0xb3, 0x39, 0x20, 0x4a, 0x7d, 0x49, 0x72, 0xa3, 0x79, 0x21, 0xf1, 0xa0, 0xc2, 0x60, 0x9d, 0x5d, 0x31, 0x0e, 0x53, 0x00, 0x64, 0xe9, 0x80, 0xe9, 0x1a, 0xf0, 0x5b, 0x3a, 0x5b, 0x8b, 0x11, + 0x51, 0x50, 0x64, 0xc3, 0x9a, 0x2a, 0x6d, 0x4f, 0x15, 0xa5, 0x2e, 0xe1, 0x82, 0x56, 0xd7, 0x93, 0x68, 0x97, 0x1d, 0x8d, 0x83, 0x1e, 0x46, 0x9b, 0xdf, 0xc9, 0xec, 0x83, 0x06, 0xa9, 0x8f, 0xe4, + 0xa5, 0x94, 0x38, 0xd7, 0x63, 0xf7, 0x91, 0x0a, 0x99, 0x3c, 0xc7, 0xbc, 0x1b, 0xd2, 0x67, 0x16, 0xde, 0x5c, 0x18, 0x4f, 0x86, 0xf1, 0x11, 0x9b, 0xf0, 0xb8, 0xdf, 0x63, 0xea, 0xa4, 0x5b, 0xe4, + 0x90, 0xd9, 0x98, 0x6e, 0x2d, 0xb4, 0x86, 0xb1, 0x6e, 0x70, 0xf9, 0x84, 0xb8, 0x5c, 0x37, 0xb1, 0xd6, 0x56, 0x79, 0x44, 0x73, 0xaa, 0xb6, 0x99, 0xcc, 0xcb, 0xad, 0x0d, 0x3f, 0x62, 0x7c, 0x60, + 0xd5, 0x62, 0x65, 0xb7, 0x05, 0x77, 0x0b, 0x63, 0x04, 0xd3, 0x64, 0x17, 0xdb, 0x24, 0xbb, 0xf1, 0xe9, 0x2c, 0x9f, 0x51, 0xe4, 0x7e, 0x77, 0x22, 0x8a, 0xe7, 0xf7, 0x10, 0x7e, 0x31, 0x8e, 0xab, + 0xc8, 0xb0, 0xff, 0x68, 0xe3, 0x3f, 0x6c, 0x9e, 0x26, 0xbe, 0x65, 0xc7, 0x5f, 0x56, 0x63, 0x3e, 0x29, 0xd5, 0xef, 0x08, 0x5f, 0x86, 0xe5, 0xd7, 0xe9, 0x78, 0xa0, 0x70, 0x27, 0x93, 0x62, 0xcf, + 0x6f, 0x17, 0x27, 0x17, 0xa0, 0xd6, 0xc2, 0x2e, 0x5a, 0xa1, 0xc8, 0x01, 0x04, 0x2a, 0x3b, 0x67, 0xf2, 0xb4, 0x3f, 0xd8, 0xd6, 0x49, 0xf6, 0x88, 0x92, 0xde, 0xd5, 0xba, 0xad, 0xa6, 0x4e, 0x5a, + 0x35, 0xc1, 0xd6, 0x8e, 0xc3, 0x7d, 0xd2, 0x02, 0x30, 0x07, 0xcc, 0xa5, 0xf0, 0x28, 0x97, 0x0b, 0x7b, 0xb4, 0xa1, 0xf1, 0x62, 0xa2, 0x79, 0x8b, 0x1e, 0x03, 0x09, 0x3e, 0x9c, 0xad, 0xc4, 0xdf, + 0xe9, 0x50, 0xfb, 0x1e, 0xd9, 0xf6, 0x2b, 0x16, 0x56, 0xe6, 0xe3, 0x5a, 0xc9, 0x67, 0x00, 0xb2, 0x2f, 0x14, 0x2f, 0x4c, 0xab, 0x4c, 0x6f, 0x28, 0x38, 0xb6, 0x32, 0x6f, 0x09, 0xb9, 0x9b, 0x48, + 0x4c, 0xc9, 0xed, 0xc5, 0x72, 0x9d, 0x8d, 0x58, 0x10, 0x01, 0x8a, 0x2d, 0x95, 0xab, 0x24, 0xb3, 0x6a, 0x1b, 0xca, 0xcc, 0xaa, 0x3d, 0x0f, 0x9b, 0x28, 0xc2, 0xd8, 0x20, 0x02, 0x4c, 0x0b, 0x3b, + 0x0f, 0x84, 0xf9, 0xba, 0x2f, 0x03, 0xb1, 0xc7, 0x96, 0xa7, 0x8d, 0xdd, 0x4f, 0x29, 0xc0, 0x0b, 0xed, 0x6e, 0xa6, 0x4a, 0x73, 0x9a, 0x69, 0x9a, 0xa3, 0xdc, 0x4c, 0xc3, 0xe7, 0xdd, 0x5b, 0x71, + 0x92, 0xbe, 0x9a, 0x95, 0x37, 0xfd, 0xa3, 0xdf, 0xbe, 0xfa, 0xc9, 0xa8, 0x3b, 0x33, 0xf5, 0x95, 0x97, 0x17, 0xcb, 0xee, 0xed, 0xc2, 0x7b, 0x94, 0x94, 0x2f, 0xc6, 0x21, 0xf7, 0xa3, 0x71, 0x6c, + 0x37, 0xe1, 0x87, 0x21, 0xfd, 0xf3, 0xfa, 0x81, 0x1b, 0xca, 0xe7, 0x71, 0x79, 0x7f, 0x3e, 0xb8, 0x5e, 0x00, 0xe2, 0xa5, 0x62, 0x86, 0x94, 0x5a, 0xbe, 0x2e, 0x18, 0xfa, 0xb4, 0x39, 0xf5, 0xab, + 0xe5, 0xa8, 0x99, 0x2e, 0xe1, 0x45, 0xd7, 0x3a, 0x2a, 0x9d, 0xa0, 0x72, 0xb7, 0x31, 0xd1, 0x74, 0xc9, 0x8c, 0x46, 0x4b, 0x36, 0x88, 0x33, 0x70, 0xb5, 0xd9, 0x63, 0x53, 0x09, 0x61, 0x71, 0x0b, + 0x00, 0xdc, 0x6d, 0xbe, 0xdc, 0x36, 0x1d, 0x0a, 0x4f, 0x8d, 0xa4, 0xe2, 0xed, 0xc2, 0x3c, 0x9b, 0xef, 0xf2, 0xe8, 0xdb, 0xcc, 0x94, 0xef, 0x74, 0xc4, 0x10, 0xb6, 0x16, 0xe3, 0x97, 0x2f, 0xdc, + 0x63, 0xe8, 0xf4, 0xa9, 0xba, 0xa2, 0x17, 0x9a, 0x67, 0x56, 0x5e, 0x8f, 0xc6, 0xd3, 0x61, 0xd5, 0x44, 0x1e, 0x1f, 0x96, 0xf8, 0x71, 0x46, 0x2e, 0x44, 0x81, 0x76, 0x40, 0x84, 0x85, 0x27, 0x48, + 0x57, 0x32, 0x1a, 0x62, 0xad, 0x0c, 0x7a, 0x47, 0xe7, 0xb3, 0x6c, 0x9a, 0xad, 0x57, 0x8a, 0xac, 0x4d, 0xd5, 0x95, 0x16, 0x42, 0x3d, 0xde, 0x68, 0xb1, 0xbb, 0xcf, 0x11, 0x4e, 0x98, 0xb4, 0x51, + 0xe5, 0x13, 0x09, 0x3c, 0xd3, 0xdb, 0x82, 0xdb, 0xb5, 0xeb, 0x3e, 0xd0, 0x1d, 0x46, 0xf6, 0x95, 0x79, 0x02, 0x2d, 0xff, 0xc0, 0x45, 0x98, 0xbf, 0xba, 0x6f, 0x3f, 0xc4, 0x7a, 0xcd, 0xdc, 0xd6, + 0x4b, 0xfb, 0xc6, 0x72, 0x82, 0x3e, 0x7e, 0xc6, 0xf2, 0x1d, 0xe7, 0xaf, 0x57, 0xaf, 0xdf, 0x6d, 0xe0, 0x59, 0x3f, 0xd9, 0xd7, 0x56, 0x99, 0x6f, 0xdf, 0xbc, 0xb9, 0x7f, 0xb7, 0x0c, 0xef, 0x6c, + 0x9b, 0x4d, 0x7e, 0x42, 0xf8, 0xfb, 0x0f, 0x76, 0x6f, 0x4a, 0xe8, 0x4e, 0x8e, 0xca, 0xe7, 0x5d, 0xd5, 0xdb, 0x48, 0xff, 0x65, 0xf9, 0x45, 0x09, 0xbc, 0x20, 0x87, 0xfe, 0xaf, 0x4f, 0x9f, 0x18, + 0x17, 0x66, 0xee, 0x5f, 0xa7, 0xf7, 0xeb, 0x07, 0x5f, 0x2e, 0x3d, 0xf8, 0x7c, 0x99, 0xeb, 0x71, 0x91, 0xfa, 0xa1, 0x3d, 0x4e, 0xe2, 0xb0, 0xbb, 0xf9, 0xde, 0xdb, 0xad, 0xcf, 0x5f, 0x7d, 0xf8, + 0x94, 0xb1, 0x65, 0xa7, 0xb9, 0x6d, 0xea, 0xa5, 0x6d, 0x3d, 0x07, 0xa0, 0x74, 0x7f, 0x41, 0xfd, 0x18, 0xac, 0xfd, 0xec, 0x28, 0xfb, 0xf5, 0x8b, 0xfe, 0xf7, 0x7f, 0xc0, 0x3f, 0xf1, 0x41, 0xb3, + 0xe7, 0x51, 0xf2, 0x24, 0xf8, 0x13, 0x46, 0x9f, 0x9a, 0x3a, 0xd6, 0x65, 0xda, 0x58, 0xe3, 0x2b, 0x81, 0xef, 0xe7, 0x4c, 0x41, 0x8d, 0x0a, 0x02, 0x02, 0x60, 0x9d, 0x45, 0x45, 0xd1, 0xf3, 0x23, + 0x92, 0x2a, 0x4b, 0x0b, 0x6d, 0xd3, 0xf9, 0xce, 0x90, 0x97, 0x4a, 0x9c, 0xb0, 0xfb, 0xd5, 0x09, 0x48, 0x88, 0x13, 0x49, 0x2c, 0x4e, 0x30, 0x12, 0x84, 0x81, 0x2d, 0xee, 0x94, 0xa0, 0x68, 0x97, + 0x9b, 0x88, 0x8b, 0x34, 0xa6, 0x62, 0xa4, 0xdd, 0xb4, 0x68, 0xc4, 0x12, 0x32, 0x30, 0x5f, 0x75, 0x64, 0x55, 0x32, 0x25, 0xff, 0x0f, 0xa0, 0x6c, 0xff, 0xf3, 0xfc, 0x06, 0xb7, 0xcc, 0xfc, 0x07, + 0xfa, 0x93, 0xf8, 0x98, 0x4d, 0x1b, 0xfa, 0x71, 0xf9, 0xd2, 0x4f, 0xb9, 0xb4, 0xf3, 0x71, 0x9a, 0xdb, 0xe5, 0xf5, 0xad, 0x3e, 0x4f, 0x36, 0x37, 0x4c, 0x0c, 0xe3, 0x7a, 0xef, 0x83, 0x09, 0x7e, + 0x09, 0x64, 0x26, 0xcd, 0xe5, 0xd6, 0xf4, 0xa3, 0x8f, 0xe2, 0x02, 0x64, 0x6f, 0xb7, 0x7e, 0x51, 0x16, 0x7f, 0xdd, 0x75, 0xbe, 0xdf, 0x36, 0x01, 0x7d, 0x68, 0x87, 0xdd, 0x99, 0x47, 0xd6, 0x9b, + 0xd0, 0x9a, 0xa1, 0xff, 0x94, 0x88, 0xa2, 0x3f, 0xa1, 0x41, 0xb6, 0x47, 0x11, 0xfa, 0xc6, 0x43, 0xbb, 0x0d, 0x7a, 0x4e, 0xc0, 0x42, 0xdf, 0xb8, 0x88, 0x58, 0xe8, 0x1b, 0xe3, 0x2b, 0x91, 0xef, + 0x85, 0x4c, 0x8d, 0x7d, 0x64, 0xb2, 0xdb, 0xf6, 0x81, 0xcb, 0xe6, 0x8d, 0x5d, 0x77, 0xc5, 0x4a, 0x22, 0x67, 0x79, 0xc9, 0x50, 0x29, 0x5f, 0x77, 0x36, 0xd1, 0x1f, 0x00, 0x70, 0x81, 0x2e, 0x3a, + 0x2d, 0x46, 0x11, 0x1e, 0x07, 0xf0, 0xac, 0x16, 0x1a, 0xde, 0x9b, 0xce, 0xe9, 0xd3, 0xca, 0x6e, 0x0c, 0xb6, 0x0a, 0x0f, 0x71, 0x69, 0xf8, 0x6e, 0x64, 0x4a, 0x78, 0x6e, 0xa9, 0xc8, 0x7c, 0x97, + 0x4c, 0x1b, 0x71, 0xf3, 0xfb, 0x4e, 0xd1, 0xab, 0xd8, 0x98, 0x49, 0xec, 0xf8, 0xee, 0x55, 0x66, 0xbe, 0xb2, 0x6b, 0x21, 0xe2, 0x19, 0xe3, 0xec, 0xee, 0x33, 0x5e, 0x18, 0xf6, 0xf9, 0xc6, 0xf8, + 0xfa, 0x98, 0xef, 0x39, 0xd8, 0xf2, 0xcd, 0x94, 0x77, 0x77, 0x3c, 0x43, 0x23, 0xfe, 0x56, 0x6c, 0xa3, 0x2d, 0x4e, 0x29, 0xf9, 0x68, 0xa1, 0x03, 0xfb, 0x3e, 0xaf, 0x9d, 0x55, 0x19, 0x2c, 0xcb, + 0x09, 0x33, 0x0f, 0x31, 0xc8, 0x3d, 0xc1, 0xf2, 0x9c, 0x06, 0xa8, 0xf9, 0xf4, 0x44, 0xaa, 0x62, 0x50, 0x8f, 0xda, 0x6e, 0x2d, 0x43, 0xb9, 0x5c, 0xc6, 0x7a, 0xc7, 0xd8, 0xac, 0x7c, 0xd8, 0xcc, + 0x4d, 0x56, 0x25, 0x8e, 0x10, 0x1e, 0x53, 0xdf, 0x2d, 0x6d, 0x77, 0x64, 0xf7, 0xee, 0x4b, 0x98, 0x9e, 0x6d, 0x5e, 0xd0, 0x74, 0xcf, 0x76, 0xd9, 0xe5, 0xe4, 0x19, 0xa9, 0x46, 0x87, 0x46, 0x99, + 0x8a, 0xaa, 0xf4, 0xc3, 0xc7, 0x36, 0x1c, 0xfc, 0x94, 0x51, 0x7d, 0x25, 0x7a, 0x19, 0xa8, 0xcb, 0xd1, 0xf8, 0x4a, 0xe8, 0xfb, 0x91, 0x89, 0x56, 0xdb, 0x2d, 0xe2, 0xcb, 0x2a, 0x33, 0x42, 0xe4, + 0x25, 0xd6, 0x32, 0x93, 0x13, 0xc8, 0x2f, 0xbc, 0xad, 0x28, 0xcf, 0xb7, 0xfc, 0x9c, 0xac, 0x81, 0x91, 0x78, 0x5a, 0x70, 0x69, 0x20, 0x2a, 0x6d, 0xdb, 0xc2, 0xf8, 0x76, 0x2b, 0xce, 0xa3, 0x68, + 0x86, 0x81, 0xb3, 0x69, 0xea, 0x72, 0x72, 0xcd, 0xfa, 0x04, 0xbd, 0xf5, 0x44, 0x96, 0x5f, 0x44, 0xc1, 0x5c, 0xe4, 0xfb, 0x02, 0x56, 0x70, 0x0e, 0xe2, 0x9e, 0x57, 0xa0, 0xaf, 0x73, 0xfe, 0x6c, + 0x18, 0x3c, 0xd3, 0x34, 0xf7, 0xc7, 0x9d, 0x76, 0x1d, 0xbf, 0xbb, 0xf4, 0x11, 0xaf, 0x8d, 0xef, 0x7e, 0x20, 0x3f, 0xe1, 0x9f, 0xe0, 0xd8, 0xb2, 0xeb, 0xb7, 0x73, 0xe4, 0xc3, 0x39, 0xfa, 0xe1, + 0x7c, 0xf2, 0xe1, 0x1c, 0xbb, 0x73, 0x6e, 0xd8, 0xa5, 0xfe, 0x76, 0x01, 0xff, 0xf0, 0x01, 0xfc, 0xe5, 0x03, 0x43, 0x24, 0xa9, 0x4b, 0xed, 0x37, 0xe1, 0xbd, 0xbf, 0x0a, 0x3f, 0x13, 0xa3, 0xfc, + 0x45, 0xf6, 0xb5, 0xc7, 0xe5, 0xe5, 0x64, 0x0c, 0x0e, 0x8b, 0x58, 0xaa, 0xa1, 0x2d, 0x27, 0xe6, 0xb4, 0x6a, 0x68, 0x35, 0x0b, 0x94, 0x46, 0xd5, 0x65, 0xe9, 0x38, 0x8b, 0x7a, 0xd6, 0x5c, 0x1e, + 0x27, 0xc4, 0x84, 0x10, 0x66, 0x70, 0x5d, 0xb7, 0x90, 0x9c, 0x4f, 0xda, 0xb5, 0xe9, 0xb7, 0xea, 0x9a, 0x1f, 0x11, 0x4c, 0xbc, 0xa4, 0x5c, 0x31, 0x0d, 0x65, 0x04, 0xac, 0x0a, 0xac, 0xb4, 0x33, + 0x2b, 0x2c, 0x4e, 0x4b, 0xa7, 0x1a, 0xe9, 0x36, 0xba, 0xc5, 0xa7, 0x5c, 0x62, 0x7f, 0xb7, 0x15, 0x78, 0x2c, 0x50, 0x69, 0x6e, 0x87, 0x95, 0x65, 0x8f, 0xc3, 0xe2, 0x45, 0xaa, 0x9e, 0xe9, 0xba, + 0xf7, 0x03, 0xfc, 0x39, 0xd0, 0xe3, 0xf0, 0x6d, 0xd3, 0x51, 0xe2, 0x99, 0x55, 0xeb, 0x41, 0xd3, 0x51, 0x62, 0xc8, 0xe2, 0x85, 0x5a, 0x46, 0xbf, 0xee, 0xb3, 0x3a, 0x28, 0x5d, 0x9f, 0x9d, 0xe4, + 0x0d, 0x74, 0x9a, 0xe4, 0x8b, 0x55, 0x39, 0x9f, 0xed, 0xb6, 0x91, 0x55, 0x59, 0x1e, 0xdd, 0xcd, 0x17, 0x7a, 0xb0, 0x03, 0x21, 0x67, 0xd1, 0x79, 0xfa, 0x6c, 0xed, 0x15, 0xc9, 0x76, 0xd7, 0x61, + 0x1d, 0x3e, 0x5a, 0xef, 0xa6, 0xc8, 0xda, 0x49, 0x97, 0x65, 0xa3, 0x4d, 0xfd, 0xcc, 0xc7, 0x4f, 0xd4, 0xa8, 0x6d, 0xb6, 0x9e, 0x50, 0xec, 0x36, 0xdf, 0x4d, 0xf0, 0x7f, 0xc6, 0xd6, 0xec, 0xfd, + 0xbc, 0xbc, 0xef, 0x53, 0x7b, 0x1f, 0x69, 0xfa, 0x1d, 0x5e, 0x5e, 0xc9, 0xbe, 0x30, 0xf3, 0xc5, 0xea, 0xbe, 0x50, 0xfb, 0x9e, 0x9b, 0xbd, 0xae, 0x90, 0x49, 0x2f, 0x1e, 0x31, 0x8a, 0x59, 0x28, + 0x33, 0x65, 0x99, 0x1f, 0xa8, 0x1e, 0x5a, 0x61, 0xcb, 0x83, 0xda, 0xcb, 0x7b, 0x47, 0xea, 0x26, 0x4b, 0x99, 0x55, 0x0a, 0x21, 0x94, 0x09, 0x2d, 0x9a, 0x6c, 0xf8, 0xa9, 0xcd, 0xa1, 0xed, 0x49, + 0x5a, 0x8b, 0xdc, 0x92, 0x14, 0x6a, 0x4f, 0x70, 0x30, 0xa8, 0xc7, 0x38, 0x80, 0xc6, 0x2a, 0xb7, 0x41, 0xf6, 0xee, 0x2c, 0xae, 0xeb, 0x68, 0xf4, 0x6d, 0x3a, 0xf2, 0x9d, 0x85, 0xcc, 0x7c, 0x5d, + 0xaf, 0xce, 0x87, 0xff, 0xeb, 0xfd, 0x9d, 0xc2, 0xce, 0xdf, 0x21, 0xb1, 0xbe, 0x9d, 0xff, 0xae, 0xc8, 0x5f, 0x3a, 0x80, 0x0e, 0x18, 0xa6, 0x2a, 0x36, 0x92, 0x76, 0x9c, 0xe6, 0x7e, 0xe4, 0x97, + 0xfe, 0x17, 0x7d, 0xa5, 0x9e, 0x69, 0x6f, 0xf1, 0x81, 0x36, 0x30, 0xfe, 0x78, 0xe5, 0xe2, 0x6c, 0x1b, 0x10, 0x92, 0xc2, 0xa0, 0x94, 0x0f, 0x49, 0x6a, 0xea, 0x4d, 0xa0, 0x43, 0x92, 0xdb, 0xdd, + 0x06, 0x9c, 0x8b, 0xb6, 0x6f, 0xd9, 0x2c, 0xc2, 0x52, 0x5b, 0x76, 0x1b, 0x7b, 0xd8, 0xe8, 0x30, 0x65, 0x40, 0x02, 0x41, 0x20, 0x3f, 0xcd, 0x30, 0x81, 0xe0, 0x96, 0xea, 0x51, 0xf3, 0x33, 0x1e, + 0x8b, 0x81, 0xd2, 0x58, 0xb5, 0x68, 0x31, 0x59, 0x4f, 0x2b, 0xd1, 0x33, 0x3b, 0x1b, 0x9b, 0xe7, 0xc6, 0xc9, 0xef, 0x4f, 0x73, 0xea, 0x79, 0x9d, 0xf4, 0x4d, 0xe1, 0x8c, 0xa7, 0x17, 0x63, 0xc3, + 0x77, 0xfd, 0xd7, 0x86, 0xb0, 0x77, 0x3f, 0x50, 0x74, 0x91, 0x91, 0x84, 0xbf, 0x3e, 0x70, 0xb3, 0xc3, 0x68, 0x3c, 0xdf, 0xf4, 0xc6, 0x46, 0xd2, 0xda, 0xd6, 0xcd, 0xd0, 0xbc, 0xd2, 0xfa, 0x24, + 0x0c, 0x7f, 0x7b, 0xf9, 0x4d, 0x15, 0x5b, 0xb6, 0x53, 0xe8, 0xce, 0x23, 0x01, 0x81, 0x6f, 0x22, 0xbc, 0xc3, 0x05, 0xe4, 0x85, 0xea, 0x45, 0x34, 0x5e, 0x8e, 0x2f, 0x15, 0xe2, 0x93, 0xef, 0x85, + 0x42, 0x69, 0xb9, 0x1d, 0x99, 0x17, 0xc5, 0x9c, 0x25, 0xa4, 0x3d, 0x2f, 0x66, 0xbb, 0xc9, 0x22, 0x2a, 0x82, 0x43, 0x5e, 0xd4, 0xe8, 0x8c, 0x50, 0x21, 0x78, 0x83, 0xce, 0xf2, 0xb9, 0xef, 0xeb, + 0x5d, 0x8d, 0x50, 0x5d, 0x47, 0x23, 0xc7, 0x70, 0xed, 0x62, 0x5d, 0x57, 0x54, 0xd5, 0x5e, 0xb3, 0x8e, 0xc5, 0xa1, 0x47, 0xa4, 0xad, 0x29, 0xb9, 0xb0, 0x63, 0x01, 0x80, 0x1c, 0x58, 0x28, 0xb9, + 0x3a, 0x40, 0xfe, 0x6f, 0x03, 0x29, 0x54, 0x71, 0xea, 0x3f, 0x4c, 0x76, 0x78, 0x2e, 0x2d, 0xe4, 0x4a, 0xf2, 0xc2, 0x92, 0xf3, 0xc1, 0xd0, 0xd4, 0x8f, 0x34, 0xe8, 0x60, 0x43, 0xf3, 0xf6, 0x45, + 0xe5, 0x34, 0x4a, 0xb8, 0x6d, 0x78, 0x73, 0x14, 0x22, 0xe6, 0x0e, 0x1f, 0x35, 0xd5, 0x26, 0xdc, 0x62, 0x55, 0x0f, 0x6a, 0xd6, 0x66, 0xc1, 0x85, 0x02, 0x65, 0x84, 0x58, 0x90, 0x00, 0x5a, 0xc8, + 0xfb, 0x68, 0x64, 0x10, 0xba, 0x2b, 0x9f, 0x0e, 0x24, 0x31, 0x5f, 0xe2, 0x07, 0x62, 0x57, 0xf5, 0x76, 0xc7, 0xef, 0x32, 0xf1, 0x54, 0xcc, 0x10, 0xaf, 0x2f, 0xb7, 0x7f, 0x43, 0xc5, 0xfc, 0x5b, + 0x2e, 0xd0, 0x3d, 0x8e, 0xa1, 0x4f, 0x99, 0x3c, 0x57, 0x92, 0x67, 0x8e, 0x5d, 0x0e, 0x2e, 0x2d, 0xa7, 0x07, 0x70, 0x6c, 0x0e, 0x76, 0xa2, 0xd4, 0x6b, 0x96, 0x4c, 0x92, 0xf1, 0x34, 0x1e, 0x2d, + 0xd1, 0x11, 0xed, 0xa1, 0xdd, 0x9a, 0x2a, 0x59, 0xc1, 0xd4, 0x37, 0x45, 0xa4, 0xcd, 0xa9, 0x42, 0xda, 0xd3, 0x84, 0x0b, 0x70, 0x76, 0xb0, 0x9d, 0x27, 0x16, 0x23, 0xc0, 0xeb, 0x95, 0xb3, 0x43, + 0x0c, 0x16, 0x0f, 0xe4, 0x42, 0x54, 0x63, 0x2b, 0x49, 0x25, 0x9c, 0x5b, 0xab, 0x8a, 0xa5, 0x65, 0x26, 0xe4, 0x04, 0xd1, 0x01, 0x1b, 0x88, 0x1c, 0x96, 0x56, 0x71, 0x67, 0xbe, 0xb0, 0xee, 0x05, + 0x0b, 0x65, 0x00, 0xeb, 0x4a, 0xff, 0x11, 0x0c, 0xec, 0x05, 0x7c, 0xe4, 0x89, 0x19, 0x58, 0xfa, 0xe1, 0x99, 0x6f, 0xa5, 0x1f, 0x8e, 0xaf, 0x24, 0xbe, 0x67, 0xdb, 0xe9, 0xe8, 0x00, 0x5b, 0xcc, + 0x5b, 0xac, 0x73, 0x65, 0xb5, 0xc6, 0xd4, 0x8c, 0x5b, 0xca, 0xbe, 0xcf, 0xea, 0x23, 0x7c, 0xda, 0x2c, 0x00, 0x8a, 0x10, 0x46, 0x3b, 0x72, 0x37, 0x53, 0xcc, 0xf0, 0xd4, 0xb9, 0x88, 0x81, 0x5a, + 0xf0, 0x09, 0x2f, 0x40, 0x81, 0xb6, 0xd3, 0x5d, 0xe0, 0xcf, 0xe6, 0xe6, 0x48, 0x17, 0x91, 0x1d, 0xc4, 0xcf, 0xba, 0x15, 0x83, 0xa7, 0x98, 0x6c, 0x32, 0x1a, 0xc6, 0x44, 0xf9, 0xc7, 0x5c, 0xd5, + 0x87, 0xc1, 0xa7, 0x77, 0x49, 0x27, 0x97, 0x34, 0xb3, 0xdb, 0x94, 0x94, 0x62, 0xac, 0xe7, 0x6e, 0x15, 0xd9, 0xef, 0x55, 0xef, 0xc7, 0xb4, 0x14, 0xd7, 0x8e, 0xed, 0x5c, 0x2f, 0x93, 0x7c, 0xfc, + 0x9a, 0x17, 0xf3, 0xf6, 0x51, 0xfc, 0xc3, 0x47, 0xcf, 0xf6, 0x85, 0x35, 0xd6, 0xf3, 0x5c, 0x7f, 0xf1, 0xe0, 0x7c, 0x2c, 0x04, 0xba, 0x2a, 0xea, 0x7b, 0x1f, 0x1b, 0x12, 0x7a, 0xac, 0x2a, 0xff, + 0x91, 0x03, 0x8e, 0xf8, 0x89, 0x3c, 0xb3, 0xe0, 0x56, 0xbe, 0x75, 0x1e, 0xcd, 0xca, 0xb7, 0xc6, 0x17, 0x0a, 0xdf, 0x0f, 0xe6, 0x68, 0xa7, 0x15, 0xb0, 0x60, 0xb3, 0x4a, 0x37, 0xa2, 0x95, 0x25, + 0xb7, 0x88, 0xa6, 0x6d, 0x1c, 0x63, 0x2b, 0x92, 0x4a, 0xc1, 0x10, 0x17, 0xe6, 0x14, 0x1e, 0x85, 0x44, 0xcf, 0xc8, 0xd1, 0x66, 0x34, 0x45, 0x84, 0xc9, 0x6e, 0x09, 0xee, 0x12, 0x73, 0x91, 0xc7, + 0xcd, 0x49, 0x3a, 0xa9, 0x87, 0xe5, 0xce, 0x57, 0x11, 0xc0, 0x49, 0x49, 0x4c, 0x77, 0xf6, 0x04, 0xe5, 0x19, 0x80, 0xdb, 0xe3, 0x22, 0x6e, 0xdf, 0xcc, 0x81, 0x4f, 0xd6, 0xcf, 0xcb, 0x6b, 0xbf, + 0x39, 0x4e, 0xaf, 0x7c, 0xf8, 0x9e, 0x5d, 0x35, 0x31, 0x36, 0x93, 0xe8, 0xe2, 0xa9, 0x7d, 0x05, 0xb8, 0xbf, 0xbf, 0x14, 0x3d, 0x93, 0x0d, 0xf1, 0x91, 0x38, 0x30, 0xfe, 0x74, 0x69, 0x68, 0x4e, + 0x44, 0x48, 0x84, 0xe4, 0x22, 0x62, 0x4c, 0x46, 0x3b, 0x7a, 0x68, 0x6c, 0x54, 0xf1, 0xee, 0x58, 0x0b, 0xe4, 0xc6, 0x9c, 0xa4, 0x35, 0x3e, 0x12, 0xc9, 0x46, 0x27, 0x32, 0x80, 0xb1, 0xe4, 0x96, + 0xa8, 0xf0, 0xb0, 0x50, 0x6a, 0x9e, 0xda, 0x46, 0x69, 0x62, 0x6d, 0x66, 0x9b, 0x5d, 0x73, 0x9a, 0x79, 0x1b, 0x12, 0x00, 0xac, 0xa5, 0x86, 0x12, 0xdb, 0x6a, 0xbd, 0x88, 0x82, 0xd2, 0x42, 0xc5, + 0x83, 0x4f, 0xe5, 0xbf, 0xbd, 0x30, 0xd5, 0x7a, 0xe8, 0x5f, 0x31, 0x65, 0xd3, 0x68, 0x9c, 0xea, 0xe6, 0x49, 0x77, 0xed, 0x57, 0xc0, 0xa2, 0x87, 0xce, 0x8b, 0x67, 0x8a, 0xa6, 0xbf, 0x7a, 0xd0, + 0x99, 0x8b, 0x5f, 0xdc, 0xbe, 0x84, 0xa7, 0x06, 0x54, 0x62, 0x51, 0xe9, 0x36, 0x82, 0x65, 0x1f, 0x68, 0x77, 0x38, 0xb0, 0x12, 0xb6, 0x64, 0x99, 0x1e, 0xdb, 0x44, 0x54, 0xe6, 0xde, 0x71, 0x7a, + 0x04, 0x4f, 0x59, 0xd9, 0xb9, 0x34, 0xa1, 0x92, 0xee, 0x4e, 0x20, 0x8e, 0x21, 0x15, 0xb7, 0x95, 0x10, 0x29, 0x5e, 0x30, 0xc1, 0xb0, 0x80, 0x70, 0x76, 0x28, 0x59, 0x21, 0xc0, 0x26, 0x32, 0xbc, + 0x82, 0x4a, 0x70, 0xc7, 0x9c, 0x6d, 0x32, 0xb4, 0x98, 0x7a, 0x30, 0xbe, 0x78, 0xde, 0xfe, 0xfb, 0x00, 0x69, 0xf7, 0x08, 0x9e, 0xed, 0x0b, 0x24, 0xb7, 0xef, 0x85, 0xfd, 0xa2, 0x59, 0xbe, 0x30, + 0xb6, 0x7e, 0x5f, 0x39, 0x5c, 0x28, 0x02, 0xe3, 0xeb, 0xff, 0xa1, 0x8d, 0x71, 0xe7, 0xcc, 0x1a, 0x91, 0x42, 0x48, 0x52, 0x10, 0xbe, 0x0e, 0x71, 0x30, 0x44, 0xba, 0x0c, 0xd1, 0x30, 0xd4, 0x1f, + 0xe9, 0x4d, 0xda, 0xa8, 0x59, 0x41, 0xcf, 0x35, 0xe5, 0x74, 0xca, 0xd8, 0x32, 0x36, 0x54, 0x37, 0x67, 0xa9, 0x51, 0x17, 0xe0, 0xb9, 0xa7, 0x80, 0xa7, 0x6a, 0x41, 0xb5, 0xfd, 0x46, 0xd7, 0x54, + 0x3a, 0x58, 0x28, 0x93, 0xc4, 0xd5, 0xd3, 0xed, 0x8e, 0x5d, 0x6c, 0x77, 0x6c, 0xe0, 0x1b, 0xdf, 0xed, 0x97, 0xbe, 0xca, 0x3d, 0xb0, 0x5b, 0xfb, 0x4d, 0xf7, 0x0f, 0xf1, 0x77, 0x5f, 0x42, 0x3c, + 0xaf, 0xcc, 0x7c, 0x8b, 0xdc, 0xbe, 0x5c, 0xf9, 0xf4, 0xf5, 0xef, 0x2c, 0x9c, 0x21, 0xf6, 0xcd, 0x23, 0xe3, 0xfd, 0x9f, 0xb7, 0xaf, 0xba, 0xfb, 0x84, 0xb7, 0x91, 0xfd, 0x70, 0x7d, 0xe8, 0x1e, + 0xcb, 0x68, 0x8e, 0x56, 0x0d, 0xce, 0xb6, 0x4c, 0x9a, 0x86, 0x4b, 0x0d, 0xde, 0x1e, 0x45, 0x15, 0x93, 0xea, 0xae, 0xda, 0xe1, 0x49, 0x10, 0xe4, 0x78, 0xd8, 0x9c, 0x5c, 0x2c, 0x0a, 0xc1, 0x3c, + 0x59, 0x77, 0x53, 0xcd, 0xae, 0xf6, 0x39, 0xbe, 0xd9, 0x23, 0x38, 0x9c, 0x85, 0x3b, 0x05, 0x22, 0x64, 0x41, 0xeb, 0x5d, 0x6d, 0x3b, 0xed, 0x7d, 0xda, 0xb4, 0x73, 0x25, 0x3b, 0x72, 0xd1, 0x22, + 0x9e, 0x1e, 0x76, 0xdf, 0xb9, 0x78, 0xbf, 0xcc, 0x32, 0xb9, 0xee, 0xa1, 0xde, 0x16, 0x67, 0xe8, 0xc3, 0xe2, 0x6c, 0x24, 0x49, 0x68, 0xeb, 0xf1, 0xf8, 0x9a, 0x2d, 0xfa, 0xd7, 0xdd, 0x30, 0xe6, + 0x5b, 0xae, 0xca, 0xed, 0xa7, 0x3e, 0x1b, 0x05, 0xef, 0x92, 0xd7, 0x3f, 0x25, 0xab, 0xfa, 0xaf, 0xbb, 0xb5, 0xbf, 0x7e, 0x6d, 0xd6, 0x3e, 0x49, 0xce, 0xdf, 0xbe, 0x03, 0xbb, 0x67, 0x6a, 0xdc, + 0x17, 0x29, 0xe8, 0x27, 0xf4, 0xfb, 0xeb, 0xdf, 0x27, 0xf2, 0x6f, 0xf2, 0xf4, 0xee, 0xda, 0xf8, 0x4a, 0xfc, 0x7b, 0x61, 0xaa, 0xda, 0x64, 0x36, 0xa9, 0x19, 0xd9, 0x11, 0x79, 0x2b, 0x20, 0xab, + 0x0d, 0xe4, 0x4d, 0x98, 0x50, 0xb3, 0x22, 0x89, 0x31, 0x34, 0xa7, 0x8a, 0x0a, 0x64, 0x4a, 0xd4, 0x88, 0xc2, 0x9c, 0xd8, 0x91, 0x0f, 0x28, 0x61, 0x19, 0xc2, 0x80, 0xda, 0x1d, 0x53, 0x41, 0xd9, + 0x1a, 0xbb, 0xd1, 0xc8, 0x3c, 0x4d, 0x18, 0x0c, 0xdd, 0x8b, 0x80, 0x9b, 0x73, 0xab, 0xac, 0x54, 0x49, 0x79, 0x1b, 0x85, 0x47, 0x7e, 0x37, 0xd0, 0x44, 0xd4, 0x6b, 0xdd, 0x0f, 0x2f, 0xa9, 0x9a, + 0xef, 0x7e, 0x79, 0x71, 0x7f, 0x68, 0xbf, 0xd9, 0xc9, 0xbf, 0x4f, 0xab, 0xfe, 0xaf, 0x4f, 0x69, 0xd5, 0x6e, 0x92, 0x5a, 0xf7, 0xa5, 0xf3, 0xbc, 0xc1, 0x2f, 0x93, 0xab, 0x4c, 0x95, 0xfa, 0x2f, + 0xb1, 0xfa, 0x28, 0x9b, 0xf7, 0x0c, 0xc7, 0x7b, 0xe9, 0x28, 0xdf, 0xa9, 0xa5, 0xff, 0x1e, 0x40, 0x9e, 0x26, 0xd7, 0xd3, 0xf4, 0xb1, 0x18, 0x3e, 0xa5, 0xd9, 0x2e, 0x24, 0xcf, 0xa2, 0x77, 0x39, + 0x18, 0xa2, 0xbb, 0xa0, 0x71, 0xb9, 0x17, 0xa6, 0x41, 0x8f, 0xcf, 0xb3, 0x40, 0x6d, 0x77, 0x27, 0x6d, 0x59, 0xcf, 0x40, 0x61, 0x57, 0xb1, 0xdb, 0x32, 0x25, 0x7e, 0xd3, 0x66, 0x6a, 0xcb, 0xc7, + 0x78, 0x42, 0xe8, 0x53, 0x2f, 0x74, 0xa1, 0x08, 0x8c, 0xaf, 0xff, 0x2f, 0x58, 0xe8, 0x03, 0x54, 0x31, 0xb3, 0xd5, 0x64, 0xc8, 0x9f, 0xa9, 0x1b, 0x55, 0x76, 0x67, 0x6a, 0x3c, 0x95, 0xc5, 0xc0, + 0xaf, 0x46, 0xac, 0xe2, 0x75, 0xb2, 0xba, 0x2a, 0x6a, 0x27, 0xc5, 0x23, 0xb3, 0xd2, 0xa2, 0xa9, 0xb5, 0x97, 0xb7, 0x5b, 0x10, 0x20, 0x83, 0x32, 0x97, 0x9b, 0xe5, 0xac, 0xa5, 0x08, 0x18, 0x88, + 0x48, 0xc5, 0x28, 0x99, 0x82, 0x0e, 0x96, 0x6b, 0xdd, 0x02, 0x9b, 0x75, 0x91, 0x58, 0x68, 0x9f, 0x4b, 0xb3, 0xc5, 0xef, 0xec, 0xe4, 0xc1, 0x41, 0xfd, 0xa7, 0x3b, 0x3d, 0x0c, 0xfd, 0x87, 0xae, + 0xf2, 0xe7, 0x50, 0xe4, 0x5f, 0x68, 0x02, 0xe3, 0xd7, 0xa3, 0xa1, 0xf8, 0xf1, 0x48, 0x63, 0xd1, 0xbe, 0x75, 0xec, 0xb2, 0x09, 0x3f, 0x07, 0x09, 0x54, 0x65, 0x16, 0xfb, 0x89, 0x94, 0x72, 0x7b, + 0x71, 0x86, 0x34, 0x81, 0x3a, 0x0b, 0xd7, 0x0a, 0xeb, 0x55, 0x11, 0x7c, 0x12, 0xcd, 0x1a, 0x40, 0xa1, 0x7d, 0x0c, 0xdb, 0x91, 0x00, 0x5a, 0x9d, 0x29, 0x28, 0x68, 0x75, 0x54, 0x19, 0x3b, 0x68, + 0xb6, 0xb5, 0x8b, 0x2d, 0x8a, 0xda, 0xb0, 0xc2, 0x03, 0x33, 0x5a, 0x6a, 0x0b, 0xb3, 0xc4, 0xbf, 0x6e, 0x08, 0xdc, 0xe9, 0xb9, 0x5b, 0x7c, 0xd3, 0xc1, 0xea, 0x3c, 0xde, 0xbf, 0x0f, 0x35, 0xfd, + 0x9e, 0xf2, 0x85, 0x15, 0xbf, 0x4e, 0xc7, 0x57, 0x92, 0xdf, 0x33, 0xa4, 0x83, 0xa0, 0x98, 0x5e, 0x84, 0xd2, 0xfa, 0x30, 0x22, 0x25, 0xe4, 0x58, 0x4f, 0x4b, 0xfc, 0xb0, 0x0d, 0x47, 0x02, 0xe2, + 0x49, 0x42, 0x22, 0x4d, 0x75, 0x48, 0xe8, 0xed, 0xde, 0xf3, 0x42, 0x4c, 0x4c, 0x61, 0xc8, 0xdd, 0x00, 0xeb, 0x83, 0xa4, 0xe0, 0x47, 0xa4, 0x9b, 0x2e, 0x14, 0xd5, 0xab, 0xe4, 0x39, 0x09, 0xef, + 0xbd, 0xd8, 0x19, 0x51, 0x2a, 0xa8, 0xc7, 0xa5, 0x6d, 0xa6, 0xb3, 0x66, 0xcf, 0x13, 0xdf, 0xd9, 0xcc, 0xdf, 0x39, 0xa5, 0x87, 0x58, 0xbe, 0x5d, 0xfc, 0x70, 0x7b, 0xf2, 0x4c, 0x3a, 0x57, 0x17, + 0x9f, 0x39, 0x18, 0x0f, 0x85, 0x84, 0x96, 0x5b, 0xb4, 0x73, 0x69, 0xa5, 0xa8, 0x60, 0x13, 0xf7, 0x8b, 0xa5, 0x62, 0x13, 0x5a, 0x05, 0x69, 0x61, 0xb5, 0x89, 0xb2, 0x83, 0xd7, 0x66, 0x5b, 0xd8, + 0x64, 0xd4, 0x9d, 0x30, 0x9b, 0xcc, 0x4c, 0x12, 0x11, 0x1c, 0x83, 0xde, 0xa5, 0x2c, 0xee, 0x54, 0xa0, 0x46, 0x18, 0x40, 0x0f, 0x61, 0xa9, 0xca, 0xc4, 0xcb, 0xf6, 0xa8, 0xd5, 0x8a, 0x67, 0x21, + 0x8e, 0x37, 0xd7, 0xa6, 0x14, 0x13, 0x91, 0xd8, 0x77, 0xc9, 0xb6, 0xdf, 0x55, 0xa3, 0x7f, 0xe0, 0xda, 0xbf, 0xbd, 0x70, 0xee, 0xfe, 0x22, 0xf8, 0xd7, 0x7f, 0xea, 0x7a, 0xe1, 0x55, 0x65, 0x52, + 0x78, 0xb9, 0x5e, 0x7a, 0x3e, 0xd0, 0x24, 0xb9, 0x35, 0x3e, 0x2b, 0xd4, 0x87, 0xaa, 0x1a, 0x7e, 0x22, 0x10, 0xf3, 0xf0, 0x29, 0x67, 0xed, 0xfd, 0x7a, 0x7c, 0x81, 0xd5, 0x1b, 0x10, 0x96, 0x81, + 0xb4, 0xa0, 0x80, 0xf7, 0x35, 0x4b, 0x48, 0x4e, 0xb8, 0x10, 0x01, 0x8e, 0x42, 0x4c, 0x2e, 0xf0, 0x14, 0x85, 0x3b, 0x1a, 0x13, 0x62, 0x06, 0x97, 0x78, 0x93, 0x2e, 0xe0, 0xfd, 0x54, 0x75, 0xe6, + 0x9a, 0xe4, 0xaf, 0xc3, 0x91, 0xba, 0xf4, 0x04, 0x1a, 0x36, 0x82, 0x0e, 0xe5, 0x2b, 0x68, 0x3d, 0x5a, 0xcc, 0x42, 0x72, 0x27, 0xf7, 0x22, 0xa5, 0x51, 0xd6, 0xb2, 0x59, 0x6a, 0xf2, 0xb6, 0x56, + 0xcd, 0x47, 0x69, 0x40, 0x37, 0x92, 0xf7, 0x9f, 0x86, 0x6e, 0xd8, 0x21, 0x70, 0x81, 0x45, 0x74, 0x72, 0x3d, 0x7a, 0x64, 0xa8, 0xe3, 0x3f, 0x21, 0xf8, 0x27, 0xf4, 0xfb, 0xd2, 0xf7, 0x89, 0x3e, + 0x30, 0x7e, 0x77, 0x32, 0x7e, 0x21, 0xfb, 0x3d, 0x83, 0x8e, 0x25, 0xd4, 0x25, 0xd6, 0xbc, 0x85, 0x64, 0xb3, 0xf3, 0x6d, 0x9e, 0xdd, 0x9f, 0x94, 0x58, 0x46, 0x3d, 0x3e, 0xf3, 0x9a, 0x0c, 0xf7, + 0x68, 0x1f, 0x8e, 0x97, 0x0c, 0xc4, 0xd8, 0x33, 0x64, 0x21, 0x87, 0xa3, 0x0c, 0x66, 0x84, 0x16, 0xc2, 0xd8, 0xf5, 0xde, 0xdd, 0x80, 0xa3, 0x1e, 0xb7, 0xe2, 0xc8, 0xad, 0xf9, 0xa9, 0x50, 0xae, + 0x43, 0xbb, 0x5a, 0x48, 0x34, 0xe7, 0x73, 0x2b, 0x48, 0x34, 0xd7, 0xdf, 0xcd, 0xe6, 0x97, 0x0c, 0xc1, 0x0f, 0x72, 0xf9, 0xf2, 0x4a, 0x9e, 0xef, 0x7a, 0xa1, 0xef, 0x7a, 0x57, 0x9b, 0x1a, 0x3f, + 0x9b, 0x85, 0x0f, 0x16, 0x8d, 0xd7, 0x2f, 0xd8, 0x61, 0x6a, 0xe7, 0xe3, 0x17, 0x7f, 0x40, 0x92, 0x8f, 0xbf, 0x4d, 0xee, 0xc6, 0x7f, 0x42, 0xcf, 0x78, 0x83, 0xbf, 0x7f, 0x1e, 0x30, 0xfe, 0xea, + 0xee, 0xf8, 0xfa, 0xdc, 0xef, 0x07, 0xe5, 0x80, 0x94, 0x05, 0xde, 0xb3, 0xfb, 0x6a, 0x12, 0x3a, 0x7e, 0xa3, 0x50, 0x07, 0xa5, 0x17, 0x29, 0x7a, 0xbd, 0x1b, 0x85, 0x31, 0xb9, 0x90, 0x2d, 0x5d, + 0x75, 0xcb, 0xc3, 0x6a, 0xe3, 0x32, 0x06, 0x94, 0xd3, 0xfa, 0x0c, 0x0b, 0xd8, 0xbc, 0x9c, 0x4f, 0x17, 0xd1, 0x02, 0x67, 0x20, 0xc2, 0x49, 0xd4, 0xcd, 0x7a, 0x41, 0xc8, 0x31, 0x30, 0x03, 0x3c, + 0x6c, 0xb7, 0x71, 0x68, 0x21, 0x05, 0x6c, 0x68, 0x83, 0xfe, 0x86, 0xd4, 0xbe, 0x1f, 0x82, 0xbf, 0x81, 0x7f, 0xaf, 0xd4, 0xcf, 0xdc, 0x7a, 0x3d, 0x1e, 0xcc, 0x1b, 0x6d, 0x4f, 0x72, 0x4d, 0x5b, + 0x4b, 0xda, 0x62, 0xcd, 0xee, 0x69, 0x7d, 0x2e, 0x18, 0x93, 0x13, 0x45, 0x15, 0x64, 0x92, 0x52, 0x96, 0x2f, 0xd3, 0x45, 0x96, 0xea, 0x65, 0x8a, 0x38, 0x5c, 0xb8, 0x46, 0x47, 0xf0, 0x4a, 0xd8, + 0x9f, 0xa4, 0x68, 0x71, 0x50, 0xe2, 0x43, 0xd5, 0xed, 0xad, 0x19, 0x39, 0x59, 0x28, 0x64, 0xb6, 0x57, 0x14, 0xa9, 0x06, 0x7d, 0x03, 0x43, 0xc4, 0x40, 0xc4, 0x2d, 0x69, 0x6e, 0x7d, 0xb7, 0x9d, + 0xfc, 0x5a, 0x60, 0xbf, 0x94, 0xbf, 0x8b, 0x08, 0xa3, 0x1f, 0x12, 0x65, 0x3d, 0x3d, 0xbc, 0xb6, 0xe9, 0xfe, 0xd4, 0xdc, 0x25, 0x38, 0x1b, 0xf8, 0x27, 0xfb, 0x05, 0xcb, 0xfc, 0x01, 0x90, 0xc5, + 0x37, 0x40, 0x6d, 0x6f, 0xed, 0x65, 0x7e, 0xdd, 0xf8, 0x94, 0x4c, 0x74, 0xb3, 0xaf, 0x18, 0x3e, 0x84, 0xef, 0xe8, 0x03, 0xe3, 0xf7, 0x67, 0x63, 0xe4, 0x53, 0x5b, 0xef, 0x1f, 0x0f, 0xc5, 0x5b, + 0x02, 0x8f, 0x6b, 0xec, 0x74, 0x14, 0x2d, 0xc9, 0x23, 0xb4, 0x6e, 0xd3, 0x20, 0x7b, 0xd6, 0xd0, 0x22, 0xa0, 0x1a, 0xed, 0x32, 0xa7, 0x98, 0xb5, 0x8b, 0x54, 0xe1, 0x40, 0xde, 0x99, 0x16, 0x19, + 0x01, 0xd8, 0x53, 0x54, 0x69, 0x5b, 0x2e, 0xe5, 0xb7, 0xed, 0x74, 0x29, 0x42, 0xcb, 0xb0, 0x23, 0x4b, 0xee, 0x40, 0xed, 0x38, 0x61, 0x44, 0xc4, 0x65, 0x98, 0x2d, 0x5b, 0x5f, 0x34, 0x47, 0xf9, + 0x24, 0x7b, 0x2f, 0xde, 0x3f, 0xee, 0x0f, 0xe3, 0x8f, 0x87, 0x43, 0x79, 0xb9, 0x73, 0x85, 0x3f, 0x31, 0x93, 0xb8, 0xb6, 0xf3, 0x3b, 0x8d, 0xdb, 0x7e, 0xbc, 0xe9, 0x9f, 0x1f, 0xef, 0x07, 0xe3, + 0xdd, 0x70, 0x3e, 0x62, 0x37, 0xfc, 0x01, 0x00, 0x61, 0x38, 0xbb, 0xaf, 0x5d, 0x75, 0xc6, 0xd7, 0xff, 0x97, 0x0e, 0xcc, 0xf0, 0x30, 0x16, 0xb3, 0xa5, 0x3f, 0x72, 0xa6, 0x61, 0xba, 0xd9, 0x99, + 0xcd, 0x12, 0x2d, 0x95, 0x03, 0x01, 0x70, 0xb9, 0x24, 0x95, 0x4b, 0xc8, 0x3d, 0xfa, 0x23, 0x87, 0x58, 0x66, 0x61, 0x37, 0xb3, 0x92, 0x2a, 0xd7, 0x43, 0x73, 0xa9, 0x2c, 0x05, 0x65, 0x09, 0x8f, + 0x76, 0x2e, 0xb9, 0xda, 0x7b, 0xc1, 0x89, 0x34, 0x46, 0xeb, 0xe5, 0x9c, 0xc9, 0xa6, 0x46, 0x75, 0x6c, 0x16, 0x50, 0x6b, 0x9e, 0x04, 0x19, 0x4d, 0xed, 0x7d, 0x25, 0xfc, 0x31, 0x8b, 0x3f, 0x76, + 0x3f, 0xfa, 0x2c, 0x88, 0x97, 0x34, 0x58, 0x53, 0x4f, 0x5f, 0x61, 0xce, 0xae, 0x75, 0x4d, 0xbf, 0x7a, 0xe0, 0x4c, 0x3e, 0x7e, 0xfa, 0x0e, 0x66, 0xc8, 0xe4, 0xe2, 0xa8, 0xff, 0x7e, 0xd8, 0x3e, + 0x8c, 0xf7, 0xa3, 0xe1, 0x3b, 0x4b, 0x01, 0xf2, 0xdc, 0xf0, 0xbd, 0x7f, 0xc2, 0x65, 0x81, 0x7e, 0x77, 0x3e, 0xbe, 0xd0, 0x1d, 0x36, 0x9c, 0x82, 0x33, 0x93, 0x4b, 0x6b, 0x54, 0x2f, 0xad, 0x59, + 0xb9, 0x14, 0x4c, 0x92, 0x20, 0xc9, 0x4e, 0x2b, 0x21, 0x47, 0x53, 0xda, 0x7d, 0x36, 0xf3, 0xb7, 0xb0, 0xb9, 0xa7, 0xb0, 0x9e, 0x9a, 0x13, 0x3b, 0xc4, 0x4c, 0x8b, 0xc5, 0x7c, 0x56, 0x8b, 0x6d, + 0x3a, 0xed, 0x39, 0xda, 0xc5, 0x68, 0x60, 0xbf, 0x5a, 0x6d, 0xb4, 0x99, 0x44, 0x10, 0x80, 0xde, 0x03, 0xeb, 0x8a, 0xa2, 0x67, 0x4c, 0xb1, 0x3b, 0x18, 0xb4, 0xfb, 0xc7, 0xc3, 0x79, 0x7d, 0x9f, + 0xf8, 0x6a, 0xdd, 0xfc, 0x75, 0x83, 0xe0, 0xf9, 0xe3, 0x1b, 0xb6, 0xc7, 0xb7, 0x26, 0xd1, 0x8f, 0x4f, 0x3c, 0x87, 0xfe, 0x88, 0xe7, 0xf1, 0xab, 0x45, 0xf4, 0x7a, 0x72, 0xf1, 0x30, 0x0d, 0xe0, + 0x36, 0x34, 0x4e, 0xa7, 0xf3, 0x83, 0x3f, 0xf5, 0x4d, 0xa1, 0xb6, 0x0f, 0x88, 0xbc, 0xee, 0x02, 0x44, 0x58, 0xb3, 0x66, 0x2a, 0xd5, 0xa4, 0xfc, 0x90, 0x5f, 0x77, 0x5f, 0xf4, 0x1d, 0xd6, 0xcd, + 0x63, 0x45, 0x7c, 0xab, 0xfe, 0x87, 0xbf, 0xe6, 0x2b, 0xf1, 0xf3, 0x1a, 0xfa, 0x72, 0x78, 0x07, 0xc7, 0xf2, 0xc7, 0xfd, 0x57, 0x2c, 0x2d, 0x51, 0x46, 0x48, 0xfa, 0x98, 0xfb, 0x1b, 0x25, 0x72, + 0x76, 0xb4, 0x13, 0x26, 0x2b, 0x02, 0x0f, 0x0f, 0x55, 0x0d, 0xfe, 0xde, 0x2b, 0x7e, 0x8d, 0xe3, 0x76, 0x93, 0x93, 0x35, 0x79, 0xf2, 0x45, 0xbf, 0x83, 0xab, 0xba, 0x50, 0xfe, 0xfe, 0xa5, 0x2f, + 0xb3, 0x28, 0x38, 0x04, 0x8d, 0xa5, 0xae, 0x4b, 0x14, 0x24, 0xd8, 0xb5, 0x3f, 0xcb, 0x48, 0x15, 0x4d, 0xe4, 0x6d, 0xe1, 0xca, 0xf0, 0x22, 0x9b, 0xd1, 0x7d, 0x01, 0xf3, 0xe9, 0x29, 0x42, 0x75, + 0x41, 0x33, 0x82, 0x68, 0x74, 0x5c, 0x28, 0x0b, 0x53, 0x41, 0xf7, 0xce, 0x72, 0x27, 0xe5, 0x68, 0xc5, 0xee, 0x8e, 0x91, 0x0e, 0xda, 0x1d, 0xea, 0x4c, 0x42, 0x97, 0xc9, 0x4f, 0x73, 0x50, 0x57, + 0x41, 0x81, 0x4d, 0x9a, 0x3f, 0x9e, 0x45, 0x37, 0x98, 0x48, 0x37, 0x61, 0x9c, 0x1f, 0xb7, 0x93, 0xe8, 0xdf, 0xde, 0xff, 0x7f, 0x33, 0xd9, 0xae, 0x55, 0x03, 0xc0, 0xf5, 0x5f, 0x6e, 0x3e, 0x30, + 0xd9, 0xc0, 0x9f, 0xcf, 0xa4, 0xc5, 0x7f, 0x24, 0x0e, 0x8c, 0xdf, 0x0e, 0x2f, 0x69, 0x9f, 0x03, 0x36, 0x18, 0x93, 0x1a, 0x97, 0xa8, 0xc5, 0x34, 0x0d, 0x0f, 0x5e, 0xdd, 0x0a, 0xb6, 0xc2, 0xa8, + 0x94, 0x54, 0x2f, 0xeb, 0xcd, 0xdc, 0x5a, 0x61, 0xe9, 0xa2, 0xb0, 0xe2, 0x10, 0x76, 0x01, 0x6b, 0x96, 0x96, 0x51, 0xb5, 0x5c, 0xf0, 0xb6, 0x25, 0xa0, 0x8b, 0x3c, 0x9b, 0xe4, 0x05, 0x55, 0xa8, + 0xa3, 0xa8, 0x9e, 0xb1, 0x18, 0x04, 0xae, 0xbd, 0x9d, 0xce, 0xc1, 0xca, 0xe4, 0x00, 0x59, 0x1c, 0x17, 0x53, 0xdb, 0xf6, 0x5b, 0xb0, 0xc3, 0xfb, 0xf6, 0xda, 0x2b, 0xb6, 0x11, 0x76, 0xde, 0x1c, + 0xdd, 0x38, 0xea, 0xdf, 0xe3, 0x6e, 0x7e, 0x28, 0x3b, 0xb2, 0x8b, 0x34, 0xb7, 0xed, 0x17, 0x43, 0x0e, 0xf9, 0x5c, 0x83, 0xa1, 0xbf, 0xe6, 0x5a, 0x7d, 0xea, 0x3b, 0xf3, 0x0b, 0x57, 0xe3, 0x62, + 0xc7, 0xdd, 0x80, 0x5f, 0xf8, 0xd1, 0xa5, 0xa5, 0x97, 0x93, 0xdb, 0x85, 0x77, 0x77, 0x25, 0x3c, 0x1b, 0x82, 0x9d, 0x1e, 0xbd, 0x21, 0xe9, 0x20, 0x1f, 0x0a, 0x3c, 0xfc, 0xd8, 0x8f, 0xf4, 0xd2, + 0xf4, 0xde, 0x84, 0xe6, 0xe6, 0x7d, 0xae, 0xf8, 0x48, 0x17, 0xbc, 0x17, 0x33, 0x89, 0x7e, 0xa5, 0x2d, 0x3c, 0x28, 0x8a, 0xfa, 0x0a, 0x5b, 0xe4, 0x16, 0x31, 0xf3, 0xc7, 0x8f, 0x8f, 0xce, 0x38, + 0xe4, 0x49, 0x4b, 0xf2, 0x33, 0x72, 0xe6, 0x40, 0xeb, 0xd1, 0x4a, 0x16, 0x8d, 0x55, 0x47, 0x28, 0x4f, 0xda, 0x5b, 0x74, 0x8b, 0x88, 0xc2, 0x0e, 0x3e, 0x92, 0xf0, 0x5c, 0x93, 0xe7, 0x7a, 0xdb, + 0x30, 0x33, 0x91, 0xcc, 0x8e, 0x11, 0x1b, 0x94, 0x4b, 0x42, 0x9f, 0x40, 0x1b, 0x58, 0x34, 0xc0, 0x36, 0x3d, 0x84, 0xc9, 0x52, 0x8c, 0x49, 0x8e, 0x6a, 0xb2, 0x20, 0x6d, 0xe2, 0x59, 0xa2, 0x27, + 0x68, 0x6a, 0x87, 0x3b, 0x22, 0x44, 0xc4, 0x8d, 0x55, 0x23, 0xae, 0xf8, 0xe7, 0xa6, 0xcd, 0x1d, 0x14, 0xcd, 0x1f, 0x0f, 0xd7, 0xc0, 0x5f, 0x82, 0xf3, 0x70, 0x01, 0x84, 0x7f, 0xa2, 0x4f, 0x6a, + 0xcc, 0x17, 0xe2, 0xc0, 0xf8, 0xf5, 0x68, 0x7c, 0x25, 0x36, 0x8c, 0xbd, 0x73, 0x65, 0x4d, 0x56, 0x7d, 0x4f, 0xd5, 0x54, 0xb2, 0x9a, 0xa0, 0xbb, 0xd5, 0x96, 0x2c, 0x6c, 0x4a, 0x8f, 0x67, 0xde, + 0x02, 0x21, 0x6d, 0x2a, 0xc9, 0x5d, 0x8a, 0x99, 0xb0, 0x12, 0xc6, 0xb0, 0xaa, 0x1a, 0xc0, 0x0a, 0x19, 0x5b, 0x53, 0x99, 0x84, 0x8b, 0xde, 0x3a, 0xa1, 0x33, 0x85, 0x71, 0x02, 0xcb, 0xdd, 0xcd, + 0x49, 0x95, 0x91, 0xf5, 0x58, 0xd5, 0xcc, 0x74, 0x3e, 0xdf, 0x72, 0x7b, 0x85, 0x6e, 0xfe, 0xdc, 0xd4, 0x78, 0x9f, 0x40, 0xfd, 0xd7, 0x7f, 0x81, 0xef, 0x6b, 0x00, 0x7e, 0x3c, 0x64, 0x73, 0xf4, + 0x15, 0x87, 0xe1, 0x0f, 0x58, 0x37, 0xc3, 0x19, 0xfc, 0x18, 0xfd, 0xf3, 0xc7, 0x23, 0xae, 0xfe, 0xed, 0x08, 0xa0, 0x3f, 0x7e, 0x0c, 0x58, 0xad, 0xef, 0x6a, 0x85, 0xc7, 0xb6, 0x09, 0xf4, 0xe4, + 0xd4, 0xbe, 0xf3, 0x9c, 0x37, 0xc8, 0xed, 0x9b, 0xab, 0x77, 0x7c, 0xa7, 0x3f, 0x1e, 0x71, 0x10, 0x73, 0x78, 0x73, 0x24, 0xa2, 0xbe, 0xd7, 0x64, 0x3c, 0xb6, 0x03, 0xf4, 0x75, 0x0d, 0x3b, 0x90, + 0xcb, 0xae, 0x88, 0x90, 0x3b, 0x94, 0x8a, 0xb0, 0x4a, 0x32, 0x12, 0xed, 0xb6, 0x58, 0xb2, 0xa7, 0x0e, 0x87, 0xc4, 0xac, 0xa2, 0x59, 0xe1, 0x90, 0x59, 0x70, 0x52, 0xe3, 0xcc, 0xd7, 0x58, 0x2f, + 0x62, 0x9b, 0x3d, 0x10, 0x2d, 0x56, 0x4c, 0x8a, 0x1f, 0x6c, 0x2f, 0x2c, 0x91, 0x2c, 0xc4, 0xc2, 0x85, 0xff, 0x85, 0x5c, 0xfe, 0xe2, 0xe0, 0xbf, 0xbd, 0xff, 0xff, 0xb6, 0xec, 0x3a, 0x7a, 0x51, + 0xfa, 0x4e, 0x77, 0xc1, 0x6c, 0x7b, 0xc9, 0xe6, 0x79, 0xe4, 0x6e, 0x42, 0x6e, 0x8c, 0x9f, 0xa1, 0x5c, 0xbc, 0xfb, 0x84, 0x17, 0x90, 0xb8, 0xd7, 0xd3, 0x31, 0xf2, 0xc9, 0xfa, 0xb9, 0xcb, 0x3c, + 0xdb, 0x30, 0x16, 0x65, 0xb8, 0xc6, 0xad, 0x56, 0x5d, 0x4e, 0x7a, 0x7f, 0x67, 0xe5, 0xe0, 0x24, 0xe2, 0x34, 0x62, 0x17, 0x53, 0x3e, 0x3f, 0x87, 0xd4, 0x7a, 0x16, 0x32, 0x2b, 0xb3, 0x14, 0x4b, + 0x40, 0x34, 0x47, 0x24, 0xc2, 0x90, 0xdc, 0x41, 0x99, 0xf8, 0x91, 0x7c, 0x50, 0x47, 0x91, 0x57, 0xcb, 0x5e, 0xbc, 0xeb, 0x23, 0x7e, 0xbe, 0xb2, 0x1b, 0xf9, 0xc4, 0x2d, 0x5d, 0x3a, 0x24, 0x5b, + 0xd7, 0x9a, 0xdd, 0x38, 0x94, 0xbe, 0x5e, 0x71, 0x89, 0x4f, 0xb8, 0xd0, 0xe7, 0xb7, 0xb8, 0x16, 0x3a, 0x5e, 0x57, 0xa6, 0xcf, 0x30, 0xd6, 0x7a, 0x51, 0x8e, 0xab, 0xdc, 0xff, 0xeb, 0xdf, 0x1f, + 0x27, 0x65, 0x7c, 0x07, 0x63, 0xf8, 0x48, 0xb4, 0x89, 0xb3, 0x01, 0xf0, 0x9c, 0x72, 0x7d, 0x0f, 0xd4, 0x07, 0x7d, 0x04, 0xec, 0xf9, 0xf1, 0x70, 0xfa, 0x8b, 0x15, 0x74, 0x4a, 0x4d, 0x6e, 0xda, + 0x31, 0xa5, 0xd6, 0xce, 0xb7, 0x75, 0xe6, 0x48, 0xb6, 0x37, 0xdd, 0xf6, 0xc7, 0x45, 0xc3, 0x21, 0x7b, 0xa9, 0x53, 0xa1, 0x95, 0x34, 0x42, 0x49, 0x9d, 0xea, 0x49, 0x6c, 0x95, 0x4a, 0xb4, 0xe6, + 0xad, 0x3d, 0x7e, 0xdd, 0x07, 0x53, 0xb5, 0xda, 0xca, 0xf8, 0x56, 0xa3, 0x9a, 0x58, 0xb7, 0xbd, 0x89, 0x67, 0x72, 0x4d, 0xd0, 0x41, 0x42, 0xb5, 0xe9, 0xe7, 0xfc, 0x27, 0x8f, 0xc7, 0x63, 0xed, + 0x39, 0x04, 0x9e, 0xef, 0xf2, 0xc1, 0xc1, 0x10, 0x7d, 0xef, 0x1f, 0xf8, 0x2d, 0x4c, 0xdf, 0xe5, 0xc3, 0x8f, 0xa0, 0xfa, 0x7e, 0x3c, 0x54, 0xdf, 0xdf, 0xe0, 0xe4, 0xfd, 0xf8, 0xf1, 0x55, 0x52, + 0xf4, 0x8f, 0xdf, 0x18, 0xd4, 0x3f, 0xc3, 0xcb, 0xfb, 0xf1, 0x68, 0xd4, 0xff, 0x36, 0xcc, 0xbc, 0xa1, 0xba, 0xe9, 0x3c, 0xe2, 0x91, 0x9d, 0x3f, 0x44, 0x9f, 0x79, 0xae, 0x7d, 0xd8, 0x67, 0xf2, + 0x17, 0x33, 0xee, 0xe5, 0x78, 0x68, 0xf7, 0xb0, 0x0d, 0x21, 0x71, 0xfb, 0x79, 0x86, 0xec, 0x93, 0xa3, 0x41, 0x79, 0xec, 0x74, 0x24, 0x02, 0x15, 0x8e, 0x7b, 0xfc, 0x14, 0x71, 0x7b, 0x20, 0xd7, + 0x83, 0xfd, 0x6c, 0xb4, 0x85, 0x4f, 0x74, 0xe7, 0x07, 0x7c, 0xca, 0x89, 0xbc, 0x22, 0xab, 0x2b, 0x39, 0x95, 0xf4, 0xd0, 0x4e, 0x82, 0xd1, 0x14, 0x9e, 0x15, 0xe0, 0x7e, 0x5a, 0xf1, 0x22, 0x8f, + 0x73, 0x3e, 0xb1, 0xce, 0x58, 0x07, 0xac, 0x46, 0x79, 0x82, 0x7d, 0x8a, 0xab, 0xbe, 0xfd, 0xd6, 0x57, 0x60, 0x81, 0xfb, 0xfa, 0xf9, 0x8f, 0xd8, 0x70, 0x21, 0x7d, 0xde, 0x19, 0x9d, 0xff, 0x0f, + 0x6d, 0x2e, 0x6d, 0x05, 0x78, 0x1d, 0xac, 0x63, 0x68, 0x96, 0x13, 0xc5, 0x41, 0x0d, 0xe0, 0x6e, 0xa6, 0xfa, 0xec, 0x8e, 0xdc, 0x50, 0xd1, 0x7e, 0xca, 0x0a, 0x53, 0x95, 0x0d, 0xd7, 0xb6, 0xa9, + 0xc2, 0xd6, 0xba, 0xef, 0xbd, 0x60, 0xbf, 0x22, 0xbb, 0x6d, 0x82, 0x52, 0x96, 0x1a, 0xa8, 0x6c, 0x81, 0x37, 0x5b, 0x05, 0x3e, 0x05, 0x58, 0x57, 0x1f, 0xc4, 0x7d, 0x5a, 0x09, 0x01, 0x77, 0x44, + 0x34, 0x26, 0xf7, 0x26, 0x97, 0x06, 0xfb, 0xf7, 0x5f, 0xff, 0xa2, 0x00, 0xae, 0xf2, 0xfc, 0xda, 0x3d, 0xe0, 0xbb, 0x55, 0x0b, 0xfd, 0x33, 0xae, 0x7c, 0xf5, 0x44, 0x60, 0xfc, 0xe5, 0xed, 0xcb, + 0x6e, 0x60, 0x00, 0x0f, 0xf5, 0xe3, 0x4c, 0xa5, 0xb5, 0x04, 0x8b, 0x60, 0x78, 0x79, 0x82, 0xfa, 0x63, 0xbf, 0x90, 0xb7, 0xf3, 0xba, 0x2a, 0x01, 0x72, 0xbd, 0x16, 0x6c, 0x60, 0xae, 0xa7, 0x0b, + 0x4e, 0x8c, 0x5b, 0x9f, 0x9a, 0x08, 0x39, 0x78, 0xe2, 0x57, 0x59, 0xb6, 0xc6, 0xa6, 0xbb, 0x72, 0xc1, 0x92, 0x91, 0x8d, 0xa3, 0xde, 0x48, 0x2f, 0x71, 0xb8, 0xe0, 0x3d, 0xe3, 0x64, 0xa0, 0xc7, + 0x9c, 0xb1, 0x20, 0x05, 0xd9, 0x8a, 0xcc, 0x80, 0x55, 0xed, 0xce, 0x6f, 0xff, 0xeb, 0xea, 0x77, 0xc4, 0x1f, 0xa5, 0x60, 0xfe, 0x67, 0x9c, 0x58, 0x76, 0xe8, 0x1b, 0x80, 0x53, 0xfc, 0x2c, 0x4c, + 0x3d, 0xb6, 0xfc, 0x87, 0x91, 0xfd, 0x9f, 0xd0, 0x13, 0xb9, 0xb2, 0x77, 0xe8, 0x9f, 0x99, 0xfc, 0x76, 0x72, 0xb1, 0x55, 0x07, 0x24, 0xc4, 0x22, 0x88, 0x8b, 0xa4, 0xec, 0xe6, 0x84, 0x18, 0xee, + 0x24, 0x56, 0x0d, 0x06, 0x18, 0x91, 0x1a, 0xb6, 0x86, 0xed, 0x0d, 0xd5, 0x1f, 0x67, 0xb1, 0x8f, 0x4e, 0x79, 0x67, 0x13, 0x33, 0x13, 0xc7, 0xf5, 0x78, 0xc9, 0x75, 0xf9, 0x7a, 0x6e, 0x01, 0xe9, + 0x72, 0xb7, 0x77, 0x37, 0x85, 0x35, 0x73, 0x95, 0xb4, 0xac, 0x96, 0x15, 0x9e, 0x65, 0xc0, 0x42, 0xac, 0x39, 0x6d, 0x19, 0x7a, 0x75, 0xc1, 0x48, 0xe4, 0x47, 0xd8, 0xb5, 0x81, 0xbb, 0xf5, 0x9b, + 0x57, 0x2a, 0xf5, 0xf2, 0xaf, 0x97, 0x04, 0xd5, 0x9b, 0x8d, 0x6e, 0x5e, 0x5d, 0x72, 0x60, 0xf5, 0x30, 0xb4, 0x5f, 0xb3, 0xe8, 0xa0, 0x9f, 0xd3, 0x01, 0x63, 0x70, 0x25, 0x78, 0x7f, 0x00, 0x9e, + 0x49, 0x56, 0xfe, 0x48, 0xfc, 0x85, 0xfb, 0xa5, 0x5e, 0x5e, 0x32, 0x62, 0x07, 0xb0, 0x7e, 0xad, 0x85, 0xab, 0xcd, 0x0c, 0x34, 0xc3, 0x12, 0x1e, 0x1d, 0x5c, 0xdc, 0x30, 0xcd, 0x6c, 0x24, 0xf5, + 0xa2, 0xb5, 0xa9, 0x6b, 0x68, 0x6a, 0xc2, 0xeb, 0x5d, 0x36, 0xdf, 0x17, 0x09, 0xc7, 0xa4, 0x50, 0x60, 0xe3, 0x6d, 0x50, 0xe6, 0xf8, 0x06, 0xc6, 0x46, 0x8a, 0x2a, 0xe2, 0x30, 0x4b, 0x5a, 0xb5, + 0x3c, 0xcd, 0xa0, 0x4c, 0xea, 0xd7, 0x0a, 0xe5, 0x78, 0xac, 0x33, 0xa2, 0xc4, 0x5a, 0xd8, 0x3c, 0x44, 0xf4, 0x7d, 0xc8, 0x97, 0xe6, 0x36, 0x92, 0xf1, 0x4f, 0x88, 0xe6, 0x7f, 0x20, 0x7e, 0xe5, + 0xcb, 0xf9, 0x68, 0x68, 0x08, 0x9f, 0x98, 0xe7, 0x89, 0x5e, 0x60, 0xb5, 0x54, 0x2a, 0x28, 0xbd, 0x56, 0xa5, 0xd9, 0x8a, 0x4a, 0x16, 0x08, 0xec, 0xc5, 0x3b, 0x98, 0x9d, 0x74, 0x27, 0x97, 0x4c, + 0x15, 0xda, 0xa8, 0xd4, 0x95, 0x00, 0x4d, 0xea, 0x05, 0x9b, 0xe5, 0x30, 0x92, 0xce, 0x71, 0xcc, 0x06, 0xe8, 0xa3, 0xa9, 0x15, 0x47, 0x72, 0x35, 0x63, 0xea, 0x09, 0x78, 0x2a, 0x2d, 0x18, 0xcd, + 0xbc, 0x45, 0xb7, 0xcd, 0xb1, 0x66, 0x5e, 0x26, 0x4f, 0x46, 0xa8, 0xef, 0xce, 0xe2, 0x0f, 0x53, 0xf6, 0x45, 0x41, 0x64, 0x2f, 0xe2, 0xf8, 0xb0, 0x99, 0xf9, 0x67, 0x48, 0x90, 0xfb, 0x5a, 0x98, + 0x78, 0x46, 0x1a, 0x6f, 0x69, 0xdf, 0x56, 0xb4, 0x5e, 0x48, 0x7e, 0xcf, 0x77, 0x85, 0x5d, 0xee, 0x0e, 0x45, 0xd9, 0x28, 0x74, 0x47, 0x55, 0x47, 0x1e, 0x66, 0x68, 0x5e, 0x3c, 0x8e, 0x4e, 0xfc, + 0xaa, 0x3d, 0x32, 0x91, 0xc7, 0x8d, 0xe0, 0x24, 0x8f, 0x8a, 0x92, 0xaa, 0x63, 0xd5, 0xef, 0x92, 0x39, 0x5f, 0x2a, 0x50, 0x96, 0x4d, 0x55, 0xcf, 0xcb, 0x4f, 0x6b, 0x74, 0x77, 0x28, 0x5b, 0xb7, + 0x18, 0xc1, 0x47, 0x5f, 0x96, 0xc2, 0xe9, 0x8c, 0xc6, 0xe3, 0xdd, 0x5a, 0xcc, 0x80, 0x8a, 0x1c, 0x02, 0x6e, 0xf1, 0x9f, 0x97, 0xdf, 0xfa, 0xe2, 0x68, 0x7c, 0xc0, 0x16, 0xfc, 0x27, 0x3c, 0x7d, + 0x66, 0x75, 0x7a, 0x4f, 0xfa, 0xcd, 0x99, 0x39, 0xbe, 0x52, 0xfb, 0x9e, 0x25, 0x87, 0x9d, 0x59, 0xfb, 0x89, 0x46, 0xad, 0x08, 0x60, 0xd9, 0xea, 0xb6, 0xb4, 0x3d, 0xb1, 0x28, 0x20, 0xf9, 0x52, + 0x53, 0x62, 0xe9, 0xfc, 0x30, 0x5d, 0x20, 0x9c, 0x43, 0x47, 0xb5, 0xde, 0x10, 0x25, 0x1f, 0x82, 0x79, 0xbe, 0x22, 0x37, 0x28, 0x13, 0x42, 0x93, 0x95, 0x28, 0x8d, 0x52, 0xd6, 0x5f, 0xce, 0x1c, + 0x80, 0x65, 0x84, 0x7a, 0xd6, 0x93, 0x23, 0x4c, 0xec, 0x65, 0x76, 0xc1, 0x4c, 0x49, 0x3b, 0x7e, 0x32, 0xf6, 0xfc, 0xfa, 0x26, 0xe5, 0x8b, 0x77, 0xf2, 0xff, 0xf7, 0x5e, 0x00, 0x5f, 0xee, 0xbe, + 0x33, 0x60, 0xaf, 0x1f, 0x79, 0x20, 0x88, 0xb7, 0xa4, 0xee, 0x4f, 0xfe, 0x67, 0x92, 0xee, 0x6e, 0x28, 0x5f, 0xd8, 0x7d, 0x3e, 0x18, 0x5a, 0x77, 0xa8, 0x54, 0x61, 0xa6, 0xb2, 0x94, 0x2c, 0x69, + 0x33, 0x95, 0x0c, 0x8e, 0xf1, 0x09, 0xdb, 0x94, 0xeb, 0x15, 0xef, 0xbb, 0xe9, 0x64, 0x62, 0x1e, 0x4a, 0xca, 0xa5, 0x72, 0x0e, 0x76, 0x57, 0x62, 0xe3, 0x75, 0x9b, 0x32, 0x81, 0xa1, 0x11, 0xd4, + 0x1b, 0x07, 0xb2, 0xe4, 0xb4, 0x39, 0xcc, 0x40, 0xcb, 0x69, 0x83, 0x66, 0xa4, 0x00, 0xe6, 0x1c, 0xad, 0xcc, 0xe3, 0xb9, 0x0d, 0x2e, 0x77, 0x92, 0xbf, 0xd8, 0xac, 0x07, 0x29, 0xc4, 0x7b, 0xdc, + 0xbb, 0x2f, 0x85, 0xef, 0x4b, 0xbb, 0x7e, 0x93, 0x2b, 0xef, 0xc8, 0x7f, 0xd8, 0x6b, 0x5c, 0xc8, 0x7e, 0xcf, 0x1f, 0xb3, 0x55, 0x96, 0xc2, 0xa1, 0xb0, 0xe7, 0x11, 0xc6, 0x4d, 0x69, 0xa3, 0x81, + 0xd6, 0x8a, 0x41, 0xe4, 0x18, 0xb7, 0x47, 0x39, 0x6f, 0x5f, 0x22, 0x1e, 0x7f, 0x64, 0x4e, 0xcb, 0x59, 0xca, 0x04, 0x2c, 0x21, 0x2d, 0x54, 0x91, 0x9b, 0x57, 0x02, 0xcd, 0xcc, 0x56, 0xb0, 0x0f, + 0xbb, 0xc7, 0xd4, 0x54, 0x2d, 0x66, 0xbe, 0xce, 0x53, 0xb5, 0x92, 0x28, 0x6f, 0x85, 0x1f, 0x8c, 0x08, 0xf2, 0xd5, 0x68, 0x47, 0x0f, 0xca, 0x12, 0xb9, 0xbe, 0xc0, 0x3b, 0xac, 0xe5, 0x47, 0xeb, + 0xc5, 0xef, 0xe7, 0xb5, 0x7e, 0xa0, 0x0d, 0x8c, 0xdf, 0x0e, 0x87, 0x76, 0x52, 0x0d, 0xbc, 0x6a, 0xcb, 0xac, 0xc5, 0xdc, 0xab, 0x49, 0x9e, 0xc9, 0x1a, 0xde, 0x6c, 0xb1, 0xf5, 0x2e, 0x8b, 0xb6, + 0xb6, 0x3f, 0x9b, 0x2c, 0x94, 0xbc, 0x20, 0x39, 0xde, 0xcb, 0xc3, 0xe5, 0x3e, 0x37, 0xf2, 0x48, 0x46, 0x8f, 0x2c, 0x1f, 0x04, 0x13, 0x39, 0x04, 0x12, 0x86, 0x64, 0x29, 0x6e, 0x4a, 0xa8, 0xa2, + 0xbc, 0x6e, 0x0e, 0x11, 0x4e, 0xb4, 0x6b, 0xb2, 0x47, 0x17, 0x3c, 0x69, 0x9f, 0xca, 0xde, 0xfe, 0x0d, 0xb1, 0x89, 0x1f, 0xe3, 0xc6, 0xc1, 0xe0, 0x4d, 0x26, 0xc0, 0x6f, 0xf2, 0x24, 0xbe, 0x82, + 0xc7, 0x5d, 0xca, 0x4c, 0xae, 0x94, 0xbe, 0x67, 0x06, 0x65, 0x81, 0x73, 0xad, 0x54, 0xdc, 0x58, 0xd9, 0x6c, 0x1b, 0x0e, 0x0a, 0x4e, 0x91, 0x94, 0xf7, 0x89, 0x13, 0x6c, 0x61, 0x41, 0x55, 0x4d, + 0xdd, 0x07, 0xad, 0xa8, 0xec, 0xeb, 0xf5, 0xdc, 0x33, 0x67, 0x23, 0xb1, 0xa0, 0x27, 0x1e, 0x21, 0x22, 0x6d, 0xd8, 0x95, 0x3a, 0x78, 0xa2, 0xb9, 0xa3, 0xb8, 0x73, 0x98, 0x29, 0x5d, 0x89, 0xa5, + 0x01, 0x9d, 0xe2, 0x88, 0x5f, 0x78, 0x42, 0x6e, 0xf3, 0xe4, 0xe2, 0xf3, 0x36, 0xe3, 0xf5, 0x07, 0xe6, 0x91, 0x1e, 0xfa, 0xbd, 0xfd, 0x56, 0x8e, 0xf5, 0xd2, 0x86, 0xec, 0xbe, 0x99, 0xf5, 0x54, + 0x40, 0xea, 0xab, 0x27, 0x5d, 0x98, 0x73, 0xef, 0xc6, 0x25, 0x73, 0x62, 0x40, 0xac, 0x8a, 0x0e, 0x70, 0x73, 0x8d, 0xf7, 0xa3, 0x29, 0xc1, 0xc2, 0x04, 0x2c, 0x65, 0x51, 0x0a, 0x6f, 0x27, 0x8b, + 0x75, 0x91, 0x24, 0x95, 0xbc, 0xe8, 0x8d, 0xf9, 0xc6, 0x13, 0x84, 0x9e, 0x5a, 0x20, 0xc1, 0x7e, 0x2d, 0x9e, 0xb0, 0x7c, 0xea, 0x16, 0x3d, 0x98, 0xc8, 0xc9, 0x29, 0x5b, 0xcb, 0x22, 0x5a, 0x41, + 0x22, 0x62, 0xb1, 0xab, 0x04, 0x4c, 0xa9, 0x15, 0x8b, 0x17, 0x3b, 0x6e, 0xd5, 0x79, 0x55, 0xd8, 0xa5, 0x43, 0xfa, 0x34, 0xbd, 0xbc, 0xd6, 0x77, 0xf0, 0xf6, 0x4f, 0x6b, 0xe0, 0x4f, 0x28, 0xf7, + 0x03, 0xd4, 0x2f, 0x78, 0x20, 0xcc, 0x6d, 0xd2, 0xcc, 0xad, 0xc2, 0x9f, 0x4d, 0x63, 0xa3, 0x9d, 0xb9, 0xf8, 0x04, 0x81, 0x8a, 0x25, 0x6c, 0x5a, 0xfc, 0x71, 0xe7, 0xcb, 0x89, 0x6b, 0x3a, 0x6b, + 0xd9, 0x96, 0xe9, 0x68, 0x64, 0xd8, 0x81, 0x3c, 0x5f, 0x00, 0x46, 0xed, 0x1b, 0x3d, 0x92, 0xaf, 0x10, 0xcc, 0x17, 0xf8, 0xa9, 0x21, 0x04, 0x1c, 0x50, 0x70, 0xfd, 0xb2, 0x91, 0xa7, 0x38, 0x50, + 0x91, 0x93, 0x88, 0xec, 0x92, 0x27, 0xb7, 0x02, 0x37, 0x33, 0xeb, 0xeb, 0x75, 0xec, 0x6a, 0xe3, 0xdc, 0xc4, 0x2d, 0xc7, 0x69, 0x58, 0xb9, 0x37, 0xf5, 0x5b, 0xb7, 0x9c, 0x85, 0x9f, 0x4a, 0x66, + 0xfb, 0xe6, 0x69, 0xbf, 0xac, 0x8b, 0xeb, 0xf9, 0xf8, 0xfa, 0x9c, 0xef, 0xf9, 0x9e, 0x19, 0xa4, 0x7b, 0xe2, 0x59, 0x9c, 0x52, 0xa4, 0x42, 0x13, 0xe8, 0xa0, 0x9d, 0x8a, 0x52, 0x25, 0xd0, 0x45, + 0xe3, 0x8f, 0x8c, 0x45, 0x09, 0xfa, 0x45, 0x46, 0xcd, 0xed, 0x64, 0x44, 0x6e, 0x0f, 0xe0, 0x74, 0x82, 0xf4, 0xd9, 0x1a, 0x94, 0x52, 0x9c, 0x3c, 0xe2, 0x4b, 0x7f, 0xea, 0xa7, 0xee, 0x72, 0x86, + 0x45, 0xa6, 0x90, 0x2d, 0xd1, 0x1d, 0x77, 0xd8, 0x35, 0x7b, 0xc0, 0x81, 0x73, 0xac, 0xdd, 0x7b, 0x4f, 0xda, 0xbb, 0x77, 0xde, 0xb1, 0x4d, 0xed, 0x4b, 0x7b, 0xe2, 0x52, 0x0f, 0xc7, 0xaf, 0x80, + 0x55, 0x1f, 0x79, 0x78, 0xff, 0xab, 0x85, 0x99, 0xa4, 0xf6, 0x38, 0xd2, 0x63, 0xdd, 0xbd, 0x66, 0xc6, 0x7d, 0xfe, 0xd6, 0x17, 0x71, 0xd8, 0xd7, 0x9a, 0xea, 0x0b, 0x34, 0xb7, 0x35, 0x36, 0x42, + 0xdd, 0x3c, 0x8d, 0x5f, 0x8d, 0x9f, 0xcf, 0x95, 0x32, 0xd7, 0x46, 0x34, 0xaf, 0xa4, 0xf0, 0x9f, 0xd0, 0x4d, 0x79, 0xce, 0x35, 0xa9, 0xe8, 0x9a, 0x55, 0xf4, 0xb9, 0xc6, 0xf2, 0xb6, 0x65, 0xe1, + 0x4d, 0xe1, 0xce, 0x2f, 0x90, 0xae, 0x8b, 0x03, 0x15, 0xff, 0x57, 0x34, 0xf5, 0x7f, 0x40, 0x34, 0xf5, 0x5f, 0x61, 0xbe, 0x47, 0x8e, 0xe0, 0x81, 0xf3, 0xf7, 0x6f, 0x56, 0x8b, 0x9f, 0x1e, 0x79, + 0xd6, 0x8d, 0x9f, 0x2e, 0x0e, 0x56, 0x90, 0xeb, 0x46, 0x92, 0xe0, 0xc3, 0x8e, 0xda, 0xae, 0x20, 0x8f, 0x10, 0x8f, 0x85, 0xcd, 0xae, 0x50, 0xd2, 0xd4, 0xe6, 0x3d, 0x16, 0x4a, 0xb5, 0x98, 0x70, + 0x0c, 0x55, 0x55, 0xd9, 0xee, 0x78, 0x4c, 0x24, 0xaf, 0x76, 0x56, 0x0b, 0x8f, 0xf3, 0x8f, 0xbc, 0x40, 0x26, 0xcd, 0x68, 0xb2, 0x08, 0x11, 0xbe, 0xec, 0xda, 0x0d, 0xe4, 0x53, 0x39, 0x26, 0xab, + 0xc7, 0x46, 0x2b, 0x17, 0x48, 0x77, 0x14, 0x02, 0xcf, 0xfc, 0x13, 0x05, 0xf9, 0x71, 0x9f, 0x75, 0xc1, 0xcc, 0x44, 0xfe, 0x5c, 0x1b, 0xde, 0xf9, 0xd6, 0xe5, 0xca, 0xef, 0x7d, 0xfa, 0xf5, 0xca, + 0xab, 0xae, 0xfc, 0xfc, 0xcd, 0x97, 0x75, 0xea, 0xf2, 0x8b, 0xfe, 0xfa, 0xf7, 0x97, 0xfe, 0xce, 0xf7, 0x3e, 0xf1, 0x4b, 0xf7, 0xc1, 0x8f, 0xab, 0xcd, 0xef, 0xfc, 0x8e, 0x2f, 0x4b, 0x99, 0xfe, + 0x79, 0x82, 0xf6, 0x56, 0xd7, 0xf4, 0x52, 0xd1, 0x34, 0x54, 0xa0, 0xac, 0x00, 0x3a, 0xae, 0x3d, 0x00, 0x15, 0xb6, 0xf6, 0x82, 0x64, 0x0c, 0xd8, 0x01, 0x84, 0x40, 0x6c, 0xd8, 0x88, 0x9a, 0xe5, + 0x66, 0x63, 0xc2, 0x4a, 0x92, 0x2b, 0xbc, 0x18, 0xce, 0x09, 0x79, 0x27, 0x1d, 0x43, 0x0d, 0xda, 0xa6, 0xd2, 0xa1, 0x30, 0x54, 0xdc, 0x46, 0x8e, 0x47, 0x2b, 0xf5, 0x1c, 0xb1, 0x81, 0xa7, 0xba, + 0xb4, 0x94, 0xf7, 0xbb, 0x8a, 0x9e, 0x13, 0xcd, 0x54, 0x9d, 0x14, 0xfb, 0x29, 0xfe, 0x27, 0x02, 0xf5, 0x3f, 0x55, 0x50, 0x3e, 0x2e, 0xcf, 0xaf, 0xe3, 0xff, 0xaf, 0xa5, 0xef, 0x5f, 0x4b, 0xdf, + 0xff, 0xfc, 0xa5, 0xef, 0xe3, 0x44, 0xfa, 0x7b, 0x95, 0xd1, 0xcd, 0xd3, 0x80, 0xf1, 0xed, 0xf9, 0x60, 0xd5, 0x34, 0x1d, 0x29, 0xda, 0x86, 0xa6, 0xe2, 0x8a, 0x9c, 0x1e, 0x4a, 0x8d, 0xc9, 0xe6, + 0x9e, 0xb9, 0xaf, 0x58, 0xdc, 0xaa, 0xf0, 0x89, 0xd3, 0x91, 0x7b, 0xa0, 0x4b, 0x49, 0xc2, 0x9c, 0xb8, 0xf8, 0xde, 0x6a, 0xf0, 0x94, 0x66, 0xd0, 0x1d, 0x25, 0x19, 0xf6, 0x0a, 0x21, 0xec, 0x0d, + 0xef, 0xf4, 0xeb, 0xce, 0x22, 0x57, 0x47, 0x2a, 0xe1, 0xdc, 0x20, 0x4c, 0xda, 0xfd, 0x6c, 0x86, 0x8c, 0xd0, 0x10, 0xe8, 0x8b, 0x3f, 0xd9, 0x84, 0xfd, 0x81, 0x92, 0xa9, 0xfd, 0xc2, 0x2f, 0x93, + 0x7c, 0x7c, 0xb2, 0xbb, 0xf7, 0x5f, 0x1a, 0x3a, 0x7c, 0xaf, 0x0f, 0xfb, 0x7b, 0x87, 0xed, 0xba, 0xa0, 0xbf, 0xf8, 0xcb, 0x07, 0x0f, 0x53, 0x79, 0x3a, 0xca, 0x73, 0x97, 0x12, 0xb6, 0x56, 0xed, + 0x14, 0x04, 0x83, 0xe2, 0x8c, 0x9e, 0xb5, 0x49, 0xb0, 0xa5, 0x16, 0xa3, 0x68, 0x2d, 0x47, 0x5c, 0x6f, 0xf5, 0x78, 0x3e, 0xaa, 0x46, 0xf2, 0x04, 0x0d, 0x11, 0x9a, 0x3a, 0x49, 0xe9, 0xc2, 0x10, + 0xa0, 0x4d, 0x8a, 0x98, 0xbb, 0x2c, 0x9b, 0xc9, 0xd3, 0x9a, 0x95, 0xc9, 0xf9, 0x0c, 0x72, 0xfc, 0xb2, 0x58, 0x7b, 0x11, 0xde, 0xed, 0xc0, 0xba, 0x9d, 0x0e, 0xf7, 0x39, 0x7d, 0xab, 0xcb, 0xff, + 0x5f, 0xe0, 0xd9, 0xfb, 0x27, 0xde, 0xc6, 0x1b, 0x5e, 0xbc, 0xbe, 0x43, 0x79, 0x79, 0x9a, 0x53, 0x7e, 0xc9, 0x00, 0x46, 0x07, 0xac, 0xb6, 0xb8, 0x4b, 0x90, 0x1a, 0x23, 0xe1, 0xfa, 0x36, 0x9d, + 0x35, 0xa1, 0x48, 0x58, 0x49, 0xe1, 0x39, 0x4a, 0x4f, 0x58, 0x38, 0x14, 0x4c, 0xf1, 0x78, 0x72, 0x92, 0xf5, 0x89, 0xa9, 0xaf, 0x94, 0x5a, 0x03, 0xc5, 0x7a, 0x21, 0x2f, 0xf4, 0x98, 0x01, 0x16, + 0xd9, 0x7c, 0x93, 0xcc, 0x76, 0x76, 0x4d, 0xa8, 0x26, 0x10, 0x09, 0x18, 0xc3, 0x34, 0xea, 0x23, 0xb7, 0xe6, 0x7f, 0x93, 0xc8, 0x7f, 0xb1, 0xa4, 0xbe, 0xbb, 0xf5, 0x25, 0xc2, 0xbb, 0x5f, 0x8c, + 0x5f, 0x5b, 0xeb, 0x7d, 0x6e, 0xa5, 0xf0, 0xaf, 0x1d, 0xec, 0xbf, 0x96, 0xf1, 0xff, 0xcf, 0x2e, 0xe3, 0x1f, 0xe6, 0xd4, 0xdf, 0xab, 0xda, 0xde, 0x3f, 0x0c, 0x18, 0xdf, 0x9c, 0x0e, 0x56, 0x68, + 0x68, 0xd2, 0x42, 0x45, 0x10, 0xd1, 0xab, 0x75, 0x1b, 0x2c, 0xa8, 0x79, 0xcc, 0x92, 0xa5, 0xb2, 0x5c, 0x7a, 0x8b, 0x5c, 0x2d, 0xb7, 0x33, 0x68, 0x61, 0x82, 0xc5, 0x3c, 0xad, 0x7a, 0xd0, 0xc9, + 0x1c, 0x84, 0x1f, 0xb9, 0xc8, 0x66, 0x49, 0x77, 0x52, 0xdb, 0x1a, 0x4b, 0x10, 0x33, 0xba, 0x06, 0x5c, 0x8a, 0x05, 0x1f, 0xc7, 0x46, 0x86, 0xa2, 0xe6, 0xd6, 0xaf, 0x57, 0xf8, 0xb6, 0x80, 0x00, + 0xb0, 0xf8, 0x88, 0x06, 0xf9, 0xb7, 0x28, 0xb4, 0x97, 0x5d, 0xdf, 0x47, 0x25, 0xf6, 0xd5, 0xe6, 0x4f, 0x37, 0x8c, 0xdc, 0xae, 0x1f, 0x46, 0x84, 0x9e, 0xc1, 0x59, 0xb8, 0x92, 0x04, 0xc6, 0x2f, + 0x07, 0x57, 0xa8, 0xa0, 0xef, 0xb9, 0x1e, 0xc7, 0xf6, 0x14, 0x58, 0xfb, 0x02, 0xe0, 0xf5, 0x6b, 0x4f, 0xc3, 0x52, 0x8b, 0x8a, 0x8d, 0x79, 0xd9, 0xe3, 0x54, 0xc0, 0x4b, 0xdb, 0x5c, 0x03, 0x41, + 0x1e, 0xe8, 0x6b, 0x7e, 0x1f, 0x4d, 0x52, 0x6e, 0x79, 0x0a, 0xb1, 0xb6, 0xa2, 0x73, 0x3a, 0x56, 0x63, 0xe0, 0x50, 0x4a, 0xbb, 0x9d, 0xb3, 0x2b, 0x67, 0xce, 0x71, 0x0a, 0x40, 0x62, 0x69, 0x7b, + 0xa7, 0xa2, 0x97, 0xa7, 0x99, 0x29, 0xf9, 0x3e, 0x38, 0x64, 0x49, 0xd6, 0x8d, 0x24, 0xbf, 0xf4, 0x12, 0x28, 0xf3, 0x24, 0xfc, 0x2a, 0x29, 0xf8, 0x99, 0x88, 0xea, 0x47, 0xe2, 0x17, 0xb6, 0xdc, + 0x5e, 0xba, 0x53, 0x06, 0x76, 0x97, 0x41, 0x1e, 0x11, 0x0a, 0x44, 0xa9, 0x9b, 0x47, 0x2d, 0x16, 0x91, 0x7a, 0x27, 0x48, 0xae, 0x6f, 0x04, 0xa3, 0x92, 0xa3, 0x56, 0xeb, 0x09, 0x30, 0x0a, 0x41, + 0x6c, 0x56, 0xc1, 0xbc, 0x99, 0xfb, 0x35, 0x40, 0x47, 0x76, 0x09, 0xda, 0x7a, 0x80, 0x4a, 0x8d, 0xb2, 0x42, 0xa1, 0x82, 0x9b, 0x36, 0xf1, 0x8a, 0xf2, 0x85, 0x62, 0x11, 0x40, 0xd3, 0x0c, 0xb4, + 0xf2, 0xde, 0x52, 0x2c, 0x7b, 0xb6, 0x2a, 0x9b, 0x5b, 0x80, 0xc6, 0xfb, 0x32, 0x68, 0xd7, 0x76, 0x5c, 0x8e, 0x4b, 0x3d, 0x77, 0xed, 0x72, 0x5c, 0x78, 0xd7, 0x0e, 0xa9, 0x2f, 0x2e, 0x87, 0x07, + 0x32, 0x55, 0x94, 0xb9, 0x6e, 0x96, 0xe3, 0x30, 0x71, 0xdd, 0x5b, 0xe0, 0xa1, 0x8f, 0x79, 0x3b, 0xcf, 0x48, 0xd7, 0x2d, 0xf1, 0x0b, 0x43, 0x6f, 0x2f, 0x5d, 0x12, 0x78, 0x06, 0x48, 0x1c, 0x3c, + 0x0f, 0x44, 0xe9, 0xd8, 0x4a, 0x7c, 0xed, 0xd9, 0x5c, 0x4d, 0x1b, 0xf3, 0x22, 0x5c, 0xee, 0x35, 0x4e, 0x3e, 0xe5, 0xa3, 0x7d, 0xc0, 0x97, 0x5c, 0x9c, 0x33, 0x3c, 0x82, 0x38, 0xa3, 0xc3, 0x5a, + 0x61, 0x7a, 0xbb, 0x17, 0xd2, 0xa3, 0x99, 0x1d, 0x5c, 0x3c, 0xd0, 0x11, 0x06, 0xb5, 0xe6, 0x6a, 0xd4, 0xf7, 0x6e, 0x23, 0x8d, 0x74, 0x10, 0x9e, 0x06, 0x62, 0x3b, 0xe1, 0x49, 0x1f, 0xd9, 0x54, + 0xfe, 0xa7, 0x8c, 0x46, 0xdd, 0x4c, 0xf2, 0x47, 0xa1, 0x0c, 0xfc, 0xa9, 0x98, 0xda, 0x85, 0xe2, 0xf9, 0xbd, 0xcf, 0xff, 0xc7, 0xf8, 0xb0, 0x50, 0x59, 0x2c, 0x74, 0x29, 0x98, 0x40, 0x40, 0xb4, + 0xb3, 0x0c, 0x89, 0x83, 0x78, 0x0e, 0x3b, 0xad, 0x4e, 0xcd, 0x3e, 0x8f, 0xdc, 0x23, 0xc8, 0x4a, 0x40, 0x40, 0x92, 0xe9, 0xce, 0x6f, 0x0c, 0x39, 0xa0, 0x13, 0x71, 0x87, 0x5a, 0xe1, 0xdc, 0xcb, + 0x36, 0x65, 0x22, 0x54, 0x64, 0xbc, 0xe0, 0xb6, 0xbd, 0x2b, 0x1d, 0x1a, 0x17, 0x3c, 0x2a, 0x3e, 0x99, 0x08, 0x1d, 0xb6, 0x6f, 0x59, 0xdb, 0x10, 0x0e, 0x1e, 0x31, 0x24, 0xf8, 0x7c, 0xfd, 0x95, + 0x41, 0xd1, 0x3e, 0xe0, 0xc1, 0xe4, 0xc6, 0x02, 0xf9, 0x2d, 0x1e, 0x9c, 0xa9, 0xbe, 0xf1, 0x21, 0x28, 0xda, 0xf1, 0xe4, 0x93, 0x15, 0x72, 0x97, 0x17, 0x5b, 0x90, 0x2f, 0x23, 0x00, 0xc5, 0xb9, + 0xad, 0x23, 0x88, 0xe9, 0x4e, 0x80, 0x37, 0x40, 0xb2, 0xde, 0x01, 0x88, 0xa0, 0xf9, 0x5b, 0x6c, 0xd9, 0x28, 0x23, 0x7b, 0x63, 0xac, 0x19, 0xaf, 0xb0, 0x5a, 0x0f, 0x56, 0x24, 0xc6, 0x0a, 0x47, + 0x08, 0x98, 0x10, 0x3a, 0x6d, 0x49, 0x46, 0x34, 0xd9, 0x18, 0x8e, 0x93, 0x2e, 0x97, 0x33, 0x17, 0x70, 0x47, 0xbd, 0x0f, 0x2d, 0x46, 0x41, 0xbd, 0xf1, 0xf4, 0xc9, 0x6f, 0xa5, 0x85, 0x7c, 0x98, + 0x2f, 0x0f, 0x7b, 0xd3, 0x5f, 0x0a, 0xdf, 0x7e, 0x3f, 0x87, 0xeb, 0x57, 0xce, 0xfb, 0x95, 0xc0, 0xf7, 0x1c, 0x09, 0x10, 0xe7, 0xc0, 0xb8, 0xb5, 0x94, 0x4c, 0x60, 0x5c, 0x8f, 0x3b, 0xad, 0xdb, + 0x70, 0xb4, 0xa4, 0x6d, 0x0c, 0x7a, 0x54, 0xc7, 0xb1, 0xa0, 0xd5, 0x0b, 0x30, 0x9a, 0x44, 0xd1, 0xc9, 0x84, 0xa4, 0xed, 0x28, 0x6e, 0x67, 0x69, 0x7a, 0x22, 0x19, 0x76, 0xcd, 0x80, 0xfa, 0x11, + 0xb5, 0x8c, 0xf0, 0x40, 0xee, 0x12, 0x7a, 0xef, 0x79, 0xd1, 0xe8, 0xd4, 0x2f, 0xd0, 0xa3, 0xdc, 0x9d, 0xe6, 0x09, 0xeb, 0xa2, 0xbf, 0xc3, 0x91, 0x5f, 0xea, 0x66, 0x48, 0xea, 0xfb, 0x4d, 0x46, + 0xe7, 0x05, 0xe1, 0xed, 0x36, 0xb1, 0xf3, 0x0e, 0x4a, 0xc3, 0x83, 0x34, 0xf9, 0xdb, 0x32, 0xcb, 0xaf, 0x1a, 0xd4, 0x7f, 0x1c, 0xb2, 0x77, 0xd5, 0x10, 0xf7, 0xb5, 0xdb, 0x53, 0x6b, 0xe7, 0x2f, + 0xba, 0x2f, 0x23, 0xf8, 0x72, 0x76, 0x31, 0x09, 0x07, 0x88, 0xb6, 0xd2, 0x82, 0xdb, 0x76, 0x02, 0x7b, 0xed, 0x02, 0x27, 0x21, 0xc2, 0x3b, 0xb1, 0x0b, 0xd7, 0xd5, 0xc2, 0x85, 0xef, 0x64, 0xca, + 0xb1, 0xd4, 0x74, 0xd1, 0x4d, 0xaa, 0x4d, 0x92, 0x8f, 0x14, 0xd6, 0xe2, 0x63, 0xa1, 0x5b, 0x6c, 0x21, 0xa4, 0x76, 0x17, 0x4a, 0x77, 0xd8, 0x55, 0x29, 0xbe, 0x4f, 0x6c, 0x3b, 0x61, 0xd8, 0x22, + 0x47, 0x4f, 0xce, 0xc4, 0xc3, 0x2c, 0x4e, 0x81, 0xa0, 0x35, 0x34, 0x61, 0xe5, 0x01, 0x29, 0xb6, 0xbf, 0x0a, 0x47, 0xfe, 0x55, 0xf8, 0xf1, 0xaf, 0xc2, 0x8f, 0x7f, 0x15, 0x7e, 0x0c, 0x2b, 0xfc, + 0xb8, 0xc0, 0x6b, 0x5c, 0xca, 0xe2, 0x1f, 0xef, 0x8c, 0x9e, 0x52, 0x23, 0xbf, 0xe8, 0xbe, 0xa2, 0xbe, 0x5c, 0xcf, 0xc6, 0xe8, 0x30, 0x35, 0xb2, 0x49, 0x54, 0x50, 0x4f, 0x69, 0x63, 0xa5, 0xcb, + 0x9b, 0xf9, 0x2e, 0xc4, 0xba, 0xe5, 0x28, 0xc5, 0x36, 0xb3, 0xa5, 0x76, 0xc4, 0x30, 0x0c, 0xf0, 0x3c, 0x92, 0xde, 0xee, 0x26, 0xe5, 0x54, 0x58, 0x06, 0xc6, 0x46, 0xd8, 0xca, 0x32, 0xe0, 0x12, + 0xec, 0xce, 0x58, 0x52, 0x46, 0xed, 0xe4, 0xee, 0x56, 0xad, 0xd7, 0x90, 0x90, 0x1e, 0xd3, 0x90, 0xe7, 0xe2, 0x66, 0x9d, 0x4c, 0xa7, 0xa1, 0x0a, 0xcc, 0x66, 0xd1, 0x20, 0x6b, 0xe1, 0xfc, 0x5b, + 0xaf, 0x80, 0x22, 0x8f, 0x59, 0xf2, 0x0c, 0x22, 0xfa, 0x7b, 0xc2, 0xaf, 0x3c, 0x79, 0x39, 0xbd, 0x38, 0x2f, 0x06, 0xe4, 0x66, 0xb9, 0x5b, 0x35, 0x98, 0xcc, 0x98, 0x7c, 0xab, 0x08, 0x4c, 0xa1, + 0xd1, 0xd3, 0x20, 0x94, 0xc4, 0x48, 0x04, 0xda, 0x6d, 0x58, 0xb5, 0xab, 0xc3, 0xe8, 0x38, 0x15, 0x16, 0xcd, 0x6e, 0xed, 0x92, 0x0e, 0x0b, 0x01, 0x55, 0xc3, 0xb3, 0x64, 0xd5, 0x1f, 0x0e, 0xb1, + 0x37, 0x89, 0x1a, 0xc9, 0x1a, 0x71, 0xd5, 0xfc, 0x68, 0x36, 0xfb, 0x35, 0x6b, 0x64, 0x45, 0xb1, 0x53, 0xc4, 0x08, 0x0a, 0x17, 0x13, 0x48, 0xd0, 0x9f, 0xab, 0x8c, 0x2f, 0x3f, 0x54, 0xd7, 0xc2, + 0xd0, 0x3d, 0x28, 0xda, 0x2f, 0xba, 0x73, 0xdd, 0x69, 0x6f, 0xf4, 0xe3, 0x03, 0x9f, 0x5f, 0xa8, 0x3e, 0x33, 0x4d, 0xcb, 0x07, 0x7d, 0x8e, 0xe0, 0x41, 0x90, 0x1e, 0x17, 0x07, 0x2d, 0x98, 0xf7, + 0xf3, 0x8c, 0xc0, 0x23, 0xc4, 0x39, 0x98, 0x56, 0xb5, 0xa2, 0xe4, 0xa5, 0xb7, 0x8d, 0xba, 0x4e, 0x1d, 0x4d, 0xed, 0x04, 0x53, 0x84, 0xe0, 0x58, 0x3b, 0x13, 0x68, 0xa1, 0x03, 0x2c, 0x28, 0xe0, + 0x23, 0x09, 0xc1, 0xd1, 0x4d, 0x0a, 0xe9, 0xb2, 0xdf, 0xc9, 0x21, 0x48, 0x6f, 0xdb, 0x94, 0x60, 0x01, 0x6e, 0x21, 0x1d, 0x56, 0x7b, 0xaa, 0x8e, 0x4e, 0x1d, 0xef, 0xd6, 0xea, 0x48, 0xfd, 0x03, + 0xb7, 0xc6, 0x45, 0x5c, 0x2e, 0x49, 0x28, 0x0f, 0xad, 0xd8, 0xa7, 0x36, 0x33, 0x6f, 0x64, 0x5f, 0x45, 0xf2, 0xda, 0x15, 0x7c, 0x60, 0x3f, 0xf0, 0xac, 0xda, 0x08, 0x6a, 0x28, 0xed, 0x65, 0x9a, + 0x81, 0x99, 0xd5, 0x74, 0x2f, 0xab, 0x09, 0x71, 0x68, 0x0a, 0x0d, 0x2d, 0x12, 0x3d, 0xf6, 0xdc, 0x04, 0x63, 0x76, 0xfb, 0x88, 0x40, 0x17, 0x10, 0x33, 0x37, 0x17, 0x44, 0x81, 0x70, 0x60, 0x93, + 0x5a, 0xbe, 0xd8, 0x77, 0xe2, 0xb4, 0x07, 0x8e, 0xc7, 0x0d, 0x1b, 0xb2, 0x4a, 0x8d, 0xe0, 0x19, 0xc7, 0x19, 0xd3, 0xd4, 0xda, 0x84, 0xac, 0xbc, 0xd8, 0x2e, 0x07, 0x6d, 0x99, 0xef, 0xa2, 0x56, + 0x7d, 0x9c, 0xa4, 0x4f, 0xec, 0x96, 0x1f, 0xa2, 0x55, 0x0d, 0xac, 0x30, 0xea, 0x8d, 0xf9, 0x34, 0x27, 0x37, 0x33, 0x09, 0xca, 0x8d, 0xc0, 0x3f, 0x50, 0x06, 0xec, 0x65, 0xdb, 0xe5, 0x6a, 0xa7, + 0x31, 0xad, 0x5b, 0x9e, 0x88, 0x9d, 0x2c, 0xb6, 0x47, 0x64, 0x7d, 0x6c, 0x28, 0x64, 0x89, 0xed, 0xca, 0xd6, 0x50, 0x8f, 0x02, 0x19, 0xc7, 0x7b, 0x1f, 0x62, 0x4e, 0xed, 0x68, 0x4d, 0x25, 0x9e, + 0xc5, 0x87, 0xcb, 0x14, 0x86, 0xe1, 0xe6, 0x30, 0x63, 0xd6, 0x9e, 0x7d, 0xdc, 0x08, 0xfb, 0xc5, 0x73, 0x76, 0xec, 0x67, 0x74, 0xaa, 0xeb, 0x86, 0xf7, 0x81, 0x7c, 0x75, 0xaf, 0xe8, 0x10, 0xf7, + 0x7d, 0x0f, 0xd0, 0x53, 0x2a, 0xef, 0x4a, 0xf4, 0xc2, 0xca, 0xeb, 0xe1, 0xa5, 0x80, 0x7b, 0x80, 0xaa, 0xe3, 0x51, 0xc4, 0xe6, 0x1d, 0x6e, 0xb6, 0xae, 0xd2, 0x93, 0x5b, 0xad, 0xe4, 0xce, 0xcc, + 0x4d, 0x34, 0xdb, 0x4c, 0x4f, 0x3d, 0x71, 0xf4, 0x2b, 0x4e, 0xf6, 0x03, 0x7d, 0x21, 0x35, 0x2a, 0x2e, 0xad, 0x4a, 0x50, 0x03, 0xe8, 0xdd, 0x16, 0xaf, 0x41, 0x5d, 0x27, 0x72, 0x8d, 0x80, 0xb0, + 0x56, 0x09, 0x8e, 0x78, 0xbe, 0xb1, 0x66, 0x13, 0xd5, 0x62, 0xcd, 0xf4, 0xb0, 0x94, 0xb6, 0x6c, 0x36, 0x12, 0x6b, 0xe5, 0x39, 0x3e, 0xbe, 0xcf, 0x10, 0x2d, 0x7f, 0xc1, 0x67, 0xdc, 0x98, 0xf7, + 0xa9, 0x6f, 0x26, 0xbf, 0xd0, 0x35, 0xae, 0x05, 0x41, 0xf7, 0xf9, 0x9c, 0x9b, 0x5e, 0xf7, 0xd0, 0xdb, 0xf5, 0x94, 0x83, 0xe7, 0x4c, 0xf1, 0xcc, 0xe1, 0xf3, 0xff, 0xa1, 0x99, 0xf2, 0xaa, 0x3b, + 0x9a, 0x8a, 0x0d, 0xe9, 0x02, 0x60, 0x8a, 0xc0, 0xa5, 0xbd, 0xb5, 0x68, 0x96, 0x97, 0xf8, 0xf8, 0xa0, 0x6e, 0x29, 0xb0, 0x41, 0x28, 0x67, 0x15, 0x2f, 0x25, 0xc7, 0x37, 0x93, 0xbe, 0x98, 0xb9, + 0x45, 0x9d, 0xc1, 0xaa, 0x1d, 0xf3, 0x9b, 0x0c, 0x60, 0xb5, 0xb4, 0xef, 0x05, 0xa0, 0x26, 0xfa, 0x9c, 0xeb, 0x36, 0x31, 0x46, 0x15, 0xc8, 0xf4, 0x30, 0x43, 0x37, 0x6b, 0xaa, 0x59, 0x3a, 0xd9, + 0xa7, 0x2c, 0xdf, 0x6b, 0xdf, 0xe7, 0x47, 0x56, 0x05, 0xf2, 0xc4, 0xab, 0x5e, 0xbc, 0x2d, 0xb9, 0x7b, 0xb1, 0x22, 0x90, 0xef, 0x5f, 0x73, 0x42, 0xec, 0xa7, 0x02, 0x95, 0xd1, 0xa0, 0xda, 0xc2, + 0xb8, 0xd6, 0xf0, 0xfb, 0x72, 0xea, 0x6c, 0x5a, 0xbf, 0x0e, 0xb4, 0x10, 0x45, 0x60, 0x8d, 0x6c, 0x1c, 0x8a, 0x75, 0x8e, 0x23, 0x1c, 0x12, 0x67, 0x99, 0x9c, 0x1f, 0x6d, 0x07, 0x67, 0xf2, 0xad, + 0x70, 0x44, 0x98, 0x15, 0xc3, 0x35, 0xe4, 0x1e, 0x5d, 0x32, 0xbb, 0x79, 0x1a, 0xf2, 0x13, 0x04, 0x39, 0xb6, 0xc4, 0x74, 0xb2, 0xb7, 0x39, 0x72, 0x55, 0x0f, 0xb2, 0x22, 0x72, 0xf7, 0xb5, 0xd1, + 0xc2, 0xa3, 0x91, 0x7e, 0x02, 0x19, 0xfd, 0x95, 0xea, 0x95, 0x09, 0x97, 0xc3, 0xf1, 0x95, 0xd4, 0xf7, 0xac, 0x48, 0x26, 0x62, 0xd2, 0x61, 0xe5, 0x8e, 0x46, 0xf7, 0x0c, 0xb0, 0xe4, 0x4e, 0xe4, + 0x6c, 0x87, 0x89, 0x7d, 0xe0, 0xeb, 0xa7, 0xe3, 0x1e, 0x9e, 0x88, 0x8c, 0xb6, 0xcc, 0x4d, 0xb6, 0x2c, 0x37, 0x99, 0x61, 0x59, 0xc4, 0x5c, 0xc9, 0xe3, 0xd9, 0xc8, 0xa1, 0xfb, 0x09, 0xee, 0xef, + 0x26, 0xbc, 0x01, 0x62, 0x69, 0x3d, 0xa7, 0xeb, 0x70, 0xe2, 0x0a, 0xe0, 0x1c, 0x25, 0xac, 0x4d, 0x58, 0x84, 0x6a, 0x9d, 0x48, 0xcf, 0x4d, 0xa8, 0x22, 0xcd, 0xfd, 0xb8, 0x74, 0x5e, 0x4c, 0xfc, + 0x7f, 0xdc, 0x36, 0x12, 0xfb, 0xc0, 0xc6, 0x5c, 0xef, 0xc6, 0x55, 0x7c, 0x65, 0xdb, 0xa3, 0x5d, 0xee, 0x33, 0x8c, 0x7c, 0xa3, 0x7b, 0xe1, 0xe5, 0xdb, 0xd9, 0x65, 0x97, 0x3b, 0x80, 0x9b, 0x2b, + 0xba, 0x6b, 0x13, 0x4e, 0xd2, 0xe4, 0x8e, 0x64, 0xb1, 0xa2, 0x94, 0x6d, 0x6c, 0xb1, 0x71, 0x63, 0x0b, 0x5d, 0x24, 0x76, 0x33, 0x5b, 0xe3, 0x3d, 0x6b, 0x39, 0x19, 0x37, 0x3a, 0xd1, 0x41, 0x1c, + 0x1e, 0xa3, 0x39, 0xd5, 0x03, 0xa6, 0x38, 0x49, 0x1d, 0x22, 0x07, 0x4c, 0x11, 0x55, 0x32, 0x0c, 0x2c, 0x18, 0x20, 0x05, 0xd7, 0x27, 0x33, 0x90, 0x17, 0x0b, 0xbe, 0xd9, 0x23, 0xf4, 0x32, 0x5f, + 0x77, 0x43, 0xf2, 0xbe, 0xf5, 0x3c, 0xbf, 0xfa, 0x18, 0x1e, 0x8a, 0xd5, 0x33, 0xcc, 0xf0, 0x9d, 0xab, 0x06, 0x39, 0x1f, 0x5c, 0x25, 0xea, 0x7b, 0x16, 0x20, 0xa4, 0xd6, 0xdb, 0xed, 0x94, 0x9d, + 0x2e, 0x69, 0x21, 0x20, 0x69, 0x96, 0xee, 0x7c, 0x0c, 0x40, 0x20, 0x93, 0xa0, 0x37, 0x86, 0x6b, 0x80, 0x19, 0xdd, 0xe5, 0xed, 0x64, 0xa5, 0xb4, 0xbc, 0x05, 0xea, 0x64, 0xe3, 0xa1, 0xe6, 0x1c, + 0xd6, 0x02, 0xd6, 0x80, 0x55, 0x67, 0x2a, 0x57, 0x49, 0xe2, 0xe6, 0x6c, 0x1e, 0x72, 0x53, 0x53, 0xca, 0xe2, 0xf9, 0x24, 0x5f, 0x4f, 0xe8, 0xd5, 0x51, 0x32, 0xe5, 0x41, 0x73, 0xab, 0x78, 0x88, + 0x1f, 0x0c, 0xdf, 0xa0, 0x26, 0x0d, 0x66, 0x40, 0x71, 0x81, 0x0a, 0x3e, 0xff, 0xbb, 0x78, 0x6e, 0x07, 0xb8, 0xab, 0xe6, 0xfb, 0x95, 0xe2, 0x52, 0xfb, 0x99, 0xbf, 0x2d, 0x26, 0x60, 0x02, 0x8b, + 0x36, 0x91, 0xa6, 0x75, 0x8a, 0x14, 0xf6, 0x61, 0xa5, 0xee, 0x45, 0x16, 0x45, 0x4d, 0x6b, 0x5f, 0x48, 0xd3, 0xa5, 0xb3, 0x5b, 0xc8, 0xf2, 0x91, 0xe1, 0x68, 0xe5, 0x40, 0x16, 0xbe, 0xa2, 0x8b, + 0xbc, 0xc2, 0x42, 0xc7, 0x38, 0x1e, 0x45, 0xd9, 0x11, 0xe2, 0x9c, 0xc3, 0x11, 0xe9, 0x11, 0x4a, 0x59, 0xf4, 0xfb, 0x14, 0xf7, 0xc4, 0x61, 0x2f, 0x5f, 0xe6, 0x97, 0x84, 0xe6, 0xc7, 0x96, 0x20, + 0xfc, 0xdc, 0x32, 0xf2, 0x8e, 0xf0, 0x85, 0x19, 0xbf, 0x4e, 0x2f, 0x4c, 0x19, 0x30, 0x29, 0x8e, 0x78, 0xc9, 0x36, 0x50, 0x57, 0x4a, 0x6a, 0x39, 0x09, 0x32, 0xd6, 0xe4, 0xf8, 0x11, 0x27, 0x94, + 0xb6, 0x0c, 0x1d, 0xaa, 0xdd, 0x76, 0xaa, 0x81, 0x70, 0x55, 0x6d, 0xca, 0xad, 0x00, 0xed, 0x6b, 0x6c, 0x1a, 0xa8, 0xc2, 0x76, 0xeb, 0x4e, 0x4c, 0xdf, 0x60, 0x1a, 0x7a, 0x93, 0x34, 0x44, 0xd7, + 0x1f, 0xf9, 0x91, 0x3d, 0x33, 0x21, 0x62, 0x11, 0x31, 0x34, 0xaf, 0x87, 0xa0, 0x91, 0x22, 0x58, 0x5e, 0x0f, 0xb2, 0x06, 0x8b, 0x2e, 0x36, 0x4f, 0xfe, 0xe3, 0x56, 0xa9, 0xcf, 0xc4, 0xf6, 0x5e, + 0x89, 0x5e, 0x98, 0x71, 0x3d, 0x1c, 0xda, 0xb8, 0x96, 0xb3, 0xfd, 0x29, 0xb7, 0x42, 0x4b, 0xd1, 0x03, 0xb5, 0x4c, 0x46, 0xe8, 0xd6, 0x53, 0xf1, 0xa9, 0xc5, 0x02, 0x51, 0x73, 0x70, 0x6b, 0xe3, + 0xb8, 0xd1, 0xf7, 0x3b, 0x5d, 0x3c, 0x8d, 0x8c, 0xc2, 0x3b, 0x05, 0xe0, 0x7e, 0x62, 0x3a, 0x2b, 0xd3, 0xd5, 0xf4, 0x53, 0x6e, 0xcf, 0x83, 0x7c, 0xd5, 0xe8, 0xa5, 0xba, 0x35, 0xfa, 0xd1, 0x3a, + 0x59, 0x5b, 0x1a, 0xd3, 0xe6, 0x5b, 0x3f, 0x82, 0xd9, 0x40, 0x19, 0x16, 0x49, 0x2a, 0x93, 0xc8, 0x37, 0xc7, 0x45, 0x68, 0xdb, 0x8f, 0x21, 0xb6, 0x9f, 0x92, 0x8e, 0x77, 0x84, 0xcf, 0x0c, 0x79, + 0x77, 0x3a, 0xd4, 0xe4, 0x38, 0xed, 0xb8, 0x80, 0xca, 0x66, 0x1e, 0x9e, 0xb6, 0xa0, 0xaa, 0xec, 0xd6, 0x23, 0x54, 0x30, 0xfa, 0xc4, 0x17, 0x81, 0x58, 0x3a, 0xad, 0x66, 0xca, 0xae, 0xb2, 0xe0, + 0xaa, 0x8e, 0x37, 0x59, 0x45, 0x41, 0x40, 0x3b, 0xd1, 0xf1, 0x85, 0x70, 0x64, 0x37, 0x12, 0x38, 0x33, 0xfb, 0x6c, 0x0b, 0x0a, 0x31, 0x86, 0x27, 0x1a, 0x20, 0x49, 0x02, 0xc4, 0x18, 0xf2, 0x56, + 0x0f, 0x8e, 0x69, 0x8a, 0xac, 0xa7, 0xa5, 0xf0, 0xc9, 0xe4, 0x78, 0xd4, 0x72, 0xe3, 0x11, 0x2f, 0x7e, 0xbf, 0x51, 0xdd, 0xfd, 0x47, 0x9c, 0xb9, 0x72, 0xf7, 0xc6, 0x85, 0x3f, 0x03, 0x7a, 0xd9, + 0x51, 0x2c, 0x05, 0x6e, 0xfd, 0x1d, 0x8a, 0xd9, 0x7e, 0x6a, 0xf7, 0xfe, 0x5e, 0x82, 0x18, 0x9e, 0x07, 0xf6, 0x92, 0x43, 0xc9, 0x60, 0x51, 0x39, 0xeb, 0xbd, 0x1a, 0x05, 0x7b, 0xb7, 0x3e, 0x14, + 0x89, 0x0c, 0x97, 0x59, 0x6b, 0x96, 0x82, 0x3d, 0xdb, 0xdb, 0x81, 0x62, 0x3a, 0xbb, 0xb2, 0xd5, 0xb6, 0xd9, 0x42, 0x62, 0x21, 0xb9, 0x15, 0x88, 0x22, 0x85, 0xb9, 0x7c, 0x3f, 0x57, 0xd2, 0x95, + 0x86, 0x15, 0x9f, 0x4d, 0xb2, 0xba, 0xf6, 0x93, 0x07, 0xec, 0x20, 0x6e, 0x10, 0xe5, 0x86, 0xb3, 0xa3, 0xf6, 0x93, 0xcb, 0xdb, 0xd7, 0x7e, 0x32, 0x26, 0x3e, 0x81, 0xfa, 0xde, 0x7d, 0x59, 0x69, + 0x16, 0xb2, 0x5a, 0xcd, 0x55, 0x0d, 0xdd, 0x31, 0x5b, 0x84, 0x77, 0xe6, 0xc6, 0x44, 0xd9, 0xce, 0xd5, 0x63, 0xa4, 0xf6, 0xb0, 0x73, 0x20, 0xdd, 0x1a, 0x46, 0x2c, 0xac, 0x3f, 0x2e, 0xad, 0xd0, + 0x06, 0x32, 0xc4, 0xe5, 0x83, 0xa8, 0x9d, 0xeb, 0x76, 0x45, 0x82, 0xa9, 0x06, 0x52, 0x7d, 0x31, 0xe1, 0x15, 0x76, 0xef, 0x3a, 0x59, 0xb6, 0x38, 0x9e, 0xf2, 0xce, 0x86, 0xa6, 0x74, 0x48, 0x49, + 0x6e, 0x33, 0xc0, 0x4b, 0xfc, 0x62, 0x7e, 0xdf, 0x69, 0x82, 0xf2, 0x3e, 0xaf, 0xe6, 0xc3, 0xad, 0xdb, 0xea, 0xec, 0x7f, 0x7a, 0xfa, 0xcb, 0xfb, 0x4a, 0xf0, 0xe1, 0x7c, 0xff, 0x9c, 0xfe, 0x82, + 0x0e, 0xf3, 0x6c, 0xf0, 0xa2, 0xb2, 0x5c, 0x55, 0x7b, 0x19, 0xb1, 0xa9, 0x52, 0xd8, 0xf0, 0x75, 0xbc, 0xd3, 0xf0, 0x8d, 0x79, 0xb2, 0x4b, 0x28, 0x00, 0xcb, 0x09, 0x57, 0x71, 0xc5, 0xb2, 0xe7, + 0xf9, 0xbe, 0xb0, 0x4f, 0xd4, 0x04, 0x3e, 0x86, 0x44, 0x26, 0x3b, 0xcb, 0x35, 0xbf, 0xf0, 0x8b, 0x46, 0xcd, 0xd6, 0xf5, 0x4a, 0xa1, 0x0f, 0x2b, 0xce, 0x55, 0x47, 0x38, 0x0d, 0xd4, 0xe4, 0x6e, + 0xe7, 0xd9, 0x5e, 0xd3, 0x3a, 0xa7, 0x4f, 0xe9, 0x2f, 0xff, 0xca, 0x73, 0x19, 0x9a, 0xe7, 0xf2, 0xeb, 0xbd, 0xff, 0xed, 0xfd, 0xff, 0xd7, 0x19, 0x6b, 0xe8, 0xa1, 0x1e, 0x9b, 0xb6, 0x35, 0xfe, + 0x6a, 0x7f, 0xfe, 0x5c, 0x8f, 0x9b, 0x5b, 0xd2, 0xc0, 0xf8, 0xc3, 0x85, 0x21, 0x3d, 0x6f, 0x2e, 0x96, 0x60, 0xb2, 0xb7, 0x65, 0x0e, 0x94, 0xd8, 0x03, 0x86, 0x7b, 0x3b, 0x68, 0x16, 0x19, 0x6a, + 0xb1, 0x45, 0x3b, 0x3d, 0x93, 0xf1, 0x32, 0xf0, 0x57, 0xa1, 0xd1, 0x8a, 0xd4, 0x91, 0x4b, 0x57, 0xe0, 0x56, 0x99, 0x8e, 0x48, 0x5b, 0x45, 0x0d, 0x71, 0xa6, 0xab, 0xe0, 0x2c, 0x6e, 0x4b, 0xb0, + 0x6c, 0x61, 0x36, 0x4f, 0xc5, 0x54, 0x69, 0x04, 0x9d, 0x6f, 0xd6, 0xe1, 0x7a, 0xbf, 0xd8, 0x78, 0x9a, 0x3c, 0xe1, 0x87, 0x18, 0xc3, 0x86, 0x5e, 0xd8, 0x18, 0xfa, 0xb8, 0x85, 0x2b, 0xf4, 0x73, + 0xf2, 0x84, 0x42, 0x7b, 0xa3, 0x7a, 0x61, 0xc8, 0xcb, 0xf1, 0xf8, 0x42, 0xeb, 0x7b, 0x5e, 0xcc, 0xb6, 0xa9, 0xae, 0x85, 0xab, 0x98, 0x28, 0xd1, 0xfd, 0xc1, 0xe0, 0x56, 0x64, 0x37, 0x32, 0x26, + 0xa3, 0xed, 0xd6, 0xad, 0x45, 0xb4, 0xce, 0x0b, 0x8a, 0xa8, 0x8d, 0x3a, 0x37, 0x7c, 0x61, 0x93, 0x16, 0xb8, 0xb3, 0xa5, 0xa4, 0x53, 0x70, 0xa2, 0xf2, 0x0e, 0x0b, 0x7c, 0x30, 0x97, 0x37, 0x01, + 0x09, 0x9e, 0x7a, 0x63, 0x67, 0xf3, 0x4c, 0xd3, 0xb7, 0x19, 0xe1, 0x77, 0x69, 0x82, 0x42, 0x99, 0xad, 0x7c, 0x0a, 0xe9, 0x1b, 0xbe, 0x7b, 0x6d, 0x26, 0xf6, 0xf3, 0xe1, 0xbb, 0x4f, 0x9f, 0xf2, + 0xdb, 0xbf, 0x27, 0x7c, 0x7e, 0xfd, 0x77, 0xa7, 0xe3, 0xe9, 0x30, 0xcf, 0x7d, 0xba, 0x8a, 0x50, 0xa6, 0x60, 0x37, 0x58, 0xd8, 0xbb, 0x3b, 0xfa, 0xe0, 0x1c, 0x57, 0x01, 0x9b, 0x70, 0x44, 0x61, + 0x25, 0xa2, 0xc7, 0xf5, 0xdc, 0x0a, 0x65, 0x99, 0x48, 0xc3, 0x26, 0x1b, 0x17, 0x07, 0x8d, 0xb4, 0x25, 0xb7, 0xd5, 0xc4, 0xe7, 0x56, 0xbb, 0x4d, 0xe7, 0x2c, 0x31, 0xae, 0xab, 0xb5, 0x06, 0x2f, + 0x89, 0x65, 0xea, 0x20, 0x13, 0xb1, 0xea, 0xe5, 0x2e, 0x8b, 0x85, 0x22, 0x20, 0x0e, 0xbe, 0xfb, 0x99, 0x03, 0xb1, 0x9e, 0x77, 0x63, 0xbb, 0x2d, 0xed, 0xf8, 0xfc, 0xca, 0x8f, 0xa3, 0xa0, 0xf0, + 0x13, 0xe6, 0xce, 0x27, 0xea, 0x17, 0x5e, 0x7c, 0xb8, 0x36, 0xbe, 0xd0, 0xfe, 0x9e, 0x21, 0x01, 0x65, 0x96, 0x1b, 0x60, 0x7d, 0x10, 0x8c, 0xff, 0x87, 0xbd, 0x37, 0x6b, 0x52, 0x57, 0x6b, 0xf6, + 0x06, 0xef, 0xfb, 0x53, 0xec, 0xd8, 0xb7, 0x1c, 0x37, 0x93, 0x4c, 0x6f, 0x74, 0x77, 0x1c, 0x10, 0x14, 0x45, 0x44, 0x46, 0x85, 0x8b, 0x37, 0x82, 0x19, 0x94, 0x49, 0x46, 0x21, 0xa2, 0x9f, 0xcf, + 0xde, 0x51, 0x5a, 0x93, 0x55, 0x5a, 0xc5, 0xf6, 0xd9, 0x1d, 0x1d, 0x71, 0xe2, 0xf9, 0xdf, 0xfc, 0x99, 0x2a, 0x91, 0xdf, 0xca, 0x95, 0x2b, 0x33, 0x57, 0x0e, 0x56, 0xbe, 0xea, 0x8f, 0xb9, 0xcf, + 0x3b, 0xd1, 0xbe, 0x90, 0x92, 0x0d, 0x73, 0x5a, 0x6c, 0xdc, 0x6e, 0xbf, 0x12, 0x56, 0x79, 0x38, 0x45, 0x38, 0x8c, 0x67, 0xb7, 0x7a, 0x27, 0x6b, 0xaa, 0x77, 0x98, 0xf1, 0x5e, 0x1c, 0x1d, 0x0e, + 0x10, 0x9b, 0x64, 0x91, 0x2f, 0x13, 0x4e, 0xe2, 0x68, 0xb8, 0xc7, 0x4b, 0x76, 0xb0, 0xa1, 0x63, 0x95, 0xcc, 0x73, 0xf9, 0x51, 0x85, 0x9c, 0xaf, 0x18, 0xd5, 0xa5, 0xff, 0xd0, 0x43, 0xfa, 0xa4, + 0xcc, 0x78, 0x25, 0x7a, 0x45, 0xe4, 0x72, 0x38, 0x56, 0x4e, 0x18, 0x92, 0x18, 0x6a, 0x62, 0x77, 0xa0, 0x6d, 0x7d, 0x81, 0x91, 0x90, 0xba, 0xcf, 0xd0, 0xb5, 0xed, 0x1a, 0xe1, 0xa1, 0x29, 0x4b, + 0x47, 0x4c, 0x7d, 0xc2, 0xb2, 0x36, 0xe6, 0x42, 0x55, 0x0d, 0x22, 0x4d, 0x6b, 0x13, 0x97, 0x65, 0x25, 0x82, 0xb8, 0x10, 0x2d, 0xba, 0xa5, 0x9b, 0xd5, 0x32, 0x41, 0xb0, 0x5c, 0x29, 0xc0, 0x6b, + 0x68, 0x73, 0x3e, 0x3a, 0x7e, 0x7d, 0x70, 0xf3, 0xfd, 0x60, 0x74, 0xc2, 0x37, 0x0d, 0xc7, 0x29, 0x6d, 0xd7, 0x9f, 0xf8, 0xe7, 0xc2, 0xce, 0xaa, 0xc7, 0x7e, 0x83, 0x4b, 0x4c, 0xd8, 0x13, 0xf3, + 0xe3, 0x96, 0xf8, 0x0b, 0x08, 0xb7, 0x57, 0xae, 0xc1, 0x66, 0x23, 0xa6, 0x49, 0x3c, 0x6b, 0xb6, 0x3c, 0x3b, 0x0f, 0x4b, 0x7e, 0x4f, 0xf0, 0x48, 0xcb, 0x2d, 0x41, 0xec, 0x5c, 0x0c, 0x10, 0x31, + 0xa8, 0x3c, 0x03, 0x41, 0x5a, 0xd1, 0x84, 0xa7, 0x28, 0x35, 0x6b, 0x23, 0x15, 0x25, 0x1c, 0x83, 0xc9, 0x74, 0xd6, 0x28, 0x62, 0x2e, 0x99, 0xf3, 0xc4, 0xe3, 0x98, 0x04, 0x0a, 0x61, 0x92, 0x68, + 0x82, 0x7c, 0xf0, 0x6c, 0x3e, 0xdc, 0x09, 0xae, 0x39, 0x77, 0x70, 0xf8, 0xb4, 0x78, 0xd4, 0x33, 0xfc, 0x17, 0xa5, 0xe8, 0xdb, 0x0a, 0x73, 0x47, 0x3b, 0x72, 0xf3, 0xcc, 0xb5, 0xeb, 0x49, 0x7a, + 0x31, 0xbd, 0xff, 0x84, 0x1e, 0x3b, 0x92, 0x2f, 0x78, 0x3c, 0x62, 0x39, 0xf4, 0x39, 0x96, 0xbb, 0x90, 0x7c, 0xc3, 0xba, 0xba, 0x84, 0xab, 0x8d, 0x60, 0x37, 0x87, 0x6c, 0x52, 0x60, 0x0d, 0x2b, + 0x83, 0x88, 0xee, 0x58, 0x75, 0x68, 0xa3, 0x14, 0x0f, 0x97, 0x03, 0xdc, 0x07, 0x9a, 0xc3, 0xd4, 0xb8, 0xa9, 0x25, 0x2e, 0x27, 0xd0, 0x6d, 0x95, 0x9e, 0x66, 0x96, 0x35, 0xef, 0xa6, 0xf8, 0x80, + 0x23, 0x78, 0x62, 0x1c, 0xa8, 0x03, 0xdc, 0x73, 0xdb, 0x1d, 0x8a, 0xf2, 0x18, 0x0f, 0x24, 0x8c, 0x5c, 0x58, 0xe2, 0x16, 0x3e, 0x92, 0x09, 0x40, 0x90, 0xbc, 0x0d, 0x3d, 0x87, 0x70, 0x10, 0x27, + 0xc9, 0xa4, 0xb4, 0xb3, 0xf0, 0xad, 0x2c, 0xf4, 0x63, 0xf8, 0x9a, 0x20, 0x78, 0x18, 0x01, 0x88, 0xdf, 0x64, 0x09, 0x8e, 0x86, 0xef, 0x42, 0xf2, 0x05, 0xbe, 0xcb, 0xc1, 0xe4, 0x42, 0xe5, 0x77, + 0xf8, 0xe6, 0x5a, 0x3c, 0x2b, 0x36, 0xe7, 0xba, 0x8b, 0x2d, 0x8b, 0xe7, 0x2c, 0xc7, 0x75, 0xb4, 0xa5, 0x6b, 0x1d, 0x38, 0xc5, 0x58, 0xce, 0x32, 0xaa, 0x3f, 0x81, 0x05, 0x3b, 0x3f, 0x6a, 0x09, + 0x85, 0x81, 0xf4, 0x79, 0x60, 0xe1, 0xcc, 0x66, 0xdc, 0x7a, 0x43, 0x98, 0x12, 0x4e, 0x96, 0xb1, 0x08, 0x86, 0x6b, 0x95, 0x35, 0x89, 0xca, 0x2b, 0x45, 0xa7, 0x27, 0xa3, 0x3c, 0xa0, 0x59, 0xb3, + 0x69, 0x4e, 0xd2, 0x88, 0x40, 0x8e, 0xcf, 0x8b, 0xfa, 0x0b, 0x23, 0x7e, 0xa9, 0x63, 0x1d, 0xfb, 0xbe, 0x4f, 0x60, 0xd3, 0xd7, 0x9b, 0xc8, 0xcf, 0x38, 0x5e, 0xc2, 0x0d, 0x7e, 0x92, 0x00, 0x4f, + 0x82, 0x79, 0xa1, 0xfb, 0x81, 0xe8, 0x25, 0xa8, 0x61, 0x64, 0x94, 0xa9, 0x28, 0xbb, 0x7b, 0x4e, 0x77, 0x66, 0x42, 0xcd, 0xe5, 0x84, 0x13, 0x9d, 0xb8, 0x0a, 0xc7, 0x70, 0x88, 0xef, 0xbd, 0xe9, + 0xde, 0xce, 0x5b, 0x2b, 0x91, 0xc0, 0x23, 0x65, 0xa0, 0xd1, 0xc1, 0xd0, 0xe7, 0xe0, 0xd0, 0xed, 0x08, 0x81, 0x31, 0x3c, 0x55, 0x98, 0x86, 0xcb, 0x1a, 0x74, 0x86, 0x4e, 0xa5, 0x44, 0x47, 0xc1, + 0x4e, 0xb9, 0x03, 0xcc, 0xb1, 0x43, 0x53, 0x59, 0x95, 0x03, 0x99, 0xb2, 0x80, 0x8c, 0x5a, 0x0d, 0xfa, 0xfa, 0x87, 0x79, 0xf9, 0xcc, 0xf6, 0xce, 0x85, 0xe2, 0x0b, 0x0a, 0x2f, 0xff, 0x8f, 0xdd, + 0xd8, 0x01, 0x37, 0x01, 0xa1, 0xf5, 0x83, 0x76, 0xc6, 0x55, 0xb4, 0x57, 0x56, 0x92, 0x23, 0xd1, 0x06, 0x41, 0x61, 0x78, 0x49, 0xba, 0x25, 0x02, 0x48, 0x07, 0x92, 0x9e, 0x61, 0x5e, 0x4d, 0x76, + 0xea, 0x16, 0x65, 0x64, 0x3a, 0xf7, 0xf7, 0x18, 0xb9, 0xc9, 0xf9, 0x7e, 0xa6, 0x93, 0x5b, 0x72, 0x58, 0x1c, 0x37, 0x7b, 0xb5, 0x3e, 0x68, 0x6a, 0x8c, 0x07, 0x83, 0x84, 0xcf, 0xa1, 0x82, 0xf1, + 0x5c, 0xd3, 0xe1, 0xbe, 0xa9, 0x07, 0x9f, 0xbb, 0x69, 0xfe, 0x73, 0x6b, 0xdf, 0x3b, 0x55, 0x70, 0xf2, 0x71, 0x3c, 0x76, 0xf5, 0x23, 0x24, 0x60, 0xee, 0xcc, 0xe2, 0xa8, 0x64, 0xb0, 0xdd, 0xc2, + 0x99, 0x9b, 0x7e, 0xe5, 0xd6, 0x5d, 0xaa, 0x09, 0xb6, 0x8f, 0x97, 0x52, 0xbc, 0x1c, 0xd2, 0x01, 0x8e, 0xdd, 0xd2, 0xdf, 0xad, 0x00, 0xc8, 0xa6, 0x89, 0xf5, 0x2a, 0x68, 0x4e, 0x11, 0x57, 0xe5, + 0x88, 0x46, 0x65, 0x6e, 0xe1, 0xce, 0xeb, 0x41, 0x94, 0xeb, 0x61, 0x1f, 0x20, 0xf2, 0x62, 0xd1, 0xf8, 0xbb, 0xd5, 0x42, 0x33, 0xab, 0x53, 0x39, 0x62, 0x3e, 0xbd, 0x95, 0x41, 0xf8, 0xdc, 0x5c, + 0xf4, 0x6b, 0xde, 0x88, 0x5f, 0x4f, 0x5e, 0xd6, 0xf2, 0x38, 0xab, 0x62, 0xf7, 0x5d, 0xfe, 0x3f, 0xf0, 0xc9, 0xbf, 0x7c, 0x78, 0x15, 0xff, 0xcc, 0x4b, 0x7f, 0x5f, 0xe3, 0x7a, 0xa7, 0xfa, 0x0a, + 0xed, 0xe5, 0xf8, 0xc2, 0x53, 0x23, 0x34, 0xac, 0x2d, 0xc9, 0x1c, 0xe8, 0x6a, 0xdf, 0x5a, 0x2a, 0x60, 0x2c, 0x59, 0x7d, 0x09, 0xc3, 0x11, 0x3f, 0x93, 0xb9, 0x96, 0x98, 0x9a, 0x1a, 0x4e, 0x98, + 0x7a, 0x8c, 0xad, 0x56, 0xf3, 0xcd, 0x6e, 0x79, 0x5a, 0x23, 0x28, 0x56, 0x31, 0xe9, 0x61, 0x3f, 0x05, 0x4e, 0x67, 0x4a, 0x6c, 0xda, 0xa4, 0xc2, 0xe2, 0xb6, 0xdf, 0x70, 0x1b, 0xb7, 0x3e, 0x4f, + 0xf1, 0xb3, 0xbc, 0x96, 0x51, 0x5b, 0x6b, 0x38, 0xa2, 0xaa, 0x1e, 0xc5, 0x45, 0x7c, 0xc1, 0x22, 0xf5, 0x13, 0xd7, 0x7e, 0xb8, 0xcf, 0xf3, 0x5c, 0x68, 0xe9, 0x3b, 0xd5, 0x0b, 0x16, 0xaf, 0xc7, + 0x63, 0x43, 0x4b, 0xd7, 0x08, 0xa9, 0x6a, 0x0c, 0x4c, 0x40, 0x59, 0xb7, 0x53, 0x71, 0x54, 0x3f, 0xd4, 0x09, 0x27, 0x71, 0xa8, 0x97, 0x78, 0x32, 0x5d, 0xd8, 0xab, 0xbd, 0x75, 0x94, 0x96, 0x70, + 0x23, 0xce, 0x83, 0x21, 0x40, 0x4b, 0xa5, 0xd9, 0xfa, 0x21, 0x6f, 0xf3, 0x7e, 0xd5, 0xfb, 0x3e, 0x60, 0x9e, 0x65, 0x60, 0x87, 0xab, 0xad, 0xc2, 0xca, 0x06, 0xae, 0x97, 0x9e, 0xe4, 0x29, 0xb1, + 0x02, 0x63, 0x68, 0xb7, 0x1a, 0x53, 0x84, 0xed, 0xe3, 0x97, 0xfe, 0x90, 0x67, 0x81, 0x3f, 0x55, 0xe2, 0xe9, 0x96, 0xf4, 0x0d, 0x2a, 0x97, 0xbc, 0x0a, 0x7c, 0x5c, 0x9d, 0x27, 0xb3, 0xec, 0x6c, + 0x1a, 0x6a, 0x39, 0xc1, 0x1e, 0xb6, 0xcc, 0x31, 0x83, 0xe2, 0x42, 0x8b, 0xc5, 0x42, 0xb5, 0x0f, 0x26, 0xab, 0xfa, 0x80, 0x70, 0x90, 0x83, 0xf2, 0x10, 0xb9, 0x8c, 0x78, 0x5e, 0xd5, 0xe0, 0x90, + 0x39, 0x6d, 0xc2, 0x7b, 0xe4, 0xb6, 0x03, 0x0d, 0x3b, 0xb5, 0x07, 0x8c, 0x63, 0xa6, 0xbb, 0x20, 0xaa, 0x50, 0x55, 0x57, 0x50, 0x8b, 0x4a, 0x3b, 0xa5, 0x01, 0xb7, 0x68, 0x85, 0x9a, 0xcf, 0x6d, + 0x81, 0x7d, 0x66, 0x9c, 0x6b, 0xfb, 0xa1, 0x9b, 0x09, 0x99, 0xda, 0xc5, 0x24, 0x77, 0x0e, 0x7f, 0xde, 0xf5, 0x46, 0x9d, 0x9a, 0xd8, 0x3d, 0x4e, 0x92, 0xb2, 0xf9, 0xf3, 0x23, 0x95, 0xeb, 0xfe, + 0x4c, 0x8d, 0x1e, 0xd7, 0x66, 0x9c, 0x3e, 0x25, 0xf1, 0x6f, 0xbb, 0x4b, 0x4d, 0xc7, 0x49, 0xfc, 0x5c, 0xc8, 0x9c, 0x68, 0xde, 0x2b, 0xcb, 0x7d, 0xa1, 0x37, 0xfe, 0x40, 0xc6, 0x8c, 0x98, 0xf6, + 0x9c, 0x3d, 0xcd, 0x9c, 0xc3, 0x74, 0x29, 0xc9, 0x7d, 0x13, 0xb9, 0x60, 0xd7, 0x53, 0x47, 0x93, 0x00, 0x77, 0xc6, 0xd6, 0xed, 0x96, 0x12, 0x65, 0xd0, 0x38, 0x4e, 0x6e, 0x1b, 0x52, 0x39, 0x4a, + 0x04, 0x00, 0x2d, 0x08, 0x5c, 0x5d, 0x2b, 0x92, 0xdf, 0x77, 0xd4, 0xac, 0x90, 0x21, 0x1c, 0x8e, 0xa7, 0x8f, 0x42, 0xb9, 0x7e, 0x81, 0xfd, 0x6b, 0x37, 0xa9, 0xe9, 0xd7, 0x0e, 0x1c, 0x77, 0x7a, + 0x43, 0x11, 0x97, 0x67, 0x1e, 0x00, 0x9c, 0x1f, 0x63, 0xcf, 0xfe, 0xa9, 0x8a, 0xfb, 0xdf, 0x57, 0xd7, 0xde, 0x88, 0x5e, 0x60, 0xbe, 0x1e, 0x5e, 0x8a, 0xb6, 0x8f, 0x50, 0xd9, 0xd8, 0x12, 0xad, + 0x02, 0x41, 0xd9, 0xe2, 0xb9, 0xe6, 0x1e, 0x02, 0x64, 0x95, 0xea, 0xe9, 0x7c, 0x15, 0xf8, 0x86, 0xd8, 0xee, 0x19, 0xcf, 0x0f, 0xcf, 0x0c, 0x14, 0x1b, 0x32, 0xe6, 0x3b, 0x88, 0x01, 0x43, 0xcd, + 0x7c, 0xa5, 0xcf, 0x68, 0x95, 0x94, 0x98, 0xde, 0xf2, 0x0c, 0xba, 0x37, 0x1c, 0xf2, 0xbc, 0xdf, 0x0c, 0xe8, 0xe2, 0x70, 0xd0, 0xc2, 0x03, 0x75, 0x5c, 0xef, 0x2a, 0x4b, 0x3b, 0x71, 0xf8, 0xf1, + 0xb9, 0xb2, 0x04, 0x9f, 0xe2, 0x49, 0xfe, 0xfc, 0x17, 0xfa, 0xc5, 0x4f, 0xf7, 0x61, 0x24, 0xbc, 0xdc, 0xfb, 0xda, 0xe9, 0xba, 0xba, 0xe4, 0x7b, 0x5c, 0xef, 0x22, 0x5f, 0x93, 0x11, 0xc3, 0x24, + 0x77, 0x26, 0x85, 0x5d, 0xfa, 0xd7, 0x76, 0xec, 0xff, 0xc2, 0xbe, 0x92, 0xbe, 0x74, 0x6b, 0xbf, 0x58, 0xea, 0x6f, 0xd1, 0x1a, 0xff, 0xfa, 0xde, 0x67, 0xe5, 0x23, 0x15, 0xf2, 0x5f, 0xdf, 0x52, + 0x21, 0xbf, 0x87, 0x7b, 0xfc, 0xeb, 0x5b, 0xb8, 0x47, 0xe9, 0xdb, 0x9e, 0x17, 0x97, 0xc5, 0xeb, 0xdd, 0x87, 0x15, 0x3b, 0xdd, 0x24, 0x6f, 0xbc, 0xf7, 0xcf, 0xb9, 0xc7, 0x23, 0xc4, 0x73, 0x8a, + 0xc8, 0x07, 0xdd, 0x17, 0x36, 0xf9, 0x38, 0xbb, 0x54, 0x02, 0x1c, 0x31, 0x27, 0x77, 0xb1, 0x74, 0xda, 0x55, 0x9b, 0xa3, 0x68, 0xa5, 0xa2, 0x68, 0xe1, 0x67, 0x1b, 0x3d, 0x0e, 0x67, 0x50, 0xa4, + 0x01, 0x12, 0x30, 0x00, 0x17, 0xf3, 0x17, 0x47, 0xb5, 0xb6, 0x96, 0x6e, 0x7c, 0x04, 0xb6, 0x67, 0xe4, 0x3c, 0xcb, 0x9d, 0x74, 0x70, 0x6d, 0xb7, 0x83, 0x39, 0x69, 0xd1, 0x07, 0x91, 0xc4, 0xda, + 0xb2, 0x70, 0x5c, 0xb6, 0xa4, 0x76, 0xde, 0x4b, 0xd2, 0x7a, 0x30, 0x70, 0x2a, 0xdf, 0xcf, 0x4f, 0x23, 0x94, 0x91, 0x7f, 0xa3, 0xbc, 0xff, 0x25, 0xc4, 0xf6, 0x4b, 0x23, 0xfe, 0xdb, 0x18, 0x9c, + 0x32, 0x77, 0xfd, 0xea, 0xfa, 0xd7, 0xd0, 0x0b, 0x7d, 0xf8, 0xe6, 0x76, 0x53, 0xc7, 0xc9, 0xdb, 0xbd, 0x2f, 0xcd, 0x7c, 0x9a, 0x26, 0xf6, 0x5e, 0x7f, 0x16, 0xfa, 0x49, 0xed, 0xf9, 0xc4, 0xf5, + 0xff, 0x09, 0x1e, 0xbf, 0xf9, 0x84, 0xff, 0x04, 0x8f, 0x3f, 0x35, 0xa8, 0xff, 0xc3, 0x82, 0xc7, 0x1f, 0xb5, 0x43, 0xfc, 0x1a, 0x8c, 0xf0, 0x84, 0x06, 0xfc, 0x63, 0x1b, 0xc4, 0x91, 0xd9, 0x75, + 0x8a, 0xc2, 0xcd, 0xb6, 0xd5, 0x81, 0x88, 0x1b, 0xf0, 0xec, 0x60, 0xb9, 0x60, 0xba, 0xd5, 0x9c, 0x57, 0x8b, 0x62, 0xbe, 0xc9, 0xaa, 0x03, 0x88, 0x21, 0x92, 0xa1, 0x29, 0x82, 0x33, 0x1d, 0xb6, + 0x58, 0x9e, 0xed, 0x3b, 0x63, 0x8e, 0x0e, 0x46, 0x9a, 0x6a, 0xf9, 0xc6, 0x95, 0x82, 0xc5, 0x0c, 0x98, 0x29, 0x6c, 0x11, 0x08, 0xa0, 0x8e, 0x91, 0xd3, 0x40, 0x0c, 0x51, 0xd2, 0xe2, 0x67, 0x36, + 0x97, 0x08, 0xcf, 0x45, 0x4b, 0xdf, 0xb6, 0x3d, 0xfc, 0x17, 0x7c, 0x29, 0xff, 0xfc, 0x03, 0xa6, 0xd9, 0xe3, 0xf6, 0xcf, 0xf0, 0x53, 0xd5, 0xde, 0x7f, 0xea, 0x71, 0x38, 0xa2, 0xb2, 0xb3, 0x27, + 0xf5, 0x00, 0x4a, 0x37, 0x3b, 0xd4, 0x46, 0xba, 0x8d, 0x63, 0xf1, 0xcb, 0x46, 0xb4, 0x0a, 0xcd, 0x0d, 0x0f, 0x8b, 0x66, 0xad, 0x83, 0x0d, 0xb3, 0x06, 0x1b, 0xc7, 0xb5, 0xe6, 0x94, 0xb4, 0x77, + 0xd8, 0x9c, 0x0c, 0x82, 0xa9, 0x44, 0xf6, 0x46, 0x81, 0x31, 0x01, 0xe4, 0x07, 0x2a, 0xd9, 0x70, 0xb9, 0x99, 0x63, 0xa7, 0xe9, 0xfc, 0x4c, 0x78, 0x26, 0x25, 0x85, 0xf2, 0x62, 0x1f, 0xd2, 0x95, + 0x3c, 0xc6, 0x69, 0xe1, 0xe6, 0xa9, 0x13, 0x67, 0xbe, 0xf7, 0x32, 0xeb, 0x7d, 0xfb, 0xb1, 0x2b, 0x07, 0xfa, 0x8b, 0x7c, 0x02, 0x93, 0x1b, 0xda, 0x17, 0x60, 0x6e, 0xae, 0x5c, 0xe6, 0x20, 0xf9, + 0x3b, 0x3a, 0x73, 0x79, 0x33, 0x15, 0x95, 0xa0, 0x59, 0xf9, 0x7c, 0x40, 0xb8, 0x8c, 0xc3, 0x88, 0xab, 0xf9, 0x3e, 0x12, 0x54, 0xf6, 0x04, 0x20, 0x47, 0x9a, 0x2e, 0x99, 0x24, 0x55, 0x98, 0xd6, + 0x6d, 0xe7, 0x1c, 0xc6, 0x30, 0x30, 0x6f, 0x09, 0xfb, 0x5a, 0x9d, 0xd3, 0x2a, 0x1b, 0x79, 0xc9, 0x40, 0x0d, 0x92, 0xd9, 0x9d, 0x23, 0x32, 0x61, 0xbd, 0xac, 0x4d, 0x45, 0xc9, 0x07, 0x01, 0xcc, + 0xf5, 0x72, 0xee, 0xc9, 0x06, 0xc3, 0x9e, 0x9f, 0xd8, 0xfd, 0x67, 0xb8, 0xae, 0xe1, 0x75, 0x8f, 0xd4, 0x93, 0x3c, 0x4d, 0xed, 0xcc, 0x7b, 0xe8, 0x6f, 0x84, 0x9f, 0x0b, 0x16, 0x79, 0x27, 0x7b, + 0x85, 0xf4, 0x7a, 0x3c, 0x81, 0x47, 0xc6, 0x89, 0x50, 0xbc, 0x98, 0xec, 0xeb, 0x1a, 0x64, 0x36, 0xb9, 0x59, 0x92, 0x79, 0xde, 0x1f, 0x0e, 0x1b, 0xc5, 0x5b, 0xc6, 0x89, 0xa4, 0x1d, 0x8d, 0xd5, + 0x9e, 0x01, 0x16, 0xd1, 0x59, 0xd4, 0x6a, 0x49, 0xe8, 0x8e, 0x90, 0x32, 0x3d, 0x4c, 0x13, 0x75, 0xba, 0x29, 0x0e, 0xcd, 0x29, 0x55, 0xce, 0x65, 0xce, 0x04, 0x59, 0xa0, 0xa9, 0xbc, 0xbc, 0xe4, + 0x65, 0x86, 0xe8, 0xca, 0x9e, 0x8f, 0xf6, 0x76, 0xb9, 0x39, 0xa4, 0xdf, 0xe2, 0x44, 0xdc, 0x3c, 0x2d, 0xf2, 0xcc, 0xcf, 0xea, 0x89, 0x9f, 0xc6, 0x75, 0xfd, 0x18, 0x82, 0xa7, 0xc2, 0xc8, 0xbf, + 0x51, 0xbf, 0x22, 0x71, 0x7b, 0x6d, 0x6c, 0xdf, 0x13, 0xc5, 0x43, 0x2b, 0x1f, 0x97, 0x19, 0xa0, 0x92, 0x60, 0xad, 0x3b, 0x59, 0x87, 0xca, 0x95, 0xcb, 0xa6, 0x2c, 0xb8, 0xed, 0x32, 0x90, 0x20, + 0xb0, 0x37, 0x33, 0x35, 0xce, 0x70, 0x19, 0x2c, 0x59, 0x34, 0x95, 0x9a, 0x9a, 0x6f, 0xf5, 0x72, 0x46, 0x47, 0xab, 0xc6, 0x41, 0x4b, 0x0a, 0x6a, 0x36, 0x0e, 0xa0, 0x72, 0x2a, 0xd3, 0x70, 0x90, + 0x6c, 0xe6, 0x0c, 0x05, 0x99, 0x5e, 0x60, 0xd7, 0x95, 0x32, 0xca, 0xa2, 0xff, 0xec, 0xf3, 0xbf, 0x07, 0x0e, 0xf4, 0xa4, 0x70, 0x7f, 0x23, 0x7b, 0x41, 0xe5, 0xed, 0x64, 0x02, 0x8d, 0x13, 0xeb, + 0xa0, 0x5a, 0xb6, 0x53, 0xaf, 0xea, 0x7a, 0x79, 0xc3, 0x04, 0x79, 0xb4, 0x28, 0x06, 0x2a, 0xc7, 0x4d, 0x07, 0x5d, 0x0c, 0xa8, 0x5a, 0xea, 0xec, 0x89, 0xe1, 0xb1, 0x52, 0x6b, 0xa2, 0x85, 0x42, + 0xd8, 0x51, 0x9d, 0x38, 0xa6, 0x90, 0x19, 0xe7, 0x0e, 0x71, 0x66, 0x73, 0x51, 0x49, 0x0e, 0x36, 0x4d, 0x70, 0x7b, 0xde, 0xde, 0x5b, 0x64, 0x57, 0xf1, 0x5e, 0xee, 0xcd, 0x5b, 0xe7, 0x18, 0x09, + 0xe9, 0x69, 0x1c, 0x1c, 0xf9, 0x31, 0x7e, 0x24, 0x96, 0xa1, 0xa7, 0x3a, 0x76, 0x5d, 0x49, 0x5e, 0x60, 0x78, 0x39, 0x98, 0x40, 0xe3, 0x9a, 0x73, 0x99, 0x16, 0xba, 0xd0, 0xfb, 0x0c, 0xcc, 0xc9, + 0x30, 0x10, 0x56, 0x49, 0x96, 0xec, 0x89, 0x90, 0x38, 0x9f, 0xa6, 0x61, 0x2f, 0xe1, 0x92, 0xda, 0x44, 0x8b, 0xad, 0x60, 0xdb, 0x8b, 0xaa, 0x5a, 0x30, 0xc8, 0x29, 0x64, 0x75, 0x15, 0x0a, 0xb7, + 0x61, 0xad, 0xb5, 0x79, 0x6f, 0xad, 0xb5, 0x9a, 0xa2, 0x1d, 0xdc, 0x9b, 0x4d, 0xa3, 0xc0, 0xa5, 0x3c, 0x03, 0xb3, 0xcb, 0x63, 0xeb, 0x82, 0xd2, 0x2c, 0x2d, 0xbf, 0x6d, 0xa4, 0x5d, 0x7f, 0xd3, + 0xe1, 0xa1, 0x79, 0xfb, 0x5c, 0xdf, 0x91, 0x77, 0xaa, 0xef, 0x5f, 0x7d, 0xb0, 0x47, 0x37, 0x1b, 0x59, 0xb3, 0x67, 0x3c, 0xe7, 0x4b, 0x01, 0xd8, 0x46, 0xc3, 0x5a, 0x58, 0xe9, 0xd4, 0x01, 0x53, + 0x09, 0xd0, 0x44, 0x0f, 0x22, 0x98, 0xea, 0x7c, 0xcb, 0x82, 0xac, 0xbf, 0x84, 0x77, 0x72, 0xba, 0xca, 0x70, 0x0c, 0x89, 0xb7, 0x33, 0xcc, 0x9c, 0x6a, 0xcc, 0x30, 0xa3, 0x12, 0x00, 0x93, 0x44, + 0x69, 0x9f, 0xf4, 0x9a, 0x46, 0x03, 0x6a, 0x6a, 0xe8, 0xdb, 0x14, 0xe2, 0x65, 0xbd, 0x2b, 0x58, 0x6c, 0x75, 0x1a, 0x13, 0x69, 0xe0, 0x96, 0xbe, 0x5d, 0xfb, 0x93, 0x57, 0xa1, 0xfb, 0x8f, 0xee, + 0x28, 0xdc, 0x92, 0x7e, 0x41, 0xe5, 0xe6, 0xc2, 0xd8, 0x7d, 0x05, 0xcf, 0x15, 0xe6, 0x7b, 0xf4, 0x90, 0x41, 0x62, 0xb1, 0xb4, 0xf7, 0x87, 0xb8, 0xca, 0x95, 0xd6, 0x3f, 0x2f, 0x57, 0x06, 0x27, + 0x0c, 0xf6, 0x89, 0x18, 0x90, 0xd2, 0x12, 0xce, 0x01, 0x20, 0xaa, 0x25, 0xa5, 0x1d, 0xbd, 0x94, 0x4f, 0x2b, 0x7d, 0x9a, 0x22, 0x89, 0xbb, 0xce, 0x0f, 0xe5, 0x01, 0x9c, 0xf3, 0x09, 0x99, 0x1e, + 0x31, 0xe3, 0x2c, 0xa6, 0x26, 0x0d, 0x04, 0xb5, 0x72, 0xdc, 0x82, 0x68, 0xfe, 0x48, 0xdb, 0xf9, 0x02, 0x4d, 0x5e, 0x55, 0x93, 0xaa, 0xb0, 0xbb, 0x47, 0x7b, 0xad, 0xc4, 0x53, 0xdb, 0x56, 0x9f, + 0xe8, 0x5e, 0x40, 0x79, 0x3f, 0xbb, 0xd8, 0xb8, 0x23, 0xbc, 0x21, 0xb1, 0xc2, 0x6e, 0x57, 0x82, 0xbe, 0x35, 0xb8, 0x0d, 0x4b, 0x78, 0xfc, 0x56, 0x22, 0xcb, 0xa3, 0x23, 0x65, 0xdb, 0xa2, 0x67, + 0xfb, 0xd0, 0x65, 0xe7, 0xf5, 0xee, 0x50, 0xf8, 0xbb, 0xcd, 0x2c, 0xec, 0xc9, 0xdd, 0x16, 0x29, 0xf7, 0xee, 0x79, 0xbf, 0x26, 0xb5, 0xea, 0xa8, 0xf8, 0x72, 0x82, 0x4b, 0x25, 0x83, 0x2c, 0x08, + 0x40, 0x5f, 0x95, 0x76, 0x58, 0xc1, 0x27, 0x18, 0x9b, 0x37, 0x9e, 0x4b, 0x2c, 0xf0, 0xe7, 0xbc, 0x21, 0x85, 0x5d, 0x47, 0x93, 0xa3, 0x7f, 0x8d, 0x3c, 0x43, 0xbf, 0x39, 0x9d, 0x22, 0xdf, 0xb1, + 0xb3, 0x70, 0xf2, 0xba, 0x56, 0xfe, 0xf9, 0xbf, 0xee, 0x25, 0x90, 0x77, 0x51, 0xfc, 0x29, 0xbb, 0xe4, 0x81, 0xc7, 0xcf, 0xf3, 0xaf, 0x2e, 0x8b, 0x47, 0xdc, 0xf9, 0xf7, 0x25, 0xd4, 0x85, 0xe2, + 0x25, 0xca, 0xec, 0xe5, 0x13, 0xe0, 0xdf, 0xfd, 0xf1, 0xf0, 0x84, 0xb6, 0x4f, 0xae, 0xcc, 0x10, 0xde, 0x31, 0xd3, 0xe7, 0x73, 0xce, 0x5d, 0x87, 0xa9, 0x89, 0xb1, 0x0b, 0x67, 0xe1, 0x9e, 0xc3, + 0x2f, 0x12, 0xe6, 0x6b, 0x70, 0xdc, 0xad, 0xf3, 0x0c, 0x79, 0xa2, 0x53, 0xc2, 0x6d, 0x50, 0xdc, 0x85, 0xc6, 0xef, 0x8c, 0x32, 0x9b, 0x1f, 0x06, 0xd3, 0xa4, 0xe3, 0xa9, 0x16, 0x05, 0xb1, 0xdc, + 0xc6, 0x43, 0x39, 0x97, 0xfd, 0x56, 0xd3, 0xf6, 0x7c, 0x9d, 0xcd, 0x4e, 0xbb, 0xc0, 0x27, 0xce, 0x30, 0x1d, 0x85, 0x5c, 0xe5, 0x6a, 0x03, 0x6e, 0x39, 0x6b, 0x27, 0xc8, 0xd7, 0xca, 0x7a, 0xdb, + 0x84, 0x9a, 0xdc, 0x33, 0x75, 0x84, 0x07, 0xa4, 0xc5, 0x29, 0x86, 0xae, 0xf6, 0x3b, 0x7e, 0xce, 0x82, 0xc4, 0xae, 0x99, 0xd6, 0xf0, 0xfe, 0x39, 0x43, 0x21, 0xfd, 0xec, 0xfc, 0x78, 0x30, 0xc4, + 0x17, 0xdf, 0x71, 0x3c, 0x3c, 0x96, 0x42, 0xcf, 0x44, 0xbc, 0x7c, 0x90, 0xbd, 0xa0, 0xf7, 0x76, 0x72, 0x69, 0xa1, 0x30, 0x62, 0x45, 0x1a, 0x10, 0x15, 0xd8, 0x51, 0x7b, 0x02, 0x8d, 0x68, 0x5d, + 0x3f, 0xc6, 0xc0, 0x06, 0xa0, 0x2c, 0x1b, 0x49, 0x98, 0xa4, 0xc9, 0x48, 0x6a, 0x88, 0x43, 0xa9, 0x5f, 0x94, 0x95, 0x7d, 0x06, 0x04, 0x5d, 0xc6, 0x3b, 0x61, 0x37, 0xb5, 0xf2, 0x5d, 0xc1, 0x99, + 0xcc, 0x71, 0x11, 0xc9, 0x87, 0x8e, 0x3e, 0x1c, 0xd8, 0xd9, 0x71, 0x77, 0x8e, 0x4c, 0xc8, 0x10, 0xb8, 0xe8, 0x48, 0x76, 0x83, 0x49, 0xcc, 0x31, 0x77, 0x8c, 0x81, 0xf0, 0xe9, 0xa7, 0xfe, 0xb0, + 0xed, 0xf0, 0x9c, 0x64, 0xfe, 0x42, 0xfb, 0x16, 0x98, 0xcb, 0xc6, 0xc3, 0x48, 0xd9, 0xbc, 0x8b, 0xb7, 0xe7, 0x90, 0x8b, 0xcb, 0xa5, 0x01, 0x81, 0xfe, 0x52, 0x12, 0xdd, 0x6c, 0xce, 0xd0, 0x28, + 0xb8, 0x5c, 0x59, 0xb4, 0x75, 0x12, 0xb2, 0x8e, 0xee, 0x76, 0x7d, 0xdb, 0x7a, 0xf1, 0x34, 0xa9, 0x4a, 0x78, 0x37, 0xdb, 0x20, 0x48, 0x16, 0x79, 0x01, 0x88, 0x7a, 0x0e, 0xca, 0xe6, 0x96, 0xab, + 0x1f, 0x34, 0x03, 0x51, 0x4f, 0xc1, 0xb0, 0xec, 0x36, 0x7d, 0x81, 0xf7, 0xc8, 0xb9, 0x42, 0xb3, 0xf4, 0x59, 0x03, 0xe1, 0x13, 0xfb, 0x5c, 0xb7, 0x02, 0x6f, 0xc4, 0xcc, 0xe7, 0x9d, 0x07, 0xf8, + 0xef, 0x96, 0x52, 0xf8, 0xf8, 0xe3, 0x9f, 0x7c, 0x27, 0xcf, 0x55, 0x7b, 0x7b, 0xa5, 0x0d, 0x4e, 0xde, 0x8e, 0xee, 0xe4, 0xa9, 0xfc, 0xf1, 0x68, 0x00, 0x88, 0x0d, 0x78, 0x42, 0x93, 0xde, 0x02, + 0xd6, 0xc6, 0xac, 0x20, 0xb6, 0x43, 0x73, 0x2e, 0x57, 0xe5, 0x54, 0x10, 0x1d, 0x86, 0x43, 0xa2, 0x1d, 0xc1, 0x68, 0x84, 0xb9, 0x89, 0x6d, 0x14, 0x85, 0xa4, 0xf9, 0x79, 0x19, 0x4c, 0x3d, 0xb4, + 0xc4, 0x06, 0xa3, 0x88, 0xdd, 0x2d, 0x82, 0x63, 0x50, 0x42, 0xcc, 0xb6, 0x1b, 0x5c, 0x11, 0xa9, 0x41, 0x5a, 0x29, 0x09, 0xba, 0x59, 0x14, 0x27, 0x35, 0xee, 0x50, 0xee, 0xf9, 0x56, 0xb0, 0x37, + 0x1e, 0xb2, 0x7f, 0x92, 0x5f, 0xdf, 0xc8, 0xbe, 0xb6, 0x57, 0xbc, 0x9e, 0x8c, 0xe5, 0xd2, 0xde, 0xa3, 0x5c, 0x8c, 0xf6, 0xe2, 0x93, 0xe1, 0x2a, 0xc0, 0xea, 0xe0, 0x76, 0xba, 0xec, 0x50, 0xec, + 0x31, 0x5a, 0xb9, 0x64, 0x16, 0x6e, 0x4a, 0x48, 0xb4, 0x23, 0x8e, 0x59, 0xb4, 0x6c, 0xbc, 0xea, 0xc8, 0xa2, 0xd9, 0xd9, 0x0e, 0xd2, 0x5b, 0x49, 0x04, 0x64, 0x47, 0xbb, 0x92, 0x32, 0x6b, 0x0b, + 0x70, 0x0b, 0x8d, 0xde, 0xe2, 0xa5, 0x52, 0x20, 0xab, 0x61, 0x15, 0xad, 0xac, 0xa1, 0xdd, 0xcc, 0xc9, 0xe7, 0xb8, 0x34, 0xae, 0x26, 0x76, 0x19, 0x36, 0x1f, 0x6d, 0xc8, 0xe1, 0xaf, 0x6d, 0xdc, + 0xe2, 0x6a, 0xe2, 0xbd, 0x68, 0x49, 0xb9, 0x73, 0xf0, 0xdd, 0x0f, 0x87, 0xf0, 0xd7, 0x8a, 0x87, 0x6f, 0x79, 0x32, 0x77, 0x28, 0x5c, 0xff, 0x72, 0x12, 0x57, 0xf7, 0xff, 0xf8, 0xf5, 0xf6, 0x7b, + 0x09, 0xb3, 0x6f, 0x9b, 0xe6, 0xd7, 0x8e, 0x00, 0x7f, 0x15, 0x65, 0x5e, 0xe7, 0x75, 0x5f, 0xf8, 0x7f, 0x05, 0x89, 0x1d, 0xbe, 0x3d, 0x8b, 0x3c, 0x32, 0xb9, 0x2f, 0xc3, 0x12, 0x3f, 0x92, 0x53, + 0xd0, 0x53, 0x69, 0x91, 0xaf, 0x34, 0xdf, 0x06, 0x3d, 0xae, 0x26, 0xd0, 0xef, 0xe9, 0x91, 0xf0, 0xa4, 0x42, 0xb2, 0x1d, 0x00, 0x23, 0x24, 0x07, 0x10, 0x5b, 0xfd, 0x08, 0x28, 0x15, 0xcf, 0x02, + 0x84, 0xbb, 0xd9, 0x0f, 0x83, 0x3c, 0x46, 0xee, 0x06, 0x71, 0xe6, 0x4f, 0x8a, 0x32, 0x2f, 0xfc, 0xb2, 0x8e, 0x7f, 0x08, 0x32, 0x7c, 0xee, 0x8b, 0xbe, 0x50, 0xbf, 0x7c, 0xdb, 0x97, 0x6b, 0x17, + 0xbe, 0x1e, 0xa1, 0x07, 0xa2, 0xe2, 0x29, 0x30, 0x85, 0x03, 0x92, 0xac, 0x07, 0x4f, 0x54, 0x03, 0xd2, 0x5a, 0x5a, 0x1c, 0x68, 0x00, 0x56, 0xd3, 0x03, 0x4c, 0xc8, 0xe2, 0x01, 0x8c, 0x4f, 0x7d, + 0x52, 0x40, 0x3a, 0xc2, 0x0b, 0xb3, 0x42, 0xa0, 0x4b, 0x86, 0xf5, 0xcb, 0x85, 0x59, 0x88, 0x53, 0x7c, 0x69, 0x9a, 0xee, 0x21, 0x3b, 0x7a, 0xdb, 0x8d, 0x78, 0xd8, 0x1e, 0x29, 0x1a, 0x37, 0xe6, + 0x0c, 0x09, 0xa0, 0xaa, 0x90, 0x3c, 0xb9, 0xbc, 0x7f, 0x67, 0x2a, 0xe8, 0x2f, 0xf8, 0x41, 0x9c, 0xc5, 0xf5, 0x7b, 0x7f, 0x0a, 0x60, 0x79, 0x66, 0x95, 0xbf, 0xd0, 0x7c, 0x47, 0xd3, 0x1b, 0x93, + 0xbc, 0x03, 0x4f, 0x7a, 0x13, 0x71, 0x86, 0xd6, 0xdb, 0x79, 0x4c, 0x2c, 0x71, 0x72, 0x52, 0xcc, 0x95, 0x85, 0x35, 0xc5, 0xaa, 0xa0, 0x28, 0xc4, 0x31, 0x9c, 0xf2, 0xc5, 0x25, 0xf5, 0x4f, 0x7e, + 0xce, 0x67, 0xd2, 0x97, 0xaf, 0xfa, 0x7c, 0x61, 0xcc, 0xc7, 0xbd, 0x30, 0x88, 0xd5, 0xab, 0x2c, 0xb1, 0x09, 0x28, 0xd8, 0x5e, 0x33, 0x90, 0x72, 0x5e, 0x4f, 0x85, 0x45, 0x29, 0xf0, 0xcc, 0x3e, + 0x21, 0x38, 0xaf, 0x82, 0x59, 0x3a, 0xe5, 0x3c, 0x37, 0x37, 0xec, 0x6e, 0x9f, 0xad, 0x59, 0x42, 0x65, 0xa3, 0x62, 0x13, 0xd6, 0xcd, 0x72, 0x89, 0xd8, 0xf4, 0x31, 0x24, 0x6c, 0x42, 0x56, 0xa7, + 0xf0, 0xe1, 0xbc, 0x55, 0x2d, 0x98, 0x28, 0xa6, 0x86, 0xb7, 0xc8, 0x44, 0xfe, 0x88, 0x8a, 0x63, 0x4c, 0x27, 0xcf, 0x2f, 0x1e, 0x8d, 0xef, 0x73, 0x49, 0x7c, 0x2f, 0x04, 0x2f, 0x30, 0x14, 0xde, + 0xd8, 0xa4, 0xbd, 0x90, 0xc8, 0x78, 0x7c, 0x8b, 0x7b, 0x3d, 0x1b, 0xe7, 0xab, 0x3c, 0xa4, 0xe9, 0x45, 0x51, 0x2e, 0x8a, 0x59, 0x6d, 0x2c, 0xd3, 0x55, 0x54, 0x6c, 0x8f, 0x60, 0x99, 0xcf, 0x06, + 0xcf, 0x41, 0x83, 0x65, 0x84, 0xc3, 0x60, 0x05, 0x66, 0xdb, 0x2a, 0x50, 0xf0, 0x3c, 0xeb, 0xc5, 0xee, 0x38, 0xa3, 0x15, 0x50, 0x4a, 0x66, 0x68, 0xcf, 0xcc, 0xa0, 0x84, 0x53, 0x5b, 0x3d, 0x97, + 0x39, 0xba, 0xaa, 0x96, 0xdf, 0x7d, 0x09, 0x9e, 0x3f, 0xd8, 0x49, 0xf8, 0x28, 0xf1, 0x08, 0x7e, 0xaa, 0x81, 0xe6, 0x2b, 0xcd, 0xcb, 0xf7, 0x5e, 0x8e, 0x2e, 0xe3, 0x3d, 0xc2, 0x8b, 0x50, 0xee, + 0xd5, 0x2d, 0xe4, 0x04, 0x00, 0x96, 0x41, 0x72, 0x9e, 0x55, 0x0e, 0xa0, 0x1a, 0x46, 0xb0, 0x09, 0x96, 0x55, 0x9c, 0x4a, 0x53, 0x9e, 0xab, 0xd3, 0x6c, 0x59, 0x6c, 0x79, 0x93, 0x94, 0x61, 0x7d, + 0x36, 0x08, 0x89, 0x5c, 0xb2, 0x62, 0xe0, 0xe5, 0x4e, 0x49, 0x66, 0x2b, 0x49, 0xaa, 0x94, 0x70, 0x37, 0xeb, 0x45, 0xe5, 0xe4, 0xab, 0x8c, 0x3c, 0xa4, 0x3b, 0x5d, 0x3c, 0x11, 0x43, 0x6b, 0xc4, + 0xcf, 0x2d, 0x74, 0xaf, 0xb9, 0xac, 0xf7, 0xec, 0xbd, 0xd2, 0x2e, 0x8a, 0xcb, 0xaf, 0x7e, 0x64, 0x08, 0xc4, 0x41, 0xf0, 0x00, 0xcf, 0xe9, 0x53, 0x9b, 0xca, 0x2f, 0x04, 0x5f, 0xc0, 0x8c, 0x83, + 0x60, 0x32, 0x1d, 0xb7, 0x8d, 0x8c, 0x91, 0x49, 0x7a, 0x16, 0x54, 0x7a, 0xca, 0x6c, 0xfa, 0xf5, 0x00, 0xf0, 0xbc, 0xa8, 0x0f, 0x89, 0xc4, 0x15, 0x21, 0x44, 0xcd, 0x0d, 0xc0, 0x6f, 0x71, 0x4b, + 0xf4, 0xd1, 0x76, 0x15, 0x47, 0xa1, 0x77, 0x1e, 0x42, 0xb7, 0xb3, 0x48, 0x23, 0xe7, 0xb8, 0x6d, 0x4a, 0xaf, 0x67, 0xd6, 0x82, 0x5a, 0xa7, 0xa7, 0xc0, 0xc8, 0x37, 0xa2, 0x28, 0x14, 0x75, 0xbd, + 0x34, 0x35, 0x63, 0x81, 0x37, 0xac, 0x49, 0x8c, 0x52, 0xfb, 0xe3, 0xf2, 0x6d, 0x0b, 0xff, 0xbe, 0xf1, 0xf8, 0x8c, 0x63, 0xf2, 0x8d, 0xe8, 0x05, 0x84, 0xeb, 0xe1, 0x25, 0xd6, 0x78, 0x84, 0xee, + 0xb4, 0x3b, 0x96, 0xbb, 0x82, 0x5a, 0x28, 0x53, 0x61, 0x1f, 0x08, 0x0b, 0x73, 0x90, 0xd6, 0xa9, 0xd6, 0x2c, 0x8c, 0x18, 0xd6, 0x77, 0xf3, 0xa0, 0xab, 0x50, 0x82, 0xc8, 0x28, 0xd7, 0xc5, 0x30, + 0xb0, 0x76, 0x70, 0xb6, 0x39, 0xf5, 0x73, 0xbc, 0x70, 0x65, 0x8c, 0x76, 0x62, 0x9e, 0xab, 0x22, 0x9b, 0x2d, 0x4c, 0xaa, 0xc5, 0x73, 0x5b, 0x2d, 0x91, 0xfd, 0x8c, 0x8d, 0xbd, 0x45, 0x2a, 0x76, + 0xde, 0xb0, 0x7c, 0x2e, 0xc6, 0xe5, 0xe2, 0x6b, 0x78, 0x51, 0x48, 0xfe, 0xfc, 0x88, 0x1e, 0xba, 0xcf, 0x40, 0xb9, 0x5b, 0x97, 0x71, 0xf6, 0xc8, 0x8e, 0x7c, 0xae, 0xdc, 0xe8, 0x1b, 0xd1, 0x17, + 0x0c, 0x5f, 0x0f, 0xc7, 0x96, 0x17, 0xed, 0x55, 0x40, 0xc6, 0x62, 0x34, 0x62, 0x02, 0x62, 0xc1, 0x1c, 0xbd, 0xa9, 0xb0, 0x20, 0x6d, 0xc2, 0x67, 0x36, 0x9b, 0xdd, 0x66, 0xb1, 0xd6, 0x6c, 0xae, + 0xeb, 0xcc, 0x9d, 0x1e, 0x1f, 0x96, 0xa6, 0x48, 0x0c, 0x65, 0x62, 0xb2, 0x22, 0xc4, 0xcc, 0xf7, 0xfc, 0xe1, 0xb0, 0xdd, 0x25, 0x3b, 0x0b, 0x56, 0x42, 0x42, 0xb7, 0x3d, 0xcf, 0xf2, 0x97, 0x6c, + 0x1a, 0x53, 0x87, 0x39, 0xca, 0xa7, 0xa7, 0x58, 0x46, 0x9e, 0xf3, 0xd7, 0xf8, 0xd5, 0x6d, 0xe3, 0x92, 0x47, 0x4b, 0x74, 0x5e, 0xc7, 0x61, 0x96, 0x3f, 0x74, 0x08, 0x42, 0x4f, 0x05, 0x59, 0xbd, + 0x53, 0xbd, 0x60, 0xf8, 0x7a, 0x7c, 0x51, 0xe9, 0x46, 0xcc, 0x48, 0x7d, 0xb1, 0x58, 0xec, 0x02, 0xd5, 0x6e, 0x9a, 0xca, 0x36, 0x56, 0x33, 0x80, 0x0c, 0x42, 0x03, 0xd8, 0x18, 0x2d, 0xb3, 0x3f, + 0xce, 0xb4, 0xd4, 0x68, 0x89, 0xea, 0x88, 0x67, 0xf9, 0x81, 0xb5, 0xac, 0xb6, 0x91, 0xf4, 0xcd, 0x42, 0xef, 0x21, 0xeb, 0x38, 0xd5, 0x0b, 0x5e, 0x66, 0x71, 0x8e, 0x3d, 0xa8, 0xd0, 0xa1, 0x60, + 0x3a, 0x97, 0x9e, 0xb5, 0xfc, 0xd4, 0xcf, 0x83, 0xb6, 0x1f, 0x18, 0x57, 0x61, 0x9f, 0x03, 0xf1, 0xd2, 0x86, 0xf1, 0x3d, 0xa3, 0x00, 0x7d, 0x5c, 0x13, 0xc5, 0x4f, 0xf3, 0xc3, 0xcf, 0xc5, 0x8d, + 0xc8, 0xa7, 0x78, 0xf1, 0x13, 0x5d, 0x70, 0xf2, 0xf9, 0x6c, 0x42, 0x8e, 0xe3, 0x48, 0x51, 0x3d, 0x98, 0x83, 0xbb, 0xdb, 0x48, 0x34, 0xe4, 0x77, 0x34, 0x5f, 0x0c, 0x90, 0x78, 0x2e, 0xcc, 0x79, + 0xdb, 0x85, 0x78, 0x7f, 0xe8, 0xe1, 0xcd, 0x02, 0x3d, 0xd7, 0x7e, 0x7e, 0x1a, 0xf0, 0xe9, 0xd4, 0x98, 0xe5, 0xa0, 0xb2, 0x0d, 0xb3, 0x12, 0x06, 0x17, 0x8b, 0x1a, 0x88, 0x5d, 0x34, 0x5e, 0x69, + 0x83, 0x4c, 0x72, 0x0d, 0xaa, 0x79, 0x22, 0x3c, 0x55, 0xed, 0x2e, 0x33, 0xf4, 0x74, 0xc1, 0xe1, 0x63, 0xc4, 0x9b, 0x9f, 0x5d, 0x00, 0x7d, 0xec, 0x79, 0x47, 0x9f, 0x28, 0x73, 0xf0, 0x46, 0xf4, + 0x05, 0x8b, 0xd7, 0xc3, 0xc9, 0x85, 0xd2, 0xef, 0x40, 0xf4, 0x87, 0x4d, 0xb6, 0x2d, 0x51, 0x18, 0x03, 0xe7, 0x07, 0x75, 0x3a, 0x2c, 0x2b, 0xfd, 0x6c, 0x86, 0x8d, 0xa9, 0x6f, 0xb7, 0x88, 0x0f, + 0x6f, 0x84, 0xa9, 0x47, 0x70, 0x84, 0x25, 0xad, 0xe3, 0xde, 0x9c, 0xb9, 0xce, 0x9c, 0x89, 0x35, 0xb1, 0x5f, 0xb2, 0x00, 0xd2, 0xb5, 0x29, 0xd2, 0xe1, 0x40, 0x61, 0x81, 0xb9, 0x27, 0xd2, 0x84, + 0xab, 0x1c, 0x0f, 0x51, 0xb5, 0x75, 0x92, 0xba, 0x63, 0xa4, 0x72, 0xfd, 0xe4, 0x8a, 0x79, 0x53, 0xb1, 0xee, 0x6b, 0x5f, 0x99, 0x5b, 0x14, 0x2f, 0xed, 0xf5, 0x1f, 0x32, 0x15, 0xfc, 0x54, 0x19, + 0xb7, 0x37, 0xa2, 0xef, 0xed, 0xfb, 0xfd, 0xf3, 0x65, 0x23, 0x6f, 0xc4, 0xdc, 0x24, 0xbc, 0x39, 0xbf, 0x49, 0x4f, 0xfe, 0x5c, 0xe5, 0x6a, 0xc4, 0x62, 0xaa, 0x59, 0x19, 0xe7, 0xa5, 0x90, 0x65, + 0xa8, 0x85, 0x14, 0x07, 0x20, 0xf0, 0xa8, 0x63, 0xba, 0xc4, 0xe5, 0x7c, 0xd7, 0x4d, 0x41, 0x90, 0x5d, 0x03, 0xb1, 0xcb, 0x31, 0x81, 0x0b, 0xe9, 0xc4, 0x69, 0x35, 0x8b, 0xab, 0x53, 0xa9, 0x55, + 0x82, 0x76, 0xe8, 0xa6, 0xc1, 0x66, 0xde, 0x23, 0xc5, 0x8e, 0x92, 0x4e, 0x6a, 0xcd, 0x92, 0x4f, 0xd6, 0x38, 0xbd, 0x18, 0xd8, 0xa5, 0xdd, 0xc7, 0xaf, 0x1d, 0xef, 0xa0, 0xc7, 0x99, 0x14, 0x7e, + 0x35, 0x79, 0xab, 0x6f, 0xfc, 0xd8, 0xc6, 0xa3, 0x9e, 0xc8, 0xa3, 0xff, 0x44, 0xf8, 0xd2, 0xfa, 0xf0, 0xfd, 0x6c, 0x72, 0x25, 0xf8, 0x3b, 0xa0, 0xb4, 0x8d, 0x2c, 0x10, 0x40, 0xf1, 0x50, 0x07, + 0x3f, 0x9e, 0x39, 0x5d, 0xd0, 0xe6, 0x53, 0xcd, 0xde, 0xe1, 0x84, 0x3b, 0x30, 0xeb, 0x9e, 0x6e, 0xd1, 0x81, 0x30, 0xa4, 0xc8, 0x54, 0x74, 0x0c, 0x32, 0x99, 0x33, 0xe0, 0x38, 0x95, 0x69, 0x51, + 0x67, 0x79, 0x3b, 0x4d, 0xc4, 0x8d, 0x3d, 0xf8, 0xdb, 0x66, 0x9e, 0xf4, 0xce, 0x7e, 0x09, 0x19, 0x53, 0xb1, 0x6c, 0xb6, 0x79, 0x45, 0x9c, 0xf4, 0x1c, 0x0b, 0x9e, 0x5b, 0x75, 0x3f, 0x27, 0x1c, + 0xbc, 0x85, 0xcf, 0xff, 0xd7, 0xc7, 0x6d, 0xbf, 0x9a, 0xd4, 0xf9, 0xa4, 0x28, 0xe3, 0x34, 0xae, 0xe3, 0xf6, 0xcd, 0xf7, 0x86, 0x7c, 0xa9, 0x29, 0xfb, 0x5c, 0xa4, 0xfe, 0x9d, 0x47, 0xaa, 0x3e, + 0x75, 0xf2, 0x64, 0xe2, 0xbd, 0x56, 0x6e, 0x7f, 0x1d, 0xa7, 0xef, 0x21, 0x73, 0x91, 0xfd, 0x61, 0x87, 0xa2, 0x5f, 0x6e, 0xbc, 0x12, 0x79, 0xf0, 0xc0, 0xcb, 0x70, 0x94, 0x99, 0x9d, 0x4c, 0xaa, + 0x24, 0xaf, 0x1f, 0x3c, 0x52, 0x4d, 0x5e, 0x50, 0xb1, 0x9d, 0xe4, 0xe3, 0x7b, 0xbf, 0xfa, 0x70, 0x32, 0x3f, 0xb4, 0x5f, 0x00, 0x99, 0x0c, 0x7e, 0x99, 0xff, 0x79, 0x2f, 0xa6, 0xeb, 0xab, 0x17, + 0x07, 0xfe, 0x46, 0xa3, 0x8a, 0xec, 0xf2, 0xad, 0xda, 0xc2, 0xe4, 0x3d, 0x7f, 0xea, 0xce, 0x20, 0xbc, 0x3c, 0xfb, 0x11, 0x3c, 0x06, 0xdf, 0xb4, 0x62, 0xbe, 0xde, 0xee, 0x7c, 0xfb, 0x58, 0xfa, + 0xc1, 0xfd, 0x3f, 0x7f, 0x73, 0x18, 0x65, 0x55, 0xf1, 0xe1, 0x72, 0xfa, 0x12, 0xe0, 0xf7, 0xbb, 0xdb, 0xe8, 0xfa, 0xc0, 0x5f, 0x76, 0x55, 0xc5, 0x61, 0xf6, 0x2e, 0xc1, 0x6e, 0x5e, 0x74, 0xfd, + 0x91, 0x9f, 0x3c, 0x4b, 0xf5, 0xa5, 0xef, 0xdd, 0x07, 0x6b, 0x4d, 0x7f, 0x7d, 0xba, 0xaa, 0xed, 0xb2, 0xbe, 0xff, 0x7c, 0x93, 0x39, 0xf9, 0xf9, 0x1b, 0x2b, 0x42, 0x7f, 0xaf, 0xac, 0xc1, 0xa7, + 0x41, 0x79, 0xec, 0xea, 0x85, 0x9f, 0xac, 0x6c, 0xf0, 0x46, 0x1c, 0x9c, 0xbc, 0x1f, 0xde, 0x09, 0x54, 0xfa, 0xe3, 0x91, 0x54, 0x38, 0xb6, 0x8a, 0x77, 0x66, 0xab, 0xb3, 0x75, 0x88, 0x06, 0x7d, + 0x0f, 0x11, 0x56, 0xb6, 0xee, 0xbd, 0x41, 0x85, 0x35, 0x1d, 0xd4, 0x56, 0x89, 0xa6, 0xf3, 0xbc, 0x39, 0x35, 0xd7, 0x6b, 0x92, 0xf0, 0x51, 0x22, 0xd7, 0xe9, 0x29, 0xc5, 0x06, 0xc7, 0xf5, 0x29, + 0xec, 0x01, 0xe3, 0x30, 0xcf, 0xdd, 0xbc, 0xeb, 0x11, 0xca, 0x15, 0x5a, 0x57, 0x8d, 0x1b, 0xe0, 0xb8, 0x6c, 0x09, 0x84, 0x3c, 0x68, 0x9a, 0xf1, 0x83, 0xb3, 0xf7, 0xcb, 0x27, 0x3e, 0x8a, 0x8d, + 0xfc, 0x59, 0x42, 0xfc, 0xf1, 0x36, 0xeb, 0xea, 0xfc, 0x3a, 0xa0, 0xb5, 0x1d, 0x7e, 0x9a, 0xb3, 0x9f, 0x9e, 0xbb, 0x1f, 0xc3, 0xf8, 0x8d, 0x39, 0x7f, 0x18, 0x96, 0x67, 0x63, 0x52, 0x6f, 0xdf, + 0x01, 0x4e, 0xbe, 0x5c, 0x98, 0xc0, 0x7f, 0x23, 0x52, 0x95, 0xcf, 0x91, 0x81, 0x84, 0x1c, 0x63, 0xd9, 0xae, 0x92, 0x9c, 0x07, 0xcc, 0x41, 0x49, 0x0b, 0xcb, 0x90, 0x7d, 0x92, 0x00, 0x4e, 0xb4, + 0x9a, 0x32, 0xba, 0x60, 0xb1, 0xbb, 0xf0, 0x4c, 0xb9, 0x0d, 0x20, 0xb0, 0xe5, 0x1e, 0xb1, 0x58, 0x1e, 0x44, 0x6b, 0xb1, 0x07, 0xc2, 0xbd, 0x63, 0x71, 0x9a, 0xb1, 0xa8, 0x10, 0x91, 0x34, 0xbd, + 0xb3, 0xe4, 0x48, 0x11, 0xb1, 0xa7, 0xeb, 0x38, 0xa5, 0x4c, 0xe8, 0x79, 0x8f, 0xfc, 0x77, 0xf9, 0x7c, 0x7f, 0xa1, 0x7b, 0xa6, 0x40, 0xca, 0x17, 0xda, 0xd7, 0xb5, 0xee, 0xf3, 0x95, 0xcb, 0x26, + 0xdb, 0x08, 0x23, 0x53, 0x9e, 0x49, 0x49, 0x12, 0x5a, 0xab, 0xda, 0xd6, 0x73, 0x2a, 0x8d, 0x4d, 0xc6, 0x5d, 0xcf, 0x22, 0x4d, 0xb7, 0xf9, 0xcd, 0x61, 0x35, 0x47, 0xb7, 0x66, 0x05, 0x1b, 0xb1, + 0xc7, 0x12, 0x74, 0x17, 0x73, 0x07, 0xf8, 0x68, 0x9e, 0x05, 0x5f, 0xd6, 0xdc, 0x7a, 0x4d, 0xfb, 0x03, 0x2d, 0xf1, 0x98, 0x25, 0x28, 0x3c, 0x14, 0x22, 0xcb, 0x70, 0x9b, 0xe1, 0x42, 0xc7, 0x4c, + 0x97, 0x1a, 0x19, 0x2b, 0xc5, 0xa3, 0x6a, 0x76, 0x9f, 0x3e, 0xf2, 0x81, 0xfe, 0xf0, 0x45, 0xb6, 0x7f, 0x97, 0xcb, 0x63, 0xfc, 0xf3, 0xd7, 0x35, 0xe6, 0xd3, 0x8c, 0x78, 0x30, 0x3a, 0xae, 0x5d, + 0xbc, 0x95, 0x58, 0xbf, 0x0a, 0x84, 0x9f, 0xca, 0x1b, 0x3d, 0xa3, 0x8a, 0x7c, 0x7f, 0xc1, 0x65, 0x9c, 0xbe, 0x5f, 0x1e, 0x53, 0xce, 0x07, 0x9e, 0x2c, 0x10, 0x9e, 0x36, 0xe2, 0x85, 0x7c, 0xda, + 0x80, 0x48, 0x79, 0x68, 0xfa, 0xa1, 0x5b, 0xd2, 0x7d, 0x24, 0xae, 0xa3, 0x7a, 0x84, 0x6f, 0xfd, 0xda, 0x45, 0xe5, 0xc1, 0x07, 0x12, 0x7f, 0x21, 0xf8, 0x33, 0xb6, 0xd0, 0xb5, 0x77, 0xcb, 0x7b, + 0x8b, 0xe9, 0x2b, 0x99, 0xdf, 0x79, 0x6e, 0xaa, 0xc0, 0xb1, 0xaf, 0x04, 0x18, 0x02, 0xc6, 0x83, 0x6b, 0x71, 0x04, 0x9d, 0xac, 0x7b, 0x0c, 0x6f, 0x96, 0x3c, 0xcf, 0xae, 0x35, 0x62, 0x6a, 0x0e, + 0x03, 0xb2, 0x6c, 0x91, 0x04, 0x3f, 0xb2, 0xb6, 0xd9, 0x72, 0x0d, 0x75, 0x06, 0x3a, 0x91, 0xc1, 0x3c, 0x8b, 0x2e, 0x8d, 0x35, 0xa9, 0x9a, 0x8b, 0xbd, 0x6a, 0x1a, 0x88, 0x49, 0x87, 0x04, 0x34, + 0x77, 0x77, 0x98, 0x89, 0x65, 0x8b, 0xc5, 0x66, 0xf9, 0x9c, 0xce, 0xfa, 0xdf, 0x8e, 0xed, 0xf8, 0x09, 0xe8, 0xe6, 0x9e, 0x3f, 0x09, 0xca, 0xd7, 0x58, 0x5a, 0xe2, 0x45, 0xe6, 0xc0, 0x37, 0x6c, + 0xf5, 0xdf, 0x6f, 0x5d, 0x64, 0x2f, 0xff, 0x95, 0x57, 0x35, 0xe9, 0x5b, 0x99, 0xfd, 0xb7, 0x4c, 0x04, 0xfc, 0x2f, 0xf8, 0x6b, 0xaa, 0xfb, 0x6b, 0xda, 0xd4, 0x9d, 0xd4, 0xab, 0xdb, 0x58, 0x97, + 0x6b, 0x22, 0xf7, 0xcd, 0xd2, 0x7d, 0x5b, 0x44, 0xe8, 0xe6, 0x85, 0x9f, 0xdc, 0x2d, 0x77, 0x0a, 0x88, 0x7e, 0xb2, 0xf8, 0x5e, 0x74, 0x20, 0xf4, 0xaf, 0x9b, 0xee, 0xd3, 0x77, 0xfa, 0xad, 0x7e, + 0x51, 0x2b, 0xee, 0xf4, 0x5b, 0xfd, 0xb2, 0xb3, 0xfb, 0x73, 0x6f, 0x9e, 0x9b, 0x07, 0x8b, 0xb7, 0x26, 0xd9, 0xc4, 0xd7, 0xc4, 0x34, 0xbf, 0x3a, 0x35, 0x7e, 0xd9, 0xbf, 0x4e, 0xd8, 0x6f, 0xdd, + 0x7f, 0xbe, 0x7a, 0x4d, 0x3e, 0xdd, 0x0c, 0xe2, 0xc4, 0x9f, 0xf8, 0x59, 0x5d, 0xf6, 0x13, 0xd7, 0x76, 0x23, 0xff, 0x15, 0x7c, 0xe8, 0xbe, 0x0a, 0x3c, 0xb2, 0x67, 0xf7, 0x97, 0x6c, 0xa0, 0xef, + 0x6d, 0x68, 0x5f, 0x1e, 0xb0, 0xdf, 0x74, 0xd8, 0x6b, 0xa2, 0xce, 0x67, 0x01, 0xf4, 0xe6, 0xbc, 0xb9, 0x0e, 0x17, 0x7e, 0x73, 0x2f, 0x2d, 0xf2, 0xb2, 0x9e, 0x04, 0xa5, 0x5f, 0x3d, 0xa8, 0xf9, + 0x1a, 0xa7, 0x4d, 0x99, 0x36, 0x65, 0x64, 0xbf, 0xdb, 0x50, 0xdf, 0x65, 0xe0, 0x4d, 0xc7, 0xb5, 0x9b, 0xbf, 0x3e, 0x54, 0x93, 0xde, 0x4e, 0xdf, 0x53, 0x24, 0xd0, 0x3b, 0xc9, 0x2e, 0x5f, 0x3b, + 0x4b, 0x4c, 0xba, 0xb8, 0x8e, 0xf2, 0xe6, 0xda, 0x77, 0xe2, 0xad, 0xd3, 0xc4, 0x37, 0x4c, 0x12, 0xbf, 0xcd, 0xee, 0xb3, 0xfc, 0xd7, 0x0e, 0xe7, 0xc8, 0x6d, 0xce, 0xe1, 0x1d, 0x77, 0xcd, 0xa7, + 0xdb, 0x99, 0x5d, 0x37, 0xa5, 0x9d, 0x4c, 0xdc, 0x3c, 0x7d, 0x01, 0xfc, 0x3e, 0x07, 0xe4, 0x17, 0x5b, 0xc3, 0xae, 0x5f, 0x53, 0xe7, 0xa0, 0xbf, 0xa8, 0xdb, 0x5f, 0x50, 0x94, 0x79, 0x58, 0xbe, + 0xe5, 0xe8, 0x7c, 0x63, 0xbc, 0xdb, 0x1e, 0xeb, 0x5f, 0x83, 0xa4, 0x3e, 0x77, 0xa8, 0xfb, 0x62, 0x38, 0xbd, 0x20, 0x54, 0x4c, 0xec, 0xac, 0x8a, 0xdf, 0xb9, 0x0a, 0xfa, 0x7e, 0xff, 0x82, 0xa9, + 0x9b, 0xa7, 0x1f, 0xbb, 0xca, 0xdf, 0x5e, 0x52, 0xbf, 0x2f, 0x68, 0xf8, 0xd7, 0xef, 0xaf, 0xfd, 0x73, 0x3d, 0xf9, 0xb8, 0x0f, 0xfd, 0xf5, 0x45, 0xf1, 0x6f, 0xc9, 0x0b, 0x34, 0x2f, 0x5c, 0xfe, + 0xc1, 0xdf, 0xc8, 0xc5, 0x26, 0x7a, 0x7d, 0x68, 0x8c, 0x5e, 0x3d, 0xa6, 0x5c, 0xd8, 0x73, 0xf1, 0x13, 0xff, 0xe9, 0x96, 0xf7, 0x08, 0xd3, 0xff, 0x19, 0x55, 0xc4, 0x1e, 0xa0, 0x79, 0x17, 0x8e, + 0xfb, 0xf3, 0xe1, 0x11, 0x3e, 0xdf, 0x13, 0xb8, 0xc6, 0xe2, 0x73, 0xe7, 0x3d, 0xe0, 0xe4, 0xde, 0xd5, 0x4b, 0xa2, 0xff, 0x48, 0x7e, 0xc4, 0x83, 0xad, 0x0b, 0x28, 0xd3, 0x38, 0xea, 0x4e, 0x5b, + 0x7c, 0x03, 0xda, 0xcb, 0x16, 0x09, 0xe0, 0x50, 0xe4, 0xc9, 0x44, 0x32, 0xea, 0x9d, 0xcc, 0xe7, 0xa7, 0xd9, 0xb4, 0x17, 0xf0, 0x5c, 0x65, 0x0d, 0x23, 0x77, 0x9b, 0x94, 0xae, 0x82, 0xd9, 0xe9, + 0x70, 0xdc, 0x67, 0xa7, 0xd8, 0x14, 0xa3, 0x54, 0xec, 0x54, 0x30, 0xe5, 0xf8, 0x75, 0x41, 0x18, 0x7e, 0x94, 0xd4, 0xe8, 0x29, 0xc1, 0x13, 0x2e, 0xfe, 0x77, 0x2c, 0x87, 0xcb, 0xb2, 0xea, 0xe6, + 0x59, 0x10, 0x87, 0x93, 0xa2, 0xf4, 0xeb, 0x3a, 0x7e, 0xe8, 0xb8, 0x25, 0x9f, 0xca, 0x26, 0xb8, 0xff, 0x8a, 0x0f, 0x5d, 0xee, 0xcb, 0x8d, 0x09, 0x39, 0x2e, 0xaf, 0x80, 0x09, 0xad, 0x66, 0xad, + 0xab, 0xbe, 0x30, 0xb4, 0xc9, 0x1a, 0x34, 0xf4, 0xc3, 0x19, 0x34, 0x1d, 0x82, 0x24, 0x0c, 0x19, 0xc1, 0x15, 0x1d, 0x0d, 0x17, 0x07, 0x1a, 0x8d, 0xe3, 0x79, 0xeb, 0x55, 0x05, 0x88, 0x38, 0x62, + 0x60, 0x2c, 0x77, 0xba, 0xb1, 0x25, 0xea, 0xc3, 0xb9, 0x3e, 0xa8, 0x90, 0x0f, 0xf0, 0xdb, 0x29, 0x44, 0xb9, 0xdb, 0x64, 0xdb, 0x6e, 0x8e, 0x72, 0x92, 0x0f, 0xe4, 0x8c, 0x82, 0xfd, 0xbf, 0xb3, + 0x55, 0x70, 0x17, 0xc8, 0x6b, 0x0e, 0x68, 0xed, 0x97, 0xd7, 0xef, 0xe9, 0x1f, 0x6e, 0x71, 0x3e, 0x13, 0xcd, 0xfa, 0xe0, 0x1d, 0x1f, 0x50, 0x7e, 0xbd, 0x73, 0xc9, 0x71, 0x1f, 0x81, 0xe5, 0xb2, + 0xd2, 0xb5, 0x7a, 0x71, 0x9e, 0xc3, 0x51, 0xc9, 0xe3, 0x89, 0xb8, 0x8b, 0xd5, 0x04, 0xde, 0x39, 0x0b, 0x3b, 0xde, 0x42, 0xb0, 0xaf, 0xe1, 0xc7, 0xa1, 0xef, 0x3c, 0x13, 0xd6, 0x81, 0x61, 0xed, + 0x42, 0xe2, 0x16, 0xc8, 0x3a, 0x2e, 0xd3, 0x63, 0x95, 0xd2, 0x97, 0xe4, 0xd2, 0x96, 0x34, 0x3d, 0xd2, 0x7c, 0x79, 0xb5, 0x4e, 0x66, 0xdc, 0x6e, 0xe9, 0xec, 0x97, 0x1b, 0x86, 0x9f, 0x9a, 0x2b, + 0x87, 0x79, 0x2e, 0xc6, 0xe4, 0xda, 0xb1, 0x11, 0x7c, 0x37, 0x22, 0x5e, 0xd7, 0xcb, 0x1b, 0xd7, 0xdc, 0x97, 0x26, 0x27, 0xd7, 0x4c, 0xc9, 0x9b, 0x25, 0xf5, 0xb3, 0x12, 0x7c, 0x5f, 0x91, 0x2c, + 0x9b, 0xc4, 0x9f, 0x78, 0xb9, 0xfb, 0xe1, 0xe7, 0xc2, 0x6e, 0x95, 0x8d, 0xf0, 0xc6, 0x83, 0xf8, 0x4d, 0x01, 0x2a, 0x92, 0xa6, 0xbc, 0x7f, 0xe7, 0xd5, 0xde, 0xea, 0x62, 0xaf, 0x8e, 0xde, 0x7f, + 0xdd, 0xed, 0x13, 0x6f, 0x69, 0xfa, 0x51, 0x5f, 0xf8, 0x65, 0x12, 0x67, 0xc7, 0xcf, 0x2a, 0xc5, 0x4f, 0xf3, 0xb4, 0x48, 0x9a, 0x30, 0xce, 0x7e, 0x9b, 0xa7, 0xe8, 0x53, 0x15, 0x83, 0xef, 0xbf, + 0xe2, 0x83, 0xb9, 0xbe, 0xdc, 0x98, 0xa0, 0xe3, 0xaa, 0x09, 0xeb, 0xac, 0x80, 0x97, 0x2b, 0x0d, 0x5f, 0x6e, 0xd4, 0xc0, 0x95, 0x72, 0x6c, 0x8a, 0x1d, 0x62, 0x5b, 0xea, 0x18, 0x02, 0x82, 0x1b, + 0x7a, 0x59, 0x23, 0xa0, 0xa7, 0x10, 0xbb, 0x6c, 0x2e, 0xe7, 0x8b, 0x99, 0x91, 0xc0, 0x20, 0x27, 0x9e, 0x3c, 0x7a, 0xc3, 0xa4, 0x9d, 0x6e, 0x9f, 0x4e, 0xf2, 0x14, 0xb3, 0xf7, 0x45, 0x59, 0x69, + 0x8b, 0x41, 0xb5, 0x51, 0x6a, 0xbd, 0x84, 0xb7, 0x7d, 0xa3, 0x30, 0xe7, 0xf3, 0xdf, 0x99, 0xa7, 0x9f, 0xc6, 0xec, 0xed, 0xa7, 0x27, 0x17, 0xff, 0xef, 0x24, 0xf2, 0x93, 0xc2, 0x2f, 0x3f, 0x5c, + 0xc4, 0x3f, 0x63, 0xff, 0x99, 0x63, 0x1e, 0xec, 0x23, 0xfc, 0x85, 0xa0, 0xcf, 0x58, 0xef, 0xb7, 0xe4, 0x3f, 0x10, 0x7f, 0xbf, 0x34, 0x79, 0xa5, 0xfd, 0x3b, 0xda, 0x80, 0x26, 0x03, 0xe7, 0xe9, + 0xca, 0xd3, 0x32, 0x36, 0x9f, 0x73, 0xfb, 0xbd, 0x83, 0x06, 0x6c, 0x1b, 0x2c, 0xa4, 0x2e, 0xeb, 0x37, 0x06, 0xe1, 0x35, 0x3c, 0x19, 0xec, 0x77, 0xda, 0x96, 0x85, 0x63, 0xdf, 0x66, 0x52, 0x86, + 0xcc, 0xd3, 0x03, 0xb1, 0xe8, 0xc0, 0x42, 0x64, 0x98, 0x66, 0xda, 0x2c, 0x91, 0x66, 0x35, 0x9b, 0xe9, 0x24, 0xbd, 0x65, 0x6d, 0x79, 0x35, 0xec, 0x9a, 0x7d, 0xa6, 0x55, 0xfc, 0x74, 0xd4, 0x9e, + 0xdf, 0xad, 0x8d, 0x77, 0x0f, 0x20, 0xec, 0xa9, 0xb0, 0xd0, 0xcf, 0x84, 0x3f, 0xa0, 0xb9, 0x76, 0x97, 0xc7, 0xc6, 0x85, 0x86, 0x22, 0x9b, 0x73, 0xe7, 0xcc, 0xc1, 0xc8, 0x82, 0x84, 0xc2, 0x2f, + 0xcc, 0x0d, 0xe4, 0x6e, 0x9c, 0x1c, 0x98, 0x6f, 0xf0, 0x7d, 0x2e, 0x10, 0x0b, 0x9b, 0x4f, 0xe4, 0x28, 0x3c, 0x83, 0xd1, 0xd2, 0x4a, 0x70, 0xc3, 0x86, 0x9c, 0xf9, 0x14, 0x53, 0x64, 0x49, 0xea, + 0xa2, 0xf5, 0xb2, 0x27, 0x13, 0x99, 0x75, 0x9a, 0x59, 0x6c, 0x7b, 0xea, 0x7a, 0xc6, 0x64, 0x3c, 0x32, 0x9b, 0x9b, 0xa7, 0x26, 0xae, 0x31, 0xe7, 0x39, 0x16, 0xf4, 0xab, 0xd2, 0x77, 0x9b, 0xb7, + 0x74, 0xf1, 0xdb, 0x2e, 0x2f, 0x97, 0xdb, 0x37, 0xe9, 0xe4, 0x3f, 0xed, 0x0e, 0xde, 0x5a, 0xcc, 0xf7, 0xf7, 0x59, 0xff, 0x8d, 0x45, 0xe6, 0x42, 0xf8, 0x03, 0xef, 0xcb, 0xe9, 0xd8, 0xf6, 0x02, + 0x1d, 0x35, 0xf5, 0x64, 0x33, 0xb7, 0x9b, 0xbe, 0x4d, 0x58, 0x77, 0x8a, 0xee, 0xb3, 0x05, 0x43, 0x26, 0x3a, 0x6a, 0xd5, 0x04, 0x8c, 0xb6, 0x9b, 0x59, 0x14, 0xd6, 0x53, 0x6e, 0xd7, 0x45, 0x7b, + 0x7a, 0x8b, 0xec, 0x8f, 0x4c, 0x9b, 0x79, 0xc1, 0x79, 0x0e, 0xd1, 0xe1, 0xf2, 0x24, 0x48, 0x92, 0x5d, 0x1d, 0xb6, 0xcb, 0xed, 0x70, 0xa0, 0x56, 0xa7, 0xb0, 0x3b, 0x76, 0xce, 0xcc, 0x64, 0x21, + 0xd0, 0x40, 0xad, 0xe7, 0xbc, 0x2e, 0x8f, 0xdc, 0x06, 0xf0, 0x4d, 0x59, 0x94, 0x4f, 0x74, 0x1f, 0x99, 0x36, 0xf7, 0x09, 0x3d, 0x76, 0x53, 0xa3, 0x4f, 0x7a, 0xa9, 0xef, 0xbc, 0xe7, 0x63, 0x14, + 0x6e, 0xda, 0x31, 0x7f, 0xcf, 0xbf, 0xfc, 0xe3, 0xd1, 0x80, 0xe0, 0x2b, 0x02, 0xd9, 0x90, 0xfa, 0xc6, 0x9e, 0xe2, 0x48, 0x67, 0x83, 0xc2, 0x5c, 0x62, 0x6b, 0x70, 0xbb, 0x42, 0x97, 0x3a, 0x0e, + 0xa9, 0x6c, 0x31, 0x43, 0xe5, 0xfd, 0x0c, 0xe6, 0x0f, 0x2e, 0xcc, 0xec, 0xf7, 0x45, 0xb0, 0x46, 0x66, 0x94, 0x82, 0x01, 0xb4, 0x4e, 0x1c, 0x22, 0x1f, 0x9a, 0xe3, 0x0b, 0x85, 0x3b, 0x19, 0x62, + 0x34, 0x5d, 0x35, 0x0d, 0xb0, 0x31, 0x89, 0x73, 0x06, 0xe0, 0x5e, 0x5c, 0xe8, 0x3f, 0x18, 0x41, 0xef, 0x57, 0x7f, 0x54, 0x3a, 0x47, 0x34, 0xb6, 0xfe, 0xb7, 0x58, 0x78, 0x04, 0x86, 0x23, 0x19, + 0x1a, 0x2a, 0xd5, 0x54, 0x61, 0x86, 0x7d, 0xc8, 0x0e, 0xcb, 0x8a, 0xc5, 0xd3, 0x85, 0xb7, 0x0a, 0xfd, 0x76, 0x08, 0xfd, 0x61, 0x89, 0xa1, 0xd3, 0x99, 0x5f, 0x62, 0x6b, 0xb0, 0xed, 0xc5, 0x3d, + 0x74, 0xe4, 0x07, 0x0d, 0x3c, 0xc4, 0xcc, 0x14, 0x3d, 0x28, 0x91, 0x47, 0x99, 0x7a, 0x22, 0x2e, 0xcc, 0xb5, 0xdc, 0x23, 0x43, 0x51, 0x6e, 0xd2, 0x5c, 0x23, 0x4f, 0x76, 0x35, 0x5b, 0xd4, 0x26, + 0x20, 0xdb, 0xc2, 0x98, 0xc4, 0xbd, 0x77, 0x67, 0xd6, 0x7d, 0x5f, 0xea, 0x33, 0xe5, 0xb9, 0xae, 0x24, 0x2f, 0x78, 0xbc, 0x1c, 0x4c, 0x88, 0x71, 0x85, 0xb9, 0x5a, 0x74, 0x35, 0xdb, 0xcc, 0x38, + 0x7c, 0xda, 0xa4, 0xc7, 0x79, 0x91, 0x1e, 0xe7, 0x8b, 0xd3, 0x60, 0x08, 0x95, 0xa4, 0x41, 0xf5, 0x06, 0xb6, 0x4a, 0xa0, 0xf1, 0x4f, 0x6b, 0x2b, 0x28, 0x0c, 0x58, 0x72, 0x48, 0x1f, 0x98, 0x71, + 0xe1, 0x76, 0x67, 0x03, 0xd2, 0x79, 0x96, 0x2f, 0x78, 0xb4, 0xce, 0xa2, 0x38, 0x15, 0x85, 0xa5, 0xcd, 0xa4, 0xd3, 0x14, 0x6c, 0x6d, 0xa5, 0x58, 0x81, 0xc7, 0x52, 0x19, 0x90, 0xe7, 0xe6, 0xf4, + 0x5b, 0x47, 0xe0, 0x17, 0xd5, 0xf0, 0x8b, 0x07, 0xe7, 0x73, 0xb3, 0xdc, 0x3b, 0x85, 0xa9, 0x1e, 0x4b, 0x03, 0xf4, 0x3f, 0xd2, 0xe0, 0xff, 0x3f, 0x69, 0x50, 0x94, 0x71, 0x6a, 0x3f, 0xb4, 0x94, + 0x9e, 0x89, 0x85, 0x7c, 0xa5, 0xf9, 0xca, 0xe5, 0x71, 0x6a, 0x5f, 0x42, 0x42, 0x47, 0xb0, 0xb9, 0xbf, 0x68, 0xe6, 0xf3, 0x8e, 0xd0, 0x0b, 0xcf, 0x06, 0xc2, 0x69, 0x01, 0xc8, 0x7c, 0x9b, 0xed, + 0x20, 0xa5, 0xd7, 0xf6, 0xa0, 0x6a, 0xf8, 0x2b, 0x86, 0x15, 0xc1, 0x70, 0x56, 0x8b, 0xb4, 0x22, 0x41, 0xee, 0xba, 0xd1, 0x10, 0xde, 0xe5, 0x84, 0x4c, 0xdb, 0xb6, 0xd1, 0xc1, 0xc0, 0xed, 0x85, + 0x7f, 0x2a, 0x67, 0x0c, 0x58, 0x39, 0x9b, 0xbc, 0x80, 0x84, 0x6a, 0x48, 0xa1, 0x43, 0x65, 0xef, 0xf4, 0x91, 0xfa, 0xd3, 0x9b, 0x6b, 0xfa, 0xbe, 0x6e, 0xf9, 0x9c, 0x46, 0x7f, 0xa1, 0x79, 0x41, + 0xe1, 0x72, 0x34, 0x81, 0xc7, 0xe9, 0xec, 0xee, 0x8c, 0x8d, 0xab, 0x62, 0x57, 0x63, 0x2d, 0xcf, 0xd7, 0x9d, 0x68, 0x22, 0x66, 0x49, 0xcb, 0xd3, 0xd8, 0x99, 0x1f, 0xe9, 0x35, 0xa9, 0x38, 0x3c, + 0x66, 0x2e, 0x98, 0xcc, 0x62, 0x5c, 0x0a, 0x12, 0xf3, 0xa4, 0x6d, 0x83, 0xe3, 0x51, 0x76, 0x57, 0x65, 0x0e, 0xda, 0x56, 0x4c, 0xcb, 0x7a, 0x22, 0xa3, 0xa7, 0xb0, 0x34, 0x55, 0x9c, 0xc5, 0x5b, + 0x72, 0xe1, 0x62, 0x0b, 0x6c, 0x26, 0x57, 0x2e, 0xf5, 0xac, 0xc2, 0x74, 0xa3, 0x11, 0x61, 0x7f, 0x7f, 0xdd, 0x1e, 0x51, 0x13, 0x07, 0xfb, 0xeb, 0xd9, 0x4d, 0xe5, 0x0f, 0xf2, 0x17, 0x94, 0xdf, + 0xeb, 0xdf, 0x60, 0xdf, 0x12, 0x0f, 0xff, 0x78, 0x04, 0x36, 0x73, 0x76, 0x36, 0x8b, 0xc5, 0x26, 0x85, 0x94, 0x5e, 0x31, 0x5b, 0xdd, 0xe3, 0x8b, 0x65, 0xd7, 0x52, 0xcb, 0xdd, 0xe0, 0x8b, 0xd4, + 0x7e, 0x96, 0x38, 0xd2, 0xb9, 0xcb, 0x69, 0xad, 0x99, 0x7b, 0x12, 0x47, 0x58, 0x1c, 0xde, 0xf1, 0x6b, 0x80, 0x97, 0x31, 0x8d, 0x8c, 0xf2, 0xad, 0x08, 0x0c, 0x7c, 0x9b, 0x0a, 0xc3, 0x50, 0x71, + 0xa7, 0x28, 0xec, 0xa1, 0x45, 0x29, 0x63, 0x7b, 0x18, 0xb5, 0x83, 0xf8, 0xdf, 0x99, 0x8e, 0x1f, 0x1a, 0xea, 0xfd, 0x09, 0xf9, 0x9c, 0x13, 0xe8, 0x95, 0xea, 0x05, 0xa6, 0xd7, 0xe3, 0xb1, 0x5d, + 0x09, 0x85, 0x34, 0x10, 0xd6, 0xa8, 0x83, 0x2f, 0x00, 0x65, 0xdf, 0x6e, 0xc9, 0x0d, 0xdc, 0x96, 0xa8, 0x76, 0x82, 0x8f, 0x6b, 0x30, 0x9f, 0xcd, 0xc3, 0x0c, 0xd9, 0x98, 0x7b, 0xae, 0x3e, 0x6d, + 0x49, 0x70, 0x8d, 0x16, 0x82, 0x5d, 0xe8, 0xf4, 0x74, 0x41, 0xba, 0x73, 0xc3, 0xce, 0xe7, 0xa8, 0xaa, 0xa3, 0x08, 0x3a, 0x63, 0xa7, 0xfb, 0xbe, 0x50, 0xc0, 0x20, 0x88, 0x73, 0x3e, 0x3d, 0xd6, + 0x31, 0x0e, 0x6a, 0xf6, 0x73, 0x6b, 0xcf, 0x37, 0x76, 0x44, 0xfe, 0xc3, 0x8e, 0xff, 0x1f, 0xb3, 0xe3, 0x1d, 0xc0, 0xfe, 0x09, 0x7e, 0xbc, 0x0f, 0xd4, 0x48, 0x8e, 0x44, 0xa9, 0x2c, 0x13, 0x82, + 0x60, 0x37, 0x90, 0xe7, 0x0d, 0xcc, 0xe8, 0x20, 0xe2, 0x12, 0x54, 0x46, 0x65, 0x0c, 0xc5, 0xb3, 0x43, 0x0e, 0x65, 0xb1, 0xa9, 0x9f, 0xce, 0xf8, 0xb9, 0x3f, 0xe9, 0x59, 0x9f, 0xd3, 0x99, 0xdc, + 0xf7, 0xbb, 0x42, 0xd2, 0x3c, 0x8b, 0xf3, 0xe3, 0x99, 0x1b, 0x91, 0x0c, 0xd3, 0x60, 0x30, 0x56, 0x4f, 0xbb, 0x82, 0xb2, 0xd2, 0xd0, 0x08, 0x8c, 0x28, 0xa3, 0x38, 0xa6, 0x18, 0xa7, 0x10, 0xfe, + 0x6c, 0xf1, 0x3d, 0x53, 0xaa, 0xe0, 0x95, 0xe6, 0x05, 0x88, 0x37, 0x3b, 0x6f, 0x54, 0x89, 0x82, 0xa3, 0x51, 0xb9, 0xa7, 0xfd, 0x71, 0x2a, 0xcd, 0x0a, 0x9c, 0x54, 0x2d, 0xc8, 0x3b, 0x86, 0x9c, + 0x60, 0xc4, 0x38, 0x48, 0xc6, 0x07, 0x14, 0x82, 0x04, 0x66, 0xa7, 0xad, 0x4e, 0x28, 0xb2, 0x05, 0x3d, 0xd3, 0xdf, 0x69, 0x6a, 0x27, 0x4c, 0xe1, 0x5d, 0xaf, 0x9d, 0xed, 0x64, 0x03, 0xfb, 0x4a, + 0x4a, 0x63, 0x16, 0xa5, 0xeb, 0xe0, 0x7a, 0x4f, 0xb1, 0xc4, 0x7c, 0xa7, 0xa6, 0x06, 0xa5, 0xd2, 0xe6, 0x19, 0x1f, 0x53, 0xcb, 0xe4, 0x52, 0x2d, 0x70, 0x52, 0xdb, 0xe5, 0x25, 0x5a, 0x30, 0x8a, + 0x1f, 0xe5, 0x65, 0x3d, 0xd7, 0x55, 0xf6, 0x1b, 0xf5, 0x17, 0x64, 0xbe, 0x5e, 0x1b, 0xdb, 0x63, 0x36, 0x06, 0x91, 0xbd, 0x93, 0xa9, 0x03, 0xd8, 0x9c, 0x95, 0x99, 0x8e, 0x03, 0x1b, 0xcf, 0x58, + 0x85, 0xc2, 0x8e, 0xd5, 0xc4, 0x29, 0x42, 0x00, 0xe2, 0xc9, 0x74, 0x8e, 0xf2, 0xc0, 0xa2, 0x08, 0xcc, 0x36, 0x33, 0x79, 0xa5, 0x9f, 0xa4, 0x66, 0x25, 0x2c, 0x69, 0x68, 0x29, 0x22, 0xc0, 0x0e, + 0x39, 0xd7, 0x26, 0xef, 0x09, 0x52, 0x6a, 0x4d, 0x3d, 0x05, 0x0f, 0xb8, 0x73, 0xe5, 0x4d, 0xd5, 0xfd, 0x1a, 0xd8, 0x7d, 0xab, 0x07, 0xf4, 0x63, 0x91, 0x46, 0xf4, 0xb9, 0x19, 0xf2, 0x56, 0x9f, + 0xf1, 0xb5, 0x34, 0x23, 0x3a, 0x6e, 0x66, 0xa4, 0x72, 0x07, 0x20, 0xc1, 0x51, 0x76, 0xe8, 0xf5, 0x20, 0x13, 0x06, 0x24, 0x9a, 0xd0, 0xf2, 0xe4, 0x65, 0xfb, 0x8d, 0xe4, 0x6b, 0xf5, 0x76, 0x5a, + 0x42, 0xc9, 0x86, 0x1a, 0x08, 0x9a, 0xb6, 0xbb, 0xd9, 0x3e, 0x3c, 0xf9, 0x36, 0xe1, 0xb0, 0x71, 0x8c, 0x40, 0xb4, 0x59, 0x2e, 0x99, 0x72, 0xee, 0x81, 0xfc, 0x19, 0x12, 0x11, 0xc9, 0x1d, 0x70, + 0x15, 0x86, 0xe1, 0x99, 0x3d, 0x3f, 0xea, 0xae, 0x03, 0x7d, 0xfb, 0xde, 0xc0, 0xb6, 0xab, 0xc9, 0xa1, 0x9a, 0x94, 0x4d, 0x56, 0xc7, 0x0f, 0x8b, 0x8d, 0x21, 0x4f, 0x95, 0xeb, 0xfd, 0x42, 0x1b, + 0x9c, 0x7c, 0xbd, 0x72, 0xe9, 0x9c, 0x31, 0x22, 0x60, 0x3a, 0x90, 0x33, 0xc6, 0xef, 0x9a, 0x1a, 0xb1, 0x01, 0x87, 0xda, 0xc3, 0xa8, 0x6e, 0x46, 0x87, 0x73, 0x79, 0x12, 0x55, 0x9b, 0xc4, 0x13, + 0x14, 0x12, 0x5d, 0x52, 0xae, 0xe6, 0xab, 0x84, 0xda, 0x02, 0x44, 0x25, 0x30, 0x8d, 0x6d, 0xd5, 0xe7, 0xbd, 0xd8, 0x6d, 0x91, 0xc5, 0x6e, 0x49, 0x08, 0x88, 0x44, 0x17, 0x5e, 0x8a, 0x9f, 0x97, + 0xb0, 0x88, 0xb0, 0xdb, 0xca, 0x1b, 0xcc, 0x35, 0x89, 0x78, 0xeb, 0xf9, 0x88, 0x2a, 0x95, 0xb7, 0x65, 0x3b, 0xdf, 0xea, 0xf5, 0xff, 0xd7, 0xa7, 0x07, 0x3e, 0x15, 0xce, 0xfa, 0xf3, 0x7f, 0xc3, + 0xdf, 0xe2, 0x6a, 0xdf, 0xea, 0x70, 0xfc, 0xf9, 0x3d, 0xc1, 0x3e, 0xb0, 0xab, 0xfa, 0x6d, 0xef, 0x7e, 0xfa, 0x17, 0x4c, 0xde, 0xbd, 0x3b, 0x29, 0xed, 0x6e, 0xe2, 0xe4, 0xde, 0xdb, 0x63, 0xc8, + 0xe3, 0xd8, 0x81, 0x6f, 0xee, 0xf9, 0x2c, 0xf7, 0xfc, 0x49, 0x5e, 0x7d, 0x0a, 0x05, 0x79, 0xb1, 0x6c, 0x6e, 0x22, 0x5d, 0xf3, 0xd6, 0x2f, 0x93, 0xdc, 0xf6, 0x26, 0x45, 0x99, 0xd7, 0xbe, 0xfb, + 0x29, 0x3e, 0x18, 0xb9, 0x0d, 0xe1, 0x2d, 0xca, 0x3c, 0x9d, 0xb8, 0x49, 0xfc, 0x16, 0x5f, 0x01, 0x4f, 0xbf, 0xc6, 0x9d, 0x9c, 0xae, 0xaf, 0xc0, 0xff, 0x82, 0xe1, 0xbf, 0x59, 0x39, 0xf3, 0x7b, + 0x87, 0xd4, 0x3f, 0xee, 0x08, 0xe3, 0xe7, 0x36, 0x1e, 0xef, 0x35, 0x4a, 0xfd, 0x5e, 0x35, 0xf0, 0x8f, 0x47, 0x7c, 0x47, 0x02, 0xd4, 0xee, 0xe4, 0x3b, 0xce, 0x7c, 0x28, 0xf6, 0x94, 0xa4, 0x00, + 0x3b, 0x1b, 0x97, 0x10, 0xca, 0xae, 0x96, 0x79, 0xe8, 0x2b, 0xe2, 0xe0, 0x2e, 0x6a, 0x7a, 0xb9, 0xf1, 0x0a, 0x91, 0xe7, 0x7b, 0x3a, 0x84, 0xa1, 0x00, 0xc2, 0x6c, 0x75, 0x6e, 0x30, 0x8e, 0xcb, + 0x9d, 0x16, 0x01, 0xb8, 0xdd, 0x77, 0x30, 0x77, 0xa0, 0x2d, 0xe0, 0x84, 0x80, 0x0e, 0xc7, 0x84, 0x28, 0xdb, 0x36, 0xa5, 0x80, 0xca, 0x37, 0x05, 0x15, 0xef, 0x8e, 0xe6, 0x23, 0x20, 0xbe, 0x8e, + 0xf1, 0x78, 0x20, 0x5e, 0x69, 0x5f, 0x8a, 0x4c, 0x5e, 0x8e, 0xee, 0x6c, 0x68, 0x3d, 0x84, 0xa1, 0x2b, 0xce, 0x56, 0x45, 0x6d, 0xf2, 0xb3, 0x65, 0xaf, 0x38, 0x75, 0xb5, 0x58, 0x5a, 0x5a, 0xcf, + 0x72, 0xb6, 0x59, 0x24, 0xd0, 0x5c, 0x50, 0x69, 0x60, 0xce, 0x50, 0xf6, 0x2a, 0xee, 0xfd, 0x54, 0x88, 0xc4, 0xee, 0x78, 0x96, 0x43, 0x1c, 0x8d, 0xa6, 0x1a, 0x2c, 0xac, 0x42, 0x7d, 0xc1, 0x17, + 0xda, 0x69, 0xcb, 0x6e, 0x14, 0x37, 0x4d, 0xcd, 0x75, 0x13, 0x96, 0xca, 0x61, 0x95, 0x30, 0xf5, 0xae, 0x55, 0xfe, 0x46, 0x35, 0xd1, 0x4f, 0x2c, 0xf2, 0xa5, 0xea, 0xcd, 0x1f, 0x7f, 0xdc, 0xec, + 0xf4, 0xff, 0x1f, 0x9f, 0xff, 0xff, 0x90, 0x70, 0xd5, 0x65, 0x6b, 0xb4, 0xbe, 0xac, 0x3b, 0x7d, 0xe1, 0x4f, 0x7e, 0xeb, 0xc8, 0xfb, 0xf7, 0x45, 0xfc, 0x83, 0x77, 0x5c, 0x24, 0xde, 0xdd, 0x3b, + 0x63, 0x53, 0x92, 0xf7, 0x8e, 0x3b, 0xdd, 0xbb, 0x7d, 0xa5, 0xef, 0xdd, 0x6a, 0x8b, 0xd9, 0xbc, 0xae, 0x13, 0x9b, 0x13, 0x2a, 0x75, 0x2d, 0x7f, 0xa2, 0x88, 0x19, 0xb0, 0xcb, 0x9c, 0xa3, 0xbf, + 0xf4, 0x83, 0xc2, 0x37, 0xd7, 0x7b, 0xa0, 0xec, 0x87, 0xf9, 0x2a, 0xd1, 0x71, 0x49, 0xad, 0xe7, 0xab, 0xa8, 0xc2, 0xa5, 0x04, 0x5a, 0x1f, 0xf5, 0x45, 0xe1, 0x0a, 0x40, 0xb7, 0x86, 0x56, 0x5d, + 0x20, 0x02, 0xf3, 0x99, 0x8e, 0x2d, 0xbf, 0xb5, 0x91, 0x7a, 0x2d, 0xd7, 0x7a, 0x89, 0xa8, 0x6b, 0xca, 0x78, 0xf2, 0x5e, 0xa2, 0xee, 0x07, 0x90, 0xfe, 0xbe, 0x36, 0xf0, 0xf0, 0x2d, 0x6f, 0x30, + 0xdd, 0xbb, 0x37, 0xb6, 0x0b, 0xed, 0x4e, 0x08, 0x85, 0x5d, 0x88, 0xf9, 0xfa, 0xb9, 0x55, 0xac, 0x45, 0xb7, 0x23, 0xe7, 0x6d, 0xe0, 0xd8, 0x3c, 0x41, 0xef, 0xd5, 0x08, 0x71, 0xd7, 0x00, 0x7a, + 0xc0, 0x02, 0x71, 0x31, 0xe8, 0xe2, 0xec, 0xbc, 0x63, 0x56, 0xa8, 0x67, 0xa0, 0x36, 0xb1, 0x1b, 0xc8, 0x1e, 0x09, 0xc0, 0x46, 0x86, 0x7c, 0x94, 0xc1, 0x77, 0x69, 0xee, 0xb1, 0x68, 0xae, 0x62, + 0xd3, 0x83, 0x26, 0x53, 0xbc, 0xa1, 0x2d, 0x97, 0xdf, 0xda, 0x49, 0x7c, 0xaf, 0x6b, 0x7b, 0x5f, 0x4d, 0x78, 0xa6, 0xd6, 0xc1, 0x17, 0xda, 0x1f, 0xa0, 0xbc, 0xd7, 0xef, 0x40, 0xc7, 0xd5, 0x39, + 0x08, 0xd0, 0x93, 0x4c, 0xe5, 0x72, 0x4f, 0x1d, 0x10, 0x3a, 0x62, 0x7c, 0x90, 0xa7, 0x8c, 0x19, 0x05, 0x77, 0xeb, 0x54, 0x60, 0x66, 0x33, 0x1d, 0x0c, 0x59, 0x29, 0x13, 0x36, 0xb4, 0xb9, 0xc0, + 0xa2, 0xaa, 0x93, 0x08, 0x66, 0x2d, 0x1c, 0x20, 0x8a, 0x77, 0x31, 0xde, 0xdc, 0x0c, 0x94, 0xbb, 0x58, 0x02, 0xc0, 0x39, 0x29, 0xd8, 0xd9, 0x32, 0x64, 0xed, 0xb8, 0x36, 0x2a, 0x08, 0xa5, 0x35, + 0x85, 0x9c, 0xde, 0x51, 0x1c, 0x5e, 0x7e, 0xdc, 0xe3, 0xdc, 0xe3, 0xe7, 0xca, 0x0f, 0xbd, 0x53, 0x7d, 0xff, 0xfc, 0x38, 0x08, 0xc6, 0x16, 0x1f, 0x3a, 0xaf, 0x9a, 0x5c, 0xc3, 0x80, 0x35, 0x45, + 0xed, 0x13, 0x8b, 0xac, 0x3b, 0xdf, 0xb3, 0x95, 0x00, 0xa7, 0xcf, 0x88, 0x16, 0xca, 0xc6, 0xb9, 0x0d, 0x2d, 0xc9, 0xcc, 0xb7, 0xc2, 0xc9, 0x6a, 0x82, 0x74, 0x15, 0x3b, 0x50, 0xbd, 0x46, 0x6a, + 0x3f, 0xdc, 0x32, 0x92, 0xe5, 0xc0, 0x85, 0xb1, 0x09, 0x97, 0x51, 0x72, 0x62, 0x13, 0x1a, 0xf2, 0x25, 0xc8, 0x45, 0x3b, 0xa6, 0x95, 0xdd, 0x74, 0x38, 0x4f, 0xc7, 0xd8, 0x12, 0x97, 0x5f, 0xfa, + 0x63, 0x1a, 0x32, 0xf2, 0x44, 0x30, 0xf2, 0x3b, 0xd5, 0x37, 0x2c, 0x5e, 0x13, 0x91, 0x91, 0xdf, 0xc2, 0x8e, 0x2f, 0x3b, 0x75, 0x6c, 0x3d, 0x77, 0x43, 0x0d, 0x27, 0xbb, 0x58, 0xd3, 0xe2, 0xce, + 0x42, 0xa2, 0x8d, 0xb7, 0x0a, 0x5c, 0x7e, 0x73, 0xf4, 0xa9, 0xbd, 0x14, 0x64, 0x5d, 0xca, 0x28, 0xbb, 0x7d, 0x94, 0xfa, 0x82, 0x48, 0x96, 0x73, 0x48, 0x5b, 0x74, 0xe9, 0x0c, 0x94, 0xeb, 0x1c, + 0x55, 0x09, 0x25, 0xb7, 0x84, 0x02, 0x73, 0xe3, 0xc4, 0x72, 0xce, 0x83, 0x84, 0xc5, 0xda, 0x46, 0x93, 0xab, 0x15, 0xc0, 0xf9, 0xec, 0x73, 0x96, 0xfe, 0x7f, 0xbf, 0x68, 0x22, 0x49, 0xec, 0x80, + 0x41, 0xf5, 0x57, 0x55, 0xdb, 0xf5, 0xbb, 0x18, 0xbf, 0x89, 0x0b, 0xfd, 0xfc, 0x54, 0xf7, 0x16, 0x73, 0xf0, 0x4d, 0x11, 0xf9, 0x1e, 0xe8, 0xf9, 0xb5, 0x6e, 0x91, 0x5f, 0x86, 0x3e, 0xf2, 0xe7, + 0x87, 0x2f, 0xfa, 0xf3, 0xbd, 0xd8, 0x2d, 0x3f, 0x75, 0xe7, 0x9f, 0x7e, 0xfd, 0x09, 0x5f, 0x9b, 0xf7, 0x3f, 0x4c, 0x85, 0xbb, 0x8c, 0xc6, 0xdd, 0xd0, 0xcc, 0x7f, 0x74, 0xf7, 0xe5, 0xf1, 0x6b, + 0xde, 0x38, 0xe2, 0x7e, 0x78, 0xe8, 0xc8, 0xbd, 0x98, 0x24, 0xf2, 0xc0, 0x6e, 0x0e, 0xac, 0x8f, 0x14, 0xc9, 0x5b, 0xb9, 0x36, 0xab, 0x13, 0xa3, 0xb4, 0xf9, 0x3a, 0x88, 0xb0, 0xbd, 0x19, 0x1f, + 0x96, 0x07, 0x3b, 0xd9, 0xbb, 0x47, 0xa2, 0xb2, 0xf5, 0xba, 0xb1, 0x33, 0x95, 0xed, 0xd7, 0xe2, 0x39, 0xe3, 0x23, 0x75, 0xcf, 0xb1, 0xab, 0x13, 0x7f, 0x66, 0x89, 0xb4, 0x52, 0x48, 0x16, 0x6a, + 0x66, 0xe9, 0x29, 0x39, 0x76, 0x87, 0x99, 0x41, 0x9e, 0xdb, 0x8e, 0x1f, 0x3d, 0x5d, 0x5e, 0x7f, 0xfa, 0xcf, 0xb8, 0x61, 0x7f, 0x11, 0xff, 0x26, 0x6e, 0xf7, 0x01, 0x7b, 0x43, 0xea, 0x42, 0xff, + 0x77, 0xa4, 0x2a, 0xc6, 0xd8, 0x6a, 0x61, 0x46, 0x5b, 0x95, 0xbf, 0x6e, 0x60, 0x39, 0x3c, 0xe0, 0x89, 0xee, 0xc8, 0x10, 0x1f, 0x1c, 0xe6, 0x91, 0xb5, 0xdb, 0xd3, 0x69, 0x61, 0x61, 0xb4, 0xad, + 0x2e, 0x8e, 0xfd, 0x3a, 0xc2, 0x42, 0x7a, 0xcf, 0x84, 0x36, 0xd8, 0x6c, 0x57, 0x07, 0x79, 0xcb, 0x17, 0xec, 0xfc, 0x30, 0xa3, 0x6c, 0x6f, 0xb7, 0x2c, 0x3c, 0xc9, 0x9d, 0xad, 0x55, 0x56, 0x0b, + 0x4b, 0x8b, 0xa8, 0xb2, 0x5c, 0xfe, 0xdd, 0xfe, 0xf8, 0xef, 0x57, 0x33, 0xe0, 0x52, 0xcf, 0xe7, 0xc2, 0xd9, 0x7f, 0x7e, 0x44, 0x58, 0x7c, 0x62, 0xdc, 0x4f, 0xd5, 0xf4, 0xbf, 0xdf, 0xf9, 0xb9, + 0x9a, 0xfe, 0xa3, 0x4a, 0xed, 0xe8, 0xb7, 0x87, 0x9a, 0x32, 0x7e, 0x27, 0x71, 0xf3, 0x8e, 0x32, 0xf0, 0xdc, 0xf7, 0xd9, 0xfa, 0xb7, 0x7c, 0x78, 0xff, 0xa9, 0x9a, 0xff, 0xc7, 0xa7, 0x7f, 0xff, + 0xa9, 0x9a, 0xff, 0x9b, 0x0d, 0xf3, 0x3f, 0xaa, 0x6a, 0xfe, 0x65, 0xb4, 0x13, 0xbf, 0xf5, 0xb3, 0x2a, 0xaa, 0xfd, 0x38, 0xfb, 0xc1, 0x13, 0xf9, 0xf7, 0x73, 0xfc, 0xbf, 0x12, 0x7f, 0x93, 0x7f, + 0x9f, 0x2e, 0x5d, 0x0c, 0xe1, 0x5f, 0x72, 0xfe, 0xe1, 0xc9, 0xd6, 0x2c, 0x5c, 0x2b, 0x0f, 0xf1, 0xf9, 0x49, 0x14, 0x4f, 0x0b, 0x19, 0x88, 0x14, 0xd2, 0x6a, 0x4e, 0x1e, 0xe6, 0x2b, 0xee, 0x48, + 0x41, 0x7f, 0xd9, 0x2f, 0x7b, 0x67, 0xbb, 0xfb, 0xaa, 0xe2, 0x33, 0xe5, 0x31, 0xbe, 0x12, 0x7f, 0xfb, 0xc4, 0x4f, 0x97, 0xae, 0xd1, 0x5e, 0xbf, 0xcb, 0xf7, 0x10, 0x17, 0x1a, 0x61, 0x97, 0xce, + 0xf7, 0x2e, 0x14, 0x2c, 0x59, 0x72, 0xb7, 0xe3, 0xa1, 0x43, 0x5c, 0x4f, 0x43, 0x88, 0x5e, 0x30, 0xf9, 0x2a, 0x9a, 0x1d, 0x57, 0xa2, 0x03, 0x2b, 0xa9, 0x53, 0xa9, 0x9c, 0xbe, 0x69, 0x65, 0xc0, + 0x9a, 0x91, 0x2c, 0x3e, 0xd3, 0x2d, 0x60, 0x51, 0xcf, 0xc9, 0x4c, 0x1c, 0xd4, 0xed, 0x3e, 0x8b, 0x62, 0x7f, 0xdb, 0xf7, 0xa7, 0x53, 0x5c, 0x0c, 0x9b, 0x0d, 0x97, 0xf1, 0x87, 0xf0, 0x77, 0xf9, + 0xfe, 0x93, 0xdd, 0xf5, 0x35, 0x19, 0xf7, 0x3b, 0xb0, 0xa5, 0xef, 0x3d, 0xce, 0xc5, 0x47, 0x9f, 0x57, 0xbf, 0xaf, 0x74, 0xdf, 0xe0, 0xbc, 0x9e, 0x5d, 0xd4, 0xce, 0x11, 0x2b, 0xe5, 0x60, 0x6b, + 0xb6, 0x37, 0x8b, 0x4a, 0x60, 0xe3, 0x1f, 0xfb, 0xc1, 0x4e, 0x12, 0x5a, 0xdc, 0xd3, 0xda, 0x7e, 0x2d, 0x29, 0xa4, 0xb8, 0x39, 0xa3, 0xc3, 0xa9, 0xb0, 0x20, 0x51, 0x9f, 0x23, 0xf6, 0x22, 0x98, + 0x72, 0x76, 0x1d, 0x65, 0x0b, 0x28, 0x40, 0x11, 0x63, 0x2d, 0xb1, 0x9b, 0xc4, 0x24, 0x97, 0xcd, 0xc2, 0x44, 0xf9, 0x5c, 0x91, 0x90, 0x35, 0x0e, 0xe2, 0x81, 0x3a, 0x6c, 0xaa, 0xb5, 0xcd, 0x2f, + 0xbf, 0x55, 0x91, 0xba, 0xfc, 0xb0, 0xca, 0x0e, 0xc6, 0x29, 0x5e, 0x4f, 0x5a, 0xaa, 0xb7, 0xf4, 0xdf, 0xe0, 0xb8, 0xbd, 0x7a, 0x51, 0xb5, 0xc6, 0x58, 0xa7, 0x80, 0xb0, 0x72, 0x11, 0x2f, 0x5d, + 0xae, 0x93, 0x6d, 0x91, 0xb0, 0x20, 0x3f, 0x15, 0xa8, 0x84, 0x5a, 0xbb, 0x34, 0x4f, 0x07, 0xdb, 0x7a, 0x8b, 0x33, 0x26, 0x39, 0x6d, 0x8c, 0xf5, 0x5e, 0xc6, 0xb9, 0xd6, 0x1d, 0xa8, 0xb5, 0x1b, + 0xa2, 0xa8, 0x89, 0x0c, 0xf0, 0xd2, 0x70, 0x12, 0x0d, 0x3f, 0x7b, 0x26, 0x36, 0xdd, 0xee, 0x4d, 0x83, 0xe7, 0x5a, 0x00, 0xda, 0x15, 0x27, 0x72, 0x99, 0xe3, 0xc3, 0x71, 0xcc, 0x66, 0xf8, 0xa7, + 0x95, 0xfb, 0x91, 0x5f, 0xf7, 0x49, 0x2e, 0x69, 0xca, 0xf8, 0x0d, 0x93, 0x17, 0xd6, 0x1d, 0xd9, 0x03, 0xd9, 0x5d, 0x36, 0x95, 0xc0, 0x2c, 0x6b, 0x50, 0x01, 0xf3, 0x25, 0x3e, 0x80, 0x70, 0xd6, + 0x07, 0x3e, 0x32, 0x6f, 0x17, 0x82, 0xa1, 0xe5, 0x91, 0xa1, 0x04, 0xed, 0x51, 0x8a, 0xda, 0x33, 0x94, 0xcd, 0xb8, 0x1d, 0x70, 0x0e, 0xb0, 0x4d, 0x3e, 0xdb, 0x1f, 0x68, 0xde, 0xdd, 0x15, 0x14, + 0xda, 0x48, 0x3a, 0xe3, 0x46, 0x83, 0xe9, 0x56, 0xed, 0x36, 0x29, 0xed, 0x82, 0xf6, 0xf6, 0x70, 0xb3, 0x03, 0xcc, 0xc5, 0x5d, 0x33, 0xfd, 0x31, 0x4f, 0x4c, 0xff, 0x42, 0x9e, 0xf5, 0xf1, 0x7c, + 0x30, 0xc2, 0xcb, 0xe0, 0x5f, 0x09, 0xfd, 0xfe, 0xd1, 0xc3, 0x6e, 0x17, 0x63, 0xc2, 0x82, 0x76, 0x60, 0xd3, 0xc2, 0x83, 0xbe, 0xcc, 0xe6, 0x19, 0x0d, 0xcf, 0x68, 0x98, 0xb3, 0xf8, 0xe3, 0x42, + 0xc4, 0xcd, 0x86, 0x5b, 0x87, 0x0c, 0x2a, 0x17, 0x2a, 0x9a, 0x4c, 0x93, 0xb5, 0xd2, 0xc3, 0xd3, 0x1d, 0xec, 0xba, 0x30, 0xee, 0x4c, 0x85, 0xc5, 0x96, 0x07, 0x07, 0x99, 0x22, 0x77, 0x33, 0xd5, + 0x53, 0x01, 0x6d, 0x0a, 0xaf, 0x8e, 0xbc, 0x89, 0xfa, 0x27, 0x38, 0x1f, 0xe1, 0xbe, 0x7e, 0x57, 0x1f, 0x5f, 0x14, 0xa1, 0xd7, 0xa4, 0xa4, 0xf2, 0x55, 0xab, 0xc0, 0x6e, 0x75, 0xb8, 0xf7, 0x47, + 0x2f, 0xb5, 0x4c, 0x5e, 0x9f, 0x41, 0x1e, 0x3c, 0x73, 0x4f, 0x93, 0xbe, 0x21, 0xff, 0x2d, 0x1a, 0xf3, 0xbd, 0xa2, 0x47, 0x92, 0x87, 0xe1, 0x67, 0xfd, 0xe3, 0x36, 0x15, 0xb3, 0x6d, 0xe3, 0x6b, + 0xf1, 0x07, 0xf2, 0x5b, 0x49, 0x0c, 0xfb, 0x91, 0x13, 0xef, 0x8e, 0x3a, 0x7c, 0xdf, 0xbe, 0x78, 0x31, 0x16, 0x89, 0x2f, 0x0f, 0xc6, 0x99, 0x37, 0x49, 0xfb, 0x49, 0x67, 0x5f, 0x1f, 0x20, 0xbe, + 0x26, 0x06, 0x26, 0x71, 0x18, 0xd5, 0x2f, 0x4f, 0xbc, 0x00, 0xec, 0x57, 0x6f, 0x36, 0xe7, 0xd7, 0x6c, 0xb6, 0x38, 0x7b, 0xfb, 0xd9, 0x5f, 0xcb, 0x40, 0xbc, 0xf6, 0xa2, 0x9a, 0x74, 0x76, 0x99, + 0x7d, 0x7c, 0xf7, 0xf7, 0x87, 0xce, 0xfd, 0xc4, 0xf6, 0xbc, 0xf2, 0x1d, 0x97, 0x1b, 0x37, 0xfd, 0x27, 0x05, 0xfb, 0x0b, 0xae, 0x95, 0xef, 0x36, 0xa5, 0x7f, 0xfd, 0xd6, 0xcf, 0x2e, 0x52, 0xec, + 0xeb, 0x63, 0x9f, 0x72, 0xe6, 0xbe, 0xdc, 0xab, 0xe3, 0xac, 0x7f, 0x6f, 0x22, 0x08, 0xff, 0xb2, 0xe6, 0xbc, 0x8c, 0xf4, 0x35, 0x7a, 0xfd, 0xe1, 0xdc, 0x7a, 0xa6, 0xfd, 0xc1, 0x2d, 0xe9, 0x4f, + 0x33, 0xec, 0x35, 0x52, 0x7e, 0x3a, 0xae, 0x1d, 0x02, 0x41, 0xd9, 0x47, 0x68, 0x75, 0xf6, 0x3c, 0x09, 0x6a, 0x6a, 0x7a, 0x4f, 0xcb, 0x98, 0xeb, 0x0a, 0x51, 0x5b, 0xe1, 0xed, 0x1e, 0x11, 0x17, + 0x3d, 0xcf, 0x8b, 0x62, 0x95, 0x5a, 0x47, 0x86, 0xde, 0x94, 0x27, 0x34, 0xda, 0xbb, 0xf0, 0x8c, 0x1f, 0xda, 0xcd, 0x96, 0x97, 0xdc, 0x56, 0xab, 0x0c, 0x91, 0xdb, 0x26, 0xd8, 0x12, 0xd8, 0x68, + 0x80, 0x22, 0x4d, 0x4d, 0x41, 0x5c, 0xf8, 0x91, 0x14, 0xa8, 0xf7, 0x7d, 0x80, 0x5f, 0xb6, 0x66, 0x1e, 0x48, 0x99, 0x27, 0x57, 0x9e, 0xcf, 0xc4, 0x3f, 0x61, 0xf1, 0x76, 0x69, 0x32, 0x1d, 0x57, + 0x25, 0x80, 0x32, 0x8c, 0x45, 0x42, 0xcc, 0x10, 0x40, 0x87, 0xf7, 0x31, 0xb5, 0x45, 0x72, 0x49, 0xe3, 0x77, 0xf5, 0xaa, 0x87, 0x2d, 0xe9, 0x38, 0x78, 0xac, 0x74, 0xf0, 0xd4, 0xd8, 0x50, 0xb3, + 0x21, 0x84, 0xe8, 0x00, 0x24, 0xbb, 0xd0, 0xab, 0x8a, 0xd0, 0x38, 0x0b, 0xfb, 0xcc, 0x64, 0xfc, 0x7e, 0x4b, 0xf2, 0x8b, 0xcc, 0x15, 0x30, 0x15, 0x74, 0xcc, 0x15, 0x7b, 0xc2, 0x13, 0x84, 0x86, + 0x4c, 0x29, 0x67, 0x46, 0x18, 0xad, 0xdf, 0xf8, 0xe4, 0x4e, 0x66, 0xc7, 0xcd, 0xb6, 0xd6, 0x0b, 0xbb, 0xc2, 0x63, 0xb8, 0x7a, 0xfa, 0x28, 0xaf, 0xe0, 0xe5, 0x95, 0xa7, 0xc7, 0xca, 0xe5, 0xb3, + 0xbe, 0x97, 0xd3, 0x2b, 0xfa, 0xa7, 0xc9, 0x95, 0xc8, 0xef, 0x98, 0x13, 0x9c, 0x3b, 0x54, 0x64, 0xb8, 0xdc, 0xb2, 0xa5, 0x31, 0x68, 0x00, 0x77, 0xac, 0x4c, 0xc6, 0x6d, 0x8a, 0x93, 0xd8, 0x9f, + 0x55, 0x7e, 0xbf, 0x2f, 0x79, 0x69, 0xad, 0x28, 0x67, 0x1d, 0x01, 0xd9, 0xd8, 0x35, 0x48, 0x82, 0xa4, 0x44, 0x85, 0x51, 0x14, 0x12, 0xe0, 0x5d, 0xa4, 0xd9, 0x0d, 0x7a, 0x53, 0x48, 0xd5, 0xd4, + 0x54, 0xa7, 0xab, 0x81, 0x49, 0x99, 0xf3, 0xe1, 0x30, 0x33, 0x98, 0x33, 0x0b, 0x8e, 0x50, 0x24, 0x4b, 0xbf, 0xa9, 0x3e, 0x27, 0x02, 0x3f, 0x28, 0xb0, 0x76, 0x27, 0xf7, 0xfa, 0x1e, 0x64, 0xf8, + 0x73, 0xee, 0xfd, 0x2f, 0xc4, 0x5f, 0xc0, 0xfb, 0x72, 0xe9, 0xd2, 0x72, 0x7c, 0x04, 0xeb, 0x12, 0x8b, 0xa2, 0x02, 0xf7, 0xbb, 0x3e, 0x75, 0xd6, 0x47, 0x44, 0x5e, 0x9b, 0xc2, 0x74, 0x33, 0x14, + 0xa2, 0x54, 0x9a, 0x07, 0x31, 0xf2, 0x96, 0xe7, 0x7d, 0xb3, 0x6c, 0x7b, 0x44, 0x66, 0xaa, 0x35, 0x87, 0x27, 0x87, 0x26, 0xf7, 0x84, 0xd6, 0x3b, 0xee, 0x2a, 0xd0, 0x2d, 0xfa, 0xd5, 0x0a, 0x9d, + 0x19, 0x4b, 0xa3, 0xe0, 0x21, 0x29, 0x86, 0xf9, 0x36, 0x84, 0xf3, 0xd6, 0x11, 0x87, 0xb5, 0x37, 0x67, 0x98, 0xe7, 0x9c, 0x97, 0x41, 0x62, 0xd7, 0x9f, 0x12, 0x79, 0x7f, 0xa8, 0x5e, 0x77, 0xd3, + 0xdb, 0xfd, 0x1e, 0xac, 0xc4, 0xb3, 0xb0, 0xbe, 0x92, 0xbd, 0x02, 0xfa, 0x7a, 0x72, 0x69, 0x7e, 0x31, 0x02, 0xca, 0x93, 0x94, 0x53, 0x73, 0xc0, 0x13, 0xf5, 0x74, 0x86, 0xac, 0x5d, 0x67, 0xca, + 0x38, 0x46, 0x9b, 0x09, 0xab, 0xb3, 0xb6, 0x3d, 0xcc, 0x52, 0x40, 0x51, 0x0a, 0x7f, 0x1a, 0xb2, 0xcd, 0xa2, 0x1c, 0x8e, 0x6b, 0x22, 0xe5, 0x8c, 0x04, 0xf4, 0x0e, 0xa6, 0xda, 0x20, 0x92, 0x27, + 0x23, 0x5b, 0x1b, 0x85, 0x90, 0xcd, 0x34, 0x3f, 0x1d, 0xd5, 0x90, 0x8a, 0x4b, 0xfc, 0x60, 0xaf, 0x77, 0x2b, 0x44, 0x57, 0x8d, 0xe2, 0xb9, 0x84, 0xb4, 0x3a, 0x7f, 0xad, 0xe1, 0xf3, 0xd1, 0x00, + 0x1f, 0xfb, 0x61, 0xb9, 0xb9, 0x59, 0x9b, 0xef, 0xe3, 0x89, 0x3f, 0x63, 0x36, 0x7e, 0xd0, 0xbd, 0x00, 0xfa, 0x7e, 0x36, 0xb9, 0xd0, 0xfb, 0x1d, 0x51, 0x48, 0x3a, 0xf0, 0x19, 0xec, 0xc0, 0xd9, + 0x6c, 0x8f, 0xfa, 0x86, 0x93, 0x52, 0x4c, 0xef, 0x73, 0x7c, 0x5c, 0xb9, 0x5b, 0x33, 0xe6, 0xd7, 0x41, 0xe4, 0xc7, 0x70, 0x27, 0xe9, 0x3a, 0x75, 0x0a, 0x02, 0xf9, 0x78, 0xa4, 0xc8, 0x8e, 0x83, + 0xd6, 0x39, 0x69, 0x94, 0x86, 0x19, 0xa8, 0x0b, 0x31, 0xcc, 0xd4, 0x8c, 0x8d, 0x48, 0x9c, 0x3d, 0xfb, 0x9e, 0xd7, 0xd0, 0x19, 0x13, 0x4c, 0xb3, 0x4e, 0xe7, 0xba, 0xdf, 0xe7, 0x78, 0x30, 0xda, + 0x53, 0x77, 0x6b, 0x71, 0xdf, 0x51, 0x90, 0x2e, 0x46, 0xcc, 0x65, 0x2c, 0x90, 0x77, 0x8d, 0xe3, 0x91, 0x68, 0x7d, 0x01, 0xa8, 0x79, 0x54, 0x65, 0xe5, 0xb9, 0xec, 0xcb, 0x57, 0x9a, 0x6f, 0xf0, + 0x37, 0xc5, 0xd8, 0xec, 0xca, 0x6d, 0x21, 0x75, 0xb4, 0x27, 0x83, 0x66, 0xb2, 0x97, 0x91, 0xf6, 0x40, 0xda, 0x68, 0x44, 0x2e, 0xe3, 0x82, 0x6d, 0x4c, 0x25, 0x46, 0x3b, 0xd7, 0x37, 0x64, 0x79, + 0x61, 0xee, 0xce, 0x9b, 0xe5, 0xc6, 0x75, 0x4f, 0x53, 0x88, 0xce, 0x3a, 0x82, 0x49, 0x2a, 0x6e, 0x3f, 0x13, 0x9d, 0x1a, 0xb6, 0x6a, 0x40, 0x5a, 0xd3, 0xf8, 0xfc, 0x44, 0x55, 0xcd, 0xb2, 0x58, + 0xee, 0x58, 0x48, 0xaa, 0xb2, 0xa5, 0x9a, 0x3c, 0x17, 0x4d, 0x9b, 0xe4, 0xae, 0x5d, 0x7f, 0xb4, 0x86, 0xfd, 0x5e, 0x71, 0xe2, 0x52, 0x7e, 0xd5, 0x3f, 0xc7, 0x55, 0x5d, 0x7d, 0x5a, 0x03, 0xef, + 0x63, 0xfc, 0x59, 0xc6, 0xdc, 0x37, 0xe6, 0x9f, 0xa9, 0x8b, 0xfc, 0x41, 0xf6, 0x05, 0xe9, 0xf7, 0x93, 0x4b, 0x19, 0xd6, 0x11, 0xd5, 0x91, 0xbd, 0x94, 0xaa, 0xb0, 0x6d, 0x47, 0xac, 0x5c, 0x68, + 0xd1, 0x8a, 0xa6, 0x53, 0x45, 0x1b, 0x7c, 0x70, 0xa3, 0x19, 0x4d, 0x29, 0xa1, 0x9c, 0x0c, 0x03, 0x67, 0xed, 0xd1, 0xb6, 0x4f, 0x14, 0x6a, 0x79, 0x9a, 0x07, 0x2a, 0xb9, 0x77, 0x63, 0x27, 0xd1, + 0xf7, 0x92, 0x10, 0xec, 0x70, 0x35, 0x6e, 0x56, 0x90, 0x0f, 0xa3, 0x3e, 0x6b, 0x5a, 0xb9, 0x65, 0x60, 0x9d, 0x57, 0xfa, 0x2d, 0xb1, 0x45, 0x37, 0xdd, 0xf3, 0x42, 0xb8, 0xbe, 0x7e, 0xef, 0xf7, + 0x5a, 0x0d, 0x65, 0x9c, 0x96, 0x76, 0xf0, 0x2e, 0x9d, 0x1f, 0x94, 0x0e, 0xfa, 0x20, 0x71, 0x1f, 0xe0, 0xa7, 0xdc, 0x04, 0x57, 0x9a, 0xaf, 0xe8, 0xd6, 0xbe, 0x77, 0x27, 0x7d, 0xfd, 0xbe, 0x41, + 0x48, 0xe7, 0xb4, 0x1c, 0x37, 0x5e, 0x0f, 0x94, 0x98, 0xda, 0x66, 0x6a, 0x87, 0x0a, 0xab, 0x1e, 0xcb, 0x2b, 0x30, 0x57, 0x56, 0x26, 0x3f, 0x94, 0xc3, 0xc1, 0x06, 0x6b, 0x86, 0x3d, 0x95, 0x56, + 0xbd, 0x89, 0xf4, 0x8e, 0x74, 0x6a, 0xbc, 0x27, 0x25, 0x66, 0x10, 0x77, 0xee, 0x61, 0x57, 0x02, 0x64, 0x12, 0x1b, 0x24, 0xe7, 0xe0, 0xbd, 0x14, 0x75, 0xe4, 0xce, 0x22, 0x8c, 0xb9, 0x85, 0x59, + 0xc3, 0x28, 0x77, 0x40, 0x5e, 0x4e, 0x7c, 0xdb, 0x7d, 0xd4, 0x1a, 0x08, 0xfa, 0x0b, 0x7d, 0x66, 0xe3, 0xfa, 0x95, 0xe8, 0x0b, 0x0e, 0xaf, 0x87, 0x93, 0x0b, 0xa5, 0xdf, 0x81, 0x38, 0x9c, 0xcc, + 0x60, 0x5d, 0x10, 0x69, 0x4e, 0xb5, 0xcb, 0x5e, 0x0e, 0xc8, 0xfe, 0xb8, 0x43, 0x5a, 0x82, 0x06, 0x90, 0xcd, 0x54, 0x3e, 0xf8, 0x33, 0x7f, 0x89, 0x01, 0xec, 0x40, 0xed, 0x4b, 0x3b, 0x96, 0xe0, + 0x38, 0xcc, 0x48, 0xb8, 0x3b, 0xc4, 0x3c, 0x31, 0x77, 0xa8, 0x56, 0x95, 0x76, 0xad, 0x1c, 0x6c, 0xea, 0x54, 0xb5, 0xa7, 0x3c, 0xa2, 0xe4, 0xb2, 0x56, 0x96, 0xfb, 0xb8, 0xf5, 0x74, 0x2b, 0x1d, + 0x21, 0x4b, 0xef, 0x95, 0xad, 0x42, 0x1f, 0x30, 0x4e, 0x5e, 0xa6, 0x13, 0xcf, 0xae, 0x7f, 0x4a, 0xab, 0x78, 0x42, 0x04, 0xbe, 0x51, 0xbd, 0x82, 0x76, 0x3d, 0xbe, 0xa4, 0x56, 0x8c, 0x10, 0x83, + 0x9c, 0xc6, 0x1d, 0x13, 0x75, 0x11, 0x63, 0x35, 0x24, 0x8b, 0x56, 0x13, 0xef, 0x73, 0x1a, 0x94, 0xf1, 0xd6, 0xcd, 0xce, 0xee, 0x5a, 0xde, 0x62, 0xad, 0xd7, 0x84, 0x6a, 0xd1, 0xd0, 0x7d, 0x8c, + 0xab, 0xc6, 0x22, 0x46, 0xdc, 0x64, 0xbb, 0x2d, 0x80, 0x73, 0xc8, 0x45, 0x8d, 0x68, 0xf3, 0x33, 0x60, 0x58, 0x84, 0x19, 0x0a, 0x0b, 0x1e, 0x82, 0x62, 0x3b, 0x14, 0x0b, 0x08, 0xbe, 0x3f, 0x1e, + 0xed, 0xee, 0x39, 0x31, 0x68, 0x57, 0x7d, 0xe6, 0x1e, 0xe3, 0xab, 0x61, 0x0c, 0x7d, 0x4d, 0x22, 0xfa, 0xde, 0xb5, 0xf3, 0xba, 0x18, 0x91, 0x9f, 0x1f, 0x4a, 0xe3, 0xd4, 0xbf, 0x98, 0xf4, 0x9f, + 0x76, 0xa8, 0x1e, 0x4d, 0xe2, 0xbc, 0x4c, 0x63, 0xef, 0x75, 0xd4, 0xfe, 0x41, 0x77, 0xdf, 0x3b, 0xd9, 0xd7, 0xd1, 0xb8, 0x9e, 0x8c, 0x75, 0xee, 0x41, 0x9c, 0xab, 0x52, 0xdd, 0x6c, 0xce, 0x0d, + 0xeb, 0x36, 0x88, 0x8f, 0x15, 0x91, 0xa7, 0x2b, 0x40, 0x8d, 0xcd, 0x15, 0x1d, 0xb3, 0x80, 0x36, 0x08, 0xd3, 0xad, 0xdb, 0xc1, 0x7a, 0xa2, 0xe7, 0x8b, 0x2c, 0xd2, 0xcf, 0xac, 0x2b, 0x0a, 0x87, + 0x1a, 0xda, 0x12, 0x67, 0xb2, 0xe3, 0x1c, 0xa8, 0xc1, 0x25, 0xbe, 0x21, 0x37, 0x0e, 0x45, 0xee, 0x16, 0x68, 0x76, 0xae, 0x93, 0x39, 0x36, 0x23, 0x9c, 0x56, 0x7f, 0x4e, 0xc5, 0xfa, 0x28, 0xaf, + 0x7f, 0xa7, 0xe0, 0x63, 0xe4, 0x9f, 0xf3, 0xd7, 0xfe, 0xd6, 0xdf, 0x34, 0x82, 0x3c, 0x73, 0x1f, 0x94, 0xf2, 0xf9, 0x1c, 0xd8, 0xf7, 0x68, 0xfd, 0xca, 0xcb, 0xce, 0x2e, 0xbd, 0x87, 0xd2, 0x15, + 0x7a, 0xce, 0xcb, 0xf8, 0x46, 0xf5, 0x3a, 0x28, 0xd7, 0xe3, 0x09, 0x34, 0xce, 0xcf, 0xe8, 0x34, 0xca, 0x02, 0x0a, 0x0a, 0xa6, 0x56, 0x78, 0x55, 0x9b, 0x49, 0xb4, 0xea, 0xe3, 0x11, 0x8b, 0x60, + 0x64, 0xcd, 0x35, 0xce, 0x3c, 0x57, 0xd6, 0xce, 0xd4, 0xda, 0xd0, 0xf8, 0xe6, 0x2c, 0x1a, 0xfc, 0xa6, 0x43, 0x42, 0xc9, 0xed, 0xf8, 0x9c, 0xea, 0x7a, 0xdb, 0x49, 0x06, 0x71, 0x90, 0x68, 0x6c, + 0xa0, 0xce, 0x34, 0xb5, 0x86, 0x85, 0xcd, 0xe1, 0x08, 0x6e, 0x6a, 0x5c, 0xd4, 0x28, 0xdb, 0xcc, 0xbf, 0xfb, 0xa1, 0xab, 0xbf, 0x4a, 0xdf, 0x4e, 0x8a, 0x9f, 0x9a, 0xad, 0x3d, 0x25, 0x1d, 0x3e, + 0xe8, 0xbe, 0x7c, 0xfc, 0xc7, 0xd9, 0x98, 0xb0, 0x31, 0x78, 0x32, 0x97, 0xd5, 0x7a, 0xa5, 0x8a, 0xc6, 0x41, 0x28, 0x68, 0x04, 0xca, 0xb3, 0x88, 0xac, 0x18, 0x59, 0x49, 0x75, 0xfc, 0x48, 0x8e, + 0x58, 0x22, 0xaa, 0x1f, 0x43, 0xa0, 0x91, 0xa7, 0x8a, 0x25, 0xbf, 0x11, 0xbd, 0x7c, 0xcd, 0x6b, 0x18, 0x34, 0x32, 0xae, 0x58, 0xf2, 0x39, 0x3e, 0x89, 0xb2, 0x32, 0x3d, 0xd3, 0x3e, 0xaf, 0x35, + 0x0c, 0xd5, 0xec, 0x52, 0x20, 0x98, 0x2b, 0xee, 0x52, 0x0a, 0x05, 0x46, 0x8c, 0x25, 0x66, 0x0b, 0xf8, 0xfb, 0xb8, 0xd7, 0x88, 0x43, 0x15, 0x1a, 0xb3, 0x13, 0xec, 0x1c, 0x8d, 0x3e, 0xac, 0x21, + 0x28, 0xa7, 0xd5, 0xbc, 0x63, 0x08, 0xce, 0xab, 0x0b, 0x89, 0xb7, 0xed, 0x6d, 0x28, 0xd4, 0x24, 0x8c, 0x6c, 0x29, 0xdb, 0x01, 0x58, 0x56, 0xf8, 0xad, 0xd8, 0xe1, 0x6b, 0xfd, 0xaa, 0xe4, 0x2e, + 0x40, 0x5f, 0xaa, 0xf3, 0x3e, 0xda, 0xd1, 0x7a, 0x42, 0x0e, 0x7d, 0xa6, 0xfc, 0x02, 0xd5, 0xe7, 0xf3, 0xd1, 0xdd, 0x9b, 0x96, 0x79, 0x4b, 0x0f, 0xe2, 0x7e, 0x4a, 0x55, 0x73, 0xd2, 0x4c, 0x30, + 0x32, 0x50, 0x67, 0xbb, 0x15, 0x56, 0xb5, 0xea, 0xba, 0xb1, 0x63, 0x67, 0x7b, 0xde, 0xcb, 0xab, 0xf9, 0x3a, 0x65, 0x24, 0x47, 0x6b, 0x66, 0x25, 0x24, 0x06, 0xb0, 0x10, 0x6f, 0xf3, 0x62, 0x21, + 0x52, 0x9b, 0x78, 0x7e, 0x88, 0x4d, 0x66, 0xe6, 0x04, 0xb6, 0x8d, 0xcc, 0x23, 0xdc, 0x29, 0x7d, 0x19, 0xa7, 0x37, 0x86, 0xb6, 0x84, 0xbe, 0x47, 0x0c, 0xfe, 0x50, 0x9f, 0xed, 0xd1, 0x3c, 0x78, + 0x1e, 0x90, 0x6f, 0x6f, 0xf9, 0x04, 0xce, 0xb7, 0x7b, 0x63, 0x22, 0x06, 0xe1, 0xc9, 0xa2, 0x3b, 0x0d, 0xad, 0xa1, 0x13, 0x42, 0x08, 0x1f, 0x52, 0x4f, 0x70, 0xd9, 0x03, 0x1e, 0x56, 0xc9, 0x92, + 0x0f, 0xfb, 0x11, 0xfb, 0x9a, 0x5f, 0xab, 0x2f, 0x3f, 0x62, 0x81, 0xbf, 0xaf, 0x4b, 0xdd, 0x50, 0x06, 0x27, 0xb7, 0xe7, 0x63, 0x1b, 0x1d, 0xc9, 0x2b, 0x63, 0x80, 0xb5, 0x03, 0x21, 0xaa, 0x10, + 0x45, 0x6d, 0xfd, 0x56, 0x5f, 0x60, 0x87, 0x36, 0xab, 0xa9, 0x5a, 0x3d, 0xee, 0x37, 0xa4, 0x00, 0x4f, 0xbd, 0xb3, 0x9c, 0xc4, 0xc7, 0x55, 0xb3, 0xad, 0xa7, 0x0d, 0x4b, 0x45, 0x3c, 0xcd, 0x1f, + 0xd6, 0xfd, 0x9a, 0x89, 0xd7, 0x0a, 0x36, 0x70, 0x6b, 0x3f, 0x61, 0x3c, 0x96, 0x92, 0x37, 0x0a, 0xbd, 0xb7, 0x86, 0x6a, 0x75, 0x86, 0x76, 0x36, 0xbb, 0xa6, 0x46, 0xec, 0x37, 0x8c, 0xa8, 0x5b, + 0xfd, 0x37, 0x0b, 0x4d, 0xbf, 0xde, 0xff, 0x7f, 0xbe, 0xa1, 0x7f, 0xb7, 0xb0, 0xf5, 0x3f, 0x27, 0x80, 0xef, 0xbf, 0xe2, 0x75, 0x3c, 0xbe, 0xdf, 0x18, 0x23, 0x96, 0x2f, 0x41, 0x79, 0x5c, 0xea, + 0xf1, 0xb0, 0xd9, 0x2e, 0xe5, 0xd8, 0x2a, 0x92, 0x7a, 0xb6, 0x09, 0x8f, 0x4d, 0xac, 0x67, 0x7d, 0x73, 0x1c, 0xce, 0x22, 0xa8, 0xe0, 0x1b, 0x76, 0xb5, 0x47, 0x61, 0xc1, 0x47, 0x99, 0x05, 0xbc, + 0x39, 0x61, 0x0e, 0xa4, 0x22, 0xdb, 0x68, 0x8f, 0x51, 0xba, 0x10, 0x53, 0xad, 0x55, 0x6c, 0x59, 0xd9, 0xf0, 0x4e, 0x19, 0x00, 0x2f, 0x5d, 0x9b, 0xee, 0xb2, 0x41, 0xd3, 0xb0, 0x76, 0x76, 0x78, + 0x4e, 0x71, 0xfb, 0xa5, 0x4e, 0xf9, 0xa3, 0xfa, 0xe2, 0xf7, 0x07, 0xe4, 0x71, 0xe4, 0x23, 0xf1, 0x17, 0xfc, 0x44, 0xf4, 0xc2, 0x6b, 0xd0, 0xe3, 0x25, 0xd8, 0xef, 0x42, 0xe1, 0x77, 0x68, 0xd7, + 0x9d, 0x7d, 0xee, 0x7a, 0x8b, 0x40, 0xd6, 0x47, 0xa2, 0xb5, 0x96, 0x9b, 0x7a, 0xb3, 0x29, 0xfb, 0x6e, 0x0f, 0x59, 0xcd, 0xba, 0x57, 0xeb, 0xd2, 0x63, 0x6b, 0xdb, 0xf1, 0x03, 0x4b, 0xa0, 0x4d, + 0xcc, 0x5a, 0xac, 0x22, 0xa3, 0x0e, 0xbd, 0x21, 0x4b, 0x1a, 0xc5, 0xaf, 0xce, 0x9b, 0x74, 0x1b, 0xd7, 0x1c, 0xa4, 0xd2, 0x12, 0x20, 0x21, 0x78, 0xb5, 0xd3, 0x78, 0x5f, 0x50, 0x97, 0x48, 0x27, + 0x32, 0xbf, 0x2d, 0x13, 0x0f, 0xa6, 0xc1, 0x8d, 0x56, 0x70, 0x47, 0xd9, 0x8a, 0xb3, 0xe0, 0xb2, 0xb1, 0xf4, 0xe7, 0x5d, 0x35, 0x2d, 0xce, 0x22, 0xbf, 0x8c, 0xaf, 0x5e, 0x83, 0x9b, 0x31, 0xf9, + 0xa5, 0x30, 0xe3, 0x27, 0x15, 0x0e, 0xbd, 0xe3, 0x8a, 0x88, 0x2f, 0x75, 0xf5, 0xf3, 0xa4, 0xa9, 0x3f, 0xef, 0x9a, 0x3d, 0x1c, 0xcf, 0x8f, 0x20, 0xcb, 0x7b, 0xc3, 0x8a, 0x3d, 0x15, 0xb1, 0xf1, + 0x89, 0xee, 0xdb, 0xe8, 0x5e, 0xcf, 0x2e, 0xe5, 0x67, 0x46, 0xe8, 0x02, 0xb4, 0xb4, 0x0c, 0x55, 0x79, 0xe6, 0x17, 0xf1, 0xca, 0xec, 0xb6, 0x28, 0xad, 0x64, 0x8b, 0x33, 0x80, 0x19, 0x99, 0xd6, + 0x20, 0x3c, 0x63, 0x7a, 0x83, 0xb3, 0xd8, 0x4e, 0x31, 0x7f, 0xdd, 0xc1, 0x6d, 0x89, 0x0e, 0x0c, 0xda, 0x5a, 0x6b, 0xbf, 0xf7, 0x3d, 0xb8, 0x9a, 0x51, 0x51, 0xe6, 0xb8, 0x92, 0x4b, 0x81, 0x6a, + 0x29, 0xf6, 0x22, 0xa6, 0x6c, 0xe5, 0xf2, 0xb8, 0x18, 0xa6, 0xb6, 0x4a, 0x59, 0xf9, 0x73, 0xf3, 0xe7, 0x6b, 0x4d, 0xcf, 0x1f, 0xa6, 0x86, 0xfd, 0x30, 0xcb, 0x10, 0x46, 0xff, 0x22, 0x9f, 0x91, + 0x4e, 0x57, 0xa2, 0xaf, 0x18, 0xda, 0x49, 0x35, 0xb9, 0x12, 0xfa, 0x1d, 0xc0, 0x92, 0xaf, 0x3d, 0x1a, 0x07, 0xb6, 0x2c, 0xb3, 0x3c, 0xf8, 0x5c, 0x4b, 0x53, 0x70, 0x59, 0x9c, 0x06, 0xae, 0x3d, + 0x82, 0x47, 0x14, 0x8c, 0x09, 0xce, 0xdf, 0xc8, 0x71, 0xd9, 0xc7, 0xbb, 0x66, 0xc5, 0x43, 0x7c, 0x47, 0xb9, 0x45, 0xbf, 0x12, 0xe9, 0x1a, 0x39, 0xd4, 0x0e, 0xdd, 0xe9, 0xb6, 0xe2, 0x45, 0x2c, + 0x80, 0x11, 0xe8, 0x7e, 0xda, 0xee, 0x3a, 0x7c, 0xe9, 0x1e, 0x84, 0xad, 0x5d, 0xc5, 0xd4, 0x73, 0xa6, 0xca, 0x65, 0x13, 0x37, 0x78, 0xdb, 0x53, 0x85, 0xfe, 0x42, 0xa0, 0xbf, 0x97, 0x37, 0xf4, + 0xf9, 0xef, 0x3f, 0x2e, 0x7f, 0x33, 0x3c, 0xbe, 0x86, 0xb8, 0x8d, 0xc5, 0xf8, 0x9d, 0x3c, 0x38, 0xf9, 0x38, 0x9e, 0x5c, 0x09, 0x8e, 0x8c, 0x2b, 0xf3, 0x01, 0x9f, 0x9b, 0x96, 0x10, 0x18, 0xef, + 0xb2, 0x82, 0x3e, 0xb3, 0x24, 0x86, 0x0c, 0x28, 0x0d, 0x6c, 0x20, 0xa6, 0xc6, 0x94, 0x0d, 0x08, 0x6e, 0x0e, 0xab, 0x4e, 0xf1, 0x10, 0x63, 0xce, 0x73, 0x69, 0xd9, 0x77, 0xe7, 0x00, 0x6b, 0x2b, + 0x2b, 0x89, 0xa6, 0x0a, 0x9e, 0xc4, 0xe7, 0x04, 0x67, 0x80, 0x6e, 0x00, 0x49, 0x0f, 0x48, 0x6d, 0x4d, 0xa5, 0x8f, 0x1b, 0x78, 0xbe, 0x3c, 0x2e, 0xd1, 0xf5, 0xf3, 0xe9, 0xbf, 0x2f, 0xac, 0xe2, + 0x3c, 0x72, 0xa5, 0xc3, 0xf0, 0x53, 0xf9, 0xae, 0x57, 0x9a, 0xaf, 0x7c, 0xe8, 0xf4, 0x93, 0x2b, 0x99, 0xdf, 0xd9, 0x30, 0x08, 0xbc, 0x34, 0xaf, 0x0e, 0x34, 0x09, 0x11, 0x3d, 0x01, 0x24, 0x34, + 0xbc, 0x11, 0xa1, 0x03, 0xb7, 0xa6, 0x15, 0x23, 0x35, 0x9b, 0x04, 0x24, 0x60, 0xec, 0x1c, 0x2f, 0xd7, 0xdc, 0x21, 0x47, 0x23, 0x66, 0xbd, 0xd5, 0xdc, 0xb8, 0x0c, 0xe5, 0x4d, 0xb6, 0xe7, 0x66, + 0x19, 0x16, 0xa2, 0x69, 0xad, 0x90, 0x9a, 0xb4, 0x9e, 0x19, 0xce, 0x31, 0x68, 0x6c, 0x98, 0x2f, 0xfc, 0x0c, 0xc1, 0xc0, 0xbd, 0xfb, 0x9c, 0x6b, 0xf1, 0xda, 0x2d, 0xa2, 0xc9, 0x5e, 0x81, 0xf8, + 0x1e, 0xdd, 0xfa, 0xa9, 0xc3, 0xd8, 0x55, 0xe8, 0x7e, 0x8f, 0x4b, 0xf8, 0x74, 0xfb, 0x8b, 0xba, 0xf3, 0xa9, 0xb0, 0x30, 0xf6, 0xb5, 0x2a, 0xf0, 0x4f, 0x91, 0xea, 0x55, 0x62, 0xdf, 0x54, 0x1b, + 0xfe, 0x1b, 0xf3, 0xe2, 0x5b, 0x23, 0xaa, 0x3f, 0xfe, 0xf8, 0x2e, 0xbb, 0xc9, 0xa7, 0xe6, 0xc4, 0x7b, 0x37, 0xaa, 0xd7, 0x56, 0x54, 0x17, 0x4a, 0xe3, 0x26, 0x03, 0x23, 0x16, 0x01, 0x4b, 0x6c, + 0x8b, 0x98, 0xd3, 0x0a, 0x26, 0x01, 0x69, 0x5c, 0x9d, 0x52, 0x24, 0x63, 0x2f, 0x57, 0xb8, 0x09, 0xd2, 0x8c, 0x46, 0xa1, 0x9c, 0xe6, 0x38, 0x3d, 0x12, 0x6c, 0x21, 0xa8, 0x9d, 0x72, 0x4e, 0xbb, + 0x65, 0xf6, 0x3b, 0x2e, 0xb7, 0x15, 0x58, 0x67, 0xb6, 0x42, 0x85, 0xc6, 0x0a, 0x86, 0x16, 0x2b, 0x93, 0xe0, 0x6a, 0xeb, 0x88, 0x09, 0xf4, 0x6c, 0x89, 0x11, 0x31, 0xac, 0x8f, 0x2a, 0x77, 0x7a, + 0x7f, 0x32, 0xe4, 0x0f, 0x1b, 0x2e, 0x3e, 0x67, 0xa9, 0xbc, 0x10, 0x7c, 0x99, 0x07, 0x79, 0xe1, 0x8d, 0xb1, 0x3f, 0x2e, 0xfe, 0x75, 0x1c, 0x73, 0x36, 0xc9, 0xd2, 0xf6, 0xce, 0x6d, 0xe1, 0x80, + 0x34, 0x62, 0x3b, 0x86, 0x97, 0x9c, 0x84, 0x93, 0x81, 0xe1, 0xe8, 0xa1, 0x51, 0x32, 0x0b, 0xde, 0xd5, 0x47, 0xbc, 0x82, 0xab, 0xa5, 0x42, 0x36, 0x9b, 0x6a, 0xaf, 0x10, 0xd0, 0xf9, 0xb4, 0x1c, + 0x8c, 0xd3, 0xd9, 0x08, 0x60, 0x5f, 0x3b, 0xb1, 0x4d, 0xd6, 0x69, 0x88, 0x78, 0x74, 0x07, 0xce, 0xb7, 0xfd, 0x61, 0x26, 0x68, 0x56, 0xd4, 0x8d, 0xd0, 0xd2, 0xef, 0xab, 0x76, 0x0f, 0x74, 0xed, + 0xc8, 0x2e, 0xbd, 0x49, 0xe9, 0x1f, 0xde, 0x93, 0x43, 0x1f, 0x79, 0xdd, 0xfe, 0xfe, 0x2a, 0x76, 0x4b, 0x1a, 0x9c, 0x7c, 0xb9, 0x30, 0x36, 0x8b, 0xc1, 0x58, 0x5a, 0x0c, 0x10, 0x3b, 0x6c, 0x74, + 0x26, 0x24, 0x27, 0xa2, 0x7d, 0x42, 0x32, 0xea, 0x9c, 0x73, 0x9a, 0xed, 0x34, 0x02, 0xc5, 0x46, 0xd2, 0xf8, 0x15, 0xb0, 0x22, 0x23, 0xd0, 0x67, 0xf6, 0x79, 0xbd, 0x32, 0x13, 0x28, 0x60, 0x42, + 0x85, 0x40, 0xce, 0xec, 0x7c, 0x26, 0x84, 0xcb, 0x08, 0x41, 0xa4, 0x95, 0xb5, 0x94, 0x8c, 0xcd, 0x99, 0x11, 0x77, 0x4d, 0x44, 0x97, 0x30, 0x54, 0x92, 0xbc, 0x37, 0xc6, 0x97, 0x7e, 0x35, 0x65, + 0x1e, 0xb1, 0xd0, 0xdf, 0x17, 0xa6, 0x91, 0x5d, 0x5d, 0x40, 0xa8, 0x26, 0x63, 0xa5, 0x28, 0xe2, 0xb5, 0x12, 0x64, 0xe8, 0xb8, 0xe4, 0x1f, 0x08, 0xe5, 0xb8, 0x5b, 0x2d, 0x4a, 0x3f, 0x3a, 0x38, + 0x83, 0x48, 0x1f, 0xe6, 0x05, 0x06, 0x1a, 0xc2, 0xb6, 0xc0, 0x6a, 0xad, 0xd8, 0x2d, 0x8d, 0xe9, 0x8a, 0xe7, 0x2d, 0x01, 0x06, 0x99, 0xb3, 0x33, 0x57, 0xea, 0x00, 0xac, 0x62, 0x1a, 0x51, 0x77, + 0x9a, 0x0f, 0x51, 0xae, 0xcd, 0xa6, 0x46, 0x6d, 0x9a, 0xc3, 0x8e, 0x5b, 0x3a, 0x8c, 0x3a, 0x1d, 0x46, 0x38, 0xcf, 0x1f, 0x99, 0x79, 0x0f, 0x18, 0xa8, 0x9a, 0x38, 0x71, 0x18, 0x3f, 0xf6, 0x28, + 0xc1, 0x4f, 0x35, 0xa9, 0xfc, 0x44, 0xf7, 0x15, 0xb5, 0xd7, 0xb3, 0x0b, 0x7a, 0x23, 0x74, 0xc9, 0x5a, 0x6d, 0x67, 0x42, 0xcd, 0x94, 0x54, 0x72, 0x9c, 0x43, 0xdc, 0x19, 0xb2, 0xe5, 0x78, 0x4b, + 0x6d, 0x00, 0xa9, 0x30, 0xa6, 0x43, 0x8c, 0x94, 0xe0, 0xc6, 0xf7, 0x31, 0xe3, 0xa8, 0xb0, 0x8e, 0x7d, 0x6a, 0x51, 0x4c, 0x59, 0x9b, 0xe2, 0xe0, 0x74, 0x72, 0x30, 0x57, 0x2d, 0x8b, 0x87, 0x8e, + 0x0a, 0xa0, 0x78, 0x38, 0x0a, 0x21, 0xfa, 0xca, 0x42, 0x0a, 0xd0, 0x59, 0xcd, 0xb8, 0x5c, 0x41, 0x8d, 0x7c, 0x4c, 0xb3, 0xd7, 0x97, 0xdf, 0x1a, 0x24, 0xf6, 0xa3, 0x60, 0xe8, 0xe7, 0xf6, 0x13, + 0xde, 0x88, 0xbe, 0x62, 0xf1, 0x72, 0x38, 0x7a, 0x37, 0xa1, 0x3f, 0xae, 0x34, 0x50, 0x86, 0x85, 0x83, 0xb6, 0x73, 0xeb, 0xa2, 0x08, 0x97, 0x74, 0x18, 0xa8, 0x12, 0x54, 0x0b, 0x46, 0x63, 0xe9, + 0x87, 0x28, 0x14, 0x4b, 0x98, 0x38, 0x9e, 0xb4, 0x26, 0x15, 0x13, 0x9c, 0x0e, 0x5a, 0x94, 0x5b, 0xaa, 0x89, 0xaf, 0x13, 0x27, 0x4b, 0x1f, 0xf2, 0x3d, 0x3b, 0xd7, 0x68, 0x5e, 0x63, 0x67, 0xd3, + 0x8d, 0x94, 0x2f, 0x40, 0xeb, 0xac, 0xa3, 0x5c, 0x9b, 0x88, 0xdb, 0xb1, 0x40, 0x7c, 0x98, 0xfc, 0xff, 0xe8, 0x44, 0x7a, 0xa3, 0xfb, 0x0a, 0xc7, 0xeb, 0xd9, 0xd8, 0x89, 0x95, 0xa0, 0xeb, 0x59, + 0x33, 0xc7, 0xc5, 0x90, 0xdd, 0x74, 0x1a, 0x2b, 0x1c, 0x3d, 0x73, 0xc1, 0xc5, 0x91, 0x79, 0xa8, 0xb1, 0x42, 0xd9, 0x3a, 0x5c, 0x38, 0xc5, 0xcb, 0x3a, 0x49, 0x33, 0x75, 0x9b, 0xe8, 0x4e, 0x98, + 0x32, 0xe4, 0x5a, 0x5a, 0x96, 0xc2, 0xca, 0x31, 0xcd, 0x39, 0xa3, 0x3a, 0xd9, 0xd6, 0x5e, 0xf9, 0x67, 0x51, 0xa8, 0xe3, 0xad, 0x44, 0x46, 0xa9, 0xaf, 0x1c, 0x94, 0x01, 0xd1, 0x3c, 0xe0, 0x9b, + 0x0b, 0xed, 0x7b, 0x93, 0x9f, 0x7f, 0xce, 0x7f, 0xf1, 0x85, 0xf6, 0x2b, 0x0c, 0x9f, 0xae, 0x8c, 0xf5, 0x58, 0x1c, 0xe7, 0x07, 0x57, 0xdd, 0x44, 0x59, 0xb2, 0x30, 0xe0, 0x63, 0x9f, 0x2f, 0x8e, + 0x84, 0xb4, 0x17, 0x54, 0xbb, 0xe3, 0xb1, 0x95, 0xe4, 0x80, 0xeb, 0x41, 0x77, 0xb1, 0x8e, 0x62, 0x20, 0x24, 0x92, 0x34, 0x09, 0xf2, 0x82, 0xb9, 0x72, 0x70, 0x78, 0x59, 0x68, 0x43, 0xd8, 0xc3, + 0xdd, 0x00, 0xe5, 0x1d, 0x5f, 0x4f, 0x6b, 0x9d, 0x32, 0x1c, 0xc7, 0x40, 0x4f, 0x83, 0x85, 0x68, 0x7e, 0x44, 0x11, 0xbb, 0x11, 0x41, 0x64, 0xf7, 0xdc, 0x41, 0x0f, 0x36, 0x85, 0xde, 0xb7, 0x35, + 0xfe, 0x41, 0xf8, 0x2e, 0x24, 0x5f, 0x50, 0xbb, 0x1c, 0x8c, 0x05, 0x4b, 0x9e, 0xaf, 0x0d, 0xa8, 0xb6, 0x77, 0xb2, 0x64, 0xd5, 0xed, 0x52, 0x59, 0xd2, 0x1e, 0x33, 0x8b, 0xfc, 0x2a, 0xcd, 0x43, + 0xab, 0xac, 0x9b, 0x7d, 0x6b, 0xec, 0xaa, 0x39, 0x6f, 0x69, 0x47, 0x44, 0xd5, 0x01, 0x3b, 0xab, 0x8a, 0x93, 0x85, 0xb4, 0x62, 0x96, 0xaf, 0x43, 0x62, 0xc9, 0xc1, 0x80, 0x7e, 0x84, 0xf1, 0x0d, + 0x4c, 0xd1, 0xdb, 0xd8, 0x85, 0x99, 0x66, 0x4e, 0x3a, 0x33, 0xd2, 0x45, 0x52, 0x6c, 0x4c, 0x15, 0x97, 0x28, 0xaf, 0x6a, 0xdf, 0x9b, 0x84, 0xf1, 0xcb, 0xca, 0x1e, 0x3c, 0xea, 0xae, 0xfc, 0x5c, + 0xb0, 0xc6, 0x17, 0xda, 0x2f, 0xa0, 0xdc, 0x5e, 0x19, 0x1b, 0xbc, 0x71, 0xec, 0x67, 0x0d, 0x27, 0xed, 0x0e, 0xab, 0x93, 0xd5, 0xb0, 0x8e, 0xc2, 0x0f, 0x6b, 0xd2, 0xa0, 0xd0, 0xcd, 0x20, 0x47, + 0xdd, 0x92, 0x21, 0xe0, 0x7c, 0xbe, 0x53, 0xfb, 0xc1, 0xc8, 0x01, 0x61, 0x6b, 0x2d, 0x81, 0x22, 0x93, 0xb7, 0xdb, 0x73, 0xe3, 0x7a, 0xc7, 0x52, 0xb2, 0xda, 0xe3, 0x5a, 0xc9, 0xca, 0x00, 0xd3, + 0x95, 0x4a, 0x16, 0x81, 0xe5, 0x0a, 0xa2, 0xd8, 0x0e, 0xa1, 0x5c, 0x85, 0x5e, 0x3f, 0xd9, 0x1a, 0x37, 0x29, 0x9b, 0x2f, 0xcd, 0x47, 0x1e, 0x78, 0x42, 0x5e, 0x70, 0x99, 0x5c, 0x42, 0xa2, 0x1f, + 0xef, 0x87, 0x3c, 0xc5, 0x60, 0x1f, 0x74, 0x5f, 0x00, 0xfd, 0x38, 0x1b, 0xdb, 0xad, 0x7b, 0x5e, 0x77, 0xe5, 0x02, 0xf4, 0x1b, 0x66, 0xb0, 0xb9, 0x83, 0xe9, 0x2b, 0x27, 0x29, 0x4c, 0x7a, 0x62, + 0x01, 0x9d, 0xda, 0x38, 0xde, 0xe7, 0xab, 0x5d, 0xd6, 0x72, 0x3c, 0x62, 0xc1, 0x45, 0xc2, 0x78, 0xfb, 0xd0, 0xe9, 0x0f, 0x2d, 0x3a, 0x2d, 0x78, 0x4d, 0x75, 0xa8, 0x21, 0xf7, 0x79, 0xb1, 0x67, + 0x7b, 0x14, 0x05, 0xd8, 0x5d, 0x8f, 0xed, 0x6a, 0x6a, 0x97, 0x03, 0x9a, 0xae, 0xd4, 0x92, 0xa9, 0x8e, 0x98, 0x97, 0xaf, 0x9d, 0xca, 0xff, 0xfc, 0xd6, 0xb3, 0xe3, 0xc6, 0x6b, 0xf5, 0xad, 0x35, + 0x9d, 0x5f, 0xbf, 0xb7, 0xa5, 0xcb, 0x83, 0x3f, 0xbf, 0x65, 0x87, 0x5f, 0x6a, 0x7d, 0xdb, 0x75, 0x53, 0xf9, 0xef, 0x7f, 0x7f, 0x63, 0x46, 0xd5, 0x79, 0xec, 0xf9, 0x59, 0x1d, 0x07, 0xd7, 0x4a, + 0xdd, 0xaf, 0x3a, 0xfa, 0xdd, 0x11, 0x8b, 0xdd, 0x3c, 0x6b, 0x27, 0x49, 0x5c, 0x3f, 0xda, 0x89, 0x80, 0xfe, 0x9a, 0xfe, 0x85, 0xfc, 0xfd, 0x60, 0x9a, 0x0f, 0xba, 0x2f, 0xf6, 0xcf, 0xfb, 0xc9, + 0xe4, 0x4a, 0xee, 0xf7, 0x01, 0x6b, 0x51, 0x71, 0x9f, 0x59, 0xb4, 0xdb, 0x66, 0x7d, 0x77, 0xd4, 0x74, 0xce, 0xca, 0xd3, 0x25, 0xed, 0xd6, 0x89, 0x4f, 0x28, 0xfb, 0xbd, 0xef, 0x7b, 0x92, 0x82, + 0xc2, 0x5d, 0x97, 0x10, 0x46, 0xd2, 0xe7, 0x7b, 0x69, 0x2a, 0xc7, 0x94, 0x5d, 0xb6, 0xaa, 0x9f, 0x6d, 0xe4, 0x5d, 0xe6, 0xc3, 0x9a, 0xab, 0x74, 0xd1, 0x6c, 0x0d, 0xf3, 0xdd, 0x7a, 0x89, 0xc0, + 0x0e, 0x77, 0xf2, 0x8a, 0x03, 0x09, 0x96, 0x23, 0xb4, 0xfd, 0xca, 0x0e, 0xfc, 0xf2, 0x53, 0x37, 0xc4, 0xff, 0xfb, 0xff, 0xfa, 0xe3, 0xd2, 0xa5, 0xe2, 0x8f, 0xff, 0xf3, 0x8f, 0x07, 0x2a, 0x7f, + 0xec, 0xfb, 0x3e, 0x81, 0x4d, 0x1f, 0x0a, 0xd4, 0x67, 0xc2, 0x9a, 0x5f, 0x69, 0xbe, 0x40, 0x77, 0x3d, 0x1a, 0xdb, 0xea, 0xcc, 0x73, 0xfb, 0x53, 0xc4, 0xb6, 0x7b, 0x78, 0x36, 0xc5, 0x93, 0xbd, + 0xe5, 0x1a, 0xa7, 0x59, 0x21, 0x00, 0xf3, 0x5a, 0x54, 0x64, 0xc3, 0x5b, 0x8a, 0x1b, 0x1c, 0x64, 0x03, 0xec, 0x50, 0x21, 0x43, 0xde, 0xe8, 0xd5, 0x69, 0x41, 0x2c, 0xf1, 0x6a, 0x7e, 0x8e, 0xeb, + 0xe5, 0x0c, 0x20, 0x04, 0x53, 0x40, 0x28, 0xc1, 0xdb, 0x4b, 0x6b, 0xde, 0x6b, 0xa8, 0x61, 0x3d, 0xad, 0xe6, 0x59, 0x6e, 0xc8, 0xd9, 0xc9, 0xfe, 0xb6, 0x14, 0xff, 0xd8, 0xbc, 0x79, 0xfa, 0x54, + 0x02, 0xde, 0x57, 0x5b, 0x79, 0xfa, 0x7b, 0xb2, 0xdd, 0xcb, 0xf7, 0xba, 0xfd, 0x9c, 0x15, 0xca, 0x93, 0x0b, 0x9a, 0x9e, 0xbb, 0x9b, 0x67, 0xf1, 0x2a, 0x1a, 0x96, 0x53, 0x04, 0xa0, 0x07, 0x15, + 0x08, 0x37, 0x5d, 0xaa, 0x0f, 0x92, 0x3a, 0x77, 0x95, 0x99, 0x6c, 0x76, 0xbd, 0xda, 0x30, 0x0c, 0xd3, 0x83, 0xc2, 0xa1, 0x39, 0xef, 0xd6, 0x16, 0x38, 0xe7, 0x39, 0x1e, 0x17, 0xf3, 0x13, 0xbc, + 0x89, 0x07, 0x51, 0x62, 0x76, 0xbd, 0xe6, 0xb6, 0xa4, 0x34, 0x95, 0xac, 0xa5, 0x38, 0x66, 0x09, 0x79, 0xfd, 0x99, 0x4e, 0x3f, 0xf1, 0xfc, 0xc0, 0x6e, 0x92, 0x7f, 0xb6, 0xf4, 0xc7, 0x37, 0xea, + 0x1f, 0xc0, 0x7c, 0x5c, 0x1b, 0x63, 0x38, 0xc3, 0x13, 0x55, 0x2c, 0x6a, 0xb7, 0x75, 0x16, 0x39, 0x4e, 0xd2, 0x27, 0x1b, 0x16, 0xb0, 0xdc, 0x2b, 0xa7, 0xd3, 0xd8, 0x17, 0xba, 0xe3, 0x88, 0xaf, + 0xbc, 0x6d, 0xe6, 0x74, 0xef, 0x03, 0x9f, 0xab, 0xf1, 0xf5, 0x99, 0xf0, 0xcb, 0xb7, 0x7d, 0x3a, 0x1d, 0x5b, 0xef, 0xab, 0xf5, 0x4d, 0x33, 0x92, 0x6d, 0x80, 0x85, 0x65, 0x46, 0x18, 0xb2, 0x36, + 0xd2, 0xf9, 0xb3, 0x43, 0x06, 0xf6, 0x39, 0x29, 0x3b, 0x3d, 0x3b, 0x57, 0x3e, 0x4b, 0x3b, 0x74, 0x31, 0xc5, 0x08, 0x0e, 0xea, 0xd6, 0x9b, 0x38, 0x47, 0x1c, 0x49, 0x15, 0xb2, 0x83, 0xc9, 0x46, + 0xe2, 0x01, 0x30, 0x63, 0xfa, 0x84, 0xc3, 0xe7, 0x52, 0x5c, 0x44, 0xf2, 0x91, 0x8a, 0xf7, 0xc6, 0x11, 0x9b, 0x0f, 0xa1, 0x2c, 0x3e, 0xe7, 0xdc, 0x7e, 0xf5, 0xca, 0xa7, 0xb9, 0xd7, 0x24, 0x0f, + 0x72, 0x6c, 0x5e, 0x71, 0xb9, 0x24, 0x15, 0xff, 0xf9, 0xbf, 0x7e, 0x8e, 0x6f, 0xbc, 0x6d, 0x90, 0x75, 0x5f, 0x28, 0xc3, 0x4f, 0x04, 0x38, 0x7e, 0xa2, 0x7b, 0xc1, 0xfc, 0xfd, 0xec, 0xd2, 0x24, + 0xfd, 0x17, 0xa1, 0x0c, 0x4f, 0x8e, 0x51, 0x8c, 0x55, 0xe5, 0x31, 0xcf, 0x0f, 0xf1, 0x79, 0xeb, 0x6a, 0x84, 0x8d, 0xc0, 0x7b, 0xa7, 0x17, 0x75, 0x1d, 0xc8, 0x47, 0x70, 0x52, 0xf6, 0xb2, 0x22, + 0x4d, 0x7e, 0xcc, 0x6b, 0x7d, 0xce, 0x94, 0xbb, 0xa1, 0xfc, 0xf2, 0x5d, 0x9f, 0xcf, 0x47, 0x1b, 0x75, 0x1e, 0xcb, 0x5a, 0xcd, 0x94, 0x46, 0xa4, 0x7e, 0x29, 0x10, 0xeb, 0x12, 0x44, 0x86, 0x05, + 0xd0, 0x61, 0x87, 0xd4, 0x69, 0x8e, 0x30, 0x6b, 0x30, 0x19, 0xd7, 0x29, 0x9c, 0xdc, 0x32, 0x43, 0x55, 0x30, 0xab, 0xe3, 0x8c, 0x73, 0x14, 0x9b, 0x5c, 0x9c, 0x75, 0x38, 0x09, 0x23, 0xd3, 0xb5, + 0x17, 0xab, 0x59, 0xa6, 0xec, 0x62, 0xe7, 0xc0, 0xee, 0x93, 0x13, 0x41, 0x50, 0x7b, 0x18, 0xec, 0xb1, 0xf3, 0xa3, 0xe0, 0xcd, 0x2f, 0xb8, 0xbc, 0xef, 0x6d, 0x3d, 0x12, 0x1f, 0x4f, 0x08, 0xd3, + 0x57, 0xa2, 0x17, 0x34, 0xae, 0x87, 0x17, 0x61, 0xf1, 0x6b, 0xf6, 0xb2, 0xea, 0xc0, 0x07, 0xd1, 0x0b, 0xe4, 0xb5, 0xdc, 0xad, 0xda, 0x15, 0x27, 0x70, 0xfc, 0x0e, 0x0f, 0x77, 0x3b, 0xd8, 0x09, + 0xee, 0x0b, 0x8b, 0x5f, 0xe6, 0xc5, 0xe3, 0x2d, 0xb6, 0xae, 0xb4, 0x8b, 0xe2, 0xf2, 0xde, 0x47, 0x7a, 0xc9, 0x87, 0x7e, 0xf4, 0x48, 0x8d, 0x7c, 0x62, 0x02, 0xbc, 0x12, 0xbd, 0xe0, 0x72, 0x3d, + 0xbc, 0x28, 0x90, 0x23, 0xf4, 0x91, 0x23, 0xd8, 0x2e, 0xec, 0xfd, 0x14, 0x34, 0x13, 0x1b, 0xdd, 0x0d, 0xbd, 0x38, 0x6b, 0x35, 0x59, 0xda, 0x9b, 0xfe, 0x92, 0x6f, 0x4f, 0x92, 0x50, 0x67, 0x27, + 0xc6, 0x6b, 0x06, 0x8d, 0x2f, 0x86, 0x42, 0xb6, 0x06, 0xba, 0x3a, 0x0a, 0x62, 0x64, 0x21, 0x02, 0xc0, 0x65, 0x4c, 0xac, 0x8a, 0xd4, 0xb0, 0x50, 0xf3, 0xe5, 0xdc, 0x17, 0x8b, 0xbd, 0x70, 0xb6, + 0xa7, 0x9e, 0xe9, 0x5b, 0x4b, 0xf9, 0xe4, 0x77, 0xdf, 0x8a, 0x04, 0xc5, 0x5f, 0xba, 0x43, 0xff, 0x73, 0x46, 0xfe, 0x0d, 0xe5, 0xcb, 0xf7, 0x7f, 0x3a, 0x1f, 0x6b, 0xe8, 0x4b, 0x10, 0xcb, 0xc0, + 0xab, 0x19, 0x58, 0x6d, 0x7b, 0x2b, 0x21, 0xdc, 0x65, 0x4e, 0x90, 0x19, 0xe6, 0x29, 0x84, 0xaf, 0xab, 0x5d, 0x57, 0x98, 0xdb, 0x78, 0xaf, 0x44, 0xda, 0xb0, 0x39, 0x5b, 0x06, 0x2d, 0xea, 0x0d, + 0x43, 0xb6, 0x49, 0xa6, 0xcc, 0xfb, 0xf5, 0xd9, 0x2b, 0x0d, 0x2d, 0x3f, 0x56, 0xf8, 0x7e, 0xbb, 0x36, 0xb2, 0x79, 0xe0, 0x0c, 0xb6, 0xe1, 0x61, 0xbb, 0xf5, 0x21, 0x0a, 0x43, 0xe0, 0xc9, 0x46, + 0xaa, 0xf7, 0xbd, 0xb2, 0x37, 0x3c, 0xf6, 0x30, 0x76, 0xa2, 0x8a, 0x3d, 0x7f, 0xe2, 0x46, 0x76, 0x96, 0xf9, 0x1f, 0x2d, 0x54, 0x1f, 0x64, 0xa9, 0xc4, 0x85, 0xed, 0x79, 0xe5, 0x5f, 0x87, 0xc7, + 0x2e, 0x17, 0xea, 0x99, 0xf5, 0xfd, 0x8d, 0xea, 0xcb, 0x48, 0xbc, 0x1d, 0x4f, 0x2e, 0xb4, 0x7e, 0x1f, 0x05, 0x48, 0x58, 0x82, 0x38, 0x44, 0x9c, 0xf3, 0xb3, 0xaa, 0xe5, 0x3c, 0xb1, 0x38, 0x6c, + 0xe0, 0x79, 0xa0, 0x3a, 0xeb, 0x5c, 0x87, 0x00, 0xa7, 0xd6, 0x62, 0xf7, 0x50, 0xc9, 0xea, 0x4e, 0x4e, 0x22, 0x30, 0xb2, 0xfa, 0xe3, 0x86, 0x14, 0x8a, 0x54, 0x0c, 0x88, 0xc6, 0xec, 0xb6, 0x3b, + 0x54, 0x01, 0xec, 0xa3, 0x85, 0x2b, 0x60, 0x07, 0x93, 0x56, 0xb2, 0x57, 0x79, 0xc6, 0xdc, 0xc7, 0xa6, 0xbe, 0x95, 0xd0, 0x6f, 0x69, 0x7b, 0x71, 0x59, 0xfa, 0x61, 0x93, 0xd8, 0xe5, 0xa4, 0x48, + 0x9a, 0xf2, 0xf1, 0x9e, 0xec, 0x93, 0xeb, 0xff, 0x57, 0xea, 0x2f, 0x40, 0x7c, 0xbd, 0x36, 0x56, 0x13, 0x10, 0x0d, 0x66, 0x2d, 0xe8, 0x9a, 0x9d, 0x85, 0x22, 0xca, 0x05, 0xca, 0x76, 0xae, 0x48, + 0x51, 0xba, 0x93, 0x65, 0x41, 0x61, 0xab, 0x32, 0x5c, 0x92, 0xe8, 0x8a, 0x5c, 0xa8, 0xe8, 0x61, 0xdf, 0x03, 0x52, 0x67, 0x9e, 0x62, 0x05, 0x01, 0xed, 0x7c, 0x97, 0x79, 0xa6, 0x8c, 0x4d, 0x61, + 0xfc, 0xb0, 0xe6, 0xd0, 0xc6, 0x5e, 0x84, 0x6b, 0x9e, 0xc8, 0xdc, 0xd4, 0x47, 0xf7, 0x54, 0x0f, 0x51, 0xa1, 0x85, 0x8e, 0x12, 0xde, 0xd5, 0xc4, 0x2e, 0xc3, 0xe6, 0x6b, 0x23, 0xb8, 0xaf, 0xb3, + 0xf5, 0x09, 0x41, 0xf5, 0x89, 0xf0, 0xb5, 0x9b, 0xf7, 0xfb, 0xe9, 0x65, 0xae, 0x8e, 0x10, 0x58, 0xe7, 0x6d, 0x04, 0x29, 0x69, 0x4d, 0x6e, 0x38, 0x1c, 0xab, 0x36, 0x43, 0xdb, 0xeb, 0xe9, 0x2e, + 0x5c, 0xc2, 0xf5, 0x80, 0xa6, 0xc2, 0x89, 0x98, 0x26, 0x0b, 0x1a, 0x4a, 0xd7, 0xe4, 0xda, 0xb4, 0xdc, 0x7c, 0x39, 0x08, 0xd2, 0xc0, 0x46, 0x38, 0x9f, 0x96, 0x66, 0x8a, 0x7a, 0x30, 0x79, 0xc4, + 0xa1, 0x8c, 0xf7, 0xcb, 0x19, 0x49, 0x53, 0x42, 0x4a, 0x1e, 0xcd, 0x86, 0x24, 0x86, 0x40, 0x9d, 0x67, 0xeb, 0xef, 0x96, 0x40, 0x75, 0xed, 0x1f, 0x1f, 0xff, 0xa0, 0xaa, 0x3c, 0x65, 0x00, 0x7d, + 0xd0, 0x7d, 0xfb, 0xfe, 0xeb, 0xd9, 0x25, 0xa0, 0x75, 0xc4, 0x24, 0x19, 0x06, 0x08, 0x57, 0xc9, 0x1a, 0xca, 0x87, 0x9c, 0xdd, 0x8b, 0x0b, 0xa0, 0x71, 0x7c, 0x04, 0x1f, 0xfc, 0x99, 0xb6, 0xd9, + 0xbb, 0xc2, 0x72, 0xbb, 0xb2, 0x56, 0x31, 0x19, 0x31, 0xe5, 0x7c, 0x1a, 0x7b, 0xb3, 0x75, 0x5a, 0x4d, 0x67, 0x0b, 0x4a, 0xae, 0x05, 0xe2, 0xc4, 0x24, 0xb0, 0x93, 0xc7, 0x98, 0xc4, 0x0e, 0xf3, + 0xe2, 0x50, 0x75, 0x0e, 0xb6, 0xda, 0xa6, 0xfc, 0xcc, 0x11, 0x8b, 0x83, 0x6d, 0x0e, 0x23, 0x79, 0xe2, 0xea, 0x59, 0xff, 0xa7, 0x19, 0xe2, 0x4a, 0xf5, 0x8a, 0xc6, 0xf5, 0x78, 0x2c, 0x2b, 0x0c, + 0x0c, 0x35, 0x2b, 0x1b, 0xd1, 0x4e, 0x0f, 0x7d, 0x4a, 0xc2, 0x31, 0xb2, 0xb2, 0x50, 0x5d, 0xcc, 0xb0, 0xe9, 0x56, 0x58, 0x54, 0xf2, 0x50, 0xad, 0xfc, 0x1c, 0x3f, 0xb7, 0x1b, 0x94, 0x5f, 0xad, + 0xa6, 0x33, 0xba, 0x92, 0x37, 0x0c, 0x1e, 0x2b, 0x4d, 0x5d, 0x20, 0x5a, 0x4e, 0x10, 0x52, 0x30, 0xdb, 0x34, 0xf9, 0xb9, 0x2a, 0xaa, 0x65, 0x34, 0xd8, 0xdb, 0x5c, 0x82, 0x87, 0x7e, 0xc6, 0x45, + 0x73, 0xe9, 0xb9, 0xed, 0xe3, 0xdb, 0xed, 0x8d, 0x1f, 0x6b, 0x76, 0x5c, 0x3e, 0x33, 0xb3, 0xcb, 0x7e, 0xf2, 0x43, 0xbc, 0xf0, 0x73, 0x5b, 0x69, 0xb7, 0xa4, 0xdf, 0x20, 0x7d, 0xbf, 0x30, 0x76, + 0x2b, 0xcd, 0x12, 0x39, 0xc5, 0xf4, 0x2b, 0xbc, 0x60, 0x7b, 0xaf, 0x6f, 0x16, 0xb1, 0x57, 0xf9, 0x84, 0x54, 0xf1, 0xe7, 0xda, 0x59, 0x12, 0x3b, 0xc3, 0xd7, 0xb9, 0x7c, 0x08, 0x15, 0x30, 0x24, + 0x4a, 0x0f, 0x3a, 0xeb, 0x71, 0x6a, 0x6e, 0x92, 0xd6, 0x52, 0x38, 0x50, 0x40, 0xc4, 0xd0, 0xd2, 0x0e, 0xbb, 0x9e, 0x40, 0xb0, 0x65, 0xe0, 0x27, 0x6b, 0xdf, 0x70, 0x39, 0x91, 0x22, 0xd2, 0xb4, + 0x56, 0x16, 0xfb, 0xe7, 0x2c, 0x90, 0xd7, 0x5f, 0xef, 0x9f, 0x6b, 0x3f, 0x7b, 0xc1, 0xe6, 0x8a, 0xee, 0x0f, 0x79, 0x6a, 0x2f, 0x5f, 0x9c, 0xe7, 0x89, 0x6f, 0x67, 0x1f, 0xad, 0xc6, 0xef, 0xb3, + 0xeb, 0x33, 0x91, 0x4b, 0xdf, 0xa8, 0xbf, 0x62, 0x7c, 0x73, 0x6d, 0x74, 0xb5, 0x19, 0xd6, 0xb4, 0x05, 0x7e, 0x95, 0x66, 0x87, 0xa9, 0xbd, 0x3b, 0xf7, 0x07, 0xdc, 0xe4, 0xfb, 0xbd, 0x51, 0x78, + 0xb2, 0xdd, 0xd5, 0xc6, 0x9a, 0xd7, 0x31, 0xd7, 0x01, 0xfc, 0xa1, 0xde, 0x2e, 0xdc, 0x21, 0xc0, 0xdd, 0x43, 0xa3, 0x79, 0x5d, 0xeb, 0x63, 0xd6, 0x92, 0x0b, 0xc2, 0xfd, 0x89, 0x9f, 0xfa, 0x18, + 0x41, 0x67, 0x30, 0x0b, 0xd3, 0x42, 0x40, 0xce, 0x2c, 0xf4, 0x68, 0x96, 0xb2, 0x72, 0x32, 0x9f, 0xd3, 0x3a, 0x7e, 0x89, 0x02, 0xfc, 0xbe, 0x45, 0xf1, 0x63, 0xdc, 0xd8, 0x6d, 0x56, 0xcd, 0x23, + 0xef, 0xd1, 0x53, 0xc2, 0xe2, 0x8d, 0xee, 0x15, 0xf7, 0xb7, 0xb3, 0x8b, 0x17, 0x69, 0x84, 0xc0, 0xc8, 0xaa, 0xa6, 0xab, 0xcf, 0x56, 0x20, 0xee, 0x71, 0x42, 0x2a, 0xfb, 0x84, 0x5a, 0xcf, 0x64, + 0xa0, 0x29, 0xb2, 0x19, 0x64, 0x41, 0x4c, 0x58, 0x74, 0x59, 0x5d, 0xa8, 0x24, 0x95, 0xc2, 0x3c, 0xa8, 0xad, 0xe7, 0xd0, 0xb0, 0x09, 0x86, 0x60, 0x2d, 0x1a, 0x20, 0xb5, 0xb3, 0x41, 0x5c, 0xb4, + 0xaa, 0x03, 0x64, 0xbb, 0x05, 0x77, 0xa0, 0x25, 0x48, 0x98, 0xc3, 0x67, 0x0d, 0xb7, 0xbc, 0x75, 0x42, 0x61, 0xdf, 0xb2, 0x01, 0x5e, 0x7e, 0x58, 0x5e, 0xfa, 0x1f, 0x66, 0xf3, 0x83, 0x09, 0xfe, + 0xe4, 0x0c, 0xff, 0x44, 0xfb, 0x15, 0x85, 0x8f, 0x0b, 0x13, 0x64, 0x64, 0x82, 0xba, 0xa2, 0x1c, 0xce, 0x49, 0xbb, 0x66, 0x8f, 0x2c, 0x6c, 0xae, 0x3a, 0xd6, 0x29, 0x73, 0x86, 0x17, 0x1d, 0xc0, + 0x6d, 0x8e, 0x4d, 0x79, 0x64, 0x77, 0x9b, 0x9e, 0x3f, 0x13, 0x2c, 0x9a, 0x6f, 0x18, 0xec, 0x4c, 0x95, 0x0e, 0x96, 0x87, 0xee, 0xb1, 0x12, 0x67, 0x58, 0xc7, 0xcf, 0x6c, 0xcf, 0xdd, 0xe7, 0x39, + 0x4e, 0x84, 0x46, 0x09, 0x02, 0xe8, 0x62, 0xde, 0xab, 0x11, 0x0a, 0xa3, 0xd3, 0x21, 0xc6, 0xcb, 0xe7, 0xa6, 0xf8, 0xad, 0x3a, 0xfb, 0x88, 0xa1, 0x3c, 0xbb, 0xf6, 0x7f, 0x9b, 0xd1, 0xcf, 0xec, + 0x1f, 0xdf, 0x92, 0xbe, 0x02, 0xfa, 0xe9, 0xc2, 0xd8, 0x5d, 0x64, 0x5d, 0x4d, 0x58, 0x0d, 0x43, 0xa6, 0x5d, 0x2e, 0x43, 0xa4, 0x9d, 0x5b, 0xf3, 0x21, 0x42, 0x41, 0x0b, 0x77, 0x23, 0xca, 0x04, + 0xb9, 0xdd, 0x9e, 0xe3, 0x65, 0x90, 0xb6, 0x95, 0x0d, 0xa4, 0x1e, 0x85, 0xd3, 0xb4, 0x46, 0x56, 0x1d, 0xa2, 0x20, 0x28, 0x4a, 0xd5, 0xea, 0x3e, 0xed, 0x1a, 0x23, 0x37, 0x89, 0xf5, 0x3a, 0x61, + 0x66, 0x8e, 0xb4, 0x4c, 0xce, 0x48, 0xda, 0x6f, 0xc1, 0x35, 0x36, 0x1c, 0xa1, 0x91, 0xcb, 0xb2, 0x7f, 0xae, 0x7f, 0x88, 0xbc, 0x7d, 0x2e, 0x15, 0xea, 0x83, 0xec, 0x15, 0x92, 0xd7, 0x93, 0x31, + 0xa9, 0x50, 0xf0, 0xe4, 0xb4, 0xec, 0x66, 0x3a, 0xec, 0x2b, 0xe4, 0x8c, 0xd0, 0x02, 0xde, 0x8e, 0x1a, 0xff, 0xb4, 0x77, 0xc9, 0x70, 0x00, 0xc4, 0xe5, 0xa8, 0x0f, 0x0a, 0x9a, 0x24, 0xb9, 0x34, + 0xfb, 0x9c, 0x5c, 0x2a, 0x62, 0x15, 0xf9, 0x63, 0xad, 0x03, 0x7d, 0xce, 0xb5, 0x72, 0xff, 0x1d, 0xd7, 0x4f, 0xbd, 0x77, 0xe7, 0x92, 0x2b, 0x3b, 0x62, 0x5a, 0x0d, 0x7d, 0x9a, 0x62, 0x40, 0x03, + 0x54, 0xb3, 0x4a, 0xdd, 0xf5, 0x2c, 0x75, 0xda, 0xd8, 0xfe, 0xc1, 0x40, 0xd9, 0x79, 0x1b, 0xcd, 0x04, 0x37, 0x11, 0xbc, 0x78, 0x30, 0xed, 0x95, 0xde, 0xf0, 0x34, 0x89, 0x2a, 0xeb, 0x83, 0x43, + 0x64, 0x6a, 0xb3, 0xc8, 0x3c, 0x6f, 0xc6, 0x2f, 0x5a, 0x28, 0x3a, 0x02, 0x82, 0x49, 0x30, 0x22, 0x9d, 0x54, 0x3b, 0x5f, 0x98, 0xea, 0x7e, 0x88, 0x73, 0x06, 0xbe, 0x97, 0x47, 0xb2, 0x41, 0xe8, + 0x67, 0x7e, 0x69, 0xd7, 0x79, 0x39, 0x79, 0x0b, 0xcc, 0xf8, 0xc9, 0x75, 0xfb, 0x14, 0x68, 0xdf, 0x5f, 0x71, 0x85, 0xec, 0xfb, 0xf5, 0xab, 0x0f, 0x77, 0x04, 0x62, 0x87, 0x8a, 0x3b, 0xf4, 0x54, + 0x82, 0xf6, 0xf1, 0x9e, 0x93, 0x81, 0x6d, 0xb5, 0xf7, 0x52, 0xa6, 0xe3, 0xb6, 0xae, 0x74, 0xb6, 0xf7, 0xbb, 0x75, 0x55, 0x08, 0x5e, 0x91, 0xcc, 0x75, 0x63, 0x49, 0xb5, 0x27, 0x38, 0xb6, 0xc2, + 0xa5, 0x7f, 0xf4, 0x67, 0xd0, 0x1a, 0xc6, 0x89, 0x93, 0xdf, 0x90, 0xb8, 0x3b, 0xc8, 0xf6, 0xd9, 0xf7, 0xd0, 0x13, 0xa8, 0x0f, 0x4d, 0x07, 0x55, 0xdd, 0x1a, 0x8a, 0xcb, 0x35, 0x39, 0x62, 0x3f, + 0xe4, 0xef, 0x2f, 0x69, 0x3f, 0xcc, 0xb1, 0xe7, 0x5a, 0x6a, 0xbd, 0xd2, 0x7c, 0x85, 0xf0, 0x65, 0x76, 0x8d, 0x6c, 0xa9, 0x85, 0x2d, 0xa0, 0x5a, 0xa8, 0x19, 0x6d, 0xbe, 0x4c, 0xa5, 0x13, 0x9b, + 0xad, 0x19, 0x24, 0x5a, 0xe0, 0x4c, 0x81, 0x9c, 0x5c, 0x81, 0x9b, 0x7b, 0x4d, 0x3e, 0xad, 0xad, 0x86, 0x12, 0x35, 0x90, 0xc7, 0x37, 0x72, 0x0b, 0x86, 0x51, 0xd4, 0xa3, 0x50, 0x8e, 0x61, 0x4d, + 0x60, 0x07, 0xe7, 0x15, 0xb8, 0xf6, 0x78, 0x82, 0x5a, 0xaf, 0x2b, 0x44, 0x08, 0xca, 0x8c, 0xc4, 0xb4, 0xb5, 0xd0, 0xd3, 0x04, 0xa3, 0x3f, 0xa7, 0xf7, 0xde, 0x88, 0x9f, 0xb7, 0xb2, 0xa2, 0x8f, + 0x10, 0xcc, 0xfc, 0xd0, 0xae, 0xe3, 0xd6, 0x9f, 0x0c, 0x7e, 0xf9, 0x68, 0x73, 0x1a, 0x79, 0x56, 0x8a, 0xdf, 0x10, 0xbf, 0x62, 0x7a, 0x73, 0xe9, 0xe2, 0x10, 0x1b, 0x21, 0xc9, 0xbd, 0xd3, 0xaa, + 0xb5, 0xcb, 0xb5, 0xdd, 0xed, 0xab, 0xb9, 0xb3, 0x61, 0xfd, 0xd5, 0x8e, 0x18, 0xe8, 0x81, 0x5c, 0xd6, 0x2b, 0xca, 0xf5, 0x10, 0xd2, 0x6c, 0x82, 0xa6, 0x99, 0x0f, 0x11, 0xb4, 0x20, 0x8b, 0x0d, + 0x7f, 0x58, 0x89, 0x99, 0x09, 0x91, 0x6c, 0x4b, 0x54, 0xe6, 0x1e, 0x69, 0xe6, 0x98, 0x5e, 0xc8, 0x52, 0x17, 0xfb, 0xb4, 0x2f, 0x71, 0x67, 0xce, 0xa4, 0x77, 0xbb, 0xa0, 0x21, 0x2c, 0x4b, 0x1f, + 0x13, 0x47, 0xf6, 0xf2, 0x83, 0x9b, 0xd4, 0x79, 0xd8, 0x83, 0x98, 0x78, 0x56, 0xd4, 0x5d, 0xa9, 0xbe, 0x42, 0x72, 0x39, 0xbe, 0x14, 0x0d, 0x19, 0x31, 0x39, 0xa7, 0xf0, 0x2c, 0x0e, 0x8e, 0x21, + 0xee, 0x93, 0x5a, 0x9f, 0xa8, 0x85, 0x57, 0x6b, 0x85, 0xbf, 0x36, 0xc4, 0x53, 0xab, 0x32, 0x9c, 0x31, 0x68, 0x75, 0xcd, 0xb7, 0x9c, 0xc2, 0x12, 0x53, 0x18, 0x28, 0x32, 0x8b, 0xa4, 0x37, 0x2d, + 0x04, 0x41, 0x53, 0x51, 0x59, 0x4f, 0x51, 0x59, 0xd8, 0xb2, 0x89, 0x40, 0xb9, 0x8b, 0x76, 0x53, 0xe0, 0x1b, 0x6b, 0x67, 0xe9, 0x4c, 0xe2, 0x2c, 0xf6, 0xe6, 0xf9, 0x9c, 0x8d, 0x14, 0x67, 0xaf, + 0xbf, 0xf4, 0xd7, 0x25, 0x9f, 0x78, 0x1e, 0x92, 0x9b, 0x45, 0xff, 0xe6, 0xd2, 0x45, 0x7c, 0x11, 0xbf, 0x03, 0x74, 0x84, 0x75, 0x68, 0xa9, 0x0c, 0x6b, 0x31, 0x27, 0xac, 0xc4, 0x5c, 0x06, 0x83, + 0xd2, 0x20, 0xa8, 0x14, 0xe1, 0x62, 0xbc, 0x9c, 0xdb, 0x55, 0x58, 0x38, 0xd4, 0x9e, 0xc0, 0xfd, 0x53, 0x30, 0xb7, 0xe8, 0x53, 0xc7, 0x4f, 0xa7, 0xfa, 0x72, 0x2a, 0x68, 0x4c, 0xcb, 0x98, 0x4b, + 0x0b, 0xf6, 0xd4, 0x35, 0x65, 0x0d, 0xb3, 0x48, 0x63, 0x28, 0x35, 0xe2, 0x83, 0xf5, 0x51, 0x99, 0x16, 0xde, 0x0e, 0x3b, 0x96, 0xcf, 0xc5, 0xd1, 0xff, 0x7d, 0x81, 0x56, 0x24, 0x76, 0x7c, 0xb1, + 0x59, 0x7e, 0x30, 0x91, 0x9e, 0x62, 0xb8, 0x77, 0xc2, 0x57, 0x64, 0xdf, 0x4f, 0x2f, 0x86, 0xd1, 0x08, 0xb6, 0xeb, 0xdb, 0xa3, 0xd2, 0x9f, 0xd3, 0xb9, 0xc0, 0x49, 0xf2, 0xb4, 0xd8, 0xec, 0x67, + 0xe9, 0x6a, 0x81, 0xd1, 0x9c, 0xbc, 0x49, 0xf6, 0x2b, 0x15, 0x5b, 0xdb, 0xd2, 0x66, 0x9f, 0x63, 0xa0, 0xbb, 0xf6, 0x34, 0xcb, 0xdb, 0xb5, 0x95, 0x05, 0xc7, 0xf9, 0x8a, 0xcb, 0xb3, 0xf5, 0x82, + 0xce, 0x2b, 0x21, 0x11, 0x77, 0x1c, 0x99, 0x74, 0x7a, 0x0f, 0x3a, 0xab, 0x41, 0x3c, 0xb8, 0x1d, 0x69, 0x0f, 0x04, 0x0a, 0xcc, 0x47, 0xb2, 0xdd, 0xa5, 0x1a, 0xca, 0x0f, 0xec, 0xf6, 0xf7, 0xcb, + 0xb7, 0xbf, 0x11, 0xbd, 0x82, 0x71, 0xad, 0x7c, 0x73, 0xa1, 0xf4, 0x3b, 0x10, 0x6d, 0x22, 0xec, 0x60, 0x42, 0xdd, 0x9c, 0xa6, 0xd3, 0xbc, 0x6b, 0x31, 0x5a, 0x56, 0xd0, 0xd9, 0x09, 0x72, 0xe4, + 0x2d, 0xe7, 0x90, 0xc0, 0x71, 0x8e, 0xea, 0x82, 0x85, 0x04, 0xb1, 0xb5, 0x91, 0x76, 0xf5, 0x50, 0x9b, 0x1c, 0x16, 0x43, 0xb3, 0x61, 0x66, 0x9d, 0xe7, 0x6c, 0x27, 0x61, 0xe4, 0x89, 0x96, 0x76, + 0xf5, 0xd9, 0x63, 0x14, 0x43, 0x02, 0x0d, 0x4c, 0x8e, 0x33, 0xb8, 0x3b, 0xcc, 0x4e, 0x73, 0xf3, 0x69, 0xf6, 0xfa, 0xf3, 0x77, 0x2d, 0xbd, 0x8a, 0xec, 0xd2, 0xf7, 0xae, 0x4e, 0xad, 0x8f, 0x60, + 0x83, 0x7f, 0x54, 0x5b, 0xbf, 0xf3, 0x8a, 0x2b, 0xb2, 0x77, 0x6e, 0x8c, 0xd5, 0xde, 0xab, 0xd3, 0x06, 0xd1, 0xd9, 0x06, 0x06, 0xa1, 0x1e, 0x6f, 0xda, 0x7d, 0xaf, 0xd6, 0x33, 0x69, 0xe8, 0x23, + 0xfa, 0x30, 0x53, 0x13, 0xde, 0xf5, 0xe7, 0xb9, 0x28, 0xac, 0x76, 0xe4, 0x8e, 0xe2, 0x74, 0xca, 0x6d, 0x63, 0x17, 0x94, 0xbd, 0xca, 0x82, 0x8e, 0x9c, 0x4e, 0xa1, 0x3c, 0xd7, 0xa3, 0x4b, 0x9d, + 0x9b, 0x5b, 0xcb, 0x98, 0x07, 0xd1, 0x0e, 0xa0, 0x79, 0x50, 0x97, 0x9d, 0x2d, 0xbf, 0xf1, 0xa2, 0x7f, 0xce, 0x12, 0x7f, 0x88, 0xf6, 0xcf, 0xc5, 0x74, 0x9f, 0x94, 0x8d, 0x1f, 0x1b, 0x8e, 0x6f, + 0xc7, 0x63, 0xa5, 0x61, 0xcd, 0x21, 0xfa, 0x7e, 0x88, 0xdb, 0x83, 0x8f, 0xe7, 0xc1, 0x76, 0x47, 0x24, 0x08, 0xea, 0x1e, 0x58, 0x49, 0xb4, 0x21, 0x2a, 0x74, 0x88, 0x73, 0x42, 0x9f, 0x16, 0xf8, + 0x61, 0x81, 0xf9, 0x07, 0xbc, 0xd9, 0x1a, 0x28, 0xa2, 0x25, 0xbb, 0x2d, 0xba, 0x11, 0xb6, 0x71, 0x58, 0xdb, 0x0b, 0x9f, 0xdf, 0x34, 0x54, 0x90, 0x47, 0xae, 0xab, 0x98, 0xed, 0x32, 0xb6, 0xc4, + 0x40, 0x92, 0x32, 0xc9, 0xd4, 0xeb, 0xe7, 0xf4, 0x92, 0xbf, 0x2f, 0x0d, 0xaf, 0x51, 0x86, 0x3f, 0x80, 0xf9, 0xc4, 0xde, 0xd4, 0x1b, 0xd5, 0x57, 0x30, 0xaf, 0xf9, 0xa2, 0x63, 0xf7, 0xa4, 0xba, + 0xf8, 0x10, 0xd9, 0x8a, 0x1a, 0x9e, 0xda, 0x28, 0x05, 0x21, 0xcb, 0xa3, 0xdd, 0xfd, 0xc6, 0xaa, 0xa9, 0xc4, 0xf4, 0x84, 0x79, 0xe1, 0x2a, 0xac, 0x86, 0xe9, 0x6b, 0xbd, 0x31, 0xf7, 0xdb, 0x5c, + 0x23, 0xa8, 0xa9, 0xbe, 0x91, 0x3c, 0x1d, 0x08, 0x0b, 0x0d, 0x57, 0x86, 0x9c, 0x70, 0xa6, 0x06, 0xc2, 0xeb, 0x09, 0x98, 0x17, 0xf8, 0xe2, 0x64, 0x92, 0xd4, 0x94, 0xb6, 0xba, 0x96, 0x0a, 0xec, + 0xa7, 0xe7, 0xfe, 0xb7, 0x20, 0xcc, 0xc7, 0x5a, 0x5e, 0xdd, 0x17, 0x6f, 0xd3, 0xf0, 0x87, 0x85, 0xe5, 0x39, 0x03, 0xe4, 0x13, 0xed, 0x2b, 0xa6, 0x9f, 0x2e, 0x5c, 0x13, 0xe3, 0x47, 0x2c, 0x2f, + 0xdb, 0xd5, 0x29, 0xe4, 0xf8, 0x78, 0x67, 0xb5, 0x62, 0x61, 0xcf, 0x2d, 0xb4, 0xd1, 0x5c, 0xf2, 0xc8, 0x6f, 0xc5, 0x29, 0x30, 0xa5, 0x59, 0x2d, 0x61, 0xb3, 0xb8, 0x91, 0xd7, 0x84, 0xab, 0x83, + 0x3a, 0x4b, 0x43, 0x72, 0x42, 0xcc, 0x09, 0xa8, 0x5f, 0x04, 0x7c, 0x11, 0xa1, 0xee, 0x7a, 0xe3, 0x03, 0x2e, 0x55, 0xe7, 0x76, 0x1c, 0xb6, 0x00, 0x3b, 0x1f, 0xb4, 0x95, 0x10, 0xb9, 0xc8, 0xac, + 0x96, 0xf0, 0x11, 0x26, 0x87, 0xdd, 0xda, 0xf1, 0xd5, 0x5d, 0xf5, 0xe9, 0x57, 0x7f, 0x20, 0xfa, 0xb1, 0xb2, 0xfc, 0xee, 0x90, 0xfb, 0x54, 0xbf, 0xe7, 0xcf, 0xff, 0x7d, 0x5b, 0xad, 0xe7, 0x23, + 0xab, 0xe5, 0x6d, 0xa0, 0xfe, 0xeb, 0xdf, 0x99, 0x16, 0x4d, 0x16, 0x5f, 0xcc, 0xe0, 0xaa, 0x29, 0x8a, 0xbc, 0x7c, 0x5c, 0x39, 0x09, 0x7a, 0x56, 0x59, 0xf8, 0xf6, 0x82, 0xeb, 0xc0, 0x7e, 0xbb, + 0x7c, 0x89, 0xe5, 0x18, 0x31, 0xba, 0xc7, 0xec, 0xbc, 0x40, 0x4e, 0x53, 0x7d, 0x86, 0x36, 0x64, 0x55, 0x2b, 0x8b, 0x9e, 0x36, 0x56, 0x33, 0xc9, 0x3b, 0xcf, 0xd3, 0x16, 0x63, 0xad, 0x58, 0x71, + 0xbd, 0x64, 0x69, 0xd3, 0xf2, 0x9e, 0x76, 0xd4, 0x60, 0xd5, 0xdb, 0x80, 0x14, 0xe5, 0xc5, 0x26, 0xaf, 0xd7, 0x72, 0x59, 0xd5, 0x4c, 0x74, 0x6a, 0x4e, 0xcd, 0xd4, 0x2a, 0x1a, 0xc1, 0x61, 0x5d, + 0x90, 0x54, 0xf1, 0x34, 0xdc, 0x87, 0xdb, 0xf9, 0x76, 0x4c, 0x37, 0x8b, 0xb8, 0x9a, 0x74, 0xbe, 0x7d, 0x2c, 0xfd, 0xc7, 0x9d, 0x70, 0x9e, 0x5c, 0xf2, 0x5e, 0xc9, 0x5e, 0x81, 0x79, 0x3d, 0x19, + 0xbb, 0xb4, 0x9d, 0xdc, 0xba, 0x6a, 0xd6, 0x56, 0xba, 0x94, 0x21, 0xa0, 0x55, 0x55, 0x31, 0xc8, 0x8d, 0xb6, 0x9f, 0xfb, 0x08, 0xb0, 0x50, 0xb9, 0x36, 0x4b, 0x2d, 0xc4, 0x1f, 0xb4, 0xa6, 0x80, + 0x55, 0xa6, 0xf2, 0x29, 0xa0, 0xee, 0x66, 0x33, 0x3f, 0xb6, 0x13, 0x9c, 0xe3, 0x62, 0x74, 0xe3, 0x22, 0xc2, 0xdc, 0x0d, 0x70, 0xe0, 0x34, 0x20, 0x73, 0x66, 0x9b, 0x1d, 0xf6, 0xd5, 0x91, 0x3c, + 0x47, 0x82, 0x6a, 0x3f, 0x8a, 0xea, 0xff, 0xe7, 0x96, 0x36, 0xff, 0xfc, 0xd8, 0x6f, 0xfa, 0x9c, 0x15, 0xe4, 0x9f, 0xaf, 0xde, 0x52, 0xff, 0xec, 0x8f, 0x89, 0xad, 0x85, 0x27, 0xf8, 0xb6, 0x1d, + 0xbc, 0xcd, 0xd9, 0x70, 0xc0, 0x58, 0xf7, 0x23, 0xd6, 0xad, 0xe6, 0x6e, 0x6d, 0x0e, 0x64, 0x05, 0x44, 0xf4, 0xef, 0xbc, 0x70, 0x78, 0x99, 0x66, 0x47, 0x3f, 0x7b, 0xb4, 0x7b, 0xfa, 0x5c, 0x44, + 0xd0, 0x3b, 0xd5, 0x6b, 0xfb, 0xb6, 0xeb, 0xf1, 0xd8, 0x48, 0x20, 0xc5, 0x5b, 0xe9, 0x41, 0xe2, 0x72, 0xa8, 0xab, 0x0f, 0x42, 0x2c, 0x9e, 0xe4, 0xb0, 0x9a, 0x35, 0x10, 0x3e, 0xdf, 0x36, 0x94, + 0xee, 0x2d, 0x57, 0x12, 0xe4, 0xf8, 0xa6, 0xb3, 0x8d, 0xf8, 0xcd, 0xf4, 0x88, 0xdb, 0x45, 0xb8, 0xaa, 0xe3, 0xc0, 0xcd, 0x67, 0xb5, 0x46, 0x39, 0xee, 0x59, 0x2a, 0x4c, 0xa6, 0x2e, 0x58, 0xe4, + 0x38, 0x13, 0x71, 0xd5, 0x19, 0xc2, 0xe9, 0xcc, 0x6e, 0xaa, 0x1d, 0xb8, 0x15, 0xc6, 0xa4, 0x77, 0x7c, 0x6f, 0x67, 0x77, 0xeb, 0xc0, 0x83, 0xa7, 0x4f, 0xf8, 0x4e, 0xbe, 0xf7, 0xb1, 0xbb, 0x12, + 0xfa, 0x1d, 0x87, 0xfc, 0x28, 0xf2, 0x84, 0xb4, 0xdf, 0xaf, 0x08, 0xb3, 0xdc, 0x50, 0xd2, 0x11, 0x05, 0xd5, 0x7d, 0x99, 0x35, 0xd3, 0x78, 0x4f, 0xf5, 0xd2, 0x11, 0x40, 0xb0, 0xec, 0xb4, 0x9f, + 0xc6, 0xa9, 0x8a, 0x64, 0x45, 0xd3, 0x6a, 0x26, 0x9b, 0xe6, 0xa0, 0xcc, 0x59, 0xf9, 0xa9, 0xb3, 0x8e, 0xa6, 0xbd, 0x64, 0x8f, 0xe8, 0xc1, 0x68, 0x19, 0x49, 0x93, 0x96, 0x5c, 0xc8, 0x45, 0xf6, + 0x5a, 0xea, 0x33, 0x46, 0xa5, 0x9e, 0x53, 0x52, 0x6e, 0xfa, 0xd9, 0xc1, 0x5f, 0xab, 0x3d, 0x7f, 0x74, 0x71, 0xff, 0x31, 0xa8, 0xee, 0x52, 0x1d, 0xf7, 0xd7, 0x9d, 0xd9, 0x67, 0x98, 0xed, 0x9d, + 0xee, 0x5b, 0x73, 0x8d, 0x4f, 0xbb, 0xb3, 0x23, 0x18, 0x4e, 0x8d, 0xb7, 0x2d, 0x48, 0x1a, 0x85, 0xd5, 0xec, 0x9c, 0x76, 0xad, 0x8a, 0xb5, 0xc6, 0xea, 0x64, 0xc4, 0x05, 0xa5, 0xb5, 0x0b, 0xc1, + 0x94, 0x07, 0x33, 0x03, 0x74, 0xa6, 0x39, 0x34, 0x33, 0x1d, 0xf5, 0xdc, 0xc0, 0xfa, 0x52, 0xde, 0xae, 0xbd, 0x4e, 0x90, 0x66, 0xcb, 0x7e, 0x2d, 0xef, 0x01, 0x63, 0xb9, 0x95, 0xb0, 0xb6, 0x5c, + 0xef, 0xd1, 0x98, 0x3c, 0xd5, 0xa7, 0x79, 0x1f, 0x79, 0x5b, 0x55, 0x1f, 0x13, 0x9a, 0xee, 0xc4, 0xe1, 0xd5, 0x96, 0xff, 0xeb, 0xb5, 0x7f, 0x09, 0xf5, 0x0b, 0x78, 0xd7, 0x46, 0x7c, 0x7e, 0xeb, + 0x67, 0x13, 0xc7, 0xaf, 0x6b, 0xbf, 0xfc, 0x2d, 0xd2, 0x1f, 0x7d, 0x8a, 0x61, 0x7f, 0x78, 0xd3, 0x1b, 0xc0, 0x8f, 0xee, 0x5f, 0x6a, 0x24, 0x8d, 0xe0, 0xed, 0x73, 0x3f, 0xef, 0xfa, 0xa8, 0xcc, + 0xc1, 0x15, 0x97, 0x07, 0xf8, 0x22, 0xf2, 0x91, 0x78, 0x40, 0x36, 0xee, 0x3e, 0x3f, 0x20, 0x55, 0x92, 0x6f, 0xaa, 0x5d, 0x09, 0xee, 0x2b, 0x4e, 0x61, 0x05, 0x30, 0x8f, 0xb7, 0xb3, 0xc0, 0xde, + 0x44, 0x09, 0x26, 0x6d, 0x82, 0x02, 0x38, 0xc8, 0x1e, 0x6d, 0x29, 0xb2, 0x0c, 0x2d, 0x57, 0xbb, 0xcd, 0xc0, 0x53, 0xc3, 0xd2, 0x9a, 0x13, 0x49, 0x4c, 0xc1, 0xc7, 0x08, 0x19, 0xb3, 0xf6, 0xfd, + 0xd2, 0xfb, 0xe5, 0x56, 0x51, 0x78, 0x6e, 0xbe, 0x8f, 0xef, 0xf9, 0x72, 0x79, 0xc3, 0x08, 0xb0, 0x1c, 0x67, 0xc6, 0x63, 0xde, 0xcc, 0xd4, 0x31, 0x8d, 0x5c, 0xbb, 0x5c, 0x14, 0x35, 0x11, 0xc1, + 0xaf, 0x48, 0x92, 0xdf, 0x37, 0x3b, 0xf4, 0x54, 0x2d, 0x51, 0x13, 0x1a, 0x24, 0x6b, 0x2e, 0x04, 0x16, 0xc7, 0xbb, 0xc5, 0x2e, 0xe6, 0x75, 0x70, 0x75, 0x1e, 0x8e, 0x38, 0x42, 0x31, 0x65, 0x65, + 0x3b, 0x60, 0x2a, 0xc6, 0xbc, 0x5c, 0xc7, 0x54, 0x27, 0x6e, 0x01, 0x72, 0x8a, 0x29, 0x5b, 0x1f, 0x35, 0xc6, 0x78, 0x19, 0xee, 0x37, 0xeb, 0xea, 0xe2, 0x3a, 0xca, 0x9b, 0x6b, 0xbd, 0xfa, 0xc7, + 0x3d, 0x0b, 0xe0, 0xa7, 0x3c, 0xcd, 0xa3, 0xde, 0xf8, 0x0e, 0xe7, 0x2f, 0xcf, 0x8d, 0x0b, 0xcf, 0xce, 0x1c, 0x1f, 0x4e, 0x56, 0x76, 0xbd, 0x1d, 0x06, 0x80, 0xec, 0x0a, 0x78, 0x3e, 0x83, 0xea, + 0x63, 0x57, 0xee, 0x57, 0x09, 0xf7, 0x3b, 0x42, 0xc7, 0x38, 0xf3, 0x26, 0xf9, 0x23, 0x3d, 0x0a, 0x7f, 0xca, 0x18, 0x7b, 0xa5, 0x09, 0x4e, 0xde, 0x8e, 0x2e, 0x45, 0xa8, 0x47, 0x18, 0x62, 0x9e, + 0xab, 0xc2, 0x4d, 0x02, 0x50, 0x75, 0xea, 0xb3, 0x14, 0xa6, 0x01, 0x67, 0x84, 0x04, 0xfd, 0x68, 0x1d, 0x7a, 0x54, 0xca, 0x6d, 0x6c, 0x74, 0x5d, 0xb5, 0xac, 0x56, 0x0f, 0x29, 0xda, 0xf6, 0x0c, + 0x27, 0x11, 0xca, 0xb6, 0xa8, 0x5b, 0x9a, 0x05, 0xea, 0xe9, 0x74, 0x67, 0xec, 0x6d, 0xfd, 0xa0, 0x31, 0x8a, 0x5b, 0x16, 0x73, 0x7f, 0x9e, 0xcc, 0xc8, 0xdd, 0xac, 0x6c, 0x74, 0x65, 0x8a, 0xe1, + 0xd1, 0x98, 0x49, 0x95, 0xf8, 0xed, 0xa3, 0x2d, 0x9c, 0xe7, 0x26, 0xd1, 0x0b, 0x41, 0x70, 0x72, 0xf9, 0x6f, 0xec, 0x24, 0x01, 0x1c, 0x0d, 0x69, 0xf8, 0x29, 0x87, 0xad, 0x17, 0x1c, 0x11, 0x81, + 0x19, 0xea, 0xb7, 0xae, 0x0a, 0x56, 0x72, 0xb2, 0xda, 0xcf, 0x8a, 0x65, 0x81, 0xf7, 0x29, 0x29, 0xed, 0x56, 0x98, 0x6f, 0xe0, 0x00, 0x4e, 0xb0, 0xd5, 0x29, 0x01, 0xd7, 0xb6, 0xad, 0x11, 0xa7, + 0x15, 0x43, 0xd7, 0x48, 0x39, 0x04, 0xb9, 0x0d, 0x62, 0x32, 0xb3, 0x60, 0xa2, 0x33, 0x1b, 0x9f, 0x61, 0x4f, 0xac, 0x91, 0xa3, 0xfc, 0x48, 0x6b, 0xf8, 0x45, 0xae, 0x17, 0xa5, 0x9f, 0x34, 0x9e, + 0x3f, 0x79, 0x37, 0x42, 0xbf, 0xb4, 0x86, 0xb8, 0x54, 0xe7, 0x70, 0x23, 0xdf, 0xbd, 0xb4, 0x0c, 0xfc, 0x17, 0xf4, 0xb8, 0x4c, 0xfc, 0x9d, 0x6e, 0x0e, 0xf7, 0x40, 0xc6, 0x6e, 0xbb, 0xa8, 0x8d, + 0x46, 0xf9, 0x0b, 0xf5, 0x17, 0xc4, 0xbf, 0x5c, 0x9a, 0x5c, 0x49, 0xff, 0x0e, 0xbf, 0xa5, 0x23, 0x2c, 0xb5, 0x48, 0x69, 0x57, 0xd2, 0xdd, 0x26, 0xd1, 0x34, 0x8f, 0xa7, 0xc0, 0xa1, 0xec, 0xfd, + 0x03, 0x9e, 0x91, 0xda, 0xa0, 0x01, 0xc1, 0x66, 0xe1, 0x6d, 0xea, 0x14, 0x57, 0xd9, 0x02, 0x13, 0x45, 0xb1, 0xe0, 0xcb, 0xd5, 0xea, 0xd8, 0xfe, 0xbf, 0xb4, 0xbd, 0x47, 0x93, 0xe2, 0x4a, 0xd7, + 0x2e, 0x3a, 0x3f, 0xbf, 0x62, 0xc7, 0x9e, 0xea, 0xb2, 0xe5, 0x0d, 0x67, 0xf4, 0x81, 0x04, 0x02, 0x24, 0xe4, 0x40, 0xc8, 0x0c, 0xde, 0x1b, 0xb2, 0xc8, 0x7b, 0x1f, 0x27, 0xde, 0xdf, 0x7e, 0x03, + 0xa8, 0xaa, 0x2e, 0x47, 0x17, 0xcd, 0xd9, 0x77, 0xd2, 0x25, 0xd7, 0x4b, 0xe4, 0x93, 0xa9, 0xcc, 0x95, 0xcb, 0x3c, 0x6b, 0xe1, 0xae, 0x50, 0x87, 0x70, 0x29, 0x17, 0x71, 0x82, 0xd5, 0x3c, 0x04, + 0x2c, 0x10, 0x74, 0x0f, 0x73, 0x5a, 0x33, 0x9b, 0xb0, 0x8e, 0xb3, 0xf2, 0x81, 0xad, 0xaa, 0x93, 0xe7, 0x71, 0x78, 0xd3, 0x4b, 0xa0, 0xcf, 0x85, 0x22, 0xbe, 0x2f, 0x65, 0xf1, 0x29, 0x2d, 0xa0, + 0xf6, 0x9a, 0xd9, 0x4d, 0xc8, 0x6d, 0x51, 0x7b, 0xad, 0x68, 0x81, 0xdd, 0x33, 0x1c, 0x24, 0x61, 0xe6, 0xd5, 0x33, 0x2b, 0x73, 0x67, 0x4e, 0x9e, 0xb4, 0xe9, 0x5d, 0xcd, 0xf9, 0xb9, 0xc8, 0x91, + 0x2f, 0xd2, 0xaf, 0x9d, 0xf2, 0xe9, 0xda, 0xa3, 0x51, 0x24, 0xe4, 0x98, 0x8c, 0x89, 0x57, 0x9b, 0x32, 0x28, 0x9d, 0x90, 0x79, 0x14, 0xac, 0x98, 0x04, 0x55, 0xfd, 0x28, 0x27, 0x4c, 0x9d, 0x3c, + 0xd3, 0xe5, 0xae, 0xc2, 0xd7, 0xa4, 0xc4, 0x55, 0xa5, 0x33, 0x47, 0x3b, 0xd2, 0x9f, 0x0e, 0x63, 0xda, 0xc0, 0xcb, 0xa2, 0x5f, 0xa9, 0x54, 0xb6, 0x50, 0xf5, 0x9a, 0x2a, 0xa7, 0xa9, 0x2b, 0x03, + 0x3b, 0x0a, 0x38, 0x5c, 0x36, 0xcf, 0xc4, 0xbe, 0x01, 0x37, 0xf1, 0x3d, 0x56, 0xfa, 0x8f, 0x18, 0x7d, 0xe0, 0x9a, 0xfe, 0x7e, 0xc8, 0x3e, 0x35, 0x62, 0x7f, 0xc9, 0xbd, 0xe0, 0xf2, 0xeb, 0xec, + 0x5a, 0x92, 0xff, 0x81, 0x61, 0xda, 0x90, 0x41, 0x3f, 0x2f, 0xb6, 0x80, 0xd6, 0xb5, 0xbd, 0xb0, 0xd3, 0xfb, 0x18, 0x9f, 0x4e, 0x9b, 0x62, 0x0c, 0xb6, 0xe5, 0x74, 0x46, 0xca, 0x63, 0x12, 0x27, + 0x3b, 0xd1, 0x87, 0xd2, 0xd3, 0xc0, 0x1e, 0x6c, 0x0f, 0x5d, 0x17, 0xc8, 0x29, 0xf4, 0x4c, 0xc7, 0x6d, 0x05, 0x23, 0xb2, 0x78, 0x26, 0x1f, 0x89, 0x62, 0xde, 0xb2, 0x85, 0xbc, 0x62, 0x35, 0x96, + 0x22, 0xb5, 0x62, 0xcf, 0x25, 0x42, 0x49, 0x3d, 0xa7, 0x53, 0x17, 0xb3, 0xdb, 0xef, 0xff, 0xfb, 0x7f, 0xbf, 0xd5, 0x42, 0xff, 0x7e, 0xbc, 0xe5, 0xee, 0xfd, 0x34, 0x14, 0xec, 0x1f, 0x98, 0xfc, + 0x07, 0x79, 0x62, 0x82, 0xbd, 0x0a, 0xbd, 0x62, 0x78, 0x39, 0x98, 0xbd, 0xc8, 0xf9, 0x19, 0xc0, 0x0e, 0x89, 0x99, 0x95, 0x87, 0x93, 0x89, 0xe7, 0x1c, 0xdb, 0xc4, 0x62, 0xb6, 0xad, 0x70, 0x94, + 0x46, 0x54, 0x19, 0xb1, 0x33, 0xcf, 0xee, 0x08, 0x13, 0x16, 0xd1, 0x6e, 0x05, 0xc7, 0xd5, 0x59, 0x37, 0x85, 0xaa, 0x96, 0x01, 0x7e, 0x7d, 0x64, 0x37, 0xa7, 0xe1, 0x14, 0x39, 0xba, 0x54, 0xc3, + 0x24, 0x1f, 0xd8, 0xe6, 0x89, 0xf5, 0xdc, 0xc5, 0xae, 0xa3, 0x74, 0x13, 0x6e, 0xba, 0x08, 0x5f, 0x77, 0x87, 0xc7, 0x86, 0xd4, 0xe5, 0x87, 0xfe, 0xe3, 0x24, 0x79, 0xe6, 0xb9, 0x9e, 0x77, 0x9f, + 0xdf, 0xfd, 0x99, 0x72, 0x2e, 0x9f, 0x85, 0xbf, 0x01, 0xf3, 0xeb, 0xd2, 0x23, 0x25, 0x5d, 0xe0, 0x19, 0x16, 0x51, 0x60, 0xb6, 0x02, 0xa4, 0xce, 0x25, 0x36, 0xbb, 0x43, 0xb6, 0x5c, 0x0e, 0x81, + 0x9e, 0x6f, 0xed, 0x64, 0x12, 0x1f, 0x20, 0x32, 0x7d, 0x79, 0x65, 0x53, 0xb5, 0xd9, 0xcb, 0xc0, 0xf8, 0xbe, 0x85, 0xd8, 0x13, 0xc6, 0x99, 0x4f, 0xb2, 0x7f, 0x35, 0xf0, 0xf5, 0xca, 0xec, 0x2a, + 0xf7, 0xa7, 0xf6, 0x69, 0x91, 0x2a, 0xe4, 0xfc, 0x4a, 0x11, 0x31, 0x01, 0x98, 0x40, 0xf0, 0x74, 0x3e, 0x8c, 0x80, 0x26, 0xd8, 0x25, 0x66, 0xee, 0x1f, 0x69, 0xdf, 0xf9, 0x07, 0xfa, 0x84, 0xe7, + 0x12, 0xbe, 0xdf, 0xc9, 0xbd, 0xb6, 0xeb, 0xed, 0xec, 0xd1, 0x44, 0x6f, 0x4a, 0x97, 0xba, 0x62, 0xb1, 0xa0, 0xda, 0x31, 0xf0, 0x1b, 0xaf, 0xa5, 0x8a, 0x6d, 0x27, 0x0f, 0xc5, 0xce, 0x24, 0x0f, + 0x86, 0xe1, 0x16, 0x6a, 0xd8, 0x99, 0x05, 0x3b, 0x12, 0xf5, 0xba, 0x5e, 0xb6, 0x9c, 0x62, 0x80, 0x64, 0x25, 0xb3, 0x56, 0xe7, 0xb9, 0xde, 0x92, 0xb2, 0x38, 0xc0, 0x8c, 0xc7, 0x92, 0x68, 0x8b, + 0xfd, 0xfa, 0xc4, 0x83, 0xf3, 0x85, 0x46, 0x74, 0xa2, 0x31, 0xf9, 0xca, 0xc8, 0x3f, 0x37, 0x2b, 0x38, 0xc1, 0x6b, 0x25, 0xe1, 0xcf, 0xa5, 0xf3, 0xef, 0xd9, 0x38, 0x2f, 0x0b, 0xdf, 0x6f, 0x26, + 0x8f, 0xbc, 0xb0, 0xbd, 0xec, 0x2e, 0x7f, 0xfa, 0x73, 0x35, 0xaf, 0xdf, 0xa4, 0x5e, 0xe1, 0x7e, 0x39, 0x7e, 0xb4, 0xe6, 0xb5, 0xdf, 0x20, 0x52, 0xda, 0x9a, 0x19, 0xd3, 0x03, 0xcc, 0x4e, 0xf6, + 0x8f, 0x78, 0x5a, 0xac, 0xb4, 0xd6, 0x5d, 0x2d, 0x95, 0x29, 0x29, 0xb6, 0x69, 0x40, 0xa6, 0x2a, 0x29, 0x3a, 0x12, 0x9b, 0x7a, 0x7e, 0xcd, 0x25, 0x1a, 0x45, 0xc7, 0x90, 0x4a, 0x64, 0x15, 0x4d, + 0xbb, 0x4e, 0x6f, 0xac, 0x81, 0x69, 0x3e, 0x39, 0xd0, 0xe1, 0xb4, 0x9c, 0x58, 0x73, 0x01, 0xaf, 0xe1, 0xb3, 0xea, 0x6f, 0xcc, 0x76, 0xf7, 0x00, 0x09, 0xcc, 0xd0, 0x78, 0x2f, 0x06, 0xbd, 0xdf, + 0xb0, 0xdf, 0xbd, 0xcf, 0xb3, 0xbf, 0xa7, 0xd1, 0x3f, 0x81, 0xd7, 0xab, 0xd4, 0x0b, 0x5e, 0xaf, 0xc7, 0x57, 0xad, 0xfe, 0x01, 0xbc, 0x76, 0x39, 0xe1, 0xee, 0x20, 0x8c, 0x4e, 0x0f, 0x51, 0x3b, + 0x65, 0xfd, 0xee, 0x70, 0x40, 0x0b, 0xd5, 0xd3, 0x52, 0x17, 0xdc, 0x40, 0xbe, 0x7f, 0x4c, 0x62, 0x5d, 0x3f, 0xf7, 0x66, 0x08, 0x78, 0x25, 0xac, 0xd2, 0x69, 0x29, 0xf7, 0x74, 0x00, 0x78, 0x7c, + 0x6d, 0x88, 0x06, 0xdd, 0x1b, 0xf3, 0x39, 0x1c, 0x22, 0x6b, 0x2b, 0xc0, 0x02, 0x78, 0xb9, 0xda, 0xd3, 0x03, 0x56, 0x1e, 0x03, 0xd6, 0xae, 0xc3, 0x07, 0x34, 0xab, 0xd1, 0x4a, 0x92, 0xf0, 0x85, + 0xec, 0xee, 0x37, 0x56, 0x9d, 0xd4, 0x8a, 0xbd, 0xd9, 0x6b, 0x0d, 0xb6, 0xef, 0x87, 0x18, 0xfa, 0x44, 0x02, 0xdd, 0x2f, 0xb1, 0xe0, 0xec, 0xdd, 0xc9, 0xec, 0x2a, 0xed, 0x67, 0xd0, 0x6a, 0x4a, + 0x0d, 0x12, 0xc1, 0x23, 0x3b, 0x89, 0xcb, 0x53, 0x39, 0xa0, 0xe1, 0x72, 0xed, 0x25, 0xfb, 0x3c, 0xae, 0xc0, 0x83, 0x83, 0x2e, 0xce, 0x82, 0x5d, 0xe7, 0x68, 0x46, 0x62, 0xe9, 0x49, 0x5a, 0xe0, + 0xfc, 0xd1, 0xec, 0xe3, 0xe5, 0x5c, 0x48, 0x74, 0x1f, 0xd3, 0x25, 0x2b, 0xe5, 0x87, 0xdd, 0x8a, 0x0a, 0xa0, 0x73, 0x40, 0xa2, 0xd5, 0x7e, 0x8e, 0x0d, 0x5d, 0xaf, 0x1c, 0x11, 0xfa, 0xb4, 0xcd, + 0x1e, 0xd9, 0x0a, 0xa5, 0x56, 0xf1, 0x9b, 0x40, 0x05, 0xec, 0xa9, 0x54, 0x9d, 0x17, 0x99, 0x57, 0x20, 0xae, 0x47, 0x33, 0xec, 0xb1, 0xb4, 0x9c, 0xc0, 0x15, 0xe0, 0xfe, 0x54, 0x99, 0xb6, 0x8d, + 0xcc, 0xbd, 0x25, 0x1b, 0xb2, 0xd1, 0xce, 0xf6, 0x24, 0x6a, 0x67, 0x73, 0x51, 0x09, 0xb7, 0x55, 0xbc, 0xd9, 0x81, 0xfc, 0x56, 0x02, 0x05, 0x03, 0xa3, 0xf6, 0x26, 0x2c, 0x9f, 0x74, 0xb5, 0x96, + 0x97, 0x27, 0x98, 0x85, 0xa7, 0xce, 0x58, 0x6f, 0x32, 0x58, 0x5f, 0x41, 0x84, 0xd3, 0x47, 0xcb, 0x5a, 0xdc, 0x22, 0x1c, 0xaa, 0x26, 0x59, 0x04, 0x1b, 0xfa, 0x23, 0x96, 0xd4, 0xd4, 0xcb, 0xfb, + 0x3b, 0x10, 0xcc, 0x9f, 0xfa, 0x82, 0x2e, 0x02, 0x2f, 0xed, 0xf7, 0xf2, 0x7e, 0x36, 0x7f, 0xec, 0xbb, 0x01, 0x72, 0xfb, 0x60, 0x27, 0xa2, 0x9c, 0x2a, 0x81, 0x33, 0x2e, 0x1b, 0x02, 0xf1, 0xdb, + 0x4a, 0x2e, 0x95, 0x85, 0x5c, 0x08, 0xa3, 0xa6, 0xe7, 0xd4, 0xb2, 0x95, 0x71, 0x5b, 0x20, 0x5d, 0x96, 0xea, 0xd3, 0x5e, 0x06, 0xba, 0x7e, 0xc3, 0x15, 0x60, 0x45, 0xaf, 0x19, 0x8c, 0xae, 0x8e, + 0x12, 0x45, 0xd7, 0x8c, 0xcc, 0xc0, 0x75, 0x94, 0x9b, 0x73, 0x8c, 0xc3, 0x60, 0x52, 0x5f, 0xa9, 0x31, 0xb5, 0x7d, 0x6e, 0x43, 0xf8, 0x3f, 0xd7, 0x62, 0x01, 0xe0, 0x95, 0x0e, 0xf5, 0xf5, 0x93, + 0xfa, 0xc2, 0x27, 0xe1, 0x58, 0xa9, 0x97, 0x38, 0x56, 0xed, 0xcd, 0x62, 0xef, 0xc5, 0xd9, 0x46, 0x5c, 0xeb, 0x19, 0xbf, 0x7b, 0xc6, 0xf5, 0xae, 0x4f, 0x85, 0x93, 0xf7, 0xbd, 0x8c, 0x5f, 0xf7, + 0x7f, 0x09, 0xf9, 0x26, 0x2b, 0xef, 0x13, 0x43, 0xda, 0x37, 0x1c, 0x82, 0xaf, 0x3f, 0x75, 0x76, 0xe3, 0x15, 0xaf, 0xbf, 0x2e, 0xce, 0x7f, 0xfd, 0xf5, 0x77, 0x96, 0x57, 0xa9, 0x75, 0x7d, 0x59, + 0x61, 0x39, 0xb1, 0x75, 0xf6, 0x5e, 0xab, 0x4e, 0xbc, 0x92, 0x00, 0xbe, 0x7b, 0xb6, 0xf2, 0x2c, 0x77, 0x56, 0xc4, 0xe7, 0x5b, 0x65, 0x9e, 0xbf, 0xff, 0x43, 0x7e, 0x76, 0xf8, 0x55, 0x9e, 0xfb, + 0x5a, 0x46, 0xf6, 0xcb, 0x7f, 0x6e, 0xaa, 0x30, 0x9d, 0x65, 0x5e, 0x7f, 0xdd, 0x08, 0xdd, 0x79, 0xe4, 0x13, 0x39, 0x27, 0x4c, 0x7d, 0xbc, 0x3f, 0x5a, 0xd5, 0xb9, 0xfe, 0xb0, 0xc3, 0x83, 0xae, + 0x95, 0xfa, 0x5f, 0xe7, 0xb4, 0x77, 0x9d, 0xfa, 0x7f, 0xc7, 0xdf, 0x09, 0x53, 0x9f, 0xaa, 0x5f, 0x3f, 0x3a, 0xc4, 0xef, 0xf1, 0x77, 0x5e, 0x04, 0x7e, 0x18, 0xed, 0x7f, 0xdd, 0x1b, 0xf1, 0xe2, + 0x76, 0x61, 0xe8, 0x31, 0x05, 0x6c, 0x0f, 0x06, 0x50, 0x1e, 0xc5, 0x3e, 0xde, 0x34, 0x5c, 0x39, 0x2d, 0xda, 0xc1, 0x09, 0xf2, 0x7d, 0xc8, 0xcc, 0x55, 0x77, 0x00, 0xd6, 0x07, 0x56, 0x66, 0xda, + 0x50, 0x51, 0x00, 0x69, 0xc7, 0xed, 0x36, 0x0e, 0x22, 0xec, 0x16, 0x7a, 0x62, 0x07, 0x31, 0xdb, 0x1f, 0x1b, 0x10, 0x03, 0x33, 0xce, 0x1c, 0x56, 0xbc, 0x01, 0xf7, 0xa8, 0xe2, 0x69, 0x22, 0x4f, + 0xa5, 0xcf, 0x53, 0x16, 0xbe, 0xd1, 0x45, 0x7e, 0xbf, 0x2a, 0x3c, 0x63, 0x17, 0xba, 0x89, 0xbc, 0x4e, 0x04, 0x97, 0x83, 0x19, 0xfc, 0x98, 0x6d, 0x88, 0x2a, 0xc9, 0xd3, 0xea, 0xbc, 0xdf, 0x69, + 0xd8, 0x8e, 0x6a, 0x1c, 0xff, 0x24, 0x8d, 0xd4, 0x19, 0x9a, 0x0b, 0x8e, 0xdc, 0x9b, 0xae, 0xdd, 0xaf, 0x57, 0x65, 0xe0, 0x81, 0x9a, 0x19, 0xe7, 0xdb, 0x29, 0xca, 0x40, 0xf4, 0xc8, 0x32, 0x7d, + 0x23, 0xd2, 0x46, 0xa3, 0xb3, 0xc3, 0x02, 0x15, 0xa9, 0x46, 0x9a, 0x0a, 0x67, 0xa2, 0x69, 0xe6, 0xdc, 0x01, 0x12, 0x22, 0xe1, 0x23, 0x04, 0x99, 0x3b, 0xf1, 0x5e, 0xfa, 0xd5, 0x27, 0x08, 0x9a, + 0x20, 0x77, 0xef, 0x5b, 0x08, 0x9e, 0xc9, 0xec, 0x79, 0x91, 0x79, 0x05, 0xe1, 0x7a, 0xf4, 0x68, 0x16, 0x4f, 0xe8, 0x24, 0x8b, 0x8d, 0x27, 0x94, 0x42, 0x4a, 0x50, 0xd3, 0xba, 0xc9, 0x4c, 0xc8, + 0x03, 0x60, 0x1e, 0x19, 0xd5, 0xad, 0xdb, 0x4d, 0x42, 0x6e, 0xb5, 0x9c, 0x8a, 0x69, 0xcb, 0x05, 0x7a, 0xea, 0x36, 0x60, 0x27, 0xad, 0x43, 0x6f, 0x4d, 0x96, 0xbe, 0x92, 0xf4, 0xaa, 0xa9, 0x02, + 0xcc, 0x62, 0x2e, 0xcd, 0x6d, 0x49, 0xdf, 0x1e, 0xe6, 0x50, 0x9b, 0x0c, 0xb9, 0x9a, 0xd3, 0x1b, 0x04, 0xad, 0x4f, 0x0f, 0xd9, 0xdc, 0xd3, 0xd0, 0xa9, 0xf2, 0x57, 0x1e, 0xe8, 0xef, 0x97, 0xc5, + 0x67, 0x32, 0xf2, 0x7e, 0x89, 0xbd, 0x60, 0xf1, 0x76, 0x72, 0x75, 0x33, 0x3e, 0x60, 0x1c, 0x29, 0x94, 0x74, 0xea, 0x41, 0x5d, 0x75, 0x7a, 0x9d, 0x2d, 0x98, 0xb9, 0xb5, 0x9d, 0x97, 0x20, 0xa4, + 0x8b, 0x3d, 0x2f, 0x8c, 0xe7, 0x68, 0x75, 0xdc, 0x51, 0x23, 0x64, 0xe5, 0x50, 0xef, 0x96, 0x45, 0x55, 0x4d, 0x8c, 0x85, 0x19, 0xd9, 0xc0, 0x3b, 0x13, 0xe9, 0xcb, 0x8a, 0x59, 0x51, 0x5d, 0x1e, + 0x50, 0x27, 0x18, 0x8a, 0xd9, 0x60, 0xb1, 0xb4, 0x05, 0x67, 0x73, 0x8a, 0xf1, 0x7e, 0x73, 0xd6, 0x9e, 0xac, 0x16, 0x65, 0x57, 0x96, 0xf3, 0x6e, 0x62, 0xfb, 0x54, 0xaa, 0xd5, 0xc9, 0x7f, 0x71, + 0x68, 0x23, 0x7f, 0x3a, 0x69, 0xbd, 0xff, 0xef, 0xf7, 0x26, 0xad, 0x9b, 0xd0, 0x67, 0xe6, 0xac, 0x37, 0xe9, 0xe0, 0xec, 0xd7, 0xf1, 0xb5, 0xb2, 0x32, 0xfa, 0xd8, 0x94, 0xc5, 0x15, 0x2b, 0x3e, + 0xf2, 0x7b, 0x87, 0x66, 0x54, 0x7b, 0x2e, 0x79, 0xe1, 0xf9, 0x58, 0x23, 0xe9, 0x72, 0x37, 0xe9, 0xaa, 0x34, 0x2d, 0x5a, 0x09, 0xc9, 0x25, 0x67, 0x31, 0xa7, 0xe6, 0x1b, 0x8f, 0x52, 0x1a, 0x0f, + 0x02, 0x0c, 0x75, 0x11, 0xf5, 0xf0, 0xee, 0xe4, 0xb9, 0x4c, 0xd0, 0x1e, 0x39, 0x29, 0xde, 0x44, 0x07, 0x63, 0xda, 0x0b, 0x68, 0x56, 0xd0, 0xf3, 0xa4, 0x3d, 0x06, 0xac, 0xb1, 0xe2, 0xdc, 0xf3, + 0xf3, 0x53, 0x56, 0x98, 0xde, 0x77, 0xe7, 0x13, 0xcf, 0xe8, 0x2d, 0x61, 0xea, 0x5d, 0x47, 0x67, 0xea, 0xcd, 0xae, 0x12, 0x7e, 0x1e, 0x97, 0xea, 0x41, 0x8a, 0xf7, 0xde, 0xea, 0x88, 0xc2, 0x95, + 0xb8, 0x0f, 0xad, 0xaa, 0x5e, 0x0a, 0xdb, 0x8d, 0xc9, 0xf1, 0xec, 0xb9, 0xe3, 0x1c, 0x90, 0xaf, 0xa2, 0xdc, 0x5f, 0x64, 0xcb, 0x44, 0x6c, 0x1a, 0x1f, 0xb7, 0x22, 0xa5, 0x2b, 0x43, 0x65, 0x41, + 0xc9, 0xb5, 0x97, 0xd9, 0x4e, 0x9e, 0x3b, 0x0d, 0x47, 0xb8, 0xc4, 0xb1, 0x26, 0xac, 0xd2, 0xd4, 0x97, 0x0b, 0x40, 0xb7, 0x63, 0xae, 0x09, 0xc2, 0x87, 0x32, 0x33, 0xae, 0x3f, 0xd2, 0xbd, 0x97, + 0x39, 0x00, 0xff, 0x83, 0x3f, 0xb3, 0x55, 0x7c, 0x11, 0xfa, 0x8a, 0x81, 0x6b, 0xcf, 0x6e, 0x82, 0x7e, 0xc6, 0xa1, 0x96, 0x54, 0xac, 0x3d, 0x91, 0xae, 0x91, 0x74, 0x8d, 0xb6, 0x1b, 0xfa, 0x7e, + 0xd8, 0x30, 0x90, 0xd4, 0x86, 0xc1, 0x49, 0x08, 0x57, 0xe4, 0x71, 0x5c, 0xd8, 0x32, 0x7e, 0xd0, 0x06, 0x86, 0x5e, 0xce, 0x53, 0xd5, 0xe8, 0xc4, 0x73, 0x95, 0xcb, 0x62, 0x6f, 0xc8, 0xb2, 0xc8, + 0x49, 0x3b, 0x8a, 0xde, 0xda, 0x2b, 0x00, 0x5e, 0x1d, 0x4f, 0x89, 0x98, 0x73, 0xb0, 0x4a, 0x23, 0x99, 0x8a, 0x9e, 0x8d, 0xee, 0x61, 0x1c, 0x5e, 0xcb, 0x3b, 0x7d, 0x3f, 0x14, 0xe0, 0x7f, 0xd0, + 0x3f, 0x0f, 0xaf, 0xfd, 0x25, 0xf7, 0x15, 0x8d, 0xeb, 0xc9, 0xec, 0x26, 0xee, 0x67, 0x40, 0x4c, 0xc6, 0x00, 0x6c, 0x29, 0xc5, 0xa7, 0xe3, 0x71, 0x0d, 0x18, 0x05, 0x5d, 0x2d, 0xd4, 0x79, 0xc6, + 0x41, 0xea, 0x79, 0x4b, 0x1b, 0xd2, 0x11, 0x92, 0x9b, 0x23, 0x2c, 0x98, 0xda, 0xba, 0xc3, 0x6a, 0x00, 0x38, 0x0a, 0xb1, 0x73, 0x3e, 0x59, 0x47, 0xe8, 0x4c, 0x00, 0x98, 0x82, 0xb4, 0x5b, 0x6c, + 0x1f, 0xc9, 0xd1, 0x34, 0xd6, 0x9b, 0x25, 0x3c, 0x0d, 0xad, 0xc6, 0xe3, 0x50, 0x30, 0x59, 0x9e, 0x1e, 0x3e, 0x97, 0x09, 0xf7, 0x6b, 0xa8, 0xbc, 0x8e, 0x8b, 0x3b, 0x9f, 0x53, 0x36, 0xbb, 0x91, + 0xc1, 0xdc, 0x1d, 0x54, 0xcf, 0x38, 0x09, 0x7f, 0x89, 0xbd, 0x02, 0xf9, 0x7a, 0xf2, 0x88, 0xbb, 0xef, 0x82, 0xe3, 0x76, 0x1e, 0xf5, 0xfb, 0x0c, 0x22, 0x0f, 0x23, 0xb8, 0xed, 0xc5, 0x08, 0x9d, + 0x4e, 0xf1, 0x29, 0x8c, 0x91, 0xdd, 0xb1, 0x3b, 0x17, 0xd6, 0x18, 0x33, 0xe6, 0x2a, 0x3c, 0xf3, 0x84, 0x32, 0x10, 0xc2, 0x9c, 0xb7, 0xf7, 0x63, 0xdf, 0xab, 0x87, 0x7d, 0x33, 0xac, 0x8e, 0x00, + 0x99, 0x9c, 0x72, 0x86, 0xe7, 0x5d, 0x54, 0x44, 0xb7, 0x7a, 0xbf, 0xeb, 0xbb, 0xb6, 0xcd, 0x6a, 0x4a, 0x5d, 0x82, 0x1b, 0x6f, 0xf1, 0xd8, 0xc0, 0xfa, 0x55, 0x0e, 0xe1, 0x3b, 0x34, 0xd0, 0xe7, + 0xf4, 0x81, 0x57, 0xa9, 0x37, 0x30, 0x6e, 0xc7, 0xd7, 0xba, 0x7e, 0x0f, 0xe8, 0x04, 0x3b, 0xb2, 0x20, 0xd0, 0x40, 0x09, 0x2f, 0xd3, 0xaa, 0xc0, 0xac, 0xfa, 0x1e, 0xd6, 0xc8, 0x10, 0x25, 0x81, + 0xe5, 0xb8, 0xad, 0x44, 0x4d, 0xc4, 0x75, 0x59, 0x5e, 0x4c, 0x26, 0x7a, 0x12, 0x1d, 0x1e, 0x92, 0x84, 0xd1, 0xee, 0x0b, 0x3f, 0x3d, 0x81, 0x02, 0x84, 0x4f, 0xeb, 0xc5, 0xd4, 0xcb, 0x73, 0xf5, + 0x30, 0xae, 0x1c, 0x9d, 0x68, 0x50, 0x55, 0x04, 0x38, 0xdc, 0x2a, 0x97, 0xb2, 0xb8, 0xdd, 0x3c, 0x37, 0xa6, 0xae, 0x8b, 0xe0, 0xcc, 0x1b, 0x0a, 0x2b, 0x7b, 0x05, 0xe4, 0xba, 0x77, 0x21, 0xef, + 0x8e, 0xad, 0xd7, 0xcd, 0xd4, 0x3d, 0xc3, 0xd6, 0x13, 0x56, 0x87, 0x17, 0xa1, 0xaf, 0x50, 0x5e, 0x76, 0x40, 0x57, 0x49, 0x0f, 0x20, 0x59, 0x47, 0x59, 0x8c, 0xd9, 0x3d, 0x6a, 0xec, 0x4a, 0x63, + 0xb2, 0xdd, 0x71, 0x19, 0x0a, 0xb5, 0xa4, 0x6d, 0x24, 0x5f, 0x04, 0x00, 0x95, 0x65, 0x49, 0x6c, 0x4e, 0x0f, 0x35, 0x51, 0x78, 0x74, 0x8b, 0xeb, 0x67, 0x2c, 0xab, 0xbc, 0xcc, 0x22, 0xc4, 0xd3, + 0x20, 0x1a, 0x43, 0x25, 0x1f, 0xcb, 0xbe, 0x87, 0x76, 0x69, 0xdf, 0x00, 0x8a, 0xe7, 0x53, 0xd5, 0xf9, 0xdc, 0xa6, 0xf1, 0x91, 0x9f, 0xee, 0x15, 0x2a, 0xf8, 0x16, 0x88, 0x77, 0x5b, 0xb5, 0x7f, + 0xcf, 0xb4, 0xfa, 0x59, 0xf8, 0x7b, 0x60, 0x5e, 0x2e, 0x3d, 0x6a, 0x64, 0x95, 0xb1, 0x8a, 0x3a, 0x07, 0x2e, 0x05, 0x8d, 0x81, 0x08, 0x42, 0x11, 0x2c, 0xa2, 0x4b, 0x64, 0x19, 0xf5, 0x9e, 0x8e, + 0xfa, 0xe1, 0xe6, 0x3c, 0x77, 0x5c, 0xb1, 0x8f, 0x76, 0x2e, 0xb2, 0x23, 0x09, 0x19, 0x46, 0x71, 0x07, 0x10, 0x98, 0x81, 0xa5, 0x4b, 0xd7, 0xe0, 0x64, 0xf8, 0xc0, 0x2d, 0xdb, 0xb5, 0x7f, 0xd6, + 0xec, 0x85, 0x3a, 0x2d, 0xfd, 0xce, 0x88, 0x24, 0x75, 0xe5, 0x09, 0xe7, 0x52, 0x80, 0x9f, 0x0b, 0x5d, 0xb7, 0xaa, 0xea, 0x7d, 0xed, 0xe9, 0x8f, 0x04, 0xf8, 0x1f, 0xd3, 0x4d, 0xbe, 0xd9, 0x3f, + 0xff, 0xf2, 0xf9, 0xdf, 0x98, 0x38, 0xef, 0x24, 0x19, 0xa4, 0xbf, 0x5d, 0x3e, 0xfe, 0xbc, 0x27, 0xae, 0xd8, 0xbf, 0xac, 0x16, 0x3f, 0xa3, 0x4d, 0xac, 0x93, 0xa9, 0xb5, 0x8f, 0xbc, 0xc9, 0xa2, + 0x3b, 0xc4, 0x02, 0x85, 0x13, 0xbd, 0x48, 0xbc, 0x55, 0x10, 0x4d, 0x25, 0x9e, 0x0f, 0xe7, 0xcd, 0x68, 0xd1, 0xea, 0x7c, 0x34, 0xf4, 0xce, 0xe1, 0xeb, 0x2e, 0x3f, 0x59, 0x9b, 0x5d, 0x09, 0xd6, + 0xf8, 0xa0, 0x6f, 0x09, 0x50, 0xd7, 0x25, 0xa2, 0x99, 0x48, 0x65, 0x3e, 0x2c, 0xc4, 0x66, 0x93, 0x1d, 0x44, 0xb0, 0xd1, 0x9b, 0x35, 0xaa, 0x29, 0xc7, 0xe4, 0x91, 0xe4, 0xb0, 0xcc, 0x6a, 0xda, + 0xca, 0x4a, 0x66, 0x4e, 0x9e, 0x16, 0xd6, 0x5d, 0x8a, 0xc2, 0x8f, 0x45, 0xfb, 0x1e, 0xc5, 0xe0, 0x93, 0x6c, 0x70, 0xf6, 0xf9, 0xca, 0x75, 0x43, 0xf8, 0xa3, 0x93, 0xe6, 0x50, 0x11, 0x20, 0xd9, + 0xb8, 0xea, 0x66, 0xec, 0xb3, 0x4a, 0xaa, 0x8b, 0xce, 0xee, 0x14, 0x7d, 0x0b, 0xdb, 0x85, 0xf4, 0x40, 0x25, 0xad, 0x2c, 0x77, 0xbd, 0x59, 0x5e, 0xcf, 0xda, 0x26, 0xfc, 0x0d, 0x0b, 0x34, 0xfa, + 0x44, 0x46, 0xc3, 0x07, 0xc9, 0x97, 0xb6, 0xbd, 0x3f, 0xbf, 0x1a, 0x3e, 0x1f, 0xc8, 0x6c, 0xf0, 0xbb, 0x4c, 0x9f, 0x37, 0xa6, 0xad, 0x90, 0x9a, 0x4f, 0xb3, 0xf8, 0x72, 0x31, 0xa2, 0xa3, 0x08, + 0x66, 0x34, 0x3f, 0x46, 0x27, 0x8d, 0x21, 0xf6, 0xe7, 0x60, 0x55, 0x42, 0x13, 0xbe, 0x66, 0x7c, 0x01, 0x30, 0xf5, 0x82, 0xd7, 0x84, 0xed, 0x71, 0xe9, 0xda, 0xa1, 0x3f, 0xc8, 0xb1, 0x8c, 0xe0, + 0x9e, 0x5d, 0xc1, 0x04, 0x0b, 0x09, 0xa4, 0xa7, 0x68, 0xbb, 0xb0, 0x16, 0x9d, 0xfd, 0x6a, 0xc3, 0xa2, 0x5f, 0x58, 0xb2, 0x2e, 0x3f, 0x2d, 0xcd, 0xef, 0xc5, 0x7c, 0xa0, 0x4f, 0xad, 0xea, 0x2f, + 0x32, 0x5f, 0x1a, 0x9e, 0xe6, 0xd9, 0x35, 0x95, 0xf9, 0x81, 0xf5, 0xfc, 0x3c, 0x5f, 0x98, 0xe4, 0x26, 0x8d, 0x03, 0x39, 0x2e, 0xf5, 0x58, 0x71, 0x10, 0xa8, 0x07, 0x4c, 0x5f, 0x26, 0x51, 0x67, + 0xc3, 0xdb, 0x2b, 0x2a, 0xc8, 0x24, 0xbb, 0xb1, 0xd6, 0xf6, 0xba, 0xa1, 0xdb, 0xd4, 0xac, 0xa3, 0x71, 0x1f, 0x70, 0xf1, 0x9c, 0xb7, 0x22, 0x19, 0x22, 0x55, 0x5c, 0x1d, 0x10, 0x2a, 0xe9, 0xd6, + 0x91, 0x89, 0xeb, 0xe4, 0xa6, 0xd3, 0x14, 0x78, 0x98, 0x54, 0x2a, 0xda, 0x9c, 0x9e, 0x5b, 0xc3, 0x9c, 0x20, 0x8f, 0x43, 0xd7, 0xba, 0x59, 0x98, 0xd0, 0x7f, 0xf0, 0xcf, 0xd6, 0x3b, 0xbb, 0x3d, + 0xbf, 0xdc, 0x42, 0x3e, 0x86, 0x50, 0x7e, 0x47, 0x66, 0xf9, 0xcd, 0xe4, 0xf4, 0xb9, 0xa0, 0x12, 0xfc, 0xf1, 0x05, 0x45, 0xdd, 0x54, 0x9e, 0xf7, 0x4f, 0xe5, 0xa5, 0xe3, 0xdb, 0xd4, 0xf5, 0xa1, + 0x72, 0x69, 0xed, 0xa5, 0xdd, 0x8b, 0xfd, 0x8b, 0xfc, 0x07, 0xff, 0xcc, 0xc9, 0x95, 0x16, 0x89, 0x37, 0x6b, 0x8b, 0x2b, 0xa9, 0x40, 0x96, 0xff, 0x22, 0xaf, 0xfd, 0x26, 0x68, 0xe2, 0xe6, 0x7f, + 0xaa, 0x67, 0x4e, 0x9e, 0xe4, 0xb7, 0x67, 0xf0, 0xcf, 0xd1, 0x17, 0x4d, 0xde, 0xbe, 0xfb, 0x9d, 0x1f, 0x6e, 0xb5, 0x99, 0xeb, 0xf9, 0xb5, 0xe5, 0x7b, 0x6f, 0xd2, 0xf1, 0x3f, 0xd9, 0xd3, 0x7e, + 0xc3, 0x47, 0xff, 0xd7, 0x37, 0x43, 0xf0, 0xfd, 0x2b, 0x1f, 0x1f, 0x86, 0xdf, 0xf1, 0xd2, 0x7f, 0xcd, 0xa9, 0xff, 0xeb, 0xfb, 0x99, 0xa5, 0x71, 0x15, 0x15, 0xa5, 0x59, 0xb3, 0x0a, 0x77, 0x5a, + 0xea, 0x0b, 0xac, 0x9f, 0xe4, 0x1b, 0x8a, 0x4c, 0x4e, 0x6d, 0x07, 0x3d, 0xb0, 0x25, 0xfd, 0x1d, 0xc0, 0xf7, 0x1a, 0xfa, 0x19, 0xf6, 0xc7, 0x1b, 0xfa, 0xf1, 0x15, 0xe0, 0xec, 0xd3, 0x85, 0x19, + 0xfe, 0xc5, 0xdf, 0xfd, 0xd7, 0xbd, 0x2f, 0x50, 0x8e, 0x4e, 0x51, 0xef, 0xea, 0xdb, 0x06, 0x83, 0xa8, 0xfd, 0x36, 0x5c, 0x94, 0xb4, 0x8e, 0xe5, 0x2a, 0x57, 0x9f, 0x55, 0x64, 0x55, 0x2e, 0xd8, + 0xa9, 0x46, 0xa4, 0x22, 0x4e, 0x31, 0x4b, 0x36, 0xec, 0x28, 0x05, 0xcc, 0x95, 0xb6, 0x72, 0x34, 0xec, 0xe0, 0xaf, 0x85, 0x63, 0x85, 0xb5, 0x7b, 0xc1, 0x4c, 0x2d, 0xc8, 0x1b, 0x31, 0x1f, 0x4f, + 0xce, 0x7c, 0x15, 0x2f, 0x21, 0x4b, 0x87, 0xe4, 0x7d, 0xfe, 0x1b, 0xc3, 0xe3, 0xa7, 0xe6, 0x7e, 0xf3, 0x25, 0xfe, 0xf5, 0x69, 0x9c, 0x7c, 0x2a, 0x4b, 0xf3, 0xd7, 0x3b, 0x0b, 0xc0, 0x3d, 0x5b, + 0x40, 0x96, 0x17, 0xbf, 0xdd, 0xb6, 0x3c, 0xb1, 0x7c, 0xe5, 0x45, 0x73, 0x9d, 0xde, 0x8a, 0xe6, 0x21, 0xd6, 0x01, 0x78, 0x66, 0xbb, 0x50, 0xd0, 0x1d, 0xf2, 0x41, 0xd6, 0xdb, 0x83, 0x93, 0xa1, + 0xa7, 0xc0, 0x0f, 0x53, 0x0a, 0x35, 0xb6, 0x04, 0x80, 0x3d, 0x33, 0x3d, 0x59, 0xb6, 0x5d, 0x5d, 0x9f, 0xbd, 0xc7, 0xf9, 0x78, 0xd7, 0xa2, 0x7f, 0x6f, 0x9a, 0xff, 0x73, 0x3d, 0xe6, 0xfb, 0x57, + 0x5c, 0x61, 0xf9, 0xee, 0xc6, 0xf5, 0xdb, 0x7b, 0x40, 0xdf, 0x29, 0x10, 0x0d, 0xae, 0xcf, 0x65, 0x18, 0xa1, 0xd3, 0x7e, 0x3f, 0x2a, 0x34, 0x44, 0x90, 0xcc, 0x19, 0x26, 0x6c, 0x7f, 0x3a, 0x6d, + 0x80, 0x9e, 0x0c, 0x46, 0xef, 0x9c, 0x16, 0xdb, 0xce, 0xc4, 0x76, 0x42, 0x54, 0x36, 0xac, 0x78, 0x5a, 0x6c, 0x3b, 0x3e, 0x8d, 0x96, 0x03, 0x3a, 0x4a, 0xa4, 0x71, 0xf4, 0xe6, 0x1d, 0xb7, 0x3b, + 0xc7, 0xb9, 0x20, 0x4a, 0x51, 0x2f, 0xb3, 0xf9, 0x99, 0xc9, 0xf7, 0xfa, 0xfa, 0x39, 0xed, 0xf2, 0x2b, 0xb7, 0xfd, 0xab, 0xcb, 0xf9, 0xfd, 0x84, 0xff, 0x99, 0x7a, 0xe7, 0x32, 0x0f, 0xe2, 0x9f, + 0x43, 0xd3, 0xde, 0xcd, 0xd6, 0xe8, 0x47, 0x82, 0xf2, 0xce, 0x4a, 0xc2, 0xdb, 0x44, 0x5d, 0xa4, 0x6f, 0x80, 0x25, 0xa1, 0xe3, 0x65, 0x2f, 0x51, 0xfa, 0xe8, 0x7d, 0x27, 0xf7, 0x7b, 0xa4, 0xef, + 0x06, 0x68, 0x3d, 0xc7, 0x57, 0xf2, 0x51, 0xf4, 0xa7, 0x5e, 0x6d, 0x82, 0x47, 0xd9, 0x49, 0x08, 0xcf, 0xac, 0x71, 0xbe, 0x46, 0xb5, 0x86, 0x0e, 0xeb, 0x8d, 0x56, 0xcc, 0x0f, 0x08, 0xab, 0x8e, + 0x94, 0x5b, 0xc6, 0x05, 0x1b, 0x62, 0xcb, 0xd3, 0x61, 0x42, 0x59, 0xab, 0x0c, 0x57, 0x84, 0x37, 0xb5, 0x36, 0x84, 0xc3, 0xc8, 0xea, 0x30, 0x35, 0xba, 0xda, 0xab, 0x4b, 0x82, 0x26, 0xb6, 0x9c, + 0x2d, 0xc7, 0x06, 0x22, 0x65, 0x36, 0x98, 0x32, 0x98, 0x66, 0xe4, 0x11, 0xad, 0xf4, 0x4e, 0xcf, 0x3f, 0xa2, 0xbd, 0xbe, 0x24, 0xd5, 0x87, 0x59, 0x5d, 0xfc, 0x2e, 0x99, 0x9f, 0x7c, 0x02, 0x9a, + 0x8f, 0xa2, 0xc1, 0xd9, 0xa7, 0x0b, 0xb3, 0xab, 0xd4, 0x9f, 0xa1, 0xb1, 0xc8, 0x62, 0xb5, 0x71, 0x03, 0x78, 0xe0, 0xb6, 0x8b, 0xf3, 0x71, 0x3c, 0xa8, 0xec, 0x99, 0xdf, 0x0f, 0xe0, 0xd0, 0x33, + 0x66, 0x1d, 0x0b, 0xb0, 0xea, 0x12, 0xde, 0xd9, 0x30, 0x04, 0x74, 0xe5, 0x2a, 0x1a, 0x66, 0xee, 0x25, 0x61, 0xc5, 0xa8, 0xc7, 0x35, 0x10, 0xf4, 0x23, 0xc2, 0xab, 0x34, 0xb0, 0x4c, 0x80, 0xc3, + 0xc8, 0xeb, 0x0b, 0x21, 0xeb, 0x27, 0x30, 0x1a, 0x03, 0xb0, 0x6c, 0x1b, 0x4e, 0x7d, 0xc4, 0x8a, 0xff, 0xfa, 0x73, 0x7f, 0xe7, 0xcd, 0xf8, 0xf3, 0xe9, 0xe0, 0x4d, 0xea, 0x3b, 0x40, 0xea, 0x47, + 0xcb, 0xc6, 0x36, 0xde, 0x58, 0xf2, 0xdd, 0x5a, 0x9b, 0xf8, 0xb8, 0xc4, 0x97, 0xf3, 0x38, 0xa4, 0xd6, 0x27, 0x6d, 0x31, 0x87, 0x10, 0x75, 0xa5, 0x20, 0x65, 0x3c, 0xa4, 0xee, 0x02, 0xcb, 0x78, + 0x1f, 0xe8, 0x23, 0x91, 0x5f, 0x68, 0xe7, 0x61, 0xa2, 0x35, 0x53, 0xa0, 0x87, 0x82, 0x29, 0xe7, 0xfb, 0x6e, 0x45, 0xed, 0xd3, 0x40, 0x13, 0x2a, 0x60, 0x4b, 0xf5, 0xe8, 0x52, 0xc0, 0xe6, 0xa7, + 0x01, 0x25, 0x0c, 0x42, 0x7f, 0xce, 0x84, 0xef, 0x7a, 0x7e, 0x98, 0x79, 0xb3, 0xa2, 0xca, 0x0b, 0xaf, 0x6a, 0x42, 0xef, 0x97, 0xef, 0xf5, 0x83, 0x92, 0xe5, 0x5d, 0x6b, 0x5a, 0x36, 0x95, 0xe5, + 0xbc, 0x6a, 0x78, 0x30, 0xf5, 0x0f, 0x34, 0xcb, 0xbc, 0xa1, 0xb9, 0xf7, 0xb5, 0xbe, 0xa0, 0xf2, 0xe2, 0xcf, 0xbd, 0x87, 0xfc, 0x9f, 0xeb, 0xdb, 0xef, 0xe4, 0xfe, 0xc2, 0xfe, 0x72, 0xf6, 0x68, + 0xdd, 0x66, 0xa1, 0x5d, 0xac, 0x0e, 0xaa, 0xa8, 0xee, 0xab, 0x64, 0xab, 0x8b, 0xfe, 0x86, 0x9b, 0x18, 0xc2, 0x2e, 0xa4, 0x16, 0x6d, 0x8c, 0x06, 0x1d, 0xba, 0x48, 0x70, 0x95, 0xad, 0x0c, 0xac, + 0xbd, 0x23, 0x94, 0x08, 0x36, 0xc6, 0x51, 0x9a, 0x42, 0x42, 0xb4, 0xc5, 0x0c, 0x41, 0x2b, 0x9c, 0xdb, 0x03, 0xa2, 0xb3, 0x00, 0x1b, 0xc5, 0xe3, 0xbe, 0x17, 0xa7, 0x5a, 0xc0, 0xcd, 0xb8, 0xd9, + 0xa6, 0x7e, 0xf0, 0x07, 0x1f, 0xe9, 0x3f, 0x56, 0x5d, 0x87, 0xe7, 0x7b, 0x7b, 0x10, 0xec, 0x29, 0x5b, 0xda, 0x07, 0xc9, 0x6f, 0xa8, 0xbc, 0x9c, 0x5f, 0x0d, 0x1d, 0x0f, 0xd8, 0xd4, 0xc2, 0xe1, + 0x88, 0xf0, 0xf8, 0x71, 0xa3, 0xd7, 0x8b, 0x62, 0x0c, 0x55, 0xc9, 0xe0, 0x52, 0x0d, 0x40, 0x56, 0x9b, 0x42, 0xd7, 0x3d, 0x7c, 0x1b, 0xa2, 0x7b, 0xc0, 0xc7, 0x3c, 0xc0, 0xda, 0xad, 0x17, 0x1b, + 0x2b, 0xc7, 0xad, 0x74, 0xad, 0x68, 0xc4, 0x0e, 0x12, 0x45, 0xc2, 0x01, 0x79, 0x95, 0x5a, 0x7a, 0x18, 0xd9, 0x36, 0xf4, 0x80, 0xb0, 0x3c, 0x35, 0x0f, 0x06, 0x76, 0x49, 0xe8, 0x87, 0x94, 0x6b, + 0x9f, 0x0b, 0x3c, 0xf8, 0x9a, 0xc8, 0xf8, 0x29, 0x5c, 0xe0, 0xa1, 0x41, 0xfb, 0x7d, 0x56, 0xf5, 0xbb, 0x07, 0x3e, 0x0e, 0xd1, 0xbf, 0x7f, 0x57, 0x5d, 0x2b, 0xcf, 0x66, 0xde, 0x10, 0x36, 0xb3, + 0xc4, 0xb3, 0xe2, 0x99, 0x7f, 0xbf, 0xfc, 0xf6, 0x73, 0xb4, 0x92, 0x5f, 0xa4, 0x5f, 0xfa, 0xf0, 0xf3, 0xb5, 0x47, 0xc9, 0x25, 0x4f, 0x2d, 0x6d, 0x99, 0xe6, 0x22, 0x52, 0x3c, 0x13, 0xed, 0xd4, + 0xfe, 0x2c, 0x2e, 0x29, 0x7e, 0x58, 0xe4, 0xf5, 0xb6, 0xad, 0x98, 0x70, 0xa1, 0x41, 0x35, 0x8c, 0x56, 0x5b, 0xd8, 0xe8, 0x53, 0x4b, 0x02, 0x80, 0xa8, 0x73, 0x06, 0x89, 0x24, 0x17, 0x5a, 0x2e, + 0x77, 0x5e, 0x66, 0x7a, 0x76, 0x41, 0x2f, 0x90, 0x94, 0xd2, 0x68, 0x18, 0x5c, 0xe5, 0xb5, 0x64, 0x48, 0xfb, 0x28, 0x53, 0x16, 0x05, 0xf8, 0x85, 0x83, 0xef, 0x85, 0xa1, 0xfb, 0xdf, 0x33, 0x92, + 0x5c, 0x04, 0x5e, 0x9b, 0xed, 0x3c, 0x68, 0x0e, 0xd1, 0x98, 0xda, 0x2a, 0x50, 0x4d, 0xdb, 0xa8, 0xb5, 0x22, 0xd6, 0xeb, 0x79, 0xb6, 0xa6, 0x09, 0x12, 0x47, 0x75, 0x6b, 0xfe, 0x7d, 0x02, 0xcc, + 0x0f, 0x63, 0xee, 0x47, 0x62, 0xf1, 0x97, 0x52, 0xf5, 0xcd, 0xdd, 0x88, 0x31, 0xe8, 0x9f, 0xf9, 0x33, 0x2b, 0xc9, 0x9b, 0xd8, 0x4b, 0xeb, 0xdf, 0x4e, 0x66, 0x57, 0x69, 0x3f, 0xf7, 0xf6, 0x2e, + 0xa2, 0xf3, 0xb1, 0x28, 0x80, 0x88, 0xcb, 0xe0, 0xa6, 0x59, 0xad, 0x57, 0xc3, 0x10, 0x78, 0x0d, 0xcd, 0x79, 0xbb, 0x66, 0x3e, 0x05, 0x8b, 0xf3, 0xa2, 0xf3, 0xf0, 0xb5, 0xbe, 0x09, 0x87, 0x63, + 0xb7, 0x66, 0x34, 0x10, 0xb7, 0x56, 0x71, 0xa3, 0xcf, 0xed, 0xd6, 0x5f, 0x72, 0xbc, 0xa2, 0xec, 0x5d, 0x95, 0xb4, 0x85, 0xa6, 0xe0, 0x7d, 0x87, 0x6d, 0xe7, 0xd8, 0x12, 0x75, 0xdc, 0xd5, 0xee, + 0x1c, 0x3d, 0xb7, 0x96, 0xfc, 0x8f, 0x65, 0xd5, 0x41, 0xdb, 0xe4, 0x75, 0x50, 0x59, 0x4d, 0x10, 0x82, 0x7d, 0x5e, 0xb9, 0xb3, 0x0b, 0xac, 0x2f, 0x1f, 0xd7, 0x47, 0x6f, 0xed, 0xdf, 0xd7, 0xe8, + 0xe4, 0xf0, 0xf6, 0xe5, 0x41, 0x9f, 0xbf, 0xdd, 0x6b, 0xb9, 0xcf, 0xc4, 0xeb, 0xbc, 0xac, 0x0e, 0x1a, 0x2f, 0x7c, 0x0d, 0xf7, 0x79, 0xcf, 0x69, 0xff, 0x2b, 0x81, 0xe7, 0xf2, 0xff, 0xb1, 0x4f, + 0xee, 0xe7, 0x3f, 0xca, 0x65, 0xf9, 0xcf, 0x6f, 0x72, 0x59, 0xf2, 0xce, 0xab, 0x92, 0xdc, 0x72, 0x2f, 0xd3, 0x4d, 0xf3, 0xdb, 0xea, 0x8c, 0x1f, 0x5b, 0xf8, 0x70, 0xff, 0x7f, 0x95, 0x7f, 0x19, + 0x08, 0x5f, 0xaf, 0x5e, 0x2d, 0xfa, 0x0f, 0x8c, 0x08, 0x9b, 0xd4, 0x4d, 0x3b, 0x0d, 0xda, 0x28, 0x2b, 0x85, 0x9c, 0x83, 0x4c, 0x42, 0x90, 0xa6, 0x05, 0x98, 0x05, 0xbe, 0x9c, 0xad, 0x20, 0xca, + 0x3c, 0x6e, 0x0e, 0xd3, 0x14, 0x1d, 0xf7, 0xbd, 0x77, 0xb6, 0x71, 0x61, 0x9e, 0x2f, 0x17, 0x8b, 0x45, 0x31, 0xa0, 0xfe, 0xbc, 0x45, 0x14, 0xd0, 0x47, 0x4f, 0xac, 0xb5, 0xa0, 0x8f, 0x72, 0x44, + 0xc8, 0xbb, 0x8c, 0x55, 0x7d, 0x1d, 0xce, 0xd7, 0x4d, 0x53, 0xfa, 0xe7, 0x9f, 0x03, 0x2f, 0xdf, 0xc7, 0xec, 0xbe, 0xc6, 0x78, 0x7d, 0x8b, 0x68, 0x31, 0x4b, 0xc2, 0x34, 0xbc, 0xa7, 0xa5, 0x22, + 0x4f, 0xc5, 0x1a, 0xbe, 0xc8, 0x04, 0x67, 0xaf, 0x47, 0xd7, 0x8c, 0xce, 0x07, 0x66, 0x4b, 0x10, 0xa4, 0xa8, 0x74, 0xad, 0x1d, 0x76, 0x03, 0x95, 0x0c, 0xf4, 0xd4, 0xbb, 0x8b, 0xc5, 0xf2, 0xb8, + 0xe3, 0x91, 0xfd, 0xa8, 0x2d, 0x61, 0x04, 0xf0, 0xb6, 0x06, 0xb9, 0x67, 0x78, 0xe4, 0x50, 0xf2, 0xe9, 0x22, 0xf6, 0x38, 0x75, 0x5e, 0x0e, 0x4a, 0xa7, 0xb5, 0x87, 0xf1, 0x18, 0xa5, 0xe8, 0x5a, + 0x4d, 0x8b, 0xe5, 0x6a, 0xdf, 0xae, 0x7d, 0x27, 0x5e, 0x6c, 0xcb, 0x95, 0x75, 0x62, 0x55, 0x66, 0xb0, 0x89, 0xe7, 0xac, 0x70, 0xc5, 0xac, 0xa9, 0xc6, 0xbf, 0xff, 0xf7, 0xef, 0xe9, 0x77, 0xdf, + 0xa5, 0x5f, 0xfc, 0x7b, 0xee, 0x92, 0x57, 0xa1, 0x37, 0xf8, 0xf2, 0x97, 0xb8, 0xfa, 0x87, 0x56, 0x1b, 0x85, 0x9c, 0x9b, 0x26, 0x08, 0xf5, 0x8b, 0x81, 0x63, 0x5b, 0x34, 0x37, 0xf6, 0xc9, 0x44, + 0x45, 0x23, 0x18, 0xdb, 0x41, 0x2d, 0x54, 0x07, 0xf2, 0xc0, 0x99, 0xa4, 0x34, 0xac, 0x36, 0xcb, 0xf3, 0x0e, 0x07, 0xd6, 0x48, 0xda, 0xac, 0x35, 0xc4, 0xe7, 0x10, 0x47, 0x6c, 0x96, 0x01, 0xec, + 0x6c, 0x8c, 0x58, 0xae, 0xed, 0x69, 0x7d, 0x22, 0xb7, 0xc0, 0x2a, 0x57, 0x38, 0x8f, 0x30, 0x1a, 0x28, 0xe7, 0xc8, 0xe7, 0x36, 0xb0, 0xbf, 0xc6, 0xd5, 0x2d, 0xe0, 0xe4, 0x2e, 0x82, 0x37, 0x98, + 0xbf, 0x1f, 0x7c, 0xcf, 0x04, 0x0b, 0x5c, 0x25, 0x5e, 0xb1, 0x6b, 0xaa, 0xf1, 0x1a, 0x46, 0xf2, 0x08, 0x70, 0x58, 0x26, 0x2d, 0x4e, 0xc7, 0x85, 0x0a, 0x2d, 0xe7, 0x0c, 0x8a, 0x83, 0x6c, 0x8c, + 0xb6, 0x3b, 0x1f, 0x24, 0x75, 0xc3, 0x96, 0x9d, 0x31, 0x0f, 0x0e, 0x9c, 0xdb, 0x2d, 0x86, 0xad, 0x72, 0x10, 0xce, 0xc1, 0x3a, 0xc1, 0x3c, 0x12, 0x0e, 0x4e, 0x39, 0x9b, 0x2d, 0x05, 0x79, 0x9a, + 0x3b, 0x9a, 0xa5, 0x0f, 0x22, 0xb2, 0x85, 0x21, 0xee, 0x48, 0x03, 0x68, 0xb4, 0x77, 0xbb, 0x2e, 0xe7, 0x7a, 0xc2, 0x7d, 0xc4, 0xf1, 0xf6, 0xb9, 0xe6, 0xcc, 0x5d, 0x4b, 0xd1, 0x9f, 0xe3, 0xf0, + 0x5e, 0xf2, 0x05, 0x8f, 0xf7, 0xe7, 0x8f, 0xba, 0xb9, 0x59, 0x19, 0x59, 0x69, 0x4a, 0x21, 0x9f, 0x28, 0x30, 0x07, 0x16, 0x3d, 0x65, 0x94, 0x8d, 0x6f, 0x9a, 0x92, 0x2f, 0x28, 0x9a, 0x69, 0xc4, + 0x76, 0xe8, 0xae, 0xe6, 0x31, 0x5e, 0x15, 0x09, 0x18, 0xd0, 0x68, 0xd7, 0x6c, 0x36, 0x4b, 0x9f, 0x4d, 0x91, 0xad, 0x1f, 0x12, 0xa5, 0x76, 0x02, 0x9c, 0x9c, 0x61, 0xe3, 0x4a, 0xe5, 0xcc, 0xc5, + 0xb0, 0x42, 0xf9, 0xbc, 0xc1, 0x63, 0xa7, 0x56, 0x92, 0x00, 0x78, 0x6e, 0x41, 0xbb, 0xa8, 0xa1, 0x75, 0xd8, 0x7c, 0x88, 0xdd, 0xfc, 0x7e, 0x48, 0x5d, 0xd3, 0xca, 0xa3, 0xfa, 0xee, 0xd2, 0x80, + 0x3f, 0x37, 0xae, 0xde, 0xc4, 0xde, 0xc0, 0x7c, 0x39, 0x99, 0xe1, 0x8f, 0x8d, 0x30, 0x6b, 0xa4, 0xb9, 0x2e, 0x05, 0x8b, 0x80, 0x66, 0x07, 0x31, 0x36, 0x94, 0x03, 0xbd, 0xa7, 0x90, 0x90, 0xe9, + 0x9d, 0x86, 0x02, 0x57, 0x79, 0x76, 0x58, 0x9d, 0xe9, 0xc3, 0xa0, 0x0d, 0x0c, 0xd9, 0x79, 0x44, 0xb4, 0x39, 0x9f, 0xeb, 0x75, 0x82, 0xf9, 0xe6, 0x49, 0x5e, 0x4a, 0x8a, 0x70, 0x96, 0x73, 0x2e, + 0x6c, 0x4f, 0x60, 0xee, 0x06, 0xeb, 0x8a, 0x9d, 0x64, 0xdd, 0xec, 0xed, 0xd0, 0xa7, 0x29, 0xe5, 0x39, 0x24, 0xff, 0xc7, 0xb6, 0x6c, 0x2f, 0x01, 0xaf, 0x49, 0x20, 0x7e, 0x65, 0xa5, 0x37, 0x5b, + 0x0f, 0xf9, 0x59, 0xb1, 0xbf, 0xc5, 0xca, 0x5f, 0xe9, 0xe1, 0xfe, 0xbe, 0x96, 0x7e, 0xf9, 0xb0, 0x66, 0xff, 0xc4, 0x25, 0x70, 0xf9, 0xea, 0x3f, 0x55, 0x8b, 0xf9, 0x2e, 0xe9, 0xf1, 0xa6, 0xe7, + 0x13, 0xf7, 0x7a, 0xb2, 0x09, 0x2e, 0x7a, 0x77, 0x7d, 0xb7, 0x2e, 0xc3, 0x73, 0xcc, 0x22, 0xef, 0xe4, 0x5e, 0xfb, 0xf2, 0xed, 0xec, 0x51, 0x76, 0x11, 0x2b, 0x9e, 0xcb, 0x23, 0x2e, 0x93, 0x91, + 0x61, 0x23, 0x5a, 0xef, 0x78, 0x23, 0xbe, 0x2e, 0xba, 0x33, 0xc2, 0xe5, 0x0b, 0x07, 0x34, 0xb7, 0x01, 0x7f, 0xe0, 0xc5, 0xc3, 0x32, 0x55, 0xd2, 0xf1, 0x2c, 0xd5, 0x6c, 0x1f, 0x9f, 0x4e, 0x0d, + 0xe4, 0x9b, 0x16, 0x54, 0x56, 0xcd, 0x7e, 0x02, 0x52, 0xa2, 0xd9, 0x1d, 0x17, 0x1b, 0xdf, 0x94, 0xa9, 0x75, 0x96, 0x2e, 0xb1, 0x3d, 0x8b, 0xf1, 0xda, 0x48, 0x82, 0x8f, 0xd8, 0x4f, 0xae, 0xbf, + 0x35, 0xbc, 0xee, 0xff, 0xf3, 0xa4, 0xbd, 0xbb, 0xf0, 0x3c, 0x3b, 0x63, 0x7c, 0x14, 0xfe, 0x8a, 0xcd, 0xbb, 0x4b, 0x8f, 0xcc, 0x1b, 0xf0, 0x6c, 0x0d, 0xb5, 0x07, 0x6b, 0x23, 0x9c, 0x04, 0x09, + 0xa0, 0xbc, 0x1a, 0xaf, 0xe6, 0xc7, 0xc2, 0xca, 0x82, 0xc6, 0xd1, 0xe1, 0x07, 0x12, 0xd8, 0xae, 0xaf, 0x8c, 0xbd, 0x7b, 0x8b, 0x02, 0xfa, 0x94, 0x9d, 0xe2, 0x55, 0xe8, 0x6b, 0x93, 0x62, 0x6f, + 0xbc, 0x46, 0xb7, 0x3c, 0x30, 0x05, 0xe6, 0x51, 0xea, 0x09, 0x50, 0xe9, 0x02, 0x23, 0x14, 0xd5, 0xd3, 0xaa, 0xc9, 0x0d, 0x8c, 0xaa, 0x20, 0xc9, 0x2b, 0x71, 0xb7, 0xdf, 0xaf, 0xe2, 0x6d, 0x42, + 0x8b, 0x2d, 0x21, 0xe3, 0x3e, 0x06, 0x27, 0x7e, 0x5c, 0xf7, 0x7a, 0xcb, 0x35, 0x46, 0x15, 0x9c, 0xf3, 0x63, 0xc1, 0x67, 0xe3, 0xd6, 0xd9, 0xa4, 0x08, 0xa6, 0x06, 0xe5, 0x00, 0xe0, 0xc7, 0x32, + 0x45, 0xb6, 0xd9, 0xa1, 0xe7, 0x83, 0x15, 0xf1, 0xd8, 0xd2, 0xd0, 0x04, 0xb3, 0x57, 0xc6, 0x94, 0x7b, 0xbd, 0xfc, 0xe7, 0x1e, 0xe2, 0x5f, 0x62, 0x5f, 0xc1, 0xb8, 0x7d, 0xc5, 0xf0, 0x63, 0xac, + 0x77, 0x3c, 0xb3, 0x9b, 0xa4, 0xd3, 0x6a, 0xb5, 0x92, 0x14, 0x60, 0xc4, 0xa8, 0x69, 0x8e, 0x2e, 0xa0, 0x95, 0x0b, 0x8d, 0xba, 0x4d, 0x15, 0x8b, 0xe5, 0xc8, 0x6a, 0x39, 0x18, 0xe3, 0x86, 0xe1, + 0x1a, 0xe7, 0xc2, 0x40, 0x40, 0x64, 0x55, 0x8b, 0x75, 0x5c, 0xef, 0xaa, 0x92, 0x4c, 0xc4, 0xcd, 0x50, 0x8d, 0xd5, 0x49, 0xcc, 0x60, 0x2f, 0x62, 0x89, 0x7c, 0x51, 0x50, 0x56, 0xd0, 0x89, 0x5b, + 0x99, 0xa1, 0xea, 0x87, 0x87, 0xfe, 0x65, 0xa7, 0xf0, 0xef, 0x4f, 0x05, 0x17, 0xa9, 0xaf, 0x60, 0x5c, 0xf7, 0x22, 0x0f, 0x4e, 0x03, 0x67, 0x86, 0xb3, 0x29, 0xcb, 0xdc, 0x33, 0x1e, 0x03, 0x36, + 0xa6, 0x56, 0xcf, 0x25, 0x02, 0x28, 0xa1, 0xdd, 0x7c, 0xdf, 0xc7, 0x6e, 0x42, 0x0c, 0xfb, 0x13, 0x75, 0x8c, 0x32, 0x56, 0x42, 0xcb, 0xdd, 0x69, 0x07, 0x11, 0xb6, 0xbb, 0x3f, 0xc7, 0xf6, 0x32, + 0xe1, 0x55, 0x6a, 0xeb, 0xfa, 0x62, 0xbd, 0xad, 0xd7, 0x13, 0xb2, 0xd4, 0xe0, 0x4a, 0x38, 0x1d, 0x51, 0xbd, 0x15, 0x56, 0x09, 0x35, 0x49, 0x8b, 0xee, 0x21, 0x2c, 0xbe, 0x09, 0xc8, 0xfd, 0xac, + 0x39, 0xfd, 0xb9, 0xe1, 0xea, 0x7e, 0x20, 0xee, 0x03, 0x06, 0xab, 0x12, 0xda, 0x83, 0x73, 0xcf, 0xdc, 0x4c, 0x69, 0x05, 0x2d, 0xda, 0x44, 0x1f, 0xa5, 0x5e, 0xf0, 0xcd, 0xa8, 0xe9, 0x4d, 0x50, + 0x59, 0x9a, 0x89, 0x2d, 0xa0, 0x1c, 0x4a, 0xaf, 0xaa, 0x53, 0x15, 0xe3, 0xd0, 0x11, 0x59, 0x1c, 0x8c, 0x2d, 0xb9, 0x1c, 0x3d, 0x68, 0xd5, 0x79, 0xf1, 0xda, 0x40, 0xb7, 0x12, 0x2c, 0x34, 0x08, + 0xb3, 0x69, 0xa1, 0xca, 0x03, 0x4e, 0x88, 0xb9, 0xd9, 0x16, 0xfb, 0xb8, 0xd5, 0x1e, 0x09, 0x88, 0x2b, 0xc2, 0xec, 0x1e, 0xbb, 0x32, 0xf5, 0x1c, 0xdb, 0xd2, 0x45, 0xe2, 0x15, 0x82, 0x2c, 0x9f, + 0x51, 0x0f, 0xf2, 0x2c, 0x51, 0xbc, 0x21, 0x74, 0xe4, 0x92, 0xd3, 0xf4, 0x83, 0x7f, 0x00, 0x62, 0x22, 0x5f, 0x39, 0x44, 0xee, 0x38, 0x23, 0xce, 0x5b, 0x40, 0x89, 0xd4, 0x52, 0xaf, 0xa2, 0x25, + 0x92, 0x44, 0x47, 0x1d, 0x5f, 0x98, 0x31, 0xd9, 0x01, 0x78, 0x2c, 0x30, 0x48, 0x8e, 0x6b, 0xe4, 0x1c, 0x5b, 0x8f, 0x8a, 0x55, 0x06, 0x16, 0xc1, 0xec, 0xac, 0x28, 0x8d, 0x05, 0xa5, 0xd6, 0x1a, + 0xa9, 0x58, 0x8f, 0x7b, 0xd5, 0x7d, 0x20, 0x21, 0xd1, 0x6a, 0xf2, 0x34, 0x74, 0x66, 0x75, 0x72, 0xcb, 0x66, 0xfe, 0xc6, 0x3e, 0x77, 0xdd, 0xbc, 0x57, 0x9e, 0xfb, 0x6a, 0x2d, 0xfe, 0x38, 0x81, + 0xde, 0xb1, 0xa6, 0x7d, 0x93, 0xcd, 0x73, 0x85, 0xe3, 0xd5, 0xee, 0x3c, 0x6b, 0x2a, 0x2b, 0xab, 0x8b, 0xbc, 0xba, 0xca, 0xec, 0xbe, 0xbc, 0xf4, 0xfa, 0x70, 0xdd, 0xb8, 0xb3, 0xda, 0xab, 0xc2, + 0xab, 0xeb, 0xe6, 0x45, 0x29, 0x20, 0xbe, 0x3c, 0xf9, 0x08, 0xbf, 0x42, 0xd9, 0x86, 0x4e, 0x3c, 0xf3, 0xf3, 0x2a, 0xb5, 0x9a, 0x59, 0x9b, 0x79, 0xb5, 0x63, 0x15, 0xb7, 0x6e, 0xbc, 0x3a, 0xc5, + 0x3e, 0x18, 0x2b, 0x2a, 0xcf, 0x4a, 0x66, 0x2f, 0x60, 0xfd, 0x7d, 0x33, 0x27, 0x7c, 0x2e, 0xba, 0x6b, 0xf9, 0xde, 0x17, 0xde, 0x97, 0x37, 0x95, 0xe5, 0x03, 0x36, 0x75, 0x9e, 0x85, 0xce, 0xcc, + 0xce, 0x5f, 0xaa, 0x3d, 0x7e, 0x09, 0x42, 0x68, 0x82, 0x6b, 0x4e, 0x52, 0xdd, 0x54, 0x9e, 0x95, 0xfe, 0xfd, 0xd3, 0x6e, 0xf1, 0x2e, 0x82, 0xf7, 0x66, 0xf7, 0x27, 0xe6, 0xb3, 0xef, 0xdf, 0xf1, + 0x3a, 0x9c, 0xbf, 0xde, 0x79, 0x94, 0xdf, 0xca, 0x21, 0xbb, 0x1c, 0x17, 0x0b, 0x0d, 0xeb, 0xb7, 0x07, 0x0c, 0x09, 0xd4, 0x93, 0x73, 0xc4, 0x95, 0x55, 0xcd, 0x53, 0x66, 0x12, 0xd5, 0xaa, 0xbf, + 0x8c, 0xca, 0x13, 0xe8, 0x21, 0xf5, 0x7a, 0x48, 0xd7, 0xab, 0xb5, 0x19, 0x96, 0xb0, 0xce, 0xab, 0x05, 0xbe, 0x32, 0xf8, 0xa6, 0x65, 0x36, 0x84, 0xb4, 0xda, 0x94, 0x73, 0x0d, 0xf6, 0xce, 0x5a, + 0xa9, 0xd8, 0x19, 0xaf, 0x4a, 0xf8, 0xba, 0x35, 0x53, 0xf1, 0x81, 0x0c, 0xd2, 0x0b, 0xbe, 0xaf, 0x3d, 0xf5, 0x8a, 0x31, 0xf6, 0x25, 0x94, 0xa4, 0x48, 0xc2, 0x06, 0x79, 0x77, 0xef, 0x3e, 0xfe, + 0x5f, 0x07, 0xe5, 0x77, 0xe0, 0x13, 0x4f, 0x4e, 0xa0, 0x5f, 0x5f, 0xf0, 0x8a, 0xfc, 0xa7, 0xcb, 0x33, 0xe2, 0xb1, 0x69, 0xd5, 0xd9, 0x44, 0x92, 0x54, 0xaf, 0x80, 0x2e, 0x88, 0xc0, 0x26, 0x0b, + 0xe8, 0x11, 0xec, 0xc3, 0x7d, 0x80, 0xee, 0xd1, 0x09, 0x0d, 0xc0, 0x08, 0xc6, 0xa7, 0x8d, 0xac, 0x03, 0x87, 0x39, 0x1b, 0x1f, 0x97, 0xe7, 0x72, 0xd7, 0x1e, 0xdb, 0xdd, 0x64, 0xec, 0xb0, 0xb3, + 0x3a, 0x2e, 0x68, 0x3e, 0x60, 0xac, 0x1d, 0x19, 0xc7, 0x73, 0xdb, 0x9a, 0x87, 0x0a, 0x93, 0xda, 0x1b, 0xa4, 0xd9, 0xa9, 0x10, 0x2a, 0x86, 0x5f, 0xea, 0x7f, 0x15, 0x49, 0x7b, 0xcf, 0x8e, 0xfa, + 0xe4, 0xb2, 0x9a, 0xb4, 0xd5, 0xa5, 0xe5, 0x49, 0x5b, 0x3d, 0xba, 0x98, 0x62, 0x2a, 0xeb, 0xf5, 0x95, 0x71, 0x2e, 0x99, 0x75, 0x3f, 0xef, 0x4e, 0xc4, 0x24, 0x9c, 0x80, 0x05, 0x93, 0x4a, 0x0b, + 0x75, 0xe1, 0xef, 0x24, 0xae, 0x61, 0x3b, 0x1b, 0x3c, 0xb9, 0x85, 0xbc, 0x18, 0x10, 0x5c, 0xc7, 0x7d, 0x74, 0xd0, 0x5d, 0xd6, 0x1d, 0xc5, 0xd5, 0x69, 0xdd, 0xc7, 0x09, 0xb5, 0x49, 0xc0, 0x26, + 0x21, 0x81, 0xc1, 0xf6, 0x36, 0xe5, 0x61, 0xb5, 0x07, 0x18, 0x1c, 0x3c, 0x86, 0xd5, 0xb3, 0x34, 0xff, 0xdf, 0x14, 0xcd, 0xbb, 0xc5, 0x5b, 0xdd, 0x1b, 0x59, 0xef, 0x0d, 0x9c, 0xf7, 0xac, 0x91, + 0x4f, 0x2c, 0x44, 0x6f, 0x62, 0x2f, 0x58, 0xbe, 0x9d, 0x3c, 0x5a, 0x45, 0xba, 0x8b, 0x1d, 0x46, 0xaa, 0x14, 0x33, 0x87, 0x65, 0x93, 0xb7, 0x33, 0x5c, 0xe1, 0x59, 0xa9, 0x38, 0x83, 0x5a, 0xba, + 0x95, 0x09, 0xbc, 0xcc, 0x35, 0x2d, 0x70, 0x58, 0xce, 0x07, 0x6d, 0xdc, 0x2b, 0x92, 0x38, 0xb6, 0x2a, 0x1d, 0x4a, 0xe7, 0x13, 0x55, 0x14, 0xb4, 0xd5, 0x60, 0x69, 0x22, 0x96, 0x6a, 0xad, 0x15, + 0xa3, 0xd0, 0x1a, 0x67, 0x11, 0x3d, 0x29, 0x63, 0x65, 0x6c, 0x0e, 0x93, 0xfe, 0x50, 0x61, 0xfe, 0xa2, 0xf2, 0x9a, 0x26, 0xbc, 0x4b, 0x86, 0xfd, 0xa4, 0x51, 0xf1, 0x45, 0xe8, 0x0d, 0x8a, 0xeb, + 0xe1, 0xa3, 0x66, 0xc5, 0x58, 0x6f, 0x44, 0xac, 0x86, 0xf8, 0x09, 0x64, 0x34, 0x70, 0xbb, 0x9b, 0xcb, 0xae, 0x16, 0x2c, 0x7c, 0x12, 0x14, 0x52, 0x49, 0x93, 0xf5, 0x78, 0x5d, 0x81, 0x15, 0xa8, + 0xc5, 0x0a, 0xda, 0x8d, 0x5b, 0x00, 0xea, 0x28, 0x2b, 0x3d, 0x32, 0x43, 0x68, 0xc9, 0x07, 0x7e, 0xaa, 0x29, 0x61, 0x99, 0x8c, 0x8d, 0xcf, 0x6b, 0x3a, 0x48, 0xb6, 0xb2, 0xba, 0xdf, 0x6a, 0x04, + 0x49, 0x8e, 0x3c, 0x97, 0x60, 0x0f, 0xe9, 0x69, 0xaf, 0x3f, 0x34, 0xb9, 0xfc, 0xac, 0x6a, 0x16, 0x78, 0x49, 0x71, 0x7f, 0xd2, 0x79, 0x72, 0xc6, 0xff, 0xfe, 0x1d, 0xef, 0x61, 0xfa, 0x78, 0xe7, + 0xd1, 0x19, 0x9f, 0xb5, 0x39, 0xc4, 0x91, 0xe6, 0x59, 0x65, 0x1d, 0x0e, 0xea, 0x7a, 0x2e, 0x20, 0x7a, 0xaf, 0xf6, 0xa5, 0x3f, 0x25, 0x8b, 0x75, 0xb2, 0x17, 0x0c, 0x23, 0x01, 0x0e, 0xc1, 0x0a, + 0x3c, 0x01, 0x1b, 0xca, 0x9a, 0xb7, 0x42, 0x02, 0xe6, 0x6a, 0xb9, 0x84, 0x7b, 0x64, 0xc5, 0xe3, 0xd8, 0x2e, 0x80, 0xc4, 0x64, 0x54, 0x0e, 0x2e, 0xa5, 0xf8, 0x9a, 0xb1, 0x43, 0x9d, 0xfc, 0x74, + 0xc0, 0x8e, 0x8a, 0x28, 0xdd, 0x4b, 0xf5, 0xfb, 0xe1, 0x83, 0xbc, 0xea, 0x30, 0x6e, 0xe8, 0xfb, 0x7f, 0xbf, 0x5a, 0x0c, 0xee, 0x70, 0xa9, 0xbe, 0x68, 0x13, 0x77, 0x7d, 0x42, 0xf0, 0x53, 0x54, + 0xcc, 0x2f, 0x52, 0xaf, 0x90, 0xde, 0xb4, 0x95, 0x17, 0x49, 0x3f, 0x83, 0xe8, 0xb8, 0xac, 0xe7, 0x83, 0x6e, 0xa5, 0xad, 0xf3, 0xd1, 0x65, 0xe0, 0x5d, 0xbd, 0x9f, 0xda, 0xb5, 0x4f, 0xc1, 0x10, + 0x94, 0x99, 0x09, 0xc0, 0x1e, 0x81, 0xd1, 0x72, 0x1c, 0xc4, 0x5e, 0x39, 0x9e, 0x8b, 0xfb, 0x73, 0x25, 0x8a, 0xb1, 0x09, 0xd0, 0x9a, 0xb5, 0x7a, 0x5c, 0xb6, 0x73, 0x29, 0x10, 0xc3, 0x79, 0x04, + 0x46, 0x7e, 0xba, 0x94, 0x5a, 0x28, 0xdd, 0xaf, 0x0c, 0xac, 0xdf, 0xba, 0x8b, 0x35, 0xf5, 0x75, 0xfe, 0xfe, 0xa2, 0x44, 0xfd, 0x8b, 0xf6, 0xd4, 0x8f, 0xb2, 0xdf, 0x81, 0xf0, 0x72, 0xe5, 0x51, + 0x1b, 0x2b, 0x08, 0x6b, 0x26, 0x05, 0x9c, 0xe4, 0x48, 0x21, 0xac, 0x4e, 0x13, 0xcf, 0x1b, 0x6f, 0x25, 0xb9, 0xe4, 0x81, 0x91, 0xd3, 0xb5, 0x0c, 0x2f, 0xf1, 0x94, 0x86, 0x3d, 0x45, 0xaf, 0xe9, + 0x14, 0x3f, 0x5a, 0x55, 0x22, 0xa4, 0x03, 0xd8, 0xd3, 0xb5, 0x85, 0xb3, 0x2b, 0x6b, 0x60, 0x53, 0x08, 0x5f, 0x8a, 0x8a, 0xd2, 0x8c, 0x2c, 0xb8, 0x1a, 0x40, 0x74, 0x28, 0xd1, 0x63, 0xab, 0x74, + 0x25, 0x4e, 0x96, 0x5f, 0x0a, 0x9e, 0x16, 0x55, 0x7e, 0xae, 0xee, 0x0f, 0x01, 0xe4, 0xa9, 0x78, 0xb3, 0x57, 0xa1, 0xb7, 0xc6, 0x5f, 0x0f, 0xaf, 0xb4, 0xba, 0x0f, 0x38, 0x80, 0x48, 0x29, 0xdc, + 0x34, 0x7c, 0x92, 0xe0, 0xbc, 0x9b, 0x71, 0xdb, 0x7d, 0x0f, 0x43, 0xd0, 0x16, 0xa0, 0x86, 0x9d, 0xae, 0xe0, 0x67, 0x0d, 0x91, 0x7b, 0xcd, 0x88, 0x8f, 0x44, 0xb8, 0xeb, 0x2c, 0xc8, 0xd6, 0xc3, + 0xc6, 0xe4, 0x2c, 0x50, 0xdf, 0x57, 0x07, 0xdb, 0x4d, 0xcf, 0x68, 0x85, 0xe8, 0x99, 0x15, 0xba, 0xd3, 0x5c, 0x6e, 0x53, 0x17, 0x3a, 0x49, 0xd6, 0xbe, 0x32, 0x93, 0xf5, 0xfc, 0x34, 0xaf, 0x1f, + 0x09, 0x70, 0x28, 0xaa, 0x3c, 0x9d, 0x39, 0x49, 0xf8, 0x9b, 0xc4, 0x29, 0xec, 0x39, 0x5b, 0xca, 0x2f, 0xc1, 0x37, 0x3c, 0x5e, 0xcf, 0x66, 0x37, 0x81, 0x3f, 0x63, 0x12, 0xac, 0x55, 0x14, 0x29, + 0x49, 0xd5, 0x94, 0xf1, 0xb9, 0x7d, 0xda, 0xc9, 0xac, 0xda, 0xa4, 0xe8, 0x16, 0x91, 0xaa, 0x1d, 0x7a, 0xd6, 0xba, 0x9c, 0x8e, 0xc3, 0x44, 0x9f, 0xd7, 0x6b, 0x98, 0xc0, 0xe3, 0x1a, 0x2e, 0xfd, + 0x24, 0x68, 0xcf, 0x27, 0xda, 0xe3, 0x80, 0x03, 0xbc, 0x8b, 0x76, 0xc6, 0xa6, 0x1b, 0x1b, 0x34, 0xc7, 0xe3, 0x88, 0xa0, 0x80, 0x12, 0xb5, 0x9d, 0x20, 0xaf, 0xd2, 0x28, 0x9b, 0x1e, 0xd8, 0x2c, + 0x35, 0x6e, 0x78, 0x7e, 0x97, 0xdd, 0x7f, 0x2f, 0xbc, 0xa0, 0xa8, 0xf2, 0x61, 0x9c, 0x59, 0xae, 0x7b, 0x7f, 0x01, 0x7b, 0xca, 0xf0, 0xf2, 0x26, 0xf6, 0x06, 0xdb, 0xcb, 0xc9, 0x75, 0x20, 0x3d, + 0x60, 0x78, 0x49, 0x12, 0xb9, 0xde, 0xf3, 0x07, 0x95, 0x51, 0xa5, 0x23, 0x86, 0x45, 0x6e, 0xa5, 0x82, 0x22, 0x4a, 0x96, 0x49, 0x16, 0xfa, 0x61, 0xc3, 0x48, 0x80, 0xd9, 0x57, 0x69, 0x6a, 0x3a, + 0xf9, 0x81, 0x1b, 0x79, 0xae, 0x6b, 0xcc, 0xa1, 0x18, 0x4f, 0x50, 0x86, 0x80, 0x36, 0x03, 0x0a, 0x58, 0xb3, 0x5c, 0x2c, 0x4c, 0xf0, 0xbc, 0x5b, 0xb9, 0xa6, 0x4a, 0x72, 0xfb, 0xca, 0xca, 0x39, + 0x18, 0xd0, 0x8d, 0xc5, 0x03, 0x9e, 0x44, 0x3f, 0xaf, 0x7a, 0xab, 0x72, 0x6f, 0xcd, 0xfb, 0xb2, 0x97, 0x7a, 0x5f, 0x58, 0xf9, 0xa5, 0x8a, 0xf2, 0xf7, 0x98, 0x7e, 0x88, 0x2a, 0xff, 0x7e, 0xf5, + 0x7b, 0x1f, 0x67, 0xfe, 0x30, 0xa8, 0xbf, 0xe4, 0x5e, 0x50, 0xfd, 0x75, 0x76, 0x0d, 0x40, 0xa2, 0x7e, 0x86, 0x95, 0x24, 0x19, 0xb3, 0x1f, 0xe4, 0x74, 0xe0, 0xb2, 0x16, 0xb5, 0x14, 0x1c, 0x43, + 0x54, 0x40, 0xa7, 0xd6, 0x63, 0x21, 0x4c, 0xb6, 0xbf, 0x03, 0x68, 0x5c, 0x97, 0x99, 0x18, 0x6d, 0xb5, 0x48, 0x1b, 0x32, 0x02, 0xc6, 0x61, 0x6b, 0xbb, 0x67, 0x9b, 0x40, 0x33, 0x14, 0xfd, 0x58, + 0x1e, 0xe1, 0x15, 0x9e, 0xef, 0xba, 0x33, 0x90, 0x44, 0x96, 0x85, 0x88, 0xbb, 0x10, 0x38, 0xf9, 0x1d, 0x2d, 0xca, 0xd4, 0x43, 0xba, 0x41, 0x9b, 0x8d, 0x4e, 0xee, 0xfe, 0x2e, 0x76, 0xe5, 0x89, + 0x6f, 0xf3, 0x45, 0xe8, 0x05, 0x8b, 0x97, 0xc3, 0x47, 0x8a, 0xd8, 0x5d, 0x80, 0xd0, 0x95, 0x5a, 0x89, 0x5c, 0x1f, 0x88, 0xf0, 0x34, 0x01, 0x46, 0x90, 0x60, 0xb9, 0x8d, 0x64, 0xda, 0xd5, 0x1a, + 0xa4, 0x0a, 0xc4, 0x38, 0x5b, 0xd0, 0x4e, 0x6a, 0xdc, 0xf2, 0xb8, 0x35, 0x10, 0xdd, 0xc3, 0xf3, 0x60, 0x27, 0x31, 0xf3, 0xda, 0x62, 0x76, 0x3b, 0x5e, 0xea, 0x8a, 0x39, 0x20, 0x1c, 0x96, 0x45, + 0x75, 0xea, 0xbc, 0xce, 0xd5, 0xcd, 0xd1, 0xce, 0x22, 0xc4, 0xe9, 0x28, 0x71, 0xe5, 0x42, 0x5f, 0x56, 0xaa, 0xf2, 0xfe, 0x8e, 0x0b, 0x7e, 0x26, 0xd8, 0xaa, 0xbc, 0xcc, 0xc9, 0xe5, 0x65, 0x3b, + 0x05, 0x3f, 0x14, 0x57, 0xd5, 0x30, 0xc2, 0x76, 0x42, 0x10, 0x6b, 0x39, 0xd1, 0xcc, 0xc0, 0x37, 0xa7, 0x0d, 0x00, 0x9c, 0xb2, 0xa3, 0x3f, 0x0d, 0x89, 0xef, 0x71, 0x38, 0x6d, 0x97, 0x79, 0x50, + 0x1c, 0xca, 0x62, 0x77, 0x8e, 0x60, 0xed, 0x0c, 0x3a, 0xb2, 0x7d, 0x68, 0x84, 0xc5, 0x84, 0x0a, 0x6d, 0x49, 0xd7, 0x78, 0x77, 0x02, 0x8a, 0x68, 0x59, 0x73, 0xd8, 0x80, 0x15, 0xc2, 0x7c, 0x93, + 0x9c, 0x02, 0xb2, 0x72, 0x0c, 0xe5, 0x11, 0x22, 0xa4, 0x3f, 0x29, 0x56, 0x5e, 0xb6, 0x5e, 0xeb, 0xcd, 0xae, 0x64, 0x04, 0x8d, 0x55, 0xc7, 0xbf, 0xd9, 0x52, 0xfc, 0xf9, 0x4a, 0xf6, 0x49, 0xf6, + 0x05, 0xbc, 0x8f, 0x57, 0x1e, 0x0d, 0x6c, 0x10, 0x5a, 0x4b, 0x38, 0x58, 0x84, 0x9f, 0x70, 0x47, 0x7c, 0x67, 0x1d, 0x0c, 0x79, 0xda, 0xe5, 0x31, 0x84, 0xed, 0xa6, 0x23, 0x0f, 0xd3, 0x0b, 0xc2, + 0x62, 0x83, 0x0e, 0xaf, 0x7c, 0x5e, 0x43, 0xa5, 0x73, 0xb9, 0x00, 0xf6, 0x08, 0x1d, 0x14, 0xa6, 0x9c, 0x2d, 0x68, 0x2a, 0xa0, 0x42, 0xcc, 0x5c, 0xc7, 0xcb, 0x03, 0xa5, 0xe3, 0x4a, 0x19, 0x33, + 0xcb, 0xcd, 0x82, 0xac, 0xb0, 0xc0, 0x8b, 0x50, 0x6e, 0xfe, 0xc8, 0xba, 0x76, 0xd7, 0x16, 0x74, 0x6f, 0xf7, 0xfa, 0xe7, 0xa4, 0x10, 0xdf, 0xbf, 0xe2, 0x8a, 0xd5, 0x77, 0x37, 0x1e, 0x25, 0x8b, + 0x68, 0x0c, 0x1a, 0x96, 0xe1, 0xe0, 0x3c, 0x2a, 0xed, 0xe6, 0x9c, 0xe4, 0x27, 0xd0, 0xd0, 0x6b, 0xa4, 0x87, 0xf1, 0x36, 0x93, 0x4e, 0x01, 0x55, 0xfa, 0x2d, 0x58, 0xd2, 0x47, 0x3f, 0x38, 0x1a, + 0x56, 0x6a, 0xf5, 0xa4, 0x3f, 0x06, 0x6d, 0xca, 0x59, 0xc8, 0xc8, 0x16, 0xee, 0x21, 0xa7, 0xc8, 0xce, 0x40, 0x91, 0x6a, 0xeb, 0x24, 0x11, 0x80, 0xf9, 0x9a, 0x21, 0xeb, 0xea, 0xbe, 0x9e, 0xaf, + 0x36, 0xdd, 0x17, 0x05, 0xe8, 0xf6, 0x1b, 0x93, 0xaa, 0xfd, 0x0d, 0x24, 0x7f, 0x3e, 0xb1, 0xbc, 0x49, 0x7d, 0x43, 0x21, 0xa9, 0xda, 0x47, 0x2b, 0xf8, 0x2d, 0x94, 0x80, 0x2e, 0x52, 0x12, 0xf2, + 0x27, 0xd7, 0xe9, 0x04, 0xd9, 0x97, 0xf2, 0x11, 0x9b, 0x6f, 0x2d, 0x2b, 0xe3, 0xe2, 0x63, 0xa2, 0x68, 0x6b, 0x64, 0xb7, 0x9f, 0xca, 0xc0, 0xd9, 0xd9, 0xc1, 0x61, 0xad, 0x98, 0x1d, 0x99, 0x49, + 0xc7, 0xce, 0xdc, 0xb9, 0x8e, 0x41, 0xa2, 0x10, 0xbc, 0x95, 0xd2, 0x4e, 0x03, 0xc0, 0x02, 0x52, 0xce, 0x5b, 0x2d, 0x93, 0x19, 0x7e, 0x37, 0x84, 0x7e, 0x2d, 0x93, 0x8f, 0x6c, 0x44, 0x2b, 0xab, + 0x9f, 0xd9, 0xb9, 0x7b, 0x3f, 0xc0, 0x00, 0x7f, 0x62, 0xca, 0x79, 0x15, 0x0a, 0xce, 0xde, 0x0e, 0x67, 0x57, 0x49, 0x3f, 0x03, 0x41, 0x4d, 0x6c, 0x39, 0x16, 0xfe, 0x4a, 0x88, 0xe8, 0x6d, 0xc9, + 0x06, 0x67, 0xfd, 0x98, 0xd3, 0x94, 0xb5, 0x44, 0x2a, 0xd2, 0xa8, 0x96, 0x3a, 0xb0, 0x90, 0x17, 0xfe, 0x56, 0xaa, 0xc1, 0x7d, 0x12, 0x03, 0xcb, 0x46, 0x3a, 0x4e, 0x8d, 0xd8, 0x1d, 0x0f, 0x10, + 0x2c, 0x28, 0x1a, 0x88, 0xae, 0x02, 0x02, 0xda, 0x01, 0x16, 0x46, 0x25, 0x0d, 0x55, 0xd6, 0xf4, 0x14, 0x56, 0x32, 0x91, 0xe4, 0xf4, 0xc9, 0x7f, 0x60, 0xf6, 0xb1, 0xc7, 0x17, 0xbf, 0xf9, 0x97, + 0x6c, 0xaf, 0x4b, 0x3b, 0xdf, 0x39, 0x6d, 0xbf, 0x58, 0x5e, 0x43, 0x27, 0xcf, 0xba, 0x59, 0x12, 0xde, 0x28, 0x46, 0x2f, 0xc3, 0x1c, 0xf9, 0x90, 0x42, 0xd0, 0x66, 0x45, 0x78, 0x75, 0xc9, 0xbc, + 0xec, 0x5e, 0xbf, 0x9d, 0xd0, 0x5e, 0x79, 0x9b, 0xee, 0x74, 0xc3, 0x73, 0xfe, 0xf8, 0x57, 0xa1, 0x97, 0x6e, 0x78, 0xe5, 0x85, 0x7a, 0xd0, 0x17, 0xaf, 0x9e, 0x89, 0x79, 0x2a, 0x88, 0x85, 0xdf, + 0x71, 0xcc, 0xc2, 0x41, 0x64, 0x8a, 0x51, 0x8a, 0x7d, 0x14, 0x4d, 0x6e, 0x53, 0x65, 0xdd, 0x7c, 0xe3, 0x1c, 0xf6, 0x3a, 0x80, 0x9d, 0x6a, 0x73, 0x60, 0x60, 0xcb, 0x24, 0xcc, 0xa9, 0xda, 0xae, + 0xc8, 0x2a, 0x99, 0xf4, 0x65, 0xa3, 0x1d, 0xc7, 0x40, 0xe5, 0x0f, 0x7b, 0xee, 0x0c, 0x91, 0xc4, 0x42, 0x23, 0x34, 0x05, 0x0f, 0xcd, 0x82, 0x81, 0x76, 0xe1, 0x93, 0x95, 0xd4, 0x5f, 0x58, 0xbd, + 0x7e, 0xc3, 0x82, 0x85, 0x7c, 0x08, 0xe0, 0xfc, 0x3d, 0x63, 0xd6, 0x97, 0xec, 0x8f, 0x0f, 0xb1, 0x10, 0x7f, 0xff, 0x07, 0xff, 0x89, 0xf1, 0x8a, 0x78, 0xd7, 0x85, 0xef, 0x1a, 0x73, 0x37, 0x89, + 0xee, 0x4b, 0x96, 0xca, 0xaf, 0x9b, 0x9f, 0x3f, 0x35, 0xea, 0x9f, 0xf9, 0xbb, 0x37, 0x3f, 0xde, 0xcf, 0x9f, 0xde, 0x01, 0xce, 0x3e, 0x5f, 0x99, 0x5d, 0x65, 0x7f, 0xe8, 0xf5, 0xbf, 0xee, 0xf5, + 0x7c, 0x3a, 0x6c, 0x99, 0x85, 0x3d, 0xe7, 0xeb, 0x94, 0x60, 0x72, 0x71, 0x47, 0x0e, 0x1b, 0x00, 0x07, 0x74, 0x6c, 0x84, 0x79, 0x15, 0xc4, 0x36, 0x21, 0x0e, 0xf1, 0x73, 0x1a, 0xaf, 0xb7, 0x75, + 0xcf, 0xa1, 0xbb, 0x49, 0xe5, 0x0f, 0x98, 0xdd, 0xc7, 0xf0, 0xba, 0x8b, 0xdc, 0xe5, 0xb9, 0x33, 0x14, 0xcc, 0x9e, 0x8e, 0x58, 0xd3, 0xaa, 0x72, 0x48, 0xc3, 0xf8, 0x7a, 0x85, 0xf8, 0xf8, 0xc6, + 0xe6, 0x3b, 0xe3, 0x21, 0x76, 0xab, 0x47, 0x3a, 0xf0, 0x3e, 0x78, 0xcf, 0xe6, 0xe7, 0xfd, 0x69, 0xa2, 0x14, 0xf2, 0x78, 0xbe, 0x1e, 0x88, 0xd3, 0x7b, 0x01, 0x3d, 0x42, 0x0a, 0xa6, 0x1f, 0x23, + 0x8c, 0x71, 0x58, 0xcb, 0x1b, 0x72, 0xa0, 0xca, 0xcd, 0x83, 0x7b, 0x58, 0x6b, 0x20, 0xb4, 0x10, 0xc5, 0xa3, 0x22, 0x56, 0xd1, 0x30, 0xd1, 0x2c, 0xdc, 0x57, 0x9a, 0xbe, 0xaa, 0x59, 0x5b, 0xe1, + 0xbc, 0x2e, 0x4a, 0xb6, 0x3c, 0x60, 0x32, 0x2b, 0xac, 0x36, 0x93, 0x5d, 0x85, 0xaf, 0x18, 0xcc, 0xd0, 0xa0, 0xb1, 0x4c, 0x63, 0x0e, 0xf0, 0x16, 0xf7, 0xa1, 0xfc, 0xd4, 0xfc, 0xbb, 0xf9, 0x7a, + 0xdf, 0x24, 0x4e, 0x5d, 0x34, 0x60, 0xec, 0x83, 0xdc, 0x5f, 0x08, 0xbe, 0x28, 0x63, 0xf0, 0xe7, 0x54, 0xcf, 0x0f, 0xa9, 0x53, 0xc8, 0x5f, 0xff, 0xe7, 0xff, 0xfc, 0x85, 0x5e, 0xfe, 0xc1, 0x2e, + 0xff, 0xe0, 0x9f, 0x9f, 0xfc, 0xb3, 0x44, 0xaa, 0xbf, 0xfe, 0xfa, 0x90, 0x38, 0xf8, 0x6e, 0x64, 0xbc, 0xbd, 0xf1, 0xde, 0x48, 0xc0, 0xff, 0x21, 0x3f, 0xcc, 0xdf, 0x8f, 0x8f, 0x84, 0x9b, 0x68, + 0x70, 0xf6, 0x72, 0x30, 0xbb, 0x4a, 0x7a, 0xac, 0xa7, 0x9d, 0xe5, 0x94, 0x65, 0xf2, 0x9c, 0x8b, 0x76, 0xa5, 0x4a, 0x90, 0x4b, 0x1c, 0x51, 0xf6, 0x34, 0x81, 0xd3, 0x7b, 0xab, 0xe2, 0x10, 0x02, + 0x82, 0xb4, 0x75, 0x66, 0xc7, 0x8e, 0x15, 0xf6, 0x5a, 0x89, 0x0e, 0x23, 0x88, 0x07, 0xd6, 0x7a, 0x97, 0xd4, 0xc1, 0x39, 0x2b, 0xa2, 0xbc, 0xdb, 0x9f, 0x76, 0xc0, 0xc6, 0xf7, 0xb1, 0xb9, 0x4b, + 0xb1, 0xab, 0x0c, 0xb2, 0x29, 0x92, 0xc6, 0x0b, 0x46, 0x86, 0xa1, 0x87, 0xf8, 0x95, 0xee, 0xcc, 0x54, 0xf7, 0xd0, 0x81, 0x3e, 0xd0, 0x2b, 0xfd, 0xf5, 0x07, 0xe8, 0xdc, 0xe3, 0xcd, 0xfb, 0x4c, + 0xb6, 0xf4, 0xd7, 0x3d, 0x8c, 0x4a, 0x60, 0xbf, 0xa4, 0x32, 0x43, 0x81, 0x39, 0x86, 0xaf, 0xce, 0x15, 0xc6, 0xe2, 0xa3, 0x97, 0xfa, 0x4d, 0xb1, 0xa7, 0x49, 0x50, 0xe6, 0xcb, 0x53, 0xe6, 0x2e, + 0xd3, 0xd5, 0xca, 0x2d, 0xa7, 0x54, 0x88, 0x70, 0xd7, 0x59, 0x8b, 0x22, 0x26, 0xe6, 0x54, 0x99, 0xf4, 0xe6, 0x0a, 0x55, 0xf9, 0x23, 0x0a, 0x98, 0x61, 0x0a, 0xaf, 0x29, 0xae, 0xc4, 0x9c, 0x65, + 0x16, 0xc6, 0x42, 0x90, 0xd0, 0xfb, 0xe4, 0x21, 0x8c, 0xfe, 0xd7, 0xfb, 0xbf, 0x9f, 0x57, 0xdc, 0x1b, 0x53, 0xe2, 0x77, 0x8b, 0x2e, 0xf9, 0x94, 0x1a, 0xf8, 0x4e, 0xee, 0xfb, 0x75, 0xb7, 0x2d, + 0xae, 0x35, 0x76, 0x1f, 0x50, 0x05, 0x27, 0x0e, 0x3a, 0x2e, 0x49, 0xdd, 0x25, 0x76, 0x05, 0xcd, 0xa7, 0x09, 0x9f, 0xb6, 0x7e, 0x39, 0xc6, 0xec, 0x0a, 0x00, 0x8f, 0x89, 0xe8, 0x49, 0x0c, 0x51, + 0x72, 0x74, 0x22, 0x68, 0x64, 0xb0, 0x61, 0xb8, 0x75, 0x00, 0xee, 0x48, 0x90, 0x3c, 0xd3, 0x1a, 0xab, 0x90, 0x51, 0xbe, 0x92, 0x57, 0x1a, 0x6c, 0x73, 0x25, 0x6a, 0xa1, 0xa3, 0x6a, 0x1e, 0x44, + 0x5b, 0xcc, 0x35, 0x7e, 0x2d, 0x63, 0x79, 0xf0, 0xdc, 0xd2, 0xeb, 0x87, 0x99, 0xfb, 0xca, 0x24, 0xf9, 0x85, 0x96, 0xf2, 0x9d, 0xca, 0x72, 0x59, 0x36, 0x91, 0xdf, 0x2f, 0x9b, 0xd4, 0x3d, 0xb3, + 0xc7, 0x57, 0xef, 0xe5, 0xf7, 0x2a, 0xf9, 0x33, 0x6c, 0xdc, 0x9f, 0x64, 0xbf, 0xf4, 0xc7, 0xbb, 0x2b, 0x8f, 0xb0, 0x71, 0x5f, 0x43, 0x7a, 0x62, 0xd0, 0xdf, 0xd2, 0x87, 0x71, 0x1b, 0xe4, 0xee, + 0x30, 0xc2, 0x5b, 0x86, 0x43, 0x36, 0xd6, 0x14, 0x7b, 0x6c, 0x74, 0x48, 0xbd, 0x69, 0xa1, 0xe9, 0x88, 0x77, 0x76, 0x9b, 0x5d, 0x66, 0x04, 0xcd, 0xc4, 0xad, 0xea, 0xa5, 0xb4, 0xcb, 0xfb, 0x64, + 0x4b, 0xac, 0x09, 0x5e, 0xb2, 0xf1, 0xa6, 0xdc, 0xca, 0x5b, 0xbe, 0xda, 0xdb, 0x03, 0x82, 0x1c, 0xf0, 0x1c, 0x65, 0xdb, 0x9d, 0xd5, 0x49, 0x6d, 0xfd, 0x80, 0x56, 0x6a, 0xd9, 0x79, 0xd5, 0xcc, + 0x9c, 0x3c, 0x6b, 0xaa, 0x3c, 0x49, 0xbc, 0xea, 0xef, 0xff, 0xfd, 0x1d, 0x29, 0xe7, 0x5b, 0x5d, 0xd5, 0x57, 0xa2, 0x94, 0x77, 0xf7, 0xbc, 0xce, 0xcb, 0x9a, 0x57, 0xef, 0x1c, 0xfa, 0x6d, 0x60, + 0xc1, 0x4b, 0x0f, 0x7d, 0x34, 0xfc, 0x5f, 0xa6, 0xda, 0xab, 0xe3, 0xff, 0xff, 0x75, 0x3d, 0x27, 0x77, 0x5f, 0xc4, 0xc3, 0x57, 0x11, 0x77, 0xfb, 0xd1, 0x0d, 0xab, 0x7b, 0x1f, 0x13, 0xfa, 0x14, + 0xaf, 0xdb, 0xab, 0xd0, 0x97, 0x9e, 0xbb, 0x1c, 0xce, 0xd0, 0xc7, 0xf8, 0xdd, 0x02, 0xf1, 0x00, 0x51, 0xf3, 0x3c, 0xa3, 0x14, 0xb7, 0x2d, 0x5d, 0x3b, 0xe8, 0x64, 0xdc, 0x44, 0xc9, 0x05, 0xb4, + 0x3a, 0x44, 0x75, 0x39, 0x11, 0x65, 0xa6, 0x38, 0xbe, 0x5f, 0xef, 0x55, 0x14, 0x9b, 0xe3, 0xeb, 0xf6, 0xe8, 0x96, 0x87, 0x14, 0x20, 0xed, 0x60, 0x87, 0xcc, 0x77, 0xdd, 0x56, 0xac, 0x97, 0xcc, + 0x6a, 0x95, 0x59, 0x19, 0xce, 0x48, 0xed, 0xbc, 0x41, 0x8f, 0xf9, 0xfc, 0xa4, 0x24, 0xfb, 0xe9, 0xc9, 0x40, 0xef, 0x2f, 0xdc, 0x82, 0xf7, 0xbf, 0x85, 0xf7, 0x81, 0x19, 0xdf, 0x3b, 0x68, 0x9e, + 0xdc, 0x09, 0xbc, 0x09, 0xbe, 0x61, 0xf9, 0x76, 0x3a, 0x83, 0x1e, 0xdb, 0x11, 0xe0, 0xa4, 0x5f, 0x55, 0xec, 0x1e, 0x14, 0xe9, 0x23, 0x5f, 0xf2, 0xe2, 0x22, 0x80, 0xd2, 0xe0, 0xb4, 0x98, 0x9f, + 0x96, 0xfb, 0x8d, 0x0b, 0xcc, 0x55, 0xd2, 0xb4, 0x91, 0xe3, 0x66, 0xcf, 0xba, 0x4b, 0x35, 0x37, 0x4f, 0x62, 0xc3, 0xda, 0xbb, 0x29, 0x1a, 0x6a, 0x83, 0x65, 0x76, 0xe8, 0x62, 0xbe, 0x30, 0x0c, + 0x5a, 0xc2, 0x82, 0x8c, 0x18, 0xe1, 0xe3, 0xc9, 0xb6, 0x44, 0x7f, 0xd2, 0x9a, 0x14, 0x67, 0xd7, 0x5f, 0xb6, 0xe6, 0x6f, 0xf4, 0xb4, 0xdf, 0x8f, 0xa1, 0x67, 0xbc, 0x7f, 0x37, 0x91, 0xd7, 0x56, + 0x5f, 0xe9, 0xcb, 0x1e, 0xcd, 0x8d, 0x6e, 0x98, 0x05, 0x75, 0x9e, 0x53, 0x9a, 0x07, 0x4d, 0x2e, 0xc4, 0x76, 0x27, 0x6f, 0x7f, 0x9c, 0x5b, 0xd5, 0x4a, 0xcc, 0x8e, 0xfd, 0xbc, 0xdc, 0x43, 0x28, + 0x3f, 0x77, 0x76, 0xba, 0x45, 0x47, 0x55, 0x58, 0xc0, 0xa2, 0x48, 0x12, 0x98, 0xc2, 0x2c, 0xf9, 0xa5, 0x5f, 0x2d, 0x31, 0xa7, 0x9f, 0x04, 0x96, 0x89, 0x70, 0x71, 0x81, 0x87, 0xf9, 0x98, 0xd2, + 0x73, 0x36, 0x0e, 0xa7, 0xb3, 0xb6, 0x63, 0x9e, 0x75, 0xb6, 0xdf, 0x78, 0xd7, 0xde, 0xaa, 0xfb, 0x7e, 0x17, 0xde, 0xd1, 0x54, 0x61, 0xf1, 0x8b, 0x04, 0xee, 0xb7, 0xd1, 0xdf, 0xd7, 0x8a, 0xd3, + 0xc5, 0x3f, 0x45, 0x95, 0x37, 0xf9, 0x65, 0x9a, 0xfe, 0xc7, 0x4f, 0xac, 0xf3, 0x7d, 0x8f, 0xeb, 0x33, 0x9e, 0xe8, 0xef, 0x5f, 0x71, 0xed, 0x83, 0xef, 0x6e, 0x5c, 0x59, 0x77, 0x1e, 0xe8, 0x13, + 0x04, 0x90, 0x21, 0x1a, 0x3f, 0xcf, 0x71, 0x58, 0x4c, 0x8c, 0x64, 0x37, 0x11, 0x63, 0x8b, 0x83, 0x7b, 0x14, 0xdd, 0x3a, 0xf5, 0xea, 0xc0, 0x27, 0xbc, 0x5f, 0x8f, 0x5b, 0x8b, 0xdf, 0x59, 0x2c, + 0xb6, 0x5e, 0x20, 0x15, 0x36, 0x4a, 0xd4, 0xbe, 0x3b, 0xed, 0x77, 0xaa, 0x2a, 0x81, 0xfe, 0x69, 0x19, 0x1f, 0x0a, 0xdb, 0xb6, 0xcd, 0xe4, 0x80, 0x9f, 0xc7, 0xcc, 0x5e, 0x69, 0x7c, 0x58, 0x84, + 0xa1, 0x1e, 0x3e, 0x97, 0xf2, 0xf9, 0x60, 0x4e, 0xe7, 0x37, 0x89, 0xc8, 0xe4, 0x0f, 0x89, 0xc8, 0x37, 0x88, 0xee, 0xcf, 0xa3, 0xcf, 0x24, 0xcc, 0xbc, 0xc8, 0x7c, 0xeb, 0x80, 0xe2, 0x1a, 0xda, + 0xfb, 0x00, 0xe2, 0xa6, 0xb8, 0x9d, 0x5c, 0x6a, 0x3c, 0xd5, 0xb2, 0xbc, 0x20, 0x23, 0x8a, 0xa5, 0x0f, 0x89, 0xc4, 0xea, 0xfd, 0x19, 0x97, 0xfc, 0x74, 0x01, 0xa7, 0x55, 0x09, 0xed, 0x24, 0x2c, + 0x63, 0x83, 0x00, 0xc7, 0x78, 0x8b, 0x13, 0xd0, 0xc1, 0xb5, 0x42, 0xb0, 0xdb, 0xa8, 0x4c, 0x4b, 0x62, 0x05, 0xd7, 0x9f, 0x28, 0x71, 0xa8, 0xbd, 0xfd, 0x81, 0xc0, 0x5b, 0x44, 0xd8, 0xa6, 0x79, + 0x2d, 0x3b, 0x07, 0x06, 0x7a, 0x24, 0xb4, 0xf7, 0x75, 0x76, 0xf2, 0xab, 0x3c, 0xfd, 0x7d, 0x5d, 0x6b, 0xe4, 0xa9, 0x2a, 0xaa, 0xdf, 0xc8, 0xbf, 0xa2, 0xf3, 0xe5, 0xea, 0xd5, 0xf9, 0xf4, 0x80, + 0x8a, 0xa0, 0xfb, 0x50, 0xa6, 0x79, 0x84, 0x52, 0x7b, 0x53, 0xb8, 0xde, 0xb7, 0xc0, 0xa2, 0x98, 0xdb, 0x61, 0xa8, 0xda, 0x69, 0x91, 0x94, 0xc4, 0x61, 0x0e, 0x16, 0x00, 0xd9, 0x93, 0x86, 0x2e, + 0x81, 0xbb, 0xe5, 0x26, 0xa8, 0x54, 0x86, 0x51, 0x83, 0xde, 0x02, 0xba, 0x85, 0x30, 0xb6, 0x76, 0x5b, 0xfa, 0xa6, 0x76, 0xec, 0x3c, 0x15, 0x04, 0x19, 0xe3, 0xc4, 0xd6, 0x0c, 0x4b, 0x2a, 0x1c, + 0x0f, 0x76, 0xab, 0x2f, 0x69, 0xac, 0xbf, 0xb6, 0x64, 0x77, 0x1c, 0x44, 0xcf, 0x50, 0x26, 0xbc, 0x3c, 0x76, 0x6d, 0xff, 0xf5, 0x68, 0x76, 0x13, 0xf4, 0x73, 0xa3, 0x43, 0x07, 0x20, 0x77, 0x46, + 0x78, 0xa2, 0x4e, 0x21, 0x32, 0x4e, 0x32, 0xbb, 0xd6, 0xc4, 0x38, 0x34, 0x19, 0xdc, 0x9c, 0x4f, 0xa4, 0x88, 0x98, 0x41, 0x3a, 0xd7, 0xf7, 0xd6, 0x71, 0x70, 0x77, 0xab, 0x81, 0xb3, 0xea, 0xd0, + 0x5b, 0xd3, 0x15, 0x30, 0xea, 0x26, 0xa8, 0xa5, 0x7a, 0xed, 0xc4, 0x9b, 0x90, 0x4b, 0x60, 0xc4, 0xaa, 0xa0, 0x91, 0xd0, 0x43, 0x9d, 0x19, 0xd0, 0x14, 0x53, 0x36, 0x19, 0xfc, 0x5c, 0x00, 0xc4, + 0x87, 0x58, 0xf0, 0x9b, 0xf3, 0xe0, 0x4e, 0xce, 0xc4, 0x6b, 0x23, 0x2f, 0x9d, 0xfc, 0x1b, 0x0b, 0xf0, 0xd3, 0x38, 0x5e, 0x05, 0xbf, 0x03, 0xf3, 0x3a, 0x98, 0x1e, 0x0c, 0xf1, 0x2a, 0x6c, 0x70, + 0x6f, 0xa4, 0x7a, 0xdd, 0x2c, 0xe2, 0xb1, 0x56, 0xd6, 0x03, 0x55, 0x84, 0xc2, 0x16, 0x6e, 0xd8, 0xb5, 0x20, 0x6f, 0xd7, 0x0b, 0xb4, 0x8b, 0x57, 0x28, 0x5b, 0x62, 0xab, 0x76, 0x01, 0xbb, 0x6b, + 0xe2, 0xbc, 0x29, 0x40, 0xa0, 0x3b, 0x9b, 0x65, 0x4d, 0xb3, 0x3b, 0xab, 0xe8, 0x46, 0x4a, 0x40, 0x65, 0x00, 0xcb, 0xc9, 0x75, 0xdf, 0x95, 0xad, 0xb4, 0x73, 0x32, 0x93, 0x54, 0x8c, 0x11, 0x7b, + 0xc8, 0x0e, 0xec, 0xd5, 0x6d, 0x7a, 0x37, 0x1e, 0x09, 0x7a, 0x16, 0x8f, 0x8b, 0xcc, 0x1b, 0x14, 0x97, 0xa3, 0x19, 0xf4, 0x33, 0x0a, 0xf0, 0x8c, 0xf2, 0x22, 0xc8, 0xf0, 0x64, 0xf6, 0x40, 0x88, + 0xde, 0xb9, 0xa4, 0x28, 0x94, 0x2e, 0xf7, 0xe1, 0x11, 0xda, 0x98, 0x70, 0xfc, 0xcc, 0xc0, 0x68, 0x82, 0x2a, 0x6f, 0xcf, 0x57, 0xdd, 0xeb, 0xbf, 0xc8, 0x95, 0xdf, 0xe5, 0xce, 0xa8, 0xb8, 0xa7, + 0x76, 0x40, 0x4f, 0x45, 0x3a, 0x56, 0xde, 0x4d, 0xe7, 0x68, 0xae, 0x0a, 0xd6, 0x03, 0x13, 0xc8, 0x1e, 0xb2, 0x51, 0x43, 0x93, 0x6b, 0x52, 0x41, 0xcd, 0x39, 0x4c, 0x6a, 0x8a, 0x3c, 0xc2, 0x9b, + 0xcd, 0x82, 0x5c, 0x5a, 0x24, 0x43, 0x05, 0x9d, 0x79, 0x26, 0xd4, 0x15, 0x9e, 0xf2, 0x63, 0xbc, 0x1b, 0xe4, 0xd3, 0x0a, 0x89, 0x5a, 0x68, 0xab, 0xdb, 0x6c, 0x62, 0x6d, 0x24, 0x29, 0x89, 0x0d, + 0x40, 0x13, 0xc8, 0x7e, 0x2d, 0x01, 0xbd, 0xba, 0xd7, 0xd3, 0xe5, 0x7a, 0x01, 0x59, 0x27, 0xa2, 0x33, 0xd8, 0x2f, 0x94, 0x72, 0x95, 0xd7, 0xd6, 0xbf, 0xaf, 0x26, 0xf9, 0xe7, 0xce, 0xa0, 0x17, + 0x99, 0xd7, 0xe6, 0x5e, 0x8f, 0xae, 0xf1, 0x53, 0x0f, 0xb8, 0x7b, 0xd4, 0x79, 0xb6, 0xa1, 0x28, 0x0b, 0xf5, 0x1d, 0xd0, 0x8b, 0xe9, 0x35, 0x9c, 0x40, 0xa0, 0x2a, 0xc1, 0xdb, 0xbc, 0x0e, 0xdb, + 0x6d, 0x34, 0x1e, 0x03, 0x32, 0x58, 0x76, 0xfa, 0x69, 0xbf, 0x31, 0xce, 0x27, 0xc7, 0x67, 0xbb, 0x86, 0x9a, 0x93, 0xfa, 0xb9, 0x8d, 0x10, 0x55, 0xe4, 0x19, 0x6f, 0x8b, 0x2f, 0x59, 0x24, 0x25, + 0xc1, 0xb6, 0x1f, 0x2d, 0xfe, 0x74, 0x24, 0x7c, 0xbb, 0xa1, 0xfb, 0xe3, 0x38, 0x7d, 0x9d, 0x33, 0x7d, 0xd7, 0xf9, 0x77, 0xb5, 0x1b, 0xdf, 0x75, 0x2e, 0x8d, 0xf5, 0x5d, 0xe7, 0x51, 0xcd, 0xe5, + 0x84, 0x04, 0x79, 0xe7, 0x4e, 0x6b, 0x5b, 0x0c, 0x49, 0x12, 0xd4, 0xac, 0xc8, 0x3a, 0xec, 0xf5, 0x18, 0x11, 0xf9, 0x14, 0x18, 0x84, 0xad, 0x27, 0xbb, 0xfb, 0x7d, 0xbb, 0x24, 0x43, 0x27, 0x22, + 0xed, 0x98, 0x98, 0x42, 0x64, 0x4d, 0xb1, 0xec, 0x62, 0x08, 0xcf, 0x4e, 0xc6, 0xac, 0x8b, 0xdd, 0xc6, 0x16, 0x46, 0xc1, 0x39, 0x8f, 0x3b, 0x26, 0x94, 0x00, 0x2a, 0x13, 0x2b, 0x03, 0x77, 0x4c, + 0xb6, 0xfa, 0xe2, 0x3a, 0xae, 0xc2, 0xb4, 0xb2, 0xee, 0x55, 0xc9, 0x44, 0x9f, 0x5b, 0x27, 0xaf, 0x22, 0x2f, 0xad, 0xbd, 0x1e, 0x5c, 0xb5, 0xe7, 0x07, 0x06, 0xf3, 0xce, 0x8c, 0x77, 0x7b, 0x33, + 0x5e, 0xb0, 0xeb, 0xb5, 0x24, 0x21, 0x46, 0xa9, 0x9b, 0xba, 0x64, 0xef, 0x93, 0xfd, 0xf2, 0x5c, 0x0f, 0xd3, 0x8a, 0xda, 0xf2, 0x35, 0x96, 0xec, 0xb7, 0x3a, 0x88, 0xe4, 0x10, 0x3f, 0x57, 0x97, + 0xfd, 0x5c, 0x04, 0x0d, 0x34, 0x27, 0xfa, 0x75, 0x0f, 0x86, 0x73, 0x83, 0xb7, 0x0a, 0x47, 0xdd, 0x69, 0x7d, 0x69, 0x87, 0x68, 0xec, 0x0e, 0x5b, 0xc9, 0xa5, 0x09, 0xe4, 0xb8, 0x7d, 0x6e, 0xf7, + 0x75, 0x4e, 0xf2, 0x2b, 0x83, 0xf2, 0x7f, 0xc8, 0xab, 0x72, 0xf6, 0xfd, 0xc7, 0xdf, 0x5e, 0x33, 0xf5, 0xac, 0x24, 0xf1, 0xee, 0xd5, 0xa5, 0x7e, 0xae, 0x84, 0xd3, 0x7b, 0xc1, 0x17, 0x10, 0xdf, + 0x9d, 0x3e, 0x5a, 0xc8, 0x09, 0x4f, 0xb0, 0xd3, 0x68, 0x2a, 0x14, 0xc1, 0x9b, 0x60, 0xc2, 0x0c, 0xe6, 0x51, 0x21, 0xa2, 0x92, 0xa7, 0x16, 0xeb, 0x15, 0x72, 0x80, 0xb6, 0x6b, 0x7e, 0x2f, 0x21, + 0xc4, 0xc2, 0x8e, 0x6a, 0xfe, 0xb4, 0x60, 0x86, 0x8d, 0x1b, 0x2c, 0x41, 0x07, 0x62, 0xd5, 0x7a, 0x03, 0x8c, 0xe8, 0x5c, 0xf5, 0xe9, 0x10, 0x75, 0xa7, 0x89, 0x12, 0x13, 0xb9, 0x95, 0xd2, 0xcc, + 0xda, 0x89, 0xfb, 0x9c, 0xd9, 0xc8, 0xcb, 0xe7, 0xa0, 0xfc, 0xea, 0x76, 0xbf, 0x25, 0xce, 0xdf, 0x09, 0x35, 0xbc, 0x66, 0x11, 0xbc, 0x19, 0x27, 0xbe, 0x03, 0x15, 0x7f, 0x2a, 0xe8, 0xf7, 0x9d, + 0x5c, 0x70, 0xf6, 0xfe, 0xec, 0xea, 0xdd, 0x7a, 0xc0, 0xc4, 0x56, 0x15, 0xe8, 0x21, 0x87, 0x48, 0xce, 0x71, 0xd3, 0x94, 0xb3, 0xd9, 0xee, 0x6c, 0x09, 0x83, 0x7c, 0xd8, 0x55, 0xa4, 0xcd, 0x9e, + 0x0e, 0xa7, 0x18, 0x3f, 0xcc, 0x57, 0x25, 0xbc, 0x06, 0x8a, 0xc2, 0x56, 0x72, 0x12, 0x02, 0x0c, 0xcf, 0x62, 0x86, 0xb8, 0xc7, 0x19, 0x97, 0x12, 0x24, 0x01, 0x60, 0x19, 0xc2, 0x8e, 0x32, 0x23, + 0x45, 0x4e, 0xad, 0xd4, 0xd2, 0x7a, 0x5a, 0xb4, 0x46, 0x97, 0xd2, 0xfa, 0x97, 0xa9, 0xf6, 0xfa, 0xc3, 0xae, 0xfa, 0xf6, 0xbd, 0xea, 0x1c, 0xcf, 0xd5, 0xae, 0x7f, 0x27, 0xf7, 0xb5, 0xf9, 0xb7, + 0xb3, 0x47, 0xea, 0xd8, 0x5f, 0x9a, 0x2f, 0x59, 0xea, 0x61, 0x5d, 0xab, 0x96, 0x20, 0xb4, 0x5c, 0x1f, 0x2f, 0xc3, 0x28, 0x5f, 0x48, 0x9b, 0x05, 0x47, 0x80, 0xde, 0x9e, 0x38, 0x85, 0x55, 0x37, + 0x4a, 0x5a, 0x62, 0x92, 0xcb, 0x85, 0x3c, 0x62, 0x0c, 0x10, 0xd0, 0x5d, 0x80, 0x2d, 0x89, 0x64, 0xcb, 0x02, 0x99, 0xe4, 0x06, 0xf6, 0xda, 0xdf, 0xda, 0x12, 0x70, 0x3e, 0xb2, 0x4b, 0xa7, 0x72, + 0x6b, 0xd1, 0x52, 0x6b, 0x68, 0x0d, 0x98, 0x4b, 0xf1, 0x81, 0x42, 0xdc, 0xb7, 0x25, 0xf6, 0xef, 0xff, 0x42, 0xf7, 0xc3, 0xc4, 0xef, 0x25, 0x9e, 0x7c, 0x8f, 0x1e, 0xf6, 0x44, 0x78, 0xc7, 0xb7, + 0x6f, 0x78, 0xc5, 0xf1, 0x4b, 0xa9, 0xe3, 0xeb, 0x3b, 0x7e, 0x46, 0xd4, 0x43, 0x6c, 0x66, 0x81, 0x68, 0xbb, 0x23, 0xd4, 0x0f, 0xb5, 0x77, 0x72, 0xb1, 0xa4, 0x66, 0x24, 0x0c, 0x40, 0x45, 0x41, + 0x27, 0x36, 0xc5, 0x5e, 0x97, 0x2d, 0xd8, 0x0c, 0xd6, 0x32, 0x79, 0x50, 0x01, 0x36, 0xea, 0x44, 0x85, 0x4e, 0x0f, 0x81, 0x4d, 0xef, 0x93, 0xa6, 0x6a, 0xb6, 0x8c, 0x1f, 0x1b, 0xc1, 0x69, 0x53, + 0x89, 0x8e, 0xd4, 0x44, 0x00, 0x17, 0xa4, 0xcc, 0xd2, 0x95, 0x5c, 0x93, 0x81, 0xbf, 0x18, 0x47, 0x2e, 0x3f, 0xb1, 0xfa, 0xfd, 0x07, 0x85, 0x3c, 0xc5, 0xc7, 0xf4, 0x5e, 0xf0, 0x0b, 0x14, 0xaf, + 0xa7, 0xd7, 0xd8, 0xa8, 0x07, 0x26, 0x7c, 0xc3, 0xcc, 0x51, 0x8e, 0x42, 0x0e, 0x0c, 0xa9, 0x84, 0x63, 0x08, 0xad, 0xe0, 0x95, 0x2c, 0xe5, 0x11, 0x3f, 0x91, 0x71, 0xe1, 0x15, 0xd9, 0x41, 0xde, + 0xce, 0xb7, 0xa3, 0x64, 0x6f, 0x36, 0x67, 0x58, 0xd7, 0x75, 0xaf, 0xb3, 0x71, 0x77, 0xb7, 0x25, 0x9b, 0x62, 0x14, 0x90, 0x05, 0x33, 0xb0, 0x8e, 0x6c, 0x6f, 0x58, 0xb2, 0x73, 0x46, 0x65, 0x13, + 0x43, 0x8e, 0xdd, 0x97, 0x8e, 0x5c, 0x85, 0x6a, 0xf3, 0x15, 0x01, 0xcf, 0x69, 0xab, 0x97, 0xac, 0xf2, 0xdf, 0xe5, 0x7d, 0x22, 0x4f, 0x51, 0xc7, 0x7d, 0x91, 0x7e, 0xf5, 0x05, 0x7d, 0xba, 0x36, + 0x43, 0x1e, 0x23, 0x90, 0x23, 0x2c, 0x15, 0x50, 0xfa, 0xda, 0x9b, 0x7a, 0xf2, 0xa4, 0x50, 0x60, 0x36, 0x76, 0xdc, 0x71, 0xa0, 0xe4, 0x42, 0xdb, 0xcc, 0xd7, 0x95, 0x63, 0x84, 0xba, 0x9e, 0x94, + 0x34, 0x36, 0xe1, 0x2e, 0xae, 0xcb, 0x4b, 0x46, 0x29, 0x1b, 0xdb, 0xaf, 0x95, 0x28, 0xeb, 0xd9, 0xf1, 0xb2, 0xea, 0x9d, 0x5d, 0x57, 0x68, 0xb4, 0x4d, 0xbb, 0x8a, 0xe7, 0xe2, 0x42, 0x50, 0xf3, + 0x86, 0x47, 0x88, 0xf2, 0x46, 0x20, 0xf7, 0x09, 0x90, 0x4f, 0xee, 0xb0, 0x8f, 0x0e, 0x0c, 0xfc, 0x09, 0x6d, 0xee, 0xb3, 0x1b, 0xec, 0x2a, 0xe5, 0xe7, 0xf6, 0xc2, 0x36, 0x7d, 0x58, 0x1d, 0x4e, + 0x84, 0xd4, 0x01, 0x21, 0x02, 0x6f, 0xba, 0x62, 0x28, 0x50, 0x66, 0x00, 0x8a, 0x03, 0x43, 0x25, 0x5b, 0xa9, 0xa1, 0xda, 0x53, 0xa4, 0x54, 0xc3, 0x42, 0x6d, 0xc0, 0xcc, 0xae, 0x7b, 0xc3, 0x01, + 0x1a, 0x8e, 0x30, 0x10, 0xbb, 0x09, 0x55, 0x3e, 0x72, 0x31, 0xc0, 0xcf, 0x4a, 0x18, 0x97, 0x74, 0x20, 0x2b, 0x65, 0x86, 0x26, 0x45, 0xbf, 0x21, 0xb5, 0xb8, 0x77, 0x1e, 0x30, 0x91, 0xbf, 0x2f, + 0x25, 0xf8, 0x9a, 0x3c, 0xf7, 0xfd, 0xd4, 0xf2, 0x4d, 0x05, 0xe2, 0xef, 0xc7, 0xce, 0x33, 0x96, 0xea, 0x2f, 0xd2, 0xaf, 0x00, 0x7e, 0xba, 0xf6, 0x68, 0x6d, 0x12, 0xe5, 0x94, 0x9d, 0xe4, 0xe1, + 0xa8, 0xb7, 0x5e, 0x15, 0x13, 0x38, 0xaa, 0xfb, 0x6d, 0x12, 0x8a, 0xc3, 0x52, 0xa2, 0xe0, 0x83, 0x0f, 0x01, 0xa5, 0x2f, 0xaf, 0x48, 0x94, 0xdf, 0x1a, 0x9c, 0x33, 0xee, 0x8d, 0x0d, 0x3b, 0xc7, + 0x16, 0xed, 0x06, 0x8a, 0xcf, 0x95, 0x5c, 0x28, 0x4c, 0x7b, 0x34, 0xb3, 0x43, 0x1a, 0x15, 0x63, 0xbd, 0x49, 0xa7, 0x61, 0xa7, 0x73, 0x82, 0x6f, 0x11, 0x52, 0xb4, 0x0e, 0xc6, 0xaf, 0xeb, 0x93, + 0xd7, 0xbc, 0xd9, 0xe1, 0xee, 0xd6, 0x56, 0x7f, 0x4e, 0xed, 0xf9, 0x28, 0xfa, 0x06, 0xc5, 0xbb, 0x0b, 0x8f, 0xaa, 0x3e, 0x2b, 0x9c, 0x67, 0x74, 0x52, 0xab, 0x0a, 0x0a, 0xe7, 0xc2, 0x04, 0xb7, + 0x03, 0xb3, 0xc3, 0x88, 0x88, 0x8a, 0x44, 0xcf, 0xce, 0xb9, 0x12, 0xdf, 0xed, 0x53, 0x63, 0x8f, 0x9e, 0x4f, 0xac, 0xcb, 0x6e, 0xa8, 0x61, 0x5d, 0x48, 0x9a, 0xae, 0xee, 0x6b, 0xa1, 0x4a, 0x44, + 0x86, 0xae, 0xe2, 0x7c, 0xd8, 0xaf, 0x3c, 0x21, 0x04, 0x75, 0x73, 0xdb, 0xb7, 0x4a, 0x67, 0x60, 0xba, 0xd0, 0x1b, 0xfb, 0x5d, 0xf1, 0xf5, 0x1b, 0x0a, 0x3c, 0xdb, 0xca, 0xce, 0x33, 0x27, 0x4f, + 0x53, 0xeb, 0xca, 0xe1, 0xf6, 0x2f, 0xae, 0xd5, 0x1f, 0x65, 0x5f, 0x90, 0xf8, 0x78, 0xe5, 0xd1, 0x35, 0x3b, 0xde, 0x0c, 0x15, 0x32, 0x99, 0x85, 0xd1, 0xb8, 0x69, 0x25, 0xc0, 0x25, 0x13, 0x55, + 0x95, 0x0e, 0x9a, 0x70, 0xa5, 0xc0, 0x31, 0x4b, 0x31, 0x03, 0x70, 0x8e, 0x0b, 0x0e, 0x66, 0x31, 0x4f, 0x4f, 0x3b, 0xbd, 0xee, 0x53, 0x67, 0x05, 0x07, 0x47, 0x6d, 0xa9, 0x19, 0xea, 0x94, 0x54, + 0x96, 0xd1, 0xc3, 0xe0, 0x68, 0x16, 0x84, 0xd1, 0x32, 0x06, 0x49, 0x1a, 0x4d, 0x67, 0x0b, 0x90, 0x9b, 0x32, 0xcf, 0x69, 0x81, 0xaf, 0x2d, 0xb8, 0x2a, 0x1d, 0x7f, 0xff, 0x60, 0x6c, 0xfe, 0xfc, + 0xf0, 0xbf, 0x67, 0xd7, 0xff, 0x20, 0xf9, 0x1d, 0xb0, 0xd7, 0xf3, 0x47, 0xad, 0xfc, 0x24, 0x00, 0xb8, 0xeb, 0xa0, 0x71, 0x06, 0x14, 0xc5, 0xd1, 0x76, 0x69, 0x95, 0x14, 0xc3, 0x28, 0x98, 0xd0, + 0x0e, 0x4b, 0xaf, 0x59, 0x4e, 0x34, 0x69, 0xca, 0x62, 0x90, 0x1e, 0xe5, 0x6d, 0xb6, 0x59, 0xb9, 0x84, 0x7d, 0xa8, 0x74, 0x37, 0x5c, 0x8d, 0x13, 0xdd, 0xb1, 0x10, 0x69, 0x62, 0x98, 0x6a, 0xb8, + 0xfc, 0x21, 0xd0, 0xd4, 0x51, 0x6f, 0xf0, 0x3d, 0x38, 0x06, 0x13, 0xe5, 0xc5, 0x8e, 0x7d, 0xaf, 0x5a, 0xc2, 0x47, 0x5c, 0x3e, 0x46, 0xbb, 0xfe, 0x7b, 0x9b, 0xf1, 0xf7, 0x82, 0x2f, 0xa8, 0xbc, + 0x3b, 0x7d, 0x74, 0x5b, 0x5e, 0xe2, 0xba, 0x34, 0x36, 0xe5, 0x7a, 0xb5, 0xe5, 0x36, 0x31, 0xeb, 0x86, 0xfb, 0x6d, 0x65, 0xc0, 0x50, 0xda, 0xf1, 0x4a, 0x97, 0xc9, 0x01, 0x86, 0x80, 0x00, 0x9b, + 0x2f, 0x93, 0xb5, 0x86, 0xda, 0x08, 0xaf, 0xf3, 0x2b, 0x64, 0x18, 0x76, 0x85, 0xb9, 0x76, 0xd3, 0x39, 0xd6, 0x7b, 0xd0, 0xd2, 0xca, 0x4f, 0xa8, 0xd2, 0xef, 0x46, 0xb6, 0x3c, 0xe3, 0xfd, 0x81, + 0xf4, 0x8a, 0xe1, 0xd8, 0x41, 0x66, 0xf7, 0x40, 0xf2, 0xc1, 0x0f, 0x34, 0x8a, 0x67, 0xaf, 0x99, 0x85, 0xd9, 0x45, 0x35, 0xab, 0x43, 0xe7, 0xed, 0x91, 0x0f, 0xb1, 0x7a, 0x5f, 0x78, 0x65, 0x2f, + 0xcf, 0xcc, 0xff, 0x2c, 0x62, 0xeb, 0x2e, 0x37, 0xed, 0x5f, 0x5f, 0xfa, 0x07, 0x86, 0x9f, 0x2c, 0x42, 0xf8, 0x33, 0x49, 0x2d, 0xfc, 0x39, 0x22, 0xfd, 0xaf, 0x7b, 0xbd, 0xb5, 0xf5, 0xc9, 0x65, + 0xb4, 0x4e, 0x8a, 0x78, 0x9a, 0x96, 0xde, 0x09, 0x76, 0xca, 0xf3, 0x11, 0x15, 0x0f, 0xda, 0x11, 0xb5, 0xa6, 0x31, 0x1f, 0x18, 0xd6, 0x8a, 0x14, 0x20, 0x64, 0xb3, 0xf5, 0xd2, 0x3f, 0x9d, 0x90, + 0x95, 0x36, 0x32, 0xa3, 0x66, 0x99, 0xa6, 0x86, 0xac, 0x14, 0x26, 0x52, 0x2d, 0x03, 0x91, 0xf7, 0x54, 0x88, 0x47, 0x5b, 0xf4, 0x10, 0x91, 0x69, 0x50, 0xef, 0x31, 0x86, 0x59, 0x94, 0xda, 0x9b, + 0x69, 0xe1, 0xaf, 0xbf, 0xee, 0x05, 0x50, 0xdc, 0x25, 0xb2, 0xff, 0x17, 0x67, 0xcf, 0x6f, 0x5f, 0x71, 0x1d, 0xd5, 0xdf, 0xdd, 0x78, 0x74, 0x2e, 0xb5, 0x90, 0xe5, 0xdc, 0x80, 0xb8, 0x44, 0xd0, + 0x93, 0x79, 0x0b, 0x76, 0xb5, 0x46, 0xd4, 0xc7, 0x6d, 0x3b, 0xef, 0xd8, 0x55, 0xe1, 0x73, 0x2d, 0xd2, 0x2b, 0x27, 0x22, 0x81, 0x37, 0xa8, 0xbe, 0xb2, 0x6a, 0x10, 0x3a, 0xab, 0xdb, 0x89, 0x9d, + 0x96, 0xb9, 0x04, 0x6e, 0xf3, 0xf6, 0xe8, 0xa8, 0xb2, 0x9d, 0xce, 0x77, 0x9a, 0xc9, 0x6f, 0x50, 0x5a, 0x1c, 0xc6, 0x0c, 0x42, 0x8f, 0x46, 0xb2, 0xb6, 0x86, 0x27, 0x39, 0xd4, 0xbe, 0x54, 0x0a, + 0xf8, 0x1e, 0xea, 0xe4, 0x7e, 0x69, 0xfa, 0x27, 0x27, 0xcf, 0xe4, 0x56, 0x97, 0xfe, 0xfa, 0xf7, 0xd1, 0xc9, 0xf2, 0x3c, 0x97, 0xe1, 0xc0, 0xf2, 0xec, 0x11, 0x25, 0xc4, 0xc3, 0xa1, 0xe9, 0x6d, + 0x2c, 0x6b, 0x68, 0x96, 0x65, 0x2d, 0xae, 0xb6, 0x4e, 0x87, 0x48, 0x26, 0x28, 0x7f, 0x39, 0xe4, 0xb2, 0xd3, 0x36, 0x09, 0xee, 0x1f, 0xe0, 0xae, 0x35, 0x60, 0x6a, 0x83, 0xf6, 0x87, 0x06, 0x8d, + 0xd6, 0xe3, 0xba, 0xa9, 0xe2, 0x01, 0xe0, 0x26, 0xe8, 0x04, 0xb3, 0x14, 0xbe, 0xc0, 0xf6, 0xe3, 0xc2, 0x65, 0xf6, 0x21, 0xf2, 0x88, 0x33, 0xa8, 0x4e, 0x42, 0xc7, 0x9b, 0x59, 0x59, 0x1d, 0xfe, + 0xab, 0xf6, 0xfa, 0x5f, 0x62, 0xaf, 0x48, 0xbc, 0x9e, 0x3c, 0x6a, 0xab, 0x2f, 0xf7, 0xf4, 0xde, 0x0f, 0x0c, 0x08, 0x83, 0x9c, 0xd3, 0xe6, 0x88, 0xa1, 0xdc, 0x7c, 0xb9, 0x1e, 0xcf, 0xa5, 0x61, + 0xab, 0xd2, 0xda, 0xe4, 0x36, 0xe2, 0x99, 0xe4, 0x48, 0x34, 0x6d, 0x8e, 0xda, 0x4e, 0xb1, 0xa9, 0x62, 0x94, 0x50, 0x7f, 0xf2, 0xb1, 0xed, 0xe0, 0xe2, 0x87, 0xc9, 0x5d, 0xed, 0x64, 0x62, 0xaf, + 0xa8, 0x67, 0x50, 0x5b, 0x66, 0x22, 0x3f, 0x9c, 0x03, 0xb3, 0xe1, 0xb8, 0xb6, 0x5a, 0x09, 0xcf, 0x79, 0x23, 0xaf, 0x3f, 0xbb, 0x6e, 0xc6, 0xe4, 0xc5, 0x0f, 0xf9, 0xc5, 0x3f, 0x6c, 0xd5, 0x4d, + 0x75, 0xf5, 0xf9, 0xbf, 0x2e, 0xd9, 0x5f, 0xc3, 0x98, 0xeb, 0x99, 0xdf, 0x26, 0x49, 0x1f, 0xba, 0x4d, 0x30, 0xbb, 0x66, 0xc5, 0x14, 0x79, 0xf8, 0xb3, 0x33, 0xf9, 0x03, 0xfd, 0xc3, 0xf7, 0xe3, + 0xf3, 0x19, 0x13, 0xeb, 0x2f, 0xb1, 0x97, 0xae, 0x79, 0x3b, 0x99, 0xa1, 0x8f, 0x99, 0x5b, 0x79, 0x63, 0x28, 0x50, 0x8c, 0x4b, 0x4c, 0xd8, 0x42, 0x76, 0x36, 0x65, 0xca, 0xe7, 0x35, 0xcd, 0xa1, + 0x59, 0xb8, 0xdd, 0x4c, 0xa1, 0xed, 0xf6, 0x4d, 0x2f, 0xa8, 0x1a, 0x77, 0x86, 0x4a, 0x59, 0x99, 0x6a, 0x26, 0xdf, 0xa1, 0xac, 0x7f, 0x8e, 0x7d, 0x8a, 0x73, 0x97, 0xc7, 0xb5, 0x8a, 0x1e, 0x62, + 0x2f, 0x62, 0x56, 0xdb, 0x44, 0xeb, 0xb3, 0x43, 0x56, 0x9c, 0x5c, 0xd1, 0xdc, 0x06, 0xeb, 0x7d, 0x02, 0x3e, 0x90, 0x09, 0x76, 0x87, 0x6b, 0xe4, 0x0e, 0x72, 0x6d, 0xe5, 0x78, 0xb3, 0xd4, 0xba, + 0xe7, 0xea, 0x85, 0xfe, 0x21, 0x9e, 0x31, 0x8e, 0xbd, 0x89, 0xbd, 0x22, 0xf7, 0x7a, 0x72, 0x8d, 0xd4, 0x7b, 0xc0, 0x34, 0xa6, 0x46, 0x67, 0xab, 0x68, 0x53, 0x2d, 0xb1, 0xf7, 0x41, 0xbc, 0x3c, + 0x4f, 0x47, 0xd2, 0x88, 0x1d, 0xdc, 0xd0, 0xd5, 0x23, 0x46, 0xac, 0xa1, 0x90, 0x6b, 0xa9, 0x03, 0xab, 0x97, 0x90, 0xed, 0xf4, 0x12, 0xee, 0x4e, 0x60, 0x00, 0x49, 0x49, 0x44, 0x78, 0xd9, 0xae, + 0x8c, 0x26, 0xd8, 0xb4, 0x4b, 0x24, 0xc1, 0x35, 0xab, 0x34, 0xb2, 0xea, 0x64, 0xf7, 0x9a, 0xa8, 0xed, 0xc7, 0x35, 0xba, 0xc6, 0x1e, 0x4a, 0x44, 0x78, 0xf7, 0x53, 0x5f, 0x2a, 0x64, 0xdc, 0x85, + 0x05, 0xff, 0x07, 0x9e, 0xff, 0x5f, 0xe0, 0xf2, 0x2a, 0xff, 0x23, 0x3e, 0x2f, 0x17, 0x67, 0x37, 0xf1, 0x3f, 0x03, 0xa5, 0xe5, 0x59, 0x4a, 0x4e, 0x22, 0xbd, 0xdd, 0x4d, 0x4b, 0x56, 0x76, 0x97, + 0x40, 0x13, 0xd4, 0x92, 0x55, 0x41, 0xb1, 0xd1, 0xd2, 0xdb, 0xc9, 0xe8, 0x06, 0xb3, 0x4f, 0x96, 0x16, 0x45, 0x8e, 0x21, 0xb8, 0x77, 0xa3, 0x8e, 0x3c, 0x86, 0x05, 0xe2, 0x8c, 0x27, 0x9b, 0x8f, + 0xf0, 0x1c, 0x72, 0xd6, 0x92, 0x80, 0xad, 0x4e, 0x71, 0x7b, 0xec, 0x6d, 0x94, 0x65, 0x98, 0x51, 0x1d, 0x10, 0x86, 0xcd, 0xd8, 0xe7, 0x16, 0x91, 0x17, 0x4b, 0xcd, 0x8b, 0x3f, 0xf3, 0x1b, 0xcd, + 0xe9, 0xc3, 0x50, 0xfb, 0x1c, 0xc4, 0xfe, 0xb1, 0x17, 0x0a, 0x77, 0x98, 0x39, 0x79, 0x55, 0xdd, 0xa7, 0xe5, 0x7f, 0x8e, 0x5e, 0xec, 0xbd, 0xe0, 0x0b, 0xf0, 0xef, 0x4e, 0x1f, 0xa5, 0x19, 0x73, + 0x44, 0xc3, 0x51, 0xb5, 0x3e, 0xa0, 0xdb, 0x0d, 0xad, 0x87, 0xd8, 0x5c, 0x09, 0xd6, 0x0a, 0x3d, 0xee, 0x56, 0x1c, 0x1a, 0x4a, 0x11, 0x6c, 0x86, 0xd3, 0x9c, 0x29, 0x4e, 0xe1, 0x09, 0x6d, 0x6c, + 0x53, 0xec, 0x75, 0x06, 0x9b, 0xcb, 0xd3, 0x56, 0x40, 0xf7, 0x85, 0xc8, 0xef, 0x84, 0x21, 0x40, 0xca, 0xbe, 0x44, 0x92, 0xdd, 0xce, 0xb4, 0xb8, 0xfd, 0xa9, 0x9f, 0x97, 0x42, 0x88, 0x45, 0x47, + 0x1a, 0x7a, 0x0e, 0xf1, 0xeb, 0xcf, 0xf7, 0x86, 0xa2, 0xf2, 0xea, 0x0b, 0x2c, 0xef, 0xfc, 0xce, 0x5f, 0x82, 0xf3, 0xae, 0x8f, 0xbe, 0x04, 0x3a, 0xcf, 0x42, 0xb7, 0xfe, 0x71, 0x42, 0xbd, 0x89, + 0x76, 0xbc, 0xdf, 0x96, 0x99, 0x7b, 0x8e, 0x20, 0xe2, 0x93, 0xec, 0xd7, 0x7e, 0xf8, 0x75, 0xe5, 0x51, 0xba, 0x08, 0xb0, 0x39, 0x56, 0x86, 0x48, 0x93, 0x92, 0xb4, 0x85, 0x33, 0x75, 0x71, 0x1e, + 0x50, 0x2c, 0x50, 0x8b, 0x52, 0x6f, 0xc7, 0x1d, 0x0b, 0x30, 0xc7, 0xcd, 0xee, 0x98, 0x6d, 0x55, 0x9e, 0xc5, 0x2a, 0x66, 0x3c, 0x87, 0xd8, 0xd0, 0x82, 0x8d, 0x7f, 0x4e, 0x4b, 0xd8, 0x83, 0x9d, + 0xad, 0xd2, 0x2b, 0x53, 0x6f, 0x9e, 0x73, 0x4c, 0xe0, 0xc7, 0x43, 0x08, 0x54, 0xa1, 0xc3, 0xc7, 0x66, 0xdc, 0x63, 0x21, 0xfe, 0xd0, 0xb6, 0xe9, 0x0e, 0xf0, 0xf7, 0x34, 0xa3, 0x27, 0x07, 0xea, + 0xe7, 0x37, 0xfc, 0x42, 0xea, 0xe3, 0xf5, 0x47, 0x6b, 0x67, 0x39, 0x76, 0xb9, 0x69, 0xb3, 0x5a, 0xd6, 0xb2, 0x9d, 0xb0, 0x22, 0xb8, 0xe0, 0x74, 0xd8, 0xd7, 0x7b, 0x6f, 0x83, 0x6f, 0x40, 0x7e, + 0xbe, 0x2a, 0xc6, 0xd4, 0x9e, 0xca, 0xa3, 0x8c, 0xb6, 0x7c, 0x2f, 0xd0, 0xbc, 0x09, 0xcb, 0x18, 0x05, 0xe7, 0x9a, 0x95, 0xfb, 0xe5, 0x86, 0xcc, 0x44, 0xe2, 0x04, 0x91, 0x43, 0xa2, 0xf7, 0x06, + 0x21, 0x05, 0xb2, 0x2b, 0x23, 0x5b, 0xcf, 0xd5, 0x06, 0xd0, 0xe4, 0xb0, 0xe7, 0x54, 0x85, 0xaf, 0xe3, 0xeb, 0x1b, 0x26, 0xab, 0xa7, 0x06, 0xed, 0xc7, 0xe7, 0xef, 0xf6, 0xc8, 0x13, 0xe6, 0xe9, + 0x4f, 0xd2, 0x5f, 0x7b, 0xe3, 0xdd, 0xa5, 0x5b, 0x47, 0x3c, 0x60, 0xa7, 0xae, 0x2a, 0xe0, 0x74, 0x3a, 0xe8, 0x8d, 0x12, 0x88, 0x98, 0xb8, 0xb1, 0x75, 0x35, 0x5c, 0xac, 0xc9, 0x41, 0x43, 0x97, + 0xf9, 0x9c, 0x69, 0xdb, 0x35, 0x41, 0xe3, 0xd1, 0x06, 0x28, 0xc1, 0x01, 0xc6, 0x23, 0x24, 0xca, 0xc2, 0xd1, 0x39, 0x73, 0xf6, 0xa0, 0x42, 0xf3, 0x4d, 0x05, 0x69, 0x65, 0x72, 0xe0, 0xd5, 0x1a, + 0x0b, 0xb1, 0xa4, 0xd9, 0xb0, 0x7a, 0x79, 0xf4, 0xc8, 0xd3, 0xc6, 0x49, 0x0c, 0x6d, 0x7c, 0x6c, 0xe4, 0xbe, 0x10, 0x30, 0x7d, 0xaf, 0xbf, 0x3e, 0x65, 0x65, 0xbb, 0x8a, 0xbc, 0xa2, 0x71, 0x39, + 0x98, 0x61, 0x8f, 0x59, 0xd5, 0x54, 0x27, 0x72, 0x76, 0xa2, 0x16, 0x67, 0x95, 0x10, 0xaf, 0x09, 0x89, 0xd7, 0x29, 0xb4, 0x74, 0x36, 0x7b, 0x82, 0xdb, 0x9c, 0x4f, 0x9c, 0x10, 0x9f, 0x08, 0xc4, + 0xa0, 0x2c, 0xbc, 0x35, 0x98, 0x53, 0x37, 0x1f, 0x5d, 0x56, 0x3e, 0xf5, 0x8b, 0xcd, 0x9e, 0x2b, 0x37, 0xee, 0x2e, 0xf2, 0xe0, 0xd3, 0x51, 0x2b, 0x92, 0x88, 0x85, 0x34, 0xa3, 0xa0, 0x99, 0xa0, + 0xa2, 0xdd, 0x85, 0x68, 0x6c, 0xb0, 0xa3, 0xf6, 0xd5, 0x54, 0x5f, 0x54, 0x61, 0xd6, 0xf8, 0xb3, 0xe8, 0x7e, 0x64, 0xe1, 0x33, 0x3c, 0x13, 0xbf, 0xc4, 0x5e, 0xdb, 0xfd, 0x7a, 0x72, 0x35, 0x6d, + 0xfc, 0xe0, 0xa8, 0x81, 0x67, 0x4b, 0xd1, 0x3a, 0xd8, 0x88, 0x91, 0x27, 0xc7, 0x93, 0x24, 0xb9, 0x8b, 0xd3, 0x96, 0x31, 0xa6, 0x76, 0xed, 0x14, 0x7e, 0xd8, 0x3f, 0xd0, 0x81, 0x8d, 0xd5, 0xb4, + 0xb5, 0x77, 0x7f, 0x46, 0x7e, 0x6a, 0xb6, 0x79, 0x11, 0x7a, 0x69, 0xcc, 0xcb, 0xe1, 0x75, 0x17, 0xfb, 0xc0, 0x9c, 0xa2, 0xf4, 0xc2, 0x62, 0x6e, 0x82, 0xa4, 0x54, 0x71, 0x10, 0x51, 0x19, 0xfc, + 0x76, 0x5a, 0xef, 0x13, 0x6b, 0x0d, 0x24, 0x24, 0x1a, 0xf6, 0xc5, 0x54, 0x97, 0xca, 0x76, 0x7d, 0xb6, 0xf7, 0xbc, 0x7d, 0x74, 0x78, 0x86, 0x70, 0x44, 0x2b, 0xa7, 0x90, 0xa3, 0xa5, 0x79, 0xbe, + 0xa4, 0xcb, 0xdd, 0x12, 0xf1, 0x45, 0x1a, 0x5b, 0x44, 0xad, 0x71, 0x58, 0x65, 0xee, 0x81, 0x14, 0xc0, 0xf4, 0x48, 0xdb, 0xb1, 0xfb, 0xd5, 0x48, 0xfc, 0x39, 0x08, 0xfc, 0xfb, 0xae, 0x7c, 0x6a, + 0x35, 0xfa, 0x20, 0xfa, 0x8a, 0xc0, 0xfb, 0x0b, 0x8f, 0x86, 0x56, 0x04, 0xb1, 0xa2, 0x53, 0x2a, 0xac, 0x45, 0xbb, 0xb5, 0x4b, 0xf1, 0x35, 0xb3, 0x43, 0x46, 0x19, 0xec, 0x35, 0x6d, 0xb0, 0xf2, + 0x62, 0x55, 0x2f, 0x96, 0x2a, 0xac, 0xfb, 0xf1, 0x9e, 0x5a, 0x00, 0x11, 0x04, 0x50, 0xf8, 0x6e, 0xc1, 0x16, 0x45, 0x03, 0x13, 0x4e, 0x05, 0x6b, 0xc1, 0x99, 0xe0, 0xb6, 0xb6, 0x8d, 0xe5, 0xb1, + 0x4a, 0xec, 0xcb, 0x84, 0x58, 0x8a, 0x11, 0xd0, 0xb6, 0x05, 0xd8, 0x73, 0xde, 0x03, 0x8e, 0x87, 0x8f, 0xde, 0xed, 0xbf, 0xff, 0x8b, 0xff, 0xc6, 0xab, 0x79, 0x8b, 0x24, 0xbc, 0xee, 0xad, 0x7e, + 0x33, 0x03, 0x3c, 0xf1, 0x35, 0xbc, 0x13, 0xfc, 0x06, 0xe0, 0xed, 0xf4, 0x3a, 0x1b, 0x3c, 0xe0, 0xba, 0xec, 0xb9, 0x51, 0x56, 0xe4, 0x22, 0xda, 0x41, 0xf5, 0xb6, 0x20, 0x90, 0x55, 0x75, 0x30, + 0x5d, 0xb6, 0x8e, 0xf6, 0x3b, 0xad, 0xb6, 0x0a, 0x3c, 0x57, 0x84, 0x30, 0xd8, 0x04, 0x2d, 0xc1, 0x92, 0xbb, 0x93, 0x08, 0xce, 0xa3, 0xed, 0x92, 0x50, 0x47, 0xaf, 0xe3, 0x81, 0x46, 0x6f, 0xc5, + 0xb2, 0xca, 0xce, 0x54, 0x04, 0x3a, 0x03, 0x77, 0xd4, 0x46, 0x4d, 0xed, 0xbb, 0xc3, 0xb1, 0x0a, 0x43, 0x73, 0x02, 0x9f, 0x8b, 0x73, 0xf6, 0xd2, 0x3c, 0x0a, 0xdf, 0xed, 0x51, 0xa9, 0x3f, 0xdf, + 0xa3, 0xbe, 0x5f, 0xc3, 0xae, 0x21, 0xd1, 0x2f, 0x46, 0x83, 0x9b, 0x67, 0xe8, 0x4e, 0xc4, 0xed, 0x0d, 0xb6, 0x77, 0x41, 0xc9, 0x4d, 0x15, 0xde, 0xdb, 0xce, 0xc2, 0x4f, 0x05, 0x83, 0x7d, 0xfb, + 0x86, 0xb7, 0x0e, 0xfb, 0x74, 0xfd, 0xea, 0x1d, 0x79, 0x60, 0x29, 0xb3, 0xf1, 0xb1, 0xb2, 0x13, 0x74, 0xa9, 0x6f, 0xa3, 0x8d, 0xd5, 0xce, 0xa5, 0x2a, 0x26, 0x55, 0x48, 0x51, 0x0c, 0x47, 0x35, + 0x5c, 0x01, 0xeb, 0xd9, 0xc3, 0xc9, 0x2a, 0xf3, 0xa5, 0x7c, 0xc0, 0x21, 0x9a, 0x5e, 0xa1, 0xdc, 0xb2, 0x35, 0x54, 0xe8, 0x68, 0x28, 0x82, 0xb4, 0xa6, 0x25, 0xd2, 0x3a, 0xe5, 0xc2, 0x5e, 0xa7, + 0xc8, 0x0d, 0x77, 0x0c, 0xdc, 0xbd, 0x72, 0xda, 0x4a, 0xe8, 0x39, 0x74, 0x12, 0xee, 0xb9, 0x9e, 0x7b, 0x3e, 0x1a, 0xfa, 0xad, 0x2c, 0xd3, 0x6f, 0x3f, 0x9d, 0x4f, 0x08, 0x79, 0x77, 0xbd, 0x34, + 0x4f, 0xda, 0xcc, 0xef, 0xbc, 0xe4, 0x5e, 0x0f, 0x79, 0x99, 0xfb, 0xa8, 0x2d, 0x7d, 0x9c, 0x0f, 0x74, 0xd4, 0xc3, 0x12, 0x82, 0x2e, 0xfa, 0x98, 0x5a, 0x75, 0xc7, 0xc2, 0x19, 0x79, 0x44, 0xd8, + 0x56, 0x70, 0x44, 0xf6, 0x3b, 0x74, 0xee, 0x03, 0x31, 0x91, 0x74, 0x4a, 0x76, 0xd8, 0x4f, 0x40, 0x3a, 0xcd, 0x69, 0x76, 0x9a, 0x0b, 0x86, 0xe4, 0x25, 0x4c, 0x8c, 0x21, 0xb1, 0x38, 0x11, 0x40, + 0x99, 0x50, 0x43, 0xe4, 0x73, 0x54, 0x6e, 0x4c, 0x23, 0x1a, 0x2d, 0x24, 0x5c, 0x56, 0xef, 0x69, 0xca, 0x3f, 0x74, 0xd2, 0x57, 0xf3, 0xfa, 0xa7, 0xb2, 0xa9, 0xf7, 0xfb, 0xf0, 0xf1, 0xae, 0xa9, + 0x1b, 0xeb, 0xb7, 0x7c, 0x9d, 0xff, 0x52, 0xe7, 0x5c, 0x5f, 0x73, 0xaf, 0x7b, 0xae, 0x37, 0x1f, 0xed, 0xa0, 0x28, 0x20, 0xbc, 0x39, 0x85, 0x89, 0x4b, 0xbf, 0x1b, 0x0e, 0x38, 0xd4, 0xb8, 0x06, + 0x92, 0x29, 0x66, 0x96, 0xd3, 0x38, 0x98, 0xf2, 0x6b, 0x4e, 0x54, 0x56, 0xb2, 0xdf, 0x53, 0x0d, 0x3e, 0x8e, 0x4d, 0x9c, 0xab, 0xf5, 0x4e, 0x11, 0x86, 0x6e, 0x0b, 0xae, 0xd0, 0x79, 0xd9, 0xc2, + 0x35, 0x03, 0x89, 0x8d, 0xb6, 0x45, 0x45, 0x1a, 0xd2, 0xcf, 0xdc, 0x21, 0x75, 0xb4, 0x7e, 0x0a, 0x7b, 0xa3, 0x35, 0x9f, 0xdb, 0x55, 0xfe, 0xff, 0xd1, 0x41, 0xc5, 0xef, 0xcc, 0xa6, 0xc4, 0x93, + 0x3a, 0xcb, 0xab, 0xd8, 0x97, 0x0e, 0xb8, 0x9d, 0xcc, 0x88, 0xc7, 0xf4, 0x16, 0x03, 0xa5, 0x4e, 0xd2, 0x61, 0xe3, 0x94, 0xf1, 0xba, 0xa2, 0x8b, 0x75, 0x26, 0xcf, 0xbb, 0xf6, 0xa0, 0xa7, 0x65, + 0xdb, 0x76, 0x78, 0xae, 0x8b, 0x5c, 0xc1, 0x7a, 0x47, 0xc2, 0x62, 0xab, 0x0a, 0xcd, 0x51, 0xd6, 0x99, 0x2f, 0x92, 0x93, 0x45, 0xec, 0x96, 0xbe, 0x7a, 0x10, 0xe9, 0xcc, 0x1e, 0x58, 0xd6, 0x5c, + 0x03, 0x20, 0x94, 0xe7, 0x5b, 0x92, 0xab, 0xa4, 0x56, 0x3d, 0x4c, 0x8d, 0xea, 0x3e, 0xfb, 0x45, 0x5c, 0x7f, 0xf6, 0xaf, 0xf5, 0x06, 0xff, 0xfd, 0x12, 0xf1, 0x2e, 0xbf, 0xe6, 0x5f, 0x34, 0xc4, + 0xbf, 0x13, 0xfc, 0x06, 0xe7, 0x4b, 0xc2, 0xcf, 0x83, 0x66, 0xf9, 0xc4, 0xda, 0x1d, 0x2d, 0x74, 0x67, 0x03, 0x27, 0xb9, 0xb0, 0x68, 0x82, 0xa9, 0xbd, 0x4d, 0xb0, 0x26, 0x5d, 0xfd, 0x54, 0x6e, + 0x8e, 0xfe, 0x4e, 0xa2, 0x15, 0xc6, 0x5a, 0xd9, 0xa1, 0x0b, 0xba, 0x95, 0x18, 0x9c, 0xc3, 0xe6, 0x6c, 0xc4, 0x2d, 0x98, 0x78, 0xcd, 0x5e, 0x2d, 0x45, 0x7d, 0x9d, 0x6b, 0x27, 0x68, 0xda, 0x6e, + 0x55, 0x3b, 0x2a, 0xdc, 0x0d, 0xd2, 0x00, 0x8d, 0x11, 0x61, 0xb6, 0xbc, 0x57, 0x9e, 0xdb, 0x5c, 0xa6, 0x61, 0xf6, 0x3e, 0x09, 0xe9, 0x77, 0xd6, 0xcf, 0xb6, 0xf0, 0x2a, 0xeb, 0x7c, 0x1f, 0x4e, + 0xea, 0xb9, 0xed, 0xc1, 0x9b, 0x58, 0x70, 0xf6, 0xee, 0x64, 0x46, 0xfd, 0xbc, 0x3d, 0xb8, 0x40, 0x99, 0x2f, 0x69, 0xc0, 0x12, 0x6a, 0x3a, 0x9a, 0xa6, 0x28, 0x15, 0xf1, 0x85, 0x28, 0x2d, 0xa5, + 0xf5, 0x01, 0x30, 0xc9, 0x8d, 0x34, 0x25, 0x03, 0xc0, 0xc8, 0x15, 0x68, 0x6d, 0xfa, 0x3d, 0x44, 0xc5, 0x5b, 0x40, 0x41, 0xb0, 0x73, 0xcd, 0xa4, 0x8b, 0x03, 0xcc, 0xef, 0xfd, 0xc9, 0x82, 0x7d, + 0x0e, 0x90, 0x80, 0x03, 0x97, 0x1c, 0x17, 0xb9, 0x60, 0x16, 0x62, 0x97, 0xe7, 0x2b, 0xb0, 0x50, 0x44, 0x78, 0xf3, 0xdc, 0xd8, 0x74, 0xf2, 0xb4, 0xc8, 0xb3, 0xcb, 0x6f, 0xf7, 0xd2, 0xb0, 0x69, + 0x3e, 0x24, 0x60, 0xfe, 0x3f, 0xef, 0x1f, 0xcb, 0xe3, 0xd0, 0x8b, 0xac, 0xd7, 0x0a, 0xd2, 0xf0, 0xe7, 0xa2, 0x55, 0xaf, 0xb5, 0xb0, 0xb1, 0xcf, 0xa5, 0x4d, 0xaf, 0x8c, 0x91, 0x2f, 0x51, 0x6f, + 0x1f, 0x19, 0x9e, 0x3f, 0xb1, 0x5f, 0xfb, 0x79, 0x95, 0xfe, 0x22, 0xd0, 0xf8, 0xe2, 0x5a, 0xb8, 0xdc, 0x0e, 0xaf, 0x49, 0xb5, 0x7f, 0xbf, 0x3a, 0x16, 0x3e, 0x16, 0xd3, 0xf6, 0x9a, 0x20, 0x77, + 0x7f, 0x4d, 0x56, 0x1f, 0xe6, 0xb4, 0x34, 0xbc, 0xd5, 0xd6, 0x40, 0x3e, 0xe5, 0xa5, 0xdf, 0x58, 0xb0, 0x2e, 0x5a, 0x1b, 0xfc, 0xd9, 0x34, 0xf1, 0xb1, 0x5a, 0x2b, 0xf5, 0x27, 0xae, 0xdd, 0x57, + 0x34, 0x7e, 0x5d, 0xfa, 0xac, 0x84, 0xa3, 0x9f, 0x58, 0x10, 0x1e, 0x1d, 0x77, 0x57, 0xc9, 0xe0, 0xec, 0xf6, 0x77, 0x76, 0x95, 0xf3, 0x98, 0xf7, 0x56, 0x52, 0xb4, 0xf5, 0xa6, 0x3d, 0xa8, 0xa8, + 0xc7, 0x34, 0xf2, 0x4e, 0xea, 0x32, 0xc1, 0x20, 0x77, 0x4e, 0xec, 0x35, 0x70, 0x04, 0x35, 0xb8, 0xd8, 0x8a, 0xf5, 0x7a, 0x92, 0xa4, 0xa9, 0xf6, 0x62, 0x06, 0x47, 0xcc, 0x84, 0x2a, 0x55, 0x7f, + 0xbd, 0x95, 0x56, 0x61, 0xdd, 0xeb, 0xe5, 0xb6, 0xdb, 0x68, 0xec, 0x69, 0x23, 0x9e, 0x75, 0x80, 0x64, 0xc1, 0x8e, 0x16, 0x84, 0xc0, 0x0b, 0xfa, 0xc1, 0x8f, 0xdf, 0x7f, 0xbc, 0x7f, 0x7d, 0x3f, + 0xea, 0xfe, 0xba, 0x3b, 0xf2, 0xae, 0x77, 0xd2, 0xfa, 0xef, 0xb7, 0x68, 0xc2, 0x77, 0x77, 0xbe, 0xe7, 0x64, 0x48, 0x3f, 0x0b, 0xb8, 0x1f, 0x91, 0xf8, 0xd7, 0x1f, 0x60, 0x9a, 0x5e, 0x76, 0xc5, + 0x69, 0xfd, 0x4d, 0x04, 0xe2, 0x5f, 0xf7, 0xd0, 0xac, 0xd9, 0x58, 0x1a, 0x80, 0x53, 0xb4, 0x6f, 0xd2, 0x05, 0xb1, 0xd7, 0x11, 0x32, 0x5f, 0x60, 0xeb, 0xe5, 0x7a, 0xc5, 0xaf, 0x69, 0xd3, 0xc4, + 0x0e, 0x98, 0x5e, 0x7a, 0xac, 0xa8, 0xd3, 0x1d, 0x41, 0x35, 0x47, 0x20, 0xb2, 0xd1, 0x2e, 0x06, 0x95, 0xd1, 0xe2, 0x34, 0x09, 0x92, 0x8e, 0xdc, 0xa8, 0x35, 0x29, 0x7f, 0xd8, 0x43, 0x36, 0x60, + 0xb9, 0xea, 0x71, 0xd5, 0xd9, 0x35, 0x2c, 0xad, 0xac, 0x0d, 0xf2, 0x10, 0x79, 0xc9, 0xff, 0x7a, 0xff, 0xf7, 0xc3, 0x24, 0xd7, 0x7c, 0x64, 0x64, 0xf8, 0xb8, 0xfe, 0xa2, 0xcf, 0xac, 0xbf, 0xaf, + 0x52, 0x5f, 0xa7, 0xb8, 0xcb, 0xf1, 0xec, 0x2a, 0xeb, 0xe7, 0x19, 0x2e, 0x50, 0xf2, 0x40, 0xf0, 0xb6, 0x7e, 0x0c, 0x3a, 0x0b, 0x8c, 0xa2, 0x87, 0xc2, 0x02, 0x7b, 0x8c, 0x0a, 0xe2, 0x46, 0x22, + 0x4c, 0x4b, 0x29, 0x75, 0x1b, 0x92, 0x4f, 0x78, 0xc5, 0x77, 0x1a, 0x44, 0x93, 0x85, 0xa5, 0xd4, 0x4b, 0x15, 0x95, 0xf1, 0x69, 0x74, 0x27, 0xa3, 0xaa, 0x13, 0x71, 0xd7, 0x44, 0xe0, 0xd9, 0xc5, + 0xa8, 0x72, 0xc0, 0x31, 0x28, 0xe2, 0x1a, 0xa7, 0x26, 0x3a, 0x16, 0xf6, 0x9f, 0x5c, 0x2c, 0x7e, 0x37, 0x31, 0x7c, 0x58, 0x1f, 0x6e, 0x5b, 0xc1, 0x7b, 0x5a, 0xce, 0xbd, 0x1a, 0xee, 0x1f, 0x43, + 0x21, 0x9f, 0x32, 0xb0, 0xfd, 0x50, 0xbb, 0x9d, 0x7c, 0xcc, 0xe0, 0x56, 0x16, 0xf4, 0xa2, 0x53, 0x92, 0x79, 0xdd, 0xb4, 0xe2, 0xa6, 0xf3, 0xb8, 0x3a, 0x23, 0x37, 0x99, 0xb3, 0x53, 0xba, 0x0e, + 0x87, 0xe0, 0x72, 0x6b, 0x39, 0xdc, 0x24, 0x27, 0x22, 0x08, 0xf0, 0xfd, 0xe0, 0xcc, 0x01, 0xa8, 0x44, 0x7a, 0x7e, 0xec, 0x30, 0xc6, 0xef, 0x1a, 0x0a, 0x02, 0x19, 0x29, 0x43, 0x8a, 0x52, 0x5c, + 0xd6, 0x3b, 0x97, 0x09, 0xf3, 0xb3, 0xce, 0x2a, 0x73, 0x40, 0xec, 0x7a, 0xe5, 0x39, 0x15, 0xf3, 0x43, 0xad, 0xf6, 0xdf, 0x10, 0xc1, 0xbf, 0x35, 0x34, 0x18, 0x0b, 0xaf, 0x4a, 0xc2, 0x2c, 0xfe, + 0x97, 0x3d, 0x11, 0x5f, 0xe5, 0xbf, 0x87, 0xf7, 0xd7, 0xd5, 0x47, 0x3d, 0x12, 0x4a, 0x51, 0x2f, 0xcc, 0xa4, 0xd0, 0x1c, 0xa6, 0x17, 0x25, 0x79, 0x81, 0x20, 0x16, 0xbd, 0xc1, 0x76, 0x50, 0x43, + 0xf2, 0xd4, 0x2e, 0x5d, 0x74, 0x35, 0x3d, 0xf8, 0xe2, 0x61, 0xd5, 0xa7, 0xa4, 0x23, 0xd7, 0x28, 0x5f, 0x07, 0x02, 0x4a, 0xc8, 0xd6, 0x31, 0xee, 0x5d, 0x12, 0x62, 0xb2, 0xa5, 0xa8, 0x33, 0x1a, + 0x5b, 0xd7, 0x3d, 0xe2, 0xa9, 0xb9, 0x43, 0xd1, 0x96, 0xa2, 0x1d, 0x21, 0xbd, 0xcd, 0x9e, 0x5b, 0xb9, 0xbf, 0xc1, 0xf8, 0xe3, 0xc0, 0xfe, 0x38, 0x5c, 0x5f, 0xeb, 0x4a, 0x7d, 0xdb, 0x0f, 0xcd, + 0xcb, 0xba, 0xfa, 0xfd, 0xec, 0x41, 0x3e, 0x31, 0x7b, 0x5c, 0x25, 0x82, 0xb3, 0xdb, 0xdf, 0xd9, 0x55, 0xc6, 0xcf, 0xe8, 0x9a, 0x6c, 0x9b, 0x62, 0xa4, 0x11, 0x12, 0x9c, 0x28, 0xae, 0x99, 0x15, + 0x95, 0x22, 0x08, 0xda, 0xb8, 0x38, 0x6a, 0x35, 0x01, 0xe2, 0x65, 0x1b, 0xc7, 0xe0, 0xcf, 0x22, 0x1d, 0xb1, 0x15, 0x9e, 0x9d, 0x5b, 0xca, 0x76, 0xb7, 0x0b, 0x45, 0x8e, 0x89, 0x54, 0x00, 0x7b, + 0x65, 0xdf, 0x61, 0xe3, 0x5e, 0x71, 0x36, 0x19, 0x7d, 0xc8, 0x36, 0x36, 0xbd, 0x0a, 0x2c, 0xac, 0xce, 0x6d, 0x79, 0xc0, 0xc7, 0x7b, 0xa5, 0x4b, 0x7e, 0x40, 0xd7, 0x8a, 0xba, 0xb7, 0x19, 0xe1, + 0x83, 0x9e, 0x91, 0xe4, 0xae, 0x55, 0x07, 0xff, 0x38, 0x49, 0x9e, 0x79, 0xee, 0xab, 0xff, 0x1d, 0xfb, 0x4c, 0xf7, 0xf5, 0xf2, 0x54, 0x53, 0xb5, 0xd9, 0x4b, 0x59, 0xc2, 0xcb, 0x43, 0xd8, 0xa7, + 0xc9, 0xe7, 0x7d, 0xbc, 0xc9, 0x9d, 0x6c, 0xfb, 0x77, 0xf6, 0xbc, 0xcb, 0x13, 0x9f, 0x0b, 0x68, 0x7c, 0x35, 0x3e, 0xfd, 0x51, 0x10, 0xda, 0xad, 0x95, 0xf7, 0xd6, 0x54, 0xea, 0x13, 0xe1, 0xd9, + 0xe3, 0xbd, 0x6f, 0x45, 0x1d, 0x38, 0xbb, 0xfc, 0x3b, 0xa3, 0xbe, 0xd4, 0xac, 0xfd, 0xeb, 0x5e, 0xef, 0x93, 0x32, 0x83, 0x24, 0x04, 0xc0, 0x2d, 0x0f, 0x7c, 0xef, 0x03, 0xe4, 0xbe, 0x35, 0x72, + 0xc7, 0xd6, 0x3a, 0x45, 0x72, 0xc5, 0x96, 0x40, 0xc1, 0xa6, 0x52, 0xbc, 0x23, 0xdf, 0x22, 0xdc, 0xba, 0x8f, 0xcf, 0x4e, 0x93, 0xb5, 0x36, 0x6c, 0xb5, 0xf9, 0x1a, 0x30, 0x60, 0xcd, 0x70, 0x52, + 0x68, 0x4e, 0x1f, 0xf7, 0x64, 0xd9, 0xb6, 0xb5, 0x53, 0x4d, 0x65, 0xba, 0x38, 0x58, 0xfc, 0x86, 0x06, 0x3f, 0x7a, 0xaf, 0xfe, 0xfa, 0x7e, 0x04, 0xfc, 0x75, 0x77, 0x14, 0x5c, 0xef, 0xdc, 0x28, + 0xcf, 0x3d, 0xaf, 0x98, 0x79, 0x65, 0x6b, 0xdd, 0x38, 0x43, 0x3f, 0x97, 0x6e, 0xb9, 0x3e, 0x78, 0x0d, 0xde, 0xaf, 0x9d, 0xc0, 0x4b, 0xad, 0x59, 0x53, 0x59, 0x17, 0x20, 0x7f, 0x25, 0x09, 0x43, + 0x9f, 0x9f, 0xfe, 0x3e, 0xf3, 0xfc, 0xa6, 0xd8, 0x22, 0x9f, 0x1f, 0x6e, 0xab, 0xf0, 0xe6, 0xe1, 0xb8, 0x8d, 0x81, 0x07, 0x94, 0xa5, 0x3b, 0x3f, 0xe6, 0x5e, 0x57, 0x7f, 0xfd, 0x89, 0x8f, 0x76, + 0xf5, 0x77, 0x2f, 0x02, 0x67, 0xdf, 0x5e, 0xfe, 0x86, 0xef, 0xfe, 0xaf, 0x7b, 0x83, 0x41, 0xd8, 0x53, 0xa0, 0x34, 0xcf, 0x50, 0x3d, 0xd2, 0x83, 0xad, 0x99, 0xc1, 0x09, 0x1f, 0xc4, 0x6b, 0x6b, + 0x41, 0x1f, 0x45, 0x55, 0x91, 0xf5, 0x48, 0x0b, 0x4e, 0xd8, 0x72, 0x01, 0x2a, 0x99, 0xd8, 0x51, 0x43, 0x77, 0x2e, 0x9b, 0xb2, 0x58, 0xe8, 0xf3, 0xad, 0x88, 0xa5, 0x8a, 0x3c, 0x1c, 0x06, 0x58, + 0x49, 0x72, 0xac, 0x29, 0x27, 0xaf, 0xb4, 0xa1, 0x5a, 0x4c, 0xaa, 0xd6, 0x12, 0x47, 0xd4, 0x6d, 0x9f, 0xa7, 0x71, 0x6a, 0xac, 0xdf, 0x94, 0xbb, 0x82, 0xd1, 0x27, 0xb6, 0x90, 0x17, 0x89, 0xd7, + 0xf9, 0xf1, 0x5a, 0xe5, 0xea, 0x22, 0xe2, 0xe7, 0xf9, 0x11, 0x02, 0x0d, 0x04, 0x92, 0x7a, 0x65, 0xab, 0xc6, 0xb2, 0x73, 0xa4, 0x0f, 0x21, 0xb6, 0x58, 0x1c, 0x6a, 0x40, 0x5c, 0x08, 0xa6, 0xd9, + 0x97, 0x12, 0x67, 0x85, 0x05, 0x4b, 0xaf, 0xfa, 0x02, 0x86, 0x5c, 0x79, 0x1f, 0x16, 0xa7, 0xee, 0x60, 0xf6, 0xaa, 0x4a, 0x87, 0x10, 0x6c, 0x80, 0x62, 0x9c, 0x6c, 0xd9, 0x71, 0xc3, 0xad, 0x83, + 0xad, 0x13, 0xe5, 0x4e, 0x0c, 0x30, 0x5c, 0xb6, 0xf4, 0xf9, 0xc5, 0xfa, 0xb9, 0x15, 0xfe, 0xe3, 0x07, 0xf1, 0x5f, 0xf8, 0xf3, 0x6e, 0xee, 0x66, 0x45, 0x72, 0x5f, 0x6e, 0x7e, 0x9a, 0xd8, 0xdc, + 0xbc, 0x09, 0xcf, 0x59, 0x7e, 0x2b, 0x0b, 0xf4, 0x5f, 0xe8, 0xb3, 0x52, 0xe6, 0xe7, 0xd5, 0xcc, 0xb3, 0x6e, 0x3c, 0x36, 0xff, 0xbd, 0x6c, 0xa8, 0x3f, 0xd6, 0x40, 0x6e, 0xb3, 0x5b, 0xe1, 0xdf, + 0x57, 0x13, 0xd6, 0xd7, 0x97, 0xbf, 0xe6, 0x62, 0xfe, 0x97, 0xbc, 0x96, 0x34, 0x7c, 0x77, 0x27, 0xb0, 0xea, 0xb7, 0x9f, 0xf4, 0x41, 0x6a, 0x98, 0x05, 0x5e, 0x15, 0xde, 0x28, 0x8c, 0xfe, 0x8b, + 0x7c, 0xb0, 0x20, 0xde, 0x3c, 0x02, 0x6f, 0xf6, 0x9b, 0xeb, 0xff, 0x7d, 0x4f, 0x3c, 0xf7, 0x77, 0x1a, 0x66, 0x61, 0x1a, 0xde, 0x38, 0xa8, 0xfe, 0x7b, 0xd9, 0x44, 0x7c, 0xb8, 0xfb, 0x35, 0x58, + 0xf8, 0xbf, 0xf0, 0x87, 0xbc, 0xa1, 0x5f, 0x63, 0xe6, 0xb5, 0x35, 0x5f, 0xef, 0xbe, 0x24, 0xcd, 0x5f, 0xe0, 0xf8, 0x76, 0x91, 0xf8, 0xea, 0x55, 0xb8, 0xfd, 0x92, 0x8f, 0xd5, 0x9d, 0x3f, 0xa5, + 0xa8, 0x53, 0x77, 0x94, 0x81, 0x37, 0x72, 0xf6, 0xef, 0x86, 0x3b, 0xf4, 0x54, 0xea, 0xd7, 0x8b, 0xcc, 0xcb, 0x80, 0xbf, 0x1d, 0xcd, 0xa0, 0xc7, 0x12, 0xbe, 0x00, 0x16, 0xe2, 0xf9, 0x73, 0x14, + 0xe5, 0xf3, 0xa5, 0xa9, 0x23, 0x7b, 0xdf, 0xed, 0x24, 0x7f, 0x03, 0xec, 0x39, 0x9e, 0xae, 0x86, 0x44, 0x3f, 0x18, 0x9e, 0x83, 0x33, 0x96, 0x64, 0x48, 0xb0, 0xef, 0x11, 0xdb, 0x31, 0xf0, 0x21, + 0xd0, 0x3f, 0xa4, 0x3b, 0xc8, 0x5e, 0x87, 0x26, 0xbc, 0xa6, 0x96, 0x47, 0xc2, 0x61, 0xf5, 0x04, 0xe1, 0x8b, 0xa4, 0x91, 0x8b, 0x66, 0x8a, 0x74, 0x4e, 0x5b, 0xc5, 0xdc, 0x03, 0x6e, 0x37, 0x3b, + 0xcc, 0x9a, 0xca, 0xbb, 0x19, 0x3f, 0x6f, 0x26, 0xd2, 0xef, 0xb1, 0xf2, 0x86, 0x66, 0xf6, 0x3b, 0xed, 0xe9, 0x39, 0x22, 0xa5, 0x5f, 0x62, 0x2f, 0x88, 0xbd, 0x9d, 0x3c, 0x42, 0xa2, 0x04, 0xcf, + 0x7c, 0x98, 0xcc, 0xb7, 0x04, 0xb1, 0x50, 0xcf, 0xfe, 0x82, 0xee, 0x78, 0xff, 0x90, 0x1f, 0x6b, 0x89, 0x02, 0x12, 0x87, 0x97, 0x7f, 0x76, 0x3f, 0x7f, 0xae, 0xa3, 0xf5, 0xef, 0xe9, 0xe2, 0x1f, + 0x24, 0x5f, 0x9a, 0xf5, 0xfe, 0xfc, 0x51, 0xfd, 0x3b, 0xb6, 0x98, 0x32, 0x85, 0x99, 0xd5, 0x71, 0x5e, 0x14, 0xa8, 0xa0, 0xf7, 0x0a, 0x85, 0x52, 0x88, 0xb6, 0xb1, 0xb3, 0x42, 0xcf, 0x94, 0x58, + 0x98, 0x0f, 0xac, 0x30, 0x77, 0xe5, 0x06, 0x5d, 0x22, 0x80, 0x9b, 0xea, 0xa1, 0x46, 0xe9, 0xf0, 0x41, 0xec, 0xd3, 0xb5, 0x38, 0x2c, 0x56, 0xd5, 0x4a, 0xc6, 0x48, 0xd1, 0x0e, 0xcc, 0x39, 0xb1, + 0x23, 0xc6, 0xc0, 0x14, 0xf4, 0x76, 0xa4, 0x45, 0x9e, 0x7c, 0x64, 0x38, 0xdc, 0xa9, 0x65, 0xf6, 0xfd, 0x98, 0x78, 0xfb, 0xcc, 0xee, 0x81, 0xf7, 0xe7, 0xec, 0xfa, 0x2f, 0x32, 0x6f, 0xb0, 0x5d, + 0x8e, 0xae, 0x80, 0xfd, 0xc0, 0xaa, 0x0f, 0xcf, 0x18, 0xf7, 0xb8, 0x03, 0x89, 0x92, 0x12, 0xf4, 0xe4, 0x5c, 0xdb, 0x4e, 0xbc, 0x3a, 0xc1, 0x00, 0x93, 0x5b, 0x21, 0xe6, 0xab, 0x0f, 0x0c, 0x85, + 0x30, 0x1b, 0x7f, 0x43, 0x5f, 0x0d, 0xc3, 0x4f, 0x99, 0xf5, 0x5f, 0xa5, 0x5e, 0x9a, 0xf2, 0x72, 0x38, 0xbb, 0x89, 0xfa, 0xb9, 0xf7, 0x43, 0xe1, 0xbc, 0x6e, 0xcf, 0xa7, 0x56, 0x3e, 0x2f, 0xb9, + 0xaa, 0xf4, 0x44, 0x30, 0x2d, 0xc2, 0xe3, 0xf1, 0x9c, 0x2e, 0xeb, 0xa3, 0x04, 0x69, 0x3c, 0x31, 0x7a, 0x2d, 0xef, 0xf3, 0x35, 0x48, 0x37, 0x3e, 0x54, 0x6c, 0xc1, 0x70, 0x60, 0xcb, 0xad, 0x92, + 0x52, 0x35, 0x43, 0xf7, 0x7b, 0x47, 0x67, 0xbd, 0xb9, 0xa6, 0x75, 0x0d, 0x52, 0xb3, 0xfa, 0x16, 0x4f, 0x85, 0xd2, 0xb4, 0x4f, 0x56, 0x92, 0xee, 0xbe, 0x84, 0x94, 0x34, 0xf9, 0x4b, 0x72, 0x4f, + 0x65, 0x65, 0xe7, 0x7b, 0xdf, 0x35, 0xfe, 0x5c, 0xe3, 0x3f, 0x88, 0xbe, 0x40, 0xf0, 0xe1, 0xc2, 0x0c, 0x7f, 0x0c, 0x07, 0x02, 0x97, 0xc8, 0x70, 0x22, 0x74, 0x7c, 0x5c, 0x55, 0xb0, 0xd3, 0x3b, + 0xe7, 0x4e, 0x1e, 0x6c, 0x7b, 0xdb, 0x93, 0x6a, 0x8c, 0x9e, 0xc5, 0x11, 0x77, 0xb7, 0x6e, 0x63, 0x62, 0x15, 0xd3, 0x79, 0x7c, 0x19, 0x54, 0xee, 0x4e, 0x02, 0xf8, 0x10, 0xdc, 0x0c, 0x44, 0x33, + 0x72, 0x90, 0xb0, 0xb2, 0x01, 0x84, 0xa5, 0xc7, 0xcc, 0xa3, 0xf7, 0xbb, 0x90, 0x2d, 0xab, 0x05, 0x43, 0x1f, 0x84, 0x98, 0xaa, 0x9f, 0xb3, 0xae, 0x84, 0xf5, 0x2c, 0x6b, 0x53, 0xdb, 0xfb, 0x79, + 0x8b, 0x99, 0x87, 0xae, 0x97, 0xfd, 0x36, 0x7b, 0xe3, 0xc9, 0x01, 0xf5, 0x4e, 0xf0, 0x15, 0xd1, 0x5f, 0xa7, 0x8f, 0x14, 0xc9, 0xbd, 0xda, 0xe3, 0xf1, 0xfa, 0x20, 0x71, 0xab, 0xf8, 0x0c, 0x32, + 0x5b, 0x59, 0x48, 0x37, 0x18, 0x7a, 0x82, 0xc0, 0xd6, 0xab, 0xf8, 0xaa, 0x98, 0x4e, 0x9e, 0x1b, 0xab, 0x01, 0xd5, 0xb0, 0x42, 0x67, 0x79, 0x7a, 0xe1, 0x17, 0x6d, 0x1f, 0x71, 0x5e, 0x96, 0x1c, + 0xf2, 0x01, 0x44, 0x44, 0x70, 0x79, 0x4c, 0x4c, 0xb5, 0x59, 0x79, 0xc0, 0x8e, 0x25, 0x6b, 0xdc, 0x08, 0x56, 0x13, 0x01, 0x51, 0x52, 0xb2, 0xd8, 0x28, 0x5f, 0x68, 0x33, 0x9a, 0xbc, 0xbd, 0x5b, + 0x27, 0xf4, 0x39, 0xbe, 0xad, 0xab, 0xc4, 0x6b, 0x9b, 0x5b, 0x27, 0x78, 0x94, 0x6b, 0x4b, 0x5b, 0x0e, 0x94, 0x3a, 0xe2, 0x47, 0xbe, 0x11, 0x0f, 0x4a, 0xb3, 0x2d, 0x81, 0x3d, 0x84, 0x82, 0x35, + 0xc7, 0x54, 0x3a, 0xcd, 0x6f, 0x86, 0x9e, 0x71, 0xca, 0xf6, 0x20, 0x21, 0x0e, 0x86, 0xf2, 0x1e, 0x84, 0x82, 0xf3, 0xda, 0xab, 0x22, 0x79, 0xb9, 0x9d, 0x9a, 0x48, 0x99, 0x88, 0x75, 0xbc, 0xf3, + 0xa6, 0x39, 0x03, 0x06, 0x89, 0x37, 0x2e, 0xf4, 0xe3, 0x92, 0xe5, 0xfb, 0xde, 0x54, 0xfb, 0x79, 0xf2, 0x9c, 0x09, 0x23, 0xcb, 0x8b, 0x57, 0x85, 0x08, 0xfa, 0x07, 0xbe, 0x37, 0x70, 0xaa, 0x30, + 0x9d, 0x65, 0x5e, 0x7f, 0x2d, 0x5a, 0x7d, 0x17, 0xbe, 0xa7, 0x46, 0xce, 0x7b, 0xc9, 0x17, 0x18, 0xdf, 0x9f, 0x3f, 0x1c, 0x73, 0x09, 0x4b, 0xc7, 0x7a, 0x81, 0x36, 0x46, 0xb5, 0xad, 0x79, 0x36, + 0xde, 0xc5, 0xd3, 0x66, 0x0d, 0xf4, 0xf3, 0x35, 0xb2, 0x1a, 0x07, 0x5f, 0x67, 0x73, 0x4c, 0x1d, 0x77, 0x0e, 0x56, 0xac, 0x79, 0x00, 0x58, 0xef, 0xa3, 0xac, 0x84, 0x36, 0xbb, 0x03, 0x31, 0x3f, + 0xa2, 0x7b, 0xd2, 0x05, 0xc1, 0x33, 0x57, 0xad, 0xb9, 0x7e, 0xc4, 0x90, 0xb9, 0x9d, 0xb7, 0x92, 0x57, 0x3b, 0x17, 0x5d, 0x51, 0x05, 0xee, 0x39, 0x76, 0x3f, 0xe2, 0x52, 0xcf, 0xb2, 0xfb, 0x55, + 0x4b, 0xe6, 0x4f, 0x85, 0x4f, 0xbf, 0xc8, 0xbc, 0x60, 0x71, 0x3b, 0x9a, 0xcd, 0x1f, 0x0b, 0x9a, 0x0e, 0xa4, 0xa4, 0x21, 0xcd, 0x05, 0xbd, 0x52, 0x64, 0xd6, 0x87, 0xd0, 0x3d, 0x82, 0xa3, 0x63, + 0xc3, 0x1b, 0xa8, 0xbb, 0xb1, 0x59, 0x81, 0xad, 0x16, 0xe5, 0xbc, 0xdc, 0x6e, 0x34, 0xd5, 0x98, 0xeb, 0x1b, 0x23, 0x81, 0x27, 0xb2, 0x37, 0xb2, 0xf3, 0xa1, 0x42, 0x45, 0x19, 0x1f, 0xd2, 0x36, + 0xa4, 0x72, 0x64, 0x61, 0x0d, 0xb5, 0x28, 0x0c, 0xdb, 0x29, 0xb2, 0x7c, 0x5e, 0x0d, 0xb5, 0x65, 0x0e, 0xaf, 0x9f, 0xb4, 0xdc, 0x54, 0xaf, 0x26, 0xb1, 0x4f, 0x2e, 0x1d, 0xa7, 0xf2, 0xac, 0xc6, + 0xfb, 0xb0, 0x8a, 0xc3, 0x9f, 0x9f, 0x79, 0x2b, 0x6d, 0x86, 0x7d, 0xf1, 0x2f, 0x59, 0xb1, 0x77, 0xe3, 0xe7, 0x7f, 0xfb, 0x9f, 0x9f, 0x0a, 0x94, 0x7e, 0x93, 0x58, 0x70, 0xd1, 0x13, 0xf0, 0x7f, + 0x60, 0xf2, 0xfd, 0x83, 0xe3, 0xdb, 0x07, 0x7f, 0xc7, 0x09, 0xdc, 0xd4, 0xf7, 0xc2, 0x4e, 0xa0, 0x7f, 0x90, 0x67, 0xca, 0xe8, 0x36, 0xb5, 0x7b, 0xed, 0x51, 0x77, 0x76, 0x13, 0xf0, 0x73, 0x77, + 0xd6, 0x0c, 0x50, 0x53, 0x30, 0x88, 0x58, 0x7b, 0x4c, 0x51, 0x82, 0x30, 0xa5, 0x99, 0xa6, 0x71, 0xb1, 0xa1, 0x58, 0x0a, 0xb6, 0xba, 0xd6, 0xb2, 0x7c, 0x7f, 0xd8, 0xc4, 0x60, 0x4e, 0xc5, 0x34, + 0xb5, 0x8a, 0x11, 0x34, 0x4a, 0x22, 0x4f, 0x11, 0xb4, 0xa8, 0x1e, 0xd6, 0xbb, 0x54, 0x4c, 0x0d, 0xbe, 0xe5, 0x8f, 0xc2, 0xbc, 0xee, 0x95, 0x06, 0xb6, 0x89, 0x50, 0xf7, 0x55, 0xfd, 0xe8, 0x1c, + 0xc3, 0x27, 0x79, 0x75, 0xfe, 0xe7, 0xf2, 0xeb, 0xaf, 0xdc, 0xfc, 0x4e, 0x15, 0xbe, 0x4c, 0x17, 0xd8, 0x3f, 0xd4, 0xe7, 0x88, 0x9f, 0x24, 0xcc, 0x9a, 0x97, 0x7a, 0x20, 0x8d, 0x57, 0xcd, 0xae, + 0x15, 0xf7, 0xc6, 0xef, 0xc7, 0xc1, 0x65, 0x77, 0x68, 0xdf, 0xee, 0x7d, 0xd2, 0x61, 0xae, 0xde, 0x82, 0xbc, 0xbf, 0xde, 0x9a, 0x7f, 0xde, 0x68, 0x7d, 0xac, 0x81, 0xff, 0x8d, 0xb9, 0xee, 0x23, + 0xd5, 0xf3, 0xef, 0x17, 0xc3, 0x3a, 0x09, 0xed, 0xbb, 0xab, 0xe0, 0x53, 0xb5, 0x92, 0xaf, 0x22, 0xaf, 0xdd, 0x9c, 0x84, 0xf6, 0x0c, 0x7e, 0xb0, 0x5a, 0xb2, 0x9e, 0x85, 0x28, 0x2e, 0x70, 0x53, + 0x74, 0xde, 0x57, 0xbd, 0xd7, 0x8d, 0xf5, 0xe6, 0x48, 0x2f, 0xaa, 0x86, 0x67, 0x0a, 0xa9, 0x1b, 0x3d, 0x6a, 0x3a, 0x81, 0xd0, 0x0a, 0x5b, 0x8d, 0x46, 0x86, 0xa1, 0x12, 0x09, 0x92, 0x65, 0x27, + 0xf7, 0x52, 0x30, 0x5f, 0xb2, 0xf1, 0xc6, 0xeb, 0xed, 0x7d, 0x9b, 0x9c, 0xb2, 0xc6, 0x0e, 0xcf, 0xa9, 0x73, 0x24, 0x2b, 0x57, 0x47, 0x97, 0x42, 0x3e, 0xef, 0x95, 0xdd, 0x23, 0x79, 0x38, 0xcd, + 0xad, 0xc7, 0x9c, 0x3c, 0xf3, 0xc3, 0xf3, 0xec, 0x87, 0x3a, 0x95, 0xb7, 0x00, 0xae, 0xa7, 0x20, 0xf9, 0xfa, 0x8e, 0x17, 0x8c, 0xbe, 0xde, 0x98, 0xdd, 0x5e, 0xf3, 0x33, 0x68, 0x83, 0xd4, 0xcf, + 0xa5, 0xb3, 0x20, 0xf1, 0x2c, 0x1a, 0x72, 0xca, 0x90, 0x72, 0x24, 0xa3, 0x55, 0xc0, 0xca, 0x02, 0x0f, 0x53, 0xd5, 0xf9, 0x9b, 0x26, 0x5a, 0x37, 0x38, 0xbf, 0x4c, 0x08, 0xf8, 0x1c, 0x23, 0xea, + 0x92, 0x05, 0x99, 0xe5, 0x3c, 0xa6, 0x75, 0x25, 0xea, 0x80, 0x61, 0xdc, 0xaa, 0x70, 0xa5, 0x36, 0x99, 0x35, 0xf2, 0xde, 0x5e, 0x3d, 0xed, 0x96, 0xce, 0x5e, 0xa7, 0x4c, 0x98, 0xcc, 0x98, 0xc7, + 0x40, 0x6b, 0x9b, 0xf0, 0x6e, 0x69, 0x53, 0xf4, 0x1f, 0xe4, 0x29, 0x25, 0xe2, 0x26, 0xf4, 0x0a, 0xcb, 0xf5, 0x68, 0x76, 0x13, 0xf4, 0x33, 0x0e, 0xe9, 0x86, 0xe3, 0xd0, 0x50, 0xd5, 0x79, 0x00, + 0x55, 0xd7, 0xc4, 0xc0, 0xe3, 0x31, 0x24, 0xad, 0x02, 0x4e, 0x51, 0x97, 0x9c, 0xb4, 0xa4, 0x3b, 0x10, 0x50, 0xe2, 0x95, 0x58, 0x44, 0x8a, 0x36, 0x0c, 0x03, 0x42, 0x72, 0x9c, 0xb2, 0x4c, 0xd3, + 0x05, 0x01, 0x2d, 0xe6, 0xc5, 0x59, 0x54, 0xbb, 0x7d, 0x48, 0xb1, 0x5c, 0xa0, 0xec, 0xa5, 0x55, 0x1a, 0x2d, 0x15, 0x69, 0xaa, 0x11, 0x8d, 0x14, 0x61, 0xf1, 0xb9, 0x59, 0xe2, 0xf5, 0x83, 0xba, + 0x4c, 0xcc, 0x77, 0x39, 0xc0, 0xaf, 0x64, 0xe1, 0x4e, 0xe0, 0x39, 0xf7, 0x2a, 0x39, 0x41, 0x1f, 0x0c, 0xde, 0x0f, 0x03, 0xf8, 0x26, 0xf6, 0x95, 0xb3, 0xfe, 0x7a, 0x32, 0x83, 0xbe, 0x98, 0xbe, + 0xbf, 0xff, 0x04, 0x13, 0x4f, 0xcd, 0x9d, 0x79, 0xdb, 0xb3, 0x7a, 0x19, 0x69, 0xbd, 0x6e, 0xa9, 0x47, 0x73, 0x91, 0x4e, 0x7b, 0x67, 0x6d, 0xe2, 0x14, 0x4e, 0xc9, 0x0b, 0xa4, 0xeb, 0x06, 0x58, + 0xad, 0xf0, 0x61, 0xeb, 0x84, 0x83, 0xbe, 0x95, 0x00, 0x8a, 0xcf, 0xd6, 0xcc, 0x59, 0x29, 0x12, 0x15, 0x85, 0xda, 0x9a, 0x68, 0xbc, 0xd2, 0x4d, 0xea, 0x78, 0xed, 0xb7, 0x80, 0xe5, 0x61, 0x1c, + 0x39, 0x17, 0x73, 0xef, 0x39, 0xa3, 0xde, 0x87, 0xea, 0xb9, 0x37, 0xce, 0xad, 0xdf, 0x41, 0xe9, 0xff, 0xce, 0x4a, 0x44, 0x3d, 0x33, 0x87, 0xdd, 0x21, 0xff, 0xa7, 0x1e, 0x99, 0xca, 0x30, 0xd7, + 0x9e, 0xb6, 0x53, 0xd9, 0x45, 0xcd, 0x39, 0xdc, 0xe3, 0x55, 0x0f, 0xc7, 0x78, 0xb5, 0xda, 0x34, 0xcb, 0x85, 0xc0, 0xa5, 0x6e, 0xeb, 0x06, 0xec, 0xb8, 0x5c, 0x59, 0x91, 0x00, 0xc1, 0xfe, 0x6a, + 0x0c, 0xac, 0xc5, 0x36, 0xa8, 0x73, 0x4e, 0x18, 0x89, 0x91, 0x04, 0xb6, 0xc2, 0x1c, 0xdd, 0xfa, 0xc5, 0xba, 0xe9, 0x8d, 0x79, 0x58, 0x86, 0x64, 0xcc, 0x00, 0x43, 0xcf, 0x05, 0x72, 0x2d, 0xec, + 0x1e, 0x49, 0xb9, 0xf8, 0xb0, 0x38, 0x7d, 0xbf, 0x57, 0x7c, 0x6f, 0x85, 0xfc, 0x13, 0x30, 0x6e, 0x62, 0x5f, 0xd0, 0xb8, 0x9d, 0xcc, 0xae, 0xd2, 0x7e, 0x86, 0x63, 0xb2, 0x34, 0x3a, 0x9f, 0x14, + 0x93, 0x60, 0xf8, 0x95, 0xb6, 0xd0, 0xd6, 0xd5, 0x89, 0x99, 0xe0, 0x0d, 0xb1, 0x3e, 0xe9, 0x93, 0x7a, 0xf0, 0x8f, 0x23, 0xbe, 0x56, 0xf7, 0x5a, 0x2d, 0x27, 0x2a, 0x65, 0xa4, 0xf8, 0x4e, 0x9a, + 0x7b, 0x22, 0x36, 0xc4, 0xc7, 0xad, 0x22, 0xae, 0x69, 0xb9, 0x0b, 0x64, 0x9f, 0x80, 0x27, 0x42, 0x04, 0x59, 0xa2, 0x3d, 0xf7, 0xe8, 0xe1, 0xbc, 0xc8, 0xba, 0x2e, 0x05, 0xee, 0xc5, 0x18, 0x7d, + 0x80, 0xa3, 0xcd, 0xec, 0x7c, 0x98, 0x15, 0x55, 0x98, 0x86, 0x4d, 0xf8, 0x1b, 0x0e, 0xd9, 0x67, 0x68, 0x02, 0x3f, 0xc9, 0x06, 0x67, 0x9f, 0xaf, 0x5c, 0x77, 0x7c, 0x0f, 0x98, 0x15, 0x09, 0xb8, + 0x90, 0x12, 0x9a, 0x99, 0x07, 0x38, 0x7c, 0xca, 0x2b, 0x6f, 0xdc, 0x41, 0x4b, 0xc5, 0x0b, 0x5d, 0x6f, 0x8f, 0xee, 0x19, 0x6e, 0xcf, 0x65, 0x01, 0x01, 0x9c, 0xe6, 0x3c, 0x44, 0xa1, 0x28, 0x1c, + 0x16, 0x25, 0x21, 0x53, 0xe2, 0x5a, 0x37, 0x8d, 0xb0, 0x94, 0x88, 0x0c, 0x6c, 0xec, 0xcd, 0x80, 0xd5, 0xf8, 0x76, 0xde, 0x2a, 0x81, 0x33, 0x7a, 0xc4, 0xb2, 0xb2, 0xe3, 0x70, 0x8a, 0x97, 0xcc, + 0x73, 0x1f, 0xdd, 0x0f, 0xe1, 0x98, 0x81, 0x55, 0xcf, 0xec, 0xf0, 0x1c, 0xbe, 0xd2, 0xeb, 0x7f, 0xfb, 0x40, 0x3d, 0xa6, 0x76, 0x9e, 0xfc, 0x7a, 0xe0, 0x83, 0x72, 0xd4, 0x07, 0xa1, 0x13, 0xcc, + 0xec, 0x7c, 0xf0, 0xdc, 0x0f, 0xdd, 0xf2, 0x2a, 0xeb, 0xdb, 0x0f, 0xbc, 0xcd, 0x5c, 0xcf, 0xaf, 0x2d, 0xff, 0x3e, 0xf5, 0xd5, 0x7b, 0x23, 0xf8, 0xe3, 0xfd, 0xf7, 0x22, 0xf5, 0xda, 0x73, 0x2f, + 0xc7, 0xd7, 0x4c, 0x14, 0xfc, 0xe7, 0x3e, 0xd3, 0x06, 0x51, 0xa0, 0xab, 0xba, 0x5e, 0xee, 0xa9, 0xe3, 0x41, 0x52, 0x4a, 0x01, 0x5f, 0xa5, 0x75, 0x74, 0xaa, 0xea, 0x0e, 0x5b, 0x50, 0x3a, 0x8c, + 0xec, 0xb0, 0x45, 0xb5, 0x0c, 0x43, 0x6b, 0xec, 0x50, 0x66, 0x1c, 0x59, 0xd4, 0x4c, 0xb6, 0x67, 0x62, 0x1c, 0xeb, 0xb6, 0x3d, 0x18, 0xae, 0x59, 0x9f, 0x26, 0xf4, 0xc8, 0x39, 0xc7, 0x33, 0xe2, + 0xbb, 0x20, 0xa8, 0x46, 0x2e, 0x46, 0x6f, 0x4e, 0x70, 0xf8, 0xd8, 0x88, 0x7e, 0x29, 0xad, 0x75, 0x6f, 0x20, 0xff, 0xf9, 0x9a, 0x71, 0x13, 0x79, 0x45, 0xe1, 0x72, 0xf0, 0x68, 0x25, 0xe8, 0x22, + 0x1a, 0x11, 0xdb, 0x08, 0x0e, 0x75, 0xeb, 0xf7, 0x5a, 0xc2, 0xf5, 0x92, 0x03, 0x24, 0xa8, 0x23, 0x90, 0x40, 0xdf, 0xee, 0x12, 0x8e, 0x68, 0x27, 0xc8, 0x70, 0x77, 0x2b, 0x31, 0x91, 0x19, 0x3b, + 0x21, 0xa2, 0x1c, 0x34, 0x12, 0x29, 0xc4, 0x52, 0x9b, 0xb2, 0xce, 0x6a, 0x7c, 0xa2, 0xa9, 0xe5, 0x9a, 0x3c, 0x51, 0x42, 0x3b, 0x79, 0xa3, 0x24, 0x94, 0x4a, 0x5c, 0x2f, 0xd0, 0x60, 0x6a, 0xb8, + 0x2f, 0xc9, 0x38, 0x6f, 0xde, 0xc6, 0xef, 0xdd, 0x5d, 0xcf, 0xac, 0x91, 0x37, 0x91, 0x97, 0xf6, 0x5e, 0x0f, 0xae, 0x05, 0x31, 0x1e, 0x68, 0xef, 0x12, 0x1a, 0x95, 0xe3, 0x64, 0xb8, 0x2a, 0x4d, + 0x67, 0xf3, 0x0c, 0x58, 0x63, 0x00, 0x1b, 0x60, 0xe3, 0x96, 0x69, 0xf6, 0xb2, 0x63, 0xed, 0xea, 0xd4, 0x58, 0x32, 0xf5, 0xf1, 0xc0, 0x52, 0x67, 0x50, 0xf4, 0x22, 0x6e, 0x99, 0xbb, 0xbc, 0x8c, + 0x6c, 0x37, 0xbe, 0x80, 0xda, 0x7b, 0x32, 0x52, 0x6b, 0x45, 0xcf, 0xdc, 0xbc, 0x38, 0x92, 0xe2, 0x56, 0xd7, 0x5c, 0xa3, 0x74, 0x60, 0x3f, 0x4a, 0x4f, 0xc4, 0x03, 0x09, 0xf6, 0xef, 0x4a, 0x82, + 0xbe, 0xa6, 0x2d, 0x7e, 0xff, 0x95, 0x34, 0xe1, 0x3d, 0x5a, 0x9d, 0x6b, 0x9e, 0xe0, 0x13, 0x5f, 0x48, 0x13, 0x26, 0x17, 0x98, 0x9a, 0x30, 0x99, 0xdd, 0x44, 0xfc, 0x8c, 0x52, 0x6c, 0xfa, 0x20, + 0x47, 0x04, 0xab, 0x6d, 0xa5, 0x6d, 0xb6, 0x84, 0x5e, 0x8a, 0x6b, 0x35, 0x0c, 0xf7, 0x16, 0x40, 0xce, 0xfb, 0x15, 0xc8, 0x50, 0x32, 0x20, 0xd0, 0xc2, 0x42, 0x73, 0x92, 0x78, 0x3c, 0xa3, 0x36, + 0xe6, 0x22, 0x31, 0x59, 0x43, 0x32, 0xeb, 0x15, 0x42, 0x14, 0x2e, 0x96, 0x0e, 0x60, 0x29, 0xa8, 0x00, 0x4b, 0x8b, 0x71, 0xc3, 0x93, 0x05, 0xa1, 0x3a, 0xbc, 0x41, 0xf0, 0x69, 0x95, 0x3d, 0x60, + 0x14, 0x7f, 0xef, 0x33, 0xfb, 0x0f, 0xf2, 0xc5, 0xa3, 0x56, 0xcf, 0xac, 0xea, 0xdc, 0xa6, 0xde, 0xfb, 0x99, 0xeb, 0xb3, 0x57, 0xed, 0xec, 0x65, 0x5e, 0x65, 0x35, 0x79, 0x35, 0x7b, 0x75, 0xeb, + 0xbd, 0x3d, 0x4a, 0x7e, 0x7a, 0xf4, 0xb2, 0x04, 0xba, 0x33, 0xab, 0xaa, 0xac, 0x97, 0xbd, 0xdb, 0xe7, 0x20, 0xd4, 0xdb, 0x3c, 0xf7, 0xdd, 0x63, 0xf7, 0xe6, 0xb8, 0x36, 0xbc, 0xb7, 0xd3, 0xa6, + 0xfe, 0x41, 0x9f, 0x59, 0x9e, 0xda, 0xf0, 0xb2, 0xd3, 0xbe, 0xfc, 0x99, 0x5d, 0x25, 0xfc, 0xdc, 0x77, 0x80, 0x60, 0xd4, 0x88, 0xec, 0xed, 0xb5, 0x11, 0x60, 0xb5, 0xb5, 0xb8, 0x4a, 0xe7, 0x43, + 0x96, 0x11, 0x1b, 0x9a, 0x29, 0xa0, 0x84, 0x94, 0x97, 0x0c, 0x99, 0x26, 0xd4, 0xc4, 0xab, 0xe9, 0x0e, 0x98, 0xa3, 0x32, 0x2e, 0xac, 0x21, 0x21, 0x77, 0x56, 0x55, 0xd6, 0xc7, 0xc7, 0x58, 0x3f, + 0xad, 0x85, 0x50, 0x47, 0x41, 0xbf, 0xa0, 0x09, 0xcb, 0x3f, 0x50, 0x4c, 0x60, 0x83, 0xe7, 0x89, 0x54, 0x48, 0xef, 0x8b, 0x49, 0xbb, 0xa3, 0x66, 0x4e, 0x9e, 0x16, 0x61, 0xe2, 0xbd, 0x91, 0xd8, + 0xfd, 0x7b, 0x8e, 0x9d, 0xcf, 0xc2, 0xc1, 0xd9, 0x97, 0x4b, 0x8f, 0xba, 0x77, 0x12, 0x2a, 0xa1, 0x57, 0x29, 0xef, 0xf0, 0x86, 0x19, 0x60, 0x99, 0xdd, 0x66, 0x82, 0xd9, 0xc9, 0xf4, 0xce, 0xc1, + 0x8b, 0x8e, 0x04, 0x14, 0xba, 0xb7, 0xa8, 0x12, 0xe4, 0x5d, 0x75, 0xa0, 0x5a, 0x32, 0xa9, 0xb5, 0x4e, 0x62, 0xb8, 0xb4, 0xc8, 0xdd, 0xdd, 0x62, 0x27, 0xf4, 0xf1, 0x22, 0xd8, 0xd1, 0x20, 0xe8, + 0xae, 0x0d, 0x8c, 0xe2, 0xda, 0xed, 0x2a, 0x8d, 0x1a, 0x17, 0x53, 0x4e, 0x21, 0x53, 0x3d, 0x32, 0xc5, 0xff, 0x50, 0x37, 0xec, 0x9e, 0xcd, 0xf1, 0xcf, 0xd3, 0x4c, 0x7e, 0xf7, 0xa2, 0x0b, 0x70, + 0xbf, 0xb9, 0x7d, 0xb5, 0x48, 0x3e, 0x90, 0x6a, 0xc2, 0x14, 0x5c, 0x8a, 0xa8, 0x21, 0x38, 0x08, 0x24, 0xb8, 0x91, 0x39, 0xba, 0x29, 0xcc, 0x21, 0x57, 0xb4, 0x65, 0x60, 0xce, 0x4d, 0x28, 0x2e, + 0x9b, 0xf1, 0xcc, 0x52, 0x3a, 0x7d, 0x16, 0x64, 0xca, 0x4c, 0x98, 0x6c, 0x68, 0xe5, 0x54, 0x0b, 0x22, 0x9c, 0x20, 0x22, 0xca, 0x17, 0x30, 0xba, 0x45, 0xc1, 0x5d, 0x6a, 0x07, 0x35, 0x93, 0x93, + 0xbe, 0xb3, 0xd8, 0x95, 0x58, 0x3d, 0x0f, 0x10, 0x72, 0xf5, 0x9c, 0x6e, 0xf3, 0x89, 0xe7, 0xe1, 0x1e, 0x6f, 0xc1, 0x6f, 0x28, 0x0e, 0xbe, 0xfd, 0x70, 0xaf, 0x5f, 0xfa, 0x6f, 0x14, 0x93, 0x3f, + 0xff, 0x72, 0xaf, 0x12, 0xc1, 0xd9, 0xed, 0xef, 0xa3, 0xb5, 0x18, 0x96, 0xfc, 0x16, 0x3d, 0x26, 0xf0, 0x51, 0x43, 0xa5, 0x2e, 0x21, 0xa1, 0x04, 0x1d, 0x4b, 0xd4, 0x20, 0xb0, 0x10, 0xb0, 0xfa, + 0xa2, 0xd7, 0xcb, 0x9a, 0x5d, 0x1a, 0x5a, 0x1c, 0x97, 0xfb, 0x26, 0xb3, 0xf5, 0x73, 0xb5, 0x67, 0x80, 0x31, 0x22, 0xab, 0x40, 0x83, 0xe2, 0x76, 0xc5, 0x0c, 0xd3, 0xce, 0x32, 0x74, 0x36, 0x5a, + 0x69, 0x78, 0x7e, 0xb6, 0x0a, 0x4e, 0xd8, 0xaf, 0x38, 0x61, 0x1f, 0x85, 0xf6, 0x73, 0xfb, 0xdf, 0xb0, 0xf6, 0x86, 0x5f, 0x81, 0xf1, 0xbf, 0x83, 0xed, 0x1b, 0x45, 0xf0, 0xdf, 0xd3, 0xcf, 0xbf, + 0x7d, 0xc3, 0x1b, 0xac, 0x9f, 0xae, 0x3f, 0xaa, 0xab, 0xdb, 0xbd, 0xe9, 0x76, 0xd0, 0x82, 0xe3, 0x8b, 0x22, 0x59, 0x1b, 0x08, 0x67, 0x2a, 0x3a, 0x71, 0xec, 0xc6, 0x56, 0x20, 0xf3, 0x28, 0xaa, + 0xc8, 0xa4, 0x8f, 0xcf, 0x44, 0x9a, 0x40, 0x55, 0xbe, 0x1d, 0xe7, 0x86, 0xd7, 0x1e, 0x2a, 0x72, 0x77, 0x40, 0x49, 0xa4, 0x4c, 0x04, 0x0d, 0xa6, 0x54, 0xd9, 0x98, 0xce, 0x06, 0x37, 0x9f, 0x42, + 0xd6, 0xf1, 0x2a, 0xad, 0x34, 0xc5, 0x74, 0x95, 0xcd, 0x4f, 0xc2, 0x73, 0xb6, 0xe5, 0xf0, 0x55, 0x17, 0x7f, 0x5b, 0xa5, 0xe0, 0x4f, 0xab, 0x94, 0x9d, 0xe7, 0x89, 0x67, 0x65, 0xb3, 0x5b, 0xd4, + 0xc7, 0xdf, 0xdf, 0x1a, 0x99, 0xdf, 0x7c, 0x66, 0x1f, 0x9f, 0xfa, 0xba, 0x3a, 0xbe, 0x0b, 0x0b, 0xfb, 0x12, 0x74, 0x12, 0xbe, 0x6a, 0xfd, 0x7f, 0xff, 0x52, 0xfa, 0x7f, 0xd3, 0xeb, 0x1f, 0x97, + 0xc5, 0x3b, 0x46, 0xb6, 0xf7, 0x95, 0xb9, 0xfe, 0xac, 0xcb, 0xdf, 0x89, 0x7f, 0xeb, 0xee, 0x77, 0xd7, 0x66, 0x37, 0xe1, 0x3f, 0xf7, 0x75, 0x3b, 0xe4, 0x0b, 0xbc, 0xe3, 0x55, 0x5f, 0x91, 0xdc, + 0x88, 0x6e, 0x77, 0x70, 0x80, 0xf3, 0x89, 0xe1, 0xa6, 0x47, 0xde, 0x36, 0xfc, 0x36, 0xad, 0xd1, 0x39, 0xd5, 0xa1, 0x1a, 0x1f, 0xef, 0x81, 0x10, 0xd4, 0x92, 0x26, 0x41, 0x40, 0x7d, 0x34, 0x0b, + 0x59, 0xe3, 0x6c, 0x01, 0x00, 0x9c, 0x18, 0xe7, 0x09, 0xec, 0xa0, 0xfc, 0x7f, 0x9c, 0x5c, 0xcb, 0x8e, 0xa2, 0x40, 0x14, 0xdd, 0xf7, 0xaf, 0x18, 0xc3, 0xb3, 0x05, 0x96, 0x88, 0x60, 0x2b, 0x68, + 0x8b, 0x80, 0x14, 0x2c, 0x26, 0x41, 0x50, 0x1e, 0x0d, 0x58, 0x4a, 0x15, 0x0f, 0x93, 0xf9, 0xf7, 0x09, 0x38, 0x93, 0x36, 0xa3, 0x8e, 0x8c, 0x0b, 0x42, 0xb1, 0x39, 0xa1, 0xee, 0xa9, 0x82, 0x7b, + 0x39, 0x97, 0x43, 0x84, 0xa7, 0xcf, 0x8f, 0x23, 0x02, 0x92, 0xa5, 0x66, 0xa9, 0xbb, 0x5a, 0xf6, 0x48, 0x65, 0xbc, 0xd2, 0x8b, 0xd3, 0xae, 0xc5, 0xe2, 0xea, 0xae, 0x8b, 0xfb, 0x91, 0x7f, 0x52, + 0xb0, 0x5d, 0x77, 0x2f, 0xfd, 0xb8, 0xe9, 0x5e, 0x0a, 0x0f, 0x30, 0xb8, 0xbf, 0x78, 0xda, 0x3a, 0x0e, 0x1d, 0x2e, 0x94, 0x23, 0xef, 0x9b, 0xf5, 0xbf, 0x97, 0xce, 0xbd, 0x04, 0xe7, 0x91, 0x76, + 0x56, 0x9d, 0x3c, 0x08, 0x1f, 0x13, 0xfe, 0xd2, 0x16, 0xef, 0x20, 0x5b, 0x92, 0xbb, 0x41, 0x9f, 0x4d, 0x4c, 0x0d, 0x91, 0xa1, 0x0b, 0xc9, 0x99, 0x1b, 0x1f, 0x13, 0x50, 0x2f, 0xbf, 0x1c, 0xa5, + 0x14, 0x49, 0x7d, 0x89, 0x17, 0x2a, 0x82, 0xfc, 0xf3, 0x77, 0x73, 0x8d, 0x1e, 0xff, 0x88, 0xcb, 0xbe, 0x34, 0x87, 0x0e, 0x91, 0x18, 0x5e, 0xce, 0x9d, 0x0f, 0x5b, 0x8f, 0xc7, 0x90, 0xa6, 0x3a, + 0x16, 0x15, 0x8b, 0x60, 0x0e, 0xac, 0x50, 0x04, 0xb9, 0x60, 0xad, 0x93, 0x18, 0x0f, 0x16, 0x76, 0xd4, 0x58, 0xe0, 0xa3, 0x28, 0xf7, 0x90, 0xcb, 0x7c, 0xec, 0x64, 0x42, 0x60, 0x58, 0xaa, 0x4a, + 0x12, 0x52, 0x82, 0x4e, 0x56, 0xa5, 0x88, 0xf5, 0x84, 0xa7, 0x89, 0x4c, 0xb2, 0xb7, 0x48, 0x2b, 0xa6, 0x89, 0x32, 0xf3, 0x02, 0xb2, 0x9a, 0x15, 0x87, 0x80, 0x3d, 0x9f, 0x4c, 0x51, 0xbe, 0xa9, + 0xbd, 0x1a, 0x2f, 0x4d, 0xe3, 0x87, 0x9f, 0xd5, 0x5e, 0x33, 0xa0, 0xfb, 0x8d, 0x49, 0x0c, 0xff, 0x8c, 0xfa, 0x5a, 0xcf, 0x31, 0x55, 0x30, 0x8d, 0x03, 0xb7, 0x39, 0xbe, 0xaf, 0xc6, 0x24, 0xcf, + 0x02, 0x4d, 0x36, 0xde, 0x4d, 0xf8, 0x69, 0xac, 0x45, 0xa6, 0x4a, 0x80, 0x98, 0xce, 0xec, 0x45, 0x84, 0x33, 0xfa, 0x6b, 0xed, 0x97, 0x04, 0x4b, 0x19, 0x39, 0xbd, 0xcb, 0x74, 0x32, 0x68, 0x7c, + 0xdd, 0x66, 0xb1, 0x0b, 0xb4, 0x5d, 0x52, 0xa9, 0x65, 0x38, 0x92, 0x8b, 0x72, 0x1b, 0xa4, 0x1b, 0x6d, 0xa0, 0x38, 0xb2, 0x8f, 0xb8, 0x1b, 0x5d, 0xbc, 0xf1, 0x4e, 0x61, 0xf1, 0xc4, 0x2c, 0xb9, + 0x65, 0xe8, 0xff, 0xcd, 0xb8, 0xae, 0x91, 0xbb, 0xd9, 0x7f, 0x5f, 0x0e, 0x2f, 0x90, 0xcf, 0x63, 0xd0, 0x50, 0x54, 0x3e, 0x95, 0x53, 0x73, 0xb6, 0x19, 0x48, 0x26, 0xe3, 0x96, 0x02, 0xe2, 0x36, + 0x6a, 0x3a, 0xd0, 0x99, 0xc8, 0xd4, 0x0f, 0xa6, 0xe0, 0x51, 0xfa, 0x79, 0x77, 0x8e, 0xa2, 0x74, 0xb4, 0x86, 0x34, 0x15, 0xce, 0x89, 0xd9, 0xc6, 0xb4, 0x39, 0x97, 0x69, 0x04, 0xd9, 0x06, 0x11, + 0xb6, 0xc6, 0x12, 0x6d, 0x44, 0xf9, 0x7e, 0x30, 0x01, 0xa4, 0x97, 0xa3, 0x9d, 0x0f, 0xc5, 0xca, 0x58, 0xf1, 0x7d, 0xf4, 0xdd, 0x4e, 0x27, 0xbc, 0x9f, 0x78, 0xbe, 0x22, 0xed, 0x36, 0x79, 0x1b, + 0x81, 0xbc, 0xaf, 0x0b, 0x96, 0x55, 0xb3, 0x4d, 0x38, 0xb5, 0x0b, 0x4c, 0xfb, 0x5c, 0x5c, 0x28, 0xf6, 0x8e, 0x77, 0x30, 0xe5, 0xa4, 0x78, 0x9e, 0x1d, 0x37, 0x51, 0x7d, 0x54, 0x69, 0x5f, 0x03, + 0x4b, 0x5d, 0x7c, 0x17, 0x7d, 0x89, 0xd1, 0xf7, 0xdb, 0xe9, 0x12, 0x2e, 0xb8, 0x3d, 0x26, 0x1d, 0x7e, 0x4b, 0x9c, 0xa9, 0x11, 0x04, 0x5a, 0xae, 0xd4, 0xae, 0x53, 0xda, 0x51, 0xc0, 0xec, 0xa3, + 0xb1, 0x23, 0x4c, 0xb4, 0x4c, 0x1a, 0xfd, 0xd3, 0x84, 0xf1, 0xad, 0x3d, 0x7e, 0xbe, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x8f, 0x6d, 0xa9, 0xd5, 0x6f, 0x48, 0x01, 0x00, + 0xf2, 0xad, 0x04, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x53, + 0x5f, 0x6f, 0xda, 0x3e, 0x14, 0x7d, 0xe7, 0x53, 0x5c, 0xe5, 0xa1, 0x0f, 0xa8, 0x76, 0x48, 0xe0, 0xc7, 0xaf, 0x43, 0x9a, 0xb4, 0x69, 0xeb, 0xd6, 0x07, 0xb4, 0x4d, 0x1a, 0xdb, 0x13, 0x02, 0x85, + 0xe4, 0x42, 0x8d, 0x82, 0xe3, 0xd9, 0x0e, 0x02, 0x55, 0x7c, 0xf7, 0xc9, 0x37, 0x4e, 0x6a, 0xa0, 0xad, 0x26, 0x55, 0x05, 0x7c, 0xfe, 0xf8, 0xde, 0x93, 0x93, 0xa7, 0x1e, 0x40, 0x24, 0xb3, 0x1d, + 0x46, 0x13, 0x88, 0x70, 0x8f, 0xd2, 0xb2, 0xc7, 0x4c, 0x16, 0x25, 0xea, 0xe8, 0xd6, 0x41, 0x7b, 0xd4, 0x46, 0x54, 0xd2, 0xa1, 0x03, 0x9e, 0xf0, 0x41, 0x73, 0x5a, 0xa0, 0xc9, 0xb5, 0x50, 0xd6, + 0x23, 0xb3, 0xa3, 0xc2, 0x9f, 0x74, 0x00, 0x0f, 0xb3, 0xd9, 0x0f, 0x78, 0x08, 0x1d, 0x4a, 0x91, 0xa3, 0x34, 0xe4, 0xff, 0x51, 0x65, 0xf9, 0x23, 0xb2, 0xb4, 0xb5, 0xd1, 0xa8, 0x2a, 0x23, 0x6c, + 0xa5, 0x8f, 0xd1, 0x04, 0xdc, 0x24, 0x00, 0x91, 0x3d, 0x2a, 0xe2, 0x6e, 0x84, 0x25, 0x12, 0x40, 0x54, 0xeb, 0xd2, 0x9d, 0x44, 0x3d, 0x80, 0x13, 0xe9, 0x9a, 0xcb, 0xcd, 0xb3, 0x68, 0x55, 0x8b, + 0xb2, 0x70, 0x1c, 0xa9, 0x0e, 0xc0, 0x14, 0x38, 0x93, 0x86, 0x04, 0xd6, 0xe4, 0xad, 0x8f, 0xd2, 0x68, 0xd1, 0xd8, 0x86, 0xb7, 0x03, 0x5d, 0x4b, 0x28, 0x85, 0xb4, 0x70, 0x73, 0x03, 0xed, 0xef, + 0xc6, 0xc8, 0xf3, 0x1d, 0x79, 0x52, 0x4b, 0x41, 0x0a, 0x6b, 0x98, 0xac, 0x0a, 0x04, 0xf7, 0x6f, 0xb9, 0xab, 0x8a, 0xba, 0x44, 0x13, 0xdb, 0x4c, 0x61, 0xbc, 0x12, 0x92, 0xbe, 0x80, 0xe3, 0xc7, + 0x8e, 0xcf, 0xad, 0x39, 0xf3, 0x10, 0xd2, 0xe2, 0x46, 0x67, 0x6d, 0x5c, 0xff, 0x6a, 0x15, 0xc8, 0x2e, 0x1c, 0xc3, 0x15, 0xba, 0x29, 0xc3, 0x3d, 0xae, 0xae, 0xf5, 0x62, 0x63, 0x33, 0x4d, 0xea, + 0x2f, 0xbf, 0xbe, 0x7d, 0x5a, 0x4e, 0xbf, 0x7f, 0x5d, 0x4e, 0xef, 0x7f, 0xdf, 0x4f, 0xdf, 0x0b, 0xb9, 0xae, 0x60, 0x9d, 0x65, 0x86, 0x6d, 0x0d, 0xd3, 0xb5, 0xb4, 0x62, 0x87, 0xc0, 0x63, 0x8a, + 0x23, 0x16, 0xb2, 0xc0, 0x03, 0xdf, 0x76, 0x13, 0xb8, 0xd0, 0xa8, 0x2e, 0x86, 0xe2, 0x9b, 0x47, 0x46, 0xe7, 0x71, 0xbf, 0x1f, 0xf7, 0xf9, 0xd3, 0xd6, 0xdc, 0x5a, 0xf7, 0x77, 0x38, 0xcd, 0x23, + 0x98, 0xd3, 0xac, 0x2f, 0x21, 0x8c, 0xfd, 0xa9, 0x05, 0x76, 0x0f, 0xb8, 0xc0, 0x55, 0xbd, 0xa1, 0x9d, 0xaa, 0x02, 0x77, 0x95, 0x04, 0xc6, 0x84, 0x34, 0x0a, 0x73, 0x0b, 0x3c, 0x3e, 0x4b, 0xe9, + 0x62, 0x44, 0x0a, 0x2c, 0x2f, 0x05, 0xdf, 0x9a, 0xeb, 0x69, 0xbb, 0xba, 0x14, 0xb8, 0xff, 0x8c, 0x0a, 0x65, 0x81, 0x32, 0x17, 0x18, 0xd4, 0xe6, 0x03, 0xf5, 0x84, 0x12, 0x77, 0xb7, 0x2f, 0x46, + 0x3c, 0x19, 0xfa, 0x6e, 0x76, 0x28, 0xb5, 0x88, 0x35, 0xab, 0xc6, 0xcd, 0x07, 0x53, 0x65, 0xbd, 0x11, 0xd2, 0x4b, 0xd2, 0xd1, 0x9b, 0x12, 0x95, 0x69, 0x83, 0xfa, 0x05, 0x6e, 0x83, 0x13, 0xf0, + 0x3f, 0x4f, 0xc7, 0x97, 0x00, 0xcb, 0x2b, 0xb9, 0x16, 0x1b, 0xe6, 0x4a, 0x6b, 0x85, 0x77, 0xb8, 0xe3, 0xc3, 0x2b, 0x5e, 0x33, 0xcc, 0x39, 0x6f, 0xc8, 0x83, 0x8b, 0x7c, 0xa8, 0x1e, 0x18, 0xf0, + 0x24, 0x7c, 0x1f, 0x3a, 0x49, 0x1a, 0x5a, 0x9b, 0x5a, 0xa1, 0x6e, 0x8b, 0xb6, 0x18, 0xf3, 0xe1, 0xb3, 0xe8, 0x95, 0xb0, 0x7c, 0xa7, 0x09, 0x79, 0xc7, 0x93, 0x80, 0x6f, 0xe8, 0xc5, 0x5c, 0x0c, + 0xdc, 0xf2, 0xc1, 0xe9, 0xab, 0x3b, 0x26, 0x3c, 0xb9, 0x0b, 0x7c, 0xbb, 0x40, 0x09, 0xfc, 0x8f, 0x27, 0x7c, 0x1c, 0x3e, 0xd9, 0x37, 0x1e, 0x6b, 0x37, 0x4f, 0x3a, 0xe0, 0x23, 0x9e, 0xb6, 0x8e, + 0x17, 0x15, 0xf2, 0xcb, 0xa7, 0x3c, 0x25, 0xdb, 0xde, 0xa9, 0xf7, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x1a, 0xb4, 0x30, 0x63, 0x12, 0x02, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0xb4, 0x54, 0x4d, 0x6f, 0xdb, 0x3a, 0x10, 0xbc, 0xf3, 0x57, 0x0c, 0xf0, 0x1e, 0xa0, 0xd8, 0xb0, 0xa5, 0xbb, 0xfc, 0x12, + 0x3c, 0x34, 0x0d, 0x90, 0xf6, 0xd0, 0xa4, 0x49, 0x5a, 0x20, 0x37, 0xd3, 0xd4, 0xca, 0xa2, 0x23, 0x91, 0x0a, 0xb9, 0x4a, 0xe2, 0x1a, 0xfa, 0xef, 0x05, 0x45, 0xe5, 0x1b, 0x30, 0x8a, 0x16, 0xf5, + 0xc1, 0xa6, 0x97, 0x33, 0xcb, 0x9d, 0x9d, 0x25, 0x75, 0xd3, 0x5a, 0xc7, 0xd8, 0xe1, 0xd8, 0x1a, 0xa6, 0x07, 0x9e, 0xe1, 0x92, 0x5d, 0xa7, 0xb8, 0x73, 0x54, 0x5c, 0x10, 0x77, 0xce, 0xa0, 0x47, + 0xe9, 0x6c, 0x83, 0xa4, 0x94, 0xd2, 0xcf, 0x37, 0x7e, 0xee, 0x3a, 0xc3, 0xba, 0xa1, 0x64, 0x21, 0x44, 0x36, 0x9d, 0x0a, 0x4c, 0x71, 0x6d, 0x3b, 0x87, 0xd3, 0xab, 0xab, 0x73, 0x54, 0xd2, 0x14, + 0xb5, 0x36, 0x6b, 0x94, 0x9d, 0x51, 0xac, 0xad, 0x99, 0x41, 0x9b, 0x3b, 0x7b, 0x43, 0x05, 0xee, 0x35, 0x57, 0x20, 0xa9, 0x2a, 0x38, 0xba, 0xed, 0xc8, 0x73, 0x8a, 0xab, 0x4a, 0x7b, 0x68, 0x0f, + 0x69, 0x40, 0x0f, 0xb2, 0x69, 0x6b, 0x0a, 0xd9, 0x1e, 0xa9, 0xe0, 0x4a, 0x32, 0x6a, 0xbb, 0xf6, 0xe0, 0x8a, 0xa0, 0x8d, 0xb2, 0x4d, 0x48, 0x3d, 0xd2, 0x21, 0x4d, 0x01, 0x52, 0x95, 0x25, 0x0f, + 0xcd, 0x1e, 0xda, 0xb4, 0x1d, 0x83, 0xed, 0x00, 0x56, 0xb2, 0xae, 0xc9, 0xa5, 0x02, 0x43, 0x7d, 0x9f, 0x18, 0x4a, 0x1a, 0xac, 0xe8, 0x75, 0x31, 0xcb, 0x70, 0xd2, 0x18, 0x5a, 0xbe, 0xc6, 0x31, + 0x79, 0x7e, 0x82, 0x99, 0xb6, 0x19, 0x02, 0xcb, 0xbf, 0x93, 0xee, 0xff, 0x56, 0x3a, 0xd9, 0x60, 0x37, 0x3a, 0xd0, 0x43, 0xc5, 0x05, 0xe4, 0xd3, 0xca, 0xae, 0x36, 0xa4, 0x38, 0x7d, 0x89, 0x8e, + 0xa1, 0x27, 0x70, 0xba, 0xb2, 0xc5, 0x76, 0x90, 0xfe, 0xd8, 0x9e, 0x21, 0xa0, 0x4b, 0x48, 0xb3, 0xdd, 0xc7, 0xbb, 0xed, 0xc8, 0x45, 0x62, 0x5c, 0x79, 0x76, 0xa1, 0xc9, 0x05, 0x79, 0x72, 0x5a, + 0xd6, 0xfa, 0x07, 0x15, 0x90, 0x83, 0x45, 0x91, 0x39, 0xfb, 0x85, 0x9c, 0xb5, 0x5d, 0x07, 0xdf, 0xd6, 0x21, 0x51, 0xdc, 0x8b, 0xd2, 0x1b, 0xe2, 0xca, 0x16, 0x1e, 0xa5, 0x75, 0x48, 0xb4, 0x29, + 0x6d, 0x32, 0x43, 0x72, 0x2f, 0x9d, 0x09, 0xbf, 0xe4, 0x9c, 0x75, 0xc9, 0x0c, 0xc4, 0x6a, 0xaf, 0xd0, 0x8a, 0x64, 0x41, 0x2e, 0xce, 0xc4, 0x30, 0x73, 0x8f, 0x82, 0xc7, 0x8d, 0x97, 0xdc, 0x28, + 0xe6, 0x99, 0x1b, 0x0b, 0x78, 0x4f, 0x8d, 0xf1, 0x7d, 0xcc, 0x8a, 0xb9, 0xfd, 0x4e, 0xce, 0xc7, 0xb9, 0x1c, 0xe9, 0xad, 0xb3, 0x6c, 0x95, 0xad, 0x71, 0x17, 0x77, 0x42, 0x82, 0x4b, 0xa2, 0x1c, + 0x01, 0xed, 0xf3, 0x2c, 0x5b, 0x6b, 0xae, 0xba, 0x55, 0xaa, 0x6c, 0x93, 0xdd, 0x18, 0xc9, 0xfa, 0x8e, 0xb2, 0x30, 0x24, 0xd9, 0xaa, 0xb6, 0xab, 0xac, 0x91, 0xda, 0x64, 0x85, 0x55, 0x3e, 0x5b, + 0x77, 0xba, 0x20, 0x9f, 0x19, 0x5b, 0xd0, 0xc6, 0xa7, 0x4d, 0xf1, 0x0f, 0x57, 0x34, 0x1f, 0x4f, 0x9e, 0x47, 0xfd, 0x02, 0xd3, 0x4c, 0x28, 0x6b, 0x82, 0xce, 0x70, 0xc7, 0x08, 0x87, 0x90, 0x7e, + 0x6b, 0x14, 0x0e, 0x46, 0x60, 0xfe, 0x7c, 0x85, 0x83, 0xf5, 0xf9, 0xe8, 0xe4, 0x24, 0xc7, 0xb9, 0xb3, 0x8d, 0xf6, 0xf4, 0xdf, 0xdb, 0x9b, 0x7d, 0x84, 0xc3, 0x23, 0xec, 0x04, 0x90, 0x65, 0xb8, + 0x3e, 0xfb, 0x76, 0x81, 0xe3, 0xb3, 0x8f, 0x27, 0x38, 0x3d, 0xb9, 0x38, 0x11, 0x78, 0xe9, 0x65, 0x1a, 0xac, 0x3a, 0x58, 0x8a, 0xf9, 0xef, 0x7f, 0xc4, 0x69, 0x34, 0x27, 0x17, 0xff, 0xee, 0x3e, + 0x5f, 0x9e, 0x7d, 0x49, 0x63, 0x71, 0xba, 0xdc, 0x1e, 0xbc, 0xf1, 0x75, 0xd2, 0x0b, 0xf1, 0x35, 0x4c, 0xe2, 0x1e, 0xe8, 0x30, 0xa9, 0x01, 0xf8, 0x21, 0x08, 0x7d, 0x8f, 0x0b, 0xfa, 0x27, 0xfd, + 0x1f, 0xd5, 0xbb, 0x9c, 0x2c, 0x04, 0xe0, 0xe2, 0x0b, 0x18, 0x7a, 0x84, 0xb1, 0xab, 0xe1, 0x7b, 0x36, 0xfc, 0x1f, 0x0b, 0xce, 0xc7, 0x6d, 0x20, 0x19, 0xea, 0x33, 0x3c, 0xe7, 0x6d, 0x4b, 0x49, + 0x8e, 0x44, 0xb6, 0x6d, 0xad, 0x95, 0x0c, 0x8f, 0x59, 0xb6, 0xf1, 0xd6, 0x24, 0x03, 0xb0, 0x17, 0x40, 0xbf, 0x10, 0xfd, 0x42, 0x08, 0x7a, 0x18, 0x5f, 0xdf, 0xd1, 0xd3, 0x7e, 0x21, 0x7e, 0x06, + 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf8, 0xc1, 0xc9, 0x51, 0x58, 0x02, 0x00, 0x00, 0x91, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x5c, 0x52, 0xcb, 0x6e, 0xdb, 0x30, 0x10, 0xbc, 0xfb, 0x2b, 0xe6, 0x46, 0xba, 0xa0, 0x65, 0x37, 0xe9, 0xc9, 0x86, 0x7b, 0x29, 0x0a, 0xd4, 0x3d, + 0x24, 0x87, 0xe6, 0x07, 0x18, 0x69, 0xed, 0x28, 0x91, 0x48, 0x65, 0xb9, 0x32, 0x6a, 0x18, 0xfa, 0xf7, 0x80, 0xd4, 0xcb, 0xc9, 0x4d, 0x3b, 0x3b, 0x3b, 0x3b, 0x1a, 0xae, 0x6a, 0x03, 0x21, 0x08, + 0x97, 0xb9, 0xa8, 0xdd, 0xa2, 0xac, 0x1b, 0xcf, 0x82, 0x2b, 0x82, 0x58, 0x16, 0x83, 0x83, 0x3b, 0xfb, 0x37, 0xe2, 0xc7, 0x46, 0x4a, 0xef, 0x02, 0x3a, 0x1c, 0xd9, 0xd7, 0x50, 0x47, 0x6b, 0xc3, + 0xea, 0x35, 0xac, 0xb8, 0x75, 0x52, 0xd6, 0x34, 0x0f, 0x32, 0xbd, 0xb7, 0x14, 0x64, 0xa0, 0x85, 0xb6, 0x21, 0x16, 0x0a, 0x51, 0x79, 0x64, 0x7c, 0x83, 0x0d, 0x38, 0xb6, 0x2e, 0x1f, 0x38, 0x59, + 0xb6, 0x7e, 0x6e, 0xcb, 0xaa, 0x98, 0x35, 0xe2, 0x80, 0xc1, 0x15, 0x4f, 0x51, 0x68, 0xdc, 0x28, 0xb6, 0x89, 0x6b, 0x16, 0xb9, 0x77, 0x41, 0x50, 0x58, 0xb1, 0xd8, 0xe3, 0xba, 0x00, 0x9c, 0xad, + 0x69, 0x0b, 0x25, 0xe5, 0x89, 0x58, 0x99, 0x05, 0x90, 0xb7, 0x41, 0x7c, 0x4d, 0x7c, 0x28, 0xb6, 0x50, 0x9b, 0xef, 0x77, 0xf7, 0x3f, 0xd4, 0xa2, 0x9b, 0x26, 0x89, 0xf9, 0x8f, 0x75, 0x45, 0x45, + 0x8c, 0x3d, 0xb4, 0x6c, 0xd3, 0x96, 0x25, 0xf6, 0x3f, 0xa1, 0x89, 0x79, 0x8b, 0xdf, 0xcc, 0x9e, 0x53, 0x1d, 0xc5, 0x25, 0xa3, 0x58, 0xc7, 0xd6, 0x72, 0xd7, 0xd7, 0xae, 0xd0, 0xcb, 0x5d, 0x12, + 0x8c, 0x3e, 0xb5, 0x3a, 0x38, 0xa1, 0x13, 0xdb, 0x98, 0xcf, 0x16, 0x2f, 0x49, 0x3a, 0xc0, 0xe2, 0x6c, 0xab, 0xb2, 0x18, 0xe3, 0x50, 0x06, 0x5a, 0x26, 0xd1, 0x14, 0xad, 0x8e, 0x11, 0x64, 0x3d, + 0xdf, 0xe0, 0xda, 0xc5, 0x54, 0x3e, 0x87, 0xbd, 0xcc, 0xe4, 0x85, 0x9c, 0xd6, 0x81, 0xf8, 0x4c, 0xb3, 0xa5, 0x68, 0xa2, 0xa9, 0xac, 0xd3, 0xf7, 0xc9, 0x11, 0xc6, 0x1d, 0x23, 0x2f, 0x61, 0x40, + 0xd6, 0xf8, 0xe8, 0x6e, 0xad, 0x26, 0x20, 0x44, 0xeb, 0x31, 0xb8, 0x09, 0xa1, 0xff, 0x0d, 0xe5, 0xa2, 0xef, 0x36, 0x9b, 0xaf, 0x90, 0xfa, 0xe5, 0x9d, 0x90, 0x93, 0xd5, 0xd3, 0xa5, 0x21, 0x65, + 0xb0, 0x7e, 0x0d, 0xde, 0xad, 0x67, 0x96, 0x2b, 0x74, 0xcc, 0xc4, 0x80, 0x29, 0xb4, 0x95, 0xdc, 0x98, 0xeb, 0x0d, 0x4e, 0xa9, 0x19, 0xa8, 0x07, 0x8f, 0x54, 0xaa, 0xc1, 0x6f, 0xcf, 0xf0, 0x6f, + 0x7a, 0x98, 0xbd, 0x45, 0xe9, 0xbd, 0xb5, 0x95, 0xfe, 0xfb, 0xef, 0xf1, 0x21, 0x8b, 0x27, 0xe9, 0x4e, 0xe5, 0xf1, 0x32, 0xf0, 0xb2, 0x67, 0x5f, 0x5c, 0x96, 0x06, 0x5f, 0x9a, 0xe9, 0x87, 0x3e, + 0x6b, 0xf4, 0x2f, 0x34, 0x02, 0x7d, 0x2c, 0x59, 0x5e, 0xf9, 0x40, 0x33, 0xde, 0xa5, 0xaf, 0xce, 0xdc, 0xdc, 0x83, 0x96, 0xa8, 0x13, 0x1b, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x04, 0x6d, 0x41, 0x6c, 0x95, 0x01, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, + 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x6c, 0x92, 0xcb, 0x6e, 0xdb, 0x3c, 0x10, 0x85, 0xf7, 0x7c, 0x8a, 0xb3, 0xa3, 0x0c, 0x38, 0xd2, 0xff, 0xa7, 0x5d, 0x49, 0xb1, 0x37, 0x45, 0x8b, 0x66, + 0x57, 0x14, 0xee, 0x3a, 0x60, 0xc8, 0xb1, 0xc5, 0x84, 0x22, 0x15, 0x72, 0x68, 0x5b, 0x30, 0xfc, 0xee, 0x85, 0x7c, 0x91, 0x63, 0xa0, 0x2b, 0x82, 0xc3, 0x33, 0x97, 0x8f, 0x67, 0x64, 0x4e, 0x84, + 0xc4, 0xd1, 0x6a, 0x96, 0x8d, 0x10, 0xb6, 0xeb, 0x43, 0x64, 0x30, 0x25, 0xc6, 0x3a, 0x86, 0x0e, 0x92, 0x55, 0x4f, 0xb2, 0xb9, 0x3e, 0x1c, 0x40, 0xfb, 0x9e, 0x34, 0xaf, 0x86, 0x9e, 0x70, 0xbc, + 0x4a, 0x92, 0xf9, 0xac, 0xf8, 0x16, 0x3c, 0xd3, 0x9e, 0xe7, 0xf8, 0xb9, 0x5a, 0xfd, 0xfa, 0x91, 0xbd, 0x66, 0x1b, 0xfc, 0x24, 0x5e, 0x2b, 0x95, 0x1e, 0xde, 0xd2, 0x43, 0xcc, 0x9e, 0x6d, 0x77, + 0x57, 0xba, 0x55, 0xde, 0xb8, 0x5b, 0xd9, 0xb2, 0xac, 0x5e, 0xb3, 0x75, 0xa6, 0xb2, 0xde, 0xd0, 0xbe, 0x7c, 0x4b, 0xe3, 0x80, 0x55, 0x85, 0xef, 0x3e, 0xe5, 0x48, 0xe0, 0x56, 0x31, 0xb8, 0x25, + 0xac, 0xaf, 0x2d, 0x74, 0xe8, 0x7a, 0x47, 0x4c, 0x09, 0xda, 0x91, 0xf2, 0x6e, 0xc0, 0xae, 0x25, 0x8f, 0x5e, 0xa5, 0x44, 0x06, 0x0a, 0x5b, 0xe5, 0xac, 0x01, 0x6d, 0xc9, 0x73, 0x29, 0x46, 0xc4, + 0x42, 0xfe, 0xf1, 0x96, 0xeb, 0x4b, 0xe3, 0x34, 0x49, 0x22, 0x7d, 0x64, 0x4a, 0x2c, 0xe7, 0x50, 0x69, 0xf0, 0x1a, 0x05, 0xcf, 0xb0, 0x58, 0xe2, 0x20, 0x00, 0x2e, 0x7b, 0xa7, 0x7c, 0xf1, 0x38, + 0x6b, 0x04, 0xa0, 0x83, 0x4f, 0x8c, 0xd7, 0x60, 0x86, 0x1a, 0xbf, 0x49, 0x87, 0x68, 0x9e, 0xc6, 0xaf, 0xf4, 0x9b, 0x39, 0xce, 0xe7, 0x12, 0x8b, 0x53, 0x16, 0xe0, 0x55, 0x47, 0x35, 0x24, 0xdb, + 0x0d, 0x45, 0x39, 0x3f, 0x85, 0x74, 0x4e, 0x1c, 0x3a, 0x8a, 0xcf, 0xa6, 0x86, 0xfc, 0xef, 0xff, 0xc7, 0x2f, 0x5f, 0xa5, 0x00, 0x8e, 0x8d, 0x10, 0x40, 0x55, 0xe1, 0xd9, 0x6f, 0xc3, 0x3b, 0xdd, + 0x13, 0xee, 0x5a, 0xab, 0x5b, 0xa4, 0x36, 0x64, 0x67, 0x26, 0x5c, 0xec, 0x2c, 0xb7, 0x21, 0x33, 0x28, 0xc6, 0x10, 0xa1, 0xbc, 0x01, 0xe9, 0x36, 0x9c, 0x32, 0x8d, 0x62, 0x35, 0x0d, 0x1a, 0x29, + 0x65, 0xc7, 0x58, 0x40, 0xed, 0x94, 0xe5, 0x0b, 0x75, 0x71, 0x80, 0x0b, 0x9b, 0x1a, 0x07, 0x58, 0xbf, 0x0e, 0x35, 0x8a, 0x97, 0x13, 0xeb, 0x0b, 0x8e, 0x38, 0x42, 0xa5, 0x9b, 0x9b, 0x23, 0xe6, + 0x89, 0x9a, 0xcb, 0xf0, 0x5e, 0x9c, 0x6b, 0x5d, 0xee, 0xf4, 0x91, 0x95, 0xbb, 0x84, 0xca, 0x51, 0x77, 0xa7, 0x26, 0x6f, 0x8a, 0x59, 0x23, 0x8e, 0xb3, 0x7f, 0xdb, 0x77, 0x71, 0x7d, 0x62, 0xb4, + 0x09, 0x3c, 0xf4, 0x34, 0xf2, 0xc5, 0x48, 0x9a, 0xdd, 0x50, 0x8a, 0xdb, 0xd2, 0x3d, 0x7d, 0x5e, 0xaa, 0x65, 0x71, 0x4e, 0x9e, 0x35, 0xe2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x69, 0x9c, 0xe5, 0x16, 0x96, 0x01, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xdd, 0x6e, 0x23, 0x37, 0x0f, 0xbd, 0xf7, 0x53, 0x10, 0x73, 0x33, 0x89, 0x91, 0xd8, 0xd9, 0x7c, 0xf8, 0xb6, 0xad, 0xef, 0x16, 0x8e, + 0x17, 0x48, 0xd1, 0x4d, 0x8b, 0x38, 0x05, 0x0a, 0x14, 0x45, 0x21, 0x6b, 0x38, 0x36, 0x53, 0x0d, 0x35, 0x10, 0xa9, 0x24, 0x83, 0xc5, 0xbe, 0x7b, 0x21, 0xc9, 0x3f, 0x69, 0x7e, 0x8c, 0xf5, 0xcd, + 0xd0, 0x33, 0xe2, 0xe1, 0xe1, 0x21, 0x75, 0xbe, 0x8e, 0x00, 0x2a, 0x62, 0xeb, 0x62, 0x83, 0xd5, 0x0c, 0xfe, 0x1c, 0x01, 0x00, 0x54, 0x12, 0xec, 0x74, 0x3c, 0x9e, 0x8e, 0xab, 0x11, 0xc0, 0x5f, + 0x67, 0xe9, 0x08, 0x3e, 0xed, 0x8f, 0x54, 0xec, 0x1b, 0xfc, 0xbb, 0xf3, 0x4d, 0x74, 0x28, 0x55, 0xf9, 0x6c, 0x7d, 0xd7, 0x93, 0xc3, 0xf0, 0x6b, 0xaf, 0xe4, 0x59, 0xaa, 0x19, 0x7c, 0x2d, 0x48, + 0x6a, 0xc2, 0x1a, 0xb5, 0x9a, 0x41, 0xb5, 0x58, 0x5e, 0x5e, 0x5c, 0x5e, 0x54, 0x67, 0xf0, 0xee, 0x6f, 0x3a, 0x86, 0x65, 0x8f, 0x96, 0xda, 0x01, 0x16, 0xf3, 0x2f, 0x9f, 0x96, 0x36, 0x50, 0xaf, + 0x50, 0x10, 0xe0, 0x01, 0x83, 0x90, 0xe7, 0x19, 0xd4, 0x8b, 0xe5, 0xff, 0x6a, 0x38, 0x69, 0xb0, 0x35, 0xd1, 0xe9, 0xe9, 0x59, 0x7a, 0xf1, 0xff, 0x3a, 0x3f, 0x2e, 0x2f, 0x3e, 0x1c, 0xa2, 0x8f, + 0xfb, 0xe8, 0x87, 0x7d, 0xf4, 0xe3, 0x3e, 0xfa, 0x69, 0x17, 0x5d, 0x5e, 0xd4, 0x67, 0xe0, 0x43, 0xfa, 0x73, 0xb3, 0xf8, 0xe3, 0xae, 0x9e, 0xc0, 0x78, 0x5a, 0xa8, 0x97, 0x0e, 0x13, 0x75, 0xeb, + 0xbb, 0xce, 0xf3, 0xbd, 0xbc, 0x4f, 0xfe, 0x19, 0xf5, 0x92, 0x06, 0xd6, 0x37, 0x08, 0x6b, 0x64, 0x0c, 0x46, 0x0b, 0x6f, 0xf6, 0x8c, 0xa9, 0xea, 0x0e, 0x2d, 0xc5, 0xa6, 0x6b, 0xd2, 0x43, 0x06, + 0x51, 0xec, 0x52, 0x14, 0xcb, 0x0b, 0x94, 0x5d, 0x2f, 0x29, 0x7a, 0xce, 0x11, 0x9f, 0xf4, 0x19, 0x47, 0x1f, 0xf5, 0x8a, 0x42, 0xe2, 0x38, 0x99, 0xae, 0x22, 0xb9, 0xe6, 0x88, 0xbe, 0xd3, 0x31, + 0xdc, 0x62, 0x43, 0x01, 0xad, 0x82, 0x8f, 0xda, 0x47, 0x05, 0xd1, 0x10, 0xad, 0xc6, 0x80, 0xa0, 0x1e, 0x74, 0x83, 0x50, 0x3e, 0xfb, 0x30, 0x1c, 0x4a, 0x88, 0x06, 0xb2, 0x69, 0x82, 0x1a, 0x22, + 0x1e, 0x99, 0xde, 0xb6, 0xc4, 0x82, 0xcd, 0xca, 0x21, 0x18, 0xe7, 0xa0, 0x64, 0x82, 0x0e, 0x3d, 0x9e, 0xdb, 0x0d, 0xda, 0x7f, 0x88, 0xd7, 0xe0, 0xcb, 0x86, 0x1c, 0xf0, 0xd9, 0x5f, 0x77, 0xbd, + 0x23, 0x4b, 0xfa, 0x89, 0x87, 0x6a, 0x06, 0xad, 0x71, 0xf2, 0x6e, 0x9d, 0xd4, 0x83, 0x21, 0x41, 0xc0, 0x10, 0x7c, 0x00, 0xcf, 0x80, 0x4f, 0x7d, 0x40, 0x49, 0xab, 0x21, 0x60, 0xb8, 0x81, 0x06, + 0xad, 0x33, 0x45, 0x73, 0x81, 0x47, 0xd2, 0x0d, 0x18, 0x06, 0x4a, 0x15, 0xb0, 0x81, 0xda, 0xf0, 0x50, 0x67, 0x42, 0x2f, 0xfb, 0xbb, 0x89, 0xce, 0xcd, 0x13, 0x47, 0x39, 0xd6, 0xe9, 0xa1, 0xbf, + 0x6d, 0x6f, 0x1c, 0x9d, 0x83, 0xdc, 0x9b, 0xbc, 0x44, 0xfc, 0x1c, 0xd9, 0x26, 0x16, 0x77, 0x43, 0x8f, 0xef, 0x83, 0xbe, 0x42, 0x3c, 0x08, 0xd5, 0x42, 0xbb, 0x85, 0xc8, 0x8c, 0xdf, 0x94, 0xec, + 0x6e, 0x43, 0x47, 0x09, 0xbf, 0xa5, 0x58, 0xad, 0x1b, 0x92, 0xfa, 0x3f, 0xc2, 0x7d, 0x8f, 0x4e, 0xec, 0x7f, 0xe7, 0x28, 0xd8, 0xfc, 0xe2, 0xad, 0x71, 0xdf, 0x51, 0x14, 0x7b, 0x1f, 0xb4, 0x54, + 0x95, 0x54, 0x36, 0xe6, 0x6c, 0x70, 0x39, 0xfd, 0x35, 0xec, 0x6f, 0x26, 0x98, 0x0e, 0x15, 0xc3, 0x11, 0xe8, 0x23, 0xb0, 0xfd, 0x3e, 0xfd, 0x2d, 0x99, 0x6e, 0x51, 0x63, 0xe0, 0x63, 0xa4, 0x5f, + 0x40, 0xc3, 0xe3, 0x06, 0x19, 0xd8, 0x6b, 0x5e, 0xe4, 0x7c, 0x97, 0x7b, 0xa3, 0x1b, 0x01, 0xe2, 0xc3, 0x54, 0x42, 0x46, 0x05, 0x03, 0x0f, 0xc6, 0x45, 0x7c, 0x69, 0x1c, 0xb7, 0x28, 0xde, 0xc5, + 0x74, 0x30, 0x5d, 0xcf, 0xe4, 0x99, 0x6f, 0xdd, 0xcd, 0xd7, 0xc6, 0x11, 0xf6, 0x79, 0x69, 0x25, 0x8c, 0xe2, 0x7a, 0xc8, 0xe6, 0xd1, 0x60, 0x0d, 0x27, 0x37, 0xbe, 0xc1, 0xc9, 0xbd, 0x9c, 0x66, + 0x37, 0xb0, 0xce, 0x88, 0x90, 0xad, 0xe1, 0x24, 0xed, 0xd8, 0xd6, 0x2e, 0xfb, 0x80, 0xe7, 0x1f, 0x26, 0x1f, 0x4f, 0x0f, 0x74, 0x50, 0xbe, 0x64, 0xe4, 0x6b, 0x56, 0x0c, 0xbe, 0x3f, 0x3a, 0xb9, + 0xfd, 0x3a, 0x0a, 0x60, 0x47, 0x0a, 0x54, 0x72, 0x30, 0x98, 0x15, 0x39, 0xd2, 0x01, 0x56, 0xa8, 0x8f, 0x88, 0x0c, 0xf3, 0x6c, 0x62, 0x3f, 0x2f, 0xf3, 0x9d, 0x5b, 0x2c, 0xa1, 0x94, 0x10, 0x78, + 0x20, 0x03, 0x36, 0x60, 0xbe, 0x7f, 0x69, 0x85, 0xd9, 0x74, 0x28, 0xbd, 0xb1, 0x08, 0x7e, 0x75, 0x8f, 0x56, 0x05, 0x5a, 0x1f, 0xb2, 0xa8, 0xd4, 0x25, 0xb9, 0x65, 0x02, 0x79, 0x48, 0x28, 0x50, + 0x1b, 0xe7, 0xfc, 0xe3, 0x72, 0x60, 0xdd, 0xa0, 0x92, 0xbd, 0x2a, 0x06, 0x7f, 0x5d, 0x8e, 0x3d, 0xf3, 0xbc, 0xd6, 0x07, 0x8b, 0x73, 0xcf, 0x42, 0xa2, 0xc8, 0x3a, 0x37, 0x42, 0xbc, 0xbe, 0xe6, + 0xcf, 0xe4, 0xf0, 0x26, 0x55, 0xdb, 0x36, 0xb8, 0xeb, 0xe7, 0x8a, 0x24, 0x03, 0x03, 0xb1, 0xdd, 0x27, 0xb9, 0xe1, 0xdc, 0x9a, 0xb4, 0x37, 0x01, 0x5b, 0x0c, 0xc8, 0x16, 0x65, 0x67, 0x81, 0x62, + 0x3a, 0x84, 0x96, 0xdc, 0x6e, 0xa0, 0xdf, 0x46, 0xdf, 0x46, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x52, 0x56, 0x08, 0x2d, 0x4e, 0x4d, 0x51, 0x48, 0xaa, 0x54, + 0x48, 0x2a, 0xcd, 0xcc, 0x49, 0x49, 0x4a, 0x4c, 0xce, 0x86, 0xb0, 0x52, 0x8b, 0x8a, 0x75, 0x20, 0x2c, 0xd7, 0xbc, 0xb2, 0x62, 0x85, 0xc4, 0xa2, 0x54, 0x85, 0x82, 0xc4, 0x62, 0x90, 0xda, 0x92, + 0x7c, 0x85, 0x92, 0x8c, 0x54, 0x88, 0x9c, 0x42, 0x66, 0x6e, 0x62, 0x7a, 0x2a, 0x17, 0x5c, 0x9d, 0x15, 0x97, 0xae, 0x42, 0x5e, 0x62, 0x6e, 0xaa, 0x95, 0x82, 0x53, 0x40, 0xbc, 0x9f, 0xbf, 0x8b, + 0x6b, 0x7c, 0x50, 0xa8, 0x5f, 0x7c, 0xb0, 0x73, 0x90, 0x67, 0x40, 0x48, 0x30, 0x97, 0x82, 0x42, 0x59, 0x62, 0x4e, 0x69, 0xaa, 0x15, 0x44, 0x2f, 0x17, 0x20, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, + 0x07, 0x08, 0xdd, 0x81, 0x1f, 0xc3, 0x68, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xf1, + 0x56, 0xa3, 0x62, 0x03, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00, 0x00, 0x00, 0x00, 0x52, 0x45, 0x41, 0x44, + 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x99, 0x03, 0x00, 0x00, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7c, 0xcc, 0x0a, 0x87, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0xbd, 0x03, 0x00, 0x00, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x24, 0x7d, 0x75, 0xbd, 0xdf, 0x01, 0x00, 0x5e, 0x4b, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x81, 0x04, 0x00, 0x00, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x63, 0x61, 0x2d, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x74, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x85, 0xe4, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa6, 0xe4, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x80, 0x38, 0xa2, 0xec, 0x01, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0xde, 0xe4, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, + 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xe8, 0xdf, 0xc0, 0x6e, 0x03, 0x00, 0x00, 0x20, + 0x09, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x1b, 0xe7, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0xdc, 0xea, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa3, 0xb7, 0x09, 0xae, 0x51, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa9, 0xec, 0x01, 0x00, + 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x48, 0xed, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x68, + 0xee, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xa2, 0x9d, 0xb2, 0x62, 0x01, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, - 0x8c, 0x0c, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, + 0x99, 0xee, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x9d, 0xa7, 0x1e, 0x01, 0x05, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x38, 0x0e, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x45, 0xf0, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x39, 0xf1, 0xa6, - 0x42, 0x01, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x85, 0x13, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, + 0x42, 0x01, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x92, 0xf5, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xe0, 0x7c, 0xeb, 0x1f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x18, 0x15, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x25, 0xf7, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7e, 0x15, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x8b, 0xf7, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x4a, 0x3e, 0xd9, 0x3e, 0x02, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xab, 0x15, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb8, 0xf7, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xe7, 0x37, 0x3e, 0x49, 0x00, 0x00, 0x00, 0x4a, - 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2f, 0x18, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x3c, 0xfa, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xa7, 0xe7, 0x98, 0x5d, 0x01, - 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xbb, 0x18, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc8, 0xfa, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9c, 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x5e, 0x1a, 0x00, 0x00, 0x67, 0x6f, + 0x9c, 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6b, 0xfc, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa4, 0x81, 0x1e, 0x1c, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2b, 0xfe, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x33, 0x1d, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x40, 0xff, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xdb, 0xa3, 0x12, 0x72, 0x01, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa4, 0x81, 0x59, 0x1d, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x66, 0xff, 0x01, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xe0, 0x7c, 0xeb, 0x1f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa4, 0x81, 0x0a, 0x1f, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0x17, 0x01, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xb8, 0x89, 0xe0, 0xc1, 0x01, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, - 0x65, 0x1f, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xcc, 0x0b, 0x00, 0x53, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x65, - 0x21, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x91, 0x18, 0x39, 0x9a, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0xfc, 0x22, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x81, 0xd4, 0x23, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x45, 0x34, 0x36, 0x07, 0x01, 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x01, 0x24, - 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x81, 0x4e, 0x25, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, - 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xf6, 0xdb, 0xf4, - 0x1f, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa1, 0x90, 0x25, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, - 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x50, - 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x6f, 0x3c, 0x70, 0x22, 0x01, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x02, 0x26, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x93, 0x93, 0x55, 0xd3, 0x08, 0x00, 0x00, 0x96, 0x11, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, - 0x81, 0x7c, 0x27, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, - 0x75, 0x3a, 0x5a, 0xb3, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa7, 0x30, 0x00, 0x00, 0x67, 0x6f, 0x2f, + 0x72, 0x01, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xcc, 0x0b, 0x00, 0x53, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x72, + 0x03, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xed, 0x81, 0x09, 0x05, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x45, 0x34, 0x36, 0x07, 0x01, 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x36, 0x05, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x83, 0x06, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, + 0x34, 0xf6, 0xd2, 0x20, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa1, 0xc6, 0x06, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb3, 0x31, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xeb, 0x1c, 0x44, 0x4e, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa1, 0xef, 0x31, - 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x66, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc9, 0xa2, 0x64, 0x7d, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x55, 0x32, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x97, 0x5a, 0x0e, 0x5b, 0x48, 0x01, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x24, 0x33, 0x00, - 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, - 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa9, 0xe5, 0x9d, 0xa9, 0xab, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, - 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xbe, 0x34, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, - 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x81, 0xbc, 0x35, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x3e, 0x61, 0x90, 0x17, 0x00, 0x00, 0x00, 0x11, - 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa1, 0xfb, 0x35, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, - 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x6f, 0x3c, 0x70, 0x22, 0x01, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, - 0x81, 0x62, 0x36, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x71, 0x71, 0x33, - 0x51, 0x09, 0x00, 0x00, 0xbf, 0x12, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd9, 0x37, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, - 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, - 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xf7, 0x08, 0x22, 0xbe, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x7f, 0x41, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x81, 0x93, 0x42, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x3e, 0xf2, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa1, 0xcc, 0x42, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc9, 0xa2, 0x64, 0x7d, 0x00, - 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x26, 0x43, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, - 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x5a, 0x0e, 0x5b, 0x48, 0x01, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0xf2, 0x43, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, - 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x31, 0x0b, 0x58, 0xb7, 0x00, 0x00, 0x00, - 0xe8, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x89, 0x45, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xc6, 0x88, 0x52, 0x88, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa4, 0x81, 0x90, 0x46, 0x00, 0x00, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x53, 0x47, 0x00, - 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x76, 0x47, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x2f, 0x9b, 0xc5, 0x5e, 0x07, 0x00, 0x00, 0x7f, 0x13, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa5, 0x47, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x36, 0x8b, - 0x30, 0x2d, 0x02, 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4b, 0x4f, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xbf, 0x51, - 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xb5, 0x1c, 0xf7, 0x1a, 0x97, 0x00, 0x00, 0x99, 0x0c, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd6, 0x52, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc3, 0x71, 0x47, 0x37, 0x42, 0x01, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x40, 0xea, 0x00, 0x00, 0x6e, 0x6f, - 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x81, 0xcd, 0xeb, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, - 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x78, 0x33, 0xb8, 0xe6, 0x01, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x01, 0xec, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, - 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa3, 0xd1, 0x71, 0xb2, 0x9e, 0x01, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x39, 0xee, 0x00, 0x00, 0x6e, - 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, - 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x22, 0xf0, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xdf, 0x4e, 0x60, 0x45, 0xd0, 0x07, 0x00, 0x00, 0x03, 0x15, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4a, 0xf0, - 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x16, 0x16, 0xd4, 0x8f, 0x02, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x5b, - 0xf8, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x43, 0x2b, 0xc0, 0x5c, 0x97, 0x00, 0x00, 0xc7, 0x0f, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2a, - 0xfb, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, - 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x92, 0x2a, 0x0b, 0x4c, 0x01, 0x00, 0x00, 0x49, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xcf, 0x92, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, - 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x5f, 0x94, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, - 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xa7, 0x29, 0xe2, 0xc2, 0x01, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8c, 0x94, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xca, 0x4c, 0x74, 0x6c, 0x01, - 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x99, 0x96, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, - 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x49, 0x98, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, - 0x6f, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x6e, 0x98, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x9f, 0x98, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x13, 0x6b, - 0x58, 0xac, 0x01, 0x00, 0x00, 0x69, 0x03, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0a, 0x99, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, - 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x6e, 0xed, 0xb6, 0x3d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x81, 0x00, 0x9b, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x68, 0x50, 0x4b, - 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x81, 0xa6, 0x27, 0xf6, 0x00, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x84, 0x9b, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, - 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc2, 0x9c, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x73, 0x2f, 0x66, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0xb0, 0xa9, 0x9c, 0x04, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x2b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x3a, 0x07, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x2a, 0xcc, 0xf1, 0x76, 0x0a, 0x00, 0x00, 0x51, 0x16, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x97, 0x08, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xb6, 0x33, 0x1f, 0xb1, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x66, + 0x13, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x71, 0x14, 0x02, 0x00, 0x67, 0x6f, 0x2f, + 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x1c, 0x44, 0x4e, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xa1, 0xad, 0x14, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3e, 0x2e, 0x0a, 0xba, 0x00, 0x00, 0x00, + 0x44, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x13, 0x15, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, + 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xcb, 0xed, 0xf8, 0xdd, 0x03, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0x1f, 0x16, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, + 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xde, 0x7b, 0x4c, + 0xaa, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4e, 0x1a, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, + 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x6f, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4b, 0x1b, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, + 0x3e, 0x61, 0x90, 0x17, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa1, 0x8b, 0x1b, 0x02, 0x00, 0x67, 0x6f, 0x2f, + 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0xb0, 0xa9, 0x9c, 0x04, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf3, 0x1b, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x3b, 0xe6, 0xce, 0x1f, 0x0a, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x4d, 0x1d, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x7f, 0x10, 0xe4, + 0xc1, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc2, 0x27, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, + 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xda, 0x28, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x3e, 0xf2, 0x8f, + 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa1, 0x13, 0x29, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, + 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3e, 0x2e, 0x0a, 0xba, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x6d, 0x29, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, + 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xcb, 0xed, 0xf8, 0xdd, 0x03, 0x00, 0x00, 0xaa, 0x08, 0x00, + 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x76, 0x2a, 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, + 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x73, 0x75, 0x6d, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0xd3, 0x2c, 0x12, 0xba, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa2, 0x2e, + 0x02, 0x00, 0x67, 0x6f, 0x2f, 0x73, 0x63, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2d, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x69, + 0x6e, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xc6, 0x88, 0x52, 0x88, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xac, 0x2f, 0x02, 0x00, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x6f, 0x30, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x92, 0x30, 0x02, 0x00, + 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0x2f, 0x9b, 0xc5, 0x5e, 0x07, 0x00, 0x00, 0x7f, 0x13, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc1, 0x30, 0x02, 0x00, 0x6e, + 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x36, 0x8b, 0x30, 0x2d, 0x02, 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0x67, 0x38, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xdb, 0x3a, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xc3, 0x2f, 0x3c, + 0x4a, 0xa2, 0x00, 0x00, 0x86, 0x2e, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf2, 0x3b, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xec, 0xb0, 0xf8, 0x44, 0x01, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8c, 0xde, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x1b, 0xe0, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x78, 0x33, 0xb8, 0xe6, + 0x01, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4f, 0xe0, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xd1, 0x71, 0xb2, 0x9e, 0x01, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x87, 0xe2, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, + 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x70, 0xe4, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x4e, 0x60, 0x45, 0xd0, 0x07, 0x00, 0x00, 0x03, 0x15, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x98, 0xe4, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, + 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x16, 0x16, 0xd4, 0x8f, 0x02, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa9, 0xec, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, + 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbc, 0xb9, 0x6b, 0x52, 0xa3, 0x00, 0x00, 0x08, 0x35, 0x02, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x78, 0xef, 0x02, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x2e, 0x1b, 0x62, 0x4a, 0x01, + 0x00, 0x00, 0x49, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x13, 0x93, 0x03, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa1, 0x94, 0x03, 0x00, 0x6e, 0x6f, 0x64, 0x65, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xa7, 0x29, 0xe2, 0xc2, + 0x01, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xce, 0x94, 0x03, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xca, 0x4c, 0x74, 0x6c, 0x01, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0xdb, 0x96, 0x03, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0x8b, 0x98, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb0, 0x98, 0x03, 0x00, 0x70, 0x79, 0x74, + 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe1, 0x98, 0x03, 0x00, 0x70, 0x79, + 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x13, 0x6b, 0x58, 0xac, 0x01, 0x00, 0x00, 0x69, 0x03, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0x4c, 0x99, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, + 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x6e, 0xed, 0xb6, 0x3d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x42, 0x9b, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x68, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x81, 0xa6, 0x27, 0xf6, 0x00, + 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc6, 0x9b, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x04, 0x9d, 0x03, 0x00, + 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6d, 0x9d, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xdf, 0xc1, 0x82, 0x54, 0x76, 0x01, 0x00, 0x00, 0x9f, 0x02, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe0, 0x9d, 0x03, 0x00, 0x70, + 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa3, 0x9f, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x63, 0x36, 0x9f, 0x48, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0xce, 0x9f, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x1c, 0x26, 0x1d, 0x85, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x59, 0xa0, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x77, 0xf1, 0x5e, 0x42, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x20, 0xa1, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x05, 0x73, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xaa, 0xa1, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, + 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x19, 0xa2, 0x03, 0x00, 0x70, + 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x4d, 0xa5, 0x54, 0x22, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x43, 0xa2, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x8d, 0x58, + 0xbb, 0xa6, 0x01, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa7, 0xa2, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, + 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa7, 0x6e, 0xed, 0xb6, 0x3d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x90, 0xa4, 0x03, 0x00, 0x70, 0x79, + 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x68, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xeb, 0x02, 0xc0, 0x8e, 0x02, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0d, 0xa5, 0x03, 0x00, 0x70, 0x79, + 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xdc, 0xa7, 0x03, 0x00, 0x70, + 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x40, 0xff, 0x24, 0xad, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x48, 0xa8, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, + 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x3b, 0xa9, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x10, 0x21, 0xc7, 0x42, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x65, 0xa9, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0xd3, 0xa1, 0x9f, 0x80, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe9, 0xa9, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x15, 0xdf, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xaa, 0xaa, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6b, 0xe8, 0xf3, 0x17, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2c, 0xab, 0x03, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x8d, 0xab, 0x03, 0x00, 0x71, 0x75, 0x61, + 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb3, 0xab, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, + 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe5, 0xab, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x07, 0xad, 0x03, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0x3e, 0xad, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, + 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, + 0x00, 0x4d, 0x13, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x7d, 0xad, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x61, 0xb4, 0x03, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, + 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x10, 0x26, 0x83, 0x33, 0x04, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0x3e, 0xb5, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, + 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, + 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xbc, 0xb9, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2b, 0x9d, - 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xc1, 0x82, 0x54, 0x76, 0x01, 0x00, 0x00, 0x9f, 0x02, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x9e, 0x9d, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x61, 0x9f, 0x01, 0x00, - 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x63, 0x36, - 0x9f, 0x48, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8c, 0x9f, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, - 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb1, 0x1c, 0x26, 0x1d, 0x85, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x17, 0xa0, 0x01, 0x00, 0x70, 0x79, - 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x8b, 0x77, 0xf1, 0x5e, 0x42, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xde, 0xa0, 0x01, 0x00, - 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x05, 0x73, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa4, 0x81, 0x68, 0xa1, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x66, 0x6c, 0x61, 0x73, 0x6b, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xd7, 0xa1, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, - 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x01, 0xa2, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, - 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x8d, 0x58, 0xbb, 0xa6, 0x01, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x65, 0xa2, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, - 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x6e, 0xed, 0xb6, 0x3d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4e, 0xa4, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x61, 0x70, - 0x70, 0x2e, 0x73, 0x68, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x02, 0xc0, 0x8e, 0x02, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xcb, 0xa4, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, - 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x9a, 0xa7, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, - 0x40, 0xff, 0x24, 0xad, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x06, 0xa8, 0x01, 0x00, 0x70, 0x79, 0x74, - 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf9, - 0xa8, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, - 0x10, 0x21, 0xc7, 0x42, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x23, 0xa9, 0x01, 0x00, 0x70, 0x79, 0x74, - 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x9d, 0xd3, 0xa1, 0x9f, 0x80, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa7, 0xa9, 0x01, 0x00, 0x70, - 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0e, 0x15, 0xdf, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x68, 0xaa, 0x01, 0x00, - 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6b, 0xe8, 0xf3, 0x17, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0xea, 0xaa, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x77, 0x73, 0x67, 0x69, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4b, 0xab, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x81, 0x71, 0xab, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa3, 0xab, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x2b, 0xc6, 0x07, 0x61, 0x0e, 0x00, 0x00, 0x19, 0x2c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x26, 0xba, + 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x33, 0xee, 0xa3, 0xf6, 0x0a, 0x00, 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0xcd, 0xc8, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, + 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x8f, 0xae, 0x2b, 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0d, 0xd4, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x52, 0xd8, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, + 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x88, 0xd8, 0x03, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xc3, 0xd8, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x03, 0xd9, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, + 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x16, 0x23, 0x9b, 0x51, 0x01, 0x00, 0x00, + 0xb2, 0x02, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4d, 0xd9, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, + 0x1f, 0xc2, 0x5d, 0xbc, 0x00, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x05, 0xdb, 0x03, 0x00, 0x71, 0x75, 0x61, + 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xc2, 0xc1, 0xc3, 0xba, 0x00, 0x00, 0x00, 0xd2, 0x01, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x25, 0xdc, 0x03, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, + 0xed, 0x81, 0x44, 0xdd, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x67, 0x54, + 0xb9, 0x75, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x89, 0xdd, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, + 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xed, 0x81, 0x69, 0xde, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, + 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa4, 0xde, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xe4, 0xde, 0x03, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x20, 0x9b, + 0xb4, 0xde, 0x01, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2e, 0xdf, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, + 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xa2, 0x67, 0x39, 0x94, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0x77, 0xe1, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, + 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7a, 0xe2, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x17, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa5, 0xe2, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xc5, 0xac, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xc0, 0xe3, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf0, 0xe3, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, + 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x28, 0xe4, 0x03, 0x00, 0x71, 0x75, 0x61, + 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x05, 0xeb, 0x03, 0x00, + 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x25, 0xb5, 0xab, 0x10, 0x02, 0x04, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xdb, 0xeb, 0x03, 0x00, + 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x2b, 0xc6, 0x07, 0x61, 0x0e, 0x00, 0x00, 0x19, 0x2c, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, + 0x21, 0xf0, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x33, 0xee, 0xa3, 0xf6, 0x0a, 0x00, 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xc1, + 0xfe, 0x03, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x8f, 0xae, 0x2b, 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0xfa, 0x09, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0x38, 0x0e, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xed, 0x81, 0x67, 0x0e, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x9b, 0x0e, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xd4, 0x0e, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0a, 0xe7, 0x07, 0xf9, 0x00, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0x17, 0x0f, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, + 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x4f, 0x11, 0xc3, 0x8a, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0x70, 0x10, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, + 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x49, 0xd9, 0x7c, 0x8a, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x57, 0x11, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x3f, 0x12, + 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x67, 0x54, 0xb9, 0x75, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x36, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x7d, 0x12, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x56, 0x13, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x8a, 0x13, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xc3, 0x13, 0x04, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x2d, 0xc8, 0x7b, 0x92, 0x01, 0x00, 0x00, 0x89, 0x03, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x06, 0x14, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xa2, 0x67, 0x39, 0x94, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xfc, 0x15, 0x04, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xdb, 0xf9, 0xb9, 0xcb, 0xff, 0x00, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf8, 0x16, 0x04, 0x00, + 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x3a, + 0x18, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x5d, 0x18, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8c, 0x18, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc4, 0x5e, 0x79, 0x62, 0xfd, 0x26, 0x00, 0x00, 0xd2, 0xa1, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe3, 0x18, 0x04, 0x00, 0x72, 0x75, + 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x23, 0xc1, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0x29, 0x40, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, + 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc5, 0x70, 0x1e, 0xeb, 0x03, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0x1a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x63, 0x41, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, + 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x96, 0x45, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, + 0xad, 0x46, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0a, 0x86, 0xd0, 0xc8, 0x01, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0xe0, 0x46, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x45, 0xd6, 0x55, 0x19, 0x03, 0x00, 0x00, 0x2e, 0x08, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf4, 0x48, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x94, 0x89, 0x68, 0xc1, 0x10, 0x02, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x5a, 0x4c, 0x04, 0x00, + 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb4, 0x4e, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xdc, 0x4e, + 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x87, 0xee, 0xf4, 0x02, 0x1f, 0x00, 0x00, 0x60, 0x7e, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x2c, 0x4f, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xdd, 0xc0, 0x65, 0xbe, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0x70, 0x6e, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x86, 0xa7, 0x33, 0xae, 0x03, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0x70, 0x6f, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 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, 0xed, 0x81, 0x5f, 0x73, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xe0, 0x86, 0xf1, 0xd5, 0x01, 0x00, 0x00, 0xee, 0x03, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x8b, 0x73, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0x3d, 0x7e, 0xd6, 0x13, 0x02, 0x00, 0x00, 0x72, 0x05, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa5, 0x75, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, + 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xdd, 0x37, 0xa9, 0xfd, 0x01, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xfe, 0x77, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xd4, 0x7c, 0x17, 0x35, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x3e, 0x7a, 0x04, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb3, 0x7a, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xdc, 0x7a, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x11, 0x7b, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xcd, + 0x7b, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0a, 0x7d, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xfc, 0xac, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, - 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, - 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x3b, 0xad, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, - 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, - 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x1f, 0xb4, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, - 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x10, - 0x26, 0x83, 0x33, 0x04, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xfc, 0xb4, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, - 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0x7a, 0xb9, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, - 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x2b, 0xc6, 0x07, 0x61, 0x0e, 0x00, 0x00, - 0x19, 0x2c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xe4, 0xb9, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x33, - 0xee, 0xa3, 0xf6, 0x0a, 0x00, 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x8b, 0xc8, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, - 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x79, 0x94, 0xb6, 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa4, 0x81, 0xcb, 0xd3, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, - 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x10, 0xd8, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x46, 0xd8, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x81, 0xd8, 0x01, 0x00, - 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, - 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xc1, 0xd8, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, - 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x16, 0x23, 0x9b, 0x51, 0x01, 0x00, 0x00, 0xb2, 0x02, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0b, 0xd9, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, - 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, - 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x1f, 0xc2, 0x5d, 0xbc, 0x00, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc3, 0xda, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc2, 0xc1, 0xc3, 0xba, 0x00, 0x00, 0x00, 0xd2, - 0x01, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe3, 0xdb, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xed, 0x81, 0x02, 0xdd, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, - 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x67, 0x54, 0xb9, 0x75, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x47, 0xdd, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x44, 0x7d, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, + 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x86, 0x7d, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xfd, 0x25, + 0x59, 0x77, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6a, 0x84, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, + 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, + 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x9e, 0xd3, 0xdb, 0x9a, 0x07, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x4b, 0x85, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, + 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x33, 0x8d, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, + 0x81, 0x50, 0x8e, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4b, 0x9b, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xb8, 0x7d, + 0x55, 0x22, 0x03, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x67, 0xa5, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, + 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xed, 0x81, 0xd5, 0xa8, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, + 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0e, 0xa9, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4c, 0xa9, 0x04, 0x00, 0x73, 0x70, + 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x8f, 0xa9, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x1e, 0xc2, 0x1b, 0x96, 0x02, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd7, 0xa9, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x45, 0x63, 0x68, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xfa, 0xdc, 0x7c, 0x96, 0x01, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd6, 0xac, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, + 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xe5, 0xae, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x80, 0x5f, 0x6d, 0x54, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2d, + 0xaf, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xef, 0xaf, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x2d, 0xb0, 0x04, 0x00, 0x73, + 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, + 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x70, 0xb0, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x65, 0xb0, 0x9a, 0x11, 0x03, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb8, 0xb0, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 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, 0x00, + 0x00, 0x00, 0xed, 0x81, 0x47, 0xb4, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0x75, 0xb4, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2a, 0xb5, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x60, 0xb6, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x93, 0xb6, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, + 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0xce, 0xb6, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xfd, 0x25, 0x59, 0x77, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xab, 0xbd, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, + 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0xfe, 0x0e, 0x8f, 0x06, 0x00, 0x00, 0xc1, 0x0f, 0x00, 0x00, 0x19, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x85, 0xbe, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, + 0x00, 0x56, 0x27, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x5b, 0xc5, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, + 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x41, 0x77, 0xf2, 0xcf, + 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4f, 0xd2, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x26, 0xa4, 0x1b, 0x1d, 0x1d, 0x03, 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x64, 0xdc, 0x04, 0x00, 0x73, + 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, + 0xc6, 0xdf, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xed, 0x81, 0xf8, 0xdf, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x2f, 0xe0, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x6b, 0xe0, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x88, 0xea, 0x63, 0x8b, 0x01, 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb1, 0xe0, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, + 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xaf, 0xe2, + 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x6e, 0x70, 0x95, 0x24, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf0, 0xe2, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x27, 0xde, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, - 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x81, 0x62, 0xde, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, - 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa2, 0xde, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x20, 0x9b, 0xb4, 0xde, 0x01, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0x3d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xec, 0xde, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xa2, 0x67, 0x39, - 0x94, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x35, 0xe1, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, - 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x81, 0x38, 0xe2, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, - 0x63, 0xe2, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x81, 0x7e, 0xe3, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x81, 0xae, 0xe3, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, - 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe6, 0xe3, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, - 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, - 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc3, 0xea, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, - 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xb5, 0xab, 0x10, 0x02, 0x04, 0x00, 0x00, 0xe4, 0x08, - 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x99, 0xeb, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, - 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x2b, 0xc6, 0x07, 0x61, 0x0e, - 0x00, 0x00, 0x19, 0x2c, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xdf, 0xef, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, - 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x33, 0xee, 0xa3, 0xf6, 0x0a, 0x00, - 0x00, 0xa7, 0x1d, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7f, 0xfe, 0x01, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x79, 0x94, 0xb6, - 0xfc, 0x03, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb8, 0x09, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, - 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf6, 0x0d, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, - 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x25, 0x0e, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, - 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x59, 0x0e, 0x02, 0x00, 0x71, - 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x81, 0x92, 0x0e, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, - 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0a, 0xe7, - 0x07, 0xf9, 0x00, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd5, 0x0e, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, - 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x4f, 0x11, - 0xc3, 0x8a, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2e, 0x10, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, - 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x49, 0xd9, 0x7c, 0x8a, 0x00, - 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x15, 0x11, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, - 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xfd, 0x11, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x67, 0x54, 0xb9, 0x75, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, - 0x3b, 0x12, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x81, 0x14, 0x13, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, - 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x48, 0x13, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, - 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x81, 0x13, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, - 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x2d, 0xc8, 0x7b, 0x92, 0x01, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa4, 0x81, 0xc4, 0x13, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, - 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, - 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xa2, 0x67, 0x39, 0x94, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xba, 0x15, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, - 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xf9, 0xb9, 0xcb, 0xff, 0x00, 0x00, 0x00, 0xe8, 0x01, - 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb6, 0x16, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf8, 0x17, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, - 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x1b, 0x18, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4a, 0x18, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x8a, 0x26, 0x03, 0x18, 0x26, 0x00, 0x00, 0xab, 0x9d, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa1, 0x18, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x5a, - 0x20, 0xcd, 0x00, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x02, 0x3f, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc5, 0x70, 0x1e, 0xeb, 0x03, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, - 0x18, 0x40, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, - 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4b, 0x44, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, - 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x62, 0x45, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x03, 0xda, - 0x36, 0xc8, 0x01, 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x95, 0x45, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x7a, 0x13, 0x17, 0x03, 0x00, 0x00, 0x1d, 0x08, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0xa9, 0x47, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x66, 0x64, 0xc8, 0xd2, 0x01, 0x00, 0x00, 0x83, 0x03, - 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0d, 0x4b, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x29, 0x4d, 0x02, 0x00, 0x72, 0x75, - 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x16, 0xc8, 0xa0, 0x0e, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x51, 0x4d, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x56, 0xaf, 0x8e, 0x26, 0x1f, - 0x00, 0x00, 0xbc, 0x7e, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa1, 0x4d, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, - 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x62, 0x3c, 0xce, - 0x9c, 0x00, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x09, 0x6d, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x86, - 0xa7, 0x33, 0xae, 0x03, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe7, 0x6d, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, - 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 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, 0xed, 0x81, 0xd6, 0x71, 0x02, 0x00, 0x72, 0x75, 0x73, - 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x03, 0x40, 0xa5, 0xd5, - 0x01, 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x02, 0x72, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfa, 0xab, 0x29, 0xcc, 0x13, 0x02, 0x00, 0x00, 0x7a, 0x05, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x1c, 0x74, 0x02, 0x00, 0x72, 0x75, - 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0x2e, 0xc4, 0x3e, 0xc0, 0x01, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, - 0x75, 0x76, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xd4, 0x7c, 0x17, 0x35, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0x78, 0x78, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x81, 0xed, 0x78, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x16, 0x79, 0x02, 0x00, - 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, - 0x81, 0x4b, 0x79, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x64, 0x69, - 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, - 0x00, 0x8b, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x07, 0x7a, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, - 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x81, 0x44, 0x7b, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, - 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7e, 0x7b, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe8, 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc0, 0x7b, - 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, - 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, - 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xfd, 0x25, 0x59, 0x77, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa4, 0x82, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x9e, 0xd3, 0xdb, 0x9a, - 0x07, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x85, 0x83, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, - 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x36, 0x47, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0x6d, 0x8b, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, - 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, - 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x8a, 0x8c, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, - 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x85, 0x99, - 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, - 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0xcc, 0x4f, 0x25, 0x03, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa1, 0xa3, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x12, 0xa7, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, - 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, - 0x4b, 0xa7, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, - 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x89, 0xa7, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x81, 0xcc, 0xa7, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, - 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x1e, 0xc2, 0x1b, 0x96, 0x02, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x14, 0xa8, 0x02, 0x00, 0x73, 0x70, 0x72, - 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, - 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x45, 0x63, 0x68, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xfa, 0xdc, 0x7c, 0x96, 0x01, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa4, 0x81, 0x13, 0xab, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x22, 0xad, 0x02, 0x00, 0x73, - 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x80, 0x5f, 0x6d, 0x54, 0x00, 0x00, - 0x00, 0x6c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6a, 0xad, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, - 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x81, 0x2c, 0xae, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, - 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x6a, 0xae, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x81, 0xad, 0xae, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, - 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xea, 0x65, 0xb0, 0x9a, 0x11, 0x03, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf5, 0xae, 0x02, 0x00, 0x73, 0x70, - 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, - 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xed, 0x81, 0x84, 0xb2, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, - 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x8c, 0x4a, 0xca, - 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb2, 0xb2, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, - 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, - 0x81, 0x67, 0xb3, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, - 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x9d, 0xb4, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, - 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xd0, 0xb4, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xac, 0xb9, - 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0b, 0xb5, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, - 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, - 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x62, 0xfd, 0x25, 0x59, 0x77, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe8, 0xbb, 0x02, - 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, - 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0xfe, 0x0e, 0x8f, 0x06, 0x00, 0x00, 0xc1, 0x0f, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, - 0xc2, 0xbc, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, - 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x98, 0xc3, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, - 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8c, 0xd0, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, - 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xa0, 0x7c, 0xf1, 0x20, 0x03, 0x00, 0x00, 0x0b, 0x0c, 0x00, - 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa1, 0xda, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x06, 0xde, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, - 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x38, 0xde, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, - 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x6f, 0xde, 0x02, - 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7b, 0xe3, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, + 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb2, 0xe3, 0x04, + 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xab, 0xde, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x88, 0xea, 0x63, 0x8b, 0x01, 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf1, - 0xde, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, - 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xef, 0xe0, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, - 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x6e, 0x70, 0x95, 0x24, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa4, 0x81, 0x30, 0xe1, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xbb, 0xe1, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, - 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf2, 0xe1, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, - 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x2e, 0xe2, 0x02, - 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x54, 0x48, 0xf2, 0x23, 0x02, 0x00, - 0x00, 0xdf, 0x05, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x74, 0xe2, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, - 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x45, - 0x63, 0x68, 0x6f, 0x43, 0x61, 0x73, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x9a, 0x87, 0x18, 0xc1, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa4, 0x81, 0x06, 0xe5, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, - 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0d, 0xe6, 0x02, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x81, 0x36, 0xe6, 0x02, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, - 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x54, 0xc9, 0x2d, 0xd5, 0x00, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6b, 0xe6, 0x02, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x39, 0x2d, 0xda, 0x51, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8e, 0xe7, 0x02, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1f, 0x58, 0xef, 0x91, 0x07, 0x00, 0x00, 0x09, 0x14, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa4, 0x81, 0x2f, 0xe8, 0x02, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, - 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0e, 0xf0, 0x02, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x12, 0x27, 0x18, 0xbb, 0x3c, 0x01, 0x00, 0xf4, 0x88, 0x04, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa4, 0x81, 0x7b, 0xf0, 0x02, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xee, 0xe3, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x54, 0x48, 0xf2, 0x23, 0x02, 0x00, 0x00, 0xdf, 0x05, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x34, + 0xe4, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, + 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x45, 0x63, 0x68, 0x6f, 0x43, 0x61, 0x73, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, + 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x9a, 0x87, 0x18, 0xc1, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc6, 0xe6, 0x04, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x6d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xcd, 0xe7, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf6, 0xe7, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x54, 0xc9, 0x2d, 0xd5, 0x00, 0x00, 0x00, + 0xc9, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2b, 0xe8, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x39, 0x2d, 0xda, 0x51, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x4e, 0xe9, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, + 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1f, 0x58, 0xef, 0x91, 0x07, 0x00, 0x00, 0x09, 0x14, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xef, 0xe9, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x09, 0x44, 0xfc, 0x3b, 0x1b, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xce, 0xf1, + 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x05, 0xf2, 0xde, 0xea, 0x51, 0x01, 0x00, 0xd2, 0xcc, + 0x04, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x3b, 0xf2, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x78, 0x27, 0x41, 0x02, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x7b, 0x44, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0d, 0x47, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x81, 0x07, 0x66, 0x11, 0x03, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x46, 0x47, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa8, 0x4a, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x5f, 0xde, 0xc3, 0x35, 0x02, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe2, 0x4a, 0x06, 0x00, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x10, 0xe2, 0xe7, 0xfb, 0x01, 0x00, + 0x00, 0x28, 0x04, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6f, 0x4d, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0xbb, 0x4f, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, + 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf5, 0x52, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e, 0x8c, 0x5d, 0xd6, 0x00, + 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x23, 0x53, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0xc9, 0xf3, 0xed, 0x51, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x40, 0x54, 0x06, 0x00, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xb4, 0x4f, 0xba, 0x85, 0x07, 0x00, 0x00, 0x39, 0x14, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0xda, 0x54, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, + 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0xa9, 0xd5, 0x6f, 0x48, 0x01, 0x00, 0xf2, 0xad, 0x04, 0x00, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa6, 0x5c, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf6, 0x04, 0x7c, 0x2a, 0x21, 0x02, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8c, 0x2d, 0x04, 0x00, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, - 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xfe, 0x2f, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x81, 0x07, 0x66, 0x11, 0x03, - 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x37, 0x30, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x81, 0x99, 0x33, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5f, 0xde, 0xc3, 0x35, 0x02, 0x00, 0x00, 0xbc, 0x04, 0x00, - 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd3, 0x33, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, - 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x10, 0xe2, 0xe7, 0xfb, 0x01, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x60, 0x36, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x83, - 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xac, 0x38, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xed, 0x81, 0xe6, 0x3b, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, - 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e, 0x8c, 0x5d, 0xd6, 0x00, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x14, 0x3c, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x73, 0x6c, - 0x69, 0x6e, 0x74, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc9, 0xf3, 0xed, 0x51, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x31, 0x3d, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xb4, - 0x4f, 0xba, 0x85, 0x07, 0x00, 0x00, 0x39, 0x14, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xcb, 0x3d, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x06, 0x1e, 0x61, 0x1a, 0x3b, 0x01, 0x00, 0x57, 0x88, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x97, - 0x45, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x16, 0xab, 0x51, 0x14, 0x02, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00, 0x81, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, - 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x5e, 0x83, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf8, 0xc1, 0xc9, 0x51, 0x58, 0x02, 0x00, 0x00, 0x91, 0x05, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x90, 0x83, 0x05, 0x00, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x81, 0x32, 0x86, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, - 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6d, 0x41, 0x6c, 0x95, 0x01, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x65, 0x86, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x9c, - 0xe5, 0x16, 0x96, 0x01, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4b, 0x88, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa4, 0x81, 0x2b, 0x8a, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, - 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x81, 0x1f, 0xc3, 0x68, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x5e, 0x8d, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0xef, 0x00, 0x1d, 0x47, 0x00, 0x00, 0x0c, 0x8e, 0x05, 0x00, 0x00, 0x00, + 0x1a, 0xb4, 0x30, 0x63, 0x12, 0x02, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x64, 0xa5, 0x07, 0x00, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0xc0, 0xa7, 0x07, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xc1, 0xc9, 0x51, 0x58, 0x02, 0x00, 0x00, 0x91, 0x05, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf2, 0xa7, 0x07, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x94, 0xaa, 0x07, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6d, 0x41, 0x6c, 0x95, 0x01, 0x00, + 0x00, 0x13, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc7, 0xaa, 0x07, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x9c, 0xe5, 0x16, 0x96, 0x01, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0xad, 0xac, 0x07, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, + 0x74, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8d, 0xae, 0x07, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, + 0x81, 0x1f, 0xc3, 0x68, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc0, 0xb1, 0x07, 0x00, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0xf1, + 0x00, 0xa7, 0x47, 0x00, 0x00, 0x6e, 0xb2, 0x07, 0x00, 0x00, 0x00, } diff --git a/go.mod b/go.mod index 47aaaa0d69..eb7521d8d6 100644 --- a/go.mod +++ b/go.mod @@ -1,137 +1,146 @@ module knative.dev/func -go 1.18 +go 1.20 require ( github.com/AlecAivazis/survey/v2 v2.3.6 github.com/Masterminds/semver v1.5.0 - github.com/Microsoft/go-winio v0.6.0 + github.com/Microsoft/go-winio v0.6.1 github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b - github.com/buildpacks/pack v0.29.0 - github.com/cloudevents/sdk-go/v2 v2.13.0 - github.com/containerd/containerd v1.6.18 - github.com/containers/image/v5 v5.19.1 + github.com/buildpacks/pack v0.30.0-pre3 + github.com/cloudevents/sdk-go/v2 v2.14.0 + github.com/containerd/containerd v1.7.2 + github.com/containers/image/v5 v5.26.1 github.com/coreos/go-semver v0.3.0 - github.com/docker/cli v23.0.1+incompatible - github.com/docker/docker v23.0.0-rc.1+incompatible + github.com/docker/cli v24.0.2+incompatible + github.com/docker/docker v24.0.5-0.20230718221249-d4a26c153000+incompatible github.com/docker/docker-credential-helpers v0.7.0 github.com/docker/go-connections v0.4.0 - github.com/go-git/go-billy/v5 v5.4.0 - github.com/go-git/go-git/v5 v5.6.0 + github.com/go-git/go-billy/v5 v5.4.1 + github.com/go-git/go-git/v5 v5.7.0 github.com/google/go-cmp v0.5.9 - github.com/google/go-containerregistry v0.13.0 + github.com/google/go-containerregistry v0.15.2 github.com/google/go-github/v49 v49.1.0 github.com/google/uuid v1.3.0 github.com/heroku/color v0.0.6 github.com/hinshun/vt10x v0.0.0-20220228203356-1ab2cad5fd82 - github.com/opencontainers/image-spec v1.1.0-rc2 + github.com/opencontainers/image-spec v1.1.0-rc4 github.com/openshift-pipelines/pipelines-as-code v0.17.1 - github.com/openshift/source-to-image v1.3.1 + github.com/openshift/source-to-image v1.3.8 github.com/ory/viper v1.7.5 github.com/pkg/errors v0.9.1 github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 github.com/schollz/progressbar/v3 v3.13.1 - github.com/spf13/cobra v1.6.1 + github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/tektoncd/cli v0.29.1 - github.com/tektoncd/pipeline v0.44.0 + github.com/tektoncd/cli v0.31.1 + github.com/tektoncd/pipeline v0.47.0 github.com/whilp/git-urls v1.0.0 - golang.org/x/crypto v0.7.0 - golang.org/x/oauth2 v0.5.0 - golang.org/x/sync v0.1.0 - golang.org/x/term v0.6.0 + github.com/xanzy/go-gitlab v0.83.0 + golang.org/x/crypto v0.11.0 + golang.org/x/net v0.12.0 + golang.org/x/oauth2 v0.9.0 + golang.org/x/sync v0.3.0 + golang.org/x/term v0.10.0 gopkg.in/yaml.v2 v2.4.0 gotest.tools/v3 v3.4.0 - k8s.io/api v0.26.1 - k8s.io/apimachinery v0.26.1 + k8s.io/api v0.26.5 + k8s.io/apimachinery v0.26.5 k8s.io/client-go v1.5.2 - knative.dev/client-pkg v0.0.0-20230501131754-e5c405e16e90 - knative.dev/eventing v0.37.1-0.20230518094712-4b9fdefe36a3 - knative.dev/hack v0.0.0-20230501013555-7d81248b4638 - knative.dev/pkg v0.0.0-20230518105712-dfb4bf04635d - knative.dev/serving v0.37.1-0.20230515180909-99800edf6260 + knative.dev/client-pkg v0.0.0-20230726202841-bd83cf476909 + knative.dev/eventing v0.38.0 + knative.dev/hack v0.0.0-20230712131415-ddae80293c43 + knative.dev/pkg v0.0.0-20230718152110-aef227e72ead + knative.dev/serving v0.38.0 ) require ( - cloud.google.com/go/compute v1.15.1 // indirect + github.com/OneOfOne/xxhash v1.2.8 // indirect + github.com/moby/patternmatcher v0.5.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529 // indirect + sigs.k8s.io/controller-runtime v0.7.2 // indirect +) + +require ( + cloud.google.com/go/compute v1.20.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.28 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.22 // indirect + github.com/Azure/go-autorest/autorest v0.11.29 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.2.1 // indirect - github.com/Microsoft/hcsshim v0.9.6 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 // indirect - github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect + github.com/acomagu/bufpipe v1.0.4 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect github.com/apex/log v1.9.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.17.3 // indirect - github.com/aws/aws-sdk-go-v2/config v1.18.9 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.9 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28 // indirect - github.com/aws/aws-sdk-go-v2/service/ecr v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.15.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.21 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/config v1.18.27 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.26 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 // indirect + github.com/aws/aws-sdk-go-v2/service/ecr v1.18.11 // indirect + github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.16.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 // indirect github.com/aws/smithy-go v1.13.5 // indirect - github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230110223219-40efa3093a22 // indirect + github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230522190001-adf1bafd791a // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blendle/zapdriver v1.3.1 // indirect - github.com/buildpacks/imgutil v0.0.0-20230221152838-4cf98dd677d2 // indirect - github.com/buildpacks/lifecycle v0.16.0 // indirect + github.com/buildpacks/imgutil v0.0.0-20230626185301-726f02e4225c // indirect + github.com/buildpacks/lifecycle v0.17.0-rc.3 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chrismellard/docker-credential-acr-env v0.0.0-20221129204813-6a4d6ed5d396 // indirect + github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect github.com/cloudevents/sdk-go/sql/v2 v2.13.0 // indirect - github.com/cloudflare/circl v1.1.0 // indirect - github.com/containerd/cgroups v1.0.4 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.13.0 // indirect + github.com/cloudflare/circl v1.3.3 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect github.com/containerd/typeurl v1.0.2 // indirect - github.com/containers/storage v1.38.2 // indirect + github.com/containers/storage v1.48.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/creack/pty v1.1.18 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgraph-io/ristretto v0.0.1 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/tcell/v2 v2.6.0 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.4.3 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.13.0 // indirect github.com/google/gnostic v0.6.9 // indirect @@ -139,31 +148,35 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 // indirect github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/go-retryablehttp v0.7.4 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect - github.com/imdario/mergo v0.3.13 // indirect + github.com/imdario/mergo v0.3.15 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/jonboulle/clockwork v0.3.0 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.15.15 // indirect + github.com/klauspost/compress v1.16.6 // indirect github.com/kr/pty v1.1.8 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect + github.com/manifestival/client-go-client v0.5.0 + github.com/manifestival/manifestival v0.7.2 github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect @@ -171,46 +184,45 @@ require ( github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moby/buildkit v0.11.1 // indirect + github.com/moby/buildkit v0.11.6 // indirect github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/sys/mount v0.3.3 // indirect github.com/moby/sys/mountinfo v0.6.2 // indirect - github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect + github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/runc v1.1.4 // indirect - github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect - github.com/opencontainers/selinux v1.10.2 // indirect + github.com/opencontainers/runc v1.1.7 // indirect + github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect + github.com/opencontainers/selinux v1.11.0 // indirect github.com/openzipkin/zipkin-go v0.4.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.15.1 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/prometheus/statsd_exporter v0.23.0 // indirect github.com/rickb777/date v1.20.1 // indirect github.com/rickb777/plural v1.4.1 // indirect github.com/rivo/tview v0.0.0-20220307222120-9994674d60a8 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/skeema/knownhosts v1.1.0 // indirect - github.com/spf13/afero v1.9.3 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/skeema/knownhosts v1.1.1 // indirect + github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/stoewer/go-strcase v1.2.1 // indirect - github.com/subosito/gotenv v1.4.1 // indirect + github.com/subosito/gotenv v1.4.2 // indirect github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect - github.com/tektoncd/triggers v0.22.0 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect + github.com/tektoncd/triggers v0.23.1-0.20230420080448-bf603123cc0f // indirect + github.com/vbatts/tar-split v0.11.3 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect @@ -218,28 +230,28 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.9.1 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.108.0 // indirect + google.golang.org/api v0.125.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2 // indirect - google.golang.org/grpc v1.52.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/grpc v1.56.1 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.26.1 // indirect - k8s.io/cli-runtime v0.25.4 // indirect - k8s.io/klog/v2 v2.90.0 // indirect - k8s.io/kube-openapi v0.0.0-20230123231816-1cb3ae25d79a // indirect - k8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect - knative.dev/networking v0.0.0-20230511122402-33636d99d870 // indirect + gopkg.in/yaml.v3 v3.0.1 + k8s.io/apiextensions-apiserver v0.26.5 // indirect + k8s.io/cli-runtime v0.25.9 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect + k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect + knative.dev/networking v0.0.0-20230718160410-75dcd54d9510 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.12.1 // indirect sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect @@ -251,13 +263,11 @@ replace ( // Version used in Eventing github.com/cloudevents/sdk-go/sql/v2 => github.com/cloudevents/sdk-go/sql/v2 v2.0.0-20220930150014-52b12276cc4a - github.com/docker/docker => github.com/docker/docker v20.10.21+incompatible + // Use older version since it checks ~/.docker/config.json for credentials as opposed to later versions + github.com/containers/image/v5 => github.com/containers/image/v5 v5.23.1 + // Tekton CLI uses newer version without currently used constructor code github.com/hinshun/vt10x => github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c - // update docker to be compatible with version used by pack and removes invalid pseudo-version - github.com/openshift/source-to-image => github.com/boson-project/source-to-image v1.3.2 - // github.com/tektoncd/cli v0.29.1 requires github.com/tektoncd/pipeline v0.42.0 - github.com/tektoncd/pipeline => github.com/tektoncd/pipeline v0.42.0 // Pin k8s.io dependencies to align with Knative and Tekton needs k8s.io/api => k8s.io/api v0.25.4 k8s.io/apimachinery => k8s.io/apimachinery v0.25.4 diff --git a/go.sum b/go.sum index 6e621b80cc..0fc0a47754 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,6 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= @@ -33,22 +27,18 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.15.1 h1:7UGq3QknM33pw5xATlpzeoomNxsacIVvTqTTvbfajmE= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.20.0 h1:cUOcywWuowO9It2i1KX1lIb0HH7gLv6nENKuZGnlcSo= +cloud.google.com/go/compute v1.20.0/go.mod h1:kn5BhC++qUWR/AM3Dn21myV7QbgqejW04cAOrtppaQI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -59,283 +49,159 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= -contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= -contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= -contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= -github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw= github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= -github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= -github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= -github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= +github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.22 h1:/GblQdIudfEM3AWWZ0mrYJQSd7JS4S/Mbzh6F0ov0Xc= github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= +github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 h1:wkAZRgT/pn8HhFyzfe9UnqOjJYqlembgCTi72Bm/xKk= github.com/Azure/go-autorest/autorest/azure/auth v0.5.12/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= -github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= -github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= -github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.10.0-rc.8 h1:YSZVvlIIDD1UxQpJp0h+dnpLUw+TrY0cx8obKsp3bek= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 h1:ra2OtmuW0AE5csawV4YXMNGNQQXvLRps3z2Z59OPO+I= -github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek= +github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= -github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= +github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b h1:doCpXjVwui6HUN+xgNsNS3SZ0/jUZ68Eb+mJRNOZfog= github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= -github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= -github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= -github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= -github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go-v2 v1.17.3 h1:shN7NlnVzvDUgPQ+1rLMSxY8OWRNDRYtiqe0p/PgrhY= -github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.8/go.mod h1:5XCmmyutmzzgkpk/6NYTjeWb6lgo9N170m1j6pQkIBs= -github.com/aws/aws-sdk-go-v2/config v1.18.9 h1:pd+QUO1dvro6vGOuhgglJV6adGunU95xSTSzsQGhKpY= -github.com/aws/aws-sdk-go-v2/config v1.18.9/go.mod h1:2Lx9yaA/McDeQS8ft+edKrmOd5ry1v1euFQ+oGwUxsM= -github.com/aws/aws-sdk-go-v2/credentials v1.13.8/go.mod h1:lVa4OHbvgjVot4gmh1uouF1ubgexSCN92P6CJQpT0t8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.9 h1:oxM/C8eXGsiHH+u0gZGo1++QTFPf+N5MUb1tfaaQMpU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.9/go.mod h1:45DrDZTok50mEx4Uw59ym7n11Oy7G4gt0Pez2Z4ktAA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21 h1:j9wi1kQ8b+e0FBVHxCqCGo4kxDU175hoDHcWAi0sauU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21/go.mod h1:ugwW57Z5Z48bpvUyZuaPy4Kv+vEfJWnIrky7RmkBvJg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 h1:I3cakv2Uy1vNmmhRQmFptYDxOvBnwCdNwyw63N0RaRU= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 h1:5NbbMrIzmUn/TXFqAle6mgrH5m9cOvMLRGL7pnG8tRE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28 h1:KeTxcGdNnQudb46oOl4d90f2I33DF/c6q3RnZAmvQdQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28/go.mod h1:yRZVr/iT0AqyHeep00SZ4YfBAKojXz08w3XMBscdi0c= -github.com/aws/aws-sdk-go-v2/service/ecr v1.18.0/go.mod h1:9yGOFsa2OcdyePojE89xNGtdBusTyc8ocjpiuFtFc0g= -github.com/aws/aws-sdk-go-v2/service/ecr v1.18.1 h1:fZNQcqqyAcb34XZ6uNuDlmKIaZKRGdoXYfK5WLRjBbQ= -github.com/aws/aws-sdk-go-v2/service/ecr v1.18.1/go.mod h1:9yGOFsa2OcdyePojE89xNGtdBusTyc8ocjpiuFtFc0g= -github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.15.0 h1:nZ/878IgQMYFd0RIYEoUYnr9kwyDu2GcExWmyVIb7Xo= -github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.15.0/go.mod h1:bBy8YiBBFd549EeySGjb0vHWg80XeMSigv/dr/2HFjE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.21 h1:5C6XgTViSb0bunmU57b3CT+MhxULqHH2721FVA+/kDM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.21/go.mod h1:lRToEJsn+DRA9lW4O9L9+/3hjTkUzlzyzHqn8MTds5k= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.0 h1:/2gzjhQowRLarkkBOGPXSRnb8sQ2RVsjdG1C/UliK/c= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.0/go.mod h1:wo/B7uUm/7zw/dWhBJ4FXuw1sySU5lyIhVg1Bu2yL9A= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.0 h1:Jfly6mRxk2ZOSlbCvZfKNS7TukSx1mIzhSsqZ/IGSZI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.0/go.mod h1:TZSH7xLO7+phDtViY/KUp9WGCJMQkLJ/VpgkTFd5gh8= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.0/go.mod h1:+lGbb3+1ugwKrNTWcf2RT05Xmp543B06zDFTwiTLp7I= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.1 h1:q3xG67qnKp1gsYSJY5AtTvFKY2IlmGPGrTw/Wy8EjeQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.1/go.mod h1:+lGbb3+1ugwKrNTWcf2RT05Xmp543B06zDFTwiTLp7I= +github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.18.1 h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo= +github.com/aws/aws-sdk-go-v2 v1.18.1/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2/config v1.18.22/go.mod h1:mN7Li1wxaPxSSy4Xkr6stFuinJGf3VZW3ZSNvO0q6sI= +github.com/aws/aws-sdk-go-v2/config v1.18.27 h1:Az9uLwmssTE6OGTpsFqOnaGpLnKDqNYOJzWuC6UAYzA= +github.com/aws/aws-sdk-go-v2/config v1.18.27/go.mod h1:0My+YgmkGxeqjXZb5BYme5pc4drjTnM+x1GJ3zv42Nw= +github.com/aws/aws-sdk-go-v2/credentials v1.13.21/go.mod h1:90Dk1lJoMyspa/EDUrldTxsPns0wn6+KpRKpdAWc0uA= +github.com/aws/aws-sdk-go-v2/credentials v1.13.26 h1:qmU+yhKmOCyujmuPY7tf5MxR/RKyZrOPO3V4DobiTUk= +github.com/aws/aws-sdk-go-v2/credentials v1.13.26/go.mod h1:GoXt2YC8jHUBbA4jr+W3JiemnIbkXOfxSXcisUsZ3os= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 h1:LxK/bitrAr4lnh9LnIS6i7zWbCOdMsfzKFBI6LUCS0I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4/go.mod h1:E1hLXN/BL2e6YizK1zFlYd8vsfi2GTjbjBazinMmeaM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 h1:A5UqQEmPaCFpedKouS4v+dHCTUo2sKqhoKO9U5kxyWo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34/go.mod h1:wZpTEecJe0Btj3IYnDx/VlUzor9wm3fJHyvLpQF0VwY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 h1:srIVS45eQuewqz6fKKu6ZGXaq6FuFg5NzgQBAM6g8Y4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28/go.mod h1:7VRpKQQedkfIEXb4k52I7swUnZP0wohVajJMRn3vsUw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 h1:LWA+3kDM8ly001vJ1X1waCuLJdtTl48gwkPKWy9sosI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35/go.mod h1:0Eg1YjxE0Bhn56lx+SHJwCzhW+2JGtizsrx+lCqrfm0= +github.com/aws/aws-sdk-go-v2/service/ecr v1.18.10/go.mod h1:Ce1q2jlNm8BVpjLaOnwnm5v2RClAbK6txwPljFzyW6c= +github.com/aws/aws-sdk-go-v2/service/ecr v1.18.11 h1:wlTgmb/sCmVRJrN5De3CiHj4v/bTCgL5+qpdEd0CPtw= +github.com/aws/aws-sdk-go-v2/service/ecr v1.18.11/go.mod h1:Ce1q2jlNm8BVpjLaOnwnm5v2RClAbK6txwPljFzyW6c= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.16.1/go.mod h1:uHtRE7aqXNmpeYL+7Ec7LacH5zC9+w2T5MBOeEKDdu0= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.16.2 h1:yflJrGmi1pXtP9lOpOeaNZyc0vXnJTuP2sor3nJcGGo= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.16.2/go.mod h1:uHtRE7aqXNmpeYL+7Ec7LacH5zC9+w2T5MBOeEKDdu0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 h1:bkRyG4a929RCnpVSTvLM2j/T4ls015ZhhYApbmYs15s= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28/go.mod h1:jj7znCIg05jXlaGBlFMGP8+7UN3VtCkRBG2spnmRQkU= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.9/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 h1:nneMBM2p79PGWBQovYO/6Xnc2ryRMw3InnDJq1FHkSY= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.12/go.mod h1:HuCOxYsF21eKrerARYO6HapNeh9GBNq7fius2AcwodY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 h1:2qTR7IFk7/0IN/adSFhYu9Xthr0zVFTgBrmPldILn80= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12/go.mod h1:E4VrHCPzmVB/KFXtqBGKb3c8zpbNBgKe3fisDNLAW5w= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.10/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 h1:XFJ2Z6sNUUcAz9poj+245DMkrHE4h2j5I9/xD50RHfE= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.2/go.mod h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230110223219-40efa3093a22 h1:Sq2n1xnF4uuEGNUVOLKHZXoL0CVdxIQOQTEZ7EW762Q= -github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230110223219-40efa3093a22/go.mod h1:G93AFVEAkW0+tabIqmQCLN/r6sZgP4pFxfoiEzDeQNM= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230522190001-adf1bafd791a h1:rW+dV12c0WD3+O4Zs8Qt4+oqnr8ecXeyg8g3yB73ZKA= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230522190001-adf1bafd791a/go.mod h1:1mvdZLjy932pV2fhj1jjwUSHaF5Ogq2gk5bvi/6ngEU= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= -github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= -github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/boson-project/source-to-image v1.3.2 h1:jy0MQCbc6Ix/SrK9YUeuYUVP5XRFos15I5flTXC6GlY= -github.com/boson-project/source-to-image v1.3.2/go.mod h1:uT4SRJAhYbi9VbTIL0Os+0TTwTgqKwNydy7LoXrQ7v4= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/buildpacks/imgutil v0.0.0-20230221152838-4cf98dd677d2 h1:UjLEI78jFKLQwpFI2rpgKOZyXKW1cQdy7Wf+8Z6Lu1M= -github.com/buildpacks/imgutil v0.0.0-20230221152838-4cf98dd677d2/go.mod h1:zL5lZzgFuv9l36n52FjomVrUHpyuZf6r1UHKaZ4LeSQ= -github.com/buildpacks/lifecycle v0.16.0 h1:Q80RNP1JImJbkOXY/z/rWD9spqgEkTe/5/JypkOxJZ8= -github.com/buildpacks/lifecycle v0.16.0/go.mod h1:fiM5EwiDImyWA5kZ2fTNy0+bC4izwiCMR9rNsXbQnFc= -github.com/buildpacks/pack v0.29.0 h1:6BmI6wMrqLjYbX4pYLVVUsQlQcLWsDwnihdgtrR+cuQ= -github.com/buildpacks/pack v0.29.0/go.mod h1:cdGJ9aU1+NplYXJnclUrabKRoWuWwGs4C5O93Lro50o= +github.com/buildpacks/imgutil v0.0.0-20230626185301-726f02e4225c h1:HlRuSz+JGAzudNtNCfHIzXe0AEuHX6Vx8uZgmjvX02o= +github.com/buildpacks/imgutil v0.0.0-20230626185301-726f02e4225c/go.mod h1:mBG5M3GJW5nknCEOOqtmMHyPYnSpw/5GEiciuYU/COw= +github.com/buildpacks/lifecycle v0.17.0-rc.3 h1:GAo6Gv2hFbhjf0JX7M2khS8jd6vU8I9oCkheIhHQwxg= +github.com/buildpacks/lifecycle v0.17.0-rc.3/go.mod h1:WFzcNp1WG4bwgHuXtKxMg4tdU3AguL44ZlP3knANeVs= +github.com/buildpacks/pack v0.30.0-pre3 h1:CvR190XpOdBuE6IvbrQTBQGNzfa0w6NbZvmlNVK+na4= +github.com/buildpacks/pack v0.30.0-pre3/go.mod h1:NS52koSs7fViRyNtq1Twd4MyO2iwNDwRTB7w2+9bZ6k= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= -github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= -github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -344,257 +210,91 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chrismellard/docker-credential-acr-env v0.0.0-20221129204813-6a4d6ed5d396 h1:ZUOndrE3hI7kIqsIAxtMLEmgakCLWodkiBxqoAN1QSQ= -github.com/chrismellard/docker-credential-acr-env v0.0.0-20221129204813-6a4d6ed5d396/go.mod h1:1UmFRnmMnVsHwD+ZntmLkoVBB1ZLa6V+XXEbF6hZCxU= +github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4= +github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go/sql/v2 v2.0.0-20220930150014-52b12276cc4a h1:jwFoLdIzNYc92s2ZwhU4yOdoPP8zoALcKOzenIALHJM= github.com/cloudevents/sdk-go/sql/v2 v2.0.0-20220930150014-52b12276cc4a/go.mod h1:SPV4fdKh1YqSNn2TTUVqUcw1El9Er0HI/yzay5wqsFk= -github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw= -github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= -github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY= +github.com/cloudevents/sdk-go/v2 v2.14.0 h1:Nrob4FwVgi5L4tV9lhjzZcjYqFVyJzsA56CwPaPfv6s= +github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= -github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= -github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= -github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= -github.com/containerd/stargz-snapshotter v0.6.4/go.mod h1:1t0SF1gAHJhCSftWKDLVitvfF3c2qhL5hymG7C50wto= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.6.4/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= -github.com/containerd/stargz-snapshotter/estargz v0.11.0/go.mod h1:/KsZXsJRllMbTKFfG0miFQWViQKdI9+9aSXs+HN0+ac= -github.com/containerd/stargz-snapshotter/estargz v0.13.0 h1:fD7AwuVV+B40p0d9qVkH/Au1qhp8hn/HWJHIYjpEcfw= -github.com/containerd/stargz-snapshotter/estargz v0.13.0/go.mod h1:m+9VaGJGlhCnrcEUod8mYumTmRgblwd3rC5UCEh2Yp0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/containerd v1.7.2 h1:UF2gdONnxO8I6byZXDi5sXWiWvlW3D/sci7dTQimEJo= +github.com/containerd/containerd v1.7.2/go.mod h1:afcz74+K10M/+cjGHIVQrCt3RAQhUSCAjJ9iMYhhkuI= +github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= +github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/image/v5 v5.19.1 h1:g4/+XIuh1kRoRn2MfLDhfHhkNOIO9JtqhSyo55tjpfE= -github.com/containers/image/v5 v5.19.1/go.mod h1:ewoo3u+TpJvGmsz64XgzbyTHwHtM94q7mgK/pX+v2SE= -github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/storage v1.38.2 h1:8bAIxnVBGKzMw5EWCivVj24bztQT6IkDp4uHiyhnzwE= -github.com/containers/storage v1.38.2/go.mod h1:INP0RPLHWBxx+pTsO5uiHlDUGHDFvWZPWprAbAlQWPQ= +github.com/containers/image/v5 v5.23.1 h1:dUK9p5xfd38iTQXJEgMsUGqIHXbkDugrleZtd3zB+Wg= +github.com/containers/image/v5 v5.23.1/go.mod h1:EXFFGEsL99S6aqLqK2mQJ3yrNh6Q05UCHt4mhF9JNoM= +github.com/containers/storage v1.48.0 h1:wiPs8J2xiFoOEAhxHDRtP6A90Jzj57VqzLRXOqeizns= +github.com/containers/storage v1.48.0/go.mod h1:pRp3lkRo2qodb/ltpnudoXggrviRmaCmU5a5GhTBae0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgraph-io/ristretto v0.0.1 h1:cJwdnj42uV8Jg4+KLrYovLiCgIfz9wtWm6E6KA+1tLs= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= -github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.21+incompatible h1:UTLdBmHk3bEY+w8qeO5KttOhy6OmXWsl/FEet9Uswog= -github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= +github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.5-0.20230718221249-d4a26c153000+incompatible h1:LkM7hKYoTf+ESj5ZuqRlI8NFxcKp2UprZ/IeL9Dses8= +github.com/docker/docker v24.0.5-0.20230718221249-d4a26c153000+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -604,36 +304,26 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.0.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.2.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= @@ -642,114 +332,109 @@ github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5 github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= -github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.4.0 h1:Vaw7LaSTRJOUric7pe4vnzBSgyuf2KrLsu2Y4ZpQBDE= -github.com/go-git/go-billy/v5 v5.4.0/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= -github.com/go-git/go-git-fixtures/v4 v4.3.1 h1:y5z6dd3qi8Hl+stezc8p3JxDkoTRqMAlKnXHuzrfjTQ= -github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= -github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= -github.com/go-git/go-git/v5 v5.6.0 h1:JvBdYfcttd+0kdpuWO7KTu0FYgCf5W0t5VwkWGobaa4= -github.com/go-git/go-git/v5 v5.6.0/go.mod h1:6nmJ0tJ3N4noMV1Omv7rC5FG3/o8Cm51TB4CJp7mRmE= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= +github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8= +github.com/go-git/go-git/v5 v5.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE= +github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/zapr v0.2.0 h1:v6Ji8yBW77pva6NkJKQdHLAJKrIJKRHz0RXwPqCHSR4= +github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -757,7 +442,6 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -785,31 +469,10 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4-0.20210608040537-544b4180ac70/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= -github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= @@ -817,7 +480,6 @@ github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.13.0 h1:z+8OBOcmh7IeKyqwT/6IlnMvy621fYUqnTVPEdegGlU= github.com/google/cel-go v0.13.0/go.mod h1:K2hpQgEjDp18J76a2DKFRlPBPpgRZgi6EbnpDgIhJ8s= -github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= @@ -836,29 +498,17 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= -github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.13.0 h1:y1C7Z3e149OJbOPDBxLYR8ITPz8dTKqQwjErKVHJC8k= -github.com/google/go-containerregistry v0.13.0/go.mod h1:J9FQ+eSS4a1aC2GNZxvNpbWhgp0487v+cgiilB4FqDo= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-containerregistry v0.15.2 h1:MMkSh+tjSdnmJZO7ljvEqV1DjfekB6VUEAZgy3a+TQE= +github.com/google/go-containerregistry v0.15.2/go.mod h1:wWK+LnOv4jXMM23IT/F1wdYftGWGr47Is8CG+pmHK1Q= github.com/google/go-github/v49 v49.1.0 h1:LFkMgawGQ8dfzWLH/rNE0b3u1D3n6/dw7ZmrN3b+YFY= github.com/google/go-github/v49 v49.1.0/go.mod h1:MUUzHPrhGniB6vUKa27y37likpipzG+BXXJbG04J334= -github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= -github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= @@ -879,121 +529,58 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= -github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= -github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= -github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 h1:1JYBfzqrWPcCclBwxFCPAou9n+q86mfnu7NAeHfte7A= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0/go.mod h1:YDZoGHuwE+ov0c8smSH49WLF3F2LaWnYYuDVd+EWrc0= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= github.com/heroku/color v0.0.6 h1:UTFFMrmMLFcL3OweqP1lAdp8i1y/9oHqkeHjQ/b/Ny0= github.com/heroku/color v0.0.6/go.mod h1:ZBvOcx7cTF2QKOv4LbmoBtNl5uB17qWxGuzZrsi1wLU= github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c h1:kp3AxgXgDOmIJFR7bIwqFhwJ2qWar8tEQSE5XXhCfVk= @@ -1001,57 +588,32 @@ github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c/go.mod h1:DqJ97dSdRW github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= -github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= -github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= -github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= -github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1067,172 +629,102 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/compress v1.16.6 h1:91SKEy4K37vkp255cJ8QesJhjyRO0hn9i9G0GoUwLsk= +github.com/klauspost/compress v1.16.6/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf h1:ndns1qx/5dL43g16EQkPV/i8+b3l5bYQwLeoSBe7tS8= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= -github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/manifestival/client-go-client v0.5.0 h1:LZUidASM6rwTEI40wtxYDKi+VHhDRnYT4xuYuLjExp4= +github.com/manifestival/client-go-client v0.5.0/go.mod h1:sDehep6aHdIEdUKnRSvueGf2TbQfd653Sn2picTeQqM= +github.com/manifestival/manifestival v0.6.0/go.mod h1:3Qq9cnPy7sv7FVhg2Kvw0ebb35R4OdctS4UjTjHlHm4= +github.com/manifestival/manifestival v0.7.2 h1:l4uFdWX/xQK4QcRfqGoMtBvaZeWPEuwD6hVsCwUqZY4= +github.com/manifestival/manifestival v0.7.2/go.mod h1:nl3T6HlfHCeidooWVTMI9vYNTBkQ1GdhLNb+smozbdk= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e h1:Qa6dnn8DlasdXRnacluu8HzPts0S1I9zvvUPDbBnXFI= github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e/go.mod h1:waEya8ee1Ro/lgxpVhkJI4BVASzkm3UZqkx/cFJiYHM= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= -github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= -github.com/moby/buildkit v0.9.3/go.mod h1:5dZQUHg9STw/Fhl4zZiusDJKn8uje/0x952Nce4a8cg= -github.com/moby/buildkit v0.11.1 h1:D7ghEeXgwq4v6WT+YExVruip4GLqm3UT1+7JBLhNBic= -github.com/moby/buildkit v0.11.1/go.mod h1:v43oa6H2Fx/cdzc7j0UlUu8p6188yy1P3vrujAs99uw= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/buildkit v0.11.6 h1:VYNdoKk5TVxN7k4RvZgdeM4GOyRvIi4Z8MXOY7xvyUs= +github.com/moby/buildkit v0.11.6/go.mod h1:GCqKfHhz+pddzfgaR7WmHVEE3nKKZMMDPpK8mh3ZLv4= +github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo= +github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= -github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= -github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= -github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= -github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= -github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= -github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= -github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= @@ -1241,200 +733,112 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/onsi/gomega v1.27.2 h1:SKU0CXeKE/WVgIV1T61kSa3+IRE8Ekrv9rdXDwwTqnY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20211202193544-a5463b7f9c84/go.mod h1:Qnt1q4cjDNQI9bT832ziho5Iw2BhK8o1KwLOwW56VP4= -github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.4 h1:nRCz/8sKg6K6jgYAFLDlXzPeITBZJyX28DBVhWD+5dg= -github.com/opencontainers/runc v1.1.4/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opencontainers/selinux v1.10.2 h1:NFy2xCsjn7+WspbfZkUd5zyVeisV7VFbPSP96+8/ha4= -github.com/opencontainers/selinux v1.10.2/go.mod h1:cARutUbaUrlRClyvxOICCgKixCs6L05aUsohzA3EkHQ= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.7 h1:y2EZDS8sNng4Ksf0GUYNhKbTShZJPJg1FiXJNH/uoCk= +github.com/opencontainers/runc v1.1.7/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= +github.com/opencontainers/runtime-spec v1.1.0-rc.3 h1:l04uafi6kxByhbxev7OWiuUv0LZxEsYUfDWZ6bztAuU= +github.com/opencontainers/runtime-spec v1.1.0-rc.3/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= github.com/openshift-pipelines/pipelines-as-code v0.17.1 h1:9+vnu3FMrfMy6R+jhaV6jvmVhDrXRYuGvgHHrCfTdrU= github.com/openshift-pipelines/pipelines-as-code v0.17.1/go.mod h1:5gCkO4y2PEFZ842tbF8376rD386DkoSyyQI3vjdqwq4= -github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openshift/source-to-image v1.3.8 h1:G9qZfEcu79SQKYs7vX5vglx+pP1kDW/s9iuOkmiTpoI= +github.com/openshift/source-to-image v1.3.8/go.mod h1:s0OWZbn4JJaZ2vAfUBBTFEgHmh2tzq492xj7HRdXolc= github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A= github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/proglottis/gpgme v0.1.1/go.mod h1:fPbW/EZ0LvwQtH8Hy7eixhp1eF3G39dtx7GUN+0Gmy0= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/prometheus/statsd_exporter v0.23.0 h1:GEkriUCmARYh1gSA0gzpvmTg/oHMc5MfDFNlS/che4E= github.com/prometheus/statsd_exporter v0.23.0/go.mod h1:1itCY9XMa2p5pjO5HseGjs5cnaIA5qxLCYmn3OUna58= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rickb777/date v1.20.1 h1:7MzSOc42Hbr5UXiQOihAAXoYDoeyzr0Hwvt+hCjBDV4= github.com/rickb777/date v1.20.1/go.mod h1:9MqjVxT6a/AQTA4nxj9E6G3ksQiMESTn9/9kfE+CvwU= github.com/rickb777/plural v1.4.1 h1:5MMLcbIaapLFmvDGRT5iPk8877hpTPt8Y9cdSKRw9sU= @@ -1442,123 +846,75 @@ github.com/rickb777/plural v1.4.1/go.mod h1:kdmXUpmKBJTS0FtG/TFumd//VBWsNTD7zOw7 github.com/rivo/tview v0.0.0-20220307222120-9994674d60a8 h1:xe+mmCnDN82KhC010l3NfYlA8ZbOuzbXAzSYBa6wbMc= github.com/rivo/tview v0.0.0-20220307222120-9994674d60a8/go.mod h1:WIfMkQNY+oq/mWwtsjOYHIZBuwthioY2srOmljJkTnk= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= -github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= -github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= -github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= -github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= -github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sigstore/sigstore v1.5.0 h1:NqstQ6SwwhQsp6Ll0wgk/d9g5MlfmEppo14aquUjJ/8= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sigstore/sigstore v1.6.3 h1:lt/w/fZNnrT4PjjqTYsUXn57fvE1YYfIB3SElQZ1oR4= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= -github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skeema/knownhosts v1.1.1 h1:MTk78x9FPgDFVFkDLTrsnnfCJl7g1C/nnKvePgrIngE= +github.com/skeema/knownhosts v1.1.1/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= -github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stoewer/go-strcase v1.2.1 h1:/1JWd+AcWPzkcGLEmjUCka99YqGOtTnp1H/wcP+uap4= github.com/stoewer/go-strcase v1.2.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1568,34 +924,23 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/sylabs/release-tools v0.1.0/go.mod h1:pqP/z/11/rYMQ0OM/Nn7TxGijw7KfZwW9UolD/J1TUo= -github.com/sylabs/sif/v2 v2.3.1/go.mod h1:NnvveH62GiibimL00MrI6YYcZfb7DnZMcRo/40giY+0= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tektoncd/cli v0.29.1 h1:61+QyWxJSSwdH46wH7/ng14vvm/IdUJ4antlRHXOOEI= -github.com/tektoncd/cli v0.29.1/go.mod h1:SIN97VCseMwxcU/8NVS9yUsBBEZmfhHsOUEDtNSdfzE= -github.com/tektoncd/pipeline v0.42.0 h1:K85XkpWw0hJvuGQpbfVfsG8wL/ptYLNP5UuvYDhtH5M= -github.com/tektoncd/pipeline v0.42.0/go.mod h1:AsKKcVxseE/VxA28hgXJ/JO/L3yl60jlegDgDUCSNXE= -github.com/tektoncd/triggers v0.22.0 h1:xe9l+ebuUMuP4wzBLjvmUGUPZCz0qND4osFFLSVCAW0= -github.com/tektoncd/triggers v0.22.0/go.mod h1:lYxFl8cKbr+DaHMQa47U4Y7uyhTAMsRAT0uOOY8xiGE= -github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= -github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= -github.com/theupdateframework/go-tuf v0.5.2-0.20220930112810-3890c1e7ace4 h1:1i/Afw3rmaR1gF3sfVkG2X6ldkikQwA9zY380LrR5YI= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tektoncd/cli v0.31.1 h1:rhVfvwWRilHMXO8Y6bLDx9Ow3nRRWCLeEPuk52PJ/uQ= +github.com/tektoncd/cli v0.31.1/go.mod h1:MB0HrmwcGnHjPv9d/oviOWAqNmvuhdNP84UJUZfqy7A= +github.com/tektoncd/pipeline v0.47.0 h1:zZxmp6im8/p9RaH32LgeCP6dwH/4hcsfvEQUrwGsUPA= +github.com/tektoncd/pipeline v0.47.0/go.mod h1:7H1DeNuEJFGoExGwQTlRul2IziCPxkjXRdDdirWmoQs= +github.com/tektoncd/triggers v0.23.1-0.20230420080448-bf603123cc0f h1:VwUu2eWgu+c34hoocxCL2IE+1zjNeGigyNHdd9ODfL8= +github.com/tektoncd/triggers v0.23.1-0.20230420080448-bf603123cc0f/go.mod h1:gMyEJZbLOs8+PnbjeaOa2Y2oex4IMPU9TD86WbytWIo= +github.com/theupdateframework/go-tuf v0.5.2 h1:habfDzTmpbzBLIFGWa2ZpVhYvFBoK0C1onC3a4zuPRA= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= @@ -1606,61 +951,22 @@ github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPf github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= -github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= -github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= -github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf/go.mod h1:lJAxK//iyZ3yGbQswdrPTxugZIDM7sd4bEsD0x3XMHk= -github.com/tonistiigi/go-actions-cache v0.0.0-20211002214948-4d48f2ff622a/go.mod h1:YiIBjH5gP7mao3t0dBrNNBGuKYdeJmcAJjYLXr43k6A= -github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= -github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= -github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vbauerster/mpb/v7 v7.3.2/go.mod h1:wfxIZcOJq/bG1/lAtfzMXcOiSvbqVi/5GX5WCSi+IsA= -github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= +github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/whilp/git-urls v1.0.0 h1:95f6UMWN5FKW71ECsXRUd3FVYiXdrE7aX4NZKcPmIjU= github.com/whilp/git-urls v1.0.0/go.mod h1:J16SAmobsqc3Qcy98brfl5f5+e0clUvg1krgwk/qCfE= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= +github.com/xanzy/go-gitlab v0.83.0 h1:37p0MpTPNbsTMKX/JnmJtY8Ch1sFiJzVF342+RvZEGw= +github.com/xanzy/go-gitlab v0.83.0/go.mod h1:5ryv+MnpZStBH8I/77HuQBsMbBGANtVpLWC15qOjWAw= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= @@ -1672,23 +978,13 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= -go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1698,88 +994,49 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.21.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.21.0/go.mod h1:Vm5u/mtkj1OMhtao0v+BGo2LUoLCgHYXvRmj0jWITlE= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.21.0/go.mod h1:a9cocRplhIBkUAJmak+BPDx+LVL7cTmqUPB0uBcTA4k= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.21.0/go.mod h1:JQAtechjxLEL81EjmbRwxBq/XEzGaHcsPuDHAx54hg4= -go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= -go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC1/go.mod h1:FXJnjGCoTQL6nQ8OpFJ0JI1DrdOvMoVx49ic0Hg4+D4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0-RC1/go.mod h1:FliQjImlo7emZVjixV8nbDMAa4iAkcWTE9zzSEOiEPw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC1/go.mod h1:cDwRc2Jrh5Gku1peGK8p9rRuX/Uq2OtVmLicjlw2WYU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.0.0-RC1/go.mod h1:OYKzEoxgXFvehW7X12WYT4/a2BlASJK9l7RtG4A91fg= -go.opentelemetry.io/otel/internal/metric v0.21.0/go.mod h1:iOfAaY2YycsXfYD4kaRSbLx2LKmfpKObWBEv9QK5zFo= -go.opentelemetry.io/otel/metric v0.21.0/go.mod h1:JWCt1bjivC4iCrz/aCrM1GSw+ZcvY44KCbaeeRhzHnc= -go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4= -go.opentelemetry.io/otel/sdk v1.0.0-RC1/go.mod h1:kj6yPn7Pgt5ByRuwesbaWcRLA+V7BSDg3Hf8xRvsvf8= -go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.starlark.net v0.0.0-20220817180228-f738f5508c12 h1:xOBJXWGEDwU5xSDxH6macxO11Us0AH2fTa9rmsbbF7g= go.starlark.net v0.0.0-20220817180228-f738f5508c12/go.mod h1:VZcBMdr3cT3PnBoWunTabuSEXwVAH+ZJ5zxfs3AdASk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= -golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= @@ -1788,11 +1045,11 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1815,48 +1072,38 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200219183655-46282727080f/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1869,7 +1116,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1878,34 +1124,23 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1919,12 +1154,10 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs= +golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1938,65 +1171,42 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2004,46 +1214,29 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2052,19 +1245,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211001092434-39dca1131b70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2073,28 +1258,24 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2105,86 +1286,63 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2195,7 +1353,6 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2211,28 +1368,17 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= -google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= -google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2260,16 +1406,10 @@ google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNe google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/api v0.108.0 h1:WVBc/faN0DkKtR43Q/7+tPny9ZoLZdIiAyG5Q9vFClg= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.125.0 h1:7xGvEY4fyWbhWMHf3R2/4w7L4fXyfpRGE9g6lp8+DCk= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -2277,19 +1417,11 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -2298,7 +1430,6 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -2320,7 +1451,6 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2345,29 +1475,19 @@ google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2 h1:O97sLx/Xmb/KIZHB/2/BzofxBs5QmmR0LcihPtllmbc= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529 h1:DEH99RbiLZhMxrpEJCZ0A+wdTe0EOgou/poSLx9vWf4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -2389,10 +1509,8 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.52.1 h1:2NpOPk5g5Xtb0qebIEs7hNIa++PdtZLo2AQUpc1YnSU= -google.golang.org/grpc v1.52.1/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2408,12 +1526,11 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2422,23 +1539,17 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -2447,7 +1558,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -2456,17 +1566,12 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2474,92 +1579,61 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs= k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ= -k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI= -k8s.io/apiextensions-apiserver v0.26.1/go.mod h1:AptjOSXDGuE0JICx/Em15PaoO7buLwTs0dGleIHixSM= +k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= +k8s.io/apiextensions-apiserver v0.26.5 h1:VJ946z9RjyCPn3qiz4Kus/UYjCRrdn1xUvEsJFvN5Yo= +k8s.io/apiextensions-apiserver v0.26.5/go.mod h1:Olsde7ZNWnyz9rsL13iXYXmL1h7kWujtKeC3yWVCDPo= k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc= k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= -k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/cli-runtime v0.25.4 h1:GTSBN7aKBrc2LqpdO30CmHQqJtRmotxV7XsMSP+QZIk= -k8s.io/cli-runtime v0.25.4/go.mod h1:JGOw1CR8v4Mcz6cEKA7bFQe0bPrNn1l5sGAX1/Ke4Eg= +k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= +k8s.io/cli-runtime v0.25.9 h1:XNJ82pj8ior9TqO22OGQ0Di6e1p/wXm7IJyqM8iq8I4= +k8s.io/cli-runtime v0.25.9/go.mod h1:Xl7L+X3Uxb8J9rfzICvIi9EP4CYYXXtMdaWSsdcFRHo= k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8= k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw= -k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= -k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= +k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M= -k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= -k8s.io/kube-openapi v0.0.0-20230123231816-1cb3ae25d79a h1:s6zvHjyDQX1NtVT88pvw2tddqhqY0Bz0Gbnn+yctsFU= -k8s.io/kube-openapi v0.0.0-20230123231816-1cb3ae25d79a/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0= -k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE= -k8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -knative.dev/client-pkg v0.0.0-20230501131754-e5c405e16e90 h1:1QBZWaLkXsKD2RR0WlEHNt26v7NJt0qLXBJk0/EPlKg= -knative.dev/client-pkg v0.0.0-20230501131754-e5c405e16e90/go.mod h1:oYnznlTBCj/bVEHo5vUSM/VS3oDFNJKDmH5+k1aC9/8= -knative.dev/eventing v0.37.1-0.20230518094712-4b9fdefe36a3 h1:jjy1VqCqM80el9xPaNbMfvR/spKPfvJV80RCEuBh8Pw= -knative.dev/eventing v0.37.1-0.20230518094712-4b9fdefe36a3/go.mod h1:i7vY9K8kDhDwFqMoNXnc2DBr9YGoHiLMx04zkrYoEAA= -knative.dev/hack v0.0.0-20230501013555-7d81248b4638 h1:9IuXHdwp5jNmIg+0LVTQr8o4u0FYD99uCfynM9tS0XY= -knative.dev/hack v0.0.0-20230501013555-7d81248b4638/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q= -knative.dev/networking v0.0.0-20230511122402-33636d99d870 h1:OmpaXjgdpF6GNW5S6OV6JN19gbiDCzfkEQQb9TQp9gU= -knative.dev/networking v0.0.0-20230511122402-33636d99d870/go.mod h1:OG9AEepHd3dofzrkzb0IelqN5uzu10RjbSdhl5UruSE= -knative.dev/pkg v0.0.0-20230518105712-dfb4bf04635d h1:jGvqcYwyh7O1V2PZfd0poheaOOvy6x0z+KQxHXOgskc= -knative.dev/pkg v0.0.0-20230518105712-dfb4bf04635d/go.mod h1:WLTHHHc/dhrDmhx03nm5F8AeqpNx3RQGggMI2N0/oks= -knative.dev/serving v0.37.1-0.20230515180909-99800edf6260 h1:A6gakCIlzqFLNEZWhVTpsE89eZ5BkNANQm6O8rYm9J0= -knative.dev/serving v0.37.1-0.20230515180909-99800edf6260/go.mod h1:5yvsSpmUK3hnIDHE8mA2S8ri0K6mkpecinBuqXBHPPY= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= -mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= -pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +knative.dev/client-pkg v0.0.0-20230726202841-bd83cf476909 h1:tn75M7CVM0eSg4nH0yxA0tqA/g9O7pT1518mZS3VCFI= +knative.dev/client-pkg v0.0.0-20230726202841-bd83cf476909/go.mod h1:TuCXbcV3spDkZ3nGefq83OuLaICpfVpRJpegmYH9FfE= +knative.dev/eventing v0.38.0 h1:n6/k9IJ1kOvpZx4CMLqa1FG7g2iBiyKXwBu1Fy/81q4= +knative.dev/eventing v0.38.0/go.mod h1:JUqEC0zoyfYqhRHFz8VUxjkxH9G1cQ/Y+UvhXTxUXgI= +knative.dev/hack v0.0.0-20230712131415-ddae80293c43 h1:3SE06uNfSFGm/5XS+0trbyCUpgsOaBeyhPQU8FPNFz8= +knative.dev/hack v0.0.0-20230712131415-ddae80293c43/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q= +knative.dev/networking v0.0.0-20230718160410-75dcd54d9510 h1:eNbWjEkbtGjCqK5TB4S0CjSSDd4PvyXm+w7bM9/zce4= +knative.dev/networking v0.0.0-20230718160410-75dcd54d9510/go.mod h1:Vngl91M++hqgoGNIjCii7MXnsEeN3kRbGC1aodhFqbk= +knative.dev/pkg v0.0.0-20230718152110-aef227e72ead h1:2dDzorpKuVZW3Qp7TbirMMq16FbId8f6bacQFX8jXLw= +knative.dev/pkg v0.0.0-20230718152110-aef227e72ead/go.mod h1:WmrwRV/P+hGHoMraAEfwg6ec+fBTf+Obu41v354Iabc= +knative.dev/serving v0.38.0 h1:h2PLGbhXmE1P2jB5ozjnXT6CagadMykaJW4Q/dhv0os= +knative.dev/serving v0.38.0/go.mod h1:3/KPMVdVOZSHdrRhvelLuxuO+Ftln2ZTKq8R3gUu6Gw= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/controller-runtime v0.7.2 h1:gD2JZp0bBLLuvSRYVNvox+bRCz1UUUxKDjPUCb56Ukk= +sigs.k8s.io/controller-runtime v0.7.2/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= @@ -2567,16 +1641,11 @@ sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= -sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/hack/allocate.sh b/hack/allocate.sh index 4909cf89a0..5eabb0e640 100755 --- a/hack/allocate.sh +++ b/hack/allocate.sh @@ -24,12 +24,17 @@ export TERM="${TERM:-dumb}" main() { - local kubernetes_version=v1.24.6 - local knative_serving_version=v1.8.0 - local knative_eventing_version=v1.8.0 - local kourier_version=v1.8.0 + local knative_serving_version=v1.10.1 + local knative_eventing_version=v1.10.1 + local contour_version=v1.10.0 + # Kubernetes Version node image per Kind releases (full hash is suggested): + # https://github.com/kubernetes-sigs/kind/releases + local kind_node_version=v1.27.1@sha256:b7d12ed662b873bd8510879c1846e87c7e676a79fefc93e17b2a52989d3ff42b + + # shellcheck disable=SC2155 local em=$(tput bold)$(tput setaf 2) + # shellcheck disable=SC2155 local me=$(tput sgr0) echo "${em}Allocating...${me}" @@ -54,18 +59,23 @@ kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - image: kindest/node:${kubernetes_version} + image: kindest/node:${kind_node_version} extraPortMappings: - - containerPort: 30080 + - containerPort: 80 hostPort: 80 listenAddress: "127.0.0.1" - - containerPort: 30443 + - containerPort: 433 hostPort: 443 listenAddress: "127.0.0.1" + - containerPort: 30022 + hostPort: 30022 + listenAddress: "127.0.0.1" containerdConfigPatches: - |- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:50000"] endpoint = ["http://func-registry:5000"] + [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.default.svc.cluster.local:5000"] + endpoint = ["http://func-registry:5000"] EOF sleep 10 kubectl wait pod --for=condition=Ready -l '!job-name' -n kube-system --timeout=5m @@ -110,45 +120,52 @@ dns() { } networking() { - echo "${em}④ Kourier Networking${me}" + echo "${em}④ Contour Ingress${me}" - # Install Eourier - kubectl apply --filename https://github.com/knative/net-kourier/releases/download/knative-$kourier_version/kourier.yaml - sleep 5 - kubectl wait pod --for=condition=Ready -l '!job-name' -n kourier-system --timeout=5m - kubectl wait pod --for=condition=Ready -l '!job-name' -n knative-serving --timeout=5m + # Install load balancer + kubectl apply -f "https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml" + kubectl wait --namespace metallb-system \ + --for=condition=ready pod \ + --selector=app=metallb \ + --timeout=90s - # Configure Knative to use Kourier - kubectl patch configmap/config-network \ - --namespace knative-serving \ - --type merge \ - --patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}' + local kind_addr + kind_addr="$(docker container inspect func-control-plane | jq '.[0].NetworkSettings.Networks.kind.IPAddress' -r)" - # Create NodePort ingress for kourier kubectl apply -f - < 'dirty_decay_ms:1000,muzzy_decay_ms:1000' + } + gitaly['configuration'] = { + ruby_max_rss: 200_000_000, + concurrency: [ + { + rpc: "/gitaly.SmartHTTPService/PostReceivePack", + max_per_repo: 1 + }, { + rpc: "/gitaly.SSHService/SSHUploadPack", + max_per_repo: 1 + } + ] + } + gitaly['env'] = { + 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000', + 'GITALY_COMMAND_SPAWN_MAX_PARALLEL' => '1' + } + ports: + - containerPort: 80 + name: http + - containerPort: 22 + name: ssh + resources: + requests: + memory: "1024Mi" + limits: + memory: "2048Mi" + volumes: + - name: gitlab + persistentVolumeClaim: + claimName: gitlab +--- +apiVersion: v1 +kind: Service +metadata: + name: gitlab-internal + namespace: gitlab +spec: + selector: + app.kubernetes.io/name: gitlab + ports: + - name: http + protocol: TCP + port: 80 + targetPort: http + - name: ssh + protocol: TCP + port: 30022 + targetPort: ssh + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: gitlab-external-ssh + namespace: gitlab +spec: + selector: + app.kubernetes.io/name: gitlab + ports: + - name: ssh + protocol: TCP + port: 30022 + targetPort: ssh + nodePort: 30022 + type: NodePort +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: gitlab + namespace: gitlab +spec: + ingressClassName: contour-external + rules: + - host: ${gitlab_host} + http: + paths: + - backend: + service: + name: gitlab-internal + port: + number: 80 + pathType: Prefix + path: / + +EOF + + sleep 1 + kubectl wait pod --for=condition=Ready -l '!job-name' -n gitlab --timeout=5m + + echo '::group::Waiting for Gitlab' + if ! curl --retry 120 -f --retry-all-errors --retry-delay 5 "${gitlab_host}"; then + kubectl logs pod/gitlab -n gitlab + echo '::endgroup::' + return 1 + fi + echo + echo '::endgroup::' + echo "the GitLab server is available at: http://${gitlab_host}" +} + +if [ "$0" = "${BASH_SOURCE[0]}" ]; then + set -o errexit + set -o nounset + set -o pipefail + + function main() { + install_gitlab + } + main "$@" +fi diff --git a/hack/install-pac.sh b/hack/install-pac.sh new file mode 100755 index 0000000000..2858fe64d1 --- /dev/null +++ b/hack/install-pac.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +function install_pac() { + local -r pac_ctr_host="${PAC_CONTROLLER_HOSTNAME:-pac-ctr.127.0.0.1.sslip.io}" + local -r pac_version="v0.17.1" + + # Install Pipelines as Code + kubectl apply -f "https://raw.githubusercontent.com/openshift-pipelines/pipelines-as-code/release-${pac_version}/release.k8s.yaml" + sleep 5 + kubectl wait pod --for=condition=Ready -l '!job-name' -n pipelines-as-code --timeout=5m + + # Install ingress for the PaC controller. This is used by VCS Webhooks. + kubectl apply -f - << EOF +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: pipelines-as-code + namespace: pipelines-as-code +spec: + ingressClassName: contour-external + rules: + - host: ${pac_ctr_host} + http: + paths: + - backend: + service: + name: pipelines-as-code-controller + port: + number: 8080 + pathType: Prefix + path: / +EOF + echo "the Pipeline as Code controller is available at: http://${pac_ctr_host}" +} + +if [ "$0" = "${BASH_SOURCE[0]}" ]; then + set -o errexit + set -o nounset + set -o pipefail + + function main() { + install_pac + } + main "$@" +fi diff --git a/hack/patch-hosts.sh b/hack/patch-hosts.sh new file mode 100755 index 0000000000..dfd57c5d98 --- /dev/null +++ b/hack/patch-hosts.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# This script creates a DNS A records for '127.0.0.1.sslip.io' and '*.127.0.0.1.sslip.io' pointing to the cluster node. + +function patch_hosts() { + local cluster_node_addr + + cluster_node_addr="$(docker container inspect func-control-plane | jq ".[0].NetworkSettings.Networks.kind.IPAddress" -r)" + + kubectl patch cm/coredns -n kube-system --patch-file /dev/stdin < { + const resp = await axios.get("https://api.github.com/repos/spring-projects/spring-boot/releases/latest") + return (resp.data.draft === false) ? resp.data.name.replace(/[A-Za-z]/g, "") : null; +} + +const prExists = async (pred) => { + + let page = 1 + const perPage = 10; + + while (true) { + const resp = await octokit.rest.pulls.list({ + owner: owner, + repo: repo, + state: 'open', + per_page: perPage, + page: page + }) + + for (const e of resp.data) { + if (pred(e)) { + return true + } + } + if (resp.data.length < perPage) { + return false + } + page++ + } +} + +const parseXML = (text) => new Promise((resolve, reject) => { + xml2js.parseString(text, {}, (err, res) => { + if (err) { + reject(err) + } + resolve(res) + }) +}) + +const platformFromPom = async (pomPath) => { + const pomData = await readFile(pomPath, {encoding: 'utf8'}); + const pom = await parseXML(pomData) + return pom.project.properties[0]['springboot.platform.version'][0] +} + +const prepareBranch = async (branchName, prTitle) => { + const script = `git config user.email "automation@knative.team" && \\ + git config user.name "Knative Automation" && \\ + git checkout -b "${branchName}" && \\ + make generate/zz_filesystem_generated.go && \\ + git add "${cePomPath}" "${httpPomPath}" generate/zz_filesystem_generated.go && \\ + git commit -m "${prTitle}" && \\ + git push --set-upstream origin "${branchName}" +` + const subproc = spawn("sh", ["-c", script], {stdio: ['inherit', 'inherit', 'inherit']}) + + return new Promise((resolve, reject) => { + subproc.on('exit', code => { + if (code === 0) { + resolve() + return + } + reject(new Error("cannot prepare branch: non-zero exit code")) + }) + }) +} + +const updatePlatformInPom = async (pomPath, newPlatform) => { + const pomData = await readFile(pomPath, {encoding: 'utf8'}); + const newPomData = pomData.replace(new RegExp('[\\w.]+', 'i'), + `${newPlatform}`) + await writeFile(pomPath, newPomData) +} + +const smokeTest = () => { + const subproc = spawn("make", ["test-springboot"], {stdio: ['inherit', 'inherit', 'inherit']}) + return new Promise((resolve, reject) => { + subproc.on('exit', code => { + if (code === 0) { + resolve() + return + } + reject(new Error("smoke test failed: non-zero exit code")) + }) + }) +} + +const main = async () => { + const latestPlatform = await getLatestPlatform() + + if(latestPlatform === null) { + console.log("Spring Boot platform latest version is not ready to use!") + return + } + + const prTitle = `chore: update Springboot platform version to ${latestPlatform}` + const branchName = `update-springboot-platform-${latestPlatform}` + const cePlatform = await platformFromPom(cePomPath) + const httpPlatform = await platformFromPom(httpPomPath) + + if (cePlatform === latestPlatform && httpPlatform === latestPlatform) { + console.log("Spring Boot platform is up-to-date!") + return + } + + if (await prExists(({title}) => title === prTitle)) { + console.log("The PR already exists!") + return + } + + await updatePlatformInPom(cePomPath, latestPlatform) + await updatePlatformInPom(httpPomPath, latestPlatform) + await smokeTest() + await prepareBranch(branchName, prTitle) + await octokit.rest.pulls.create({ + owner: owner, + repo: repo, + title: prTitle, + body: prTitle, + base: 'main', + head: `${owner}:${branchName}`, + }) + console.log("The PR has been created!") + +} + +main().then(value => { + console.log("OK!") +}).catch(reason => { + console.log("ERROR: ", reason) + process.exit(1) +}) diff --git a/pkg/builders/builders.go b/pkg/builders/builders.go index 3575a8d3be..81e2c13cbd 100644 --- a/pkg/builders/builders.go +++ b/pkg/builders/builders.go @@ -13,6 +13,7 @@ import ( ) const ( + Host = "host" Pack = "pack" S2I = "s2i" Default = Pack @@ -22,7 +23,7 @@ const ( type Known []string func All() Known { - return Known([]string{Pack, S2I}) + return Known([]string{Host, Pack, S2I}) } func (k Known) String() string { @@ -56,6 +57,15 @@ func (e ErrUnknownBuilder) Error() string { return fmt.Sprintf("\"%v\" is not a known builder. Available builders are %s", e.Name, e.Known) } +// ErrBuilderNotSupported +type ErrBuilderNotSupported struct { + Builder string +} + +func (e ErrBuilderNotSupported) Error() string { + return fmt.Sprintf("builder %q is not supported", e.Builder) +} + // ErrRuntimeRequired type ErrRuntimeRequired struct { Builder string diff --git a/pkg/builders/buildpacks/builder.go b/pkg/builders/buildpacks/builder.go index 5d54f7fd75..0aa94a25b4 100644 --- a/pkg/builders/buildpacks/builder.go +++ b/pkg/builders/buildpacks/builder.go @@ -3,8 +3,11 @@ package buildpacks import ( "bytes" "context" + "errors" "fmt" "io" + "os" + "path/filepath" "runtime" "strings" "time" @@ -12,6 +15,7 @@ import ( "github.com/Masterminds/semver" pack "github.com/buildpacks/pack/pkg/client" "github.com/buildpacks/pack/pkg/logging" + "github.com/buildpacks/pack/pkg/project/types" "github.com/docker/docker/client" "github.com/heroku/color" @@ -23,16 +27,19 @@ import ( // DefaultName when no WithName option is provided to NewBuilder const DefaultName = builders.Pack +var DefaultBaseBuilder = "gcr.io/paketo-buildpacks/builder:base" +var DefaultRustBuilder = "gcr.io/paketo-buildpacks/builder:full-cf" + var ( DefaultBuilderImages = map[string]string{ - "node": "gcr.io/paketo-buildpacks/builder:base", - "nodejs": "gcr.io/paketo-buildpacks/builder:base", - "typescript": "gcr.io/paketo-buildpacks/builder:base", - "go": "gcr.io/paketo-buildpacks/builder:base", - "python": "gcr.io/paketo-buildpacks/builder:base", - "quarkus": "gcr.io/paketo-buildpacks/builder:base", - "rust": "gcr.io/paketo-buildpacks/builder:full-cf", - "springboot": "gcr.io/paketo-buildpacks/builder:base", + "node": DefaultBaseBuilder, + "nodejs": DefaultBaseBuilder, + "typescript": DefaultBaseBuilder, + "go": DefaultBaseBuilder, + "python": DefaultBaseBuilder, + "quarkus": DefaultBaseBuilder, + "rust": DefaultRustBuilder, + "springboot": DefaultBaseBuilder, } // Ensure that all entries in this list are terminated with a trailing "/" @@ -44,6 +51,10 @@ var ( "ghcr.io/vmware-tanzu/function-buildpacks-for-knative/", "gcr.io/buildpacks/", } + + defaultBuildpacks = map[string][]string{ + "go": {"paketo-buildpacks/go-dist", "ghcr.io/boson-project/go-function-buildpack:tip"}, + } ) // Builder will build Function using Pack. @@ -108,20 +119,51 @@ func WithTimestamp(v bool) Option { var DefaultLifecycleImage = "quay.io/boson/lifecycle@sha256:f53fea9ec9188b92cab0b8a298ff852d76a6c2aaf56f968a08637e13de0e0c59" // Build the Function at path. -func (b *Builder) Build(ctx context.Context, f fn.Function) (err error) { +func (b *Builder) Build(ctx context.Context, f fn.Function, platforms []fn.Platform) (err error) { + if len(platforms) != 0 { + return errors.New("the pack builder does not support specifying target platforms directly.") + } + // Builder image from the function if defined, default otherwise. image, err := BuilderImage(f, b.name) if err != nil { return } + buildpacks := f.Build.Buildpacks + if len(buildpacks) == 0 { + buildpacks = defaultBuildpacks[f.Runtime] + } + + // Reading .funcignore file + var excludes []string + filePath := filepath.Join(f.Root, ".funcignore") + file, err := os.Open(filePath) + if err != nil { + if !os.IsNotExist(err) { + return fmt.Errorf("\nfailed to open file: %s", err) + } + } else { + defer file.Close() + buf := new(bytes.Buffer) + _, err := io.Copy(buf, file) + if err != nil { + return fmt.Errorf("\nfailed to read file: %s", err) + } + excludes = strings.Split(buf.String(), "\n") + } // Pack build options opts := pack.BuildOptions{ AppPath: f.Root, Image: f.Image, LifecycleImage: DefaultLifecycleImage, Builder: image, - Buildpacks: f.Build.Buildpacks, + Buildpacks: buildpacks, + ProjectDescriptor: types.Descriptor{ + Build: types.Build{ + Exclude: excludes, + }, + }, ContainerConfig: struct { Network string Volumes []string diff --git a/pkg/builders/buildpacks/builder_test.go b/pkg/builders/buildpacks/builder_test.go index b7abe8c350..924fd109d7 100644 --- a/pkg/builders/buildpacks/builder_test.go +++ b/pkg/builders/buildpacks/builder_test.go @@ -2,6 +2,9 @@ package buildpacks import ( "context" + "os" + "path/filepath" + "reflect" "testing" pack "github.com/buildpacks/pack/pkg/client" @@ -9,9 +12,9 @@ import ( fn "knative.dev/func/pkg/functions" ) -// Test_BuilderImageUntrusted ensures that only known builder images +// TestBuild_BuilderImageUntrusted ensures that only known builder images // are to be considered trusted. -func Test_BuilderImageUntrusted(t *testing.T) { +func TestBuild_BuilderImageUntrusted(t *testing.T) { var untrusted = []string{ // Check prefixes that end in a slash "quay.io/bosonhack/", @@ -28,9 +31,9 @@ func Test_BuilderImageUntrusted(t *testing.T) { } } -// Test_BuilderImageTrusted ensures that only known builder images +// TestBuild_BuilderImageTrusted ensures that only known builder images // are to be considered trusted. -func Test_BuilderImageTrusted(t *testing.T) { +func TestBuild_BuilderImageTrusted(t *testing.T) { for _, builder := range trustedBuilderImagePrefixes { if !TrustBuilder(builder) { t.Fatalf("expected pack builder image %v to be trusted", builder) @@ -38,9 +41,9 @@ func Test_BuilderImageTrusted(t *testing.T) { } } -// Test_BuilderImageDefault ensures that a Function bing built which does not +// TestBuild_BuilderImageDefault ensures that a Function bing built which does not // define a Builder Image will get the internally-defined default. -func Test_BuilderImageDefault(t *testing.T) { +func TestBuild_BuilderImageDefault(t *testing.T) { var ( i = &mockImpl{} b = NewBuilder(WithImpl(i)) @@ -55,15 +58,39 @@ func Test_BuilderImageDefault(t *testing.T) { return nil } - if err := b.Build(context.Background(), f); err != nil { + if err := b.Build(context.Background(), f, nil); err != nil { t.Fatal(err) } } -// Test_BuilderImageConfigurable ensures that the builder will use the builder +// TestBuild_BuildpacksDefault ensures that, if there are default buildpacks +// defined in-code, but none defined on the function, the defaults will be +// used. +func TestBuild_BuildpacksDefault(t *testing.T) { + var ( + i = &mockImpl{} + b = NewBuilder(WithImpl(i)) + f = fn.Function{Runtime: "go"} + ) + + i.BuildFn = func(ctx context.Context, opts pack.BuildOptions) error { + expected := defaultBuildpacks["go"] + if !reflect.DeepEqual(expected, opts.Buildpacks) { + t.Fatalf("expected buildpacks '%v', got '%v'", expected, opts.Buildpacks) + } + return nil + } + + if err := b.Build(context.Background(), f, nil); err != nil { + t.Fatal(err) + } + +} + +// TestBuild_BuilderImageConfigurable ensures that the builder will use the builder // image defined on the given Function if provided. -func Test_BuilderImageConfigurable(t *testing.T) { +func TestBuild_BuilderImageConfigurable(t *testing.T) { var ( i = &mockImpl{} // mock underlying implementation b = NewBuilder( // Func Builder logic @@ -86,14 +113,53 @@ func Test_BuilderImageConfigurable(t *testing.T) { return nil } - if err := b.Build(context.Background(), f); err != nil { + if err := b.Build(context.Background(), f, nil); err != nil { + t.Fatal(err) + } +} + +// TestBuild_BuilderImageExclude ensures that ignored files are not added to the func +// image +func TestBuild_BuilderImageExclude(t *testing.T) { + var ( + i = &mockImpl{} // mock underlying implementation + b = NewBuilder( // Func Builder logic + WithName(builders.Pack), WithImpl(i)) + f = fn.Function{ + Runtime: "go", + } + ) + funcIgnoreContent := []byte(`#testing comments +hello.txt`) + expected := []string{"hello.txt"} + + tempdir := t.TempDir() + f.Root = tempdir + + //create a .funcignore file containing the details of the files to be ignored + err := os.WriteFile(filepath.Join(f.Root, ".funcignore"), funcIgnoreContent, 0644) + if err != nil { + t.Fatal(err) + } + + i.BuildFn = func(ctx context.Context, opts pack.BuildOptions) error { + if len(opts.ProjectDescriptor.Build.Exclude) != 2 { + t.Fatalf("expected 2 lines of exclusions , got %v", len(opts.ProjectDescriptor.Build.Exclude)) + } + if opts.ProjectDescriptor.Build.Exclude[1] != expected[0] { + t.Fatalf("expected excluded file to be '%v', got '%v'", expected[1], opts.ProjectDescriptor.Build.Exclude[1]) + } + return nil + } + + if err := b.Build(context.Background(), f, nil); err != nil { t.Fatal(err) } } -// Test_BuildEnvs ensures that build environment variables are interpolated and +// TestBuild_Envs ensures that build environment variables are interpolated and // provided in Build Options -func Test_BuildEnvs(t *testing.T) { +func TestBuild_Envs(t *testing.T) { t.Setenv("INTERPOLATE_ME", "interpolated") var ( envName = "NAME" @@ -118,12 +184,13 @@ func Test_BuildEnvs(t *testing.T) { t.Fatal("build envs not added to builder options") return nil } - if err := b.Build(context.Background(), f); err != nil { + if err := b.Build(context.Background(), f, nil); err != nil { t.Fatal(err) } } -func Test_BuildErrors(t *testing.T) { +// TestBuild_Errors confirms error scenarios. +func TestBuild_Errors(t *testing.T) { testCases := []struct { name, runtime, expectedErr string }{ diff --git a/pkg/builders/s2i/builder.go b/pkg/builders/s2i/builder.go index 5f983b6b66..edd70f691a 100644 --- a/pkg/builders/s2i/builder.go +++ b/pkg/builders/s2i/builder.go @@ -36,13 +36,17 @@ import ( // DefaultName when no WithName option is provided to NewBuilder const DefaultName = builders.S2I +var DefaultNodeBuilder = "registry.access.redhat.com/ubi8/nodejs-16" +var DefaultQuarkusBuilder = "registry.access.redhat.com/ubi8/openjdk-17" +var DefaultPythonBuilder = "registry.access.redhat.com/ubi8/python-39" + // DefaultBuilderImages for s2i builders indexed by Runtime Language var DefaultBuilderImages = map[string]string{ - "node": "registry.access.redhat.com/ubi8/nodejs-16", - "nodejs": "registry.access.redhat.com/ubi8/nodejs-16", - "typescript": "registry.access.redhat.com/ubi8/nodejs-16", - "quarkus": "registry.access.redhat.com/ubi8/openjdk-17", - "python": "registry.access.redhat.com/ubi8/python-39", + "node": DefaultNodeBuilder, + "nodejs": DefaultNodeBuilder, + "typescript": DefaultNodeBuilder, + "quarkus": DefaultQuarkusBuilder, + "python": DefaultPythonBuilder, } // DockerClient is subset of dockerClient.CommonAPIClient required by this package @@ -53,11 +57,10 @@ type DockerClient interface { // Builder of functions using the s2i subsystem. type Builder struct { - name string - verbose bool - impl build.Builder // S2I builder implementation (aka "Strategy") - cli DockerClient - platform string + name string + verbose bool + impl build.Builder // S2I builder implementation (aka "Strategy") + cli DockerClient } type Option func(*Builder) @@ -90,12 +93,6 @@ func WithDockerClient(cli DockerClient) Option { } } -func WithPlatform(platform string) Option { - return func(b *Builder) { - b.platform = platform - } -} - // NewBuilder creates a new instance of a Builder with static defaults. func NewBuilder(options ...Option) *Builder { b := &Builder{name: DefaultName} @@ -105,22 +102,38 @@ func NewBuilder(options ...Option) *Builder { return b } -func (b *Builder) Build(ctx context.Context, f fn.Function) (err error) { - // TODO this function currently doesn't support private s2i builder images since credentials are not set +// Build the function using the S2I builder. +// +// Platforms: +// The S2I builder supports at most a single platform to target, and the +// platform specified must be available in the provided builder image. +// If the provided builder image is not a multi-architecture image index +// container, specifying a target platform is redundant, so if provided it +// must match that of the single-architecture container or the request is +// invalid. +func (b *Builder) Build(ctx context.Context, f fn.Function, platforms []fn.Platform) (err error) { // Builder image from the function if defined, default otherwise. builderImage, err := BuilderImage(f, b.name) if err != nil { return } - - if b.platform != "" { - builderImage, err = docker.GetPlatformImage(builderImage, b.platform) - if err != nil { - return fmt.Errorf("cannot get platform specific image reference: %w", err) + // If a platform was requestd + if len(platforms) == 1 { + platform := strings.ToLower(platforms[0].OS + "/" + platforms[0].Architecture) + // Try to get the platform image from within the builder image + // Will also succeed if the builder image is a single-architecture image + // and the requested platform matches. + if builderImage, err = docker.GetPlatformImage(builderImage, platform); err != nil { + return fmt.Errorf("cannot get platform image reference for %q: %w", platform, err) } + } else if len(platforms) > 1 { + // Only a single requestd platform supported. + return errors.New("the S2I builder currently only supports specifying a single target platform") } + // TODO this function currently doesn't support private s2i builder images since credentials are not set + // Build Config cfg := &api.Config{} cfg.Quiet = !b.verbose @@ -138,6 +151,26 @@ func (b *Builder) Build(ctx context.Context, f fn.Function) (err error) { } defer os.RemoveAll(tmp) + funcignorePath := filepath.Join(f.Root, ".funcignore") + if _, err := os.Stat(funcignorePath); err == nil { + s2iignorePath := filepath.Join(f.Root, ".s2iignore") + + // If the .s2iignore file exists, remove it + if _, err := os.Stat(s2iignorePath); err == nil { + err := os.Remove(s2iignorePath) + if err != nil { + return fmt.Errorf("error removing existing s2iignore file: %w", err) + } + } + // Create the symbolic link + err = os.Symlink(funcignorePath, s2iignorePath) + if err != nil { + return fmt.Errorf("error creating symlink: %w", err) + } + // Removing the symbolic link at the end of the function + defer os.Remove(s2iignorePath) + } + cfg.AsDockerfile = filepath.Join(tmp, "Dockerfile") var client = b.cli diff --git a/pkg/builders/s2i/builder_test.go b/pkg/builders/s2i/builder_test.go index dac7dad290..061577d7b9 100644 --- a/pkg/builders/s2i/builder_test.go +++ b/pkg/builders/s2i/builder_test.go @@ -110,7 +110,7 @@ func Test_BuilderImageDefault(t *testing.T) { // Invoke Build, which runs function Builder logic before invoking the // mock impl above. - if err := b.Build(context.Background(), f); err != nil { + if err := b.Build(context.Background(), f, nil); err != nil { t.Fatal(err) } } @@ -145,7 +145,71 @@ func Test_BuilderImageConfigurable(t *testing.T) { // Invoke Build, which runs function Builder logic before invoking the // mock impl above. - if err := b.Build(context.Background(), f); err != nil { + if err := b.Build(context.Background(), f, nil); err != nil { + t.Fatal(err) + } +} + +// Test_BuildImageWithFuncIgnore ensures that ignored files are not added to the func +// image +func Test_BuildImageWithFuncIgnore(t *testing.T) { + + funcIgnoreContent := []byte(`#testing Comments +#testingComments.txt +hello.txt +`) + f := fn.Function{ + Runtime: "node", + } + tempdir := t.TempDir() + f.Root = tempdir + //create a .funcignore file containing the details of the files to be ignored + err := os.WriteFile(filepath.Join(f.Root, ".funcignore"), funcIgnoreContent, 0644) + if err != nil { + t.Fatal(err) + } + + // creating test files which should be ignored + err = os.WriteFile(filepath.Join(f.Root, "hello.txt"), []byte(""), 0644) + if err != nil { + t.Fatal(err) + } + + err = os.WriteFile(filepath.Join(f.Root, "#testingComments.txt"), []byte(""), 0644) + if err != nil { + t.Fatal(err) + } + + cli := mockDocker{ + build: func(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) { + tr := tar.NewReader(context) + for { + hdr, err := tr.Next() + if err != nil { + if errors.Is(err, io.EOF) { + break + } + return types.ImageBuildResponse{}, err + } + + // If we find the undesired file, return an error + if filepath.Base(hdr.Name) == "hello.txt" { + return types.ImageBuildResponse{}, fmt.Errorf("test failed, found ignonered file %s:", filepath.Base(hdr.Name)) + } + // If we find the undesired file, return an error + if filepath.Base(hdr.Name) == "#tesingComments.txt" { + return types.ImageBuildResponse{}, fmt.Errorf("test failed, found ignonered file %s:", filepath.Base(hdr.Name)) + } + + } + return types.ImageBuildResponse{ + Body: io.NopCloser(strings.NewReader(`{"stream": "OK!"}`)), + OSType: "linux", + }, nil + }, + } + b := s2i.NewBuilder(s2i.WithName(builders.S2I), s2i.WithDockerClient(cli)) + if err := b.Build(context.Background(), f, nil); err != nil { t.Fatal(err) } } @@ -162,7 +226,8 @@ func Test_BuilderVerbose(t *testing.T) { } return &api.Result{Messages: []string{"message"}}, nil }} - if err := s2i.NewBuilder(s2i.WithVerbose(verbose), s2i.WithImpl(i), s2i.WithDockerClient(c)).Build(context.Background(), fn.Function{Runtime: "node"}); err != nil { + if err := s2i.NewBuilder(s2i.WithVerbose(verbose), s2i.WithImpl(i), s2i.WithDockerClient(c)). + Build(context.Background(), fn.Function{Runtime: "node"}, nil); err != nil { t.Fatal(err) } } @@ -199,7 +264,7 @@ func Test_BuildEnvs(t *testing.T) { t.Fatal("build envs not added to builder impl config") return } - if err := b.Build(context.Background(), f); err != nil { + if err := b.Build(context.Background(), f, nil); err != nil { t.Fatal(err) } } @@ -268,7 +333,7 @@ func TestS2IScriptURL(t *testing.T) { } b := s2i.NewBuilder(s2i.WithName(builders.S2I), s2i.WithImpl(impl), s2i.WithDockerClient(cli)) - err = b.Build(context.Background(), f) + err = b.Build(context.Background(), f, nil) if err != nil { t.Error(err) } @@ -367,7 +432,7 @@ func TestBuildContextUpload(t *testing.T) { Runtime: "node", } b := s2i.NewBuilder(s2i.WithImpl(impl), s2i.WithDockerClient(cli)) - err := b.Build(context.Background(), f) + err := b.Build(context.Background(), f, nil) if err != nil { t.Error(err) } @@ -388,7 +453,7 @@ func TestBuildFail(t *testing.T) { }, } b := s2i.NewBuilder(s2i.WithImpl(impl), s2i.WithDockerClient(cli)) - err := b.Build(context.Background(), fn.Function{Runtime: "node"}) + err := b.Build(context.Background(), fn.Function{Runtime: "node"}, nil) if err == nil || !strings.Contains(err.Error(), "Error: this is expected") { t.Error("didn't get expected error") } diff --git a/pkg/config/config.go b/pkg/config/config.go index 780a9b857f..a140598ee7 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -13,7 +13,6 @@ import ( "knative.dev/func/pkg/builders" fn "knative.dev/func/pkg/functions" "knative.dev/func/pkg/k8s" - "knative.dev/func/pkg/openshift" ) const ( @@ -77,8 +76,8 @@ func (c Global) RegistryDefault() string { return c.Registry } switch { - case openshift.IsOpenShift(): - return openshift.GetDefaultRegistry() + case k8s.IsOpenShift(): + return k8s.GetDefaultOpenShiftRegistry() default: return "" } diff --git a/pkg/docker/docker_client.go b/pkg/docker/docker_client.go index 05b75ac921..d9bbbcccb1 100644 --- a/pkg/docker/docker_client.go +++ b/pkg/docker/docker_client.go @@ -97,7 +97,7 @@ func NewClient(defaultHost string) (dockerClient client.CommonAPIClient, dockerH } if !isSSH { - opts := []client.Opt{client.FromEnv} + opts := []client.Opt{client.FromEnv, client.WithAPIVersionNegotiation()} if isTCP { if httpClient := newHttpClient(); httpClient != nil { opts = append(opts, client.WithHTTPClient(httpClient)) @@ -131,7 +131,7 @@ func NewClient(defaultHost string) (dockerClient client.CommonAPIClient, dockerH dockerClient, err = client.NewClientWithOpts( client.WithAPIVersionNegotiation(), client.WithHTTPClient(httpClient), - client.WithHost("http://placeholder/")) + client.WithHost("tcp://placeholder/")) if closer, ok := contextDialer.(io.Closer); ok { dockerClient = clientWithAdditionalCleanup{ diff --git a/pkg/docker/platform_test.go b/pkg/docker/platform_test.go index 4cdff8c3b6..8a02b02229 100644 --- a/pkg/docker/platform_test.go +++ b/pkg/docker/platform_test.go @@ -16,8 +16,6 @@ import ( "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/remote" - gcrTypes "github.com/google/go-containerregistry/pkg/v1/types" - "knative.dev/func/pkg/docker" ) @@ -52,16 +50,9 @@ func TestPlatform(t *testing.T) { t.Fatal(err) } - zeroHash := v1.Hash{ - Algorithm: "sha256", - Hex: "0000000000000000000000000000000000000000000000000000000000000000", - } - var imgIdx = mutate.AppendManifests(empty.Index, mutate.IndexAddendum{ - Add: empty.Index, + Add: img, Descriptor: v1.Descriptor{ - MediaType: gcrTypes.DockerManifestList, - Digest: zeroHash, Platform: &v1.Platform{ Architecture: "ppc64le", OS: "linux", @@ -99,8 +90,13 @@ func TestPlatform(t *testing.T) { if err != nil { t.Errorf("unexpeced error: %v", err) } - if ref != testRegistry+"/default/builder@sha256:0000000000000000000000000000000000000000000000000000000000000000" { - t.Error("incorrect reference") + + imgDigest, err := img.Digest() + if err != nil { + t.Fatal(err) + } + if ref != testRegistry+"/default/builder@"+imgDigest.String() { + t.Errorf("incorrect reference: %q", ref) } } @@ -118,7 +114,7 @@ func startRegistry(t *testing.T) (addr string) { go func() { err = s.Serve(l) - if err != nil && !errors.Is(err, net.ErrClosed) { + if err != nil && !errors.Is(err, http.ErrServerClosed) { fmt.Fprintln(os.Stderr, "ERROR: ", err) } }() diff --git a/pkg/docker/pusher.go b/pkg/docker/pusher.go index 4d45d01ac8..1909328915 100644 --- a/pkg/docker/pusher.go +++ b/pkg/docker/pusher.go @@ -16,6 +16,7 @@ import ( fn "knative.dev/func/pkg/functions" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" "github.com/docker/docker/client" "github.com/docker/docker/pkg/jsonmessage" "github.com/google/go-containerregistry/pkg/authn" @@ -157,7 +158,7 @@ func (n *Pusher) daemonPush(ctx context.Context, f fn.Function, credentials Cred } defer cli.Close() - authConfig := types.AuthConfig{ + authConfig := registry.AuthConfig{ Username: credentials.Username, Password: credentials.Password, } diff --git a/pkg/docker/pusher_test.go b/pkg/docker/pusher_test.go index 7f6b512418..b785850af4 100644 --- a/pkg/docker/pusher_test.go +++ b/pkg/docker/pusher_test.go @@ -14,6 +14,7 @@ import ( "crypto/x509/pkix" "encoding/base64" "encoding/json" + "errors" "fmt" "io" "log" @@ -27,6 +28,7 @@ import ( "time" "github.com/docker/docker/api/types" + api "github.com/docker/docker/api/types/image" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/registry" @@ -316,6 +318,10 @@ func (m *mockPusherDockerClient) ImagePush(ctx context.Context, ref string, opti return m.imagePush(ctx, ref, options) } +func (m *mockPusherDockerClient) ImageHistory(context.Context, string) ([]api.HistoryResponseItem, error) { + return nil, errors.New("the ImageHistory() function is not implemented") +} + func (m *mockPusherDockerClient) Close() error { return m.close() } diff --git a/pkg/docker/runner.go b/pkg/docker/runner.go index 0628f2eea1..8791b315b5 100644 --- a/pkg/docker/runner.go +++ b/pkg/docker/runner.go @@ -50,7 +50,7 @@ func NewRunner(verbose bool, out, errOut io.Writer) *Runner { } // Run the function. -func (n *Runner) Run(ctx context.Context, f fn.Function) (job *fn.Job, err error) { +func (n *Runner) Run(ctx context.Context, f fn.Function, startTimeout time.Duration) (job *fn.Job, err error) { var ( port = choosePort(DefaultHost, DefaultPort, DefaultDialTimeout) @@ -60,7 +60,7 @@ func (n *Runner) Run(ctx context.Context, f fn.Function) (job *fn.Job, err error // Channels for gathering runtime errors from the container instance copyErrCh = make(chan error, 10) - contBodyCh <-chan container.ContainerWaitOKBody + contBodyCh <-chan container.WaitResponse contErrCh <-chan error // Combined runtime error channel for sending all errors to caller @@ -80,7 +80,7 @@ func (n *Runner) Run(ctx context.Context, f fn.Function) (job *fn.Job, err error return } - // Wait for errors or premature exits + // Wait for errors premature exits contBodyCh, contErrCh = c.ContainerWait(ctx, id, container.WaitConditionNextExit) go func() { for { @@ -101,7 +101,11 @@ func (n *Runner) Run(ctx context.Context, f fn.Function) (job *fn.Job, err error } }() - // Start + // TODO: use StartTimeout + // - Start a goroutine which queries for, or will be notified when, the + // container has successfully started. If the startTimeout is reached + // before then, send a timeout error to the runtimeErrCh + if err = c.ContainerStart(ctx, id, types.ContainerStartOptions{}); err != nil { return job, errors.Wrap(err, "runner unable to start container") } @@ -112,7 +116,11 @@ func (n *Runner) Run(ctx context.Context, f fn.Function) (job *fn.Job, err error timeout = DefaultStopTimeout ctx = context.Background() ) - if err = c.ContainerStop(ctx, id, &timeout); err != nil { + timeoutSecs := int(timeout.Seconds()) + ctrStopOpts := container.StopOptions{ + Timeout: &timeoutSecs, + } + if err = c.ContainerStop(ctx, id, ctrStopOpts); err != nil { return fmt.Errorf("error stopping container %v: %v\n", id, err) } if err = c.ContainerRemove(ctx, id, types.ContainerRemoveOptions{}); err != nil { @@ -128,7 +136,7 @@ func (n *Runner) Run(ctx context.Context, f fn.Function) (job *fn.Job, err error } // Job reporting port, runtime errors and provides a mechanism for stopping. - return fn.NewJob(f, port, runtimeErrCh, stop, n.verbose) + return fn.NewJob(f, DefaultHost, port, runtimeErrCh, stop, n.verbose) } // Dial the given (tcp) port on the given interface, returning an error if it is diff --git a/pkg/docker/runner_int_test.go b/pkg/docker/runner_int_test.go index f4b9c2ba5e..e2ea69aed4 100644 --- a/pkg/docker/runner_int_test.go +++ b/pkg/docker/runner_int_test.go @@ -47,7 +47,7 @@ func TestRun(t *testing.T) { // Run the function using a docker runner var out, errOut bytes.Buffer runner := docker.NewRunner(true, &out, &errOut) - j, err := runner.Run(ctx, f) + j, err := runner.Run(ctx, f, fn.DefaultStartTimeout) if err != nil { t.Fatal(err) } diff --git a/pkg/docker/runner_test.go b/pkg/docker/runner_test.go index 9552d6b846..cb83e36899 100644 --- a/pkg/docker/runner_test.go +++ b/pkg/docker/runner_test.go @@ -36,7 +36,7 @@ func TestDockerRun(t *testing.T) { // NOTE: test requires that the image be built already. runner := docker.NewRunner(true, os.Stdout, os.Stdout) - if _, err = runner.Run(context.Background(), f); err != nil { + if _, err = runner.Run(context.Background(), f, fn.DefaultStartTimeout); err != nil { t.Fatal(err) } /* TODO @@ -50,7 +50,7 @@ func TestDockerRunImagelessError(t *testing.T) { runner := docker.NewRunner(true, os.Stdout, os.Stderr) f := fn.NewFunctionWith(fn.Function{}) - _, err := runner.Run(context.Background(), f) + _, err := runner.Run(context.Background(), f, fn.DefaultStartTimeout) // TODO: switch to typed error: expectedErrorMessage := "Function has no associated image. Has it been built?" if err == nil || err.Error() != expectedErrorMessage { diff --git a/pkg/docker/zz_close_guarding_client_generated.go b/pkg/docker/zz_close_guarding_client_generated.go index d17214f3d8..fcfd5d6c80 100644 --- a/pkg/docker/zz_close_guarding_client_generated.go +++ b/pkg/docker/zz_close_guarding_client_generated.go @@ -5,7 +5,6 @@ import ( "io" "net" "net/http" - "time" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" @@ -109,7 +108,7 @@ func (c *closeGuardingClient) ContainerCommit(arg0 context.Context, arg1 string, return c.pimpl.ContainerCommit(arg0, arg1, arg2) } -func (c *closeGuardingClient) ContainerCreate(arg0 context.Context, arg1 *container.Config, arg2 *container.HostConfig, arg3 *network.NetworkingConfig, arg4 *v1.Platform, arg5 string) (container.ContainerCreateCreatedBody, error) { +func (c *closeGuardingClient) ContainerCreate(arg0 context.Context, arg1 *container.Config, arg2 *container.HostConfig, arg3 *network.NetworkingConfig, arg4 *v1.Platform, arg5 string) (container.CreateResponse, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -118,7 +117,7 @@ func (c *closeGuardingClient) ContainerCreate(arg0 context.Context, arg1 *contai return c.pimpl.ContainerCreate(arg0, arg1, arg2, arg3, arg4, arg5) } -func (c *closeGuardingClient) ContainerDiff(arg0 context.Context, arg1 string) ([]container.ContainerChangeResponseItem, error) { +func (c *closeGuardingClient) ContainerDiff(arg0 context.Context, arg1 string) ([]container.FilesystemChange, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -262,7 +261,7 @@ func (c *closeGuardingClient) ContainerResize(arg0 context.Context, arg1 string, return c.pimpl.ContainerResize(arg0, arg1, arg2) } -func (c *closeGuardingClient) ContainerRestart(arg0 context.Context, arg1 string, arg2 *time.Duration) error { +func (c *closeGuardingClient) ContainerRestart(arg0 context.Context, arg1 string, arg2 container.StopOptions) error { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -307,7 +306,7 @@ func (c *closeGuardingClient) ContainerStatsOneShot(arg0 context.Context, arg1 s return c.pimpl.ContainerStatsOneShot(arg0, arg1) } -func (c *closeGuardingClient) ContainerStop(arg0 context.Context, arg1 string, arg2 *time.Duration) error { +func (c *closeGuardingClient) ContainerStop(arg0 context.Context, arg1 string, arg2 container.StopOptions) error { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -343,7 +342,7 @@ func (c *closeGuardingClient) ContainerUpdate(arg0 context.Context, arg1 string, return c.pimpl.ContainerUpdate(arg0, arg1, arg2) } -func (c *closeGuardingClient) ContainerWait(arg0 context.Context, arg1 string, arg2 container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) { +func (c *closeGuardingClient) ContainerWait(arg0 context.Context, arg1 string, arg2 container.WaitCondition) (<-chan container.WaitResponse, <-chan error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -406,13 +405,13 @@ func (c *closeGuardingClient) Dialer() func(context.Context) (net.Conn, error) { return c.pimpl.Dialer() } -func (c *closeGuardingClient) DiskUsage(arg0 context.Context) (types.DiskUsage, error) { +func (c *closeGuardingClient) DiskUsage(arg0 context.Context, arg1 types.DiskUsageOptions) (types.DiskUsage, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { panic("use of closed client") } - return c.pimpl.DiskUsage(arg0) + return c.pimpl.DiskUsage(arg0, arg1) } func (c *closeGuardingClient) DistributionInspect(arg0 context.Context, arg1 string, arg2 string) (registry.DistributionInspect, error) { @@ -802,7 +801,7 @@ func (c *closeGuardingClient) PluginUpgrade(arg0 context.Context, arg1 string, a return c.pimpl.PluginUpgrade(arg0, arg1, arg2) } -func (c *closeGuardingClient) RegistryLogin(arg0 context.Context, arg1 types.AuthConfig) (registry.AuthenticateOKBody, error) { +func (c *closeGuardingClient) RegistryLogin(arg0 context.Context, arg1 registry.AuthConfig) (registry.AuthenticateOKBody, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -1009,7 +1008,7 @@ func (c *closeGuardingClient) TaskLogs(arg0 context.Context, arg1 string, arg2 t return c.pimpl.TaskLogs(arg0, arg1, arg2) } -func (c *closeGuardingClient) VolumeCreate(arg0 context.Context, arg1 volume.VolumeCreateBody) (types.Volume, error) { +func (c *closeGuardingClient) VolumeCreate(arg0 context.Context, arg1 volume.CreateOptions) (volume.Volume, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -1018,7 +1017,7 @@ func (c *closeGuardingClient) VolumeCreate(arg0 context.Context, arg1 volume.Vol return c.pimpl.VolumeCreate(arg0, arg1) } -func (c *closeGuardingClient) VolumeInspect(arg0 context.Context, arg1 string) (types.Volume, error) { +func (c *closeGuardingClient) VolumeInspect(arg0 context.Context, arg1 string) (volume.Volume, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -1027,7 +1026,7 @@ func (c *closeGuardingClient) VolumeInspect(arg0 context.Context, arg1 string) ( return c.pimpl.VolumeInspect(arg0, arg1) } -func (c *closeGuardingClient) VolumeInspectWithRaw(arg0 context.Context, arg1 string) (types.Volume, []uint8, error) { +func (c *closeGuardingClient) VolumeInspectWithRaw(arg0 context.Context, arg1 string) (volume.Volume, []uint8, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -1036,7 +1035,7 @@ func (c *closeGuardingClient) VolumeInspectWithRaw(arg0 context.Context, arg1 st return c.pimpl.VolumeInspectWithRaw(arg0, arg1) } -func (c *closeGuardingClient) VolumeList(arg0 context.Context, arg1 filters.Args) (volume.VolumeListOKBody, error) { +func (c *closeGuardingClient) VolumeList(arg0 context.Context, arg1 volume.ListOptions) (volume.ListResponse, error) { c.m.RLock() defer c.m.RUnlock() if c.closed { @@ -1062,3 +1061,12 @@ func (c *closeGuardingClient) VolumesPrune(arg0 context.Context, arg1 filters.Ar } return c.pimpl.VolumesPrune(arg0, arg1) } + +func (c *closeGuardingClient) VolumeUpdate(arg0 context.Context, arg1 string, arg2 swarm.Version, arg3 volume.UpdateOptions) error { + c.m.RLock() + defer c.m.RUnlock() + if c.closed { + panic("use of closed client") + } + return c.pimpl.VolumeUpdate(arg0, arg1, arg2, arg3) +} diff --git a/pkg/filesystem/filesystem.go b/pkg/filesystem/filesystem.go index d43aad75b1..c72cf5ee53 100644 --- a/pkg/filesystem/filesystem.go +++ b/pkg/filesystem/filesystem.go @@ -173,7 +173,11 @@ func (o osFilesystem) Stat(name string) (fs.FileInfo, error) { func (o osFilesystem) Readlink(link string) (string, error) { link = filepath.FromSlash(link) - return os.Readlink(filepath.Join(o.root, link)) + t, err := os.Readlink(filepath.Join(o.root, link)) + if err != nil { + return "", err + } + return filepath.ToSlash(t), nil } // subFS exposes subdirectory of underlying FS, this is similar to `chroot`. diff --git a/pkg/filesystem/filesystem_test.go b/pkg/filesystem/filesystem_test.go index e5c1435965..6774ee1c24 100644 --- a/pkg/filesystem/filesystem_test.go +++ b/pkg/filesystem/filesystem_test.go @@ -158,7 +158,7 @@ func loadLocalFiles(root string) ([]FileInfo, error) { } case fs.ModeSymlink: t, _ := os.Readlink(path) - bs = []byte(t) + bs = []byte(filepath.ToSlash(t)) } path, err = filepath.Rel(root, path) if err != nil { diff --git a/pkg/functions/client.go b/pkg/functions/client.go index fd2edb6f19..16f5230750 100644 --- a/pkg/functions/client.go +++ b/pkg/functions/client.go @@ -17,6 +17,8 @@ import ( "time" "gopkg.in/yaml.v2" + + "knative.dev/func/pkg/scaffolding" "knative.dev/func/pkg/utils" ) @@ -29,8 +31,34 @@ const ( // one implementation of each supported function signature. Currently that // includes an HTTP Handler ("http") and Cloud Events handler ("events") DefaultTemplate = "http" + + // DefaultStartTimeout is the suggested startup timeout to use by + // runner implementations. + DefaultStartTimeout = 60 * time.Second +) + +var ( + // DefaultPlatforms is a suggestion to builder implementations which + // platforms should be the default. Due to spotty implementation support + // use of this set is left up to the discretion of the builders + // themselves. In the event the builder receives build options which + // specify a set of platforms to use in leau of the default (see the + // BuildWithPlatforms functionl option), the builder should return + // an error if the request can not proceed. + DefaultPlatforms = []Platform{ + {OS: "linux", Architecture: "amd64"}, + {OS: "linux", Architecture: "arm64"}, + {OS: "linux", Architecture: "arm", Variant: "v7"}, // eg. RPiv4 + } ) +// Platform upon which a function may run +type Platform struct { + OS string + Architecture string + Variant string +} + // Client for managing function instances. type Client struct { repositoriesPath string // path to repositories @@ -51,21 +79,13 @@ type Client struct { instances *InstanceRefs // Function Instances management transport http.RoundTripper // Customizable internal transport pipelinesProvider PipelinesProvider // CI/CD pipelines management + startTimeout time.Duration // default start timeout for all runs } -// ErrNotBuilt indicates the function has not yet been built. -var ErrNotBuilt = errors.New("not built") - -// ErrNameRequired indicates the operation requires a name to complete. -var ErrNameRequired = errors.New("name required") - -// ErrRegistryRequired indicates the operation requires a registry to complete. -var ErrRegistryRequired = errors.New("registry required to build function, please set with `--registry` or the FUNC_REGISTRY environment variable") - // Builder of function source to runnable image. type Builder interface { // Build a function project with source located at path. - Build(context.Context, Function) error + Build(context.Context, Function, []Platform) error } // Pusher of function image to a registry. @@ -99,9 +119,10 @@ const ( // Runner runs the function locally. type Runner interface { // Run the function, returning a Job with metadata, error channels, and - // a stop function.The process can be stopped by running the returned stop + // a stop function. The process can be stopped by running the returned stop // function, either on context cancellation or in a defer. - Run(context.Context, Function) (*Job, error) + // The duration is the time to wait for the job to start. + Run(context.Context, Function, time.Duration) (*Job, error) } // Remover of deployed services. @@ -155,7 +176,7 @@ type Describer interface { // there is a one to many relationship between a given route and processes. // By default the system creates the 'local' and 'remote' named instances // when a function is run (locally) and deployed, respectively. -// See the .Instances(f) accessor for the map of named environments to these +// See the .InstanceRefs(f) accessor for the map of named environments to these // function information structures. type Instance struct { // Route is the primary route of a function instance. @@ -197,7 +218,6 @@ func New(options ...Option) *Client { builder: &noopBuilder{output: os.Stdout}, pusher: &noopPusher{output: os.Stdout}, deployer: &noopDeployer{output: os.Stdout}, - runner: &noopRunner{output: os.Stdout}, remover: &noopRemover{output: os.Stdout}, lister: &noopLister{output: os.Stdout}, describer: &noopDescriber{output: os.Stdout}, @@ -205,7 +225,9 @@ func New(options ...Option) *Client { progressListener: &NoopProgressListener{}, pipelinesProvider: &noopPipelinesProvider{}, transport: http.DefaultTransport, + startTimeout: DefaultStartTimeout, } + c.runner = newDefaultRunner(c, os.Stdout, os.Stderr) for _, o := range options { o(c) } @@ -355,6 +377,19 @@ func WithPipelinesProvider(pp PipelinesProvider) Option { } } +// WithStartTimeout sets a custom default timeout for functions which do not +// define their own. This is useful in situations where the client is +// operating in a restricted environment and all functions tend to take longer +// to start up than usual, or when the client is running functions which +// in general take longer to start. If a timeout is specified on the +// function itself, that will take precidence. Use the RunWithTimeout option +// on the Run method to specify a timeout with precidence. +func WithStartTimeout(t time.Duration) Option { + return func(c *Client) { + c.startTimeout = t + } +} + // ACCESSORS // --------- @@ -414,10 +449,10 @@ func (c *Client) Runtimes() ([]string, error) { // create a running function whose source code and metadata match that provided // by the passed function instance, returning the final route and any errors. func (c *Client) Apply(ctx context.Context, f Function) (string, Function, error) { - if !f.Initialized() { - return c.New(ctx, f) - } else { + if f.Initialized() { return c.Update(ctx, f) + } else { + return c.New(ctx, f) } } @@ -426,11 +461,12 @@ func (c *Client) Apply(ctx context.Context, f Function) (string, Function, error // Updates a function which has already been initialized to run the latest // source code. // -// Use Init, Build, Push and Deploy independently for lower level control. +// Use Apply for higher level control. Use Init, Build, Push and Deploy +// independently for lower level control. // Returns final primary route to the Function and any errors. func (c *Client) Update(ctx context.Context, f Function) (string, Function, error) { if !f.Initialized() { - return "", f, ErrNotInitialized + return "", f, ErrNotInitialized{f.Root} } var err error if f, err = c.Build(ctx, f); err != nil { @@ -451,7 +487,8 @@ func (c *Client) Update(ctx context.Context, f Function) (string, Function, erro // Function. Used by Apply when the path is not yet an initialized function. // Errors if the path is alrady an initialized function. // -// Use Init, Build, Push, Deploy etc. independently for lower level control. +// Use Apply for higher level control. Use Init, Build, Push, Deploy +// independently for lower level control. // Returns the primary route to the function or error. func (c *Client) New(ctx context.Context, cfg Function) (string, Function, error) { c.progressListener.SetTotal(3) @@ -560,11 +597,13 @@ func (c *Client) Init(cfg Function) (Function, error) { return f, err } + //create a .funcignore file + if err = ensureFuncIgnore(f.Root); err != nil { + return f, err + } + // Write out the new function's Template files. - // Templates contain values which may result in the function being mutated - // (default builders, etc) - err = c.Templates().Write(&f) - if err != nil { + if err = c.Templates().Write(&f); err != nil { return f, err } @@ -579,12 +618,25 @@ func (c *Client) Init(cfg Function) (Function, error) { return NewFunction(oldRoot) } +type BuildOptions struct { + Platforms []Platform +} + +type BuildOption func(c *BuildOptions) + +func BuildWithPlatforms(pp []Platform) BuildOption { + return func(c *BuildOptions) { + c.Platforms = pp + } +} + // Build the function at path. Errors if the function is either unloadable or does // not contain a populated Image. -func (c *Client) Build(ctx context.Context, f Function) (Function, error) { +func (c *Client) Build(ctx context.Context, f Function, options ...BuildOption) (Function, error) { c.progressListener.Increment("Building function image") ctx, cancel := context.WithCancel(ctx) defer cancel() + // If not logging verbosely, the ongoing progress of the build will not // be streaming to stdout, and the lack of activity has been seen to cause // users to prematurely exit due to the sluggishness of pulling large images @@ -592,6 +644,12 @@ func (c *Client) Build(ctx context.Context, f Function) (Function, error) { c.printBuildActivity(ctx) // print friendly messages until context is canceled } + // Options for the build task + oo := BuildOptions{} + for _, o := range options { + o(&oo) + } + // Default function registry to the client's global registry if f.Registry == "" { f.Registry = c.registry @@ -608,7 +666,7 @@ func (c *Client) Build(ctx context.Context, f Function) (Function, error) { } } - if err = c.builder.Build(ctx, f); err != nil { + if err = c.builder.Build(ctx, f, oo.Platforms); err != nil { return f, err } @@ -630,49 +688,15 @@ func (c *Client) Build(ctx context.Context, f Function) (Function, error) { // It also updates the included symlink to function source 'f' to point to // the current function's source. func (c *Client) Scaffold(ctx context.Context, f Function, dest string) (err error) { - // First get a reference to the repository containing the scaffolding to use - // - // TODO: In order to support extensible scaffolding from external repositories, - // Retain the repository reference from which a Function was initialized - // in order to re-read out its scaffolding later. This can be the locally- - // installed repository name or the remote reference URL. There are benefits - // and detriments either way. A third option would be to store the - // scaffolding locally, but this also has downsides. - // - // If function creatd from a local repository named: - // repo = repoFromURL(f.RepoURL) - // If function created from a remote reference: - // c.Repositories().Get(f.RepoName) - // If function not created from an external repository: - repo, err := c.Repositories().Get(DefaultRepositoryName) - if err != nil { - return - } - - // Detect the method signature - s, err := functionSignature(f) + repo, err := NewRepository("", "") // default (embedded) repository if err != nil { return } - - // Write Scaffolding from the Repository into the destination - if err = repo.WriteScaffolding(ctx, f, s, dest); err != nil { - return - } - - // Replace the 'f' link of the scaffolding (which is now incorrect) to - // link to the function's root. - src, err := filepath.Rel(dest, f.Root) - if err != nil { - return fmt.Errorf("error determining relative path to function source %w", err) - } - _ = os.Remove(filepath.Join(dest, "f")) - if err = os.Symlink(src, filepath.Join(dest, "f")); err != nil { - return fmt.Errorf("error linking scaffolding to function source %w", err) - } - return + return scaffolding.Write(dest, f.Root, f.Runtime, f.Invoke, repo.FS()) } +// printBuildActivity is a helper for ensuring the user gets feedback from +// the long task of containerized builds. func (c *Client) printBuildActivity(ctx context.Context) { m := []string{ "Still building", @@ -870,21 +894,51 @@ func (c *Client) Route(ctx context.Context, f Function) (string, Function, error return instance.Route, f, nil } +type RunOptions struct { + StartTimeout time.Duration +} + +type RunOption func(c *RunOptions) + +// RunWithStartTimeout sets a specific timeout for this run request to start. +// If not provided, the client's run timeout (set by default to +// DefaultRunTimeout and configurable via the WithRunTimeout client +// instantiation option) is used. +func RunWithStartTimeout(t time.Duration) RunOption { + return func(c *RunOptions) { + c.StartTimeout = t + } +} + // Run the function whose code resides at root. // On start, the chosen port is sent to the provided started channel -func (c *Client) Run(ctx context.Context, f Function) (job *Job, err error) { +func (c *Client) Run(ctx context.Context, f Function, options ...RunOption) (job *Job, err error) { go func() { <-ctx.Done() c.progressListener.Stopping() }() + oo := RunOptions{} + for _, o := range options { + o(&oo) + } + if !f.Initialized() { return nil, fmt.Errorf("can not run an uninitialized function") } + // timeout for this run task. + timeout := c.startTimeout // client's global setting is the default + if f.Run.StartTimeout != 0 { // Function value, if defined, takes precidence + timeout = f.Run.StartTimeout + } + if oo.StartTimeout != 0 { // Highest precidence is an option passed to Run + timeout = oo.StartTimeout + } + // Run the function, which returns a Job for use interacting (at arms length) // with that running task (which is likely inside a container process). - if job, err = c.runner.Run(ctx, f); err != nil { + if job, err = c.runner.Run(ctx, f, timeout); err != nil { return } @@ -1072,6 +1126,41 @@ func ensureRunDataDir(root string) error { return nil } +func ensureFuncIgnore(root string) error { + filePath := filepath.Join(root, ".funcignore") + + // Check if the file exists + _, err := os.Stat(filePath) + if err == nil { + // File exists, do nothing + return nil + } + if !os.IsNotExist(err) { + // Some other error occurred when trying to stat the file + return err + } + + //file does not exist, create it + // Open the file for writing only + file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + return err + } + defer file.Close() + + // Write the desired string to the file + _, err = file.WriteString(` +# Use the .funcignore file to exclude files which should not be +# tracked in the image build. To instruct the system not to track +# files in the image build, add the regex pattern or file information +# to this file. +`) + if err != nil { + return err + } + return nil +} + // Fingerprint the files at a given path. Returns a hash calculated from the // filenames and modification timestamps of the files within the given root. // Also returns a logfile consiting of the filenames and modification times @@ -1202,7 +1291,7 @@ func hasInitializedFunction(path string) (bool, error) { // Builder type noopBuilder struct{ output io.Writer } -func (n *noopBuilder) Build(ctx context.Context, _ Function) error { return nil } +func (n *noopBuilder) Build(ctx context.Context, _ Function, _ []Platform) error { return nil } // Pusher type noopPusher struct{ output io.Writer } @@ -1216,13 +1305,6 @@ func (n *noopDeployer) Deploy(ctx context.Context, _ Function) (DeploymentResult return DeploymentResult{}, nil } -// Runner -type noopRunner struct{ output io.Writer } - -func (n *noopRunner) Run(context.Context, Function) (job *Job, err error) { - return nil, errors.New("no runner available") -} - // Remover type noopRemover struct{ output io.Writer } diff --git a/pkg/functions/client_test.go b/pkg/functions/client_test.go index 859fa5077d..85e256569a 100644 --- a/pkg/functions/client_test.go +++ b/pkg/functions/client_test.go @@ -14,6 +14,7 @@ import ( "os" "path/filepath" "reflect" + "runtime" "strings" "sync/atomic" "testing" @@ -23,6 +24,7 @@ import ( "knative.dev/func/pkg/builders" fn "knative.dev/func/pkg/functions" "knative.dev/func/pkg/mock" + "knative.dev/func/pkg/oci" . "knative.dev/func/pkg/testing" ) @@ -37,6 +39,12 @@ const ( TestRuntime = "go" ) +var ( + // TestPlatforms to use when a multi-architecture build is not necessary + // for testing. + TestPlatforms = []fn.Platform{{OS: runtime.GOOS, Architecture: runtime.GOARCH}} +) + // TestClient_New function completes without error using defaults and zero values. // New is the superset of creating a new fully deployed function, and // thus implicitly tests Create, Build and Deploy, which are exposed @@ -594,8 +602,9 @@ func TestClient_New_Delegation(t *testing.T) { } } -// TestClient_Run ensures that the runner is invoked with the absolute path requested. +// TestClient_Run ensures that the runner is invoked with the path requested. // Implicitly checks that the stop fn returned also is respected. +// See TestClient_Runner for the test of the default runner implementation. func TestClient_Run(t *testing.T) { // Create the root function directory root := "testdata/example.com/testRun" @@ -629,6 +638,53 @@ func TestClient_Run(t *testing.T) { } } +// TestClient_Runner ensures that the default internal runner correctly executes +// a scaffolded function. +func TestClient_Runner(t *testing.T) { + // This integration test explicitly requires the "host" builder due to its + // lack of a dependency on a container runtime, and the other builders not + // taking advantage of Scaffolding (expected by this runner). + // See E2E tests for testing of running functions built using Pack or S2I and + // which are dependent on Podman or Docker. + // Currently only a Go function is tested because other runtimes do not yet + // have scaffolding. + + root, cleanup := Mktemp(t) + defer cleanup() + ctx, cancel := context.WithCancel(context.Background()) + client := fn.New(fn.WithBuilder(oci.NewBuilder("", true)), fn.WithVerbose(true)) + + // Initialize + f, err := client.Init(fn.Function{Root: root, Runtime: "go", Registry: TestRegistry}) + if err != nil { + t.Fatal(err) + } + + // Build + if f, err = client.Build(ctx, f, fn.BuildWithPlatforms(TestPlatforms)); err != nil { + t.Fatal(err) + } + + // Run + job, err := client.Run(ctx, f) + if err != nil { + t.Fatal(err) + } + + // Invoke + resp, err := http.Get(fmt.Sprintf("http://%s:%s", job.Host, job.Port)) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + t.Fatalf("unexpected response code: %v", resp.StatusCode) + } + + cancel() +} + // TestClient_Run_DataDir ensures that when a function is created, it also // includes a .func (runtime data) directory which is registered as ignored for // functions which will be tracked in git source control. @@ -674,6 +730,67 @@ func TestClient_Run_DataDir(t *testing.T) { t.Errorf(".gitignore does not include '/%v' ignore directive", fn.RunDataDir) } +// TestClient_RunTimeout ensures that the run task bubbles a timeout +// error if the function does not report ready within the allotted timeout. +func TestClient_RunTimeout(t *testing.T) { + cwd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + root, cleanup := Mktemp(t) + defer cleanup() + + // A client with a shorter global timeout. + client := fn.New( + fn.WithBuilder(oci.NewBuilder("", true)), + fn.WithVerbose(true), + fn.WithStartTimeout(2*time.Second)) + + // Initialize + f, err := client.Init(fn.Function{Root: root, Runtime: "go", Registry: TestRegistry}) + if err != nil { + t.Fatal(err) + } + + // Replace the implementation with the test implementation which will + // return a non-200 response for the first 10 seconds. This confirms + // the client is waiting and retrying. + // TODO: we need an init option which skips writing example source-code. + _ = os.Remove(filepath.Join(root, "function.go")) + _ = os.Remove(filepath.Join(root, "function_test.go")) + _ = os.Remove(filepath.Join(root, "handle.go")) + _ = os.Remove(filepath.Join(root, "handle_test.go")) + src, err := os.Open(filepath.Join(cwd, "testdata", "testClientRunTimeout", "f.go")) + if err != nil { + t.Fatal(err) + } + dst, err := os.Create(filepath.Join(root, "f.go")) + if err != nil { + t.Fatal(err) + } + + if _, err = io.Copy(dst, src); err != nil { + t.Fatal(err) + } + src.Close() + dst.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Build + if f, err = client.Build(ctx, f, fn.BuildWithPlatforms(TestPlatforms)); err != nil { + t.Fatal(err) + } + + // Run + // with a fairly short timeout so as not to hold up tests. + _, err = client.Run(ctx, f, fn.RunWithStartTimeout(1*time.Second)) + if !errors.As(err, &fn.ErrRunTimeout{}) { + t.Fatalf("did not receive ErrRunTimeout. Got %v", err) + } +} + // TestClient_Update ensures that updating invokes the build/push/deploy // process, erroring if run on a directory uncreated. func TestClient_Update(t *testing.T) { @@ -1470,11 +1587,11 @@ func TestClient_Invoke_HTTP(t *testing.T) { // Create a client with a mock runner which will report the port at which the // interloping function is listening. runner := mock.NewRunner() - runner.RunFn = func(ctx context.Context, f fn.Function) (*fn.Job, error) { + runner.RunFn = func(ctx context.Context, f fn.Function, _ time.Duration) (*fn.Job, error) { _, p, _ := net.SplitHostPort(l.Addr().String()) errs := make(chan error, 10) stop := func() error { return nil } - return fn.NewJob(f, p, errs, stop, false) + return fn.NewJob(f, "127.0.0.1", p, errs, stop, false) } client := fn.New(fn.WithRegistry(TestRegistry), fn.WithRunner(runner)) @@ -1568,11 +1685,11 @@ func TestClient_Invoke_CloudEvent(t *testing.T) { // Create a client with a mock Runner which returns its address. runner := mock.NewRunner() - runner.RunFn = func(ctx context.Context, f fn.Function) (*fn.Job, error) { + runner.RunFn = func(ctx context.Context, f fn.Function, _ time.Duration) (*fn.Job, error) { _, p, _ := net.SplitHostPort(l.Addr().String()) errs := make(chan error, 10) stop := func() error { return nil } - return fn.NewJob(f, p, errs, stop, false) + return fn.NewJob(f, "127.0.0.1", p, errs, stop, false) } client := fn.New(fn.WithRegistry(TestRegistry), fn.WithRunner(runner)) @@ -1618,10 +1735,10 @@ func TestClient_Instances(t *testing.T) { // A mock runner runner := mock.NewRunner() - runner.RunFn = func(_ context.Context, f fn.Function) (*fn.Job, error) { + runner.RunFn = func(_ context.Context, f fn.Function, _ time.Duration) (*fn.Job, error) { errs := make(chan error, 10) stop := func() error { return nil } - return fn.NewJob(f, "8080", errs, stop, false) + return fn.NewJob(f, "127.0.0.1", "8080", errs, stop, false) } // Client with the mock runner @@ -1708,3 +1825,66 @@ func TestClient_CreateMigration(t *testing.T) { t.Fatal("freshly created function should have the latest migration") } } + +// TestClient_RunReadiness ensures that the run task awaits a ready response +// from the job before returning. +func TestClient_RunRediness(t *testing.T) { + cwd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + root, cleanup := Mktemp(t) + defer cleanup() + + client := fn.New(fn.WithBuilder(oci.NewBuilder("", true)), fn.WithVerbose(true)) + + // Initialize + f, err := client.Init(fn.Function{Root: root, Runtime: "go", Registry: TestRegistry}) + if err != nil { + t.Fatal(err) + } + + // Replace the implementation with the test implementation which will + // return a non-200 response for the first few seconds. This confirms + // the client is waiting and retrying. + // TODO: we need an init option which skips writing example source-code. + _ = os.Remove(filepath.Join(root, "function.go")) + _ = os.Remove(filepath.Join(root, "function_test.go")) + _ = os.Remove(filepath.Join(root, "handle.go")) + _ = os.Remove(filepath.Join(root, "handle_test.go")) + src, err := os.Open(filepath.Join(cwd, "testdata", "testClientRunReadiness", "f.go")) + if err != nil { + t.Fatal(err) + } + dst, err := os.Create(filepath.Join(root, "f.go")) + if err != nil { + t.Fatal(err) + } + + if _, err = io.Copy(dst, src); err != nil { + t.Fatal(err) + } + src.Close() + dst.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Build + if f, err = client.Build(ctx, f, fn.BuildWithPlatforms(TestPlatforms)); err != nil { + t.Fatal(err) + } + + // Run + // The function returns a non-200 from its readiness handler at first. + // Since we already confirmed in another test that a timeout awaiting a + // 200 response from this endpoint does indeed fail the run task, this + // delayed 200 confirms there is a retry in place. + job, err := client.Run(ctx, f) + if err != nil { + t.Fatal(err) + } + if err := job.Stop(); err != nil { + t.Fatalf("err on job stop. %v", err) + } +} diff --git a/pkg/functions/errors.go b/pkg/functions/errors.go new file mode 100644 index 0000000000..db2520e59d --- /dev/null +++ b/pkg/functions/errors.go @@ -0,0 +1,73 @@ +package functions + +import ( + "errors" + "fmt" + "time" +) + +var ( + ErrEnvironmentNotFound = errors.New("environment not found") + ErrMismatchedName = errors.New("name passed the function source") + ErrNameRequired = errors.New("name required") + ErrNotBuilt = errors.New("not built") + ErrNotRunning = errors.New("function not running") + ErrRepositoriesNotDefined = errors.New("custom template repositories location not specified") + ErrRepositoryNotFound = errors.New("repository not found") + ErrRootRequired = errors.New("function root path is required") + ErrRuntimeNotFound = errors.New("language runtime not found") + ErrRuntimeRequired = errors.New("language runtime required") + ErrTemplateMissingRepository = errors.New("template name missing repository prefix") + ErrTemplateNotFound = errors.New("template not found") + ErrTemplatesNotFound = errors.New("templates path (runtimes) not found") + ErrContextCanceled = errors.New("the operation was canceled") + + // TODO: change the wording of this error to not be CLI-specific; + // eg "registry required". Then catch the error in the CLI and add the + // cli-specific usage hints there + ErrRegistryRequired = errors.New("registry required to build function, please set with `--registry` or the FUNC_REGISTRY environment variable") +) + +// ErrNotInitialized indicates that a function is uninitialized +type ErrNotInitialized struct { + Path string +} + +func NewErrNotInitialized(path string) error { + return &ErrNotInitialized{Path: path} +} + +func (e ErrNotInitialized) Error() string { + if e.Path == "" { + return "function is not initialized" + } + return fmt.Sprintf("'%s' does not contain an initialized function", e.Path) +} + +// ErrRuntimeNotRecognized indicates a runtime which is not in the set of +// those known. +type ErrRuntimeNotRecognized struct { + Runtime string +} + +func (e ErrRuntimeNotRecognized) Error() string { + return fmt.Sprintf("the %q runtime is not recognized", e.Runtime) +} + +// ErrRunnerNotImplemented indicates the feature is not available for the +// requested runtime. +type ErrRunnerNotImplemented struct { + Runtime string +} + +func (e ErrRunnerNotImplemented) Error() string { + return fmt.Sprintf("the %q runtime may only be run containerized.", e.Runtime) +} + +type ErrRunTimeout struct { + Timeout time.Duration +} + +func (e ErrRunTimeout) Error() string { + return fmt.Sprintf("timed out waiting for function to be ready for %s", e.Timeout) +} diff --git a/pkg/functions/function.go b/pkg/functions/function.go index d0d2d83e18..455ba819c8 100644 --- a/pkg/functions/function.go +++ b/pkg/functions/function.go @@ -22,9 +22,6 @@ const ( // RunDataDir holds transient runtime metadata // By default it is excluded from source control. RunDataDir = ".func" - - // DefaultPersistentVolumeClaimSize represents default size of PVC created for a Pipeline - DefaultPersistentVolumeClaimSize string = "256Mi" ) // Function @@ -56,9 +53,9 @@ type Function struct { // Registry at which to store interstitial containers, in the form // [registry]/[user]. - Registry string `yaml:"registry"` + Registry string `yaml:"registry,omitempty"` - // Optional full OCI image tag in form: + // Image is the full OCI image tag in form: // [registry]/[namespace]/[name]:[tag] // example: // quay.io/alice/my.function.name @@ -67,9 +64,9 @@ type Function struct { // alice/my.function.name // If Image is provided, it overrides the default of concatenating // "Registry+Name:latest" to derive the Image. - Image string `yaml:"image"` + Image string `yaml:"image,omitempty"` - // SHA256 hash of the latest image that has been built + // ImageDigest is the SHA256 hash of the latest image that has been built ImageDigest string `yaml:"imageDigest,omitempty"` // Created time is the moment that creation was successfully completed @@ -81,13 +78,13 @@ type Function struct { // See Client.Invoke for usage. Invoke string `yaml:"invoke,omitempty"` - //BuildSpec define the build properties for a function + // Build defines the build properties for a function Build BuildSpec `yaml:"build,omitempty"` - //RunSpec define the runtime properties for a function + // Run defines the runtime properties for a function Run RunSpec `yaml:"run,omitempty"` - //DeploySpec define the deployment properties for a function + // Deploy defines the deployment properties for a function Deploy DeploySpec `yaml:"deploy,omitempty"` } @@ -126,6 +123,12 @@ type RunSpec struct { // Env variables to be set Envs Envs `yaml:"envs,omitempty"` + + // StartTimeout specifies that this function should have a custom timeout + // when starting. This setting is currently respected by the host runner, + // with containerized docker runner and deployed Knative service integration + // in development. + StartTimeout time.Duration `yaml:"startTimeout,omitempty"` } // DeploySpec @@ -149,6 +152,12 @@ type DeploySpec struct { // Health endpoints specified by the language pack HealthEndpoints HealthEndpoints `yaml:"healthEndpoints,omitempty"` + + // ServiceAccountName is the name of the service account used for the + // function pod. The service account must exist in the namespace to + // succeed. + // More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ + ServiceAccountName string `yaml:"serviceAccountName,omitempty"` } // HealthEndpoints specify the liveness and readiness endpoints for a Runtime @@ -163,20 +172,12 @@ type BuildConfig struct { BuilderImages map[string]string `yaml:"builderImages,omitempty"` } -type UninitializedError struct { - Path string -} - -func (e *UninitializedError) Error() string { - return fmt.Sprintf("'%s' does not contain an initialized function", e.Path) -} - -func NewUninitializedError(path string) error { - return &UninitializedError{Path: path} -} - // NewFunctionWith defaults as provided. func NewFunctionWith(defaults Function) Function { + // Deprecatded: these defaults should be used directly from their + // in-code static defaults, config, etc. A function struct is used to hold + // overrides (eg. use PVCSize X instead of the default), and to record the + // results of operations (eg. the function was deployed with image Y). if defaults.SpecVersion == "" { defaults.SpecVersion = LastSpecVersion() } @@ -186,9 +187,6 @@ func NewFunctionWith(defaults Function) Function { if defaults.Build.BuilderImages == nil { defaults.Build.BuilderImages = make(map[string]string) } - if defaults.Build.PVCSize == "" { - defaults.Build.PVCSize = DefaultPersistentVolumeClaimSize - } if defaults.Deploy.Annotations == nil { defaults.Deploy.Annotations = make(map[string]string) } @@ -474,6 +472,12 @@ func (f Function) ImageWithDigest() string { return f.Image } + // Return image with new Digest if image already contains SHA256 Digest + shaIndex := strings.Index(f.Image, "@sha256:") + if shaIndex > 0 { + return f.Image[:shaIndex] + "@" + f.ImageDigest + } + lastSlashIdx := strings.LastIndexAny(f.Image, "/") imageAsBytes := []byte(f.Image) diff --git a/pkg/functions/function_git_unit_test.go b/pkg/functions/function_git_unit_test.go index 4243bf7c69..af624ee110 100644 --- a/pkg/functions/function_git_unit_test.go +++ b/pkg/functions/function_git_unit_test.go @@ -1,3 +1,6 @@ +//go:build !integration +// +build !integration + package functions import ( diff --git a/pkg/functions/function_migrations_unit_test.go b/pkg/functions/function_migrations_unit_test.go index d11864c394..9ebad33163 100644 --- a/pkg/functions/function_migrations_unit_test.go +++ b/pkg/functions/function_migrations_unit_test.go @@ -1,3 +1,6 @@ +//go:build !integration +// +build !integration + package functions import ( diff --git a/pkg/functions/function_unit_test.go b/pkg/functions/function_unit_test.go index 08eeeff652..b0fc6fd18e 100644 --- a/pkg/functions/function_unit_test.go +++ b/pkg/functions/function_unit_test.go @@ -105,6 +105,16 @@ func TestFunction_ImageWithDigest(t *testing.T) { fields: fields{Image: "bar:latest", ImageDigest: "42"}, want: "bar@42", }, + { + name: "Full path with port and SHA256 Digest", + fields: fields{Image: "image-registry.openshift-image-registry.svc.cluster.local:50000/default/bar@sha256:42", ImageDigest: "sha256:42"}, + want: "image-registry.openshift-image-registry.svc.cluster.local:50000/default/bar@sha256:42", + }, + { + name: "Full path with port and SHA256 Digest with empty ImageDigest", + fields: fields{Image: "image-registry.openshift-image-registry.svc.cluster.local:50000/default/bar@sha256:42", ImageDigest: ""}, + want: "image-registry.openshift-image-registry.svc.cluster.local:50000/default/bar@sha256:42", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/pkg/functions/instances.go b/pkg/functions/instances.go index 48e8f93746..529bb9602d 100644 --- a/pkg/functions/instances.go +++ b/pkg/functions/instances.go @@ -11,14 +11,6 @@ const ( EnvironmentRemote = "remote" ) -var ( - ErrNotInitialized = errors.New("function is not initialized") - ErrNotRunning = errors.New("function not running") - ErrRootRequired = errors.New("function root path is required") - ErrEnvironmentNotFound = errors.New("environment not found") - ErrMismatchedName = errors.New("name passed does not match name of the function at root") -) - // InstanceRefs manager // // InstanceRefs are point-in-time snapshots of a function's runtime state in @@ -61,7 +53,7 @@ func (s *InstanceRefs) Local(ctx context.Context, f Function) (Instance, error) return i, ErrRootRequired } if !f.Initialized() { - return i, ErrNotInitialized + return i, ErrNotInitialized{f.Root} } ports := jobPorts(f) if len(ports) == 0 { diff --git a/pkg/functions/instances_test.go b/pkg/functions/instances_test.go index 2de3da41e7..d7327b5356 100644 --- a/pkg/functions/instances_test.go +++ b/pkg/functions/instances_test.go @@ -5,6 +5,7 @@ package functions import ( "context" + "errors" "fmt" "runtime" "strings" @@ -26,31 +27,36 @@ func TestInstances_LocalErrors(t *testing.T) { } tests := []struct { - name string - f Function - want error + name string + f Function + wantIs error + wantAs any }{ { - name: "Not running", // Function exists but is not running - f: f, - want: ErrNotRunning, + name: "Not running", // Function exists but is not running + f: f, + wantIs: ErrNotRunning, }, { - name: "Not initialized", // A function directory is provided, but no function exists - f: Function{Root: "testdata/not-initialized"}, - want: ErrNotInitialized, + name: "Not initialized", // A function directory is provided, but no function exists + f: Function{Root: "testdata/not-initialized"}, + wantAs: &ErrNotInitialized{}, }, { - name: "Root required", // No root directory is provided - f: Function{}, - want: ErrRootRequired, + name: "Root required", // No root directory is provided + f: Function{}, + wantIs: ErrRootRequired, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { i := InstanceRefs{} - if _, err := i.Local(context.TODO(), tt.f); err != tt.want { - t.Errorf("Local() error = %v, wantErr %v", err, tt.want) + _, err := i.Local(context.Background(), tt.f) + if tt.wantIs != nil && !errors.Is(err, tt.wantIs) { + t.Errorf("Local() error = %v, want %#v", err, tt.wantIs) + } + if tt.wantAs != nil && !errors.As(err, tt.wantAs) { + t.Errorf("Local() error = %v, want %#v", err, tt.wantAs) } }) } diff --git a/pkg/functions/job.go b/pkg/functions/job.go index a694730208..034034bd34 100644 --- a/pkg/functions/job.go +++ b/pkg/functions/job.go @@ -17,6 +17,7 @@ const runsDir = "runs" // the zero value of the struct is set up to noop without errors. type Job struct { Function Function + Host string Port string Errors chan error onStop func() error @@ -26,9 +27,10 @@ type Job struct { // Create a new Job which represents a running function task by providing // the port on which it was started, a channel on which runtime errors can // be received, and a stop function. -func NewJob(f Function, port string, errs chan error, onStop func() error, verbose bool) (j *Job, err error) { +func NewJob(f Function, host, port string, errs chan error, onStop func() error, verbose bool) (j *Job, err error) { j = &Job{ Function: f, + Host: host, Port: port, Errors: errs, onStop: onStop, @@ -43,6 +45,9 @@ func NewJob(f Function, port string, errs chan error, onStop func() error, verbo if j.Errors == nil { j.Errors = make(chan error, 1) } + if j.onStop == nil { + j.onStop = func() error { return nil } + } if err = cleanupJobDirs(j); err != nil { return } diff --git a/pkg/functions/job_test.go b/pkg/functions/job_test.go index 2bc1574173..e9e32265a2 100644 --- a/pkg/functions/job_test.go +++ b/pkg/functions/job_test.go @@ -1,3 +1,6 @@ +//go:build !integration +// +build !integration + package functions import ( @@ -31,15 +34,15 @@ func TestJob_New(t *testing.T) { // Assert that an initialized function and port are required onStop := func() error { return nil } - if _, err := NewJob(Function{}, "", nil, onStop, false); err == nil { + if _, err := NewJob(Function{}, "127.0.0.1", "8080", nil, onStop, false); err == nil { t.Fatal("expected NewJob to require an initialized functoin") } - if _, err := NewJob(f, "", nil, onStop, false); err == nil { + if _, err := NewJob(f, "127.0.0.1", "", nil, onStop, false); err == nil { t.Fatal("expected NewJob to require a port") } // Assert creating a Job with the required arguments succeeds. - _, err = NewJob(f, "8080", nil, onStop, false) + _, err = NewJob(f, "127.0.0.1", "8080", nil, onStop, false) if err != nil { t.Fatalf("creating job failed. %s", err) } @@ -75,7 +78,7 @@ func TestJob_Stop(t *testing.T) { onStop := func() error { onStopInvoked = true; return nil } // Assert creating a Job with the required arguments succeeds. - j, err := NewJob(f, "8080", nil, onStop, false) + j, err := NewJob(f, "127.0.0.1", "8080", nil, onStop, false) if err != nil { t.Fatalf("creating job failed. %s", err) } diff --git a/pkg/functions/repository.go b/pkg/functions/repository.go index a8f713489c..55ed114245 100644 --- a/pkg/functions/repository.go +++ b/pkg/functions/repository.go @@ -1,7 +1,6 @@ package functions import ( - "context" "errors" "fmt" "net/url" @@ -156,6 +155,11 @@ func NewRepository(name, uri string) (r Repository, err error) { return } +// FS returns the underlying filesystem of this repository. +func (r Repository) FS() filesystem.Filesystem { + return r.fs +} + // filesystemFromURI returns a filesystem from the data located at the // given URI. If URI is not provided, indicates the embedded repo should // be loaded. URI can be a remote git repository (http:// https:// etc.), @@ -271,6 +275,10 @@ func repositoryRuntimes(fs filesystem.Filesystem, repoName string, repoConfig re if !fi.IsDir() || strings.HasPrefix(fi.Name(), ".") { continue } + // ignore the reserved word "certs" + if fi.Name() == "certs" { + continue + } // Runtime, defaulted to values inherited from the repository runtime := Runtime{ Name: fi.Name(), @@ -525,30 +533,6 @@ func (r *Repository) Write(dest string) (err error) { return filesystem.CopyFromFS(".", dest, fs) } -// WriteScaffolding code to the given path. -// -// Scaffolding is a language-level operation which first detects the method -// signature used by the function's source code and then writes the -// appropriate scaffolding. -// -// NOTE: Scaffoding is not per-template, because a template is merely an -// example starting point for a Function implementation and should have no -// bearing on the shape that function can eventually take. The language, -// and optionally invocation hint (For cloudevents) are used for this. For -// example, there can be multiple templates which exemplify a given method -// signature, and the implementation can be switched at any time by the author. -// Language, by contrast, is fixed at time of initialization. -func (r *Repository) WriteScaffolding(ctx context.Context, f Function, s Signature, dest string) error { - if r.fs == nil { - return errors.New("repository has no filesystem") - } - path := fmt.Sprintf("%v/scaffolding/%v", f.Runtime, s.String()) // fs uses / on all OSs - if _, err := r.fs.Stat(path); err != nil { - return fmt.Errorf("no scaffolding found for '%v' signature '%v'. %v.", f.Runtime, s, err) - } - return filesystem.CopyFromFS(path, dest, r.fs) -} - // URL attempts to read the remote git origin URL of the repository. Best // effort; returns empty string if the repository is not a git repo or the repo // has been mutated beyond recognition on disk (ex: removing the origin remote) diff --git a/pkg/functions/runner.go b/pkg/functions/runner.go new file mode 100644 index 0000000000..cc5499b585 --- /dev/null +++ b/pkg/functions/runner.go @@ -0,0 +1,260 @@ +package functions + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "net/http" + "net/http/httputil" + "os" + "os/exec" + "path/filepath" + "time" +) + +const ( + defaultRunHost = "127.0.0.1" // TODO allow to be altered via a runOpt + defaultRunPort = "8080" + defaultRunDialTimeout = 2 * time.Second + defaultRunStopTimeout = 10 * time.Second + readinessEndpoint = "/health/readiness" +) + +type defaultRunner struct { + client *Client + out io.Writer + err io.Writer +} + +func newDefaultRunner(client *Client, out, err io.Writer) *defaultRunner { + return &defaultRunner{ + client: client, + out: out, + err: err, + } +} + +func (r *defaultRunner) Run(ctx context.Context, f Function, startTimeout time.Duration) (job *Job, err error) { + var ( + port string + runFn func() error + verbose = r.client.verbose + ) + + port, err = choosePort(defaultRunHost, defaultRunPort) + if err != nil { + return nil, fmt.Errorf("cannot choose port: %w", err) + } + + // Job contains metadata and references for the running function. + job, err = NewJob(f, defaultRunHost, port, nil, nil, verbose) + if err != nil { + return + } + + // Scaffold the function such that it can be run. + if err = r.client.Scaffold(ctx, f, job.Dir()); err != nil { + return + } + + // Runner for the Function's runtime. + if runFn, err = getRunFunc(ctx, job); err != nil { + return + } + + // Run the scaffolded function asynchronously. + if err = runFn(); err != nil { + return + } + + // Wait for it to become available before returning the metadata. + err = waitFor(ctx, job, startTimeout) + return +} + +// getRunFunc returns a function which will run the user's Function based on +// the jobs runtime. +func getRunFunc(ctx context.Context, job *Job) (runFn func() error, err error) { + runtime := job.Function.Runtime + switch runtime { + case "": + err = ErrRuntimeRequired + case "go": + runFn = func() error { return runGo(ctx, job) } + case "python": + err = ErrRunnerNotImplemented{runtime} + case "java": + err = ErrRunnerNotImplemented{runtime} + case "node": + err = ErrRunnerNotImplemented{runtime} + case "typescript": + err = ErrRunnerNotImplemented{runtime} + case "rust": + err = ErrRunnerNotImplemented{runtime} + case "quarkus": + err = ErrRunnerNotImplemented{runtime} + default: + err = ErrRuntimeNotRecognized{runtime} + } + return +} + +func runGo(ctx context.Context, job *Job) (err error) { + // BUILD + // ----- + // TODO: extract the build command code from the OCI Container Builder + // and have both the runner and OCI Container Builder use the same here. + if job.verbose { + fmt.Printf("cd %v && go build -o f.bin\n", job.Dir()) + } + + // Get the dependencies of the function + cmd := exec.CommandContext(ctx, "go", "get", "f") + cmd.Dir = job.Dir() + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + if err = cmd.Run(); err != nil { + return + } + + // Build + args := []string{"build", "-o", "f.bin"} + if job.verbose { + args = append(args, "-v") + } + cmd = exec.CommandContext(ctx, "go", args...) + cmd.Dir = job.Dir() + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + return + } + + // Run + // --- + bin := filepath.Join(job.Dir(), "f.bin") + if job.verbose { + fmt.Printf("cd %v && PORT=%v %v\n", job.Function.Root, job.Port, bin) + } + cmd = exec.CommandContext(ctx, bin) + cmd.Dir = job.Function.Root + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + // cmd.Cancel = stop // TODO: use when we upgrade to go 1.20 + // TODO: Update the functions go runtime to accept LISTEN_ADDRESS rather + // than just port in able to allow listening on other interfaces + // (keeping the default localhost only) + if job.Host != "127.0.0.1" { + fmt.Fprintf(os.Stderr, "Warning: the Go functions runtime currently only supports localhost '127.0.0.1'. Requested listen interface '%v' will be ignored.", job.Host) + } + // See the 1.19 [release notes](https://tip.golang.org/doc/go1.19) which state: + // A Cmd with a non-empty Dir field and nil Env now implicitly sets the PWD environment variable for the subprocess to match Dir. + // The new method Cmd.Environ reports the environment that would be used to run the command, including the implicitly set PWD variable. + // cmd.Env = append(cmd.Environ(), "PORT="+job.Port) // requires go 1.19 + cmd.Env = append(cmd.Env, "PORT="+job.Port, "PWD="+cmd.Dir) + + // Running asynchronously allows for the client Run method to return + // metadata about the running function such as its chosen port. + go func() { + job.Errors <- cmd.Run() + }() + return +} + +func waitFor(ctx context.Context, job *Job, timeout time.Duration) error { + var ( + uri = fmt.Sprintf("http://%s:%s%s", job.Host, job.Port, readinessEndpoint) + interval = 500 * time.Millisecond + ) + + if job.verbose { + fmt.Printf("Waiting for %v\n", uri) + } + + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + + for { + ok, err := isReady(ctx, uri, timeout, job.verbose) + if ok || err != nil { + return err + } + + select { + case <-ctx.Done(): + if errors.Is(ctx.Err(), context.DeadlineExceeded) { + return ErrRunTimeout{timeout} + } + return ErrContextCanceled + case <-time.After(interval): + continue + } + } +} + +// isReady returns true if the uri could be reached and returned an HTTP 200. +// False is returned if a nonfatal error was encountered (which will have been +// printed to stderr), and an error is returned when an error is encountered +// that is unlikely to be due to startup (malformed requests). +func isReady(ctx context.Context, uri string, timeout time.Duration, verbose bool) (ok bool, err error) { + req, err := http.NewRequestWithContext(ctx, "GET", uri, nil) + if err != nil { + return false, fmt.Errorf("error creating readiness check context. %w", err) + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + if err, ok := err.(net.Error); ok && err.Timeout() { + return false, ErrRunTimeout{timeout} + } + if verbose { + fmt.Fprintf(os.Stderr, "endpoint not available. %v\n", err) + } + return false, nil // nonfatal. May still be starting up. + } + defer res.Body.Close() + + if res.StatusCode != 200 { + if verbose { + fmt.Fprintf(os.Stderr, "endpoint returned HTTP %v:\n", res.StatusCode) + dump, _ := httputil.DumpResponse(res, true) + fmt.Println(string(dump)) + } + return false, nil // nonfatal. May still be starting up + } + + return true, nil +} + +// choosePort returns an unused port on the given interface (host) +// Note this is not fool-proof becase of a race with any other processes +// looking for a port at the same time. If that is important, we can implement +// a check-lock-check via the filesystem. +// Also note that TCP is presumed. +func choosePort(iface, preferredPort string) (string, error) { + var ( + port = preferredPort + l net.Listener + err error + ) + + // Try preferred + if l, err = net.Listen("tcp", net.JoinHostPort(iface, port)); err == nil { + l.Close() // note err==nil + return port, nil + } + + // OS-chosen + if l, err = net.Listen("tcp", net.JoinHostPort(iface, "")); err != nil { + return "", fmt.Errorf("cannot bind tcp: %w", err) + } + l.Close() // begins aforementioned race + if _, port, err = net.SplitHostPort(l.Addr().String()); err != nil { + return "", fmt.Errorf("cannot parse port: %w", err) + } + return port, nil +} diff --git a/pkg/functions/runner_test.go b/pkg/functions/runner_test.go new file mode 100644 index 0000000000..938054f907 --- /dev/null +++ b/pkg/functions/runner_test.go @@ -0,0 +1,44 @@ +//go:build !integration +// +build !integration + +package functions + +import ( + "context" + "errors" + "testing" +) + +// TestGetRunFuncErrors ensures that known runtimes which do not yet +// have their runner implemented return a "not yet available" message, as +// distinct from unrecognized runtimes which state as much. +func TestGetRunFuncErrors(t *testing.T) { + tests := []struct { + Runtime string + ExpectedIs error + ExpectedAs any + }{ + {"", ErrRuntimeRequired, nil}, + {"go", nil, nil}, + {"python", nil, &ErrRunnerNotImplemented{}}, + {"rust", nil, &ErrRunnerNotImplemented{}}, + {"node", nil, &ErrRunnerNotImplemented{}}, + {"typescript", nil, &ErrRunnerNotImplemented{}}, + {"quarkus", nil, &ErrRunnerNotImplemented{}}, + {"java", nil, &ErrRunnerNotImplemented{}}, + {"other", nil, &ErrRuntimeNotRecognized{}}, + } + for _, test := range tests { + t.Run(test.Runtime, func(t *testing.T) { + + ctx := context.Background() + job := Job{Function: Function{Runtime: test.Runtime}} + _, err := getRunFunc(ctx, &job) + + if test.ExpectedAs != nil && !errors.As(err, test.ExpectedAs) { + t.Fatalf("did not receive expected error type for %v runtime.", test.Runtime) + } + t.Logf("ok: %v", err) + }) + } +} diff --git a/pkg/functions/signatures.go b/pkg/functions/signatures.go deleted file mode 100644 index 38b0bf718e..0000000000 --- a/pkg/functions/signatures.go +++ /dev/null @@ -1,147 +0,0 @@ -package functions - -import ( - "errors" - "fmt" - "go/ast" - "go/parser" - "go/token" - "os" - "path/filepath" - "strings" -) - -type Signature int - -const ( - UnknownSignature Signature = iota - InstancedHTTP - InstancedCloudevent - StaticHTTP - StaticCloudevent -) - -func (s Signature) String() string { - return []string{ - "unknown", - "instanced-http", - "instanced-cloudevent", - "static-http", - "static-cloudevent", - }[s] -} - -var signatureMap = map[bool]map[string]Signature{ - true: { - "http": InstancedHTTP, - "cloudevent": InstancedCloudevent}, - false: { - "http": StaticHTTP, - "cloudevent": StaticCloudevent}, -} - -func signature(instanced bool, invoke string) Signature { - if invoke == "" { - invoke = "http" - } - s, ok := signatureMap[instanced][invoke] - if !ok { - return UnknownSignature - } - return s -} - -// detectors check for the existence of certain method signatures in the -// source code at the given root. -type detector interface { - Detect(dir string) (static, instanced bool, err error) -} - -// functionSignature returns the signature implemented by the given function -func functionSignature(f Function) (s Signature, err error) { - d, err := detectorFor(f.Runtime) - if err != nil { - return UnknownSignature, err - } - static, instanced, err := d.Detect(f.Root) - if err != nil { - return - } - // Function must implement either a static handler or the instanced handler - // but not both. - if static && instanced { - return s, fmt.Errorf("function may not implement both the static and instanced method signatures simultaneously") - } else if !static && !instanced { - return s, fmt.Errorf("function does not appear to implement any known method signatures") - } else if instanced { - return signature(true, f.Invoke), nil - } else { - return signature(false, f.Invoke), nil - } -} - -// detectorFor runtime returns a signature detector for a given runtime -func detectorFor(runtime string) (detector, error) { - switch runtime { - case "go": - return &goDetector{}, nil - case "python": - return &pythonDetector{}, nil - case "rust": - return nil, errors.New("the Rust signature detector is not yet available") - case "node": - return nil, errors.New("the Node.js signature detector is not yet available") - case "quarkus": - return nil, errors.New("the TypeScript signature detector is not yet available") - default: - return nil, fmt.Errorf("unable to detect the signature of the unrecognized runtime language %q", runtime) - } -} - -// GO - -type goDetector struct{} - -func (d goDetector) Detect(dir string) (static, instanced bool, err error) { - files, err := os.ReadDir(dir) - if err != nil { - err = fmt.Errorf("signature detector encountered an error when scanning the function's source code %w", err) - return - } - for _, file := range files { - filename := filepath.Join(dir, file.Name()) - if file.IsDir() || !strings.HasSuffix(filename, ".go") { - continue - } - if d.hasFunctionDeclaration(filename, "New") { - instanced = true - } - if d.hasFunctionDeclaration(filename, "Handle") { - static = true - } - } - return -} - -func (d goDetector) hasFunctionDeclaration(filename, function string) bool { - astFile, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.SkipObjectResolution) - if err != nil { - return false - } - for _, decl := range astFile.Decls { - if funcDecl, ok := decl.(*ast.FuncDecl); ok { - if funcDecl.Name.Name == function { - return true - } - } - } - return false -} - -// PYTHON - -type pythonDetector struct{} - -func (d pythonDetector) Detect(dir string) (bool, bool, error) { - return false, false, errors.New("the Python method signature detector is not yet available.") -} diff --git a/pkg/functions/signatures_test.go b/pkg/functions/signatures_test.go deleted file mode 100644 index 62b329aa4f..0000000000 --- a/pkg/functions/signatures_test.go +++ /dev/null @@ -1,172 +0,0 @@ -package functions - -import ( - "errors" - "os" - "path/filepath" - "testing" - - . "knative.dev/func/pkg/testing" -) - -// TestSignature_Map ensures via spot-checking that the mappings for the -// different method signature constants are correctly associated to their -// string representation, the boolean indicator of instanced, and the -// invocation hint as defined on the function; and this association is -// traversable via the `signature` method. -func TestSignature_Map(t *testing.T) { - instanced := false - invocation := "http" - expectedName := "static-http" - expectedSig := StaticHTTP - - s := signature(instanced, invocation) - if s != expectedSig { - t.Fatal("signature flags incorrectly mapped") - } - if s.String() != expectedName { - t.Fatalf("signature string representation incorrectly mapped. Expected %q got %q", expectedName, s) - } - - // ensure that the default for invocation is http - if signature(true, "") != InstancedHTTP { - t.Fatalf("expected %v, got %v", InstancedHTTP, signature(true, "")) - } -} - -// TestDetector_Go ensures that the go language detector will correctly -// identify the signature to expect of a function's source. -func TestDetector_Go(t *testing.T) { - // NOTE: - // The detector need only check the function's name; not the entire signature - // because invocation hint (http vs cloudevent) is available in the - // function's metadata, and the detector needs to be as simple as possible - // while fulfilling its purpose of detecting which signature is _expected_ - // of the source code, not whether or not it actually does: that's the job - // of the compiler later. This detection is used to determine which - // scaffolding code needs to be written to get the user to a proper - // complile attempt. - tests := []struct { - Name string // Name of the test - Sig Signature // Signature Expected - Err error // Error Expected - Src string // Source code to check - Cfg func(Function) Function // Configure the default function for the test. - }{ - { - Name: "Instanced HTTP", - Sig: InstancedHTTP, - Err: nil, - Src: ` -package f - -func New() { } - `}, - { - Name: "Static HTTP", - Sig: StaticHTTP, - Err: nil, - Src: ` -package f - -func Handle() { } - `}, - { - Name: "Instanced Cloudevent", - Sig: InstancedCloudevent, - Err: nil, - Cfg: func(f Function) Function { - f.Invoke = "cloudevent" // see NOTE above - return f - }, - Src: ` -package f -func New() { } - `}, - { - Name: "Static Cloudevent", - Sig: StaticCloudevent, - Err: nil, - Cfg: func(f Function) Function { - f.Invoke = "cloudevent" // see NOTE above - return f - }, - Src: ` -package f -func Handle() { } - `}, - { - Name: "Static and Instanced - error", - Sig: UnknownSignature, - Err: errors.New("error expected"), // TODO: typed error and err.Is/As - Src: ` -package f -func Handle() { } -func New() { } - `}, - { - Name: "No Signatures Found - error", - Sig: UnknownSignature, - Err: errors.New("error expected"), // TODO: typed error and err.Is/As - Src: ` -package f -// Intentionally Blank - `}, - { - Name: "Comments Ignored", - Sig: StaticHTTP, - Err: nil, - Src: ` -package f -/* -This comment block would cause the function to be detected as instanced -without the use of the language parser. - -func New() - -*/ -func Handle() { } - `}, - } - - for _, test := range tests { - t.Run(test.Name, func(t *testing.T) { - - root, cleanup := Mktemp(t) - defer cleanup() - - f := Function{Runtime: "go", Root: root} - if test.Cfg != nil { - f = test.Cfg(f) - } - - f, err := New().Init(f) - if err != nil { - t.Fatal(err) - } - - // NOTE: if/when the default filename changes from handle.go to - // function.go, this will also have to change - if err := os.WriteFile(filepath.Join(root, "handle.go"), []byte(test.Src), os.ModePerm); err != nil { - t.Fatal(err) - } - - s, err := functionSignature(f) - if err != nil && test.Err == nil { - t.Fatalf("unexpected error. %v", err) - } - - if test.Err != nil { - if err == nil { - t.Fatal("expected error not received") - } else { - t.Logf("received expected error: %v", err) - } - } - - if s != test.Sig { - t.Fatalf("Expected signature '%v', got '%v'", test.Sig, s) - } - }) - } -} diff --git a/pkg/functions/template.go b/pkg/functions/template.go index e33549a844..5ff3829bf8 100644 --- a/pkg/functions/template.go +++ b/pkg/functions/template.go @@ -83,10 +83,10 @@ func (t template) Write(ctx context.Context, f *Function) error { f.Invoke = t.config.Invoke } - isManifest := func(p string) bool { + mask := func(p string) bool { _, f := path.Split(p) return f == templateManifest } - return filesystem.CopyFromFS(".", f.Root, filesystem.NewMaskingFS(isManifest, t.fs)) // copy everything but manifest.yaml + return filesystem.CopyFromFS(".", f.Root, filesystem.NewMaskingFS(mask, t.fs)) // copy everything but manifest.yaml } diff --git a/pkg/functions/templates.go b/pkg/functions/templates.go index e0035fd59a..ace93a83c3 100644 --- a/pkg/functions/templates.go +++ b/pkg/functions/templates.go @@ -2,22 +2,11 @@ package functions import ( "context" - "errors" "strings" "knative.dev/func/pkg/utils" ) -var ( - ErrRepositoryNotFound = errors.New("repository not found") - ErrRepositoriesNotDefined = errors.New("custom template repositories location not specified") - ErrTemplatesNotFound = errors.New("templates path (runtimes) not found") - ErrRuntimeNotFound = errors.New("language runtime not found") - ErrRuntimeRequired = errors.New("language runtime required") - ErrTemplateNotFound = errors.New("template not found") - ErrTemplateMissingRepository = errors.New("template name missing repository prefix") -) - // Templates Manager type Templates struct { client *Client diff --git a/pkg/functions/testdata/testClientRunReadiness/f.go b/pkg/functions/testdata/testClientRunReadiness/f.go new file mode 100644 index 0000000000..42786cc1cd --- /dev/null +++ b/pkg/functions/testdata/testClientRunReadiness/f.go @@ -0,0 +1,30 @@ +package f + +import ( + "context" + "errors" + "fmt" + "net/http" + "time" +) + +type F struct { + Created time.Time +} + +func New() *F { + return &F{time.Now()} +} + +func (f *F) Handle(_ context.Context, w http.ResponseWriter, r *http.Request) { + fmt.Println("Request received") + fmt.Fprintf(w, "Request received\n") +} + +func (f *F) Ready(ctx context.Context) (bool, error) { + // Emulate a function which does not start immediately + if time.Now().After(f.Created.Add(600 * time.Millisecond)) { + return true, nil + } + return false, errors.New("still starting up") +} diff --git a/pkg/functions/testdata/testClientRunReadiness/go.mod b/pkg/functions/testdata/testClientRunReadiness/go.mod new file mode 100644 index 0000000000..8bf168fb8f --- /dev/null +++ b/pkg/functions/testdata/testClientRunReadiness/go.mod @@ -0,0 +1,3 @@ +module function + +go 1.17 diff --git a/pkg/functions/testdata/testClientRunTimeout/f.go b/pkg/functions/testdata/testClientRunTimeout/f.go new file mode 100644 index 0000000000..7fed8a2a2c --- /dev/null +++ b/pkg/functions/testdata/testClientRunTimeout/f.go @@ -0,0 +1,30 @@ +package f + +import ( + "context" + "errors" + "fmt" + "net/http" + "time" +) + +type F struct { + Created time.Time +} + +func New() *F { + return &F{time.Now()} +} + +func (f *F) Handle(_ context.Context, w http.ResponseWriter, r *http.Request) { + fmt.Println("Request received") + fmt.Fprintf(w, "Request received\n") +} + +func (f *F) Ready(ctx context.Context) (bool, error) { + // Emulate a function which takes a few seconds to start up. + if time.Now().After(f.Created.Add(2 * time.Second)) { + return true, nil + } + return false, errors.New("still starting up") +} diff --git a/pkg/functions/testdata/testClientRunTimeout/go.mod b/pkg/functions/testdata/testClientRunTimeout/go.mod new file mode 100644 index 0000000000..8bf168fb8f --- /dev/null +++ b/pkg/functions/testdata/testClientRunTimeout/go.mod @@ -0,0 +1,3 @@ +module function + +go 1.17 diff --git a/pkg/git/git.go b/pkg/git/git.go index 8a6ae36aaf..80fecddeae 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -1,11 +1,16 @@ package git import ( + "context" "fmt" + "net/url" "strconv" "strings" "github.com/openshift-pipelines/pipelines-as-code/pkg/formatting" + + "knative.dev/func/pkg/git/github" + "knative.dev/func/pkg/git/gitlab" ) const ( @@ -16,7 +21,7 @@ const ( type SupportedProviders []string -var SupportedProvidersList = SupportedProviders{GitHubProvider} +var SupportedProvidersList = SupportedProviders{GitHubProvider, GitLabProvider} func (sp SupportedProviders) PrettyString() string { var b strings.Builder @@ -37,7 +42,7 @@ func GitProviderName(url string) (string, error) { case strings.Contains(url, "github"): return GitHubProvider, nil case strings.Contains(url, "gitlab"): - //return GitLabProvider, nil + return GitLabProvider, nil case strings.Contains(url, "bitbucket-cloud"): //return BitBucketProvider, nil } @@ -65,3 +70,43 @@ func RepoOwnerAndNameFromUrl(url string) (string, string, error) { return repoOwner, repoName, nil } + +func CreateWebHook(ctx context.Context, gitRepoURL, webHookTarget, webHookSecret, personalAccessToken string) error { + providerName, err := GitProviderName(gitRepoURL) + if err != nil { + return err + } + + u, err := url.Parse(gitRepoURL) + if err != nil { + return fmt.Errorf("cannot parse git repo url: %w", err) + } + + var cli providerClient + switch providerName { + case GitHubProvider: + cli = github.Client{ + PersonalAccessToken: personalAccessToken, + } + case GitLabProvider: + cli = gitlab.Client{ + BaseURL: u.Scheme + "://" + u.Host, + PersonalAccessToken: personalAccessToken, + } + } + + repoOwner, repoName, err := RepoOwnerAndNameFromUrl(gitRepoURL) + if err != nil { + return err + } + + err = cli.CreateWebHook(ctx, repoOwner, repoName, webHookTarget, webHookSecret) + if err != nil { + return fmt.Errorf("cannot create web hook: %w", err) + } + return nil +} + +type providerClient interface { + CreateWebHook(ctx context.Context, repoOwner, repoName, payloadURL, webhookSecret string) error +} diff --git a/pkg/git/git_test.go b/pkg/git/git_test.go index b0d1d7d81a..1d3848f85a 100644 --- a/pkg/git/git_test.go +++ b/pkg/git/git_test.go @@ -68,14 +68,14 @@ func TestGitProviderName(t *testing.T) { wantErr: false, }, { - name: "GitLab - not supported", - url: "https://gitlab.com/foo/bar", - //wantProvider: GitLabProvider, - wantErr: true, + name: "GitLab", + url: "https://gitlab.com/foo/bar", + wantProvider: GitLabProvider, + wantErr: false, }, { name: "Bitbucket Cloud - not supported", - url: "https://gitlab.com/foo/bar", + url: "https://bitbucket.com/foo/bar", //wantProvider: BitBucketProvider, wantErr: true, }, diff --git a/pkg/git/github/github.go b/pkg/git/github/github.go index a8c8fd097e..687ac7031d 100644 --- a/pkg/git/github/github.go +++ b/pkg/git/github/github.go @@ -10,7 +10,11 @@ import ( "golang.org/x/oauth2" ) -func CreateGitHubWebhook(ctx context.Context, repoOwner, repoName, payloadURL, webhookSecret, personalAccessToken string) error { +type Client struct { + PersonalAccessToken string +} + +func (c Client) CreateWebHook(ctx context.Context, repoOwner, repoName, payloadURL, webhookSecret string) error { hook := &github.Hook{ Name: github.String("web"), Active: github.Bool(true), @@ -27,7 +31,7 @@ func CreateGitHubWebhook(ctx context.Context, repoOwner, repoName, payloadURL, w }, } - ghClient, err := newGHClientByToken(ctx, personalAccessToken, "") + ghClient, err := newGHClientByToken(ctx, c.PersonalAccessToken, "") if err != nil { return err } diff --git a/pkg/git/gitlab/gitlab.go b/pkg/git/gitlab/gitlab.go new file mode 100644 index 0000000000..67853334ad --- /dev/null +++ b/pkg/git/gitlab/gitlab.go @@ -0,0 +1,36 @@ +package gitlab + +import ( + "context" + "fmt" + + "github.com/xanzy/go-gitlab" +) + +type Client struct { + BaseURL string + PersonalAccessToken string +} + +func (c Client) CreateWebHook(ctx context.Context, repoOwner, repoName, payloadURL, webhookSecret string) error { + t := true + f := false + glabCli, err := gitlab.NewClient(c.PersonalAccessToken, + gitlab.WithBaseURL(c.BaseURL), + gitlab.WithRequestOptions(gitlab.WithContext(ctx))) + if err != nil { + return fmt.Errorf("cannot create GitLab client: %w", err) + } + webhook := &gitlab.AddProjectHookOptions{ + EnableSSLVerification: &f, + PushEvents: &t, + Token: &webhookSecret, + URL: &payloadURL, + } + // TODO check if the WebHook already exists. GitLab doesn't name WebHooks so there is never 403. + _, _, err = glabCli.Projects.AddProjectHook(repoOwner+"/"+repoName, webhook) + if err != nil { + return fmt.Errorf("cannot create gitlab webhook: %w", err) + } + return nil +} diff --git a/pkg/http/openshift.go b/pkg/http/openshift.go new file mode 100644 index 0000000000..0d9b5d8939 --- /dev/null +++ b/pkg/http/openshift.go @@ -0,0 +1,38 @@ +package http + +import ( + "context" + "crypto/x509" + "fmt" + "strings" + "sync" + + "knative.dev/func/pkg/k8s" +) + +const openShiftRegistryHost = "image-registry.openshift-image-registry.svc" + +// WithOpenShiftServiceCA enables trust to OpenShift's service CA for internal image registry +func WithOpenShiftServiceCA() Option { + var err error + var ca *x509.Certificate + var o sync.Once + + selectCA := func(ctx context.Context, serverName string) (*x509.Certificate, error) { + if strings.HasPrefix(serverName, openShiftRegistryHost) { + o.Do(func() { + ca, err = k8s.GetOpenShiftServiceCA(ctx) + if err != nil { + err = fmt.Errorf("cannot get CA: %w", err) + } + }) + if err != nil { + return nil, err + } + return ca, nil + } + return nil, nil + } + + return WithSelectCA(selectCA) +} diff --git a/pkg/http/openshift_test.go b/pkg/http/openshift_test.go new file mode 100644 index 0000000000..edc7c3a005 --- /dev/null +++ b/pkg/http/openshift_test.go @@ -0,0 +1,33 @@ +//go:build integration +// +build integration + +package http_test + +import ( + "net/http" + "testing" + + fnhttp "knative.dev/func/pkg/http" + "knative.dev/func/pkg/k8s" +) + +func TestRoundTripper(t *testing.T) { + if !k8s.IsOpenShift() { + t.Skip("The cluster in not an instance of OpenShift.") + return + } + + transport := fnhttp.NewRoundTripper(fnhttp.WithOpenShiftServiceCA()) + defer transport.Close() + + client := http.Client{ + Transport: transport, + } + + resp, err := client.Get("https://image-registry.openshift-image-registry.svc.cluster.local:5000/v2/") + if err != nil { + t.Error(err) + return + } + defer resp.Body.Close() +} diff --git a/pkg/http/transport.go b/pkg/http/transport.go index ff3ca936bf..6424d766e0 100644 --- a/pkg/http/transport.go +++ b/pkg/http/transport.go @@ -56,7 +56,7 @@ func WithInsecureSkipVerify(insecureSkipVerify bool) Option { // This is useful for accessing cluster internal services (pushing a CloudEvent into Knative broker). func NewRoundTripper(opts ...Option) RoundTripCloser { o := options{ - inClusterDialer: k8s.NewLazyInitInClusterDialer(), + inClusterDialer: k8s.NewLazyInitInClusterDialer(k8s.GetClientConfig()), insecureSkipVerify: false, } for _, option := range opts { diff --git a/pkg/k8s/dialer.go b/pkg/k8s/dialer.go index 7dc9a06a45..d45c7386ed 100644 --- a/pkg/k8s/dialer.go +++ b/pkg/k8s/dialer.go @@ -1,13 +1,19 @@ package k8s import ( + "bufio" "bytes" "context" "errors" "fmt" "io" "net" + "os" + "regexp" + "strconv" "sync" + "sync/atomic" + "syscall" "time" coreV1 "k8s.io/api/core/v1" @@ -19,6 +25,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" v1 "k8s.io/client-go/kubernetes/typed/core/v1" restclient "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/remotecommand" ) @@ -42,9 +49,10 @@ var SocatImage = "quay.io/boson/alpine-socat:1.7.4.3-r1-non-root" // var client = http.Client{ // Transport: transport, // } -func NewInClusterDialer(ctx context.Context) (*contextDialer, error) { +func NewInClusterDialer(ctx context.Context, clientConfig clientcmd.ClientConfig) (*contextDialer, error) { c := &contextDialer{ - detachChan: make(chan struct{}), + clientConfig: clientConfig, + detachChan: make(chan struct{}), } err := c.startDialerPod(ctx) if err != nil { @@ -54,11 +62,12 @@ func NewInClusterDialer(ctx context.Context) (*contextDialer, error) { } type contextDialer struct { - coreV1 v1.CoreV1Interface - restConf *restclient.Config - podName string - namespace string - detachChan chan struct{} + coreV1 v1.CoreV1Interface + clientConfig clientcmd.ClientConfig + restConf *restclient.Config + podName string + namespace string + detachChan chan struct{} } func (c *contextDialer) DialContext(ctx context.Context, network string, addr string) (net.Conn, error) { @@ -66,21 +75,108 @@ func (c *contextDialer) DialContext(ctx context.Context, network string, addr st return nil, fmt.Errorf("unsupported network: %q", network) } - execDone := make(chan struct{}) - pr, pw, conn := newConn(execDone) - + ctrStdin, ctrStdout, conn := newConn() + connectSuccess := make(chan struct{}) + connectFailure := make(chan error, 1) go func() { - defer close(execDone) - errOut := bytes.NewBuffer(nil) - err := c.exec(addr, pr, pw, errOut) + stderrBuff := bytes.NewBuffer(nil) + ctrStderr := io.MultiWriter(stderrBuff, detectConnSuccess(connectSuccess)) + + err := c.exec(addr, ctrStdin, ctrStdout, ctrStderr) if err != nil { - err = fmt.Errorf("failed to exec in pod: %w (stderr: %q)", err, errOut.String()) - _ = pr.CloseWithError(err) - _ = pw.CloseWithError(err) + stderrStr := stderrBuff.String() + socatErr := tryParseSocatError(network, addr, stderrStr) + if socatErr != nil { + err = fmt.Errorf("socat error: %w", socatErr) + } else { + err = fmt.Errorf("failed to exec in pod: %w (stderr: %q)", err, stderrStr) + } + } + _ = conn.closeWithError(err) + connectFailure <- err + }() + + select { + case <-connectSuccess: + return conn, nil + case err := <-connectFailure: + return nil, err + case <-ctx.Done(): + _ = conn.closeWithError(ctx.Err()) + return nil, ctx.Err() + } +} + +var connSuccessfulRE = regexp.MustCompile("successfully connected") + +// Creates io.Writer which closes connectSuccess channel when string "successfully connected" is written to it. +func detectConnSuccess(connectSuccess chan struct{}) io.Writer { + pr, pw := io.Pipe() + go func() { + ok := connSuccessfulRE.MatchReader(bufio.NewReader(pr)) + if ok { + close(connectSuccess) } + _, _ = io.Copy(io.Discard, pr) }() + return pw +} - return conn, nil +var ( + connectionRefusedErrorRE = regexp.MustCompile(`E connect\(\d+, AF=\d+ (?P[\[\]0-9.:a-z]+), \d+\): Connection refused`) + nameResolutionErrorRE = regexp.MustCompile(`E getaddrinfo\("(?P[a-zA-z-.0-9]+)",.*\): Name does not resolve`) +) + +// tries to detect common errors from `socat` stderr +func tryParseSocatError(network, address, stderr string) error { + groups := nameResolutionErrorRE.FindStringSubmatch(stderr) + if groups != nil { + var name string + if len(groups) > 1 { + name = groups[1] + } + return &net.OpError{ + Op: "dial", + Net: network, + Source: nil, + Addr: nil, + Err: &net.DNSError{ + Err: "no such host", + Name: name, + IsNotFound: true, + }, + } + } + groups = connectionRefusedErrorRE.FindStringSubmatch(stderr) + if groups != nil { + var ( + addr net.IP + port int + zone string + ) + if len(groups) > 1 { + h, p, err := net.SplitHostPort(groups[1]) + if err == nil { + addr = net.ParseIP(h) + p, _ := strconv.ParseInt(p, 10, 16) + port = int(p) + } + } + return &net.OpError{ + Op: "dial", + Net: network, + Addr: &net.TCPAddr{ + IP: addr, + Port: port, + Zone: zone, + }, + Err: &os.SyscallError{ + Syscall: "connect", + Err: syscall.ECONNREFUSED, + }, + } + } + return nil } func (c *contextDialer) Close() error { @@ -95,8 +191,7 @@ func (c *contextDialer) Close() error { } func (c *contextDialer) startDialerPod(ctx context.Context) (err error) { - cliConf := GetClientConfig() - c.restConf, err = cliConf.ClientConfig() + c.restConf, err = c.clientConfig.ClientConfig() if err != nil { return } @@ -113,7 +208,7 @@ func (c *contextDialer) startDialerPod(ctx context.Context) (err error) { } c.coreV1 = client.CoreV1() - c.namespace, err = GetNamespace("") + c.namespace, _, err = c.clientConfig.Namespace() if err != nil { return } @@ -197,7 +292,7 @@ func (c *contextDialer) exec(hostPort string, in io.Reader, out, errOut io.Write Namespace(c.namespace). SubResource("exec") req.VersionedParams(&coreV1.PodExecOptions{ - Command: []string{"socat", "-", fmt.Sprintf("TCP:%s", hostPort)}, + Command: []string{"socat", "-dd", "-", fmt.Sprintf("TCP:%s", hostPort)}, Container: c.podName, Stdin: true, Stdout: true, @@ -324,58 +419,84 @@ func (a addr) String() string { } type conn struct { - pr *io.PipeReader - pw *io.PipeWriter - execDone <-chan struct{} + pr *io.PipeReader + pw *io.PipeWriter + err atomic.Pointer[error] } -func (c conn) Read(b []byte) (n int, err error) { - return c.pr.Read(b) +func (c *conn) Read(b []byte) (n int, err error) { + n, err = c.pr.Read(b) + if errors.Is(err, io.ErrClosedPipe) { + if p := c.err.Load(); p != nil { + err = *p + } + } + return } -func (c conn) Write(b []byte) (n int, err error) { - return c.pw.Write(b) +func (c *conn) Write(b []byte) (n int, err error) { + n, err = c.pw.Write(b) + if errors.Is(err, io.ErrClosedPipe) { + if p := c.err.Load(); p != nil { + err = *p + } + } + return } -func (c conn) Close() error { - err := c.pw.Close() +func (c *conn) closeWithError(err error) error { + if err == nil { + err = net.ErrClosed + } + + { + e := err + c.err.CompareAndSwap(nil, &e) + } + err = c.pw.CloseWithError(io.EOF) if err != nil { return fmt.Errorf("failed to close writer: %w", err) } - <-c.execDone - err = c.pr.Close() + err = c.pr.CloseWithError(net.ErrClosed) if err != nil { return fmt.Errorf("failed to close reader: %w", err) } return nil } -func (c conn) LocalAddr() net.Addr { +func (c *conn) Close() error { + return c.closeWithError(nil) +} + +func (c *conn) LocalAddr() net.Addr { return addr{} } -func (c conn) RemoteAddr() net.Addr { +func (c *conn) RemoteAddr() net.Addr { return addr{} } -func (c conn) SetDeadline(t time.Time) error { return nil } +func (c *conn) SetDeadline(t time.Time) error { return nil } -func (c conn) SetReadDeadline(t time.Time) error { return nil } +func (c *conn) SetReadDeadline(t time.Time) error { return nil } -func (c conn) SetWriteDeadline(t time.Time) error { return nil } +func (c *conn) SetWriteDeadline(t time.Time) error { return nil } -func newConn(execDone <-chan struct{}) (*io.PipeReader, *io.PipeWriter, conn) { +func newConn() (*io.PipeReader, *io.PipeWriter, *conn) { pr0, pw0 := io.Pipe() pr1, pw1 := io.Pipe() - rwc := conn{pr: pr0, pw: pw1, execDone: execDone} + rwc := &conn{pr: pr0, pw: pw1} return pr1, pw0, rwc } -func NewLazyInitInClusterDialer() *lazyInitInClusterDialer { - return &lazyInitInClusterDialer{} +func NewLazyInitInClusterDialer(clientConfig clientcmd.ClientConfig) *lazyInitInClusterDialer { + return &lazyInitInClusterDialer{ + clientConfig: clientConfig, + } } type lazyInitInClusterDialer struct { + clientConfig clientcmd.ClientConfig contextDialer *contextDialer initErr error o sync.Once @@ -383,7 +504,7 @@ type lazyInitInClusterDialer struct { func (l *lazyInitInClusterDialer) DialContext(ctx context.Context, network string, addr string) (net.Conn, error) { l.o.Do(func() { - l.contextDialer, l.initErr = NewInClusterDialer(ctx) + l.contextDialer, l.initErr = NewInClusterDialer(ctx, l.clientConfig) }) if l.initErr != nil { return nil, l.initErr diff --git a/pkg/k8s/dialer_test.go b/pkg/k8s/dialer_test.go index 157d26e43a..fa7ae92032 100644 --- a/pkg/k8s/dialer_test.go +++ b/pkg/k8s/dialer_test.go @@ -15,11 +15,12 @@ import ( "testing" "time" + appsV1 "k8s.io/api/apps/v1" coreV1 "k8s.io/api/core/v1" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/rand" - + "k8s.io/client-go/kubernetes" "knative.dev/func/pkg/k8s" ) @@ -27,60 +28,83 @@ func TestDialInClusterService(t *testing.T) { var err error var ctx = context.Background() - cliSet, err := k8s.NewKubernetesClientset() + clientConfig := k8s.GetClientConfig() + + rc, err := clientConfig.ClientConfig() if err != nil { t.Fatal(err) } - creatOpts := metaV1.CreateOptions{} - deleteOpts := metaV1.DeleteOptions{} + cliSet, err := kubernetes.NewForConfig(rc) + if err != nil { + t.Fatal(err) + } - testingNS := &coreV1.Namespace{ - ObjectMeta: metaV1.ObjectMeta{ - Name: "dialer-test-ns-" + rand.String(5), - }, - Spec: coreV1.NamespaceSpec{}, + pp := metaV1.DeletePropagationForeground + creatOpts := metaV1.CreateOptions{} + deleteOpts := metaV1.DeleteOptions{ + PropagationPolicy: &pp, } - _, err = cliSet.CoreV1().Namespaces().Create(ctx, testingNS, creatOpts) + testingNS, _, err := clientConfig.Namespace() if err != nil { t.Fatal(err) } - t.Cleanup(func() { - cliSet.CoreV1().Namespaces().Delete(ctx, testingNS.Name, deleteOpts) - }) - t.Log("created namespace: ", testingNS.Name) - nginxPod := &coreV1.Pod{ + rnd := rand.String(5) + one := int32(1) + labels := map[string]string{"app.kubernetes.io/name": "helloworld"} + deployment := &appsV1.Deployment{ ObjectMeta: metaV1.ObjectMeta{ - Name: "dialer-test-pod", - Labels: map[string]string{"app": "dialer-test-app"}, - Annotations: nil, + Name: "helloworld-" + rnd, + Labels: labels, }, - Spec: coreV1.PodSpec{ - Containers: []coreV1.Container{ - { - Name: "dialer-testing-nginx", - Image: "nginx", + Spec: appsV1.DeploymentSpec{ + Replicas: &one, + Selector: &metaV1.LabelSelector{ + MatchLabels: labels, + }, + Template: coreV1.PodTemplateSpec{ + ObjectMeta: metaV1.ObjectMeta{ + Labels: labels, + }, + Spec: coreV1.PodSpec{ + Containers: []coreV1.Container{ + { + Name: "helloworld", + Image: "gcr.io/knative-samples/helloworld-go@sha256:2babda8ec819e24d5a6342095e8f8a25a67b44eb7231ae253ecc2c448632f07e", + Ports: []coreV1.ContainerPort{ + { + Name: "http", + ContainerPort: 8080, + Protocol: coreV1.ProtocolTCP, + }, + }, + Env: []coreV1.EnvVar{ + { + Name: "PORT", + Value: "8080", + }, + }, + }, + }, }, }, - DNSPolicy: coreV1.DNSClusterFirst, - RestartPolicy: coreV1.RestartPolicyNever, }, } - _, err = cliSet.CoreV1().Pods(testingNS.Name).Create(ctx, nginxPod, creatOpts) + _, err = cliSet.AppsV1().Deployments(testingNS).Create(ctx, deployment, creatOpts) if err != nil { t.Fatal(err) } t.Cleanup(func() { - cliSet.CoreV1().Pods(testingNS.Name).Delete(ctx, nginxPod.Name, deleteOpts) + _ = cliSet.AppsV1().Deployments(testingNS).Delete(ctx, deployment.Name, deleteOpts) }) - t.Log("created pod: ", nginxPod.Name) + t.Log("created deployment:", deployment.Name) - nginxService := &coreV1.Service{ + svc := &coreV1.Service{ ObjectMeta: metaV1.ObjectMeta{ - Name: "dialer-test-service", + Name: "helloworld-" + rnd, }, Spec: coreV1.ServiceSpec{ Ports: []coreV1.ServicePort{ @@ -88,28 +112,26 @@ func TestDialInClusterService(t *testing.T) { Name: "http", Protocol: coreV1.ProtocolTCP, Port: 80, - TargetPort: intstr.FromInt(80), + TargetPort: intstr.FromInt(8080), }, }, - Selector: map[string]string{ - "app": "dialer-test-app", - }, + Selector: labels, }, } - nginxService, err = cliSet.CoreV1().Services(testingNS.Name).Create(ctx, nginxService, creatOpts) + svc, err = cliSet.CoreV1().Services(testingNS).Create(ctx, svc, creatOpts) if err != nil { t.Fatal(err) } t.Cleanup(func() { - cliSet.CoreV1().Services(testingNS.Name).Delete(ctx, nginxService.Name, deleteOpts) + _ = cliSet.CoreV1().Services(testingNS).Delete(ctx, svc.Name, deleteOpts) }) - t.Log("created svc: ", nginxService.Name) + t.Log("created svc:", svc.Name) // wait for service to start - time.Sleep(time.Second * 10) + time.Sleep(time.Second * 5) - dialer := k8s.NewLazyInitInClusterDialer() + dialer := k8s.NewLazyInitInClusterDialer(clientConfig) t.Cleanup(func() { dialer.Close() }) @@ -122,7 +144,7 @@ func TestDialInClusterService(t *testing.T) { Transport: transport, } - svcInClusterURL := fmt.Sprintf("http://%s.%s.svc", nginxService.Name, nginxService.Namespace) + svcInClusterURL := fmt.Sprintf("http://%s.%s.svc", svc.Name, svc.Namespace) resp, err := client.Get(svcInClusterURL) if err != nil { t.Fatal(err) @@ -130,7 +152,7 @@ func TestDialInClusterService(t *testing.T) { defer resp.Body.Close() runeReader := bufio.NewReader(resp.Body) - matched, err := regexp.MatchReader("Welcome to nginx!", runeReader) + matched, err := regexp.MatchReader("Hello World!", runeReader) if err != nil { t.Fatal(err) } @@ -160,7 +182,7 @@ func TestDialInClusterService(t *testing.T) { func TestDialUnreachable(t *testing.T) { var ctx = context.Background() - dialer, err := k8s.NewInClusterDialer(ctx) + dialer, err := k8s.NewInClusterDialer(ctx, k8s.GetClientConfig()) if err != nil { t.Fatal(err) } @@ -168,20 +190,21 @@ func TestDialUnreachable(t *testing.T) { dialer.Close() }) - transport := &http.Transport{ - DialContext: dialer.DialContext, + _, err = dialer.DialContext(ctx, "tcp", "does-not.exists.svc:80") + if err == nil { + t.Error("error was expected but got nil") + return } - - var client = http.Client{ - Transport: transport, + if !strings.Contains(err.Error(), "no such host") { + t.Errorf("error %q doesn't contain expected substring: ", err.Error()) } - _, err = client.Get("http://does-not.exists.svc") + _, err = dialer.DialContext(ctx, "tcp", "localhost:80") if err == nil { t.Error("error was expected but got nil") return } - if !strings.Contains(err.Error(), "not resolve") { - t.Errorf("error %q doesn't containe expected sub-string: ", err.Error()) + if !strings.Contains(err.Error(), "connection refused") { + t.Errorf("error %q doesn't contain expected substring: ", err.Error()) } } diff --git a/pkg/k8s/manifestival.go b/pkg/k8s/manifestival.go new file mode 100644 index 0000000000..7909d4f84a --- /dev/null +++ b/pkg/k8s/manifestival.go @@ -0,0 +1,14 @@ +package k8s + +import ( + mfc "github.com/manifestival/client-go-client" + "github.com/manifestival/manifestival" +) + +func GetManifestivalClient() (manifestival.Client, error) { + config, err := GetClientConfig().ClientConfig() + if err != nil { + return nil, err + } + return mfc.NewClient(config) +} diff --git a/pkg/k8s/openshift.go b/pkg/k8s/openshift.go new file mode 100644 index 0000000000..6af64c5407 --- /dev/null +++ b/pkg/k8s/openshift.go @@ -0,0 +1,189 @@ +package k8s + +import ( + "context" + "crypto/x509" + "encoding/pem" + "errors" + "sync" + "time" + + v1 "k8s.io/api/core/v1" + k8sErrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/util/rand" + + "knative.dev/func/pkg/docker" + "knative.dev/func/pkg/docker/creds" + fn "knative.dev/func/pkg/functions" +) + +const ( + openShiftRegistryHost = "image-registry.openshift-image-registry.svc" + openShiftRegistryHostPort = openShiftRegistryHost + ":5000" +) + +func GetOpenShiftServiceCA(ctx context.Context) (*x509.Certificate, error) { + client, ns, err := NewClientAndResolvedNamespace("") + if err != nil { + return nil, err + } + + cfgMapName := "service-ca-config-" + rand.String(5) + + cfgMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: cfgMapName, + Annotations: map[string]string{"service.beta.openshift.io/inject-cabundle": "true"}, + }, + } + + configMaps := client.CoreV1().ConfigMaps(ns) + + nameSelector := fields.OneTermEqualSelector("metadata.name", cfgMapName).String() + listOpts := metav1.ListOptions{ + Watch: true, + FieldSelector: nameSelector, + } + + watch, err := configMaps.Watch(ctx, listOpts) + if err != nil { + return nil, err + } + defer watch.Stop() + + crtChan := make(chan string) + go func() { + for event := range watch.ResultChan() { + cm, ok := event.Object.(*v1.ConfigMap) + if !ok { + continue + } + if crt, ok := cm.Data["service-ca.crt"]; ok { + crtChan <- crt + close(crtChan) + break + } + } + }() + + _, err = configMaps.Create(ctx, cfgMap, metav1.CreateOptions{}) + if err != nil { + return nil, err + } + defer func() { + _ = configMaps.Delete(ctx, cfgMapName, metav1.DeleteOptions{}) + }() + + select { + case crt := <-crtChan: + blk, _ := pem.Decode([]byte(crt)) + return x509.ParseCertificate(blk.Bytes) + case <-time.After(time.Second * 5): + return nil, errors.New("failed to get OpenShift's service CA in time") + } +} + +func GetDefaultOpenShiftRegistry() string { + ns, _ := GetNamespace("") + if ns == "" { + ns = "default" + } + + return openShiftRegistryHostPort + "/" + ns +} + +func GetOpenShiftDockerCredentialLoaders() []creds.CredentialsCallback { + conf := GetClientConfig() + + rawConf, err := conf.RawConfig() + if err != nil { + return nil + } + + cc, ok := rawConf.Contexts[rawConf.CurrentContext] + if !ok { + return nil + } + var credentials docker.Credentials + + if authInfo := rawConf.AuthInfos[cc.AuthInfo]; authInfo != nil { + credentials.Username = "openshift" + credentials.Password = authInfo.Token + } + + return []creds.CredentialsCallback{ + func(registry string) (docker.Credentials, error) { + if registry == openShiftRegistryHostPort { + return credentials, nil + } + return docker.Credentials{}, creds.ErrCredentialsNotFound + }, + } + +} + +var isOpenShift bool +var checkOpenShiftOnce sync.Once + +func IsOpenShift() bool { + checkOpenShiftOnce.Do(func() { + isOpenShift = false + client, err := NewKubernetesClientset() + if err != nil { + return + } + _, err = client.CoreV1().Services("openshift-image-registry").Get(context.TODO(), "image-registry", metav1.GetOptions{}) + if err == nil || k8sErrors.IsForbidden(err) { + isOpenShift = true + return + } + }) + return isOpenShift +} + +const ( + annotationOpenShiftVcsUri = "app.openshift.io/vcs-uri" + annotationOpenShiftVcsRef = "app.openshift.io/vcs-ref" + + labelAppK8sInstance = "app.kubernetes.io/instance" + labelOpenShiftRuntime = "app.openshift.io/runtime" +) + +var iconValuesForRuntimes = map[string]string{ + "go": "golang", + "node": "nodejs", + "python": "python", + "quarkus": "quarkus", + "springboot": "spring-boot", +} + +type OpenshiftMetadataDecorator struct{} + +func (o OpenshiftMetadataDecorator) UpdateAnnotations(f fn.Function, annotations map[string]string) map[string]string { + if annotations == nil { + annotations = map[string]string{} + } + annotations[annotationOpenShiftVcsUri] = f.Build.Git.URL + annotations[annotationOpenShiftVcsRef] = f.Build.Git.Revision + + return annotations +} + +func (o OpenshiftMetadataDecorator) UpdateLabels(f fn.Function, labels map[string]string) map[string]string { + if labels == nil { + labels = map[string]string{} + } + + // this label is used for referencing a Tekton Pipeline and deployed KService + labels[labelAppK8sInstance] = f.Name + + // if supported, set the label representing a runtime icon in Developer Console + iconValue, ok := iconValuesForRuntimes[f.Runtime] + if ok { + labels[labelOpenShiftRuntime] = iconValue + } + + return labels +} diff --git a/pkg/k8s/persistent_volumes_test.go b/pkg/k8s/persistent_volumes_test.go index 98a57ce8ff..c8012fbf9b 100644 --- a/pkg/k8s/persistent_volumes_test.go +++ b/pkg/k8s/persistent_volumes_test.go @@ -17,7 +17,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/util/rand" - "knative.dev/func/pkg/k8s" ) @@ -26,30 +25,13 @@ func TestUploadToVolume(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute*5) t.Cleanup(cancel) - cliSet, err := k8s.NewKubernetesClientset() + cliSet, testingNS, err := k8s.NewClientAndResolvedNamespace("") if err != nil { t.Fatal(err) } - testingNS := "volume-uploader-test-ns-" + rand.String(5) - - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: testingNS, - }, - Spec: corev1.NamespaceSpec{}, - } - - _, err = cliSet.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{}) - if err != nil { - t.Fatal(err) - } - t.Cleanup(func() { - cliSet.CoreV1().Namespaces().Delete(ctx, testingNS, metav1.DeleteOptions{}) - }) - t.Log("created namespace: ", testingNS) - - testingPVCName := "testing-pvc" + rnd := rand.String(5) + testingPVCName := "testing-pvc-" + rnd err = k8s.CreatePersistentVolumeClaim(ctx, testingPVCName, testingNS, nil, nil, @@ -57,6 +39,13 @@ func TestUploadToVolume(t *testing.T) { if err != nil { t.Fatal(err) } + t.Cleanup(func() { + pp := metav1.DeletePropagationBackground + delOpts := metav1.DeleteOptions{ + PropagationPolicy: &pp, + } + _ = cliSet.CoreV1().PersistentVolumeClaims(testingNS).Delete(ctx, testingPVCName, delOpts) + }) t.Log("created PVC: " + testingPVCName) // First, test error handling by uploading empty content stream. @@ -76,7 +65,7 @@ func TestUploadToVolume(t *testing.T) { t.Fatal(err) } - testingPodName := "testing-pod" + testingPodName := "testing-pod-" + rnd pod := &corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ @@ -113,6 +102,9 @@ func TestUploadToVolume(t *testing.T) { if err != nil { t.Fatal(err) } + t.Cleanup(func() { + _ = cliSet.CoreV1().Pods(testingNS).Delete(ctx, testingPodName, metav1.DeleteOptions{}) + }) t.Log("created pod: " + testingPodName) nameSelector := fields.OneTermEqualSelector("metadata.name", testingPodName).String() diff --git a/pkg/k8s/security_context.go b/pkg/k8s/security_context.go index 7d2fd569a2..ac49e967eb 100644 --- a/pkg/k8s/security_context.go +++ b/pkg/k8s/security_context.go @@ -10,6 +10,9 @@ var oneTwentyFour = semver.MustParse("1.24") func defaultPodSecurityContext() *corev1.PodSecurityContext { // change ownership of the mounted volume to the first non-root user uid=1000 + if IsOpenShift() { + return nil + } runAsUser := int64(1000) runAsGroup := int64(1000) return &corev1.PodSecurityContext{ diff --git a/pkg/k8s/serviceaccount.go b/pkg/k8s/serviceaccount.go new file mode 100644 index 0000000000..8180cae270 --- /dev/null +++ b/pkg/k8s/serviceaccount.go @@ -0,0 +1,19 @@ +package k8s + +import ( + "context" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func GetServiceAccount(ctx context.Context, referencedServiceAccount, namespace string) error { + k8sClient, err := NewKubernetesClientset() + if err != nil { + return err + } + _, err = k8sClient.CoreV1().ServiceAccounts(namespace).Get(ctx, referencedServiceAccount, metav1.GetOptions{}) + if err != nil { + return err + } + return nil +} diff --git a/pkg/knative/deployer.go b/pkg/knative/deployer.go index 9c1aafe183..67ea7a364b 100644 --- a/pkg/knative/deployer.go +++ b/pkg/knative/deployer.go @@ -155,7 +155,7 @@ func (d *Deployer) Deploy(ctx context.Context, f fn.Function) (fn.DeploymentResu return fn.DeploymentResult{}, err } - err = checkResourcesArePresent(ctx, d.Namespace, &referencedSecrets, &referencedConfigMaps, &referencedPVCs) + err = checkResourcesArePresent(ctx, d.Namespace, &referencedSecrets, &referencedConfigMaps, &referencedPVCs, f.Deploy.ServiceAccountName) if err != nil { err = fmt.Errorf("knative deployer failed to generate the Knative Service: %v", err) return fn.DeploymentResult{}, err @@ -252,7 +252,7 @@ func (d *Deployer) Deploy(ctx context.Context, f fn.Function) (fn.DeploymentResu return fn.DeploymentResult{}, err } - err = checkResourcesArePresent(ctx, d.Namespace, &referencedSecrets, &referencedConfigMaps, &referencedPVCs) + err = checkResourcesArePresent(ctx, d.Namespace, &referencedSecrets, &referencedConfigMaps, &referencedPVCs, f.Deploy.ServiceAccountName) if err != nil { err = fmt.Errorf("knative deployer failed to update the Knative Service: %v", err) return fn.DeploymentResult{}, err @@ -316,8 +316,23 @@ func setHealthEndpoints(f fn.Function, c *corev1.Container) *corev1.Container { } func generateNewService(f fn.Function, decorator DeployDecorator) (*v1.Service, error) { + // set defaults to the values that avoid the following warning "Kubernetes default value is insecure, Knative may default this to secure in a future release" + runAsNonRoot := true + allowPrivilegeEscalation := false + capabilities := corev1.Capabilities{ + Drop: []corev1.Capability{"ALL"}, + } + seccompProfile := corev1.SeccompProfile{ + Type: corev1.SeccompProfileType("RuntimeDefault"), + } container := corev1.Container{ Image: f.ImageWithDigest(), + SecurityContext: &corev1.SecurityContext{ + RunAsNonRoot: &runAsNonRoot, + AllowPrivilegeEscalation: &allowPrivilegeEscalation, + Capabilities: &capabilities, + SeccompProfile: &seccompProfile, + }, } setHealthEndpoints(f, &container) @@ -370,7 +385,8 @@ func generateNewService(f fn.Function, decorator DeployDecorator) (*v1.Service, Containers: []corev1.Container{ container, }, - Volumes: newVolumes, + ServiceAccountName: f.Deploy.ServiceAccountName, + Volumes: newVolumes, }, }, }, @@ -509,7 +525,7 @@ func updateService(f fn.Function, previousService *v1.Service, newEnv []corev1.E cp.EnvFrom = newEnvFrom cp.VolumeMounts = newVolumeMounts service.Spec.ConfigurationSpec.Template.Spec.Volumes = newVolumes - + service.Spec.ConfigurationSpec.Template.Spec.PodSpec.ServiceAccountName = f.Deploy.ServiceAccountName return service, nil } } @@ -528,6 +544,8 @@ func updateService(f fn.Function, previousService *v1.Service, newEnv []corev1.E // - value: {{ configMap:configMapName }} # all key-pair values from ConfigMap are set as ENV func processEnvs(envs []fn.Env, referencedSecrets, referencedConfigMaps *sets.String) ([]corev1.EnvVar, []corev1.EnvFromSource, error) { + envs = withOpenAddress(envs) // prepends ADDRESS=0.0.0.0 if not extant + envVars := []corev1.EnvVar{{Name: "BUILT", Value: time.Now().Format("20060102T150405")}} envFrom := []corev1.EnvFromSource{} @@ -574,6 +592,45 @@ func processEnvs(envs []fn.Env, referencedSecrets, referencedConfigMaps *sets.St return envVars, envFrom, nil } +// withOpenAddresss prepends ADDRESS=0.0.0.0 to the envs if not present. +// +// This is combined with the value of PORT at runtime to determine the full +// Listener address on which a Function will listen tcp requests. +// +// Runtimes should, by default, only listen on the loopback interface by +// default, as they may be `func run` locally, for security purposes. +// This environment vriable instructs the runtimes to listen on all interfaces +// by default when actually being deployed, since they will need to actually +// listen for client requests and for health readiness/liveness probes. +// +// Should a user wish to securely open their function to only receive requests +// on a specific interface, such as a WireGuar-encrypted mesh network which +// presents as a specific interface, that can be achieved by setting the +// ADDRESS value as an environment variable on their function to the interface +// on which to listen. +// +// NOTE this env is currently only respected by scaffolded Go functions, because +// they are the only ones which support being `func run` locally. Other +// runtimes will respect the value as they are updated to support scaffolding. +func withOpenAddress(ee []fn.Env) []fn.Env { + // TODO: this is unnecessarily complex due to both key and value of the + // envs slice being being pointers. There is an outstanding tech-debt item + // to remove pointers from Function Envs, Volumes, Labels, and Options. + var found bool + for _, e := range ee { + if e.Name != nil && *e.Name == "ADDRESS" { + found = true + break + } + } + if !found { + k := "ADDRESS" + v := "0.0.0.0" + ee = append(ee, fn.Env{Name: &k, Value: &v}) + } + return ee +} + func createEnvFromSource(value string, referencedSecrets, referencedConfigMaps *sets.String) (*corev1.EnvFromSource, error) { slices := strings.Split(strings.Trim(value, "{} "), ":") if len(slices) != 2 { @@ -814,7 +871,7 @@ func processVolumes(volumes []fn.Volume, referencedSecrets, referencedConfigMaps // checkResourcesArePresent returns error if Secrets or ConfigMaps // referenced in input sets are not deployed on the cluster in the specified namespace -func checkResourcesArePresent(ctx context.Context, namespace string, referencedSecrets, referencedConfigMaps, referencedPVCs *sets.String) error { +func checkResourcesArePresent(ctx context.Context, namespace string, referencedSecrets, referencedConfigMaps, referencedPVCs *sets.String, referencedServiceAccount string) error { errMsg := "" for s := range *referencedSecrets { @@ -838,6 +895,14 @@ func checkResourcesArePresent(ctx context.Context, namespace string, referencedS } } + // check if referenced ServiceAccount is present in the namespace if it is not default + if referencedServiceAccount != "" && referencedServiceAccount != "default" { + err := k8s.GetServiceAccount(ctx, referencedServiceAccount, namespace) + if err != nil { + errMsg += fmt.Sprintf(" referenced ServiceAccount \"%s\" is not present in namespace \"%s\"\n", referencedServiceAccount, namespace) + } + } + if errMsg != "" { return fmt.Errorf("\n" + errMsg) } diff --git a/pkg/mock/builder.go b/pkg/mock/builder.go index 22baa9d562..1163a4a4da 100644 --- a/pkg/mock/builder.go +++ b/pkg/mock/builder.go @@ -17,7 +17,7 @@ func NewBuilder() *Builder { } } -func (i *Builder) Build(ctx context.Context, f fn.Function) error { +func (i *Builder) Build(ctx context.Context, f fn.Function, _ []fn.Platform) error { i.BuildInvoked = true return i.BuildFn(f) } diff --git a/pkg/mock/runner.go b/pkg/mock/runner.go index de31c5595e..6f205e5b84 100644 --- a/pkg/mock/runner.go +++ b/pkg/mock/runner.go @@ -3,6 +3,7 @@ package mock import ( "context" "sync" + "time" fn "knative.dev/func/pkg/functions" ) @@ -12,25 +13,25 @@ import ( type Runner struct { RunInvoked bool RootRequested string - RunFn func(context.Context, fn.Function) (*fn.Job, error) + RunFn func(context.Context, fn.Function, time.Duration) (*fn.Job, error) sync.Mutex } func NewRunner() *Runner { return &Runner{ - RunFn: func(ctx context.Context, f fn.Function) (*fn.Job, error) { + RunFn: func(ctx context.Context, f fn.Function, t time.Duration) (*fn.Job, error) { errs := make(chan error, 1) stop := func() error { return nil } - return fn.NewJob(f, "8080", errs, stop, false) + return fn.NewJob(f, "127.0.0.1", "8080", errs, stop, false) }, } } -func (r *Runner) Run(ctx context.Context, f fn.Function) (*fn.Job, error) { +func (r *Runner) Run(ctx context.Context, f fn.Function, t time.Duration) (*fn.Job, error) { r.Lock() defer r.Unlock() r.RunInvoked = true r.RootRequested = f.Root - return r.RunFn(ctx, f) + return r.RunFn(ctx, f, t) } diff --git a/pkg/oci/builder.go b/pkg/oci/builder.go index e82e5d935a..de7f55ac30 100644 --- a/pkg/oci/builder.go +++ b/pkg/oci/builder.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "path/filepath" + "runtime" "strconv" "syscall" "time" @@ -12,23 +13,11 @@ import ( v1 "github.com/google/go-containerregistry/pkg/v1" fn "knative.dev/func/pkg/functions" + "knative.dev/func/pkg/scaffolding" ) var path = filepath.Join -// TODO: This may no longer be necessary, delete if e2e and acceptance tests -// succeed: -// const DefaultName = builders.Host - -var defaultPlatforms = []v1.Platform{ - {OS: "linux", Architecture: "amd64"}, - {OS: "linux", Architecture: "arm64"}, - // {OS: "linux", Architecture: "arm", Variant: "v6"}, - {OS: "linux", Architecture: "arm", Variant: "v7"}, - {OS: "darwin", Architecture: "amd64"}, - {OS: "darwin", Architecture: "arm64"}, -} - var defaultIgnored = []string{ // TODO: implement and use .funcignore ".git", ".func", @@ -36,25 +25,39 @@ var defaultIgnored = []string{ // TODO: implement and use .funcignore ".gitignore", } -// BuildErr indicates a build error occurred. -type BuildErr struct { - Err error -} - -func (e BuildErr) Error() string { - return fmt.Sprintf("error performing host build. %v", e.Err) -} - // Builder which creates an OCI-compliant multi-arch (index) container from // the function at path. type Builder struct { name string verbose bool + + onDone func() // optionally provide a function to be notified on done + buildFn languageLayerBuilder // optionally provide a custom build impl } // NewBuilder creates a builder instance. func NewBuilder(name string, verbose bool) *Builder { - return &Builder{name, verbose} + return &Builder{name, verbose, nil, nil} +} + +func newBuildConfig(ctx context.Context, b *Builder, f fn.Function, platforms []fn.Platform) *buildConfig { + c := &buildConfig{ + ctx, + b.name, + f, + time.Now(), + b.verbose, + "", + toPlatforms(platforms), + b.onDone, + b.buildFn, + } + // If the client did not specifically request a certain set of platforms, + // use the func core defined set of suggested defaults. + if len(platforms) == 0 { + c.platforms = toPlatforms(fn.DefaultPlatforms) + } + return c } // Build an OCI-compliant Mult-arch (v1.ImageIndex) container on disk @@ -65,53 +68,58 @@ func NewBuilder(name string, verbose bool) *Builder { // Updates a symlink to this directory at: // // .func/builds/last -func (b *Builder) Build(ctx context.Context, f fn.Function) (err error) { - cfg := &buildConfig{ctx, f, time.Now(), b.verbose, ""} +func (b *Builder) Build(ctx context.Context, f fn.Function, pp []fn.Platform) (err error) { + cfg := newBuildConfig(ctx, b, f, pp) - if err = setup(cfg); err != nil { // create directories and links + if err = setup(cfg); err != nil { return } defer teardown(cfg) - //TODO: Use scaffold package when merged: - /* - if err = scaffolding.Scaffold(ctx, f, cfg.buildDir()); err != nil { - return - } - */ - // IN the meantime, use an airball mainfile - data := ` -package main - -import "fmt" + // Load the embedded repository + repo, err := fn.NewRepository("", "") + if err != nil { + return + } -func main () { - fmt.Println("Hello, world!") -} -` - if err = os.WriteFile(path(cfg.buildDir(), "main.go"), []byte(data), 0664); err != nil { + // Write out the scaffolding + err = scaffolding.Write(cfg.buildDir(), f.Root, f.Runtime, f.Invoke, repo.FS()) + if err != nil { return } + // Create an OCI container from the scaffolded function if err = containerize(cfg); err != nil { return } - return updateLastLink(cfg) + + if err = updateLastLink(cfg); err != nil { + return + } // TODO: communicating build completeness throgh returning without error // relies on the implicit availability of the OIC image in this process' // build directory. Would be better to have a formal build result object // which includes a general struct which can be used by all builders to // communicate to the pusher where the image can be found. + // Tests, however, can use a simple channel: + if cfg.onDone != nil { + cfg.onDone() + } + return } // buildConfig contains various settings for a single build type buildConfig struct { - ctx context.Context // build context - f fn.Function // Function being built - t time.Time // Timestamp for this build - verbose bool // verbose logging - h string // hash cache (use .hash() accessor) + ctx context.Context // build context + name string + f fn.Function // Function being built + t time.Time // Timestamp for this build + verbose bool // verbose logging + h string // hash cache (use .hash() accessor) + platforms []v1.Platform + onDone func() // optionally provide a function to be notified on done + buildFn languageLayerBuilder // optionally provide a custom build impl } func (c *buildConfig) hash() string { @@ -147,17 +155,20 @@ func (c *buildConfig) blobsDir() string { return path(c.f.Root, fn.RunDataDir, "builds", "by-hash", c.hash(), "oci", "blobs", "sha256") } -// setup errors if there already exists a build directory. Otherwise, it -// creates a build directory based on the function's hash, and creates -// a link to this build directory for the current pid to denote the build -// is in progress. func setup(cfg *buildConfig) (err error) { - // error if already in progress if isActive(cfg, cfg.buildDir()) { - return BuildErr{fmt.Errorf("Build directory already exists for this version hash and is associated with an active PID. Is a build already in progress? %v", cfg.buildDir())} + return ErrBuildInProgress{cfg.buildDir()} } - // create build files directory + // create build directory, recreating if it already existed + if _, err = os.Stat(cfg.buildDir()); !os.IsNotExist(err) { + if cfg.verbose { + fmt.Printf("rm -rf %v\n", cfg.buildDir()) + } + if err = os.RemoveAll(cfg.buildDir()); err != nil { + return + } + } if cfg.verbose { fmt.Printf("mkdir -p %v\n", cfg.buildDir()) } @@ -184,10 +195,6 @@ func setup(cfg *buildConfig) (err error) { } func teardown(cfg *buildConfig) { - // remove the pid link for the current process indicating the build is - // no longer in progress. - _ = os.RemoveAll(cfg.pidLink()) - // remove pid links for processes which no longer exist. dd, _ := os.ReadDir(cfg.pidsDir()) for _, d := range dd { @@ -229,6 +236,9 @@ func processExists(pid string) bool { if err != nil { return false } + if runtime.GOOS == "windows" { + return true + } err = process.Signal(syscall.Signal(0)) return err == nil } @@ -270,5 +280,27 @@ func updateLastLink(cfg *buildConfig) error { fmt.Printf("ln -s %v %v\n", cfg.buildDir(), cfg.lastLink()) } _ = os.RemoveAll(cfg.lastLink()) - return os.Symlink(cfg.buildDir(), cfg.lastLink()) + rp, err := filepath.Rel(filepath.Dir(cfg.lastLink()), cfg.buildDir()) + if err != nil { + return err + } + return os.Symlink(rp, cfg.lastLink()) +} + +// toPlatforms converts func's implementation-agnostic Platform struct +// into to the OCI builder's implementation-specific go-containerregistry v1 +// palatform. +// Examples: +// {OS: "linux", Architecture: "amd64"}, +// {OS: "linux", Architecture: "arm64"}, +// {OS: "linux", Architecture: "arm", Variant: "v6"}, +// {OS: "linux", Architecture: "arm", Variant: "v7"}, +// {OS: "darwin", Architecture: "amd64"}, +// {OS: "darwin", Architecture: "arm64"}, +func toPlatforms(pp []fn.Platform) []v1.Platform { + platforms := make([]v1.Platform, len(pp)) + for i, p := range pp { + platforms[i] = v1.Platform{OS: p.OS, Architecture: p.Architecture, Variant: p.Variant} + } + return platforms } diff --git a/pkg/oci/builder_test.go b/pkg/oci/builder_test.go index 806b3d83c4..eb4086fc9b 100644 --- a/pkg/oci/builder_test.go +++ b/pkg/oci/builder_test.go @@ -1,23 +1,37 @@ package oci import ( + "archive/tar" + "compress/gzip" "context" "encoding/json" + "errors" + "fmt" + "io" + "io/fs" "os" "path/filepath" + "runtime" + "sort" + "strings" + "sync" "testing" + "github.com/google/go-cmp/cmp" + v1 "github.com/google/go-containerregistry/pkg/v1" fn "knative.dev/func/pkg/functions" . "knative.dev/func/pkg/testing" ) -// TestBuilder ensures that, when given a Go Function, an OCI-compliant +var TestPlatforms = []fn.Platform{{OS: runtime.GOOS, Architecture: runtime.GOARCH}} + +// TestBuilder_Build ensures that, when given a Go Function, an OCI-compliant // directory structure is created on .Build in the expected path. -func TestBuilder(t *testing.T) { +func TestBuilder_Build(t *testing.T) { root, done := Mktemp(t) defer done() - client := fn.New() + client := fn.New(fn.WithVerbose(true)) f, err := client.Init(fn.Function{Root: root, Runtime: "go"}) if err != nil { @@ -26,7 +40,7 @@ func TestBuilder(t *testing.T) { builder := NewBuilder("", true) - if err := builder.Build(context.Background(), f); err != nil { + if err := builder.Build(context.Background(), f, TestPlatforms); err != nil { t.Fatal(err) } @@ -35,6 +49,88 @@ func TestBuilder(t *testing.T) { validateOCI(last, t) } +// TestBuilder_Concurrency +func TestBuilder_Concurrency(t *testing.T) { + root, done := Mktemp(t) + defer done() + + client := fn.New() + + // Initialize a new Go Function + f, err := client.Init(fn.Function{Root: root, Runtime: "go"}) + if err != nil { + t.Fatal(err) + } + + // Concurrency + // + // The first builder is setup to use a mock implementation of the + // builder function which will block until released after first notifying + // that it has been paused. + // + // When the test receives the message that the builder has been paused, it + // starts a second, concurrently executing builder to ensure there is a + // typed error returned indicating a build is in progress. + // + // When the second builder completes, having confirmed the error message + // received is as expected. It signals the first (blocked) builder that it + // can now continue. + + // Thet test waits until the first builder notifies that it is done, and + // has therefore ran its tests as well. + + var ( + pausedCh = make(chan bool) + continueCh = make(chan bool) + wg sync.WaitGroup + ) + + // Build A + builder1 := NewBuilder("builder1", true) + builder1.buildFn = func(cfg *buildConfig, p v1.Platform) (d v1.Descriptor, l v1.Layer, err error) { + if isFirstBuild(cfg, p) { + pausedCh <- true // Notify of being paused + <-continueCh // Block until released + } + return + } + wg.Add(1) + go func() { + defer wg.Done() + if err := builder1.Build(context.Background(), f, TestPlatforms); err != nil { + t.Errorf("test build error: %v", err) + } + }() + + // Wait until build 1 indicates it is paused + <-pausedCh + + // Build B + builder2 := NewBuilder("builder2", true) + builder2.buildFn = func(config *buildConfig, platform v1.Platform) (v1.Descriptor, v1.Layer, error) { + return v1.Descriptor{}, nil, fmt.Errorf("the buildFn should not have been invoked") + } + wg.Add(1) + go func() { + defer wg.Done() + err = builder2.Build(context.Background(), f, TestPlatforms) + if !errors.As(err, &ErrBuildInProgress{}) { + t.Errorf("test build error: %v", err) + } + }() + + // Release the blocking Build A and wait until complete. + continueCh <- true + wg.Wait() +} + +func isFirstBuild(cfg *buildConfig, current v1.Platform) bool { + first := cfg.platforms[0] + return current.OS == first.OS && + current.Architecture == first.Architecture && + current.Variant == first.Variant +} + // ImageIndex represents the structure of an OCI Image Index. type ImageIndex struct { SchemaVersion int `json:"schemaVersion"` @@ -88,8 +184,82 @@ func validateOCI(path string, t *testing.T) { t.Fatalf("invalid schema version, expected 2, got %d", imageIndex.SchemaVersion) } - // Additional validation of the Image Index structure can be added here - // extract. for example checking that the path includes the README.md - // and one of the binaries in the exact location expected (the data layer - // blob and exec layer blob, respectively) + if len(imageIndex.Manifests) < 1 { + t.Fatal("fewer manifests") + } + + digest := strings.TrimPrefix(imageIndex.Manifests[0].Digest, "sha256:") + manifestFile := filepath.Join(path, "blobs", "sha256", digest) + manifestFileData, err := os.ReadFile(manifestFile) + if err != nil { + t.Fatal(err) + } + mf := struct { + Layers []struct { + Digest string `json:"digest"` + } `json:"layers"` + }{} + err = json.Unmarshal(manifestFileData, &mf) + if err != nil { + t.Fatal(err) + } + + type fileInfo struct { + Path string + Type fs.FileMode + Executable bool + } + var files []fileInfo + + for _, layer := range mf.Layers { + func() { + digest = strings.TrimPrefix(layer.Digest, "sha256:") + f, err := os.Open(filepath.Join(path, "blobs", "sha256", digest)) + if err != nil { + t.Fatal(err) + } + defer f.Close() + + gr, err := gzip.NewReader(f) + if err != nil { + t.Fatal(err) + } + defer gr.Close() + + tr := tar.NewReader(gr) + for { + hdr, err := tr.Next() + if err != nil { + if errors.Is(err, io.EOF) { + break + } + t.Fatal(err) + } + files = append(files, fileInfo{ + Path: hdr.Name, + Type: hdr.FileInfo().Mode() & fs.ModeType, + Executable: (hdr.FileInfo().Mode()&0111 == 0111) && !hdr.FileInfo().IsDir(), + }) + } + }() + } + sort.Slice(files, func(i, j int) bool { + return files[i].Path < files[j].Path + }) + + expectedFiles := []fileInfo{ + {Path: "/etc/pki/tls/certs/ca-certificates.crt"}, + {Path: "/etc/ssl/certs/ca-certificates.crt"}, + {Path: "/func", Type: fs.ModeDir}, + {Path: "/func/README.md"}, + {Path: "/func/f", Executable: true}, + {Path: "/func/func.yaml"}, + {Path: "/func/go.mod"}, + {Path: "/func/handle.go"}, + {Path: "/func/handle_test.go"}, + } + + if diff := cmp.Diff(expectedFiles, files); diff != "" { + t.Error("files in oci differ from expectation (-want, +got):", diff) + } } diff --git a/pkg/oci/containerize.go b/pkg/oci/containerize.go index 0306c82f85..abe6f13aab 100644 --- a/pkg/oci/containerize.go +++ b/pkg/oci/containerize.go @@ -4,10 +4,10 @@ import ( "archive/tar" "compress/gzip" "encoding/json" - "errors" "fmt" "io" "os" + slashpath "path" "path/filepath" "strings" @@ -19,27 +19,30 @@ import ( // languageLayerBuilder builds the layer for the given language whuch may // be different from one platform to another. For example, this is the // layer in the image which contains the Go cross-compiled binary. -type languageLayerBuilder interface { - Build(*buildConfig, v1.Platform) (v1.Descriptor, v1.Layer, error) +type languageLayerBuilder func(*buildConfig, v1.Platform) (v1.Descriptor, v1.Layer, error) + +var languageLayerBuilders = map[string]languageLayerBuilder{ + "go": buildGoLayer, + "python": layerBuilderNotImplemented, + "node": layerBuilderNotImplemented, + "rust": layerBuilderNotImplemented, } -func newLanguageLayerBuilder(cfg *buildConfig) (l languageLayerBuilder, err error) { - switch cfg.f.Runtime { - case "go": - l = goLayerBuilder{} - case "python": - // Likely the next to be supported after Go - err = errors.New("functions written in Python are not yet supported by the host builder") - case "node": - // Likely the next to be supported after Python - err = errors.New("functions written in Node are not yet supported by the host builder") - case "rust": - // Likely the next to be supprted after Node - err = errors.New("functions written in Rust are not yet supported by the host builder") - default: - // Others are not likely to be supported in the near future without - // increased contributions. +func layerBuilderNotImplemented(cfg *buildConfig, _ v1.Platform) (d v1.Descriptor, l v1.Layer, err error) { + err = fmt.Errorf("%v functions are not yet supported by the host builder", cfg.f.Runtime) + return +} + +func getLanguageLayerBuilder(cfg *buildConfig) (l languageLayerBuilder, err error) { + // use the custom implementation, if provided + if cfg.buildFn != nil { + return cfg.buildFn, nil + } + // otherwise lookup the build function + l, ok := languageLayerBuilders[cfg.f.Runtime] + if !ok { err = fmt.Errorf("the language runtime '%v' is not a recognized language by the host builder", cfg.f.Runtime) + return } return } @@ -65,21 +68,17 @@ func containerize(cfg *buildConfig) (err error) { return } - // TODO: if the base image is not provided, create a certificates layer - // which includes root certificates such that the resultant container - // can validate SSL (make HTTPS requests) - /* - certsDesc, certsLayer, err := newCerts(cfg) // shared - if err != nil { - return - } - */ + // Create the root certificates layer and its decriptor + certsDesc, certsLayer, err := newCertsLayer(cfg) // shared + if err != nil { + return + } - // Create an image for each platform consisting of the shared data layer - // and an os/platform specific layer. + // Create an image for each platform consisting of the shared data layer, + // the shared root certs layer, and an os/platform specific layer. imageDescs := []v1.Descriptor{} - for _, p := range defaultPlatforms { // TODO: Configurable additions. - imageDesc, err := newImage(cfg, dataDesc, dataLayer, p, cfg.verbose) + for _, p := range cfg.platforms { + imageDesc, err := newImage(cfg, dataDesc, dataLayer, certsDesc, certsLayer, p, cfg.verbose) if err != nil { return err } @@ -161,7 +160,7 @@ func newDataTarball(source, target string, ignored []string, verbose bool) error return err } - header.Name = filepath.Join("/func", relPath) + header.Name = slashpath.Join("/func", filepath.ToSlash(relPath)) // TODO: should we set file timestamps to the build start time of cfg.t? // header.ModTime = timestampArgument @@ -186,6 +185,90 @@ func newDataTarball(source, target string, ignored []string, verbose bool) error }) } +// newCertLayer creates the shared data layer in the container file hierarchy and +// returns both its descriptor and layer metadata. +func newCertsLayer(cfg *buildConfig) (desc v1.Descriptor, layer v1.Layer, err error) { + + // Create the data tarball + // TODO: try WithCompressedCaching? + source := filepath.Join(cfg.buildDir(), "ca-certificates.crt") + target := path(cfg.buildDir(), "certslayer.tar.gz") + + if err = newCertsTarball(source, target, defaultIgnored, cfg.verbose); err != nil { + return + } + + // Layer + if layer, err = tarball.LayerFromFile(target); err != nil { + return + } + + // Descriptor + if desc, err = newDescriptor(layer); err != nil { + return + } + + // Blob + blob := path(cfg.blobsDir(), desc.Digest.Hex) + if cfg.verbose { + fmt.Printf("mv %v %v\n", rel(cfg.buildDir(), target), rel(cfg.buildDir(), blob)) + } + err = os.Rename(target, blob) + return +} + +func newCertsTarball(source, target string, ignored []string, verbose bool) error { + targetFile, err := os.Create(target) + if err != nil { + return err + } + defer targetFile.Close() + + gw := gzip.NewWriter(targetFile) + defer gw.Close() + + tw := tar.NewWriter(gw) + defer tw.Close() + + paths := []string{ + "/etc/ssl/certs/ca-certificates.crt", + "/etc/pki/tls/certs/ca-certificates.crt", + } + + fi, err := os.Stat(source) + if err != nil { + return err + } + + // For each ssl certs path we want to create + for _, path := range paths { + // Create a header for it + header, err := tar.FileInfoHeader(fi, "") + if err != nil { + return err + } + header.Name = path + + if err := tw.WriteHeader(header); err != nil { + return err + } + if verbose { + fmt.Printf("→ %v \n", header.Name) + } + file, err := os.Open(source) + if err != nil { + return err + } + defer file.Close() + _, err = io.Copy(tw, file) + if err != nil { + return err + } + } + + return nil +} + func newDescriptor(layer v1.Layer) (desc v1.Descriptor, err error) { size, err := layer.Size() if err != nil { @@ -204,20 +287,20 @@ func newDescriptor(layer v1.Layer) (desc v1.Descriptor, err error) { // newImage creates an image for the given platform. // The image consists of the shared data layer which is provided -func newImage(cfg *buildConfig, dataDesc v1.Descriptor, dataLayer v1.Layer, p v1.Platform, verbose bool) (imageDesc v1.Descriptor, err error) { - b, err := newLanguageLayerBuilder(cfg) +func newImage(cfg *buildConfig, dataDesc v1.Descriptor, dataLayer v1.Layer, certsDesc v1.Descriptor, certsLayer v1.Layer, p v1.Platform, verbose bool) (imageDesc v1.Descriptor, err error) { + buildFn, err := getLanguageLayerBuilder(cfg) if err != nil { return } // Write Exec Layer as Blob -> Layer - execDesc, execLayer, err := b.Build(cfg, p) + execDesc, execLayer, err := buildFn(cfg, p) if err != nil { return } // Write Config Layer as Blob -> Layer - configDesc, _, err := newConfig(cfg, p, dataLayer, execLayer) + configDesc, _, err := newConfig(cfg, p, dataLayer, certsLayer, execLayer) if err != nil { return } @@ -227,7 +310,7 @@ func newImage(cfg *buildConfig, dataDesc v1.Descriptor, dataLayer v1.Layer, p v1 SchemaVersion: 2, MediaType: types.OCIManifestSchema1, Config: configDesc, - Layers: []v1.Descriptor{dataDesc, execDesc}, + Layers: []v1.Descriptor{dataDesc, certsDesc, execDesc}, } // Write image manifest out as json to a tempfile @@ -287,6 +370,9 @@ func newConfig(cfg *buildConfig, p v1.Platform, layers ...v1.Layer) (desc v1.Des } var diff v1.Hash for _, v := range layers { + if v == nil { + continue + } if diff, err = v.DiffID(); err != nil { return } diff --git a/pkg/oci/containerize_go.go b/pkg/oci/containerize_go.go index 57dd345c42..8dce2ac884 100644 --- a/pkg/oci/containerize_go.go +++ b/pkg/oci/containerize_go.go @@ -5,8 +5,10 @@ import ( "compress/gzip" "fmt" "io" + "io/fs" "os" "os/exec" + slashpath "path" "path/filepath" "strings" @@ -15,13 +17,10 @@ import ( fn "knative.dev/func/pkg/functions" ) -type goLayerBuilder struct{} - // Build the source code as Go, cross compiled for the given platform, placing // the statically linked binary in a tarred layer and return the Descriptor // and Layer metadata. -func (c goLayerBuilder) Build(cfg *buildConfig, p v1.Platform) (desc v1.Descriptor, layer v1.Layer, err error) { - +func buildGoLayer(cfg *buildConfig, p v1.Platform) (desc v1.Descriptor, layer v1.Layer, err error) { // Executable exe, err := goBuild(cfg, p) // Compile binary returning its path if err != nil { @@ -65,7 +64,19 @@ func goBuild(cfg *buildConfig, p v1.Platform) (binPath string, err error) { } else { fmt.Printf(" %v\n", filepath.Base(outpath)) } - cmd := exec.CommandContext(cfg.ctx, gobin, args...) + + // Get the dependencies of the function + cmd := exec.CommandContext(cfg.ctx, gobin, "get", "f") + cmd.Env = envs + cmd.Dir = cfg.buildDir() + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + if err = cmd.Run(); err != nil { + return + } + + // Build the function + cmd = exec.CommandContext(cfg.ctx, gobin, args...) cmd.Env = envs cmd.Dir = cfg.buildDir() cmd.Stderr = os.Stderr @@ -160,8 +171,9 @@ func newExecTarball(source, target string, verbose bool) error { if err != nil { return err } + header.Mode = (header.Mode & ^int64(fs.ModePerm)) | 0755 - header.Name = path("/func", "f") + header.Name = slashpath.Join("/func", "f") // TODO: should we set file timestamps to the build start time of cfg.t? // header.ModTime = timestampArgument diff --git a/pkg/oci/errors.go b/pkg/oci/errors.go new file mode 100644 index 0000000000..c0331bcb4b --- /dev/null +++ b/pkg/oci/errors.go @@ -0,0 +1,20 @@ +package oci + +import "fmt" + +// BuildErr indicates a general build error occurred. +type BuildErr struct { + Err error +} + +func (e BuildErr) Error() string { + return fmt.Sprintf("error performing host build. %v", e.Err) +} + +type ErrBuildInProgress struct { + Dir string +} + +func (e ErrBuildInProgress) Error() string { + return fmt.Sprintf("a build for this function is associated with an active PID appears to be already in progress %v", e.Dir) +} diff --git a/pkg/oci/pusher_test.go b/pkg/oci/pusher_test.go index 7ebfb03771..5d93dfab21 100644 --- a/pkg/oci/pusher_test.go +++ b/pkg/oci/pusher_test.go @@ -2,16 +2,17 @@ package oci import ( "context" - "encoding/json" "errors" "fmt" + "io" + "log" "net" "net/http" - "net/http/httputil" "os" "testing" - v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/registry" + fn "knative.dev/func/pkg/functions" . "knative.dev/func/pkg/testing" ) @@ -33,38 +34,17 @@ func TestPusher(t *testing.T) { // Start a handler on an OS-chosen port which confirms that an incoming // requests looks for the most part like what we'd expect to see from a // container push. + regLog := io.Discard + if verbose { + regLog = os.Stderr + } + regHandler := registry.New(registry.Logger(log.New(regLog, "img reg handler: ", log.LstdFlags))) handler := http.NewServeMux() handler.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) { - if verbose { - fmt.Println("Mock registry server received request:") - fmt.Println("--------------------------------------") - requestDump, err := httputil.DumpRequest(req, true) - if err != nil { - t.Fatal(err) - } - fmt.Println(string(requestDump)) - } - - // Ignore all requests except the PUTs - if req.Method != http.MethodPut { - return - } - - // Ignore all PUTs except the the image index - if req.Header.Get("Content-Type") != "application/vnd.oci.image.index.v1+json" { - return - } - - // Decode the request as an index JSON - index := v1.IndexManifest{} - d := json.NewDecoder(req.Body) - defer req.Body.Close() - if err := d.Decode(&index); err != nil { - t.Fatal(err) + regHandler.ServeHTTP(res, req) + if req.Method == http.MethodPut && req.URL.Path == "/v2/funcs/f/manifests/latest" { + success = true } - - success = true - }) l, err := net.Listen("tcp4", "127.0.0.1:") if err != nil { diff --git a/pkg/openshift/metadata.go b/pkg/openshift/metadata.go deleted file mode 100644 index 19bb4c98e0..0000000000 --- a/pkg/openshift/metadata.go +++ /dev/null @@ -1,50 +0,0 @@ -package openshift - -import ( - fn "knative.dev/func/pkg/functions" -) - -const ( - annotationOpenShiftVcsUri = "app.openshift.io/vcs-uri" - annotationOpenShiftVcsRef = "app.openshift.io/vcs-ref" - - labelAppK8sInstance = "app.kubernetes.io/instance" - labelOpenShiftRuntime = "app.openshift.io/runtime" -) - -var iconValuesForRuntimes = map[string]string{ - "go": "golang", - "node": "nodejs", - "python": "python", - "quarkus": "quarkus", - "springboot": "spring-boot", -} - -type OpenshiftMetadataDecorator struct{} - -func (o OpenshiftMetadataDecorator) UpdateAnnotations(f fn.Function, annotations map[string]string) map[string]string { - if annotations == nil { - annotations = map[string]string{} - } - annotations[annotationOpenShiftVcsUri] = f.Build.Git.URL - annotations[annotationOpenShiftVcsRef] = f.Build.Git.Revision - - return annotations -} - -func (o OpenshiftMetadataDecorator) UpdateLabels(f fn.Function, labels map[string]string) map[string]string { - if labels == nil { - labels = map[string]string{} - } - - // this label is used for referencing a Tekton Pipeline and deployed KService - labels[labelAppK8sInstance] = f.Name - - // if supported, set the label representing a runtime icon in Developer Console - iconValue, ok := iconValuesForRuntimes[f.Runtime] - if ok { - labels[labelOpenShiftRuntime] = iconValue - } - - return labels -} diff --git a/pkg/openshift/openshift.go b/pkg/openshift/openshift.go deleted file mode 100644 index 95756b522b..0000000000 --- a/pkg/openshift/openshift.go +++ /dev/null @@ -1,172 +0,0 @@ -package openshift - -import ( - "context" - "crypto/x509" - "encoding/pem" - "errors" - "fmt" - "strings" - "sync" - "time" - - v1 "k8s.io/api/core/v1" - k8sErrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/util/rand" - - "knative.dev/func/pkg/docker" - "knative.dev/func/pkg/docker/creds" - fnhttp "knative.dev/func/pkg/http" - "knative.dev/func/pkg/k8s" -) - -const ( - registryHost = "image-registry.openshift-image-registry.svc" - registryHostPort = registryHost + ":5000" -) - -func GetServiceCA(ctx context.Context) (*x509.Certificate, error) { - client, ns, err := k8s.NewClientAndResolvedNamespace("") - if err != nil { - return nil, err - } - - cfgMapName := "service-ca-config-" + rand.String(5) - - cfgMap := &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: cfgMapName, - Annotations: map[string]string{"service.beta.openshift.io/inject-cabundle": "true"}, - }, - } - - configMaps := client.CoreV1().ConfigMaps(ns) - - nameSelector := fields.OneTermEqualSelector("metadata.name", cfgMapName).String() - listOpts := metav1.ListOptions{ - Watch: true, - FieldSelector: nameSelector, - } - - watch, err := configMaps.Watch(ctx, listOpts) - if err != nil { - return nil, err - } - defer watch.Stop() - - crtChan := make(chan string) - go func() { - for event := range watch.ResultChan() { - cm, ok := event.Object.(*v1.ConfigMap) - if !ok { - continue - } - if crt, ok := cm.Data["service-ca.crt"]; ok { - crtChan <- crt - close(crtChan) - break - } - } - }() - - _, err = configMaps.Create(ctx, cfgMap, metav1.CreateOptions{}) - if err != nil { - return nil, err - } - defer func() { - _ = configMaps.Delete(ctx, cfgMapName, metav1.DeleteOptions{}) - }() - - select { - case crt := <-crtChan: - blk, _ := pem.Decode([]byte(crt)) - return x509.ParseCertificate(blk.Bytes) - case <-time.After(time.Second * 5): - return nil, errors.New("failed to get OpenShift's service CA in time") - } -} - -// WithOpenShiftServiceCA enables trust to OpenShift's service CA for internal image registry -func WithOpenShiftServiceCA() fnhttp.Option { - var err error - var ca *x509.Certificate - var o sync.Once - - selectCA := func(ctx context.Context, serverName string) (*x509.Certificate, error) { - if strings.HasPrefix(serverName, registryHost) { - o.Do(func() { - ca, err = GetServiceCA(ctx) - if err != nil { - err = fmt.Errorf("cannot get CA: %w", err) - } - }) - if err != nil { - return nil, err - } - return ca, nil - } - return nil, nil - } - - return fnhttp.WithSelectCA(selectCA) -} - -func GetDefaultRegistry() string { - ns, _ := k8s.GetNamespace("") - if ns == "" { - ns = "default" - } - - return registryHostPort + "/" + ns -} - -func GetDockerCredentialLoaders() []creds.CredentialsCallback { - conf := k8s.GetClientConfig() - - rawConf, err := conf.RawConfig() - if err != nil { - return nil - } - - cc, ok := rawConf.Contexts[rawConf.CurrentContext] - if !ok { - return nil - } - var credentials docker.Credentials - - if authInfo := rawConf.AuthInfos[cc.AuthInfo]; authInfo != nil { - credentials.Username = "openshift" - credentials.Password = authInfo.Token - } - - return []creds.CredentialsCallback{ - func(registry string) (docker.Credentials, error) { - if registry == registryHostPort { - return credentials, nil - } - return docker.Credentials{}, creds.ErrCredentialsNotFound - }, - } - -} - -var isOpenShift bool -var checkOpenShiftOnce sync.Once - -func IsOpenShift() bool { - checkOpenShiftOnce.Do(func() { - isOpenShift = false - client, err := k8s.NewKubernetesClientset() - if err != nil { - return - } - _, err = client.CoreV1().Services("openshift-image-registry").Get(context.TODO(), "image-registry", metav1.GetOptions{}) - if err == nil || k8sErrors.IsForbidden(err) { - isOpenShift = true - return - } - }) - return isOpenShift -} diff --git a/pkg/openshift/openshift_test.go b/pkg/openshift/openshift_test.go deleted file mode 100644 index 545fd057ae..0000000000 --- a/pkg/openshift/openshift_test.go +++ /dev/null @@ -1,34 +0,0 @@ -//go:build integration -// +build integration - -package openshift_test - -import ( - "net/http" - - "testing" - - fnhttp "knative.dev/func/pkg/http" - "knative.dev/func/pkg/openshift" -) - -func TestRoundTripper(t *testing.T) { - if !openshift.IsOpenShift() { - t.Skip("The cluster in not an instance of OpenShift.") - return - } - - transport := fnhttp.NewRoundTripper(openshift.WithOpenShiftServiceCA()) - defer transport.Close() - - client := http.Client{ - Transport: transport, - } - - resp, err := client.Get("https://image-registry.openshift-image-registry.svc.cluster.local:5000/v2/") - if err != nil { - t.Error(err) - return - } - defer resp.Body.Close() -} diff --git a/pkg/pipelines/resources/tekton/task/func-buildpacks/0.1/func-buildpacks.yaml b/pkg/pipelines/resources/tekton/task/func-buildpacks/0.1/func-buildpacks.yaml index ee227cf757..0aea7d89f9 100644 --- a/pkg/pipelines/resources/tekton/task/func-buildpacks/0.1/func-buildpacks.yaml +++ b/pkg/pipelines/resources/tekton/task/func-buildpacks/0.1/func-buildpacks.yaml @@ -68,7 +68,7 @@ spec: default: empty-dir results: - - name: APP_IMAGE_DIGEST + - name: IMAGE_DIGEST description: The digest of the built `APP_IMAGE`. stepTemplate: @@ -189,13 +189,13 @@ spec: script: | #!/usr/bin/env bash set -e - cat /layers/report.toml | grep "digest" | cut -d'"' -f2 | cut -d'"' -f2 | tr -d '\n' | tee $(results.APP_IMAGE_DIGEST.path) + cat /layers/report.toml | grep "digest" | cut -d'"' -f2 | cut -d'"' -f2 | tr -d '\n' | tee $(results.IMAGE_DIGEST.path) ############################################ ##### Added part for Knative Functions ##### ############################################ - digest=$(cat $(results.APP_IMAGE_DIGEST.path)) + digest=$(cat $(results.IMAGE_DIGEST.path)) func_file="$(workspaces.source.path)/func.yaml" if [ "$(params.SOURCE_SUBPATH)" != "" ]; then diff --git a/pkg/pipelines/resources/tekton/task/func-deploy/0.1/func-deploy.yaml b/pkg/pipelines/resources/tekton/task/func-deploy/0.1/func-deploy.yaml index c58ff568df..fa77b4450c 100644 --- a/pkg/pipelines/resources/tekton/task/func-deploy/0.1/func-deploy.yaml +++ b/pkg/pipelines/resources/tekton/task/func-deploy/0.1/func-deploy.yaml @@ -26,5 +26,4 @@ spec: - name: func-deploy image: "ghcr.io/knative/func/func:latest" script: | - export FUNC_IMAGE="$(params.image)" - func deploy --verbose --build=false --push=false --path=$(params.path) --remote=false + func deploy --verbose --build=false --push=false --path=$(params.path) --remote=false --image="$(params.image)" diff --git a/pkg/pipelines/resources/tekton/task/func-s2i/0.1/func-s2i.yaml b/pkg/pipelines/resources/tekton/task/func-s2i/0.1/func-s2i.yaml index bf90adfa53..6966995801 100644 --- a/pkg/pipelines/resources/tekton/task/func-s2i/0.1/func-s2i.yaml +++ b/pkg/pipelines/resources/tekton/task/func-s2i/0.1/func-s2i.yaml @@ -102,15 +102,20 @@ spec: image: quay.io/buildah/stable:v1.27.0 workingDir: /gen-source script: | + TLS_VERIFY_FLAG="" + if [ "$(params.TLSVERIFY)" = "false" ] || [ "$(params.TLSVERIFY)" = "0" ]; then + TLS_VERIFY_FLAG="--tls-verify=false" + fi + [[ "$(workspaces.sslcertdir.bound)" == "true" ]] && CERT_DIR_FLAG="--cert-dir $(workspaces.sslcertdir.path)" ARTIFACTS_CACHE_PATH="$(workspaces.cache.path)/mvn-artifacts" [ -d "${ARTIFACTS_CACHE_PATH}" ] || mkdir "${ARTIFACTS_CACHE_PATH}" - buildah ${CERT_DIR_FLAG} bud --storage-driver=vfs --tls-verify=$(params.TLSVERIFY) --layers \ + buildah ${CERT_DIR_FLAG} bud --storage-driver=vfs ${TLS_VERIFY_FLAG} --layers \ -v "${ARTIFACTS_CACHE_PATH}:/tmp/artifacts/:rw,z,U" \ -f /gen-source/Dockerfile.gen -t $(params.IMAGE) . [[ "$(workspaces.dockerconfig.bound)" == "true" ]] && export DOCKER_CONFIG="$(workspaces.dockerconfig.path)" - buildah ${CERT_DIR_FLAG} push --storage-driver=vfs --tls-verify=$(params.TLSVERIFY) --digestfile $(workspaces.source.path)/image-digest \ + buildah ${CERT_DIR_FLAG} push --storage-driver=vfs ${TLS_VERIFY_FLAG} --digestfile $(workspaces.source.path)/image-digest \ $(params.IMAGE) docker://$(params.IMAGE) cat $(workspaces.source.path)/image-digest | tee /tekton/results/IMAGE_DIGEST diff --git a/pkg/pipelines/tekton/client.go b/pkg/pipelines/tekton/client.go index a1cc8679fd..6fb10f4c62 100644 --- a/pkg/pipelines/tekton/client.go +++ b/pkg/pipelines/tekton/client.go @@ -4,9 +4,8 @@ import ( "fmt" "time" - "github.com/tektoncd/pipeline/pkg/client/clientset/versioned" + "github.com/tektoncd/cli/pkg/cli" "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1beta1" - "knative.dev/func/pkg/k8s" ) @@ -33,16 +32,18 @@ func NewTektonClientAndResolvedNamespace(defaultNamespace string) (*v1beta1.Tekt return client, namespace, nil } -func NewTektonClientset() (versioned.Interface, error) { +func NewTektonClients() (*cli.Clients, error) { restConfig, err := k8s.GetClientConfig().ClientConfig() if err != nil { return nil, fmt.Errorf("failed to create new tekton clientset: %v", err) } - clientset, err := versioned.NewForConfig(restConfig) + params := cli.TektonParams{} + clients, err := params.Clients(restConfig) + if err != nil { - return nil, fmt.Errorf("failed to create new tekton clientset: %v", err) + return nil, fmt.Errorf("failed to create new tekton clients: %v", err) } - return clientset, nil + return clients, nil } diff --git a/pkg/pipelines/tekton/gitlab_test.go b/pkg/pipelines/tekton/gitlab_test.go new file mode 100644 index 0000000000..5fb8ccdbe9 --- /dev/null +++ b/pkg/pipelines/tekton/gitlab_test.go @@ -0,0 +1,597 @@ +//go:build integration +// +build integration + +package tekton_test + +import ( + "context" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/x509" + "encoding/json" + "encoding/pem" + "fmt" + "net/http" + "net/http/cookiejar" + "net/url" + "os" + "os/exec" + "os/signal" + "path/filepath" + "strconv" + "strings" + "testing" + "time" + + "github.com/xanzy/go-gitlab" + "golang.org/x/crypto/ssh" + "golang.org/x/net/html" + + pipelinev1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "knative.dev/pkg/apis" + + "knative.dev/func/pkg/docker" + fn "knative.dev/func/pkg/functions" + "knative.dev/func/pkg/k8s" + "knative.dev/func/pkg/pipelines" + "knative.dev/func/pkg/pipelines/tekton" + "knative.dev/func/pkg/random" +) + +func TestGitlab(t *testing.T) { + var err error + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) + defer cancel() + + gitlabHostname, gitlabRootPassword, pacCtrHostname, err := parseEnv(t) + if err != nil { + t.Fatal(err) + } + + glabEnv := setupGitlabEnv(ctx, t, "http://"+gitlabHostname, "root", gitlabRootPassword) + + tempHome := t.TempDir() + projDir := filepath.Join(t.TempDir(), "fn") + err = os.MkdirAll(projDir, 0755) + if err != nil { + t.Fatal(err) + } + + ns := usingNamespace(t) + t.Logf("testing in namespace: %q", ns) + + funcImg := fmt.Sprintf("ttl.sh/func/fn-%s:5m", uuid.NewUUID()) + + f := fn.Function{ + Root: projDir, + Name: glabEnv.ProjectName, + Runtime: "test-runtime", + Template: "test-template", + Image: funcImg, + Created: time.Now(), + Invoke: "none", + Build: fn.BuildSpec{ + Git: fn.Git{ + URL: strings.TrimSuffix(glabEnv.HTTPProjectURL, ".git"), + Revision: "devel", + }, + BuilderImages: map[string]string{"pack": "docker.io/paketobuildpacks/builder:tiny"}, + Builder: "pack", + PVCSize: "256Mi", + }, + Deploy: fn.DeploySpec{ + Remote: true, + Namespace: ns, + }, + } + f = fn.NewFunctionWith(f) + err = f.Write() + if err != nil { + t.Fatal(err) + } + + err = os.WriteFile(filepath.Join(projDir, "Procfile"), []byte("web: non-existent-app\n"), 0644) + if err != nil { + t.Fatal(err) + } + + credentialsProvider := func(ctx context.Context, image string) (docker.Credentials, error) { + return docker.Credentials{ + Username: "", + Password: "", + }, nil + } + pp := tekton.NewPipelinesProvider( + tekton.WithCredentialsProvider(credentialsProvider), + tekton.WithNamespace(ns), + tekton.WithPacURLCallback(func() (string, error) { + return "http://" + pacCtrHostname, nil + })) + + metadata := pipelines.PacMetadata{ + PersonalAccessToken: glabEnv.UserToken, + ConfigureLocalResources: true, + ConfigureClusterResources: true, + ConfigureRemoteResources: true, + } + err = pp.ConfigurePAC(context.Background(), f, metadata) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + _ = pp.RemovePAC(context.Background(), f, metadata) + }) + + buildDoneCh := awaitBuildCompletion(t, glabEnv.ProjectName, ns) + + gitCommands := `export GIT_TERMINAL_PROMPT=0 && \ + cd "${PROJECT_DIR}" && \ + git config --global user.name "John Doe" && \ + git config --global user.email "jdoe@example.com" && \ + git config --global core.sshCommand "ssh -i ${SSH_IDENTITY_FILE} -o UserKnownHostsFile=${HOME}/known_hosts -o StrictHostKeyChecking=no" && \ + git init --initial-branch=devel && \ + git remote add origin "${REPO_URL}" && \ + git add . && \ + git commit -m "commit message" && \ + git push -u origin devel +` + cmd := exec.Command("sh", "-c", gitCommands) + cmd.Env = []string{ + "PROJECT_DIR=" + projDir, + "SSH_IDENTITY_FILE=" + glabEnv.UserIdentityFile, + "REPO_URL=" + glabEnv.SSHProjectURL, + "HOME=" + tempHome, + } + out, err := cmd.CombinedOutput() + if err != nil { + t.Log(string(out)) + t.Fatal(err) + } + + select { + case <-buildDoneCh: + t.Log("build done on time") + case <-time.After(time.Minute * 10): + t.Error("build has not been done in time") + case <-ctx.Done(): + t.Error("cancelled") + } + +} + +func parseEnv(t *testing.T) (gitlabHostname string, gitlabRootPassword string, pacCtrHostname string, err error) { + if enabled, _ := strconv.ParseBool(os.Getenv("GITLAB_TESTS_ENABLED")); !enabled { + t.Skip("GitLab tests are disabled") + } + envs := map[string]*string{ + "GITLAB_HOSTNAME": &gitlabHostname, + "GITLAB_ROOT_PASSWORD": &gitlabRootPassword, + "PAC_CONTROLLER_HOSTNAME": &pacCtrHostname, + } + var missing []string + gitlabHostname = os.Getenv("GITLAB_HOSTNAME") + for name, ptr := range envs { + val := os.Getenv(name) + if val == "" { + missing = append(missing, name) + continue + } + *ptr = val + } + if len(missing) > 0 { + err = fmt.Errorf("required environment variables are not set: %+v", strings.Join(missing, ", ")) + } + return +} + +type gitlabEnv struct { + ProjectName string + HTTPProjectURL string + SSHProjectURL string + GroupName string + UserName string + UserToken string + UserIdentityFile string +} + +func setupGitlabEnv(ctx context.Context, t *testing.T, baseURL, username, password string) gitlabEnv { + t.Log("setting up gitlab env") + randStr := strings.ToLower(random.AlphaString(5)) + userName := "func_user_" + randStr + userPassword := "1ddqd1dkf@" + groupName := "func-grp-" + randStr + projectName := "func-project-" + randStr + + //region Initialize Root's Gitlab client + rootToken, err := getAPIToken(baseURL, username, password) + if err != nil { + t.Fatal(err) + } + + glabCli, err := gitlab.NewClient(rootToken, gitlab.WithBaseURL(baseURL)) + if err != nil { + t.Fatal(err) + } + + pat, _, err := glabCli.PersonalAccessTokens.GetSinglePersonalAccessToken() + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _, _ = glabCli.PersonalAccessTokens.RevokePersonalAccessToken(pat.ID) + }) + //endregion + + //region Enable Webhooks to non-public IP. + newSettings := &gitlab.UpdateSettingsOptions{ + AllowLocalRequestsFromWebHooksAndServices: p(true), + } + _, _, err = glabCli.Settings.UpdateSettings(newSettings) + if err != nil { + t.Fatal(err) + } + // For some reason the setting update does not kick in immediately. + + select { + case <-ctx.Done(): + t.Fatal("cancelled") + case <-time.After(time.Minute): + } + //endregion + + //region Create test user + userOpts := &gitlab.CreateUserOptions{ + Name: p("John Doe"), + Username: p(userName), + Password: p(userPassword), + ForceRandomPassword: p(false), + Email: p(fmt.Sprintf("%s@example.com", userName)), + } + + u, _, err := glabCli.Users.CreateUser(userOpts) + if err != nil { + t.Fatal(err) + } + t.Logf("created user %q", u.Username) + t.Cleanup(func() { + _, _ = glabCli.Users.DeleteUser(u.ID) + }) + //endregion + + //region Create test group + groupOpts := &gitlab.CreateGroupOptions{ + Name: p(groupName), + Path: p(groupName), + Description: p("group for `func` testing"), + Visibility: p(gitlab.PublicVisibility), + RequireTwoFactorAuth: p(false), + ProjectCreationLevel: p(gitlab.DeveloperProjectCreation), + LFSEnabled: p(true), + RequestAccessEnabled: p(true), + } + g, _, err := glabCli.Groups.CreateGroup(groupOpts) + if err != nil { + t.Fatal(err) + } + t.Logf("created group: %q", g.Name) + t.Cleanup(func() { + _, _ = glabCli.Groups.DeleteGroup(g.ID) + }) + //endregion + + //region Add test user to the test group + grpMemOpts := &gitlab.AddGroupMemberOptions{ + UserID: p(u.ID), + AccessLevel: p(gitlab.MaintainerPermissions), + } + _, _, err = glabCli.GroupMembers.AddGroupMember(g.ID, grpMemOpts) + if err != nil { + t.Fatal(err) + } + //endregion + + //region Create test project + creatProjOpts := &gitlab.CreateProjectOptions{ + Name: p(projectName), + NamespaceID: p(g.ID), + Path: p(projectName), + Visibility: p(gitlab.PublicVisibility), + InitializeWithReadme: p(true), + DefaultBranch: p("main"), + } + project, _, err := glabCli.Projects.CreateProject(creatProjOpts) + if err != nil { + t.Fatal(err) + } + t.Logf("created project: %q", project.Name) + t.Cleanup(func() { + _, _ = glabCli.Projects.DeleteProject(project.ID) + }) + //endregion + + //region Add public SSK key for test user + sshPrivateKeyPath := generateSSHKeys(t) + sshPublicKeyBytes, err := os.ReadFile(sshPrivateKeyPath + ".pub") + if err != nil { + t.Fatal(err) + } + + userToken, err := getAPIToken(baseURL, userName, userPassword) + if err != nil { + t.Fatal(err) + } + + glabCliUser, err := gitlab.NewClient(userToken, gitlab.WithBaseURL(baseURL)) + if err != nil { + t.Fatal(err) + } + + addSshKeyOpts := &gitlab.AddSSHKeyOptions{ + Title: p("func-ssh-key"), + Key: p(string(sshPublicKeyBytes)), + } + _, _, err = glabCliUser.Users.AddSSHKey(addSshKeyOpts) + if err != nil { + t.Fatal(err) + } + //endregion + + return gitlabEnv{ + ProjectName: projectName, + HTTPProjectURL: project.HTTPURLToRepo, + SSHProjectURL: project.SSHURLToRepo, + GroupName: groupName, + UserName: userName, + UserToken: userToken, + UserIdentityFile: sshPrivateKeyPath, + } +} + +func getAPIToken(baseURL, username, password string) (string, error) { + jar, err := cookiejar.New(nil) + if err != nil { + return "", fmt.Errorf("cannot create a cookie jar: %w", err) + } + + c := http.Client{ + Jar: jar, + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + } + + signInURL := baseURL + "/users/sign_in" + + resp, err := c.Get(signInURL) + if err != nil { + return "", fmt.Errorf("cannot get sign in page: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return "", fmt.Errorf("cannot get sign in page, unexpected status: %d", resp.StatusCode) + } + + node, err := html.Parse(resp.Body) + if err != nil { + return "", fmt.Errorf("cannot parse sign in page: %w", err) + } + + csrfToken := getCSRFToken(node) + + form := url.Values{} + form.Add("authenticity_token", csrfToken) + form.Add("user[login]", username) + form.Add("user[password]", password) + form.Add("user[remember_me]", "0") + + req, err := http.NewRequest("POST", signInURL, strings.NewReader(form.Encode())) + if err != nil { + return "", fmt.Errorf("cannot create sign in request: %w", err) + } + + req.Header.Add("Origin", baseURL) + req.Header.Add("Referer", signInURL) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + resp, err = c.Do(req) + if err != nil { + return "", fmt.Errorf("cannot sign in: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != 302 { + return "", fmt.Errorf("cannot sign in, unexpected status: %d", resp.StatusCode) + } + + personalAccessTokensURL := baseURL + "/-/profile/personal_access_tokens" + + resp, err = c.Get(personalAccessTokensURL) + if err != nil { + return "", fmt.Errorf("cannot get personal access tokens: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return "", fmt.Errorf("cannot get personal access tokens, unexpected status: %d", resp.StatusCode) + } + + node, err = html.Parse(resp.Body) + if err != nil { + return "", fmt.Errorf("cannot parse personal access tokens page: %w", err) + } + csrfToken = getCSRFToken(node) + + form = url.Values{ + "personal_access_token[name]": {"test-2"}, + "personal_access_token[expires_at]": {time.Now().Add(time.Hour * 25).Format("2006-01-02")}, + "personal_access_token[scopes][]": {"api", "read_api", "read_user", "read_repository", "write_repository", "sudo"}, + } + + req, err = http.NewRequest("POST", personalAccessTokensURL, strings.NewReader(form.Encode())) + if err != nil { + return "", fmt.Errorf("cannot create new personal access token request: %w", err) + } + req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") + req.Header.Add("X-CSRF-Token", csrfToken) + + resp, err = c.Do(req) + if err != nil { + return "", fmt.Errorf("cannot create new personal access token: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return "", fmt.Errorf("cannot create new personal access token, unexpected status: %d", resp.StatusCode) + } + + data := struct { + NewToken string `json:"new_token,omitempty"` + }{} + e := json.NewDecoder(resp.Body) + err = e.Decode(&data) + if err != nil { + return "", fmt.Errorf("cannot parse token form a response: %w", err) + } + + return data.NewToken, nil +} + +func getCSRFToken(n *html.Node) string { + var match bool + var token string + for _, a := range n.Attr { + if a.Key == "name" && (a.Val == "authenticity_token" || a.Val == "csrf-token") { + match = true + } + if a.Key == "value" || a.Key == "content" { + token = a.Val + } + } + if match { + return token + } + + for n = n.FirstChild; n != nil; n = n.NextSibling { + token = getCSRFToken(n) + if token != "" { + return token + } + } + + return "" +} + +func generateSSHKeys(t *testing.T) string { + tmp := t.TempDir() + + privateKeyPath := filepath.Join(tmp, "id_ecdsa") + publicKeyPath := privateKeyPath + ".pub" + + privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + t.Fatal(err) + } + privateKeyBytes, err := x509.MarshalECPrivateKey(privateKey) + if err != nil { + t.Fatal(err) + } + privateKeyBlock := &pem.Block{ + Type: "EC PRIVATE KEY", + Bytes: privateKeyBytes, + } + privateKeyFile, err := os.OpenFile(privateKeyPath, os.O_CREATE|os.O_WRONLY, 0400) + if err != nil { + t.Fatal(err) + } + err = pem.Encode(privateKeyFile, privateKeyBlock) + if err != nil { + t.Fatal(err) + } + + publicKey, err := ssh.NewPublicKey(&privateKey.PublicKey) + if err != nil { + t.Fatal(err) + } + publicKeyBytes := ssh.MarshalAuthorizedKey(publicKey) + + err = os.WriteFile(publicKeyPath, publicKeyBytes, 0444) + if err != nil { + t.Fatal(err) + } + + return privateKeyPath +} + +func usingNamespace(t *testing.T) string { + + name := "gitlab-test-" + strings.ToLower(random.AlphaString(5)) + k8sClient, err := k8s.NewKubernetesClientset() + if err != nil { + t.Fatal(err) + } + + ns := &v1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + } + createOpts := metav1.CreateOptions{} + ns, err = k8sClient.CoreV1().Namespaces().Create(context.Background(), ns, createOpts) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + deleteOpts := metav1.DeleteOptions{} + _ = k8sClient.CoreV1().Namespaces().Delete(context.Background(), name, deleteOpts) + }) + return name +} + +func awaitBuildCompletion(t *testing.T, name, ns string) <-chan struct{} { + + clis, err := tekton.NewTektonClients() + if err != nil { + t.Fatal(err) + } + + listOpts := metav1.ListOptions{ + LabelSelector: "tekton.dev/pipelineTask=build", + Watch: true, + } + w, err := clis.Tekton.TektonV1().TaskRuns(ns).Watch(context.Background(), listOpts) + if err != nil { + t.Fatal(err) + } + + ch := make(chan struct{}, 1) + + go func() { + defer w.Stop() + for event := range w.ResultChan() { + taskRun, ok := event.Object.(*pipelinev1.TaskRun) + if !ok { + continue + } + if !strings.HasPrefix(taskRun.Name, name) { + continue + } + for _, condition := range taskRun.Status.Conditions { + if condition.Type == apis.ConditionSucceeded && condition.IsTrue() { + ch <- struct{}{} + break + } + } + } + }() + return ch +} + +func p[T any](t T) *T { + return &t +} diff --git a/pkg/pipelines/tekton/pipelines_integration_test.go b/pkg/pipelines/tekton/pipelines_integration_test.go new file mode 100644 index 0000000000..89bea08c89 --- /dev/null +++ b/pkg/pipelines/tekton/pipelines_integration_test.go @@ -0,0 +1,228 @@ +//go:build integration +// +build integration + +package tekton_test + +import ( + "context" + "fmt" + "net/http" + "os" + "os/signal" + "path/filepath" + "runtime" + "strconv" + "strings" + "testing" + "time" + + "knative.dev/func/pkg/docker" + fn "knative.dev/func/pkg/functions" + "knative.dev/func/pkg/pipelines/tekton" + "knative.dev/func/pkg/random" +) + +func TestOnClusterBuild(t *testing.T) { + checkTestEnabled(t) + + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) + defer cancel() + + ns := "default" + + credentialsProvider := func(ctx context.Context, image string) (docker.Credentials, error) { + return docker.Credentials{ + Username: "", + Password: "", + }, nil + } + + tests := []struct { + Builder string + }{ + {Builder: "s2i"}, + {Builder: "pack"}, + } + + for _, test := range tests { + t.Run(test.Builder, func(t *testing.T) { + if test.Builder == "s2i" { + t.Skip("Skipping because this causes 'no space left on device' in GH Action.") + } + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + urlChan := make(chan string, 1) + + pp := tekton.NewPipelinesProvider( + tekton.WithCredentialsProvider(credentialsProvider), + tekton.WithNamespace(ns), + tekton.WithProgressListener(pl{urlChan: urlChan})) + + f := createSimpleGoProject(t, ns) + f.Build.Builder = test.Builder + + go func() { + err := pp.Run(ctx, f) + if err != nil { + t.Error(err) + cancel() + } + }() + + select { + case u := <-urlChan: + resp, err := http.Get(u) + if err != nil { + t.Error(err) + return + } + _ = resp.Body.Close() + if resp.StatusCode != 200 { + t.Error("bad HTTP response code") + return + } + t.Log("call to knative service successful") + case <-time.After(time.Minute * 10): + t.Error("timeout while waiting for service to start") + case <-ctx.Done(): + t.Error("cancelled") + } + }) + } +} + +func checkTestEnabled(t *testing.T) { + val := os.Getenv("TEKTON_TESTS_ENABLED") + enabled, _ := strconv.ParseBool(val) + if !enabled { + t.Skip("tekton tests are not enabled") + } +} + +type pl struct { + urlChan chan<- string +} + +func (p pl) log(args ...any) { + _, file, line, ok := runtime.Caller(2) + if ok { + prefix := fmt.Sprintf("%s:%d", filepath.Base(file), line) + args = append([]any{prefix}, args...) + } + fmt.Fprintln(os.Stderr, args...) +} + +func (p pl) SetTotal(i int) { + p.log("ProgressListener::SetTotal: ", i) +} + +func (p pl) Increment(message string) { + p.log("ProgressListener::Increment: ", message) + if strings.Contains(message, "URL:") { + parts := strings.Split(message, "URL:") + if len(parts) < 2 { + p.log("bad output message: %q", message) + return + } + u := strings.TrimSpace(parts[1]) + p.urlChan <- u + } +} + +func (p pl) Complete(message string) { + p.log("ProgressListener::Complete: ", message) +} + +func (p pl) Stopping() { + p.log("ProgressListener::Stopping") +} + +func (p pl) Done() { + p.log("ProgressListener::Done") +} + +func createSimpleGoProject(t *testing.T, ns string) fn.Function { + var err error + + funcName := "fn-" + strings.ToLower(random.AlphaString(5)) + + projDir := filepath.Join(t.TempDir(), funcName) + err = os.Mkdir(projDir, 0755) + if err != nil { + t.Fatal(err) + } + + err = os.WriteFile(filepath.Join(projDir, "main.go"), []byte(simpleGOSvc), 0644) + if err != nil { + t.Fatal(err) + } + + err = os.WriteFile(filepath.Join(projDir, "go.mod"), []byte("module web\n\ngo 1.20\n"), 0644) + if err != nil { + t.Fatal(err) + } + + f := fn.Function{ + Root: projDir, + Name: funcName, + Runtime: "none", + Template: "none", + Image: "registry.default.svc.cluster.local:5000/" + funcName, + Created: time.Now(), + Invoke: "none", + Build: fn.BuildSpec{ + BuilderImages: map[string]string{ + "pack": "docker.io/paketobuildpacks/builder:base", + "s2i": "registry.access.redhat.com/ubi8/go-toolset", + }, + }, + Deploy: fn.DeploySpec{ + Namespace: ns, + }, + } + f = fn.NewFunctionWith(f) + err = f.Write() + if err != nil { + t.Fatal(err) + } + return f +} + +const simpleGOSvc = `package main + +import ( + "context" + "net" + "net/http" + "os" + "os/signal" + "syscall" +) + +func main() { + sigs := make(chan os.Signal, 5) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + s := http.Server{ + Handler: http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { + resp.Header().Add("Content-Type", "text/plain") + resp.WriteHeader(200) + _, _ = resp.Write([]byte("OK")) + }), + } + go func() { + <-sigs + _ = s.Shutdown(context.Background()) + }() + port := "8080" + if p, ok := os.LookupEnv("PORT"); ok { + port = p + } + l, err := net.Listen("tcp4", ":"+port) + if err != nil { + panic(err) + } + _ = s.Serve(l) +} +` diff --git a/pkg/pipelines/tekton/pipelines_pac_provider.go b/pkg/pipelines/tekton/pipelines_pac_provider.go index 6b14bda8b7..caad5bf94a 100644 --- a/pkg/pipelines/tekton/pipelines_pac_provider.go +++ b/pkg/pipelines/tekton/pipelines_pac_provider.go @@ -5,7 +5,6 @@ import ( "fmt" "strings" - "github.com/AlecAivazis/survey/v2" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" k8serrors "k8s.io/apimachinery/pkg/api/errors" @@ -13,7 +12,6 @@ import ( "knative.dev/func/pkg/docker" fn "knative.dev/func/pkg/functions" "knative.dev/func/pkg/git" - "knative.dev/func/pkg/git/github" "knative.dev/func/pkg/k8s" "knative.dev/func/pkg/pipelines" "knative.dev/func/pkg/pipelines/tekton/pac" @@ -32,12 +30,17 @@ func (pp *PipelinesProvider) ConfigurePAC(ctx context.Context, f fn.Function, me return fmt.Errorf("incorrect type of pipelines metadata: %T", metadata) } - if err := validatePipeline(f); err != nil { + var warningMsg string + var err error + if warningMsg, err = validatePipeline(f); err != nil { return err } + if warningMsg != "" { + pp.progressListener.Increment(warningMsg) + } if data.ConfigureLocalResources { - if err := pp.createLocalResources(ctx, f); err != nil { + if err := pp.createLocalPACResources(ctx, f); err != nil { return err } } @@ -62,13 +65,13 @@ func (pp *PipelinesProvider) ConfigurePAC(ctx context.Context, f fn.Function, me } if data.ConfigureClusterResources { - if err := pp.createClusterResources(ctx, f, data); err != nil { + if err := pp.createClusterPACResources(ctx, f, data); err != nil { return err } } if data.ConfigureRemoteResources { - if err := pp.createRemoteResources(ctx, f, data); err != nil { + if err := pp.createRemotePACResources(ctx, f, data); err != nil { return err } } @@ -104,15 +107,24 @@ func (pp *PipelinesProvider) RemovePAC(ctx context.Context, f fn.Function, metad return nil } -// createLocalResources creates necessary local resources in .tekton directory: +// createLocalPACResources creates necessary local resources in .tekton directory: // Pipeline and PipelineRun templates -func (pp *PipelinesProvider) createLocalResources(ctx context.Context, f fn.Function) error { - err := createPipelineTemplate(f) +func (pp *PipelinesProvider) createLocalPACResources(ctx context.Context, f fn.Function) error { + // let's specify labels that will be applied to every resource that is created for a Pipeline + labels, err := f.LabelsMap() if err != nil { return err } + if pp.decorator != nil { + labels = pp.decorator.UpdateLabels(f, labels) + } - err = createPipelineRunTemplate(f) + err = createPipelineTemplatePAC(f, labels) + if err != nil { + return err + } + + err = createPipelineRunTemplatePAC(f, labels) if err != nil { return err } @@ -120,10 +132,10 @@ func (pp *PipelinesProvider) createLocalResources(ctx context.Context, f fn.Func return nil } -// createClusterResources create resources on cluster, it tries to detect PAC installation, +// createClusterPACResources create resources on cluster, it tries to detect PAC installation, // creates necessary secret with image registry credentials and git credentials (access tokens, webhook secrets), // also creates PVC for the function source code -func (pp *PipelinesProvider) createClusterResources(ctx context.Context, f fn.Function, metadata pipelines.PacMetadata) error { +func (pp *PipelinesProvider) createClusterPACResources(ctx context.Context, f fn.Function, metadata pipelines.PacMetadata) error { // figure out pac installation namespace installed, _, err := pac.DetectPACInstallation(ctx, "") if !installed { @@ -185,14 +197,10 @@ func (pp *PipelinesProvider) createClusterResources(ctx context.Context, f fn.Fu return nil } -// createRemoteResources creates resources on the remote git repository +// createRemotePACResources creates resources on the remote git repository // set up a webhook with secrets, access tokens and it tries to detec PAC installation // together with PAC controller route url - needed for webhook payload trigger -func (pp *PipelinesProvider) createRemoteResources(ctx context.Context, f fn.Function, metadata pipelines.PacMetadata) error { - repoOwner, repoName, err := git.RepoOwnerAndNameFromUrl(f.Build.Git.URL) - if err != nil { - return err - } +func (pp *PipelinesProvider) createRemotePACResources(ctx context.Context, f fn.Function, metadata pipelines.PacMetadata) error { // figure out pac installation namespace installed, installationNS, err := pac.DetectPACInstallation(ctx, "") @@ -220,21 +228,19 @@ func (pp *PipelinesProvider) createRemoteResources(ctx context.Context, f fn.Fun // we haven't been able to detect PAC controller public route, let's prompt: if controllerURL == "" { - if err := survey.AskOne(&survey.Input{ - Message: "Please enter your Pipelines As Code controller public route URL: ", - }, &controllerURL, survey.WithValidator(survey.Required)); err != nil { + if controllerURL, err = pp.getPacURL(); err != nil { return err } } - if err := github.CreateGitHubWebhook(ctx, repoOwner, repoName, controllerURL, metadata.WebhookSecret, metadata.PersonalAccessToken); err != nil { + if err := git.CreateWebHook(ctx, f.Build.Git.URL, controllerURL, metadata.WebhookSecret, metadata.PersonalAccessToken); err != nil { // Error: POST https://api.github.com/repos/foobar/test-function/hooks: 422 Validation Failed [{Resource:Hook Field: Code:custom Message:Hook already exists on this repository}] if !strings.Contains(err.Error(), "Hook already exists") { return err } - fmt.Printf(" ✅ Webhook already exists on repository %v/%v\n", repoOwner, repoName) + fmt.Printf(" ✅ Webhook already exists on repository %v\n", f.Build.Git.URL) } else { - fmt.Printf(" ✅ Webhook is created on repository %v/%v\n", repoOwner, repoName) + fmt.Printf(" ✅ Webhook is created on repository %v\n", f.Build.Git.URL) } return nil diff --git a/pkg/pipelines/tekton/pipelines_pac_provider_test.go b/pkg/pipelines/tekton/pipelines_pac_provider_test.go index 4ff6c2ca3d..f23c8d54ac 100644 --- a/pkg/pipelines/tekton/pipelines_pac_provider_test.go +++ b/pkg/pipelines/tekton/pipelines_pac_provider_test.go @@ -52,7 +52,7 @@ func Test_createLocalResources(t *testing.T) { f.Registry = TestRegistry pp := NewPipelinesProvider() - err = pp.createLocalResources(context.Background(), f) + err = pp.createLocalPACResources(context.Background(), f) if (err != nil) != tt.wantErr { t.Errorf("pp.createLocalResources() error = %v, wantErr %v", err, tt.wantErr) return @@ -76,7 +76,7 @@ func Test_deleteAllPipelineTemplates(t *testing.T) { f.Registry = TestRegistry pp := NewPipelinesProvider() - err = pp.createLocalResources(context.Background(), f) + err = pp.createLocalPACResources(context.Background(), f) if err != nil { t.Errorf("unexpected error while running pp.createLocalResources() error = %v", err) } diff --git a/pkg/pipelines/tekton/pipelines_provider.go b/pkg/pipelines/tekton/pipelines_provider.go new file mode 100644 index 0000000000..a053214fc1 --- /dev/null +++ b/pkg/pipelines/tekton/pipelines_provider.go @@ -0,0 +1,539 @@ +package tekton + +import ( + "archive/tar" + "context" + "errors" + "fmt" + "io" + "io/fs" + "os" + "path" + "path/filepath" + "strings" + "sync" + "time" + + "k8s.io/apimachinery/pkg/api/resource" + + "github.com/AlecAivazis/survey/v2" + "github.com/google/go-containerregistry/pkg/authn" + "github.com/google/go-containerregistry/pkg/name" + gitignore "github.com/sabhiram/go-gitignore" + "github.com/tektoncd/cli/pkg/pipelinerun" + "github.com/tektoncd/cli/pkg/taskrun" + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + pipelineClient "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1beta1" + corev1 "k8s.io/api/core/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + k8slabels "k8s.io/apimachinery/pkg/labels" + + "knative.dev/func/pkg/docker" + fn "knative.dev/func/pkg/functions" + "knative.dev/func/pkg/k8s" + fnlabels "knative.dev/func/pkg/k8s/labels" + "knative.dev/func/pkg/knative" + "knative.dev/pkg/apis" +) + +// DefaultPersistentVolumeClaimSize to allocate for the function. +var DefaultPersistentVolumeClaimSize = resource.MustParse("256Mi") + +type PipelineDecorator interface { + UpdateLabels(fn.Function, map[string]string) map[string]string +} + +type Opt func(*PipelinesProvider) + +type pacURLCallback = func() (string, error) + +type PipelinesProvider struct { + // namespace with which to override that set on the default configuration (such as the ~/.kube/config). + // If left blank, pipeline creation/run will commence to the configured namespace. + namespace string + verbose bool + progressListener fn.ProgressListener + getPacURL pacURLCallback + credentialsProvider docker.CredentialsProvider + decorator PipelineDecorator +} + +func WithNamespace(namespace string) Opt { + return func(pp *PipelinesProvider) { + pp.namespace = namespace + } +} + +func WithProgressListener(pl fn.ProgressListener) Opt { + return func(pp *PipelinesProvider) { + pp.progressListener = pl + } +} + +func WithCredentialsProvider(credentialsProvider docker.CredentialsProvider) Opt { + return func(pp *PipelinesProvider) { + pp.credentialsProvider = credentialsProvider + } +} + +func WithVerbose(verbose bool) Opt { + return func(pp *PipelinesProvider) { + pp.verbose = verbose + } +} + +func WithPipelineDecorator(decorator PipelineDecorator) Opt { + return func(pp *PipelinesProvider) { + pp.decorator = decorator + } +} + +func WithPacURLCallback(getPacURL pacURLCallback) Opt { + return func(pp *PipelinesProvider) { + pp.getPacURL = getPacURL + } +} + +func NewPipelinesProvider(opts ...Opt) *PipelinesProvider { + pp := &PipelinesProvider{ + getPacURL: func() (string, error) { + var url string + e := survey.AskOne(&survey.Input{ + Message: "Please enter your Pipelines As Code controller public route URL: ", + }, &url, survey.WithValidator(survey.Required)) + return url, e + }, + } + + for _, opt := range opts { + opt(pp) + } + + return pp +} + +// Run creates a Tekton Pipeline and all necessary resources (PVCs, Secrets, SAs,...) for the input Function. +// It ensures that all needed resources are present on the cluster so the PipelineRun can be initialized. +// After the PipelineRun is being initialized, the progress of the PipelineRun is being watched and printed to the output. +func (pp *PipelinesProvider) Run(ctx context.Context, f fn.Function) error { + pp.progressListener.Increment("Creating Pipeline resources") + var warningMsg string + var err error + if warningMsg, err = validatePipeline(f); err != nil { + return err + } + if warningMsg != "" { + pp.progressListener.Increment(warningMsg) + } + + client, namespace, err := NewTektonClientAndResolvedNamespace(pp.namespace) + if err != nil { + return err + } + pp.namespace = namespace + + // let's specify labels that will be applied to every resource that is created for a Pipeline + labels, err := f.LabelsMap() + if err != nil { + return err + } + if pp.decorator != nil { + labels = pp.decorator.UpdateLabels(f, labels) + } + + err = createPipelinePersistentVolumeClaim(ctx, f, pp.namespace, labels) + if err != nil { + return err + } + + if f.Build.Git.URL == "" { + // Use direct upload to PVC if Git is not set up. + content := sourcesAsTarStream(f) + defer content.Close() + err = k8s.UploadToVolume(ctx, content, getPipelinePvcName(f), pp.namespace) + if err != nil { + return fmt.Errorf("cannot upload sources to the PVC: %w", err) + } + } + + err = createAndApplyPipelineTemplate(f, pp.namespace, labels) + if err != nil { + if !k8serrors.IsAlreadyExists(err) { + if k8serrors.IsNotFound(err) { + return fmt.Errorf("problem creating pipeline, missing tekton?: %v", err) + } + return fmt.Errorf("problem creating pipeline: %v", err) + } + } + + registry, err := docker.GetRegistry(f.Image) + if err != nil { + return fmt.Errorf("problem in resolving image registry name: %v", err) + } + + creds, err := pp.credentialsProvider(ctx, f.Image) + if err != nil { + return err + } + + if registry == name.DefaultRegistry { + registry = authn.DefaultAuthKey + } + + err = k8s.EnsureDockerRegistrySecretExist(ctx, getPipelineSecretName(f), pp.namespace, labels, f.Deploy.Annotations, creds.Username, creds.Password, registry) + if err != nil { + return fmt.Errorf("problem in creating secret: %v", err) + } + + if f.Registry == "" { + f.Registry = registry + } + + err = createAndApplyPipelineRunTemplate(f, pp.namespace, labels) + if err != nil { + return fmt.Errorf("problem in creating pipeline run: %v", err) + } + + // we need to give k8s time to actually create the Pipeline Run + time.Sleep(1 * time.Second) + + newestPipelineRun, err := findNewestPipelineRunWithRetry(ctx, f, pp.namespace, client) + if err != nil { + return fmt.Errorf("problem in listing pipeline runs: %v", err) + } + + err = pp.watchPipelineRunProgress(ctx, newestPipelineRun) + if err != nil { + if !errors.Is(err, context.Canceled) { + return fmt.Errorf("problem in watching started pipeline run: %v", err) + } + // TODO replace deletion with pipeline-run cancellation + _ = client.PipelineRuns(pp.namespace).Delete(context.TODO(), newestPipelineRun.Name, metav1.DeleteOptions{}) + return fmt.Errorf("pipeline run cancelled: %w", context.Canceled) + } + + newestPipelineRun, err = client.PipelineRuns(pp.namespace).Get(ctx, newestPipelineRun.Name, metav1.GetOptions{}) + if err != nil { + return fmt.Errorf("problem in retriving pipeline run status: %v", err) + } + + if newestPipelineRun.Status.GetCondition(apis.ConditionSucceeded).Status == corev1.ConditionFalse { + message := getFailedPipelineRunLog(ctx, client, newestPipelineRun, pp.namespace) + return fmt.Errorf("function pipeline run has failed with message: \n\n%s", message) + } + + kClient, err := knative.NewServingClient(pp.namespace) + if err != nil { + return fmt.Errorf("problem in retrieving status of deployed function: %v", err) + } + + ksvc, err := kClient.GetService(ctx, f.Name) + if err != nil { + return fmt.Errorf("problem in retrieving status of deployed function: %v", err) + } + + if ksvc.Generation == 1 { + pp.progressListener.Increment(fmt.Sprintf("✅ Function deployed in namespace %q and exposed at URL: \n %s", ksvc.Namespace, ksvc.Status.URL.String())) + } else { + pp.progressListener.Increment(fmt.Sprintf("✅ Function updated in namespace %q and exposed at URL: \n %s", ksvc.Namespace, ksvc.Status.URL.String())) + } + + return nil +} + +// Creates tar stream with the function sources as they were in "./source" directory. +func sourcesAsTarStream(f fn.Function) *io.PipeReader { + ignored := func(p string) bool { return strings.HasPrefix(p, ".git") } + if gi, err := gitignore.CompileIgnoreFile(filepath.Join(f.Root, ".gitignore")); err == nil { + ignored = func(p string) bool { + if strings.HasPrefix(p, ".git") { + return true + } + return gi.MatchesPath(p) + } + } + + pr, pw := io.Pipe() + + const up = ".." + string(os.PathSeparator) + go func() { + tw := tar.NewWriter(pw) + err := filepath.Walk(f.Root, func(p string, fi fs.FileInfo, err error) error { + if err != nil { + return fmt.Errorf("error traversing function directory: %w", err) + } + + relp, err := filepath.Rel(f.Root, p) + if err != nil { + return fmt.Errorf("cannot get relative path: %w", err) + } + + if relp == "." { + return nil + } + + if ignored(relp) { + return nil + } + + lnk := "" + if fi.Mode()&fs.ModeSymlink != 0 { + lnk, err = os.Readlink(p) + if err != nil { + return fmt.Errorf("cannot read link: %w", err) + } + if filepath.IsAbs(lnk) { + lnk, err = filepath.Rel(f.Root, lnk) + if err != nil { + return fmt.Errorf("cannot get relative path for symlink: %w", err) + } + if strings.HasPrefix(lnk, up) || lnk == ".." { + return fmt.Errorf("link %q points outside source root", p) + } + } else { + t, err := filepath.Rel(f.Root, filepath.Join(filepath.Dir(p), lnk)) + if err != nil { + return fmt.Errorf("cannot get relative path for symlink: %w", err) + } + if strings.HasPrefix(t, up) || t == ".." { + return fmt.Errorf("link %q points outside source root", p) + } + } + } + + hdr, err := tar.FileInfoHeader(fi, lnk) + if err != nil { + return fmt.Errorf("cannot create a tar header: %w", err) + } + // "source" is expected path in workspace pvc + hdr.Name = path.Join("source", filepath.ToSlash(relp)) + + err = tw.WriteHeader(hdr) + if err != nil { + return fmt.Errorf("cannot write header to tar stream: %w", err) + } + + if fi.Mode().IsRegular() { + var file io.ReadCloser + file, err = os.Open(p) + if err != nil { + return fmt.Errorf("cannot open source file: %w", err) + } + defer file.Close() + _, err = io.Copy(tw, file) + if err != nil { + return fmt.Errorf("cannot copy source file content: %w", err) + } + } + return nil + }) + if err != nil { + _ = pw.CloseWithError(fmt.Errorf("error while creating tar stream from sources: %w", err)) + } else { + _ = tw.Close() + _ = pw.Close() + } + }() + return pr +} + +// Remove tries to remove all resources that are present on the cluster and belongs to the input function and it's pipelines +func (pp *PipelinesProvider) Remove(ctx context.Context, f fn.Function) error { + var err error + + errMsg := pp.removeClusterResources(ctx, f) + if errMsg != "" { + err = fmt.Errorf("%s", errMsg) + } + + return err +} + +// removeClusterResources tries to remove all resources that are present on the cluster and belongs to the input function and it's pipelines +// if there are any errors during the removal, string with error messages is returned +// if there are no error the returned string is empty +func (pp *PipelinesProvider) removeClusterResources(ctx context.Context, f fn.Function) string { + l := k8slabels.SelectorFromSet(k8slabels.Set(map[string]string{fnlabels.FunctionNameKey: f.Name})) + listOptions := metav1.ListOptions{ + LabelSelector: l.String(), + } + + // let's try to delete all resources in parallel, so the operation doesn't take long + wg := sync.WaitGroup{} + deleteFunctions := []func(context.Context, string, metav1.ListOptions) error{ + deletePipelines, + deletePipelineRuns, + k8s.DeleteSecrets, + k8s.DeletePersistentVolumeClaims, + deletePACRepositories, + } + + wg.Add(len(deleteFunctions)) + errChan := make(chan error, len(deleteFunctions)) + + for i := range deleteFunctions { + df := deleteFunctions[i] + go func() { + defer wg.Done() + err := df(ctx, pp.namespace, listOptions) + if err != nil && !k8serrors.IsNotFound(err) && !k8serrors.IsForbidden(err) { + errChan <- err + } + }() + } + wg.Wait() + close(errChan) + + // collect all errors and return them as a string + errMsg := "" + anyError := false + for e := range errChan { + if !anyError { + anyError = true + errMsg = "error deleting resources:" + } + errMsg += fmt.Sprintf("\n %v", e) + } + + return errMsg +} + +// watchPipelineRunProgress watches the progress of the input PipelineRun +// and prints detailed description of the currently executed Tekton Task. +func (pp *PipelinesProvider) watchPipelineRunProgress(ctx context.Context, pr *v1beta1.PipelineRun) error { + taskProgressMsg := map[string]string{ + "fetch-sources": "Fetching git repository with the function source code", + "build": "Building function image on the cluster", + "deploy": "Deploying function to the cluster", + } + + clients, err := NewTektonClients() + if err != nil { + return err + } + + prTracker := pipelinerun.NewTracker(pr.Name, pp.namespace, clients) + trChannel := prTracker.Monitor([]string{}) + ctxDone := ctx.Done() + wg := sync.WaitGroup{} +out: + for { + var trs []taskrun.Run + var ok bool + + select { + case trs, ok = <-trChannel: + if !ok { + break out + } + case <-ctxDone: + err = ctx.Err() + break out + } + + wg.Add(len(trs)) + + for _, run := range trs { + go func(tr taskrun.Run) { + defer wg.Done() + + // let's print a Task name, if we don't have a proper description of the Task + taskDescription := tr.Task + if val, ok := taskProgressMsg[tr.Task]; ok { + taskDescription = val + } + pp.progressListener.Increment(fmt.Sprintf("Running Pipeline Task: %s", taskDescription)) + + }(run) + } + } + wg.Wait() + + return err +} + +// getFailedPipelineRunLog returns log message for a failed PipelineRun, +// returns log from a container where the failing TaskRun is running, if available. +func getFailedPipelineRunLog(ctx context.Context, client *pipelineClient.TektonV1beta1Client, pr *v1beta1.PipelineRun, namespace string) string { + // Reason "Failed" usually means there is a specific failure in some step, + // let's find the failed step and try to get log directly from the container. + // If we are not able to get the container's log, we return the generic message from the PipelineRun.Status. + message := pr.Status.GetCondition(apis.ConditionSucceeded).Message + if pr.Status.GetCondition(apis.ConditionSucceeded).Reason == "Failed" { + for _, ref := range pr.Status.ChildReferences { + t, err := client.TaskRuns(namespace).Get(context.Background(), ref.Name, metav1.GetOptions{}) + if err != nil { + return fmt.Sprintf("error getting TaskRun %s: %v", ref.Name, err) + } + if t.Status.GetCondition(apis.ConditionSucceeded).Status == corev1.ConditionFalse { + for _, s := range t.Status.Steps { + // let's try to print logs of the first unsuccessful step + if s.Terminated != nil && s.Terminated.ExitCode != 0 { + podLogs, err := k8s.GetPodLogs(ctx, namespace, t.Status.PodName, s.ContainerName) + if err == nil { + return podLogs + } + return message + } + } + + } + } + } + + return message +} + +// findNewestPipelineRunWithRetry tries to find newest Pipeline Run for the input function +func findNewestPipelineRunWithRetry(ctx context.Context, f fn.Function, namespace string, client *pipelineClient.TektonV1beta1Client) (*v1beta1.PipelineRun, error) { + l := k8slabels.SelectorFromSet(k8slabels.Set(map[string]string{fnlabels.FunctionNameKey: f.Name})) + listOptions := metav1.ListOptions{ + LabelSelector: l.String(), + } + + var newestPipelineRun *v1beta1.PipelineRun + for attempt := 1; attempt <= 3; attempt++ { + prs, err := client.PipelineRuns(namespace).List(ctx, listOptions) + if err != nil { + return nil, fmt.Errorf("problem in listing pipeline runs: %v", err) + } + + for _, pr := range prs.Items { + currentPipelineRun := pr + if len(prs.Items) < 1 || currentPipelineRun.Status.StartTime == nil { + // Restart if StartTime is nil + break + } + + if newestPipelineRun == nil || currentPipelineRun.Status.StartTime.After(newestPipelineRun.Status.StartTime.Time) { + newestPipelineRun = ¤tPipelineRun + } + } + + // If a non-nil newestPipelineRun is found, break the retry loop + if newestPipelineRun != nil { + return newestPipelineRun, nil + } + } + + return nil, fmt.Errorf("problem in listing pipeline runs: haven't found any") +} + +// allows simple mocking in unit tests, use with caution regarding concurrency +var createPersistentVolumeClaim = k8s.CreatePersistentVolumeClaim + +func createPipelinePersistentVolumeClaim(ctx context.Context, f fn.Function, namespace string, labels map[string]string) error { + var err error + pvcs := DefaultPersistentVolumeClaimSize + if f.Build.PVCSize != "" { + if pvcs, err = resource.ParseQuantity(f.Build.PVCSize); err != nil { + return fmt.Errorf("PVC size value could not be parsed. %w", err) + } + } + err = createPersistentVolumeClaim(ctx, getPipelinePvcName(f), namespace, labels, f.Deploy.Annotations, corev1.ReadWriteOnce, pvcs) + if err != nil && !k8serrors.IsAlreadyExists(err) { + return fmt.Errorf("problem creating persistent volume claim: %v", err) + } + return nil +} diff --git a/pkg/pipelines/tekton/pipelines_provider_test.go b/pkg/pipelines/tekton/pipelines_provider_test.go new file mode 100644 index 0000000000..ee7894f443 --- /dev/null +++ b/pkg/pipelines/tekton/pipelines_provider_test.go @@ -0,0 +1,133 @@ +package tekton + +import ( + "archive/tar" + "context" + "errors" + "io" + "os" + "path/filepath" + "strings" + "testing" + + corev1 "k8s.io/api/core/v1" + apiErrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + fn "knative.dev/func/pkg/functions" +) + +func TestSourcesAsTarStream(t *testing.T) { + root := filepath.Join("testdata", "fn-src") + + if err := os.Mkdir(filepath.Join(root, ".git"), 0755); err != nil && !errors.Is(err, os.ErrExist) { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(root, ".git", "a.txt"), []byte("hello"), 0644); err != nil { + t.Fatal(err) + } + + rc := sourcesAsTarStream(fn.Function{Root: root}) + t.Cleanup(func() { _ = rc.Close() }) + + var helloTxtContent []byte + var symlinkFound bool + tr := tar.NewReader(rc) + for { + hdr, err := tr.Next() + if err != nil { + if errors.Is(err, io.EOF) { + break + } + t.Fatal(err) + } + if hdr.Name == "source/bin/release/a.out" { + t.Error("stream contains file that should have been ignored") + } + if strings.HasPrefix(hdr.Name, "source/.git") { + t.Errorf(".git files were included: %q", hdr.Name) + } + if hdr.Name == "source/hello.txt" { + helloTxtContent, err = io.ReadAll(tr) + if err != nil { + t.Fatal(err) + } + } + if hdr.Name == "source/hello.txt.lnk" { + symlinkFound = true + if hdr.Linkname != "hello.txt" { + t.Errorf("bad symlink target: %q", hdr.Linkname) + } + } + } + if helloTxtContent == nil { + t.Error("the hello.txt file is missing in the stream") + } else { + if string(helloTxtContent) != "Hello World!\n" { + t.Error("the hello.txt file has incorrect content") + } + } + if !symlinkFound { + t.Error("symlink missing in the stream") + } +} + +func Test_createPipelinePersistentVolumeClaim(t *testing.T) { + type mockType func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) + + type args struct { + ctx context.Context + f fn.Function + namespace string + labels map[string]string + size string + } + tests := []struct { + name string + args args + mock mockType + wantErr bool + }{ + { + name: "returns error if pvc creation failed", + args: args{ + ctx: context.Background(), + f: fn.Function{}, + namespace: "test-ns", + labels: nil, + size: DefaultPersistentVolumeClaimSize.String(), + }, + mock: func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) { + return errors.New("creation of pvc failed") + }, + wantErr: true, + }, + { + name: "returns nil if pvc already exists", + args: args{ + ctx: context.Background(), + f: fn.Function{}, + namespace: "test-ns", + labels: nil, + size: DefaultPersistentVolumeClaimSize.String(), + }, + mock: func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) { + return &apiErrors.StatusError{ErrStatus: metav1.Status{Reason: metav1.StatusReasonAlreadyExists}} + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { // save current function and restore it at the end + old := createPersistentVolumeClaim + defer func() { createPersistentVolumeClaim = old }() + + createPersistentVolumeClaim = tt.mock + tt.args.f.Build.PVCSize = tt.args.size + if err := createPipelinePersistentVolumeClaim(tt.args.ctx, tt.args.f, tt.args.namespace, tt.args.labels); (err != nil) != tt.wantErr { + t.Errorf("createPipelinePersistentVolumeClaim() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/pkg/pipelines/tekton/pipeplines_provider.go b/pkg/pipelines/tekton/pipeplines_provider.go deleted file mode 100644 index 7e49845cb0..0000000000 --- a/pkg/pipelines/tekton/pipeplines_provider.go +++ /dev/null @@ -1,461 +0,0 @@ -package tekton - -import ( - "archive/tar" - "context" - goErrors "errors" - "fmt" - "io" - "io/fs" - "os" - "path" - "path/filepath" - "strings" - "sync" - - "k8s.io/apimachinery/pkg/api/resource" - - "github.com/google/go-containerregistry/pkg/authn" - "github.com/google/go-containerregistry/pkg/name" - gitignore "github.com/sabhiram/go-gitignore" - "github.com/tektoncd/cli/pkg/pipelinerun" - "github.com/tektoncd/cli/pkg/taskrun" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - k8slabels "k8s.io/apimachinery/pkg/labels" - - "knative.dev/func/pkg/docker" - fn "knative.dev/func/pkg/functions" - "knative.dev/func/pkg/k8s" - fnlabels "knative.dev/func/pkg/k8s/labels" - "knative.dev/func/pkg/knative" - "knative.dev/pkg/apis" -) - -type PipelineDecorator interface { - UpdateLabels(fn.Function, map[string]string) map[string]string -} - -type Opt func(*PipelinesProvider) - -type PipelinesProvider struct { - // namespace with which to override that set on the default configuration (such as the ~/.kube/config). - // If left blank, pipeline creation/run will commence to the configured namespace. - namespace string - verbose bool - progressListener fn.ProgressListener - credentialsProvider docker.CredentialsProvider - decorator PipelineDecorator -} - -func WithNamespace(namespace string) Opt { - return func(pp *PipelinesProvider) { - pp.namespace = namespace - } -} - -func WithProgressListener(pl fn.ProgressListener) Opt { - return func(pp *PipelinesProvider) { - pp.progressListener = pl - } -} - -func WithCredentialsProvider(credentialsProvider docker.CredentialsProvider) Opt { - return func(pp *PipelinesProvider) { - pp.credentialsProvider = credentialsProvider - } -} - -func WithVerbose(verbose bool) Opt { - return func(pp *PipelinesProvider) { - pp.verbose = verbose - } -} - -func WithPipelineDecorator(decorator PipelineDecorator) Opt { - return func(pp *PipelinesProvider) { - pp.decorator = decorator - } -} - -func NewPipelinesProvider(opts ...Opt) *PipelinesProvider { - pp := &PipelinesProvider{} - - for _, opt := range opts { - opt(pp) - } - - return pp -} - -// Run creates a Tekton Pipeline and all necessary resources (PVCs, Secrets, SAs,...) for the input Function. -// It ensures that all needed resources are present on the cluster so the PipelineRun can be initialized. -// After the PipelineRun is being initialized, the progress of the PipelineRun is being watched and printed to the output. -func (pp *PipelinesProvider) Run(ctx context.Context, f fn.Function) error { - pp.progressListener.Increment("Creating Pipeline resources") - - if err := validatePipeline(f); err != nil { - return err - } - - client, namespace, err := NewTektonClientAndResolvedNamespace(pp.namespace) - if err != nil { - return err - } - pp.namespace = namespace - - // let's specify labels that will be applied to every resource that is created for a Pipeline - labels, err := f.LabelsMap() - if err != nil { - return err - } - if pp.decorator != nil { - labels = pp.decorator.UpdateLabels(f, labels) - } - - err = createPipelinePersistentVolumeClaim(ctx, f, pp.namespace, labels) - if err != nil { - return err - } - - if f.Build.Git.URL == "" { - // Use direct upload to PVC if Git is not set up. - content := sourcesAsTarStream(f) - defer content.Close() - err = k8s.UploadToVolume(ctx, content, getPipelinePvcName(f), pp.namespace) - if err != nil { - return fmt.Errorf("cannot upload sources to the PVC: %w", err) - } - } - - _, err = client.Pipelines(pp.namespace).Create(ctx, generatePipeline(f, labels), metav1.CreateOptions{}) - if err != nil { - if !errors.IsAlreadyExists(err) { - if errors.IsNotFound(err) { - return fmt.Errorf("problem creating pipeline, missing tekton?: %v", err) - } - return fmt.Errorf("problem creating pipeline: %v", err) - } - } - - registry, err := docker.GetRegistry(f.Image) - if err != nil { - return fmt.Errorf("problem in resolving image registry name: %v", err) - } - - creds, err := pp.credentialsProvider(ctx, f.Image) - if err != nil { - return err - } - - if registry == name.DefaultRegistry { - registry = authn.DefaultAuthKey - } - - err = k8s.EnsureDockerRegistrySecretExist(ctx, getPipelineSecretName(f), pp.namespace, labels, f.Deploy.Annotations, creds.Username, creds.Password, registry) - if err != nil { - return fmt.Errorf("problem in creating secret: %v", err) - } - - if f.Registry == "" { - f.Registry = registry - } - pr, err := client.PipelineRuns(pp.namespace).Create(ctx, generatePipelineRun(f, labels), metav1.CreateOptions{}) - if err != nil { - return fmt.Errorf("problem in creating pipeline run: %v", err) - } - - err = pp.watchPipelineRunProgress(ctx, pr) - if err != nil { - if !goErrors.Is(err, context.Canceled) { - return fmt.Errorf("problem in watching started pipeline run: %v", err) - } - // TODO replace deletion with pipeline-run cancellation - _ = client.PipelineRuns(pp.namespace).Delete(context.TODO(), pr.Name, metav1.DeleteOptions{}) - return fmt.Errorf("pipeline run cancelled: %w", context.Canceled) - } - - pr, err = client.PipelineRuns(pp.namespace).Get(ctx, pr.Name, metav1.GetOptions{}) - if err != nil { - return fmt.Errorf("problem in retriving pipeline run status: %v", err) - } - - if pr.Status.GetCondition(apis.ConditionSucceeded).Status == corev1.ConditionFalse { - message := getFailedPipelineRunLog(ctx, pr, pp.namespace) - return fmt.Errorf("function pipeline run has failed with message: \n\n%s", message) - } - - kClient, err := knative.NewServingClient(pp.namespace) - if err != nil { - return fmt.Errorf("problem in retrieving status of deployed function: %v", err) - } - - ksvc, err := kClient.GetService(ctx, f.Name) - if err != nil { - return fmt.Errorf("problem in retrieving status of deployed function: %v", err) - } - - if ksvc.Generation == 1 { - pp.progressListener.Increment(fmt.Sprintf("✅ Function deployed in namespace %q and exposed at URL: \n %s", ksvc.Namespace, ksvc.Status.URL.String())) - } else { - pp.progressListener.Increment(fmt.Sprintf("✅ Function updated in namespace %q and exposed at URL: \n %s", ksvc.Namespace, ksvc.Status.URL.String())) - } - - return nil -} - -// Creates tar stream with the function sources as they were in "./source" directory. -func sourcesAsTarStream(f fn.Function) *io.PipeReader { - ignored := func(p string) bool { return strings.HasPrefix(p, ".git") } - if gi, err := gitignore.CompileIgnoreFile(filepath.Join(f.Root, ".gitignore")); err == nil { - ignored = func(p string) bool { - if strings.HasPrefix(p, ".git") { - return true - } - return gi.MatchesPath(p) - } - } - - pr, pw := io.Pipe() - - const up = ".." + string(os.PathSeparator) - go func() { - tw := tar.NewWriter(pw) - err := filepath.Walk(f.Root, func(p string, fi fs.FileInfo, err error) error { - if err != nil { - return fmt.Errorf("error traversing function directory: %w", err) - } - - relp, err := filepath.Rel(f.Root, p) - if err != nil { - return fmt.Errorf("cannot get relative path: %w", err) - } - - if relp == "." { - return nil - } - - if ignored(relp) { - return nil - } - - lnk := "" - if fi.Mode()&fs.ModeSymlink != 0 { - lnk, err = os.Readlink(p) - if err != nil { - return fmt.Errorf("cannot read link: %w", err) - } - if filepath.IsAbs(lnk) { - lnk, err = filepath.Rel(f.Root, lnk) - if err != nil { - return fmt.Errorf("cannot get relative path for symlink: %w", err) - } - if strings.HasPrefix(lnk, up) || lnk == ".." { - return fmt.Errorf("link %q points outside source root", p) - } - } else { - t, err := filepath.Rel(f.Root, filepath.Join(filepath.Dir(p), lnk)) - if err != nil { - return fmt.Errorf("cannot get relative path for symlink: %w", err) - } - if strings.HasPrefix(t, up) || t == ".." { - return fmt.Errorf("link %q points outside source root", p) - } - } - } - - hdr, err := tar.FileInfoHeader(fi, lnk) - if err != nil { - return fmt.Errorf("cannot create a tar header: %w", err) - } - // "source" is expected path in workspace pvc - hdr.Name = path.Join("source", filepath.ToSlash(relp)) - - err = tw.WriteHeader(hdr) - if err != nil { - return fmt.Errorf("cannot write header to tar stream: %w", err) - } - - if fi.Mode().IsRegular() { - var file io.ReadCloser - file, err = os.Open(p) - if err != nil { - return fmt.Errorf("cannot open source file: %w", err) - } - defer file.Close() - _, err = io.Copy(tw, file) - if err != nil { - return fmt.Errorf("cannot copy source file content: %w", err) - } - } - return nil - }) - if err != nil { - _ = pw.CloseWithError(fmt.Errorf("error while creating tar stream from sources: %w", err)) - } else { - _ = tw.Close() - _ = pw.Close() - } - }() - return pr -} - -// Remove tries to remove all resources that are present on the cluster and belongs to the input function and it's pipelines -func (pp *PipelinesProvider) Remove(ctx context.Context, f fn.Function) error { - var err error - - errMsg := pp.removeClusterResources(ctx, f) - if errMsg != "" { - err = fmt.Errorf("%s", errMsg) - } - - return err -} - -// removeClusterResources tries to remove all resources that are present on the cluster and belongs to the input function and it's pipelines -// if there are any errors during the removal, string with error messages is returned -// if there are no error the returned string is empty -func (pp *PipelinesProvider) removeClusterResources(ctx context.Context, f fn.Function) string { - l := k8slabels.SelectorFromSet(k8slabels.Set(map[string]string{fnlabels.FunctionNameKey: f.Name})) - listOptions := metav1.ListOptions{ - LabelSelector: l.String(), - } - - // let's try to delete all resources in parallel, so the operation doesn't take long - wg := sync.WaitGroup{} - deleteFunctions := []func(context.Context, string, metav1.ListOptions) error{ - deletePipelines, - deletePipelineRuns, - k8s.DeleteSecrets, - k8s.DeletePersistentVolumeClaims, - deletePACRepositories, - } - - wg.Add(len(deleteFunctions)) - errChan := make(chan error, len(deleteFunctions)) - - for i := range deleteFunctions { - df := deleteFunctions[i] - go func() { - defer wg.Done() - err := df(ctx, pp.namespace, listOptions) - if err != nil && !errors.IsNotFound(err) && !errors.IsForbidden(err) { - errChan <- err - } - }() - } - wg.Wait() - close(errChan) - - // collect all errors and return them as a string - errMsg := "" - anyError := false - for e := range errChan { - if !anyError { - anyError = true - errMsg = "error deleting resources:" - } - errMsg += fmt.Sprintf("\n %v", e) - } - - return errMsg -} - -// watchPipelineRunProgress watches the progress of the input PipelineRun -// and prints detailed description of the currently executed Tekton Task. -func (pp *PipelinesProvider) watchPipelineRunProgress(ctx context.Context, pr *v1beta1.PipelineRun) error { - taskProgressMsg := map[string]string{ - taskNameFetchSources: "Fetching git repository with the function source code", - taskNameBuild: "Building function image on the cluster", - taskNameDeploy: "Deploying function to the cluster", - } - - clientset, err := NewTektonClientset() - if err != nil { - return err - } - - prTracker := pipelinerun.NewTracker(pr.Name, pp.namespace, clientset) - trChannel := prTracker.Monitor([]string{}) - ctxDone := ctx.Done() - wg := sync.WaitGroup{} -out: - for { - var trs []taskrun.Run - var ok bool - - select { - case trs, ok = <-trChannel: - if !ok { - break out - } - case <-ctxDone: - err = ctx.Err() - break out - } - - wg.Add(len(trs)) - - for _, run := range trs { - go func(tr taskrun.Run) { - defer wg.Done() - - // let's print a Task name, if we don't have a proper description of the Task - taskDescription := tr.Task - if val, ok := taskProgressMsg[tr.Task]; ok { - taskDescription = val - } - pp.progressListener.Increment(fmt.Sprintf("Running Pipeline Task: %s", taskDescription)) - - }(run) - } - } - wg.Wait() - - return err -} - -// getFailedPipelineRunLog returns log message for a failed PipelineRun, -// returns log from a container where the failing TaskRun is running, if available. -func getFailedPipelineRunLog(ctx context.Context, pr *v1beta1.PipelineRun, namespace string) string { - // Reason "Failed" usually means there is a specific failure in some step, - // let's find the failed step and try to get log directly from the container. - // If we are not able to get the container's log, we return the generic message from the PipelineRun.Status. - message := pr.Status.GetCondition(apis.ConditionSucceeded).Message - if pr.Status.GetCondition(apis.ConditionSucceeded).Reason == "Failed" { - for _, t := range pr.Status.TaskRuns { - if t.Status.GetCondition(apis.ConditionSucceeded).Status == corev1.ConditionFalse { - for _, s := range t.Status.Steps { - // let's try to print logs of the first unsuccessful step - if s.Terminated != nil && s.Terminated.ExitCode != 0 { - podLogs, err := k8s.GetPodLogs(ctx, namespace, t.Status.PodName, s.ContainerName) - if err == nil { - return podLogs - } - return message - } - } - - } - } - } - - return message -} - -// allows simple mocking in unit tests, use with caution regarding concurrency -var createPersistentVolumeClaim = k8s.CreatePersistentVolumeClaim - -func createPipelinePersistentVolumeClaim(ctx context.Context, f fn.Function, namespace string, labels map[string]string) error { - pvcs, err := resource.ParseQuantity(f.Build.PVCSize) - if err != nil { - return fmt.Errorf("PVC size value cannot be parsed due to: %v", err) - } - err = createPersistentVolumeClaim(ctx, getPipelinePvcName(f), namespace, labels, f.Deploy.Annotations, corev1.ReadWriteOnce, pvcs) - if err != nil && !errors.IsAlreadyExists(err) { - return fmt.Errorf("problem creating persistent volume claim: %v", err) - } - return nil -} diff --git a/pkg/pipelines/tekton/pipeplines_provider_test.go b/pkg/pipelines/tekton/pipeplines_provider_test.go deleted file mode 100644 index 5c9a5a8f92..0000000000 --- a/pkg/pipelines/tekton/pipeplines_provider_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package tekton - -import ( - "archive/tar" - "context" - "errors" - "io" - "os" - "path/filepath" - "strings" - "testing" - - corev1 "k8s.io/api/core/v1" - apiErrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - fn "knative.dev/func/pkg/functions" -) - -func TestSourcesAsTarStream(t *testing.T) { - root := filepath.Join("testdata", "fn-src") - - if err := os.Mkdir(filepath.Join(root, ".git"), 0755); err != nil && !errors.Is(err, os.ErrExist) { - t.Fatal(err) - } - if err := os.WriteFile(filepath.Join(root, ".git", "a.txt"), []byte("hello"), 0644); err != nil { - t.Fatal(err) - } - - rc := sourcesAsTarStream(fn.Function{Root: root}) - t.Cleanup(func() { _ = rc.Close() }) - - var helloTxtContent []byte - var symlinkFound bool - tr := tar.NewReader(rc) - for { - hdr, err := tr.Next() - if err != nil { - if errors.Is(err, io.EOF) { - break - } - t.Fatal(err) - } - if hdr.Name == "source/bin/release/a.out" { - t.Error("stream contains file that should have been ignored") - } - if strings.HasPrefix(hdr.Name, "source/.git") { - t.Errorf(".git files were included: %q", hdr.Name) - } - if hdr.Name == "source/hello.txt" { - helloTxtContent, err = io.ReadAll(tr) - if err != nil { - t.Fatal(err) - } - } - if hdr.Name == "source/hello.txt.lnk" { - symlinkFound = true - if hdr.Linkname != "hello.txt" { - t.Errorf("bad symlink target: %q", hdr.Linkname) - } - } - } - if helloTxtContent == nil { - t.Error("the hello.txt file is missing in the stream") - } else { - if string(helloTxtContent) != "Hello World!\n" { - t.Error("the hello.txt file has incorrect content") - } - } - if !symlinkFound { - t.Error("symlink missing in the stream") - } -} - -func Test_createPipelinePersistentVolumeClaim(t *testing.T) { - type mockType func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) - - type args struct { - ctx context.Context - f fn.Function - namespace string - labels map[string]string - size string - } - tests := []struct { - name string - args args - mock mockType - wantErr bool - }{ - { - name: "returns error if pvc creation failed", - args: args{ - ctx: context.Background(), - f: fn.Function{}, - namespace: "test-ns", - labels: nil, - size: fn.DefaultPersistentVolumeClaimSize, - }, - mock: func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) { - return errors.New("creation of pvc failed") - }, - wantErr: true, - }, - { - name: "returns nil if pvc already exists", - args: args{ - ctx: context.Background(), - f: fn.Function{}, - namespace: "test-ns", - labels: nil, - size: fn.DefaultPersistentVolumeClaimSize, - }, - mock: func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) { - return &apiErrors.StatusError{ErrStatus: metav1.Status{Reason: metav1.StatusReasonAlreadyExists}} - }, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { // save current function and restore it at the end - old := createPersistentVolumeClaim - defer func() { createPersistentVolumeClaim = old }() - - createPersistentVolumeClaim = tt.mock - tt.args.f.Build.PVCSize = tt.args.size - if err := createPipelinePersistentVolumeClaim(tt.args.ctx, tt.args.f, tt.args.namespace, tt.args.labels); (err != nil) != tt.wantErr { - t.Errorf("createPipelinePersistentVolumeClaim() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} diff --git a/pkg/pipelines/tekton/resources.go b/pkg/pipelines/tekton/resources.go index 3bc6aefbf8..583962c73a 100644 --- a/pkg/pipelines/tekton/resources.go +++ b/pkg/pipelines/tekton/resources.go @@ -4,10 +4,7 @@ import ( "context" "fmt" - pplnv1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/func/pkg/builders" "knative.dev/func/pkg/builders/buildpacks" @@ -33,200 +30,6 @@ func deletePipelineRuns(ctx context.Context, namespaceOverride string, listOptio return client.PipelineRuns(namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, listOptions) } -func generatePipeline(f fn.Function, labels map[string]string) *pplnv1beta1.Pipeline { - - // ----- General properties - pipelineName := getPipelineName(f) - - params := []pplnv1beta1.ParamSpec{ - { - Name: "gitRepository", - Description: "Git repository that hosts the function project", - Default: pplnv1beta1.NewArrayOrString(f.Build.Git.URL), - }, - { - Name: "gitRevision", - Description: "Git revision to build", - }, - { - Name: "contextDir", - Description: "Path where the function project is", - Default: pplnv1beta1.NewArrayOrString(""), - }, - { - Name: "imageName", - Description: "Function image name", - }, - { - Name: "registry", - Description: "Function registry", - }, - { - Name: "builderImage", - Description: "Builder image to be used", - }, - { - Name: "buildEnvs", - Description: "Environment variables to set during build time", - Type: "array", - }, - } - - workspaces := []pplnv1beta1.PipelineWorkspaceDeclaration{ - {Name: "source-workspace", Description: "Directory where function source is located."}, - {Name: "cache-workspace", Description: "Directory where build cache is stored."}, - {Name: "dockerconfig-workspace", Description: "Directory containing image registry credentials stored in `config.json` file.", Optional: true}, - } - - var taskBuild pplnv1beta1.PipelineTask - - // Deploy step that uses an image produced by S2I builds needs explicit reference to the image - referenceImageFromPreviousTaskResults := false - - var tasks []pplnv1beta1.PipelineTask - var buildPreReq []string - - if f.Build.Git.URL != "" { - // If Git is set up create fetch task, - // otherwise sources have been already uploaded to workspace PVC. - buildPreReq = []string{taskNameFetchSources} - tasks = append(tasks, taskFetchSources()) - } - - if f.Build.Builder == builders.Pack { - // ----- Buildpacks related properties - taskBuild = taskBuildpacks(buildPreReq) - - } else if f.Build.Builder == builders.S2I { - // ----- S2I build related properties - - params = append(params, pplnv1beta1.ParamSpec{Name: "s2iImageScriptsUrl", Description: "URL containing the default assemble and run scripts for the builder image.", - Default: pplnv1beta1.NewArrayOrString("image:///usr/libexec/s2i")}) - - taskBuild = taskS2iBuild(buildPreReq) - referenceImageFromPreviousTaskResults = true - } - - // ----- Pipeline definition - tasks = append(tasks, taskBuild, taskDeploy(taskNameBuild, referenceImageFromPreviousTaskResults)) - - return &pplnv1beta1.Pipeline{ - ObjectMeta: v1.ObjectMeta{ - Name: pipelineName, - Labels: labels, - Annotations: f.Deploy.Annotations, - }, - Spec: pplnv1beta1.PipelineSpec{ - Params: params, - Workspaces: workspaces, - Tasks: tasks, - }, - } -} - -func generatePipelineRun(f fn.Function, labels map[string]string) *pplnv1beta1.PipelineRun { - - revision := f.Build.Git.Revision - contextDir := f.Build.Git.ContextDir - if contextDir == "" && f.Build.Builder == builders.S2I { - // TODO(lkingland): could instead update S2I to interpret empty string - // as cwd, such that builder-specific code can be kept out of here. - contextDir = "." - } - - buildEnvs := &pplnv1beta1.ArrayOrString{ - Type: pplnv1beta1.ParamTypeArray, - ArrayVal: []string{}, - } - if len(f.Build.BuildEnvs) > 0 { - var envs []string - for _, e := range f.Build.BuildEnvs { - envs = append(envs, e.KeyValuePair()) - } - buildEnvs.ArrayVal = envs - } else { - // need to hack empty BuildEnvs array on Tekton v0.39.0+ - // until https://github.com/tektoncd/pipeline/issues/5149 is resolved and released - buildEnvs.ArrayVal = append(buildEnvs.ArrayVal, "=") - } - - params := []pplnv1beta1.Param{ - { - Name: "gitRepository", - Value: *pplnv1beta1.NewArrayOrString(f.Build.Git.URL), - }, - { - Name: "gitRevision", - Value: *pplnv1beta1.NewArrayOrString(revision), - }, - { - Name: "contextDir", - Value: *pplnv1beta1.NewArrayOrString(contextDir), - }, - { - Name: "imageName", - Value: *pplnv1beta1.NewArrayOrString(f.Image), - }, - { - Name: "registry", - Value: *pplnv1beta1.NewArrayOrString(f.Registry), - }, - { - Name: "builderImage", - Value: *pplnv1beta1.NewArrayOrString(getBuilderImage(f)), - }, - { - Name: "buildEnvs", - Value: *buildEnvs, - }, - } - - workspaces := []pplnv1beta1.WorkspaceBinding{ - { - Name: "source-workspace", - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: getPipelinePvcName(f), - }, - SubPath: "source", - }, - { - Name: "cache-workspace", - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: getPipelinePvcName(f), - }, - SubPath: "cache", - }, - { - Name: "dockerconfig-workspace", - Secret: &corev1.SecretVolumeSource{ - SecretName: getPipelineSecretName(f), - }, - }, - } - - if f.Build.Builder == builders.S2I { - if f.Runtime == "quarkus" { - params = append(params, pplnv1beta1.Param{Name: "s2iImageScriptsUrl", Value: *pplnv1beta1.NewArrayOrString("image:///usr/local/s2i")}) - } - } - - // ----- PipelineRun definition - return &pplnv1beta1.PipelineRun{ - ObjectMeta: v1.ObjectMeta{ - GenerateName: fmt.Sprintf("%s-run-", getPipelineName(f)), - Labels: labels, - Annotations: f.Deploy.Annotations, - }, - Spec: pplnv1beta1.PipelineRunSpec{ - PipelineRef: &pplnv1beta1.PipelineRef{ - Name: getPipelineName(f), - }, - Params: params, - Workspaces: workspaces, - }, - } -} - // guilderImage returns the builder image to use when building the Function // with the Pack strategy if it can be calculated (the Function has a defined // language runtime. Errors are checked elsewhere, so at this level they @@ -250,6 +53,10 @@ func getPipelineName(f fn.Function) string { return fmt.Sprintf("%s-%s-%s-pipeline", f.Name, f.Build.Builder, source) } +func getPipelineRunGenerateName(f fn.Function) string { + return fmt.Sprintf("%s-run-", getPipelineName(f)) +} + func getPipelineSecretName(f fn.Function) string { return fmt.Sprintf("%s-secret", getPipelineName(f)) } diff --git a/pkg/pipelines/tekton/resources_test.go b/pkg/pipelines/tekton/resources_test.go deleted file mode 100644 index 62c3f77985..0000000000 --- a/pkg/pipelines/tekton/resources_test.go +++ /dev/null @@ -1,54 +0,0 @@ -//go:build !integration -// +build !integration - -package tekton - -import ( - "testing" - - "knative.dev/func/pkg/builders" - fn "knative.dev/func/pkg/functions" -) - -func Test_generatePipeline(t *testing.T) { - testGitRepo := "http://git-repo/git.git" - testGit := fn.Git{ - URL: testGitRepo, - } - - tests := []struct { - name string - function fn.Function - taskBuildName string - }{ - { - name: "Pack builder - use buildpacks", - function: fn.Function{Build: fn.BuildSpec{Builder: builders.Pack, Git: testGit}}, - taskBuildName: "func-buildpacks", - }, - { - name: "s2i builder - use", - function: fn.Function{Build: fn.BuildSpec{Builder: builders.S2I, Git: testGit}}, - taskBuildName: "func-s2i", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ppl := generatePipeline(tt.function, map[string]string{}) - - for _, task := range ppl.Spec.Tasks { - // let's check what is the Task used for build task - if task.Name == taskNameBuild { - if task.TaskRef.Name != tt.taskBuildName { - t.Errorf("generatePipeline(), for builder = %q: wanted build Task = %q, got = %q", tt.function.Build.Builder, tt.taskBuildName, task.TaskRef.Name) - } - return - } - } - - // we haven't found the build Task -> fail - t.Errorf("generatePipeline(), wasn't able to find build related task named = %q", taskNameBuild) - }) - } -} diff --git a/pkg/pipelines/tekton/tasks.go b/pkg/pipelines/tekton/tasks.go deleted file mode 100644 index e9cb0c47c5..0000000000 --- a/pkg/pipelines/tekton/tasks.go +++ /dev/null @@ -1,122 +0,0 @@ -package tekton - -import ( - "fmt" - - pplnv1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" -) - -const ( - taskNameFetchSources = "fetch-sources" - taskNameBuild = "build" - taskNameDeploy = "deploy" -) - -func taskFetchSources() pplnv1beta1.PipelineTask { - return pplnv1beta1.PipelineTask{ - Name: taskNameFetchSources, - TaskRef: &pplnv1beta1.TaskRef{ - Name: "git-clone", - }, - Workspaces: []pplnv1beta1.WorkspacePipelineTaskBinding{{ - Name: "output", - Workspace: "source-workspace", - }}, - Params: []pplnv1beta1.Param{ - {Name: "url", Value: *pplnv1beta1.NewArrayOrString("$(params.gitRepository)")}, - {Name: "revision", Value: *pplnv1beta1.NewArrayOrString("$(params.gitRevision)")}, - }, - } -} - -func taskBuildpacks(runAfter []string) pplnv1beta1.PipelineTask { - return pplnv1beta1.PipelineTask{ - Name: taskNameBuild, - TaskRef: &pplnv1beta1.TaskRef{ - Name: "func-buildpacks", - }, - RunAfter: runAfter, - Workspaces: []pplnv1beta1.WorkspacePipelineTaskBinding{ - { - Name: "source", - Workspace: "source-workspace", - }, - { - Name: "cache", - Workspace: "cache-workspace", - }, - { - Name: "dockerconfig", - Workspace: "dockerconfig-workspace", - }}, - Params: []pplnv1beta1.Param{ - {Name: "APP_IMAGE", Value: *pplnv1beta1.NewArrayOrString("$(params.imageName)")}, - {Name: "REGISTRY", Value: *pplnv1beta1.NewArrayOrString("$(params.registry)")}, - {Name: "SOURCE_SUBPATH", Value: *pplnv1beta1.NewArrayOrString("$(params.contextDir)")}, - {Name: "BUILDER_IMAGE", Value: *pplnv1beta1.NewArrayOrString("$(params.builderImage)")}, - {Name: "ENV_VARS", Value: pplnv1beta1.ArrayOrString{ - Type: pplnv1beta1.ParamTypeArray, - ArrayVal: []string{"$(params.buildEnvs[*])"}, - }}, - }, - } - -} -func taskS2iBuild(runAfter []string) pplnv1beta1.PipelineTask { - params := []pplnv1beta1.Param{ - {Name: "IMAGE", Value: *pplnv1beta1.NewArrayOrString("$(params.imageName)")}, - {Name: "REGISTRY", Value: *pplnv1beta1.NewArrayOrString("$(params.registry)")}, - {Name: "PATH_CONTEXT", Value: *pplnv1beta1.NewArrayOrString("$(params.contextDir)")}, - {Name: "BUILDER_IMAGE", Value: *pplnv1beta1.NewArrayOrString("$(params.builderImage)")}, - {Name: "ENV_VARS", Value: pplnv1beta1.ArrayOrString{ - Type: pplnv1beta1.ParamTypeArray, - ArrayVal: []string{"$(params.buildEnvs[*])"}, - }}, - {Name: "S2I_IMAGE_SCRIPTS_URL", Value: *pplnv1beta1.NewArrayOrString("$(params.s2iImageScriptsUrl)")}, - } - return pplnv1beta1.PipelineTask{ - Name: taskNameBuild, - TaskRef: &pplnv1beta1.TaskRef{ - Name: "func-s2i", - }, - RunAfter: runAfter, - Workspaces: []pplnv1beta1.WorkspacePipelineTaskBinding{ - { - Name: "source", - Workspace: "source-workspace", - }, - { - Name: "cache", - Workspace: "cache-workspace", - }, - { - Name: "dockerconfig", - Workspace: "dockerconfig-workspace", - }}, - Params: params, - } - -} - -func taskDeploy(runAfter string, referenceImageFromPreviousTaskResults bool) pplnv1beta1.PipelineTask { - - params := []pplnv1beta1.Param{{Name: "path", Value: *pplnv1beta1.NewArrayOrString("$(workspaces.source.path)/$(params.contextDir)")}} - - // Deploy step that uses an image produced by S2I builds needs explicit reference to the image - if referenceImageFromPreviousTaskResults { - params = append(params, pplnv1beta1.Param{Name: "image", Value: *pplnv1beta1.NewArrayOrString(fmt.Sprintf("$(params.imageName)@$(tasks.%s.results.IMAGE_DIGEST)", runAfter))}) - } - - return pplnv1beta1.PipelineTask{ - Name: taskNameDeploy, - TaskRef: &pplnv1beta1.TaskRef{ - Name: "func-deploy", - }, - RunAfter: []string{runAfter}, - Workspaces: []pplnv1beta1.WorkspacePipelineTaskBinding{{ - Name: "source", - Workspace: "source-workspace", - }}, - Params: params, - } -} diff --git a/pkg/pipelines/tekton/templates.go b/pkg/pipelines/tekton/templates.go index 6a156845cd..555d414a86 100644 --- a/pkg/pipelines/tekton/templates.go +++ b/pkg/pipelines/tekton/templates.go @@ -1,28 +1,86 @@ package tekton import ( + "bytes" "fmt" + "net/http" "os" "path" + "strings" "text/template" "github.com/AlecAivazis/survey/v2" + "github.com/manifestival/manifestival" + "gopkg.in/yaml.v3" "knative.dev/func/pkg/builders" fn "knative.dev/func/pkg/functions" + "knative.dev/func/pkg/k8s" ) const ( // Local resources properties - resourcesDirectory = ".tekton" - pipelineFileName = "pipeline.yaml" - pipelineRunFilenane = "pipeline-run.yaml" - - // Tasks references - taskGitCloneRef = "git-clone" - taskFuncS2iRef = "https://raw.githubusercontent.com/knative/func/main/pkg/pipelines/resources/tekton/task/func-s2i/0.1/func-s2i.yaml" - taskFuncBuildpacksRef = "https://raw.githubusercontent.com/knative/func/main/pkg/pipelines/resources/tekton/task/func-buildpacks/0.1/func-buildpacks.yaml" - taskFuncDeployRef = "https://raw.githubusercontent.com/knative/func/main/pkg/pipelines/resources/tekton/task/func-deploy/0.1/func-deploy.yaml" + resourcesDirectory = ".tekton" + pipelineFileName = "pipeline.yaml" + pipelineRunFilenane = "pipeline-run.yaml" + pipelineFileNamePAC = "pipeline-pac.yaml" + pipelineRunFilenamePAC = "pipeline-run-pac.yaml" + + // Tasks references for PAC PipelineRun that are defined in the annotations + taskGitCloneRef = "git-clone" + taskFuncS2iPACPipelineRunRef = "https://raw.githubusercontent.com/%s/%s/pkg/pipelines/resources/tekton/task/func-s2i/0.1/func-s2i.yaml" + taskFuncBuildpacksPACPipelineRunRef = "https://raw.githubusercontent.com/%s/%s/pkg/pipelines/resources/tekton/task/func-buildpacks/0.1/func-buildpacks.yaml" + taskFuncDeployPACPipelineRunRef = "https://raw.githubusercontent.com/%s/%s/pkg/pipelines/resources/tekton/task/func-deploy/0.1/func-deploy.yaml" + + // Following section contains references for Tasks to be used in Pipeline templates, + // there is a difference if we use PAC approach or standard Tekton approach. + // + // This can be simplified once we start consuming tasks from Tekton Hub + taskFuncBuildpacksPACTaskRef = `taskRef: + kind: Task + name: func-buildpacks` + taskFuncS2iPACTaskRef = `taskRef: + kind: Task + name: func-s2i` + taskFuncDeployPACTaskRef = `taskRef: + kind: Task + name: func-deploy` + + // Following part holds a reference to Git Clone Task to be used in Pipeline template, + // the usage depends whether we use direct code upload or Git reference for a standard (non PAC) on-cluster build + taskGitClonePACTaskRef = `- name: fetch-sources + params: + - name: url + value: $(params.gitRepository) + - name: revision + value: $(params.gitRevision) + taskRef: + kind: Task + name: git-clone + workspaces: + - name: output + workspace: source-workspace` + // TODO fix Tekton Hub reference + taskGitCloneTaskRef = `- name: fetch-sources + params: + - name: url + value: $(params.gitRepository) + - name: revision + value: $(params.gitRevision) + taskRef: + resolver: hub + params: + - name: kind + value: task + - name: name + value: git-clone + - name: version + value: "0.4" + workspaces: + - name: output + workspace: source-workspace` + runAfterFetchSourcesRef = `runAfter: + - fetch-sources` // S2I related properties defaultS2iImageScriptsUrl = "image:///usr/libexec/s2i" @@ -32,10 +90,15 @@ const ( defaultPipelinesTargetBranch = "main" ) +var ( + FuncRepoRef = "knative/func" + FuncRepoBranchRef = "main" +) + type templateData struct { FunctionName string Annotations map[string]string - Labels []fn.Label + Labels map[string]string ContextDir string FunctionImage string Registry string @@ -60,30 +123,45 @@ type templateData struct { FuncS2iTaskRef string FuncDeployTaskRef string + // Reference for build task - whether it should run after fetch-sources task or not + RunAfterFetchSources string + PipelineYamlURL string // S2I related properties S2iImageScriptsUrl string } -func createPipelineTemplate(f fn.Function) error { +// createPipelineTemplatePAC creates a Pipeline template used for PAC on-cluster build +// it creates the resource in the project directory +func createPipelineTemplatePAC(f fn.Function, labels map[string]string) error { data := templateData{ - FunctionName: f.Name, - Annotations: f.Deploy.Annotations, - Labels: f.Deploy.Labels, - PipelineName: getPipelineName(f), + FunctionName: f.Name, + Annotations: f.Deploy.Annotations, + Labels: labels, + PipelineName: getPipelineName(f), + RunAfterFetchSources: runAfterFetchSourcesRef, + GitCloneTaskRef: taskGitClonePACTaskRef, + FuncBuildpacksTaskRef: taskFuncBuildpacksPACTaskRef, + FuncS2iTaskRef: taskFuncS2iPACTaskRef, + FuncDeployTaskRef: taskFuncDeployPACTaskRef, } + var template string if f.Build.Builder == builders.Pack { - return createResource(f.Root, pipelineFileName, packPipelineTemplate, data) + template = packPipelineTemplate } else if f.Build.Builder == builders.S2I { - return createResource(f.Root, pipelineFileName, s2iPipelineTemplate, data) + template = s2iPipelineTemplate + } else { + return builders.ErrBuilderNotSupported{Builder: f.Build.Builder} } - return fmt.Errorf("builder %q is not supported", f.Build.Builder) + return createResource(f.Root, pipelineFileNamePAC, template, data) } -func createPipelineRunTemplate(f fn.Function) error { +// createPipelineRunTemplatePAC creates a PipelineRun template used for PAC on-cluster build +// it creates the resource in the project directory +func createPipelineRunTemplatePAC(f fn.Function, labels map[string]string) error { contextDir := f.Build.Git.ContextDir if contextDir == "" && f.Build.Builder == builders.S2I { // TODO(lkingland): could instead update S2I to interpret empty string @@ -113,7 +191,7 @@ func createPipelineRunTemplate(f fn.Function) error { data := templateData{ FunctionName: f.Name, Annotations: f.Deploy.Annotations, - Labels: f.Deploy.Labels, + Labels: labels, ContextDir: contextDir, FunctionImage: f.Image, Registry: f.Registry, @@ -128,11 +206,11 @@ func createPipelineRunTemplate(f fn.Function) error { PipelinesTargetBranch: pipelinesTargetBranch, GitCloneTaskRef: taskGitCloneRef, - FuncBuildpacksTaskRef: taskFuncBuildpacksRef, - FuncS2iTaskRef: taskFuncS2iRef, - FuncDeployTaskRef: taskFuncDeployRef, + FuncBuildpacksTaskRef: fmt.Sprintf(taskFuncBuildpacksPACPipelineRunRef, FuncRepoRef, FuncRepoBranchRef), + FuncS2iTaskRef: fmt.Sprintf(taskFuncS2iPACPipelineRunRef, FuncRepoRef, FuncRepoBranchRef), + FuncDeployTaskRef: fmt.Sprintf(taskFuncDeployPACPipelineRunRef, FuncRepoRef, FuncRepoBranchRef), - PipelineYamlURL: fmt.Sprintf("%s/%s", resourcesDirectory, pipelineFileName), + PipelineYamlURL: fmt.Sprintf("%s/%s", resourcesDirectory, pipelineFileNamePAC), S2iImageScriptsUrl: s2iImageScriptsUrl, @@ -140,26 +218,19 @@ func createPipelineRunTemplate(f fn.Function) error { Revision: "{{ revision }}", } + var template string if f.Build.Builder == builders.Pack { - return createResource(f.Root, pipelineRunFilenane, packRunTemplate, data) + template = packRunTemplatePAC } else if f.Build.Builder == builders.S2I { - return createResource(f.Root, pipelineRunFilenane, s2iRunTemplate, data) - } - - return fmt.Errorf("builder %q is not supported", f.Build.Builder) -} - -// deleteAllPipelineTemplates deletes all templates and pipeline resources that exists for a function -// and are stored in the .tekton directory -func deleteAllPipelineTemplates(f fn.Function) string { - err := os.RemoveAll(path.Join(f.Root, resourcesDirectory)) - if err != nil { - return fmt.Sprintf("\n %v", err) + template = s2iRunTemplatePAC + } else { + return builders.ErrBuilderNotSupported{Builder: f.Build.Builder} } - return "" + return createResource(f.Root, pipelineRunFilenamePAC, template, data) } +// createResource creates a file in the input directory from the file template and a data func createResource(projectRoot, fileName, fileTemplate string, data interface{}) error { tmpl, err := template.New(fileName).Parse(fileTemplate) if err != nil { @@ -200,3 +271,218 @@ func createResource(projectRoot, fileName, fileTemplate string, data interface{} } return err } + +// deleteAllPipelineTemplates deletes all templates and pipeline resources that exists for a function +// and are stored in the .tekton directory +func deleteAllPipelineTemplates(f fn.Function) string { + err := os.RemoveAll(path.Join(f.Root, resourcesDirectory)) + if err != nil { + return fmt.Sprintf("\n %v", err) + } + + return "" +} + +func getTaskSpec(taskUrlTemplate string) (string, error) { + resp, err := http.Get(fmt.Sprintf(taskUrlTemplate, FuncRepoRef, FuncRepoBranchRef)) + if err != nil { + return "", err + } + defer resp.Body.Close() + var data map[string]any + dec := yaml.NewDecoder(resp.Body) + err = dec.Decode(&data) + if err != nil { + return "", err + } + data = map[string]any{ + "taskSpec": data["spec"], + } + var buff bytes.Buffer + enc := yaml.NewEncoder(&buff) + enc.SetIndent(2) + err = enc.Encode(data) + if err != nil { + return "", err + } + err = enc.Close() + if err != nil { + return "", err + } + return strings.ReplaceAll(buff.String(), "\n", "\n "), nil +} + +// createAndApplyPipelineTemplate creates and applies Pipeline template for a standard on-cluster build +// all resources are created on the fly, if there's a Pipeline defined in the project directory, it is used instead +func createAndApplyPipelineTemplate(f fn.Function, namespace string, labels map[string]string) error { + // If Git is set up create fetch task and reference it from build task, + // otherwise sources have been already uploaded to workspace PVC. + gitCloneTaskRef := "" + runAfterFetchSources := "" + if f.Build.Git.URL != "" { + runAfterFetchSources = runAfterFetchSourcesRef + gitCloneTaskRef = taskGitCloneTaskRef + } + + data := templateData{ + FunctionName: f.Name, + Annotations: f.Deploy.Annotations, + Labels: labels, + PipelineName: getPipelineName(f), + RunAfterFetchSources: runAfterFetchSources, + GitCloneTaskRef: gitCloneTaskRef, + } + + for _, val := range []struct { + ref string + field *string + }{ + {taskFuncBuildpacksPACPipelineRunRef, &data.FuncBuildpacksTaskRef}, + {taskFuncS2iPACPipelineRunRef, &data.FuncS2iTaskRef}, + {taskFuncDeployPACPipelineRunRef, &data.FuncDeployTaskRef}, + } { + ts, err := getTaskSpec(val.ref) + if err != nil { + return err + } + *val.field = ts + } + + var template string + if f.Build.Builder == builders.Pack { + template = packPipelineTemplate + } else if f.Build.Builder == builders.S2I { + template = s2iPipelineTemplate + } else { + return builders.ErrBuilderNotSupported{Builder: f.Build.Builder} + } + + return createAndApplyResource(f.Root, pipelineFileName, template, "pipeline", getPipelineName(f), namespace, data) +} + +// createAndApplyPipelineRunTemplate creates and applies PipelineRun template for a standard on-cluster build +// all resources are created on the fly, if there's a PipelineRun defined in the project directory, it is used instead +func createAndApplyPipelineRunTemplate(f fn.Function, namespace string, labels map[string]string) error { + contextDir := f.Build.Git.ContextDir + if contextDir == "" && f.Build.Builder == builders.S2I { + // TODO(lkingland): could instead update S2I to interpret empty string + // as cwd, such that builder-specific code can be kept out of here. + contextDir = "." + } + + pipelinesTargetBranch := f.Build.Git.Revision + if pipelinesTargetBranch == "" { + pipelinesTargetBranch = defaultPipelinesTargetBranch + } + + buildEnvs := []string{} + if len(f.Build.BuildEnvs) == 0 { + buildEnvs = []string{"="} + } else { + for i := range f.Build.BuildEnvs { + buildEnvs = append(buildEnvs, f.Build.BuildEnvs[i].KeyValuePair()) + } + } + + s2iImageScriptsUrl := defaultS2iImageScriptsUrl + if f.Runtime == "quarkus" { + s2iImageScriptsUrl = quarkusS2iImageScriptsUrl + } + + data := templateData{ + FunctionName: f.Name, + Annotations: f.Deploy.Annotations, + Labels: labels, + ContextDir: contextDir, + FunctionImage: f.Image, + Registry: f.Registry, + BuilderImage: getBuilderImage(f), + BuildEnvs: buildEnvs, + + PipelineName: getPipelineName(f), + PipelineRunName: getPipelineRunGenerateName(f), + PvcName: getPipelinePvcName(f), + SecretName: getPipelineSecretName(f), + + S2iImageScriptsUrl: s2iImageScriptsUrl, + + RepoUrl: f.Build.Git.URL, + Revision: pipelinesTargetBranch, + } + + var template string + if f.Build.Builder == builders.Pack { + template = packRunTemplate + } else if f.Build.Builder == builders.S2I { + template = s2iRunTemplate + } else { + return builders.ErrBuilderNotSupported{Builder: f.Build.Builder} + } + + return createAndApplyResource(f.Root, pipelineFileName, template, "pipelinerun", getPipelineRunGenerateName(f), namespace, data) +} + +// allows simple mocking in unit tests +var manifestivalClient = k8s.GetManifestivalClient + +// createAndApplyResource tries to create and apply a resource to the k8s cluster from the input template and data, +// if there's the same resource already created in the project directory, it is used instead +func createAndApplyResource(projectRoot, fileName, fileTemplate, kind, resourceName, namespace string, data interface{}) error { + var source manifestival.Source + + filePath := path.Join(projectRoot, resourcesDirectory, fileName) + if _, err := os.Stat(filePath); !os.IsNotExist(err) { + source = manifestival.Path(filePath) + } else { + tmpl, err := template.New("template").Parse(fileTemplate) + if err != nil { + return fmt.Errorf("error parsing template: %v", err) + } + + var buf bytes.Buffer + err = tmpl.Execute(&buf, data) + if err != nil { + return fmt.Errorf("error executing template: %v", err) + } + source = manifestival.Reader(&buf) + } + + client, err := manifestivalClient() + if err != nil { + return fmt.Errorf("error generating template: %v", err) + } + + m, err := manifestival.ManifestFrom(source, manifestival.UseClient(client)) + if err != nil { + return fmt.Errorf("error generating template: %v", err) + } + + resources := m.Resources() + if len(resources) != 1 { + return fmt.Errorf("error creating pipeline resources: there could be only a single resource in the template file %q", filePath) + } + + if strings.ToLower(resources[0].GetKind()) != kind { + return fmt.Errorf("error creating pipeline resources: expected resource kind in file %q is %q, but got %q", filePath, kind, resources[0].GetKind()) + } + + existingResourceName := resources[0].GetName() + if kind == "pipelinerun" { + existingResourceName = resources[0].GetGenerateName() + } + if existingResourceName != resourceName { + return fmt.Errorf("error creating pipeline resources: expected resource name in file %q is %q, but got %q", filePath, resourceName, existingResourceName) + } + + if resources[0].GetNamespace() != "" && resources[0].GetNamespace() != namespace { + return fmt.Errorf("error creating pipeline resources: expected resource namespace in file %q is %q, but got %q", filePath, namespace, resources[0].GetNamespace()) + } + + m, err = m.Transform(manifestival.InjectNamespace(namespace)) + if err != nil { + fmt.Printf("error procesing template: %v", err) + return err + } + + return m.Apply() +} diff --git a/pkg/pipelines/tekton/templates_pack.go b/pkg/pipelines/tekton/templates_pack.go index 8afb3392f9..8dde6ded51 100644 --- a/pkg/pipelines/tekton/templates_pack.go +++ b/pkg/pipelines/tekton/templates_pack.go @@ -1,17 +1,18 @@ package tekton const ( + // packPipelineTemplate contains the Buildpacks template used for both Tekton standard and PAC Pipeline packPipelineTemplate = ` apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: labels: {{range $key, $value := .Labels -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" {{end}} annotations: {{range $key, $value := .Annotations -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" {{end}} name: {{.PipelineName}} spec: @@ -40,18 +41,7 @@ spec: name: buildEnvs type: array tasks: - - name: fetch-sources - params: - - name: url - value: $(params.gitRepository) - - name: revision - value: $(params.gitRevision) - taskRef: - kind: Task - name: git-clone - workspaces: - - name: output - workspace: source-workspace + {{.GitCloneTaskRef}} - name: build params: - name: APP_IMAGE @@ -65,11 +55,8 @@ spec: - name: ENV_VARS value: - '$(params.buildEnvs[*])' - runAfter: - - fetch-sources - taskRef: - kind: Task - name: func-buildpacks + {{.RunAfterFetchSources}} + {{.FuncBuildpacksTaskRef}} workspaces: - name: source workspace: source-workspace @@ -81,11 +68,11 @@ spec: params: - name: path value: $(workspaces.source.path)/$(params.contextDir) + - name: image + value: $(params.imageName)@$(tasks.build.results.IMAGE_DIGEST) runAfter: - build - taskRef: - kind: Task - name: func-deploy + {{.FuncDeployTaskRef}} workspaces: - name: source workspace: source-workspace @@ -99,13 +86,64 @@ spec: optional: true ` + // packRunTemplate contains the Buildpacks template used for Tekton standard PipelineRun packRunTemplate = ` apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: labels: {{range $key, $value := .Labels -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" + {{end}} + tekton.dev/pipeline: {{.PipelineName}} + annotations: + # User defined Annotations + {{range $key, $value := .Annotations -}} + "{{$key}}": "{{$value}}" + {{end}} + generateName: {{.PipelineRunName}} +spec: + params: + - name: gitRepository + value: {{.RepoUrl}} + - name: gitRevision + value: {{.Revision}} + - name: contextDir + value: {{.ContextDir}} + - name: imageName + value: {{.FunctionImage}} + - name: registry + value: {{.Registry}} + - name: builderImage + value: {{.BuilderImage}} + - name: buildEnvs + value: + {{range .BuildEnvs -}} + - {{.}} + {{end}} + pipelineRef: + name: {{.PipelineName}} + workspaces: + - name: source-workspace + persistentVolumeClaim: + claimName: {{.PvcName}} + subPath: source + - name: cache-workspace + persistentVolumeClaim: + claimName: {{.PvcName}} + subPath: cache + - name: dockerconfig-workspace + secret: + secretName: {{.SecretName}} +` + // packRunTemplatePAC contains the Buildpacks template used for the Tekton PAC PipelineRun + packRunTemplatePAC = ` +apiVersion: tekton.dev/v1beta1 +kind: PipelineRun +metadata: + labels: + {{range $key, $value := .Labels -}} + "{{$key}}": "{{$value}}" {{end}} tekton.dev/pipeline: {{.PipelineName}} annotations: @@ -133,7 +171,7 @@ metadata: # User defined Annotations {{range $key, $value := .Annotations -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" {{end}} generateName: {{.PipelineRunName}} spec: diff --git a/pkg/pipelines/tekton/templates_s2i.go b/pkg/pipelines/tekton/templates_s2i.go index 875d043a95..b78fc47a90 100644 --- a/pkg/pipelines/tekton/templates_s2i.go +++ b/pkg/pipelines/tekton/templates_s2i.go @@ -1,17 +1,18 @@ package tekton const ( + // s2iPipelineTemplate contains the S2I template used for both Tekton standard and PAC Pipeline s2iPipelineTemplate = ` apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: labels: {{range $key, $value := .Labels -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" {{end}} annotations: {{range $key, $value := .Annotations -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" {{end}} name: {{.PipelineName}} spec: @@ -44,18 +45,7 @@ spec: type: string default: 'image:///usr/libexec/s2i' tasks: - - name: fetch-sources - params: - - name: url - value: $(params.gitRepository) - - name: revision - value: $(params.gitRevision) - taskRef: - kind: Task - name: git-clone - workspaces: - - name: output - workspace: source-workspace + {{.GitCloneTaskRef}} - name: build params: - name: IMAGE @@ -71,11 +61,8 @@ spec: - '$(params.buildEnvs[*])' - name: S2I_IMAGE_SCRIPTS_URL value: $(params.s2iImageScriptsUrl) - runAfter: - - fetch-sources - taskRef: - kind: Task - name: func-s2i + {{.RunAfterFetchSources}} + {{.FuncS2iTaskRef}} workspaces: - name: source workspace: source-workspace @@ -91,9 +78,7 @@ spec: value: $(params.imageName)@$(tasks.build.results.IMAGE_DIGEST) runAfter: - build - taskRef: - kind: Task - name: func-deploy + {{.FuncDeployTaskRef}} workspaces: - name: source workspace: source-workspace @@ -106,14 +91,66 @@ spec: name: dockerconfig-workspace optional: true ` - + // s2iRunTemplate contains the S2I template used for Tekton standard PipelineRun s2iRunTemplate = ` apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: labels: {{range $key, $value := .Labels -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" + {{end}} + tekton.dev/pipeline: {{.PipelineName}} + annotations: + # User defined Annotations + {{range $key, $value := .Annotations -}} + "{{$key}}": "{{$value}}" + {{end}} + generateName: {{.PipelineRunName}} +spec: + params: + - name: gitRepository + value: {{.RepoUrl}} + - name: gitRevision + value: {{.Revision}} + - name: contextDir + value: {{.ContextDir}} + - name: imageName + value: {{.FunctionImage}} + - name: registry + value: {{.Registry}} + - name: builderImage + value: {{.BuilderImage}} + - name: buildEnvs + value: + {{range .BuildEnvs -}} + - {{.}} + {{end}} + - name: s2iImageScriptsUrl + value: {{.S2iImageScriptsUrl}} + pipelineRef: + name: {{.PipelineName}} + workspaces: + - name: source-workspace + persistentVolumeClaim: + claimName: {{.PvcName}} + subPath: source + - name: cache-workspace + persistentVolumeClaim: + claimName: {{.PvcName}} + subPath: cache + - name: dockerconfig-workspace + secret: + secretName: {{.SecretName}} +` + // s2iRunTemplatePAC contains the S2I template used for Tekton PAC PipelineRun + s2iRunTemplatePAC = ` +apiVersion: tekton.dev/v1beta1 +kind: PipelineRun +metadata: + labels: + {{range $key, $value := .Labels -}} + "{{$key}}": "{{$value}}" {{end}} tekton.dev/pipeline: {{.PipelineName}} annotations: @@ -141,7 +178,7 @@ metadata: # User defined Annotations {{range $key, $value := .Annotations -}} - {{$key}}: {{$value}} + "{{$key}}": "{{$value}}" {{end}} generateName: {{.PipelineRunName}} spec: diff --git a/pkg/pipelines/tekton/templates_test.go b/pkg/pipelines/tekton/templates_test.go index 7f53a684d8..1ce07f3892 100644 --- a/pkg/pipelines/tekton/templates_test.go +++ b/pkg/pipelines/tekton/templates_test.go @@ -4,6 +4,9 @@ import ( "path/filepath" "testing" + "github.com/manifestival/manifestival" + "github.com/manifestival/manifestival/fake" + "knative.dev/func/pkg/builders" fn "knative.dev/func/pkg/functions" . "knative.dev/func/pkg/testing" @@ -16,7 +19,7 @@ const ( TestRegistry = "example.com/alice" ) -func Test_createPipelineTemplate(t *testing.T) { +func Test_createPipelineTemplatePAC(t *testing.T) { tests := []struct { name string root string @@ -57,14 +60,14 @@ func Test_createPipelineTemplate(t *testing.T) { f.Image = "docker.io/alice/" + f.Name f.Registry = TestRegistry - err = createPipelineTemplate(f) + err = createPipelineTemplatePAC(f, make(map[string]string)) if (err != nil) != tt.wantErr { t.Errorf("createPipelineTemplate() error = %v, wantErr %v", err, tt.wantErr) return } - fp := filepath.Join(root, resourcesDirectory, pipelineFileName) + fp := filepath.Join(root, resourcesDirectory, pipelineFileNamePAC) exists, err := FileExists(t, fp) if err != nil { t.Fatal(err) @@ -78,7 +81,7 @@ func Test_createPipelineTemplate(t *testing.T) { } } -func Test_createPipelineRunTemplate(t *testing.T) { +func Test_createPipelineRunTemplatePAC(t *testing.T) { tests := []struct { name string root string @@ -119,14 +122,14 @@ func Test_createPipelineRunTemplate(t *testing.T) { f.Image = "docker.io/alice/" + f.Name f.Registry = TestRegistry - err = createPipelineRunTemplate(f) + err = createPipelineRunTemplatePAC(f, make(map[string]string)) if (err != nil) != tt.wantErr { t.Errorf("createPipelineRunTemplate() error = %v, wantErr %v", err, tt.wantErr) return } - fp := filepath.Join(root, resourcesDirectory, pipelineRunFilenane) + fp := filepath.Join(root, resourcesDirectory, pipelineRunFilenamePAC) exists, err := FileExists(t, fp) if err != nil { t.Fatal(err) @@ -139,3 +142,189 @@ func Test_createPipelineRunTemplate(t *testing.T) { }) } } + +// testData are used by Test_createAndApplyPipelineTemplate() and Test_createAndApplyPipelineRunTemplate() +var testData = []struct { + name string + root string + builder string + runtime string + namespace string + labels map[string]string + wantErr bool +}{ + { + name: "correct - pack & node", + root: "testdata/testCreatePipelinePackNode", + runtime: "node", + builder: builders.Pack, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - pack & quarkus", + root: "testdata/testCreatePipelinePackQuarkus", + runtime: "quarkus", + builder: builders.Pack, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - pack & go", + root: "testdata/testCreatePipelinePackGo", + runtime: "go", + builder: builders.Pack, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - pack & python", + root: "testdata/testCreatePipelinePackPython", + runtime: "python", + builder: builders.Pack, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - pack & typescript", + root: "testdata/testCreatePipelinePackTypescript", + runtime: "typescript", + builder: builders.Pack, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - pack & springboot", + root: "testdata/testCreatePipelinePackSpringboot", + runtime: "springboot", + builder: builders.Pack, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - pack & rust", + root: "testdata/testCreatePipelinePackRust", + runtime: "rust", + builder: builders.Pack, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - s2i & node", + root: "testdata/testCreatePipelineS2INode", + runtime: "node", + builder: builders.S2I, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - s2i & quarkus", + root: "testdata/testCreatePipelineS2IQuarkus", + runtime: "quarkus", + builder: builders.S2I, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - s2i & go", + root: "testdata/testCreatePipelineS2IGo", + runtime: "go", + builder: builders.S2I, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - s2i & python", + root: "testdata/testCreatePipelineS2IPython", + runtime: "python", + builder: builders.S2I, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - s2i & typescript", + root: "testdata/testCreatePipelineS2ITypescript", + runtime: "typescript", + builder: builders.S2I, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - s2i & springboot", + root: "testdata/testCreatePipelineS2ISpringboot", + runtime: "springboot", + builder: builders.S2I, + namespace: "test-ns", + wantErr: false, + }, + { + name: "correct - s2i & rust", + root: "testdata/testCreatePipelineS2IRust", + runtime: "rust", + builder: builders.S2I, + namespace: "test-ns", + wantErr: false, + }, +} + +func Test_createAndApplyPipelineTemplate(t *testing.T) { + for _, tt := range testData { + t.Run(tt.name, func(t *testing.T) { + // save current function and restore it at the end + old := manifestivalClient + defer func() { manifestivalClient = old }() + + manifestivalClient = func() (manifestival.Client, error) { + return fake.New(), nil + } + + root := tt.root + defer Using(t, root)() + + f, err := fn.NewFunction(root) + if err != nil { + t.Fatal(err) + } + + f.Build.Builder = tt.builder + f.Runtime = tt.runtime + f.Image = "docker.io/alice/" + f.Name + f.Registry = TestRegistry + + if err := createAndApplyPipelineTemplate(f, tt.namespace, tt.labels); (err != nil) != tt.wantErr { + t.Errorf("createAndApplyPipelineTemplate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_createAndApplyPipelineRunTemplate(t *testing.T) { + for _, tt := range testData { + t.Run(tt.name, func(t *testing.T) { + // save current function and restore it at the end + old := manifestivalClient + defer func() { manifestivalClient = old }() + + manifestivalClient = func() (manifestival.Client, error) { + return fake.New(), nil + } + + root := tt.root + "Run" + defer Using(t, root)() + + f, err := fn.NewFunction(root) + if err != nil { + t.Fatal(err) + } + + f.Build.Builder = tt.builder + f.Runtime = tt.runtime + f.Image = "docker.io/alice/" + f.Name + f.Registry = TestRegistry + + if err := createAndApplyPipelineRunTemplate(f, tt.namespace, tt.labels); (err != nil) != tt.wantErr { + t.Errorf("createAndApplyPipelineRunTemplate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/pkg/pipelines/tekton/validate.go b/pkg/pipelines/tekton/validate.go index 16f4670291..9551654c12 100644 --- a/pkg/pipelines/tekton/validate.go +++ b/pkg/pipelines/tekton/validate.go @@ -5,6 +5,7 @@ import ( "fmt" "knative.dev/func/pkg/builders" + "knative.dev/func/pkg/builders/buildpacks" "knative.dev/func/pkg/builders/s2i" fn "knative.dev/func/pkg/functions" ) @@ -21,28 +22,36 @@ type ErrRuntimeNotSupported struct { } func (e ErrRuntimeNotSupported) Error() string { - return fmt.Sprintf("runtime %q is not supported for on cluster build", e.Runtime) + return fmt.Sprintf("runtime %q is not supported for on cluster build with default builders", e.Runtime) } -func validatePipeline(f fn.Function) error { +func validatePipeline(f fn.Function) (string, error) { + var warningMsg string if f.Build.Builder == builders.Pack { if f.Runtime == "" { - return ErrRuntimeRequired + return "", ErrRuntimeRequired } if f.Runtime == "go" || f.Runtime == "rust" { - return ErrRuntimeNotSupported{f.Runtime} + builder := f.Build.BuilderImages[builders.Pack] + defaultBuilder := buildpacks.DefaultBuilderImages[f.Runtime] + if builder != "" && builder != defaultBuilder { + warningMsg = fmt.Sprintf("runtime %q is not supported for on cluster build with default builders, "+ + "continuing with the custom builder provided", f.Runtime) + } else { + return "", ErrRuntimeNotSupported{f.Runtime} + } } if len(f.Build.Buildpacks) > 0 { - return ErrBuilpacksNotSupported + return "", ErrBuilpacksNotSupported } } else if f.Build.Builder == builders.S2I { _, err := s2i.BuilderImage(f, builders.S2I) - return err + return "", err } else { - return builders.ErrUnknownBuilder{Name: f.Build.Builder} + return "", builders.ErrUnknownBuilder{Name: f.Build.Builder} } - return nil + return warningMsg, nil } diff --git a/pkg/pipelines/tekton/validate_test.go b/pkg/pipelines/tekton/validate_test.go index 72f1b2a3db..2983bd6367 100644 --- a/pkg/pipelines/tekton/validate_test.go +++ b/pkg/pipelines/tekton/validate_test.go @@ -108,7 +108,7 @@ func Test_validatePipeline(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := validatePipeline(tt.function) + _, err := validatePipeline(tt.function) if (err != nil) != tt.wantErr { t.Errorf("validatePipeline() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/pkg/scaffolding/detectors.go b/pkg/scaffolding/detectors.go new file mode 100644 index 0000000000..9d0429c5c4 --- /dev/null +++ b/pkg/scaffolding/detectors.go @@ -0,0 +1,89 @@ +package scaffolding + +import ( + "errors" + "fmt" + "go/ast" + "go/parser" + "go/token" + "os" + "path/filepath" + "strings" +) + +// detector of method signatures. Each instance is for a given runtime. +type detector interface { + Detect(dir string) (static, instanced bool, err error) +} + +// newDetector returns a deector instance for the given runtime. +func newDetector(runtime string) (detector, error) { + switch runtime { + case "go": + return &goDetector{}, nil + case "python": + return &pythonDetector{}, nil + case "rust": + return nil, ErrDetectorNotImplemented{runtime} + case "node": + return nil, ErrDetectorNotImplemented{runtime} + case "typescript": + return nil, ErrDetectorNotImplemented{runtime} + case "quarkus": + return nil, ErrDetectorNotImplemented{runtime} + case "java": + return nil, ErrDetectorNotImplemented{runtime} + default: + return nil, ErrRuntimeNotRecognized{runtime} + } +} + +// GO + +type goDetector struct{} + +func (d goDetector) Detect(dir string) (static, instanced bool, err error) { + files, err := os.ReadDir(dir) + if err != nil { + return static, instanced, fmt.Errorf("signature detector encountered an error when scanning the function's source code. %w", err) + } + for _, file := range files { + filename := filepath.Join(dir, file.Name()) + if file.IsDir() || !strings.HasSuffix(filename, ".go") { + continue + } + if d.hasFunctionDeclaration(filename, "New") { + instanced = true + } + if d.hasFunctionDeclaration(filename, "Handle") { + static = true + } + } + return +} + +func (d goDetector) hasFunctionDeclaration(filename, function string) bool { + astFile, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.SkipObjectResolution) + if err != nil { + return false + } + for _, decl := range astFile.Decls { + if funcDecl, ok := decl.(*ast.FuncDecl); ok { + // Name matches and it has no reciver. I.e. a package level function + if funcDecl.Name.Name == function && funcDecl.Recv == nil { + return true + } + } + } + return false +} + +// PYTHON + +type pythonDetector struct{} + +func (d pythonDetector) Detect(dir string) (bool, bool, error) { + return false, false, errors.New("the Python method signature detector is not yet available") +} + +// TODO: Other Detectors diff --git a/pkg/scaffolding/detectors_test.go b/pkg/scaffolding/detectors_test.go new file mode 100644 index 0000000000..e04ca30171 --- /dev/null +++ b/pkg/scaffolding/detectors_test.go @@ -0,0 +1,145 @@ +//go:build !integration +// +build !integration + +package scaffolding + +import ( + "errors" + "os" + "path/filepath" + "testing" + + . "knative.dev/func/pkg/testing" +) + +// TestDetector_Go ensures that the go language detector will correctly +// identify the signature to expect of a function's source. +func TestDetector_Go(t *testing.T) { + // NOTE: + // The detector need only check the function's name; not the entire signature + // because invocation hint (http vs cloudevent) is available in the + // function's metadata, and the detector needs to be as simple as possible + // while fulfilling its purpose of detecting which signature is _expected_ + // of the source code, not whether or not it actually does: that's the job + // of the compiler later. This detection is used to determine which + // scaffolding code needs to be written to get the user to a proper + // complile attempt. + tests := []struct { + Name string // Name of the test + Sig Signature // Signature Expected + Err error // Error Expected + Inv string // invocation hint; "http" (default) or "cloudevent" + Src string // Source code to check + }{ + { + Name: "Instanced HTTP", + Sig: InstancedHTTP, + Err: nil, + Src: ` +package f + +func New() { } + `}, + { + Name: "Static HTTP", + Sig: StaticHTTP, + Err: nil, + Src: ` +package f + +func Handle() { } + `}, + { + Name: "Instanced Cloudevents", + Sig: InstancedCloudevents, + Err: nil, + Inv: "cloudevent", // Invoke is the only place Cloudevents is singular + Src: ` +package f +func New() { } + `}, + { + Name: "Static Cloudevents", + Sig: StaticCloudevents, + Err: nil, + Inv: "cloudevent", + Src: ` +package f +func Handle() { } + `}, + { + Name: "Static and Instanced - error", + Sig: UnknownSignature, + Err: errors.New("error expected"), // TODO: typed error and err.Is/As + Src: ` +package f +func Handle() { } +func New() { } + `}, + { + Name: "No Signatures Found - error", + Sig: UnknownSignature, + Err: errors.New("error expected"), // TODO: typed error and err.Is/As + Src: ` +package f +// Intentionally Blank + `}, + { + Name: "Comments Ignored", + Sig: StaticHTTP, + Err: nil, + Src: ` +package f +/* +This comment block would cause the function to be detected as instanced +without the use of the language parser. + +func New() + +*/ +func Handle() { } + `}, + { + Name: "Instanced with Handler", + Sig: InstancedHTTP, + Err: nil, + Src: ` +package f + +type F struct{} + +func New() *F { return &F{} } + +func (f *MyFunction) Handle() {} + `}, + } + + for _, test := range tests { + t.Run(test.Name, func(t *testing.T) { + + root, cleanup := Mktemp(t) + defer cleanup() + + if err := os.WriteFile(filepath.Join(root, "function.go"), []byte(test.Src), os.ModePerm); err != nil { + t.Fatal(err) + } + + s, err := detectSignature(root, "go", test.Inv) + if err != nil && test.Err == nil { + t.Fatalf("unexpected error. %v", err) + } + + if test.Err != nil { + if err == nil { + t.Fatal("expected error not received") + } else { + t.Logf("received expected error: %v", err) + } + } + + if s != test.Sig { + t.Fatalf("Expected signature '%v', got '%v'", test.Sig, s) + } + }) + } +} diff --git a/pkg/scaffolding/errors.go b/pkg/scaffolding/errors.go new file mode 100644 index 0000000000..2062107ecb --- /dev/null +++ b/pkg/scaffolding/errors.go @@ -0,0 +1,38 @@ +package scaffolding + +import "fmt" + +type ScaffoldingError struct { + Msg string + Err error +} + +func (e ScaffoldingError) Error() string { + if e.Msg != "" { + return fmt.Sprintf("scaffolding error. %v. %v", e.Msg, e.Err) + } + return fmt.Sprintf("scaffolding error %v", e.Err) +} + +func (e ScaffoldingError) Unwrap() error { + return e.Err +} + +var ErrScaffoldingNotFound = ScaffoldingError{"scaffolding not found", nil} +var ErrSignatureNotFound = ScaffoldingError{"supported signature not found", nil} + +type ErrDetectorNotImplemented struct { + Runtime string +} + +func (e ErrDetectorNotImplemented) Error() string { + return fmt.Sprintf("the %v signature detector is not yet available", e.Runtime) +} + +type ErrRuntimeNotRecognized struct { + Runtime string +} + +func (e ErrRuntimeNotRecognized) Error() string { + return fmt.Sprintf("signature not found. The runtime %v is not recognized", e.Runtime) +} diff --git a/pkg/scaffolding/scaffold.go b/pkg/scaffolding/scaffold.go new file mode 100644 index 0000000000..89e4b9673e --- /dev/null +++ b/pkg/scaffolding/scaffold.go @@ -0,0 +1,95 @@ +package scaffolding + +import ( + "fmt" + "os" + "path/filepath" + + "knative.dev/func/pkg/filesystem" +) + +// Write scaffolding to a given path +// +// Scaffolding is a language-level operation which first detects the method +// signature used by the function's source code and then writes the +// appropriate scaffolding. +// +// NOTE: Scaffoding is not per-template, because a template is merely an +// example starting point for a Function implementation and should have no +// bearing on the shape that function can eventually take. The language, +// and optionally invocation hint (For cloudevents) are used for this. For +// example, there can be multiple templates which exemplify a given method +// signature, and the implementation can be switched at any time by the author. +// Language, by contrast, is fixed at time of initialization. +// +// out: the path to output scaffolding +// src: the path to the source code to scaffold +// runtime: the expected runtime of the target source code "go", "node" etc. +// invoke: the optional invocatin hint (default "http") +// fs: filesytem which contains scaffolding at '[runtime]/scaffolding' +// (exclusive with 'repo') +func Write(out, src, runtime, invoke string, fs filesystem.Filesystem) (err error) { + + // detect the signature of the source code in the given location, presuming + // a runtime and invocation hint (default "http") + s, err := detectSignature(src, runtime, invoke) + if err != nil { + return err + } + + // Path in the filesystem at which scaffolding is expected to exist + d := fmt.Sprintf("%v/scaffolding/%v", runtime, s.String()) // fs uses / on all OSs + if _, err := fs.Stat(d); err != nil { + return ErrScaffoldingNotFound + } + + // Copy from d -> out from the filesystem + if err := filesystem.CopyFromFS(d, out, fs); err != nil { + return ScaffoldingError{"filesystem copy failed", err} + } + + // Copy the certs from the filesystem to the build directory + if _, err := fs.Stat("certs"); err != nil { + return ScaffoldingError{"certs directory not found in filesystem", err} + } + if err := filesystem.CopyFromFS("certs", out, fs); err != nil { + return ScaffoldingError{"certs copy failed", err} + } + + // Replace the 'f' link of the scaffolding (which is now incorrect) to + // link to the function's root. + rel, err := filepath.Rel(out, src) + if err != nil { + return ScaffoldingError{"error determining relative path to function source", err} + } + link := filepath.Join(out, "f") + _ = os.Remove(link) + if err = os.Symlink(rel, link); err != nil { + return fmt.Errorf("error linking scaffolding to source %w", err) + } + return +} + +// detectSignature returns the Signature of the source code at the given +// location assuming a provided runtime and invocation hint. +func detectSignature(src, runtime, invoke string) (s Signature, err error) { + d, err := newDetector(runtime) + if err != nil { + return UnknownSignature, err + } + static, instanced, err := d.Detect(src) + if err != nil { + return + } + // Function must implement either a static handler or the instanced handler + // but not both. + if static && instanced { + return s, fmt.Errorf("function may not implement both the static and instanced method signatures simultaneously") + } else if !static && !instanced { + return s, fmt.Errorf("function does not implement any known method signatures or does not compile") + } else if instanced { + return toSignature(true, invoke), nil + } else { + return toSignature(false, invoke), nil + } +} diff --git a/pkg/scaffolding/scaffold_test.go b/pkg/scaffolding/scaffold_test.go new file mode 100644 index 0000000000..b3d49440f8 --- /dev/null +++ b/pkg/scaffolding/scaffold_test.go @@ -0,0 +1,169 @@ +//go:build !integration +// +build !integration + +package scaffolding + +import ( + "errors" + "os" + "path/filepath" + "testing" + + "knative.dev/func/pkg/filesystem" + + . "knative.dev/func/pkg/testing" +) + +// TestWrite_RuntimeErrors ensures that known runtimes which are not +// yet implemented return a "not yet available" message, and unrecognized +// runtimes state as much. +func TestWrite_RuntimeErrors(t *testing.T) { + tests := []struct { + Runtime string + Expected any + }{ + {"go", nil}, + {"python", nil}, + {"rust", &ErrDetectorNotImplemented{}}, + {"node", &ErrDetectorNotImplemented{}}, + {"typescript", &ErrDetectorNotImplemented{}}, + {"quarkus", &ErrDetectorNotImplemented{}}, + {"java", &ErrDetectorNotImplemented{}}, + {"other", &ErrRuntimeNotRecognized{}}, + } + for _, test := range tests { + t.Run(test.Runtime, func(t *testing.T) { + // Since runtime validation during signature detection is the very first + // thing that occurs, we can elide most of the setup and pass zero + // values for source directory, output directory and invocation. + // This may need to be expanded in the event the Write function is + // expanded to have more preconditions. + err := Write("", "", test.Runtime, "", nil) + if test.Expected != nil && err == nil { + t.Fatalf("expected runtime %v to yield a detection error", test.Runtime) + } + if test.Expected != nil && !errors.As(err, test.Expected) { + t.Fatalf("did not receive expected error type for %v runtime.", test.Runtime) + } + t.Logf("ok: %v", err) + }) + } +} + +// TestWrite ensures that the Write method writes Scaffolding to the given +// destination. This is a fairly shallow test. See the Scaffolding and +// Detector tests for more depth. +func TestWrite(t *testing.T) { + // The filesystem containing scaffolding is expected to conform to the + // structure: + // /[language]/scaffolding/["instanced"|"static"]-[invocation] + // ex: + // "./go/scaffolding/instanced-http/main.go" + cwd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + fs := filesystem.NewOsFilesystem(filepath.Join(cwd, "testdata", "testwrite")) + + root, done := Mktemp(t) + defer done() + + // Write out a test implementation that will result in the InstancedHTTP + // signature being detected. + impl := ` +package f + +type F struct{} + +func New() *F { return nil } +` + err = os.WriteFile(filepath.Join(root, "f.go"), []byte(impl), os.ModePerm) + if err != nil { + t.Fatal(err) + } + + // The output destination for the scaffolding + out := filepath.Join(root, "out") + + // Write Scaffolding to + err = Write( + out, // output directory + root, // source code location + "go", // Runtime + "", // optional invocation hint (http is the default) + fs) // The filesystem from which the scaffolding should be pulled + if err != nil { + t.Fatal(err) + } + + // Assert there exists a main.go (from the testdata scaffolding filesystem). + if _, err = os.Stat(filepath.Join(root, "out", "main.go")); err != nil { + t.Fatal(err) + } + + // Assert there exists a symbolic link to the source code + root, err = filepath.EvalSymlinks(root) // dereference any current symlinks + if err != nil { + t.Fatal(err) + } + target, err := filepath.EvalSymlinks(filepath.Join(out, "f")) + if err != nil { + t.Fatal(err) + } + if target != root { + t.Fatalf("scaffolding symlink should be:\n%v\n But got target:\n%v", root, target) + } + +} + +// TestWrite_ScaffoldingNotFound ensures that a typed error is returned +// when scaffolding is not found. +func TestWrite_ScaffoldingNotFound(t *testing.T) { + cwd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + fs := filesystem.NewOsFilesystem(filepath.Join(cwd, "testdata", "testnotfound")) + + root, done := Mktemp(t) + defer done() + + impl := ` +package f + +type F struct{} + +func New() *F { return nil } +` + err = os.WriteFile(filepath.Join(root, "f.go"), []byte(impl), os.ModePerm) + if err != nil { + t.Fatal(err) + } + + out := filepath.Join(root, "out") + + err = Write(out, root, "go", "", fs) + if err == nil { + t.Fatal("did not receive expected error") + } + if !errors.Is(err, ErrScaffoldingNotFound) { + t.Fatalf("error received was not ErrScaffoldingNotFound. %v", err) + } +} + +// TestNewScaffoldingError ensures that a scaffolding error wraps its +// underlying error such that callers can use errors.Is/As. +func TestNewScaffoldingError(t *testing.T) { + + // exampleError that would come from something scaffolding employs to + // accomplish a task + var ExampleError = errors.New("example error") + + err := ScaffoldingError{"some ExampleError", ExampleError} + + if !errors.Is(err, ExampleError) { + t.Fatalf("type ScaffoldingError does not wrap errors.") + } + t.Logf("ok: %v", err) + +} diff --git a/pkg/scaffolding/signatures.go b/pkg/scaffolding/signatures.go new file mode 100644 index 0000000000..6ef35032bb --- /dev/null +++ b/pkg/scaffolding/signatures.go @@ -0,0 +1,47 @@ +package scaffolding + +type Signature int + +const ( + UnknownSignature Signature = iota + InstancedHTTP + InstancedCloudevents + StaticHTTP + StaticCloudevents +) + +func (s Signature) String() string { + return []string{ + "unknown", + "instanced-http", + "instanced-cloudevents", + "static-http", + "static-cloudevents", + }[s] +} + +// Note that in all places other than the invocation hint (where singular +// is logically correct) "cloudevents" is plural in all places (variables, +// imports, enums etc) to match the Cloudevents library and organization's +// choice. +var signatureMap = map[bool]map[string]Signature{ + true: { + "http": InstancedHTTP, + "cloudevent": InstancedCloudevents}, + false: { + "http": StaticHTTP, + "cloudevent": StaticCloudevents}, +} + +// toSignature converts an instanced boolean and invocation hint into +// a Signature enum. +func toSignature(instanced bool, invoke string) Signature { + if invoke == "" { + invoke = "http" + } + s, ok := signatureMap[instanced][invoke] + if !ok { + return UnknownSignature + } + return s +} diff --git a/pkg/scaffolding/signatures_test.go b/pkg/scaffolding/signatures_test.go new file mode 100644 index 0000000000..f2eb87e277 --- /dev/null +++ b/pkg/scaffolding/signatures_test.go @@ -0,0 +1,59 @@ +package scaffolding + +import ( + "fmt" + "testing" +) + +// TestSignatures ensures that the enum of signatures is properly formed. +// - The correct signature enum is returned from ToSignature +// - The string method is correctly indexed +// - "http" is the default for invocation hint +func TestSignatures(t *testing.T) { + + // This is a brute-force implementation which simply runs the logic in + // reverse. Basically just checking ones work when the enum is modified. + + tests := []struct { + instanced bool // signatures are brodly classified into instanced or static + invocation string // the invocation hint (default is "http") + expectedEnum Signature // the expected enum + expectedName string // the expected string + }{ + {true, "", InstancedHTTP, "instanced-http"}, + {true, "http", InstancedHTTP, "instanced-http"}, + {true, "cloudevent", InstancedCloudevents, "instanced-cloudevents"}, + {false, "", StaticHTTP, "static-http"}, + {false, "http", StaticHTTP, "static-http"}, + {false, "cloudevent", StaticCloudevents, "static-cloudevents"}, + {true, "invalid", UnknownSignature, "unknown"}, + {false, "invalid", UnknownSignature, "unknown"}, + } + + testName := func(instanced bool, invocation string) string { + instancedString := "instanced" + if !instanced { + instancedString = "static" + } + invocationString := "default" + if invocation != "" { + invocationString = invocation + } + return fmt.Sprintf("%v-%v", instancedString, invocationString) + } + + for _, test := range tests { + t.Run(testName(test.instanced, test.invocation), func(t *testing.T) { + + signature := toSignature(test.instanced, test.invocation) + + if signature != test.expectedEnum { + t.Fatal("enum incorrectly mapped.") + } + if signature.String() != test.expectedName { + t.Fatal("string representation incorrectly mapped") + } + + }) + } +} diff --git a/pkg/scaffolding/testdata/testnotfound/go/README.md b/pkg/scaffolding/testdata/testnotfound/go/README.md new file mode 100644 index 0000000000..1d2c2dbf08 --- /dev/null +++ b/pkg/scaffolding/testdata/testnotfound/go/README.md @@ -0,0 +1,3 @@ +# TestNotFound + +An example of a template runtime directory which lacks scaffolding. diff --git a/pkg/scaffolding/testdata/testwrite/certs/README.md b/pkg/scaffolding/testdata/testwrite/certs/README.md new file mode 100644 index 0000000000..6d75be9055 --- /dev/null +++ b/pkg/scaffolding/testdata/testwrite/certs/README.md @@ -0,0 +1,11 @@ +# Test Certs + +This directory mocks the existence of a 'certs' directory peer to the various +languages in the templates directory. This directory is required for the +error-free execution of Scaffolding Write tests, since it is used to +create the certificates container layer. + +The actual certs used are located in templates/certs, and are refreshed +by running `make certs` or by running a `make clean` +before a `make`. + diff --git a/pkg/scaffolding/testdata/testwrite/certs/ca-certificates.crt b/pkg/scaffolding/testdata/testwrite/certs/ca-certificates.crt new file mode 100644 index 0000000000..6b93dc34f8 --- /dev/null +++ b/pkg/scaffolding/testdata/testwrite/certs/ca-certificates.crt @@ -0,0 +1,3363 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue May 30 03:12:04 2023 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.29. +## SHA256: c47475103fb05bb562bbadff0d1e72346b03236154e1448a6ca191b740f83507 +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM +BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x +MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw +MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM +LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C +Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 +P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge +oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp +k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z +fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ +gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 +UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 +1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s +bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr +dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf +ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl +u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq +erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj +MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ +vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI +Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y +wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG +A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK +Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 +MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv +bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX +SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz +iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf +jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim +5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe +sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj +0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ +JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u +y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h ++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG +xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID +AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN +AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw +W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld +y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov ++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc +eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw +9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 +nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY +hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB +60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G4 +========================================= +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu +bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D +umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV +3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds +8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ +e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 +ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X +xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV +7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW +Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n +MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q +jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht +7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK +YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt +jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ +m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW +RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA +JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G ++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT +kcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 +zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf +LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq +stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o +WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ +OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 +Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE +uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm ++9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj +ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H +PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H +ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla +4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R +vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd +zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O +856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH +Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu +3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 +NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv +bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg +Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw +MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw +EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz +BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv +T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv +B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse +zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM +VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j +7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z +JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe +8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO +Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ +UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx +j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt +dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM +5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb +5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 +EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H +hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy +g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 +r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG +EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew +HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY +QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p +fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 +HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 +fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt +g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 +NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk +fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ +P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY +njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK +HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL +LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s +ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K +h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 +CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA +4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo +WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj +6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT +OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck +bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG +A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj +dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw +NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD +ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz +2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b +bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 +NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd +gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW +VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f +Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ +juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas +DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS +VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI +04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl +0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd +Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY +YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp +adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x +xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP +jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM +MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z +ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r +AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +E-Tugra Global Root CA RSA v3 +============================= +-----BEGIN CERTIFICATE----- +MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ +BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb +BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290 +IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU +UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF +LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg +djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx +jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL +sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF +/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q +QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw +bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6 +04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB +eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM +bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg +h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1 +LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ +gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4 +38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q +ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s +SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY +sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl +DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X +nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH +IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX +YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ +-----END CERTIFICATE----- + +E-Tugra Global Root CA ECC v3 +============================= +-----BEGIN CERTIFICATE----- +MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV +BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB +IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP +MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 +Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2 +w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31 +Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ +zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W +Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 +-----END CERTIFICATE----- + +Security Communication RootCA3 +============================== +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw +IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD +b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw +CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE +AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r +hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE +NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 +/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm +npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY +XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK +p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC +3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf +GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw +CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu +Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O +H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx +YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ +XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml ++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn +KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 +dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm +6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- diff --git a/pkg/scaffolding/testdata/testwrite/go/scaffolding/instanced-http/main.go b/pkg/scaffolding/testdata/testwrite/go/scaffolding/instanced-http/main.go new file mode 100644 index 0000000000..a3dd973f06 --- /dev/null +++ b/pkg/scaffolding/testdata/testwrite/go/scaffolding/instanced-http/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World!") +} diff --git a/schema/func_yaml-schema.json b/schema/func_yaml-schema.json index 81d1157643..8d9924a158 100644 --- a/schema/func_yaml-schema.json +++ b/schema/func_yaml-schema.json @@ -86,6 +86,10 @@ "$schema": "http://json-schema.org/draft-04/schema#", "$ref": "#/definitions/HealthEndpoints", "description": "Health endpoints specified by the language pack" + }, + "serviceAccountName": { + "type": "string", + "description": "ServiceAccountName is the name of the service account used for the\nfunction pod. The service account must exist in the namespace to\nsucceed.\nMore info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/" } }, "additionalProperties": false, @@ -122,8 +126,6 @@ "Function": { "required": [ "specVersion", - "registry", - "image", "created" ], "properties": { @@ -150,11 +152,11 @@ }, "image": { "type": "string", - "description": "Optional full OCI image tag in form:\n [registry]/[namespace]/[name]:[tag]\nexample:\n quay.io/alice/my.function.name\nRegistry is optional and is defaulted to DefaultRegistry\nexample:\n alice/my.function.name\nIf Image is provided, it overrides the default of concatenating\n\"Registry+Name:latest\" to derive the Image." + "description": "Image is the full OCI image tag in form:\n [registry]/[namespace]/[name]:[tag]\nexample:\n quay.io/alice/my.function.name\nRegistry is optional and is defaulted to DefaultRegistry\nexample:\n alice/my.function.name\nIf Image is provided, it overrides the default of concatenating\n\"Registry+Name:latest\" to derive the Image." }, "imageDigest": { "type": "string", - "description": "SHA256 hash of the latest image that has been built" + "description": "ImageDigest is the SHA256 hash of the latest image that has been built" }, "created": { "type": "string", @@ -168,17 +170,17 @@ "build": { "$schema": "http://json-schema.org/draft-04/schema#", "$ref": "#/definitions/BuildSpec", - "description": "BuildSpec define the build properties for a function" + "description": "Build defines the build properties for a function" }, "run": { "$schema": "http://json-schema.org/draft-04/schema#", "$ref": "#/definitions/RunSpec", - "description": "RunSpec define the runtime properties for a function" + "description": "Run defines the runtime properties for a function" }, "deploy": { "$schema": "http://json-schema.org/draft-04/schema#", "$ref": "#/definitions/DeploySpec", - "description": "DeploySpec define the deployment properties for a function" + "description": "Deploy defines the deployment properties for a function" } }, "additionalProperties": false, @@ -321,6 +323,10 @@ }, "type": "array", "description": "Env variables to be set" + }, + "startTimeout": { + "type": "integer", + "description": "StartTimeout specifies that this function should have a custom timeout\nwhen starting. This setting is currently respected by the host runner,\nwith containerized docker runner and deployed Knative service integration\nin development." } }, "additionalProperties": false, diff --git a/templates/README.md b/templates/README.md index 3bf4997686..c26815a543 100644 --- a/templates/README.md +++ b/templates/README.md @@ -1,9 +1,26 @@ # Templates +Contains all example source code, scaffolding, certificates and metadata used +by func when creating and building function instances. + +To rebuild run `make templates` (which caches). To force a full rebuild run +`make clean && make` + +## Layout + +Each directory within `templates` corresponds to a known language runtime. +The `certs` directory is a reserved word containing root SSL certificates. +Each directory within a runtime directory corresponds to a named templaate. +The `scaffolding` directory within the runtime directory is a reserved word +containing the adapter code that converts a function with a given method +signature into a service by way of the external function runtime libraries. + ## Packaging -When updates are made to these templates, they must be packaged (serialized as a Go byte array) -by running `make generate/zz_filesystem_generated.go`, and checking in the resultant `./generate/zz_filesystem_generated.go` file. +When updates are made to these templates, they must be packaged (serialized as +a Go byte array) by running `make templates` (which rebuilds +`generate/zz_filesystem_generated.go`, and checking in the resultant +`./generate/zz_filesystem_generated.go` file. ## How it works diff --git a/templates/certs/README.md b/templates/certs/README.md new file mode 100644 index 0000000000..b4e7fc4e5d --- /dev/null +++ b/templates/certs/README.md @@ -0,0 +1,8 @@ +# Certs + +This directory contains the SSL root certificates used when creating +function images. + +The certs can be updated by running `make certs` or by running `make clean` +before `make`. + diff --git a/templates/certs/ca-certificates.crt b/templates/certs/ca-certificates.crt new file mode 100644 index 0000000000..6b93dc34f8 --- /dev/null +++ b/templates/certs/ca-certificates.crt @@ -0,0 +1,3363 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue May 30 03:12:04 2023 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.29. +## SHA256: c47475103fb05bb562bbadff0d1e72346b03236154e1448a6ca191b740f83507 +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM +BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x +MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw +MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM +LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C +Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 +P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge +oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp +k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z +fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ +gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 +UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 +1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s +bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr +dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf +ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl +u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq +erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj +MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ +vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI +Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y +wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG +A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK +Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 +MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv +bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX +SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz +iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf +jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim +5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe +sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj +0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ +JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u +y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h ++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG +xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID +AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN +AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw +W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld +y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov ++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc +eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw +9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 +nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY +hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB +60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G4 +========================================= +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu +bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D +umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV +3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds +8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ +e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 +ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X +xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV +7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW +Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n +MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q +jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht +7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK +YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt +jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ +m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW +RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA +JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G ++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT +kcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 +zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf +LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq +stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o +WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ +OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 +Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE +uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm ++9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj +ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H +PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H +ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla +4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R +vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd +zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O +856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH +Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu +3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 +NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv +bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg +Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw +MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw +EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz +BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv +T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv +B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse +zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM +VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j +7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z +JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe +8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO +Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ +UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx +j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt +dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM +5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb +5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 +EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H +hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy +g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 +r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG +EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew +HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY +QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p +fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 +HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 +fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt +g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 +NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk +fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ +P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY +njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK +HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL +LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s +ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K +h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 +CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA +4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo +WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj +6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT +OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck +bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG +A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj +dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw +NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD +ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz +2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b +bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 +NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd +gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW +VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f +Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ +juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas +DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS +VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI +04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl +0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd +Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY +YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp +adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x +xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP +jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM +MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z +ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r +AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +E-Tugra Global Root CA RSA v3 +============================= +-----BEGIN CERTIFICATE----- +MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ +BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb +BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290 +IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU +UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF +LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg +djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx +jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL +sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF +/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q +QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw +bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6 +04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB +eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM +bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg +h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1 +LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ +gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4 +38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q +ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s +SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY +sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl +DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X +nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH +IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX +YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ +-----END CERTIFICATE----- + +E-Tugra Global Root CA ECC v3 +============================= +-----BEGIN CERTIFICATE----- +MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV +BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB +IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP +MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 +Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2 +w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31 +Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ +zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W +Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 +-----END CERTIFICATE----- + +Security Communication RootCA3 +============================== +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw +IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD +b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw +CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE +AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r +hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE +NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 +/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm +npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY +XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK +p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC +3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf +GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw +CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu +Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O +H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx +YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ +XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml ++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn +KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 +dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm +6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- diff --git a/templates/go/.instanced-cloudevent/README.md b/templates/go/.instanced-cloudevents/README.md similarity index 100% rename from templates/go/.instanced-cloudevent/README.md rename to templates/go/.instanced-cloudevents/README.md diff --git a/templates/go/.instanced-cloudevent/function.go b/templates/go/.instanced-cloudevents/function.go similarity index 100% rename from templates/go/.instanced-cloudevent/function.go rename to templates/go/.instanced-cloudevents/function.go diff --git a/templates/go/.instanced-cloudevent/function_test.go b/templates/go/.instanced-cloudevents/function_test.go similarity index 100% rename from templates/go/.instanced-cloudevent/function_test.go rename to templates/go/.instanced-cloudevents/function_test.go diff --git a/templates/go/.instanced-cloudevent/go.mod b/templates/go/.instanced-cloudevents/go.mod similarity index 100% rename from templates/go/.instanced-cloudevent/go.mod rename to templates/go/.instanced-cloudevents/go.mod diff --git a/templates/go/.instanced-cloudevent/manifest.yaml b/templates/go/.instanced-cloudevents/manifest.yaml similarity index 100% rename from templates/go/.instanced-cloudevent/manifest.yaml rename to templates/go/.instanced-cloudevents/manifest.yaml diff --git a/templates/go/manifest.yaml b/templates/go/manifest.yaml deleted file mode 100644 index 18f9818e3c..0000000000 --- a/templates/go/manifest.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# Optional list of additional Buildpacks to be applied to the language pack's -# builder image when the Function is built using a Buildpack builder. -buildpacks: - - paketo-buildpacks/go-dist - - ghcr.io/boson-project/go-function-buildpack:tip diff --git a/templates/go/scaffolding/instanced-cloudevent/f b/templates/go/scaffolding/instanced-cloudevent/f deleted file mode 120000 index f31a4c4131..0000000000 --- a/templates/go/scaffolding/instanced-cloudevent/f +++ /dev/null @@ -1 +0,0 @@ -../../.instanced-cloudevent \ No newline at end of file diff --git a/templates/go/scaffolding/instanced-cloudevent/go.mod b/templates/go/scaffolding/instanced-cloudevent/go.mod deleted file mode 100644 index e52063e8df..0000000000 --- a/templates/go/scaffolding/instanced-cloudevent/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module s - -replace f => ./f - -go 1.19 - -require ( - f v0.0.0-00010101000000-000000000000 - github.com/lkingland/func-runtimes/go v0.0.0-20230403054747-5fbec20313d5 -) - -require ( - github.com/cloudevents/sdk-go/v2 v2.13.0 // indirect - github.com/google/uuid v1.1.1 // indirect - github.com/json-iterator/go v1.1.10 // indirect - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect - github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect - go.uber.org/atomic v1.4.0 // indirect - go.uber.org/multierr v1.1.0 // indirect - go.uber.org/zap v1.10.0 // indirect -) diff --git a/templates/go/scaffolding/instanced-cloudevent/go.sum b/templates/go/scaffolding/instanced-cloudevent/go.sum deleted file mode 100644 index 3000e4c124..0000000000 --- a/templates/go/scaffolding/instanced-cloudevent/go.sum +++ /dev/null @@ -1,49 +0,0 @@ -github.com/cloudevents/sdk-go/v2 v2.5.0/go.mod h1:nlXhgFkf0uTopxmRXalyMwS2LG70cRGPrxzmjJgSG0U= -github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw= -github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lkingland/func-runtimes/go v0.0.0-20230403054747-5fbec20313d5 h1:OLIHfxRualqZEdAktFhHlU0IoKVNqNwTCO2X1eht65g= -github.com/lkingland/func-runtimes/go v0.0.0-20230403054747-5fbec20313d5/go.mod h1:339P4Ba/ZC8UxY8yYo+XkqvvnFNYhLtN2A3hpKsGZXA= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/templates/go/scaffolding/instanced-cloudevent/main.go b/templates/go/scaffolding/instanced-cloudevent/main.go deleted file mode 100644 index 084a1df9e3..0000000000 --- a/templates/go/scaffolding/instanced-cloudevent/main.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "fmt" - "os" - - ce "github.com/lkingland/func-runtimes/go/cloudevents" - - f "f" -) - -func main() { - if err := ce.Start(f.New()); err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) - } -} diff --git a/templates/go/scaffolding/instanced-cloudevents/f b/templates/go/scaffolding/instanced-cloudevents/f new file mode 120000 index 0000000000..938aed251d --- /dev/null +++ b/templates/go/scaffolding/instanced-cloudevents/f @@ -0,0 +1 @@ +../../.instanced-cloudevents \ No newline at end of file diff --git a/templates/go/scaffolding/instanced-cloudevents/go.mod b/templates/go/scaffolding/instanced-cloudevents/go.mod new file mode 100644 index 0000000000..a1b3439b46 --- /dev/null +++ b/templates/go/scaffolding/instanced-cloudevents/go.mod @@ -0,0 +1,21 @@ +module s + +replace f => ./f + +go 1.19 + +require ( + f v0.0.0-00010101000000-000000000000 + github.com/knative-sandbox/func-go v0.18.2 +) + +require ( + github.com/cloudevents/sdk-go/v2 v2.14.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.24.0 // indirect +) diff --git a/templates/go/scaffolding/instanced-cloudevents/go.sum b/templates/go/scaffolding/instanced-cloudevents/go.sum new file mode 100644 index 0000000000..9eef100a17 --- /dev/null +++ b/templates/go/scaffolding/instanced-cloudevents/go.sum @@ -0,0 +1,63 @@ +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= +github.com/cloudevents/sdk-go/v2 v2.14.0 h1:Nrob4FwVgi5L4tV9lhjzZcjYqFVyJzsA56CwPaPfv6s= +github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/knative-sandbox/func-go v0.18.1 h1:PkOsWmgefI130mJBmozFkanBmHGt1Eam6CxXN4GrImQ= +github.com/knative-sandbox/func-go v0.18.1/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/knative-sandbox/func-go v0.18.2 h1:uwGrpFXcchEtfr2CLHIXYHnrw3vIyHWjIs/QSX2zwbc= +github.com/knative-sandbox/func-go v0.18.2/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/templates/go/scaffolding/instanced-cloudevents/main.go b/templates/go/scaffolding/instanced-cloudevents/main.go new file mode 100644 index 0000000000..ad84e0a661 --- /dev/null +++ b/templates/go/scaffolding/instanced-cloudevents/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "fmt" + "os" + + ce "github.com/knative-sandbox/func-go/cloudevents" + + f "f" +) + +func main() { + if err := ce.Start(f.New()); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } +} diff --git a/templates/go/scaffolding/instanced-http/go.mod b/templates/go/scaffolding/instanced-http/go.mod index c4d31b4646..968b8bc25d 100644 --- a/templates/go/scaffolding/instanced-http/go.mod +++ b/templates/go/scaffolding/instanced-http/go.mod @@ -4,6 +4,14 @@ replace f => ./f go 1.19 -require f v0.0.0-00010101000000-000000000000 +require ( + f v0.0.0-00010101000000-000000000000 + github.com/knative-sandbox/func-go v0.18.2 +) -require github.com/lkingland/func-runtimes/go v0.0.0-20230404115549-fe2343822c3c +require ( + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/rs/zerolog v1.29.1 // indirect + golang.org/x/sys v0.10.0 // indirect +) diff --git a/templates/go/scaffolding/instanced-http/go.sum b/templates/go/scaffolding/instanced-http/go.sum index a802d21da9..83902c9a50 100644 --- a/templates/go/scaffolding/instanced-http/go.sum +++ b/templates/go/scaffolding/instanced-http/go.sum @@ -1,6 +1,25 @@ -github.com/lkingland/func-runtimes/go v0.0.0-20230331021437-a8c5bfbe75cb h1:orlTxxyV1B9KwwtMhHRjGPprt943iRdGuxG+90U3taI= -github.com/lkingland/func-runtimes/go v0.0.0-20230331021437-a8c5bfbe75cb/go.mod h1:ELN4ppasVTq8+wvD6cxgg0i9AlfM4OMKj0tCkmdOXZg= -github.com/lkingland/func-runtimes/go v0.0.0-20230331062015-1284f990e1cf h1:TUEougaNZ4UQTpQS/GwJ3/PVX8kZmsd9KLke2DdEgOk= -github.com/lkingland/func-runtimes/go v0.0.0-20230331062015-1284f990e1cf/go.mod h1:339P4Ba/ZC8UxY8yYo+XkqvvnFNYhLtN2A3hpKsGZXA= -github.com/lkingland/func-runtimes/go v0.0.0-20230404115549-fe2343822c3c h1:ReQC6FGb/RxY7CyL/NX1loX7z/lsJZY3munSXzEEmII= -github.com/lkingland/func-runtimes/go v0.0.0-20230404115549-fe2343822c3c/go.mod h1:339P4Ba/ZC8UxY8yYo+XkqvvnFNYhLtN2A3hpKsGZXA= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/knative-sandbox/func-go v0.18.1 h1:PkOsWmgefI130mJBmozFkanBmHGt1Eam6CxXN4GrImQ= +github.com/knative-sandbox/func-go v0.18.1/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/knative-sandbox/func-go v0.18.2 h1:uwGrpFXcchEtfr2CLHIXYHnrw3vIyHWjIs/QSX2zwbc= +github.com/knative-sandbox/func-go v0.18.2/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/templates/go/scaffolding/instanced-http/main.go b/templates/go/scaffolding/instanced-http/main.go index aa616d340a..98e9a9adf0 100644 --- a/templates/go/scaffolding/instanced-http/main.go +++ b/templates/go/scaffolding/instanced-http/main.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/lkingland/func-runtimes/go/http" + "github.com/knative-sandbox/func-go/http" f "f" ) diff --git a/templates/go/scaffolding/static-cloudevent/go.mod b/templates/go/scaffolding/static-cloudevent/go.mod deleted file mode 100644 index e52063e8df..0000000000 --- a/templates/go/scaffolding/static-cloudevent/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module s - -replace f => ./f - -go 1.19 - -require ( - f v0.0.0-00010101000000-000000000000 - github.com/lkingland/func-runtimes/go v0.0.0-20230403054747-5fbec20313d5 -) - -require ( - github.com/cloudevents/sdk-go/v2 v2.13.0 // indirect - github.com/google/uuid v1.1.1 // indirect - github.com/json-iterator/go v1.1.10 // indirect - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect - github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect - go.uber.org/atomic v1.4.0 // indirect - go.uber.org/multierr v1.1.0 // indirect - go.uber.org/zap v1.10.0 // indirect -) diff --git a/templates/go/scaffolding/static-cloudevent/go.sum b/templates/go/scaffolding/static-cloudevent/go.sum deleted file mode 100644 index bbf94b8e69..0000000000 --- a/templates/go/scaffolding/static-cloudevent/go.sum +++ /dev/null @@ -1,52 +0,0 @@ -github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw= -github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lkingland/func-runtimes/go v0.0.0-20230403054747-5fbec20313d5 h1:OLIHfxRualqZEdAktFhHlU0IoKVNqNwTCO2X1eht65g= -github.com/lkingland/func-runtimes/go v0.0.0-20230403054747-5fbec20313d5/go.mod h1:339P4Ba/ZC8UxY8yYo+XkqvvnFNYhLtN2A3hpKsGZXA= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/templates/go/scaffolding/static-cloudevent/main.go b/templates/go/scaffolding/static-cloudevent/main.go deleted file mode 100644 index 010ac4e141..0000000000 --- a/templates/go/scaffolding/static-cloudevent/main.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "fmt" - "os" - - ce "github.com/lkingland/func-runtimes/go/cloudevents" - - f "f" -) - -func main() { - if err := ce.Start(ce.DefaultHandler{f.Handle}); err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) - } -} diff --git a/templates/go/scaffolding/static-cloudevent/f b/templates/go/scaffolding/static-cloudevents/f similarity index 100% rename from templates/go/scaffolding/static-cloudevent/f rename to templates/go/scaffolding/static-cloudevents/f diff --git a/templates/go/scaffolding/static-cloudevents/go.mod b/templates/go/scaffolding/static-cloudevents/go.mod new file mode 100644 index 0000000000..a1b3439b46 --- /dev/null +++ b/templates/go/scaffolding/static-cloudevents/go.mod @@ -0,0 +1,21 @@ +module s + +replace f => ./f + +go 1.19 + +require ( + f v0.0.0-00010101000000-000000000000 + github.com/knative-sandbox/func-go v0.18.2 +) + +require ( + github.com/cloudevents/sdk-go/v2 v2.14.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.24.0 // indirect +) diff --git a/templates/go/scaffolding/static-cloudevents/go.sum b/templates/go/scaffolding/static-cloudevents/go.sum new file mode 100644 index 0000000000..be7faec58d --- /dev/null +++ b/templates/go/scaffolding/static-cloudevents/go.sum @@ -0,0 +1,60 @@ +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/cloudevents/sdk-go/v2 v2.5.0/go.mod h1:nlXhgFkf0uTopxmRXalyMwS2LG70cRGPrxzmjJgSG0U= +github.com/cloudevents/sdk-go/v2 v2.14.0 h1:Nrob4FwVgi5L4tV9lhjzZcjYqFVyJzsA56CwPaPfv6s= +github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/knative-sandbox/func-go v0.18.1 h1:PkOsWmgefI130mJBmozFkanBmHGt1Eam6CxXN4GrImQ= +github.com/knative-sandbox/func-go v0.18.1/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/knative-sandbox/func-go v0.18.2 h1:uwGrpFXcchEtfr2CLHIXYHnrw3vIyHWjIs/QSX2zwbc= +github.com/knative-sandbox/func-go v0.18.2/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/templates/go/scaffolding/static-cloudevents/main.go b/templates/go/scaffolding/static-cloudevents/main.go new file mode 100644 index 0000000000..ee94de0e53 --- /dev/null +++ b/templates/go/scaffolding/static-cloudevents/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "fmt" + "os" + + ce "github.com/knative-sandbox/func-go/cloudevents" + + f "f" +) + +func main() { + if err := ce.Start(ce.DefaultHandler{Handler: f.Handle}); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } +} diff --git a/templates/go/scaffolding/static-http/go.mod b/templates/go/scaffolding/static-http/go.mod index c4d31b4646..968b8bc25d 100644 --- a/templates/go/scaffolding/static-http/go.mod +++ b/templates/go/scaffolding/static-http/go.mod @@ -4,6 +4,14 @@ replace f => ./f go 1.19 -require f v0.0.0-00010101000000-000000000000 +require ( + f v0.0.0-00010101000000-000000000000 + github.com/knative-sandbox/func-go v0.18.2 +) -require github.com/lkingland/func-runtimes/go v0.0.0-20230404115549-fe2343822c3c +require ( + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/rs/zerolog v1.29.1 // indirect + golang.org/x/sys v0.10.0 // indirect +) diff --git a/templates/go/scaffolding/static-http/go.sum b/templates/go/scaffolding/static-http/go.sum index a802d21da9..83902c9a50 100644 --- a/templates/go/scaffolding/static-http/go.sum +++ b/templates/go/scaffolding/static-http/go.sum @@ -1,6 +1,25 @@ -github.com/lkingland/func-runtimes/go v0.0.0-20230331021437-a8c5bfbe75cb h1:orlTxxyV1B9KwwtMhHRjGPprt943iRdGuxG+90U3taI= -github.com/lkingland/func-runtimes/go v0.0.0-20230331021437-a8c5bfbe75cb/go.mod h1:ELN4ppasVTq8+wvD6cxgg0i9AlfM4OMKj0tCkmdOXZg= -github.com/lkingland/func-runtimes/go v0.0.0-20230331062015-1284f990e1cf h1:TUEougaNZ4UQTpQS/GwJ3/PVX8kZmsd9KLke2DdEgOk= -github.com/lkingland/func-runtimes/go v0.0.0-20230331062015-1284f990e1cf/go.mod h1:339P4Ba/ZC8UxY8yYo+XkqvvnFNYhLtN2A3hpKsGZXA= -github.com/lkingland/func-runtimes/go v0.0.0-20230404115549-fe2343822c3c h1:ReQC6FGb/RxY7CyL/NX1loX7z/lsJZY3munSXzEEmII= -github.com/lkingland/func-runtimes/go v0.0.0-20230404115549-fe2343822c3c/go.mod h1:339P4Ba/ZC8UxY8yYo+XkqvvnFNYhLtN2A3hpKsGZXA= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/knative-sandbox/func-go v0.18.1 h1:PkOsWmgefI130mJBmozFkanBmHGt1Eam6CxXN4GrImQ= +github.com/knative-sandbox/func-go v0.18.1/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/knative-sandbox/func-go v0.18.2 h1:uwGrpFXcchEtfr2CLHIXYHnrw3vIyHWjIs/QSX2zwbc= +github.com/knative-sandbox/func-go v0.18.2/go.mod h1:QDKfq6BotMkLL/mppdVfwGnZzZz4FvxfzSqJa414sB4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/templates/go/scaffolding/static-http/main.go b/templates/go/scaffolding/static-http/main.go index a23aae797d..8ad3b5a34c 100644 --- a/templates/go/scaffolding/static-http/main.go +++ b/templates/go/scaffolding/static-http/main.go @@ -4,13 +4,13 @@ import ( "fmt" "os" - "github.com/lkingland/func-runtimes/go/http" + "github.com/knative-sandbox/func-go/http" f "f" ) func main() { - if err := http.Start(http.DefaultHandler{f.Handle}); err != nil { + if err := http.Start(http.DefaultHandler{Handler: f.Handle}); err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) } diff --git a/templates/node/cloudevents/package-lock.json b/templates/node/cloudevents/package-lock.json index fe41196c5b..608acd08fe 100644 --- a/templates/node/cloudevents/package-lock.json +++ b/templates/node/cloudevents/package-lock.json @@ -9,11 +9,11 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "cloudevents": "^6.0.4", - "faas-js-runtime": "^1.1.0" + "cloudevents": "^7.0.1", + "faas-js-runtime": "^2.2.2" }, "devDependencies": { - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "supertest": "^6.3.1", "tape": "^4.13.0" } @@ -34,16 +34,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "node_modules/@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "dependencies": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "node_modules/abbrev": { @@ -188,6 +188,14 @@ } ] }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -247,6 +255,14 @@ "ieee754": "^1.2.1" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -287,18 +303,19 @@ } }, "node_modules/cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" }, "engines": { - "node": ">=12 <20.0.0" + "node": ">=16 <=20" } }, "node_modules/combined-stream": { @@ -314,11 +331,11 @@ } }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/component-emitter": { @@ -411,6 +428,14 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -514,25 +539,26 @@ } }, "node_modules/faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "dependencies": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" }, "bin": { "faas-js-runtime": "bin/cli.js" }, "engines": { - "node": "^18 || ^16 || ^14" + "node": "^20 || ^18 || ^16" } }, "node_modules/fast-content-type-parse": { @@ -564,17 +590,17 @@ } }, "node_modules/fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "node_modules/fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", "engines": { "node": ">=6" } @@ -591,25 +617,47 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "node_modules/fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "dependencies": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "node_modules/fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "dependencies": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "url": "https://github.com/Eomm/fastify-raw-body?sponsor=1" } }, "node_modules/fastq": { @@ -633,9 +681,9 @@ } }, "node_modules/find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -834,6 +882,32 @@ "node": ">=8" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1125,15 +1199,23 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "dependencies": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -1230,19 +1312,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "node_modules/nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, - "hasInstallScript": true, "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -1251,7 +1332,7 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", @@ -1282,15 +1363,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1426,9 +1498,9 @@ } }, "node_modules/pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -1456,9 +1528,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "node_modules/process": { "version": "0.11.10", @@ -1511,9 +1583,9 @@ } }, "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -1529,15 +1601,30 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1665,15 +1752,20 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -1689,6 +1781,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -1703,24 +1800,15 @@ } }, "node_modules/simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/sonic-boom": { @@ -1739,6 +1827,22 @@ "node": ">= 10.x" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", @@ -1872,9 +1976,9 @@ "dev": true }, "node_modules/tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==", "engines": { "node": ">=12" } @@ -1891,6 +1995,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -1923,6 +2035,14 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2023,16 +2143,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "requires": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "abbrev": { @@ -2136,6 +2256,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2175,6 +2300,11 @@ "ieee754": "^1.2.1" } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2201,12 +2331,13 @@ } }, "cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "requires": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" @@ -2222,9 +2353,9 @@ } }, "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==" }, "component-emitter": { "version": "1.3.0", @@ -2296,6 +2427,11 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -2374,19 +2510,20 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "requires": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" } }, "fast-content-type-parse": { @@ -2418,17 +2555,17 @@ } }, "fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "requires": { "fast-decode-uri-component": "^1.0.1" } }, "fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==" }, "fast-safe-stringify": { "version": "2.1.1", @@ -2442,25 +2579,41 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "requires": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "requires": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" } }, "fastq": { @@ -2481,9 +2634,9 @@ } }, "find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "requires": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -2624,6 +2777,26 @@ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2805,15 +2978,23 @@ "argparse": "^2.0.1" } }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "requires": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -2889,18 +3070,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -2927,12 +3108,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3031,9 +3206,9 @@ "dev": true }, "pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -3058,9 +3233,9 @@ } }, "pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "process": { "version": "0.11.10", @@ -3101,9 +3276,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "requires": { "side-channel": "^1.0.4" } @@ -3113,15 +3288,27 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, "readdirp": { @@ -3204,15 +3391,20 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -3222,6 +3414,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3233,20 +3430,12 @@ } }, "simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "requires": { - "semver": "~7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "semver": "^7.5.3" } }, "sonic-boom": { @@ -3262,6 +3451,19 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string.prototype.trim": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", @@ -3373,9 +3575,9 @@ "dev": true }, "tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==" }, "to-regex-range": { "version": "5.0.1", @@ -3386,6 +3588,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -3412,6 +3619,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/templates/node/cloudevents/package.json b/templates/node/cloudevents/package.json index 5df8a593ef..dbe85e5200 100644 --- a/templates/node/cloudevents/package.json +++ b/templates/node/cloudevents/package.json @@ -13,12 +13,12 @@ "debug": "nodemon --inspect ./node_modules/faas-js-runtime/bin/cli.js ./index.js" }, "devDependencies": { - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "supertest": "^6.3.1", "tape": "^4.13.0" }, "dependencies": { - "cloudevents": "^6.0.4", - "faas-js-runtime": "^1.1.0" + "cloudevents": "^7.0.1", + "faas-js-runtime": "^2.2.2" } } diff --git a/templates/node/http/package-lock.json b/templates/node/http/package-lock.json index 55e6f02af7..fb72812b55 100644 --- a/templates/node/http/package-lock.json +++ b/templates/node/http/package-lock.json @@ -9,10 +9,10 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "faas-js-runtime": "^1.1.0" + "faas-js-runtime": "^2.2.2" }, "devDependencies": { - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "supertest": "^6.3.1", "tape": "^5.0.1" } @@ -33,16 +33,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "node_modules/@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "dependencies": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "node_modules/abbrev": { @@ -187,6 +187,14 @@ } ] }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -246,6 +254,14 @@ "ieee754": "^1.2.1" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -286,18 +302,19 @@ } }, "node_modules/cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" }, "engines": { - "node": ">=12 <20.0.0" + "node": ">=16 <=20" } }, "node_modules/combined-stream": { @@ -313,11 +330,11 @@ } }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/component-emitter": { @@ -425,6 +442,14 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -534,25 +559,26 @@ } }, "node_modules/faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "dependencies": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" }, "bin": { "faas-js-runtime": "bin/cli.js" }, "engines": { - "node": "^18 || ^16 || ^14" + "node": "^20 || ^18 || ^16" } }, "node_modules/fast-content-type-parse": { @@ -584,17 +610,17 @@ } }, "node_modules/fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "node_modules/fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", "engines": { "node": ">=6" } @@ -611,25 +637,47 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "node_modules/fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "dependencies": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "node_modules/fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "dependencies": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "url": "https://github.com/Eomm/fastify-raw-body?sponsor=1" } }, "node_modules/fastq": { @@ -653,9 +701,9 @@ } }, "node_modules/find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -839,6 +887,32 @@ "node": ">=8" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1140,15 +1214,23 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "dependencies": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -1245,19 +1327,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "node_modules/nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, - "hasInstallScript": true, "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -1266,7 +1347,7 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", @@ -1291,15 +1372,6 @@ "node": ">=4" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1435,9 +1507,9 @@ } }, "node_modules/pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -1465,9 +1537,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "node_modules/process": { "version": "0.11.10", @@ -1520,9 +1592,9 @@ } }, "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -1538,15 +1610,30 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1640,6 +1727,25 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", @@ -1656,15 +1762,20 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -1680,6 +1791,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -1694,24 +1810,15 @@ } }, "node_modules/simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/sonic-boom": { @@ -1730,6 +1837,22 @@ "node": ">= 10.x" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", @@ -1856,9 +1979,9 @@ "dev": true }, "node_modules/tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==", "engines": { "node": ">=12" } @@ -1875,6 +1998,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -1907,6 +2038,14 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2022,16 +2161,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "requires": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "abbrev": { @@ -2135,6 +2274,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2174,6 +2318,11 @@ "ieee754": "^1.2.1" } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2200,12 +2349,13 @@ } }, "cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "requires": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" @@ -2221,9 +2371,9 @@ } }, "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==" }, "component-emitter": { "version": "1.3.0", @@ -2312,6 +2462,11 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -2399,19 +2554,20 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "requires": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" } }, "fast-content-type-parse": { @@ -2443,17 +2599,17 @@ } }, "fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "requires": { "fast-decode-uri-component": "^1.0.1" } }, "fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==" }, "fast-safe-stringify": { "version": "2.1.1", @@ -2467,25 +2623,41 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "requires": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "requires": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" } }, "fastq": { @@ -2506,9 +2678,9 @@ } }, "find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "requires": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -2640,6 +2812,26 @@ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2825,15 +3017,23 @@ "argparse": "^2.0.1" } }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "requires": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -2909,18 +3109,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -2941,12 +3141,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3045,9 +3239,9 @@ "dev": true }, "pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -3072,9 +3266,9 @@ } }, "pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "process": { "version": "0.11.10", @@ -3115,9 +3309,9 @@ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "requires": { "side-channel": "^1.0.4" } @@ -3127,15 +3321,27 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, "readdirp": { @@ -3201,6 +3407,11 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "safe-regex2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", @@ -3214,15 +3425,20 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -3232,6 +3448,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3243,20 +3464,12 @@ } }, "simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "requires": { - "semver": "~7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "semver": "^7.5.3" } }, "sonic-boom": { @@ -3272,6 +3485,19 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string.prototype.trim": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", @@ -3377,9 +3603,9 @@ "dev": true }, "tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==" }, "to-regex-range": { "version": "5.0.1", @@ -3390,6 +3616,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -3416,6 +3647,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/templates/node/http/package.json b/templates/node/http/package.json index 1bc39d0950..a30f670935 100644 --- a/templates/node/http/package.json +++ b/templates/node/http/package.json @@ -12,10 +12,10 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "faas-js-runtime": "^1.1.0" + "faas-js-runtime": "^2.2.2" }, "devDependencies": { - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "supertest": "^6.3.1", "tape": "^5.0.1" } diff --git a/templates/quarkus/cloudevents/pom.xml b/templates/quarkus/cloudevents/pom.xml index 1324141f43..ecc967a3b2 100644 --- a/templates/quarkus/cloudevents/pom.xml +++ b/templates/quarkus/cloudevents/pom.xml @@ -12,7 +12,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.0.3.Final + 3.2.2.Final true 3.0.0-M7 diff --git a/templates/quarkus/http/pom.xml b/templates/quarkus/http/pom.xml index 1324141f43..ecc967a3b2 100644 --- a/templates/quarkus/http/pom.xml +++ b/templates/quarkus/http/pom.xml @@ -12,7 +12,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.0.3.Final + 3.2.2.Final true 3.0.0-M7 diff --git a/templates/rust/cloudevents/Cargo.lock b/templates/rust/cloudevents/Cargo.lock index 409f8876c8..20659ac97f 100644 --- a/templates/rust/cloudevents/Cargo.lock +++ b/templates/rust/cloudevents/Cargo.lock @@ -4,19 +4,19 @@ version = 3 [[package]] name = "actix-codec" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ "bitflags", "bytes", "futures-core", "futures-sink", - "log", "memchr", "pin-project-lite", "tokio", "tokio-util", + "tracing", ] [[package]] @@ -30,7 +30,7 @@ dependencies = [ "actix-service", "actix-utils", "ahash 0.8.3", - "base64 0.21.0", + "base64 0.21.2", "bitflags", "brotli", "bytes", @@ -43,7 +43,7 @@ dependencies = [ "http", "httparse", "httpdate", - "itoa 1.0.6", + "itoa", "language-tags", "local-channel", "mime", @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ "quote", - "syn 1.0.72", + "syn 1.0.109", ] [[package]] @@ -156,7 +156,7 @@ dependencies = [ "futures-core", "futures-util", "http", - "itoa 1.0.6", + "itoa", "language-tags", "log", "mime", @@ -168,7 +168,7 @@ dependencies = [ "serde_urlencoded", "smallvec", "socket2", - "time 0.3.20", + "time 0.3.22", "url", ] @@ -181,7 +181,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 1.0.72", + "syn 1.0.109", ] [[package]] @@ -215,37 +215,52 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "alloc-no-stdlib" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "async-trait" -version = "0.1.50" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 1.0.72", + "syn 2.0.18", ] [[package]] @@ -262,15 +277,15 @@ checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" @@ -294,9 +309,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -304,21 +319,21 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" -version = "1.0.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytestring" -version = "1.0.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" +checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ "bytes", ] @@ -340,15 +355,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ - "libc", - "num-integer", + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", "serde", - "time 0.1.43", + "time 0.1.45", + "wasm-bindgen", "winapi", ] @@ -390,24 +407,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", - "time 0.3.20", + "time 0.3.22", "version_check", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] @@ -430,26 +453,27 @@ checksum = "ee7e7ea0dba407429d816e8e38dda1a467cd74737722f2ccc8eae60429a1a3ab" dependencies = [ "proc-macro2", "quote", - "syn 1.0.72", + "syn 1.0.109", ] [[package]] name = "derive_more" -version = "0.99.14" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7b9cef1e351660e5443924e4f43ab25fbbed3e9a5f052df3677deb4d6b320" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 1.0.72", + "rustc_version", + "syn 1.0.109", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -463,9 +487,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "encoding_rs" -version = "0.8.28" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] @@ -485,9 +509,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", @@ -506,13 +530,11 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.20" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ - "cfg-if", "crc32fast", - "libc", "miniz_oxide", ] @@ -524,11 +546,10 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ - "matches", "percent-encoding", ] @@ -536,22 +557,19 @@ dependencies = [ name = "function" version = "0.1.0" dependencies = [ - "actix-http", "actix-rt", "actix-web", "cloudevents-sdk", "env_logger", "log", - "regex", "serde_json", - "tokio", ] [[package]] name = "futures" -version = "0.3.15" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -580,9 +598,9 @@ checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.15" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -603,7 +621,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.12", + "syn 2.0.18", ] [[package]] @@ -638,9 +656,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -648,20 +666,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "h2" -version = "0.3.16" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" dependencies = [ "bytes", "fnv", @@ -678,15 +696,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" dependencies = [ "libc", ] @@ -716,7 +734,7 @@ checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", - "itoa 1.0.6", + "itoa", ] [[package]] @@ -737,22 +755,44 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" -version = "0.2.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.6.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -760,9 +800,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.1", "libc", @@ -771,9 +811,9 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256017f749ab3117e93acb91063009e1f1bb56d03965b14c2c8df4eb02c524d8" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", @@ -781,12 +821,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "itoa" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" - [[package]] name = "itoa" version = "1.0.6" @@ -804,9 +838,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.51" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] @@ -817,23 +851,17 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" -version = "0.2.140" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "local-channel" @@ -855,9 +883,9 @@ checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -865,12 +893,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "match_cfg" @@ -878,80 +903,63 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" - [[package]] name = "memchr" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys", ] -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi 0.1.18", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "parking_lot" @@ -965,15 +973,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-targets", ] [[package]] @@ -984,9 +992,9 @@ checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1002,30 +1010,30 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.54" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -1062,18 +1070,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.8" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.6.0" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick", "memchr", @@ -1082,15 +1090,24 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.27" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] [[package]] name = "rustix" -version = "0.37.5" +version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e78cc525325c06b4a7ff02db283472f3c042b7ff0c391f96c6d5ac6f4f91b75" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags", "errno", @@ -1102,9 +1119,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "scopeguard" @@ -1112,45 +1129,51 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + [[package]] name = "serde" -version = "1.0.126" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 1.0.72", + "syn 2.0.18", ] [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ - "itoa 0.4.7", + "itoa", "ryu", "serde", ] [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.7", + "itoa", "ryu", "serde", ] @@ -1168,24 +1191,27 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.3" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "snafu" @@ -1205,7 +1231,7 @@ checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.72", + "syn 1.0.109", ] [[package]] @@ -1220,20 +1246,20 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.72" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "syn" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -1242,30 +1268,31 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "time" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] [[package]] name = "time" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" dependencies = [ - "itoa 1.0.6", + "itoa", "serde", "time-core", "time-macros", @@ -1273,39 +1300,39 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" dependencies = [ "time-core", ] [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg", "bytes", @@ -1320,9 +1347,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -1334,9 +1361,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.35" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "log", @@ -1346,9 +1373,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1361,52 +1388,42 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "url" -version = "2.2.2" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", "serde", ] [[package]] name = "uuid" -version = "1.3.0" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" dependencies = [ "getrandom", ] @@ -1417,6 +1434,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1425,9 +1448,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.74" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1435,24 +1458,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.74" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", - "syn 1.0.72", + "syn 2.0.18", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.74" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1460,28 +1483,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.74" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 1.0.72", + "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.74" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "web-sys" -version = "0.3.51" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", @@ -1518,20 +1541,29 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1544,45 +1576,45 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zstd" @@ -1595,9 +1627,9 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "6.0.4+zstd.1.5.4" +version = "6.0.5+zstd.1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7afb4b54b8910cf5447638cb54bf4e8a65cbedd783af98b98c62ffe91f185543" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" dependencies = [ "libc", "zstd-sys", @@ -1605,9 +1637,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.7+zstd.1.5.4" +version = "2.0.8+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94509c3ba2fe55294d752b79842c530ccfab760192521df74a081a78d2b3c7f5" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" dependencies = [ "cc", "libc", diff --git a/templates/rust/cloudevents/Cargo.toml b/templates/rust/cloudevents/Cargo.toml index 36d200d433..d4d5f6f51b 100644 --- a/templates/rust/cloudevents/Cargo.toml +++ b/templates/rust/cloudevents/Cargo.toml @@ -1,21 +1,20 @@ - [package] name = "function" version = "0.1.0" -edition = "2018" +edition = "2021" + +[profile.release] +codegen-units = 1 +debug = 0 +incremental = true +lto = true +opt-level = "z" +strip = "symbols" [dependencies] -cloudevents-sdk = { version = "0.7.0", features = ["actix"] } -actix-web = "4.3.1" actix-rt = "2.8.0" -serde_json = "1" -log = "0.4.0" +actix-web = "4.3.1" +cloudevents-sdk = { version = "0.7.0", features = ["actix"] } env_logger = "0.10.0" -regex = "1.5.5" -tokio = "1.8.4" -actix-http = "3.3.1" - -[dev-dependencies] -regex = "1.5.5" -tokio = "1.8.4" -actix-http = "3.3.1" +log = "0.4.18" +serde_json = "1.0.96" diff --git a/templates/rust/cloudevents/src/config.rs b/templates/rust/cloudevents/src/config.rs index 4dffd0ae19..8aa198fdce 100644 --- a/templates/rust/cloudevents/src/config.rs +++ b/templates/rust/cloudevents/src/config.rs @@ -1,4 +1,5 @@ -use actix_web::{web::{self, Data}}; +use actix_web::web::{Data, ServiceConfig}; +use log::info; /// Run custom configuration as part of the application building /// process. @@ -6,7 +7,7 @@ use actix_web::{web::{self, Data}}; /// This function should contain all custom configuration for your function application. /// /// ```rust -/// fn configure(cfg: &mut web::ServiceConfig) { +/// fn configure(cfg: &mut ServiceConfig) { /// let db_driver = my_db(); /// cfg.data(db_driver.clone()); /// } @@ -17,12 +18,12 @@ use actix_web::{web::{self, Data}}; /// ```rust /// pub async fn handle( /// event: Event, -/// driver: web::Data, +/// driver: Data, /// ) -> Result { /// Ok(Event::default()) /// } -pub fn configure(cfg: &mut web::ServiceConfig) { - log::info!("Configuring service"); +pub fn configure(cfg: &mut ServiceConfig) { + info!("Configuring service"); cfg.app_data(Data::new(HandlerConfig::default())); } @@ -34,7 +35,7 @@ pub struct HandlerConfig { impl Default for HandlerConfig { fn default() -> HandlerConfig { HandlerConfig { - name: String::from("world"), + name: "world".into(), } } } diff --git a/templates/rust/cloudevents/src/handler.rs b/templates/rust/cloudevents/src/handler.rs index 0126a0665d..b8b03a5572 100644 --- a/templates/rust/cloudevents/src/handler.rs +++ b/templates/rust/cloudevents/src/handler.rs @@ -1,5 +1,5 @@ use crate::config::HandlerConfig; -use actix_web::web; +use actix_web::{error::ErrorInternalServerError, web}; use cloudevents::{event::Data, Event, EventBuilder, EventBuilderV10}; use log::info; use serde_json::{from_slice, from_str, json}; @@ -23,7 +23,7 @@ pub async fn handle( .ty("func.example") .data("application/json", json!({ "hello": input["name"] })) .build() - .map_err(actix_web::error::ErrorInternalServerError) + .map_err(ErrorInternalServerError) } #[cfg(test)] diff --git a/templates/rust/cloudevents/src/main.rs b/templates/rust/cloudevents/src/main.rs index 853ba4f0c7..084ce35aa7 100644 --- a/templates/rust/cloudevents/src/main.rs +++ b/templates/rust/cloudevents/src/main.rs @@ -1,15 +1,22 @@ use actix_web::{web, App, HttpResponse, HttpServer}; -use env_logger as elog; +use env_logger::{Builder, Env}; +use std::{ + env, + io::{Error, ErrorKind, Result}, + num::ParseIntError, +}; mod config; mod handler; #[actix_web::main] -async fn main() -> std::io::Result<()> { - elog::Builder::from_env(elog::Env::default().default_filter_or("info,actix_web=warn")).init(); +async fn main() -> Result<()> { + Builder::from_env(Env::default().default_filter_or("info,actix_web=warn")).init(); - let port: u16 = match std::env::var("PORT") { - Ok(v) => v.parse().unwrap(), + let port = match env::var("PORT") { + Ok(v) => v + .parse() + .map_err(|e: ParseIntError| Error::new(ErrorKind::Other, e.to_string()))?, Err(_) => 8080, }; diff --git a/templates/rust/http/Cargo.lock b/templates/rust/http/Cargo.lock index caf602265d..b880cc6a93 100644 --- a/templates/rust/http/Cargo.lock +++ b/templates/rust/http/Cargo.lock @@ -4,19 +4,19 @@ version = 3 [[package]] name = "actix-codec" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ "bitflags", "bytes", "futures-core", "futures-sink", - "log", "memchr", "pin-project-lite", "tokio", "tokio-util", + "tracing", ] [[package]] @@ -43,7 +43,7 @@ dependencies = [ "http", "httparse", "httpdate", - "itoa 1.0.6", + "itoa", "language-tags", "local-channel", "mime", @@ -156,7 +156,7 @@ dependencies = [ "futures-core", "futures-util", "http", - "itoa 1.0.6", + "itoa", "language-tags", "log", "mime", @@ -215,24 +215,24 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "alloc-no-stdlib" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ "alloc-no-stdlib", ] @@ -245,15 +245,15 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" @@ -277,9 +277,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -293,9 +293,9 @@ checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytestring" -version = "1.0.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" +checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ "bytes", ] @@ -334,18 +334,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] @@ -362,21 +362,22 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.14" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7b9cef1e351660e5443924e4f43ab25fbbed3e9a5f052df3677deb4d6b320" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", "proc-macro2", "quote", + "rustc_version", "syn", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -384,9 +385,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.28" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] @@ -406,9 +407,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", @@ -427,13 +428,11 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.20" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ - "cfg-if", "crc32fast", - "libc", "miniz_oxide", ] @@ -445,11 +444,10 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ - "matches", "percent-encoding", ] @@ -457,13 +455,10 @@ dependencies = [ name = "function" version = "0.1.0" dependencies = [ - "actix-http", "actix-rt", "actix-web", "env_logger", "log", - "regex", - "tokio", ] [[package]] @@ -474,9 +469,9 @@ checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-sink" -version = "0.3.15" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" @@ -498,9 +493,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -508,9 +503,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -519,9 +514,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.16" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" dependencies = [ "bytes", "fnv", @@ -538,15 +533,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" dependencies = [ "libc", ] @@ -565,7 +560,7 @@ checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", - "itoa 1.0.6", + "itoa", ] [[package]] @@ -588,20 +583,19 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "idna" -version = "0.2.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.6.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -609,9 +603,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.1", "libc", @@ -620,9 +614,9 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256017f749ab3117e93acb91063009e1f1bb56d03965b14c2c8df4eb02c524d8" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", @@ -630,12 +624,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "itoa" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" - [[package]] name = "itoa" version = "1.0.6" @@ -659,15 +647,15 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "libc" -version = "0.2.140" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "local-channel" @@ -689,9 +677,9 @@ checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -699,46 +687,36 @@ dependencies = [ [[package]] name = "log" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "memchr" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "log", @@ -748,19 +726,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi 0.1.18", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "parking_lot" @@ -774,15 +752,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-targets", ] [[package]] @@ -793,9 +771,9 @@ checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -811,30 +789,30 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -871,18 +849,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.8" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.6.0" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick", "memchr", @@ -891,15 +869,24 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.27" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] [[package]] name = "rustix" -version = "0.37.5" +version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e78cc525325c06b4a7ff02db283472f3c042b7ff0c391f96c6d5ac6f4f91b75" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags", "errno", @@ -911,9 +898,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "scopeguard" @@ -921,31 +908,37 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + [[package]] name = "serde" -version = "1.0.126" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ - "itoa 0.4.7", + "itoa", "ryu", "serde", ] [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.7", + "itoa", "ryu", "serde", ] @@ -963,24 +956,27 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.3" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" @@ -994,31 +990,31 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.72" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "termcolor" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "time" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" dependencies = [ - "itoa 1.0.6", + "itoa", "serde", "time-core", "time-macros", @@ -1026,39 +1022,39 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" dependencies = [ "time-core", ] [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg", "bytes", @@ -1073,9 +1069,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -1087,9 +1083,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.35" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "log", @@ -1099,9 +1095,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1114,37 +1110,33 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "url" -version = "2.2.2" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] @@ -1193,18 +1185,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1217,45 +1209,45 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zstd" @@ -1268,9 +1260,9 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "6.0.4+zstd.1.5.4" +version = "6.0.5+zstd.1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7afb4b54b8910cf5447638cb54bf4e8a65cbedd783af98b98c62ffe91f185543" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" dependencies = [ "libc", "zstd-sys", @@ -1278,9 +1270,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.7+zstd.1.5.4" +version = "2.0.8+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94509c3ba2fe55294d752b79842c530ccfab760192521df74a081a78d2b3c7f5" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" dependencies = [ "cc", "libc", diff --git a/templates/rust/http/Cargo.toml b/templates/rust/http/Cargo.toml index e506a2c84f..bad9ccda2d 100644 --- a/templates/rust/http/Cargo.toml +++ b/templates/rust/http/Cargo.toml @@ -1,19 +1,18 @@ - [package] name = "function" version = "0.1.0" -edition = "2018" +edition = "2021" + +[profile.release] +codegen-units = 1 +debug = 0 +incremental = true +lto = true +opt-level = "z" +strip = "symbols" [dependencies] -actix-web = "4.3.0" actix-rt = "2.8.0" -log = "0.4.0" +actix-web = "4.3.1" env_logger = "0.10.0" -regex = "1.5.5" -tokio = "1.8.4" -actix-http = "3.3.0" - -[dev-dependencies] -regex = "1.5.5" -tokio = "1.8.4" -actix-http = "3.3.0" +log = "0.4.18" diff --git a/templates/rust/http/src/config.rs b/templates/rust/http/src/config.rs index 538222e025..61edde890b 100644 --- a/templates/rust/http/src/config.rs +++ b/templates/rust/http/src/config.rs @@ -1,4 +1,5 @@ -use actix_web::{web::{self, Data}}; +use actix_web::web::{Data, ServiceConfig}; +use log::info; /// Run custom configuration as part of the application building /// process. @@ -6,7 +7,7 @@ use actix_web::{web::{self, Data}}; /// This function should contain all custom configuration for your function application. /// /// ```rust -/// fn configure(cfg: &mut web::ServiceConfig) { +/// fn configure(cfg: &mut ServiceConfig) { /// let db_driver = my_db(); /// cfg.data(db_driver.clone()); /// } @@ -17,12 +18,12 @@ use actix_web::{web::{self, Data}}; /// ```rust /// pub async fn index( /// req: HttpRequest, -/// driver: web::Data, +/// driver: Data, /// ) -> HttpResponse { /// HttpResponse::NoContent() /// } -pub fn configure(cfg: &mut web::ServiceConfig) { - log::info!("Configuring service"); +pub fn configure(cfg: &mut ServiceConfig) { + info!("Configuring service"); cfg.app_data(Data::new(HandlerConfig::default())); } @@ -35,7 +36,7 @@ pub struct HandlerConfig { impl Default for HandlerConfig { fn default() -> HandlerConfig { HandlerConfig { - name: String::from("world"), + name: "world".into(), } } } diff --git a/templates/rust/http/src/handler.rs b/templates/rust/http/src/handler.rs index 5a0305aba9..62b15a184c 100644 --- a/templates/rust/http/src/handler.rs +++ b/templates/rust/http/src/handler.rs @@ -1,9 +1,9 @@ use crate::config::HandlerConfig; -use actix_web::{http::Method, web, HttpRequest, HttpResponse}; +use actix_web::{http::Method, web::Data, HttpRequest, HttpResponse}; use log::info; // Implement your function's logic here -pub async fn index(req: HttpRequest, config: web::Data) -> HttpResponse { +pub async fn index(req: HttpRequest, config: Data) -> HttpResponse { info!("{:#?}", req); if req.method() == Method::GET { HttpResponse::Ok().body(format!("Hello {}!\n", config.name)) @@ -15,15 +15,15 @@ pub async fn index(req: HttpRequest, config: web::Data) -> HttpRe #[cfg(test)] mod tests { use super::*; - use actix_web::{body::to_bytes, http, test, web::Bytes}; + use actix_web::{body::to_bytes, http, test::TestRequest, web::Bytes}; - fn config() -> web::Data { - web::Data::new(HandlerConfig::default()) + fn config() -> Data { + Data::new(HandlerConfig::default()) } #[actix_rt::test] async fn get() { - let req = test::TestRequest::get().to_http_request(); + let req = TestRequest::get().to_http_request(); let resp = index(req, config()).await; assert_eq!(resp.status(), http::StatusCode::OK); assert_eq!( @@ -34,7 +34,7 @@ mod tests { #[actix_rt::test] async fn post() { - let req = test::TestRequest::post().to_http_request(); + let req = TestRequest::post().to_http_request(); let resp = index(req, config()).await; assert!(resp.status().is_success()); assert_eq!( diff --git a/templates/rust/http/src/main.rs b/templates/rust/http/src/main.rs index 0f4342f83b..9da9ef2758 100644 --- a/templates/rust/http/src/main.rs +++ b/templates/rust/http/src/main.rs @@ -1,15 +1,22 @@ use actix_web::{web, App, HttpResponse, HttpServer}; -use env_logger as elog; +use env_logger::{Builder, Env}; +use std::{ + env, + io::{Error, ErrorKind, Result}, + num::ParseIntError, +}; mod config; mod handler; #[actix_web::main] -async fn main() -> std::io::Result<()> { - elog::Builder::from_env(elog::Env::default().default_filter_or("info")).init(); +async fn main() -> Result<()> { + Builder::from_env(Env::default().default_filter_or("info")).init(); - let port: u16 = match std::env::var("PORT") { - Ok(v) => v.parse().unwrap(), + let port = match env::var("PORT") { + Ok(v) => v + .parse() + .map_err(|e: ParseIntError| Error::new(ErrorKind::Other, e.to_string()))?, Err(_) => 8080, }; diff --git a/templates/springboot/cloudevents/pom.xml b/templates/springboot/cloudevents/pom.xml index 37a1589327..b2a762bf07 100644 --- a/templates/springboot/cloudevents/pom.xml +++ b/templates/springboot/cloudevents/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.5 + 3.1.0 @@ -18,7 +18,7 @@ 17 - 2022.0.2 + 2022.0.3 3.11.0 3.0.0 true diff --git a/templates/springboot/http/pom.xml b/templates/springboot/http/pom.xml index 8762adaab7..4ca79f1977 100644 --- a/templates/springboot/http/pom.xml +++ b/templates/springboot/http/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.5 + 3.1.0 @@ -18,7 +18,7 @@ 17 - 2022.0.2 + 2022.0.3 3.11.0 3.0.0 true diff --git a/templates/typescript/cloudevents/package-lock.json b/templates/typescript/cloudevents/package-lock.json index 81be4572d0..76657d2a70 100644 --- a/templates/typescript/cloudevents/package-lock.json +++ b/templates/typescript/cloudevents/package-lock.json @@ -9,9 +9,12 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "@types/node": "^16.11.12", - "cloudevents": "^6.0.4", - "faas-js-runtime": "^1.1.0" + "@types/node": "^20.4.2", + "cloudevents": "7.0.2", + "faas-js-runtime": "2.2.2", + "optionator": "^0.9.3", + "read-pkg": "^8.0.0", + "semver": "^7.5.4" }, "devDependencies": { "@types/tape": "^4.13.0", @@ -20,14 +23,22 @@ "eslint": "^7.26.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "prettier": "^2.3.0", "supertest": "^6.3.1", "tape": "^4.13.0", "ts-node": "^9.1.1", "tsd": "^0.24.1", "tslint-config-prettier": "^1.18.0", - "typescript": "^4.2.4" + "typescript": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/@babel/code-frame": { @@ -40,27 +51,30 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -72,7 +86,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -86,7 +99,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -94,14 +106,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, "engines": { "node": ">=4" } @@ -110,7 +120,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -224,16 +233,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "node_modules/@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "dependencies": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -306,15 +315,14 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, "node_modules/@types/tape": { "version": "4.13.0", @@ -853,6 +861,14 @@ } ] }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -918,6 +934,14 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1009,18 +1033,19 @@ } }, "node_modules/cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" }, "engines": { - "node": ">=12 <20.0.0" + "node": ">=16 <=20" } }, "node_modules/cloudevents/node_modules/ajv": { @@ -1074,11 +1099,11 @@ } }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/component-emitter": { @@ -1195,8 +1220,7 @@ "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "node_modules/define-properties": { "version": "1.1.3", @@ -1225,6 +1249,14 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -1302,7 +1334,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -1387,7 +1418,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -1701,25 +1731,26 @@ } }, "node_modules/faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "dependencies": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" }, "bin": { "faas-js-runtime": "bin/cli.js" }, "engines": { - "node": "^18 || ^16 || ^14" + "node": "^20 || ^18 || ^16" } }, "node_modules/faas-js-runtime/node_modules/argparse": { @@ -1818,21 +1849,20 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "node_modules/fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", "engines": { "node": ">=6" } @@ -1849,25 +1879,47 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "node_modules/fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "dependencies": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "node_modules/fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "dependencies": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "url": "https://github.com/Eomm/fastify-raw-body?sponsor=1" } }, "node_modules/fastq": { @@ -1903,9 +1955,9 @@ } }, "node_modules/find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -2235,6 +2287,32 @@ "node": ">=10" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2360,8 +2438,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -2418,7 +2495,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -2635,8 +2711,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -2651,11 +2726,21 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -2682,7 +2767,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2692,9 +2776,9 @@ } }, "node_modules/light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "dependencies": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -2702,10 +2786,12 @@ } }, "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, "node_modules/locate-path": { "version": "5.0.0", @@ -2963,19 +3049,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "node_modules/nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, - "hasInstallScript": true, "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -2984,7 +3069,7 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", @@ -3000,15 +3085,6 @@ "node": ">=4" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3127,17 +3203,16 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -3200,18 +3275,40 @@ } }, "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", + "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3272,9 +3369,9 @@ } }, "node_modules/pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -3302,9 +3399,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "node_modules/plur": { "version": "4.0.0", @@ -3325,7 +3422,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -3414,9 +3510,9 @@ } }, "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -3461,19 +3557,35 @@ "node": ">=8" } }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", + "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^5.0.0", + "parse-json": "^7.0.0", + "type-fest": "^3.8.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up": { @@ -3493,13 +3605,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { + "node_modules/read-pkg-up/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "node_modules/read-pkg/node_modules/normalize-package-data": { + "node_modules/read-pkg-up/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/read-pkg-up/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/read-pkg-up/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", @@ -3511,16 +3635,40 @@ "validate-npm-package-license": "^3.0.1" } }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/read-pkg-up/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/type-fest": { + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", @@ -3529,15 +3677,69 @@ "node": ">=8" } }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3702,6 +3904,25 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", @@ -3718,15 +3939,20 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3742,6 +3968,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3785,24 +4016,15 @@ } }, "node_modules/simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/slash": { @@ -3862,7 +4084,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -3871,14 +4092,12 @@ "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -3887,8 +4106,7 @@ "node_modules/spdx-license-ids": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" }, "node_modules/split2": { "version": "4.2.0", @@ -3904,6 +4122,22 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4160,9 +4394,9 @@ "dev": true }, "node_modules/tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==", "engines": { "node": ">=12" } @@ -4179,6 +4413,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -4283,7 +4525,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4301,16 +4542,16 @@ } }, "node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -4334,6 +4575,14 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -4372,7 +4621,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -4428,15 +4676,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4476,6 +4715,11 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" + }, "@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -4486,18 +4730,16 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" }, "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -4506,7 +4748,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -4515,7 +4756,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4526,7 +4766,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -4534,20 +4773,17 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -4637,16 +4873,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "requires": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "@nodelib/fs.scandir": { @@ -4710,15 +4946,14 @@ "dev": true }, "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" }, "@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, "@types/tape": { "version": "4.13.0", @@ -5077,6 +5312,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5122,6 +5362,11 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5181,12 +5426,13 @@ } }, "cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "requires": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" @@ -5235,9 +5481,9 @@ } }, "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==" }, "component-emitter": { "version": "1.3.0", @@ -5334,8 +5580,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "define-properties": { "version": "1.1.3", @@ -5358,6 +5603,11 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -5420,7 +5670,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -5485,8 +5734,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { "version": "7.26.0", @@ -5709,19 +5957,20 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "requires": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" }, "dependencies": { "argparse": { @@ -5814,21 +6063,20 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "requires": { "fast-decode-uri-component": "^1.0.1" } }, "fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==" }, "fast-safe-stringify": { "version": "2.1.1", @@ -5842,25 +6090,41 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "requires": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "requires": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" } }, "fastq": { @@ -5890,9 +6154,9 @@ } }, "find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "requires": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -6129,6 +6393,26 @@ "lru-cache": "^6.0.0" } }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -6213,8 +6497,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -6253,7 +6536,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -6392,8 +6674,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.1", @@ -6405,11 +6686,18 @@ "esprima": "^4.0.0" } }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -6433,16 +6721,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "requires": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -6450,10 +6737,9 @@ } }, "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==" }, "locate-path": { "version": "5.0.0", @@ -6649,18 +6935,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -6672,12 +6958,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6765,17 +7045,16 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "overload-protection": { @@ -6820,15 +7099,30 @@ } }, "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", + "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==" + } } }, "path-exists": { @@ -6868,9 +7162,9 @@ "dev": true }, "pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -6895,9 +7189,9 @@ } }, "pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "plur": { "version": "4.0.0", @@ -6911,8 +7205,7 @@ "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prettier": { "version": "2.3.0", @@ -6974,9 +7267,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "requires": { "side-channel": "^1.0.4" } @@ -6998,16 +7291,68 @@ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", + "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", + "requires": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^5.0.0", + "parse-json": "^7.0.0", + "type-fest": "^3.8.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + }, + "normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "requires": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { "hosted-git-info": { @@ -7016,6 +7361,18 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -7028,40 +7385,56 @@ "validate-npm-package-license": "^3.0.1" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, "readdirp": { @@ -7166,6 +7539,11 @@ "queue-microtask": "^1.2.2" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "safe-regex2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", @@ -7179,15 +7557,20 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -7197,6 +7580,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7230,20 +7618,12 @@ } }, "simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "requires": { - "semver": "~7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "semver": "^7.5.3" } }, "slash": { @@ -7291,7 +7671,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -7300,14 +7679,12 @@ "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -7316,8 +7693,7 @@ "spdx-license-ids": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" }, "split2": { "version": "4.2.0", @@ -7330,6 +7706,19 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -7539,9 +7928,9 @@ "dev": true }, "tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==" }, "to-regex-range": { "version": "5.0.1", @@ -7552,6 +7941,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -7620,7 +8014,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -7632,9 +8025,9 @@ "dev": true }, "typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, "unbox-primitive": { @@ -7655,6 +8048,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -7690,7 +8088,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -7731,12 +8128,6 @@ "is-typed-array": "^1.1.10" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/templates/typescript/cloudevents/package.json b/templates/typescript/cloudevents/package.json index 7149034e26..f3e8c23d1b 100644 --- a/templates/typescript/cloudevents/package.json +++ b/templates/typescript/cloudevents/package.json @@ -24,18 +24,21 @@ "eslint": "^7.26.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "prettier": "^2.3.0", "supertest": "^6.3.1", "tape": "^4.13.0", "ts-node": "^9.1.1", "tsd": "^0.24.1", "tslint-config-prettier": "^1.18.0", - "typescript": "^4.2.4" + "typescript": "^5.1.6" }, "dependencies": { - "@types/node": "^16.11.12", - "cloudevents": "^6.0.4", - "faas-js-runtime": "^1.1.0" + "@types/node": "^20.4.2", + "cloudevents": "7.0.2", + "faas-js-runtime": "2.2.2", + "optionator": "^0.9.3", + "read-pkg": "^8.0.0", + "semver": "^7.5.4" } } diff --git a/templates/typescript/http/package-lock.json b/templates/typescript/http/package-lock.json index f68c94b410..1be5a8037e 100644 --- a/templates/typescript/http/package-lock.json +++ b/templates/typescript/http/package-lock.json @@ -9,8 +9,8 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "@types/node": "^16.11.12", - "faas-js-runtime": "^1.1.0" + "@types/node": "^20.4.2", + "faas-js-runtime": "^2.2.2" }, "devDependencies": { "@types/tape": "^4.13.0", @@ -19,14 +19,23 @@ "eslint": "^7.26.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "prettier": "^2.3.0", "supertest": "^6.3.1", "tape": "^4.13.0", "ts-node": "^9.1.1", "tsd": "^0.24.1", "tslint-config-prettier": "^1.18.0", - "typescript": "^4.2.4" + "typescript": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@babel/code-frame": { @@ -223,16 +232,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "node_modules/@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "dependencies": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -305,9 +314,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -852,6 +861,14 @@ } ] }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -917,6 +934,14 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1008,18 +1033,19 @@ } }, "node_modules/cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" }, "engines": { - "node": ">=12 <20.0.0" + "node": ">=16 <=20" } }, "node_modules/cloudevents/node_modules/ajv": { @@ -1073,11 +1099,11 @@ } }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/component-emitter": { @@ -1224,6 +1250,14 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -1700,25 +1734,26 @@ } }, "node_modules/faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "dependencies": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" }, "bin": { "faas-js-runtime": "bin/cli.js" }, "engines": { - "node": "^18 || ^16 || ^14" + "node": "^20 || ^18 || ^16" } }, "node_modules/faas-js-runtime/node_modules/argparse": { @@ -1821,17 +1856,17 @@ "dev": true }, "node_modules/fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "node_modules/fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", "engines": { "node": ">=6" } @@ -1848,25 +1883,47 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "node_modules/fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "dependencies": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "node_modules/fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "dependencies": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "url": "https://github.com/Eomm/fastify-raw-body?sponsor=1" } }, "node_modules/fastq": { @@ -1902,9 +1959,9 @@ } }, "node_modules/find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -2234,6 +2291,32 @@ "node": ">=10" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2650,6 +2733,14 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -2691,9 +2782,9 @@ } }, "node_modules/light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "dependencies": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -2962,19 +3053,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "node_modules/nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, - "hasInstallScript": true, "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -2983,7 +3073,7 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", @@ -2999,15 +3089,6 @@ "node": ">=4" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3126,17 +3207,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -3271,9 +3352,9 @@ } }, "node_modules/pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -3301,9 +3382,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "node_modules/plur": { "version": "4.0.0", @@ -3413,9 +3494,9 @@ } }, "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -3460,6 +3541,20 @@ "node": ">=8" } }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -3511,9 +3606,9 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3529,14 +3624,15 @@ } }, "node_modules/readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3701,6 +3797,25 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", @@ -3717,15 +3832,20 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3741,6 +3861,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3784,24 +3909,15 @@ } }, "node_modules/simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/slash": { @@ -3903,6 +4019,22 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4159,9 +4291,9 @@ "dev": true }, "node_modules/tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==", "engines": { "node": ">=12" } @@ -4178,6 +4310,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -4300,16 +4440,16 @@ } }, "node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -4333,6 +4473,14 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -4409,9 +4557,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -4427,15 +4575,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4475,6 +4614,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -4636,16 +4781,16 @@ "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, "@fastify/error": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", - "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", + "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==" }, "@fastify/fast-json-stringify-compiler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", - "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "requires": { - "fast-json-stringify": "^5.0.0" + "fast-json-stringify": "^5.7.0" } }, "@nodelib/fs.scandir": { @@ -4709,9 +4854,9 @@ "dev": true }, "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -5076,6 +5221,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5121,6 +5271,11 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5180,12 +5335,13 @@ } }, "cloudevents": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.4.tgz", - "integrity": "sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", "requires": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", "process": "^0.11.10", "util": "^0.12.4", "uuid": "^8.3.2" @@ -5234,9 +5390,9 @@ } }, "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==" }, "component-emitter": { "version": "1.3.0", @@ -5357,6 +5513,11 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -5708,19 +5869,20 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "faas-js-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-1.1.0.tgz", - "integrity": "sha512-EgsYESFAHHKhVlnWFH1obv4qOaX4MFiEVRIjbSYm5sBs+RhbZzmTwTw5pMrNqrgtnnK15P78v8R6UJzTmBfKSw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/faas-js-runtime/-/faas-js-runtime-2.2.2.tgz", + "integrity": "sha512-fQnBewut2a+b9X13UYhjxrqMSa86l30Mc8QsFJl9P+7sKBuaZtxXMwP2GWI7K2OApdm6xI1M2DPsdzYL82dLFA==", "requires": { - "cloudevents": "^6.0.4", - "commander": "^10.0.0", + "cloudevents": "^7.0.1", + "commander": "^11.0.0", "death": "^1.1.0", - "fastify": "^4.15.0", + "fastify": "^4.18.0", + "fastify-raw-body": "^4.2.0", "js-yaml": "^4.1.0", "node-os-utils": "^1.3.7", "overload-protection": "^1.2.3", "prom-client": "^14.1.1", - "qs": "^6.11.1" + "qs": "^6.11.2" }, "dependencies": { "argparse": { @@ -5817,17 +5979,17 @@ "dev": true }, "fast-querystring": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", - "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "requires": { "fast-decode-uri-component": "^1.0.1" } }, "fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==" }, "fast-safe-stringify": { "version": "2.1.1", @@ -5841,25 +6003,41 @@ "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" }, "fastify": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.15.0.tgz", - "integrity": "sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.20.0.tgz", + "integrity": "sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==", "requires": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.2.0", + "@fastify/error": "^3.2.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", + "avvio": "^8.2.1", "fast-content-type-parse": "^1.0.0", + "fast-json-stringify": "^5.7.0", "find-my-way": "^7.6.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", + "light-my-request": "^5.9.1", + "pino": "^8.12.0", + "process-warning": "^2.2.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "semver": "^7.5.0", + "tiny-lru": "^11.0.1" + } + }, + "fastify-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.0.tgz", + "integrity": "sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==" + }, + "fastify-raw-body": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fastify-raw-body/-/fastify-raw-body-4.2.1.tgz", + "integrity": "sha512-9VVGl7C2+U1Xi9P2oOTHWtJy1ZOkzdDOjdSiVSnzg0Af/8wgdspgVxKXnYBeyP8HGncK5S/bYJDq6l2A0YOoBQ==", + "requires": { + "fastify-plugin": "^4.0.0", + "raw-body": "^2.5.1", + "secure-json-parse": "^2.4.0" } }, "fastq": { @@ -5889,9 +6067,9 @@ } }, "find-my-way": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", - "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.2.tgz", + "integrity": "sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==", "requires": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -6128,6 +6306,26 @@ "lru-cache": "^6.0.0" } }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -6404,6 +6602,14 @@ "esprima": "^4.0.0" } }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -6439,9 +6645,9 @@ } }, "light-my-request": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", - "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.10.0.tgz", + "integrity": "sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==", "requires": { "cookie": "^0.5.0", "process-warning": "^2.0.0", @@ -6648,18 +6854,18 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -6671,12 +6877,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6764,17 +6964,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "overload-protection": { @@ -6867,9 +7067,9 @@ "dev": true }, "pino": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", - "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -6894,9 +7094,9 @@ } }, "pino-std-serializers": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", - "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "plur": { "version": "4.0.0", @@ -6973,9 +7173,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "requires": { "side-channel": "^1.0.4" } @@ -6997,6 +7197,17 @@ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -7028,9 +7239,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "type-fest": { @@ -7053,14 +7264,15 @@ } }, "readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, "readdirp": { @@ -7165,6 +7377,11 @@ "queue-microtask": "^1.2.2" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "safe-regex2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", @@ -7178,15 +7395,20 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -7196,6 +7418,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7229,20 +7456,12 @@ } }, "simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "requires": { - "semver": "~7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "semver": "^7.5.3" } }, "slash": { @@ -7329,6 +7548,19 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -7538,9 +7770,9 @@ "dev": true }, "tiny-lru": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", - "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==" }, "to-regex-range": { "version": "5.0.1", @@ -7551,6 +7783,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -7631,9 +7868,9 @@ "dev": true }, "typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, "unbox-primitive": { @@ -7654,6 +7891,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -7718,9 +7960,9 @@ } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -7730,12 +7972,6 @@ "is-typed-array": "^1.1.10" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/templates/typescript/http/package.json b/templates/typescript/http/package.json index f701035c6a..0bdbb0f288 100644 --- a/templates/typescript/http/package.json +++ b/templates/typescript/http/package.json @@ -24,17 +24,17 @@ "eslint": "^7.26.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", - "nodemon": "^2.0.4", + "nodemon": "^3.0.1", "prettier": "^2.3.0", "supertest": "^6.3.1", "tape": "^4.13.0", "ts-node": "^9.1.1", "tsd": "^0.24.1", "tslint-config-prettier": "^1.18.0", - "typescript": "^4.2.4" + "typescript": "^5.1.6" }, "dependencies": { - "@types/node": "^16.11.12", - "faas-js-runtime": "^1.1.0" + "@types/node": "^20.4.2", + "faas-js-runtime": "^2.2.2" } } diff --git a/test/common/config.go b/test/common/config.go index 19121d05fd..81c17f18e4 100644 --- a/test/common/config.go +++ b/test/common/config.go @@ -4,7 +4,7 @@ import ( "os" "strings" - "knative.dev/func/pkg/openshift" + "knative.dev/func/pkg/k8s" ) // Intended to provide setup configuration for E2E tests @@ -18,8 +18,8 @@ func init() { // Setup test Registry. testRegistry = os.Getenv("E2E_REGISTRY_URL") if testRegistry == "" || testRegistry == "default" { - if openshift.IsOpenShift() { - testRegistry = openshift.GetDefaultRegistry() + if k8s.IsOpenShift() { + testRegistry = k8s.GetDefaultOpenShiftRegistry() } else { testRegistry = DefaultRegistry } diff --git a/test/e2e/scenario_config-envs_test.go b/test/e2e/scenario_config-envs_test.go index 1f5199dbde..88622d8d32 100644 --- a/test/e2e/scenario_config-envs_test.go +++ b/test/e2e/scenario_config-envs_test.go @@ -1,5 +1,4 @@ -//go:build e2e -// +build e2e +//go:build e2e && !windows package e2e diff --git a/test/e2e/scenario_config-labels_test.go b/test/e2e/scenario_config-labels_test.go index 32bd122644..a02580c416 100644 --- a/test/e2e/scenario_config-labels_test.go +++ b/test/e2e/scenario_config-labels_test.go @@ -1,5 +1,4 @@ -//go:build e2e -// +build e2e +//go:build e2e && !windows package e2e diff --git a/test/e2e/scenario_config-volumes_test.go b/test/e2e/scenario_config-volumes_test.go index 71b5f35355..13665db8e8 100644 --- a/test/e2e/scenario_config-volumes_test.go +++ b/test/e2e/scenario_config-volumes_test.go @@ -1,5 +1,4 @@ -//go:build e2e -// +build e2e +//go:build e2e && !windows package e2e diff --git a/test/e2e/scenario_extended_flow_test.go b/test/e2e/scenario_extended_flow_test.go index 0004717829..7cf22dbb51 100644 --- a/test/e2e/scenario_extended_flow_test.go +++ b/test/e2e/scenario_extended_flow_test.go @@ -1,5 +1,4 @@ //go:build e2e -// +build e2e package e2e diff --git a/test/e2e/scenario_remote-repository_test.go b/test/e2e/scenario_remote-repository_test.go index 40857837ad..21f284e751 100644 --- a/test/e2e/scenario_remote-repository_test.go +++ b/test/e2e/scenario_remote-repository_test.go @@ -1,5 +1,4 @@ //go:build e2e -// +build e2e package e2e diff --git a/test/e2e/scenario_runtime-cloudevents_test.go b/test/e2e/scenario_runtime-cloudevents_test.go index 0867d2e391..4c96d7a716 100644 --- a/test/e2e/scenario_runtime-cloudevents_test.go +++ b/test/e2e/scenario_runtime-cloudevents_test.go @@ -1,5 +1,4 @@ //go:build e2elc -// +build e2elc package e2e diff --git a/test/e2e/scenario_runtime-http_test.go b/test/e2e/scenario_runtime-http_test.go index 1113a2652f..498e39ebab 100644 --- a/test/e2e/scenario_runtime-http_test.go +++ b/test/e2e/scenario_runtime-http_test.go @@ -1,5 +1,4 @@ //go:build e2elc -// +build e2elc package e2e diff --git a/test/oncluster/scenario_basic_test.go b/test/oncluster/scenario_basic_test.go index bb4e2bd83d..c778aa0831 100644 --- a/test/oncluster/scenario_basic_test.go +++ b/test/oncluster/scenario_basic_test.go @@ -1,5 +1,4 @@ //go:build oncluster -// +build oncluster package oncluster diff --git a/test/oncluster/scenario_context-dir_test.go b/test/oncluster/scenario_context-dir_test.go index b5d1673d36..cd0fc24975 100644 --- a/test/oncluster/scenario_context-dir_test.go +++ b/test/oncluster/scenario_context-dir_test.go @@ -1,5 +1,4 @@ //go:build oncluster -// +build oncluster package oncluster diff --git a/test/oncluster/scenario_from-cli-local_test.go b/test/oncluster/scenario_from-cli-local_test.go index a5b634390e..a06534acf1 100644 --- a/test/oncluster/scenario_from-cli-local_test.go +++ b/test/oncluster/scenario_from-cli-local_test.go @@ -1,5 +1,4 @@ //go:build oncluster -// +build oncluster package oncluster diff --git a/test/oncluster/scenario_from-cli_test.go b/test/oncluster/scenario_from-cli_test.go index d520139224..92863d26ec 100644 --- a/test/oncluster/scenario_from-cli_test.go +++ b/test/oncluster/scenario_from-cli_test.go @@ -1,5 +1,4 @@ //go:build oncluster -// +build oncluster package oncluster diff --git a/test/oncluster/scenario_github_test.go b/test/oncluster/scenario_github_test.go index 98c82c4942..5b1bf89845 100644 --- a/test/oncluster/scenario_github_test.go +++ b/test/oncluster/scenario_github_test.go @@ -1,5 +1,4 @@ //go:build oncluster -// +build oncluster package oncluster diff --git a/test/oncluster/scenario_revision_test.go b/test/oncluster/scenario_revision_test.go index ec04f77694..a00e1944d4 100644 --- a/test/oncluster/scenario_revision_test.go +++ b/test/oncluster/scenario_revision_test.go @@ -1,5 +1,4 @@ //go:build oncluster -// +build oncluster package oncluster diff --git a/test/oncluster/scenario_runtime_test.go b/test/oncluster/scenario_runtime_test.go index 31fd4c6089..6af049141b 100644 --- a/test/oncluster/scenario_runtime_test.go +++ b/test/oncluster/scenario_runtime_test.go @@ -1,5 +1,4 @@ //go:build oncluster || runtime -// +build oncluster runtime package oncluster diff --git a/test/oncluster/tekton.go b/test/oncluster/tekton.go index f207b76e29..e67074eb60 100644 --- a/test/oncluster/tekton.go +++ b/test/oncluster/tekton.go @@ -65,7 +65,7 @@ func (p *PipelineRunSummary) IsSucceed() bool { return p.PipelineRunStatus == "Succeeded" } -// TektonPipelTektonPipelineLastRunSummary gather information about a pipeline run such as +// TektonPipelineLastRunSummary gather information about a pipeline run such as // list of tasks executed and status of each task execution. It is meant to be used on assertions func TektonPipelineLastRunSummary(t *testing.T, pipelinePrefix string) *PipelineRunSummary { namespace, _, _ := k8s.GetClientConfig().Namespace() @@ -82,13 +82,17 @@ func TektonPipelineLastRunSummary(t *testing.T, pipelinePrefix string) *Pipeline lr.PipelineRunStatus = run.Status.Conditions[0].Reason } lr.TasksRunSummary = []PipelineTaskRunSummary{} - for _, taskRun := range run.Status.TaskRuns { - trun := PipelineTaskRunSummary{} - trun.TaskName = taskRun.PipelineTaskName + for _, ref := range run.Status.ChildReferences { + r := PipelineTaskRunSummary{} + r.TaskName = ref.PipelineTaskName + taskRun, err := client.TaskRuns(ns).Get(context.Background(), ref.Name, v1.GetOptions{}) + if err != nil { + t.Error(err.Error()) + } if len(taskRun.Status.Conditions) > 0 { - trun.TaskStatus = taskRun.Status.Conditions[0].Reason + r.TaskStatus = taskRun.Status.Conditions[0].Reason } - lr.TasksRunSummary = append(lr.TasksRunSummary, trun) + lr.TasksRunSummary = append(lr.TasksRunSummary, r) } } } diff --git a/test/presubmit-tests.sh b/test/presubmit-tests.sh index 4de2fd259f..36de38cab8 100755 --- a/test/presubmit-tests.sh +++ b/test/presubmit-tests.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2021 The Knative Authors +# Copyright 2023 The Knative Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,41 +14,80 @@ # See the License for the specific language governing permissions and # limitations under the License. -# This script runs the presubmit tests; it is started by prow for each PR. -# For convenience, it can also be executed manually. -# Running the script without parameters, or with the --all-tests -# flag, causes all tests to be executed, in the right order. -# Use the flags --build-tests, --unit-tests and --integration-tests -# to run a specific set of tests. - -# If you call this script after configuring the environment variables -# $KNATIVE_SERVING_VERSION / $KNATIVE_EVENTING_VERSION with a valid release, -# e.g. 0.6.0, Knative Serving / Eventing of this specified version will be installed -# in the Kubernetes cluster, and all the tests will run against Knative -# Serving / Eventing of this specific version. +# Documentation about this script and how to use it can be found +# at https://github.com/knative/hack export DISABLE_MD_LINTING=1 export DISABLE_MD_LINK_CHECK=1 export PRESUBMIT_TEST_FAIL_FAST=1 +export NODE_VERSION=v18.10.0 +export NODE_DISTRO=linux-x64 -export GO111MODULE=on export KNATIVE_SERVING_VERSION=${KNATIVE_SERVING_VERSION:-latest} export KNATIVE_EVENTING_VERSION=${KNATIVE_EVENTING_VERSION:-latest} source $(dirname $0)/../vendor/knative.dev/hack/presubmit-tests.sh +function post_build_tests() { + local failed=0 + header "Ensuring code builds cross-platform" + make cross-platform || failed=1 + if (( failed )); then + results_banner "Build failed" + exit ${failed} + fi +} + +function pre_unit_tests() { + install_node + install_rust +} + +function install_node() { + header "Installing Node.js" + mkdir -p /tmp/nodejs + wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${NODE_DISTRO}.tar.xz + tar -xf node-${NODE_VERSION}-${NODE_DISTRO}.tar.xz -C /tmp/nodejs + rm node-${NODE_VERSION}-${NODE_DISTRO}.tar.xz + export PATH=/tmp/nodejs/node-${NODE_VERSION}-${NODE_DISTRO}/bin:$PATH + subheader "Node.js version" + node --version + npm version + npx --version +} + +function install_rust() { + header "Installing Rust" + curl https://sh.rustup.rs -sSf > install.sh + sh install.sh -y + rm install.sh + source "$HOME/.cargo/env" + subheader "Rust version" + cargo version +} function unit_tests() { - header "Running func tests" + local failed=0 + header "Unit tests for $(go_mod_module_name)" make test || failed=1 - if (( failed )); then results_banner "Unit tests failed" exit ${failed} fi + template_tests +} + +function template_tests() { + header "Built-in template tests" + make test-templates || failed=2 + if (( failed )); then + results_banner "Built-in template tests failed" + exit ${failed} + fi } function integration_tests() { - header "Skipping func integration tests" + local failed=0 + header "Skipping integration tests" # make test-integration || failed=1 # if (( failed )); then @@ -57,4 +96,4 @@ function integration_tests() { # fi } -main $@ +main "$@" diff --git a/third_party/VENDOR-LICENSE/github.com/aws/aws-sdk-go-v2/NOTICE.txt b/third_party/VENDOR-LICENSE/github.com/aws/aws-sdk-go-v2/NOTICE.txt index 5f14d1162e..899129ecc4 100644 --- a/third_party/VENDOR-LICENSE/github.com/aws/aws-sdk-go-v2/NOTICE.txt +++ b/third_party/VENDOR-LICENSE/github.com/aws/aws-sdk-go-v2/NOTICE.txt @@ -1,3 +1,3 @@ AWS SDK for Go -Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc. diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/LICENSE b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/LICENSE new file mode 100644 index 0000000000..e87a115e46 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/LICENSE @@ -0,0 +1,363 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/README.md b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/README.md new file mode 100644 index 0000000000..036e5313fc --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/README.md @@ -0,0 +1,30 @@ +# cleanhttp + +Functions for accessing "clean" Go http.Client values + +------------- + +The Go standard library contains a default `http.Client` called +`http.DefaultClient`. It is a common idiom in Go code to start with +`http.DefaultClient` and tweak it as necessary, and in fact, this is +encouraged; from the `http` package documentation: + +> The Client's Transport typically has internal state (cached TCP connections), +so Clients should be reused instead of created as needed. Clients are safe for +concurrent use by multiple goroutines. + +Unfortunately, this is a shared value, and it is not uncommon for libraries to +assume that they are free to modify it at will. With enough dependencies, it +can be very easy to encounter strange problems and race conditions due to +manipulation of this shared value across libraries and goroutines (clients are +safe for concurrent use, but writing values to the client struct itself is not +protected). + +Making things worse is the fact that a bare `http.Client` will use a default +`http.Transport` called `http.DefaultTransport`, which is another global value +that behaves the same way. So it is not simply enough to replace +`http.DefaultClient` with `&http.Client{}`. + +This repository provides some simple functions to get a "clean" `http.Client` +-- one that uses the same default values as the Go standard library, but +returns a client that does not share any state with other clients. diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/cleanhttp.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/cleanhttp.go new file mode 100644 index 0000000000..fe28d15b6f --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/cleanhttp.go @@ -0,0 +1,58 @@ +package cleanhttp + +import ( + "net" + "net/http" + "runtime" + "time" +) + +// DefaultTransport returns a new http.Transport with similar default values to +// http.DefaultTransport, but with idle connections and keepalives disabled. +func DefaultTransport() *http.Transport { + transport := DefaultPooledTransport() + transport.DisableKeepAlives = true + transport.MaxIdleConnsPerHost = -1 + return transport +} + +// DefaultPooledTransport returns a new http.Transport with similar default +// values to http.DefaultTransport. Do not use this for transient transports as +// it can leak file descriptors over time. Only use this for transports that +// will be re-used for the same host(s). +func DefaultPooledTransport() *http.Transport { + transport := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + }).DialContext, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + ForceAttemptHTTP2: true, + MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1, + } + return transport +} + +// DefaultClient returns a new http.Client with similar default values to +// http.Client, but with a non-shared Transport, idle connections disabled, and +// keepalives disabled. +func DefaultClient() *http.Client { + return &http.Client{ + Transport: DefaultTransport(), + } +} + +// DefaultPooledClient returns a new http.Client with similar default values to +// http.Client, but with a shared Transport. Do not use this function for +// transient clients as it can leak file descriptors over time. Only use this +// for clients that will be re-used for the same host(s). +func DefaultPooledClient() *http.Client { + return &http.Client{ + Transport: DefaultPooledTransport(), + } +} diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/doc.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/doc.go new file mode 100644 index 0000000000..05841092a7 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/doc.go @@ -0,0 +1,20 @@ +// Package cleanhttp offers convenience utilities for acquiring "clean" +// http.Transport and http.Client structs. +// +// Values set on http.DefaultClient and http.DefaultTransport affect all +// callers. This can have detrimental effects, esepcially in TLS contexts, +// where client or root certificates set to talk to multiple endpoints can end +// up displacing each other, leading to hard-to-debug issues. This package +// provides non-shared http.Client and http.Transport structs to ensure that +// the configuration will not be overwritten by other parts of the application +// or dependencies. +// +// The DefaultClient and DefaultTransport functions disable idle connections +// and keepalives. Without ensuring that idle connections are closed before +// garbage collection, short-term clients/transports can leak file descriptors, +// eventually leading to "too many open files" errors. If you will be +// connecting to the same hosts repeatedly from the same client, you can use +// DefaultPooledClient to receive a client that has connection pooling +// semantics similar to http.DefaultClient. +// +package cleanhttp diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/handlers.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/handlers.go new file mode 100644 index 0000000000..3c845dc0dc --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-cleanhttp/handlers.go @@ -0,0 +1,48 @@ +package cleanhttp + +import ( + "net/http" + "strings" + "unicode" +) + +// HandlerInput provides input options to cleanhttp's handlers +type HandlerInput struct { + ErrStatus int +} + +// PrintablePathCheckHandler is a middleware that ensures the request path +// contains only printable runes. +func PrintablePathCheckHandler(next http.Handler, input *HandlerInput) http.Handler { + // Nil-check on input to make it optional + if input == nil { + input = &HandlerInput{ + ErrStatus: http.StatusBadRequest, + } + } + + // Default to http.StatusBadRequest on error + if input.ErrStatus == 0 { + input.ErrStatus = http.StatusBadRequest + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r != nil { + // Check URL path for non-printable characters + idx := strings.IndexFunc(r.URL.Path, func(c rune) bool { + return !unicode.IsPrint(c) + }) + + if idx != -1 { + w.WriteHeader(input.ErrStatus) + return + } + + if next != nil { + next.ServeHTTP(w, r) + } + } + + return + }) +} diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/.gitignore b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/.gitignore new file mode 100644 index 0000000000..4e309e0b32 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/.gitignore @@ -0,0 +1,4 @@ +.idea/ +*.iml +*.test +.vscode/ \ No newline at end of file diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/CHANGELOG.md b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/CHANGELOG.md new file mode 100644 index 0000000000..33686e4da8 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/CHANGELOG.md @@ -0,0 +1,9 @@ +## 0.7.4 (Jun 6, 2023) + +BUG FIXES + +- client: fixing an issue where the Content-Type header wouldn't be sent with an empty payload when using HTTP/2 [GH-194] + +## 0.7.3 (May 15, 2023) + +Initial release diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/CODEOWNERS b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/CODEOWNERS new file mode 100644 index 0000000000..f8389c995e --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/CODEOWNERS @@ -0,0 +1 @@ +* @hashicorp/release-engineering \ No newline at end of file diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/LICENSE b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/LICENSE new file mode 100644 index 0000000000..f4f97ee585 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/LICENSE @@ -0,0 +1,365 @@ +Copyright (c) 2015 HashiCorp, Inc. + +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/Makefile b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/Makefile new file mode 100644 index 0000000000..da17640e64 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/Makefile @@ -0,0 +1,11 @@ +default: test + +test: + go vet ./... + go test -race ./... + +updatedeps: + go get -f -t -u ./... + go get -f -u ./... + +.PHONY: default test updatedeps diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/README.md b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/README.md new file mode 100644 index 0000000000..8943becf19 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/README.md @@ -0,0 +1,62 @@ +go-retryablehttp +================ + +[![Build Status](http://img.shields.io/travis/hashicorp/go-retryablehttp.svg?style=flat-square)][travis] +[![Go Documentation](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)][godocs] + +[travis]: http://travis-ci.org/hashicorp/go-retryablehttp +[godocs]: http://godoc.org/github.com/hashicorp/go-retryablehttp + +The `retryablehttp` package provides a familiar HTTP client interface with +automatic retries and exponential backoff. It is a thin wrapper over the +standard `net/http` client library and exposes nearly the same public API. This +makes `retryablehttp` very easy to drop into existing programs. + +`retryablehttp` performs automatic retries under certain conditions. Mainly, if +an error is returned by the client (connection errors, etc.), or if a 500-range +response code is received (except 501), then a retry is invoked after a wait +period. Otherwise, the response is returned and left to the caller to +interpret. + +The main difference from `net/http` is that requests which take a request body +(POST/PUT et. al) can have the body provided in a number of ways (some more or +less efficient) that allow "rewinding" the request body if the initial request +fails so that the full request can be attempted again. See the +[godoc](http://godoc.org/github.com/hashicorp/go-retryablehttp) for more +details. + +Version 0.6.0 and before are compatible with Go prior to 1.12. From 0.6.1 onward, Go 1.12+ is required. +From 0.6.7 onward, Go 1.13+ is required. + +Example Use +=========== + +Using this library should look almost identical to what you would do with +`net/http`. The most simple example of a GET request is shown below: + +```go +resp, err := retryablehttp.Get("/foo") +if err != nil { + panic(err) +} +``` + +The returned response object is an `*http.Response`, the same thing you would +usually get from `net/http`. Had the request failed one or more times, the above +call would block and retry with exponential backoff. + +## Getting a stdlib `*http.Client` with retries + +It's possible to convert a `*retryablehttp.Client` directly to a `*http.Client`. +This makes use of retryablehttp broadly applicable with minimal effort. Simply +configure a `*retryablehttp.Client` as you wish, and then call `StandardClient()`: + +```go +retryClient := retryablehttp.NewClient() +retryClient.RetryMax = 10 + +standardClient := retryClient.StandardClient() // *http.Client +``` + +For more usage and examples see the +[godoc](http://godoc.org/github.com/hashicorp/go-retryablehttp). diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/client.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/client.go new file mode 100644 index 0000000000..cad96bd97b --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/client.go @@ -0,0 +1,832 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +// Package retryablehttp provides a familiar HTTP client interface with +// automatic retries and exponential backoff. It is a thin wrapper over the +// standard net/http client library and exposes nearly the same public API. +// This makes retryablehttp very easy to drop into existing programs. +// +// retryablehttp performs automatic retries under certain conditions. Mainly, if +// an error is returned by the client (connection errors etc), or if a 500-range +// response is received, then a retry is invoked. Otherwise, the response is +// returned and left to the caller to interpret. +// +// Requests which take a request body should provide a non-nil function +// parameter. The best choice is to provide either a function satisfying +// ReaderFunc which provides multiple io.Readers in an efficient manner, a +// *bytes.Buffer (the underlying raw byte slice will be used) or a raw byte +// slice. As it is a reference type, and we will wrap it as needed by readers, +// we can efficiently re-use the request body without needing to copy it. If an +// io.Reader (such as a *bytes.Reader) is provided, the full body will be read +// prior to the first request, and will be efficiently re-used for any retries. +// ReadSeeker can be used, but some users have observed occasional data races +// between the net/http library and the Seek functionality of some +// implementations of ReadSeeker, so should be avoided if possible. +package retryablehttp + +import ( + "bytes" + "context" + "crypto/x509" + "fmt" + "io" + "io/ioutil" + "log" + "math" + "math/rand" + "net/http" + "net/url" + "os" + "regexp" + "strconv" + "strings" + "sync" + "time" + + cleanhttp "github.com/hashicorp/go-cleanhttp" +) + +var ( + // Default retry configuration + defaultRetryWaitMin = 1 * time.Second + defaultRetryWaitMax = 30 * time.Second + defaultRetryMax = 4 + + // defaultLogger is the logger provided with defaultClient + defaultLogger = log.New(os.Stderr, "", log.LstdFlags) + + // defaultClient is used for performing requests without explicitly making + // a new client. It is purposely private to avoid modifications. + defaultClient = NewClient() + + // We need to consume response bodies to maintain http connections, but + // limit the size we consume to respReadLimit. + respReadLimit = int64(4096) + + // A regular expression to match the error returned by net/http when the + // configured number of redirects is exhausted. This error isn't typed + // specifically so we resort to matching on the error string. + redirectsErrorRe = regexp.MustCompile(`stopped after \d+ redirects\z`) + + // A regular expression to match the error returned by net/http when the + // scheme specified in the URL is invalid. This error isn't typed + // specifically so we resort to matching on the error string. + schemeErrorRe = regexp.MustCompile(`unsupported protocol scheme`) + + // A regular expression to match the error returned by net/http when the + // TLS certificate is not trusted. This error isn't typed + // specifically so we resort to matching on the error string. + notTrustedErrorRe = regexp.MustCompile(`certificate is not trusted`) +) + +// ReaderFunc is the type of function that can be given natively to NewRequest +type ReaderFunc func() (io.Reader, error) + +// ResponseHandlerFunc is a type of function that takes in a Response, and does something with it. +// The ResponseHandlerFunc is called when the HTTP client successfully receives a response and the +// CheckRetry function indicates that a retry of the base request is not necessary. +// If an error is returned from this function, the CheckRetry policy will be used to determine +// whether to retry the whole request (including this handler). +// +// Make sure to check status codes! Even if the request was completed it may have a non-2xx status code. +// +// The response body is not automatically closed. It must be closed either by the ResponseHandlerFunc or +// by the caller out-of-band. Failure to do so will result in a memory leak. +type ResponseHandlerFunc func(*http.Response) error + +// LenReader is an interface implemented by many in-memory io.Reader's. Used +// for automatically sending the right Content-Length header when possible. +type LenReader interface { + Len() int +} + +// Request wraps the metadata needed to create HTTP requests. +type Request struct { + // body is a seekable reader over the request body payload. This is + // used to rewind the request data in between retries. + body ReaderFunc + + responseHandler ResponseHandlerFunc + + // Embed an HTTP request directly. This makes a *Request act exactly + // like an *http.Request so that all meta methods are supported. + *http.Request +} + +// WithContext returns wrapped Request with a shallow copy of underlying *http.Request +// with its context changed to ctx. The provided ctx must be non-nil. +func (r *Request) WithContext(ctx context.Context) *Request { + return &Request{ + body: r.body, + responseHandler: r.responseHandler, + Request: r.Request.WithContext(ctx), + } +} + +// SetResponseHandler allows setting the response handler. +func (r *Request) SetResponseHandler(fn ResponseHandlerFunc) { + r.responseHandler = fn +} + +// BodyBytes allows accessing the request body. It is an analogue to +// http.Request's Body variable, but it returns a copy of the underlying data +// rather than consuming it. +// +// This function is not thread-safe; do not call it at the same time as another +// call, or at the same time this request is being used with Client.Do. +func (r *Request) BodyBytes() ([]byte, error) { + if r.body == nil { + return nil, nil + } + body, err := r.body() + if err != nil { + return nil, err + } + buf := new(bytes.Buffer) + _, err = buf.ReadFrom(body) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// SetBody allows setting the request body. +// +// It is useful if a new body needs to be set without constructing a new Request. +func (r *Request) SetBody(rawBody interface{}) error { + bodyReader, contentLength, err := getBodyReaderAndContentLength(rawBody) + if err != nil { + return err + } + r.body = bodyReader + r.ContentLength = contentLength + return nil +} + +// WriteTo allows copying the request body into a writer. +// +// It writes data to w until there's no more data to write or +// when an error occurs. The return int64 value is the number of bytes +// written. Any error encountered during the write is also returned. +// The signature matches io.WriterTo interface. +func (r *Request) WriteTo(w io.Writer) (int64, error) { + body, err := r.body() + if err != nil { + return 0, err + } + if c, ok := body.(io.Closer); ok { + defer c.Close() + } + return io.Copy(w, body) +} + +func getBodyReaderAndContentLength(rawBody interface{}) (ReaderFunc, int64, error) { + var bodyReader ReaderFunc + var contentLength int64 + + switch body := rawBody.(type) { + // If they gave us a function already, great! Use it. + case ReaderFunc: + bodyReader = body + tmp, err := body() + if err != nil { + return nil, 0, err + } + if lr, ok := tmp.(LenReader); ok { + contentLength = int64(lr.Len()) + } + if c, ok := tmp.(io.Closer); ok { + c.Close() + } + + case func() (io.Reader, error): + bodyReader = body + tmp, err := body() + if err != nil { + return nil, 0, err + } + if lr, ok := tmp.(LenReader); ok { + contentLength = int64(lr.Len()) + } + if c, ok := tmp.(io.Closer); ok { + c.Close() + } + + // If a regular byte slice, we can read it over and over via new + // readers + case []byte: + buf := body + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf), nil + } + contentLength = int64(len(buf)) + + // If a bytes.Buffer we can read the underlying byte slice over and + // over + case *bytes.Buffer: + buf := body + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf.Bytes()), nil + } + contentLength = int64(buf.Len()) + + // We prioritize *bytes.Reader here because we don't really want to + // deal with it seeking so want it to match here instead of the + // io.ReadSeeker case. + case *bytes.Reader: + buf, err := ioutil.ReadAll(body) + if err != nil { + return nil, 0, err + } + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf), nil + } + contentLength = int64(len(buf)) + + // Compat case + case io.ReadSeeker: + raw := body + bodyReader = func() (io.Reader, error) { + _, err := raw.Seek(0, 0) + return ioutil.NopCloser(raw), err + } + if lr, ok := raw.(LenReader); ok { + contentLength = int64(lr.Len()) + } + + // Read all in so we can reset + case io.Reader: + buf, err := ioutil.ReadAll(body) + if err != nil { + return nil, 0, err + } + if len(buf) == 0 { + bodyReader = func() (io.Reader, error) { + return http.NoBody, nil + } + contentLength = 0 + } else { + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf), nil + } + contentLength = int64(len(buf)) + } + + // No body provided, nothing to do + case nil: + + // Unrecognized type + default: + return nil, 0, fmt.Errorf("cannot handle type %T", rawBody) + } + return bodyReader, contentLength, nil +} + +// FromRequest wraps an http.Request in a retryablehttp.Request +func FromRequest(r *http.Request) (*Request, error) { + bodyReader, _, err := getBodyReaderAndContentLength(r.Body) + if err != nil { + return nil, err + } + // Could assert contentLength == r.ContentLength + return &Request{body: bodyReader, Request: r}, nil +} + +// NewRequest creates a new wrapped request. +func NewRequest(method, url string, rawBody interface{}) (*Request, error) { + return NewRequestWithContext(context.Background(), method, url, rawBody) +} + +// NewRequestWithContext creates a new wrapped request with the provided context. +// +// The context controls the entire lifetime of a request and its response: +// obtaining a connection, sending the request, and reading the response headers and body. +func NewRequestWithContext(ctx context.Context, method, url string, rawBody interface{}) (*Request, error) { + bodyReader, contentLength, err := getBodyReaderAndContentLength(rawBody) + if err != nil { + return nil, err + } + + httpReq, err := http.NewRequestWithContext(ctx, method, url, nil) + if err != nil { + return nil, err + } + httpReq.ContentLength = contentLength + + return &Request{body: bodyReader, Request: httpReq}, nil +} + +// Logger interface allows to use other loggers than +// standard log.Logger. +type Logger interface { + Printf(string, ...interface{}) +} + +// LeveledLogger is an interface that can be implemented by any logger or a +// logger wrapper to provide leveled logging. The methods accept a message +// string and a variadic number of key-value pairs. For log.Printf style +// formatting where message string contains a format specifier, use Logger +// interface. +type LeveledLogger interface { + Error(msg string, keysAndValues ...interface{}) + Info(msg string, keysAndValues ...interface{}) + Debug(msg string, keysAndValues ...interface{}) + Warn(msg string, keysAndValues ...interface{}) +} + +// hookLogger adapts an LeveledLogger to Logger for use by the existing hook functions +// without changing the API. +type hookLogger struct { + LeveledLogger +} + +func (h hookLogger) Printf(s string, args ...interface{}) { + h.Info(fmt.Sprintf(s, args...)) +} + +// RequestLogHook allows a function to run before each retry. The HTTP +// request which will be made, and the retry number (0 for the initial +// request) are available to users. The internal logger is exposed to +// consumers. +type RequestLogHook func(Logger, *http.Request, int) + +// ResponseLogHook is like RequestLogHook, but allows running a function +// on each HTTP response. This function will be invoked at the end of +// every HTTP request executed, regardless of whether a subsequent retry +// needs to be performed or not. If the response body is read or closed +// from this method, this will affect the response returned from Do(). +type ResponseLogHook func(Logger, *http.Response) + +// CheckRetry specifies a policy for handling retries. It is called +// following each request with the response and error values returned by +// the http.Client. If CheckRetry returns false, the Client stops retrying +// and returns the response to the caller. If CheckRetry returns an error, +// that error value is returned in lieu of the error from the request. The +// Client will close any response body when retrying, but if the retry is +// aborted it is up to the CheckRetry callback to properly close any +// response body before returning. +type CheckRetry func(ctx context.Context, resp *http.Response, err error) (bool, error) + +// Backoff specifies a policy for how long to wait between retries. +// It is called after a failing request to determine the amount of time +// that should pass before trying again. +type Backoff func(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration + +// ErrorHandler is called if retries are expired, containing the last status +// from the http library. If not specified, default behavior for the library is +// to close the body and return an error indicating how many tries were +// attempted. If overriding this, be sure to close the body if needed. +type ErrorHandler func(resp *http.Response, err error, numTries int) (*http.Response, error) + +// Client is used to make HTTP requests. It adds additional functionality +// like automatic retries to tolerate minor outages. +type Client struct { + HTTPClient *http.Client // Internal HTTP client. + Logger interface{} // Customer logger instance. Can be either Logger or LeveledLogger + + RetryWaitMin time.Duration // Minimum time to wait + RetryWaitMax time.Duration // Maximum time to wait + RetryMax int // Maximum number of retries + + // RequestLogHook allows a user-supplied function to be called + // before each retry. + RequestLogHook RequestLogHook + + // ResponseLogHook allows a user-supplied function to be called + // with the response from each HTTP request executed. + ResponseLogHook ResponseLogHook + + // CheckRetry specifies the policy for handling retries, and is called + // after each request. The default policy is DefaultRetryPolicy. + CheckRetry CheckRetry + + // Backoff specifies the policy for how long to wait between retries + Backoff Backoff + + // ErrorHandler specifies the custom error handler to use, if any + ErrorHandler ErrorHandler + + loggerInit sync.Once + clientInit sync.Once +} + +// NewClient creates a new Client with default settings. +func NewClient() *Client { + return &Client{ + HTTPClient: cleanhttp.DefaultPooledClient(), + Logger: defaultLogger, + RetryWaitMin: defaultRetryWaitMin, + RetryWaitMax: defaultRetryWaitMax, + RetryMax: defaultRetryMax, + CheckRetry: DefaultRetryPolicy, + Backoff: DefaultBackoff, + } +} + +func (c *Client) logger() interface{} { + c.loggerInit.Do(func() { + if c.Logger == nil { + return + } + + switch c.Logger.(type) { + case Logger, LeveledLogger: + // ok + default: + // This should happen in dev when they are setting Logger and work on code, not in prod. + panic(fmt.Sprintf("invalid logger type passed, must be Logger or LeveledLogger, was %T", c.Logger)) + } + }) + + return c.Logger +} + +// DefaultRetryPolicy provides a default callback for Client.CheckRetry, which +// will retry on connection errors and server errors. +func DefaultRetryPolicy(ctx context.Context, resp *http.Response, err error) (bool, error) { + // do not retry on context.Canceled or context.DeadlineExceeded + if ctx.Err() != nil { + return false, ctx.Err() + } + + // don't propagate other errors + shouldRetry, _ := baseRetryPolicy(resp, err) + return shouldRetry, nil +} + +// ErrorPropagatedRetryPolicy is the same as DefaultRetryPolicy, except it +// propagates errors back instead of returning nil. This allows you to inspect +// why it decided to retry or not. +func ErrorPropagatedRetryPolicy(ctx context.Context, resp *http.Response, err error) (bool, error) { + // do not retry on context.Canceled or context.DeadlineExceeded + if ctx.Err() != nil { + return false, ctx.Err() + } + + return baseRetryPolicy(resp, err) +} + +func baseRetryPolicy(resp *http.Response, err error) (bool, error) { + if err != nil { + if v, ok := err.(*url.Error); ok { + // Don't retry if the error was due to too many redirects. + if redirectsErrorRe.MatchString(v.Error()) { + return false, v + } + + // Don't retry if the error was due to an invalid protocol scheme. + if schemeErrorRe.MatchString(v.Error()) { + return false, v + } + + // Don't retry if the error was due to TLS cert verification failure. + if notTrustedErrorRe.MatchString(v.Error()) { + return false, v + } + if _, ok := v.Err.(x509.UnknownAuthorityError); ok { + return false, v + } + } + + // The error is likely recoverable so retry. + return true, nil + } + + // 429 Too Many Requests is recoverable. Sometimes the server puts + // a Retry-After response header to indicate when the server is + // available to start processing request from client. + if resp.StatusCode == http.StatusTooManyRequests { + return true, nil + } + + // Check the response code. We retry on 500-range responses to allow + // the server time to recover, as 500's are typically not permanent + // errors and may relate to outages on the server side. This will catch + // invalid response codes as well, like 0 and 999. + if resp.StatusCode == 0 || (resp.StatusCode >= 500 && resp.StatusCode != http.StatusNotImplemented) { + return true, fmt.Errorf("unexpected HTTP status %s", resp.Status) + } + + return false, nil +} + +// DefaultBackoff provides a default callback for Client.Backoff which +// will perform exponential backoff based on the attempt number and limited +// by the provided minimum and maximum durations. +// +// It also tries to parse Retry-After response header when a http.StatusTooManyRequests +// (HTTP Code 429) is found in the resp parameter. Hence it will return the number of +// seconds the server states it may be ready to process more requests from this client. +func DefaultBackoff(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration { + if resp != nil { + if resp.StatusCode == http.StatusTooManyRequests || resp.StatusCode == http.StatusServiceUnavailable { + if s, ok := resp.Header["Retry-After"]; ok { + if sleep, err := strconv.ParseInt(s[0], 10, 64); err == nil { + return time.Second * time.Duration(sleep) + } + } + } + } + + mult := math.Pow(2, float64(attemptNum)) * float64(min) + sleep := time.Duration(mult) + if float64(sleep) != mult || sleep > max { + sleep = max + } + return sleep +} + +// LinearJitterBackoff provides a callback for Client.Backoff which will +// perform linear backoff based on the attempt number and with jitter to +// prevent a thundering herd. +// +// min and max here are *not* absolute values. The number to be multiplied by +// the attempt number will be chosen at random from between them, thus they are +// bounding the jitter. +// +// For instance: +// * To get strictly linear backoff of one second increasing each retry, set +// both to one second (1s, 2s, 3s, 4s, ...) +// * To get a small amount of jitter centered around one second increasing each +// retry, set to around one second, such as a min of 800ms and max of 1200ms +// (892ms, 2102ms, 2945ms, 4312ms, ...) +// * To get extreme jitter, set to a very wide spread, such as a min of 100ms +// and a max of 20s (15382ms, 292ms, 51321ms, 35234ms, ...) +func LinearJitterBackoff(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration { + // attemptNum always starts at zero but we want to start at 1 for multiplication + attemptNum++ + + if max <= min { + // Unclear what to do here, or they are the same, so return min * + // attemptNum + return min * time.Duration(attemptNum) + } + + // Seed rand; doing this every time is fine + rand := rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) + + // Pick a random number that lies somewhere between the min and max and + // multiply by the attemptNum. attemptNum starts at zero so we always + // increment here. We first get a random percentage, then apply that to the + // difference between min and max, and add to min. + jitter := rand.Float64() * float64(max-min) + jitterMin := int64(jitter) + int64(min) + return time.Duration(jitterMin * int64(attemptNum)) +} + +// PassthroughErrorHandler is an ErrorHandler that directly passes through the +// values from the net/http library for the final request. The body is not +// closed. +func PassthroughErrorHandler(resp *http.Response, err error, _ int) (*http.Response, error) { + return resp, err +} + +// Do wraps calling an HTTP method with retries. +func (c *Client) Do(req *Request) (*http.Response, error) { + c.clientInit.Do(func() { + if c.HTTPClient == nil { + c.HTTPClient = cleanhttp.DefaultPooledClient() + } + }) + + logger := c.logger() + + if logger != nil { + switch v := logger.(type) { + case LeveledLogger: + v.Debug("performing request", "method", req.Method, "url", req.URL) + case Logger: + v.Printf("[DEBUG] %s %s", req.Method, req.URL) + } + } + + var resp *http.Response + var attempt int + var shouldRetry bool + var doErr, respErr, checkErr error + + for i := 0; ; i++ { + doErr, respErr = nil, nil + attempt++ + + // Always rewind the request body when non-nil. + if req.body != nil { + body, err := req.body() + if err != nil { + c.HTTPClient.CloseIdleConnections() + return resp, err + } + if c, ok := body.(io.ReadCloser); ok { + req.Body = c + } else { + req.Body = ioutil.NopCloser(body) + } + } + + if c.RequestLogHook != nil { + switch v := logger.(type) { + case LeveledLogger: + c.RequestLogHook(hookLogger{v}, req.Request, i) + case Logger: + c.RequestLogHook(v, req.Request, i) + default: + c.RequestLogHook(nil, req.Request, i) + } + } + + // Attempt the request + resp, doErr = c.HTTPClient.Do(req.Request) + + // Check if we should continue with retries. + shouldRetry, checkErr = c.CheckRetry(req.Context(), resp, doErr) + if !shouldRetry && doErr == nil && req.responseHandler != nil { + respErr = req.responseHandler(resp) + shouldRetry, checkErr = c.CheckRetry(req.Context(), resp, respErr) + } + + err := doErr + if respErr != nil { + err = respErr + } + if err != nil { + switch v := logger.(type) { + case LeveledLogger: + v.Error("request failed", "error", err, "method", req.Method, "url", req.URL) + case Logger: + v.Printf("[ERR] %s %s request failed: %v", req.Method, req.URL, err) + } + } else { + // Call this here to maintain the behavior of logging all requests, + // even if CheckRetry signals to stop. + if c.ResponseLogHook != nil { + // Call the response logger function if provided. + switch v := logger.(type) { + case LeveledLogger: + c.ResponseLogHook(hookLogger{v}, resp) + case Logger: + c.ResponseLogHook(v, resp) + default: + c.ResponseLogHook(nil, resp) + } + } + } + + if !shouldRetry { + break + } + + // We do this before drainBody because there's no need for the I/O if + // we're breaking out + remain := c.RetryMax - i + if remain <= 0 { + break + } + + // We're going to retry, consume any response to reuse the connection. + if doErr == nil { + c.drainBody(resp.Body) + } + + wait := c.Backoff(c.RetryWaitMin, c.RetryWaitMax, i, resp) + if logger != nil { + desc := fmt.Sprintf("%s %s", req.Method, req.URL) + if resp != nil { + desc = fmt.Sprintf("%s (status: %d)", desc, resp.StatusCode) + } + switch v := logger.(type) { + case LeveledLogger: + v.Debug("retrying request", "request", desc, "timeout", wait, "remaining", remain) + case Logger: + v.Printf("[DEBUG] %s: retrying in %s (%d left)", desc, wait, remain) + } + } + timer := time.NewTimer(wait) + select { + case <-req.Context().Done(): + timer.Stop() + c.HTTPClient.CloseIdleConnections() + return nil, req.Context().Err() + case <-timer.C: + } + + // Make shallow copy of http Request so that we can modify its body + // without racing against the closeBody call in persistConn.writeLoop. + httpreq := *req.Request + req.Request = &httpreq + } + + // this is the closest we have to success criteria + if doErr == nil && respErr == nil && checkErr == nil && !shouldRetry { + return resp, nil + } + + defer c.HTTPClient.CloseIdleConnections() + + var err error + if checkErr != nil { + err = checkErr + } else if respErr != nil { + err = respErr + } else { + err = doErr + } + + if c.ErrorHandler != nil { + return c.ErrorHandler(resp, err, attempt) + } + + // By default, we close the response body and return an error without + // returning the response + if resp != nil { + c.drainBody(resp.Body) + } + + // this means CheckRetry thought the request was a failure, but didn't + // communicate why + if err == nil { + return nil, fmt.Errorf("%s %s giving up after %d attempt(s)", + req.Method, req.URL, attempt) + } + + return nil, fmt.Errorf("%s %s giving up after %d attempt(s): %w", + req.Method, req.URL, attempt, err) +} + +// Try to read the response body so we can reuse this connection. +func (c *Client) drainBody(body io.ReadCloser) { + defer body.Close() + _, err := io.Copy(ioutil.Discard, io.LimitReader(body, respReadLimit)) + if err != nil { + if c.logger() != nil { + switch v := c.logger().(type) { + case LeveledLogger: + v.Error("error reading response body", "error", err) + case Logger: + v.Printf("[ERR] error reading response body: %v", err) + } + } + } +} + +// Get is a shortcut for doing a GET request without making a new client. +func Get(url string) (*http.Response, error) { + return defaultClient.Get(url) +} + +// Get is a convenience helper for doing simple GET requests. +func (c *Client) Get(url string) (*http.Response, error) { + req, err := NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return c.Do(req) +} + +// Head is a shortcut for doing a HEAD request without making a new client. +func Head(url string) (*http.Response, error) { + return defaultClient.Head(url) +} + +// Head is a convenience method for doing simple HEAD requests. +func (c *Client) Head(url string) (*http.Response, error) { + req, err := NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return c.Do(req) +} + +// Post is a shortcut for doing a POST request without making a new client. +func Post(url, bodyType string, body interface{}) (*http.Response, error) { + return defaultClient.Post(url, bodyType, body) +} + +// Post is a convenience method for doing simple POST requests. +func (c *Client) Post(url, bodyType string, body interface{}) (*http.Response, error) { + req, err := NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return c.Do(req) +} + +// PostForm is a shortcut to perform a POST with form data without creating +// a new client. +func PostForm(url string, data url.Values) (*http.Response, error) { + return defaultClient.PostForm(url, data) +} + +// PostForm is a convenience method for doing simple POST operations using +// pre-filled url.Values form data. +func (c *Client) PostForm(url string, data url.Values) (*http.Response, error) { + return c.Post(url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} + +// StandardClient returns a stdlib *http.Client with a custom Transport, which +// shims in a *retryablehttp.Client for added retries. +func (c *Client) StandardClient() *http.Client { + return &http.Client{ + Transport: &RoundTripper{Client: c}, + } +} diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/roundtripper.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/roundtripper.go new file mode 100644 index 0000000000..8c407adb3b --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/go-retryablehttp/roundtripper.go @@ -0,0 +1,55 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package retryablehttp + +import ( + "errors" + "net/http" + "net/url" + "sync" +) + +// RoundTripper implements the http.RoundTripper interface, using a retrying +// HTTP client to execute requests. +// +// It is important to note that retryablehttp doesn't always act exactly as a +// RoundTripper should. This is highly dependent on the retryable client's +// configuration. +type RoundTripper struct { + // The client to use during requests. If nil, the default retryablehttp + // client and settings will be used. + Client *Client + + // once ensures that the logic to initialize the default client runs at + // most once, in a single thread. + once sync.Once +} + +// init initializes the underlying retryable client. +func (rt *RoundTripper) init() { + if rt.Client == nil { + rt.Client = NewClient() + } +} + +// RoundTrip satisfies the http.RoundTripper interface. +func (rt *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + rt.once.Do(rt.init) + + // Convert the request to be retryable. + retryableReq, err := FromRequest(req) + if err != nil { + return nil, err + } + + // Execute the request. + resp, err := rt.Client.Do(retryableReq) + // If we got an error returned by standard library's `Do` method, unwrap it + // otherwise we will wind up erroneously re-nesting the error. + if _, ok := err.(*url.Error); ok { + return resp, errors.Unwrap(err) + } + + return resp, err +} diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/.golangci.yml b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/.golangci.yml new file mode 100644 index 0000000000..49202fc41e --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/.golangci.yml @@ -0,0 +1,30 @@ +linters: + enable: + - megacheck + - revive + - govet + - unconvert + - megacheck + - gas + - gocyclo + - dupl + - misspell + - unparam + - unused + - typecheck + - ineffassign + - stylecheck + - exportloopref + - gocritic + - nakedret + - gosimple + - prealloc + fast: false + disable-all: true + +issues: + exclude-rules: + - path: _test\.go + linters: + - dupl + exclude-use-default: false diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/2q.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/2q.go index e474cd0758..15fcad0306 100644 --- a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/2q.go +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/2q.go @@ -44,7 +44,7 @@ func New2Q(size int) (*TwoQueueCache, error) { // New2QParams creates a new TwoQueueCache using the provided // parameter values. -func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) { +func New2QParams(size int, recentRatio, ghostRatio float64) (*TwoQueueCache, error) { if size <= 0 { return nil, fmt.Errorf("invalid size") } @@ -138,7 +138,6 @@ func (c *TwoQueueCache) Add(key, value interface{}) { // Add to the recently seen list c.ensureSpace(false) c.recent.Add(key, value) - return } // ensureSpace is used to ensure we have space in the cache diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/LICENSE b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/LICENSE index be2cc4dfb6..0e5d580e0e 100644 --- a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/LICENSE +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/LICENSE @@ -1,3 +1,5 @@ +Copyright (c) 2014 HashiCorp, Inc. + Mozilla Public License, version 2.0 1. Definitions diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/README.md b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/README.md index 33e58cfaf9..063bb16056 100644 --- a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/README.md +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/README.md @@ -7,7 +7,7 @@ thread safe LRU cache. It is based on the cache in Groupcache. Documentation ============= -Full docs are available on [Godoc](http://godoc.org/github.com/hashicorp/golang-lru) +Full docs are available on [Godoc](https://pkg.go.dev/github.com/hashicorp/golang-lru) Example ======= diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/arc.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/arc.go index 555225a218..e396f8428a 100644 --- a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/arc.go +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/arc.go @@ -173,7 +173,6 @@ func (c *ARCCache) Add(key, value interface{}) { // Add to the recently seen list c.t1.Add(key, value) - return } // replace is used to adaptively evict from either T1 or T2 diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/lru.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/lru.go index 4e5e9d8fd0..895d8e3ea0 100644 --- a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/lru.go +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/lru.go @@ -6,10 +6,17 @@ import ( "github.com/hashicorp/golang-lru/simplelru" ) +const ( + // DefaultEvictedBufferSize defines the default buffer size to store evicted key/val + DefaultEvictedBufferSize = 16 +) + // Cache is a thread-safe fixed size LRU cache. type Cache struct { - lru simplelru.LRUCache - lock sync.RWMutex + lru *simplelru.LRU + evictedKeys, evictedVals []interface{} + onEvictedCB func(k, v interface{}) + lock sync.RWMutex } // New creates an LRU of the given size. @@ -19,30 +26,63 @@ func New(size int) (*Cache, error) { // NewWithEvict constructs a fixed size cache with the given eviction // callback. -func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) { - lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted)) - if err != nil { - return nil, err +func NewWithEvict(size int, onEvicted func(key, value interface{})) (c *Cache, err error) { + // create a cache with default settings + c = &Cache{ + onEvictedCB: onEvicted, } - c := &Cache{ - lru: lru, + if onEvicted != nil { + c.initEvictBuffers() + onEvicted = c.onEvicted } - return c, nil + c.lru, err = simplelru.NewLRU(size, onEvicted) + return +} + +func (c *Cache) initEvictBuffers() { + c.evictedKeys = make([]interface{}, 0, DefaultEvictedBufferSize) + c.evictedVals = make([]interface{}, 0, DefaultEvictedBufferSize) +} + +// onEvicted save evicted key/val and sent in externally registered callback +// outside of critical section +func (c *Cache) onEvicted(k, v interface{}) { + c.evictedKeys = append(c.evictedKeys, k) + c.evictedVals = append(c.evictedVals, v) } // Purge is used to completely clear the cache. func (c *Cache) Purge() { + var ks, vs []interface{} c.lock.Lock() c.lru.Purge() + if c.onEvictedCB != nil && len(c.evictedKeys) > 0 { + ks, vs = c.evictedKeys, c.evictedVals + c.initEvictBuffers() + } c.lock.Unlock() + // invoke callback outside of critical section + if c.onEvictedCB != nil { + for i := 0; i < len(ks); i++ { + c.onEvictedCB(ks[i], vs[i]) + } + } } // Add adds a value to the cache. Returns true if an eviction occurred. func (c *Cache) Add(key, value interface{}) (evicted bool) { + var k, v interface{} c.lock.Lock() evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() - return evicted + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } + return } // Get looks up a key's value from the cache. @@ -75,13 +115,21 @@ func (c *Cache) Peek(key interface{}) (value interface{}, ok bool) { // recent-ness or deleting it for being stale, and if not, adds the value. // Returns whether found and whether an eviction occurred. func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { + var k, v interface{} c.lock.Lock() - defer c.lock.Unlock() - if c.lru.Contains(key) { + c.lock.Unlock() return true, false } evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } return false, evicted } @@ -89,47 +137,80 @@ func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { // recent-ness or deleting it for being stale, and if not, adds the value. // Returns whether found and whether an eviction occurred. func (c *Cache) PeekOrAdd(key, value interface{}) (previous interface{}, ok, evicted bool) { + var k, v interface{} c.lock.Lock() - defer c.lock.Unlock() - previous, ok = c.lru.Peek(key) if ok { + c.lock.Unlock() return previous, true, false } - evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } return nil, false, evicted } // Remove removes the provided key from the cache. func (c *Cache) Remove(key interface{}) (present bool) { + var k, v interface{} c.lock.Lock() present = c.lru.Remove(key) + if c.onEvictedCB != nil && present { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() + if c.onEvictedCB != nil && present { + c.onEvictedCB(k, v) + } return } // Resize changes the cache size. func (c *Cache) Resize(size int) (evicted int) { + var ks, vs []interface{} c.lock.Lock() evicted = c.lru.Resize(size) + if c.onEvictedCB != nil && evicted > 0 { + ks, vs = c.evictedKeys, c.evictedVals + c.initEvictBuffers() + } c.lock.Unlock() + if c.onEvictedCB != nil && evicted > 0 { + for i := 0; i < len(ks); i++ { + c.onEvictedCB(ks[i], vs[i]) + } + } return evicted } // RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() (key interface{}, value interface{}, ok bool) { +func (c *Cache) RemoveOldest() (key, value interface{}, ok bool) { + var k, v interface{} c.lock.Lock() key, value, ok = c.lru.RemoveOldest() + if c.onEvictedCB != nil && ok { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() + if c.onEvictedCB != nil && ok { + c.onEvictedCB(k, v) + } return } // GetOldest returns the oldest entry -func (c *Cache) GetOldest() (key interface{}, value interface{}, ok bool) { - c.lock.Lock() +func (c *Cache) GetOldest() (key, value interface{}, ok bool) { + c.lock.RLock() key, value, ok = c.lru.GetOldest() - c.lock.Unlock() + c.lock.RUnlock() return } diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru.go index a86c8539e0..9233583c91 100644 --- a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru.go +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru.go @@ -25,7 +25,7 @@ type entry struct { // NewLRU constructs an LRU of the given size func NewLRU(size int, onEvict EvictCallback) (*LRU, error) { if size <= 0 { - return nil, errors.New("Must provide a positive size") + return nil, errors.New("must provide a positive size") } c := &LRU{ size: size, @@ -109,7 +109,7 @@ func (c *LRU) Remove(key interface{}) (present bool) { } // RemoveOldest removes the oldest item from the cache. -func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { +func (c *LRU) RemoveOldest() (key, value interface{}, ok bool) { ent := c.evictList.Back() if ent != nil { c.removeElement(ent) @@ -120,7 +120,7 @@ func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { } // GetOldest returns the oldest entry -func (c *LRU) GetOldest() (key interface{}, value interface{}, ok bool) { +func (c *LRU) GetOldest() (key, value interface{}, ok bool) { ent := c.evictList.Back() if ent != nil { kv := ent.Value.(*entry) diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru_interface.go index 92d70934d6..cb7f8caf03 100644 --- a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru_interface.go +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/simplelru/lru_interface.go @@ -1,3 +1,4 @@ +// Package simplelru provides simple LRU implementation based on build-in container/list. package simplelru // LRUCache is the interface for simple LRU cache. @@ -34,6 +35,6 @@ type LRUCache interface { // Clears all cache entries. Purge() - // Resizes cache, returning number evicted - Resize(int) int + // Resizes cache, returning number evicted + Resize(int) int } diff --git a/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/testing.go b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/testing.go new file mode 100644 index 0000000000..492760782c --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/hashicorp/golang-lru/testing.go @@ -0,0 +1,16 @@ +package lru + +import ( + "crypto/rand" + "math" + "math/big" + "testing" +) + +func getRand(tb testing.TB) int64 { + out, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64)) + if err != nil { + tb.Fatal(err) + } + return out.Int64() +} diff --git a/vendor/github.com/containerd/cgroups/LICENSE b/third_party/VENDOR-LICENSE/github.com/manifestival/client-go-client/LICENSE similarity index 100% rename from vendor/github.com/containerd/cgroups/LICENSE rename to third_party/VENDOR-LICENSE/github.com/manifestival/client-go-client/LICENSE diff --git a/third_party/VENDOR-LICENSE/github.com/manifestival/manifestival/LICENSE b/third_party/VENDOR-LICENSE/github.com/manifestival/manifestival/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/manifestival/manifestival/LICENSE @@ -0,0 +1,201 @@ + 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/third_party/VENDOR-LICENSE/github.com/moby/patternmatcher/LICENSE b/third_party/VENDOR-LICENSE/github.com/moby/patternmatcher/LICENSE new file mode 100644 index 0000000000..6d8d58fb67 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/moby/patternmatcher/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://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 + + Copyright 2013-2018 Docker, Inc. + + 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 + + https://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/third_party/VENDOR-LICENSE/github.com/moby/patternmatcher/NOTICE b/third_party/VENDOR-LICENSE/github.com/moby/patternmatcher/NOTICE new file mode 100644 index 0000000000..e5154640fe --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/moby/patternmatcher/NOTICE @@ -0,0 +1,16 @@ +Docker +Copyright 2012-2017 Docker, Inc. + +This product includes software developed at Docker, Inc. (https://www.docker.com). + +The following is courtesy of our legal counsel: + + +Use and transfer of Docker may be subject to certain restrictions by the +United States and other governments. +It is your responsibility to ensure that your use and/or transfer does not +violate applicable laws. + +For more information, please see https://www.bis.doc.gov + +See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. diff --git a/third_party/VENDOR-LICENSE/github.com/moby/sys/mount/LICENSE b/third_party/VENDOR-LICENSE/github.com/moby/sys/sequential/LICENSE similarity index 100% rename from third_party/VENDOR-LICENSE/github.com/moby/sys/mount/LICENSE rename to third_party/VENDOR-LICENSE/github.com/moby/sys/sequential/LICENSE diff --git a/third_party/VENDOR-LICENSE/github.com/skeema/knownhosts/NOTICE b/third_party/VENDOR-LICENSE/github.com/skeema/knownhosts/NOTICE index 12db8fc650..794c676a26 100644 --- a/third_party/VENDOR-LICENSE/github.com/skeema/knownhosts/NOTICE +++ b/third_party/VENDOR-LICENSE/github.com/skeema/knownhosts/NOTICE @@ -1,4 +1,4 @@ -Copyright 2022 Skeema LLC +Copyright 2023 Skeema LLC and the Skeema authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/third_party/VENDOR-LICENSE/github.com/xanzy/go-gitlab/LICENSE b/third_party/VENDOR-LICENSE/github.com/xanzy/go-gitlab/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/xanzy/go-gitlab/LICENSE @@ -0,0 +1,201 @@ + 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/third_party/VENDOR-LICENSE/golang.org/x/exp/maps/LICENSE b/third_party/VENDOR-LICENSE/golang.org/x/exp/maps/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/third_party/VENDOR-LICENSE/golang.org/x/exp/maps/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/third_party/VENDOR-LICENSE/google.golang.org/genproto/LICENSE b/third_party/VENDOR-LICENSE/google.golang.org/genproto/googleapis/api/LICENSE similarity index 100% rename from third_party/VENDOR-LICENSE/google.golang.org/genproto/LICENSE rename to third_party/VENDOR-LICENSE/google.golang.org/genproto/googleapis/api/LICENSE diff --git a/vendor/github.com/moby/sys/mount/LICENSE b/third_party/VENDOR-LICENSE/google.golang.org/genproto/googleapis/rpc/status/LICENSE similarity index 100% rename from vendor/github.com/moby/sys/mount/LICENSE rename to third_party/VENDOR-LICENSE/google.golang.org/genproto/googleapis/rpc/status/LICENSE diff --git a/third_party/VENDOR-LICENSE/google.golang.org/genproto/protobuf/field_mask/LICENSE b/third_party/VENDOR-LICENSE/google.golang.org/genproto/protobuf/field_mask/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/third_party/VENDOR-LICENSE/google.golang.org/genproto/protobuf/field_mask/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/third_party/VENDOR-LICENSE/sigs.k8s.io/controller-runtime/pkg/client/apiutil/LICENSE b/third_party/VENDOR-LICENSE/sigs.k8s.io/controller-runtime/pkg/client/apiutil/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/third_party/VENDOR-LICENSE/sigs.k8s.io/controller-runtime/pkg/client/apiutil/LICENSE @@ -0,0 +1,201 @@ + 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/cloud.google.com/go/compute/internal/version.go b/vendor/cloud.google.com/go/compute/internal/version.go index 7dd6a0aa86..0b0f0e9141 100644 --- a/vendor/cloud.google.com/go/compute/internal/version.go +++ b/vendor/cloud.google.com/go/compute/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.15.1" +const Version = "1.20.0" diff --git a/vendor/github.com/Azure/go-ansiterm/SECURITY.md b/vendor/github.com/Azure/go-ansiterm/SECURITY.md new file mode 100644 index 0000000000..e138ec5d6a --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go index c90209a948..2a24ab80cf 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go @@ -127,6 +127,9 @@ type TokenRefreshCallback func(Token) error // TokenRefresh is a type representing a custom callback to refresh a token type TokenRefresh func(ctx context.Context, resource string) (*Token, error) +// JWTCallback is the type representing callback that will be called to get the federated OIDC JWT +type JWTCallback func() (string, error) + // Token encapsulates the access token used to authorize Azure requests. // https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow#service-to-service-access-token-response type Token struct { @@ -367,14 +370,18 @@ func (secret ServicePrincipalAuthorizationCodeSecret) MarshalJSON() ([]byte, err // ServicePrincipalFederatedSecret implements ServicePrincipalSecret for Federated JWTs. type ServicePrincipalFederatedSecret struct { - jwt string + jwtCallback JWTCallback } // SetAuthenticationValues is a method of the interface ServicePrincipalSecret. // It will populate the form submitted during OAuth Token Acquisition using a JWT signed by an OIDC issuer. -func (secret *ServicePrincipalFederatedSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { +func (secret *ServicePrincipalFederatedSecret) SetAuthenticationValues(_ *ServicePrincipalToken, v *url.Values) error { + jwt, err := secret.jwtCallback() + if err != nil { + return err + } - v.Set("client_assertion", secret.jwt) + v.Set("client_assertion", jwt) v.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer") return nil } @@ -687,6 +694,8 @@ func NewServicePrincipalTokenFromAuthorizationCode(oauthConfig OAuthConfig, clie } // NewServicePrincipalTokenFromFederatedToken creates a ServicePrincipalToken from the supplied federated OIDC JWT. +// +// Deprecated: Use NewServicePrincipalTokenFromFederatedTokenWithCallback to refresh jwt dynamically. func NewServicePrincipalTokenFromFederatedToken(oauthConfig OAuthConfig, clientID string, jwt string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { if err := validateOAuthConfig(oauthConfig); err != nil { return nil, err @@ -700,12 +709,37 @@ func NewServicePrincipalTokenFromFederatedToken(oauthConfig OAuthConfig, clientI if jwt == "" { return nil, fmt.Errorf("parameter 'jwt' cannot be empty") } + return NewServicePrincipalTokenFromFederatedTokenCallback( + oauthConfig, + clientID, + func() (string, error) { + return jwt, nil + }, + resource, + callbacks..., + ) +} + +// NewServicePrincipalTokenFromFederatedTokenCallback creates a ServicePrincipalToken from the supplied federated OIDC JWTCallback. +func NewServicePrincipalTokenFromFederatedTokenCallback(oauthConfig OAuthConfig, clientID string, jwtCallback JWTCallback, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + if jwtCallback == nil { + return nil, fmt.Errorf("parameter 'jwtCallback' cannot be empty") + } return NewServicePrincipalTokenWithSecret( oauthConfig, clientID, resource, &ServicePrincipalFederatedSecret{ - jwt: jwt, + jwtCallback: jwtCallback, }, callbacks..., ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/autorest.go b/vendor/github.com/Azure/go-autorest/autorest/autorest.go index aafdf021fd..211c98d1ed 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/autorest.go +++ b/vendor/github.com/Azure/go-autorest/autorest/autorest.go @@ -6,33 +6,33 @@ generated Go code. The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending, and Responding. A typical pattern is: - req, err := Prepare(&http.Request{}, - token.WithAuthorization()) + req, err := Prepare(&http.Request{}, + token.WithAuthorization()) - resp, err := Send(req, - WithLogging(logger), - DoErrorIfStatusCode(http.StatusInternalServerError), - DoCloseIfError(), - DoRetryForAttempts(5, time.Second)) + resp, err := Send(req, + WithLogging(logger), + DoErrorIfStatusCode(http.StatusInternalServerError), + DoCloseIfError(), + DoRetryForAttempts(5, time.Second)) - err = Respond(resp, - ByDiscardingBody(), - ByClosing()) + err = Respond(resp, + ByDiscardingBody(), + ByClosing()) Each phase relies on decorators to modify and / or manage processing. Decorators may first modify and then pass the data along, pass the data first and then modify the result, or wrap themselves around passing the data (such as a logger might do). Decorators run in the order provided. For example, the following: - req, err := Prepare(&http.Request{}, - WithBaseURL("https://microsoft.com/"), - WithPath("a"), - WithPath("b"), - WithPath("c")) + req, err := Prepare(&http.Request{}, + WithBaseURL("https://microsoft.com/"), + WithPath("a"), + WithPath("b"), + WithPath("c")) will set the URL to: - https://microsoft.com/a/b/c + https://microsoft.com/a/b/c Preparers and Responders may be shared and re-used (assuming the underlying decorators support sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go index 1328f1764c..868345db68 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go @@ -214,7 +214,7 @@ func (r Resource) String() string { // See https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-resource?tabs=json#resourceid. func ParseResourceID(resourceID string) (Resource, error) { - const resourceIDPatternText = `(?i)subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)` + const resourceIDPatternText = `(?i)^/subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)$` resourceIDPattern := regexp.MustCompile(resourceIDPatternText) match := resourceIDPattern.FindStringSubmatch(resourceID) diff --git a/vendor/github.com/Azure/go-autorest/autorest/utility.go b/vendor/github.com/Azure/go-autorest/autorest/utility.go index 3467b8fa60..d35b3850ab 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/utility.go +++ b/vendor/github.com/Azure/go-autorest/autorest/utility.go @@ -60,9 +60,9 @@ func NewDecoder(encodedAs EncodedAs, r io.Reader) Decoder { // is especially useful if there is a chance the data will fail to decode. // encodedAs specifies the expected encoding, r provides the io.Reader to the data, and v // is the decoding destination. -func CopyAndDecode(encodedAs EncodedAs, r io.Reader, v interface{}) (bytes.Buffer, error) { - b := bytes.Buffer{} - return b, NewDecoder(encodedAs, io.TeeReader(r, &b)).Decode(v) +func CopyAndDecode(encodedAs EncodedAs, r io.Reader, v interface{}) (b bytes.Buffer, err error) { + err = NewDecoder(encodedAs, io.TeeReader(r, &b)).Decode(v) + return } // TeeReadCloser returns a ReadCloser that writes to w what it reads from rc. diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go index 0ca1dc4fee..4d38f3bfce 100644 --- a/vendor/github.com/BurntSushi/toml/decode.go +++ b/vendor/github.com/BurntSushi/toml/decode.go @@ -91,7 +91,7 @@ const ( // UnmarshalText method. See the Unmarshaler example for a demonstration with // email addresses. // -// ### Key mapping +// # Key mapping // // TOML keys can map to either keys in a Go map or field names in a Go struct. // The special `toml` struct tag can be used to map TOML keys to struct fields @@ -248,7 +248,7 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error { case reflect.Bool: return md.unifyBool(data, rv) case reflect.Interface: - if rv.NumMethod() > 0 { // Only support empty interfaces are supported. + if rv.NumMethod() > 0 { /// Only empty interfaces are supported. return md.e("unsupported type %s", rv.Type()) } return md.unifyAnything(data, rv) diff --git a/vendor/github.com/BurntSushi/toml/deprecated.go b/vendor/github.com/BurntSushi/toml/deprecated.go index c6af3f239d..b9e309717e 100644 --- a/vendor/github.com/BurntSushi/toml/deprecated.go +++ b/vendor/github.com/BurntSushi/toml/deprecated.go @@ -5,17 +5,25 @@ import ( "io" ) +// TextMarshaler is an alias for encoding.TextMarshaler. +// // Deprecated: use encoding.TextMarshaler type TextMarshaler encoding.TextMarshaler +// TextUnmarshaler is an alias for encoding.TextUnmarshaler. +// // Deprecated: use encoding.TextUnmarshaler type TextUnmarshaler encoding.TextUnmarshaler +// PrimitiveDecode is an alias for MetaData.PrimitiveDecode(). +// // Deprecated: use MetaData.PrimitiveDecode. func PrimitiveDecode(primValue Primitive, v interface{}) error { md := MetaData{decoded: make(map[string]struct{})} return md.unify(primValue.undecoded, rvalue(v)) } +// DecodeReader is an alias for NewDecoder(r).Decode(v). +// // Deprecated: use NewDecoder(reader).Decode(&value). func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { return NewDecoder(r).Decode(v) } diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go index 930e1d521a..9cd25d7571 100644 --- a/vendor/github.com/BurntSushi/toml/encode.go +++ b/vendor/github.com/BurntSushi/toml/encode.go @@ -136,7 +136,8 @@ func NewEncoder(w io.Writer) *Encoder { // document. func (enc *Encoder) Encode(v interface{}) error { rv := eindirect(reflect.ValueOf(v)) - if err := enc.safeEncode(Key([]string{}), rv); err != nil { + err := enc.safeEncode(Key([]string{}), rv) + if err != nil { return err } return enc.w.Flush() @@ -457,6 +458,16 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) { frv := eindirect(rv.Field(i)) + if is32Bit { + // Copy so it works correct on 32bit archs; not clear why this + // is needed. See #314, and https://www.reddit.com/r/golang/comments/pnx8v4 + // This also works fine on 64bit, but 32bit archs are somewhat + // rare and this is a wee bit faster. + copyStart := make([]int, len(start)) + copy(copyStart, start) + start = copyStart + } + // Treat anonymous struct fields with tag names as though they are // not anonymous, like encoding/json does. // @@ -471,17 +482,7 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) { if typeIsTable(tomlTypeOfGo(frv)) { fieldsSub = append(fieldsSub, append(start, f.Index...)) } else { - // Copy so it works correct on 32bit archs; not clear why this - // is needed. See #314, and https://www.reddit.com/r/golang/comments/pnx8v4 - // This also works fine on 64bit, but 32bit archs are somewhat - // rare and this is a wee bit faster. - if is32Bit { - copyStart := make([]int, len(start)) - copy(copyStart, start) - fieldsDirect = append(fieldsDirect, append(copyStart, f.Index...)) - } else { - fieldsDirect = append(fieldsDirect, append(start, f.Index...)) - } + fieldsDirect = append(fieldsDirect, append(start, f.Index...)) } } } @@ -490,24 +491,27 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) { writeFields := func(fields [][]int) { for _, fieldIndex := range fields { fieldType := rt.FieldByIndex(fieldIndex) - fieldVal := eindirect(rv.FieldByIndex(fieldIndex)) + fieldVal := rv.FieldByIndex(fieldIndex) - if isNil(fieldVal) { /// Don't write anything for nil fields. + opts := getOptions(fieldType.Tag) + if opts.skip { + continue + } + if opts.omitempty && isEmpty(fieldVal) { continue } - opts := getOptions(fieldType.Tag) - if opts.skip { + fieldVal = eindirect(fieldVal) + + if isNil(fieldVal) { /// Don't write anything for nil fields. continue } + keyName := fieldType.Name if opts.name != "" { keyName = opts.name } - if opts.omitempty && enc.isEmpty(fieldVal) { - continue - } if opts.omitzero && isZero(fieldVal) { continue } @@ -649,7 +653,7 @@ func isZero(rv reflect.Value) bool { return false } -func (enc *Encoder) isEmpty(rv reflect.Value) bool { +func isEmpty(rv reflect.Value) bool { switch rv.Kind() { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: return rv.Len() == 0 @@ -664,13 +668,15 @@ func (enc *Encoder) isEmpty(rv reflect.Value) bool { // type b struct{ s []string } // s := a{field: b{s: []string{"AAA"}}} for i := 0; i < rv.NumField(); i++ { - if !enc.isEmpty(rv.Field(i)) { + if !isEmpty(rv.Field(i)) { return false } } return true case reflect.Bool: return !rv.Bool() + case reflect.Ptr: + return rv.IsNil() } return false } @@ -693,8 +699,11 @@ func (enc *Encoder) newline() { // v v v v vv // key = {k = 1, k2 = 2} func (enc *Encoder) writeKeyValue(key Key, val reflect.Value, inline bool) { + /// Marshaler used on top-level document; call eElement() to just call + /// Marshal{TOML,Text}. if len(key) == 0 { - encPanic(errNoKey) + enc.eElement(val) + return } enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) enc.eElement(val) diff --git a/vendor/github.com/BurntSushi/toml/error.go b/vendor/github.com/BurntSushi/toml/error.go index f4f390e647..efd68865bb 100644 --- a/vendor/github.com/BurntSushi/toml/error.go +++ b/vendor/github.com/BurntSushi/toml/error.go @@ -84,7 +84,7 @@ func (pe ParseError) Error() string { pe.Position.Line, pe.LastKey, msg) } -// ErrorWithUsage() returns the error with detailed location context. +// ErrorWithPosition returns the error with detailed location context. // // See the documentation on [ParseError]. func (pe ParseError) ErrorWithPosition() string { @@ -124,7 +124,7 @@ func (pe ParseError) ErrorWithPosition() string { return b.String() } -// ErrorWithUsage() returns the error with detailed location context and usage +// ErrorWithUsage returns the error with detailed location context and usage // guidance. // // See the documentation on [ParseError]. diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go index d4d70871d8..3545a6ad66 100644 --- a/vendor/github.com/BurntSushi/toml/lex.go +++ b/vendor/github.com/BurntSushi/toml/lex.go @@ -46,12 +46,13 @@ func (p Position) String() string { } type lexer struct { - input string - start int - pos int - line int - state stateFn - items chan item + input string + start int + pos int + line int + state stateFn + items chan item + tomlNext bool // Allow for backing up up to 4 runes. This is necessary because TOML // contains 3-rune tokens (""" and '''). @@ -87,13 +88,14 @@ func (lx *lexer) nextItem() item { } } -func lex(input string) *lexer { +func lex(input string, tomlNext bool) *lexer { lx := &lexer{ - input: input, - state: lexTop, - items: make(chan item, 10), - stack: make([]stateFn, 0, 10), - line: 1, + input: input, + state: lexTop, + items: make(chan item, 10), + stack: make([]stateFn, 0, 10), + line: 1, + tomlNext: tomlNext, } return lx } @@ -408,7 +410,7 @@ func lexTableNameEnd(lx *lexer) stateFn { // Lexes only one part, e.g. only 'a' inside 'a.b'. func lexBareName(lx *lexer) stateFn { r := lx.next() - if isBareKeyChar(r) { + if isBareKeyChar(r, lx.tomlNext) { return lexBareName } lx.backup() @@ -618,6 +620,9 @@ func lexInlineTableValue(lx *lexer) stateFn { case isWhitespace(r): return lexSkip(lx, lexInlineTableValue) case isNL(r): + if lx.tomlNext { + return lexSkip(lx, lexInlineTableValue) + } return lx.errorPrevLine(errLexInlineTableNL{}) case r == '#': lx.push(lexInlineTableValue) @@ -640,6 +645,9 @@ func lexInlineTableValueEnd(lx *lexer) stateFn { case isWhitespace(r): return lexSkip(lx, lexInlineTableValueEnd) case isNL(r): + if lx.tomlNext { + return lexSkip(lx, lexInlineTableValueEnd) + } return lx.errorPrevLine(errLexInlineTableNL{}) case r == '#': lx.push(lexInlineTableValueEnd) @@ -648,6 +656,9 @@ func lexInlineTableValueEnd(lx *lexer) stateFn { lx.ignore() lx.skip(isWhitespace) if lx.peek() == '}' { + if lx.tomlNext { + return lexInlineTableValueEnd + } return lx.errorf("trailing comma not allowed in inline tables") } return lexInlineTableValue @@ -770,8 +781,8 @@ func lexRawString(lx *lexer) stateFn { } } -// lexMultilineRawString consumes a raw string. Nothing can be escaped in such -// a string. It assumes that the beginning ''' has already been consumed and +// lexMultilineRawString consumes a raw string. Nothing can be escaped in such a +// string. It assumes that the beginning triple-' has already been consumed and // ignored. func lexMultilineRawString(lx *lexer) stateFn { r := lx.next() @@ -828,6 +839,11 @@ func lexMultilineStringEscape(lx *lexer) stateFn { func lexStringEscape(lx *lexer) stateFn { r := lx.next() switch r { + case 'e': + if !lx.tomlNext { + return lx.error(errLexEscape{r}) + } + fallthrough case 'b': fallthrough case 't': @@ -846,6 +862,11 @@ func lexStringEscape(lx *lexer) stateFn { fallthrough case '\\': return lx.pop() + case 'x': + if !lx.tomlNext { + return lx.error(errLexEscape{r}) + } + return lexHexEscape case 'u': return lexShortUnicodeEscape case 'U': @@ -854,6 +875,19 @@ func lexStringEscape(lx *lexer) stateFn { return lx.error(errLexEscape{r}) } +func lexHexEscape(lx *lexer) stateFn { + var r rune + for i := 0; i < 2; i++ { + r = lx.next() + if !isHexadecimal(r) { + return lx.errorf( + `expected two hexadecimal digits after '\x', but got %q instead`, + lx.current()) + } + } + return lx.pop() +} + func lexShortUnicodeEscape(lx *lexer) stateFn { var r rune for i := 0; i < 4; i++ { @@ -1225,7 +1259,23 @@ func isOctal(r rune) bool { return r >= '0' && r <= '7' } func isHexadecimal(r rune) bool { return (r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F') } -func isBareKeyChar(r rune) bool { + +func isBareKeyChar(r rune, tomlNext bool) bool { + if tomlNext { + return (r >= 'A' && r <= 'Z') || + (r >= 'a' && r <= 'z') || + (r >= '0' && r <= '9') || + r == '_' || r == '-' || + r == 0xb2 || r == 0xb3 || r == 0xb9 || (r >= 0xbc && r <= 0xbe) || + (r >= 0xc0 && r <= 0xd6) || (r >= 0xd8 && r <= 0xf6) || (r >= 0xf8 && r <= 0x037d) || + (r >= 0x037f && r <= 0x1fff) || + (r >= 0x200c && r <= 0x200d) || (r >= 0x203f && r <= 0x2040) || + (r >= 0x2070 && r <= 0x218f) || (r >= 0x2460 && r <= 0x24ff) || + (r >= 0x2c00 && r <= 0x2fef) || (r >= 0x3001 && r <= 0xd7ff) || + (r >= 0xf900 && r <= 0xfdcf) || (r >= 0xfdf0 && r <= 0xfffd) || + (r >= 0x10000 && r <= 0xeffff) + } + return (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') || (r >= '0' && r <= '9') || diff --git a/vendor/github.com/BurntSushi/toml/meta.go b/vendor/github.com/BurntSushi/toml/meta.go index 71847a0415..2e78b24e95 100644 --- a/vendor/github.com/BurntSushi/toml/meta.go +++ b/vendor/github.com/BurntSushi/toml/meta.go @@ -106,7 +106,7 @@ func (k Key) maybeQuoted(i int) string { return `""` } for _, c := range k[i] { - if !isBareKeyChar(c) { + if !isBareKeyChar(c, false) { return `"` + dblQuotedReplacer.Replace(k[i]) + `"` } } diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go index d2542d6f92..9c19153698 100644 --- a/vendor/github.com/BurntSushi/toml/parse.go +++ b/vendor/github.com/BurntSushi/toml/parse.go @@ -2,6 +2,7 @@ package toml import ( "fmt" + "os" "strconv" "strings" "time" @@ -15,6 +16,7 @@ type parser struct { context Key // Full key for the current hash in scope. currentKey string // Base key name for everything except hashes. pos Position // Current position in the TOML file. + tomlNext bool ordered []Key // List of keys in the order that they appear in the TOML data. @@ -29,6 +31,8 @@ type keyInfo struct { } func parse(data string) (p *parser, err error) { + _, tomlNext := os.LookupEnv("BURNTSUSHI_TOML_110") + defer func() { if r := recover(); r != nil { if pErr, ok := r.(ParseError); ok { @@ -41,9 +45,12 @@ func parse(data string) (p *parser, err error) { }() // Read over BOM; do this here as the lexer calls utf8.DecodeRuneInString() - // which mangles stuff. - if strings.HasPrefix(data, "\xff\xfe") || strings.HasPrefix(data, "\xfe\xff") { + // which mangles stuff. UTF-16 BOM isn't strictly valid, but some tools add + // it anyway. + if strings.HasPrefix(data, "\xff\xfe") || strings.HasPrefix(data, "\xfe\xff") { // UTF-16 data = data[2:] + } else if strings.HasPrefix(data, "\xef\xbb\xbf") { // UTF-8 + data = data[3:] } // Examine first few bytes for NULL bytes; this probably means it's a UTF-16 @@ -65,9 +72,10 @@ func parse(data string) (p *parser, err error) { p = &parser{ keyInfo: make(map[string]keyInfo), mapping: make(map[string]interface{}), - lx: lex(data), + lx: lex(data, tomlNext), ordered: make([]Key, 0), implicits: make(map[string]struct{}), + tomlNext: tomlNext, } for { item := p.next() @@ -194,12 +202,12 @@ func (p *parser) topLevel(item item) { for i := range context { p.addImplicitContext(append(p.context, context[i:i+1]...)) } + p.ordered = append(p.ordered, p.context.add(p.currentKey)) /// Set value. vItem := p.next() val, typ := p.value(vItem, false) p.set(p.currentKey, val, typ, vItem.pos) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) /// Remove the context we added (preserving any context from [tbl] lines). p.context = outerContext @@ -236,7 +244,7 @@ func (p *parser) value(it item, parentIsArray bool) (interface{}, tomlType) { case itemString: return p.replaceEscapes(it, it.val), p.typeOfPrimitive(it) case itemMultilineString: - return p.replaceEscapes(it, stripFirstNewline(p.stripEscapedNewlines(it.val))), p.typeOfPrimitive(it) + return p.replaceEscapes(it, p.stripEscapedNewlines(stripFirstNewline(it.val))), p.typeOfPrimitive(it) case itemRawString: return it.val, p.typeOfPrimitive(it) case itemRawMultilineString: @@ -331,11 +339,17 @@ func (p *parser) valueFloat(it item) (interface{}, tomlType) { var dtTypes = []struct { fmt string zone *time.Location + next bool }{ - {time.RFC3339Nano, time.Local}, - {"2006-01-02T15:04:05.999999999", internal.LocalDatetime}, - {"2006-01-02", internal.LocalDate}, - {"15:04:05.999999999", internal.LocalTime}, + {time.RFC3339Nano, time.Local, false}, + {"2006-01-02T15:04:05.999999999", internal.LocalDatetime, false}, + {"2006-01-02", internal.LocalDate, false}, + {"15:04:05.999999999", internal.LocalTime, false}, + + // tomlNext + {"2006-01-02T15:04Z07:00", time.Local, true}, + {"2006-01-02T15:04", internal.LocalDatetime, true}, + {"15:04", internal.LocalTime, true}, } func (p *parser) valueDatetime(it item) (interface{}, tomlType) { @@ -346,6 +360,9 @@ func (p *parser) valueDatetime(it item) (interface{}, tomlType) { err error ) for _, dt := range dtTypes { + if dt.next && !p.tomlNext { + continue + } t, err = time.ParseInLocation(dt.fmt, it.val, dt.zone) if err == nil { ok = true @@ -384,6 +401,7 @@ func (p *parser) valueArray(it item) (interface{}, tomlType) { // // Not entirely sure how to best store this; could use "key[0]", // "key[1]" notation, or maybe store it on the Array type? + _ = types } return array, tomlArray } @@ -426,11 +444,11 @@ func (p *parser) valueInlineTable(it item, parentIsArray bool) (interface{}, tom for i := range context { p.addImplicitContext(append(p.context, context[i:i+1]...)) } + p.ordered = append(p.ordered, p.context.add(p.currentKey)) /// Set the value. val, typ := p.value(p.next(), false) p.set(p.currentKey, val, typ, it.pos) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) hash[p.currentKey] = val /// Restore context. @@ -551,7 +569,6 @@ func (p *parser) addContext(key Key, array bool) { func (p *parser) set(key string, val interface{}, typ tomlType, pos Position) { p.setValue(key, val) p.setType(key, typ, pos) - } // setValue sets the given key to the given value in the current context. @@ -632,14 +649,11 @@ func (p *parser) setType(key string, typ tomlType, pos Position) { // Implicit keys need to be created when tables are implied in "a.b.c.d = 1" and // "[a.b.c]" (the "a", "b", and "c" hashes are never created explicitly). -func (p *parser) addImplicit(key Key) { p.implicits[key.String()] = struct{}{} } -func (p *parser) removeImplicit(key Key) { delete(p.implicits, key.String()) } -func (p *parser) isImplicit(key Key) bool { _, ok := p.implicits[key.String()]; return ok } -func (p *parser) isArray(key Key) bool { return p.keyInfo[key.String()].tomlType == tomlArray } -func (p *parser) addImplicitContext(key Key) { - p.addImplicit(key) - p.addContext(key, false) -} +func (p *parser) addImplicit(key Key) { p.implicits[key.String()] = struct{}{} } +func (p *parser) removeImplicit(key Key) { delete(p.implicits, key.String()) } +func (p *parser) isImplicit(key Key) bool { _, ok := p.implicits[key.String()]; return ok } +func (p *parser) isArray(key Key) bool { return p.keyInfo[key.String()].tomlType == tomlArray } +func (p *parser) addImplicitContext(key Key) { p.addImplicit(key); p.addContext(key, false) } // current returns the full key name of the current context. func (p *parser) current() string { @@ -662,49 +676,54 @@ func stripFirstNewline(s string) string { return s } -// Remove newlines inside triple-quoted strings if a line ends with "\". +// stripEscapedNewlines removes whitespace after line-ending backslashes in +// multiline strings. +// +// A line-ending backslash is an unescaped \ followed only by whitespace until +// the next newline. After a line-ending backslash, all whitespace is removed +// until the next non-whitespace character. func (p *parser) stripEscapedNewlines(s string) string { - split := strings.Split(s, "\n") - if len(split) < 1 { - return s - } - - escNL := false // Keep track of the last non-blank line was escaped. - for i, line := range split { - line = strings.TrimRight(line, " \t\r") - - if len(line) == 0 || line[len(line)-1] != '\\' { - split[i] = strings.TrimRight(split[i], "\r") - if !escNL && i != len(split)-1 { - split[i] += "\n" - } - continue + var b strings.Builder + var i int + for { + ix := strings.Index(s[i:], `\`) + if ix < 0 { + b.WriteString(s) + return b.String() } + i += ix - escBS := true - for j := len(line) - 1; j >= 0 && line[j] == '\\'; j-- { - escBS = !escBS + if len(s) > i+1 && s[i+1] == '\\' { + // Escaped backslash. + i += 2 + continue } - if escNL { - line = strings.TrimLeft(line, " \t\r") + // Scan until the next non-whitespace. + j := i + 1 + whitespaceLoop: + for ; j < len(s); j++ { + switch s[j] { + case ' ', '\t', '\r', '\n': + default: + break whitespaceLoop + } } - escNL = !escBS - - if escBS { - split[i] += "\n" + if j == i+1 { + // Not a whitespace escape. + i++ continue } - - if i == len(split)-1 { - p.panicf("invalid escape: '\\ '") - } - - split[i] = line[:len(line)-1] // Remove \ - if len(split)-1 > i { - split[i+1] = strings.TrimLeft(split[i+1], " \t\r") + if !strings.Contains(s[i:j], "\n") { + // This is not a line-ending backslash. + // (It's a bad escape sequence, but we can let + // replaceEscapes catch it.) + i++ + continue } + b.WriteString(s[:i]) + s = s[j:] + i = 0 } - return strings.Join(split, "") } func (p *parser) replaceEscapes(it item, str string) string { @@ -743,12 +762,23 @@ func (p *parser) replaceEscapes(it item, str string) string { case 'r': replaced = append(replaced, rune(0x000D)) r += 1 + case 'e': + if p.tomlNext { + replaced = append(replaced, rune(0x001B)) + r += 1 + } case '"': replaced = append(replaced, rune(0x0022)) r += 1 case '\\': replaced = append(replaced, rune(0x005C)) r += 1 + case 'x': + if p.tomlNext { + escaped := p.asciiEscapeToUnicode(it, s[r+1:r+3]) + replaced = append(replaced, escaped) + r += 3 + } case 'u': // At this point, we know we have a Unicode escape of the form // `uXXXX` at [r, r+5). (Because the lexer guarantees this diff --git a/vendor/github.com/Microsoft/go-winio/.golangci.yml b/vendor/github.com/Microsoft/go-winio/.golangci.yml index af403bb13a..7b503d26a3 100644 --- a/vendor/github.com/Microsoft/go-winio/.golangci.yml +++ b/vendor/github.com/Microsoft/go-winio/.golangci.yml @@ -8,12 +8,8 @@ linters: - containedctx # struct contains a context - dupl # duplicate code - errname # erorrs are named correctly - - goconst # strings that should be constants - - godot # comments end in a period - - misspell - nolintlint # "//nolint" directives are properly explained - revive # golint replacement - - stylecheck # golint replacement, less configurable than revive - unconvert # unnecessary conversions - wastedassign @@ -23,10 +19,7 @@ linters: - exhaustive # check exhaustiveness of enum switch statements - gofmt # files are gofmt'ed - gosec # security - - nestif # deeply nested ifs - nilerr # returns nil even with non-nil error - - prealloc # slices that can be pre-allocated - - structcheck # unused struct fields - unparam # unused function params issues: @@ -42,6 +35,18 @@ issues: text: "^line-length-limit: " source: "^//(go:generate|sys) " + #TODO: remove after upgrading to go1.18 + # ignore comment spacing for nolint and sys directives + - linters: + - revive + text: "^comment-spacings: no space between comment delimiter and comment text" + source: "//(cspell:|nolint:|sys |todo)" + + # not on go 1.18 yet, so no any + - linters: + - revive + text: "^use-any: since GO 1.18 'interface{}' can be replaced by 'any'" + # allow unjustified ignores of error checks in defer statements - linters: - nolintlint @@ -56,6 +61,8 @@ issues: linters-settings: + exhaustive: + default-signifies-exhaustive: true govet: enable-all: true disable: @@ -98,6 +105,8 @@ linters-settings: disabled: true - name: flag-parameter # excessive, and a common idiom we use disabled: true + - name: unhandled-error # warns over common fmt.Print* and io.Close; rely on errcheck instead + disabled: true # general config - name: line-length-limit arguments: @@ -138,7 +147,3 @@ linters-settings: - VPCI - WCOW - WIM - stylecheck: - checks: - - "all" - - "-ST1003" # use revive's var naming diff --git a/vendor/github.com/Microsoft/go-winio/hvsock.go b/vendor/github.com/Microsoft/go-winio/hvsock.go index 52f1c280f6..c881916583 100644 --- a/vendor/github.com/Microsoft/go-winio/hvsock.go +++ b/vendor/github.com/Microsoft/go-winio/hvsock.go @@ -23,7 +23,7 @@ import ( const afHVSock = 34 // AF_HYPERV // Well known Service and VM IDs -//https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service#vmid-wildcards +// https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service#vmid-wildcards // HvsockGUIDWildcard is the wildcard VmId for accepting connections from all partitions. func HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-000000000000 @@ -31,7 +31,7 @@ func HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-000000000000 } // HvsockGUIDBroadcast is the wildcard VmId for broadcasting sends to all partitions. -func HvsockGUIDBroadcast() guid.GUID { //ffffffff-ffff-ffff-ffff-ffffffffffff +func HvsockGUIDBroadcast() guid.GUID { // ffffffff-ffff-ffff-ffff-ffffffffffff return guid.GUID{ Data1: 0xffffffff, Data2: 0xffff, @@ -246,7 +246,7 @@ func (l *HvsockListener) Accept() (_ net.Conn, err error) { var addrbuf [addrlen * 2]byte var bytes uint32 - err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0 /*rxdatalen*/, addrlen, addrlen, &bytes, &c.o) + err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0 /* rxdatalen */, addrlen, addrlen, &bytes, &c.o) if _, err = l.sock.asyncIO(c, nil, bytes, err); err != nil { return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) } diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go b/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go new file mode 100644 index 0000000000..1f65388178 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go @@ -0,0 +1,2 @@ +// This package contains Win32 filesystem functionality. +package fs diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go b/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go new file mode 100644 index 0000000000..509b3ec641 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go @@ -0,0 +1,202 @@ +//go:build windows + +package fs + +import ( + "golang.org/x/sys/windows" + + "github.com/Microsoft/go-winio/internal/stringbuffer" +) + +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go fs.go + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew +//sys CreateFile(name string, access AccessMask, mode FileShareMode, sa *syscall.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) [failretval==windows.InvalidHandle] = CreateFileW + +const NullHandle windows.Handle = 0 + +// AccessMask defines standard, specific, and generic rights. +// +// Bitmask: +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---------------+---------------+-------------------------------+ +// |G|G|G|G|Resvd|A| StandardRights| SpecificRights | +// |R|W|E|A| |S| | | +// +-+-------------+---------------+-------------------------------+ +// +// GR Generic Read +// GW Generic Write +// GE Generic Exectue +// GA Generic All +// Resvd Reserved +// AS Access Security System +// +// https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask +// +// https://learn.microsoft.com/en-us/windows/win32/secauthz/generic-access-rights +// +// https://learn.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants +type AccessMask = windows.ACCESS_MASK + +//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. +const ( + // Not actually any. + // + // For CreateFile: "query certain metadata such as file, directory, or device attributes without accessing that file or device" + // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#parameters + FILE_ANY_ACCESS AccessMask = 0 + + // Specific Object Access + // from ntioapi.h + + FILE_READ_DATA AccessMask = (0x0001) // file & pipe + FILE_LIST_DIRECTORY AccessMask = (0x0001) // directory + + FILE_WRITE_DATA AccessMask = (0x0002) // file & pipe + FILE_ADD_FILE AccessMask = (0x0002) // directory + + FILE_APPEND_DATA AccessMask = (0x0004) // file + FILE_ADD_SUBDIRECTORY AccessMask = (0x0004) // directory + FILE_CREATE_PIPE_INSTANCE AccessMask = (0x0004) // named pipe + + FILE_READ_EA AccessMask = (0x0008) // file & directory + FILE_READ_PROPERTIES AccessMask = FILE_READ_EA + + FILE_WRITE_EA AccessMask = (0x0010) // file & directory + FILE_WRITE_PROPERTIES AccessMask = FILE_WRITE_EA + + FILE_EXECUTE AccessMask = (0x0020) // file + FILE_TRAVERSE AccessMask = (0x0020) // directory + + FILE_DELETE_CHILD AccessMask = (0x0040) // directory + + FILE_READ_ATTRIBUTES AccessMask = (0x0080) // all + + FILE_WRITE_ATTRIBUTES AccessMask = (0x0100) // all + + FILE_ALL_ACCESS AccessMask = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) + FILE_GENERIC_READ AccessMask = (STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE) + FILE_GENERIC_WRITE AccessMask = (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE) + FILE_GENERIC_EXECUTE AccessMask = (STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE) + + SPECIFIC_RIGHTS_ALL AccessMask = 0x0000FFFF + + // Standard Access + // from ntseapi.h + + DELETE AccessMask = 0x0001_0000 + READ_CONTROL AccessMask = 0x0002_0000 + WRITE_DAC AccessMask = 0x0004_0000 + WRITE_OWNER AccessMask = 0x0008_0000 + SYNCHRONIZE AccessMask = 0x0010_0000 + + STANDARD_RIGHTS_REQUIRED AccessMask = 0x000F_0000 + + STANDARD_RIGHTS_READ AccessMask = READ_CONTROL + STANDARD_RIGHTS_WRITE AccessMask = READ_CONTROL + STANDARD_RIGHTS_EXECUTE AccessMask = READ_CONTROL + + STANDARD_RIGHTS_ALL AccessMask = 0x001F_0000 +) + +type FileShareMode uint32 + +//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. +const ( + FILE_SHARE_NONE FileShareMode = 0x00 + FILE_SHARE_READ FileShareMode = 0x01 + FILE_SHARE_WRITE FileShareMode = 0x02 + FILE_SHARE_DELETE FileShareMode = 0x04 + FILE_SHARE_VALID_FLAGS FileShareMode = 0x07 +) + +type FileCreationDisposition uint32 + +//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. +const ( + // from winbase.h + + CREATE_NEW FileCreationDisposition = 0x01 + CREATE_ALWAYS FileCreationDisposition = 0x02 + OPEN_EXISTING FileCreationDisposition = 0x03 + OPEN_ALWAYS FileCreationDisposition = 0x04 + TRUNCATE_EXISTING FileCreationDisposition = 0x05 +) + +// CreateFile and co. take flags or attributes together as one parameter. +// Define alias until we can use generics to allow both + +// https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants +type FileFlagOrAttribute uint32 + +//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. +const ( // from winnt.h + FILE_FLAG_WRITE_THROUGH FileFlagOrAttribute = 0x8000_0000 + FILE_FLAG_OVERLAPPED FileFlagOrAttribute = 0x4000_0000 + FILE_FLAG_NO_BUFFERING FileFlagOrAttribute = 0x2000_0000 + FILE_FLAG_RANDOM_ACCESS FileFlagOrAttribute = 0x1000_0000 + FILE_FLAG_SEQUENTIAL_SCAN FileFlagOrAttribute = 0x0800_0000 + FILE_FLAG_DELETE_ON_CLOSE FileFlagOrAttribute = 0x0400_0000 + FILE_FLAG_BACKUP_SEMANTICS FileFlagOrAttribute = 0x0200_0000 + FILE_FLAG_POSIX_SEMANTICS FileFlagOrAttribute = 0x0100_0000 + FILE_FLAG_OPEN_REPARSE_POINT FileFlagOrAttribute = 0x0020_0000 + FILE_FLAG_OPEN_NO_RECALL FileFlagOrAttribute = 0x0010_0000 + FILE_FLAG_FIRST_PIPE_INSTANCE FileFlagOrAttribute = 0x0008_0000 +) + +type FileSQSFlag = FileFlagOrAttribute + +//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. +const ( // from winbase.h + SECURITY_ANONYMOUS FileSQSFlag = FileSQSFlag(SecurityAnonymous << 16) + SECURITY_IDENTIFICATION FileSQSFlag = FileSQSFlag(SecurityIdentification << 16) + SECURITY_IMPERSONATION FileSQSFlag = FileSQSFlag(SecurityImpersonation << 16) + SECURITY_DELEGATION FileSQSFlag = FileSQSFlag(SecurityDelegation << 16) + + SECURITY_SQOS_PRESENT FileSQSFlag = 0x00100000 + SECURITY_VALID_SQOS_FLAGS FileSQSFlag = 0x001F0000 +) + +// GetFinalPathNameByHandle flags +// +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew#parameters +type GetFinalPathFlag uint32 + +//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. +const ( + GetFinalPathDefaultFlag GetFinalPathFlag = 0x0 + + FILE_NAME_NORMALIZED GetFinalPathFlag = 0x0 + FILE_NAME_OPENED GetFinalPathFlag = 0x8 + + VOLUME_NAME_DOS GetFinalPathFlag = 0x0 + VOLUME_NAME_GUID GetFinalPathFlag = 0x1 + VOLUME_NAME_NT GetFinalPathFlag = 0x2 + VOLUME_NAME_NONE GetFinalPathFlag = 0x4 +) + +// getFinalPathNameByHandle facilitates calling the Windows API GetFinalPathNameByHandle +// with the given handle and flags. It transparently takes care of creating a buffer of the +// correct size for the call. +// +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew +func GetFinalPathNameByHandle(h windows.Handle, flags GetFinalPathFlag) (string, error) { + b := stringbuffer.NewWString() + //TODO: can loop infinitely if Win32 keeps returning the same (or a larger) n? + for { + n, err := windows.GetFinalPathNameByHandle(h, b.Pointer(), b.Cap(), uint32(flags)) + if err != nil { + return "", err + } + // If the buffer wasn't large enough, n will be the total size needed (including null terminator). + // Resize and try again. + if n > b.Cap() { + b.ResizeTo(n) + continue + } + // If the buffer is large enough, n will be the size not including the null terminator. + // Convert to a Go string and return. + return b.String(), nil + } +} diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/security.go b/vendor/github.com/Microsoft/go-winio/internal/fs/security.go new file mode 100644 index 0000000000..81760ac67e --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/internal/fs/security.go @@ -0,0 +1,12 @@ +package fs + +// https://learn.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level +type SecurityImpersonationLevel int32 // C default enums underlying type is `int`, which is Go `int32` + +// Impersonation levels +const ( + SecurityAnonymous SecurityImpersonationLevel = 0 + SecurityIdentification SecurityImpersonationLevel = 1 + SecurityImpersonation SecurityImpersonationLevel = 2 + SecurityDelegation SecurityImpersonationLevel = 3 +) diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go new file mode 100644 index 0000000000..e2f7bb24e5 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go @@ -0,0 +1,64 @@ +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. + +package fs + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return errERROR_EINVAL + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + + procCreateFileW = modkernel32.NewProc("CreateFileW") +) + +func CreateFile(name string, access AccessMask, mode FileShareMode, sa *syscall.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _CreateFile(_p0, access, mode, sa, createmode, attrs, templatefile) +} + +func _CreateFile(name *uint16, access AccessMask, mode FileShareMode, sa *syscall.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) + handle = windows.Handle(r0) + if handle == windows.InvalidHandle { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go b/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go index 39e8c05f8f..aeb7b7250f 100644 --- a/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go +++ b/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go @@ -100,8 +100,8 @@ func (f *runtimeFunc) Load() error { (*byte)(unsafe.Pointer(&f.addr)), uint32(unsafe.Sizeof(f.addr)), &n, - nil, //overlapped - 0, //completionRoutine + nil, // overlapped + 0, // completionRoutine ) }) return f.err diff --git a/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go b/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go new file mode 100644 index 0000000000..7ad5057024 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go @@ -0,0 +1,132 @@ +package stringbuffer + +import ( + "sync" + "unicode/utf16" +) + +// TODO: worth exporting and using in mkwinsyscall? + +// Uint16BufferSize is the buffer size in the pool, chosen somewhat arbitrarily to accommodate +// large path strings: +// MAX_PATH (260) + size of volume GUID prefix (49) + null terminator = 310. +const MinWStringCap = 310 + +// use *[]uint16 since []uint16 creates an extra allocation where the slice header +// is copied to heap and then referenced via pointer in the interface header that sync.Pool +// stores. +var pathPool = sync.Pool{ // if go1.18+ adds Pool[T], use that to store []uint16 directly + New: func() interface{} { + b := make([]uint16, MinWStringCap) + return &b + }, +} + +func newBuffer() []uint16 { return *(pathPool.Get().(*[]uint16)) } + +// freeBuffer copies the slice header data, and puts a pointer to that in the pool. +// This avoids taking a pointer to the slice header in WString, which can be set to nil. +func freeBuffer(b []uint16) { pathPool.Put(&b) } + +// WString is a wide string buffer ([]uint16) meant for storing UTF-16 encoded strings +// for interacting with Win32 APIs. +// Sizes are specified as uint32 and not int. +// +// It is not thread safe. +type WString struct { + // type-def allows casting to []uint16 directly, use struct to prevent that and allow adding fields in the future. + + // raw buffer + b []uint16 +} + +// NewWString returns a [WString] allocated from a shared pool with an +// initial capacity of at least [MinWStringCap]. +// Since the buffer may have been previously used, its contents are not guaranteed to be empty. +// +// The buffer should be freed via [WString.Free] +func NewWString() *WString { + return &WString{ + b: newBuffer(), + } +} + +func (b *WString) Free() { + if b.empty() { + return + } + freeBuffer(b.b) + b.b = nil +} + +// ResizeTo grows the buffer to at least c and returns the new capacity, freeing the +// previous buffer back into pool. +func (b *WString) ResizeTo(c uint32) uint32 { + // allready sufficient (or n is 0) + if c <= b.Cap() { + return b.Cap() + } + + if c <= MinWStringCap { + c = MinWStringCap + } + // allocate at-least double buffer size, as is done in [bytes.Buffer] and other places + if c <= 2*b.Cap() { + c = 2 * b.Cap() + } + + b2 := make([]uint16, c) + if !b.empty() { + copy(b2, b.b) + freeBuffer(b.b) + } + b.b = b2 + return c +} + +// Buffer returns the underlying []uint16 buffer. +func (b *WString) Buffer() []uint16 { + if b.empty() { + return nil + } + return b.b +} + +// Pointer returns a pointer to the first uint16 in the buffer. +// If the [WString.Free] has already been called, the pointer will be nil. +func (b *WString) Pointer() *uint16 { + if b.empty() { + return nil + } + return &b.b[0] +} + +// String returns the returns the UTF-8 encoding of the UTF-16 string in the buffer. +// +// It assumes that the data is null-terminated. +func (b *WString) String() string { + // Using [windows.UTF16ToString] would require importing "golang.org/x/sys/windows" + // and would make this code Windows-only, which makes no sense. + // So copy UTF16ToString code into here. + // If other windows-specific code is added, switch to [windows.UTF16ToString] + + s := b.b + for i, v := range s { + if v == 0 { + s = s[:i] + break + } + } + return string(utf16.Decode(s)) +} + +// Cap returns the underlying buffer capacity. +func (b *WString) Cap() uint32 { + if b.empty() { + return 0 + } + return b.cap() +} + +func (b *WString) cap() uint32 { return uint32(cap(b.b)) } +func (b *WString) empty() bool { return b == nil || b.cap() == 0 } diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go index ca6e38fc00..25cc811031 100644 --- a/vendor/github.com/Microsoft/go-winio/pipe.go +++ b/vendor/github.com/Microsoft/go-winio/pipe.go @@ -16,11 +16,12 @@ import ( "unsafe" "golang.org/x/sys/windows" + + "github.com/Microsoft/go-winio/internal/fs" ) //sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe //sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW -//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW //sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo //sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW //sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc @@ -163,19 +164,21 @@ func (s pipeAddress) String() string { } // tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. -func tryDialPipe(ctx context.Context, path *string, access uint32) (syscall.Handle, error) { +func tryDialPipe(ctx context.Context, path *string, access fs.AccessMask) (syscall.Handle, error) { for { select { case <-ctx.Done(): return syscall.Handle(0), ctx.Err() default: - h, err := createFile(*path, + wh, err := fs.CreateFile(*path, access, - 0, - nil, - syscall.OPEN_EXISTING, - windows.FILE_FLAG_OVERLAPPED|windows.SECURITY_SQOS_PRESENT|windows.SECURITY_ANONYMOUS, - 0) + 0, // mode + nil, // security attributes + fs.OPEN_EXISTING, + fs.FILE_FLAG_OVERLAPPED|fs.SECURITY_SQOS_PRESENT|fs.SECURITY_ANONYMOUS, + 0, // template file handle + ) + h := syscall.Handle(wh) if err == nil { return h, nil } @@ -219,7 +222,7 @@ func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) { var err error var h syscall.Handle - h, err = tryDialPipe(ctx, &path, access) + h, err = tryDialPipe(ctx, &path, fs.AccessMask(access)) if err != nil { return nil, err } @@ -279,6 +282,7 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy } defer localFree(ntPath.Buffer) oa.ObjectName = &ntPath + oa.Attributes = windows.OBJ_CASE_INSENSITIVE // The security descriptor is only needed for the first pipe. if first { diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go b/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go deleted file mode 100644 index 6df87b7499..0000000000 --- a/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go +++ /dev/null @@ -1,169 +0,0 @@ -//go:build windows -// +build windows - -package security - -import ( - "fmt" - "os" - "syscall" - "unsafe" -) - -type ( - accessMask uint32 - accessMode uint32 - desiredAccess uint32 - inheritMode uint32 - objectType uint32 - shareMode uint32 - securityInformation uint32 - trusteeForm uint32 - trusteeType uint32 - - //nolint:structcheck // structcheck thinks fields are unused, but the are used to pass data to OS - explicitAccess struct { - accessPermissions accessMask - accessMode accessMode - inheritance inheritMode - trustee trustee - } - - //nolint:structcheck,unused // structcheck thinks fields are unused, but the are used to pass data to OS - trustee struct { - multipleTrustee *trustee - multipleTrusteeOperation int32 - trusteeForm trusteeForm - trusteeType trusteeType - name uintptr - } -) - -const ( - accessMaskDesiredPermission accessMask = 1 << 31 // GENERIC_READ - - accessModeGrant accessMode = 1 - - desiredAccessReadControl desiredAccess = 0x20000 - desiredAccessWriteDac desiredAccess = 0x40000 - - //cspell:disable-next-line - gvmga = "GrantVmGroupAccess:" - - inheritModeNoInheritance inheritMode = 0x0 - inheritModeSubContainersAndObjectsInherit inheritMode = 0x3 - - objectTypeFileObject objectType = 0x1 - - securityInformationDACL securityInformation = 0x4 - - shareModeRead shareMode = 0x1 - shareModeWrite shareMode = 0x2 - - sidVMGroup = "S-1-5-83-0" - - trusteeFormIsSID trusteeForm = 0 - - trusteeTypeWellKnownGroup trusteeType = 5 -) - -// GrantVMGroupAccess sets the DACL for a specified file or directory to -// include Grant ACE entries for the VM Group SID. This is a golang re- -// implementation of the same function in vmcompute, just not exported in -// RS5. Which kind of sucks. Sucks a lot :/ -// -//revive:disable-next-line:var-naming VM, not Vm -func GrantVmGroupAccess(name string) error { - // Stat (to determine if `name` is a directory). - s, err := os.Stat(name) - if err != nil { - return fmt.Errorf("%s os.Stat %s: %w", gvmga, name, err) - } - - // Get a handle to the file/directory. Must defer Close on success. - fd, err := createFile(name, s.IsDir()) - if err != nil { - return err // Already wrapped - } - defer syscall.CloseHandle(fd) //nolint:errcheck - - // Get the current DACL and Security Descriptor. Must defer LocalFree on success. - ot := objectTypeFileObject - si := securityInformationDACL - sd := uintptr(0) - origDACL := uintptr(0) - if err := getSecurityInfo(fd, uint32(ot), uint32(si), nil, nil, &origDACL, nil, &sd); err != nil { - return fmt.Errorf("%s GetSecurityInfo %s: %w", gvmga, name, err) - } - defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(sd))) //nolint:errcheck - - // Generate a new DACL which is the current DACL with the required ACEs added. - // Must defer LocalFree on success. - newDACL, err := generateDACLWithAcesAdded(name, s.IsDir(), origDACL) - if err != nil { - return err // Already wrapped - } - defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL))) //nolint:errcheck - - // And finally use SetSecurityInfo to apply the updated DACL. - if err := setSecurityInfo(fd, uint32(ot), uint32(si), uintptr(0), uintptr(0), newDACL, uintptr(0)); err != nil { - return fmt.Errorf("%s SetSecurityInfo %s: %w", gvmga, name, err) - } - - return nil -} - -// createFile is a helper function to call [Nt]CreateFile to get a handle to -// the file or directory. -func createFile(name string, isDir bool) (syscall.Handle, error) { - namep, err := syscall.UTF16FromString(name) - if err != nil { - return syscall.InvalidHandle, fmt.Errorf("could not convernt name to UTF-16: %w", err) - } - da := uint32(desiredAccessReadControl | desiredAccessWriteDac) - sm := uint32(shareModeRead | shareModeWrite) - fa := uint32(syscall.FILE_ATTRIBUTE_NORMAL) - if isDir { - fa |= syscall.FILE_FLAG_BACKUP_SEMANTICS - } - fd, err := syscall.CreateFile(&namep[0], da, sm, nil, syscall.OPEN_EXISTING, fa, 0) - if err != nil { - return syscall.InvalidHandle, fmt.Errorf("%s syscall.CreateFile %s: %w", gvmga, name, err) - } - return fd, nil -} - -// generateDACLWithAcesAdded generates a new DACL with the two needed ACEs added. -// The caller is responsible for LocalFree of the returned DACL on success. -func generateDACLWithAcesAdded(name string, isDir bool, origDACL uintptr) (uintptr, error) { - // Generate pointers to the SIDs based on the string SIDs - sid, err := syscall.StringToSid(sidVMGroup) - if err != nil { - return 0, fmt.Errorf("%s syscall.StringToSid %s %s: %w", gvmga, name, sidVMGroup, err) - } - - inheritance := inheritModeNoInheritance - if isDir { - inheritance = inheritModeSubContainersAndObjectsInherit - } - - eaArray := []explicitAccess{ - { - accessPermissions: accessMaskDesiredPermission, - accessMode: accessModeGrant, - inheritance: inheritance, - trustee: trustee{ - trusteeForm: trusteeFormIsSID, - trusteeType: trusteeTypeWellKnownGroup, - name: uintptr(unsafe.Pointer(sid)), - }, - }, - } - - modifiedDACL := uintptr(0) - if err := setEntriesInAcl(uintptr(uint32(1)), uintptr(unsafe.Pointer(&eaArray[0])), origDACL, &modifiedDACL); err != nil { - return 0, fmt.Errorf("%s SetEntriesInAcl %s: %w", gvmga, name, err) - } - - return modifiedDACL, nil -} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go deleted file mode 100644 index 71326e4e46..0000000000 --- a/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -package security - -//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go syscall_windows.go - -//sys getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (win32err error) = advapi32.GetSecurityInfo -//sys setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (win32err error) = advapi32.SetSecurityInfo -//sys setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (win32err error) = advapi32.SetEntriesInAclW diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go deleted file mode 100644 index 26c986b88f..0000000000 --- a/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go +++ /dev/null @@ -1,72 +0,0 @@ -//go:build windows - -// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. - -package security - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) - errERROR_EINVAL error = syscall.EINVAL -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return errERROR_EINVAL - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") - - procGetSecurityInfo = modadvapi32.NewProc("GetSecurityInfo") - procSetEntriesInAclW = modadvapi32.NewProc("SetEntriesInAclW") - procSetSecurityInfo = modadvapi32.NewProc("SetSecurityInfo") -) - -func getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (win32err error) { - r0, _, _ := syscall.Syscall9(procGetSecurityInfo.Addr(), 8, uintptr(handle), uintptr(objectType), uintptr(si), uintptr(unsafe.Pointer(ppsidOwner)), uintptr(unsafe.Pointer(ppsidGroup)), uintptr(unsafe.Pointer(ppDacl)), uintptr(unsafe.Pointer(ppSacl)), uintptr(unsafe.Pointer(ppSecurityDescriptor)), 0) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} - -func setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (win32err error) { - r0, _, _ := syscall.Syscall6(procSetEntriesInAclW.Addr(), 4, uintptr(count), uintptr(pListOfEEs), uintptr(oldAcl), uintptr(unsafe.Pointer(newAcl)), 0, 0) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} - -func setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (win32err error) { - r0, _, _ := syscall.Syscall9(procSetSecurityInfo.Addr(), 7, uintptr(handle), uintptr(objectType), uintptr(si), uintptr(psidOwner), uintptr(psidGroup), uintptr(pDacl), uintptr(pSacl), 0, 0) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go deleted file mode 100644 index b54cad1127..0000000000 --- a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go +++ /dev/null @@ -1,377 +0,0 @@ -//go:build windows -// +build windows - -package vhd - -import ( - "fmt" - "syscall" - - "github.com/Microsoft/go-winio/pkg/guid" - "golang.org/x/sys/windows" -) - -//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zvhd_windows.go vhd.go - -//sys createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) = virtdisk.CreateVirtualDisk -//sys openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) = virtdisk.OpenVirtualDisk -//sys attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (win32err error) = virtdisk.AttachVirtualDisk -//sys detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (win32err error) = virtdisk.DetachVirtualDisk -//sys getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (win32err error) = virtdisk.GetVirtualDiskPhysicalPath - -type ( - CreateVirtualDiskFlag uint32 - VirtualDiskFlag uint32 - AttachVirtualDiskFlag uint32 - DetachVirtualDiskFlag uint32 - VirtualDiskAccessMask uint32 -) - -type VirtualStorageType struct { - DeviceID uint32 - VendorID guid.GUID -} - -type CreateVersion2 struct { - UniqueID guid.GUID - MaximumSize uint64 - BlockSizeInBytes uint32 - SectorSizeInBytes uint32 - PhysicalSectorSizeInByte uint32 - ParentPath *uint16 // string - SourcePath *uint16 // string - OpenFlags uint32 - ParentVirtualStorageType VirtualStorageType - SourceVirtualStorageType VirtualStorageType - ResiliencyGUID guid.GUID -} - -type CreateVirtualDiskParameters struct { - Version uint32 // Must always be set to 2 - Version2 CreateVersion2 -} - -type OpenVersion2 struct { - GetInfoOnly bool - ReadOnly bool - ResiliencyGUID guid.GUID -} - -type OpenVirtualDiskParameters struct { - Version uint32 // Must always be set to 2 - Version2 OpenVersion2 -} - -// The higher level `OpenVersion2` struct uses `bool`s to refer to `GetInfoOnly` and `ReadOnly` for ease of use. However, -// the internal windows structure uses `BOOL`s aka int32s for these types. `openVersion2` is used for translating -// `OpenVersion2` fields to the correct windows internal field types on the `Open____` methods. -type openVersion2 struct { - getInfoOnly int32 - readOnly int32 - resiliencyGUID guid.GUID -} - -type openVirtualDiskParameters struct { - version uint32 - version2 openVersion2 -} - -type AttachVersion2 struct { - RestrictedOffset uint64 - RestrictedLength uint64 -} - -type AttachVirtualDiskParameters struct { - Version uint32 - Version2 AttachVersion2 -} - -const ( - //revive:disable-next-line:var-naming ALL_CAPS - VIRTUAL_STORAGE_TYPE_DEVICE_VHDX = 0x3 - - // Access Mask for opening a VHD. - VirtualDiskAccessNone VirtualDiskAccessMask = 0x00000000 - VirtualDiskAccessAttachRO VirtualDiskAccessMask = 0x00010000 - VirtualDiskAccessAttachRW VirtualDiskAccessMask = 0x00020000 - VirtualDiskAccessDetach VirtualDiskAccessMask = 0x00040000 - VirtualDiskAccessGetInfo VirtualDiskAccessMask = 0x00080000 - VirtualDiskAccessCreate VirtualDiskAccessMask = 0x00100000 - VirtualDiskAccessMetaOps VirtualDiskAccessMask = 0x00200000 - VirtualDiskAccessRead VirtualDiskAccessMask = 0x000d0000 - VirtualDiskAccessAll VirtualDiskAccessMask = 0x003f0000 - VirtualDiskAccessWritable VirtualDiskAccessMask = 0x00320000 - - // Flags for creating a VHD. - CreateVirtualDiskFlagNone CreateVirtualDiskFlag = 0x0 - CreateVirtualDiskFlagFullPhysicalAllocation CreateVirtualDiskFlag = 0x1 - CreateVirtualDiskFlagPreventWritesToSourceDisk CreateVirtualDiskFlag = 0x2 - CreateVirtualDiskFlagDoNotCopyMetadataFromParent CreateVirtualDiskFlag = 0x4 - CreateVirtualDiskFlagCreateBackingStorage CreateVirtualDiskFlag = 0x8 - CreateVirtualDiskFlagUseChangeTrackingSourceLimit CreateVirtualDiskFlag = 0x10 - CreateVirtualDiskFlagPreserveParentChangeTrackingState CreateVirtualDiskFlag = 0x20 - CreateVirtualDiskFlagVhdSetUseOriginalBackingStorage CreateVirtualDiskFlag = 0x40 //revive:disable-line:var-naming VHD, not Vhd - CreateVirtualDiskFlagSparseFile CreateVirtualDiskFlag = 0x80 - CreateVirtualDiskFlagPmemCompatible CreateVirtualDiskFlag = 0x100 //revive:disable-line:var-naming PMEM, not Pmem - CreateVirtualDiskFlagSupportCompressedVolumes CreateVirtualDiskFlag = 0x200 - - // Flags for opening a VHD. - OpenVirtualDiskFlagNone VirtualDiskFlag = 0x00000000 - OpenVirtualDiskFlagNoParents VirtualDiskFlag = 0x00000001 - OpenVirtualDiskFlagBlankFile VirtualDiskFlag = 0x00000002 - OpenVirtualDiskFlagBootDrive VirtualDiskFlag = 0x00000004 - OpenVirtualDiskFlagCachedIO VirtualDiskFlag = 0x00000008 - OpenVirtualDiskFlagCustomDiffChain VirtualDiskFlag = 0x00000010 - OpenVirtualDiskFlagParentCachedIO VirtualDiskFlag = 0x00000020 - OpenVirtualDiskFlagVhdsetFileOnly VirtualDiskFlag = 0x00000040 - OpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x00000080 - OpenVirtualDiskFlagNoWriteHardening VirtualDiskFlag = 0x00000100 - OpenVirtualDiskFlagSupportCompressedVolumes VirtualDiskFlag = 0x00000200 - - // Flags for attaching a VHD. - AttachVirtualDiskFlagNone AttachVirtualDiskFlag = 0x00000000 - AttachVirtualDiskFlagReadOnly AttachVirtualDiskFlag = 0x00000001 - AttachVirtualDiskFlagNoDriveLetter AttachVirtualDiskFlag = 0x00000002 - AttachVirtualDiskFlagPermanentLifetime AttachVirtualDiskFlag = 0x00000004 - AttachVirtualDiskFlagNoLocalHost AttachVirtualDiskFlag = 0x00000008 - AttachVirtualDiskFlagNoSecurityDescriptor AttachVirtualDiskFlag = 0x00000010 - AttachVirtualDiskFlagBypassDefaultEncryptionPolicy AttachVirtualDiskFlag = 0x00000020 - AttachVirtualDiskFlagNonPnp AttachVirtualDiskFlag = 0x00000040 - AttachVirtualDiskFlagRestrictedRange AttachVirtualDiskFlag = 0x00000080 - AttachVirtualDiskFlagSinglePartition AttachVirtualDiskFlag = 0x00000100 - AttachVirtualDiskFlagRegisterVolume AttachVirtualDiskFlag = 0x00000200 - - // Flags for detaching a VHD. - DetachVirtualDiskFlagNone DetachVirtualDiskFlag = 0x0 -) - -// CreateVhdx is a helper function to create a simple vhdx file at the given path using -// default values. -// -//revive:disable-next-line:var-naming VHDX, not Vhdx -func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error { - params := CreateVirtualDiskParameters{ - Version: 2, - Version2: CreateVersion2{ - MaximumSize: uint64(maxSizeInGb) * 1024 * 1024 * 1024, - BlockSizeInBytes: blockSizeInMb * 1024 * 1024, - }, - } - - handle, err := CreateVirtualDisk(path, VirtualDiskAccessNone, CreateVirtualDiskFlagNone, ¶ms) - if err != nil { - return err - } - - return syscall.CloseHandle(handle) -} - -// DetachVirtualDisk detaches a virtual hard disk by handle. -func DetachVirtualDisk(handle syscall.Handle) (err error) { - if err := detachVirtualDisk(handle, 0, 0); err != nil { - return fmt.Errorf("failed to detach virtual disk: %w", err) - } - return nil -} - -// DetachVhd detaches a vhd found at `path`. -// -//revive:disable-next-line:var-naming VHD, not Vhd -func DetachVhd(path string) error { - handle, err := OpenVirtualDisk( - path, - VirtualDiskAccessNone, - OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator, - ) - if err != nil { - return err - } - defer syscall.CloseHandle(handle) //nolint:errcheck - return DetachVirtualDisk(handle) -} - -// AttachVirtualDisk attaches a virtual hard disk for use. -func AttachVirtualDisk( - handle syscall.Handle, - attachVirtualDiskFlag AttachVirtualDiskFlag, - parameters *AttachVirtualDiskParameters, -) (err error) { - // Supports both version 1 and 2 of the attach parameters as version 2 wasn't present in RS5. - if err := attachVirtualDisk( - handle, - nil, - uint32(attachVirtualDiskFlag), - 0, - parameters, - nil, - ); err != nil { - return fmt.Errorf("failed to attach virtual disk: %w", err) - } - return nil -} - -// AttachVhd attaches a virtual hard disk at `path` for use. Attaches using version 2 -// of the ATTACH_VIRTUAL_DISK_PARAMETERS. -// -//revive:disable-next-line:var-naming VHD, not Vhd -func AttachVhd(path string) (err error) { - handle, err := OpenVirtualDisk( - path, - VirtualDiskAccessNone, - OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator, - ) - if err != nil { - return err - } - - defer syscall.CloseHandle(handle) //nolint:errcheck - params := AttachVirtualDiskParameters{Version: 2} - if err := AttachVirtualDisk( - handle, - AttachVirtualDiskFlagNone, - ¶ms, - ); err != nil { - return fmt.Errorf("failed to attach virtual disk: %w", err) - } - return nil -} - -// OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags. -func OpenVirtualDisk( - vhdPath string, - virtualDiskAccessMask VirtualDiskAccessMask, - openVirtualDiskFlags VirtualDiskFlag, -) (syscall.Handle, error) { - parameters := OpenVirtualDiskParameters{Version: 2} - handle, err := OpenVirtualDiskWithParameters( - vhdPath, - virtualDiskAccessMask, - openVirtualDiskFlags, - ¶meters, - ) - if err != nil { - return 0, err - } - return handle, nil -} - -// OpenVirtualDiskWithParameters obtains a handle to a VHD opened with supplied access mask, flags and parameters. -func OpenVirtualDiskWithParameters( - vhdPath string, - virtualDiskAccessMask VirtualDiskAccessMask, - openVirtualDiskFlags VirtualDiskFlag, - parameters *OpenVirtualDiskParameters, -) (syscall.Handle, error) { - var ( - handle syscall.Handle - defaultType VirtualStorageType - getInfoOnly int32 - readOnly int32 - ) - if parameters.Version != 2 { - return handle, fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version) - } - if parameters.Version2.GetInfoOnly { - getInfoOnly = 1 - } - if parameters.Version2.ReadOnly { - readOnly = 1 - } - params := &openVirtualDiskParameters{ - version: parameters.Version, - version2: openVersion2{ - getInfoOnly, - readOnly, - parameters.Version2.ResiliencyGUID, - }, - } - if err := openVirtualDisk( - &defaultType, - vhdPath, - uint32(virtualDiskAccessMask), - uint32(openVirtualDiskFlags), - params, - &handle, - ); err != nil { - return 0, fmt.Errorf("failed to open virtual disk: %w", err) - } - return handle, nil -} - -// CreateVirtualDisk creates a virtual harddisk and returns a handle to the disk. -func CreateVirtualDisk( - path string, - virtualDiskAccessMask VirtualDiskAccessMask, - createVirtualDiskFlags CreateVirtualDiskFlag, - parameters *CreateVirtualDiskParameters, -) (syscall.Handle, error) { - var ( - handle syscall.Handle - defaultType VirtualStorageType - ) - if parameters.Version != 2 { - return handle, fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version) - } - - if err := createVirtualDisk( - &defaultType, - path, - uint32(virtualDiskAccessMask), - nil, - uint32(createVirtualDiskFlags), - 0, - parameters, - nil, - &handle, - ); err != nil { - return handle, fmt.Errorf("failed to create virtual disk: %w", err) - } - return handle, nil -} - -// GetVirtualDiskPhysicalPath takes a handle to a virtual hard disk and returns the physical -// path of the disk on the machine. This path is in the form \\.\PhysicalDriveX where X is an integer -// that represents the particular enumeration of the physical disk on the caller's system. -func GetVirtualDiskPhysicalPath(handle syscall.Handle) (_ string, err error) { - var ( - diskPathSizeInBytes uint32 = 256 * 2 // max path length 256 wide chars - diskPhysicalPathBuf [256]uint16 - ) - if err := getVirtualDiskPhysicalPath( - handle, - &diskPathSizeInBytes, - &diskPhysicalPathBuf[0], - ); err != nil { - return "", fmt.Errorf("failed to get disk physical path: %w", err) - } - return windows.UTF16ToString(diskPhysicalPathBuf[:]), nil -} - -// CreateDiffVhd is a helper function to create a differencing virtual disk. -// -//revive:disable-next-line:var-naming VHD, not Vhd -func CreateDiffVhd(diffVhdPath, baseVhdPath string, blockSizeInMB uint32) error { - // Setting `ParentPath` is how to signal to create a differencing disk. - createParams := &CreateVirtualDiskParameters{ - Version: 2, - Version2: CreateVersion2{ - ParentPath: windows.StringToUTF16Ptr(baseVhdPath), - BlockSizeInBytes: blockSizeInMB * 1024 * 1024, - OpenFlags: uint32(OpenVirtualDiskFlagCachedIO), - }, - } - - vhdHandle, err := CreateVirtualDisk( - diffVhdPath, - VirtualDiskAccessNone, - CreateVirtualDiskFlagNone, - createParams, - ) - if err != nil { - return fmt.Errorf("failed to create differencing vhd: %w", err) - } - if err := syscall.CloseHandle(vhdHandle); err != nil { - return fmt.Errorf("failed to close differencing vhd handle: %w", err) - } - return nil -} diff --git a/vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go b/vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go deleted file mode 100644 index d0e917d2be..0000000000 --- a/vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go +++ /dev/null @@ -1,108 +0,0 @@ -//go:build windows - -// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. - -package vhd - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) - errERROR_EINVAL error = syscall.EINVAL -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return errERROR_EINVAL - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modvirtdisk = windows.NewLazySystemDLL("virtdisk.dll") - - procAttachVirtualDisk = modvirtdisk.NewProc("AttachVirtualDisk") - procCreateVirtualDisk = modvirtdisk.NewProc("CreateVirtualDisk") - procDetachVirtualDisk = modvirtdisk.NewProc("DetachVirtualDisk") - procGetVirtualDiskPhysicalPath = modvirtdisk.NewProc("GetVirtualDiskPhysicalPath") - procOpenVirtualDisk = modvirtdisk.NewProc("OpenVirtualDisk") -) - -func attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (win32err error) { - r0, _, _ := syscall.Syscall6(procAttachVirtualDisk.Addr(), 6, uintptr(handle), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(attachVirtualDiskFlag), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped))) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} - -func createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) { - var _p0 *uint16 - _p0, win32err = syscall.UTF16PtrFromString(path) - if win32err != nil { - return - } - return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, createVirtualDiskFlags, providerSpecificFlags, parameters, overlapped, handle) -} - -func _createVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) { - r0, _, _ := syscall.Syscall9(procCreateVirtualDisk.Addr(), 9, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(createVirtualDiskFlags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(handle))) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} - -func detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (win32err error) { - r0, _, _ := syscall.Syscall(procDetachVirtualDisk.Addr(), 3, uintptr(handle), uintptr(detachVirtualDiskFlags), uintptr(providerSpecificFlags)) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} - -func getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (win32err error) { - r0, _, _ := syscall.Syscall(procGetVirtualDiskPhysicalPath.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(diskPathSizeInBytes)), uintptr(unsafe.Pointer(buffer))) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} - -func openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) { - var _p0 *uint16 - _p0, win32err = syscall.UTF16PtrFromString(path) - if win32err != nil { - return - } - return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, openVirtualDiskFlags, parameters, handle) -} - -func _openVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) { - r0, _, _ := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(openVirtualDiskFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle))) - if r0 != 0 { - win32err = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go index 83f45a1351..469b16f639 100644 --- a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go +++ b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go @@ -63,7 +63,6 @@ var ( procBackupWrite = modkernel32.NewProc("BackupWrite") procCancelIoEx = modkernel32.NewProc("CancelIoEx") procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") - procCreateFileW = modkernel32.NewProc("CreateFileW") procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") @@ -305,24 +304,6 @@ func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) { return } -func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(name) - if err != nil { - return - } - return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile) -} - -func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) - handle = syscall.Handle(r0) - if handle == syscall.InvalidHandle { - err = errnoErr(e1) - } - return -} - func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) { r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0) newport = syscall.Handle(r0) diff --git a/vendor/github.com/Microsoft/hcsshim/.gitattributes b/vendor/github.com/Microsoft/hcsshim/.gitattributes deleted file mode 100644 index 94f480de94..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/.gitignore b/vendor/github.com/Microsoft/hcsshim/.gitignore deleted file mode 100644 index 54ed6f06c9..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.dll -*.so -*.dylib - -# Ignore vscode setting files -.vscode/ - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 -.glide/ - -# Ignore gcs bin directory -service/bin/ -service/pkg/ - -*.img -*.vhd -*.tar.gz - -# Make stuff -.rootfs-done -bin/* -rootfs/* -*.o -/build/ - -deps/* -out/* - -.idea/ -.vscode/ \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/.golangci.yml b/vendor/github.com/Microsoft/hcsshim/.golangci.yml deleted file mode 100644 index 2400e7f1e0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/.golangci.yml +++ /dev/null @@ -1,99 +0,0 @@ -run: - timeout: 8m - -linters: - enable: - - stylecheck - -linters-settings: - stylecheck: - # https://staticcheck.io/docs/checks - checks: ["all"] - - -issues: - # This repo has a LOT of generated schema files, operating system bindings, and other things that ST1003 from stylecheck won't like - # (screaming case Windows api constants for example). There's also some structs that we *could* change the initialisms to be Go - # friendly (Id -> ID) but they're exported and it would be a breaking change. This makes it so that most new code, code that isn't - # supposed to be a pretty faithful mapping to an OS call/constants, or non-generated code still checks if we're following idioms, - # while ignoring the things that are just noise or would be more of a hassle than it'd be worth to change. - exclude-rules: - - path: layer.go - linters: - - stylecheck - Text: "ST1003:" - - - path: hcsshim.go - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\hcs\\schema2\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\wclayer\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: hcn\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\hcs\\schema1\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\hns\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: ext4\\internal\\compactext4\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: ext4\\internal\\format\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\guestrequest\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\guest\\prot\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\windevice\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\winapi\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\vmcompute\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\regstate\\ - linters: - - stylecheck - Text: "ST1003:" - - - path: internal\\hcserror\\ - linters: - - stylecheck - Text: "ST1003:" \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/CODEOWNERS b/vendor/github.com/Microsoft/hcsshim/CODEOWNERS deleted file mode 100644 index f4c5a07d14..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @microsoft/containerplat \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/LICENSE b/vendor/github.com/Microsoft/hcsshim/LICENSE deleted file mode 100644 index 49d21669ae..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/Makefile b/vendor/github.com/Microsoft/hcsshim/Makefile deleted file mode 100644 index a8f5516cd0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/Makefile +++ /dev/null @@ -1,87 +0,0 @@ -BASE:=base.tar.gz - -GO:=go -GO_FLAGS:=-ldflags "-s -w" # strip Go binaries -CGO_ENABLED:=0 -GOMODVENDOR:= - -CFLAGS:=-O2 -Wall -LDFLAGS:=-static -s # strip C binaries - -GO_FLAGS_EXTRA:= -ifeq "$(GOMODVENDOR)" "1" -GO_FLAGS_EXTRA += -mod=vendor -endif -GO_BUILD:=CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GO_FLAGS) $(GO_FLAGS_EXTRA) - -SRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST)))) - -# The link aliases for gcstools -GCS_TOOLS=\ - generichook - -.PHONY: all always rootfs test - -all: out/initrd.img out/rootfs.tar.gz - -clean: - find -name '*.o' -print0 | xargs -0 -r rm - rm -rf bin deps rootfs out - -test: - cd $(SRCROOT) && go test -v ./internal/guest/... - -out/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools Makefile - @mkdir -p out - rm -rf rootfs - mkdir -p rootfs/bin/ - cp bin/init rootfs/ - cp bin/vsockexec rootfs/bin/ - cp bin/cmd/gcs rootfs/bin/ - cp bin/cmd/gcstools rootfs/bin/ - for tool in $(GCS_TOOLS); do ln -s gcstools rootfs/bin/$$tool; done - git -C $(SRCROOT) rev-parse HEAD > rootfs/gcs.commit && \ - git -C $(SRCROOT) rev-parse --abbrev-ref HEAD > rootfs/gcs.branch - tar -zcf $@ -C rootfs . - rm -rf rootfs - -out/rootfs.tar.gz: out/initrd.img - rm -rf rootfs-conv - mkdir rootfs-conv - gunzip -c out/initrd.img | (cd rootfs-conv && cpio -imd) - tar -zcf $@ -C rootfs-conv . - rm -rf rootfs-conv - -out/initrd.img: $(BASE) out/delta.tar.gz $(SRCROOT)/hack/catcpio.sh - $(SRCROOT)/hack/catcpio.sh "$(BASE)" out/delta.tar.gz > out/initrd.img.uncompressed - gzip -c out/initrd.img.uncompressed > $@ - rm out/initrd.img.uncompressed - --include deps/cmd/gcs.gomake --include deps/cmd/gcstools.gomake - -# Implicit rule for includes that define Go targets. -%.gomake: $(SRCROOT)/Makefile - @mkdir -p $(dir $@) - @/bin/echo $(@:deps/%.gomake=bin/%): $(SRCROOT)/hack/gomakedeps.sh > $@.new - @/bin/echo -e '\t@mkdir -p $$(dir $$@) $(dir $@)' >> $@.new - @/bin/echo -e '\t$$(GO_BUILD) -o $$@.new $$(SRCROOT)/$$(@:bin/%=%)' >> $@.new - @/bin/echo -e '\tGO="$(GO)" $$(SRCROOT)/hack/gomakedeps.sh $$@ $$(SRCROOT)/$$(@:bin/%=%) $$(GO_FLAGS) $$(GO_FLAGS_EXTRA) > $(@:%.gomake=%.godeps).new' >> $@.new - @/bin/echo -e '\tmv $(@:%.gomake=%.godeps).new $(@:%.gomake=%.godeps)' >> $@.new - @/bin/echo -e '\tmv $$@.new $$@' >> $@.new - @/bin/echo -e '-include $(@:%.gomake=%.godeps)' >> $@.new - mv $@.new $@ - -VPATH=$(SRCROOT) - -bin/vsockexec: vsockexec/vsockexec.o vsockexec/vsock.o - @mkdir -p bin - $(CC) $(LDFLAGS) -o $@ $^ - -bin/init: init/init.o vsockexec/vsock.o - @mkdir -p bin - $(CC) $(LDFLAGS) -o $@ $^ - -%.o: %.c - @mkdir -p $(dir $@) - $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< diff --git a/vendor/github.com/Microsoft/hcsshim/Protobuild.toml b/vendor/github.com/Microsoft/hcsshim/Protobuild.toml deleted file mode 100644 index ee18671aa6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/Protobuild.toml +++ /dev/null @@ -1,49 +0,0 @@ -version = "unstable" -generator = "gogoctrd" -plugins = ["grpc", "fieldpath"] - -# Control protoc include paths. Below are usually some good defaults, but feel -# free to try it without them if it works for your project. -[includes] - # Include paths that will be added before all others. Typically, you want to - # treat the root of the project as an include, but this may not be necessary. - before = ["./protobuf"] - - # Paths that should be treated as include roots in relation to the vendor - # directory. These will be calculated with the vendor directory nearest the - # target package. - packages = ["github.com/gogo/protobuf"] - - # Paths that will be added untouched to the end of the includes. We use - # `/usr/local/include` to pickup the common install location of protobuf. - # This is the default. - after = ["/usr/local/include"] - -# This section maps protobuf imports to Go packages. These will become -# `-M` directives in the call to the go protobuf generator. -[packages] - "gogoproto/gogo.proto" = "github.com/gogo/protobuf/gogoproto" - "google/protobuf/any.proto" = "github.com/gogo/protobuf/types" - "google/protobuf/empty.proto" = "github.com/gogo/protobuf/types" - "google/protobuf/struct.proto" = "github.com/gogo/protobuf/types" - "google/protobuf/descriptor.proto" = "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" - "google/protobuf/field_mask.proto" = "github.com/gogo/protobuf/types" - "google/protobuf/timestamp.proto" = "github.com/gogo/protobuf/types" - "google/protobuf/duration.proto" = "github.com/gogo/protobuf/types" - "github/containerd/cgroups/stats/v1/metrics.proto" = "github.com/containerd/cgroups/stats/v1" - -[[overrides]] -prefixes = ["github.com/Microsoft/hcsshim/internal/shimdiag"] -plugins = ["ttrpc"] - -[[overrides]] -prefixes = ["github.com/Microsoft/hcsshim/internal/computeagent"] -plugins = ["ttrpc"] - -[[overrides]] -prefixes = ["github.com/Microsoft/hcsshim/internal/ncproxyttrpc"] -plugins = ["ttrpc"] - -[[overrides]] -prefixes = ["github.com/Microsoft/hcsshim/internal/vmservice"] -plugins = ["ttrpc"] \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/README.md b/vendor/github.com/Microsoft/hcsshim/README.md deleted file mode 100644 index b8ca926a9d..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# hcsshim - -[![Build status](https://github.com/microsoft/hcsshim/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/microsoft/hcsshim/actions?query=branch%3Amaster) - -This package contains the Golang interface for using the Windows [Host Compute Service](https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS), as well as code for the [guest agent](./internal/guest/README.md) (commonly referred to as the GCS or Guest Compute Service in the codebase) used to support running Linux Hyper-V containers. - -It is primarily used in the [Moby](https://github.com/moby/moby) and [Containerd](https://github.com/containerd/containerd) projects, but it can be freely used by other projects as well. - -## Building - -While this repository can be used as a library of sorts to call the HCS apis, there are a couple binaries built out of the repository as well. The main ones being the Linux guest agent, and an implementation of the [runtime v2 containerd shim api](https://github.com/containerd/containerd/blob/master/runtime/v2/README.md). -### Linux Hyper-V Container Guest Agent - -To build the Linux guest agent itself all that's needed is to set your GOOS to "Linux" and build out of ./cmd/gcs. -```powershell -C:\> $env:GOOS="linux" -C:\> go build .\cmd\gcs\ -``` - -or on a Linux machine -```sh -> go build ./cmd/gcs -``` - -If you want it to be packaged inside of a rootfs to boot with alongside all of the other tools then you'll need to provide a rootfs that it can be packaged inside of. An easy way is to export the rootfs of a container. - -```sh -docker pull busybox -docker run --name base_image_container busybox -docker export base_image_container | gzip > base.tar.gz -BASE=./base.tar.gz -make all -``` - -If the build is successful, in the `./out` folder you should see: -```sh -> ls ./out/ -delta.tar.gz initrd.img rootfs.tar.gz -``` - -### Containerd Shim -For info on the Runtime V2 API: https://github.com/containerd/containerd/blob/master/runtime/v2/README.md. - -Contrary to the typical Linux architecture of shim -> runc, the runhcs shim is used both to launch and manage the lifetime of containers. - -```powershell -C:\> $env:GOOS="windows" -C:\> go build .\cmd\containerd-shim-runhcs-v1 -``` - -Then place the binary in the same directory that Containerd is located at in your environment. A default Containerd configuration file can be generated by running: -```powershell -.\containerd.exe config default | Out-File "C:\Program Files\containerd\config.toml" -Encoding ascii -``` - -This config file will already have the shim set as the default runtime for cri interactions. - -To trial using the shim out with ctr.exe: -```powershell -C:\> ctr.exe run --runtime io.containerd.runhcs.v1 --rm mcr.microsoft.com/windows/nanoserver:2004 windows-test cmd /c "echo Hello World!" -``` - -## Contributing - -This project welcomes contributions and suggestions. Most contributions require you to agree to a -Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.microsoft.com. - -When you submit a pull request, a CLA-bot will automatically determine whether you need to provide -a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions -provided by the bot. You will only need to do this once across all repos using our CLA. - -We also require that contributors [sign their commits](https://git-scm.com/docs/git-commit) using `git commit -s` or `git commit --signoff` to -certify they either authored the work themselves or otherwise have permission to use it in this project. Please see https://developercertificate.org/ for -more info, as well as to make sure that you can attest to the rules listed. Our CI uses the [DCO Github app](https://github.com/apps/dco) to ensure -that all commits in a given PR are signed-off. - -### Test Directory (Important to note) - -This project has tried to trim some dependencies from the root Go modules file that would be cumbersome to get transitively included if this -project is being vendored/used as a library. Some of these dependencies were only being used for tests, so the /test directory in this project also has -its own go.mod file where these are now included to get around this issue. Our tests rely on the code in this project to run, so the test Go modules file -has a relative path replace directive to pull in the latest hcsshim code that the tests actually touch from this project -(which is the repo itself on your disk). - -``` -replace ( - github.com/Microsoft/hcsshim => ../ -) -``` - -Because of this, for most code changes you may need to run `go mod vendor` + `go mod tidy` in the /test directory in this repository, as the -CI in this project will check if the files are out of date and will fail if this is true. - - -## Code of Conduct - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or -contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - -## Dependencies - -This project requires Golang 1.9 or newer to build. - -For system requirements to run this project, see the Microsoft docs on [Windows Container requirements](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/system-requirements). - -## Reporting Security Issues - -Security issues and bugs should be reported privately, via email, to the Microsoft Security -Response Center (MSRC) at [secure@microsoft.com](mailto:secure@microsoft.com). You should -receive a response within 24 hours. If for some reason you do not, please follow up via -email to ensure we received your original message. Further information, including the -[MSRC PGP](https://technet.microsoft.com/en-us/security/dn606155) key, can be found in -the [Security TechCenter](https://technet.microsoft.com/en-us/security/default). - -For additional details, see [Report a Computer Security Vulnerability](https://technet.microsoft.com/en-us/security/ff852094.aspx) on Technet - ---------------- -Copyright (c) 2018 Microsoft Corp. All rights reserved. diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go b/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go deleted file mode 100644 index 7f1f2823dd..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go +++ /dev/null @@ -1,38 +0,0 @@ -package computestorage - -import ( - "context" - "encoding/json" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" -) - -// AttachLayerStorageFilter sets up the layer storage filter on a writable -// container layer. -// -// `layerPath` is a path to a directory the writable layer is mounted. If the -// path does not end in a `\` the platform will append it automatically. -// -// `layerData` is the parent read-only layer data. -func AttachLayerStorageFilter(ctx context.Context, layerPath string, layerData LayerData) (err error) { - title := "hcsshim.AttachLayerStorageFilter" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("layerPath", layerPath), - ) - - bytes, err := json.Marshal(layerData) - if err != nil { - return err - } - - err = hcsAttachLayerStorageFilter(layerPath, string(bytes)) - if err != nil { - return errors.Wrap(err, "failed to attach layer storage filter") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go b/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go deleted file mode 100644 index 8e28e6c504..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go +++ /dev/null @@ -1,26 +0,0 @@ -package computestorage - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" -) - -// DestroyLayer deletes a container layer. -// -// `layerPath` is a path to a directory containing the layer to export. -func DestroyLayer(ctx context.Context, layerPath string) (err error) { - title := "hcsshim.DestroyLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) - - err = hcsDestroyLayer(layerPath) - if err != nil { - return errors.Wrap(err, "failed to destroy layer") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go b/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go deleted file mode 100644 index 435473257e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go +++ /dev/null @@ -1,26 +0,0 @@ -package computestorage - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" -) - -// DetachLayerStorageFilter detaches the layer storage filter on a writable container layer. -// -// `layerPath` is a path to a directory containing the layer to export. -func DetachLayerStorageFilter(ctx context.Context, layerPath string) (err error) { - title := "hcsshim.DetachLayerStorageFilter" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) - - err = hcsDetachLayerStorageFilter(layerPath) - if err != nil { - return errors.Wrap(err, "failed to detach layer storage filter") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/export.go b/vendor/github.com/Microsoft/hcsshim/computestorage/export.go deleted file mode 100644 index a1b12dd129..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/export.go +++ /dev/null @@ -1,46 +0,0 @@ -package computestorage - -import ( - "context" - "encoding/json" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" -) - -// ExportLayer exports a container layer. -// -// `layerPath` is a path to a directory containing the layer to export. -// -// `exportFolderPath` is a pre-existing folder to export the layer to. -// -// `layerData` is the parent layer data. -// -// `options` are the export options applied to the exported layer. -func ExportLayer(ctx context.Context, layerPath, exportFolderPath string, layerData LayerData, options ExportLayerOptions) (err error) { - title := "hcsshim.ExportLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("layerPath", layerPath), - trace.StringAttribute("exportFolderPath", exportFolderPath), - ) - - ldbytes, err := json.Marshal(layerData) - if err != nil { - return err - } - - obytes, err := json.Marshal(options) - if err != nil { - return err - } - - err = hcsExportLayer(layerPath, exportFolderPath, string(ldbytes), string(obytes)) - if err != nil { - return errors.Wrap(err, "failed to export layer") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/format.go b/vendor/github.com/Microsoft/hcsshim/computestorage/format.go deleted file mode 100644 index 83c0fa33f0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/format.go +++ /dev/null @@ -1,26 +0,0 @@ -package computestorage - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" - "golang.org/x/sys/windows" -) - -// FormatWritableLayerVhd formats a virtual disk for use as a writable container layer. -// -// If the VHD is not mounted it will be temporarily mounted. -func FormatWritableLayerVhd(ctx context.Context, vhdHandle windows.Handle) (err error) { - title := "hcsshim.FormatWritableLayerVhd" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - - err = hcsFormatWritableLayerVhd(vhdHandle) - if err != nil { - return errors.Wrap(err, "failed to format writable layer vhd") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go b/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go deleted file mode 100644 index 87fee452cd..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go +++ /dev/null @@ -1,193 +0,0 @@ -package computestorage - -import ( - "context" - "os" - "path/filepath" - "syscall" - - "github.com/Microsoft/go-winio/pkg/security" - "github.com/Microsoft/go-winio/vhd" - "github.com/pkg/errors" - "golang.org/x/sys/windows" -) - -const defaultVHDXBlockSizeInMB = 1 - -// SetupContainerBaseLayer is a helper to setup a containers scratch. It -// will create and format the vhdx's inside and the size is configurable with the sizeInGB -// parameter. -// -// `layerPath` is the path to the base container layer on disk. -// -// `baseVhdPath` is the path to where the base vhdx for the base layer should be created. -// -// `diffVhdPath` is the path where the differencing disk for the base layer should be created. -// -// `sizeInGB` is the size in gigabytes to make the base vhdx. -func SetupContainerBaseLayer(ctx context.Context, layerPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) { - var ( - hivesPath = filepath.Join(layerPath, "Hives") - layoutPath = filepath.Join(layerPath, "Layout") - ) - - // We need to remove the hives directory and layout file as `SetupBaseOSLayer` fails if these files - // already exist. `SetupBaseOSLayer` will create these files internally. We also remove the base and - // differencing disks if they exist in case we're asking for a different size. - if _, err := os.Stat(hivesPath); err == nil { - if err := os.RemoveAll(hivesPath); err != nil { - return errors.Wrap(err, "failed to remove prexisting hives directory") - } - } - if _, err := os.Stat(layoutPath); err == nil { - if err := os.RemoveAll(layoutPath); err != nil { - return errors.Wrap(err, "failed to remove prexisting layout file") - } - } - - if _, err := os.Stat(baseVhdPath); err == nil { - if err := os.RemoveAll(baseVhdPath); err != nil { - return errors.Wrap(err, "failed to remove base vhdx path") - } - } - if _, err := os.Stat(diffVhdPath); err == nil { - if err := os.RemoveAll(diffVhdPath); err != nil { - return errors.Wrap(err, "failed to remove differencing vhdx") - } - } - - createParams := &vhd.CreateVirtualDiskParameters{ - Version: 2, - Version2: vhd.CreateVersion2{ - MaximumSize: sizeInGB * 1024 * 1024 * 1024, - BlockSizeInBytes: defaultVHDXBlockSizeInMB * 1024 * 1024, - }, - } - handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) - if err != nil { - return errors.Wrap(err, "failed to create vhdx") - } - - defer func() { - if err != nil { - _ = syscall.CloseHandle(handle) - os.RemoveAll(baseVhdPath) - os.RemoveAll(diffVhdPath) - } - }() - - if err = FormatWritableLayerVhd(ctx, windows.Handle(handle)); err != nil { - return err - } - // Base vhd handle must be closed before calling SetupBaseLayer in case of Container layer - if err = syscall.CloseHandle(handle); err != nil { - return errors.Wrap(err, "failed to close vhdx handle") - } - - options := OsLayerOptions{ - Type: OsLayerTypeContainer, - } - - // SetupBaseOSLayer expects an empty vhd handle for a container layer and will - // error out otherwise. - if err = SetupBaseOSLayer(ctx, layerPath, 0, options); err != nil { - return err - } - // Create the differencing disk that will be what's copied for the final rw layer - // for a container. - if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil { - return errors.Wrap(err, "failed to create differencing disk") - } - - if err = security.GrantVmGroupAccess(baseVhdPath); err != nil { - return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath) - } - if err = security.GrantVmGroupAccess(diffVhdPath); err != nil { - return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath) - } - return nil -} - -// SetupUtilityVMBaseLayer is a helper to setup a UVMs scratch space. It will create and format -// the vhdx inside and the size is configurable by the sizeInGB parameter. -// -// `uvmPath` is the path to the UtilityVM filesystem. -// -// `baseVhdPath` is the path to where the base vhdx for the UVM should be created. -// -// `diffVhdPath` is the path where the differencing disk for the UVM should be created. -// -// `sizeInGB` specifies the size in gigabytes to make the base vhdx. -func SetupUtilityVMBaseLayer(ctx context.Context, uvmPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) { - // Remove the base and differencing disks if they exist in case we're asking for a different size. - if _, err := os.Stat(baseVhdPath); err == nil { - if err := os.RemoveAll(baseVhdPath); err != nil { - return errors.Wrap(err, "failed to remove base vhdx") - } - } - if _, err := os.Stat(diffVhdPath); err == nil { - if err := os.RemoveAll(diffVhdPath); err != nil { - return errors.Wrap(err, "failed to remove differencing vhdx") - } - } - - // Just create the vhdx for utilityVM layer, no need to format it. - createParams := &vhd.CreateVirtualDiskParameters{ - Version: 2, - Version2: vhd.CreateVersion2{ - MaximumSize: sizeInGB * 1024 * 1024 * 1024, - BlockSizeInBytes: defaultVHDXBlockSizeInMB * 1024 * 1024, - }, - } - handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) - if err != nil { - return errors.Wrap(err, "failed to create vhdx") - } - - defer func() { - if err != nil { - _ = syscall.CloseHandle(handle) - os.RemoveAll(baseVhdPath) - os.RemoveAll(diffVhdPath) - } - }() - - // If it is a UtilityVM layer then the base vhdx must be attached when calling - // `SetupBaseOSLayer` - attachParams := &vhd.AttachVirtualDiskParameters{ - Version: 2, - } - if err := vhd.AttachVirtualDisk(handle, vhd.AttachVirtualDiskFlagNone, attachParams); err != nil { - return errors.Wrapf(err, "failed to attach virtual disk") - } - - options := OsLayerOptions{ - Type: OsLayerTypeVM, - } - if err := SetupBaseOSLayer(ctx, uvmPath, windows.Handle(handle), options); err != nil { - return err - } - - // Detach and close the handle after setting up the layer as we don't need the handle - // for anything else and we no longer need to be attached either. - if err = vhd.DetachVirtualDisk(handle); err != nil { - return errors.Wrap(err, "failed to detach vhdx") - } - if err = syscall.CloseHandle(handle); err != nil { - return errors.Wrap(err, "failed to close vhdx handle") - } - - // Create the differencing disk that will be what's copied for the final rw layer - // for a container. - if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil { - return errors.Wrap(err, "failed to create differencing disk") - } - - if err := security.GrantVmGroupAccess(baseVhdPath); err != nil { - return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath) - } - if err := security.GrantVmGroupAccess(diffVhdPath); err != nil { - return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath) - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/import.go b/vendor/github.com/Microsoft/hcsshim/computestorage/import.go deleted file mode 100644 index 0c61dab329..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/import.go +++ /dev/null @@ -1,41 +0,0 @@ -package computestorage - -import ( - "context" - "encoding/json" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" -) - -// ImportLayer imports a container layer. -// -// `layerPath` is a path to a directory to import the layer to. If the directory -// does not exist it will be automatically created. -// -// `sourceFolderpath` is a pre-existing folder that contains the layer to -// import. -// -// `layerData` is the parent layer data. -func ImportLayer(ctx context.Context, layerPath, sourceFolderPath string, layerData LayerData) (err error) { - title := "hcsshim.ImportLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("layerPath", layerPath), - trace.StringAttribute("sourceFolderPath", sourceFolderPath), - ) - - bytes, err := json.Marshal(layerData) - if err != nil { - return err - } - - err = hcsImportLayer(layerPath, sourceFolderPath, string(bytes)) - if err != nil { - return errors.Wrap(err, "failed to import layer") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go b/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go deleted file mode 100644 index 53ed8ea6ed..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go +++ /dev/null @@ -1,38 +0,0 @@ -package computestorage - -import ( - "context" - "encoding/json" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" -) - -// InitializeWritableLayer initializes a writable layer for a container. -// -// `layerPath` is a path to a directory the layer is mounted. If the -// path does not end in a `\` the platform will append it automatically. -// -// `layerData` is the parent read-only layer data. -func InitializeWritableLayer(ctx context.Context, layerPath string, layerData LayerData) (err error) { - title := "hcsshim.InitializeWritableLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("layerPath", layerPath), - ) - - bytes, err := json.Marshal(layerData) - if err != nil { - return err - } - - // Options are not used in the platform as of RS5 - err = hcsInitializeWritableLayer(layerPath, string(bytes), "") - if err != nil { - return errors.Wrap(err, "failed to intitialize container layer") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go b/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go deleted file mode 100644 index fcdbbef814..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go +++ /dev/null @@ -1,27 +0,0 @@ -package computestorage - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/interop" - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/pkg/errors" - "go.opencensus.io/trace" - "golang.org/x/sys/windows" -) - -// GetLayerVhdMountPath returns the volume path for a virtual disk of a writable container layer. -func GetLayerVhdMountPath(ctx context.Context, vhdHandle windows.Handle) (path string, err error) { - title := "hcsshim.GetLayerVhdMountPath" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - - var mountPath *uint16 - err = hcsGetLayerVhdMountPath(vhdHandle, &mountPath) - if err != nil { - return "", errors.Wrap(err, "failed to get vhd mount path") - } - path = interop.ConvertAndFreeCoTaskMemString(mountPath) - return path, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go b/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go deleted file mode 100644 index 06aaf841e8..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go +++ /dev/null @@ -1,74 +0,0 @@ -package computestorage - -import ( - "context" - "encoding/json" - - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/osversion" - "github.com/pkg/errors" - "go.opencensus.io/trace" - "golang.org/x/sys/windows" -) - -// SetupBaseOSLayer sets up a layer that contains a base OS for a container. -// -// `layerPath` is a path to a directory containing the layer. -// -// `vhdHandle` is an empty file handle of `options.Type == OsLayerTypeContainer` -// or else it is a file handle to the 'SystemTemplateBase.vhdx' if `options.Type -// == OsLayerTypeVm`. -// -// `options` are the options applied while processing the layer. -func SetupBaseOSLayer(ctx context.Context, layerPath string, vhdHandle windows.Handle, options OsLayerOptions) (err error) { - title := "hcsshim.SetupBaseOSLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("layerPath", layerPath), - ) - - bytes, err := json.Marshal(options) - if err != nil { - return err - } - - err = hcsSetupBaseOSLayer(layerPath, vhdHandle, string(bytes)) - if err != nil { - return errors.Wrap(err, "failed to setup base OS layer") - } - return nil -} - -// SetupBaseOSVolume sets up a volume that contains a base OS for a container. -// -// `layerPath` is a path to a directory containing the layer. -// -// `volumePath` is the path to the volume to be used for setup. -// -// `options` are the options applied while processing the layer. -func SetupBaseOSVolume(ctx context.Context, layerPath, volumePath string, options OsLayerOptions) (err error) { - if osversion.Build() < 19645 { - return errors.New("SetupBaseOSVolume is not present on builds older than 19645") - } - title := "hcsshim.SetupBaseOSVolume" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("layerPath", layerPath), - trace.StringAttribute("volumePath", volumePath), - ) - - bytes, err := json.Marshal(options) - if err != nil { - return err - } - - err = hcsSetupBaseOSVolume(layerPath, volumePath, string(bytes)) - if err != nil { - return errors.Wrap(err, "failed to setup base OS layer") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go b/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go deleted file mode 100644 index 95aff9c184..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go +++ /dev/null @@ -1,50 +0,0 @@ -// Package computestorage is a wrapper around the HCS storage APIs. These are new storage APIs introduced -// separate from the original graphdriver calls intended to give more freedom around creating -// and managing container layers and scratch spaces. -package computestorage - -import ( - hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" -) - -//go:generate go run ../mksyscall_windows.go -output zsyscall_windows.go storage.go - -//sys hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) = computestorage.HcsImportLayer? -//sys hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) = computestorage.HcsExportLayer? -//sys hcsDestroyLayer(layerPath string) (hr error) = computestorage.HcsDestoryLayer? -//sys hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) = computestorage.HcsSetupBaseOSLayer? -//sys hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) = computestorage.HcsInitializeWritableLayer? -//sys hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) = computestorage.HcsAttachLayerStorageFilter? -//sys hcsDetachLayerStorageFilter(layerPath string) (hr error) = computestorage.HcsDetachLayerStorageFilter? -//sys hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) = computestorage.HcsFormatWritableLayerVhd? -//sys hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) = computestorage.HcsGetLayerVhdMountPath? -//sys hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) = computestorage.HcsSetupBaseOSVolume? - -// LayerData is the data used to describe parent layer information. -type LayerData struct { - SchemaVersion hcsschema.Version `json:"SchemaVersion,omitempty"` - Layers []hcsschema.Layer `json:"Layers,omitempty"` -} - -// ExportLayerOptions are the set of options that are used with the `computestorage.HcsExportLayer` syscall. -type ExportLayerOptions struct { - IsWritableLayer bool `json:"IsWritableLayer,omitempty"` -} - -// OsLayerType is the type of layer being operated on. -type OsLayerType string - -const ( - // OsLayerTypeContainer is a container layer. - OsLayerTypeContainer OsLayerType = "Container" - // OsLayerTypeVM is a virtual machine layer. - OsLayerTypeVM OsLayerType = "Vm" -) - -// OsLayerOptions are the set of options that are used with the `SetupBaseOSLayer` and -// `SetupBaseOSVolume` calls. -type OsLayerOptions struct { - Type OsLayerType `json:"Type,omitempty"` - DisableCiCacheOptimization bool `json:"DisableCiCacheOptimization,omitempty"` - SkipUpdateBcdForBoot bool `json:"SkipUpdateBcdForBoot,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go deleted file mode 100644 index 4f95180674..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go +++ /dev/null @@ -1,319 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package computestorage - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modcomputestorage = windows.NewLazySystemDLL("computestorage.dll") - - procHcsImportLayer = modcomputestorage.NewProc("HcsImportLayer") - procHcsExportLayer = modcomputestorage.NewProc("HcsExportLayer") - procHcsDestoryLayer = modcomputestorage.NewProc("HcsDestoryLayer") - procHcsSetupBaseOSLayer = modcomputestorage.NewProc("HcsSetupBaseOSLayer") - procHcsInitializeWritableLayer = modcomputestorage.NewProc("HcsInitializeWritableLayer") - procHcsAttachLayerStorageFilter = modcomputestorage.NewProc("HcsAttachLayerStorageFilter") - procHcsDetachLayerStorageFilter = modcomputestorage.NewProc("HcsDetachLayerStorageFilter") - procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd") - procHcsGetLayerVhdMountPath = modcomputestorage.NewProc("HcsGetLayerVhdMountPath") - procHcsSetupBaseOSVolume = modcomputestorage.NewProc("HcsSetupBaseOSVolume") -) - -func hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(sourceFolderPath) - if hr != nil { - return - } - var _p2 *uint16 - _p2, hr = syscall.UTF16PtrFromString(layerData) - if hr != nil { - return - } - return _hcsImportLayer(_p0, _p1, _p2) -} - -func _hcsImportLayer(layerPath *uint16, sourceFolderPath *uint16, layerData *uint16) (hr error) { - if hr = procHcsImportLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsImportLayer.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(sourceFolderPath)), uintptr(unsafe.Pointer(layerData))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(exportFolderPath) - if hr != nil { - return - } - var _p2 *uint16 - _p2, hr = syscall.UTF16PtrFromString(layerData) - if hr != nil { - return - } - var _p3 *uint16 - _p3, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsExportLayer(_p0, _p1, _p2, _p3) -} - -func _hcsExportLayer(layerPath *uint16, exportFolderPath *uint16, layerData *uint16, options *uint16) (hr error) { - if hr = procHcsExportLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHcsExportLayer.Addr(), 4, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(exportFolderPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsDestroyLayer(layerPath string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) - if hr != nil { - return - } - return _hcsDestroyLayer(_p0) -} - -func _hcsDestroyLayer(layerPath *uint16) (hr error) { - if hr = procHcsDestoryLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsDestoryLayer.Addr(), 1, uintptr(unsafe.Pointer(layerPath)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsSetupBaseOSLayer(_p0, handle, _p1) -} - -func _hcsSetupBaseOSLayer(layerPath *uint16, handle windows.Handle, options *uint16) (hr error) { - if hr = procHcsSetupBaseOSLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsSetupBaseOSLayer.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(handle), uintptr(unsafe.Pointer(options))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(writableLayerPath) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(layerData) - if hr != nil { - return - } - var _p2 *uint16 - _p2, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsInitializeWritableLayer(_p0, _p1, _p2) -} - -func _hcsInitializeWritableLayer(writableLayerPath *uint16, layerData *uint16, options *uint16) (hr error) { - if hr = procHcsInitializeWritableLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsInitializeWritableLayer.Addr(), 3, uintptr(unsafe.Pointer(writableLayerPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(layerData) - if hr != nil { - return - } - return _hcsAttachLayerStorageFilter(_p0, _p1) -} - -func _hcsAttachLayerStorageFilter(layerPath *uint16, layerData *uint16) (hr error) { - if hr = procHcsAttachLayerStorageFilter.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsAttachLayerStorageFilter.Addr(), 2, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(layerData)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsDetachLayerStorageFilter(layerPath string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) - if hr != nil { - return - } - return _hcsDetachLayerStorageFilter(_p0) -} - -func _hcsDetachLayerStorageFilter(layerPath *uint16) (hr error) { - if hr = procHcsDetachLayerStorageFilter.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsDetachLayerStorageFilter.Addr(), 1, uintptr(unsafe.Pointer(layerPath)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) { - if hr = procHcsFormatWritableLayerVhd.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsFormatWritableLayerVhd.Addr(), 1, uintptr(handle), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) { - if hr = procHcsGetLayerVhdMountPath.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsGetLayerVhdMountPath.Addr(), 2, uintptr(vhdHandle), uintptr(unsafe.Pointer(mountPath)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(volumePath) - if hr != nil { - return - } - var _p2 *uint16 - _p2, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsSetupBaseOSVolume(_p0, _p1, _p2) -} - -func _hcsSetupBaseOSVolume(layerPath *uint16, volumePath *uint16, options *uint16) (hr error) { - if hr = procHcsSetupBaseOSVolume.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsSetupBaseOSVolume.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(options))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/container.go b/vendor/github.com/Microsoft/hcsshim/container.go deleted file mode 100644 index bfd722898e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/container.go +++ /dev/null @@ -1,223 +0,0 @@ -package hcsshim - -import ( - "context" - "fmt" - "os" - "sync" - "time" - - "github.com/Microsoft/hcsshim/internal/hcs" - "github.com/Microsoft/hcsshim/internal/hcs/schema1" - "github.com/Microsoft/hcsshim/internal/mergemaps" -) - -// ContainerProperties holds the properties for a container and the processes running in that container -type ContainerProperties = schema1.ContainerProperties - -// MemoryStats holds the memory statistics for a container -type MemoryStats = schema1.MemoryStats - -// ProcessorStats holds the processor statistics for a container -type ProcessorStats = schema1.ProcessorStats - -// StorageStats holds the storage statistics for a container -type StorageStats = schema1.StorageStats - -// NetworkStats holds the network statistics for a container -type NetworkStats = schema1.NetworkStats - -// Statistics is the structure returned by a statistics call on a container -type Statistics = schema1.Statistics - -// ProcessList is the structure of an item returned by a ProcessList call on a container -type ProcessListItem = schema1.ProcessListItem - -// MappedVirtualDiskController is the structure of an item returned by a MappedVirtualDiskList call on a container -type MappedVirtualDiskController = schema1.MappedVirtualDiskController - -// Type of Request Support in ModifySystem -type RequestType = schema1.RequestType - -// Type of Resource Support in ModifySystem -type ResourceType = schema1.ResourceType - -// RequestType const -const ( - Add = schema1.Add - Remove = schema1.Remove - Network = schema1.Network -) - -// ResourceModificationRequestResponse is the structure used to send request to the container to modify the system -// Supported resource types are Network and Request Types are Add/Remove -type ResourceModificationRequestResponse = schema1.ResourceModificationRequestResponse - -type container struct { - system *hcs.System - waitOnce sync.Once - waitErr error - waitCh chan struct{} -} - -// createComputeSystemAdditionalJSON is read from the environment at initialisation -// time. It allows an environment variable to define additional JSON which -// is merged in the CreateComputeSystem call to HCS. -var createContainerAdditionalJSON []byte - -func init() { - createContainerAdditionalJSON = ([]byte)(os.Getenv("HCSSHIM_CREATECONTAINER_ADDITIONALJSON")) -} - -// CreateContainer creates a new container with the given configuration but does not start it. -func CreateContainer(id string, c *ContainerConfig) (Container, error) { - fullConfig, err := mergemaps.MergeJSON(c, createContainerAdditionalJSON) - if err != nil { - return nil, fmt.Errorf("failed to merge additional JSON '%s': %s", createContainerAdditionalJSON, err) - } - - system, err := hcs.CreateComputeSystem(context.Background(), id, fullConfig) - if err != nil { - return nil, err - } - return &container{system: system}, err -} - -// OpenContainer opens an existing container by ID. -func OpenContainer(id string) (Container, error) { - system, err := hcs.OpenComputeSystem(context.Background(), id) - if err != nil { - return nil, err - } - return &container{system: system}, err -} - -// GetContainers gets a list of the containers on the system that match the query -func GetContainers(q ComputeSystemQuery) ([]ContainerProperties, error) { - return hcs.GetComputeSystems(context.Background(), q) -} - -// Start synchronously starts the container. -func (container *container) Start() error { - return convertSystemError(container.system.Start(context.Background()), container) -} - -// Shutdown requests a container shutdown, but it may not actually be shutdown until Wait() succeeds. -func (container *container) Shutdown() error { - err := container.system.Shutdown(context.Background()) - if err != nil { - return convertSystemError(err, container) - } - return &ContainerError{Container: container, Err: ErrVmcomputeOperationPending, Operation: "hcsshim::ComputeSystem::Shutdown"} -} - -// Terminate requests a container terminate, but it may not actually be terminated until Wait() succeeds. -func (container *container) Terminate() error { - err := container.system.Terminate(context.Background()) - if err != nil { - return convertSystemError(err, container) - } - return &ContainerError{Container: container, Err: ErrVmcomputeOperationPending, Operation: "hcsshim::ComputeSystem::Terminate"} -} - -// Waits synchronously waits for the container to shutdown or terminate. -func (container *container) Wait() error { - err := container.system.Wait() - if err == nil { - err = container.system.ExitError() - } - return convertSystemError(err, container) -} - -// WaitTimeout synchronously waits for the container to terminate or the duration to elapse. It -// returns false if timeout occurs. -func (container *container) WaitTimeout(timeout time.Duration) error { - container.waitOnce.Do(func() { - container.waitCh = make(chan struct{}) - go func() { - container.waitErr = container.Wait() - close(container.waitCh) - }() - }) - t := time.NewTimer(timeout) - defer t.Stop() - select { - case <-t.C: - return &ContainerError{Container: container, Err: ErrTimeout, Operation: "hcsshim::ComputeSystem::Wait"} - case <-container.waitCh: - return container.waitErr - } -} - -// Pause pauses the execution of a container. -func (container *container) Pause() error { - return convertSystemError(container.system.Pause(context.Background()), container) -} - -// Resume resumes the execution of a container. -func (container *container) Resume() error { - return convertSystemError(container.system.Resume(context.Background()), container) -} - -// HasPendingUpdates returns true if the container has updates pending to install -func (container *container) HasPendingUpdates() (bool, error) { - return false, nil -} - -// Statistics returns statistics for the container. This is a legacy v1 call -func (container *container) Statistics() (Statistics, error) { - properties, err := container.system.Properties(context.Background(), schema1.PropertyTypeStatistics) - if err != nil { - return Statistics{}, convertSystemError(err, container) - } - - return properties.Statistics, nil -} - -// ProcessList returns an array of ProcessListItems for the container. This is a legacy v1 call -func (container *container) ProcessList() ([]ProcessListItem, error) { - properties, err := container.system.Properties(context.Background(), schema1.PropertyTypeProcessList) - if err != nil { - return nil, convertSystemError(err, container) - } - - return properties.ProcessList, nil -} - -// This is a legacy v1 call -func (container *container) MappedVirtualDisks() (map[int]MappedVirtualDiskController, error) { - properties, err := container.system.Properties(context.Background(), schema1.PropertyTypeMappedVirtualDisk) - if err != nil { - return nil, convertSystemError(err, container) - } - - return properties.MappedVirtualDiskControllers, nil -} - -// CreateProcess launches a new process within the container. -func (container *container) CreateProcess(c *ProcessConfig) (Process, error) { - p, err := container.system.CreateProcess(context.Background(), c) - if err != nil { - return nil, convertSystemError(err, container) - } - return &process{p: p.(*hcs.Process)}, nil -} - -// OpenProcess gets an interface to an existing process within the container. -func (container *container) OpenProcess(pid int) (Process, error) { - p, err := container.system.OpenProcess(context.Background(), pid) - if err != nil { - return nil, convertSystemError(err, container) - } - return &process{p: p}, nil -} - -// Close cleans up any state associated with the container but does not terminate or wait for it. -func (container *container) Close() error { - return convertSystemError(container.system.Close(), container) -} - -// Modify the System -func (container *container) Modify(config *ResourceModificationRequestResponse) error { - return convertSystemError(container.system.Modify(context.Background(), config), container) -} diff --git a/vendor/github.com/Microsoft/hcsshim/errors.go b/vendor/github.com/Microsoft/hcsshim/errors.go deleted file mode 100644 index f367022e71..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/errors.go +++ /dev/null @@ -1,245 +0,0 @@ -package hcsshim - -import ( - "fmt" - "syscall" - - "github.com/Microsoft/hcsshim/internal/hns" - - "github.com/Microsoft/hcsshim/internal/hcs" - "github.com/Microsoft/hcsshim/internal/hcserror" -) - -var ( - // ErrComputeSystemDoesNotExist is an error encountered when the container being operated on no longer exists = hcs.exist - ErrComputeSystemDoesNotExist = hcs.ErrComputeSystemDoesNotExist - - // ErrElementNotFound is an error encountered when the object being referenced does not exist - ErrElementNotFound = hcs.ErrElementNotFound - - // ErrElementNotFound is an error encountered when the object being referenced does not exist - ErrNotSupported = hcs.ErrNotSupported - - // ErrInvalidData is an error encountered when the request being sent to hcs is invalid/unsupported - // decimal -2147024883 / hex 0x8007000d - ErrInvalidData = hcs.ErrInvalidData - - // ErrHandleClose is an error encountered when the handle generating the notification being waited on has been closed - ErrHandleClose = hcs.ErrHandleClose - - // ErrAlreadyClosed is an error encountered when using a handle that has been closed by the Close method - ErrAlreadyClosed = hcs.ErrAlreadyClosed - - // ErrInvalidNotificationType is an error encountered when an invalid notification type is used - ErrInvalidNotificationType = hcs.ErrInvalidNotificationType - - // ErrInvalidProcessState is an error encountered when the process is not in a valid state for the requested operation - ErrInvalidProcessState = hcs.ErrInvalidProcessState - - // ErrTimeout is an error encountered when waiting on a notification times out - ErrTimeout = hcs.ErrTimeout - - // ErrUnexpectedContainerExit is the error encountered when a container exits while waiting for - // a different expected notification - ErrUnexpectedContainerExit = hcs.ErrUnexpectedContainerExit - - // ErrUnexpectedProcessAbort is the error encountered when communication with the compute service - // is lost while waiting for a notification - ErrUnexpectedProcessAbort = hcs.ErrUnexpectedProcessAbort - - // ErrUnexpectedValue is an error encountered when hcs returns an invalid value - ErrUnexpectedValue = hcs.ErrUnexpectedValue - - // ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container - ErrVmcomputeAlreadyStopped = hcs.ErrVmcomputeAlreadyStopped - - // ErrVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously - ErrVmcomputeOperationPending = hcs.ErrVmcomputeOperationPending - - // ErrVmcomputeOperationInvalidState is an error encountered when the compute system is not in a valid state for the requested operation - ErrVmcomputeOperationInvalidState = hcs.ErrVmcomputeOperationInvalidState - - // ErrProcNotFound is an error encountered when a procedure look up fails. - ErrProcNotFound = hcs.ErrProcNotFound - - // ErrVmcomputeOperationAccessIsDenied is an error which can be encountered when enumerating compute systems in RS1/RS2 - // builds when the underlying silo might be in the process of terminating. HCS was fixed in RS3. - ErrVmcomputeOperationAccessIsDenied = hcs.ErrVmcomputeOperationAccessIsDenied - - // ErrVmcomputeInvalidJSON is an error encountered when the compute system does not support/understand the messages sent by management - ErrVmcomputeInvalidJSON = hcs.ErrVmcomputeInvalidJSON - - // ErrVmcomputeUnknownMessage is an error encountered guest compute system doesn't support the message - ErrVmcomputeUnknownMessage = hcs.ErrVmcomputeUnknownMessage - - // ErrNotSupported is an error encountered when hcs doesn't support the request - ErrPlatformNotSupported = hcs.ErrPlatformNotSupported -) - -type EndpointNotFoundError = hns.EndpointNotFoundError -type NetworkNotFoundError = hns.NetworkNotFoundError - -// ProcessError is an error encountered in HCS during an operation on a Process object -type ProcessError struct { - Process *process - Operation string - Err error - Events []hcs.ErrorEvent -} - -// ContainerError is an error encountered in HCS during an operation on a Container object -type ContainerError struct { - Container *container - Operation string - Err error - Events []hcs.ErrorEvent -} - -func (e *ContainerError) Error() string { - if e == nil { - return "" - } - - if e.Container == nil { - return "unexpected nil container for error: " + e.Err.Error() - } - - s := "container " + e.Container.system.ID() - - if e.Operation != "" { - s += " encountered an error during " + e.Operation - } - - switch e.Err.(type) { - case nil: - break - case syscall.Errno: - s += fmt.Sprintf(": failure in a Windows system call: %s (0x%x)", e.Err, hcserror.Win32FromError(e.Err)) - default: - s += fmt.Sprintf(": %s", e.Err.Error()) - } - - for _, ev := range e.Events { - s += "\n" + ev.String() - } - - return s -} - -func (e *ProcessError) Error() string { - if e == nil { - return "" - } - - if e.Process == nil { - return "Unexpected nil process for error: " + e.Err.Error() - } - - s := fmt.Sprintf("process %d in container %s", e.Process.p.Pid(), e.Process.p.SystemID()) - if e.Operation != "" { - s += " encountered an error during " + e.Operation - } - - switch e.Err.(type) { - case nil: - break - case syscall.Errno: - s += fmt.Sprintf(": failure in a Windows system call: %s (0x%x)", e.Err, hcserror.Win32FromError(e.Err)) - default: - s += fmt.Sprintf(": %s", e.Err.Error()) - } - - for _, ev := range e.Events { - s += "\n" + ev.String() - } - - return s -} - -// IsNotExist checks if an error is caused by the Container or Process not existing. -// Note: Currently, ErrElementNotFound can mean that a Process has either -// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist -// will currently return true when the error is ErrElementNotFound. -func IsNotExist(err error) bool { - if _, ok := err.(EndpointNotFoundError); ok { - return true - } - if _, ok := err.(NetworkNotFoundError); ok { - return true - } - return hcs.IsNotExist(getInnerError(err)) -} - -// IsAlreadyClosed checks if an error is caused by the Container or Process having been -// already closed by a call to the Close() method. -func IsAlreadyClosed(err error) bool { - return hcs.IsAlreadyClosed(getInnerError(err)) -} - -// IsPending returns a boolean indicating whether the error is that -// the requested operation is being completed in the background. -func IsPending(err error) bool { - return hcs.IsPending(getInnerError(err)) -} - -// IsTimeout returns a boolean indicating whether the error is caused by -// a timeout waiting for the operation to complete. -func IsTimeout(err error) bool { - return hcs.IsTimeout(getInnerError(err)) -} - -// IsAlreadyStopped returns a boolean indicating whether the error is caused by -// a Container or Process being already stopped. -// Note: Currently, ErrElementNotFound can mean that a Process has either -// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist -// will currently return true when the error is ErrElementNotFound. -func IsAlreadyStopped(err error) bool { - return hcs.IsAlreadyStopped(getInnerError(err)) -} - -// IsNotSupported returns a boolean indicating whether the error is caused by -// unsupported platform requests -// Note: Currently Unsupported platform requests can be mean either -// ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported or ErrVmcomputeUnknownMessage -// is thrown from the Platform -func IsNotSupported(err error) bool { - return hcs.IsNotSupported(getInnerError(err)) -} - -// IsOperationInvalidState returns true when err is caused by -// `ErrVmcomputeOperationInvalidState`. -func IsOperationInvalidState(err error) bool { - return hcs.IsOperationInvalidState(getInnerError(err)) -} - -// IsAccessIsDenied returns true when err is caused by -// `ErrVmcomputeOperationAccessIsDenied`. -func IsAccessIsDenied(err error) bool { - return hcs.IsAccessIsDenied(getInnerError(err)) -} - -func getInnerError(err error) error { - switch pe := err.(type) { - case nil: - return nil - case *ContainerError: - err = pe.Err - case *ProcessError: - err = pe.Err - } - return err -} - -func convertSystemError(err error, c *container) error { - if serr, ok := err.(*hcs.SystemError); ok { - return &ContainerError{Container: c, Operation: serr.Op, Err: serr.Err, Events: serr.Events} - } - return err -} - -func convertProcessError(err error, p *process) error { - if perr, ok := err.(*hcs.ProcessError); ok { - return &ProcessError{Process: p, Operation: perr.Op, Err: perr.Err, Events: perr.Events} - } - return err -} diff --git a/vendor/github.com/Microsoft/hcsshim/functional_tests.ps1 b/vendor/github.com/Microsoft/hcsshim/functional_tests.ps1 deleted file mode 100644 index ce6edbcf32..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/functional_tests.ps1 +++ /dev/null @@ -1,12 +0,0 @@ -# Requirements so far: -# dockerd running -# - image microsoft/nanoserver (matching host base image) docker load -i c:\baseimages\nanoserver.tar -# - image alpine (linux) docker pull --platform=linux alpine - - -# TODO: Add this a parameter for debugging. ie "functional-tests -debug=$true" -#$env:HCSSHIM_FUNCTIONAL_TESTS_DEBUG="yes please" - -#pushd uvm -go test -v -tags "functional uvmcreate uvmscratch uvmscsi uvmvpmem uvmvsmb uvmp9" ./... -#popd \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/hcsshim.go b/vendor/github.com/Microsoft/hcsshim/hcsshim.go deleted file mode 100644 index ceb3ac85ee..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/hcsshim.go +++ /dev/null @@ -1,28 +0,0 @@ -// Shim for the Host Compute Service (HCS) to manage Windows Server -// containers and Hyper-V containers. - -package hcsshim - -import ( - "syscall" - - "github.com/Microsoft/hcsshim/internal/hcserror" -) - -//go:generate go run mksyscall_windows.go -output zsyscall_windows.go hcsshim.go - -//sys SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) = iphlpapi.SetCurrentThreadCompartmentId - -const ( - // Specific user-visible exit codes - WaitErrExecFailed = 32767 - - ERROR_GEN_FAILURE = hcserror.ERROR_GEN_FAILURE - ERROR_SHUTDOWN_IN_PROGRESS = syscall.Errno(1115) - WSAEINVAL = syscall.Errno(10022) - - // Timeout on wait calls - TimeoutInfinite = 0xFFFFFFFF -) - -type HcsError = hcserror.HcsError diff --git a/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go b/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go deleted file mode 100644 index 9e0059447d..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go +++ /dev/null @@ -1,118 +0,0 @@ -package hcsshim - -import ( - "github.com/Microsoft/hcsshim/internal/hns" -) - -// HNSEndpoint represents a network endpoint in HNS -type HNSEndpoint = hns.HNSEndpoint - -// HNSEndpointStats represent the stats for an networkendpoint in HNS -type HNSEndpointStats = hns.EndpointStats - -// Namespace represents a Compartment. -type Namespace = hns.Namespace - -//SystemType represents the type of the system on which actions are done -type SystemType string - -// SystemType const -const ( - ContainerType SystemType = "Container" - VirtualMachineType SystemType = "VirtualMachine" - HostType SystemType = "Host" -) - -// EndpointAttachDetachRequest is the structure used to send request to the container to modify the system -// Supported resource types are Network and Request Types are Add/Remove -type EndpointAttachDetachRequest = hns.EndpointAttachDetachRequest - -// EndpointResquestResponse is object to get the endpoint request response -type EndpointResquestResponse = hns.EndpointResquestResponse - -// HNSEndpointRequest makes a HNS call to modify/query a network endpoint -func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) { - return hns.HNSEndpointRequest(method, path, request) -} - -// HNSListEndpointRequest makes a HNS call to query the list of available endpoints -func HNSListEndpointRequest() ([]HNSEndpoint, error) { - return hns.HNSListEndpointRequest() -} - -// HotAttachEndpoint makes a HCS Call to attach the endpoint to the container -func HotAttachEndpoint(containerID string, endpointID string) error { - endpoint, err := GetHNSEndpointByID(endpointID) - if err != nil { - return err - } - isAttached, err := endpoint.IsAttached(containerID) - if isAttached { - return err - } - return modifyNetworkEndpoint(containerID, endpointID, Add) -} - -// HotDetachEndpoint makes a HCS Call to detach the endpoint from the container -func HotDetachEndpoint(containerID string, endpointID string) error { - endpoint, err := GetHNSEndpointByID(endpointID) - if err != nil { - return err - } - isAttached, err := endpoint.IsAttached(containerID) - if !isAttached { - return err - } - return modifyNetworkEndpoint(containerID, endpointID, Remove) -} - -// ModifyContainer corresponding to the container id, by sending a request -func modifyContainer(id string, request *ResourceModificationRequestResponse) error { - container, err := OpenContainer(id) - if err != nil { - if IsNotExist(err) { - return ErrComputeSystemDoesNotExist - } - return getInnerError(err) - } - defer container.Close() - err = container.Modify(request) - if err != nil { - if IsNotSupported(err) { - return ErrPlatformNotSupported - } - return getInnerError(err) - } - - return nil -} - -func modifyNetworkEndpoint(containerID string, endpointID string, request RequestType) error { - requestMessage := &ResourceModificationRequestResponse{ - Resource: Network, - Request: request, - Data: endpointID, - } - err := modifyContainer(containerID, requestMessage) - - if err != nil { - return err - } - - return nil -} - -// GetHNSEndpointByID get the Endpoint by ID -func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) { - return hns.GetHNSEndpointByID(endpointID) -} - -// GetHNSEndpointByName gets the endpoint filtered by Name -func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) { - return hns.GetHNSEndpointByName(endpointName) -} - -// GetHNSEndpointStats gets the endpoint stats by ID -func GetHNSEndpointStats(endpointName string) (*HNSEndpointStats, error) { - return hns.GetHNSEndpointStats(endpointName) -} diff --git a/vendor/github.com/Microsoft/hcsshim/hnsglobals.go b/vendor/github.com/Microsoft/hcsshim/hnsglobals.go deleted file mode 100644 index 2b53819047..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/hnsglobals.go +++ /dev/null @@ -1,16 +0,0 @@ -package hcsshim - -import ( - "github.com/Microsoft/hcsshim/internal/hns" -) - -type HNSGlobals = hns.HNSGlobals -type HNSVersion = hns.HNSVersion - -var ( - HNSVersion1803 = hns.HNSVersion1803 -) - -func GetHNSGlobals() (*HNSGlobals, error) { - return hns.GetHNSGlobals() -} diff --git a/vendor/github.com/Microsoft/hcsshim/hnsnetwork.go b/vendor/github.com/Microsoft/hcsshim/hnsnetwork.go deleted file mode 100644 index f775fa1d07..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/hnsnetwork.go +++ /dev/null @@ -1,36 +0,0 @@ -package hcsshim - -import ( - "github.com/Microsoft/hcsshim/internal/hns" -) - -// Subnet is assoicated with a network and represents a list -// of subnets available to the network -type Subnet = hns.Subnet - -// MacPool is assoicated with a network and represents a list -// of macaddresses available to the network -type MacPool = hns.MacPool - -// HNSNetwork represents a network in HNS -type HNSNetwork = hns.HNSNetwork - -// HNSNetworkRequest makes a call into HNS to update/query a single network -func HNSNetworkRequest(method, path, request string) (*HNSNetwork, error) { - return hns.HNSNetworkRequest(method, path, request) -} - -// HNSListNetworkRequest makes a HNS call to query the list of available networks -func HNSListNetworkRequest(method, path, request string) ([]HNSNetwork, error) { - return hns.HNSListNetworkRequest(method, path, request) -} - -// GetHNSNetworkByID -func GetHNSNetworkByID(networkID string) (*HNSNetwork, error) { - return hns.GetHNSNetworkByID(networkID) -} - -// GetHNSNetworkName filtered by Name -func GetHNSNetworkByName(networkName string) (*HNSNetwork, error) { - return hns.GetHNSNetworkByName(networkName) -} diff --git a/vendor/github.com/Microsoft/hcsshim/hnspolicy.go b/vendor/github.com/Microsoft/hcsshim/hnspolicy.go deleted file mode 100644 index 00ab263644..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/hnspolicy.go +++ /dev/null @@ -1,60 +0,0 @@ -package hcsshim - -import ( - "github.com/Microsoft/hcsshim/internal/hns" -) - -// Type of Request Support in ModifySystem -type PolicyType = hns.PolicyType - -// RequestType const -const ( - Nat = hns.Nat - ACL = hns.ACL - PA = hns.PA - VLAN = hns.VLAN - VSID = hns.VSID - VNet = hns.VNet - L2Driver = hns.L2Driver - Isolation = hns.Isolation - QOS = hns.QOS - OutboundNat = hns.OutboundNat - ExternalLoadBalancer = hns.ExternalLoadBalancer - Route = hns.Route - Proxy = hns.Proxy -) - -type ProxyPolicy = hns.ProxyPolicy - -type NatPolicy = hns.NatPolicy - -type QosPolicy = hns.QosPolicy - -type IsolationPolicy = hns.IsolationPolicy - -type VlanPolicy = hns.VlanPolicy - -type VsidPolicy = hns.VsidPolicy - -type PaPolicy = hns.PaPolicy - -type OutboundNatPolicy = hns.OutboundNatPolicy - -type ActionType = hns.ActionType -type DirectionType = hns.DirectionType -type RuleType = hns.RuleType - -const ( - Allow = hns.Allow - Block = hns.Block - - In = hns.In - Out = hns.Out - - Host = hns.Host - Switch = hns.Switch -) - -type ACLPolicy = hns.ACLPolicy - -type Policy = hns.Policy diff --git a/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go b/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go deleted file mode 100644 index 55aaa4a50e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go +++ /dev/null @@ -1,47 +0,0 @@ -package hcsshim - -import ( - "github.com/Microsoft/hcsshim/internal/hns" -) - -// RoutePolicy is a structure defining schema for Route based Policy -type RoutePolicy = hns.RoutePolicy - -// ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy -type ELBPolicy = hns.ELBPolicy - -// LBPolicy is a structure defining schema for LoadBalancing based Policy -type LBPolicy = hns.LBPolicy - -// PolicyList is a structure defining schema for Policy list request -type PolicyList = hns.PolicyList - -// HNSPolicyListRequest makes a call into HNS to update/query a single network -func HNSPolicyListRequest(method, path, request string) (*PolicyList, error) { - return hns.HNSPolicyListRequest(method, path, request) -} - -// HNSListPolicyListRequest gets all the policy list -func HNSListPolicyListRequest() ([]PolicyList, error) { - return hns.HNSListPolicyListRequest() -} - -// PolicyListRequest makes a HNS call to modify/query a network policy list -func PolicyListRequest(method, path, request string) (*PolicyList, error) { - return hns.PolicyListRequest(method, path, request) -} - -// GetPolicyListByID get the policy list by ID -func GetPolicyListByID(policyListID string) (*PolicyList, error) { - return hns.GetPolicyListByID(policyListID) -} - -// AddLoadBalancer policy list for the specified endpoints -func AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, sourceVIP, vip string, protocol uint16, internalPort uint16, externalPort uint16) (*PolicyList, error) { - return hns.AddLoadBalancer(endpoints, isILB, sourceVIP, vip, protocol, internalPort, externalPort) -} - -// AddRoute adds route policy list for the specified endpoints -func AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) { - return hns.AddRoute(endpoints, destinationPrefix, nextHop, encapEnabled) -} diff --git a/vendor/github.com/Microsoft/hcsshim/hnssupport.go b/vendor/github.com/Microsoft/hcsshim/hnssupport.go deleted file mode 100644 index 69405244b6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/hnssupport.go +++ /dev/null @@ -1,13 +0,0 @@ -package hcsshim - -import ( - "github.com/Microsoft/hcsshim/internal/hns" -) - -type HNSSupportedFeatures = hns.HNSSupportedFeatures - -type HNSAclFeatures = hns.HNSAclFeatures - -func GetHNSSupportedFeatures() HNSSupportedFeatures { - return hns.GetHNSSupportedFeatures() -} diff --git a/vendor/github.com/Microsoft/hcsshim/interface.go b/vendor/github.com/Microsoft/hcsshim/interface.go deleted file mode 100644 index 300eb59966..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/interface.go +++ /dev/null @@ -1,114 +0,0 @@ -package hcsshim - -import ( - "io" - "time" - - "github.com/Microsoft/hcsshim/internal/hcs/schema1" -) - -// ProcessConfig is used as both the input of Container.CreateProcess -// and to convert the parameters to JSON for passing onto the HCS -type ProcessConfig = schema1.ProcessConfig - -type Layer = schema1.Layer -type MappedDir = schema1.MappedDir -type MappedPipe = schema1.MappedPipe -type HvRuntime = schema1.HvRuntime -type MappedVirtualDisk = schema1.MappedVirtualDisk - -// AssignedDevice represents a device that has been directly assigned to a container -// -// NOTE: Support added in RS5 -type AssignedDevice = schema1.AssignedDevice - -// ContainerConfig is used as both the input of CreateContainer -// and to convert the parameters to JSON for passing onto the HCS -type ContainerConfig = schema1.ContainerConfig - -type ComputeSystemQuery = schema1.ComputeSystemQuery - -// Container represents a created (but not necessarily running) container. -type Container interface { - // Start synchronously starts the container. - Start() error - - // Shutdown requests a container shutdown, but it may not actually be shutdown until Wait() succeeds. - Shutdown() error - - // Terminate requests a container terminate, but it may not actually be terminated until Wait() succeeds. - Terminate() error - - // Waits synchronously waits for the container to shutdown or terminate. - Wait() error - - // WaitTimeout synchronously waits for the container to terminate or the duration to elapse. It - // returns false if timeout occurs. - WaitTimeout(time.Duration) error - - // Pause pauses the execution of a container. - Pause() error - - // Resume resumes the execution of a container. - Resume() error - - // HasPendingUpdates returns true if the container has updates pending to install. - HasPendingUpdates() (bool, error) - - // Statistics returns statistics for a container. - Statistics() (Statistics, error) - - // ProcessList returns details for the processes in a container. - ProcessList() ([]ProcessListItem, error) - - // MappedVirtualDisks returns virtual disks mapped to a utility VM, indexed by controller - MappedVirtualDisks() (map[int]MappedVirtualDiskController, error) - - // CreateProcess launches a new process within the container. - CreateProcess(c *ProcessConfig) (Process, error) - - // OpenProcess gets an interface to an existing process within the container. - OpenProcess(pid int) (Process, error) - - // Close cleans up any state associated with the container but does not terminate or wait for it. - Close() error - - // Modify the System - Modify(config *ResourceModificationRequestResponse) error -} - -// Process represents a running or exited process. -type Process interface { - // Pid returns the process ID of the process within the container. - Pid() int - - // Kill signals the process to terminate but does not wait for it to finish terminating. - Kill() error - - // Wait waits for the process to exit. - Wait() error - - // WaitTimeout waits for the process to exit or the duration to elapse. It returns - // false if timeout occurs. - WaitTimeout(time.Duration) error - - // ExitCode returns the exit code of the process. The process must have - // already terminated. - ExitCode() (int, error) - - // ResizeConsole resizes the console of the process. - ResizeConsole(width, height uint16) error - - // Stdio returns the stdin, stdout, and stderr pipes, respectively. Closing - // these pipes does not close the underlying pipes; it should be possible to - // call this multiple times to get multiple interfaces. - Stdio() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error) - - // CloseStdin closes the write side of the stdin pipe so that the process is - // notified on the read side that there is no more data in stdin. - CloseStdin() error - - // Close cleans up any state associated with the process but does not kill - // or wait on it. - Close() error -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go b/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go deleted file mode 100644 index f46af33bb6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go +++ /dev/null @@ -1,97 +0,0 @@ -package cow - -import ( - "context" - "io" - - "github.com/Microsoft/hcsshim/internal/hcs/schema1" - hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" -) - -// Process is the interface for an OS process running in a container or utility VM. -type Process interface { - // Close releases resources associated with the process and closes the - // writer and readers returned by Stdio. Depending on the implementation, - // this may also terminate the process. - Close() error - // CloseStdin causes the process's stdin handle to receive EOF/EPIPE/whatever - // is appropriate to indicate that no more data is available. - CloseStdin(ctx context.Context) error - // CloseStdout closes the stdout connection to the process. It is used to indicate - // that we are done receiving output on the shim side. - CloseStdout(ctx context.Context) error - // CloseStderr closes the stderr connection to the process. It is used to indicate - // that we are done receiving output on the shim side. - CloseStderr(ctx context.Context) error - // Pid returns the process ID. - Pid() int - // Stdio returns the stdio streams for a process. These may be nil if a stream - // was not requested during CreateProcess. - Stdio() (_ io.Writer, _ io.Reader, _ io.Reader) - // ResizeConsole resizes the virtual terminal associated with the process. - ResizeConsole(ctx context.Context, width, height uint16) error - // Kill sends a SIGKILL or equivalent signal to the process and returns whether - // the signal was delivered. It does not wait for the process to terminate. - Kill(ctx context.Context) (bool, error) - // Signal sends a signal to the process and returns whether the signal was - // delivered. The input is OS specific (either - // guestrequest.SignalProcessOptionsWCOW or - // guestrequest.SignalProcessOptionsLCOW). It does not wait for the process - // to terminate. - Signal(ctx context.Context, options interface{}) (bool, error) - // Wait waits for the process to complete, or for a connection to the process to be - // terminated by some error condition (including calling Close). - Wait() error - // ExitCode returns the exit code of the process. Returns an error if the process is - // not running. - ExitCode() (int, error) -} - -// ProcessHost is the interface for creating processes. -type ProcessHost interface { - // CreateProcess creates a process. The configuration is host specific - // (either hcsschema.ProcessParameters or lcow.ProcessParameters). - CreateProcess(ctx context.Context, config interface{}) (Process, error) - // OS returns the host's operating system, "linux" or "windows". - OS() string - // IsOCI specifies whether this is an OCI-compliant process host. If true, - // then the configuration passed to CreateProcess should have an OCI process - // spec (or nil if this is the initial process in an OCI container). - // Otherwise, it should have the HCS-specific process parameters. - IsOCI() bool -} - -// Container is the interface for container objects, either running on the host or -// in a utility VM. -type Container interface { - ProcessHost - // Close releases the resources associated with the container. Depending on - // the implementation, this may also terminate the container. - Close() error - // ID returns the container ID. - ID() string - // Properties returns the requested container properties targeting a V1 schema container. - Properties(ctx context.Context, types ...schema1.PropertyType) (*schema1.ContainerProperties, error) - // PropertiesV2 returns the requested container properties targeting a V2 schema container. - PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (*hcsschema.Properties, error) - // Start starts a container. - Start(ctx context.Context) error - // Shutdown sends a shutdown request to the container (but does not wait for - // the shutdown to complete). - Shutdown(ctx context.Context) error - // Terminate sends a terminate request to the container (but does not wait - // for the terminate to complete). - Terminate(ctx context.Context) error - // Wait waits for the container to terminate, or for the connection to the - // container to be terminated by some error condition (including calling - // Close). - Wait() error - // WaitChannel returns the wait channel of the container - WaitChannel() <-chan struct{} - // WaitError returns the container termination error. - // This function should only be called after the channel in WaitChannel() - // is closed. Otherwise it is not thread safe. - WaitError() error - // Modify sends a request to modify container resources - Modify(ctx context.Context, config interface{}) error -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go deleted file mode 100644 index d13772b030..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go +++ /dev/null @@ -1,161 +0,0 @@ -package hcs - -import ( - "fmt" - "sync" - "syscall" - - "github.com/Microsoft/hcsshim/internal/interop" - "github.com/Microsoft/hcsshim/internal/logfields" - "github.com/Microsoft/hcsshim/internal/vmcompute" - "github.com/sirupsen/logrus" -) - -var ( - nextCallback uintptr - callbackMap = map[uintptr]*notificationWatcherContext{} - callbackMapLock = sync.RWMutex{} - - notificationWatcherCallback = syscall.NewCallback(notificationWatcher) - - // Notifications for HCS_SYSTEM handles - hcsNotificationSystemExited hcsNotification = 0x00000001 - hcsNotificationSystemCreateCompleted hcsNotification = 0x00000002 - hcsNotificationSystemStartCompleted hcsNotification = 0x00000003 - hcsNotificationSystemPauseCompleted hcsNotification = 0x00000004 - hcsNotificationSystemResumeCompleted hcsNotification = 0x00000005 - hcsNotificationSystemCrashReport hcsNotification = 0x00000006 - hcsNotificationSystemSiloJobCreated hcsNotification = 0x00000007 - hcsNotificationSystemSaveCompleted hcsNotification = 0x00000008 - hcsNotificationSystemRdpEnhancedModeStateChanged hcsNotification = 0x00000009 - hcsNotificationSystemShutdownFailed hcsNotification = 0x0000000A - hcsNotificationSystemGetPropertiesCompleted hcsNotification = 0x0000000B - hcsNotificationSystemModifyCompleted hcsNotification = 0x0000000C - hcsNotificationSystemCrashInitiated hcsNotification = 0x0000000D - hcsNotificationSystemGuestConnectionClosed hcsNotification = 0x0000000E - - // Notifications for HCS_PROCESS handles - hcsNotificationProcessExited hcsNotification = 0x00010000 - - // Common notifications - hcsNotificationInvalid hcsNotification = 0x00000000 - hcsNotificationServiceDisconnect hcsNotification = 0x01000000 -) - -type hcsNotification uint32 - -func (hn hcsNotification) String() string { - switch hn { - case hcsNotificationSystemExited: - return "SystemExited" - case hcsNotificationSystemCreateCompleted: - return "SystemCreateCompleted" - case hcsNotificationSystemStartCompleted: - return "SystemStartCompleted" - case hcsNotificationSystemPauseCompleted: - return "SystemPauseCompleted" - case hcsNotificationSystemResumeCompleted: - return "SystemResumeCompleted" - case hcsNotificationSystemCrashReport: - return "SystemCrashReport" - case hcsNotificationSystemSiloJobCreated: - return "SystemSiloJobCreated" - case hcsNotificationSystemSaveCompleted: - return "SystemSaveCompleted" - case hcsNotificationSystemRdpEnhancedModeStateChanged: - return "SystemRdpEnhancedModeStateChanged" - case hcsNotificationSystemShutdownFailed: - return "SystemShutdownFailed" - case hcsNotificationSystemGetPropertiesCompleted: - return "SystemGetPropertiesCompleted" - case hcsNotificationSystemModifyCompleted: - return "SystemModifyCompleted" - case hcsNotificationSystemCrashInitiated: - return "SystemCrashInitiated" - case hcsNotificationSystemGuestConnectionClosed: - return "SystemGuestConnectionClosed" - case hcsNotificationProcessExited: - return "ProcessExited" - case hcsNotificationInvalid: - return "Invalid" - case hcsNotificationServiceDisconnect: - return "ServiceDisconnect" - default: - return fmt.Sprintf("Unknown: %d", hn) - } -} - -type notificationChannel chan error - -type notificationWatcherContext struct { - channels notificationChannels - handle vmcompute.HcsCallback - - systemID string - processID int -} - -type notificationChannels map[hcsNotification]notificationChannel - -func newSystemChannels() notificationChannels { - channels := make(notificationChannels) - for _, notif := range []hcsNotification{ - hcsNotificationServiceDisconnect, - hcsNotificationSystemExited, - hcsNotificationSystemCreateCompleted, - hcsNotificationSystemStartCompleted, - hcsNotificationSystemPauseCompleted, - hcsNotificationSystemResumeCompleted, - hcsNotificationSystemSaveCompleted, - } { - channels[notif] = make(notificationChannel, 1) - } - return channels -} - -func newProcessChannels() notificationChannels { - channels := make(notificationChannels) - for _, notif := range []hcsNotification{ - hcsNotificationServiceDisconnect, - hcsNotificationProcessExited, - } { - channels[notif] = make(notificationChannel, 1) - } - return channels -} - -func closeChannels(channels notificationChannels) { - for _, c := range channels { - close(c) - } -} - -func notificationWatcher(notificationType hcsNotification, callbackNumber uintptr, notificationStatus uintptr, notificationData *uint16) uintptr { - var result error - if int32(notificationStatus) < 0 { - result = interop.Win32FromHresult(notificationStatus) - } - - callbackMapLock.RLock() - context := callbackMap[callbackNumber] - callbackMapLock.RUnlock() - - if context == nil { - return 0 - } - - log := logrus.WithFields(logrus.Fields{ - "notification-type": notificationType.String(), - "system-id": context.systemID, - }) - if context.processID != 0 { - log.Data[logfields.ProcessID] = context.processID - } - log.Debug("HCS notification") - - if channel, ok := context.channels[notificationType]; ok { - channel <- result - } - - return 0 -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go deleted file mode 100644 index 295d4b849c..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go +++ /dev/null @@ -1,343 +0,0 @@ -package hcs - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "net" - "syscall" - - "github.com/Microsoft/hcsshim/internal/log" -) - -var ( - // ErrComputeSystemDoesNotExist is an error encountered when the container being operated on no longer exists - ErrComputeSystemDoesNotExist = syscall.Errno(0xc037010e) - - // ErrElementNotFound is an error encountered when the object being referenced does not exist - ErrElementNotFound = syscall.Errno(0x490) - - // ErrElementNotFound is an error encountered when the object being referenced does not exist - ErrNotSupported = syscall.Errno(0x32) - - // ErrInvalidData is an error encountered when the request being sent to hcs is invalid/unsupported - // decimal -2147024883 / hex 0x8007000d - ErrInvalidData = syscall.Errno(0xd) - - // ErrHandleClose is an error encountered when the handle generating the notification being waited on has been closed - ErrHandleClose = errors.New("hcsshim: the handle generating this notification has been closed") - - // ErrAlreadyClosed is an error encountered when using a handle that has been closed by the Close method - ErrAlreadyClosed = errors.New("hcsshim: the handle has already been closed") - - // ErrInvalidNotificationType is an error encountered when an invalid notification type is used - ErrInvalidNotificationType = errors.New("hcsshim: invalid notification type") - - // ErrInvalidProcessState is an error encountered when the process is not in a valid state for the requested operation - ErrInvalidProcessState = errors.New("the process is in an invalid state for the attempted operation") - - // ErrTimeout is an error encountered when waiting on a notification times out - ErrTimeout = errors.New("hcsshim: timeout waiting for notification") - - // ErrUnexpectedContainerExit is the error encountered when a container exits while waiting for - // a different expected notification - ErrUnexpectedContainerExit = errors.New("unexpected container exit") - - // ErrUnexpectedProcessAbort is the error encountered when communication with the compute service - // is lost while waiting for a notification - ErrUnexpectedProcessAbort = errors.New("lost communication with compute service") - - // ErrUnexpectedValue is an error encountered when hcs returns an invalid value - ErrUnexpectedValue = errors.New("unexpected value returned from hcs") - - // ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container - ErrVmcomputeAlreadyStopped = syscall.Errno(0xc0370110) - - // ErrVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously - ErrVmcomputeOperationPending = syscall.Errno(0xC0370103) - - // ErrVmcomputeOperationInvalidState is an error encountered when the compute system is not in a valid state for the requested operation - ErrVmcomputeOperationInvalidState = syscall.Errno(0xc0370105) - - // ErrProcNotFound is an error encountered when a procedure look up fails. - ErrProcNotFound = syscall.Errno(0x7f) - - // ErrVmcomputeOperationAccessIsDenied is an error which can be encountered when enumerating compute systems in RS1/RS2 - // builds when the underlying silo might be in the process of terminating. HCS was fixed in RS3. - ErrVmcomputeOperationAccessIsDenied = syscall.Errno(0x5) - - // ErrVmcomputeInvalidJSON is an error encountered when the compute system does not support/understand the messages sent by management - ErrVmcomputeInvalidJSON = syscall.Errno(0xc037010d) - - // ErrVmcomputeUnknownMessage is an error encountered guest compute system doesn't support the message - ErrVmcomputeUnknownMessage = syscall.Errno(0xc037010b) - - // ErrVmcomputeUnexpectedExit is an error encountered when the compute system terminates unexpectedly - ErrVmcomputeUnexpectedExit = syscall.Errno(0xC0370106) - - // ErrNotSupported is an error encountered when hcs doesn't support the request - ErrPlatformNotSupported = errors.New("unsupported platform request") - - // ErrProcessAlreadyStopped is returned by hcs if the process we're trying to kill has already been stopped. - ErrProcessAlreadyStopped = syscall.Errno(0x8037011f) - - // ErrInvalidHandle is an error that can be encountrered when querying the properties of a compute system when the handle to that - // compute system has already been closed. - ErrInvalidHandle = syscall.Errno(0x6) -) - -type ErrorEvent struct { - Message string `json:"Message,omitempty"` // Fully formated error message - StackTrace string `json:"StackTrace,omitempty"` // Stack trace in string form - Provider string `json:"Provider,omitempty"` - EventID uint16 `json:"EventId,omitempty"` - Flags uint32 `json:"Flags,omitempty"` - Source string `json:"Source,omitempty"` - //Data []EventData `json:"Data,omitempty"` // Omit this as HCS doesn't encode this well. It's more confusing to include. It is however logged in debug mode (see processHcsResult function) -} - -type hcsResult struct { - Error int32 - ErrorMessage string - ErrorEvents []ErrorEvent `json:"ErrorEvents,omitempty"` -} - -func (ev *ErrorEvent) String() string { - evs := "[Event Detail: " + ev.Message - if ev.StackTrace != "" { - evs += " Stack Trace: " + ev.StackTrace - } - if ev.Provider != "" { - evs += " Provider: " + ev.Provider - } - if ev.EventID != 0 { - evs = fmt.Sprintf("%s EventID: %d", evs, ev.EventID) - } - if ev.Flags != 0 { - evs = fmt.Sprintf("%s flags: %d", evs, ev.Flags) - } - if ev.Source != "" { - evs += " Source: " + ev.Source - } - evs += "]" - return evs -} - -func processHcsResult(ctx context.Context, resultJSON string) []ErrorEvent { - if resultJSON != "" { - result := &hcsResult{} - if err := json.Unmarshal([]byte(resultJSON), result); err != nil { - log.G(ctx).WithError(err).Warning("Could not unmarshal HCS result") - return nil - } - return result.ErrorEvents - } - return nil -} - -type HcsError struct { - Op string - Err error - Events []ErrorEvent -} - -var _ net.Error = &HcsError{} - -func (e *HcsError) Error() string { - s := e.Op + ": " + e.Err.Error() - for _, ev := range e.Events { - s += "\n" + ev.String() - } - return s -} - -func (e *HcsError) Temporary() bool { - err, ok := e.Err.(net.Error) - return ok && err.Temporary() //nolint:staticcheck -} - -func (e *HcsError) Timeout() bool { - err, ok := e.Err.(net.Error) - return ok && err.Timeout() -} - -// ProcessError is an error encountered in HCS during an operation on a Process object -type ProcessError struct { - SystemID string - Pid int - Op string - Err error - Events []ErrorEvent -} - -var _ net.Error = &ProcessError{} - -// SystemError is an error encountered in HCS during an operation on a Container object -type SystemError struct { - ID string - Op string - Err error - Events []ErrorEvent -} - -var _ net.Error = &SystemError{} - -func (e *SystemError) Error() string { - s := e.Op + " " + e.ID + ": " + e.Err.Error() - for _, ev := range e.Events { - s += "\n" + ev.String() - } - return s -} - -func (e *SystemError) Temporary() bool { - err, ok := e.Err.(net.Error) - return ok && err.Temporary() //nolint:staticcheck -} - -func (e *SystemError) Timeout() bool { - err, ok := e.Err.(net.Error) - return ok && err.Timeout() -} - -func makeSystemError(system *System, op string, err error, events []ErrorEvent) error { - // Don't double wrap errors - if _, ok := err.(*SystemError); ok { - return err - } - return &SystemError{ - ID: system.ID(), - Op: op, - Err: err, - Events: events, - } -} - -func (e *ProcessError) Error() string { - s := fmt.Sprintf("%s %s:%d: %s", e.Op, e.SystemID, e.Pid, e.Err.Error()) - for _, ev := range e.Events { - s += "\n" + ev.String() - } - return s -} - -func (e *ProcessError) Temporary() bool { - err, ok := e.Err.(net.Error) - return ok && err.Temporary() //nolint:staticcheck -} - -func (e *ProcessError) Timeout() bool { - err, ok := e.Err.(net.Error) - return ok && err.Timeout() -} - -func makeProcessError(process *Process, op string, err error, events []ErrorEvent) error { - // Don't double wrap errors - if _, ok := err.(*ProcessError); ok { - return err - } - return &ProcessError{ - Pid: process.Pid(), - SystemID: process.SystemID(), - Op: op, - Err: err, - Events: events, - } -} - -// IsNotExist checks if an error is caused by the Container or Process not existing. -// Note: Currently, ErrElementNotFound can mean that a Process has either -// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist -// will currently return true when the error is ErrElementNotFound. -func IsNotExist(err error) bool { - err = getInnerError(err) - return err == ErrComputeSystemDoesNotExist || - err == ErrElementNotFound -} - -// IsErrorInvalidHandle checks whether the error is the result of an operation carried -// out on a handle that is invalid/closed. This error popped up while trying to query -// stats on a container in the process of being stopped. -func IsErrorInvalidHandle(err error) bool { - err = getInnerError(err) - return err == ErrInvalidHandle -} - -// IsAlreadyClosed checks if an error is caused by the Container or Process having been -// already closed by a call to the Close() method. -func IsAlreadyClosed(err error) bool { - err = getInnerError(err) - return err == ErrAlreadyClosed -} - -// IsPending returns a boolean indicating whether the error is that -// the requested operation is being completed in the background. -func IsPending(err error) bool { - err = getInnerError(err) - return err == ErrVmcomputeOperationPending -} - -// IsTimeout returns a boolean indicating whether the error is caused by -// a timeout waiting for the operation to complete. -func IsTimeout(err error) bool { - if err, ok := err.(net.Error); ok && err.Timeout() { - return true - } - err = getInnerError(err) - return err == ErrTimeout -} - -// IsAlreadyStopped returns a boolean indicating whether the error is caused by -// a Container or Process being already stopped. -// Note: Currently, ErrElementNotFound can mean that a Process has either -// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist -// will currently return true when the error is ErrElementNotFound. -func IsAlreadyStopped(err error) bool { - err = getInnerError(err) - return err == ErrVmcomputeAlreadyStopped || - err == ErrProcessAlreadyStopped || - err == ErrElementNotFound -} - -// IsNotSupported returns a boolean indicating whether the error is caused by -// unsupported platform requests -// Note: Currently Unsupported platform requests can be mean either -// ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported or ErrVmcomputeUnknownMessage -// is thrown from the Platform -func IsNotSupported(err error) bool { - err = getInnerError(err) - // If Platform doesn't recognize or support the request sent, below errors are seen - return err == ErrVmcomputeInvalidJSON || - err == ErrInvalidData || - err == ErrNotSupported || - err == ErrVmcomputeUnknownMessage -} - -// IsOperationInvalidState returns true when err is caused by -// `ErrVmcomputeOperationInvalidState`. -func IsOperationInvalidState(err error) bool { - err = getInnerError(err) - return err == ErrVmcomputeOperationInvalidState -} - -// IsAccessIsDenied returns true when err is caused by -// `ErrVmcomputeOperationAccessIsDenied`. -func IsAccessIsDenied(err error) bool { - err = getInnerError(err) - return err == ErrVmcomputeOperationAccessIsDenied -} - -func getInnerError(err error) error { - switch pe := err.(type) { - case nil: - return nil - case *HcsError: - err = pe.Err - case *SystemError: - err = pe.Err - case *ProcessError: - err = pe.Err - } - return err -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go deleted file mode 100644 index f4605922ab..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go +++ /dev/null @@ -1,557 +0,0 @@ -package hcs - -import ( - "context" - "encoding/json" - "errors" - "io" - "os" - "sync" - "syscall" - "time" - - "github.com/Microsoft/hcsshim/internal/log" - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/internal/vmcompute" - "go.opencensus.io/trace" -) - -// ContainerError is an error encountered in HCS -type Process struct { - handleLock sync.RWMutex - handle vmcompute.HcsProcess - processID int - system *System - hasCachedStdio bool - stdioLock sync.Mutex - stdin io.WriteCloser - stdout io.ReadCloser - stderr io.ReadCloser - callbackNumber uintptr - killSignalDelivered bool - - closedWaitOnce sync.Once - waitBlock chan struct{} - exitCode int - waitError error -} - -func newProcess(process vmcompute.HcsProcess, processID int, computeSystem *System) *Process { - return &Process{ - handle: process, - processID: processID, - system: computeSystem, - waitBlock: make(chan struct{}), - } -} - -type processModifyRequest struct { - Operation string - ConsoleSize *consoleSize `json:",omitempty"` - CloseHandle *closeHandle `json:",omitempty"` -} - -type consoleSize struct { - Height uint16 - Width uint16 -} - -type closeHandle struct { - Handle string -} - -type processStatus struct { - ProcessID uint32 - Exited bool - ExitCode uint32 - LastWaitResult int32 -} - -const stdIn string = "StdIn" - -const ( - modifyConsoleSize string = "ConsoleSize" - modifyCloseHandle string = "CloseHandle" -) - -// Pid returns the process ID of the process within the container. -func (process *Process) Pid() int { - return process.processID -} - -// SystemID returns the ID of the process's compute system. -func (process *Process) SystemID() string { - return process.system.ID() -} - -func (process *Process) processSignalResult(ctx context.Context, err error) (bool, error) { - switch err { - case nil: - return true, nil - case ErrVmcomputeOperationInvalidState, ErrComputeSystemDoesNotExist, ErrElementNotFound: - select { - case <-process.waitBlock: - // The process exit notification has already arrived. - default: - // The process should be gone, but we have not received the notification. - // After a second, force unblock the process wait to work around a possible - // deadlock in the HCS. - go func() { - time.Sleep(time.Second) - process.closedWaitOnce.Do(func() { - log.G(ctx).WithError(err).Warn("force unblocking process waits") - process.exitCode = -1 - process.waitError = err - close(process.waitBlock) - }) - }() - } - return false, nil - default: - return false, err - } -} - -// Signal signals the process with `options`. -// -// For LCOW `guestrequest.SignalProcessOptionsLCOW`. -// -// For WCOW `guestrequest.SignalProcessOptionsWCOW`. -func (process *Process) Signal(ctx context.Context, options interface{}) (bool, error) { - process.handleLock.RLock() - defer process.handleLock.RUnlock() - - operation := "hcs::Process::Signal" - - if process.handle == 0 { - return false, makeProcessError(process, operation, ErrAlreadyClosed, nil) - } - - optionsb, err := json.Marshal(options) - if err != nil { - return false, err - } - - resultJSON, err := vmcompute.HcsSignalProcess(ctx, process.handle, string(optionsb)) - events := processHcsResult(ctx, resultJSON) - delivered, err := process.processSignalResult(ctx, err) - if err != nil { - err = makeProcessError(process, operation, err, events) - } - return delivered, err -} - -// Kill signals the process to terminate but does not wait for it to finish terminating. -func (process *Process) Kill(ctx context.Context) (bool, error) { - process.handleLock.RLock() - defer process.handleLock.RUnlock() - - operation := "hcs::Process::Kill" - - if process.handle == 0 { - return false, makeProcessError(process, operation, ErrAlreadyClosed, nil) - } - - if process.killSignalDelivered { - // A kill signal has already been sent to this process. Sending a second - // one offers no real benefit, as processes cannot stop themselves from - // being terminated, once a TerminateProcess has been issued. Sending a - // second kill may result in a number of errors (two of which detailed bellow) - // and which we can avoid handling. - return true, nil - } - - resultJSON, err := vmcompute.HcsTerminateProcess(ctx, process.handle) - if err != nil { - // We still need to check these two cases, as processes may still be killed by an - // external actor (human operator, OOM, random script etc). - if errors.Is(err, os.ErrPermission) || IsAlreadyStopped(err) { - // There are two cases where it should be safe to ignore an error returned - // by HcsTerminateProcess. The first one is cause by the fact that - // HcsTerminateProcess ends up calling TerminateProcess in the context - // of a container. According to the TerminateProcess documentation: - // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess#remarks - // After a process has terminated, call to TerminateProcess with open - // handles to the process fails with ERROR_ACCESS_DENIED (5) error code. - // It's safe to ignore this error here. HCS should always have permissions - // to kill processes inside any container. So an ERROR_ACCESS_DENIED - // is unlikely to be anything else than what the ending remarks in the - // documentation states. - // - // The second case is generated by hcs itself, if for any reason HcsTerminateProcess - // is called twice in a very short amount of time. In such cases, hcs may return - // HCS_E_PROCESS_ALREADY_STOPPED. - return true, nil - } - } - events := processHcsResult(ctx, resultJSON) - delivered, err := process.processSignalResult(ctx, err) - if err != nil { - err = makeProcessError(process, operation, err, events) - } - - process.killSignalDelivered = delivered - return delivered, err -} - -// waitBackground waits for the process exit notification. Once received sets -// `process.waitError` (if any) and unblocks all `Wait` calls. -// -// This MUST be called exactly once per `process.handle` but `Wait` is safe to -// call multiple times. -func (process *Process) waitBackground() { - operation := "hcs::Process::waitBackground" - ctx, span := trace.StartSpan(context.Background(), operation) - defer span.End() - span.AddAttributes( - trace.StringAttribute("cid", process.SystemID()), - trace.Int64Attribute("pid", int64(process.processID))) - - var ( - err error - exitCode = -1 - propertiesJSON string - resultJSON string - ) - - err = waitForNotification(ctx, process.callbackNumber, hcsNotificationProcessExited, nil) - if err != nil { - err = makeProcessError(process, operation, err, nil) - log.G(ctx).WithError(err).Error("failed wait") - } else { - process.handleLock.RLock() - defer process.handleLock.RUnlock() - - // Make sure we didnt race with Close() here - if process.handle != 0 { - propertiesJSON, resultJSON, err = vmcompute.HcsGetProcessProperties(ctx, process.handle) - events := processHcsResult(ctx, resultJSON) - if err != nil { - err = makeProcessError(process, operation, err, events) //nolint:ineffassign - } else { - properties := &processStatus{} - err = json.Unmarshal([]byte(propertiesJSON), properties) - if err != nil { - err = makeProcessError(process, operation, err, nil) //nolint:ineffassign - } else { - if properties.LastWaitResult != 0 { - log.G(ctx).WithField("wait-result", properties.LastWaitResult).Warning("non-zero last wait result") - } else { - exitCode = int(properties.ExitCode) - } - } - } - } - } - log.G(ctx).WithField("exitCode", exitCode).Debug("process exited") - - process.closedWaitOnce.Do(func() { - process.exitCode = exitCode - process.waitError = err - close(process.waitBlock) - }) - oc.SetSpanStatus(span, err) -} - -// Wait waits for the process to exit. If the process has already exited returns -// the pervious error (if any). -func (process *Process) Wait() error { - <-process.waitBlock - return process.waitError -} - -// ResizeConsole resizes the console of the process. -func (process *Process) ResizeConsole(ctx context.Context, width, height uint16) error { - process.handleLock.RLock() - defer process.handleLock.RUnlock() - - operation := "hcs::Process::ResizeConsole" - - if process.handle == 0 { - return makeProcessError(process, operation, ErrAlreadyClosed, nil) - } - - modifyRequest := processModifyRequest{ - Operation: modifyConsoleSize, - ConsoleSize: &consoleSize{ - Height: height, - Width: width, - }, - } - - modifyRequestb, err := json.Marshal(modifyRequest) - if err != nil { - return err - } - - resultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return makeProcessError(process, operation, err, events) - } - - return nil -} - -// ExitCode returns the exit code of the process. The process must have -// already terminated. -func (process *Process) ExitCode() (int, error) { - select { - case <-process.waitBlock: - if process.waitError != nil { - return -1, process.waitError - } - return process.exitCode, nil - default: - return -1, makeProcessError(process, "hcs::Process::ExitCode", ErrInvalidProcessState, nil) - } -} - -// StdioLegacy returns the stdin, stdout, and stderr pipes, respectively. Closing -// these pipes does not close the underlying pipes. Once returned, these pipes -// are the responsibility of the caller to close. -func (process *Process) StdioLegacy() (_ io.WriteCloser, _ io.ReadCloser, _ io.ReadCloser, err error) { - operation := "hcs::Process::StdioLegacy" - ctx, span := trace.StartSpan(context.Background(), operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("cid", process.SystemID()), - trace.Int64Attribute("pid", int64(process.processID))) - - process.handleLock.RLock() - defer process.handleLock.RUnlock() - - if process.handle == 0 { - return nil, nil, nil, makeProcessError(process, operation, ErrAlreadyClosed, nil) - } - - process.stdioLock.Lock() - defer process.stdioLock.Unlock() - if process.hasCachedStdio { - stdin, stdout, stderr := process.stdin, process.stdout, process.stderr - process.stdin, process.stdout, process.stderr = nil, nil, nil - process.hasCachedStdio = false - return stdin, stdout, stderr, nil - } - - processInfo, resultJSON, err := vmcompute.HcsGetProcessInfo(ctx, process.handle) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, nil, nil, makeProcessError(process, operation, err, events) - } - - pipes, err := makeOpenFiles([]syscall.Handle{processInfo.StdInput, processInfo.StdOutput, processInfo.StdError}) - if err != nil { - return nil, nil, nil, makeProcessError(process, operation, err, nil) - } - - return pipes[0], pipes[1], pipes[2], nil -} - -// Stdio returns the stdin, stdout, and stderr pipes, respectively. -// To close them, close the process handle. -func (process *Process) Stdio() (stdin io.Writer, stdout, stderr io.Reader) { - process.stdioLock.Lock() - defer process.stdioLock.Unlock() - return process.stdin, process.stdout, process.stderr -} - -// CloseStdin closes the write side of the stdin pipe so that the process is -// notified on the read side that there is no more data in stdin. -func (process *Process) CloseStdin(ctx context.Context) error { - process.handleLock.RLock() - defer process.handleLock.RUnlock() - - operation := "hcs::Process::CloseStdin" - - if process.handle == 0 { - return makeProcessError(process, operation, ErrAlreadyClosed, nil) - } - - modifyRequest := processModifyRequest{ - Operation: modifyCloseHandle, - CloseHandle: &closeHandle{ - Handle: stdIn, - }, - } - - modifyRequestb, err := json.Marshal(modifyRequest) - if err != nil { - return err - } - - resultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return makeProcessError(process, operation, err, events) - } - - process.stdioLock.Lock() - if process.stdin != nil { - process.stdin.Close() - process.stdin = nil - } - process.stdioLock.Unlock() - - return nil -} - -func (process *Process) CloseStdout(ctx context.Context) (err error) { - ctx, span := trace.StartSpan(ctx, "hcs::Process::CloseStdout") //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("cid", process.SystemID()), - trace.Int64Attribute("pid", int64(process.processID))) - - process.handleLock.Lock() - defer process.handleLock.Unlock() - - if process.handle == 0 { - return nil - } - - process.stdioLock.Lock() - defer process.stdioLock.Unlock() - if process.stdout != nil { - process.stdout.Close() - process.stdout = nil - } - return nil -} - -func (process *Process) CloseStderr(ctx context.Context) (err error) { - ctx, span := trace.StartSpan(ctx, "hcs::Process::CloseStderr") //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("cid", process.SystemID()), - trace.Int64Attribute("pid", int64(process.processID))) - - process.handleLock.Lock() - defer process.handleLock.Unlock() - - if process.handle == 0 { - return nil - } - - process.stdioLock.Lock() - defer process.stdioLock.Unlock() - if process.stderr != nil { - process.stderr.Close() - process.stderr = nil - - } - return nil -} - -// Close cleans up any state associated with the process but does not kill -// or wait on it. -func (process *Process) Close() (err error) { - operation := "hcs::Process::Close" - ctx, span := trace.StartSpan(context.Background(), operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("cid", process.SystemID()), - trace.Int64Attribute("pid", int64(process.processID))) - - process.handleLock.Lock() - defer process.handleLock.Unlock() - - // Don't double free this - if process.handle == 0 { - return nil - } - - process.stdioLock.Lock() - if process.stdin != nil { - process.stdin.Close() - process.stdin = nil - } - if process.stdout != nil { - process.stdout.Close() - process.stdout = nil - } - if process.stderr != nil { - process.stderr.Close() - process.stderr = nil - } - process.stdioLock.Unlock() - - if err = process.unregisterCallback(ctx); err != nil { - return makeProcessError(process, operation, err, nil) - } - - if err = vmcompute.HcsCloseProcess(ctx, process.handle); err != nil { - return makeProcessError(process, operation, err, nil) - } - - process.handle = 0 - process.closedWaitOnce.Do(func() { - process.exitCode = -1 - process.waitError = ErrAlreadyClosed - close(process.waitBlock) - }) - - return nil -} - -func (process *Process) registerCallback(ctx context.Context) error { - callbackContext := ¬ificationWatcherContext{ - channels: newProcessChannels(), - systemID: process.SystemID(), - processID: process.processID, - } - - callbackMapLock.Lock() - callbackNumber := nextCallback - nextCallback++ - callbackMap[callbackNumber] = callbackContext - callbackMapLock.Unlock() - - callbackHandle, err := vmcompute.HcsRegisterProcessCallback(ctx, process.handle, notificationWatcherCallback, callbackNumber) - if err != nil { - return err - } - callbackContext.handle = callbackHandle - process.callbackNumber = callbackNumber - - return nil -} - -func (process *Process) unregisterCallback(ctx context.Context) error { - callbackNumber := process.callbackNumber - - callbackMapLock.RLock() - callbackContext := callbackMap[callbackNumber] - callbackMapLock.RUnlock() - - if callbackContext == nil { - return nil - } - - handle := callbackContext.handle - - if handle == 0 { - return nil - } - - // vmcompute.HcsUnregisterProcessCallback has its own synchronization to - // wait for all callbacks to complete. We must NOT hold the callbackMapLock. - err := vmcompute.HcsUnregisterProcessCallback(ctx, handle) - if err != nil { - return err - } - - closeChannels(callbackContext.channels) - - callbackMapLock.Lock() - delete(callbackMap, callbackNumber) - callbackMapLock.Unlock() - - handle = 0 //nolint:ineffassign - - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go deleted file mode 100644 index b621c55938..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go +++ /dev/null @@ -1,250 +0,0 @@ -package schema1 - -import ( - "encoding/json" - "time" - - "github.com/Microsoft/go-winio/pkg/guid" - hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" -) - -// ProcessConfig is used as both the input of Container.CreateProcess -// and to convert the parameters to JSON for passing onto the HCS -type ProcessConfig struct { - ApplicationName string `json:",omitempty"` - CommandLine string `json:",omitempty"` - CommandArgs []string `json:",omitempty"` // Used by Linux Containers on Windows - User string `json:",omitempty"` - WorkingDirectory string `json:",omitempty"` - Environment map[string]string `json:",omitempty"` - EmulateConsole bool `json:",omitempty"` - CreateStdInPipe bool `json:",omitempty"` - CreateStdOutPipe bool `json:",omitempty"` - CreateStdErrPipe bool `json:",omitempty"` - ConsoleSize [2]uint `json:",omitempty"` - CreateInUtilityVm bool `json:",omitempty"` // Used by Linux Containers on Windows - OCISpecification *json.RawMessage `json:",omitempty"` // Used by Linux Containers on Windows -} - -type Layer struct { - ID string - Path string -} - -type MappedDir struct { - HostPath string - ContainerPath string - ReadOnly bool - BandwidthMaximum uint64 - IOPSMaximum uint64 - CreateInUtilityVM bool - // LinuxMetadata - Support added in 1803/RS4+. - LinuxMetadata bool `json:",omitempty"` -} - -type MappedPipe struct { - HostPath string - ContainerPipeName string -} - -type HvRuntime struct { - ImagePath string `json:",omitempty"` - SkipTemplate bool `json:",omitempty"` - LinuxInitrdFile string `json:",omitempty"` // File under ImagePath on host containing an initrd image for starting a Linux utility VM - LinuxKernelFile string `json:",omitempty"` // File under ImagePath on host containing a kernel for starting a Linux utility VM - LinuxBootParameters string `json:",omitempty"` // Additional boot parameters for starting a Linux Utility VM in initrd mode - BootSource string `json:",omitempty"` // "Vhd" for Linux Utility VM booting from VHD - WritableBootSource bool `json:",omitempty"` // Linux Utility VM booting from VHD -} - -type MappedVirtualDisk struct { - HostPath string `json:",omitempty"` // Path to VHD on the host - ContainerPath string // Platform-specific mount point path in the container - CreateInUtilityVM bool `json:",omitempty"` - ReadOnly bool `json:",omitempty"` - Cache string `json:",omitempty"` // "" (Unspecified); "Disabled"; "Enabled"; "Private"; "PrivateAllowSharing" - AttachOnly bool `json:",omitempty"` -} - -// AssignedDevice represents a device that has been directly assigned to a container -// -// NOTE: Support added in RS5 -type AssignedDevice struct { - // InterfaceClassGUID of the device to assign to container. - InterfaceClassGUID string `json:"InterfaceClassGuid,omitempty"` -} - -// ContainerConfig is used as both the input of CreateContainer -// and to convert the parameters to JSON for passing onto the HCS -type ContainerConfig struct { - SystemType string // HCS requires this to be hard-coded to "Container" - Name string // Name of the container. We use the docker ID. - Owner string `json:",omitempty"` // The management platform that created this container - VolumePath string `json:",omitempty"` // Windows volume path for scratch space. Used by Windows Server Containers only. Format \\?\\Volume{GUID} - IgnoreFlushesDuringBoot bool `json:",omitempty"` // Optimization hint for container startup in Windows - LayerFolderPath string `json:",omitempty"` // Where the layer folders are located. Used by Windows Server Containers only. Format %root%\windowsfilter\containerID - Layers []Layer // List of storage layers. Required for Windows Server and Hyper-V Containers. Format ID=GUID;Path=%root%\windowsfilter\layerID - Credentials string `json:",omitempty"` // Credentials information - ProcessorCount uint32 `json:",omitempty"` // Number of processors to assign to the container. - ProcessorWeight uint64 `json:",omitempty"` // CPU shares (relative weight to other containers with cpu shares). Range is from 1 to 10000. A value of 0 results in default shares. - ProcessorMaximum int64 `json:",omitempty"` // Specifies the portion of processor cycles that this container can use as a percentage times 100. Range is from 1 to 10000. A value of 0 results in no limit. - StorageIOPSMaximum uint64 `json:",omitempty"` // Maximum Storage IOPS - StorageBandwidthMaximum uint64 `json:",omitempty"` // Maximum Storage Bandwidth in bytes per second - StorageSandboxSize uint64 `json:",omitempty"` // Size in bytes that the container system drive should be expanded to if smaller - MemoryMaximumInMB int64 `json:",omitempty"` // Maximum memory available to the container in Megabytes - HostName string `json:",omitempty"` // Hostname - MappedDirectories []MappedDir `json:",omitempty"` // List of mapped directories (volumes/mounts) - MappedPipes []MappedPipe `json:",omitempty"` // List of mapped Windows named pipes - HvPartition bool // True if it a Hyper-V Container - NetworkSharedContainerName string `json:",omitempty"` // Name (ID) of the container that we will share the network stack with. - EndpointList []string `json:",omitempty"` // List of networking endpoints to be attached to container - HvRuntime *HvRuntime `json:",omitempty"` // Hyper-V container settings. Used by Hyper-V containers only. Format ImagePath=%root%\BaseLayerID\UtilityVM - Servicing bool `json:",omitempty"` // True if this container is for servicing - AllowUnqualifiedDNSQuery bool `json:",omitempty"` // True to allow unqualified DNS name resolution - DNSSearchList string `json:",omitempty"` // Comma seperated list of DNS suffixes to use for name resolution - ContainerType string `json:",omitempty"` // "Linux" for Linux containers on Windows. Omitted otherwise. - TerminateOnLastHandleClosed bool `json:",omitempty"` // Should HCS terminate the container once all handles have been closed - MappedVirtualDisks []MappedVirtualDisk `json:",omitempty"` // Array of virtual disks to mount at start - AssignedDevices []AssignedDevice `json:",omitempty"` // Array of devices to assign. NOTE: Support added in RS5 -} - -type ComputeSystemQuery struct { - IDs []string `json:"Ids,omitempty"` - Types []string `json:",omitempty"` - Names []string `json:",omitempty"` - Owners []string `json:",omitempty"` -} - -type PropertyType string - -const ( - PropertyTypeStatistics PropertyType = "Statistics" // V1 and V2 - PropertyTypeProcessList PropertyType = "ProcessList" // V1 and V2 - PropertyTypeMappedVirtualDisk PropertyType = "MappedVirtualDisk" // Not supported in V2 schema call - PropertyTypeGuestConnection PropertyType = "GuestConnection" // V1 and V2. Nil return from HCS before RS5 -) - -type PropertyQuery struct { - PropertyTypes []PropertyType `json:",omitempty"` -} - -// ContainerProperties holds the properties for a container and the processes running in that container -type ContainerProperties struct { - ID string `json:"Id"` - State string - Name string - SystemType string - RuntimeOSType string `json:"RuntimeOsType,omitempty"` - Owner string - SiloGUID string `json:"SiloGuid,omitempty"` - RuntimeID guid.GUID `json:"RuntimeId,omitempty"` - IsRuntimeTemplate bool `json:",omitempty"` - RuntimeImagePath string `json:",omitempty"` - Stopped bool `json:",omitempty"` - ExitType string `json:",omitempty"` - AreUpdatesPending bool `json:",omitempty"` - ObRoot string `json:",omitempty"` - Statistics Statistics `json:",omitempty"` - ProcessList []ProcessListItem `json:",omitempty"` - MappedVirtualDiskControllers map[int]MappedVirtualDiskController `json:",omitempty"` - GuestConnectionInfo GuestConnectionInfo `json:",omitempty"` -} - -// MemoryStats holds the memory statistics for a container -type MemoryStats struct { - UsageCommitBytes uint64 `json:"MemoryUsageCommitBytes,omitempty"` - UsageCommitPeakBytes uint64 `json:"MemoryUsageCommitPeakBytes,omitempty"` - UsagePrivateWorkingSetBytes uint64 `json:"MemoryUsagePrivateWorkingSetBytes,omitempty"` -} - -// ProcessorStats holds the processor statistics for a container -type ProcessorStats struct { - TotalRuntime100ns uint64 `json:",omitempty"` - RuntimeUser100ns uint64 `json:",omitempty"` - RuntimeKernel100ns uint64 `json:",omitempty"` -} - -// StorageStats holds the storage statistics for a container -type StorageStats struct { - ReadCountNormalized uint64 `json:",omitempty"` - ReadSizeBytes uint64 `json:",omitempty"` - WriteCountNormalized uint64 `json:",omitempty"` - WriteSizeBytes uint64 `json:",omitempty"` -} - -// NetworkStats holds the network statistics for a container -type NetworkStats struct { - BytesReceived uint64 `json:",omitempty"` - BytesSent uint64 `json:",omitempty"` - PacketsReceived uint64 `json:",omitempty"` - PacketsSent uint64 `json:",omitempty"` - DroppedPacketsIncoming uint64 `json:",omitempty"` - DroppedPacketsOutgoing uint64 `json:",omitempty"` - EndpointId string `json:",omitempty"` - InstanceId string `json:",omitempty"` -} - -// Statistics is the structure returned by a statistics call on a container -type Statistics struct { - Timestamp time.Time `json:",omitempty"` - ContainerStartTime time.Time `json:",omitempty"` - Uptime100ns uint64 `json:",omitempty"` - Memory MemoryStats `json:",omitempty"` - Processor ProcessorStats `json:",omitempty"` - Storage StorageStats `json:",omitempty"` - Network []NetworkStats `json:",omitempty"` -} - -// ProcessList is the structure of an item returned by a ProcessList call on a container -type ProcessListItem struct { - CreateTimestamp time.Time `json:",omitempty"` - ImageName string `json:",omitempty"` - KernelTime100ns uint64 `json:",omitempty"` - MemoryCommitBytes uint64 `json:",omitempty"` - MemoryWorkingSetPrivateBytes uint64 `json:",omitempty"` - MemoryWorkingSetSharedBytes uint64 `json:",omitempty"` - ProcessId uint32 `json:",omitempty"` - UserTime100ns uint64 `json:",omitempty"` -} - -// MappedVirtualDiskController is the structure of an item returned by a MappedVirtualDiskList call on a container -type MappedVirtualDiskController struct { - MappedVirtualDisks map[int]MappedVirtualDisk `json:",omitempty"` -} - -// GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM -type GuestDefinedCapabilities struct { - NamespaceAddRequestSupported bool `json:",omitempty"` - SignalProcessSupported bool `json:",omitempty"` - DumpStacksSupported bool `json:",omitempty"` - DeleteContainerStateSupported bool `json:",omitempty"` - UpdateContainerSupported bool `json:",omitempty"` -} - -// GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM -type GuestConnectionInfo struct { - SupportedSchemaVersions []hcsschema.Version `json:",omitempty"` - ProtocolVersion uint32 `json:",omitempty"` - GuestDefinedCapabilities GuestDefinedCapabilities `json:",omitempty"` -} - -// Type of Request Support in ModifySystem -type RequestType string - -// Type of Resource Support in ModifySystem -type ResourceType string - -// RequestType const -const ( - Add RequestType = "Add" - Remove RequestType = "Remove" - Network ResourceType = "Network" -) - -// ResourceModificationRequestResponse is the structure used to send request to the container to modify the system -// Supported resource types are Network and Request Types are Add/Remove -type ResourceModificationRequestResponse struct { - Resource ResourceType `json:"ResourceType"` - Data interface{} `json:"Settings"` - Request RequestType `json:"RequestType,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/attachment.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/attachment.go deleted file mode 100644 index 70884aad75..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/attachment.go +++ /dev/null @@ -1,36 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Attachment struct { - Type_ string `json:"Type,omitempty"` - - Path string `json:"Path,omitempty"` - - IgnoreFlushes bool `json:"IgnoreFlushes,omitempty"` - - CachingMode string `json:"CachingMode,omitempty"` - - NoWriteHardening bool `json:"NoWriteHardening,omitempty"` - - DisableExpansionOptimization bool `json:"DisableExpansionOptimization,omitempty"` - - IgnoreRelativeLocator bool `json:"IgnoreRelativeLocator,omitempty"` - - CaptureIoAttributionContext bool `json:"CaptureIoAttributionContext,omitempty"` - - ReadOnly bool `json:"ReadOnly,omitempty"` - - SupportCompressedVolumes bool `json:"SupportCompressedVolumes,omitempty"` - - AlwaysAllowSparseFiles bool `json:"AlwaysAllowSparseFiles,omitempty"` - - ExtensibleVirtualDiskType string `json:"ExtensibleVirtualDiskType,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/battery.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/battery.go deleted file mode 100644 index ecbbed4c23..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/battery.go +++ /dev/null @@ -1,13 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Battery struct { -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cache_query_stats_response.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cache_query_stats_response.go deleted file mode 100644 index c1ea3953b5..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cache_query_stats_response.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type CacheQueryStatsResponse struct { - L3OccupancyBytes int32 `json:"L3OccupancyBytes,omitempty"` - - L3TotalBwBytes int32 `json:"L3TotalBwBytes,omitempty"` - - L3LocalBwBytes int32 `json:"L3LocalBwBytes,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/chipset.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/chipset.go deleted file mode 100644 index ca75277a3f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/chipset.go +++ /dev/null @@ -1,27 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Chipset struct { - Uefi *Uefi `json:"Uefi,omitempty"` - - IsNumLockDisabled bool `json:"IsNumLockDisabled,omitempty"` - - BaseBoardSerialNumber string `json:"BaseBoardSerialNumber,omitempty"` - - ChassisSerialNumber string `json:"ChassisSerialNumber,omitempty"` - - ChassisAssetTag string `json:"ChassisAssetTag,omitempty"` - - UseUtc bool `json:"UseUtc,omitempty"` - - // LinuxKernelDirect - Added in v2.2 Builds >=181117 - LinuxKernelDirect *LinuxKernelDirect `json:"LinuxKernelDirect,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/close_handle.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/close_handle.go deleted file mode 100644 index b4f9c315b0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/close_handle.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type CloseHandle struct { - Handle string `json:"Handle,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go deleted file mode 100644 index 8bf8cab60e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// ComPort specifies the named pipe that will be used for the port, with empty string indicating a disconnected port. -type ComPort struct { - NamedPipe string `json:"NamedPipe,omitempty"` - - OptimizeForDebugger bool `json:"OptimizeForDebugger,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/compute_system.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/compute_system.go deleted file mode 100644 index 10cea67e04..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/compute_system.go +++ /dev/null @@ -1,26 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ComputeSystem struct { - Owner string `json:"Owner,omitempty"` - - SchemaVersion *Version `json:"SchemaVersion,omitempty"` - - HostingSystemId string `json:"HostingSystemId,omitempty"` - - HostedSystem interface{} `json:"HostedSystem,omitempty"` - - Container *Container `json:"Container,omitempty"` - - VirtualMachine *VirtualMachine `json:"VirtualMachine,omitempty"` - - ShouldTerminateOnLastHandleClosed bool `json:"ShouldTerminateOnLastHandleClosed,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/configuration.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/configuration.go deleted file mode 100644 index 1d5dfe68ad..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/configuration.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -import ( - "net/http" -) - -// contextKeys are used to identify the type of value in the context. -// Since these are string, it is possible to get a short description of the -// context key for logging and debugging using key.String(). - -type contextKey string - -func (c contextKey) String() string { - return "auth " + string(c) -} - -var ( - // ContextOAuth2 takes a oauth2.TokenSource as authentication for the request. - ContextOAuth2 = contextKey("token") - - // ContextBasicAuth takes BasicAuth as authentication for the request. - ContextBasicAuth = contextKey("basic") - - // ContextAccessToken takes a string oauth2 access token as authentication for the request. - ContextAccessToken = contextKey("accesstoken") - - // ContextAPIKey takes an APIKey as authentication for the request - ContextAPIKey = contextKey("apikey") -) - -// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth -type BasicAuth struct { - UserName string `json:"userName,omitempty"` - Password string `json:"password,omitempty"` -} - -// APIKey provides API key based authentication to a request passed via context using ContextAPIKey -type APIKey struct { - Key string - Prefix string -} - -type Configuration struct { - BasePath string `json:"basePath,omitempty"` - Host string `json:"host,omitempty"` - Scheme string `json:"scheme,omitempty"` - DefaultHeader map[string]string `json:"defaultHeader,omitempty"` - UserAgent string `json:"userAgent,omitempty"` - HTTPClient *http.Client -} - -func NewConfiguration() *Configuration { - cfg := &Configuration{ - BasePath: "https://localhost", - DefaultHeader: make(map[string]string), - UserAgent: "Swagger-Codegen/2.1.0/go", - } - return cfg -} - -func (c *Configuration) AddDefaultHeader(key string, value string) { - c.DefaultHeader[key] = value -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/console_size.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/console_size.go deleted file mode 100644 index 68aa04a573..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/console_size.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ConsoleSize struct { - Height int32 `json:"Height,omitempty"` - - Width int32 `json:"Width,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container.go deleted file mode 100644 index 39a54432c0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container.go +++ /dev/null @@ -1,36 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Container struct { - GuestOs *GuestOs `json:"GuestOs,omitempty"` - - Storage *Storage `json:"Storage,omitempty"` - - MappedDirectories []MappedDirectory `json:"MappedDirectories,omitempty"` - - MappedPipes []MappedPipe `json:"MappedPipes,omitempty"` - - Memory *Memory `json:"Memory,omitempty"` - - Processor *Processor `json:"Processor,omitempty"` - - Networking *Networking `json:"Networking,omitempty"` - - HvSocket *HvSocket `json:"HvSocket,omitempty"` - - ContainerCredentialGuard *ContainerCredentialGuardState `json:"ContainerCredentialGuard,omitempty"` - - RegistryChanges *RegistryChanges `json:"RegistryChanges,omitempty"` - - AssignedDevices []Device `json:"AssignedDevices,omitempty"` - - AdditionalDeviceNamespace *ContainerDefinitionDevice `json:"AdditionalDeviceNamespace,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_add_instance_request.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_add_instance_request.go deleted file mode 100644 index 495c6ebc8f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_add_instance_request.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardAddInstanceRequest struct { - Id string `json:"Id,omitempty"` - CredentialSpec string `json:"CredentialSpec,omitempty"` - Transport string `json:"Transport,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_hv_socket_service_config.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_hv_socket_service_config.go deleted file mode 100644 index 1ed4c008f2..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_hv_socket_service_config.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardHvSocketServiceConfig struct { - ServiceId string `json:"ServiceId,omitempty"` - ServiceConfig *HvSocketServiceConfig `json:"ServiceConfig,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_instance.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_instance.go deleted file mode 100644 index d7ebd0fcca..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_instance.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardInstance struct { - Id string `json:"Id,omitempty"` - CredentialGuard *ContainerCredentialGuardState `json:"CredentialGuard,omitempty"` - HvSocketConfig *ContainerCredentialGuardHvSocketServiceConfig `json:"HvSocketConfig,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_modify_operation.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_modify_operation.go deleted file mode 100644 index 71005b090b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_modify_operation.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardModifyOperation string - -const ( - AddInstance ContainerCredentialGuardModifyOperation = "AddInstance" - RemoveInstance ContainerCredentialGuardModifyOperation = "RemoveInstance" -) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_operation_request.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_operation_request.go deleted file mode 100644 index 952cda4965..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_operation_request.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardOperationRequest struct { - Operation ContainerCredentialGuardModifyOperation `json:"Operation,omitempty"` - OperationDetails interface{} `json:"OperationDetails,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_remove_instance_request.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_remove_instance_request.go deleted file mode 100644 index 32e5a3beed..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_remove_instance_request.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardRemoveInstanceRequest struct { - Id string `json:"Id,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_state.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_state.go deleted file mode 100644 index 0f8f644379..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_state.go +++ /dev/null @@ -1,25 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardState struct { - - // Authentication cookie for calls to a Container Credential Guard instance. - Cookie string `json:"Cookie,omitempty"` - - // Name of the RPC endpoint of the Container Credential Guard instance. - RpcEndpoint string `json:"RpcEndpoint,omitempty"` - - // Transport used for the configured Container Credential Guard instance. - Transport string `json:"Transport,omitempty"` - - // Credential spec used for the configured Container Credential Guard instance. - CredentialSpec string `json:"CredentialSpec,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_system_info.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_system_info.go deleted file mode 100644 index ea306fa21a..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_system_info.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerCredentialGuardSystemInfo struct { - Instances []ContainerCredentialGuardInstance `json:"Instances,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go deleted file mode 100644 index 1fd7ca5d56..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go +++ /dev/null @@ -1,25 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// memory usage as viewed from within the container -type ContainerMemoryInformation struct { - TotalPhysicalBytes int32 `json:"TotalPhysicalBytes,omitempty"` - - TotalUsage int32 `json:"TotalUsage,omitempty"` - - CommittedBytes int32 `json:"CommittedBytes,omitempty"` - - SharedCommittedBytes int32 `json:"SharedCommittedBytes,omitempty"` - - CommitLimitBytes int32 `json:"CommitLimitBytes,omitempty"` - - PeakCommitmentBytes int32 `json:"PeakCommitmentBytes,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group.go deleted file mode 100644 index 90332a5190..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// CPU groups allow Hyper-V administrators to better manage and allocate the host's CPU resources across guest virtual machines -type CpuGroup struct { - Id string `json:"Id,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_affinity.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_affinity.go deleted file mode 100644 index 8794961bf5..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_affinity.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type CpuGroupAffinity struct { - LogicalProcessorCount int32 `json:"LogicalProcessorCount,omitempty"` - LogicalProcessors []int32 `json:"LogicalProcessors,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_config.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_config.go deleted file mode 100644 index 0be0475d41..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_config.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type CpuGroupConfig struct { - GroupId string `json:"GroupId,omitempty"` - Affinity *CpuGroupAffinity `json:"Affinity,omitempty"` - GroupProperties []CpuGroupProperty `json:"GroupProperties,omitempty"` - // Hypervisor CPU group IDs exposed to clients - HypervisorGroupId uint64 `json:"HypervisorGroupId,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_configurations.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_configurations.go deleted file mode 100644 index 3ace0ccc3b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_configurations.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Structure used to return cpu groups for a Service property query -type CpuGroupConfigurations struct { - CpuGroups []CpuGroupConfig `json:"CpuGroups,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_operations.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_operations.go deleted file mode 100644 index 7d89780701..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_operations.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type CPUGroupOperation string - -const ( - CreateGroup CPUGroupOperation = "CreateGroup" - DeleteGroup CPUGroupOperation = "DeleteGroup" - SetProperty CPUGroupOperation = "SetProperty" -) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go deleted file mode 100644 index bbad6a2c45..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type CpuGroupProperty struct { - PropertyCode uint32 `json:"PropertyCode,omitempty"` - PropertyValue uint32 `json:"PropertyValue,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/create_group_operation.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/create_group_operation.go deleted file mode 100644 index 91a8278fe3..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/create_group_operation.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Create group operation settings -type CreateGroupOperation struct { - GroupId string `json:"GroupId,omitempty"` - LogicalProcessorCount uint32 `json:"LogicalProcessorCount,omitempty"` - LogicalProcessors []uint32 `json:"LogicalProcessors,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/delete_group_operation.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/delete_group_operation.go deleted file mode 100644 index 134bd98817..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/delete_group_operation.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Delete group operation settings -type DeleteGroupOperation struct { - GroupId string `json:"GroupId,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/device.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/device.go deleted file mode 100644 index 31c4538aff..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/device.go +++ /dev/null @@ -1,27 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type DeviceType string - -const ( - ClassGUID DeviceType = "ClassGuid" - DeviceInstanceID DeviceType = "DeviceInstance" - GPUMirror DeviceType = "GpuMirror" -) - -type Device struct { - // The type of device to assign to the container. - Type DeviceType `json:"Type,omitempty"` - // The interface class guid of the device interfaces to assign to the container. Only used when Type is ClassGuid. - InterfaceClassGuid string `json:"InterfaceClassGuid,omitempty"` - // The location path of the device to assign to the container. Only used when Type is DeviceInstanceID. - LocationPath string `json:"LocationPath,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/devices.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/devices.go deleted file mode 100644 index e985d96d22..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/devices.go +++ /dev/null @@ -1,46 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Devices struct { - ComPorts map[string]ComPort `json:"ComPorts,omitempty"` - - Scsi map[string]Scsi `json:"Scsi,omitempty"` - - VirtualPMem *VirtualPMemController `json:"VirtualPMem,omitempty"` - - NetworkAdapters map[string]NetworkAdapter `json:"NetworkAdapters,omitempty"` - - VideoMonitor *VideoMonitor `json:"VideoMonitor,omitempty"` - - Keyboard *Keyboard `json:"Keyboard,omitempty"` - - Mouse *Mouse `json:"Mouse,omitempty"` - - HvSocket *HvSocket2 `json:"HvSocket,omitempty"` - - EnhancedModeVideo *EnhancedModeVideo `json:"EnhancedModeVideo,omitempty"` - - GuestCrashReporting *GuestCrashReporting `json:"GuestCrashReporting,omitempty"` - - VirtualSmb *VirtualSmb `json:"VirtualSmb,omitempty"` - - Plan9 *Plan9 `json:"Plan9,omitempty"` - - Battery *Battery `json:"Battery,omitempty"` - - FlexibleIov map[string]FlexibleIoDevice `json:"FlexibleIov,omitempty"` - - SharedMemory *SharedMemoryConfiguration `json:"SharedMemory,omitempty"` - - // TODO: This is pre-release support in schema 2.3. Need to add build number - // docs when a public build with this is out. - VirtualPci map[string]VirtualPciDevice `json:",omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/enhanced_mode_video.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/enhanced_mode_video.go deleted file mode 100644 index 85450c41e1..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/enhanced_mode_video.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type EnhancedModeVideo struct { - ConnectionOptions *RdpConnectionOptions `json:"ConnectionOptions,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/flexible_io_device.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/flexible_io_device.go deleted file mode 100644 index fe86cab655..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/flexible_io_device.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type FlexibleIoDevice struct { - EmulatorId string `json:"EmulatorId,omitempty"` - - HostingModel string `json:"HostingModel,omitempty"` - - Configuration []string `json:"Configuration,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection.go deleted file mode 100644 index 7db29495b3..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection.go +++ /dev/null @@ -1,19 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type GuestConnection struct { - - // Use Vsock rather than Hyper-V sockets to communicate with the guest service. - UseVsock bool `json:"UseVsock,omitempty"` - - // Don't disconnect the guest connection when pausing the virtual machine. - UseConnectedSuspend bool `json:"UseConnectedSuspend,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go deleted file mode 100644 index 8a369bab71..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go +++ /dev/null @@ -1,21 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Information about the guest. -type GuestConnectionInfo struct { - - // Each schema version x.y stands for the range of versions a.b where a==x and b<=y. This list comes from the SupportedSchemaVersions field in GcsCapabilities. - SupportedSchemaVersions []Version `json:"SupportedSchemaVersions,omitempty"` - - ProtocolVersion int32 `json:"ProtocolVersion,omitempty"` - - GuestDefinedCapabilities *interface{} `json:"GuestDefinedCapabilities,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_crash_reporting.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_crash_reporting.go deleted file mode 100644 index af82800483..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_crash_reporting.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type GuestCrashReporting struct { - WindowsCrashSettings *WindowsCrashReporting `json:"WindowsCrashSettings,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_os.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_os.go deleted file mode 100644 index 8838519a39..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_os.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type GuestOs struct { - HostName string `json:"HostName,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go deleted file mode 100644 index ef1eec8865..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go +++ /dev/null @@ -1,22 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type GuestState struct { - - // The path to an existing file uses for persistent guest state storage. An empty string indicates the system should initialize new transient, in-memory guest state. - GuestStateFilePath string `json:"GuestStateFilePath,omitempty"` - - // The path to an existing file for persistent runtime state storage. An empty string indicates the system should initialize new transient, in-memory runtime state. - RuntimeStateFilePath string `json:"RuntimeStateFilePath,omitempty"` - - // If true, the guest state and runtime state files will be used as templates to populate transient, in-memory state instead of using the files as persistent backing store. - ForceTransientState bool `json:"ForceTransientState,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/host_processor_modify_request.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/host_processor_modify_request.go deleted file mode 100644 index 2238ce5306..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/host_processor_modify_request.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Structure used to request a service processor modification -type HostProcessorModificationRequest struct { - Operation CPUGroupOperation `json:"Operation,omitempty"` - OperationDetails interface{} `json:"OperationDetails,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hosted_system.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hosted_system.go deleted file mode 100644 index ea3084bca7..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hosted_system.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type HostedSystem struct { - SchemaVersion *Version `json:"SchemaVersion,omitempty"` - - Container *Container `json:"Container,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket.go deleted file mode 100644 index 23b2ee9e7d..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type HvSocket struct { - Config *HvSocketSystemConfig `json:"Config,omitempty"` - - EnablePowerShellDirect bool `json:"EnablePowerShellDirect,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go deleted file mode 100644 index a017691f02..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// HvSocket configuration for a VM -type HvSocket2 struct { - HvSocketConfig *HvSocketSystemConfig `json:"HvSocketConfig,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go deleted file mode 100644 index 84c11b93ee..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// This class defines address settings applied to a VM -// by the GCS every time a VM starts or restores. -type HvSocketAddress struct { - LocalAddress string `json:"LocalAddress,omitempty"` - ParentAddress string `json:"ParentAddress,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_service_config.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_service_config.go deleted file mode 100644 index ecd9f7fbac..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_service_config.go +++ /dev/null @@ -1,28 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type HvSocketServiceConfig struct { - - // SDDL string that HvSocket will check before allowing a host process to bind to this specific service. If not specified, defaults to the system DefaultBindSecurityDescriptor, defined in HvSocketSystemWpConfig in V1. - BindSecurityDescriptor string `json:"BindSecurityDescriptor,omitempty"` - - // SDDL string that HvSocket will check before allowing a host process to connect to this specific service. If not specified, defaults to the system DefaultConnectSecurityDescriptor, defined in HvSocketSystemWpConfig in V1. - ConnectSecurityDescriptor string `json:"ConnectSecurityDescriptor,omitempty"` - - // If true, HvSocket will process wildcard binds for this service/system combination. Wildcard binds are secured in the registry at SOFTWARE/Microsoft/Windows NT/CurrentVersion/Virtualization/HvSocket/WildcardDescriptors - AllowWildcardBinds bool `json:"AllowWildcardBinds,omitempty"` - - // Disabled controls whether the HvSocket service is accepting connection requests. - // This set to true will make the service refuse all incoming connections as well as cancel - // any connections already established. The service itself will still be active however - // and can be re-enabled at a future time. - Disabled bool `json:"Disabled,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go deleted file mode 100644 index 69f4f9d39b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go +++ /dev/null @@ -1,22 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// This is the HCS Schema version of the HvSocket configuration. The VMWP version is located in Config.Devices.IC in V1. -type HvSocketSystemConfig struct { - - // SDDL string that HvSocket will check before allowing a host process to bind to an unlisted service for this specific container/VM (not wildcard binds). - DefaultBindSecurityDescriptor string `json:"DefaultBindSecurityDescriptor,omitempty"` - - // SDDL string that HvSocket will check before allowing a host process to connect to an unlisted service in the VM/container. - DefaultConnectSecurityDescriptor string `json:"DefaultConnectSecurityDescriptor,omitempty"` - - ServiceTable map[string]HvSocketServiceConfig `json:"ServiceTable,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/interrupt_moderation_mode.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/interrupt_moderation_mode.go deleted file mode 100644 index a614d63bd7..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/interrupt_moderation_mode.go +++ /dev/null @@ -1,42 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type InterruptModerationName string - -// The valid interrupt moderation modes for I/O virtualization (IOV) offloading. -const ( - DefaultName InterruptModerationName = "Default" - AdaptiveName InterruptModerationName = "Adaptive" - OffName InterruptModerationName = "Off" - LowName InterruptModerationName = "Low" - MediumName InterruptModerationName = "Medium" - HighName InterruptModerationName = "High" -) - -type InterruptModerationValue uint32 - -const ( - DefaultValue InterruptModerationValue = iota - AdaptiveValue - OffValue - LowValue InterruptModerationValue = 100 - MediumValue InterruptModerationValue = 200 - HighValue InterruptModerationValue = 300 -) - -var InterruptModerationValueToName = map[InterruptModerationValue]InterruptModerationName{ - DefaultValue: DefaultName, - AdaptiveValue: AdaptiveName, - OffValue: OffName, - LowValue: LowName, - MediumValue: MediumName, - HighValue: HighName, -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/iov_settings.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/iov_settings.go deleted file mode 100644 index 2a55cc37cd..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/iov_settings.go +++ /dev/null @@ -1,22 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type IovSettings struct { - // The weight assigned to this port for I/O virtualization (IOV) offloading. - // Setting this to 0 disables IOV offloading. - OffloadWeight *uint32 `json:"OffloadWeight,omitempty"` - - // The number of queue pairs requested for this port for I/O virtualization (IOV) offloading. - QueuePairsRequested *uint32 `json:"QueuePairsRequested,omitempty"` - - // The interrupt moderation mode for I/O virtualization (IOV) offloading. - InterruptModeration *InterruptModerationName `json:"InterruptModeration,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/keyboard.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/keyboard.go deleted file mode 100644 index 3d3fa3b1c7..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/keyboard.go +++ /dev/null @@ -1,13 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Keyboard struct { -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go deleted file mode 100644 index 176c49d495..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go +++ /dev/null @@ -1,21 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Layer struct { - Id string `json:"Id,omitempty"` - - Path string `json:"Path,omitempty"` - - PathType string `json:"PathType,omitempty"` - - // Unspecified defaults to Enabled - Cache string `json:"Cache,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/linux_kernel_direct.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/linux_kernel_direct.go deleted file mode 100644 index 0ab6c280fc..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/linux_kernel_direct.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.2 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type LinuxKernelDirect struct { - KernelFilePath string `json:"KernelFilePath,omitempty"` - - InitRdPath string `json:"InitRdPath,omitempty"` - - KernelCmdLine string `json:"KernelCmdLine,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/logical_processor.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/logical_processor.go deleted file mode 100644 index 2e3aa5e175..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/logical_processor.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type LogicalProcessor struct { - LpIndex uint32 `json:"LpIndex,omitempty"` - NodeNumber uint8 `json:"NodeNumber,omitempty"` - PackageId uint32 `json:"PackageId,omitempty"` - CoreId uint32 `json:"CoreId,omitempty"` - RootVpIndex int32 `json:"RootVpIndex,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_directory.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_directory.go deleted file mode 100644 index 9b86a40457..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_directory.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type MappedDirectory struct { - HostPath string `json:"HostPath,omitempty"` - - HostPathType string `json:"HostPathType,omitempty"` - - ContainerPath string `json:"ContainerPath,omitempty"` - - ReadOnly bool `json:"ReadOnly,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_pipe.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_pipe.go deleted file mode 100644 index 208074e9a2..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_pipe.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type MappedPipe struct { - ContainerPipeName string `json:"ContainerPipeName,omitempty"` - - HostPath string `json:"HostPath,omitempty"` - - HostPathType string `json:"HostPathType,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory.go deleted file mode 100644 index 30749c6724..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Memory struct { - SizeInMB uint64 `json:"SizeInMB,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_2.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_2.go deleted file mode 100644 index 71224c75b9..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_2.go +++ /dev/null @@ -1,49 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Memory2 struct { - SizeInMB uint64 `json:"SizeInMB,omitempty"` - - AllowOvercommit bool `json:"AllowOvercommit,omitempty"` - - EnableHotHint bool `json:"EnableHotHint,omitempty"` - - EnableColdHint bool `json:"EnableColdHint,omitempty"` - - EnableEpf bool `json:"EnableEpf,omitempty"` - - // EnableDeferredCommit is private in the schema. If regenerated need to add back. - EnableDeferredCommit bool `json:"EnableDeferredCommit,omitempty"` - - // EnableColdDiscardHint if enabled, then the memory cold discard hint feature is exposed - // to the VM, allowing it to trim non-zeroed pages from the working set (if supported by - // the guest operating system). - EnableColdDiscardHint bool `json:"EnableColdDiscardHint,omitempty"` - - // LowMmioGapInMB is the low MMIO region allocated below 4GB. - // - // TODO: This is pre-release support in schema 2.3. Need to add build number - // docs when a public build with this is out. - LowMMIOGapInMB uint64 `json:"LowMmioGapInMB,omitempty"` - - // HighMmioBaseInMB is the high MMIO region allocated above 4GB (base and - // size). - // - // TODO: This is pre-release support in schema 2.3. Need to add build number - // docs when a public build with this is out. - HighMMIOBaseInMB uint64 `json:"HighMmioBaseInMB,omitempty"` - - // HighMmioGapInMB is the high MMIO region. - // - // TODO: This is pre-release support in schema 2.3. Need to add build number - // docs when a public build with this is out. - HighMMIOGapInMB uint64 `json:"HighMmioGapInMB,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_information_for_vm.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_information_for_vm.go deleted file mode 100644 index 811779b04b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_information_for_vm.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type MemoryInformationForVm struct { - VirtualNodeCount uint32 `json:"VirtualNodeCount,omitempty"` - - VirtualMachineMemory *VmMemory `json:"VirtualMachineMemory,omitempty"` - - VirtualNodes []VirtualNodeInfo `json:"VirtualNodes,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go deleted file mode 100644 index 906ba597f9..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go +++ /dev/null @@ -1,19 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Memory runtime statistics -type MemoryStats struct { - MemoryUsageCommitBytes uint64 `json:"MemoryUsageCommitBytes,omitempty"` - - MemoryUsageCommitPeakBytes uint64 `json:"MemoryUsageCommitPeakBytes,omitempty"` - - MemoryUsagePrivateWorkingSetBytes uint64 `json:"MemoryUsagePrivateWorkingSetBytes,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_container_definition_device.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_container_definition_device.go deleted file mode 100644 index 8dbe40b3be..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_container_definition_device.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ContainerDefinitionDevice struct { - DeviceExtension []DeviceExtension `json:"device_extension,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_category.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_category.go deleted file mode 100644 index 8fe89f9274..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_category.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type DeviceCategory struct { - Name string `json:"name,omitempty"` - InterfaceClass []InterfaceClass `json:"interface_class,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_extension.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_extension.go deleted file mode 100644 index a62568d892..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_extension.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type DeviceExtension struct { - DeviceCategory *DeviceCategory `json:"device_category,omitempty"` - Namespace *DeviceExtensionNamespace `json:"namespace,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_instance.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_instance.go deleted file mode 100644 index a7410febd6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_instance.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type DeviceInstance struct { - Id string `json:"id,omitempty"` - LocationPath string `json:"location_path,omitempty"` - PortName string `json:"port_name,omitempty"` - InterfaceClass []InterfaceClass `json:"interface_class,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_namespace.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_namespace.go deleted file mode 100644 index 3553640647..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_namespace.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type DeviceNamespace struct { - RequiresDriverstore bool `json:"requires_driverstore,omitempty"` - DeviceCategory []DeviceCategory `json:"device_category,omitempty"` - DeviceInstance []DeviceInstance `json:"device_instance,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_interface_class.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_interface_class.go deleted file mode 100644 index 7be98b5410..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_interface_class.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type InterfaceClass struct { - Type_ string `json:"type,omitempty"` - Identifier string `json:"identifier,omitempty"` - Recurse bool `json:"recurse,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_namespace.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_namespace.go deleted file mode 100644 index 3ab9cf1ecf..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_namespace.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type DeviceExtensionNamespace struct { - Ob *ObjectNamespace `json:"ob,omitempty"` - Device *DeviceNamespace `json:"device,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_directory.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_directory.go deleted file mode 100644 index d2f51b3b53..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_directory.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ObjectDirectory struct { - Name string `json:"name,omitempty"` - Clonesd string `json:"clonesd,omitempty"` - Shadow string `json:"shadow,omitempty"` - Symlink []ObjectSymlink `json:"symlink,omitempty"` - Objdir []ObjectDirectory `json:"objdir,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_namespace.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_namespace.go deleted file mode 100644 index 47dfb55bfa..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_namespace.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ObjectNamespace struct { - Shadow string `json:"shadow,omitempty"` - Symlink []ObjectSymlink `json:"symlink,omitempty"` - Objdir []ObjectDirectory `json:"objdir,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_symlink.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_symlink.go deleted file mode 100644 index 8867ebe5f0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_symlink.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ObjectSymlink struct { - Name string `json:"name,omitempty"` - Path string `json:"path,omitempty"` - Scope string `json:"scope,omitempty"` - Pathtoclone string `json:"pathtoclone,omitempty"` - AccessMask int32 `json:"access_mask,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modification_request.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modification_request.go deleted file mode 100644 index 1384ed8882..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modification_request.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ModificationRequest struct { - PropertyType PropertyType `json:"PropertyType,omitempty"` - Settings interface{} `json:"Settings,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go deleted file mode 100644 index d29455a3e4..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ModifySettingRequest struct { - ResourcePath string `json:"ResourcePath,omitempty"` - - RequestType string `json:"RequestType,omitempty"` - - Settings interface{} `json:"Settings,omitempty"` // NOTE: Swagger generated as *interface{}. Locally updated - - GuestRequest interface{} `json:"GuestRequest,omitempty"` // NOTE: Swagger generated as *interface{}. Locally updated -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mouse.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mouse.go deleted file mode 100644 index ccf8b938f3..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mouse.go +++ /dev/null @@ -1,13 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Mouse struct { -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/network_adapter.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/network_adapter.go deleted file mode 100644 index 7408abd317..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/network_adapter.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type NetworkAdapter struct { - EndpointId string `json:"EndpointId,omitempty"` - MacAddress string `json:"MacAddress,omitempty"` - // The I/O virtualization (IOV) offloading configuration. - IovSettings *IovSettings `json:"IovSettings,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/networking.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/networking.go deleted file mode 100644 index e5ea187a29..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/networking.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Networking struct { - AllowUnqualifiedDnsQuery bool `json:"AllowUnqualifiedDnsQuery,omitempty"` - - DnsSearchList string `json:"DnsSearchList,omitempty"` - - NetworkSharedContainerName string `json:"NetworkSharedContainerName,omitempty"` - - // Guid in windows; string in linux - Namespace string `json:"Namespace,omitempty"` - - NetworkAdapters []string `json:"NetworkAdapters,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go deleted file mode 100644 index d96c9501f3..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Notification data that is indicated to components running in the Virtual Machine. -type PauseNotification struct { - Reason string `json:"Reason,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go deleted file mode 100644 index 21707a88eb..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Options for HcsPauseComputeSystem -type PauseOptions struct { - SuspensionLevel string `json:"SuspensionLevel,omitempty"` - - HostedNotification *PauseNotification `json:"HostedNotification,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9.go deleted file mode 100644 index 29d8c8012f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Plan9 struct { - Shares []Plan9Share `json:"Shares,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9_share.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9_share.go deleted file mode 100644 index 41f8fdea02..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9_share.go +++ /dev/null @@ -1,34 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Plan9Share struct { - Name string `json:"Name,omitempty"` - - // The name by which the guest operation system can access this share, via the aname parameter in the Plan9 protocol. - AccessName string `json:"AccessName,omitempty"` - - Path string `json:"Path,omitempty"` - - Port int32 `json:"Port,omitempty"` - - // Flags are marked private. Until they are exported correctly - // - // ReadOnly 0x00000001 - // LinuxMetadata 0x00000004 - // CaseSensitive 0x00000008 - Flags int32 `json:"Flags,omitempty"` - - ReadOnly bool `json:"ReadOnly,omitempty"` - - UseShareRootIdentity bool `json:"UseShareRootIdentity,omitempty"` - - AllowedFiles []string `json:"AllowedFiles,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go deleted file mode 100644 index e9a662dd59..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go +++ /dev/null @@ -1,33 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -import ( - "time" -) - -// Information about a process running in a container -type ProcessDetails struct { - ProcessId int32 `json:"ProcessId,omitempty"` - - ImageName string `json:"ImageName,omitempty"` - - CreateTimestamp time.Time `json:"CreateTimestamp,omitempty"` - - UserTime100ns int32 `json:"UserTime100ns,omitempty"` - - KernelTime100ns int32 `json:"KernelTime100ns,omitempty"` - - MemoryCommitBytes int32 `json:"MemoryCommitBytes,omitempty"` - - MemoryWorkingSetPrivateBytes int32 `json:"MemoryWorkingSetPrivateBytes,omitempty"` - - MemoryWorkingSetSharedBytes int32 `json:"MemoryWorkingSetSharedBytes,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_modify_request.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_modify_request.go deleted file mode 100644 index e4ed095c7b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_modify_request.go +++ /dev/null @@ -1,19 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Passed to HcsRpc_ModifyProcess -type ProcessModifyRequest struct { - Operation string `json:"Operation,omitempty"` - - ConsoleSize *ConsoleSize `json:"ConsoleSize,omitempty"` - - CloseHandle *CloseHandle `json:"CloseHandle,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_parameters.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_parameters.go deleted file mode 100644 index 82b0d0532b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_parameters.go +++ /dev/null @@ -1,46 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ProcessParameters struct { - ApplicationName string `json:"ApplicationName,omitempty"` - - CommandLine string `json:"CommandLine,omitempty"` - - // optional alternative to CommandLine, currently only supported by Linux GCS - CommandArgs []string `json:"CommandArgs,omitempty"` - - User string `json:"User,omitempty"` - - WorkingDirectory string `json:"WorkingDirectory,omitempty"` - - Environment map[string]string `json:"Environment,omitempty"` - - // if set, will run as low-privilege process - RestrictedToken bool `json:"RestrictedToken,omitempty"` - - // if set, ignore StdErrPipe - EmulateConsole bool `json:"EmulateConsole,omitempty"` - - CreateStdInPipe bool `json:"CreateStdInPipe,omitempty"` - - CreateStdOutPipe bool `json:"CreateStdOutPipe,omitempty"` - - CreateStdErrPipe bool `json:"CreateStdErrPipe,omitempty"` - - // height then width - ConsoleSize []int32 `json:"ConsoleSize,omitempty"` - - // if set, find an existing session for the user and create the process in it - UseExistingLogin bool `json:"UseExistingLogin,omitempty"` - - // if set, use the legacy console instead of conhost - UseLegacyConsole bool `json:"UseLegacyConsole,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_status.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_status.go deleted file mode 100644 index ad9a4fa9ad..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_status.go +++ /dev/null @@ -1,21 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Status of a process running in a container -type ProcessStatus struct { - ProcessId int32 `json:"ProcessId,omitempty"` - - Exited bool `json:"Exited,omitempty"` - - ExitCode int32 `json:"ExitCode,omitempty"` - - LastWaitResult int32 `json:"LastWaitResult,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor.go deleted file mode 100644 index bb24e88da1..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Processor struct { - Count int32 `json:"Count,omitempty"` - - Maximum int32 `json:"Maximum,omitempty"` - - Weight int32 `json:"Weight,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_2.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_2.go deleted file mode 100644 index c64f335ec7..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_2.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.5 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Processor2 struct { - Count int32 `json:"Count,omitempty"` - - Limit int32 `json:"Limit,omitempty"` - - Weight int32 `json:"Weight,omitempty"` - - ExposeVirtualizationExtensions bool `json:"ExposeVirtualizationExtensions,omitempty"` - - // An optional object that configures the CPU Group to which a Virtual Machine is going to bind to. - CpuGroup *CpuGroup `json:"CpuGroup,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go deleted file mode 100644 index 6157e25225..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go +++ /dev/null @@ -1,19 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// CPU runtime statistics -type ProcessorStats struct { - TotalRuntime100ns uint64 `json:"TotalRuntime100ns,omitempty"` - - RuntimeUser100ns uint64 `json:"RuntimeUser100ns,omitempty"` - - RuntimeKernel100ns uint64 `json:"RuntimeKernel100ns,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_topology.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_topology.go deleted file mode 100644 index 885156e77f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_topology.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type ProcessorTopology struct { - LogicalProcessorCount uint32 `json:"LogicalProcessorCount,omitempty"` - LogicalProcessors []LogicalProcessor `json:"LogicalProcessors,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/properties.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/properties.go deleted file mode 100644 index 17558cba0f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/properties.go +++ /dev/null @@ -1,54 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -import ( - v1 "github.com/containerd/cgroups/stats/v1" -) - -type Properties struct { - Id string `json:"Id,omitempty"` - - SystemType string `json:"SystemType,omitempty"` - - RuntimeOsType string `json:"RuntimeOsType,omitempty"` - - Name string `json:"Name,omitempty"` - - Owner string `json:"Owner,omitempty"` - - RuntimeId string `json:"RuntimeId,omitempty"` - - RuntimeTemplateId string `json:"RuntimeTemplateId,omitempty"` - - State string `json:"State,omitempty"` - - Stopped bool `json:"Stopped,omitempty"` - - ExitType string `json:"ExitType,omitempty"` - - Memory *MemoryInformationForVm `json:"Memory,omitempty"` - - Statistics *Statistics `json:"Statistics,omitempty"` - - ProcessList []ProcessDetails `json:"ProcessList,omitempty"` - - TerminateOnLastHandleClosed bool `json:"TerminateOnLastHandleClosed,omitempty"` - - HostingSystemId string `json:"HostingSystemId,omitempty"` - - SharedMemoryRegionInfo []SharedMemoryRegionInfo `json:"SharedMemoryRegionInfo,omitempty"` - - GuestConnectionInfo *GuestConnectionInfo `json:"GuestConnectionInfo,omitempty"` - - // Metrics is not part of the API for HCS but this is used for LCOW v2 to - // return the full cgroup metrics from the guest. - Metrics *v1.Metrics `json:"LCOWMetrics,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go deleted file mode 100644 index d6d80df131..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// By default the basic properties will be returned. This query provides a way to request specific properties. -type PropertyQuery struct { - PropertyTypes []PropertyType `json:"PropertyTypes,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_type.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_type.go deleted file mode 100644 index 98f2c96edb..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_type.go +++ /dev/null @@ -1,26 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type PropertyType string - -const ( - PTMemory PropertyType = "Memory" - PTGuestMemory PropertyType = "GuestMemory" - PTStatistics PropertyType = "Statistics" - PTProcessList PropertyType = "ProcessList" - PTTerminateOnLastHandleClosed PropertyType = "TerminateOnLastHandleClosed" - PTSharedMemoryRegion PropertyType = "SharedMemoryRegion" - PTContainerCredentialGuard PropertyType = "ContainerCredentialGuard" // This field is not generated by swagger. This was added manually. - PTGuestConnection PropertyType = "GuestConnection" - PTICHeartbeatStatus PropertyType = "ICHeartbeatStatus" - PTProcessorTopology PropertyType = "ProcessorTopology" - PTCPUGroup PropertyType = "CpuGroup" -) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/rdp_connection_options.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/rdp_connection_options.go deleted file mode 100644 index 8d5f5c1719..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/rdp_connection_options.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type RdpConnectionOptions struct { - AccessSids []string `json:"AccessSids,omitempty"` - - NamedPipe string `json:"NamedPipe,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_changes.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_changes.go deleted file mode 100644 index 006906f6e2..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_changes.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type RegistryChanges struct { - AddValues []RegistryValue `json:"AddValues,omitempty"` - - DeleteKeys []RegistryKey `json:"DeleteKeys,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go deleted file mode 100644 index 26fde99c74..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type RegistryKey struct { - Hive string `json:"Hive,omitempty"` - - Name string `json:"Name,omitempty"` - - Volatile bool `json:"Volatile,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go deleted file mode 100644 index 3f203176c3..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go +++ /dev/null @@ -1,30 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type RegistryValue struct { - Key *RegistryKey `json:"Key,omitempty"` - - Name string `json:"Name,omitempty"` - - Type_ string `json:"Type,omitempty"` - - // One and only one value type must be set. - StringValue string `json:"StringValue,omitempty"` - - BinaryValue string `json:"BinaryValue,omitempty"` - - DWordValue int32 `json:"DWordValue,omitempty"` - - QWordValue int32 `json:"QWordValue,omitempty"` - - // Only used if RegistryValueType is CustomType The data is in BinaryValue - CustomType int32 `json:"CustomType,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/restore_state.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/restore_state.go deleted file mode 100644 index 778ff58735..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/restore_state.go +++ /dev/null @@ -1,19 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type RestoreState struct { - - // The path to the save state file to restore the system from. - SaveStateFilePath string `json:"SaveStateFilePath,omitempty"` - - // The ID of the template system to clone this new system off of. An empty string indicates the system should not be cloned from a template. - TemplateSystemId string `json:"TemplateSystemId,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/save_options.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/save_options.go deleted file mode 100644 index e55fa1d98a..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/save_options.go +++ /dev/null @@ -1,19 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type SaveOptions struct { - - // The type of save operation to be performed. - SaveType string `json:"SaveType,omitempty"` - - // The path to the file that will container the saved state. - SaveStateFilePath string `json:"SaveStateFilePath,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/scsi.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/scsi.go deleted file mode 100644 index bf253a470b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/scsi.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Scsi struct { - - // Map of attachments, where the key is the integer LUN number on the controller. - Attachments map[string]Attachment `json:"Attachments,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/service_properties.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/service_properties.go deleted file mode 100644 index b8142ca6a6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/service_properties.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -import "encoding/json" - -type ServiceProperties struct { - // Changed Properties field to []json.RawMessage from []interface{} to avoid having to - // remarshal sp.Properties[n] and unmarshal into the type(s) we want. - Properties []json.RawMessage `json:"Properties,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_configuration.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_configuration.go deleted file mode 100644 index df9baa9219..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_configuration.go +++ /dev/null @@ -1,14 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type SharedMemoryConfiguration struct { - Regions []SharedMemoryRegion `json:"Regions,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region.go deleted file mode 100644 index 825b71865d..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region.go +++ /dev/null @@ -1,22 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type SharedMemoryRegion struct { - SectionName string `json:"SectionName,omitempty"` - - StartOffset int32 `json:"StartOffset,omitempty"` - - Length int32 `json:"Length,omitempty"` - - AllowGuestWrite bool `json:"AllowGuestWrite,omitempty"` - - HiddenFromGuest bool `json:"HiddenFromGuest,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region_info.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region_info.go deleted file mode 100644 index f67b08eb57..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region_info.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type SharedMemoryRegionInfo struct { - SectionName string `json:"SectionName,omitempty"` - - GuestPhysicalAddress int32 `json:"GuestPhysicalAddress,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go deleted file mode 100644 index 5eaf6a7f4a..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Silo job information -type SiloProperties struct { - Enabled bool `json:"Enabled,omitempty"` - - JobName string `json:"JobName,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go deleted file mode 100644 index ba7a6b3963..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go +++ /dev/null @@ -1,29 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -import ( - "time" -) - -// Runtime statistics for a container -type Statistics struct { - Timestamp time.Time `json:"Timestamp,omitempty"` - - ContainerStartTime time.Time `json:"ContainerStartTime,omitempty"` - - Uptime100ns uint64 `json:"Uptime100ns,omitempty"` - - Processor *ProcessorStats `json:"Processor,omitempty"` - - Memory *MemoryStats `json:"Memory,omitempty"` - - Storage *StorageStats `json:"Storage,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage.go deleted file mode 100644 index 2627af9132..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage.go +++ /dev/null @@ -1,21 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Storage struct { - - // List of layers that describe the parent hierarchy for a container's storage. These layers combined together, presented as a disposable and/or committable working storage, are used by the container to record all changes done to the parent layers. - Layers []Layer `json:"Layers,omitempty"` - - // Path that points to the scratch space of a container, where parent layers are combined together to present a new disposable and/or committable layer with the changes done during its runtime. - Path string `json:"Path,omitempty"` - - QoS *StorageQoS `json:"QoS,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_qo_s.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_qo_s.go deleted file mode 100644 index 9c5e6eb532..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_qo_s.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type StorageQoS struct { - IopsMaximum int32 `json:"IopsMaximum,omitempty"` - - BandwidthMaximum int32 `json:"BandwidthMaximum,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go deleted file mode 100644 index 4f042ffd93..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go +++ /dev/null @@ -1,21 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// Storage runtime statistics -type StorageStats struct { - ReadCountNormalized uint64 `json:"ReadCountNormalized,omitempty"` - - ReadSizeBytes uint64 `json:"ReadSizeBytes,omitempty"` - - WriteCountNormalized uint64 `json:"WriteCountNormalized,omitempty"` - - WriteSizeBytes uint64 `json:"WriteSizeBytes,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/topology.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/topology.go deleted file mode 100644 index 8348699403..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/topology.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Topology struct { - Memory *Memory2 `json:"Memory,omitempty"` - - Processor *Processor2 `json:"Processor,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go deleted file mode 100644 index 0e48ece500..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Uefi struct { - EnableDebugger bool `json:"EnableDebugger,omitempty"` - - SecureBootTemplateId string `json:"SecureBootTemplateId,omitempty"` - - BootThis *UefiBootEntry `json:"BootThis,omitempty"` - - Console string `json:"Console,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi_boot_entry.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi_boot_entry.go deleted file mode 100644 index 3ab409d825..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi_boot_entry.go +++ /dev/null @@ -1,22 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type UefiBootEntry struct { - DeviceType string `json:"DeviceType,omitempty"` - - DevicePath string `json:"DevicePath,omitempty"` - - DiskNumber int32 `json:"DiskNumber,omitempty"` - - OptionalData string `json:"OptionalData,omitempty"` - - VmbFsRootPath string `json:"VmbFsRootPath,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/version.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/version.go deleted file mode 100644 index 2abfccca31..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/version.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type Version struct { - Major int32 `json:"Major,omitempty"` - - Minor int32 `json:"Minor,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/video_monitor.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/video_monitor.go deleted file mode 100644 index ec5d0fb936..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/video_monitor.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VideoMonitor struct { - HorizontalResolution int32 `json:"HorizontalResolution,omitempty"` - - VerticalResolution int32 `json:"VerticalResolution,omitempty"` - - ConnectionOptions *RdpConnectionOptions `json:"ConnectionOptions,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go deleted file mode 100644 index 2d22b1bcb0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go +++ /dev/null @@ -1,32 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualMachine struct { - - // StopOnReset is private in the schema. If regenerated need to put back. - StopOnReset bool `json:"StopOnReset,omitempty"` - - Chipset *Chipset `json:"Chipset,omitempty"` - - ComputeTopology *Topology `json:"ComputeTopology,omitempty"` - - Devices *Devices `json:"Devices,omitempty"` - - GuestState *GuestState `json:"GuestState,omitempty"` - - RestoreState *RestoreState `json:"RestoreState,omitempty"` - - RegistryChanges *RegistryChanges `json:"RegistryChanges,omitempty"` - - StorageQoS *StorageQoS `json:"StorageQoS,omitempty"` - - GuestConnection *GuestConnection `json:"GuestConnection,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_node_info.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_node_info.go deleted file mode 100644 index 91a3c83d4f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_node_info.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualNodeInfo struct { - VirtualNodeIndex int32 `json:"VirtualNodeIndex,omitempty"` - - PhysicalNodeNumber int32 `json:"PhysicalNodeNumber,omitempty"` - - VirtualProcessorCount int32 `json:"VirtualProcessorCount,omitempty"` - - MemoryUsageInPages int32 `json:"MemoryUsageInPages,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_controller.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_controller.go deleted file mode 100644 index f5b7f3e38c..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_controller.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualPMemController struct { - Devices map[string]VirtualPMemDevice `json:"Devices,omitempty"` - - MaximumCount uint32 `json:"MaximumCount,omitempty"` - - MaximumSizeBytes uint64 `json:"MaximumSizeBytes,omitempty"` - - Backing string `json:"Backing,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_device.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_device.go deleted file mode 100644 index 70cf2d90de..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_device.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualPMemDevice struct { - HostPath string `json:"HostPath,omitempty"` - - ReadOnly bool `json:"ReadOnly,omitempty"` - - ImageFormat string `json:"ImageFormat,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_mapping.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_mapping.go deleted file mode 100644 index 9ef322f615..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_mapping.go +++ /dev/null @@ -1,15 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualPMemMapping struct { - HostPath string `json:"HostPath,omitempty"` - ImageFormat string `json:"ImageFormat,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_device.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_device.go deleted file mode 100644 index f5e05903c5..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_device.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.3 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// TODO: This is pre-release support in schema 2.3. Need to add build number -// docs when a public build with this is out. -type VirtualPciDevice struct { - Functions []VirtualPciFunction `json:",omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_function.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_function.go deleted file mode 100644 index cedb7d18bc..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_function.go +++ /dev/null @@ -1,18 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.3 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// TODO: This is pre-release support in schema 2.3. Need to add build number -// docs when a public build with this is out. -type VirtualPciFunction struct { - DeviceInstancePath string `json:",omitempty"` - - VirtualFunction uint16 `json:",omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb.go deleted file mode 100644 index 362df363e1..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualSmb struct { - Shares []VirtualSmbShare `json:"Shares,omitempty"` - - DirectFileMappingInMB int64 `json:"DirectFileMappingInMB,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share.go deleted file mode 100644 index 915e9b6386..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualSmbShare struct { - Name string `json:"Name,omitempty"` - - Path string `json:"Path,omitempty"` - - AllowedFiles []string `json:"AllowedFiles,omitempty"` - - Options *VirtualSmbShareOptions `json:"Options,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share_options.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share_options.go deleted file mode 100644 index 75196bd8c8..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share_options.go +++ /dev/null @@ -1,62 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VirtualSmbShareOptions struct { - ReadOnly bool `json:"ReadOnly,omitempty"` - - // convert exclusive access to shared read access - ShareRead bool `json:"ShareRead,omitempty"` - - // all opens will use cached I/O - CacheIo bool `json:"CacheIo,omitempty"` - - // disable oplock support - NoOplocks bool `json:"NoOplocks,omitempty"` - - // Acquire the backup privilege when attempting to open - TakeBackupPrivilege bool `json:"TakeBackupPrivilege,omitempty"` - - // Use the identity of the share root when opening - UseShareRootIdentity bool `json:"UseShareRootIdentity,omitempty"` - - // disable Direct Mapping - NoDirectmap bool `json:"NoDirectmap,omitempty"` - - // disable Byterange locks - NoLocks bool `json:"NoLocks,omitempty"` - - // disable Directory CHange Notifications - NoDirnotify bool `json:"NoDirnotify,omitempty"` - - // share is use for VM shared memory - VmSharedMemory bool `json:"VmSharedMemory,omitempty"` - - // allow access only to the files specified in AllowedFiles - RestrictFileAccess bool `json:"RestrictFileAccess,omitempty"` - - // disable all oplocks except Level II - ForceLevelIIOplocks bool `json:"ForceLevelIIOplocks,omitempty"` - - // Allow the host to reparse this base layer - ReparseBaseLayer bool `json:"ReparseBaseLayer,omitempty"` - - // Enable pseudo-oplocks - PseudoOplocks bool `json:"PseudoOplocks,omitempty"` - - // All opens will use non-cached IO - NonCacheIo bool `json:"NonCacheIo,omitempty"` - - // Enable pseudo directory change notifications - PseudoDirnotify bool `json:"PseudoDirnotify,omitempty"` - - // Block directory enumeration, renames, and deletes. - SingleFileMapping bool `json:"SingleFileMapping,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_memory.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_memory.go deleted file mode 100644 index 8e1836dd6b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_memory.go +++ /dev/null @@ -1,26 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type VmMemory struct { - AvailableMemory int32 `json:"AvailableMemory,omitempty"` - - AvailableMemoryBuffer int32 `json:"AvailableMemoryBuffer,omitempty"` - - ReservedMemory uint64 `json:"ReservedMemory,omitempty"` - - AssignedMemory uint64 `json:"AssignedMemory,omitempty"` - - SlpActive bool `json:"SlpActive,omitempty"` - - BalancingEnabled bool `json:"BalancingEnabled,omitempty"` - - DmOperationInProgress bool `json:"DmOperationInProgress,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_processor_limits.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_processor_limits.go deleted file mode 100644 index de1b9cf1ae..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_processor_limits.go +++ /dev/null @@ -1,22 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.4 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -// ProcessorLimits is used when modifying processor scheduling limits of a virtual machine. -type ProcessorLimits struct { - // Maximum amount of host CPU resources that the virtual machine can use. - Limit uint64 `json:"Limit,omitempty"` - // Value describing the relative priority of this virtual machine compared to other virtual machines. - Weight uint64 `json:"Weight,omitempty"` - // Minimum amount of host CPU resources that the virtual machine is guaranteed. - Reservation uint64 `json:"Reservation,omitempty"` - // Provides the target maximum CPU frequency, in MHz, for a virtual machine. - MaximumFrequencyMHz uint32 `json:"MaximumFrequencyMHz,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/windows_crash_reporting.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/windows_crash_reporting.go deleted file mode 100644 index 8ed7e566d6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/windows_crash_reporting.go +++ /dev/null @@ -1,16 +0,0 @@ -/* - * HCS API - * - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * API version: 2.1 - * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) - */ - -package hcsschema - -type WindowsCrashReporting struct { - DumpFileName string `json:"DumpFileName,omitempty"` - - MaxDumpSize int64 `json:"MaxDumpSize,omitempty"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go deleted file mode 100644 index a634dfc151..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go +++ /dev/null @@ -1,49 +0,0 @@ -package hcs - -import ( - "context" - "encoding/json" - - hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" - "github.com/Microsoft/hcsshim/internal/vmcompute" -) - -// GetServiceProperties returns properties of the host compute service. -func GetServiceProperties(ctx context.Context, q hcsschema.PropertyQuery) (*hcsschema.ServiceProperties, error) { - operation := "hcs::GetServiceProperties" - - queryb, err := json.Marshal(q) - if err != nil { - return nil, err - } - propertiesJSON, resultJSON, err := vmcompute.HcsGetServiceProperties(ctx, string(queryb)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, &HcsError{Op: operation, Err: err, Events: events} - } - - if propertiesJSON == "" { - return nil, ErrUnexpectedValue - } - properties := &hcsschema.ServiceProperties{} - if err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil { - return nil, err - } - return properties, nil -} - -// ModifyServiceSettings modifies settings of the host compute service. -func ModifyServiceSettings(ctx context.Context, settings hcsschema.ModificationRequest) error { - operation := "hcs::ModifyServiceSettings" - - settingsJSON, err := json.Marshal(settings) - if err != nil { - return err - } - resultJSON, err := vmcompute.HcsModifyServiceSettings(ctx, string(settingsJSON)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return &HcsError{Op: operation, Err: err, Events: events} - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go deleted file mode 100644 index a76f6b253e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go +++ /dev/null @@ -1,815 +0,0 @@ -package hcs - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "strings" - "sync" - "syscall" - "time" - - "github.com/Microsoft/hcsshim/internal/cow" - "github.com/Microsoft/hcsshim/internal/hcs/schema1" - hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" - "github.com/Microsoft/hcsshim/internal/jobobject" - "github.com/Microsoft/hcsshim/internal/log" - "github.com/Microsoft/hcsshim/internal/logfields" - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/internal/timeout" - "github.com/Microsoft/hcsshim/internal/vmcompute" - "github.com/sirupsen/logrus" - "go.opencensus.io/trace" -) - -type System struct { - handleLock sync.RWMutex - handle vmcompute.HcsSystem - id string - callbackNumber uintptr - - closedWaitOnce sync.Once - waitBlock chan struct{} - waitError error - exitError error - os, typ, owner string - startTime time.Time -} - -func newSystem(id string) *System { - return &System{ - id: id, - waitBlock: make(chan struct{}), - } -} - -// Implementation detail for silo naming, this should NOT be relied upon very heavily. -func siloNameFmt(containerID string) string { - return fmt.Sprintf(`\Container_%s`, containerID) -} - -// CreateComputeSystem creates a new compute system with the given configuration but does not start it. -func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface interface{}) (_ *System, err error) { - operation := "hcs::CreateComputeSystem" - - // hcsCreateComputeSystemContext is an async operation. Start the outer span - // here to measure the full create time. - ctx, span := trace.StartSpan(ctx, operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("cid", id)) - - computeSystem := newSystem(id) - - hcsDocumentB, err := json.Marshal(hcsDocumentInterface) - if err != nil { - return nil, err - } - - hcsDocument := string(hcsDocumentB) - - var ( - identity syscall.Handle - resultJSON string - createError error - ) - computeSystem.handle, resultJSON, createError = vmcompute.HcsCreateComputeSystem(ctx, id, hcsDocument, identity) - if createError == nil || IsPending(createError) { - defer func() { - if err != nil { - computeSystem.Close() - } - }() - if err = computeSystem.registerCallback(ctx); err != nil { - // Terminate the compute system if it still exists. We're okay to - // ignore a failure here. - _ = computeSystem.Terminate(ctx) - return nil, makeSystemError(computeSystem, operation, err, nil) - } - } - - events, err := processAsyncHcsResult(ctx, createError, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemCreateCompleted, &timeout.SystemCreate) - if err != nil { - if err == ErrTimeout { - // Terminate the compute system if it still exists. We're okay to - // ignore a failure here. - _ = computeSystem.Terminate(ctx) - } - return nil, makeSystemError(computeSystem, operation, err, events) - } - go computeSystem.waitBackground() - if err = computeSystem.getCachedProperties(ctx); err != nil { - return nil, err - } - return computeSystem, nil -} - -// OpenComputeSystem opens an existing compute system by ID. -func OpenComputeSystem(ctx context.Context, id string) (*System, error) { - operation := "hcs::OpenComputeSystem" - - computeSystem := newSystem(id) - handle, resultJSON, err := vmcompute.HcsOpenComputeSystem(ctx, id) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, makeSystemError(computeSystem, operation, err, events) - } - computeSystem.handle = handle - defer func() { - if err != nil { - computeSystem.Close() - } - }() - if err = computeSystem.registerCallback(ctx); err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - go computeSystem.waitBackground() - if err = computeSystem.getCachedProperties(ctx); err != nil { - return nil, err - } - return computeSystem, nil -} - -func (computeSystem *System) getCachedProperties(ctx context.Context) error { - props, err := computeSystem.Properties(ctx) - if err != nil { - return err - } - computeSystem.typ = strings.ToLower(props.SystemType) - computeSystem.os = strings.ToLower(props.RuntimeOSType) - computeSystem.owner = strings.ToLower(props.Owner) - if computeSystem.os == "" && computeSystem.typ == "container" { - // Pre-RS5 HCS did not return the OS, but it only supported containers - // that ran Windows. - computeSystem.os = "windows" - } - return nil -} - -// OS returns the operating system of the compute system, "linux" or "windows". -func (computeSystem *System) OS() string { - return computeSystem.os -} - -// IsOCI returns whether processes in the compute system should be created via -// OCI. -func (computeSystem *System) IsOCI() bool { - return computeSystem.os == "linux" && computeSystem.typ == "container" -} - -// GetComputeSystems gets a list of the compute systems on the system that match the query -func GetComputeSystems(ctx context.Context, q schema1.ComputeSystemQuery) ([]schema1.ContainerProperties, error) { - operation := "hcs::GetComputeSystems" - - queryb, err := json.Marshal(q) - if err != nil { - return nil, err - } - - computeSystemsJSON, resultJSON, err := vmcompute.HcsEnumerateComputeSystems(ctx, string(queryb)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, &HcsError{Op: operation, Err: err, Events: events} - } - - if computeSystemsJSON == "" { - return nil, ErrUnexpectedValue - } - computeSystems := []schema1.ContainerProperties{} - if err = json.Unmarshal([]byte(computeSystemsJSON), &computeSystems); err != nil { - return nil, err - } - - return computeSystems, nil -} - -// Start synchronously starts the computeSystem. -func (computeSystem *System) Start(ctx context.Context) (err error) { - operation := "hcs::System::Start" - - // hcsStartComputeSystemContext is an async operation. Start the outer span - // here to measure the full start time. - ctx, span := trace.StartSpan(ctx, operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) - - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - if computeSystem.handle == 0 { - return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) - } - - resultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, "") - events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart) - if err != nil { - return makeSystemError(computeSystem, operation, err, events) - } - computeSystem.startTime = time.Now() - return nil -} - -// ID returns the compute system's identifier. -func (computeSystem *System) ID() string { - return computeSystem.id -} - -// Shutdown requests a compute system shutdown. -func (computeSystem *System) Shutdown(ctx context.Context) error { - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - operation := "hcs::System::Shutdown" - - if computeSystem.handle == 0 { - return nil - } - - resultJSON, err := vmcompute.HcsShutdownComputeSystem(ctx, computeSystem.handle, "") - events := processHcsResult(ctx, resultJSON) - switch err { - case nil, ErrVmcomputeAlreadyStopped, ErrComputeSystemDoesNotExist, ErrVmcomputeOperationPending: - default: - return makeSystemError(computeSystem, operation, err, events) - } - return nil -} - -// Terminate requests a compute system terminate. -func (computeSystem *System) Terminate(ctx context.Context) error { - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - operation := "hcs::System::Terminate" - - if computeSystem.handle == 0 { - return nil - } - - resultJSON, err := vmcompute.HcsTerminateComputeSystem(ctx, computeSystem.handle, "") - events := processHcsResult(ctx, resultJSON) - switch err { - case nil, ErrVmcomputeAlreadyStopped, ErrComputeSystemDoesNotExist, ErrVmcomputeOperationPending: - default: - return makeSystemError(computeSystem, operation, err, events) - } - return nil -} - -// waitBackground waits for the compute system exit notification. Once received -// sets `computeSystem.waitError` (if any) and unblocks all `Wait` calls. -// -// This MUST be called exactly once per `computeSystem.handle` but `Wait` is -// safe to call multiple times. -func (computeSystem *System) waitBackground() { - operation := "hcs::System::waitBackground" - ctx, span := trace.StartSpan(context.Background(), operation) - defer span.End() - span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) - - err := waitForNotification(ctx, computeSystem.callbackNumber, hcsNotificationSystemExited, nil) - switch err { - case nil: - log.G(ctx).Debug("system exited") - case ErrVmcomputeUnexpectedExit: - log.G(ctx).Debug("unexpected system exit") - computeSystem.exitError = makeSystemError(computeSystem, operation, err, nil) - err = nil - default: - err = makeSystemError(computeSystem, operation, err, nil) - } - computeSystem.closedWaitOnce.Do(func() { - computeSystem.waitError = err - close(computeSystem.waitBlock) - }) - oc.SetSpanStatus(span, err) -} - -func (computeSystem *System) WaitChannel() <-chan struct{} { - return computeSystem.waitBlock -} - -func (computeSystem *System) WaitError() error { - return computeSystem.waitError -} - -// Wait synchronously waits for the compute system to shutdown or terminate. If -// the compute system has already exited returns the previous error (if any). -func (computeSystem *System) Wait() error { - <-computeSystem.WaitChannel() - return computeSystem.WaitError() -} - -// ExitError returns an error describing the reason the compute system terminated. -func (computeSystem *System) ExitError() error { - select { - case <-computeSystem.waitBlock: - if computeSystem.waitError != nil { - return computeSystem.waitError - } - return computeSystem.exitError - default: - return errors.New("container not exited") - } -} - -// Properties returns the requested container properties targeting a V1 schema container. -func (computeSystem *System) Properties(ctx context.Context, types ...schema1.PropertyType) (*schema1.ContainerProperties, error) { - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - operation := "hcs::System::Properties" - - queryBytes, err := json.Marshal(schema1.PropertyQuery{PropertyTypes: types}) - if err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - - propertiesJSON, resultJSON, err := vmcompute.HcsGetComputeSystemProperties(ctx, computeSystem.handle, string(queryBytes)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, makeSystemError(computeSystem, operation, err, events) - } - - if propertiesJSON == "" { - return nil, ErrUnexpectedValue - } - properties := &schema1.ContainerProperties{} - if err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - - return properties, nil -} - -// queryInProc handles querying for container properties without reaching out to HCS. `props` -// will be updated to contain any data returned from the queries present in `types`. If any properties -// failed to be queried they will be tallied up and returned in as the first return value. Failures on -// query are NOT considered errors; the only failure case for this method is if the containers job object -// cannot be opened. -func (computeSystem *System) queryInProc(ctx context.Context, props *hcsschema.Properties, types []hcsschema.PropertyType) ([]hcsschema.PropertyType, error) { - // In the future we can make use of some new functionality in the HCS that allows you - // to pass a job object for HCS to use for the container. Currently, the only way we'll - // be able to open the job/silo is if we're running as SYSTEM. - jobOptions := &jobobject.Options{ - UseNTVariant: true, - Name: siloNameFmt(computeSystem.id), - } - job, err := jobobject.Open(ctx, jobOptions) - if err != nil { - return nil, err - } - defer job.Close() - - var fallbackQueryTypes []hcsschema.PropertyType - for _, propType := range types { - switch propType { - case hcsschema.PTStatistics: - // Handle a bad caller asking for the same type twice. No use in re-querying if this is - // filled in already. - if props.Statistics == nil { - props.Statistics, err = computeSystem.statisticsInProc(job) - if err != nil { - log.G(ctx).WithError(err).Warn("failed to get statistics in-proc") - - fallbackQueryTypes = append(fallbackQueryTypes, propType) - } - } - default: - fallbackQueryTypes = append(fallbackQueryTypes, propType) - } - } - - return fallbackQueryTypes, nil -} - -// statisticsInProc emulates what HCS does to grab statistics for a given container with a small -// change to make grabbing the private working set total much more efficient. -func (computeSystem *System) statisticsInProc(job *jobobject.JobObject) (*hcsschema.Statistics, error) { - // Start timestamp for these stats before we grab them to match HCS - timestamp := time.Now() - - memInfo, err := job.QueryMemoryStats() - if err != nil { - return nil, err - } - - processorInfo, err := job.QueryProcessorStats() - if err != nil { - return nil, err - } - - storageInfo, err := job.QueryStorageStats() - if err != nil { - return nil, err - } - - // This calculates the private working set more efficiently than HCS does. HCS calls NtQuerySystemInformation - // with the class SystemProcessInformation which returns an array containing system information for *every* - // process running on the machine. They then grab the pids that are running in the container and filter down - // the entries in the array to only what's running in that silo and start tallying up the total. This doesn't - // work well as performance should get worse if more processess are running on the machine in general and not - // just in the container. All of the additional information besides the WorkingSetPrivateSize field is ignored - // as well which isn't great and is wasted work to fetch. - // - // HCS only let's you grab statistics in an all or nothing fashion, so we can't just grab the private - // working set ourselves and ask for everything else seperately. The optimization we can make here is - // to open the silo ourselves and do the same queries for the rest of the info, as well as calculating - // the private working set in a more efficient manner by: - // - // 1. Find the pids running in the silo - // 2. Get a process handle for every process (only need PROCESS_QUERY_LIMITED_INFORMATION access) - // 3. Call NtQueryInformationProcess on each process with the class ProcessVmCounters - // 4. Tally up the total using the field PrivateWorkingSetSize in VM_COUNTERS_EX2. - privateWorkingSet, err := job.QueryPrivateWorkingSet() - if err != nil { - return nil, err - } - - return &hcsschema.Statistics{ - Timestamp: timestamp, - ContainerStartTime: computeSystem.startTime, - Uptime100ns: uint64(time.Since(computeSystem.startTime).Nanoseconds()) / 100, - Memory: &hcsschema.MemoryStats{ - MemoryUsageCommitBytes: memInfo.JobMemory, - MemoryUsageCommitPeakBytes: memInfo.PeakJobMemoryUsed, - MemoryUsagePrivateWorkingSetBytes: privateWorkingSet, - }, - Processor: &hcsschema.ProcessorStats{ - RuntimeKernel100ns: uint64(processorInfo.TotalKernelTime), - RuntimeUser100ns: uint64(processorInfo.TotalUserTime), - TotalRuntime100ns: uint64(processorInfo.TotalKernelTime + processorInfo.TotalUserTime), - }, - Storage: &hcsschema.StorageStats{ - ReadCountNormalized: uint64(storageInfo.ReadStats.IoCount), - ReadSizeBytes: storageInfo.ReadStats.TotalSize, - WriteCountNormalized: uint64(storageInfo.WriteStats.IoCount), - WriteSizeBytes: storageInfo.WriteStats.TotalSize, - }, - }, nil -} - -// hcsPropertiesV2Query is a helper to make a HcsGetComputeSystemProperties call using the V2 schema property types. -func (computeSystem *System) hcsPropertiesV2Query(ctx context.Context, types []hcsschema.PropertyType) (*hcsschema.Properties, error) { - operation := "hcs::System::PropertiesV2" - - queryBytes, err := json.Marshal(hcsschema.PropertyQuery{PropertyTypes: types}) - if err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - - propertiesJSON, resultJSON, err := vmcompute.HcsGetComputeSystemProperties(ctx, computeSystem.handle, string(queryBytes)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, makeSystemError(computeSystem, operation, err, events) - } - - if propertiesJSON == "" { - return nil, ErrUnexpectedValue - } - props := &hcsschema.Properties{} - if err := json.Unmarshal([]byte(propertiesJSON), props); err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - - return props, nil -} - -// PropertiesV2 returns the requested compute systems properties targeting a V2 schema compute system. -func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (_ *hcsschema.Properties, err error) { - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - // Let HCS tally up the total for VM based queries instead of querying ourselves. - if computeSystem.typ != "container" { - return computeSystem.hcsPropertiesV2Query(ctx, types) - } - - // Define a starter Properties struct with the default fields returned from every - // query. Owner is only returned from Statistics but it's harmless to include. - properties := &hcsschema.Properties{ - Id: computeSystem.id, - SystemType: computeSystem.typ, - RuntimeOsType: computeSystem.os, - Owner: computeSystem.owner, - } - - logEntry := log.G(ctx) - // First lets try and query ourselves without reaching to HCS. If any of the queries fail - // we'll take note and fallback to querying HCS for any of the failed types. - fallbackTypes, err := computeSystem.queryInProc(ctx, properties, types) - if err == nil && len(fallbackTypes) == 0 { - return properties, nil - } else if err != nil { - logEntry.WithError(fmt.Errorf("failed to query compute system properties in-proc: %w", err)) - fallbackTypes = types - } - - logEntry.WithFields(logrus.Fields{ - logfields.ContainerID: computeSystem.id, - "propertyTypes": fallbackTypes, - }).Info("falling back to HCS for property type queries") - - hcsProperties, err := computeSystem.hcsPropertiesV2Query(ctx, fallbackTypes) - if err != nil { - return nil, err - } - - // Now add in anything that we might have successfully queried in process. - if properties.Statistics != nil { - hcsProperties.Statistics = properties.Statistics - hcsProperties.Owner = properties.Owner - } - - // For future support for querying processlist in-proc as well. - if properties.ProcessList != nil { - hcsProperties.ProcessList = properties.ProcessList - } - - return hcsProperties, nil -} - -// Pause pauses the execution of the computeSystem. This feature is not enabled in TP5. -func (computeSystem *System) Pause(ctx context.Context) (err error) { - operation := "hcs::System::Pause" - - // hcsPauseComputeSystemContext is an async peration. Start the outer span - // here to measure the full pause time. - ctx, span := trace.StartSpan(ctx, operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) - - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - if computeSystem.handle == 0 { - return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) - } - - resultJSON, err := vmcompute.HcsPauseComputeSystem(ctx, computeSystem.handle, "") - events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemPauseCompleted, &timeout.SystemPause) - if err != nil { - return makeSystemError(computeSystem, operation, err, events) - } - - return nil -} - -// Resume resumes the execution of the computeSystem. This feature is not enabled in TP5. -func (computeSystem *System) Resume(ctx context.Context) (err error) { - operation := "hcs::System::Resume" - - // hcsResumeComputeSystemContext is an async operation. Start the outer span - // here to measure the full restore time. - ctx, span := trace.StartSpan(ctx, operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) - - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - if computeSystem.handle == 0 { - return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) - } - - resultJSON, err := vmcompute.HcsResumeComputeSystem(ctx, computeSystem.handle, "") - events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemResumeCompleted, &timeout.SystemResume) - if err != nil { - return makeSystemError(computeSystem, operation, err, events) - } - - return nil -} - -// Save the compute system -func (computeSystem *System) Save(ctx context.Context, options interface{}) (err error) { - operation := "hcs::System::Save" - - // hcsSaveComputeSystemContext is an async peration. Start the outer span - // here to measure the full save time. - ctx, span := trace.StartSpan(ctx, operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) - - saveOptions, err := json.Marshal(options) - if err != nil { - return err - } - - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - if computeSystem.handle == 0 { - return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) - } - - result, err := vmcompute.HcsSaveComputeSystem(ctx, computeSystem.handle, string(saveOptions)) - events, err := processAsyncHcsResult(ctx, err, result, computeSystem.callbackNumber, hcsNotificationSystemSaveCompleted, &timeout.SystemSave) - if err != nil { - return makeSystemError(computeSystem, operation, err, events) - } - - return nil -} - -func (computeSystem *System) createProcess(ctx context.Context, operation string, c interface{}) (*Process, *vmcompute.HcsProcessInformation, error) { - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - if computeSystem.handle == 0 { - return nil, nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) - } - - configurationb, err := json.Marshal(c) - if err != nil { - return nil, nil, makeSystemError(computeSystem, operation, err, nil) - } - - configuration := string(configurationb) - processInfo, processHandle, resultJSON, err := vmcompute.HcsCreateProcess(ctx, computeSystem.handle, configuration) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, nil, makeSystemError(computeSystem, operation, err, events) - } - - log.G(ctx).WithField("pid", processInfo.ProcessId).Debug("created process pid") - return newProcess(processHandle, int(processInfo.ProcessId), computeSystem), &processInfo, nil -} - -// CreateProcess launches a new process within the computeSystem. -func (computeSystem *System) CreateProcess(ctx context.Context, c interface{}) (cow.Process, error) { - operation := "hcs::System::CreateProcess" - process, processInfo, err := computeSystem.createProcess(ctx, operation, c) - if err != nil { - return nil, err - } - defer func() { - if err != nil { - process.Close() - } - }() - - pipes, err := makeOpenFiles([]syscall.Handle{processInfo.StdInput, processInfo.StdOutput, processInfo.StdError}) - if err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - process.stdin = pipes[0] - process.stdout = pipes[1] - process.stderr = pipes[2] - process.hasCachedStdio = true - - if err = process.registerCallback(ctx); err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - go process.waitBackground() - - return process, nil -} - -// OpenProcess gets an interface to an existing process within the computeSystem. -func (computeSystem *System) OpenProcess(ctx context.Context, pid int) (*Process, error) { - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - operation := "hcs::System::OpenProcess" - - if computeSystem.handle == 0 { - return nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) - } - - processHandle, resultJSON, err := vmcompute.HcsOpenProcess(ctx, computeSystem.handle, uint32(pid)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return nil, makeSystemError(computeSystem, operation, err, events) - } - - process := newProcess(processHandle, pid, computeSystem) - if err = process.registerCallback(ctx); err != nil { - return nil, makeSystemError(computeSystem, operation, err, nil) - } - go process.waitBackground() - - return process, nil -} - -// Close cleans up any state associated with the compute system but does not terminate or wait for it. -func (computeSystem *System) Close() (err error) { - operation := "hcs::System::Close" - ctx, span := trace.StartSpan(context.Background(), operation) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) - - computeSystem.handleLock.Lock() - defer computeSystem.handleLock.Unlock() - - // Don't double free this - if computeSystem.handle == 0 { - return nil - } - - if err = computeSystem.unregisterCallback(ctx); err != nil { - return makeSystemError(computeSystem, operation, err, nil) - } - - err = vmcompute.HcsCloseComputeSystem(ctx, computeSystem.handle) - if err != nil { - return makeSystemError(computeSystem, operation, err, nil) - } - - computeSystem.handle = 0 - computeSystem.closedWaitOnce.Do(func() { - computeSystem.waitError = ErrAlreadyClosed - close(computeSystem.waitBlock) - }) - - return nil -} - -func (computeSystem *System) registerCallback(ctx context.Context) error { - callbackContext := ¬ificationWatcherContext{ - channels: newSystemChannels(), - systemID: computeSystem.id, - } - - callbackMapLock.Lock() - callbackNumber := nextCallback - nextCallback++ - callbackMap[callbackNumber] = callbackContext - callbackMapLock.Unlock() - - callbackHandle, err := vmcompute.HcsRegisterComputeSystemCallback(ctx, computeSystem.handle, notificationWatcherCallback, callbackNumber) - if err != nil { - return err - } - callbackContext.handle = callbackHandle - computeSystem.callbackNumber = callbackNumber - - return nil -} - -func (computeSystem *System) unregisterCallback(ctx context.Context) error { - callbackNumber := computeSystem.callbackNumber - - callbackMapLock.RLock() - callbackContext := callbackMap[callbackNumber] - callbackMapLock.RUnlock() - - if callbackContext == nil { - return nil - } - - handle := callbackContext.handle - - if handle == 0 { - return nil - } - - // hcsUnregisterComputeSystemCallback has its own syncronization - // to wait for all callbacks to complete. We must NOT hold the callbackMapLock. - err := vmcompute.HcsUnregisterComputeSystemCallback(ctx, handle) - if err != nil { - return err - } - - closeChannels(callbackContext.channels) - - callbackMapLock.Lock() - delete(callbackMap, callbackNumber) - callbackMapLock.Unlock() - - handle = 0 //nolint:ineffassign - - return nil -} - -// Modify the System by sending a request to HCS -func (computeSystem *System) Modify(ctx context.Context, config interface{}) error { - computeSystem.handleLock.RLock() - defer computeSystem.handleLock.RUnlock() - - operation := "hcs::System::Modify" - - if computeSystem.handle == 0 { - return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) - } - - requestBytes, err := json.Marshal(config) - if err != nil { - return err - } - - requestJSON := string(requestBytes) - resultJSON, err := vmcompute.HcsModifyComputeSystem(ctx, computeSystem.handle, requestJSON) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return makeSystemError(computeSystem, operation, err, events) - } - - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go deleted file mode 100644 index 3342e5bb94..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go +++ /dev/null @@ -1,62 +0,0 @@ -package hcs - -import ( - "context" - "io" - "syscall" - - "github.com/Microsoft/go-winio" - diskutil "github.com/Microsoft/go-winio/vhd" - "github.com/Microsoft/hcsshim/computestorage" - "github.com/pkg/errors" - "golang.org/x/sys/windows" -) - -// makeOpenFiles calls winio.MakeOpenFile for each handle in a slice but closes all the handles -// if there is an error. -func makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) { - fs := make([]io.ReadWriteCloser, len(hs)) - for i, h := range hs { - if h != syscall.Handle(0) { - if err == nil { - fs[i], err = winio.MakeOpenFile(h) - } - if err != nil { - syscall.Close(h) - } - } - } - if err != nil { - for _, f := range fs { - if f != nil { - f.Close() - } - } - return nil, err - } - return fs, nil -} - -// CreateNTFSVHD creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`. -func CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err error) { - if err := diskutil.CreateVhdx(vhdPath, sizeGB, 1); err != nil { - return errors.Wrap(err, "failed to create VHD") - } - - vhd, err := diskutil.OpenVirtualDisk(vhdPath, diskutil.VirtualDiskAccessNone, diskutil.OpenVirtualDiskFlagNone) - if err != nil { - return errors.Wrap(err, "failed to open VHD") - } - defer func() { - err2 := windows.CloseHandle(windows.Handle(vhd)) - if err == nil { - err = errors.Wrap(err2, "failed to close VHD") - } - }() - - if err := computestorage.FormatWritableLayerVhd(ctx, windows.Handle(vhd)); err != nil { - return errors.Wrap(err, "failed to format VHD") - } - - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go deleted file mode 100644 index db4e14fdfb..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go +++ /dev/null @@ -1,68 +0,0 @@ -package hcs - -import ( - "context" - "time" - - "github.com/Microsoft/hcsshim/internal/log" -) - -func processAsyncHcsResult(ctx context.Context, err error, resultJSON string, callbackNumber uintptr, expectedNotification hcsNotification, timeout *time.Duration) ([]ErrorEvent, error) { - events := processHcsResult(ctx, resultJSON) - if IsPending(err) { - return nil, waitForNotification(ctx, callbackNumber, expectedNotification, timeout) - } - - return events, err -} - -func waitForNotification(ctx context.Context, callbackNumber uintptr, expectedNotification hcsNotification, timeout *time.Duration) error { - callbackMapLock.RLock() - if _, ok := callbackMap[callbackNumber]; !ok { - callbackMapLock.RUnlock() - log.G(ctx).WithField("callbackNumber", callbackNumber).Error("failed to waitForNotification: callbackNumber does not exist in callbackMap") - return ErrHandleClose - } - channels := callbackMap[callbackNumber].channels - callbackMapLock.RUnlock() - - expectedChannel := channels[expectedNotification] - if expectedChannel == nil { - log.G(ctx).WithField("type", expectedNotification).Error("unknown notification type in waitForNotification") - return ErrInvalidNotificationType - } - - var c <-chan time.Time - if timeout != nil { - timer := time.NewTimer(*timeout) - c = timer.C - defer timer.Stop() - } - - select { - case err, ok := <-expectedChannel: - if !ok { - return ErrHandleClose - } - return err - case err, ok := <-channels[hcsNotificationSystemExited]: - if !ok { - return ErrHandleClose - } - // If the expected notification is hcsNotificationSystemExited which of the two selects - // chosen is random. Return the raw error if hcsNotificationSystemExited is expected - if channels[hcsNotificationSystemExited] == expectedChannel { - return err - } - return ErrUnexpectedContainerExit - case _, ok := <-channels[hcsNotificationServiceDisconnect]: - if !ok { - return ErrHandleClose - } - // hcsNotificationServiceDisconnect should never be an expected notification - // it does not need the same handling as hcsNotificationSystemExited - return ErrUnexpectedProcessAbort - case <-c: - return ErrTimeout - } -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go b/vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go deleted file mode 100644 index 921c2c8556..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go +++ /dev/null @@ -1,47 +0,0 @@ -package hcserror - -import ( - "fmt" - "syscall" -) - -const ERROR_GEN_FAILURE = syscall.Errno(31) - -type HcsError struct { - title string - rest string - Err error -} - -func (e *HcsError) Error() string { - s := e.title - if len(s) > 0 && s[len(s)-1] != ' ' { - s += " " - } - s += fmt.Sprintf("failed in Win32: %s (0x%x)", e.Err, Win32FromError(e.Err)) - if e.rest != "" { - if e.rest[0] != ' ' { - s += " " - } - s += e.rest - } - return s -} - -func New(err error, title, rest string) error { - // Pass through DLL errors directly since they do not originate from HCS. - if _, ok := err.(*syscall.DLLError); ok { - return err - } - return &HcsError{title, rest, err} -} - -func Win32FromError(err error) uint32 { - if herr, ok := err.(*HcsError); ok { - return Win32FromError(herr.Err) - } - if code, ok := err.(syscall.Errno); ok { - return uint32(code) - } - return uint32(ERROR_GEN_FAILURE) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go deleted file mode 100644 index b2e475f53c..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go +++ /dev/null @@ -1,23 +0,0 @@ -package hns - -import "fmt" - -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go hns.go - -//sys _hnsCall(method string, path string, object string, response **uint16) (hr error) = vmcompute.HNSCall? - -type EndpointNotFoundError struct { - EndpointName string -} - -func (e EndpointNotFoundError) Error() string { - return fmt.Sprintf("Endpoint %s not found", e.EndpointName) -} - -type NetworkNotFoundError struct { - NetworkName string -} - -func (e NetworkNotFoundError) Error() string { - return fmt.Sprintf("Network %s not found", e.NetworkName) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go deleted file mode 100644 index 7cf954c7b2..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go +++ /dev/null @@ -1,338 +0,0 @@ -package hns - -import ( - "encoding/json" - "net" - "strings" - - "github.com/sirupsen/logrus" -) - -// HNSEndpoint represents a network endpoint in HNS -type HNSEndpoint struct { - Id string `json:"ID,omitempty"` - Name string `json:",omitempty"` - VirtualNetwork string `json:",omitempty"` - VirtualNetworkName string `json:",omitempty"` - Policies []json.RawMessage `json:",omitempty"` - MacAddress string `json:",omitempty"` - IPAddress net.IP `json:",omitempty"` - IPv6Address net.IP `json:",omitempty"` - DNSSuffix string `json:",omitempty"` - DNSServerList string `json:",omitempty"` - DNSDomain string `json:",omitempty"` - GatewayAddress string `json:",omitempty"` - GatewayAddressV6 string `json:",omitempty"` - EnableInternalDNS bool `json:",omitempty"` - DisableICC bool `json:",omitempty"` - PrefixLength uint8 `json:",omitempty"` - IPv6PrefixLength uint8 `json:",omitempty"` - IsRemoteEndpoint bool `json:",omitempty"` - EnableLowMetric bool `json:",omitempty"` - Namespace *Namespace `json:",omitempty"` - EncapOverhead uint16 `json:",omitempty"` - SharedContainers []string `json:",omitempty"` -} - -//SystemType represents the type of the system on which actions are done -type SystemType string - -// SystemType const -const ( - ContainerType SystemType = "Container" - VirtualMachineType SystemType = "VirtualMachine" - HostType SystemType = "Host" -) - -// EndpointAttachDetachRequest is the structure used to send request to the container to modify the system -// Supported resource types are Network and Request Types are Add/Remove -type EndpointAttachDetachRequest struct { - ContainerID string `json:"ContainerId,omitempty"` - SystemType SystemType `json:"SystemType"` - CompartmentID uint16 `json:"CompartmentId,omitempty"` - VirtualNICName string `json:"VirtualNicName,omitempty"` -} - -// EndpointResquestResponse is object to get the endpoint request response -type EndpointResquestResponse struct { - Success bool - Error string -} - -// EndpointStats is the object that has stats for a given endpoint -type EndpointStats struct { - BytesReceived uint64 `json:"BytesReceived"` - BytesSent uint64 `json:"BytesSent"` - DroppedPacketsIncoming uint64 `json:"DroppedPacketsIncoming"` - DroppedPacketsOutgoing uint64 `json:"DroppedPacketsOutgoing"` - EndpointID string `json:"EndpointId"` - InstanceID string `json:"InstanceId"` - PacketsReceived uint64 `json:"PacketsReceived"` - PacketsSent uint64 `json:"PacketsSent"` -} - -// HNSEndpointRequest makes a HNS call to modify/query a network endpoint -func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) { - endpoint := &HNSEndpoint{} - err := hnsCall(method, "/endpoints/"+path, request, &endpoint) - if err != nil { - return nil, err - } - - return endpoint, nil -} - -// HNSListEndpointRequest makes a HNS call to query the list of available endpoints -func HNSListEndpointRequest() ([]HNSEndpoint, error) { - var endpoint []HNSEndpoint - err := hnsCall("GET", "/endpoints/", "", &endpoint) - if err != nil { - return nil, err - } - - return endpoint, nil -} - -// hnsEndpointStatsRequest makes a HNS call to query the stats for a given endpoint ID -func hnsEndpointStatsRequest(id string) (*EndpointStats, error) { - var stats EndpointStats - err := hnsCall("GET", "/endpointstats/"+id, "", &stats) - if err != nil { - return nil, err - } - - return &stats, nil -} - -// GetHNSEndpointByID get the Endpoint by ID -func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) { - return HNSEndpointRequest("GET", endpointID, "") -} - -// GetHNSEndpointStats get the stats for a n Endpoint by ID -func GetHNSEndpointStats(endpointID string) (*EndpointStats, error) { - return hnsEndpointStatsRequest(endpointID) -} - -// GetHNSEndpointByName gets the endpoint filtered by Name -func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) { - hnsResponse, err := HNSListEndpointRequest() - if err != nil { - return nil, err - } - for _, hnsEndpoint := range hnsResponse { - if hnsEndpoint.Name == endpointName { - return &hnsEndpoint, nil - } - } - return nil, EndpointNotFoundError{EndpointName: endpointName} -} - -type endpointAttachInfo struct { - SharedContainers json.RawMessage `json:",omitempty"` -} - -func (endpoint *HNSEndpoint) IsAttached(vID string) (bool, error) { - attachInfo := endpointAttachInfo{} - err := hnsCall("GET", "/endpoints/"+endpoint.Id, "", &attachInfo) - - // Return false allows us to just return the err - if err != nil { - return false, err - } - - if strings.Contains(strings.ToLower(string(attachInfo.SharedContainers)), strings.ToLower(vID)) { - return true, nil - } - - return false, nil - -} - -// Create Endpoint by sending EndpointRequest to HNS. TODO: Create a separate HNS interface to place all these methods -func (endpoint *HNSEndpoint) Create() (*HNSEndpoint, error) { - operation := "Create" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - - jsonString, err := json.Marshal(endpoint) - if err != nil { - return nil, err - } - return HNSEndpointRequest("POST", "", string(jsonString)) -} - -// Delete Endpoint by sending EndpointRequest to HNS -func (endpoint *HNSEndpoint) Delete() (*HNSEndpoint, error) { - operation := "Delete" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - - return HNSEndpointRequest("DELETE", endpoint.Id, "") -} - -// Update Endpoint -func (endpoint *HNSEndpoint) Update() (*HNSEndpoint, error) { - operation := "Update" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - jsonString, err := json.Marshal(endpoint) - if err != nil { - return nil, err - } - err = hnsCall("POST", "/endpoints/"+endpoint.Id, string(jsonString), &endpoint) - - return endpoint, err -} - -// ApplyACLPolicy applies a set of ACL Policies on the Endpoint -func (endpoint *HNSEndpoint) ApplyACLPolicy(policies ...*ACLPolicy) error { - operation := "ApplyACLPolicy" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - - for _, policy := range policies { - if policy == nil { - continue - } - jsonString, err := json.Marshal(policy) - if err != nil { - return err - } - endpoint.Policies = append(endpoint.Policies, jsonString) - } - - _, err := endpoint.Update() - return err -} - -// ApplyProxyPolicy applies a set of Proxy Policies on the Endpoint -func (endpoint *HNSEndpoint) ApplyProxyPolicy(policies ...*ProxyPolicy) error { - operation := "ApplyProxyPolicy" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - - for _, policy := range policies { - if policy == nil { - continue - } - jsonString, err := json.Marshal(policy) - if err != nil { - return err - } - endpoint.Policies = append(endpoint.Policies, jsonString) - } - - _, err := endpoint.Update() - return err -} - -// ContainerAttach attaches an endpoint to container -func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error { - operation := "ContainerAttach" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - - requestMessage := &EndpointAttachDetachRequest{ - ContainerID: containerID, - CompartmentID: compartmentID, - SystemType: ContainerType, - } - response := &EndpointResquestResponse{} - jsonString, err := json.Marshal(requestMessage) - if err != nil { - return err - } - return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) -} - -// ContainerDetach detaches an endpoint from container -func (endpoint *HNSEndpoint) ContainerDetach(containerID string) error { - operation := "ContainerDetach" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - - requestMessage := &EndpointAttachDetachRequest{ - ContainerID: containerID, - SystemType: ContainerType, - } - response := &EndpointResquestResponse{} - - jsonString, err := json.Marshal(requestMessage) - if err != nil { - return err - } - return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) -} - -// HostAttach attaches a nic on the host -func (endpoint *HNSEndpoint) HostAttach(compartmentID uint16) error { - operation := "HostAttach" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - requestMessage := &EndpointAttachDetachRequest{ - CompartmentID: compartmentID, - SystemType: HostType, - } - response := &EndpointResquestResponse{} - - jsonString, err := json.Marshal(requestMessage) - if err != nil { - return err - } - return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) - -} - -// HostDetach detaches a nic on the host -func (endpoint *HNSEndpoint) HostDetach() error { - operation := "HostDetach" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - requestMessage := &EndpointAttachDetachRequest{ - SystemType: HostType, - } - response := &EndpointResquestResponse{} - - jsonString, err := json.Marshal(requestMessage) - if err != nil { - return err - } - return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) -} - -// VirtualMachineNICAttach attaches a endpoint to a virtual machine -func (endpoint *HNSEndpoint) VirtualMachineNICAttach(virtualMachineNICName string) error { - operation := "VirtualMachineNicAttach" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - requestMessage := &EndpointAttachDetachRequest{ - VirtualNICName: virtualMachineNICName, - SystemType: VirtualMachineType, - } - response := &EndpointResquestResponse{} - - jsonString, err := json.Marshal(requestMessage) - if err != nil { - return err - } - return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) -} - -// VirtualMachineNICDetach detaches a endpoint from a virtual machine -func (endpoint *HNSEndpoint) VirtualMachineNICDetach() error { - operation := "VirtualMachineNicDetach" - title := "hcsshim::HNSEndpoint::" + operation - logrus.Debugf(title+" id=%s", endpoint.Id) - - requestMessage := &EndpointAttachDetachRequest{ - SystemType: VirtualMachineType, - } - response := &EndpointResquestResponse{} - - jsonString, err := json.Marshal(requestMessage) - if err != nil { - return err - } - return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go deleted file mode 100644 index 2df4a57f56..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go +++ /dev/null @@ -1,49 +0,0 @@ -package hns - -import ( - "encoding/json" - "fmt" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/interop" - "github.com/sirupsen/logrus" -) - -func hnsCallRawResponse(method, path, request string) (*hnsResponse, error) { - var responseBuffer *uint16 - logrus.Debugf("[%s]=>[%s] Request : %s", method, path, request) - - err := _hnsCall(method, path, request, &responseBuffer) - if err != nil { - return nil, hcserror.New(err, "hnsCall ", "") - } - response := interop.ConvertAndFreeCoTaskMemString(responseBuffer) - - hnsresponse := &hnsResponse{} - if err = json.Unmarshal([]byte(response), &hnsresponse); err != nil { - return nil, err - } - return hnsresponse, nil -} - -func hnsCall(method, path, request string, returnResponse interface{}) error { - hnsresponse, err := hnsCallRawResponse(method, path, request) - if err != nil { - return fmt.Errorf("failed during hnsCallRawResponse: %v", err) - } - if !hnsresponse.Success { - return fmt.Errorf("hns failed with error : %s", hnsresponse.Error) - } - - if len(hnsresponse.Output) == 0 { - return nil - } - - logrus.Debugf("Network Response : %s", hnsresponse.Output) - err = json.Unmarshal(hnsresponse.Output, returnResponse) - if err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go deleted file mode 100644 index a8d8cc56ae..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go +++ /dev/null @@ -1,28 +0,0 @@ -package hns - -type HNSGlobals struct { - Version HNSVersion `json:"Version"` -} - -type HNSVersion struct { - Major int `json:"Major"` - Minor int `json:"Minor"` -} - -var ( - HNSVersion1803 = HNSVersion{Major: 7, Minor: 2} -) - -func GetHNSGlobals() (*HNSGlobals, error) { - var version HNSVersion - err := hnsCall("GET", "/globals/version", "", &version) - if err != nil { - return nil, err - } - - globals := &HNSGlobals{ - Version: version, - } - - return globals, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go deleted file mode 100644 index f12d3ab041..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go +++ /dev/null @@ -1,141 +0,0 @@ -package hns - -import ( - "encoding/json" - "errors" - "github.com/sirupsen/logrus" - "net" -) - -// Subnet is assoicated with a network and represents a list -// of subnets available to the network -type Subnet struct { - AddressPrefix string `json:",omitempty"` - GatewayAddress string `json:",omitempty"` - Policies []json.RawMessage `json:",omitempty"` -} - -// MacPool is assoicated with a network and represents a list -// of macaddresses available to the network -type MacPool struct { - StartMacAddress string `json:",omitempty"` - EndMacAddress string `json:",omitempty"` -} - -// HNSNetwork represents a network in HNS -type HNSNetwork struct { - Id string `json:"ID,omitempty"` - Name string `json:",omitempty"` - Type string `json:",omitempty"` - NetworkAdapterName string `json:",omitempty"` - SourceMac string `json:",omitempty"` - Policies []json.RawMessage `json:",omitempty"` - MacPools []MacPool `json:",omitempty"` - Subnets []Subnet `json:",omitempty"` - DNSSuffix string `json:",omitempty"` - DNSServerList string `json:",omitempty"` - DNSServerCompartment uint32 `json:",omitempty"` - ManagementIP string `json:",omitempty"` - AutomaticDNS bool `json:",omitempty"` -} - -type hnsResponse struct { - Success bool - Error string - Output json.RawMessage -} - -// HNSNetworkRequest makes a call into HNS to update/query a single network -func HNSNetworkRequest(method, path, request string) (*HNSNetwork, error) { - var network HNSNetwork - err := hnsCall(method, "/networks/"+path, request, &network) - if err != nil { - return nil, err - } - - return &network, nil -} - -// HNSListNetworkRequest makes a HNS call to query the list of available networks -func HNSListNetworkRequest(method, path, request string) ([]HNSNetwork, error) { - var network []HNSNetwork - err := hnsCall(method, "/networks/"+path, request, &network) - if err != nil { - return nil, err - } - - return network, nil -} - -// GetHNSNetworkByID -func GetHNSNetworkByID(networkID string) (*HNSNetwork, error) { - return HNSNetworkRequest("GET", networkID, "") -} - -// GetHNSNetworkName filtered by Name -func GetHNSNetworkByName(networkName string) (*HNSNetwork, error) { - hsnnetworks, err := HNSListNetworkRequest("GET", "", "") - if err != nil { - return nil, err - } - for _, hnsnetwork := range hsnnetworks { - if hnsnetwork.Name == networkName { - return &hnsnetwork, nil - } - } - return nil, NetworkNotFoundError{NetworkName: networkName} -} - -// Create Network by sending NetworkRequest to HNS. -func (network *HNSNetwork) Create() (*HNSNetwork, error) { - operation := "Create" - title := "hcsshim::HNSNetwork::" + operation - logrus.Debugf(title+" id=%s", network.Id) - - for _, subnet := range network.Subnets { - if (subnet.AddressPrefix != "") && (subnet.GatewayAddress == "") { - return nil, errors.New("network create error, subnet has address prefix but no gateway specified") - } - } - - jsonString, err := json.Marshal(network) - if err != nil { - return nil, err - } - return HNSNetworkRequest("POST", "", string(jsonString)) -} - -// Delete Network by sending NetworkRequest to HNS -func (network *HNSNetwork) Delete() (*HNSNetwork, error) { - operation := "Delete" - title := "hcsshim::HNSNetwork::" + operation - logrus.Debugf(title+" id=%s", network.Id) - - return HNSNetworkRequest("DELETE", network.Id, "") -} - -// Creates an endpoint on the Network. -func (network *HNSNetwork) NewEndpoint(ipAddress net.IP, macAddress net.HardwareAddr) *HNSEndpoint { - return &HNSEndpoint{ - VirtualNetwork: network.Id, - IPAddress: ipAddress, - MacAddress: string(macAddress), - } -} - -func (network *HNSNetwork) CreateEndpoint(endpoint *HNSEndpoint) (*HNSEndpoint, error) { - operation := "CreateEndpoint" - title := "hcsshim::HNSNetwork::" + operation - logrus.Debugf(title+" id=%s, endpointId=%s", network.Id, endpoint.Id) - - endpoint.VirtualNetwork = network.Id - return endpoint.Create() -} - -func (network *HNSNetwork) CreateRemoteEndpoint(endpoint *HNSEndpoint) (*HNSEndpoint, error) { - operation := "CreateRemoteEndpoint" - title := "hcsshim::HNSNetwork::" + operation - logrus.Debugf(title+" id=%s", network.Id) - endpoint.IsRemoteEndpoint = true - return network.CreateEndpoint(endpoint) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go deleted file mode 100644 index 84b3682184..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go +++ /dev/null @@ -1,110 +0,0 @@ -package hns - -// Type of Request Support in ModifySystem -type PolicyType string - -// RequestType const -const ( - Nat PolicyType = "NAT" - ACL PolicyType = "ACL" - PA PolicyType = "PA" - VLAN PolicyType = "VLAN" - VSID PolicyType = "VSID" - VNet PolicyType = "VNET" - L2Driver PolicyType = "L2Driver" - Isolation PolicyType = "Isolation" - QOS PolicyType = "QOS" - OutboundNat PolicyType = "OutBoundNAT" - ExternalLoadBalancer PolicyType = "ELB" - Route PolicyType = "ROUTE" - Proxy PolicyType = "PROXY" -) - -type NatPolicy struct { - Type PolicyType `json:"Type"` - Protocol string `json:",omitempty"` - InternalPort uint16 `json:",omitempty"` - ExternalPort uint16 `json:",omitempty"` - ExternalPortReserved bool `json:",omitempty"` -} - -type QosPolicy struct { - Type PolicyType `json:"Type"` - MaximumOutgoingBandwidthInBytes uint64 -} - -type IsolationPolicy struct { - Type PolicyType `json:"Type"` - VLAN uint - VSID uint - InDefaultIsolation bool -} - -type VlanPolicy struct { - Type PolicyType `json:"Type"` - VLAN uint -} - -type VsidPolicy struct { - Type PolicyType `json:"Type"` - VSID uint -} - -type PaPolicy struct { - Type PolicyType `json:"Type"` - PA string `json:"PA"` -} - -type OutboundNatPolicy struct { - Policy - VIP string `json:"VIP,omitempty"` - Exceptions []string `json:"ExceptionList,omitempty"` - Destinations []string `json:",omitempty"` -} - -type ProxyPolicy struct { - Type PolicyType `json:"Type"` - IP string `json:",omitempty"` - Port string `json:",omitempty"` - ExceptionList []string `json:",omitempty"` - Destination string `json:",omitempty"` - OutboundNat bool `json:",omitempty"` -} - -type ActionType string -type DirectionType string -type RuleType string - -const ( - Allow ActionType = "Allow" - Block ActionType = "Block" - - In DirectionType = "In" - Out DirectionType = "Out" - - Host RuleType = "Host" - Switch RuleType = "Switch" -) - -type ACLPolicy struct { - Type PolicyType `json:"Type"` - Id string `json:"Id,omitempty"` - Protocol uint16 `json:",omitempty"` - Protocols string `json:"Protocols,omitempty"` - InternalPort uint16 `json:",omitempty"` - Action ActionType - Direction DirectionType - LocalAddresses string `json:",omitempty"` - RemoteAddresses string `json:",omitempty"` - LocalPorts string `json:"LocalPorts,omitempty"` - LocalPort uint16 `json:",omitempty"` - RemotePorts string `json:"RemotePorts,omitempty"` - RemotePort uint16 `json:",omitempty"` - RuleType RuleType `json:"RuleType,omitempty"` - Priority uint16 `json:",omitempty"` - ServiceName string `json:",omitempty"` -} - -type Policy struct { - Type PolicyType `json:"Type"` -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go deleted file mode 100644 index 31322a6816..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go +++ /dev/null @@ -1,201 +0,0 @@ -package hns - -import ( - "encoding/json" - - "github.com/sirupsen/logrus" -) - -// RoutePolicy is a structure defining schema for Route based Policy -type RoutePolicy struct { - Policy - DestinationPrefix string `json:"DestinationPrefix,omitempty"` - NextHop string `json:"NextHop,omitempty"` - EncapEnabled bool `json:"NeedEncap,omitempty"` -} - -// ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy -type ELBPolicy struct { - LBPolicy - SourceVIP string `json:"SourceVIP,omitempty"` - VIPs []string `json:"VIPs,omitempty"` - ILB bool `json:"ILB,omitempty"` - DSR bool `json:"IsDSR,omitempty"` -} - -// LBPolicy is a structure defining schema for LoadBalancing based Policy -type LBPolicy struct { - Policy - Protocol uint16 `json:"Protocol,omitempty"` - InternalPort uint16 - ExternalPort uint16 -} - -// PolicyList is a structure defining schema for Policy list request -type PolicyList struct { - ID string `json:"ID,omitempty"` - EndpointReferences []string `json:"References,omitempty"` - Policies []json.RawMessage `json:"Policies,omitempty"` -} - -// HNSPolicyListRequest makes a call into HNS to update/query a single network -func HNSPolicyListRequest(method, path, request string) (*PolicyList, error) { - var policy PolicyList - err := hnsCall(method, "/policylists/"+path, request, &policy) - if err != nil { - return nil, err - } - - return &policy, nil -} - -// HNSListPolicyListRequest gets all the policy list -func HNSListPolicyListRequest() ([]PolicyList, error) { - var plist []PolicyList - err := hnsCall("GET", "/policylists/", "", &plist) - if err != nil { - return nil, err - } - - return plist, nil -} - -// PolicyListRequest makes a HNS call to modify/query a network policy list -func PolicyListRequest(method, path, request string) (*PolicyList, error) { - policylist := &PolicyList{} - err := hnsCall(method, "/policylists/"+path, request, &policylist) - if err != nil { - return nil, err - } - - return policylist, nil -} - -// GetPolicyListByID get the policy list by ID -func GetPolicyListByID(policyListID string) (*PolicyList, error) { - return PolicyListRequest("GET", policyListID, "") -} - -// Create PolicyList by sending PolicyListRequest to HNS. -func (policylist *PolicyList) Create() (*PolicyList, error) { - operation := "Create" - title := "hcsshim::PolicyList::" + operation - logrus.Debugf(title+" id=%s", policylist.ID) - jsonString, err := json.Marshal(policylist) - if err != nil { - return nil, err - } - return PolicyListRequest("POST", "", string(jsonString)) -} - -// Delete deletes PolicyList -func (policylist *PolicyList) Delete() (*PolicyList, error) { - operation := "Delete" - title := "hcsshim::PolicyList::" + operation - logrus.Debugf(title+" id=%s", policylist.ID) - - return PolicyListRequest("DELETE", policylist.ID, "") -} - -// AddEndpoint add an endpoint to a Policy List -func (policylist *PolicyList) AddEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { - operation := "AddEndpoint" - title := "hcsshim::PolicyList::" + operation - logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) - - _, err := policylist.Delete() - if err != nil { - return nil, err - } - - // Add Endpoint to the Existing List - policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) - - return policylist.Create() -} - -// RemoveEndpoint removes an endpoint from the Policy List -func (policylist *PolicyList) RemoveEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { - operation := "RemoveEndpoint" - title := "hcsshim::PolicyList::" + operation - logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) - - _, err := policylist.Delete() - if err != nil { - return nil, err - } - - elementToRemove := "/endpoints/" + endpoint.Id - - var references []string - - for _, endpointReference := range policylist.EndpointReferences { - if endpointReference == elementToRemove { - continue - } - references = append(references, endpointReference) - } - policylist.EndpointReferences = references - return policylist.Create() -} - -// AddLoadBalancer policy list for the specified endpoints -func AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, sourceVIP, vip string, protocol uint16, internalPort uint16, externalPort uint16) (*PolicyList, error) { - operation := "AddLoadBalancer" - title := "hcsshim::PolicyList::" + operation - logrus.Debugf(title+" endpointId=%v, isILB=%v, sourceVIP=%s, vip=%s, protocol=%v, internalPort=%v, externalPort=%v", endpoints, isILB, sourceVIP, vip, protocol, internalPort, externalPort) - - policylist := &PolicyList{} - - elbPolicy := &ELBPolicy{ - SourceVIP: sourceVIP, - ILB: isILB, - } - - if len(vip) > 0 { - elbPolicy.VIPs = []string{vip} - } - elbPolicy.Type = ExternalLoadBalancer - elbPolicy.Protocol = protocol - elbPolicy.InternalPort = internalPort - elbPolicy.ExternalPort = externalPort - - for _, endpoint := range endpoints { - policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) - } - - jsonString, err := json.Marshal(elbPolicy) - if err != nil { - return nil, err - } - policylist.Policies = append(policylist.Policies, jsonString) - return policylist.Create() -} - -// AddRoute adds route policy list for the specified endpoints -func AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) { - operation := "AddRoute" - title := "hcsshim::PolicyList::" + operation - logrus.Debugf(title+" destinationPrefix:%s", destinationPrefix) - - policylist := &PolicyList{} - - rPolicy := &RoutePolicy{ - DestinationPrefix: destinationPrefix, - NextHop: nextHop, - EncapEnabled: encapEnabled, - } - rPolicy.Type = Route - - for _, endpoint := range endpoints { - policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) - } - - jsonString, err := json.Marshal(rPolicy) - if err != nil { - return nil, err - } - - policylist.Policies = append(policylist.Policies, jsonString) - return policylist.Create() -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go deleted file mode 100644 index d5efba7f28..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go +++ /dev/null @@ -1,49 +0,0 @@ -package hns - -import ( - "github.com/sirupsen/logrus" -) - -type HNSSupportedFeatures struct { - Acl HNSAclFeatures `json:"ACL"` -} - -type HNSAclFeatures struct { - AclAddressLists bool `json:"AclAddressLists"` - AclNoHostRulePriority bool `json:"AclHostRulePriority"` - AclPortRanges bool `json:"AclPortRanges"` - AclRuleId bool `json:"AclRuleId"` -} - -func GetHNSSupportedFeatures() HNSSupportedFeatures { - var hnsFeatures HNSSupportedFeatures - - globals, err := GetHNSGlobals() - if err != nil { - // Expected on pre-1803 builds, all features will be false/unsupported - logrus.Debugf("Unable to obtain HNS globals: %s", err) - return hnsFeatures - } - - hnsFeatures.Acl = HNSAclFeatures{ - AclAddressLists: isHNSFeatureSupported(globals.Version, HNSVersion1803), - AclNoHostRulePriority: isHNSFeatureSupported(globals.Version, HNSVersion1803), - AclPortRanges: isHNSFeatureSupported(globals.Version, HNSVersion1803), - AclRuleId: isHNSFeatureSupported(globals.Version, HNSVersion1803), - } - - return hnsFeatures -} - -func isHNSFeatureSupported(currentVersion HNSVersion, minVersionSupported HNSVersion) bool { - if currentVersion.Major < minVersionSupported.Major { - return false - } - if currentVersion.Major > minVersionSupported.Major { - return true - } - if currentVersion.Minor < minVersionSupported.Minor { - return false - } - return true -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go deleted file mode 100644 index d3b04eefe0..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go +++ /dev/null @@ -1,111 +0,0 @@ -package hns - -import ( - "encoding/json" - "fmt" - "os" - "path" - "strings" -) - -type namespaceRequest struct { - IsDefault bool `json:",omitempty"` -} - -type namespaceEndpointRequest struct { - ID string `json:"Id"` -} - -type NamespaceResource struct { - Type string - Data json.RawMessage -} - -type namespaceResourceRequest struct { - Type string - Data interface{} -} - -type Namespace struct { - ID string - IsDefault bool `json:",omitempty"` - ResourceList []NamespaceResource `json:",omitempty"` - CompartmentId uint32 `json:",omitempty"` -} - -func issueNamespaceRequest(id *string, method, subpath string, request interface{}) (*Namespace, error) { - var err error - hnspath := "/namespaces/" - if id != nil { - hnspath = path.Join(hnspath, *id) - } - if subpath != "" { - hnspath = path.Join(hnspath, subpath) - } - var reqJSON []byte - if request != nil { - if reqJSON, err = json.Marshal(request); err != nil { - return nil, err - } - } - var ns Namespace - err = hnsCall(method, hnspath, string(reqJSON), &ns) - if err != nil { - if strings.Contains(err.Error(), "Element not found.") { - return nil, os.ErrNotExist - } - return nil, fmt.Errorf("%s %s: %s", method, hnspath, err) - } - return &ns, err -} - -func CreateNamespace() (string, error) { - req := namespaceRequest{} - ns, err := issueNamespaceRequest(nil, "POST", "", &req) - if err != nil { - return "", err - } - return ns.ID, nil -} - -func RemoveNamespace(id string) error { - _, err := issueNamespaceRequest(&id, "DELETE", "", nil) - return err -} - -func GetNamespaceEndpoints(id string) ([]string, error) { - ns, err := issueNamespaceRequest(&id, "GET", "", nil) - if err != nil { - return nil, err - } - var endpoints []string - for _, rsrc := range ns.ResourceList { - if rsrc.Type == "Endpoint" { - var endpoint namespaceEndpointRequest - err = json.Unmarshal(rsrc.Data, &endpoint) - if err != nil { - return nil, fmt.Errorf("unmarshal endpoint: %s", err) - } - endpoints = append(endpoints, endpoint.ID) - } - } - return endpoints, nil -} - -func AddNamespaceEndpoint(id string, endpointID string) error { - resource := namespaceResourceRequest{ - Type: "Endpoint", - Data: namespaceEndpointRequest{endpointID}, - } - _, err := issueNamespaceRequest(&id, "POST", "addresource", &resource) - return err -} - -func RemoveNamespaceEndpoint(id string, endpointID string) error { - resource := namespaceResourceRequest{ - Type: "Endpoint", - Data: namespaceEndpointRequest{endpointID}, - } - _, err := issueNamespaceRequest(&id, "POST", "removeresource", &resource) - return err -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go deleted file mode 100644 index 204633a488..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go +++ /dev/null @@ -1,76 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package hns - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") - - procHNSCall = modvmcompute.NewProc("HNSCall") -) - -func _hnsCall(method string, path string, object string, response **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(method) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(path) - if hr != nil { - return - } - var _p2 *uint16 - _p2, hr = syscall.UTF16PtrFromString(object) - if hr != nil { - return - } - return __hnsCall(_p0, _p1, _p2, response) -} - -func __hnsCall(method *uint16, path *uint16, object *uint16, response **uint16) (hr error) { - if hr = procHNSCall.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHNSCall.Addr(), 4, uintptr(unsafe.Pointer(method)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(object)), uintptr(unsafe.Pointer(response)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go b/vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go deleted file mode 100644 index 922f7c679e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go +++ /dev/null @@ -1,23 +0,0 @@ -package interop - -import ( - "syscall" - "unsafe" -) - -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go interop.go - -//sys coTaskMemFree(buffer unsafe.Pointer) = api_ms_win_core_com_l1_1_0.CoTaskMemFree - -func ConvertAndFreeCoTaskMemString(buffer *uint16) string { - str := syscall.UTF16ToString((*[1 << 29]uint16)(unsafe.Pointer(buffer))[:]) - coTaskMemFree(unsafe.Pointer(buffer)) - return str -} - -func Win32FromHresult(hr uintptr) syscall.Errno { - if hr&0x1fff0000 == 0x00070000 { - return syscall.Errno(hr & 0xffff) - } - return syscall.Errno(hr) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go deleted file mode 100644 index 12b0c71c5a..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go +++ /dev/null @@ -1,48 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package interop - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modapi_ms_win_core_com_l1_1_0 = windows.NewLazySystemDLL("api-ms-win-core-com-l1-1-0.dll") - - procCoTaskMemFree = modapi_ms_win_core_com_l1_1_0.NewProc("CoTaskMemFree") -) - -func coTaskMemFree(buffer unsafe.Pointer) { - syscall.Syscall(procCoTaskMemFree.Addr(), 1, uintptr(buffer), 0, 0) - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go deleted file mode 100644 index 5d6acd69e6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go +++ /dev/null @@ -1,111 +0,0 @@ -package jobobject - -import ( - "context" - "fmt" - "sync" - "unsafe" - - "github.com/Microsoft/hcsshim/internal/log" - "github.com/Microsoft/hcsshim/internal/queue" - "github.com/Microsoft/hcsshim/internal/winapi" - "github.com/sirupsen/logrus" - "golang.org/x/sys/windows" -) - -var ( - ioInitOnce sync.Once - initIOErr error - // Global iocp handle that will be re-used for every job object - ioCompletionPort windows.Handle - // Mapping of job handle to queue to place notifications in. - jobMap sync.Map -) - -// MsgAllProcessesExited is a type representing a message that every process in a job has exited. -type MsgAllProcessesExited struct{} - -// MsgUnimplemented represents a message that we are aware of, but that isn't implemented currently. -// This should not be treated as an error. -type MsgUnimplemented struct{} - -// pollIOCP polls the io completion port forever. -func pollIOCP(ctx context.Context, iocpHandle windows.Handle) { - var ( - overlapped uintptr - code uint32 - key uintptr - ) - - for { - err := windows.GetQueuedCompletionStatus(iocpHandle, &code, &key, (**windows.Overlapped)(unsafe.Pointer(&overlapped)), windows.INFINITE) - if err != nil { - log.G(ctx).WithError(err).Error("failed to poll for job object message") - continue - } - if val, ok := jobMap.Load(key); ok { - msq, ok := val.(*queue.MessageQueue) - if !ok { - log.G(ctx).WithField("value", msq).Warn("encountered non queue type in job map") - continue - } - notification, err := parseMessage(code, overlapped) - if err != nil { - log.G(ctx).WithFields(logrus.Fields{ - "code": code, - "overlapped": overlapped, - }).Warn("failed to parse job object message") - continue - } - if err := msq.Enqueue(notification); err == queue.ErrQueueClosed { - // Write will only return an error when the queue is closed. - // The only time a queue would ever be closed is when we call `Close` on - // the job it belongs to which also removes it from the jobMap, so something - // went wrong here. We can't return as this is reading messages for all jobs - // so just log it and move on. - log.G(ctx).WithFields(logrus.Fields{ - "code": code, - "overlapped": overlapped, - }).Warn("tried to write to a closed queue") - continue - } - } else { - log.G(ctx).Warn("received a message for a job not present in the mapping") - } - } -} - -func parseMessage(code uint32, overlapped uintptr) (interface{}, error) { - // Check code and parse out relevant information related to that notification - // that we care about. For now all we handle is the message that all processes - // in the job have exited. - switch code { - case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO: - return MsgAllProcessesExited{}, nil - // Other messages for completeness and a check to make sure that if we fall - // into the default case that this is a code we don't know how to handle. - case winapi.JOB_OBJECT_MSG_END_OF_JOB_TIME: - case winapi.JOB_OBJECT_MSG_END_OF_PROCESS_TIME: - case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT: - case winapi.JOB_OBJECT_MSG_NEW_PROCESS: - case winapi.JOB_OBJECT_MSG_EXIT_PROCESS: - case winapi.JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS: - case winapi.JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT: - case winapi.JOB_OBJECT_MSG_JOB_MEMORY_LIMIT: - case winapi.JOB_OBJECT_MSG_NOTIFICATION_LIMIT: - default: - return nil, fmt.Errorf("unknown job notification type: %d", code) - } - return MsgUnimplemented{}, nil -} - -// Assigns an IO completion port to get notified of events for the registered job -// object. -func attachIOCP(job windows.Handle, iocp windows.Handle) error { - info := winapi.JOBOBJECT_ASSOCIATE_COMPLETION_PORT{ - CompletionKey: job, - CompletionPort: iocp, - } - _, err := windows.SetInformationJobObject(job, windows.JobObjectAssociateCompletionPortInformation, uintptr(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info))) - return err -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go deleted file mode 100644 index c9fdd921a7..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go +++ /dev/null @@ -1,538 +0,0 @@ -package jobobject - -import ( - "context" - "errors" - "fmt" - "sync" - "unsafe" - - "github.com/Microsoft/hcsshim/internal/queue" - "github.com/Microsoft/hcsshim/internal/winapi" - "golang.org/x/sys/windows" -) - -// This file provides higher level constructs for the win32 job object API. -// Most of the core creation and management functions are already present in "golang.org/x/sys/windows" -// (CreateJobObject, AssignProcessToJobObject, etc.) as well as most of the limit information -// structs and associated limit flags. Whatever is not present from the job object API -// in golang.org/x/sys/windows is located in /internal/winapi. -// -// https://docs.microsoft.com/en-us/windows/win32/procthread/job-objects - -// JobObject is a high level wrapper around a Windows job object. Holds a handle to -// the job, a queue to receive iocp notifications about the lifecycle -// of the job and a mutex for synchronized handle access. -type JobObject struct { - handle windows.Handle - mq *queue.MessageQueue - handleLock sync.RWMutex -} - -// JobLimits represents the resource constraints that can be applied to a job object. -type JobLimits struct { - CPULimit uint32 - CPUWeight uint32 - MemoryLimitInBytes uint64 - MaxIOPS int64 - MaxBandwidth int64 -} - -type CPURateControlType uint32 - -const ( - WeightBased CPURateControlType = iota - RateBased -) - -// Processor resource controls -const ( - cpuLimitMin = 1 - cpuLimitMax = 10000 - cpuWeightMin = 1 - cpuWeightMax = 9 -) - -var ( - ErrAlreadyClosed = errors.New("the handle has already been closed") - ErrNotRegistered = errors.New("job is not registered to receive notifications") -) - -// Options represents the set of configurable options when making or opening a job object. -type Options struct { - // `Name` specifies the name of the job object if a named job object is desired. - Name string - // `Notifications` specifies if the job will be registered to receive notifications. - // Defaults to false. - Notifications bool - // `UseNTVariant` specifies if we should use the `Nt` variant of Open/CreateJobObject. - // Defaults to false. - UseNTVariant bool - // `IOTracking` enables tracking I/O statistics on the job object. More specifically this - // calls SetInformationJobObject with the JobObjectIoAttribution class. - EnableIOTracking bool -} - -// Create creates a job object. -// -// If options.Name is an empty string, the job will not be assigned a name. -// -// If options.Notifications are not enabled `PollNotifications` will return immediately with error `errNotRegistered`. -// -// If `options` is nil, use default option values. -// -// Returns a JobObject structure and an error if there is one. -func Create(ctx context.Context, options *Options) (_ *JobObject, err error) { - if options == nil { - options = &Options{} - } - - var jobName *winapi.UnicodeString - if options.Name != "" { - jobName, err = winapi.NewUnicodeString(options.Name) - if err != nil { - return nil, err - } - } - - var jobHandle windows.Handle - if options.UseNTVariant { - oa := winapi.ObjectAttributes{ - Length: unsafe.Sizeof(winapi.ObjectAttributes{}), - ObjectName: jobName, - Attributes: 0, - } - status := winapi.NtCreateJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa) - if status != 0 { - return nil, winapi.RtlNtStatusToDosError(status) - } - } else { - var jobNameBuf *uint16 - if jobName != nil && jobName.Buffer != nil { - jobNameBuf = jobName.Buffer - } - jobHandle, err = windows.CreateJobObject(nil, jobNameBuf) - if err != nil { - return nil, err - } - } - - defer func() { - if err != nil { - windows.Close(jobHandle) - } - }() - - job := &JobObject{ - handle: jobHandle, - } - - // If the IOCP we'll be using to receive messages for all jobs hasn't been - // created, create it and start polling. - if options.Notifications { - mq, err := setupNotifications(ctx, job) - if err != nil { - return nil, err - } - job.mq = mq - } - - if options.EnableIOTracking { - if err := enableIOTracking(jobHandle); err != nil { - return nil, err - } - } - - return job, nil -} - -// Open opens an existing job object with name provided in `options`. If no name is provided -// return an error since we need to know what job object to open. -// -// If options.Notifications is false `PollNotifications` will return immediately with error `errNotRegistered`. -// -// Returns a JobObject structure and an error if there is one. -func Open(ctx context.Context, options *Options) (_ *JobObject, err error) { - if options == nil || (options != nil && options.Name == "") { - return nil, errors.New("no job object name specified to open") - } - - unicodeJobName, err := winapi.NewUnicodeString(options.Name) - if err != nil { - return nil, err - } - - var jobHandle windows.Handle - if options != nil && options.UseNTVariant { - oa := winapi.ObjectAttributes{ - Length: unsafe.Sizeof(winapi.ObjectAttributes{}), - ObjectName: unicodeJobName, - Attributes: 0, - } - status := winapi.NtOpenJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa) - if status != 0 { - return nil, winapi.RtlNtStatusToDosError(status) - } - } else { - jobHandle, err = winapi.OpenJobObject(winapi.JOB_OBJECT_ALL_ACCESS, false, unicodeJobName.Buffer) - if err != nil { - return nil, err - } - } - - defer func() { - if err != nil { - windows.Close(jobHandle) - } - }() - - job := &JobObject{ - handle: jobHandle, - } - - // If the IOCP we'll be using to receive messages for all jobs hasn't been - // created, create it and start polling. - if options != nil && options.Notifications { - mq, err := setupNotifications(ctx, job) - if err != nil { - return nil, err - } - job.mq = mq - } - - return job, nil -} - -// helper function to setup notifications for creating/opening a job object -func setupNotifications(ctx context.Context, job *JobObject) (*queue.MessageQueue, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - ioInitOnce.Do(func() { - h, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0xffffffff) - if err != nil { - initIOErr = err - return - } - ioCompletionPort = h - go pollIOCP(ctx, h) - }) - - if initIOErr != nil { - return nil, initIOErr - } - - mq := queue.NewMessageQueue() - jobMap.Store(uintptr(job.handle), mq) - if err := attachIOCP(job.handle, ioCompletionPort); err != nil { - jobMap.Delete(uintptr(job.handle)) - return nil, fmt.Errorf("failed to attach job to IO completion port: %w", err) - } - return mq, nil -} - -// PollNotification will poll for a job object notification. This call should only be called once -// per job (ideally in a goroutine loop) and will block if there is not a notification ready. -// This call will return immediately with error `ErrNotRegistered` if the job was not registered -// to receive notifications during `Create`. Internally, messages will be queued and there -// is no worry of messages being dropped. -func (job *JobObject) PollNotification() (interface{}, error) { - if job.mq == nil { - return nil, ErrNotRegistered - } - return job.mq.Dequeue() -} - -// UpdateProcThreadAttribute updates the passed in ProcThreadAttributeList to contain what is necessary to -// launch a process in a job at creation time. This can be used to avoid having to call Assign() after a process -// has already started running. -func (job *JobObject) UpdateProcThreadAttribute(attrList *windows.ProcThreadAttributeListContainer) error { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return ErrAlreadyClosed - } - - if err := attrList.Update( - winapi.PROC_THREAD_ATTRIBUTE_JOB_LIST, - unsafe.Pointer(&job.handle), - unsafe.Sizeof(job.handle), - ); err != nil { - return fmt.Errorf("failed to update proc thread attributes for job object: %w", err) - } - - return nil -} - -// Close closes the job object handle. -func (job *JobObject) Close() error { - job.handleLock.Lock() - defer job.handleLock.Unlock() - - if job.handle == 0 { - return ErrAlreadyClosed - } - - if err := windows.Close(job.handle); err != nil { - return err - } - - if job.mq != nil { - job.mq.Close() - } - // Handles now invalid so if the map entry to receive notifications for this job still - // exists remove it so we can stop receiving notifications. - if _, ok := jobMap.Load(uintptr(job.handle)); ok { - jobMap.Delete(uintptr(job.handle)) - } - - job.handle = 0 - return nil -} - -// Assign assigns a process to the job object. -func (job *JobObject) Assign(pid uint32) error { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return ErrAlreadyClosed - } - - if pid == 0 { - return errors.New("invalid pid: 0") - } - hProc, err := windows.OpenProcess(winapi.PROCESS_ALL_ACCESS, true, pid) - if err != nil { - return err - } - defer windows.Close(hProc) - return windows.AssignProcessToJobObject(job.handle, hProc) -} - -// Terminate terminates the job, essentially calls TerminateProcess on every process in the -// job. -func (job *JobObject) Terminate(exitCode uint32) error { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - if job.handle == 0 { - return ErrAlreadyClosed - } - return windows.TerminateJobObject(job.handle, exitCode) -} - -// Pids returns all of the process IDs in the job object. -func (job *JobObject) Pids() ([]uint32, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - info := winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST{} - err := winapi.QueryInformationJobObject( - job.handle, - winapi.JobObjectBasicProcessIdList, - unsafe.Pointer(&info), - uint32(unsafe.Sizeof(info)), - nil, - ) - - // This is either the case where there is only one process or no processes in - // the job. Any other case will result in ERROR_MORE_DATA. Check if info.NumberOfProcessIdsInList - // is 1 and just return this, otherwise return an empty slice. - if err == nil { - if info.NumberOfProcessIdsInList == 1 { - return []uint32{uint32(info.ProcessIdList[0])}, nil - } - // Return empty slice instead of nil to play well with the caller of this. - // Do not return an error if no processes are running inside the job - return []uint32{}, nil - } - - if err != winapi.ERROR_MORE_DATA { - return nil, fmt.Errorf("failed initial query for PIDs in job object: %w", err) - } - - jobBasicProcessIDListSize := unsafe.Sizeof(info) + (unsafe.Sizeof(info.ProcessIdList[0]) * uintptr(info.NumberOfAssignedProcesses-1)) - buf := make([]byte, jobBasicProcessIDListSize) - if err = winapi.QueryInformationJobObject( - job.handle, - winapi.JobObjectBasicProcessIdList, - unsafe.Pointer(&buf[0]), - uint32(len(buf)), - nil, - ); err != nil { - return nil, fmt.Errorf("failed to query for PIDs in job object: %w", err) - } - - bufInfo := (*winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST)(unsafe.Pointer(&buf[0])) - pids := make([]uint32, bufInfo.NumberOfProcessIdsInList) - for i, bufPid := range bufInfo.AllPids() { - pids[i] = uint32(bufPid) - } - return pids, nil -} - -// QueryMemoryStats gets the memory stats for the job object. -func (job *JobObject) QueryMemoryStats() (*winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - info := winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION{} - if err := winapi.QueryInformationJobObject( - job.handle, - winapi.JobObjectMemoryUsageInformation, - unsafe.Pointer(&info), - uint32(unsafe.Sizeof(info)), - nil, - ); err != nil { - return nil, fmt.Errorf("failed to query for job object memory stats: %w", err) - } - return &info, nil -} - -// QueryProcessorStats gets the processor stats for the job object. -func (job *JobObject) QueryProcessorStats() (*winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - info := winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION{} - if err := winapi.QueryInformationJobObject( - job.handle, - winapi.JobObjectBasicAccountingInformation, - unsafe.Pointer(&info), - uint32(unsafe.Sizeof(info)), - nil, - ); err != nil { - return nil, fmt.Errorf("failed to query for job object process stats: %w", err) - } - return &info, nil -} - -// QueryStorageStats gets the storage (I/O) stats for the job object. This call will error -// if either `EnableIOTracking` wasn't set to true on creation of the job, or SetIOTracking() -// hasn't been called since creation of the job. -func (job *JobObject) QueryStorageStats() (*winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{ - ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE, - } - if err := winapi.QueryInformationJobObject( - job.handle, - winapi.JobObjectIoAttribution, - unsafe.Pointer(&info), - uint32(unsafe.Sizeof(info)), - nil, - ); err != nil { - return nil, fmt.Errorf("failed to query for job object storage stats: %w", err) - } - return &info, nil -} - -// QueryPrivateWorkingSet returns the private working set size for the job. This is calculated by adding up the -// private working set for every process running in the job. -func (job *JobObject) QueryPrivateWorkingSet() (uint64, error) { - pids, err := job.Pids() - if err != nil { - return 0, err - } - - openAndQueryWorkingSet := func(pid uint32) (uint64, error) { - h, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, pid) - if err != nil { - // Continue to the next if OpenProcess doesn't return a valid handle (fails). Handles a - // case where one of the pids in the job exited before we open. - return 0, nil - } - defer func() { - _ = windows.Close(h) - }() - // Check if the process is actually running in the job still. There's a small chance - // that the process could have exited and had its pid re-used between grabbing the pids - // in the job and opening the handle to it above. - var inJob int32 - if err := winapi.IsProcessInJob(h, job.handle, &inJob); err != nil { - // This shouldn't fail unless we have incorrect access rights which we control - // here so probably best to error out if this failed. - return 0, err - } - // Don't report stats for this process as it's not running in the job. This shouldn't be - // an error condition though. - if inJob == 0 { - return 0, nil - } - - var vmCounters winapi.VM_COUNTERS_EX2 - status := winapi.NtQueryInformationProcess( - h, - winapi.ProcessVmCounters, - unsafe.Pointer(&vmCounters), - uint32(unsafe.Sizeof(vmCounters)), - nil, - ) - if !winapi.NTSuccess(status) { - return 0, fmt.Errorf("failed to query information for process: %w", winapi.RtlNtStatusToDosError(status)) - } - return uint64(vmCounters.PrivateWorkingSetSize), nil - } - - var jobWorkingSetSize uint64 - for _, pid := range pids { - workingSet, err := openAndQueryWorkingSet(pid) - if err != nil { - return 0, err - } - jobWorkingSetSize += workingSet - } - - return jobWorkingSetSize, nil -} - -// SetIOTracking enables IO tracking for processes in the job object. -// This enables use of the QueryStorageStats method. -func (job *JobObject) SetIOTracking() error { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return ErrAlreadyClosed - } - - return enableIOTracking(job.handle) -} - -func enableIOTracking(job windows.Handle) error { - info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{ - ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE, - } - if _, err := windows.SetInformationJobObject( - job, - winapi.JobObjectIoAttribution, - uintptr(unsafe.Pointer(&info)), - uint32(unsafe.Sizeof(info)), - ); err != nil { - return fmt.Errorf("failed to enable IO tracking on job object: %w", err) - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go deleted file mode 100644 index 4efde292c4..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go +++ /dev/null @@ -1,315 +0,0 @@ -package jobobject - -import ( - "errors" - "fmt" - "unsafe" - - "github.com/Microsoft/hcsshim/internal/winapi" - "golang.org/x/sys/windows" -) - -const ( - memoryLimitMax uint64 = 0xffffffffffffffff -) - -func isFlagSet(flag, controlFlags uint32) bool { - return (flag & controlFlags) == flag -} - -// SetResourceLimits sets resource limits on the job object (cpu, memory, storage). -func (job *JobObject) SetResourceLimits(limits *JobLimits) error { - // Go through and check what limits were specified and apply them to the job. - if limits.MemoryLimitInBytes != 0 { - if err := job.SetMemoryLimit(limits.MemoryLimitInBytes); err != nil { - return fmt.Errorf("failed to set job object memory limit: %w", err) - } - } - - if limits.CPULimit != 0 { - if err := job.SetCPULimit(RateBased, limits.CPULimit); err != nil { - return fmt.Errorf("failed to set job object cpu limit: %w", err) - } - } else if limits.CPUWeight != 0 { - if err := job.SetCPULimit(WeightBased, limits.CPUWeight); err != nil { - return fmt.Errorf("failed to set job object cpu limit: %w", err) - } - } - - if limits.MaxBandwidth != 0 || limits.MaxIOPS != 0 { - if err := job.SetIOLimit(limits.MaxBandwidth, limits.MaxIOPS); err != nil { - return fmt.Errorf("failed to set io limit on job object: %w", err) - } - } - return nil -} - -// SetTerminateOnLastHandleClose sets the job object flag that specifies that the job should terminate -// all processes in the job on the last open handle being closed. -func (job *JobObject) SetTerminateOnLastHandleClose() error { - info, err := job.getExtendedInformation() - if err != nil { - return err - } - info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE - return job.setExtendedInformation(info) -} - -// SetMemoryLimit sets the memory limit of the job object based on the given `memoryLimitInBytes`. -func (job *JobObject) SetMemoryLimit(memoryLimitInBytes uint64) error { - if memoryLimitInBytes >= memoryLimitMax { - return errors.New("memory limit specified exceeds the max size") - } - - info, err := job.getExtendedInformation() - if err != nil { - return err - } - - info.JobMemoryLimit = uintptr(memoryLimitInBytes) - info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_JOB_MEMORY - return job.setExtendedInformation(info) -} - -// GetMemoryLimit gets the memory limit in bytes of the job object. -func (job *JobObject) GetMemoryLimit() (uint64, error) { - info, err := job.getExtendedInformation() - if err != nil { - return 0, err - } - return uint64(info.JobMemoryLimit), nil -} - -// SetCPULimit sets the CPU limit depending on the specified `CPURateControlType` to -// `rateControlValue` for the job object. -func (job *JobObject) SetCPULimit(rateControlType CPURateControlType, rateControlValue uint32) error { - cpuInfo, err := job.getCPURateControlInformation() - if err != nil { - return err - } - switch rateControlType { - case WeightBased: - if rateControlValue < cpuWeightMin || rateControlValue > cpuWeightMax { - return fmt.Errorf("processor weight value of `%d` is invalid", rateControlValue) - } - cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED - cpuInfo.Value = rateControlValue - case RateBased: - if rateControlValue < cpuLimitMin || rateControlValue > cpuLimitMax { - return fmt.Errorf("processor rate of `%d` is invalid", rateControlValue) - } - cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP - cpuInfo.Value = rateControlValue - default: - return errors.New("invalid job object cpu rate control type") - } - return job.setCPURateControlInfo(cpuInfo) -} - -// GetCPULimit gets the cpu limits for the job object. -// `rateControlType` is used to indicate what type of cpu limit to query for. -func (job *JobObject) GetCPULimit(rateControlType CPURateControlType) (uint32, error) { - info, err := job.getCPURateControlInformation() - if err != nil { - return 0, err - } - - if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE, info.ControlFlags) { - return 0, errors.New("the job does not have cpu rate control enabled") - } - - switch rateControlType { - case WeightBased: - if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED, info.ControlFlags) { - return 0, errors.New("cannot get cpu weight for job object without cpu weight option set") - } - case RateBased: - if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP, info.ControlFlags) { - return 0, errors.New("cannot get cpu rate hard cap for job object without cpu rate hard cap option set") - } - default: - return 0, errors.New("invalid job object cpu rate control type") - } - return info.Value, nil -} - -// SetCPUAffinity sets the processor affinity for the job object. -// The affinity is passed in as a bitmask. -func (job *JobObject) SetCPUAffinity(affinityBitMask uint64) error { - info, err := job.getExtendedInformation() - if err != nil { - return err - } - info.BasicLimitInformation.LimitFlags |= uint32(windows.JOB_OBJECT_LIMIT_AFFINITY) - info.BasicLimitInformation.Affinity = uintptr(affinityBitMask) - return job.setExtendedInformation(info) -} - -// GetCPUAffinity gets the processor affinity for the job object. -// The returned affinity is a bitmask. -func (job *JobObject) GetCPUAffinity() (uint64, error) { - info, err := job.getExtendedInformation() - if err != nil { - return 0, err - } - return uint64(info.BasicLimitInformation.Affinity), nil -} - -// SetIOLimit sets the IO limits specified on the job object. -func (job *JobObject) SetIOLimit(maxBandwidth, maxIOPS int64) error { - ioInfo, err := job.getIOLimit() - if err != nil { - return err - } - ioInfo.ControlFlags |= winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE - if maxBandwidth != 0 { - ioInfo.MaxBandwidth = maxBandwidth - } - if maxIOPS != 0 { - ioInfo.MaxIops = maxIOPS - } - return job.setIORateControlInfo(ioInfo) -} - -// GetIOMaxBandwidthLimit gets the max bandwidth for the job object. -func (job *JobObject) GetIOMaxBandwidthLimit() (int64, error) { - info, err := job.getIOLimit() - if err != nil { - return 0, err - } - return info.MaxBandwidth, nil -} - -// GetIOMaxIopsLimit gets the max iops for the job object. -func (job *JobObject) GetIOMaxIopsLimit() (int64, error) { - info, err := job.getIOLimit() - if err != nil { - return 0, err - } - return info.MaxIops, nil -} - -// Helper function for getting a job object's extended information. -func (job *JobObject) getExtendedInformation() (*windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - info := windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION{} - if err := winapi.QueryInformationJobObject( - job.handle, - windows.JobObjectExtendedLimitInformation, - unsafe.Pointer(&info), - uint32(unsafe.Sizeof(info)), - nil, - ); err != nil { - return nil, fmt.Errorf("query %v returned error: %w", info, err) - } - return &info, nil -} - -// Helper function for getting a job object's CPU rate control information. -func (job *JobObject) getCPURateControlInformation() (*winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - info := winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION{} - if err := winapi.QueryInformationJobObject( - job.handle, - windows.JobObjectCpuRateControlInformation, - unsafe.Pointer(&info), - uint32(unsafe.Sizeof(info)), - nil, - ); err != nil { - return nil, fmt.Errorf("query %v returned error: %w", info, err) - } - return &info, nil -} - -// Helper function for setting a job object's extended information. -func (job *JobObject) setExtendedInformation(info *windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION) error { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return ErrAlreadyClosed - } - - if _, err := windows.SetInformationJobObject( - job.handle, - windows.JobObjectExtendedLimitInformation, - uintptr(unsafe.Pointer(info)), - uint32(unsafe.Sizeof(*info)), - ); err != nil { - return fmt.Errorf("failed to set Extended info %v on job object: %w", info, err) - } - return nil -} - -// Helper function for querying job handle for IO limit information. -func (job *JobObject) getIOLimit() (*winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION, error) { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return nil, ErrAlreadyClosed - } - - ioInfo := &winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION{} - var blockCount uint32 = 1 - - if _, err := winapi.QueryIoRateControlInformationJobObject( - job.handle, - nil, - &ioInfo, - &blockCount, - ); err != nil { - return nil, fmt.Errorf("query %v returned error: %w", ioInfo, err) - } - - if !isFlagSet(winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE, ioInfo.ControlFlags) { - return nil, fmt.Errorf("query %v cannot get IO limits for job object without IO rate control option set", ioInfo) - } - return ioInfo, nil -} - -// Helper function for setting a job object's IO rate control information. -func (job *JobObject) setIORateControlInfo(ioInfo *winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION) error { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return ErrAlreadyClosed - } - - if _, err := winapi.SetIoRateControlInformationJobObject(job.handle, ioInfo); err != nil { - return fmt.Errorf("failed to set IO limit info %v on job object: %w", ioInfo, err) - } - return nil -} - -// Helper function for setting a job object's CPU rate control information. -func (job *JobObject) setCPURateControlInfo(cpuInfo *winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION) error { - job.handleLock.RLock() - defer job.handleLock.RUnlock() - - if job.handle == 0 { - return ErrAlreadyClosed - } - if _, err := windows.SetInformationJobObject( - job.handle, - windows.JobObjectCpuRateControlInformation, - uintptr(unsafe.Pointer(cpuInfo)), - uint32(unsafe.Sizeof(cpuInfo)), - ); err != nil { - return fmt.Errorf("failed to set cpu limit info %v on job object: %w", cpuInfo, err) - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/log/g.go b/vendor/github.com/Microsoft/hcsshim/internal/log/g.go deleted file mode 100644 index ba6b1a4a53..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/log/g.go +++ /dev/null @@ -1,23 +0,0 @@ -package log - -import ( - "context" - - "github.com/sirupsen/logrus" - "go.opencensus.io/trace" -) - -// G returns a `logrus.Entry` with the `TraceID, SpanID` from `ctx` if `ctx` -// contains an OpenCensus `trace.Span`. -func G(ctx context.Context) *logrus.Entry { - span := trace.FromContext(ctx) - if span != nil { - sctx := span.SpanContext() - return logrus.WithFields(logrus.Fields{ - "traceID": sctx.TraceID.String(), - "spanID": sctx.SpanID.String(), - // "parentSpanID": TODO: JTERRY75 - Try to convince OC to export this? - }) - } - return logrus.NewEntry(logrus.StandardLogger()) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go b/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go deleted file mode 100644 index cf2c166d9b..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go +++ /dev/null @@ -1,32 +0,0 @@ -package logfields - -const ( - // Identifiers - - ContainerID = "cid" - UVMID = "uvm-id" - ProcessID = "pid" - - // Common Misc - - // Timeout represents an operation timeout. - Timeout = "timeout" - JSON = "json" - - // Keys/values - - Field = "field" - OCIAnnotation = "oci-annotation" - Value = "value" - - // Golang type's - - ExpectedType = "expected-type" - Bool = "bool" - Uint32 = "uint32" - Uint64 = "uint64" - - // runhcs - - VMShimOperation = "vmshim-op" -) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/longpath/longpath.go b/vendor/github.com/Microsoft/hcsshim/internal/longpath/longpath.go deleted file mode 100644 index e5b8b85e09..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/longpath/longpath.go +++ /dev/null @@ -1,24 +0,0 @@ -package longpath - -import ( - "path/filepath" - "strings" -) - -// LongAbs makes a path absolute and returns it in NT long path form. -func LongAbs(path string) (string, error) { - if strings.HasPrefix(path, `\\?\`) || strings.HasPrefix(path, `\\.\`) { - return path, nil - } - if !filepath.IsAbs(path) { - absPath, err := filepath.Abs(path) - if err != nil { - return "", err - } - path = absPath - } - if strings.HasPrefix(path, `\\`) { - return `\\?\UNC\` + path[2:], nil - } - return `\\?\` + path, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/mergemaps/merge.go b/vendor/github.com/Microsoft/hcsshim/internal/mergemaps/merge.go deleted file mode 100644 index 7e95efb30d..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/mergemaps/merge.go +++ /dev/null @@ -1,52 +0,0 @@ -package mergemaps - -import "encoding/json" - -// Merge recursively merges map `fromMap` into map `ToMap`. Any pre-existing values -// in ToMap are overwritten. Values in fromMap are added to ToMap. -// From http://stackoverflow.com/questions/40491438/merging-two-json-strings-in-golang -func Merge(fromMap, ToMap interface{}) interface{} { - switch fromMap := fromMap.(type) { - case map[string]interface{}: - ToMap, ok := ToMap.(map[string]interface{}) - if !ok { - return fromMap - } - for keyToMap, valueToMap := range ToMap { - if valueFromMap, ok := fromMap[keyToMap]; ok { - fromMap[keyToMap] = Merge(valueFromMap, valueToMap) - } else { - fromMap[keyToMap] = valueToMap - } - } - case nil: - // merge(nil, map[string]interface{...}) -> map[string]interface{...} - ToMap, ok := ToMap.(map[string]interface{}) - if ok { - return ToMap - } - } - return fromMap -} - -// MergeJSON merges the contents of a JSON string into an object representation, -// returning a new object suitable for translating to JSON. -func MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) { - if len(additionalJSON) == 0 { - return object, nil - } - objectJSON, err := json.Marshal(object) - if err != nil { - return nil, err - } - var objectMap, newMap map[string]interface{} - err = json.Unmarshal(objectJSON, &objectMap) - if err != nil { - return nil, err - } - err = json.Unmarshal(additionalJSON, &newMap) - if err != nil { - return nil, err - } - return Merge(newMap, objectMap), nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/oc/exporter.go b/vendor/github.com/Microsoft/hcsshim/internal/oc/exporter.go deleted file mode 100644 index f428bdaf72..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/oc/exporter.go +++ /dev/null @@ -1,43 +0,0 @@ -package oc - -import ( - "github.com/sirupsen/logrus" - "go.opencensus.io/trace" -) - -var _ = (trace.Exporter)(&LogrusExporter{}) - -// LogrusExporter is an OpenCensus `trace.Exporter` that exports -// `trace.SpanData` to logrus output. -type LogrusExporter struct { -} - -// ExportSpan exports `s` based on the the following rules: -// -// 1. All output will contain `s.Attributes`, `s.TraceID`, `s.SpanID`, -// `s.ParentSpanID` for correlation -// -// 2. Any calls to .Annotate will not be supported. -// -// 3. The span itself will be written at `logrus.InfoLevel` unless -// `s.Status.Code != 0` in which case it will be written at `logrus.ErrorLevel` -// providing `s.Status.Message` as the error value. -func (le *LogrusExporter) ExportSpan(s *trace.SpanData) { - // Combine all span annotations with traceID, spanID, parentSpanID - baseEntry := logrus.WithFields(logrus.Fields(s.Attributes)) - baseEntry.Data["traceID"] = s.TraceID.String() - baseEntry.Data["spanID"] = s.SpanID.String() - baseEntry.Data["parentSpanID"] = s.ParentSpanID.String() - baseEntry.Data["startTime"] = s.StartTime - baseEntry.Data["endTime"] = s.EndTime - baseEntry.Data["duration"] = s.EndTime.Sub(s.StartTime).String() - baseEntry.Data["name"] = s.Name - baseEntry.Time = s.StartTime - - level := logrus.InfoLevel - if s.Status.Code != 0 { - level = logrus.ErrorLevel - baseEntry.Data[logrus.ErrorKey] = s.Status.Message - } - baseEntry.Log(level, "Span") -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/oc/span.go b/vendor/github.com/Microsoft/hcsshim/internal/oc/span.go deleted file mode 100644 index fee4765cbc..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/oc/span.go +++ /dev/null @@ -1,17 +0,0 @@ -package oc - -import ( - "go.opencensus.io/trace" -) - -// SetSpanStatus sets `span.SetStatus` to the proper status depending on `err`. If -// `err` is `nil` assumes `trace.StatusCodeOk`. -func SetSpanStatus(span *trace.Span, err error) { - status := trace.Status{} - if err != nil { - // TODO: JTERRY75 - Handle errors in a non-generic way - status.Code = trace.StatusCodeUnknown - status.Message = err.Error() - } - span.SetStatus(status) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go b/vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go deleted file mode 100644 index 4eb9bb9f1f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go +++ /dev/null @@ -1,92 +0,0 @@ -package queue - -import ( - "errors" - "sync" -) - -var ErrQueueClosed = errors.New("the queue is closed for reading and writing") - -// MessageQueue represents a threadsafe message queue to be used to retrieve or -// write messages to. -type MessageQueue struct { - m *sync.RWMutex - c *sync.Cond - messages []interface{} - closed bool -} - -// NewMessageQueue returns a new MessageQueue. -func NewMessageQueue() *MessageQueue { - m := &sync.RWMutex{} - return &MessageQueue{ - m: m, - c: sync.NewCond(m), - messages: []interface{}{}, - } -} - -// Enqueue writes `msg` to the queue. -func (mq *MessageQueue) Enqueue(msg interface{}) error { - mq.m.Lock() - defer mq.m.Unlock() - - if mq.closed { - return ErrQueueClosed - } - mq.messages = append(mq.messages, msg) - // Signal a waiter that there is now a value available in the queue. - mq.c.Signal() - return nil -} - -// Dequeue will read a value from the queue and remove it. If the queue -// is empty, this will block until the queue is closed or a value gets enqueued. -func (mq *MessageQueue) Dequeue() (interface{}, error) { - mq.m.Lock() - defer mq.m.Unlock() - - for !mq.closed && mq.size() == 0 { - mq.c.Wait() - } - - // We got woken up, check if it's because the queue got closed. - if mq.closed { - return nil, ErrQueueClosed - } - - val := mq.messages[0] - mq.messages[0] = nil - mq.messages = mq.messages[1:] - return val, nil -} - -// Size returns the size of the queue. -func (mq *MessageQueue) Size() int { - mq.m.RLock() - defer mq.m.RUnlock() - return mq.size() -} - -// Nonexported size check to check if the queue is empty inside already locked functions. -func (mq *MessageQueue) size() int { - return len(mq.messages) -} - -// Close closes the queue for future writes or reads. Any attempts to read or write from the -// queue after close will return ErrQueueClosed. This is safe to call multiple times. -func (mq *MessageQueue) Close() { - mq.m.Lock() - defer mq.m.Unlock() - - // Already closed, noop - if mq.closed { - return - } - - mq.messages = nil - mq.closed = true - // If there's anybody currently waiting on a value from Dequeue, we need to - // broadcast so the read(s) can return ErrQueueClosed. - mq.c.Broadcast() -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go b/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go deleted file mode 100644 index 66b8d7e035..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go +++ /dev/null @@ -1,375 +0,0 @@ -package safefile - -import ( - "errors" - "io" - "os" - "path/filepath" - "strings" - "syscall" - "unicode/utf16" - "unsafe" - - "github.com/Microsoft/hcsshim/internal/longpath" - "github.com/Microsoft/hcsshim/internal/winapi" - - winio "github.com/Microsoft/go-winio" -) - -func OpenRoot(path string) (*os.File, error) { - longpath, err := longpath.LongAbs(path) - if err != nil { - return nil, err - } - return winio.OpenForBackup(longpath, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, syscall.OPEN_EXISTING) -} - -func cleanGoStringRelativePath(path string) (string, error) { - path = filepath.Clean(path) - if strings.Contains(path, ":") { - // Since alternate data streams must follow the file they - // are attached to, finding one here (out of order) is invalid. - return "", errors.New("path contains invalid character `:`") - } - fspath := filepath.FromSlash(path) - if len(fspath) > 0 && fspath[0] == '\\' { - return "", errors.New("expected relative path") - } - return fspath, nil -} - -func ntRelativePath(path string) ([]uint16, error) { - fspath, err := cleanGoStringRelativePath(path) - if err != nil { - return nil, err - } - - path16 := utf16.Encode(([]rune)(fspath)) - if len(path16) > 32767 { - return nil, syscall.ENAMETOOLONG - } - - return path16, nil -} - -// openRelativeInternal opens a relative path from the given root, failing if -// any of the intermediate path components are reparse points. -func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) { - var ( - h uintptr - iosb winapi.IOStatusBlock - oa winapi.ObjectAttributes - ) - - cleanRelativePath, err := cleanGoStringRelativePath(path) - if err != nil { - return nil, err - } - - if root == nil || root.Fd() == 0 { - return nil, errors.New("missing root directory") - } - - pathUnicode, err := winapi.NewUnicodeString(cleanRelativePath) - if err != nil { - return nil, err - } - - oa.Length = unsafe.Sizeof(oa) - oa.ObjectName = pathUnicode - oa.RootDirectory = uintptr(root.Fd()) - oa.Attributes = winapi.OBJ_DONT_REPARSE - status := winapi.NtCreateFile( - &h, - accessMask|syscall.SYNCHRONIZE, - &oa, - &iosb, - nil, - 0, - shareFlags, - createDisposition, - winapi.FILE_OPEN_FOR_BACKUP_INTENT|winapi.FILE_SYNCHRONOUS_IO_NONALERT|flags, - nil, - 0, - ) - if status != 0 { - return nil, winapi.RtlNtStatusToDosError(status) - } - - fullPath, err := longpath.LongAbs(filepath.Join(root.Name(), path)) - if err != nil { - syscall.Close(syscall.Handle(h)) - return nil, err - } - - return os.NewFile(h, fullPath), nil -} - -// OpenRelative opens a relative path from the given root, failing if -// any of the intermediate path components are reparse points. -func OpenRelative(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) { - f, err := openRelativeInternal(path, root, accessMask, shareFlags, createDisposition, flags) - if err != nil { - err = &os.PathError{Op: "open", Path: filepath.Join(root.Name(), path), Err: err} - } - return f, err -} - -// LinkRelative creates a hard link from oldname to newname (relative to oldroot -// and newroot), failing if any of the intermediate path components are reparse -// points. -func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.File) error { - // Open the old file. - oldf, err := openRelativeInternal( - oldname, - oldroot, - syscall.FILE_WRITE_ATTRIBUTES, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - winapi.FILE_OPEN, - 0, - ) - if err != nil { - return &os.LinkError{Op: "link", Old: filepath.Join(oldroot.Name(), oldname), New: filepath.Join(newroot.Name(), newname), Err: err} - } - defer oldf.Close() - - // Open the parent of the new file. - var parent *os.File - parentPath := filepath.Dir(newname) - if parentPath != "." { - parent, err = openRelativeInternal( - parentPath, - newroot, - syscall.GENERIC_READ, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - winapi.FILE_OPEN, - winapi.FILE_DIRECTORY_FILE) - if err != nil { - return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: err} - } - defer parent.Close() - - fi, err := winio.GetFileBasicInfo(parent) - if err != nil { - return err - } - if (fi.FileAttributes & syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 { - return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: winapi.RtlNtStatusToDosError(winapi.STATUS_REPARSE_POINT_ENCOUNTERED)} - } - - } else { - parent = newroot - } - - // Issue an NT call to create the link. This will be safe because NT will - // not open any more directories to create the link, so it cannot walk any - // more reparse points. - newbase := filepath.Base(newname) - newbase16, err := ntRelativePath(newbase) - if err != nil { - return err - } - - size := int(unsafe.Offsetof(winapi.FileLinkInformation{}.FileName)) + len(newbase16)*2 - linkinfoBuffer := winapi.LocalAlloc(0, size) - defer winapi.LocalFree(linkinfoBuffer) - - linkinfo := (*winapi.FileLinkInformation)(unsafe.Pointer(linkinfoBuffer)) - linkinfo.RootDirectory = parent.Fd() - linkinfo.FileNameLength = uint32(len(newbase16) * 2) - copy(winapi.Uint16BufferToSlice(&linkinfo.FileName[0], len(newbase16)), newbase16) - - var iosb winapi.IOStatusBlock - status := winapi.NtSetInformationFile( - oldf.Fd(), - &iosb, - linkinfoBuffer, - uint32(size), - winapi.FileLinkInformationClass, - ) - if status != 0 { - return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(parent.Name(), newbase), Err: winapi.RtlNtStatusToDosError(status)} - } - - return nil -} - -// deleteOnClose marks a file to be deleted when the handle is closed. -func deleteOnClose(f *os.File) error { - disposition := winapi.FileDispositionInformationEx{Flags: winapi.FILE_DISPOSITION_DELETE} - var iosb winapi.IOStatusBlock - status := winapi.NtSetInformationFile( - f.Fd(), - &iosb, - uintptr(unsafe.Pointer(&disposition)), - uint32(unsafe.Sizeof(disposition)), - winapi.FileDispositionInformationExClass, - ) - if status != 0 { - return winapi.RtlNtStatusToDosError(status) - } - return nil -} - -// clearReadOnly clears the readonly attribute on a file. -func clearReadOnly(f *os.File) error { - bi, err := winio.GetFileBasicInfo(f) - if err != nil { - return err - } - if bi.FileAttributes&syscall.FILE_ATTRIBUTE_READONLY == 0 { - return nil - } - sbi := winio.FileBasicInfo{ - FileAttributes: bi.FileAttributes &^ syscall.FILE_ATTRIBUTE_READONLY, - } - if sbi.FileAttributes == 0 { - sbi.FileAttributes = syscall.FILE_ATTRIBUTE_NORMAL - } - return winio.SetFileBasicInfo(f, &sbi) -} - -// RemoveRelative removes a file or directory relative to a root, failing if any -// intermediate path components are reparse points. -func RemoveRelative(path string, root *os.File) error { - f, err := openRelativeInternal( - path, - root, - winapi.FILE_READ_ATTRIBUTES|winapi.FILE_WRITE_ATTRIBUTES|winapi.DELETE, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - winapi.FILE_OPEN, - winapi.FILE_OPEN_REPARSE_POINT) - if err == nil { - defer f.Close() - err = deleteOnClose(f) - if err == syscall.ERROR_ACCESS_DENIED { - // Maybe the file is marked readonly. Clear the bit and retry. - _ = clearReadOnly(f) - err = deleteOnClose(f) - } - } - if err != nil { - return &os.PathError{Op: "remove", Path: filepath.Join(root.Name(), path), Err: err} - } - return nil -} - -// RemoveAllRelative removes a directory tree relative to a root, failing if any -// intermediate path components are reparse points. -func RemoveAllRelative(path string, root *os.File) error { - fi, err := LstatRelative(path, root) - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - fileAttributes := fi.Sys().(*syscall.Win32FileAttributeData).FileAttributes - if fileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY == 0 || fileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 { - // If this is a reparse point, it can't have children. Simple remove will do. - err := RemoveRelative(path, root) - if err == nil || os.IsNotExist(err) { - return nil - } - return err - } - - // It is necessary to use os.Open as Readdirnames does not work with - // OpenRelative. This is safe because the above lstatrelative fails - // if the target is outside the root, and we know this is not a - // symlink from the above FILE_ATTRIBUTE_REPARSE_POINT check. - fd, err := os.Open(filepath.Join(root.Name(), path)) - if err != nil { - if os.IsNotExist(err) { - // Race. It was deleted between the Lstat and Open. - // Return nil per RemoveAll's docs. - return nil - } - return err - } - - // Remove contents & return first error. - for { - names, err1 := fd.Readdirnames(100) - for _, name := range names { - err1 := RemoveAllRelative(path+string(os.PathSeparator)+name, root) - if err == nil { - err = err1 - } - } - if err1 == io.EOF { - break - } - // If Readdirnames returned an error, use it. - if err == nil { - err = err1 - } - if len(names) == 0 { - break - } - } - fd.Close() - - // Remove directory. - err1 := RemoveRelative(path, root) - if err1 == nil || os.IsNotExist(err1) { - return nil - } - if err == nil { - err = err1 - } - return err -} - -// MkdirRelative creates a directory relative to a root, failing if any -// intermediate path components are reparse points. -func MkdirRelative(path string, root *os.File) error { - f, err := openRelativeInternal( - path, - root, - 0, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - winapi.FILE_CREATE, - winapi.FILE_DIRECTORY_FILE) - if err == nil { - f.Close() - } else { - err = &os.PathError{Op: "mkdir", Path: filepath.Join(root.Name(), path), Err: err} - } - return err -} - -// LstatRelative performs a stat operation on a file relative to a root, failing -// if any intermediate path components are reparse points. -func LstatRelative(path string, root *os.File) (os.FileInfo, error) { - f, err := openRelativeInternal( - path, - root, - winapi.FILE_READ_ATTRIBUTES, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - winapi.FILE_OPEN, - winapi.FILE_OPEN_REPARSE_POINT) - if err != nil { - return nil, &os.PathError{Op: "stat", Path: filepath.Join(root.Name(), path), Err: err} - } - defer f.Close() - return f.Stat() -} - -// EnsureNotReparsePointRelative validates that a given file (relative to a -// root) and all intermediate path components are not a reparse points. -func EnsureNotReparsePointRelative(path string, root *os.File) error { - // Perform an open with OBJ_DONT_REPARSE but without specifying FILE_OPEN_REPARSE_POINT. - f, err := OpenRelative( - path, - root, - 0, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - winapi.FILE_OPEN, - 0) - if err != nil { - return err - } - f.Close() - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/timeout/timeout.go b/vendor/github.com/Microsoft/hcsshim/internal/timeout/timeout.go deleted file mode 100644 index eaf39fa513..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/timeout/timeout.go +++ /dev/null @@ -1,74 +0,0 @@ -package timeout - -import ( - "os" - "strconv" - "time" -) - -var ( - // defaultTimeout is the timeout for most operations that is not overridden. - defaultTimeout = 4 * time.Minute - - // defaultTimeoutTestdRetry is the retry loop timeout for testd to respond - // for a disk to come online in LCOW. - defaultTimeoutTestdRetry = 5 * time.Second -) - -// External variables for HCSShim consumers to use. -var ( - // SystemCreate is the timeout for creating a compute system - SystemCreate time.Duration = defaultTimeout - - // SystemStart is the timeout for starting a compute system - SystemStart time.Duration = defaultTimeout - - // SystemPause is the timeout for pausing a compute system - SystemPause time.Duration = defaultTimeout - - // SystemResume is the timeout for resuming a compute system - SystemResume time.Duration = defaultTimeout - - // SystemSave is the timeout for saving a compute system - SystemSave time.Duration = defaultTimeout - - // SyscallWatcher is the timeout before warning of a potential stuck platform syscall. - SyscallWatcher time.Duration = defaultTimeout - - // Tar2VHD is the timeout for the tar2vhd operation to complete - Tar2VHD time.Duration = defaultTimeout - - // ExternalCommandToStart is the timeout for external commands to start - ExternalCommandToStart = defaultTimeout - - // ExternalCommandToComplete is the timeout for external commands to complete. - // Generally this means copying data from their stdio pipes. - ExternalCommandToComplete = defaultTimeout - - // TestDRetryLoop is the timeout for testd retry loop when onlining a SCSI disk in LCOW - TestDRetryLoop = defaultTimeoutTestdRetry -) - -func init() { - SystemCreate = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMCREATE", SystemCreate) - SystemStart = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMSTART", SystemStart) - SystemPause = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMPAUSE", SystemPause) - SystemResume = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMRESUME", SystemResume) - SystemSave = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMSAVE", SystemSave) - SyscallWatcher = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSCALLWATCHER", SyscallWatcher) - Tar2VHD = durationFromEnvironment("HCSSHIM_TIMEOUT_TAR2VHD", Tar2VHD) - ExternalCommandToStart = durationFromEnvironment("HCSSHIM_TIMEOUT_EXTERNALCOMMANDSTART", ExternalCommandToStart) - ExternalCommandToComplete = durationFromEnvironment("HCSSHIM_TIMEOUT_EXTERNALCOMMANDCOMPLETE", ExternalCommandToComplete) - TestDRetryLoop = durationFromEnvironment("HCSSHIM_TIMEOUT_TESTDRETRYLOOP", TestDRetryLoop) -} - -func durationFromEnvironment(env string, defaultValue time.Duration) time.Duration { - envTimeout := os.Getenv(env) - if len(envTimeout) > 0 { - e, err := strconv.Atoi(envTimeout) - if err == nil && e > 0 { - return time.Second * time.Duration(e) - } - } - return defaultValue -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go b/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go deleted file mode 100644 index e7f114b67a..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go +++ /dev/null @@ -1,610 +0,0 @@ -package vmcompute - -import ( - gcontext "context" - "syscall" - "time" - - "github.com/Microsoft/hcsshim/internal/interop" - "github.com/Microsoft/hcsshim/internal/log" - "github.com/Microsoft/hcsshim/internal/logfields" - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/internal/timeout" - "go.opencensus.io/trace" -) - -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go vmcompute.go - -//sys hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) = vmcompute.HcsEnumerateComputeSystems? -//sys hcsCreateComputeSystem(id string, configuration string, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsCreateComputeSystem? -//sys hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsOpenComputeSystem? -//sys hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) = vmcompute.HcsCloseComputeSystem? -//sys hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsStartComputeSystem? -//sys hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsShutdownComputeSystem? -//sys hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsTerminateComputeSystem? -//sys hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsPauseComputeSystem? -//sys hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsResumeComputeSystem? -//sys hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetComputeSystemProperties? -//sys hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) = vmcompute.HcsModifyComputeSystem? -//sys hcsModifyServiceSettings(settings string, result **uint16) (hr error) = vmcompute.HcsModifyServiceSettings? -//sys hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterComputeSystemCallback? -//sys hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterComputeSystemCallback? -//sys hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsSaveComputeSystem? - -//sys hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsCreateProcess? -//sys hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsOpenProcess? -//sys hcsCloseProcess(process HcsProcess) (hr error) = vmcompute.HcsCloseProcess? -//sys hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) = vmcompute.HcsTerminateProcess? -//sys hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr error) = vmcompute.HcsSignalProcess? -//sys hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) = vmcompute.HcsGetProcessInfo? -//sys hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) = vmcompute.HcsGetProcessProperties? -//sys hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) = vmcompute.HcsModifyProcess? -//sys hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetServiceProperties? -//sys hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterProcessCallback? -//sys hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterProcessCallback? - -// errVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously -const errVmcomputeOperationPending = syscall.Errno(0xC0370103) - -// HcsSystem is the handle associated with a created compute system. -type HcsSystem syscall.Handle - -// HcsProcess is the handle associated with a created process in a compute -// system. -type HcsProcess syscall.Handle - -// HcsCallback is the handle associated with the function to call when events -// occur. -type HcsCallback syscall.Handle - -// HcsProcessInformation is the structure used when creating or getting process -// info. -type HcsProcessInformation struct { - // ProcessId is the pid of the created process. - ProcessId uint32 - reserved uint32 //nolint:structcheck - // StdInput is the handle associated with the stdin of the process. - StdInput syscall.Handle - // StdOutput is the handle associated with the stdout of the process. - StdOutput syscall.Handle - // StdError is the handle associated with the stderr of the process. - StdError syscall.Handle -} - -func execute(ctx gcontext.Context, timeout time.Duration, f func() error) error { - if timeout > 0 { - var cancel gcontext.CancelFunc - ctx, cancel = gcontext.WithTimeout(ctx, timeout) - defer cancel() - } - - done := make(chan error, 1) - go func() { - done <- f() - }() - select { - case <-ctx.Done(): - if ctx.Err() == gcontext.DeadlineExceeded { - log.G(ctx).WithField(logfields.Timeout, timeout). - Warning("Syscall did not complete within operation timeout. This may indicate a platform issue. If it appears to be making no forward progress, obtain the stacks and see if there is a syscall stuck in the platform API for a significant length of time.") - } - return ctx.Err() - case err := <-done: - return err - } -} - -func HcsEnumerateComputeSystems(ctx gcontext.Context, query string) (computeSystems, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsEnumerateComputeSystems") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("query", query)) - - return computeSystems, result, execute(ctx, timeout.SyscallWatcher, func() error { - var ( - computeSystemsp *uint16 - resultp *uint16 - ) - err := hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp) - if computeSystemsp != nil { - computeSystems = interop.ConvertAndFreeCoTaskMemString(computeSystemsp) - } - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsCreateComputeSystem(ctx gcontext.Context, id string, configuration string, identity syscall.Handle) (computeSystem HcsSystem, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCreateComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - if hr != errVmcomputeOperationPending { - oc.SetSpanStatus(span, hr) - } - }() - span.AddAttributes( - trace.StringAttribute("id", id), - trace.StringAttribute("configuration", configuration)) - - return computeSystem, result, execute(ctx, timeout.SystemCreate, func() error { - var resultp *uint16 - err := hcsCreateComputeSystem(id, configuration, identity, &computeSystem, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsOpenComputeSystem(ctx gcontext.Context, id string) (computeSystem HcsSystem, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsOpenComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - - return computeSystem, result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsOpenComputeSystem(id, &computeSystem, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsCloseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCloseComputeSystem") - defer span.End() - defer func() { oc.SetSpanStatus(span, hr) }() - - return execute(ctx, timeout.SyscallWatcher, func() error { - return hcsCloseComputeSystem(computeSystem) - }) -} - -func HcsStartComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsStartComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - if hr != errVmcomputeOperationPending { - oc.SetSpanStatus(span, hr) - } - }() - span.AddAttributes(trace.StringAttribute("options", options)) - - return result, execute(ctx, timeout.SystemStart, func() error { - var resultp *uint16 - err := hcsStartComputeSystem(computeSystem, options, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsShutdownComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsShutdownComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - if hr != errVmcomputeOperationPending { - oc.SetSpanStatus(span, hr) - } - }() - span.AddAttributes(trace.StringAttribute("options", options)) - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsShutdownComputeSystem(computeSystem, options, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsTerminateComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsTerminateComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - if hr != errVmcomputeOperationPending { - oc.SetSpanStatus(span, hr) - } - }() - span.AddAttributes(trace.StringAttribute("options", options)) - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsTerminateComputeSystem(computeSystem, options, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsPauseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsPauseComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - if hr != errVmcomputeOperationPending { - oc.SetSpanStatus(span, hr) - } - }() - span.AddAttributes(trace.StringAttribute("options", options)) - - return result, execute(ctx, timeout.SystemPause, func() error { - var resultp *uint16 - err := hcsPauseComputeSystem(computeSystem, options, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsResumeComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsResumeComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - if hr != errVmcomputeOperationPending { - oc.SetSpanStatus(span, hr) - } - }() - span.AddAttributes(trace.StringAttribute("options", options)) - - return result, execute(ctx, timeout.SystemResume, func() error { - var resultp *uint16 - err := hcsResumeComputeSystem(computeSystem, options, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsGetComputeSystemProperties(ctx gcontext.Context, computeSystem HcsSystem, propertyQuery string) (properties, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetComputeSystemProperties") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("propertyQuery", propertyQuery)) - - return properties, result, execute(ctx, timeout.SyscallWatcher, func() error { - var ( - propertiesp *uint16 - resultp *uint16 - ) - err := hcsGetComputeSystemProperties(computeSystem, propertyQuery, &propertiesp, &resultp) - if propertiesp != nil { - properties = interop.ConvertAndFreeCoTaskMemString(propertiesp) - } - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsModifyComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, configuration string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsModifyComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("configuration", configuration)) - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsModifyComputeSystem(computeSystem, configuration, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsModifyServiceSettings(ctx gcontext.Context, settings string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsModifyServiceSettings") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("settings", settings)) - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsModifyServiceSettings(settings, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSystem, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsRegisterComputeSystemCallback") - defer span.End() - defer func() { oc.SetSpanStatus(span, hr) }() - - return callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error { - return hcsRegisterComputeSystemCallback(computeSystem, callback, context, &callbackHandle) - }) -} - -func HcsUnregisterComputeSystemCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsUnregisterComputeSystemCallback") - defer span.End() - defer func() { oc.SetSpanStatus(span, hr) }() - - return execute(ctx, timeout.SyscallWatcher, func() error { - return hcsUnregisterComputeSystemCallback(callbackHandle) - }) -} - -func HcsCreateProcess(ctx gcontext.Context, computeSystem HcsSystem, processParameters string) (processInformation HcsProcessInformation, process HcsProcess, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCreateProcess") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("processParameters", processParameters)) - - return processInformation, process, result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsCreateProcess(computeSystem, processParameters, &processInformation, &process, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsOpenProcess(ctx gcontext.Context, computeSystem HcsSystem, pid uint32) (process HcsProcess, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsOpenProcess") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.Int64Attribute("pid", int64(pid))) - - return process, result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsOpenProcess(computeSystem, pid, &process, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsCloseProcess(ctx gcontext.Context, process HcsProcess) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCloseProcess") - defer span.End() - defer func() { oc.SetSpanStatus(span, hr) }() - - return execute(ctx, timeout.SyscallWatcher, func() error { - return hcsCloseProcess(process) - }) -} - -func HcsTerminateProcess(ctx gcontext.Context, process HcsProcess) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsTerminateProcess") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsTerminateProcess(process, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsSignalProcess(ctx gcontext.Context, process HcsProcess, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsSignalProcess") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("options", options)) - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsSignalProcess(process, options, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsGetProcessInfo(ctx gcontext.Context, process HcsProcess) (processInformation HcsProcessInformation, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetProcessInfo") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - - return processInformation, result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsGetProcessInfo(process, &processInformation, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsGetProcessProperties(ctx gcontext.Context, process HcsProcess) (processProperties, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetProcessProperties") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - - return processProperties, result, execute(ctx, timeout.SyscallWatcher, func() error { - var ( - processPropertiesp *uint16 - resultp *uint16 - ) - err := hcsGetProcessProperties(process, &processPropertiesp, &resultp) - if processPropertiesp != nil { - processProperties = interop.ConvertAndFreeCoTaskMemString(processPropertiesp) - } - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsModifyProcess(ctx gcontext.Context, process HcsProcess, settings string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsModifyProcess") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("settings", settings)) - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsModifyProcess(process, settings, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsGetServiceProperties(ctx gcontext.Context, propertyQuery string) (properties, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetServiceProperties") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - oc.SetSpanStatus(span, hr) - }() - span.AddAttributes(trace.StringAttribute("propertyQuery", propertyQuery)) - - return properties, result, execute(ctx, timeout.SyscallWatcher, func() error { - var ( - propertiesp *uint16 - resultp *uint16 - ) - err := hcsGetServiceProperties(propertyQuery, &propertiesp, &resultp) - if propertiesp != nil { - properties = interop.ConvertAndFreeCoTaskMemString(propertiesp) - } - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} - -func HcsRegisterProcessCallback(ctx gcontext.Context, process HcsProcess, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsRegisterProcessCallback") - defer span.End() - defer func() { oc.SetSpanStatus(span, hr) }() - - return callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error { - return hcsRegisterProcessCallback(process, callback, context, &callbackHandle) - }) -} - -func HcsUnregisterProcessCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsUnregisterProcessCallback") - defer span.End() - defer func() { oc.SetSpanStatus(span, hr) }() - - return execute(ctx, timeout.SyscallWatcher, func() error { - return hcsUnregisterProcessCallback(callbackHandle) - }) -} - -func HcsSaveComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsSaveComputeSystem") - defer span.End() - defer func() { - if result != "" { - span.AddAttributes(trace.StringAttribute("result", result)) - } - if hr != errVmcomputeOperationPending { - oc.SetSpanStatus(span, hr) - } - }() - - return result, execute(ctx, timeout.SyscallWatcher, func() error { - var resultp *uint16 - err := hcsSaveComputeSystem(computeSystem, options, &resultp) - if resultp != nil { - result = interop.ConvertAndFreeCoTaskMemString(resultp) - } - return err - }) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go deleted file mode 100644 index cae55058de..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go +++ /dev/null @@ -1,581 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package vmcompute - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") - - procHcsEnumerateComputeSystems = modvmcompute.NewProc("HcsEnumerateComputeSystems") - procHcsCreateComputeSystem = modvmcompute.NewProc("HcsCreateComputeSystem") - procHcsOpenComputeSystem = modvmcompute.NewProc("HcsOpenComputeSystem") - procHcsCloseComputeSystem = modvmcompute.NewProc("HcsCloseComputeSystem") - procHcsStartComputeSystem = modvmcompute.NewProc("HcsStartComputeSystem") - procHcsShutdownComputeSystem = modvmcompute.NewProc("HcsShutdownComputeSystem") - procHcsTerminateComputeSystem = modvmcompute.NewProc("HcsTerminateComputeSystem") - procHcsPauseComputeSystem = modvmcompute.NewProc("HcsPauseComputeSystem") - procHcsResumeComputeSystem = modvmcompute.NewProc("HcsResumeComputeSystem") - procHcsGetComputeSystemProperties = modvmcompute.NewProc("HcsGetComputeSystemProperties") - procHcsModifyComputeSystem = modvmcompute.NewProc("HcsModifyComputeSystem") - procHcsModifyServiceSettings = modvmcompute.NewProc("HcsModifyServiceSettings") - procHcsRegisterComputeSystemCallback = modvmcompute.NewProc("HcsRegisterComputeSystemCallback") - procHcsUnregisterComputeSystemCallback = modvmcompute.NewProc("HcsUnregisterComputeSystemCallback") - procHcsSaveComputeSystem = modvmcompute.NewProc("HcsSaveComputeSystem") - procHcsCreateProcess = modvmcompute.NewProc("HcsCreateProcess") - procHcsOpenProcess = modvmcompute.NewProc("HcsOpenProcess") - procHcsCloseProcess = modvmcompute.NewProc("HcsCloseProcess") - procHcsTerminateProcess = modvmcompute.NewProc("HcsTerminateProcess") - procHcsSignalProcess = modvmcompute.NewProc("HcsSignalProcess") - procHcsGetProcessInfo = modvmcompute.NewProc("HcsGetProcessInfo") - procHcsGetProcessProperties = modvmcompute.NewProc("HcsGetProcessProperties") - procHcsModifyProcess = modvmcompute.NewProc("HcsModifyProcess") - procHcsGetServiceProperties = modvmcompute.NewProc("HcsGetServiceProperties") - procHcsRegisterProcessCallback = modvmcompute.NewProc("HcsRegisterProcessCallback") - procHcsUnregisterProcessCallback = modvmcompute.NewProc("HcsUnregisterProcessCallback") -) - -func hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(query) - if hr != nil { - return - } - return _hcsEnumerateComputeSystems(_p0, computeSystems, result) -} - -func _hcsEnumerateComputeSystems(query *uint16, computeSystems **uint16, result **uint16) (hr error) { - if hr = procHcsEnumerateComputeSystems.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsEnumerateComputeSystems.Addr(), 3, uintptr(unsafe.Pointer(query)), uintptr(unsafe.Pointer(computeSystems)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsCreateComputeSystem(id string, configuration string, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(configuration) - if hr != nil { - return - } - return _hcsCreateComputeSystem(_p0, _p1, identity, computeSystem, result) -} - -func _hcsCreateComputeSystem(id *uint16, configuration *uint16, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) { - if hr = procHcsCreateComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHcsCreateComputeSystem.Addr(), 5, uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(configuration)), uintptr(identity), uintptr(unsafe.Pointer(computeSystem)), uintptr(unsafe.Pointer(result)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _hcsOpenComputeSystem(_p0, computeSystem, result) -} - -func _hcsOpenComputeSystem(id *uint16, computeSystem *HcsSystem, result **uint16) (hr error) { - if hr = procHcsOpenComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsOpenComputeSystem.Addr(), 3, uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(computeSystem)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) { - if hr = procHcsCloseComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsCloseComputeSystem.Addr(), 1, uintptr(computeSystem), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsStartComputeSystem(computeSystem, _p0, result) -} - -func _hcsStartComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsStartComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsStartComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsShutdownComputeSystem(computeSystem, _p0, result) -} - -func _hcsShutdownComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsShutdownComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsShutdownComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsTerminateComputeSystem(computeSystem, _p0, result) -} - -func _hcsTerminateComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsTerminateComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsTerminateComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsPauseComputeSystem(computeSystem, _p0, result) -} - -func _hcsPauseComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsPauseComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsPauseComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsResumeComputeSystem(computeSystem, _p0, result) -} - -func _hcsResumeComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsResumeComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsResumeComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(propertyQuery) - if hr != nil { - return - } - return _hcsGetComputeSystemProperties(computeSystem, _p0, properties, result) -} - -func _hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery *uint16, properties **uint16, result **uint16) (hr error) { - if hr = procHcsGetComputeSystemProperties.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHcsGetComputeSystemProperties.Addr(), 4, uintptr(computeSystem), uintptr(unsafe.Pointer(propertyQuery)), uintptr(unsafe.Pointer(properties)), uintptr(unsafe.Pointer(result)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(configuration) - if hr != nil { - return - } - return _hcsModifyComputeSystem(computeSystem, _p0, result) -} - -func _hcsModifyComputeSystem(computeSystem HcsSystem, configuration *uint16, result **uint16) (hr error) { - if hr = procHcsModifyComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsModifyComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(configuration)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsModifyServiceSettings(settings string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(settings) - if hr != nil { - return - } - return _hcsModifyServiceSettings(_p0, result) -} - -func _hcsModifyServiceSettings(settings *uint16, result **uint16) (hr error) { - if hr = procHcsModifyServiceSettings.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsModifyServiceSettings.Addr(), 2, uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { - if hr = procHcsRegisterComputeSystemCallback.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHcsRegisterComputeSystemCallback.Addr(), 4, uintptr(computeSystem), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) { - if hr = procHcsUnregisterComputeSystemCallback.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsUnregisterComputeSystemCallback.Addr(), 1, uintptr(callbackHandle), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsSaveComputeSystem(computeSystem, _p0, result) -} - -func _hcsSaveComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsSaveComputeSystem.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsSaveComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(processParameters) - if hr != nil { - return - } - return _hcsCreateProcess(computeSystem, _p0, processInformation, process, result) -} - -func _hcsCreateProcess(computeSystem HcsSystem, processParameters *uint16, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { - if hr = procHcsCreateProcess.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHcsCreateProcess.Addr(), 5, uintptr(computeSystem), uintptr(unsafe.Pointer(processParameters)), uintptr(unsafe.Pointer(processInformation)), uintptr(unsafe.Pointer(process)), uintptr(unsafe.Pointer(result)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) { - if hr = procHcsOpenProcess.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHcsOpenProcess.Addr(), 4, uintptr(computeSystem), uintptr(pid), uintptr(unsafe.Pointer(process)), uintptr(unsafe.Pointer(result)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsCloseProcess(process HcsProcess) (hr error) { - if hr = procHcsCloseProcess.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsCloseProcess.Addr(), 1, uintptr(process), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) { - if hr = procHcsTerminateProcess.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsTerminateProcess.Addr(), 2, uintptr(process), uintptr(unsafe.Pointer(result)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) - if hr != nil { - return - } - return _hcsSignalProcess(process, _p0, result) -} - -func _hcsSignalProcess(process HcsProcess, options *uint16, result **uint16) (hr error) { - if hr = procHcsSignalProcess.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsSignalProcess.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) { - if hr = procHcsGetProcessInfo.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsGetProcessInfo.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(processInformation)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) { - if hr = procHcsGetProcessProperties.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsGetProcessProperties.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(processProperties)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(settings) - if hr != nil { - return - } - return _hcsModifyProcess(process, _p0, result) -} - -func _hcsModifyProcess(process HcsProcess, settings *uint16, result **uint16) (hr error) { - if hr = procHcsModifyProcess.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsModifyProcess.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(propertyQuery) - if hr != nil { - return - } - return _hcsGetServiceProperties(_p0, properties, result) -} - -func _hcsGetServiceProperties(propertyQuery *uint16, properties **uint16, result **uint16) (hr error) { - if hr = procHcsGetServiceProperties.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsGetServiceProperties.Addr(), 3, uintptr(unsafe.Pointer(propertyQuery)), uintptr(unsafe.Pointer(properties)), uintptr(unsafe.Pointer(result))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { - if hr = procHcsRegisterProcessCallback.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procHcsRegisterProcessCallback.Addr(), 4, uintptr(process), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) { - if hr = procHcsUnregisterProcessCallback.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procHcsUnregisterProcessCallback.Addr(), 1, uintptr(callbackHandle), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go deleted file mode 100644 index 5debe974d4..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go +++ /dev/null @@ -1,27 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// ActivateLayer will find the layer with the given id and mount it's filesystem. -// For a read/write layer, the mounted filesystem will appear as a volume on the -// host, while a read-only layer is generally expected to be a no-op. -// An activated layer must later be deactivated via DeactivateLayer. -func ActivateLayer(ctx context.Context, path string) (err error) { - title := "hcsshim::ActivateLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - err = activateLayer(&stdDriverInfo, path) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go deleted file mode 100644 index 3ec708d1ed..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go +++ /dev/null @@ -1,182 +0,0 @@ -package wclayer - -import ( - "context" - "errors" - "os" - "path/filepath" - "syscall" - - "github.com/Microsoft/go-winio" - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/internal/safefile" - "github.com/Microsoft/hcsshim/internal/winapi" - "go.opencensus.io/trace" -) - -type baseLayerWriter struct { - ctx context.Context - s *trace.Span - - root *os.File - f *os.File - bw *winio.BackupFileWriter - err error - hasUtilityVM bool - dirInfo []dirInfo -} - -type dirInfo struct { - path string - fileInfo winio.FileBasicInfo -} - -// reapplyDirectoryTimes reapplies directory modification, creation, etc. times -// after processing of the directory tree has completed. The times are expected -// to be ordered such that parent directories come before child directories. -func reapplyDirectoryTimes(root *os.File, dis []dirInfo) error { - for i := range dis { - di := &dis[len(dis)-i-1] // reverse order: process child directories first - f, err := safefile.OpenRelative(di.path, root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_OPEN, winapi.FILE_DIRECTORY_FILE|syscall.FILE_FLAG_OPEN_REPARSE_POINT) - if err != nil { - return err - } - - err = winio.SetFileBasicInfo(f, &di.fileInfo) - f.Close() - if err != nil { - return err - } - - } - return nil -} - -func (w *baseLayerWriter) closeCurrentFile() error { - if w.f != nil { - err := w.bw.Close() - err2 := w.f.Close() - w.f = nil - w.bw = nil - if err != nil { - return err - } - if err2 != nil { - return err2 - } - } - return nil -} - -func (w *baseLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) (err error) { - defer func() { - if err != nil { - w.err = err - } - }() - - err = w.closeCurrentFile() - if err != nil { - return err - } - - if filepath.ToSlash(name) == `UtilityVM/Files` { - w.hasUtilityVM = true - } - - var f *os.File - defer func() { - if f != nil { - f.Close() - } - }() - - extraFlags := uint32(0) - if fileInfo.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { - extraFlags |= winapi.FILE_DIRECTORY_FILE - w.dirInfo = append(w.dirInfo, dirInfo{name, *fileInfo}) - } - - mode := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | winio.WRITE_DAC | winio.WRITE_OWNER | winio.ACCESS_SYSTEM_SECURITY) - f, err = safefile.OpenRelative(name, w.root, mode, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, extraFlags) - if err != nil { - return hcserror.New(err, "Failed to safefile.OpenRelative", name) - } - - err = winio.SetFileBasicInfo(f, fileInfo) - if err != nil { - return hcserror.New(err, "Failed to SetFileBasicInfo", name) - } - - w.f = f - w.bw = winio.NewBackupFileWriter(f, true) - f = nil - return nil -} - -func (w *baseLayerWriter) AddLink(name string, target string) (err error) { - defer func() { - if err != nil { - w.err = err - } - }() - - err = w.closeCurrentFile() - if err != nil { - return err - } - - return safefile.LinkRelative(target, w.root, name, w.root) -} - -func (w *baseLayerWriter) Remove(name string) error { - return errors.New("base layer cannot have tombstones") -} - -func (w *baseLayerWriter) Write(b []byte) (int, error) { - n, err := w.bw.Write(b) - if err != nil { - w.err = err - } - return n, err -} - -func (w *baseLayerWriter) Close() (err error) { - defer w.s.End() - defer func() { oc.SetSpanStatus(w.s, err) }() - defer func() { - w.root.Close() - w.root = nil - }() - - err = w.closeCurrentFile() - if err != nil { - return err - } - if w.err == nil { - // Restore the file times of all the directories, since they may have - // been modified by creating child directories. - err = reapplyDirectoryTimes(w.root, w.dirInfo) - if err != nil { - return err - } - - err = ProcessBaseLayer(w.ctx, w.root.Name()) - if err != nil { - return err - } - - if w.hasUtilityVM { - err := safefile.EnsureNotReparsePointRelative("UtilityVM", w.root) - if err != nil { - return err - } - err = ProcessUtilityVMImage(w.ctx, filepath.Join(w.root.Name(), "UtilityVM")) - if err != nil { - return err - } - } - } - return w.err -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go deleted file mode 100644 index 480aee8725..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go +++ /dev/null @@ -1,27 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// CreateLayer creates a new, empty, read-only layer on the filesystem based on -// the parent layer provided. -func CreateLayer(ctx context.Context, path, parent string) (err error) { - title := "hcsshim::CreateLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.StringAttribute("parent", parent)) - - err = createLayer(&stdDriverInfo, path, parent) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go deleted file mode 100644 index 131aa94f14..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go +++ /dev/null @@ -1,34 +0,0 @@ -package wclayer - -import ( - "context" - "strings" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// CreateScratchLayer creates and populates new read-write layer for use by a container. -// This requires the full list of paths to all parent layers up to the base -func CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) { - title := "hcsshim::CreateScratchLayer" - ctx, span := trace.StartSpan(ctx, title) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) - - // Generate layer descriptors - layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) - if err != nil { - return err - } - - err = createSandboxLayer(&stdDriverInfo, path, 0, layers) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go deleted file mode 100644 index d5bf2f5bdc..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go +++ /dev/null @@ -1,24 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// DeactivateLayer will dismount a layer that was mounted via ActivateLayer. -func DeactivateLayer(ctx context.Context, path string) (err error) { - title := "hcsshim::DeactivateLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - err = deactivateLayer(&stdDriverInfo, path) - if err != nil { - return hcserror.New(err, title+"- failed", "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go deleted file mode 100644 index 424467ac33..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go +++ /dev/null @@ -1,25 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// DestroyLayer will remove the on-disk files representing the layer with the given -// path, including that layer's containing folder, if any. -func DestroyLayer(ctx context.Context, path string) (err error) { - title := "hcsshim::DestroyLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - err = destroyLayer(&stdDriverInfo, path) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go deleted file mode 100644 index 035c9041e6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go +++ /dev/null @@ -1,140 +0,0 @@ -package wclayer - -import ( - "context" - "os" - "path/filepath" - "syscall" - "unsafe" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/osversion" - "go.opencensus.io/trace" -) - -// ExpandScratchSize expands the size of a layer to at least size bytes. -func ExpandScratchSize(ctx context.Context, path string, size uint64) (err error) { - title := "hcsshim::ExpandScratchSize" - ctx, span := trace.StartSpan(ctx, title) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.Int64Attribute("size", int64(size))) - - err = expandSandboxSize(&stdDriverInfo, path, size) - if err != nil { - return hcserror.New(err, title, "") - } - - // Manually expand the volume now in order to work around bugs in 19H1 and - // prerelease versions of Vb. Remove once this is fixed in Windows. - if build := osversion.Build(); build >= osversion.V19H1 && build < 19020 { - err = expandSandboxVolume(ctx, path) - if err != nil { - return err - } - } - return nil -} - -type virtualStorageType struct { - DeviceID uint32 - VendorID [16]byte -} - -type openVersion2 struct { - GetInfoOnly int32 // bool but 4-byte aligned - ReadOnly int32 // bool but 4-byte aligned - ResiliencyGUID [16]byte // GUID -} - -type openVirtualDiskParameters struct { - Version uint32 // Must always be set to 2 - Version2 openVersion2 -} - -func attachVhd(path string) (syscall.Handle, error) { - var ( - defaultType virtualStorageType - handle syscall.Handle - ) - parameters := openVirtualDiskParameters{Version: 2} - err := openVirtualDisk( - &defaultType, - path, - 0, - 0, - ¶meters, - &handle) - if err != nil { - return 0, &os.PathError{Op: "OpenVirtualDisk", Path: path, Err: err} - } - err = attachVirtualDisk(handle, 0, 0, 0, 0, 0) - if err != nil { - syscall.Close(handle) - return 0, &os.PathError{Op: "AttachVirtualDisk", Path: path, Err: err} - } - return handle, nil -} - -func expandSandboxVolume(ctx context.Context, path string) error { - // Mount the sandbox VHD temporarily. - vhdPath := filepath.Join(path, "sandbox.vhdx") - vhd, err := attachVhd(vhdPath) - if err != nil { - return &os.PathError{Op: "OpenVirtualDisk", Path: vhdPath, Err: err} - } - defer syscall.Close(vhd) - - // Open the volume. - volumePath, err := GetLayerMountPath(ctx, path) - if err != nil { - return err - } - if volumePath[len(volumePath)-1] == '\\' { - volumePath = volumePath[:len(volumePath)-1] - } - volume, err := os.OpenFile(volumePath, os.O_RDWR, 0) - if err != nil { - return err - } - defer volume.Close() - - // Get the volume's underlying partition size in NTFS clusters. - var ( - partitionSize int64 - bytes uint32 - ) - const _IOCTL_DISK_GET_LENGTH_INFO = 0x0007405C - err = syscall.DeviceIoControl(syscall.Handle(volume.Fd()), _IOCTL_DISK_GET_LENGTH_INFO, nil, 0, (*byte)(unsafe.Pointer(&partitionSize)), 8, &bytes, nil) - if err != nil { - return &os.PathError{Op: "IOCTL_DISK_GET_LENGTH_INFO", Path: volume.Name(), Err: err} - } - const ( - clusterSize = 4096 - sectorSize = 512 - ) - targetClusters := partitionSize / clusterSize - - // Get the volume's current size in NTFS clusters. - var volumeSize int64 - err = getDiskFreeSpaceEx(volume.Name()+"\\", nil, &volumeSize, nil) - if err != nil { - return &os.PathError{Op: "GetDiskFreeSpaceEx", Path: volume.Name(), Err: err} - } - volumeClusters := volumeSize / clusterSize - - // Only resize the volume if there is space to grow, otherwise this will - // fail with invalid parameter. NTFS reserves one cluster. - if volumeClusters+1 < targetClusters { - targetSectors := targetClusters * (clusterSize / sectorSize) - const _FSCTL_EXTEND_VOLUME = 0x000900F0 - err = syscall.DeviceIoControl(syscall.Handle(volume.Fd()), _FSCTL_EXTEND_VOLUME, (*byte)(unsafe.Pointer(&targetSectors)), 8, nil, 0, &bytes, nil) - if err != nil { - return &os.PathError{Op: "FSCTL_EXTEND_VOLUME", Path: volume.Name(), Err: err} - } - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go deleted file mode 100644 index 97b27eb7d6..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go +++ /dev/null @@ -1,94 +0,0 @@ -package wclayer - -import ( - "context" - "io/ioutil" - "os" - "strings" - - "github.com/Microsoft/go-winio" - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// ExportLayer will create a folder at exportFolderPath and fill that folder with -// the transport format version of the layer identified by layerId. This transport -// format includes any metadata required for later importing the layer (using -// ImportLayer), and requires the full list of parent layer paths in order to -// perform the export. -func ExportLayer(ctx context.Context, path string, exportFolderPath string, parentLayerPaths []string) (err error) { - title := "hcsshim::ExportLayer" - ctx, span := trace.StartSpan(ctx, title) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.StringAttribute("exportFolderPath", exportFolderPath), - trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) - - // Generate layer descriptors - layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) - if err != nil { - return err - } - - err = exportLayer(&stdDriverInfo, path, exportFolderPath, layers) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} - -type LayerReader interface { - Next() (string, int64, *winio.FileBasicInfo, error) - Read(b []byte) (int, error) - Close() error -} - -// NewLayerReader returns a new layer reader for reading the contents of an on-disk layer. -// The caller must have taken the SeBackupPrivilege privilege -// to call this and any methods on the resulting LayerReader. -func NewLayerReader(ctx context.Context, path string, parentLayerPaths []string) (_ LayerReader, err error) { - ctx, span := trace.StartSpan(ctx, "hcsshim::NewLayerReader") - defer func() { - if err != nil { - oc.SetSpanStatus(span, err) - span.End() - } - }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) - - exportPath, err := ioutil.TempDir("", "hcs") - if err != nil { - return nil, err - } - err = ExportLayer(ctx, path, exportPath, parentLayerPaths) - if err != nil { - os.RemoveAll(exportPath) - return nil, err - } - return &legacyLayerReaderWrapper{ - ctx: ctx, - s: span, - legacyLayerReader: newLegacyLayerReader(exportPath), - }, nil -} - -type legacyLayerReaderWrapper struct { - ctx context.Context - s *trace.Span - - *legacyLayerReader -} - -func (r *legacyLayerReaderWrapper) Close() (err error) { - defer r.s.End() - defer func() { oc.SetSpanStatus(r.s, err) }() - - err = r.legacyLayerReader.Close() - os.RemoveAll(r.root) - return err -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go deleted file mode 100644 index 8d213f5871..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go +++ /dev/null @@ -1,50 +0,0 @@ -package wclayer - -import ( - "context" - "syscall" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/log" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// GetLayerMountPath will look for a mounted layer with the given path and return -// the path at which that layer can be accessed. This path may be a volume path -// if the layer is a mounted read-write layer, otherwise it is expected to be the -// folder path at which the layer is stored. -func GetLayerMountPath(ctx context.Context, path string) (_ string, err error) { - title := "hcsshim::GetLayerMountPath" - ctx, span := trace.StartSpan(ctx, title) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - var mountPathLength uintptr = 0 - - // Call the procedure itself. - log.G(ctx).Debug("Calling proc (1)") - err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil) - if err != nil { - return "", hcserror.New(err, title, "(first call)") - } - - // Allocate a mount path of the returned length. - if mountPathLength == 0 { - return "", nil - } - mountPathp := make([]uint16, mountPathLength) - mountPathp[0] = 0 - - // Call the procedure again - log.G(ctx).Debug("Calling proc (2)") - err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0]) - if err != nil { - return "", hcserror.New(err, title, "(second call)") - } - - mountPath := syscall.UTF16ToString(mountPathp[0:]) - span.AddAttributes(trace.StringAttribute("mountPath", mountPath)) - return mountPath, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go deleted file mode 100644 index ae1fff8403..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go +++ /dev/null @@ -1,29 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/interop" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// GetSharedBaseImages will enumerate the images stored in the common central -// image store and return descriptive info about those images for the purpose -// of registering them with the graphdriver, graph, and tagstore. -func GetSharedBaseImages(ctx context.Context) (_ string, err error) { - title := "hcsshim::GetSharedBaseImages" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - - var buffer *uint16 - err = getBaseImages(&buffer) - if err != nil { - return "", hcserror.New(err, title, "") - } - imageData := interop.ConvertAndFreeCoTaskMemString(buffer) - span.AddAttributes(trace.StringAttribute("imageData", imageData)) - return imageData, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go deleted file mode 100644 index 4b282fef9d..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go +++ /dev/null @@ -1,26 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// GrantVmAccess adds access to a file for a given VM -func GrantVmAccess(ctx context.Context, vmid string, filepath string) (err error) { - title := "hcsshim::GrantVmAccess" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("vm-id", vmid), - trace.StringAttribute("path", filepath)) - - err = grantVmAccess(vmid, filepath) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go deleted file mode 100644 index 687550f0be..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go +++ /dev/null @@ -1,166 +0,0 @@ -package wclayer - -import ( - "context" - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/Microsoft/go-winio" - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/internal/safefile" - "go.opencensus.io/trace" -) - -// ImportLayer will take the contents of the folder at importFolderPath and import -// that into a layer with the id layerId. Note that in order to correctly populate -// the layer and interperet the transport format, all parent layers must already -// be present on the system at the paths provided in parentLayerPaths. -func ImportLayer(ctx context.Context, path string, importFolderPath string, parentLayerPaths []string) (err error) { - title := "hcsshim::ImportLayer" - ctx, span := trace.StartSpan(ctx, title) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.StringAttribute("importFolderPath", importFolderPath), - trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) - - // Generate layer descriptors - layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) - if err != nil { - return err - } - - err = importLayer(&stdDriverInfo, path, importFolderPath, layers) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} - -// LayerWriter is an interface that supports writing a new container image layer. -type LayerWriter interface { - // Add adds a file to the layer with given metadata. - Add(name string, fileInfo *winio.FileBasicInfo) error - // AddLink adds a hard link to the layer. The target must already have been added. - AddLink(name string, target string) error - // Remove removes a file that was present in a parent layer from the layer. - Remove(name string) error - // Write writes data to the current file. The data must be in the format of a Win32 - // backup stream. - Write(b []byte) (int, error) - // Close finishes the layer writing process and releases any resources. - Close() error -} - -type legacyLayerWriterWrapper struct { - ctx context.Context - s *trace.Span - - *legacyLayerWriter - path string - parentLayerPaths []string -} - -func (r *legacyLayerWriterWrapper) Close() (err error) { - defer r.s.End() - defer func() { oc.SetSpanStatus(r.s, err) }() - defer os.RemoveAll(r.root.Name()) - defer r.legacyLayerWriter.CloseRoots() - - err = r.legacyLayerWriter.Close() - if err != nil { - return err - } - - if err = ImportLayer(r.ctx, r.destRoot.Name(), r.path, r.parentLayerPaths); err != nil { - return err - } - for _, name := range r.Tombstones { - if err = safefile.RemoveRelative(name, r.destRoot); err != nil && !os.IsNotExist(err) { - return err - } - } - // Add any hard links that were collected. - for _, lnk := range r.PendingLinks { - if err = safefile.RemoveRelative(lnk.Path, r.destRoot); err != nil && !os.IsNotExist(err) { - return err - } - if err = safefile.LinkRelative(lnk.Target, lnk.TargetRoot, lnk.Path, r.destRoot); err != nil { - return err - } - } - - // The reapplyDirectoryTimes must be called AFTER we are done with Tombstone - // deletion and hard link creation. This is because Tombstone deletion and hard link - // creation updates the directory last write timestamps so that will change the - // timestamps added by the `Add` call. Some container applications depend on the - // correctness of these timestamps and so we should change the timestamps back to - // the original value (i.e the value provided in the Add call) after this - // processing is done. - err = reapplyDirectoryTimes(r.destRoot, r.changedDi) - if err != nil { - return err - } - - // Prepare the utility VM for use if one is present in the layer. - if r.HasUtilityVM { - err := safefile.EnsureNotReparsePointRelative("UtilityVM", r.destRoot) - if err != nil { - return err - } - err = ProcessUtilityVMImage(r.ctx, filepath.Join(r.destRoot.Name(), "UtilityVM")) - if err != nil { - return err - } - } - return nil -} - -// NewLayerWriter returns a new layer writer for creating a layer on disk. -// The caller must have taken the SeBackupPrivilege and SeRestorePrivilege privileges -// to call this and any methods on the resulting LayerWriter. -func NewLayerWriter(ctx context.Context, path string, parentLayerPaths []string) (_ LayerWriter, err error) { - ctx, span := trace.StartSpan(ctx, "hcsshim::NewLayerWriter") - defer func() { - if err != nil { - oc.SetSpanStatus(span, err) - span.End() - } - }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) - - if len(parentLayerPaths) == 0 { - // This is a base layer. It gets imported differently. - f, err := safefile.OpenRoot(path) - if err != nil { - return nil, err - } - return &baseLayerWriter{ - ctx: ctx, - s: span, - root: f, - }, nil - } - - importPath, err := ioutil.TempDir("", "hcs") - if err != nil { - return nil, err - } - w, err := newLegacyLayerWriter(importPath, parentLayerPaths, path) - if err != nil { - return nil, err - } - return &legacyLayerWriterWrapper{ - ctx: ctx, - s: span, - legacyLayerWriter: w, - path: importPath, - parentLayerPaths: parentLayerPaths, - }, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go deleted file mode 100644 index 01e6723393..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go +++ /dev/null @@ -1,28 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// LayerExists will return true if a layer with the given id exists and is known -// to the system. -func LayerExists(ctx context.Context, path string) (_ bool, err error) { - title := "hcsshim::LayerExists" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - // Call the procedure itself. - var exists uint32 - err = layerExists(&stdDriverInfo, path, &exists) - if err != nil { - return false, hcserror.New(err, title, "") - } - span.AddAttributes(trace.BoolAttribute("layer-exists", exists != 0)) - return exists != 0, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go deleted file mode 100644 index 0ce34a30f8..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go +++ /dev/null @@ -1,22 +0,0 @@ -package wclayer - -import ( - "context" - "path/filepath" - - "github.com/Microsoft/go-winio/pkg/guid" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// LayerID returns the layer ID of a layer on disk. -func LayerID(ctx context.Context, path string) (_ guid.GUID, err error) { - title := "hcsshim::LayerID" - ctx, span := trace.StartSpan(ctx, title) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - _, file := filepath.Split(path) - return NameToGuid(ctx, file) -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go deleted file mode 100644 index 1ec893c6af..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go +++ /dev/null @@ -1,97 +0,0 @@ -package wclayer - -// This file contains utility functions to support storage (graph) related -// functionality. - -import ( - "context" - "syscall" - - "github.com/Microsoft/go-winio/pkg/guid" - "github.com/sirupsen/logrus" -) - -/* To pass into syscall, we need a struct matching the following: -enum GraphDriverType -{ - DiffDriver, - FilterDriver -}; - -struct DriverInfo { - GraphDriverType Flavour; - LPCWSTR HomeDir; -}; -*/ - -type driverInfo struct { - Flavour int - HomeDirp *uint16 -} - -var ( - utf16EmptyString uint16 - stdDriverInfo = driverInfo{1, &utf16EmptyString} -) - -/* To pass into syscall, we need a struct matching the following: -typedef struct _WC_LAYER_DESCRIPTOR { - - // - // The ID of the layer - // - - GUID LayerId; - - // - // Additional flags - // - - union { - struct { - ULONG Reserved : 31; - ULONG Dirty : 1; // Created from sandbox as a result of snapshot - }; - ULONG Value; - } Flags; - - // - // Path to the layer root directory, null-terminated - // - - PCWSTR Path; - -} WC_LAYER_DESCRIPTOR, *PWC_LAYER_DESCRIPTOR; -*/ -type WC_LAYER_DESCRIPTOR struct { - LayerId guid.GUID - Flags uint32 - Pathp *uint16 -} - -func layerPathsToDescriptors(ctx context.Context, parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) { - // Array of descriptors that gets constructed. - var layers []WC_LAYER_DESCRIPTOR - - for i := 0; i < len(parentLayerPaths); i++ { - g, err := LayerID(ctx, parentLayerPaths[i]) - if err != nil { - logrus.WithError(err).Debug("Failed to convert name to guid") - return nil, err - } - - p, err := syscall.UTF16PtrFromString(parentLayerPaths[i]) - if err != nil { - logrus.WithError(err).Debug("Failed conversion of parentLayerPath to pointer") - return nil, err - } - - layers = append(layers, WC_LAYER_DESCRIPTOR{ - LayerId: g, - Flags: 0, - Pathp: p, - }) - } - - return layers, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go deleted file mode 100644 index b7f3064f26..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go +++ /dev/null @@ -1,811 +0,0 @@ -package wclayer - -import ( - "bufio" - "encoding/binary" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "syscall" - - "github.com/Microsoft/go-winio" - "github.com/Microsoft/hcsshim/internal/longpath" - "github.com/Microsoft/hcsshim/internal/safefile" - "github.com/Microsoft/hcsshim/internal/winapi" -) - -var errorIterationCanceled = errors.New("") - -var mutatedUtilityVMFiles = map[string]bool{ - `EFI\Microsoft\Boot\BCD`: true, - `EFI\Microsoft\Boot\BCD.LOG`: true, - `EFI\Microsoft\Boot\BCD.LOG1`: true, - `EFI\Microsoft\Boot\BCD.LOG2`: true, -} - -const ( - filesPath = `Files` - hivesPath = `Hives` - utilityVMPath = `UtilityVM` - utilityVMFilesPath = `UtilityVM\Files` -) - -func openFileOrDir(path string, mode uint32, createDisposition uint32) (file *os.File, err error) { - return winio.OpenForBackup(path, mode, syscall.FILE_SHARE_READ, createDisposition) -} - -func hasPathPrefix(p, prefix string) bool { - return strings.HasPrefix(p, prefix) && len(p) > len(prefix) && p[len(prefix)] == '\\' -} - -type fileEntry struct { - path string - fi os.FileInfo - err error -} - -type legacyLayerReader struct { - root string - result chan *fileEntry - proceed chan bool - currentFile *os.File - backupReader *winio.BackupFileReader -} - -// newLegacyLayerReader returns a new LayerReader that can read the Windows -// container layer transport format from disk. -func newLegacyLayerReader(root string) *legacyLayerReader { - r := &legacyLayerReader{ - root: root, - result: make(chan *fileEntry), - proceed: make(chan bool), - } - go r.walk() - return r -} - -func readTombstones(path string) (map[string]([]string), error) { - tf, err := os.Open(filepath.Join(path, "tombstones.txt")) - if err != nil { - return nil, err - } - defer tf.Close() - s := bufio.NewScanner(tf) - if !s.Scan() || s.Text() != "\xef\xbb\xbfVersion 1.0" { - return nil, errors.New("invalid tombstones file") - } - - ts := make(map[string]([]string)) - for s.Scan() { - t := filepath.Join(filesPath, s.Text()[1:]) // skip leading `\` - dir := filepath.Dir(t) - ts[dir] = append(ts[dir], t) - } - if err = s.Err(); err != nil { - return nil, err - } - - return ts, nil -} - -func (r *legacyLayerReader) walkUntilCancelled() error { - root, err := longpath.LongAbs(r.root) - if err != nil { - return err - } - - r.root = root - ts, err := readTombstones(r.root) - if err != nil { - return err - } - - err = filepath.Walk(r.root, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Indirect fix for https://github.com/moby/moby/issues/32838#issuecomment-343610048. - // Handle failure from what may be a golang bug in the conversion of - // UTF16 to UTF8 in files which are left in the recycle bin. Os.Lstat - // which is called by filepath.Walk will fail when a filename contains - // unicode characters. Skip the recycle bin regardless which is goodness. - if strings.EqualFold(path, filepath.Join(r.root, `Files\$Recycle.Bin`)) && info.IsDir() { - return filepath.SkipDir - } - - if path == r.root || path == filepath.Join(r.root, "tombstones.txt") || strings.HasSuffix(path, ".$wcidirs$") { - return nil - } - - r.result <- &fileEntry{path, info, nil} - if !<-r.proceed { - return errorIterationCanceled - } - - // List all the tombstones. - if info.IsDir() { - relPath, err := filepath.Rel(r.root, path) - if err != nil { - return err - } - if dts, ok := ts[relPath]; ok { - for _, t := range dts { - r.result <- &fileEntry{filepath.Join(r.root, t), nil, nil} - if !<-r.proceed { - return errorIterationCanceled - } - } - } - } - return nil - }) - if err == errorIterationCanceled { - return nil - } - if err == nil { - return io.EOF - } - return err -} - -func (r *legacyLayerReader) walk() { - defer close(r.result) - if !<-r.proceed { - return - } - - err := r.walkUntilCancelled() - if err != nil { - for { - r.result <- &fileEntry{err: err} - if !<-r.proceed { - return - } - } - } -} - -func (r *legacyLayerReader) reset() { - if r.backupReader != nil { - r.backupReader.Close() - r.backupReader = nil - } - if r.currentFile != nil { - r.currentFile.Close() - r.currentFile = nil - } -} - -func findBackupStreamSize(r io.Reader) (int64, error) { - br := winio.NewBackupStreamReader(r) - for { - hdr, err := br.Next() - if err != nil { - if err == io.EOF { - err = nil - } - return 0, err - } - if hdr.Id == winio.BackupData { - return hdr.Size, nil - } - } -} - -func (r *legacyLayerReader) Next() (path string, size int64, fileInfo *winio.FileBasicInfo, err error) { - r.reset() - r.proceed <- true - fe := <-r.result - if fe == nil { - err = errors.New("LegacyLayerReader closed") - return - } - if fe.err != nil { - err = fe.err - return - } - - path, err = filepath.Rel(r.root, fe.path) - if err != nil { - return - } - - if fe.fi == nil { - // This is a tombstone. Return a nil fileInfo. - return - } - - if fe.fi.IsDir() && hasPathPrefix(path, filesPath) { - fe.path += ".$wcidirs$" - } - - f, err := openFileOrDir(fe.path, syscall.GENERIC_READ, syscall.OPEN_EXISTING) - if err != nil { - return - } - defer func() { - if f != nil { - f.Close() - } - }() - - fileInfo, err = winio.GetFileBasicInfo(f) - if err != nil { - return - } - - if !hasPathPrefix(path, filesPath) { - size = fe.fi.Size() - r.backupReader = winio.NewBackupFileReader(f, false) - if path == hivesPath || path == filesPath { - // The Hives directory has a non-deterministic file time because of the - // nature of the import process. Use the times from System_Delta. - var g *os.File - g, err = os.Open(filepath.Join(r.root, hivesPath, `System_Delta`)) - if err != nil { - return - } - attr := fileInfo.FileAttributes - fileInfo, err = winio.GetFileBasicInfo(g) - g.Close() - if err != nil { - return - } - fileInfo.FileAttributes = attr - } - - // The creation time and access time get reset for files outside of the Files path. - fileInfo.CreationTime = fileInfo.LastWriteTime - fileInfo.LastAccessTime = fileInfo.LastWriteTime - - } else { - // The file attributes are written before the backup stream. - var attr uint32 - err = binary.Read(f, binary.LittleEndian, &attr) - if err != nil { - return - } - fileInfo.FileAttributes = attr - beginning := int64(4) - - // Find the accurate file size. - if !fe.fi.IsDir() { - size, err = findBackupStreamSize(f) - if err != nil { - err = &os.PathError{Op: "findBackupStreamSize", Path: fe.path, Err: err} - return - } - } - - // Return back to the beginning of the backup stream. - _, err = f.Seek(beginning, 0) - if err != nil { - return - } - } - - r.currentFile = f - f = nil - return -} - -func (r *legacyLayerReader) Read(b []byte) (int, error) { - if r.backupReader == nil { - if r.currentFile == nil { - return 0, io.EOF - } - return r.currentFile.Read(b) - } - return r.backupReader.Read(b) -} - -func (r *legacyLayerReader) Seek(offset int64, whence int) (int64, error) { - if r.backupReader == nil { - if r.currentFile == nil { - return 0, errors.New("no current file") - } - return r.currentFile.Seek(offset, whence) - } - return 0, errors.New("seek not supported on this stream") -} - -func (r *legacyLayerReader) Close() error { - r.proceed <- false - <-r.result - r.reset() - return nil -} - -type pendingLink struct { - Path, Target string - TargetRoot *os.File -} - -type pendingDir struct { - Path string - Root *os.File -} - -type legacyLayerWriter struct { - root *os.File - destRoot *os.File - parentRoots []*os.File - currentFile *os.File - bufWriter *bufio.Writer - currentFileName string - currentFileRoot *os.File - backupWriter *winio.BackupFileWriter - Tombstones []string - HasUtilityVM bool - changedDi []dirInfo - addedFiles map[string]bool - PendingLinks []pendingLink - pendingDirs []pendingDir - currentIsDir bool -} - -// newLegacyLayerWriter returns a LayerWriter that can write the contaler layer -// transport format to disk. -func newLegacyLayerWriter(root string, parentRoots []string, destRoot string) (w *legacyLayerWriter, err error) { - w = &legacyLayerWriter{ - addedFiles: make(map[string]bool), - } - defer func() { - if err != nil { - w.CloseRoots() - w = nil - } - }() - w.root, err = safefile.OpenRoot(root) - if err != nil { - return - } - w.destRoot, err = safefile.OpenRoot(destRoot) - if err != nil { - return - } - for _, r := range parentRoots { - f, err := safefile.OpenRoot(r) - if err != nil { - return w, err - } - w.parentRoots = append(w.parentRoots, f) - } - w.bufWriter = bufio.NewWriterSize(ioutil.Discard, 65536) - return -} - -func (w *legacyLayerWriter) CloseRoots() { - if w.root != nil { - w.root.Close() - w.root = nil - } - if w.destRoot != nil { - w.destRoot.Close() - w.destRoot = nil - } - for i := range w.parentRoots { - _ = w.parentRoots[i].Close() - } - w.parentRoots = nil -} - -func (w *legacyLayerWriter) initUtilityVM() error { - if !w.HasUtilityVM { - err := safefile.MkdirRelative(utilityVMPath, w.destRoot) - if err != nil { - return err - } - // Server 2016 does not support multiple layers for the utility VM, so - // clone the utility VM from the parent layer into this layer. Use hard - // links to avoid unnecessary copying, since most of the files are - // immutable. - err = cloneTree(w.parentRoots[0], w.destRoot, utilityVMFilesPath, mutatedUtilityVMFiles) - if err != nil { - return fmt.Errorf("cloning the parent utility VM image failed: %s", err) - } - w.HasUtilityVM = true - } - return nil -} - -func (w *legacyLayerWriter) reset() error { - err := w.bufWriter.Flush() - if err != nil { - return err - } - w.bufWriter.Reset(ioutil.Discard) - if w.currentIsDir { - r := w.currentFile - br := winio.NewBackupStreamReader(r) - // Seek to the beginning of the backup stream, skipping the fileattrs - if _, err := r.Seek(4, io.SeekStart); err != nil { - return err - } - - for { - bhdr, err := br.Next() - if err == io.EOF { - // end of backupstream data - break - } - if err != nil { - return err - } - switch bhdr.Id { - case winio.BackupReparseData: - // The current file is a `.$wcidirs$` metadata file that - // describes a directory reparse point. Delete the placeholder - // directory to prevent future files being added into the - // destination of the reparse point during the ImportLayer call - if err := safefile.RemoveRelative(w.currentFileName, w.currentFileRoot); err != nil { - return err - } - w.pendingDirs = append(w.pendingDirs, pendingDir{Path: w.currentFileName, Root: w.currentFileRoot}) - default: - // ignore all other stream types, as we only care about directory reparse points - } - } - w.currentIsDir = false - } - if w.backupWriter != nil { - w.backupWriter.Close() - w.backupWriter = nil - } - if w.currentFile != nil { - w.currentFile.Close() - w.currentFile = nil - w.currentFileName = "" - w.currentFileRoot = nil - } - return nil -} - -// copyFileWithMetadata copies a file using the backup/restore APIs in order to preserve metadata -func copyFileWithMetadata(srcRoot, destRoot *os.File, subPath string, isDir bool) (fileInfo *winio.FileBasicInfo, err error) { - src, err := safefile.OpenRelative( - subPath, - srcRoot, - syscall.GENERIC_READ|winio.ACCESS_SYSTEM_SECURITY, - syscall.FILE_SHARE_READ, - winapi.FILE_OPEN, - winapi.FILE_OPEN_REPARSE_POINT) - if err != nil { - return nil, err - } - defer src.Close() - srcr := winio.NewBackupFileReader(src, true) - defer srcr.Close() - - fileInfo, err = winio.GetFileBasicInfo(src) - if err != nil { - return nil, err - } - - extraFlags := uint32(0) - if isDir { - extraFlags |= winapi.FILE_DIRECTORY_FILE - } - dest, err := safefile.OpenRelative( - subPath, - destRoot, - syscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY, - syscall.FILE_SHARE_READ, - winapi.FILE_CREATE, - extraFlags) - if err != nil { - return nil, err - } - defer dest.Close() - - err = winio.SetFileBasicInfo(dest, fileInfo) - if err != nil { - return nil, err - } - - destw := winio.NewBackupFileWriter(dest, true) - defer func() { - cerr := destw.Close() - if err == nil { - err = cerr - } - }() - - _, err = io.Copy(destw, srcr) - if err != nil { - return nil, err - } - - return fileInfo, nil -} - -// cloneTree clones a directory tree using hard links. It skips hard links for -// the file names in the provided map and just copies those files. -func cloneTree(srcRoot *os.File, destRoot *os.File, subPath string, mutatedFiles map[string]bool) error { - var di []dirInfo - err := safefile.EnsureNotReparsePointRelative(subPath, srcRoot) - if err != nil { - return err - } - err = filepath.Walk(filepath.Join(srcRoot.Name(), subPath), func(srcFilePath string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - relPath, err := filepath.Rel(srcRoot.Name(), srcFilePath) - if err != nil { - return err - } - - fileAttributes := info.Sys().(*syscall.Win32FileAttributeData).FileAttributes - // Directories, reparse points, and files that will be mutated during - // utility VM import must be copied. All other files can be hard linked. - isReparsePoint := fileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 - // In go1.9, FileInfo.IsDir() returns false if the directory is also a symlink. - // See: https://github.com/golang/go/commit/1989921aef60c83e6f9127a8448fb5ede10e9acc - // Fixes the problem by checking syscall.FILE_ATTRIBUTE_DIRECTORY directly - isDir := fileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 - - if isDir || isReparsePoint || mutatedFiles[relPath] { - fi, err := copyFileWithMetadata(srcRoot, destRoot, relPath, isDir) - if err != nil { - return err - } - if isDir { - di = append(di, dirInfo{path: relPath, fileInfo: *fi}) - } - } else { - err = safefile.LinkRelative(relPath, srcRoot, relPath, destRoot) - if err != nil { - return err - } - } - - return nil - }) - if err != nil { - return err - } - - return reapplyDirectoryTimes(destRoot, di) -} - -func (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) error { - if err := w.reset(); err != nil { - return err - } - - if name == utilityVMPath { - return w.initUtilityVM() - } - - if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { - w.changedDi = append(w.changedDi, dirInfo{path: name, fileInfo: *fileInfo}) - } - - name = filepath.Clean(name) - if hasPathPrefix(name, utilityVMPath) { - if !w.HasUtilityVM { - return errors.New("missing UtilityVM directory") - } - if !hasPathPrefix(name, utilityVMFilesPath) && name != utilityVMFilesPath { - return errors.New("invalid UtilityVM layer") - } - createDisposition := uint32(winapi.FILE_OPEN) - if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { - st, err := safefile.LstatRelative(name, w.destRoot) - if err != nil && !os.IsNotExist(err) { - return err - } - if st != nil { - // Delete the existing file/directory if it is not the same type as this directory. - existingAttr := st.Sys().(*syscall.Win32FileAttributeData).FileAttributes - if (uint32(fileInfo.FileAttributes)^existingAttr)&(syscall.FILE_ATTRIBUTE_DIRECTORY|syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 { - if err = safefile.RemoveAllRelative(name, w.destRoot); err != nil { - return err - } - st = nil - } - } - if st == nil { - if err = safefile.MkdirRelative(name, w.destRoot); err != nil { - return err - } - } - } else { - // Overwrite any existing hard link. - err := safefile.RemoveRelative(name, w.destRoot) - if err != nil && !os.IsNotExist(err) { - return err - } - createDisposition = winapi.FILE_CREATE - } - - f, err := safefile.OpenRelative( - name, - w.destRoot, - syscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY, - syscall.FILE_SHARE_READ, - createDisposition, - winapi.FILE_OPEN_REPARSE_POINT, - ) - if err != nil { - return err - } - defer func() { - if f != nil { - f.Close() - _ = safefile.RemoveRelative(name, w.destRoot) - } - }() - - err = winio.SetFileBasicInfo(f, fileInfo) - if err != nil { - return err - } - - w.backupWriter = winio.NewBackupFileWriter(f, true) - w.bufWriter.Reset(w.backupWriter) - w.currentFile = f - w.currentFileName = name - w.currentFileRoot = w.destRoot - w.addedFiles[name] = true - f = nil - return nil - } - - fname := name - if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { - err := safefile.MkdirRelative(name, w.root) - if err != nil { - return err - } - fname += ".$wcidirs$" - w.currentIsDir = true - } - - f, err := safefile.OpenRelative(fname, w.root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, 0) - if err != nil { - return err - } - defer func() { - if f != nil { - f.Close() - _ = safefile.RemoveRelative(fname, w.root) - } - }() - - strippedFi := *fileInfo - strippedFi.FileAttributes = 0 - err = winio.SetFileBasicInfo(f, &strippedFi) - if err != nil { - return err - } - - if hasPathPrefix(name, hivesPath) { - w.backupWriter = winio.NewBackupFileWriter(f, false) - w.bufWriter.Reset(w.backupWriter) - } else { - w.bufWriter.Reset(f) - // The file attributes are written before the stream. - err = binary.Write(w.bufWriter, binary.LittleEndian, uint32(fileInfo.FileAttributes)) - if err != nil { - w.bufWriter.Reset(ioutil.Discard) - return err - } - } - - w.currentFile = f - w.currentFileName = name - w.currentFileRoot = w.root - w.addedFiles[name] = true - f = nil - return nil -} - -func (w *legacyLayerWriter) AddLink(name string, target string) error { - if err := w.reset(); err != nil { - return err - } - - target = filepath.Clean(target) - var roots []*os.File - if hasPathPrefix(target, filesPath) { - // Look for cross-layer hard link targets in the parent layers, since - // nothing is in the destination path yet. - roots = w.parentRoots - } else if hasPathPrefix(target, utilityVMFilesPath) { - // Since the utility VM is fully cloned into the destination path - // already, look for cross-layer hard link targets directly in the - // destination path. - roots = []*os.File{w.destRoot} - } - - if roots == nil || (!hasPathPrefix(name, filesPath) && !hasPathPrefix(name, utilityVMFilesPath)) { - return errors.New("invalid hard link in layer") - } - - // Find to try the target of the link in a previously added file. If that - // fails, search in parent layers. - var selectedRoot *os.File - if _, ok := w.addedFiles[target]; ok { - selectedRoot = w.destRoot - } else { - for _, r := range roots { - if _, err := safefile.LstatRelative(target, r); err != nil { - if !os.IsNotExist(err) { - return err - } - } else { - selectedRoot = r - break - } - } - if selectedRoot == nil { - return fmt.Errorf("failed to find link target for '%s' -> '%s'", name, target) - } - } - - // The link can't be written until after the ImportLayer call. - w.PendingLinks = append(w.PendingLinks, pendingLink{ - Path: name, - Target: target, - TargetRoot: selectedRoot, - }) - w.addedFiles[name] = true - return nil -} - -func (w *legacyLayerWriter) Remove(name string) error { - name = filepath.Clean(name) - if hasPathPrefix(name, filesPath) { - w.Tombstones = append(w.Tombstones, name) - } else if hasPathPrefix(name, utilityVMFilesPath) { - err := w.initUtilityVM() - if err != nil { - return err - } - // Make sure the path exists; os.RemoveAll will not fail if the file is - // already gone, and this needs to be a fatal error for diagnostics - // purposes. - if _, err := safefile.LstatRelative(name, w.destRoot); err != nil { - return err - } - err = safefile.RemoveAllRelative(name, w.destRoot) - if err != nil { - return err - } - } else { - return fmt.Errorf("invalid tombstone %s", name) - } - - return nil -} - -func (w *legacyLayerWriter) Write(b []byte) (int, error) { - if w.backupWriter == nil && w.currentFile == nil { - return 0, errors.New("closed") - } - return w.bufWriter.Write(b) -} - -func (w *legacyLayerWriter) Close() error { - if err := w.reset(); err != nil { - return err - } - if err := safefile.RemoveRelative("tombstones.txt", w.root); err != nil && !os.IsNotExist(err) { - return err - } - for _, pd := range w.pendingDirs { - err := safefile.MkdirRelative(pd.Path, pd.Root) - if err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go deleted file mode 100644 index 09950297ce..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go +++ /dev/null @@ -1,29 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/go-winio/pkg/guid" - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// NameToGuid converts the given string into a GUID using the algorithm in the -// Host Compute Service, ensuring GUIDs generated with the same string are common -// across all clients. -func NameToGuid(ctx context.Context, name string) (_ guid.GUID, err error) { - title := "hcsshim::NameToGuid" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("objectName", name)) - - var id guid.GUID - err = nameToGuid(name, &id) - if err != nil { - return guid.GUID{}, hcserror.New(err, title, "") - } - span.AddAttributes(trace.StringAttribute("guid", id.String())) - return id, nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go deleted file mode 100644 index 90129faefb..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go +++ /dev/null @@ -1,44 +0,0 @@ -package wclayer - -import ( - "context" - "strings" - "sync" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -var prepareLayerLock sync.Mutex - -// PrepareLayer finds a mounted read-write layer matching path and enables the -// the filesystem filter for use on that layer. This requires the paths to all -// parent layers, and is necessary in order to view or interact with the layer -// as an actual filesystem (reading and writing files, creating directories, etc). -// Disabling the filter must be done via UnprepareLayer. -func PrepareLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) { - title := "hcsshim::PrepareLayer" - ctx, span := trace.StartSpan(ctx, title) - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes( - trace.StringAttribute("path", path), - trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) - - // Generate layer descriptors - layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) - if err != nil { - return err - } - - // This lock is a temporary workaround for a Windows bug. Only allowing one - // call to prepareLayer at a time vastly reduces the chance of a timeout. - prepareLayerLock.Lock() - defer prepareLayerLock.Unlock() - err = prepareLayer(&stdDriverInfo, path, layers) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go deleted file mode 100644 index 30bcdff5f5..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go +++ /dev/null @@ -1,41 +0,0 @@ -package wclayer - -import ( - "context" - "os" - - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// ProcessBaseLayer post-processes a base layer that has had its files extracted. -// The files should have been extracted to \Files. -func ProcessBaseLayer(ctx context.Context, path string) (err error) { - title := "hcsshim::ProcessBaseLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - err = processBaseImage(path) - if err != nil { - return &os.PathError{Op: title, Path: path, Err: err} - } - return nil -} - -// ProcessUtilityVMImage post-processes a utility VM image that has had its files extracted. -// The files should have been extracted to \Files. -func ProcessUtilityVMImage(ctx context.Context, path string) (err error) { - title := "hcsshim::ProcessUtilityVMImage" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - err = processUtilityImage(path) - if err != nil { - return &os.PathError{Op: title, Path: path, Err: err} - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go deleted file mode 100644 index 71b130c525..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go +++ /dev/null @@ -1,25 +0,0 @@ -package wclayer - -import ( - "context" - - "github.com/Microsoft/hcsshim/internal/hcserror" - "github.com/Microsoft/hcsshim/internal/oc" - "go.opencensus.io/trace" -) - -// UnprepareLayer disables the filesystem filter for the read-write layer with -// the given id. -func UnprepareLayer(ctx context.Context, path string) (err error) { - title := "hcsshim::UnprepareLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck - defer span.End() - defer func() { oc.SetSpanStatus(span, err) }() - span.AddAttributes(trace.StringAttribute("path", path)) - - err = unprepareLayer(&stdDriverInfo, path) - if err != nil { - return hcserror.New(err, title, "") - } - return nil -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go deleted file mode 100644 index 9b1e06d50c..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go +++ /dev/null @@ -1,35 +0,0 @@ -// Package wclayer provides bindings to HCS's legacy layer management API and -// provides a higher level interface around these calls for container layer -// management. -package wclayer - -import "github.com/Microsoft/go-winio/pkg/guid" - -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go wclayer.go - -//sys activateLayer(info *driverInfo, id string) (hr error) = vmcompute.ActivateLayer? -//sys copyLayer(info *driverInfo, srcId string, dstId string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.CopyLayer? -//sys createLayer(info *driverInfo, id string, parent string) (hr error) = vmcompute.CreateLayer? -//sys createSandboxLayer(info *driverInfo, id string, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.CreateSandboxLayer? -//sys expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) = vmcompute.ExpandSandboxSize? -//sys deactivateLayer(info *driverInfo, id string) (hr error) = vmcompute.DeactivateLayer? -//sys destroyLayer(info *driverInfo, id string) (hr error) = vmcompute.DestroyLayer? -//sys exportLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.ExportLayer? -//sys getLayerMountPath(info *driverInfo, id string, length *uintptr, buffer *uint16) (hr error) = vmcompute.GetLayerMountPath? -//sys getBaseImages(buffer **uint16) (hr error) = vmcompute.GetBaseImages? -//sys importLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.ImportLayer? -//sys layerExists(info *driverInfo, id string, exists *uint32) (hr error) = vmcompute.LayerExists? -//sys nameToGuid(name string, guid *_guid) (hr error) = vmcompute.NameToGuid? -//sys prepareLayer(info *driverInfo, id string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.PrepareLayer? -//sys unprepareLayer(info *driverInfo, id string) (hr error) = vmcompute.UnprepareLayer? -//sys processBaseImage(path string) (hr error) = vmcompute.ProcessBaseImage? -//sys processUtilityImage(path string) (hr error) = vmcompute.ProcessUtilityImage? - -//sys grantVmAccess(vmid string, filepath string) (hr error) = vmcompute.GrantVmAccess? - -//sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = virtdisk.OpenVirtualDisk -//sys attachVirtualDisk(handle syscall.Handle, sd uintptr, flags uint32, providerFlags uint32, params uintptr, overlapped uintptr) (err error) [failretval != 0] = virtdisk.AttachVirtualDisk - -//sys getDiskFreeSpaceEx(directoryName string, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) = GetDiskFreeSpaceExW - -type _guid = guid.GUID diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go deleted file mode 100644 index 67f917f07e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go +++ /dev/null @@ -1,569 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package wclayer - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") - modvirtdisk = windows.NewLazySystemDLL("virtdisk.dll") - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - - procActivateLayer = modvmcompute.NewProc("ActivateLayer") - procCopyLayer = modvmcompute.NewProc("CopyLayer") - procCreateLayer = modvmcompute.NewProc("CreateLayer") - procCreateSandboxLayer = modvmcompute.NewProc("CreateSandboxLayer") - procExpandSandboxSize = modvmcompute.NewProc("ExpandSandboxSize") - procDeactivateLayer = modvmcompute.NewProc("DeactivateLayer") - procDestroyLayer = modvmcompute.NewProc("DestroyLayer") - procExportLayer = modvmcompute.NewProc("ExportLayer") - procGetLayerMountPath = modvmcompute.NewProc("GetLayerMountPath") - procGetBaseImages = modvmcompute.NewProc("GetBaseImages") - procImportLayer = modvmcompute.NewProc("ImportLayer") - procLayerExists = modvmcompute.NewProc("LayerExists") - procNameToGuid = modvmcompute.NewProc("NameToGuid") - procPrepareLayer = modvmcompute.NewProc("PrepareLayer") - procUnprepareLayer = modvmcompute.NewProc("UnprepareLayer") - procProcessBaseImage = modvmcompute.NewProc("ProcessBaseImage") - procProcessUtilityImage = modvmcompute.NewProc("ProcessUtilityImage") - procGrantVmAccess = modvmcompute.NewProc("GrantVmAccess") - procOpenVirtualDisk = modvirtdisk.NewProc("OpenVirtualDisk") - procAttachVirtualDisk = modvirtdisk.NewProc("AttachVirtualDisk") - procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW") -) - -func activateLayer(info *driverInfo, id string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _activateLayer(info, _p0) -} - -func _activateLayer(info *driverInfo, id *uint16) (hr error) { - if hr = procActivateLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procActivateLayer.Addr(), 2, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func copyLayer(info *driverInfo, srcId string, dstId string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(srcId) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(dstId) - if hr != nil { - return - } - return _copyLayer(info, _p0, _p1, descriptors) -} - -func _copyLayer(info *driverInfo, srcId *uint16, dstId *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p2 *WC_LAYER_DESCRIPTOR - if len(descriptors) > 0 { - _p2 = &descriptors[0] - } - if hr = procCopyLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procCopyLayer.Addr(), 5, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(srcId)), uintptr(unsafe.Pointer(dstId)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func createLayer(info *driverInfo, id string, parent string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(parent) - if hr != nil { - return - } - return _createLayer(info, _p0, _p1) -} - -func _createLayer(info *driverInfo, id *uint16, parent *uint16) (hr error) { - if hr = procCreateLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procCreateLayer.Addr(), 3, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(parent))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func createSandboxLayer(info *driverInfo, id string, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _createSandboxLayer(info, _p0, parent, descriptors) -} - -func _createSandboxLayer(info *driverInfo, id *uint16, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p1 *WC_LAYER_DESCRIPTOR - if len(descriptors) > 0 { - _p1 = &descriptors[0] - } - if hr = procCreateSandboxLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procCreateSandboxLayer.Addr(), 5, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(parent), uintptr(unsafe.Pointer(_p1)), uintptr(len(descriptors)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _expandSandboxSize(info, _p0, size) -} - -func _expandSandboxSize(info *driverInfo, id *uint16, size uint64) (hr error) { - if hr = procExpandSandboxSize.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procExpandSandboxSize.Addr(), 3, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(size)) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func deactivateLayer(info *driverInfo, id string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _deactivateLayer(info, _p0) -} - -func _deactivateLayer(info *driverInfo, id *uint16) (hr error) { - if hr = procDeactivateLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procDeactivateLayer.Addr(), 2, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func destroyLayer(info *driverInfo, id string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _destroyLayer(info, _p0) -} - -func _destroyLayer(info *driverInfo, id *uint16) (hr error) { - if hr = procDestroyLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procDestroyLayer.Addr(), 2, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func exportLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(path) - if hr != nil { - return - } - return _exportLayer(info, _p0, _p1, descriptors) -} - -func _exportLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p2 *WC_LAYER_DESCRIPTOR - if len(descriptors) > 0 { - _p2 = &descriptors[0] - } - if hr = procExportLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procExportLayer.Addr(), 5, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func getLayerMountPath(info *driverInfo, id string, length *uintptr, buffer *uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _getLayerMountPath(info, _p0, length, buffer) -} - -func _getLayerMountPath(info *driverInfo, id *uint16, length *uintptr, buffer *uint16) (hr error) { - if hr = procGetLayerMountPath.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procGetLayerMountPath.Addr(), 4, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(length)), uintptr(unsafe.Pointer(buffer)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func getBaseImages(buffer **uint16) (hr error) { - if hr = procGetBaseImages.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procGetBaseImages.Addr(), 1, uintptr(unsafe.Pointer(buffer)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func importLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(path) - if hr != nil { - return - } - return _importLayer(info, _p0, _p1, descriptors) -} - -func _importLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p2 *WC_LAYER_DESCRIPTOR - if len(descriptors) > 0 { - _p2 = &descriptors[0] - } - if hr = procImportLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procImportLayer.Addr(), 5, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func layerExists(info *driverInfo, id string, exists *uint32) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _layerExists(info, _p0, exists) -} - -func _layerExists(info *driverInfo, id *uint16, exists *uint32) (hr error) { - if hr = procLayerExists.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procLayerExists.Addr(), 3, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(exists))) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func nameToGuid(name string, guid *_guid) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(name) - if hr != nil { - return - } - return _nameToGuid(_p0, guid) -} - -func _nameToGuid(name *uint16, guid *_guid) (hr error) { - if hr = procNameToGuid.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procNameToGuid.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(guid)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func prepareLayer(info *driverInfo, id string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _prepareLayer(info, _p0, descriptors) -} - -func _prepareLayer(info *driverInfo, id *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { - var _p1 *WC_LAYER_DESCRIPTOR - if len(descriptors) > 0 { - _p1 = &descriptors[0] - } - if hr = procPrepareLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall6(procPrepareLayer.Addr(), 4, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(_p1)), uintptr(len(descriptors)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func unprepareLayer(info *driverInfo, id string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) - if hr != nil { - return - } - return _unprepareLayer(info, _p0) -} - -func _unprepareLayer(info *driverInfo, id *uint16) (hr error) { - if hr = procUnprepareLayer.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procUnprepareLayer.Addr(), 2, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func processBaseImage(path string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(path) - if hr != nil { - return - } - return _processBaseImage(_p0) -} - -func _processBaseImage(path *uint16) (hr error) { - if hr = procProcessBaseImage.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procProcessBaseImage.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func processUtilityImage(path string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(path) - if hr != nil { - return - } - return _processUtilityImage(_p0) -} - -func _processUtilityImage(path *uint16) (hr error) { - if hr = procProcessUtilityImage.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procProcessUtilityImage.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func grantVmAccess(vmid string, filepath string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(vmid) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(filepath) - if hr != nil { - return - } - return _grantVmAccess(_p0, _p1) -} - -func _grantVmAccess(vmid *uint16, filepath *uint16) (hr error) { - if hr = procGrantVmAccess.Find(); hr != nil { - return - } - r0, _, _ := syscall.Syscall(procGrantVmAccess.Addr(), 2, uintptr(unsafe.Pointer(vmid)), uintptr(unsafe.Pointer(filepath)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(path) - if err != nil { - return - } - return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle) -} - -func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { - r1, _, e1 := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle))) - if r1 != 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func attachVirtualDisk(handle syscall.Handle, sd uintptr, flags uint32, providerFlags uint32, params uintptr, overlapped uintptr) (err error) { - r1, _, e1 := syscall.Syscall6(procAttachVirtualDisk.Addr(), 6, uintptr(handle), uintptr(sd), uintptr(flags), uintptr(providerFlags), uintptr(params), uintptr(overlapped)) - if r1 != 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func getDiskFreeSpaceEx(directoryName string, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(directoryName) - if err != nil { - return - } - return _getDiskFreeSpaceEx(_p0, freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfFreeBytes) -} - -func _getDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) { - r1, _, e1 := syscall.Syscall6(procGetDiskFreeSpaceExW.Addr(), 4, uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailableToCaller)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go deleted file mode 100644 index def9525417..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go +++ /dev/null @@ -1,44 +0,0 @@ -package winapi - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -const PSEUDOCONSOLE_INHERIT_CURSOR = 0x1 - -// CreatePseudoConsole creates a windows pseudo console. -func CreatePseudoConsole(size windows.Coord, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) error { - // We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand. - return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), hInput, hOutput, 0, hpcon) -} - -// ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`. -func ResizePseudoConsole(hpcon windows.Handle, size windows.Coord) error { - // We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand. - return resizePseudoConsole(hpcon, *((*uint32)(unsafe.Pointer(&size)))) -} - -// HRESULT WINAPI CreatePseudoConsole( -// _In_ COORD size, -// _In_ HANDLE hInput, -// _In_ HANDLE hOutput, -// _In_ DWORD dwFlags, -// _Out_ HPCON* phPC -// ); -// -//sys createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) = kernel32.CreatePseudoConsole - -// void WINAPI ClosePseudoConsole( -// _In_ HPCON hPC -// ); -// -//sys ClosePseudoConsole(hpc windows.Handle) = kernel32.ClosePseudoConsole - -// HRESULT WINAPI ResizePseudoConsole( -// _In_ HPCON hPC , -// _In_ COORD size -// ); -// -//sys resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go deleted file mode 100644 index df28ea2421..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go +++ /dev/null @@ -1,13 +0,0 @@ -package winapi - -import "github.com/Microsoft/go-winio/pkg/guid" - -//sys CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) = cfgmgr32.CM_Get_Device_ID_List_SizeA -//sys CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error)= cfgmgr32.CM_Get_Device_ID_ListA -//sys CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) = cfgmgr32.CM_Locate_DevNodeW -//sys CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) = cfgmgr32.CM_Get_DevNode_PropertyW - -type DevPropKey struct { - Fmtid guid.GUID - Pid uint32 -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go deleted file mode 100644 index 4e80ef68c9..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go +++ /dev/null @@ -1,15 +0,0 @@ -package winapi - -import "syscall" - -//sys RtlNtStatusToDosError(status uint32) (winerr error) = ntdll.RtlNtStatusToDosError - -const ( - STATUS_REPARSE_POINT_ENCOUNTERED = 0xC000050B - ERROR_NO_MORE_ITEMS = 0x103 - ERROR_MORE_DATA syscall.Errno = 234 -) - -func NTSuccess(status uint32) bool { - return status == 0 -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go deleted file mode 100644 index 7ce52afd5e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go +++ /dev/null @@ -1,110 +0,0 @@ -package winapi - -//sys NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) = ntdll.NtCreateFile -//sys NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) = ntdll.NtSetInformationFile - -//sys NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) = ntdll.NtOpenDirectoryObject -//sys NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32)(status uint32) = ntdll.NtQueryDirectoryObject - -const ( - FileLinkInformationClass = 11 - FileDispositionInformationExClass = 64 - - FILE_READ_ATTRIBUTES = 0x0080 - FILE_WRITE_ATTRIBUTES = 0x0100 - DELETE = 0x10000 - - FILE_OPEN = 1 - FILE_CREATE = 2 - - FILE_LIST_DIRECTORY = 0x00000001 - FILE_DIRECTORY_FILE = 0x00000001 - FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020 - FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000 - FILE_OPEN_REPARSE_POINT = 0x00200000 - - FILE_DISPOSITION_DELETE = 0x00000001 - - OBJ_DONT_REPARSE = 0x1000 - - STATUS_MORE_ENTRIES = 0x105 - STATUS_NO_MORE_ENTRIES = 0x8000001a -) - -// Select entries from FILE_INFO_BY_HANDLE_CLASS. -// -// C declaration: -// typedef enum _FILE_INFO_BY_HANDLE_CLASS { -// FileBasicInfo, -// FileStandardInfo, -// FileNameInfo, -// FileRenameInfo, -// FileDispositionInfo, -// FileAllocationInfo, -// FileEndOfFileInfo, -// FileStreamInfo, -// FileCompressionInfo, -// FileAttributeTagInfo, -// FileIdBothDirectoryInfo, -// FileIdBothDirectoryRestartInfo, -// FileIoPriorityHintInfo, -// FileRemoteProtocolInfo, -// FileFullDirectoryInfo, -// FileFullDirectoryRestartInfo, -// FileStorageInfo, -// FileAlignmentInfo, -// FileIdInfo, -// FileIdExtdDirectoryInfo, -// FileIdExtdDirectoryRestartInfo, -// FileDispositionInfoEx, -// FileRenameInfoEx, -// FileCaseSensitiveInfo, -// FileNormalizedNameInfo, -// MaximumFileInfoByHandleClass -// } FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS; -// -// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ne-minwinbase-file_info_by_handle_class -const ( - FileIdInfo = 18 -) - -type FileDispositionInformationEx struct { - Flags uintptr -} - -type IOStatusBlock struct { - Status, Information uintptr -} - -type ObjectAttributes struct { - Length uintptr - RootDirectory uintptr - ObjectName *UnicodeString - Attributes uintptr - SecurityDescriptor uintptr - SecurityQoS uintptr -} - -type ObjectDirectoryInformation struct { - Name UnicodeString - TypeName UnicodeString -} - -type FileLinkInformation struct { - ReplaceIfExists bool - RootDirectory uintptr - FileNameLength uint32 - FileName [1]uint16 -} - -// C declaration: -// typedef struct _FILE_ID_INFO { -// ULONGLONG VolumeSerialNumber; -// FILE_ID_128 FileId; -// } FILE_ID_INFO, *PFILE_ID_INFO; -// -// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_id_info -type FILE_ID_INFO struct { - VolumeSerialNumber uint64 - FileID [16]byte -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go deleted file mode 100644 index 7eb13f8f0a..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go +++ /dev/null @@ -1,218 +0,0 @@ -package winapi - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -// Messages that can be received from an assigned io completion port. -// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port -const ( - JOB_OBJECT_MSG_END_OF_JOB_TIME uint32 = 1 - JOB_OBJECT_MSG_END_OF_PROCESS_TIME uint32 = 2 - JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT uint32 = 3 - JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO uint32 = 4 - JOB_OBJECT_MSG_NEW_PROCESS uint32 = 6 - JOB_OBJECT_MSG_EXIT_PROCESS uint32 = 7 - JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS uint32 = 8 - JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT uint32 = 9 - JOB_OBJECT_MSG_JOB_MEMORY_LIMIT uint32 = 10 - JOB_OBJECT_MSG_NOTIFICATION_LIMIT uint32 = 11 -) - -// Access rights for creating or opening job objects. -// -// https://docs.microsoft.com/en-us/windows/win32/procthread/job-object-security-and-access-rights -const ( - JOB_OBJECT_QUERY = 0x0004 - JOB_OBJECT_ALL_ACCESS = 0x1F001F -) - -// IO limit flags -// -// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information -const JOB_OBJECT_IO_RATE_CONTROL_ENABLE = 0x1 - -const JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE uint32 = 0x1 - -// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information -const ( - JOB_OBJECT_CPU_RATE_CONTROL_ENABLE uint32 = 1 << iota - JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED - JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP - JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY - JOB_OBJECT_CPU_RATE_CONTROL_MIN_MAX_RATE -) - -// JobObjectInformationClass values. Used for a call to QueryInformationJobObject -// -// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject -const ( - JobObjectBasicAccountingInformation uint32 = 1 - JobObjectBasicProcessIdList uint32 = 3 - JobObjectBasicAndIoAccountingInformation uint32 = 8 - JobObjectLimitViolationInformation uint32 = 13 - JobObjectMemoryUsageInformation uint32 = 28 - JobObjectNotificationLimitInformation2 uint32 = 33 - JobObjectIoAttribution uint32 = 42 -) - -// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information -type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { - PerProcessUserTimeLimit int64 - PerJobUserTimeLimit int64 - LimitFlags uint32 - MinimumWorkingSetSize uintptr - MaximumWorkingSetSize uintptr - ActiveProcessLimit uint32 - Affinity uintptr - PriorityClass uint32 - SchedulingClass uint32 -} - -// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information -type JOBOBJECT_CPU_RATE_CONTROL_INFORMATION struct { - ControlFlags uint32 - Value uint32 -} - -// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information -type JOBOBJECT_IO_RATE_CONTROL_INFORMATION struct { - MaxIops int64 - MaxBandwidth int64 - ReservationIops int64 - BaseIOSize uint32 - VolumeName string - ControlFlags uint32 -} - -// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_process_id_list -type JOBOBJECT_BASIC_PROCESS_ID_LIST struct { - NumberOfAssignedProcesses uint32 - NumberOfProcessIdsInList uint32 - ProcessIdList [1]uintptr -} - -// AllPids returns all the process Ids in the job object. -func (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr { - return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList:p.NumberOfProcessIdsInList] -} - -// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information -type JOBOBJECT_BASIC_ACCOUNTING_INFORMATION struct { - TotalUserTime int64 - TotalKernelTime int64 - ThisPeriodTotalUserTime int64 - ThisPeriodTotalKernelTime int64 - TotalPageFaultCount uint32 - TotalProcesses uint32 - ActiveProcesses uint32 - TotalTerminateProcesses uint32 -} - -//https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_and_io_accounting_information -type JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION struct { - BasicInfo JOBOBJECT_BASIC_ACCOUNTING_INFORMATION - IoInfo windows.IO_COUNTERS -} - -// typedef struct _JOBOBJECT_MEMORY_USAGE_INFORMATION { -// ULONG64 JobMemory; -// ULONG64 PeakJobMemoryUsed; -// } JOBOBJECT_MEMORY_USAGE_INFORMATION, *PJOBOBJECT_MEMORY_USAGE_INFORMATION; -// -type JOBOBJECT_MEMORY_USAGE_INFORMATION struct { - JobMemory uint64 - PeakJobMemoryUsed uint64 -} - -// typedef struct _JOBOBJECT_IO_ATTRIBUTION_STATS { -// ULONG_PTR IoCount; -// ULONGLONG TotalNonOverlappedQueueTime; -// ULONGLONG TotalNonOverlappedServiceTime; -// ULONGLONG TotalSize; -// } JOBOBJECT_IO_ATTRIBUTION_STATS, *PJOBOBJECT_IO_ATTRIBUTION_STATS; -// -type JOBOBJECT_IO_ATTRIBUTION_STATS struct { - IoCount uintptr - TotalNonOverlappedQueueTime uint64 - TotalNonOverlappedServiceTime uint64 - TotalSize uint64 -} - -// typedef struct _JOBOBJECT_IO_ATTRIBUTION_INFORMATION { -// ULONG ControlFlags; -// JOBOBJECT_IO_ATTRIBUTION_STATS ReadStats; -// JOBOBJECT_IO_ATTRIBUTION_STATS WriteStats; -// } JOBOBJECT_IO_ATTRIBUTION_INFORMATION, *PJOBOBJECT_IO_ATTRIBUTION_INFORMATION; -// -type JOBOBJECT_IO_ATTRIBUTION_INFORMATION struct { - ControlFlags uint32 - ReadStats JOBOBJECT_IO_ATTRIBUTION_STATS - WriteStats JOBOBJECT_IO_ATTRIBUTION_STATS -} - -// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port -type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct { - CompletionKey windows.Handle - CompletionPort windows.Handle -} - -// BOOL IsProcessInJob( -// HANDLE ProcessHandle, -// HANDLE JobHandle, -// PBOOL Result -// ); -// -//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) = kernel32.IsProcessInJob - -// BOOL QueryInformationJobObject( -// HANDLE hJob, -// JOBOBJECTINFOCLASS JobObjectInformationClass, -// LPVOID lpJobObjectInformation, -// DWORD cbJobObjectInformationLength, -// LPDWORD lpReturnLength -// ); -// -//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject - -// HANDLE OpenJobObjectW( -// DWORD dwDesiredAccess, -// BOOL bInheritHandle, -// LPCWSTR lpName -// ); -// -//sys OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) = kernel32.OpenJobObjectW - -// DWORD SetIoRateControlInformationJobObject( -// HANDLE hJob, -// JOBOBJECT_IO_RATE_CONTROL_INFORMATION *IoRateControlInfo -// ); -// -//sys SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) = kernel32.SetIoRateControlInformationJobObject - -// DWORD QueryIoRateControlInformationJobObject( -// HANDLE hJob, -// PCWSTR VolumeName, -// JOBOBJECT_IO_RATE_CONTROL_INFORMATION **InfoBlocks, -// ULONG *InfoBlockCount -// ); -//sys QueryIoRateControlInformationJobObject(jobHandle windows.Handle, volumeName *uint16, ioRateControlInfo **JOBOBJECT_IO_RATE_CONTROL_INFORMATION, infoBlockCount *uint32) (ret uint32, err error) = kernel32.QueryIoRateControlInformationJobObject - -// NTSTATUS -// NtOpenJobObject ( -// _Out_ PHANDLE JobHandle, -// _In_ ACCESS_MASK DesiredAccess, -// _In_ POBJECT_ATTRIBUTES ObjectAttributes -// ); -//sys NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtOpenJobObject - -// NTSTATUS -// NTAPI -// NtCreateJobObject ( -// _Out_ PHANDLE JobHandle, -// _In_ ACCESS_MASK DesiredAccess, -// _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes -// ); -//sys NtCreateJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtCreateJobObject diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go deleted file mode 100644 index b6e7cfd460..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go +++ /dev/null @@ -1,30 +0,0 @@ -package winapi - -// BOOL LogonUserA( -// LPCWSTR lpszUsername, -// LPCWSTR lpszDomain, -// LPCWSTR lpszPassword, -// DWORD dwLogonType, -// DWORD dwLogonProvider, -// PHANDLE phToken -// ); -// -//sys LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) = advapi32.LogonUserW - -// Logon types -const ( - LOGON32_LOGON_INTERACTIVE uint32 = 2 - LOGON32_LOGON_NETWORK uint32 = 3 - LOGON32_LOGON_BATCH uint32 = 4 - LOGON32_LOGON_SERVICE uint32 = 5 - LOGON32_LOGON_UNLOCK uint32 = 7 - LOGON32_LOGON_NETWORK_CLEARTEXT uint32 = 8 - LOGON32_LOGON_NEW_CREDENTIALS uint32 = 9 -) - -// Logon providers -const ( - LOGON32_PROVIDER_DEFAULT uint32 = 0 - LOGON32_PROVIDER_WINNT40 uint32 = 2 - LOGON32_PROVIDER_WINNT50 uint32 = 3 -) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go deleted file mode 100644 index 53f62948c9..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go +++ /dev/null @@ -1,4 +0,0 @@ -package winapi - -//sys LocalAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc -//sys LocalFree(ptr uintptr) = kernel32.LocalFree diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go deleted file mode 100644 index f37910024f..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go +++ /dev/null @@ -1,3 +0,0 @@ -package winapi - -//sys SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) = iphlpapi.SetJobCompartmentId diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go deleted file mode 100644 index 908920e872..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go +++ /dev/null @@ -1,11 +0,0 @@ -package winapi - -// DWORD SearchPathW( -// LPCWSTR lpPath, -// LPCWSTR lpFileName, -// LPCWSTR lpExtension, -// DWORD nBufferLength, -// LPWSTR lpBuffer, -// LPWSTR *lpFilePart -// ); -//sys SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath *uint16) (size uint32, err error) = kernel32.SearchPathW diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go deleted file mode 100644 index 222529f433..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go +++ /dev/null @@ -1,65 +0,0 @@ -package winapi - -const PROCESS_ALL_ACCESS uint32 = 2097151 - -const ( - PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x20016 - PROC_THREAD_ATTRIBUTE_JOB_LIST = 0x2000D -) - -// ProcessVmCounters corresponds to the _VM_COUNTERS_EX and _VM_COUNTERS_EX2 structures. -const ProcessVmCounters = 3 - -// __kernel_entry NTSTATUS NtQueryInformationProcess( -// [in] HANDLE ProcessHandle, -// [in] PROCESSINFOCLASS ProcessInformationClass, -// [out] PVOID ProcessInformation, -// [in] ULONG ProcessInformationLength, -// [out, optional] PULONG ReturnLength -// ); -// -//sys NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQueryInformationProcess - -// typedef struct _VM_COUNTERS_EX -// { -// SIZE_T PeakVirtualSize; -// SIZE_T VirtualSize; -// ULONG PageFaultCount; -// SIZE_T PeakWorkingSetSize; -// SIZE_T WorkingSetSize; -// SIZE_T QuotaPeakPagedPoolUsage; -// SIZE_T QuotaPagedPoolUsage; -// SIZE_T QuotaPeakNonPagedPoolUsage; -// SIZE_T QuotaNonPagedPoolUsage; -// SIZE_T PagefileUsage; -// SIZE_T PeakPagefileUsage; -// SIZE_T PrivateUsage; -// } VM_COUNTERS_EX, *PVM_COUNTERS_EX; -// -type VM_COUNTERS_EX struct { - PeakVirtualSize uintptr - VirtualSize uintptr - PageFaultCount uint32 - PeakWorkingSetSize uintptr - WorkingSetSize uintptr - QuotaPeakPagedPoolUsage uintptr - QuotaPagedPoolUsage uintptr - QuotaPeakNonPagedPoolUsage uintptr - QuotaNonPagedPoolUsage uintptr - PagefileUsage uintptr - PeakPagefileUsage uintptr - PrivateUsage uintptr -} - -// typedef struct _VM_COUNTERS_EX2 -// { -// VM_COUNTERS_EX CountersEx; -// SIZE_T PrivateWorkingSetSize; -// SIZE_T SharedCommitUsage; -// } VM_COUNTERS_EX2, *PVM_COUNTERS_EX2; -// -type VM_COUNTERS_EX2 struct { - CountersEx VM_COUNTERS_EX - PrivateWorkingSetSize uintptr - SharedCommitUsage uintptr -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go deleted file mode 100644 index ce79ac2cdb..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go +++ /dev/null @@ -1,7 +0,0 @@ -package winapi - -// Get count from all processor groups. -// https://docs.microsoft.com/en-us/windows/win32/procthread/processor-groups -const ALL_PROCESSOR_GROUPS = 0xFFFF - -//sys GetActiveProcessorCount(groupNumber uint16) (amount uint32) = kernel32.GetActiveProcessorCount diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go deleted file mode 100644 index 78fe01a4b4..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go +++ /dev/null @@ -1,53 +0,0 @@ -package winapi - -import "golang.org/x/sys/windows" - -const SystemProcessInformation = 5 - -const STATUS_INFO_LENGTH_MISMATCH = 0xC0000004 - -// __kernel_entry NTSTATUS NtQuerySystemInformation( -// SYSTEM_INFORMATION_CLASS SystemInformationClass, -// PVOID SystemInformation, -// ULONG SystemInformationLength, -// PULONG ReturnLength -// ); -// -//sys NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQuerySystemInformation - -type SYSTEM_PROCESS_INFORMATION struct { - NextEntryOffset uint32 // ULONG - NumberOfThreads uint32 // ULONG - WorkingSetPrivateSize int64 // LARGE_INTEGER - HardFaultCount uint32 // ULONG - NumberOfThreadsHighWatermark uint32 // ULONG - CycleTime uint64 // ULONGLONG - CreateTime int64 // LARGE_INTEGER - UserTime int64 // LARGE_INTEGER - KernelTime int64 // LARGE_INTEGER - ImageName UnicodeString // UNICODE_STRING - BasePriority int32 // KPRIORITY - UniqueProcessID windows.Handle // HANDLE - InheritedFromUniqueProcessID windows.Handle // HANDLE - HandleCount uint32 // ULONG - SessionID uint32 // ULONG - UniqueProcessKey *uint32 // ULONG_PTR - PeakVirtualSize uintptr // SIZE_T - VirtualSize uintptr // SIZE_T - PageFaultCount uint32 // ULONG - PeakWorkingSetSize uintptr // SIZE_T - WorkingSetSize uintptr // SIZE_T - QuotaPeakPagedPoolUsage uintptr // SIZE_T - QuotaPagedPoolUsage uintptr // SIZE_T - QuotaPeakNonPagedPoolUsage uintptr // SIZE_T - QuotaNonPagedPoolUsage uintptr // SIZE_T - PagefileUsage uintptr // SIZE_T - PeakPagefileUsage uintptr // SIZE_T - PrivatePageCount uintptr // SIZE_T - ReadOperationCount int64 // LARGE_INTEGER - WriteOperationCount int64 // LARGE_INTEGER - OtherOperationCount int64 // LARGE_INTEGER - ReadTransferCount int64 // LARGE_INTEGER - WriteTransferCount int64 // LARGE_INTEGER - OtherTransferCount int64 // LARGE_INTEGER -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go deleted file mode 100644 index 4724713e3e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go +++ /dev/null @@ -1,12 +0,0 @@ -package winapi - -// HANDLE CreateRemoteThread( -// HANDLE hProcess, -// LPSECURITY_ATTRIBUTES lpThreadAttributes, -// SIZE_T dwStackSize, -// LPTHREAD_START_ROUTINE lpStartAddress, -// LPVOID lpParameter, -// DWORD dwCreationFlags, -// LPDWORD lpThreadId -// ); -//sys CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes, stackSize uint32, startAddr uintptr, parameter uintptr, creationFlags uint32, threadID *uint32) (handle windows.Handle, err error) = kernel32.CreateRemoteThread diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go deleted file mode 100644 index 859b753c24..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go +++ /dev/null @@ -1,80 +0,0 @@ -package winapi - -import ( - "errors" - "reflect" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -// Uint16BufferToSlice wraps a uint16 pointer-and-length into a slice -// for easier interop with Go APIs -func Uint16BufferToSlice(buffer *uint16, bufferLength int) (result []uint16) { - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&result)) - hdr.Data = uintptr(unsafe.Pointer(buffer)) - hdr.Cap = bufferLength - hdr.Len = bufferLength - - return -} - -// UnicodeString corresponds to UNICODE_STRING win32 struct defined here -// https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_unicode_string -type UnicodeString struct { - Length uint16 - MaximumLength uint16 - Buffer *uint16 -} - -// NTSTRSAFE_UNICODE_STRING_MAX_CCH is a constant defined in ntstrsafe.h. This value -// denotes the maximum number of wide chars a path can have. -const NTSTRSAFE_UNICODE_STRING_MAX_CCH = 32767 - -//String converts a UnicodeString to a golang string -func (uni UnicodeString) String() string { - // UnicodeString is not guaranteed to be null terminated, therefore - // use the UnicodeString's Length field - return windows.UTF16ToString(Uint16BufferToSlice(uni.Buffer, int(uni.Length/2))) -} - -// NewUnicodeString allocates a new UnicodeString and copies `s` into -// the buffer of the new UnicodeString. -func NewUnicodeString(s string) (*UnicodeString, error) { - buf, err := windows.UTF16FromString(s) - if err != nil { - return nil, err - } - - if len(buf) > NTSTRSAFE_UNICODE_STRING_MAX_CCH { - return nil, syscall.ENAMETOOLONG - } - - uni := &UnicodeString{ - // The length is in bytes and should not include the trailing null character. - Length: uint16((len(buf) - 1) * 2), - MaximumLength: uint16((len(buf) - 1) * 2), - Buffer: &buf[0], - } - return uni, nil -} - -// ConvertStringSetToSlice is a helper function used to convert the contents of -// `buf` into a string slice. `buf` contains a set of null terminated strings -// with an additional null at the end to indicate the end of the set. -func ConvertStringSetToSlice(buf []byte) ([]string, error) { - var results []string - prev := 0 - for i := range buf { - if buf[i] == 0 { - if prev == i { - // found two null characters in a row, return result - return results, nil - } - results = append(results, string(buf[prev:i])) - prev = i + 1 - } - } - return nil, errors.New("string set malformed: missing null terminator at end of buffer") -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go deleted file mode 100644 index d2cc9d9fba..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package winapi contains various low-level bindings to Windows APIs. It can -// be thought of as an extension to golang.org/x/sys/windows. -package winapi - -//go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go user.go console.go system.go net.go path.go thread.go jobobject.go logon.go memory.go process.go processor.go devices.go filesystem.go errors.go diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go deleted file mode 100644 index 1f16cf0b8e..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go +++ /dev/null @@ -1,354 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package winapi - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - modntdll = windows.NewLazySystemDLL("ntdll.dll") - modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") - modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") - modcfgmgr32 = windows.NewLazySystemDLL("cfgmgr32.dll") - - procCreatePseudoConsole = modkernel32.NewProc("CreatePseudoConsole") - procClosePseudoConsole = modkernel32.NewProc("ClosePseudoConsole") - procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") - procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation") - procSetJobCompartmentId = modiphlpapi.NewProc("SetJobCompartmentId") - procSearchPathW = modkernel32.NewProc("SearchPathW") - procCreateRemoteThread = modkernel32.NewProc("CreateRemoteThread") - procIsProcessInJob = modkernel32.NewProc("IsProcessInJob") - procQueryInformationJobObject = modkernel32.NewProc("QueryInformationJobObject") - procOpenJobObjectW = modkernel32.NewProc("OpenJobObjectW") - procSetIoRateControlInformationJobObject = modkernel32.NewProc("SetIoRateControlInformationJobObject") - procQueryIoRateControlInformationJobObject = modkernel32.NewProc("QueryIoRateControlInformationJobObject") - procNtOpenJobObject = modntdll.NewProc("NtOpenJobObject") - procNtCreateJobObject = modntdll.NewProc("NtCreateJobObject") - procLogonUserW = modadvapi32.NewProc("LogonUserW") - procLocalAlloc = modkernel32.NewProc("LocalAlloc") - procLocalFree = modkernel32.NewProc("LocalFree") - procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess") - procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount") - procCM_Get_Device_ID_List_SizeA = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA") - procCM_Get_Device_ID_ListA = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA") - procCM_Locate_DevNodeW = modcfgmgr32.NewProc("CM_Locate_DevNodeW") - procCM_Get_DevNode_PropertyW = modcfgmgr32.NewProc("CM_Get_DevNode_PropertyW") - procNtCreateFile = modntdll.NewProc("NtCreateFile") - procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile") - procNtOpenDirectoryObject = modntdll.NewProc("NtOpenDirectoryObject") - procNtQueryDirectoryObject = modntdll.NewProc("NtQueryDirectoryObject") - procRtlNtStatusToDosError = modntdll.NewProc("RtlNtStatusToDosError") -) - -func createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) { - r0, _, _ := syscall.Syscall6(procCreatePseudoConsole.Addr(), 5, uintptr(size), uintptr(hInput), uintptr(hOutput), uintptr(dwFlags), uintptr(unsafe.Pointer(hpcon)), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func ClosePseudoConsole(hpc windows.Handle) { - syscall.Syscall(procClosePseudoConsole.Addr(), 1, uintptr(hpc), 0, 0) - return -} - -func resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) { - r0, _, _ := syscall.Syscall(procResizePseudoConsole.Addr(), 2, uintptr(hPc), uintptr(size), 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) { - r0, _, _ := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInfoClass), uintptr(systemInformation), uintptr(systemInfoLength), uintptr(unsafe.Pointer(returnLength)), 0, 0) - status = uint32(r0) - return -} - -func SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) { - r0, _, _ := syscall.Syscall(procSetJobCompartmentId.Addr(), 2, uintptr(handle), uintptr(compartmentId), 0) - if r0 != 0 { - win32Err = syscall.Errno(r0) - } - return -} - -func SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath *uint16) (size uint32, err error) { - r0, _, e1 := syscall.Syscall6(procSearchPathW.Addr(), 6, uintptr(unsafe.Pointer(lpPath)), uintptr(unsafe.Pointer(lpFileName)), uintptr(unsafe.Pointer(lpExtension)), uintptr(nBufferLength), uintptr(unsafe.Pointer(lpBuffer)), uintptr(unsafe.Pointer(lpFilePath))) - size = uint32(r0) - if size == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes, stackSize uint32, startAddr uintptr, parameter uintptr, creationFlags uint32, threadID *uint32) (handle windows.Handle, err error) { - r0, _, e1 := syscall.Syscall9(procCreateRemoteThread.Addr(), 7, uintptr(process), uintptr(unsafe.Pointer(sa)), uintptr(stackSize), uintptr(startAddr), uintptr(parameter), uintptr(creationFlags), uintptr(unsafe.Pointer(threadID)), 0, 0) - handle = windows.Handle(r0) - if handle == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) { - r1, _, e1 := syscall.Syscall(procIsProcessInJob.Addr(), 3, uintptr(procHandle), uintptr(jobHandle), uintptr(unsafe.Pointer(result))) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procQueryInformationJobObject.Addr(), 5, uintptr(jobHandle), uintptr(infoClass), uintptr(jobObjectInfo), uintptr(jobObjectInformationLength), uintptr(unsafe.Pointer(lpReturnLength)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) { - var _p0 uint32 - if inheritHandle { - _p0 = 1 - } else { - _p0 = 0 - } - r0, _, e1 := syscall.Syscall(procOpenJobObjectW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(lpName))) - handle = windows.Handle(r0) - if handle == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) { - r0, _, e1 := syscall.Syscall(procSetIoRateControlInformationJobObject.Addr(), 2, uintptr(jobHandle), uintptr(unsafe.Pointer(ioRateControlInfo)), 0) - ret = uint32(r0) - if ret == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func QueryIoRateControlInformationJobObject(jobHandle windows.Handle, volumeName *uint16, ioRateControlInfo **JOBOBJECT_IO_RATE_CONTROL_INFORMATION, infoBlockCount *uint32) (ret uint32, err error) { - r0, _, e1 := syscall.Syscall6(procQueryIoRateControlInformationJobObject.Addr(), 4, uintptr(jobHandle), uintptr(unsafe.Pointer(volumeName)), uintptr(unsafe.Pointer(ioRateControlInfo)), uintptr(unsafe.Pointer(infoBlockCount)), 0, 0) - ret = uint32(r0) - if ret == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) { - r0, _, _ := syscall.Syscall(procNtOpenJobObject.Addr(), 3, uintptr(unsafe.Pointer(jobHandle)), uintptr(desiredAccess), uintptr(unsafe.Pointer(objAttributes))) - status = uint32(r0) - return -} - -func NtCreateJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) { - r0, _, _ := syscall.Syscall(procNtCreateJobObject.Addr(), 3, uintptr(unsafe.Pointer(jobHandle)), uintptr(desiredAccess), uintptr(unsafe.Pointer(objAttributes))) - status = uint32(r0) - return -} - -func LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) { - r1, _, e1 := syscall.Syscall6(procLogonUserW.Addr(), 6, uintptr(unsafe.Pointer(username)), uintptr(unsafe.Pointer(domain)), uintptr(unsafe.Pointer(password)), uintptr(logonType), uintptr(logonProvider), uintptr(unsafe.Pointer(token))) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func LocalAlloc(flags uint32, size int) (ptr uintptr) { - r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(flags), uintptr(size), 0) - ptr = uintptr(r0) - return -} - -func LocalFree(ptr uintptr) { - syscall.Syscall(procLocalFree.Addr(), 1, uintptr(ptr), 0, 0) - return -} - -func NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) { - r0, _, _ := syscall.Syscall6(procNtQueryInformationProcess.Addr(), 5, uintptr(processHandle), uintptr(processInfoClass), uintptr(processInfo), uintptr(processInfoLength), uintptr(unsafe.Pointer(returnLength)), 0) - status = uint32(r0) - return -} - -func GetActiveProcessorCount(groupNumber uint16) (amount uint32) { - r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) - amount = uint32(r0) - return -} - -func CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) { - r0, _, _ := syscall.Syscall(procCM_Get_Device_ID_List_SizeA.Addr(), 3, uintptr(unsafe.Pointer(pulLen)), uintptr(unsafe.Pointer(pszFilter)), uintptr(uFlags)) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error) { - r0, _, _ := syscall.Syscall6(procCM_Get_Device_ID_ListA.Addr(), 4, uintptr(unsafe.Pointer(pszFilter)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferLen), uintptr(uFlags), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(pDeviceID) - if hr != nil { - return - } - return _CMLocateDevNode(pdnDevInst, _p0, uFlags) -} - -func _CMLocateDevNode(pdnDevInst *uint32, pDeviceID *uint16, uFlags uint32) (hr error) { - r0, _, _ := syscall.Syscall(procCM_Locate_DevNodeW.Addr(), 3, uintptr(unsafe.Pointer(pdnDevInst)), uintptr(unsafe.Pointer(pDeviceID)), uintptr(uFlags)) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) { - r0, _, _ := syscall.Syscall6(procCM_Get_DevNode_PropertyW.Addr(), 6, uintptr(dnDevInst), uintptr(unsafe.Pointer(propertyKey)), uintptr(unsafe.Pointer(propertyType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(unsafe.Pointer(propertyBufferSize)), uintptr(uFlags)) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} - -func NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) { - r0, _, _ := syscall.Syscall12(procNtCreateFile.Addr(), 11, uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(unsafe.Pointer(allocationSize)), uintptr(fileAttributes), uintptr(shareAccess), uintptr(createDisposition), uintptr(createOptions), uintptr(unsafe.Pointer(eaBuffer)), uintptr(eaLength), 0) - status = uint32(r0) - return -} - -func NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) { - r0, _, _ := syscall.Syscall6(procNtSetInformationFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(iosb)), uintptr(information), uintptr(length), uintptr(class), 0) - status = uint32(r0) - return -} - -func NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) { - r0, _, _ := syscall.Syscall(procNtOpenDirectoryObject.Addr(), 3, uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa))) - status = uint32(r0) - return -} - -func NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32) (status uint32) { - var _p0 uint32 - if singleEntry { - _p0 = 1 - } else { - _p0 = 0 - } - var _p1 uint32 - if restartScan { - _p1 = 1 - } else { - _p1 = 0 - } - r0, _, _ := syscall.Syscall9(procNtQueryDirectoryObject.Addr(), 7, uintptr(handle), uintptr(unsafe.Pointer(buffer)), uintptr(length), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(context)), uintptr(unsafe.Pointer(returnLength)), 0, 0) - status = uint32(r0) - return -} - -func RtlNtStatusToDosError(status uint32) (winerr error) { - r0, _, _ := syscall.Syscall(procRtlNtStatusToDosError.Addr(), 1, uintptr(status), 0, 0) - if r0 != 0 { - winerr = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/layer.go b/vendor/github.com/Microsoft/hcsshim/layer.go deleted file mode 100644 index 8916163706..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/layer.go +++ /dev/null @@ -1,107 +0,0 @@ -package hcsshim - -import ( - "context" - "crypto/sha1" - "path/filepath" - - "github.com/Microsoft/go-winio/pkg/guid" - "github.com/Microsoft/hcsshim/internal/wclayer" -) - -func layerPath(info *DriverInfo, id string) string { - return filepath.Join(info.HomeDir, id) -} - -func ActivateLayer(info DriverInfo, id string) error { - return wclayer.ActivateLayer(context.Background(), layerPath(&info, id)) -} -func CreateLayer(info DriverInfo, id, parent string) error { - return wclayer.CreateLayer(context.Background(), layerPath(&info, id), parent) -} - -// New clients should use CreateScratchLayer instead. Kept in to preserve API compatibility. -func CreateSandboxLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error { - return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) -} -func CreateScratchLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error { - return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) -} -func DeactivateLayer(info DriverInfo, id string) error { - return wclayer.DeactivateLayer(context.Background(), layerPath(&info, id)) -} -func DestroyLayer(info DriverInfo, id string) error { - return wclayer.DestroyLayer(context.Background(), layerPath(&info, id)) -} - -// New clients should use ExpandScratchSize instead. Kept in to preserve API compatibility. -func ExpandSandboxSize(info DriverInfo, layerId string, size uint64) error { - return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size) -} -func ExpandScratchSize(info DriverInfo, layerId string, size uint64) error { - return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size) -} -func ExportLayer(info DriverInfo, layerId string, exportFolderPath string, parentLayerPaths []string) error { - return wclayer.ExportLayer(context.Background(), layerPath(&info, layerId), exportFolderPath, parentLayerPaths) -} -func GetLayerMountPath(info DriverInfo, id string) (string, error) { - return wclayer.GetLayerMountPath(context.Background(), layerPath(&info, id)) -} -func GetSharedBaseImages() (imageData string, err error) { - return wclayer.GetSharedBaseImages(context.Background()) -} -func ImportLayer(info DriverInfo, layerID string, importFolderPath string, parentLayerPaths []string) error { - return wclayer.ImportLayer(context.Background(), layerPath(&info, layerID), importFolderPath, parentLayerPaths) -} -func LayerExists(info DriverInfo, id string) (bool, error) { - return wclayer.LayerExists(context.Background(), layerPath(&info, id)) -} -func PrepareLayer(info DriverInfo, layerId string, parentLayerPaths []string) error { - return wclayer.PrepareLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) -} -func ProcessBaseLayer(path string) error { - return wclayer.ProcessBaseLayer(context.Background(), path) -} -func ProcessUtilityVMImage(path string) error { - return wclayer.ProcessUtilityVMImage(context.Background(), path) -} -func UnprepareLayer(info DriverInfo, layerId string) error { - return wclayer.UnprepareLayer(context.Background(), layerPath(&info, layerId)) -} - -type DriverInfo struct { - Flavour int - HomeDir string -} - -type GUID [16]byte - -func NameToGuid(name string) (id GUID, err error) { - g, err := wclayer.NameToGuid(context.Background(), name) - return g.ToWindowsArray(), err -} - -func NewGUID(source string) *GUID { - h := sha1.Sum([]byte(source)) - var g GUID - copy(g[0:], h[0:16]) - return &g -} - -func (g *GUID) ToString() string { - return guid.FromWindowsArray(*g).String() -} - -type LayerReader = wclayer.LayerReader - -func NewLayerReader(info DriverInfo, layerID string, parentLayerPaths []string) (LayerReader, error) { - return wclayer.NewLayerReader(context.Background(), layerPath(&info, layerID), parentLayerPaths) -} - -type LayerWriter = wclayer.LayerWriter - -func NewLayerWriter(info DriverInfo, layerID string, parentLayerPaths []string) (LayerWriter, error) { - return wclayer.NewLayerWriter(context.Background(), layerPath(&info, layerID), parentLayerPaths) -} - -type WC_LAYER_DESCRIPTOR = wclayer.WC_LAYER_DESCRIPTOR diff --git a/vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go b/vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go deleted file mode 100644 index 3ab3bcd89a..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go +++ /dev/null @@ -1,50 +0,0 @@ -package osversion - -import ( - "fmt" - "sync" - - "golang.org/x/sys/windows" -) - -// OSVersion is a wrapper for Windows version information -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx -type OSVersion struct { - Version uint32 - MajorVersion uint8 - MinorVersion uint8 - Build uint16 -} - -var ( - osv OSVersion - once sync.Once -) - -// Get gets the operating system version on Windows. -// The calling application must be manifested to get the correct version information. -func Get() OSVersion { - once.Do(func() { - var err error - osv = OSVersion{} - osv.Version, err = windows.GetVersion() - if err != nil { - // GetVersion never fails. - panic(err) - } - osv.MajorVersion = uint8(osv.Version & 0xFF) - osv.MinorVersion = uint8(osv.Version >> 8 & 0xFF) - osv.Build = uint16(osv.Version >> 16) - }) - return osv -} - -// Build gets the build-number on Windows -// The calling application must be manifested to get the correct version information. -func Build() uint16 { - return Get().Build -} - -func (osv OSVersion) ToString() string { - return fmt.Sprintf("%d.%d.%d", osv.MajorVersion, osv.MinorVersion, osv.Build) -} diff --git a/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go b/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go deleted file mode 100644 index 75dce5d821..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go +++ /dev/null @@ -1,50 +0,0 @@ -package osversion - -const ( - // RS1 (version 1607, codename "Redstone 1") corresponds to Windows Server - // 2016 (ltsc2016) and Windows 10 (Anniversary Update). - RS1 = 14393 - - // RS2 (version 1703, codename "Redstone 2") was a client-only update, and - // corresponds to Windows 10 (Creators Update). - RS2 = 15063 - - // RS3 (version 1709, codename "Redstone 3") corresponds to Windows Server - // 1709 (Semi-Annual Channel (SAC)), and Windows 10 (Fall Creators Update). - RS3 = 16299 - - // RS4 (version 1803, codename "Redstone 4") corresponds to Windows Server - // 1803 (Semi-Annual Channel (SAC)), and Windows 10 (April 2018 Update). - RS4 = 17134 - - // RS5 (version 1809, codename "Redstone 5") corresponds to Windows Server - // 2019 (ltsc2019), and Windows 10 (October 2018 Update). - RS5 = 17763 - - // V19H1 (version 1903) corresponds to Windows Server 1903 (semi-annual - // channel). - V19H1 = 18362 - - // V19H2 (version 1909) corresponds to Windows Server 1909 (semi-annual - // channel). - V19H2 = 18363 - - // V20H1 (version 2004) corresponds to Windows Server 2004 (semi-annual - // channel). - V20H1 = 19041 - - // V20H2 corresponds to Windows Server 20H2 (semi-annual channel). - V20H2 = 19042 - - // V21H1 corresponds to Windows Server 21H1 (semi-annual channel). - V21H1 = 19043 - - // V21H2Win10 corresponds to Windows 10 (November 2021 Update). - V21H2Win10 = 19044 - - // V21H2Server corresponds to Windows Server 2022 (ltsc2022). - V21H2Server = 20348 - - // V21H2Win11 corresponds to Windows 11 (original release). - V21H2Win11 = 22000 -) diff --git a/vendor/github.com/Microsoft/hcsshim/process.go b/vendor/github.com/Microsoft/hcsshim/process.go deleted file mode 100644 index 3362c68335..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/process.go +++ /dev/null @@ -1,98 +0,0 @@ -package hcsshim - -import ( - "context" - "io" - "sync" - "time" - - "github.com/Microsoft/hcsshim/internal/hcs" -) - -// ContainerError is an error encountered in HCS -type process struct { - p *hcs.Process - waitOnce sync.Once - waitCh chan struct{} - waitErr error -} - -// Pid returns the process ID of the process within the container. -func (process *process) Pid() int { - return process.p.Pid() -} - -// Kill signals the process to terminate but does not wait for it to finish terminating. -func (process *process) Kill() error { - found, err := process.p.Kill(context.Background()) - if err != nil { - return convertProcessError(err, process) - } - if !found { - return &ProcessError{Process: process, Err: ErrElementNotFound, Operation: "hcsshim::Process::Kill"} - } - return nil -} - -// Wait waits for the process to exit. -func (process *process) Wait() error { - return convertProcessError(process.p.Wait(), process) -} - -// WaitTimeout waits for the process to exit or the duration to elapse. It returns -// false if timeout occurs. -func (process *process) WaitTimeout(timeout time.Duration) error { - process.waitOnce.Do(func() { - process.waitCh = make(chan struct{}) - go func() { - process.waitErr = process.Wait() - close(process.waitCh) - }() - }) - t := time.NewTimer(timeout) - defer t.Stop() - select { - case <-t.C: - return &ProcessError{Process: process, Err: ErrTimeout, Operation: "hcsshim::Process::Wait"} - case <-process.waitCh: - return process.waitErr - } -} - -// ExitCode returns the exit code of the process. The process must have -// already terminated. -func (process *process) ExitCode() (int, error) { - code, err := process.p.ExitCode() - if err != nil { - err = convertProcessError(err, process) - } - return code, err -} - -// ResizeConsole resizes the console of the process. -func (process *process) ResizeConsole(width, height uint16) error { - return convertProcessError(process.p.ResizeConsole(context.Background(), width, height), process) -} - -// Stdio returns the stdin, stdout, and stderr pipes, respectively. Closing -// these pipes does not close the underlying pipes; it should be possible to -// call this multiple times to get multiple interfaces. -func (process *process) Stdio() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error) { - stdin, stdout, stderr, err := process.p.StdioLegacy() - if err != nil { - err = convertProcessError(err, process) - } - return stdin, stdout, stderr, err -} - -// CloseStdin closes the write side of the stdin pipe so that the process is -// notified on the read side that there is no more data in stdin. -func (process *process) CloseStdin() error { - return convertProcessError(process.p.CloseStdin(context.Background()), process) -} - -// Close cleans up any state associated with the process but does not kill -// or wait on it. -func (process *process) Close() error { - return convertProcessError(process.p.Close(), process) -} diff --git a/vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go deleted file mode 100644 index 8bed848573..0000000000 --- a/vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go +++ /dev/null @@ -1,54 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package hcsshim - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") - - procSetCurrentThreadCompartmentId = modiphlpapi.NewProc("SetCurrentThreadCompartmentId") -) - -func SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) { - r0, _, _ := syscall.Syscall(procSetCurrentThreadCompartmentId.Addr(), 1, uintptr(compartmentId), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go b/vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go index 3ed3f43573..c85e6befec 100644 --- a/vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go +++ b/vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go @@ -191,7 +191,7 @@ func (bitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, return x3, y3, z3 } -//TODO: double check if it is okay +// TODO: double check if it is okay // ScalarMult returns k*(Bx,By) where k is a number in big-endian form. func (bitCurve *BitCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) { // We have a slight problem in that the identity of the group (the @@ -239,7 +239,7 @@ func (bitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { var mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f} -//TODO: double check if it is okay +// TODO: double check if it is okay // GenerateKey returns a public/private key pair. The private key is generated // using the given reader, which must return random data. func (bitCurve *BitCurve) GenerateKey(rand io.Reader) (priv []byte, x, y *big.Int, err error) { diff --git a/vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go b/vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go index 2d5355085f..7e291d6aa4 100644 --- a/vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go +++ b/vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go @@ -80,4 +80,4 @@ func (curve *rcurve) ScalarMult(x1, y1 *big.Int, scalar []byte) (x, y *big.Int) func (curve *rcurve) ScalarBaseMult(scalar []byte) (x, y *big.Int) { return curve.fromTwisted(curve.twisted.ScalarBaseMult(scalar)) -} \ No newline at end of file +} diff --git a/vendor/github.com/ProtonMail/go-crypto/eax/eax.go b/vendor/github.com/ProtonMail/go-crypto/eax/eax.go index 6b6bc7aed0..3ae91d594c 100644 --- a/vendor/github.com/ProtonMail/go-crypto/eax/eax.go +++ b/vendor/github.com/ProtonMail/go-crypto/eax/eax.go @@ -67,7 +67,7 @@ func (e *eax) Seal(dst, nonce, plaintext, adata []byte) []byte { if len(nonce) > e.nonceSize { panic("crypto/eax: Nonce too long for this instance") } - ret, out := byteutil.SliceForAppend(dst, len(plaintext) + e.tagSize) + ret, out := byteutil.SliceForAppend(dst, len(plaintext)+e.tagSize) omacNonce := e.omacT(0, nonce) omacAdata := e.omacT(1, adata) @@ -85,7 +85,7 @@ func (e *eax) Seal(dst, nonce, plaintext, adata []byte) []byte { return ret } -func (e* eax) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) { +func (e *eax) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) { if len(nonce) > e.nonceSize { panic("crypto/eax: Nonce too long for this instance") } diff --git a/vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go b/vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go index a6bdf51232..affb74a764 100644 --- a/vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go +++ b/vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go @@ -41,7 +41,7 @@ func ShiftNBytesLeft(dst, x []byte, n int) { bits := uint(n % 8) l := len(dst) for i := 0; i < l-1; i++ { - dst[i] = (dst[i] << bits) | (dst[i+1] >> uint(8 - bits)) + dst[i] = (dst[i] << bits) | (dst[i+1] >> uint(8-bits)) } dst[l-1] = dst[l-1] << bits @@ -56,7 +56,6 @@ func XorBytesMut(X, Y []byte) { } } - // XorBytes assumes equal input length, puts X XOR Y into Z func XorBytes(Z, X, Y []byte) { for i := 0; i < len(X); i++ { @@ -67,10 +66,10 @@ func XorBytes(Z, X, Y []byte) { // RightXor XORs smaller input (assumed Y) at the right of the larger input (assumed X) func RightXor(X, Y []byte) []byte { offset := len(X) - len(Y) - xored := make([]byte, len(X)); + xored := make([]byte, len(X)) copy(xored, X) for i := 0; i < len(Y); i++ { - xored[offset + i] ^= Y[i] + xored[offset+i] ^= Y[i] } return xored } @@ -89,4 +88,3 @@ func SliceForAppend(in []byte, n int) (head, tail []byte) { tail = head[len(in):] return } - diff --git a/vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go b/vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go index 7f78cfa759..1a6f73502e 100644 --- a/vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go +++ b/vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go @@ -93,13 +93,13 @@ func NewOCBWithNonceAndTagSize( return nil, ocbError("Custom tag length exceeds blocksize") } return &ocb{ - block: block, - tagSize: tagSize, - nonceSize: nonceSize, - mask: initializeMaskTable(block), + block: block, + tagSize: tagSize, + nonceSize: nonceSize, + mask: initializeMaskTable(block), reusableKtop: reusableKtop{ noncePrefix: nil, - Ktop: nil, + Ktop: nil, }, }, nil } diff --git a/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go b/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go index 5dc158f012..14a3c336fb 100644 --- a/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go +++ b/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go @@ -4,21 +4,22 @@ package ocb var rfc7253TestVectorTaglen96 = struct { key, nonce, header, plaintext, ciphertext string }{"0F0E0D0C0B0A09080706050403020100", - "BBAA9988776655443322110D", - "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", - "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", - "1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FDAC4F02AA"} + "BBAA9988776655443322110D", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FDAC4F02AA"} var rfc7253AlgorithmTest = []struct { KEYLEN, TAGLEN int - OUTPUT string }{ - {128, 128, "67E944D23256C5E0B6C61FA22FDF1EA2"}, - {192, 128, "F673F2C3E7174AAE7BAE986CA9F29E17"}, - {256, 128, "D90EB8E9C977C88B79DD793D7FFA161C"}, - {128, 96, "77A3D8E73589158D25D01209"}, - {192, 96, "05D56EAD2752C86BE6932C5E"}, - {256, 96, "5458359AC23B0CBA9E6330DD"}, - {128, 64, "192C9B7BD90BA06A"}, - {192, 64, "0066BC6E0EF34E24"}, - {256, 64, "7D4EA5D445501CBE"}, - } + OUTPUT string +}{ + {128, 128, "67E944D23256C5E0B6C61FA22FDF1EA2"}, + {192, 128, "F673F2C3E7174AAE7BAE986CA9F29E17"}, + {256, 128, "D90EB8E9C977C88B79DD793D7FFA161C"}, + {128, 96, "77A3D8E73589158D25D01209"}, + {192, 96, "05D56EAD2752C86BE6932C5E"}, + {256, 96, "5458359AC23B0CBA9E6330DD"}, + {128, 64, "192C9B7BD90BA06A"}, + {192, 64, "0066BC6E0EF34E24"}, + {256, 64, "7D4EA5D445501CBE"}, +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go index 3b357e5851..0d6c5f3f96 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go @@ -17,12 +17,14 @@ import ( // A Block represents an OpenPGP armored structure. // // The encoded form is: -// -----BEGIN Type----- -// Headers // -// base64-encoded Bytes -// '=' base64 encoded checksum -// -----END Type----- +// -----BEGIN Type----- +// Headers +// +// base64-encoded Bytes +// '=' base64 encoded checksum +// -----END Type----- +// // where Headers is a possibly empty sequence of Key: Value lines. // // Since the armored data can be very large, this package presents a streaming diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go index 6f07582c37..5b6e16c19d 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go @@ -96,7 +96,8 @@ func (l *lineBreaker) Close() (err error) { // trailer. // // It's built into a stack of io.Writers: -// encoding -> base64 encoder -> lineBreaker -> out +// +// encoding -> base64 encoder -> lineBreaker -> out type encoding struct { out io.Writer breaker *lineBreaker diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go index b09e2a7359..c895bad6bb 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go @@ -34,7 +34,7 @@ type PrivateKey struct { func NewPublicKey(curve ecc.ECDHCurve, kdfHash algorithm.Hash, kdfCipher algorithm.Cipher) *PublicKey { return &PublicKey{ - curve: curve, + curve: curve, KDF: KDF{ Hash: kdfHash, Cipher: kdfCipher, @@ -167,7 +167,7 @@ func buildKey(pub *PublicKey, zb []byte, curveOID, fingerprint []byte, stripLead if _, err := param.Write(fingerprint[:20]); err != nil { return nil, err } - if param.Len() - len(curveOID) != 45 { + if param.Len()-len(curveOID) != 45 { return nil, errors.New("ecdh: malformed KDF Param") } @@ -181,15 +181,19 @@ func buildKey(pub *PublicKey, zb []byte, curveOID, fingerprint []byte, stripLead j := zbLen - 1 if stripLeading { // Work around old go crypto bug where the leading zeros are missing. - for ; i < zbLen && zb[i] == 0; i++ {} + for i < zbLen && zb[i] == 0 { + i++ + } } if stripTrailing { // Work around old OpenPGP.js bug where insignificant trailing zeros in // this little-endian number are missing. // (See https://github.com/openpgpjs/openpgpjs/pull/853.) - for ; j >= 0 && zb[j] == 0; j-- {} + for j >= 0 && zb[j] == 0 { + j-- + } } - if _, err := h.Write(zb[i:j+1]); err != nil { + if _, err := h.Write(zb[i : j+1]); err != nil { return nil, err } if _, err := h.Write(param.Bytes()); err != nil { diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdsa/ecdsa.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdsa/ecdsa.go index 6682a21a60..f94ae1b2f5 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdsa/ecdsa.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdsa/ecdsa.go @@ -10,7 +10,7 @@ import ( ) type PublicKey struct { - X, Y *big.Int + X, Y *big.Int curve ecc.ECDSACurve } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/eddsa/eddsa.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/eddsa/eddsa.go index 12866c12df..99ecfc7f12 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/eddsa/eddsa.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/eddsa/eddsa.go @@ -9,7 +9,7 @@ import ( ) type PublicKey struct { - X []byte + X []byte curve ecc.EdDSACurve } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go index 6a07d8ff27..bad2774344 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go @@ -71,8 +71,8 @@ func Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err // returns the plaintext of the message. An error can result only if the // ciphertext is invalid. Users should keep in mind that this is a padding // oracle and thus, if exposed to an adaptive chosen ciphertext attack, can -// be used to break the cryptosystem. See ``Chosen Ciphertext Attacks -// Against Protocols Based on the RSA Encryption Standard PKCS #1'', Daniel +// be used to break the cryptosystem. See “Chosen Ciphertext Attacks +// Against Protocols Based on the RSA Encryption Standard PKCS #1”, Daniel // Bleichenbacher, Advances in Cryptology (Crypto '98), func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { s := new(big.Int).Exp(c1, priv.X, priv.P) diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/hash.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/hash.go new file mode 100644 index 0000000000..526bd7777f --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/hash.go @@ -0,0 +1,24 @@ +package openpgp + +import ( + "crypto" + + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" +) + +// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP +// hash id. +func HashIdToHash(id byte) (h crypto.Hash, ok bool) { + return algorithm.HashIdToHash(id) +} + +// HashIdToString returns the name of the hash function corresponding to the +// given OpenPGP hash id. +func HashIdToString(id byte) (name string, ok bool) { + return algorithm.HashIdToString(id) +} + +// HashToHashId returns an OpenPGP hash id which corresponds the given Hash. +func HashToHashId(h crypto.Hash) (id byte, ok bool) { + return algorithm.HashToHashId(h) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go index 17a1bfe9cb..d067065186 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go @@ -16,7 +16,7 @@ type AEADMode uint8 const ( AEADModeEAX = AEADMode(1) AEADModeOCB = AEADMode(2) - AEADModeGCM = AEADMode(100) + AEADModeGCM = AEADMode(3) ) // TagLength returns the length in bytes of authentication tags. diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go index 3f1b61b88e..d1a00fc749 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go @@ -32,26 +32,25 @@ type Hash interface { // The following vars mirror the crypto/Hash supported hash functions. var ( - MD5 Hash = cryptoHash{1, crypto.MD5} - SHA1 Hash = cryptoHash{2, crypto.SHA1} - RIPEMD160 Hash = cryptoHash{3, crypto.RIPEMD160} - SHA256 Hash = cryptoHash{8, crypto.SHA256} - SHA384 Hash = cryptoHash{9, crypto.SHA384} - SHA512 Hash = cryptoHash{10, crypto.SHA512} - SHA224 Hash = cryptoHash{11, crypto.SHA224} + SHA1 Hash = cryptoHash{2, crypto.SHA1} + SHA256 Hash = cryptoHash{8, crypto.SHA256} + SHA384 Hash = cryptoHash{9, crypto.SHA384} + SHA512 Hash = cryptoHash{10, crypto.SHA512} + SHA224 Hash = cryptoHash{11, crypto.SHA224} + SHA3_256 Hash = cryptoHash{12, crypto.SHA3_256} + SHA3_512 Hash = cryptoHash{14, crypto.SHA3_512} ) // HashById represents the different hash functions specified for OpenPGP. See // http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-14 var ( HashById = map[uint8]Hash{ - MD5.Id(): MD5, - SHA1.Id(): SHA1, - RIPEMD160.Id(): RIPEMD160, - SHA256.Id(): SHA256, - SHA384.Id(): SHA384, - SHA512.Id(): SHA512, - SHA224.Id(): SHA224, + SHA256.Id(): SHA256, + SHA384.Id(): SHA384, + SHA512.Id(): SHA512, + SHA224.Id(): SHA224, + SHA3_256.Id(): SHA3_256, + SHA3_512.Id(): SHA3_512, } ) @@ -68,13 +67,12 @@ func (h cryptoHash) Id() uint8 { } var hashNames = map[uint8]string{ - MD5.Id(): "MD5", - SHA1.Id(): "SHA1", - RIPEMD160.Id(): "RIPEMD160", - SHA256.Id(): "SHA256", - SHA384.Id(): "SHA384", - SHA512.Id(): "SHA512", - SHA224.Id(): "SHA224", + SHA256.Id(): "SHA256", + SHA384.Id(): "SHA384", + SHA512.Id(): "SHA512", + SHA224.Id(): "SHA224", + SHA3_256.Id(): "SHA3-256", + SHA3_512.Id(): "SHA3-512", } func (h cryptoHash) String() string { @@ -84,3 +82,62 @@ func (h cryptoHash) String() string { } return s } + +// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP +// hash id. +func HashIdToHash(id byte) (h crypto.Hash, ok bool) { + if hash, ok := HashById[id]; ok { + return hash.HashFunc(), true + } + return 0, false +} + +// HashIdToHashWithSha1 returns a crypto.Hash which corresponds to the given OpenPGP +// hash id, allowing sha1. +func HashIdToHashWithSha1(id byte) (h crypto.Hash, ok bool) { + if hash, ok := HashById[id]; ok { + return hash.HashFunc(), true + } + + if id == SHA1.Id() { + return SHA1.HashFunc(), true + } + + return 0, false +} + +// HashIdToString returns the name of the hash function corresponding to the +// given OpenPGP hash id. +func HashIdToString(id byte) (name string, ok bool) { + if hash, ok := HashById[id]; ok { + return hash.String(), true + } + return "", false +} + +// HashToHashId returns an OpenPGP hash id which corresponds the given Hash. +func HashToHashId(h crypto.Hash) (id byte, ok bool) { + for id, hash := range HashById { + if hash.HashFunc() == h { + return id, true + } + } + + return 0, false +} + +// HashToHashIdWithSha1 returns an OpenPGP hash id which corresponds the given Hash, +// allowing instances of SHA1 +func HashToHashIdWithSha1(h crypto.Hash) (id byte, ok bool) { + for id, hash := range HashById { + if hash.HashFunc() == h { + return id, true + } + } + + if h == SHA1.HashFunc() { + return SHA1.Id(), true + } + + return 0, false +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.go index 266635ec57..888767c4e4 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.go @@ -9,7 +9,7 @@ import ( x25519lib "github.com/cloudflare/circl/dh/x25519" ) -type curve25519 struct {} +type curve25519 struct{} func NewCurve25519() *curve25519 { return &curve25519{} @@ -21,14 +21,14 @@ func (c *curve25519) GetCurveName() string { // MarshalBytePoint encodes the public point from native format, adding the prefix. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6 -func (c *curve25519) MarshalBytePoint(point [] byte) []byte { +func (c *curve25519) MarshalBytePoint(point []byte) []byte { return append([]byte{0x40}, point...) } // UnmarshalBytePoint decodes the public point to native format, removing the prefix. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6 func (c *curve25519) UnmarshalBytePoint(point []byte) []byte { - if len(point) != x25519lib.Size + 1 { + if len(point) != x25519lib.Size+1 { return nil } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve_info.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve_info.go index df2878c957..35751034dd 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve_info.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve_info.go @@ -11,76 +11,76 @@ import ( type CurveInfo struct { GenName string - Oid *encoding.OID - Curve Curve + Oid *encoding.OID + Curve Curve } var Curves = []CurveInfo{ { // NIST P-256 GenName: "P256", - Oid: encoding.NewOID([]byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}), - Curve: NewGenericCurve(elliptic.P256()), + Oid: encoding.NewOID([]byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}), + Curve: NewGenericCurve(elliptic.P256()), }, { // NIST P-384 GenName: "P384", - Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x22}), - Curve: NewGenericCurve(elliptic.P384()), + Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x22}), + Curve: NewGenericCurve(elliptic.P384()), }, { // NIST P-521 GenName: "P521", - Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x23}), - Curve: NewGenericCurve(elliptic.P521()), + Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x23}), + Curve: NewGenericCurve(elliptic.P521()), }, { // SecP256k1 GenName: "SecP256k1", - Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x0A}), - Curve: NewGenericCurve(bitcurves.S256()), + Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x0A}), + Curve: NewGenericCurve(bitcurves.S256()), }, { // Curve25519 GenName: "Curve25519", - Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01}), - Curve: NewCurve25519(), + Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01}), + Curve: NewCurve25519(), }, { // X448 GenName: "Curve448", - Oid: encoding.NewOID([]byte{0x2B, 0x65, 0x6F}), - Curve: NewX448(), + Oid: encoding.NewOID([]byte{0x2B, 0x65, 0x6F}), + Curve: NewX448(), }, { // Ed25519 GenName: "Curve25519", - Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01}), - Curve: NewEd25519(), + Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01}), + Curve: NewEd25519(), }, { // Ed448 GenName: "Curve448", - Oid: encoding.NewOID([]byte{0x2B, 0x65, 0x71}), - Curve: NewEd448(), + Oid: encoding.NewOID([]byte{0x2B, 0x65, 0x71}), + Curve: NewEd448(), }, { // BrainpoolP256r1 GenName: "BrainpoolP256", - Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07}), - Curve: NewGenericCurve(brainpool.P256r1()), + Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07}), + Curve: NewGenericCurve(brainpool.P256r1()), }, { // BrainpoolP384r1 GenName: "BrainpoolP384", - Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B}), - Curve: NewGenericCurve(brainpool.P384r1()), + Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B}), + Curve: NewGenericCurve(brainpool.P384r1()), }, { // BrainpoolP512r1 GenName: "BrainpoolP512", - Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D}), - Curve: NewGenericCurve(brainpool.P512r1()), + Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D}), + Curve: NewGenericCurve(brainpool.P512r1()), }, } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curves.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curves.go index c47072b49e..5ed9c93b3d 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curves.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curves.go @@ -38,7 +38,7 @@ type EdDSACurve interface { type ECDHCurve interface { Curve MarshalBytePoint([]byte) (encoded []byte) - UnmarshalBytePoint(encoded []byte) ([]byte) + UnmarshalBytePoint(encoded []byte) []byte MarshalByteSecret(d []byte) []byte UnmarshalByteSecret(d []byte) []byte GenerateECDH(rand io.Reader) (point []byte, secret []byte, err error) diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed25519.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed25519.go index 29f6cba9d8..54a08a8a38 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed25519.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed25519.go @@ -10,7 +10,8 @@ import ( ) const ed25519Size = 32 -type ed25519 struct {} + +type ed25519 struct{} func NewEd25519() *ed25519 { return &ed25519{} @@ -29,7 +30,7 @@ func (c *ed25519) MarshalBytePoint(x []byte) []byte { // UnmarshalBytePoint decodes a point from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed25519) UnmarshalBytePoint(point []byte) (x []byte) { - if len(point) != ed25519lib.PublicKeySize + 1 { + if len(point) != ed25519lib.PublicKeySize+1 { return nil } @@ -52,7 +53,7 @@ func (c *ed25519) UnmarshalByteSecret(s []byte) (d []byte) { // Handle stripped leading zeroes d = make([]byte, ed25519lib.SeedSize) - copy(d[ed25519lib.SeedSize - len(s):], s) + copy(d[ed25519lib.SeedSize-len(s):], s) return } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed448.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed448.go index a2df3dab87..18cd80434b 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed448.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed448.go @@ -9,7 +9,7 @@ import ( ed448lib "github.com/cloudflare/circl/sign/ed448" ) -type ed448 struct {} +type ed448 struct{} func NewEd448() *ed448 { return &ed448{} @@ -29,7 +29,7 @@ func (c *ed448) MarshalBytePoint(x []byte) []byte { // UnmarshalBytePoint decodes a point from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed448) UnmarshalBytePoint(point []byte) (x []byte) { - if len(point) != ed448lib.PublicKeySize + 1 { + if len(point) != ed448lib.PublicKeySize+1 { return nil } @@ -48,7 +48,7 @@ func (c *ed448) MarshalByteSecret(d []byte) []byte { // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed448) UnmarshalByteSecret(s []byte) (d []byte) { // Check prefixed size - if len(s) != ed448lib.SeedSize + 1 { + if len(s) != ed448lib.SeedSize+1 { return nil } @@ -66,7 +66,7 @@ func (c *ed448) MarshalSignature(sig []byte) (r, s []byte) { // UnmarshalSignature decodes R and S in the native format. Only R is used, in prefixed native format. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.2 func (c *ed448) UnmarshalSignature(r, s []byte) (sig []byte) { - if len(r) != ed448lib.SignatureSize + 1 { + if len(r) != ed448lib.SignatureSize+1 { return nil } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/x448.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/x448.go index 4a940b4f4d..ffdd51513b 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/x448.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/x448.go @@ -9,7 +9,7 @@ import ( x448lib "github.com/cloudflare/circl/dh/x448" ) -type x448 struct {} +type x448 struct{} func NewX448() *x448 { return &x448{} @@ -28,7 +28,7 @@ func (c *x448) MarshalBytePoint(point []byte) []byte { // UnmarshalBytePoint decodes a point from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6 func (c *x448) UnmarshalBytePoint(point []byte) []byte { - if len(point) != x448lib.Size + 1 { + if len(point) != x448lib.Size+1 { return nil } @@ -44,7 +44,7 @@ func (c *x448) MarshalByteSecret(d []byte) []byte { // UnmarshalByteSecret decodes a scalar from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.2 func (c *x448) UnmarshalByteSecret(d []byte) []byte { - if len(d) != x448lib.Size + 1 { + if len(d) != x448lib.Size+1 { return nil } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go index 118dd65689..0e71934cd9 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go @@ -82,27 +82,24 @@ func (t *Entity) addUserId(name, comment, email string, config *packet.Config, c isPrimaryId := len(t.Identities) == 0 - selfSignature := &packet.Signature{ - Version: primary.PublicKey.Version, - SigType: packet.SigTypePositiveCert, - PubKeyAlgo: primary.PublicKey.PubKeyAlgo, - Hash: config.Hash(), - CreationTime: creationTime, - KeyLifetimeSecs: &keyLifetimeSecs, - IssuerKeyId: &primary.PublicKey.KeyId, - IssuerFingerprint: primary.PublicKey.Fingerprint, - IsPrimaryId: &isPrimaryId, - FlagsValid: true, - FlagSign: true, - FlagCertify: true, - MDC: true, // true by default, see 5.8 vs. 5.14 - AEAD: config.AEAD() != nil, - V5Keys: config != nil && config.V5Keys, - } + selfSignature := createSignaturePacket(&primary.PublicKey, packet.SigTypePositiveCert, config) + selfSignature.CreationTime = creationTime + selfSignature.KeyLifetimeSecs = &keyLifetimeSecs + selfSignature.IsPrimaryId = &isPrimaryId + selfSignature.FlagsValid = true + selfSignature.FlagSign = true + selfSignature.FlagCertify = true + selfSignature.SEIPDv1 = true // true by default, see 5.8 vs. 5.14 + selfSignature.SEIPDv2 = config.AEAD() != nil // Set the PreferredHash for the SelfSignature from the packet.Config. // If it is not the must-implement algorithm from rfc4880bis, append that. - selfSignature.PreferredHash = []uint8{hashToHashId(config.Hash())} + hash, ok := algorithm.HashToHashId(config.Hash()) + if !ok { + return errors.UnsupportedError("unsupported preferred hash function") + } + + selfSignature.PreferredHash = []uint8{hash} if config.Hash() != crypto.SHA256 { selfSignature.PreferredHash = append(selfSignature.PreferredHash, hashToHashId(crypto.SHA256)) } @@ -123,9 +120,16 @@ func (t *Entity) addUserId(name, comment, email string, config *packet.Config, c } // And for DefaultMode. - selfSignature.PreferredAEAD = []uint8{uint8(config.AEAD().Mode())} - if config.AEAD().Mode() != packet.AEADModeEAX { - selfSignature.PreferredAEAD = append(selfSignature.PreferredAEAD, uint8(packet.AEADModeEAX)) + modes := []uint8{uint8(config.AEAD().Mode())} + if config.AEAD().Mode() != packet.AEADModeOCB { + modes = append(modes, uint8(packet.AEADModeOCB)) + } + + // For preferred (AES256, GCM), we'll generate (AES256, GCM), (AES256, OCB), (AES128, GCM), (AES128, OCB) + for _, cipher := range selfSignature.PreferredSymmetric { + for _, mode := range modes { + selfSignature.PreferredCipherSuites = append(selfSignature.PreferredCipherSuites, [2]uint8{cipher, mode}) + } } // User ID binding signature @@ -153,42 +157,30 @@ func (e *Entity) AddSigningSubkey(config *packet.Config) error { return err } sub := packet.NewSignerPrivateKey(creationTime, subPrivRaw) + sub.IsSubkey = true + if config != nil && config.V5Keys { + sub.UpgradeToV5() + } subkey := Subkey{ PublicKey: &sub.PublicKey, PrivateKey: sub, - Sig: &packet.Signature{ - Version: e.PrimaryKey.Version, - CreationTime: creationTime, - KeyLifetimeSecs: &keyLifetimeSecs, - SigType: packet.SigTypeSubkeyBinding, - PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, - Hash: config.Hash(), - FlagsValid: true, - FlagSign: true, - IssuerKeyId: &e.PrimaryKey.KeyId, - EmbeddedSignature: &packet.Signature{ - Version: e.PrimaryKey.Version, - CreationTime: creationTime, - SigType: packet.SigTypePrimaryKeyBinding, - PubKeyAlgo: sub.PublicKey.PubKeyAlgo, - Hash: config.Hash(), - IssuerKeyId: &e.PrimaryKey.KeyId, - }, - }, - } - if config != nil && config.V5Keys { - subkey.PublicKey.UpgradeToV5() } + subkey.Sig = createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyBinding, config) + subkey.Sig.CreationTime = creationTime + subkey.Sig.KeyLifetimeSecs = &keyLifetimeSecs + subkey.Sig.FlagsValid = true + subkey.Sig.FlagSign = true + subkey.Sig.EmbeddedSignature = createSignaturePacket(subkey.PublicKey, packet.SigTypePrimaryKeyBinding, config) + subkey.Sig.EmbeddedSignature.CreationTime = creationTime err = subkey.Sig.EmbeddedSignature.CrossSignKey(subkey.PublicKey, e.PrimaryKey, subkey.PrivateKey, config) if err != nil { return err } - subkey.PublicKey.IsSubkey = true - subkey.PrivateKey.IsSubkey = true - if err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config); err != nil { + err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) + if err != nil { return err } @@ -210,30 +202,24 @@ func (e *Entity) addEncryptionSubkey(config *packet.Config, creationTime time.Ti return err } sub := packet.NewDecrypterPrivateKey(creationTime, subPrivRaw) + sub.IsSubkey = true + if config != nil && config.V5Keys { + sub.UpgradeToV5() + } subkey := Subkey{ PublicKey: &sub.PublicKey, PrivateKey: sub, - Sig: &packet.Signature{ - Version: e.PrimaryKey.Version, - CreationTime: creationTime, - KeyLifetimeSecs: &keyLifetimeSecs, - SigType: packet.SigTypeSubkeyBinding, - PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, - Hash: config.Hash(), - FlagsValid: true, - FlagEncryptStorage: true, - FlagEncryptCommunications: true, - IssuerKeyId: &e.PrimaryKey.KeyId, - }, } - if config != nil && config.V5Keys { - subkey.PublicKey.UpgradeToV5() - } - - subkey.PublicKey.IsSubkey = true - subkey.PrivateKey.IsSubkey = true - if err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config); err != nil { + subkey.Sig = createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyBinding, config) + subkey.Sig.CreationTime = creationTime + subkey.Sig.KeyLifetimeSecs = &keyLifetimeSecs + subkey.Sig.FlagsValid = true + subkey.Sig.FlagEncryptStorage = true + subkey.Sig.FlagEncryptCommunications = true + + err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) + if err != nil { return err } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go index 48278e6e78..7283ca91cc 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go @@ -150,11 +150,9 @@ func (e *Entity) EncryptionKey(now time.Time) (Key, bool) { return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true } - // If we don't have any candidate subkeys for encryption and - // the primary key doesn't have any usage metadata then we - // assume that the primary key is ok. Or, if the primary key is - // marked as ok to encrypt with, then we can obviously use it. - if !i.SelfSignature.FlagsValid || i.SelfSignature.FlagEncryptCommunications && + // If we don't have any subkeys for encryption and the primary key + // is marked as OK to encrypt with, then we can use it. + if i.SelfSignature.FlagsValid && i.SelfSignature.FlagEncryptCommunications && e.PrimaryKey.PubKeyAlgo.CanEncrypt() { return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature, e.Revocations}, true } @@ -162,7 +160,6 @@ func (e *Entity) EncryptionKey(now time.Time) (Key, bool) { return Key{}, false } - // CertificationKey return the best candidate Key for certifying a key with this // Entity. func (e *Entity) CertificationKey(now time.Time) (Key, bool) { @@ -203,8 +200,8 @@ func (e *Entity) signingKeyByIdUsage(now time.Time, id uint64, flags int) (Key, var maxTime time.Time for idx, subkey := range e.Subkeys { if subkey.Sig.FlagsValid && - (flags & packet.KeyFlagCertify == 0 || subkey.Sig.FlagCertify) && - (flags & packet.KeyFlagSign == 0 || subkey.Sig.FlagSign) && + (flags&packet.KeyFlagCertify == 0 || subkey.Sig.FlagCertify) && + (flags&packet.KeyFlagSign == 0 || subkey.Sig.FlagSign) && subkey.PublicKey.PubKeyAlgo.CanSign() && !subkey.PublicKey.KeyExpired(subkey.Sig, now) && !subkey.Sig.SigExpired(now) && @@ -221,12 +218,11 @@ func (e *Entity) signingKeyByIdUsage(now time.Time, id uint64, flags int) (Key, return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true } - // If we have no candidate subkey then we assume that it's ok to sign - // with the primary key. Or, if the primary key is marked as ok to - // sign with, then we can use it. - if !i.SelfSignature.FlagsValid || ( - (flags & packet.KeyFlagCertify == 0 || i.SelfSignature.FlagCertify) && - (flags & packet.KeyFlagSign == 0 || i.SelfSignature.FlagSign)) && + // If we don't have any subkeys for signing and the primary key + // is marked as OK to sign with, then we can use it. + if i.SelfSignature.FlagsValid && + (flags&packet.KeyFlagCertify == 0 || i.SelfSignature.FlagCertify) && + (flags&packet.KeyFlagSign == 0 || i.SelfSignature.FlagSign) && e.PrimaryKey.PubKeyAlgo.CanSign() && (id == 0 || e.PrimaryKey.KeyId == id) { return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature, e.Revocations}, true @@ -256,6 +252,44 @@ func (e *Entity) Revoked(now time.Time) bool { return revoked(e.Revocations, now) } +// EncryptPrivateKeys encrypts all non-encrypted keys in the entity with the same key +// derived from the provided passphrase. Public keys and dummy keys are ignored, +// and don't cause an error to be returned. +func (e *Entity) EncryptPrivateKeys(passphrase []byte, config *packet.Config) error { + var keysToEncrypt []*packet.PrivateKey + // Add entity private key to encrypt. + if e.PrivateKey != nil && !e.PrivateKey.Dummy() && !e.PrivateKey.Encrypted { + keysToEncrypt = append(keysToEncrypt, e.PrivateKey) + } + + // Add subkeys to encrypt. + for _, sub := range e.Subkeys { + if sub.PrivateKey != nil && !sub.PrivateKey.Dummy() && !sub.PrivateKey.Encrypted { + keysToEncrypt = append(keysToEncrypt, sub.PrivateKey) + } + } + return packet.EncryptPrivateKeys(keysToEncrypt, passphrase, config) +} + +// DecryptPrivateKeys decrypts all encrypted keys in the entitiy with the given passphrase. +// Avoids recomputation of similar s2k key derivations. Public keys and dummy keys are ignored, +// and don't cause an error to be returned. +func (e *Entity) DecryptPrivateKeys(passphrase []byte) error { + var keysToDecrypt []*packet.PrivateKey + // Add entity private key to decrypt. + if e.PrivateKey != nil && !e.PrivateKey.Dummy() && e.PrivateKey.Encrypted { + keysToDecrypt = append(keysToDecrypt, e.PrivateKey) + } + + // Add subkeys to decrypt. + for _, sub := range e.Subkeys { + if sub.PrivateKey != nil && !sub.PrivateKey.Dummy() && sub.PrivateKey.Encrypted { + keysToDecrypt = append(keysToDecrypt, sub.PrivateKey) + } + } + return packet.DecryptPrivateKeys(keysToDecrypt, passphrase) +} + // Revoked returns whether the identity has been revoked by a self-signature. // Note that third-party revocation signatures are not supported. func (i *Identity) Revoked(now time.Time) bool { @@ -303,7 +337,11 @@ func (el EntityList) KeysById(id uint64) (keys []Key) { // the bitwise-OR of packet.KeyFlag* values. func (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) { for _, key := range el.KeysById(id) { - if key.SelfSignature != nil && key.SelfSignature.FlagsValid && requiredUsage != 0 { + if requiredUsage != 0 { + if key.SelfSignature == nil || !key.SelfSignature.FlagsValid { + continue + } + var usage byte if key.SelfSignature.FlagCertify { usage |= packet.KeyFlagCertify @@ -331,7 +369,7 @@ func (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) { func (el EntityList) DecryptionKeys() (keys []Key) { for _, e := range el { for _, subKey := range e.Subkeys { - if subKey.PrivateKey != nil && (!subKey.Sig.FlagsValid || subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) { + if subKey.PrivateKey != nil && subKey.Sig.FlagsValid && (subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) { keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig, subKey.Revocations}) } } @@ -751,18 +789,7 @@ func (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Co return errors.InvalidArgumentError("given identity string not found in Entity") } - sig := &packet.Signature{ - Version: certificationKey.PrivateKey.Version, - SigType: packet.SigTypeGenericCert, - PubKeyAlgo: certificationKey.PrivateKey.PubKeyAlgo, - Hash: config.Hash(), - CreationTime: config.Now(), - IssuerKeyId: &certificationKey.PrivateKey.KeyId, - } - - if config.SigLifetime() != 0 { - sig.SigLifetimeSecs = &config.SigLifetimeSecs - } + sig := createSignaturePacket(certificationKey.PublicKey, packet.SigTypeGenericCert, config) signingUserID := config.SigningUserId() if signingUserID != "" { @@ -783,16 +810,9 @@ func (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Co // specified reason code and text (RFC4880 section-5.2.3.23). // If config is nil, sensible defaults will be used. func (e *Entity) RevokeKey(reason packet.ReasonForRevocation, reasonText string, config *packet.Config) error { - revSig := &packet.Signature{ - Version: e.PrimaryKey.Version, - CreationTime: config.Now(), - SigType: packet.SigTypeKeyRevocation, - PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, - Hash: config.Hash(), - RevocationReason: &reason, - RevocationReasonText: reasonText, - IssuerKeyId: &e.PrimaryKey.KeyId, - } + revSig := createSignaturePacket(e.PrimaryKey, packet.SigTypeKeyRevocation, config) + revSig.RevocationReason = &reason + revSig.RevocationReasonText = reasonText if err := revSig.RevokeKey(e.PrimaryKey, e.PrivateKey, config); err != nil { return err @@ -809,16 +829,9 @@ func (e *Entity) RevokeSubkey(sk *Subkey, reason packet.ReasonForRevocation, rea return errors.InvalidArgumentError("given subkey is not associated with this key") } - revSig := &packet.Signature{ - Version: e.PrimaryKey.Version, - CreationTime: config.Now(), - SigType: packet.SigTypeSubkeyRevocation, - PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, - Hash: config.Hash(), - RevocationReason: &reason, - RevocationReasonText: reasonText, - IssuerKeyId: &e.PrimaryKey.KeyId, - } + revSig := createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyRevocation, config) + revSig.RevocationReason = &reason + revSig.RevocationReasonText = reasonText if err := revSig.RevokeSubkey(sk.PublicKey, e.PrivateKey, config); err != nil { return err diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go index 4bcfd5fdf0..108fd096f3 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go @@ -518,3 +518,21 @@ XLCBln+wdewpU4ChEffMUDRBfqfQco/YsMqWV7bHJHAO0eC/DMKCjyU90xdH7R/d QgqsfguR1PqPuJxpXV4bSr6CGAAAAA== =MSvh -----END PGP PRIVATE KEY BLOCK-----` + +const keyWithNotation = `-----BEGIN PGP PRIVATE KEY BLOCK----- + +xVgEY9gIshYJKwYBBAHaRw8BAQdAF25fSM8OpFlXZhop4Qpqo5ywGZ4jgWlR +ppjhIKDthREAAQC+LFpzFcMJYcjxGKzBGHN0Px2jU4d04YSRnFAik+lVVQ6u +zRdUZXN0IDx0ZXN0QGV4YW1wbGUuY29tPsLACgQQFgoAfAUCY9gIsgQLCQcI +CRD/utJOCym8pR0UgAAAAAAQAAR0ZXh0QGV4YW1wbGUuY29tdGVzdB8UAAAA +AAASAARiaW5hcnlAZXhhbXBsZS5jb20AAQIDAxUICgQWAAIBAhkBAhsDAh4B +FiEEEMCQTUVGKgCX5rDQ/7rSTgspvKUAAPl5AP9Npz90LxzrB97Qr2DrGwfG +wuYn4FSYwtuPfZHHeoIabwD/QEbvpQJ/NBb9EAZuow4Rirlt1yv19mmnF+j5 +8yUzhQjHXQRj2AiyEgorBgEEAZdVAQUBAQdARXAo30DmKcyUg6co7OUm0RNT +z9iqFbDBzA8A47JEt1MDAQgHAAD/XKK3lBm0SqMR558HLWdBrNG6NqKuqb5X +joCML987ZNgRD8J4BBgWCAAqBQJj2AiyCRD/utJOCym8pQIbDBYhBBDAkE1F +RioAl+aw0P+60k4LKbylAADRxgEAg7UfBDiDPp5LHcW9D+SgFHk6+GyEU4ev +VppQxdtxPvAA/34snHBX7Twnip1nMt7P4e2hDiw/hwQ7oqioOvc6jMkP +=Z8YJ +-----END PGP PRIVATE KEY BLOCK----- +` diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go index 7350974eff..fec41a0e73 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go @@ -4,6 +4,14 @@ package packet import "math/bits" +// CipherSuite contains a combination of Cipher and Mode +type CipherSuite struct { + // The cipher function + Cipher CipherFunction + // The AEAD mode of operation. + Mode AEADMode +} + // AEADConfig collects a number of AEAD parameters along with sensible defaults. // A nil AEADConfig is valid and results in all default values. type AEADConfig struct { @@ -15,12 +23,13 @@ type AEADConfig struct { // Mode returns the AEAD mode of operation. func (conf *AEADConfig) Mode() AEADMode { + // If no preference is specified, OCB is used (which is mandatory to implement). if conf == nil || conf.DefaultMode == 0 { - return AEADModeEAX + return AEADModeOCB } + mode := conf.DefaultMode - if mode != AEADModeEAX && mode != AEADModeOCB && - mode != AEADModeExperimentalGCM { + if mode != AEADModeEAX && mode != AEADModeOCB && mode != AEADModeGCM { panic("AEAD mode unsupported") } return mode @@ -28,6 +37,8 @@ func (conf *AEADConfig) Mode() AEADMode { // ChunkSizeByte returns the byte indicating the chunk size. The effective // chunk size is computed with the formula uint64(1) << (chunkSizeByte + 6) +// limit to 16 = 4 MiB +// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 func (conf *AEADConfig) ChunkSizeByte() byte { if conf == nil || conf.ChunkSize == 0 { return 12 // 1 << (12 + 6) == 262144 bytes @@ -38,8 +49,8 @@ func (conf *AEADConfig) ChunkSizeByte() byte { switch { case exponent < 6: exponent = 6 - case exponent > 27: - exponent = 27 + case exponent > 16: + exponent = 16 } return byte(exponent - 6) diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_crypter.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_crypter.go new file mode 100644 index 0000000000..cee83bdc7a --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_crypter.go @@ -0,0 +1,264 @@ +// Copyright (C) 2019 ProtonTech AG + +package packet + +import ( + "bytes" + "crypto/cipher" + "encoding/binary" + "io" + + "github.com/ProtonMail/go-crypto/openpgp/errors" +) + +// aeadCrypter is an AEAD opener/sealer, its configuration, and data for en/decryption. +type aeadCrypter struct { + aead cipher.AEAD + chunkSize int + initialNonce []byte + associatedData []byte // Chunk-independent associated data + chunkIndex []byte // Chunk counter + packetTag packetType // SEIP packet (v2) or AEAD Encrypted Data packet + bytesProcessed int // Amount of plaintext bytes encrypted/decrypted + buffer bytes.Buffer // Buffered bytes across chunks +} + +// computeNonce takes the incremental index and computes an eXclusive OR with +// the least significant 8 bytes of the receivers' initial nonce (see sec. +// 5.16.1 and 5.16.2). It returns the resulting nonce. +func (wo *aeadCrypter) computeNextNonce() (nonce []byte) { + if wo.packetTag == packetTypeSymmetricallyEncryptedIntegrityProtected { + return append(wo.initialNonce, wo.chunkIndex...) + } + + nonce = make([]byte, len(wo.initialNonce)) + copy(nonce, wo.initialNonce) + offset := len(wo.initialNonce) - 8 + for i := 0; i < 8; i++ { + nonce[i+offset] ^= wo.chunkIndex[i] + } + return +} + +// incrementIndex performs an integer increment by 1 of the integer represented by the +// slice, modifying it accordingly. +func (wo *aeadCrypter) incrementIndex() error { + index := wo.chunkIndex + if len(index) == 0 { + return errors.AEADError("Index has length 0") + } + for i := len(index) - 1; i >= 0; i-- { + if index[i] < 255 { + index[i]++ + return nil + } + index[i] = 0 + } + return errors.AEADError("cannot further increment index") +} + +// aeadDecrypter reads and decrypts bytes. It buffers extra decrypted bytes when +// necessary, similar to aeadEncrypter. +type aeadDecrypter struct { + aeadCrypter // Embedded ciphertext opener + reader io.Reader // 'reader' is a partialLengthReader + peekedBytes []byte // Used to detect last chunk + eof bool +} + +// Read decrypts bytes and reads them into dst. It decrypts when necessary and +// buffers extra decrypted bytes. It returns the number of bytes copied into dst +// and an error. +func (ar *aeadDecrypter) Read(dst []byte) (n int, err error) { + // Return buffered plaintext bytes from previous calls + if ar.buffer.Len() > 0 { + return ar.buffer.Read(dst) + } + + // Return EOF if we've previously validated the final tag + if ar.eof { + return 0, io.EOF + } + + // Read a chunk + tagLen := ar.aead.Overhead() + cipherChunkBuf := new(bytes.Buffer) + _, errRead := io.CopyN(cipherChunkBuf, ar.reader, int64(ar.chunkSize+tagLen)) + cipherChunk := cipherChunkBuf.Bytes() + if errRead != nil && errRead != io.EOF { + return 0, errRead + } + decrypted, errChunk := ar.openChunk(cipherChunk) + if errChunk != nil { + return 0, errChunk + } + + // Return decrypted bytes, buffering if necessary + if len(dst) < len(decrypted) { + n = copy(dst, decrypted[:len(dst)]) + ar.buffer.Write(decrypted[len(dst):]) + } else { + n = copy(dst, decrypted) + } + + // Check final authentication tag + if errRead == io.EOF { + errChunk := ar.validateFinalTag(ar.peekedBytes) + if errChunk != nil { + return n, errChunk + } + ar.eof = true // Mark EOF for when we've returned all buffered data + } + return +} + +// Close is noOp. The final authentication tag of the stream was already +// checked in the last Read call. In the future, this function could be used to +// wipe the reader and peeked, decrypted bytes, if necessary. +func (ar *aeadDecrypter) Close() (err error) { + return nil +} + +// openChunk decrypts and checks integrity of an encrypted chunk, returning +// the underlying plaintext and an error. It accesses peeked bytes from next +// chunk, to identify the last chunk and decrypt/validate accordingly. +func (ar *aeadDecrypter) openChunk(data []byte) ([]byte, error) { + tagLen := ar.aead.Overhead() + // Restore carried bytes from last call + chunkExtra := append(ar.peekedBytes, data...) + // 'chunk' contains encrypted bytes, followed by an authentication tag. + chunk := chunkExtra[:len(chunkExtra)-tagLen] + ar.peekedBytes = chunkExtra[len(chunkExtra)-tagLen:] + + adata := ar.associatedData + if ar.aeadCrypter.packetTag == packetTypeAEADEncrypted { + adata = append(ar.associatedData, ar.chunkIndex...) + } + + nonce := ar.computeNextNonce() + plainChunk, err := ar.aead.Open(nil, nonce, chunk, adata) + if err != nil { + return nil, err + } + ar.bytesProcessed += len(plainChunk) + if err = ar.aeadCrypter.incrementIndex(); err != nil { + return nil, err + } + return plainChunk, nil +} + +// Checks the summary tag. It takes into account the total decrypted bytes into +// the associated data. It returns an error, or nil if the tag is valid. +func (ar *aeadDecrypter) validateFinalTag(tag []byte) error { + // Associated: tag, version, cipher, aead, chunk size, ... + amountBytes := make([]byte, 8) + binary.BigEndian.PutUint64(amountBytes, uint64(ar.bytesProcessed)) + + adata := ar.associatedData + if ar.aeadCrypter.packetTag == packetTypeAEADEncrypted { + // ... index ... + adata = append(ar.associatedData, ar.chunkIndex...) + } + + // ... and total number of encrypted octets + adata = append(adata, amountBytes...) + nonce := ar.computeNextNonce() + _, err := ar.aead.Open(nil, nonce, tag, adata) + if err != nil { + return err + } + return nil +} + +// aeadEncrypter encrypts and writes bytes. It encrypts when necessary according +// to the AEAD block size, and buffers the extra encrypted bytes for next write. +type aeadEncrypter struct { + aeadCrypter // Embedded plaintext sealer + writer io.WriteCloser // 'writer' is a partialLengthWriter +} + +// Write encrypts and writes bytes. It encrypts when necessary and buffers extra +// plaintext bytes for next call. When the stream is finished, Close() MUST be +// called to append the final tag. +func (aw *aeadEncrypter) Write(plaintextBytes []byte) (n int, err error) { + // Append plaintextBytes to existing buffered bytes + n, err = aw.buffer.Write(plaintextBytes) + if err != nil { + return n, err + } + // Encrypt and write chunks + for aw.buffer.Len() >= aw.chunkSize { + plainChunk := aw.buffer.Next(aw.chunkSize) + encryptedChunk, err := aw.sealChunk(plainChunk) + if err != nil { + return n, err + } + _, err = aw.writer.Write(encryptedChunk) + if err != nil { + return n, err + } + } + return +} + +// Close encrypts and writes the remaining buffered plaintext if any, appends +// the final authentication tag, and closes the embedded writer. This function +// MUST be called at the end of a stream. +func (aw *aeadEncrypter) Close() (err error) { + // Encrypt and write a chunk if there's buffered data left, or if we haven't + // written any chunks yet. + if aw.buffer.Len() > 0 || aw.bytesProcessed == 0 { + plainChunk := aw.buffer.Bytes() + lastEncryptedChunk, err := aw.sealChunk(plainChunk) + if err != nil { + return err + } + _, err = aw.writer.Write(lastEncryptedChunk) + if err != nil { + return err + } + } + // Compute final tag (associated data: packet tag, version, cipher, aead, + // chunk size... + adata := aw.associatedData + + if aw.aeadCrypter.packetTag == packetTypeAEADEncrypted { + // ... index ... + adata = append(aw.associatedData, aw.chunkIndex...) + } + + // ... and total number of encrypted octets + amountBytes := make([]byte, 8) + binary.BigEndian.PutUint64(amountBytes, uint64(aw.bytesProcessed)) + adata = append(adata, amountBytes...) + + nonce := aw.computeNextNonce() + finalTag := aw.aead.Seal(nil, nonce, nil, adata) + _, err = aw.writer.Write(finalTag) + if err != nil { + return err + } + return aw.writer.Close() +} + +// sealChunk Encrypts and authenticates the given chunk. +func (aw *aeadEncrypter) sealChunk(data []byte) ([]byte, error) { + if len(data) > aw.chunkSize { + return nil, errors.AEADError("chunk exceeds maximum length") + } + if aw.associatedData == nil { + return nil, errors.AEADError("can't seal without headers") + } + adata := aw.associatedData + if aw.aeadCrypter.packetTag == packetTypeAEADEncrypted { + adata = append(aw.associatedData, aw.chunkIndex...) + } + + nonce := aw.computeNextNonce() + encrypted := aw.aead.Seal(nil, nonce, data, adata) + aw.bytesProcessed += len(data) + if err := aw.aeadCrypter.incrementIndex(); err != nil { + return nil, err + } + return encrypted, nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go index 862b1ac017..98bd876bf2 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go @@ -3,17 +3,14 @@ package packet import ( - "bytes" - "crypto/cipher" - "crypto/rand" - "encoding/binary" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" ) -// AEADEncrypted represents an AEAD Encrypted Packet (tag 20, RFC4880bis-5.16). +// AEADEncrypted represents an AEAD Encrypted Packet. +// See https://www.ietf.org/archive/id/draft-koch-openpgp-2015-rfc4880bis-00.html#name-aead-encrypted-data-packet-t type AEADEncrypted struct { cipher CipherFunction mode AEADMode @@ -25,33 +22,6 @@ type AEADEncrypted struct { // Only currently defined version const aeadEncryptedVersion = 1 -// An AEAD opener/sealer, its configuration, and data for en/decryption. -type aeadCrypter struct { - aead cipher.AEAD - chunkSize int - initialNonce []byte - associatedData []byte // Chunk-independent associated data - chunkIndex []byte // Chunk counter - bytesProcessed int // Amount of plaintext bytes encrypted/decrypted - buffer bytes.Buffer // Buffered bytes across chunks -} - -// aeadEncrypter encrypts and writes bytes. It encrypts when necessary according -// to the AEAD block size, and buffers the extra encrypted bytes for next write. -type aeadEncrypter struct { - aeadCrypter // Embedded plaintext sealer - writer io.WriteCloser // 'writer' is a partialLengthWriter -} - -// aeadDecrypter reads and decrypts bytes. It buffers extra decrypted bytes when -// necessary, similar to aeadEncrypter. -type aeadDecrypter struct { - aeadCrypter // Embedded ciphertext opener - reader io.Reader // 'reader' is a partialLengthReader - peekedBytes []byte // Used to detect last chunk - eof bool -} - func (ae *AEADEncrypted) parse(buf io.Reader) error { headerData := make([]byte, 4) if n, err := io.ReadFull(buf, headerData); n < 4 { @@ -59,10 +29,14 @@ func (ae *AEADEncrypted) parse(buf io.Reader) error { } // Read initial nonce mode := AEADMode(headerData[2]) - nonceLen := mode.NonceLength() - if nonceLen == 0 { + nonceLen := mode.IvLength() + + // This packet supports only EAX and OCB + // https://www.ietf.org/archive/id/draft-koch-openpgp-2015-rfc4880bis-00.html#name-aead-encrypted-data-packet-t + if nonceLen == 0 || mode > AEADModeOCB { return errors.AEADError("unknown mode") } + initialNonce := make([]byte, nonceLen) if n, err := io.ReadFull(buf, initialNonce); n < nonceLen { return errors.AEADError("could not read aead nonce:" + err.Error()) @@ -75,7 +49,7 @@ func (ae *AEADEncrypted) parse(buf io.Reader) error { } ae.cipher = CipherFunction(c) ae.mode = mode - ae.chunkSizeByte = byte(headerData[3]) + ae.chunkSizeByte = headerData[3] return nil } @@ -105,225 +79,13 @@ func (ae *AEADEncrypted) decrypt(key []byte) (io.ReadCloser, error) { initialNonce: ae.initialNonce, associatedData: ae.associatedData(), chunkIndex: make([]byte, 8), + packetTag: packetTypeAEADEncrypted, }, reader: ae.Contents, peekedBytes: peekedBytes}, nil } -// Read decrypts bytes and reads them into dst. It decrypts when necessary and -// buffers extra decrypted bytes. It returns the number of bytes copied into dst -// and an error. -func (ar *aeadDecrypter) Read(dst []byte) (n int, err error) { - // Return buffered plaintext bytes from previous calls - if ar.buffer.Len() > 0 { - return ar.buffer.Read(dst) - } - - // Return EOF if we've previously validated the final tag - if ar.eof { - return 0, io.EOF - } - - // Read a chunk - tagLen := ar.aead.Overhead() - cipherChunkBuf := new(bytes.Buffer) - _, errRead := io.CopyN(cipherChunkBuf, ar.reader, int64(ar.chunkSize + tagLen)) - cipherChunk := cipherChunkBuf.Bytes() - if errRead != nil && errRead != io.EOF { - return 0, errRead - } - decrypted, errChunk := ar.openChunk(cipherChunk) - if errChunk != nil { - return 0, errChunk - } - - // Return decrypted bytes, buffering if necessary - if len(dst) < len(decrypted) { - n = copy(dst, decrypted[:len(dst)]) - ar.buffer.Write(decrypted[len(dst):]) - } else { - n = copy(dst, decrypted) - } - - // Check final authentication tag - if errRead == io.EOF { - errChunk := ar.validateFinalTag(ar.peekedBytes) - if errChunk != nil { - return n, errChunk - } - ar.eof = true // Mark EOF for when we've returned all buffered data - } - return -} - -// Close is noOp. The final authentication tag of the stream was already -// checked in the last Read call. In the future, this function could be used to -// wipe the reader and peeked, decrypted bytes, if necessary. -func (ar *aeadDecrypter) Close() (err error) { - return nil -} - -// SerializeAEADEncrypted initializes the aeadCrypter and returns a writer. -// This writer encrypts and writes bytes (see aeadEncrypter.Write()). -func SerializeAEADEncrypted(w io.Writer, key []byte, cipher CipherFunction, mode AEADMode, config *Config) (io.WriteCloser, error) { - writeCloser := noOpCloser{w} - writer, err := serializeStreamHeader(writeCloser, packetTypeAEADEncrypted) - if err != nil { - return nil, err - } - - // Data for en/decryption: tag, version, cipher, aead mode, chunk size - aeadConf := config.AEAD() - prefix := []byte{ - 0xD4, - aeadEncryptedVersion, - byte(config.Cipher()), - byte(aeadConf.Mode()), - aeadConf.ChunkSizeByte(), - } - n, err := writer.Write(prefix[1:]) - if err != nil || n < 4 { - return nil, errors.AEADError("could not write AEAD headers") - } - // Sample nonce - nonceLen := aeadConf.Mode().NonceLength() - nonce := make([]byte, nonceLen) - n, err = rand.Read(nonce) - if err != nil { - panic("Could not sample random nonce") - } - _, err = writer.Write(nonce) - if err != nil { - return nil, err - } - blockCipher := CipherFunction(config.Cipher()).new(key) - alg := AEADMode(aeadConf.Mode()).new(blockCipher) - - chunkSize := decodeAEADChunkSize(aeadConf.ChunkSizeByte()) - return &aeadEncrypter{ - aeadCrypter: aeadCrypter{ - aead: alg, - chunkSize: chunkSize, - associatedData: prefix, - chunkIndex: make([]byte, 8), - initialNonce: nonce, - }, - writer: writer}, nil -} - -// Write encrypts and writes bytes. It encrypts when necessary and buffers extra -// plaintext bytes for next call. When the stream is finished, Close() MUST be -// called to append the final tag. -func (aw *aeadEncrypter) Write(plaintextBytes []byte) (n int, err error) { - // Append plaintextBytes to existing buffered bytes - n, err = aw.buffer.Write(plaintextBytes) - if err != nil { - return n, err - } - // Encrypt and write chunks - for aw.buffer.Len() >= aw.chunkSize { - plainChunk := aw.buffer.Next(aw.chunkSize) - encryptedChunk, err := aw.sealChunk(plainChunk) - if err != nil { - return n, err - } - _, err = aw.writer.Write(encryptedChunk) - if err != nil { - return n, err - } - } - return -} - -// Close encrypts and writes the remaining buffered plaintext if any, appends -// the final authentication tag, and closes the embedded writer. This function -// MUST be called at the end of a stream. -func (aw *aeadEncrypter) Close() (err error) { - // Encrypt and write a chunk if there's buffered data left, or if we haven't - // written any chunks yet. - if aw.buffer.Len() > 0 || aw.bytesProcessed == 0 { - plainChunk := aw.buffer.Bytes() - lastEncryptedChunk, err := aw.sealChunk(plainChunk) - if err != nil { - return err - } - _, err = aw.writer.Write(lastEncryptedChunk) - if err != nil { - return err - } - } - // Compute final tag (associated data: packet tag, version, cipher, aead, - // chunk size, index, total number of encrypted octets). - adata := append(aw.associatedData[:], aw.chunkIndex[:]...) - adata = append(adata, make([]byte, 8)...) - binary.BigEndian.PutUint64(adata[13:], uint64(aw.bytesProcessed)) - nonce := aw.computeNextNonce() - finalTag := aw.aead.Seal(nil, nonce, nil, adata) - _, err = aw.writer.Write(finalTag) - if err != nil { - return err - } - return aw.writer.Close() -} - -// sealChunk Encrypts and authenticates the given chunk. -func (aw *aeadEncrypter) sealChunk(data []byte) ([]byte, error) { - if len(data) > aw.chunkSize { - return nil, errors.AEADError("chunk exceeds maximum length") - } - if aw.associatedData == nil { - return nil, errors.AEADError("can't seal without headers") - } - adata := append(aw.associatedData, aw.chunkIndex...) - nonce := aw.computeNextNonce() - encrypted := aw.aead.Seal(nil, nonce, data, adata) - aw.bytesProcessed += len(data) - if err := aw.aeadCrypter.incrementIndex(); err != nil { - return nil, err - } - return encrypted, nil -} - -// openChunk decrypts and checks integrity of an encrypted chunk, returning -// the underlying plaintext and an error. It access peeked bytes from next -// chunk, to identify the last chunk and decrypt/validate accordingly. -func (ar *aeadDecrypter) openChunk(data []byte) ([]byte, error) { - tagLen := ar.aead.Overhead() - // Restore carried bytes from last call - chunkExtra := append(ar.peekedBytes, data...) - // 'chunk' contains encrypted bytes, followed by an authentication tag. - chunk := chunkExtra[:len(chunkExtra)-tagLen] - ar.peekedBytes = chunkExtra[len(chunkExtra)-tagLen:] - adata := append(ar.associatedData, ar.chunkIndex...) - nonce := ar.computeNextNonce() - plainChunk, err := ar.aead.Open(nil, nonce, chunk, adata) - if err != nil { - return nil, err - } - ar.bytesProcessed += len(plainChunk) - if err = ar.aeadCrypter.incrementIndex(); err != nil { - return nil, err - } - return plainChunk, nil -} - -// Checks the summary tag. It takes into account the total decrypted bytes into -// the associated data. It returns an error, or nil if the tag is valid. -func (ar *aeadDecrypter) validateFinalTag(tag []byte) error { - // Associated: tag, version, cipher, aead, chunk size, index, and octets - amountBytes := make([]byte, 8) - binary.BigEndian.PutUint64(amountBytes, uint64(ar.bytesProcessed)) - adata := append(ar.associatedData, ar.chunkIndex...) - adata = append(adata, amountBytes...) - nonce := ar.computeNextNonce() - _, err := ar.aead.Open(nil, nonce, tag, adata) - if err != nil { - return err - } - return nil -} - -// Associated data for chunks: tag, version, cipher, mode, chunk size byte +// associatedData for chunks: tag, version, cipher, mode, chunk size byte func (ae *AEADEncrypted) associatedData() []byte { return []byte{ 0xD4, @@ -332,33 +94,3 @@ func (ae *AEADEncrypted) associatedData() []byte { byte(ae.mode), ae.chunkSizeByte} } - -// computeNonce takes the incremental index and computes an eXclusive OR with -// the least significant 8 bytes of the receivers' initial nonce (see sec. -// 5.16.1 and 5.16.2). It returns the resulting nonce. -func (wo *aeadCrypter) computeNextNonce() (nonce []byte) { - nonce = make([]byte, len(wo.initialNonce)) - copy(nonce, wo.initialNonce) - offset := len(wo.initialNonce) - 8 - for i := 0; i < 8; i++ { - nonce[i+offset] ^= wo.chunkIndex[i] - } - return -} - -// incrementIndex performs an integer increment by 1 of the integer represented by the -// slice, modifying it accordingly. -func (wo *aeadCrypter) incrementIndex() error { - index := wo.chunkIndex - if len(index) == 0 { - return errors.AEADError("Index has length 0") - } - for i := len(index) - 1; i >= 0; i-- { - if index[i] < 255 { - index[i]++ - return nil - } - index[i] = 0 - } - return errors.AEADError("cannot further increment index") -} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go index f9208158ba..04994bec97 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go @@ -10,6 +10,8 @@ import ( "io" "math/big" "time" + + "github.com/ProtonMail/go-crypto/openpgp/s2k" ) // Config collects a number of parameters along with sensible defaults. @@ -33,16 +35,24 @@ type Config struct { DefaultCompressionAlgo CompressionAlgo // CompressionConfig configures the compression settings. CompressionConfig *CompressionConfig - // S2KCount is only used for symmetric encryption. It - // determines the strength of the passphrase stretching when + // S2K (String to Key) config, used for key derivation in the context of secret key encryption + // and password-encrypted data. + // If nil, the default configuration is used + S2KConfig *s2k.Config + // Iteration count for Iterated S2K (String to Key). + // Only used if sk2.Mode is nil. + // This value is duplicated here from s2k.Config for backwards compatibility. + // It determines the strength of the passphrase stretching when // the said passphrase is hashed to produce a key. S2KCount - // should be between 1024 and 65011712, inclusive. If Config - // is nil or S2KCount is 0, the value 65536 used. Not all + // should be between 65536 and 65011712, inclusive. If Config + // is nil or S2KCount is 0, the value 16777216 used. Not all // values in the above range can be represented. S2KCount will // be rounded up to the next representable value if it cannot // be encoded exactly. When set, it is strongly encrouraged to // use a value that is at least 65536. See RFC 4880 Section // 3.7.1.3. + // + // Deprecated: SK2Count should be configured in S2KConfig instead. S2KCount int // RSABits is the number of bits in new RSA keys made with NewEntity. // If zero, then 2048 bit keys are created. @@ -94,6 +104,12 @@ type Config struct { // might be no other way than to tolerate the missing MDC. Setting this flag, allows this // mode of operation. It should be considered a measure of last resort. InsecureAllowUnauthenticatedMessages bool + // KnownNotations is a map of Notation Data names to bools, which controls + // the notation names that are allowed to be present in critical Notation Data + // signature subpackets. + KnownNotations map[string]bool + // SignatureNotations is a list of Notations to be added to any signatures. + SignatureNotations []*Notation } func (c *Config) Random() io.Reader { @@ -119,9 +135,9 @@ func (c *Config) Cipher() CipherFunction { func (c *Config) Now() time.Time { if c == nil || c.Time == nil { - return time.Now() + return time.Now().Truncate(time.Second) } - return c.Time() + return c.Time().Truncate(time.Second) } // KeyLifetime returns the validity period of the key. @@ -147,13 +163,6 @@ func (c *Config) Compression() CompressionAlgo { return c.DefaultCompressionAlgo } -func (c *Config) PasswordHashIterations() int { - if c == nil || c.S2KCount == 0 { - return 0 - } - return c.S2KCount -} - func (c *Config) RSAModulusBits() int { if c == nil || c.RSABits == 0 { return 2048 @@ -175,6 +184,27 @@ func (c *Config) CurveName() Curve { return c.Curve } +// Deprecated: The hash iterations should now be queried via the S2K() method. +func (c *Config) PasswordHashIterations() int { + if c == nil || c.S2KCount == 0 { + return 0 + } + return c.S2KCount +} + +func (c *Config) S2K() *s2k.Config { + if c == nil { + return nil + } + // for backwards compatibility + if c != nil && c.S2KCount > 0 && c.S2KConfig == nil { + return &s2k.Config{ + S2KCount: c.S2KCount, + } + } + return c.S2KConfig +} + func (c *Config) AEAD() *AEADConfig { if c == nil { return nil @@ -202,3 +232,17 @@ func (c *Config) AllowUnauthenticatedMessages() bool { } return c.InsecureAllowUnauthenticatedMessages } + +func (c *Config) KnownNotation(notationName string) bool { + if c == nil { + return false + } + return c.KnownNotations[notationName] +} + +func (c *Config) Notations() []*Notation { + if c == nil { + return nil + } + return c.SignatureNotations +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go index 801aec92b4..eeff2902c1 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go @@ -25,7 +25,7 @@ const encryptedKeyVersion = 3 type EncryptedKey struct { KeyId uint64 Algo PublicKeyAlgorithm - CipherFunc CipherFunction // only valid after a successful Decrypt + CipherFunc CipherFunction // only valid after a successful Decrypt for a v3 packet Key []byte // only valid after a successful Decrypt encryptedMPI1, encryptedMPI2 encoding.Field @@ -123,6 +123,10 @@ func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { } e.CipherFunc = CipherFunction(b[0]) + if !e.CipherFunc.IsSupported() { + return errors.UnsupportedError("unsupported encryption function") + } + e.Key = b[1 : len(b)-2] expectedChecksum := uint16(b[len(b)-2])<<8 | uint16(b[len(b)-1]) checksum := checksumKeyMaterial(e.Key) diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/notation.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/notation.go new file mode 100644 index 0000000000..2c3e3f50b2 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/notation.go @@ -0,0 +1,29 @@ +package packet + +// Notation type represents a Notation Data subpacket +// see https://tools.ietf.org/html/rfc4880#section-5.2.3.16 +type Notation struct { + Name string + Value []byte + IsCritical bool + IsHumanReadable bool +} + +func (notation *Notation) getData() []byte { + nameData := []byte(notation.Name) + nameLen := len(nameData) + valueLen := len(notation.Value) + + data := make([]byte, 8+nameLen+valueLen) + if notation.IsHumanReadable { + data[0] = 0x80 + } + + data[4] = byte(nameLen >> 8) + data[5] = byte(nameLen) + data[6] = byte(valueLen >> 8) + data[7] = byte(valueLen) + copy(data[8:8+nameLen], nameData) + copy(data[8+nameLen:], notation.Value) + return data +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go index 41c35de219..033fb2d7e8 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go @@ -8,7 +8,7 @@ import ( "crypto" "encoding/binary" "github.com/ProtonMail/go-crypto/openpgp/errors" - "github.com/ProtonMail/go-crypto/openpgp/s2k" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "io" "strconv" ) @@ -37,7 +37,7 @@ func (ops *OnePassSignature) parse(r io.Reader) (err error) { } var ok bool - ops.Hash, ok = s2k.HashIdToHash(buf[2]) + ops.Hash, ok = algorithm.HashIdToHashWithSha1(buf[2]) if !ok { return errors.UnsupportedError("hash function: " + strconv.Itoa(int(buf[2]))) } @@ -55,7 +55,7 @@ func (ops *OnePassSignature) Serialize(w io.Writer) error { buf[0] = onePassSignatureVersion buf[1] = uint8(ops.SigType) var ok bool - buf[2], ok = s2k.HashToHashId(ops.Hash) + buf[2], ok = algorithm.HashToHashIdWithSha1(ops.Hash) if !ok { return errors.UnsupportedError("hash type: " + strconv.Itoa(int(ops.Hash))) } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go index c570bfca8f..4d86a7da82 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go @@ -302,21 +302,21 @@ func consumeAll(r io.Reader) (n int64, err error) { type packetType uint8 const ( - packetTypeEncryptedKey packetType = 1 - packetTypeSignature packetType = 2 - packetTypeSymmetricKeyEncrypted packetType = 3 - packetTypeOnePassSignature packetType = 4 - packetTypePrivateKey packetType = 5 - packetTypePublicKey packetType = 6 - packetTypePrivateSubkey packetType = 7 - packetTypeCompressed packetType = 8 - packetTypeSymmetricallyEncrypted packetType = 9 - packetTypeLiteralData packetType = 11 - packetTypeUserId packetType = 13 - packetTypePublicSubkey packetType = 14 - packetTypeUserAttribute packetType = 17 - packetTypeSymmetricallyEncryptedMDC packetType = 18 - packetTypeAEADEncrypted packetType = 20 + packetTypeEncryptedKey packetType = 1 + packetTypeSignature packetType = 2 + packetTypeSymmetricKeyEncrypted packetType = 3 + packetTypeOnePassSignature packetType = 4 + packetTypePrivateKey packetType = 5 + packetTypePublicKey packetType = 6 + packetTypePrivateSubkey packetType = 7 + packetTypeCompressed packetType = 8 + packetTypeSymmetricallyEncrypted packetType = 9 + packetTypeLiteralData packetType = 11 + packetTypeUserId packetType = 13 + packetTypePublicSubkey packetType = 14 + packetTypeUserAttribute packetType = 17 + packetTypeSymmetricallyEncryptedIntegrityProtected packetType = 18 + packetTypeAEADEncrypted packetType = 20 ) // EncryptedDataPacket holds encrypted data. It is currently implemented by @@ -361,9 +361,9 @@ func Read(r io.Reader) (p Packet, err error) { p = new(UserId) case packetTypeUserAttribute: p = new(UserAttribute) - case packetTypeSymmetricallyEncryptedMDC: + case packetTypeSymmetricallyEncryptedIntegrityProtected: se := new(SymmetricallyEncrypted) - se.MDC = true + se.IntegrityProtected = true p = se case packetTypeAEADEncrypted: p = new(AEADEncrypted) @@ -384,18 +384,18 @@ func Read(r io.Reader) (p Packet, err error) { type SignatureType uint8 const ( - SigTypeBinary SignatureType = 0x00 - SigTypeText = 0x01 - SigTypeGenericCert = 0x10 - SigTypePersonaCert = 0x11 - SigTypeCasualCert = 0x12 - SigTypePositiveCert = 0x13 - SigTypeSubkeyBinding = 0x18 - SigTypePrimaryKeyBinding = 0x19 - SigTypeDirectSignature = 0x1F - SigTypeKeyRevocation = 0x20 - SigTypeSubkeyRevocation = 0x28 - SigTypeCertificationRevocation = 0x30 + SigTypeBinary SignatureType = 0x00 + SigTypeText = 0x01 + SigTypeGenericCert = 0x10 + SigTypePersonaCert = 0x11 + SigTypeCasualCert = 0x12 + SigTypePositiveCert = 0x13 + SigTypeSubkeyBinding = 0x18 + SigTypePrimaryKeyBinding = 0x19 + SigTypeDirectSignature = 0x1F + SigTypeKeyRevocation = 0x20 + SigTypeSubkeyRevocation = 0x28 + SigTypeCertificationRevocation = 0x30 ) // PublicKeyAlgorithm represents the different public key system specified for @@ -455,6 +455,11 @@ func (cipher CipherFunction) KeySize() int { return algorithm.CipherFunction(cipher).KeySize() } +// IsSupported returns true if the cipher is supported from the library +func (cipher CipherFunction) IsSupported() bool { + return algorithm.CipherFunction(cipher).KeySize() > 0 +} + // blockSize returns the block size, in bytes, of cipher. func (cipher CipherFunction) blockSize() int { return algorithm.CipherFunction(cipher).BlockSize() @@ -490,15 +495,16 @@ const ( // AEADMode represents the different Authenticated Encryption with Associated // Data specified for OpenPGP. +// See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.6 type AEADMode algorithm.AEADMode const ( - AEADModeEAX AEADMode = 1 - AEADModeOCB AEADMode = 2 - AEADModeExperimentalGCM AEADMode = 100 + AEADModeEAX AEADMode = 1 + AEADModeOCB AEADMode = 2 + AEADModeGCM AEADMode = 3 ) -func (mode AEADMode) NonceLength() int { +func (mode AEADMode) IvLength() int { return algorithm.AEADMode(mode).NonceLength() } @@ -527,13 +533,19 @@ const ( type Curve string const ( - Curve25519 Curve = "Curve25519" - Curve448 Curve = "Curve448" - CurveNistP256 Curve = "P256" - CurveNistP384 Curve = "P384" - CurveNistP521 Curve = "P521" - CurveSecP256k1 Curve = "SecP256k1" + Curve25519 Curve = "Curve25519" + Curve448 Curve = "Curve448" + CurveNistP256 Curve = "P256" + CurveNistP384 Curve = "P384" + CurveNistP521 Curve = "P521" + CurveSecP256k1 Curve = "SecP256k1" CurveBrainpoolP256 Curve = "BrainpoolP256" CurveBrainpoolP384 Curve = "BrainpoolP384" CurveBrainpoolP512 Curve = "BrainpoolP512" ) + +// TrustLevel represents a trust level per RFC4880 5.2.3.13 +type TrustLevel uint8 + +// TrustAmount represents a trust amount per RFC4880 5.2.3.13 +type TrustAmount uint8 diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go index 009f0ef1db..2fc4386437 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go @@ -49,7 +49,7 @@ type PrivateKey struct { s2kParams *s2k.Params } -//S2KType s2k packet type +// S2KType s2k packet type type S2KType uint8 const ( @@ -179,6 +179,9 @@ func (pk *PrivateKey) parse(r io.Reader) (err error) { return } pk.cipher = CipherFunction(buf[0]) + if pk.cipher != 0 && !pk.cipher.IsSupported() { + return errors.UnsupportedError("unsupported cipher function in private key") + } pk.s2kParams, err = s2k.ParseIntoParams(r) if err != nil { return @@ -367,8 +370,8 @@ func serializeECDHPrivateKey(w io.Writer, priv *ecdh.PrivateKey) error { return err } -// Decrypt decrypts an encrypted private key using a passphrase. -func (pk *PrivateKey) Decrypt(passphrase []byte) error { +// decrypt decrypts an encrypted private key using a decryption key. +func (pk *PrivateKey) decrypt(decryptionKey []byte) error { if pk.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } @@ -376,9 +379,7 @@ func (pk *PrivateKey) Decrypt(passphrase []byte) error { return nil } - key := make([]byte, pk.cipher.KeySize()) - pk.s2k(key, passphrase) - block := pk.cipher.new(key) + block := pk.cipher.new(decryptionKey) cfb := cipher.NewCFBDecrypter(block, pk.iv) data := make([]byte, len(pk.encryptedData)) @@ -427,35 +428,79 @@ func (pk *PrivateKey) Decrypt(passphrase []byte) error { return nil } -// Encrypt encrypts an unencrypted private key using a passphrase. -func (pk *PrivateKey) Encrypt(passphrase []byte) error { - priv := bytes.NewBuffer(nil) - err := pk.serializePrivateKey(priv) +func (pk *PrivateKey) decryptWithCache(passphrase []byte, keyCache *s2k.Cache) error { + if pk.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + if !pk.Encrypted { + return nil + } + + key, err := keyCache.GetOrComputeDerivedKey(passphrase, pk.s2kParams, pk.cipher.KeySize()) if err != nil { return err } + return pk.decrypt(key) +} + +// Decrypt decrypts an encrypted private key using a passphrase. +func (pk *PrivateKey) Decrypt(passphrase []byte) error { + if pk.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + if !pk.Encrypted { + return nil + } + + key := make([]byte, pk.cipher.KeySize()) + pk.s2k(key, passphrase) + return pk.decrypt(key) +} - //Default config of private key encryption - pk.cipher = CipherAES256 - s2kConfig := &s2k.Config{ - S2KMode: 3, //Iterated - S2KCount: 65536, - Hash: crypto.SHA256, +// DecryptPrivateKeys decrypts all encrypted keys with the given config and passphrase. +// Avoids recomputation of similar s2k key derivations. +func DecryptPrivateKeys(keys []*PrivateKey, passphrase []byte) error { + // Create a cache to avoid recomputation of key derviations for the same passphrase. + s2kCache := &s2k.Cache{} + for _, key := range keys { + if key != nil && !key.Dummy() && key.Encrypted { + err := key.decryptWithCache(passphrase, s2kCache) + if err != nil { + return err + } + } } + return nil +} - pk.s2kParams, err = s2k.Generate(rand.Reader, s2kConfig) +// encrypt encrypts an unencrypted private key. +func (pk *PrivateKey) encrypt(key []byte, params *s2k.Params, cipherFunction CipherFunction) error { + if pk.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + if pk.Encrypted { + return nil + } + // check if encryptionKey has the correct size + if len(key) != cipherFunction.KeySize() { + return errors.InvalidArgumentError("supplied encryption key has the wrong size") + } + + priv := bytes.NewBuffer(nil) + err := pk.serializePrivateKey(priv) if err != nil { return err } - privateKeyBytes := priv.Bytes() - key := make([]byte, pk.cipher.KeySize()) - pk.sha1Checksum = true + pk.cipher = cipherFunction + pk.s2kParams = params pk.s2k, err = pk.s2kParams.Function() if err != nil { return err - } - pk.s2k(key, passphrase) + } + + privateKeyBytes := priv.Bytes() + pk.sha1Checksum = true block := pk.cipher.new(key) pk.iv = make([]byte, pk.cipher.blockSize()) _, err = rand.Read(pk.iv) @@ -486,6 +531,62 @@ func (pk *PrivateKey) Encrypt(passphrase []byte) error { return err } +// EncryptWithConfig encrypts an unencrypted private key using the passphrase and the config. +func (pk *PrivateKey) EncryptWithConfig(passphrase []byte, config *Config) error { + params, err := s2k.Generate(config.Random(), config.S2K()) + if err != nil { + return err + } + // Derive an encryption key with the configured s2k function. + key := make([]byte, config.Cipher().KeySize()) + s2k, err := params.Function() + if err != nil { + return err + } + s2k(key, passphrase) + // Encrypt the private key with the derived encryption key. + return pk.encrypt(key, params, config.Cipher()) +} + +// EncryptPrivateKeys encrypts all unencrypted keys with the given config and passphrase. +// Only derives one key from the passphrase, which is then used to encrypt each key. +func EncryptPrivateKeys(keys []*PrivateKey, passphrase []byte, config *Config) error { + params, err := s2k.Generate(config.Random(), config.S2K()) + if err != nil { + return err + } + // Derive an encryption key with the configured s2k function. + encryptionKey := make([]byte, config.Cipher().KeySize()) + s2k, err := params.Function() + if err != nil { + return err + } + s2k(encryptionKey, passphrase) + for _, key := range keys { + if key != nil && !key.Dummy() && !key.Encrypted { + err = key.encrypt(encryptionKey, params, config.Cipher()) + if err != nil { + return err + } + } + } + return nil +} + +// Encrypt encrypts an unencrypted private key using a passphrase. +func (pk *PrivateKey) Encrypt(passphrase []byte) error { + // Default config of private key encryption + config := &Config{ + S2KConfig: &s2k.Config{ + S2KMode: s2k.IteratedSaltedS2K, + S2KCount: 65536, + Hash: crypto.SHA256, + } , + DefaultCipher: CipherAES256, + } + return pk.EncryptWithConfig(passphrase, config) +} + func (pk *PrivateKey) serializePrivateKey(w io.Writer) (err error) { switch priv := pk.PrivateKey.(type) { case *rsa.PrivateKey: diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go index e0f5f74a93..ec903ee95a 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go @@ -596,7 +596,7 @@ func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err erro } signed.Write(sig.HashSuffix) hashBytes := signed.Sum(nil) - if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { + if sig.Version == 5 && (hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1]) { return errors.SignatureError("hash tag doesn't match") } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go index 6d2a61cebc..6c58c86fa8 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go @@ -17,8 +17,8 @@ import ( "github.com/ProtonMail/go-crypto/openpgp/ecdsa" "github.com/ProtonMail/go-crypto/openpgp/eddsa" "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" - "github.com/ProtonMail/go-crypto/openpgp/s2k" ) const ( @@ -66,11 +66,24 @@ type Signature struct { SigLifetimeSecs, KeyLifetimeSecs *uint32 PreferredSymmetric, PreferredHash, PreferredCompression []uint8 - PreferredAEAD []uint8 + PreferredCipherSuites [][2]uint8 IssuerKeyId *uint64 IssuerFingerprint []byte SignerUserId *string IsPrimaryId *bool + Notations []*Notation + + // TrustLevel and TrustAmount can be set by the signer to assert that + // the key is not only valid but also trustworthy at the specified + // level. + // See RFC 4880, section 5.2.3.13 for details. + TrustLevel TrustLevel + TrustAmount TrustAmount + + // TrustRegularExpression can be used in conjunction with trust Signature + // packets to limit the scope of the trust that is extended. + // See RFC 4880, section 5.2.3.14 for details. + TrustRegularExpression *string // PolicyURI can be set to the URI of a document that describes the // policy under which the signature was issued. See RFC 4880, section @@ -89,8 +102,8 @@ type Signature struct { // In a self-signature, these flags are set there is a features subpacket // indicating that the issuer implementation supports these features - // (section 5.2.5.25). - MDC, AEAD, V5Keys bool + // see https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh#features-subpacket + SEIPDv1, SEIPDv2 bool // EmbeddedSignature, if non-nil, is a signature of the parent key, by // this key. This prevents an attacker from claiming another's signing @@ -126,7 +139,13 @@ func (sig *Signature) parse(r io.Reader) (err error) { } var ok bool - sig.Hash, ok = s2k.HashIdToHash(buf[2]) + + if sig.Version < 5 { + sig.Hash, ok = algorithm.HashIdToHashWithSha1(buf[2]) + } else { + sig.Hash, ok = algorithm.HashIdToHash(buf[2]) + } + if !ok { return errors.UnsupportedError("hash function " + strconv.Itoa(int(buf[2]))) } @@ -137,7 +156,11 @@ func (sig *Signature) parse(r io.Reader) (err error) { if err != nil { return } - sig.buildHashSuffix(hashedSubpackets) + err = sig.buildHashSuffix(hashedSubpackets) + if err != nil { + return + } + err = parseSignatureSubpackets(sig, hashedSubpackets, true) if err != nil { return @@ -221,9 +244,12 @@ type signatureSubpacketType uint8 const ( creationTimeSubpacket signatureSubpacketType = 2 signatureExpirationSubpacket signatureSubpacketType = 3 + trustSubpacket signatureSubpacketType = 5 + regularExpressionSubpacket signatureSubpacketType = 6 keyExpirationSubpacket signatureSubpacketType = 9 prefSymmetricAlgosSubpacket signatureSubpacketType = 11 issuerSubpacket signatureSubpacketType = 16 + notationDataSubpacket signatureSubpacketType = 20 prefHashAlgosSubpacket signatureSubpacketType = 21 prefCompressionSubpacket signatureSubpacketType = 22 primaryUserIdSubpacket signatureSubpacketType = 25 @@ -234,7 +260,7 @@ const ( featuresSubpacket signatureSubpacketType = 30 embeddedSignatureSubpacket signatureSubpacketType = 32 issuerFingerprintSubpacket signatureSubpacketType = 33 - prefAeadAlgosSubpacket signatureSubpacketType = 34 + prefCipherSuitesSubpacket signatureSubpacketType = 39 ) // parseSignatureSubpacket parses a single subpacket. len(subpacket) is >= 1. @@ -245,6 +271,10 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r packetType signatureSubpacketType isCritical bool ) + if len(subpacket) == 0 { + err = errors.StructuralError("zero length signature subpacket") + return + } switch { case subpacket[0] < 192: length = uint32(subpacket[0]) @@ -278,12 +308,14 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r isCritical = subpacket[0]&0x80 == 0x80 subpacket = subpacket[1:] sig.rawSubpackets = append(sig.rawSubpackets, outputSubpacket{isHashed, packetType, isCritical, subpacket}) + if !isHashed && + packetType != issuerSubpacket && + packetType != issuerFingerprintSubpacket && + packetType != embeddedSignatureSubpacket { + return + } switch packetType { case creationTimeSubpacket: - if !isHashed { - err = errors.StructuralError("signature creation time in non-hashed area") - return - } if len(subpacket) != 4 { err = errors.StructuralError("signature creation time not four bytes") return @@ -292,20 +324,35 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r sig.CreationTime = time.Unix(int64(t), 0) case signatureExpirationSubpacket: // Signature expiration time, section 5.2.3.10 - if !isHashed { - return - } if len(subpacket) != 4 { err = errors.StructuralError("expiration subpacket with bad length") return } sig.SigLifetimeSecs = new(uint32) *sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket) - case keyExpirationSubpacket: - // Key expiration time, section 5.2.3.6 - if !isHashed { + case trustSubpacket: + if len(subpacket) != 2 { + err = errors.StructuralError("trust subpacket with bad length") + return + } + // Trust level and amount, section 5.2.3.13 + sig.TrustLevel = TrustLevel(subpacket[0]) + sig.TrustAmount = TrustAmount(subpacket[1]) + case regularExpressionSubpacket: + if len(subpacket) == 0 { + err = errors.StructuralError("regexp subpacket with bad length") + return + } + // Trust regular expression, section 5.2.3.14 + // RFC specifies the string should be null-terminated; remove a null byte from the end + if subpacket[len(subpacket)-1] != 0x00 { + err = errors.StructuralError("expected regular expression to be null-terminated") return } + trustRegularExpression := string(subpacket[:len(subpacket)-1]) + sig.TrustRegularExpression = &trustRegularExpression + case keyExpirationSubpacket: + // Key expiration time, section 5.2.3.6 if len(subpacket) != 4 { err = errors.StructuralError("key expiration subpacket with bad length") return @@ -314,41 +361,52 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r *sig.KeyLifetimeSecs = binary.BigEndian.Uint32(subpacket) case prefSymmetricAlgosSubpacket: // Preferred symmetric algorithms, section 5.2.3.7 - if !isHashed { - return - } sig.PreferredSymmetric = make([]byte, len(subpacket)) copy(sig.PreferredSymmetric, subpacket) case issuerSubpacket: + // Issuer, section 5.2.3.5 if sig.Version > 4 { err = errors.StructuralError("issuer subpacket found in v5 key") + return } - // Issuer, section 5.2.3.5 if len(subpacket) != 8 { err = errors.StructuralError("issuer subpacket with bad length") return } sig.IssuerKeyId = new(uint64) *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket) - case prefHashAlgosSubpacket: - // Preferred hash algorithms, section 5.2.3.8 - if !isHashed { + case notationDataSubpacket: + // Notation data, section 5.2.3.16 + if len(subpacket) < 8 { + err = errors.StructuralError("notation data subpacket with bad length") return } + + nameLength := uint32(subpacket[4])<<8 | uint32(subpacket[5]) + valueLength := uint32(subpacket[6])<<8 | uint32(subpacket[7]) + if len(subpacket) != int(nameLength)+int(valueLength)+8 { + err = errors.StructuralError("notation data subpacket with bad length") + return + } + + notation := Notation{ + IsHumanReadable: (subpacket[0] & 0x80) == 0x80, + Name: string(subpacket[8:(nameLength + 8)]), + Value: subpacket[(nameLength + 8):(valueLength + nameLength + 8)], + IsCritical: isCritical, + } + + sig.Notations = append(sig.Notations, ¬ation) + case prefHashAlgosSubpacket: + // Preferred hash algorithms, section 5.2.3.8 sig.PreferredHash = make([]byte, len(subpacket)) copy(sig.PreferredHash, subpacket) case prefCompressionSubpacket: // Preferred compression algorithms, section 5.2.3.9 - if !isHashed { - return - } sig.PreferredCompression = make([]byte, len(subpacket)) copy(sig.PreferredCompression, subpacket) case primaryUserIdSubpacket: // Primary User ID, section 5.2.3.19 - if !isHashed { - return - } if len(subpacket) != 1 { err = errors.StructuralError("primary user id subpacket with bad length") return @@ -359,9 +417,6 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r } case keyFlagsSubpacket: // Key flags, section 5.2.3.21 - if !isHashed { - return - } if len(subpacket) == 0 { err = errors.StructuralError("empty key flags subpacket") return @@ -393,9 +448,6 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r sig.SignerUserId = &userId case reasonForRevocationSubpacket: // Reason For Revocation, section 5.2.3.23 - if !isHashed { - return - } if len(subpacket) == 0 { err = errors.StructuralError("empty revocation reason subpacket") return @@ -407,18 +459,13 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r // Features subpacket, section 5.2.3.24 specifies a very general // mechanism for OpenPGP implementations to signal support for new // features. - if !isHashed { - return - } if len(subpacket) > 0 { if subpacket[0]&0x01 != 0 { - sig.MDC = true - } - if subpacket[0]&0x02 != 0 { - sig.AEAD = true + sig.SEIPDv1 = true } - if subpacket[0]&0x04 != 0 { - sig.V5Keys = true + // 0x02 and 0x04 are reserved + if subpacket[0]&0x08 != 0 { + sig.SEIPDv2 = true } } case embeddedSignatureSubpacket: @@ -441,11 +488,12 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r } case policyUriSubpacket: // Policy URI, section 5.2.3.20 - if !isHashed { - return - } sig.PolicyURI = string(subpacket) case issuerFingerprintSubpacket: + if len(subpacket) == 0 { + err = errors.StructuralError("empty issuer fingerprint subpacket") + return + } v, l := subpacket[0], len(subpacket[1:]) if v == 5 && l != 32 || v != 5 && l != 20 { return nil, errors.StructuralError("bad fingerprint length") @@ -458,13 +506,19 @@ func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (r } else { *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket[13:21]) } - case prefAeadAlgosSubpacket: - // Preferred symmetric algorithms, section 5.2.3.8 - if !isHashed { + case prefCipherSuitesSubpacket: + // Preferred AEAD cipher suites + // See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#name-preferred-aead-ciphersuites + if len(subpacket)%2 != 0 { + err = errors.StructuralError("invalid aead cipher suite length") return } - sig.PreferredAEAD = make([]byte, len(subpacket)) - copy(sig.PreferredAEAD, subpacket) + + sig.PreferredCipherSuites = make([][2]byte, len(subpacket)/2) + + for i := 0; i < len(subpacket)/2; i++ { + sig.PreferredCipherSuites[i] = [2]uint8{subpacket[2*i], subpacket[2*i+1]} + } default: if isCritical { err = errors.UnsupportedError("unknown critical signature subpacket type " + strconv.Itoa(int(packetType))) @@ -562,7 +616,15 @@ func (sig *Signature) SigExpired(currentTime time.Time) bool { // buildHashSuffix constructs the HashSuffix member of sig in preparation for signing. func (sig *Signature) buildHashSuffix(hashedSubpackets []byte) (err error) { - hash, ok := s2k.HashToHashId(sig.Hash) + var hashId byte + var ok bool + + if sig.Version < 5 { + hashId, ok = algorithm.HashToHashIdWithSha1(sig.Hash) + } else { + hashId, ok = algorithm.HashToHashId(sig.Hash) + } + if !ok { sig.HashSuffix = nil return errors.InvalidArgumentError("hash cannot be represented in OpenPGP: " + strconv.Itoa(int(sig.Hash))) @@ -572,7 +634,7 @@ func (sig *Signature) buildHashSuffix(hashedSubpackets []byte) (err error) { uint8(sig.Version), uint8(sig.SigType), uint8(sig.PubKeyAlgo), - uint8(hash), + uint8(hashId), uint8(len(hashedSubpackets) >> 8), uint8(len(hashedSubpackets)), }) @@ -885,23 +947,40 @@ func (sig *Signature) buildSubpackets(issuer PublicKey) (subpackets []outputSubp subpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, false, []byte{flags}}) } + for _, notation := range sig.Notations { + subpackets = append( + subpackets, + outputSubpacket{ + true, + notationDataSubpacket, + notation.IsCritical, + notation.getData(), + }) + } + // The following subpackets may only appear in self-signatures. var features = byte(0x00) - if sig.MDC { + if sig.SEIPDv1 { features |= 0x01 } - if sig.AEAD { - features |= 0x02 - } - if sig.V5Keys { - features |= 0x04 + if sig.SEIPDv2 { + features |= 0x08 } if features != 0x00 { subpackets = append(subpackets, outputSubpacket{true, featuresSubpacket, false, []byte{features}}) } + if sig.TrustLevel != 0 { + subpackets = append(subpackets, outputSubpacket{true, trustSubpacket, true, []byte{byte(sig.TrustLevel), byte(sig.TrustAmount)}}) + } + + if sig.TrustRegularExpression != nil { + // RFC specifies the string should be null-terminated; add a null byte to the end + subpackets = append(subpackets, outputSubpacket{true, regularExpressionSubpacket, true, []byte(*sig.TrustRegularExpression + "\000")}) + } + if sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 { keyLifetime := make([]byte, 4) binary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs) @@ -928,8 +1007,13 @@ func (sig *Signature) buildSubpackets(issuer PublicKey) (subpackets []outputSubp subpackets = append(subpackets, outputSubpacket{true, policyUriSubpacket, false, []uint8(sig.PolicyURI)}) } - if len(sig.PreferredAEAD) > 0 { - subpackets = append(subpackets, outputSubpacket{true, prefAeadAlgosSubpacket, false, sig.PreferredAEAD}) + if len(sig.PreferredCipherSuites) > 0 { + serialized := make([]byte, len(sig.PreferredCipherSuites)*2) + for i, cipherSuite := range sig.PreferredCipherSuites { + serialized[2*i] = cipherSuite[0] + serialized[2*i+1] = cipherSuite[1] + } + subpackets = append(subpackets, outputSubpacket{true, prefCipherSuitesSubpacket, false, serialized}) } // Revocation reason appears only in revocation signatures and is serialized as per section 5.2.3.23. @@ -971,7 +1055,7 @@ func (sig *Signature) AddMetadataToHashSuffix() { n := sig.HashSuffix[len(sig.HashSuffix)-8:] l := uint64( uint64(n[0])<<56 | uint64(n[1])<<48 | uint64(n[2])<<40 | uint64(n[3])<<32 | - uint64(n[4])<<24 | uint64(n[5])<<16 | uint64(n[6])<<8 | uint64(n[7])) + uint64(n[4])<<24 | uint64(n[5])<<16 | uint64(n[6])<<8 | uint64(n[7])) suffix := bytes.NewBuffer(nil) suffix.Write(sig.HashSuffix[:l]) diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go index d5b6a87fe5..a8abf2ff7c 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go @@ -7,15 +7,17 @@ package packet import ( "bytes" "crypto/cipher" + "crypto/sha256" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/s2k" + "golang.org/x/crypto/hkdf" ) -// This is the largest session key that we'll support. Since no 512-bit cipher -// has even been seriously used, this is comfortably large. +// This is the largest session key that we'll support. Since at most 256-bit cipher +// is supported in OpenPGP, this is large enough to contain also the auth tag. const maxSessionKeySizeInBytes = 64 // SymmetricKeyEncrypted represents a passphrase protected session key. See RFC @@ -25,13 +27,16 @@ type SymmetricKeyEncrypted struct { CipherFunc CipherFunction Mode AEADMode s2k func(out, in []byte) - aeadNonce []byte - encryptedKey []byte + iv []byte + encryptedKey []byte // Contains also the authentication tag for AEAD } +// parse parses an SymmetricKeyEncrypted packet as specified in +// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#name-symmetric-key-encrypted-ses func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { - // RFC 4880, section 5.3. - var buf [2]byte + var buf [1]byte + + // Version if _, err := readFull(r, buf[:]); err != nil { return err } @@ -39,17 +44,34 @@ func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { if ske.Version != 4 && ske.Version != 5 { return errors.UnsupportedError("unknown SymmetricKeyEncrypted version") } - ske.CipherFunc = CipherFunction(buf[1]) - if ske.CipherFunc.KeySize() == 0 { - return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(buf[1]))) + + if ske.Version == 5 { + // Scalar octet count + if _, err := readFull(r, buf[:]); err != nil { + return err + } + } + + // Cipher function + if _, err := readFull(r, buf[:]); err != nil { + return err + } + ske.CipherFunc = CipherFunction(buf[0]) + if !ske.CipherFunc.IsSupported() { + return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(buf[0]))) } if ske.Version == 5 { - mode := make([]byte, 1) - if _, err := r.Read(mode); err != nil { + // AEAD mode + if _, err := readFull(r, buf[:]); err != nil { return errors.StructuralError("cannot read AEAD octet from packet") } - ske.Mode = AEADMode(mode[0]) + ske.Mode = AEADMode(buf[0]) + + // Scalar octet count + if _, err := readFull(r, buf[:]); err != nil { + return err + } } var err error @@ -61,13 +83,14 @@ func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { } if ske.Version == 5 { - // AEAD nonce - nonce := make([]byte, ske.Mode.NonceLength()) - _, err := readFull(r, nonce) - if err != nil && err != io.ErrUnexpectedEOF { - return err + // AEAD IV + iv := make([]byte, ske.Mode.IvLength()) + _, err := readFull(r, iv) + if err != nil { + return errors.StructuralError("cannot read AEAD IV") } - ske.aeadNonce = nonce + + ske.iv = iv } encryptedKey := make([]byte, maxSessionKeySizeInBytes) @@ -128,11 +151,10 @@ func (ske *SymmetricKeyEncrypted) decryptV4(key []byte) ([]byte, CipherFunction, } func (ske *SymmetricKeyEncrypted) decryptV5(key []byte) ([]byte, error) { - blockCipher := CipherFunction(ske.CipherFunc).new(key) - aead := ske.Mode.new(blockCipher) - adata := []byte{0xc3, byte(5), byte(ske.CipherFunc), byte(ske.Mode)} - plaintextKey, err := aead.Open(nil, ske.aeadNonce, ske.encryptedKey, adata) + aead := getEncryptedKeyAeadInstance(ske.CipherFunc, ske.Mode, key, adata) + + plaintextKey, err := aead.Open(nil, ske.iv, ske.encryptedKey, adata) if err != nil { return nil, err } @@ -142,17 +164,12 @@ func (ske *SymmetricKeyEncrypted) decryptV5(key []byte) ([]byte, error) { // SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w. // The packet contains a random session key, encrypted by a key derived from // the given passphrase. The session key is returned and must be passed to -// SerializeSymmetricallyEncrypted or SerializeAEADEncrypted, depending on -// whether config.AEADConfig != nil. +// SerializeSymmetricallyEncrypted. // If config is nil, sensible defaults will be used. func SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Config) (key []byte, err error) { cipherFunc := config.Cipher() - keySize := cipherFunc.KeySize() - if keySize == 0 { - return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) - } - sessionKey := make([]byte, keySize) + sessionKey := make([]byte, cipherFunc.KeySize()) _, err = io.ReadFull(config.Random(), sessionKey) if err != nil { return @@ -169,9 +186,8 @@ func SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Conf // SerializeSymmetricKeyEncryptedReuseKey serializes a symmetric key packet to w. // The packet contains the given session key, encrypted by a key derived from -// the given passphrase. The session key must be passed to -// SerializeSymmetricallyEncrypted or SerializeAEADEncrypted, depending on -// whether config.AEADConfig != nil. +// the given passphrase. The returned session key must be passed to +// SerializeSymmetricallyEncrypted. // If config is nil, sensible defaults will be used. func SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, passphrase []byte, config *Config) (err error) { var version int @@ -181,16 +197,17 @@ func SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, pass version = 4 } cipherFunc := config.Cipher() - keySize := cipherFunc.KeySize() - if keySize == 0 { - return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) + // cipherFunc must be AES + if !cipherFunc.IsSupported() || cipherFunc < CipherAES128 || cipherFunc > CipherAES256 { + return errors.UnsupportedError("unsupported cipher: " + strconv.Itoa(int(cipherFunc))) } + keySize := cipherFunc.KeySize() s2kBuf := new(bytes.Buffer) keyEncryptingKey := make([]byte, keySize) // s2k.Serialize salts and stretches the passphrase, and writes the // resulting key to keyEncryptingKey and the s2k descriptor to s2kBuf. - err = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, &s2k.Config{Hash: config.Hash(), S2KCount: config.PasswordHashIterations()}) + err = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, config.S2K()) if err != nil { return } @@ -201,24 +218,32 @@ func SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, pass case 4: packetLength = 2 /* header */ + len(s2kBytes) + 1 /* cipher type */ + keySize case 5: - nonceLen := config.AEAD().Mode().NonceLength() + ivLen := config.AEAD().Mode().IvLength() tagLen := config.AEAD().Mode().TagLength() - packetLength = 3 + len(s2kBytes) + nonceLen + keySize + tagLen + packetLength = 5 + len(s2kBytes) + ivLen + keySize + tagLen } err = serializeHeader(w, packetTypeSymmetricKeyEncrypted, packetLength) if err != nil { return } - buf := make([]byte, 2) // Symmetric Key Encrypted Version - buf[0] = byte(version) + buf := []byte{byte(version)} + + if version == 5 { + // Scalar octet count + buf = append(buf, byte(3+len(s2kBytes)+config.AEAD().Mode().IvLength())) + } + // Cipher function - buf[1] = byte(cipherFunc) + buf = append(buf, byte(cipherFunc)) if version == 5 { // AEAD mode buf = append(buf, byte(config.AEAD().Mode())) + + // Scalar octet count + buf = append(buf, byte(len(s2kBytes))) } _, err = w.Write(buf) if err != nil { @@ -241,19 +266,20 @@ func SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, pass return } case 5: - blockCipher := cipherFunc.new(keyEncryptingKey) mode := config.AEAD().Mode() - aead := mode.new(blockCipher) - // Sample nonce using random reader - nonce := make([]byte, config.AEAD().Mode().NonceLength()) - _, err = io.ReadFull(config.Random(), nonce) + adata := []byte{0xc3, byte(5), byte(cipherFunc), byte(mode)} + aead := getEncryptedKeyAeadInstance(cipherFunc, mode, keyEncryptingKey, adata) + + // Sample iv using random reader + iv := make([]byte, config.AEAD().Mode().IvLength()) + _, err = io.ReadFull(config.Random(), iv) if err != nil { return } // Seal and write (encryptedData includes auth. tag) - adata := []byte{0xc3, byte(5), byte(cipherFunc), byte(mode)} - encryptedData := aead.Seal(nil, nonce, sessionKey, adata) - _, err = w.Write(nonce) + + encryptedData := aead.Seal(nil, iv, sessionKey, adata) + _, err = w.Write(iv) if err != nil { return } @@ -265,3 +291,13 @@ func SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, pass return } + +func getEncryptedKeyAeadInstance(c CipherFunction, mode AEADMode, inputKey, associatedData []byte) (aead cipher.AEAD) { + hkdfReader := hkdf.New(sha256.New, inputKey, []byte{}, associatedData) + + encryptionKey := make([]byte, c.KeySize()) + _, _ = readFull(hkdfReader, encryptionKey) + + blockCipher := c.new(encryptionKey) + return mode.new(blockCipher) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go index 8b84de177f..609e9fc1fb 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go @@ -5,36 +5,54 @@ package packet import ( - "crypto/cipher" - "crypto/sha1" - "crypto/subtle" - "hash" "io" - "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" ) +const aeadSaltSize = 32 + // SymmetricallyEncrypted represents a symmetrically encrypted byte string. The // encrypted Contents will consist of more OpenPGP packets. See RFC 4880, // sections 5.7 and 5.13. type SymmetricallyEncrypted struct { - MDC bool // true iff this is a type 18 packet and thus has an embedded MAC. - Contents io.Reader - prefix []byte + Version int + Contents io.Reader // contains tag for version 2 + IntegrityProtected bool // If true it is type 18 (with MDC or AEAD). False is packet type 9 + + // Specific to version 1 + prefix []byte + + // Specific to version 2 + cipher CipherFunction + mode AEADMode + chunkSizeByte byte + salt [aeadSaltSize]byte } -const symmetricallyEncryptedVersion = 1 +const ( + symmetricallyEncryptedVersionMdc = 1 + symmetricallyEncryptedVersionAead = 2 +) func (se *SymmetricallyEncrypted) parse(r io.Reader) error { - if se.MDC { + if se.IntegrityProtected { // See RFC 4880, section 5.13. var buf [1]byte _, err := readFull(r, buf[:]) if err != nil { return err } - if buf[0] != symmetricallyEncryptedVersion { + + switch buf[0] { + case symmetricallyEncryptedVersionMdc: + se.Version = symmetricallyEncryptedVersionMdc + case symmetricallyEncryptedVersionAead: + se.Version = symmetricallyEncryptedVersionAead + if err := se.parseAead(r); err != nil { + return err + } + default: return errors.UnsupportedError("unknown SymmetricallyEncrypted version") } } @@ -46,245 +64,27 @@ func (se *SymmetricallyEncrypted) parse(r io.Reader) error { // packet can be read. An incorrect key will only be detected after trying // to decrypt the entire data. func (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) { - keySize := c.KeySize() - if keySize == 0 { - return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(c))) - } - if len(key) != keySize { - return nil, errors.InvalidArgumentError("SymmetricallyEncrypted: incorrect key length") - } - - if se.prefix == nil { - se.prefix = make([]byte, c.blockSize()+2) - _, err := readFull(se.Contents, se.prefix) - if err != nil { - return nil, err - } - } else if len(se.prefix) != c.blockSize()+2 { - return nil, errors.InvalidArgumentError("can't try ciphers with different block lengths") + if se.Version == symmetricallyEncryptedVersionAead { + return se.decryptAead(key) } - ocfbResync := OCFBResync - if se.MDC { - // MDC packets use a different form of OCFB mode. - ocfbResync = OCFBNoResync - } - - s := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync) - - plaintext := cipher.StreamReader{S: s, R: se.Contents} - - if se.MDC { - // MDC packets have an embedded hash that we need to check. - h := sha1.New() - h.Write(se.prefix) - return &seMDCReader{in: plaintext, h: h}, nil - } - - // Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser. - return seReader{plaintext}, nil -} - -// seReader wraps an io.Reader with a no-op Close method. -type seReader struct { - in io.Reader -} - -func (ser seReader) Read(buf []byte) (int, error) { - return ser.in.Read(buf) -} - -func (ser seReader) Close() error { - return nil -} - -const mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size - -// An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold -// of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an -// MDC packet containing a hash of the previous Contents which is checked -// against the running hash. See RFC 4880, section 5.13. -type seMDCReader struct { - in io.Reader - h hash.Hash - trailer [mdcTrailerSize]byte - scratch [mdcTrailerSize]byte - trailerUsed int - error bool - eof bool -} - -func (ser *seMDCReader) Read(buf []byte) (n int, err error) { - if ser.error { - err = io.ErrUnexpectedEOF - return - } - if ser.eof { - err = io.EOF - return - } - - // If we haven't yet filled the trailer buffer then we must do that - // first. - for ser.trailerUsed < mdcTrailerSize { - n, err = ser.in.Read(ser.trailer[ser.trailerUsed:]) - ser.trailerUsed += n - if err == io.EOF { - if ser.trailerUsed != mdcTrailerSize { - n = 0 - err = io.ErrUnexpectedEOF - ser.error = true - return - } - ser.eof = true - n = 0 - return - } - - if err != nil { - n = 0 - return - } - } - - // If it's a short read then we read into a temporary buffer and shift - // the data into the caller's buffer. - if len(buf) <= mdcTrailerSize { - n, err = readFull(ser.in, ser.scratch[:len(buf)]) - copy(buf, ser.trailer[:n]) - ser.h.Write(buf[:n]) - copy(ser.trailer[:], ser.trailer[n:]) - copy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:]) - if n < len(buf) { - ser.eof = true - err = io.EOF - } - return - } - - n, err = ser.in.Read(buf[mdcTrailerSize:]) - copy(buf, ser.trailer[:]) - ser.h.Write(buf[:n]) - copy(ser.trailer[:], buf[n:]) - - if err == io.EOF { - ser.eof = true - } - return -} - -// This is a new-format packet tag byte for a type 19 (MDC) packet. -const mdcPacketTagByte = byte(0x80) | 0x40 | 19 - -func (ser *seMDCReader) Close() error { - if ser.error { - return errors.ErrMDCMissing - } - - for !ser.eof { - // We haven't seen EOF so we need to read to the end - var buf [1024]byte - _, err := ser.Read(buf[:]) - if err == io.EOF { - break - } - if err != nil { - return errors.ErrMDCMissing - } - } - - ser.h.Write(ser.trailer[:2]) - - final := ser.h.Sum(nil) - if subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 { - return errors.ErrMDCHashMismatch - } - // The hash already includes the MDC header, but we still check its value - // to confirm encryption correctness - if ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size { - return errors.ErrMDCMissing - } - return nil -} - -// An seMDCWriter writes through to an io.WriteCloser while maintains a running -// hash of the data written. On close, it emits an MDC packet containing the -// running hash. -type seMDCWriter struct { - w io.WriteCloser - h hash.Hash -} - -func (w *seMDCWriter) Write(buf []byte) (n int, err error) { - w.h.Write(buf) - return w.w.Write(buf) -} - -func (w *seMDCWriter) Close() (err error) { - var buf [mdcTrailerSize]byte - - buf[0] = mdcPacketTagByte - buf[1] = sha1.Size - w.h.Write(buf[:2]) - digest := w.h.Sum(nil) - copy(buf[2:], digest) - - _, err = w.w.Write(buf[:]) - if err != nil { - return - } - return w.w.Close() -} - -// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. -type noOpCloser struct { - w io.Writer -} - -func (c noOpCloser) Write(data []byte) (n int, err error) { - return c.w.Write(data) -} - -func (c noOpCloser) Close() error { - return nil + return se.decryptMdc(c, key) } // SerializeSymmetricallyEncrypted serializes a symmetrically encrypted packet // to w and returns a WriteCloser to which the to-be-encrypted packets can be // written. // If config is nil, sensible defaults will be used. -func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte, config *Config) (Contents io.WriteCloser, err error) { - if c.KeySize() != len(key) { - return nil, errors.InvalidArgumentError("SymmetricallyEncrypted.Serialize: bad key length") - } +func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, aeadSupported bool, cipherSuite CipherSuite, key []byte, config *Config) (Contents io.WriteCloser, err error) { writeCloser := noOpCloser{w} - ciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedMDC) - if err != nil { - return - } - - _, err = ciphertext.Write([]byte{symmetricallyEncryptedVersion}) + ciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedIntegrityProtected) if err != nil { return } - block := c.new(key) - blockSize := block.BlockSize() - iv := make([]byte, blockSize) - _, err = config.Random().Read(iv) - if err != nil { - return - } - s, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync) - _, err = ciphertext.Write(prefix) - if err != nil { - return + if aeadSupported { + return serializeSymmetricallyEncryptedAead(ciphertext, cipherSuite, config.AEADConfig.ChunkSizeByte(), config.Random(), key) } - plaintext := cipher.StreamWriter{S: s, W: ciphertext} - h := sha1.New() - h.Write(iv) - h.Write(iv[blockSize-2:]) - Contents = &seMDCWriter{w: plaintext, h: h} - return + return serializeSymmetricallyEncryptedMdc(ciphertext, c, key, config) } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_aead.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_aead.go new file mode 100644 index 0000000000..969c422369 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_aead.go @@ -0,0 +1,155 @@ +// Copyright 2023 Proton AG. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "crypto/cipher" + "crypto/sha256" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "golang.org/x/crypto/hkdf" + "io" +) + +// parseAead parses a V2 SEIPD packet (AEAD) as specified in +// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 +func (se *SymmetricallyEncrypted) parseAead(r io.Reader) error { + headerData := make([]byte, 3) + if n, err := io.ReadFull(r, headerData); n < 3 { + return errors.StructuralError("could not read aead header: " + err.Error()) + } + + // Cipher + se.cipher = CipherFunction(headerData[0]) + // cipherFunc must have block size 16 to use AEAD + if se.cipher.blockSize() != 16 { + return errors.UnsupportedError("invalid aead cipher: " + string(se.cipher)) + } + + // Mode + se.mode = AEADMode(headerData[1]) + if se.mode.TagLength() == 0 { + return errors.UnsupportedError("unknown aead mode: " + string(se.mode)) + } + + // Chunk size + se.chunkSizeByte = headerData[2] + if se.chunkSizeByte > 16 { + return errors.UnsupportedError("invalid aead chunk size byte: " + string(se.chunkSizeByte)) + } + + // Salt + if n, err := io.ReadFull(r, se.salt[:]); n < aeadSaltSize { + return errors.StructuralError("could not read aead salt: " + err.Error()) + } + + return nil +} + +// associatedData for chunks: tag, version, cipher, mode, chunk size byte +func (se *SymmetricallyEncrypted) associatedData() []byte { + return []byte{ + 0xD2, + symmetricallyEncryptedVersionAead, + byte(se.cipher), + byte(se.mode), + se.chunkSizeByte, + } +} + +// decryptAead decrypts a V2 SEIPD packet (AEAD) as specified in +// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 +func (se *SymmetricallyEncrypted) decryptAead(inputKey []byte) (io.ReadCloser, error) { + aead, nonce := getSymmetricallyEncryptedAeadInstance(se.cipher, se.mode, inputKey, se.salt[:], se.associatedData()) + + // Carry the first tagLen bytes + tagLen := se.mode.TagLength() + peekedBytes := make([]byte, tagLen) + n, err := io.ReadFull(se.Contents, peekedBytes) + if n < tagLen || (err != nil && err != io.EOF) { + return nil, errors.StructuralError("not enough data to decrypt:" + err.Error()) + } + + return &aeadDecrypter{ + aeadCrypter: aeadCrypter{ + aead: aead, + chunkSize: decodeAEADChunkSize(se.chunkSizeByte), + initialNonce: nonce, + associatedData: se.associatedData(), + chunkIndex: make([]byte, 8), + packetTag: packetTypeSymmetricallyEncryptedIntegrityProtected, + }, + reader: se.Contents, + peekedBytes: peekedBytes, + }, nil +} + +// serializeSymmetricallyEncryptedAead encrypts to a writer a V2 SEIPD packet (AEAD) as specified in +// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 +func serializeSymmetricallyEncryptedAead(ciphertext io.WriteCloser, cipherSuite CipherSuite, chunkSizeByte byte, rand io.Reader, inputKey []byte) (Contents io.WriteCloser, err error) { + // cipherFunc must have block size 16 to use AEAD + if cipherSuite.Cipher.blockSize() != 16 { + return nil, errors.InvalidArgumentError("invalid aead cipher function") + } + + if cipherSuite.Cipher.KeySize() != len(inputKey) { + return nil, errors.InvalidArgumentError("error in aead serialization: bad key length") + } + + // Data for en/decryption: tag, version, cipher, aead mode, chunk size + prefix := []byte{ + 0xD2, + symmetricallyEncryptedVersionAead, + byte(cipherSuite.Cipher), + byte(cipherSuite.Mode), + chunkSizeByte, + } + + // Write header (that correspond to prefix except first byte) + n, err := ciphertext.Write(prefix[1:]) + if err != nil || n < 4 { + return nil, err + } + + // Random salt + salt := make([]byte, aeadSaltSize) + if _, err := rand.Read(salt); err != nil { + return nil, err + } + + if _, err := ciphertext.Write(salt); err != nil { + return nil, err + } + + aead, nonce := getSymmetricallyEncryptedAeadInstance(cipherSuite.Cipher, cipherSuite.Mode, inputKey, salt, prefix) + + return &aeadEncrypter{ + aeadCrypter: aeadCrypter{ + aead: aead, + chunkSize: decodeAEADChunkSize(chunkSizeByte), + associatedData: prefix, + chunkIndex: make([]byte, 8), + initialNonce: nonce, + packetTag: packetTypeSymmetricallyEncryptedIntegrityProtected, + }, + writer: ciphertext, + }, nil +} + +func getSymmetricallyEncryptedAeadInstance(c CipherFunction, mode AEADMode, inputKey, salt, associatedData []byte) (aead cipher.AEAD, nonce []byte) { + hkdfReader := hkdf.New(sha256.New, inputKey, salt, associatedData) + + encryptionKey := make([]byte, c.KeySize()) + _, _ = readFull(hkdfReader, encryptionKey) + + // Last 64 bits of nonce are the counter + nonce = make([]byte, mode.IvLength()-8) + + _, _ = readFull(hkdfReader, nonce) + + blockCipher := c.new(encryptionKey) + aead = mode.new(blockCipher) + + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_mdc.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_mdc.go new file mode 100644 index 0000000000..fa26bebe38 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_mdc.go @@ -0,0 +1,256 @@ +// Copyright 2011 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 packet + +import ( + "crypto/cipher" + "crypto/sha1" + "crypto/subtle" + "hash" + "io" + "strconv" + + "github.com/ProtonMail/go-crypto/openpgp/errors" +) + +// seMdcReader wraps an io.Reader with a no-op Close method. +type seMdcReader struct { + in io.Reader +} + +func (ser seMdcReader) Read(buf []byte) (int, error) { + return ser.in.Read(buf) +} + +func (ser seMdcReader) Close() error { + return nil +} + +func (se *SymmetricallyEncrypted) decryptMdc(c CipherFunction, key []byte) (io.ReadCloser, error) { + if !c.IsSupported() { + return nil, errors.UnsupportedError("unsupported cipher: " + strconv.Itoa(int(c))) + } + + if len(key) != c.KeySize() { + return nil, errors.InvalidArgumentError("SymmetricallyEncrypted: incorrect key length") + } + + if se.prefix == nil { + se.prefix = make([]byte, c.blockSize()+2) + _, err := readFull(se.Contents, se.prefix) + if err != nil { + return nil, err + } + } else if len(se.prefix) != c.blockSize()+2 { + return nil, errors.InvalidArgumentError("can't try ciphers with different block lengths") + } + + ocfbResync := OCFBResync + if se.IntegrityProtected { + // MDC packets use a different form of OCFB mode. + ocfbResync = OCFBNoResync + } + + s := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync) + + plaintext := cipher.StreamReader{S: s, R: se.Contents} + + if se.IntegrityProtected { + // IntegrityProtected packets have an embedded hash that we need to check. + h := sha1.New() + h.Write(se.prefix) + return &seMDCReader{in: plaintext, h: h}, nil + } + + // Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser. + return seMdcReader{plaintext}, nil +} + +const mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size + +// An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold +// of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an +// MDC packet containing a hash of the previous Contents which is checked +// against the running hash. See RFC 4880, section 5.13. +type seMDCReader struct { + in io.Reader + h hash.Hash + trailer [mdcTrailerSize]byte + scratch [mdcTrailerSize]byte + trailerUsed int + error bool + eof bool +} + +func (ser *seMDCReader) Read(buf []byte) (n int, err error) { + if ser.error { + err = io.ErrUnexpectedEOF + return + } + if ser.eof { + err = io.EOF + return + } + + // If we haven't yet filled the trailer buffer then we must do that + // first. + for ser.trailerUsed < mdcTrailerSize { + n, err = ser.in.Read(ser.trailer[ser.trailerUsed:]) + ser.trailerUsed += n + if err == io.EOF { + if ser.trailerUsed != mdcTrailerSize { + n = 0 + err = io.ErrUnexpectedEOF + ser.error = true + return + } + ser.eof = true + n = 0 + return + } + + if err != nil { + n = 0 + return + } + } + + // If it's a short read then we read into a temporary buffer and shift + // the data into the caller's buffer. + if len(buf) <= mdcTrailerSize { + n, err = readFull(ser.in, ser.scratch[:len(buf)]) + copy(buf, ser.trailer[:n]) + ser.h.Write(buf[:n]) + copy(ser.trailer[:], ser.trailer[n:]) + copy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:]) + if n < len(buf) { + ser.eof = true + err = io.EOF + } + return + } + + n, err = ser.in.Read(buf[mdcTrailerSize:]) + copy(buf, ser.trailer[:]) + ser.h.Write(buf[:n]) + copy(ser.trailer[:], buf[n:]) + + if err == io.EOF { + ser.eof = true + } + return +} + +// This is a new-format packet tag byte for a type 19 (Integrity Protected) packet. +const mdcPacketTagByte = byte(0x80) | 0x40 | 19 + +func (ser *seMDCReader) Close() error { + if ser.error { + return errors.ErrMDCMissing + } + + for !ser.eof { + // We haven't seen EOF so we need to read to the end + var buf [1024]byte + _, err := ser.Read(buf[:]) + if err == io.EOF { + break + } + if err != nil { + return errors.ErrMDCMissing + } + } + + ser.h.Write(ser.trailer[:2]) + + final := ser.h.Sum(nil) + if subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 { + return errors.ErrMDCHashMismatch + } + // The hash already includes the MDC header, but we still check its value + // to confirm encryption correctness + if ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size { + return errors.ErrMDCMissing + } + return nil +} + +// An seMDCWriter writes through to an io.WriteCloser while maintains a running +// hash of the data written. On close, it emits an MDC packet containing the +// running hash. +type seMDCWriter struct { + w io.WriteCloser + h hash.Hash +} + +func (w *seMDCWriter) Write(buf []byte) (n int, err error) { + w.h.Write(buf) + return w.w.Write(buf) +} + +func (w *seMDCWriter) Close() (err error) { + var buf [mdcTrailerSize]byte + + buf[0] = mdcPacketTagByte + buf[1] = sha1.Size + w.h.Write(buf[:2]) + digest := w.h.Sum(nil) + copy(buf[2:], digest) + + _, err = w.w.Write(buf[:]) + if err != nil { + return + } + return w.w.Close() +} + +// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. +type noOpCloser struct { + w io.Writer +} + +func (c noOpCloser) Write(data []byte) (n int, err error) { + return c.w.Write(data) +} + +func (c noOpCloser) Close() error { + return nil +} + +func serializeSymmetricallyEncryptedMdc(ciphertext io.WriteCloser, c CipherFunction, key []byte, config *Config) (Contents io.WriteCloser, err error) { + // Disallow old cipher suites + if !c.IsSupported() || c < CipherAES128 { + return nil, errors.InvalidArgumentError("invalid mdc cipher function") + } + + if c.KeySize() != len(key) { + return nil, errors.InvalidArgumentError("error in mdc serialization: bad key length") + } + + _, err = ciphertext.Write([]byte{symmetricallyEncryptedVersionMdc}) + if err != nil { + return + } + + block := c.new(key) + blockSize := block.BlockSize() + iv := make([]byte, blockSize) + _, err = config.Random().Read(iv) + if err != nil { + return + } + s, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync) + _, err = ciphertext.Write(prefix) + if err != nil { + return + } + plaintext := cipher.StreamWriter{S: s, W: ciphertext} + + h := sha1.New() + h.Write(iv) + h.Write(iv[blockSize-2:]) + Contents = &seMDCWriter{w: plaintext, h: h} + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/read.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/read.go index f9233f6d2c..8499c73790 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/read.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/read.go @@ -8,13 +8,16 @@ package openpgp // import "github.com/ProtonMail/go-crypto/openpgp" import ( "crypto" _ "crypto/sha256" + _ "crypto/sha512" "hash" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/packet" + _ "golang.org/x/crypto/sha3" ) // SignatureType is the armor type for a PGP signature. @@ -131,8 +134,8 @@ ParsePackets: } } case *packet.SymmetricallyEncrypted: - if !p.MDC && !config.AllowUnauthenticatedMessages() { - return nil, errors.UnsupportedError("message is not authenticated") + if !p.IntegrityProtected && !config.AllowUnauthenticatedMessages() { + return nil, errors.UnsupportedError("message is not integrity protected") } edp = p break ParsePackets @@ -208,13 +211,11 @@ FindKey: if len(symKeys) != 0 && passphrase != nil { for _, s := range symKeys { key, cipherFunc, err := s.Decrypt(passphrase) - // On wrong passphrase, session key decryption is very likely to result in an invalid cipherFunc: + // In v4, on wrong passphrase, session key decryption is very likely to result in an invalid cipherFunc: // only for < 5% of cases we will proceed to decrypt the data if err == nil { decrypted, err = edp.Decrypt(cipherFunc, key) - // TODO: ErrKeyIncorrect is no longer thrown on SEIP decryption, - // but it might still be relevant for when we implement AEAD decryption (otherwise, remove?) - if err != nil && err != errors.ErrKeyIncorrect { + if err != nil { return nil, err } if decrypted != nil { @@ -304,14 +305,14 @@ FindLiteralData: // should be preprocessed (i.e. to normalize line endings). Thus this function // returns two hashes. The second should be used to hash the message itself and // performs any needed preprocessing. -func hashForSignature(hashId crypto.Hash, sigType packet.SignatureType) (hash.Hash, hash.Hash, error) { - if hashId == crypto.MD5 { - return nil, nil, errors.UnsupportedError("insecure hash algorithm: MD5") +func hashForSignature(hashFunc crypto.Hash, sigType packet.SignatureType) (hash.Hash, hash.Hash, error) { + if _, ok := algorithm.HashToHashIdWithSha1(hashFunc); !ok { + return nil, nil, errors.UnsupportedError("unsupported hash function") } - if !hashId.Available() { - return nil, nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashId))) + if !hashFunc.Available() { + return nil, nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashFunc))) } - h := hashId.New() + h := hashFunc.New() switch sigType { case packet.SigTypeBinary: @@ -383,19 +384,7 @@ func (scr *signatureCheckReader) Read(buf []byte) (int, error) { key := scr.md.SignedBy signatureError := key.PublicKey.VerifySignature(scr.h, sig) if signatureError == nil { - now := scr.config.Now() - if key.Revoked(now) || - key.Entity.Revoked(now) || // primary key is revoked (redundant if key is the primary key) - key.Entity.PrimaryIdentity().Revoked(now) { - signatureError = errors.ErrKeyRevoked - } - if sig.SigExpired(now) { - signatureError = errors.ErrSignatureExpired - } - if key.PublicKey.KeyExpired(key.SelfSignature, now) || - key.SelfSignature.SigExpired(now) { - signatureError = errors.ErrKeyExpired - } + signatureError = checkSignatureDetails(key, sig, scr.config) } scr.md.Signature = sig scr.md.SignatureError = signatureError @@ -434,8 +423,24 @@ func (scr *signatureCheckReader) Read(buf []byte) (int, error) { return n, nil } +// VerifyDetachedSignature takes a signed file and a detached signature and +// returns the signature packet and the entity the signature was signed by, +// if any, and a possible signature verification error. +// If the signer isn't known, ErrUnknownIssuer is returned. +func VerifyDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) { + var expectedHashes []crypto.Hash + return verifyDetachedSignature(keyring, signed, signature, expectedHashes, config) +} + +// VerifyDetachedSignatureAndHash performs the same actions as +// VerifyDetachedSignature and checks that the expected hash functions were used. +func VerifyDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) { + return verifyDetachedSignature(keyring, signed, signature, expectedHashes, config) +} + // CheckDetachedSignature takes a signed file and a detached signature and -// returns the signer if the signature is valid. If the signer isn't known, +// returns the entity the signature was signed by, if any, and a possible +// signature verification error. If the signer isn't known, // ErrUnknownIssuer is returned. func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (signer *Entity, err error) { var expectedHashes []crypto.Hash @@ -445,6 +450,11 @@ func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader, config // CheckDetachedSignatureAndHash performs the same actions as // CheckDetachedSignature and checks that the expected hash functions were used. func CheckDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (signer *Entity, err error) { + _, signer, err = verifyDetachedSignature(keyring, signed, signature, expectedHashes, config) + return +} + +func verifyDetachedSignature(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) { var issuerKeyId uint64 var hashFunc crypto.Hash var sigType packet.SignatureType @@ -453,23 +463,22 @@ func CheckDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashesLen := len(expectedHashes) packets := packet.NewReader(signature) - var sig *packet.Signature for { p, err = packets.Next() if err == io.EOF { - return nil, errors.ErrUnknownIssuer + return nil, nil, errors.ErrUnknownIssuer } if err != nil { - return nil, err + return nil, nil, err } var ok bool sig, ok = p.(*packet.Signature) if !ok { - return nil, errors.StructuralError("non signature packet found") + return nil, nil, errors.StructuralError("non signature packet found") } if sig.IssuerKeyId == nil { - return nil, errors.StructuralError("signature doesn't have an issuer") + return nil, nil, errors.StructuralError("signature doesn't have an issuer") } issuerKeyId = *sig.IssuerKeyId hashFunc = sig.Hash @@ -480,7 +489,7 @@ func CheckDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, break } if i+1 == expectedHashesLen { - return nil, errors.StructuralError("hash algorithm mismatch with cleartext message headers") + return nil, nil, errors.StructuralError("hash algorithm mismatch with cleartext message headers") } } @@ -496,34 +505,21 @@ func CheckDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, h, wrappedHash, err := hashForSignature(hashFunc, sigType) if err != nil { - return nil, err + return nil, nil, err } if _, err := io.Copy(wrappedHash, signed); err != nil && err != io.EOF { - return nil, err + return nil, nil, err } for _, key := range keys { err = key.PublicKey.VerifySignature(h, sig) if err == nil { - now := config.Now() - if key.Revoked(now) || - key.Entity.Revoked(now) || // primary key is revoked (redundant if key is the primary key) - key.Entity.PrimaryIdentity().Revoked(now) { - return key.Entity, errors.ErrKeyRevoked - } - if sig.SigExpired(now) { - return key.Entity, errors.ErrSignatureExpired - } - if key.PublicKey.KeyExpired(key.SelfSignature, now) || - key.SelfSignature.SigExpired(now) { - return key.Entity, errors.ErrKeyExpired - } - return key.Entity, nil + return sig, key.Entity, checkSignatureDetails(&key, sig, config) } } - return nil, err + return nil, nil, err } // CheckArmoredDetachedSignature performs the same actions as @@ -536,3 +532,61 @@ func CheckArmoredDetachedSignature(keyring KeyRing, signed, signature io.Reader, return CheckDetachedSignature(keyring, signed, body, config) } + +// checkSignatureDetails returns an error if: +// - The signature (or one of the binding signatures mentioned below) +// has a unknown critical notation data subpacket +// - The primary key of the signing entity is revoked +// - The primary identity is revoked +// - The signature is expired +// - The primary key of the signing entity is expired according to the +// primary identity binding signature +// +// ... or, if the signature was signed by a subkey and: +// - The signing subkey is revoked +// - The signing subkey is expired according to the subkey binding signature +// - The signing subkey binding signature is expired +// - The signing subkey cross-signature is expired +// +// NOTE: The order of these checks is important, as the caller may choose to +// ignore ErrSignatureExpired or ErrKeyExpired errors, but should never +// ignore any other errors. +// +// TODO: Also return an error if: +// - The primary key is expired according to a direct-key signature +// - (For V5 keys only:) The direct-key signature (exists and) is expired +func checkSignatureDetails(key *Key, signature *packet.Signature, config *packet.Config) error { + now := config.Now() + primaryIdentity := key.Entity.PrimaryIdentity() + signedBySubKey := key.PublicKey != key.Entity.PrimaryKey + sigsToCheck := []*packet.Signature{signature, primaryIdentity.SelfSignature} + if signedBySubKey { + sigsToCheck = append(sigsToCheck, key.SelfSignature, key.SelfSignature.EmbeddedSignature) + } + for _, sig := range sigsToCheck { + for _, notation := range sig.Notations { + if notation.IsCritical && !config.KnownNotation(notation.Name) { + return errors.SignatureError("unknown critical notation: " + notation.Name) + } + } + } + if key.Entity.Revoked(now) || // primary key is revoked + (signedBySubKey && key.Revoked(now)) || // subkey is revoked + primaryIdentity.Revoked(now) { // primary identity is revoked + return errors.ErrKeyRevoked + } + if key.Entity.PrimaryKey.KeyExpired(primaryIdentity.SelfSignature, now) { // primary key is expired + return errors.ErrKeyExpired + } + if signedBySubKey { + if key.PublicKey.KeyExpired(key.SelfSignature, now) { // subkey is expired + return errors.ErrKeyExpired + } + } + for _, sig := range sigsToCheck { + if sig.SigExpired(now) { // any of the relevant signatures are expired + return errors.ErrSignatureExpired + } + } + return nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go index 117a14643b..db6dad5c0b 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go @@ -1,8 +1,8 @@ package openpgp -const testKey1KeyId = 0xA34D7E18C20C31BB -const testKey3KeyId = 0x338934250CCC0360 -const testKeyP256KeyId = 0xd44a2c495918513e +const testKey1KeyId uint64 = 0xA34D7E18C20C31BB +const testKey3KeyId uint64 = 0x338934250CCC0360 +const testKeyP256KeyId uint64 = 0xd44a2c495918513e const signedInput = "Signed message\nline 2\nline 3\n" const signedTextInput = "Signed message\r\nline 2\r\nline 3\r\n" @@ -106,7 +106,7 @@ const unknownHashFunctionHex = `8a00000040040001990006050253863c24000a09103b4fe6 const rsaSignatureBadMPIlength = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101` -const missingHashFunctionHex = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101` +const missingHashFunctionHex = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101` const campbellQuine = `a0b001000300fcffa0b001000d00f2ff000300fcffa0b001000d00f2ff8270a01c00000500faff8270a01c00000500faff000500faff001400ebff8270a01c00000500faff000500faff001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400000000ffff000000ffff000b00f4ff428821c400000000ffff000000ffff000b00f4ff0233214c40000100feff000233214c40000100feff0000` @@ -171,3 +171,104 @@ y29VPonFXqi2zKkpZrvyvZxg+n5e8Nt9wNbuxeCd3QD/TtO2s+JvjrE4Siwv UQdl5MlBka1QSNbMq2Bz7XwNPg4= =6lbM -----END PGP MESSAGE-----` + +const keyWithExpiredCrossSig = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv +/seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz +/56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/ +5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3 +X5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv +9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0 +qV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb +SGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb +vLIwa3T4CyshfT0AEQEAAc0hQm9iIEJhYmJhZ2UgPGJvYkBvcGVucGdwLmV4YW1w +bGU+wsEABBMBCgATBYJeO2eVAgsJAxUICgKbAQIeAQAhCRD7/MgqAV5zMBYhBNGm +bhojsYLJmA94jPv8yCoBXnMwKWUMAJ3FKZfJ2mXvh+GFqgymvK4NoKkDRPB0CbUN +aDdG7ZOizQrWXo7Da2MYIZ6eZUDqBKLdhZ5gZfVnisDfu/yeCgpENaKib1MPHpA8 +nZQjnPejbBDomNqY8HRzr5jvXNlwywBpjWGtegCKUY9xbSynjbfzIlMrWL4S+Rfl ++bOOQKRyYJWXmECmVyqY8cz2VUYmETjNcwC8VCDUxQnhtcCJ7Aej22hfYwVEPb/J +BsJBPq8WECCiGfJ9Y2y6TF+62KzG9Kfs5hqUeHhQy8V4TSi479ewwL7DH86XmIIK +chSANBS+7iyMtctjNZfmF9zYdGJFvjI/mbBR/lK66E515Inuf75XnL8hqlXuwqvG +ni+i03Aet1DzULZEIio4uIU6ioc1lGO9h7K2Xn4S7QQH1QoISNMWqXibUR0RCGjw +FsEDTt2QwJl8XXxoJCooM7BCcCQo+rMNVUHDjIwrdoQjPld3YZsUQQRcqH6bLuln +cfn5ufl8zTGWKydoj/iTz8KcjZ7w187AzQRdpZzyAQwA1jC/XGxjK6ddgrRfW9j+ +s/U00++EvIsgTs2kr3Rg0GP7FLWV0YNtR1mpl55/bEl7yAxCDTkOgPUMXcaKlnQh +6zrlt6H53mF6Bvs3inOHQvOsGtU0dqvb1vkTF0juLiJgPlM7pWv+pNQ6IA39vKoQ +sTMBv4v5vYNXP9GgKbg8inUNT17BxzZYHfw5+q63ectgDm2on1e8CIRCZ76oBVwz +dkVxoy3gjh1eENlk2D4P0uJNZzF1Q8GV67yLANGMCDICE/OkWn6daipYDzW4iJQt +YPUWP4hWhjdm+CK+hg6IQUEn2Vtvi16D2blRP8BpUNNa4fNuylWVuJV76rIHvsLZ +1pbM3LHpRgE8s6jivS3Rz3WRs0TmWCNnvHPqWizQ3VTy+r3UQVJ5AmhJDrZdZq9i +aUIuZ01PoE1+CHiJwuxPtWvVAxf2POcm1M/F1fK1J0e+lKlQuyonTXqXR22Y41wr +fP2aPk3nPSTW2DUAf3vRMZg57ZpRxLEhEMxcM4/LMR+PABEBAAHCwrIEGAEKAAkF +gl8sAVYCmwIB3QkQ+/zIKgFeczDA+qAEGQEKAAwFgl47Z5UFgwB4TOAAIQkQfC+q +Tfk8N7IWIQQd3OFfCSF87i87N2B8L6pN+Tw3st58C/0exp0X2U4LqicSHEOSqHZj +jiysdqIELHGyo5DSPv92UFPp36aqjF9OFgtNNwSa56fmAVCD4+hor/fKARRIeIjF +qdIC5Y/9a4B10NQFJa5lsvB38x/d39LI2kEoglZnqWgdJskROo3vNQF4KlIcm6FH +dn4WI8UkC5oUUcrpZVMSKoacIaxLwqnXT42nIVgYYuqrd/ZagZZjG5WlrTOd5+NI +zi/l0fWProcPHGLjmAh4Thu8i7omtVw1nQaMnq9I77ffg3cPDgXknYrLL+q8xXh/ +0mEJyIhnmPwllWCSZuLv9DrD5pOexFfdlwXhf6cLzNpW6QhXD/Tf5KrqIPr9aOv8 +9xaEEXWh0vEby2kIsI2++ft+vfdIyxYw/wKqx0awTSnuBV1rG3z1dswX4BfoY66x +Bz3KOVqlz9+mG/FTRQwrgPvR+qgLCHbuotxoGN7fzW+PI75hQG5JQAqhsC9sHjQH +UrI21/VUNwzfw3v5pYsWuFb5bdQ3ASJetICQiMy7IW8WIQTRpm4aI7GCyZgPeIz7 +/MgqAV5zMG6/C/wLpPl/9e6Hf5wmXIUwpZNQbNZvpiCcyx9sXsHXaycOQVxn3McZ +nYOUP9/mobl1tIeDQyTNbkxWjU0zzJl8XQsDZerb5098pg+x7oGIL7M1vn5s5JMl +owROourqF88JEtOBxLMxlAM7X4hB48xKQ3Hu9hS1GdnqLKki4MqRGl4l5FUwyGOM +GjyS3TzkfiDJNwQxybQiC9n57ij20ieNyLfuWCMLcNNnZUgZtnF6wCctoq/0ZIWu +a7nvuA/XC2WW9YjEJJiWdy5109pqac+qWiY11HWy/nms4gpMdxVpT0RhrKGWq4o0 +M5q3ZElOoeN70UO3OSbU5EVrG7gB1GuwF9mTHUVlV0veSTw0axkta3FGT//XfSpD +lRrCkyLzwq0M+UUHQAuYpAfobDlDdnxxOD2jm5GyTzak3GSVFfjW09QFVO6HlGp5 +01/jtzkUiS6nwoHHkfnyn0beZuR8X6KlcrzLB0VFgQFLmkSM9cSOgYhD0PTu9aHb +hW1Hj9AO8lzggBQ= +=Nt+N +-----END PGP PUBLIC KEY BLOCK----- +` + +const sigFromKeyWithExpiredCrossSig = `-----BEGIN PGP SIGNATURE----- + +wsDzBAABCgAGBYJfLAFsACEJEHwvqk35PDeyFiEEHdzhXwkhfO4vOzdgfC+qTfk8 +N7KiqwwAts4QGB7v9bABCC2qkTxJhmStC0wQMcHRcjL/qAiVnmasQWmvE9KVsdm3 +AaXd8mIx4a37/RRvr9dYrY2eE4uw72cMqPxNja2tvVXkHQvk1oEUqfkvbXs4ypKI +NyeTWjXNOTZEbg0hbm3nMy+Wv7zgB1CEvAsEboLDJlhGqPcD+X8a6CJGrBGUBUrv +KVmZr3U6vEzClz3DBLpoddCQseJRhT4YM1nKmBlZ5quh2LFgTSpajv5OsZheqt9y +EZAPbqmLhDmWRQwGzkWHKceKS7nZ/ox2WK6OS7Ob8ZGZkM64iPo6/EGj5Yc19vQN +AGiIaPEGszBBWlOpHTPhNm0LB0nMWqqaT87oNYwP8CQuuxDb6rKJ2lffCmZH27Lb +UbQZcH8J+0UhpeaiadPZxH5ATJAcenmVtVVMLVOFnm+eIlxzov9ntpgGYt8hLdXB +ITEG9mMgp3TGS9ZzSifMZ8UGtHdp9QdBg8NEVPFzDOMGxpc/Bftav7RRRuPiAER+ +7A5CBid5 +=aQkm +-----END PGP SIGNATURE----- +` + +const signedMessageWithCriticalNotation = `-----BEGIN PGP MESSAGE----- + +owGbwMvMwMH4oOW7S46CznTG09xJDDE3Wl1KUotLuDousDAwcjBYiSmyXL+48d6x +U1PSGUxcj8IUszKBVMpMaWAAAgEGZpAeh9SKxNyCnFS95PzcytRiBi5OAZjyXXzM +f8WYLqv7TXP61Sa4rqT12CI3xaN73YS2pt089f96odCKaEPnWJ3iSGmzJaW/ug10 +2Zo8Wj2k4s7t8wt4H3HtTu+y5UZfV3VOO+l//sdE/o+Lsub8FZH7/eOq7OnbNp4n +vwjE8mqJXetNMfj8r2SCyvkEnlVRYR+/mnge+ib56FdJ8uKtqSxyvgA= +=fRXs +-----END PGP MESSAGE-----` + +const criticalNotationSigner = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mI0EUmEvTgEEANyWtQQMOybQ9JltDqmaX0WnNPJeLILIM36sw6zL0nfTQ5zXSS3+ +fIF6P29lJFxpblWk02PSID5zX/DYU9/zjM2xPO8Oa4xo0cVTOTLj++Ri5mtr//f5 +GLsIXxFrBJhD/ghFsL3Op0GXOeLJ9A5bsOn8th7x6JucNKuaRB6bQbSPABEBAAG0 +JFRlc3QgTWNUZXN0aW5ndG9uIDx0ZXN0QGV4YW1wbGUuY29tPoi5BBMBAgAjBQJS +YS9OAhsvBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQSmNhOk1uQJQwDAP6 +AgrTyqkRlJVqz2pb46TfbDM2TDF7o9CBnBzIGoxBhlRwpqALz7z2kxBDmwpQa+ki +Bq3jZN/UosY9y8bhwMAlnrDY9jP1gdCo+H0sD48CdXybblNwaYpwqC8VSpDdTndf +9j2wE/weihGp/DAdy/2kyBCaiOY1sjhUfJ1GogF49rC4jQRSYS9OAQQA6R/PtBFa +JaT4jq10yqASk4sqwVMsc6HcifM5lSdxzExFP74naUMMyEsKHP53QxTF0Grqusag +Qg/ZtgT0CN1HUM152y7ACOdp1giKjpMzOTQClqCoclyvWOFB+L/SwGEIJf7LSCEr +woBuJifJc8xAVr0XX0JthoW+uP91eTQ3XpsAEQEAAYkBPQQYAQIACQUCUmEvTgIb +LgCoCRBKY2E6TW5AlJ0gBBkBAgAGBQJSYS9OAAoJEOCE90RsICyXuqIEANmmiRCA +SF7YK7PvFkieJNwzeK0V3F2lGX+uu6Y3Q/Zxdtwc4xR+me/CSBmsURyXTO29OWhP +GLszPH9zSJU9BdDi6v0yNprmFPX/1Ng0Abn/sCkwetvjxC1YIvTLFwtUL/7v6NS2 +bZpsUxRTg9+cSrMWWSNjiY9qUKajm1tuzPDZXAUEAMNmAN3xXN/Kjyvj2OK2ck0X +W748sl/tc3qiKPMJ+0AkMF7Pjhmh9nxqE9+QCEl7qinFqqBLjuzgUhBU4QlwX1GD +AtNTq6ihLMD5v1d82ZC7tNatdlDMGWnIdvEMCv2GZcuIqDQ9rXWs49e7tq1NncLY +hz3tYjKhoFTKEIq3y3Pp +=h/aX +-----END PGP PUBLIC KEY BLOCK-----` diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go index 14f58548bd..a43695964b 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go @@ -3,7 +3,8 @@ // license that can be found in the LICENSE file. // Package s2k implements the various OpenPGP string-to-key transforms as -// specified in RFC 4800 section 3.7.1. +// specified in RFC 4800 section 3.7.1, and Argon2 specified in +// draft-ietf-openpgp-crypto-refresh-08 section 3.7.1.4. package s2k // import "github.com/ProtonMail/go-crypto/openpgp/s2k" import ( @@ -14,70 +15,47 @@ import ( "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" + "golang.org/x/crypto/argon2" ) -// Config collects configuration parameters for s2k key-stretching -// transformations. A nil *Config is valid and results in all default -// values. Currently, Config is used only by the Serialize function in -// this package. -type Config struct { - // S2KMode is the mode of s2k function. - // It can be 0 (simple), 1(salted), 3(iterated) - // 2(reserved) 100-110(private/experimental). - S2KMode uint8 - // Hash is the default hash function to be used. If - // nil, SHA256 is used. - Hash crypto.Hash - // S2KCount is only used for symmetric encryption. It - // determines the strength of the passphrase stretching when - // the said passphrase is hashed to produce a key. S2KCount - // should be between 65536 and 65011712, inclusive. If Config - // is nil or S2KCount is 0, the value 16777216 used. Not all - // values in the above range can be represented. S2KCount will - // be rounded up to the next representable value if it cannot - // be encoded exactly. See RFC 4880 Section 3.7.1.3. - S2KCount int -} +type Mode uint8 + +// Defines the default S2KMode constants +// +// 0 (simple), 1(salted), 3(iterated), 4(argon2) +const ( + SimpleS2K Mode = 0 + SaltedS2K Mode = 1 + IteratedSaltedS2K Mode = 3 + Argon2S2K Mode = 4 + GnuS2K Mode = 101 +) + +const Argon2SaltSize int = 16 // Params contains all the parameters of the s2k packet type Params struct { // mode is the mode of s2k function. // It can be 0 (simple), 1(salted), 3(iterated) // 2(reserved) 100-110(private/experimental). - mode uint8 + mode Mode // hashId is the ID of the hash function used in any of the modes hashId byte - // salt is a byte array to use as a salt in hashing process - salt []byte + // salt is a byte array to use as a salt in hashing process or argon2 + saltBytes [Argon2SaltSize]byte // countByte is used to determine how many rounds of hashing are to // be performed in s2k mode 3. See RFC 4880 Section 3.7.1.3. countByte byte -} - -func (c *Config) hash() crypto.Hash { - if c == nil || uint(c.Hash) == 0 { - return crypto.SHA256 - } - - return c.Hash -} - -// EncodedCount get encoded count -func (c *Config) EncodedCount() uint8 { - if c == nil || c.S2KCount == 0 { - return 224 // The common case. Corresponding to 16777216 - } - - i := c.S2KCount - - switch { - case i < 65536: - i = 65536 - case i > 65011712: - i = 65011712 - } - - return encodeCount(i) + // passes is a parameter in Argon2 to determine the number of iterations + // See RFC the crypto refresh Section 3.7.1.4. + passes byte + // parallelism is a parameter in Argon2 to determine the degree of paralellism + // See RFC the crypto refresh Section 3.7.1.4. + parallelism byte + // memoryExp is a parameter in Argon2 to determine the memory usage + // i.e., 2 ** memoryExp kibibytes + // See RFC the crypto refresh Section 3.7.1.4. + memoryExp byte } // encodeCount converts an iterative "count" in the range 1024 to @@ -106,6 +84,31 @@ func decodeCount(c uint8) int { return (16 + int(c&15)) << (uint32(c>>4) + 6) } +// encodeMemory converts the Argon2 "memory" in the range parallelism*8 to +// 2**31, inclusive, to an encoded memory. The return value is the +// octet that is actually stored in the GPG file. encodeMemory panics +// if is not in the above range +// See OpenPGP crypto refresh Section 3.7.1.4. +func encodeMemory(memory uint32, parallelism uint8) uint8 { + if memory < (8 * uint32(parallelism)) || memory > uint32(2147483648) { + panic("Memory argument memory is outside the required range") + } + + for exp := 3; exp < 31; exp++ { + compare := decodeMemory(uint8(exp)) + if compare >= memory { + return uint8(exp) + } + } + + return 31 +} + +// decodeMemory computes the decoded memory in kibibytes as 2**memoryExponent +func decodeMemory(memoryExponent uint8) uint32 { + return uint32(1) << memoryExponent +} + // Simple writes to out the result of computing the Simple S2K function (RFC // 4880, section 3.7.1.1) using the given hash and input passphrase. func Simple(out []byte, h hash.Hash, in []byte) { @@ -169,25 +172,53 @@ func Iterated(out []byte, h hash.Hash, in []byte, salt []byte, count int) { } } +// Argon2 writes to out the key derived from the password (in) with the Argon2 +// function (the crypto refresh, section 3.7.1.4) +func Argon2(out []byte, in []byte, salt []byte, passes uint8, paralellism uint8, memoryExp uint8) { + key := argon2.IDKey(in, salt, uint32(passes), decodeMemory(memoryExp), paralellism, uint32(len(out))) + copy(out[:], key) +} + // Generate generates valid parameters from given configuration. -// It will enforce salted + hashed s2k method +// It will enforce the Iterated and Salted or Argon2 S2K method. func Generate(rand io.Reader, c *Config) (*Params, error) { - hashId, ok := HashToHashId(c.Hash) - if !ok { - return nil, errors.UnsupportedError("no such hash") - } + var params *Params + if c != nil && c.Mode() == Argon2S2K { + // handle Argon2 case + argonConfig := c.Argon2() + params = &Params{ + mode: Argon2S2K, + passes: argonConfig.Passes(), + parallelism: argonConfig.Parallelism(), + memoryExp: argonConfig.EncodedMemory(), + } + } else if c != nil && c.PassphraseIsHighEntropy && c.Mode() == SaltedS2K { // Allow SaltedS2K if PassphraseIsHighEntropy + hashId, ok := algorithm.HashToHashId(c.hash()) + if !ok { + return nil, errors.UnsupportedError("no such hash") + } - params := &Params{ - mode: 3, // Enforce iterared + salted method - hashId: hashId, - salt: make([]byte, 8), - countByte: c.EncodedCount(), + params = &Params{ + mode: SaltedS2K, + hashId: hashId, + } + } else { // Enforce IteratedSaltedS2K method otherwise + hashId, ok := algorithm.HashToHashId(c.hash()) + if !ok { + return nil, errors.UnsupportedError("no such hash") + } + if c != nil { + c.S2KMode = IteratedSaltedS2K + } + params = &Params{ + mode: IteratedSaltedS2K, + hashId: hashId, + countByte: c.EncodedCount(), + } } - - if _, err := io.ReadFull(rand, params.salt); err != nil { + if _, err := io.ReadFull(rand, params.salt()); err != nil { return nil, err } - return params, nil } @@ -207,45 +238,60 @@ func Parse(r io.Reader) (f func(out, in []byte), err error) { // ParseIntoParams reads a binary specification for a string-to-key // transformation from r and returns a struct describing the s2k parameters. func ParseIntoParams(r io.Reader) (params *Params, err error) { - var buf [9]byte + var buf [Argon2SaltSize + 3]byte - _, err = io.ReadFull(r, buf[:2]) + _, err = io.ReadFull(r, buf[:1]) if err != nil { return } params = &Params{ - mode: buf[0], - hashId: buf[1], + mode: Mode(buf[0]), } switch params.mode { - case 0: - return params, nil - case 1: - _, err = io.ReadFull(r, buf[:8]) + case SimpleS2K: + _, err = io.ReadFull(r, buf[:1]) if err != nil { return nil, err } - - params.salt = buf[:8] + params.hashId = buf[0] return params, nil - case 3: + case SaltedS2K: _, err = io.ReadFull(r, buf[:9]) if err != nil { return nil, err } - - params.salt = buf[:8] - params.countByte = buf[8] + params.hashId = buf[0] + copy(params.salt(), buf[1:9]) + return params, nil + case IteratedSaltedS2K: + _, err = io.ReadFull(r, buf[:10]) + if err != nil { + return nil, err + } + params.hashId = buf[0] + copy(params.salt(), buf[1:9]) + params.countByte = buf[9] + return params, nil + case Argon2S2K: + _, err = io.ReadFull(r, buf[:Argon2SaltSize+3]) + if err != nil { + return nil, err + } + copy(params.salt(), buf[:Argon2SaltSize]) + params.passes = buf[Argon2SaltSize] + params.parallelism = buf[Argon2SaltSize+1] + params.memoryExp = buf[Argon2SaltSize+2] return params, nil - case 101: + case GnuS2K: // This is a GNU extension. See // https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=doc/DETAILS;h=fe55ae16ab4e26d8356dc574c9e8bc935e71aef1;hb=23191d7851eae2217ecdac6484349849a24fd94a#l1109 - if _, err = io.ReadFull(r, buf[:4]); err != nil { + if _, err = io.ReadFull(r, buf[:5]); err != nil { return nil, err } - if buf[0] == 'G' && buf[1] == 'N' && buf[2] == 'U' && buf[3] == 1 { + params.hashId = buf[0] + if buf[1] == 'G' && buf[2] == 'N' && buf[3] == 'U' && buf[4] == 1 { return params, nil } return nil, errors.UnsupportedError("GNU S2K extension") @@ -255,39 +301,56 @@ func ParseIntoParams(r io.Reader) (params *Params, err error) { } func (params *Params) Dummy() bool { - return params != nil && params.mode == 101 + return params != nil && params.mode == GnuS2K +} + +func (params *Params) salt() []byte { + switch params.mode { + case SaltedS2K, IteratedSaltedS2K: return params.saltBytes[:8] + case Argon2S2K: return params.saltBytes[:Argon2SaltSize] + default: return nil + } } func (params *Params) Function() (f func(out, in []byte), err error) { if params.Dummy() { return nil, errors.ErrDummyPrivateKey("dummy key found") } - hashObj, ok := HashIdToHash(params.hashId) - if !ok { - return nil, errors.UnsupportedError("hash for S2K function: " + strconv.Itoa(int(params.hashId))) - } - if !hashObj.Available() { - return nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashObj))) + var hashObj crypto.Hash + if params.mode != Argon2S2K { + var ok bool + hashObj, ok = algorithm.HashIdToHashWithSha1(params.hashId) + if !ok { + return nil, errors.UnsupportedError("hash for S2K function: " + strconv.Itoa(int(params.hashId))) + } + if !hashObj.Available() { + return nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashObj))) + } } switch params.mode { - case 0: + case SimpleS2K: f := func(out, in []byte) { Simple(out, hashObj.New(), in) } return f, nil - case 1: + case SaltedS2K: f := func(out, in []byte) { - Salted(out, hashObj.New(), in, params.salt) + Salted(out, hashObj.New(), in, params.salt()) } return f, nil - case 3: + case IteratedSaltedS2K: f := func(out, in []byte) { - Iterated(out, hashObj.New(), in, params.salt, decodeCount(params.countByte)) + Iterated(out, hashObj.New(), in, params.salt(), decodeCount(params.countByte)) } + return f, nil + case Argon2S2K: + f := func(out, in []byte) { + Argon2(out, in, params.salt(), params.passes, params.parallelism, params.memoryExp) + } return f, nil } @@ -295,23 +358,28 @@ func (params *Params) Function() (f func(out, in []byte), err error) { } func (params *Params) Serialize(w io.Writer) (err error) { - if _, err = w.Write([]byte{params.mode}); err != nil { + if _, err = w.Write([]byte{uint8(params.mode)}); err != nil { return } - if _, err = w.Write([]byte{params.hashId}); err != nil { - return + if params.mode != Argon2S2K { + if _, err = w.Write([]byte{params.hashId}); err != nil { + return + } } if params.Dummy() { _, err = w.Write(append([]byte("GNU"), 1)) return } if params.mode > 0 { - if _, err = w.Write(params.salt); err != nil { + if _, err = w.Write(params.salt()); err != nil { return } - if params.mode == 3 { + if params.mode == IteratedSaltedS2K { _, err = w.Write([]byte{params.countByte}) } + if params.mode == Argon2S2K { + _, err = w.Write([]byte{params.passes, params.parallelism, params.memoryExp}) + } } return } @@ -337,31 +405,3 @@ func Serialize(w io.Writer, key []byte, rand io.Reader, passphrase []byte, c *Co f(key, passphrase) return nil } - -// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP -// hash id. -func HashIdToHash(id byte) (h crypto.Hash, ok bool) { - if hash, ok := algorithm.HashById[id]; ok { - return hash.HashFunc(), true - } - return 0, false -} - -// HashIdToString returns the name of the hash function corresponding to the -// given OpenPGP hash id. -func HashIdToString(id byte) (name string, ok bool) { - if hash, ok := algorithm.HashById[id]; ok { - return hash.String(), true - } - return "", false -} - -// HashIdToHash returns an OpenPGP hash id which corresponds the given Hash. -func HashToHashId(h crypto.Hash) (id byte, ok bool) { - for id, hash := range algorithm.HashById { - if hash.HashFunc() == h { - return id, true - } - } - return 0, false -} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_cache.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_cache.go new file mode 100644 index 0000000000..25a4442dfb --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_cache.go @@ -0,0 +1,26 @@ +package s2k + +// Cache stores keys derived with s2k functions from one passphrase +// to avoid recomputation if multiple items are encrypted with +// the same parameters. +type Cache map[Params][]byte + +// GetOrComputeDerivedKey tries to retrieve the key +// for the given s2k parameters from the cache. +// If there is no hit, it derives the key with the s2k function from the passphrase, +// updates the cache, and returns the key. +func (c *Cache) GetOrComputeDerivedKey(passphrase []byte, params *Params, expectedKeySize int) ([]byte, error) { + key, found := (*c)[*params] + if !found || len(key) != expectedKeySize { + var err error + derivedKey := make([]byte, expectedKeySize) + s2k, err := params.Function() + if err != nil { + return nil, err + } + s2k(derivedKey, passphrase) + (*c)[*params] = key + return derivedKey, nil + } + return key, nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_config.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_config.go new file mode 100644 index 0000000000..b40be5228f --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_config.go @@ -0,0 +1,129 @@ +package s2k + +import "crypto" + +// Config collects configuration parameters for s2k key-stretching +// transformations. A nil *Config is valid and results in all default +// values. +type Config struct { + // S2K (String to Key) mode, used for key derivation in the context of secret key encryption + // and passphrase-encrypted data. Either s2k.Argon2S2K or s2k.IteratedSaltedS2K may be used. + // If the passphrase is a high-entropy key, indicated by setting PassphraseIsHighEntropy to true, + // s2k.SaltedS2K can also be used. + // Note: Argon2 is the strongest option but not all OpenPGP implementations are compatible with it + //(pending standardisation). + // 0 (simple), 1(salted), 3(iterated), 4(argon2) + // 2(reserved) 100-110(private/experimental). + S2KMode Mode + // Only relevant if S2KMode is not set to s2k.Argon2S2K. + // Hash is the default hash function to be used. If + // nil, SHA256 is used. + Hash crypto.Hash + // Argon2 parameters for S2K (String to Key). + // Only relevant if S2KMode is set to s2k.Argon2S2K. + // If nil, default parameters are used. + // For more details on the choice of parameters, see https://tools.ietf.org/html/rfc9106#section-4. + Argon2Config *Argon2Config + // Only relevant if S2KMode is set to s2k.IteratedSaltedS2K. + // Iteration count for Iterated S2K (String to Key). It + // determines the strength of the passphrase stretching when + // the said passphrase is hashed to produce a key. S2KCount + // should be between 65536 and 65011712, inclusive. If Config + // is nil or S2KCount is 0, the value 16777216 used. Not all + // values in the above range can be represented. S2KCount will + // be rounded up to the next representable value if it cannot + // be encoded exactly. When set, it is strongly encrouraged to + // use a value that is at least 65536. See RFC 4880 Section + // 3.7.1.3. + S2KCount int + // Indicates whether the passphrase passed by the application is a + // high-entropy key (e.g. it's randomly generated or derived from + // another passphrase using a strong key derivation function). + // When true, allows the S2KMode to be s2k.SaltedS2K. + // When the passphrase is not a high-entropy key, using SaltedS2K is + // insecure, and not allowed by draft-ietf-openpgp-crypto-refresh-08. + PassphraseIsHighEntropy bool +} + +// Argon2Config stores the Argon2 parameters +// A nil *Argon2Config is valid and results in all default +type Argon2Config struct { + NumberOfPasses uint8 + DegreeOfParallelism uint8 + // The memory parameter for Argon2 specifies desired memory usage in kibibytes. + // For example memory=64*1024 sets the memory cost to ~64 MB. + Memory uint32 +} + +func (c *Config) Mode() Mode { + if c == nil { + return IteratedSaltedS2K + } + return c.S2KMode +} + +func (c *Config) hash() crypto.Hash { + if c == nil || uint(c.Hash) == 0 { + return crypto.SHA256 + } + + return c.Hash +} + +func (c *Config) Argon2() *Argon2Config { + if c == nil || c.Argon2Config == nil { + return nil + } + return c.Argon2Config +} + +// EncodedCount get encoded count +func (c *Config) EncodedCount() uint8 { + if c == nil || c.S2KCount == 0 { + return 224 // The common case. Corresponding to 16777216 + } + + i := c.S2KCount + + switch { + case i < 65536: + i = 65536 + case i > 65011712: + i = 65011712 + } + + return encodeCount(i) +} + +func (c *Argon2Config) Passes() uint8 { + if c == nil || c.NumberOfPasses == 0 { + return 3 + } + return c.NumberOfPasses +} + +func (c *Argon2Config) Parallelism() uint8 { + if c == nil || c.DegreeOfParallelism == 0 { + return 4 + } + return c.DegreeOfParallelism +} + +func (c *Argon2Config) EncodedMemory() uint8 { + if c == nil || c.Memory == 0 { + return 16 // 64 MiB of RAM + } + + memory := c.Memory + lowerBound := uint32(c.Parallelism())*8 + upperBound := uint32(2147483648) + + switch { + case memory < lowerBound: + memory = lowerBound + case memory > upperBound: + memory = upperBound + } + + return encodeMemory(memory, c.Parallelism()) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/write.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/write.go index 23a24f2030..864d8ca6ba 100644 --- a/vendor/github.com/ProtonMail/go-crypto/openpgp/write.go +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/write.go @@ -13,8 +13,8 @@ import ( "github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/packet" - "github.com/ProtonMail/go-crypto/openpgp/s2k" ) // DetachSign signs message with the private key from signer (which must @@ -70,15 +70,11 @@ func detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.S if signingKey.PrivateKey.Encrypted { return errors.InvalidArgumentError("signing key is encrypted") } + if _, ok := algorithm.HashToHashId(config.Hash()); !ok { + return errors.InvalidArgumentError("invalid hash function") + } - sig := new(packet.Signature) - sig.SigType = sigType - sig.PubKeyAlgo = signingKey.PrivateKey.PubKeyAlgo - sig.Hash = config.Hash() - sig.CreationTime = config.Now() - sigLifetimeSecs := config.SigLifetime() - sig.SigLifetimeSecs = &sigLifetimeSecs - sig.IssuerKeyId = &signingKey.PrivateKey.KeyId + sig := createSignaturePacket(signingKey.PublicKey, sigType, config) h, wrappedHash, err := hashForSignature(sig.Hash, sig.SigType) if err != nil { @@ -125,16 +121,13 @@ func SymmetricallyEncrypt(ciphertext io.Writer, passphrase []byte, hints *FileHi } var w io.WriteCloser - if config.AEAD() != nil { - w, err = packet.SerializeAEADEncrypted(ciphertext, key, config.Cipher(), config.AEAD().Mode(), config) - if err != nil { - return - } - } else { - w, err = packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), key, config) - if err != nil { - return - } + cipherSuite := packet.CipherSuite{ + Cipher: config.Cipher(), + Mode: config.AEAD().Mode(), + } + w, err = packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), config.AEAD() != nil, cipherSuite, key, config) + if err != nil { + return } literalData := w @@ -173,8 +166,25 @@ func intersectPreferences(a []uint8, b []uint8) (intersection []uint8) { return a[:j] } +// intersectPreferences mutates and returns a prefix of a that contains only +// the values in the intersection of a and b. The order of a is preserved. +func intersectCipherSuites(a [][2]uint8, b [][2]uint8) (intersection [][2]uint8) { + var j int + for _, v := range a { + for _, v2 := range b { + if v[0] == v2[0] && v[1] == v2[1] { + a[j] = v + j++ + break + } + } + } + + return a[:j] +} + func hashToHashId(h crypto.Hash) uint8 { - v, ok := s2k.HashToHashId(h) + v, ok := algorithm.HashToHashId(h) if !ok { panic("tried to convert unknown hash") } @@ -240,7 +250,7 @@ func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entit var hash crypto.Hash for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { + if h, ok := algorithm.HashIdToHash(hashId); ok && h.Available() { hash = h break } @@ -249,7 +259,7 @@ func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entit // If the hash specified by config is a candidate, we'll use that. if configuredHash := config.Hash(); configuredHash.Available() { for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { + if h, ok := algorithm.HashIdToHash(hashId); ok && h == configuredHash { hash = h break } @@ -258,7 +268,7 @@ func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entit if hash == 0 { hashId := candidateHashes[0] - name, ok := s2k.HashIdToString(hashId) + name, ok := algorithm.HashIdToString(hashId) if !ok { name = "#" + strconv.Itoa(int(hashId)) } @@ -329,39 +339,39 @@ func encrypt(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *En // These are the possible ciphers that we'll use for the message. candidateCiphers := []uint8{ - uint8(packet.CipherAES128), uint8(packet.CipherAES256), - uint8(packet.CipherCAST5), + uint8(packet.CipherAES128), } + // These are the possible hash functions that we'll use for the signature. candidateHashes := []uint8{ hashToHashId(crypto.SHA256), hashToHashId(crypto.SHA384), hashToHashId(crypto.SHA512), - hashToHashId(crypto.SHA1), - hashToHashId(crypto.RIPEMD160), + hashToHashId(crypto.SHA3_256), + hashToHashId(crypto.SHA3_512), } - candidateAeadModes := []uint8{ - uint8(packet.AEADModeEAX), - uint8(packet.AEADModeOCB), - uint8(packet.AEADModeExperimentalGCM), + + // Prefer GCM if everyone supports it + candidateCipherSuites := [][2]uint8{ + {uint8(packet.CipherAES256), uint8(packet.AEADModeGCM)}, + {uint8(packet.CipherAES256), uint8(packet.AEADModeEAX)}, + {uint8(packet.CipherAES256), uint8(packet.AEADModeOCB)}, + {uint8(packet.CipherAES128), uint8(packet.AEADModeGCM)}, + {uint8(packet.CipherAES128), uint8(packet.AEADModeEAX)}, + {uint8(packet.CipherAES128), uint8(packet.AEADModeOCB)}, } + candidateCompression := []uint8{ uint8(packet.CompressionNone), uint8(packet.CompressionZIP), uint8(packet.CompressionZLIB), } - // In the event that a recipient doesn't specify any supported ciphers - // or hash functions, these are the ones that we assume that every - // implementation supports. - defaultCiphers := candidateCiphers[0:1] - defaultHashes := candidateHashes[0:1] - defaultAeadModes := candidateAeadModes[0:1] - defaultCompression := candidateCompression[0:1] encryptKeys := make([]Key, len(to)) - // AEAD is used only if every key supports it. - aeadSupported := true + + // AEAD is used only if config enables it and every key supports it + aeadSupported := config.AEAD() != nil for i := range to { var ok bool @@ -371,38 +381,37 @@ func encrypt(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *En } sig := to[i].PrimaryIdentity().SelfSignature - if sig.AEAD == false { + if sig.SEIPDv2 == false { aeadSupported = false } - preferredSymmetric := sig.PreferredSymmetric - if len(preferredSymmetric) == 0 { - preferredSymmetric = defaultCiphers - } - preferredHashes := sig.PreferredHash - if len(preferredHashes) == 0 { - preferredHashes = defaultHashes - } - preferredAeadModes := sig.PreferredAEAD - if len(preferredAeadModes) == 0 { - preferredAeadModes = defaultAeadModes - } - preferredCompression := sig.PreferredCompression - if len(preferredCompression) == 0 { - preferredCompression = defaultCompression - } - candidateCiphers = intersectPreferences(candidateCiphers, preferredSymmetric) - candidateHashes = intersectPreferences(candidateHashes, preferredHashes) - candidateAeadModes = intersectPreferences(candidateAeadModes, preferredAeadModes) - candidateCompression = intersectPreferences(candidateCompression, preferredCompression) + candidateCiphers = intersectPreferences(candidateCiphers, sig.PreferredSymmetric) + candidateHashes = intersectPreferences(candidateHashes, sig.PreferredHash) + candidateCipherSuites = intersectCipherSuites(candidateCipherSuites, sig.PreferredCipherSuites) + candidateCompression = intersectPreferences(candidateCompression, sig.PreferredCompression) } - if len(candidateCiphers) == 0 || len(candidateHashes) == 0 || len(candidateAeadModes) == 0 { - return nil, errors.InvalidArgumentError("cannot encrypt because recipient set shares no common algorithms") + // In the event that the intersection of supported algorithms is empty we use the ones + // labelled as MUST that every implementation supports. + if len(candidateCiphers) == 0 { + // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.3 + candidateCiphers = []uint8{uint8(packet.CipherAES128)} + } + if len(candidateHashes) == 0 { + // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#hash-algos + candidateHashes = []uint8{hashToHashId(crypto.SHA256)} + } + if len(candidateCipherSuites) == 0 { + // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.6 + candidateCipherSuites = [][2]uint8{{uint8(packet.CipherAES128), uint8(packet.AEADModeOCB)}} } cipher := packet.CipherFunction(candidateCiphers[0]) - mode := packet.AEADMode(candidateAeadModes[0]) + aeadCipherSuite := packet.CipherSuite{ + Cipher: packet.CipherFunction(candidateCipherSuites[0][0]), + Mode: packet.AEADMode(candidateCipherSuites[0][1]), + } + // If the cipher specified by config is a candidate, we'll use that. configuredCipher := config.Cipher() for _, c := range candidateCiphers { @@ -425,17 +434,11 @@ func encrypt(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *En } var payload io.WriteCloser - if config.AEAD() != nil && aeadSupported { - payload, err = packet.SerializeAEADEncrypted(dataWriter, symKey, cipher, mode, config) - if err != nil { - return - } - } else { - payload, err = packet.SerializeSymmetricallyEncrypted(dataWriter, cipher, symKey, config) - if err != nil { - return - } + payload, err = packet.SerializeSymmetricallyEncrypted(dataWriter, cipher, aeadSupported, aeadCipherSuite, symKey, config) + if err != nil { + return } + payload, err = handleCompression(payload, candidateCompression, config) if err != nil { return nil, err @@ -458,8 +461,8 @@ func Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Con hashToHashId(crypto.SHA256), hashToHashId(crypto.SHA384), hashToHashId(crypto.SHA512), - hashToHashId(crypto.SHA1), - hashToHashId(crypto.RIPEMD160), + hashToHashId(crypto.SHA3_256), + hashToHashId(crypto.SHA3_512), } defaultHashes := candidateHashes[0:1] preferredHashes := signed.PrimaryIdentity().SelfSignature.PreferredHash @@ -502,15 +505,9 @@ func (s signatureWriter) Write(data []byte) (int, error) { } func (s signatureWriter) Close() error { - sig := &packet.Signature{ - Version: s.signer.Version, - SigType: s.sigType, - PubKeyAlgo: s.signer.PubKeyAlgo, - Hash: s.hashType, - CreationTime: s.config.Now(), - IssuerKeyId: &s.signer.KeyId, - Metadata: s.metadata, - } + sig := createSignaturePacket(&s.signer.PublicKey, s.sigType, s.config) + sig.Hash = s.hashType + sig.Metadata = s.metadata if err := sig.Sign(s.h, s.signer, s.config); err != nil { return err @@ -524,6 +521,21 @@ func (s signatureWriter) Close() error { return s.encryptedData.Close() } +func createSignaturePacket(signer *packet.PublicKey, sigType packet.SignatureType, config *packet.Config) *packet.Signature { + sigLifetimeSecs := config.SigLifetime() + return &packet.Signature{ + Version: signer.Version, + SigType: sigType, + PubKeyAlgo: signer.PubKeyAlgo, + Hash: config.Hash(), + CreationTime: config.Now(), + IssuerKeyId: &signer.KeyId, + IssuerFingerprint: signer.Fingerprint, + Notations: config.Notations(), + SigLifetimeSecs: &sigLifetimeSecs, + } +} + // noOpCloser is like an ioutil.NopCloser, but for an io.Writer. // TODO: we have two of these in OpenPGP packages alone. This probably needs // to be promoted somewhere more common. @@ -545,6 +557,9 @@ func handleCompression(compressed io.WriteCloser, candidateCompression []uint8, if confAlgo == packet.CompressionNone { return } + + // Set algorithm labelled as MUST as fallback + // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.4 finalAlgo := packet.CompressionNone // if compression specified by config available we will use it for _, c := range candidateCompression { diff --git a/vendor/github.com/acomagu/bufpipe/CREDITS b/vendor/github.com/acomagu/bufpipe/CREDITS new file mode 100644 index 0000000000..fb0d2b59a0 --- /dev/null +++ b/vendor/github.com/acomagu/bufpipe/CREDITS @@ -0,0 +1,60 @@ +Go (the standard library) +https://golang.org/ +---------------------------------------------------------------- +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. + +================================================================ + +github.com/matryer/is +https://github.com/matryer/is +---------------------------------------------------------------- +MIT License + +Copyright (c) 2017-2018 Mat Ryer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +================================================================ + diff --git a/vendor/github.com/acomagu/bufpipe/LICENSE b/vendor/github.com/acomagu/bufpipe/LICENSE new file mode 100644 index 0000000000..1b5f21cd24 --- /dev/null +++ b/vendor/github.com/acomagu/bufpipe/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 acomagu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/acomagu/bufpipe/README.md b/vendor/github.com/acomagu/bufpipe/README.md index 19df083142..136ee01db1 100644 --- a/vendor/github.com/acomagu/bufpipe/README.md +++ b/vendor/github.com/acomagu/bufpipe/README.md @@ -40,3 +40,13 @@ w.Close() ``` [Playground](https://play.golang.org/p/UppmyLeRgX6) + +## Contribution + +### Generate CREDITS + +The [CREDITS](./CREDITS) file are generated by [gocredits](https://github.com/Songmu/gocredits). Update it when the dependencies are changed. + +``` +$ gocredits > CREDITS +``` diff --git a/vendor/github.com/acomagu/bufpipe/bufpipe.go b/vendor/github.com/acomagu/bufpipe/bufpipe.go index 846dbcc290..34882ea080 100644 --- a/vendor/github.com/acomagu/bufpipe/bufpipe.go +++ b/vendor/github.com/acomagu/bufpipe/bufpipe.go @@ -124,5 +124,6 @@ func (w *PipeWriter) CloseWithError(err error) error { err = io.EOF } w.rerr = err + w.cond.Broadcast() return nil } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md index 197c118e2a..c3512dd7a8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md @@ -1,3 +1,3477 @@ +# Release (2023-06-13) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudtrail`: [v1.27.0](service/cloudtrail/CHANGELOG.md#v1270-2023-06-13) + * **Feature**: This feature allows users to view dashboards for CloudTrail Lake event data stores. +* `github.com/aws/aws-sdk-go-v2/service/codegurusecurity`: [v1.0.0](service/codegurusecurity/CHANGELOG.md#v100-2023-06-13) + * **Release**: New AWS service client module + * **Feature**: Initial release of Amazon CodeGuru Security APIs +* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.14.0](service/drs/CHANGELOG.md#v1140-2023-06-13) + * **Feature**: Added APIs to support network replication and recovery using AWS Elastic Disaster Recovery. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.100.0](service/ec2/CHANGELOG.md#v11000-2023-06-13) + * **Feature**: This release introduces a new feature, EC2 Instance Connect Endpoint, that enables you to connect to a resource over TCP, without requiring the resource to have a public IPv4 address. +* `github.com/aws/aws-sdk-go-v2/service/imagebuilder`: [v1.23.5](service/imagebuilder/CHANGELOG.md#v1235-2023-06-13) + * **Documentation**: Change the Image Builder ImagePipeline dateNextRun field to more accurately describe the data. +* `github.com/aws/aws-sdk-go-v2/service/lightsail`: [v1.27.0](service/lightsail/CHANGELOG.md#v1270-2023-06-13) + * **Feature**: This release adds pagination for the Get Certificates API operation. +* `github.com/aws/aws-sdk-go-v2/service/s3`: [v1.34.0](service/s3/CHANGELOG.md#v1340-2023-06-13) + * **Feature**: Integrate double encryption feature to SDKs. + * **Bug Fix**: Fix HeadObject to return types.Nound when an object does not exist. Fixes [2084](https://github.com/aws/aws-sdk-go-v2/issues/2084) +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.33.0](service/securityhub/CHANGELOG.md#v1330-2023-06-13) + * **Feature**: Add support for Security Hub Automation Rules +* `github.com/aws/aws-sdk-go-v2/service/simspaceweaver`: [v1.3.0](service/simspaceweaver/CHANGELOG.md#v130-2023-06-13) + * **Feature**: This release fixes using aws-us-gov ARNs in API calls and adds documentation for snapshot APIs. +* `github.com/aws/aws-sdk-go-v2/service/verifiedpermissions`: [v1.0.0](service/verifiedpermissions/CHANGELOG.md#v100-2023-06-13) + * **Release**: New AWS service client module + * **Feature**: GA release of Amazon Verified Permissions. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.35.0](service/wafv2/CHANGELOG.md#v1350-2023-06-13) + * **Feature**: You can now detect and block fraudulent account creation attempts with the new AWS WAF Fraud Control account creation fraud prevention (ACFP) managed rule group AWSManagedRulesACFPRuleSet. +* `github.com/aws/aws-sdk-go-v2/service/wellarchitected`: [v1.21.0](service/wellarchitected/CHANGELOG.md#v1210-2023-06-13) + * **Feature**: AWS Well-Architected now supports Profiles that help customers prioritize which questions to focus on first by providing a list of prioritized questions that are better aligned with their business goals and outcomes. + +# Release (2023-06-12) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/amplifyuibuilder`: [v1.11.0](service/amplifyuibuilder/CHANGELOG.md#v1110-2023-06-12) + * **Feature**: AWS Amplify UIBuilder is launching Codegen UI, a new feature that enables you to generate your amplify uibuilder components and forms. +* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.19.8](service/dynamodb/CHANGELOG.md#v1198-2023-06-12) + * **Documentation**: Documentation updates for DynamoDB +* `github.com/aws/aws-sdk-go-v2/service/dynamodbstreams`: [v1.14.12](service/dynamodbstreams/CHANGELOG.md#v11412-2023-06-12) + * **Documentation**: Documentation updates for DynamoDB Streams +* `github.com/aws/aws-sdk-go-v2/service/fsx`: [v1.29.0](service/fsx/CHANGELOG.md#v1290-2023-06-12) + * **Feature**: Amazon FSx for NetApp ONTAP now supports joining a storage virtual machine (SVM) to Active Directory after the SVM has been created. +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.18.0](service/opensearch/CHANGELOG.md#v1180-2023-06-12) + * **Feature**: This release adds support for SkipUnavailable connection property for cross cluster search +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.29.0](service/rekognition/CHANGELOG.md#v1290-2023-06-12) + * **Feature**: This release adds support for improved accuracy with user vector in Amazon Rekognition Face Search. Adds new APIs: AssociateFaces, CreateUser, DeleteUser, DisassociateFaces, ListUsers, SearchUsers, SearchUsersByImage. Also adds new face metadata that can be stored: user vector. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.84.0](service/sagemaker/CHANGELOG.md#v1840-2023-06-12) + * **Feature**: Sagemaker Neo now supports compilation for inferentia2 (ML_INF2) and Trainium1 (ML_TRN1) as available targets. With these devices, you can run your workloads at highest performance with lowest cost. inferentia2 (ML_INF2) is available in CMH and Trainium1 (ML_TRN1) is available in IAD currently + +# Release (2023-06-09) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/acmpca`: [v1.21.13](service/acmpca/CHANGELOG.md#v12113-2023-06-09) + * **Documentation**: Document-only update to refresh CLI documentation for AWS Private CA. No change to the service. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.58.0](service/connect/CHANGELOG.md#v1580-2023-06-09) + * **Feature**: This release adds search APIs for Prompts, Quick Connects and Hours of Operations, which can be used to search for those resources within a Connect Instance. + +# Release (2023-06-08) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.30.0](service/athena/CHANGELOG.md#v1300-2023-06-08) + * **Feature**: You can now define custom spark properties at start of the session for use cases like cluster encryption, table formats, and general Spark tuning. +* `github.com/aws/aws-sdk-go-v2/service/comprehendmedical`: [v1.16.0](service/comprehendmedical/CHANGELOG.md#v1160-2023-06-08) + * **Feature**: This release supports a new set of entities and traits. +* `github.com/aws/aws-sdk-go-v2/service/paymentcryptography`: [v1.0.0](service/paymentcryptography/CHANGELOG.md#v100-2023-06-08) + * **Release**: New AWS service client module + * **Feature**: Initial release of AWS Payment Cryptography Control Plane service for creating and managing cryptographic keys used during card payment processing. +* `github.com/aws/aws-sdk-go-v2/service/paymentcryptographydata`: [v1.0.0](service/paymentcryptographydata/CHANGELOG.md#v100-2023-06-08) + * **Release**: New AWS service client module + * **Feature**: Initial release of AWS Payment Cryptography DataPlane Plane service for performing cryptographic operations typically used during card payment processing. +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.19.0](service/servicecatalog/CHANGELOG.md#v1190-2023-06-08) + * **Feature**: New parameter added in ServiceCatalog DescribeProvisioningArtifact api - IncludeProvisioningArtifactParameters. This parameter can be used to return information about the parameters used to provision the product +* `github.com/aws/aws-sdk-go-v2/service/timestreamwrite`: [v1.17.0](service/timestreamwrite/CHANGELOG.md#v1170-2023-06-08) + * **Feature**: This release adds the capability for customers to define how their data should be partitioned, optimizing for certain access patterns. This definition will take place as a part of the table creation. + +# Release (2023-06-07) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.29.0](service/cloudformation/CHANGELOG.md#v1290-2023-06-07) + * **Feature**: AWS CloudFormation StackSets is updating the deployment experience for all stackset operations to skip suspended AWS accounts during deployments. StackSets will skip target AWS accounts that are suspended and set the Detailed Status of the corresponding stack instances as SKIPPED_SUSPENDED_ACCOUNT +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.21.0](service/cloudwatchlogs/CHANGELOG.md#v1210-2023-06-07) + * **Feature**: This change adds support for account level data protection policies using 3 new APIs, PutAccountPolicy, DeleteAccountPolicy and DescribeAccountPolicy. DescribeLogGroup API has been modified to indicate if account level policy is applied to the LogGroup via "inheritedProperties" list in the response. +* `github.com/aws/aws-sdk-go-v2/service/customerprofiles`: [v1.25.0](service/customerprofiles/CHANGELOG.md#v1250-2023-06-07) + * **Feature**: This release introduces event stream related APIs. +* `github.com/aws/aws-sdk-go-v2/service/directconnect`: [v1.18.15](service/directconnect/CHANGELOG.md#v11815-2023-06-07) + * **Documentation**: This update corrects the jumbo frames mtu values from 9100 to 8500 for transit virtual interfaces. +* `github.com/aws/aws-sdk-go-v2/service/emrcontainers`: [v1.19.0](service/emrcontainers/CHANGELOG.md#v1190-2023-06-07) + * **Feature**: EMR on EKS adds support for log rotation of Spark container logs with EMR-6.11.0 onwards, to the StartJobRun API. +* `github.com/aws/aws-sdk-go-v2/service/iotdeviceadvisor`: [v1.19.0](service/iotdeviceadvisor/CHANGELOG.md#v1190-2023-06-07) + * **Feature**: AWS IoT Core Device Advisor now supports new Qualification Suite test case list. With this update, customers can more easily create new qualification test suite with an empty rootGroup input. + +# Release (2023-06-06) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.57.1](service/connect/CHANGELOG.md#v1571-2023-06-06) + * **Documentation**: GetMetricDataV2 API is now available in AWS GovCloud(US) region. +* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.26.0](service/emr/CHANGELOG.md#v1260-2023-06-06) + * **Feature**: This release provides customers the ability to specify an allocation strategies amongst PRICE_CAPACITY_OPTIMIZED, CAPACITY_OPTIMIZED, LOWEST_PRICE, DIVERSIFIED for Spot instances in Instance Feet cluster. This enables customers to choose an allocation strategy best suited for their workload. +* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.20.0](service/iam/CHANGELOG.md#v1200-2023-06-06) + * **Feature**: This release updates the AccountAlias regex pattern with the same length restrictions enforced by the length constraint. +* `github.com/aws/aws-sdk-go-v2/service/inspector2`: [v1.14.0](service/inspector2/CHANGELOG.md#v1140-2023-06-06) + * **Feature**: Adds new response properties and request parameters for 'last scanned at' on the ListCoverage operation. This feature allows you to search and view the date of which your resources were last scanned by Inspector. +* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.38.0](service/iot/CHANGELOG.md#v1380-2023-06-06) + * **Feature**: Adding IoT Device Management Software Package Catalog APIs to register, store, and report system software packages, along with their versions and metadata in a centralized location. +* `github.com/aws/aws-sdk-go-v2/service/lexmodelsv2`: [v1.29.0](service/lexmodelsv2/CHANGELOG.md#v1290-2023-06-06) + * **Feature**: This release adds support for Lex Developers to create test sets and to execute those test-sets against their bots. +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.37.0](service/quicksight/CHANGELOG.md#v1370-2023-06-06) + * **Feature**: QuickSight support for pivot table field collapse state, radar chart range scale and multiple scope options in conditional formatting. +* `github.com/aws/aws-sdk-go-v2/service/signer`: [v1.15.0](service/signer/CHANGELOG.md#v1150-2023-06-06) + * **Feature**: AWS Signer is launching Container Image Signing, a new feature that enables you to sign and verify container images. This feature enables you to validate that only container images you approve are used in your enterprise. +* `github.com/aws/aws-sdk-go-v2/service/sqs`: [v1.23.0](service/sqs/CHANGELOG.md#v1230-2023-06-06) + * **Feature**: Amazon SQS adds three new APIs - StartMessageMoveTask, CancelMessageMoveTask, and ListMessageMoveTasks to automate redriving messages from dead-letter queues to source queues or a custom destination. + +# Release (2023-06-05) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.28.0](service/cloudformation/CHANGELOG.md#v1280-2023-06-05) + * **Feature**: AWS CloudFormation StackSets provides customers with three new APIs to activate, deactivate, and describe AWS Organizations trusted access which is needed to get started with service-managed StackSets. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.99.0](service/ec2/CHANGELOG.md#v1990-2023-06-05) + * **Feature**: Making InstanceTagAttribute as the required parameter for the DeregisterInstanceEventNotificationAttributes and RegisterInstanceEventNotificationAttributes APIs. +* `github.com/aws/aws-sdk-go-v2/service/finspace`: [v1.10.0](service/finspace/CHANGELOG.md#v1100-2023-06-05) + * **Feature**: Releasing new Managed kdb Insights APIs +* `github.com/aws/aws-sdk-go-v2/service/frauddetector`: [v1.25.0](service/frauddetector/CHANGELOG.md#v1250-2023-06-05) + * **Feature**: Added new variable types, new DateTime data type, and new rules engine functions for interacting and working with DateTime data types. +* `github.com/aws/aws-sdk-go-v2/service/keyspaces`: [v1.3.0](service/keyspaces/CHANGELOG.md#v130-2023-06-05) + * **Feature**: This release adds support for MRR GA launch, and includes multiregion support in create-keyspace, get-keyspace, and list-keyspace. +* `github.com/aws/aws-sdk-go-v2/service/kms`: [v1.22.0](service/kms/CHANGELOG.md#v1220-2023-06-05) + * **Feature**: This release includes feature to import customer's asymmetric (RSA and ECC) and HMAC keys into KMS. It also includes feature to allow customers to specify number of days to schedule a KMS key deletion as a policy condition key. +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.35.0](service/lambda/CHANGELOG.md#v1350-2023-06-05) + * **Feature**: Add Ruby 3.2 (ruby3.2) Runtime support to AWS Lambda. +* `github.com/aws/aws-sdk-go-v2/service/mwaa`: [v1.16.0](service/mwaa/CHANGELOG.md#v1160-2023-06-05) + * **Feature**: This release adds ROLLING_BACK and CREATING_SNAPSHOT environment statuses for Amazon MWAA environments. + +# Release (2023-06-02) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.29.0](service/athena/CHANGELOG.md#v1290-2023-06-02) + * **Feature**: This release introduces the DeleteCapacityReservation API and the ability to manage capacity reservations using CloudFormation +* `github.com/aws/aws-sdk-go-v2/service/cloudtrail`: [v1.26.0](service/cloudtrail/CHANGELOG.md#v1260-2023-06-02) + * **Feature**: This feature allows users to start and stop event ingestion on a CloudTrail Lake event data store. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.83.0](service/sagemaker/CHANGELOG.md#v1830-2023-06-02) + * **Feature**: This release adds Selective Execution feature that allows SageMaker Pipelines users to run selected steps in a pipeline. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.34.0](service/wafv2/CHANGELOG.md#v1340-2023-06-02) + * **Feature**: Added APIs to describe managed products. The APIs retrieve information about rule groups that are managed by AWS and by AWS Marketplace sellers. + +# Release (2023-06-01) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/alexaforbusiness`: [v1.15.11](service/alexaforbusiness/CHANGELOG.md#v11511-2023-06-01) + * **Documentation**: Alexa for Business has been deprecated and is no longer supported. +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.30.0](service/appflow/CHANGELOG.md#v1300-2023-06-01) + * **Feature**: Added ability to select DataTransferApiType for DescribeConnector and CreateFlow requests when using Async supported connectors. Added supportedDataTransferType to DescribeConnector/DescribeConnectors/ListConnector response. +* `github.com/aws/aws-sdk-go-v2/service/customerprofiles`: [v1.24.0](service/customerprofiles/CHANGELOG.md#v1240-2023-06-01) + * **Feature**: This release introduces calculated attribute related APIs. +* `github.com/aws/aws-sdk-go-v2/service/ivs`: [v1.22.0](service/ivs/CHANGELOG.md#v1220-2023-06-01) + * **Feature**: API Update for IVS Advanced Channel type +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.82.1](service/sagemaker/CHANGELOG.md#v1821-2023-06-01) + * **Documentation**: Amazon Sagemaker Autopilot adds support for Parquet file input to NLP text classification jobs. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.33.1](service/wafv2/CHANGELOG.md#v1331-2023-06-01) + * **Documentation**: Corrected the information for the header order FieldToMatch setting + +# Release (2023-05-31) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.33.0](service/configservice/CHANGELOG.md#v1330-2023-05-31) + * **Feature**: Resource Types Exclusion feature launch by AWS Config +* `github.com/aws/aws-sdk-go-v2/service/frauddetector`: [v1.24.0](service/frauddetector/CHANGELOG.md#v1240-2023-05-31) + * **Feature**: This release enables publishing event predictions from Amazon Fraud Detector (AFD) to Amazon EventBridge. For example, after getting predictions from AFD, Amazon EventBridge rules can be configured to trigger notification through an SNS topic, send a message with SES, or trigger Lambda workflows. +* `github.com/aws/aws-sdk-go-v2/service/healthlake`: [v1.16.0](service/healthlake/CHANGELOG.md#v1160-2023-05-31) + * **Feature**: This release adds a new request parameter to the CreateFHIRDatastore API operation. IdentityProviderConfiguration specifies how you want to authenticate incoming requests to your Healthlake Data Store. +* `github.com/aws/aws-sdk-go-v2/service/m2`: [v1.5.0](service/m2/CHANGELOG.md#v150-2023-05-31) + * **Feature**: Adds an optional create-only 'roleArn' property to Application resources. Enables PS and PO data set org types. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.45.0](service/rds/CHANGELOG.md#v1450-2023-05-31) + * **Feature**: This release adds support for changing the engine for Oracle using the ModifyDbInstance API +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.18.5](service/servicecatalog/CHANGELOG.md#v1185-2023-05-31) + * **Documentation**: Documentation updates for ServiceCatalog. +* `github.com/aws/aws-sdk-go-v2/service/workspacesweb`: [v1.10.0](service/workspacesweb/CHANGELOG.md#v1100-2023-05-31) + * **Feature**: WorkSpaces Web now allows you to control which IP addresses your WorkSpaces Web portal may be accessed from. + +# Release (2023-05-30) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.6.0](service/chimesdkvoice/CHANGELOG.md#v160-2023-05-30) + * **Feature**: Added optional CallLeg field to StartSpeakerSearchTask API request +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.50.0](service/glue/CHANGELOG.md#v1500-2023-05-30) + * **Feature**: Added Runtime parameter to allow selection of Ray Runtime +* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.18.3](service/groundstation/CHANGELOG.md#v1183-2023-05-30) + * **Documentation**: Updating description of GetMinuteUsage to be clearer. +* `github.com/aws/aws-sdk-go-v2/service/iotfleetwise`: [v1.4.0](service/iotfleetwise/CHANGELOG.md#v140-2023-05-30) + * **Feature**: Campaigns now support selecting Timestream or S3 as the data destination, Signal catalogs now support "Deprecation" keyword released in VSS v2.1 and "Comment" keyword released in VSS v3.0 +* `github.com/aws/aws-sdk-go-v2/service/location`: [v1.23.0](service/location/CHANGELOG.md#v1230-2023-05-30) + * **Feature**: This release adds API support for political views for the maps service APIs: CreateMap, UpdateMap, DescribeMap. +* `github.com/aws/aws-sdk-go-v2/service/memorydb`: [v1.13.0](service/memorydb/CHANGELOG.md#v1130-2023-05-30) + * **Feature**: Amazon MemoryDB for Redis now supports AWS Identity and Access Management authentication access to Redis clusters starting with redis-engine version 7.0 +* `github.com/aws/aws-sdk-go-v2/service/personalize`: [v1.24.0](service/personalize/CHANGELOG.md#v1240-2023-05-30) + * **Feature**: This release provides support for the exclusion of certain columns for training when creating a solution and creating or updating a recommender with Amazon Personalize. +* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.26.0](service/polly/CHANGELOG.md#v1260-2023-05-30) + * **Feature**: Amazon Polly adds 2 new voices - Sofie (da-DK) and Niamh (en-IE) +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.32.0](service/securityhub/CHANGELOG.md#v1320-2023-05-30) + * **Feature**: Added new resource detail objects to ASFF, including resources for AwsGuardDutyDetector, AwsAmazonMqBroker, AwsEventSchemasRegistry, AwsAppSyncGraphQlApi and AwsStepFunctionStateMachine. +* `github.com/aws/aws-sdk-go-v2/service/securitylake`: [v1.4.0](service/securitylake/CHANGELOG.md#v140-2023-05-30) + * **Feature**: Log sources are now versioned. AWS log sources and custom sources will now come with a version identifier that enables producers to vend multiple schema versions to subscribers. Security Lake API have been refactored to more closely align with AWS API conventions. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.33.0](service/wafv2/CHANGELOG.md#v1330-2023-05-30) + * **Feature**: This SDK release provides customers the ability to use Header Order as a field to match. + +# Release (2023-05-26) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.57.0](service/connect/CHANGELOG.md#v1570-2023-05-26) + * **Feature**: Documentation update for a new Initiation Method value in DescribeContact API +* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.28.0](service/iotwireless/CHANGELOG.md#v1280-2023-05-26) + * **Feature**: Add Multicast Group support in Network Analyzer Configuration. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.82.0](service/sagemaker/CHANGELOG.md#v1820-2023-05-26) + * **Feature**: Added ml.p4d and ml.inf1 as supported instance type families for SageMaker Notebook Instances. + +# Release (2023-05-25) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/applicationautoscaling`: [v1.21.0](service/applicationautoscaling/CHANGELOG.md#v1210-2023-05-25) + * **Feature**: With this release, ElastiCache customers will be able to use predefined metricType "ElastiCacheDatabaseCapacityUsageCountedForEvictPercentage" for their ElastiCache instances. +* `github.com/aws/aws-sdk-go-v2/service/codepipeline`: [v1.15.0](service/codepipeline/CHANGELOG.md#v1150-2023-05-25) + * **Feature**: Add PollingDisabledAt time information in PipelineMetadata object of GetPipeline API. +* `github.com/aws/aws-sdk-go-v2/service/gamelift`: [v1.19.0](service/gamelift/CHANGELOG.md#v1190-2023-05-25) + * **Feature**: GameLift FleetIQ users can now filter game server claim requests to exclude servers on instances that are draining. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.49.0](service/glue/CHANGELOG.md#v1490-2023-05-25) + * **Feature**: Added ability to create data quality rulesets for shared, cross-account Glue Data Catalog tables. Added support for dataset comparison rules through a new parameter called AdditionalDataSources. Enhanced the data quality results with a map containing profiled metric values. +* `github.com/aws/aws-sdk-go-v2/service/migrationhubrefactorspaces`: [v1.10.0](service/migrationhubrefactorspaces/CHANGELOG.md#v1100-2023-05-25) + * **Feature**: This SDK update allows for path parameter syntax to be passed to the CreateRoute API. Path parameter syntax require parameters to be enclosed in {} characters. This update also includes a new AppendSourcePath field which lets users forward the source path to the Service URL endpoint. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.81.0](service/sagemaker/CHANGELOG.md#v1810-2023-05-25) + * **Feature**: Amazon SageMaker Automatic Model Tuning now supports enabling Autotune for tuning jobs which can choose tuning job configurations. + +# Release (2023-05-24) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appsync`: [v1.21.0](service/appsync/CHANGELOG.md#v1210-2023-05-24) + * **Feature**: This release introduces AppSync Merged APIs, which provide the ability to compose multiple source APIs into a single federated/merged API. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.56.0](service/connect/CHANGELOG.md#v1560-2023-05-24) + * **Feature**: Amazon Connect Evaluation Capabilities: validation improvements +* `github.com/aws/aws-sdk-go-v2/service/costandusagereportservice`: [v1.16.0](service/costandusagereportservice/CHANGELOG.md#v1160-2023-05-24) + * **Feature**: Add support for split cost allocation data on a report. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.80.0](service/sagemaker/CHANGELOG.md#v1800-2023-05-24) + * **Feature**: SageMaker now provides an instantaneous deployment recommendation through the DescribeModel API + +# Release (2023-05-23) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/fms`: [v1.24.0](service/fms/CHANGELOG.md#v1240-2023-05-23) + * **Feature**: Fixes issue that could cause calls to GetAdminScope and ListAdminAccountsForOrganization to return a 500 Internal Server error. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.79.0](service/sagemaker/CHANGELOG.md#v1790-2023-05-23) + * **Feature**: Added ModelNameEquals, ModelPackageVersionArnEquals in request and ModelName, SamplePayloadUrl, ModelPackageVersionArn in response of ListInferenceRecommendationsJobs API. Added Invocation timestamps in response of DescribeInferenceRecommendationsJob API & ListInferenceRecommendationsJobSteps API. +* `github.com/aws/aws-sdk-go-v2/service/translate`: [v1.18.0](service/translate/CHANGELOG.md#v1180-2023-05-23) + * **Feature**: Added support for calling TranslateDocument API. + +# Release (2023-05-22) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/backup`: [v1.22.0](service/backup/CHANGELOG.md#v1220-2023-05-22) + * **Feature**: Added support for tags on restore. +* `github.com/aws/aws-sdk-go-v2/service/pinpoint`: [v1.19.2](service/pinpoint/CHANGELOG.md#v1192-2023-05-22) + * **Documentation**: Amazon Pinpoint is deprecating the tags parameter in the UpdateSegment, UpdateCampaign, UpdateEmailTemplate, UpdateSmsTemplate, UpdatePushTemplate, UpdateInAppTemplate and UpdateVoiceTemplate. Amazon Pinpoint will end support tags parameter by May 22, 2023. +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.36.0](service/quicksight/CHANGELOG.md#v1360-2023-05-22) + * **Feature**: Add support for Asset Bundle, Geospatial Heatmaps. + +# Release (2023-05-19) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/backup`: [v1.21.0](service/backup/CHANGELOG.md#v1210-2023-05-19) + * **Feature**: Add ResourceArn, ResourceType, and BackupVaultName to ListRecoveryPointsByLegalHold API response. +* `github.com/aws/aws-sdk-go-v2/service/connectcases`: [v1.4.0](service/connectcases/CHANGELOG.md#v140-2023-05-19) + * **Feature**: This release adds the ability to create fields with type Url through the CreateField API. For more information see https://docs.aws.amazon.com/cases/latest/APIReference/Welcome.html +* `github.com/aws/aws-sdk-go-v2/service/mediapackagev2`: [v1.0.0](service/mediapackagev2/CHANGELOG.md#v100-2023-05-19) + * **Release**: New AWS service client module + * **Feature**: Adds support for the MediaPackage Live v2 API +* `github.com/aws/aws-sdk-go-v2/service/sesv2`: [v1.18.0](service/sesv2/CHANGELOG.md#v1180-2023-05-19) + * **Feature**: This release allows customers to update scaling mode property of dedicated IP pools with PutDedicatedIpPoolScalingAttributes call. + +# Release (2023-05-18) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.28.0](service/athena/CHANGELOG.md#v1280-2023-05-18) + * **Feature**: Removing SparkProperties from EngineConfiguration object for StartSession API call +* `github.com/aws/aws-sdk-go-v2/service/cloudtrail`: [v1.25.0](service/cloudtrail/CHANGELOG.md#v1250-2023-05-18) + * **Feature**: Add ConflictException to PutEventSelectors, add (Channel/EDS)ARNInvalidException to Tag APIs. These exceptions provide customers with more specific error messages instead of internal errors. +* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.24.0](service/computeoptimizer/CHANGELOG.md#v1240-2023-05-18) + * **Feature**: In this launch, we add support for showing integration status with external metric providers such as Instana, Datadog ...etc in GetEC2InstanceRecommendations and ExportEC2InstanceRecommendations apis +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.55.0](service/connect/CHANGELOG.md#v1550-2023-05-18) + * **Feature**: You can programmatically create and manage prompts using APIs, for example, to extract prompts stored within Amazon Connect and add them to your Amazon S3 bucket. AWS CloudTrail, AWS CloudFormation and tagging are supported. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.98.0](service/ec2/CHANGELOG.md#v1980-2023-05-18) + * **Feature**: Add support for i4g.large, i4g.xlarge, i4g.2xlarge, i4g.4xlarge, i4g.8xlarge and i4g.16xlarge instances powered by AWS Graviton2 processors that deliver up to 15% better compute performance than our other storage-optimized instances. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.27.1](service/ecs/CHANGELOG.md#v1271-2023-05-18) + * **Documentation**: Documentation only release to address various tickets. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.37.0](service/mediaconvert/CHANGELOG.md#v1370-2023-05-18) + * **Feature**: This release introduces a new MXF Profile for XDCAM which is strictly compliant with the SMPTE RDD 9 standard and improved handling of output name modifiers. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.44.1](service/rds/CHANGELOG.md#v1441-2023-05-18) + * **Documentation**: RDS documentation update for the EngineVersion parameter of ModifyDBSnapshot +* `github.com/aws/aws-sdk-go-v2/service/sagemakergeospatial`: [v1.3.0](service/sagemakergeospatial/CHANGELOG.md#v130-2023-05-18) + * **Feature**: This release makes ExecutionRoleArn a required field in the StartEarthObservationJob API. + +# Release (2023-05-16) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/detective`: [v1.19.0](service/detective/CHANGELOG.md#v1190-2023-05-16) + * **Feature**: Added and updated API operations in Detective to support the integration of ASFF Security Hub findings. +* `github.com/aws/aws-sdk-go-v2/service/directconnect`: [v1.18.14](service/directconnect/CHANGELOG.md#v11814-2023-05-16) + * **Documentation**: This release includes an update to the mtu value for CreateTransitVirtualInterface from 9001 mtu to 8500 mtu. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.48.0](service/glue/CHANGELOG.md#v1480-2023-05-16) + * **Feature**: Add Support for Tags for Custom Entity Types +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.19.8](service/secretsmanager/CHANGELOG.md#v1198-2023-05-16) + * **Documentation**: Documentation updates for Secrets Manager +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.32.0](service/wafv2/CHANGELOG.md#v1320-2023-05-16) + * **Feature**: My AWS Service (placeholder) - You can now rate limit web requests based on aggregation keys other than IP addresses, and you can aggregate using combinations of keys. You can also rate limit all requests that match a scope-down statement, without further aggregation. + +# Release (2023-05-15) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.27.0](service/athena/CHANGELOG.md#v1270-2023-05-15) + * **Feature**: You can now define custom spark properties at start of the session for use cases like cluster encryption, table formats, and general Spark tuning. +* `github.com/aws/aws-sdk-go-v2/service/codecatalyst`: [v1.3.0](service/codecatalyst/CHANGELOG.md#v130-2023-05-15) + * **Feature**: With this release, the users can list the active sessions connected to their Dev Environment on AWS CodeCatalyst +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.28.0](service/rekognition/CHANGELOG.md#v1280-2023-05-15) + * **Feature**: This release adds a new EyeDirection attribute in Amazon Rekognition DetectFaces and IndexFaces APIs which predicts the yaw and pitch angles of a person's eye gaze direction for each face detected in the image. +* `github.com/aws/aws-sdk-go-v2/service/rolesanywhere`: [v1.2.0](service/rolesanywhere/CHANGELOG.md#v120-2023-05-15) + * **Feature**: Adds support for custom notification settings in a trust anchor. Introduces PutNotificationSettings and ResetNotificationSettings API's. Updates DurationSeconds max value to 3600. +* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.29.0](service/transfer/CHANGELOG.md#v1290-2023-05-15) + * **Feature**: This release introduces the ability to require both password and SSH key when users authenticate to your Transfer Family servers that use the SFTP protocol. + +# Release (2023-05-11) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.54.2](service/connect/CHANGELOG.md#v1542-2023-05-11) + * **Documentation**: This release updates GetMetricDataV2 API, to support metric data up-to last 35 days +* `github.com/aws/aws-sdk-go-v2/service/elasticache`: [v1.27.0](service/elasticache/CHANGELOG.md#v1270-2023-05-11) + * **Feature**: Added support to modify the cluster mode configuration for the existing ElastiCache ReplicationGroups. Customers can now modify the configuration from cluster mode disabled to cluster mode enabled. +* `github.com/aws/aws-sdk-go-v2/service/elasticsearchservice`: [v1.19.0](service/elasticsearchservice/CHANGELOG.md#v1190-2023-05-11) + * **Feature**: This release fixes DescribePackages API error with null filter value parameter. +* `github.com/aws/aws-sdk-go-v2/service/health`: [v1.17.0](service/health/CHANGELOG.md#v1170-2023-05-11) + * **Feature**: Add support for regional endpoints +* `github.com/aws/aws-sdk-go-v2/service/ivsrealtime`: [v1.2.0](service/ivsrealtime/CHANGELOG.md#v120-2023-05-11) + * **Feature**: Add methods for inspecting and debugging stages: ListStageSessions, GetStageSession, ListParticipants, GetParticipant, and ListParticipantEvents. +* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.4.0](service/omics/CHANGELOG.md#v140-2023-05-11) + * **Feature**: This release provides support for Ready2Run and GPU workflows, an improved read set filter, the direct upload of read sets into Omics Storage, and annotation parsing for analytics stores. +* `github.com/aws/aws-sdk-go-v2/service/support`: [v1.15.0](service/support/CHANGELOG.md#v1150-2023-05-11) + * **Feature**: This release adds 2 new Support APIs, DescribeCreateCaseOptions and DescribeSupportedLanguages. You can use these new APIs to get available support languages. + +# Release (2023-05-10) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.25.0](service/emr/CHANGELOG.md#v1250-2023-05-10) + * **Feature**: EMR Studio now supports programmatically executing a Notebooks on an EMR on EKS cluster. In addition, notebooks can now be executed by specifying its location in S3. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.44.0](service/rds/CHANGELOG.md#v1440-2023-05-10) + * **Feature**: Amazon Relational Database Service (RDS) updates for the new Aurora I/O-Optimized storage type for Amazon Aurora DB clusters +* `github.com/aws/aws-sdk-go-v2/service/swf`: [v1.15.0](service/swf/CHANGELOG.md#v1150-2023-05-10) + * **Feature**: This release adds a new API parameter to exclude old history events from decision tasks. + +# Release (2023-05-09) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/applicationautoscaling`: [v1.20.0](service/applicationautoscaling/CHANGELOG.md#v1200-2023-05-09) + * **Feature**: With this release, Amazon SageMaker Serverless Inference customers can use Application Auto Scaling to auto scale the provisioned concurrency of their serverless endpoints. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.47.0](service/glue/CHANGELOG.md#v1470-2023-05-09) + * **Feature**: This release adds AmazonRedshift Source and Target nodes in addition to DynamicTransform OutputSchemas +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.78.0](service/sagemaker/CHANGELOG.md#v1780-2023-05-09) + * **Feature**: This release includes support for (1) Provisioned Concurrency for Amazon SageMaker Serverless Inference and (2) UpdateEndpointWeightsAndCapacities API for Serverless endpoints. + +# Release (2023-05-08) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.46.0](service/glue/CHANGELOG.md#v1460-2023-05-08) + * **Feature**: Support large worker types G.4x and G.8x for Glue Spark +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.23.0](service/guardduty/CHANGELOG.md#v1230-2023-05-08) + * **Feature**: Add AccessDeniedException 403 Error message code to support 3 Tagging related APIs +* `github.com/aws/aws-sdk-go-v2/service/iotsitewise`: [v1.29.0](service/iotsitewise/CHANGELOG.md#v1290-2023-05-08) + * **Feature**: Provide support for 20,000 max results for GetAssetPropertyValueHistory/BatchGetAssetPropertyValueHistory and 15 minute aggregate resolution for GetAssetPropertyAggregates/BatchGetAssetPropertyAggregates +* `github.com/aws/aws-sdk-go-v2/service/sts`: [v1.19.0](service/sts/CHANGELOG.md#v1190-2023-05-08) + * **Feature**: Documentation updates for AWS Security Token Service. + +# Release (2023-05-05) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.97.0](service/ec2/CHANGELOG.md#v1970-2023-05-05) + * **Feature**: This release adds support the inf2 and trn1n instances. inf2 instances are purpose built for deep learning inference while trn1n instances are powered by AWS Trainium accelerators and they build on the capabilities of Trainium-powered trn1 instances. +* `github.com/aws/aws-sdk-go-v2/service/inspector2`: [v1.13.0](service/inspector2/CHANGELOG.md#v1130-2023-05-05) + * **Feature**: Amazon Inspector now allows customers to search its vulnerability intelligence database if any of the Inspector scanning types are activated. +* `github.com/aws/aws-sdk-go-v2/service/mediatailor`: [v1.23.0](service/mediatailor/CHANGELOG.md#v1230-2023-05-05) + * **Feature**: This release adds support for AFTER_LIVE_EDGE mode configuration for avail suppression, and adding a fill-policy setting that sets the avail suppression to PARTIAL_AVAIL or FULL_AVAIL_ONLY when AFTER_LIVE_EDGE is enabled. +* `github.com/aws/aws-sdk-go-v2/service/sqs`: [v1.22.0](service/sqs/CHANGELOG.md#v1220-2023-05-05) + * **Feature**: Revert previous SQS protocol change. + +# Release (2023-05-04) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudwatch`: [v1.26.0](service/cloudwatch/CHANGELOG.md#v1260-2023-05-04) + * **Feature**: Adds support for filtering by metric names in CloudWatch Metric Streams. +* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.32.0](service/configservice/CHANGELOG.md#v1320-2023-05-04) + * **Feature**: Updated ResourceType enum with new resource types onboarded by AWS Config in April 2023. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.54.1](service/connect/CHANGELOG.md#v1541-2023-05-04) + * **Documentation**: Remove unused InvalidParameterException from CreateParticipant API +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.27.0](service/ecs/CHANGELOG.md#v1270-2023-05-04) + * **Feature**: Documentation update for new error type NamespaceNotFoundException for CreateCluster and UpdateCluster +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.28.0](service/networkfirewall/CHANGELOG.md#v1280-2023-05-04) + * **Feature**: This release adds support for the Suricata REJECT option in midstream exception configurations. +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.17.0](service/opensearch/CHANGELOG.md#v1170-2023-05-04) + * **Feature**: DescribeDomainNodes: A new API that provides configuration information for nodes part of the domain +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.35.0](service/quicksight/CHANGELOG.md#v1350-2023-05-04) + * **Feature**: Add support for Topic, Dataset parameters and VPC +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.27.0](service/rekognition/CHANGELOG.md#v1270-2023-05-04) + * **Feature**: This release adds a new attribute FaceOccluded. Additionally, you can now select attributes individually (e.g. ["DEFAULT", "FACE_OCCLUDED", "AGE_RANGE"] instead of ["ALL"]), which can reduce response time. +* `github.com/aws/aws-sdk-go-v2/service/s3`: [v1.33.1](service/s3/CHANGELOG.md#v1331-2023-05-04) + * **Documentation**: Documentation updates for Amazon S3 +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.77.0](service/sagemaker/CHANGELOG.md#v1770-2023-05-04) + * **Feature**: We added support for ml.inf2 and ml.trn1 family of instances on Amazon SageMaker for deploying machine learning (ML) models for Real-time and Asynchronous inference. You can use these instances to achieve high performance at a low cost for generative artificial intelligence (AI) models. +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.31.0](service/securityhub/CHANGELOG.md#v1310-2023-05-04) + * **Feature**: Add support for Finding History. +* `github.com/aws/aws-sdk-go-v2/service/sqs`: [v1.21.0](service/sqs/CHANGELOG.md#v1210-2023-05-04) + * **Feature**: This release enables customers to call SQS using AWS JSON-1.0 protocol. + +# Release (2023-05-03) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appsync`: [v1.20.0](service/appsync/CHANGELOG.md#v1200-2023-05-03) + * **Feature**: Private API support for AWS AppSync. With Private APIs, you can now create GraphQL APIs that can only be accessed from your Amazon Virtual Private Cloud ("VPC"). +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.96.0](service/ec2/CHANGELOG.md#v1960-2023-05-03) + * **Feature**: Adds an SDK paginator for GetNetworkInsightsAccessScopeAnalysisFindings +* `github.com/aws/aws-sdk-go-v2/service/inspector2`: [v1.12.0](service/inspector2/CHANGELOG.md#v1120-2023-05-03) + * **Feature**: This feature provides deep inspection for linux based instance +* `github.com/aws/aws-sdk-go-v2/service/iottwinmaker`: [v1.12.0](service/iottwinmaker/CHANGELOG.md#v1120-2023-05-03) + * **Feature**: This release adds a field for GetScene API to return error code and message from dependency services. +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.27.0](service/networkfirewall/CHANGELOG.md#v1270-2023-05-03) + * **Feature**: AWS Network Firewall now supports policy level HOME_NET variable overrides. +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.16.0](service/opensearch/CHANGELOG.md#v1160-2023-05-03) + * **Feature**: Amazon OpenSearch Service adds the option to deploy a domain across multiple Availability Zones, with each AZ containing a complete copy of data and with nodes in one AZ acting as a standby. This option provides 99.99% availability and consistent performance in the event of infrastructure failure. +* `github.com/aws/aws-sdk-go-v2/service/wellarchitected`: [v1.20.0](service/wellarchitected/CHANGELOG.md#v1200-2023-05-03) + * **Feature**: This release deepens integration with AWS Service Catalog AppRegistry to improve workload resource discovery. + +# Release (2023-05-02) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.29.0](service/appflow/CHANGELOG.md#v1290-2023-05-02) + * **Feature**: This release adds new API to cancel flow executions. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.54.0](service/connect/CHANGELOG.md#v1540-2023-05-02) + * **Feature**: Amazon Connect Service Rules API update: Added OnContactEvaluationSubmit event source to support user configuring evaluation form rules. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.26.3](service/ecs/CHANGELOG.md#v1263-2023-05-02) + * **Documentation**: Documentation only update to address Amazon ECS tickets. +* `github.com/aws/aws-sdk-go-v2/service/kendra`: [v1.40.0](service/kendra/CHANGELOG.md#v1400-2023-05-02) + * **Feature**: AWS Kendra now supports configuring document fields/attributes via the GetQuerySuggestions API. You can now base query suggestions on the contents of document fields. +* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.11.0](service/resiliencehub/CHANGELOG.md#v1110-2023-05-02) + * **Feature**: This release will improve resource level transparency in applications by discovering previously hidden resources. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.76.0](service/sagemaker/CHANGELOG.md#v1760-2023-05-02) + * **Feature**: Amazon Sagemaker Autopilot supports training models with sample weights and additional objective metrics. + +# Release (2023-05-01) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.23.0](service/computeoptimizer/CHANGELOG.md#v1230-2023-05-01) + * **Feature**: support for tag filtering within compute optimizer. ability to filter recommendation results by tag and tag key value pairs. ability to filter by inferred workload type added. +* `github.com/aws/aws-sdk-go-v2/service/kms`: [v1.21.0](service/kms/CHANGELOG.md#v1210-2023-05-01) + * **Feature**: This release makes the NitroEnclave request parameter Recipient and the response field for CiphertextForRecipient available in AWS SDKs. It also adds the regex pattern for CloudHsmClusterId validation. + +# Release (2023-04-28) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.28.0](service/appflow/CHANGELOG.md#v1280-2023-04-28) + * **Feature**: Adds Jwt Support for Salesforce Credentials. +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.26.0](service/athena/CHANGELOG.md#v1260-2023-04-28) + * **Feature**: You can now use capacity reservations on Amazon Athena to run SQL queries on fully-managed compute capacity. +* `github.com/aws/aws-sdk-go-v2/service/directconnect`: [v1.18.12](service/directconnect/CHANGELOG.md#v11812-2023-04-28) + * **Documentation**: This release corrects the jumbo frames MTU from 9100 to 8500. +* `github.com/aws/aws-sdk-go-v2/service/efs`: [v1.20.0](service/efs/CHANGELOG.md#v1200-2023-04-28) + * **Feature**: This release adds PAUSED and PAUSING state as a returned value for DescribeReplicationConfigurations response. +* `github.com/aws/aws-sdk-go-v2/service/grafana`: [v1.13.0](service/grafana/CHANGELOG.md#v1130-2023-04-28) + * **Feature**: This release adds support for the grafanaVersion parameter in CreateWorkspace. +* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.37.0](service/iot/CHANGELOG.md#v1370-2023-04-28) + * **Feature**: This release allows AWS IoT Core users to specify a TLS security policy when creating and updating AWS IoT Domain Configurations. +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.26.0](service/rekognition/CHANGELOG.md#v1260-2023-04-28) + * **Feature**: Added support for aggregating moderation labels by video segment timestamps for Stored Video Content Moderation APIs and added additional information about the job to all Stored Video Get API responses. +* `github.com/aws/aws-sdk-go-v2/service/simspaceweaver`: [v1.2.0](service/simspaceweaver/CHANGELOG.md#v120-2023-04-28) + * **Feature**: Added a new CreateSnapshot API. For the StartSimulation API, SchemaS3Location is now optional, added a new SnapshotS3Location parameter. For the DescribeSimulation API, added SNAPSHOT_IN_PROGRESS simulation state, deprecated SchemaError, added new fields: StartError and SnapshotS3Location. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.31.0](service/wafv2/CHANGELOG.md#v1310-2023-04-28) + * **Feature**: You can now associate a web ACL with a Verified Access instance. +* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.28.11](service/workspaces/CHANGELOG.md#v12811-2023-04-28) + * **Documentation**: Added Windows 11 to support Microsoft_Office_2019 + +# Release (2023-04-27) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.95.0](service/ec2/CHANGELOG.md#v1950-2023-04-27) + * **Feature**: This release adds support for AMD SEV-SNP on EC2 instances. +* `github.com/aws/aws-sdk-go-v2/service/emrcontainers`: [v1.18.0](service/emrcontainers/CHANGELOG.md#v1180-2023-04-27) + * **Feature**: This release adds GetManagedEndpointSessionCredentials, a new API that allows customers to generate an auth token to connect to a managed endpoint, enabling features such as self-hosted Jupyter notebooks for EMR on EKS. +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.22.0](service/guardduty/CHANGELOG.md#v1220-2023-04-27) + * **Feature**: Added API support to initiate on-demand malware scan on specific resources. +* `github.com/aws/aws-sdk-go-v2/service/iotdeviceadvisor`: [v1.18.0](service/iotdeviceadvisor/CHANGELOG.md#v1180-2023-04-27) + * **Feature**: AWS IoT Core Device Advisor now supports MQTT over WebSocket. With this update, customers can run all three test suites of AWS IoT Core Device Advisor - qualification, custom, and long duration tests - using Signature Version 4 for MQTT over WebSocket. +* `github.com/aws/aws-sdk-go-v2/service/kafka`: [v1.20.0](service/kafka/CHANGELOG.md#v1200-2023-04-27) + * **Feature**: Amazon MSK has added new APIs that allows multi-VPC private connectivity and cluster policy support for Amazon MSK clusters that simplify connectivity and access between your Apache Kafka clients hosted in different VPCs and AWS accounts and your Amazon MSK clusters. +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.34.0](service/lambda/CHANGELOG.md#v1340-2023-04-27) + * **Feature**: Add Java 17 (java17) support to AWS Lambda +* `github.com/aws/aws-sdk-go-v2/service/osis`: [v1.0.1](service/osis/CHANGELOG.md#v101-2023-04-27) + * **Documentation**: Documentation updates for OpenSearch Ingestion +* `github.com/aws/aws-sdk-go-v2/service/qldb`: [v1.15.10](service/qldb/CHANGELOG.md#v11510-2023-04-27) + * **Documentation**: Documentation updates for Amazon QLDB +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.75.0](service/sagemaker/CHANGELOG.md#v1750-2023-04-27) + * **Feature**: Added ml.p4d.24xlarge and ml.p4de.24xlarge as supported instances for SageMaker Studio + +# Release (2023-04-26) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/osis`: [v1.0.0](service/osis/CHANGELOG.md#v100-2023-04-26) + * **Release**: New AWS service client module + * **Feature**: Initial release for OpenSearch Ingestion + +# Release (2023-04-25) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmessaging`: [v1.15.0](service/chimesdkmessaging/CHANGELOG.md#v1150-2023-04-25) + * **Feature**: Remove non actionable field from UpdateChannelReadMarker and DeleteChannelRequest. Add precise exceptions to DeleteChannel and DeleteStreamingConfigurations error cases. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.53.0](service/connect/CHANGELOG.md#v1530-2023-04-25) + * **Feature**: Amazon Connect, Contact Lens Evaluation API release including ability to manage forms and to submit contact evaluations. +* `github.com/aws/aws-sdk-go-v2/service/datasync`: [v1.24.0](service/datasync/CHANGELOG.md#v1240-2023-04-25) + * **Feature**: This release adds 13 new APIs to support AWS DataSync Discovery GA. +* `github.com/aws/aws-sdk-go-v2/service/directoryservice`: [v1.17.0](service/directoryservice/CHANGELOG.md#v1170-2023-04-25) + * **Feature**: New field added in AWS Managed Microsoft AD DescribeSettings response and regex pattern update for UpdateSettings value. Added length validation to RemoteDomainName. +* `github.com/aws/aws-sdk-go-v2/service/pinpoint`: [v1.19.0](service/pinpoint/CHANGELOG.md#v1190-2023-04-25) + * **Feature**: Adds support for journey runs and querying journey execution metrics based on journey runs. Adds execution metrics to campaign activities. Updates docs for Advanced Quiet Time. + +# Release (2023-04-24) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2`: v1.18.0 + * **Feature**: add recursion detection middleware to all SDK requests to avoid recursion invocation in Lambda +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.27.0](service/appflow/CHANGELOG.md#v1270-2023-04-24) + * **Feature**: Increased the max length for RefreshToken and AuthCode from 2048 to 4096. +* `github.com/aws/aws-sdk-go-v2/service/codecatalyst`: [v1.2.5](service/codecatalyst/CHANGELOG.md#v125-2023-04-24) + * **Documentation**: Documentation updates for Amazon CodeCatalyst. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.94.0](service/ec2/CHANGELOG.md#v1940-2023-04-24) + * **Feature**: API changes to AWS Verified Access related to identity providers' information. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.36.0](service/mediaconvert/CHANGELOG.md#v1360-2023-04-24) + * **Feature**: This release introduces a noise reduction pre-filter, linear interpolation deinterlace mode, video pass-through, updated default job settings, and expanded LC-AAC Stereo audio bitrate ranges. +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.25.0](service/rekognition/CHANGELOG.md#v1250-2023-04-24) + * **Feature**: Added new status result to Liveness session status. +* `github.com/aws/aws-sdk-go-v2/service/route53`: [v1.28.0](service/route53/CHANGELOG.md#v1280-2023-04-24) + * **Feature**: added paginator for listResourceRecordSets +* `github.com/aws/aws-sdk-go-v2/service/s3`: [v1.33.0](service/s3/CHANGELOG.md#v1330-2023-04-24) + * **Feature**: added custom paginators for listMultipartUploads and ListObjectVersions + +# Release (2023-04-21) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.52.0](service/connect/CHANGELOG.md#v1520-2023-04-21) + * **Feature**: This release adds a new API CreateParticipant. For Amazon Connect Chat, you can use this new API to customize chat flow experiences. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.26.1](service/ecs/CHANGELOG.md#v1261-2023-04-21) + * **Documentation**: Documentation update to address various Amazon ECS tickets. +* `github.com/aws/aws-sdk-go-v2/service/fms`: [v1.23.0](service/fms/CHANGELOG.md#v1230-2023-04-21) + * **Feature**: AWS Firewall Manager adds support for multiple administrators. You can now delegate more than one administrator per organization. + +# Release (2023-04-20) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/chime`: [v1.23.0](service/chime/CHANGELOG.md#v1230-2023-04-20) + * **Feature**: Adds support for Hindi and Thai languages and additional Amazon Transcribe parameters to the StartMeetingTranscription API. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines`: [v1.4.0](service/chimesdkmediapipelines/CHANGELOG.md#v140-2023-04-20) + * **Feature**: This release adds support for specifying the recording file format in an S3 recording sink configuration. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmeetings`: [v1.15.0](service/chimesdkmeetings/CHANGELOG.md#v1150-2023-04-20) + * **Feature**: Adds support for Hindi and Thai languages and additional Amazon Transcribe parameters to the StartMeetingTranscription API. +* `github.com/aws/aws-sdk-go-v2/service/gamelift`: [v1.18.0](service/gamelift/CHANGELOG.md#v1180-2023-04-20) + * **Feature**: Amazon GameLift supports creating Builds for Windows 2016 operating system. +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.21.0](service/guardduty/CHANGELOG.md#v1210-2023-04-20) + * **Feature**: This release adds support for the new Lambda Protection feature. +* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.36.0](service/iot/CHANGELOG.md#v1360-2023-04-20) + * **Feature**: Support additional OTA states in GetOTAUpdate API +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.74.0](service/sagemaker/CHANGELOG.md#v1740-2023-04-20) + * **Feature**: Amazon SageMaker Canvas adds ModelRegisterSettings support for CanvasAppSettings. +* `github.com/aws/aws-sdk-go-v2/service/snowball`: [v1.19.0](service/snowball/CHANGELOG.md#v1190-2023-04-20) + * **Feature**: Adds support for Amazon S3 compatible storage. AWS Snow Family customers can now use Amazon S3 compatible storage on Snowball Edge devices. Also adds support for V3_5S. This is a refreshed AWS Snowball Edge Storage Optimized device type with 210TB SSD (customer usable). +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.30.0](service/wafv2/CHANGELOG.md#v1300-2023-04-20) + * **Feature**: You can now create encrypted API keys to use in a client application integration of the JavaScript CAPTCHA API . You can also retrieve a list of your API keys and the JavaScript application integration URL. + +# Release (2023-04-19) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/comprehend`: [v1.24.0](service/comprehend/CHANGELOG.md#v1240-2023-04-19) + * **Feature**: This release supports native document models for custom classification, in addition to plain-text models. You train native document models using documents (PDF, Word, images) in their native format. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.26.0](service/ecs/CHANGELOG.md#v1260-2023-04-19) + * **Feature**: This release supports the Account Setting "TagResourceAuthorization" that allows for enhanced Tagging security controls. +* `github.com/aws/aws-sdk-go-v2/service/ram`: [v1.18.0](service/ram/CHANGELOG.md#v1180-2023-04-19) + * **Feature**: This release adds support for customer managed permissions. Customer managed permissions enable customers to author and manage tailored permissions for resources shared using RAM. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.43.1](service/rds/CHANGELOG.md#v1431-2023-04-19) + * **Documentation**: Adds support for the ImageId parameter of CreateCustomDBEngineVersion to RDS Custom for Oracle +* `github.com/aws/aws-sdk-go-v2/service/s3`: [v1.32.0](service/s3/CHANGELOG.md#v1320-2023-04-19) + * **Feature**: Provides support for "Snow" Storage class. +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.19.4](service/secretsmanager/CHANGELOG.md#v1194-2023-04-19) + * **Documentation**: Documentation updates for Secrets Manager + +# Release (2023-04-17) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.26.0](service/appflow/CHANGELOG.md#v1260-2023-04-17) + * **Feature**: This release adds a Client Token parameter to the following AppFlow APIs: Create/Update Connector Profile, Create/Update Flow, Start Flow, Register Connector, Update Connector Registration. The Client Token parameter allows idempotent operations for these APIs. +* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.13.0](service/drs/CHANGELOG.md#v1130-2023-04-17) + * **Feature**: Changed existing APIs and added new APIs to support using an account-level launch configuration template with AWS Elastic Disaster Recovery. +* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.19.5](service/dynamodb/CHANGELOG.md#v1195-2023-04-17) + * **Documentation**: Documentation updates for DynamoDB API +* `github.com/aws/aws-sdk-go-v2/service/emrserverless`: [v1.7.0](service/emrserverless/CHANGELOG.md#v170-2023-04-17) + * **Feature**: The GetJobRun API has been updated to include the job's billed resource utilization. This utilization shows the aggregate vCPU, memory and storage that AWS has billed for the job run. The billed resources include a 1-minute minimum usage for workers, plus additional storage over 20 GB per worker. +* `github.com/aws/aws-sdk-go-v2/service/internetmonitor`: [v1.2.0](service/internetmonitor/CHANGELOG.md#v120-2023-04-17) + * **Feature**: This release includes a new configurable value, TrafficPercentageToMonitor, which allows users to adjust the amount of traffic monitored by percentage +* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.27.0](service/iotwireless/CHANGELOG.md#v1270-2023-04-17) + * **Feature**: Supports the new feature of LoRaWAN roaming, allows to configure MaxEirp for LoRaWAN gateway, and allows to configure PingSlotPeriod for LoRaWAN multicast group +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.33.0](service/lambda/CHANGELOG.md#v1330-2023-04-17) + * **Feature**: Add Python 3.10 (python3.10) support to AWS Lambda + +# Release (2023-04-14) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.25.1](service/ecs/CHANGELOG.md#v1251-2023-04-14) + * **Documentation**: This release supports ephemeral storage for AWS Fargate Windows containers. +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.32.0](service/lambda/CHANGELOG.md#v1320-2023-04-14) + * **Feature**: This release adds SnapStart related exceptions to InvokeWithResponseStream API. IAM access related documentation is also added for this API. +* `github.com/aws/aws-sdk-go-v2/service/migrationhubrefactorspaces`: [v1.9.8](service/migrationhubrefactorspaces/CHANGELOG.md#v198-2023-04-14) + * **Documentation**: Doc only update for Refactor Spaces environments without network bridge feature. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.43.0](service/rds/CHANGELOG.md#v1430-2023-04-14) + * **Feature**: This release adds support of modifying the engine mode of database clusters. + +# Release (2023-04-13) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.5.0](service/chimesdkvoice/CHANGELOG.md#v150-2023-04-13) + * **Feature**: This release adds tagging support for Voice Connectors and SIP Media Applications +* `github.com/aws/aws-sdk-go-v2/service/mediaconnect`: [v1.19.0](service/mediaconnect/CHANGELOG.md#v1190-2023-04-13) + * **Feature**: Gateway is a new feature of AWS Elemental MediaConnect. Gateway allows the deployment of on-premises resources for the purpose of transporting live video to and from the AWS Cloud. + +# Release (2023-04-12) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.18.0](service/groundstation/CHANGELOG.md#v1180-2023-04-12) + * **Feature**: AWS Ground Station Wideband DigIF GA Release +* `github.com/aws/aws-sdk-go-v2/service/managedblockchain`: [v1.15.5](service/managedblockchain/CHANGELOG.md#v1155-2023-04-12) + * **Documentation**: Removal of the Ropsten network. The Ethereum foundation ceased support of Ropsten on December 31st, 2022.. + +# Release (2023-04-11) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ecrpublic`: [v1.16.0](service/ecrpublic/CHANGELOG.md#v1160-2023-04-11) + * **Feature**: This release will allow using registry alias as registryId in BatchDeleteImage request. +* `github.com/aws/aws-sdk-go-v2/service/emrserverless`: [v1.6.0](service/emrserverless/CHANGELOG.md#v160-2023-04-11) + * **Feature**: This release extends GetJobRun API to return job run timeout (executionTimeoutMinutes) specified during StartJobRun call (or default timeout of 720 minutes if none was specified). +* `github.com/aws/aws-sdk-go-v2/service/eventbridge`: [v1.19.0](service/eventbridge/CHANGELOG.md#v1190-2023-04-11) + * **Feature**: EventBridge PutTarget support for multiple SQL arguments on RedshiftDataParameters +* `github.com/aws/aws-sdk-go-v2/service/iotdataplane`: [v1.15.0](service/iotdataplane/CHANGELOG.md#v1150-2023-04-11) + * **Feature**: This release adds support for MQTT5 user properties when calling the AWS IoT GetRetainedMessage API +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.29.0](service/wafv2/CHANGELOG.md#v1290-2023-04-11) + * **Feature**: For web ACLs that protect CloudFront protections, the default request body inspection size is now 16 KB, and you can use the new association configuration to increase the inspection size further, up to 64 KB. Sizes over 16 KB can incur additional costs. + +# Release (2023-04-10) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.51.0](service/connect/CHANGELOG.md#v1510-2023-04-10) + * **Feature**: This release adds the ability to configure an agent's routing profile to receive contacts from multiple channels at the same time via extending the UpdateRoutingProfileConcurrency, CreateRoutingProfile and DescribeRoutingProfile APIs. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.25.0](service/ecs/CHANGELOG.md#v1250-2023-04-10) + * **Feature**: This release adds support for enabling FIPS compliance on Amazon ECS Fargate tasks +* `github.com/aws/aws-sdk-go-v2/service/marketplacecatalog`: [v1.16.0](service/marketplacecatalog/CHANGELOG.md#v1160-2023-04-10) + * **Feature**: Added three new APIs to support resource sharing: GetResourcePolicy, PutResourcePolicy, and DeleteResourcePolicy. Added new OwnershipType field to ListEntities request to let users filter on entities that are shared with them. Increased max page size of ListEntities response from 20 to 50 results. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.35.0](service/mediaconvert/CHANGELOG.md#v1350-2023-04-10) + * **Feature**: AWS Elemental MediaConvert SDK now supports conversion of 608 paint-on captions to pop-on captions for SCC sources. +* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.3.0](service/omics/CHANGELOG.md#v130-2023-04-10) + * **Feature**: Remove unexpected API changes. +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.24.0](service/rekognition/CHANGELOG.md#v1240-2023-04-10) + * **Feature**: This release adds support for Face Liveness APIs in Amazon Rekognition. Updates UpdateStreamProcessor to return ResourceInUseException Exception. Minor updates to API documentation. + +# Release (2023-04-07) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/dlm`: [v1.15.0](service/dlm/CHANGELOG.md#v1150-2023-04-07) + * **Announcement**: This release includes breaking changes for the timestamp trait on the data lifecycle management client. + * **Feature**: Updated timestamp format for GetLifecyclePolicy API + * **Bug Fix**: Correct timestamp type for data lifecycle manager. +* `github.com/aws/aws-sdk-go-v2/service/docdb`: [v1.21.0](service/docdb/CHANGELOG.md#v1210-2023-04-07) + * **Feature**: This release adds a new parameter 'DBClusterParameterGroupName' to 'RestoreDBClusterFromSnapshot' API to associate the name of the DB cluster parameter group while performing restore. +* `github.com/aws/aws-sdk-go-v2/service/fsx`: [v1.28.8](service/fsx/CHANGELOG.md#v1288-2023-04-07) + * **Documentation**: Amazon FSx for Lustre now supports creating data repository associations on Persistent_1 and Scratch_2 file systems. +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.31.0](service/lambda/CHANGELOG.md#v1310-2023-04-07) + * **Feature**: This release adds a new Lambda InvokeWithResponseStream API to support streaming Lambda function responses. The release also adds a new InvokeMode parameter to Function Url APIs to control whether the response will be streamed or buffered. +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.34.0](service/quicksight/CHANGELOG.md#v1340-2023-04-07) + * **Feature**: This release has two changes: adding the OR condition to tag-based RLS rules in CreateDataSet and UpdateDataSet; adding RefreshSchedule and Incremental RefreshProperties operations for users to programmatically configure SPICE dataset ingestions. +* `github.com/aws/aws-sdk-go-v2/service/redshiftdata`: [v1.19.3](service/redshiftdata/CHANGELOG.md#v1193-2023-04-07) + * **Documentation**: Update documentation of API descriptions as needed in support of temporary credentials with IAM identity. +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.18.1](service/servicecatalog/CHANGELOG.md#v1181-2023-04-07) + * **Documentation**: Updates description for property + +# Release (2023-04-06) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.27.0](service/cloudformation/CHANGELOG.md#v1270-2023-04-06) + * **Feature**: Including UPDATE_COMPLETE as a failed status for DeleteStack waiter. +* `github.com/aws/aws-sdk-go-v2/service/greengrassv2`: [v1.22.0](service/greengrassv2/CHANGELOG.md#v1220-2023-04-06) + * **Feature**: Add support for SUCCEEDED value in coreDeviceExecutionStatus field. Documentation updates for Greengrass V2. +* `github.com/aws/aws-sdk-go-v2/service/proton`: [v1.21.0](service/proton/CHANGELOG.md#v1210-2023-04-06) + * **Feature**: This release adds support for the AWS Proton service sync feature. Service sync enables managing an AWS Proton service (creating and updating instances) and all of it's corresponding service instances from a Git repository. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.42.1](service/rds/CHANGELOG.md#v1421-2023-04-06) + * **Documentation**: Adds and updates the SDK examples + +# Release (2023-04-05) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.31.0](service/configservice/CHANGELOG.md#v1310-2023-04-05) + * **Feature**: This release adds resourceType enums for types released in March 2023. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.24.3](service/ecs/CHANGELOG.md#v1243-2023-04-05) + * **Documentation**: This is a document only updated to add information about Amazon Elastic Inference (EI). +* `github.com/aws/aws-sdk-go-v2/service/identitystore`: [v1.16.7](service/identitystore/CHANGELOG.md#v1167-2023-04-05) + * **Documentation**: Documentation updates for Identity Store CLI command reference. +* `github.com/aws/aws-sdk-go-v2/service/ivsrealtime`: [v1.1.0](service/ivsrealtime/CHANGELOG.md#v110-2023-04-05) + * **Feature**: Fix ParticipantToken ExpirationTime format +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.26.0](service/networkfirewall/CHANGELOG.md#v1260-2023-04-05) + * **Feature**: AWS Network Firewall now supports IPv6-only subnets. +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.18.0](service/servicecatalog/CHANGELOG.md#v1180-2023-04-05) + * **Feature**: removed incorrect product type value +* `github.com/aws/aws-sdk-go-v2/service/vpclattice`: [v1.0.1](service/vpclattice/CHANGELOG.md#v101-2023-04-05) + * **Documentation**: This release removes the entities in the API doc model package for auth policies. + +# Release (2023-04-04) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/amplifyuibuilder`: [v1.10.0](service/amplifyuibuilder/CHANGELOG.md#v1100-2023-04-04) + * **Feature**: Support StorageField and custom displays for data-bound options in form builder. Support non-string operands for predicates in collections. Support choosing client to get token from. +* `github.com/aws/aws-sdk-go-v2/service/autoscaling`: [v1.28.1](service/autoscaling/CHANGELOG.md#v1281-2023-04-04) + * **Documentation**: Documentation updates for Amazon EC2 Auto Scaling +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.93.0](service/ec2/CHANGELOG.md#v1930-2023-04-04) + * **Feature**: C6in, M6in, M6idn, R6in and R6idn bare metal instances are powered by 3rd Generation Intel Xeon Scalable processors and offer up to 200 Gbps of network bandwidth. +* `github.com/aws/aws-sdk-go-v2/service/elasticinference`: [v1.13.0](service/elasticinference/CHANGELOG.md#v1130-2023-04-04) + * **Feature**: Updated public documentation for the Describe and Tagging APIs. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.73.0](service/sagemaker/CHANGELOG.md#v1730-2023-04-04) + * **Feature**: Amazon SageMaker Asynchronous Inference now allows customer's to receive failure model responses in S3 and receive success/failure model responses in SNS notifications. +* `github.com/aws/aws-sdk-go-v2/service/sagemakerruntime`: [v1.19.0](service/sagemakerruntime/CHANGELOG.md#v1190-2023-04-04) + * **Feature**: Amazon SageMaker Asynchronous Inference now provides customers a FailureLocation as a response parameter in InvokeEndpointAsync API to capture the model failure responses. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.28.0](service/wafv2/CHANGELOG.md#v1280-2023-04-04) + * **Feature**: This release rolls back association config feature for webACLs that protect CloudFront protections. + +# Release (2023-04-03) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.45.0](service/glue/CHANGELOG.md#v1450-2023-04-03) + * **Feature**: Add support for database-level federation +* `github.com/aws/aws-sdk-go-v2/service/lakeformation`: [v1.21.0](service/lakeformation/CHANGELOG.md#v1210-2023-04-03) + * **Feature**: Add support for database-level federation +* `github.com/aws/aws-sdk-go-v2/service/licensemanager`: [v1.18.0](service/licensemanager/CHANGELOG.md#v1180-2023-04-03) + * **Feature**: This release adds grant override options to the CreateGrantVersion API. These options can be used to specify grant replacement behavior during grant activation. +* `github.com/aws/aws-sdk-go-v2/service/mwaa`: [v1.15.0](service/mwaa/CHANGELOG.md#v1150-2023-04-03) + * **Feature**: This Amazon MWAA release adds the ability to customize the Apache Airflow environment by launching a shell script at startup. This shell script is hosted in your environment's Amazon S3 bucket. Amazon MWAA runs the script before installing requirements and initializing the Apache Airflow process. +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.17.0](service/servicecatalog/CHANGELOG.md#v1170-2023-04-03) + * **Feature**: This release introduces Service Catalog support for Terraform open source. It enables 1. The notify* APIs to Service Catalog. These APIs are used by the terraform engine to notify the result of the provisioning engine execution. 2. Adds a new TERRAFORM_OPEN_SOURCE product type in CreateProduct API. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.27.0](service/wafv2/CHANGELOG.md#v1270-2023-04-03) + * **Feature**: For web ACLs that protect CloudFront protections, the default request body inspection size is now 16 KB, and you can use the new association configuration to increase the inspection size further, up to 64 KB. Sizes over 16 KB can incur additional costs. + +# Release (2023-03-31) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.92.1](service/ec2/CHANGELOG.md#v1921-2023-03-31) + * **Documentation**: Documentation updates for EC2 On Demand Capacity Reservations +* `github.com/aws/aws-sdk-go-v2/service/internetmonitor`: [v1.1.0](service/internetmonitor/CHANGELOG.md#v110-2023-03-31) + * **Feature**: This release adds a new feature for Amazon CloudWatch Internet Monitor that enables customers to deliver internet measurements to Amazon S3 buckets as well as CloudWatch Logs. +* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.10.1](service/resiliencehub/CHANGELOG.md#v1101-2023-03-31) + * **Documentation**: Adding EKS related documentation for appTemplateBody +* `github.com/aws/aws-sdk-go-v2/service/s3`: [v1.31.1](service/s3/CHANGELOG.md#v1311-2023-03-31) + * **Documentation**: Documentation updates for Amazon S3 +* `github.com/aws/aws-sdk-go-v2/service/sagemakerfeaturestoreruntime`: [v1.14.0](service/sagemakerfeaturestoreruntime/CHANGELOG.md#v1140-2023-03-31) + * **Feature**: In this release, you can now chose between soft delete and hard delete when calling the DeleteRecord API, so you have more flexibility when it comes to managing online store data. + +# Release (2023-03-30) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.25.0](service/athena/CHANGELOG.md#v1250-2023-03-30) + * **Feature**: Make DefaultExecutorDpuSize and CoordinatorDpuSize fields optional in StartSession +* `github.com/aws/aws-sdk-go-v2/service/autoscaling`: [v1.28.0](service/autoscaling/CHANGELOG.md#v1280-2023-03-30) + * **Feature**: Amazon EC2 Auto Scaling now supports Elastic Load Balancing traffic sources with the AttachTrafficSources, DetachTrafficSources, and DescribeTrafficSources APIs. This release also introduces a new activity status, "WaitingForConnectionDraining", for VPC Lattice to the DescribeScalingActivities API. +* `github.com/aws/aws-sdk-go-v2/service/batch`: [v1.23.0](service/batch/CHANGELOG.md#v1230-2023-03-30) + * **Feature**: This feature allows Batch on EKS to support configuration of Pod Labels through Metadata for Batch on EKS Jobs. +* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.22.0](service/computeoptimizer/CHANGELOG.md#v1220-2023-03-30) + * **Feature**: This release adds support for HDD EBS volume types and io2 Block Express. We are also adding support for 61 new instance types and instances that have non consecutive runtime. +* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.12.0](service/drs/CHANGELOG.md#v1120-2023-03-30) + * **Feature**: Adding a field to the replication configuration APIs to support the auto replicate new disks feature. We also deprecated RetryDataReplication. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.92.0](service/ec2/CHANGELOG.md#v1920-2023-03-30) + * **Feature**: This release adds support for Tunnel Endpoint Lifecycle control, a new feature that provides Site-to-Site VPN customers with better visibility and control of their VPN tunnel maintenance updates. +* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.24.0](service/emr/CHANGELOG.md#v1240-2023-03-30) + * **Feature**: Updated DescribeCluster and ListClusters API responses to include ErrorDetail that specifies error code, programmatically accessible error data,and an error message. ErrorDetail provides the underlying reason for cluster failure and recommends actions to simplify troubleshooting of EMR clusters. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.44.0](service/glue/CHANGELOG.md#v1440-2023-03-30) + * **Feature**: This release adds support for AWS Glue Data Quality, which helps you evaluate and monitor the quality of your data and includes the API for creating, deleting, or updating data quality rulesets, runs and evaluations. +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.20.0](service/guardduty/CHANGELOG.md#v1200-2023-03-30) + * **Feature**: Added EKS Runtime Monitoring feature support to existing detector, finding APIs and introducing new Coverage APIs +* `github.com/aws/aws-sdk-go-v2/service/imagebuilder`: [v1.23.0](service/imagebuilder/CHANGELOG.md#v1230-2023-03-30) + * **Feature**: Adds support for new image workflow details and image vulnerability detection. +* `github.com/aws/aws-sdk-go-v2/service/ivs`: [v1.21.0](service/ivs/CHANGELOG.md#v1210-2023-03-30) + * **Feature**: Amazon Interactive Video Service (IVS) now offers customers the ability to configure IVS channels to allow insecure RTMP ingest. +* `github.com/aws/aws-sdk-go-v2/service/kendra`: [v1.39.0](service/kendra/CHANGELOG.md#v1390-2023-03-30) + * **Feature**: AWS Kendra now supports featured results for a query. +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.25.0](service/networkfirewall/CHANGELOG.md#v1250-2023-03-30) + * **Feature**: AWS Network Firewall added TLS inspection configurations to allow TLS traffic inspection. +* `github.com/aws/aws-sdk-go-v2/service/sagemakergeospatial`: [v1.2.0](service/sagemakergeospatial/CHANGELOG.md#v120-2023-03-30) + * **Feature**: Amazon SageMaker geospatial capabilities now supports server-side encryption with customer managed KMS key and SageMaker notebooks with a SageMaker geospatial image in a Amazon SageMaker Domain with VPC only mode. +* `github.com/aws/aws-sdk-go-v2/service/vpclattice`: [v1.0.0](service/vpclattice/CHANGELOG.md#v100-2023-03-30) + * **Release**: New AWS service client module + * **Feature**: General Availability (GA) release of Amazon VPC Lattice +* `github.com/aws/aws-sdk-go-v2/service/wellarchitected`: [v1.19.0](service/wellarchitected/CHANGELOG.md#v1190-2023-03-30) + * **Feature**: AWS Well-Architected SDK now supports getting consolidated report metrics and generating a consolidated report PDF. + +# Release (2023-03-29) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/opensearchserverless`: [v1.2.0](service/opensearchserverless/CHANGELOG.md#v120-2023-03-29) + * **Feature**: This release includes two new exception types "ServiceQuotaExceededException" and "OcuLimitExceededException". +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.42.0](service/rds/CHANGELOG.md#v1420-2023-03-29) + * **Feature**: Add support for creating a read replica DB instance from a Multi-AZ DB cluster. + +# Release (2023-03-28) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ssmcontacts`: [v1.15.0](service/ssmcontacts/CHANGELOG.md#v1150-2023-03-28) + * **Feature**: This release adds 12 new APIs as part of Oncall Schedule feature release, adds support for a new contact type: ONCALL_SCHEDULE. Check public documentation for AWS ssm-contacts for more information +* `github.com/aws/aws-sdk-go-v2/service/ssmincidents`: [v1.21.0](service/ssmincidents/CHANGELOG.md#v1210-2023-03-28) + * **Feature**: Increased maximum length of "TriggerDetails.rawData" to 10K characters and "IncidentSummary" to 8K characters. + +# Release (2023-03-27) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.24.0](service/athena/CHANGELOG.md#v1240-2023-03-27) + * **Feature**: Enforces a minimal level of encryption for the workgroup for query and calculation results that are written to Amazon S3. When enabled, workgroup users can set encryption only to the minimum level set by the administrator or higher when they submit queries. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.4.0](service/chimesdkvoice/CHANGELOG.md#v140-2023-03-27) + * **Feature**: Documentation updates for Amazon Chime SDK Voice. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.50.0](service/connect/CHANGELOG.md#v1500-2023-03-27) + * **Feature**: This release introduces support for RelatedContactId in the StartChatContact API. Interactive message and interactive message response have been added to the list of supported message content types for this API as well. +* `github.com/aws/aws-sdk-go-v2/service/connectparticipant`: [v1.15.7](service/connectparticipant/CHANGELOG.md#v1157-2023-03-27) + * **Documentation**: This release provides an update to the SendMessage API to handle interactive message response content-types. +* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.26.0](service/iotwireless/CHANGELOG.md#v1260-2023-03-27) + * **Feature**: Introducing new APIs that enable Sidewalk devices to communicate with AWS IoT Core through Sidewalk gateways. This will empower AWS customers to connect Sidewalk devices with other AWS IoT Services, creating possibilities for seamless integration and advanced device management. +* `github.com/aws/aws-sdk-go-v2/service/medialive`: [v1.31.0](service/medialive/CHANGELOG.md#v1310-2023-03-27) + * **Feature**: AWS Elemental MediaLive now supports ID3 tag insertion for audio only HLS output groups. AWS Elemental Link devices now support tagging. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.72.1](service/sagemaker/CHANGELOG.md#v1721-2023-03-27) + * **Documentation**: Fixed some improperly rendered links in SDK documentation. +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.30.0](service/securityhub/CHANGELOG.md#v1300-2023-03-27) + * **Feature**: Added new resource detail objects to ASFF, including resources for AwsEksCluster, AWSS3Bucket, AwsEc2RouteTable and AwsEC2Instance. +* `github.com/aws/aws-sdk-go-v2/service/servicecatalogappregistry`: [v1.17.0](service/servicecatalogappregistry/CHANGELOG.md#v1170-2023-03-27) + * **Feature**: In this release, we started supporting ARN in applicationSpecifier and attributeGroupSpecifier. GetAttributeGroup, ListAttributeGroups and ListAttributeGroupsForApplication APIs will now have CreatedBy field in the response. +* `github.com/aws/aws-sdk-go-v2/service/voiceid`: [v1.13.0](service/voiceid/CHANGELOG.md#v1130-2023-03-27) + * **Feature**: Amazon Connect Voice ID now supports multiple fraudster watchlists. Every domain has a default watchlist where all existing fraudsters are placed by default. Custom watchlists may now be created, managed, and evaluated against for known fraudster detection. + +# Release (2023-03-24) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudwatch`: [v1.25.7](service/cloudwatch/CHANGELOG.md#v1257-2023-03-24) + * **Documentation**: Doc-only update to correct alarm actions list +* `github.com/aws/aws-sdk-go-v2/service/comprehend`: [v1.23.0](service/comprehend/CHANGELOG.md#v1230-2023-03-24) + * **Feature**: This release adds a new field (FlywheelArn) to the EntitiesDetectionJobProperties object. The FlywheelArn field is returned in the DescribeEntitiesDetectionJob and ListEntitiesDetectionJobs responses when the EntitiesDetection job is started with a FlywheelArn instead of an EntityRecognizerArn . +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.41.0](service/rds/CHANGELOG.md#v1410-2023-03-24) + * **Feature**: Added error code CreateCustomDBEngineVersionFault for when the create custom engine version for Custom engines fails. + +# Release (2023-03-23) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/batch`: [v1.22.0](service/batch/CHANGELOG.md#v1220-2023-03-23) + * **Feature**: This feature allows Batch to support configuration of ephemeral storage size for jobs running on FARGATE +* `github.com/aws/aws-sdk-go-v2/service/chimesdkidentity`: [v1.11.0](service/chimesdkidentity/CHANGELOG.md#v1110-2023-03-23) + * **Feature**: AppInstanceBots can be used to add a bot powered by Amazon Lex to chat channels. ExpirationSettings provides automatic resource deletion for AppInstanceUsers. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines`: [v1.3.0](service/chimesdkmediapipelines/CHANGELOG.md#v130-2023-03-23) + * **Feature**: This release adds Amazon Chime SDK call analytics. Call analytics include voice analytics, which provides speaker search and voice tone analysis. These capabilities can be used with Amazon Transcribe and Transcribe Call Analytics to generate machine-learning-powered insights from real-time audio. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmessaging`: [v1.14.0](service/chimesdkmessaging/CHANGELOG.md#v1140-2023-03-23) + * **Feature**: ExpirationSettings provides automatic resource deletion for Channels. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.3.0](service/chimesdkvoice/CHANGELOG.md#v130-2023-03-23) + * **Feature**: This release adds Amazon Chime SDK call analytics. Call analytics include voice analytics, which provides speaker search and voice tone analysis. These capabilities can be used with Amazon Transcribe and Transcribe Call Analytics to generate machine-learning-powered insights from real-time audio. +* `github.com/aws/aws-sdk-go-v2/service/codeartifact`: [v1.18.0](service/codeartifact/CHANGELOG.md#v1180-2023-03-23) + * **Feature**: Repository CreationTime is added to the CreateRepository and ListRepositories API responses. +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.19.0](service/guardduty/CHANGELOG.md#v1190-2023-03-23) + * **Feature**: Adds AutoEnableOrganizationMembers attribute to DescribeOrganizationConfiguration and UpdateOrganizationConfiguration APIs. +* `github.com/aws/aws-sdk-go-v2/service/ivsrealtime`: [v1.0.0](service/ivsrealtime/CHANGELOG.md#v100-2023-03-23) + * **Release**: New AWS service client module + * **Feature**: Initial release of the Amazon Interactive Video Service RealTime API. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.34.0](service/mediaconvert/CHANGELOG.md#v1340-2023-03-23) + * **Feature**: AWS Elemental MediaConvert SDK now supports passthrough of ID3v2 tags for audio inputs to audio-only HLS outputs. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.72.0](service/sagemaker/CHANGELOG.md#v1720-2023-03-23) + * **Feature**: Amazon SageMaker Autopilot adds two new APIs - CreateAutoMLJobV2 and DescribeAutoMLJobV2. Amazon SageMaker Notebook Instances now supports the ml.geospatial.interactive instance type. +* `github.com/aws/aws-sdk-go-v2/service/servicediscovery`: [v1.21.0](service/servicediscovery/CHANGELOG.md#v1210-2023-03-23) + * **Feature**: Reverted the throttling exception RequestLimitExceeded for AWS Cloud Map APIs introduced in SDK version 1.12.424 2023-03-09 to previous exception specified in the ErrorCode. +* `github.com/aws/aws-sdk-go-v2/service/textract`: [v1.21.0](service/textract/CHANGELOG.md#v1210-2023-03-23) + * **Feature**: The AnalyzeDocument - Tables feature adds support for new elements in the API: table titles, footers, section titles, summary cells/tables, and table type. + +# Release (2023-03-22) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.19.8](service/iam/CHANGELOG.md#v1198-2023-03-22) + * **Documentation**: Documentation updates for AWS Identity and Access Management (IAM). +* `github.com/aws/aws-sdk-go-v2/service/iottwinmaker`: [v1.11.0](service/iottwinmaker/CHANGELOG.md#v1110-2023-03-22) + * **Feature**: This release adds support of adding metadata when creating a new scene or updating an existing scene. +* `github.com/aws/aws-sdk-go-v2/service/networkmanager`: [v1.17.8](service/networkmanager/CHANGELOG.md#v1178-2023-03-22) + * **Documentation**: This release includes an update to create-transit-gateway-route-table-attachment, showing example usage for TransitGatewayRouteTableArn. +* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.10.0](service/resiliencehub/CHANGELOG.md#v1100-2023-03-22) + * **Feature**: This release provides customers with the ability to import resources from within an EKS cluster and assess the resiliency of EKS cluster workloads. +* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.36.0](service/ssm/CHANGELOG.md#v1360-2023-03-22) + * **Feature**: This Patch Manager release supports creating, updating, and deleting Patch Baselines for AmazonLinux2023, AlmaLinux. + +# Release (2023-03-21) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmessaging`: [v1.13.0](service/chimesdkmessaging/CHANGELOG.md#v1130-2023-03-21) + * **Feature**: Amazon Chime SDK messaging customers can now manage streaming configuration for messaging data for archival and analysis. +* `github.com/aws/aws-sdk-go-v2/service/cleanrooms`: [v1.1.0](service/cleanrooms/CHANGELOG.md#v110-2023-03-21) + * **Feature**: GA Release of AWS Clean Rooms, Added Tagging Functionality +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.91.0](service/ec2/CHANGELOG.md#v1910-2023-03-21) + * **Feature**: This release adds support for AWS Network Firewall, AWS PrivateLink, and Gateway Load Balancers to Amazon VPC Reachability Analyzer, and it makes the path destination optional as long as a destination address in the filter at source is provided. +* `github.com/aws/aws-sdk-go-v2/service/internal/s3shared`: [v1.14.0](service/internal/s3shared/CHANGELOG.md#v1140-2023-03-21) + * **Feature**: port v1 sdk 100-continue http header customization for s3 PutObject/UploadPart request and enable user config +* `github.com/aws/aws-sdk-go-v2/service/iotsitewise`: [v1.28.0](service/iotsitewise/CHANGELOG.md#v1280-2023-03-21) + * **Feature**: Provide support for tagging of data streams and enabling tag based authorization for property alias +* `github.com/aws/aws-sdk-go-v2/service/mgn`: [v1.18.0](service/mgn/CHANGELOG.md#v1180-2023-03-21) + * **Feature**: This release introduces the Import and export feature and expansion of the post-launch actions +* `github.com/aws/aws-sdk-go-v2/service/s3`: [v1.31.0](service/s3/CHANGELOG.md#v1310-2023-03-21) + * **Feature**: port v1 sdk 100-continue http header customization for s3 PutObject/UploadPart request and enable user config + +# Release (2023-03-20) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/applicationautoscaling`: [v1.19.0](service/applicationautoscaling/CHANGELOG.md#v1190-2023-03-20) + * **Feature**: With this release customers can now tag their Application Auto Scaling registered targets with key-value pairs and manage IAM permissions for all the tagged resources centrally. +* `github.com/aws/aws-sdk-go-v2/service/neptune`: [v1.20.0](service/neptune/CHANGELOG.md#v1200-2023-03-20) + * **Feature**: This release makes following few changes. db-cluster-identifier is now a required parameter of create-db-instance. describe-db-cluster will now return PendingModifiedValues and GlobalClusterIdentifier fields in the response. +* `github.com/aws/aws-sdk-go-v2/service/s3outposts`: [v1.16.0](service/s3outposts/CHANGELOG.md#v1160-2023-03-20) + * **Feature**: S3 On Outposts added support for endpoint status, and a failed endpoint reason, if any +* `github.com/aws/aws-sdk-go-v2/service/workdocs`: [v1.14.0](service/workdocs/CHANGELOG.md#v1140-2023-03-20) + * **Feature**: This release adds a new API, SearchResources, which enable users to search through metadata and content of folders, documents, document versions and comments in a WorkDocs site. + +# Release (2023-03-17) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/billingconductor`: [v1.6.0](service/billingconductor/CHANGELOG.md#v160-2023-03-17) + * **Feature**: This release adds a new filter to ListAccountAssociations API and a new filter to ListBillingGroups API. +* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.30.0](service/configservice/CHANGELOG.md#v1300-2023-03-17) + * **Feature**: This release adds resourceType enums for types released from October 2022 through February 2023. +* `github.com/aws/aws-sdk-go-v2/service/databasemigrationservice`: [v1.25.0](service/databasemigrationservice/CHANGELOG.md#v1250-2023-03-17) + * **Feature**: S3 setting to create AWS Glue Data Catalog. Oracle setting to control conversion of timestamp column. Support for Kafka SASL Plain authentication. Setting to map boolean from PostgreSQL to Redshift. SQL Server settings to force lob lookup on inline LOBs and to control access of database logs. + +# Release (2023-03-16) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/config`: [v1.18.18](config/CHANGELOG.md#v11818-2023-03-16) + * **Bug Fix**: Allow RoleARN to be set as functional option on STS WebIdentityRoleOptions. Fixes aws/aws-sdk-go-v2#2015. +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.18.0](service/guardduty/CHANGELOG.md#v1180-2023-03-16) + * **Feature**: Updated 9 APIs for feature enablement to reflect expansion of GuardDuty to features. Added new APIs and updated existing APIs to support RDS Protection GA. +* `github.com/aws/aws-sdk-go-v2/service/resourceexplorer2`: [v1.2.7](service/resourceexplorer2/CHANGELOG.md#v127-2023-03-16) + * **Documentation**: Documentation updates for APIs. +* `github.com/aws/aws-sdk-go-v2/service/sagemakerruntime`: [v1.18.7](service/sagemakerruntime/CHANGELOG.md#v1187-2023-03-16) + * **Documentation**: Documentation updates for SageMaker Runtime + +# Release (2023-03-15) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/migrationhubstrategy`: [v1.9.0](service/migrationhubstrategy/CHANGELOG.md#v190-2023-03-15) + * **Feature**: This release adds the binary analysis that analyzes IIS application DLLs on Windows and Java applications on Linux to provide anti-pattern report without configuring access to the source code. +* `github.com/aws/aws-sdk-go-v2/service/s3control`: [v1.31.0](service/s3control/CHANGELOG.md#v1310-2023-03-15) + * **Feature**: Added support for S3 Object Lambda aliases. +* `github.com/aws/aws-sdk-go-v2/service/securitylake`: [v1.3.0](service/securitylake/CHANGELOG.md#v130-2023-03-15) + * **Feature**: Make Create/Get/ListSubscribers APIs return resource share ARN and name so they can be used to validate the RAM resource share to accept. GetDatalake can be used to track status of UpdateDatalake and DeleteDatalake requests. + +# Release (2023-03-14) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/feature/ec2/imds`: [v1.13.0](feature/ec2/imds/CHANGELOG.md#v1130-2023-03-14) + * **Feature**: Add flag to disable IMDSv1 fallback +* `github.com/aws/aws-sdk-go-v2/service/applicationautoscaling`: [v1.18.0](service/applicationautoscaling/CHANGELOG.md#v1180-2023-03-14) + * **Feature**: Application Auto Scaling customers can now use mathematical functions to customize the metric used with Target Tracking policies within the policy configuration itself, saving the cost and effort of publishing the customizations as a separate metric. +* `github.com/aws/aws-sdk-go-v2/service/dataexchange`: [v1.19.0](service/dataexchange/CHANGELOG.md#v1190-2023-03-14) + * **Feature**: This release enables data providers to license direct access to S3 objects encrypted with Customer Managed Keys (CMK) in AWS KMS through AWS Data Exchange. Subscribers can use these keys to decrypt, then use the encrypted S3 objects shared with them, without creating or managing copies. +* `github.com/aws/aws-sdk-go-v2/service/directconnect`: [v1.18.7](service/directconnect/CHANGELOG.md#v1187-2023-03-14) + * **Documentation**: describe-direct-connect-gateway-associations includes a new status, updating, indicating that the association is currently in-process of updating. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.90.0](service/ec2/CHANGELOG.md#v1900-2023-03-14) + * **Feature**: This release adds a new DnsOptions key (PrivateDnsOnlyForInboundResolverEndpoint) to CreateVpcEndpoint and ModifyVpcEndpoint APIs. +* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.19.6](service/iam/CHANGELOG.md#v1196-2023-03-14) + * **Documentation**: Documentation only updates to correct customer-reported issues +* `github.com/aws/aws-sdk-go-v2/service/keyspaces`: [v1.2.0](service/keyspaces/CHANGELOG.md#v120-2023-03-14) + * **Feature**: Adding support for client-side timestamps +* `github.com/aws/aws-sdk-go-v2/service/support`: [v1.14.6](service/support/CHANGELOG.md#v1146-2023-03-14) + * **Announcement**: Model regenerated with support for null string values to properly implement `support` service operations `DescribeTrustedAdvisorCheckRefreshStatuses` and `DescribeTrustedAdvisorCheckSummaries` + +# Release (2023-03-13) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appintegrations`: [v1.15.0](service/appintegrations/CHANGELOG.md#v1150-2023-03-13) + * **Feature**: Adds FileConfiguration to Amazon AppIntegrations CreateDataIntegration supporting scheduled downloading of third party files into Amazon Connect from sources such as Microsoft SharePoint. +* `github.com/aws/aws-sdk-go-v2/service/lakeformation`: [v1.20.2](service/lakeformation/CHANGELOG.md#v1202-2023-03-13) + * **Documentation**: This release updates the documentation regarding Get/Update DataCellsFilter +* `github.com/aws/aws-sdk-go-v2/service/s3control`: [v1.30.0](service/s3control/CHANGELOG.md#v1300-2023-03-13) + * **Feature**: Added support for cross-account Multi-Region Access Points. Added support for S3 Replication for S3 on Outposts. +* `github.com/aws/aws-sdk-go-v2/service/tnb`: [v1.1.0](service/tnb/CHANGELOG.md#v110-2023-03-13) + * **Feature**: This release adds tagging support to the following Network Instance APIs : Instantiate, Update, Terminate. +* `github.com/aws/aws-sdk-go-v2/service/wisdom`: [v1.13.0](service/wisdom/CHANGELOG.md#v1130-2023-03-13) + * **Feature**: This release extends Wisdom CreateKnowledgeBase API to support SharePoint connector type by removing the @required trait for objectField + +# Release (2023-03-10) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ivschat`: [v1.4.0](service/ivschat/CHANGELOG.md#v140-2023-03-10) + * **Feature**: This release adds a new exception returned when calling AWS IVS chat UpdateLoggingConfiguration. Now UpdateLoggingConfiguration can return ConflictException when invalid updates are made in sequence to Logging Configurations. +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.19.0](service/secretsmanager/CHANGELOG.md#v1190-2023-03-10) + * **Feature**: The type definitions of SecretString and SecretBinary now have a minimum length of 1 in the model to match the exception thrown when you pass in empty values. + +# Release (2023-03-09) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/codeartifact`: [v1.17.0](service/codeartifact/CHANGELOG.md#v1170-2023-03-09) + * **Feature**: This release introduces the generic package format, a mechanism for storing arbitrary binary assets. It also adds a new API, PublishPackageVersion, to allow for publishing generic packages. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.49.0](service/connect/CHANGELOG.md#v1490-2023-03-09) + * **Feature**: This release adds a new API, GetMetricDataV2, which returns metric data for Amazon Connect. +* `github.com/aws/aws-sdk-go-v2/service/evidently`: [v1.11.0](service/evidently/CHANGELOG.md#v1110-2023-03-09) + * **Feature**: Updated entity override documentation +* `github.com/aws/aws-sdk-go-v2/service/networkmanager`: [v1.17.5](service/networkmanager/CHANGELOG.md#v1175-2023-03-09) + * **Documentation**: This update provides example usage for TransitGatewayRouteTableArn. +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.33.0](service/quicksight/CHANGELOG.md#v1330-2023-03-09) + * **Feature**: This release has two changes: add state persistence feature for embedded dashboard and console in GenerateEmbedUrlForRegisteredUser API; add properties for hidden collapsed row dimensions in PivotTableOptions. +* `github.com/aws/aws-sdk-go-v2/service/redshiftdata`: [v1.19.0](service/redshiftdata/CHANGELOG.md#v1190-2023-03-09) + * **Feature**: Added support for Redshift Serverless workgroup-arn wherever the WorkgroupName parameter is available. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.71.0](service/sagemaker/CHANGELOG.md#v1710-2023-03-09) + * **Feature**: Amazon SageMaker Inference now allows SSM access to customer's model container by setting the "EnableSSMAccess" parameter for a ProductionVariant in CreateEndpointConfig API. +* `github.com/aws/aws-sdk-go-v2/service/servicediscovery`: [v1.20.0](service/servicediscovery/CHANGELOG.md#v1200-2023-03-09) + * **Feature**: Updated all AWS Cloud Map APIs to provide consistent throttling exception (RequestLimitExceeded) +* `github.com/aws/aws-sdk-go-v2/service/sesv2`: [v1.17.0](service/sesv2/CHANGELOG.md#v1170-2023-03-09) + * **Feature**: This release introduces a new recommendation in Virtual Deliverability Manager Advisor, which detects missing or misconfigured Brand Indicator for Message Identification (BIMI) DNS records for customer sending identities. + +# Release (2023-03-08) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.23.0](service/athena/CHANGELOG.md#v1230-2023-03-08) + * **Feature**: A new field SubstatementType is added to GetQueryExecution API, so customers have an error free way to detect the query type and interpret the result. +* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.19.0](service/dynamodb/CHANGELOG.md#v1190-2023-03-08) + * **Feature**: Adds deletion protection support to DynamoDB tables. Tables with deletion protection enabled cannot be deleted. Deletion protection is disabled by default, can be enabled via the CreateTable or UpdateTable APIs, and is visible in TableDescription. This setting is not replicated for Global Tables. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.89.0](service/ec2/CHANGELOG.md#v1890-2023-03-08) + * **Feature**: Introducing Amazon EC2 C7g, M7g and R7g instances, powered by the latest generation AWS Graviton3 processors and deliver up to 25% better performance over Graviton2-based instances. +* `github.com/aws/aws-sdk-go-v2/service/lakeformation`: [v1.20.0](service/lakeformation/CHANGELOG.md#v1200-2023-03-08) + * **Feature**: This release adds two new API support "GetDataCellsFiler" and "UpdateDataCellsFilter", and also updates the corresponding documentation. +* `github.com/aws/aws-sdk-go-v2/service/mediapackage`: [v1.21.0](service/mediapackage/CHANGELOG.md#v1210-2023-03-08) + * **Feature**: This release provides the date and time live resources were created. +* `github.com/aws/aws-sdk-go-v2/service/mediapackagevod`: [v1.22.0](service/mediapackagevod/CHANGELOG.md#v1220-2023-03-08) + * **Feature**: This release provides the date and time VOD resources were created. +* `github.com/aws/aws-sdk-go-v2/service/route53resolver`: [v1.17.0](service/route53resolver/CHANGELOG.md#v1170-2023-03-08) + * **Feature**: Add dual-stack and IPv6 support for Route 53 Resolver Endpoint,Add IPv6 target IP in Route 53 Resolver Forwarding Rule +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.70.0](service/sagemaker/CHANGELOG.md#v1700-2023-03-08) + * **Feature**: There needs to be a user identity to specify the SageMaker user who perform each action regarding the entity. However, these is a not a unified concept of user identity across SageMaker service that could be used today. + +# Release (2023-03-07) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/databasemigrationservice`: [v1.24.0](service/databasemigrationservice/CHANGELOG.md#v1240-2023-03-07) + * **Feature**: This release adds DMS Fleet Advisor Target Recommendation APIs and exposes functionality for DMS Fleet Advisor. It adds functionality to start Target Recommendation calculation. +* `github.com/aws/aws-sdk-go-v2/service/location`: [v1.22.1](service/location/CHANGELOG.md#v1221-2023-03-07) + * **Documentation**: Documentation update for the release of 3 additional map styles for use with Open Data Maps: Open Data Standard Dark, Open Data Visualization Light & Open Data Visualization Dark. + +# Release (2023-03-06) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/account`: [v1.10.0](service/account/CHANGELOG.md#v1100-2023-03-06) + * **Feature**: AWS Account alternate contact email addresses can now have a length of 254 characters and contain the character "|". +* `github.com/aws/aws-sdk-go-v2/service/ivs`: [v1.20.6](service/ivs/CHANGELOG.md#v1206-2023-03-06) + * **Documentation**: Updated text description in DeleteChannel, Stream, and StreamSummary. + +# Release (2023-03-03) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.18.6](service/dynamodb/CHANGELOG.md#v1186-2023-03-03) + * **Documentation**: Documentation updates for DynamoDB. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.88.0](service/ec2/CHANGELOG.md#v1880-2023-03-03) + * **Feature**: This release adds support for a new boot mode for EC2 instances called 'UEFI Preferred'. +* `github.com/aws/aws-sdk-go-v2/service/macie2`: [v1.27.1](service/macie2/CHANGELOG.md#v1271-2023-03-03) + * **Documentation**: Documentation updates for Amazon Macie +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.33.0](service/mediaconvert/CHANGELOG.md#v1330-2023-03-03) + * **Feature**: The AWS Elemental MediaConvert SDK has improved handling for different input and output color space combinations. +* `github.com/aws/aws-sdk-go-v2/service/medialive`: [v1.30.0](service/medialive/CHANGELOG.md#v1300-2023-03-03) + * **Feature**: AWS Elemental MediaLive adds support for Nielsen watermark timezones. +* `github.com/aws/aws-sdk-go-v2/service/transcribe`: [v1.26.0](service/transcribe/CHANGELOG.md#v1260-2023-03-03) + * **Feature**: Amazon Transcribe now supports role access for these API operations: CreateVocabulary, UpdateVocabulary, CreateVocabularyFilter, and UpdateVocabularyFilter. + +# Release (2023-03-02) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.35.0](service/iot/CHANGELOG.md#v1350-2023-03-02) + * **Feature**: A recurring maintenance window is an optional configuration used for rolling out the job document to all devices in the target group observing a predetermined start time, duration, and frequency that the maintenance window occurs. +* `github.com/aws/aws-sdk-go-v2/service/migrationhubstrategy`: [v1.8.0](service/migrationhubstrategy/CHANGELOG.md#v180-2023-03-02) + * **Feature**: This release updates the File Import API to allow importing servers already discovered by customers with reduced pre-requisites. +* `github.com/aws/aws-sdk-go-v2/service/organizations`: [v1.19.0](service/organizations/CHANGELOG.md#v1190-2023-03-02) + * **Feature**: This release introduces a new reason code, ACCOUNT_CREATION_NOT_COMPLETE, to ConstraintViolationException in CreateOrganization API. +* `github.com/aws/aws-sdk-go-v2/service/pi`: [v1.17.0](service/pi/CHANGELOG.md#v1170-2023-03-02) + * **Feature**: This release adds a new field PeriodAlignment to allow the customer specifying the returned timestamp of time periods to be either the start or end time. +* `github.com/aws/aws-sdk-go-v2/service/pipes`: [v1.2.0](service/pipes/CHANGELOG.md#v120-2023-03-02) + * **Feature**: This release fixes some input parameter range and patterns. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.69.0](service/sagemaker/CHANGELOG.md#v1690-2023-03-02) + * **Feature**: Add a new field "EndpointMetrics" in SageMaker Inference Recommender "ListInferenceRecommendationsJobSteps" API response. + +# Release (2023-03-01) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/codecatalyst`: [v1.2.0](service/codecatalyst/CHANGELOG.md#v120-2023-03-01) + * **Feature**: Published Dev Environments StopDevEnvironmentSession API +* `github.com/aws/aws-sdk-go-v2/service/pricing`: [v1.19.0](service/pricing/CHANGELOG.md#v1190-2023-03-01) + * **Feature**: This release adds 2 new APIs - ListPriceLists which returns a list of applicable price lists, and GetPriceListFileUrl which outputs a URL to retrieve your price lists from the generated file from ListPriceLists +* `github.com/aws/aws-sdk-go-v2/service/s3outposts`: [v1.15.0](service/s3outposts/CHANGELOG.md#v1150-2023-03-01) + * **Feature**: S3 on Outposts introduces a new API ListOutpostsWithS3, with this API you can list all your Outposts with S3 capacity. + +# Release (2023-02-28) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/comprehend`: [v1.22.0](service/comprehend/CHANGELOG.md#v1220-2023-02-28) + * **Feature**: Amazon Comprehend now supports flywheels to help you train and manage new model versions for custom models. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.87.0](service/ec2/CHANGELOG.md#v1870-2023-02-28) + * **Feature**: This release allows IMDS support to be set to v2-only on an existing AMI, so that all future instances launched from that AMI will use IMDSv2 by default. +* `github.com/aws/aws-sdk-go-v2/service/kms`: [v1.20.6](service/kms/CHANGELOG.md#v1206-2023-02-28) + * **Documentation**: AWS KMS is deprecating the RSAES_PKCS1_V1_5 wrapping algorithm option in the GetParametersForImport API that is used in the AWS KMS Import Key Material feature. AWS KMS will end support for this wrapping algorithm by October 1, 2023. +* `github.com/aws/aws-sdk-go-v2/service/lightsail`: [v1.26.0](service/lightsail/CHANGELOG.md#v1260-2023-02-28) + * **Feature**: This release adds Lightsail for Research feature support, such as GUI session access, cost estimates, stop instance on idle, and disk auto mount. +* `github.com/aws/aws-sdk-go-v2/service/managedblockchain`: [v1.15.0](service/managedblockchain/CHANGELOG.md#v1150-2023-02-28) + * **Feature**: This release adds support for tagging to the accessor resource in Amazon Managed Blockchain +* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.2.0](service/omics/CHANGELOG.md#v120-2023-02-28) + * **Feature**: Minor model changes to accomodate batch imports feature + +# Release (2023-02-27) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/devopsguru`: [v1.23.0](service/devopsguru/CHANGELOG.md#v1230-2023-02-27) + * **Feature**: This release adds the description field on ListAnomaliesForInsight and DescribeAnomaly API responses for proactive anomalies. +* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.11.0](service/drs/CHANGELOG.md#v1110-2023-02-27) + * **Feature**: New fields were added to reflect availability zone data in source server and recovery instance description commands responses, as well as source server launch status. +* `github.com/aws/aws-sdk-go-v2/service/internetmonitor`: [v1.0.0](service/internetmonitor/CHANGELOG.md#v100-2023-02-27) + * **Release**: New AWS service client module + * **Feature**: CloudWatch Internet Monitor is a a new service within CloudWatch that will help application developers and network engineers continuously monitor internet performance metrics such as availability and performance between their AWS-hosted applications and end-users of these applications +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.30.0](service/lambda/CHANGELOG.md#v1300-2023-02-27) + * **Feature**: This release adds the ability to create ESMs with Document DB change streams as event source. For more information see https://docs.aws.amazon.com/lambda/latest/dg/with-documentdb.html. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.32.0](service/mediaconvert/CHANGELOG.md#v1320-2023-02-27) + * **Feature**: The AWS Elemental MediaConvert SDK has added support for HDR10 to SDR tone mapping, and animated GIF video input sources. +* `github.com/aws/aws-sdk-go-v2/service/timestreamwrite`: [v1.16.0](service/timestreamwrite/CHANGELOG.md#v1160-2023-02-27) + * **Feature**: This release adds the ability to ingest batched historical data or migrate data in bulk from S3 into Timestream using CSV files. + +# Release (2023-02-24) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.48.0](service/connect/CHANGELOG.md#v1480-2023-02-24) + * **Feature**: StartTaskContact API now supports linked task creation with a new optional RelatedContactId parameter +* `github.com/aws/aws-sdk-go-v2/service/connectcases`: [v1.3.0](service/connectcases/CHANGELOG.md#v130-2023-02-24) + * **Feature**: This release adds the ability to delete domains through the DeleteDomain API. For more information see https://docs.aws.amazon.com/cases/latest/APIReference/Welcome.html +* `github.com/aws/aws-sdk-go-v2/service/redshift`: [v1.27.5](service/redshift/CHANGELOG.md#v1275-2023-02-24) + * **Documentation**: Documentation updates for Redshift API bringing it in line with IAM best practices. +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.29.0](service/securityhub/CHANGELOG.md#v1290-2023-02-24) + * **Feature**: New Security Hub APIs and updates to existing APIs that help you consolidate control findings and enable and disable controls across all supported standards +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.16.5](service/servicecatalog/CHANGELOG.md#v1165-2023-02-24) + * **Documentation**: Documentation updates for Service Catalog + +# Release (2023-02-23) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.25.0](service/appflow/CHANGELOG.md#v1250-2023-02-23) + * **Feature**: This release enables the customers to choose whether to use Private Link for Metadata and Authorization call when using a private Salesforce connections +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.24.0](service/ecs/CHANGELOG.md#v1240-2023-02-23) + * **Feature**: This release supports deleting Amazon ECS task definitions that are in the INACTIVE state. +* `github.com/aws/aws-sdk-go-v2/service/grafana`: [v1.12.3](service/grafana/CHANGELOG.md#v1123-2023-02-23) + * **Documentation**: Doc-only update. Updated information on attached role policies for customer provided roles +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.17.6](service/guardduty/CHANGELOG.md#v1176-2023-02-23) + * **Documentation**: Updated API and data types descriptions for CreateFilter, UpdateFilter, and TriggerDetails. +* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.25.0](service/iotwireless/CHANGELOG.md#v1250-2023-02-23) + * **Feature**: In this release, we add additional capabilities for the FUOTA which allows user to configure the fragment size, the sending interval and the redundancy ratio of the FUOTA tasks +* `github.com/aws/aws-sdk-go-v2/service/location`: [v1.22.0](service/location/CHANGELOG.md#v1220-2023-02-23) + * **Feature**: This release adds support for using Maps APIs with an API Key in addition to AWS Cognito. This includes support for adding, listing, updating and deleting API Keys. +* `github.com/aws/aws-sdk-go-v2/service/macie2`: [v1.27.0](service/macie2/CHANGELOG.md#v1270-2023-02-23) + * **Feature**: This release adds support for a new finding type, Policy:IAMUser/S3BucketSharedWithCloudFront, and S3 bucket metadata that indicates if a bucket is shared with an Amazon CloudFront OAI or OAC. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.26.0](service/wafv2/CHANGELOG.md#v1260-2023-02-23) + * **Feature**: You can now associate an AWS WAF v2 web ACL with an AWS App Runner service. + +# Release (2023-02-22) + +## General Highlights +* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.2.0](service/chimesdkvoice/CHANGELOG.md#v120-2023-02-22) + * **Feature**: This release introduces support for Voice Connector media metrics in the Amazon Chime SDK Voice namespace +* `github.com/aws/aws-sdk-go-v2/service/cloudfront`: [v1.26.0](service/cloudfront/CHANGELOG.md#v1260-2023-02-22) + * **Feature**: CloudFront now supports block lists in origin request policies so that you can forward all headers, cookies, or query string from viewer requests to the origin *except* for those specified in the block list. +* `github.com/aws/aws-sdk-go-v2/service/datasync`: [v1.23.0](service/datasync/CHANGELOG.md#v1230-2023-02-22) + * **Feature**: AWS DataSync has relaxed the minimum length constraint of AccessKey for Object Storage locations to 1. +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.15.0](service/opensearch/CHANGELOG.md#v1150-2023-02-22) + * **Feature**: This release lets customers configure Off-peak window and software update related properties for a new/existing domain. It enhances the capabilities of StartServiceSoftwareUpdate API; adds 2 new APIs - ListScheduledActions & UpdateScheduledAction; and allows Auto-tune to make use of Off-peak window. +* `github.com/aws/aws-sdk-go-v2/service/rum`: [v1.10.0](service/rum/CHANGELOG.md#v1100-2023-02-22) + * **Feature**: CloudWatch RUM now supports CloudWatch Custom Metrics +* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.35.5](service/ssm/CHANGELOG.md#v1355-2023-02-22) + * **Documentation**: Document only update for Feb 2023 + +# Release (2023-02-21) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.32.0](service/quicksight/CHANGELOG.md#v1320-2023-02-21) + * **Feature**: S3 data sources now accept a custom IAM role. +* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.9.0](service/resiliencehub/CHANGELOG.md#v190-2023-02-21) + * **Feature**: In this release we improved resilience hub application creation and maintenance by introducing new resource and app component crud APIs, improving visibility and maintenance of application input sources and added support for additional information attributes to be provided by customers. +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.28.4](service/securityhub/CHANGELOG.md#v1284-2023-02-21) + * **Documentation**: Documentation updates for AWS Security Hub +* `github.com/aws/aws-sdk-go-v2/service/tnb`: [v1.0.0](service/tnb/CHANGELOG.md#v100-2023-02-21) + * **Release**: New AWS service client module + * **Feature**: This is the initial SDK release for AWS Telco Network Builder (TNB). AWS Telco Network Builder is a network automation service that helps you deploy and manage telecom networks. + +# Release (2023-02-20) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2`: v1.17.5 + * **Bug Fix**: fix int overflow bug on 32 bit architecture +* `github.com/aws/aws-sdk-go-v2/service/auditmanager`: [v1.24.0](service/auditmanager/CHANGELOG.md#v1240-2023-02-20) + * **Feature**: This release introduces a ServiceQuotaExceededException to the UpdateAssessmentFrameworkShare API operation. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.47.0](service/connect/CHANGELOG.md#v1470-2023-02-20) + * **Feature**: Reasons for failed diff has been approved by SDK Reviewer + +# Release (2023-02-17) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/apprunner`: [v1.17.0](service/apprunner/CHANGELOG.md#v1170-2023-02-17) + * **Feature**: This release supports removing MaxSize limit for AutoScalingConfiguration. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.43.0](service/glue/CHANGELOG.md#v1430-2023-02-17) + * **Feature**: Release of Delta Lake Data Lake Format for Glue Studio Service + +# Release (2023-02-16) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.23.0](service/emr/CHANGELOG.md#v1230-2023-02-16) + * **Feature**: This release provides customers the ability to define a timeout period for procuring capacity during a resize operation for Instance Fleet clusters. Customers can specify this timeout using the ResizeSpecifications parameter supported by RunJobFlow, ModifyInstanceFleet and AddInstanceFleet APIs. +* `github.com/aws/aws-sdk-go-v2/service/grafana`: [v1.12.0](service/grafana/CHANGELOG.md#v1120-2023-02-16) + * **Feature**: With this release Amazon Managed Grafana now supports inbound Network Access Control that helps you to restrict user access to your Grafana workspaces +* `github.com/aws/aws-sdk-go-v2/service/ivs`: [v1.20.3](service/ivs/CHANGELOG.md#v1203-2023-02-16) + * **Documentation**: Doc-only update. Updated text description in DeleteChannel, Stream, and StreamSummary. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.25.1](service/wafv2/CHANGELOG.md#v1251-2023-02-16) + * **Documentation**: Added a notice for account takeover prevention (ATP). The interface incorrectly lets you to configure ATP response inspection in regional web ACLs in Region US East (N. Virginia), without returning an error. ATP response inspection is only available in web ACLs that protect CloudFront distributions. + +# Release (2023-02-15) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/accessanalyzer`: [v1.19.3](service/accessanalyzer/CHANGELOG.md#v1193-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/account`: [v1.9.1](service/account/CHANGELOG.md#v191-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/acm`: [v1.17.3](service/acm/CHANGELOG.md#v1173-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/acmpca`: [v1.21.2](service/acmpca/CHANGELOG.md#v1212-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/alexaforbusiness`: [v1.15.2](service/alexaforbusiness/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/amp`: [v1.16.2](service/amp/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/amplify`: [v1.13.2](service/amplify/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/amplifybackend`: [v1.14.2](service/amplifybackend/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/amplifyuibuilder`: [v1.9.2](service/amplifyuibuilder/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/apigateway`: [v1.16.3](service/apigateway/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi`: [v1.11.2](service/apigatewaymanagementapi/CHANGELOG.md#v1112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/apigatewayv2`: [v1.13.3](service/apigatewayv2/CHANGELOG.md#v1133-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/appconfig`: [v1.17.1](service/appconfig/CHANGELOG.md#v1171-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/appconfigdata`: [v1.6.1](service/appconfigdata/CHANGELOG.md#v161-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.24.2](service/appflow/CHANGELOG.md#v1242-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/appintegrations`: [v1.14.2](service/appintegrations/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/applicationautoscaling`: [v1.17.3](service/applicationautoscaling/CHANGELOG.md#v1173-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/applicationcostprofiler`: [v1.10.2](service/applicationcostprofiler/CHANGELOG.md#v1102-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/applicationdiscoveryservice`: [v1.15.2](service/applicationdiscoveryservice/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/applicationinsights`: [v1.17.3](service/applicationinsights/CHANGELOG.md#v1173-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/appmesh`: [v1.17.2](service/appmesh/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/apprunner`: [v1.16.2](service/apprunner/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/appstream`: [v1.20.2](service/appstream/CHANGELOG.md#v1202-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/appsync`: [v1.19.2](service/appsync/CHANGELOG.md#v1192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/arczonalshift`: [v1.1.3](service/arczonalshift/CHANGELOG.md#v113-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.22.2](service/athena/CHANGELOG.md#v1222-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/auditmanager`: [v1.23.2](service/auditmanager/CHANGELOG.md#v1232-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/autoscalingplans`: [v1.13.2](service/autoscalingplans/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/backup`: [v1.20.1](service/backup/CHANGELOG.md#v1201-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/backupgateway`: [v1.9.2](service/backupgateway/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/backupstorage`: [v1.1.2](service/backupstorage/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/batch`: [v1.21.3](service/batch/CHANGELOG.md#v1213-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/billingconductor`: [v1.5.2](service/billingconductor/CHANGELOG.md#v152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/braket`: [v1.17.2](service/braket/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/budgets`: [v1.14.2](service/budgets/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/chime`: [v1.22.2](service/chime/CHANGELOG.md#v1222-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkidentity`: [v1.10.2](service/chimesdkidentity/CHANGELOG.md#v1102-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines`: [v1.2.2](service/chimesdkmediapipelines/CHANGELOG.md#v122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmeetings`: [v1.14.3](service/chimesdkmeetings/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmessaging`: [v1.12.2](service/chimesdkmessaging/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.1.2](service/chimesdkvoice/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cleanrooms`: [v1.0.2](service/cleanrooms/CHANGELOG.md#v102-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloud9`: [v1.17.2](service/cloud9/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudcontrol`: [v1.11.3](service/cloudcontrol/CHANGELOG.md#v1113-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/clouddirectory`: [v1.13.2](service/clouddirectory/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudhsm`: [v1.13.2](service/cloudhsm/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudhsmv2`: [v1.14.2](service/cloudhsmv2/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudsearchdomain`: [v1.12.2](service/cloudsearchdomain/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudtrail`: [v1.24.0](service/cloudtrail/CHANGELOG.md#v1240-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Feature**: This release adds an InsufficientEncryptionPolicyException type to the StartImport endpoint + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudtraildata`: [v1.0.2](service/cloudtraildata/CHANGELOG.md#v102-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchevents`: [v1.15.3](service/cloudwatchevents/CHANGELOG.md#v1153-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.20.3](service/cloudwatchlogs/CHANGELOG.md#v1203-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codeartifact`: [v1.16.2](service/codeartifact/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codebuild`: [v1.20.3](service/codebuild/CHANGELOG.md#v1203-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codecatalyst`: [v1.1.2](service/codecatalyst/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codecommit`: [v1.14.2](service/codecommit/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codedeploy`: [v1.16.3](service/codedeploy/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codeguruprofiler`: [v1.13.2](service/codeguruprofiler/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codegurureviewer`: [v1.17.2](service/codegurureviewer/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codepipeline`: [v1.14.2](service/codepipeline/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codestar`: [v1.13.2](service/codestar/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codestarconnections`: [v1.14.2](service/codestarconnections/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/codestarnotifications`: [v1.14.2](service/codestarnotifications/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cognitoidentity`: [v1.15.2](service/cognitoidentity/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider`: [v1.22.2](service/cognitoidentityprovider/CHANGELOG.md#v1222-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/cognitosync`: [v1.12.2](service/cognitosync/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/comprehend`: [v1.21.2](service/comprehend/CHANGELOG.md#v1212-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/comprehendmedical`: [v1.15.2](service/comprehendmedical/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.21.1](service/computeoptimizer/CHANGELOG.md#v1211-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.29.3](service/configservice/CHANGELOG.md#v1293-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.46.1](service/connect/CHANGELOG.md#v1461-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/connectcampaigns`: [v1.2.3](service/connectcampaigns/CHANGELOG.md#v123-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/connectcases`: [v1.2.3](service/connectcases/CHANGELOG.md#v123-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/connectcontactlens`: [v1.13.2](service/connectcontactlens/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/connectparticipant`: [v1.15.2](service/connectparticipant/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/controltower`: [v1.1.2](service/controltower/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/costandusagereportservice`: [v1.15.2](service/costandusagereportservice/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/costexplorer`: [v1.25.2](service/costexplorer/CHANGELOG.md#v1252-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/customerprofiles`: [v1.23.1](service/customerprofiles/CHANGELOG.md#v1231-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/databasemigrationservice`: [v1.23.3](service/databasemigrationservice/CHANGELOG.md#v1233-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/databrew`: [v1.21.3](service/databrew/CHANGELOG.md#v1213-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/dataexchange`: [v1.18.2](service/dataexchange/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/datapipeline`: [v1.14.2](service/datapipeline/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/datasync`: [v1.22.1](service/datasync/CHANGELOG.md#v1221-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/dax`: [v1.12.2](service/dax/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/detective`: [v1.18.2](service/detective/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/devicefarm`: [v1.15.2](service/devicefarm/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/devopsguru`: [v1.22.2](service/devopsguru/CHANGELOG.md#v1222-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/directconnect`: [v1.18.3](service/directconnect/CHANGELOG.md#v1183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/directoryservice`: [v1.16.3](service/directoryservice/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/dlm`: [v1.14.4](service/dlm/CHANGELOG.md#v1144-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/docdbelastic`: [v1.1.2](service/docdbelastic/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.10.2](service/drs/CHANGELOG.md#v1102-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.18.3](service/dynamodb/CHANGELOG.md#v1183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/dynamodbstreams`: [v1.14.3](service/dynamodbstreams/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ebs`: [v1.16.4](service/ebs/CHANGELOG.md#v1164-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect`: [v1.15.2](service/ec2instanceconnect/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ecr`: [v1.18.3](service/ecr/CHANGELOG.md#v1183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ecrpublic`: [v1.15.2](service/ecrpublic/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.23.3](service/ecs/CHANGELOG.md#v1233-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/efs`: [v1.19.4](service/efs/CHANGELOG.md#v1194-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. + * **Documentation**: Documentation update for EFS to support IAM best practices. +* `github.com/aws/aws-sdk-go-v2/service/eks`: [v1.27.3](service/eks/CHANGELOG.md#v1273-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/elasticinference`: [v1.12.2](service/elasticinference/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/elasticsearchservice`: [v1.18.3](service/elasticsearchservice/CHANGELOG.md#v1183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/elastictranscoder`: [v1.14.2](service/elastictranscoder/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.22.3](service/emr/CHANGELOG.md#v1223-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/emrcontainers`: [v1.17.1](service/emrcontainers/CHANGELOG.md#v1171-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/emrserverless`: [v1.5.2](service/emrserverless/CHANGELOG.md#v152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/eventbridge`: [v1.18.3](service/eventbridge/CHANGELOG.md#v1183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/evidently`: [v1.10.2](service/evidently/CHANGELOG.md#v1102-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/finspace`: [v1.9.2](service/finspace/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/finspacedata`: [v1.14.2](service/finspacedata/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/firehose`: [v1.16.3](service/firehose/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/fis`: [v1.14.2](service/fis/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/fms`: [v1.22.3](service/fms/CHANGELOG.md#v1223-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/forecast`: [v1.25.2](service/forecast/CHANGELOG.md#v1252-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/forecastquery`: [v1.13.2](service/forecastquery/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/frauddetector`: [v1.23.0](service/frauddetector/CHANGELOG.md#v1230-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Feature**: This release introduces Lists feature which allows customers to reference a set of values in Fraud Detector's rules. With Lists, customers can dynamically manage these attributes in real time. Lists can be created/deleted and its contents can be modified using the Fraud Detector API. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/fsx`: [v1.28.3](service/fsx/CHANGELOG.md#v1283-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/gamelift`: [v1.17.2](service/gamelift/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/gamesparks`: [v1.2.2](service/gamesparks/CHANGELOG.md#v122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/glacier`: [v1.14.3](service/glacier/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/globalaccelerator`: [v1.16.2](service/globalaccelerator/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.42.0](service/glue/CHANGELOG.md#v1420-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Feature**: Fix DirectJDBCSource not showing up in CLI code gen + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/grafana`: [v1.11.2](service/grafana/CHANGELOG.md#v1112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/greengrass`: [v1.15.3](service/greengrass/CHANGELOG.md#v1153-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/greengrassv2`: [v1.21.3](service/greengrassv2/CHANGELOG.md#v1213-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.17.2](service/groundstation/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.17.3](service/guardduty/CHANGELOG.md#v1173-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/health`: [v1.16.2](service/health/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/healthlake`: [v1.15.2](service/healthlake/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/honeycode`: [v1.13.2](service/honeycode/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/identitystore`: [v1.16.2](service/identitystore/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/imagebuilder`: [v1.22.2](service/imagebuilder/CHANGELOG.md#v1222-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/inspector`: [v1.13.2](service/inspector/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/inspector2`: [v1.11.3](service/inspector2/CHANGELOG.md#v1113-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.34.2](service/iot/CHANGELOG.md#v1342-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iot1clickdevicesservice`: [v1.11.2](service/iot1clickdevicesservice/CHANGELOG.md#v1112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iot1clickprojects`: [v1.12.2](service/iot1clickprojects/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotanalytics`: [v1.14.2](service/iotanalytics/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotdataplane`: [v1.14.2](service/iotdataplane/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotdeviceadvisor`: [v1.17.2](service/iotdeviceadvisor/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotevents`: [v1.15.2](service/iotevents/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ioteventsdata`: [v1.13.2](service/ioteventsdata/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotfleethub`: [v1.13.2](service/iotfleethub/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotfleetwise`: [v1.3.2](service/iotfleetwise/CHANGELOG.md#v132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotjobsdataplane`: [v1.12.2](service/iotjobsdataplane/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotroborunner`: [v1.1.2](service/iotroborunner/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotsecuretunneling`: [v1.15.2](service/iotsecuretunneling/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotsitewise`: [v1.27.2](service/iotsitewise/CHANGELOG.md#v1272-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotthingsgraph`: [v1.14.2](service/iotthingsgraph/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iottwinmaker`: [v1.10.2](service/iottwinmaker/CHANGELOG.md#v1102-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.24.2](service/iotwireless/CHANGELOG.md#v1242-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ivs`: [v1.20.2](service/ivs/CHANGELOG.md#v1202-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ivschat`: [v1.3.2](service/ivschat/CHANGELOG.md#v132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kafka`: [v1.19.2](service/kafka/CHANGELOG.md#v1192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kafkaconnect`: [v1.9.2](service/kafkaconnect/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kendra`: [v1.38.3](service/kendra/CHANGELOG.md#v1383-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kendraranking`: [v1.0.4](service/kendraranking/CHANGELOG.md#v104-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/keyspaces`: [v1.1.2](service/keyspaces/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesis`: [v1.17.4](service/kinesis/CHANGELOG.md#v1174-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesisanalytics`: [v1.14.2](service/kinesisanalytics/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesisanalyticsv2`: [v1.16.2](service/kinesisanalyticsv2/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideo`: [v1.15.3](service/kinesisvideo/CHANGELOG.md#v1153-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideoarchivedmedia`: [v1.14.3](service/kinesisvideoarchivedmedia/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideomedia`: [v1.11.3](service/kinesisvideomedia/CHANGELOG.md#v1113-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideosignaling`: [v1.11.3](service/kinesisvideosignaling/CHANGELOG.md#v1113-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideowebrtcstorage`: [v1.2.3](service/kinesisvideowebrtcstorage/CHANGELOG.md#v123-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/kms`: [v1.20.3](service/kms/CHANGELOG.md#v1203-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lakeformation`: [v1.19.2](service/lakeformation/CHANGELOG.md#v1192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.29.2](service/lambda/CHANGELOG.md#v1292-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lexmodelbuildingservice`: [v1.17.2](service/lexmodelbuildingservice/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lexmodelsv2`: [v1.28.1](service/lexmodelsv2/CHANGELOG.md#v1281-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lexruntimeservice`: [v1.13.2](service/lexruntimeservice/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lexruntimev2`: [v1.17.1](service/lexruntimev2/CHANGELOG.md#v1171-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/licensemanager`: [v1.17.2](service/licensemanager/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/licensemanagerlinuxsubscriptions`: [v1.1.2](service/licensemanagerlinuxsubscriptions/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/licensemanagerusersubscriptions`: [v1.2.2](service/licensemanagerusersubscriptions/CHANGELOG.md#v122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lightsail`: [v1.25.3](service/lightsail/CHANGELOG.md#v1253-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/location`: [v1.21.2](service/location/CHANGELOG.md#v1212-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lookoutequipment`: [v1.17.2](service/lookoutequipment/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lookoutmetrics`: [v1.19.2](service/lookoutmetrics/CHANGELOG.md#v1192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/lookoutvision`: [v1.15.2](service/lookoutvision/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/m2`: [v1.4.2](service/m2/CHANGELOG.md#v142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/machinelearning`: [v1.15.2](service/machinelearning/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/macie`: [v1.15.2](service/macie/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/macie2`: [v1.26.2](service/macie2/CHANGELOG.md#v1262-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/managedblockchain`: [v1.14.2](service/managedblockchain/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/marketplacecatalog`: [v1.15.2](service/marketplacecatalog/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/marketplacecommerceanalytics`: [v1.12.2](service/marketplacecommerceanalytics/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/marketplaceentitlementservice`: [v1.12.2](service/marketplaceentitlementservice/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/marketplacemetering`: [v1.14.3](service/marketplacemetering/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mediaconnect`: [v1.18.2](service/mediaconnect/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.31.1](service/mediaconvert/CHANGELOG.md#v1311-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/medialive`: [v1.29.2](service/medialive/CHANGELOG.md#v1292-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mediapackage`: [v1.20.2](service/mediapackage/CHANGELOG.md#v1202-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mediapackagevod`: [v1.21.2](service/mediapackagevod/CHANGELOG.md#v1212-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mediastore`: [v1.13.2](service/mediastore/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mediastoredata`: [v1.13.2](service/mediastoredata/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mediatailor`: [v1.22.2](service/mediatailor/CHANGELOG.md#v1222-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/memorydb`: [v1.12.2](service/memorydb/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mgn`: [v1.17.2](service/mgn/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/migrationhub`: [v1.13.2](service/migrationhub/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/migrationhubconfig`: [v1.13.2](service/migrationhubconfig/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/migrationhuborchestrator`: [v1.1.2](service/migrationhuborchestrator/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/migrationhubrefactorspaces`: [v1.9.1](service/migrationhubrefactorspaces/CHANGELOG.md#v191-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/migrationhubstrategy`: [v1.7.2](service/migrationhubstrategy/CHANGELOG.md#v172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mobile`: [v1.12.2](service/mobile/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mq`: [v1.14.2](service/mq/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mturk`: [v1.14.2](service/mturk/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/mwaa`: [v1.14.2](service/mwaa/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.24.2](service/networkfirewall/CHANGELOG.md#v1242-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/networkmanager`: [v1.17.2](service/networkmanager/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/nimble`: [v1.16.2](service/nimble/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/oam`: [v1.1.3](service/oam/CHANGELOG.md#v113-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.1.2](service/omics/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.14.2](service/opensearch/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/opensearchserverless`: [v1.1.3](service/opensearchserverless/CHANGELOG.md#v113-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/opsworks`: [v1.14.2](service/opsworks/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/opsworkscm`: [v1.15.2](service/opsworkscm/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/organizations`: [v1.18.2](service/organizations/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/outposts`: [v1.27.2](service/outposts/CHANGELOG.md#v1272-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/panorama`: [v1.11.2](service/panorama/CHANGELOG.md#v1112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/personalize`: [v1.23.2](service/personalize/CHANGELOG.md#v1232-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/personalizeevents`: [v1.13.2](service/personalizeevents/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/personalizeruntime`: [v1.13.2](service/personalizeruntime/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/pi`: [v1.16.3](service/pi/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/pinpoint`: [v1.18.2](service/pinpoint/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/pinpointemail`: [v1.12.2](service/pinpointemail/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/pinpointsmsvoice`: [v1.11.2](service/pinpointsmsvoice/CHANGELOG.md#v1112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/pinpointsmsvoicev2`: [v1.1.2](service/pinpointsmsvoicev2/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/pipes`: [v1.1.2](service/pipes/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.25.1](service/polly/CHANGELOG.md#v1251-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/pricing`: [v1.18.2](service/pricing/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/privatenetworks`: [v1.2.0](service/privatenetworks/CHANGELOG.md#v120-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Feature**: This release introduces a new StartNetworkResourceUpdate API, which enables return/replacement of hardware from a NetworkSite. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/proton`: [v1.20.1](service/proton/CHANGELOG.md#v1201-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/qldb`: [v1.15.2](service/qldb/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/qldbsession`: [v1.14.2](service/qldbsession/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.31.2](service/quicksight/CHANGELOG.md#v1312-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ram`: [v1.17.3](service/ram/CHANGELOG.md#v1173-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/rbin`: [v1.8.3](service/rbin/CHANGELOG.md#v183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.40.3](service/rds/CHANGELOG.md#v1403-2023-02-15) + * **Documentation**: Database Activity Stream support for RDS for SQL Server. +* `github.com/aws/aws-sdk-go-v2/service/rdsdata`: [v1.13.2](service/rdsdata/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/redshiftdata`: [v1.18.2](service/redshiftdata/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.4.3](service/redshiftserverless/CHANGELOG.md#v143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.23.2](service/rekognition/CHANGELOG.md#v1232-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.8.2](service/resiliencehub/CHANGELOG.md#v182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/resourceexplorer2`: [v1.2.3](service/resourceexplorer2/CHANGELOG.md#v123-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/resourcegroups`: [v1.14.3](service/resourcegroups/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi`: [v1.14.3](service/resourcegroupstaggingapi/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/robomaker`: [v1.18.2](service/robomaker/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/rolesanywhere`: [v1.1.2](service/rolesanywhere/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/route53domains`: [v1.14.2](service/route53domains/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/route53recoverycluster`: [v1.11.2](service/route53recoverycluster/CHANGELOG.md#v1112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/route53recoverycontrolconfig`: [v1.11.2](service/route53recoverycontrolconfig/CHANGELOG.md#v1112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/route53recoveryreadiness`: [v1.9.2](service/route53recoveryreadiness/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/route53resolver`: [v1.16.3](service/route53resolver/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/rum`: [v1.9.2](service/rum/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/s3outposts`: [v1.14.2](service/s3outposts/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.68.1](service/sagemaker/CHANGELOG.md#v1681-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sagemakera2iruntime`: [v1.15.2](service/sagemakera2iruntime/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sagemakeredge`: [v1.13.2](service/sagemakeredge/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sagemakerfeaturestoreruntime`: [v1.13.2](service/sagemakerfeaturestoreruntime/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sagemakergeospatial`: [v1.1.2](service/sagemakergeospatial/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sagemakermetrics`: [v1.0.5](service/sagemakermetrics/CHANGELOG.md#v105-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sagemakerruntime`: [v1.18.3](service/sagemakerruntime/CHANGELOG.md#v1183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/savingsplans`: [v1.12.2](service/savingsplans/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/scheduler`: [v1.1.2](service/scheduler/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/schemas`: [v1.15.2](service/schemas/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.18.4](service/secretsmanager/CHANGELOG.md#v1184-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.28.2](service/securityhub/CHANGELOG.md#v1282-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/securitylake`: [v1.2.2](service/securitylake/CHANGELOG.md#v122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/serverlessapplicationrepository`: [v1.12.2](service/serverlessapplicationrepository/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.16.2](service/servicecatalog/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/servicecatalogappregistry`: [v1.16.3](service/servicecatalogappregistry/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/servicediscovery`: [v1.19.2](service/servicediscovery/CHANGELOG.md#v1192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/servicequotas`: [v1.14.3](service/servicequotas/CHANGELOG.md#v1143-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sesv2`: [v1.16.2](service/sesv2/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sfn`: [v1.17.3](service/sfn/CHANGELOG.md#v1173-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/shield`: [v1.18.2](service/shield/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/signer`: [v1.14.2](service/signer/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/simspaceweaver`: [v1.1.2](service/simspaceweaver/CHANGELOG.md#v112-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sms`: [v1.13.2](service/sms/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/snowball`: [v1.18.1](service/snowball/CHANGELOG.md#v1181-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/snowdevicemanagement`: [v1.9.2](service/snowdevicemanagement/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.35.3](service/ssm/CHANGELOG.md#v1353-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ssmcontacts`: [v1.14.2](service/ssmcontacts/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ssmincidents`: [v1.20.2](service/ssmincidents/CHANGELOG.md#v1202-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ssmsap`: [v1.2.2](service/ssmsap/CHANGELOG.md#v122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/sso`: [v1.12.2](service/sso/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ssoadmin`: [v1.16.2](service/ssoadmin/CHANGELOG.md#v1162-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/ssooidc`: [v1.14.2](service/ssooidc/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/storagegateway`: [v1.18.3](service/storagegateway/CHANGELOG.md#v1183-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/support`: [v1.14.2](service/support/CHANGELOG.md#v1142-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/supportapp`: [v1.2.2](service/supportapp/CHANGELOG.md#v122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/swf`: [v1.14.4](service/swf/CHANGELOG.md#v1144-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/synthetics`: [v1.17.3](service/synthetics/CHANGELOG.md#v1173-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/textract`: [v1.20.2](service/textract/CHANGELOG.md#v1202-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/timestreamquery`: [v1.15.2](service/timestreamquery/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/timestreamwrite`: [v1.15.2](service/timestreamwrite/CHANGELOG.md#v1152-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/transcribe`: [v1.25.2](service/transcribe/CHANGELOG.md#v1252-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/transcribestreaming`: [v1.9.2](service/transcribestreaming/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.28.3](service/transfer/CHANGELOG.md#v1283-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/translate`: [v1.17.2](service/translate/CHANGELOG.md#v1172-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/voiceid`: [v1.12.2](service/voiceid/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/waf`: [v1.12.2](service/waf/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/wafregional`: [v1.13.3](service/wafregional/CHANGELOG.md#v1133-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.25.0](service/wafv2/CHANGELOG.md#v1250-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Feature**: For protected CloudFront distributions, you can now use the AWS WAF Fraud Control account takeover prevention (ATP) managed rule group to block new login attempts from clients that have recently submitted too many failed login attempts. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/wellarchitected`: [v1.18.2](service/wellarchitected/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/wisdom`: [v1.12.2](service/wisdom/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/workdocs`: [v1.13.3](service/workdocs/CHANGELOG.md#v1133-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/worklink`: [v1.13.2](service/worklink/CHANGELOG.md#v1132-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/workmail`: [v1.18.2](service/workmail/CHANGELOG.md#v1182-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/workmailmessageflow`: [v1.12.2](service/workmailmessageflow/CHANGELOG.md#v1122-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.28.3](service/workspaces/CHANGELOG.md#v1283-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/workspacesweb`: [v1.9.2](service/workspacesweb/CHANGELOG.md#v192-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. +* `github.com/aws/aws-sdk-go-v2/service/xray`: [v1.16.3](service/xray/CHANGELOG.md#v1163-2023-02-15) + * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. + * **Bug Fix**: Correct error type parsing for restJson services. + +# Release (2023-02-14) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appconfig`: [v1.17.0](service/appconfig/CHANGELOG.md#v1170-2023-02-14) + * **Feature**: AWS AppConfig now offers the option to set a version label on hosted configuration versions. Version labels allow you to identify specific hosted configuration versions based on an alternate versioning scheme that you define. +* `github.com/aws/aws-sdk-go-v2/service/datasync`: [v1.22.0](service/datasync/CHANGELOG.md#v1220-2023-02-14) + * **Feature**: With this launch, we are giving customers the ability to use older SMB protocol versions, enabling them to use DataSync to copy data to and from their legacy storage arrays. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.86.0](service/ec2/CHANGELOG.md#v1860-2023-02-14) + * **Feature**: With this release customers can turn host maintenance on or off when allocating or modifying a supported dedicated host. Host maintenance is turned on by default for supported hosts. + +# Release (2023-02-13) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/account`: [v1.9.0](service/account/CHANGELOG.md#v190-2023-02-13) + * **Feature**: This release of the Account Management API enables customers to view and manage whether AWS Opt-In Regions are enabled or disabled for their Account. For more information, see https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html +* `github.com/aws/aws-sdk-go-v2/service/appconfigdata`: [v1.6.0](service/appconfigdata/CHANGELOG.md#v160-2023-02-13) + * **Feature**: AWS AppConfig now offers the option to set a version label on hosted configuration versions. If a labeled hosted configuration version is deployed, its version label is available in the GetLatestConfiguration response. +* `github.com/aws/aws-sdk-go-v2/service/snowball`: [v1.18.0](service/snowball/CHANGELOG.md#v1180-2023-02-13) + * **Feature**: Adds support for EKS Anywhere on Snowball. AWS Snow Family customers can now install EKS Anywhere service on Snowball Edge Compute Optimized devices. + +# Release (2023-02-10) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/autoscaling`: [v1.27.0](service/autoscaling/CHANGELOG.md#v1270-2023-02-10) + * **Feature**: You can now either terminate/replace, ignore, or wait for EC2 Auto Scaling instances on standby or protected from scale in. Also, you can also roll back changes from a failed instance refresh. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.46.0](service/connect/CHANGELOG.md#v1460-2023-02-10) + * **Feature**: This update provides the Wisdom session ARN for contacts enabled for Wisdom in the chat channel. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.85.0](service/ec2/CHANGELOG.md#v1850-2023-02-10) + * **Feature**: Adds support for waiters that automatically poll for an imported snapshot until it reaches the completed state. +* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.25.0](service/polly/CHANGELOG.md#v1250-2023-02-10) + * **Feature**: Amazon Polly adds two new neural Japanese voices - Kazuha, Tomoko +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.68.0](service/sagemaker/CHANGELOG.md#v1680-2023-02-10) + * **Feature**: Amazon SageMaker Autopilot adds support for selecting algorithms in CreateAutoMLJob API. +* `github.com/aws/aws-sdk-go-v2/service/sns`: [v1.20.2](service/sns/CHANGELOG.md#v1202-2023-02-10) + * **Documentation**: This release adds support for SNS X-Ray active tracing as well as other updates. + +# Release (2023-02-09) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmeetings`: [v1.14.2](service/chimesdkmeetings/CHANGELOG.md#v1142-2023-02-09) + * **Documentation**: Documentation updates for Chime Meetings SDK +* `github.com/aws/aws-sdk-go-v2/service/emrcontainers`: [v1.17.0](service/emrcontainers/CHANGELOG.md#v1170-2023-02-09) + * **Feature**: EMR on EKS allows configuring retry policies for job runs through the StartJobRun API. Using retry policies, a job cause a driver pod to be restarted automatically if it fails or is deleted. The job's status can be seen in the DescribeJobRun and ListJobRun APIs and monitored using CloudWatch events. +* `github.com/aws/aws-sdk-go-v2/service/lexmodelsv2`: [v1.28.0](service/lexmodelsv2/CHANGELOG.md#v1280-2023-02-09) + * **Feature**: AWS Lex now supports Network of Bots. +* `github.com/aws/aws-sdk-go-v2/service/lexruntimev2`: [v1.17.0](service/lexruntimev2/CHANGELOG.md#v1170-2023-02-09) + * **Feature**: AWS Lex now supports Network of Bots. +* `github.com/aws/aws-sdk-go-v2/service/lightsail`: [v1.25.2](service/lightsail/CHANGELOG.md#v1252-2023-02-09) + * **Documentation**: Documentation updates for Lightsail +* `github.com/aws/aws-sdk-go-v2/service/migrationhubrefactorspaces`: [v1.9.0](service/migrationhubrefactorspaces/CHANGELOG.md#v190-2023-02-09) + * **Feature**: This release adds support for creating environments with a network fabric type of NONE +* `github.com/aws/aws-sdk-go-v2/service/workdocs`: [v1.13.2](service/workdocs/CHANGELOG.md#v1132-2023-02-09) + * **Documentation**: Doc only update for the WorkDocs APIs. +* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.28.2](service/workspaces/CHANGELOG.md#v1282-2023-02-09) + * **Documentation**: Removed Windows Server 2016 BYOL and made changes based on IAM campaign. + +# Release (2023-02-08) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/backup`: [v1.20.0](service/backup/CHANGELOG.md#v1200-2023-02-08) + * **Feature**: This release added one attribute (resource name) in the output model of our 9 existing APIs in AWS backup so that customers will see the resource name at the output. No input required from Customers. +* `github.com/aws/aws-sdk-go-v2/service/cloudfront`: [v1.25.0](service/cloudfront/CHANGELOG.md#v1250-2023-02-08) + * **Feature**: CloudFront Origin Access Control extends support to AWS Elemental MediaStore origins. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.41.0](service/glue/CHANGELOG.md#v1410-2023-02-08) + * **Feature**: DirectJDBCSource + Glue 4.0 streaming options + +# Release (2023-02-07) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.28.2](service/transfer/CHANGELOG.md#v1282-2023-02-07) + * **Documentation**: Updated the documentation for the ImportCertificate API call, and added examples. + +# Release (2023-02-06) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.21.0](service/computeoptimizer/CHANGELOG.md#v1210-2023-02-06) + * **Feature**: AWS Compute optimizer can now infer if Kafka is running on an instance. +* `github.com/aws/aws-sdk-go-v2/service/customerprofiles`: [v1.23.0](service/customerprofiles/CHANGELOG.md#v1230-2023-02-06) + * **Feature**: This release deprecates the PartyType and Gender enum data types from the Profile model and replaces them with new PartyTypeString and GenderString attributes, which accept any string of length up to 255. +* `github.com/aws/aws-sdk-go-v2/service/frauddetector`: [v1.22.0](service/frauddetector/CHANGELOG.md#v1220-2023-02-06) + * **Feature**: My AWS Service (Amazon Fraud Detector) - This release introduces Cold Start Model Training which optimizes training for small datasets and adds intelligent methods for treating unlabeled data. You can now train Online Fraud Insights or Transaction Fraud Insights models with minimal historical-data. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.31.0](service/mediaconvert/CHANGELOG.md#v1310-2023-02-06) + * **Feature**: The AWS Elemental MediaConvert SDK has added improved scene change detection capabilities and a bandwidth reduction filter, along with video quality enhancements, to the AVC encoder. +* `github.com/aws/aws-sdk-go-v2/service/outposts`: [v1.27.0](service/outposts/CHANGELOG.md#v1270-2023-02-06) + * **Feature**: Adds OrderType to Order structure. Adds PreviousOrderId and PreviousLineItemId to LineItem structure. Adds new line item status REPLACED. Increases maximum length of pagination token. + +# Release (2023-02-03) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/autoscaling`: [v1.26.2](service/autoscaling/CHANGELOG.md#v1262-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.26.2](service/cloudformation/CHANGELOG.md#v1262-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/cloudsearch`: [v1.14.1](service/cloudsearch/CHANGELOG.md#v1141-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/cloudwatch`: [v1.25.2](service/cloudwatch/CHANGELOG.md#v1252-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/docdb`: [v1.20.2](service/docdb/CHANGELOG.md#v1202-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.84.1](service/ec2/CHANGELOG.md#v1841-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/elasticache`: [v1.26.2](service/elasticache/CHANGELOG.md#v1262-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/elasticbeanstalk`: [v1.15.1](service/elasticbeanstalk/CHANGELOG.md#v1151-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing`: [v1.15.2](service/elasticloadbalancing/CHANGELOG.md#v1152-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2`: [v1.19.3](service/elasticloadbalancingv2/CHANGELOG.md#v1193-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.19.2](service/iam/CHANGELOG.md#v1192-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/neptune`: [v1.19.2](service/neptune/CHANGELOG.md#v1192-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/proton`: [v1.20.0](service/proton/CHANGELOG.md#v1200-2023-02-03) + * **Feature**: Add new GetResourcesSummary API +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.40.2](service/rds/CHANGELOG.md#v1402-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/redshift`: [v1.27.2](service/redshift/CHANGELOG.md#v1272-2023-02-03) + * **Documentation**: Corrects descriptions of the parameters for the API operations RestoreFromClusterSnapshot, RestoreTableFromClusterSnapshot, and CreateCluster. + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/ses`: [v1.15.1](service/ses/CHANGELOG.md#v1151-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/sns`: [v1.20.1](service/sns/CHANGELOG.md#v1201-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/sqs`: [v1.20.2](service/sqs/CHANGELOG.md#v1202-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. +* `github.com/aws/aws-sdk-go-v2/service/sts`: [v1.18.3](service/sts/CHANGELOG.md#v1183-2023-02-03) + * **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. + +# Release (2023-02-02) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appconfig`: [v1.16.0](service/appconfig/CHANGELOG.md#v1160-2023-02-02) + * **Feature**: AWS AppConfig introduces KMS customer-managed key (CMK) encryption of configuration data, along with AWS Secrets Manager as a new configuration data source. S3 objects using SSE-KMS encryption and SSM Parameter Store SecureStrings are also now supported. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.84.0](service/ec2/CHANGELOG.md#v1840-2023-02-02) + * **Feature**: Documentation updates for EC2. +* `github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2`: [v1.19.2](service/elasticloadbalancingv2/CHANGELOG.md#v1192-2023-02-02) + * **Documentation**: The GWLB Flex Health Check project updates the default values of healthy-threshold-count from 3 to 5 and unhealthy-threshold-count from 3 to 2 +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.31.0](service/quicksight/CHANGELOG.md#v1310-2023-02-02) + * **Feature**: QuickSight support for Radar Chart and Dashboard Publish Options + +# Release (2023-02-01) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/devopsguru`: [v1.22.0](service/devopsguru/CHANGELOG.md#v1220-2023-02-01) + * **Feature**: This release adds filter support ListAnomalyForInsight API. +* `github.com/aws/aws-sdk-go-v2/service/forecast`: [v1.25.0](service/forecast/CHANGELOG.md#v1250-2023-02-01) + * **Feature**: This release will enable customer select INCREMENTAL as ImportModel in Forecast's CreateDatasetImportJob API. Verified latest SDK containing required attribute, following https://w.amazon.com/bin/view/AWS-Seer/Launch/Trebuchet/ +* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.19.1](service/iam/CHANGELOG.md#v1191-2023-02-01) + * **Documentation**: Documentation updates for AWS Identity and Access Management (IAM). +* `github.com/aws/aws-sdk-go-v2/service/mediatailor`: [v1.22.0](service/mediatailor/CHANGELOG.md#v1220-2023-02-01) + * **Feature**: The AWS Elemental MediaTailor SDK for Channel Assembly has added support for program updates, and the ability to clip the end of VOD sources in programs. +* `github.com/aws/aws-sdk-go-v2/service/sns`: [v1.20.0](service/sns/CHANGELOG.md#v1200-2023-02-01) + * **Feature**: Additional attributes added for set-topic-attributes. + +# Release (2023-01-31) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appsync`: [v1.19.0](service/appsync/CHANGELOG.md#v1190-2023-01-31) + * **Feature**: This release introduces the feature to support EventBridge as AppSync data source. +* `github.com/aws/aws-sdk-go-v2/service/cloudtrail`: [v1.23.0](service/cloudtrail/CHANGELOG.md#v1230-2023-01-31) + * **Feature**: Add new "Channel" APIs to enable users to manage channels used for CloudTrail Lake integrations, and "Resource Policy" APIs to enable users to manage the resource-based permissions policy attached to a channel. +* `github.com/aws/aws-sdk-go-v2/service/cloudtraildata`: [v1.0.0](service/cloudtraildata/CHANGELOG.md#v100-2023-01-31) + * **Release**: New AWS service client module + * **Feature**: Add CloudTrail Data Service to enable users to ingest activity events from non-AWS sources into CloudTrail Lake. +* `github.com/aws/aws-sdk-go-v2/service/codeartifact`: [v1.16.0](service/codeartifact/CHANGELOG.md#v1160-2023-01-31) + * **Feature**: This release introduces a new DeletePackage API, which enables deletion of a package and all of its versions from a repository. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.83.0](service/ec2/CHANGELOG.md#v1830-2023-01-31) + * **Feature**: This launch allows customers to associate up to 8 IP addresses to their NAT Gateways to increase the limit on concurrent connections to a single destination by eight times from 55K to 440K. +* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.17.0](service/groundstation/CHANGELOG.md#v1170-2023-01-31) + * **Feature**: DigIF Expansion changes to the Customer APIs. +* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.34.0](service/iot/CHANGELOG.md#v1340-2023-01-31) + * **Feature**: Added support for IoT Rules Engine Cloudwatch Logs action batch mode. +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.14.0](service/opensearch/CHANGELOG.md#v1140-2023-01-31) + * **Feature**: Amazon OpenSearch Service adds the option for a VPC endpoint connection between two domains when the local domain uses OpenSearch version 1.3 or 2.3. You can now use remote reindex to copy indices from one VPC domain to another without a reverse proxy. +* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.24.0](service/polly/CHANGELOG.md#v1240-2023-01-31) + * **Feature**: Amazon Polly adds two new neural American English voices - Ruth, Stephen +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.67.0](service/sagemaker/CHANGELOG.md#v1670-2023-01-31) + * **Feature**: Amazon SageMaker Automatic Model Tuning now supports more completion criteria for Hyperparameter Optimization. +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.28.0](service/securityhub/CHANGELOG.md#v1280-2023-01-31) + * **Feature**: New fields have been added to the AWS Security Finding Format. Compliance.SecurityControlId is a unique identifier for a security control across standards. Compliance.AssociatedStandards contains all enabled standards in which a security control is enabled. + +# Release (2023-01-30) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.26.0](service/cloudformation/CHANGELOG.md#v1260-2023-01-30) + * **Feature**: This feature provides a method of obtaining which regions a stackset has stack instances deployed in. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.82.0](service/ec2/CHANGELOG.md#v1820-2023-01-30) + * **Feature**: We add Prefix Lists as a new route destination option for LocalGatewayRoutes. This will allow customers to create routes to Prefix Lists. Prefix List routes will allow customers to group individual CIDR routes with the same target into a single route. + +# Release (2023-01-27) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appstream`: [v1.20.0](service/appstream/CHANGELOG.md#v1200-2023-01-27) + * **Feature**: Fixing the issue where Appstream waiters hang for fleet_started and fleet_stopped. +* `github.com/aws/aws-sdk-go-v2/service/mediatailor`: [v1.21.0](service/mediatailor/CHANGELOG.md#v1210-2023-01-27) + * **Feature**: This release introduces the As Run logging type, along with API and documentation updates. +* `github.com/aws/aws-sdk-go-v2/service/outposts`: [v1.26.0](service/outposts/CHANGELOG.md#v1260-2023-01-27) + * **Feature**: Adding support for payment term in GetOrder, CreateOrder responses. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.66.0](service/sagemaker/CHANGELOG.md#v1660-2023-01-27) + * **Feature**: This release supports running SageMaker Training jobs with container images that are in a private Docker registry. +* `github.com/aws/aws-sdk-go-v2/service/sagemakerruntime`: [v1.18.0](service/sagemakerruntime/CHANGELOG.md#v1180-2023-01-27) + * **Feature**: Amazon SageMaker Runtime which supports InvokeEndpointAsync asynchronously can now invoke endpoints with custom timeout values. Asynchronous invocations support longer processing times. + +# Release (2023-01-26) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/eventbridge`: [v1.18.0](service/eventbridge/CHANGELOG.md#v1180-2023-01-26) + * **Feature**: Minor comments for Redshift Serverless workgroup target support. + +# Release (2023-01-25) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.81.0](service/ec2/CHANGELOG.md#v1810-2023-01-25) + * **Feature**: This release adds new functionality that allows customers to provision IPv6 CIDR blocks through Amazon VPC IP Address Manager (IPAM) as well as allowing customers to utilize IPAM Resource Discovery APIs. +* `github.com/aws/aws-sdk-go-v2/service/m2`: [v1.4.0](service/m2/CHANGELOG.md#v140-2023-01-25) + * **Feature**: Add returnCode, batchJobIdentifier in GetBatchJobExecution response, for user to view the batch job execution result & unique identifier from engine. Also removed unused headers from REST APIs +* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.23.0](service/polly/CHANGELOG.md#v1230-2023-01-25) + * **Feature**: Add 5 new neural voices - Sergio (es-ES), Andres (es-MX), Remi (fr-FR), Adriano (it-IT) and Thiago (pt-BR). +* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.4.1](service/redshiftserverless/CHANGELOG.md#v141-2023-01-25) + * **Documentation**: Added query monitoring rules as possible parameters for create and update workgroup operations. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.65.0](service/sagemaker/CHANGELOG.md#v1650-2023-01-25) + * **Feature**: SageMaker Inference Recommender now decouples from Model Registry and could accept Model Name to invoke inference recommendations job; Inference Recommender now provides CPU/Memory Utilization metrics data in recommendation output. +* `github.com/aws/aws-sdk-go-v2/service/sts`: [v1.18.2](service/sts/CHANGELOG.md#v1182-2023-01-25) + * **Documentation**: Doc only change to update wording in a key topic + +# Release (2023-01-24) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/route53`: [v1.27.0](service/route53/CHANGELOG.md#v1270-2023-01-24) + * **Feature**: Amazon Route 53 now supports the Asia Pacific (Melbourne) Region (ap-southeast-4) for latency records, geoproximity records, and private DNS for Amazon VPCs in that region. +* `github.com/aws/aws-sdk-go-v2/service/ssmsap`: [v1.2.0](service/ssmsap/CHANGELOG.md#v120-2023-01-24) + * **Feature**: This release provides updates to documentation and support for listing operations performed by AWS Systems Manager for SAP. + +# Release (2023-01-23) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.29.0](service/lambda/CHANGELOG.md#v1290-2023-01-23) + * **Feature**: Release Lambda RuntimeManagementConfig, enabling customers to better manage runtime updates to their Lambda functions. This release adds two new APIs, GetRuntimeManagementConfig and PutRuntimeManagementConfig, as well as support on existing Create/Get/Update function APIs. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.64.0](service/sagemaker/CHANGELOG.md#v1640-2023-01-23) + * **Feature**: Amazon SageMaker Inference now supports P4de instance types. + +# Release (2023-01-20) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.80.0](service/ec2/CHANGELOG.md#v1800-2023-01-20) + * **Feature**: C6in, M6in, M6idn, R6in and R6idn instances are powered by 3rd Generation Intel Xeon Scalable processors (code named Ice Lake) with an all-core turbo frequency of 3.5 GHz. +* `github.com/aws/aws-sdk-go-v2/service/ivs`: [v1.20.0](service/ivs/CHANGELOG.md#v1200-2023-01-20) + * **Feature**: API and Doc update. Update to arns field in BatchGetStreamKey. Also updates to operations and structures. +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.30.0](service/quicksight/CHANGELOG.md#v1300-2023-01-20) + * **Feature**: This release adds support for data bars in QuickSight table and increases pivot table field well limit. + +# Release (2023-01-19) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.24.0](service/appflow/CHANGELOG.md#v1240-2023-01-19) + * **Feature**: Adding support for Salesforce Pardot connector in Amazon AppFlow. +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.20.0](service/cloudwatchlogs/CHANGELOG.md#v1200-2023-01-19) + * **Feature**: Bug fix - Removed the regex pattern validation from CoralModel to avoid potential security issue. +* `github.com/aws/aws-sdk-go-v2/service/codeartifact`: [v1.15.0](service/codeartifact/CHANGELOG.md#v1150-2023-01-19) + * **Feature**: Documentation updates for CodeArtifact +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.45.0](service/connect/CHANGELOG.md#v1450-2023-01-19) + * **Feature**: Amazon Connect Chat introduces Persistent Chat, allowing customers to resume previous conversations with context and transcripts carried over from previous chats, eliminating the need to repeat themselves and allowing agents to provide personalized service with access to entire conversation history. +* `github.com/aws/aws-sdk-go-v2/service/connectparticipant`: [v1.15.0](service/connectparticipant/CHANGELOG.md#v1150-2023-01-19) + * **Feature**: This release updates Amazon Connect Participant's GetTranscript api to provide transcripts of past chats on a persistent chat session. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.79.0](service/ec2/CHANGELOG.md#v1790-2023-01-19) + * **Feature**: Adds SSM Parameter Resource Aliasing support to EC2 Launch Templates. Launch Templates can now store parameter aliases in place of AMI Resource IDs. CreateLaunchTemplateVersion and DescribeLaunchTemplateVersions now support a convenience flag, ResolveAlias, to return the resolved parameter value. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.40.0](service/glue/CHANGELOG.md#v1400-2023-01-19) + * **Feature**: Release Glue Studio Hudi Data Lake Format for SDK/CLI +* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.16.0](service/groundstation/CHANGELOG.md#v1160-2023-01-19) + * **Feature**: Add configurable prepass and postpass times for DataflowEndpointGroup. Add Waiter to allow customers to wait for a contact that was reserved through ReserveContact +* `github.com/aws/aws-sdk-go-v2/service/medialive`: [v1.29.0](service/medialive/CHANGELOG.md#v1290-2023-01-19) + * **Feature**: AWS Elemental MediaLive adds support for SCTE 35 preRollMilliSeconds. +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.13.0](service/opensearch/CHANGELOG.md#v1130-2023-01-19) + * **Feature**: This release adds the enhanced dry run option, that checks for validation errors that might occur when deploying configuration changes and provides a summary of these errors, if any. The feature will also indicate whether a blue/green deployment will be required to apply a change. +* `github.com/aws/aws-sdk-go-v2/service/panorama`: [v1.11.0](service/panorama/CHANGELOG.md#v1110-2023-01-19) + * **Feature**: Added AllowMajorVersionUpdate option to OTAJobConfig to make appliance software major version updates opt-in. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.63.0](service/sagemaker/CHANGELOG.md#v1630-2023-01-19) + * **Feature**: HyperParameterTuningJobs now allow passing environment variables into the corresponding TrainingJobs + +# Release (2023-01-18) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudwatch`: [v1.25.0](service/cloudwatch/CHANGELOG.md#v1250-2023-01-18) + * **Feature**: Enable cross-account streams in CloudWatch Metric Streams via Observability Access Manager. +* `github.com/aws/aws-sdk-go-v2/service/efs`: [v1.19.1](service/efs/CHANGELOG.md#v1191-2023-01-18) + * **Documentation**: Documentation updates for EFS access points limit increase +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.24.2](service/wafv2/CHANGELOG.md#v1242-2023-01-18) + * **Documentation**: Improved the visibility of the guidance for updating AWS WAF resources, such as web ACLs and rule groups. + +# Release (2023-01-17) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/billingconductor`: [v1.5.0](service/billingconductor/CHANGELOG.md#v150-2023-01-17) + * **Feature**: This release adds support for SKU Scope for pricing plans. +* `github.com/aws/aws-sdk-go-v2/service/imagebuilder`: [v1.22.0](service/imagebuilder/CHANGELOG.md#v1220-2023-01-17) + * **Feature**: Add support for AWS Marketplace product IDs as input during CreateImageRecipe for the parent-image parameter. Add support for listing third-party components. +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.24.0](service/networkfirewall/CHANGELOG.md#v1240-2023-01-17) + * **Feature**: Network Firewall now allows creation of dual stack endpoints, enabling inspection of IPv6 traffic. + +# Release (2023-01-13) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.44.0](service/connect/CHANGELOG.md#v1440-2023-01-13) + * **Feature**: This release updates the responses of UpdateContactFlowContent, UpdateContactFlowMetadata, UpdateContactFlowName and DeleteContactFlow API with empty responses. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.78.0](service/ec2/CHANGELOG.md#v1780-2023-01-13) + * **Feature**: Documentation updates for EC2. +* `github.com/aws/aws-sdk-go-v2/service/outposts`: [v1.25.0](service/outposts/CHANGELOG.md#v1250-2023-01-13) + * **Feature**: This release adds POWER_30_KVA as an option for PowerDrawKva. PowerDrawKva is part of the RackPhysicalProperties structure in the CreateSite request. +* `github.com/aws/aws-sdk-go-v2/service/resourcegroups`: [v1.14.0](service/resourcegroups/CHANGELOG.md#v1140-2023-01-13) + * **Feature**: AWS Resource Groups customers can now turn on Group Lifecycle Events in their AWS account. When you turn this on, Resource Groups monitors your groups for changes to group state or membership. Those changes are sent to Amazon EventBridge as events that you can respond to using rules you create. + +# Release (2023-01-12) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cleanrooms`: [v1.0.0](service/cleanrooms/CHANGELOG.md#v100-2023-01-12) + * **Release**: New AWS service client module + * **Feature**: Initial release of AWS Clean Rooms +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.19.0](service/cloudwatchlogs/CHANGELOG.md#v1190-2023-01-12) + * **Feature**: Bug fix: logGroupName is now not a required field in GetLogEvents, FilterLogEvents, GetLogGroupFields, and DescribeLogStreams APIs as logGroupIdentifier can be provided instead +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.28.0](service/lambda/CHANGELOG.md#v1280-2023-01-12) + * **Feature**: Add support for MaximumConcurrency parameter for SQS event source. Customers can now limit the maximum concurrent invocations for their SQS Event Source Mapping. +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.30.0](service/mediaconvert/CHANGELOG.md#v1300-2023-01-12) + * **Feature**: The AWS Elemental MediaConvert SDK has added support for compact DASH manifest generation, audio normalization using TruePeak measurements, and the ability to clip the sample range in the color corrector. +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.18.1](service/secretsmanager/CHANGELOG.md#v1181-2023-01-12) + * **Documentation**: Update documentation for new ListSecrets and DescribeSecret parameters + +# Release (2023-01-11) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/kendra`: [v1.38.0](service/kendra/CHANGELOG.md#v1380-2023-01-11) + * **Feature**: This release adds support to new document types - RTF, XML, XSLT, MS_EXCEL, CSV, JSON, MD + +# Release (2023-01-10) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/location`: [v1.21.0](service/location/CHANGELOG.md#v1210-2023-01-10) + * **Feature**: This release adds support for two new route travel models, Bicycle and Motorcycle which can be used with Grab data source. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.40.0](service/rds/CHANGELOG.md#v1400-2023-01-10) + * **Feature**: This release adds support for configuring allocated storage on the CreateDBInstanceReadReplica, RestoreDBInstanceFromDBSnapshot, and RestoreDBInstanceToPointInTime APIs. + +# Release (2023-01-09) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/ecrpublic`: [v1.15.0](service/ecrpublic/CHANGELOG.md#v1150-2023-01-09) + * **Feature**: This release for Amazon ECR Public makes several change to bring the SDK into sync with the API. +* `github.com/aws/aws-sdk-go-v2/service/kendraranking`: [v1.0.0](service/kendraranking/CHANGELOG.md#v100-2023-01-09) + * **Release**: New AWS service client module + * **Feature**: Introducing Amazon Kendra Intelligent Ranking, a new set of Kendra APIs that leverages Kendra semantic ranking capabilities to improve the quality of search results from other search services (i.e. OpenSearch, ElasticSearch, Solr). +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.23.0](service/networkfirewall/CHANGELOG.md#v1230-2023-01-09) + * **Feature**: Network Firewall now supports the Suricata rule action reject, in addition to the actions pass, drop, and alert. +* `github.com/aws/aws-sdk-go-v2/service/workspacesweb`: [v1.9.0](service/workspacesweb/CHANGELOG.md#v190-2023-01-09) + * **Feature**: This release adds support for a new portal authentication type: AWS IAM Identity Center (successor to AWS Single Sign-On). + +# Release (2023-01-06) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/acmpca`: [v1.21.0](service/acmpca/CHANGELOG.md#v1210-2023-01-06) + * **Feature**: Added revocation parameter validation: bucket names must match S3 bucket naming rules and CNAMEs conform to RFC2396 restrictions on the use of special characters in URIs. +* `github.com/aws/aws-sdk-go-v2/service/auditmanager`: [v1.23.0](service/auditmanager/CHANGELOG.md#v1230-2023-01-06) + * **Feature**: This release introduces a new data retention option in your Audit Manager settings. You can now use the DeregistrationPolicy parameter to specify if you want to delete your data when you deregister Audit Manager. + +# Release (2023-01-05) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/accessanalyzer`: [v1.19.0](service/accessanalyzer/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/account`: [v1.8.0](service/account/CHANGELOG.md#v180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/acm`: [v1.17.0](service/acm/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/acmpca`: [v1.20.0](service/acmpca/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/alexaforbusiness`: [v1.15.0](service/alexaforbusiness/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/amp`: [v1.16.0](service/amp/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/amplify`: [v1.13.0](service/amplify/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/amplifybackend`: [v1.14.0](service/amplifybackend/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + * **Feature**: Updated GetBackendAPIModels response to include ModelIntrospectionSchema json string +* `github.com/aws/aws-sdk-go-v2/service/amplifyuibuilder`: [v1.9.0](service/amplifyuibuilder/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/apigateway`: [v1.16.0](service/apigateway/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi`: [v1.11.0](service/apigatewaymanagementapi/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/apigatewayv2`: [v1.13.0](service/apigatewayv2/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/appconfig`: [v1.15.0](service/appconfig/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/appconfigdata`: [v1.5.0](service/appconfigdata/CHANGELOG.md#v150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.23.0](service/appflow/CHANGELOG.md#v1230-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/appintegrations`: [v1.14.0](service/appintegrations/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/applicationautoscaling`: [v1.17.0](service/applicationautoscaling/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/applicationcostprofiler`: [v1.10.0](service/applicationcostprofiler/CHANGELOG.md#v1100-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/applicationdiscoveryservice`: [v1.15.0](service/applicationdiscoveryservice/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/applicationinsights`: [v1.17.0](service/applicationinsights/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/appmesh`: [v1.17.0](service/appmesh/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/apprunner`: [v1.16.0](service/apprunner/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + * **Feature**: This release adds support of securely referencing secrets and configuration data that are stored in Secrets Manager and SSM Parameter Store by adding them as environment secrets in your App Runner service. +* `github.com/aws/aws-sdk-go-v2/service/appstream`: [v1.19.0](service/appstream/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/appsync`: [v1.18.0](service/appsync/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/arczonalshift`: [v1.1.0](service/arczonalshift/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.22.0](service/athena/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/auditmanager`: [v1.22.0](service/auditmanager/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/autoscaling`: [v1.26.0](service/autoscaling/CHANGELOG.md#v1260-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/autoscalingplans`: [v1.13.0](service/autoscalingplans/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/backup`: [v1.19.0](service/backup/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/backupgateway`: [v1.9.0](service/backupgateway/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/backupstorage`: [v1.1.0](service/backupstorage/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/batch`: [v1.21.0](service/batch/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/billingconductor`: [v1.4.0](service/billingconductor/CHANGELOG.md#v140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/braket`: [v1.17.0](service/braket/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/budgets`: [v1.14.0](service/budgets/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/chime`: [v1.22.0](service/chime/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/chimesdkidentity`: [v1.10.0](service/chimesdkidentity/CHANGELOG.md#v1100-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines`: [v1.2.0](service/chimesdkmediapipelines/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmeetings`: [v1.14.0](service/chimesdkmeetings/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/chimesdkmessaging`: [v1.12.0](service/chimesdkmessaging/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.1.0](service/chimesdkvoice/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloud9`: [v1.17.0](service/cloud9/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudcontrol`: [v1.11.0](service/cloudcontrol/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/clouddirectory`: [v1.13.0](service/clouddirectory/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.25.0](service/cloudformation/CHANGELOG.md#v1250-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudfront`: [v1.24.0](service/cloudfront/CHANGELOG.md#v1240-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudhsm`: [v1.13.0](service/cloudhsm/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudhsmv2`: [v1.14.0](service/cloudhsmv2/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudsearch`: [v1.14.0](service/cloudsearch/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudsearchdomain`: [v1.12.0](service/cloudsearchdomain/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudtrail`: [v1.22.0](service/cloudtrail/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudwatch`: [v1.24.0](service/cloudwatch/CHANGELOG.md#v1240-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchevents`: [v1.15.0](service/cloudwatchevents/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.18.0](service/cloudwatchlogs/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codeartifact`: [v1.14.0](service/codeartifact/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codebuild`: [v1.20.0](service/codebuild/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codecatalyst`: [v1.1.0](service/codecatalyst/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codecommit`: [v1.14.0](service/codecommit/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codedeploy`: [v1.16.0](service/codedeploy/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codeguruprofiler`: [v1.13.0](service/codeguruprofiler/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codegurureviewer`: [v1.17.0](service/codegurureviewer/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codepipeline`: [v1.14.0](service/codepipeline/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codestar`: [v1.13.0](service/codestar/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codestarconnections`: [v1.14.0](service/codestarconnections/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/codestarnotifications`: [v1.14.0](service/codestarnotifications/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cognitoidentity`: [v1.15.0](service/cognitoidentity/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider`: [v1.22.0](service/cognitoidentityprovider/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/cognitosync`: [v1.12.0](service/cognitosync/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/comprehend`: [v1.21.0](service/comprehend/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/comprehendmedical`: [v1.15.0](service/comprehendmedical/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.20.0](service/computeoptimizer/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.29.0](service/configservice/CHANGELOG.md#v1290-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.43.0](service/connect/CHANGELOG.md#v1430-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + * **Feature**: Documentation update for a new Initiation Method value in DescribeContact API +* `github.com/aws/aws-sdk-go-v2/service/connectcampaigns`: [v1.2.0](service/connectcampaigns/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/connectcases`: [v1.2.0](service/connectcases/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/connectcontactlens`: [v1.13.0](service/connectcontactlens/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/connectparticipant`: [v1.14.0](service/connectparticipant/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/controltower`: [v1.1.0](service/controltower/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/costandusagereportservice`: [v1.15.0](service/costandusagereportservice/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/costexplorer`: [v1.25.0](service/costexplorer/CHANGELOG.md#v1250-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/customerprofiles`: [v1.22.0](service/customerprofiles/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/databasemigrationservice`: [v1.23.0](service/databasemigrationservice/CHANGELOG.md#v1230-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/databrew`: [v1.21.0](service/databrew/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/dataexchange`: [v1.18.0](service/dataexchange/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/datapipeline`: [v1.14.0](service/datapipeline/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/datasync`: [v1.21.0](service/datasync/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/dax`: [v1.12.0](service/dax/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/detective`: [v1.18.0](service/detective/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/devicefarm`: [v1.15.0](service/devicefarm/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/devopsguru`: [v1.21.0](service/devopsguru/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/directconnect`: [v1.18.0](service/directconnect/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/directoryservice`: [v1.16.0](service/directoryservice/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/dlm`: [v1.14.0](service/dlm/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/docdb`: [v1.20.0](service/docdb/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/docdbelastic`: [v1.1.0](service/docdbelastic/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.10.0](service/drs/CHANGELOG.md#v1100-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.18.0](service/dynamodb/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/dynamodbstreams`: [v1.14.0](service/dynamodbstreams/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ebs`: [v1.16.0](service/ebs/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect`: [v1.15.0](service/ec2instanceconnect/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ecr`: [v1.18.0](service/ecr/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ecrpublic`: [v1.14.0](service/ecrpublic/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.23.0](service/ecs/CHANGELOG.md#v1230-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/efs`: [v1.19.0](service/efs/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/eks`: [v1.27.0](service/eks/CHANGELOG.md#v1270-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/elasticache`: [v1.26.0](service/elasticache/CHANGELOG.md#v1260-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/elasticbeanstalk`: [v1.15.0](service/elasticbeanstalk/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/elasticinference`: [v1.12.0](service/elasticinference/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing`: [v1.15.0](service/elasticloadbalancing/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2`: [v1.19.0](service/elasticloadbalancingv2/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/elasticsearchservice`: [v1.18.0](service/elasticsearchservice/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/elastictranscoder`: [v1.14.0](service/elastictranscoder/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.22.0](service/emr/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/emrcontainers`: [v1.16.0](service/emrcontainers/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/emrserverless`: [v1.5.0](service/emrserverless/CHANGELOG.md#v150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + * **Feature**: Adds support for customized images. You can now provide runtime images when creating or updating EMR Serverless Applications. +* `github.com/aws/aws-sdk-go-v2/service/eventbridge`: [v1.17.0](service/eventbridge/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/evidently`: [v1.10.0](service/evidently/CHANGELOG.md#v1100-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/finspace`: [v1.9.0](service/finspace/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/finspacedata`: [v1.14.0](service/finspacedata/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/firehose`: [v1.16.0](service/firehose/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/fis`: [v1.14.0](service/fis/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/fms`: [v1.22.0](service/fms/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/forecast`: [v1.24.0](service/forecast/CHANGELOG.md#v1240-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/forecastquery`: [v1.13.0](service/forecastquery/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/frauddetector`: [v1.21.0](service/frauddetector/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/fsx`: [v1.28.0](service/fsx/CHANGELOG.md#v1280-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/gamelift`: [v1.17.0](service/gamelift/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/gamesparks`: [v1.2.0](service/gamesparks/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/glacier`: [v1.14.0](service/glacier/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/globalaccelerator`: [v1.16.0](service/globalaccelerator/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.39.0](service/glue/CHANGELOG.md#v1390-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/grafana`: [v1.11.0](service/grafana/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/greengrass`: [v1.15.0](service/greengrass/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/greengrassv2`: [v1.21.0](service/greengrassv2/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.15.0](service/groundstation/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.17.0](service/guardduty/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/health`: [v1.16.0](service/health/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/healthlake`: [v1.15.0](service/healthlake/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/honeycode`: [v1.13.0](service/honeycode/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.19.0](service/iam/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/identitystore`: [v1.16.0](service/identitystore/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/imagebuilder`: [v1.21.0](service/imagebuilder/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/inspector`: [v1.13.0](service/inspector/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/inspector2`: [v1.11.0](service/inspector2/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.33.0](service/iot/CHANGELOG.md#v1330-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iot1clickdevicesservice`: [v1.11.0](service/iot1clickdevicesservice/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iot1clickprojects`: [v1.12.0](service/iot1clickprojects/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotanalytics`: [v1.14.0](service/iotanalytics/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotdataplane`: [v1.14.0](service/iotdataplane/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotdeviceadvisor`: [v1.17.0](service/iotdeviceadvisor/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotevents`: [v1.15.0](service/iotevents/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ioteventsdata`: [v1.13.0](service/ioteventsdata/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotfleethub`: [v1.13.0](service/iotfleethub/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotfleetwise`: [v1.3.0](service/iotfleetwise/CHANGELOG.md#v130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotjobsdataplane`: [v1.12.0](service/iotjobsdataplane/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotroborunner`: [v1.1.0](service/iotroborunner/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotsecuretunneling`: [v1.15.0](service/iotsecuretunneling/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotsitewise`: [v1.27.0](service/iotsitewise/CHANGELOG.md#v1270-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotthingsgraph`: [v1.14.0](service/iotthingsgraph/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iottwinmaker`: [v1.10.0](service/iottwinmaker/CHANGELOG.md#v1100-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.24.0](service/iotwireless/CHANGELOG.md#v1240-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ivs`: [v1.19.0](service/ivs/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ivschat`: [v1.3.0](service/ivschat/CHANGELOG.md#v130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kafka`: [v1.19.0](service/kafka/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kafkaconnect`: [v1.9.0](service/kafkaconnect/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kendra`: [v1.37.0](service/kendra/CHANGELOG.md#v1370-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/keyspaces`: [v1.1.0](service/keyspaces/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesis`: [v1.17.0](service/kinesis/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesisanalytics`: [v1.14.0](service/kinesisanalytics/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesisanalyticsv2`: [v1.16.0](service/kinesisanalyticsv2/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideo`: [v1.15.0](service/kinesisvideo/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideoarchivedmedia`: [v1.14.0](service/kinesisvideoarchivedmedia/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideomedia`: [v1.11.0](service/kinesisvideomedia/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideosignaling`: [v1.11.0](service/kinesisvideosignaling/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideowebrtcstorage`: [v1.2.0](service/kinesisvideowebrtcstorage/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/kms`: [v1.20.0](service/kms/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lakeformation`: [v1.19.0](service/lakeformation/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.27.0](service/lambda/CHANGELOG.md#v1270-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lexmodelbuildingservice`: [v1.17.0](service/lexmodelbuildingservice/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lexmodelsv2`: [v1.27.0](service/lexmodelsv2/CHANGELOG.md#v1270-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lexruntimeservice`: [v1.13.0](service/lexruntimeservice/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lexruntimev2`: [v1.16.0](service/lexruntimev2/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/licensemanager`: [v1.17.0](service/licensemanager/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/licensemanagerlinuxsubscriptions`: [v1.1.0](service/licensemanagerlinuxsubscriptions/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/licensemanagerusersubscriptions`: [v1.2.0](service/licensemanagerusersubscriptions/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lightsail`: [v1.25.0](service/lightsail/CHANGELOG.md#v1250-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + * **Documentation**: Documentation updates for Amazon Lightsail. +* `github.com/aws/aws-sdk-go-v2/service/location`: [v1.20.0](service/location/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lookoutequipment`: [v1.17.0](service/lookoutequipment/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lookoutmetrics`: [v1.19.0](service/lookoutmetrics/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/lookoutvision`: [v1.15.0](service/lookoutvision/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/m2`: [v1.3.0](service/m2/CHANGELOG.md#v130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/machinelearning`: [v1.15.0](service/machinelearning/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/macie`: [v1.15.0](service/macie/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/macie2`: [v1.26.0](service/macie2/CHANGELOG.md#v1260-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/managedblockchain`: [v1.14.0](service/managedblockchain/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/marketplacecatalog`: [v1.15.0](service/marketplacecatalog/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/marketplacecommerceanalytics`: [v1.12.0](service/marketplacecommerceanalytics/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/marketplaceentitlementservice`: [v1.12.0](service/marketplaceentitlementservice/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/marketplacemetering`: [v1.14.0](service/marketplacemetering/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mediaconnect`: [v1.18.0](service/mediaconnect/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.29.0](service/mediaconvert/CHANGELOG.md#v1290-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/medialive`: [v1.28.0](service/medialive/CHANGELOG.md#v1280-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mediapackage`: [v1.20.0](service/mediapackage/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mediapackagevod`: [v1.21.0](service/mediapackagevod/CHANGELOG.md#v1210-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mediastore`: [v1.13.0](service/mediastore/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mediastoredata`: [v1.13.0](service/mediastoredata/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mediatailor`: [v1.20.0](service/mediatailor/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/memorydb`: [v1.12.0](service/memorydb/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mgn`: [v1.17.0](service/mgn/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/migrationhub`: [v1.13.0](service/migrationhub/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/migrationhubconfig`: [v1.13.0](service/migrationhubconfig/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/migrationhuborchestrator`: [v1.1.0](service/migrationhuborchestrator/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/migrationhubrefactorspaces`: [v1.8.0](service/migrationhubrefactorspaces/CHANGELOG.md#v180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/migrationhubstrategy`: [v1.7.0](service/migrationhubstrategy/CHANGELOG.md#v170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mobile`: [v1.12.0](service/mobile/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mq`: [v1.14.0](service/mq/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mturk`: [v1.14.0](service/mturk/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/mwaa`: [v1.14.0](service/mwaa/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + * **Documentation**: MWAA supports Apache Airflow version 2.4.3. +* `github.com/aws/aws-sdk-go-v2/service/neptune`: [v1.19.0](service/neptune/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.22.0](service/networkfirewall/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/networkmanager`: [v1.17.0](service/networkmanager/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/nimble`: [v1.16.0](service/nimble/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/oam`: [v1.1.0](service/oam/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.1.0](service/omics/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.12.0](service/opensearch/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/opensearchserverless`: [v1.1.0](service/opensearchserverless/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/opsworks`: [v1.14.0](service/opsworks/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/opsworkscm`: [v1.15.0](service/opsworkscm/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/organizations`: [v1.18.0](service/organizations/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/outposts`: [v1.24.0](service/outposts/CHANGELOG.md#v1240-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/panorama`: [v1.10.0](service/panorama/CHANGELOG.md#v1100-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/personalize`: [v1.23.0](service/personalize/CHANGELOG.md#v1230-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/personalizeevents`: [v1.13.0](service/personalizeevents/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/personalizeruntime`: [v1.13.0](service/personalizeruntime/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/pi`: [v1.16.0](service/pi/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/pinpoint`: [v1.18.0](service/pinpoint/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/pinpointemail`: [v1.12.0](service/pinpointemail/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/pinpointsmsvoice`: [v1.11.0](service/pinpointsmsvoice/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/pinpointsmsvoicev2`: [v1.1.0](service/pinpointsmsvoicev2/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/pipes`: [v1.1.0](service/pipes/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.22.0](service/polly/CHANGELOG.md#v1220-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/pricing`: [v1.18.0](service/pricing/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/privatenetworks`: [v1.1.0](service/privatenetworks/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/proton`: [v1.19.0](service/proton/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/qldb`: [v1.15.0](service/qldb/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/qldbsession`: [v1.14.0](service/qldbsession/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.29.0](service/quicksight/CHANGELOG.md#v1290-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ram`: [v1.17.0](service/ram/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/rbin`: [v1.8.0](service/rbin/CHANGELOG.md#v180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.39.0](service/rds/CHANGELOG.md#v1390-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + * **Feature**: This release adds support for specifying which certificate authority (CA) to use for a DB instance's server certificate during DB instance creation, as well as other CA enhancements. +* `github.com/aws/aws-sdk-go-v2/service/rdsdata`: [v1.13.0](service/rdsdata/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/redshift`: [v1.27.0](service/redshift/CHANGELOG.md#v1270-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/redshiftdata`: [v1.18.0](service/redshiftdata/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.4.0](service/redshiftserverless/CHANGELOG.md#v140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.23.0](service/rekognition/CHANGELOG.md#v1230-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.8.0](service/resiliencehub/CHANGELOG.md#v180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/resourceexplorer2`: [v1.2.0](service/resourceexplorer2/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/resourcegroups`: [v1.13.0](service/resourcegroups/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi`: [v1.14.0](service/resourcegroupstaggingapi/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/robomaker`: [v1.18.0](service/robomaker/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/rolesanywhere`: [v1.1.0](service/rolesanywhere/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/route53`: [v1.26.0](service/route53/CHANGELOG.md#v1260-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/route53domains`: [v1.14.0](service/route53domains/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/route53recoverycluster`: [v1.11.0](service/route53recoverycluster/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/route53recoverycontrolconfig`: [v1.11.0](service/route53recoverycontrolconfig/CHANGELOG.md#v1110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/route53recoveryreadiness`: [v1.9.0](service/route53recoveryreadiness/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/route53resolver`: [v1.16.0](service/route53resolver/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/rum`: [v1.9.0](service/rum/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/s3`: [v1.30.0](service/s3/CHANGELOG.md#v1300-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/s3control`: [v1.29.0](service/s3control/CHANGELOG.md#v1290-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/s3outposts`: [v1.14.0](service/s3outposts/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.62.0](service/sagemaker/CHANGELOG.md#v1620-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sagemakera2iruntime`: [v1.15.0](service/sagemakera2iruntime/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sagemakeredge`: [v1.13.0](service/sagemakeredge/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sagemakerfeaturestoreruntime`: [v1.13.0](service/sagemakerfeaturestoreruntime/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sagemakergeospatial`: [v1.1.0](service/sagemakergeospatial/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sagemakerruntime`: [v1.17.0](service/sagemakerruntime/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/savingsplans`: [v1.12.0](service/savingsplans/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/scheduler`: [v1.1.0](service/scheduler/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/schemas`: [v1.15.0](service/schemas/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.18.0](service/secretsmanager/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.27.0](service/securityhub/CHANGELOG.md#v1270-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/securitylake`: [v1.2.0](service/securitylake/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/serverlessapplicationrepository`: [v1.12.0](service/serverlessapplicationrepository/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.16.0](service/servicecatalog/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/servicecatalogappregistry`: [v1.16.0](service/servicecatalogappregistry/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/servicediscovery`: [v1.19.0](service/servicediscovery/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/servicequotas`: [v1.14.0](service/servicequotas/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ses`: [v1.15.0](service/ses/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sesv2`: [v1.16.0](service/sesv2/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sfn`: [v1.17.0](service/sfn/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/shield`: [v1.18.0](service/shield/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/signer`: [v1.14.0](service/signer/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/simspaceweaver`: [v1.1.0](service/simspaceweaver/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sms`: [v1.13.0](service/sms/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/snowball`: [v1.17.0](service/snowball/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/snowdevicemanagement`: [v1.9.0](service/snowdevicemanagement/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sns`: [v1.19.0](service/sns/CHANGELOG.md#v1190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sqs`: [v1.20.0](service/sqs/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.35.0](service/ssm/CHANGELOG.md#v1350-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ssmcontacts`: [v1.14.0](service/ssmcontacts/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ssmincidents`: [v1.20.0](service/ssmincidents/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ssmsap`: [v1.1.0](service/ssmsap/CHANGELOG.md#v110-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sso`: [v1.12.0](service/sso/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ssoadmin`: [v1.16.0](service/ssoadmin/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/ssooidc`: [v1.14.0](service/ssooidc/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/storagegateway`: [v1.18.0](service/storagegateway/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/sts`: [v1.18.0](service/sts/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/support`: [v1.14.0](service/support/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/supportapp`: [v1.2.0](service/supportapp/CHANGELOG.md#v120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/swf`: [v1.14.0](service/swf/CHANGELOG.md#v1140-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/synthetics`: [v1.17.0](service/synthetics/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/textract`: [v1.20.0](service/textract/CHANGELOG.md#v1200-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/timestreamquery`: [v1.15.0](service/timestreamquery/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/timestreamwrite`: [v1.15.0](service/timestreamwrite/CHANGELOG.md#v1150-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/transcribe`: [v1.25.0](service/transcribe/CHANGELOG.md#v1250-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/transcribestreaming`: [v1.9.0](service/transcribestreaming/CHANGELOG.md#v190-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.28.0](service/transfer/CHANGELOG.md#v1280-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/translate`: [v1.17.0](service/translate/CHANGELOG.md#v1170-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/voiceid`: [v1.12.0](service/voiceid/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/waf`: [v1.12.0](service/waf/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/wafregional`: [v1.13.0](service/wafregional/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.24.0](service/wafv2/CHANGELOG.md#v1240-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/wellarchitected`: [v1.18.0](service/wellarchitected/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/wisdom`: [v1.12.0](service/wisdom/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/workdocs`: [v1.13.0](service/workdocs/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/worklink`: [v1.13.0](service/worklink/CHANGELOG.md#v1130-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/workmail`: [v1.18.0](service/workmail/CHANGELOG.md#v1180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/workmailmessageflow`: [v1.12.0](service/workmailmessageflow/CHANGELOG.md#v1120-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.28.0](service/workspaces/CHANGELOG.md#v1280-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/workspacesweb`: [v1.8.0](service/workspacesweb/CHANGELOG.md#v180-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). +* `github.com/aws/aws-sdk-go-v2/service/xray`: [v1.16.0](service/xray/CHANGELOG.md#v1160-2023-01-05) + * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). + +# Release (2023-01-04) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/applicationautoscaling`: [v1.16.0](service/applicationautoscaling/CHANGELOG.md#v1160-2023-01-04) + * **Feature**: Customers can now use the existing DescribeScalingActivities API to also see the detailed and machine-readable reasons for Application Auto Scaling not scaling their resources and, if needed, take the necessary corrective actions. +* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.17.4](service/cloudwatchlogs/CHANGELOG.md#v1174-2023-01-04) + * **Documentation**: Update to remove sequenceToken as a required field in PutLogEvents calls. +* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.34.0](service/ssm/CHANGELOG.md#v1340-2023-01-04) + * **Feature**: Adding support for QuickSetup Document Type in Systems Manager + +# Release (2023-01-03) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/securitylake`: [v1.1.0](service/securitylake/CHANGELOG.md#v110-2023-01-03) + * **Feature**: Allow CreateSubscriber API to take string input that allows setting more descriptive SubscriberDescription field. Make souceTypes field required in model level for UpdateSubscriberRequest as it is required for every API call on the backend. Allow ListSubscribers take any String as nextToken param. + +# Release (2022-12-30) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/cloudfront`: [v1.23.0](service/cloudfront/CHANGELOG.md#v1230-2022-12-30) + * **Feature**: Extend response headers policy to support removing headers from viewer responses +* `github.com/aws/aws-sdk-go-v2/service/iotfleetwise`: [v1.2.1](service/iotfleetwise/CHANGELOG.md#v121-2022-12-30) + * **Documentation**: Update documentation - correct the epoch constant value of default value for expiryTime field in CreateCampaign request. + +# Release (2022-12-29) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/apigateway`: [v1.15.28](service/apigateway/CHANGELOG.md#v11528-2022-12-29) + * **Documentation**: Documentation updates for Amazon API Gateway +* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.21.0](service/emr/CHANGELOG.md#v1210-2022-12-29) + * **Feature**: Added GetClusterSessionCredentials API to allow Amazon SageMaker Studio to connect to EMR on EC2 clusters with runtime roles and AWS Lake Formation-based access control for Apache Spark, Apache Hive, and Presto queries. +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.17.0](service/secretsmanager/CHANGELOG.md#v1170-2022-12-29) + * **Feature**: Added owning service filter, include planned deletion flag, and next rotation date response parameter in ListSecrets. +* `github.com/aws/aws-sdk-go-v2/service/wisdom`: [v1.11.0](service/wisdom/CHANGELOG.md#v1110-2022-12-29) + * **Feature**: This release extends Wisdom CreateContent and StartContentUpload APIs to support PDF and MicrosoftWord docx document uploading. + +# Release (2022-12-28) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/elasticache`: [v1.25.0](service/elasticache/CHANGELOG.md#v1250-2022-12-28) + * **Feature**: This release allows you to modify the encryption in transit setting, for existing Redis clusters. You can now change the TLS configuration of your Redis clusters without the need to re-build or re-provision the clusters or impact application availability. +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.21.0](service/networkfirewall/CHANGELOG.md#v1210-2022-12-28) + * **Feature**: AWS Network Firewall now provides status messages for firewalls to help you troubleshoot when your endpoint fails. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.38.0](service/rds/CHANGELOG.md#v1380-2022-12-28) + * **Feature**: This release adds support for Custom Engine Version (CEV) on RDS Custom SQL Server. +* `github.com/aws/aws-sdk-go-v2/service/route53recoverycontrolconfig`: [v1.10.0](service/route53recoverycontrolconfig/CHANGELOG.md#v1100-2022-12-28) + * **Feature**: Added support for Python paginators in the route53-recovery-control-config List* APIs. + +# Release (2022-12-27) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/memorydb`: [v1.11.0](service/memorydb/CHANGELOG.md#v1110-2022-12-27) + * **Feature**: This release adds support for MemoryDB Reserved nodes which provides a significant discount compared to on-demand node pricing. Reserved nodes are not physical nodes, but rather a billing discount applied to the use of on-demand nodes in your account. +* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.27.0](service/transfer/CHANGELOG.md#v1270-2022-12-27) + * **Feature**: Add additional operations to throw ThrottlingExceptions + +# Release (2022-12-23) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.42.0](service/connect/CHANGELOG.md#v1420-2022-12-23) + * **Feature**: Support for Routing Profile filter, SortCriteria, and grouping by Routing Profiles for GetCurrentMetricData API. Support for RoutingProfiles, UserHierarchyGroups, and Agents as filters, NextStatus and AgentStatusName for GetCurrentUserData. Adds ApproximateTotalCount to both APIs. +* `github.com/aws/aws-sdk-go-v2/service/connectparticipant`: [v1.13.0](service/connectparticipant/CHANGELOG.md#v1130-2022-12-23) + * **Feature**: Amazon Connect Chat introduces the Message Receipts feature. This feature allows agents and customers to receive message delivered and read receipts after they send a chat message. +* `github.com/aws/aws-sdk-go-v2/service/detective`: [v1.17.0](service/detective/CHANGELOG.md#v1170-2022-12-23) + * **Feature**: This release adds a missed AccessDeniedException type to several endpoints. +* `github.com/aws/aws-sdk-go-v2/service/fsx`: [v1.27.0](service/fsx/CHANGELOG.md#v1270-2022-12-23) + * **Feature**: Fix a bug where a recent release might break certain existing SDKs. +* `github.com/aws/aws-sdk-go-v2/service/inspector2`: [v1.10.0](service/inspector2/CHANGELOG.md#v1100-2022-12-23) + * **Feature**: Amazon Inspector adds support for scanning NodeJS 18.x and Go 1.x AWS Lambda function runtimes. + +# Release (2022-12-22) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.19.0](service/computeoptimizer/CHANGELOG.md#v1190-2022-12-22) + * **Feature**: This release enables AWS Compute Optimizer to analyze and generate optimization recommendations for ecs services running on Fargate. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.41.0](service/connect/CHANGELOG.md#v1410-2022-12-22) + * **Feature**: Amazon Connect Chat introduces the Idle Participant/Autodisconnect feature, which allows users to set timeouts relating to the activity of chat participants, using the new UpdateParticipantRoleConfig API. +* `github.com/aws/aws-sdk-go-v2/service/iotdeviceadvisor`: [v1.16.0](service/iotdeviceadvisor/CHANGELOG.md#v1160-2022-12-22) + * **Feature**: This release adds the following new features: 1) Documentation updates for IoT Device Advisor APIs. 2) Updated required request parameters for IoT Device Advisor APIs. 3) Added new service feature: ability to provide the test endpoint when customer executing the StartSuiteRun API. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideowebrtcstorage`: [v1.1.0](service/kinesisvideowebrtcstorage/CHANGELOG.md#v110-2022-12-22) + * **Feature**: Amazon Kinesis Video Streams offers capabilities to stream video and audio in real-time via WebRTC to the cloud for storage, playback, and analytical processing. Customers can use our enhanced WebRTC SDK and cloud APIs to enable real-time streaming, as well as media ingestion to the cloud. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.37.0](service/rds/CHANGELOG.md#v1370-2022-12-22) + * **Feature**: Add support for managing master user password in AWS Secrets Manager for the DBInstance and DBCluster. +* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.16.11](service/secretsmanager/CHANGELOG.md#v11611-2022-12-22) + * **Documentation**: Documentation updates for Secrets Manager + +# Release (2022-12-21) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/licensemanagerlinuxsubscriptions`: [v1.0.0](service/licensemanagerlinuxsubscriptions/CHANGELOG.md#v100-2022-12-21) + * **Release**: New AWS service client module + * **Feature**: AWS License Manager now offers cross-region, cross-account tracking of commercial Linux subscriptions on AWS. This includes subscriptions purchased as part of EC2 subscription-included AMIs, on the AWS Marketplace, or brought to AWS via Red Hat Cloud Access Program. +* `github.com/aws/aws-sdk-go-v2/service/macie2`: [v1.25.0](service/macie2/CHANGELOG.md#v1250-2022-12-21) + * **Feature**: This release adds support for analyzing Amazon S3 objects that use the S3 Glacier Instant Retrieval (Glacier_IR) storage class. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.61.0](service/sagemaker/CHANGELOG.md#v1610-2022-12-21) + * **Feature**: This release enables adding RStudio Workbench support to an existing Amazon SageMaker Studio domain. It allows setting your RStudio on SageMaker environment configuration parameters and also updating the RStudioConnectUrl and RStudioPackageManagerUrl parameters for existing domains +* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.33.4](service/ssm/CHANGELOG.md#v1334-2022-12-21) + * **Documentation**: Doc-only updates for December 2022. +* `github.com/aws/aws-sdk-go-v2/service/support`: [v1.13.22](service/support/CHANGELOG.md#v11322-2022-12-21) + * **Documentation**: Documentation updates for the AWS Support API +* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.26.0](service/transfer/CHANGELOG.md#v1260-2022-12-21) + * **Feature**: This release adds support for Decrypt as a workflow step type. + +# Release (2022-12-20) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/batch`: [v1.20.0](service/batch/CHANGELOG.md#v1200-2022-12-20) + * **Feature**: Adds isCancelled and isTerminated to DescribeJobs response. +* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.77.0](service/ec2/CHANGELOG.md#v1770-2022-12-20) + * **Feature**: Adds support for pagination in the EC2 DescribeImages API. +* `github.com/aws/aws-sdk-go-v2/service/lookoutequipment`: [v1.16.0](service/lookoutequipment/CHANGELOG.md#v1160-2022-12-20) + * **Feature**: This release adds support for listing inference schedulers by status. +* `github.com/aws/aws-sdk-go-v2/service/medialive`: [v1.27.0](service/medialive/CHANGELOG.md#v1270-2022-12-20) + * **Feature**: This release adds support for two new features to AWS Elemental MediaLive. First, you can now burn-in timecodes to your MediaLive outputs. Second, we now now support the ability to decode Dolby E audio when it comes in on an input. +* `github.com/aws/aws-sdk-go-v2/service/nimble`: [v1.15.0](service/nimble/CHANGELOG.md#v1150-2022-12-20) + * **Feature**: Amazon Nimble Studio now supports configuring session storage volumes and persistence, as well as backup and restore sessions through launch profiles. +* `github.com/aws/aws-sdk-go-v2/service/resourceexplorer2`: [v1.1.0](service/resourceexplorer2/CHANGELOG.md#v110-2022-12-20) + * **Feature**: Documentation updates for AWS Resource Explorer. +* `github.com/aws/aws-sdk-go-v2/service/route53domains`: [v1.13.0](service/route53domains/CHANGELOG.md#v1130-2022-12-20) + * **Feature**: Use Route 53 domain APIs to change owner, create/delete DS record, modify IPS tag, resend authorization. New: AssociateDelegationSignerToDomain, DisassociateDelegationSignerFromDomain, PushDomain, ResendOperationAuthorization. Updated: UpdateDomainContact, ListOperations, CheckDomainTransferability. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.60.0](service/sagemaker/CHANGELOG.md#v1600-2022-12-20) + * **Feature**: Amazon SageMaker Autopilot adds support for new objective metrics in CreateAutoMLJob API. +* `github.com/aws/aws-sdk-go-v2/service/transcribe`: [v1.24.0](service/transcribe/CHANGELOG.md#v1240-2022-12-20) + * **Feature**: Enable our batch transcription jobs for Swedish and Vietnamese. + +# Release (2022-12-19) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.21.0](service/athena/CHANGELOG.md#v1210-2022-12-19) + * **Feature**: Add missed InvalidRequestException in GetCalculationExecutionCode,StopCalculationExecution APIs. Correct required parameters (Payload and Type) in UpdateNotebook API. Change Notebook size from 15 Mb to 10 Mb. +* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.22.0](service/ecs/CHANGELOG.md#v1220-2022-12-19) + * **Feature**: This release adds support for alarm-based rollbacks in ECS, a new feature that allows customers to add automated safeguards for Amazon ECS service rolling updates. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideo`: [v1.14.0](service/kinesisvideo/CHANGELOG.md#v1140-2022-12-19) + * **Feature**: Amazon Kinesis Video Streams offers capabilities to stream video and audio in real-time via WebRTC to the cloud for storage, playback, and analytical processing. Customers can use our enhanced WebRTC SDK and cloud APIs to enable real-time streaming, as well as media ingestion to the cloud. +* `github.com/aws/aws-sdk-go-v2/service/kinesisvideowebrtcstorage`: [v1.0.0](service/kinesisvideowebrtcstorage/CHANGELOG.md#v100-2022-12-19) + * **Release**: New AWS service client module + * **Feature**: Amazon Kinesis Video Streams offers capabilities to stream video and audio in real-time via WebRTC to the cloud for storage, playback, and analytical processing. Customers can use our enhanced WebRTC SDK and cloud APIs to enable real-time streaming, as well as media ingestion to the cloud. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.36.0](service/rds/CHANGELOG.md#v1360-2022-12-19) + * **Feature**: Add support for --enable-customer-owned-ip to RDS create-db-instance-read-replica API for RDS on Outposts. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.59.0](service/sagemaker/CHANGELOG.md#v1590-2022-12-19) + * **Feature**: AWS Sagemaker - Sagemaker Images now supports Aliases as secondary identifiers for ImageVersions. SageMaker Images now supports additional metadata for ImageVersions for better images management. + +# Release (2022-12-16) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.22.0](service/appflow/CHANGELOG.md#v1220-2022-12-16) + * **Feature**: This release updates the ListConnectorEntities API action so that it returns paginated responses that customers can retrieve with next tokens. +* `github.com/aws/aws-sdk-go-v2/service/cloudfront`: [v1.22.2](service/cloudfront/CHANGELOG.md#v1222-2022-12-16) + * **Documentation**: Updated documentation for CloudFront +* `github.com/aws/aws-sdk-go-v2/service/datasync`: [v1.20.0](service/datasync/CHANGELOG.md#v1200-2022-12-16) + * **Feature**: AWS DataSync now supports the use of tags with task executions. With this new feature, you can apply tags each time you execute a task, giving you greater control and management over your task executions. +* `github.com/aws/aws-sdk-go-v2/service/efs`: [v1.18.3](service/efs/CHANGELOG.md#v1183-2022-12-16) + * **Documentation**: General documentation updates for EFS. +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.16.6](service/guardduty/CHANGELOG.md#v1166-2022-12-16) + * **Documentation**: This release provides the valid characters for the Description and Name field. +* `github.com/aws/aws-sdk-go-v2/service/iotfleetwise`: [v1.2.0](service/iotfleetwise/CHANGELOG.md#v120-2022-12-16) + * **Feature**: Updated error handling for empty resource names in "UpdateSignalCatalog" and "GetModelManifest" operations. +* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.58.0](service/sagemaker/CHANGELOG.md#v1580-2022-12-16) + * **Feature**: AWS sagemaker - Features: This release adds support for random seed, it's an integer value used to initialize a pseudo-random number generator. Setting a random seed will allow the hyperparameter tuning search strategies to produce more consistent configurations for the same tuning job. + # Release (2022-12-15) ## General Highlights @@ -6199,7 +9673,7 @@ * Fixes [issue#1191](https://github.com/aws/aws-sdk-go-v2/issues/1191) * Refactored internal endpoints model for accessors * Feature: updated to latest models -* New services +* New services * `service/location` - v1.0.0 * `service/lookoutmetrics` - v1.0.0 ## Core SDK Highlights @@ -6283,7 +9757,7 @@ of the AWS SDK for Go v2. Version 2 incorporates customer feedback from version ## Breaking Changes * `aws`: Updated Config.Retryer member to be a func that returns aws.Retryer ([#1033](https://github.com/aws/aws-sdk-go-v2/pull/1033)) - * Updates the SDK's references to Config.Retryer to be a function that returns aws.Retryer value. This ensures that custom retry options specified in the `aws.Config` are scoped to individual client instances. + * Updates the SDK's references to Config.Retryer to be a function that returns aws.Retryer value. This ensures that custom retry options specified in the `aws.Config` are scoped to individual client instances. * All API clients created with the config will call the `Config.Retryer` function to get an aws.Retryer. * Removes duplicate `Retryer` interface from `retry` package. Single definition is `aws.Retryer` now. * `aws/middleware`: Updates `AddAttemptClockSkewMiddleware` to use appropriate `AddRecordResponseTiming` naming ([#1031](https://github.com/aws/aws-sdk-go-v2/pull/1031)) @@ -6291,7 +9765,7 @@ of the AWS SDK for Go v2. Version 2 incorporates customer feedback from version * `config`: Updated the `WithRetryer` helper to take a function that returns an aws.Retryer ([#1033](https://github.com/aws/aws-sdk-go-v2/pull/1033)) * All API clients created with the config will call the `Config.Retryer` function to get an aws.Retryer. * `API Clients`: Fix SDK's API client enum constant name generation to have expected casing ([#1020](https://github.com/aws/aws-sdk-go-v2/pull/1020)) - * This updates of the generated enum const value names in API client's `types` package to have the expected casing. Prior to this, enum names were being generated with lowercase names instead of camel case. + * This updates of the generated enum const value names in API client's `types` package to have the expected casing. Prior to this, enum names were being generated with lowercase names instead of camel case. * `API Clients`: Updates SDK's API client request middleware stack values to be scoped to individual operation call ([#1019](https://github.com/aws/aws-sdk-go-v2/pull/1019)) * The API client request middleware stack values were mistakenly allowed to escape to nested API operation calls. This broke the SDK's presigners. * Stack values that should not escape are not scoped to the individual operation call. @@ -6303,7 +9777,7 @@ of the AWS SDK for Go v2. Version 2 incorporates customer feedback from version * Adds a PresignClient to the `sts` API client module. Use PresignGetCallerIdentity to obtain presigned URLs for the create presigned URLs for the GetCallerIdentity operation. * Fixes [#1021](https://github.com/aws/aws-sdk-go-v2/issues/1021) * `aws/retry`: Add package documentation for retry package ([#1033](https://github.com/aws/aws-sdk-go-v2/pull/1033)) - * Adds documentation for the retry package + * Adds documentation for the retry package ## Bug Fixes * `Multiple API Clients`: Fix SDK's generated serde for unmodeled operation input/output ([#1050](https://github.com/aws/aws-sdk-go-v2/pull/1050)) @@ -6401,7 +9875,6 @@ feedback and to take advantage of modern Go language features. * Add support for reading `s3_use_arn_region` from shared config file ([#991](https://github.com/aws/aws-sdk-go-v2/pull/991)) * Add Utility for getting RequestID and HostID of response ([#983](https://github.com/aws/aws-sdk-go-v2/pull/983)) - ## Other changes * Updates branch `HEAD` points from `master` to `main`. * This should not impact your application, but if you have pull requests or forks of the SDK you may need to update the upstream branch your fork is based off of. @@ -6432,7 +9905,6 @@ The `config#LoadDefaultConfig` function has been updated to require a `context.C The v2 SDK corrects its behavior to be inline with the AWS CLI and other AWS SDKs. Refer to https://docs.aws.amazon.com/credref/latest/refdocs/overview.html for more information how to use the shared config and credentials files. - # Release 2020-11-30 ## Breaking Change @@ -6592,7 +10064,6 @@ The `config` module's exported types were trimmed down to add clarity and reduce * `credentials` module released at `v0.1.1` * `ec2imds` module released at `v0.1.1` - # Release 2020-09-28 ## Announcements We’re happy to share the updated clients for the v0.25.0 preview version of the AWS SDK for Go V2. @@ -6632,7 +10103,6 @@ As a part of the refactoring done to v2 preview SDK some components have not bee We expect additional breaking changes to the v2 preview SDK in the coming releases. We expect these changes to focus on organizational, naming, and hardening the SDK's design for future feature capabilities after it is released for general availability. - #### Relocated Packages In this release packages within the SDK were relocated, and in some cases those packages were converted to Go modules. The following is a list of packages have were relocated. @@ -6647,7 +10117,6 @@ The `github.com/aws/aws-sdk-go-v2/credentials` module contains refactored creden * `github.com/aws/aws-sdk-go-v2/processcreds` => `github.com/aws/aws-sdk-go-v2/credentials/processcreds` * `github.com/aws/aws-sdk-go-v2/stscreds` => `github.com/aws/aws-sdk-go-v2/credentials/stscreds` - #### Modularization New modules were added to the v2 preview SDK to allow the components to be versioned independently from each other. This allows your application to depend on specific versions of an API client module, and take discrete updates from the SDK core and other API client modules as desired. @@ -6656,7 +10125,6 @@ New modules were added to the v2 preview SDK to allow the components to be versi * [github.com/aws/aws-sdk-go-v2/credentials](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials) * Module for each API client, e.g. [github.com/aws/aws-sdk-go-v2/service/s3](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3) - #### API Clients The following is a list of the major changes to the API client modules @@ -6676,14 +10144,12 @@ result, err := client.Scan(context.TODO(), &dynamodb.ScanInput{ }) ``` - #### Configuration In addition to the `github.com/aws/aws-sdk-go-v2/aws/external` package being made a module at `github.com/aws/aws-sdk-go-v2/config`, the `LoadDefaultAWSConfig` function was renamed to `LoadDefaultConfig`. The `github.com/aws/aws-sdk-go-v2/aws/defaults` package has been removed. Its components have been migrated to the `github.com/aws/aws-sdk-go-v2/aws` package, and `github.com/aws/aws-sdk-go-v2/config` module. - #### Error Handling The `github.com/aws/aws-sdk-go-v2/aws/awserr` package was removed as a part of the SDK error handling refactor. The SDK now uses typed errors built around [Go v1.13](https://golang.org/doc/go1.13#error_wrapping)'s [errors.As](https://pkg.go.dev/errors#As) and [errors.Unwrap](https://pkg.go.dev/errors#Unwrap) features. All SDK error types that wrap other errors implement the `Unwrap` method. Generic v2 preview SDK errors created with `fmt.Errorf` use `%w` to wrap the underlying error. @@ -6726,7 +10192,6 @@ Logging an error value will include information from each wrapped error. For exa > 2020/10/15 16:03:37 operation error DynamoDB: Scan, https response error StatusCode: 400, RequestID: ABCREQUESTID123, ResourceNotFoundException: Requested resource not found - #### Endpoints The `github.com/aws/aws-sdk-go-v2/aws/endpoints` has been removed from the SDK, along with all exported endpoint definitions and iteration behavior. Each generated API client now includes its own endpoint definition internally to the module. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/CODE_OF_CONDUCT.md b/vendor/github.com/aws/aws-sdk-go-v2/CODE_OF_CONDUCT.md index 3b64466870..5b627cfa60 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/CODE_OF_CONDUCT.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/CODE_OF_CONDUCT.md @@ -1,4 +1,4 @@ ## Code of Conduct -This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). -For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact opensource-codeofconduct@amazon.com with any additional questions or comments. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/CONTRIBUTING.md b/vendor/github.com/aws/aws-sdk-go-v2/CONTRIBUTING.md index c2fc3b8f5b..5e59bba7ba 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/CONTRIBUTING.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/CONTRIBUTING.md @@ -14,29 +14,28 @@ Jump To: * [Feature Requests](#feature-requests) * [Code Contributions](#code-contributions) - ## How to contribute *Before you send us a pull request, please be sure that:* -1. You're working from the latest source on the master branch. -2. You check existing open, and recently closed, pull requests to be sure +1. You're working from the latest source on the `main` branch. +2. You check existing open, and recently closed, pull requests to be sure that someone else hasn't already addressed the problem. -3. You create an issue before working on a contribution that will take a +3. You create an issue before working on a contribution that will take a significant amount of your time. *Creating a Pull Request* 1. Fork the repository. -2. In your fork, make your change in a branch that's based on this repo's master branch. +2. In your fork, make your change in a branch that's based on this repo's `main` branch. 3. Commit the change to your fork, using a clear and descriptive commit message. 4. Create a pull request, answering any questions in the pull request form. -For contributions that will take a significant amount of time, open a new -issue to pitch your idea before you get started. Explain the problem and -describe the content you want to see added to the documentation. Let us know -if you'll write it yourself or if you'd like us to help. We'll discuss your -proposal with you and let you know whether we're likely to accept it. +For contributions that will take a significant amount of time, open a new +issue to pitch your idea before you get started. Explain the problem and +describe the content you want to see added to the documentation. Let us know +if you'll write it yourself or if you'd like us to help. We'll discuss your +proposal with you and let you know whether we're likely to accept it. ## Bug Reports @@ -74,9 +73,9 @@ guidelines prior to filing a bug report. Open an [issue][issues] with the following: -* A short, descriptive title. Ideally, other community members should be able +* A short, descriptive title. Ideally, other community members should be able to get a good idea of the feature just from reading the title. -* A detailed description of the the proposed feature. +* A detailed description of the the proposed feature. * Why it should be added to the SDK. * If possible, example code to illustrate how it should work. * Use Markdown to make the request easier to read; @@ -97,7 +96,7 @@ Please be aware of the following notes prior to opening a pull request: 3. Wherever possible, pull requests should contain tests as appropriate. Bugfixes should contain tests that exercise the corrected behavior (i.e., the - test should fail without the bugfix and pass with it), and new features + test should fail without the bugfix and pass with it), and new features should be accompanied by tests exercising the feature. 4. Pull requests that contain failing tests will not be merged until the test @@ -112,7 +111,7 @@ Please be aware of the following notes prior to opening a pull request: ### Testing -To run the tests locally, running the `make unit` command will `go get` the +To run the tests locally, running the `make unit` command will `go get` the SDK's testing dependencies, and run vet, link and unit tests for the SDK. ``` @@ -129,7 +128,7 @@ go test -tags codegen ./private/... See the `Makefile` for additional testing tags that can be used in testing. -To test on multiple platform the SDK includes several DockerFiles under the +To test on multiple platform the SDK includes several DockerFiles under the `awstesting/sandbox` folder, and associated make recipes to to execute unit testing within environments configured for specific Go versions. @@ -170,9 +169,9 @@ This will result in a patch version change. * `SDK Bugs` - For minor changes that resolve an issue. This will result in a patch version change. -[issues]: https://github.com/aws/aws-sdk-go/issues -[pr]: https://github.com/aws/aws-sdk-go/pulls +[issues]: https://github.com/aws/aws-sdk-go-v2/issues +[pr]: https://github.com/aws/aws-sdk-go-v2/pulls [license]: http://aws.amazon.com/apache2.0/ [cla]: http://en.wikipedia.org/wiki/Contributor_License_Agreement -[releasenotes]: https://github.com/aws/aws-sdk-go/releases +[releasenotes]: https://github.com/aws/aws-sdk-go-v2/releases diff --git a/vendor/github.com/aws/aws-sdk-go-v2/DESIGN.md b/vendor/github.com/aws/aws-sdk-go-v2/DESIGN.md index 8490c7d673..4c9be94a2f 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/DESIGN.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/DESIGN.md @@ -12,4 +12,4 @@ Past Discussions --- The issues listed here are for documentation purposes, and is used to capture issues and their associated discussions. -[Code of Conduct]: https://github.com/aws/aws-sdk-go-v2/blob/master/CODE_OF_CONDUCT.md +[Code of Conduct]: https://github.com/aws/aws-sdk-go-v2/blob/main/CODE_OF_CONDUCT.md diff --git a/vendor/github.com/aws/aws-sdk-go-v2/Makefile b/vendor/github.com/aws/aws-sdk-go-v2/Makefile index 4bc9dfaf01..4f74a26541 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/Makefile +++ b/vendor/github.com/aws/aws-sdk-go-v2/Makefile @@ -246,7 +246,6 @@ unit-race-modules-%: "go test ${BUILD_TAGS} ${RUN_NONE} ./..." \ "go test -timeout=1m ${UNIT_TEST_TAGS} -race -cpu=4 ./..." - unit-modules-%: @# unit command that uses the pattern to define the root path that the @# module testing will start from. Strips off the "unit-modules-" and @@ -408,7 +407,6 @@ bench-modules-%: && go run . -p $(subst _,/,$(subst bench-modules-,,$@)) ${EACHMODULE_FLAGS} \ "go test -timeout=10m -bench . --benchmem ${BUILD_TAGS} ${RUN_NONE} ./..." - ##################### # Release Process # ##################### @@ -499,14 +497,22 @@ list-deps-%: ################### .PHONY: sandbox-tests sandbox-build-% sandbox-run-% sandbox-test-% update-aws-golang-tip -sandbox-tests: sandbox-test-go1.15 sandbox-test-go1.16 sandbox-test-go1.17 sandbox-test-gotip +sandbox-tests: sandbox-test-go1.15 sandbox-test-go1.16 sandbox-test-go1.17 sandbox-test-go1.18 sandbox-test-go1.19 sandbox-test-go1.20 sandbox-test-gotip sandbox-build-%: @# sandbox-build-go1.17 @# sandbox-build-gotip - docker build \ - -f ./internal/awstesting/sandbox/Dockerfile.test.$(subst sandbox-build-,,$@) \ - -t "aws-sdk-go-$(subst sandbox-build-,,$@)" . + @if [ $@ == sandbox-build-gotip ]; then\ + docker build \ + -f ./internal/awstesting/sandbox/Dockerfile.test.gotip \ + -t "aws-sdk-go-$(subst sandbox-build-,,$@)" . ;\ + else\ + docker build \ + --build-arg GO_VERSION=$(subst sandbox-build-go,,$@) \ + -f ./internal/awstesting/sandbox/Dockerfile.test.goversion \ + -t "aws-sdk-go-$(subst sandbox-build-,,$@)" . ;\ + fi + sandbox-run-%: sandbox-build-% @# sandbox-run-go1.17 @# sandbox-run-gotip diff --git a/vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt b/vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt index 5f14d1162e..899129ecc4 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt +++ b/vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt @@ -1,3 +1,3 @@ AWS SDK for Go -Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/README.md b/vendor/github.com/aws/aws-sdk-go-v2/README.md index da74d0e333..54626706f1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/README.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/README.md @@ -1,7 +1,6 @@ # AWS SDK for Go v2 -[![Go Build status](https://github.com/aws/aws-sdk-go-v2/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/aws/aws-sdk-go-v2/actions/workflows/go.yml)[![Codegen Build status](https://github.com/aws/aws-sdk-go-v2/actions/workflows/codegen.yml/badge.svg?branch=main)](https://github.com/aws/aws-sdk-go-v2/actions/workflows/codegen.yml) [![SDK Documentation](https://img.shields.io/badge/SDK-Documentation-blue)](https://aws.github.io/aws-sdk-go-v2/docs/) [![Migration Guide](https://img.shields.io/badge/Migration-Guide-blue)](https://aws.github.io/aws-sdk-go-v2/docs/migrating/) [![API Reference](https://img.shields.io/badge/api-reference-blue.svg)](https://pkg.go.dev/mod/github.com/aws/aws-sdk-go-v2) [![Apache V2 License](https://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt) - +[![Go Build status](https://github.com/aws/aws-sdk-go-v2/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/aws/aws-sdk-go-v2/actions/workflows/go.yml)[![Codegen Build status](https://github.com/aws/aws-sdk-go-v2/actions/workflows/codegen.yml/badge.svg?branch=main)](https://github.com/aws/aws-sdk-go-v2/actions/workflows/codegen.yml) [![SDK Documentation](https://img.shields.io/badge/SDK-Documentation-blue)](https://aws.github.io/aws-sdk-go-v2/docs/) [![Migration Guide](https://img.shields.io/badge/Migration-Guide-blue)](https://aws.github.io/aws-sdk-go-v2/docs/migrating/) [![API Reference](https://img.shields.io/badge/api-reference-blue.svg)](https://pkg.go.dev/mod/github.com/aws/aws-sdk-go-v2) [![Apache V2 License](https://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go-v2/blob/main/LICENSE.txt) `aws-sdk-go-v2` is the v2 AWS SDK for the Go programming language. @@ -87,7 +86,7 @@ func main() { ###### Compile and Execute ```sh $ go run . -Table: +Tables: tableOne tableTwo ``` @@ -97,9 +96,9 @@ tableTwo Please use these community resources for getting help. We use the GitHub issues for tracking bugs and feature requests. -* Ask a question on [StackOverflow](http://stackoverflow.com/) and tag it with the [`aws-sdk-go`](http://stackoverflow.com/questions/tagged/aws-sdk-go) tag. -* Open a support ticket with [AWS Support](http://docs.aws.amazon.com/awssupport/latest/user/getting-started.html). +* Ask us a [question](https://github.com/aws/aws-sdk-go-v2/discussions/new?category=q-a) or open a [discussion](https://github.com/aws/aws-sdk-go-v2/discussions/new?category=general). * If you think you may have found a bug, please open an [issue](https://github.com/aws/aws-sdk-go-v2/issues/new/choose). +* Open a support ticket with [AWS Support](http://docs.aws.amazon.com/awssupport/latest/user/getting-started.html). This SDK implements AWS service APIs. For general issues regarding the AWS services and their limitations, you may also take a look at the [Amazon Web Services Discussion Forums](https://forums.aws.amazon.com/). @@ -118,7 +117,7 @@ Keeping the list of open issues lean will help us respond in a timely manner. ## Feedback and contributing -The v2 SDK will use GitHub [Issues] to track feature requests and issues with the SDK. In addition, we'll use GitHub [Projects] to track large tasks spanning multiple pull requests, such as refactoring the SDK's internal request lifecycle. You can provide feedback to us in several ways. +The v2 SDK will use GitHub [Issues] to track feature requests and issues with the SDK. In addition, we'll use GitHub [Projects] to track large tasks spanning multiple pull requests, such as refactoring the SDK's internal request lifecycle. You can provide feedback to us in several ways. **GitHub issues**. To provide feedback or report bugs, file GitHub [Issues] on the SDK. This is the preferred mechanism to give feedback so that other users can engage in the conversation, +1 issues, etc. Issues you open will be evaluated, and included in our roadmap for the GA launch. @@ -139,8 +138,8 @@ API operation require parameters. [Service Documentation](https://aws.amazon.com/documentation/) - Use this documentation to learn how to interface with AWS services. These guides are -great for getting started with a service, or when looking for more -information about a service. While this document is not required for coding, +great for getting started with a service, or when looking for more +information about a service. While this document is not required for coding, services may supply helpful samples to look out for. [Forum](https://forums.aws.amazon.com/forum.jspa?forumID=293) - Ask questions, get help, and give feedback @@ -151,7 +150,7 @@ services may supply helpful samples to look out for. [Dep]: https://github.com/golang/dep [Issues]: https://github.com/aws/aws-sdk-go-v2/issues [Projects]: https://github.com/aws/aws-sdk-go-v2/projects -[CHANGELOG]: https://github.com/aws/aws-sdk-go-v2/blob/master/CHANGELOG.md +[CHANGELOG]: https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md [Amazon DynamoDB]: https://aws.amazon.com/dynamodb/ -[design]: https://github.com/aws/aws-sdk-go-v2/blob/master/DESIGN.md +[design]: https://github.com/aws/aws-sdk-go-v2/blob/main/DESIGN.md [license]: http://aws.amazon.com/apache2.0/ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go index 37c643dd37..abee83b735 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go @@ -3,4 +3,4 @@ package aws // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.17.3" +const goModuleVersion = "1.18.1" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go new file mode 100644 index 0000000000..3f6aaf231e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go @@ -0,0 +1,94 @@ +package middleware + +import ( + "context" + "fmt" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" + "os" +) + +const envAwsLambdaFunctionName = "AWS_LAMBDA_FUNCTION_NAME" +const envAmznTraceID = "_X_AMZN_TRACE_ID" +const amznTraceIDHeader = "X-Amzn-Trace-Id" + +// AddRecursionDetection adds recursionDetection to the middleware stack +func AddRecursionDetection(stack *middleware.Stack) error { + return stack.Build.Add(&RecursionDetection{}, middleware.After) +} + +// RecursionDetection detects Lambda environment and sets its X-Ray trace ID to request header if absent +// to avoid recursion invocation in Lambda +type RecursionDetection struct{} + +// ID returns the middleware identifier +func (m *RecursionDetection) ID() string { + return "RecursionDetection" +} + +// HandleBuild detects Lambda environment and adds its trace ID to request header if absent +func (m *RecursionDetection) HandleBuild( + ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, +) ( + out middleware.BuildOutput, metadata middleware.Metadata, err error, +) { + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, fmt.Errorf("unknown request type %T", req) + } + + _, hasLambdaEnv := os.LookupEnv(envAwsLambdaFunctionName) + xAmznTraceID, hasTraceID := os.LookupEnv(envAmznTraceID) + value := req.Header.Get(amznTraceIDHeader) + // only set the X-Amzn-Trace-Id header when it is not set initially, the + // current environment is Lambda and the _X_AMZN_TRACE_ID env variable exists + if value != "" || !hasLambdaEnv || !hasTraceID { + return next.HandleBuild(ctx, in) + } + + req.Header.Set(amznTraceIDHeader, percentEncode(xAmznTraceID)) + return next.HandleBuild(ctx, in) +} + +func percentEncode(s string) string { + upperhex := "0123456789ABCDEF" + hexCount := 0 + for i := 0; i < len(s); i++ { + c := s[i] + if shouldEncode(c) { + hexCount++ + } + } + + if hexCount == 0 { + return s + } + + required := len(s) + 2*hexCount + t := make([]byte, required) + j := 0 + for i := 0; i < len(s); i++ { + if c := s[i]; shouldEncode(c) { + t[j] = '%' + t[j+1] = upperhex[c>>4] + t[j+2] = upperhex[c&15] + j += 3 + } else { + t[j] = c + j++ + } + } + return string(t) +} + +func shouldEncode(c byte) bool { + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + return false + } + switch c { + case '-', '=', ';', ':', '+', '&', '[', ']', '{', '}', '"', '\'', ',': + return false + default: + return true + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go index 9d7d3a0cb5..47ebc0f547 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go @@ -36,20 +36,31 @@ type Array struct { memberName string // Elements are stored in values, so we keep track of the list size here. size int32 + // Empty lists are encoded as "=", if we add a value later we will + // remove this encoding + emptyValue Value } func newArray(values url.Values, prefix string, flat bool, memberName string) *Array { + emptyValue := newValue(values, prefix, flat) + emptyValue.String("") + return &Array{ values: values, prefix: prefix, flat: flat, memberName: memberName, + emptyValue: emptyValue, } } // Value adds a new element to the Query Array. Returns a Value type used to // encode the array element. func (a *Array) Value() Value { + if a.size == 0 { + delete(a.values, a.emptyValue.key) + } + // Query lists start a 1, so adjust the size first a.size++ prefix := a.prefix diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go index c228f7d878..6975ce6524 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go @@ -21,26 +21,18 @@ func GetErrorResponseComponents(r io.Reader, noErrorWrapping bool) (ErrorCompone if err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF { return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response: %w", err) } - return ErrorComponents{ - Code: errResponse.Code, - Message: errResponse.Message, - RequestID: errResponse.RequestID, - }, nil + return ErrorComponents(errResponse), nil } var errResponse wrappedErrorResponse if err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF { return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response: %w", err) } - return ErrorComponents{ - Code: errResponse.Code, - Message: errResponse.Message, - RequestID: errResponse.RequestID, - }, nil + return ErrorComponents(errResponse), nil } // noWrappedErrorResponse represents the error response body with -// no internal ... +// wrapped within Error type wrappedErrorResponse struct { Code string `xml:"Error>Code"` Message string `xml:"Error>Message"` diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go index 12a3f0c4fb..d89090ad38 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go @@ -30,10 +30,6 @@ func NewTokenRateLimit(tokens uint) *TokenRateLimit { } } -func isTimeoutError(error) bool { - return false -} - type canceledError struct { Err error } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go index 3326289a15..822fc920a7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go @@ -11,7 +11,6 @@ import ( awsmiddle "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go/logging" - "github.com/aws/smithy-go/middleware" smithymiddle "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/transport/http" ) @@ -292,7 +291,7 @@ type retryMetadataKey struct{} // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func getRetryMetadata(ctx context.Context) (metadata retryMetadata, ok bool) { - metadata, ok = middleware.GetStackValue(ctx, retryMetadataKey{}).(retryMetadata) + metadata, ok = smithymiddle.GetStackValue(ctx, retryMetadataKey{}).(retryMetadata) return metadata, ok } @@ -301,7 +300,7 @@ func getRetryMetadata(ctx context.Context) (metadata retryMetadata, ok bool) { // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func setRetryMetadata(ctx context.Context, metadata retryMetadata) context.Context { - return middleware.WithStackValue(ctx, retryMetadataKey{}, metadata) + return smithymiddle.WithStackValue(ctx, retryMetadataKey{}, metadata) } // AddRetryMiddlewaresOptions is the set of options that can be passed to diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go index c695e6fe52..00d7d3eeea 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go @@ -95,8 +95,13 @@ func (r RetryableConnectionError) IsErrorRetryable(err error) aws.Ternary { var timeoutErr interface{ Timeout() bool } var urlErr *url.Error var netOpErr *net.OpError + var dnsError *net.DNSError switch { + case errors.As(err, &dnsError): + // NXDOMAIN errors should not be retried + retryable = !dnsError.IsNotFound && dnsError.IsTemporary + case errors.As(err, &conErr) && conErr.ConnectionError(): retryable = true diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go index 6777e21ef0..b0ba4cb2f0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go @@ -54,7 +54,7 @@ type Retryer interface { MaxAttempts() int // RetryDelay returns the delay that should be used before retrying the - // attempt. Will return error if the if the delay could not be determined. + // attempt. Will return error if the delay could not be determined. RetryDelay(attempt int, opErr error) (time.Duration, error) // GetRetryToken attempts to deduct the retry cost from the retry token pool. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go index 85a1d8f032..64c4c4845e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go @@ -7,6 +7,7 @@ var IgnoredHeaders = Rules{ "Authorization": struct{}{}, "User-Agent": struct{}{}, "X-Amzn-Trace-Id": struct{}{}, + "Expect": struct{}{}, }, }, } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md index 42d97858e2..325779c09a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md @@ -1,3 +1,75 @@ +# v1.18.27 (2023-06-15) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.26 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.25 (2023-05-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.24 (2023-05-08) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.23 (2023-05-04) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.22 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.21 (2023-04-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.20 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.19 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.18 (2023-03-16) + +* **Bug Fix**: Allow RoleARN to be set as functional option on STS WebIdentityRoleOptions. Fixes aws/aws-sdk-go-v2#2015. + +# v1.18.17 (2023-03-14) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.16 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.15 (2023-02-22) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.14 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.13 (2023-02-15) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.12 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.11 (2023-02-01) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.10 (2023-01-25) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.18.9 (2023-01-23) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go index 79256724a4..9c6d17216b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go @@ -3,4 +3,4 @@ package config // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.9" +const goModuleVersion = "1.18.27" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go b/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go index 1bb6addf3a..b21cd30804 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go @@ -384,10 +384,6 @@ func assumeWebIdentity(ctx context.Context, cfg *aws.Config, filepath string, ro return fmt.Errorf("token file path is not set") } - if len(roleARN) == 0 { - return fmt.Errorf("role ARN is not set") - } - optFns := []func(*stscreds.WebIdentityRoleOptions){ func(options *stscreds.WebIdentityRoleOptions) { options.RoleSessionName = sessionName @@ -398,11 +394,29 @@ func assumeWebIdentity(ctx context.Context, cfg *aws.Config, filepath string, ro if err != nil { return err } + if found { optFns = append(optFns, optFn) } - provider := stscreds.NewWebIdentityRoleProvider(sts.NewFromConfig(*cfg), roleARN, stscreds.IdentityTokenFile(filepath), optFns...) + opts := stscreds.WebIdentityRoleOptions{ + RoleARN: roleARN, + } + + for _, fn := range optFns { + fn(&opts) + } + + if len(opts.RoleARN) == 0 { + return fmt.Errorf("role ARN is not set") + } + + client := opts.Client + if client == nil { + client = sts.NewFromConfig(*cfg) + } + + provider := stscreds.NewWebIdentityRoleProvider(client, roleARN, stscreds.IdentityTokenFile(filepath), optFns...) cfg.Credentials = provider diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md index 2285912cc2..0b0958bdf4 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md @@ -1,3 +1,71 @@ +# v1.13.26 (2023-06-15) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.25 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.24 (2023-05-09) + +* No change notes available for this release. + +# v1.13.23 (2023-05-08) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.22 (2023-05-04) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.21 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.20 (2023-04-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.19 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.18 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.17 (2023-03-14) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.16 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.15 (2023-02-22) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.14 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.13 (2023-02-15) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.12 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.11 (2023-02-01) + +* No change notes available for this release. + +# v1.13.10 (2023-01-25) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.13.9 (2023-01-23) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go index 72214bf405..6ed71b42b2 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go @@ -11,7 +11,7 @@ // # Loading credentials with the SDK's AWS Config // // The EC2 Instance role credentials provider will automatically be the resolved -// credential provider int he credential chain if no other credential provider is +// credential provider in the credential chain if no other credential provider is // resolved first. // // To explicitly instruct the SDK's credentials resolving to use the EC2 Instance diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go index 8ac2361325..878dfaf6ef 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go @@ -3,4 +3,4 @@ package credentials // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.9" +const goModuleVersion = "1.13.26" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go index 3921da34cd..fe9345e287 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go @@ -149,12 +149,24 @@ func NewProviderCommand(builder NewCommandBuilder, options ...func(*Options)) *P return p } -type credentialProcessResponse struct { - Version int - AccessKeyID string `json:"AccessKeyId"` +// A CredentialProcessResponse is the AWS credentials format that must be +// returned when executing an external credential_process. +type CredentialProcessResponse struct { + // As of this writing, the Version key must be set to 1. This might + // increment over time as the structure evolves. + Version int + + // The access key ID that identifies the temporary security credentials. + AccessKeyID string `json:"AccessKeyId"` + + // The secret access key that can be used to sign requests. SecretAccessKey string - SessionToken string - Expiration *time.Time + + // The token that users must pass to the service API to use the temporary credentials. + SessionToken string + + // The date on which the current credentials expire. + Expiration *time.Time } // Retrieve executes the credential process command and returns the @@ -166,7 +178,7 @@ func (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) { } // Serialize and validate response - resp := &credentialProcessResponse{} + resp := &CredentialProcessResponse{} if err = json.Unmarshal(out, resp); err != nil { return aws.Credentials{Source: ProviderName}, &ProviderError{ Err: fmt.Errorf("parse failed of process output: %s, error: %w", out, err), diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go index 43e5676d34..ece1e65f73 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go @@ -11,12 +11,11 @@ // # Loading AWS SSO credentials with the AWS shared configuration file // // You can use configure AWS SSO credentials from the AWS shared configuration file by -// providing the specifying the required keys in the profile: +// specifying the required keys in the profile and referencing an sso-session: // +// sso_session // sso_account_id -// sso_region // sso_role_name -// sso_start_url // // For example, the following defines a profile "devsso" and specifies the AWS // SSO parameters that defines the target account, role, sign-on portal, and @@ -24,11 +23,15 @@ // provided, or an error will be returned. // // [profile devsso] -// sso_start_url = https://my-sso-portal.awsapps.com/start +// sso_session = dev-session // sso_role_name = SSOReadOnlyRole -// sso_region = us-east-1 // sso_account_id = 123456789012 // +// [sso-session dev-session] +// sso_start_url = https://my-sso-portal.awsapps.com/start +// sso_region = us-east-1 +// sso_registration_scopes = sso:account:access +// // Using the config module, you can load the AWS SDK shared configuration, and // specify that this profile be used to retrieve credentials. For example: // @@ -43,10 +46,17 @@ // and provide the necessary information to load and retrieve temporary // credentials using an access token from ~/.aws/sso/cache. // -// client := sso.NewFromConfig(cfg) +// ssoClient := sso.NewFromConfig(cfg) +// ssoOidcClient := ssooidc.NewFromConfig(cfg) +// tokenPath, err := ssocreds.StandardCachedTokenFilepath("dev-session") +// if err != nil { +// return err +// } // // var provider aws.CredentialsProvider -// provider = ssocreds.New(client, "123456789012", "SSOReadOnlyRole", "us-east-1", "https://my-sso-portal.awsapps.com/start") +// provider = ssocreds.New(ssoClient, "123456789012", "SSOReadOnlyRole", "https://my-sso-portal.awsapps.com/start", func(options *ssocreds.Options) { +// options.SSOTokenProvider = ssocreds.NewSSOTokenProvider(ssoOidcClient, tokenPath) +// }) // // // Wrap the provider with aws.CredentialsCache to cache the credentials until their expire time // provider = aws.NewCredentialsCache(provider) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md index 2230c41822..b4d50c4248 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md @@ -1,3 +1,35 @@ +# v1.13.4 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.3 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.2 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.1 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.0 (2023-03-14) + +* **Feature**: Add flag to disable IMDSv1 fallback + +# v1.12.24 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.23 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.22 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.12.21 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go index f97730bd93..e55edd992e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go @@ -174,6 +174,16 @@ type Options struct { // The logger writer interface to write logging messages to. Logger logging.Logger + // Configure IMDSv1 fallback behavior. By default, the client will attempt + // to fall back to IMDSv1 as needed for backwards compatibility. When set to [aws.FalseTernary] + // the client will return any errors encountered from attempting to fetch a token + // instead of silently using the insecure data flow of IMDSv1. + // + // See [configuring IMDS] for more information. + // + // [configuring IMDS]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html + EnableFallback aws.Ternary + // provides the caching of API tokens used for operation calls. If unset, // the API token will not be retrieved for the operation. tokenProvider *tokenProvider diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go index de4ef3eff7..6fab6e9178 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go @@ -3,4 +3,4 @@ package imds // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.12.21" +const goModuleVersion = "1.13.4" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go index 275fade488..5703c6e16a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go @@ -4,12 +4,14 @@ import ( "context" "errors" "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/smithy-go" + "github.com/aws/smithy-go/logging" "net/http" "sync" "sync/atomic" "time" - smithy "github.com/aws/smithy-go" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) @@ -68,7 +70,7 @@ func (t *tokenProvider) HandleFinalize( ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { - if !t.enabled() { + if t.fallbackEnabled() && !t.enabled() { // short-circuits to insecure data flow if token provider is disabled. return next.HandleFinalize(ctx, input) } @@ -115,23 +117,15 @@ func (t *tokenProvider) HandleDeserialize( } if resp.StatusCode == http.StatusUnauthorized { // unauthorized - err = &retryableError{Err: err} t.enable() + err = &retryableError{Err: err, isRetryable: true} } return out, metadata, err } -type retryableError struct { - Err error -} - -func (*retryableError) RetryableError() bool { return true } - -func (e *retryableError) Error() string { return e.Err.Error() } - func (t *tokenProvider) getToken(ctx context.Context) (tok *apiToken, err error) { - if !t.enabled() { + if t.fallbackEnabled() && !t.enabled() { return nil, &bypassTokenRetrievalError{ Err: fmt.Errorf("cannot get API token, provider disabled"), } @@ -147,7 +141,7 @@ func (t *tokenProvider) getToken(ctx context.Context) (tok *apiToken, err error) tok, err = t.updateToken(ctx) if err != nil { - return nil, fmt.Errorf("cannot get API token, %w", err) + return nil, err } return tok, nil @@ -167,17 +161,19 @@ func (t *tokenProvider) updateToken(ctx context.Context) (*apiToken, error) { TokenTTL: t.tokenTTL, }) if err != nil { - // change the disabled flag on token provider to true, when error is request timeout error. var statusErr interface{ HTTPStatusCode() int } if errors.As(err, &statusErr) { switch statusErr.HTTPStatusCode() { - - // Disable get token if failed because of 403, 404, or 405 + // Disable future get token if failed because of 403, 404, or 405 case http.StatusForbidden, http.StatusNotFound, http.StatusMethodNotAllowed: - t.disable() + if t.fallbackEnabled() { + logger := middleware.GetLogger(ctx) + logger.Logf(logging.Warn, "falling back to IMDSv1: %v", err) + t.disable() + } // 400 errors are terminal, and need to be upstreamed case http.StatusBadRequest: @@ -192,8 +188,17 @@ func (t *tokenProvider) updateToken(ctx context.Context) (*apiToken, error) { atomic.StoreUint32(&t.disabled, 1) } - // Token couldn't be retrieved, but bypass this, and allow the - // request to continue. + if !t.fallbackEnabled() { + // NOTE: getToken() is an implementation detail of some outer operation + // (e.g. GetMetadata). It has its own retries that have already been exhausted. + // Mark the underlying error as a terminal error. + err = &retryableError{Err: err, isRetryable: false} + return nil, err + } + + // Token couldn't be retrieved, fallback to IMDSv1 insecure flow for this request + // and allow the request to proceed. Future requests _may_ re-attempt fetching a + // token if not disabled. return nil, &bypassTokenRetrievalError{Err: err} } @@ -206,21 +211,21 @@ func (t *tokenProvider) updateToken(ctx context.Context) (*apiToken, error) { return tok, nil } -type bypassTokenRetrievalError struct { - Err error -} - -func (e *bypassTokenRetrievalError) Error() string { - return fmt.Sprintf("bypass token retrieval, %v", e.Err) -} - -func (e *bypassTokenRetrievalError) Unwrap() error { return e.Err } - // enabled returns if the token provider is current enabled or not. func (t *tokenProvider) enabled() bool { return atomic.LoadUint32(&t.disabled) == 0 } +// fallbackEnabled returns false if EnableFallback is [aws.FalseTernary], true otherwise +func (t *tokenProvider) fallbackEnabled() bool { + switch t.client.options.EnableFallback { + case aws.FalseTernary: + return false + default: + return true + } +} + // disable disables the token provider and it will no longer attempt to inject // the token, nor request updates. func (t *tokenProvider) disable() { @@ -235,3 +240,22 @@ func (t *tokenProvider) enable() { t.tokenMux.Unlock() atomic.StoreUint32(&t.disabled, 0) } + +type bypassTokenRetrievalError struct { + Err error +} + +func (e *bypassTokenRetrievalError) Error() string { + return fmt.Sprintf("bypass token retrieval, %v", e.Err) +} + +func (e *bypassTokenRetrievalError) Unwrap() error { return e.Err } + +type retryableError struct { + Err error + isRetryable bool +} + +func (e *retryableError) RetryableError() bool { return e.isRetryable } + +func (e *retryableError) Error() string { return e.Err.Error() } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md index cffa7288a2..297f1e42c6 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md @@ -1,3 +1,31 @@ +# v1.1.34 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.1.33 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.1.32 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.1.31 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.1.30 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.1.29 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.1.28 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.1.27 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go index b47c6baa0a..2948b31540 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go @@ -3,4 +3,4 @@ package configsources // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.1.27" +const goModuleVersion = "1.1.34" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md index fb3d33ff5e..0ffc56c398 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md @@ -1,3 +1,31 @@ +# v2.4.28 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v2.4.27 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v2.4.26 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v2.4.25 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v2.4.24 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v2.4.23 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v2.4.22 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v2.4.21 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go index e6a8286db7..0a8b6901f0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go @@ -3,4 +3,4 @@ package endpoints // goModuleVersion is the tagged release for this module -const goModuleVersion = "2.4.21" +const goModuleVersion = "2.4.28" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md index efd865d6bb..494c4dbafc 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md @@ -1,3 +1,31 @@ +# v1.3.35 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.3.34 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.3.33 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.3.32 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.3.31 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.3.30 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.3.29 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.3.28 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go index 96ac9fbecb..4793436267 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go @@ -3,4 +3,4 @@ package ini // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.3.28" +const goModuleVersion = "1.3.35" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/CHANGELOG.md index 75a63273e1..3d155118e3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/CHANGELOG.md @@ -1,3 +1,44 @@ +# v1.18.11 (2023-05-04) + +* No change notes available for this release. + +# v1.18.10 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.9 (2023-04-10) + +* No change notes available for this release. + +# v1.18.8 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.7 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.6 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.5 (2023-02-22) + +* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. + +# v1.18.4 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.3 (2023-02-15) + +* **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. +* **Bug Fix**: Correct error type parsing for restJson services. + +# v1.18.2 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.18.1 (2023-01-23) * No change notes available for this release. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_client.go index c51da78308..add37d360a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_client.go @@ -115,7 +115,7 @@ type Options struct { Retryer aws.Retryer // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set - // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig. You + // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You // should not populate this structure programmatically, or rely on the values here // within your applications. RuntimeEnvironment aws.RuntimeEnvironment diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchCheckLayerAvailability.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchCheckLayerAvailability.go index cea7521f68..13489da617 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchCheckLayerAvailability.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchCheckLayerAvailability.go @@ -57,8 +57,8 @@ type BatchCheckLayerAvailabilityOutput struct { // Any failures associated with the call. Failures []types.LayerFailure - // A list of image layer objects corresponding to the image layer references in the - // request. + // A list of image layer objects corresponding to the image layer references in + // the request. Layers []types.Layer // Metadata pertaining to the operation's result. @@ -118,6 +118,9 @@ func (c *Client) addOperationBatchCheckLayerAvailabilityMiddlewares(stack *middl if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchCheckLayerAvailability(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchDeleteImage.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchDeleteImage.go index 80c9d5b5cf..646f46a004 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchDeleteImage.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchDeleteImage.go @@ -12,7 +12,7 @@ import ( ) // Deletes a list of specified images within a repository. Images are specified -// with either an imageTag or imageDigest. You can remove a tag from an image by +// with either an imageTag or imageDigest . You can remove a tag from an image by // specifying the image's tag in your request. When you remove the last tag from an // image, the image is deleted from your repository. You can completely delete an // image (and all of its tags) by specifying the image's digest in your request. @@ -32,11 +32,11 @@ func (c *Client) BatchDeleteImage(ctx context.Context, params *BatchDeleteImageI } // Deletes specified images within a specified repository. Images are specified -// with either the imageTag or imageDigest. +// with either the imageTag or imageDigest . type BatchDeleteImageInput struct { - // A list of image ID references that correspond to images to delete. The format of - // the imageIds reference is imageTag=tag or imageDigest=digest. + // A list of image ID references that correspond to images to delete. The format + // of the imageIds reference is imageTag=tag or imageDigest=digest . // // This member is required. ImageIds []types.ImageIdentifier @@ -119,6 +119,9 @@ func (c *Client) addOperationBatchDeleteImageMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchDeleteImage(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetImage.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetImage.go index b2724f89a5..ce9b83a3c1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetImage.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetImage.go @@ -12,7 +12,7 @@ import ( ) // Gets detailed information for an image. Images are specified with either an -// imageTag or imageDigest. When an image is pulled, the BatchGetImage API is +// imageTag or imageDigest . When an image is pulled, the BatchGetImage API is // called once to retrieve the image manifest. func (c *Client) BatchGetImage(ctx context.Context, params *BatchGetImageInput, optFns ...func(*Options)) (*BatchGetImageOutput, error) { if params == nil { @@ -32,7 +32,7 @@ func (c *Client) BatchGetImage(ctx context.Context, params *BatchGetImageInput, type BatchGetImageInput struct { // A list of image ID references that correspond to images to describe. The format - // of the imageIds reference is imageTag=tag or imageDigest=digest. + // of the imageIds reference is imageTag=tag or imageDigest=digest . // // This member is required. ImageIds []types.ImageIdentifier @@ -121,6 +121,9 @@ func (c *Client) addOperationBatchGetImageMiddlewares(stack *middleware.Stack, o if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchGetImage(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetRepositoryScanningConfiguration.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetRepositoryScanningConfiguration.go index 42adcbbc46..3611dbe55e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetRepositoryScanningConfiguration.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetRepositoryScanningConfiguration.go @@ -102,6 +102,9 @@ func (c *Client) addOperationBatchGetRepositoryScanningConfigurationMiddlewares( if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchGetRepositoryScanningConfiguration(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CompleteLayerUpload.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CompleteLayerUpload.go index ac1fe8a370..de6185b950 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CompleteLayerUpload.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CompleteLayerUpload.go @@ -129,6 +129,9 @@ func (c *Client) addOperationCompleteLayerUploadMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteLayerUpload(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreatePullThroughCacheRule.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreatePullThroughCacheRule.go index 6a67466e97..75c3ee4e71 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreatePullThroughCacheRule.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreatePullThroughCacheRule.go @@ -122,6 +122,9 @@ func (c *Client) addOperationCreatePullThroughCacheRuleMiddlewares(stack *middle if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreatePullThroughCacheRule(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepository.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepository.go index 1f22e5c821..362fe54b60 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepository.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepository.go @@ -11,9 +11,8 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Creates a repository. For more information, see Amazon ECR repositories -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html) in -// the Amazon Elastic Container Registry User Guide. +// Creates a repository. For more information, see Amazon ECR repositories (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html) +// in the Amazon Elastic Container Registry User Guide. func (c *Client) CreateRepository(ctx context.Context, params *CreateRepositoryInput, optFns ...func(*Options)) (*CreateRepositoryOutput, error) { if params == nil { params = &CreateRepositoryInput{} @@ -32,8 +31,8 @@ func (c *Client) CreateRepository(ctx context.Context, params *CreateRepositoryI type CreateRepositoryInput struct { // The name to use for the repository. The repository name may be specified on its - // own (such as nginx-web-app) or it can be prepended with a namespace to group the - // repository into a category (such as project-a/nginx-web-app). + // own (such as nginx-web-app ) or it can be prepended with a namespace to group + // the repository into a category (such as project-a/nginx-web-app ). // // This member is required. RepositoryName *string @@ -47,8 +46,8 @@ type CreateRepositoryInput struct { // repository. ImageScanningConfiguration *types.ImageScanningConfiguration - // The tag mutability setting for the repository. If this parameter is omitted, the - // default setting of MUTABLE will be used which will allow image tags to be + // The tag mutability setting for the repository. If this parameter is omitted, + // the default setting of MUTABLE will be used which will allow image tags to be // overwritten. If IMMUTABLE is specified, all image tags within the repository // will be immutable which will prevent them from being overwritten. ImageTagMutability types.ImageTagMutability @@ -128,6 +127,9 @@ func (c *Client) addOperationCreateRepositoryMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepository(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteLifecyclePolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteLifecyclePolicy.go index 1f215085ff..914a512cd4 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteLifecyclePolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteLifecyclePolicy.go @@ -113,6 +113,9 @@ func (c *Client) addOperationDeleteLifecyclePolicyMiddlewares(stack *middleware. if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteLifecyclePolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeletePullThroughCacheRule.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeletePullThroughCacheRule.go index 1f4bd9701d..413c55a270 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeletePullThroughCacheRule.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeletePullThroughCacheRule.go @@ -114,6 +114,9 @@ func (c *Client) addOperationDeletePullThroughCacheRuleMiddlewares(stack *middle if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeletePullThroughCacheRule(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRegistryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRegistryPolicy.go index a9230f956e..dceab652b1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRegistryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRegistryPolicy.go @@ -92,6 +92,9 @@ func (c *Client) addOperationDeleteRegistryPolicyMiddlewares(stack *middleware.S if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRegistryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepository.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepository.go index 525834b915..0b2b866ce3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepository.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepository.go @@ -108,6 +108,9 @@ func (c *Client) addOperationDeleteRepositoryMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepository(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryPolicy.go index dd23305f84..593901b8eb 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryPolicy.go @@ -110,6 +110,9 @@ func (c *Client) addOperationDeleteRepositoryPolicyMiddlewares(stack *middleware if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageReplicationStatus.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageReplicationStatus.go index 0edd166a70..0085efcf27 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageReplicationStatus.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageReplicationStatus.go @@ -114,6 +114,9 @@ func (c *Client) addOperationDescribeImageReplicationStatusMiddlewares(stack *mi if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageReplicationStatus(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageScanFindings.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageScanFindings.go index 5908d7ed0a..f75246f03f 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageScanFindings.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageScanFindings.go @@ -45,11 +45,11 @@ type DescribeImageScanFindingsInput struct { RepositoryName *string // The maximum number of image scan results returned by DescribeImageScanFindings - // in paginated output. When this parameter is used, DescribeImageScanFindings only - // returns maxResults results in a single page along with a nextToken response - // element. The remaining results of the initial request can be seen by sending - // another DescribeImageScanFindings request with the returned nextToken value. - // This value can be between 1 and 1000. If this parameter is not used, then + // in paginated output. When this parameter is used, DescribeImageScanFindings + // only returns maxResults results in a single page along with a nextToken + // response element. The remaining results of the initial request can be seen by + // sending another DescribeImageScanFindings request with the returned nextToken + // value. This value can be between 1 and 1000. If this parameter is not used, then // DescribeImageScanFindings returns up to 100 results and a nextToken value, if // applicable. MaxResults *int32 @@ -81,7 +81,7 @@ type DescribeImageScanFindingsOutput struct { ImageScanStatus *types.ImageScanStatus // The nextToken value to include in a future DescribeImageScanFindings request. - // When the results of a DescribeImageScanFindings request exceed maxResults, this + // When the results of a DescribeImageScanFindings request exceed maxResults , this // value can be used to retrieve the next page of results. This value is null when // there are no more results to return. NextToken *string @@ -149,6 +149,9 @@ func (c *Client) addOperationDescribeImageScanFindingsMiddlewares(stack *middlew if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageScanFindings(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -173,11 +176,11 @@ var _ DescribeImageScanFindingsAPIClient = (*Client)(nil) // DescribeImageScanFindings type DescribeImageScanFindingsPaginatorOptions struct { // The maximum number of image scan results returned by DescribeImageScanFindings - // in paginated output. When this parameter is used, DescribeImageScanFindings only - // returns maxResults results in a single page along with a nextToken response - // element. The remaining results of the initial request can be seen by sending - // another DescribeImageScanFindings request with the returned nextToken value. - // This value can be between 1 and 1000. If this parameter is not used, then + // in paginated output. When this parameter is used, DescribeImageScanFindings + // only returns maxResults results in a single page along with a nextToken + // response element. The remaining results of the initial request can be seen by + // sending another DescribeImageScanFindings request with the returned nextToken + // value. This value can be between 1 and 1000. If this parameter is not used, then // DescribeImageScanFindings returns up to 100 results and a nextToken value, if // applicable. Limit int32 @@ -273,9 +276,9 @@ type ImageScanCompleteWaiterOptions struct { // MinDelay must resolve to a value lesser than or equal to the MaxDelay. MinDelay time.Duration - // MaxDelay is the maximum amount of time to delay between retries. If unset or set - // to zero, ImageScanCompleteWaiter will use default max delay of 120 seconds. Note - // that MaxDelay must resolve to value greater than or equal to the MinDelay. + // MaxDelay is the maximum amount of time to delay between retries. If unset or + // set to zero, ImageScanCompleteWaiter will use default max delay of 120 seconds. + // Note that MaxDelay must resolve to value greater than or equal to the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts @@ -323,10 +326,10 @@ func (w *ImageScanCompleteWaiter) Wait(ctx context.Context, params *DescribeImag return err } -// WaitForOutput calls the waiter function for ImageScanComplete waiter and returns -// the output of the successful operation. The maxWaitDur is the maximum wait -// duration the waiter will wait. The maxWaitDur is required and must be greater -// than zero. +// WaitForOutput calls the waiter function for ImageScanComplete waiter and +// returns the output of the successful operation. The maxWaitDur is the maximum +// wait duration the waiter will wait. The maxWaitDur is required and must be +// greater than zero. func (w *ImageScanCompleteWaiter) WaitForOutput(ctx context.Context, params *DescribeImageScanFindingsInput, maxWaitDur time.Duration, optFns ...func(*ImageScanCompleteWaiterOptions)) (*DescribeImageScanFindingsOutput, error) { if maxWaitDur <= 0 { return nil, fmt.Errorf("maximum wait time for waiter must be greater than zero") diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImages.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImages.go index f4b654290b..dd8e354bc2 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImages.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImages.go @@ -12,11 +12,11 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Returns metadata about the images in a repository. Beginning with Docker version -// 1.9, the Docker client compresses image layers before pushing them to a V2 -// Docker registry. The output of the docker images command shows the uncompressed -// image size, so it may return a larger image size than the image sizes returned -// by DescribeImages. +// Returns metadata about the images in a repository. Beginning with Docker +// version 1.9, the Docker client compresses image layers before pushing them to a +// V2 Docker registry. The output of the docker images command shows the +// uncompressed image size, so it may return a larger image size than the image +// sizes returned by DescribeImages . func (c *Client) DescribeImages(ctx context.Context, params *DescribeImagesInput, optFns ...func(*Options)) (*DescribeImagesOutput, error) { if params == nil { params = &DescribeImagesInput{} @@ -45,21 +45,21 @@ type DescribeImagesInput struct { // The list of image IDs for the requested repository. ImageIds []types.ImageIdentifier - // The maximum number of repository results returned by DescribeImages in paginated - // output. When this parameter is used, DescribeImages only returns maxResults - // results in a single page along with a nextToken response element. The remaining - // results of the initial request can be seen by sending another DescribeImages - // request with the returned nextToken value. This value can be between 1 and 1000. - // If this parameter is not used, then DescribeImages returns up to 100 results and - // a nextToken value, if applicable. This option cannot be used when you specify - // images with imageIds. + // The maximum number of repository results returned by DescribeImages in + // paginated output. When this parameter is used, DescribeImages only returns + // maxResults results in a single page along with a nextToken response element. + // The remaining results of the initial request can be seen by sending another + // DescribeImages request with the returned nextToken value. This value can be + // between 1 and 1000. If this parameter is not used, then DescribeImages returns + // up to 100 results and a nextToken value, if applicable. This option cannot be + // used when you specify images with imageIds . MaxResults *int32 // The nextToken value returned from a previous paginated DescribeImages request // where maxResults was used and the results exceeded the value of that parameter. // Pagination continues from the end of the previous results that returned the // nextToken value. This value is null when there are no more results to return. - // This option cannot be used when you specify images with imageIds. + // This option cannot be used when you specify images with imageIds . NextToken *string // The Amazon Web Services account ID associated with the registry that contains @@ -76,8 +76,8 @@ type DescribeImagesOutput struct { ImageDetails []types.ImageDetail // The nextToken value to include in a future DescribeImages request. When the - // results of a DescribeImages request exceed maxResults, this value can be used to - // retrieve the next page of results. This value is null when there are no more + // results of a DescribeImages request exceed maxResults , this value can be used + // to retrieve the next page of results. This value is null when there are no more // results to return. NextToken *string @@ -138,6 +138,9 @@ func (c *Client) addOperationDescribeImagesMiddlewares(stack *middleware.Stack, if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImages(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -160,14 +163,14 @@ var _ DescribeImagesAPIClient = (*Client)(nil) // DescribeImagesPaginatorOptions is the paginator options for DescribeImages type DescribeImagesPaginatorOptions struct { - // The maximum number of repository results returned by DescribeImages in paginated - // output. When this parameter is used, DescribeImages only returns maxResults - // results in a single page along with a nextToken response element. The remaining - // results of the initial request can be seen by sending another DescribeImages - // request with the returned nextToken value. This value can be between 1 and 1000. - // If this parameter is not used, then DescribeImages returns up to 100 results and - // a nextToken value, if applicable. This option cannot be used when you specify - // images with imageIds. + // The maximum number of repository results returned by DescribeImages in + // paginated output. When this parameter is used, DescribeImages only returns + // maxResults results in a single page along with a nextToken response element. + // The remaining results of the initial request can be seen by sending another + // DescribeImages request with the returned nextToken value. This value can be + // between 1 and 1000. If this parameter is not used, then DescribeImages returns + // up to 100 results and a nextToken value, if applicable. This option cannot be + // used when you specify images with imageIds . Limit int32 // Set to true if pagination should stop if the service returns a pagination token diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribePullThroughCacheRules.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribePullThroughCacheRules.go index 2bfefbd7a9..fc0b4f64e3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribePullThroughCacheRules.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribePullThroughCacheRules.go @@ -65,7 +65,7 @@ type DescribePullThroughCacheRulesOutput struct { // The nextToken value to include in a future DescribePullThroughCacheRulesRequest // request. When the results of a DescribePullThroughCacheRulesRequest request - // exceed maxResults, this value can be used to retrieve the next page of results. + // exceed maxResults , this value can be used to retrieve the next page of results. // This value is null when there are no more results to return. NextToken *string @@ -126,6 +126,9 @@ func (c *Client) addOperationDescribePullThroughCacheRulesMiddlewares(stack *mid if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribePullThroughCacheRules(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRegistry.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRegistry.go index 8d5f44222d..79482a793b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRegistry.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRegistry.go @@ -95,6 +95,9 @@ func (c *Client) addOperationDescribeRegistryMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRegistry(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositories.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositories.go index cef08268c3..ccf2a1b189 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositories.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositories.go @@ -31,13 +31,14 @@ func (c *Client) DescribeRepositories(ctx context.Context, params *DescribeRepos type DescribeRepositoriesInput struct { // The maximum number of repository results returned by DescribeRepositories in - // paginated output. When this parameter is used, DescribeRepositories only returns - // maxResults results in a single page along with a nextToken response element. The - // remaining results of the initial request can be seen by sending another - // DescribeRepositories request with the returned nextToken value. This value can - // be between 1 and 1000. If this parameter is not used, then DescribeRepositories - // returns up to 100 results and a nextToken value, if applicable. This option - // cannot be used when you specify repositories with repositoryNames. + // paginated output. When this parameter is used, DescribeRepositories only + // returns maxResults results in a single page along with a nextToken response + // element. The remaining results of the initial request can be seen by sending + // another DescribeRepositories request with the returned nextToken value. This + // value can be between 1 and 1000. If this parameter is not used, then + // DescribeRepositories returns up to 100 results and a nextToken value, if + // applicable. This option cannot be used when you specify repositories with + // repositoryNames . MaxResults *int32 // The nextToken value returned from a previous paginated DescribeRepositories @@ -45,7 +46,7 @@ type DescribeRepositoriesInput struct { // parameter. Pagination continues from the end of the previous results that // returned the nextToken value. This value is null when there are no more results // to return. This option cannot be used when you specify repositories with - // repositoryNames. This token should be treated as an opaque identifier that is + // repositoryNames . This token should be treated as an opaque identifier that is // only used to retrieve the next items in a list and not for other programmatic // purposes. NextToken *string @@ -65,7 +66,7 @@ type DescribeRepositoriesInput struct { type DescribeRepositoriesOutput struct { // The nextToken value to include in a future DescribeRepositories request. When - // the results of a DescribeRepositories request exceed maxResults, this value can + // the results of a DescribeRepositories request exceed maxResults , this value can // be used to retrieve the next page of results. This value is null when there are // no more results to return. NextToken *string @@ -127,6 +128,9 @@ func (c *Client) addOperationDescribeRepositoriesMiddlewares(stack *middleware.S if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositories(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -151,13 +155,14 @@ var _ DescribeRepositoriesAPIClient = (*Client)(nil) // DescribeRepositories type DescribeRepositoriesPaginatorOptions struct { // The maximum number of repository results returned by DescribeRepositories in - // paginated output. When this parameter is used, DescribeRepositories only returns - // maxResults results in a single page along with a nextToken response element. The - // remaining results of the initial request can be seen by sending another - // DescribeRepositories request with the returned nextToken value. This value can - // be between 1 and 1000. If this parameter is not used, then DescribeRepositories - // returns up to 100 results and a nextToken value, if applicable. This option - // cannot be used when you specify repositories with repositoryNames. + // paginated output. When this parameter is used, DescribeRepositories only + // returns maxResults results in a single page along with a nextToken response + // element. The remaining results of the initial request can be seen by sending + // another DescribeRepositories request with the returned nextToken value. This + // value can be between 1 and 1000. If this parameter is not used, then + // DescribeRepositories returns up to 100 results and a nextToken value, if + // applicable. This option cannot be used when you specify repositories with + // repositoryNames . Limit int32 // Set to true if pagination should stop if the service returns a pagination token diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAuthorizationToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAuthorizationToken.go index 4d6dfbbd66..da84860fb7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAuthorizationToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAuthorizationToken.go @@ -17,8 +17,7 @@ import ( // hours. The authorizationToken returned is a base64 encoded string that can be // decoded and used in a docker login command to authenticate to a registry. The // CLI offers an get-login-password command that simplifies the login process. For -// more information, see Registry authentication -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth) +// more information, see Registry authentication (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth) // in the Amazon Elastic Container Registry User Guide. func (c *Client) GetAuthorizationToken(ctx context.Context, params *GetAuthorizationTokenInput, optFns ...func(*Options)) (*GetAuthorizationTokenOutput, error) { if params == nil { @@ -110,6 +109,9 @@ func (c *Client) addOperationGetAuthorizationTokenMiddlewares(stack *middleware. if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAuthorizationToken(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetDownloadUrlForLayer.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetDownloadUrlForLayer.go index 82b584fe38..1873ca1a01 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetDownloadUrlForLayer.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetDownloadUrlForLayer.go @@ -10,11 +10,11 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Retrieves the pre-signed Amazon S3 download URL corresponding to an image layer. -// You can only get URLs for image layers that are referenced in an image. When an -// image is pulled, the GetDownloadUrlForLayer API is called once per image layer -// that is not already cached. This operation is used by the Amazon ECR proxy and -// is not generally used by customers for pulling and pushing images. In most +// Retrieves the pre-signed Amazon S3 download URL corresponding to an image +// layer. You can only get URLs for image layers that are referenced in an image. +// When an image is pulled, the GetDownloadUrlForLayer API is called once per image +// layer that is not already cached. This operation is used by the Amazon ECR proxy +// and is not generally used by customers for pulling and pushing images. In most // cases, you should use the docker CLI to pull, tag, and push images. func (c *Client) GetDownloadUrlForLayer(ctx context.Context, params *GetDownloadUrlForLayerInput, optFns ...func(*Options)) (*GetDownloadUrlForLayerOutput, error) { if params == nil { @@ -116,6 +116,9 @@ func (c *Client) addOperationGetDownloadUrlForLayerMiddlewares(stack *middleware if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetDownloadUrlForLayer(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicy.go index 76e8a061ce..43baec00a0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicy.go @@ -113,6 +113,9 @@ func (c *Client) addOperationGetLifecyclePolicyMiddlewares(stack *middleware.Sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetLifecyclePolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicyPreview.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicyPreview.go index 5114fd1b06..1b6c4c7dd6 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicyPreview.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicyPreview.go @@ -50,13 +50,13 @@ type GetLifecyclePolicyPreviewInput struct { // The maximum number of repository results returned by // GetLifecyclePolicyPreviewRequest in
 paginated output. When this parameter is // used, GetLifecyclePolicyPreviewRequest only returns
 maxResults results in a - // single page along with a nextToken
 response element. The remaining results of + // single page along with a nextToken 
 response element. The remaining results of // the initial request can be seen by sending
 another - // GetLifecyclePolicyPreviewRequest request with the returned nextToken
 value. + // GetLifecyclePolicyPreviewRequest request with the returned nextToken 
 value. // This value can be between 1 and 1000. If this
 parameter is not used, then // GetLifecyclePolicyPreviewRequest returns up to
 100 results and a nextToken // value, if
 applicable. This option cannot be used when you specify images with - // imageIds. + // imageIds . MaxResults *int32 // The nextToken value returned from a previous paginated @@ -64,7 +64,7 @@ type GetLifecyclePolicyPreviewInput struct { // results exceeded the value of that parameter. Pagination continues from the end // of the
 previous results that returned the nextToken value. This value is
 null // when there are no more results to return. This option cannot be used when you - // specify images with imageIds. + // specify images with imageIds . NextToken *string // The Amazon Web Services account ID associated with the registry that contains @@ -81,7 +81,7 @@ type GetLifecyclePolicyPreviewOutput struct { LifecyclePolicyText *string // The nextToken value to include in a future GetLifecyclePolicyPreview request. - // When the results of a GetLifecyclePolicyPreview request exceed maxResults, this + // When the results of a GetLifecyclePolicyPreview request exceed maxResults , this // value can be used to retrieve the next page of results. This value is null when // there are no more results to return. NextToken *string @@ -158,6 +158,9 @@ func (c *Client) addOperationGetLifecyclePolicyPreviewMiddlewares(stack *middlew if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetLifecyclePolicyPreview(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -184,13 +187,13 @@ type GetLifecyclePolicyPreviewPaginatorOptions struct { // The maximum number of repository results returned by // GetLifecyclePolicyPreviewRequest in
 paginated output. When this parameter is // used, GetLifecyclePolicyPreviewRequest only returns
 maxResults results in a - // single page along with a nextToken
 response element. The remaining results of + // single page along with a nextToken 
 response element. The remaining results of // the initial request can be seen by sending
 another - // GetLifecyclePolicyPreviewRequest request with the returned nextToken
 value. + // GetLifecyclePolicyPreviewRequest request with the returned nextToken 
 value. // This value can be between 1 and 1000. If this
 parameter is not used, then // GetLifecyclePolicyPreviewRequest returns up to
 100 results and a nextToken // value, if
 applicable. This option cannot be used when you specify images with - // imageIds. + // imageIds . Limit int32 // Set to true if pagination should stop if the service returns a pagination token @@ -286,10 +289,10 @@ type LifecyclePolicyPreviewCompleteWaiterOptions struct { // MaxDelay. MinDelay time.Duration - // MaxDelay is the maximum amount of time to delay between retries. If unset or set - // to zero, LifecyclePolicyPreviewCompleteWaiter will use default max delay of 120 - // seconds. Note that MaxDelay must resolve to value greater than or equal to the - // MinDelay. + // MaxDelay is the maximum amount of time to delay between retries. If unset or + // set to zero, LifecyclePolicyPreviewCompleteWaiter will use default max delay of + // 120 seconds. Note that MaxDelay must resolve to value greater than or equal to + // the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryPolicy.go index b9086f937b..995a4c6d63 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryPolicy.go @@ -92,6 +92,9 @@ func (c *Client) addOperationGetRegistryPolicyMiddlewares(stack *middleware.Stac if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryScanningConfiguration.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryScanningConfiguration.go index 07f5e4dc3a..46e3803fed 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryScanningConfiguration.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryScanningConfiguration.go @@ -93,6 +93,9 @@ func (c *Client) addOperationGetRegistryScanningConfigurationMiddlewares(stack * if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryScanningConfiguration(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRepositoryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRepositoryPolicy.go index 15a292ad6b..0e87864b6a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRepositoryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRepositoryPolicy.go @@ -109,6 +109,9 @@ func (c *Client) addOperationGetRepositoryPolicyMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_InitiateLayerUpload.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_InitiateLayerUpload.go index d700d833f1..d00c727e24 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_InitiateLayerUpload.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_InitiateLayerUpload.go @@ -113,6 +113,9 @@ func (c *Client) addOperationInitiateLayerUploadMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opInitiateLayerUpload(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListImages.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListImages.go index b3d096d5b7..f5cb17500d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListImages.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListImages.go @@ -14,7 +14,7 @@ import ( // Lists all the image IDs for the specified repository. You can filter images // based on whether or not they are tagged by using the tagStatus filter and -// specifying either TAGGED, UNTAGGED or ANY. For example, you can filter your +// specifying either TAGGED , UNTAGGED or ANY . For example, you can filter your // results to return only UNTAGGED images and then pipe that result to a // BatchDeleteImage operation to delete them. Or, you can filter your results to // return only TAGGED images to list all of the tags in your repository. @@ -74,7 +74,7 @@ type ListImagesOutput struct { ImageIds []types.ImageIdentifier // The nextToken value to include in a future ListImages request. When the results - // of a ListImages request exceed maxResults, this value can be used to retrieve + // of a ListImages request exceed maxResults , this value can be used to retrieve // the next page of results. This value is null when there are no more results to // return. NextToken *string @@ -136,6 +136,9 @@ func (c *Client) addOperationListImagesMiddlewares(stack *middleware.Stack, opti if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListImages(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListTagsForResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListTagsForResource.go index 91a372fe51..850acd2600 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListTagsForResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListTagsForResource.go @@ -100,6 +100,9 @@ func (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTagsForResource(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImage.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImage.go index 631a9b408c..00269b087c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImage.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImage.go @@ -11,12 +11,12 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Creates or updates the image manifest and tags associated with an image. When an -// image is pushed and all new image layers have been uploaded, the PutImage API is -// called once to create or update the image manifest and the tags associated with -// the image. This operation is used by the Amazon ECR proxy and is not generally -// used by customers for pulling and pushing images. In most cases, you should use -// the docker CLI to pull, tag, and push images. +// Creates or updates the image manifest and tags associated with an image. When +// an image is pushed and all new image layers have been uploaded, the PutImage API +// is called once to create or update the image manifest and the tags associated +// with the image. This operation is used by the Amazon ECR proxy and is not +// generally used by customers for pulling and pushing images. In most cases, you +// should use the docker CLI to pull, tag, and push images. func (c *Client) PutImage(ctx context.Context, params *PutImageInput, optFns ...func(*Options)) (*PutImageOutput, error) { if params == nil { params = &PutImageInput{} @@ -127,6 +127,9 @@ func (c *Client) addOperationPutImageMiddlewares(stack *middleware.Stack, option if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImage(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageScanningConfiguration.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageScanningConfiguration.go index 74d8fe4563..fbbc75cac3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageScanningConfiguration.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageScanningConfiguration.go @@ -13,7 +13,7 @@ import ( // The PutImageScanningConfiguration API is being deprecated, in favor of // specifying the image scanning configuration at the registry level. For more -// information, see PutRegistryScanningConfiguration. Updates the image scanning +// information, see PutRegistryScanningConfiguration . Updates the image scanning // configuration for the specified repository. func (c *Client) PutImageScanningConfiguration(ctx context.Context, params *PutImageScanningConfigurationInput, optFns ...func(*Options)) (*PutImageScanningConfigurationOutput, error) { if params == nil { @@ -121,6 +121,9 @@ func (c *Client) addOperationPutImageScanningConfigurationMiddlewares(stack *mid if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImageScanningConfiguration(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageTagMutability.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageTagMutability.go index 5e42488a1a..bd5a2f4f9b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageTagMutability.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageTagMutability.go @@ -11,9 +11,8 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Updates the image tag mutability settings for the specified repository. For more -// information, see Image tag mutability -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html) +// Updates the image tag mutability settings for the specified repository. For +// more information, see Image tag mutability (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html) // in the Amazon Elastic Container Registry User Guide. func (c *Client) PutImageTagMutability(ctx context.Context, params *PutImageTagMutabilityInput, optFns ...func(*Options)) (*PutImageTagMutabilityOutput, error) { if params == nil { @@ -120,6 +119,9 @@ func (c *Client) addOperationPutImageTagMutabilityMiddlewares(stack *middleware. if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImageTagMutability(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutLifecyclePolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutLifecyclePolicy.go index 782382eefe..8a46dfecf0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutLifecyclePolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutLifecyclePolicy.go @@ -11,8 +11,8 @@ import ( ) // Creates or updates the lifecycle policy for the specified repository. For more -// information, see Lifecycle policy template -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html). +// information, see Lifecycle policy template (https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html) +// . func (c *Client) PutLifecyclePolicy(ctx context.Context, params *PutLifecyclePolicyInput, optFns ...func(*Options)) (*PutLifecyclePolicyOutput, error) { if params == nil { params = &PutLifecyclePolicyInput{} @@ -116,6 +116,9 @@ func (c *Client) addOperationPutLifecyclePolicyMiddlewares(stack *middleware.Sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutLifecyclePolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryPolicy.go index b253e0e0fc..b02b9353a8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryPolicy.go @@ -13,8 +13,7 @@ import ( // Creates or updates the permissions policy for your registry. A registry policy // is used to specify permissions for another Amazon Web Services account and is // used when configuring cross-account replication. For more information, see -// Registry permissions -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html) +// Registry permissions (https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html) // in the Amazon Elastic Container Registry User Guide. func (c *Client) PutRegistryPolicy(ctx context.Context, params *PutRegistryPolicyInput, optFns ...func(*Options)) (*PutRegistryPolicyOutput, error) { if params == nil { @@ -33,9 +32,8 @@ func (c *Client) PutRegistryPolicy(ctx context.Context, params *PutRegistryPolic type PutRegistryPolicyInput struct { - // The JSON policy text to apply to your registry. The policy text follows the same - // format as IAM policy text. For more information, see Registry permissions - // (https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html) + // The JSON policy text to apply to your registry. The policy text follows the + // same format as IAM policy text. For more information, see Registry permissions (https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html) // in the Amazon Elastic Container Registry User Guide. // // This member is required. @@ -109,6 +107,9 @@ func (c *Client) addOperationPutRegistryPolicyMiddlewares(stack *middleware.Stac if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryScanningConfiguration.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryScanningConfiguration.go index fe20cf376e..4d0f207cfd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryScanningConfiguration.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryScanningConfiguration.go @@ -29,13 +29,14 @@ func (c *Client) PutRegistryScanningConfiguration(ctx context.Context, params *P type PutRegistryScanningConfigurationInput struct { - // The scanning rules to use for the registry. A scanning rule is used to determine - // which repository filters are used and at what frequency scanning will occur. + // The scanning rules to use for the registry. A scanning rule is used to + // determine which repository filters are used and at what frequency scanning will + // occur. Rules []types.RegistryScanningRule // The scanning type to set for the registry. When a registry scanning - // configuration is not defined, by default the BASIC scan type is used. When basic - // scanning is used, you may specify filters to determine which individual + // configuration is not defined, by default the BASIC scan type is used. When + // basic scanning is used, you may specify filters to determine which individual // repositories, or all repositories, are scanned when new images are pushed to // those repositories. Alternatively, you can do manual scans of images with basic // scanning. When the ENHANCED scan type is set, Amazon Inspector provides @@ -109,6 +110,9 @@ func (c *Client) addOperationPutRegistryScanningConfigurationMiddlewares(stack * if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryScanningConfiguration(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutReplicationConfiguration.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutReplicationConfiguration.go index e8e84df6eb..5f65524151 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutReplicationConfiguration.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutReplicationConfiguration.go @@ -16,12 +16,11 @@ import ( // DescribeRegistry API action. The first time the PutReplicationConfiguration API // is called, a service-linked IAM role is created in your account for the // replication process. For more information, see Using service-linked roles for -// Amazon ECR -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/using-service-linked-roles.html) +// Amazon ECR (https://docs.aws.amazon.com/AmazonECR/latest/userguide/using-service-linked-roles.html) // in the Amazon Elastic Container Registry User Guide. When configuring // cross-account replication, the destination account must grant the source account // permission to replicate. This permission is controlled using a registry -// permissions policy. For more information, see PutRegistryPolicy. +// permissions policy. For more information, see PutRegistryPolicy . func (c *Client) PutReplicationConfiguration(ctx context.Context, params *PutReplicationConfigurationInput, optFns ...func(*Options)) (*PutReplicationConfigurationOutput, error) { if params == nil { params = &PutReplicationConfigurationInput{} @@ -109,6 +108,9 @@ func (c *Client) addOperationPutReplicationConfigurationMiddlewares(stack *middl if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutReplicationConfiguration(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_SetRepositoryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_SetRepositoryPolicy.go index 1078970c70..8f0eb1b57d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_SetRepositoryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_SetRepositoryPolicy.go @@ -11,8 +11,7 @@ import ( ) // Applies a repository policy to the specified repository to control access -// permissions. For more information, see Amazon ECR Repository policies -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html) +// permissions. For more information, see Amazon ECR Repository policies (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html) // in the Amazon Elastic Container Registry User Guide. func (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryPolicyInput, optFns ...func(*Options)) (*SetRepositoryPolicyOutput, error) { if params == nil { @@ -32,8 +31,7 @@ func (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryP type SetRepositoryPolicyInput struct { // The JSON repository policy text to apply to the repository. For more - // information, see Amazon ECR repository policies - // (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) + // information, see Amazon ECR repository policies (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) // in the Amazon Elastic Container Registry User Guide. // // This member is required. @@ -44,8 +42,8 @@ type SetRepositoryPolicyInput struct { // This member is required. RepositoryName *string - // If the policy you are attempting to set on a repository policy would prevent you - // from setting another policy in the future, you must force the + // If the policy you are attempting to set on a repository policy would prevent + // you from setting another policy in the future, you must force the // SetRepositoryPolicy operation. This is intended to prevent accidental repository // lock outs. Force bool @@ -126,6 +124,9 @@ func (c *Client) addOperationSetRepositoryPolicyMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opSetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartImageScan.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartImageScan.go index 8a9785f49b..81b58403eb 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartImageScan.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartImageScan.go @@ -13,9 +13,8 @@ import ( // Starts an image vulnerability scan. An image scan can only be started once per // 24 hours on an individual image. This limit includes if an image was scanned on -// initial push. For more information, see Image scanning -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html) in -// the Amazon Elastic Container Registry User Guide. +// initial push. For more information, see Image scanning (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html) +// in the Amazon Elastic Container Registry User Guide. func (c *Client) StartImageScan(ctx context.Context, params *StartImageScanInput, optFns ...func(*Options)) (*StartImageScanOutput, error) { if params == nil { params = &StartImageScanInput{} @@ -122,6 +121,9 @@ func (c *Client) addOperationStartImageScanMiddlewares(stack *middleware.Stack, if err = stack.Initialize.Add(newServiceMetadataMiddleware_opStartImageScan(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartLifecyclePolicyPreview.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartLifecyclePolicyPreview.go index 1169ac4432..69db5c084d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartLifecyclePolicyPreview.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartLifecyclePolicyPreview.go @@ -11,8 +11,8 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Starts a preview of a lifecycle policy for the specified repository. This allows -// you to see the results before associating the lifecycle policy with the +// Starts a preview of a lifecycle policy for the specified repository. This +// allows you to see the results before associating the lifecycle policy with the // repository. func (c *Client) StartLifecyclePolicyPreview(ctx context.Context, params *StartLifecyclePolicyPreviewInput, optFns ...func(*Options)) (*StartLifecyclePolicyPreviewOutput, error) { if params == nil { @@ -119,6 +119,9 @@ func (c *Client) addOperationStartLifecyclePolicyPreviewMiddlewares(stack *middl if err = stack.Initialize.Add(newServiceMetadataMiddleware_opStartLifecyclePolicyPreview(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_TagResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_TagResource.go index d283acf670..84e860d571 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_TagResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_TagResource.go @@ -104,6 +104,9 @@ func (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, opt if err = stack.Initialize.Add(newServiceMetadataMiddleware_opTagResource(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UntagResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UntagResource.go index e42275bde1..412384aa1e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UntagResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UntagResource.go @@ -100,6 +100,9 @@ func (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, o if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUntagResource(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UploadLayerPart.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UploadLayerPart.go index 4acf7e5b0c..60abba0565 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UploadLayerPart.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UploadLayerPart.go @@ -59,9 +59,9 @@ type UploadLayerPartInput struct { // This member is required. UploadId *string - // The Amazon Web Services account ID associated with the registry to which you are - // uploading layer parts. If you do not specify a registry, the default registry is - // assumed. + // The Amazon Web Services account ID associated with the registry to which you + // are uploading layer parts. If you do not specify a registry, the default + // registry is assumed. RegistryId *string noSmithyDocumentSerde @@ -138,6 +138,9 @@ func (c *Client) addOperationUploadLayerPartMiddlewares(stack *middleware.Stack, if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadLayerPart(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/deserializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/deserializers.go index f9b5512fb8..79c79b7aba 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/deserializers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/deserializers.go @@ -87,9 +87,9 @@ func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithy errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -98,7 +98,7 @@ func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithy body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -110,8 +110,8 @@ func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithy } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -204,9 +204,9 @@ func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -215,7 +215,7 @@ func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -227,8 +227,8 @@ func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -321,9 +321,9 @@ func awsAwsjson11_deserializeOpErrorBatchGetImage(response *smithyhttp.Response, errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -332,7 +332,7 @@ func awsAwsjson11_deserializeOpErrorBatchGetImage(response *smithyhttp.Response, body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -344,8 +344,8 @@ func awsAwsjson11_deserializeOpErrorBatchGetImage(response *smithyhttp.Response, } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -438,9 +438,9 @@ func awsAwsjson11_deserializeOpErrorBatchGetRepositoryScanningConfiguration(resp errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -449,7 +449,7 @@ func awsAwsjson11_deserializeOpErrorBatchGetRepositoryScanningConfiguration(resp body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -461,8 +461,8 @@ func awsAwsjson11_deserializeOpErrorBatchGetRepositoryScanningConfiguration(resp } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -558,9 +558,9 @@ func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -569,7 +569,7 @@ func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -581,8 +581,8 @@ func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -693,9 +693,9 @@ func awsAwsjson11_deserializeOpErrorCreatePullThroughCacheRule(response *smithyh errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -704,7 +704,7 @@ func awsAwsjson11_deserializeOpErrorCreatePullThroughCacheRule(response *smithyh body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -716,8 +716,8 @@ func awsAwsjson11_deserializeOpErrorCreatePullThroughCacheRule(response *smithyh } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -819,9 +819,9 @@ func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -830,7 +830,7 @@ func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -842,8 +842,8 @@ func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -948,9 +948,9 @@ func awsAwsjson11_deserializeOpErrorDeleteLifecyclePolicy(response *smithyhttp.R errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -959,7 +959,7 @@ func awsAwsjson11_deserializeOpErrorDeleteLifecyclePolicy(response *smithyhttp.R body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -971,8 +971,8 @@ func awsAwsjson11_deserializeOpErrorDeleteLifecyclePolicy(response *smithyhttp.R } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1068,9 +1068,9 @@ func awsAwsjson11_deserializeOpErrorDeletePullThroughCacheRule(response *smithyh errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1079,7 +1079,7 @@ func awsAwsjson11_deserializeOpErrorDeletePullThroughCacheRule(response *smithyh body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1091,8 +1091,8 @@ func awsAwsjson11_deserializeOpErrorDeletePullThroughCacheRule(response *smithyh } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1188,9 +1188,9 @@ func awsAwsjson11_deserializeOpErrorDeleteRegistryPolicy(response *smithyhttp.Re errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1199,7 +1199,7 @@ func awsAwsjson11_deserializeOpErrorDeleteRegistryPolicy(response *smithyhttp.Re body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1211,8 +1211,8 @@ func awsAwsjson11_deserializeOpErrorDeleteRegistryPolicy(response *smithyhttp.Re } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1308,9 +1308,9 @@ func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1319,7 +1319,7 @@ func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1331,8 +1331,8 @@ func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1431,9 +1431,9 @@ func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp. errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1442,7 +1442,7 @@ func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp. body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1454,8 +1454,8 @@ func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp. } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1551,9 +1551,9 @@ func awsAwsjson11_deserializeOpErrorDescribeImageReplicationStatus(response *smi errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1562,7 +1562,7 @@ func awsAwsjson11_deserializeOpErrorDescribeImageReplicationStatus(response *smi body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1574,8 +1574,8 @@ func awsAwsjson11_deserializeOpErrorDescribeImageReplicationStatus(response *smi } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1674,9 +1674,9 @@ func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1685,7 +1685,7 @@ func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1697,8 +1697,8 @@ func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1794,9 +1794,9 @@ func awsAwsjson11_deserializeOpErrorDescribeImageScanFindings(response *smithyht errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1805,7 +1805,7 @@ func awsAwsjson11_deserializeOpErrorDescribeImageScanFindings(response *smithyht body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1817,8 +1817,8 @@ func awsAwsjson11_deserializeOpErrorDescribeImageScanFindings(response *smithyht } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1920,9 +1920,9 @@ func awsAwsjson11_deserializeOpErrorDescribePullThroughCacheRules(response *smit errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1931,7 +1931,7 @@ func awsAwsjson11_deserializeOpErrorDescribePullThroughCacheRules(response *smit body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1943,8 +1943,8 @@ func awsAwsjson11_deserializeOpErrorDescribePullThroughCacheRules(response *smit } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2040,9 +2040,9 @@ func awsAwsjson11_deserializeOpErrorDescribeRegistry(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2051,7 +2051,7 @@ func awsAwsjson11_deserializeOpErrorDescribeRegistry(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2063,8 +2063,8 @@ func awsAwsjson11_deserializeOpErrorDescribeRegistry(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2157,9 +2157,9 @@ func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Re errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2168,7 +2168,7 @@ func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Re body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2180,8 +2180,8 @@ func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Re } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2274,9 +2274,9 @@ func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.R errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2285,7 +2285,7 @@ func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.R body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2297,8 +2297,8 @@ func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.R } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2388,9 +2388,9 @@ func awsAwsjson11_deserializeOpErrorGetDownloadUrlForLayer(response *smithyhttp. errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2399,7 +2399,7 @@ func awsAwsjson11_deserializeOpErrorGetDownloadUrlForLayer(response *smithyhttp. body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2411,8 +2411,8 @@ func awsAwsjson11_deserializeOpErrorGetDownloadUrlForLayer(response *smithyhttp. } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2511,9 +2511,9 @@ func awsAwsjson11_deserializeOpErrorGetLifecyclePolicy(response *smithyhttp.Resp errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2522,7 +2522,7 @@ func awsAwsjson11_deserializeOpErrorGetLifecyclePolicy(response *smithyhttp.Resp body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2534,8 +2534,8 @@ func awsAwsjson11_deserializeOpErrorGetLifecyclePolicy(response *smithyhttp.Resp } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2631,9 +2631,9 @@ func awsAwsjson11_deserializeOpErrorGetLifecyclePolicyPreview(response *smithyht errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2642,7 +2642,7 @@ func awsAwsjson11_deserializeOpErrorGetLifecyclePolicyPreview(response *smithyht body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2654,8 +2654,8 @@ func awsAwsjson11_deserializeOpErrorGetLifecyclePolicyPreview(response *smithyht } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2751,9 +2751,9 @@ func awsAwsjson11_deserializeOpErrorGetRegistryPolicy(response *smithyhttp.Respo errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2762,7 +2762,7 @@ func awsAwsjson11_deserializeOpErrorGetRegistryPolicy(response *smithyhttp.Respo body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2774,8 +2774,8 @@ func awsAwsjson11_deserializeOpErrorGetRegistryPolicy(response *smithyhttp.Respo } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2871,9 +2871,9 @@ func awsAwsjson11_deserializeOpErrorGetRegistryScanningConfiguration(response *s errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2882,7 +2882,7 @@ func awsAwsjson11_deserializeOpErrorGetRegistryScanningConfiguration(response *s body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2894,8 +2894,8 @@ func awsAwsjson11_deserializeOpErrorGetRegistryScanningConfiguration(response *s } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2988,9 +2988,9 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2999,7 +2999,7 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3011,8 +3011,8 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3108,9 +3108,9 @@ func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3119,7 +3119,7 @@ func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3131,8 +3131,8 @@ func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3228,9 +3228,9 @@ func awsAwsjson11_deserializeOpErrorListImages(response *smithyhttp.Response, me errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3239,7 +3239,7 @@ func awsAwsjson11_deserializeOpErrorListImages(response *smithyhttp.Response, me body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3251,8 +3251,8 @@ func awsAwsjson11_deserializeOpErrorListImages(response *smithyhttp.Response, me } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3345,9 +3345,9 @@ func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3356,7 +3356,7 @@ func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3368,8 +3368,8 @@ func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3462,9 +3462,9 @@ func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, meta errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3473,7 +3473,7 @@ func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, meta body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3485,8 +3485,8 @@ func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, meta } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3600,9 +3600,9 @@ func awsAwsjson11_deserializeOpErrorPutImageScanningConfiguration(response *smit errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3611,7 +3611,7 @@ func awsAwsjson11_deserializeOpErrorPutImageScanningConfiguration(response *smit body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3623,8 +3623,8 @@ func awsAwsjson11_deserializeOpErrorPutImageScanningConfiguration(response *smit } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3720,9 +3720,9 @@ func awsAwsjson11_deserializeOpErrorPutImageTagMutability(response *smithyhttp.R errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3731,7 +3731,7 @@ func awsAwsjson11_deserializeOpErrorPutImageTagMutability(response *smithyhttp.R body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3743,8 +3743,8 @@ func awsAwsjson11_deserializeOpErrorPutImageTagMutability(response *smithyhttp.R } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3837,9 +3837,9 @@ func awsAwsjson11_deserializeOpErrorPutLifecyclePolicy(response *smithyhttp.Resp errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3848,7 +3848,7 @@ func awsAwsjson11_deserializeOpErrorPutLifecyclePolicy(response *smithyhttp.Resp body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3860,8 +3860,8 @@ func awsAwsjson11_deserializeOpErrorPutLifecyclePolicy(response *smithyhttp.Resp } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -3954,9 +3954,9 @@ func awsAwsjson11_deserializeOpErrorPutRegistryPolicy(response *smithyhttp.Respo errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -3965,7 +3965,7 @@ func awsAwsjson11_deserializeOpErrorPutRegistryPolicy(response *smithyhttp.Respo body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -3977,8 +3977,8 @@ func awsAwsjson11_deserializeOpErrorPutRegistryPolicy(response *smithyhttp.Respo } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4071,9 +4071,9 @@ func awsAwsjson11_deserializeOpErrorPutRegistryScanningConfiguration(response *s errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4082,7 +4082,7 @@ func awsAwsjson11_deserializeOpErrorPutRegistryScanningConfiguration(response *s body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4094,8 +4094,8 @@ func awsAwsjson11_deserializeOpErrorPutRegistryScanningConfiguration(response *s } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4188,9 +4188,9 @@ func awsAwsjson11_deserializeOpErrorPutReplicationConfiguration(response *smithy errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4199,7 +4199,7 @@ func awsAwsjson11_deserializeOpErrorPutReplicationConfiguration(response *smithy body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4211,8 +4211,8 @@ func awsAwsjson11_deserializeOpErrorPutReplicationConfiguration(response *smithy } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4305,9 +4305,9 @@ func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4316,7 +4316,7 @@ func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4328,8 +4328,8 @@ func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4422,9 +4422,9 @@ func awsAwsjson11_deserializeOpErrorStartImageScan(response *smithyhttp.Response errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4433,7 +4433,7 @@ func awsAwsjson11_deserializeOpErrorStartImageScan(response *smithyhttp.Response body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4445,8 +4445,8 @@ func awsAwsjson11_deserializeOpErrorStartImageScan(response *smithyhttp.Response } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4551,9 +4551,9 @@ func awsAwsjson11_deserializeOpErrorStartLifecyclePolicyPreview(response *smithy errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4562,7 +4562,7 @@ func awsAwsjson11_deserializeOpErrorStartLifecyclePolicyPreview(response *smithy body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4574,8 +4574,8 @@ func awsAwsjson11_deserializeOpErrorStartLifecyclePolicyPreview(response *smithy } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4674,9 +4674,9 @@ func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, m errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4685,7 +4685,7 @@ func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, m body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4697,8 +4697,8 @@ func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, m } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4797,9 +4797,9 @@ func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4808,7 +4808,7 @@ func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4820,8 +4820,8 @@ func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -4920,9 +4920,9 @@ func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Respons errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -4931,7 +4931,7 @@ func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Respons body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -4943,8 +4943,8 @@ func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Respons } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/doc.go index 602df615b1..cd150610d4 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/doc.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/doc.go @@ -3,14 +3,14 @@ // Package ecr provides the API client, operations, and parameter types for Amazon // EC2 Container Registry. // -// Amazon Elastic Container Registry Amazon Elastic Container Registry (Amazon ECR) -// is a managed container image registry service. Customers can use the familiar -// Docker CLI, or their preferred client, to push, pull, and manage images. Amazon -// ECR provides a secure, scalable, and reliable registry for your Docker or Open -// Container Initiative (OCI) images. Amazon ECR supports private repositories with -// resource-based permissions using IAM so that specific users or Amazon EC2 -// instances can access repositories and images. Amazon ECR has service endpoints -// in each supported Region. For more information, see Amazon ECR endpoints -// (https://docs.aws.amazon.com/general/latest/gr/ecr.html) in the Amazon Web -// Services General Reference. +// Amazon Elastic Container Registry Amazon Elastic Container Registry (Amazon +// ECR) is a managed container image registry service. Customers can use the +// familiar Docker CLI, or their preferred client, to push, pull, and manage +// images. Amazon ECR provides a secure, scalable, and reliable registry for your +// Docker or Open Container Initiative (OCI) images. Amazon ECR supports private +// repositories with resource-based permissions using IAM so that specific users or +// Amazon EC2 instances can access repositories and images. Amazon ECR has service +// endpoints in each supported Region. For more information, see Amazon ECR +// endpoints (https://docs.aws.amazon.com/general/latest/gr/ecr.html) in the Amazon +// Web Services General Reference. package ecr diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/go_module_metadata.go index 9825f1fe5a..0e83ac5d00 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/go_module_metadata.go @@ -3,4 +3,4 @@ package ecr // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.1" +const goModuleVersion = "1.18.11" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints/endpoints.go index 53aaf4cf23..e2a8a78064 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints/endpoints.go @@ -89,6 +89,7 @@ var partitionRegexp = struct { AwsCn *regexp.Regexp AwsIso *regexp.Regexp AwsIsoB *regexp.Regexp + AwsIsoE *regexp.Regexp AwsUsGov *regexp.Regexp }{ @@ -96,6 +97,7 @@ var partitionRegexp = struct { AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), + AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), } @@ -656,6 +658,27 @@ var defaultPartitions = endpoints.Partitions{ }, }, }, + { + ID: "aws-iso-e", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "api.ecr-fips.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "api.ecr.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoE, + IsRegionalized: true, + }, { ID: "aws-us-gov", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/enums.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/enums.go index 9356aabf1b..d782c4ec9c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/enums.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/enums.go @@ -154,9 +154,10 @@ const ( LifecyclePolicyPreviewStatusFailed LifecyclePolicyPreviewStatus = "FAILED" ) -// Values returns all known values for LifecyclePolicyPreviewStatus. Note that this -// can be expanded in the future, and so it is only as up to date as the client. -// The ordering of this slice is not guaranteed to be stable across updates. +// Values returns all known values for LifecyclePolicyPreviewStatus. Note that +// this can be expanded in the future, and so it is only as up to date as the +// client. The ordering of this slice is not guaranteed to be stable across +// updates. func (LifecyclePolicyPreviewStatus) Values() []LifecyclePolicyPreviewStatus { return []LifecyclePolicyPreviewStatus{ "IN_PROGRESS", @@ -246,9 +247,10 @@ const ( ScanningRepositoryFilterTypeWildcard ScanningRepositoryFilterType = "WILDCARD" ) -// Values returns all known values for ScanningRepositoryFilterType. Note that this -// can be expanded in the future, and so it is only as up to date as the client. -// The ordering of this slice is not guaranteed to be stable across updates. +// Values returns all known values for ScanningRepositoryFilterType. Note that +// this can be expanded in the future, and so it is only as up to date as the +// client. The ordering of this slice is not guaranteed to be stable across +// updates. func (ScanningRepositoryFilterType) Values() []ScanningRepositoryFilterType { return []ScanningRepositoryFilterType{ "WILDCARD", @@ -312,9 +314,9 @@ const ( TagStatusAny TagStatus = "ANY" ) -// Values returns all known values for TagStatus. Note that this can be expanded in -// the future, and so it is only as up to date as the client. The ordering of this -// slice is not guaranteed to be stable across updates. +// Values returns all known values for TagStatus. Note that this can be expanded +// in the future, and so it is only as up to date as the client. The ordering of +// this slice is not guaranteed to be stable across updates. func (TagStatus) Values() []TagStatus { return []TagStatus{ "TAGGED", diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/errors.go index d41db5c5be..4b4782c5a5 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/errors.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/errors.go @@ -26,7 +26,7 @@ func (e *EmptyUploadException) ErrorMessage() string { return *e.Message } func (e *EmptyUploadException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "EmptyUploadException" } return *e.ErrorCodeOverride @@ -53,7 +53,7 @@ func (e *ImageAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *ImageAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageAlreadyExistsException" } return *e.ErrorCodeOverride @@ -80,7 +80,7 @@ func (e *ImageDigestDoesNotMatchException) ErrorMessage() string { return *e.Message } func (e *ImageDigestDoesNotMatchException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageDigestDoesNotMatchException" } return *e.ErrorCodeOverride @@ -106,7 +106,7 @@ func (e *ImageNotFoundException) ErrorMessage() string { return *e.Message } func (e *ImageNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageNotFoundException" } return *e.ErrorCodeOverride @@ -133,7 +133,7 @@ func (e *ImageTagAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *ImageTagAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageTagAlreadyExistsException" } return *e.ErrorCodeOverride @@ -160,15 +160,15 @@ func (e *InvalidLayerException) ErrorMessage() string { return *e.Message } func (e *InvalidLayerException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerException" } return *e.ErrorCodeOverride } func (e *InvalidLayerException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// The layer part size is not valid, or the first byte specified is not consecutive -// to the last byte of a previous layer part upload. +// The layer part size is not valid, or the first byte specified is not +// consecutive to the last byte of a previous layer part upload. type InvalidLayerPartException struct { Message *string @@ -192,7 +192,7 @@ func (e *InvalidLayerPartException) ErrorMessage() string { return *e.Message } func (e *InvalidLayerPartException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerPartException" } return *e.ErrorCodeOverride @@ -219,7 +219,7 @@ func (e *InvalidParameterException) ErrorMessage() string { return *e.Message } func (e *InvalidParameterException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidParameterException" } return *e.ErrorCodeOverride @@ -247,7 +247,7 @@ func (e *InvalidTagParameterException) ErrorMessage() string { return *e.Message } func (e *InvalidTagParameterException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidTagParameterException" } return *e.ErrorCodeOverride @@ -275,7 +275,7 @@ func (e *KmsException) ErrorMessage() string { return *e.Message } func (e *KmsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "KmsException" } return *e.ErrorCodeOverride @@ -301,15 +301,15 @@ func (e *LayerAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *LayerAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LayerAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *LayerAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// The specified layer is not available because it is not associated with an image. -// Unassociated image layers may be cleaned up at any time. +// The specified layer is not available because it is not associated with an +// image. Unassociated image layers may be cleaned up at any time. type LayerInaccessibleException struct { Message *string @@ -328,7 +328,7 @@ func (e *LayerInaccessibleException) ErrorMessage() string { return *e.Message } func (e *LayerInaccessibleException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LayerInaccessibleException" } return *e.ErrorCodeOverride @@ -354,15 +354,15 @@ func (e *LayerPartTooSmallException) ErrorMessage() string { return *e.Message } func (e *LayerPartTooSmallException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LayerPartTooSmallException" } return *e.ErrorCodeOverride } func (e *LayerPartTooSmallException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// The specified layers could not be found, or the specified layer is not valid for -// this repository. +// The specified layers could not be found, or the specified layer is not valid +// for this repository. type LayersNotFoundException struct { Message *string @@ -381,7 +381,7 @@ func (e *LayersNotFoundException) ErrorMessage() string { return *e.Message } func (e *LayersNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LayersNotFoundException" } return *e.ErrorCodeOverride @@ -407,7 +407,7 @@ func (e *LifecyclePolicyNotFoundException) ErrorMessage() string { return *e.Message } func (e *LifecyclePolicyNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LifecyclePolicyNotFoundException" } return *e.ErrorCodeOverride @@ -434,7 +434,7 @@ func (e *LifecyclePolicyPreviewInProgressException) ErrorMessage() string { return *e.Message } func (e *LifecyclePolicyPreviewInProgressException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LifecyclePolicyPreviewInProgressException" } return *e.ErrorCodeOverride @@ -462,7 +462,7 @@ func (e *LifecyclePolicyPreviewNotFoundException) ErrorMessage() string { return *e.Message } func (e *LifecyclePolicyPreviewNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LifecyclePolicyPreviewNotFoundException" } return *e.ErrorCodeOverride @@ -471,10 +471,9 @@ func (e *LifecyclePolicyPreviewNotFoundException) ErrorFault() smithy.ErrorFault return smithy.FaultClient } -// The operation did not succeed because it would have exceeded a service limit for -// your account. For more information, see Amazon ECR service quotas -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html) in -// the Amazon Elastic Container Registry User Guide. +// The operation did not succeed because it would have exceeded a service limit +// for your account. For more information, see Amazon ECR service quotas (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html) +// in the Amazon Elastic Container Registry User Guide. type LimitExceededException struct { Message *string @@ -493,7 +492,7 @@ func (e *LimitExceededException) ErrorMessage() string { return *e.Message } func (e *LimitExceededException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LimitExceededException" } return *e.ErrorCodeOverride @@ -520,7 +519,7 @@ func (e *PullThroughCacheRuleAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *PullThroughCacheRuleAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "PullThroughCacheRuleAlreadyExistsException" } return *e.ErrorCodeOverride @@ -549,7 +548,7 @@ func (e *PullThroughCacheRuleNotFoundException) ErrorMessage() string { return *e.Message } func (e *PullThroughCacheRuleNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "PullThroughCacheRuleNotFoundException" } return *e.ErrorCodeOverride @@ -577,7 +576,7 @@ func (e *ReferencedImagesNotFoundException) ErrorMessage() string { return *e.Message } func (e *ReferencedImagesNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ReferencedImagesNotFoundException" } return *e.ErrorCodeOverride @@ -603,7 +602,7 @@ func (e *RegistryPolicyNotFoundException) ErrorMessage() string { return *e.Message } func (e *RegistryPolicyNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RegistryPolicyNotFoundException" } return *e.ErrorCodeOverride @@ -629,7 +628,7 @@ func (e *RepositoryAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *RepositoryAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryAlreadyExistsException" } return *e.ErrorCodeOverride @@ -656,16 +655,16 @@ func (e *RepositoryNotEmptyException) ErrorMessage() string { return *e.Message } func (e *RepositoryNotEmptyException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotEmptyException" } return *e.ErrorCodeOverride } func (e *RepositoryNotEmptyException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// The specified repository could not be found. Check the spelling of the specified -// repository and ensure that you are performing operations on the correct -// registry. +// The specified repository could not be found. Check the spelling of the +// specified repository and ensure that you are performing operations on the +// correct registry. type RepositoryNotFoundException struct { Message *string @@ -684,7 +683,7 @@ func (e *RepositoryNotFoundException) ErrorMessage() string { return *e.Message } func (e *RepositoryNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotFoundException" } return *e.ErrorCodeOverride @@ -711,7 +710,7 @@ func (e *RepositoryPolicyNotFoundException) ErrorMessage() string { return *e.Message } func (e *RepositoryPolicyNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryPolicyNotFoundException" } return *e.ErrorCodeOverride @@ -738,7 +737,7 @@ func (e *ScanNotFoundException) ErrorMessage() string { return *e.Message } func (e *ScanNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ScanNotFoundException" } return *e.ErrorCodeOverride @@ -764,15 +763,15 @@ func (e *ServerException) ErrorMessage() string { return *e.Message } func (e *ServerException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ServerException" } return *e.ErrorCodeOverride } func (e *ServerException) ErrorFault() smithy.ErrorFault { return smithy.FaultServer } -// The list of tags on the repository is over the limit. The maximum number of tags -// that can be applied to a repository is 50. +// The list of tags on the repository is over the limit. The maximum number of +// tags that can be applied to a repository is 50. type TooManyTagsException struct { Message *string @@ -791,7 +790,7 @@ func (e *TooManyTagsException) ErrorMessage() string { return *e.Message } func (e *TooManyTagsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "TooManyTagsException" } return *e.ErrorCodeOverride @@ -817,7 +816,7 @@ func (e *UnsupportedImageTypeException) ErrorMessage() string { return *e.Message } func (e *UnsupportedImageTypeException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UnsupportedImageTypeException" } return *e.ErrorCodeOverride @@ -843,7 +842,7 @@ func (e *UnsupportedUpstreamRegistryException) ErrorMessage() string { return *e.Message } func (e *UnsupportedUpstreamRegistryException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UnsupportedUpstreamRegistryException" } return *e.ErrorCodeOverride @@ -872,7 +871,7 @@ func (e *UploadNotFoundException) ErrorMessage() string { return *e.Message } func (e *UploadNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UploadNotFoundException" } return *e.ErrorCodeOverride @@ -898,7 +897,7 @@ func (e *ValidationException) ErrorMessage() string { return *e.Message } func (e *ValidationException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ValidationException" } return *e.ErrorCodeOverride diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/types.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/types.go index 22afaab801..4250909400 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/types.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/types.go @@ -26,7 +26,7 @@ type AuthorizationData struct { // A base64-encoded string that contains authorization data for the specified // Amazon ECR registry. When the string is decoded, it is presented in the format - // user:password for private registry authentication using docker login. + // user:password for private registry authentication using docker login . AuthorizationToken *string // The Unix time in seconds and milliseconds when the authorization token expires. @@ -35,8 +35,8 @@ type AuthorizationData struct { // The registry URL to use for this authorization token in a docker login command. // The Amazon ECR registry URL format is - // https://aws_account_id.dkr.ecr.region.amazonaws.com. For example, - // https://012345678910.dkr.ecr.us-east-1.amazonaws.com.. + // https://aws_account_id.dkr.ecr.region.amazonaws.com . For example, + // https://012345678910.dkr.ecr.us-east-1.amazonaws.com .. ProxyEndpoint *string noSmithyDocumentSerde @@ -128,7 +128,7 @@ type CvssScoreDetails struct { type DescribeImagesFilter struct { // The tag status with which to filter your DescribeImages results. You can filter - // results based on whether they are TAGGED or UNTAGGED. + // results based on whether they are TAGGED or UNTAGGED . TagStatus TagStatus noSmithyDocumentSerde @@ -142,8 +142,7 @@ type DescribeImagesFilter struct { // require any action on your part. For more control over the encryption of the // contents of your repository, you can use server-side encryption with Key // Management Service key stored in Key Management Service (KMS) to encrypt your -// images. For more information, see Amazon ECR encryption at rest -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html) +// images. For more information, see Amazon ECR encryption at rest (https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html) // in the Amazon Elastic Container Registry User Guide. type EncryptionConfiguration struct { @@ -153,14 +152,12 @@ type EncryptionConfiguration struct { // can either use the default Amazon Web Services managed KMS key for Amazon ECR, // or specify your own KMS key, which you already created. For more information, // see Protecting data using server-side encryption with an KMS key stored in Key - // Management Service (SSE-KMS) - // (https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html) in the - // Amazon Simple Storage Service Console Developer Guide. If you use the AES256 - // encryption type, Amazon ECR uses server-side encryption with Amazon S3-managed - // encryption keys which encrypts the images in the repository using an AES-256 - // encryption algorithm. For more information, see Protecting data using - // server-side encryption with Amazon S3-managed encryption keys (SSE-S3) - // (https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html) + // Management Service (SSE-KMS) (https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html) + // in the Amazon Simple Storage Service Console Developer Guide. If you use the + // AES256 encryption type, Amazon ECR uses server-side encryption with Amazon + // S3-managed encryption keys which encrypts the images in the repository using an + // AES-256 encryption algorithm. For more information, see Protecting data using + // server-side encryption with Amazon S3-managed encryption keys (SSE-S3) (https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html) // in the Amazon Simple Storage Service Console Developer Guide. // // This member is required. @@ -276,19 +273,19 @@ type ImageDetail struct { // Docker version 1.9, the Docker client compresses image layers before pushing // them to a V2 Docker registry. The output of the docker images command shows the // uncompressed image size, so it may return a larger image size than the image - // sizes returned by DescribeImages. + // sizes returned by DescribeImages . ImageSizeInBytes *int64 // The list of tags associated with this image. ImageTags []string - // The date and time, expressed in standard JavaScript date format, when Amazon ECR - // recorded the last image pull. Amazon ECR refreshes the last image pull timestamp - // at least once every 24 hours. For example, if you pull an image once a day then - // the lastRecordedPullTime timestamp will indicate the exact time that the image - // was last pulled. However, if you pull an image once an hour, because Amazon ECR - // refreshes the lastRecordedPullTime timestamp at least once every 24 hours, the - // result may not be the exact time that the image was last pulled. + // The date and time, expressed in standard JavaScript date format, when Amazon + // ECR recorded the last image pull. Amazon ECR refreshes the last image pull + // timestamp at least once every 24 hours. For example, if you pull an image once a + // day then the lastRecordedPullTime timestamp will indicate the exact time that + // the image was last pulled. However, if you pull an image once an hour, because + // Amazon ECR refreshes the lastRecordedPullTime timestamp at least once every 24 + // hours, the result may not be the exact time that the image was last pulled. LastRecordedPullTime *time.Time // The Amazon Web Services account ID associated with the registry to which this @@ -408,10 +405,9 @@ type ImageScanFindingsSummary struct { type ImageScanningConfiguration struct { // The setting that determines whether images are scanned after being pushed to a - // repository. If set to true, images will be scanned after being pushed. If this + // repository. If set to true , images will be scanned after being pushed. If this // parameter is not specified, it will default to false and images will not be - // scanned unless a scan is manually started with the API_StartImageScan - // (https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_StartImageScan.html) + // scanned unless a scan is manually started with the API_StartImageScan (https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_StartImageScan.html) // API. ScanOnPush bool @@ -444,7 +440,7 @@ type Layer struct { // The media type of the layer, such as // application/vnd.docker.image.rootfs.diff.tar.gzip or - // application/vnd.oci.image.layer.v1.tar+gzip. + // application/vnd.oci.image.layer.v1.tar+gzip . MediaType *string noSmithyDocumentSerde @@ -518,7 +514,7 @@ type LifecyclePolicyRuleAction struct { type ListImagesFilter struct { // The tag status with which to filter your ListImages results. You can filter - // results based on whether they are TAGGED or UNTAGGED. + // results based on whether they are TAGGED or UNTAGGED . TagStatus TagStatus noSmithyDocumentSerde @@ -570,8 +566,8 @@ type PullThroughCacheRule struct { // The Amazon ECR repository prefix associated with the pull through cache rule. EcrRepositoryPrefix *string - // The Amazon Web Services account ID associated with the registry the pull through - // cache rule is associated with. + // The Amazon Web Services account ID associated with the registry the pull + // through cache rule is associated with. RegistryId *string // The upstream registry URL associated with the pull through cache rule. @@ -615,7 +611,7 @@ type RegistryScanningRule struct { // The frequency that scans are performed at for a private registry. When the // ENHANCED scan type is specified, the supported scan frequencies are - // CONTINUOUS_SCAN and SCAN_ON_PUSH. When the BASIC scan type is specified, the + // CONTINUOUS_SCAN and SCAN_ON_PUSH . When the BASIC scan type is specified, the // SCAN_ON_PUSH and MANUAL scan frequencies are supported. // // This member is required. @@ -704,7 +700,7 @@ type Repository struct { // The Amazon Resource Name (ARN) that identifies the repository. The ARN contains // the arn:aws:ecr namespace, followed by the region of the repository, Amazon Web // Services account ID of the repository owner, repository namespace, and - // repository name. For example, arn:aws:ecr:region:012345678910:repository/test. + // repository name. For example, arn:aws:ecr:region:012345678910:repository/test . RepositoryArn *string // The name of the repository. @@ -730,8 +726,8 @@ type RepositoryFilter struct { // This member is required. Filter *string - // The repository filter type. The only supported value is PREFIX_MATCH, which is a - // repository name prefix specified with the filter parameter. + // The repository filter type. The only supported value is PREFIX_MATCH , which is + // a repository name prefix specified with the filter parameter. // // This member is required. FilterType RepositoryFilterType @@ -797,16 +793,15 @@ type Resource struct { // Contains details about the resource involved in the finding. type ResourceDetails struct { - // An object that contains details about the Amazon ECR container image involved in - // the finding. + // An object that contains details about the Amazon ECR container image involved + // in the finding. AwsEcrContainerImage *AwsEcrContainerImageDetails noSmithyDocumentSerde } // The details of a scanning repository filter. For more information on how to use -// filters, see Using filters -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html#image-scanning-filters) +// filters, see Using filters (https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html#image-scanning-filters) // in the Amazon Elastic Container Registry User Guide. type ScanningRepositoryFilter struct { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/CHANGELOG.md index b1a344659a..fb5b96f901 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/CHANGELOG.md @@ -1,3 +1,48 @@ +# v1.16.2 (2023-05-04) + +* No change notes available for this release. + +# v1.16.1 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.16.0 (2023-04-11) + +* **Feature**: This release will allow using registry alias as registryId in BatchDeleteImage request. + +# v1.15.8 (2023-04-10) + +* No change notes available for this release. + +# v1.15.7 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.15.6 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.15.5 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.15.4 (2023-02-22) + +* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. + +# v1.15.3 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.15.2 (2023-02-15) + +* **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. +* **Bug Fix**: Correct error type parsing for restJson services. + +# v1.15.1 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.15.0 (2023-01-09) * **Feature**: This release for Amazon ECR Public makes several change to bring the SDK into sync with the API. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_client.go index dfd012e2ff..f6d7735433 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_client.go @@ -115,7 +115,7 @@ type Options struct { Retryer aws.Retryer // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set - // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig. You + // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You // should not populate this structure programmatically, or rely on the values here // within your applications. RuntimeEnvironment aws.RuntimeEnvironment diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchCheckLayerAvailability.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchCheckLayerAvailability.go index 1fdd19c53a..0962a06e07 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchCheckLayerAvailability.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchCheckLayerAvailability.go @@ -11,12 +11,12 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Checks the availability of one or more image layers that are within a repository -// in a public registry. When an image is pushed to a repository, each image layer -// is checked to verify if it has been uploaded before. If it has been uploaded, -// then the image layer is skipped. This operation is used by the Amazon ECR proxy -// and is not generally used by customers for pulling and pushing images. In most -// cases, you should use the docker CLI to pull, tag, and push images. +// Checks the availability of one or more image layers that are within a +// repository in a public registry. When an image is pushed to a repository, each +// image layer is checked to verify if it has been uploaded before. If it has been +// uploaded, then the image layer is skipped. This operation is used by the Amazon +// ECR proxy and is not generally used by customers for pulling and pushing images. +// In most cases, you should use the docker CLI to pull, tag, and push images. func (c *Client) BatchCheckLayerAvailability(ctx context.Context, params *BatchCheckLayerAvailabilityInput, optFns ...func(*Options)) (*BatchCheckLayerAvailabilityOutput, error) { if params == nil { params = &BatchCheckLayerAvailabilityInput{} @@ -118,6 +118,9 @@ func (c *Client) addOperationBatchCheckLayerAvailabilityMiddlewares(stack *middl if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchCheckLayerAvailability(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchDeleteImage.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchDeleteImage.go index fe6bb8b834..8ea3aa3653 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchDeleteImage.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchDeleteImage.go @@ -12,7 +12,7 @@ import ( ) // Deletes a list of specified images that are within a repository in a public -// registry. Images are specified with either an imageTag or imageDigest. You can +// registry. Images are specified with either an imageTag or imageDigest . You can // remove a tag from an image by specifying the image's tag in your request. When // you remove the last tag from an image, the image is deleted from your // repository. You can completely delete an image (and all of its tags) by @@ -34,8 +34,8 @@ func (c *Client) BatchDeleteImage(ctx context.Context, params *BatchDeleteImageI type BatchDeleteImageInput struct { - // A list of image ID references that correspond to images to delete. The format of - // the imageIds reference is imageTag=tag or imageDigest=digest. + // A list of image ID references that correspond to images to delete. The format + // of the imageIds reference is imageTag=tag or imageDigest=digest . // // This member is required. ImageIds []types.ImageIdentifier @@ -45,9 +45,9 @@ type BatchDeleteImageInput struct { // This member is required. RepositoryName *string - // The Amazon Web Services account ID that's associated with the registry that - // contains the image to delete. If you do not specify a registry, the default - // public registry is assumed. + // The Amazon Web Services account ID, or registry alias, that's associated with + // the registry that contains the image to delete. If you do not specify a + // registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde @@ -118,6 +118,9 @@ func (c *Client) addOperationBatchDeleteImageMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchDeleteImage(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CompleteLayerUpload.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CompleteLayerUpload.go index 20d8e7e249..cf1bf511de 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CompleteLayerUpload.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CompleteLayerUpload.go @@ -130,6 +130,9 @@ func (c *Client) addOperationCompleteLayerUploadMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteLayerUpload(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CreateRepository.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CreateRepository.go index 09b91ba11b..9586b3e388 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CreateRepository.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CreateRepository.go @@ -12,9 +12,8 @@ import ( ) // Creates a repository in a public registry. For more information, see Amazon ECR -// repositories -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html) in -// the Amazon Elastic Container Registry User Guide. +// repositories (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html) +// in the Amazon Elastic Container Registry User Guide. func (c *Client) CreateRepository(ctx context.Context, params *CreateRepositoryInput, optFns ...func(*Options)) (*CreateRepositoryOutput, error) { if params == nil { params = &CreateRepositoryInput{} @@ -34,8 +33,8 @@ type CreateRepositoryInput struct { // The name to use for the repository. This appears publicly in the Amazon ECR // Public Gallery. The repository name can be specified on its own (for example - // nginx-web-app) or prepended with a namespace to group the repository into a - // category (for example project-a/nginx-web-app). + // nginx-web-app ) or prepended with a namespace to group the repository into a + // category (for example project-a/nginx-web-app ). // // This member is required. RepositoryName *string @@ -119,6 +118,9 @@ func (c *Client) addOperationCreateRepositoryMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepository(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepository.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepository.go index a655731b1b..7fe23d70fa 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepository.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepository.go @@ -37,8 +37,8 @@ type DeleteRepositoryInput struct { // This member is required. RepositoryName *string - // The force option can be used to delete a repository that contains images. If the - // force option is not used, the repository must be empty prior to deletion. + // The force option can be used to delete a repository that contains images. If + // the force option is not used, the repository must be empty prior to deletion. Force bool // The Amazon Web Services account ID that's associated with the public registry @@ -111,6 +111,9 @@ func (c *Client) addOperationDeleteRepositoryMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepository(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepositoryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepositoryPolicy.go index c1487ac42e..20a8b70d43 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepositoryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepositoryPolicy.go @@ -110,6 +110,9 @@ func (c *Client) addOperationDeleteRepositoryPolicyMiddlewares(stack *middleware if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImageTags.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImageTags.go index 5ebe4b2091..b13ed17b9e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImageTags.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImageTags.go @@ -35,21 +35,21 @@ type DescribeImageTagsInput struct { // This member is required. RepositoryName *string - // The maximum number of repository results that's returned by DescribeImageTags in - // paginated output. When this parameter is used, DescribeImageTags only returns - // maxResults results in a single page along with a nextToken response element. You - // can see the remaining results of the initial request by sending another - // DescribeImageTags request with the returned nextToken value. This value can be - // between 1 and 1000. If this parameter isn't used, then DescribeImageTags returns - // up to 100 results and a nextToken value, if applicable. If you specify images - // with imageIds, you can't use this option. + // The maximum number of repository results that's returned by DescribeImageTags + // in paginated output. When this parameter is used, DescribeImageTags only + // returns maxResults results in a single page along with a nextToken response + // element. You can see the remaining results of the initial request by sending + // another DescribeImageTags request with the returned nextToken value. This value + // can be between 1 and 1000. If this parameter isn't used, then DescribeImageTags + // returns up to 100 results and a nextToken value, if applicable. If you specify + // images with imageIds , you can't use this option. MaxResults *int32 // The nextToken value that's returned from a previous paginated DescribeImageTags // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that - // returned the nextToken value. If there are no more results to return, this value - // is null. If you specify images with imageIds, you can't use this option. + // returned the nextToken value. If there are no more results to return, this + // value is null . If you specify images with imageIds , you can't use this option. NextToken *string // The Amazon Web Services account ID that's associated with the public registry @@ -66,9 +66,9 @@ type DescribeImageTagsOutput struct { ImageTagDetails []types.ImageTagDetail // The nextToken value to include in a future DescribeImageTags request. When the - // results of a DescribeImageTags request exceed maxResults, you can use this value - // to retrieve the next page of results. If there are no more results to return, - // this value is null. + // results of a DescribeImageTags request exceed maxResults , you can use this + // value to retrieve the next page of results. If there are no more results to + // return, this value is null . NextToken *string // Metadata pertaining to the operation's result. @@ -128,6 +128,9 @@ func (c *Client) addOperationDescribeImageTagsMiddlewares(stack *middleware.Stac if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageTags(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -150,14 +153,14 @@ var _ DescribeImageTagsAPIClient = (*Client)(nil) // DescribeImageTagsPaginatorOptions is the paginator options for DescribeImageTags type DescribeImageTagsPaginatorOptions struct { - // The maximum number of repository results that's returned by DescribeImageTags in - // paginated output. When this parameter is used, DescribeImageTags only returns - // maxResults results in a single page along with a nextToken response element. You - // can see the remaining results of the initial request by sending another - // DescribeImageTags request with the returned nextToken value. This value can be - // between 1 and 1000. If this parameter isn't used, then DescribeImageTags returns - // up to 100 results and a nextToken value, if applicable. If you specify images - // with imageIds, you can't use this option. + // The maximum number of repository results that's returned by DescribeImageTags + // in paginated output. When this parameter is used, DescribeImageTags only + // returns maxResults results in a single page along with a nextToken response + // element. You can see the remaining results of the initial request by sending + // another DescribeImageTags request with the returned nextToken value. This value + // can be between 1 and 1000. If this parameter isn't used, then DescribeImageTags + // returns up to 100 results and a nextToken value, if applicable. If you specify + // images with imageIds , you can't use this option. Limit int32 // Set to true if pagination should stop if the service returns a pagination token diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImages.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImages.go index 947ce9c158..c070863e37 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImages.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImages.go @@ -16,7 +16,7 @@ import ( // registry. Beginning with Docker version 1.9, the Docker client compresses image // layers before pushing them to a V2 Docker registry. The output of the docker // images command shows the uncompressed image size. Therefore, it might return a -// larger image size than the image sizes that are returned by DescribeImages. +// larger image size than the image sizes that are returned by DescribeImages . func (c *Client) DescribeImages(ctx context.Context, params *DescribeImagesInput, optFns ...func(*Options)) (*DescribeImagesOutput, error) { if params == nil { params = &DescribeImagesInput{} @@ -44,19 +44,19 @@ type DescribeImagesInput struct { // The maximum number of repository results that's returned by DescribeImages in // paginated output. When this parameter is used, DescribeImages only returns - // maxResults results in a single page along with a nextToken response element. You - // can see the remaining results of the initial request by sending another + // maxResults results in a single page along with a nextToken response element. + // You can see the remaining results of the initial request by sending another // DescribeImages request with the returned nextToken value. This value can be - // between 1 and 1000. If this parameter isn't used, then DescribeImages returns up - // to 100 results and a nextToken value, if applicable. If you specify images with - // imageIds, you can't use this option. + // between 1 and 1000. If this parameter isn't used, then DescribeImages returns + // up to 100 results and a nextToken value, if applicable. If you specify images + // with imageIds , you can't use this option. MaxResults *int32 // The nextToken value that's returned from a previous paginated DescribeImages // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that - // returned the nextToken value. If there are no more results to return, this value - // is null. If you specify images with imageIds, you can't use this option. + // returned the nextToken value. If there are no more results to return, this + // value is null . If you specify images with imageIds , you can't use this option. NextToken *string // The Amazon Web Services account ID that's associated with the public registry @@ -73,9 +73,9 @@ type DescribeImagesOutput struct { ImageDetails []types.ImageDetail // The nextToken value to include in a future DescribeImages request. When the - // results of a DescribeImages request exceed maxResults, you can use this value to - // retrieve the next page of results. If there are no more results to return, this - // value is null. + // results of a DescribeImages request exceed maxResults , you can use this value + // to retrieve the next page of results. If there are no more results to return, + // this value is null . NextToken *string // Metadata pertaining to the operation's result. @@ -135,6 +135,9 @@ func (c *Client) addOperationDescribeImagesMiddlewares(stack *middleware.Stack, if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImages(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -159,12 +162,12 @@ var _ DescribeImagesAPIClient = (*Client)(nil) type DescribeImagesPaginatorOptions struct { // The maximum number of repository results that's returned by DescribeImages in // paginated output. When this parameter is used, DescribeImages only returns - // maxResults results in a single page along with a nextToken response element. You - // can see the remaining results of the initial request by sending another + // maxResults results in a single page along with a nextToken response element. + // You can see the remaining results of the initial request by sending another // DescribeImages request with the returned nextToken value. This value can be - // between 1 and 1000. If this parameter isn't used, then DescribeImages returns up - // to 100 results and a nextToken value, if applicable. If you specify images with - // imageIds, you can't use this option. + // between 1 and 1000. If this parameter isn't used, then DescribeImages returns + // up to 100 results and a nextToken value, if applicable. If you specify images + // with imageIds , you can't use this option. Limit int32 // Set to true if pagination should stop if the service returns a pagination token diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRegistries.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRegistries.go index 3915ffae7e..7c3c414416 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRegistries.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRegistries.go @@ -34,17 +34,19 @@ type DescribeRegistriesInput struct { // in paginated output. When this parameter is used, DescribeRegistries only // returns maxResults results in a single page along with a nextToken response // element. The remaining results of the initial request can be seen by sending - // another DescribeRegistries request with the returned nextToken value. This value - // can be between 1 and 1000. If this parameter isn't used, then DescribeRegistries - // returns up to 100 results and a nextToken value, if applicable. + // another DescribeRegistries request with the returned nextToken value. This + // value can be between 1 and 1000. If this parameter isn't used, then + // DescribeRegistries returns up to 100 results and a nextToken value, if + // applicable. MaxResults *int32 // The nextToken value that's returned from a previous paginated DescribeRegistries // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that - // returned the nextToken value. If there are no more results to return, this value - // is null. This token should be treated as an opaque identifier that is only used - // to retrieve the next items in a list and not for other programmatic purposes. + // returned the nextToken value. If there are no more results to return, this + // value is null . This token should be treated as an opaque identifier that is + // only used to retrieve the next items in a list and not for other programmatic + // purposes. NextToken *string noSmithyDocumentSerde @@ -58,9 +60,9 @@ type DescribeRegistriesOutput struct { Registries []types.Registry // The nextToken value to include in a future DescribeRepositories request. If the - // results of a DescribeRepositories request exceed maxResults, you can use this + // results of a DescribeRepositories request exceed maxResults , you can use this // value to retrieve the next page of results. If there are no more results, this - // value is null. + // value is null . NextToken *string // Metadata pertaining to the operation's result. @@ -117,6 +119,9 @@ func (c *Client) addOperationDescribeRegistriesMiddlewares(stack *middleware.Sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRegistries(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -144,9 +149,10 @@ type DescribeRegistriesPaginatorOptions struct { // in paginated output. When this parameter is used, DescribeRegistries only // returns maxResults results in a single page along with a nextToken response // element. The remaining results of the initial request can be seen by sending - // another DescribeRegistries request with the returned nextToken value. This value - // can be between 1 and 1000. If this parameter isn't used, then DescribeRegistries - // returns up to 100 results and a nextToken value, if applicable. + // another DescribeRegistries request with the returned nextToken value. This + // value can be between 1 and 1000. If this parameter isn't used, then + // DescribeRegistries returns up to 100 results and a nextToken value, if + // applicable. Limit int32 // Set to true if pagination should stop if the service returns a pagination token diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRepositories.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRepositories.go index a3d10f00ae..1ad26cf7d0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRepositories.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRepositories.go @@ -37,15 +37,15 @@ type DescribeRepositoriesInput struct { // another DescribeRepositories request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter isn't used, then // DescribeRepositories returns up to 100 results and a nextToken value, if - // applicable. If you specify repositories with repositoryNames, you can't use this - // option. + // applicable. If you specify repositories with repositoryNames , you can't use + // this option. MaxResults *int32 // The nextToken value that's returned from a previous paginated // DescribeRepositories request where maxResults was used and the results exceeded // the value of that parameter. Pagination continues from the end of the previous // results that returned the nextToken value. If there are no more results to - // return, this value is null. If you specify repositories with repositoryNames, + // return, this value is null . If you specify repositories with repositoryNames , // you can't use this option. This token should be treated as an opaque identifier // that is only used to retrieve the next items in a list and not for other // programmatic purposes. @@ -66,9 +66,9 @@ type DescribeRepositoriesInput struct { type DescribeRepositoriesOutput struct { // The nextToken value to include in a future DescribeRepositories request. When - // the results of a DescribeRepositories request exceed maxResults, this value can + // the results of a DescribeRepositories request exceed maxResults , this value can // be used to retrieve the next page of results. If there are no more results to - // return, this value is null. + // return, this value is null . NextToken *string // A list of repository objects corresponding to valid repositories. @@ -128,6 +128,9 @@ func (c *Client) addOperationDescribeRepositoriesMiddlewares(stack *middleware.S if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositories(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } @@ -158,8 +161,8 @@ type DescribeRepositoriesPaginatorOptions struct { // another DescribeRepositories request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter isn't used, then // DescribeRepositories returns up to 100 results and a nextToken value, if - // applicable. If you specify repositories with repositoryNames, you can't use this - // option. + // applicable. If you specify repositories with repositoryNames , you can't use + // this option. Limit int32 // Set to true if pagination should stop if the service returns a pagination token diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetAuthorizationToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetAuthorizationToken.go index ba120c928e..0b7eb72179 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetAuthorizationToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetAuthorizationToken.go @@ -94,6 +94,9 @@ func (c *Client) addOperationGetAuthorizationTokenMiddlewares(stack *middleware. if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAuthorizationToken(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRegistryCatalogData.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRegistryCatalogData.go index 88cd5b4bc9..4f1b2d42c1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRegistryCatalogData.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRegistryCatalogData.go @@ -92,6 +92,9 @@ func (c *Client) addOperationGetRegistryCatalogDataMiddlewares(stack *middleware if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryCatalogData(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryCatalogData.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryCatalogData.go index c09d7cf6c8..fd5877a415 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryCatalogData.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryCatalogData.go @@ -105,6 +105,9 @@ func (c *Client) addOperationGetRepositoryCatalogDataMiddlewares(stack *middlewa if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryCatalogData(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryPolicy.go index 246179df6f..90fc829343 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryPolicy.go @@ -110,6 +110,9 @@ func (c *Client) addOperationGetRepositoryPolicyMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_InitiateLayerUpload.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_InitiateLayerUpload.go index 0e0e56ee3c..42ca47b3d1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_InitiateLayerUpload.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_InitiateLayerUpload.go @@ -112,6 +112,9 @@ func (c *Client) addOperationInitiateLayerUploadMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opInitiateLayerUpload(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_ListTagsForResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_ListTagsForResource.go index 63c05be6c6..0ffad3cc04 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_ListTagsForResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_ListTagsForResource.go @@ -100,6 +100,9 @@ func (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTagsForResource(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutImage.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutImage.go index 9cec3eca71..91d681d544 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutImage.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutImage.go @@ -47,9 +47,9 @@ type PutImageInput struct { // The image digest of the image manifest that corresponds to the image. ImageDigest *string - // The media type of the image manifest. If you push an image manifest that doesn't - // contain the mediaType field, you must specify the imageManifestMediaType in the - // request. + // The media type of the image manifest. If you push an image manifest that + // doesn't contain the mediaType field, you must specify the imageManifestMediaType + // in the request. ImageManifestMediaType *string // The tag to associate with the image. This parameter is required for images that @@ -127,6 +127,9 @@ func (c *Client) addOperationPutImageMiddlewares(stack *middleware.Stack, option if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImage(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRegistryCatalogData.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRegistryCatalogData.go index 85663be1af..c6677f8110 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRegistryCatalogData.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRegistryCatalogData.go @@ -98,6 +98,9 @@ func (c *Client) addOperationPutRegistryCatalogDataMiddlewares(stack *middleware if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryCatalogData(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRepositoryCatalogData.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRepositoryCatalogData.go index e7c198dfeb..70e5d3c3c1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRepositoryCatalogData.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRepositoryCatalogData.go @@ -110,6 +110,9 @@ func (c *Client) addOperationPutRepositoryCatalogDataMiddlewares(stack *middlewa if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRepositoryCatalogData(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_SetRepositoryPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_SetRepositoryPolicy.go index d96f3c7ca6..ff5cbd65da 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_SetRepositoryPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_SetRepositoryPolicy.go @@ -10,9 +10,8 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Applies a repository policy to the specified public repository to control access -// permissions. For more information, see Amazon ECR Repository Policies -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html) +// Applies a repository policy to the specified public repository to control +// access permissions. For more information, see Amazon ECR Repository Policies (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html) // in the Amazon Elastic Container Registry User Guide. func (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryPolicyInput, optFns ...func(*Options)) (*SetRepositoryPolicyOutput, error) { if params == nil { @@ -32,8 +31,7 @@ func (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryP type SetRepositoryPolicyInput struct { // The JSON repository policy text to apply to the repository. For more - // information, see Amazon ECR Repository Policies - // (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) + // information, see Amazon ECR Repository Policies (https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) // in the Amazon Elastic Container Registry User Guide. // // This member is required. @@ -44,9 +42,9 @@ type SetRepositoryPolicyInput struct { // This member is required. RepositoryName *string - // If the policy that you want to set on a repository policy would prevent you from - // setting another policy in the future, you must force the SetRepositoryPolicy - // operation. This prevents accidental repository lockouts. + // If the policy that you want to set on a repository policy would prevent you + // from setting another policy in the future, you must force the + // SetRepositoryPolicy operation. This prevents accidental repository lockouts. Force bool // The Amazon Web Services account ID that's associated with the registry that @@ -125,6 +123,9 @@ func (c *Client) addOperationSetRepositoryPolicyMiddlewares(stack *middleware.St if err = stack.Initialize.Add(newServiceMetadataMiddleware_opSetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_TagResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_TagResource.go index 198ff4f5e9..b4cf870d56 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_TagResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_TagResource.go @@ -11,7 +11,7 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Associates the specified tags to a resource with the specified resourceArn. If +// Associates the specified tags to a resource with the specified resourceArn . If // existing tags on a resource aren't specified in the request parameters, they // aren't changed. When a resource is deleted, the tags associated with that // resource are also deleted. @@ -106,6 +106,9 @@ func (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, opt if err = stack.Initialize.Add(newServiceMetadataMiddleware_opTagResource(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UntagResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UntagResource.go index 246c1f6173..66502ca4ac 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UntagResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UntagResource.go @@ -100,6 +100,9 @@ func (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, o if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUntagResource(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UploadLayerPart.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UploadLayerPart.go index d7cf219b08..f194f0c1a1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UploadLayerPart.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UploadLayerPart.go @@ -138,6 +138,9 @@ func (c *Client) addOperationUploadLayerPartMiddlewares(stack *middleware.Stack, if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadLayerPart(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/deserializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/deserializers.go index bb08df52b5..0ef759a1ca 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/deserializers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/deserializers.go @@ -86,9 +86,9 @@ func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithy errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -97,7 +97,7 @@ func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithy body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -109,8 +109,8 @@ func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithy } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -209,9 +209,9 @@ func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -220,7 +220,7 @@ func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -232,8 +232,8 @@ func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -329,9 +329,9 @@ func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -340,7 +340,7 @@ func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -352,8 +352,8 @@ func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -467,9 +467,9 @@ func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -478,7 +478,7 @@ func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -490,8 +490,8 @@ func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -596,9 +596,9 @@ func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -607,7 +607,7 @@ func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -619,8 +619,8 @@ func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -719,9 +719,9 @@ func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp. errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -730,7 +730,7 @@ func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp. body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -742,8 +742,8 @@ func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp. } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -842,9 +842,9 @@ func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -853,7 +853,7 @@ func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -865,8 +865,8 @@ func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -965,9 +965,9 @@ func awsAwsjson11_deserializeOpErrorDescribeImageTags(response *smithyhttp.Respo errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -976,7 +976,7 @@ func awsAwsjson11_deserializeOpErrorDescribeImageTags(response *smithyhttp.Respo body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -988,8 +988,8 @@ func awsAwsjson11_deserializeOpErrorDescribeImageTags(response *smithyhttp.Respo } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1085,9 +1085,9 @@ func awsAwsjson11_deserializeOpErrorDescribeRegistries(response *smithyhttp.Resp errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1096,7 +1096,7 @@ func awsAwsjson11_deserializeOpErrorDescribeRegistries(response *smithyhttp.Resp body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1108,8 +1108,8 @@ func awsAwsjson11_deserializeOpErrorDescribeRegistries(response *smithyhttp.Resp } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1202,9 +1202,9 @@ func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Re errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1213,7 +1213,7 @@ func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Re body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1225,8 +1225,8 @@ func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Re } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1322,9 +1322,9 @@ func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.R errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1333,7 +1333,7 @@ func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.R body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1345,8 +1345,8 @@ func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.R } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1439,9 +1439,9 @@ func awsAwsjson11_deserializeOpErrorGetRegistryCatalogData(response *smithyhttp. errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1450,7 +1450,7 @@ func awsAwsjson11_deserializeOpErrorGetRegistryCatalogData(response *smithyhttp. body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1462,8 +1462,8 @@ func awsAwsjson11_deserializeOpErrorGetRegistryCatalogData(response *smithyhttp. } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1553,9 +1553,9 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryCatalogData(response *smithyhtt errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1564,7 +1564,7 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryCatalogData(response *smithyhtt body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1576,8 +1576,8 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryCatalogData(response *smithyhtt } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1676,9 +1676,9 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1687,7 +1687,7 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1699,8 +1699,8 @@ func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1799,9 +1799,9 @@ func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1810,7 +1810,7 @@ func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1822,8 +1822,8 @@ func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -1922,9 +1922,9 @@ func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -1933,7 +1933,7 @@ func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1945,8 +1945,8 @@ func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2042,9 +2042,9 @@ func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, meta errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2053,7 +2053,7 @@ func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, meta body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2065,8 +2065,8 @@ func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, meta } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2183,9 +2183,9 @@ func awsAwsjson11_deserializeOpErrorPutRegistryCatalogData(response *smithyhttp. errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2194,7 +2194,7 @@ func awsAwsjson11_deserializeOpErrorPutRegistryCatalogData(response *smithyhttp. body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2206,8 +2206,8 @@ func awsAwsjson11_deserializeOpErrorPutRegistryCatalogData(response *smithyhttp. } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2300,9 +2300,9 @@ func awsAwsjson11_deserializeOpErrorPutRepositoryCatalogData(response *smithyhtt errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2311,7 +2311,7 @@ func awsAwsjson11_deserializeOpErrorPutRepositoryCatalogData(response *smithyhtt body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2323,8 +2323,8 @@ func awsAwsjson11_deserializeOpErrorPutRepositoryCatalogData(response *smithyhtt } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2420,9 +2420,9 @@ func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Res errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2431,7 +2431,7 @@ func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Res body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2443,8 +2443,8 @@ func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Res } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2540,9 +2540,9 @@ func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, m errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2551,7 +2551,7 @@ func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, m body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2563,8 +2563,8 @@ func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, m } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2666,9 +2666,9 @@ func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2677,7 +2677,7 @@ func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2689,8 +2689,8 @@ func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -2792,9 +2792,9 @@ func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Respons errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -2803,7 +2803,7 @@ func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Respons body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -2815,8 +2815,8 @@ func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Respons } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/doc.go index 00b64b4939..8706038fd3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/doc.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/doc.go @@ -10,6 +10,6 @@ // images. Amazon ECR provides a secure, scalable, and reliable registry for your // Docker or Open Container Initiative (OCI) images. Amazon ECR supports public // repositories with this API. For information about the Amazon ECR API for private -// repositories, see Amazon Elastic Container Registry API Reference -// (https://docs.aws.amazon.com/AmazonECR/latest/APIReference/Welcome.html). +// repositories, see Amazon Elastic Container Registry API Reference (https://docs.aws.amazon.com/AmazonECR/latest/APIReference/Welcome.html) +// . package ecrpublic diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/go_module_metadata.go index 77d23d99b9..70b89eb763 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/go_module_metadata.go @@ -3,4 +3,4 @@ package ecrpublic // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.15.0" +const goModuleVersion = "1.16.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints/endpoints.go index fa55caf017..0f540b2c2d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints/endpoints.go @@ -89,6 +89,7 @@ var partitionRegexp = struct { AwsCn *regexp.Regexp AwsIso *regexp.Regexp AwsIsoB *regexp.Regexp + AwsIsoE *regexp.Regexp AwsUsGov *regexp.Regexp }{ @@ -96,6 +97,7 @@ var partitionRegexp = struct { AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), + AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), } @@ -230,6 +232,27 @@ var defaultPartitions = endpoints.Partitions{ RegionRegex: partitionRegexp.AwsIsoB, IsRegionalized: true, }, + { + ID: "aws-iso-e", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "api.ecr-public-fips.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "api.ecr-public.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoE, + IsRegionalized: true, + }, { ID: "aws-us-gov", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/errors.go index 66d7e625c7..24f4d43c76 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/errors.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/errors.go @@ -26,7 +26,7 @@ func (e *EmptyUploadException) ErrorMessage() string { return *e.Message } func (e *EmptyUploadException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "EmptyUploadException" } return *e.ErrorCodeOverride @@ -53,7 +53,7 @@ func (e *ImageAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *ImageAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageAlreadyExistsException" } return *e.ErrorCodeOverride @@ -80,7 +80,7 @@ func (e *ImageDigestDoesNotMatchException) ErrorMessage() string { return *e.Message } func (e *ImageDigestDoesNotMatchException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageDigestDoesNotMatchException" } return *e.ErrorCodeOverride @@ -106,7 +106,7 @@ func (e *ImageNotFoundException) ErrorMessage() string { return *e.Message } func (e *ImageNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageNotFoundException" } return *e.ErrorCodeOverride @@ -133,7 +133,7 @@ func (e *ImageTagAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *ImageTagAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ImageTagAlreadyExistsException" } return *e.ErrorCodeOverride @@ -160,7 +160,7 @@ func (e *InvalidLayerException) ErrorMessage() string { return *e.Message } func (e *InvalidLayerException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerException" } return *e.ErrorCodeOverride @@ -192,7 +192,7 @@ func (e *InvalidLayerPartException) ErrorMessage() string { return *e.Message } func (e *InvalidLayerPartException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerPartException" } return *e.ErrorCodeOverride @@ -219,7 +219,7 @@ func (e *InvalidParameterException) ErrorMessage() string { return *e.Message } func (e *InvalidParameterException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidParameterException" } return *e.ErrorCodeOverride @@ -247,7 +247,7 @@ func (e *InvalidTagParameterException) ErrorMessage() string { return *e.Message } func (e *InvalidTagParameterException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidTagParameterException" } return *e.ErrorCodeOverride @@ -273,7 +273,7 @@ func (e *LayerAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *LayerAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LayerAlreadyExistsException" } return *e.ErrorCodeOverride @@ -299,15 +299,15 @@ func (e *LayerPartTooSmallException) ErrorMessage() string { return *e.Message } func (e *LayerPartTooSmallException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LayerPartTooSmallException" } return *e.ErrorCodeOverride } func (e *LayerPartTooSmallException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// The specified layers can't be found, or the specified layer isn't valid for this -// repository. +// The specified layers can't be found, or the specified layer isn't valid for +// this repository. type LayersNotFoundException struct { Message *string @@ -326,7 +326,7 @@ func (e *LayersNotFoundException) ErrorMessage() string { return *e.Message } func (e *LayersNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LayersNotFoundException" } return *e.ErrorCodeOverride @@ -334,9 +334,8 @@ func (e *LayersNotFoundException) ErrorCode() string { func (e *LayersNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The operation didn't succeed because it would have exceeded a service limit for -// your account. For more information, see Amazon ECR Service Quotas -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html) in -// the Amazon Elastic Container Registry User Guide. +// your account. For more information, see Amazon ECR Service Quotas (https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html) +// in the Amazon Elastic Container Registry User Guide. type LimitExceededException struct { Message *string @@ -355,7 +354,7 @@ func (e *LimitExceededException) ErrorMessage() string { return *e.Message } func (e *LimitExceededException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "LimitExceededException" } return *e.ErrorCodeOverride @@ -381,7 +380,7 @@ func (e *ReferencedImagesNotFoundException) ErrorMessage() string { return *e.Message } func (e *ReferencedImagesNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ReferencedImagesNotFoundException" } return *e.ErrorCodeOverride @@ -407,7 +406,7 @@ func (e *RegistryNotFoundException) ErrorMessage() string { return *e.Message } func (e *RegistryNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RegistryNotFoundException" } return *e.ErrorCodeOverride @@ -433,7 +432,7 @@ func (e *RepositoryAlreadyExistsException) ErrorMessage() string { return *e.Message } func (e *RepositoryAlreadyExistsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryAlreadyExistsException" } return *e.ErrorCodeOverride @@ -459,7 +458,7 @@ func (e *RepositoryCatalogDataNotFoundException) ErrorMessage() string { return *e.Message } func (e *RepositoryCatalogDataNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryCatalogDataNotFoundException" } return *e.ErrorCodeOverride @@ -488,7 +487,7 @@ func (e *RepositoryNotEmptyException) ErrorMessage() string { return *e.Message } func (e *RepositoryNotEmptyException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotEmptyException" } return *e.ErrorCodeOverride @@ -515,7 +514,7 @@ func (e *RepositoryNotFoundException) ErrorMessage() string { return *e.Message } func (e *RepositoryNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotFoundException" } return *e.ErrorCodeOverride @@ -542,7 +541,7 @@ func (e *RepositoryPolicyNotFoundException) ErrorMessage() string { return *e.Message } func (e *RepositoryPolicyNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RepositoryPolicyNotFoundException" } return *e.ErrorCodeOverride @@ -568,15 +567,15 @@ func (e *ServerException) ErrorMessage() string { return *e.Message } func (e *ServerException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ServerException" } return *e.ErrorCodeOverride } func (e *ServerException) ErrorFault() smithy.ErrorFault { return smithy.FaultServer } -// The list of tags on the repository is over the limit. The maximum number of tags -// that can be applied to a repository is 50. +// The list of tags on the repository is over the limit. The maximum number of +// tags that can be applied to a repository is 50. type TooManyTagsException struct { Message *string @@ -595,7 +594,7 @@ func (e *TooManyTagsException) ErrorMessage() string { return *e.Message } func (e *TooManyTagsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "TooManyTagsException" } return *e.ErrorCodeOverride @@ -621,7 +620,7 @@ func (e *UnsupportedCommandException) ErrorMessage() string { return *e.Message } func (e *UnsupportedCommandException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UnsupportedCommandException" } return *e.ErrorCodeOverride @@ -648,7 +647,7 @@ func (e *UploadNotFoundException) ErrorMessage() string { return *e.Message } func (e *UploadNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UploadNotFoundException" } return *e.ErrorCodeOverride diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/types.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/types.go index 3c6325434d..b24a2f4e4b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/types.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/types.go @@ -10,9 +10,9 @@ import ( // An authorization token data object that corresponds to a public registry. type AuthorizationData struct { - // A base64-encoded string that contains authorization data for a public Amazon ECR - // registry. When the string is decoded, it's presented in the format user:password - // for public registry authentication using docker login. + // A base64-encoded string that contains authorization data for a public Amazon + // ECR registry. When the string is decoded, it's presented in the format + // user:password for public registry authentication using docker login . AuthorizationToken *string // The Unix time in seconds and milliseconds when the authorization token expires. @@ -65,7 +65,7 @@ type ImageDetail struct { // version 1.9, the Docker client compresses image layers before pushing them to a // V2 Docker registry. The output of the docker images command shows the // uncompressed image size, so it might return a larger image size than the image - // sizes that are returned by DescribeImages. + // sizes that are returned by DescribeImages . ImageSizeInBytes *int64 // The list of tags that's associated with this image. @@ -137,7 +137,7 @@ type Layer struct { // The media type of the layer, such as // application/vnd.docker.image.rootfs.diff.tar.gzip or - // application/vnd.oci.image.layer.v1.tar+gzip. + // application/vnd.oci.image.layer.v1.tar+gzip . MediaType *string noSmithyDocumentSerde @@ -180,7 +180,7 @@ type ReferencedImageDetail struct { // version 1.9, the Docker client compresses image layers before pushing them to a // V2 Docker registry. The output of the docker images command shows the // uncompressed image size, so it might return a larger image size than the image - // sizes that are returned by DescribeImages. + // sizes that are returned by DescribeImages . ImageSizeInBytes *int64 noSmithyDocumentSerde @@ -223,13 +223,12 @@ type Registry struct { // An object representing the aliases for a public registry. A public registry is // given an alias when it's created. However, a custom alias can be set using the -// Amazon ECR console. For more information, see Registries -// (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html) in the -// Amazon Elastic Container Registry User Guide. +// Amazon ECR console. For more information, see Registries (https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html) +// in the Amazon Elastic Container Registry User Guide. type RegistryAlias struct { - // Indicates whether the registry alias is the default alias for the registry. When - // the first public repository is created, your public registry is assigned a + // Indicates whether the registry alias is the default alias for the registry. + // When the first public repository is created, your public registry is assigned a // default registry alias. // // This member is required. @@ -281,7 +280,7 @@ type Repository struct { // The Amazon Resource Name (ARN) that identifies the repository. The ARN contains // the arn:aws:ecr namespace, followed by the region of the repository, Amazon Web // Services account ID of the repository owner, repository namespace, and - // repository name. For example, arn:aws:ecr:region:012345678910:repository/test. + // repository name. For example, arn:aws:ecr:region:012345678910:repository/test . RepositoryArn *string // The name of the repository. @@ -298,13 +297,13 @@ type Repository struct { // ECR Public Gallery. type RepositoryCatalogData struct { - // The longform description of the contents of the repository. This text appears in - // the repository details on the Amazon ECR Public Gallery. + // The longform description of the contents of the repository. This text appears + // in the repository details on the Amazon ECR Public Gallery. AboutText *string // The architecture tags that are associated with the repository. Only supported // operating system tags appear publicly in the Amazon ECR Public Gallery. For more - // information, see RepositoryCatalogDataInput. + // information, see RepositoryCatalogDataInput . Architectures []string // The short description of the repository. @@ -319,7 +318,7 @@ type RepositoryCatalogData struct { // The operating system tags that are associated with the repository. Only // supported operating system tags appear publicly in the Amazon ECR Public - // Gallery. For more information, see RepositoryCatalogDataInput. + // Gallery. For more information, see RepositoryCatalogDataInput . OperatingSystems []string // The longform usage details of the contents of the repository. The usage text @@ -329,8 +328,8 @@ type RepositoryCatalogData struct { noSmithyDocumentSerde } -// An object that contains the catalog data for a repository. This data is publicly -// visible in the Amazon ECR Public Gallery. +// An object that contains the catalog data for a repository. This data is +// publicly visible in the Amazon ECR Public Gallery. type RepositoryCatalogDataInput struct { // A detailed description of the contents of the repository. It's publicly visible @@ -343,23 +342,19 @@ type RepositoryCatalogDataInput struct { // tag is added to your repository catalog data, it's associated with the // repository and can be retrieved using the API but isn't discoverable in the // Amazon ECR Public Gallery. - // - // * ARM - // - // * ARM 64 - // - // * x86 - // - // * x86-64 + // - ARM + // - ARM 64 + // - x86 + // - x86-64 Architectures []string - // A short description of the contents of the repository. This text appears in both - // the image details and also when searching for repositories on the Amazon ECR - // Public Gallery. + // A short description of the contents of the repository. This text appears in + // both the image details and also when searching for repositories on the Amazon + // ECR Public Gallery. Description *string - // The base64-encoded repository logo payload. The repository logo is only publicly - // visible in the Amazon ECR Public Gallery for verified accounts. + // The base64-encoded repository logo payload. The repository logo is only + // publicly visible in the Amazon ECR Public Gallery for verified accounts. LogoImageBlob []byte // The operating systems that the images in the repository are compatible with. On @@ -368,10 +363,8 @@ type RepositoryCatalogDataInput struct { // tag is added to your repository catalog data, it's associated with the // repository and can be retrieved using the API but isn't discoverable in the // Amazon ECR Public Gallery. - // - // * Linux - // - // * Windows + // - Linux + // - Windows OperatingSystems []string // Detailed information about how to use the contents of the repository. It's diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md index ae9ae243fd..c60858a100 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md @@ -1,3 +1,31 @@ +# v1.9.28 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.9.27 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.9.26 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.9.25 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.9.24 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.9.23 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.9.22 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.9.21 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go index c49853b92b..ea2621e472 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go @@ -3,4 +3,4 @@ package presignedurl // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.9.21" +const goModuleVersion = "1.9.28" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md index 91054696c7..42fae8efbc 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md @@ -1,3 +1,52 @@ +# v1.12.12 (2023-06-15) + +* No change notes available for this release. + +# v1.12.11 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.10 (2023-05-04) + +* No change notes available for this release. + +# v1.12.9 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.8 (2023-04-10) + +* No change notes available for this release. + +# v1.12.7 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.6 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.5 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.4 (2023-02-22) + +* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. + +# v1.12.3 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.12.2 (2023-02-15) + +* **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. +* **Bug Fix**: Correct error type parsing for restJson services. + +# v1.12.1 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.12.0 (2023-01-05) * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go index 7bb0698444..6f30ddc994 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go @@ -114,7 +114,7 @@ type Options struct { Retryer aws.Retryer // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set - // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig. You + // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You // should not populate this structure programmatically, or rely on the values here // within your applications. RuntimeEnvironment aws.RuntimeEnvironment diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go index 1c2b7499d5..3825b9e44d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go @@ -10,8 +10,8 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Returns the STS short-term credentials for a given role name that is assigned to -// the user. +// Returns the STS short-term credentials for a given role name that is assigned +// to the user. func (c *Client) GetRoleCredentials(ctx context.Context, params *GetRoleCredentialsInput, optFns ...func(*Options)) (*GetRoleCredentialsOutput, error) { if params == nil { params = &GetRoleCredentialsInput{} @@ -30,8 +30,7 @@ func (c *Client) GetRoleCredentials(ctx context.Context, params *GetRoleCredenti type GetRoleCredentialsInput struct { // The token issued by the CreateToken API call. For more information, see - // CreateToken - // (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) + // CreateToken (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) // in the IAM Identity Center OIDC API Reference Guide. // // This member is required. @@ -106,6 +105,9 @@ func (c *Client) addOperationGetRoleCredentialsMiddlewares(stack *middleware.Sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRoleCredentials(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go index 4fffc77af5..ef3592afc3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go @@ -30,8 +30,7 @@ func (c *Client) ListAccountRoles(ctx context.Context, params *ListAccountRolesI type ListAccountRolesInput struct { // The token issued by the CreateToken API call. For more information, see - // CreateToken - // (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) + // CreateToken (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) // in the IAM Identity Center OIDC API Reference Guide. // // This member is required. @@ -112,6 +111,9 @@ func (c *Client) addOperationListAccountRolesMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListAccountRoles(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go index e717a426c5..cfa8cdc97f 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go @@ -12,8 +12,7 @@ import ( ) // Lists all AWS accounts assigned to the user. These AWS accounts are assigned by -// the administrator of the account. For more information, see Assign User Access -// (https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#assignusers) +// the administrator of the account. For more information, see Assign User Access (https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#assignusers) // in the IAM Identity Center User Guide. This operation returns a paginated // response. func (c *Client) ListAccounts(ctx context.Context, params *ListAccountsInput, optFns ...func(*Options)) (*ListAccountsOutput, error) { @@ -34,8 +33,7 @@ func (c *Client) ListAccounts(ctx context.Context, params *ListAccountsInput, op type ListAccountsInput struct { // The token issued by the CreateToken API call. For more information, see - // CreateToken - // (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) + // CreateToken (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) // in the IAM Identity Center OIDC API Reference Guide. // // This member is required. @@ -111,6 +109,9 @@ func (c *Client) addOperationListAccountsMiddlewares(stack *middleware.Stack, op if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListAccounts(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go index 8b9b44745e..c13d73f5ac 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go @@ -19,9 +19,8 @@ import ( // temporary AWS credentials are returned to the client. After user logout, any // existing IAM role sessions that were created by using IAM Identity Center // permission sets continue based on the duration configured in the permission set. -// For more information, see User authentications -// (https://docs.aws.amazon.com/singlesignon/latest/userguide/authconcept.html) in -// the IAM Identity Center User Guide. +// For more information, see User authentications (https://docs.aws.amazon.com/singlesignon/latest/userguide/authconcept.html) +// in the IAM Identity Center User Guide. func (c *Client) Logout(ctx context.Context, params *LogoutInput, optFns ...func(*Options)) (*LogoutOutput, error) { if params == nil { params = &LogoutInput{} @@ -40,8 +39,7 @@ func (c *Client) Logout(ctx context.Context, params *LogoutInput, optFns ...func type LogoutInput struct { // The token issued by the CreateToken API call. For more information, see - // CreateToken - // (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) + // CreateToken (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html) // in the IAM Identity Center OIDC API Reference Guide. // // This member is required. @@ -102,6 +100,9 @@ func (c *Client) addOperationLogoutMiddlewares(stack *middleware.Stack, options if err = stack.Initialize.Add(newServiceMetadataMiddleware_opLogout(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/deserializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/deserializers.go index 6a1851da25..8bba205f43 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/deserializers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/deserializers.go @@ -86,9 +86,9 @@ func awsRestjson1_deserializeOpErrorGetRoleCredentials(response *smithyhttp.Resp errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -97,7 +97,7 @@ func awsRestjson1_deserializeOpErrorGetRoleCredentials(response *smithyhttp.Resp body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -109,8 +109,8 @@ func awsRestjson1_deserializeOpErrorGetRoleCredentials(response *smithyhttp.Resp } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -242,9 +242,9 @@ func awsRestjson1_deserializeOpErrorListAccountRoles(response *smithyhttp.Respon errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -253,7 +253,7 @@ func awsRestjson1_deserializeOpErrorListAccountRoles(response *smithyhttp.Respon body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -265,8 +265,8 @@ func awsRestjson1_deserializeOpErrorListAccountRoles(response *smithyhttp.Respon } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -407,9 +407,9 @@ func awsRestjson1_deserializeOpErrorListAccounts(response *smithyhttp.Response, errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -418,7 +418,7 @@ func awsRestjson1_deserializeOpErrorListAccounts(response *smithyhttp.Response, body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -430,8 +430,8 @@ func awsRestjson1_deserializeOpErrorListAccounts(response *smithyhttp.Response, } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -550,9 +550,9 @@ func awsRestjson1_deserializeOpErrorLogout(response *smithyhttp.Response, metada errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -561,7 +561,7 @@ func awsRestjson1_deserializeOpErrorLogout(response *smithyhttp.Response, metada body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -573,8 +573,8 @@ func awsRestjson1_deserializeOpErrorLogout(response *smithyhttp.Response, metada } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/doc.go index f981b154fb..59456d5dc2 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/doc.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/doc.go @@ -9,14 +9,13 @@ // and roles assigned to them and get federated into the application. Although AWS // Single Sign-On was renamed, the sso and identitystore API namespaces will // continue to retain their original name for backward compatibility purposes. For -// more information, see IAM Identity Center rename -// (https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed). -// This reference guide describes the IAM Identity Center Portal operations that +// more information, see IAM Identity Center rename (https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed) +// . This reference guide describes the IAM Identity Center Portal operations that // you can call programatically and includes detailed information on data types and // errors. AWS provides SDKs that consist of libraries and sample code for various // programming languages and platforms, such as Java, Ruby, .Net, iOS, or Android. // The SDKs provide a convenient way to create programmatic access to IAM Identity // Center and other AWS services. For more information about the AWS SDKs, -// including how to download and install them, see Tools for Amazon Web Services -// (http://aws.amazon.com/tools/). +// including how to download and install them, see Tools for Amazon Web Services (http://aws.amazon.com/tools/) +// . package sso diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go index 3046500f83..b67186c867 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go @@ -3,4 +3,4 @@ package sso // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.12.0" +const goModuleVersion = "1.12.12" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go index 90e5213734..b1ce03a5d9 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go @@ -89,6 +89,8 @@ var partitionRegexp = struct { AwsCn *regexp.Regexp AwsIso *regexp.Regexp AwsIsoB *regexp.Regexp + AwsIsoE *regexp.Regexp + AwsIsoF *regexp.Regexp AwsUsGov *regexp.Regexp }{ @@ -96,6 +98,8 @@ var partitionRegexp = struct { AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), + AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), + AwsIsoF: regexp.MustCompile("^us\\-isof\\-\\w+\\-\\d+$"), AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), } @@ -390,6 +394,48 @@ var defaultPartitions = endpoints.Partitions{ RegionRegex: partitionRegexp.AwsIsoB, IsRegionalized: true, }, + { + ID: "aws-iso-e", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "portal.sso-fips.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "portal.sso.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoE, + IsRegionalized: true, + }, + { + ID: "aws-iso-f", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "portal.sso-fips.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "portal.sso.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoF, + IsRegionalized: true, + }, { ID: "aws-us-gov", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/errors.go index 8f0ac3a293..e97a126e8b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/errors.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/errors.go @@ -27,7 +27,7 @@ func (e *InvalidRequestException) ErrorMessage() string { return *e.Message } func (e *InvalidRequestException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidRequestException" } return *e.ErrorCodeOverride @@ -53,7 +53,7 @@ func (e *ResourceNotFoundException) ErrorMessage() string { return *e.Message } func (e *ResourceNotFoundException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ResourceNotFoundException" } return *e.ErrorCodeOverride @@ -80,7 +80,7 @@ func (e *TooManyRequestsException) ErrorMessage() string { return *e.Message } func (e *TooManyRequestsException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "TooManyRequestsException" } return *e.ErrorCodeOverride @@ -107,7 +107,7 @@ func (e *UnauthorizedException) ErrorMessage() string { return *e.Message } func (e *UnauthorizedException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UnauthorizedException" } return *e.ErrorCodeOverride diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/types.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/types.go index 051056b759..8dc02296b1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/types.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/types.go @@ -26,8 +26,7 @@ type RoleCredentials struct { // The identifier used for the temporary security credentials. For more // information, see Using Temporary Security Credentials to Request Access to AWS - // Resources - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) + // Resources (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) // in the AWS IAM User Guide. AccessKeyId *string @@ -35,14 +34,12 @@ type RoleCredentials struct { Expiration int64 // The key that is used to sign the request. For more information, see Using - // Temporary Security Credentials to Request Access to AWS Resources - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) + // Temporary Security Credentials to Request Access to AWS Resources (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) // in the AWS IAM User Guide. SecretAccessKey *string // The token used for temporary credentials. For more information, see Using - // Temporary Security Credentials to Request Access to AWS Resources - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) + // Temporary Security Credentials to Request Access to AWS Resources (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html) // in the AWS IAM User Guide. SessionToken *string diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md index 5d6cc1575c..c6c01750bb 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md @@ -1,3 +1,52 @@ +# v1.14.12 (2023-06-15) + +* No change notes available for this release. + +# v1.14.11 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.14.10 (2023-05-04) + +* No change notes available for this release. + +# v1.14.9 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.14.8 (2023-04-10) + +* No change notes available for this release. + +# v1.14.7 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.14.6 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.14.5 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.14.4 (2023-02-22) + +* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. + +# v1.14.3 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.14.2 (2023-02-15) + +* **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. +* **Bug Fix**: Correct error type parsing for restJson services. + +# v1.14.1 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.14.0 (2023-01-05) * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go index 5e0a85a2c1..111f66d3b9 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go @@ -114,7 +114,7 @@ type Options struct { Retryer aws.Retryer // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set - // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig. You + // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You // should not populate this structure programmatically, or rely on the values here // within your applications. RuntimeEnvironment aws.RuntimeEnvironment diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go index cde97b4f3a..5d7bd3c1fe 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go @@ -43,7 +43,7 @@ type CreateTokenInput struct { // Supports grant types for the authorization code, refresh token, and device code // request. For device code requests, specify the following value: - // urn:ietf:params:oauth:grant-type:device_code For information about how to + // urn:ietf:params:oauth:grant-type:device_code For information about how to // obtain the device code, see the StartDeviceAuthorization topic. // // This member is required. @@ -65,9 +65,8 @@ type CreateTokenInput struct { // Currently, refreshToken is not yet implemented and is not supported. For more // information about the features and limitations of the current IAM Identity // Center OIDC implementation, see Considerations for Using this Guide in the IAM - // Identity Center OIDC API Reference - // (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html). - // The token used to obtain an access token in the event that the access token is + // Identity Center OIDC API Reference (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html) + // . The token used to obtain an access token in the event that the access token is // invalid or expired. RefreshToken *string @@ -89,22 +88,20 @@ type CreateTokenOutput struct { // Currently, idToken is not yet implemented and is not supported. For more // information about the features and limitations of the current IAM Identity // Center OIDC implementation, see Considerations for Using this Guide in the IAM - // Identity Center OIDC API Reference - // (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html). - // The identifier of the user that associated with the access token, if present. + // Identity Center OIDC API Reference (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html) + // . The identifier of the user that associated with the access token, if present. IdToken *string // Currently, refreshToken is not yet implemented and is not supported. For more // information about the features and limitations of the current IAM Identity // Center OIDC implementation, see Considerations for Using this Guide in the IAM - // Identity Center OIDC API Reference - // (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html). - // A token that, if present, can be used to refresh a previously issued access + // Identity Center OIDC API Reference (https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html) + // . A token that, if present, can be used to refresh a previously issued access // token that might have expired. RefreshToken *string // Used to notify the client that the returned token is an access token. The - // supported type is BearerToken. + // supported type is BearerToken . TokenType *string // Metadata pertaining to the operation's result. @@ -158,6 +155,9 @@ func (c *Client) addOperationCreateTokenMiddlewares(stack *middleware.Stack, opt if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateToken(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go index 3ed8cc35f7..1d83b226d3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go @@ -40,8 +40,8 @@ type RegisterClientInput struct { // This member is required. ClientType *string - // The list of scopes that are defined by the client. Upon authorization, this list - // is used to restrict permissions when granting an access token. + // The list of scopes that are defined by the client. Upon authorization, this + // list is used to restrict permissions when granting an access token. Scopes []string noSmithyDocumentSerde @@ -59,8 +59,8 @@ type RegisterClientOutput struct { // Indicates the time at which the clientId and clientSecret were issued. ClientIdIssuedAt int64 - // A secret string generated for the client. The client will use this string to get - // authenticated by the service in subsequent calls. + // A secret string generated for the client. The client will use this string to + // get authenticated by the service in subsequent calls. ClientSecret *string // Indicates the time at which the clientId and clientSecret will become invalid. @@ -120,6 +120,9 @@ func (c *Client) addOperationRegisterClientMiddlewares(stack *middleware.Stack, if err = stack.Initialize.Add(newServiceMetadataMiddleware_opRegisterClient(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go index 013ccbc935..70e60db14b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go @@ -28,9 +28,9 @@ func (c *Client) StartDeviceAuthorization(ctx context.Context, params *StartDevi type StartDeviceAuthorizationInput struct { - // The unique identifier string for the client that is registered with IAM Identity - // Center. This value should come from the persisted result of the RegisterClient - // API operation. + // The unique identifier string for the client that is registered with IAM + // Identity Center. This value should come from the persisted result of the + // RegisterClient API operation. // // This member is required. ClientId *string @@ -42,8 +42,7 @@ type StartDeviceAuthorizationInput struct { ClientSecret *string // The URL for the AWS access portal. For more information, see Using the AWS - // access portal - // (https://docs.aws.amazon.com/singlesignon/latest/userguide/using-the-portal.html) + // access portal (https://docs.aws.amazon.com/singlesignon/latest/userguide/using-the-portal.html) // in the IAM Identity Center User Guide. // // This member is required. @@ -73,9 +72,9 @@ type StartDeviceAuthorizationOutput struct { // device. VerificationUri *string - // An alternate URL that the client can use to automatically launch a browser. This - // process skips the manual step in which the user visits the verification page and - // enters their code. + // An alternate URL that the client can use to automatically launch a browser. + // This process skips the manual step in which the user visits the verification + // page and enters their code. VerificationUriComplete *string // Metadata pertaining to the operation's result. @@ -129,6 +128,9 @@ func (c *Client) addOperationStartDeviceAuthorizationMiddlewares(stack *middlewa if err = stack.Initialize.Add(newServiceMetadataMiddleware_opStartDeviceAuthorization(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go index e9939aff0d..ca30d22f97 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go @@ -85,9 +85,9 @@ func awsRestjson1_deserializeOpErrorCreateToken(response *smithyhttp.Response, m errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -96,7 +96,7 @@ func awsRestjson1_deserializeOpErrorCreateToken(response *smithyhttp.Response, m body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -108,8 +108,8 @@ func awsRestjson1_deserializeOpErrorCreateToken(response *smithyhttp.Response, m } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -306,9 +306,9 @@ func awsRestjson1_deserializeOpErrorRegisterClient(response *smithyhttp.Response errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -317,7 +317,7 @@ func awsRestjson1_deserializeOpErrorRegisterClient(response *smithyhttp.Response body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -329,8 +329,8 @@ func awsRestjson1_deserializeOpErrorRegisterClient(response *smithyhttp.Response } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message @@ -519,9 +519,9 @@ func awsRestjson1_deserializeOpErrorStartDeviceAuthorization(response *smithyhtt errorCode := "UnknownError" errorMessage := errorCode - code := response.Header.Get("X-Amzn-ErrorType") - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) } var buff [1024]byte @@ -530,7 +530,7 @@ func awsRestjson1_deserializeOpErrorStartDeviceAuthorization(response *smithyhtt body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() - code, message, err := restjson.GetErrorInfo(decoder) + jsonCode, message, err := restjson.GetErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -542,8 +542,8 @@ func awsRestjson1_deserializeOpErrorStartDeviceAuthorization(response *smithyhtt } errorBody.Seek(0, io.SeekStart) - if len(code) != 0 { - errorCode = restjson.SanitizeErrorCode(code) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) } if len(message) != 0 { errorMessage = message diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/doc.go index a025f7327e..2239427d88 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/doc.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/doc.go @@ -1,7 +1,7 @@ // Code generated by smithy-go-codegen DO NOT EDIT. -// Package ssooidc provides the API client, operations, and parameter types for AWS -// SSO OIDC. +// Package ssooidc provides the API client, operations, and parameter types for +// AWS SSO OIDC. // // AWS IAM Identity Center (successor to AWS Single Sign-On) OpenID Connect (OIDC) // is a web service that enables a client (such as AWS CLI or a native application) @@ -10,37 +10,27 @@ // with IAM Identity Center. Although AWS Single Sign-On was renamed, the sso and // identitystore API namespaces will continue to retain their original name for // backward compatibility purposes. For more information, see IAM Identity Center -// rename -// (https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed). -// Considerations for Using This Guide Before you begin using this guide, we +// rename (https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed) +// . Considerations for Using This Guide Before you begin using this guide, we // recommend that you first review the following important information about how // the IAM Identity Center OIDC service works. +// - The IAM Identity Center OIDC service currently implements only the portions +// of the OAuth 2.0 Device Authorization Grant standard ( +// https://tools.ietf.org/html/rfc8628 (https://tools.ietf.org/html/rfc8628) ) +// that are necessary to enable single sign-on authentication with the AWS CLI. +// Support for other OIDC flows frequently needed for native applications, such as +// Authorization Code Flow (+ PKCE), will be addressed in future releases. +// - The service emits only OIDC access tokens, such that obtaining a new token +// (For example, token refresh) requires explicit user re-authentication. +// - The access tokens provided by this service grant access to all AWS account +// entitlements assigned to an IAM Identity Center user, not just a particular +// application. +// - The documentation in this guide does not describe the mechanism to convert +// the access token into AWS Auth (“sigv4”) credentials for use with IAM-protected +// AWS service endpoints. For more information, see GetRoleCredentials (https://docs.aws.amazon.com/singlesignon/latest/PortalAPIReference/API_GetRoleCredentials.html) +// in the IAM Identity Center Portal API Reference Guide. // -// * The IAM Identity Center OIDC -// service currently implements only the portions of the OAuth 2.0 Device -// Authorization Grant standard (https://tools.ietf.org/html/rfc8628 -// (https://tools.ietf.org/html/rfc8628)) that are necessary to enable single -// sign-on authentication with the AWS CLI. Support for other OIDC flows frequently -// needed for native applications, such as Authorization Code Flow (+ PKCE), will -// be addressed in future releases. -// -// * The service emits only OIDC access tokens, -// such that obtaining a new token (For example, token refresh) requires explicit -// user re-authentication. -// -// * The access tokens provided by this service grant -// access to all AWS account entitlements assigned to an IAM Identity Center user, -// not just a particular application. -// -// * The documentation in this guide does not -// describe the mechanism to convert the access token into AWS Auth (“sigv4”) -// credentials for use with IAM-protected AWS service endpoints. For more -// information, see GetRoleCredentials -// (https://docs.aws.amazon.com/singlesignon/latest/PortalAPIReference/API_GetRoleCredentials.html) -// in the IAM Identity Center Portal API Reference Guide. -// -// For general information -// about IAM Identity Center, see What is IAM Identity Center? -// (https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) in the -// IAM Identity Center User Guide. +// For general information about IAM Identity Center, see What is IAM Identity +// Center? (https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) +// in the IAM Identity Center User Guide. package ssooidc diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go index 6e76b14b37..82156c20f3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go @@ -3,4 +3,4 @@ package ssooidc // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.14.0" +const goModuleVersion = "1.14.12" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go index 2212db1c62..b04fb46fe6 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go @@ -89,6 +89,8 @@ var partitionRegexp = struct { AwsCn *regexp.Regexp AwsIso *regexp.Regexp AwsIsoB *regexp.Regexp + AwsIsoE *regexp.Regexp + AwsIsoF *regexp.Regexp AwsUsGov *regexp.Regexp }{ @@ -96,6 +98,8 @@ var partitionRegexp = struct { AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), + AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), + AwsIsoF: regexp.MustCompile("^us\\-isof\\-\\w+\\-\\d+$"), AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), } @@ -390,6 +394,48 @@ var defaultPartitions = endpoints.Partitions{ RegionRegex: partitionRegexp.AwsIsoB, IsRegionalized: true, }, + { + ID: "aws-iso-e", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "oidc-fips.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "oidc.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoE, + IsRegionalized: true, + }, + { + ID: "aws-iso-f", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "oidc-fips.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "oidc.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoF, + IsRegionalized: true, + }, { ID: "aws-us-gov", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/errors.go index b75cc489d9..115a51a9eb 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/errors.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/errors.go @@ -29,15 +29,15 @@ func (e *AccessDeniedException) ErrorMessage() string { return *e.Message } func (e *AccessDeniedException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "AccessDeniedException" } return *e.ErrorCodeOverride } func (e *AccessDeniedException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// Indicates that a request to authorize a client with an access user session token -// is pending. +// Indicates that a request to authorize a client with an access user session +// token is pending. type AuthorizationPendingException struct { Message *string @@ -59,7 +59,7 @@ func (e *AuthorizationPendingException) ErrorMessage() string { return *e.Message } func (e *AuthorizationPendingException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "AuthorizationPendingException" } return *e.ErrorCodeOverride @@ -89,7 +89,7 @@ func (e *ExpiredTokenException) ErrorMessage() string { return *e.Message } func (e *ExpiredTokenException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ExpiredTokenException" } return *e.ErrorCodeOverride @@ -119,7 +119,7 @@ func (e *InternalServerException) ErrorMessage() string { return *e.Message } func (e *InternalServerException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InternalServerException" } return *e.ErrorCodeOverride @@ -128,7 +128,7 @@ func (e *InternalServerException) ErrorFault() smithy.ErrorFault { return smithy // Indicates that the clientId or clientSecret in the request is invalid. For // example, this can occur when a client sends an incorrect clientId or an expired -// clientSecret. +// clientSecret . type InvalidClientException struct { Message *string @@ -150,15 +150,15 @@ func (e *InvalidClientException) ErrorMessage() string { return *e.Message } func (e *InvalidClientException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidClientException" } return *e.ErrorCodeOverride } func (e *InvalidClientException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// Indicates that the client information sent in the request during registration is -// invalid. +// Indicates that the client information sent in the request during registration +// is invalid. type InvalidClientMetadataException struct { Message *string @@ -180,7 +180,7 @@ func (e *InvalidClientMetadataException) ErrorMessage() string { return *e.Message } func (e *InvalidClientMetadataException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidClientMetadataException" } return *e.ErrorCodeOverride @@ -210,7 +210,7 @@ func (e *InvalidGrantException) ErrorMessage() string { return *e.Message } func (e *InvalidGrantException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidGrantException" } return *e.ErrorCodeOverride @@ -240,7 +240,7 @@ func (e *InvalidRequestException) ErrorMessage() string { return *e.Message } func (e *InvalidRequestException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidRequestException" } return *e.ErrorCodeOverride @@ -269,7 +269,7 @@ func (e *InvalidScopeException) ErrorMessage() string { return *e.Message } func (e *InvalidScopeException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidScopeException" } return *e.ErrorCodeOverride @@ -299,7 +299,7 @@ func (e *SlowDownException) ErrorMessage() string { return *e.Message } func (e *SlowDownException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "SlowDownException" } return *e.ErrorCodeOverride @@ -329,7 +329,7 @@ func (e *UnauthorizedClientException) ErrorMessage() string { return *e.Message } func (e *UnauthorizedClientException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UnauthorizedClientException" } return *e.ErrorCodeOverride @@ -358,7 +358,7 @@ func (e *UnsupportedGrantTypeException) ErrorMessage() string { return *e.Message } func (e *UnsupportedGrantTypeException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "UnsupportedGrantTypeException" } return *e.ErrorCodeOverride diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md index cdc4060917..46a30e5b74 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md @@ -1,3 +1,56 @@ +# v1.19.2 (2023-06-15) + +* No change notes available for this release. + +# v1.19.1 (2023-06-13) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.0 (2023-05-08) + +* **Feature**: Documentation updates for AWS Security Token Service. + +# v1.18.11 (2023-05-04) + +* No change notes available for this release. + +# v1.18.10 (2023-04-24) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.9 (2023-04-10) + +* No change notes available for this release. + +# v1.18.8 (2023-04-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.7 (2023-03-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.6 (2023-03-10) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.5 (2023-02-22) + +* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. + +# v1.18.4 (2023-02-20) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.3 (2023-02-03) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade smithy to 1.27.2 and correct empty query list serialization. + +# v1.18.2 (2023-01-25) + +* **Documentation**: Doc only change to update wording in a key topic + # v1.18.1 (2023-01-23) * No change notes available for this release. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go index 3041fc467e..78eb267020 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go @@ -117,7 +117,7 @@ type Options struct { Retryer aws.Retryer // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set - // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig. You + // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You // should not populate this structure programmatically, or rely on the values here // within your applications. RuntimeEnvironment aws.RuntimeEnvironment diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go index f4f4f46f44..db22efc0e8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go @@ -12,21 +12,17 @@ import ( ) // Returns a set of temporary security credentials that you can use to access -// Amazon Web Services resources that you might not normally have access to. These -// temporary credentials consist of an access key ID, a secret access key, and a -// security token. Typically, you use AssumeRole within your account or for -// cross-account access. For a comparison of AssumeRole with other API operations -// that produce temporary credentials, see Requesting Temporary Security -// Credentials -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the Amazon Web Services STS API operations -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// Amazon Web Services resources. These temporary credentials consist of an access +// key ID, a secret access key, and a security token. Typically, you use AssumeRole +// within your account or for cross-account access. For a comparison of AssumeRole +// with other API operations that produce temporary credentials, see Requesting +// Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the Amazon Web Services STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. Permissions The temporary security credentials created by -// AssumeRole can be used to make API calls to any Amazon Web Services service with -// the following exception: You cannot call the Amazon Web Services STS +// AssumeRole can be used to make API calls to any Amazon Web Services service +// with the following exception: You cannot call the Amazon Web Services STS // GetFederationToken or GetSessionToken API operations. (Optional) You can pass -// inline or managed session policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // to this operation. You can pass a single JSON policy document to use as an // inline session policy. You can also specify up to 10 managed policy Amazon // Resource Names (ARNs) to use as managed session policies. The plaintext that you @@ -37,49 +33,39 @@ import ( // credentials in subsequent Amazon Web Services API calls to access resources in // the account that owns the role. You cannot use session policies to grant more // permissions than those allowed by the identity-based policy of the role that is -// being assumed. For more information, see Session Policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// in the IAM User Guide. When you create a role, you create two policies: A role -// trust policy that specifies who can assume the role and a permissions policy +// being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// in the IAM User Guide. When you create a role, you create two policies: a role +// trust policy that specifies who can assume the role, and a permissions policy // that specifies what can be done with the role. You specify the trusted principal -// who is allowed to assume the role in the role trust policy. To assume a role +// that is allowed to assume the role in the role trust policy. To assume a role // from a different account, your Amazon Web Services account must be trusted by // the role. The trust relationship is defined in the role's trust policy when the // role is created. That trust policy states which accounts are allowed to delegate // that access to users in the account. A user who wants to access a role in a -// different account must also have permissions that are delegated from the user -// account administrator. The administrator must attach a policy that allows the -// user to call AssumeRole for the ARN of the role in the other account. To allow a -// user to assume a role in the same account, you can do either of the -// following: +// different account must also have permissions that are delegated from the account +// administrator. The administrator must attach a policy that allows the user to +// call AssumeRole for the ARN of the role in the other account. To allow a user +// to assume a role in the same account, you can do either of the following: +// - Attach a policy to the user that allows the user to call AssumeRole (as long +// as the role's trust policy trusts the account). +// - Add the user as a principal directly in the role's trust policy. // -// * Attach a policy to the user that allows the user to call -// AssumeRole (as long as the role's trust policy trusts the account). -// -// * Add the -// user as a principal directly in the role's trust policy. -// -// You can do either -// because the role’s trust policy acts as an IAM resource-based policy. When a -// resource-based policy grants access to a principal in the same account, no -// additional identity-based policy is required. For more information about trust -// policies and resource-based policies, see IAM Policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) in the -// IAM User Guide. Tags (Optional) You can pass tag key-value pairs to your +// You can do either because the role’s trust policy acts as an IAM resource-based +// policy. When a resource-based policy grants access to a principal in the same +// account, no additional identity-based policy is required. For more information +// about trust policies and resource-based policies, see IAM Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) +// in the IAM User Guide. Tags (Optional) You can pass tag key-value pairs to your // session. These tags are called session tags. For more information about session -// tags, see Passing Session Tags in STS -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the -// IAM User Guide. An administrator must grant you the permissions necessary to -// pass session tags. The administrator can also create granular permissions to +// tags, see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. An administrator must grant you the permissions necessary +// to pass session tags. The administrator can also create granular permissions to // allow you to pass only specific session tags. For more information, see -// Tutorial: Using Tags for Attribute-Based Access Control -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// Tutorial: Using Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) // in the IAM User Guide. You can set the session tags as transitive. Transitive -// tags persist during role chaining. For more information, see Chaining Roles with -// Session Tags -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) +// tags persist during role chaining. For more information, see Chaining Roles +// with Session Tags (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) // in the IAM User Guide. Using MFA with AssumeRole (Optional) You can include -// multi-factor authentication (MFA) information when you call AssumeRole. This is +// multi-factor authentication (MFA) information when you call AssumeRole . This is // useful for cross-account scenarios to ensure that the user that assumes the role // has been authenticated with an Amazon Web Services MFA device. In that scenario, // the trust policy of the role being assumed includes a condition that tests for @@ -87,12 +73,11 @@ import ( // request to assume the role is denied. The condition in a trust policy that tests // for MFA authentication might look like the following example. "Condition": // {"Bool": {"aws:MultiFactorAuthPresent": true}} For more information, see -// Configuring MFA-Protected API Access -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html) in the -// IAM User Guide guide. To use MFA with AssumeRole, you pass values for the -// SerialNumber and TokenCode parameters. The SerialNumber value identifies the -// user's hardware or virtual MFA device. The TokenCode is the time-based one-time -// password (TOTP) that the MFA device produces. +// Configuring MFA-Protected API Access (https://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html) +// in the IAM User Guide guide. To use MFA with AssumeRole , you pass values for +// the SerialNumber and TokenCode parameters. The SerialNumber value identifies +// the user's hardware or virtual MFA device. The TokenCode is the time-based +// one-time password (TOTP) that the MFA device produces. func (c *Client) AssumeRole(ctx context.Context, params *AssumeRoleInput, optFns ...func(*Options)) (*AssumeRoleOutput, error) { if params == nil { params = &AssumeRoleInput{} @@ -144,16 +129,14 @@ type AssumeRoleInput struct { // maximum session duration setting for your role. However, if you assume a role // using role chaining and provide a DurationSeconds parameter value greater than // one hour, the operation fails. To learn how to view the maximum value for your - // role, see View the Maximum Session Duration Setting for a Role - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // role, see View the Maximum Session Duration Setting for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. By default, the value is set to 3600 seconds. The // DurationSeconds parameter is separate from the duration of a console session // that you might request using the returned credentials. The request to the // federation endpoint for a console sign-in token takes a SessionDuration // parameter that specifies the maximum length of the console session. For more // information, see Creating a URL that Enables Federated Users to Access the - // Amazon Web Services Management Console - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // Amazon Web Services Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) // in the IAM User Guide. DurationSeconds *int32 @@ -166,8 +149,7 @@ type AssumeRoleInput struct { // administrator of the trusted account. That way, only someone with the ID can // assume the role, rather than everyone in the account. For more information about // the external ID, see How to Use an External ID When Granting Access to Your - // Amazon Web Services Resources to a Third Party - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) + // Amazon Web Services Resources to a Third Party (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) // in the IAM User Guide. The regex used to validate this parameter is a string of // characters consisting of upper- and lower-case alphanumeric characters with no // spaces. You can also include underscores or any of the following characters: @@ -182,8 +164,7 @@ type AssumeRoleInput struct { // access resources in the account that owns the role. You cannot use session // policies to grant more permissions than those allowed by the identity-based // policy of the role that is being assumed. For more information, see Session - // Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. The plaintext that you use for both inline and managed // session policies can't exceed 2,048 characters. The JSON policy characters can // be any ASCII character from the space character to the end of the valid @@ -201,9 +182,8 @@ type AssumeRoleInput struct { // the role. This parameter is optional. You can provide up to 10 managed policy // ARNs. However, the plaintext that you use for both inline and managed session // policies can't exceed 2,048 characters. For more information about ARNs, see - // Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces - // (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in - // the Amazon Web Services General Reference. An Amazon Web Services conversion + // Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the Amazon Web Services General Reference. An Amazon Web Services conversion // compresses the passed inline session policy, managed policy ARNs, and session // tags into a packed binary format that has a separate limit. Your request can // fail for this limit even if your plaintext meets the other requirements. The @@ -215,17 +195,16 @@ type AssumeRoleInput struct { // Services API calls to access resources in the account that owns the role. You // cannot use session policies to grant more permissions than those allowed by the // identity-based policy of the role that is being assumed. For more information, - // see Session Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. PolicyArns []types.PolicyDescriptorType - // The identification number of the MFA device that is associated with the user who - // is making the AssumeRole call. Specify this value if the trust policy of the - // role being assumed includes a condition that requires MFA authentication. The - // value is either the serial number for a hardware device (such as GAHT12345678) - // or an Amazon Resource Name (ARN) for a virtual device (such as - // arn:aws:iam::123456789012:mfa/user). The regex used to validate this parameter + // The identification number of the MFA device that is associated with the user + // who is making the AssumeRole call. Specify this value if the trust policy of + // the role being assumed includes a condition that requires MFA authentication. + // The value is either the serial number for a hardware device (such as + // GAHT12345678 ) or an Amazon Resource Name (ARN) for a virtual device (such as + // arn:aws:iam::123456789012:mfa/user ). The regex used to validate this parameter // is a string of characters consisting of upper- and lower-case alphanumeric // characters with no spaces. You can also include underscores or any of the // following characters: =,.@- @@ -238,24 +217,21 @@ type AssumeRoleInput struct { // who took actions with a role. You can use the aws:SourceIdentity condition key // to further control access to Amazon Web Services resources based on the value of // source identity. For more information about using source identity, see Monitor - // and control actions taken with assumed roles - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) + // and control actions taken with assumed roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) // in the IAM User Guide. The regex used to validate this parameter is a string of // characters consisting of upper- and lower-case alphanumeric characters with no // spaces. You can also include underscores or any of the following characters: - // =,.@-. You cannot use a value that begins with the text aws:. This prefix is + // =,.@-. You cannot use a value that begins with the text aws: . This prefix is // reserved for Amazon Web Services internal use. SourceIdentity *string - // A list of session tags that you want to pass. Each session tag consists of a key - // name and an associated value. For more information about session tags, see - // Tagging Amazon Web Services STS Sessions - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the - // IAM User Guide. This parameter is optional. You can pass up to 50 session tags. - // The plaintext session tag keys can’t exceed 128 characters, and the values can’t - // exceed 256 characters. For these and additional limits, see IAM and STS - // Character Limits - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // A list of session tags that you want to pass. Each session tag consists of a + // key name and an associated value. For more information about session tags, see + // Tagging Amazon Web Services STS Sessions (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) + // in the IAM User Guide. This parameter is optional. You can pass up to 50 session + // tags. The plaintext session tag keys can’t exceed 128 characters, and the values + // can’t exceed 256 characters. For these and additional limits, see IAM and STS + // Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) // in the IAM User Guide. An Amazon Web Services conversion compresses the passed // inline session policy, managed policy ARNs, and session tags into a packed // binary format that has a separate limit. Your request can fail for this limit @@ -265,16 +241,15 @@ type AssumeRoleInput struct { // same key as a tag that is already attached to the role. When you do, session // tags override a role tag with the same key. Tag key–value pairs are not case // sensitive, but case is preserved. This means that you cannot have separate - // Department and department tag keys. Assume that the role has the - // Department=Marketing tag and you pass the department=engineering session tag. - // Department and department are not saved as separate tags, and the session tag - // passed in the request takes precedence over the role tag. Additionally, if you - // used temporary credentials to perform this operation, the new session inherits - // any transitive session tags from the calling session. If you pass a session tag - // with the same key as an inherited tag, the operation fails. To view the - // inherited tags for a session, see the CloudTrail logs. For more information, see - // Viewing Session Tags in CloudTrail - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_ctlogs) + // Department and department tag keys. Assume that the role has the Department = + // Marketing tag and you pass the department = engineering session tag. Department + // and department are not saved as separate tags, and the session tag passed in + // the request takes precedence over the role tag. Additionally, if you used + // temporary credentials to perform this operation, the new session inherits any + // transitive session tags from the calling session. If you pass a session tag with + // the same key as an inherited tag, the operation fails. To view the inherited + // tags for a session, see the CloudTrail logs. For more information, see Viewing + // Session Tags in CloudTrail (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_ctlogs) // in the IAM User Guide. Tags []types.Tag @@ -286,11 +261,10 @@ type AssumeRoleInput struct { // sequence of six numeric digits. TokenCode *string - // A list of keys for session tags that you want to set as transitive. If you set a - // tag key as transitive, the corresponding key and value passes to subsequent + // A list of keys for session tags that you want to set as transitive. If you set + // a tag key as transitive, the corresponding key and value passes to subsequent // sessions in a role chain. For more information, see Chaining Roles with Session - // Tags - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) + // Tags (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) // in the IAM User Guide. This parameter is optional. When you set session tags as // transitive, the session policy and session tags packed binary limit is not // affected. If you choose not to specify a transitive tag key, then no tags are @@ -309,7 +283,7 @@ type AssumeRoleOutput struct { // that you can use to refer to the resulting temporary security credentials. For // example, you can reference these credentials as a principal in a resource-based // policy by using the ARN or assumed role ID. The ARN and ID include the - // RoleSessionName that you specified when you called AssumeRole. + // RoleSessionName that you specified when you called AssumeRole . AssumedRoleUser *types.AssumedRoleUser // The temporary security credentials, which include an access key ID, a secret @@ -331,8 +305,7 @@ type AssumeRoleOutput struct { // who took actions with a role. You can use the aws:SourceIdentity condition key // to further control access to Amazon Web Services resources based on the value of // source identity. For more information about using source identity, see Monitor - // and control actions taken with assumed roles - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) + // and control actions taken with assumed roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) // in the IAM User Guide. The regex used to validate this parameter is a string of // characters consisting of upper- and lower-case alphanumeric characters with no // spaces. You can also include underscores or any of the following characters: @@ -396,6 +369,9 @@ func (c *Client) addOperationAssumeRoleMiddlewares(stack *middleware.Stack, opti if err = stack.Initialize.Add(newServiceMetadataMiddleware_opAssumeRole(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go index 4ed0f5d07f..65dccc9ea0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go @@ -15,10 +15,8 @@ import ( // mechanism for tying an enterprise identity store or directory to role-based // Amazon Web Services access without user-specific credentials or configuration. // For a comparison of AssumeRoleWithSAML with the other API operations that -// produce temporary credentials, see Requesting Temporary Security Credentials -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the Amazon Web Services STS API operations -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// produce temporary credentials, see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the Amazon Web Services STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. The temporary security credentials returned by this // operation consist of an access key ID, a secret access key, and a security // token. Applications can use these temporary security credentials to sign calls @@ -31,15 +29,12 @@ import ( // DurationSeconds value from 900 seconds (15 minutes) up to the maximum session // duration setting for the role. This setting can have a value from 1 hour to 12 // hours. To learn how to view the maximum value for your role, see View the -// Maximum Session Duration Setting for a Role -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// Maximum Session Duration Setting for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. The maximum session duration limit applies when you use // the AssumeRole* API operations or the assume-role* CLI commands. However the // limit does not apply when you use those operations to create a console URL. For -// more information, see Using IAM Roles -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) in the IAM -// User Guide. Role chaining -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-role-chaining) +// more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// in the IAM User Guide. Role chaining (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-role-chaining) // limits your CLI or Amazon Web Services API role session to a maximum of one // hour. When you use the AssumeRole API operation to assume a role, you can // specify the duration of your role session with the DurationSeconds parameter. @@ -50,8 +45,7 @@ import ( // credentials created by AssumeRoleWithSAML can be used to make API calls to any // Amazon Web Services service with the following exception: you cannot call the // STS GetFederationToken or GetSessionToken API operations. (Optional) You can -// pass inline or managed session policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // to this operation. You can pass a single JSON policy document to use as an // inline session policy. You can also specify up to 10 managed policy Amazon // Resource Names (ARNs) to use as managed session policies. The plaintext that you @@ -62,8 +56,7 @@ import ( // credentials in subsequent Amazon Web Services API calls to access resources in // the account that owns the role. You cannot use session policies to grant more // permissions than those allowed by the identity-based policy of the role that is -// being assumed. For more information, see Session Policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. Calling AssumeRoleWithSAML does not require the use of // Amazon Web Services security credentials. The identity of the caller is // validated by using keys in the metadata document that is uploaded for the SAML @@ -71,16 +64,14 @@ import ( // result in an entry in your CloudTrail logs. The entry includes the value in the // NameID element of the SAML assertion. We recommend that you use a NameIDType // that is not associated with any personally identifiable information (PII). For -// example, you could instead use the persistent identifier -// (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent). Tags (Optional) You can +// example, you could instead use the persistent identifier ( +// urn:oasis:names:tc:SAML:2.0:nameid-format:persistent ). Tags (Optional) You can // configure your IdP to pass attributes into your SAML assertion as session tags. // Each session tag consists of a key name and an associated value. For more -// information about session tags, see Passing Session Tags in STS -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the -// IAM User Guide. You can pass up to 50 session tags. The plaintext session tag -// keys can’t exceed 128 characters and the values can’t exceed 256 characters. For -// these and additional limits, see IAM and STS Character Limits -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) +// information about session tags, see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. You can pass up to 50 session tags. The plaintext session +// tag keys can’t exceed 128 characters and the values can’t exceed 256 characters. +// For these and additional limits, see IAM and STS Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) // in the IAM User Guide. An Amazon Web Services conversion compresses the passed // inline session policy, managed policy ARNs, and session tags into a packed // binary format that has a separate limit. Your request can fail for this limit @@ -91,36 +82,25 @@ import ( // override the role's tags with the same key. An administrator must grant you the // permissions necessary to pass session tags. The administrator can also create // granular permissions to allow you to pass only specific session tags. For more -// information, see Tutorial: Using Tags for Attribute-Based Access Control -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// information, see Tutorial: Using Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) // in the IAM User Guide. You can set the session tags as transitive. Transitive -// tags persist during role chaining. For more information, see Chaining Roles with -// Session Tags -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) +// tags persist during role chaining. For more information, see Chaining Roles +// with Session Tags (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) // in the IAM User Guide. SAML Configuration Before your application can call -// AssumeRoleWithSAML, you must configure your SAML identity provider (IdP) to +// AssumeRoleWithSAML , you must configure your SAML identity provider (IdP) to // issue the claims required by Amazon Web Services. Additionally, you must use // Identity and Access Management (IAM) to create a SAML provider entity in your // Amazon Web Services account that represents your identity provider. You must // also create an IAM role that specifies this SAML provider in its trust policy. // For more information, see the following resources: -// -// * About SAML 2.0-based -// Federation -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) -// in the IAM User Guide. -// -// * Creating SAML Identity Providers -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html) -// in the IAM User Guide. -// -// * Configuring a Relying Party and Claims -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html) -// in the IAM User Guide. -// -// * Creating a Role for SAML 2.0 Federation -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html) -// in the IAM User Guide. +// - About SAML 2.0-based Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) +// in the IAM User Guide. +// - Creating SAML Identity Providers (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html) +// in the IAM User Guide. +// - Configuring a Relying Party and Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html) +// in the IAM User Guide. +// - Creating a Role for SAML 2.0 Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html) +// in the IAM User Guide. func (c *Client) AssumeRoleWithSAML(ctx context.Context, params *AssumeRoleWithSAMLInput, optFns ...func(*Options)) (*AssumeRoleWithSAMLOutput, error) { if params == nil { params = &AssumeRoleWithSAMLInput{} @@ -150,8 +130,7 @@ type AssumeRoleWithSAMLInput struct { RoleArn *string // The base64 encoded SAML authentication response provided by the IdP. For more - // information, see Configuring a Relying Party and Adding Claims - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html) + // information, see Configuring a Relying Party and Adding Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html) // in the IAM User Guide. // // This member is required. @@ -166,16 +145,14 @@ type AssumeRoleWithSAMLInput struct { // than this setting, the operation fails. For example, if you specify a session // duration of 12 hours, but your administrator set the maximum session duration to // 6 hours, your operation fails. To learn how to view the maximum value for your - // role, see View the Maximum Session Duration Setting for a Role - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // role, see View the Maximum Session Duration Setting for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. By default, the value is set to 3600 seconds. The // DurationSeconds parameter is separate from the duration of a console session // that you might request using the returned credentials. The request to the // federation endpoint for a console sign-in token takes a SessionDuration // parameter that specifies the maximum length of the console session. For more // information, see Creating a URL that Enables Federated Users to Access the - // Amazon Web Services Management Console - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // Amazon Web Services Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) // in the IAM User Guide. DurationSeconds *int32 @@ -187,8 +164,7 @@ type AssumeRoleWithSAMLInput struct { // access resources in the account that owns the role. You cannot use session // policies to grant more permissions than those allowed by the identity-based // policy of the role that is being assumed. For more information, see Session - // Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. The plaintext that you use for both inline and managed // session policies can't exceed 2,048 characters. The JSON policy characters can // be any ASCII character from the space character to the end of the valid @@ -206,9 +182,8 @@ type AssumeRoleWithSAMLInput struct { // the role. This parameter is optional. You can provide up to 10 managed policy // ARNs. However, the plaintext that you use for both inline and managed session // policies can't exceed 2,048 characters. For more information about ARNs, see - // Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces - // (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in - // the Amazon Web Services General Reference. An Amazon Web Services conversion + // Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the Amazon Web Services General Reference. An Amazon Web Services conversion // compresses the passed inline session policy, managed policy ARNs, and session // tags into a packed binary format that has a separate limit. Your request can // fail for this limit even if your plaintext meets the other requirements. The @@ -220,8 +195,7 @@ type AssumeRoleWithSAMLInput struct { // Services API calls to access resources in the account that owns the role. You // cannot use session policies to grant more permissions than those allowed by the // identity-based policy of the role that is being assumed. For more information, - // see Session Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. PolicyArns []types.PolicyDescriptorType @@ -251,19 +225,12 @@ type AssumeRoleWithSAMLOutput struct { Issuer *string // A hash value based on the concatenation of the following: - // - // * The Issuer response - // value. - // - // * The Amazon Web Services account ID. - // - // * The friendly name (the last - // part of the ARN) of the SAML provider in IAM. - // - // The combination of NameQualifier - // and Subject can be used to uniquely identify a federated user. The following - // pseudocode shows how the hash value is calculated: BASE64 ( SHA1 ( - // "https://example.com/saml" + "123456789012" + "/MySAMLIdP" ) ) + // - The Issuer response value. + // - The Amazon Web Services account ID. + // - The friendly name (the last part of the ARN) of the SAML provider in IAM. + // The combination of NameQualifier and Subject can be used to uniquely identify a + // user. The following pseudocode shows how the hash value is calculated: BASE64 ( + // SHA1 ( "https://example.com/saml" + "123456789012" + "/MySAMLIdP" ) ) NameQualifier *string // A percentage value that indicates the packed size of the session policies and @@ -272,20 +239,18 @@ type AssumeRoleWithSAMLOutput struct { // allowed space. PackedPolicySize *int32 - // The value in the SourceIdentity attribute in the SAML assertion. You can require - // users to set a source identity value when they assume a role. You do this by - // using the sts:SourceIdentity condition key in a role trust policy. That way, - // actions that are taken with the role are associated with that user. After the - // source identity is set, the value cannot be changed. It is present in the + // The value in the SourceIdentity attribute in the SAML assertion. You can + // require users to set a source identity value when they assume a role. You do + // this by using the sts:SourceIdentity condition key in a role trust policy. That + // way, actions that are taken with the role are associated with that user. After + // the source identity is set, the value cannot be changed. It is present in the // request for all actions that are taken by the role and persists across chained - // role - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts#iam-term-role-chaining) + // role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts#iam-term-role-chaining) // sessions. You can configure your SAML identity provider to use an attribute // associated with your users, like user name or email, as the source identity when - // calling AssumeRoleWithSAML. You do this by adding an attribute to the SAML + // calling AssumeRoleWithSAML . You do this by adding an attribute to the SAML // assertion. For more information about using source identity, see Monitor and - // control actions taken with assumed roles - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) + // control actions taken with assumed roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) // in the IAM User Guide. The regex used to validate this parameter is a string of // characters consisting of upper- and lower-case alphanumeric characters with no // spaces. You can also include underscores or any of the following characters: @@ -297,10 +262,10 @@ type AssumeRoleWithSAMLOutput struct { // The format of the name ID, as defined by the Format attribute in the NameID // element of the SAML assertion. Typical examples of the format are transient or - // persistent. If the format includes the prefix - // urn:oasis:names:tc:SAML:2.0:nameid-format, that prefix is removed. For example, - // urn:oasis:names:tc:SAML:2.0:nameid-format:transient is returned as transient. If - // the format includes any other prefix, the format is returned with no + // persistent . If the format includes the prefix + // urn:oasis:names:tc:SAML:2.0:nameid-format , that prefix is removed. For example, + // urn:oasis:names:tc:SAML:2.0:nameid-format:transient is returned as transient . + // If the format includes any other prefix, the format is returned with no // modifications. SubjectType *string @@ -355,6 +320,9 @@ func (c *Client) addOperationAssumeRoleWithSAMLMiddlewares(stack *middleware.Sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opAssumeRoleWithSAML(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go index e2ff4ac62e..f00f307634 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go @@ -14,54 +14,44 @@ import ( // authenticated in a mobile or web application with a web identity provider. // Example providers include the OAuth 2.0 providers Login with Amazon and // Facebook, or any OpenID Connect-compatible identity provider such as Google or -// Amazon Cognito federated identities -// (https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html). -// For mobile applications, we recommend that you use Amazon Cognito. You can use -// Amazon Cognito with the Amazon Web Services SDK for iOS Developer Guide -// (http://aws.amazon.com/sdkforios/) and the Amazon Web Services SDK for Android -// Developer Guide (http://aws.amazon.com/sdkforandroid/) to uniquely identify a -// user. You can also supply the user with a consistent identity throughout the -// lifetime of an application. To learn more about Amazon Cognito, see Amazon -// Cognito Overview -// (https://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/cognito-auth.html#d0e840) -// in Amazon Web Services SDK for Android Developer Guide and Amazon Cognito -// Overview -// (https://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html#d0e664) -// in the Amazon Web Services SDK for iOS Developer Guide. Calling -// AssumeRoleWithWebIdentity does not require the use of Amazon Web Services -// security credentials. Therefore, you can distribute an application (for example, -// on mobile devices) that requests temporary security credentials without -// including long-term Amazon Web Services credentials in the application. You also -// don't need to deploy server-based proxy services that use long-term Amazon Web -// Services credentials. Instead, the identity of the caller is validated by using -// a token from the web identity provider. For a comparison of -// AssumeRoleWithWebIdentity with the other API operations that produce temporary -// credentials, see Requesting Temporary Security Credentials -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the Amazon Web Services STS API operations -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// Amazon Cognito federated identities (https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html) +// . For mobile applications, we recommend that you use Amazon Cognito. You can use +// Amazon Cognito with the Amazon Web Services SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) +// and the Amazon Web Services SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/) +// to uniquely identify a user. You can also supply the user with a consistent +// identity throughout the lifetime of an application. To learn more about Amazon +// Cognito, see Amazon Cognito identity pools (https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html) +// in Amazon Cognito Developer Guide. Calling AssumeRoleWithWebIdentity does not +// require the use of Amazon Web Services security credentials. Therefore, you can +// distribute an application (for example, on mobile devices) that requests +// temporary security credentials without including long-term Amazon Web Services +// credentials in the application. You also don't need to deploy server-based proxy +// services that use long-term Amazon Web Services credentials. Instead, the +// identity of the caller is validated by using a token from the web identity +// provider. For a comparison of AssumeRoleWithWebIdentity with the other API +// operations that produce temporary credentials, see Requesting Temporary +// Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the Amazon Web Services STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. The temporary security credentials returned by this API // consist of an access key ID, a secret access key, and a security token. // Applications can use these temporary security credentials to sign calls to // Amazon Web Services service API operations. Session Duration By default, the -// temporary security credentials created by AssumeRoleWithWebIdentity last for one -// hour. However, you can use the optional DurationSeconds parameter to specify the -// duration of your session. You can provide a value from 900 seconds (15 minutes) -// up to the maximum session duration setting for the role. This setting can have a -// value from 1 hour to 12 hours. To learn how to view the maximum value for your -// role, see View the Maximum Session Duration Setting for a Role -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// temporary security credentials created by AssumeRoleWithWebIdentity last for +// one hour. However, you can use the optional DurationSeconds parameter to +// specify the duration of your session. You can provide a value from 900 seconds +// (15 minutes) up to the maximum session duration setting for the role. This +// setting can have a value from 1 hour to 12 hours. To learn how to view the +// maximum value for your role, see View the Maximum Session Duration Setting for +// a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. The maximum session duration limit applies when you use // the AssumeRole* API operations or the assume-role* CLI commands. However the // limit does not apply when you use those operations to create a console URL. For -// more information, see Using IAM Roles -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) in the IAM -// User Guide. Permissions The temporary security credentials created by +// more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// in the IAM User Guide. Permissions The temporary security credentials created by // AssumeRoleWithWebIdentity can be used to make API calls to any Amazon Web // Services service with the following exception: you cannot call the STS // GetFederationToken or GetSessionToken API operations. (Optional) You can pass -// inline or managed session policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // to this operation. You can pass a single JSON policy document to use as an // inline session policy. You can also specify up to 10 managed policy Amazon // Resource Names (ARNs) to use as managed session policies. The plaintext that you @@ -72,17 +62,14 @@ import ( // credentials in subsequent Amazon Web Services API calls to access resources in // the account that owns the role. You cannot use session policies to grant more // permissions than those allowed by the identity-based policy of the role that is -// being assumed. For more information, see Session Policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. Tags (Optional) You can configure your IdP to pass // attributes into your web identity token as session tags. Each session tag // consists of a key name and an associated value. For more information about -// session tags, see Passing Session Tags in STS -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the -// IAM User Guide. You can pass up to 50 session tags. The plaintext session tag -// keys can’t exceed 128 characters and the values can’t exceed 256 characters. For -// these and additional limits, see IAM and STS Character Limits -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) +// session tags, see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. You can pass up to 50 session tags. The plaintext session +// tag keys can’t exceed 128 characters and the values can’t exceed 256 characters. +// For these and additional limits, see IAM and STS Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) // in the IAM User Guide. An Amazon Web Services conversion compresses the passed // inline session policy, managed policy ARNs, and session tags into a packed // binary format that has a separate limit. Your request can fail for this limit @@ -93,52 +80,38 @@ import ( // overrides the role tag with the same key. An administrator must grant you the // permissions necessary to pass session tags. The administrator can also create // granular permissions to allow you to pass only specific session tags. For more -// information, see Tutorial: Using Tags for Attribute-Based Access Control -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// information, see Tutorial: Using Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) // in the IAM User Guide. You can set the session tags as transitive. Transitive -// tags persist during role chaining. For more information, see Chaining Roles with -// Session Tags -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) +// tags persist during role chaining. For more information, see Chaining Roles +// with Session Tags (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) // in the IAM User Guide. Identities Before your application can call -// AssumeRoleWithWebIdentity, you must have an identity token from a supported +// AssumeRoleWithWebIdentity , you must have an identity token from a supported // identity provider and create a role that the application can assume. The role // that your application assumes must trust the identity provider that is // associated with the identity token. In other words, the identity provider must // be specified in the role's trust policy. Calling AssumeRoleWithWebIdentity can -// result in an entry in your CloudTrail logs. The entry includes the Subject -// (http://openid.net/specs/openid-connect-core-1_0.html#Claims) of the provided -// web identity token. We recommend that you avoid using any personally -// identifiable information (PII) in this field. For example, you could instead use -// a GUID or a pairwise identifier, as suggested in the OIDC specification -// (http://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes). For more -// information about how to use web identity federation and the +// result in an entry in your CloudTrail logs. The entry includes the Subject (http://openid.net/specs/openid-connect-core-1_0.html#Claims) +// of the provided web identity token. We recommend that you avoid using any +// personally identifiable information (PII) in this field. For example, you could +// instead use a GUID or a pairwise identifier, as suggested in the OIDC +// specification (http://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes) +// . For more information about how to use web identity federation and the // AssumeRoleWithWebIdentity API, see the following resources: -// -// * Using Web -// Identity Federation API Operations for Mobile Apps -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html) -// and Federation Through a Web-based Identity Provider -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). -// -// * -// Web Identity Federation Playground -// (https://aws.amazon.com/blogs/aws/the-aws-web-identity-federation-playground/). -// Walk through the process of authenticating through Login with Amazon, Facebook, -// or Google, getting temporary security credentials, and then using those -// credentials to make a request to Amazon Web Services. -// -// * Amazon Web Services SDK -// for iOS Developer Guide (http://aws.amazon.com/sdkforios/) and Amazon Web -// Services SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/). -// These toolkits contain sample apps that show how to invoke the identity -// providers. The toolkits then show how to use the information from these -// providers to get and use temporary security credentials. -// -// * Web Identity -// Federation with Mobile Applications -// (http://aws.amazon.com/articles/web-identity-federation-with-mobile-applications). -// This article discusses web identity federation and shows an example of how to -// use web identity federation to get access to content in Amazon S3. +// - Using Web Identity Federation API Operations for Mobile Apps (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html) +// and Federation Through a Web-based Identity Provider (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity) +// . +// - Web Identity Federation Playground (https://aws.amazon.com/blogs/aws/the-aws-web-identity-federation-playground/) +// . Walk through the process of authenticating through Login with Amazon, +// Facebook, or Google, getting temporary security credentials, and then using +// those credentials to make a request to Amazon Web Services. +// - Amazon Web Services SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) +// and Amazon Web Services SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/) +// . These toolkits contain sample apps that show how to invoke the identity +// providers. The toolkits then show how to use the information from these +// providers to get and use temporary security credentials. +// - Web Identity Federation with Mobile Applications (http://aws.amazon.com/articles/web-identity-federation-with-mobile-applications) +// . This article discusses web identity federation and shows an example of how to +// use web identity federation to get access to content in Amazon S3. func (c *Client) AssumeRoleWithWebIdentity(ctx context.Context, params *AssumeRoleWithWebIdentityInput, optFns ...func(*Options)) (*AssumeRoleWithWebIdentityOutput, error) { if params == nil { params = &AssumeRoleWithWebIdentityInput{} @@ -187,16 +160,14 @@ type AssumeRoleWithWebIdentityInput struct { // higher than this setting, the operation fails. For example, if you specify a // session duration of 12 hours, but your administrator set the maximum session // duration to 6 hours, your operation fails. To learn how to view the maximum - // value for your role, see View the Maximum Session Duration Setting for a Role - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // value for your role, see View the Maximum Session Duration Setting for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) // in the IAM User Guide. By default, the value is set to 3600 seconds. The // DurationSeconds parameter is separate from the duration of a console session // that you might request using the returned credentials. The request to the // federation endpoint for a console sign-in token takes a SessionDuration // parameter that specifies the maximum length of the console session. For more // information, see Creating a URL that Enables Federated Users to Access the - // Amazon Web Services Management Console - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // Amazon Web Services Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) // in the IAM User Guide. DurationSeconds *int32 @@ -208,8 +179,7 @@ type AssumeRoleWithWebIdentityInput struct { // access resources in the account that owns the role. You cannot use session // policies to grant more permissions than those allowed by the identity-based // policy of the role that is being assumed. For more information, see Session - // Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. The plaintext that you use for both inline and managed // session policies can't exceed 2,048 characters. The JSON policy characters can // be any ASCII character from the space character to the end of the valid @@ -227,9 +197,8 @@ type AssumeRoleWithWebIdentityInput struct { // the role. This parameter is optional. You can provide up to 10 managed policy // ARNs. However, the plaintext that you use for both inline and managed session // policies can't exceed 2,048 characters. For more information about ARNs, see - // Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces - // (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in - // the Amazon Web Services General Reference. An Amazon Web Services conversion + // Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the Amazon Web Services General Reference. An Amazon Web Services conversion // compresses the passed inline session policy, managed policy ARNs, and session // tags into a packed binary format that has a separate limit. Your request can // fail for this limit even if your plaintext meets the other requirements. The @@ -241,8 +210,7 @@ type AssumeRoleWithWebIdentityInput struct { // Services API calls to access resources in the account that owns the role. You // cannot use session policies to grant more permissions than those allowed by the // identity-based policy of the role that is being assumed. For more information, - // see Session Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. PolicyArns []types.PolicyDescriptorType @@ -265,7 +233,7 @@ type AssumeRoleWithWebIdentityOutput struct { // that you can use to refer to the resulting temporary security credentials. For // example, you can reference these credentials as a principal in a resource-based // policy by using the ARN or assumed role ID. The ARN and ID include the - // RoleSessionName that you specified when you called AssumeRole. + // RoleSessionName that you specified when you called AssumeRole . AssumedRoleUser *types.AssumedRoleUser // The intended audience (also known as client ID) of the web identity token. This @@ -285,10 +253,10 @@ type AssumeRoleWithWebIdentityOutput struct { // allowed space. PackedPolicySize *int32 - // The issuing authority of the web identity token presented. For OpenID Connect ID - // tokens, this contains the value of the iss field. For OAuth 2.0 access tokens, - // this contains the value of the ProviderId parameter that was passed in the - // AssumeRoleWithWebIdentity request. + // The issuing authority of the web identity token presented. For OpenID Connect + // ID tokens, this contains the value of the iss field. For OAuth 2.0 access + // tokens, this contains the value of the ProviderId parameter that was passed in + // the AssumeRoleWithWebIdentity request. Provider *string // The value of the source identity that is returned in the JSON web token (JWT) @@ -297,17 +265,14 @@ type AssumeRoleWithWebIdentityOutput struct { // key in a role trust policy. That way, actions that are taken with the role are // associated with that user. After the source identity is set, the value cannot be // changed. It is present in the request for all actions that are taken by the role - // and persists across chained role - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts#iam-term-role-chaining) + // and persists across chained role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts#iam-term-role-chaining) // sessions. You can configure your identity provider to use an attribute // associated with your users, like user name or email, as the source identity when - // calling AssumeRoleWithWebIdentity. You do this by adding a claim to the JSON web - // token. To learn more about OIDC tokens and claims, see Using Tokens with User - // Pools - // (https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html) + // calling AssumeRoleWithWebIdentity . You do this by adding a claim to the JSON + // web token. To learn more about OIDC tokens and claims, see Using Tokens with + // User Pools (https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html) // in the Amazon Cognito Developer Guide. For more information about using source - // identity, see Monitor and control actions taken with assumed roles - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) + // identity, see Monitor and control actions taken with assumed roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) // in the IAM User Guide. The regex used to validate this parameter is a string of // characters consisting of upper- and lower-case alphanumeric characters with no // spaces. You can also include underscores or any of the following characters: @@ -373,6 +338,9 @@ func (c *Client) addOperationAssumeRoleWithWebIdentityMiddlewares(stack *middlew if err = stack.Initialize.Add(newServiceMetadataMiddleware_opAssumeRoleWithWebIdentity(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go index b7a637d420..587d1d3c03 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go @@ -22,27 +22,17 @@ import ( // encoded because the details of the authorization status can contain privileged // information that the user who requested the operation should not see. To decode // an authorization status message, a user must be granted permissions through an -// IAM policy -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) to -// request the DecodeAuthorizationMessage (sts:DecodeAuthorizationMessage) action. -// The decoded message includes the following type of information: -// -// * Whether the -// request was denied due to an explicit deny or due to the absence of an explicit -// allow. For more information, see Determining Whether a Request is Allowed or -// Denied -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow) -// in the IAM User Guide. -// -// * The principal who made the request. -// -// * The requested -// action. -// -// * The requested resource. -// -// * The values of condition keys in the -// context of the user's request. +// IAM policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) +// to request the DecodeAuthorizationMessage ( sts:DecodeAuthorizationMessage ) +// action. The decoded message includes the following type of information: +// - Whether the request was denied due to an explicit deny or due to the +// absence of an explicit allow. For more information, see Determining Whether a +// Request is Allowed or Denied (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow) +// in the IAM User Guide. +// - The principal who made the request. +// - The requested action. +// - The requested resource. +// - The values of condition keys in the context of the user's request. func (c *Client) DecodeAuthorizationMessage(ctx context.Context, params *DecodeAuthorizationMessageInput, optFns ...func(*Options)) (*DecodeAuthorizationMessageOutput, error) { if params == nil { params = &DecodeAuthorizationMessageInput{} @@ -133,6 +123,9 @@ func (c *Client) addOperationDecodeAuthorizationMessageMiddlewares(stack *middle if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDecodeAuthorizationMessage(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go index b86a425d0a..f090ecf47a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go @@ -11,21 +11,18 @@ import ( ) // Returns the account identifier for the specified access key ID. Access keys -// consist of two parts: an access key ID (for example, AKIAIOSFODNN7EXAMPLE) and a -// secret access key (for example, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). For -// more information about access keys, see Managing Access Keys for IAM Users -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) +// consist of two parts: an access key ID (for example, AKIAIOSFODNN7EXAMPLE ) and +// a secret access key (for example, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY ). +// For more information about access keys, see Managing Access Keys for IAM Users (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) // in the IAM User Guide. When you pass an access key ID to this operation, it // returns the ID of the Amazon Web Services account to which the keys belong. // Access key IDs beginning with AKIA are long-term credentials for an IAM user or // the Amazon Web Services account root user. Access key IDs beginning with ASIA // are temporary credentials that are created using STS operations. If the account // in the response belongs to you, you can sign in as the root user and review your -// root user access keys. Then, you can pull a credentials report -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html) +// root user access keys. Then, you can pull a credentials report (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html) // to learn which IAM user owns the keys. To learn who requested the temporary -// credentials for an ASIA access key, view the STS events in your CloudTrail logs -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html) +// credentials for an ASIA access key, view the STS events in your CloudTrail logs (https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html) // in the IAM User Guide. This operation does not indicate the state of the access // key. The key might be active, inactive, or deleted. Active keys might not have // permissions to perform an operation. Providing a deleted access key might return @@ -119,6 +116,9 @@ func (c *Client) addOperationGetAccessKeyInfoMiddlewares(stack *middleware.Stack if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAccessKeyInfo(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go index a7f96c2201..93823927b1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go @@ -12,12 +12,11 @@ import ( // Returns details about the IAM user or role whose credentials are used to call // the operation. No permissions are required to perform this operation. If an -// administrator adds a policy to your IAM user or role that explicitly denies -// access to the sts:GetCallerIdentity action, you can still perform this -// operation. Permissions are not required because the same information is returned -// when an IAM user or role is denied access. To view an example response, see I Am -// Not Authorized to Perform: iam:DeleteVirtualMFADevice -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_access-denied-delete-mfa) +// administrator attaches a policy to your identity that explicitly denies access +// to the sts:GetCallerIdentity action, you can still perform this operation. +// Permissions are not required because the same information is returned when +// access is denied. To view an example response, see I Am Not Authorized to +// Perform: iam:DeleteVirtualMFADevice (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_access-denied-delete-mfa) // in the IAM User Guide. func (c *Client) GetCallerIdentity(ctx context.Context, params *GetCallerIdentityInput, optFns ...func(*Options)) (*GetCallerIdentityOutput, error) { if params == nil { @@ -49,10 +48,9 @@ type GetCallerIdentityOutput struct { // The Amazon Web Services ARN associated with the calling entity. Arn *string - // The unique identifier of the calling entity. The exact value depends on the type - // of entity that is making the call. The values returned are those listed in the - // aws:userid column in the Principal table - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable) + // The unique identifier of the calling entity. The exact value depends on the + // type of entity that is making the call. The values returned are those listed in + // the aws:userid column in the Principal table (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable) // found on the Policy Variables reference page in the IAM User Guide. UserId *string @@ -110,6 +108,9 @@ func (c *Client) addOperationGetCallerIdentityMiddlewares(stack *middleware.Stac if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetCallerIdentity(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go index 60026a1393..ccb7366e26 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go @@ -11,49 +11,40 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Returns a set of temporary security credentials (consisting of an access key ID, -// a secret access key, and a security token) for a federated user. A typical use -// is in a proxy application that gets temporary security credentials on behalf of +// Returns a set of temporary security credentials (consisting of an access key +// ID, a secret access key, and a security token) for a user. A typical use is in a +// proxy application that gets temporary security credentials on behalf of // distributed applications inside a corporate network. You must call the // GetFederationToken operation using the long-term security credentials of an IAM // user. As a result, this call is appropriate in contexts where those credentials -// can be safely stored, usually in a server-based application. For a comparison of +// can be safeguarded, usually in a server-based application. For a comparison of // GetFederationToken with the other API operations that produce temporary -// credentials, see Requesting Temporary Security Credentials -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the Amazon Web Services STS API operations -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// credentials, see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the Amazon Web Services STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// in the IAM User Guide. Although it is possible to call GetFederationToken using +// the security credentials of an Amazon Web Services account root user rather than +// an IAM user that you create for the purpose of a proxy application, we do not +// recommend it. For more information, see Safeguard your root user credentials +// and don't use them for everyday tasks (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#lock-away-credentials) // in the IAM User Guide. You can create a mobile-based or browser-based app that // can authenticate users using a web identity provider like Login with Amazon, // Facebook, Google, or an OpenID Connect-compatible identity provider. In this // case, we recommend that you use Amazon Cognito (http://aws.amazon.com/cognito/) -// or AssumeRoleWithWebIdentity. For more information, see Federation Through a -// Web-based Identity Provider -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity) -// in the IAM User Guide. You can also call GetFederationToken using the security -// credentials of an Amazon Web Services account root user, but we do not recommend -// it. Instead, we recommend that you create an IAM user for the purpose of the -// proxy application. Then attach a policy to the IAM user that limits federated -// users to only the actions and resources that they need to access. For more -// information, see IAM Best Practices -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) in the -// IAM User Guide. Session duration The temporary credentials are valid for the -// specified duration, from 900 seconds (15 minutes) up to a maximum of 129,600 +// or AssumeRoleWithWebIdentity . For more information, see Federation Through a +// Web-based Identity Provider (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity) +// in the IAM User Guide. Session duration The temporary credentials are valid for +// the specified duration, from 900 seconds (15 minutes) up to a maximum of 129,600 // seconds (36 hours). The default session duration is 43,200 seconds (12 hours). -// Temporary credentials obtained by using the Amazon Web Services account root -// user credentials have a maximum duration of 3,600 seconds (1 hour). Permissions -// You can use the temporary credentials created by GetFederationToken in any -// Amazon Web Services service except the following: +// Temporary credentials obtained by using the root user credentials have a maximum +// duration of 3,600 seconds (1 hour). Permissions You can use the temporary +// credentials created by GetFederationToken in any Amazon Web Services service +// with the following exceptions: +// - You cannot call any IAM operations using the CLI or the Amazon Web Services +// API. This limitation does not apply to console sessions. +// - You cannot call any STS operations except GetCallerIdentity . // -// * You cannot call any IAM -// operations using the CLI or the Amazon Web Services API. -// -// * You cannot call any -// STS operations except GetCallerIdentity. -// -// You must pass an inline or managed -// session policy -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// You can use temporary credentials for single sign-on (SSO) to the console. You +// must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // to this operation. You can pass a single JSON policy document to use as an // inline session policy. You can also specify up to 10 managed policy Amazon // Resource Names (ARNs) to use as managed session policies. The plaintext that you @@ -64,38 +55,33 @@ import ( // policies and the session policies that you pass. This gives you a way to further // restrict the permissions for a federated user. You cannot use session policies // to grant more permissions than those that are defined in the permissions policy -// of the IAM user. For more information, see Session Policies -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// of the IAM user. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. For information about using GetFederationToken to create // temporary security credentials, see GetFederationToken—Federation Through a -// Custom Identity Broker -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getfederationtoken). -// You can use the credentials to access a resource that has a resource-based +// Custom Identity Broker (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getfederationtoken) +// . You can use the credentials to access a resource that has a resource-based // policy. If that policy specifically references the federated user session in the // Principal element of the policy, the session has the permissions allowed by the // policy. These permissions are granted in addition to the permissions granted by // the session policies. Tags (Optional) You can pass tag key-value pairs to your // session. These are called session tags. For more information about session tags, -// see Passing Session Tags in STS -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the -// IAM User Guide. You can create a mobile-based or browser-based app that can -// authenticate users using a web identity provider like Login with Amazon, +// see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. You can create a mobile-based or browser-based app that +// can authenticate users using a web identity provider like Login with Amazon, // Facebook, Google, or an OpenID Connect-compatible identity provider. In this // case, we recommend that you use Amazon Cognito (http://aws.amazon.com/cognito/) -// or AssumeRoleWithWebIdentity. For more information, see Federation Through a -// Web-based Identity Provider -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity) +// or AssumeRoleWithWebIdentity . For more information, see Federation Through a +// Web-based Identity Provider (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity) // in the IAM User Guide. An administrator must grant you the permissions necessary // to pass session tags. The administrator can also create granular permissions to // allow you to pass only specific session tags. For more information, see -// Tutorial: Using Tags for Attribute-Based Access Control -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) +// Tutorial: Using Tags for Attribute-Based Access Control (https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) // in the IAM User Guide. Tag key–value pairs are not case sensitive, but case is // preserved. This means that you cannot have separate Department and department -// tag keys. Assume that the user that you are federating has the -// Department=Marketing tag and you pass the department=engineering session tag. -// Department and department are not saved as separate tags, and the session tag -// passed in the request takes precedence over the user tag. +// tag keys. Assume that the user that you are federating has the Department = +// Marketing tag and you pass the department = engineering session tag. Department +// and department are not saved as separate tags, and the session tag passed in +// the request takes precedence over the user tag. func (c *Client) GetFederationToken(ctx context.Context, params *GetFederationTokenInput, optFns ...func(*Options)) (*GetFederationTokenOutput, error) { if params == nil { params = &GetFederationTokenInput{} @@ -114,26 +100,26 @@ func (c *Client) GetFederationToken(ctx context.Context, params *GetFederationTo type GetFederationTokenInput struct { // The name of the federated user. The name is used as an identifier for the - // temporary security credentials (such as Bob). For example, you can reference the - // federated user name in a resource-based policy, such as in an Amazon S3 bucket - // policy. The regex used to validate this parameter is a string of characters - // consisting of upper- and lower-case alphanumeric characters with no spaces. You - // can also include underscores or any of the following characters: =,.@- + // temporary security credentials (such as Bob ). For example, you can reference + // the federated user name in a resource-based policy, such as in an Amazon S3 + // bucket policy. The regex used to validate this parameter is a string of + // characters consisting of upper- and lower-case alphanumeric characters with no + // spaces. You can also include underscores or any of the following characters: + // =,.@- // // This member is required. Name *string - // The duration, in seconds, that the session should last. Acceptable durations for - // federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 - // hours), with 43,200 seconds (12 hours) as the default. Sessions obtained using - // Amazon Web Services account root user credentials are restricted to a maximum of - // 3,600 seconds (one hour). If the specified duration is longer than one hour, the - // session obtained by using root user credentials defaults to one hour. + // The duration, in seconds, that the session should last. Acceptable durations + // for federation sessions range from 900 seconds (15 minutes) to 129,600 seconds + // (36 hours), with 43,200 seconds (12 hours) as the default. Sessions obtained + // using root user credentials are restricted to a maximum of 3,600 seconds (one + // hour). If the specified duration is longer than one hour, the session obtained + // by using root user credentials defaults to one hour. DurationSeconds *int32 // An IAM policy in JSON format that you want to use as an inline session policy. - // You must pass an inline or managed session policy - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // to this operation. You can pass a single JSON policy document to use as an // inline session policy. You can also specify up to 10 managed policy Amazon // Resource Names (ARNs) to use as managed session policies. This parameter is @@ -143,8 +129,7 @@ type GetFederationTokenInput struct { // session policies that you pass. This gives you a way to further restrict the // permissions for a federated user. You cannot use session policies to grant more // permissions than those that are defined in the permissions policy of the IAM - // user. For more information, see Session Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // user. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. The resulting credentials can be used to access a // resource that has a resource-based policy. If that policy specifically // references the federated user session in the Principal element of the policy, @@ -165,24 +150,21 @@ type GetFederationTokenInput struct { // The Amazon Resource Names (ARNs) of the IAM managed policies that you want to // use as a managed session policy. The policies must exist in the same account as // the IAM user that is requesting federated access. You must pass an inline or - // managed session policy - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // to this operation. You can pass a single JSON policy document to use as an // inline session policy. You can also specify up to 10 managed policy Amazon // Resource Names (ARNs) to use as managed session policies. The plaintext that you // use for both inline and managed session policies can't exceed 2,048 characters. // You can provide up to 10 managed policy ARNs. For more information about ARNs, - // see Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces - // (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in - // the Amazon Web Services General Reference. This parameter is optional. However, - // if you do not pass any session policies, then the resulting federated user - // session has no permissions. When you pass session policies, the session + // see Amazon Resource Names (ARNs) and Amazon Web Services Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the Amazon Web Services General Reference. This parameter is optional. + // However, if you do not pass any session policies, then the resulting federated + // user session has no permissions. When you pass session policies, the session // permissions are the intersection of the IAM user policies and the session // policies that you pass. This gives you a way to further restrict the permissions // for a federated user. You cannot use session policies to grant more permissions // than those that are defined in the permissions policy of the IAM user. For more - // information, see Session Policies - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. The resulting credentials can be used to access a // resource that has a resource-based policy. If that policy specifically // references the federated user session in the Principal element of the policy, @@ -191,20 +173,18 @@ type GetFederationTokenInput struct { // An Amazon Web Services conversion compresses the passed inline session policy, // managed policy ARNs, and session tags into a packed binary format that has a // separate limit. Your request can fail for this limit even if your plaintext - // meets the other requirements. The PackedPolicySize response element indicates by - // percentage how close the policies and tags for your request are to the upper + // meets the other requirements. The PackedPolicySize response element indicates + // by percentage how close the policies and tags for your request are to the upper // size limit. PolicyArns []types.PolicyDescriptorType // A list of session tags. Each session tag consists of a key name and an // associated value. For more information about session tags, see Passing Session - // Tags in STS - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the - // IAM User Guide. This parameter is optional. You can pass up to 50 session tags. - // The plaintext session tag keys can’t exceed 128 characters and the values can’t - // exceed 256 characters. For these and additional limits, see IAM and STS - // Character Limits - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) + // in the IAM User Guide. This parameter is optional. You can pass up to 50 session + // tags. The plaintext session tag keys can’t exceed 128 characters and the values + // can’t exceed 256 characters. For these and additional limits, see IAM and STS + // Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) // in the IAM User Guide. An Amazon Web Services conversion compresses the passed // inline session policy, managed policy ARNs, and session tags into a packed // binary format that has a separate limit. Your request can fail for this limit @@ -215,9 +195,9 @@ type GetFederationTokenInput struct { // you do, session tags override a user tag with the same key. Tag key–value pairs // are not case sensitive, but case is preserved. This means that you cannot have // separate Department and department tag keys. Assume that the role has the - // Department=Marketing tag and you pass the department=engineering session tag. - // Department and department are not saved as separate tags, and the session tag - // passed in the request takes precedence over the role tag. + // Department = Marketing tag and you pass the department = engineering session + // tag. Department and department are not saved as separate tags, and the session + // tag passed in the request takes precedence over the role tag. Tags []types.Tag noSmithyDocumentSerde @@ -235,7 +215,7 @@ type GetFederationTokenOutput struct { Credentials *types.Credentials // Identifiers for the federated user associated with the credentials (such as - // arn:aws:sts::123456789012:federated-user/Bob or 123456789012:Bob). You can use + // arn:aws:sts::123456789012:federated-user/Bob or 123456789012:Bob ). You can use // the federated user's ARN in your resource-based policies, such as an Amazon S3 // bucket policy. FederatedUser *types.FederatedUser @@ -303,6 +283,9 @@ func (c *Client) addOperationGetFederationTokenMiddlewares(stack *middleware.Sta if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetFederationToken(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go index bfde51689d..4dfac4c982 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go @@ -11,59 +11,46 @@ import ( smithyhttp "github.com/aws/smithy-go/transport/http" ) -// Returns a set of temporary credentials for an Amazon Web Services account or IAM -// user. The credentials consist of an access key ID, a secret access key, and a -// security token. Typically, you use GetSessionToken if you want to use MFA to +// Returns a set of temporary credentials for an Amazon Web Services account or +// IAM user. The credentials consist of an access key ID, a secret access key, and +// a security token. Typically, you use GetSessionToken if you want to use MFA to // protect programmatic calls to specific Amazon Web Services API operations like -// Amazon EC2 StopInstances. MFA-enabled IAM users would need to call -// GetSessionToken and submit an MFA code that is associated with their MFA device. -// Using the temporary security credentials that are returned from the call, IAM -// users can then make programmatic calls to API operations that require MFA -// authentication. If you do not supply a correct MFA code, then the API returns an -// access denied error. For a comparison of GetSessionToken with the other API -// operations that produce temporary credentials, see Requesting Temporary Security -// Credentials -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the Amazon Web Services STS API operations -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// Amazon EC2 StopInstances . MFA-enabled IAM users must call GetSessionToken and +// submit an MFA code that is associated with their MFA device. Using the temporary +// security credentials that the call returns, IAM users can then make programmatic +// calls to API operations that require MFA authentication. An incorrect MFA code +// causes the API to return an access denied error. For a comparison of +// GetSessionToken with the other API operations that produce temporary +// credentials, see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the Amazon Web Services STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) // in the IAM User Guide. No permissions are required for users to perform this // operation. The purpose of the sts:GetSessionToken operation is to authenticate // the user using MFA. You cannot use policies to control authentication -// operations. For more information, see Permissions for GetSessionToken -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_getsessiontoken.html) +// operations. For more information, see Permissions for GetSessionToken (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_getsessiontoken.html) // in the IAM User Guide. Session Duration The GetSessionToken operation must be -// called by using the long-term Amazon Web Services security credentials of the -// Amazon Web Services account root user or an IAM user. Credentials that are -// created by IAM users are valid for the duration that you specify. This duration -// can range from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 -// hours), with a default of 43,200 seconds (12 hours). Credentials based on -// account credentials can range from 900 seconds (15 minutes) up to 3,600 seconds -// (1 hour), with a default of 1 hour. Permissions The temporary security -// credentials created by GetSessionToken can be used to make API calls to any -// Amazon Web Services service with the following exceptions: +// called by using the long-term Amazon Web Services security credentials of an IAM +// user. Credentials that are created by IAM users are valid for the duration that +// you specify. This duration can range from 900 seconds (15 minutes) up to a +// maximum of 129,600 seconds (36 hours), with a default of 43,200 seconds (12 +// hours). Credentials based on account credentials can range from 900 seconds (15 +// minutes) up to 3,600 seconds (1 hour), with a default of 1 hour. Permissions The +// temporary security credentials created by GetSessionToken can be used to make +// API calls to any Amazon Web Services service with the following exceptions: +// - You cannot call any IAM API operations unless MFA authentication +// information is included in the request. +// - You cannot call any STS API except AssumeRole or GetCallerIdentity . // -// * You cannot call -// any IAM API operations unless MFA authentication information is included in the -// request. -// -// * You cannot call any STS API except AssumeRole or -// GetCallerIdentity. -// -// We recommend that you do not call GetSessionToken with -// Amazon Web Services account root user credentials. Instead, follow our best -// practices -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#create-iam-users) -// by creating one or more IAM users, giving them the necessary permissions, and -// using IAM users for everyday interaction with Amazon Web Services. The -// credentials that are returned by GetSessionToken are based on permissions -// associated with the user whose credentials were used to call the operation. If -// GetSessionToken is called using Amazon Web Services account root user -// credentials, the temporary credentials have root user permissions. Similarly, if -// GetSessionToken is called using the credentials of an IAM user, the temporary -// credentials have the same permissions as the IAM user. For more information -// about using GetSessionToken to create temporary credentials, go to Temporary -// Credentials for Users in Untrusted Environments -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken) +// The credentials that GetSessionToken returns are based on permissions +// associated with the IAM user whose credentials were used to call the operation. +// The temporary credentials have the same permissions as the IAM user. Although it +// is possible to call GetSessionToken using the security credentials of an Amazon +// Web Services account root user rather than an IAM user, we do not recommend it. +// If GetSessionToken is called using root user credentials, the temporary +// credentials have root user permissions. For more information, see Safeguard +// your root user credentials and don't use them for everyday tasks (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#lock-away-credentials) +// in the IAM User Guide For more information about using GetSessionToken to +// create temporary credentials, see Temporary Credentials for Users in Untrusted +// Environments (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken) // in the IAM User Guide. func (c *Client) GetSessionToken(ctx context.Context, params *GetSessionTokenInput, optFns ...func(*Options)) (*GetSessionTokenOutput, error) { if params == nil { @@ -90,25 +77,25 @@ type GetSessionTokenInput struct { // Services account owners defaults to one hour. DurationSeconds *int32 - // The identification number of the MFA device that is associated with the IAM user - // who is making the GetSessionToken call. Specify this value if the IAM user has a - // policy that requires MFA authentication. The value is either the serial number - // for a hardware device (such as GAHT12345678) or an Amazon Resource Name (ARN) - // for a virtual device (such as arn:aws:iam::123456789012:mfa/user). You can find - // the device for an IAM user by going to the Amazon Web Services Management - // Console and viewing the user's security credentials. The regex used to validate - // this parameter is a string of characters consisting of upper- and lower-case - // alphanumeric characters with no spaces. You can also include underscores or any - // of the following characters: =,.@:/- + // The identification number of the MFA device that is associated with the IAM + // user who is making the GetSessionToken call. Specify this value if the IAM user + // has a policy that requires MFA authentication. The value is either the serial + // number for a hardware device (such as GAHT12345678 ) or an Amazon Resource Name + // (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user ). You + // can find the device for an IAM user by going to the Amazon Web Services + // Management Console and viewing the user's security credentials. The regex used + // to validate this parameter is a string of characters consisting of upper- and + // lower-case alphanumeric characters with no spaces. You can also include + // underscores or any of the following characters: =,.@:/- SerialNumber *string - // The value provided by the MFA device, if MFA is required. If any policy requires - // the IAM user to submit an MFA code, specify this value. If MFA authentication is - // required, the user must provide a code when requesting a set of temporary - // security credentials. A user who fails to provide the code receives an "access - // denied" response when requesting resources that require MFA authentication. The - // format for this parameter, as described by its regex pattern, is a sequence of - // six numeric digits. + // The value provided by the MFA device, if MFA is required. If any policy + // requires the IAM user to submit an MFA code, specify this value. If MFA + // authentication is required, the user must provide a code when requesting a set + // of temporary security credentials. A user who fails to provide the code receives + // an "access denied" response when requesting resources that require MFA + // authentication. The format for this parameter, as described by its regex + // pattern, is a sequence of six numeric digits. TokenCode *string noSmithyDocumentSerde @@ -179,6 +166,9 @@ func (c *Client) addOperationGetSessionTokenMiddlewares(stack *middleware.Stack, if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetSessionToken(options.Region), middleware.Before); err != nil { return err } + if err = awsmiddleware.AddRecursionDetection(stack); err != nil { + return err + } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/doc.go index 7cabbb97e9..d963fd8d19 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/doc.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/doc.go @@ -4,9 +4,8 @@ // Security Token Service. // // Security Token Service Security Token Service (STS) enables you to request -// temporary, limited-privilege credentials for Identity and Access Management -// (IAM) users or for users that you authenticate (federated users). This guide -// provides descriptions of the STS API. For more information about using this -// service, see Temporary Security Credentials -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html). +// temporary, limited-privilege credentials for users. This guide provides +// descriptions of the STS API. For more information about using this service, see +// Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) +// . package sts diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go index 680eb92e54..f88dca99c2 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go @@ -3,4 +3,4 @@ package sts // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.1" +const goModuleVersion = "1.19.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go index 1f99a0209c..0413fd89ab 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go @@ -89,6 +89,8 @@ var partitionRegexp = struct { AwsCn *regexp.Regexp AwsIso *regexp.Regexp AwsIsoB *regexp.Regexp + AwsIsoE *regexp.Regexp + AwsIsoF *regexp.Regexp AwsUsGov *regexp.Regexp }{ @@ -96,6 +98,8 @@ var partitionRegexp = struct { AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), + AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), + AwsIsoF: regexp.MustCompile("^us\\-isof\\-\\w+\\-\\d+$"), AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), } @@ -384,6 +388,48 @@ var defaultPartitions = endpoints.Partitions{ }: endpoints.Endpoint{}, }, }, + { + ID: "aws-iso-e", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "sts-fips.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "sts.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoE, + IsRegionalized: true, + }, + { + ID: "aws-iso-f", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "sts-fips.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "sts.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoF, + IsRegionalized: true, + }, { ID: "aws-us-gov", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go index 05531d3695..eb60f61b16 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go @@ -523,9 +523,6 @@ func (m *awsAwsquery_serializeOpGetSessionToken) HandleSerialize(ctx context.Con return next.HandleSerialize(ctx, in) } func awsAwsquery_serializeDocumentPolicyDescriptorListType(v []types.PolicyDescriptorType, value query.Value) error { - if len(v) == 0 { - return nil - } array := value.Array("member") for i := range v { @@ -567,9 +564,6 @@ func awsAwsquery_serializeDocumentTag(v *types.Tag, value query.Value) error { } func awsAwsquery_serializeDocumentTagKeyListType(v []string, value query.Value) error { - if len(v) == 0 { - return nil - } array := value.Array("member") for i := range v { @@ -580,9 +574,6 @@ func awsAwsquery_serializeDocumentTagKeyListType(v []string, value query.Value) } func awsAwsquery_serializeDocumentTagListType(v []types.Tag, value query.Value) error { - if len(v) == 0 { - return nil - } array := value.Array("member") for i := range v { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go index 88d3e6c693..097875b279 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go @@ -27,7 +27,7 @@ func (e *ExpiredTokenException) ErrorMessage() string { return *e.Message } func (e *ExpiredTokenException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "ExpiredTokenException" } return *e.ErrorCodeOverride @@ -57,7 +57,7 @@ func (e *IDPCommunicationErrorException) ErrorMessage() string { return *e.Message } func (e *IDPCommunicationErrorException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "IDPCommunicationError" } return *e.ErrorCodeOverride @@ -86,7 +86,7 @@ func (e *IDPRejectedClaimException) ErrorMessage() string { return *e.Message } func (e *IDPRejectedClaimException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "IDPRejectedClaim" } return *e.ErrorCodeOverride @@ -114,7 +114,7 @@ func (e *InvalidAuthorizationMessageException) ErrorMessage() string { return *e.Message } func (e *InvalidAuthorizationMessageException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidAuthorizationMessageException" } return *e.ErrorCodeOverride @@ -144,7 +144,7 @@ func (e *InvalidIdentityTokenException) ErrorMessage() string { return *e.Message } func (e *InvalidIdentityTokenException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "InvalidIdentityToken" } return *e.ErrorCodeOverride @@ -171,7 +171,7 @@ func (e *MalformedPolicyDocumentException) ErrorMessage() string { return *e.Message } func (e *MalformedPolicyDocumentException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "MalformedPolicyDocument" } return *e.ErrorCodeOverride @@ -183,12 +183,10 @@ func (e *MalformedPolicyDocumentException) ErrorFault() smithy.ErrorFault { retu // compresses the session policy document, session policy ARNs, and session tags // into a packed binary format that has a separate limit. The error message // indicates by percentage how close the policies and tags are to the upper size -// limit. For more information, see Passing Session Tags in STS -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the -// IAM User Guide. You could receive this error even though you meet other defined -// session policy and session tag limits. For more information, see IAM and STS -// Entity Character Limits -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-limits-entity-length) +// limit. For more information, see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. You could receive this error even though you meet other +// defined session policy and session tag limits. For more information, see IAM +// and STS Entity Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-limits-entity-length) // in the IAM User Guide. type PackedPolicyTooLargeException struct { Message *string @@ -208,18 +206,17 @@ func (e *PackedPolicyTooLargeException) ErrorMessage() string { return *e.Message } func (e *PackedPolicyTooLargeException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "PackedPolicyTooLarge" } return *e.ErrorCodeOverride } func (e *PackedPolicyTooLargeException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } -// STS is not activated in the requested region for the account that is being asked -// to generate credentials. The account administrator must use the IAM console to -// activate STS in that region. For more information, see Activating and -// Deactivating Amazon Web Services STS in an Amazon Web Services Region -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// STS is not activated in the requested region for the account that is being +// asked to generate credentials. The account administrator must use the IAM +// console to activate STS in that region. For more information, see Activating +// and Deactivating Amazon Web Services STS in an Amazon Web Services Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) // in the IAM User Guide. type RegionDisabledException struct { Message *string @@ -239,7 +236,7 @@ func (e *RegionDisabledException) ErrorMessage() string { return *e.Message } func (e *RegionDisabledException) ErrorCode() string { - if e.ErrorCodeOverride == nil { + if e == nil || e.ErrorCodeOverride == nil { return "RegionDisabledException" } return *e.ErrorCodeOverride diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/types.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/types.go index 86e509905b..90d4f62ae9 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/types.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/types.go @@ -13,9 +13,8 @@ type AssumedRoleUser struct { // The ARN of the temporary security credentials that are returned from the // AssumeRole action. For more information about ARNs and how to use them in - // policies, see IAM Identifiers - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) in - // the IAM User Guide. + // policies, see IAM Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) + // in the IAM User Guide. // // This member is required. Arn *string @@ -62,9 +61,8 @@ type FederatedUser struct { // The ARN that specifies the federated user that is associated with the // credentials. For more information about ARNs and how to use them in policies, - // see IAM Identifiers - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) in - // the IAM User Guide. + // see IAM Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) + // in the IAM User Guide. // // This member is required. Arn *string @@ -84,26 +82,23 @@ type PolicyDescriptorType struct { // The Amazon Resource Name (ARN) of the IAM managed policy to use as a session // policy for the role. For more information about ARNs, see Amazon Resource Names - // (ARNs) and Amazon Web Services Service Namespaces - // (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in - // the Amazon Web Services General Reference. + // (ARNs) and Amazon Web Services Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // in the Amazon Web Services General Reference. Arn *string noSmithyDocumentSerde } -// You can pass custom key-value pair attributes when you assume a role or federate -// a user. These are called session tags. You can then use the session tags to -// control access to resources. For more information, see Tagging Amazon Web -// Services STS Sessions -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the -// IAM User Guide. +// You can pass custom key-value pair attributes when you assume a role or +// federate a user. These are called session tags. You can then use the session +// tags to control access to resources. For more information, see Tagging Amazon +// Web Services STS Sessions (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) +// in the IAM User Guide. type Tag struct { // The key for a session tag. You can pass up to 50 session tags. The plain text // session tag keys can’t exceed 128 characters. For these and additional limits, - // see IAM and STS Character Limits - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // see IAM and STS Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) // in the IAM User Guide. // // This member is required. @@ -111,8 +106,7 @@ type Tag struct { // The value for a session tag. You can pass up to 50 session tags. The plain text // session tag values can’t exceed 256 characters. For these and additional limits, - // see IAM and STS Character Limits - // (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) + // see IAM and STS Character Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length) // in the IAM User Guide. // // This member is required. diff --git a/vendor/github.com/buildpacks/imgutil/Makefile b/vendor/github.com/buildpacks/imgutil/Makefile index 91b09f818f..c94ffc90e2 100644 --- a/vendor/github.com/buildpacks/imgutil/Makefile +++ b/vendor/github.com/buildpacks/imgutil/Makefile @@ -42,4 +42,4 @@ test: layer/bcdhive_generated.go format lint $(GOCMD) test -parallel=1 -count=1 -v ./... tidy: - $(GOCMD) mod tidy && cd tools && $(GOCMD) mod tidy -compat=1.17 && cd bcdhive_generator && $(GOCMD) mod tidy \ No newline at end of file + $(GOCMD) mod tidy && cd tools && $(GOCMD) mod tidy -compat=1.17 && cd bcdhive_generator && $(GOCMD) mod tidy diff --git a/vendor/github.com/buildpacks/imgutil/image.go b/vendor/github.com/buildpacks/imgutil/image.go index db0255a0e4..c0d4b796a4 100644 --- a/vendor/github.com/buildpacks/imgutil/image.go +++ b/vendor/github.com/buildpacks/imgutil/image.go @@ -5,78 +5,227 @@ import ( "io" "strings" "time" -) - -var NormalizedDateTime = time.Date(1980, time.January, 1, 0, 0, 1, 0, time.UTC) - -type SaveDiagnostic struct { - ImageName string - Cause error -} - -type SaveError struct { - Errors []SaveDiagnostic -} - -func (e SaveError) Error() string { - var errors []string - for _, d := range e.Errors { - errors = append(errors, fmt.Sprintf("[%s: %s]", d.ImageName, d.Cause.Error())) - } - return fmt.Sprintf("failed to write image to the following tags: %s", strings.Join(errors, ",")) -} -// Platform represents the target arch/os/os_version for an image construction and querying. -type Platform struct { - Architecture string - OS string - OSVersion string -} + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/empty" + "github.com/google/go-containerregistry/pkg/v1/mutate" + "github.com/google/go-containerregistry/pkg/v1/types" +) type Image interface { - Name() string - Rename(name string) + // getters + + Architecture() (string, error) + CreatedAt() (time.Time, error) + Entrypoint() ([]string, error) + Env(key string) (string, error) + // Found tells whether the image exists in the repository by `Name()`. + Found() bool + // Valid returns true if the image is well-formed (e.g. all manifest layers exist on the registry). + Valid() bool + GetAnnotateRefName() (string, error) + // GetLayer retrieves layer by diff id. Returns a reader of the uncompressed contents of the layer. + GetLayer(diffID string) (io.ReadCloser, error) + History() ([]v1.History, error) + Identifier() (Identifier, error) Label(string) (string, error) Labels() (map[string]string, error) - SetLabel(string, string) error - RemoveLabel(string) error - Env(key string) (string, error) + // ManifestSize returns the size of the manifest. If a manifest doesn't exist, it returns 0. + ManifestSize() (int64, error) + Name() string + OS() (string, error) + OSVersion() (string, error) + // TopLayer returns the diff id for the top layer + TopLayer() (string, error) + Variant() (string, error) WorkingDir() (string, error) - Entrypoint() ([]string, error) - SetEnv(string, string) error - SetEntrypoint(...string) error - SetWorkingDir(string) error + + // setters + + // AnnotateRefName set a value for the `org.opencontainers.image.ref.name` annotation + AnnotateRefName(refName string) error + Rename(name string) + SetArchitecture(string) error SetCmd(...string) error + SetEntrypoint(...string) error + SetEnv(string, string) error + SetHistory([]v1.History) error + SetLabel(string, string) error SetOS(string) error SetOSVersion(string) error - SetArchitecture(string) error - Rebase(string, Image) error + SetVariant(string) error + SetWorkingDir(string) error + + // modifiers + AddLayer(path string) error AddLayerWithDiffID(path, diffID string) error + AddLayerWithDiffIDAndHistory(path, diffID string, history v1.History) error + Delete() error + Rebase(string, Image) error + RemoveLabel(string) error ReuseLayer(diffID string) error - // TopLayer returns the diff id for the top layer - TopLayer() (string, error) + ReuseLayerWithHistory(diffID string, history v1.History) error // Save saves the image as `Name()` and any additional names provided to this method. Save(additionalNames ...string) error // SaveAs ignores the image `Name()` method and saves the image according to name & additional names provided to this method SaveAs(name string, additionalNames ...string) error // SaveFile saves the image as a docker archive and provides the filesystem location SaveFile() (string, error) - // Found tells whether the image exists in the repository by `Name()`. - Found() bool - // GetLayer retrieves layer by diff id. Returns a reader of the uncompressed contents of the layer. - GetLayer(diffID string) (io.ReadCloser, error) - Delete() error - CreatedAt() (time.Time, error) - Identifier() (Identifier, error) - OS() (string, error) - OSVersion() (string, error) - Architecture() (string, error) - // ManifestSize returns the size of the manifest. If a manifest doesn't exist, it returns 0. - ManifestSize() (int64, error) - // AnnotateRefName set a value for the `org.opencontainers.image.ref.name` annotation - AnnotateRefName(refName string) error - GetAnnotateRefName() (string, error) } type Identifier fmt.Stringer + +// Platform represents the target arch/os/os_version for an image construction and querying. +type Platform struct { + Architecture string + OS string + OSVersion string +} + +type MediaTypes int + +const ( + MissingTypes MediaTypes = iota + DefaultTypes + OCITypes + DockerTypes +) + +func (t MediaTypes) ManifestType() types.MediaType { + switch t { + case OCITypes: + return types.OCIManifestSchema1 + case DockerTypes: + return types.DockerManifestSchema2 + default: + return "" + } +} + +func (t MediaTypes) ConfigType() types.MediaType { + switch t { + case OCITypes: + return types.OCIConfigJSON + case DockerTypes: + return types.DockerConfigJSON + default: + return "" + } +} + +func (t MediaTypes) LayerType() types.MediaType { + switch t { + case OCITypes: + return types.OCILayer + case DockerTypes: + return types.DockerLayer + default: + return "" + } +} + +// OverrideMediaTypes mutates the provided v1.Image to use the desired media types +// in the image manifest and config files (including the layers referenced in the manifest) +func OverrideMediaTypes(image v1.Image, mediaTypes MediaTypes) (v1.Image, error) { + if mediaTypes == DefaultTypes || mediaTypes == MissingTypes { + // without media types option, default to original media types + return image, nil + } + + // manifest media type + retImage := mutate.MediaType(empty.Image, mediaTypes.ManifestType()) + + // update empty image with image config + config, err := image.ConfigFile() + if err != nil { + return nil, err + } + history := config.History + // zero out diff IDs and history, as these will be updated when we call `mutate.Append` + config.RootFS.DiffIDs = make([]v1.Hash, 0) + config.History = []v1.History{} + retImage, err = mutate.ConfigFile(retImage, config) + if err != nil { + return nil, err + } + + // config media type + retImage = mutate.ConfigMediaType(retImage, mediaTypes.ConfigType()) + + // layers media type + layers, err := image.Layers() + if err != nil { + return nil, err + } + additions := layersAddendum(layers, history, mediaTypes.LayerType()) + retImage, err = mutate.Append(retImage, additions...) + if err != nil { + return nil, err + } + + return retImage, nil +} + +// OverrideHistoryIfNeeded zeroes out the history if the number of history entries doesn't match the number of layers. +func OverrideHistoryIfNeeded(image v1.Image) (v1.Image, error) { + configFile, err := image.ConfigFile() + if err != nil || configFile == nil { + return nil, fmt.Errorf("getting image config: %w", err) + } + configFile.History = NormalizedHistory(configFile.History, len(configFile.RootFS.DiffIDs)) + return mutate.ConfigFile(image, configFile) +} + +func NormalizedHistory(history []v1.History, nLayers int) []v1.History { + if history == nil { + return make([]v1.History, nLayers) + } + // ensure we remove history for empty layers + var nHistory []v1.History + for _, h := range history { + if !h.EmptyLayer { + nHistory = append(nHistory, h) + } + } + if len(nHistory) == nLayers { + return nHistory + } + return make([]v1.History, nLayers) +} + +// layersAddendum creates an Addendum array with the given layers +// and the desired media type +func layersAddendum(layers []v1.Layer, history []v1.History, mediaType types.MediaType) []mutate.Addendum { + additions := make([]mutate.Addendum, 0) + if len(history) != len(layers) { + history = make([]v1.History, len(layers)) + } + for idx, layer := range layers { + additions = append(additions, mutate.Addendum{ + Layer: layer, + History: history[idx], + MediaType: mediaType, + }) + } + return additions +} + +var NormalizedDateTime = time.Date(1980, time.January, 1, 0, 0, 1, 0, time.UTC) + +type SaveDiagnostic struct { + ImageName string + Cause error +} + +type SaveError struct { + Errors []SaveDiagnostic +} + +func (e SaveError) Error() string { + var errors []string + for _, d := range e.Errors { + errors = append(errors, fmt.Sprintf("[%s: %s]", d.ImageName, d.Cause.Error())) + } + return fmt.Sprintf("failed to write image to the following tags: %s", strings.Join(errors, ",")) +} diff --git a/vendor/github.com/buildpacks/imgutil/layout/layout.go b/vendor/github.com/buildpacks/imgutil/layout/layout.go index e464936902..254128e0dd 100644 --- a/vendor/github.com/buildpacks/imgutil/layout/layout.go +++ b/vendor/github.com/buildpacks/imgutil/layout/layout.go @@ -1,6 +1,7 @@ package layout import ( + "bytes" "fmt" "io" "os" @@ -8,11 +9,9 @@ import ( "strings" "time" - "github.com/google/go-containerregistry/pkg/v1/tarball" - v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/mutate" + "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/google/go-containerregistry/pkg/v1/types" "github.com/pkg/errors" @@ -23,162 +22,133 @@ var _ imgutil.Image = (*Image)(nil) type Image struct { v1.Image - path string - prevLayers []v1.Layer - createdAt time.Time - refName string // holds org.opencontainers.image.ref.name value -} - -type imageOptions struct { - platform imgutil.Platform - baseImage v1.Image - baseImagePath string - prevImagePath string - createdAt time.Time + path string + prevLayers []v1.Layer + prevHistory []v1.History + createdAt time.Time + refName string // holds org.opencontainers.image.ref.name value + requestedMediaTypes imgutil.MediaTypes + withHistory bool } -type ImageOption func(*imageOptions) error +// getters -// WithPreviousImage loads an existing image as a source for reusable layers. -// Use with ReuseLayer(). -// Ignored if underlyingImage is not found. -func WithPreviousImage(path string) ImageOption { - return func(i *imageOptions) error { - i.prevImagePath = path - return nil +func (i *Image) Architecture() (string, error) { + cfg, err := i.Image.ConfigFile() + if err != nil { + return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) } -} - -// FromBaseImage loads the given image as the config and layers for the new image. -// Ignored if image is not found. -func FromBaseImage(base v1.Image) ImageOption { - return func(i *imageOptions) error { - i.baseImage = base - return nil + if cfg == nil { + return "", fmt.Errorf("missing config for image at path %q", i.path) } -} - -// WithDefaultPlatform provides Architecture/OS/OSVersion defaults for the new image. -// Defaults for a new image are ignored when FromBaseImage returns an image. -// FromBaseImage and WithPreviousImage will use the platform to choose an image from a manifest list. -func WithDefaultPlatform(platform imgutil.Platform) ImageOption { - return func(i *imageOptions) error { - i.platform = platform - return nil + if cfg.Architecture == "" { + return "", fmt.Errorf("missing Architecture for image at path %q", i.path) } + return cfg.Architecture, nil } -// WithCreatedAt lets a caller set the created at timestamp for the image. -// Defaults for a new image is imgutil.NormalizedDateTime -func WithCreatedAt(createdAt time.Time) ImageOption { - return func(i *imageOptions) error { - i.createdAt = createdAt - return nil +func (i *Image) CreatedAt() (time.Time, error) { + configFile, err := i.Image.ConfigFile() + if err != nil { + return time.Time{}, errors.Wrapf(err, "getting createdAt time for image at path %q", i.path) } + return configFile.Created.UTC(), nil } -// FromBaseImagePath loads an existing image as the config and layers for the new underlyingImage. -// Ignored if underlyingImage is not found. -func FromBaseImagePath(path string) ImageOption { - return func(i *imageOptions) error { - i.baseImagePath = path - return nil +func (i *Image) Env(key string) (string, error) { + cfg, err := i.Image.ConfigFile() + if err != nil { + return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) } -} - -func NewImage(path string, ops ...ImageOption) (*Image, error) { - imageOpts := &imageOptions{} - for _, op := range ops { - if err := op(imageOpts); err != nil { - return nil, err - } + if cfg == nil { + return "", fmt.Errorf("missing config for image at path %q", i.path) } - - platform := defaultPlatform() - if (imageOpts.platform != imgutil.Platform{}) { - platform = imageOpts.platform + for _, envVar := range cfg.Config.Env { + parts := strings.Split(envVar, "=") + if parts[0] == key { + return parts[1], nil + } } + return "", nil +} - image, err := emptyImage(platform) +func (i *Image) Entrypoint() ([]string, error) { + cfg, err := i.Image.ConfigFile() if err != nil { - return nil, err + return nil, errors.Wrapf(err, "getting config file for image at path %q", i.path) } - - ri := &Image{ - Image: image, - path: path, + if cfg == nil { + return nil, fmt.Errorf("missing config for image at path %q", i.path) } + return cfg.Config.Entrypoint, nil +} - if imageOpts.prevImagePath != "" { - if err := processPreviousImageOption(ri, imageOpts.prevImagePath, platform); err != nil { - return nil, err - } - } +// Found tells whether the image exists in the repository by `Name()`. +func (i *Image) Found() bool { + return ImageExists(i.path) +} - if imageOpts.baseImagePath != "" { - if err := processBaseImagePathOption(ri, imageOpts.baseImagePath, platform); err != nil { - return nil, err - } - } else if imageOpts.baseImage != nil { - if err := ri.mutateImage(imageOpts.baseImage); err != nil { - return nil, err - } +func (i *Image) Valid() bool { + return i.Found() +} + +func ImageExists(path string) bool { + if !pathExists(path) { + return false } + index := filepath.Join(path, "index.json") + if _, err := os.Stat(index); os.IsNotExist(err) { + return false + } + return true +} - if imageOpts.createdAt.IsZero() { - ri.createdAt = imgutil.NormalizedDateTime - } else { - ri.createdAt = imageOpts.createdAt +func pathExists(path string) bool { + if path != "" { + if _, err := os.Stat(path); !os.IsNotExist(err) { + return true + } } + return false +} - return ri, nil +func (i *Image) GetAnnotateRefName() (string, error) { + return i.refName, nil } -func processPreviousImageOption(ri *Image, prevImagePath string, platform imgutil.Platform) error { - prevImage, err := newV1Image(prevImagePath, platform) +// GetLayer retrieves layer by diff id. Returns a reader of the uncompressed contents of the layer. +// When the layers (notExistsLayer) came from a sparse image returns an empty reader +func (i *Image) GetLayer(sha string) (io.ReadCloser, error) { + layers, err := i.Image.Layers() if err != nil { - return err + return nil, err } - prevLayers, err := prevImage.Layers() + layer, _, err := findLayerWithSha(layers, sha) if err != nil { - return errors.Wrapf(err, "getting layers for previous image with path %q", prevImagePath) + return nil, err } - ri.prevLayers = prevLayers - - return nil + return layer.Uncompressed() } -func processBaseImagePathOption(ri *Image, baseImagePath string, platform imgutil.Platform) error { - baseImage, err := newV1Image(baseImagePath, platform) +func (i *Image) History() ([]v1.History, error) { + configFile, err := i.ConfigFile() if err != nil { - return err - } - - return ri.mutateImage(baseImage) -} - -func emptyImage(platform imgutil.Platform) (v1.Image, error) { - cfg := &v1.ConfigFile{ - Architecture: platform.Architecture, - OS: platform.OS, - OSVersion: platform.OSVersion, - RootFS: v1.RootFS{ - Type: "layers", - DiffIDs: []v1.Hash{}, - }, + return nil, err } - image := mutate.MediaType(empty.Image, types.OCIManifestSchema1) - image = mutate.ConfigMediaType(image, types.OCIConfigJSON) - return mutate.ConfigFile(image, cfg) + return configFile.History, nil } -func defaultPlatform() imgutil.Platform { - return imgutil.Platform{ - OS: "linux", - Architecture: "amd64", +// Identifier +// Each image's ID is given by the SHA256 hash of its configuration JSON. It is represented as a hexadecimal encoding of 256 bits, +// e.g., sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9. +func (i *Image) Identifier() (imgutil.Identifier, error) { + hash, err := i.Image.Digest() + if err != nil { + return nil, errors.Wrapf(err, "getting identifier for image at path %q", i.path) } + return newLayoutIdentifier(i.path, hash) } func (i *Image) Label(key string) (string, error) { @@ -204,24 +174,63 @@ func (i *Image) Labels() (map[string]string, error) { return cfg.Config.Labels, nil } -func (i *Image) Env(key string) (string, error) { - cfg, err := i.Image.ConfigFile() +// Layers overrides v1.Image Layers(), because we allow sparse image in OCI layout, sometimes some blobs +// are missing. This method checks: +// If there is data, return the layer +// If there is no data, return a notExistsLayer +func (i *Image) Layers() ([]v1.Layer, error) { + layers, err := i.Image.Layers() if err != nil { - return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) - } - if cfg == nil { - return "", fmt.Errorf("missing config for image at path %q", i.path) + return nil, err } - for _, envVar := range cfg.Config.Env { - parts := strings.Split(envVar, "=") - if parts[0] == key { - return parts[1], nil + + var retLayers []v1.Layer + for pos, layer := range layers { + if hasData(layer) { + retLayers = append(retLayers, layer) + } else { + cfg, err := i.Image.ConfigFile() + if err != nil { + return nil, err + } + diffID := cfg.RootFS.DiffIDs[pos] + retLayers = append(retLayers, ¬ExistsLayer{Layer: layer, diffID: diffID}) } } - return "", nil + return retLayers, nil } -func (i *Image) WorkingDir() (string, error) { +func hasData(layer v1.Layer) bool { + _, err := layer.Compressed() + return err == nil +} + +type notExistsLayer struct { + v1.Layer + diffID v1.Hash +} + +func (l *notExistsLayer) Compressed() (io.ReadCloser, error) { + return io.NopCloser(bytes.NewReader([]byte{})), nil +} + +func (l *notExistsLayer) DiffID() (v1.Hash, error) { + return l.diffID, nil +} + +func (l *notExistsLayer) Uncompressed() (io.ReadCloser, error) { + return io.NopCloser(bytes.NewReader([]byte{})), nil +} + +func (i *Image) ManifestSize() (int64, error) { + return i.Image.Size() +} + +func (i *Image) Name() string { + return i.path +} + +func (i *Image) OS() (string, error) { cfg, err := i.Image.ConfigFile() if err != nil { return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) @@ -229,35 +238,40 @@ func (i *Image) WorkingDir() (string, error) { if cfg == nil { return "", fmt.Errorf("missing config for image at path %q", i.path) } - return cfg.Config.WorkingDir, nil + if cfg.OS == "" { + return "", fmt.Errorf("missing OS for image at path %q", i.path) + } + return cfg.OS, nil } -func (i *Image) Entrypoint() ([]string, error) { +func (i *Image) OSVersion() (string, error) { cfg, err := i.Image.ConfigFile() if err != nil { - return nil, errors.Wrapf(err, "getting config file for image at path %q", i.path) + return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) } if cfg == nil { - return nil, fmt.Errorf("missing config for image at path %q", i.path) + return "", fmt.Errorf("missing config for image at path %q", i.path) } - return cfg.Config.Entrypoint, nil + return cfg.OSVersion, nil } -func (i *Image) OS() (string, error) { - cfg, err := i.Image.ConfigFile() +func (i *Image) TopLayer() (string, error) { + all, err := i.Image.Layers() if err != nil { - return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) + return "", err } - if cfg == nil { - return "", fmt.Errorf("missing config for image at path %q", i.path) + if len(all) == 0 { + return "", fmt.Errorf("image at path %q has no layers", i.Name()) } - if cfg.OS == "" { - return "", fmt.Errorf("missing OS for image at path %q", i.path) + topLayer := all[len(all)-1] + hex, err := topLayer.DiffID() + if err != nil { + return "", err } - return cfg.OS, nil + return hex.String(), nil } -func (i *Image) OSVersion() (string, error) { +func (i *Image) Variant() (string, error) { cfg, err := i.Image.ConfigFile() if err != nil { return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) @@ -265,10 +279,10 @@ func (i *Image) OSVersion() (string, error) { if cfg == nil { return "", fmt.Errorf("missing config for image at path %q", i.path) } - return cfg.OSVersion, nil + return cfg.Variant, nil } -func (i *Image) Architecture() (string, error) { +func (i *Image) WorkingDir() (string, error) { cfg, err := i.Image.ConfigFile() if err != nil { return "", errors.Wrapf(err, "getting config file for image at path %q", i.path) @@ -276,75 +290,48 @@ func (i *Image) Architecture() (string, error) { if cfg == nil { return "", fmt.Errorf("missing config for image at path %q", i.path) } - if cfg.Architecture == "" { - return "", fmt.Errorf("missing Architecture for image at path %q", i.path) - } - return cfg.Architecture, nil + return cfg.Config.WorkingDir, nil } -func (i *Image) Name() string { - return i.path +// setters + +func (i *Image) AnnotateRefName(refName string) error { + i.refName = refName + return nil } func (i *Image) Rename(name string) { i.path = name } -// Found tells whether the image exists in the repository by `Name()`. -func (i *Image) Found() bool { - return ImageExists(i.path) -} - -// Identifier -// Each image's ID is given by the SHA256 hash of its configuration JSON. It is represented as a hexadecimal encoding of 256 bits, -// e.g., sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9. -func (i *Image) Identifier() (imgutil.Identifier, error) { - hash, err := i.Image.Digest() - if err != nil { - return nil, errors.Wrapf(err, "getting identifier for image at path %q", i.path) - } - return newLayoutIdentifier(i.path, hash) -} - -func (i *Image) CreatedAt() (time.Time, error) { +func (i *Image) SetArchitecture(architecture string) error { configFile, err := i.Image.ConfigFile() if err != nil { - return time.Time{}, errors.Wrapf(err, "getting createdAt time for image at path %q", i.path) + return err } - return configFile.Created.UTC(), nil -} - -func (i *Image) Rebase(s string, image imgutil.Image) error { - return errors.New("not yet implemented") + configFile.Architecture = architecture + err = i.mutateConfigFile(i.Image, configFile) + return err } -func (i *Image) SetLabel(key string, val string) error { +func (i *Image) SetCmd(cmd ...string) error { configFile, err := i.Image.ConfigFile() if err != nil { return err } config := *configFile.Config.DeepCopy() - if config.Labels == nil { - config.Labels = map[string]string{} - } - config.Labels[key] = val + config.Cmd = cmd err = i.mutateConfig(i.Image, config) - if err != nil { - return errors.Wrapf(err, "set label key=%s value=%s", key, val) - } - return nil + return err } -func (i *Image) RemoveLabel(key string) error { - cfg, err := i.Image.ConfigFile() +func (i *Image) SetEntrypoint(ep ...string) error { + configFile, err := i.Image.ConfigFile() if err != nil { - return errors.Wrapf(err, "getting config file for image at path %q", i.path) - } - if cfg == nil { - return fmt.Errorf("missing config for image at path %q", i.path) + return err } - config := *cfg.Config.DeepCopy() - delete(config.Labels, key) + config := *configFile.Config.DeepCopy() + config.Entrypoint = ep err = i.mutateConfig(i.Image, config) return err } @@ -375,37 +362,31 @@ func (i *Image) SetEnv(key string, val string) error { return err } -func (i *Image) SetWorkingDir(dir string) error { - configFile, err := i.Image.ConfigFile() +func (i *Image) SetHistory(history []v1.History) error { + configFile, err := i.Image.ConfigFile() // TODO: check if we need to use DeepCopy if err != nil { return err } - config := *configFile.Config.DeepCopy() - config.WorkingDir = dir - err = i.mutateConfig(i.Image, config) + configFile.History = history + i.Image, err = mutate.ConfigFile(i.Image, configFile) return err } -func (i *Image) SetEntrypoint(ep ...string) error { +func (i *Image) SetLabel(key string, val string) error { configFile, err := i.Image.ConfigFile() if err != nil { return err } config := *configFile.Config.DeepCopy() - config.Entrypoint = ep + if config.Labels == nil { + config.Labels = map[string]string{} + } + config.Labels[key] = val err = i.mutateConfig(i.Image, config) - return err -} - -func (i *Image) SetCmd(cmd ...string) error { - configFile, err := i.Image.ConfigFile() if err != nil { - return err + return errors.Wrapf(err, "set label key=%s value=%s", key, val) } - config := *configFile.Config.DeepCopy() - config.Cmd = cmd - err = i.mutateConfig(i.Image, config) - return err + return nil } func (i *Image) SetOS(osVal string) error { @@ -428,394 +409,137 @@ func (i *Image) SetOSVersion(osVersion string) error { return err } -func (i *Image) SetArchitecture(architecture string) error { +func (i *Image) SetVariant(variant string) error { configFile, err := i.Image.ConfigFile() if err != nil { return err } - configFile.Architecture = architecture + configFile.Variant = variant err = i.mutateConfigFile(i.Image, configFile) return err } -func (i *Image) TopLayer() (string, error) { - all, err := i.Image.Layers() - if err != nil { - return "", err - } - if len(all) == 0 { - return "", fmt.Errorf("image at path %q has no layers", i.Name()) - } - topLayer := all[len(all)-1] - hex, err := topLayer.DiffID() +func (i *Image) SetWorkingDir(dir string) error { + configFile, err := i.Image.ConfigFile() if err != nil { - return "", err + return err } - return hex.String(), nil + config := *configFile.Config.DeepCopy() + config.WorkingDir = dir + err = i.mutateConfig(i.Image, config) + return err } -// GetLayer retrieves layer by diff id. Returns a reader of the uncompressed contents of the layer. -// When the layers (notExistsLayer) came from a sparse image returns an empty reader -func (i *Image) GetLayer(sha string) (io.ReadCloser, error) { - layers, err := i.Image.Layers() - if err != nil { - return nil, err - } - - layer, err := findLayerWithSha(layers, sha) - if err != nil { - return nil, err - } - - return layer.Uncompressed() -} +// modifiers // AddLayer adds an uncompressed tarred layer to the image func (i *Image) AddLayer(path string) error { - layer, err := tarball.LayerFromFile(path) - if err != nil { - return err - } - return i.addOCILayer(layer) -} - -func (i *Image) AddLayerWithDiffID(path, diffID string) error { - // this is equivalent to AddLayer in the layout case - // it exists to provide optimize performance for local images - return i.AddLayer(path) + return i.AddLayerWithDiffIDAndHistory(path, "ignored", v1.History{}) } -func (i *Image) ReuseLayer(sha string) error { - layer, err := findLayerWithSha(i.prevLayers, sha) +func (i *Image) addLayer(layer v1.Layer, history v1.History) error { + image, err := mutate.Append( + i.Image, + layerAddendum(layer, history, i.requestedMediaTypes.LayerType()), + ) if err != nil { - return err + return errors.Wrap(err, "add layer") } - return i.addOCILayer(layer) + return i.setUnderlyingImage(image) } -func findLayerWithSha(layers []v1.Layer, diffID string) (v1.Layer, error) { - for _, layer := range layers { - dID, err := layer.DiffID() - if err != nil { - return nil, errors.Wrap(err, "get diff ID for previous image layer") - } - if diffID == dID.String() { - return layer, nil - } +func layerAddendum(layer v1.Layer, history v1.History, mediaType types.MediaType) mutate.Addendum { + return mutate.Addendum{ + Layer: layer, + History: history, + MediaType: mediaType, } - return nil, fmt.Errorf("previous image did not have layer with diff id %q", diffID) } -func (i *Image) Save(additionalNames ...string) error { - return i.SaveAs(i.Name(), additionalNames...) +func (i *Image) AddLayerWithDiffID(path, diffID string) error { + return i.AddLayerWithDiffIDAndHistory(path, "ignored", v1.History{}) } -// SaveAs ignores the image `Name()` method and saves the image according to name & additional names provided to this method -func (i *Image) SaveAs(name string, additionalNames ...string) error { - err := i.mutateCreatedAt(i.Image, v1.Time{Time: i.createdAt}) - if err != nil { - return errors.Wrap(err, "set creation time") - } - - cfg, err := i.Image.ConfigFile() - if err != nil { - return errors.Wrap(err, "get image config") - } - cfg = cfg.DeepCopy() - - layers, err := i.Image.Layers() - if err != nil { - return errors.Wrap(err, "get image layers") - } - cfg.History = make([]v1.History, len(layers)) - for j := range cfg.History { - cfg.History[j] = v1.History{ - Created: v1.Time{Time: i.createdAt}, - } - } - - cfg.DockerVersion = "" - cfg.Container = "" - err = i.mutateConfigFile(i.Image, cfg) +func (i *Image) AddLayerWithDiffIDAndHistory(path, diffID string, history v1.History) error { + // add layer + layer, err := tarball.LayerFromFile(path) if err != nil { - return errors.Wrap(err, "zeroing history") - } - - var diagnostics []imgutil.SaveDiagnostic - annotations := ImageRefAnnotation(i.refName) - pathsToSave := append([]string{name}, additionalNames...) - for _, path := range pathsToSave { - // initialize image path - path, err := Write(path, empty.Index) - if err != nil { - return err - } - - err = path.AppendImage(i.Image, WithAnnotations(annotations)) - if err != nil { - diagnostics = append(diagnostics, imgutil.SaveDiagnostic{ImageName: i.Name(), Cause: err}) - } - } - - if len(diagnostics) > 0 { - return imgutil.SaveError{Errors: diagnostics} + return err } - - return nil -} - -func (i *Image) SaveFile() (string, error) { - // TODO issue https://github.com/buildpacks/imgutil/issues/170 - return "", errors.New("not yet implemented") + return i.addLayer(layer, history) } func (i *Image) Delete() error { return os.RemoveAll(i.path) } -func (i *Image) ManifestSize() (int64, error) { - return i.Image.Size() +func (i *Image) Rebase(s string, image imgutil.Image) error { + return errors.New("not yet implemented") } -// Layers overrides v1.Image Layers(), because we allow sparse image in OCI layout, sometimes some blobs -// are missing. This method checks: -// If there is data, return the layer -// If there is no data, return a notExistsLayer -func (i *Image) Layers() ([]v1.Layer, error) { - layers, err := i.Image.Layers() +func (i *Image) RemoveLabel(key string) error { + cfg, err := i.Image.ConfigFile() if err != nil { - return nil, err + return errors.Wrapf(err, "getting config file for image at path %q", i.path) } - - var retLayers []v1.Layer - for pos, layer := range layers { - if hasData(layer) { - retLayers = append(retLayers, layer) - } else { - cfg, err := i.Image.ConfigFile() - if err != nil { - return nil, err - } - diffID := cfg.RootFS.DiffIDs[pos] - retLayers = append(retLayers, ¬ExistsLayer{Layer: layer, diffID: diffID}) - } + if cfg == nil { + return fmt.Errorf("missing config for image at path %q", i.path) } - return retLayers, nil -} - -func (i *Image) AnnotateRefName(refName string) error { - i.refName = refName - return nil -} - -func (i *Image) GetAnnotateRefName() (string, error) { - return i.refName, nil + config := *cfg.Config.DeepCopy() + delete(config.Labels, key) + err = i.mutateConfig(i.Image, config) + return err } -func ImageExists(path string) bool { - if !pathExists(path) { - return false - } - index := filepath.Join(path, "index.json") - if _, err := os.Stat(index); os.IsNotExist(err) { - return false +func (i *Image) ReuseLayer(sha string) error { + layer, idx, err := findLayerWithSha(i.prevLayers, sha) + if err != nil { + return err } - return true -} - -func hasData(layer v1.Layer) bool { - _, err := layer.Compressed() - return err == nil + return i.addLayer(layer, i.prevHistory[idx]) } -func pathExists(path string) bool { - if path != "" { - if _, err := os.Stat(path); !os.IsNotExist(err) { - return true - } +func (i *Image) ReuseLayerWithHistory(sha string, history v1.History) error { + layer, _, err := findLayerWithSha(i.prevLayers, sha) + if err != nil { + return err } - return false + return i.addLayer(layer, history) } -// newV1Image creates a layout image from the given path. -// - If a ImageIndex for multiples platforms exists, then it will try to select the image -// according to the platform provided -// - If the image does not exist, then an empty image is returned -func newV1Image(path string, platform imgutil.Platform) (v1.Image, error) { - var ( - image v1.Image - layout Path - err error - ) +// helpers - if ImageExists(path) { - layout, err = FromPath(path) - if err != nil { - return nil, errors.Wrap(err, "loading layout from path new") - } - - index, err := layout.ImageIndex() - if err != nil { - return nil, errors.Wrap(err, "reading index") - } - - image, err = imageFromIndex(index, platform) - if err != nil { - return nil, errors.Wrap(err, "getting image from index") - } - } else { - image, err = emptyImage(platform) +func findLayerWithSha(layers []v1.Layer, diffID string) (v1.Layer, int, error) { + for idx, layer := range layers { + dID, err := layer.DiffID() if err != nil { - return nil, errors.Wrap(err, "initializing empty image") + return nil, idx, errors.Wrap(err, "get diff ID for previous image layer") } - } - return &Image{ - Image: image, - path: path, - }, nil -} - -// imageFromIndex creates a v1.Image from the given Image Index, selecting the image manifest -// that matches the given OS and architecture. -func imageFromIndex(index v1.ImageIndex, platform imgutil.Platform) (v1.Image, error) { - indexManifest, err := index.IndexManifest() - if err != nil { - return nil, err - } - - if len(indexManifest.Manifests) == 0 { - return nil, errors.New("no underlyingImage indexManifest found") - } - - manifest := indexManifest.Manifests[0] - if len(indexManifest.Manifests) > 1 { - // Find based on platform (os/arch) - for _, m := range indexManifest.Manifests { - if m.Platform.OS == platform.OS && m.Platform.Architecture == platform.OS { - manifest = m - break - } + if diffID == dID.String() { + return layer, idx, nil } - return nil, fmt.Errorf("manifest matching platform %v not found", platform) - } - - image, err := index.Image(manifest.Digest) - if err != nil { - return nil, err } - - return image, nil + return nil, -1, fmt.Errorf("previous image did not have layer with diff id %q", diffID) } -// mutateConfig mutates the provided v1.Image to have the provided v1.Config and wraps the result -// into a layout.Image (requires for override methods like Layers() +// mutateConfig mutates the provided v1.Image to have the provided v1.Config, +// wraps the result into a layout.Image, +// and sets it as the underlying image for the receiving layout.Image (required for overriding methods like Layers()) func (i *Image) mutateConfig(base v1.Image, config v1.Config) error { image, err := mutate.Config(base, config) if err != nil { return err } - return i.mutateImage(image) + return i.setUnderlyingImage(image) } -// mutateConfigFile mutates the provided v1.Image to have the provided v1.ConfigFile and wraps the result -// into a layout.Image (requires for override methods like Layers() +// mutateConfigFile mutates the provided v1.Image to have the provided v1.ConfigFile, +// wraps the result into a layout.Image, +// and sets it as the underlying image for the receiving layout.Image (required for overriding methods like Layers()) func (i *Image) mutateConfigFile(base v1.Image, configFile *v1.ConfigFile) error { image, err := mutate.ConfigFile(base, configFile) if err != nil { return err } - return i.mutateImage(image) -} - -// mutateCreatedAt mutates the provided v1.Image to have the provided v1.Time and wraps the result -// into a layout.Image (requires for override methods like Layers() -func (i *Image) mutateCreatedAt(base v1.Image, created v1.Time) error { - image, err := mutate.CreatedAt(i.Image, v1.Time{Time: i.createdAt}) - if err != nil { - return err - } - return i.mutateImage(image) -} - -// mutateImage wraps the provided v1.Image into a layout.Image -func (i *Image) mutateImage(base v1.Image) error { - manifest, err := base.Manifest() - if err != nil { - return err - } - if validMediaTypes(manifest) { - i.Image = &Image{ - Image: base, - } - } else { - // images has docker media types, we need to override them - newBaseImage, err := overrideMediaTypes(base) - if err != nil { - return err - } - i.Image = &Image{ - Image: newBaseImage, - } - } - return nil -} - -// addOCILayer appends the provided layer with media type application/vnd.oci.image.layer.v1.tar+gzip -func (i *Image) addOCILayer(layer v1.Layer) error { - additions := layersAddendum([]v1.Layer{layer}) - image, err := mutate.Append(i.Image, additions...) - if err != nil { - return errors.Wrap(err, "add layer") - } - return i.mutateImage(image) -} - -// validMediaTypes returns true if media types present in the manifest are the ones defined by the OCI spec -// Docker Media Types will return false. -func validMediaTypes(manifest *v1.Manifest) bool { - return manifest.MediaType == types.OCIManifestSchema1 && - manifest.Config.MediaType == types.OCIConfigJSON -} - -// overrideMediaTypes will create a new v1.Image from the provided base image, but replacing -// manifest media type, config media type and layers media type by the ones defined by the OCI spec -func overrideMediaTypes(base v1.Image) (v1.Image, error) { - config, err := base.ConfigFile() - if err != nil { - return nil, err - } - config.RootFS.DiffIDs = make([]v1.Hash, 0) - - image := mutate.MediaType(empty.Image, types.OCIManifestSchema1) - image, err = mutate.ConfigFile(image, config) - if err != nil { - return nil, err - } - image = mutate.ConfigMediaType(image, types.OCIConfigJSON) - - layers, err := base.Layers() - if err != nil { - return nil, err - } - - additions := layersAddendum(layers) - image, err = mutate.Append(image, additions...) - if err != nil { - return nil, err - } - - return image, nil -} - -// layersAddendum creates an Addendum array with the given layers -// and 'application/vnd.oci.image.layer.v1.tar+gzip' media type -func layersAddendum(layers []v1.Layer) []mutate.Addendum { - additions := make([]mutate.Addendum, 0) - for _, layer := range layers { - additions = append(additions, mutate.Addendum{ - MediaType: types.OCILayer, - Layer: layer, - }) - } - return additions + return i.setUnderlyingImage(image) } diff --git a/vendor/github.com/buildpacks/imgutil/layout/layout_layer.go b/vendor/github.com/buildpacks/imgutil/layout/layout_layer.go deleted file mode 100644 index e29d2deaa1..0000000000 --- a/vendor/github.com/buildpacks/imgutil/layout/layout_layer.go +++ /dev/null @@ -1,25 +0,0 @@ -package layout - -import ( - "bytes" - "io" - - v1 "github.com/google/go-containerregistry/pkg/v1" -) - -type notExistsLayer struct { - v1.Layer - diffID v1.Hash -} - -func (l *notExistsLayer) Compressed() (io.ReadCloser, error) { - return io.NopCloser(bytes.NewReader([]byte{})), nil -} - -func (l *notExistsLayer) DiffID() (v1.Hash, error) { - return l.diffID, nil -} - -func (l *notExistsLayer) Uncompressed() (io.ReadCloser, error) { - return io.NopCloser(bytes.NewReader([]byte{})), nil -} diff --git a/vendor/github.com/buildpacks/imgutil/layout/layoutpath.go b/vendor/github.com/buildpacks/imgutil/layout/layoutpath.go index b1e5595442..baac4ad859 100644 --- a/vendor/github.com/buildpacks/imgutil/layout/layoutpath.go +++ b/vendor/github.com/buildpacks/imgutil/layout/layoutpath.go @@ -10,25 +10,6 @@ type Path struct { ggcr.Path } -type Option func(*options) - -type options struct { - withoutLayers bool - annotations map[string]string -} - -func WithoutLayers() Option { - return func(i *options) { - i.withoutLayers = true - } -} - -func WithAnnotations(annotations map[string]string) Option { - return func(i *options) { - i.annotations = annotations - } -} - func (l Path) append(elem ...string) string { complete := []string{string(l.Path)} return filepath.Join(append(complete, elem...)...) diff --git a/vendor/github.com/buildpacks/imgutil/layout/new.go b/vendor/github.com/buildpacks/imgutil/layout/new.go new file mode 100644 index 0000000000..3239bfb660 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/layout/new.go @@ -0,0 +1,226 @@ +package layout + +import ( + "fmt" + + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/empty" + "github.com/google/go-containerregistry/pkg/v1/mutate" + "github.com/google/go-containerregistry/pkg/v1/types" + "github.com/pkg/errors" + + "github.com/buildpacks/imgutil" +) + +func NewImage(path string, ops ...ImageOption) (*Image, error) { + imageOpts := &options{} + for _, op := range ops { + if err := op(imageOpts); err != nil { + return nil, err + } + } + + platform := defaultPlatform() + if (imageOpts.platform != imgutil.Platform{}) { + platform = imageOpts.platform + } + + image, err := emptyImage(platform) + if err != nil { + return nil, err + } + + ri := &Image{ + Image: image, + path: path, + withHistory: imageOpts.withHistory, + } + + if imageOpts.prevImagePath != "" { + if err := processPreviousImageOption(ri, imageOpts.prevImagePath, platform); err != nil { + return nil, err + } + } + + if imageOpts.baseImagePath != "" { + if err := processBaseImageOption(ri, imageOpts.baseImagePath, platform); err != nil { + return nil, err + } + } else if imageOpts.baseImage != nil { + if err := ri.setUnderlyingImage(imageOpts.baseImage); err != nil { + return nil, err + } + } + + if imageOpts.createdAt.IsZero() { + ri.createdAt = imgutil.NormalizedDateTime + } else { + ri.createdAt = imageOpts.createdAt + } + + if imageOpts.mediaTypes == imgutil.MissingTypes { + ri.requestedMediaTypes = imgutil.OCITypes + } else { + ri.requestedMediaTypes = imageOpts.mediaTypes + } + if err = ri.setUnderlyingImage(ri.Image); err != nil { // update media types + return nil, err + } + + return ri, nil +} + +func defaultPlatform() imgutil.Platform { + return imgutil.Platform{ + OS: "linux", + Architecture: "amd64", + } +} + +func emptyImage(platform imgutil.Platform) (v1.Image, error) { + cfg := &v1.ConfigFile{ + Architecture: platform.Architecture, + History: []v1.History{}, + OS: platform.OS, + OSVersion: platform.OSVersion, + RootFS: v1.RootFS{ + Type: "layers", + DiffIDs: []v1.Hash{}, + }, + } + image := mutate.MediaType(empty.Image, types.OCIManifestSchema1) + image = mutate.ConfigMediaType(image, types.OCIConfigJSON) + return mutate.ConfigFile(image, cfg) +} + +func processPreviousImageOption(ri *Image, prevImagePath string, platform imgutil.Platform) error { + prevImage, err := newV1Image(prevImagePath, platform, ri.withHistory) + if err != nil { + return err + } + + prevLayers, err := prevImage.Layers() + if err != nil { + return errors.Wrapf(err, "getting layers for previous image with path %q", prevImagePath) + } + + ri.prevLayers = prevLayers + configFile, err := prevImage.ConfigFile() + if err != nil { + return err + } + ri.prevHistory = configFile.History + + return nil +} + +// newV1Image creates a layout image from the given path. +// - If a ImageIndex for multiples platforms exists, then it will try to select the image +// according to the platform provided +// - If the image does not exist, then an empty image is returned +func newV1Image(path string, platform imgutil.Platform, withHistory bool) (v1.Image, error) { + var ( + image v1.Image + layout Path + err error + ) + + if ImageExists(path) { + layout, err = FromPath(path) + if err != nil { + return nil, fmt.Errorf("loading layout from path new: %w", err) + } + + index, err := layout.ImageIndex() + if err != nil { + return nil, fmt.Errorf("reading index: %w", err) + } + + image, err = imageFromIndex(index, platform) + if err != nil { + return nil, fmt.Errorf("getting image from index: %w", err) + } + } else { + image, err = emptyImage(platform) + if err != nil { + return nil, fmt.Errorf("initializing empty image: %w", err) + } + } + + if withHistory { + if image, err = imgutil.OverrideHistoryIfNeeded(image); err != nil { + return nil, fmt.Errorf("overriding history: %w", err) + } + } + + return &Image{ + Image: image, + path: path, + }, nil +} + +// imageFromIndex creates a v1.Image from the given Image Index, selecting the image manifest +// that matches the given OS and architecture. +func imageFromIndex(index v1.ImageIndex, platform imgutil.Platform) (v1.Image, error) { + indexManifest, err := index.IndexManifest() + if err != nil { + return nil, err + } + + if len(indexManifest.Manifests) == 0 { + return nil, errors.New("no underlyingImage indexManifest found") + } + + manifest := indexManifest.Manifests[0] + if len(indexManifest.Manifests) > 1 { + // Find based on platform (os/arch) + for _, m := range indexManifest.Manifests { + if m.Platform.OS == platform.OS && m.Platform.Architecture == platform.OS { + manifest = m + break + } + } + return nil, fmt.Errorf("manifest matching platform %v not found", platform) + } + + image, err := index.Image(manifest.Digest) + if err != nil { + return nil, err + } + + return image, nil +} + +func processBaseImageOption(ri *Image, baseImagePath string, platform imgutil.Platform) error { + baseImage, err := newV1Image(baseImagePath, platform, ri.withHistory) + if err != nil { + return err + } + + return ri.setUnderlyingImage(baseImage) +} + +// setUnderlyingImage wraps the provided v1.Image into a layout.Image and sets it as the underlying image for the receiving layout.Image +func (i *Image) setUnderlyingImage(base v1.Image) error { + manifest, err := base.Manifest() + if err != nil { + return err + } + if i.requestedMediaTypesMatch(manifest) { + i.Image = &Image{Image: base} + return nil + } + // provided v1.Image media types differ from requested, override them + newBase, err := imgutil.OverrideMediaTypes(base, i.requestedMediaTypes) + if err != nil { + return err + } + i.Image = &Image{Image: newBase} + return nil +} + +// requestedMediaTypesMatch returns true if the manifest and config file use the requested media types +func (i *Image) requestedMediaTypesMatch(manifest *v1.Manifest) bool { + return manifest.MediaType == i.requestedMediaTypes.ManifestType() && + manifest.Config.MediaType == i.requestedMediaTypes.ConfigType() +} diff --git a/vendor/github.com/buildpacks/imgutil/layout/options.go b/vendor/github.com/buildpacks/imgutil/layout/options.go new file mode 100644 index 0000000000..23b49e1001 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/layout/options.go @@ -0,0 +1,86 @@ +package layout + +import ( + "time" + + v1 "github.com/google/go-containerregistry/pkg/v1" + + "github.com/buildpacks/imgutil" +) + +type ImageOption func(*options) error + +type options struct { + platform imgutil.Platform + baseImage v1.Image + baseImagePath string + prevImagePath string + withHistory bool + createdAt time.Time + mediaTypes imgutil.MediaTypes +} + +// FromBaseImage loads the given image as the config and layers for the new image. +// Ignored if image is not found. +func FromBaseImage(base v1.Image) ImageOption { + return func(i *options) error { + i.baseImage = base + return nil + } +} + +// FromBaseImagePath (layout only) loads an existing image as the config and layers for the new underlyingImage. +// Ignored if underlyingImage is not found. +func FromBaseImagePath(path string) ImageOption { + return func(i *options) error { + i.baseImagePath = path + return nil + } +} + +// WithCreatedAt lets a caller set the created at timestamp for the image. +// Defaults for a new image is imgutil.NormalizedDateTime +func WithCreatedAt(createdAt time.Time) ImageOption { + return func(i *options) error { + i.createdAt = createdAt + return nil + } +} + +// WithDefaultPlatform provides Architecture/OS/OSVersion defaults for the new image. +// Defaults for a new image are ignored when FromBaseImage returns an image. +// FromBaseImage and WithPreviousImage will use the platform to choose an image from a manifest list. +func WithDefaultPlatform(platform imgutil.Platform) ImageOption { + return func(i *options) error { + i.platform = platform + return nil + } +} + +// WithHistory if provided will configure the image to preserve history when saved +// (including any history from the base image if valid). +func WithHistory() ImageOption { + return func(opts *options) error { + opts.withHistory = true + return nil + } +} + +// WithMediaTypes lets a caller set the desired media types for the image manifest and config files, +// including the layers referenced in the manifest, to be either OCI media types or Docker media types. +func WithMediaTypes(requested imgutil.MediaTypes) ImageOption { + return func(i *options) error { + i.mediaTypes = requested + return nil + } +} + +// WithPreviousImage loads an existing image as a source for reusable layers. +// Use with ReuseLayer(). +// Ignored if underlyingImage is not found. +func WithPreviousImage(path string) ImageOption { + return func(i *options) error { + i.prevImagePath = path + return nil + } +} diff --git a/vendor/github.com/buildpacks/imgutil/layout/save.go b/vendor/github.com/buildpacks/imgutil/layout/save.go new file mode 100644 index 0000000000..d0edb14166 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/layout/save.go @@ -0,0 +1,85 @@ +package layout + +import ( + "fmt" + + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/empty" + "github.com/google/go-containerregistry/pkg/v1/mutate" + "github.com/pkg/errors" + + "github.com/buildpacks/imgutil" +) + +func (i *Image) Save(additionalNames ...string) error { + return i.SaveAs(i.Name(), additionalNames...) +} + +// SaveAs ignores the image `Name()` method and saves the image according to name & additional names provided to this method +func (i *Image) SaveAs(name string, additionalNames ...string) error { + err := i.mutateCreatedAt(i.Image, v1.Time{Time: i.createdAt}) + if err != nil { + return errors.Wrap(err, "set creation time") + } + + if i.Image, err = imgutil.OverrideHistoryIfNeeded(i.Image); err != nil { + return fmt.Errorf("override history: %w", err) + } + + cfg, err := i.Image.ConfigFile() + if err != nil { + return errors.Wrap(err, "get image config") + } + cfg = cfg.DeepCopy() + + created := v1.Time{Time: i.createdAt} + if i.withHistory { + // set created + for j := range cfg.History { + cfg.History[j].Created = created + } + } else { + // zero history, set created + for j := range cfg.History { + cfg.History[j] = v1.History{Created: created} + } + } + cfg.DockerVersion = "" + cfg.Container = "" + err = i.mutateConfigFile(i.Image, cfg) + if err != nil { + return errors.Wrap(err, "zeroing history") + } + + var diagnostics []imgutil.SaveDiagnostic + annotations := ImageRefAnnotation(i.refName) + pathsToSave := append([]string{name}, additionalNames...) + for _, path := range pathsToSave { + // initialize image path + path, err := Write(path, empty.Index) + if err != nil { + return err + } + + err = path.AppendImage(i.Image, WithAnnotations(annotations)) + if err != nil { + diagnostics = append(diagnostics, imgutil.SaveDiagnostic{ImageName: i.Name(), Cause: err}) + } + } + + if len(diagnostics) > 0 { + return imgutil.SaveError{Errors: diagnostics} + } + + return nil +} + +// mutateCreatedAt mutates the provided v1.Image to have the provided v1.Time and wraps the result +// into a layout.Image (requires for override methods like Layers() +func (i *Image) mutateCreatedAt(base v1.Image, created v1.Time) error { // FIXME: this function doesn't need arguments; we should also probably do this mutation at the time of image instantiation instead of at the point of saving + image, err := mutate.CreatedAt(i.Image, v1.Time{Time: i.createdAt}) + if err != nil { + return err + } + return i.setUnderlyingImage(image) +} diff --git a/vendor/github.com/buildpacks/imgutil/layout/save_file.go b/vendor/github.com/buildpacks/imgutil/layout/save_file.go new file mode 100644 index 0000000000..4288869389 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/layout/save_file.go @@ -0,0 +1,8 @@ +package layout + +import "errors" + +func (i *Image) SaveFile() (string, error) { + // TODO issue https://github.com/buildpacks/imgutil/issues/170 + return "", errors.New("not yet implemented") +} diff --git a/vendor/github.com/buildpacks/imgutil/layout/sparse/new.go b/vendor/github.com/buildpacks/imgutil/layout/sparse/new.go new file mode 100644 index 0000000000..64944a6c03 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/layout/sparse/new.go @@ -0,0 +1,21 @@ +package sparse + +import ( + v1 "github.com/google/go-containerregistry/pkg/v1" + + "github.com/buildpacks/imgutil/layout" +) + +// NewImage returns a new Image saved on disk that can be modified +func NewImage(path string, from v1.Image, ops ...layout.ImageOption) (*Image, error) { + allOps := append([]layout.ImageOption{layout.FromBaseImage(from)}, ops...) + img, err := layout.NewImage(path, allOps...) + if err != nil { + return nil, err + } + + image := &Image{ + Image: *img, + } + return image, nil +} diff --git a/vendor/github.com/buildpacks/imgutil/layout/sparse/options.go b/vendor/github.com/buildpacks/imgutil/layout/sparse/options.go new file mode 100644 index 0000000000..d4cb795983 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/layout/sparse/options.go @@ -0,0 +1 @@ +package sparse diff --git a/vendor/github.com/buildpacks/imgutil/layout/sparse/save.go b/vendor/github.com/buildpacks/imgutil/layout/sparse/save.go new file mode 100644 index 0000000000..f083a75930 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/layout/sparse/save.go @@ -0,0 +1,38 @@ +package sparse + +import ( + "github.com/google/go-containerregistry/pkg/v1/empty" + + "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/layout" +) + +func (i *Image) Save(additionalNames ...string) error { + return i.SaveAs(i.Name(), additionalNames...) +} + +func (i *Image) SaveAs(name string, additionalNames ...string) error { + var diagnostics []imgutil.SaveDiagnostic + + refName, _ := i.Image.GetAnnotateRefName() + annotations := layout.ImageRefAnnotation(refName) + + pathsToSave := append([]string{name}, additionalNames...) + for _, path := range pathsToSave { + layoutPath, err := layout.Write(path, empty.Index) + if err != nil { + return err + } + + err = layoutPath.AppendImage(i, layout.WithoutLayers(), layout.WithAnnotations(annotations)) + if err != nil { + diagnostics = append(diagnostics, imgutil.SaveDiagnostic{ImageName: name, Cause: err}) + } + } + + if len(diagnostics) > 0 { + return imgutil.SaveError{Errors: diagnostics} + } + + return nil +} diff --git a/vendor/github.com/buildpacks/imgutil/layout/sparse/sparse.go b/vendor/github.com/buildpacks/imgutil/layout/sparse/sparse.go index c633b85174..aac6f37d8e 100644 --- a/vendor/github.com/buildpacks/imgutil/layout/sparse/sparse.go +++ b/vendor/github.com/buildpacks/imgutil/layout/sparse/sparse.go @@ -1,9 +1,6 @@ package sparse import ( - v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/empty" - "github.com/buildpacks/imgutil/layout" "github.com/buildpacks/imgutil" @@ -11,51 +8,8 @@ import ( var _ imgutil.Image = (*Image)(nil) -// Image is a struct created to overrides the Save() method of the image. -// a sparse Image is saved on disk but does not include any layers in the `blobs` directory. +// Image is a struct created to override the Save() method of a layout image, +// so that when the image is saved to disk, it does not include any layers in the `blobs` directory. type Image struct { layout.Image } - -// NewImage returns a new Image saved on disk that can be modified -func NewImage(path string, from v1.Image) (*Image, error) { - img, err := layout.NewImage(path, layout.FromBaseImage(from)) - if err != nil { - return nil, err - } - - image := &Image{ - Image: *img, - } - return image, nil -} - -func (i *Image) Save(additionalNames ...string) error { - return i.SaveAs(i.Name(), additionalNames...) -} - -func (i *Image) SaveAs(name string, additionalNames ...string) error { - var diagnostics []imgutil.SaveDiagnostic - - refName, _ := i.Image.GetAnnotateRefName() - annotations := layout.ImageRefAnnotation(refName) - - pathsToSave := append([]string{name}, additionalNames...) - for _, path := range pathsToSave { - layoutPath, err := layout.Write(path, empty.Index) - if err != nil { - return err - } - - err = layoutPath.AppendImage(i, layout.WithoutLayers(), layout.WithAnnotations(annotations)) - if err != nil { - diagnostics = append(diagnostics, imgutil.SaveDiagnostic{ImageName: name, Cause: err}) - } - } - - if len(diagnostics) > 0 { - return imgutil.SaveError{Errors: diagnostics} - } - - return nil -} diff --git a/vendor/github.com/buildpacks/imgutil/layout/write.go b/vendor/github.com/buildpacks/imgutil/layout/write.go index b3bd5a9cdc..a0d5dcf8a1 100644 --- a/vendor/github.com/buildpacks/imgutil/layout/write.go +++ b/vendor/github.com/buildpacks/imgutil/layout/write.go @@ -17,13 +17,32 @@ import ( "github.com/google/go-containerregistry/pkg/v1/layout" ) +type AppendOption func(*appendOptions) + +type appendOptions struct { + withoutLayers bool + annotations map[string]string +} + +func WithoutLayers() AppendOption { + return func(i *appendOptions) { + i.withoutLayers = true + } +} + +func WithAnnotations(annotations map[string]string) AppendOption { + return func(i *appendOptions) { + i.annotations = annotations + } +} + // AppendImage mimics GGCR's AppendImage in that it appends an image to a `layout.Path`, // but the image appended does not include any layers in the `blobs` directory. // The returned image will return layers when Layers(), LayerByDiffID(), or LayerByDigest() are called, // but the returned layer will error when DiffID(), Compressed(), or Uncompressed() are called. // This is useful when we need to satisfy the v1.Image interface but do not need to access any layers. -func (l Path) AppendImage(img v1.Image, ops ...Option) error { - o := &options{} +func (l Path) AppendImage(img v1.Image, ops ...AppendOption) error { + o := &appendOptions{} for _, op := range ops { op(o) } @@ -68,8 +87,6 @@ func (l Path) writeImageWithoutLayers(img v1.Image, annotations map[string]strin return l.AppendDescriptor(desc) } -// appendImage overrides the writeLayers operation from ggcr library. -// calls the Layers() method on the mutateImage which is handling the logic to skip layers when it is required func (l Path) appendImage(img v1.Image, annotations map[string]string) error { layers, err := img.Layers() if err != nil { diff --git a/vendor/github.com/buildpacks/imgutil/local/local.go b/vendor/github.com/buildpacks/imgutil/local/local.go index aafae6722f..75717d37bc 100644 --- a/vendor/github.com/buildpacks/imgutil/local/local.go +++ b/vendor/github.com/buildpacks/imgutil/local/local.go @@ -1,297 +1,284 @@ package local import ( - "archive/tar" "context" "crypto/sha256" "encoding/hex" - "encoding/json" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" "sync" "time" - "golang.org/x/sync/errgroup" - - "github.com/buildpacks/imgutil/layer" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/jsonmessage" - registryName "github.com/google/go-containerregistry/pkg/name" + "github.com/docker/docker/api/types/image" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/pkg/errors" "github.com/buildpacks/imgutil" ) -// DockerClient is subset of client.CommonAPIClient required by this package -type DockerClient interface { - ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error) - ImageTag(ctx context.Context, image, ref string) error - ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) - ImageSave(ctx context.Context, images []string) (io.ReadCloser, error) - ImageRemove(ctx context.Context, image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) - Info(ctx context.Context) (types.Info, error) -} - type Image struct { docker DockerClient repoName string inspect types.ImageInspect + history []v1.History layerPaths []string prevImage *Image // reused layers will be fetched from prevImage downloadBaseOnce *sync.Once createdAt time.Time + withHistory bool } -type ImageOption func(*options) error - -type options struct { - platform imgutil.Platform - baseImageRepoName string - prevImageRepoName string - createdAt time.Time +// DockerClient is subset of client.CommonAPIClient required by this package +type DockerClient interface { + ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error) + ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error) + ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) + ImageRemove(ctx context.Context, image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) + ImageSave(ctx context.Context, images []string) (io.ReadCloser, error) + ImageTag(ctx context.Context, image, ref string) error + Info(ctx context.Context) (types.Info, error) } -// WithPreviousImage loads an existing image as a source for reusable layers. -// Use with ReuseLayer(). -// Ignored if image is not found. -func WithPreviousImage(imageName string) ImageOption { - return func(i *options) error { - i.prevImageRepoName = imageName - return nil - } -} +// getters -// FromBaseImage loads an existing image as the config and layers for the new image. -// Ignored if image is not found. -func FromBaseImage(imageName string) ImageOption { - return func(i *options) error { - i.baseImageRepoName = imageName - return nil - } +func (i *Image) Architecture() (string, error) { + return i.inspect.Architecture, nil } -// WithDefaultPlatform provides Architecture/OS/OSVersion defaults for the new image. -// Defaults for a new image are ignored when FromBaseImage returns an image. -func WithDefaultPlatform(platform imgutil.Platform) ImageOption { - return func(i *options) error { - i.platform = platform - return nil - } -} +func (i *Image) CreatedAt() (time.Time, error) { + createdAtTime := i.inspect.Created + createdTime, err := time.Parse(time.RFC3339Nano, createdAtTime) -// WithCreatedAt lets a caller set the created at timestamp for the image. -// Defaults for a new image is imgutil.NormalizedDateTime -func WithCreatedAt(createdAt time.Time) ImageOption { - return func(opts *options) error { - opts.createdAt = createdAt - return nil + if err != nil { + return time.Time{}, err } + return createdTime, nil } -// NewImage returns a new Image that can be modified and saved to a registry. -func NewImage(repoName string, dockerClient DockerClient, ops ...ImageOption) (*Image, error) { - imageOpts := &options{} - for _, op := range ops { - if err := op(imageOpts); err != nil { - return nil, err - } - } - - platform, err := defaultPlatform(dockerClient) - if err != nil { - return nil, err - } +func (i *Image) Entrypoint() ([]string, error) { + return i.inspect.Config.Entrypoint, nil +} - if (imageOpts.platform != imgutil.Platform{}) { - if err := validatePlatformOption(platform, imageOpts.platform); err != nil { - return nil, err +func (i *Image) Env(key string) (string, error) { + for _, envVar := range i.inspect.Config.Env { + parts := strings.Split(envVar, "=") + if parts[0] == key { + return parts[1], nil } - platform = imageOpts.platform } + return "", nil +} - inspect := defaultInspect(platform) +func (i *Image) Found() bool { + return i.inspect.ID != "" +} - image := &Image{ - docker: dockerClient, - repoName: repoName, - inspect: inspect, - layerPaths: make([]string, len(inspect.RootFS.Layers)), - downloadBaseOnce: &sync.Once{}, - } +func (i *Image) Valid() bool { + return i.Found() +} - if imageOpts.prevImageRepoName != "" { - if err := processPreviousImageOption(image, imageOpts.prevImageRepoName, platform, dockerClient); err != nil { - return nil, err - } - } +func (i *Image) GetAnnotateRefName() (string, error) { + return "", nil +} - if imageOpts.baseImageRepoName != "" { - if err := processBaseImageOption(image, imageOpts.baseImageRepoName, platform, dockerClient); err != nil { - return nil, err +func (i *Image) GetLayer(diffID string) (io.ReadCloser, error) { + for l := range i.inspect.RootFS.Layers { + if i.inspect.RootFS.Layers[l] != diffID { + continue } - } - - if image.inspect.Os == "windows" { - if err := prepareNewWindowsImage(image); err != nil { - return nil, err + if i.layerPaths[l] == "" { + if err := i.downloadBaseLayersOnce(); err != nil { + return nil, err + } + if i.layerPaths[l] == "" { + return nil, fmt.Errorf("fetching layer %q from daemon", diffID) + } } + return os.Open(i.layerPaths[l]) } - if imageOpts.createdAt.IsZero() { - image.createdAt = imgutil.NormalizedDateTime - } else { - image.createdAt = imageOpts.createdAt - } - - return image, nil + return nil, fmt.Errorf("image %q does not contain layer with diff ID %q", i.repoName, diffID) } -func validatePlatformOption(defaultPlatform imgutil.Platform, optionPlatform imgutil.Platform) error { - if optionPlatform.OS != "" && optionPlatform.OS != defaultPlatform.OS { - return fmt.Errorf("invalid os: platform os %q must match the daemon os %q", optionPlatform.OS, defaultPlatform.OS) - } +func (i *Image) History() ([]v1.History, error) { + return i.history, nil +} - return nil +func (i *Image) Identifier() (imgutil.Identifier, error) { + return IDIdentifier{ + ImageID: strings.TrimPrefix(i.inspect.ID, "sha256:"), + }, nil } -func processPreviousImageOption(image *Image, prevImageRepoName string, platform imgutil.Platform, dockerClient DockerClient) error { - if _, err := inspectOptionalImage(dockerClient, prevImageRepoName, platform); err != nil { - return err - } +func (i *Image) Label(key string) (string, error) { + labels := i.inspect.Config.Labels + return labels[key], nil +} - prevImage, err := NewImage(prevImageRepoName, dockerClient, FromBaseImage(prevImageRepoName)) - if err != nil { - return errors.Wrapf(err, "getting previous image %q", prevImageRepoName) +func (i *Image) Labels() (map[string]string, error) { + copiedLabels := make(map[string]string) + for i, l := range i.inspect.Config.Labels { + copiedLabels[i] = l } + return copiedLabels, nil +} - image.prevImage = prevImage - - return nil +func (i *Image) ManifestSize() (int64, error) { + return 0, nil } -func processBaseImageOption(image *Image, baseImageRepoName string, platform imgutil.Platform, dockerClient DockerClient) error { - inspect, err := inspectOptionalImage(dockerClient, baseImageRepoName, platform) - if err != nil { - return err - } +func (i *Image) Name() string { + return i.repoName +} - image.inspect = inspect - image.layerPaths = make([]string, len(image.inspect.RootFS.Layers)) +func (i *Image) OS() (string, error) { + return i.inspect.Os, nil +} - return nil +func (i *Image) OSVersion() (string, error) { + return i.inspect.OsVersion, nil } -func prepareNewWindowsImage(image *Image) error { - // only append base layer to empty image - if len(image.inspect.RootFS.Layers) > 0 { - return nil - } +func (i *Image) TopLayer() (string, error) { + all := i.inspect.RootFS.Layers - layerReader, err := layer.WindowsBaseLayer() - if err != nil { - return err + if len(all) == 0 { + return "", fmt.Errorf("image %q has no layers", i.repoName) } - layerFile, err := ioutil.TempFile("", "imgutil.local.image.windowsbaselayer") - if err != nil { - return errors.Wrap(err, "creating temp file") - } - defer layerFile.Close() + topLayer := all[len(all)-1] + return topLayer, nil +} - hasher := sha256.New() +func (i *Image) Variant() (string, error) { + return i.inspect.Variant, nil +} - multiWriter := io.MultiWriter(layerFile, hasher) +func (i *Image) WorkingDir() (string, error) { + return i.inspect.Config.WorkingDir, nil +} - if _, err := io.Copy(multiWriter, layerReader); err != nil { - return errors.Wrap(err, "copying base layer") - } +// setters - diffID := "sha256:" + hex.EncodeToString(hasher.Sum(nil)) +func (i *Image) AnnotateRefName(refName string) error { + return nil +} - if err := image.AddLayerWithDiffID(layerFile.Name(), diffID); err != nil { - return errors.Wrap(err, "adding base layer to image") - } +func (i *Image) Rename(name string) { + i.repoName = name +} +func (i *Image) SetArchitecture(architecture string) error { + i.inspect.Architecture = architecture return nil } -func (i *Image) Label(key string) (string, error) { - labels := i.inspect.Config.Labels - return labels[key], nil +func (i *Image) SetCmd(cmd ...string) error { + i.inspect.Config.Cmd = cmd + return nil } -func (i *Image) Labels() (map[string]string, error) { - copiedLabels := make(map[string]string) - for i, l := range i.inspect.Config.Labels { - copiedLabels[i] = l - } - return copiedLabels, nil +func (i *Image) SetEntrypoint(ep ...string) error { + i.inspect.Config.Entrypoint = ep + return nil } -func (i *Image) Env(key string) (string, error) { - for _, envVar := range i.inspect.Config.Env { - parts := strings.Split(envVar, "=") - if parts[0] == key { - return parts[1], nil +func (i *Image) SetEnv(key, val string) error { + ignoreCase := i.inspect.Os == "windows" + for idx, kv := range i.inspect.Config.Env { + parts := strings.SplitN(kv, "=", 2) + foundKey := parts[0] + searchKey := key + if ignoreCase { + foundKey = strings.ToUpper(foundKey) + searchKey = strings.ToUpper(searchKey) + } + if foundKey == searchKey { + i.inspect.Config.Env[idx] = fmt.Sprintf("%s=%s", key, val) + return nil } } - return "", nil + i.inspect.Config.Env = append(i.inspect.Config.Env, fmt.Sprintf("%s=%s", key, val)) + return nil } -func (i *Image) WorkingDir() (string, error) { - return i.inspect.Config.WorkingDir, nil +func (i *Image) SetHistory(history []v1.History) error { + i.history = history + return nil } -func (i *Image) Entrypoint() ([]string, error) { - return i.inspect.Config.Entrypoint, nil -} +func (i *Image) SetLabel(key, val string) error { + if i.inspect.Config.Labels == nil { + i.inspect.Config.Labels = map[string]string{} + } -func (i *Image) OS() (string, error) { - return i.inspect.Os, nil + i.inspect.Config.Labels[key] = val + return nil } -func (i *Image) OSVersion() (string, error) { - return i.inspect.OsVersion, nil +func (i *Image) SetOS(osVal string) error { + if osVal != i.inspect.Os { + return fmt.Errorf("invalid os: must match the daemon: %q", i.inspect.Os) + } + return nil } -func (i *Image) Architecture() (string, error) { - return i.inspect.Architecture, nil +func (i *Image) SetOSVersion(osVersion string) error { + i.inspect.OsVersion = osVersion + return nil } -func (i *Image) Rename(name string) { - i.repoName = name +func (i *Image) SetVariant(v string) error { + i.inspect.Variant = v + return nil } -func (i *Image) Name() string { - return i.repoName +func (i *Image) SetWorkingDir(dir string) error { + i.inspect.Config.WorkingDir = dir + return nil } -func (i *Image) Found() bool { - return i.inspect.ID != "" +// modifiers + +func (i *Image) AddLayer(path string) error { + f, err := os.Open(filepath.Clean(path)) + if err != nil { + return errors.Wrapf(err, "AddLayer: open layer: %s", path) + } + defer f.Close() + hasher := sha256.New() + if _, err := io.Copy(hasher, f); err != nil { + return errors.Wrapf(err, "AddLayer: calculate checksum: %s", path) + } + diffID := "sha256:" + hex.EncodeToString(hasher.Sum(make([]byte, 0, hasher.Size()))) + return i.AddLayerWithDiffIDAndHistory(path, diffID, v1.History{}) } -func (i *Image) Identifier() (imgutil.Identifier, error) { - return IDIdentifier{ - ImageID: strings.TrimPrefix(i.inspect.ID, "sha256:"), - }, nil +func (i *Image) AddLayerWithDiffID(path, diffID string) error { + return i.AddLayerWithDiffIDAndHistory(path, diffID, v1.History{}) } -func (i *Image) CreatedAt() (time.Time, error) { - createdAtTime := i.inspect.Created - createdTime, err := time.Parse(time.RFC3339Nano, createdAtTime) +func (i *Image) AddLayerWithDiffIDAndHistory(path, diffID string, history v1.History) error { + i.layerPaths = append(i.layerPaths, path) + i.inspect.RootFS.Layers = append(i.inspect.RootFS.Layers, diffID) + i.history = append(i.history, history) + return nil +} - if err != nil { - return time.Time{}, err +func (i *Image) Delete() error { + if !i.Found() { + return nil } - return createdTime, nil + options := types.ImageRemoveOptions{ + Force: true, + PruneChildren: true, + } + _, err := i.docker.ImageRemove(context.Background(), i.inspect.ID, options) + return err } func (i *Image) Rebase(baseTopLayer string, newBase imgutil.Image) error { @@ -326,719 +313,44 @@ func (i *Image) Rebase(baseTopLayer string, newBase imgutil.Image) error { return nil } -func (i *Image) SetLabel(key, val string) error { - if i.inspect.Config.Labels == nil { - i.inspect.Config.Labels = map[string]string{} - } - - i.inspect.Config.Labels[key] = val - return nil -} - -func (i *Image) SetOS(osVal string) error { - if osVal != i.inspect.Os { - return fmt.Errorf("invalid os: must match the daemon: %q", i.inspect.Os) - } - return nil -} - -func (i *Image) SetOSVersion(osVersion string) error { - i.inspect.OsVersion = osVersion - return nil -} - -func (i *Image) SetArchitecture(architecture string) error { - i.inspect.Architecture = architecture - return nil -} - func (i *Image) RemoveLabel(key string) error { delete(i.inspect.Config.Labels, key) return nil } -func (i *Image) SetEnv(key, val string) error { - ignoreCase := i.inspect.Os == "windows" - for idx, kv := range i.inspect.Config.Env { - parts := strings.SplitN(kv, "=", 2) - foundKey := parts[0] - searchKey := key - if ignoreCase { - foundKey = strings.ToUpper(foundKey) - searchKey = strings.ToUpper(searchKey) - } - if foundKey == searchKey { - i.inspect.Config.Env[idx] = fmt.Sprintf("%s=%s", key, val) - return nil - } - } - i.inspect.Config.Env = append(i.inspect.Config.Env, fmt.Sprintf("%s=%s", key, val)) - return nil -} - -func (i *Image) SetWorkingDir(dir string) error { - i.inspect.Config.WorkingDir = dir - return nil -} - -func (i *Image) SetEntrypoint(ep ...string) error { - i.inspect.Config.Entrypoint = ep - return nil -} - -func (i *Image) SetCmd(cmd ...string) error { - i.inspect.Config.Cmd = cmd - return nil -} - -func (i *Image) TopLayer() (string, error) { - all := i.inspect.RootFS.Layers - - if len(all) == 0 { - return "", fmt.Errorf("image %q has no layers", i.repoName) - } - - topLayer := all[len(all)-1] - return topLayer, nil -} - -func (i *Image) GetLayer(diffID string) (io.ReadCloser, error) { - for l := range i.inspect.RootFS.Layers { - if i.inspect.RootFS.Layers[l] != diffID { - continue - } - if i.layerPaths[l] == "" { - if err := i.downloadBaseLayersOnce(); err != nil { - return nil, err - } - if i.layerPaths[l] == "" { - return nil, fmt.Errorf("fetching layer %q from daemon", diffID) - } - } - return os.Open(i.layerPaths[l]) - } - - return nil, fmt.Errorf("image %q does not contain layer with diff ID %q", i.repoName, diffID) -} - -func (i *Image) AddLayer(path string) error { - f, err := os.Open(filepath.Clean(path)) - if err != nil { - return errors.Wrapf(err, "AddLayer: open layer: %s", path) - } - defer f.Close() - hasher := sha256.New() - if _, err := io.Copy(hasher, f); err != nil { - return errors.Wrapf(err, "AddLayer: calculate checksum: %s", path) - } - diffID := "sha256:" + hex.EncodeToString(hasher.Sum(make([]byte, 0, hasher.Size()))) - return i.AddLayerWithDiffID(path, diffID) -} - -func (i *Image) AddLayerWithDiffID(path, diffID string) error { - i.inspect.RootFS.Layers = append(i.inspect.RootFS.Layers, diffID) - i.layerPaths = append(i.layerPaths, path) - return nil -} - func (i *Image) ReuseLayer(diffID string) error { - if i.prevImage == nil { - return errors.New("failed to reuse layer because no previous image was provided") - } - if !i.prevImage.Found() { - return fmt.Errorf("failed to reuse layer because previous image %q was not found in daemon", i.prevImage.repoName) - } - - if err := i.prevImage.downloadBaseLayersOnce(); err != nil { + if err := i.ensureLayers(); err != nil { return err } - - for l := range i.prevImage.inspect.RootFS.Layers { - if i.prevImage.inspect.RootFS.Layers[l] == diffID { - return i.AddLayerWithDiffID(i.prevImage.layerPaths[l], diffID) + for idx := range i.prevImage.inspect.RootFS.Layers { + if i.prevImage.inspect.RootFS.Layers[idx] == diffID { + return i.AddLayerWithDiffIDAndHistory(i.prevImage.layerPaths[idx], diffID, i.prevImage.history[idx]) } } return fmt.Errorf("SHA %s was not found in %s", diffID, i.prevImage.Name()) } -func (i *Image) Save(additionalNames ...string) error { - return i.SaveAs(i.Name(), additionalNames...) -} - -func (i *Image) SaveAs(name string, additionalNames ...string) error { - // during the first save attempt some layers may be excluded. The docker daemon allows this if the given set - // of layers already exists in the daemon in the given order - inspect, err := i.doSaveAs(name) - if err != nil { - // populate all layer paths and try again without the above performance optimization. - if err := i.downloadBaseLayersOnce(); err != nil { - return err - } - - inspect, err = i.doSaveAs(name) - if err != nil { - saveErr := imgutil.SaveError{} - for _, n := range append([]string{name}, additionalNames...) { - saveErr.Errors = append(saveErr.Errors, imgutil.SaveDiagnostic{ImageName: n, Cause: err}) - } - return saveErr - } - } - i.inspect = inspect - - var errs []imgutil.SaveDiagnostic - for _, n := range append([]string{name}, additionalNames...) { - if err := i.docker.ImageTag(context.Background(), i.inspect.ID, n); err != nil { - errs = append(errs, imgutil.SaveDiagnostic{ImageName: n, Cause: err}) - } - } - - if len(errs) > 0 { - return imgutil.SaveError{Errors: errs} - } - - return nil -} - -func (i *Image) SaveFile() (string, error) { - f, err := os.CreateTemp("", "imgutil.local.image.export.*.tar") - if err != nil { - return "", errors.Wrap(err, "failed to create temporary file") - } - defer func() { - f.Close() - if err != nil { - os.Remove(f.Name()) - } - }() - - // All layers need to be present here. Missing layers are either due to utilization of: (1) WithPreviousImage(), - // or (2) FromBaseImage(). The former is only relevant if ReuseLayers() has been called which takes care of - // resolving them. The latter case needs to be handled explicitly. - if err := i.downloadBaseLayersOnce(); err != nil { - return "", errors.Wrap(err, "failed to fetch base layers") - } - - errs, _ := errgroup.WithContext(context.Background()) - pr, pw := io.Pipe() - - // File writer - errs.Go(func() error { - defer pr.Close() - _, err = f.ReadFrom(pr) - return err - }) - - // Tar producer - errs.Go(func() error { - defer pw.Close() - - tw := tar.NewWriter(pw) - defer tw.Close() - - config, err := i.newConfigFile() - if err != nil { - return errors.Wrap(err, "failed to generate config file") - } - - configName := fmt.Sprintf("/%x.json", sha256.Sum256(config)) - if err := addTextToTar(tw, configName, config); err != nil { - return errors.Wrap(err, "failed to add config file to tar archive") - } - - for _, path := range i.layerPaths { - err := func() error { - f, err := os.Open(filepath.Clean(path)) - if err != nil { - return errors.Wrapf(err, "failed to open layer path: %s", path) - } - defer f.Close() - - layerName := fmt.Sprintf("/%x.tar", sha256.Sum256([]byte(path))) - if err := addFileToTar(tw, layerName, f); err != nil { - return errors.Wrapf(err, "failed to add layer to tar archive from path: %s", path) - } - - return nil - }() - - if err != nil { - return err - } - } - - t, err := registryName.NewTag(i.repoName, registryName.WeakValidation) - if err != nil { - return errors.Wrap(err, "failed to create tag") - } - - layers := make([]string, 0, len(i.layerPaths)) - for _, path := range i.layerPaths { - layers = append(layers, fmt.Sprintf("/%x.tar", sha256.Sum256([]byte(path)))) - } - - manifest, err := json.Marshal([]map[string]interface{}{ - { - "Config": configName, - "RepoTags": []string{t.Name()}, - "Layers": layers, - }, - }) - if err != nil { - return errors.Wrap(err, "failed to create manifest") - } - - if err := addTextToTar(tw, "/manifest.json", manifest); err != nil { - return errors.Wrap(err, "failed to add manifest to tar archive") - } - - return nil - }) - - err = errs.Wait() - if err != nil { - return "", err - } - - return f.Name(), nil -} - -func (i *Image) doSaveAs(name string) (types.ImageInspect, error) { - ctx := context.Background() - done := make(chan error) - - t, err := registryName.NewTag(name, registryName.WeakValidation) - if err != nil { - return types.ImageInspect{}, err - } - - // returns valid 'name:tag' appending 'latest', if missing tag - repoName := t.Name() - - pr, pw := io.Pipe() - defer pw.Close() - go func() { - res, err := i.docker.ImageLoad(ctx, pr, true) - if err != nil { - done <- err - return - } - - // only return response error after response is drained and closed - responseErr := checkResponseError(res.Body) - drainCloseErr := ensureReaderClosed(res.Body) - if responseErr != nil { - done <- responseErr - return - } - if drainCloseErr != nil { - done <- drainCloseErr - } - - done <- nil - }() - - tw := tar.NewWriter(pw) - defer tw.Close() - - configFile, err := i.newConfigFile() - if err != nil { - return types.ImageInspect{}, errors.Wrap(err, "generating config file") - } - - id := fmt.Sprintf("%x", sha256.Sum256(configFile)) - if err := addTextToTar(tw, id+".json", configFile); err != nil { - return types.ImageInspect{}, err - } - - var blankIdx int - var layerPaths []string - for _, path := range i.layerPaths { - if path == "" { - layerName := fmt.Sprintf("blank_%d", blankIdx) - blankIdx++ - hdr := &tar.Header{Name: layerName, Mode: 0644, Size: 0} - if err := tw.WriteHeader(hdr); err != nil { - return types.ImageInspect{}, err - } - layerPaths = append(layerPaths, layerName) - } else { - layerName := fmt.Sprintf("/%x.tar", sha256.Sum256([]byte(path))) - f, err := os.Open(filepath.Clean(path)) - if err != nil { - return types.ImageInspect{}, err - } - defer f.Close() - if err := addFileToTar(tw, layerName, f); err != nil { - return types.ImageInspect{}, err - } - f.Close() - layerPaths = append(layerPaths, layerName) - } - } - - manifest, err := json.Marshal([]map[string]interface{}{ - { - "Config": id + ".json", - "RepoTags": []string{repoName}, - "Layers": layerPaths, - }, - }) - if err != nil { - return types.ImageInspect{}, err - } - - if err := addTextToTar(tw, "manifest.json", manifest); err != nil { - return types.ImageInspect{}, err - } - - tw.Close() - pw.Close() - err = <-done - if err != nil { - return types.ImageInspect{}, errors.Wrapf(err, "loading image %q. first error", i.repoName) - } - - inspect, _, err := i.docker.ImageInspectWithRaw(context.Background(), id) - if err != nil { - if client.IsErrNotFound(err) { - return types.ImageInspect{}, errors.Wrapf(err, "saving image %q", i.repoName) - } - return types.ImageInspect{}, err - } - - return inspect, nil -} - -func (i *Image) newConfigFile() ([]byte, error) { - cfg, err := v1Config(i.inspect, i.createdAt) - if err != nil { - return nil, err - } - return json.Marshal(cfg) -} - -func (i *Image) Delete() error { - if !i.Found() { - return nil - } - options := types.ImageRemoveOptions{ - Force: true, - PruneChildren: true, - } - _, err := i.docker.ImageRemove(context.Background(), i.inspect.ID, options) - return err -} - -func (i *Image) ManifestSize() (int64, error) { - return 0, nil -} - -func (i *Image) AnnotateRefName(refName string) error { - return nil -} - -func (i *Image) GetAnnotateRefName() (string, error) { - return "", nil -} - -// downloadBaseLayersOnce exports the base image from the daemon and populates layerPaths the first time it is called. -// subsequent calls do nothing. -func (i *Image) downloadBaseLayersOnce() error { - var err error - if !i.Found() { - return nil - } - i.downloadBaseOnce.Do(func() { - err = i.downloadBaseLayers() - }) - if err != nil { - return errors.Wrap(err, "fetching base layers") - } - return err -} - -func (i *Image) downloadBaseLayers() error { - ctx := context.Background() - - imageReader, err := i.docker.ImageSave(ctx, []string{i.inspect.ID}) - if err != nil { - return errors.Wrapf(err, "saving base image with ID %q from the docker daemon", i.inspect.ID) - } - defer ensureReaderClosed(imageReader) - - tmpDir, err := ioutil.TempDir("", "imgutil.local.image.") - if err != nil { - return errors.Wrap(err, "failed to create temp dir") - } - - err = untar(imageReader, tmpDir) - if err != nil { - return err - } - - mf, err := os.Open(filepath.Clean(filepath.Join(tmpDir, "manifest.json"))) - if err != nil { +func (i *Image) ReuseLayerWithHistory(diffID string, history v1.History) error { + if err := i.ensureLayers(); err != nil { return err } - defer mf.Close() - - var manifest []struct { - Config string - Layers []string - } - if err := json.NewDecoder(mf).Decode(&manifest); err != nil { - return err - } - - if len(manifest) != 1 { - return fmt.Errorf("manifest.json had unexpected number of entries: %d", len(manifest)) - } - - df, err := os.Open(filepath.Clean(filepath.Join(tmpDir, manifest[0].Config))) - if err != nil { - return err - } - defer df.Close() - - var details struct { - RootFS struct { - DiffIDs []string `json:"diff_ids"` - } `json:"rootfs"` - } - - if err = json.NewDecoder(df).Decode(&details); err != nil { - return err - } - - for l := range details.RootFS.DiffIDs { - i.layerPaths[l] = filepath.Join(tmpDir, manifest[0].Layers[l]) - } - - for l := range i.layerPaths { - if i.layerPaths[l] == "" { - return errors.New("failed to download all base layers from daemon") + for idx := range i.prevImage.inspect.RootFS.Layers { + if i.prevImage.inspect.RootFS.Layers[idx] == diffID { + return i.AddLayerWithDiffIDAndHistory(i.prevImage.layerPaths[idx], diffID, history) } } - - return nil + return fmt.Errorf("SHA %s was not found in %s", diffID, i.prevImage.Name()) } -func addTextToTar(tw *tar.Writer, name string, contents []byte) error { - hdr := &tar.Header{Name: name, Mode: 0644, Size: int64(len(contents))} - if err := tw.WriteHeader(hdr); err != nil { - return err +func (i *Image) ensureLayers() error { + if i.prevImage == nil { + return errors.New("failed to reuse layer because no previous image was provided") } - _, err := tw.Write(contents) - return err -} - -func addFileToTar(tw *tar.Writer, name string, contents *os.File) error { - fi, err := contents.Stat() - if err != nil { - return err + if !i.prevImage.Found() { + return fmt.Errorf("failed to reuse layer because previous image %q was not found in daemon", i.prevImage.repoName) } - hdr := &tar.Header{Name: name, Mode: 0644, Size: fi.Size()} - if err := tw.WriteHeader(hdr); err != nil { + if err := i.prevImage.downloadBaseLayersOnce(); err != nil { return err } - _, err = io.Copy(tw, contents) - return err -} - -func untar(r io.Reader, dest string) error { - tr := tar.NewReader(r) - for { - hdr, err := tr.Next() - if err == io.EOF { - // end of tar archive - return nil - } - if err != nil { - return err - } - - path, err := cleanPath(dest, hdr.Name) - if err != nil { - return err - } - - switch hdr.Typeflag { - case tar.TypeDir: - if err := os.MkdirAll(path, hdr.FileInfo().Mode()); err != nil { - return err - } - case tar.TypeReg, tar.TypeRegA: - _, err := os.Stat(filepath.Dir(path)) - if os.IsNotExist(err) { - if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil { - return err - } - } - - fh, err := os.OpenFile(filepath.Clean(path), os.O_CREATE|os.O_WRONLY, hdr.FileInfo().Mode()) - if err != nil { - return err - } - if _, err := io.Copy(fh, tr); err != nil { - fh.Close() - return err - } // #nosec G110 - fh.Close() - case tar.TypeSymlink: - _, err := os.Stat(filepath.Dir(path)) - if os.IsNotExist(err) { - if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil { - return err - } - } - - if err := os.Symlink(hdr.Linkname, path); err != nil { - return err - } - default: - return fmt.Errorf("unknown file type in tar %d", hdr.Typeflag) - } - } -} - -func cleanPath(dest, header string) (string, error) { - joined := filepath.Join(dest, header) - if strings.HasPrefix(joined, filepath.Clean(dest)) { - return joined, nil - } - return "", fmt.Errorf("bad filepath: %s", header) -} - -func inspectOptionalImage(docker DockerClient, imageName string, platform imgutil.Platform) (types.ImageInspect, error) { - var ( - err error - inspect types.ImageInspect - ) - - if inspect, _, err = docker.ImageInspectWithRaw(context.Background(), imageName); err != nil { - if client.IsErrNotFound(err) { - return defaultInspect(platform), nil - } - - return types.ImageInspect{}, errors.Wrapf(err, "verifying image %q", imageName) - } - - return inspect, nil -} - -func defaultInspect(platform imgutil.Platform) types.ImageInspect { - return types.ImageInspect{ - Os: platform.OS, - Architecture: platform.Architecture, - OsVersion: platform.OSVersion, - Config: &container.Config{}, - } -} - -func defaultPlatform(dockerClient DockerClient) (imgutil.Platform, error) { - daemonInfo, err := dockerClient.Info(context.Background()) - if err != nil { - return imgutil.Platform{}, err - } - - return imgutil.Platform{ - OS: daemonInfo.OSType, - Architecture: "amd64", - }, nil -} - -func v1Config(inspect types.ImageInspect, createdAt time.Time) (v1.ConfigFile, error) { - history := make([]v1.History, len(inspect.RootFS.Layers)) - for i := range history { - // zero history - history[i] = v1.History{ - Created: v1.Time{Time: createdAt}, - } - } - diffIDs := make([]v1.Hash, len(inspect.RootFS.Layers)) - for i, layer := range inspect.RootFS.Layers { - hash, err := v1.NewHash(layer) - if err != nil { - return v1.ConfigFile{}, err - } - diffIDs[i] = hash - } - exposedPorts := make(map[string]struct{}, len(inspect.Config.ExposedPorts)) - for key, val := range inspect.Config.ExposedPorts { - exposedPorts[string(key)] = val - } - var config v1.Config - if inspect.Config != nil { - var healthcheck *v1.HealthConfig - if inspect.Config.Healthcheck != nil { - healthcheck = &v1.HealthConfig{ - Test: inspect.Config.Healthcheck.Test, - Interval: inspect.Config.Healthcheck.Interval, - Timeout: inspect.Config.Healthcheck.Timeout, - StartPeriod: inspect.Config.Healthcheck.StartPeriod, - Retries: inspect.Config.Healthcheck.Retries, - } - } - config = v1.Config{ - AttachStderr: inspect.Config.AttachStderr, - AttachStdin: inspect.Config.AttachStdin, - AttachStdout: inspect.Config.AttachStdout, - Cmd: inspect.Config.Cmd, - Healthcheck: healthcheck, - Domainname: inspect.Config.Domainname, - Entrypoint: inspect.Config.Entrypoint, - Env: inspect.Config.Env, - Hostname: inspect.Config.Hostname, - Image: inspect.Config.Image, - Labels: inspect.Config.Labels, - OnBuild: inspect.Config.OnBuild, - OpenStdin: inspect.Config.OpenStdin, - StdinOnce: inspect.Config.StdinOnce, - Tty: inspect.Config.Tty, - User: inspect.Config.User, - Volumes: inspect.Config.Volumes, - WorkingDir: inspect.Config.WorkingDir, - ExposedPorts: exposedPorts, - ArgsEscaped: inspect.Config.ArgsEscaped, - NetworkDisabled: inspect.Config.NetworkDisabled, - MacAddress: inspect.Config.MacAddress, - StopSignal: inspect.Config.StopSignal, - Shell: inspect.Config.Shell, - } - } - return v1.ConfigFile{ - Architecture: inspect.Architecture, - Created: v1.Time{Time: createdAt}, - History: history, - OS: inspect.Os, - OSVersion: inspect.OsVersion, - RootFS: v1.RootFS{ - Type: "layers", - DiffIDs: diffIDs, - }, - Config: config, - }, nil -} - -func checkResponseError(r io.Reader) error { - decoder := json.NewDecoder(r) - var jsonMessage jsonmessage.JSONMessage - if err := decoder.Decode(&jsonMessage); err != nil { - return errors.Wrapf(err, "parsing daemon response") - } - - if jsonMessage.Error != nil { - return errors.Wrap(jsonMessage.Error, "embedded daemon response") - } return nil } - -// ensureReaderClosed drains and closes and reader, returning the first error -func ensureReaderClosed(r io.ReadCloser) error { - _, err := io.Copy(ioutil.Discard, r) - if closeErr := r.Close(); closeErr != nil && err == nil { - err = closeErr - } - return err -} diff --git a/vendor/github.com/buildpacks/imgutil/local/new.go b/vendor/github.com/buildpacks/imgutil/local/new.go new file mode 100644 index 0000000000..0c3f52f602 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/local/new.go @@ -0,0 +1,238 @@ +package local + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "sync" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/image" + "github.com/docker/docker/client" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/pkg/errors" + + "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/layer" +) + +// NewImage returns a new Image that can be modified and saved to a registry. +func NewImage(repoName string, dockerClient DockerClient, ops ...ImageOption) (*Image, error) { + imageOpts := &options{} + for _, op := range ops { + if err := op(imageOpts); err != nil { + return nil, err + } + } + + platform, err := defaultPlatform(dockerClient) + if err != nil { + return nil, err + } + + if (imageOpts.platform != imgutil.Platform{}) { + if err := validatePlatformOption(platform, imageOpts.platform); err != nil { + return nil, err + } + platform = imageOpts.platform + } + + inspect := defaultInspect(platform) + + image := &Image{ + docker: dockerClient, + repoName: repoName, + inspect: inspect, + history: make([]v1.History, len(inspect.RootFS.Layers)), + layerPaths: make([]string, len(inspect.RootFS.Layers)), + downloadBaseOnce: &sync.Once{}, + withHistory: imageOpts.withHistory, + } + + if imageOpts.prevImageRepoName != "" { + if err := processPreviousImageOption(image, imageOpts.prevImageRepoName, platform, dockerClient); err != nil { + return nil, err + } + } + + if imageOpts.baseImageRepoName != "" { + if err := processBaseImageOption(image, imageOpts.baseImageRepoName, platform, dockerClient); err != nil { + return nil, err + } + } + + if image.inspect.Os == "windows" { + if err := prepareNewWindowsImage(image); err != nil { + return nil, err + } + } + + if imageOpts.createdAt.IsZero() { + image.createdAt = imgutil.NormalizedDateTime + } else { + image.createdAt = imageOpts.createdAt + } + + if imageOpts.config != nil { + image.inspect.Config = imageOpts.config + } + + return image, nil +} + +func defaultPlatform(dockerClient DockerClient) (imgutil.Platform, error) { + daemonInfo, err := dockerClient.Info(context.Background()) + if err != nil { + return imgutil.Platform{}, err + } + + return imgutil.Platform{ + OS: daemonInfo.OSType, + Architecture: "amd64", + }, nil +} + +func validatePlatformOption(defaultPlatform imgutil.Platform, optionPlatform imgutil.Platform) error { + if optionPlatform.OS != "" && optionPlatform.OS != defaultPlatform.OS { + return fmt.Errorf("invalid os: platform os %q must match the daemon os %q", optionPlatform.OS, defaultPlatform.OS) + } + + return nil +} + +func defaultInspect(platform imgutil.Platform) types.ImageInspect { + return types.ImageInspect{ + Os: platform.OS, + Architecture: platform.Architecture, + OsVersion: platform.OSVersion, + Config: &container.Config{}, + } +} + +func processPreviousImageOption(image *Image, prevImageRepoName string, platform imgutil.Platform, dockerClient DockerClient) error { + inspect, err := inspectOptionalImage(dockerClient, prevImageRepoName, platform) + if err != nil { + return err + } + + history, err := historyOptionalImage(dockerClient, prevImageRepoName) + if err != nil { + return err + } + + v1History := toV1History(history) + if len(history) != len(inspect.RootFS.Layers) { + v1History = make([]v1.History, len(inspect.RootFS.Layers)) + } + + prevImage, err := NewImage(prevImageRepoName, dockerClient, FromBaseImage(prevImageRepoName)) + if err != nil { + return errors.Wrapf(err, "getting previous image %q", prevImageRepoName) + } + + image.prevImage = prevImage + image.prevImage.history = v1History + + return nil +} + +func inspectOptionalImage(docker DockerClient, imageName string, platform imgutil.Platform) (types.ImageInspect, error) { + var ( + err error + inspect types.ImageInspect + ) + if inspect, _, err = docker.ImageInspectWithRaw(context.Background(), imageName); err != nil { + if client.IsErrNotFound(err) { + return defaultInspect(platform), nil + } + + return types.ImageInspect{}, errors.Wrapf(err, "verifying image %q", imageName) + } + return inspect, nil +} + +func historyOptionalImage(docker DockerClient, imageName string) ([]image.HistoryResponseItem, error) { + var ( + history []image.HistoryResponseItem + err error + ) + if history, err = docker.ImageHistory(context.Background(), imageName); err != nil { + if client.IsErrNotFound(err) { + return nil, nil + } + return nil, fmt.Errorf("getting history for image: %w", err) + } + return history, nil +} + +func processBaseImageOption(image *Image, baseImageRepoName string, platform imgutil.Platform, dockerClient DockerClient) error { + inspect, err := inspectOptionalImage(dockerClient, baseImageRepoName, platform) + if err != nil { + return err + } + + history, err := historyOptionalImage(dockerClient, baseImageRepoName) + if err != nil { + return err + } + + v1History := imgutil.NormalizedHistory(toV1History(history), len(inspect.RootFS.Layers)) + + image.inspect = inspect + image.history = v1History + image.layerPaths = make([]string, len(image.inspect.RootFS.Layers)) + + return nil +} + +func toV1History(history []image.HistoryResponseItem) []v1.History { + v1History := make([]v1.History, len(history)) + for offset, h := range history { + // the daemon reports history in reverse order, so build up the array backwards + v1History[len(v1History)-offset-1] = v1.History{ + Created: v1.Time{Time: time.Unix(h.Created, 0)}, + CreatedBy: h.CreatedBy, + Comment: h.Comment, + } + } + return v1History +} + +func prepareNewWindowsImage(image *Image) error { + // only append base layer to empty image + if len(image.inspect.RootFS.Layers) > 0 { + return nil + } + + layerReader, err := layer.WindowsBaseLayer() + if err != nil { + return err + } + + layerFile, err := ioutil.TempFile("", "imgutil.local.image.windowsbaselayer") + if err != nil { + return errors.Wrap(err, "creating temp file") + } + defer layerFile.Close() + + hasher := sha256.New() + + multiWriter := io.MultiWriter(layerFile, hasher) + + if _, err := io.Copy(multiWriter, layerReader); err != nil { + return errors.Wrap(err, "copying base layer") + } + + diffID := "sha256:" + hex.EncodeToString(hasher.Sum(nil)) + + if err := image.AddLayerWithDiffIDAndHistory(layerFile.Name(), diffID, v1.History{}); err != nil { + return errors.Wrap(err, "adding base layer to image") + } + + return nil +} diff --git a/vendor/github.com/buildpacks/imgutil/local/options.go b/vendor/github.com/buildpacks/imgutil/local/options.go new file mode 100644 index 0000000000..c8563d45c2 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/local/options.go @@ -0,0 +1,73 @@ +package local + +import ( + "time" + + "github.com/docker/docker/api/types/container" + + "github.com/buildpacks/imgutil" +) + +type ImageOption func(*options) error + +type options struct { + platform imgutil.Platform + baseImageRepoName string + prevImageRepoName string + withHistory bool + createdAt time.Time + config *container.Config +} + +// FromBaseImage loads an existing image as the config and layers for the new image. +// Ignored if image is not found. +func FromBaseImage(imageName string) ImageOption { + return func(i *options) error { + i.baseImageRepoName = imageName + return nil + } +} + +// WithCreatedAt lets a caller set the created at timestamp for the image. +// Defaults for a new image is imgutil.NormalizedDateTime +func WithCreatedAt(createdAt time.Time) ImageOption { + return func(opts *options) error { + opts.createdAt = createdAt + return nil + } +} + +func WithConfig(config *container.Config) ImageOption { + return func(opts *options) error { + opts.config = config + return nil + } +} + +// WithDefaultPlatform provides Architecture/OS/OSVersion defaults for the new image. +// Defaults for a new image are ignored when FromBaseImage returns an image. +func WithDefaultPlatform(platform imgutil.Platform) ImageOption { + return func(i *options) error { + i.platform = platform + return nil + } +} + +// WithHistory if provided will configure the image to preserve history when saved +// (including any history from the base image if valid). +func WithHistory() ImageOption { + return func(opts *options) error { + opts.withHistory = true + return nil + } +} + +// WithPreviousImage loads an existing image as a source for reusable layers. +// Use with ReuseLayer(). +// Ignored if image is not found. +func WithPreviousImage(imageName string) ImageOption { + return func(i *options) error { + i.prevImageRepoName = imageName + return nil + } +} diff --git a/vendor/github.com/buildpacks/imgutil/local/save.go b/vendor/github.com/buildpacks/imgutil/local/save.go new file mode 100644 index 0000000000..7a74810969 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/local/save.go @@ -0,0 +1,273 @@ +package local + +import ( + "archive/tar" + "context" + "crypto/sha256" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" + "github.com/docker/docker/pkg/jsonmessage" + registryName "github.com/google/go-containerregistry/pkg/name" + "github.com/pkg/errors" + + "github.com/buildpacks/imgutil" +) + +func (i *Image) Save(additionalNames ...string) error { + return i.SaveAs(i.Name(), additionalNames...) +} + +func (i *Image) SaveAs(name string, additionalNames ...string) error { + // during the first save attempt some layers may be excluded. The docker daemon allows this if the given set + // of layers already exists in the daemon in the given order + inspect, err := i.doSaveAs(name) + if err != nil { + // populate all layer paths and try again without the above performance optimization. + if err := i.downloadBaseLayersOnce(); err != nil { + return err + } + + inspect, err = i.doSaveAs(name) + if err != nil { + saveErr := imgutil.SaveError{} + for _, n := range append([]string{name}, additionalNames...) { + saveErr.Errors = append(saveErr.Errors, imgutil.SaveDiagnostic{ImageName: n, Cause: err}) + } + return saveErr + } + } + i.inspect = inspect + + var errs []imgutil.SaveDiagnostic + for _, n := range append([]string{name}, additionalNames...) { + if err := i.docker.ImageTag(context.Background(), i.inspect.ID, n); err != nil { + errs = append(errs, imgutil.SaveDiagnostic{ImageName: n, Cause: err}) + } + } + + if len(errs) > 0 { + return imgutil.SaveError{Errors: errs} + } + + return nil +} + +func (i *Image) doSaveAs(name string) (types.ImageInspect, error) { + ctx := context.Background() + done := make(chan error) + + t, err := registryName.NewTag(name, registryName.WeakValidation) + if err != nil { + return types.ImageInspect{}, err + } + + // returns valid 'name:tag' appending 'latest', if missing tag + repoName := t.Name() + + pr, pw := io.Pipe() + defer pw.Close() + go func() { + res, err := i.docker.ImageLoad(ctx, pr, true) + if err != nil { + done <- err + return + } + + // only return response error after response is drained and closed + responseErr := checkResponseError(res.Body) + drainCloseErr := ensureReaderClosed(res.Body) + if responseErr != nil { + done <- responseErr + return + } + if drainCloseErr != nil { + done <- drainCloseErr + } + + done <- nil + }() + + tw := tar.NewWriter(pw) + defer tw.Close() + + configFile, err := i.newConfigFile() + if err != nil { + return types.ImageInspect{}, errors.Wrap(err, "generating config file") + } + + id := fmt.Sprintf("%x", sha256.Sum256(configFile)) + if err := addTextToTar(tw, id+".json", configFile); err != nil { + return types.ImageInspect{}, err + } + + var blankIdx int + var layerPaths []string + for _, path := range i.layerPaths { + if path == "" { + layerName := fmt.Sprintf("blank_%d", blankIdx) + blankIdx++ + hdr := &tar.Header{Name: layerName, Mode: 0644, Size: 0} + if err := tw.WriteHeader(hdr); err != nil { + return types.ImageInspect{}, err + } + layerPaths = append(layerPaths, layerName) + } else { + layerName := fmt.Sprintf("/%x.tar", sha256.Sum256([]byte(path))) + f, err := os.Open(filepath.Clean(path)) + if err != nil { + return types.ImageInspect{}, err + } + defer f.Close() + if err := addFileToTar(tw, layerName, f); err != nil { + return types.ImageInspect{}, err + } + f.Close() + layerPaths = append(layerPaths, layerName) + } + } + + manifest, err := json.Marshal([]map[string]interface{}{ + { + "Config": id + ".json", + "RepoTags": []string{repoName}, + "Layers": layerPaths, + }, + }) + if err != nil { + return types.ImageInspect{}, err + } + + if err := addTextToTar(tw, "manifest.json", manifest); err != nil { + return types.ImageInspect{}, err + } + + tw.Close() + pw.Close() + err = <-done + if err != nil { + return types.ImageInspect{}, errors.Wrapf(err, "loading image %q. first error", i.repoName) + } + + inspect, _, err := i.docker.ImageInspectWithRaw(context.Background(), id) + if err != nil { + if client.IsErrNotFound(err) { + return types.ImageInspect{}, errors.Wrapf(err, "saving image %q", i.repoName) + } + return types.ImageInspect{}, err + } + + return inspect, nil +} + +// downloadBaseLayersOnce exports the base image from the daemon and populates layerPaths the first time it is called. +// subsequent calls do nothing. +func (i *Image) downloadBaseLayersOnce() error { + var err error + if !i.Found() { + return nil + } + i.downloadBaseOnce.Do(func() { + err = i.downloadBaseLayers() + }) + if err != nil { + return errors.Wrap(err, "fetching base layers") + } + return err +} + +func (i *Image) downloadBaseLayers() error { + ctx := context.Background() + + imageReader, err := i.docker.ImageSave(ctx, []string{i.inspect.ID}) + if err != nil { + return errors.Wrapf(err, "saving base image with ID %q from the docker daemon", i.inspect.ID) + } + defer ensureReaderClosed(imageReader) + + tmpDir, err := ioutil.TempDir("", "imgutil.local.image.") + if err != nil { + return errors.Wrap(err, "failed to create temp dir") + } + + err = untar(imageReader, tmpDir) + if err != nil { + return err + } + + mf, err := os.Open(filepath.Clean(filepath.Join(tmpDir, "manifest.json"))) + if err != nil { + return err + } + defer mf.Close() + + var manifest []struct { + Config string + Layers []string + } + if err := json.NewDecoder(mf).Decode(&manifest); err != nil { + return err + } + + if len(manifest) != 1 { + return fmt.Errorf("manifest.json had unexpected number of entries: %d", len(manifest)) + } + + df, err := os.Open(filepath.Clean(filepath.Join(tmpDir, manifest[0].Config))) + if err != nil { + return err + } + defer df.Close() + + var details struct { + RootFS struct { + DiffIDs []string `json:"diff_ids"` + } `json:"rootfs"` + } + + if err = json.NewDecoder(df).Decode(&details); err != nil { + return err + } + + for l := range details.RootFS.DiffIDs { + i.layerPaths[l] = filepath.Join(tmpDir, manifest[0].Layers[l]) + } + + for l := range i.layerPaths { + if i.layerPaths[l] == "" { + return errors.New("failed to download all base layers from daemon") + } + } + + return nil +} + +// helpers + +func checkResponseError(r io.Reader) error { + decoder := json.NewDecoder(r) + var jsonMessage jsonmessage.JSONMessage + if err := decoder.Decode(&jsonMessage); err != nil { + return errors.Wrapf(err, "parsing daemon response") + } + + if jsonMessage.Error != nil { + return errors.Wrap(jsonMessage.Error, "embedded daemon response") + } + return nil +} + +// ensureReaderClosed drains and closes and reader, returning the first error +func ensureReaderClosed(r io.ReadCloser) error { + _, err := io.Copy(ioutil.Discard, r) + if closeErr := r.Close(); closeErr != nil && err == nil { + err = closeErr + } + return err +} diff --git a/vendor/github.com/buildpacks/imgutil/local/save_file.go b/vendor/github.com/buildpacks/imgutil/local/save_file.go new file mode 100644 index 0000000000..9931a343d6 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/local/save_file.go @@ -0,0 +1,296 @@ +package local + +import ( + "archive/tar" + "context" + "crypto/sha256" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "time" + + "github.com/docker/docker/api/types" + registryName "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/pkg/errors" + "golang.org/x/sync/errgroup" +) + +func (i *Image) SaveFile() (string, error) { + f, err := os.CreateTemp("", "imgutil.local.image.export.*.tar") + if err != nil { + return "", errors.Wrap(err, "failed to create temporary file") + } + defer func() { + f.Close() + if err != nil { + os.Remove(f.Name()) + } + }() + + // All layers need to be present here. Missing layers are either due to utilization of: (1) WithPreviousImage(), + // or (2) FromBaseImage(). The former is only relevant if ReuseLayers() has been called which takes care of + // resolving them. The latter case needs to be handled explicitly. + if err := i.downloadBaseLayersOnce(); err != nil { + return "", errors.Wrap(err, "failed to fetch base layers") + } + + errs, _ := errgroup.WithContext(context.Background()) + pr, pw := io.Pipe() + + // File writer + errs.Go(func() error { + defer pr.Close() + _, err = f.ReadFrom(pr) + return err + }) + + // Tar producer + errs.Go(func() error { + defer pw.Close() + + tw := tar.NewWriter(pw) + defer tw.Close() + + config, err := i.newConfigFile() + if err != nil { + return errors.Wrap(err, "failed to generate config file") + } + + configName := fmt.Sprintf("/%x.json", sha256.Sum256(config)) + if err := addTextToTar(tw, configName, config); err != nil { + return errors.Wrap(err, "failed to add config file to tar archive") + } + + for _, path := range i.layerPaths { + err := func() error { + f, err := os.Open(filepath.Clean(path)) + if err != nil { + return errors.Wrapf(err, "failed to open layer path: %s", path) + } + defer f.Close() + + layerName := fmt.Sprintf("/%x.tar", sha256.Sum256([]byte(path))) + if err := addFileToTar(tw, layerName, f); err != nil { + return errors.Wrapf(err, "failed to add layer to tar archive from path: %s", path) + } + + return nil + }() + + if err != nil { + return err + } + } + + t, err := registryName.NewTag(i.repoName, registryName.WeakValidation) + if err != nil { + return errors.Wrap(err, "failed to create tag") + } + + layers := make([]string, 0, len(i.layerPaths)) + for _, path := range i.layerPaths { + layers = append(layers, fmt.Sprintf("/%x.tar", sha256.Sum256([]byte(path)))) + } + + manifest, err := json.Marshal([]map[string]interface{}{ + { + "Config": configName, + "RepoTags": []string{t.Name()}, + "Layers": layers, + }, + }) + if err != nil { + return errors.Wrap(err, "failed to create manifest") + } + + if err := addTextToTar(tw, "/manifest.json", manifest); err != nil { + return errors.Wrap(err, "failed to add manifest to tar archive") + } + + return nil + }) + + err = errs.Wait() + if err != nil { + return "", err + } + + return f.Name(), nil +} + +func (i *Image) newConfigFile() ([]byte, error) { + if !i.withHistory { + // zero history + i.history = make([]v1.History, len(i.inspect.RootFS.Layers)) + } + cfg, err := v1Config(i.inspect, i.createdAt, i.history) + if err != nil { + return nil, err + } + return json.Marshal(cfg) +} + +// helpers + +func addFileToTar(tw *tar.Writer, name string, contents *os.File) error { + fi, err := contents.Stat() + if err != nil { + return err + } + hdr := &tar.Header{Name: name, Mode: 0644, Size: fi.Size()} + if err := tw.WriteHeader(hdr); err != nil { + return err + } + _, err = io.Copy(tw, contents) + return err +} + +func addTextToTar(tw *tar.Writer, name string, contents []byte) error { + hdr := &tar.Header{Name: name, Mode: 0644, Size: int64(len(contents))} + if err := tw.WriteHeader(hdr); err != nil { + return err + } + _, err := tw.Write(contents) + return err +} + +func cleanPath(dest, header string) (string, error) { + joined := filepath.Join(dest, header) + if strings.HasPrefix(joined, filepath.Clean(dest)) { + return joined, nil + } + return "", fmt.Errorf("bad filepath: %s", header) +} + +func untar(r io.Reader, dest string) error { + tr := tar.NewReader(r) + for { + hdr, err := tr.Next() + if err == io.EOF { + // end of tar archive + return nil + } + if err != nil { + return err + } + + path, err := cleanPath(dest, hdr.Name) + if err != nil { + return err + } + + switch hdr.Typeflag { + case tar.TypeDir: + if err := os.MkdirAll(path, hdr.FileInfo().Mode()); err != nil { + return err + } + case tar.TypeReg: + _, err := os.Stat(filepath.Dir(path)) + if os.IsNotExist(err) { + if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil { + return err + } + } + + fh, err := os.OpenFile(filepath.Clean(path), os.O_CREATE|os.O_WRONLY, hdr.FileInfo().Mode()) + if err != nil { + return err + } + if _, err := io.Copy(fh, tr); err != nil { + fh.Close() + return err + } // #nosec G110 + fh.Close() + case tar.TypeSymlink: + _, err := os.Stat(filepath.Dir(path)) + if os.IsNotExist(err) { + if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil { + return err + } + } + + if err := os.Symlink(hdr.Linkname, path); err != nil { + return err + } + default: + return fmt.Errorf("unknown file type in tar %d", hdr.Typeflag) + } + } +} + +func v1Config(inspect types.ImageInspect, createdAt time.Time, history []v1.History) (v1.ConfigFile, error) { + if len(history) != len(inspect.RootFS.Layers) { + history = make([]v1.History, len(inspect.RootFS.Layers)) + } + for i := range history { + // zero history + history[i].Created = v1.Time{Time: createdAt} + } + diffIDs := make([]v1.Hash, len(inspect.RootFS.Layers)) + for i, layer := range inspect.RootFS.Layers { + hash, err := v1.NewHash(layer) + if err != nil { + return v1.ConfigFile{}, err + } + diffIDs[i] = hash + } + exposedPorts := make(map[string]struct{}, len(inspect.Config.ExposedPorts)) + for key, val := range inspect.Config.ExposedPorts { + exposedPorts[string(key)] = val + } + var config v1.Config + if inspect.Config != nil { + var healthcheck *v1.HealthConfig + if inspect.Config.Healthcheck != nil { + healthcheck = &v1.HealthConfig{ + Test: inspect.Config.Healthcheck.Test, + Interval: inspect.Config.Healthcheck.Interval, + Timeout: inspect.Config.Healthcheck.Timeout, + StartPeriod: inspect.Config.Healthcheck.StartPeriod, + Retries: inspect.Config.Healthcheck.Retries, + } + } + config = v1.Config{ + AttachStderr: inspect.Config.AttachStderr, + AttachStdin: inspect.Config.AttachStdin, + AttachStdout: inspect.Config.AttachStdout, + Cmd: inspect.Config.Cmd, + Healthcheck: healthcheck, + Domainname: inspect.Config.Domainname, + Entrypoint: inspect.Config.Entrypoint, + Env: inspect.Config.Env, + Hostname: inspect.Config.Hostname, + Image: inspect.Config.Image, + Labels: inspect.Config.Labels, + OnBuild: inspect.Config.OnBuild, + OpenStdin: inspect.Config.OpenStdin, + StdinOnce: inspect.Config.StdinOnce, + Tty: inspect.Config.Tty, + User: inspect.Config.User, + Volumes: inspect.Config.Volumes, + WorkingDir: inspect.Config.WorkingDir, + ExposedPorts: exposedPorts, + ArgsEscaped: inspect.Config.ArgsEscaped, + NetworkDisabled: inspect.Config.NetworkDisabled, + MacAddress: inspect.Config.MacAddress, + StopSignal: inspect.Config.StopSignal, + Shell: inspect.Config.Shell, + } + } + return v1.ConfigFile{ + Architecture: inspect.Architecture, + Created: v1.Time{Time: createdAt}, + History: history, + OS: inspect.Os, + OSVersion: inspect.OsVersion, + RootFS: v1.RootFS{ + Type: "layers", + DiffIDs: diffIDs, + }, + Config: config, + }, nil +} diff --git a/vendor/github.com/buildpacks/imgutil/remote/new.go b/vendor/github.com/buildpacks/imgutil/remote/new.go new file mode 100644 index 0000000000..7c0c4f0e48 --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/remote/new.go @@ -0,0 +1,315 @@ +package remote + +import ( + "crypto/tls" + "io" + "net/http" + "strings" + "time" + + "github.com/google/go-containerregistry/pkg/authn" + "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/empty" + "github.com/google/go-containerregistry/pkg/v1/mutate" + "github.com/google/go-containerregistry/pkg/v1/remote" + "github.com/google/go-containerregistry/pkg/v1/remote/transport" + "github.com/google/go-containerregistry/pkg/v1/tarball" + "github.com/pkg/errors" + + "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/layer" +) + +// NewImage returns a new Image that can be modified and saved to a Docker daemon. +func NewImage(repoName string, keychain authn.Keychain, ops ...ImageOption) (*Image, error) { + imageOpts := &options{} + for _, op := range ops { + if err := op(imageOpts); err != nil { + return nil, err + } + } + + platform := defaultPlatform() + if (imageOpts.platform != imgutil.Platform{}) { + platform = imageOpts.platform + } + + image, err := emptyImage(platform) + if err != nil { + return nil, err + } + + ri := &Image{ + keychain: keychain, + repoName: repoName, + image: image, + addEmptyLayerOnSave: imageOpts.addEmptyLayerOnSave, + withHistory: imageOpts.withHistory, + registrySettings: imageOpts.registrySettings, + } + + if imageOpts.prevImageRepoName != "" { + if err := processPreviousImageOption(ri, imageOpts.prevImageRepoName, platform); err != nil { + return nil, err + } + } + + if imageOpts.baseImageRepoName != "" { + if err := processBaseImageOption(ri, imageOpts.baseImageRepoName, platform); err != nil { + return nil, err + } + } + + imgOS, err := ri.OS() + if err != nil { + return nil, err + } + if imgOS == "windows" { + if err := prepareNewWindowsImage(ri); err != nil { + return nil, err + } + } + + if imageOpts.createdAt.IsZero() { + ri.createdAt = imgutil.NormalizedDateTime + } else { + ri.createdAt = imageOpts.createdAt + } + + if imageOpts.config != nil { + if ri.image, err = mutate.Config(ri.image, *imageOpts.config); err != nil { + return nil, err + } + } + + ri.requestedMediaTypes = imageOpts.mediaTypes + if err = ri.setUnderlyingImage(ri.image); err != nil { // update media types + return nil, err + } + + return ri, nil +} + +func defaultPlatform() imgutil.Platform { + return imgutil.Platform{ + OS: "linux", + Architecture: "amd64", + } +} + +func emptyImage(platform imgutil.Platform) (v1.Image, error) { + cfg := &v1.ConfigFile{ + Architecture: platform.Architecture, + History: []v1.History{}, + OS: platform.OS, + OSVersion: platform.OSVersion, + RootFS: v1.RootFS{ + Type: "layers", + DiffIDs: []v1.Hash{}, + }, + } + + return mutate.ConfigFile(empty.Image, cfg) +} + +func prepareNewWindowsImage(ri *Image) error { + // only append base layer to empty image + cfgFile, err := ri.image.ConfigFile() + if err != nil { + return err + } + if len(cfgFile.RootFS.DiffIDs) > 0 { + return nil + } + + layerBytes, err := layer.WindowsBaseLayer() + if err != nil { + return err + } + + windowsBaseLayer, err := tarball.LayerFromReader(layerBytes) // TODO: LayerFromReader is deprecated; LayerFromOpener or stream.NewLayer are suggested alternatives however the tests do not pass when they are used + if err != nil { + return err + } + + image, err := mutate.AppendLayers(ri.image, windowsBaseLayer) + if err != nil { + return err + } + + ri.image = image + + return nil +} + +func processPreviousImageOption(ri *Image, prevImageRepoName string, platform imgutil.Platform) error { + reg := getRegistry(prevImageRepoName, ri.registrySettings) + + prevImage, err := NewV1Image(prevImageRepoName, ri.keychain, WithV1DefaultPlatform(platform), WithV1RegistrySetting(reg.insecure, reg.insecureSkipVerify)) + if err != nil { + return err + } + + prevLayers, err := prevImage.Layers() + if err != nil { + return errors.Wrapf(err, "getting layers for previous image with repo name %q", prevImageRepoName) + } + + configFile, err := prevImage.ConfigFile() + if err != nil { + return err + } + + ri.prevLayers = prevLayers + prevHistory := configFile.History + if len(prevLayers) != len(prevHistory) { + prevHistory = make([]v1.History, len(prevLayers)) + } + ri.prevHistory = prevHistory + + return nil +} + +func getRegistry(repoName string, registrySettings map[string]registrySetting) registrySetting { + for prefix, r := range registrySettings { + if strings.HasPrefix(repoName, prefix) { + return r + } + } + return registrySetting{} +} + +// NewV1Image returns a new v1.Image +func NewV1Image(baseImageRepoName string, keychain authn.Keychain, ops ...V1ImageOption) (v1.Image, error) { + imageOpts := &v1Options{} + for _, op := range ops { + if err := op(imageOpts); err != nil { + return nil, err + } + } + + platform := defaultPlatform() + if (imageOpts.platform != imgutil.Platform{}) { + platform = imageOpts.platform + } + + reg := registrySetting{} + if (imageOpts.registrySetting != registrySetting{}) { + reg = imageOpts.registrySetting + } + + baseImage, err := newV1Image(keychain, baseImageRepoName, platform, reg) + if err != nil { + return nil, err + } + return baseImage, nil +} + +func newV1Image(keychain authn.Keychain, repoName string, platform imgutil.Platform, reg registrySetting) (v1.Image, error) { + ref, auth, err := referenceForRepoName(keychain, repoName, reg.insecure) + if err != nil { + return nil, err + } + + v1Platform := v1.Platform{ + Architecture: platform.Architecture, + OS: platform.OS, + OSVersion: platform.OSVersion, + } + + opts := []remote.Option{remote.WithAuth(auth), remote.WithPlatform(v1Platform)} + // #nosec G402 + if reg.insecureSkipVerify { + opts = append(opts, remote.WithTransport(&http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + })) + } else { + opts = append(opts, remote.WithTransport(http.DefaultTransport)) + } + + var image v1.Image + for i := 0; i <= maxRetries; i++ { + time.Sleep(100 * time.Duration(i) * time.Millisecond) // wait if retrying + image, err = remote.Image(ref, opts...) + if err != nil { + if err == io.EOF && i != maxRetries { + continue // retry if EOF + } + if transportErr, ok := err.(*transport.Error); ok && len(transportErr.Errors) > 0 { + switch transportErr.StatusCode { + case http.StatusNotFound, http.StatusUnauthorized: + return emptyImage(platform) + } + } + if strings.Contains(err.Error(), "no child with platform") { + return emptyImage(platform) + } + return nil, errors.Wrapf(err, "connect to repo store %q", repoName) + } + break + } + + return image, nil +} + +func referenceForRepoName(keychain authn.Keychain, ref string, insecure bool) (name.Reference, authn.Authenticator, error) { + var auth authn.Authenticator + opts := []name.Option{name.WeakValidation} + if insecure { + opts = append(opts, name.Insecure) + } + r, err := name.ParseReference(ref, opts...) + if err != nil { + return nil, nil, err + } + + auth, err = keychain.Resolve(r.Context().Registry) + if err != nil { + return nil, nil, err + } + return r, auth, nil +} + +func processBaseImageOption(ri *Image, baseImageRepoName string, platform imgutil.Platform) error { + reg := getRegistry(baseImageRepoName, ri.registrySettings) + var err error + ri.image, err = NewV1Image(baseImageRepoName, ri.keychain, WithV1DefaultPlatform(platform), WithV1RegistrySetting(reg.insecure, reg.insecureSkipVerify)) + if err != nil { + return err + } + if !ri.withHistory { + return nil + } + if ri.image, err = imgutil.OverrideHistoryIfNeeded(ri.image); err != nil { + return err + } + return nil +} + +// setUnderlyingImage wraps the provided v1.Image into a layout.Image and sets it as the underlying image for the receiving layout.Image +func (i *Image) setUnderlyingImage(base v1.Image) error { + manifest, err := base.Manifest() + if err != nil { + return err + } + if i.requestedMediaTypesMatch(manifest) { + i.image = base + return nil + } + // provided v1.Image media types differ from requested, override them + newBase, err := imgutil.OverrideMediaTypes(base, i.requestedMediaTypes) + if err != nil { + return err + } + i.image = newBase + return nil +} + +// requestedMediaTypesMatch returns true if the manifest and config file use the requested media types +func (i *Image) requestedMediaTypesMatch(manifest *v1.Manifest) bool { + return manifest.MediaType == i.requestedMediaTypes.ManifestType() && + manifest.Config.MediaType == i.requestedMediaTypes.ConfigType() +} diff --git a/vendor/github.com/buildpacks/imgutil/remote/options.go b/vendor/github.com/buildpacks/imgutil/remote/options.go new file mode 100644 index 0000000000..e402c1f77d --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/remote/options.go @@ -0,0 +1,135 @@ +package remote + +import ( + "time" + + v1 "github.com/google/go-containerregistry/pkg/v1" + + "github.com/buildpacks/imgutil" +) + +type ImageOption func(*options) error + +type options struct { + platform imgutil.Platform + baseImageRepoName string + prevImageRepoName string + createdAt time.Time + addEmptyLayerOnSave bool + withHistory bool + registrySettings map[string]registrySetting + mediaTypes imgutil.MediaTypes + config *v1.Config +} + +// AddEmptyLayerOnSave (remote only) adds an empty layer before saving if the image has no layer at all. +// This option is useful when exporting to registries that do not allow saving an image without layers, +// for example: gcr.io +func AddEmptyLayerOnSave() ImageOption { + return func(opts *options) error { + opts.addEmptyLayerOnSave = true + return nil + } +} + +// FromBaseImage loads an existing image as the config and layers for the new image. +// Ignored if image is not found. +func FromBaseImage(imageName string) ImageOption { + return func(opts *options) error { + opts.baseImageRepoName = imageName + return nil + } +} + +// WithCreatedAt lets a caller set the created at timestamp for the image. +// Defaults for a new image is imgutil.NormalizedDateTime +func WithCreatedAt(createdAt time.Time) ImageOption { + return func(opts *options) error { + opts.createdAt = createdAt + return nil + } +} + +func WithConfig(config *v1.Config) ImageOption { + return func(opts *options) error { + opts.config = config + return nil + } +} + +// WithDefaultPlatform provides Architecture/OS/OSVersion defaults for the new image. +// Defaults for a new image are ignored when FromBaseImage returns an image. +// FromBaseImage and WithPreviousImage will use the platform to choose an image from a manifest list. +func WithDefaultPlatform(platform imgutil.Platform) ImageOption { + return func(opts *options) error { + opts.platform = platform + return nil + } +} + +// WithHistory if provided will configure the image to preserve history when saved +// (including any history from the base image if valid). +func WithHistory() ImageOption { + return func(opts *options) error { + opts.withHistory = true + return nil + } +} + +// WithMediaTypes lets a caller set the desired media types for the image manifest and config files, +// including the layers referenced in the manifest, to be either OCI media types or Docker media types. +func WithMediaTypes(requested imgutil.MediaTypes) ImageOption { + return func(i *options) error { + i.mediaTypes = requested + return nil + } +} + +// WithPreviousImage loads an existing image as a source for reusable layers. +// Use with ReuseLayer(). +// Ignored if image is not found. +func WithPreviousImage(imageName string) ImageOption { + return func(opts *options) error { + opts.prevImageRepoName = imageName + return nil + } +} + +// WithRegistrySetting (remote only) registers options to use when accessing images in a registry in order to construct +// the image. The referenced images could include the base image, a previous image, or the image itself. +func WithRegistrySetting(repository string, insecure, insecureSkipVerify bool) ImageOption { + return func(opts *options) error { + opts.registrySettings[repository] = registrySetting{ + insecure: insecure, + insecureSkipVerify: insecureSkipVerify, + } + return nil + } +} + +// v1Options is used to configure the behavior when a v1.Image is created +type v1Options struct { + platform imgutil.Platform + registrySetting registrySetting +} + +type V1ImageOption func(*v1Options) error + +// WithV1DefaultPlatform provides Architecture/OS/OSVersion defaults for the new v1.Image. +func WithV1DefaultPlatform(platform imgutil.Platform) V1ImageOption { + return func(opts *v1Options) error { + opts.platform = platform + return nil + } +} + +// WithV1RegistrySetting registers options to use when accessing images in a registry in order to construct a v1.Image. +func WithV1RegistrySetting(insecure, insecureSkipVerify bool) V1ImageOption { + return func(opts *v1Options) error { + opts.registrySetting = registrySetting{ + insecure: insecure, + insecureSkipVerify: insecureSkipVerify, + } + return nil + } +} diff --git a/vendor/github.com/buildpacks/imgutil/remote/remote.go b/vendor/github.com/buildpacks/imgutil/remote/remote.go index 65149644bc..925d10cd25 100644 --- a/vendor/github.com/buildpacks/imgutil/remote/remote.go +++ b/vendor/github.com/buildpacks/imgutil/remote/remote.go @@ -1,25 +1,21 @@ package remote import ( - "crypto/tls" "fmt" "io" "net/http" "strings" "time" - "github.com/buildpacks/imgutil/layer" - "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/remote/transport" - "github.com/google/go-containerregistry/pkg/v1/static" "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/google/go-containerregistry/pkg/v1/types" + "github.com/google/go-containerregistry/pkg/v1/validate" "github.com/pkg/errors" "github.com/buildpacks/imgutil" @@ -32,18 +28,12 @@ type Image struct { repoName string image v1.Image prevLayers []v1.Layer + prevHistory []v1.History createdAt time.Time addEmptyLayerOnSave bool + withHistory bool registrySettings map[string]registrySetting -} - -type options struct { - platform imgutil.Platform - baseImageRepoName string - prevImageRepoName string - createdAt time.Time - addEmptyLayerOnSave bool - registrySettings map[string]registrySetting + requestedMediaTypes imgutil.MediaTypes } type registrySetting struct { @@ -51,335 +41,148 @@ type registrySetting struct { insecureSkipVerify bool } -type ImageOption func(*options) error - -// WithPreviousImage loads an existing image as a source for reusable layers. -// Use with ReuseLayer(). -// Ignored if image is not found. -func WithPreviousImage(imageName string) ImageOption { - return func(opts *options) error { - opts.prevImageRepoName = imageName - return nil - } -} - -// FromBaseImage loads an existing image as the config and layers for the new image. -// Ignored if image is not found. -func FromBaseImage(imageName string) ImageOption { - return func(opts *options) error { - opts.baseImageRepoName = imageName - return nil - } -} +// getters -// WithDefaultPlatform provides Architecture/OS/OSVersion defaults for the new image. -// Defaults for a new image are ignored when FromBaseImage returns an image. -// FromBaseImage and WithPreviousImage will use the platform to choose an image from a manifest list. -func WithDefaultPlatform(platform imgutil.Platform) ImageOption { - return func(opts *options) error { - opts.platform = platform - return nil +func (i *Image) Architecture() (string, error) { + cfg, err := i.image.ConfigFile() + if err != nil { + return "", errors.Wrapf(err, "getting config file for image %q", i.repoName) } -} - -// WithCreatedAt lets a caller set the created at timestamp for the image. -// Defaults for a new image is imgutil.NormalizedDateTime -func WithCreatedAt(createdAt time.Time) ImageOption { - return func(opts *options) error { - opts.createdAt = createdAt - return nil + if cfg == nil { + return "", fmt.Errorf("missing config for image %q", i.repoName) } -} - -// AddEmptyLayerOnSave adds an empty layer before saving if the image has no layer at all. -// This option is useful when exporting to registries that do not allow saving an image without layers, -// for example: gcr.io -func AddEmptyLayerOnSave() ImageOption { - return func(opts *options) error { - opts.addEmptyLayerOnSave = true - return nil + if cfg.Architecture == "" { + return "", fmt.Errorf("missing Architecture for image %q", i.repoName) } + return cfg.Architecture, nil } -// WithRegistrySetting registers options to use when accessing images in a registry in order to construct -// the image. The referenced images could include the base image, a previous image, or the image itself. -func WithRegistrySetting(repository string, insecure, insecureSkipVerify bool) ImageOption { - return func(opts *options) error { - opts.registrySettings[repository] = registrySetting{ - insecure: insecure, - insecureSkipVerify: insecureSkipVerify, - } - return nil +func (i *Image) CreatedAt() (time.Time, error) { + configFile, err := i.image.ConfigFile() + if err != nil { + return time.Time{}, errors.Wrapf(err, "getting createdAt time for image %q", i.repoName) } + return configFile.Created.UTC(), nil } -// NewImage returns a new Image that can be modified and saved to a Docker daemon. -func NewImage(repoName string, keychain authn.Keychain, ops ...ImageOption) (*Image, error) { - imageOpts := &options{} - for _, op := range ops { - if err := op(imageOpts); err != nil { - return nil, err - } - } - - platform := defaultPlatform() - if (imageOpts.platform != imgutil.Platform{}) { - platform = imageOpts.platform - } - - image, err := emptyImage(platform) +func (i *Image) Entrypoint() ([]string, error) { + cfg, err := i.image.ConfigFile() if err != nil { - return nil, err - } - - ri := &Image{ - keychain: keychain, - repoName: repoName, - image: image, - addEmptyLayerOnSave: imageOpts.addEmptyLayerOnSave, - registrySettings: imageOpts.registrySettings, - } - - if imageOpts.prevImageRepoName != "" { - if err := processPreviousImageOption(ri, imageOpts.prevImageRepoName, platform); err != nil { - return nil, err - } + return nil, errors.Wrapf(err, "getting config file for image %q", i.repoName) } - - if imageOpts.baseImageRepoName != "" { - if err := processBaseImageOption(ri, imageOpts.baseImageRepoName, platform); err != nil { - return nil, err - } + if cfg == nil { + return nil, fmt.Errorf("missing config for image %q", i.repoName) } + return cfg.Config.Entrypoint, nil +} - imgOS, err := ri.OS() +func (i *Image) Env(key string) (string, error) { + cfg, err := i.image.ConfigFile() if err != nil { - return nil, err - } - if imgOS == "windows" { - if err := prepareNewWindowsImage(ri); err != nil { - return nil, err - } + return "", errors.Wrapf(err, "getting config file for image %q", i.repoName) } - - if imageOpts.createdAt.IsZero() { - ri.createdAt = imgutil.NormalizedDateTime - } else { - ri.createdAt = imageOpts.createdAt + if cfg == nil { + return "", fmt.Errorf("missing config for image %q", i.repoName) } - - return ri, nil -} - -func getRegistry(repoName string, registrySettings map[string]registrySetting) registrySetting { - for prefix, r := range registrySettings { - if strings.HasPrefix(repoName, prefix) { - return r + for _, envVar := range cfg.Config.Env { + parts := strings.Split(envVar, "=") + if parts[0] == key { + return parts[1], nil } } - return registrySetting{} + return "", nil } -func processPreviousImageOption(ri *Image, prevImageRepoName string, platform imgutil.Platform) error { - reg := getRegistry(prevImageRepoName, ri.registrySettings) - - prevImage, err := NewV1Image(prevImageRepoName, ri.keychain, WithV1DefaultPlatform(platform), WithV1RegistrySetting(reg.insecure, reg.insecureSkipVerify)) - if err != nil { - return err - } - - prevLayers, err := prevImage.Layers() - if err != nil { - return errors.Wrapf(err, "getting layers for previous image with repo name %q", prevImageRepoName) - } - - ri.prevLayers = prevLayers +func (i *Image) Found() bool { + _, err := i.found() - return nil + return err == nil } -func processBaseImageOption(ri *Image, baseImageRepoName string, platform imgutil.Platform) error { - reg := getRegistry(baseImageRepoName, ri.registrySettings) - - baseImage, err := NewV1Image(baseImageRepoName, ri.keychain, WithV1DefaultPlatform(platform), WithV1RegistrySetting(reg.insecure, reg.insecureSkipVerify)) +func (i *Image) found() (*v1.Descriptor, error) { + reg := getRegistry(i.repoName, i.registrySettings) + ref, auth, err := referenceForRepoName(i.keychain, i.repoName, reg.insecure) if err != nil { - return err + return nil, err } + return remote.Head(ref, remote.WithAuth(auth), remote.WithTransport(http.DefaultTransport)) +} - ri.image = baseImage - - return nil +func (i *Image) Valid() bool { + return i.valid() == nil } -func prepareNewWindowsImage(ri *Image) error { - // only append base layer to empty image - cfgFile, err := ri.image.ConfigFile() +func (i *Image) valid() error { + reg := getRegistry(i.repoName, i.registrySettings) + ref, auth, err := referenceForRepoName(i.keychain, i.repoName, reg.insecure) if err != nil { return err } - if len(cfgFile.RootFS.DiffIDs) > 0 { - return nil - } - - layerBytes, err := layer.WindowsBaseLayer() + desc, err := remote.Get(ref, remote.WithAuth(auth), remote.WithTransport(http.DefaultTransport)) if err != nil { return err } - windowsBaseLayer, err := tarball.LayerFromReader(layerBytes) // TODO: LayerFromReader is deprecated; LayerFromOpener or stream.NewLayer are suggested alternatives however the tests do not pass when they are used - if err != nil { - return err + if desc.MediaType == types.OCIImageIndex || desc.MediaType == types.DockerManifestList { + index, err := desc.ImageIndex() + if err != nil { + return err + } + return validate.Index(index, validate.Fast) } - - image, err := mutate.AppendLayers(ri.image, windowsBaseLayer) + img, err := desc.Image() if err != nil { return err } - - ri.image = image - - return nil -} - -// v1Options is used to configure the behavior when a v1.Image is created -type v1Options struct { - platform imgutil.Platform - registrySetting registrySetting -} - -type V1ImageOption func(*v1Options) error - -// WithV1DefaultPlatform provides Architecture/OS/OSVersion defaults for the new v1.Image. -func WithV1DefaultPlatform(platform imgutil.Platform) V1ImageOption { - return func(opts *v1Options) error { - opts.platform = platform - return nil - } + return validate.Image(img, validate.Fast) } -// WithV1RegistrySetting registers options to use when accessing images in a registry in order to construct a v1.Image. -func WithV1RegistrySetting(insecure, insecureSkipVerify bool) V1ImageOption { - return func(opts *v1Options) error { - opts.registrySetting = registrySetting{ - insecure: insecure, - insecureSkipVerify: insecureSkipVerify, - } - return nil - } +func (i *Image) GetAnnotateRefName() (string, error) { + // TODO issue https://github.com/buildpacks/imgutil/issues/178 + return "", errors.New("not yet implemented") } -// NewV1Image returns a new v1.Image -func NewV1Image(baseImageRepoName string, keychain authn.Keychain, ops ...V1ImageOption) (v1.Image, error) { - imageOpts := &v1Options{} - for _, op := range ops { - if err := op(imageOpts); err != nil { - return nil, err - } - } - - platform := defaultPlatform() - if (imageOpts.platform != imgutil.Platform{}) { - platform = imageOpts.platform - } - - reg := registrySetting{} - if (imageOpts.registrySetting != registrySetting{}) { - reg = imageOpts.registrySetting - } - - baseImage, err := newV1Image(keychain, baseImageRepoName, platform, reg) +func (i *Image) GetLayer(sha string) (io.ReadCloser, error) { + layers, err := i.image.Layers() if err != nil { return nil, err } - return baseImage, nil -} -func newV1Image(keychain authn.Keychain, repoName string, platform imgutil.Platform, reg registrySetting) (v1.Image, error) { - ref, auth, err := referenceForRepoName(keychain, repoName, reg.insecure) + layer, _, err := findLayerWithSha(layers, sha) if err != nil { return nil, err } - v1Platform := v1.Platform{ - Architecture: platform.Architecture, - OS: platform.OS, - OSVersion: platform.OSVersion, - } - - opts := []remote.Option{remote.WithAuth(auth), remote.WithPlatform(v1Platform)} - // #nosec G402 - if reg.insecureSkipVerify { - opts = append(opts, remote.WithTransport(&http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - })) - } else { - opts = append(opts, remote.WithTransport(http.DefaultTransport)) - } - - var image v1.Image - for i := 0; i <= maxRetries; i++ { - time.Sleep(100 * time.Duration(i) * time.Millisecond) // wait if retrying - image, err = remote.Image(ref, opts...) - if err != nil { - if err == io.EOF && i != maxRetries { - continue // retry if EOF - } - if transportErr, ok := err.(*transport.Error); ok && len(transportErr.Errors) > 0 { - switch transportErr.StatusCode { - case http.StatusNotFound, http.StatusUnauthorized: - return emptyImage(platform) - } - } - if strings.Contains(err.Error(), "no child with platform") { - return emptyImage(platform) - } - return nil, errors.Wrapf(err, "connect to repo store %q", repoName) - } - break - } - - return image, nil + return layer.Uncompressed() } -func emptyImage(platform imgutil.Platform) (v1.Image, error) { - cfg := &v1.ConfigFile{ - Architecture: platform.Architecture, - OS: platform.OS, - OSVersion: platform.OSVersion, - RootFS: v1.RootFS{ - Type: "layers", - DiffIDs: []v1.Hash{}, - }, +func (i *Image) History() ([]v1.History, error) { + configFile, err := i.image.ConfigFile() + if err != nil { + return nil, err } - - return mutate.ConfigFile(empty.Image, cfg) + return configFile.History, nil } -func defaultPlatform() imgutil.Platform { - return imgutil.Platform{ - OS: "linux", - Architecture: "amd64", +func (i *Image) Identifier() (imgutil.Identifier, error) { + ref, err := name.ParseReference(i.repoName, name.WeakValidation) + if err != nil { + return nil, errors.Wrapf(err, "parsing reference for image %q", i.repoName) } -} -func referenceForRepoName(keychain authn.Keychain, ref string, insecure bool) (name.Reference, authn.Authenticator, error) { - var auth authn.Authenticator - opts := []name.Option{name.WeakValidation} - if insecure { - opts = append(opts, name.Insecure) - } - r, err := name.ParseReference(ref, opts...) + hash, err := i.image.Digest() if err != nil { - return nil, nil, err + return nil, errors.Wrapf(err, "getting digest for image %q", i.repoName) } - auth, err = keychain.Resolve(r.Context().Registry) + digestRef, err := name.NewDigest(fmt.Sprintf("%s@%s", ref.Context().Name(), hash.String()), name.WeakValidation) if err != nil { - return nil, nil, err + return nil, errors.Wrap(err, "creating digest reference") } - return r, auth, nil + + return DigestIdentifier{ + Digest: digestRef, + }, nil } func (i *Image) Label(key string) (string, error) { @@ -405,43 +208,12 @@ func (i *Image) Labels() (map[string]string, error) { return cfg.Config.Labels, nil } -func (i *Image) Env(key string) (string, error) { - cfg, err := i.image.ConfigFile() - if err != nil { - return "", errors.Wrapf(err, "getting config file for image %q", i.repoName) - } - if cfg == nil { - return "", fmt.Errorf("missing config for image %q", i.repoName) - } - for _, envVar := range cfg.Config.Env { - parts := strings.Split(envVar, "=") - if parts[0] == key { - return parts[1], nil - } - } - return "", nil -} - -func (i *Image) WorkingDir() (string, error) { - cfg, err := i.image.ConfigFile() - if err != nil { - return "", errors.Wrapf(err, "getting config file for image %q", i.repoName) - } - if cfg == nil { - return "", fmt.Errorf("missing config for image %q", i.repoName) - } - return cfg.Config.WorkingDir, nil +func (i *Image) ManifestSize() (int64, error) { + return i.image.Size() } -func (i *Image) Entrypoint() ([]string, error) { - cfg, err := i.image.ConfigFile() - if err != nil { - return nil, errors.Wrapf(err, "getting config file for image %q", i.repoName) - } - if cfg == nil { - return nil, fmt.Errorf("missing config for image %q", i.repoName) - } - return cfg.Config.Entrypoint, nil +func (i *Image) Name() string { + return i.repoName } func (i *Image) OS() (string, error) { @@ -469,150 +241,83 @@ func (i *Image) OSVersion() (string, error) { return cfg.OSVersion, nil } -func (i *Image) Architecture() (string, error) { - cfg, err := i.image.ConfigFile() +func (i *Image) TopLayer() (string, error) { + all, err := i.image.Layers() if err != nil { - return "", errors.Wrapf(err, "getting config file for image %q", i.repoName) - } - if cfg == nil { - return "", fmt.Errorf("missing config for image %q", i.repoName) + return "", err } - if cfg.Architecture == "" { - return "", fmt.Errorf("missing Architecture for image %q", i.repoName) + if len(all) == 0 { + return "", fmt.Errorf("image %q has no layers", i.Name()) } - return cfg.Architecture, nil -} - -func (i *Image) Rename(name string) { - i.repoName = name -} - -func (i *Image) Name() string { - return i.repoName -} - -func (i *Image) Found() bool { - _, err := i.found() - return err == nil -} - -func (i *Image) CheckReadWriteAccess() bool { - reg := getRegistry(i.repoName, i.registrySettings) - ref, _, err := referenceForRepoName(i.keychain, i.repoName, reg.insecure) + topLayer := all[len(all)-1] + hex, err := topLayer.DiffID() if err != nil { - return false + return "", err } - return i.CheckReadAccess() && remote.CheckPushPermission(ref, i.keychain, http.DefaultTransport) == nil + return hex.String(), nil } -func (i *Image) CheckReadAccess() bool { - _, err := i.found() +func (i *Image) Variant() (string, error) { + cfg, err := i.image.ConfigFile() if err != nil { - if transportErr, ok := err.(*transport.Error); ok { - return transportErr.StatusCode != http.StatusUnauthorized && - transportErr.StatusCode != http.StatusForbidden - } - return false + return "", errors.Wrapf(err, "getting config file for image %q", i.repoName) } - return true -} - -func (i *Image) found() (*v1.Descriptor, error) { - reg := getRegistry(i.repoName, i.registrySettings) - ref, auth, err := referenceForRepoName(i.keychain, i.repoName, reg.insecure) - if err != nil { - return nil, err + if cfg == nil { + return "", fmt.Errorf("missing config for image %q", i.repoName) } - return remote.Head(ref, remote.WithAuth(auth), remote.WithTransport(http.DefaultTransport)) + return cfg.Variant, nil // it's optional so we don't care whether it's "" } -func (i *Image) Identifier() (imgutil.Identifier, error) { - ref, err := name.ParseReference(i.repoName, name.WeakValidation) +func (i *Image) WorkingDir() (string, error) { + cfg, err := i.image.ConfigFile() if err != nil { - return nil, errors.Wrapf(err, "parsing reference for image %q", i.repoName) + return "", errors.Wrapf(err, "getting config file for image %q", i.repoName) } - - hash, err := i.image.Digest() - if err != nil { - return nil, errors.Wrapf(err, "getting digest for image %q", i.repoName) + if cfg == nil { + return "", fmt.Errorf("missing config for image %q", i.repoName) } + return cfg.Config.WorkingDir, nil +} - digestRef, err := name.NewDigest(fmt.Sprintf("%s@%s", ref.Context().Name(), hash.String()), name.WeakValidation) - if err != nil { - return nil, errors.Wrap(err, "creating digest reference") - } +// setters - return DigestIdentifier{ - Digest: digestRef, - }, nil +func (i *Image) AnnotateRefName(refName string) error { + // TODO issue https://github.com/buildpacks/imgutil/issues/178 + return errors.New("not yet implemented") } -func (i *Image) CreatedAt() (time.Time, error) { - configFile, err := i.image.ConfigFile() - if err != nil { - return time.Time{}, errors.Wrapf(err, "getting createdAt time for image %q", i.repoName) - } - return configFile.Created.UTC(), nil +func (i *Image) Rename(name string) { + i.repoName = name } -func (i *Image) Rebase(baseTopLayer string, newBase imgutil.Image) error { - newBaseRemote, ok := newBase.(*Image) - if !ok { - return errors.New("expected new base to be a remote image") - } - - newImage, err := mutate.Rebase(i.image, &subImage{img: i.image, topDiffID: baseTopLayer}, newBaseRemote.image) - if err != nil { - return errors.Wrap(err, "rebase") - } - - newImageConfig, err := newImage.ConfigFile() - if err != nil { - return err - } - - newBaseRemoteConfig, err := newBaseRemote.image.ConfigFile() - if err != nil { - return err - } - - newImageConfig.Architecture = newBaseRemoteConfig.Architecture - newImageConfig.OS = newBaseRemoteConfig.OS - newImageConfig.OSVersion = newBaseRemoteConfig.OSVersion - - newImage, err = mutate.ConfigFile(newImage, newImageConfig) +func (i *Image) SetArchitecture(architecture string) error { + configFile, err := i.image.ConfigFile() if err != nil { return err } - - i.image = newImage - return nil + configFile.Architecture = architecture + i.image, err = mutate.ConfigFile(i.image, configFile) + return err } -func (i *Image) SetLabel(key, val string) error { +func (i *Image) SetCmd(cmd ...string) error { configFile, err := i.image.ConfigFile() if err != nil { return err } config := *configFile.Config.DeepCopy() - if config.Labels == nil { - config.Labels = map[string]string{} - } - config.Labels[key] = val + config.Cmd = cmd i.image, err = mutate.Config(i.image, config) return err } -func (i *Image) RemoveLabel(key string) error { - cfg, err := i.image.ConfigFile() +func (i *Image) SetEntrypoint(ep ...string) error { + configFile, err := i.image.ConfigFile() if err != nil { - return errors.Wrapf(err, "getting config file for image %q", i.repoName) - } - if cfg == nil { - return fmt.Errorf("missing config for image %q", i.repoName) + return err } - config := *cfg.Config.DeepCopy() - delete(config.Labels, key) + config := *configFile.Config.DeepCopy() + config.Entrypoint = ep i.image, err = mutate.Config(i.image, config) return err } @@ -643,35 +348,26 @@ func (i *Image) SetEnv(key, val string) error { return err } -func (i *Image) SetWorkingDir(dir string) error { - configFile, err := i.image.ConfigFile() +func (i *Image) SetHistory(history []v1.History) error { + configFile, err := i.image.ConfigFile() // TODO: check if we need to use DeepCopy if err != nil { return err } - config := *configFile.Config.DeepCopy() - config.WorkingDir = dir - i.image, err = mutate.Config(i.image, config) + configFile.History = history + i.image, err = mutate.ConfigFile(i.image, configFile) return err } -func (i *Image) SetEntrypoint(ep ...string) error { +func (i *Image) SetLabel(key, val string) error { configFile, err := i.image.ConfigFile() if err != nil { return err } config := *configFile.Config.DeepCopy() - config.Entrypoint = ep - i.image, err = mutate.Config(i.image, config) - return err -} - -func (i *Image) SetCmd(cmd ...string) error { - configFile, err := i.image.ConfigFile() - if err != nil { - return err + if config.Labels == nil { + config.Labels = map[string]string{} } - config := *configFile.Config.DeepCopy() - config.Cmd = cmd + config.Labels[key] = val i.image, err = mutate.Config(i.image, config) return err } @@ -696,185 +392,195 @@ func (i *Image) SetOSVersion(osVersion string) error { return err } -func (i *Image) SetArchitecture(architecture string) error { +func (i *Image) SetVariant(variant string) error { configFile, err := i.image.ConfigFile() if err != nil { return err } - configFile.Architecture = architecture + configFile.Variant = variant i.image, err = mutate.ConfigFile(i.image, configFile) return err } -func (i *Image) TopLayer() (string, error) { - all, err := i.image.Layers() - if err != nil { - return "", err - } - if len(all) == 0 { - return "", fmt.Errorf("image %q has no layers", i.Name()) - } - topLayer := all[len(all)-1] - hex, err := topLayer.DiffID() +func (i *Image) SetWorkingDir(dir string) error { + configFile, err := i.image.ConfigFile() if err != nil { - return "", err + return err } - return hex.String(), nil + config := *configFile.Config.DeepCopy() + config.WorkingDir = dir + i.image, err = mutate.Config(i.image, config) + return err } -func (i *Image) GetLayer(sha string) (io.ReadCloser, error) { - layers, err := i.image.Layers() - if err != nil { - return nil, err - } - - layer, err := findLayerWithSha(layers, sha) - if err != nil { - return nil, err - } +// modifiers - return layer.Uncompressed() +func (i *Image) AddLayer(path string) error { + return i.AddLayerWithDiffIDAndHistory(path, "ignored", v1.History{}) } -func (i *Image) AddLayer(path string) error { - layer, err := tarball.LayerFromFile(path) - if err != nil { - return err - } - i.image, err = mutate.AppendLayers(i.image, layer) - if err != nil { - return errors.Wrap(err, "add layer") +func layerAddendum(layer v1.Layer, history v1.History, mediaType types.MediaType) mutate.Addendum { + return mutate.Addendum{ + Layer: layer, + History: history, + MediaType: mediaType, } - return nil } +// AddLayerWithDiffID is equivalent to AddLayer in the remote case; +// it exists to provide optimize performance for local images. func (i *Image) AddLayerWithDiffID(path, diffID string) error { - // this is equivalent to AddLayer in the remote case - // it exists to provide optimize performance for local images - return i.AddLayer(path) + return i.AddLayerWithDiffIDAndHistory(path, "ignored", v1.History{}) } -func (i *Image) ReuseLayer(sha string) error { - layer, err := findLayerWithSha(i.prevLayers, sha) +func (i *Image) AddLayerWithDiffIDAndHistory(path, diffID string, history v1.History) error { + layer, err := tarball.LayerFromFile(path) if err != nil { return err } - i.image, err = mutate.AppendLayers(i.image, layer) + i.image, err = mutate.Append( + i.image, + layerAddendum(layer, history, i.requestedMediaTypes.LayerType()), + ) return err } -func findLayerWithSha(layers []v1.Layer, diffID string) (v1.Layer, error) { - for _, layer := range layers { - dID, err := layer.DiffID() - if err != nil { - return nil, errors.Wrap(err, "get diff ID for previous image layer") - } - if diffID == dID.String() { - return layer, nil - } +func (i *Image) Delete() error { + id, err := i.Identifier() + if err != nil { + return err } - return nil, fmt.Errorf("previous image did not have layer with diff id %q", diffID) -} - -func (i *Image) Save(additionalNames ...string) error { - return i.SaveAs(i.Name(), additionalNames...) + reg := getRegistry(i.repoName, i.registrySettings) + ref, auth, err := referenceForRepoName(i.keychain, id.String(), reg.insecure) + if err != nil { + return err + } + return remote.Delete(ref, remote.WithAuth(auth)) } -func (i *Image) SaveAs(name string, additionalNames ...string) error { - var err error - - allNames := append([]string{name}, additionalNames...) - - i.image, err = mutate.CreatedAt(i.image, v1.Time{Time: i.createdAt}) - if err != nil { - return errors.Wrap(err, "set creation time") +func (i *Image) Rebase(baseTopLayer string, newBase imgutil.Image) error { + newBaseRemote, ok := newBase.(*Image) + if !ok { + return errors.New("expected new base to be a remote image") } - cfg, err := i.image.ConfigFile() + newImage, err := mutate.Rebase(i.image, &subImage{img: i.image, topDiffID: baseTopLayer}, newBaseRemote.image) if err != nil { - return errors.Wrap(err, "get image config") + return errors.Wrap(err, "rebase") } - cfg = cfg.DeepCopy() - layers, err := i.image.Layers() + newImageConfig, err := newImage.ConfigFile() if err != nil { - return errors.Wrap(err, "get image layers") - } - cfg.History = make([]v1.History, len(layers)) - for j := range cfg.History { - cfg.History[j] = v1.History{ - Created: v1.Time{Time: i.createdAt}, - } + return err } - cfg.DockerVersion = "" - cfg.Container = "" - i.image, err = mutate.ConfigFile(i.image, cfg) + newBaseRemoteConfig, err := newBaseRemote.image.ConfigFile() if err != nil { - return errors.Wrap(err, "zeroing history") + return err } - if len(layers) == 0 && i.addEmptyLayerOnSave { - empty := static.NewLayer([]byte{}, types.OCILayer) - i.image, err = mutate.AppendLayers(i.image, empty) - if err != nil { - return errors.Wrap(err, "empty layer could not be added") - } - } + newImageConfig.Architecture = newBaseRemoteConfig.Architecture + newImageConfig.OS = newBaseRemoteConfig.OS + newImageConfig.OSVersion = newBaseRemoteConfig.OSVersion - var diagnostics []imgutil.SaveDiagnostic - for _, n := range allNames { - if err := i.doSave(n); err != nil { - diagnostics = append(diagnostics, imgutil.SaveDiagnostic{ImageName: n, Cause: err}) - } - } - if len(diagnostics) > 0 { - return imgutil.SaveError{Errors: diagnostics} + newImage, err = mutate.ConfigFile(newImage, newImageConfig) + if err != nil { + return err } + i.image = newImage return nil } -func (i *Image) SaveFile() (string, error) { - return "", errors.New("not yet implemented") +func (i *Image) RemoveLabel(key string) error { + cfg, err := i.image.ConfigFile() + if err != nil { + return errors.Wrapf(err, "getting config file for image %q", i.repoName) + } + if cfg == nil { + return fmt.Errorf("missing config for image %q", i.repoName) + } + config := *cfg.Config.DeepCopy() + delete(config.Labels, key) + i.image, err = mutate.Config(i.image, config) + return err } -func (i *Image) doSave(imageName string) error { - reg := getRegistry(i.repoName, i.registrySettings) - ref, auth, err := referenceForRepoName(i.keychain, imageName, reg.insecure) +func (i *Image) ReuseLayer(sha string) error { + _, idx, err := findLayerWithSha(i.prevLayers, sha) if err != nil { return err } - return remote.Write(ref, i.image, remote.WithAuth(auth)) + return i.ReuseLayerWithHistory(sha, i.prevHistory[idx]) } -func (i *Image) Delete() error { - id, err := i.Identifier() +func (i *Image) ReuseLayerWithHistory(sha string, history v1.History) error { + layer, _, err := findLayerWithSha(i.prevLayers, sha) if err != nil { return err } + i.image, err = mutate.Append( + i.image, + layerAddendum(layer, history, i.requestedMediaTypes.LayerType()), + ) + return err +} + +// extras + +func (i *Image) CheckReadAccess() (bool, error) { + var err error + if _, err = i.found(); err == nil { + return true, nil + } + var canRead bool + if transportErr, ok := err.(*transport.Error); ok { + if canRead = transportErr.StatusCode != http.StatusUnauthorized && + transportErr.StatusCode != http.StatusForbidden; canRead { + err = nil + } + } + return canRead, err +} + +func (i *Image) CheckReadWriteAccess() (bool, error) { + if canRead, err := i.CheckReadAccess(); !canRead { + return false, err + } reg := getRegistry(i.repoName, i.registrySettings) - ref, auth, err := referenceForRepoName(i.keychain, id.String(), reg.insecure) + ref, _, err := referenceForRepoName(i.keychain, i.repoName, reg.insecure) if err != nil { - return err + return false, err } - return remote.Delete(ref, remote.WithAuth(auth)) + err = remote.CheckPushPermission(ref, i.keychain, http.DefaultTransport) + if err != nil { + return false, err + } + return true, nil } -func (i *Image) ManifestSize() (int64, error) { - return i.image.Size() +// UnderlyingImage exposes the underlying image for testing +func (i *Image) UnderlyingImage() v1.Image { + return i.image } -func (i *Image) AnnotateRefName(refName string) error { - // TODO issue https://github.com/buildpacks/imgutil/issues/178 - return errors.New("not yet implemented") -} +// helpers -func (i *Image) GetAnnotateRefName() (string, error) { - // TODO issue https://github.com/buildpacks/imgutil/issues/178 - return "", errors.New("not yet implemented") +func findLayerWithSha(layers []v1.Layer, diffID string) (v1.Layer, int, error) { + for idx, layer := range layers { + dID, err := layer.DiffID() + if err != nil { + return nil, idx, errors.Wrap(err, "get diff ID for previous image layer") + } + if diffID == dID.String() { + return layer, idx, nil + } + } + return nil, -1, fmt.Errorf("previous image did not have layer with diff id %q", diffID) } +// for rebase + type subImage struct { img v1.Image topDiffID string diff --git a/vendor/github.com/buildpacks/imgutil/remote/save.go b/vendor/github.com/buildpacks/imgutil/remote/save.go new file mode 100644 index 0000000000..11294c414f --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/remote/save.go @@ -0,0 +1,93 @@ +package remote + +import ( + "fmt" + + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/mutate" + "github.com/google/go-containerregistry/pkg/v1/remote" + "github.com/google/go-containerregistry/pkg/v1/static" + "github.com/google/go-containerregistry/pkg/v1/types" + + "github.com/buildpacks/imgutil" +) + +func (i *Image) Save(additionalNames ...string) error { + return i.SaveAs(i.Name(), additionalNames...) +} + +func (i *Image) SaveAs(name string, additionalNames ...string) error { + var err error + allNames := append([]string{name}, additionalNames...) + + // create time + if i.image, err = mutate.CreatedAt(i.image, v1.Time{Time: i.createdAt}); err != nil { + return fmt.Errorf("setting creation time: %w", err) + } + + // history + if i.image, err = imgutil.OverrideHistoryIfNeeded(i.image); err != nil { + return fmt.Errorf("overriding history: %w", err) + } + cfg, err := i.image.ConfigFile() + if err != nil { + return fmt.Errorf("getting config file: %w", err) + } + created := v1.Time{Time: i.createdAt} + if i.withHistory { + // set created + for j := range cfg.History { + cfg.History[j].Created = created + } + } else { + // zero history, set created + for j := range cfg.History { + cfg.History[j] = v1.History{Created: created} + } + } + + // docker, container + cfg.DockerVersion = "" + cfg.Container = "" + + // commit config + i.image, err = mutate.ConfigFile(i.image, cfg) + if err != nil { + return fmt.Errorf("zeroing history: %w", err) + } + + // layers + layers, err := i.image.Layers() + if err != nil { + return fmt.Errorf("getting layers: %w", err) + } + if len(layers) == 0 && i.addEmptyLayerOnSave { + empty := static.NewLayer([]byte{}, types.OCILayer) + i.image, err = mutate.AppendLayers(i.image, empty) + if err != nil { + return fmt.Errorf("adding empty layer: %w", err) + } + } + + // save + var diagnostics []imgutil.SaveDiagnostic + for _, n := range allNames { + if err := i.doSave(n); err != nil { + diagnostics = append(diagnostics, imgutil.SaveDiagnostic{ImageName: n, Cause: err}) + } + } + if len(diagnostics) > 0 { + return imgutil.SaveError{Errors: diagnostics} + } + + return nil +} + +func (i *Image) doSave(imageName string) error { + reg := getRegistry(i.repoName, i.registrySettings) + ref, auth, err := referenceForRepoName(i.keychain, imageName, reg.insecure) + if err != nil { + return err + } + return remote.Write(ref, i.image, remote.WithAuth(auth)) +} diff --git a/vendor/github.com/buildpacks/imgutil/remote/save_file.go b/vendor/github.com/buildpacks/imgutil/remote/save_file.go new file mode 100644 index 0000000000..540753722c --- /dev/null +++ b/vendor/github.com/buildpacks/imgutil/remote/save_file.go @@ -0,0 +1,9 @@ +package remote + +import ( + "errors" +) + +func (i *Image) SaveFile() (string, error) { + return "", errors.New("not yet implemented") +} diff --git a/vendor/github.com/buildpacks/lifecycle/.gitignore b/vendor/github.com/buildpacks/lifecycle/.gitignore index 77a88a3def..82a3d66dcf 100644 --- a/vendor/github.com/buildpacks/lifecycle/.gitignore +++ b/vendor/github.com/buildpacks/lifecycle/.gitignore @@ -8,5 +8,7 @@ .vscode acceptance/testdata/*/**/container/cnb/lifecycle/* acceptance/testdata/*/**/container/docker-config/* +acceptance/testdata/exporter/container/cnb/run.toml acceptance/testdata/exporter/container/layers/*analyzed.toml acceptance/testdata/exporter/container/other_layers/*analyzed.toml +acceptance/testdata/restorer/container/layers/*analyzed.toml diff --git a/vendor/github.com/buildpacks/lifecycle/.grype.yaml b/vendor/github.com/buildpacks/lifecycle/.grype.yaml index 8ab05b9c82..c5fb93de40 100644 --- a/vendor/github.com/buildpacks/lifecycle/.grype.yaml +++ b/vendor/github.com/buildpacks/lifecycle/.grype.yaml @@ -1,5 +1,5 @@ ignore: - vulnerability: CVE-2015-5237 # false positive, see https://github.com/anchore/grype/issues/558 - vulnerability: CVE-2021-22570 # false positive, see https://github.com/anchore/grype/issues/558 - - vulnerability: GHSA-f3fp-gc8g-vw66 # can't update github.com/opencontainers/runc until it is updated in github.com/docker/docker - - vulnerability: GHSA-v95c-p5hm-xq8f # can't update github.com/opencontainers/runc until it is updated in github.com/docker/docker + - vulnerability: GHSA-vpvm-3wq2-2wvm # unpatched as of 3/28/23, non-impactful as the lifecycle doesn't create containers + - vulnerability: GHSA-hqxw-f8mx-cpmw # unpatched in this release line, non-impactful because the lifecycle is not an http server diff --git a/vendor/github.com/buildpacks/lifecycle/DEVELOPMENT.md b/vendor/github.com/buildpacks/lifecycle/DEVELOPMENT.md index 966771c76e..d35027db9d 100644 --- a/vendor/github.com/buildpacks/lifecycle/DEVELOPMENT.md +++ b/vendor/github.com/buildpacks/lifecycle/DEVELOPMENT.md @@ -32,6 +32,17 @@ ] ``` +* Some of the Windows acceptance tests use license restricted base images. By default, the docker deamon will not publish layers from these images when pushing to a registry which can result in test failures with error messages such as: `Ignoring image "X" because it was corrupt`. To fix these failures you must [enable pushing nondistributable artifacts](https://docs.docker.com/engine/reference/commandline/dockerd/#allow-push-of-nondistributable-artifacts) to the test registry by adding the following to your Docker Desktop Engine config: + * `%programdata%\docker\config\daemon.json`: + +``` +{ + "allow-nondistributable-artifacts": [ + "/32" + ] +} +``` + ### Testing GitHub actions on forks The lifecycle release process involves chaining a series of GitHub actions together such that: @@ -77,6 +88,16 @@ Formats, vets, and tests the code. $ make test ``` +#### Mocks + +We use mock generators like most golang projects to help with our testing. To make new mocks: +```bash +$ make generate +$ make format lint +``` + +This is because the mock generator will make a larger diff that the formatter will fix. + ### Build Builds binaries to `out/linux/lifecycle/` and `out/windows/lifecycle/`. diff --git a/vendor/github.com/buildpacks/lifecycle/Makefile b/vendor/github.com/buildpacks/lifecycle/Makefile index 1c910d31db..75226123f2 100644 --- a/vendor/github.com/buildpacks/lifecycle/Makefile +++ b/vendor/github.com/buildpacks/lifecycle/Makefile @@ -30,7 +30,7 @@ LDFLAGS+=-X 'github.com/buildpacks/lifecycle/cmd.Version=$(LIFECYCLE_VERSION)' GOBUILD:=go build $(GOFLAGS) -ldflags "$(LDFLAGS)" GOTEST=$(GOCMD) test $(GOFLAGS) BUILD_DIR?=$(PWD)$/out -WINDOWS_COMPILATION_IMAGE?=golang:1.19-windowsservercore-1809 +WINDOWS_COMPILATION_IMAGE?=golang:1.20-windowsservercore-1809 SOURCE_COMPILATION_IMAGE?=lifecycle-img BUILD_CTR?=lifecycle-ctr DOCKER_CMD?=make test @@ -257,7 +257,7 @@ install-mockgen: install-golangci-lint: @echo "> Installing golangci-lint..." - $(GOCMD) install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.49.0 + $(GOCMD) install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.1 lint: install-golangci-lint @echo "> Linting code..." diff --git a/vendor/github.com/buildpacks/lifecycle/README.md b/vendor/github.com/buildpacks/lifecycle/README.md index ee26307248..19e20de8db 100644 --- a/vendor/github.com/buildpacks/lifecycle/README.md +++ b/vendor/github.com/buildpacks/lifecycle/README.md @@ -9,18 +9,20 @@ A reference implementation of the [Cloud Native Buildpacks specification](https://github.com/buildpacks/spec). ## Supported APIs -| Lifecycle Version | Platform APIs | Buildpack APIs | -|-------------------|------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------| -| 0.15.x* | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8], [0.9][p/0.9], [0.10][p/0.10] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7], [0.8][b/0.8], [0.9][b/0.9] | -| 0.14.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8], [0.9][p/0.9] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7], [0.8][b/0.8] | -| 0.13.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7] | -| 0.12.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6] | -| 0.11.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6] | -| 0.10.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5] | -| 0.9.x | [0.3][p/0.3], [0.4][p/0.4] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4] | -| 0.8.x | [0.3][p/0.3] | [0.2][b/0.2] | -| 0.7.x | [0.2][p/0.2] | [0.2][b/0.2] | -| 0.6.x | [0.2][p/0.2] | [0.2][b/0.2] | +| Lifecycle Version | Platform APIs | Buildpack APIs | +|-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------| +| 0.17.x* | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8], [0.9][p/0.9], [0.10][p/0.10], [0.11][p/0.11], [0.12][p/0.12] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7], [0.8][b/0.8], [0.9][b/0.9], [0.10][b/0.10] | +| 0.16.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8], [0.9][p/0.9], [0.10][p/0.10], [0.11][p/0.11] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7], [0.8][b/0.8], [0.9][b/0.9] | +| 0.15.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8], [0.9][p/0.9], [0.10][p/0.10] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7], [0.8][b/0.8], [0.9][b/0.9] | +| 0.14.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8], [0.9][p/0.9] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7], [0.8][b/0.8] | +| 0.13.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7], [0.8][p/0.8] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6], [0.7][b/0.7] | +| 0.12.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6], [0.7][p/0.7] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6] | +| 0.11.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5], [0.6][p/0.6] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5], [0.6][b/0.6] | +| 0.10.x | [0.3][p/0.3], [0.4][p/0.4], [0.5][p/0.5] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4], [0.5][b/0.5] | +| 0.9.x | [0.3][p/0.3], [0.4][p/0.4] | [0.2][b/0.2], [0.3][b/0.3], [0.4][b/0.4] | +| 0.8.x | [0.3][p/0.3] | [0.2][b/0.2] | +| 0.7.x | [0.2][p/0.2] | [0.2][b/0.2] | +| 0.6.x | [0.2][p/0.2] | [0.2][b/0.2] | [b/0.2]: https://github.com/buildpacks/spec/blob/buildpack/v0.2/buildpack.md [b/0.3]: https://github.com/buildpacks/spec/tree/buildpack/v0.3/buildpack.md @@ -30,6 +32,7 @@ A reference implementation of the [Cloud Native Buildpacks specification](https: [b/0.7]: https://github.com/buildpacks/spec/tree/buildpack/v0.7/buildpack.md [b/0.8]: https://github.com/buildpacks/spec/tree/buildpack/v0.8/buildpack.md [b/0.9]: https://github.com/buildpacks/spec/tree/buildpack/v0.9/buildpack.md +[b/0.10]: https://github.com/buildpacks/spec/tree/buildpack/v0.10/buildpack.md [p/0.2]: https://github.com/buildpacks/spec/blob/platform/v0.2/platform.md [p/0.3]: https://github.com/buildpacks/spec/blob/platform/v0.3/platform.md [p/0.4]: https://github.com/buildpacks/spec/blob/platform/v0.4/platform.md @@ -39,6 +42,8 @@ A reference implementation of the [Cloud Native Buildpacks specification](https: [p/0.8]: https://github.com/buildpacks/spec/blob/platform/v0.8/platform.md [p/0.9]: https://github.com/buildpacks/spec/blob/platform/v0.9/platform.md [p/0.10]: https://github.com/buildpacks/spec/blob/platform/v0.10/platform.md +[p/0.11]: https://github.com/buildpacks/spec/blob/platform/v0.11/platform.md +[p/0.12]: https://github.com/buildpacks/spec/blob/platform/v0.12/platform.md \* denotes unreleased version diff --git a/vendor/github.com/buildpacks/lifecycle/analyzer.go b/vendor/github.com/buildpacks/lifecycle/analyzer.go index 75ed0662a1..0206aa562f 100644 --- a/vendor/github.com/buildpacks/lifecycle/analyzer.go +++ b/vendor/github.com/buildpacks/lifecycle/analyzer.go @@ -8,9 +8,11 @@ import ( "github.com/buildpacks/lifecycle/buildpack" "github.com/buildpacks/lifecycle/cache" "github.com/buildpacks/lifecycle/image" + "github.com/buildpacks/lifecycle/internal/fsutil" "github.com/buildpacks/lifecycle/internal/layer" "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) type AnalyzerFactory struct { @@ -18,7 +20,7 @@ type AnalyzerFactory struct { apiVerifier BuildpackAPIVerifier cacheHandler CacheHandler configHandler ConfigHandler - imageHandler ImageHandler + imageHandler image.Handler registryHandler RegistryHandler } @@ -27,7 +29,7 @@ func NewAnalyzerFactory( apiVerifier BuildpackAPIVerifier, cacheHandler CacheHandler, configHandler ConfigHandler, - imageHandler ImageHandler, + imageHandler image.Handler, registryHandler RegistryHandler, ) *AnalyzerFactory { return &AnalyzerFactory{ @@ -45,6 +47,7 @@ type Analyzer struct { RunImage imgutil.Image Logger log.Logger SBOMRestorer layer.SBOMRestorer + PlatformAPI *api.Version // Platform API < 0.7 Buildpacks []buildpack.GroupElement @@ -71,6 +74,7 @@ func (f *AnalyzerFactory) NewAnalyzer( LayerMetadataRestorer: &layer.NopMetadataRestorer{}, Logger: logger, SBOMRestorer: &layer.NopSBOMRestorer{}, + PlatformAPI: f.platformAPI, } if f.platformAPI.AtLeast("0.7") { @@ -113,7 +117,7 @@ func (f *AnalyzerFactory) ensureRegistryAccess( ) error { var readImages, writeImages []string writeImages = append(writeImages, cacheImageRef) - if !f.imageHandler.Docker() { + if f.imageHandler.Kind() == image.RemoteKind { readImages = append(readImages, previousImageRef, runImageRef) writeImages = append(writeImages, outputImageRef) writeImages = append(writeImages, additionalTags...) @@ -160,7 +164,7 @@ func (f *AnalyzerFactory) setPrevious(analyzer *Analyzer, imageRef string, launc if err != nil { return errors.Wrap(err, "getting previous image") } - if launchCacheDir == "" || !f.imageHandler.Docker() { + if launchCacheDir == "" || f.imageHandler.Kind() != image.LocalKind { return nil } @@ -185,74 +189,85 @@ func (f *AnalyzerFactory) setRun(analyzer *Analyzer, imageRef string) error { } // Analyze fetches the layers metadata from the previous image and writes analyzed.toml. -func (a *Analyzer) Analyze() (platform.AnalyzedMetadata, error) { +func (a *Analyzer) Analyze() (files.Analyzed, error) { var ( - err error - appMeta platform.LayersMetadata - cacheMeta platform.CacheMetadata - previousImageID *platform.ImageIdentifier - runImageID *platform.ImageIdentifier + err error + appMeta files.LayersMetadata + cacheMeta platform.CacheMetadata + previousImageRef string + runImageRef string ) + appMeta, previousImageRef, err = a.retrieveAppMetadata() + if err != nil { + return files.Analyzed{}, err + } - if a.PreviousImage != nil { // Previous image is optional in Platform API >= 0.7 - if previousImageID, err = a.getImageIdentifier(a.PreviousImage); err != nil { - return platform.AnalyzedMetadata{}, errors.Wrap(err, "retrieving image identifier") - } - - // continue even if the label cannot be decoded - if err = image.DecodeLabel(a.PreviousImage, platform.LayerMetadataLabel, &appMeta); err != nil { - appMeta = platform.LayersMetadata{} - } - - if err = a.SBOMRestorer.RestoreFromPrevious(a.PreviousImage, bomSHA(appMeta)); err != nil { - return platform.AnalyzedMetadata{}, errors.Wrap(err, "retrieving launch SBOM layer") + if sha := bomSHA(appMeta); sha != "" { + if err = a.SBOMRestorer.RestoreFromPrevious(a.PreviousImage, sha); err != nil { + return files.Analyzed{}, errors.Wrap(err, "retrieving launch SBOM layer") } - } else { - appMeta = platform.LayersMetadata{} } + var ( + atm *files.TargetMetadata + runImageName string + ) if a.RunImage != nil { - runImageID, err = a.getImageIdentifier(a.RunImage) + runImageRef, err = a.getImageIdentifier(a.RunImage) if err != nil { - return platform.AnalyzedMetadata{}, errors.Wrap(err, "retrieving image identifier") + return files.Analyzed{}, errors.Wrap(err, "identifying run image") + } + if a.PlatformAPI.AtLeast("0.12") { + runImageName = a.RunImage.Name() + atm, err = platform.GetTargetMetadata(a.RunImage) + if err != nil { + return files.Analyzed{}, errors.Wrap(err, "unpacking metadata from image") + } + if atm.OS == "" { + platform.GetTargetOSFromFileSystem(&fsutil.Detect{}, atm, a.Logger) + } } } if a.RestoresLayerMetadata { cacheMeta, err = retrieveCacheMetadata(a.Cache, a.Logger) if err != nil { - return platform.AnalyzedMetadata{}, err + return files.Analyzed{}, err } useShaFiles := true if err := a.LayerMetadataRestorer.Restore(a.Buildpacks, appMeta, cacheMeta, layer.NewSHAStore(useShaFiles)); err != nil { - return platform.AnalyzedMetadata{}, err + return files.Analyzed{}, err } } - return platform.AnalyzedMetadata{ - PreviousImage: previousImageID, - RunImage: runImageID, - Metadata: appMeta, + return files.Analyzed{ + PreviousImage: &files.ImageIdentifier{ + Reference: previousImageRef, + }, + RunImage: &files.RunImage{ + Reference: runImageRef, // the image identifier, e.g. "s0m3d1g3st" (the image identifier) when exporting to a daemon, or "some.registry/some-repo@sha256:s0m3d1g3st" when exporting to a registry + TargetMetadata: atm, + Image: runImageName, // the provided tag, e.g., "some.registry/some-repo:some-tag" if supported by the platform + }, + LayersMetadata: appMeta, }, nil } -func (a *Analyzer) getImageIdentifier(image imgutil.Image) (*platform.ImageIdentifier, error) { +func (a *Analyzer) getImageIdentifier(image imgutil.Image) (string, error) { if !image.Found() { - a.Logger.Infof("Previous image with name %q not found", image.Name()) - return nil, nil + a.Logger.Infof("Image with name %q not found", image.Name()) + return "", nil } identifier, err := image.Identifier() if err != nil { - return nil, err + return "", err } - a.Logger.Debugf("Analyzing image %q", identifier.String()) - return &platform.ImageIdentifier{ - Reference: identifier.String(), - }, nil + a.Logger.Debugf("Found image with identifier %q", identifier.String()) + return identifier.String(), nil } -func bomSHA(appMeta platform.LayersMetadata) string { +func bomSHA(appMeta files.LayersMetadata) string { if appMeta.BOM == nil { return "" } @@ -277,3 +292,24 @@ func retrieveCacheMetadata(fromCache Cache, logger log.Logger) (platform.CacheMe return cacheMeta, nil } + +func (a *Analyzer) retrieveAppMetadata() (files.LayersMetadata, string, error) { + if a.PreviousImage == nil { // Previous image is optional in Platform API >= 0.7 + return files.LayersMetadata{}, "", nil + } + previousImageRef, err := a.getImageIdentifier(a.PreviousImage) + if err != nil { + return files.LayersMetadata{}, "", errors.Wrap(err, "identifying previous image") + } + if a.PreviousImage.Found() && !a.PreviousImage.Valid() { + a.Logger.Infof("Ignoring image %q because it was corrupt", a.PreviousImage.Name()) + return files.LayersMetadata{}, "", nil + } + + var appMeta files.LayersMetadata + // continue even if the label cannot be decoded + if err = image.DecodeLabel(a.PreviousImage, platform.LifecycleMetadataLabel, &appMeta); err != nil { + return files.LayersMetadata{}, "", nil + } + return appMeta, previousImageRef, nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/api/apis.go b/vendor/github.com/buildpacks/lifecycle/api/apis.go index b0a8ba82a2..bd15042a20 100644 --- a/vendor/github.com/buildpacks/lifecycle/api/apis.go +++ b/vendor/github.com/buildpacks/lifecycle/api/apis.go @@ -8,8 +8,8 @@ import ( ) var ( - Platform = newApisMustParse([]string{"0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9", "0.10", "0.11"}, []string{"0.3", "0.4", "0.5", "0.6"}) - Buildpack = newApisMustParse([]string{"0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9"}, []string{"0.2", "0.3", "0.4", "0.5", "0.6"}) + Platform = newApisMustParse([]string{"0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9", "0.10", "0.11", "0.12"}, []string{"0.3", "0.4", "0.5", "0.6"}) + Buildpack = newApisMustParse([]string{"0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9", "0.10"}, []string{"0.2", "0.3", "0.4", "0.5", "0.6"}) ) type APIs struct { diff --git a/vendor/github.com/buildpacks/lifecycle/archive/archive.go b/vendor/github.com/buildpacks/lifecycle/archive/archive.go index 136190edc8..c435cb8d8a 100644 --- a/vendor/github.com/buildpacks/lifecycle/archive/archive.go +++ b/vendor/github.com/buildpacks/lifecycle/archive/archive.go @@ -2,6 +2,7 @@ package archive import ( "archive/tar" + "fmt" "io" "os" "path/filepath" @@ -17,7 +18,7 @@ type PathInfo struct { func AddFilesToArchive(tw TarWriter, files []PathInfo) error { for _, file := range files { if err := AddFileToArchive(tw, file.Path, file.Info); err != nil { - return err + return fmt.Errorf("failed to add file %s to archive: %w", file.Path, err) } } return nil diff --git a/vendor/github.com/buildpacks/lifecycle/archive/extract.go b/vendor/github.com/buildpacks/lifecycle/archive/extract.go index 56de8a4942..fccd577763 100644 --- a/vendor/github.com/buildpacks/lifecycle/archive/extract.go +++ b/vendor/github.com/buildpacks/lifecycle/archive/extract.go @@ -74,7 +74,7 @@ func Extract(tr TarReader) error { } dirsFound[hdr.Name] = true - case tar.TypeReg, tar.TypeRegA: + case tar.TypeReg: dirPath := filepath.Dir(hdr.Name) if !dirsFound[dirPath] { if _, err := os.Stat(dirPath); os.IsNotExist(err) { @@ -92,6 +92,9 @@ func Extract(tr TarReader) error { if err := createSymlink(hdr); err != nil { return errors.Wrapf(err, "failed to create symlink %q with target %q", hdr.Name, hdr.Linkname) } + case tar.TypeXGlobalHeader: + // ignore PAX Global Extended Headers + continue default: return fmt.Errorf("unknown file type in tar %d", hdr.Typeflag) } diff --git a/vendor/github.com/buildpacks/lifecycle/builder.go b/vendor/github.com/buildpacks/lifecycle/builder.go index 40cc3cffec..b3ef22d71d 100644 --- a/vendor/github.com/buildpacks/lifecycle/builder.go +++ b/vendor/github.com/buildpacks/lifecycle/builder.go @@ -18,6 +18,7 @@ import ( "github.com/buildpacks/lifecycle/layers" "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) type Platform interface { @@ -42,11 +43,12 @@ type Builder struct { Group buildpack.Group Logger log.Logger Out, Err io.Writer - Plan platform.BuildPlan + Plan files.Plan PlatformAPI *api.Version + AnalyzeMD files.Analyzed } -func (b *Builder) Build() (*platform.BuildMetadata, error) { +func (b *Builder) Build() (*files.BuildMetadata, error) { b.Logger.Debug("Starting build") // ensure layers SBOM directory is removed @@ -63,7 +65,12 @@ func (b *Builder) Build() (*platform.BuildMetadata, error) { ) processMap := newProcessMap() inputs := b.getBuildInputs() - inputs.Env = env.NewBuildEnv(os.Environ()) + if b.AnalyzeMD.RunImage != nil && b.AnalyzeMD.RunImage.TargetMetadata != nil && b.PlatformAPI.AtLeast("0.12") { + inputs.Env = env.NewBuildEnv(append(os.Environ(), platform.EnvVarsFor(*b.AnalyzeMD.RunImage.TargetMetadata)...)) + } else { + inputs.Env = env.NewBuildEnv(os.Environ()) + } + filteredPlan := b.Plan for _, bp := range b.Group.Group { @@ -136,7 +143,7 @@ func (b *Builder) Build() (*platform.BuildMetadata, error) { } b.Logger.Debug("Finished build") - return &platform.BuildMetadata{ + return &files.BuildMetadata{ BOM: launchBOM, Buildpacks: b.Group.Group, Extensions: b.Group.GroupExtensions, diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/bp_descriptor.go b/vendor/github.com/buildpacks/lifecycle/buildpack/bp_descriptor.go index b3cc045e41..41e1a9d90a 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/bp_descriptor.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/bp_descriptor.go @@ -3,16 +3,49 @@ package buildpack import ( + "fmt" + "os" "path/filepath" "github.com/BurntSushi/toml" ) type BpDescriptor struct { - WithAPI string `toml:"api"` - Buildpack BpInfo `toml:"buildpack"` - Order Order `toml:"order"` - WithRootDir string `toml:"-"` + WithAPI string `toml:"api"` + Buildpack BpInfo `toml:"buildpack"` + Order Order `toml:"order"` + WithRootDir string `toml:"-"` + Targets []TargetMetadata `toml:"targets"` + Stacks []StackMetadata `tome:"stacks"` // just for backwards compat so we can check if it's the bionic stack, which we translate to a target + +} + +type StackMetadata struct { + ID string `toml:"id"` +} + +type TargetMetadata struct { + OS string `json:"os" toml:"os"` + Arch string `json:"arch" toml:"arch"` + ArchVariant string `json:"arch-variant,omitempty" toml:"arch-variant"` + Distributions []OSDistribution `json:"distributions,omitempty" toml:"distributions"` +} + +func (t *TargetMetadata) String() string { + s := fmt.Sprintf("OS: %s, Arch: %s, ArchVariant: %s", t.OS, t.Arch, t.ArchVariant) + if len(t.Distributions) > 0 { + s += fmt.Sprintf(", Distributions: %s", t.Distributions) + } + return s +} + +type OSDistribution struct { + Name string `json:"name" toml:"name"` + Version string `json:"version" toml:"version"` +} + +func (d OSDistribution) String() string { + return fmt.Sprintf("Distribution: (Name: %s, Version: %s)", d.Name, d.Version) } type BpInfo struct { @@ -38,6 +71,36 @@ func ReadBpDescriptor(path string) (*BpDescriptor, error) { if descriptor.WithRootDir, err = filepath.Abs(filepath.Dir(path)); err != nil { return &BpDescriptor{}, err } + + if len(descriptor.Targets) == 0 { + for _, stack := range descriptor.Stacks { + if stack.ID == "io.buildpacks.stacks.bionic" { + descriptor.Targets = append(descriptor.Targets, TargetMetadata{OS: "linux", Arch: "amd64", Distributions: []OSDistribution{{Name: "ubuntu", Version: "18.04"}}}) + } else if stack.ID == "*" { + descriptor.Targets = append(descriptor.Targets, TargetMetadata{OS: "*", Arch: "*", Distributions: []OSDistribution{}}) + } + } + } + + if len(descriptor.Targets) == 0 { + binDir := filepath.Join(descriptor.WithRootDir, "bin") + if stat, _ := os.Stat(binDir); stat != nil { // technically i think there's always supposed to be a bin Dir but we weren't enforcing it previously so why start now? + binFiles, err := os.ReadDir(binDir) + if err != nil { + return &BpDescriptor{}, err + } + for i := 0; i < len(binFiles); i++ { + bf := binFiles[len(binFiles)-i-1] // we're iterating backwards b/c os.ReadDir sorts "build.exe" after "build" but we want to preferentially detect windows first. + fname := bf.Name() + if fname == "build.exe" || fname == "build.bat" { + descriptor.Targets = append(descriptor.Targets, TargetMetadata{OS: "windows", Arch: "*"}) + } + if fname == "build" { + descriptor.Targets = append(descriptor.Targets, TargetMetadata{OS: "linux", Arch: "*"}) + } + } + } + } return descriptor, nil } @@ -61,6 +124,10 @@ func (d *BpDescriptor) String() string { return d.Buildpack.Name + " " + d.Buildpack.Version } +func (d *BpDescriptor) TargetsList() []TargetMetadata { + return d.Targets +} + func (bg Group) Append(group ...Group) Group { for _, g := range group { bg.Group = append(bg.Group, g.Group...) diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/build.go b/vendor/github.com/buildpacks/lifecycle/buildpack/build.go index de5b36d95a..4db46f3174 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/build.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/build.go @@ -164,24 +164,18 @@ func runBuildCmd(d BpDescriptor, bpLayersDir, planPath string, inputs BuildInput func (d BpDescriptor) processLayers(layersDir string, logger log.Logger) (map[string]LayerMetadataFile, error) { if api.MustParse(d.WithAPI).LessThan("0.6") { return eachLayer(layersDir, d.WithAPI, func(path, buildpackAPI string) (LayerMetadataFile, error) { - layerMetadataFile, msg, err := DecodeLayerMetadataFile(path+".toml", buildpackAPI) + layerMetadataFile, err := DecodeLayerMetadataFile(path+".toml", buildpackAPI, logger) if err != nil { return LayerMetadataFile{}, err } - if msg != "" { - logger.Warn(msg) - } return layerMetadataFile, nil }) } return eachLayer(layersDir, d.WithAPI, func(path, buildpackAPI string) (LayerMetadataFile, error) { - layerMetadataFile, msg, err := DecodeLayerMetadataFile(path+".toml", buildpackAPI) + layerMetadataFile, err := DecodeLayerMetadataFile(path+".toml", buildpackAPI, logger) if err != nil { return LayerMetadataFile{}, err } - if msg != "" { - return LayerMetadataFile{}, errors.New(msg) - } if err := renameLayerDirIfNeeded(layerMetadataFile, path); err != nil { return LayerMetadataFile{}, err } diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/descriptor.go b/vendor/github.com/buildpacks/lifecycle/buildpack/descriptor.go index 5c7e7c1e23..fbba8bff59 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/descriptor.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/descriptor.go @@ -9,8 +9,11 @@ const ( type Descriptor interface { API() string Homepage() string + TargetsList() []TargetMetadata } +// BaseInfo is information shared by both buildpacks and extensions. +// For buildpacks it winds up under the toml `buildpack` key along with SBOM info, but extensions have no SBOMs. type BaseInfo struct { ClearEnv bool `toml:"clear-env,omitempty"` Homepage string `toml:"homepage,omitempty"` diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/dockerfile.go b/vendor/github.com/buildpacks/lifecycle/buildpack/dockerfile.go index 7e347a800f..4f191d72a7 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/dockerfile.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/dockerfile.go @@ -2,6 +2,7 @@ package buildpack import ( "bytes" + "errors" "fmt" "os" "strings" @@ -15,14 +16,38 @@ import ( const ( DockerfileKindBuild = "build" DockerfileKindRun = "run" + + buildDockerfileName = "build.Dockerfile" + runDockerfileName = "run.Dockerfile" + + baseImageArgName = "base_image" + baseImageArgRef = "${base_image}" + + errArgumentsNotPermitted = "run.Dockerfile should not expect arguments" + errBuildMissingRequiredARGCommand = "build.Dockerfile did not start with required ARG command" + errBuildMissingRequiredFROMCommand = "build.Dockerfile did not contain required FROM ${base_image} command" + errMissingRequiredStage = "%s should have at least one stage" + errMultiStageNotPermitted = "%s is not permitted to use multistage build" + errRunOtherInstructionsNotPermitted = "run.Dockerfile is not permitted to have instructions other than FROM" + warnCommandNotRecommended = "%s command %s on line %d is not recommended" ) -var permittedCommandsBuild = []string{"FROM", "ADD", "ARG", "COPY", "ENV", "LABEL", "RUN", "SHELL", "USER", "WORKDIR"} +var recommendedCommands = []string{"FROM", "ADD", "ARG", "COPY", "ENV", "LABEL", "RUN", "SHELL", "USER", "WORKDIR"} type DockerfileInfo struct { ExtensionID string Kind string Path string + // WithBase if populated indicates that the Dockerfile switches the image base to the provided value. + // If WithBase is empty, Extend should be true, otherwise there is nothing for the Dockerfile to do. + // However if WithBase is populated, Extend may be true or false. + WithBase string + // Extend if true indicates that the Dockerfile contains image modifications + // and if false indicates that the Dockerfile only switches the image base. + // If Extend is false, WithBase should be non-empty, otherwise there is nothing for the Dockerfile to do. + // However if Extend is true, WithBase may be empty or non-empty. + Extend bool + Ignore bool } type ExtendConfig struct { @@ -56,7 +81,7 @@ func parseDockerfile(dockerfile string) ([]instructions.Stage, []instructions.Ar return stages, metaArgs, nil } -func VerifyBuildDockerfile(dockerfile string, logger log.Logger) error { +func ValidateBuildDockerfile(dockerfile string, logger log.Logger) error { stages, margs, err := parseDockerfile(dockerfile) if err != nil { return err @@ -64,80 +89,83 @@ func VerifyBuildDockerfile(dockerfile string, logger log.Logger) error { // validate only 1 FROM if len(stages) > 1 { - return fmt.Errorf("build.Dockerfile is not permitted to use multistage build") + return fmt.Errorf(errMultiStageNotPermitted, buildDockerfileName) } // validate only permitted Commands for _, stage := range stages { for _, command := range stage.Commands { found := false - for _, permittedCommand := range permittedCommandsBuild { - if permittedCommand == strings.ToUpper(command.Name()) { + for _, rc := range recommendedCommands { + if rc == strings.ToUpper(command.Name()) { found = true break } } if !found { - logger.Warnf("build.Dockerfile command %s on line %d is not recommended", strings.ToUpper(command.Name()), command.Location()[0].Start.Line) + logger.Warnf(warnCommandNotRecommended, buildDockerfileName, strings.ToUpper(command.Name()), command.Location()[0].Start.Line) } } } // validate build.Dockerfile preamble if len(margs) != 1 { - return fmt.Errorf("build.Dockerfile did not start with required ARG command") + return errors.New(errBuildMissingRequiredARGCommand) } - if margs[0].Args[0].Key != "base_image" { - return fmt.Errorf("build.Dockerfile did not start with required ARG base_image command") + if margs[0].Args[0].Key != baseImageArgName { + return errors.New(errBuildMissingRequiredARGCommand) } // sanity check to prevent panic if len(stages) == 0 { - return fmt.Errorf("build.Dockerfile should have at least one stage") + return fmt.Errorf(errMissingRequiredStage, buildDockerfileName) } - if stages[0].BaseName != "${base_image}" { - return fmt.Errorf("build.Dockerfile did not contain required FROM ${base_image} command") + + if stages[0].BaseName != baseImageArgRef { + return errors.New(errBuildMissingRequiredFROMCommand) } return nil } -func VerifyRunDockerfile(dockerfile string) error { - stages, margs, err := parseDockerfile(dockerfile) +func ValidateRunDockerfile(dInfo *DockerfileInfo, logger log.Logger) error { + stages, _, err := parseDockerfile(dInfo.Path) if err != nil { return err } // validate only 1 FROM if len(stages) > 1 { - return fmt.Errorf("run.Dockerfile is not permitted to use multistage build") - } - - // validate FROM does not expect argument - if len(margs) > 0 { - return fmt.Errorf("run.Dockerfile should not expect arguments") + return fmt.Errorf(errMultiStageNotPermitted, runDockerfileName) } - - // sanity check to prevent panic if len(stages) == 0 { - return fmt.Errorf("run.Dockerfile should have at least one stage") + return fmt.Errorf(errMissingRequiredStage, runDockerfileName) } - // validate no instructions in stage - if len(stages[0].Commands) != 0 { - return fmt.Errorf("run.Dockerfile is not permitted to have instructions other than FROM") + var ( + newBase string + extend bool + ) + // validate only permitted Commands + for _, stage := range stages { + if stage.BaseName != baseImageArgRef { + newBase = stage.BaseName + } + for _, command := range stage.Commands { + extend = true + found := false + for _, rc := range recommendedCommands { + if rc == strings.ToUpper(command.Name()) { + found = true + break + } + } + if !found { + logger.Warnf(warnCommandNotRecommended, runDockerfileName, strings.ToUpper(command.Name()), command.Location()[0].Start.Line) + } + } } + dInfo.WithBase = newBase + dInfo.Extend = extend return nil } - -func RetrieveFirstFromImageNameFromDockerfile(dockerfile string) (string, error) { - ins, _, err := parseDockerfile(dockerfile) - if err != nil { - return "", err - } - // sanity check to prevent panic - if len(ins) == 0 { - return "", fmt.Errorf("expected at least one instruction") - } - return ins[0].BaseName, nil -} diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/ext_descriptor.go b/vendor/github.com/buildpacks/lifecycle/buildpack/ext_descriptor.go index 99bc72da9c..fa7a174eb0 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/ext_descriptor.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/ext_descriptor.go @@ -3,15 +3,17 @@ package buildpack import ( + "os" "path/filepath" "github.com/BurntSushi/toml" ) type ExtDescriptor struct { - WithAPI string `toml:"api"` - Extension ExtInfo `toml:"extension"` - WithRootDir string `toml:"-"` + WithAPI string `toml:"api"` + Extension ExtInfo `toml:"extension"` + WithRootDir string `toml:"-"` + Targets []TargetMetadata `toml:"targets"` } type ExtInfo struct { @@ -29,7 +31,38 @@ func ReadExtDescriptor(path string) (*ExtDescriptor, error) { if descriptor.WithRootDir, err = filepath.Abs(filepath.Dir(path)); err != nil { return &ExtDescriptor{}, err } - return descriptor, nil + err = descriptor.inferTargets() + return descriptor, err +} + +func (d *ExtDescriptor) inferTargets() error { + if len(d.Targets) == 0 { + binDir := filepath.Join(d.WithRootDir, "bin") + if stat, _ := os.Stat(binDir); stat != nil { + binFiles, err := os.ReadDir(binDir) + if err != nil { + return err + } + var windowsDetected, linuxDetected bool + for i := 0; i < len(binFiles); i++ { // detect and generate files are optional + bf := binFiles[len(binFiles)-i-1] // we're iterating backwards b/c os.ReadDir sorts "foo.exe" after "foo" but we want to preferentially detect windows first. + fname := bf.Name() + if !windowsDetected && (fname == "detect.exe" || fname == "detect.bat" || fname == "generate.exe" || fname == "generate.bat") { + d.Targets = append(d.Targets, TargetMetadata{OS: "windows", Arch: "*"}) + windowsDetected = true + } + if !linuxDetected && (fname == "detect" || fname == "generate") { + d.Targets = append(d.Targets, TargetMetadata{OS: "linux", Arch: "*"}) + linuxDetected = true + } + } + } + } + // fallback: if nothing worked just mark it */* + if len(d.Targets) == 0 { + d.Targets = append(d.Targets, TargetMetadata{OS: "*", Arch: "*"}) + } + return nil } func (d *ExtDescriptor) API() string { @@ -51,3 +84,7 @@ func (d *ExtDescriptor) RootDir() string { func (d *ExtDescriptor) String() string { return d.Extension.Name + " " + d.Extension.Version } + +func (d *ExtDescriptor) TargetsList() []TargetMetadata { + return d.Targets +} diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/generate.go b/vendor/github.com/buildpacks/lifecycle/buildpack/generate.go index 13dfba9d50..acfeaf89a1 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/generate.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/generate.go @@ -1,11 +1,13 @@ package buildpack import ( + "fmt" "io" "os" "os/exec" "path/filepath" + "github.com/buildpacks/lifecycle/internal/extend" "github.com/buildpacks/lifecycle/launch" "github.com/buildpacks/lifecycle/log" ) @@ -103,42 +105,63 @@ func runGenerateCmd(d ExtDescriptor, extOutputDir, planPath string, inputs Gener } func readOutputFilesExt(d ExtDescriptor, extOutputDir string, extPlanIn Plan, logger log.Logger) (GenerateOutputs, error) { - br := GenerateOutputs{} + gr := GenerateOutputs{} var err error var dfInfo DockerfileInfo var found bool // set MetRequires - br.MetRequires = names(extPlanIn.Entries) + gr.MetRequires = names(extPlanIn.Entries) + + // validate extend config + if err = extend.ValidateConfig(filepath.Join(extOutputDir, "extend-config.toml")); err != nil { + return GenerateOutputs{}, err + } // set Dockerfiles - if dfInfo, found, err = addDockerfileByPathAndType(d, extOutputDir, "run.Dockerfile", DockerfileKindRun, logger); err != nil { + if dfInfo, found, err = findDockerfileFor(d, extOutputDir, DockerfileKindRun, logger); err != nil { return GenerateOutputs{}, err } else if found { - br.Dockerfiles = append(br.Dockerfiles, dfInfo) + gr.Dockerfiles = append(gr.Dockerfiles, dfInfo) } - if dfInfo, found, err = addDockerfileByPathAndType(d, extOutputDir, "build.Dockerfile", DockerfileKindBuild, logger); err != nil { + if dfInfo, found, err = findDockerfileFor(d, extOutputDir, DockerfileKindBuild, logger); err != nil { return GenerateOutputs{}, err } else if found { - br.Dockerfiles = append(br.Dockerfiles, dfInfo) + gr.Dockerfiles = append(gr.Dockerfiles, dfInfo) } - logger.Debugf("Found '%d' Dockerfiles for processing", len(br.Dockerfiles)) + logger.Debugf("Found '%d' Dockerfiles for processing", len(gr.Dockerfiles)) - return br, nil + return gr, nil } -func addDockerfileByPathAndType(d ExtDescriptor, extOutputDir string, dockerfileName string, dockerfileType string, _ log.Logger) (DockerfileInfo, bool, error) { +func findDockerfileFor(d ExtDescriptor, extOutputDir string, kind string, logger log.Logger) (DockerfileInfo, bool, error) { var err error - dockerfile := filepath.Join(extOutputDir, dockerfileName) - if _, err = os.Stat(dockerfile); err != nil { - // ignore file not found, no dockerfile to add. + dockerfilePath := filepath.Join(extOutputDir, fmt.Sprintf("%s.Dockerfile", kind)) + if _, err = os.Stat(dockerfilePath); err != nil { + // ignore file not found, no Dockerfile to add. if !os.IsNotExist(err) { // any other errors are critical. return DockerfileInfo{}, true, err } return DockerfileInfo{}, false, nil } - return DockerfileInfo{ExtensionID: d.Extension.ID, Kind: dockerfileType, Path: dockerfile}, true, nil + + dInfo := DockerfileInfo{ExtensionID: d.Extension.ID, Kind: kind, Path: dockerfilePath} + if err = validateDockerfileFor(&dInfo, kind, logger); err != nil { + return DockerfileInfo{}, true, fmt.Errorf("failed to parse %s.Dockerfile for extension %s: %w", kind, d.Extension.ID, err) + } + return dInfo, true, nil +} + +func validateDockerfileFor(dInfo *DockerfileInfo, kind string, logger log.Logger) error { + switch kind { + case DockerfileKindBuild: + return ValidateBuildDockerfile(dInfo.Path, logger) + case DockerfileKindRun: + return ValidateRunDockerfile(dInfo, logger) + default: + return nil + } } diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/layermetadata.go b/vendor/github.com/buildpacks/lifecycle/buildpack/layermetadata.go index bbebe90275..840a104ee9 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/layermetadata.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/layermetadata.go @@ -7,6 +7,8 @@ import ( "github.com/BurntSushi/toml" + "github.com/buildpacks/lifecycle/log" + "github.com/buildpacks/lifecycle/api" ) @@ -34,12 +36,12 @@ func EncodeLayerMetadataFile(lmf LayerMetadataFile, path, buildpackAPI string) e return errors.New("couldn't find an encoder") } -func DecodeLayerMetadataFile(path, buildpackAPI string) (LayerMetadataFile, string, error) { // FIXME: pass the logger and print the warning inside (instead of returning a message) +func DecodeLayerMetadataFile(path string, buildpackAPI string, logger log.Logger) (LayerMetadataFile, error) { // FIXME: pass the logger and print the warning inside (instead of returning a message) fh, err := os.Open(path) if os.IsNotExist(err) { - return LayerMetadataFile{}, "", nil + return LayerMetadataFile{}, nil } else if err != nil { - return LayerMetadataFile{}, "", err + return LayerMetadataFile{}, err } defer fh.Close() @@ -47,10 +49,18 @@ func DecodeLayerMetadataFile(path, buildpackAPI string) (LayerMetadataFile, stri for _, decoder := range decoders { if decoder.IsSupported(buildpackAPI) { - return decoder.Decode(path) + lmf, str, err := decoder.Decode(path) + if str != "" { + if api.MustParse(buildpackAPI).LessThan("0.6") { + logger.Warn(str) + } else { + return LayerMetadataFile{}, errors.New(str) + } + } + return lmf, err } } - return LayerMetadataFile{}, "", errors.New("couldn't find a decoder") + return LayerMetadataFile{}, errors.New("couldn't find a decoder") } type encoderDecoder interface { diff --git a/vendor/github.com/buildpacks/lifecycle/buildpack/layers.go b/vendor/github.com/buildpacks/lifecycle/buildpack/layers.go index 56a47b0209..2d91cad793 100644 --- a/vendor/github.com/buildpacks/lifecycle/buildpack/layers.go +++ b/vendor/github.com/buildpacks/lifecycle/buildpack/layers.go @@ -124,8 +124,13 @@ type Layer struct { // FIXME: need to refactor so api and logger won't be part o } type layerDir struct { + // identifier takes the form "bp-id:bp-version" and is used for + // sorting layers, + // logging information about a layer, and + // creating the temporary tar file that is the basis of the layer. identifier string - path string + // path takes the form // + path string } func (l *Layer) Name() string { @@ -148,17 +153,10 @@ func (l *Layer) Path() string { func (l *Layer) Read() (LayerMetadata, error) { tomlPath := l.Path() + ".toml" - layerMetadataFile, msg, err := DecodeLayerMetadataFile(tomlPath, l.api) + layerMetadataFile, err := DecodeLayerMetadataFile(tomlPath, l.api, l.logger) if err != nil { return LayerMetadata{}, err } - if msg != "" { - if api.MustParse(l.api).LessThan("0.6") { - l.logger.Warn(msg) - } else { - return LayerMetadata{}, errors.New(msg) - } - } var sha string shaBytes, err := os.ReadFile(l.Path() + ".sha") if err != nil && !os.IsNotExist(err) { // if the sha file doesn't exist, an empty sha will be returned diff --git a/vendor/github.com/buildpacks/lifecycle/cache.go b/vendor/github.com/buildpacks/lifecycle/cache.go index 324d17f137..42df6486b6 100644 --- a/vendor/github.com/buildpacks/lifecycle/cache.go +++ b/vendor/github.com/buildpacks/lifecycle/cache.go @@ -8,6 +8,7 @@ import ( "github.com/pkg/errors" "github.com/buildpacks/lifecycle/buildpack" + "github.com/buildpacks/lifecycle/layers" "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" ) @@ -51,7 +52,8 @@ func (e *Exporter) Cache(layersDir string, cacheStore Cache) error { continue } origLayerMetadata := origMeta.MetadataForBuildpack(bp.ID).Layers[layer.Name()] - if lmd.SHA, err = e.addOrReuseCacheLayer(cacheStore, &layer, origLayerMetadata.SHA); err != nil { + createdBy := fmt.Sprintf(layers.BuildpackLayerName, layer.Name(), fmt.Sprintf("%s@%s", bp.ID, bp.Version)) + if lmd.SHA, err = e.addOrReuseCacheLayer(cacheStore, &layer, origLayerMetadata.SHA, createdBy); err != nil { e.Logger.Warnf("Failed to cache layer '%s': %s", layer.Identifier(), err) continue } @@ -89,8 +91,8 @@ func (l *layerDir) Path() string { return l.path } -func (e *Exporter) addOrReuseCacheLayer(cache Cache, layerDir LayerDir, previousSHA string) (string, error) { - layer, err := e.LayerFactory.DirLayer(layerDir.Identifier(), layerDir.Path()) +func (e *Exporter) addOrReuseCacheLayer(cache Cache, layerDir LayerDir, previousSHA, createdBy string) (string, error) { + layer, err := e.LayerFactory.DirLayer(layerDir.Identifier(), layerDir.Path(), createdBy) if err != nil { return "", errors.Wrapf(err, "creating layer '%s'", layerDir.Identifier()) } @@ -111,14 +113,14 @@ func (e *Exporter) addSBOMCacheLayer(layersDir string, cacheStore Cache, origMet } if sbomCacheDir != nil { - l, err := e.LayerFactory.DirLayer(sbomCacheDir.Identifier(), sbomCacheDir.Path()) + l, err := e.LayerFactory.DirLayer(sbomCacheDir.Identifier(), sbomCacheDir.Path(), layers.SBOMLayerName) if err != nil { return errors.Wrapf(err, "creating layer '%s', path: '%s'", sbomCacheDir.Identifier(), sbomCacheDir.Path()) } lyr := &layerDir{path: l.TarPath, identifier: l.ID} - meta.BOM.SHA, err = e.addOrReuseCacheLayer(cacheStore, lyr, origMetadata.BOM.SHA) + meta.BOM.SHA, err = e.addOrReuseCacheLayer(cacheStore, lyr, origMetadata.BOM.SHA, layers.SBOMLayerName) if err != nil { return err } diff --git a/vendor/github.com/buildpacks/lifecycle/cache/caching_image.go b/vendor/github.com/buildpacks/lifecycle/cache/caching_image.go index 76fdff0b18..87a1ec7454 100644 --- a/vendor/github.com/buildpacks/lifecycle/cache/caching_image.go +++ b/vendor/github.com/buildpacks/lifecycle/cache/caching_image.go @@ -8,6 +8,7 @@ import ( "os" "github.com/buildpacks/imgutil" + v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/pkg/errors" ) @@ -46,6 +47,14 @@ func (c *CachingImage) AddLayerWithDiffID(path string, diffID string) error { return c.Image.AddLayerWithDiffID(path, diffID) } +func (c *CachingImage) AddLayerWithDiffIDAndHistory(path string, diffID string, history v1.History) error { + if err := c.cache.AddLayerFile(path, diffID); err != nil { + return err + } + + return c.Image.AddLayerWithDiffIDAndHistory(path, diffID, history) +} + func (c *CachingImage) ReuseLayer(diffID string) error { found, err := c.cache.HasLayer(diffID) if err != nil { @@ -73,6 +82,33 @@ func (c *CachingImage) ReuseLayer(diffID string) error { return c.cache.AddLayer(rc, diffID) } +func (c *CachingImage) ReuseLayerWithHistory(diffID string, history v1.History) error { + found, err := c.cache.HasLayer(diffID) + if err != nil { + return err + } + + if found { + if err := c.cache.ReuseLayer(diffID); err != nil { + return err + } + path, err := c.cache.RetrieveLayerFile(diffID) + if err != nil { + return err + } + return c.Image.AddLayerWithDiffIDAndHistory(path, diffID, history) + } + + if err := c.Image.ReuseLayerWithHistory(diffID, history); err != nil { + return err + } + rc, err := c.Image.GetLayer(diffID) + if err != nil { + return err + } + return c.cache.AddLayer(rc, diffID) +} + func (c *CachingImage) GetLayer(diffID string) (io.ReadCloser, error) { if found, err := c.cache.HasLayer(diffID); err != nil { return nil, fmt.Errorf("layer with SHA '%s' not found", diffID) diff --git a/vendor/github.com/buildpacks/lifecycle/cache/image_cache.go b/vendor/github.com/buildpacks/lifecycle/cache/image_cache.go index 29008aad96..e82633d584 100644 --- a/vendor/github.com/buildpacks/lifecycle/cache/image_cache.go +++ b/vendor/github.com/buildpacks/lifecycle/cache/image_cache.go @@ -12,6 +12,7 @@ import ( "github.com/pkg/errors" "github.com/buildpacks/lifecycle/image" + "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" ) @@ -21,16 +22,18 @@ type ImageCache struct { committed bool origImage imgutil.Image newImage imgutil.Image + logger log.Logger } -func NewImageCache(origImage imgutil.Image, newImage imgutil.Image) *ImageCache { +func NewImageCache(origImage imgutil.Image, newImage imgutil.Image, logger log.Logger) *ImageCache { return &ImageCache{ origImage: origImage, newImage: newImage, + logger: logger, } } -func NewImageCacheFromName(name string, keychain authn.Keychain) (*ImageCache, error) { +func NewImageCacheFromName(name string, keychain authn.Keychain, logger log.Logger) (*ImageCache, error) { origImage, err := remote.NewImage( name, keychain, @@ -51,7 +54,7 @@ func NewImageCacheFromName(name string, keychain authn.Keychain) (*ImageCache, e return nil, fmt.Errorf("creating new cache image %q: %v", name, err) } - return NewImageCache(origImage, emptyImage), nil + return NewImageCache(origImage, emptyImage, logger), nil } func (c *ImageCache) Exists() bool { @@ -74,6 +77,10 @@ func (c *ImageCache) SetMetadata(metadata platform.CacheMetadata) error { } func (c *ImageCache) RetrieveMetadata() (platform.CacheMetadata, error) { + if !c.origImage.Valid() { + c.logger.Infof("Ignoring cache image %q because it was corrupt", c.origImage.Name()) + return platform.CacheMetadata{}, nil + } var meta platform.CacheMetadata if err := image.DecodeLabel(c.origImage, MetadataLabel, &meta); err != nil { return platform.CacheMetadata{}, nil @@ -115,7 +122,7 @@ func (c *ImageCache) Commit() error { if origImgExists { // Deleting the original image is for cleanup only and should not fail the commit. if err := c.DeleteOrigImage(); err != nil { - fmt.Printf("Unable to delete previous cache image: %v", err) + c.logger.Warnf("Unable to delete previous cache image: %v", err.Error()) } } c.origImage = c.newImage diff --git a/vendor/github.com/buildpacks/lifecycle/cmd/apis.go b/vendor/github.com/buildpacks/lifecycle/cmd/apis.go new file mode 100644 index 0000000000..6b45489d30 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/cmd/apis.go @@ -0,0 +1,108 @@ +package cmd + +import ( + "fmt" + "os" + "strings" + + "github.com/buildpacks/lifecycle/api" + "github.com/buildpacks/lifecycle/log" +) + +const ( + EnvDeprecationMode = "CNB_DEPRECATION_MODE" + DefaultDeprecationMode = ModeWarn + + ModeQuiet = "quiet" + ModeWarn = "warn" + ModeError = "error" +) + +var DeprecationMode = EnvOrDefault(EnvDeprecationMode, DefaultDeprecationMode) + +type BuildpackAPIVerifier struct{} + +func (v *BuildpackAPIVerifier) VerifyBuildpackAPI(kind, name, requested string, logger log.Logger) error { + return VerifyBuildpackAPI(kind, name, requested, logger) +} + +func VerifyBuildpackAPI(kind, name, requested string, logger log.Logger) error { + requestedAPI, err := api.NewVersion(requested) + if err != nil { + return FailErrCode( + nil, + CodeForIncompatibleBuildpackAPI, + fmt.Sprintf("parse buildpack API '%s' for %s '%s'", requestedAPI, strings.ToLower(kind), name), + ) + } + if api.Buildpack.IsSupported(requestedAPI) { + if api.Buildpack.IsDeprecated(requestedAPI) { + switch DeprecationMode { + case ModeQuiet: + break + case ModeError: + logger.Errorf("%s '%s' requests deprecated API '%s'", kind, name, requested) + logger.Errorf("Deprecated APIs are disabled by %s=%s", EnvDeprecationMode, ModeError) + return buildpackAPIError(kind, name, requested) + case ModeWarn: + logger.Warnf("%s '%s' requests deprecated API '%s'", kind, name, requested) + default: + logger.Warnf("%s '%s' requests deprecated API '%s'", kind, name, requested) + } + } + return nil + } + return buildpackAPIError(kind, name, requested) +} + +func buildpackAPIError(moduleKind string, name string, requested string) error { + return FailErrCode( + fmt.Errorf("buildpack API version '%s' is incompatible with the lifecycle", requested), + CodeForIncompatibleBuildpackAPI, + fmt.Sprintf("set API for %s '%s'", moduleKind, name), + ) +} + +func VerifyPlatformAPI(requested string, logger log.Logger) error { + requestedAPI, err := api.NewVersion(requested) + if err != nil { + return FailErrCode( + nil, + CodeForIncompatiblePlatformAPI, + fmt.Sprintf("parse platform API '%s'", requested), + ) + } + if api.Platform.IsSupported(requestedAPI) { + if api.Platform.IsDeprecated(requestedAPI) { + switch DeprecationMode { + case ModeQuiet: + break + case ModeError: + logger.Errorf("Platform requested deprecated API '%s'", requested) + logger.Errorf("Deprecated APIs are disabled by %s=%s", EnvDeprecationMode, ModeError) + return platformAPIError(requested) + case ModeWarn: + logger.Warnf("Platform requested deprecated API '%s'", requested) + default: + logger.Warnf("Platform requested deprecated API '%s'", requested) + } + } + return nil + } + return platformAPIError(requested) +} + +func platformAPIError(requested string) error { + return FailErrCode( + fmt.Errorf("platform API version '%s' is incompatible with the lifecycle", requested), + CodeForIncompatiblePlatformAPI, + "set platform API", + ) +} + +func EnvOrDefault(key string, defaultVal string) string { + if envVal := os.Getenv(key); envVal != "" { + return envVal + } + return defaultVal +} diff --git a/vendor/github.com/buildpacks/lifecycle/cmd/exit.go b/vendor/github.com/buildpacks/lifecycle/cmd/exit.go new file mode 100644 index 0000000000..190e85b6e3 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/cmd/exit.go @@ -0,0 +1,65 @@ +package cmd + +import ( + "fmt" + "os" + "strings" +) + +const ( + CodeForFailed = 1 + // 2: reserved + CodeForInvalidArgs = 3 + // 4: CodeForInvalidEnv + // 5: CodeForNotFound + // 9: CodeForFailedUpdate + + CodeForIncompatiblePlatformAPI = 11 + CodeForIncompatibleBuildpackAPI = 12 +) + +type ErrorFail struct { + Err error + Code int + Action []string +} + +func (e *ErrorFail) Error() string { + message := "failed to " + strings.Join(e.Action, " ") + if e.Err == nil { + return message + } + return fmt.Sprintf("%s: %s", message, e.Err) +} + +func FailCode(code int, action ...string) *ErrorFail { + return FailErrCode(nil, code, action...) +} + +func FailErr(err error, action ...string) *ErrorFail { + code := CodeForFailed + if err, ok := err.(*ErrorFail); ok { + code = err.Code + } + return FailErrCode(err, code, action...) +} + +func FailErrCode(err error, code int, action ...string) *ErrorFail { + return &ErrorFail{Err: err, Code: code, Action: action} +} + +func Exit(err error) { + if err == nil { + os.Exit(0) + } + DefaultLogger.Errorf("%s\n", err) + if err, ok := err.(*ErrorFail); ok { + os.Exit(err.Code) + } + os.Exit(CodeForFailed) +} + +func ExitWithVersion() { + DefaultLogger.Infof(buildVersion()) + os.Exit(0) +} diff --git a/vendor/github.com/buildpacks/lifecycle/cmd/logs.go b/vendor/github.com/buildpacks/lifecycle/cmd/logs.go new file mode 100644 index 0000000000..d787fabecc --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/cmd/logs.go @@ -0,0 +1,25 @@ +package cmd + +import ( + "os" + + "github.com/heroku/color" + + "github.com/buildpacks/lifecycle/log" +) + +func init() { + // Uncomment when https://github.com/buildpacks/pack/issues/493 (lifecycle containers with a tty) is implemented + // color.Disable(!terminal.IsTerminal(int(os.Stdout.Fd()))) +} + +var ( + DefaultLogger = log.NewDefaultLogger(Stdout) + Stdout = color.NewConsole(os.Stdout) + Stderr = color.NewConsole(os.Stderr) +) + +func DisableColor(noColor bool) { + Stdout.DisableColors(noColor) + Stderr.DisableColors(noColor) +} diff --git a/vendor/github.com/buildpacks/lifecycle/cmd/version.go b/vendor/github.com/buildpacks/lifecycle/cmd/version.go new file mode 100644 index 0000000000..3e6a4142e9 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/cmd/version.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "fmt" + "strings" +) + +// The following variables are injected at compile time. +var ( + // Version is the version of the lifecycle and all produced binaries. + Version = "0.0.0" + // SCMCommit is the commit information provided by SCM. + SCMCommit = "" + // SCMRepository is the source repository. + SCMRepository = "" +) + +// buildVersion is a display format of the version and build metadata in compliance with semver. +func buildVersion() string { + // noinspection GoBoolExpressions + if SCMCommit == "" || strings.Contains(Version, SCMCommit) { + return Version + } + + return fmt.Sprintf("%s+%s", Version, SCMCommit) +} diff --git a/vendor/github.com/buildpacks/lifecycle/detector.go b/vendor/github.com/buildpacks/lifecycle/detector.go index a54ada8491..5fa3879aac 100644 --- a/vendor/github.com/buildpacks/lifecycle/detector.go +++ b/vendor/github.com/buildpacks/lifecycle/detector.go @@ -12,8 +12,10 @@ import ( "github.com/buildpacks/lifecycle/api" "github.com/buildpacks/lifecycle/buildpack" "github.com/buildpacks/lifecycle/env" + "github.com/buildpacks/lifecycle/internal/encoding" "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) const ( @@ -28,7 +30,7 @@ var ( //go:generate mockgen -package testmock -destination testmock/detect_resolver.go github.com/buildpacks/lifecycle DetectResolver type DetectResolver interface { - Resolve(done []buildpack.GroupElement, detectRuns *sync.Map) ([]buildpack.GroupElement, []platform.BuildPlanEntry, error) + Resolve(done []buildpack.GroupElement, detectRuns *sync.Map) ([]buildpack.GroupElement, []files.BuildPlanEntry, error) } type DetectorFactory struct { @@ -63,6 +65,8 @@ type Detector struct { PlatformDir string Resolver DetectResolver Runs *sync.Map + AnalyzeMD files.Analyzed + PlatformAPI *api.Version // If detect fails, we want to print debug statements as info level. // memHandler holds all log entries; we'll iterate through them at the end of detect, @@ -70,9 +74,10 @@ type Detector struct { memHandler *memory.Handler } -func (f *DetectorFactory) NewDetector(appDir, buildConfigDir, orderPath, platformDir string, logger log.LoggerHandlerWithLevel) (*Detector, error) { +func (f *DetectorFactory) NewDetector(analyzedMD files.Analyzed, appDir, buildConfigDir, orderPath, platformDir string, logger log.LoggerHandlerWithLevel) (*Detector, error) { memHandler := memory.New() detector := &Detector{ + AnalyzeMD: analyzedMD, AppDir: appDir, BuildConfigDir: buildConfigDir, DirStore: f.dirStore, @@ -82,6 +87,7 @@ func (f *DetectorFactory) NewDetector(appDir, buildConfigDir, orderPath, platfor Resolver: NewDefaultDetectResolver(&apexlog.Logger{Handler: memHandler}), Runs: &sync.Map{}, memHandler: memHandler, + PlatformAPI: f.platformAPI, } if err := f.setOrder(detector, orderPath, logger); err != nil { return nil, err @@ -119,19 +125,19 @@ func (f *DetectorFactory) verifyAPIs(orderBp buildpack.Order, orderExt buildpack return nil } -func (d *Detector) Detect() (buildpack.Group, platform.BuildPlan, error) { +func (d *Detector) Detect() (buildpack.Group, files.Plan, error) { group, plan, detectErr := d.DetectOrder(d.Order) for _, e := range d.memHandler.Entries { if detectErr != nil || e.Level >= d.Logger.LogLevel() { if err := d.Logger.HandleLog(e); err != nil { - return buildpack.Group{}, platform.BuildPlan{}, fmt.Errorf("failed to handle log entry: %w", err) + return buildpack.Group{}, files.Plan{}, fmt.Errorf("failed to handle log entry: %w", err) } } } return group, plan, detectErr } -func (d *Detector) DetectOrder(order buildpack.Order) (buildpack.Group, platform.BuildPlan, error) { +func (d *Detector) DetectOrder(order buildpack.Order) (buildpack.Group, files.Plan, error) { detected, planEntries, err := d.detectOrder(order, nil, nil, false, &sync.WaitGroup{}) if err == ErrBuildpack { err = buildpack.NewError(err, buildpack.ErrTypeBuildpack) @@ -144,7 +150,7 @@ func (d *Detector) DetectOrder(order buildpack.Order) (buildpack.Group, platform } } return buildpack.Group{Group: filter(detected, buildpack.KindBuildpack), GroupExtensions: filter(detected, buildpack.KindExtension)}, - platform.BuildPlan{Entries: planEntries}, + files.Plan{Entries: planEntries}, err } @@ -158,7 +164,7 @@ func filter(group []buildpack.GroupElement, kind string) []buildpack.GroupElemen return out } -func (d *Detector) detectOrder(order buildpack.Order, done, next []buildpack.GroupElement, optional bool, wg *sync.WaitGroup) ([]buildpack.GroupElement, []platform.BuildPlanEntry, error) { +func (d *Detector) detectOrder(order buildpack.Order, done, next []buildpack.GroupElement, optional bool, wg *sync.WaitGroup) ([]buildpack.GroupElement, []files.BuildPlanEntry, error) { ngroup := buildpack.Group{Group: next} buildpackErr := false for _, group := range order { @@ -183,7 +189,26 @@ func (d *Detector) detectOrder(order buildpack.Order, done, next []buildpack.Gro return nil, nil, ErrFailedDetection } -func (d *Detector) detectGroup(group buildpack.Group, done []buildpack.GroupElement, wg *sync.WaitGroup) ([]buildpack.GroupElement, []platform.BuildPlanEntry, error) { +// isWildcard returns true IFF the Arch and OS are unspecified, meaning that the target arch/os are "any" +func isWildcard(t files.TargetMetadata) bool { + return t.Arch == "" && t.OS == "" +} + +func hasWildcard(ts []buildpack.TargetMetadata) bool { + for _, tm := range ts { + if tm.OS == "*" && tm.Arch == "*" { + return true + } + } + return false +} + +func (d *Detector) detectGroup(group buildpack.Group, done []buildpack.GroupElement, wg *sync.WaitGroup) ([]buildpack.GroupElement, []files.BuildPlanEntry, error) { + // used below to mark each item as "done" by appending it to the done list + markDone := func(groupEl buildpack.GroupElement, descriptor buildpack.Descriptor) { + done = append(done, groupEl.WithAPI(descriptor.API()).WithHomepage(descriptor.Homepage())) + } + for i, groupEl := range group.Group { // Continue if element has already been processed. if hasIDForKind(done, groupEl.Kind(), groupEl.ID) { @@ -195,32 +220,60 @@ func (d *Detector) detectGroup(group buildpack.Group, done []buildpack.GroupElem return d.detectOrder(groupEl.OrderExtensions, done, group.Group[i+1:], true, wg) } - // Lookup element in store. + // Lookup element in store. <-- "the store" is the directory where all the buildpacks are. var ( descriptor buildpack.Descriptor err error ) if groupEl.Kind() == buildpack.KindBuildpack { - descriptor, err = d.DirStore.LookupBp(groupEl.ID, groupEl.Version) + bpDescriptor, err := d.DirStore.LookupBp(groupEl.ID, groupEl.Version) if err != nil { return nil, nil, err } // Resolve order if element is a composite buildpack. - if order := descriptor.(*buildpack.BpDescriptor).Order; len(order) > 0 { + if order := bpDescriptor.Order; len(order) > 0 { // FIXME: double-check slice safety here // FIXME: cyclical references lead to infinite recursion return d.detectOrder(order, done, group.Group[i+1:], groupEl.Optional, wg) } + descriptor = bpDescriptor // standardize the type so below we don't have to care whether it was an extension } else { descriptor, err = d.DirStore.LookupExt(groupEl.ID, groupEl.Version) if err != nil { return nil, nil, err } } + if d.PlatformAPI.AtLeast("0.12") { + targetMatch := false + if isWildcard(d.AnalyzeMD.RunImageTarget()) || hasWildcard(descriptor.TargetsList()) { + targetMatch = true + } else { + for i := range descriptor.TargetsList() { + d.Logger.Debugf("Checking for match against descriptor: %s", descriptor.TargetsList()[i]) + if platform.TargetSatisfiedForBuild(*d.AnalyzeMD.RunImage.TargetMetadata, descriptor.TargetsList()[i]) { + targetMatch = true + break + } + } + } + if !targetMatch && !groupEl.Optional { + markDone(groupEl, descriptor) + d.Runs.Store( + keyFor(groupEl), + buildpack.DetectOutputs{ + Code: -1, + Err: fmt.Errorf( + "unable to satisfy target os/arch constraints; run image: %s, buildpack: %s", + encoding.ToJSONMaybe(d.AnalyzeMD.RunImage.TargetMetadata), + encoding.ToJSONMaybe(descriptor.TargetsList()), + ), + }) + continue + } + } - // Mark element as done. - done = append(done, groupEl.WithAPI(descriptor.API()).WithHomepage(descriptor.Homepage())) + markDone(groupEl, descriptor) // Run detect if element is a component buildpack or an extension. wg.Add(1) @@ -231,9 +284,13 @@ func (d *Detector) detectGroup(group buildpack.Group, done []buildpack.GroupElem AppDir: d.AppDir, BuildConfigDir: d.BuildConfigDir, PlatformDir: d.PlatformDir, - Env: env.NewBuildEnv(os.Environ()), } - d.Runs.Store(key, d.Executor.Detect(descriptor, inputs, d.Logger)) + if d.AnalyzeMD.RunImage != nil && d.AnalyzeMD.RunImage.TargetMetadata != nil && d.PlatformAPI.AtLeast("0.12") { + inputs.Env = env.NewBuildEnv(append(os.Environ(), platform.EnvVarsFor(*d.AnalyzeMD.RunImage.TargetMetadata)...)) + } else { + inputs.Env = env.NewBuildEnv(os.Environ()) + } + d.Runs.Store(key, d.Executor.Detect(descriptor, inputs, d.Logger)) // this is where we finally invoke bin/detect } wg.Done() }(key, descriptor) @@ -267,7 +324,7 @@ func NewDefaultDetectResolver(logger log.Logger) *DefaultDetectResolver { // Resolve aggregates the detect output for a group of buildpacks and tries to resolve a build plan for the group. // If any required buildpack in the group failed detection or a build plan cannot be resolved, it returns an error. -func (r *DefaultDetectResolver) Resolve(done []buildpack.GroupElement, detectRuns *sync.Map) ([]buildpack.GroupElement, []platform.BuildPlanEntry, error) { +func (r *DefaultDetectResolver) Resolve(done []buildpack.GroupElement, detectRuns *sync.Map) ([]buildpack.GroupElement, []files.BuildPlanEntry, error) { var groupRuns []buildpack.DetectOutputs for _, el := range done { key := keyFor(el) // FIXME: ensure the Detector and Resolver always use the same key @@ -370,7 +427,7 @@ func (r *DefaultDetectResolver) Resolve(done []buildpack.GroupElement, detectRun for _, r := range trial { found = append(found, r.GroupElement.NoOpt()) } - var plan []platform.BuildPlanEntry + var plan []files.BuildPlanEntry for _, dep := range deps { plan = append(plan, dep.BuildPlanEntry.NoOpt()) } @@ -477,7 +534,7 @@ func (ts detectTrial) remove(el buildpack.GroupElement) detectTrial { } type depEntry struct { - platform.BuildPlanEntry + files.BuildPlanEntry earlyRequires []buildpack.GroupElement extraProvides []buildpack.GroupElement } diff --git a/vendor/github.com/buildpacks/lifecycle/env/build.go b/vendor/github.com/buildpacks/lifecycle/env/build.go index efa26795f1..a4ebfbfb2a 100644 --- a/vendor/github.com/buildpacks/lifecycle/env/build.go +++ b/vendor/github.com/buildpacks/lifecycle/env/build.go @@ -5,8 +5,15 @@ import ( "strings" ) +// BuildEnvIncludelist are env vars that, if set in the lifecycle's execution environment - either in a builder or by the platform, are passed-through to buildpack executables var BuildEnvIncludelist = []string{ - "CNB_STACK_ID", + "CNB_STACK_ID", // deprecated as of api 0.12.0 + "CNB_TARGET_OS", + "CNB_TARGET_ARCH", + "CNB_TARGET_ARCH_VARIANT", + "CNB_TARGET_ID", + "CNB_TARGET_DISTRO_NAME", + "CNB_TARGET_DISTRO_VERSION", "HOSTNAME", "HOME", "HTTPS_PROXY", diff --git a/vendor/github.com/buildpacks/lifecycle/exporter.go b/vendor/github.com/buildpacks/lifecycle/exporter.go index f39086bde9..a6b0c32227 100644 --- a/vendor/github.com/buildpacks/lifecycle/exporter.go +++ b/vendor/github.com/buildpacks/lifecycle/exporter.go @@ -1,24 +1,32 @@ package lifecycle import ( + "compress/gzip" + "crypto/sha256" + "encoding/hex" "encoding/json" "fmt" "io" + "io/fs" "os" "path/filepath" "strings" "github.com/BurntSushi/toml" "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/local" + v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/pkg/errors" "github.com/buildpacks/lifecycle/api" "github.com/buildpacks/lifecycle/buildpack" + "github.com/buildpacks/lifecycle/image" "github.com/buildpacks/lifecycle/internal/fsutil" "github.com/buildpacks/lifecycle/launch" "github.com/buildpacks/lifecycle/layers" "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) type Cache interface { @@ -41,7 +49,7 @@ type Exporter struct { //go:generate mockgen -package testmock -destination testmock/layer_factory.go github.com/buildpacks/lifecycle LayerFactory type LayerFactory interface { - DirLayer(id string, dir string) (layers.Layer, error) + DirLayer(id string, dir string, createdBy string) (layers.Layer, error) LauncherLayer(path string) (layers.Layer, error) ProcessTypesLayer(metadata launch.Metadata) (layers.Layer, error) SliceLayers(dir string, slices []layers.Slice) ([]layers.Layer, error) @@ -50,112 +58,134 @@ type LayerFactory interface { type LauncherConfig struct { Path string SBOMDir string - Metadata platform.LauncherMetadata + Metadata files.LauncherMetadata } type ExportOptions struct { - LayersDir string - AppDir string - WorkingImage imgutil.Image - RunImageRef string - OrigMetadata platform.LayersMetadata - AdditionalNames []string - LauncherConfig LauncherConfig - Stack platform.StackMetadata - Project platform.ProjectMetadata + // WorkingImage is the image to save. + WorkingImage imgutil.Image + // AdditionalNames are additional tags to save to, besides WorkingImage.Name(). + AdditionalNames []string + // ExtendedDir is the location of extension-provided layers. + ExtendedDir string + // AppDir is the source directory. + AppDir string + // LayersDir is the location of buildpack-provided layers. + LayersDir string + // OrigMetadata was read from the previous image during the `analyze` phase, and is used to determine if a previously-uploaded layer can be re-used. + OrigMetadata files.LayersMetadata + // LauncherConfig is the launcher config. + LauncherConfig LauncherConfig + // DefaultProcessType is the user-provided default process type. DefaultProcessType string + // RunImageRef is the run image reference for the layer metadata label. + RunImageRef string + // RunImageForExport is run image metadata for the layer metadata label for Platform API >= 0.12. + RunImageForExport files.RunImageForExport + // Project is project metadata for the project metadata label. + Project files.ProjectMetadata } -func (e *Exporter) Export(opts ExportOptions) (platform.ExportReport, error) { +func (e *Exporter) Export(opts ExportOptions) (files.Report, error) { var err error if e.PlatformAPI.AtLeast("0.11") { if err = e.copyBuildpacksioSBOMs(opts); err != nil { - return platform.ExportReport{}, errors.Wrapf(err, "failed to copy buildpacksio SBOMs") + return files.Report{}, errors.Wrapf(err, "failed to copy buildpacksio SBOMs") } } opts.LayersDir, err = filepath.Abs(opts.LayersDir) if err != nil { - return platform.ExportReport{}, errors.Wrapf(err, "layers dir absolute path") + return files.Report{}, errors.Wrapf(err, "layers dir absolute path") } opts.AppDir, err = filepath.Abs(opts.AppDir) if err != nil { - return platform.ExportReport{}, errors.Wrapf(err, "app dir absolute path") + return files.Report{}, errors.Wrapf(err, "app dir absolute path") } - meta := platform.LayersMetadata{} + meta := files.LayersMetadata{} meta.RunImage.TopLayer, err = opts.WorkingImage.TopLayer() if err != nil { - return platform.ExportReport{}, errors.Wrap(err, "get run image top layer SHA") + return files.Report{}, errors.Wrap(err, "get run image top layer SHA") } - meta.RunImage.Reference = opts.RunImageRef - meta.Stack = opts.Stack - buildMD := &platform.BuildMetadata{} - if err := platform.DecodeBuildMetadataTOML(launch.GetMetadataFilePath(opts.LayersDir), e.PlatformAPI, buildMD); err != nil { - return platform.ExportReport{}, errors.Wrap(err, "read build metadata") + if e.PlatformAPI.AtLeast("0.12") { + meta.RunImage.Image = opts.RunImageForExport.Image + meta.RunImage.Mirrors = opts.RunImageForExport.Mirrors + } + // ensure we always copy the new RunImage into the old stack to preserve old behavior + meta.Stack = &files.Stack{RunImage: opts.RunImageForExport} + + buildMD := &files.BuildMetadata{} + if err := files.DecodeBuildMetadata(launch.GetMetadataFilePath(opts.LayersDir), e.PlatformAPI, buildMD); err != nil { + return files.Report{}, errors.Wrap(err, "read build metadata") + } + + // extension-provided layers + if err := e.addExtensionLayers(opts); err != nil { + return files.Report{}, err } // buildpack-provided layers if err := e.addBuildpackLayers(opts, &meta); err != nil { - return platform.ExportReport{}, err + return files.Report{}, err } if e.PlatformAPI.AtLeast("0.8") { if err := e.addSBOMLaunchLayer(opts, &meta); err != nil { - return platform.ExportReport{}, err + return files.Report{}, err } } // app layers (split into 1 or more slices) if err := e.addAppLayers(opts, buildMD.Slices, &meta); err != nil { - return platform.ExportReport{}, errors.Wrap(err, "exporting app layers") + return files.Report{}, errors.Wrap(err, "exporting app layers") } // launcher layers (launcher binary, launcher config, process symlinks) if err := e.addLauncherLayers(opts, buildMD, &meta); err != nil { - return platform.ExportReport{}, err + return files.Report{}, err } if err := e.setLabels(opts, meta, buildMD); err != nil { - return platform.ExportReport{}, err + return files.Report{}, err } if err := e.setEnv(opts, buildMD.ToLaunchMD()); err != nil { - return platform.ExportReport{}, err + return files.Report{}, err } if e.PlatformAPI.AtLeast("0.6") { e.Logger.Debugf("Setting WORKDIR: '%s'", opts.AppDir) if err := e.setWorkingDir(opts); err != nil { - return platform.ExportReport{}, errors.Wrap(err, "setting workdir") + return files.Report{}, errors.Wrap(err, "setting workdir") } } entrypoint, err := e.entrypoint(buildMD.ToLaunchMD(), opts.DefaultProcessType, buildMD.BuildpackDefaultProcessType) if err != nil { - return platform.ExportReport{}, errors.Wrap(err, "determining entrypoint") + return files.Report{}, errors.Wrap(err, "determining entrypoint") } e.Logger.Debugf("Setting ENTRYPOINT: '%s'", entrypoint) if err = opts.WorkingImage.SetEntrypoint(entrypoint); err != nil { - return platform.ExportReport{}, errors.Wrap(err, "setting entrypoint") + return files.Report{}, errors.Wrap(err, "setting entrypoint") } if err = opts.WorkingImage.SetCmd(); err != nil { // Note: Command intentionally empty - return platform.ExportReport{}, errors.Wrap(err, "setting cmd") + return files.Report{}, errors.Wrap(err, "setting cmd") } - report := platform.ExportReport{} + report := files.Report{} report.Build, err = e.makeBuildReport(opts.LayersDir) if err != nil { - return platform.ExportReport{}, err + return files.Report{}, err } report.Image, err = saveImage(opts.WorkingImage, opts.AdditionalNames, e.Logger) if err != nil { - return platform.ExportReport{}, err + return files.Report{}, err } if !e.supportsManifestSize() { // unset manifest size in report.toml for old platform API versions @@ -233,7 +263,137 @@ func (e *Exporter) copyDefaultSBOMsForComponent(component, dstDir string) error return nil } -func (e *Exporter) addBuildpackLayers(opts ExportOptions, meta *platform.LayersMetadata) error { +func (e *Exporter) addExtensionLayers(opts ExportOptions) error { + if !e.PlatformAPI.AtLeast("0.12") || opts.ExtendedDir == "" { + return nil + } + parentPath := filepath.Join(opts.ExtendedDir, "run") + extendedRunImage, extendedRunImagePath, err := image.FromLayoutPath(parentPath) + if err != nil { + return err + } + if extendedRunImage == nil { + return nil + } + extendedLayers, err := extendedRunImage.Layers() + if err != nil { + return err + } + configFile, err := extendedRunImage.ConfigFile() + if err != nil { + return err + } + history := configFile.History + var ( + localImage bool + artifactsDir string + ) + if isLocalImage(opts.WorkingImage) { + localImage = true + if artifactsDir, err = os.MkdirTemp("", "lifecycle.exporter.layer"); err != nil { + return err + } + } + for idx, l := range extendedLayers { + layerHex, err := l.DiffID() + if err != nil { + if _, ok := err.(*fs.PathError); ok { + continue // failed to get the diffID because the blob doesn't exist + } + return err + } + digest, err := l.Digest() + if err != nil { + return err + } + layerPath := filepath.Join(extendedRunImagePath, "blobs", digest.Algorithm, digest.Hex) + if localImage { + var calculatedDiffID string + if calculatedDiffID, err = uncompressLayerAt(layerPath, artifactsDir); err != nil { + return err + } + if calculatedDiffID != layerHex.String() { + return fmt.Errorf("digest of uncompressed layer from %s does not match expected value; found %q, expected %q", layerPath, calculatedDiffID, layerHex.String()) + } + layerPath = filepath.Join(artifactsDir, calculatedDiffID) + } + h := getHistoryForNonEmptyLayerAtIndex(history, idx) + _, extID := parseHistory(h) + layer := layers.Layer{ + ID: extID, + TarPath: layerPath, + Digest: layerHex.String(), + History: h, + } + if _, err = e.addOrReuseExtensionLayer(opts.WorkingImage, layer); err != nil { + return err + } + } + return nil +} + +func getHistoryForNonEmptyLayerAtIndex(history []v1.History, idx int) v1.History { + var processed int + for _, h := range history { + if h.EmptyLayer { + continue + } + if processed == idx { + return h + } + processed++ + } + return v1.History{} +} + +func parseHistory(history v1.History) (string, string) { + r := strings.NewReader(history.CreatedBy) + var ( + createdBy, extID string + ) + n, err := fmt.Fscanf(r, layers.ExtensionLayerName, &createdBy, &extID) + if err != nil || n != 2 { + return history.CreatedBy, "from extensions" + } + return createdBy, extID +} + +func isLocalImage(workingImage imgutil.Image) bool { + if _, ok := workingImage.(*local.Image); ok { + return true + } + return false +} + +func uncompressLayerAt(layerPath string, toArtifactsDir string) (string, error) { + sourceLayer, err := os.Open(layerPath) + if err != nil { + return "", err + } + zr, err := gzip.NewReader(sourceLayer) + if err != nil { + return "", err + } + tmpLayerPath := filepath.Join(toArtifactsDir, filepath.Base(layerPath)) // for now, used the compressed digest to uniquely identify the layer as we may be writing concurrently to this directory + targetLayer, err := os.Create(tmpLayerPath) + if err != nil { + return "", err + } + hasher := sha256.New() + mw := io.MultiWriter(targetLayer, hasher) // calculate the sha256 while writing to file + _, err = io.Copy(mw, zr) //nolint + if err != nil { + return "", err + } + diffID := hex.EncodeToString(hasher.Sum(nil)) + + if err = os.Rename(tmpLayerPath, filepath.Join(toArtifactsDir, fmt.Sprintf("sha256:%s", diffID))); err != nil { + return "", err + } + return fmt.Sprintf("sha256:%s", diffID), nil +} + +func (e *Exporter) addBuildpackLayers(opts ExportOptions, meta *files.LayersMetadata) error { for _, bp := range e.Buildpacks { bpDir, err := buildpack.ReadLayersDir(opts.LayersDir, bp, e.Logger) e.Logger.Debugf("Processing buildpack directory: %s", bpDir.Path) @@ -254,13 +414,14 @@ func (e *Exporter) addBuildpackLayers(opts ExportOptions, meta *platform.LayersM return errors.Wrapf(err, "reading '%s' metadata", fsLayer.Identifier()) } + createdBy := fmt.Sprintf(layers.BuildpackLayerName, fsLayer.Name(), fmt.Sprintf("%s@%s", bp.ID, bp.Version)) if fsLayer.HasLocalContents() { - layer, err := e.LayerFactory.DirLayer(fsLayer.Identifier(), fsLayer.Path()) + layer, err := e.LayerFactory.DirLayer(fsLayer.Identifier(), fsLayer.Path(), createdBy) if err != nil { return errors.Wrapf(err, "creating layer") } - origLayerMetadata := opts.OrigMetadata.MetadataForBuildpack(bp.ID).Layers[fsLayer.Name()] - lmd.SHA, err = e.addOrReuseLayer(opts.WorkingImage, layer, origLayerMetadata.SHA) + origLayerMetadata := opts.OrigMetadata.LayersMetadataFor(bp.ID).Layers[fsLayer.Name()] + lmd.SHA, err = e.addOrReuseBuildpackLayer(opts.WorkingImage, layer, origLayerMetadata.SHA, createdBy) if err != nil { return err } @@ -268,14 +429,14 @@ func (e *Exporter) addBuildpackLayers(opts ExportOptions, meta *platform.LayersM if lmd.Cache { return fmt.Errorf("layer '%s' is cache=true but has no contents", fsLayer.Identifier()) } - origLayerMetadata, ok := opts.OrigMetadata.MetadataForBuildpack(bp.ID).Layers[fsLayer.Name()] + origLayerMetadata, ok := opts.OrigMetadata.LayersMetadataFor(bp.ID).Layers[fsLayer.Name()] if !ok { return fmt.Errorf("cannot reuse '%s', previous image has no metadata for layer '%s'", fsLayer.Identifier(), fsLayer.Identifier()) } e.Logger.Infof("Reusing layer '%s'\n", fsLayer.Identifier()) e.Logger.Debugf("Layer '%s' SHA: %s\n", fsLayer.Identifier(), origLayerMetadata.SHA) - if err := opts.WorkingImage.ReuseLayer(origLayerMetadata.SHA); err != nil { + if err := opts.WorkingImage.ReuseLayerWithHistory(origLayerMetadata.SHA, v1.History{CreatedBy: createdBy}); err != nil { return errors.Wrapf(err, "reusing layer: '%s'", fsLayer.Identifier()) } lmd.SHA = origLayerMetadata.SHA @@ -295,31 +456,30 @@ func (e *Exporter) addBuildpackLayers(opts ExportOptions, meta *platform.LayersM return nil } -func (e *Exporter) addLauncherLayers(opts ExportOptions, buildMD *platform.BuildMetadata, meta *platform.LayersMetadata) error { +func (e *Exporter) addLauncherLayers(opts ExportOptions, buildMD *files.BuildMetadata, meta *files.LayersMetadata) error { launcherLayer, err := e.LayerFactory.LauncherLayer(opts.LauncherConfig.Path) if err != nil { return errors.Wrap(err, "creating launcher layers") } - meta.Launcher.SHA, err = e.addOrReuseLayer(opts.WorkingImage, launcherLayer, opts.OrigMetadata.Launcher.SHA) + meta.Launcher.SHA, err = e.addOrReuseBuildpackLayer(opts.WorkingImage, launcherLayer, opts.OrigMetadata.Launcher.SHA, layers.LauncherLayerName) if err != nil { return errors.Wrap(err, "exporting launcher configLayer") } - configLayer, err := e.LayerFactory.DirLayer("buildpacksio/lifecycle:config", filepath.Join(opts.LayersDir, "config")) + configLayer, err := e.LayerFactory.DirLayer("buildpacksio/lifecycle:config", filepath.Join(opts.LayersDir, "config"), layers.LauncherConfigLayerName) if err != nil { return errors.Wrapf(err, "creating layer '%s'", configLayer.ID) } - meta.Config.SHA, err = e.addOrReuseLayer(opts.WorkingImage, configLayer, opts.OrigMetadata.Config.SHA) + meta.Config.SHA, err = e.addOrReuseBuildpackLayer(opts.WorkingImage, configLayer, opts.OrigMetadata.Config.SHA, layers.LauncherConfigLayerName) if err != nil { return errors.Wrap(err, "exporting config layer") } - if err := e.launcherConfig(opts, buildMD, meta); err != nil { return err } return nil } -func (e *Exporter) addAppLayers(opts ExportOptions, slices []layers.Slice, meta *platform.LayersMetadata) error { +func (e *Exporter) addAppLayers(opts ExportOptions, slices []layers.Slice, meta *files.LayersMetadata) error { // creating app layers (slices + app dir) sliceLayers, err := e.LayerFactory.SliceLayers(opts.AppDir, slices) if err != nil { @@ -338,16 +498,16 @@ func (e *Exporter) addAppLayers(opts ExportOptions, slices []layers.Slice, meta } } if found { - err = opts.WorkingImage.ReuseLayer(slice.Digest) + err = opts.WorkingImage.ReuseLayerWithHistory(slice.Digest, slice.History) numberOfReusedLayers++ } else { - err = opts.WorkingImage.AddLayerWithDiffID(slice.TarPath, slice.Digest) + err = opts.WorkingImage.AddLayerWithDiffIDAndHistory(slice.TarPath, slice.Digest, slice.History) } if err != nil { return err } e.Logger.Debugf("Layer '%s' SHA: %s\n", slice.ID, slice.Digest) - meta.App = append(meta.App, platform.LayerMetadata{SHA: slice.Digest}) + meta.App = append(meta.App, files.LayerMetadata{SHA: slice.Digest}) } delta := len(sliceLayers) - numberOfReusedLayers @@ -360,14 +520,14 @@ func (e *Exporter) addAppLayers(opts ExportOptions, slices []layers.Slice, meta return nil } -func (e *Exporter) setLabels(opts ExportOptions, meta platform.LayersMetadata, buildMD *platform.BuildMetadata) error { +func (e *Exporter) setLabels(opts ExportOptions, meta files.LayersMetadata, buildMD *files.BuildMetadata) error { data, err := json.Marshal(meta) if err != nil { return errors.Wrap(err, "marshall metadata") } - e.Logger.Infof("Adding label '%s'", platform.LayerMetadataLabel) - if err = opts.WorkingImage.SetLabel(platform.LayerMetadataLabel, string(data)); err != nil { + e.Logger.Infof("Adding label '%s'", platform.LifecycleMetadataLabel) + if err = opts.WorkingImage.SetLabel(platform.LifecycleMetadataLabel, string(data)); err != nil { return errors.Wrap(err, "set app image metadata label") } @@ -479,8 +639,7 @@ func (e *Exporter) entrypoint(launchMD launch.Metadata, userDefaultProcessType, return launch.ProcessPath(buildpackDefaultProcessType), nil } -// processTypes adds -func (e *Exporter) launcherConfig(opts ExportOptions, buildMD *platform.BuildMetadata, meta *platform.LayersMetadata) error { +func (e *Exporter) launcherConfig(opts ExportOptions, buildMD *files.BuildMetadata, meta *files.LayersMetadata) error { if e.supportsMulticallLauncher() { launchMD := launch.Metadata{ Processes: buildMD.Processes, @@ -490,7 +649,7 @@ func (e *Exporter) launcherConfig(opts ExportOptions, buildMD *platform.BuildMet if err != nil { return errors.Wrapf(err, "creating layer '%s'", processTypesLayer.ID) } - meta.ProcessTypes.SHA, err = e.addOrReuseLayer(opts.WorkingImage, processTypesLayer, opts.OrigMetadata.ProcessTypes.SHA) + meta.ProcessTypes.SHA, err = e.addOrReuseBuildpackLayer(opts.WorkingImage, processTypesLayer, opts.OrigMetadata.ProcessTypes.SHA, layers.ProcessTypesLayerName) if err != nil { return errors.Wrapf(err, "exporting layer '%s'", processTypesLayer.ID) } @@ -519,48 +678,66 @@ func processTypeWarning(launchMD launch.Metadata, defaultProcessType string) str return fmt.Sprintf("default process type '%s' not present in list %+v", defaultProcessType, typeList) } -func (e *Exporter) addOrReuseLayer(image imgutil.Image, layer layers.Layer, previousSHA string) (string, error) { - layer, err := e.LayerFactory.DirLayer(layer.ID, layer.TarPath) +func (e *Exporter) addOrReuseBuildpackLayer(image imgutil.Image, layer layers.Layer, previousSHA, createdBy string) (string, error) { + layer, err := e.LayerFactory.DirLayer(layer.ID, layer.TarPath, createdBy) if err != nil { return "", errors.Wrapf(err, "creating layer '%s'", layer.ID) } if layer.Digest == previousSHA { e.Logger.Infof("Reusing layer '%s'\n", layer.ID) e.Logger.Debugf("Layer '%s' SHA: %s\n", layer.ID, layer.Digest) - return layer.Digest, image.ReuseLayer(previousSHA) + return layer.Digest, image.ReuseLayerWithHistory(previousSHA, layer.History) } e.Logger.Infof("Adding layer '%s'\n", layer.ID) e.Logger.Debugf("Layer '%s' SHA: %s\n", layer.ID, layer.Digest) - return layer.Digest, image.AddLayerWithDiffID(layer.TarPath, layer.Digest) + return layer.Digest, image.AddLayerWithDiffIDAndHistory(layer.TarPath, layer.Digest, layer.History) +} + +func (e *Exporter) addOrReuseExtensionLayer(image imgutil.Image, layer layers.Layer) (string, error) { + rc, err := image.GetLayer(layer.Digest) + if err != nil { + // FIXME: imgutil should declare an error type for missing layer + if !strings.Contains(err.Error(), "image did not have layer with diff id") && // remote + !strings.Contains(err.Error(), "does not contain layer with diff ID") { + return "", err + } + e.Logger.Infof("Adding extension layer %s\n", layer.ID) + e.Logger.Debugf("Layer '%s' SHA: %s\n", layer.ID, layer.Digest) + return layer.Digest, image.AddLayerWithDiffIDAndHistory(layer.TarPath, layer.Digest, layer.History) + } + _ = rc.Close() // close the layer reader + e.Logger.Infof("Reusing layer %s\n", layer.ID) + e.Logger.Debugf("Layer '%s' SHA: %s\n", layer.ID, layer.Digest) + return layer.Digest, image.ReuseLayerWithHistory(layer.Digest, layer.History) } -func (e *Exporter) makeBuildReport(layersDir string) (platform.BuildReport, error) { +func (e *Exporter) makeBuildReport(layersDir string) (files.BuildReport, error) { if e.PlatformAPI.LessThan("0.5") || e.PlatformAPI.AtLeast("0.9") { - return platform.BuildReport{}, nil + return files.BuildReport{}, nil } var out []buildpack.BOMEntry for _, bp := range e.Buildpacks { if api.MustParse(bp.API).LessThan("0.5") { continue } - var bpBuildReport platform.BuildReport + var bpBuildReport files.BuildReport bpBuildTOML := filepath.Join(layersDir, launch.EscapeID(bp.ID), "build.toml") if _, err := toml.DecodeFile(bpBuildTOML, &bpBuildReport); err != nil && !os.IsNotExist(err) { - return platform.BuildReport{}, err + return files.BuildReport{}, err } out = append(out, buildpack.WithBuildpack(bp, bpBuildReport.BOM)...) } - return platform.BuildReport{BOM: out}, nil + return files.BuildReport{BOM: out}, nil } -func (e *Exporter) addSBOMLaunchLayer(opts ExportOptions, meta *platform.LayersMetadata) error { +func (e *Exporter) addSBOMLaunchLayer(opts ExportOptions, meta *files.LayersMetadata) error { sbomLaunchDir, err := readLayersSBOM(opts.LayersDir, "launch", e.Logger) if err != nil { return errors.Wrap(err, "failed to read layers config sbom") } if sbomLaunchDir != nil { - layer, err := e.LayerFactory.DirLayer(sbomLaunchDir.Identifier(), sbomLaunchDir.Path()) + layer, err := e.LayerFactory.DirLayer(sbomLaunchDir.Identifier(), sbomLaunchDir.Path(), layers.SBOMLayerName) if err != nil { return errors.Wrapf(err, "creating layer") } @@ -570,12 +747,12 @@ func (e *Exporter) addSBOMLaunchLayer(opts ExportOptions, meta *platform.LayersM originalSHA = opts.OrigMetadata.BOM.SHA } - sha, err := e.addOrReuseLayer(opts.WorkingImage, layer, originalSHA) + sha, err := e.addOrReuseBuildpackLayer(opts.WorkingImage, layer, originalSHA, layers.SBOMLayerName) if err != nil { return errors.Wrapf(err, "exporting layer '%s'", layer.ID) } - meta.BOM = &platform.LayerMetadata{SHA: sha} + meta.BOM = &files.LayerMetadata{SHA: sha} } return nil diff --git a/vendor/github.com/buildpacks/lifecycle/extender.go b/vendor/github.com/buildpacks/lifecycle/extender.go index 2a36b9fd98..f325da1dbb 100644 --- a/vendor/github.com/buildpacks/lifecycle/extender.go +++ b/vendor/github.com/buildpacks/lifecycle/extender.go @@ -1,40 +1,49 @@ package lifecycle import ( - "errors" + "context" "fmt" + "io" "os" "path/filepath" + "strconv" + "strings" "time" "github.com/BurntSushi/toml" - "github.com/google/go-containerregistry/pkg/name" + "github.com/buildpacks/imgutil" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/empty" + "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/uuid" + "golang.org/x/sync/errgroup" "github.com/buildpacks/lifecycle/buildpack" "github.com/buildpacks/lifecycle/internal/extend" + "github.com/buildpacks/lifecycle/internal/selective" "github.com/buildpacks/lifecycle/launch" + "github.com/buildpacks/lifecycle/layers" "github.com/buildpacks/lifecycle/log" ) -const buildIDKey = "build_id" - type Extender struct { - AppDir string - GeneratedDir string - GroupPath string - ImageRef string - LayersDir string - PlatformDir string - CacheTTL time.Duration - DockerfileApplier DockerfileApplier - Extensions []buildpack.GroupElement - Logger log.Logger + AppDir string // explicitly ignored by the Dockerfile applier, also the Dockefile build context + ExtendedDir string // output directory for extended image layers + GeneratedDir string // input Dockerfiles are found here + ImageRef string // the image to extend + LayersDir string // explicitly ignored by the Dockerfile applier + PlatformDir string // explicitly ignored by the Dockerfile applier + + CacheTTL time.Duration // a platform input + DockerfileApplier DockerfileApplier // uses kaniko, BuildKit, or other to apply the provided Dockerfile to the provided image + Extensions []buildpack.GroupElement // extensions are ordered from group.toml } //go:generate mockgen -package testmock -destination testmock/dockerfile_applier.go github.com/buildpacks/lifecycle DockerfileApplier type DockerfileApplier interface { - Apply(workspace string, digest string, dockerfiles []extend.Dockerfile, options extend.Options) error + ImageFor(reference string) (v1.Image, error) + Apply(dockerfile extend.Dockerfile, toBaseImage v1.Image, withBuildOptions extend.Options, logger log.Logger) (v1.Image, error) + Cleanup() error } type ExtenderFactory struct { @@ -52,24 +61,26 @@ func NewExtenderFactory(apiVerifier BuildpackAPIVerifier, configHandler ConfigHa func (f *ExtenderFactory) NewExtender( analyzedPath string, appDir string, + extendedDir string, generatedDir string, groupPath string, layersDir string, platformDir string, cacheTTL time.Duration, dockerfileApplier DockerfileApplier, + kind string, logger log.Logger, ) (*Extender, error) { extender := &Extender{ AppDir: appDir, + ExtendedDir: extendedDir, GeneratedDir: generatedDir, LayersDir: layersDir, PlatformDir: platformDir, CacheTTL: cacheTTL, DockerfileApplier: dockerfileApplier, - Logger: logger, } - if err := f.setImageRef(extender, analyzedPath); err != nil { + if err := f.setImageRef(extender, kind, analyzedPath, logger); err != nil { return nil, err } if err := f.setExtensions(extender, groupPath, logger); err != nil { @@ -78,14 +89,21 @@ func (f *ExtenderFactory) NewExtender( return extender, nil } -func (f *ExtenderFactory) setImageRef(extender *Extender, path string) error { - analyzedMD, err := f.configHandler.ReadAnalyzed(path) +func (f *ExtenderFactory) setImageRef(extender *Extender, kind, path string, logr log.Logger) error { + analyzedMD, err := f.configHandler.ReadAnalyzed(path, logr) if err != nil { return err } - if analyzedMD.BuildImage != nil { - extender.ImageRef = analyzedMD.BuildImage.Reference + if kind == "build" { + if analyzedMD.BuildImage != nil { + extender.ImageRef = analyzedMD.BuildImage.Reference + } + } else if kind == "run" { + if analyzedMD.RunImage != nil { + extender.ImageRef = analyzedMD.RunImage.Reference + } } + return nil } @@ -113,38 +131,292 @@ func (f *ExtenderFactory) verifyAPIs(groupExt []buildpack.GroupElement, logger l return nil } -func (e *Extender) ExtendBuild() error { - e.Logger.Debugf("Extending %s", e.ImageRef) - var dockerfiles []extend.Dockerfile - for _, ext := range e.Extensions { - buildDockerfile, err := e.buildDockerfileFor(ext.ID) +func (e *Extender) Extend(kind string, logger log.Logger) error { + switch kind { + case buildpack.DockerfileKindBuild: + return e.extendBuild(logger) + case buildpack.DockerfileKindRun: + return e.extendRun(logger) + default: + return nil + } +} + +func (e *Extender) extendBuild(logger log.Logger) error { + origBaseImage, err := e.DockerfileApplier.ImageFor(e.ImageRef) + if err != nil { + return fmt.Errorf("getting build image to extend: %w", err) + } + + extendedImage, err := e.extend(buildpack.DockerfileKindBuild, origBaseImage, logger) + if err != nil { + return fmt.Errorf("extending build image: %w", err) + } + + if err = setImageEnvVarsInCurrentContext(extendedImage); err != nil { + return fmt.Errorf("setting environment variables from extended image in current context: %w", err) + } + return e.DockerfileApplier.Cleanup() +} + +func setImageEnvVarsInCurrentContext(image v1.Image) error { + configFile, err := image.ConfigFile() + if err != nil || configFile == nil { + return fmt.Errorf("getting config for extended image: %w", err) + } + for _, env := range configFile.Config.Env { + parts := strings.Split(env, "=") + if len(parts) != 2 { + return fmt.Errorf("parsing env '%s': expected format 'key=value'", env) + } + if err := os.Setenv(parts[0], parts[1]); err != nil { + return fmt.Errorf("setting env: %w", err) + } + } + return nil +} + +func (e *Extender) extendRun(logger log.Logger) error { + origBaseImage, err := e.DockerfileApplier.ImageFor(e.ImageRef) + if err != nil { + return fmt.Errorf("getting run image to extend: %w", err) + } + + origTopLayer, err := topLayer(origBaseImage) + if err != nil { + return fmt.Errorf("getting original run image top layer: %w", err) + } + + extendedImage, err := e.extend(buildpack.DockerfileKindRun, origBaseImage, logger) + if err != nil { + return fmt.Errorf("extending run image: %w", err) + } + + if err = e.saveSelective(extendedImage, origTopLayer); err != nil { + return fmt.Errorf("copying selective image to output directory: %w", err) + } + return e.DockerfileApplier.Cleanup() +} + +func topLayer(image v1.Image) (string, error) { + manifest, err := image.Manifest() + if err != nil { + return "", fmt.Errorf("getting image manifest: %w", err) + } + layers := manifest.Layers + if len(layers) == 0 { + return "", nil + } + layer := layers[len(layers)-1] + return layer.Digest.String(), nil +} + +func (e *Extender) saveSelective(image v1.Image, origTopLayerHash string) error { + // save sparse image (manifest and config) + imageHash, err := image.Digest() + if err != nil { + return fmt.Errorf("getting image hash: %w", err) + } + toPath := filepath.Join(e.ExtendedDir, "run", imageHash.String()) + layoutPath, err := selective.Write(toPath, empty.Index) // FIXME: this should use the imgutil layout/sparse package instead, but for some reason sparse.NewImage().Save() fails when the provided base image is already sparse + if err != nil { + return fmt.Errorf("initializing selective image: %w", err) + } + if err = layoutPath.AppendImage(image); err != nil { + return fmt.Errorf("saving selective image: %w", err) + } + // get all image layers (we will only copy those following the original top layer) + layers, err := image.Layers() + if err != nil { + return fmt.Errorf("getting image layers: %w", err) + } + var ( + currentHash v1.Hash + needsCopying bool + ) + if origTopLayerHash == "" { // if the original base image had no layers, copy all the layers + needsCopying = true + } + group, _ := errgroup.WithContext(context.TODO()) + for _, currentLayer := range layers { + currentHash, err = currentLayer.Digest() if err != nil { - return err + return fmt.Errorf("getting layer hash: %w", err) } - if buildDockerfile != nil { - e.Logger.Debugf("Found build Dockerfile for extension '%s'", ext.ID) - dockerfiles = append(dockerfiles, *buildDockerfile) + switch { + case needsCopying: + currentLayer := currentLayer // allow use in closure + group.Go(func() error { + return copyLayer(currentLayer, toPath) + }) + case currentHash.String() == origTopLayerHash: + needsCopying = true + continue + default: + continue } } - options := extend.Options{ - CacheTTL: e.CacheTTL, - IgnorePaths: []string{e.AppDir, e.LayersDir, e.PlatformDir}, + return group.Wait() +} + +func copyLayer(layer v1.Layer, toSparseImage string) error { + digest, err := layer.Digest() + if err != nil { + return err } - digest, err := name.NewDigest(e.ImageRef) + f, err := os.Create(filepath.Join(toSparseImage, "blobs", digest.Algorithm, digest.Hex)) if err != nil { - return fmt.Errorf("failed to get digest for reference %s: %w", e.ImageRef, err) + return err } - return e.DockerfileApplier.Apply(e.AppDir, digest.DigestStr(), dockerfiles, options) + defer f.Close() + rc, err := layer.Compressed() + if err != nil { + return err + } + defer rc.Close() + _, err = io.Copy(f, rc) + return err } -func (e *Extender) buildDockerfileFor(extID string) (*extend.Dockerfile, error) { - dockerfilePath := filepath.Join(e.GeneratedDir, "build", launch.EscapeID(extID), "Dockerfile") +const ( + argBuildID = "build_id" + argUserID = "user_id" + argGroupID = "group_id" +) + +func (e *Extender) extend(kind string, baseImage v1.Image, logger log.Logger) (v1.Image, error) { + logger.Debugf("Extending base image for %s: %s", kind, e.ImageRef) + dockerfiles, err := e.dockerfilesFor(kind, logger) + if err != nil { + return nil, fmt.Errorf("getting %s.Dockerfiles: %w", kind, err) + } + + var ( + configFile *v1.ConfigFile + rebasable = true // we don't require the initial base image to have io.buildpacks.rebasable=true + workingHistory []v1.History + ) + // get config + baseImage, err = imgutil.OverrideHistoryIfNeeded(baseImage) + if err != nil { + return nil, err + } + configFile, err = baseImage.ConfigFile() + if err != nil { + return nil, err + } + workingHistory = configFile.History + buildOptions := e.extendOptions() + userID, groupID := userFrom(*configFile) + origUserID := userID + for _, dockerfile := range dockerfiles { + dockerfile.Args = append([]extend.Arg{ + {Name: argBuildID, Value: uuid.New().String()}, + {Name: argUserID, Value: userID}, + {Name: argGroupID, Value: groupID}, + }, dockerfile.Args...) + // apply Dockerfile + if baseImage, err = e.DockerfileApplier.Apply( + dockerfile, + baseImage, + buildOptions, + logger, + ); err != nil { + return nil, fmt.Errorf("applying Dockerfile to image: %w", err) + } + // update rebasable, history in config, and user/group IDs + configFile, err = baseImage.ConfigFile() + if err != nil || configFile == nil { + return nil, fmt.Errorf("getting image config: %w", err) + } + // rebasable + if !rebasable || !isRebasable(configFile) { + rebasable = false + } + if configFile.Config.Labels == nil { + configFile.Config.Labels = map[string]string{} + } + configFile.Config.Labels[RebasableLabel] = fmt.Sprintf("%t", rebasable) + // history + newHistory := imgutil.NormalizedHistory(configFile.History, len(configFile.RootFS.DiffIDs)) + for i := len(workingHistory); i < len(newHistory); i++ { + workingHistory = append( + workingHistory, + v1.History{ + CreatedBy: fmt.Sprintf(layers.ExtensionLayerName, newHistory[i].CreatedBy, dockerfile.ExtensionID), + }, + ) + } + configFile.History = workingHistory + prevUserID := userID + userID, groupID = userFrom(*configFile) + if isRoot(userID) { + logger.Warnf("Extension from %s changed the user ID from %s to %s; this must not be the final user ID (a following extension must reset the user).", dockerfile.Path, prevUserID, userID) + } + } + if isRoot(userID) && kind == "run" { + return baseImage, fmt.Errorf("the final user ID is 0 (root); please add another extension that resets the user to non-root") + } + if userID != origUserID { + logger.Warnf("The original user ID was %s but the final extension left the user ID set to %s.", origUserID, userID) + } + if kind == buildpack.DockerfileKindBuild { + return baseImage, nil + } + return mutate.ConfigFile(baseImage, configFile) +} + +func userFrom(config v1.ConfigFile) (string, string) { + user := strings.Split(config.Config.User, ":") + if len(user) < 2 { + return config.Config.User, "" + } + return user[0], user[1] +} + +func isRoot(userID string) bool { + return userID == "0" || userID == "root" +} + +const RebasableLabel = "io.buildpacks.rebasable" + +func isRebasable(config *v1.ConfigFile) bool { + val, ok := config.Config.Labels[RebasableLabel] + if !ok { + // label unset + return false + } + b, err := strconv.ParseBool(val) + if err != nil { + // label not parsable + return false + } + return b +} + +func (e *Extender) dockerfilesFor(kind string, logger log.Logger) ([]extend.Dockerfile, error) { + var dockerfiles []extend.Dockerfile + for _, ext := range e.Extensions { + dockerfile, err := e.dockerfileFor(kind, ext.ID) + if err != nil { + return nil, err + } + if dockerfile != nil { + logger.Debugf("Found %s Dockerfile for extension '%s'", kind, ext.ID) + dockerfiles = append(dockerfiles, *dockerfile) + } + } + return dockerfiles, nil +} + +func (e *Extender) dockerfileFor(kind, extID string) (*extend.Dockerfile, error) { + dockerfilePath := filepath.Join(e.GeneratedDir, kind, launch.EscapeID(extID), "Dockerfile") if _, err := os.Stat(dockerfilePath); err != nil { return nil, nil } - configPath := filepath.Join(e.GeneratedDir, "build", launch.EscapeID(extID), "extend-config.toml") - var config buildpack.ExtendConfig + configPath := filepath.Join(e.GeneratedDir, kind, launch.EscapeID(extID), "extend-config.toml") + var config extend.Config _, err := toml.DecodeFile(configPath, &config) if err != nil { if !os.IsNotExist(err) { @@ -153,20 +425,23 @@ func (e *Extender) buildDockerfileFor(extID string) (*extend.Dockerfile, error) } var args []extend.Arg - for _, configArg := range config.Build.Args { - if configArg.Name == buildIDKey { - return nil, errors.New("image extension provides build arg with key 'build_id' which is not allowed") - } - args = append(args, extend.Arg{ - Name: configArg.Name, - Value: configArg.Value, - }) + if kind == buildpack.DockerfileKindBuild { + args = config.Build.Args + } else { + args = config.Run.Args } - // prepend build_id to args - args = append(args, extend.Arg{Name: buildIDKey, Value: uuid.New().String()}) return &extend.Dockerfile{ - Path: dockerfilePath, - Args: args, + ExtensionID: extID, + Path: dockerfilePath, + Args: args, }, nil } + +func (e *Extender) extendOptions() extend.Options { + return extend.Options{ + BuildContext: e.AppDir, + CacheTTL: e.CacheTTL, + IgnorePaths: []string{e.AppDir, e.LayersDir, e.PlatformDir}, + } +} diff --git a/vendor/github.com/buildpacks/lifecycle/generator.go b/vendor/github.com/buildpacks/lifecycle/generator.go index 3bafa322c9..52402ea10a 100644 --- a/vendor/github.com/buildpacks/lifecycle/generator.go +++ b/vendor/github.com/buildpacks/lifecycle/generator.go @@ -6,49 +6,61 @@ import ( "os" "path/filepath" + "github.com/buildpacks/lifecycle/api" + "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/buildpack" "github.com/buildpacks/lifecycle/env" "github.com/buildpacks/lifecycle/internal/fsutil" "github.com/buildpacks/lifecycle/launch" "github.com/buildpacks/lifecycle/log" - "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) type Generator struct { AppDir string BuildConfigDir string GeneratedDir string // e.g., /generated + PlatformAPI *api.Version PlatformDir string + AnalyzedMD files.Analyzed DirStore DirStore Executor buildpack.GenerateExecutor Extensions []buildpack.GroupElement Logger log.Logger Out, Err io.Writer - Plan platform.BuildPlan + Plan files.Plan + RunMetadata files.Run } type GeneratorFactory struct { - apiVerifier BuildpackAPIVerifier - dirStore DirStore + apiVerifier BuildpackAPIVerifier + configHandler ConfigHandler + dirStore DirStore } func NewGeneratorFactory( apiVerifier BuildpackAPIVerifier, + configHandler ConfigHandler, dirStore DirStore, ) *GeneratorFactory { return &GeneratorFactory{ - apiVerifier: apiVerifier, - dirStore: dirStore, + apiVerifier: apiVerifier, + configHandler: configHandler, + dirStore: dirStore, } } func (f *GeneratorFactory) NewGenerator( + analyzedPath string, appDir string, buildConfigDir string, extensions []buildpack.GroupElement, generatedDir string, - plan platform.BuildPlan, + plan files.Plan, + platformAPI *api.Version, platformDir string, + runPath string, stdout, stderr io.Writer, logger log.Logger, ) (*Generator, error) { @@ -56,6 +68,7 @@ func (f *GeneratorFactory) NewGenerator( AppDir: appDir, BuildConfigDir: buildConfigDir, GeneratedDir: generatedDir, + PlatformAPI: platformAPI, PlatformDir: platformDir, DirStore: f.dirStore, Executor: &buildpack.DefaultGenerateExecutor{}, @@ -64,10 +77,15 @@ func (f *GeneratorFactory) NewGenerator( Out: stdout, Err: stderr, } - if err := f.setExtensions(generator, extensions, logger); err != nil { return nil, err } + if err := f.setAnalyzedMD(generator, analyzedPath, logger); err != nil { + return nil, err + } + if err := f.setRunMD(generator, runPath, logger); err != nil { + return nil, err + } return generator, nil } @@ -81,10 +99,22 @@ func (f *GeneratorFactory) setExtensions(generator *Generator, extensions []buil return nil } +func (f *GeneratorFactory) setAnalyzedMD(generator *Generator, analyzedPath string, logger log.Logger) error { + var err error + generator.AnalyzedMD, err = f.configHandler.ReadAnalyzed(analyzedPath, logger) + return err +} + +func (f *GeneratorFactory) setRunMD(generator *Generator, runPath string, logger log.Logger) error { + var err error + generator.RunMetadata, err = f.configHandler.ReadRun(runPath, logger) + return err +} + type GenerateResult struct { - RunImage string - Plan platform.BuildPlan - UsePlan bool + AnalyzedMD files.Analyzed + Plan files.Plan + UsePlan bool } func (g *Generator) Generate() (GenerateResult, error) { @@ -110,6 +140,9 @@ func (g *Generator) Generate() (GenerateResult, error) { g.Logger.Debug("Finding plan") inputs.Plan = filteredPlan.Find(buildpack.KindExtension, ext.ID) + if g.AnalyzedMD.RunImage != nil && g.AnalyzedMD.RunImage.TargetMetadata != nil && g.PlatformAPI.AtLeast("0.12") { + inputs.Env = env.NewBuildEnv(append(inputs.Env.List(), platform.EnvVarsFor(*g.AnalyzedMD.RunImage.TargetMetadata)...)) + } g.Logger.Debug("Invoking command") result, err := g.Executor.Generate(*descriptor, inputs, g.Logger) if err != nil { @@ -123,24 +156,36 @@ func (g *Generator) Generate() (GenerateResult, error) { g.Logger.Debugf("Finished running generate for extension %s", ext) } - g.Logger.Debug("Validating Dockerfiles") - if err := g.validateDockerfiles(dockerfiles); err != nil { - return GenerateResult{}, err + g.Logger.Debug("Checking run image") + finalAnalyzedMD := g.AnalyzedMD + generatedRunImageRef, extend := g.runImageFrom(dockerfiles) + if generatedRunImageRef != "" && g.isNew(generatedRunImageRef) { + if !g.RunMetadata.Contains(generatedRunImageRef) { + g.Logger.Warnf("new runtime base image '%s' not found in run metadata", generatedRunImageRef) + } + g.Logger.Debugf("Updating analyzed metadata with new run image '%s'", generatedRunImageRef) + finalAnalyzedMD.RunImage = &files.RunImage{ // reference and target data are cleared + Extend: extend, + Image: generatedRunImageRef, + } } - - g.Logger.Debug("Copying Dockerfiles") - if err := g.copyDockerfiles(dockerfiles); err != nil { - return GenerateResult{}, err + if extend { + if finalAnalyzedMD.RunImage != nil { // sanity check to prevent panic + g.Logger.Debug("Updating analyzed metadata to indicate run image extension") + finalAnalyzedMD.RunImage.Extend = true + } } - g.Logger.Debug("Checking for new run image") - runImage, err := g.checkNewRunImage() - if err != nil { + g.Logger.Debug("Copying Dockerfiles") + if err = g.copyDockerfiles(dockerfiles); err != nil { return GenerateResult{}, err } - g.Logger.Debugf("Finished build, selected runImage '%s'", runImage) - return GenerateResult{Plan: filteredPlan, UsePlan: true, RunImage: runImage}, nil + return GenerateResult{ + AnalyzedMD: finalAnalyzedMD, + Plan: filteredPlan, + UsePlan: true, + }, nil } func (g *Generator) getGenerateInputs() buildpack.GenerateInputs { @@ -154,60 +199,62 @@ func (g *Generator) getGenerateInputs() buildpack.GenerateInputs { } } -func (g *Generator) validateDockerfiles(dockerfiles []buildpack.DockerfileInfo) error { - for _, dockerfile := range dockerfiles { - switch { - case dockerfile.Kind == buildpack.DockerfileKindRun: - if err := buildpack.VerifyRunDockerfile(dockerfile.Path); err != nil { - return fmt.Errorf("error parsing run.Dockerfile for extension %s: %w", dockerfile.ExtensionID, err) - } - case dockerfile.Kind == buildpack.DockerfileKindBuild: - if err := buildpack.VerifyBuildDockerfile(dockerfile.Path, g.Logger); err != nil { - return fmt.Errorf("error parsing build.Dockerfile for extension %s: %w", dockerfile.ExtensionID, err) - } - } - } - return nil -} - func (g *Generator) copyDockerfiles(dockerfiles []buildpack.DockerfileInfo) error { for _, dockerfile := range dockerfiles { targetDir := filepath.Join(g.GeneratedDir, dockerfile.Kind, launch.EscapeID(dockerfile.ExtensionID)) - targetPath := filepath.Join(targetDir, "Dockerfile") + var targetPath = filepath.Join(targetDir, "Dockerfile") + if dockerfile.Kind == buildpack.DockerfileKindRun && dockerfile.Ignore { + targetPath += ".ignore" + } if err := os.MkdirAll(targetDir, os.ModePerm); err != nil { return err } + g.Logger.Debugf("Copying %s to %s", dockerfile.Path, targetPath) if err := fsutil.Copy(dockerfile.Path, targetPath); err != nil { - return err + return fmt.Errorf("failed to copy Dockerfile at %s: %w", dockerfile.Path, err) } // check for extend-config.toml and if found, copy extendConfigPath := filepath.Join(filepath.Dir(dockerfile.Path), "extend-config.toml") if err := fsutil.Copy(extendConfigPath, filepath.Join(targetDir, "extend-config.toml")); err != nil { if !os.IsNotExist(err) { - return err + return fmt.Errorf("failed to copy extend config at %s: %w", extendConfigPath, err) } } } return nil } -func (g *Generator) checkNewRunImage() (string, error) { - // There may be extensions that contribute only a build.Dockerfile; work backward through extensions until we find - // a run.Dockerfile. - for i := len(g.Extensions) - 1; i >= 0; i-- { - extID := g.Extensions[i].ID - runDockerfile := filepath.Join(g.GeneratedDir, "run", launch.EscapeID(extID), "Dockerfile") - if _, err := os.Stat(runDockerfile); os.IsNotExist(err) { +func (g *Generator) runImageFrom(dockerfiles []buildpack.DockerfileInfo) (newBase string, extend bool) { + var ignoreNext bool + for i := len(dockerfiles) - 1; i >= 0; i-- { + // There may be extensions that contribute only a build.Dockerfile; + // work backward through extensions until we find a run.Dockerfile. + if dockerfiles[i].Kind != buildpack.DockerfileKindRun { continue } - - imageName, err := buildpack.RetrieveFirstFromImageNameFromDockerfile(runDockerfile) - if err != nil { - return "", err + if ignoreNext { + // If a run.Dockerfile following this one (in the build, not in the loop) switches the run image, + // we can ignore this run.Dockerfile as it has no effect. + // We set Ignore to true so that when the Dockerfiles are copied to the "generated" directory, + // we'll add the suffix `.ignore` so that the extender won't try to apply them. + dockerfiles[i].Ignore = true + continue } + if dockerfiles[i].Extend { + extend = true + } + if dockerfiles[i].WithBase != "" { + newBase = dockerfiles[i].WithBase + g.Logger.Debugf("Found a run.Dockerfile from extension '%s' setting run image to '%s' ", dockerfiles[i].ExtensionID, newBase) + ignoreNext = true + } + } + return newBase, extend +} - g.Logger.Debugf("Found a run.Dockerfile configuring image '%s' from extension with id '%s'", imageName, extID) - return imageName, nil +func (g *Generator) isNew(ref string) bool { + if g.PlatformAPI.AtLeast("0.12") { + return ref != g.AnalyzedMD.RunImageImage() // don't use `name.ParseMaybe` as this will strip the digest, and we want to use exactly what the extension author wrote } - return "", nil + return ref != "" } diff --git a/vendor/github.com/buildpacks/lifecycle/golangci.yaml b/vendor/github.com/buildpacks/lifecycle/golangci.yaml index dc170cb42c..a428e70201 100644 --- a/vendor/github.com/buildpacks/lifecycle/golangci.yaml +++ b/vendor/github.com/buildpacks/lifecycle/golangci.yaml @@ -34,9 +34,11 @@ linters-settings: issues: + exclude-use-default: false + new-from-rev: 91593cf91797ca0a98ffa31842107a9d916da37b exclude-rules: # Ignore this minor optimization. # See https://github.com/golang/go/issues/44877#issuecomment-794565908 - linters: - govet - text: "pointer bytes could be" \ No newline at end of file + text: "pointer bytes could be" diff --git a/vendor/github.com/buildpacks/lifecycle/handlers.go b/vendor/github.com/buildpacks/lifecycle/handlers.go index 2ef06875f3..64eef525c5 100644 --- a/vendor/github.com/buildpacks/lifecycle/handlers.go +++ b/vendor/github.com/buildpacks/lifecycle/handlers.go @@ -4,11 +4,10 @@ import ( "fmt" "github.com/BurntSushi/toml" - "github.com/buildpacks/imgutil" "github.com/buildpacks/lifecycle/buildpack" "github.com/buildpacks/lifecycle/log" - "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) var Config = &DefaultConfigHandler{} @@ -25,11 +24,7 @@ type DirStore interface { LookupExt(id, version string) (*buildpack.ExtDescriptor, error) } -//go:generate mockgen -package testmock -destination testmock/image_handler.go github.com/buildpacks/lifecycle ImageHandler -type ImageHandler interface { - InitImage(imageRef string) (imgutil.Image, error) - Docker() bool -} +//go:generate mockgen -package testmock -destination testmock/image_handler.go github.com/buildpacks/lifecycle/image Handler //go:generate mockgen -package testmock -destination testmock/registry_handler.go github.com/buildpacks/lifecycle RegistryHandler type RegistryHandler interface { @@ -44,9 +39,10 @@ type BuildpackAPIVerifier interface { //go:generate mockgen -package testmock -destination testmock/config_handler.go github.com/buildpacks/lifecycle ConfigHandler type ConfigHandler interface { - ReadAnalyzed(path string) (platform.AnalyzedMetadata, error) + ReadAnalyzed(path string, logger log.Logger) (files.Analyzed, error) ReadGroup(path string) (buildpackGroup []buildpack.GroupElement, extensionsGroup []buildpack.GroupElement, err error) ReadOrder(path string) (buildpack.Order, buildpack.Order, error) + ReadRun(runPath string, logger log.Logger) (files.Run, error) } type DefaultConfigHandler struct{} @@ -55,13 +51,8 @@ func NewConfigHandler() *DefaultConfigHandler { return &DefaultConfigHandler{} } -func (h *DefaultConfigHandler) ReadAnalyzed(path string) (platform.AnalyzedMetadata, error) { - var analyzedMD platform.AnalyzedMetadata - _, err := toml.DecodeFile(path, &analyzedMD) - if err != nil { - return platform.AnalyzedMetadata{}, fmt.Errorf("failed to read analyzed file: %w", err) - } - return analyzedMD, nil +func (h *DefaultConfigHandler) ReadAnalyzed(path string, logr log.Logger) (files.Analyzed, error) { + return files.ReadAnalyzed(path, logr) } func (h *DefaultConfigHandler) ReadGroup(path string) (buildpackGroup []buildpack.GroupElement, extensionsGroup []buildpack.GroupElement, err error) { @@ -109,3 +100,7 @@ func ReadOrder(path string) (buildpack.Order, buildpack.Order, error) { } return order.Order, order.OrderExtensions, err } + +func (h *DefaultConfigHandler) ReadRun(runPath string, logger log.Logger) (files.Run, error) { + return files.ReadRun(runPath, logger) +} diff --git a/vendor/github.com/buildpacks/lifecycle/image/handler.go b/vendor/github.com/buildpacks/lifecycle/image/handler.go new file mode 100644 index 0000000000..26137ca91b --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/image/handler.go @@ -0,0 +1,36 @@ +package image + +import ( + "github.com/buildpacks/imgutil" + "github.com/docker/docker/client" + "github.com/google/go-containerregistry/pkg/authn" +) + +type Handler interface { + InitImage(imageRef string) (imgutil.Image, error) + Kind() string +} + +// NewHandler creates a new Handler according to the arguments provided, following these rules: +// - WHEN layoutDir is defined and useLayout is true then it returns a LayoutHandler +// - WHEN a docker client is provided then it returns a LocalHandler +// - WHEN an auth.Keychain is provided then it returns a RemoteHandler +// - Otherwise nil is returned +func NewHandler(docker client.CommonAPIClient, keychain authn.Keychain, layoutDir string, useLayout bool) Handler { + if layoutDir != "" && useLayout { + return &LayoutHandler{ + layoutDir: layoutDir, + } + } + if docker != nil { + return &LocalHandler{ + docker: docker, + } + } + if keychain != nil { + return &RemoteHandler{ + keychain: keychain, + } + } + return nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/image/utils.go b/vendor/github.com/buildpacks/lifecycle/image/labels.go similarity index 100% rename from vendor/github.com/buildpacks/lifecycle/image/utils.go rename to vendor/github.com/buildpacks/lifecycle/image/labels.go diff --git a/vendor/github.com/buildpacks/lifecycle/image/layout_handler.go b/vendor/github.com/buildpacks/lifecycle/image/layout_handler.go new file mode 100644 index 0000000000..ed14aaf0e5 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/image/layout_handler.go @@ -0,0 +1,86 @@ +package image + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/layout" + v1 "github.com/google/go-containerregistry/pkg/v1" +) + +const LayoutKind = "layout" + +type LayoutHandler struct { + layoutDir string +} + +func (h *LayoutHandler) InitImage(imageRef string) (imgutil.Image, error) { + if imageRef == "" { + return nil, nil + } + + path, err := h.parseRef(imageRef) + if err != nil { + return nil, err + } + return layout.NewImage(path, layout.FromBaseImagePath(path)) +} + +func (h *LayoutHandler) Kind() string { + return LayoutKind +} + +func (h *LayoutHandler) parseRef(imageRef string) (string, error) { + path, err := layout.ParseRefToPath(imageRef) + if err != nil { + return "", err + } + return filepath.Join(h.layoutDir, path), nil +} + +// helpers + +// FromLayoutPath takes a path to a directory (such as /extended/run) containing a single image in "sparse" OCI layout format, +// and returns a v1.Image along with the path of the image (such as /extended/run/sha256:) +// or an error if the image cannot be loaded. +// The path is helpful for locating the image when we only know the digest of the config, such as for local images. +func FromLayoutPath(parentPath string) (v1.Image, string, error) { + fis, err := os.ReadDir(parentPath) + if err != nil { + if os.IsNotExist(err) { + return nil, "", nil + } + return nil, "", err + } + if len(fis) == 0 { + return nil, "", nil + } + if len(fis) > 1 { + return nil, "", fmt.Errorf("expected directory %q to have only 1 item; found %d", parentPath, len(fis)) + } + imagePath := filepath.Join(parentPath, fis[0].Name()) + layoutPath, err := layout.FromPath(imagePath) + if err != nil { + return nil, "", err + } + index, err := layoutPath.ImageIndex() + if err != nil { + return nil, "", err + } + indexManifest, err := index.IndexManifest() + if err != nil { + return nil, "", err + } + manifests := indexManifest.Manifests + if len(manifests) != 1 { + return nil, "", fmt.Errorf("expected image index at %q to have only 1 manifest; found %d", imagePath, len(manifests)) + } + manifest := manifests[0] + image, err := layoutPath.Image(manifest.Digest) + if err != nil { + return nil, "", err + } + return image, imagePath, nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/image/local_handler.go b/vendor/github.com/buildpacks/lifecycle/image/local_handler.go new file mode 100644 index 0000000000..d3f650d5ba --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/image/local_handler.go @@ -0,0 +1,29 @@ +package image + +import ( + "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/local" + "github.com/docker/docker/client" +) + +const LocalKind = "docker" + +type LocalHandler struct { + docker client.CommonAPIClient +} + +func (h *LocalHandler) InitImage(imageRef string) (imgutil.Image, error) { + if imageRef == "" { + return nil, nil + } + + return local.NewImage( + imageRef, + h.docker, + local.FromBaseImage(imageRef), + ) +} + +func (h *LocalHandler) Kind() string { + return LocalKind +} diff --git a/vendor/github.com/buildpacks/lifecycle/image/remote_handler.go b/vendor/github.com/buildpacks/lifecycle/image/remote_handler.go new file mode 100644 index 0000000000..187c7e97bf --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/image/remote_handler.go @@ -0,0 +1,29 @@ +package image + +import ( + "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/remote" + "github.com/google/go-containerregistry/pkg/authn" +) + +const RemoteKind = "remote" + +type RemoteHandler struct { + keychain authn.Keychain +} + +func (h *RemoteHandler) InitImage(imageRef string) (imgutil.Image, error) { + if imageRef == "" { + return nil, nil + } + + return remote.NewImage( + imageRef, + h.keychain, + remote.FromBaseImage(imageRef), + ) +} + +func (h *RemoteHandler) Kind() string { + return RemoteKind +} diff --git a/vendor/github.com/buildpacks/lifecycle/internal/encoding/utils.go b/vendor/github.com/buildpacks/lifecycle/internal/encoding/utils.go index b0f88f1865..c95a485d68 100644 --- a/vendor/github.com/buildpacks/lifecycle/internal/encoding/utils.go +++ b/vendor/github.com/buildpacks/lifecycle/internal/encoding/utils.go @@ -3,12 +3,29 @@ package encoding import ( "bytes" "encoding/json" + "fmt" "os" "path/filepath" "github.com/BurntSushi/toml" ) +// json + +// ToJSONMaybe returns the provided interface as JSON if marshaling is successful, +// or as a string if an error is encountered. +// It is only intended to be used for logging. +func ToJSONMaybe(v interface{}) string { + if v == nil { + return "" + } + b, err := json.Marshal(v) + if err != nil { + return fmt.Sprintf("%s", v) // hopefully v is a Stringer + } + return string(b) +} + func WriteJSON(path string, data interface{}) error { if err := os.MkdirAll(filepath.Dir(path), 0777); err != nil { return err @@ -21,6 +38,16 @@ func WriteJSON(path string, data interface{}) error { return json.NewEncoder(f).Encode(data) } +// toml + +func MarshalTOML(v interface{}) ([]byte, error) { + buf := new(bytes.Buffer) + if err := toml.NewEncoder(buf).Encode(v); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + func WriteTOML(path string, data interface{}) error { if err := os.MkdirAll(filepath.Dir(path), 0777); err != nil { return err @@ -32,11 +59,3 @@ func WriteTOML(path string, data interface{}) error { defer f.Close() return toml.NewEncoder(f).Encode(data) } - -func MarshalTOML(v interface{}) ([]byte, error) { - buf := new(bytes.Buffer) - if err := toml.NewEncoder(buf).Encode(v); err != nil { - return nil, err - } - return buf.Bytes(), nil -} diff --git a/vendor/github.com/buildpacks/lifecycle/internal/extend/config.go b/vendor/github.com/buildpacks/lifecycle/internal/extend/config.go new file mode 100644 index 0000000000..6a5b340cb9 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/internal/extend/config.go @@ -0,0 +1,47 @@ +package extend + +import ( + "fmt" + "os" + + "github.com/BurntSushi/toml" +) + +type Config struct { + Build BuildConfig `toml:"build"` + Run BuildConfig `toml:"run"` +} + +type BuildConfig struct { + Args []Arg `toml:"args"` +} + +var argsProvidedByLifecycle = []string{"build_id", "user_id", "group_id"} + +func ValidateConfig(configPath string) error { + if _, err := os.Stat(configPath); os.IsNotExist(err) { + return nil + } + var config Config + _, err := toml.DecodeFile(configPath, &config) + if err != nil { + return fmt.Errorf("reading extend config: %w", err) + } + checkArgs := func(args []Arg) error { + for _, arg := range args { + for _, invalid := range argsProvidedByLifecycle { + if arg.Name == invalid { + return fmt.Errorf("invalid content: arg with name %q is not allowed", invalid) + } + } + } + return nil + } + if err = checkArgs(config.Build.Args); err != nil { + return fmt.Errorf("validating extend config: %w", err) + } + if err = checkArgs(config.Run.Args); err != nil { + return fmt.Errorf("validating extend config: %w", err) + } + return nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/internal/extend/dockerfile.go b/vendor/github.com/buildpacks/lifecycle/internal/extend/dockerfile.go index 086fc58347..69e4a80acd 100644 --- a/vendor/github.com/buildpacks/lifecycle/internal/extend/dockerfile.go +++ b/vendor/github.com/buildpacks/lifecycle/internal/extend/dockerfile.go @@ -1,11 +1,12 @@ package extend type Dockerfile struct { - Path string `toml:"path"` - Args []Arg + ExtensionID string + Path string `toml:"path"` + Args []Arg } type Arg struct { - Name string - Value string + Name string `toml:"name"` + Value string `toml:"value"` } diff --git a/vendor/github.com/buildpacks/lifecycle/internal/extend/options.go b/vendor/github.com/buildpacks/lifecycle/internal/extend/options.go index 3459b21e42..ff43236d22 100644 --- a/vendor/github.com/buildpacks/lifecycle/internal/extend/options.go +++ b/vendor/github.com/buildpacks/lifecycle/internal/extend/options.go @@ -3,6 +3,7 @@ package extend import "time" type Options struct { - IgnorePaths []string - CacheTTL time.Duration + BuildContext string + IgnorePaths []string + CacheTTL time.Duration } diff --git a/vendor/github.com/buildpacks/lifecycle/internal/fsutil/os_detection.go b/vendor/github.com/buildpacks/lifecycle/internal/fsutil/os_detection.go new file mode 100644 index 0000000000..d787dac570 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/internal/fsutil/os_detection.go @@ -0,0 +1,55 @@ +package fsutil + +import ( + "os" + "strings" +) + +type OSInfo struct { + Name string + Version string +} + +type Detector interface { + HasSystemdFile() bool + ReadSystemdFile() (string, error) + GetInfo(osReleaseContents string) OSInfo +} + +type Detect struct { +} + +func (d *Detect) HasSystemdFile() bool { + finfo, err := os.Stat("/etc/os-release") + if err != nil { + return false + } + return !finfo.IsDir() && finfo.Size() > 0 +} + +func (d *Detect) ReadSystemdFile() (string, error) { + bs, err := os.ReadFile("/etc/os-release") + return string(bs), err +} + +func (d *Detect) GetInfo(osReleaseContents string) OSInfo { + ret := OSInfo{} + lines := strings.Split(osReleaseContents, "\n") + for _, line := range lines { + // os-release is described as a CSV file with "=" as the separator char, but it's also a key-value pairs file. + parts := strings.Split(line, "=") + if len(parts) > 2 { + continue // this shouldn't happen but what's an error, really? + } + toTrim := "\" " // we'll strip these chars (runes) from the string. What's a parser, really? + if parts[0] == "ID" { + ret.Name = strings.Trim(parts[1], toTrim) + } else if parts[0] == "VERSION_ID" { + ret.Version = strings.Trim(parts[1], toTrim) + } + if len(ret.Name) > 0 && len(ret.Version) > 0 { + break + } + } + return ret +} diff --git a/vendor/github.com/buildpacks/lifecycle/internal/layer/metadata_restorer.go b/vendor/github.com/buildpacks/lifecycle/internal/layer/metadata_restorer.go index 9d74ffa1a2..7b57083b1c 100644 --- a/vendor/github.com/buildpacks/lifecycle/internal/layer/metadata_restorer.go +++ b/vendor/github.com/buildpacks/lifecycle/internal/layer/metadata_restorer.go @@ -11,11 +11,12 @@ import ( "github.com/buildpacks/lifecycle/launch" "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) //go:generate mockgen -package testmock -destination ../../testmock/metadata_restorer.go github.com/buildpacks/lifecycle/internal/layer MetadataRestorer type MetadataRestorer interface { - Restore(buildpacks []buildpack.GroupElement, appMeta platform.LayersMetadata, cacheMeta platform.CacheMetadata, layerSHAStore SHAStore) error + Restore(buildpacks []buildpack.GroupElement, appMeta files.LayersMetadata, cacheMeta platform.CacheMetadata, layerSHAStore SHAStore) error } func NewDefaultMetadataRestorer(layersDir string, skipLayers bool, logger log.Logger) *DefaultMetadataRestorer { @@ -32,7 +33,7 @@ type DefaultMetadataRestorer struct { Logger log.Logger } -func (r *DefaultMetadataRestorer) Restore(buildpacks []buildpack.GroupElement, appMeta platform.LayersMetadata, cacheMeta platform.CacheMetadata, layerSHAStore SHAStore) error { +func (r *DefaultMetadataRestorer) Restore(buildpacks []buildpack.GroupElement, appMeta files.LayersMetadata, cacheMeta platform.CacheMetadata, layerSHAStore SHAStore) error { if err := r.restoreStoreTOML(appMeta, buildpacks); err != nil { return err } @@ -44,9 +45,9 @@ func (r *DefaultMetadataRestorer) Restore(buildpacks []buildpack.GroupElement, a return nil } -func (r *DefaultMetadataRestorer) restoreStoreTOML(appMeta platform.LayersMetadata, buildpacks []buildpack.GroupElement) error { +func (r *DefaultMetadataRestorer) restoreStoreTOML(appMeta files.LayersMetadata, buildpacks []buildpack.GroupElement) error { for _, bp := range buildpacks { - if store := appMeta.MetadataForBuildpack(bp.ID).Store; store != nil { + if store := appMeta.LayersMetadataFor(bp.ID).Store; store != nil { if err := encoding.WriteTOML(filepath.Join(r.LayersDir, launch.EscapeID(bp.ID), "store.toml"), store); err != nil { return err } @@ -55,7 +56,7 @@ func (r *DefaultMetadataRestorer) restoreStoreTOML(appMeta platform.LayersMetada return nil } -func (r *DefaultMetadataRestorer) restoreLayerMetadata(layerSHAStore SHAStore, appMeta platform.LayersMetadata, cacheMeta platform.CacheMetadata, buildpacks []buildpack.GroupElement) error { +func (r *DefaultMetadataRestorer) restoreLayerMetadata(layerSHAStore SHAStore, appMeta files.LayersMetadata, cacheMeta platform.CacheMetadata, buildpacks []buildpack.GroupElement) error { if r.SkipLayers { r.Logger.Infof("Skipping buildpack layer analysis") return nil @@ -69,7 +70,7 @@ func (r *DefaultMetadataRestorer) restoreLayerMetadata(layerSHAStore SHAStore, a // Restore metadata for launch=true layers. // The restorer step will restore the layer data for cache=true layers if possible or delete the layer. - appLayers := appMeta.MetadataForBuildpack(bp.ID).Layers + appLayers := appMeta.LayersMetadataFor(bp.ID).Layers cachedLayers := cacheMeta.MetadataForBuildpack(bp.ID).Layers for layerName, layer := range appLayers { identifier := fmt.Sprintf("%s:%s", bp.ID, layerName) @@ -131,7 +132,7 @@ func (r *DefaultMetadataRestorer) writeLayerMetadata(layerSHAStore SHAStore, bui type NopMetadataRestorer struct{} -func (r *NopMetadataRestorer) Restore(_ []buildpack.GroupElement, _ platform.LayersMetadata, _ platform.CacheMetadata, _ SHAStore) error { +func (r *NopMetadataRestorer) Restore(_ []buildpack.GroupElement, _ files.LayersMetadata, _ platform.CacheMetadata, _ SHAStore) error { return nil } diff --git a/vendor/github.com/buildpacks/lifecycle/internal/name/ref.go b/vendor/github.com/buildpacks/lifecycle/internal/name/ref.go new file mode 100644 index 0000000000..2def8255c9 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/internal/name/ref.go @@ -0,0 +1,32 @@ +package name + +import ( + "strings" + + "github.com/google/go-containerregistry/pkg/name" +) + +// ParseMaybe attempts to parse the provided reference as a GGCR `name.Reference`, returning a modified `reference.Name()` if parsing is successful. +// Unlike GGCR's `reference.Name()`, `ParseMaybe` will strip the digest portion of the reference, +// retaining the provided tag or adding a `latest` tag if no tag is provided. +// This is to aid in comparing two references when we really care about image names and not about image digests, +// such as when populating `files.RunImageForRebase` information on an exported image. +func ParseMaybe(provided string) string { + toParse := provided + if hasDigest(provided) { + toParse = trimDigest(provided) + } + if ref, err := name.ParseReference(toParse); err == nil { + return ref.Name() + } + return provided +} + +func hasDigest(ref string) bool { + return strings.Contains(ref, "@sha256:") +} + +func trimDigest(ref string) string { + parts := strings.Split(ref, "@") + return parts[0] +} diff --git a/vendor/github.com/buildpacks/lifecycle/internal/selective/layoutpath.go b/vendor/github.com/buildpacks/lifecycle/internal/selective/layoutpath.go new file mode 100644 index 0000000000..1118534011 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/internal/selective/layoutpath.go @@ -0,0 +1,7 @@ +package selective + +import "github.com/google/go-containerregistry/pkg/v1/layout" + +type Path struct { + layout.Path +} diff --git a/vendor/github.com/buildpacks/lifecycle/internal/selective/write.go b/vendor/github.com/buildpacks/lifecycle/internal/selective/write.go new file mode 100644 index 0000000000..7d78764aca --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/internal/selective/write.go @@ -0,0 +1,85 @@ +package selective + +import ( + "bytes" + "io" + + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/layout" +) + +// AppendImage mimics GGCR's `layout` AppendImage in that it appends an image to a `layout.Path`, +// but the image appended does not include any layers in the `blobs` directory. +// The returned image will return layers when Layers(), LayerByDiffID(), or LayerByDigest() are called, +// but the returned layer will error when DiffID(), Compressed(), or Uncompressed() are called. +// This is useful when we need to satisfy the v1.Image interface but do not need to access any layers, such as when extending +// base images with kaniko. +func (l Path) AppendImage(img v1.Image) error { // FIXME: add the ability to pass image options + if err := l.writeImage(img); err != nil { + return err + } + + mt, err := img.MediaType() + if err != nil { + return err + } + + d, err := img.Digest() + if err != nil { + return err + } + + manifest, err := img.RawManifest() + if err != nil { + return err + } + + desc := v1.Descriptor{ + MediaType: mt, + Size: int64(len(manifest)), + Digest: d, + } + + return l.AppendDescriptor(desc) +} + +// writeImage mimics GGCR's `layout` writeImage in that it writes an image config and manifest, +// but it does not write any layers in the `blobs` directory. +// The returned image will return layers when Layers(), LayerByDiffID(), or LayerByDigest() are called, +// but the returned layer will error when DiffID(), Compressed(), or Uncompressed() are called. +// This is useful when we need to satisfy the v1.Image interface but do not need to access any layers, +// such as when extending base images with kaniko. +func (l Path) writeImage(img v1.Image) error { + // Write the config. + cfgName, err := img.ConfigName() + if err != nil { + return err + } + cfgBlob, err := img.RawConfigFile() + if err != nil { + return err + } + if err = l.WriteBlob(cfgName, io.NopCloser(bytes.NewReader(cfgBlob))); err != nil { + return err + } + + // Write the img manifest. + d, err := img.Digest() + if err != nil { + return err + } + manifest, err := img.RawManifest() + if err != nil { + return err + } + return l.WriteBlob(d, io.NopCloser(bytes.NewReader(manifest))) +} + +func Write(path string, ii v1.ImageIndex) (Path, error) { + layoutPath, err := layout.Write(path, ii) + if err != nil { + return Path{}, err + } + + return Path{Path: layoutPath}, nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/launch/shell.go b/vendor/github.com/buildpacks/lifecycle/launch/shell.go index 1ea0634889..e223a1bbdb 100644 --- a/vendor/github.com/buildpacks/lifecycle/launch/shell.go +++ b/vendor/github.com/buildpacks/lifecycle/launch/shell.go @@ -42,7 +42,7 @@ func (l *Launcher) launchWithShell(self string, proc Process) error { return l.Shell.Launch(ShellProcess{ Script: script, Caller: self, - Command: command, // TODO: support multiple commands + Command: command, Args: proc.Args, Profiles: profs, Env: l.Env.List(), diff --git a/vendor/github.com/buildpacks/lifecycle/layers/dir.go b/vendor/github.com/buildpacks/lifecycle/layers/dir.go index a21aec8166..b48818596a 100644 --- a/vendor/github.com/buildpacks/lifecycle/layers/dir.go +++ b/vendor/github.com/buildpacks/lifecycle/layers/dir.go @@ -10,7 +10,7 @@ import ( // DirLayer will set the UID and GID of entries describing dir and its children (but not its parents) // // to Factory.UID and Factory.GID -func (f *Factory) DirLayer(id string, dir string) (layer Layer, err error) { +func (f *Factory) DirLayer(id string, dir string, createdBy string) (layer Layer, err error) { dir, err = filepath.Abs(dir) if err != nil { return Layer{}, err @@ -19,7 +19,7 @@ func (f *Factory) DirLayer(id string, dir string) (layer Layer, err error) { if err != nil { return Layer{}, err } - return f.writeLayer(id, func(tw *archive.NormalizingTarWriter) error { + return f.writeLayer(id, createdBy, func(tw *archive.NormalizingTarWriter) error { if err := archive.AddFilesToArchive(tw, parents); err != nil { return err } diff --git a/vendor/github.com/buildpacks/lifecycle/layers/factory.go b/vendor/github.com/buildpacks/lifecycle/layers/factory.go index b9234a7fd6..d73922518b 100644 --- a/vendor/github.com/buildpacks/lifecycle/layers/factory.go +++ b/vendor/github.com/buildpacks/lifecycle/layers/factory.go @@ -5,10 +5,23 @@ import ( "path/filepath" "strings" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/buildpacks/lifecycle/archive" "github.com/buildpacks/lifecycle/log" ) +const ( + AppLayerName = "Application Layer" + BuildpackLayerName = "Layer: '%s', Created by buildpack: %s" + ExtensionLayerName = "Layer: '%s', Created by extension: %s" + LauncherConfigLayerName = "Buildpacks Launcher Config" + LauncherLayerName = "Buildpacks Application Launcher" + ProcessTypesLayerName = "Buildpacks Process Types" + SBOMLayerName = "Software Bill-of-Materials" + SliceLayerName = "Application Slice: %d" +) + type Factory struct { ArtifactsDir string // ArtifactsDir is the directory where layer files are written UID, GID int // UID and GID are used to normalize layer entries @@ -21,9 +34,10 @@ type Layer struct { ID string TarPath string Digest string + History v1.History } -func (f *Factory) writeLayer(id string, addEntries func(tw *archive.NormalizingTarWriter) error) (layer Layer, err error) { +func (f *Factory) writeLayer(id, createdBy string, addEntries func(tw *archive.NormalizingTarWriter) error) (layer Layer, err error) { tarPath := filepath.Join(f.ArtifactsDir, escape(id)+".tar") if f.tarHashes == nil { f.tarHashes = make(map[string]string) @@ -34,6 +48,7 @@ func (f *Factory) writeLayer(id string, addEntries func(tw *archive.NormalizingT ID: id, TarPath: tarPath, Digest: sha, + History: v1.History{CreatedBy: createdBy}, }, nil } lw, err := newFileLayerWriter(tarPath) @@ -59,6 +74,7 @@ func (f *Factory) writeLayer(id string, addEntries func(tw *archive.NormalizingT ID: id, Digest: digest, TarPath: tarPath, + History: v1.History{CreatedBy: createdBy}, }, err } diff --git a/vendor/github.com/buildpacks/lifecycle/layers/launcher.go b/vendor/github.com/buildpacks/lifecycle/layers/launcher.go index 9f633e1dac..0ccc27246f 100644 --- a/vendor/github.com/buildpacks/lifecycle/layers/launcher.go +++ b/vendor/github.com/buildpacks/lifecycle/layers/launcher.go @@ -37,7 +37,7 @@ func (f *Factory) LauncherLayer(path string) (layer Layer, err error) { hdr.Mode = 0755 } - return f.writeLayer("buildpacksio/lifecycle:launcher", func(tw *archive.NormalizingTarWriter) error { + return f.writeLayer("buildpacksio/lifecycle:launcher", LauncherLayerName, func(tw *archive.NormalizingTarWriter) error { for _, dir := range parents { if err := tw.WriteHeader(dir); err != nil { return err @@ -77,7 +77,7 @@ func (f *Factory) ProcessTypesLayer(config launch.Metadata) (layer Layer, err er hdrs = append(hdrs, typeSymlink(launch.ProcessPath(proc.Type))) } - return f.writeLayer("buildpacksio/lifecycle:process-types", func(tw *archive.NormalizingTarWriter) error { + return f.writeLayer("buildpacksio/lifecycle:process-types", ProcessTypesLayerName, func(tw *archive.NormalizingTarWriter) error { for _, hdr := range hdrs { if err := tw.WriteHeader(hdr); err != nil { return err diff --git a/vendor/github.com/buildpacks/lifecycle/layers/slices.go b/vendor/github.com/buildpacks/lifecycle/layers/slices.go index 0145d77415..53b2075949 100644 --- a/vendor/github.com/buildpacks/lifecycle/layers/slices.go +++ b/vendor/github.com/buildpacks/lifecycle/layers/slices.go @@ -34,8 +34,7 @@ func (f *Factory) SliceLayers(dir string, slices []Slice) ([]Layer, error) { // add one layer per slice for i, slice := range slices { - layerID := fmt.Sprintf("slice-%d", i+1) - layer, err := f.createLayerFromSlice(slice, sdir, layerID) + layer, err := f.createLayerFromSlice(slice, sdir, i+1) if err != nil { return nil, err } @@ -43,15 +42,21 @@ func (f *Factory) SliceLayers(dir string, slices []Slice) ([]Layer, error) { } // add remaining files in a single layer - layerID := fmt.Sprintf("slice-%d", len(slices)+1) - finalLayer, err := f.createLayerFromFiles(layerID, sdir, sdir.remainingFiles()) + id := len(slices) + 1 + var createdBy string + if id == 1 { + createdBy = AppLayerName + } else { + createdBy = fmt.Sprintf(SliceLayerName, id) + } + finalLayer, err := f.createLayerFromFiles(id, createdBy, sdir, sdir.remainingFiles()) if err != nil { return nil, err } return append(sliceLayers, finalLayer), nil } -func (f *Factory) createLayerFromSlice(slice Slice, sdir *sliceableDir, layerID string) (Layer, error) { +func (f *Factory) createLayerFromSlice(slice Slice, sdir *sliceableDir, id int) (Layer, error) { var matches []string for _, path := range slice.Paths { globMatches, err := glob(sdir, path) @@ -60,7 +65,8 @@ func (f *Factory) createLayerFromSlice(slice Slice, sdir *sliceableDir, layerID } matches = append(matches, globMatches...) } - return f.createLayerFromFiles(layerID, sdir, sdir.sliceFiles(matches)) + createdBy := fmt.Sprintf(SliceLayerName, id) + return f.createLayerFromFiles(id, createdBy, sdir, sdir.sliceFiles(matches)) } func glob(sdir *sliceableDir, pattern string) ([]string, error) { @@ -91,11 +97,12 @@ func glob(sdir *sliceableDir, pattern string) ([]string, error) { return matches, nil } -func (f *Factory) createLayerFromFiles(layerID string, sdir *sliceableDir, files []archive.PathInfo) (layer Layer, err error) { +func (f *Factory) createLayerFromFiles(id int, createdBy string, sdir *sliceableDir, files []archive.PathInfo) (layer Layer, err error) { sort.SliceStable(files, func(i, j int) bool { return files[i].Path < files[j].Path }) - return f.writeLayer(layerID, func(tw *archive.NormalizingTarWriter) error { + layerID := fmt.Sprintf("slice-%d", id) + return f.writeLayer(layerID, createdBy, func(tw *archive.NormalizingTarWriter) error { if len(files) != 0 { if err := archive.AddFilesToArchive(tw, sdir.parentDirs); err != nil { return err diff --git a/vendor/github.com/buildpacks/lifecycle/platform/analyze_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/analyze_inputs.go deleted file mode 100644 index 2dc8e579da..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/analyze_inputs.go +++ /dev/null @@ -1,76 +0,0 @@ -package platform - -import ( - "os" - - "github.com/buildpacks/lifecycle/api" - "github.com/buildpacks/lifecycle/internal/str" - "github.com/buildpacks/lifecycle/log" -) - -// DefaultAnalyzeInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `analyze` phase. -func DefaultAnalyzeInputs(platformAPI *api.Version) LifecycleInputs { - var inputs LifecycleInputs - switch { - case platformAPI.AtLeast("0.9"): - inputs = defaultAnalyzeInputs() - case platformAPI.AtLeast("0.7"): - inputs = defaultAnalyzeInputs07() - case platformAPI.AtLeast("0.5"): - inputs = defaultAnalyzeInputs05To06() - default: - inputs = defaultAnalyzeInputs03To04() - } - inputs.PlatformAPI = platformAPI - return inputs -} - -func defaultAnalyzeInputs() LifecycleInputs { - ai := defaultAnalyzeInputs07() - ai.LaunchCacheDir = os.Getenv(EnvLaunchCacheDir) - return ai -} - -func defaultAnalyzeInputs07() LifecycleInputs { - ai := defaultAnalyzeInputs05To06() - ai.AdditionalTags = str.Slice{} - ai.CacheDir = "" // removed - ai.PreviousImageRef = os.Getenv(EnvPreviousImage) - ai.RunImageRef = os.Getenv(EnvRunImage) - ai.StackPath = envOrDefault(EnvStackPath, DefaultStackPath) - return ai -} - -func defaultAnalyzeInputs05To06() LifecycleInputs { - ai := defaultAnalyzeInputs03To04() - ai.AnalyzedPath = envOrDefault(EnvAnalyzedPath, placeholderAnalyzedPath) - ai.GroupPath = envOrDefault(EnvGroupPath, placeholderGroupPath) - return ai -} - -func defaultAnalyzeInputs03To04() LifecycleInputs { - return LifecycleInputs{ - AnalyzedPath: envOrDefault(EnvAnalyzedPath, DefaultAnalyzedFile), // - CacheDir: os.Getenv(EnvCacheDir), // - CacheImageRef: os.Getenv(EnvCacheImage), // - UseDaemon: boolEnv(EnvUseDaemon), // - GID: intEnv(EnvGID), // - GroupPath: envOrDefault(EnvGroupPath, DefaultGroupFile), // - OutputImageRef: "", // - LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - SkipLayers: boolEnv(EnvSkipLayers), // - UID: intEnv(EnvUID), // - } -} - -func FillAnalyzeImages(i *LifecycleInputs, logger log.Logger) error { - if i.PreviousImageRef == "" { - i.PreviousImageRef = i.OutputImageRef - } - if i.PlatformAPI.LessThan("0.7") { - return nil - } - return fillRunImageFromStackTOMLIfNeeded(i, logger) -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/build_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/build_inputs.go deleted file mode 100644 index ab09b8b589..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/build_inputs.go +++ /dev/null @@ -1,46 +0,0 @@ -package platform - -import ( - "github.com/buildpacks/lifecycle/api" -) - -// DefaultBuildInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `build` phase. -func DefaultBuildInputs(platformAPI *api.Version) LifecycleInputs { - var inputs LifecycleInputs - switch { - case platformAPI.AtLeast("0.11"): - inputs = defaultBuildInputs() - case platformAPI.AtLeast("0.5"): - inputs = defaultBuildInputs05To010() - default: - inputs = defaultBuildInputs03To04() - } - inputs.PlatformAPI = platformAPI - return inputs -} - -func defaultBuildInputs() LifecycleInputs { - bi := defaultBuildInputs05To010() - bi.BuildConfigDir = envOrDefault(EnvBuildConfigDir, DefaultBuildConfigDir) - return bi -} - -func defaultBuildInputs05To010() LifecycleInputs { - bi := defaultBuildInputs03To04() - bi.GroupPath = envOrDefault(EnvGroupPath, placeholderGroupPath) - bi.PlanPath = envOrDefault(EnvPlanPath, placeholderPlanPath) - return bi -} - -func defaultBuildInputs03To04() LifecycleInputs { - return LifecycleInputs{ - AppDir: envOrDefault(EnvAppDir, DefaultAppDir), // - BuildpacksDir: envOrDefault(EnvBuildpacksDir, DefaultBuildpacksDir), // - GroupPath: envOrDefault(EnvGroupPath, DefaultGroupFile), // - LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - PlanPath: envOrDefault(EnvPlanPath, DefaultPlanFile), // - PlatformDir: envOrDefault(EnvPlatformDir, DefaultPlatformDir), // - } -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/cache.go b/vendor/github.com/buildpacks/lifecycle/platform/cache.go index 8f747314ee..f6e0e6b4a1 100644 --- a/vendor/github.com/buildpacks/lifecycle/platform/cache.go +++ b/vendor/github.com/buildpacks/lifecycle/platform/cache.go @@ -1,9 +1,12 @@ package platform -import "github.com/buildpacks/lifecycle/buildpack" +import ( + "github.com/buildpacks/lifecycle/buildpack" + "github.com/buildpacks/lifecycle/platform/files" +) type CacheMetadata struct { - BOM LayerMetadata `json:"sbom"` + BOM files.LayerMetadata `json:"sbom"` Buildpacks []buildpack.LayersMetadata `json:"buildpacks"` } diff --git a/vendor/github.com/buildpacks/lifecycle/platform/create_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/create_inputs.go deleted file mode 100644 index 684a120f70..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/create_inputs.go +++ /dev/null @@ -1,90 +0,0 @@ -package platform - -import ( - "errors" - "os" - - "github.com/buildpacks/lifecycle/api" - "github.com/buildpacks/lifecycle/internal/str" - "github.com/buildpacks/lifecycle/log" -) - -// DefaultCreateInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `create` phase. -func DefaultCreateInputs(platformAPI *api.Version) LifecycleInputs { - var inputs LifecycleInputs - switch { - case platformAPI.AtLeast("0.11"): - inputs = defaultCreateInputs() - case platformAPI.AtLeast("0.6"): - inputs = defaultCreateInputs06To010() - case platformAPI.AtLeast("0.5"): - inputs = defaultCreateInputs05() - default: - inputs = defaultCreateInputs03() - } - inputs.PlatformAPI = platformAPI - return inputs -} - -func defaultCreateInputs() LifecycleInputs { - ci := defaultCreateInputs06To010() - ci.BuildConfigDir = envOrDefault(EnvBuildConfigDir, DefaultBuildConfigDir) - ci.LauncherSBOMDir = DefaultBuildpacksioSBOMDir - return ci -} - -func defaultCreateInputs06To010() LifecycleInputs { - ci := defaultCreateInputs05() - ci.OrderPath = envOrDefault(EnvOrderPath, placeholderOrderPath) - return ci -} - -func defaultCreateInputs05() LifecycleInputs { - ci := defaultCreateInputs03() - ci.ProjectMetadataPath = envOrDefault(EnvProjectMetadataPath, placeholderProjectMetadataPath) - ci.ReportPath = envOrDefault(EnvReportPath, placeholderReportPath) - return ci -} - -func defaultCreateInputs03() LifecycleInputs { - return LifecycleInputs{ - AppDir: envOrDefault(EnvAppDir, DefaultAppDir), // - BuildpacksDir: envOrDefault(EnvBuildpacksDir, DefaultBuildpacksDir), // - FIXME: spec should be updated with this input - CacheDir: os.Getenv(EnvCacheDir), // - CacheImageRef: os.Getenv(EnvCacheImage), // - UseDaemon: boolEnv(EnvUseDaemon), // - GID: intEnv(EnvGID), // - LaunchCacheDir: os.Getenv(EnvLaunchCacheDir), // - LauncherPath: DefaultLauncherPath, // - LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - OrderPath: envOrDefault(EnvOrderPath, DefaultOrderPath), // - PlatformDir: envOrDefault(EnvPlatformDir, DefaultPlatformDir), // - PreviousImageRef: os.Getenv(EnvPreviousImage), // - DefaultProcessType: os.Getenv(EnvProcessType), // - ProjectMetadataPath: envOrDefault(EnvProjectMetadataPath, DefaultProjectMetadataFile), // - ReportPath: envOrDefault(EnvReportPath, DefaultReportFile), // - not actually introduced until Platform API 0.4, but it is always written by the lifecycle - RunImageRef: os.Getenv(EnvRunImage), // - SkipLayers: boolEnv(EnvSkipRestore), // - StackPath: envOrDefault(EnvStackPath, DefaultStackPath), // - AdditionalTags: str.Slice{}, // ... - UID: intEnv(EnvUID), // - OutputImageRef: "", // - } -} - -func FillCreateImages(i *LifecycleInputs, logger log.Logger) error { - if i.PreviousImageRef == "" { - i.PreviousImageRef = i.OutputImageRef - } - switch { - case i.DeprecatedRunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): - return errors.New(ErrSupplyOnlyOneRunImage) - case i.DeprecatedRunImageRef != "": - i.RunImageRef = i.DeprecatedRunImageRef - return nil - default: - return fillRunImageFromStackTOMLIfNeeded(i, logger) - } -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/defaults.go b/vendor/github.com/buildpacks/lifecycle/platform/defaults.go index 3a48dc8de6..324df8ea3c 100644 --- a/vendor/github.com/buildpacks/lifecycle/platform/defaults.go +++ b/vendor/github.com/buildpacks/lifecycle/platform/defaults.go @@ -43,6 +43,10 @@ const ( ModeQuiet = "quiet" ModeWarn = "warn" ModeError = "error" + + // EnvExtendKind is the kind of base image to extend (build or run) when running the extender. + EnvExtendKind = "CNB_EXTEND_KIND" + DefaultExtendKind = "build" ) // EnvUseDaemon configures the lifecycle to export the application image to a daemon satisfying the Docker socket interface (e.g., docker, podman). @@ -52,6 +56,16 @@ const ( // via a credential helper, or via the `CNB_REGISTRY_AUTH` environment variable. See [auth.DefaultKeychain] for further information. const EnvUseDaemon = "CNB_USE_DAEMON" +// ## Provided to handle inputs and outputs in OCI layout format + +// The lifecycle can be configured to read the input images like `run-image` or `previous-image` in OCI layout format instead of from a +// registry or daemon. Also, it can export the final application image on disk in the same format. +// The following environment variables must be set to configure the behavior of the lifecycle when exporting to OCI layout format. +const ( + EnvLayoutDir = "CNB_LAYOUT_DIR" + EnvUseLayout = "CNB_USE_LAYOUT" +) + // ## Provided by the Base Image // A build-time base image contains the OS-level dependencies needed for the build - i.e., dependencies needed for buildpack execution. @@ -77,7 +91,9 @@ const ( EnvOrderPath = "CNB_ORDER_PATH" DefaultOrderFile = "order.toml" - // EnvStackPath is the location of the stack file, which contains information about the runtime base image. + // EnvRunPath is the location of the run file, which contains information about the runtime base image. + EnvRunPath = "CNB_RUN_PATH" + // EnvStackPath is the location of the (deprecated) stack file, which contains information about the runtime base image. EnvStackPath = "CNB_STACK_PATH" ) @@ -86,9 +102,11 @@ var ( DefaultBuildpacksDir = filepath.Join(path.RootDir, "cnb", "buildpacks") DefaultExtensionsDir = filepath.Join(path.RootDir, "cnb", "extensions") - // DefaultOrderPath is the default order path. - DefaultOrderPath = filepath.Join(path.RootDir, "cnb", "order.toml") + // CNBOrderPath is the default order path if the order file does not exist in the layers directory. + CNBOrderPath = filepath.Join(path.RootDir, "cnb", "order.toml") + // DefaultRunPath is the default run path. + DefaultRunPath = filepath.Join(path.RootDir, "cnb", "run.toml") // DefaultStackPath is the default stack path. DefaultStackPath = filepath.Join(path.RootDir, "cnb", "stack.toml") ) @@ -133,6 +151,11 @@ const ( EnvGeneratedDir = "CNB_GENERATED_DIR" DefaultGeneratedDir = "generated" + // EnvExtendedDir is the location of the directory where the lifecycle should copy any image layers + // created from applying generated Dockerfiles to a build- or run-time base image. + EnvExtendedDir = "CNB_EXTENDED_DIR" + DefaultExtendedDir = "extended" + // EnvReportPath is the location of the report file, an output of the `export` phase. // It contains information about the output application image. EnvReportPath = "CNB_REPORT_PATH" @@ -193,6 +216,12 @@ const ( DefaultProjectMetadataFile = "project-metadata.toml" ) +// The following are configuration options for rebaser. +const ( + // EnvForceRebase is used to force the rebaser to rebase the app image even if the operation is unsafe. + EnvForceRebase = "CNB_FORCE_REBASE" +) + var ( // DefaultLauncherPath is the default location of the launcher executable during the build. // The launcher is exported in the output application image and is used to start application processes at runtime. diff --git a/vendor/github.com/buildpacks/lifecycle/platform/detect_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/detect_inputs.go deleted file mode 100644 index 08fddc7c50..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/detect_inputs.go +++ /dev/null @@ -1,65 +0,0 @@ -package platform - -import ( - "github.com/buildpacks/lifecycle/api" -) - -// DefaultDetectInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `detect` phase. -func DefaultDetectInputs(platformAPI *api.Version) LifecycleInputs { - var inputs LifecycleInputs - switch { - case platformAPI.AtLeast("0.11"): - inputs = defaultDetectInputs() - case platformAPI.AtLeast("0.10"): - inputs = defaultDetectInputs010() - case platformAPI.AtLeast("0.6"): - inputs = defaultDetectInputs06To09() - case platformAPI.AtLeast("0.5"): - inputs = defaultDetectInputs05() - default: - inputs = defaultDetectInputs03To04() - } - inputs.PlatformAPI = platformAPI - return inputs -} - -func defaultDetectInputs() LifecycleInputs { - di := defaultDetectInputs010() - di.BuildConfigDir = envOrDefault(EnvBuildConfigDir, DefaultBuildConfigDir) - return di -} - -func defaultDetectInputs010() LifecycleInputs { - di := defaultDetectInputs06To09() - di.AnalyzedPath = envOrDefault(EnvAnalyzedPath, placeholderAnalyzedPath) - di.ExtensionsDir = envOrDefault(EnvExtensionsDir, DefaultExtensionsDir) - di.GeneratedDir = envOrDefault(EnvGeneratedDir, placeholderGeneratedDir) - return di -} - -func defaultDetectInputs06To09() LifecycleInputs { - di := defaultDetectInputs05() - di.OrderPath = envOrDefault(EnvOrderPath, placeholderOrderPath) - return di -} - -func defaultDetectInputs05() LifecycleInputs { - di := defaultDetectInputs03To04() - di.GroupPath = envOrDefault(EnvGroupPath, placeholderGroupPath) - di.PlanPath = envOrDefault(EnvPlanPath, placeholderPlanPath) - return di -} - -func defaultDetectInputs03To04() LifecycleInputs { - return LifecycleInputs{ - AppDir: envOrDefault(EnvAppDir, DefaultAppDir), // - BuildpacksDir: envOrDefault(EnvBuildpacksDir, DefaultBuildpacksDir), // - GroupPath: envOrDefault(EnvGroupPath, DefaultGroupFile), // - LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - OrderPath: envOrDefault(EnvOrderPath, DefaultOrderPath), // - PlanPath: envOrDefault(EnvPlanPath, DefaultPlanFile), // - PlatformDir: envOrDefault(EnvPlatformDir, DefaultPlatformDir), // - } -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/experimental_features.go b/vendor/github.com/buildpacks/lifecycle/platform/experimental_features.go index ceaba9a61e..59f5c522b8 100644 --- a/vendor/github.com/buildpacks/lifecycle/platform/experimental_features.go +++ b/vendor/github.com/buildpacks/lifecycle/platform/experimental_features.go @@ -8,6 +8,7 @@ import ( const ( FeatureDockerfiles = "Dockerfiles" + LayoutFormat = "export to OCI layout format" ) var ExperimentalMode = envOrDefault(EnvExperimentalMode, DefaultExperimentalMode) diff --git a/vendor/github.com/buildpacks/lifecycle/platform/export_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/export_inputs.go deleted file mode 100644 index 6b0e286c6e..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/export_inputs.go +++ /dev/null @@ -1,107 +0,0 @@ -package platform - -import ( - "errors" - "os" - - "github.com/buildpacks/lifecycle/api" - "github.com/buildpacks/lifecycle/internal/str" - "github.com/buildpacks/lifecycle/log" -) - -// DefaultExportInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `export` phase. -func DefaultExportInputs(platformAPI *api.Version) LifecycleInputs { - var inputs LifecycleInputs - switch { - case platformAPI.AtLeast("0.11"): - inputs = defaultExportInputs() - case platformAPI.AtLeast("0.7"): - inputs = defaultExportInputs07To010() - case platformAPI.AtLeast("0.5"): - inputs = defaultExportInputs05To06() - default: - inputs = defaultExportInputs03() - } - inputs.PlatformAPI = platformAPI - return inputs -} - -func defaultExportInputs() LifecycleInputs { - ei := defaultExportInputs07To010() - ei.LauncherSBOMDir = DefaultBuildpacksioSBOMDir - return ei -} - -func defaultExportInputs07To010() LifecycleInputs { - ei := defaultExportInputs05To06() - ei.RunImageRef = "" // removed - return ei -} - -func defaultExportInputs05To06() LifecycleInputs { - ei := defaultExportInputs03() - ei.AnalyzedPath = envOrDefault(EnvAnalyzedPath, placeholderAnalyzedPath) - ei.GroupPath = envOrDefault(EnvGroupPath, placeholderGroupPath) - ei.ProjectMetadataPath = envOrDefault(EnvProjectMetadataPath, placeholderProjectMetadataPath) - ei.ReportPath = envOrDefault(EnvReportPath, placeholderReportPath) - return ei -} - -func defaultExportInputs03() LifecycleInputs { - return LifecycleInputs{ - AdditionalTags: str.Slice{}, // [...] - AnalyzedPath: envOrDefault(EnvAnalyzedPath, DefaultAnalyzedFile), // - AppDir: envOrDefault(EnvAppDir, DefaultAppDir), // - CacheDir: os.Getenv(EnvCacheDir), // - CacheImageRef: os.Getenv(EnvCacheImage), // - UseDaemon: boolEnv(EnvUseDaemon), // - GID: intEnv(EnvGID), // - GroupPath: envOrDefault(EnvGroupPath, DefaultGroupFile), // - OutputImageRef: "", // - LaunchCacheDir: os.Getenv(EnvLaunchCacheDir), // - LauncherPath: DefaultLauncherPath, // - LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - DefaultProcessType: os.Getenv(EnvProcessType), // - ProjectMetadataPath: envOrDefault(EnvProjectMetadataPath, DefaultProjectMetadataFile), // - ReportPath: envOrDefault(EnvReportPath, DefaultReportFile), // - not actually introduced until Platform API 0.4, but it is always written by the lifecycle - RunImageRef: os.Getenv(EnvRunImage), // - StackPath: envOrDefault(EnvStackPath, DefaultStackPath), // - UID: intEnv(EnvUID), // - } -} - -func FillExportRunImage(i *LifecycleInputs, logger log.Logger) error { - supportsRunImageFlag := i.PlatformAPI.LessThan("0.7") - if supportsRunImageFlag { - switch { - case i.DeprecatedRunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): - return errors.New(ErrSupplyOnlyOneRunImage) - case i.RunImageRef != "": - return nil - case i.DeprecatedRunImageRef != "": - i.RunImageRef = i.DeprecatedRunImageRef - return nil - default: - return fillRunImageFromStackTOMLIfNeeded(i, logger) - } - } else { - switch { - case i.RunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): - return errors.New(ErrRunImageUnsupported) - case i.DeprecatedRunImageRef != "": - return errors.New(ErrImageUnsupported) - default: - analyzedMD, err := ReadAnalyzed(i.AnalyzedPath, logger) - if err != nil { - return err - } - if analyzedMD.RunImage == nil || analyzedMD.RunImage.Reference == "" { - return errors.New("run image not found in analyzed metadata") - } - i.RunImageRef = analyzedMD.RunImage.Reference - return nil - } - } -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/extend_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/extend_inputs.go deleted file mode 100644 index 0afa3ae57b..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/extend_inputs.go +++ /dev/null @@ -1,40 +0,0 @@ -package platform - -import ( - "os" - "time" - - "github.com/buildpacks/lifecycle/api" -) - -// DefaultExtendInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `extend` phase. -func DefaultExtendInputs(platformAPI *api.Version) LifecycleInputs { - return LifecycleInputs{ - AnalyzedPath: envOrDefault(EnvAnalyzedPath, placeholderAnalyzedPath), // - AppDir: envOrDefault(EnvAppDir, DefaultAppDir), // - BuildpacksDir: envOrDefault(EnvBuildpacksDir, DefaultBuildpacksDir), // - GeneratedDir: envOrDefault(EnvGeneratedDir, placeholderGeneratedDir), // - GID: intEnv(EnvGID), // - GroupPath: envOrDefault(EnvGroupPath, placeholderGroupPath), // - KanikoCacheTTL: timeEnvOrDefault(EnvKanikoCacheTTL, DefaultKanikoCacheTTL), // - LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - PlanPath: envOrDefault(EnvPlanPath, placeholderPlanPath), // - PlatformDir: envOrDefault(EnvPlatformDir, DefaultPlatformDir), // - PlatformAPI: platformAPI, - UID: intEnv(EnvUID), // - } -} - -func timeEnvOrDefault(key string, defaultVal time.Duration) time.Duration { - envTTL := os.Getenv(key) - if envTTL == "" { - return defaultVal - } - ttl, err := time.ParseDuration(envTTL) - if err != nil { - return defaultVal - } - return ttl -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files.go b/vendor/github.com/buildpacks/lifecycle/platform/files.go deleted file mode 100644 index 736d275a68..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/files.go +++ /dev/null @@ -1,304 +0,0 @@ -// Data Format Files for the Platform API spec (https://github.com/buildpacks/spec/blob/main/platform.md#data-format). - -package platform - -import ( - "encoding/json" - "os" - - "github.com/BurntSushi/toml" - "github.com/google/go-containerregistry/pkg/name" - "github.com/pkg/errors" - - "github.com/buildpacks/lifecycle/api" - "github.com/buildpacks/lifecycle/buildpack" - "github.com/buildpacks/lifecycle/launch" - "github.com/buildpacks/lifecycle/layers" - "github.com/buildpacks/lifecycle/log" -) - -// analyzed.toml - -type AnalyzedMetadata struct { - PreviousImage *ImageIdentifier `toml:"image"` - Metadata LayersMetadata `toml:"metadata"` - RunImage *ImageIdentifier `toml:"run-image,omitempty"` - BuildImage *ImageIdentifier `toml:"build-image,omitempty"` -} - -// FIXME: fix key names to be accurate in the daemon case -type ImageIdentifier struct { - Reference string `toml:"reference"` -} - -func ReadAnalyzed(analyzedPath string, logger log.Logger) (AnalyzedMetadata, error) { - var analyzedMD AnalyzedMetadata - if _, err := toml.DecodeFile(analyzedPath, &analyzedMD); err != nil { - if os.IsNotExist(err) { - logger.Warnf("no analyzed metadata found at path '%s'", analyzedPath) - return AnalyzedMetadata{}, nil - } - return AnalyzedMetadata{}, err - } - return analyzedMD, nil -} - -// NOTE: This struct MUST be kept in sync with `LayersMetadataCompat` -type LayersMetadata struct { - App []LayerMetadata `json:"app" toml:"app"` - BOM *LayerMetadata `json:"sbom,omitempty" toml:"sbom,omitempty"` - Buildpacks []buildpack.LayersMetadata `json:"buildpacks" toml:"buildpacks"` - Config LayerMetadata `json:"config" toml:"config"` - Launcher LayerMetadata `json:"launcher" toml:"launcher"` - ProcessTypes LayerMetadata `json:"process-types" toml:"process-types"` - RunImage RunImageMetadata `json:"runImage" toml:"run-image"` - Stack StackMetadata `json:"stack" toml:"stack"` -} - -// NOTE: This struct MUST be kept in sync with `LayersMetadata`. -// It exists for situations where the `App` field type cannot be -// guaranteed, yet the original struct data must be maintained. -type LayersMetadataCompat struct { - App interface{} `json:"app" toml:"app"` - BOM *LayerMetadata `json:"sbom,omitempty" toml:"sbom,omitempty"` - Buildpacks []buildpack.LayersMetadata `json:"buildpacks" toml:"buildpacks"` - Config LayerMetadata `json:"config" toml:"config"` - Launcher LayerMetadata `json:"launcher" toml:"launcher"` - ProcessTypes LayerMetadata `json:"process-types" toml:"process-types"` - RunImage RunImageMetadata `json:"runImage" toml:"run-image"` - Stack StackMetadata `json:"stack" toml:"stack"` -} - -func (m *LayersMetadata) MetadataForBuildpack(id string) buildpack.LayersMetadata { - for _, bpMD := range m.Buildpacks { - if bpMD.ID == id { - return bpMD - } - } - return buildpack.LayersMetadata{} -} - -type LayerMetadata struct { - SHA string `json:"sha" toml:"sha"` -} - -type RunImageMetadata struct { - TopLayer string `json:"topLayer" toml:"top-layer"` - Reference string `json:"reference" toml:"reference"` -} - -// metadata.toml - -type BuildMetadata struct { - BOM []buildpack.BOMEntry `toml:"bom,omitempty" json:"bom"` - Buildpacks []buildpack.GroupElement `toml:"buildpacks" json:"buildpacks"` - Extensions []buildpack.GroupElement `toml:"extensions,omitempty" json:"extensions,omitempty"` - Labels []buildpack.Label `toml:"labels" json:"-"` - Launcher LauncherMetadata `toml:"-" json:"launcher"` - Processes []launch.Process `toml:"processes" json:"processes"` - Slices []layers.Slice `toml:"slices" json:"-"` - BuildpackDefaultProcessType string `toml:"buildpack-default-process-type,omitempty" json:"buildpack-default-process-type,omitempty"` - PlatformAPI *api.Version `toml:"-" json:"-"` -} - -// DecodeBuildMetadataTOML reads a metadata.toml file -func DecodeBuildMetadataTOML(path string, platformAPI *api.Version, buildmd *BuildMetadata) error { - // decode the common bits - _, err := toml.DecodeFile(path, &buildmd) - if err != nil { - return err - } - - // set the platform API on all the appropriate fields - // this will allow us to re-encode the metadata.toml file with - // the current platform API - buildmd.PlatformAPI = platformAPI - for i, process := range buildmd.Processes { - buildmd.Processes[i] = process.WithPlatformAPI(platformAPI) - } - - return nil -} - -func (md *BuildMetadata) MarshalJSON() ([]byte, error) { - if md.PlatformAPI == nil || md.PlatformAPI.LessThan("0.9") { - return json.Marshal(*md) - } - type BuildMetadataSerializer BuildMetadata // prevent infinite recursion when serializing - return json.Marshal(&struct { - *BuildMetadataSerializer - BOM []buildpack.BOMEntry `json:"bom,omitempty"` - }{ - BuildMetadataSerializer: (*BuildMetadataSerializer)(md), - BOM: []buildpack.BOMEntry{}, - }) -} - -func (md BuildMetadata) ToLaunchMD() launch.Metadata { - lmd := launch.Metadata{ - Processes: md.Processes, - } - for _, bp := range md.Buildpacks { - lmd.Buildpacks = append(lmd.Buildpacks, launch.Buildpack{ - API: bp.API, - ID: bp.ID, - }) - } - return lmd -} - -type LauncherMetadata struct { - Version string `json:"version"` - Source SourceMetadata `json:"source"` -} - -type SourceMetadata struct { - Git GitMetadata `json:"git"` -} - -type GitMetadata struct { - Repository string `json:"repository"` - Commit string `json:"commit"` -} - -// plan.toml - -type BuildPlan struct { - Entries []BuildPlanEntry `toml:"entries"` -} - -func (p BuildPlan) Find(kind, id string) buildpack.Plan { - var extension bool - if kind == buildpack.KindExtension { - extension = true - } - var out []buildpack.Require - for _, entry := range p.Entries { - for _, provider := range entry.Providers { - if provider.ID == id && provider.Extension == extension { - out = append(out, entry.Requires...) - break - } - } - } - return buildpack.Plan{Entries: out} -} - -// FIXME: ensure at least one claimed entry of each name is provided by the BP -func (p BuildPlan) Filter(metRequires []string) BuildPlan { - var out []BuildPlanEntry - for _, planEntry := range p.Entries { - if !containsEntry(metRequires, planEntry) { - out = append(out, planEntry) - } - } - return BuildPlan{Entries: out} -} - -func containsEntry(metRequires []string, entry BuildPlanEntry) bool { - for _, met := range metRequires { - for _, planReq := range entry.Requires { - if met == planReq.Name { - return true - } - } - } - return false -} - -type BuildPlanEntry struct { - Providers []buildpack.GroupElement `toml:"providers"` - Requires []buildpack.Require `toml:"requires"` -} - -func (be BuildPlanEntry) NoOpt() BuildPlanEntry { - var out []buildpack.GroupElement - for _, p := range be.Providers { - out = append(out, p.NoOpt().NoAPI().NoHomepage()) - } - be.Providers = out - return be -} - -// project-metadata.toml - -type ProjectMetadata struct { - Source *ProjectSource `toml:"source" json:"source,omitempty"` -} - -type ProjectSource struct { - Type string `toml:"type" json:"type,omitempty"` - Version map[string]interface{} `toml:"version" json:"version,omitempty"` - Metadata map[string]interface{} `toml:"metadata" json:"metadata,omitempty"` -} - -// report.toml - -type ExportReport struct { - Build BuildReport `toml:"build,omitempty"` - Image ImageReport `toml:"image"` -} - -type BuildReport struct { - BOM []buildpack.BOMEntry `toml:"bom"` -} - -type ImageReport struct { - Tags []string `toml:"tags"` - ImageID string `toml:"image-id,omitempty"` - Digest string `toml:"digest,omitempty"` - ManifestSize int64 `toml:"manifest-size,omitzero"` -} - -// stack.toml - -type StackMetadata struct { - RunImage StackRunImageMetadata `json:"runImage" toml:"run-image"` -} - -type StackRunImageMetadata struct { - Image string `toml:"image" json:"image"` - Mirrors []string `toml:"mirrors" json:"mirrors,omitempty"` -} - -func (sm *StackMetadata) BestRunImageMirror(registry string) (string, error) { - if sm.RunImage.Image == "" { - return "", errors.New("missing run-image metadata") - } - runImageMirrors := []string{sm.RunImage.Image} - runImageMirrors = append(runImageMirrors, sm.RunImage.Mirrors...) - runImageRef, err := byRegistry(registry, runImageMirrors) - if err != nil { - return "", errors.Wrap(err, "failed to find run image") - } - return runImageRef, nil -} - -func byRegistry(reg string, imgs []string) (string, error) { - if len(imgs) < 1 { - return "", errors.New("no images provided to search") - } - - for _, img := range imgs { - ref, err := name.ParseReference(img, name.WeakValidation) - if err != nil { - continue - } - if reg == ref.Context().RegistryStr() { - return img, nil - } - } - return imgs[0], nil -} - -func ReadStack(stackPath string, logger log.Logger) (StackMetadata, error) { - var stackMD StackMetadata - if _, err := toml.DecodeFile(stackPath, &stackMD); err != nil { - if os.IsNotExist(err) { - logger.Infof("no stack metadata found at path '%s'\n", stackPath) - return StackMetadata{}, nil - } - return StackMetadata{}, err - } - return stackMD, nil -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/analyzed.go b/vendor/github.com/buildpacks/lifecycle/platform/files/analyzed.go new file mode 100644 index 0000000000..e36bbbea04 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/analyzed.go @@ -0,0 +1,173 @@ +package files + +import ( + "fmt" + "os" + + "github.com/BurntSushi/toml" + + "github.com/buildpacks/lifecycle/buildpack" + "github.com/buildpacks/lifecycle/log" +) + +// Analyzed is written by the analyzer as analyzed.toml to record information about: +// * the previous image (if it exists), +// * the run image, +// * the build image (if provided). +// The location of the file can be specified by providing `-analyzed ` to the lifecycle. +type Analyzed struct { + // PreviousImage is the build image identifier, if the previous image exists. + PreviousImage *ImageIdentifier `toml:"image,omitempty"` + // BuildImage is the build image identifier. + // It is recorded for use by the restorer in the case that image extensions are used + // to extend the build image. + BuildImage *ImageIdentifier `toml:"build-image,omitempty"` + // LayersMetadata holds information about previously built layers. + // It is used by the exporter to determine if any layers from the current build are unchanged, + // to avoid re-uploading the same data to the export target, + // and to provide information about previously-created layers to buildpacks. + LayersMetadata LayersMetadata `toml:"metadata"` + // RunImage holds information about the run image. + // It is used to validate that buildpacks satisfy os/arch constraints, + // and to provide information about the export target to buildpacks. + RunImage *RunImage `toml:"run-image,omitempty"` +} + +func ReadAnalyzed(path string, logger log.Logger) (Analyzed, error) { + var analyzed Analyzed + if _, err := toml.DecodeFile(path, &analyzed); err != nil { + if os.IsNotExist(err) { + logger.Warnf("no analyzed metadata found at path '%s'", path) + return Analyzed{}, nil + } + return Analyzed{}, err + } + return analyzed, nil +} + +func (a Analyzed) PreviousImageRef() string { + if a.PreviousImage == nil { + return "" + } + return a.PreviousImage.Reference +} + +func (a Analyzed) RunImageImage() string { + if a.RunImage == nil { + return "" + } + return a.RunImage.Image +} + +func (a Analyzed) RunImageRef() string { + if a.RunImage == nil { + return "" + } + return a.RunImage.Reference +} + +func (a Analyzed) RunImageTarget() TargetMetadata { + if a.RunImage == nil { + return TargetMetadata{} + } + if a.RunImage.TargetMetadata == nil { + return TargetMetadata{} + } + return *a.RunImage.TargetMetadata +} + +type ImageIdentifier struct { + Reference string `toml:"reference"` // FIXME: fix key name to be accurate in the daemon case +} + +// NOTE: This struct MUST be kept in sync with `LayersMetadataCompat` +type LayersMetadata struct { + App []LayerMetadata `json:"app" toml:"app"` + BOM *LayerMetadata `json:"sbom,omitempty" toml:"sbom,omitempty"` + Buildpacks []buildpack.LayersMetadata `json:"buildpacks" toml:"buildpacks"` + Config LayerMetadata `json:"config" toml:"config"` + Launcher LayerMetadata `json:"launcher" toml:"launcher"` + ProcessTypes LayerMetadata `json:"process-types" toml:"process-types"` + RunImage RunImageForRebase `json:"runImage" toml:"run-image"` + Stack *Stack `json:"stack,omitempty" toml:"stack,omitempty"` +} + +// NOTE: This struct MUST be kept in sync with `LayersMetadata`. +// It exists for situations where the `App` field type cannot be +// guaranteed, yet the original struct data must be maintained. +type LayersMetadataCompat struct { + App interface{} `json:"app" toml:"app"` + BOM *LayerMetadata `json:"sbom,omitempty" toml:"sbom,omitempty"` + Buildpacks []buildpack.LayersMetadata `json:"buildpacks" toml:"buildpacks"` + Config LayerMetadata `json:"config" toml:"config"` + Launcher LayerMetadata `json:"launcher" toml:"launcher"` + ProcessTypes LayerMetadata `json:"process-types" toml:"process-types"` + RunImage RunImageForRebase `json:"runImage" toml:"run-image"` + Stack *Stack `json:"stack,omitempty" toml:"stack,omitempty"` +} + +func (m *LayersMetadata) LayersMetadataFor(bpID string) buildpack.LayersMetadata { + for _, bpMD := range m.Buildpacks { + if bpMD.ID == bpID { + return bpMD + } + } + return buildpack.LayersMetadata{} +} + +type LayerMetadata struct { + SHA string `json:"sha" toml:"sha"` +} + +type RunImageForRebase struct { + TopLayer string `json:"topLayer" toml:"top-layer"` + Reference string `json:"reference" toml:"reference"` + RunImageForExport +} + +// Contains returns true if the provided image reference is found in the existing metadata, +// removing the digest portion of the reference when determining if two image names are equivalent. +func (r *RunImageForRebase) Contains(providedImage string) bool { + return r.RunImageForExport.Contains(providedImage) +} + +func (r *RunImageForRebase) ToStack() Stack { + return Stack{ + RunImage: RunImageForExport{ + Image: r.Image, + Mirrors: r.Mirrors, + }, + } +} + +type RunImage struct { + Reference string `toml:"reference"` + // Image specifies the repository name for the image that was provided - either by the platform, or by extensions. + // When exporting to a daemon, the restorer uses this field to pull the run image if needed for the extender; + // it can't use `Reference` because this may be a daemon image ID if analyzed.toml was last written by the analyzer. + Image string `toml:"image,omitempty"` + // Extend if true indicates that the run image should be extended by the extender. + Extend bool `toml:"extend,omitempty"` + TargetMetadata *TargetMetadata `json:"target,omitempty" toml:"target,omitempty"` +} + +type TargetMetadata struct { + ID string `json:"id,omitempty" toml:"id,omitempty"` + OS string `json:"os" toml:"os"` + Arch string `json:"arch" toml:"arch"` + ArchVariant string `json:"arch-variant,omitempty" toml:"arch-variant,omitempty"` + + Distribution *OSDistribution `json:"distribution,omitempty" toml:"distribution,omitempty"` +} + +func (t *TargetMetadata) String() string { + if t.Distribution != nil { + return fmt.Sprintf("OS: %s, Arch: %s, ArchVariant: %s, Distribution: (Name: %s, Version: %s)", t.OS, t.Arch, t.ArchVariant, t.Distribution.Name, t.Distribution.Version) + } + return fmt.Sprintf("OS: %s, Arch: %s, ArchVariant: %s", t.OS, t.Arch, t.ArchVariant) +} + +type OSDistribution struct { + Name string `json:"name" toml:"name"` + Version string `json:"version" toml:"version"` +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/group.go b/vendor/github.com/buildpacks/lifecycle/platform/files/group.go new file mode 100644 index 0000000000..a11b1260ed --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/group.go @@ -0,0 +1,6 @@ +package files + +// group.toml is written by the detector to record the buildpacks and image extensions +// that will be used for the build. +// The location of the file can be specified by providing `-group ` to the lifecycle. +// See `buildpack.Group` for further information. diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/metadata.go b/vendor/github.com/buildpacks/lifecycle/platform/files/metadata.go new file mode 100644 index 0000000000..95eee22618 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/metadata.go @@ -0,0 +1,97 @@ +package files + +import ( + "encoding/json" + + "github.com/BurntSushi/toml" + + "github.com/buildpacks/lifecycle/api" + "github.com/buildpacks/lifecycle/buildpack" + "github.com/buildpacks/lifecycle/launch" + "github.com/buildpacks/lifecycle/layers" +) + +// BuildMetadata is written by the builder as /config/metadata.toml to record information about the build. +// It is also serialized by the exporter as the `io.buildpacks.build.metadata` label on the output image. +type BuildMetadata struct { + // BOM (deprecated) holds the unstructured bill-of-materials. + BOM []buildpack.BOMEntry `toml:"bom,omitempty" json:"bom"` + // Buildpacks are the buildpacks used in the build. + Buildpacks []buildpack.GroupElement `toml:"buildpacks" json:"buildpacks"` + // Extensions are the image extensions used in the build. + Extensions []buildpack.GroupElement `toml:"extensions,omitempty" json:"extensions,omitempty"` + // Labels are labels provided by buildpacks. + Labels []buildpack.Label `toml:"labels" json:"-"` + // Launcher is metadata to describe the launcher. + Launcher LauncherMetadata `toml:"-" json:"launcher"` + // Processes are processes provided by buildpacks. + Processes []launch.Process `toml:"processes" json:"processes"` + // Slices are application slices provided by buildpacks, + // used by the exporter to "slice" the application directory into distinct layers. + Slices []layers.Slice `toml:"slices" json:"-"` + // BuildpackDefaultProcessType is the buildpack-provided default process type. + // It will be the default process type for the image unless overridden by the end user. + BuildpackDefaultProcessType string `toml:"buildpack-default-process-type,omitempty" json:"buildpack-default-process-type,omitempty"` + // PlatformAPI is the Platform API version used for the build. + PlatformAPI *api.Version `toml:"-" json:"-"` +} + +// DecodeBuildMetadata reads a metadata.toml file +func DecodeBuildMetadata(path string, platformAPI *api.Version, buildmd *BuildMetadata) error { + // decode the common bits + _, err := toml.DecodeFile(path, &buildmd) + if err != nil { + return err + } + + // set the platform API on all the appropriate fields + // this will allow us to re-encode the metadata.toml file with + // the current platform API + buildmd.PlatformAPI = platformAPI + for i, process := range buildmd.Processes { + buildmd.Processes[i] = process.WithPlatformAPI(platformAPI) + } + + return nil +} + +func (m *BuildMetadata) MarshalJSON() ([]byte, error) { + if m.PlatformAPI == nil || m.PlatformAPI.LessThan("0.9") { + return json.Marshal(*m) + } + type BuildMetadataSerializer BuildMetadata // prevent infinite recursion when serializing + return json.Marshal(&struct { + *BuildMetadataSerializer + BOM []buildpack.BOMEntry `json:"bom,omitempty"` + }{ + BuildMetadataSerializer: (*BuildMetadataSerializer)(m), + BOM: []buildpack.BOMEntry{}, + }) +} + +func (m BuildMetadata) ToLaunchMD() launch.Metadata { + lmd := launch.Metadata{ + Processes: m.Processes, + } + for _, bp := range m.Buildpacks { + lmd.Buildpacks = append(lmd.Buildpacks, launch.Buildpack{ + API: bp.API, + ID: bp.ID, + }) + } + return lmd +} + +type LauncherMetadata struct { + Version string `json:"version"` + Source SourceMetadata `json:"source"` +} + +type SourceMetadata struct { + Git GitMetadata `json:"git"` +} + +type GitMetadata struct { + Repository string `json:"repository"` + Commit string `json:"commit"` +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/order.go b/vendor/github.com/buildpacks/lifecycle/platform/files/order.go new file mode 100644 index 0000000000..cc9339dace --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/order.go @@ -0,0 +1,6 @@ +package files + +// order.toml is provided by the platform to enumerate the buildpacks and image extensions +// that could be used for the build. +// The location of the file can be specified by providing `-order ` to the lifecycle. +// See `buildpack.Order` for further information. diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/plan.go b/vendor/github.com/buildpacks/lifecycle/platform/files/plan.go new file mode 100644 index 0000000000..0336d50221 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/plan.go @@ -0,0 +1,66 @@ +package files + +import "github.com/buildpacks/lifecycle/buildpack" + +// Plan is written by the detector as plan.toml to record the application dependencies requested by buildpacks, +// and the image extensions or buildpacks that provide them. +// A subset of the plan is presented to each image extension (during the `generate` phase) +// or buildpack (during the `build` phase) +// with the entries that the module is expected to provide. +// The location of the file can be specified by providing `-plan ` to the lifecycle. +type Plan struct { + Entries []BuildPlanEntry `toml:"entries"` +} + +func (p Plan) Find(kind, id string) buildpack.Plan { + var extension bool + if kind == buildpack.KindExtension { + extension = true + } + var out []buildpack.Require + for _, entry := range p.Entries { + for _, provider := range entry.Providers { + if provider.ID == id && provider.Extension == extension { + out = append(out, entry.Requires...) + break + } + } + } + return buildpack.Plan{Entries: out} +} + +// FIXME: ensure at least one claimed entry of each name is provided by the BP +func (p Plan) Filter(metRequires []string) Plan { + var out []BuildPlanEntry + for _, planEntry := range p.Entries { + if !containsEntry(metRequires, planEntry) { + out = append(out, planEntry) + } + } + return Plan{Entries: out} +} + +func containsEntry(metRequires []string, entry BuildPlanEntry) bool { + for _, met := range metRequires { + for _, planReq := range entry.Requires { + if met == planReq.Name { + return true + } + } + } + return false +} + +type BuildPlanEntry struct { + Providers []buildpack.GroupElement `toml:"providers"` + Requires []buildpack.Require `toml:"requires"` +} + +func (be BuildPlanEntry) NoOpt() BuildPlanEntry { + var out []buildpack.GroupElement + for _, p := range be.Providers { + out = append(out, p.NoOpt().NoAPI().NoHomepage()) + } + be.Providers = out + return be +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/project_metadata.go b/vendor/github.com/buildpacks/lifecycle/platform/files/project_metadata.go new file mode 100644 index 0000000000..ca9339dae7 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/project_metadata.go @@ -0,0 +1,14 @@ +package files + +// ProjectMetadata is written as `project_metadata.toml` by the exporter to record information about the application source code. +// It is also serialized by the exporter as the `io.buildpacks.project.metadata` label on the output image. +// The location of the file can be specified by providing `-project-metadata ` to the lifecycle. +type ProjectMetadata struct { + Source *ProjectSource `toml:"source" json:"source,omitempty"` +} + +type ProjectSource struct { + Type string `toml:"type" json:"type,omitempty"` + Version map[string]interface{} `toml:"version" json:"version,omitempty"` + Metadata map[string]interface{} `toml:"metadata" json:"metadata,omitempty"` +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/report.go b/vendor/github.com/buildpacks/lifecycle/platform/files/report.go new file mode 100644 index 0000000000..00b5404b1a --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/report.go @@ -0,0 +1,22 @@ +package files + +import "github.com/buildpacks/lifecycle/buildpack" + +// Report is written by the exporter as report.toml to record information about the build. +// It is not included in the output image, but can be saved off by the platform before the build container exits. +// The location of the file can be specified by providing `-report ` to the lifecycle. +type Report struct { + Build BuildReport `toml:"build,omitempty"` + Image ImageReport `toml:"image"` +} + +type BuildReport struct { + BOM []buildpack.BOMEntry `toml:"bom"` +} + +type ImageReport struct { + Tags []string `toml:"tags"` + ImageID string `toml:"image-id,omitempty"` + Digest string `toml:"digest,omitempty"` + ManifestSize int64 `toml:"manifest-size,omitzero"` +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/run.go b/vendor/github.com/buildpacks/lifecycle/platform/files/run.go new file mode 100644 index 0000000000..84866745c5 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/run.go @@ -0,0 +1,41 @@ +package files + +import ( + "os" + + "github.com/BurntSushi/toml" + + "github.com/buildpacks/lifecycle/log" +) + +// Run is provided by the platform as run.toml to record information about the run images +// that may be used during export. +// Data from the selected run image is serialized by the exporter as the `runImage` key in the `io.buildpacks.lifecycle.metadata` label +// on the output image for use during rebase. +// The location of the file can be specified by providing `-run ` to the lifecycle. +type Run struct { + Images []RunImageForExport `json:"-" toml:"images"` +} + +// Contains returns true if the provided image reference is found in the existing metadata, +// removing the digest portion of the reference when determining if two image names are equivalent. +func (r *Run) Contains(providedImage string) bool { + for _, i := range r.Images { + if i.Contains(providedImage) { + return true + } + } + return false +} + +func ReadRun(runPath string, logger log.Logger) (Run, error) { + var runMD Run + if _, err := toml.DecodeFile(runPath, &runMD); err != nil { + if os.IsNotExist(err) { + logger.Infof("no run metadata found at path '%s'\n", runPath) + return Run{}, nil + } + return Run{}, err + } + return runMD, nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/files/stack.go b/vendor/github.com/buildpacks/lifecycle/platform/files/stack.go new file mode 100644 index 0000000000..7931d83403 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/files/stack.go @@ -0,0 +1,51 @@ +package files + +import ( + "os" + + "github.com/BurntSushi/toml" + + iname "github.com/buildpacks/lifecycle/internal/name" + "github.com/buildpacks/lifecycle/log" +) + +// Stack (deprecated as of Platform API 0.12) is provided by the platform as stack.toml to record information about the run images +// that may be used during export. +// It is also serialized by the exporter as the `stack` key in the `io.buildpacks.lifecycle.metadata` label on the output image +// for use during rebase. +// The location of the file can be specified by providing `-stack ` to the lifecycle. +type Stack struct { + RunImage RunImageForExport `json:"runImage" toml:"run-image"` +} + +type RunImageForExport struct { + Image string `toml:"image,omitempty" json:"image,omitempty"` + Mirrors []string `toml:"mirrors,omitempty" json:"mirrors,omitempty"` +} + +// Contains returns true if the provided image reference is found in the existing metadata, +// removing the digest portion of the reference when determining if two image names are equivalent. +func (r *RunImageForExport) Contains(providedImage string) bool { + providedImage = iname.ParseMaybe(providedImage) + if iname.ParseMaybe(r.Image) == providedImage { + return true + } + for _, m := range r.Mirrors { + if iname.ParseMaybe(m) == providedImage { + return true + } + } + return false +} + +func ReadStack(stackPath string, logger log.Logger) (Stack, error) { + var stackMD Stack + if _, err := toml.DecodeFile(stackPath, &stackMD); err != nil { + if os.IsNotExist(err) { + logger.Infof("no stack metadata found at path '%s'\n", stackPath) + return Stack{}, nil + } + return Stack{}, err + } + return stackMD, nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/labels.go b/vendor/github.com/buildpacks/lifecycle/platform/labels.go index 63de14bf06..808c8adf58 100644 --- a/vendor/github.com/buildpacks/lifecycle/platform/labels.go +++ b/vendor/github.com/buildpacks/lifecycle/platform/labels.go @@ -1,9 +1,10 @@ package platform const ( - BuildMetadataLabel = "io.buildpacks.build.metadata" - LayerMetadataLabel = "io.buildpacks.lifecycle.metadata" - ProjectMetadataLabel = "io.buildpacks.project.metadata" - StackIDLabel = "io.buildpacks.stack.id" - MixinsLabel = "io.buildpacks.stack.mixins" + BuildMetadataLabel = "io.buildpacks.build.metadata" + LifecycleMetadataLabel = "io.buildpacks.lifecycle.metadata" + MixinsLabel = "io.buildpacks.stack.mixins" + ProjectMetadataLabel = "io.buildpacks.project.metadata" + RebasableLabel = "io.buildpacks.rebasable" + StackIDLabel = "io.buildpacks.stack.id" ) diff --git a/vendor/github.com/buildpacks/lifecycle/platform/lifecycle_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/lifecycle_inputs.go index 762c0c977d..e7cbde28ea 100644 --- a/vendor/github.com/buildpacks/lifecycle/platform/lifecycle_inputs.go +++ b/vendor/github.com/buildpacks/lifecycle/platform/lifecycle_inputs.go @@ -1,14 +1,15 @@ package platform import ( - "errors" + "fmt" "os" "path/filepath" "strconv" "strings" "time" - "github.com/google/go-containerregistry/pkg/name" + "github.com/buildpacks/imgutil/remote" + "github.com/google/go-containerregistry/pkg/authn" "github.com/buildpacks/lifecycle/api" "github.com/buildpacks/lifecycle/internal/str" @@ -28,6 +29,8 @@ type LifecycleInputs struct { CacheImageRef string DefaultProcessType string DeprecatedRunImageRef string + ExtendKind string + ExtendedDir string ExtensionsDir string GeneratedDir string GroupPath string @@ -36,6 +39,7 @@ type LifecycleInputs struct { LauncherPath string LauncherSBOMDir string LayersDir string + LayoutDir string LogLevel string OrderPath string OutputImageRef string @@ -45,15 +49,143 @@ type LifecycleInputs struct { ProjectMetadataPath string ReportPath string RunImageRef string + RunPath string StackPath string UID int GID int + ForceRebase bool SkipLayers bool UseDaemon bool + UseLayout bool AdditionalTags str.Slice // str.Slice satisfies the `Value` interface required by the `flag` package KanikoCacheTTL time.Duration } +const PlaceholderLayers = "" + +// NewLifecycleInputs constructs new lifecycle inputs for the provided Platform API version. +// Inputs can be specified by the platform (in order of precedence) through: +// - command-line flags +// - environment variables +// - falling back to the default value +// +// NewLifecycleInputs provides, for each input, the value from the environment if specified, falling back to the default. +// As the final value of the layers directory (if provided via the command-line) is not known, +// inputs that default to a child of the layers directory are provided with PlaceholderLayers as the layers directory. +// To be valid, inputs obtained from calling NewLifecycleInputs MUST be updated using UpdatePlaceholderPaths +// once the final value of the layers directory is known. +func NewLifecycleInputs(platformAPI *api.Version) *LifecycleInputs { + // FIXME: api compatibility should be validated here + + var skipLayers bool + if boolEnv(EnvSkipLayers) || boolEnv(EnvSkipRestore) { + skipLayers = true + } + + inputs := &LifecycleInputs{ + // Operator config + + LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), + PlatformAPI: platformAPI, + ExtendKind: envOrDefault(EnvExtendKind, DefaultExtendKind), + UseDaemon: boolEnv(EnvUseDaemon), + UseLayout: boolEnv(EnvUseLayout), + + // Provided by the base image + + UID: intEnv(EnvUID), + GID: intEnv(EnvGID), + + // Provided by the builder image + + BuildConfigDir: envOrDefault(EnvBuildConfigDir, DefaultBuildConfigDir), + BuildpacksDir: envOrDefault(EnvBuildpacksDir, DefaultBuildpacksDir), + ExtensionsDir: envOrDefault(EnvExtensionsDir, DefaultExtensionsDir), + RunPath: envOrDefault(EnvRunPath, DefaultRunPath), + StackPath: envOrDefault(EnvStackPath, DefaultStackPath), + + // Provided at build time + + AppDir: envOrDefault(EnvAppDir, DefaultAppDir), + LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), + LayoutDir: os.Getenv(EnvLayoutDir), + OrderPath: envOrDefault(EnvOrderPath, filepath.Join(PlaceholderLayers, DefaultOrderFile)), + PlatformDir: envOrDefault(EnvPlatformDir, DefaultPlatformDir), + + // The following instruct the lifecycle where to write files and data during the build + + AnalyzedPath: envOrDefault(EnvAnalyzedPath, filepath.Join(PlaceholderLayers, DefaultAnalyzedFile)), + ExtendedDir: envOrDefault(EnvExtendedDir, filepath.Join(PlaceholderLayers, DefaultExtendedDir)), + GeneratedDir: envOrDefault(EnvGeneratedDir, filepath.Join(PlaceholderLayers, DefaultGeneratedDir)), + GroupPath: envOrDefault(EnvGroupPath, filepath.Join(PlaceholderLayers, DefaultGroupFile)), + PlanPath: envOrDefault(EnvPlanPath, filepath.Join(PlaceholderLayers, DefaultPlanFile)), + ReportPath: envOrDefault(EnvReportPath, filepath.Join(PlaceholderLayers, DefaultReportFile)), + + // Configuration options with respect to caching + + CacheDir: os.Getenv(EnvCacheDir), + CacheImageRef: os.Getenv(EnvCacheImage), + KanikoCacheTTL: timeEnvOrDefault(EnvKanikoCacheTTL, DefaultKanikoCacheTTL), + KanikoDir: "/kaniko", + LaunchCacheDir: os.Getenv(EnvLaunchCacheDir), + SkipLayers: skipLayers, + + // Images used by the lifecycle during the build + + AdditionalTags: nil, // no default + BuildImageRef: os.Getenv(EnvBuildImage), + DeprecatedRunImageRef: "", // no default + OutputImageRef: "", // no default + PreviousImageRef: os.Getenv(EnvPreviousImage), + RunImageRef: os.Getenv(EnvRunImage), + + // Configuration options for the output application image + + DefaultProcessType: os.Getenv(EnvProcessType), + LauncherPath: DefaultLauncherPath, + LauncherSBOMDir: DefaultBuildpacksioSBOMDir, + ProjectMetadataPath: envOrDefault(EnvProjectMetadataPath, filepath.Join(PlaceholderLayers, DefaultProjectMetadataFile)), + + // Configuration options for rebasing + ForceRebase: boolEnv(EnvForceRebase), + } + + if platformAPI.LessThan("0.6") { + // The default location for order.toml is /cnb/order.toml + inputs.OrderPath = envOrDefault(EnvOrderPath, CNBOrderPath) + } + + if platformAPI.LessThan("0.5") { + inputs.AnalyzedPath = envOrDefault(EnvAnalyzedPath, DefaultAnalyzedFile) + inputs.GeneratedDir = envOrDefault(EnvGeneratedDir, DefaultGeneratedDir) + inputs.GroupPath = envOrDefault(EnvGroupPath, DefaultGroupFile) + inputs.PlanPath = envOrDefault(EnvPlanPath, DefaultPlanFile) + inputs.ProjectMetadataPath = envOrDefault(EnvProjectMetadataPath, DefaultProjectMetadataFile) + inputs.ReportPath = envOrDefault(EnvReportPath, DefaultReportFile) + } + + return inputs +} + +func (i *LifecycleInputs) AccessChecker() CheckReadAccess { + if i.UseDaemon || i.UseLayout { + // nop checker + return func(_ string, _ authn.Keychain) (bool, error) { + return true, nil + } + } + // remote access checker + return func(repo string, keychain authn.Keychain) (bool, error) { + img, err := remote.NewImage(repo, keychain) + if err != nil { + return false, fmt.Errorf("failed to get remote image: %w", err) + } + return img.CheckReadAccess() + } +} + +type CheckReadAccess func(repo string, keychain authn.Keychain) (bool, error) + func (i *LifecycleInputs) DestinationImages() []string { var ret []string ret = appendOnce(ret, i.OutputImageRef) @@ -99,203 +231,84 @@ func notIn(list []string, str string) bool { return true } -var ( - ErrOutputImageRequired = "image argument is required" - ErrRunImageRequiredWhenNoStackMD = "-run-image is required when there is no stack metadata available" - ErrSupplyOnlyOneRunImage = "supply only one of -run-image or (deprecated) -image" - ErrRunImageUnsupported = "-run-image is unsupported" - ErrImageUnsupported = "-image is unsupported" - MsgIgnoringLaunchCache = "Ignoring -launch-cache, only intended for use with -daemon" -) - -func ResolveInputs(phase LifecyclePhase, i *LifecycleInputs, logger log.Logger) error { - // order of operations is important - ops := []LifecycleInputsOperation{UpdatePlaceholderPaths, ResolveAbsoluteDirPaths} - switch phase { - case Analyze: - if i.PlatformAPI.LessThan("0.7") { - ops = append(ops, CheckCache) - } - ops = append(ops, - FillAnalyzeImages, - ValidateOutputImageProvided, - CheckLaunchCache, - ValidateImageRefs, - ValidateTargetsAreSameRegistry, - ) - case Build: - // nop - case Create: - ops = append(ops, - FillCreateImages, - ValidateOutputImageProvided, - CheckCache, - CheckLaunchCache, - ValidateImageRefs, - ValidateTargetsAreSameRegistry, - ) - case Detect: - // nop - case Export: - ops = append(ops, - FillExportRunImage, - ValidateOutputImageProvided, - CheckCache, - CheckLaunchCache, - ValidateImageRefs, - ValidateTargetsAreSameRegistry, - ) - case Extend: - // nop - case Rebase: - ops = append(ops, - ValidateRebaseRunImage, - ValidateOutputImageProvided, - ValidateImageRefs, - ValidateTargetsAreSameRegistry, - ) - case Restore: - ops = append(ops, CheckCache) - } - - var err error - for _, op := range ops { - if err = op(i, logger); err != nil { - return err - } - } - return nil -} - -// operations - -type LifecycleInputsOperation func(i *LifecycleInputs, logger log.Logger) error - -func CheckCache(i *LifecycleInputs, logger log.Logger) error { - if i.CacheImageRef == "" && i.CacheDir == "" { - logger.Warn("No cached data will be used, no cache specified.") - } - return nil -} +// shared helpers -func CheckLaunchCache(i *LifecycleInputs, logger log.Logger) error { - if !i.UseDaemon && i.LaunchCacheDir != "" { - logger.Warn(MsgIgnoringLaunchCache) +func boolEnv(k string) bool { + v := os.Getenv(k) + b, err := strconv.ParseBool(v) + if err != nil { + return false } - return nil + return b } -// fillRunImageFromStackTOMLIfNeeded updates the provided lifecycle inputs to include the run image from stack.toml if it is missing. -// When there are multiple run images in stack.toml, the run image with registry matching the output image is selected. -func fillRunImageFromStackTOMLIfNeeded(i *LifecycleInputs, logger log.Logger) error { - if i.RunImageRef != "" { - return nil - } - targetRegistry, err := parseRegistry(i.OutputImageRef) - if err != nil { - return err - } - stackMD, err := ReadStack(i.StackPath, logger) - if err != nil { - return err - } - i.RunImageRef, err = stackMD.BestRunImageMirror(targetRegistry) - if err != nil { - return errors.New(ErrRunImageRequiredWhenNoStackMD) +func envOrDefault(key string, defaultVal string) string { + if envVal := os.Getenv(key); envVal != "" { + return envVal } - return nil + return defaultVal } -func parseRegistry(providedRef string) (string, error) { - ref, err := name.ParseReference(providedRef, name.WeakValidation) +func intEnv(k string) int { + v := os.Getenv(k) + d, err := strconv.Atoi(v) if err != nil { - return "", err + return 0 } - return ref.Context().RegistryStr(), nil + return d } -func ResolveAbsoluteDirPaths(i *LifecycleInputs, _ log.Logger) error { - toUpdate := i.directoryPaths() - for _, dir := range toUpdate { - if *dir == "" { - continue - } - abs, err := filepath.Abs(*dir) - if err != nil { - return err - } - *dir = abs +func timeEnvOrDefault(key string, defaultVal time.Duration) time.Duration { + envTTL := os.Getenv(key) + if envTTL == "" { + return defaultVal } - return nil -} - -func (i *LifecycleInputs) directoryPaths() []*string { - return []*string{ - &i.AppDir, - &i.BuildConfigDir, - &i.BuildpacksDir, - &i.CacheDir, - &i.ExtensionsDir, - &i.GeneratedDir, - &i.KanikoDir, - &i.LaunchCacheDir, - &i.LayersDir, - &i.PlatformDir, + ttl, err := time.ParseDuration(envTTL) + if err != nil { + return defaultVal } + return ttl } -const placeholderLayersDir = "" - -var ( - placeholderAnalyzedPath = filepath.Join(placeholderLayersDir, DefaultAnalyzedFile) - placeholderGeneratedDir = filepath.Join(placeholderLayersDir, DefaultGeneratedDir) - placeholderGroupPath = filepath.Join(placeholderLayersDir, DefaultGroupFile) - placeholderOrderPath = filepath.Join(placeholderLayersDir, DefaultOrderFile) - placeholderPlanPath = filepath.Join(placeholderLayersDir, DefaultPlanFile) - placeholderProjectMetadataPath = filepath.Join(placeholderLayersDir, DefaultProjectMetadataFile) - placeholderReportPath = filepath.Join(placeholderLayersDir, DefaultReportFile) -) +// operations func UpdatePlaceholderPaths(i *LifecycleInputs, _ log.Logger) error { toUpdate := i.placeholderPaths() - for _, pp := range toUpdate { - switch { - case *pp == "": + for _, path := range toUpdate { + if *path == "" { continue - case *pp == placeholderOrderPath: - *pp = i.defaultOrderPath() - case strings.Contains(*pp, placeholderLayersDir): - filename := filepath.Base(*pp) - *pp = filepath.Join(i.configDir(), filename) - default: - // nop + } + if !isPlaceholder(*path) { + continue + } + oldPath := *path + toReplace := PlaceholderLayers + if i.LayersDir == "" { // layers is unset when this call comes from the rebaser + toReplace = PlaceholderLayers + string(filepath.Separator) + } + newPath := strings.Replace(*path, toReplace, i.LayersDir, 1) + *path = newPath + if isPlaceholderOrder(oldPath) { + if _, err := os.Stat(newPath); err != nil { + i.OrderPath = CNBOrderPath + } } } return nil } -func (i *LifecycleInputs) defaultOrderPath() string { - if i.PlatformAPI.LessThan("0.6") { - return DefaultOrderPath - } - layersOrderPath := filepath.Join(i.LayersDir, "order.toml") - if _, err := os.Stat(layersOrderPath); err != nil { - return DefaultOrderPath - } - return layersOrderPath +func isPlaceholder(s string) bool { + return strings.Contains(s, PlaceholderLayers) } -func (i *LifecycleInputs) configDir() string { - if i.PlatformAPI.LessThan("0.5") || - (i.LayersDir == "") { // i.LayersDir is unset when this call comes from the rebaser - will be fixed as part of https://github.com/buildpacks/spec/issues/156 - return "." // the current working directory - } - return i.LayersDir +func isPlaceholderOrder(s string) bool { + return s == filepath.Join(PlaceholderLayers, DefaultOrderFile) } func (i *LifecycleInputs) placeholderPaths() []*string { return []*string{ &i.AnalyzedPath, + &i.ExtendedDir, &i.GeneratedDir, &i.GroupPath, &i.OrderPath, @@ -305,75 +318,32 @@ func (i *LifecycleInputs) placeholderPaths() []*string { } } -// ValidateImageRefs ensures all provided image references are valid. -func ValidateImageRefs(i *LifecycleInputs, _ log.Logger) error { - for _, imageRef := range i.Images() { - _, err := name.ParseReference(imageRef, name.WeakValidation) - if err != nil { - return err +func ResolveAbsoluteDirPaths(i *LifecycleInputs, _ log.Logger) error { + toUpdate := i.directoryPaths() + for _, dir := range toUpdate { + if *dir == "" { + continue } - } - return nil -} - -func ValidateOutputImageProvided(i *LifecycleInputs, logger log.Logger) error { - if i.OutputImageRef == "" { - return errors.New(ErrOutputImageRequired) - } - return nil -} - -// ValidateTargetsAreSameRegistry ensures all output images are on the same registry. -func ValidateTargetsAreSameRegistry(i *LifecycleInputs, _ log.Logger) error { - if i.UseDaemon { - return nil - } - return ValidateSameRegistry(i.DestinationImages()...) -} - -func ValidateSameRegistry(tags ...string) error { - var ( - reg string - registries = map[string]struct{}{} - ) - for _, imageRef := range tags { - ref, err := name.ParseReference(imageRef, name.WeakValidation) + abs, err := filepath.Abs(*dir) if err != nil { return err } - reg = ref.Context().RegistryStr() - registries[reg] = struct{}{} - } - - if len(registries) > 1 { - return errors.New("writing to multiple registries is unsupported") + *dir = abs } return nil } -// shared helpers - -func boolEnv(k string) bool { - v := os.Getenv(k) - b, err := strconv.ParseBool(v) - if err != nil { - return false - } - return b -} - -func envOrDefault(key string, defaultVal string) string { - if envVal := os.Getenv(key); envVal != "" { - return envVal - } - return defaultVal -} - -func intEnv(k string) int { - v := os.Getenv(k) - d, err := strconv.Atoi(v) - if err != nil { - return 0 +func (i *LifecycleInputs) directoryPaths() []*string { + return []*string{ + &i.AppDir, + &i.BuildConfigDir, + &i.BuildpacksDir, + &i.CacheDir, + &i.ExtensionsDir, + &i.GeneratedDir, + &i.KanikoDir, + &i.LaunchCacheDir, + &i.LayersDir, + &i.PlatformDir, } - return d } diff --git a/vendor/github.com/buildpacks/lifecycle/platform/platform.go b/vendor/github.com/buildpacks/lifecycle/platform/platform.go index b08829a97f..8820ab1877 100644 --- a/vendor/github.com/buildpacks/lifecycle/platform/platform.go +++ b/vendor/github.com/buildpacks/lifecycle/platform/platform.go @@ -1,6 +1,8 @@ package platform -import "github.com/buildpacks/lifecycle/api" +import ( + "github.com/buildpacks/lifecycle/api" +) type LifecyclePhase int @@ -17,37 +19,14 @@ const ( // Platform holds lifecycle inputs and outputs for a given Platform API version and lifecycle phase. type Platform struct { - Phase LifecyclePhase - LifecycleInputs + *LifecycleInputs Exiter } -// NewPlatformFor accepts a lifecycle phase and Platform API version, and returns a Platform. -func NewPlatformFor(phase LifecyclePhase, platformAPI string) *Platform { - var lifecycleInputs LifecycleInputs - switch phase { - case Analyze: - lifecycleInputs = DefaultAnalyzeInputs(api.MustParse(platformAPI)) - case Detect: - lifecycleInputs = DefaultDetectInputs(api.MustParse(platformAPI)) - case Restore: - lifecycleInputs = DefaultRestoreInputs(api.MustParse(platformAPI)) - case Extend: - lifecycleInputs = DefaultExtendInputs(api.MustParse(platformAPI)) - case Build: - lifecycleInputs = DefaultBuildInputs(api.MustParse(platformAPI)) - case Export: - lifecycleInputs = DefaultExportInputs(api.MustParse(platformAPI)) - case Create: - lifecycleInputs = DefaultCreateInputs(api.MustParse(platformAPI)) - case Rebase: - lifecycleInputs = DefaultRebaseInputs(api.MustParse(platformAPI)) - default: - // nop - } +// NewPlatformFor accepts a Platform API version and a layers directory, and returns a Platform with default lifecycle inputs and an exiter service. +func NewPlatformFor(platformAPI string) *Platform { return &Platform{ - Phase: phase, - LifecycleInputs: lifecycleInputs, + LifecycleInputs: NewLifecycleInputs(api.MustParse(platformAPI)), Exiter: NewExiter(platformAPI), } } diff --git a/vendor/github.com/buildpacks/lifecycle/platform/rebase_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/rebase_inputs.go deleted file mode 100644 index 90ddf6be96..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/rebase_inputs.go +++ /dev/null @@ -1,52 +0,0 @@ -package platform - -import ( - "errors" - "os" - - "github.com/buildpacks/lifecycle/api" - "github.com/buildpacks/lifecycle/log" -) - -// DefaultRebaseInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `rebase` phase. -func DefaultRebaseInputs(platformAPI *api.Version) LifecycleInputs { - var inputs LifecycleInputs - switch { - case platformAPI.AtLeast("0.5"): - inputs = defaultRebaseInputs() - default: - inputs = defaultRebaseInputs03() - } - inputs.PlatformAPI = platformAPI - return inputs -} - -func defaultRebaseInputs() LifecycleInputs { - ri := defaultRebaseInputs03() - ri.ReportPath = envOrDefault(EnvReportPath, placeholderReportPath) - return ri -} - -func defaultRebaseInputs03() LifecycleInputs { - return LifecycleInputs{ - UseDaemon: boolEnv(EnvUseDaemon), // - GID: intEnv(EnvGID), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - ReportPath: envOrDefault(EnvReportPath, DefaultReportFile), // - not actually introduced until Platform API 0.4, but it is always written by the lifecycle - RunImageRef: os.Getenv(EnvRunImage), // - UID: intEnv(EnvUID), // - } -} - -func ValidateRebaseRunImage(i *LifecycleInputs, _ log.Logger) error { - switch { - case i.DeprecatedRunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): - return errors.New(ErrSupplyOnlyOneRunImage) - case i.DeprecatedRunImageRef != "": - i.RunImageRef = i.DeprecatedRunImageRef - return nil - default: - return nil - } -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/resolve_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/resolve_inputs.go new file mode 100644 index 0000000000..45f735b2ed --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/resolve_inputs.go @@ -0,0 +1,271 @@ +package platform + +import ( + "errors" + "os" + + "github.com/google/go-containerregistry/pkg/name" + + "github.com/buildpacks/lifecycle/log" + "github.com/buildpacks/lifecycle/platform/files" +) + +var ( + ErrOutputImageRequired = "image argument is required" + ErrRunImageRequiredWhenNoStackMD = "-run-image is required when there is no stack metadata available" + ErrRunImageRequiredWhenNoRunMD = "-run-image is required when there is no run metadata available" + ErrSupplyOnlyOneRunImage = "supply only one of -run-image or (deprecated) -image" + ErrRunImageUnsupported = "-run-image is unsupported" + ErrImageUnsupported = "-image is unsupported" + MsgIgnoringLaunchCache = "Ignoring -launch-cache, only intended for use with -daemon" +) + +func ResolveInputs(phase LifecyclePhase, i *LifecycleInputs, logger log.Logger) error { + // order of operations is important + ops := []LifecycleInputsOperation{UpdatePlaceholderPaths, ResolveAbsoluteDirPaths} + switch phase { + case Analyze: + if i.PlatformAPI.LessThan("0.7") { + ops = append(ops, CheckCache) + } + ops = append(ops, + FillAnalyzeImages, + ValidateOutputImageProvided, + CheckLaunchCache, + ValidateImageRefs, + ValidateTargetsAreSameRegistry, + ) + case Build: + // nop + case Create: + ops = append(ops, + FillCreateImages, + ValidateOutputImageProvided, + CheckCache, + CheckLaunchCache, + ValidateImageRefs, + ValidateTargetsAreSameRegistry, + ) + case Detect: + // nop + case Export: + ops = append(ops, + FillExportRunImage, + ValidateOutputImageProvided, + CheckCache, + CheckLaunchCache, + ValidateImageRefs, + ValidateTargetsAreSameRegistry, + ) + case Extend: + // nop + case Rebase: + ops = append(ops, + ValidateRebaseRunImage, + ValidateOutputImageProvided, + ValidateImageRefs, + ValidateTargetsAreSameRegistry, + ) + case Restore: + ops = append(ops, CheckCache) + } + + var err error + for _, op := range ops { + if err = op(i, logger); err != nil { + return err + } + } + return nil +} + +// operations + +type LifecycleInputsOperation func(i *LifecycleInputs, logger log.Logger) error + +func CheckCache(i *LifecycleInputs, logger log.Logger) error { + if i.CacheImageRef == "" && i.CacheDir == "" { + logger.Warn("No cached data will be used, no cache specified.") + } + return nil +} + +func CheckLaunchCache(i *LifecycleInputs, logger log.Logger) error { + if !i.UseDaemon && i.LaunchCacheDir != "" { + logger.Warn(MsgIgnoringLaunchCache) + } + return nil +} + +func FillAnalyzeImages(i *LifecycleInputs, logger log.Logger) error { + if i.PreviousImageRef == "" { + i.PreviousImageRef = i.OutputImageRef + } + if i.PlatformAPI.LessThan("0.7") { + return nil + } + if i.PlatformAPI.LessThan("0.12") { + return fillRunImageFromStackTOMLIfNeeded(i, logger) + } + return fillRunImageFromRunTOMLIfNeeded(i, logger) +} + +func FillCreateImages(i *LifecycleInputs, logger log.Logger) error { + if i.PreviousImageRef == "" { + i.PreviousImageRef = i.OutputImageRef + } + switch { + case i.DeprecatedRunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): + return errors.New(ErrSupplyOnlyOneRunImage) + case i.DeprecatedRunImageRef != "": + i.RunImageRef = i.DeprecatedRunImageRef + return nil + case i.PlatformAPI.LessThan("0.12"): + return fillRunImageFromStackTOMLIfNeeded(i, logger) + default: + return fillRunImageFromRunTOMLIfNeeded(i, logger) + } +} + +func FillExportRunImage(i *LifecycleInputs, logger log.Logger) error { + supportsRunImageFlag := i.PlatformAPI.LessThan("0.7") + if supportsRunImageFlag { + switch { + case i.DeprecatedRunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): + return errors.New(ErrSupplyOnlyOneRunImage) + case i.RunImageRef != "": + return nil + case i.DeprecatedRunImageRef != "": + i.RunImageRef = i.DeprecatedRunImageRef + return nil + default: + return fillRunImageFromStackTOMLIfNeeded(i, logger) + } + } else { + switch { + case i.RunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): + return errors.New(ErrRunImageUnsupported) + case i.DeprecatedRunImageRef != "": + return errors.New(ErrImageUnsupported) + default: + analyzedMD, err := files.ReadAnalyzed(i.AnalyzedPath, logger) + if err != nil { + return err + } + if analyzedMD.RunImage.Reference == "" { + return errors.New("run image not found in analyzed metadata") + } + i.RunImageRef = analyzedMD.RunImage.Reference + return nil + } + } +} + +// fillRunImageFromRunTOMLIfNeeded updates the provided lifecycle inputs to include the run image from run.toml if the run image input it is missing. +// When there are multiple images in run.toml, the first image is selected. +// When there are registry mirrors for the selected image, the image with registry matching the output image is selected. +func fillRunImageFromRunTOMLIfNeeded(i *LifecycleInputs, logger log.Logger) error { + if i.RunImageRef != "" { + return nil + } + targetRegistry, err := parseRegistry(i.OutputImageRef) + if err != nil { + return err + } + runMD, err := files.ReadRun(i.RunPath, logger) + if err != nil { + return err + } + if len(runMD.Images) == 0 { + return errors.New(ErrRunImageRequiredWhenNoRunMD) + } + i.RunImageRef, err = BestRunImageMirrorFor(targetRegistry, runMD.Images[0], i.AccessChecker()) + return err +} + +// fillRunImageFromStackTOMLIfNeeded updates the provided lifecycle inputs to include the run image from stack.toml if the run image input it is missing. +// When there are registry mirrors in stack.toml, the image with registry matching the output image is selected. +func fillRunImageFromStackTOMLIfNeeded(i *LifecycleInputs, logger log.Logger) error { + if i.RunImageRef != "" { + return nil + } + targetRegistry, err := parseRegistry(i.OutputImageRef) + if err != nil { + return err + } + stackMD, err := files.ReadStack(i.StackPath, logger) + if err != nil { + return err + } + i.RunImageRef, err = BestRunImageMirrorFor(targetRegistry, stackMD.RunImage, i.AccessChecker()) + if err != nil { + return errors.New(ErrRunImageRequiredWhenNoStackMD) + } + return nil +} + +func parseRegistry(providedRef string) (string, error) { + ref, err := name.ParseReference(providedRef, name.WeakValidation) + if err != nil { + return "", err + } + return ref.Context().RegistryStr(), nil +} + +// ValidateImageRefs ensures all provided image references are valid. +func ValidateImageRefs(i *LifecycleInputs, _ log.Logger) error { + for _, imageRef := range i.Images() { + _, err := name.ParseReference(imageRef, name.WeakValidation) + if err != nil { + return err + } + } + return nil +} + +func ValidateOutputImageProvided(i *LifecycleInputs, _ log.Logger) error { + if i.OutputImageRef == "" { + return errors.New(ErrOutputImageRequired) + } + return nil +} + +func ValidateRebaseRunImage(i *LifecycleInputs, _ log.Logger) error { + switch { + case i.DeprecatedRunImageRef != "" && i.RunImageRef != os.Getenv(EnvRunImage): + return errors.New(ErrSupplyOnlyOneRunImage) + case i.DeprecatedRunImageRef != "": + i.RunImageRef = i.DeprecatedRunImageRef + return nil + default: + return nil + } +} + +// ValidateTargetsAreSameRegistry ensures all output images are on the same registry. +func ValidateTargetsAreSameRegistry(i *LifecycleInputs, _ log.Logger) error { + if i.UseDaemon { + return nil + } + return ValidateSameRegistry(i.DestinationImages()...) +} + +func ValidateSameRegistry(tags ...string) error { + var ( + reg string + registries = map[string]struct{}{} + ) + for _, imageRef := range tags { + ref, err := name.ParseReference(imageRef, name.WeakValidation) + if err != nil { + return err + } + reg = ref.Context().RegistryStr() + registries[reg] = struct{}{} + } + + if len(registries) > 1 { + return errors.New("writing to multiple registries is unsupported") + } + return nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/restore_inputs.go b/vendor/github.com/buildpacks/lifecycle/platform/restore_inputs.go deleted file mode 100644 index f1395c95b1..0000000000 --- a/vendor/github.com/buildpacks/lifecycle/platform/restore_inputs.go +++ /dev/null @@ -1,57 +0,0 @@ -package platform - -import ( - "os" - - "github.com/buildpacks/lifecycle/api" -) - -// DefaultRestoreInputs accepts a Platform API version and returns a set of lifecycle inputs -// with default values filled in for the `restore` phase. -func DefaultRestoreInputs(platformAPI *api.Version) LifecycleInputs { - var inputs LifecycleInputs - switch { - case platformAPI.AtLeast("0.10"): - inputs = defaultRestoreInputs() - case platformAPI.AtLeast("0.7"): - inputs = defaultRestoreInputs07To09() - case platformAPI.AtLeast("0.5"): - inputs = defaultRestoreInputs05To06() - default: - inputs = defaultRestoreInputs03To04() - } - inputs.PlatformAPI = platformAPI - return inputs -} - -func defaultRestoreInputs() LifecycleInputs { - ri := defaultRestoreInputs07To09() - ri.BuildImageRef = os.Getenv(EnvBuildImage) - ri.KanikoDir = "/kaniko" - return ri -} - -func defaultRestoreInputs07To09() LifecycleInputs { - ri := defaultRestoreInputs05To06() - ri.AnalyzedPath = envOrDefault(EnvAnalyzedPath, placeholderAnalyzedPath) - ri.SkipLayers = false - return ri -} - -func defaultRestoreInputs05To06() LifecycleInputs { - ri := defaultRestoreInputs03To04() - ri.GroupPath = envOrDefault(EnvGroupPath, placeholderGroupPath) - return ri -} - -func defaultRestoreInputs03To04() LifecycleInputs { - return LifecycleInputs{ - CacheDir: os.Getenv(EnvCacheDir), // - CacheImageRef: os.Getenv(EnvCacheImage), // - GID: intEnv(EnvGID), // - GroupPath: envOrDefault(EnvGroupPath, DefaultGroupFile), // - LayersDir: envOrDefault(EnvLayersDir, DefaultLayersDir), // - LogLevel: envOrDefault(EnvLogLevel, DefaultLogLevel), // - UID: intEnv(EnvUID), // - } -} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/run_image.go b/vendor/github.com/buildpacks/lifecycle/platform/run_image.go new file mode 100644 index 0000000000..2c7f722d93 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/run_image.go @@ -0,0 +1,111 @@ +package platform + +import ( + "errors" + "fmt" + + "github.com/google/go-containerregistry/pkg/authn" + "github.com/google/go-containerregistry/pkg/name" + + "github.com/buildpacks/lifecycle/auth" + "github.com/buildpacks/lifecycle/cmd" + "github.com/buildpacks/lifecycle/launch" + "github.com/buildpacks/lifecycle/platform/files" +) + +const ( + TargetLabel = "io.buildpacks.id" + OSDistributionNameLabel = "io.buildpacks.distribution.name" + OSDistributionVersionLabel = "io.buildpacks.distribution.version" +) + +func BestRunImageMirrorFor(targetRegistry string, runImageMD files.RunImageForExport, checkReadAccess CheckReadAccess) (string, error) { + var runImageMirrors []string + if runImageMD.Image == "" { + return "", errors.New("missing run image metadata") + } + runImageMirrors = append(runImageMirrors, runImageMD.Image) + runImageMirrors = append(runImageMirrors, runImageMD.Mirrors...) + + keychain, err := auth.DefaultKeychain(runImageMirrors...) + if err != nil { + return "", fmt.Errorf("unable to create keychain: %w", err) + } + + // Try to select run image on the same registry as the target + runImageRef := byRegistry(targetRegistry, runImageMirrors, checkReadAccess, keychain) + if runImageRef != "" { + return runImageRef, nil + } + + // Select the first run image we have access to + for _, image := range runImageMirrors { + if ok, _ := checkReadAccess(image, keychain); ok { + return image, nil + } + } + + return "", errors.New("failed to find accessible run image") +} + +func byRegistry(reg string, images []string, checkReadAccess CheckReadAccess, keychain authn.Keychain) string { + for _, image := range images { + ref, err := name.ParseReference(image, name.WeakValidation) + if err != nil { + continue + } + if reg == ref.Context().RegistryStr() { + if ok, _ := checkReadAccess(image, keychain); ok { + return image + } + } + } + return "" +} + +// GetRunImageForExport takes platform inputs and returns run image information +// for populating the io.buildpacks.lifecycle.metadata on the exported app image. +// The run image information is read from: +// - stack.toml for older platforms +// - run.toml for newer platforms, where the run image information returned is +// - the first set of image & mirrors that contains the platform-provided run image, or +// - the platform-provided run image if extensions were used and the image was not found, or +// - the first set of image & mirrors in run.toml +// +// The "platform-provided run image" is the run image "image" in analyzed.toml, +// NOT the run image "reference", +// as the run image "reference" could be a daemon image ID (which we'd not expect to find in run.toml). +func GetRunImageForExport(inputs LifecycleInputs) (files.RunImageForExport, error) { + if inputs.PlatformAPI.LessThan("0.12") { + stackMD, err := files.ReadStack(inputs.StackPath, cmd.DefaultLogger) + if err != nil { + return files.RunImageForExport{}, err + } + return stackMD.RunImage, nil + } + runMD, err := files.ReadRun(inputs.RunPath, cmd.DefaultLogger) + if err != nil { + return files.RunImageForExport{}, err + } + if len(runMD.Images) == 0 { + return files.RunImageForExport{}, nil + } + analyzedMD, err := files.ReadAnalyzed(inputs.AnalyzedPath, cmd.DefaultLogger) + if err != nil { + return files.RunImageForExport{}, err + } + for _, runImage := range runMD.Images { + if runImage.Contains(analyzedMD.RunImageImage()) { + return runImage, nil + } + } + buildMD := &files.BuildMetadata{} + if err = files.DecodeBuildMetadata(launch.GetMetadataFilePath(inputs.LayersDir), inputs.PlatformAPI, buildMD); err != nil { + return files.RunImageForExport{}, err + } + if len(buildMD.Extensions) > 0 { // FIXME: try to know for sure if extensions were used to switch the run image + // Extensions could have switched the run image, so we can't assume the first run image in run.toml was intended + return files.RunImageForExport{Image: analyzedMD.RunImageImage()}, nil + } + return runMD.Images[0], nil +} diff --git a/vendor/github.com/buildpacks/lifecycle/platform/target_data.go b/vendor/github.com/buildpacks/lifecycle/platform/target_data.go new file mode 100644 index 0000000000..5a82981388 --- /dev/null +++ b/vendor/github.com/buildpacks/lifecycle/platform/target_data.go @@ -0,0 +1,122 @@ +package platform + +import ( + "github.com/buildpacks/imgutil" + + "github.com/buildpacks/lifecycle/buildpack" + "github.com/buildpacks/lifecycle/internal/fsutil" + "github.com/buildpacks/lifecycle/log" + "github.com/buildpacks/lifecycle/platform/files" +) + +// Fulfills the prophecy set forth in https://github.com/buildpacks/rfcs/blob/b8abe33f2bdc58792acf0bd094dc4ce3c8a54dbb/text/0096-remove-stacks-mixins.md?plain=1#L97 +// by returning an array of "VARIABLE=value" strings suitable for inclusion in your environment or complete breakfast. +func EnvVarsFor(tm files.TargetMetadata) []string { + ret := []string{"CNB_TARGET_OS=" + tm.OS, "CNB_TARGET_ARCH=" + tm.Arch} + ret = append(ret, "CNB_TARGET_ARCH_VARIANT="+tm.ArchVariant) + var distName, distVersion string + if tm.Distribution != nil { + distName = tm.Distribution.Name + distVersion = tm.Distribution.Version + } + ret = append(ret, "CNB_TARGET_DISTRO_NAME="+distName) + ret = append(ret, "CNB_TARGET_DISTRO_VERSION="+distVersion) + if tm.ID != "" { + ret = append(ret, "CNB_TARGET_ID="+tm.ID) + } + return ret +} + +func GetTargetMetadata(fromImage imgutil.Image) (*files.TargetMetadata, error) { + tm := files.TargetMetadata{} + var err error + tm.OS, err = fromImage.OS() + if err != nil { + return &tm, err + } + tm.Arch, err = fromImage.Architecture() + if err != nil { + return &tm, err + } + tm.ArchVariant, err = fromImage.Variant() + if err != nil { + return &tm, err + } + labels, err := fromImage.Labels() + if err != nil { + return &tm, err + } + distName, distNameExists := labels[OSDistributionNameLabel] + distVersion, distVersionExists := labels[OSDistributionVersionLabel] + if distNameExists || distVersionExists { + tm.Distribution = &files.OSDistribution{Name: distName, Version: distVersion} + } + if id, exists := labels[TargetLabel]; exists { + tm.ID = id + } + + return &tm, nil +} + +// GetTargetOSFromFileSystem populates the target metadata you pass in if the information is available +// returns a boolean indicating whether it populated any data. +func GetTargetOSFromFileSystem(d fsutil.Detector, tm *files.TargetMetadata, logger log.Logger) { + if d.HasSystemdFile() { + contents, err := d.ReadSystemdFile() + if err != nil { + logger.Warnf("Encountered error trying to read /etc/os-release file: %s", err.Error()) + return + } + info := d.GetInfo(contents) + if info.Version != "" || info.Name != "" { + tm.OS = "linux" + tm.Distribution = &files.OSDistribution{Name: info.Name, Version: info.Version} + } + } +} + +// TargetSatisfiedForBuild treats optional fields (ArchVariant and Distributions) as wildcards if empty, returns true if all populated fields match +func TargetSatisfiedForBuild(t files.TargetMetadata, o buildpack.TargetMetadata) bool { + if (o.Arch != "*" && t.Arch != o.Arch) || (o.OS != "*" && t.OS != o.OS) { + return false + } + if t.ArchVariant != "" && o.ArchVariant != "" && t.ArchVariant != o.ArchVariant { + return false + } + + // if either of the lengths of Distributions are zero, treat it as a wildcard. + if t.Distribution != nil && len(o.Distributions) > 0 { + // this could be more efficient but the lists are probably short... + found := false + for _, odist := range o.Distributions { + if t.Distribution.Name == odist.Name && t.Distribution.Version == odist.Version { + found = true + continue + } + } + if !found { + return false + } + } + return true +} + +// TargetSatisfiedForRebase treats optional fields (ArchVariant and Distribution fields) as wildcards if empty, returns true if all populated fields match +func TargetSatisfiedForRebase(t files.TargetMetadata, appTargetMetadata files.TargetMetadata) bool { + if t.Arch != appTargetMetadata.Arch || t.OS != appTargetMetadata.OS { + return false + } + if t.ArchVariant != "" && appTargetMetadata.ArchVariant != "" && t.ArchVariant != appTargetMetadata.ArchVariant { + return false + } + + if t.Distribution != nil && appTargetMetadata.Distribution != nil { + if t.Distribution.Name != appTargetMetadata.Distribution.Name { + return false + } + if t.Distribution.Version != appTargetMetadata.Distribution.Version { + return false + } + } + return true +} diff --git a/vendor/github.com/buildpacks/lifecycle/rebaser.go b/vendor/github.com/buildpacks/lifecycle/rebaser.go index d89a9ca49a..78672b12e1 100644 --- a/vendor/github.com/buildpacks/lifecycle/rebaser.go +++ b/vendor/github.com/buildpacks/lifecycle/rebaser.go @@ -11,80 +11,124 @@ import ( "github.com/buildpacks/lifecycle/api" "github.com/buildpacks/lifecycle/image" + "github.com/buildpacks/lifecycle/internal/encoding" "github.com/buildpacks/lifecycle/internal/str" "github.com/buildpacks/lifecycle/log" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" +) + +var ( + msgProvideForceToOverride = "please provide -force to override" + msgAppImageNotMarkedRebasable = "app image is not marked as rebasable" + msgRunImageMDNotContainsName = "rebase app image: new base image '%s' not found in existing run image metadata: %s" + msgUnableToSatisfyTargetConstraints = "unable to satisfy target os/arch constraints; new run image: %s, old run image: %s" ) type Rebaser struct { Logger log.Logger PlatformAPI *api.Version + Force bool } type RebaseReport struct { - Image platform.ImageReport `toml:"image"` + Image files.ImageReport `toml:"image"` } func (r *Rebaser) Rebase(workingImage imgutil.Image, newBaseImage imgutil.Image, outputImageRef string, additionalNames []string) (RebaseReport, error) { - var origMetadata platform.LayersMetadataCompat - if err := image.DecodeLabel(workingImage, platform.LayerMetadataLabel, &origMetadata); err != nil { - return RebaseReport{}, errors.Wrap(err, "get image metadata") - } - - appStackID, err := workingImage.Label(platform.StackIDLabel) - if err != nil { - return RebaseReport{}, errors.Wrap(err, "get app image stack") - } - - newBaseStackID, err := newBaseImage.Label(platform.StackIDLabel) + appPlatformAPI, err := workingImage.Env(platform.EnvPlatformAPI) if err != nil { - return RebaseReport{}, errors.Wrap(err, "get new base image stack") - } - - if appStackID == "" { - return RebaseReport{}, errors.New("stack not defined on app image") - } - - if newBaseStackID == "" { - return RebaseReport{}, errors.New("stack not defined on new base image") + return RebaseReport{}, fmt.Errorf("failed to get app image platform API: %w", err) } - - if appStackID != newBaseStackID { - return RebaseReport{}, fmt.Errorf("incompatible stack: '%s' is not compatible with '%s'", newBaseStackID, appStackID) + // perform platform API-specific validations + if appPlatformAPI == "" || api.MustParse(appPlatformAPI).LessThan("0.12") { + if err = validateStackID(workingImage, newBaseImage); err != nil { + return RebaseReport{}, err + } + if err = validateMixins(workingImage, newBaseImage); err != nil { + return RebaseReport{}, err + } + } else { + if err = r.validateTarget(workingImage, newBaseImage); err != nil { + return RebaseReport{}, err + } } - if err := validateMixins(workingImage, newBaseImage); err != nil { - return RebaseReport{}, err + // get existing metadata label + var origMetadata files.LayersMetadataCompat + if err = image.DecodeLabel(workingImage, platform.LifecycleMetadataLabel, &origMetadata); err != nil { + return RebaseReport{}, fmt.Errorf("get image metadata: %w", err) } - if err := workingImage.Rebase(origMetadata.RunImage.TopLayer, newBaseImage); err != nil { - return RebaseReport{}, errors.Wrap(err, "rebase app image") + // rebase + if err = workingImage.Rebase(origMetadata.RunImage.TopLayer, newBaseImage); err != nil { + return RebaseReport{}, fmt.Errorf("rebase app image: %w", err) } + // update metadata label origMetadata.RunImage.TopLayer, err = newBaseImage.TopLayer() if err != nil { - return RebaseReport{}, errors.Wrap(err, "get rebase run image top layer SHA") + return RebaseReport{}, fmt.Errorf("get rebase run image top layer SHA: %w", err) } - identifier, err := newBaseImage.Identifier() if err != nil { - return RebaseReport{}, errors.Wrap(err, "get run image id or digest") + return RebaseReport{}, fmt.Errorf("get run image id or digest: %w", err) } origMetadata.RunImage.Reference = identifier.String() - + if r.PlatformAPI.AtLeast("0.12") { + // update stack and runImage if needed + if !containsName(origMetadata, newBaseImage.Name()) { + var existingRunImageMD string + switch { + case origMetadata.RunImage.Image != "": + existingRunImageMD = encoding.ToJSONMaybe(origMetadata.RunImage) + case origMetadata.Stack != nil: + existingRunImageMD = encoding.ToJSONMaybe(origMetadata.Stack.RunImage) + default: + existingRunImageMD = "not found" + } + if r.Force { + r.Logger.Warnf( + msgRunImageMDNotContainsName, + newBaseImage.Name(), + existingRunImageMD, + ) + // update original metadata + origMetadata.RunImage.Image = newBaseImage.Name() + origMetadata.RunImage.Mirrors = []string{} + newStackMD := origMetadata.RunImage.ToStack() + origMetadata.Stack = &newStackMD + } else { + return RebaseReport{}, fmt.Errorf( + msgRunImageMDNotContainsName+"; "+msgProvideForceToOverride, + newBaseImage.Name(), + existingRunImageMD, + ) + } + } + } + + // set metadata label data, err := json.Marshal(origMetadata) if err != nil { - return RebaseReport{}, errors.Wrap(err, "marshall metadata") + return RebaseReport{}, fmt.Errorf("marshall metadata: %w", err) } - - if err := workingImage.SetLabel(platform.LayerMetadataLabel, string(data)); err != nil { - return RebaseReport{}, errors.Wrap(err, "set app image metadata label") + if err := workingImage.SetLabel(platform.LifecycleMetadataLabel, string(data)); err != nil { + return RebaseReport{}, fmt.Errorf("set app image metadata label: %w", err) } - hasPrefix := func(l string) bool { return strings.HasPrefix(l, "io.buildpacks.stack.") } + // update other labels + hasPrefix := func(l string) bool { + if r.PlatformAPI.AtLeast("0.12") { + return strings.HasPrefix(l, "io.buildpacks.stack.") || strings.HasPrefix(l, "io.buildpacks.base.") + } + return strings.HasPrefix(l, "io.buildpacks.stack.") + } if err := image.SyncLabels(newBaseImage, workingImage, hasPrefix); err != nil { - return RebaseReport{}, errors.Wrap(err, "set stack labels") + return RebaseReport{}, fmt.Errorf("set stack labels: %w", err) } + + // save report := RebaseReport{} report.Image, err = saveImageAs(workingImage, outputImageRef, additionalNames, r.Logger) if err != nil { @@ -98,16 +142,51 @@ func (r *Rebaser) Rebase(workingImage imgutil.Image, newBaseImage imgutil.Image, return report, err } +func containsName(origMetadata files.LayersMetadataCompat, newBaseName string) bool { + if origMetadata.RunImage.Contains(newBaseName) { + return true + } + if origMetadata.Stack == nil { + return false + } + return origMetadata.Stack.RunImage.Contains(newBaseName) +} + +func validateStackID(appImg, newBaseImage imgutil.Image) error { + appStackID, err := appImg.Label(platform.StackIDLabel) + if err != nil { + return fmt.Errorf("get app image stack: %w", err) + } + + newBaseStackID, err := newBaseImage.Label(platform.StackIDLabel) + if err != nil { + return fmt.Errorf("get new base image stack: %w", err) + } + + if appStackID == "" { + return errors.New("stack not defined on app image") + } + + if newBaseStackID == "" { + return errors.New("stack not defined on new base image") + } + + if appStackID != newBaseStackID { + return fmt.Errorf("incompatible stack: '%s' is not compatible with '%s'", newBaseStackID, appStackID) + } + return nil +} + func validateMixins(appImg, newBaseImg imgutil.Image) error { var appImageMixins []string var newBaseImageMixins []string if err := image.DecodeLabel(appImg, platform.MixinsLabel, &appImageMixins); err != nil { - return errors.Wrap(err, "get app image mixins") + return fmt.Errorf("get app image mixins: %w", err) } if err := image.DecodeLabel(newBaseImg, platform.MixinsLabel, &newBaseImageMixins); err != nil { - return errors.Wrap(err, "get run image mixins") + return fmt.Errorf("get run image mixins: %w", err) } appImageMixins = removeStagePrefixes(appImageMixins) @@ -123,6 +202,47 @@ func validateMixins(appImg, newBaseImg imgutil.Image) error { return nil } +func (r *Rebaser) validateTarget(appImg imgutil.Image, newBaseImg imgutil.Image) error { + rebasable, err := appImg.Label(platform.RebasableLabel) + if err != nil { + return fmt.Errorf("get app image rebasable label: %w", err) + } + if rebasable == "false" { + if !r.Force { + return fmt.Errorf(msgAppImageNotMarkedRebasable + "; " + msgProvideForceToOverride) + } + r.Logger.Warn(msgAppImageNotMarkedRebasable) + } + + // check the OS, architecture, and variant values + // if they are not the same, the image cannot be rebased unless the force flag is set + appTarget, err := platform.GetTargetMetadata(appImg) + if err != nil { + return fmt.Errorf("get app image target: %w", err) + } + + newBaseTarget, err := platform.GetTargetMetadata(newBaseImg) + if err != nil { + return fmt.Errorf("get new base image target: %w", err) + } + + if !platform.TargetSatisfiedForRebase(*newBaseTarget, *appTarget) { + if !r.Force { + return fmt.Errorf( + msgUnableToSatisfyTargetConstraints+"; "+msgProvideForceToOverride, + encoding.ToJSONMaybe(newBaseTarget), + encoding.ToJSONMaybe(appTarget), + ) + } + r.Logger.Warnf( + msgUnableToSatisfyTargetConstraints, + encoding.ToJSONMaybe(newBaseTarget), + encoding.ToJSONMaybe(appTarget), + ) + } + return nil +} + func (r *Rebaser) supportsManifestSize() bool { return r.PlatformAPI.AtLeast("0.6") } diff --git a/vendor/github.com/buildpacks/lifecycle/restorer.go b/vendor/github.com/buildpacks/lifecycle/restorer.go index 3e567a222f..38f74928b5 100644 --- a/vendor/github.com/buildpacks/lifecycle/restorer.go +++ b/vendor/github.com/buildpacks/lifecycle/restorer.go @@ -11,7 +11,7 @@ import ( "github.com/buildpacks/lifecycle/internal/layer" "github.com/buildpacks/lifecycle/layers" "github.com/buildpacks/lifecycle/log" - "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) type Restorer struct { @@ -19,8 +19,8 @@ type Restorer struct { Logger log.Logger Buildpacks []buildpack.GroupElement - LayerMetadataRestorer layer.MetadataRestorer // Platform API >= 0.7 - LayersMetadata platform.LayersMetadata // Platform API >= 0.7 + LayerMetadataRestorer layer.MetadataRestorer // Platform API >= 0.7 + LayersMetadata files.LayersMetadata // Platform API >= 0.7 PlatformAPI *api.Version SBOMRestorer layer.SBOMRestorer } diff --git a/vendor/github.com/buildpacks/lifecycle/save.go b/vendor/github.com/buildpacks/lifecycle/save.go index f9685edf3b..8a5f4cd899 100644 --- a/vendor/github.com/buildpacks/lifecycle/save.go +++ b/vendor/github.com/buildpacks/lifecycle/save.go @@ -9,30 +9,30 @@ import ( "github.com/pkg/errors" "github.com/buildpacks/lifecycle/log" - "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" ) -func saveImage(image imgutil.Image, additionalNames []string, logger log.Logger) (platform.ImageReport, error) { +func saveImage(image imgutil.Image, additionalNames []string, logger log.Logger) (files.ImageReport, error) { return saveImageAs(image, image.Name(), additionalNames, logger) } -func saveImageAs(image imgutil.Image, name string, additionalNames []string, logger log.Logger) (platform.ImageReport, error) { +func saveImageAs(image imgutil.Image, name string, additionalNames []string, logger log.Logger) (files.ImageReport, error) { var saveErr error - imageReport := platform.ImageReport{} + imageReport := files.ImageReport{} logger.Infof("Saving %s...\n", name) if err := image.SaveAs(name, additionalNames...); err != nil { var ok bool if saveErr, ok = err.(imgutil.SaveError); !ok { - return platform.ImageReport{}, errors.Wrap(err, "saving image") + return files.ImageReport{}, errors.Wrap(err, "saving image") } } id, idErr := image.Identifier() if idErr != nil { if saveErr != nil { - return platform.ImageReport{}, &MultiError{Errors: []error{idErr, saveErr}} + return files.ImageReport{}, &MultiError{Errors: []error{idErr, saveErr}} } - return platform.ImageReport{}, idErr + return files.ImageReport{}, idErr } logger.Infof("*** Images (%s):\n", shortID(id)) diff --git a/vendor/github.com/buildpacks/pack/Makefile b/vendor/github.com/buildpacks/pack/Makefile index 1fd98d781c..a7e17a5bed 100644 --- a/vendor/github.com/buildpacks/pack/Makefile +++ b/vendor/github.com/buildpacks/pack/Makefile @@ -33,10 +33,11 @@ TEST_TIMEOUT?=1200s UNIT_TIMEOUT?=$(TEST_TIMEOUT) NO_DOCKER?= +# Clean build flags clean_build := $(strip ${PACK_BUILD}) clean_sha := $(strip ${PACK_GITSHA1}) -# append build number and git sha to version, if not-empty +# Append build number and git sha to version, if not-empty ifneq ($(and $(clean_build),$(clean_sha)),) PACK_VERSION:=${PACK_VERSION}+git-${clean_sha}.build-${clean_build} else ifneq ($(clean_build),) @@ -50,53 +51,43 @@ export CGO_ENABLED=0 BINDIR:=/usr/bin/ +.DEFAULT_GOAL := build + # this target must be listed first in order for it to be a default target, # so that ubuntu_ppa's may be constructed using default build tools. +## build: Build the program build: out - @echo "> Building..." + @echo "=====> Building..." $(GOCMD) build -ldflags "-s -w -X 'github.com/buildpacks/pack.Version=${PACK_VERSION}' -extldflags ${LDFLAGS}" -trimpath -o ./out/$(PACK_BIN) -a ./cmd/pack +## all: Run clean, verify, test, and build operations all: clean verify test build -# used by apt-get install when installing ubuntu ppa. -# move pack binary onto a path location. -install: - mkdir -p ${DESTDIR}${BINDIR} - cp ./out/$(PACK_BIN) ${DESTDIR}${BINDIR}/ - -mod-tidy: - $(GOCMD) mod tidy -compat=1.19 - cd tools && $(GOCMD) mod tidy -compat=1.19 - -tidy: mod-tidy format - -package: out - tar czf .$/out$/$(ARCHIVE_NAME).tgz -C .$/out$/ $(PACK_BIN) - -install-mockgen: - @echo "> Installing mockgen..." - cd tools && $(GOCMD) install github.com/golang/mock/mockgen - -install-goimports: - @echo "> Installing goimports..." - cd tools && $(GOCMD) install golang.org/x/tools/cmd/goimports +## clean: Clean the workspace +clean: + @echo "=====> Cleaning workspace..." + @$(RMRF) .$/out benchmarks.test || (exit 0) +## format: Format the code format: install-goimports - @echo "> Formating code..." + @echo "=====> Formatting code..." @goimports -l -w -local ${PACKAGE_BASE} ${SRC} @go run tools/pedantic_imports/main.go ${PACKAGE_BASE} ${SRC} -install-golangci-lint: - @echo "> Installing golangci-lint..." - cd tools && $(GOCMD) install github.com/golangci/golangci-lint/cmd/golangci-lint +## generate: Generate mocks +generate: install-mockgen + @echo "=====> Generating mocks..." + $(GOCMD) generate ./... +## lint: Check the code lint: install-golangci-lint - @echo "> Linting code..." + @echo "=====> Linting code..." @golangci-lint run -c golangci.yaml +## test: Run unit and acceptance tests test: unit acceptance -# append coverage arguments +## unit: Append coverage arguments ifeq ($(TEST_COVERAGE), 1) unit: GOTESTFLAGS:=$(GOTESTFLAGS) -coverprofile=./out/tests/coverage-unit.txt -covermode=atomic endif @@ -107,29 +98,18 @@ unit: out @echo "> Running unit/integration tests..." $(GOCMD) test $(GOTESTFLAGS) -timeout=$(UNIT_TIMEOUT) ./... +## acceptance: Run acceptance tests acceptance: out - @echo "> Running acceptance tests..." + @echo "=====> Running acceptance tests..." $(GOCMD) test $(GOTESTFLAGS) -timeout=$(ACCEPTANCE_TIMEOUT) -tags=acceptance ./acceptance +## acceptance-all: Run all acceptance tests acceptance-all: export ACCEPTANCE_SUITE_CONFIG:=$(shell $(CAT) .$/acceptance$/testconfig$/all.json) acceptance-all: - @echo "> Running acceptance tests..." + @echo "=====> Running acceptance tests..." $(GOCMD) test $(GOTESTFLAGS) -timeout=$(ACCEPTANCE_TIMEOUT) -tags=acceptance ./acceptance -clean: - @echo "> Cleaning workspace..." - @$(RMRF) .$/out benchmarks.test || (exit 0) - -verify: verify-format lint - -generate: install-mockgen - @echo "> Generating mocks..." - $(GOCMD) generate ./... - -verify-format: install-goimports - @echo "> Verifying format..." - $(if $(shell goimports -l -local ${PACKAGE_BASE} ${SRC}), @echo ERROR: Format verification failed! && goimports ${GOIMPORTS_DIFF_OPTION} -local ${PACKAGE_BASE} ${SRC} && exit 1) - +## prepare-for-pr: Run clean, verify, and test operations and check for uncommitted changes prepare-for-pr: tidy verify test @git diff-index --quiet HEAD -- ||\ (echo "-----------------" &&\ @@ -141,18 +121,71 @@ prepare-for-pr: tidy verify test echo "-----------------\n" &&\ exit 0) +## verify: Run format and lint checks +verify: verify-format lint + +## verify-format: Verify the format +verify-format: install-goimports + @echo "=====> Verifying format..." + $(if $(shell goimports -l -local ${PACKAGE_BASE} ${SRC}), @echo ERROR: Format verification failed! && goimports ${GOIMPORTS_DIFF_OPTION} -local ${PACKAGE_BASE} ${SRC} && exit 1) + +## benchmark: Run benchmark tests benchmark: out - @echo "> Running Benchmarks" + @echo "=====> Running benchmarks" $(GOCMD) test -run=^$ -bench=. -benchtime=1s -benchmem -memprofile=./out/bench_mem.out -cpuprofile=./out/bench_cpu.out -tags=benchmarks ./benchmarks/ -v # NOTE: You can analyze the results, using go tool pprof. For instance, you can start a server to see a graph of the cpu usage by running # go tool pprof -http=":8082" out/bench_cpu.out. Alternatively, you can run go tool pprof, and in the ensuing cli, run # commands like top10 or web to dig down into the cpu and memory usage # For more, see https://blog.golang.org/pprof +## package: Package the program +package: out + tar czf .$/out$/$(ARCHIVE_NAME).tgz -C .$/out$/ $(PACK_BIN) + +## install: Install the program to the system +install: + mkdir -p ${DESTDIR}${BINDIR} + cp ./out/$(PACK_BIN) ${DESTDIR}${BINDIR}/ + +## install-mockgen: Used only by apt-get install when installing ubuntu ppa +install-mockgen: + @echo "=====> Installing mockgen..." + cd tools && $(GOCMD) install github.com/golang/mock/mockgen + +## install-goimports: Install goimports dependency +install-goimports: + @echo "=====> Installing goimports..." + cd tools && $(GOCMD) install golang.org/x/tools/cmd/goimports + +## install-golangci-lint: Install golangci-lint dependency +install-golangci-lint: + @echo "=====> Installing golangci-lint..." + cd tools && $(GOCMD) install github.com/golangci/golangci-lint/cmd/golangci-lint + +## mod-tidy: Tidy Go modules +mod-tidy: + $(GOCMD) mod tidy -compat=1.20 + cd tools && $(GOCMD) mod tidy -compat=1.20 + +## tidy: Tidy modules and format the code +tidy: mod-tidy format + # NOTE: Windows doesn't support `-p` +## out: Make a directory for output out: @mkdir out || (exit 0) mkdir out$/tests || (exit 0) - -.PHONY: clean build format imports lint test unit acceptance prepare-for-pr verify verify-format benchmark +## help: Display help information +help: Makefile + @echo "" + @echo "Usage:" + @echo "" + @echo " make [target]" + @echo "" + @echo "Targets:" + @echo "" + @awk -F ':|##' '/^[^\.%\t][^\t]*:.*##/{printf " \033[36m%-20s\033[0m %s\n", $$1, $$NF}' $(MAKEFILE_LIST) | sort + @sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' | sed -e 's/^/ /' + +.PHONY: clean build format imports lint test unit acceptance prepare-for-pr verify verify-format benchmark diff --git a/vendor/github.com/buildpacks/pack/builder/config_reader.go b/vendor/github.com/buildpacks/pack/builder/config_reader.go index 921d3dd292..d719c5df8c 100644 --- a/vendor/github.com/buildpacks/pack/builder/config_reader.go +++ b/vendor/github.com/buildpacks/pack/builder/config_reader.go @@ -22,6 +22,8 @@ type Config struct { OrderExtensions dist.Order `toml:"order-extensions"` Stack StackConfig `toml:"stack"` Lifecycle LifecycleConfig `toml:"lifecycle"` + Run RunConfig `toml:"run"` + Build BuildConfig `toml:"build"` } // ModuleCollection is a list of ModuleConfigs @@ -55,6 +57,22 @@ type LifecycleConfig struct { Version string `toml:"version"` } +// RunConfig set of run image configuration +type RunConfig struct { + Images []RunImageConfig `toml:"images"` +} + +// RunImageConfig run image id and mirrors +type RunImageConfig struct { + Image string `toml:"image"` + Mirrors []string `toml:"mirrors,omitempty"` +} + +// BuildConfig build image configuration +type BuildConfig struct { + Image string `toml:"image"` +} + // ReadConfig reads a builder configuration from the file path provided and returns the // configuration along with any warnings encountered while parsing func ReadConfig(path string) (config Config, warnings []string, err error) { @@ -73,26 +91,57 @@ func ReadConfig(path string) (config Config, warnings []string, err error) { warnings = append(warnings, fmt.Sprintf("empty %s definition", style.Symbol("order"))) } + config.mergeStackWithImages() + return config, warnings, nil } // ValidateConfig validates the config func ValidateConfig(c Config) error { - if c.Stack.ID == "" { - return errors.New("stack.id is required") + if c.Build.Image == "" && c.Stack.BuildImage == "" { + return errors.New("build.image is required") + } else if c.Build.Image != "" && c.Stack.BuildImage != "" && c.Build.Image != c.Stack.BuildImage { + return errors.New("build.image and stack.build-image do not match") } - if c.Stack.BuildImage == "" { - return errors.New("stack.build-image is required") + if len(c.Run.Images) == 0 && (c.Stack.RunImage == "" || c.Stack.ID == "") { + return errors.New("run.images are required") } - if c.Stack.RunImage == "" { - return errors.New("stack.run-image is required") + for _, runImage := range c.Run.Images { + if runImage.Image == "" { + return errors.New("run.images.image is required") + } + } + + if c.Stack.RunImage != "" && c.Run.Images[0].Image != c.Stack.RunImage { + return errors.New("run.images and stack.run-image do not match") } return nil } +func (c *Config) mergeStackWithImages() { + // RFC-0096 + if c.Build.Image != "" { + c.Stack.BuildImage = c.Build.Image + } else if c.Build.Image == "" && c.Stack.BuildImage != "" { + c.Build.Image = c.Stack.BuildImage + } + + if len(c.Run.Images) != 0 { + // use the first run image as the "stack" + c.Stack.RunImage = c.Run.Images[0].Image + c.Stack.RunImageMirrors = c.Run.Images[0].Mirrors + } else if len(c.Run.Images) == 0 && c.Stack.RunImage != "" { + c.Run.Images = []RunImageConfig{{ + Image: c.Stack.RunImage, + Mirrors: c.Stack.RunImageMirrors, + }, + } + } +} + // parseConfig reads a builder configuration from file func parseConfig(file *os.File) (Config, error) { builderConfig := Config{} diff --git a/vendor/github.com/buildpacks/pack/buildpackage/config_reader.go b/vendor/github.com/buildpacks/pack/buildpackage/config_reader.go index 8dbbafa276..d8b8d7d436 100644 --- a/vendor/github.com/buildpacks/pack/buildpackage/config_reader.go +++ b/vendor/github.com/buildpacks/pack/buildpackage/config_reader.go @@ -17,6 +17,7 @@ const defaultOS = "linux" // Config encapsulates the possible configuration options for buildpackage creation. type Config struct { Buildpack dist.BuildpackURI `toml:"buildpack"` + Extension dist.BuildpackURI `toml:"extension"` Dependencies []dist.ImageOrURI `toml:"dependencies"` Platform dist.Platform `toml:"platform"` } @@ -32,6 +33,17 @@ func DefaultConfig() Config { } } +func DefaultExtensionConfig() Config { + return Config{ + Extension: dist.BuildpackURI{ + URI: ".", + }, + Platform: dist.Platform{ + OS: defaultOS, + }, + } +} + // NewConfigReader returns an instance of ConfigReader. It does not take any parameters. func NewConfigReader() *ConfigReader { return &ConfigReader{} @@ -61,8 +73,11 @@ func (r *ConfigReader) Read(path string) (Config, error) { ) } - if packageConfig.Buildpack.URI == "" { - return packageConfig, errors.Errorf("missing %s configuration", style.Symbol("buildpack.uri")) + if packageConfig.Buildpack.URI == "" && packageConfig.Extension.URI == "" { + if packageConfig.Buildpack.URI == "" { + return packageConfig, errors.Errorf("missing %s configuration", style.Symbol("buildpack.uri")) + } + return packageConfig, errors.Errorf("missing %s configuration", style.Symbol("extension.uri")) } if packageConfig.Platform.OS == "" { diff --git a/vendor/github.com/buildpacks/pack/golangci.yaml b/vendor/github.com/buildpacks/pack/golangci.yaml index 2f20383933..0cb937e9ee 100644 --- a/vendor/github.com/buildpacks/pack/golangci.yaml +++ b/vendor/github.com/buildpacks/pack/golangci.yaml @@ -6,7 +6,6 @@ linters: enable: - bodyclose - exportloopref - - deadcode - dogsled - gocritic - goimports @@ -18,12 +17,10 @@ linters: - revive - rowserrcheck - staticcheck - - structcheck - stylecheck - typecheck - unconvert - unused - - varcheck - whitespace linters-settings: diff --git a/vendor/github.com/buildpacks/pack/internal/build/container_ops.go b/vendor/github.com/buildpacks/pack/internal/build/container_ops.go index 6bf5ffbb10..bab2efd328 100644 --- a/vendor/github.com/buildpacks/pack/internal/build/container_ops.go +++ b/vendor/github.com/buildpacks/pack/internal/build/container_ops.go @@ -9,9 +9,10 @@ import ( "runtime" "github.com/BurntSushi/toml" - "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" "github.com/docker/docker/api/types" dcontainer "github.com/docker/docker/api/types/container" + "github.com/docker/docker/errdefs" darchive "github.com/docker/docker/pkg/archive" "github.com/pkg/errors" @@ -42,6 +43,30 @@ func CopyOut(handler func(closer io.ReadCloser) error, srcs ...string) Container } } +// CopyOutMaybe copies container directories to a handler function. The handler is responsible for closing the Reader. +// CopyOutMaybe differs from CopyOut in that it will silently continue to the next source file if the file reader cannot be instantiated +// because the source file does not exist in the container. +func CopyOutMaybe(handler func(closer io.ReadCloser) error, srcs ...string) ContainerOperation { + return func(ctrClient DockerClient, ctx context.Context, containerID string, stdout, stderr io.Writer) error { + for _, src := range srcs { + reader, _, err := ctrClient.CopyFromContainer(ctx, containerID, src) + if err != nil { + if errdefs.IsNotFound(err) { + continue + } + return err + } + + err = handler(reader) + if err != nil { + return err + } + } + + return nil + } +} + func CopyOutTo(src, dest string) ContainerOperation { return CopyOut(func(reader io.ReadCloser) error { info := darchive.CopyInfo{ @@ -54,6 +79,18 @@ func CopyOutTo(src, dest string) ContainerOperation { }, src) } +func CopyOutToMaybe(src, dest string) ContainerOperation { + return CopyOutMaybe(func(reader io.ReadCloser) error { + info := darchive.CopyInfo{ + Path: src, + IsDir: true, + } + + defer reader.Close() + return darchive.CopyTo(reader, info, dest) + }, src) +} + // CopyDir copies a local directory (src) to the destination on the container while filtering files and changing it's UID/GID. // if includeRoot is set the UID/GID will be set on the dst directory. func CopyDir(src, dst string, uid, gid int, os string, includeRoot bool, fileFilter func(string) bool) ContainerOperation { @@ -170,61 +207,53 @@ func findMount(info types.ContainerJSON, dst string) (types.MountPoint, error) { return types.MountPoint{}, fmt.Errorf("no matching mount found for %s", dst) } -// WriteProjectMetadata -func WriteProjectMetadata(p string, metadata platform.ProjectMetadata, os string) ContainerOperation { - return func(ctrClient DockerClient, ctx context.Context, containerID string, stdout, stderr io.Writer) error { - buf := &bytes.Buffer{} - err := toml.NewEncoder(buf).Encode(metadata) - if err != nil { - return errors.Wrap(err, "marshaling project metadata") - } +func writeToml(ctrClient DockerClient, ctx context.Context, data interface{}, dstPath string, containerID string, os string, stdout, stderr io.Writer) error { + buf := &bytes.Buffer{} + err := toml.NewEncoder(buf).Encode(data) + if err != nil { + return errors.Wrapf(err, "marshaling data to %s", dstPath) + } - tarBuilder := archive.TarBuilder{} + tarBuilder := archive.TarBuilder{} - tarPath := p - if os == "windows" { - tarPath = paths.WindowsToSlash(p) - } + tarPath := dstPath + if os == "windows" { + tarPath = paths.WindowsToSlash(dstPath) + } - tarBuilder.AddFile(tarPath, 0755, archive.NormalizedDateTime, buf.Bytes()) - reader := tarBuilder.Reader(archive.DefaultTarWriterFactory()) - defer reader.Close() + tarBuilder.AddFile(tarPath, 0755, archive.NormalizedDateTime, buf.Bytes()) + reader := tarBuilder.Reader(archive.DefaultTarWriterFactory()) + defer reader.Close() - if os == "windows" { - dirName := paths.WindowsDir(p) - return copyDirWindows(ctx, ctrClient, containerID, reader, dirName, stdout, stderr) - } + if os == "windows" { + dirName := paths.WindowsDir(dstPath) + return copyDirWindows(ctx, ctrClient, containerID, reader, dirName, stdout, stderr) + } - return ctrClient.CopyToContainer(ctx, containerID, "/", reader, types.CopyToContainerOptions{}) + return ctrClient.CopyToContainer(ctx, containerID, "/", reader, types.CopyToContainerOptions{}) +} + +// WriteProjectMetadata writes a `project-metadata.toml` based on the ProjectMetadata provided to the destination path. +func WriteProjectMetadata(dstPath string, metadata files.ProjectMetadata, os string) ContainerOperation { + return func(ctrClient DockerClient, ctx context.Context, containerID string, stdout, stderr io.Writer) error { + return writeToml(ctrClient, ctx, metadata, dstPath, containerID, os, stdout, stderr) } } // WriteStackToml writes a `stack.toml` based on the StackMetadata provided to the destination path. func WriteStackToml(dstPath string, stack builder.StackMetadata, os string) ContainerOperation { return func(ctrClient DockerClient, ctx context.Context, containerID string, stdout, stderr io.Writer) error { - buf := &bytes.Buffer{} - err := toml.NewEncoder(buf).Encode(stack) - if err != nil { - return errors.Wrap(err, "marshaling stack metadata") - } - - tarBuilder := archive.TarBuilder{} - - tarPath := dstPath - if os == "windows" { - tarPath = paths.WindowsToSlash(dstPath) - } - - tarBuilder.AddFile(tarPath, 0755, archive.NormalizedDateTime, buf.Bytes()) - reader := tarBuilder.Reader(archive.DefaultTarWriterFactory()) - defer reader.Close() - - if os == "windows" { - dirName := paths.WindowsDir(dstPath) - return copyDirWindows(ctx, ctrClient, containerID, reader, dirName, stdout, stderr) - } + return writeToml(ctrClient, ctx, stack, dstPath, containerID, os, stdout, stderr) + } +} - return ctrClient.CopyToContainer(ctx, containerID, "/", reader, types.CopyToContainerOptions{}) +// WriteRunToml writes a `run.toml` based on the RunConfig provided to the destination path. +func WriteRunToml(dstPath string, runImages []builder.RunImageMetadata, os string) ContainerOperation { + runImageData := builder.RunImages{ + Images: runImages, + } + return func(ctrClient DockerClient, ctx context.Context, containerID string, stdout, stderr io.Writer) error { + return writeToml(ctrClient, ctx, runImageData, dstPath, containerID, os, stdout, stderr) } } diff --git a/vendor/github.com/buildpacks/pack/internal/build/docker.go b/vendor/github.com/buildpacks/pack/internal/build/docker.go index 67378cb3d8..58a53f343d 100644 --- a/vendor/github.com/buildpacks/pack/internal/build/docker.go +++ b/vendor/github.com/buildpacks/pack/internal/build/docker.go @@ -13,10 +13,10 @@ import ( type DockerClient interface { ImageRemove(ctx context.Context, image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) VolumeRemove(ctx context.Context, volumeID string, force bool) error - ContainerWait(ctx context.Context, container string, condition containertypes.WaitCondition) (<-chan containertypes.ContainerWaitOKBody, <-chan error) + ContainerWait(ctx context.Context, container string, condition containertypes.WaitCondition) (<-chan containertypes.WaitResponse, <-chan error) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error - ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, platform *specs.Platform, containerName string) (containertypes.ContainerCreateCreatedBody, error) + ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, platform *specs.Platform, containerName string) (containertypes.CreateResponse, error) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error) ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error diff --git a/vendor/github.com/buildpacks/pack/internal/build/lifecycle_execution.go b/vendor/github.com/buildpacks/pack/internal/build/lifecycle_execution.go index 34711ea179..812b079b45 100644 --- a/vendor/github.com/buildpacks/pack/internal/build/lifecycle_execution.go +++ b/vendor/github.com/buildpacks/pack/internal/build/lifecycle_execution.go @@ -4,19 +4,23 @@ import ( "context" "fmt" "math/rand" + "os" "path/filepath" "strconv" + "github.com/BurntSushi/toml" "github.com/buildpacks/lifecycle/api" "github.com/buildpacks/lifecycle/auth" + "github.com/buildpacks/lifecycle/platform/files" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" "github.com/pkg/errors" + "golang.org/x/sync/errgroup" "github.com/buildpacks/pack/internal/builder" - "github.com/buildpacks/pack/internal/cache" "github.com/buildpacks/pack/internal/paths" "github.com/buildpacks/pack/internal/style" + "github.com/buildpacks/pack/pkg/cache" "github.com/buildpacks/pack/pkg/logging" ) @@ -35,9 +39,10 @@ type LifecycleExecution struct { os string mountPaths mountPaths opts LifecycleOptions + tmpDir string } -func NewLifecycleExecution(logger logging.Logger, docker DockerClient, opts LifecycleOptions) (*LifecycleExecution, error) { +func NewLifecycleExecution(logger logging.Logger, docker DockerClient, tmpDir string, opts LifecycleOptions) (*LifecycleExecution, error) { latestSupportedPlatformAPI, err := FindLatestSupported(append( opts.Builder.LifecycleDescriptor().APIs.Platform.Deprecated, opts.Builder.LifecycleDescriptor().APIs.Platform.Supported..., @@ -60,6 +65,7 @@ func NewLifecycleExecution(logger logging.Logger, docker DockerClient, opts Life opts: opts, os: osType, mountPaths: mountPathsForOS(osType, opts.Workspace), + tmpDir: tmpDir, } if opts.Interactive { @@ -87,7 +93,7 @@ func apiIntersection(apisA, apisB []*api.Version) []*api.Version { return apis } -// public for unit test purposes but cmon you probably don't want to actually call this. +// FindLatestSupported finds the latest Platform API version supported by both the builder and the lifecycle. func FindLatestSupported(builderapis []*api.Version, lifecycleapis []string) (*api.Version, error) { var apis []*api.Version // if a custom lifecycle image was used we need to take an intersection of its supported apis with the builder's supported apis. @@ -213,30 +219,67 @@ func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseF } } + var kanikoCache Cache + if l.PlatformAPI().AtLeast("0.12") { + // lifecycle 0.17.0 (introduces support for Platform API 0.12) and above will ensure that + // this volume is owned by the CNB user, + // and hence the restorer (after dropping privileges) will be able to write to it. + kanikoCache = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Kaniko, "kaniko", l.docker) + } else { + switch { + case buildCache.Type() == cache.Volume: + // Re-use the build cache as the kaniko cache. Earlier versions of the lifecycle (0.16.x and below) + // already ensure this volume is owned by the CNB user. + kanikoCache = buildCache + case l.hasExtensionsForBuild(): + // We need a usable kaniko cache, so error in this case. + return fmt.Errorf("build cache must be volume cache when building with extensions") + default: + // The kaniko cache is unused, so it doesn't matter that it's not usable. + kanikoCache = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Kaniko, "kaniko", l.docker) + } + } + l.logger.Info(style.Step("RESTORING")) if l.opts.ClearCache && l.PlatformAPI().LessThan("0.10") { l.logger.Info("Skipping 'restore' due to clearing cache") - } else if err := l.Restore(ctx, buildCache, phaseFactory); err != nil { + } else if err := l.Restore(ctx, buildCache, kanikoCache, phaseFactory); err != nil { return err } - if l.platformAPI.AtLeast("0.10") && l.hasExtensions() { - if l.os == "windows" { - return fmt.Errorf("builder has an order for extensions which is not supported for Windows builds") - } - l.logger.Info(style.Step("EXTENDING")) - if err := l.Extend(ctx, buildCache, phaseFactory); err != nil { - return err - } + group, _ := errgroup.WithContext(context.TODO()) + if l.platformAPI.AtLeast("0.10") && l.hasExtensionsForBuild() { + group.Go(func() error { + l.logger.Info(style.Step("EXTENDING (BUILD)")) + return l.ExtendBuild(ctx, kanikoCache, phaseFactory) + }) } else { - l.logger.Info(style.Step("BUILDING")) - if err := l.Build(ctx, phaseFactory); err != nil { + group.Go(func() error { + l.logger.Info(style.Step("BUILDING")) + return l.Build(ctx, phaseFactory) + }) + } + + currentRunImage := l.runImageAfterExtensions() + if currentRunImage != "" && currentRunImage != l.opts.RunImage { + if err := l.opts.FetchRunImage(currentRunImage); err != nil { return err } } + if l.platformAPI.AtLeast("0.12") && l.hasExtensionsForRun() { + group.Go(func() error { + l.logger.Info(style.Step("EXTENDING (RUN)")) + return l.ExtendRun(ctx, kanikoCache, phaseFactory) + }) + } + + if err := group.Wait(); err != nil { + return err + } + l.logger.Info(style.Step("EXPORTING")) - return l.Export(ctx, buildCache, launchCache, phaseFactory) + return l.Export(ctx, buildCache, launchCache, kanikoCache, phaseFactory) } if l.platformAPI.AtLeast("0.10") && l.hasExtensions() { @@ -253,6 +296,9 @@ func (l *LifecycleExecution) Cleanup() error { if err := l.docker.VolumeRemove(context.Background(), l.appVolume, true); err != nil { reterr = errors.Wrapf(err, "failed to clean up app volume %s", l.appVolume) } + if err := os.RemoveAll(l.tmpDir); err != nil { + reterr = errors.Wrapf(err, "failed to clean up working directory %s", l.tmpDir) + } return reterr } @@ -366,7 +412,7 @@ func (l *LifecycleExecution) Detect(ctx context.Context, phaseFactory PhaseFacto flags := []string{"-app", l.mountPaths.appDir()} envOp := NullOp() - if l.hasExtensions() && l.platformAPI.AtLeast("0.10") { + if l.platformAPI.AtLeast("0.10") && l.hasExtensions() { envOp = WithEnv("CNB_EXPERIMENTAL_MODE=warn") } @@ -384,6 +430,10 @@ func (l *LifecycleExecution) Detect(ctx context.Context, phaseFactory PhaseFacto CopyDir(l.opts.AppPath, l.mountPaths.appDir(), l.opts.Builder.UID(), l.opts.Builder.GID(), l.os, true, l.opts.FileFilter), ), WithFlags(flags...), + If(l.hasExtensions(), WithPostContainerRunOperations( + CopyOutToMaybe(filepath.Join(l.mountPaths.layersDir(), "analyzed.toml"), l.tmpDir))), + If(l.hasExtensions(), WithPostContainerRunOperations( + CopyOutToMaybe(filepath.Join(l.mountPaths.layersDir(), "generated", "build"), l.tmpDir))), envOp, ) @@ -392,7 +442,7 @@ func (l *LifecycleExecution) Detect(ctx context.Context, phaseFactory PhaseFacto return detect.Run(ctx) } -func (l *LifecycleExecution) Restore(ctx context.Context, buildCache Cache, phaseFactory PhaseFactory) error { +func (l *LifecycleExecution) Restore(ctx context.Context, buildCache Cache, kanikoCache Cache, phaseFactory PhaseFactory) error { // build up flags and ops var flags []string if l.opts.ClearCache { @@ -418,15 +468,17 @@ func (l *LifecycleExecution) Restore(ctx context.Context, buildCache Cache, phas // for kaniko kanikoCacheBindOp := NullOp() - if l.platformAPI.AtLeast("0.10") && l.hasExtensions() { - flags = append(flags, "-build-image", l.opts.BuilderImage) - registryImages = append(registryImages, l.opts.BuilderImage) - - switch buildCache.Type() { - case cache.Volume: - kanikoCacheBindOp = WithBinds(fmt.Sprintf("%s:%s", buildCache.Name(), l.mountPaths.kanikoCacheDir())) - default: - return fmt.Errorf("build cache must be volume cache when building with extensions") + if (l.platformAPI.AtLeast("0.10") && l.hasExtensionsForBuild()) || + l.platformAPI.AtLeast("0.12") { + if l.hasExtensionsForBuild() { + flags = append(flags, "-build-image", l.opts.BuilderImage) + registryImages = append(registryImages, l.opts.BuilderImage) + } + if l.runImageChanged() || l.hasExtensionsForRun() { + registryImages = append(registryImages, l.runImageAfterExtensions()) + } + if l.hasExtensionsForBuild() || l.hasExtensionsForRun() { + kanikoCacheBindOp = WithBinds(fmt.Sprintf("%s:%s", kanikoCache.Name(), l.mountPaths.kanikoCacheDir())) } } @@ -453,6 +505,8 @@ func (l *LifecycleExecution) Restore(ctx context.Context, buildCache Cache, phas l.withLogLevel()..., ), WithNetwork(l.opts.Network), + If(l.hasExtensionsForRun(), WithPostContainerRunOperations( + CopyOutToMaybe(l.mountPaths.cnbDir(), l.tmpDir))), // FIXME: this is hacky; we should get the lifecycle binaries from the lifecycle image flagsOp, cacheBindOp, registryOp, @@ -527,6 +581,7 @@ func (l *LifecycleExecution) Analyze(ctx context.Context, buildCache, launchCach } stackOp := NullOp() + runOp := NullOp() if !platformAPILessThan07 { for _, tag := range l.opts.AdditionalTags { args = append([]string{"-tag", tag}, args...) @@ -534,8 +589,13 @@ func (l *LifecycleExecution) Analyze(ctx context.Context, buildCache, launchCach if l.opts.RunImage != "" { args = append([]string{"-run-image", l.opts.RunImage}, args...) } - args = append([]string{"-stack", l.mountPaths.stackPath()}, args...) - stackOp = WithContainerOperations(WriteStackToml(l.mountPaths.stackPath(), l.opts.Builder.Stack(), l.os)) + if l.platformAPI.LessThan("0.12") { + args = append([]string{"-stack", l.mountPaths.stackPath()}, args...) + stackOp = WithContainerOperations(WriteStackToml(l.mountPaths.stackPath(), l.opts.Builder.Stack(), l.os)) + } else { + args = append([]string{"-run", l.mountPaths.runPath()}, args...) + runOp = WithContainerOperations(WriteRunToml(l.mountPaths.runPath(), l.opts.Builder.RunImages(), l.os)) + } } flagsOp := WithFlags(flags...) @@ -560,6 +620,7 @@ func (l *LifecycleExecution) Analyze(ctx context.Context, buildCache, launchCach flagsOp, cacheBindOp, stackOp, + runOp, ) analyze = phaseFactory.New(configProvider) @@ -581,6 +642,7 @@ func (l *LifecycleExecution) Analyze(ctx context.Context, buildCache, launchCach WithNetwork(l.opts.Network), cacheBindOp, stackOp, + runOp, ) analyze = phaseFactory.New(configProvider) @@ -607,29 +669,43 @@ func (l *LifecycleExecution) Build(ctx context.Context, phaseFactory PhaseFactor return build.Run(ctx) } -func (l *LifecycleExecution) Extend(ctx context.Context, buildCache Cache, phaseFactory PhaseFactory) error { +func (l *LifecycleExecution) ExtendBuild(ctx context.Context, kanikoCache Cache, phaseFactory PhaseFactory) error { flags := []string{"-app", l.mountPaths.appDir()} - // set kaniko cache opt - var kanikoCacheBindOp PhaseConfigProviderOperation - switch buildCache.Type() { - case cache.Volume: - kanikoCacheBindOp = WithBinds(fmt.Sprintf("%s:%s", buildCache.Name(), l.mountPaths.kanikoCacheDir())) - default: - return fmt.Errorf("build cache must be volume cache when building with extensions") - } + configProvider := NewPhaseConfigProvider( + "extender", + l, + WithLogPrefix("extender (build)"), + WithArgs(l.withLogLevel()...), + WithBinds(l.opts.Volumes...), + WithEnv("CNB_EXPERIMENTAL_MODE=warn"), + WithFlags(flags...), + WithNetwork(l.opts.Network), + WithRoot(), + WithBinds(fmt.Sprintf("%s:%s", kanikoCache.Name(), l.mountPaths.kanikoCacheDir())), + ) + + extend := phaseFactory.New(configProvider) + defer extend.Cleanup() + return extend.Run(ctx) +} + +func (l *LifecycleExecution) ExtendRun(ctx context.Context, kanikoCache Cache, phaseFactory PhaseFactory) error { + flags := []string{"-app", l.mountPaths.appDir(), "-kind", "run"} configProvider := NewPhaseConfigProvider( "extender", l, - WithLogPrefix("extender"), + WithLogPrefix("extender (run)"), WithArgs(l.withLogLevel()...), WithBinds(l.opts.Volumes...), WithEnv("CNB_EXPERIMENTAL_MODE=warn"), WithFlags(flags...), WithNetwork(l.opts.Network), WithRoot(), - kanikoCacheBindOp, + WithImage(l.runImageAfterExtensions()), + WithBinds(fmt.Sprintf("%s:%s", filepath.Join(l.tmpDir, "cnb"), l.mountPaths.cnbDir())), + WithBinds(fmt.Sprintf("%s:%s", kanikoCache.Name(), l.mountPaths.kanikoCacheDir())), ) extend := phaseFactory.New(configProvider) @@ -647,17 +723,26 @@ func determineDefaultProcessType(platformAPI *api.Version, providedValue string) return providedValue } -func (l *LifecycleExecution) Export(ctx context.Context, buildCache, launchCache Cache, phaseFactory PhaseFactory) error { +func (l *LifecycleExecution) Export(ctx context.Context, buildCache, launchCache, kanikoCache Cache, phaseFactory PhaseFactory) error { flags := []string{ "-app", l.mountPaths.appDir(), "-cache-dir", l.mountPaths.cacheDir(), - "-stack", l.mountPaths.stackPath(), + } + + expEnv := NullOp() + kanikoCacheBindOp := NullOp() + if l.platformAPI.LessThan("0.12") { + flags = append(flags, "-stack", l.mountPaths.stackPath()) + } else { + flags = append(flags, "-run", l.mountPaths.runPath()) + if l.hasExtensionsForRun() { + expEnv = WithEnv("CNB_EXPERIMENTAL_MODE=warn") + kanikoCacheBindOp = WithBinds(fmt.Sprintf("%s:%s", kanikoCache.Name(), l.mountPaths.kanikoCacheDir())) + } } if l.platformAPI.LessThan("0.7") { - flags = append(flags, - "-run-image", l.opts.RunImage, - ) + flags = append(flags, "-run-image", l.opts.RunImage) } processType := determineDefaultProcessType(l.platformAPI, l.opts.DefaultProcessType) if processType != "" { @@ -675,9 +760,9 @@ func (l *LifecycleExecution) Export(ctx context.Context, buildCache, launchCache cacheBindOp = WithBinds(fmt.Sprintf("%s:%s", buildCache.Name(), l.mountPaths.cacheDir())) } - withEnv := NullOp() + epochEnv := NullOp() if l.opts.CreationTime != nil && l.platformAPI.AtLeast("0.9") { - withEnv = WithEnv(fmt.Sprintf("%s=%s", sourceDateEpochEnv, strconv.Itoa(int(l.opts.CreationTime.Unix())))) + epochEnv = WithEnv(fmt.Sprintf("%s=%s", sourceDateEpochEnv, strconv.Itoa(int(l.opts.CreationTime.Unix())))) } opts := []PhaseConfigProviderOperation{ @@ -694,7 +779,9 @@ func (l *LifecycleExecution) Export(ctx context.Context, buildCache, launchCache WithRoot(), WithNetwork(l.opts.Network), cacheBindOp, + kanikoCacheBindOp, WithContainerOperations(WriteStackToml(l.mountPaths.stackPath(), l.opts.Builder.Stack(), l.os)), + WithContainerOperations(WriteRunToml(l.mountPaths.runPath(), l.opts.Builder.RunImages(), l.os)), WithContainerOperations(WriteProjectMetadata(l.mountPaths.projectPath(), l.opts.ProjectMetadata, l.os)), If(l.opts.SBOMDestinationDir != "", WithPostContainerRunOperations( EnsureVolumeAccess(l.opts.Builder.UID(), l.opts.Builder.GID(), l.os, l.layersVolume, l.appVolume), @@ -705,7 +792,8 @@ func (l *LifecycleExecution) Export(ctx context.Context, buildCache, launchCache If(l.opts.Interactive, WithPostContainerRunOperations( EnsureVolumeAccess(l.opts.Builder.UID(), l.opts.Builder.GID(), l.os, l.layersVolume, l.appVolume), CopyOut(l.opts.Termui.ReadLayers, l.mountPaths.layersDir(), l.mountPaths.appDir()))), - withEnv, + epochEnv, + expEnv, } var export RunnerCleaner @@ -746,6 +834,48 @@ func (l *LifecycleExecution) hasExtensions() bool { return len(l.opts.Builder.OrderExtensions()) > 0 } +func (l *LifecycleExecution) hasExtensionsForBuild() bool { + // the directory is /generated/build inside the build container, but `CopyOutTo` only copies the directory + fis, err := os.ReadDir(filepath.Join(l.tmpDir, "build")) + if err != nil { + return false + } + return len(fis) > 0 +} + +func (l *LifecycleExecution) hasExtensionsForRun() bool { + var amd files.Analyzed + if _, err := toml.DecodeFile(filepath.Join(l.tmpDir, "analyzed.toml"), &amd); err != nil { + l.logger.Warnf("failed to parse analyzed.toml file, assuming no run image extensions: %s", err) + return false + } + if amd.RunImage == nil { + // this shouldn't be reachable + l.logger.Warnf("found no run image in analyzed.toml file, assuming no run image extensions...") + return false + } + return amd.RunImage.Extend +} + +func (l *LifecycleExecution) runImageAfterExtensions() string { + var amd files.Analyzed + if _, err := toml.DecodeFile(filepath.Join(l.tmpDir, "analyzed.toml"), &amd); err != nil { + l.logger.Warnf("failed to parse analyzed.toml file, assuming run image did not change: %s", err) + return l.opts.RunImage + } + if amd.RunImage == nil || amd.RunImage.Image == "" { + // this shouldn't be reachable + l.logger.Warnf("found no run image in analyzed.toml file, assuming run image did not change...") + return l.opts.RunImage + } + return amd.RunImage.Image +} + +func (l *LifecycleExecution) runImageChanged() bool { + currentRunImage := l.runImageAfterExtensions() + return currentRunImage != "" && currentRunImage != l.opts.RunImage +} + func (l *LifecycleExecution) appendLayoutOperations(opts []PhaseConfigProviderOperation) ([]PhaseConfigProviderOperation, error) { layoutDir := filepath.Join(paths.RootDir, "layout-repo") opts = append(opts, WithEnv("CNB_USE_LAYOUT=true", "CNB_LAYOUT_DIR="+layoutDir, "CNB_EXPERIMENTAL_MODE=warn")) diff --git a/vendor/github.com/buildpacks/pack/internal/build/lifecycle_executor.go b/vendor/github.com/buildpacks/pack/internal/build/lifecycle_executor.go index 08e1c9856c..2f7dce5415 100644 --- a/vendor/github.com/buildpacks/pack/internal/build/lifecycle_executor.go +++ b/vendor/github.com/buildpacks/pack/internal/build/lifecycle_executor.go @@ -3,17 +3,17 @@ package build import ( "context" "io" - "math/rand" + "os" "time" "github.com/buildpacks/imgutil" "github.com/buildpacks/lifecycle/api" - "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" "github.com/google/go-containerregistry/pkg/name" "github.com/buildpacks/pack/internal/builder" - "github.com/buildpacks/pack/internal/cache" "github.com/buildpacks/pack/internal/container" + "github.com/buildpacks/pack/pkg/cache" "github.com/buildpacks/pack/pkg/dist" "github.com/buildpacks/pack/pkg/logging" ) @@ -40,6 +40,7 @@ type Builder interface { GID() int LifecycleDescriptor() builder.LifecycleDescriptor Stack() builder.StackMetadata + RunImages() []builder.RunImageMetadata Image() imgutil.Image OrderExtensions() dist.Order } @@ -63,10 +64,6 @@ type Termui interface { ReadLayers(reader io.ReadCloser) error } -func init() { - rand.Seed(time.Now().UTC().UnixNano()) -} - type LifecycleOptions struct { AppPath string Image name.Reference @@ -75,7 +72,8 @@ type LifecycleOptions struct { LifecycleImage string LifecycleApis []string // optional - populated only if custom lifecycle image is downloaded, from that lifecycle's container's Labels. RunImage string - ProjectMetadata platform.ProjectMetadata + FetchRunImage func(name string) error + ProjectMetadata files.ProjectMetadata ClearCache bool Publish bool TrustBuilder bool @@ -107,7 +105,12 @@ func NewLifecycleExecutor(logger logging.Logger, docker DockerClient) *Lifecycle } func (l *LifecycleExecutor) Execute(ctx context.Context, opts LifecycleOptions) error { - lifecycleExec, err := NewLifecycleExecution(l.logger, l.docker, opts) + tmpDir, err := os.MkdirTemp("", "pack.tmp") + if err != nil { + return err + } + + lifecycleExec, err := NewLifecycleExecution(l.logger, l.docker, tmpDir, opts) if err != nil { return err } diff --git a/vendor/github.com/buildpacks/pack/internal/build/mount_paths.go b/vendor/github.com/buildpacks/pack/internal/build/mount_paths.go index 89d266b6fd..525a900033 100644 --- a/vendor/github.com/buildpacks/pack/internal/build/mount_paths.go +++ b/vendor/github.com/buildpacks/pack/internal/build/mount_paths.go @@ -30,6 +30,10 @@ func (m mountPaths) join(parts ...string) string { return strings.Join(parts, m.separator) } +func (m mountPaths) cnbDir() string { + return m.join(m.volume, "cnb") +} + func (m mountPaths) layersDir() string { return m.join(m.volume, "layers") } @@ -38,6 +42,10 @@ func (m mountPaths) stackPath() string { return m.join(m.layersDir(), "stack.toml") } +func (m mountPaths) runPath() string { + return m.join(m.layersDir(), "run.toml") +} + func (m mountPaths) projectPath() string { return m.join(m.layersDir(), "project-metadata.toml") } diff --git a/vendor/github.com/buildpacks/pack/internal/build/phase.go b/vendor/github.com/buildpacks/pack/internal/build/phase.go index 9302b9567e..76c4bdfea6 100644 --- a/vendor/github.com/buildpacks/pack/internal/build/phase.go +++ b/vendor/github.com/buildpacks/pack/internal/build/phase.go @@ -19,7 +19,7 @@ type Phase struct { handler container.Handler ctrConf *dcontainer.Config hostConf *dcontainer.HostConfig - ctr dcontainer.ContainerCreateCreatedBody + ctr dcontainer.CreateResponse uid, gid int appPath string containerOps []ContainerOperation diff --git a/vendor/github.com/buildpacks/pack/internal/build/phase_config_provider.go b/vendor/github.com/buildpacks/pack/internal/build/phase_config_provider.go index e8eafea109..93861633ab 100644 --- a/vendor/github.com/buildpacks/pack/internal/build/phase_config_provider.go +++ b/vendor/github.com/buildpacks/pack/internal/build/phase_config_provider.go @@ -63,6 +63,7 @@ func NewPhaseConfigProvider(name string, lifecycleExec *LifecycleExecution, ops op(provider) } + provider.ctrConf.Entrypoint = []string{""} // override entrypoint in case it is set provider.ctrConf.Cmd = append([]string{"/cnb/lifecycle/" + name}, provider.ctrConf.Cmd...) lifecycleExec.logger.Debugf("Running the %s on OS %s with:", style.Symbol(provider.Name()), style.Symbol(provider.os)) diff --git a/vendor/github.com/buildpacks/pack/internal/builder/builder.go b/vendor/github.com/buildpacks/pack/internal/builder/builder.go index d840007a52..33e6e40aa1 100644 --- a/vendor/github.com/buildpacks/pack/internal/builder/builder.go +++ b/vendor/github.com/buildpacks/pack/internal/builder/builder.go @@ -3,6 +3,7 @@ package builder import ( "archive/tar" "bytes" + e "errors" "fmt" "io" "os" @@ -16,7 +17,6 @@ import ( "github.com/BurntSushi/toml" "github.com/buildpacks/imgutil" - v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/pkg/errors" "github.com/buildpacks/pack/builder" @@ -28,6 +28,8 @@ import ( "github.com/buildpacks/pack/pkg/buildpack" "github.com/buildpacks/pack/pkg/dist" "github.com/buildpacks/pack/pkg/logging" + + lifecycleplatform "github.com/buildpacks/lifecycle/platform" ) const ( @@ -38,12 +40,15 @@ const ( orderPath = "/cnb/order.toml" stackPath = "/cnb/stack.toml" + runPath = "/cnb/run.toml" platformDir = "/platform" lifecycleDir = "/cnb/lifecycle" compatLifecycleDir = "/lifecycle" workspaceDir = "/workspace" layersDir = "/layers" + emptyTarDiffID = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + metadataLabel = "io.buildpacks.builder.metadata" stackLabel = "io.buildpacks.stack.id" @@ -61,21 +66,23 @@ const ( // Builder represents a pack builder, used to build images type Builder struct { - baseImageName string - image imgutil.Image - layerWriterFactory archive.TarWriterFactory - lifecycle Lifecycle - lifecycleDescriptor LifecycleDescriptor - additionalBuildpacks []buildpack.BuildModule - additionalExtensions []buildpack.BuildModule - metadata Metadata - mixins []string - env map[string]string - uid, gid int - StackID string - replaceOrder bool - order dist.Order - orderExtensions dist.Order + baseImageName string + image imgutil.Image + layerWriterFactory archive.TarWriterFactory + lifecycle Lifecycle + lifecycleDescriptor LifecycleDescriptor + additionalBuildpacks buildpack.ManagedCollection + additionalExtensions buildpack.ManagedCollection + flattenExcludeBuildpacks []string + metadata Metadata + mixins []string + env map[string]string + uid, gid int + StackID string + replaceOrder bool + order dist.Order + orderExtensions dist.Order + validateMixins bool } type orderTOML struct { @@ -83,33 +90,46 @@ type orderTOML struct { OrderExt dist.Order `toml:"order-extensions,omitempty"` } -type toAdd struct { +// moduleWithDiffID is a Build Module which content was written on disk in a tar file and the content hash was calculated +type moduleWithDiffID struct { tarPath string diffID string module buildpack.BuildModule } +type BuilderOption func(*options) error + +type options struct { + flatten bool + depth int + exclude []string +} + // FromImage constructs a builder from a builder image func FromImage(img imgutil.Image) (*Builder, error) { + return constructBuilder(img, "", true) +} + +// New constructs a new builder from a base image +func New(baseImage imgutil.Image, name string, ops ...BuilderOption) (*Builder, error) { + return constructBuilder(baseImage, name, false, ops...) +} + +func constructBuilder(img imgutil.Image, newName string, errOnMissingLabel bool, ops ...BuilderOption) (*Builder, error) { var metadata Metadata if ok, err := dist.GetLabel(img, metadataLabel, &metadata); err != nil { return nil, errors.Wrapf(err, "getting label %s", metadataLabel) - } else if !ok { + } else if !ok && errOnMissingLabel { return nil, fmt.Errorf("builder %s missing label %s -- try recreating builder", style.Symbol(img.Name()), style.Symbol(metadataLabel)) } - return constructBuilder(img, "", metadata) -} -// New constructs a new builder from a base image -func New(baseImage imgutil.Image, name string) (*Builder, error) { - var metadata Metadata - if _, err := dist.GetLabel(baseImage, metadataLabel, &metadata); err != nil { - return nil, errors.Wrapf(err, "getting label %s", metadataLabel) + opts := &options{} + for _, op := range ops { + if err := op(opts); err != nil { + return nil, err + } } - return constructBuilder(baseImage, name, metadata) -} -func constructBuilder(img imgutil.Image, newName string, metadata Metadata) (*Builder, error) { imageOS, err := img.OS() if err != nil { return nil, errors.Wrap(err, "getting image OS") @@ -120,12 +140,16 @@ func constructBuilder(img imgutil.Image, newName string, metadata Metadata) (*Bu } bldr := &Builder{ - baseImageName: img.Name(), - image: img, - layerWriterFactory: layerWriterFactory, - metadata: metadata, - lifecycleDescriptor: constructLifecycleDescriptor(metadata), - env: map[string]string{}, + baseImageName: img.Name(), + image: img, + layerWriterFactory: layerWriterFactory, + metadata: metadata, + lifecycleDescriptor: constructLifecycleDescriptor(metadata), + env: map[string]string{}, + validateMixins: true, + additionalBuildpacks: *buildpack.NewModuleManager(opts.flatten, opts.depth), + additionalExtensions: *buildpack.NewModuleManager(opts.flatten, opts.depth), + flattenExcludeBuildpacks: opts.exclude, } if err := addImgLabelsToBuildr(bldr); err != nil { @@ -139,6 +163,15 @@ func constructBuilder(img imgutil.Image, newName string, metadata Metadata) (*Bu return bldr, nil } +func WithFlatten(depth int, exclude []string) BuilderOption { + return func(o *options) error { + o.flatten = true + o.depth = depth + o.exclude = exclude + return nil + } +} + func constructLifecycleDescriptor(metadata Metadata) LifecycleDescriptor { return CompatDescriptor(LifecycleDescriptor{ Info: LifecycleInfo{ @@ -160,9 +193,6 @@ func addImgLabelsToBuildr(bldr *Builder) error { if err != nil { return errors.Wrapf(err, "get label %s from image %s", style.Symbol(stackLabel), style.Symbol(bldr.image.Name())) } - if bldr.StackID == "" { - return fmt.Errorf("image %s missing label %s", style.Symbol(bldr.image.Name()), style.Symbol(stackLabel)) - } if _, err = dist.GetLabel(bldr.image, stack.MixinsLabel, &bldr.mixins); err != nil { return errors.Wrapf(err, "getting label %s", stack.MixinsLabel) @@ -236,6 +266,18 @@ func (b *Builder) Stack() StackMetadata { return b.metadata.Stack } +// RunImages returns all run image metadata +func (b *Builder) RunImages() []RunImageMetadata { + return append(b.metadata.RunImages, b.Stack().RunImage) +} + +// DefaultRunImage returns the default run image metadata +func (b *Builder) DefaultRunImage() RunImageMetadata { + // run.images are ensured in builder.ValidateConfig() + // per the spec, we use the first one as the default + return b.RunImages()[0] +} + // Mixins returns the mixins of the builder func (b *Builder) Mixins() []string { return b.mixins @@ -251,17 +293,48 @@ func (b *Builder) GID() int { return b.gid } +func (b *Builder) AllModules(kind string) []buildpack.BuildModule { + return b.moduleManager(kind).AllModules() +} + +func (b *Builder) moduleManager(kind string) *buildpack.ManagedCollection { + switch kind { + case buildpack.KindBuildpack: + return &b.additionalBuildpacks + case buildpack.KindExtension: + return &b.additionalExtensions + } + return &buildpack.ManagedCollection{} +} + +func (b *Builder) FlattenedModules(kind string) [][]buildpack.BuildModule { + manager := b.moduleManager(kind) + return manager.FlattenedModules() +} + +func (b *Builder) ShouldFlatten(module buildpack.BuildModule) bool { + return b.additionalBuildpacks.ShouldFlatten(module) +} + // Setters // AddBuildpack adds a buildpack to the builder func (b *Builder) AddBuildpack(bp buildpack.BuildModule) { - b.additionalBuildpacks = append(b.additionalBuildpacks, bp) + b.additionalBuildpacks.AddModules(bp) b.metadata.Buildpacks = append(b.metadata.Buildpacks, bp.Descriptor().Info()) } +func (b *Builder) AddBuildpacks(main buildpack.BuildModule, dependencies []buildpack.BuildModule) { + b.additionalBuildpacks.AddModules(main, dependencies...) + b.metadata.Buildpacks = append(b.metadata.Buildpacks, main.Descriptor().Info()) + for _, dep := range dependencies { + b.metadata.Buildpacks = append(b.metadata.Buildpacks, dep.Descriptor().Info()) + } +} + // AddExtension adds an extension to the builder func (b *Builder) AddExtension(bp buildpack.BuildModule) { - b.additionalExtensions = append(b.additionalExtensions, bp) + b.additionalExtensions.AddModules(bp) b.metadata.Extensions = append(b.metadata.Extensions, bp.Descriptor().Info()) } @@ -310,6 +383,23 @@ func (b *Builder) SetStack(stackConfig builder.StackConfig) { } } +// SetRunImage sets the run image of the builder +func (b *Builder) SetRunImage(runConfig builder.RunConfig) { + var runImages []RunImageMetadata + for _, i := range runConfig.Images { + runImages = append(runImages, RunImageMetadata{ + Image: i.Image, + Mirrors: i.Mirrors, + }) + } + b.metadata.RunImages = runImages +} + +// SetValidateMixins if true instructs the builder to validate mixins +func (b *Builder) SetValidateMixins(to bool) { + b.validateMixins = to +} + // Save saves the builder func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) error { logger.Debugf("Creating builder with the following buildpacks:") @@ -345,11 +435,13 @@ func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) e } } - if err := validateBuildpacks(b.StackID, b.Mixins(), b.LifecycleDescriptor(), b.Buildpacks(), b.additionalBuildpacks); err != nil { - return errors.Wrap(err, "validating buildpacks") + if b.validateMixins { + if err := b.validateBuildpacks(); err != nil { + return errors.Wrap(err, "validating buildpacks") + } } - if err := validateExtensions(b.lifecycleDescriptor, b.Extensions(), b.additionalExtensions); err != nil { + if err := validateExtensions(b.lifecycleDescriptor, b.Extensions(), b.AllModules(buildpack.KindExtension)); err != nil { return errors.Wrap(err, "validating extensions") } @@ -357,7 +449,14 @@ func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) e if _, err := dist.GetLabel(b.image, dist.BuildpackLayersLabel, &bpLayers); err != nil { return errors.Wrapf(err, "getting label %s", dist.BuildpackLayersLabel) } - err = b.addModules(buildpack.KindBuildpack, logger, tmpDir, b.image, b.additionalBuildpacks, bpLayers) + + var excludedBuildpacks []buildpack.BuildModule + excludedBuildpacks, err = b.addFlattenedModules(buildpack.KindBuildpack, logger, tmpDir, b.image, b.additionalBuildpacks.FlattenedModules(), bpLayers) + if err != nil { + return err + } + + err = b.addExplodedModules(buildpack.KindBuildpack, logger, tmpDir, b.image, append(b.additionalBuildpacks.ExplodedModules(), excludedBuildpacks...), bpLayers) if err != nil { return err } @@ -369,10 +468,18 @@ func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) e if _, err := dist.GetLabel(b.image, dist.ExtensionLayersLabel, &extLayers); err != nil { return errors.Wrapf(err, "getting label %s", dist.ExtensionLayersLabel) } - err = b.addModules(buildpack.KindExtension, logger, tmpDir, b.image, b.additionalExtensions, extLayers) + + var excludedExtensions []buildpack.BuildModule + excludedExtensions, err = b.addFlattenedModules(buildpack.KindExtension, logger, tmpDir, b.image, b.additionalExtensions.FlattenedModules(), extLayers) + if err != nil { + return err + } + + err = b.addExplodedModules(buildpack.KindExtension, logger, tmpDir, b.image, append(b.additionalExtensions.ExplodedModules(), excludedExtensions...), extLayers) if err != nil { return err } + if err := dist.SetLabel(b.image, dist.ExtensionLayersLabel, extLayers); err != nil { return err } @@ -410,6 +517,14 @@ func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) e return errors.Wrap(err, "adding stack.tar layer") } + runImageTar, err := b.runImageLayer(tmpDir) + if err != nil { + return err + } + if err := b.image.AddLayer(runImageTar); err != nil { + return errors.Wrap(err, "adding run.tar layer") + } + if len(b.env) > 0 { logger.Debugf("Provided Environment Variables\n %s", style.Map(b.env, " ", "\n")) } @@ -446,63 +561,19 @@ func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) e // Helpers -func (b *Builder) addModules(kind string, logger logging.Logger, tmpDir string, image imgutil.Image, additionalModules []buildpack.BuildModule, layers dist.ModuleLayers) error { - collectionToAdd := map[string]toAdd{} - - type modInfo struct { - info dist.ModuleInfo - layerTar string - diffID v1.Hash - err error +func (b *Builder) addExplodedModules(kind string, logger logging.Logger, tmpDir string, image imgutil.Image, additionalModules []buildpack.BuildModule, layers dist.ModuleLayers) error { + collectionToAdd := map[string]moduleWithDiffID{} + toAdd, errs := explodeModules(kind, tmpDir, additionalModules, logger) + if len(errs) > 0 { + return e.Join(errs...) } - lids := make([]chan modInfo, len(additionalModules)) - for i := range lids { - lids[i] = make(chan modInfo, 1) - } - - for i, module := range additionalModules { - go func(i int, module buildpack.BuildModule) { - // create directory - modTmpDir := filepath.Join(tmpDir, fmt.Sprintf("%s-%s", kind, strconv.Itoa(i))) - if err := os.MkdirAll(modTmpDir, os.ModePerm); err != nil { - lids[i] <- modInfo{err: errors.Wrapf(err, "creating %s temp dir", kind)} - } - - // create tar file - layerTar, err := buildpack.ToLayerTar(modTmpDir, module) - if err != nil { - lids[i] <- modInfo{err: err} - } - - // generate diff id - diffID, err := dist.LayerDiffID(layerTar) - info := module.Descriptor().Info() - if err != nil { - lids[i] <- modInfo{err: errors.Wrapf(err, - "getting content hashes for %s %s", - kind, - style.Symbol(info.FullName()), - )} - } - lids[i] <- modInfo{ - info: info, - layerTar: layerTar, - diffID: diffID, - } - }(i, module) - } - - for i, module := range additionalModules { - mi := <-lids[i] - if mi.err != nil { - return mi.err - } - info, diffID, layerTar := mi.info, mi.diffID, mi.layerTar + for i, additionalModule := range toAdd { + info, diffID, layerTar, module := additionalModule.module.Descriptor().Info(), additionalModule.diffID, additionalModule.tarPath, additionalModule.module // check against builder layers if existingInfo, ok := layers[info.ID][info.Version]; ok { - if existingInfo.LayerDiffID == diffID.String() { + if existingInfo.LayerDiffID == diffID { logger.Debugf("%s %s already exists on builder with same contents, skipping...", istrings.Title(kind), style.Symbol(info.FullName())) continue } else { @@ -516,23 +587,23 @@ func (b *Builder) addModules(kind string, logger logging.Logger, tmpDir string, } } - logger.Debugf(ModuleOnBuilderMessage, kind, style.Symbol(info.FullName()), style.Symbol(existingInfo.LayerDiffID), style.Symbol(diffID.String())) + logger.Debugf(ModuleOnBuilderMessage, kind, style.Symbol(info.FullName()), style.Symbol(existingInfo.LayerDiffID), style.Symbol(diffID)) } // check against other modules to be added if otherAdditionalMod, ok := collectionToAdd[info.FullName()]; ok { - if otherAdditionalMod.diffID == diffID.String() { + if otherAdditionalMod.diffID == diffID { logger.Debugf("%s %s with same contents is already being added, skipping...", istrings.Title(kind), style.Symbol(info.FullName())) continue } - logger.Debugf(ModulePreviouslyDefinedMessage, kind, style.Symbol(info.FullName()), style.Symbol(otherAdditionalMod.diffID), style.Symbol(diffID.String())) + logger.Debugf(ModulePreviouslyDefinedMessage, kind, style.Symbol(info.FullName()), style.Symbol(otherAdditionalMod.diffID), style.Symbol(diffID)) } // note: if same id@version is in additionalModules, last one wins (see warnings above) - collectionToAdd[info.FullName()] = toAdd{ + collectionToAdd[info.FullName()] = moduleWithDiffID{ tarPath: layerTar, - diffID: diffID.String(), + diffID: diffID, module: module, } } @@ -556,6 +627,73 @@ func (b *Builder) addModules(kind string, logger logging.Logger, tmpDir string, return nil } +func (b *Builder) addFlattenedModules(kind string, logger logging.Logger, tmpDir string, image imgutil.Image, flattenModules [][]buildpack.BuildModule, layers dist.ModuleLayers) ([]buildpack.BuildModule, error) { + collectionToAdd := map[string]moduleWithDiffID{} + var ( + buildModuleExcluded []buildpack.BuildModule + finalTarPath string + err error + ) + + buildModuleWriter := buildpack.NewBuildModuleWriter(logger, b.layerWriterFactory) + excludedModules := buildpack.Set(b.flattenExcludeBuildpacks) + + for i, additionalModules := range flattenModules { + modFlattenTmpDir := filepath.Join(tmpDir, fmt.Sprintf("%s-%s-flatten", kind, strconv.Itoa(i))) + if err := os.MkdirAll(modFlattenTmpDir, os.ModePerm); err != nil { + return nil, errors.Wrap(err, "creating flatten temp dir") + } + + finalTarPath, buildModuleExcluded, err = buildModuleWriter.NToLayerTar(modFlattenTmpDir, fmt.Sprintf("%s-flatten-%s", kind, strconv.Itoa(i)), additionalModules, excludedModules) + if err != nil { + return nil, errors.Wrapf(err, "writing layer %s", finalTarPath) + } + + diffID, err := dist.LayerDiffID(finalTarPath) + if err != nil { + return nil, errors.Wrapf(err, "calculating diff layer %s", finalTarPath) + } + + for _, module := range additionalModules { + collectionToAdd[module.Descriptor().Info().FullName()] = moduleWithDiffID{ + tarPath: finalTarPath, + diffID: diffID.String(), + module: module, + } + } + } + + // Fixes 1453 + keys := sortKeys(collectionToAdd) + diffIDAdded := map[string]string{} + for _, k := range keys { + module := collectionToAdd[k] + bp := module.module + addLayer := true + if b.ShouldFlatten(bp) { + if _, ok := diffIDAdded[module.diffID]; !ok { + diffIDAdded[module.diffID] = module.tarPath + } else { + addLayer = false + logger.Debugf("Squashing %s %s (diffID=%s)", kind, style.Symbol(bp.Descriptor().Info().FullName()), module.diffID) + } + } + if addLayer { + logger.Debugf("Adding %s %s (diffID=%s)", kind, style.Symbol(bp.Descriptor().Info().FullName()), module.diffID) + if err = image.AddLayerWithDiffID(module.tarPath, module.diffID); err != nil { + return nil, errors.Wrapf(err, + "adding layer tar for %s %s", + kind, + style.Symbol(module.module.Descriptor().Info().FullName()), + ) + } + } + dist.AddToLayersMD(layers, bp.Descriptor(), module.diffID) + } + + return buildModuleExcluded, nil +} + func processOrder(modulesOnBuilder []dist.ModuleInfo, order dist.Order, kind string) (dist.Order, error) { resolved := dist.Order{} for idx, g := range order { @@ -610,24 +748,20 @@ func hasElementWithVersion(moduleList []dist.ModuleInfo, version string) bool { return false } -func validateBuildpacks(stackID string, mixins []string, lifecycleDescriptor LifecycleDescriptor, allBuildpacks []dist.ModuleInfo, bpsToValidate []buildpack.BuildModule) error { +func (b *Builder) validateBuildpacks() error { bpLookup := map[string]interface{}{} - for _, bp := range allBuildpacks { + for _, bp := range b.Buildpacks() { bpLookup[bp.FullName()] = nil } - for _, bp := range bpsToValidate { + for _, bp := range b.AllModules(buildpack.KindBuildpack) { bpd := bp.Descriptor() - if err := validateLifecycleCompat(bpd, lifecycleDescriptor); err != nil { + if err := validateLifecycleCompat(bpd, b.LifecycleDescriptor()); err != nil { return err } - if len(bpd.Stacks()) >= 1 { // standard buildpack - if err := bpd.EnsureStackSupport(stackID, mixins, false); err != nil { - return err - } - } else { // order buildpack + if len(bpd.Order()) > 0 { // order buildpack for _, g := range bpd.Order() { for _, r := range g.Group { if _, ok := bpLookup[r.FullName()]; !ok { @@ -638,6 +772,30 @@ func validateBuildpacks(stackID string, mixins []string, lifecycleDescriptor Lif } } } + } else if err := bpd.EnsureStackSupport(b.StackID, b.Mixins(), false); err != nil { + return err + } else { + buildOS, err := b.Image().OS() + if err != nil { + return err + } + buildArch, err := b.Image().Architecture() + if err != nil { + return err + } + buildDistroName, err := b.Image().Label(lifecycleplatform.OSDistributionNameLabel) + if err != nil { + return err + } + buildDistroVersion, err := b.Image().Label(lifecycleplatform.OSDistributionVersionLabel) + if err != nil { + return err + } + if err := bpd.EnsureTargetSupport(buildOS, buildArch, buildDistroName, buildDistroVersion); err != nil { + return err + } + + // TODO ensure at least one run-image } } @@ -662,7 +820,6 @@ func validateExtensions(lifecycleDescriptor LifecycleDescriptor, allExtensions [ } func validateLifecycleCompat(descriptor buildpack.Descriptor, lifecycleDescriptor LifecycleDescriptor) error { - // TODO: Warn when Buildpack API is deprecated - https://github.com/buildpacks/pack/issues/788 compatible := false for _, version := range append(lifecycleDescriptor.APIs.Buildpack.Supported, lifecycleDescriptor.APIs.Buildpack.Deprecated...) { compatible = version.Compare(descriptor.API()) == 0 @@ -881,7 +1038,12 @@ func orderFileContents(order dist.Order, orderExt dist.Order) (string, error) { func (b *Builder) stackLayer(dest string) (string, error) { buf := &bytes.Buffer{} - err := toml.NewEncoder(buf).Encode(b.metadata.Stack) + var err error + if b.metadata.Stack.RunImage.Image != "" { + err = toml.NewEncoder(buf).Encode(b.metadata.Stack) + } else if len(b.metadata.RunImages) > 0 { + err = toml.NewEncoder(buf).Encode(StackMetadata{RunImage: b.metadata.RunImages[0]}) + } if err != nil { return "", errors.Wrapf(err, "failed to marshal stack.toml") } @@ -895,6 +1057,24 @@ func (b *Builder) stackLayer(dest string) (string, error) { return layerTar, nil } +func (b *Builder) runImageLayer(dest string) (string, error) { + buf := &bytes.Buffer{} + err := toml.NewEncoder(buf).Encode(RunImages{ + Images: b.metadata.RunImages, + }) + if err != nil { + return "", errors.Wrapf(err, "failed to marshal run.toml") + } + + layerTar := filepath.Join(dest, "run.tar") + err = layer.CreateSingleFileTar(layerTar, runPath, buf.String(), b.layerWriterFactory) + if err != nil { + return "", errors.Wrapf(err, "failed to create run.toml layer tar") + } + + return layerTar, nil +} + func (b *Builder) envLayer(dest string, env map[string]string) (string, error) { fh, err := os.Create(filepath.Join(dest, "env.tar")) if err != nil { @@ -954,7 +1134,7 @@ func (b *Builder) whiteoutLayer(tmpDir string, i int, bpInfo dist.ModuleInfo) (s return fh.Name(), nil } -func sortKeys(collection map[string]toAdd) []string { +func sortKeys(collection map[string]moduleWithDiffID) []string { keys := make([]string, 0, len(collection)) for k := range collection { keys = append(keys, k) @@ -962,3 +1142,118 @@ func sortKeys(collection map[string]toAdd) []string { sort.Strings(keys) return keys } + +// explodeModules takes a collection of build modules and concurrently reads their tar files. +// It assumes the modules were extracted with `buildpack.extractBuildpacks`, which when provided a flattened buildpack package containing N buildpacks, +// will return N modules: 1 module with a single tar containing ALL N buildpacks, and N-1 modules with empty tar files. +// As we iterate through the modules, in case a flattened module (tar containing all N buildpacks) is found, +// explodeModules will split the module into N modules, each with a single tar containing a single buildpack. +// In case a module with an empty tar file is found, it is ignored. +func explodeModules(kind, tmpDir string, additionalModules []buildpack.BuildModule, logger logging.Logger) ([]moduleWithDiffID, []error) { + modInfoChans := make([]chan modInfo, len(additionalModules)) + for i := range modInfoChans { + modInfoChans[i] = make(chan modInfo, 1) + } + + // Explode modules concurrently + for i, module := range additionalModules { + go func(i int, module buildpack.BuildModule) { + modTmpDir := filepath.Join(tmpDir, fmt.Sprintf("%s-%s", kind, strconv.Itoa(i))) + if err := os.MkdirAll(modTmpDir, os.ModePerm); err != nil { + modInfoChans[i] <- handleError(module, err, fmt.Sprintf("creating %s temp dir %s", kind, modTmpDir)) + } + moduleTars, err := buildpack.ToNLayerTar(modTmpDir, module) + if err != nil { + modInfoChans[i] <- handleError(module, err, fmt.Sprintf("creating %s tar file at path %s", module.Descriptor().Info().FullName(), modTmpDir)) + } + modInfoChans[i] <- modInfo{moduleTars: moduleTars} + }(i, module) + } + + // Iterate over modules sequentially, building up the result. + var ( + result []moduleWithDiffID + errs []error + ) + for i, module := range additionalModules { + mi := <-modInfoChans[i] + if mi.err != nil { + errs = append(errs, mi.err) + continue + } + if len(mi.moduleTars) == 1 { + // This entry is an individual buildpack or extension, or a module with empty tar + moduleTar := mi.moduleTars[0] + diffID, err := dist.LayerDiffID(moduleTar.Path()) + if err != nil { + errs = append(errs, errors.Wrapf(err, "calculating layer diffID for path %s", moduleTar.Path())) + continue + } + if diffID.String() == emptyTarDiffID { + logger.Debugf("%s %s is a component of a flattened buildpack that will be added elsewhere, skipping...", istrings.Title(kind), style.Symbol(moduleTar.Info().FullName())) + continue // we don't need to keep modules with empty tars + } + result = append(result, moduleWithDiffID{ + tarPath: moduleTar.Path(), + diffID: diffID.String(), + module: module, + }) + } else { + // This entry is a flattened buildpack that was exploded, we need to add each exploded buildpack to the result in order + for _, moduleTar := range mi.moduleTars { + diffID, err := dist.LayerDiffID(moduleTar.Path()) + if err != nil { + errs = append(errs, errors.Wrapf(err, "calculating layer diffID for path %s", moduleTar.Path())) + continue + } + explodedMod := moduleWithDiffID{ + tarPath: moduleTar.Path(), + diffID: diffID.String(), + } + // find the module "info" for this buildpack - it could be the current module, or one of the modules with empty tars that was ignored + if namesMatch(module, moduleTar) { + explodedMod.module = module + } else { + for _, additionalModule := range additionalModules { + if namesMatch(additionalModule, moduleTar) { + explodedMod.module = additionalModule + break + } + } + } + result = append(result, explodedMod) + } + } + } + + return result, errs +} + +func handleError(module buildpack.BuildModule, err error, message string) modInfo { + moduleTar := errModuleTar{ + module: module, + } + return modInfo{moduleTars: []buildpack.ModuleTar{moduleTar}, err: errors.Wrap(err, message)} +} + +func namesMatch(module buildpack.BuildModule, moduleOnDisk buildpack.ModuleTar) bool { + return moduleOnDisk.Info().FullName() == fmt.Sprintf("%s@%s", module.Descriptor().EscapedID(), module.Descriptor().Info().Version) || + moduleOnDisk.Info().FullName() == module.Descriptor().Info().FullName() +} + +type modInfo struct { + moduleTars []buildpack.ModuleTar + err error +} + +type errModuleTar struct { + module buildpack.BuildModule +} + +func (e errModuleTar) Info() dist.ModuleInfo { + return e.module.Descriptor().Info() +} + +func (e errModuleTar) Path() string { + return "" +} diff --git a/vendor/github.com/buildpacks/pack/internal/builder/inspect.go b/vendor/github.com/buildpacks/pack/internal/builder/inspect.go index 9ad09b78c4..01f8fc9ea5 100644 --- a/vendor/github.com/buildpacks/pack/internal/builder/inspect.go +++ b/vendor/github.com/buildpacks/pack/internal/builder/inspect.go @@ -15,8 +15,7 @@ type Info struct { Description string StackID string Mixins []string - RunImage string - RunImageMirrors []string + RunImages []pubbldr.RunImageConfig Buildpacks []dist.ModuleInfo Order pubbldr.DetectionOrder BuildpackLayers dist.ModuleLayers @@ -78,10 +77,7 @@ func (i *Inspector) Inspect(name string, daemon bool, orderDetectionDepth int) ( return Info{}, fmt.Errorf("reading image metadata: %w", err) } - stackID, err := labelManager.StackID() - if err != nil { - return Info{}, fmt.Errorf("reading image stack id: %w", err) - } + stackID, _ := labelManager.StackID() // ignore error because stack is optional mixins, err := labelManager.Mixins() if err != nil { @@ -126,12 +122,31 @@ func (i *Inspector) Inspect(name string, daemon bool, orderDetectionDepth int) ( APIs: metadata.Lifecycle.APIs, }) + var runImages []pubbldr.RunImageConfig + for _, ri := range metadata.RunImages { + runImages = append(runImages, pubbldr.RunImageConfig{ + Image: ri.Image, + Mirrors: ri.Mirrors, + }) + } + addStackRunImage := true + for _, ri := range runImages { + if ri.Image == metadata.Stack.RunImage.Image { + addStackRunImage = false + } + } + if addStackRunImage && metadata.Stack.RunImage.Image != "" { + runImages = append(runImages, pubbldr.RunImageConfig{ + Image: metadata.Stack.RunImage.Image, + Mirrors: metadata.Stack.RunImage.Mirrors, + }) + } + return Info{ Description: metadata.Description, StackID: stackID, Mixins: append(commonMixins, buildMixins...), - RunImage: metadata.Stack.RunImage.Image, - RunImageMirrors: metadata.Stack.RunImage.Mirrors, + RunImages: runImages, Buildpacks: sortBuildPacksByID(uniqueBuildpacks(metadata.Buildpacks)), Order: detectionOrder, BuildpackLayers: layers, diff --git a/vendor/github.com/buildpacks/pack/internal/builder/lifecycle.go b/vendor/github.com/buildpacks/pack/internal/builder/lifecycle.go index 012c42fc18..1bc2c1e3cd 100644 --- a/vendor/github.com/buildpacks/pack/internal/builder/lifecycle.go +++ b/vendor/github.com/buildpacks/pack/internal/builder/lifecycle.go @@ -14,7 +14,7 @@ import ( // A snapshot of the latest tested lifecycle version values const ( - DefaultLifecycleVersion = "0.16.0" + DefaultLifecycleVersion = "0.17.0-rc.3" DefaultBuildpackAPIVersion = "0.2" ) diff --git a/vendor/github.com/buildpacks/pack/internal/builder/metadata.go b/vendor/github.com/buildpacks/pack/internal/builder/metadata.go index c16e55ff31..67333e4301 100644 --- a/vendor/github.com/buildpacks/pack/internal/builder/metadata.go +++ b/vendor/github.com/buildpacks/pack/internal/builder/metadata.go @@ -8,12 +8,13 @@ const ( ) type Metadata struct { - Description string `json:"description"` - Buildpacks []dist.ModuleInfo `json:"buildpacks"` - Extensions []dist.ModuleInfo `json:"extensions"` - Stack StackMetadata `json:"stack"` - Lifecycle LifecycleMetadata `json:"lifecycle"` - CreatedBy CreatorMetadata `json:"createdBy"` + Description string `json:"description"` + Buildpacks []dist.ModuleInfo `json:"buildpacks"` + Extensions []dist.ModuleInfo `json:"extensions"` + Stack StackMetadata `json:"stack"` + Lifecycle LifecycleMetadata `json:"lifecycle"` + CreatedBy CreatorMetadata `json:"createdBy"` + RunImages []RunImageMetadata `json:"images"` } type CreatorMetadata struct { @@ -32,6 +33,10 @@ type StackMetadata struct { RunImage RunImageMetadata `json:"runImage" toml:"run-image"` } +type RunImages struct { + Images []RunImageMetadata `json:"images" toml:"images"` +} + type RunImageMetadata struct { Image string `json:"image" toml:"image"` Mirrors []string `json:"mirrors" toml:"mirrors"` diff --git a/vendor/github.com/buildpacks/pack/internal/builder/suggested_builder.go b/vendor/github.com/buildpacks/pack/internal/builder/suggested_builder.go index 9930401f5b..731f18c8f3 100644 --- a/vendor/github.com/buildpacks/pack/internal/builder/suggested_builder.go +++ b/vendor/github.com/buildpacks/pack/internal/builder/suggested_builder.go @@ -15,26 +15,31 @@ var SuggestedBuilders = []SuggestedBuilder{ { Vendor: "Heroku", Image: "heroku/builder:22", - DefaultDescription: "heroku-22 base image with buildpacks for Java and Node.js", + DefaultDescription: "Heroku-22 base image with buildpacks for Go, Java, Node.js, PHP, Python, Scala & Ruby", }, { Vendor: "Heroku", Image: "heroku/buildpacks:20", - DefaultDescription: "heroku-20 base image with buildpacks for Ruby, Java, Node.js, Python, Golang, & PHP", + DefaultDescription: "Heroku-20 base image with buildpacks for Go, Java, Node.js, PHP, Python, Scala & Ruby", }, { Vendor: "Paketo Buildpacks", - Image: "paketobuildpacks/builder:base", - DefaultDescription: "Small base image with buildpacks for Java, Node.js, Golang, & .NET Core", + Image: "paketobuildpacks/builder-jammy-base", + DefaultDescription: "Small base image with buildpacks for Java, Node.js, Golang, .NET Core, Python & Ruby", }, { Vendor: "Paketo Buildpacks", - Image: "paketobuildpacks/builder:full", - DefaultDescription: "Larger base image with buildpacks for Java, Node.js, Golang, .NET Core, & PHP", + Image: "paketobuildpacks/builder-jammy-full", + DefaultDescription: "Larger base image with buildpacks for Java, Node.js, Golang, .NET Core, Python, Ruby, & PHP", }, { Vendor: "Paketo Buildpacks", - Image: "paketobuildpacks/builder:tiny", - DefaultDescription: "Tiny base image (bionic build image, distroless run image) with buildpacks for Golang", + Image: "paketobuildpacks/builder-jammy-tiny", + DefaultDescription: "Tiny base image (jammy build image, distroless run image) with buildpacks for Golang & Java", + }, + { + Vendor: "Paketo Buildpacks", + Image: "paketobuildpacks/builder-jammy-buildpackless-static", + DefaultDescription: "Static base image (jammy build image, distroless run image) suitable for static binaries like Go or Rust", }, } diff --git a/vendor/github.com/buildpacks/pack/internal/container/run.go b/vendor/github.com/buildpacks/pack/internal/container/run.go index ae118f0c5e..4f804ec15c 100644 --- a/vendor/github.com/buildpacks/pack/internal/container/run.go +++ b/vendor/github.com/buildpacks/pack/internal/container/run.go @@ -6,22 +6,45 @@ import ( "io" "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" dcontainer "github.com/docker/docker/api/types/container" "github.com/docker/docker/pkg/stdcopy" "github.com/pkg/errors" ) -type Handler func(bodyChan <-chan dcontainer.ContainerWaitOKBody, errChan <-chan error, reader io.Reader) error +type Handler func(bodyChan <-chan dcontainer.WaitResponse, errChan <-chan error, reader io.Reader) error type DockerClient interface { - ContainerWait(ctx context.Context, container string, condition dcontainer.WaitCondition) (<-chan containertypes.ContainerWaitOKBody, <-chan error) + ContainerWait(ctx context.Context, container string, condition dcontainer.WaitCondition) (<-chan dcontainer.WaitResponse, <-chan error) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error } +func ContainerWaitWrapper(ctx context.Context, docker DockerClient, container string, condition dcontainer.WaitCondition) (<-chan dcontainer.WaitResponse, <-chan error) { + bodyChan := make(chan dcontainer.WaitResponse) + errChan := make(chan error) + + go func() { + defer close(bodyChan) + defer close(errChan) + + waitBodyChan, waitErrChan := docker.ContainerWait(ctx, container, dcontainer.WaitConditionNextExit) + for { + select { + case body := <-waitBodyChan: + bodyChan <- body + return + case err := <-waitErrChan: + errChan <- err + return + } + } + }() + + return bodyChan, errChan +} + func RunWithHandler(ctx context.Context, docker DockerClient, ctrID string, handler Handler) error { - bodyChan, errChan := docker.ContainerWait(ctx, ctrID, dcontainer.WaitConditionNextExit) + bodyChan, errChan := ContainerWaitWrapper(ctx, docker, ctrID, dcontainer.WaitConditionNextExit) resp, err := docker.ContainerAttach(ctx, ctrID, types.ContainerAttachOptions{ Stream: true, @@ -41,7 +64,7 @@ func RunWithHandler(ctx context.Context, docker DockerClient, ctrID string, hand } func DefaultHandler(out, errOut io.Writer) Handler { - return func(bodyChan <-chan dcontainer.ContainerWaitOKBody, errChan <-chan error, reader io.Reader) error { + return func(bodyChan <-chan dcontainer.WaitResponse, errChan <-chan error, reader io.Reader) error { copyErr := make(chan error) go func() { _, err := stdcopy.StdCopy(out, errOut, reader) diff --git a/vendor/github.com/buildpacks/pack/internal/registry/registry_cache.go b/vendor/github.com/buildpacks/pack/internal/registry/registry_cache.go index 2fab336b74..6ae7e08766 100644 --- a/vendor/github.com/buildpacks/pack/internal/registry/registry_cache.go +++ b/vendor/github.com/buildpacks/pack/internal/registry/registry_cache.go @@ -8,6 +8,7 @@ import ( "fmt" "net/url" "os" + "os/exec" "path/filepath" "runtime" "time" @@ -168,6 +169,7 @@ func (r *Cache) Initialize() error { // CreateCache creates the cache on the filesystem func (r *Cache) CreateCache() error { + var repository *git.Repository r.logger.Debugf("Creating registry cache for %s/%s", r.url.Host, r.url.Path) registryDir, err := os.MkdirTemp(filepath.Dir(r.Root), "registry") @@ -177,11 +179,23 @@ func (r *Cache) CreateCache() error { r.RegistryDir = registryDir - repository, err := git.PlainClone(r.RegistryDir, false, &git.CloneOptions{ - URL: r.url.String(), - }) - if err != nil { - return errors.Wrap(err, "cloning remote registry") + if r.url.Host == "dev.azure.com" { + err = exec.Command("git", "clone", r.url.String(), r.RegistryDir).Run() + if err != nil { + return errors.Wrap(err, "cloning remote registry with native git") + } + + repository, err = git.PlainOpen(r.RegistryDir) + if err != nil { + return errors.Wrap(err, "opening remote registry clone") + } + } else { + repository, err = git.PlainClone(r.RegistryDir, false, &git.CloneOptions{ + URL: r.url.String(), + }) + if err != nil { + return errors.Wrap(err, "cloning remote registry") + } } w, err := repository.Worktree() diff --git a/vendor/github.com/buildpacks/pack/internal/termui/termui.go b/vendor/github.com/buildpacks/pack/internal/termui/termui.go index fb2825e572..f9d0055e9d 100644 --- a/vendor/github.com/buildpacks/pack/internal/termui/termui.go +++ b/vendor/github.com/buildpacks/pack/internal/termui/termui.go @@ -107,7 +107,7 @@ func (s *Termui) handle() { } func (s *Termui) Handler() container.Handler { - return func(bodyChan <-chan dcontainer.ContainerWaitOKBody, errChan <-chan error, reader io.Reader) error { + return func(bodyChan <-chan dcontainer.WaitResponse, errChan <-chan error, reader io.Reader) error { var ( copyErr = make(chan error) r, w = io.Pipe() diff --git a/vendor/github.com/buildpacks/pack/pkg/archive/archive.go b/vendor/github.com/buildpacks/pack/pkg/archive/archive.go index 8ec9794dc5..9affb3a3cc 100644 --- a/vendor/github.com/buildpacks/pack/pkg/archive/archive.go +++ b/vendor/github.com/buildpacks/pack/pkg/archive/archive.go @@ -5,6 +5,7 @@ import ( "archive/tar" "archive/zip" "io" + "io/fs" "os" "path/filepath" "time" @@ -16,6 +17,7 @@ import ( ) var NormalizedDateTime time.Time +var Umask fs.FileMode func init() { NormalizedDateTime = time.Date(1980, time.January, 1, 0, 0, 1, 0, time.UTC) @@ -57,7 +59,7 @@ func GenerateTar(genFn func(TarWriter) error) io.ReadCloser { return GenerateTarWithWriter(genFn, DefaultTarWriterFactory()) } -// GenerateTarWithTar returns a reader to a tar from a generator function using a writer from the provided factory. +// GenerateTarWithWriter returns a reader to a tar from a generator function using a writer from the provided factory. // Note that the generator will not fully execute until the reader is fully read from. Any errors returned by the // generator will be returned when reading the reader. func GenerateTarWithWriter(genFn func(TarWriter) error, twf TarWriterFactory) io.ReadCloser { @@ -167,13 +169,9 @@ func ReadTarEntry(rc io.Reader, entryPath string) (*tar.Header, []byte, error) { // contents will be placed. The includeRoot param sets the permissions and metadata on the root file. func WriteDirToTar(tw TarWriter, srcDir, basePath string, uid, gid int, mode int64, normalizeModTime, includeRoot bool, fileFilter func(string) bool) error { if includeRoot { - rootHeader := &tar.Header{ - Typeflag: tar.TypeDir, - Name: basePath, - Mode: mode, - } - finalizeHeader(rootHeader, uid, gid, mode, normalizeModTime) - if err := tw.WriteHeader(rootHeader); err != nil { + mode := modePermIfNegativeMode(mode) + err := writeRootHeader(tw, basePath, mode, uid, gid, normalizeModTime) + if err != nil { return err } } @@ -189,33 +187,11 @@ func WriteDirToTar(tw TarWriter, srcDir, basePath string, uid, gid int, mode int return nil } } + if err != nil { return err } - if fi.Mode()&os.ModeSocket != 0 { - return nil - } - - var header *tar.Header - if fi.Mode()&os.ModeSymlink != 0 { - target, err := os.Readlink(file) - if err != nil { - return err - } - - // Ensure that symlinks have Linux link names, independent of source OS - header, err = tar.FileInfoHeader(fi, filepath.ToSlash(target)) - if err != nil { - return err - } - } else { - header, err = tar.FileInfoHeader(fi, fi.Name()) - if err != nil { - return err - } - } - if relPath == "" { relPath, err = filepath.Rel(srcDir, file) if err != nil { @@ -226,14 +202,28 @@ func WriteDirToTar(tw TarWriter, srcDir, basePath string, uid, gid int, mode int return nil } - header.Name = filepath.ToSlash(filepath.Join(basePath, relPath)) - finalizeHeader(header, uid, gid, mode, normalizeModTime) + if hasModeSocket(fi) != 0 { + return nil + } - if err := tw.WriteHeader(header); err != nil { + var header *tar.Header + if hasModeSymLink(fi) { + if header, err = getHeaderFromSymLink(file, fi); err != nil { + return err + } + } else { + if header, err = tar.FileInfoHeader(fi, fi.Name()); err != nil { + return err + } + } + + header.Name = getHeaderNameFromBaseAndRelPath(basePath, relPath) + err = writeHeader(header, uid, gid, mode, normalizeModTime, tw) + if err != nil { return err } - if fi.Mode().IsRegular() { + if hasRegularMode(fi) { f, err := os.Open(filepath.Clean(file)) if err != nil { return err @@ -329,26 +319,6 @@ func WriteZipToTar(tw TarWriter, srcZip, basePath string, uid, gid int, mode int return nil } -func isFatFile(header zip.FileHeader) bool { - var ( - creatorFAT uint16 = 0 // nolint:revive - creatorVFAT uint16 = 14 - ) - - // This identifies FAT files, based on the `zip` source: https://golang.org/src/archive/zip/struct.go - firstByte := header.CreatorVersion >> 8 - return firstByte == creatorFAT || firstByte == creatorVFAT -} - -func finalizeHeader(header *tar.Header, uid, gid int, mode int64, normalizeModTime bool) { - NormalizeHeader(header, normalizeModTime) - if mode != -1 { - header.Mode = mode - } - header.Uid = uid - header.Gid = gid -} - // NormalizeHeader normalizes a tar.Header // // Normalizes the following: @@ -381,3 +351,86 @@ func IsZip(path string) (bool, error) { return false, err } } + +func isFatFile(header zip.FileHeader) bool { + var ( + creatorFAT uint16 = 0 // nolint:revive + creatorVFAT uint16 = 14 + ) + + // This identifies FAT files, based on the `zip` source: https://golang.org/src/archive/zip/struct.go + firstByte := header.CreatorVersion >> 8 + return firstByte == creatorFAT || firstByte == creatorVFAT +} + +func finalizeHeader(header *tar.Header, uid, gid int, mode int64, normalizeModTime bool) { + NormalizeHeader(header, normalizeModTime) + if mode != -1 { + header.Mode = mode + } + header.Uid = uid + header.Gid = gid +} + +func hasRegularMode(fi os.FileInfo) bool { + return fi.Mode().IsRegular() +} + +func getHeaderNameFromBaseAndRelPath(basePath string, relPath string) string { + return filepath.ToSlash(filepath.Join(basePath, relPath)) +} + +func writeHeader(header *tar.Header, uid int, gid int, mode int64, normalizeModTime bool, tw TarWriter) error { + finalizeHeader(header, uid, gid, mode, normalizeModTime) + + if err := tw.WriteHeader(header); err != nil { + return err + } + + return nil +} + +func getHeaderFromSymLink(file string, fi os.FileInfo) (*tar.Header, error) { + target, err := os.Readlink(file) + if err != nil { + return nil, err + } + + // Ensure that symlinks have Linux link names, independent of source OS + header, err := tar.FileInfoHeader(fi, filepath.ToSlash(target)) + if err != nil { + return nil, err + } + return header, nil +} + +func hasModeSymLink(fi os.FileInfo) bool { + return fi.Mode()&os.ModeSymlink != 0 +} + +func hasModeSocket(fi os.FileInfo) fs.FileMode { + return fi.Mode() & os.ModeSocket +} + +func writeRootHeader(tw TarWriter, basePath string, mode int64, uid int, gid int, normalizeModTime bool) error { + rootHeader := &tar.Header{ + Typeflag: tar.TypeDir, + Name: basePath, + Mode: mode, + } + + finalizeHeader(rootHeader, uid, gid, mode, normalizeModTime) + + if err := tw.WriteHeader(rootHeader); err != nil { + return err + } + + return nil +} + +func modePermIfNegativeMode(mode int64) int64 { + if mode == -1 { + return int64(fs.ModePerm) + } + return mode +} diff --git a/vendor/github.com/buildpacks/pack/pkg/archive/umask_unix.go b/vendor/github.com/buildpacks/pack/pkg/archive/umask_unix.go new file mode 100644 index 0000000000..bfbf75a582 --- /dev/null +++ b/vendor/github.com/buildpacks/pack/pkg/archive/umask_unix.go @@ -0,0 +1,13 @@ +//go:build unix + +package archive + +import ( + "io/fs" + "syscall" +) + +func init() { + Umask = fs.FileMode(syscall.Umask(0)) + syscall.Umask(int(Umask)) +} diff --git a/vendor/github.com/buildpacks/pack/pkg/blob/blob.go b/vendor/github.com/buildpacks/pack/pkg/blob/blob.go index 1846435c4f..5919a303ef 100644 --- a/vendor/github.com/buildpacks/pack/pkg/blob/blob.go +++ b/vendor/github.com/buildpacks/pack/pkg/blob/blob.go @@ -58,7 +58,6 @@ func (b blob) Open() (r io.ReadCloser, err error) { defer fh.Close() return gzr.Close() }) - return rc, nil } diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/builder.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/builder.go index 1d7562a5fe..222f1e5770 100644 --- a/vendor/github.com/buildpacks/pack/pkg/buildpack/builder.go +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/builder.go @@ -3,12 +3,14 @@ package buildpack import ( "archive/tar" "compress/gzip" + "fmt" "io" "os" - - "github.com/buildpacks/imgutil/layer" + "path/filepath" + "strconv" "github.com/buildpacks/imgutil" + "github.com/buildpacks/imgutil/layer" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/layout" @@ -16,6 +18,8 @@ import ( "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/pkg/errors" + "github.com/buildpacks/pack/pkg/logging" + "github.com/buildpacks/pack/internal/stack" "github.com/buildpacks/pack/internal/style" "github.com/buildpacks/pack/pkg/archive" @@ -35,6 +39,12 @@ type layoutImage struct { v1.Image } +type toAdd struct { + tarPath string + diffID string + module BuildModule +} + func (i *layoutImage) SetLabel(key string, val string) error { configFile, err := i.ConfigFile() if err != nil { @@ -61,25 +71,98 @@ func (i *layoutImage) AddLayerWithDiffID(path, _ string) error { return nil } +type PackageBuilderOption func(*options) error + +type options struct { + flatten bool + depth int + exclude []string + logger logging.Logger + factory archive.TarWriterFactory +} + type PackageBuilder struct { - buildpack BuildModule - dependencies []BuildModule - imageFactory ImageFactory + buildpack BuildModule + extension BuildModule + logger logging.Logger + layerWriterFactory archive.TarWriterFactory + dependencies ManagedCollection + imageFactory ImageFactory + flattenAllBuildpacks bool + flattenExcludeBuildpacks []string } // TODO: Rename to PackageBuilder -func NewBuilder(imageFactory ImageFactory) *PackageBuilder { +func NewBuilder(imageFactory ImageFactory, ops ...PackageBuilderOption) *PackageBuilder { + opts := &options{} + for _, op := range ops { + if err := op(opts); err != nil { + return nil + } + } + moduleManager := NewModuleManager(opts.flatten, opts.depth) return &PackageBuilder{ - imageFactory: imageFactory, + imageFactory: imageFactory, + dependencies: *moduleManager, + flattenAllBuildpacks: opts.flatten && opts.depth < 0, + flattenExcludeBuildpacks: opts.exclude, + logger: opts.logger, + layerWriterFactory: opts.factory, + } +} + +func WithFlatten(depth int, exclude []string) PackageBuilderOption { + return func(o *options) error { + o.flatten = true + o.depth = depth + o.exclude = exclude + return nil + } +} + +func WithLogger(logger logging.Logger) PackageBuilderOption { + return func(o *options) error { + o.logger = logger + return nil + } +} + +func WithLayerWriterFactory(factory archive.TarWriterFactory) PackageBuilderOption { + return func(o *options) error { + o.factory = factory + return nil } } func (b *PackageBuilder) SetBuildpack(buildpack BuildModule) { b.buildpack = buildpack } +func (b *PackageBuilder) SetExtension(extension BuildModule) { + b.extension = extension +} func (b *PackageBuilder) AddDependency(buildpack BuildModule) { - b.dependencies = append(b.dependencies, buildpack) + b.dependencies.AddModules(buildpack) +} + +func (b *PackageBuilder) AddDependencies(main BuildModule, dependencies []BuildModule) { + b.dependencies.AddModules(main, dependencies...) +} + +func (b *PackageBuilder) ShouldFlatten(module BuildModule) bool { + return b.flattenAllBuildpacks || (b.dependencies.ShouldFlatten(module)) +} + +func (b *PackageBuilder) FlattenedModules() [][]BuildModule { + return b.dependencies.FlattenedModules() +} + +func (b *PackageBuilder) AllModules() []BuildModule { + all := b.dependencies.ExplodedModules() + for _, modules := range b.dependencies.FlattenedModules() { + all = append(all, modules...) + } + return all } func (b *PackageBuilder) finalizeImage(image WorkableImage, tmpDir string) error { @@ -90,8 +173,54 @@ func (b *PackageBuilder) finalizeImage(image WorkableImage, tmpDir string) error return err } - bpLayers := dist.ModuleLayers{} - for _, bp := range append(b.dependencies, b.buildpack) { + collectionToAdd := map[string]toAdd{} + var individualBuildModules []BuildModule + + // Let's create the tarball for each flatten module + if len(b.FlattenedModules()) > 0 { + buildModuleWriter := NewBuildModuleWriter(b.logger, b.layerWriterFactory) + excludedModules := Set(b.flattenExcludeBuildpacks) + + var ( + finalTarPath string + err error + ) + for i, additionalModules := range b.FlattenedModules() { + modFlattenTmpDir := filepath.Join(tmpDir, fmt.Sprintf("buildpack-%s-flatten", strconv.Itoa(i))) + if err := os.MkdirAll(modFlattenTmpDir, os.ModePerm); err != nil { + return errors.Wrap(err, "creating flatten temp dir") + } + + if b.flattenAllBuildpacks { + // include the buildpack itself + additionalModules = append(additionalModules, b.buildpack) + } + finalTarPath, individualBuildModules, err = buildModuleWriter.NToLayerTar(modFlattenTmpDir, fmt.Sprintf("buildpack-flatten-%s", strconv.Itoa(i)), additionalModules, excludedModules) + if err != nil { + return errors.Wrapf(err, "adding layer %s", finalTarPath) + } + + diffID, err := dist.LayerDiffID(finalTarPath) + if err != nil { + return errors.Wrapf(err, "calculating diffID for layer %s", finalTarPath) + } + + for _, module := range additionalModules { + collectionToAdd[module.Descriptor().Info().FullName()] = toAdd{ + tarPath: finalTarPath, + diffID: diffID.String(), + module: module, + } + } + } + } + + if !b.flattenAllBuildpacks || len(b.FlattenedModules()) == 0 { + individualBuildModules = append(individualBuildModules, b.buildpack) + } + + // Let's create the tarball for each individual module + for _, bp := range append(b.dependencies.ExplodedModules(), individualBuildModules...) { bpLayerTar, err := ToLayerTar(tmpDir, bp) if err != nil { return err @@ -104,12 +233,34 @@ func (b *PackageBuilder) finalizeImage(image WorkableImage, tmpDir string) error style.Symbol(bp.Descriptor().Info().FullName()), ) } + collectionToAdd[bp.Descriptor().Info().FullName()] = toAdd{ + tarPath: bpLayerTar, + diffID: diffID.String(), + module: bp, + } + } - if err := image.AddLayerWithDiffID(bpLayerTar, diffID.String()); err != nil { - return errors.Wrapf(err, "adding layer tar for buildpack %s", style.Symbol(bp.Descriptor().Info().FullName())) + bpLayers := dist.ModuleLayers{} + diffIDAdded := map[string]string{} + + for key := range collectionToAdd { + module := collectionToAdd[key] + bp := module.module + addLayer := true + if b.ShouldFlatten(bp) { + if _, ok := diffIDAdded[module.diffID]; !ok { + diffIDAdded[module.diffID] = module.tarPath + } else { + addLayer = false + } + } + if addLayer { + if err := image.AddLayerWithDiffID(module.tarPath, module.diffID); err != nil { + return errors.Wrapf(err, "adding layer tar for buildpack %s", style.Symbol(bp.Descriptor().Info().FullName())) + } } - dist.AddToLayersMD(bpLayers, bp.Descriptor(), diffID.String()) + dist.AddToLayersMD(bpLayers, bp.Descriptor(), module.diffID) } if err := dist.SetLabel(image, dist.BuildpackLayersLabel, bpLayers); err != nil { @@ -119,17 +270,54 @@ func (b *PackageBuilder) finalizeImage(image WorkableImage, tmpDir string) error return nil } -func (b *PackageBuilder) validate() error { - if b.buildpack == nil { - return errors.New("buildpack must be set") +func (b *PackageBuilder) finalizeExtensionImage(image WorkableImage, tmpDir string) error { + if err := dist.SetLabel(image, MetadataLabel, &Metadata{ + ModuleInfo: b.extension.Descriptor().Info(), + }); err != nil { + return err } - if err := validateBuildpacks(b.buildpack, b.dependencies); err != nil { + exLayers := dist.ModuleLayers{} + exLayerTar, err := ToLayerTar(tmpDir, b.extension) + if err != nil { return err } - if len(b.resolvedStacks()) == 0 { - return errors.Errorf("no compatible stacks among provided buildpacks") + diffID, err := dist.LayerDiffID(exLayerTar) + if err != nil { + return errors.Wrapf(err, + "getting content hashes for extension %s", + style.Symbol(b.extension.Descriptor().Info().FullName()), + ) + } + + if err := image.AddLayerWithDiffID(exLayerTar, diffID.String()); err != nil { + return errors.Wrapf(err, "adding layer tar for extension %s", style.Symbol(b.extension.Descriptor().Info().FullName())) + } + + dist.AddToLayersMD(exLayers, b.extension.Descriptor(), diffID.String()) + + if err := dist.SetLabel(image, dist.ExtensionLayersLabel, exLayers); err != nil { + return err + } + + return nil +} + +func (b *PackageBuilder) validate() error { + if b.buildpack == nil && b.extension == nil { + return errors.New("buildpack or extension must be set") + } + + // we don't need to validate extensions because there are no order or stacks in extensions + if b.buildpack != nil && b.extension == nil { + if err := validateBuildpacks(b.buildpack, b.AllModules()); err != nil { + return err + } + + if len(b.resolvedStacks()) == 0 { + return errors.Errorf("no compatible stacks among provided buildpacks") + } } return nil @@ -137,7 +325,7 @@ func (b *PackageBuilder) validate() error { func (b *PackageBuilder) resolvedStacks() []dist.Stack { stacks := b.buildpack.Descriptor().Stacks() - for _, bp := range b.dependencies { + for _, bp := range b.AllModules() { bpd := bp.Descriptor() if len(stacks) == 0 { @@ -160,16 +348,28 @@ func (b *PackageBuilder) SaveAsFile(path, imageOS string) error { return errors.Wrap(err, "creating layout image") } - tmpDir, err := os.MkdirTemp("", "package-buildpack") + tempDirName := "" + if b.buildpack != nil { + tempDirName = "package-buildpack" + } else if b.extension != nil { + tempDirName = "extension-buildpack" + } + + tmpDir, err := os.MkdirTemp("", tempDirName) if err != nil { return err } defer os.RemoveAll(tmpDir) - if err := b.finalizeImage(layoutImage, tmpDir); err != nil { - return err + if b.buildpack != nil { + if err := b.finalizeImage(layoutImage, tmpDir); err != nil { + return err + } + } else if b.extension != nil { + if err := b.finalizeExtensionImage(layoutImage, tmpDir); err != nil { + return err + } } - layoutDir, err := os.MkdirTemp(tmpDir, "oci-layout") if err != nil { return errors.Wrap(err, "creating oci-layout temp dir") @@ -239,15 +439,26 @@ func (b *PackageBuilder) SaveAsImage(repoName string, publish bool, imageOS stri if err != nil { return nil, errors.Wrapf(err, "creating image") } + tempDirName := "" + if b.buildpack != nil { + tempDirName = "package-buildpack" + } else if b.extension != nil { + tempDirName = "extension-buildpack" + } - tmpDir, err := os.MkdirTemp("", "package-buildpack") + tmpDir, err := os.MkdirTemp("", tempDirName) if err != nil { return nil, err } defer os.RemoveAll(tmpDir) - - if err := b.finalizeImage(image, tmpDir); err != nil { - return nil, err + if b.buildpack != nil { + if err := b.finalizeImage(image, tmpDir); err != nil { + return nil, err + } + } else if b.extension != nil { + if err := b.finalizeExtensionImage(image, tmpDir); err != nil { + return nil, err + } } if err := image.Save(); err != nil { diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/buildpack.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/buildpack.go index 96ef94d719..a085510a2d 100644 --- a/vendor/github.com/buildpacks/pack/pkg/buildpack/buildpack.go +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/buildpack.go @@ -7,6 +7,7 @@ import ( "os" "path" "path/filepath" + "strings" "github.com/BurntSushi/toml" "github.com/buildpacks/lifecycle/api" @@ -34,11 +35,13 @@ type BuildModule interface { type Descriptor interface { API() *api.Version EnsureStackSupport(stackID string, providedMixins []string, validateRunStageMixins bool) error + EnsureTargetSupport(os, arch, distroName, distroVersion string) error EscapedID() string Info() dist.ModuleInfo Kind() string Order() dist.Order Stacks() []dist.Stack + Targets() []dist.Target } type Blob interface { @@ -74,6 +77,9 @@ func FromBuildpackRootBlob(blob Blob, layerWriterFactory archive.TarWriterFactor if err := readDescriptor(KindBuildpack, &descriptor, blob); err != nil { return nil, err } + if err := detectPlatformSpecificValues(&descriptor, blob); err != nil { + return nil, err + } if err := validateBuildpackDescriptor(descriptor); err != nil { return nil, err } @@ -117,6 +123,35 @@ func readDescriptor(kind string, descriptor interface{}, blob Blob) error { return nil } +func detectPlatformSpecificValues(descriptor *dist.BuildpackDescriptor, blob Blob) error { + if val, err := hasFile(blob, path.Join("bin", "build")); val { + descriptor.WithLinuxBuild = true + } else if err != nil { + return err + } + if val, err := hasFile(blob, path.Join("bin", "build.bat")); val { + descriptor.WithWindowsBuild = true + } else if err != nil { + return err + } + if val, err := hasFile(blob, path.Join("bin", "build.exe")); val { + descriptor.WithWindowsBuild = true + } else if err != nil { + return err + } + return nil +} + +func hasFile(blob Blob, file string) (bool, error) { + rc, err := blob.Open() + if err != nil { + return false, errors.Wrapf(err, "open %s", "buildpack bin/") + } + defer rc.Close() + _, _, err = archive.ReadTarEntry(rc, file) + return err == nil, nil +} + func buildpackFrom(descriptor Descriptor, blob Blob, layerWriterFactory archive.TarWriterFactory) (BuildModule, error) { return &buildModule{ descriptor: descriptor, @@ -245,19 +280,11 @@ func validateBuildpackDescriptor(bpd dist.BuildpackDescriptor) error { return errors.Errorf("%s is required", style.Symbol("buildpack.version")) } - if len(bpd.Order()) == 0 && len(bpd.Stacks()) == 0 { + if len(bpd.Order()) >= 1 && (len(bpd.Stacks()) >= 1 || len(bpd.Targets()) >= 1) { return errors.Errorf( - "buildpack %s: must have either %s or an %s defined", - style.Symbol(bpd.Info().FullName()), - style.Symbol("stacks"), - style.Symbol("order"), - ) - } - - if len(bpd.Order()) >= 1 && len(bpd.Stacks()) >= 1 { - return errors.Errorf( - "buildpack %s: cannot have both %s and an %s defined", + "buildpack %s: cannot have both %s/%s and an %s defined", style.Symbol(bpd.Info().FullName()), + style.Symbol("targets"), style.Symbol("stacks"), style.Symbol("order"), ) @@ -299,3 +326,287 @@ func ToLayerTar(dest string, module BuildModule) (string, error) { return layerTar, nil } + +func ToNLayerTar(dest string, module BuildModule) ([]ModuleTar, error) { + modReader, err := module.Open() + if err != nil { + return nil, errors.Wrap(err, "opening blob") + } + defer modReader.Close() + + tarCollection := newModuleTarCollection(dest) + tr := tar.NewReader(modReader) + + var ( + header *tar.Header + forWindows bool + ) + + for { + header, err = tr.Next() + if err != nil { + if err == io.EOF { + return handleEmptyModule(dest, module) + } + return nil, err + } + if _, err := sanitizePath(header.Name); err != nil { + return nil, err + } + if header.Name == "Files" { + forWindows = true + } + if strings.Contains(header.Name, `/cnb/buildpacks/`) || strings.Contains(header.Name, `\cnb\buildpacks\`) { + // Only for Windows, the first four headers are: + // - Files + // - Hives + // - Files/cnb + // - Files/cnb/buildpacks + // Skip over these until we find "Files/cnb/buildpacks/": + break + } + } + // The header should look like "/cnb/buildpacks/" + // The version should be blank because the first header is missing . + origID, origVersion := parseBpIDAndVersion(header) + if origVersion != "" { + return nil, fmt.Errorf("first header '%s' contained unexpected version", header.Name) + } + + if err := toNLayerTar(origID, origVersion, header, tr, tarCollection, forWindows); err != nil { + return nil, err + } + + errs := tarCollection.close() + if len(errs) > 0 { + return nil, errors.New("closing files") + } + + return tarCollection.moduleTars(), nil +} + +func toNLayerTar(origID, origVersion string, firstHeader *tar.Header, tr *tar.Reader, tc *moduleTarCollection, forWindows bool) error { + toWrite := []*tar.Header{firstHeader} + if origVersion == "" { + // the first header only contains the id - e.g., /cnb/buildpacks/, + // read the next header to get the version + secondHeader, err := tr.Next() + if err != nil { + return fmt.Errorf("getting second header: %w; first header was %s", err, firstHeader.Name) + } + if _, err := sanitizePath(secondHeader.Name); err != nil { + return err + } + nextID, nextVersion := parseBpIDAndVersion(secondHeader) + if nextID != origID || nextVersion == "" { + return fmt.Errorf("second header '%s' contained unexpected id or missing version", secondHeader.Name) + } + origVersion = nextVersion + toWrite = append(toWrite, secondHeader) + } else { + // the first header contains id and version - e.g., /cnb/buildpacks//, + // we need to write the parent header - e.g., /cnb/buildpacks/ + realFirstHeader := *firstHeader + realFirstHeader.Name = filepath.ToSlash(filepath.Dir(firstHeader.Name)) + toWrite = append([]*tar.Header{&realFirstHeader}, toWrite...) + } + if forWindows { + toWrite = append(windowsPreamble(), toWrite...) + } + mt, err := tc.get(origID, origVersion) + if err != nil { + return fmt.Errorf("getting module from collection: %w", err) + } + for _, h := range toWrite { + if err := mt.writer.WriteHeader(h); err != nil { + return fmt.Errorf("failed to write header '%s': %w", h.Name, err) + } + } + // write the rest of the package + var header *tar.Header + for { + header, err = tr.Next() + if err != nil { + if err == io.EOF { + return nil + } + return fmt.Errorf("getting next header: %w", err) + } + if _, err := sanitizePath(header.Name); err != nil { + return err + } + nextID, nextVersion := parseBpIDAndVersion(header) + if nextID != origID || nextVersion != origVersion { + // we found a new module, recurse + return toNLayerTar(nextID, nextVersion, header, tr, tc, forWindows) + } + + err = mt.writer.WriteHeader(header) + if err != nil { + return fmt.Errorf("failed to write header for '%s': %w", header.Name, err) + } + + buf, err := io.ReadAll(tr) + if err != nil { + return fmt.Errorf("failed to read contents of '%s': %w", header.Name, err) + } + + _, err = mt.writer.Write(buf) + if err != nil { + return fmt.Errorf("failed to write contents to '%s': %w", header.Name, err) + } + } +} + +func sanitizePath(path string) (string, error) { + if strings.Contains(path, "..") { + return "", fmt.Errorf("path %s contains unexpected special elements", path) + } + return path, nil +} + +func windowsPreamble() []*tar.Header { + return []*tar.Header{ + { + Name: "Files", + Typeflag: tar.TypeDir, + }, + { + Name: "Hives", + Typeflag: tar.TypeDir, + }, + { + Name: "Files/cnb", + Typeflag: tar.TypeDir, + }, + { + Name: "Files/cnb/buildpacks", + Typeflag: tar.TypeDir, + }, + } +} + +func parseBpIDAndVersion(hdr *tar.Header) (id, version string) { + // splitting "/cnb/buildpacks/{ID}/{version}/*" returns + // [0] = "" -> first element is empty or "Files" in windows + // [1] = "cnb" + // [2] = "buildpacks" + // [3] = "{ID}" + // [4] = "{version}" + // ... + parts := strings.Split(strings.ReplaceAll(filepath.Clean(hdr.Name), `\`, `/`), `/`) + size := len(parts) + switch { + case size < 4: + // error + case size == 4: + id = parts[3] + case size >= 5: + id = parts[3] + version = parts[4] + } + return id, version +} + +func handleEmptyModule(dest string, module BuildModule) ([]ModuleTar, error) { + tarFile, err := ToLayerTar(dest, module) + if err != nil { + return nil, err + } + layerTar := &moduleTar{ + info: module.Descriptor().Info(), + path: tarFile, + } + return []ModuleTar{layerTar}, nil +} + +// Set returns a set of the given string slice. +func Set(exclude []string) map[string]struct{} { + type void struct{} + var member void + var excludedModules = make(map[string]struct{}) + for _, fullName := range exclude { + excludedModules[fullName] = member + } + return excludedModules +} + +type ModuleTar interface { + Info() dist.ModuleInfo + Path() string +} + +type moduleTar struct { + info dist.ModuleInfo + path string + writer archive.TarWriter +} + +func (t *moduleTar) Info() dist.ModuleInfo { + return t.info +} + +func (t *moduleTar) Path() string { + return t.path +} + +func newModuleTar(dest, id, version string) (moduleTar, error) { + layerTar := filepath.Join(dest, fmt.Sprintf("%s.%s.tar", id, version)) + fh, err := os.Create(layerTar) + if err != nil { + return moduleTar{}, errors.Wrapf(err, "creating file at path %s", layerTar) + } + return moduleTar{ + info: dist.ModuleInfo{ + ID: id, + Version: version, + }, + path: layerTar, + writer: tar.NewWriter(fh), + }, nil +} + +type moduleTarCollection struct { + rootPath string + modules map[string]moduleTar +} + +func newModuleTarCollection(rootPath string) *moduleTarCollection { + return &moduleTarCollection{ + rootPath: rootPath, + modules: map[string]moduleTar{}, + } +} + +func (m *moduleTarCollection) get(id, version string) (moduleTar, error) { + key := fmt.Sprintf("%s@%s", id, version) + if _, ok := m.modules[key]; !ok { + module, err := newModuleTar(m.rootPath, id, version) + if err != nil { + return moduleTar{}, err + } + m.modules[key] = module + } + return m.modules[key], nil +} + +func (m *moduleTarCollection) moduleTars() []ModuleTar { + var modulesTar []ModuleTar + for _, v := range m.modules { + v := v + vv := &v + modulesTar = append(modulesTar, vv) + } + return modulesTar +} + +func (m *moduleTarCollection) close() []error { + var errors []error + for _, v := range m.modules { + err := v.writer.Close() + if err != nil { + errors = append(errors, err) + } + } + return errors +} diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/buildpack_tar_writer.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/buildpack_tar_writer.go new file mode 100644 index 0000000000..c38823cfb4 --- /dev/null +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/buildpack_tar_writer.go @@ -0,0 +1,137 @@ +package buildpack + +import ( + "archive/tar" + "fmt" + "io" + "os" + "path" + "path/filepath" + "strings" + + "github.com/buildpacks/lifecycle/buildpack" + "github.com/pkg/errors" + + "github.com/buildpacks/pack/internal/style" + "github.com/buildpacks/pack/pkg/archive" + "github.com/buildpacks/pack/pkg/logging" +) + +type BuildModuleWriter struct { + logger logging.Logger + factory archive.TarWriterFactory +} + +// NewBuildModuleWriter creates a BuildModule writer +func NewBuildModuleWriter(logger logging.Logger, factory archive.TarWriterFactory) *BuildModuleWriter { + return &BuildModuleWriter{ + logger: logger, + factory: factory, + } +} + +// NToLayerTar creates a tar file containing the all the Buildpacks given, but excluding the ones which FullName() is +// in the exclude list. It returns the path to the tar file, the list of Buildpacks that were excluded, and any error +func (b *BuildModuleWriter) NToLayerTar(tarPath, filename string, modules []BuildModule, exclude map[string]struct{}) (string, []BuildModule, error) { + layerTar := filepath.Join(tarPath, fmt.Sprintf("%s.tar", filename)) + tarFile, err := os.Create(layerTar) + b.logger.Debugf("creating file %s", style.Symbol(layerTar)) + if err != nil { + return "", nil, errors.Wrap(err, "create file for tar") + } + + defer tarFile.Close() + tw := b.factory.NewWriter(tarFile) + defer tw.Close() + + parentFolderAdded := map[string]bool{} + duplicated := map[string]bool{} + + var buildModuleExcluded []BuildModule + for _, module := range modules { + if _, ok := exclude[module.Descriptor().Info().FullName()]; !ok { + if !duplicated[module.Descriptor().Info().FullName()] { + duplicated[module.Descriptor().Info().FullName()] = true + b.logger.Debugf("adding %s", style.Symbol(module.Descriptor().Info().FullName())) + + if err := b.writeBuildModuleToTar(tw, module, &parentFolderAdded); err != nil { + return "", nil, errors.Wrapf(err, "adding %s", style.Symbol(module.Descriptor().Info().FullName())) + } + rootPath := processRootPath(module) + if !parentFolderAdded[rootPath] { + parentFolderAdded[rootPath] = true + } + } else { + b.logger.Debugf("skipping %s, it was already added", style.Symbol(module.Descriptor().Info().FullName())) + } + } else { + b.logger.Debugf("excluding %s from being flattened", style.Symbol(module.Descriptor().Info().FullName())) + buildModuleExcluded = append(buildModuleExcluded, module) + } + } + + b.logger.Debugf("%s was created successfully", style.Symbol(layerTar)) + return layerTar, buildModuleExcluded, nil +} + +// writeBuildModuleToTar writes the content of the given tar file into the writer, skipping the folders that were already added +func (b *BuildModuleWriter) writeBuildModuleToTar(tw archive.TarWriter, module BuildModule, parentFolderAdded *map[string]bool) error { + var ( + rc io.ReadCloser + err error + ) + + if rc, err = module.Open(); err != nil { + return err + } + defer rc.Close() + + tr := tar.NewReader(rc) + + for { + header, err := tr.Next() + if err == io.EOF { + break + } + if err != nil { + return errors.Wrap(err, "failed to get next tar entry") + } + + if (*parentFolderAdded)[header.Name] { + b.logger.Debugf("folder %s was already added, skipping it", style.Symbol(header.Name)) + continue + } + + err = tw.WriteHeader(header) + if err != nil { + return errors.Wrapf(err, "failed to write header for '%s'", header.Name) + } + + buf, err := io.ReadAll(tr) + if err != nil { + return errors.Wrapf(err, "failed to read contents of '%s'", header.Name) + } + + _, err = tw.Write(buf) + if err != nil { + return errors.Wrapf(err, "failed to write contents to '%s'", header.Name) + } + } + + return nil +} + +func processRootPath(module BuildModule) string { + var bpFolder string + switch module.Descriptor().Kind() { + case buildpack.KindBuildpack: + bpFolder = "buildpacks" + case buildpack.KindExtension: + bpFolder = "extensions" + default: + bpFolder = "buildpacks" + } + bpInfo := module.Descriptor().Info() + rootPath := path.Join("/cnb", bpFolder, strings.ReplaceAll(bpInfo.ID, "/", "_")) + return rootPath +} diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/downloader.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/downloader.go index 512018c218..41a5a61cdb 100644 --- a/vendor/github.com/buildpacks/pack/pkg/buildpack/downloader.go +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/downloader.go @@ -96,7 +96,6 @@ func (c *buildpackDownloader) Download(ctx context.Context, moduleURI string, op return nil, nil, err } } - var mainBP BuildModule var depBPs []BuildModule switch locatorType { @@ -198,13 +197,12 @@ func extractPackaged(ctx context.Context, kind string, pkgImageRef string, fetch case KindBuildpack: mainModule, depModules, err = extractBuildpacks(pkgImage) case KindExtension: - return nil, nil, nil // TODO: add extractExtensions when `pack extension package` is supported in https://github.com/buildpacks/pack/issues/1489 + mainModule, err = extractExtensions(pkgImage) default: return nil, nil, fmt.Errorf("unknown module kind: %s", kind) } if err != nil { return nil, nil, errors.Wrapf(err, "extracting %ss from %s", kind, style.Symbol(pkgImageRef)) } - return mainModule, depModules, nil } diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/locator_type.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/locator_type.go index 4a7f201846..0019cc9004 100644 --- a/vendor/github.com/buildpacks/pack/pkg/buildpack/locator_type.go +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/locator_type.go @@ -92,7 +92,6 @@ func parseNakedLocator(locator, relativeBaseDir string, buildpacksFromBuilder [] // 2. Does it match a buildpack ID in the builder // 3. Does it look like a Buildpack Registry ID // 4. Does it look like a Docker ref - if isLocalFile(locator, relativeBaseDir) { return URILocator } diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/managed_collection.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/managed_collection.go new file mode 100644 index 0000000000..6f60433723 --- /dev/null +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/managed_collection.go @@ -0,0 +1,149 @@ +package buildpack + +import ( + "github.com/buildpacks/pack/pkg/dist" +) + +const ( + FlattenMaxDepth = -1 + FlattenNone = 0 +) + +type ManagedCollection struct { + explodedModules []BuildModule + flattenedModules [][]BuildModule + flatten bool + maxDepth int +} + +func NewModuleManager(flatten bool, maxDepth int) *ManagedCollection { + return &ManagedCollection{ + flatten: flatten, + maxDepth: maxDepth, + explodedModules: []BuildModule{}, + flattenedModules: [][]BuildModule{}, + } +} + +// AllModules returns all explodedModules handle by the manager +func (f *ManagedCollection) AllModules() []BuildModule { + all := f.explodedModules + for _, modules := range f.flattenedModules { + all = append(all, modules...) + } + return all +} + +// ExplodedModules returns all modules that will be added to the output artifact as a single layer containing a single module. +func (f *ManagedCollection) ExplodedModules() []BuildModule { + return f.explodedModules +} + +// FlattenedModules returns all modules that will be added to the output artifact as a single layer containing multiple modules. +func (f *ManagedCollection) FlattenedModules() [][]BuildModule { + if f.flatten { + return f.flattenedModules + } + return nil +} + +// AddModules determines whether the explodedModules must be added as flattened or not. It uses +// flatten and maxDepth configuration given during initialization of the manager. +func (f *ManagedCollection) AddModules(main BuildModule, deps ...BuildModule) { + if !f.flatten { + // default behavior + f.explodedModules = append(f.explodedModules, append([]BuildModule{main}, deps...)...) + } else { + if f.maxDepth <= FlattenMaxDepth { + // flatten all + if len(f.flattenedModules) == 1 { + f.flattenedModules[0] = append(f.flattenedModules[0], append([]BuildModule{main}, deps...)...) + } else { + f.flattenedModules = append(f.flattenedModules, append([]BuildModule{main}, deps...)) + } + } else { + recurser := newFlattenModuleRecurser(f.maxDepth) + calculatedModules := recurser.calculateFlattenedModules(main, deps, 0) + for _, modules := range calculatedModules { + if len(modules) == 1 { + f.explodedModules = append(f.explodedModules, modules...) + } else { + f.flattenedModules = append(f.flattenedModules, modules) + } + } + } + } +} + +// ShouldFlatten returns true if the given module is flattened. +func (f *ManagedCollection) ShouldFlatten(module BuildModule) bool { + if f.flatten { + for _, modules := range f.flattenedModules { + for _, v := range modules { + if v == module { + return true + } + } + } + } + return false +} + +type flattenModuleRecurser struct { + maxDepth int +} + +func newFlattenModuleRecurser(maxDepth int) *flattenModuleRecurser { + return &flattenModuleRecurser{ + maxDepth: maxDepth, + } +} + +// calculateFlattenedModules returns groups of modules that will be added to the output artifact as a single layer containing multiple modules. +// It takes the given main module and its dependencies and based on the depth it will recursively calculate the groups of modules inspecting if the main +// module is a composited Buildpack or not until it reaches the maxDepth. +func (f *flattenModuleRecurser) calculateFlattenedModules(main BuildModule, deps []BuildModule, depth int) [][]BuildModule { + modules := make([][]BuildModule, 0) + groups := main.Descriptor().Order() + if len(groups) > 0 { + if depth == f.maxDepth { + modules = append(modules, append([]BuildModule{main}, deps...)) + } + if depth < f.maxDepth { + nextBPs, nextDeps := buildpacksFromGroups(groups, deps) + modules = append(modules, []BuildModule{main}) + for _, bp := range nextBPs { + modules = append(modules, f.calculateFlattenedModules(bp, nextDeps, depth+1)...) + } + } + } else { + // It is not a composited Buildpack, we add it as a single module + modules = append(modules, []BuildModule{main}) + } + return modules +} + +// buildpacksFromGroups +func buildpacksFromGroups(order dist.Order, deps []BuildModule) ([]BuildModule, []BuildModule) { + bps := make([]BuildModule, 0) + newDeps := make([]BuildModule, 0) + + type void struct{} + var member void + set := make(map[string]void) + for _, groups := range order { + for _, group := range groups.Group { + set[group.FullName()] = member + } + } + + for _, dep := range deps { + if _, ok := set[dep.Descriptor().Info().FullName()]; ok { + bps = append(bps, dep) + } else { + newDeps = append(newDeps, dep) + } + } + + return bps, newDeps +} diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/oci_layout_package.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/oci_layout_package.go index 4a131562aa..eab5516ce4 100644 --- a/vendor/github.com/buildpacks/pack/pkg/buildpack/oci_layout_package.go +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/oci_layout_package.go @@ -4,6 +4,7 @@ import ( "archive/tar" "compress/gzip" "encoding/json" + "fmt" "io" "path" "strings" @@ -41,7 +42,7 @@ func IsOCILayoutBlob(blob blob2.Blob) (bool, error) { // BuildpacksFromOCILayoutBlob constructs buildpacks from a blob in OCI layout format. func BuildpacksFromOCILayoutBlob(blob Blob) (mainBP BuildModule, dependencies []BuildModule, err error) { - layoutPackage, err := newOCILayoutPackage(blob) + layoutPackage, err := newOCILayoutPackage(blob, KindBuildpack) if err != nil { return nil, nil, err } @@ -51,11 +52,16 @@ func BuildpacksFromOCILayoutBlob(blob Blob) (mainBP BuildModule, dependencies [] // ExtensionsFromOCILayoutBlob constructs extensions from a blob in OCI layout format. func ExtensionsFromOCILayoutBlob(blob Blob) (mainExt BuildModule, err error) { - return nil, nil // TODO: add extractExtensions when `pack extension package` is supported in https://github.com/buildpacks/pack/issues/1489 + layoutPackage, err := newOCILayoutPackage(blob, KindExtension) + if err != nil { + return nil, err + } + + return extractExtensions(layoutPackage) } func ConfigFromOCILayoutBlob(blob Blob) (config v1.ImageConfig, err error) { - layoutPackage, err := newOCILayoutPackage(blob) + layoutPackage, err := newOCILayoutPackage(blob, KindBuildpack) if err != nil { return v1.ImageConfig{}, err } @@ -68,7 +74,7 @@ type ociLayoutPackage struct { blob Blob } -func newOCILayoutPackage(blob Blob) (*ociLayoutPackage, error) { +func newOCILayoutPackage(blob Blob, kind string) (*ociLayoutPackage, error) { index := &v1.Index{} if err := unmarshalJSONFromBlob(blob, "/index.json", index); err != nil { @@ -96,10 +102,20 @@ func newOCILayoutPackage(blob Blob) (*ociLayoutPackage, error) { if err := unmarshalJSONFromBlob(blob, pathFromDescriptor(manifest.Config), imageInfo); err != nil { return nil, err } - - layersLabel := imageInfo.Config.Labels[dist.BuildpackLayersLabel] - if layersLabel == "" { - return nil, errors.Errorf("label %s not found", style.Symbol(dist.BuildpackLayersLabel)) + var layersLabel string + switch kind { + case KindBuildpack: + layersLabel = imageInfo.Config.Labels[dist.BuildpackLayersLabel] + if layersLabel == "" { + return nil, errors.Errorf("label %s not found", style.Symbol(dist.BuildpackLayersLabel)) + } + case KindExtension: + layersLabel = imageInfo.Config.Labels[dist.ExtensionLayersLabel] + if layersLabel == "" { + return nil, errors.Errorf("label %s not found", style.Symbol(dist.ExtensionLayersLabel)) + } + default: + return nil, fmt.Errorf("unknown module kind: %s", kind) } bpLayers := dist.ModuleLayers{} diff --git a/vendor/github.com/buildpacks/pack/pkg/buildpack/package.go b/vendor/github.com/buildpacks/pack/pkg/buildpack/package.go index 62096292a3..012864c927 100644 --- a/vendor/github.com/buildpacks/pack/pkg/buildpack/package.go +++ b/vendor/github.com/buildpacks/pack/pkg/buildpack/package.go @@ -2,6 +2,7 @@ package buildpack import ( "io" + "strings" "sync" "github.com/pkg/errors" @@ -32,6 +33,8 @@ func (s *syncPkg) GetLayer(diffID string) (io.ReadCloser, error) { return s.pkg.GetLayer(diffID) } +// extractBuildpacks when provided a flattened buildpack package containing N buildpacks, +// will return N modules: 1 module with a single tar containing ALL N buildpacks, and N-1 modules with empty tar files. func extractBuildpacks(pkg Package) (mainBP BuildModule, depBPs []BuildModule, err error) { pkg = &syncPkg{pkg: pkg} md := &Metadata{} @@ -57,6 +60,27 @@ func extractBuildpacks(pkg Package) (mainBP BuildModule, depBPs []BuildModule, e ) } + // Example `dist.ModuleLayers{}`: + // + //{ + // "samples/hello-moon": { + // "0.0.1": { + // "api": "0.2", + // "stacks": [ + // { + // "id": "*" + // } + // ], + // "layerDiffID": "sha256:37ab46923c181aa5fb27c9a23479a38aec2679237f35a0ea4115e5ae81a17bba", + // "homepage": "https://github.com/buildpacks/samples/tree/main/buildpacks/hello-moon", + // "name": "Hello Moon Buildpack" + // } + // } + //} + + // If the package is a flattened buildpack, the first buildpack in the package returns all the tar content, + // and subsequent buildpacks return an empty tar. + var processedDiffIDs = make(map[string]bool) for bpID, v := range pkgLayers { for bpVersion, bpInfo := range v { desc := dist.BuildpackDescriptor{ @@ -67,13 +91,22 @@ func extractBuildpacks(pkg Package) (mainBP BuildModule, depBPs []BuildModule, e Homepage: bpInfo.Homepage, Name: bpInfo.Name, }, - WithStacks: bpInfo.Stacks, - WithOrder: bpInfo.Order, + WithStacks: bpInfo.Stacks, + WithTargets: bpInfo.Targets, + WithOrder: bpInfo.Order, } diffID := bpInfo.LayerDiffID // Allow use in closure - b := &openerBlob{ - opener: func() (io.ReadCloser, error) { + + var openerFunc func() (io.ReadCloser, error) + if _, ok := processedDiffIDs[diffID]; ok { + // We already processed a layer with this diffID, so the module must be flattened; + // return an empty reader to avoid multiple tars with the same content. + openerFunc = func() (io.ReadCloser, error) { + return io.NopCloser(strings.NewReader("")), nil + } + } else { + openerFunc = func() (io.ReadCloser, error) { rc, err := pkg.GetLayer(diffID) if err != nil { return nil, errors.Wrapf(err, @@ -83,10 +116,15 @@ func extractBuildpacks(pkg Package) (mainBP BuildModule, depBPs []BuildModule, e ) } return rc, nil - }, + } + processedDiffIDs[diffID] = true + } + + b := &openerBlob{ + opener: openerFunc, } - if desc.Info().Match(md.ModuleInfo) { // This is the order buildpack of the package + if desc.Info().Match(md.ModuleInfo) { // Current module is the order buildpack of the package mainBP = FromBlob(&desc, b) } else { depBPs = append(depBPs, FromBlob(&desc, b)) @@ -97,6 +135,63 @@ func extractBuildpacks(pkg Package) (mainBP BuildModule, depBPs []BuildModule, e return mainBP, depBPs, nil } +func extractExtensions(pkg Package) (mainExt BuildModule, err error) { + pkg = &syncPkg{pkg: pkg} + md := &Metadata{} + if found, err := dist.GetLabel(pkg, MetadataLabel, md); err != nil { + return nil, err + } else if !found { + return nil, errors.Errorf( + "could not find label %s", + style.Symbol(MetadataLabel), + ) + } + + pkgLayers := dist.ModuleLayers{} + ok, err := dist.GetLabel(pkg, dist.ExtensionLayersLabel, &pkgLayers) + if err != nil { + return nil, err + } + + if !ok { + return nil, errors.Errorf( + "could not find label %s", + style.Symbol(dist.ExtensionLayersLabel), + ) + } + for extID, v := range pkgLayers { + for extVersion, extInfo := range v { + desc := dist.ExtensionDescriptor{ + WithAPI: extInfo.API, + WithInfo: dist.ModuleInfo{ + ID: extID, + Version: extVersion, + Homepage: extInfo.Homepage, + Name: extInfo.Name, + }, + } + + diffID := extInfo.LayerDiffID // Allow use in closure + b := &openerBlob{ + opener: func() (io.ReadCloser, error) { + rc, err := pkg.GetLayer(diffID) + if err != nil { + return nil, errors.Wrapf(err, + "extracting extension %s layer (diffID %s)", + style.Symbol(desc.Info().FullName()), + style.Symbol(diffID), + ) + } + return rc, nil + }, + } + + mainExt = FromBlob(&desc, b) + } + } + return mainExt, nil +} + type openerBlob struct { opener func() (io.ReadCloser, error) } diff --git a/vendor/github.com/buildpacks/pack/internal/cache/bind_cache.go b/vendor/github.com/buildpacks/pack/pkg/cache/bind_cache.go similarity index 100% rename from vendor/github.com/buildpacks/pack/internal/cache/bind_cache.go rename to vendor/github.com/buildpacks/pack/pkg/cache/bind_cache.go diff --git a/vendor/github.com/buildpacks/pack/internal/cache/cache_opts.go b/vendor/github.com/buildpacks/pack/pkg/cache/cache_opts.go similarity index 83% rename from vendor/github.com/buildpacks/pack/internal/cache/cache_opts.go rename to vendor/github.com/buildpacks/pack/pkg/cache/cache_opts.go index d95c4a8854..07e0f57fd6 100644 --- a/vendor/github.com/buildpacks/pack/internal/cache/cache_opts.go +++ b/vendor/github.com/buildpacks/pack/pkg/cache/cache_opts.go @@ -18,6 +18,7 @@ type CacheInfo struct { type CacheOpts struct { Build CacheInfo Launch CacheInfo + Kaniko CacheInfo } const ( @@ -139,22 +140,21 @@ func sanitize(c *CacheOpts) error { } } - if c.Build.Format == CacheBind || c.Launch.Format == CacheBind { - var ( - resolvedPath string - err error - ) - if c.Build.Format == CacheBind { - if resolvedPath, err = filepath.Abs(c.Build.Source); err != nil { - return errors.Wrap(err, "resolve absolute path") - } - c.Build.Source = filepath.Join(resolvedPath, "build-cache") - } else { - if resolvedPath, err = filepath.Abs(c.Launch.Source); err != nil { - return errors.Wrap(err, "resolve absolute path") - } - c.Launch.Source = filepath.Join(resolvedPath, "launch-cache") + var ( + resolvedPath string + err error + ) + if c.Build.Format == CacheBind { + if resolvedPath, err = filepath.Abs(c.Build.Source); err != nil { + return errors.Wrap(err, "resolve absolute path") + } + c.Build.Source = filepath.Join(resolvedPath, "build-cache") + } + if c.Launch.Format == CacheBind { + if resolvedPath, err = filepath.Abs(c.Launch.Source); err != nil { + return errors.Wrap(err, "resolve absolute path") } + c.Launch.Source = filepath.Join(resolvedPath, "launch-cache") } return nil } diff --git a/vendor/github.com/buildpacks/pack/internal/cache/consts.go b/vendor/github.com/buildpacks/pack/pkg/cache/consts.go similarity index 100% rename from vendor/github.com/buildpacks/pack/internal/cache/consts.go rename to vendor/github.com/buildpacks/pack/pkg/cache/consts.go diff --git a/vendor/github.com/buildpacks/pack/internal/cache/image_cache.go b/vendor/github.com/buildpacks/pack/pkg/cache/image_cache.go similarity index 100% rename from vendor/github.com/buildpacks/pack/internal/cache/image_cache.go rename to vendor/github.com/buildpacks/pack/pkg/cache/image_cache.go diff --git a/vendor/github.com/buildpacks/pack/internal/cache/volume_cache.go b/vendor/github.com/buildpacks/pack/pkg/cache/volume_cache.go similarity index 100% rename from vendor/github.com/buildpacks/pack/internal/cache/volume_cache.go rename to vendor/github.com/buildpacks/pack/pkg/cache/volume_cache.go diff --git a/vendor/github.com/buildpacks/pack/pkg/client/build.go b/vendor/github.com/buildpacks/pack/pkg/client/build.go index 2ad7f187d6..9e5c3f295e 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/build.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/build.go @@ -7,6 +7,7 @@ import ( "fmt" "os" "path/filepath" + "runtime" "sort" "strings" "time" @@ -16,10 +17,7 @@ import ( "github.com/buildpacks/imgutil/layout" "github.com/buildpacks/imgutil/local" "github.com/buildpacks/imgutil/remote" - "github.com/buildpacks/lifecycle/platform" - - "github.com/buildpacks/pack/internal/paths" - + "github.com/buildpacks/lifecycle/platform/files" "github.com/docker/docker/api/types" "github.com/docker/docker/volume/mounts" "github.com/google/go-containerregistry/pkg/name" @@ -28,15 +26,16 @@ import ( "github.com/buildpacks/pack/internal/build" "github.com/buildpacks/pack/internal/builder" - "github.com/buildpacks/pack/internal/cache" internalConfig "github.com/buildpacks/pack/internal/config" pname "github.com/buildpacks/pack/internal/name" + "github.com/buildpacks/pack/internal/paths" "github.com/buildpacks/pack/internal/stack" "github.com/buildpacks/pack/internal/stringset" "github.com/buildpacks/pack/internal/style" "github.com/buildpacks/pack/internal/termui" "github.com/buildpacks/pack/pkg/archive" "github.com/buildpacks/pack/pkg/buildpack" + "github.com/buildpacks/pack/pkg/cache" "github.com/buildpacks/pack/pkg/dist" "github.com/buildpacks/pack/pkg/image" "github.com/buildpacks/pack/pkg/logging" @@ -99,7 +98,7 @@ type BuildOptions struct { DockerHost string // Used to determine a run-image mirror if Run Image is empty. - // Used in combination with Builder metadata to determine to the the 'best' mirror. + // Used in combination with Builder metadata to determine to the 'best' mirror. // 'best' is defined as: // - if Publish is true, the best mirror matches registry we are publishing to. // - if Publish is false, the best mirror matches a registry specified in Image. @@ -135,6 +134,11 @@ type BuildOptions struct { // share both an ID and Version with a buildpack on the builder. Buildpacks []string + // List of extension images or archives to add to a builder. + // These extensions may overwrite those on the builder if they + // share both an ID and Version with an extension on the builder. + Extensions []string + // Additional image tags to push to, each will contain contents identical to Image AdditionalTags []string @@ -317,7 +321,7 @@ func (c *Client) Build(ctx context.Context, opts BuildOptions) error { return errors.Wrapf(err, "invalid builder %s", style.Symbol(opts.Builder)) } - runImageName := c.resolveRunImage(opts.RunImage, imgRegistry, builderRef.Context().RegistryStr(), bldr.Stack(), opts.AdditionalMirrors, opts.Publish) + runImageName := c.resolveRunImage(opts.RunImage, imgRegistry, builderRef.Context().RegistryStr(), bldr.DefaultRunImage(), opts.AdditionalMirrors, opts.Publish) fetchOptions := image.FetchOptions{Daemon: !opts.Publish, PullPolicy: opts.PullPolicy} if opts.Layout() { @@ -350,39 +354,100 @@ func (c *Client) Build(ctx context.Context, opts BuildOptions) error { return err } - if err := c.validateMixins(fetchedBPs, bldr, runImageName, runMixins); err != nil { - return errors.Wrap(err, "validating stack mixins") - } - - buildEnvs := map[string]string{} - for _, envVar := range opts.ProjectDescriptor.Build.Env { - buildEnvs[envVar.Name] = envVar.Value + fetchedExs, orderExtensions, err := c.processExtensions(ctx, bldr.Image(), bldr.Extensions(), bldr.OrderExtensions(), bldr.StackID, opts) + if err != nil { + return err } - for k, v := range opts.Env { - buildEnvs[k] = v + imgOS, err := rawBuilderImage.OS() + if err != nil { + return errors.Wrapf(err, "getting builder OS") } - ephemeralBuilder, err := c.createEphemeralBuilder(rawBuilderImage, buildEnvs, order, fetchedBPs) - if err != nil { - return err + // Default mode: if the TrustBuilder option is not set, trust the suggested builders. + if opts.TrustBuilder == nil { + opts.TrustBuilder = IsSuggestedBuilderFunc } - defer c.docker.ImageRemove(context.Background(), ephemeralBuilder.Name(), types.ImageRemoveOptions{Force: true}) + // Ensure the builder's platform APIs are supported var builderPlatformAPIs builder.APISet - builderPlatformAPIs = append(builderPlatformAPIs, ephemeralBuilder.LifecycleDescriptor().APIs.Platform.Deprecated...) - builderPlatformAPIs = append(builderPlatformAPIs, ephemeralBuilder.LifecycleDescriptor().APIs.Platform.Supported...) - + builderPlatformAPIs = append(builderPlatformAPIs, bldr.LifecycleDescriptor().APIs.Platform.Deprecated...) + builderPlatformAPIs = append(builderPlatformAPIs, bldr.LifecycleDescriptor().APIs.Platform.Supported...) if !supportsPlatformAPI(builderPlatformAPIs) { c.logger.Debugf("pack %s supports Platform API(s): %s", c.version, strings.Join(build.SupportedPlatformAPIVersions.AsStrings(), ", ")) c.logger.Debugf("Builder %s supports Platform API(s): %s", style.Symbol(opts.Builder), strings.Join(builderPlatformAPIs.AsStrings(), ", ")) return errors.Errorf("Builder %s is incompatible with this version of pack", style.Symbol(opts.Builder)) } - imgOS, err := rawBuilderImage.OS() + // Get the platform API version to use + lifecycleVersion := bldr.LifecycleDescriptor().Info.Version + useCreator := supportsCreator(lifecycleVersion) && opts.TrustBuilder(opts.Builder) + var ( + lifecycleOptsLifecycleImage string + lifecycleAPIs []string + ) + if !(useCreator) { + // fetch the lifecycle image + if supportsLifecycleImage(lifecycleVersion) { + lifecycleImageName := opts.LifecycleImage + if lifecycleImageName == "" { + lifecycleImageName = fmt.Sprintf("%s:%s", internalConfig.DefaultLifecycleImageRepo, lifecycleVersion.String()) + } + + imgArch, err := rawBuilderImage.Architecture() + if err != nil { + return errors.Wrapf(err, "getting builder architecture") + } + + lifecycleImage, err := c.imageFetcher.Fetch( + ctx, + lifecycleImageName, + image.FetchOptions{Daemon: true, PullPolicy: opts.PullPolicy, Platform: fmt.Sprintf("%s/%s", imgOS, imgArch)}, + ) + if err != nil { + return fmt.Errorf("fetching lifecycle image: %w", err) + } + + lifecycleOptsLifecycleImage = lifecycleImage.Name() + labels, err := lifecycleImage.Labels() + if err != nil { + return fmt.Errorf("reading labels of lifecycle image: %w", err) + } + + lifecycleAPIs, err = extractSupportedLifecycleApis(labels) + if err != nil { + return fmt.Errorf("reading api versions of lifecycle image: %w", err) + } + } + } + + usingPlatformAPI, err := build.FindLatestSupported(append( + bldr.LifecycleDescriptor().APIs.Platform.Deprecated, + bldr.LifecycleDescriptor().APIs.Platform.Supported...), + lifecycleAPIs) if err != nil { - return errors.Wrapf(err, "getting builder OS") + return fmt.Errorf("finding latest supported Platform API: %w", err) + } + if usingPlatformAPI.LessThan("0.12") { + if err = c.validateMixins(fetchedBPs, bldr, runImageName, runMixins); err != nil { + return fmt.Errorf("validating stack mixins: %w", err) + } + } + + buildEnvs := map[string]string{} + for _, envVar := range opts.ProjectDescriptor.Build.Env { + buildEnvs[envVar.Name] = envVar.Value + } + + for k, v := range opts.Env { + buildEnvs[k] = v + } + + ephemeralBuilder, err := c.createEphemeralBuilder(rawBuilderImage, buildEnvs, order, fetchedBPs, orderExtensions, fetchedExs, usingPlatformAPI.LessThan("0.12")) + if err != nil { + return err } + defer c.docker.ImageRemove(context.Background(), ephemeralBuilder.Name(), types.ImageRemoveOptions{Force: true}) if len(bldr.OrderExtensions()) > 0 { if !c.experimental { @@ -419,12 +484,12 @@ func (c *Client) Build(ctx context.Context, opts BuildOptions) error { return err } - projectMetadata := platform.ProjectMetadata{} + projectMetadata := files.ProjectMetadata{} if c.experimental { version := opts.ProjectDescriptor.Project.Version sourceURL := opts.ProjectDescriptor.Project.SourceURL if version != "" || sourceURL != "" { - projectMetadata.Source = &platform.ProjectSource{ + projectMetadata.Source = &files.ProjectSource{ Type: "project", Version: map[string]interface{}{"declared": version}, Metadata: map[string]interface{}{"url": sourceURL}, @@ -434,11 +499,10 @@ func (c *Client) Build(ctx context.Context, opts BuildOptions) error { } } - // Default mode: if the TrustBuilder option is not set, trust the suggested builders. - if opts.TrustBuilder == nil { - opts.TrustBuilder = IsSuggestedBuilderFunc + fetchRunImage := func(name string) error { + _, err := c.imageFetcher.Fetch(ctx, name, fetchOptions) + return err } - lifecycleOpts := build.LifecycleOptions{ AppPath: appPath, Image: imageRef, @@ -446,11 +510,12 @@ func (c *Client) Build(ctx context.Context, opts BuildOptions) error { BuilderImage: builderRef.Name(), LifecycleImage: ephemeralBuilder.Name(), RunImage: runImageName, + FetchRunImage: fetchRunImage, ProjectMetadata: projectMetadata, ClearCache: opts.ClearCache, Publish: opts.Publish, TrustBuilder: opts.TrustBuilder(opts.Builder), - UseCreator: false, + UseCreator: useCreator, DockerHost: opts.DockerHost, Cache: opts.Cache, CacheImage: opts.CacheImage, @@ -473,61 +538,19 @@ func (c *Client) Build(ctx context.Context, opts BuildOptions) error { Layout: opts.Layout(), } - lifecycleVersion := ephemeralBuilder.LifecycleDescriptor().Info.Version - // Technically the creator is supported as of platform API version 0.3 (lifecycle version 0.7.0+) but earlier versions - // have bugs that make using the creator problematic. - lifecycleSupportsCreator := !lifecycleVersion.LessThan(semver.MustParse(minLifecycleVersionSupportingCreator)) - - if lifecycleSupportsCreator && opts.TrustBuilder(opts.Builder) { + switch { + case useCreator: lifecycleOpts.UseCreator = true - // no need to fetch a lifecycle image, it won't be used - if err := c.lifecycleExecutor.Execute(ctx, lifecycleOpts); err != nil { - return errors.Wrap(err, "executing lifecycle") - } - - return c.logImageNameAndSha(ctx, opts.Publish, imageRef) - } - - if !opts.TrustBuilder(opts.Builder) { - if lifecycleImageSupported(imgOS, lifecycleVersion) { - lifecycleImageName := opts.LifecycleImage - if lifecycleImageName == "" { - lifecycleImageName = fmt.Sprintf("%s:%s", internalConfig.DefaultLifecycleImageRepo, lifecycleVersion.String()) - } - - imgArch, err := rawBuilderImage.Architecture() - if err != nil { - return errors.Wrapf(err, "getting builder architecture") - } - - lifecycleImage, err := c.imageFetcher.Fetch( - ctx, - lifecycleImageName, - image.FetchOptions{Daemon: true, PullPolicy: opts.PullPolicy, Platform: fmt.Sprintf("%s/%s", imgOS, imgArch)}, - ) - if err != nil { - return errors.Wrap(err, "fetching lifecycle image") - } - - lifecycleOpts.LifecycleImage = lifecycleImage.Name() - labels, err := lifecycleImage.Labels() - if err != nil { - return errors.Wrap(err, "reading labels of lifecycle image") - } - - lifecycleOpts.LifecycleApis, err = extractSupportedLifecycleApis(labels) - if err != nil { - return errors.Wrap(err, "reading api versions of lifecycle image") - } - } else { - return errors.Errorf("Lifecycle %s does not have an associated lifecycle image. Builder must be trusted.", lifecycleVersion.String()) - } + case supportsLifecycleImage(lifecycleVersion): + lifecycleOpts.LifecycleImage = lifecycleOptsLifecycleImage + lifecycleOpts.LifecycleApis = lifecycleAPIs + case !opts.TrustBuilder(opts.Builder): + return errors.Errorf("Lifecycle %s does not have an associated lifecycle image. Builder must be trusted.", lifecycleVersion.String()) } - if err := c.lifecycleExecutor.Execute(ctx, lifecycleOpts); err != nil { - return errors.Wrap(err, "executing lifecycle. This may be the result of using an untrusted builder") + if err = c.lifecycleExecutor.Execute(ctx, lifecycleOpts); err != nil { + return fmt.Errorf("executing lifecycle: %w", err) } - return c.logImageNameAndSha(ctx, opts.Publish, imageRef) } @@ -537,18 +560,18 @@ func extractSupportedLifecycleApis(labels map[string]string) ([]string, error) { // io.buildpacks.lifecycle.apis":"{\"buildpack\":{\"deprecated\":[],\"supported\":[\"0.2\",\"0.3\",\"0.4\",\"0.5\",\"0.6\",\"0.7\",\"0.8\",\"0.9\"]},\"platform\":{\"deprecated\":[],\"supported\":[\"0.3\",\"0.4\",\"0.5\",\"0.6\",\"0.7\",\"0.8\",\"0.9\",\"0.10\"]}}\",\"io.buildpacks.lifecycle.version\":\"0.15.3\"}") // This struct is defined in lifecycle-repository/tools/image/main.go#Descriptor -- we could consider moving it from the main package to an importable location. - var bpPlatformApi struct { + var bpPlatformAPI struct { Platform struct { Deprecated []string Supported []string } } if len(labels["io.buildpacks.lifecycle.apis"]) > 0 { - err := json.Unmarshal([]byte(labels["io.buildpacks.lifecycle.apis"]), &bpPlatformApi) + err := json.Unmarshal([]byte(labels["io.buildpacks.lifecycle.apis"]), &bpPlatformAPI) if err != nil { return nil, err } - return append(bpPlatformApi.Platform.Deprecated, bpPlatformApi.Platform.Supported...), nil + return append(bpPlatformAPI.Platform.Deprecated, bpPlatformAPI.Platform.Supported...), nil } return []string{}, nil } @@ -568,7 +591,13 @@ func getFileFilter(descriptor projectTypes.Descriptor) (func(string) bool, error return nil, nil } -func lifecycleImageSupported(builderOS string, lifecycleVersion *builder.Version) bool { +func supportsCreator(lifecycleVersion *builder.Version) bool { + // Technically the creator is supported as of platform API version 0.3 (lifecycle version 0.7.0+) but earlier versions + // have bugs that make using the creator problematic. + return !lifecycleVersion.LessThan(semver.MustParse(minLifecycleVersionSupportingCreator)) +} + +func supportsLifecycleImage(lifecycleVersion *builder.Version) bool { return lifecycleVersion.Equal(builder.VersionMustParse(prevLifecycleVersionSupportingImage)) || !lifecycleVersion.LessThan(semver.MustParse(minLifecycleVersionSupportingImage)) } @@ -599,7 +628,7 @@ func (c *Client) getBuilder(img imgutil.Image) (*builder.Builder, error) { if err != nil { return nil, err } - if bldr.Stack().RunImage.Image == "" { + if bldr.Stack().RunImage.Image == "" && len(bldr.RunImages()) == 0 { return nil, errors.New("builder metadata is missing run-image") } @@ -698,8 +727,9 @@ func allBuildpacks(builderImage imgutil.Image, additionalBuildpacks []buildpack. ID: id, Version: ver, }, - WithStacks: bp.Stacks, - WithOrder: bp.Order, + WithStacks: bp.Stacks, + WithTargets: bp.Targets, + WithOrder: bp.Order, } all = append(all, &desc) } @@ -915,7 +945,7 @@ func (c *Client) processBuildpacks(ctx context.Context, builderImage imgutil.Ima order = newOrder } default: - newFetchedBPs, moduleInfo, err := c.fetchBuildpack(ctx, bp, relativeBaseDir, builderImage, builderBPs, opts) + newFetchedBPs, moduleInfo, err := c.fetchBuildpack(ctx, bp, relativeBaseDir, builderImage, builderBPs, opts, buildpack.KindBuildpack) if err != nil { return fetchedBPs, order, err } @@ -949,7 +979,7 @@ func (c *Client) processBuildpacks(ctx context.Context, builderImage imgutil.Ima if len(preBuildpacks) > 0 || len(postBuildpacks) > 0 { order = builderOrder for _, bp := range preBuildpacks { - newFetchedBPs, moduleInfo, err := c.fetchBuildpack(ctx, bp, relativeBaseDir, builderImage, builderBPs, opts) + newFetchedBPs, moduleInfo, err := c.fetchBuildpack(ctx, bp, relativeBaseDir, builderImage, builderBPs, opts, buildpack.KindBuildpack) if err != nil { return fetchedBPs, order, err } @@ -958,7 +988,7 @@ func (c *Client) processBuildpacks(ctx context.Context, builderImage imgutil.Ima } for _, bp := range postBuildpacks { - newFetchedBPs, moduleInfo, err := c.fetchBuildpack(ctx, bp, relativeBaseDir, builderImage, builderBPs, opts) + newFetchedBPs, moduleInfo, err := c.fetchBuildpack(ctx, bp, relativeBaseDir, builderImage, builderBPs, opts, buildpack.KindBuildpack) if err != nil { return fetchedBPs, order, err } @@ -971,7 +1001,7 @@ func (c *Client) processBuildpacks(ctx context.Context, builderImage imgutil.Ima return fetchedBPs, order, nil } -func (c *Client) fetchBuildpack(ctx context.Context, bp string, relativeBaseDir string, builderImage imgutil.Image, builderBPs []dist.ModuleInfo, opts BuildOptions) ([]buildpack.BuildModule, *dist.ModuleInfo, error) { +func (c *Client) fetchBuildpack(ctx context.Context, bp string, relativeBaseDir string, builderImage imgutil.Image, builderBPs []dist.ModuleInfo, opts BuildOptions, kind string) ([]buildpack.BuildModule, *dist.ModuleInfo, error) { pullPolicy := opts.PullPolicy publish := opts.Publish registry := opts.Registry @@ -995,13 +1025,17 @@ func (c *Client) fetchBuildpack(ctx context.Context, bp string, relativeBaseDir if err != nil { return nil, nil, errors.Wrapf(err, "getting OS from %s", style.Symbol(builderImage.Name())) } - mainBP, depBPs, err := c.buildpackDownloader.Download(ctx, bp, buildpack.DownloadOptions{ + downloadOptions := buildpack.DownloadOptions{ RegistryName: registry, ImageOS: imageOS, RelativeBaseDir: relativeBaseDir, Daemon: !publish, PullPolicy: pullPolicy, - }) + } + if kind == buildpack.KindExtension { + downloadOptions.ModuleKind = kind + } + mainBP, depBPs, err := c.buildpackDownloader.Download(ctx, bp, downloadOptions) if err != nil { return nil, nil, errors.Wrap(err, "downloading buildpack") } @@ -1053,17 +1087,51 @@ func prependBuildpackToOrder(order dist.Order, bpInfo dist.ModuleInfo) (newOrder ModuleInfo: bpInfo, Optional: false, }} - for _, g := range newEntry.Group { - newGroup = append(newGroup, g) - } - newEntry.Group = newGroup + newEntry.Group = append(newGroup, newEntry.Group...) newOrder = append(newOrder, newEntry) } return newOrder } -func (c *Client) createEphemeralBuilder(rawBuilderImage imgutil.Image, env map[string]string, order dist.Order, buildpacks []buildpack.BuildModule) (*builder.Builder, error) { +func (c *Client) processExtensions(ctx context.Context, builderImage imgutil.Image, builderExs []dist.ModuleInfo, builderOrder dist.Order, stackID string, opts BuildOptions) (fetchedExs []buildpack.BuildModule, orderExtensions dist.Order, err error) { + relativeBaseDir := opts.RelativeBaseDir + declaredExs := opts.Extensions + + orderExtensions = dist.Order{{Group: []dist.ModuleRef{}}} + for _, ex := range declaredExs { + locatorType, err := buildpack.GetLocatorType(ex, relativeBaseDir, builderExs) + if err != nil { + return nil, nil, err + } + + switch locatorType { + case buildpack.RegistryLocator: + return nil, nil, errors.New("RegistryLocator type is not valid for extensions") + case buildpack.FromBuilderLocator: + return nil, nil, errors.New("from builder is not supported for extensions") + default: + newFetchedExs, moduleInfo, err := c.fetchBuildpack(ctx, ex, relativeBaseDir, builderImage, builderExs, opts, buildpack.KindExtension) + if err != nil { + return fetchedExs, orderExtensions, err + } + fetchedExs = append(fetchedExs, newFetchedExs...) + orderExtensions = prependBuildpackToOrder(orderExtensions, *moduleInfo) + } + } + + return fetchedExs, orderExtensions, nil +} + +func (c *Client) createEphemeralBuilder( + rawBuilderImage imgutil.Image, + env map[string]string, + order dist.Order, + buildpacks []buildpack.BuildModule, + orderExtensions dist.Order, + extensions []buildpack.BuildModule, + validateMixins bool, +) (*builder.Builder, error) { origBuilderName := rawBuilderImage.Name() bldr, err := builder.New(rawBuilderImage, fmt.Sprintf("pack.local/builder/%x:latest", randString(10))) if err != nil { @@ -1081,6 +1149,18 @@ func (c *Client) createEphemeralBuilder(rawBuilderImage imgutil.Image, env map[s bldr.SetOrder(order) } + for _, ex := range extensions { + exInfo := ex.Descriptor().Info() + c.logger.Debugf("Adding extension %s version %s to builder", style.Symbol(exInfo.ID), style.Symbol(exInfo.Version)) + bldr.AddExtension(ex) + } + if len(orderExtensions) > 0 && len(orderExtensions[0].Group) > 0 { + c.logger.Debug("Setting custom order for extensions") + bldr.SetOrderExtensions(orderExtensions) + } + + bldr.SetValidateMixins(validateMixins) + if err := bldr.Save(c.logger, builder.CreatorMetadata{Version: c.version}); err != nil { return nil, err } @@ -1101,11 +1181,15 @@ func randString(n int) string { } func processVolumes(imgOS string, volumes []string) (processed []string, warnings []string, err error) { - parserOS := mounts.OSLinux - if imgOS == "windows" { - parserOS = mounts.OSWindows + var parser mounts.Parser + switch "windows" { + case imgOS: + parser = mounts.NewWindowsParser() + case runtime.GOOS: + parser = mounts.NewLCOWParser() + default: + parser = mounts.NewLinuxParser() } - parser := mounts.NewParser(parserOS) for _, v := range volumes { volume, err := parser.ParseMountRaw(v, "") if err != nil { @@ -1143,12 +1227,12 @@ func (c *Client) logImageNameAndSha(ctx context.Context, publish bool, imageRef img, err := c.imageFetcher.Fetch(ctx, imageRef.Name(), image.FetchOptions{Daemon: !publish, PullPolicy: image.PullNever}) if err != nil { - return errors.Wrap(err, "fetching built image") + return fmt.Errorf("fetching built image: %w", err) } id, err := img.Identifier() if err != nil { - return errors.Wrap(err, "reading image sha") + return fmt.Errorf("reading image sha: %w", err) } // Remove tag, if it exists, from the image name diff --git a/vendor/github.com/buildpacks/pack/pkg/client/common.go b/vendor/github.com/buildpacks/pack/pkg/client/common.go index b6e0e8ec29..d6b4901cda 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/common.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/common.go @@ -18,7 +18,7 @@ func (c *Client) parseTagReference(imageName string) (name.Reference, error) { return nil, errors.New("image is a required parameter") } if _, err := name.ParseReference(imageName, name.WeakValidation); err != nil { - return nil, err + return nil, fmt.Errorf("'%s' is not a valid tag reference: %s", imageName, err) } ref, err := name.NewTag(imageName, name.WeakValidation) if err != nil { @@ -28,7 +28,7 @@ func (c *Client) parseTagReference(imageName string) (name.Reference, error) { return ref, nil } -func (c *Client) resolveRunImage(runImage, imgRegistry, bldrRegistry string, stackInfo builder.StackMetadata, additionalMirrors map[string][]string, publish bool) string { +func (c *Client) resolveRunImage(runImage, imgRegistry, bldrRegistry string, runImageMetadata builder.RunImageMetadata, additionalMirrors map[string][]string, publish bool) string { if runImage != "" { c.logger.Debugf("Using provided run-image %s", style.Symbol(runImage)) return runImage @@ -41,15 +41,15 @@ func (c *Client) resolveRunImage(runImage, imgRegistry, bldrRegistry string, sta runImageName := getBestRunMirror( preferredRegistry, - stackInfo.RunImage.Image, - stackInfo.RunImage.Mirrors, - additionalMirrors[stackInfo.RunImage.Image], + runImageMetadata.Image, + runImageMetadata.Mirrors, + additionalMirrors[runImageMetadata.Image], ) switch { - case runImageName == stackInfo.RunImage.Image: + case runImageName == runImageMetadata.Image: c.logger.Debugf("Selected run image %s", style.Symbol(runImageName)) - case contains(stackInfo.RunImage.Mirrors, runImageName): + case contains(runImageMetadata.Mirrors, runImageName): c.logger.Debugf("Selected run image mirror %s", style.Symbol(runImageName)) default: c.logger.Debugf("Selected run image mirror %s from local config", style.Symbol(runImageName)) @@ -108,17 +108,13 @@ func contains(slc []string, v string) bool { } func getBestRunMirror(registry string, runImage string, mirrors []string, preferredMirrors []string) string { - var runImageList []string - runImageList = append(runImageList, preferredMirrors...) - runImageList = append(runImageList, runImage) - runImageList = append(runImageList, mirrors...) - + runImageList := append(append(append([]string{}, preferredMirrors...), runImage), mirrors...) for _, img := range runImageList { ref, err := name.ParseReference(img, name.WeakValidation) if err != nil { continue } - if ref.Context().RegistryStr() == registry { + if reg := ref.Context().RegistryStr(); reg == registry { return img } } diff --git a/vendor/github.com/buildpacks/pack/pkg/client/create_builder.go b/vendor/github.com/buildpacks/pack/pkg/client/create_builder.go index 2f728efa6d..28cd2fa7c5 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/create_builder.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/create_builder.go @@ -9,6 +9,8 @@ import ( "github.com/Masterminds/semver" "github.com/buildpacks/imgutil" "github.com/pkg/errors" + "golang.org/x/text/cases" + "golang.org/x/text/language" pubbldr "github.com/buildpacks/pack/builder" "github.com/buildpacks/pack/internal/builder" @@ -39,6 +41,15 @@ type CreateBuilderOptions struct { // Strategy for updating images before a build. PullPolicy image.PullPolicy + + // Flatten layers + Flatten bool + + // Max depth for flattening compose buildpacks. + Depth int + + // List of buildpack images to exclude from the package been flatten. + FlattenExclude []string } // CreateBuilder creates and saves a builder image to a registry with the provided options. @@ -63,7 +74,11 @@ func (c *Client) CreateBuilder(ctx context.Context, opts CreateBuilderOptions) e bldr.SetOrder(opts.Config.Order) bldr.SetOrderExtensions(opts.Config.OrderExtensions) - bldr.SetStack(opts.Config.Stack) + + if opts.Config.Stack.ID != "" { + bldr.SetStack(opts.Config.Stack) + } + bldr.SetRunImage(opts.Config.Run) return bldr.Save(c.logger, builder.CreatorMetadata{Version: c.version}) } @@ -82,43 +97,47 @@ func (c *Client) validateConfig(ctx context.Context, opts CreateBuilderOptions) func (c *Client) validateRunImageConfig(ctx context.Context, opts CreateBuilderOptions) error { var runImages []imgutil.Image - for _, i := range append([]string{opts.Config.Stack.RunImage}, opts.Config.Stack.RunImageMirrors...) { - if !opts.Publish { - img, err := c.imageFetcher.Fetch(ctx, i, image.FetchOptions{Daemon: true, PullPolicy: opts.PullPolicy}) + for _, r := range opts.Config.Run.Images { + for _, i := range append([]string{r.Image}, r.Mirrors...) { + if !opts.Publish { + img, err := c.imageFetcher.Fetch(ctx, i, image.FetchOptions{Daemon: true, PullPolicy: opts.PullPolicy}) + if err != nil { + if errors.Cause(err) != image.ErrNotFound { + return errors.Wrap(err, "failed to fetch image") + } + } else { + runImages = append(runImages, img) + continue + } + } + + img, err := c.imageFetcher.Fetch(ctx, i, image.FetchOptions{Daemon: false, PullPolicy: opts.PullPolicy}) if err != nil { if errors.Cause(err) != image.ErrNotFound { return errors.Wrap(err, "failed to fetch image") } + c.logger.Warnf("run image %s is not accessible", style.Symbol(i)) } else { runImages = append(runImages, img) - continue - } - } - - img, err := c.imageFetcher.Fetch(ctx, i, image.FetchOptions{Daemon: false, PullPolicy: opts.PullPolicy}) - if err != nil { - if errors.Cause(err) != image.ErrNotFound { - return errors.Wrap(err, "failed to fetch image") } - c.logger.Warnf("run image %s is not accessible", style.Symbol(i)) - } else { - runImages = append(runImages, img) } } for _, img := range runImages { - stackID, err := img.Label("io.buildpacks.stack.id") - if err != nil { - return errors.Wrap(err, "failed to label image") - } + if opts.Config.Stack.ID != "" { + stackID, err := img.Label("io.buildpacks.stack.id") + if err != nil { + return errors.Wrap(err, "failed to label image") + } - if stackID != opts.Config.Stack.ID { - return fmt.Errorf( - "stack %s from builder config is incompatible with stack %s from run image %s", - style.Symbol(opts.Config.Stack.ID), - style.Symbol(stackID), - style.Symbol(img.Name()), - ) + if stackID != opts.Config.Stack.ID { + return fmt.Errorf( + "stack %s from builder config is incompatible with stack %s from run image %s", + style.Symbol(opts.Config.Stack.ID), + style.Symbol(stackID), + style.Symbol(img.Name()), + ) + } } } @@ -126,13 +145,18 @@ func (c *Client) validateRunImageConfig(ctx context.Context, opts CreateBuilderO } func (c *Client) createBaseBuilder(ctx context.Context, opts CreateBuilderOptions) (*builder.Builder, error) { - baseImage, err := c.imageFetcher.Fetch(ctx, opts.Config.Stack.BuildImage, image.FetchOptions{Daemon: !opts.Publish, PullPolicy: opts.PullPolicy}) + baseImage, err := c.imageFetcher.Fetch(ctx, opts.Config.Build.Image, image.FetchOptions{Daemon: !opts.Publish, PullPolicy: opts.PullPolicy}) if err != nil { return nil, errors.Wrap(err, "fetch build image") } c.logger.Debugf("Creating builder %s from build-image %s", style.Symbol(opts.BuilderName), style.Symbol(baseImage.Name())) - bldr, err := builder.New(baseImage, opts.BuilderName) + + var builderOpts []builder.BuilderOption + if opts.Flatten { + builderOpts = append(builderOpts, builder.WithFlatten(opts.Depth, opts.FlattenExclude)) + } + bldr, err := builder.New(baseImage, opts.BuilderName, builderOpts...) if err != nil { return nil, errors.Wrap(err, "invalid build-image") } @@ -153,7 +177,7 @@ func (c *Client) createBaseBuilder(ctx context.Context, opts CreateBuilderOption bldr.SetDescription(opts.Config.Description) - if bldr.StackID != opts.Config.Stack.ID { + if opts.Config.Stack.ID != "" && bldr.StackID != opts.Config.Stack.ID { return nil, fmt.Errorf( "stack %s from builder config is incompatible with stack %s from build image", style.Symbol(opts.Config.Stack.ID), @@ -236,7 +260,6 @@ func (c *Client) addConfig(ctx context.Context, kind string, config pubbldr.Modu if err != nil { return errors.Wrapf(err, "getting OS from %s", style.Symbol(bldr.Image().Name())) } - mainBP, depBPs, err := c.buildpackDownloader.Download(ctx, config.URI, buildpack.DownloadOptions{ Daemon: !opts.Publish, ImageName: config.ImageName, @@ -249,7 +272,6 @@ func (c *Client) addConfig(ctx context.Context, kind string, config pubbldr.Modu if err != nil { return errors.Wrapf(err, "downloading %s", kind) } - err = validateModule(kind, mainBP, config.URI, config.ID, config.Version) if err != nil { return errors.Wrapf(err, "invalid %s", kind) @@ -260,7 +282,7 @@ func (c *Client) addConfig(ctx context.Context, kind string, config pubbldr.Modu if deprecatedAPI.Equal(bpDesc.API()) { c.logger.Warnf( "%s %s is using deprecated Buildpacks API version %s", - strings.Title(kind), + cases.Title(language.AmericanEnglish).String(kind), style.Symbol(bpDesc.Info().FullName()), style.Symbol(bpDesc.API().String()), ) @@ -270,22 +292,21 @@ func (c *Client) addConfig(ctx context.Context, kind string, config pubbldr.Modu // Fixes 1453 sort.Slice(depBPs, func(i, j int) bool { - compareId := strings.Compare(depBPs[i].Descriptor().Info().ID, depBPs[j].Descriptor().Info().ID) - if compareId == 0 { + compareID := strings.Compare(depBPs[i].Descriptor().Info().ID, depBPs[j].Descriptor().Info().ID) + if compareID == 0 { return strings.Compare(depBPs[i].Descriptor().Info().Version, depBPs[j].Descriptor().Info().Version) <= 0 } - return compareId < 0 + return compareID < 0 }) - for _, module := range append([]buildpack.BuildModule{mainBP}, depBPs...) { - switch kind { - case buildpack.KindBuildpack: - bldr.AddBuildpack(module) - case buildpack.KindExtension: - bldr.AddExtension(module) - default: - return fmt.Errorf("unknown module kind: %s", kind) - } + switch kind { + case buildpack.KindBuildpack: + bldr.AddBuildpacks(mainBP, depBPs) + case buildpack.KindExtension: + // Extensions can't be composite + bldr.AddExtension(mainBP) + default: + return fmt.Errorf("unknown module kind: %s", kind) } return nil } diff --git a/vendor/github.com/buildpacks/pack/pkg/client/docker.go b/vendor/github.com/buildpacks/pack/pkg/client/docker.go index a3e311c344..f637066e11 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/docker.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/docker.go @@ -6,12 +6,14 @@ import ( "github.com/docker/docker/api/types" containertypes "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/image" networktypes "github.com/docker/docker/api/types/network" specs "github.com/opencontainers/image-spec/specs-go/v1" ) // DockerClient is the subset of CommonAPIClient which required by this package type DockerClient interface { + ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error) ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error) ImageTag(ctx context.Context, image, ref string) error ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) @@ -20,12 +22,12 @@ type DockerClient interface { ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error) Info(ctx context.Context) (types.Info, error) VolumeRemove(ctx context.Context, volumeID string, force bool) error - ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, platform *specs.Platform, containerName string) (containertypes.ContainerCreateCreatedBody, error) + ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, platform *specs.Platform, containerName string) (containertypes.CreateResponse, error) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error) ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error - ContainerWait(ctx context.Context, container string, condition containertypes.WaitCondition) (<-chan containertypes.ContainerWaitOKBody, <-chan error) + ContainerWait(ctx context.Context, container string, condition containertypes.WaitCondition) (<-chan containertypes.WaitResponse, <-chan error) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error } diff --git a/vendor/github.com/buildpacks/pack/pkg/client/download_sbom.go b/vendor/github.com/buildpacks/pack/pkg/client/download_sbom.go index c0de29bf77..234dcea64a 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/download_sbom.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/download_sbom.go @@ -5,6 +5,7 @@ import ( "github.com/buildpacks/lifecycle/layers" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" "github.com/pkg/errors" "github.com/buildpacks/pack/pkg/dist" @@ -18,7 +19,7 @@ type DownloadSBOMOptions struct { // Deserialize just the subset of fields we need to avoid breaking changes type sbomMetadata struct { - BOM *platform.LayerMetadata `json:"sbom" toml:"sbom"` + BOM *files.LayerMetadata `json:"sbom" toml:"sbom"` } func (s *sbomMetadata) isMissing() bool { @@ -46,7 +47,7 @@ func (c *Client) DownloadSBOM(name string, options DownloadSBOMOptions) error { } var sbomMD sbomMetadata - if _, err := dist.GetLabel(img, platform.LayerMetadataLabel, &sbomMD); err != nil { + if _, err := dist.GetLabel(img, platform.LifecycleMetadataLabel, &sbomMD); err != nil { return err } diff --git a/vendor/github.com/buildpacks/pack/pkg/client/inspect_builder.go b/vendor/github.com/buildpacks/pack/pkg/client/inspect_builder.go index a85051d0d5..75eb542ec0 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/inspect_builder.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/inspect_builder.go @@ -22,11 +22,7 @@ type BuilderInfo struct { Mixins []string // RunImage provided by the builder. - RunImage string - - // List of all run image mirrors a builder will use to provide - // the RunImage. - RunImageMirrors []string + RunImages []pubbldr.RunImageConfig // All buildpacks included within the builder. Buildpacks []dist.ModuleInfo @@ -101,8 +97,7 @@ func (c *Client) InspectBuilder(name string, daemon bool, modifiers ...BuilderIn Description: info.Description, Stack: info.StackID, Mixins: info.Mixins, - RunImage: info.RunImage, - RunImageMirrors: info.RunImageMirrors, + RunImages: info.RunImages, Buildpacks: info.Buildpacks, Order: info.Order, BuildpackLayers: info.BuildpackLayers, diff --git a/vendor/github.com/buildpacks/pack/pkg/client/inspect_image.go b/vendor/github.com/buildpacks/pack/pkg/client/inspect_image.go index 0c0a3d00c8..e56ef4b6b8 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/inspect_image.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/inspect_image.go @@ -8,6 +8,7 @@ import ( "github.com/buildpacks/lifecycle/buildpack" "github.com/buildpacks/lifecycle/launch" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" "github.com/pkg/errors" "github.com/buildpacks/pack/pkg/dist" @@ -42,7 +43,7 @@ type ImageInfo struct { // the first 1 to k layers all belong to the run image, // the last k+1 to n layers are added by buildpacks. // the sum of all of these is our app image. - Base platform.RunImageMetadata + Base files.RunImageForRebase // BOM or Bill of materials, contains dependency and // version information provided by each buildpack. @@ -50,7 +51,7 @@ type ImageInfo struct { // Stack includes the run image name, and a list of image mirrors, // where the run image is hosted. - Stack platform.StackMetadata + Stack files.Stack // Processes lists all processes contributed by buildpacks. Processes ProcessDetails @@ -68,8 +69,8 @@ type ProcessDetails struct { // Deserialize just the subset of fields we need to avoid breaking changes type layersMetadata struct { - RunImage platform.RunImageMetadata `json:"runImage" toml:"run-image"` - Stack platform.StackMetadata `json:"stack" toml:"stack"` + RunImage files.RunImageForRebase `json:"runImage" toml:"run-image"` + Stack files.Stack `json:"stack" toml:"stack"` } const ( @@ -98,11 +99,11 @@ func (c *Client) InspectImage(name string, daemon bool) (*ImageInfo, error) { } var layersMd layersMetadata - if _, err := dist.GetLabel(img, platform.LayerMetadataLabel, &layersMd); err != nil { + if _, err := dist.GetLabel(img, platform.LifecycleMetadataLabel, &layersMd); err != nil { return nil, err } - var buildMD platform.BuildMetadata + var buildMD files.BuildMetadata if _, err := dist.GetLabel(img, platform.BuildMetadataLabel, &buildMD); err != nil { return nil, err } @@ -175,10 +176,18 @@ func (c *Client) InspectImage(name string, daemon bool) (*ImageInfo, error) { } processDetails.OtherProcesses = append(processDetails.OtherProcesses, proc) } + + var stackCompat files.Stack + if layersMd.RunImage.Image != "" { + stackCompat = layersMd.RunImage.ToStack() + } else { + stackCompat = layersMd.Stack + } + if buildMD.Extensions != nil { return &ImageInfo{ StackID: stackID, - Stack: layersMd.Stack, + Stack: stackCompat, Base: layersMd.RunImage, BOM: buildMD.BOM, Buildpacks: buildMD.Buildpacks, @@ -189,7 +198,7 @@ func (c *Client) InspectImage(name string, daemon bool) (*ImageInfo, error) { return &ImageInfo{ StackID: stackID, - Stack: layersMd.Stack, + Stack: stackCompat, Base: layersMd.RunImage, BOM: buildMD.BOM, Buildpacks: buildMD.Buildpacks, diff --git a/vendor/github.com/buildpacks/pack/pkg/client/package_buildpack.go b/vendor/github.com/buildpacks/pack/pkg/client/package_buildpack.go index 45ecdcba8e..17463007bc 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/package_buildpack.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/package_buildpack.go @@ -50,6 +50,15 @@ type PackageBuildpackOptions struct { // Name of the buildpack registry. Used to // add buildpacks to a package. Registry string + + // Flatten layers + Flatten bool + + // Max depth for flattening compose buildpacks. + Depth int + + // List of buildpack images to exclude from the package been flatten. + FlattenExclude []string } // PackageBuildpack packages buildpack(s) into either an image or file. @@ -72,7 +81,12 @@ func (c *Client) PackageBuildpack(ctx context.Context, opts PackageBuildpackOpti return errors.Wrap(err, "creating layer writer factory") } - packageBuilder := buildpack.NewBuilder(c.imageFactory) + var packageBuilderOpts []buildpack.PackageBuilderOption + if opts.Flatten { + packageBuilderOpts = append(packageBuilderOpts, buildpack.WithFlatten(opts.Depth, opts.FlattenExclude), + buildpack.WithLayerWriterFactory(writerFactory), buildpack.WithLogger(c.logger)) + } + packageBuilder := buildpack.NewBuilder(c.imageFactory, packageBuilderOpts...) bpURI := opts.Config.Buildpack.URI if bpURI == "" { @@ -92,7 +106,6 @@ func (c *Client) PackageBuildpack(ctx context.Context, opts PackageBuildpackOpti packageBuilder.SetBuildpack(bp) for _, dep := range opts.Config.Dependencies { - var depBPs []buildpack.BuildModule mainBP, deps, err := c.buildpackDownloader.Download(ctx, dep.URI, buildpack.DownloadOptions{ RegistryName: opts.Registry, RelativeBaseDir: opts.RelativeBaseDir, @@ -106,10 +119,7 @@ func (c *Client) PackageBuildpack(ctx context.Context, opts PackageBuildpackOpti return errors.Wrapf(err, "packaging dependencies (uri=%s,image=%s)", style.Symbol(dep.URI), style.Symbol(dep.ImageName)) } - depBPs = append([]buildpack.BuildModule{mainBP}, deps...) - for _, depBP := range depBPs { - packageBuilder.AddDependency(depBP) - } + packageBuilder.AddDependencies(mainBP, deps) } switch opts.Format { diff --git a/vendor/github.com/buildpacks/pack/pkg/client/package_extension.go b/vendor/github.com/buildpacks/pack/pkg/client/package_extension.go new file mode 100644 index 0000000000..93aed9d41a --- /dev/null +++ b/vendor/github.com/buildpacks/pack/pkg/client/package_extension.go @@ -0,0 +1,61 @@ +package client + +import ( + "context" + + "github.com/pkg/errors" + + "github.com/buildpacks/pack/internal/layer" + "github.com/buildpacks/pack/internal/style" + "github.com/buildpacks/pack/pkg/buildpack" +) + +// PackageExtension packages extension(s) into either an image or file. +func (c *Client) PackageExtension(ctx context.Context, opts PackageBuildpackOptions) error { + if opts.Format == "" { + opts.Format = FormatImage + } + + if opts.Config.Platform.OS == "windows" && !c.experimental { + return NewExperimentError("Windows extensionpackage support is currently experimental.") + } + + err := c.validateOSPlatform(ctx, opts.Config.Platform.OS, opts.Publish, opts.Format) + if err != nil { + return err + } + + writerFactory, err := layer.NewWriterFactory(opts.Config.Platform.OS) + if err != nil { + return errors.Wrap(err, "creating layer writer factory") + } + + packageBuilder := buildpack.NewBuilder(c.imageFactory) + + exURI := opts.Config.Extension.URI + if exURI == "" { + return errors.New("extension URI must be provided") + } + + mainBlob, err := c.downloadBuildpackFromURI(ctx, exURI, opts.RelativeBaseDir) + if err != nil { + return err + } + + ex, err := buildpack.FromExtensionRootBlob(mainBlob, writerFactory) + if err != nil { + return errors.Wrapf(err, "creating extension from %s", style.Symbol(exURI)) + } + + packageBuilder.SetExtension(ex) + + switch opts.Format { + case FormatFile: + return packageBuilder.SaveAsFile(opts.Name, opts.Config.Platform.OS) + case FormatImage: + _, err = packageBuilder.SaveAsImage(opts.Name, opts.Publish, opts.Config.Platform.OS) + return errors.Wrapf(err, "saving image") + default: + return errors.Errorf("unknown format: %s", style.Symbol(opts.Format)) + } +} diff --git a/vendor/github.com/buildpacks/pack/pkg/client/rebase.go b/vendor/github.com/buildpacks/pack/pkg/client/rebase.go index 155be67c9a..168c727573 100644 --- a/vendor/github.com/buildpacks/pack/pkg/client/rebase.go +++ b/vendor/github.com/buildpacks/pack/pkg/client/rebase.go @@ -8,6 +8,7 @@ import ( "github.com/BurntSushi/toml" "github.com/buildpacks/lifecycle" "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" "github.com/pkg/errors" "github.com/buildpacks/pack/internal/build" @@ -40,6 +41,10 @@ type RebaseOptions struct { // If provided, directory to which report.toml will be copied ReportDestinationDir string + + // Pass-through force flag to lifecycle rebase command to skip target data + // validated (will not have any effect if API < 0.12). + Force bool } // Rebase updates the run image layers in an app image. @@ -55,23 +60,29 @@ func (c *Client) Rebase(ctx context.Context, opts RebaseOptions) error { return err } - var md platform.LayersMetadataCompat - if ok, err := dist.GetLabel(appImage, platform.LayerMetadataLabel, &md); err != nil { + var md files.LayersMetadataCompat + if ok, err := dist.GetLabel(appImage, platform.LifecycleMetadataLabel, &md); err != nil { return err } else if !ok { - return errors.Errorf("could not find label %s on image", style.Symbol(platform.LayerMetadataLabel)) + return errors.Errorf("could not find label %s on image", style.Symbol(platform.LifecycleMetadataLabel)) + } + var runImageMD builder.RunImageMetadata + if md.RunImage.Image != "" { + runImageMD = builder.RunImageMetadata{ + Image: md.RunImage.Image, + Mirrors: md.RunImage.Mirrors, + } + } else if md.Stack != nil { + runImageMD = builder.RunImageMetadata{ + Image: md.Stack.RunImage.Image, + Mirrors: md.Stack.RunImage.Mirrors, + } } - runImageName := c.resolveRunImage( opts.RunImage, imageRef.Context().RegistryStr(), "", - builder.StackMetadata{ - RunImage: builder.RunImageMetadata{ - Image: md.Stack.RunImage.Image, - Mirrors: md.Stack.RunImage.Mirrors, - }, - }, + runImageMD, opts.AdditionalMirrors, opts.Publish) @@ -85,7 +96,7 @@ func (c *Client) Rebase(ctx context.Context, opts RebaseOptions) error { } c.logger.Infof("Rebasing %s on run image %s", style.Symbol(appImage.Name()), style.Symbol(baseImage.Name())) - rebaser := &lifecycle.Rebaser{Logger: c.logger, PlatformAPI: build.SupportedPlatformAPIVersions.Latest()} + rebaser := &lifecycle.Rebaser{Logger: c.logger, PlatformAPI: build.SupportedPlatformAPIVersions.Latest(), Force: opts.Force} report, err := rebaser.Rebase(appImage, baseImage, appImage.Name(), nil) if err != nil { return err diff --git a/vendor/github.com/buildpacks/pack/pkg/dist/buildmodule.go b/vendor/github.com/buildpacks/pack/pkg/dist/buildmodule.go index cc09d985a1..ec3dc99ecd 100644 --- a/vendor/github.com/buildpacks/pack/pkg/dist/buildmodule.go +++ b/vendor/github.com/buildpacks/pack/pkg/dist/buildmodule.go @@ -51,3 +51,14 @@ type Stack struct { ID string `json:"id" toml:"id"` Mixins []string `json:"mixins,omitempty" toml:"mixins,omitempty"` } + +type Target struct { + OS string `json:"os" toml:"os"` + Arch string `json:"arch" toml:"arch"` + Distributions []Distribution `json:"distributions,omitempty" toml:"distributions,omitempty"` +} + +type Distribution struct { + Name string `json:"name,omitempty" toml:"name,omitempty"` + Versions []string `json:"versions,omitempty" toml:"versions,omitempty"` +} diff --git a/vendor/github.com/buildpacks/pack/pkg/dist/buildpack_descriptor.go b/vendor/github.com/buildpacks/pack/pkg/dist/buildpack_descriptor.go index 1f1ab160c2..5714fd0c06 100644 --- a/vendor/github.com/buildpacks/pack/pkg/dist/buildpack_descriptor.go +++ b/vendor/github.com/buildpacks/pack/pkg/dist/buildpack_descriptor.go @@ -1,6 +1,7 @@ package dist import ( + "encoding/json" "fmt" "sort" "strings" @@ -12,10 +13,13 @@ import ( ) type BuildpackDescriptor struct { - WithAPI *api.Version `toml:"api"` - WithInfo ModuleInfo `toml:"buildpack"` - WithStacks []Stack `toml:"stacks"` - WithOrder Order `toml:"order"` + WithAPI *api.Version `toml:"api"` + WithInfo ModuleInfo `toml:"buildpack"` + WithStacks []Stack `toml:"stacks"` + WithTargets []Target `toml:"targets,omitempty"` + WithOrder Order `toml:"order"` + WithWindowsBuild bool + WithLinuxBuild bool } func (b *BuildpackDescriptor) EscapedID() string { @@ -24,7 +28,7 @@ func (b *BuildpackDescriptor) EscapedID() string { func (b *BuildpackDescriptor) EnsureStackSupport(stackID string, providedMixins []string, validateRunStageMixins bool) error { if len(b.Stacks()) == 0 { - return nil // Order buildpack, no validation required + return nil // Order buildpack or a buildpack using Targets, no validation required } bpMixins, err := b.findMixinsForStack(stackID) @@ -50,6 +54,66 @@ func (b *BuildpackDescriptor) EnsureStackSupport(stackID string, providedMixins return nil } +func (b *BuildpackDescriptor) EnsureTargetSupport(os, arch, distroName, distroVersion string) error { + if len(b.Targets()) == 0 { + if (!b.WithLinuxBuild && !b.WithWindowsBuild) || len(b.Stacks()) > 0 { // nolint + return nil // Order buildpack or stack buildpack, no validation required + } else if b.WithLinuxBuild && os == DefaultTargetOSLinux && arch == DefaultTargetArch { + return nil + } else if b.WithWindowsBuild && os == DefaultTargetOSWindows && arch == DefaultTargetArch { + return nil + } + } + for _, target := range b.Targets() { + if target.OS == os { + if target.Arch == "*" || arch == "" || target.Arch == arch { + if len(target.Distributions) == 0 || distroName == "" || distroVersion == "" { + return nil + } + for _, distro := range target.Distributions { + if distro.Name == distroName { + if len(distro.Versions) == 0 { + return nil + } + for _, version := range distro.Versions { + if version == distroVersion { + return nil + } + } + } + } + } + } + } + type osDistribution struct { + Name string `json:"name,omitempty"` + Version string `json:"version,omitempty"` + } + type target struct { + OS string `json:"os"` + Arch string `json:"arch"` + Distribution osDistribution `json:"distribution"` + } + return fmt.Errorf( + "unable to satisfy target os/arch constraints; build image: %s, buildpack %s: %s", + toJSONMaybe(target{ + OS: os, + Arch: arch, + Distribution: osDistribution{Name: distroName, Version: distroVersion}, + }), + style.Symbol(b.Info().FullName()), + toJSONMaybe(b.Targets()), + ) +} + +func toJSONMaybe(v interface{}) string { + b, err := json.Marshal(v) + if err != nil { + return fmt.Sprintf("%s", v) // hopefully v is a Stringer + } + return string(b) +} + func (b *BuildpackDescriptor) Kind() string { return "buildpack" } @@ -70,6 +134,10 @@ func (b *BuildpackDescriptor) Stacks() []Stack { return b.WithStacks } +func (b *BuildpackDescriptor) Targets() []Target { + return b.WithTargets +} + func (b *BuildpackDescriptor) findMixinsForStack(stackID string) ([]string, error) { for _, s := range b.Stacks() { if s.ID == stackID || s.ID == "*" { diff --git a/vendor/github.com/buildpacks/pack/pkg/dist/dist.go b/vendor/github.com/buildpacks/pack/pkg/dist/dist.go index e3eccbbe7f..56e80debb4 100644 --- a/vendor/github.com/buildpacks/pack/pkg/dist/dist.go +++ b/vendor/github.com/buildpacks/pack/pkg/dist/dist.go @@ -8,6 +8,9 @@ const ( BuildpackLayersLabel = "io.buildpacks.buildpack.layers" ExtensionLayersLabel = "io.buildpacks.extension.layers" ExtensionMetadataLabel = "io.buildpacks.extension.metadata" + DefaultTargetOSLinux = "linux" + DefaultTargetOSWindows = "windows" + DefaultTargetArch = "amd64" ) type BuildpackURI struct { @@ -51,6 +54,7 @@ type ModuleLayers map[string]map[string]ModuleLayerInfo type ModuleLayerInfo struct { API *api.Version `json:"api"` Stacks []Stack `json:"stacks,omitempty"` + Targets []Target `json:"targets,omitempty"` Order Order `json:"order,omitempty"` LayerDiffID string `json:"layerDiffID"` Homepage string `json:"homepage,omitempty"` diff --git a/vendor/github.com/buildpacks/pack/pkg/dist/extension_descriptor.go b/vendor/github.com/buildpacks/pack/pkg/dist/extension_descriptor.go index 8714ff8e5e..b968ebf447 100644 --- a/vendor/github.com/buildpacks/pack/pkg/dist/extension_descriptor.go +++ b/vendor/github.com/buildpacks/pack/pkg/dist/extension_descriptor.go @@ -15,6 +15,10 @@ func (e *ExtensionDescriptor) EnsureStackSupport(_ string, _ []string, _ bool) e return nil } +func (e *ExtensionDescriptor) EnsureTargetSupport(_, _, _, _ string) error { + return nil +} + func (e *ExtensionDescriptor) EscapedID() string { return strings.ReplaceAll(e.Info().ID, "/", "_") } @@ -38,3 +42,7 @@ func (e *ExtensionDescriptor) Order() Order { func (e *ExtensionDescriptor) Stacks() []Stack { return nil } + +func (e *ExtensionDescriptor) Targets() []Target { + return nil +} diff --git a/vendor/github.com/buildpacks/pack/pkg/dist/layers.go b/vendor/github.com/buildpacks/pack/pkg/dist/layers.go index 51ac3a86d3..590454980e 100644 --- a/vendor/github.com/buildpacks/pack/pkg/dist/layers.go +++ b/vendor/github.com/buildpacks/pack/pkg/dist/layers.go @@ -15,6 +15,7 @@ type Descriptor interface { Info() ModuleInfo Order() Order Stacks() []Stack + Targets() []Target } func LayerDiffID(layerTarPath string) (v1.Hash, error) { @@ -45,6 +46,7 @@ func AddToLayersMD(layerMD ModuleLayers, descriptor Descriptor, diffID string) { layerMD[info.ID][info.Version] = ModuleLayerInfo{ API: descriptor.API(), Stacks: descriptor.Stacks(), + Targets: descriptor.Targets(), Order: descriptor.Order(), LayerDiffID: diffID, Homepage: info.Homepage, diff --git a/vendor/github.com/buildpacks/pack/pkg/project/v02/metadata.go b/vendor/github.com/buildpacks/pack/pkg/project/v02/metadata.go index 071323501d..792ffb1a74 100644 --- a/vendor/github.com/buildpacks/pack/pkg/project/v02/metadata.go +++ b/vendor/github.com/buildpacks/pack/pkg/project/v02/metadata.go @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/buildpacks/lifecycle/platform" + "github.com/buildpacks/lifecycle/platform/files" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" ) @@ -19,7 +19,7 @@ type TagInfo struct { TagTime time.Time } -func GitMetadata(appPath string) *platform.ProjectSource { +func GitMetadata(appPath string) *files.ProjectSource { repo, err := git.PlainOpen(appPath) if err != nil { return nil @@ -34,7 +34,7 @@ func GitMetadata(appPath string) *platform.ProjectSource { refs := parseGitRefs(repo, headRef, commitTagMap) remote := parseGitRemote(repo) - projectSource := &platform.ProjectSource{ + projectSource := &files.ProjectSource{ Type: "git", Version: map[string]interface{}{ "commit": headRef.Hash().String(), diff --git a/vendor/github.com/chrismellard/docker-credential-acr-env/pkg/token/token.go b/vendor/github.com/chrismellard/docker-credential-acr-env/pkg/token/token.go index 1f2cefdc58..feff3e1a41 100644 --- a/vendor/github.com/chrismellard/docker-credential-acr-env/pkg/token/token.go +++ b/vendor/github.com/chrismellard/docker-credential-acr-env/pkg/token/token.go @@ -64,7 +64,8 @@ func getServicePrincipalToken(settings auth.EnvironmentSettings, resource string } // federated OIDC JWT assertion - if jwt, isPresent := os.LookupEnv("AZURE_FEDERATED_TOKEN"); isPresent { + jwt, err := jwtLookup() + if err == nil { clientID, isPresent := os.LookupEnv("AZURE_CLIENT_ID") if !isPresent { return &adal.ServicePrincipalToken{}, fmt.Errorf("failed to get client id from environment") @@ -79,7 +80,7 @@ func getServicePrincipalToken(settings auth.EnvironmentSettings, resource string return &adal.ServicePrincipalToken{}, fmt.Errorf("failed to initialise OAuthConfig - %w", err) } - return adal.NewServicePrincipalTokenFromFederatedToken(*oAuthConfig, clientID, jwt, resource) + return adal.NewServicePrincipalTokenFromFederatedToken(*oAuthConfig, clientID, *jwt, resource) } // 4. MSI @@ -87,3 +88,21 @@ func getServicePrincipalToken(settings auth.EnvironmentSettings, resource string ClientID: os.Getenv("AZURE_CLIENT_ID"), }) } + +func jwtLookup() (*string, error) { + jwt, isPresent := os.LookupEnv("AZURE_FEDERATED_TOKEN") + if isPresent { + return &jwt, nil + } + + if jwtFile, isPresent := os.LookupEnv("AZURE_FEDERATED_TOKEN_FILE"); isPresent { + jwtBytes, err := os.ReadFile(jwtFile) + if err != nil { + return nil, err + } + jwt = string(jwtBytes) + return &jwt, nil + } + + return nil, fmt.Errorf("no JWT found") +} diff --git a/vendor/github.com/cloudevents/sdk-go/v2/alias.go b/vendor/github.com/cloudevents/sdk-go/v2/alias.go index ed64b4c0cc..2fbfaa9a78 100644 --- a/vendor/github.com/cloudevents/sdk-go/v2/alias.go +++ b/vendor/github.com/cloudevents/sdk-go/v2/alias.go @@ -135,8 +135,14 @@ var ( ToMessage = binding.ToMessage // Event Creation - NewEventFromHTTPRequest = http.NewEventFromHTTPRequest - NewEventFromHTTPResponse = http.NewEventFromHTTPResponse + + NewEventFromHTTPRequest = http.NewEventFromHTTPRequest + NewEventFromHTTPResponse = http.NewEventFromHTTPResponse + NewEventsFromHTTPRequest = http.NewEventsFromHTTPRequest + NewEventsFromHTTPResponse = http.NewEventsFromHTTPResponse + NewHTTPRequestFromEvent = http.NewHTTPRequestFromEvent + NewHTTPRequestFromEvents = http.NewHTTPRequestFromEvents + IsHTTPBatch = http.IsHTTPBatch // HTTP Messages diff --git a/vendor/github.com/cloudevents/sdk-go/v2/binding/encoding.go b/vendor/github.com/cloudevents/sdk-go/v2/binding/encoding.go index 16611a3d75..5070b7295a 100644 --- a/vendor/github.com/cloudevents/sdk-go/v2/binding/encoding.go +++ b/vendor/github.com/cloudevents/sdk-go/v2/binding/encoding.go @@ -19,6 +19,9 @@ const ( EncodingEvent // When the encoding is unknown (which means that the message is a non-event) EncodingUnknown + + // EncodingBatch is an instance of JSON Batched Events + EncodingBatch ) func (e Encoding) String() string { @@ -29,6 +32,8 @@ func (e Encoding) String() string { return "structured" case EncodingEvent: return "event" + case EncodingBatch: + return "batch" case EncodingUnknown: return "unknown" } diff --git a/vendor/github.com/cloudevents/sdk-go/v2/binding/format/format.go b/vendor/github.com/cloudevents/sdk-go/v2/binding/format/format.go index 2d840025ea..6bdd1842b7 100644 --- a/vendor/github.com/cloudevents/sdk-go/v2/binding/format/format.go +++ b/vendor/github.com/cloudevents/sdk-go/v2/binding/format/format.go @@ -7,6 +7,7 @@ package format import ( "encoding/json" + "errors" "fmt" "strings" @@ -41,12 +42,33 @@ func (jsonFmt) Unmarshal(b []byte, e *event.Event) error { return json.Unmarshal(b, e) } +// JSONBatch is the built-in "application/cloudevents-batch+json" format. +var JSONBatch = jsonBatchFmt{} + +type jsonBatchFmt struct{} + +func (jb jsonBatchFmt) MediaType() string { + return event.ApplicationCloudEventsBatchJSON +} + +// Marshal will return an error for jsonBatchFmt since the Format interface doesn't support batch Marshalling, and we +// know it's structured batch json, we'll go direct to the json.UnMarshall() (see `ToEvents()`) since that is the best +// way to support batch operations for now. +func (jb jsonBatchFmt) Marshal(e *event.Event) ([]byte, error) { + return nil, errors.New("not supported for batch events") +} + +func (jb jsonBatchFmt) Unmarshal(b []byte, e *event.Event) error { + return errors.New("not supported for batch events") +} + // built-in formats var formats map[string]Format func init() { formats = map[string]Format{} Add(JSON) + Add(JSONBatch) } // Lookup returns the format for contentType, or nil if not found. diff --git a/vendor/github.com/cloudevents/sdk-go/v2/binding/to_event.go b/vendor/github.com/cloudevents/sdk-go/v2/binding/to_event.go index 339a7833c3..d3332c1580 100644 --- a/vendor/github.com/cloudevents/sdk-go/v2/binding/to_event.go +++ b/vendor/github.com/cloudevents/sdk-go/v2/binding/to_event.go @@ -8,6 +8,7 @@ package binding import ( "bytes" "context" + "encoding/json" "errors" "fmt" "io" @@ -21,6 +22,9 @@ import ( // ErrCannotConvertToEvent is a generic error when a conversion of a Message to an Event fails var ErrCannotConvertToEvent = errors.New("cannot convert message to event") +// ErrCannotConvertToEvents is a generic error when a conversion of a Message to a Batched Event fails +var ErrCannotConvertToEvents = errors.New("cannot convert message to batched events") + // ToEvent translates a Message with a valid Structured or Binary representation to an Event. // This function returns the Event generated from the Message and the original encoding of the message or // an error that points the conversion error. @@ -61,6 +65,21 @@ func ToEvent(ctx context.Context, message MessageReader, transformers ...Transfo return &e, Transformers(transformers).Transform((*EventMessage)(&e), encoder) } +// ToEvents translates a Batch Message and corresponding Reader data to a slice of Events. +// This function returns the Events generated from the body data, or an error that points +// to the conversion issue. +func ToEvents(ctx context.Context, message MessageReader, body io.Reader) ([]event.Event, error) { + messageEncoding := message.ReadEncoding() + if messageEncoding != EncodingBatch { + return nil, ErrCannotConvertToEvents + } + + // Since Format doesn't support batch Marshalling, and we know it's structured batch json, we'll go direct to the + // json.UnMarshall(), since that is the best way to support batch operations for now. + var events []event.Event + return events, json.NewDecoder(body).Decode(&events) +} + type messageToEventBuilder event.Event var _ StructuredWriter = (*messageToEventBuilder)(nil) diff --git a/vendor/github.com/cloudevents/sdk-go/v2/event/extensions.go b/vendor/github.com/cloudevents/sdk-go/v2/event/extensions.go index 6c4193f348..72d0e757aa 100644 --- a/vendor/github.com/cloudevents/sdk-go/v2/event/extensions.go +++ b/vendor/github.com/cloudevents/sdk-go/v2/event/extensions.go @@ -50,7 +50,7 @@ func validateExtensionName(key string) error { for _, c := range key { if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { - return errors.New("bad key, CloudEvents attribute names MUST consist of lower-case letters ('a' to 'z') or digits ('0' to '9') from the ASCII character set") + return errors.New("bad key, CloudEvents attribute names MUST consist of lower-case letters ('a' to 'z'), upper-case letters ('A' to 'Z') or digits ('0' to '9') from the ASCII character set") } } return nil diff --git a/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/message.go b/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/message.go index e7e51d034b..7a7c36f9b1 100644 --- a/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/message.go +++ b/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/message.go @@ -92,6 +92,9 @@ func (m *Message) ReadEncoding() binding.Encoding { return binding.EncodingBinary } if m.format != nil { + if m.format == format.JSONBatch { + return binding.EncodingBatch + } return binding.EncodingStructured } return binding.EncodingUnknown diff --git a/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/utility.go b/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/utility.go index d46a334612..350fc1cf61 100644 --- a/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/utility.go +++ b/vendor/github.com/cloudevents/sdk-go/v2/protocol/http/utility.go @@ -6,7 +6,9 @@ package http import ( + "bytes" "context" + "encoding/json" nethttp "net/http" "github.com/cloudevents/sdk-go/v2/binding" @@ -24,3 +26,64 @@ func NewEventFromHTTPResponse(resp *nethttp.Response) (*event.Event, error) { msg := NewMessageFromHttpResponse(resp) return binding.ToEvent(context.Background(), msg) } + +// NewEventsFromHTTPRequest returns a batched set of Events from a HTTP Request +func NewEventsFromHTTPRequest(req *nethttp.Request) ([]event.Event, error) { + msg := NewMessageFromHttpRequest(req) + return binding.ToEvents(context.Background(), msg, msg.BodyReader) +} + +// NewEventsFromHTTPResponse returns a batched set of Events from a HTTP Response +func NewEventsFromHTTPResponse(resp *nethttp.Response) ([]event.Event, error) { + msg := NewMessageFromHttpResponse(resp) + return binding.ToEvents(context.Background(), msg, msg.BodyReader) +} + +// NewHTTPRequestFromEvent creates a http.Request object that can be used with any http.Client for a singular event. +// This is an HTTP POST action to the provided url. +func NewHTTPRequestFromEvent(ctx context.Context, url string, event event.Event) (*nethttp.Request, error) { + if err := event.Validate(); err != nil { + return nil, err + } + + req, err := nethttp.NewRequestWithContext(ctx, nethttp.MethodPost, url, nil) + if err != nil { + return nil, err + } + if err := WriteRequest(ctx, (*binding.EventMessage)(&event), req); err != nil { + return nil, err + } + + return req, nil +} + +// NewHTTPRequestFromEvents creates a http.Request object that can be used with any http.Client for sending +// a batched set of events. This is an HTTP POST action to the provided url. +func NewHTTPRequestFromEvents(ctx context.Context, url string, events []event.Event) (*nethttp.Request, error) { + // Sending batch events is quite straightforward, as there is only JSON format, so a simple implementation. + for _, e := range events { + if err := e.Validate(); err != nil { + return nil, err + } + } + var buffer bytes.Buffer + err := json.NewEncoder(&buffer).Encode(events) + if err != nil { + return nil, err + } + + request, err := nethttp.NewRequestWithContext(ctx, nethttp.MethodPost, url, &buffer) + if err != nil { + return nil, err + } + + request.Header.Set(ContentType, event.ApplicationCloudEventsBatchJSON) + + return request, nil +} + +// IsHTTPBatch returns if the current http.Request or http.Response is a batch event operation, by checking the +// header `Content-Type` value. +func IsHTTPBatch(header nethttp.Header) bool { + return header.Get(ContentType) == event.ApplicationCloudEventsBatchJSON +} diff --git a/vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.go b/vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.go index 2fe9f59c2a..8a3d54c570 100644 --- a/vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.go +++ b/vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.go @@ -4,9 +4,8 @@ package x25519 import ( - "golang.org/x/sys/cpu" - fp "github.com/cloudflare/circl/math/fp25519" + "golang.org/x/sys/cpu" ) var hasBmi2Adx = cpu.X86.HasBMI2 && cpu.X86.HasADX diff --git a/vendor/github.com/cloudflare/circl/dh/x25519/doc.go b/vendor/github.com/cloudflare/circl/dh/x25519/doc.go index e8feed5694..3ce102d145 100644 --- a/vendor/github.com/cloudflare/circl/dh/x25519/doc.go +++ b/vendor/github.com/cloudflare/circl/dh/x25519/doc.go @@ -11,10 +11,9 @@ internally and returns false when the public key is invalid (i.e., it is a low-order point). References: - - [1] RFC7748 by Langley, Hamburg, Turner (https://rfc-editor.org/rfc/rfc7748.txt) - - [2] Curve25519 by Bernstein (https://cr.yp.to/ecdh.html) - - [3] Bernstein (https://cr.yp.to/ecdh.html#validate) - - [4] Cremers&Jackson (https://eprint.iacr.org/2019/526) - + - [1] RFC7748 by Langley, Hamburg, Turner (https://rfc-editor.org/rfc/rfc7748.txt) + - [2] Curve25519 by Bernstein (https://cr.yp.to/ecdh.html) + - [3] Bernstein (https://cr.yp.to/ecdh.html#validate) + - [4] Cremers&Jackson (https://eprint.iacr.org/2019/526) */ package x25519 diff --git a/vendor/github.com/cloudflare/circl/dh/x25519/key.go b/vendor/github.com/cloudflare/circl/dh/x25519/key.go index bbd37ddd09..c76f72ac7f 100644 --- a/vendor/github.com/cloudflare/circl/dh/x25519/key.go +++ b/vendor/github.com/cloudflare/circl/dh/x25519/key.go @@ -22,11 +22,11 @@ func (k *Key) clamp(in *Key) *Key { // isValidPubKey verifies if the public key is not a low-order point. func (k *Key) isValidPubKey() bool { fp.Modp((*fp.Elt)(k)) - isLowOrder := false + var isLowOrder int for _, P := range lowOrderPoints { - isLowOrder = isLowOrder || subtle.ConstantTimeCompare(P[:], k[:]) != 0 + isLowOrder |= subtle.ConstantTimeCompare(P[:], k[:]) } - return !isLowOrder + return isLowOrder == 0 } // KeyGen obtains a public key given a secret key. diff --git a/vendor/github.com/cloudflare/circl/dh/x25519/table.go b/vendor/github.com/cloudflare/circl/dh/x25519/table.go index 30927e7b7b..28c8c4ac03 100644 --- a/vendor/github.com/cloudflare/circl/dh/x25519/table.go +++ b/vendor/github.com/cloudflare/circl/dh/x25519/table.go @@ -3,7 +3,9 @@ package x25519 import "github.com/cloudflare/circl/math/fp25519" // tableGenerator contains the set of points: -// t[i] = (xi+1)/(xi-1), +// +// t[i] = (xi+1)/(xi-1), +// // where (xi,yi) = 2^iG and G is the generator point // Size = (256)*(256/8) = 8192 bytes. var tableGenerator = [256 * fp25519.Size]byte{ diff --git a/vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.go b/vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.go index 7531e8647d..a062266613 100644 --- a/vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.go +++ b/vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.go @@ -4,9 +4,8 @@ package x448 import ( - "golang.org/x/sys/cpu" - fp "github.com/cloudflare/circl/math/fp448" + "golang.org/x/sys/cpu" ) var hasBmi2Adx = cpu.X86.HasBMI2 && cpu.X86.HasADX diff --git a/vendor/github.com/cloudflare/circl/dh/x448/curve_generic.go b/vendor/github.com/cloudflare/circl/dh/x448/curve_generic.go index c66d559ae7..b0b65ccf7e 100644 --- a/vendor/github.com/cloudflare/circl/dh/x448/curve_generic.go +++ b/vendor/github.com/cloudflare/circl/dh/x448/curve_generic.go @@ -18,6 +18,7 @@ func doubleGeneric(x, z *fp448.Elt) { fp448.Mul(x, x, z) fp448.Mul(z, t0, t1) } + func diffAddGeneric(w *[5]fp448.Elt, b uint) { mu, x1, z1, x2, z2 := &w[0], &w[1], &w[2], &w[3], &w[4] fp448.Cswap(x1, x2, b) @@ -30,6 +31,7 @@ func diffAddGeneric(w *[5]fp448.Elt, b uint) { fp448.Mul(x1, x1, z2) fp448.Mul(z1, z1, x2) } + func ladderStepGeneric(w *[5]fp448.Elt, b uint) { x1, x2, z2, x3, z3 := &w[0], &w[1], &w[2], &w[3], &w[4] t0 := &fp448.Elt{} @@ -52,6 +54,7 @@ func ladderStepGeneric(w *[5]fp448.Elt, b uint) { fp448.Mul(x2, x2, z2) fp448.Mul(z2, t0, t1) } + func mulA24Generic(z, x *fp448.Elt) { const A24 = 39082 const n = 8 diff --git a/vendor/github.com/cloudflare/circl/dh/x448/doc.go b/vendor/github.com/cloudflare/circl/dh/x448/doc.go index 8b9279cba2..c02904feda 100644 --- a/vendor/github.com/cloudflare/circl/dh/x448/doc.go +++ b/vendor/github.com/cloudflare/circl/dh/x448/doc.go @@ -11,10 +11,9 @@ internally and returns false when the public key is invalid (i.e., it is a low-order point). References: - - [1] RFC7748 by Langley, Hamburg, Turner (https://rfc-editor.org/rfc/rfc7748.txt) - - [2] Curve25519 by Bernstein (https://cr.yp.to/ecdh.html) - - [3] Bernstein (https://cr.yp.to/ecdh.html#validate) - - [4] Cremers&Jackson (https://eprint.iacr.org/2019/526) - + - [1] RFC7748 by Langley, Hamburg, Turner (https://rfc-editor.org/rfc/rfc7748.txt) + - [2] Curve25519 by Bernstein (https://cr.yp.to/ecdh.html) + - [3] Bernstein (https://cr.yp.to/ecdh.html#validate) + - [4] Cremers&Jackson (https://eprint.iacr.org/2019/526) */ package x448 diff --git a/vendor/github.com/cloudflare/circl/dh/x448/key.go b/vendor/github.com/cloudflare/circl/dh/x448/key.go index 82a07a2bfe..2fdde51168 100644 --- a/vendor/github.com/cloudflare/circl/dh/x448/key.go +++ b/vendor/github.com/cloudflare/circl/dh/x448/key.go @@ -22,11 +22,11 @@ func (k *Key) clamp(in *Key) *Key { // isValidPubKey verifies if the public key is not a low-order point. func (k *Key) isValidPubKey() bool { fp.Modp((*fp.Elt)(k)) - isLowOrder := false + var isLowOrder int for _, P := range lowOrderPoints { - isLowOrder = isLowOrder || subtle.ConstantTimeCompare(P[:], k[:]) != 0 + isLowOrder |= subtle.ConstantTimeCompare(P[:], k[:]) } - return !isLowOrder + return isLowOrder == 0 } // KeyGen obtains a public key given a secret key. diff --git a/vendor/github.com/cloudflare/circl/dh/x448/table.go b/vendor/github.com/cloudflare/circl/dh/x448/table.go index 0638ebbab8..eef53c30f8 100644 --- a/vendor/github.com/cloudflare/circl/dh/x448/table.go +++ b/vendor/github.com/cloudflare/circl/dh/x448/table.go @@ -3,7 +3,9 @@ package x448 import fp "github.com/cloudflare/circl/math/fp448" // tableGenerator contains the set of points: -// t[i] = (xi+1)/(xi-1), +// +// t[i] = (xi+1)/(xi-1), +// // where (xi,yi) = 2^iG and G is the generator point // Size = (448)*(448/8) = 25088 bytes. var tableGenerator = [448 * fp.Size]byte{ diff --git a/vendor/github.com/cloudflare/circl/ecc/goldilocks/point.go b/vendor/github.com/cloudflare/circl/ecc/goldilocks/point.go index a3ddc7cc0f..11f73de054 100644 --- a/vendor/github.com/cloudflare/circl/ecc/goldilocks/point.go +++ b/vendor/github.com/cloudflare/circl/ecc/goldilocks/point.go @@ -44,7 +44,7 @@ func FromBytes(in []byte) (*Point, error) { if len(in) < fp.Size+1 { return nil, errors.New("wrong input length") } - var err = errors.New("invalid decoding") + err := errors.New("invalid decoding") P := &Point{} signX := in[fp.Size] >> 7 copy(P.y[:], in[:fp.Size]) diff --git a/vendor/github.com/cloudflare/circl/ecc/goldilocks/scalar.go b/vendor/github.com/cloudflare/circl/ecc/goldilocks/scalar.go index 852d74f3ac..f98117b252 100644 --- a/vendor/github.com/cloudflare/circl/ecc/goldilocks/scalar.go +++ b/vendor/github.com/cloudflare/circl/ecc/goldilocks/scalar.go @@ -8,7 +8,7 @@ import ( // ScalarSize is the size (in bytes) of scalars. const ScalarSize = 56 // 448 / 8 -//_N is the number of 64-bit words to store scalars. +// _N is the number of 64-bit words to store scalars. const _N = 7 // 448 / 64 // Scalar represents a positive integer stored in little-endian order. diff --git a/vendor/github.com/cloudflare/circl/internal/sha3/doc.go b/vendor/github.com/cloudflare/circl/internal/sha3/doc.go index c06a330ff9..7e02309070 100644 --- a/vendor/github.com/cloudflare/circl/internal/sha3/doc.go +++ b/vendor/github.com/cloudflare/circl/internal/sha3/doc.go @@ -8,8 +8,7 @@ // Both types of hash function use the "sponge" construction and the Keccak // permutation. For a detailed specification see http://keccak.noekeon.org/ // -// -// Guidance +// # Guidance // // If you aren't sure what function you need, use SHAKE256 with at least 64 // bytes of output. The SHAKE instances are faster than the SHA3 instances; @@ -19,8 +18,7 @@ // secret key to the input, hash with SHAKE256 and read at least 32 bytes of // output. // -// -// Security strengths +// # Security strengths // // The SHA3-x (x equals 224, 256, 384, or 512) functions have a security // strength against preimage attacks of x bits. Since they only produce "x" @@ -31,8 +29,7 @@ // is used. Requesting more than 64 or 32 bytes of output, respectively, does // not increase the collision-resistance of the SHAKE functions. // -// -// The sponge construction +// # The sponge construction // // A sponge builds a pseudo-random function from a public pseudo-random // permutation, by applying the permutation to a state of "rate + capacity" @@ -50,8 +47,7 @@ // Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means // that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. // -// -// Recommendations +// # Recommendations // // The SHAKE functions are recommended for most new uses. They can produce // output of arbitrary length. SHAKE256, with an output length of at least diff --git a/vendor/github.com/cloudflare/circl/internal/sha3/keccakf.go b/vendor/github.com/cloudflare/circl/internal/sha3/keccakf.go index e606f0caae..ab19d0ad12 100644 --- a/vendor/github.com/cloudflare/circl/internal/sha3/keccakf.go +++ b/vendor/github.com/cloudflare/circl/internal/sha3/keccakf.go @@ -2,13 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !amd64 || appengine || gccgo -// +build !amd64 appengine gccgo - package sha3 // KeccakF1600 applies the Keccak permutation to a 1600b-wide // state represented as a slice of 25 uint64s. +// nolint:funlen func KeccakF1600(a *[25]uint64) { // Implementation translated from Keccak-inplace.c // in the keccak reference code. diff --git a/vendor/github.com/cloudflare/circl/internal/sha3/keccakf_amd64.go b/vendor/github.com/cloudflare/circl/internal/sha3/keccakf_amd64.go deleted file mode 100644 index e7364eb093..0000000000 --- a/vendor/github.com/cloudflare/circl/internal/sha3/keccakf_amd64.go +++ /dev/null @@ -1,14 +0,0 @@ -// 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:build amd64 && !appengine && !gccgo -// +build amd64,!appengine,!gccgo - -package sha3 - -// This function is implemented in keccakf_amd64.s. - -//go:noescape - -func KeccakF1600(state *[25]uint64) diff --git a/vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.h b/vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.h index 7b25f16e41..b884b584ab 100644 --- a/vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.h +++ b/vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.h @@ -99,6 +99,7 @@ // Uses: AX, DX, R8-R15, FLAGS // Instr: x86_64, bmi2, adx #define integerMulAdx(z,x,y) \ + MOVL $0,R15; \ MOVQ 0+y, DX; XORL AX, AX; \ MULXQ 0+x, AX, R8; MOVQ AX, 0+z; \ MULXQ 8+x, AX, R9; ADCXQ AX, R8; \ diff --git a/vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.h b/vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.h index 0b7dea174b..536fe5bdfe 100644 --- a/vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.h +++ b/vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.h @@ -158,6 +158,7 @@ // Uses: AX, DX, R8-R15, FLAGS // Instr: x86_64, bmi2, adx #define integerMulAdx(z,x,y) \ + MOVL $0,R15; \ MOVQ 0+y, DX; XORL AX, AX; MOVQ $0, R8; \ MULXQ 0+x, AX, R9; MOVQ AX, 0+z; \ MULXQ 8+x, AX, R10; ADCXQ AX, R9; \ diff --git a/vendor/github.com/cloudflare/circl/math/fp448/fuzzer.go b/vendor/github.com/cloudflare/circl/math/fp448/fuzzer.go index d1f62432ea..2d7afc8059 100644 --- a/vendor/github.com/cloudflare/circl/math/fp448/fuzzer.go +++ b/vendor/github.com/cloudflare/circl/math/fp448/fuzzer.go @@ -2,11 +2,12 @@ // +build gofuzz // How to run the fuzzer: -// $ go get -u github.com/dvyukov/go-fuzz/go-fuzz -// $ go get -u github.com/dvyukov/go-fuzz/go-fuzz-build -// $ go-fuzz-build -libfuzzer -func FuzzReduction -o lib.a -// $ clang -fsanitize=fuzzer lib.a -o fu.exe -// $ ./fu.exe +// +// $ go get -u github.com/dvyukov/go-fuzz/go-fuzz +// $ go get -u github.com/dvyukov/go-fuzz/go-fuzz-build +// $ go-fuzz-build -libfuzzer -func FuzzReduction -o lib.a +// $ clang -fsanitize=fuzzer lib.a -o fu.exe +// $ ./fu.exe package fp448 import ( diff --git a/vendor/github.com/cloudflare/circl/math/mlsbset/mlsbset.go b/vendor/github.com/cloudflare/circl/math/mlsbset/mlsbset.go index 59e9fb4b60..a43851b8bb 100644 --- a/vendor/github.com/cloudflare/circl/math/mlsbset/mlsbset.go +++ b/vendor/github.com/cloudflare/circl/math/mlsbset/mlsbset.go @@ -2,8 +2,8 @@ // // References: "Efficient and secure algorithms for GLV-based scalar // multiplication and their implementation on GLV–GLS curves" by (Faz-Hernandez et al.) -// - https://doi.org/10.1007/s13389-014-0085-7 -// - https://eprint.iacr.org/2013/158 +// - https://doi.org/10.1007/s13389-014-0085-7 +// - https://eprint.iacr.org/2013/158 package mlsbset import ( diff --git a/vendor/github.com/cloudflare/circl/math/wnaf.go b/vendor/github.com/cloudflare/circl/math/wnaf.go index df7a9c9bac..94a1ec5042 100644 --- a/vendor/github.com/cloudflare/circl/math/wnaf.go +++ b/vendor/github.com/cloudflare/circl/math/wnaf.go @@ -9,15 +9,15 @@ import "math/big" // output has ceil(l/(w-1)) digits. // // Restrictions: -// - n is odd and n > 0. -// - 1 < w < 32. -// - l >= bit length of n. +// - n is odd and n > 0. +// - 1 < w < 32. +// - l >= bit length of n. // // References: -// - Alg.6 in "Exponent Recoding and Regular Exponentiation Algorithms" -// by Joye-Tunstall. http://doi.org/10.1007/978-3-642-02384-2_21 -// - Alg.6 in "Selecting Elliptic Curves for Cryptography: An Efficiency and -// Security Analysis" by Bos et al. http://doi.org/10.1007/s13389-015-0097-y +// - Alg.6 in "Exponent Recoding and Regular Exponentiation Algorithms" +// by Joye-Tunstall. http://doi.org/10.1007/978-3-642-02384-2_21 +// - Alg.6 in "Selecting Elliptic Curves for Cryptography: An Efficiency and +// Security Analysis" by Bos et al. http://doi.org/10.1007/s13389-015-0097-y func SignedDigit(n *big.Int, w, l uint) []int32 { if n.Sign() <= 0 || n.Bit(0) == 0 { panic("n must be non-zero, odd, and positive") @@ -51,8 +51,8 @@ func SignedDigit(n *big.Int, w, l uint) []int32 { // 1 < w < 32. The returned slice L holds n = sum( L[i]*2^i ). // // Reference: -// - Alg.9 "Efficient arithmetic on Koblitz curves" by Solinas. -// http://doi.org/10.1023/A:1008306223194 +// - Alg.9 "Efficient arithmetic on Koblitz curves" by Solinas. +// http://doi.org/10.1023/A:1008306223194 func OmegaNAF(n *big.Int, w uint) (L []int32) { if n.Sign() < 0 { panic("n must be positive") diff --git a/vendor/github.com/cloudflare/circl/sign/ed25519/ed25519.go b/vendor/github.com/cloudflare/circl/sign/ed25519/ed25519.go index b336bec98d..08ca65d799 100644 --- a/vendor/github.com/cloudflare/circl/sign/ed25519/ed25519.go +++ b/vendor/github.com/cloudflare/circl/sign/ed25519/ed25519.go @@ -3,12 +3,12 @@ // This package provides optimized implementations of the three signature // variants and maintaining closer compatiblilty with crypto/ed25519. // -// | Scheme Name | Sign Function | Verification | Context | -// |-------------|-------------------|---------------|-------------------| -// | Ed25519 | Sign | Verify | None | -// | Ed25519Ph | SignPh | VerifyPh | Yes, can be empty | -// | Ed25519Ctx | SignWithCtx | VerifyWithCtx | Yes, non-empty | -// | All above | (PrivateKey).Sign | VerifyAny | As above | +// | Scheme Name | Sign Function | Verification | Context | +// |-------------|-------------------|---------------|-------------------| +// | Ed25519 | Sign | Verify | None | +// | Ed25519Ph | SignPh | VerifyPh | Yes, can be empty | +// | Ed25519Ctx | SignWithCtx | VerifyWithCtx | Yes, non-empty | +// | All above | (PrivateKey).Sign | VerifyAny | As above | // // Specific functions for sign and verify are defined. A generic signing // function for all schemes is available through the crypto.Signer interface, @@ -20,7 +20,7 @@ // in this package. While Ed25519Ph accepts an empty context, Ed25519Ctx // enforces non-empty context strings. // -// Compatibility with crypto.ed25519 +// # Compatibility with crypto.ed25519 // // These functions are compatible with the “Ed25519” function defined in // RFC-8032. However, unlike RFC 8032's formulation, this package's private @@ -30,9 +30,9 @@ // // References // -// - RFC-8032: https://rfc-editor.org/rfc/rfc8032.txt -// - Ed25519: https://ed25519.cr.yp.to/ -// - EdDSA: High-speed high-security signatures. https://doi.org/10.1007/s13389-012-0027-1 +// - RFC-8032: https://rfc-editor.org/rfc/rfc8032.txt +// - Ed25519: https://ed25519.cr.yp.to/ +// - EdDSA: High-speed high-security signatures. https://doi.org/10.1007/s13389-012-0027-1 package ed25519 import ( @@ -152,7 +152,8 @@ func (pub PublicKey) Equal(x crypto.PublicKey) bool { func (priv PrivateKey) Sign( rand io.Reader, message []byte, - opts crypto.SignerOpts) (signature []byte, err error) { + opts crypto.SignerOpts, +) (signature []byte, err error) { var ctx string var scheme SchemeID if o, ok := opts.(SignerOptions); ok { diff --git a/vendor/github.com/cloudflare/circl/sign/ed25519/mult.go b/vendor/github.com/cloudflare/circl/sign/ed25519/mult.go index ddcd71a390..3216aae303 100644 --- a/vendor/github.com/cloudflare/circl/sign/ed25519/mult.go +++ b/vendor/github.com/cloudflare/circl/sign/ed25519/mult.go @@ -29,9 +29,10 @@ const ( // mLSBRecoding is the odd-only modified LSB-set. // // Reference: -// "Efficient and secure algorithms for GLV-based scalar multiplication and -// their implementation on GLV–GLS curves" by (Faz-Hernandez et al.) -// http://doi.org/10.1007/s13389-014-0085-7. +// +// "Efficient and secure algorithms for GLV-based scalar multiplication and +// their implementation on GLV–GLS curves" by (Faz-Hernandez et al.) +// http://doi.org/10.1007/s13389-014-0085-7. func mLSBRecoding(L []int8, k []byte) { const ee = (fxT + fxW*fxV - 1) / (fxW * fxV) const dd = ee * fxV diff --git a/vendor/github.com/cloudflare/circl/sign/ed25519/point.go b/vendor/github.com/cloudflare/circl/sign/ed25519/point.go index 73505a6fd3..374a69503c 100644 --- a/vendor/github.com/cloudflare/circl/sign/ed25519/point.go +++ b/vendor/github.com/cloudflare/circl/sign/ed25519/point.go @@ -2,11 +2,13 @@ package ed25519 import fp "github.com/cloudflare/circl/math/fp25519" -type pointR1 struct{ x, y, z, ta, tb fp.Elt } -type pointR2 struct { - pointR3 - z2 fp.Elt -} +type ( + pointR1 struct{ x, y, z, ta, tb fp.Elt } + pointR2 struct { + pointR3 + z2 fp.Elt + } +) type pointR3 struct{ addYX, subYX, dt2 fp.Elt } func (P *pointR1) neg() { diff --git a/vendor/github.com/cloudflare/circl/sign/ed448/ed448.go b/vendor/github.com/cloudflare/circl/sign/ed448/ed448.go index 36bceb3803..324bd8f334 100644 --- a/vendor/github.com/cloudflare/circl/sign/ed448/ed448.go +++ b/vendor/github.com/cloudflare/circl/sign/ed448/ed448.go @@ -2,11 +2,11 @@ // // This package implements two signature variants. // -// | Scheme Name | Sign Function | Verification | Context | -// |-------------|-------------------|---------------|-------------------| -// | Ed448 | Sign | Verify | Yes, can be empty | -// | Ed448Ph | SignPh | VerifyPh | Yes, can be empty | -// | All above | (PrivateKey).Sign | VerifyAny | As above | +// | Scheme Name | Sign Function | Verification | Context | +// |-------------|-------------------|---------------|-------------------| +// | Ed448 | Sign | Verify | Yes, can be empty | +// | Ed448Ph | SignPh | VerifyPh | Yes, can be empty | +// | All above | (PrivateKey).Sign | VerifyAny | As above | // // Specific functions for sign and verify are defined. A generic signing // function for all schemes is available through the crypto.Signer interface, @@ -18,9 +18,9 @@ // // References: // -// - RFC8032 https://rfc-editor.org/rfc/rfc8032.txt -// - EdDSA for more curves https://eprint.iacr.org/2015/677 -// - High-speed high-security signatures. https://doi.org/10.1007/s13389-012-0027-1 +// - RFC8032: https://rfc-editor.org/rfc/rfc8032.txt +// - EdDSA for more curves: https://eprint.iacr.org/2015/677 +// - High-speed high-security signatures: https://doi.org/10.1007/s13389-012-0027-1 package ed448 import ( @@ -139,7 +139,8 @@ func (pub PublicKey) MarshalBinary() (data []byte, err error) { func (priv PrivateKey) Sign( rand io.Reader, message []byte, - opts crypto.SignerOpts) (signature []byte, err error) { + opts crypto.SignerOpts, +) (signature []byte, err error) { var ctx string var scheme SchemeID diff --git a/vendor/github.com/cloudflare/circl/sign/sign.go b/vendor/github.com/cloudflare/circl/sign/sign.go index 15bbad761b..13b20fa4b0 100644 --- a/vendor/github.com/cloudflare/circl/sign/sign.go +++ b/vendor/github.com/cloudflare/circl/sign/sign.go @@ -2,7 +2,7 @@ // // A register of schemes is available in the package // -// github.com/cloudflare/circl/sign/schemes +// github.com/cloudflare/circl/sign/schemes package sign import ( @@ -31,7 +31,6 @@ type PublicKey interface { type PrivateKey interface { // Returns the signature scheme for this private key. Scheme() Scheme - Equal(crypto.PrivateKey) bool // For compatibility with Go standard library crypto.Signer diff --git a/vendor/github.com/containerd/cgroups/stats/v1/doc.go b/vendor/github.com/containerd/cgroups/stats/v1/doc.go deleted file mode 100644 index 23f3cdd4b3..0000000000 --- a/vendor/github.com/containerd/cgroups/stats/v1/doc.go +++ /dev/null @@ -1,17 +0,0 @@ -/* - Copyright The containerd 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 v1 diff --git a/vendor/github.com/containerd/cgroups/stats/v1/metrics.pb.go b/vendor/github.com/containerd/cgroups/stats/v1/metrics.pb.go deleted file mode 100644 index 6d2d41770b..0000000000 --- a/vendor/github.com/containerd/cgroups/stats/v1/metrics.pb.go +++ /dev/null @@ -1,6125 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: github.com/containerd/cgroups/stats/v1/metrics.proto - -package v1 - -import ( - fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" - reflect "reflect" - strings "strings" -) - -// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Metrics struct { - Hugetlb []*HugetlbStat `protobuf:"bytes,1,rep,name=hugetlb,proto3" json:"hugetlb,omitempty"` - Pids *PidsStat `protobuf:"bytes,2,opt,name=pids,proto3" json:"pids,omitempty"` - CPU *CPUStat `protobuf:"bytes,3,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory *MemoryStat `protobuf:"bytes,4,opt,name=memory,proto3" json:"memory,omitempty"` - Blkio *BlkIOStat `protobuf:"bytes,5,opt,name=blkio,proto3" json:"blkio,omitempty"` - Rdma *RdmaStat `protobuf:"bytes,6,opt,name=rdma,proto3" json:"rdma,omitempty"` - Network []*NetworkStat `protobuf:"bytes,7,rep,name=network,proto3" json:"network,omitempty"` - CgroupStats *CgroupStats `protobuf:"bytes,8,opt,name=cgroup_stats,json=cgroupStats,proto3" json:"cgroup_stats,omitempty"` - MemoryOomControl *MemoryOomControl `protobuf:"bytes,9,opt,name=memory_oom_control,json=memoryOomControl,proto3" json:"memory_oom_control,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Metrics) Reset() { *m = Metrics{} } -func (*Metrics) ProtoMessage() {} -func (*Metrics) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{0} -} -func (m *Metrics) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Metrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Metrics.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Metrics) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metrics.Merge(m, src) -} -func (m *Metrics) XXX_Size() int { - return m.Size() -} -func (m *Metrics) XXX_DiscardUnknown() { - xxx_messageInfo_Metrics.DiscardUnknown(m) -} - -var xxx_messageInfo_Metrics proto.InternalMessageInfo - -type HugetlbStat struct { - Usage uint64 `protobuf:"varint,1,opt,name=usage,proto3" json:"usage,omitempty"` - Max uint64 `protobuf:"varint,2,opt,name=max,proto3" json:"max,omitempty"` - Failcnt uint64 `protobuf:"varint,3,opt,name=failcnt,proto3" json:"failcnt,omitempty"` - Pagesize string `protobuf:"bytes,4,opt,name=pagesize,proto3" json:"pagesize,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *HugetlbStat) Reset() { *m = HugetlbStat{} } -func (*HugetlbStat) ProtoMessage() {} -func (*HugetlbStat) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{1} -} -func (m *HugetlbStat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *HugetlbStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_HugetlbStat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *HugetlbStat) XXX_Merge(src proto.Message) { - xxx_messageInfo_HugetlbStat.Merge(m, src) -} -func (m *HugetlbStat) XXX_Size() int { - return m.Size() -} -func (m *HugetlbStat) XXX_DiscardUnknown() { - xxx_messageInfo_HugetlbStat.DiscardUnknown(m) -} - -var xxx_messageInfo_HugetlbStat proto.InternalMessageInfo - -type PidsStat struct { - Current uint64 `protobuf:"varint,1,opt,name=current,proto3" json:"current,omitempty"` - Limit uint64 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PidsStat) Reset() { *m = PidsStat{} } -func (*PidsStat) ProtoMessage() {} -func (*PidsStat) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{2} -} -func (m *PidsStat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PidsStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PidsStat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PidsStat) XXX_Merge(src proto.Message) { - xxx_messageInfo_PidsStat.Merge(m, src) -} -func (m *PidsStat) XXX_Size() int { - return m.Size() -} -func (m *PidsStat) XXX_DiscardUnknown() { - xxx_messageInfo_PidsStat.DiscardUnknown(m) -} - -var xxx_messageInfo_PidsStat proto.InternalMessageInfo - -type CPUStat struct { - Usage *CPUUsage `protobuf:"bytes,1,opt,name=usage,proto3" json:"usage,omitempty"` - Throttling *Throttle `protobuf:"bytes,2,opt,name=throttling,proto3" json:"throttling,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CPUStat) Reset() { *m = CPUStat{} } -func (*CPUStat) ProtoMessage() {} -func (*CPUStat) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{3} -} -func (m *CPUStat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CPUStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CPUStat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *CPUStat) XXX_Merge(src proto.Message) { - xxx_messageInfo_CPUStat.Merge(m, src) -} -func (m *CPUStat) XXX_Size() int { - return m.Size() -} -func (m *CPUStat) XXX_DiscardUnknown() { - xxx_messageInfo_CPUStat.DiscardUnknown(m) -} - -var xxx_messageInfo_CPUStat proto.InternalMessageInfo - -type CPUUsage struct { - // values in nanoseconds - Total uint64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Kernel uint64 `protobuf:"varint,2,opt,name=kernel,proto3" json:"kernel,omitempty"` - User uint64 `protobuf:"varint,3,opt,name=user,proto3" json:"user,omitempty"` - PerCPU []uint64 `protobuf:"varint,4,rep,packed,name=per_cpu,json=perCpu,proto3" json:"per_cpu,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CPUUsage) Reset() { *m = CPUUsage{} } -func (*CPUUsage) ProtoMessage() {} -func (*CPUUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{4} -} -func (m *CPUUsage) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CPUUsage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CPUUsage.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *CPUUsage) XXX_Merge(src proto.Message) { - xxx_messageInfo_CPUUsage.Merge(m, src) -} -func (m *CPUUsage) XXX_Size() int { - return m.Size() -} -func (m *CPUUsage) XXX_DiscardUnknown() { - xxx_messageInfo_CPUUsage.DiscardUnknown(m) -} - -var xxx_messageInfo_CPUUsage proto.InternalMessageInfo - -type Throttle struct { - Periods uint64 `protobuf:"varint,1,opt,name=periods,proto3" json:"periods,omitempty"` - ThrottledPeriods uint64 `protobuf:"varint,2,opt,name=throttled_periods,json=throttledPeriods,proto3" json:"throttled_periods,omitempty"` - ThrottledTime uint64 `protobuf:"varint,3,opt,name=throttled_time,json=throttledTime,proto3" json:"throttled_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Throttle) Reset() { *m = Throttle{} } -func (*Throttle) ProtoMessage() {} -func (*Throttle) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{5} -} -func (m *Throttle) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Throttle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Throttle.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Throttle) XXX_Merge(src proto.Message) { - xxx_messageInfo_Throttle.Merge(m, src) -} -func (m *Throttle) XXX_Size() int { - return m.Size() -} -func (m *Throttle) XXX_DiscardUnknown() { - xxx_messageInfo_Throttle.DiscardUnknown(m) -} - -var xxx_messageInfo_Throttle proto.InternalMessageInfo - -type MemoryStat struct { - Cache uint64 `protobuf:"varint,1,opt,name=cache,proto3" json:"cache,omitempty"` - RSS uint64 `protobuf:"varint,2,opt,name=rss,proto3" json:"rss,omitempty"` - RSSHuge uint64 `protobuf:"varint,3,opt,name=rss_huge,json=rssHuge,proto3" json:"rss_huge,omitempty"` - MappedFile uint64 `protobuf:"varint,4,opt,name=mapped_file,json=mappedFile,proto3" json:"mapped_file,omitempty"` - Dirty uint64 `protobuf:"varint,5,opt,name=dirty,proto3" json:"dirty,omitempty"` - Writeback uint64 `protobuf:"varint,6,opt,name=writeback,proto3" json:"writeback,omitempty"` - PgPgIn uint64 `protobuf:"varint,7,opt,name=pg_pg_in,json=pgPgIn,proto3" json:"pg_pg_in,omitempty"` - PgPgOut uint64 `protobuf:"varint,8,opt,name=pg_pg_out,json=pgPgOut,proto3" json:"pg_pg_out,omitempty"` - PgFault uint64 `protobuf:"varint,9,opt,name=pg_fault,json=pgFault,proto3" json:"pg_fault,omitempty"` - PgMajFault uint64 `protobuf:"varint,10,opt,name=pg_maj_fault,json=pgMajFault,proto3" json:"pg_maj_fault,omitempty"` - InactiveAnon uint64 `protobuf:"varint,11,opt,name=inactive_anon,json=inactiveAnon,proto3" json:"inactive_anon,omitempty"` - ActiveAnon uint64 `protobuf:"varint,12,opt,name=active_anon,json=activeAnon,proto3" json:"active_anon,omitempty"` - InactiveFile uint64 `protobuf:"varint,13,opt,name=inactive_file,json=inactiveFile,proto3" json:"inactive_file,omitempty"` - ActiveFile uint64 `protobuf:"varint,14,opt,name=active_file,json=activeFile,proto3" json:"active_file,omitempty"` - Unevictable uint64 `protobuf:"varint,15,opt,name=unevictable,proto3" json:"unevictable,omitempty"` - HierarchicalMemoryLimit uint64 `protobuf:"varint,16,opt,name=hierarchical_memory_limit,json=hierarchicalMemoryLimit,proto3" json:"hierarchical_memory_limit,omitempty"` - HierarchicalSwapLimit uint64 `protobuf:"varint,17,opt,name=hierarchical_swap_limit,json=hierarchicalSwapLimit,proto3" json:"hierarchical_swap_limit,omitempty"` - TotalCache uint64 `protobuf:"varint,18,opt,name=total_cache,json=totalCache,proto3" json:"total_cache,omitempty"` - TotalRSS uint64 `protobuf:"varint,19,opt,name=total_rss,json=totalRss,proto3" json:"total_rss,omitempty"` - TotalRSSHuge uint64 `protobuf:"varint,20,opt,name=total_rss_huge,json=totalRssHuge,proto3" json:"total_rss_huge,omitempty"` - TotalMappedFile uint64 `protobuf:"varint,21,opt,name=total_mapped_file,json=totalMappedFile,proto3" json:"total_mapped_file,omitempty"` - TotalDirty uint64 `protobuf:"varint,22,opt,name=total_dirty,json=totalDirty,proto3" json:"total_dirty,omitempty"` - TotalWriteback uint64 `protobuf:"varint,23,opt,name=total_writeback,json=totalWriteback,proto3" json:"total_writeback,omitempty"` - TotalPgPgIn uint64 `protobuf:"varint,24,opt,name=total_pg_pg_in,json=totalPgPgIn,proto3" json:"total_pg_pg_in,omitempty"` - TotalPgPgOut uint64 `protobuf:"varint,25,opt,name=total_pg_pg_out,json=totalPgPgOut,proto3" json:"total_pg_pg_out,omitempty"` - TotalPgFault uint64 `protobuf:"varint,26,opt,name=total_pg_fault,json=totalPgFault,proto3" json:"total_pg_fault,omitempty"` - TotalPgMajFault uint64 `protobuf:"varint,27,opt,name=total_pg_maj_fault,json=totalPgMajFault,proto3" json:"total_pg_maj_fault,omitempty"` - TotalInactiveAnon uint64 `protobuf:"varint,28,opt,name=total_inactive_anon,json=totalInactiveAnon,proto3" json:"total_inactive_anon,omitempty"` - TotalActiveAnon uint64 `protobuf:"varint,29,opt,name=total_active_anon,json=totalActiveAnon,proto3" json:"total_active_anon,omitempty"` - TotalInactiveFile uint64 `protobuf:"varint,30,opt,name=total_inactive_file,json=totalInactiveFile,proto3" json:"total_inactive_file,omitempty"` - TotalActiveFile uint64 `protobuf:"varint,31,opt,name=total_active_file,json=totalActiveFile,proto3" json:"total_active_file,omitempty"` - TotalUnevictable uint64 `protobuf:"varint,32,opt,name=total_unevictable,json=totalUnevictable,proto3" json:"total_unevictable,omitempty"` - Usage *MemoryEntry `protobuf:"bytes,33,opt,name=usage,proto3" json:"usage,omitempty"` - Swap *MemoryEntry `protobuf:"bytes,34,opt,name=swap,proto3" json:"swap,omitempty"` - Kernel *MemoryEntry `protobuf:"bytes,35,opt,name=kernel,proto3" json:"kernel,omitempty"` - KernelTCP *MemoryEntry `protobuf:"bytes,36,opt,name=kernel_tcp,json=kernelTcp,proto3" json:"kernel_tcp,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MemoryStat) Reset() { *m = MemoryStat{} } -func (*MemoryStat) ProtoMessage() {} -func (*MemoryStat) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{6} -} -func (m *MemoryStat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MemoryStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MemoryStat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MemoryStat) XXX_Merge(src proto.Message) { - xxx_messageInfo_MemoryStat.Merge(m, src) -} -func (m *MemoryStat) XXX_Size() int { - return m.Size() -} -func (m *MemoryStat) XXX_DiscardUnknown() { - xxx_messageInfo_MemoryStat.DiscardUnknown(m) -} - -var xxx_messageInfo_MemoryStat proto.InternalMessageInfo - -type MemoryEntry struct { - Limit uint64 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` - Usage uint64 `protobuf:"varint,2,opt,name=usage,proto3" json:"usage,omitempty"` - Max uint64 `protobuf:"varint,3,opt,name=max,proto3" json:"max,omitempty"` - Failcnt uint64 `protobuf:"varint,4,opt,name=failcnt,proto3" json:"failcnt,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MemoryEntry) Reset() { *m = MemoryEntry{} } -func (*MemoryEntry) ProtoMessage() {} -func (*MemoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{7} -} -func (m *MemoryEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MemoryEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MemoryEntry.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MemoryEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_MemoryEntry.Merge(m, src) -} -func (m *MemoryEntry) XXX_Size() int { - return m.Size() -} -func (m *MemoryEntry) XXX_DiscardUnknown() { - xxx_messageInfo_MemoryEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_MemoryEntry proto.InternalMessageInfo - -type MemoryOomControl struct { - OomKillDisable uint64 `protobuf:"varint,1,opt,name=oom_kill_disable,json=oomKillDisable,proto3" json:"oom_kill_disable,omitempty"` - UnderOom uint64 `protobuf:"varint,2,opt,name=under_oom,json=underOom,proto3" json:"under_oom,omitempty"` - OomKill uint64 `protobuf:"varint,3,opt,name=oom_kill,json=oomKill,proto3" json:"oom_kill,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MemoryOomControl) Reset() { *m = MemoryOomControl{} } -func (*MemoryOomControl) ProtoMessage() {} -func (*MemoryOomControl) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{8} -} -func (m *MemoryOomControl) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MemoryOomControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MemoryOomControl.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MemoryOomControl) XXX_Merge(src proto.Message) { - xxx_messageInfo_MemoryOomControl.Merge(m, src) -} -func (m *MemoryOomControl) XXX_Size() int { - return m.Size() -} -func (m *MemoryOomControl) XXX_DiscardUnknown() { - xxx_messageInfo_MemoryOomControl.DiscardUnknown(m) -} - -var xxx_messageInfo_MemoryOomControl proto.InternalMessageInfo - -type BlkIOStat struct { - IoServiceBytesRecursive []*BlkIOEntry `protobuf:"bytes,1,rep,name=io_service_bytes_recursive,json=ioServiceBytesRecursive,proto3" json:"io_service_bytes_recursive,omitempty"` - IoServicedRecursive []*BlkIOEntry `protobuf:"bytes,2,rep,name=io_serviced_recursive,json=ioServicedRecursive,proto3" json:"io_serviced_recursive,omitempty"` - IoQueuedRecursive []*BlkIOEntry `protobuf:"bytes,3,rep,name=io_queued_recursive,json=ioQueuedRecursive,proto3" json:"io_queued_recursive,omitempty"` - IoServiceTimeRecursive []*BlkIOEntry `protobuf:"bytes,4,rep,name=io_service_time_recursive,json=ioServiceTimeRecursive,proto3" json:"io_service_time_recursive,omitempty"` - IoWaitTimeRecursive []*BlkIOEntry `protobuf:"bytes,5,rep,name=io_wait_time_recursive,json=ioWaitTimeRecursive,proto3" json:"io_wait_time_recursive,omitempty"` - IoMergedRecursive []*BlkIOEntry `protobuf:"bytes,6,rep,name=io_merged_recursive,json=ioMergedRecursive,proto3" json:"io_merged_recursive,omitempty"` - IoTimeRecursive []*BlkIOEntry `protobuf:"bytes,7,rep,name=io_time_recursive,json=ioTimeRecursive,proto3" json:"io_time_recursive,omitempty"` - SectorsRecursive []*BlkIOEntry `protobuf:"bytes,8,rep,name=sectors_recursive,json=sectorsRecursive,proto3" json:"sectors_recursive,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BlkIOStat) Reset() { *m = BlkIOStat{} } -func (*BlkIOStat) ProtoMessage() {} -func (*BlkIOStat) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{9} -} -func (m *BlkIOStat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *BlkIOStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlkIOStat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *BlkIOStat) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlkIOStat.Merge(m, src) -} -func (m *BlkIOStat) XXX_Size() int { - return m.Size() -} -func (m *BlkIOStat) XXX_DiscardUnknown() { - xxx_messageInfo_BlkIOStat.DiscardUnknown(m) -} - -var xxx_messageInfo_BlkIOStat proto.InternalMessageInfo - -type BlkIOEntry struct { - Op string `protobuf:"bytes,1,opt,name=op,proto3" json:"op,omitempty"` - Device string `protobuf:"bytes,2,opt,name=device,proto3" json:"device,omitempty"` - Major uint64 `protobuf:"varint,3,opt,name=major,proto3" json:"major,omitempty"` - Minor uint64 `protobuf:"varint,4,opt,name=minor,proto3" json:"minor,omitempty"` - Value uint64 `protobuf:"varint,5,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BlkIOEntry) Reset() { *m = BlkIOEntry{} } -func (*BlkIOEntry) ProtoMessage() {} -func (*BlkIOEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{10} -} -func (m *BlkIOEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *BlkIOEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlkIOEntry.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *BlkIOEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlkIOEntry.Merge(m, src) -} -func (m *BlkIOEntry) XXX_Size() int { - return m.Size() -} -func (m *BlkIOEntry) XXX_DiscardUnknown() { - xxx_messageInfo_BlkIOEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_BlkIOEntry proto.InternalMessageInfo - -type RdmaStat struct { - Current []*RdmaEntry `protobuf:"bytes,1,rep,name=current,proto3" json:"current,omitempty"` - Limit []*RdmaEntry `protobuf:"bytes,2,rep,name=limit,proto3" json:"limit,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RdmaStat) Reset() { *m = RdmaStat{} } -func (*RdmaStat) ProtoMessage() {} -func (*RdmaStat) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{11} -} -func (m *RdmaStat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RdmaStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RdmaStat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RdmaStat) XXX_Merge(src proto.Message) { - xxx_messageInfo_RdmaStat.Merge(m, src) -} -func (m *RdmaStat) XXX_Size() int { - return m.Size() -} -func (m *RdmaStat) XXX_DiscardUnknown() { - xxx_messageInfo_RdmaStat.DiscardUnknown(m) -} - -var xxx_messageInfo_RdmaStat proto.InternalMessageInfo - -type RdmaEntry struct { - Device string `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"` - HcaHandles uint32 `protobuf:"varint,2,opt,name=hca_handles,json=hcaHandles,proto3" json:"hca_handles,omitempty"` - HcaObjects uint32 `protobuf:"varint,3,opt,name=hca_objects,json=hcaObjects,proto3" json:"hca_objects,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RdmaEntry) Reset() { *m = RdmaEntry{} } -func (*RdmaEntry) ProtoMessage() {} -func (*RdmaEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{12} -} -func (m *RdmaEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RdmaEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RdmaEntry.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RdmaEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_RdmaEntry.Merge(m, src) -} -func (m *RdmaEntry) XXX_Size() int { - return m.Size() -} -func (m *RdmaEntry) XXX_DiscardUnknown() { - xxx_messageInfo_RdmaEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_RdmaEntry proto.InternalMessageInfo - -type NetworkStat struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - RxBytes uint64 `protobuf:"varint,2,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"` - RxPackets uint64 `protobuf:"varint,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"` - RxErrors uint64 `protobuf:"varint,4,opt,name=rx_errors,json=rxErrors,proto3" json:"rx_errors,omitempty"` - RxDropped uint64 `protobuf:"varint,5,opt,name=rx_dropped,json=rxDropped,proto3" json:"rx_dropped,omitempty"` - TxBytes uint64 `protobuf:"varint,6,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"` - TxPackets uint64 `protobuf:"varint,7,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"` - TxErrors uint64 `protobuf:"varint,8,opt,name=tx_errors,json=txErrors,proto3" json:"tx_errors,omitempty"` - TxDropped uint64 `protobuf:"varint,9,opt,name=tx_dropped,json=txDropped,proto3" json:"tx_dropped,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NetworkStat) Reset() { *m = NetworkStat{} } -func (*NetworkStat) ProtoMessage() {} -func (*NetworkStat) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{13} -} -func (m *NetworkStat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NetworkStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NetworkStat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *NetworkStat) XXX_Merge(src proto.Message) { - xxx_messageInfo_NetworkStat.Merge(m, src) -} -func (m *NetworkStat) XXX_Size() int { - return m.Size() -} -func (m *NetworkStat) XXX_DiscardUnknown() { - xxx_messageInfo_NetworkStat.DiscardUnknown(m) -} - -var xxx_messageInfo_NetworkStat proto.InternalMessageInfo - -// CgroupStats exports per-cgroup statistics. -type CgroupStats struct { - // number of tasks sleeping - NrSleeping uint64 `protobuf:"varint,1,opt,name=nr_sleeping,json=nrSleeping,proto3" json:"nr_sleeping,omitempty"` - // number of tasks running - NrRunning uint64 `protobuf:"varint,2,opt,name=nr_running,json=nrRunning,proto3" json:"nr_running,omitempty"` - // number of tasks in stopped state - NrStopped uint64 `protobuf:"varint,3,opt,name=nr_stopped,json=nrStopped,proto3" json:"nr_stopped,omitempty"` - // number of tasks in uninterruptible state - NrUninterruptible uint64 `protobuf:"varint,4,opt,name=nr_uninterruptible,json=nrUninterruptible,proto3" json:"nr_uninterruptible,omitempty"` - // number of tasks waiting on IO - NrIoWait uint64 `protobuf:"varint,5,opt,name=nr_io_wait,json=nrIoWait,proto3" json:"nr_io_wait,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CgroupStats) Reset() { *m = CgroupStats{} } -func (*CgroupStats) ProtoMessage() {} -func (*CgroupStats) Descriptor() ([]byte, []int) { - return fileDescriptor_a17b2d87c332bfaa, []int{14} -} -func (m *CgroupStats) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CgroupStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CgroupStats.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *CgroupStats) XXX_Merge(src proto.Message) { - xxx_messageInfo_CgroupStats.Merge(m, src) -} -func (m *CgroupStats) XXX_Size() int { - return m.Size() -} -func (m *CgroupStats) XXX_DiscardUnknown() { - xxx_messageInfo_CgroupStats.DiscardUnknown(m) -} - -var xxx_messageInfo_CgroupStats proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Metrics)(nil), "io.containerd.cgroups.v1.Metrics") - proto.RegisterType((*HugetlbStat)(nil), "io.containerd.cgroups.v1.HugetlbStat") - proto.RegisterType((*PidsStat)(nil), "io.containerd.cgroups.v1.PidsStat") - proto.RegisterType((*CPUStat)(nil), "io.containerd.cgroups.v1.CPUStat") - proto.RegisterType((*CPUUsage)(nil), "io.containerd.cgroups.v1.CPUUsage") - proto.RegisterType((*Throttle)(nil), "io.containerd.cgroups.v1.Throttle") - proto.RegisterType((*MemoryStat)(nil), "io.containerd.cgroups.v1.MemoryStat") - proto.RegisterType((*MemoryEntry)(nil), "io.containerd.cgroups.v1.MemoryEntry") - proto.RegisterType((*MemoryOomControl)(nil), "io.containerd.cgroups.v1.MemoryOomControl") - proto.RegisterType((*BlkIOStat)(nil), "io.containerd.cgroups.v1.BlkIOStat") - proto.RegisterType((*BlkIOEntry)(nil), "io.containerd.cgroups.v1.BlkIOEntry") - proto.RegisterType((*RdmaStat)(nil), "io.containerd.cgroups.v1.RdmaStat") - proto.RegisterType((*RdmaEntry)(nil), "io.containerd.cgroups.v1.RdmaEntry") - proto.RegisterType((*NetworkStat)(nil), "io.containerd.cgroups.v1.NetworkStat") - proto.RegisterType((*CgroupStats)(nil), "io.containerd.cgroups.v1.CgroupStats") -} - -func init() { - proto.RegisterFile("github.com/containerd/cgroups/stats/v1/metrics.proto", fileDescriptor_a17b2d87c332bfaa) -} - -var fileDescriptor_a17b2d87c332bfaa = []byte{ - // 1749 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0xcd, 0x72, 0xe3, 0xc6, - 0x11, 0x36, 0x45, 0x48, 0x24, 0x9a, 0x92, 0x56, 0x9a, 0xfd, 0x83, 0xe4, 0xb5, 0x28, 0x53, 0xbb, - 0x89, 0xe2, 0xad, 0x48, 0x65, 0x27, 0xb5, 0x95, 0x75, 0xec, 0x4a, 0x59, 0x5a, 0xbb, 0x76, 0xcb, - 0x51, 0x44, 0x83, 0x52, 0xd9, 0x39, 0xa1, 0x40, 0x70, 0x16, 0x9c, 0x15, 0x80, 0x81, 0x07, 0x03, - 0x89, 0xca, 0x29, 0x87, 0x54, 0xe5, 0x94, 0x07, 0xca, 0x1b, 0xf8, 0x98, 0x4b, 0x52, 0xc9, 0x45, - 0x15, 0xf3, 0x49, 0x52, 0x33, 0x3d, 0xf8, 0xa1, 0xbc, 0x5a, 0x85, 0x37, 0x76, 0xcf, 0xd7, 0x5f, - 0xf7, 0x34, 0xbe, 0x19, 0x34, 0x08, 0xbf, 0x0e, 0x99, 0x1c, 0xe7, 0xc3, 0xbd, 0x80, 0xc7, 0xfb, - 0x01, 0x4f, 0xa4, 0xcf, 0x12, 0x2a, 0x46, 0xfb, 0x41, 0x28, 0x78, 0x9e, 0x66, 0xfb, 0x99, 0xf4, - 0x65, 0xb6, 0x7f, 0xfe, 0xf1, 0x7e, 0x4c, 0xa5, 0x60, 0x41, 0xb6, 0x97, 0x0a, 0x2e, 0x39, 0x71, - 0x18, 0xdf, 0xab, 0xd0, 0x7b, 0x06, 0xbd, 0x77, 0xfe, 0xf1, 0xe6, 0xbd, 0x90, 0x87, 0x5c, 0x83, - 0xf6, 0xd5, 0x2f, 0xc4, 0xf7, 0xfe, 0x65, 0x41, 0xeb, 0x08, 0x19, 0xc8, 0xef, 0xa0, 0x35, 0xce, - 0x43, 0x2a, 0xa3, 0xa1, 0xd3, 0xd8, 0x6e, 0xee, 0x76, 0x3e, 0x79, 0xb2, 0x77, 0x13, 0xdb, 0xde, - 0x4b, 0x04, 0x0e, 0xa4, 0x2f, 0xdd, 0x22, 0x8a, 0x3c, 0x03, 0x2b, 0x65, 0xa3, 0xcc, 0x59, 0xd8, - 0x6e, 0xec, 0x76, 0x3e, 0xe9, 0xdd, 0x1c, 0xdd, 0x67, 0xa3, 0x4c, 0x87, 0x6a, 0x3c, 0xf9, 0x0c, - 0x9a, 0x41, 0x9a, 0x3b, 0x4d, 0x1d, 0xf6, 0xe1, 0xcd, 0x61, 0x87, 0xfd, 0x53, 0x15, 0x75, 0xd0, - 0x9a, 0x5e, 0x75, 0x9b, 0x87, 0xfd, 0x53, 0x57, 0x85, 0x91, 0xcf, 0x60, 0x29, 0xa6, 0x31, 0x17, - 0x97, 0x8e, 0xa5, 0x09, 0x1e, 0xdf, 0x4c, 0x70, 0xa4, 0x71, 0x3a, 0xb3, 0x89, 0x21, 0xcf, 0x61, - 0x71, 0x18, 0x9d, 0x31, 0xee, 0x2c, 0xea, 0xe0, 0x9d, 0x9b, 0x83, 0x0f, 0xa2, 0xb3, 0x57, 0xc7, - 0x3a, 0x16, 0x23, 0xd4, 0x76, 0xc5, 0x28, 0xf6, 0x9d, 0xa5, 0xdb, 0xb6, 0xeb, 0x8e, 0x62, 0x1f, - 0xb7, 0xab, 0xf0, 0xaa, 0xcf, 0x09, 0x95, 0x17, 0x5c, 0x9c, 0x39, 0xad, 0xdb, 0xfa, 0xfc, 0x07, - 0x04, 0x62, 0x9f, 0x4d, 0x14, 0x79, 0x09, 0xcb, 0x08, 0xf1, 0xb4, 0x0a, 0x9c, 0xb6, 0x2e, 0xe0, - 0x1d, 0x2c, 0x87, 0xfa, 0xa7, 0x22, 0xc9, 0xdc, 0x4e, 0x50, 0x19, 0xe4, 0x3b, 0x20, 0xd8, 0x07, - 0x8f, 0xf3, 0xd8, 0x53, 0xc1, 0x82, 0x47, 0x8e, 0xad, 0xf9, 0x3e, 0xba, 0xad, 0x8f, 0xc7, 0x3c, - 0x3e, 0xc4, 0x08, 0x77, 0x2d, 0xbe, 0xe6, 0xe9, 0x9d, 0x41, 0xa7, 0xa6, 0x11, 0x72, 0x0f, 0x16, - 0xf3, 0xcc, 0x0f, 0xa9, 0xd3, 0xd8, 0x6e, 0xec, 0x5a, 0x2e, 0x1a, 0x64, 0x0d, 0x9a, 0xb1, 0x3f, - 0xd1, 0x7a, 0xb1, 0x5c, 0xf5, 0x93, 0x38, 0xd0, 0x7a, 0xed, 0xb3, 0x28, 0x48, 0xa4, 0x96, 0x83, - 0xe5, 0x16, 0x26, 0xd9, 0x84, 0x76, 0xea, 0x87, 0x34, 0x63, 0x7f, 0xa2, 0xfa, 0x41, 0xdb, 0x6e, - 0x69, 0xf7, 0x3e, 0x85, 0x76, 0x21, 0x29, 0xc5, 0x10, 0xe4, 0x42, 0xd0, 0x44, 0x9a, 0x5c, 0x85, - 0xa9, 0x6a, 0x88, 0x58, 0xcc, 0xa4, 0xc9, 0x87, 0x46, 0xef, 0xaf, 0x0d, 0x68, 0x19, 0x61, 0x91, - 0xdf, 0xd4, 0xab, 0x7c, 0xe7, 0x23, 0x3d, 0xec, 0x9f, 0x9e, 0x2a, 0x64, 0xb1, 0x93, 0x03, 0x00, - 0x39, 0x16, 0x5c, 0xca, 0x88, 0x25, 0xe1, 0xed, 0x07, 0xe0, 0x04, 0xb1, 0xd4, 0xad, 0x45, 0xf5, - 0xbe, 0x87, 0x76, 0x41, 0xab, 0x6a, 0x95, 0x5c, 0xfa, 0x51, 0xd1, 0x2f, 0x6d, 0x90, 0x07, 0xb0, - 0x74, 0x46, 0x45, 0x42, 0x23, 0xb3, 0x05, 0x63, 0x11, 0x02, 0x56, 0x9e, 0x51, 0x61, 0x5a, 0xa6, - 0x7f, 0x93, 0x1d, 0x68, 0xa5, 0x54, 0x78, 0xea, 0x60, 0x59, 0xdb, 0xcd, 0x5d, 0xeb, 0x00, 0xa6, - 0x57, 0xdd, 0xa5, 0x3e, 0x15, 0xea, 0xe0, 0x2c, 0xa5, 0x54, 0x1c, 0xa6, 0x79, 0x6f, 0x02, 0xed, - 0xa2, 0x14, 0xd5, 0xb8, 0x94, 0x0a, 0xc6, 0x47, 0x59, 0xd1, 0x38, 0x63, 0x92, 0xa7, 0xb0, 0x6e, - 0xca, 0xa4, 0x23, 0xaf, 0xc0, 0x60, 0x05, 0x6b, 0xe5, 0x42, 0xdf, 0x80, 0x9f, 0xc0, 0x6a, 0x05, - 0x96, 0x2c, 0xa6, 0xa6, 0xaa, 0x95, 0xd2, 0x7b, 0xc2, 0x62, 0xda, 0xfb, 0x4f, 0x07, 0xa0, 0x3a, - 0x8e, 0x6a, 0xbf, 0x81, 0x1f, 0x8c, 0x4b, 0x7d, 0x68, 0x83, 0x6c, 0x40, 0x53, 0x64, 0x26, 0x15, - 0x9e, 0x7a, 0x77, 0x30, 0x70, 0x95, 0x8f, 0xfc, 0x0c, 0xda, 0x22, 0xcb, 0x3c, 0x75, 0xf5, 0x60, - 0x82, 0x83, 0xce, 0xf4, 0xaa, 0xdb, 0x72, 0x07, 0x03, 0x25, 0x3b, 0xb7, 0x25, 0xb2, 0x4c, 0xfd, - 0x20, 0x5d, 0xe8, 0xc4, 0x7e, 0x9a, 0xd2, 0x91, 0xf7, 0x9a, 0x45, 0xa8, 0x1c, 0xcb, 0x05, 0x74, - 0x7d, 0xc5, 0x22, 0xdd, 0xe9, 0x11, 0x13, 0xf2, 0x52, 0x5f, 0x00, 0x96, 0x8b, 0x06, 0x79, 0x04, - 0xf6, 0x85, 0x60, 0x92, 0x0e, 0xfd, 0xe0, 0x4c, 0x1f, 0x70, 0xcb, 0xad, 0x1c, 0xc4, 0x81, 0x76, - 0x1a, 0x7a, 0x69, 0xe8, 0xb1, 0xc4, 0x69, 0xe1, 0x93, 0x48, 0xc3, 0x7e, 0xf8, 0x2a, 0x21, 0x9b, - 0x60, 0xe3, 0x0a, 0xcf, 0xa5, 0x3e, 0x97, 0xaa, 0x8d, 0x61, 0x3f, 0x3c, 0xce, 0x25, 0xd9, 0xd0, - 0x51, 0xaf, 0xfd, 0x3c, 0x92, 0xfa, 0x88, 0xe9, 0xa5, 0xaf, 0x94, 0x49, 0xb6, 0x61, 0x39, 0x0d, - 0xbd, 0xd8, 0x7f, 0x63, 0x96, 0x01, 0xcb, 0x4c, 0xc3, 0x23, 0xff, 0x0d, 0x22, 0x76, 0x60, 0x85, - 0x25, 0x7e, 0x20, 0xd9, 0x39, 0xf5, 0xfc, 0x84, 0x27, 0x4e, 0x47, 0x43, 0x96, 0x0b, 0xe7, 0x17, - 0x09, 0x4f, 0xd4, 0x66, 0xeb, 0x90, 0x65, 0x64, 0xa9, 0x01, 0xea, 0x2c, 0xba, 0x1f, 0x2b, 0xb3, - 0x2c, 0xba, 0x23, 0x15, 0x8b, 0x86, 0xac, 0xd6, 0x59, 0x34, 0x60, 0x1b, 0x3a, 0x79, 0x42, 0xcf, - 0x59, 0x20, 0xfd, 0x61, 0x44, 0x9d, 0x3b, 0x1a, 0x50, 0x77, 0x91, 0x4f, 0x61, 0x63, 0xcc, 0xa8, - 0xf0, 0x45, 0x30, 0x66, 0x81, 0x1f, 0x79, 0xe6, 0x92, 0xc1, 0xe3, 0xb7, 0xa6, 0xf1, 0x0f, 0xeb, - 0x00, 0x54, 0xc2, 0xef, 0xd5, 0x32, 0x79, 0x06, 0x33, 0x4b, 0x5e, 0x76, 0xe1, 0xa7, 0x26, 0x72, - 0x5d, 0x47, 0xde, 0xaf, 0x2f, 0x0f, 0x2e, 0xfc, 0x14, 0xe3, 0xba, 0xd0, 0xd1, 0xa7, 0xc4, 0x43, - 0x21, 0x11, 0x2c, 0x5b, 0xbb, 0x0e, 0xb5, 0x9a, 0x7e, 0x01, 0x36, 0x02, 0x94, 0xa6, 0xee, 0x6a, - 0xcd, 0x2c, 0x4f, 0xaf, 0xba, 0xed, 0x13, 0xe5, 0x54, 0xc2, 0x6a, 0xeb, 0x65, 0x37, 0xcb, 0xc8, - 0x33, 0x58, 0x2d, 0xa1, 0xa8, 0xb1, 0x7b, 0x1a, 0xbf, 0x36, 0xbd, 0xea, 0x2e, 0x17, 0x78, 0x2d, - 0xb4, 0xe5, 0x22, 0x46, 0xab, 0xed, 0x23, 0x58, 0xc7, 0xb8, 0xba, 0xe6, 0xee, 0xeb, 0x4a, 0xee, - 0xe8, 0x85, 0xa3, 0x4a, 0x78, 0x65, 0xbd, 0x28, 0xbf, 0x07, 0xb5, 0x7a, 0x5f, 0x68, 0x0d, 0xfe, - 0x1c, 0x30, 0xc6, 0xab, 0x94, 0xf8, 0x50, 0x83, 0xb0, 0xb6, 0x6f, 0x4b, 0x39, 0xee, 0x14, 0xd5, - 0x96, 0xa2, 0x74, 0xf0, 0x91, 0x68, 0x6f, 0x1f, 0x95, 0xf9, 0xa4, 0x60, 0xab, 0xf4, 0xb9, 0x81, - 0x0f, 0xbf, 0x44, 0x29, 0x91, 0x3e, 0xae, 0x71, 0xa1, 0x16, 0x37, 0x67, 0x50, 0xa8, 0xc6, 0xa7, - 0x40, 0x4a, 0x54, 0xa5, 0xda, 0xf7, 0x6b, 0x1b, 0xed, 0x57, 0xd2, 0xdd, 0x83, 0xbb, 0x08, 0x9e, - 0x15, 0xf0, 0x23, 0x8d, 0xc6, 0x7e, 0xbd, 0xaa, 0xab, 0xb8, 0x6c, 0x62, 0x1d, 0xfd, 0x41, 0x8d, - 0xfb, 0x8b, 0x0a, 0xfb, 0x53, 0x6e, 0xdd, 0xf2, 0xad, 0xb7, 0x70, 0xeb, 0xa6, 0x5f, 0xe7, 0xd6, - 0xe8, 0xee, 0x4f, 0xb8, 0x35, 0xf6, 0x69, 0x81, 0xad, 0x8b, 0x7d, 0xdb, 0x5c, 0x7b, 0x6a, 0xe1, - 0xb4, 0xa6, 0xf8, 0xdf, 0x16, 0xaf, 0x8e, 0x0f, 0x6f, 0x7b, 0x19, 0xa3, 0xd6, 0xbf, 0x4c, 0xa4, - 0xb8, 0x2c, 0xde, 0x1e, 0xcf, 0xc1, 0x52, 0x2a, 0x77, 0x7a, 0xf3, 0xc4, 0xea, 0x10, 0xf2, 0x79, - 0xf9, 0x4a, 0xd8, 0x99, 0x27, 0xb8, 0x78, 0x73, 0x0c, 0x00, 0xf0, 0x97, 0x27, 0x83, 0xd4, 0x79, - 0x3c, 0x07, 0xc5, 0xc1, 0xca, 0xf4, 0xaa, 0x6b, 0x7f, 0xad, 0x83, 0x4f, 0x0e, 0xfb, 0xae, 0x8d, - 0x3c, 0x27, 0x41, 0xda, 0xa3, 0xd0, 0xa9, 0x01, 0xab, 0xf7, 0x6e, 0xa3, 0xf6, 0xde, 0xad, 0x26, - 0x82, 0x85, 0xb7, 0x4c, 0x04, 0xcd, 0xb7, 0x4e, 0x04, 0xd6, 0xcc, 0x44, 0xd0, 0x93, 0xb0, 0x76, - 0x7d, 0x10, 0x21, 0xbb, 0xb0, 0xa6, 0x26, 0x99, 0x33, 0x16, 0xa9, 0x73, 0x95, 0xe9, 0x47, 0x86, - 0x69, 0x57, 0x39, 0x8f, 0xbf, 0x66, 0x51, 0xf4, 0x02, 0xbd, 0xe4, 0x7d, 0xb0, 0xf3, 0x64, 0x44, - 0x85, 0x9a, 0x7c, 0x4c, 0x0d, 0x6d, 0xed, 0x38, 0xe6, 0xb1, 0xba, 0xaa, 0x0b, 0x9a, 0x62, 0x0e, - 0x31, 0xe1, 0xbd, 0x7f, 0x2e, 0x82, 0x5d, 0x8e, 0x82, 0xc4, 0x87, 0x4d, 0xc6, 0xbd, 0x8c, 0x8a, - 0x73, 0x16, 0x50, 0x6f, 0x78, 0x29, 0x69, 0xe6, 0x09, 0x1a, 0xe4, 0x22, 0x63, 0xe7, 0xd4, 0x8c, - 0xd1, 0x8f, 0x6f, 0x99, 0x29, 0xf1, 0x89, 0x3c, 0x64, 0x7c, 0x80, 0x34, 0x07, 0x8a, 0xc5, 0x2d, - 0x48, 0xc8, 0x77, 0x70, 0xbf, 0x4a, 0x31, 0xaa, 0xb1, 0x2f, 0xcc, 0xc1, 0x7e, 0xb7, 0x64, 0x1f, - 0x55, 0xcc, 0x27, 0x70, 0x97, 0x71, 0xef, 0xfb, 0x9c, 0xe6, 0x33, 0xbc, 0xcd, 0x39, 0x78, 0xd7, - 0x19, 0xff, 0x46, 0xc7, 0x57, 0xac, 0x1e, 0x6c, 0xd4, 0x5a, 0xa2, 0x26, 0x80, 0x1a, 0xb7, 0x35, - 0x07, 0xf7, 0x83, 0xb2, 0x66, 0x35, 0x31, 0x54, 0x09, 0xfe, 0x08, 0x0f, 0x18, 0xf7, 0x2e, 0x7c, - 0x26, 0xaf, 0xb3, 0x2f, 0xce, 0xd7, 0x91, 0x6f, 0x7d, 0x26, 0x67, 0xa9, 0xb1, 0x23, 0x31, 0x15, - 0xe1, 0x4c, 0x47, 0x96, 0xe6, 0xeb, 0xc8, 0x91, 0x8e, 0xaf, 0x58, 0xfb, 0xb0, 0xce, 0xf8, 0xf5, - 0x5a, 0x5b, 0x73, 0x70, 0xde, 0x61, 0x7c, 0xb6, 0xce, 0x6f, 0x60, 0x3d, 0xa3, 0x81, 0xe4, 0xa2, - 0xae, 0xb6, 0xf6, 0x1c, 0x8c, 0x6b, 0x26, 0xbc, 0xa4, 0xec, 0x9d, 0x03, 0x54, 0xeb, 0x64, 0x15, - 0x16, 0x78, 0xaa, 0x4f, 0x8e, 0xed, 0x2e, 0xf0, 0x54, 0x4d, 0x9e, 0x23, 0x75, 0xd9, 0xe1, 0x71, - 0xb5, 0x5d, 0x63, 0xa9, 0x53, 0x1c, 0xfb, 0x6f, 0x78, 0x31, 0x7a, 0xa2, 0xa1, 0xbd, 0x2c, 0xe1, - 0xc2, 0x9c, 0x58, 0x34, 0x94, 0xf7, 0xdc, 0x8f, 0x72, 0x5a, 0x4c, 0x5a, 0xda, 0xe8, 0xfd, 0xa5, - 0x01, 0xed, 0xe2, 0x03, 0x89, 0x7c, 0x5e, 0x1f, 0xde, 0x9b, 0xef, 0xfe, 0x1e, 0x53, 0x41, 0xb8, - 0x99, 0x72, 0xc2, 0x7f, 0x5e, 0x4d, 0xf8, 0xff, 0x77, 0xb0, 0xf9, 0x0c, 0xa0, 0x60, 0x97, 0xbe, - 0xda, 0x6e, 0x1b, 0x33, 0xbb, 0xed, 0x42, 0x67, 0x1c, 0xf8, 0xde, 0xd8, 0x4f, 0x46, 0x11, 0xc5, - 0xb9, 0x74, 0xc5, 0x85, 0x71, 0xe0, 0xbf, 0x44, 0x4f, 0x01, 0xe0, 0xc3, 0x37, 0x34, 0x90, 0x99, - 0x6e, 0x0a, 0x02, 0x8e, 0xd1, 0xd3, 0xfb, 0xdb, 0x02, 0x74, 0x6a, 0xdf, 0x74, 0x6a, 0x72, 0x4f, - 0xfc, 0xb8, 0xc8, 0xa3, 0x7f, 0xab, 0xcb, 0x47, 0x4c, 0xf0, 0x2e, 0x31, 0x17, 0x53, 0x4b, 0x4c, - 0xf4, 0xa5, 0x40, 0x3e, 0x00, 0x10, 0x13, 0x2f, 0xf5, 0x83, 0x33, 0x6a, 0xe8, 0x2d, 0xd7, 0x16, - 0x93, 0x3e, 0x3a, 0xd4, 0x9d, 0x26, 0x26, 0x1e, 0x15, 0x82, 0x8b, 0xcc, 0xf4, 0xbe, 0x2d, 0x26, - 0x5f, 0x6a, 0xdb, 0xc4, 0x8e, 0x04, 0x57, 0x13, 0x88, 0x79, 0x06, 0xb6, 0x98, 0xbc, 0x40, 0x87, - 0xca, 0x2a, 0x8b, 0xac, 0x38, 0xf0, 0xb6, 0x64, 0x95, 0x55, 0x56, 0x59, 0x71, 0xe0, 0xb5, 0x65, - 0x3d, 0xab, 0x2c, 0xb3, 0xe2, 0xcc, 0xdb, 0x96, 0xb5, 0xac, 0xb2, 0xca, 0x6a, 0x17, 0xb1, 0x26, - 0x6b, 0xef, 0xef, 0x0d, 0xe8, 0xd4, 0xbe, 0x4e, 0x55, 0x03, 0x13, 0xe1, 0x65, 0x11, 0xa5, 0xa9, - 0xfa, 0x90, 0xc2, 0xab, 0x1b, 0x12, 0x31, 0x30, 0x1e, 0xc5, 0x97, 0x08, 0x4f, 0xe4, 0x49, 0x52, - 0x7c, 0x68, 0x59, 0xae, 0x9d, 0x08, 0x17, 0x1d, 0x66, 0x39, 0x93, 0x98, 0xae, 0x59, 0x2c, 0x0f, - 0xd0, 0x41, 0x7e, 0x09, 0x24, 0x11, 0x5e, 0x9e, 0xb0, 0x44, 0x52, 0x21, 0xf2, 0x54, 0xb2, 0x61, - 0xf9, 0x51, 0xb0, 0x9e, 0x88, 0xd3, 0xd9, 0x05, 0xf2, 0x48, 0xb3, 0x99, 0xcb, 0xc6, 0xb4, 0xac, - 0x9d, 0x88, 0x57, 0xfa, 0xe6, 0x38, 0x70, 0x7e, 0xf8, 0x71, 0xeb, 0xbd, 0x7f, 0xff, 0xb8, 0xf5, - 0xde, 0x9f, 0xa7, 0x5b, 0x8d, 0x1f, 0xa6, 0x5b, 0x8d, 0x7f, 0x4c, 0xb7, 0x1a, 0xff, 0x9d, 0x6e, - 0x35, 0x86, 0x4b, 0xfa, 0xcf, 0x95, 0x5f, 0xfd, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xc4, 0x4e, 0x24, - 0x22, 0xc4, 0x11, 0x00, 0x00, -} - -func (m *Metrics) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Metrics) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Metrics) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.MemoryOomControl != nil { - { - size, err := m.MemoryOomControl.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - if m.CgroupStats != nil { - { - size, err := m.CgroupStats.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - if len(m.Network) > 0 { - for iNdEx := len(m.Network) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Network[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if m.Rdma != nil { - { - size, err := m.Rdma.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - if m.Blkio != nil { - { - size, err := m.Blkio.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if m.Memory != nil { - { - size, err := m.Memory.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.CPU != nil { - { - size, err := m.CPU.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.Pids != nil { - { - size, err := m.Pids.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Hugetlb) > 0 { - for iNdEx := len(m.Hugetlb) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Hugetlb[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *HugetlbStat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *HugetlbStat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *HugetlbStat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Pagesize) > 0 { - i -= len(m.Pagesize) - copy(dAtA[i:], m.Pagesize) - i = encodeVarintMetrics(dAtA, i, uint64(len(m.Pagesize))) - i-- - dAtA[i] = 0x22 - } - if m.Failcnt != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Failcnt)) - i-- - dAtA[i] = 0x18 - } - if m.Max != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Max)) - i-- - dAtA[i] = 0x10 - } - if m.Usage != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Usage)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *PidsStat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PidsStat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PidsStat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Limit != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Limit)) - i-- - dAtA[i] = 0x10 - } - if m.Current != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Current)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *CPUStat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CPUStat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CPUStat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Throttling != nil { - { - size, err := m.Throttling.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Usage != nil { - { - size, err := m.Usage.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CPUUsage) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CPUUsage) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CPUUsage) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.PerCPU) > 0 { - dAtA11 := make([]byte, len(m.PerCPU)*10) - var j10 int - for _, num := range m.PerCPU { - for num >= 1<<7 { - dAtA11[j10] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j10++ - } - dAtA11[j10] = uint8(num) - j10++ - } - i -= j10 - copy(dAtA[i:], dAtA11[:j10]) - i = encodeVarintMetrics(dAtA, i, uint64(j10)) - i-- - dAtA[i] = 0x22 - } - if m.User != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.User)) - i-- - dAtA[i] = 0x18 - } - if m.Kernel != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Kernel)) - i-- - dAtA[i] = 0x10 - } - if m.Total != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Total)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Throttle) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Throttle) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Throttle) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.ThrottledTime != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.ThrottledTime)) - i-- - dAtA[i] = 0x18 - } - if m.ThrottledPeriods != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.ThrottledPeriods)) - i-- - dAtA[i] = 0x10 - } - if m.Periods != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Periods)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *MemoryStat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MemoryStat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MemoryStat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.KernelTCP != nil { - { - size, err := m.KernelTCP.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2 - i-- - dAtA[i] = 0xa2 - } - if m.Kernel != nil { - { - size, err := m.Kernel.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2 - i-- - dAtA[i] = 0x9a - } - if m.Swap != nil { - { - size, err := m.Swap.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2 - i-- - dAtA[i] = 0x92 - } - if m.Usage != nil { - { - size, err := m.Usage.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2 - i-- - dAtA[i] = 0x8a - } - if m.TotalUnevictable != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalUnevictable)) - i-- - dAtA[i] = 0x2 - i-- - dAtA[i] = 0x80 - } - if m.TotalActiveFile != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalActiveFile)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xf8 - } - if m.TotalInactiveFile != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalInactiveFile)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xf0 - } - if m.TotalActiveAnon != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalActiveAnon)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xe8 - } - if m.TotalInactiveAnon != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalInactiveAnon)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xe0 - } - if m.TotalPgMajFault != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalPgMajFault)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xd8 - } - if m.TotalPgFault != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalPgFault)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xd0 - } - if m.TotalPgPgOut != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalPgPgOut)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xc8 - } - if m.TotalPgPgIn != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalPgPgIn)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xc0 - } - if m.TotalWriteback != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalWriteback)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xb8 - } - if m.TotalDirty != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalDirty)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xb0 - } - if m.TotalMappedFile != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalMappedFile)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xa8 - } - if m.TotalRSSHuge != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalRSSHuge)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xa0 - } - if m.TotalRSS != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalRSS)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x98 - } - if m.TotalCache != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TotalCache)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x90 - } - if m.HierarchicalSwapLimit != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.HierarchicalSwapLimit)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x88 - } - if m.HierarchicalMemoryLimit != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.HierarchicalMemoryLimit)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x80 - } - if m.Unevictable != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Unevictable)) - i-- - dAtA[i] = 0x78 - } - if m.ActiveFile != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.ActiveFile)) - i-- - dAtA[i] = 0x70 - } - if m.InactiveFile != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.InactiveFile)) - i-- - dAtA[i] = 0x68 - } - if m.ActiveAnon != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.ActiveAnon)) - i-- - dAtA[i] = 0x60 - } - if m.InactiveAnon != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.InactiveAnon)) - i-- - dAtA[i] = 0x58 - } - if m.PgMajFault != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.PgMajFault)) - i-- - dAtA[i] = 0x50 - } - if m.PgFault != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.PgFault)) - i-- - dAtA[i] = 0x48 - } - if m.PgPgOut != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.PgPgOut)) - i-- - dAtA[i] = 0x40 - } - if m.PgPgIn != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.PgPgIn)) - i-- - dAtA[i] = 0x38 - } - if m.Writeback != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Writeback)) - i-- - dAtA[i] = 0x30 - } - if m.Dirty != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Dirty)) - i-- - dAtA[i] = 0x28 - } - if m.MappedFile != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.MappedFile)) - i-- - dAtA[i] = 0x20 - } - if m.RSSHuge != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.RSSHuge)) - i-- - dAtA[i] = 0x18 - } - if m.RSS != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.RSS)) - i-- - dAtA[i] = 0x10 - } - if m.Cache != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Cache)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *MemoryEntry) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MemoryEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MemoryEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Failcnt != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Failcnt)) - i-- - dAtA[i] = 0x20 - } - if m.Max != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Max)) - i-- - dAtA[i] = 0x18 - } - if m.Usage != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Usage)) - i-- - dAtA[i] = 0x10 - } - if m.Limit != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Limit)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *MemoryOomControl) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MemoryOomControl) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MemoryOomControl) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.OomKill != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.OomKill)) - i-- - dAtA[i] = 0x18 - } - if m.UnderOom != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.UnderOom)) - i-- - dAtA[i] = 0x10 - } - if m.OomKillDisable != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.OomKillDisable)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *BlkIOStat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *BlkIOStat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlkIOStat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.SectorsRecursive) > 0 { - for iNdEx := len(m.SectorsRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.SectorsRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - } - if len(m.IoTimeRecursive) > 0 { - for iNdEx := len(m.IoTimeRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IoTimeRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if len(m.IoMergedRecursive) > 0 { - for iNdEx := len(m.IoMergedRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IoMergedRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.IoWaitTimeRecursive) > 0 { - for iNdEx := len(m.IoWaitTimeRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IoWaitTimeRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - } - if len(m.IoServiceTimeRecursive) > 0 { - for iNdEx := len(m.IoServiceTimeRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IoServiceTimeRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.IoQueuedRecursive) > 0 { - for iNdEx := len(m.IoQueuedRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IoQueuedRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.IoServicedRecursive) > 0 { - for iNdEx := len(m.IoServicedRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IoServicedRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.IoServiceBytesRecursive) > 0 { - for iNdEx := len(m.IoServiceBytesRecursive) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IoServiceBytesRecursive[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *BlkIOEntry) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *BlkIOEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlkIOEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Value != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Value)) - i-- - dAtA[i] = 0x28 - } - if m.Minor != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x20 - } - if m.Major != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x18 - } - if len(m.Device) > 0 { - i -= len(m.Device) - copy(dAtA[i:], m.Device) - i = encodeVarintMetrics(dAtA, i, uint64(len(m.Device))) - i-- - dAtA[i] = 0x12 - } - if len(m.Op) > 0 { - i -= len(m.Op) - copy(dAtA[i:], m.Op) - i = encodeVarintMetrics(dAtA, i, uint64(len(m.Op))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RdmaStat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RdmaStat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RdmaStat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Limit) > 0 { - for iNdEx := len(m.Limit) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Limit[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Current) > 0 { - for iNdEx := len(m.Current) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Current[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintMetrics(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *RdmaEntry) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RdmaEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RdmaEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.HcaObjects != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.HcaObjects)) - i-- - dAtA[i] = 0x18 - } - if m.HcaHandles != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.HcaHandles)) - i-- - dAtA[i] = 0x10 - } - if len(m.Device) > 0 { - i -= len(m.Device) - copy(dAtA[i:], m.Device) - i = encodeVarintMetrics(dAtA, i, uint64(len(m.Device))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NetworkStat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NetworkStat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NetworkStat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.TxDropped != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TxDropped)) - i-- - dAtA[i] = 0x48 - } - if m.TxErrors != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TxErrors)) - i-- - dAtA[i] = 0x40 - } - if m.TxPackets != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TxPackets)) - i-- - dAtA[i] = 0x38 - } - if m.TxBytes != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.TxBytes)) - i-- - dAtA[i] = 0x30 - } - if m.RxDropped != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.RxDropped)) - i-- - dAtA[i] = 0x28 - } - if m.RxErrors != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.RxErrors)) - i-- - dAtA[i] = 0x20 - } - if m.RxPackets != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.RxPackets)) - i-- - dAtA[i] = 0x18 - } - if m.RxBytes != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.RxBytes)) - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintMetrics(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CgroupStats) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CgroupStats) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CgroupStats) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.NrIoWait != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.NrIoWait)) - i-- - dAtA[i] = 0x28 - } - if m.NrUninterruptible != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.NrUninterruptible)) - i-- - dAtA[i] = 0x20 - } - if m.NrStopped != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.NrStopped)) - i-- - dAtA[i] = 0x18 - } - if m.NrRunning != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.NrRunning)) - i-- - dAtA[i] = 0x10 - } - if m.NrSleeping != 0 { - i = encodeVarintMetrics(dAtA, i, uint64(m.NrSleeping)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintMetrics(dAtA []byte, offset int, v uint64) int { - offset -= sovMetrics(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Metrics) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Hugetlb) > 0 { - for _, e := range m.Hugetlb { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if m.Pids != nil { - l = m.Pids.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.CPU != nil { - l = m.CPU.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.Memory != nil { - l = m.Memory.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.Blkio != nil { - l = m.Blkio.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.Rdma != nil { - l = m.Rdma.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if len(m.Network) > 0 { - for _, e := range m.Network { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if m.CgroupStats != nil { - l = m.CgroupStats.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.MemoryOomControl != nil { - l = m.MemoryOomControl.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *HugetlbStat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Usage != 0 { - n += 1 + sovMetrics(uint64(m.Usage)) - } - if m.Max != 0 { - n += 1 + sovMetrics(uint64(m.Max)) - } - if m.Failcnt != 0 { - n += 1 + sovMetrics(uint64(m.Failcnt)) - } - l = len(m.Pagesize) - if l > 0 { - n += 1 + l + sovMetrics(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *PidsStat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Current != 0 { - n += 1 + sovMetrics(uint64(m.Current)) - } - if m.Limit != 0 { - n += 1 + sovMetrics(uint64(m.Limit)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CPUStat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Usage != nil { - l = m.Usage.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.Throttling != nil { - l = m.Throttling.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CPUUsage) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Total != 0 { - n += 1 + sovMetrics(uint64(m.Total)) - } - if m.Kernel != 0 { - n += 1 + sovMetrics(uint64(m.Kernel)) - } - if m.User != 0 { - n += 1 + sovMetrics(uint64(m.User)) - } - if len(m.PerCPU) > 0 { - l = 0 - for _, e := range m.PerCPU { - l += sovMetrics(uint64(e)) - } - n += 1 + sovMetrics(uint64(l)) + l - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Throttle) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Periods != 0 { - n += 1 + sovMetrics(uint64(m.Periods)) - } - if m.ThrottledPeriods != 0 { - n += 1 + sovMetrics(uint64(m.ThrottledPeriods)) - } - if m.ThrottledTime != 0 { - n += 1 + sovMetrics(uint64(m.ThrottledTime)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *MemoryStat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Cache != 0 { - n += 1 + sovMetrics(uint64(m.Cache)) - } - if m.RSS != 0 { - n += 1 + sovMetrics(uint64(m.RSS)) - } - if m.RSSHuge != 0 { - n += 1 + sovMetrics(uint64(m.RSSHuge)) - } - if m.MappedFile != 0 { - n += 1 + sovMetrics(uint64(m.MappedFile)) - } - if m.Dirty != 0 { - n += 1 + sovMetrics(uint64(m.Dirty)) - } - if m.Writeback != 0 { - n += 1 + sovMetrics(uint64(m.Writeback)) - } - if m.PgPgIn != 0 { - n += 1 + sovMetrics(uint64(m.PgPgIn)) - } - if m.PgPgOut != 0 { - n += 1 + sovMetrics(uint64(m.PgPgOut)) - } - if m.PgFault != 0 { - n += 1 + sovMetrics(uint64(m.PgFault)) - } - if m.PgMajFault != 0 { - n += 1 + sovMetrics(uint64(m.PgMajFault)) - } - if m.InactiveAnon != 0 { - n += 1 + sovMetrics(uint64(m.InactiveAnon)) - } - if m.ActiveAnon != 0 { - n += 1 + sovMetrics(uint64(m.ActiveAnon)) - } - if m.InactiveFile != 0 { - n += 1 + sovMetrics(uint64(m.InactiveFile)) - } - if m.ActiveFile != 0 { - n += 1 + sovMetrics(uint64(m.ActiveFile)) - } - if m.Unevictable != 0 { - n += 1 + sovMetrics(uint64(m.Unevictable)) - } - if m.HierarchicalMemoryLimit != 0 { - n += 2 + sovMetrics(uint64(m.HierarchicalMemoryLimit)) - } - if m.HierarchicalSwapLimit != 0 { - n += 2 + sovMetrics(uint64(m.HierarchicalSwapLimit)) - } - if m.TotalCache != 0 { - n += 2 + sovMetrics(uint64(m.TotalCache)) - } - if m.TotalRSS != 0 { - n += 2 + sovMetrics(uint64(m.TotalRSS)) - } - if m.TotalRSSHuge != 0 { - n += 2 + sovMetrics(uint64(m.TotalRSSHuge)) - } - if m.TotalMappedFile != 0 { - n += 2 + sovMetrics(uint64(m.TotalMappedFile)) - } - if m.TotalDirty != 0 { - n += 2 + sovMetrics(uint64(m.TotalDirty)) - } - if m.TotalWriteback != 0 { - n += 2 + sovMetrics(uint64(m.TotalWriteback)) - } - if m.TotalPgPgIn != 0 { - n += 2 + sovMetrics(uint64(m.TotalPgPgIn)) - } - if m.TotalPgPgOut != 0 { - n += 2 + sovMetrics(uint64(m.TotalPgPgOut)) - } - if m.TotalPgFault != 0 { - n += 2 + sovMetrics(uint64(m.TotalPgFault)) - } - if m.TotalPgMajFault != 0 { - n += 2 + sovMetrics(uint64(m.TotalPgMajFault)) - } - if m.TotalInactiveAnon != 0 { - n += 2 + sovMetrics(uint64(m.TotalInactiveAnon)) - } - if m.TotalActiveAnon != 0 { - n += 2 + sovMetrics(uint64(m.TotalActiveAnon)) - } - if m.TotalInactiveFile != 0 { - n += 2 + sovMetrics(uint64(m.TotalInactiveFile)) - } - if m.TotalActiveFile != 0 { - n += 2 + sovMetrics(uint64(m.TotalActiveFile)) - } - if m.TotalUnevictable != 0 { - n += 2 + sovMetrics(uint64(m.TotalUnevictable)) - } - if m.Usage != nil { - l = m.Usage.Size() - n += 2 + l + sovMetrics(uint64(l)) - } - if m.Swap != nil { - l = m.Swap.Size() - n += 2 + l + sovMetrics(uint64(l)) - } - if m.Kernel != nil { - l = m.Kernel.Size() - n += 2 + l + sovMetrics(uint64(l)) - } - if m.KernelTCP != nil { - l = m.KernelTCP.Size() - n += 2 + l + sovMetrics(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *MemoryEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Limit != 0 { - n += 1 + sovMetrics(uint64(m.Limit)) - } - if m.Usage != 0 { - n += 1 + sovMetrics(uint64(m.Usage)) - } - if m.Max != 0 { - n += 1 + sovMetrics(uint64(m.Max)) - } - if m.Failcnt != 0 { - n += 1 + sovMetrics(uint64(m.Failcnt)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *MemoryOomControl) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.OomKillDisable != 0 { - n += 1 + sovMetrics(uint64(m.OomKillDisable)) - } - if m.UnderOom != 0 { - n += 1 + sovMetrics(uint64(m.UnderOom)) - } - if m.OomKill != 0 { - n += 1 + sovMetrics(uint64(m.OomKill)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *BlkIOStat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.IoServiceBytesRecursive) > 0 { - for _, e := range m.IoServiceBytesRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.IoServicedRecursive) > 0 { - for _, e := range m.IoServicedRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.IoQueuedRecursive) > 0 { - for _, e := range m.IoQueuedRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.IoServiceTimeRecursive) > 0 { - for _, e := range m.IoServiceTimeRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.IoWaitTimeRecursive) > 0 { - for _, e := range m.IoWaitTimeRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.IoMergedRecursive) > 0 { - for _, e := range m.IoMergedRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.IoTimeRecursive) > 0 { - for _, e := range m.IoTimeRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.SectorsRecursive) > 0 { - for _, e := range m.SectorsRecursive { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *BlkIOEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Op) - if l > 0 { - n += 1 + l + sovMetrics(uint64(l)) - } - l = len(m.Device) - if l > 0 { - n += 1 + l + sovMetrics(uint64(l)) - } - if m.Major != 0 { - n += 1 + sovMetrics(uint64(m.Major)) - } - if m.Minor != 0 { - n += 1 + sovMetrics(uint64(m.Minor)) - } - if m.Value != 0 { - n += 1 + sovMetrics(uint64(m.Value)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RdmaStat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Current) > 0 { - for _, e := range m.Current { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if len(m.Limit) > 0 { - for _, e := range m.Limit { - l = e.Size() - n += 1 + l + sovMetrics(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RdmaEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Device) - if l > 0 { - n += 1 + l + sovMetrics(uint64(l)) - } - if m.HcaHandles != 0 { - n += 1 + sovMetrics(uint64(m.HcaHandles)) - } - if m.HcaObjects != 0 { - n += 1 + sovMetrics(uint64(m.HcaObjects)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NetworkStat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovMetrics(uint64(l)) - } - if m.RxBytes != 0 { - n += 1 + sovMetrics(uint64(m.RxBytes)) - } - if m.RxPackets != 0 { - n += 1 + sovMetrics(uint64(m.RxPackets)) - } - if m.RxErrors != 0 { - n += 1 + sovMetrics(uint64(m.RxErrors)) - } - if m.RxDropped != 0 { - n += 1 + sovMetrics(uint64(m.RxDropped)) - } - if m.TxBytes != 0 { - n += 1 + sovMetrics(uint64(m.TxBytes)) - } - if m.TxPackets != 0 { - n += 1 + sovMetrics(uint64(m.TxPackets)) - } - if m.TxErrors != 0 { - n += 1 + sovMetrics(uint64(m.TxErrors)) - } - if m.TxDropped != 0 { - n += 1 + sovMetrics(uint64(m.TxDropped)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CgroupStats) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NrSleeping != 0 { - n += 1 + sovMetrics(uint64(m.NrSleeping)) - } - if m.NrRunning != 0 { - n += 1 + sovMetrics(uint64(m.NrRunning)) - } - if m.NrStopped != 0 { - n += 1 + sovMetrics(uint64(m.NrStopped)) - } - if m.NrUninterruptible != 0 { - n += 1 + sovMetrics(uint64(m.NrUninterruptible)) - } - if m.NrIoWait != 0 { - n += 1 + sovMetrics(uint64(m.NrIoWait)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovMetrics(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozMetrics(x uint64) (n int) { - return sovMetrics(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *Metrics) String() string { - if this == nil { - return "nil" - } - repeatedStringForHugetlb := "[]*HugetlbStat{" - for _, f := range this.Hugetlb { - repeatedStringForHugetlb += strings.Replace(f.String(), "HugetlbStat", "HugetlbStat", 1) + "," - } - repeatedStringForHugetlb += "}" - repeatedStringForNetwork := "[]*NetworkStat{" - for _, f := range this.Network { - repeatedStringForNetwork += strings.Replace(f.String(), "NetworkStat", "NetworkStat", 1) + "," - } - repeatedStringForNetwork += "}" - s := strings.Join([]string{`&Metrics{`, - `Hugetlb:` + repeatedStringForHugetlb + `,`, - `Pids:` + strings.Replace(this.Pids.String(), "PidsStat", "PidsStat", 1) + `,`, - `CPU:` + strings.Replace(this.CPU.String(), "CPUStat", "CPUStat", 1) + `,`, - `Memory:` + strings.Replace(this.Memory.String(), "MemoryStat", "MemoryStat", 1) + `,`, - `Blkio:` + strings.Replace(this.Blkio.String(), "BlkIOStat", "BlkIOStat", 1) + `,`, - `Rdma:` + strings.Replace(this.Rdma.String(), "RdmaStat", "RdmaStat", 1) + `,`, - `Network:` + repeatedStringForNetwork + `,`, - `CgroupStats:` + strings.Replace(this.CgroupStats.String(), "CgroupStats", "CgroupStats", 1) + `,`, - `MemoryOomControl:` + strings.Replace(this.MemoryOomControl.String(), "MemoryOomControl", "MemoryOomControl", 1) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *HugetlbStat) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&HugetlbStat{`, - `Usage:` + fmt.Sprintf("%v", this.Usage) + `,`, - `Max:` + fmt.Sprintf("%v", this.Max) + `,`, - `Failcnt:` + fmt.Sprintf("%v", this.Failcnt) + `,`, - `Pagesize:` + fmt.Sprintf("%v", this.Pagesize) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *PidsStat) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PidsStat{`, - `Current:` + fmt.Sprintf("%v", this.Current) + `,`, - `Limit:` + fmt.Sprintf("%v", this.Limit) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *CPUStat) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&CPUStat{`, - `Usage:` + strings.Replace(this.Usage.String(), "CPUUsage", "CPUUsage", 1) + `,`, - `Throttling:` + strings.Replace(this.Throttling.String(), "Throttle", "Throttle", 1) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *CPUUsage) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&CPUUsage{`, - `Total:` + fmt.Sprintf("%v", this.Total) + `,`, - `Kernel:` + fmt.Sprintf("%v", this.Kernel) + `,`, - `User:` + fmt.Sprintf("%v", this.User) + `,`, - `PerCPU:` + fmt.Sprintf("%v", this.PerCPU) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Throttle) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Throttle{`, - `Periods:` + fmt.Sprintf("%v", this.Periods) + `,`, - `ThrottledPeriods:` + fmt.Sprintf("%v", this.ThrottledPeriods) + `,`, - `ThrottledTime:` + fmt.Sprintf("%v", this.ThrottledTime) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *MemoryStat) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&MemoryStat{`, - `Cache:` + fmt.Sprintf("%v", this.Cache) + `,`, - `RSS:` + fmt.Sprintf("%v", this.RSS) + `,`, - `RSSHuge:` + fmt.Sprintf("%v", this.RSSHuge) + `,`, - `MappedFile:` + fmt.Sprintf("%v", this.MappedFile) + `,`, - `Dirty:` + fmt.Sprintf("%v", this.Dirty) + `,`, - `Writeback:` + fmt.Sprintf("%v", this.Writeback) + `,`, - `PgPgIn:` + fmt.Sprintf("%v", this.PgPgIn) + `,`, - `PgPgOut:` + fmt.Sprintf("%v", this.PgPgOut) + `,`, - `PgFault:` + fmt.Sprintf("%v", this.PgFault) + `,`, - `PgMajFault:` + fmt.Sprintf("%v", this.PgMajFault) + `,`, - `InactiveAnon:` + fmt.Sprintf("%v", this.InactiveAnon) + `,`, - `ActiveAnon:` + fmt.Sprintf("%v", this.ActiveAnon) + `,`, - `InactiveFile:` + fmt.Sprintf("%v", this.InactiveFile) + `,`, - `ActiveFile:` + fmt.Sprintf("%v", this.ActiveFile) + `,`, - `Unevictable:` + fmt.Sprintf("%v", this.Unevictable) + `,`, - `HierarchicalMemoryLimit:` + fmt.Sprintf("%v", this.HierarchicalMemoryLimit) + `,`, - `HierarchicalSwapLimit:` + fmt.Sprintf("%v", this.HierarchicalSwapLimit) + `,`, - `TotalCache:` + fmt.Sprintf("%v", this.TotalCache) + `,`, - `TotalRSS:` + fmt.Sprintf("%v", this.TotalRSS) + `,`, - `TotalRSSHuge:` + fmt.Sprintf("%v", this.TotalRSSHuge) + `,`, - `TotalMappedFile:` + fmt.Sprintf("%v", this.TotalMappedFile) + `,`, - `TotalDirty:` + fmt.Sprintf("%v", this.TotalDirty) + `,`, - `TotalWriteback:` + fmt.Sprintf("%v", this.TotalWriteback) + `,`, - `TotalPgPgIn:` + fmt.Sprintf("%v", this.TotalPgPgIn) + `,`, - `TotalPgPgOut:` + fmt.Sprintf("%v", this.TotalPgPgOut) + `,`, - `TotalPgFault:` + fmt.Sprintf("%v", this.TotalPgFault) + `,`, - `TotalPgMajFault:` + fmt.Sprintf("%v", this.TotalPgMajFault) + `,`, - `TotalInactiveAnon:` + fmt.Sprintf("%v", this.TotalInactiveAnon) + `,`, - `TotalActiveAnon:` + fmt.Sprintf("%v", this.TotalActiveAnon) + `,`, - `TotalInactiveFile:` + fmt.Sprintf("%v", this.TotalInactiveFile) + `,`, - `TotalActiveFile:` + fmt.Sprintf("%v", this.TotalActiveFile) + `,`, - `TotalUnevictable:` + fmt.Sprintf("%v", this.TotalUnevictable) + `,`, - `Usage:` + strings.Replace(this.Usage.String(), "MemoryEntry", "MemoryEntry", 1) + `,`, - `Swap:` + strings.Replace(this.Swap.String(), "MemoryEntry", "MemoryEntry", 1) + `,`, - `Kernel:` + strings.Replace(this.Kernel.String(), "MemoryEntry", "MemoryEntry", 1) + `,`, - `KernelTCP:` + strings.Replace(this.KernelTCP.String(), "MemoryEntry", "MemoryEntry", 1) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *MemoryEntry) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&MemoryEntry{`, - `Limit:` + fmt.Sprintf("%v", this.Limit) + `,`, - `Usage:` + fmt.Sprintf("%v", this.Usage) + `,`, - `Max:` + fmt.Sprintf("%v", this.Max) + `,`, - `Failcnt:` + fmt.Sprintf("%v", this.Failcnt) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *MemoryOomControl) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&MemoryOomControl{`, - `OomKillDisable:` + fmt.Sprintf("%v", this.OomKillDisable) + `,`, - `UnderOom:` + fmt.Sprintf("%v", this.UnderOom) + `,`, - `OomKill:` + fmt.Sprintf("%v", this.OomKill) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *BlkIOStat) String() string { - if this == nil { - return "nil" - } - repeatedStringForIoServiceBytesRecursive := "[]*BlkIOEntry{" - for _, f := range this.IoServiceBytesRecursive { - repeatedStringForIoServiceBytesRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForIoServiceBytesRecursive += "}" - repeatedStringForIoServicedRecursive := "[]*BlkIOEntry{" - for _, f := range this.IoServicedRecursive { - repeatedStringForIoServicedRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForIoServicedRecursive += "}" - repeatedStringForIoQueuedRecursive := "[]*BlkIOEntry{" - for _, f := range this.IoQueuedRecursive { - repeatedStringForIoQueuedRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForIoQueuedRecursive += "}" - repeatedStringForIoServiceTimeRecursive := "[]*BlkIOEntry{" - for _, f := range this.IoServiceTimeRecursive { - repeatedStringForIoServiceTimeRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForIoServiceTimeRecursive += "}" - repeatedStringForIoWaitTimeRecursive := "[]*BlkIOEntry{" - for _, f := range this.IoWaitTimeRecursive { - repeatedStringForIoWaitTimeRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForIoWaitTimeRecursive += "}" - repeatedStringForIoMergedRecursive := "[]*BlkIOEntry{" - for _, f := range this.IoMergedRecursive { - repeatedStringForIoMergedRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForIoMergedRecursive += "}" - repeatedStringForIoTimeRecursive := "[]*BlkIOEntry{" - for _, f := range this.IoTimeRecursive { - repeatedStringForIoTimeRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForIoTimeRecursive += "}" - repeatedStringForSectorsRecursive := "[]*BlkIOEntry{" - for _, f := range this.SectorsRecursive { - repeatedStringForSectorsRecursive += strings.Replace(f.String(), "BlkIOEntry", "BlkIOEntry", 1) + "," - } - repeatedStringForSectorsRecursive += "}" - s := strings.Join([]string{`&BlkIOStat{`, - `IoServiceBytesRecursive:` + repeatedStringForIoServiceBytesRecursive + `,`, - `IoServicedRecursive:` + repeatedStringForIoServicedRecursive + `,`, - `IoQueuedRecursive:` + repeatedStringForIoQueuedRecursive + `,`, - `IoServiceTimeRecursive:` + repeatedStringForIoServiceTimeRecursive + `,`, - `IoWaitTimeRecursive:` + repeatedStringForIoWaitTimeRecursive + `,`, - `IoMergedRecursive:` + repeatedStringForIoMergedRecursive + `,`, - `IoTimeRecursive:` + repeatedStringForIoTimeRecursive + `,`, - `SectorsRecursive:` + repeatedStringForSectorsRecursive + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *BlkIOEntry) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&BlkIOEntry{`, - `Op:` + fmt.Sprintf("%v", this.Op) + `,`, - `Device:` + fmt.Sprintf("%v", this.Device) + `,`, - `Major:` + fmt.Sprintf("%v", this.Major) + `,`, - `Minor:` + fmt.Sprintf("%v", this.Minor) + `,`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *RdmaStat) String() string { - if this == nil { - return "nil" - } - repeatedStringForCurrent := "[]*RdmaEntry{" - for _, f := range this.Current { - repeatedStringForCurrent += strings.Replace(f.String(), "RdmaEntry", "RdmaEntry", 1) + "," - } - repeatedStringForCurrent += "}" - repeatedStringForLimit := "[]*RdmaEntry{" - for _, f := range this.Limit { - repeatedStringForLimit += strings.Replace(f.String(), "RdmaEntry", "RdmaEntry", 1) + "," - } - repeatedStringForLimit += "}" - s := strings.Join([]string{`&RdmaStat{`, - `Current:` + repeatedStringForCurrent + `,`, - `Limit:` + repeatedStringForLimit + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *RdmaEntry) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&RdmaEntry{`, - `Device:` + fmt.Sprintf("%v", this.Device) + `,`, - `HcaHandles:` + fmt.Sprintf("%v", this.HcaHandles) + `,`, - `HcaObjects:` + fmt.Sprintf("%v", this.HcaObjects) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *NetworkStat) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&NetworkStat{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `RxBytes:` + fmt.Sprintf("%v", this.RxBytes) + `,`, - `RxPackets:` + fmt.Sprintf("%v", this.RxPackets) + `,`, - `RxErrors:` + fmt.Sprintf("%v", this.RxErrors) + `,`, - `RxDropped:` + fmt.Sprintf("%v", this.RxDropped) + `,`, - `TxBytes:` + fmt.Sprintf("%v", this.TxBytes) + `,`, - `TxPackets:` + fmt.Sprintf("%v", this.TxPackets) + `,`, - `TxErrors:` + fmt.Sprintf("%v", this.TxErrors) + `,`, - `TxDropped:` + fmt.Sprintf("%v", this.TxDropped) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *CgroupStats) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&CgroupStats{`, - `NrSleeping:` + fmt.Sprintf("%v", this.NrSleeping) + `,`, - `NrRunning:` + fmt.Sprintf("%v", this.NrRunning) + `,`, - `NrStopped:` + fmt.Sprintf("%v", this.NrStopped) + `,`, - `NrUninterruptible:` + fmt.Sprintf("%v", this.NrUninterruptible) + `,`, - `NrIoWait:` + fmt.Sprintf("%v", this.NrIoWait) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringMetrics(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *Metrics) 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 ErrIntOverflowMetrics - } - 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: Metrics: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Metrics: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hugetlb", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hugetlb = append(m.Hugetlb, &HugetlbStat{}) - if err := m.Hugetlb[len(m.Hugetlb)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pids", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pids == nil { - m.Pids = &PidsStat{} - } - if err := m.Pids.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CPU", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CPU == nil { - m.CPU = &CPUStat{} - } - if err := m.CPU.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Memory", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Memory == nil { - m.Memory = &MemoryStat{} - } - if err := m.Memory.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Blkio", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Blkio == nil { - m.Blkio = &BlkIOStat{} - } - if err := m.Blkio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Rdma", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Rdma == nil { - m.Rdma = &RdmaStat{} - } - if err := m.Rdma.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Network", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Network = append(m.Network, &NetworkStat{}) - if err := m.Network[len(m.Network)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CgroupStats", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CgroupStats == nil { - m.CgroupStats = &CgroupStats{} - } - if err := m.CgroupStats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MemoryOomControl", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.MemoryOomControl == nil { - m.MemoryOomControl = &MemoryOomControl{} - } - if err := m.MemoryOomControl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *HugetlbStat) 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 ErrIntOverflowMetrics - } - 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: HugetlbStat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HugetlbStat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - m.Usage = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Usage |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Max", wireType) - } - m.Max = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Max |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Failcnt", wireType) - } - m.Failcnt = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Failcnt |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagesize", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - 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 ErrInvalidLengthMetrics - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pagesize = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PidsStat) 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 ErrIntOverflowMetrics - } - 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: PidsStat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PidsStat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Current", wireType) - } - m.Current = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Current |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) - } - m.Limit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Limit |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CPUStat) 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 ErrIntOverflowMetrics - } - 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: CPUStat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CPUStat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Usage == nil { - m.Usage = &CPUUsage{} - } - if err := m.Usage.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Throttling", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Throttling == nil { - m.Throttling = &Throttle{} - } - if err := m.Throttling.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CPUUsage) 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 ErrIntOverflowMetrics - } - 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: CPUUsage: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CPUUsage: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) - } - m.Total = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Total |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Kernel", wireType) - } - m.Kernel = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Kernel |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) - } - m.User = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.User |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType == 0 { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.PerCPU = append(m.PerCPU, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.PerCPU) == 0 { - m.PerCPU = make([]uint64, 0, elementCount) - } - for iNdEx < postIndex { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.PerCPU = append(m.PerCPU, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field PerCPU", wireType) - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Throttle) 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 ErrIntOverflowMetrics - } - 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: Throttle: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Throttle: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Periods", wireType) - } - m.Periods = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Periods |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ThrottledPeriods", wireType) - } - m.ThrottledPeriods = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ThrottledPeriods |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ThrottledTime", wireType) - } - m.ThrottledTime = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ThrottledTime |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MemoryStat) 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 ErrIntOverflowMetrics - } - 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: MemoryStat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MemoryStat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Cache", wireType) - } - m.Cache = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Cache |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RSS", wireType) - } - m.RSS = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RSS |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RSSHuge", wireType) - } - m.RSSHuge = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RSSHuge |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MappedFile", wireType) - } - m.MappedFile = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MappedFile |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Dirty", wireType) - } - m.Dirty = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Dirty |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Writeback", wireType) - } - m.Writeback = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Writeback |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PgPgIn", wireType) - } - m.PgPgIn = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PgPgIn |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PgPgOut", wireType) - } - m.PgPgOut = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PgPgOut |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PgFault", wireType) - } - m.PgFault = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PgFault |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 10: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PgMajFault", wireType) - } - m.PgMajFault = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PgMajFault |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InactiveAnon", wireType) - } - m.InactiveAnon = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.InactiveAnon |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 12: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ActiveAnon", wireType) - } - m.ActiveAnon = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ActiveAnon |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 13: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InactiveFile", wireType) - } - m.InactiveFile = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.InactiveFile |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 14: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ActiveFile", wireType) - } - m.ActiveFile = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ActiveFile |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 15: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Unevictable", wireType) - } - m.Unevictable = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Unevictable |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 16: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HierarchicalMemoryLimit", wireType) - } - m.HierarchicalMemoryLimit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HierarchicalMemoryLimit |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 17: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HierarchicalSwapLimit", wireType) - } - m.HierarchicalSwapLimit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HierarchicalSwapLimit |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 18: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalCache", wireType) - } - m.TotalCache = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalCache |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 19: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalRSS", wireType) - } - m.TotalRSS = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalRSS |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 20: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalRSSHuge", wireType) - } - m.TotalRSSHuge = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalRSSHuge |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 21: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalMappedFile", wireType) - } - m.TotalMappedFile = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalMappedFile |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 22: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalDirty", wireType) - } - m.TotalDirty = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalDirty |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 23: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalWriteback", wireType) - } - m.TotalWriteback = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalWriteback |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 24: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalPgPgIn", wireType) - } - m.TotalPgPgIn = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalPgPgIn |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 25: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalPgPgOut", wireType) - } - m.TotalPgPgOut = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalPgPgOut |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 26: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalPgFault", wireType) - } - m.TotalPgFault = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalPgFault |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 27: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalPgMajFault", wireType) - } - m.TotalPgMajFault = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalPgMajFault |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 28: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalInactiveAnon", wireType) - } - m.TotalInactiveAnon = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalInactiveAnon |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 29: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalActiveAnon", wireType) - } - m.TotalActiveAnon = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalActiveAnon |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 30: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalInactiveFile", wireType) - } - m.TotalInactiveFile = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalInactiveFile |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 31: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalActiveFile", wireType) - } - m.TotalActiveFile = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalActiveFile |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 32: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalUnevictable", wireType) - } - m.TotalUnevictable = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalUnevictable |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 33: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Usage == nil { - m.Usage = &MemoryEntry{} - } - if err := m.Usage.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 34: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Swap", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Swap == nil { - m.Swap = &MemoryEntry{} - } - if err := m.Swap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 35: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kernel", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Kernel == nil { - m.Kernel = &MemoryEntry{} - } - if err := m.Kernel.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 36: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KernelTCP", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.KernelTCP == nil { - m.KernelTCP = &MemoryEntry{} - } - if err := m.KernelTCP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MemoryEntry) 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 ErrIntOverflowMetrics - } - 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: MemoryEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MemoryEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) - } - m.Limit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Limit |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - m.Usage = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Usage |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Max", wireType) - } - m.Max = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Max |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Failcnt", wireType) - } - m.Failcnt = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Failcnt |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MemoryOomControl) 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 ErrIntOverflowMetrics - } - 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: MemoryOomControl: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MemoryOomControl: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OomKillDisable", wireType) - } - m.OomKillDisable = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.OomKillDisable |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UnderOom", wireType) - } - m.UnderOom = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.UnderOom |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OomKill", wireType) - } - m.OomKill = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.OomKill |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *BlkIOStat) 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 ErrIntOverflowMetrics - } - 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: BlkIOStat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlkIOStat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IoServiceBytesRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IoServiceBytesRecursive = append(m.IoServiceBytesRecursive, &BlkIOEntry{}) - if err := m.IoServiceBytesRecursive[len(m.IoServiceBytesRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IoServicedRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IoServicedRecursive = append(m.IoServicedRecursive, &BlkIOEntry{}) - if err := m.IoServicedRecursive[len(m.IoServicedRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IoQueuedRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IoQueuedRecursive = append(m.IoQueuedRecursive, &BlkIOEntry{}) - if err := m.IoQueuedRecursive[len(m.IoQueuedRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IoServiceTimeRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IoServiceTimeRecursive = append(m.IoServiceTimeRecursive, &BlkIOEntry{}) - if err := m.IoServiceTimeRecursive[len(m.IoServiceTimeRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IoWaitTimeRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IoWaitTimeRecursive = append(m.IoWaitTimeRecursive, &BlkIOEntry{}) - if err := m.IoWaitTimeRecursive[len(m.IoWaitTimeRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IoMergedRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IoMergedRecursive = append(m.IoMergedRecursive, &BlkIOEntry{}) - if err := m.IoMergedRecursive[len(m.IoMergedRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IoTimeRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IoTimeRecursive = append(m.IoTimeRecursive, &BlkIOEntry{}) - if err := m.IoTimeRecursive[len(m.IoTimeRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SectorsRecursive", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SectorsRecursive = append(m.SectorsRecursive, &BlkIOEntry{}) - if err := m.SectorsRecursive[len(m.SectorsRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *BlkIOEntry) 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 ErrIntOverflowMetrics - } - 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: BlkIOEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlkIOEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Op", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - 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 ErrInvalidLengthMetrics - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Op = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - 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 ErrInvalidLengthMetrics - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Device = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) - } - m.Major = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Major |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) - } - m.Minor = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Minor |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - m.Value = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Value |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RdmaStat) 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 ErrIntOverflowMetrics - } - 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: RdmaStat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RdmaStat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Current", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Current = append(m.Current, &RdmaEntry{}) - if err := m.Current[len(m.Current)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthMetrics - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Limit = append(m.Limit, &RdmaEntry{}) - if err := m.Limit[len(m.Limit)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RdmaEntry) 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 ErrIntOverflowMetrics - } - 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: RdmaEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RdmaEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - 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 ErrInvalidLengthMetrics - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Device = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HcaHandles", wireType) - } - m.HcaHandles = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HcaHandles |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HcaObjects", wireType) - } - m.HcaObjects = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HcaObjects |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NetworkStat) 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 ErrIntOverflowMetrics - } - 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: NetworkStat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NetworkStat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - 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 ErrInvalidLengthMetrics - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthMetrics - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RxBytes", wireType) - } - m.RxBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RxBytes |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RxPackets", wireType) - } - m.RxPackets = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RxPackets |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RxErrors", wireType) - } - m.RxErrors = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RxErrors |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RxDropped", wireType) - } - m.RxDropped = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RxDropped |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TxBytes", wireType) - } - m.TxBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TxBytes |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TxPackets", wireType) - } - m.TxPackets = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TxPackets |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TxErrors", wireType) - } - m.TxErrors = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TxErrors |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TxDropped", wireType) - } - m.TxDropped = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TxDropped |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CgroupStats) 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 ErrIntOverflowMetrics - } - 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: CgroupStats: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CgroupStats: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NrSleeping", wireType) - } - m.NrSleeping = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NrSleeping |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NrRunning", wireType) - } - m.NrRunning = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NrRunning |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NrStopped", wireType) - } - m.NrStopped = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NrStopped |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NrUninterruptible", wireType) - } - m.NrUninterruptible = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NrUninterruptible |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NrIoWait", wireType) - } - m.NrIoWait = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMetrics - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NrIoWait |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMetrics(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipMetrics(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMetrics - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMetrics - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMetrics - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthMetrics - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupMetrics - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthMetrics - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthMetrics = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowMetrics = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupMetrics = fmt.Errorf("proto: unexpected end of group") -) diff --git a/vendor/github.com/containerd/cgroups/stats/v1/metrics.pb.txt b/vendor/github.com/containerd/cgroups/stats/v1/metrics.pb.txt deleted file mode 100644 index e476cea641..0000000000 --- a/vendor/github.com/containerd/cgroups/stats/v1/metrics.pb.txt +++ /dev/null @@ -1,790 +0,0 @@ -file { - name: "github.com/containerd/cgroups/stats/v1/metrics.proto" - package: "io.containerd.cgroups.v1" - dependency: "gogoproto/gogo.proto" - message_type { - name: "Metrics" - field { - name: "hugetlb" - number: 1 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.HugetlbStat" - json_name: "hugetlb" - } - field { - name: "pids" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.PidsStat" - json_name: "pids" - } - field { - name: "cpu" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.CPUStat" - options { - 65004: "CPU" - } - json_name: "cpu" - } - field { - name: "memory" - number: 4 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.MemoryStat" - json_name: "memory" - } - field { - name: "blkio" - number: 5 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOStat" - json_name: "blkio" - } - field { - name: "rdma" - number: 6 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.RdmaStat" - json_name: "rdma" - } - field { - name: "network" - number: 7 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.NetworkStat" - json_name: "network" - } - field { - name: "cgroup_stats" - number: 8 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.CgroupStats" - json_name: "cgroupStats" - } - field { - name: "memory_oom_control" - number: 9 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.MemoryOomControl" - json_name: "memoryOomControl" - } - } - message_type { - name: "HugetlbStat" - field { - name: "usage" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "usage" - } - field { - name: "max" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "max" - } - field { - name: "failcnt" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "failcnt" - } - field { - name: "pagesize" - number: 4 - label: LABEL_OPTIONAL - type: TYPE_STRING - json_name: "pagesize" - } - } - message_type { - name: "PidsStat" - field { - name: "current" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "current" - } - field { - name: "limit" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "limit" - } - } - message_type { - name: "CPUStat" - field { - name: "usage" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.CPUUsage" - json_name: "usage" - } - field { - name: "throttling" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.Throttle" - json_name: "throttling" - } - } - message_type { - name: "CPUUsage" - field { - name: "total" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "total" - } - field { - name: "kernel" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "kernel" - } - field { - name: "user" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "user" - } - field { - name: "per_cpu" - number: 4 - label: LABEL_REPEATED - type: TYPE_UINT64 - options { - 65004: "PerCPU" - } - json_name: "perCpu" - } - } - message_type { - name: "Throttle" - field { - name: "periods" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "periods" - } - field { - name: "throttled_periods" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "throttledPeriods" - } - field { - name: "throttled_time" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "throttledTime" - } - } - message_type { - name: "MemoryStat" - field { - name: "cache" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "cache" - } - field { - name: "rss" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - options { - 65004: "RSS" - } - json_name: "rss" - } - field { - name: "rss_huge" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - options { - 65004: "RSSHuge" - } - json_name: "rssHuge" - } - field { - name: "mapped_file" - number: 4 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "mappedFile" - } - field { - name: "dirty" - number: 5 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "dirty" - } - field { - name: "writeback" - number: 6 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "writeback" - } - field { - name: "pg_pg_in" - number: 7 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "pgPgIn" - } - field { - name: "pg_pg_out" - number: 8 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "pgPgOut" - } - field { - name: "pg_fault" - number: 9 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "pgFault" - } - field { - name: "pg_maj_fault" - number: 10 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "pgMajFault" - } - field { - name: "inactive_anon" - number: 11 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "inactiveAnon" - } - field { - name: "active_anon" - number: 12 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "activeAnon" - } - field { - name: "inactive_file" - number: 13 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "inactiveFile" - } - field { - name: "active_file" - number: 14 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "activeFile" - } - field { - name: "unevictable" - number: 15 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "unevictable" - } - field { - name: "hierarchical_memory_limit" - number: 16 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "hierarchicalMemoryLimit" - } - field { - name: "hierarchical_swap_limit" - number: 17 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "hierarchicalSwapLimit" - } - field { - name: "total_cache" - number: 18 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalCache" - } - field { - name: "total_rss" - number: 19 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - options { - 65004: "TotalRSS" - } - json_name: "totalRss" - } - field { - name: "total_rss_huge" - number: 20 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - options { - 65004: "TotalRSSHuge" - } - json_name: "totalRssHuge" - } - field { - name: "total_mapped_file" - number: 21 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalMappedFile" - } - field { - name: "total_dirty" - number: 22 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalDirty" - } - field { - name: "total_writeback" - number: 23 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalWriteback" - } - field { - name: "total_pg_pg_in" - number: 24 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalPgPgIn" - } - field { - name: "total_pg_pg_out" - number: 25 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalPgPgOut" - } - field { - name: "total_pg_fault" - number: 26 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalPgFault" - } - field { - name: "total_pg_maj_fault" - number: 27 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalPgMajFault" - } - field { - name: "total_inactive_anon" - number: 28 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalInactiveAnon" - } - field { - name: "total_active_anon" - number: 29 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalActiveAnon" - } - field { - name: "total_inactive_file" - number: 30 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalInactiveFile" - } - field { - name: "total_active_file" - number: 31 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalActiveFile" - } - field { - name: "total_unevictable" - number: 32 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "totalUnevictable" - } - field { - name: "usage" - number: 33 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.MemoryEntry" - json_name: "usage" - } - field { - name: "swap" - number: 34 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.MemoryEntry" - json_name: "swap" - } - field { - name: "kernel" - number: 35 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.MemoryEntry" - json_name: "kernel" - } - field { - name: "kernel_tcp" - number: 36 - label: LABEL_OPTIONAL - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.MemoryEntry" - options { - 65004: "KernelTCP" - } - json_name: "kernelTcp" - } - } - message_type { - name: "MemoryEntry" - field { - name: "limit" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "limit" - } - field { - name: "usage" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "usage" - } - field { - name: "max" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "max" - } - field { - name: "failcnt" - number: 4 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "failcnt" - } - } - message_type { - name: "MemoryOomControl" - field { - name: "oom_kill_disable" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "oomKillDisable" - } - field { - name: "under_oom" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "underOom" - } - field { - name: "oom_kill" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "oomKill" - } - } - message_type { - name: "BlkIOStat" - field { - name: "io_service_bytes_recursive" - number: 1 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "ioServiceBytesRecursive" - } - field { - name: "io_serviced_recursive" - number: 2 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "ioServicedRecursive" - } - field { - name: "io_queued_recursive" - number: 3 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "ioQueuedRecursive" - } - field { - name: "io_service_time_recursive" - number: 4 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "ioServiceTimeRecursive" - } - field { - name: "io_wait_time_recursive" - number: 5 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "ioWaitTimeRecursive" - } - field { - name: "io_merged_recursive" - number: 6 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "ioMergedRecursive" - } - field { - name: "io_time_recursive" - number: 7 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "ioTimeRecursive" - } - field { - name: "sectors_recursive" - number: 8 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.BlkIOEntry" - json_name: "sectorsRecursive" - } - } - message_type { - name: "BlkIOEntry" - field { - name: "op" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_STRING - json_name: "op" - } - field { - name: "device" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_STRING - json_name: "device" - } - field { - name: "major" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "major" - } - field { - name: "minor" - number: 4 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "minor" - } - field { - name: "value" - number: 5 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "value" - } - } - message_type { - name: "RdmaStat" - field { - name: "current" - number: 1 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.RdmaEntry" - json_name: "current" - } - field { - name: "limit" - number: 2 - label: LABEL_REPEATED - type: TYPE_MESSAGE - type_name: ".io.containerd.cgroups.v1.RdmaEntry" - json_name: "limit" - } - } - message_type { - name: "RdmaEntry" - field { - name: "device" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_STRING - json_name: "device" - } - field { - name: "hca_handles" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT32 - json_name: "hcaHandles" - } - field { - name: "hca_objects" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT32 - json_name: "hcaObjects" - } - } - message_type { - name: "NetworkStat" - field { - name: "name" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_STRING - json_name: "name" - } - field { - name: "rx_bytes" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "rxBytes" - } - field { - name: "rx_packets" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "rxPackets" - } - field { - name: "rx_errors" - number: 4 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "rxErrors" - } - field { - name: "rx_dropped" - number: 5 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "rxDropped" - } - field { - name: "tx_bytes" - number: 6 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "txBytes" - } - field { - name: "tx_packets" - number: 7 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "txPackets" - } - field { - name: "tx_errors" - number: 8 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "txErrors" - } - field { - name: "tx_dropped" - number: 9 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "txDropped" - } - } - message_type { - name: "CgroupStats" - field { - name: "nr_sleeping" - number: 1 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "nrSleeping" - } - field { - name: "nr_running" - number: 2 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "nrRunning" - } - field { - name: "nr_stopped" - number: 3 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "nrStopped" - } - field { - name: "nr_uninterruptible" - number: 4 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "nrUninterruptible" - } - field { - name: "nr_io_wait" - number: 5 - label: LABEL_OPTIONAL - type: TYPE_UINT64 - json_name: "nrIoWait" - } - } - syntax: "proto3" -} diff --git a/vendor/github.com/containerd/cgroups/stats/v1/metrics.proto b/vendor/github.com/containerd/cgroups/stats/v1/metrics.proto deleted file mode 100644 index b3f6cc37d8..0000000000 --- a/vendor/github.com/containerd/cgroups/stats/v1/metrics.proto +++ /dev/null @@ -1,158 +0,0 @@ -syntax = "proto3"; - -package io.containerd.cgroups.v1; - -import "gogoproto/gogo.proto"; - -message Metrics { - repeated HugetlbStat hugetlb = 1; - PidsStat pids = 2; - CPUStat cpu = 3 [(gogoproto.customname) = "CPU"]; - MemoryStat memory = 4; - BlkIOStat blkio = 5; - RdmaStat rdma = 6; - repeated NetworkStat network = 7; - CgroupStats cgroup_stats = 8; - MemoryOomControl memory_oom_control = 9; -} - -message HugetlbStat { - uint64 usage = 1; - uint64 max = 2; - uint64 failcnt = 3; - string pagesize = 4; -} - -message PidsStat { - uint64 current = 1; - uint64 limit = 2; -} - -message CPUStat { - CPUUsage usage = 1; - Throttle throttling = 2; -} - -message CPUUsage { - // values in nanoseconds - uint64 total = 1; - uint64 kernel = 2; - uint64 user = 3; - repeated uint64 per_cpu = 4 [(gogoproto.customname) = "PerCPU"]; - -} - -message Throttle { - uint64 periods = 1; - uint64 throttled_periods = 2; - uint64 throttled_time = 3; -} - -message MemoryStat { - uint64 cache = 1; - uint64 rss = 2 [(gogoproto.customname) = "RSS"]; - uint64 rss_huge = 3 [(gogoproto.customname) = "RSSHuge"]; - uint64 mapped_file = 4; - uint64 dirty = 5; - uint64 writeback = 6; - uint64 pg_pg_in = 7; - uint64 pg_pg_out = 8; - uint64 pg_fault = 9; - uint64 pg_maj_fault = 10; - uint64 inactive_anon = 11; - uint64 active_anon = 12; - uint64 inactive_file = 13; - uint64 active_file = 14; - uint64 unevictable = 15; - uint64 hierarchical_memory_limit = 16; - uint64 hierarchical_swap_limit = 17; - uint64 total_cache = 18; - uint64 total_rss = 19 [(gogoproto.customname) = "TotalRSS"]; - uint64 total_rss_huge = 20 [(gogoproto.customname) = "TotalRSSHuge"]; - uint64 total_mapped_file = 21; - uint64 total_dirty = 22; - uint64 total_writeback = 23; - uint64 total_pg_pg_in = 24; - uint64 total_pg_pg_out = 25; - uint64 total_pg_fault = 26; - uint64 total_pg_maj_fault = 27; - uint64 total_inactive_anon = 28; - uint64 total_active_anon = 29; - uint64 total_inactive_file = 30; - uint64 total_active_file = 31; - uint64 total_unevictable = 32; - MemoryEntry usage = 33; - MemoryEntry swap = 34; - MemoryEntry kernel = 35; - MemoryEntry kernel_tcp = 36 [(gogoproto.customname) = "KernelTCP"]; - -} - -message MemoryEntry { - uint64 limit = 1; - uint64 usage = 2; - uint64 max = 3; - uint64 failcnt = 4; -} - -message MemoryOomControl { - uint64 oom_kill_disable = 1; - uint64 under_oom = 2; - uint64 oom_kill = 3; -} - -message BlkIOStat { - repeated BlkIOEntry io_service_bytes_recursive = 1; - repeated BlkIOEntry io_serviced_recursive = 2; - repeated BlkIOEntry io_queued_recursive = 3; - repeated BlkIOEntry io_service_time_recursive = 4; - repeated BlkIOEntry io_wait_time_recursive = 5; - repeated BlkIOEntry io_merged_recursive = 6; - repeated BlkIOEntry io_time_recursive = 7; - repeated BlkIOEntry sectors_recursive = 8; -} - -message BlkIOEntry { - string op = 1; - string device = 2; - uint64 major = 3; - uint64 minor = 4; - uint64 value = 5; -} - -message RdmaStat { - repeated RdmaEntry current = 1; - repeated RdmaEntry limit = 2; -} - -message RdmaEntry { - string device = 1; - uint32 hca_handles = 2; - uint32 hca_objects = 3; -} - -message NetworkStat { - string name = 1; - uint64 rx_bytes = 2; - uint64 rx_packets = 3; - uint64 rx_errors = 4; - uint64 rx_dropped = 5; - uint64 tx_bytes = 6; - uint64 tx_packets = 7; - uint64 tx_errors = 8; - uint64 tx_dropped = 9; -} - -// CgroupStats exports per-cgroup statistics. -message CgroupStats { - // number of tasks sleeping - uint64 nr_sleeping = 1; - // number of tasks running - uint64 nr_running = 2; - // number of tasks in stopped state - uint64 nr_stopped = 3; - // number of tasks in uninterruptible state - uint64 nr_uninterruptible = 4; - // number of tasks waiting on IO - uint64 nr_io_wait = 5; -} diff --git a/vendor/github.com/containerd/containerd/log/context.go b/vendor/github.com/containerd/containerd/log/context.go index 0db9562b82..92cfcd91ae 100644 --- a/vendor/github.com/containerd/containerd/log/context.go +++ b/vendor/github.com/containerd/containerd/log/context.go @@ -35,6 +35,9 @@ var ( type ( loggerKey struct{} + + // Fields type to pass to `WithFields`, alias from `logrus`. + Fields = logrus.Fields ) const ( diff --git a/vendor/github.com/containerd/containerd/pkg/userns/userns_unsupported.go b/vendor/github.com/containerd/containerd/pkg/userns/userns_unsupported.go index 4f8d7dd2d5..c67f773d0a 100644 --- a/vendor/github.com/containerd/containerd/pkg/userns/userns_unsupported.go +++ b/vendor/github.com/containerd/containerd/pkg/userns/userns_unsupported.go @@ -1,5 +1,4 @@ //go:build !linux -// +build !linux /* Copyright The containerd Authors. diff --git a/vendor/github.com/containerd/containerd/platforms/cpuinfo.go b/vendor/github.com/containerd/containerd/platforms/cpuinfo.go index 046e0356d1..8c600fc96b 100644 --- a/vendor/github.com/containerd/containerd/platforms/cpuinfo.go +++ b/vendor/github.com/containerd/containerd/platforms/cpuinfo.go @@ -17,14 +17,9 @@ package platforms import ( - "bufio" - "fmt" - "os" "runtime" - "strings" "sync" - "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" ) @@ -37,95 +32,12 @@ var cpuVariantOnce sync.Once func cpuVariant() string { cpuVariantOnce.Do(func() { if isArmArch(runtime.GOARCH) { - cpuVariantValue = getCPUVariant() + var err error + cpuVariantValue, err = getCPUVariant() + if err != nil { + log.L.Errorf("Error getCPUVariant for OS %s: %v", runtime.GOOS, err) + } } }) return cpuVariantValue } - -// For Linux, the kernel has already detected the ABI, ISA and Features. -// So we don't need to access the ARM registers to detect platform information -// by ourselves. We can just parse these information from /proc/cpuinfo -func getCPUInfo(pattern string) (info string, err error) { - if !isLinuxOS(runtime.GOOS) { - return "", fmt.Errorf("getCPUInfo for OS %s: %w", runtime.GOOS, errdefs.ErrNotImplemented) - } - - cpuinfo, err := os.Open("/proc/cpuinfo") - if err != nil { - return "", err - } - defer cpuinfo.Close() - - // Start to Parse the Cpuinfo line by line. For SMP SoC, we parse - // the first core is enough. - scanner := bufio.NewScanner(cpuinfo) - for scanner.Scan() { - newline := scanner.Text() - list := strings.Split(newline, ":") - - if len(list) > 1 && strings.EqualFold(strings.TrimSpace(list[0]), pattern) { - return strings.TrimSpace(list[1]), nil - } - } - - // Check whether the scanner encountered errors - err = scanner.Err() - if err != nil { - return "", err - } - - return "", fmt.Errorf("getCPUInfo for pattern: %s: %w", pattern, errdefs.ErrNotFound) -} - -func getCPUVariant() string { - if runtime.GOOS == "windows" || runtime.GOOS == "darwin" { - // Windows/Darwin only supports v7 for ARM32 and v8 for ARM64 and so we can use - // runtime.GOARCH to determine the variants - var variant string - switch runtime.GOARCH { - case "arm64": - variant = "v8" - case "arm": - variant = "v7" - default: - variant = "unknown" - } - - return variant - } - - variant, err := getCPUInfo("Cpu architecture") - if err != nil { - log.L.WithError(err).Error("failure getting variant") - return "" - } - - // handle edge case for Raspberry Pi ARMv6 devices (which due to a kernel quirk, report "CPU architecture: 7") - // https://www.raspberrypi.org/forums/viewtopic.php?t=12614 - if runtime.GOARCH == "arm" && variant == "7" { - model, err := getCPUInfo("model name") - if err == nil && strings.HasPrefix(strings.ToLower(model), "armv6-compatible") { - variant = "6" - } - } - - switch strings.ToLower(variant) { - case "8", "aarch64": - variant = "v8" - case "7", "7m", "?(12)", "?(13)", "?(14)", "?(15)", "?(16)", "?(17)": - variant = "v7" - case "6", "6tej": - variant = "v6" - case "5", "5t", "5te", "5tej": - variant = "v5" - case "4", "4t": - variant = "v4" - case "3": - variant = "v3" - default: - variant = "unknown" - } - - return variant -} diff --git a/vendor/github.com/containerd/containerd/platforms/cpuinfo_linux.go b/vendor/github.com/containerd/containerd/platforms/cpuinfo_linux.go new file mode 100644 index 0000000000..722d86c357 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/cpuinfo_linux.go @@ -0,0 +1,161 @@ +/* + Copyright The containerd 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 platforms + +import ( + "bufio" + "bytes" + "fmt" + "os" + "runtime" + "strings" + + "github.com/containerd/containerd/errdefs" + "golang.org/x/sys/unix" +) + +// getMachineArch retrieves the machine architecture through system call +func getMachineArch() (string, error) { + var uname unix.Utsname + err := unix.Uname(&uname) + if err != nil { + return "", err + } + + arch := string(uname.Machine[:bytes.IndexByte(uname.Machine[:], 0)]) + + return arch, nil +} + +// For Linux, the kernel has already detected the ABI, ISA and Features. +// So we don't need to access the ARM registers to detect platform information +// by ourselves. We can just parse these information from /proc/cpuinfo +func getCPUInfo(pattern string) (info string, err error) { + + cpuinfo, err := os.Open("/proc/cpuinfo") + if err != nil { + return "", err + } + defer cpuinfo.Close() + + // Start to Parse the Cpuinfo line by line. For SMP SoC, we parse + // the first core is enough. + scanner := bufio.NewScanner(cpuinfo) + for scanner.Scan() { + newline := scanner.Text() + list := strings.Split(newline, ":") + + if len(list) > 1 && strings.EqualFold(strings.TrimSpace(list[0]), pattern) { + return strings.TrimSpace(list[1]), nil + } + } + + // Check whether the scanner encountered errors + err = scanner.Err() + if err != nil { + return "", err + } + + return "", fmt.Errorf("getCPUInfo for pattern %s: %w", pattern, errdefs.ErrNotFound) +} + +// getCPUVariantFromArch get CPU variant from arch through a system call +func getCPUVariantFromArch(arch string) (string, error) { + + var variant string + + arch = strings.ToLower(arch) + + if arch == "aarch64" { + variant = "8" + } else if arch[0:4] == "armv" && len(arch) >= 5 { + //Valid arch format is in form of armvXx + switch arch[3:5] { + case "v8": + variant = "8" + case "v7": + variant = "7" + case "v6": + variant = "6" + case "v5": + variant = "5" + case "v4": + variant = "4" + case "v3": + variant = "3" + default: + variant = "unknown" + } + } else { + return "", fmt.Errorf("getCPUVariantFromArch invalid arch: %s, %w", arch, errdefs.ErrInvalidArgument) + } + return variant, nil +} + +// getCPUVariant returns cpu variant for ARM +// We first try reading "Cpu architecture" field from /proc/cpuinfo +// If we can't find it, then fall back using a system call +// This is to cover running ARM in emulated environment on x86 host as this field in /proc/cpuinfo +// was not present. +func getCPUVariant() (string, error) { + + variant, err := getCPUInfo("Cpu architecture") + if err != nil { + if errdefs.IsNotFound(err) { + //Let's try getting CPU variant from machine architecture + arch, err := getMachineArch() + if err != nil { + return "", fmt.Errorf("failure getting machine architecture: %v", err) + } + + variant, err = getCPUVariantFromArch(arch) + if err != nil { + return "", fmt.Errorf("failure getting CPU variant from machine architecture: %v", err) + } + } else { + return "", fmt.Errorf("failure getting CPU variant: %v", err) + } + } + + // handle edge case for Raspberry Pi ARMv6 devices (which due to a kernel quirk, report "CPU architecture: 7") + // https://www.raspberrypi.org/forums/viewtopic.php?t=12614 + if runtime.GOARCH == "arm" && variant == "7" { + model, err := getCPUInfo("model name") + if err == nil && strings.HasPrefix(strings.ToLower(model), "armv6-compatible") { + variant = "6" + } + } + + switch strings.ToLower(variant) { + case "8", "aarch64": + variant = "v8" + case "7", "7m", "?(12)", "?(13)", "?(14)", "?(15)", "?(16)", "?(17)": + variant = "v7" + case "6", "6tej": + variant = "v6" + case "5", "5t", "5te", "5tej": + variant = "v5" + case "4", "4t": + variant = "v4" + case "3": + variant = "v3" + default: + variant = "unknown" + } + + return variant, nil +} diff --git a/vendor/github.com/containerd/containerd/platforms/cpuinfo_other.go b/vendor/github.com/containerd/containerd/platforms/cpuinfo_other.go new file mode 100644 index 0000000000..fa5f19c427 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/cpuinfo_other.go @@ -0,0 +1,59 @@ +//go:build !linux + +/* + Copyright The containerd 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 platforms + +import ( + "fmt" + "runtime" + + "github.com/containerd/containerd/errdefs" +) + +func getCPUVariant() (string, error) { + + var variant string + + if runtime.GOOS == "windows" || runtime.GOOS == "darwin" { + // Windows/Darwin only supports v7 for ARM32 and v8 for ARM64 and so we can use + // runtime.GOARCH to determine the variants + switch runtime.GOARCH { + case "arm64": + variant = "v8" + case "arm": + variant = "v7" + default: + variant = "unknown" + } + } else if runtime.GOOS == "freebsd" { + // FreeBSD supports ARMv6 and ARMv7 as well as ARMv4 and ARMv5 (though deprecated) + // detecting those variants is currently unimplemented + switch runtime.GOARCH { + case "arm64": + variant = "v8" + default: + variant = "unknown" + } + + } else { + return "", fmt.Errorf("getCPUVariant for OS %s: %v", runtime.GOOS, errdefs.ErrNotImplemented) + + } + + return variant, nil +} diff --git a/vendor/github.com/containerd/containerd/platforms/database.go b/vendor/github.com/containerd/containerd/platforms/database.go index dbe9957ca9..2e26fd3b4f 100644 --- a/vendor/github.com/containerd/containerd/platforms/database.go +++ b/vendor/github.com/containerd/containerd/platforms/database.go @@ -21,13 +21,6 @@ import ( "strings" ) -// isLinuxOS returns true if the operating system is Linux. -// -// The OS value should be normalized before calling this function. -func isLinuxOS(os string) bool { - return os == "linux" -} - // These function are generated from https://golang.org/src/go/build/syslist.go. // // We use switch statements because they are slightly faster than map lookups diff --git a/vendor/github.com/containerd/containerd/platforms/defaults_darwin.go b/vendor/github.com/containerd/containerd/platforms/defaults_darwin.go index e249fe48d3..72355ca85f 100644 --- a/vendor/github.com/containerd/containerd/platforms/defaults_darwin.go +++ b/vendor/github.com/containerd/containerd/platforms/defaults_darwin.go @@ -1,5 +1,4 @@ //go:build darwin -// +build darwin /* Copyright The containerd Authors. diff --git a/vendor/github.com/containerd/containerd/platforms/defaults_freebsd.go b/vendor/github.com/containerd/containerd/platforms/defaults_freebsd.go new file mode 100644 index 0000000000..d3fe89e076 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/defaults_freebsd.go @@ -0,0 +1,43 @@ +/* + Copyright The containerd 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 platforms + +import ( + "runtime" + + specs "github.com/opencontainers/image-spec/specs-go/v1" +) + +// DefaultSpec returns the current platform's default platform specification. +func DefaultSpec() specs.Platform { + return specs.Platform{ + OS: runtime.GOOS, + Architecture: runtime.GOARCH, + // The Variant field will be empty if arch != ARM. + Variant: cpuVariant(), + } +} + +// Default returns the default matcher for the platform. +func Default() MatchComparer { + return Ordered(DefaultSpec(), specs.Platform{ + OS: "linux", + Architecture: runtime.GOARCH, + // The Variant field will be empty if arch != ARM. + Variant: cpuVariant(), + }) +} diff --git a/vendor/github.com/containerd/containerd/platforms/defaults_unix.go b/vendor/github.com/containerd/containerd/platforms/defaults_unix.go index 49690f1b3e..44acc47eb3 100644 --- a/vendor/github.com/containerd/containerd/platforms/defaults_unix.go +++ b/vendor/github.com/containerd/containerd/platforms/defaults_unix.go @@ -1,5 +1,4 @@ -//go:build !windows && !darwin -// +build !windows,!darwin +//go:build !windows && !darwin && !freebsd /* Copyright The containerd Authors. diff --git a/vendor/github.com/containerd/containerd/platforms/defaults_windows.go b/vendor/github.com/containerd/containerd/platforms/defaults_windows.go index ff9771a600..fd5756516c 100644 --- a/vendor/github.com/containerd/containerd/platforms/defaults_windows.go +++ b/vendor/github.com/containerd/containerd/platforms/defaults_windows.go @@ -22,7 +22,6 @@ import ( "strconv" "strings" - imagespec "github.com/opencontainers/image-spec/specs-go/v1" specs "github.com/opencontainers/image-spec/specs-go/v1" "golang.org/x/sys/windows" ) @@ -39,29 +38,31 @@ func DefaultSpec() specs.Platform { } } -type matchComparer struct { - defaults Matcher +type windowsmatcher struct { + specs.Platform osVersionPrefix string + defaultMatcher Matcher } // Match matches platform with the same windows major, minor // and build version. -func (m matchComparer) Match(p specs.Platform) bool { - match := m.defaults.Match(p) +func (m windowsmatcher) Match(p specs.Platform) bool { + match := m.defaultMatcher.Match(p) - if match && p.OS == "windows" { + if match && m.OS == "windows" { if strings.HasPrefix(p.OSVersion, m.osVersionPrefix) { return true } return p.OSVersion == "" } - return false + + return match } // Less sorts matched platforms in front of other platforms. // For matched platforms, it puts platforms with larger revision // number in front. -func (m matchComparer) Less(p1, p2 imagespec.Platform) bool { +func (m windowsmatcher) Less(p1, p2 specs.Platform) bool { m1, m2 := m.Match(p1), m.Match(p2) if m1 && m2 { r1, r2 := revision(p1.OSVersion), revision(p2.OSVersion) @@ -82,14 +83,15 @@ func revision(v string) int { return r } +func prefix(v string) string { + parts := strings.Split(v, ".") + if len(parts) < 4 { + return v + } + return strings.Join(parts[0:3], ".") +} + // Default returns the current platform's default platform specification. func Default() MatchComparer { - major, minor, build := windows.RtlGetNtVersionNumbers() - return matchComparer{ - defaults: Ordered(DefaultSpec(), specs.Platform{ - OS: "linux", - Architecture: runtime.GOARCH, - }), - osVersionPrefix: fmt.Sprintf("%d.%d.%d", major, minor, build), - } + return Only(DefaultSpec()) } diff --git a/vendor/github.com/containerd/containerd/platforms/platforms.go b/vendor/github.com/containerd/containerd/platforms/platforms.go index 2343099418..8dcde7db7c 100644 --- a/vendor/github.com/containerd/containerd/platforms/platforms.go +++ b/vendor/github.com/containerd/containerd/platforms/platforms.go @@ -114,14 +114,18 @@ import ( "strconv" "strings" - "github.com/containerd/containerd/errdefs" specs "github.com/opencontainers/image-spec/specs-go/v1" + + "github.com/containerd/containerd/errdefs" ) var ( specifierRe = regexp.MustCompile(`^[A-Za-z0-9_-]+$`) ) +// Platform is a type alias for convenience, so there is no need to import image-spec package everywhere. +type Platform = specs.Platform + // Matcher matches platforms specifications, provided by an image or runtime. type Matcher interface { Match(platform specs.Platform) bool @@ -136,9 +140,7 @@ type Matcher interface { // // Applications should opt to use `Match` over directly parsing specifiers. func NewMatcher(platform specs.Platform) Matcher { - return &matcher{ - Platform: Normalize(platform), - } + return newDefaultMatcher(platform) } type matcher struct { @@ -257,5 +259,6 @@ func Format(platform specs.Platform) string { func Normalize(platform specs.Platform) specs.Platform { platform.OS = normalizeOS(platform.OS) platform.Architecture, platform.Variant = normalizeArch(platform.Architecture, platform.Variant) + return platform } diff --git a/vendor/github.com/containerd/containerd/platforms/platforms_other.go b/vendor/github.com/containerd/containerd/platforms/platforms_other.go new file mode 100644 index 0000000000..03f4dcd998 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/platforms_other.go @@ -0,0 +1,30 @@ +//go:build !windows + +/* + Copyright The containerd 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 platforms + +import ( + specs "github.com/opencontainers/image-spec/specs-go/v1" +) + +// NewMatcher returns the default Matcher for containerd +func newDefaultMatcher(platform specs.Platform) Matcher { + return &matcher{ + Platform: Normalize(platform), + } +} diff --git a/vendor/github.com/containerd/containerd/platforms/platforms_windows.go b/vendor/github.com/containerd/containerd/platforms/platforms_windows.go new file mode 100644 index 0000000000..950e2a2ddb --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/platforms_windows.go @@ -0,0 +1,34 @@ +/* + Copyright The containerd 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 platforms + +import ( + specs "github.com/opencontainers/image-spec/specs-go/v1" +) + +// NewMatcher returns a Windows matcher that will match on osVersionPrefix if +// the platform is Windows otherwise use the default matcher +func newDefaultMatcher(platform specs.Platform) Matcher { + prefix := prefix(platform.OSVersion) + return windowsmatcher{ + Platform: platform, + osVersionPrefix: prefix, + defaultMatcher: &matcher{ + Platform: Normalize(platform), + }, + } +} diff --git a/vendor/github.com/containerd/containerd/sys/epoll.go b/vendor/github.com/containerd/containerd/sys/epoll.go deleted file mode 100644 index 73a57013ff..0000000000 --- a/vendor/github.com/containerd/containerd/sys/epoll.go +++ /dev/null @@ -1,34 +0,0 @@ -//go:build linux -// +build linux - -/* - Copyright The containerd 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 sys - -import "golang.org/x/sys/unix" - -// EpollCreate1 is an alias for unix.EpollCreate1 -// Deprecated: use golang.org/x/sys/unix.EpollCreate1 -var EpollCreate1 = unix.EpollCreate1 - -// EpollCtl is an alias for unix.EpollCtl -// Deprecated: use golang.org/x/sys/unix.EpollCtl -var EpollCtl = unix.EpollCtl - -// EpollWait is an alias for unix.EpollWait -// Deprecated: use golang.org/x/sys/unix.EpollWait -var EpollWait = unix.EpollWait diff --git a/vendor/github.com/containerd/containerd/sys/fds.go b/vendor/github.com/containerd/containerd/sys/fds.go deleted file mode 100644 index a71a9cd7e9..0000000000 --- a/vendor/github.com/containerd/containerd/sys/fds.go +++ /dev/null @@ -1,35 +0,0 @@ -//go:build !windows && !darwin -// +build !windows,!darwin - -/* - Copyright The containerd 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 sys - -import ( - "os" - "path/filepath" - "strconv" -) - -// GetOpenFds returns the number of open fds for the process provided by pid -func GetOpenFds(pid int) (int, error) { - dirs, err := os.ReadDir(filepath.Join("/proc", strconv.Itoa(pid), "fd")) - if err != nil { - return -1, err - } - return len(dirs), nil -} diff --git a/vendor/github.com/containerd/containerd/sys/filesys_unix.go b/vendor/github.com/containerd/containerd/sys/filesys_unix.go deleted file mode 100644 index 805a7a736f..0000000000 --- a/vendor/github.com/containerd/containerd/sys/filesys_unix.go +++ /dev/null @@ -1,32 +0,0 @@ -//go:build !windows -// +build !windows - -/* - Copyright The containerd 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 sys - -import "os" - -// ForceRemoveAll on unix is just a wrapper for os.RemoveAll -func ForceRemoveAll(path string) error { - return os.RemoveAll(path) -} - -// MkdirAllWithACL is a wrapper for os.MkdirAll on Unix systems. -func MkdirAllWithACL(path string, perm os.FileMode) error { - return os.MkdirAll(path, perm) -} diff --git a/vendor/github.com/containerd/containerd/sys/filesys_windows.go b/vendor/github.com/containerd/containerd/sys/filesys_windows.go deleted file mode 100644 index 87ebacc200..0000000000 --- a/vendor/github.com/containerd/containerd/sys/filesys_windows.go +++ /dev/null @@ -1,345 +0,0 @@ -/* - Copyright The containerd 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 sys - -import ( - "fmt" - "os" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" - "syscall" - "unsafe" - - "github.com/Microsoft/hcsshim" - "golang.org/x/sys/windows" -) - -const ( - // SddlAdministratorsLocalSystem is local administrators plus NT AUTHORITY\System - SddlAdministratorsLocalSystem = "D:P(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" -) - -// MkdirAllWithACL is a wrapper for MkdirAll that creates a directory -// ACL'd for Builtin Administrators and Local System. -func MkdirAllWithACL(path string, perm os.FileMode) error { - return mkdirall(path, true) -} - -// MkdirAll implementation that is volume path aware for Windows. It can be used -// as a drop-in replacement for os.MkdirAll() -func MkdirAll(path string, _ os.FileMode) error { - return mkdirall(path, false) -} - -// mkdirall is a custom version of os.MkdirAll modified for use on Windows -// so that it is both volume path aware, and can create a directory with -// a DACL. -func mkdirall(path string, adminAndLocalSystem bool) error { - if re := regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}$`); re.MatchString(path) { - return nil - } - - // The rest of this method is largely copied from os.MkdirAll and should be kept - // as-is to ensure compatibility. - - // Fast path: if we can tell whether path is a directory or file, stop with success or error. - dir, err := os.Stat(path) - if err == nil { - if dir.IsDir() { - return nil - } - return &os.PathError{ - Op: "mkdir", - Path: path, - Err: syscall.ENOTDIR, - } - } - - // Slow path: make sure parent exists and then call Mkdir for path. - i := len(path) - for i > 0 && os.IsPathSeparator(path[i-1]) { // Skip trailing path separator. - i-- - } - - j := i - for j > 0 && !os.IsPathSeparator(path[j-1]) { // Scan backward over element. - j-- - } - - if j > 1 { - // Create parent - err = mkdirall(path[0:j-1], adminAndLocalSystem) - if err != nil { - return err - } - } - - // Parent now exists; invoke os.Mkdir or mkdirWithACL and use its result. - if adminAndLocalSystem { - err = mkdirWithACL(path) - } else { - err = os.Mkdir(path, 0) - } - - if err != nil { - // Handle arguments like "foo/." by - // double-checking that directory doesn't exist. - dir, err1 := os.Lstat(path) - if err1 == nil && dir.IsDir() { - return nil - } - return err - } - return nil -} - -// mkdirWithACL creates a new directory. If there is an error, it will be of -// type *PathError. . -// -// This is a modified and combined version of os.Mkdir and windows.Mkdir -// in golang to cater for creating a directory am ACL permitting full -// access, with inheritance, to any subfolder/file for Built-in Administrators -// and Local System. -func mkdirWithACL(name string) error { - sa := windows.SecurityAttributes{Length: 0} - sd, err := windows.SecurityDescriptorFromString(SddlAdministratorsLocalSystem) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - sa.SecurityDescriptor = sd - - namep, err := windows.UTF16PtrFromString(name) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - - e := windows.CreateDirectory(namep, &sa) - if e != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: e} - } - return nil -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, -// golang filepath.IsAbs does not consider a path \windows\system32 as absolute -// as it doesn't start with a drive-letter/colon combination. However, in -// docker we need to verify things such as WORKDIR /windows/system32 in -// a Dockerfile (which gets translated to \windows\system32 when being processed -// by the daemon. This SHOULD be treated as absolute from a docker processing -// perspective. -func IsAbs(path string) bool { - if !filepath.IsAbs(path) { - if !strings.HasPrefix(path, string(os.PathSeparator)) { - return false - } - } - return true -} - -// The origin of the functions below here are the golang OS and windows packages, -// slightly modified to only cope with files, not directories due to the -// specific use case. -// -// The alteration is to allow a file on Windows to be opened with -// FILE_FLAG_SEQUENTIAL_SCAN (particular for docker load), to avoid eating -// the standby list, particularly when accessing large files such as layer.tar. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDONLY, 0) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, _ os.FileMode) (*os.File, error) { - if name == "" { - return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT} - } - r, errf := windowsOpenFileSequential(name, flag, 0) - if errf == nil { - return r, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: errf} -} - -func windowsOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) { - r, e := windowsOpenSequential(name, flag|windows.O_CLOEXEC, 0) - if e != nil { - return nil, e - } - return os.NewFile(uintptr(r), name), nil -} - -func makeInheritSa() *windows.SecurityAttributes { - var sa windows.SecurityAttributes - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - return &sa -} - -func windowsOpenSequential(path string, mode int, _ uint32) (fd windows.Handle, err error) { - if len(path) == 0 { - return windows.InvalidHandle, windows.ERROR_FILE_NOT_FOUND - } - pathp, err := windows.UTF16PtrFromString(path) - if err != nil { - return windows.InvalidHandle, err - } - var access uint32 - switch mode & (windows.O_RDONLY | windows.O_WRONLY | windows.O_RDWR) { - case windows.O_RDONLY: - access = windows.GENERIC_READ - case windows.O_WRONLY: - access = windows.GENERIC_WRITE - case windows.O_RDWR: - access = windows.GENERIC_READ | windows.GENERIC_WRITE - } - if mode&windows.O_CREAT != 0 { - access |= windows.GENERIC_WRITE - } - if mode&windows.O_APPEND != 0 { - access &^= windows.GENERIC_WRITE - access |= windows.FILE_APPEND_DATA - } - sharemode := uint32(windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE) - var sa *windows.SecurityAttributes - if mode&windows.O_CLOEXEC == 0 { - sa = makeInheritSa() - } - var createmode uint32 - switch { - case mode&(windows.O_CREAT|windows.O_EXCL) == (windows.O_CREAT | windows.O_EXCL): - createmode = windows.CREATE_NEW - case mode&(windows.O_CREAT|windows.O_TRUNC) == (windows.O_CREAT | windows.O_TRUNC): - createmode = windows.CREATE_ALWAYS - case mode&windows.O_CREAT == windows.O_CREAT: - createmode = windows.OPEN_ALWAYS - case mode&windows.O_TRUNC == windows.O_TRUNC: - createmode = windows.TRUNCATE_EXISTING - default: - createmode = windows.OPEN_EXISTING - } - // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx - const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN - h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) - return h, e -} - -// ForceRemoveAll is the same as os.RemoveAll, but is aware of io.containerd.snapshotter.v1.windows -// and uses hcsshim to unmount and delete container layers contained therein, in the correct order, -// when passed a containerd root data directory (i.e. the `--root` directory for containerd). -func ForceRemoveAll(path string) error { - // snapshots/windows/windows.go init() - const snapshotPlugin = "io.containerd.snapshotter.v1" + "." + "windows" - // snapshots/windows/windows.go NewSnapshotter() - snapshotDir := filepath.Join(path, snapshotPlugin, "snapshots") - if stat, err := os.Stat(snapshotDir); err == nil && stat.IsDir() { - if err := cleanupWCOWLayers(snapshotDir); err != nil { - return fmt.Errorf("failed to cleanup WCOW layers in %s: %w", snapshotDir, err) - } - } - - return os.RemoveAll(path) -} - -func cleanupWCOWLayers(root string) error { - // See snapshots/windows/windows.go getSnapshotDir() - var layerNums []int - var rmLayerNums []int - if err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if path != root && info.IsDir() { - name := filepath.Base(path) - if strings.HasPrefix(name, "rm-") { - layerNum, err := strconv.Atoi(strings.TrimPrefix(name, "rm-")) - if err != nil { - return err - } - rmLayerNums = append(rmLayerNums, layerNum) - } else { - layerNum, err := strconv.Atoi(name) - if err != nil { - return err - } - layerNums = append(layerNums, layerNum) - } - return filepath.SkipDir - } - - return nil - }); err != nil { - return err - } - - sort.Sort(sort.Reverse(sort.IntSlice(rmLayerNums))) - for _, rmLayerNum := range rmLayerNums { - if err := cleanupWCOWLayer(filepath.Join(root, "rm-"+strconv.Itoa(rmLayerNum))); err != nil { - return err - } - } - - sort.Sort(sort.Reverse(sort.IntSlice(layerNums))) - for _, layerNum := range layerNums { - if err := cleanupWCOWLayer(filepath.Join(root, strconv.Itoa(layerNum))); err != nil { - return err - } - } - - return nil -} - -func cleanupWCOWLayer(layerPath string) error { - info := hcsshim.DriverInfo{ - HomeDir: filepath.Dir(layerPath), - } - - // ERROR_DEV_NOT_EXIST is returned if the layer is not currently prepared or activated. - // ERROR_FLT_INSTANCE_NOT_FOUND is returned if the layer is currently activated but not prepared. - if err := hcsshim.UnprepareLayer(info, filepath.Base(layerPath)); err != nil { - if hcserror, ok := err.(*hcsshim.HcsError); !ok || (hcserror.Err != windows.ERROR_DEV_NOT_EXIST && hcserror.Err != syscall.Errno(windows.ERROR_FLT_INSTANCE_NOT_FOUND)) { - return fmt.Errorf("failed to unprepare %s: %w", layerPath, err) - } - } - - if err := hcsshim.DeactivateLayer(info, filepath.Base(layerPath)); err != nil { - return fmt.Errorf("failed to deactivate %s: %w", layerPath, err) - } - - if err := hcsshim.DestroyLayer(info, filepath.Base(layerPath)); err != nil { - return fmt.Errorf("failed to destroy %s: %w", layerPath, err) - } - - return nil -} diff --git a/vendor/github.com/containerd/containerd/sys/oom_linux.go b/vendor/github.com/containerd/containerd/sys/oom_linux.go deleted file mode 100644 index bb2a3eafb4..0000000000 --- a/vendor/github.com/containerd/containerd/sys/oom_linux.go +++ /dev/null @@ -1,82 +0,0 @@ -/* - Copyright The containerd 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 sys - -import ( - "fmt" - "os" - "strconv" - "strings" - - "github.com/containerd/containerd/pkg/userns" - "golang.org/x/sys/unix" -) - -const ( - // OOMScoreAdjMin is from OOM_SCORE_ADJ_MIN https://github.com/torvalds/linux/blob/v5.10/include/uapi/linux/oom.h#L9 - OOMScoreAdjMin = -1000 - // OOMScoreAdjMax is from OOM_SCORE_ADJ_MAX https://github.com/torvalds/linux/blob/v5.10/include/uapi/linux/oom.h#L10 - OOMScoreAdjMax = 1000 -) - -// AdjustOOMScore sets the oom score for the provided pid. If the provided score -// is out of range (-1000 - 1000), it is clipped to the min/max value. -func AdjustOOMScore(pid, score int) error { - if score > OOMScoreAdjMax { - score = OOMScoreAdjMax - } else if score < OOMScoreAdjMin { - score = OOMScoreAdjMin - } - return SetOOMScore(pid, score) -} - -// SetOOMScore sets the oom score for the provided pid -func SetOOMScore(pid, score int) error { - if score > OOMScoreAdjMax || score < OOMScoreAdjMin { - return fmt.Errorf("value out of range (%d): OOM score must be between %d and %d", score, OOMScoreAdjMin, OOMScoreAdjMax) - } - path := fmt.Sprintf("/proc/%d/oom_score_adj", pid) - f, err := os.OpenFile(path, os.O_WRONLY, 0) - if err != nil { - return err - } - defer f.Close() - if _, err = f.WriteString(strconv.Itoa(score)); err != nil { - if os.IsPermission(err) && (!runningPrivileged() || userns.RunningInUserNS()) { - return nil - } - return err - } - return nil -} - -// GetOOMScoreAdj gets the oom score for a process. It returns 0 (zero) if either -// no oom score is set, or a sore is set to 0. -func GetOOMScoreAdj(pid int) (int, error) { - path := fmt.Sprintf("/proc/%d/oom_score_adj", pid) - data, err := os.ReadFile(path) - if err != nil { - return 0, err - } - return strconv.Atoi(strings.TrimSpace(string(data))) -} - -// runningPrivileged returns true if the effective user ID of the -// calling process is 0 -func runningPrivileged() bool { - return unix.Geteuid() == 0 -} diff --git a/vendor/github.com/containerd/containerd/sys/oom_unsupported.go b/vendor/github.com/containerd/containerd/sys/oom_unsupported.go deleted file mode 100644 index fa0db5a10e..0000000000 --- a/vendor/github.com/containerd/containerd/sys/oom_unsupported.go +++ /dev/null @@ -1,49 +0,0 @@ -//go:build !linux -// +build !linux - -/* - Copyright The containerd 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 sys - -const ( - // OOMScoreMaxKillable is not implemented on non Linux - OOMScoreMaxKillable = 0 - // OOMScoreAdjMax is not implemented on non Linux - OOMScoreAdjMax = 0 -) - -// AdjustOOMScore sets the oom score for the provided pid. If the provided score -// is out of range (-1000 - 1000), it is clipped to the min/max value. -// -// Not implemented on Windows -func AdjustOOMScore(pid, score int) error { - return nil -} - -// SetOOMScore sets the oom score for the process -// -// Not implemented on Windows -func SetOOMScore(pid, score int) error { - return nil -} - -// GetOOMScoreAdj gets the oom score for a process -// -// Not implemented on Windows -func GetOOMScoreAdj(pid int) (int, error) { - return 0, nil -} diff --git a/vendor/github.com/containerd/containerd/sys/socket_unix.go b/vendor/github.com/containerd/containerd/sys/socket_unix.go deleted file mode 100644 index 367e19cad8..0000000000 --- a/vendor/github.com/containerd/containerd/sys/socket_unix.go +++ /dev/null @@ -1,81 +0,0 @@ -//go:build !windows -// +build !windows - -/* - Copyright The containerd 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 sys - -import ( - "fmt" - "net" - "os" - "path/filepath" - - "golang.org/x/sys/unix" -) - -// CreateUnixSocket creates a unix socket and returns the listener -func CreateUnixSocket(path string) (net.Listener, error) { - // BSDs have a 104 limit - if len(path) > 104 { - return nil, fmt.Errorf("%q: unix socket path too long (> 104)", path) - } - if err := os.MkdirAll(filepath.Dir(path), 0660); err != nil { - return nil, err - } - if err := unix.Unlink(path); err != nil && !os.IsNotExist(err) { - return nil, err - } - return net.Listen("unix", path) -} - -// GetLocalListener returns a listener out of a unix socket. -func GetLocalListener(path string, uid, gid int) (net.Listener, error) { - // Ensure parent directory is created - if err := mkdirAs(filepath.Dir(path), uid, gid); err != nil { - return nil, err - } - - l, err := CreateUnixSocket(path) - if err != nil { - return l, err - } - - if err := os.Chmod(path, 0660); err != nil { - l.Close() - return nil, err - } - - if err := os.Chown(path, uid, gid); err != nil { - l.Close() - return nil, err - } - - return l, nil -} - -func mkdirAs(path string, uid, gid int) error { - if _, err := os.Stat(path); !os.IsNotExist(err) { - return err - } - - if err := os.MkdirAll(path, 0770); err != nil { - return err - } - - return os.Chown(path, uid, gid) -} diff --git a/vendor/github.com/containerd/containerd/sys/socket_windows.go b/vendor/github.com/containerd/containerd/sys/socket_windows.go deleted file mode 100644 index 1ae12bc511..0000000000 --- a/vendor/github.com/containerd/containerd/sys/socket_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright The containerd 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 sys - -import ( - "net" - - "github.com/Microsoft/go-winio" -) - -// GetLocalListener returns a Listernet out of a named pipe. -// `path` must be of the form of `\\.\pipe\` -// (see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150) -func GetLocalListener(path string, uid, gid int) (net.Listener, error) { - return winio.ListenPipe(path, nil) -} diff --git a/vendor/github.com/containerd/containerd/sys/userns_deprecated.go b/vendor/github.com/containerd/containerd/sys/userns_deprecated.go deleted file mode 100644 index 53acf55477..0000000000 --- a/vendor/github.com/containerd/containerd/sys/userns_deprecated.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - Copyright The containerd 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 sys - -import "github.com/containerd/containerd/pkg/userns" - -// RunningInUserNS detects whether we are currently running in a user namespace. -// Deprecated: use github.com/containerd/containerd/pkg/userns.RunningInUserNS instead. -var RunningInUserNS = userns.RunningInUserNS diff --git a/vendor/github.com/containers/image/v5/docker/reference/reference.go b/vendor/github.com/containers/image/v5/docker/reference/reference.go index 8c0c23b2fe..b7cd00b0d6 100644 --- a/vendor/github.com/containers/image/v5/docker/reference/reference.go +++ b/vendor/github.com/containers/image/v5/docker/reference/reference.go @@ -3,13 +3,13 @@ // // Grammar // -// reference := name [ ":" tag ] [ "@" digest ] +// reference := name [ ":" tag ] [ "@" digest ] // name := [domain '/'] path-component ['/' path-component]* // domain := domain-component ['.' domain-component]* [':' port-number] // domain-component := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ // port-number := /[0-9]+/ // path-component := alpha-numeric [separator alpha-numeric]* -// alpha-numeric := /[a-z0-9]+/ +// alpha-numeric := /[a-z0-9]+/ // separator := /[_.]|__|[-]*/ // // tag := /[\w][\w.-]{0,127}/ diff --git a/vendor/github.com/containers/image/v5/docker/reference/regexp-additions.go b/vendor/github.com/containers/image/v5/docker/reference/regexp-additions.go new file mode 100644 index 0000000000..7b15871f7b --- /dev/null +++ b/vendor/github.com/containers/image/v5/docker/reference/regexp-additions.go @@ -0,0 +1,6 @@ +package reference + +// Return true if the specified string fully matches `IdentifierRegexp`. +func IsFullIdentifier(s string) bool { + return anchoredIdentifierRegexp.MatchString(s) +} diff --git a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/key.go b/vendor/github.com/containers/image/v5/internal/pkg/keyctl/key.go deleted file mode 100644 index bf6cc87d42..0000000000 --- a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/key.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2015 Jesse Sipprell. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build linux -// +build linux - -package keyctl - -import ( - "golang.org/x/sys/unix" -) - -// Key represents a single key linked to one or more kernel keyrings. -type Key struct { - Name string - - id, ring keyID - size int -} - -// ID returns the 32-bit kernel identifier for a specific key -func (k *Key) ID() int32 { - return int32(k.id) -} - -// Get the key's value as a byte slice -func (k *Key) Get() ([]byte, error) { - var ( - b []byte - err error - sizeRead int - ) - - if k.size == 0 { - k.size = 512 - } - - size := k.size - - b = make([]byte, int(size)) - sizeRead = size + 1 - for sizeRead > size { - r1, err := unix.KeyctlBuffer(unix.KEYCTL_READ, int(k.id), b, size) - if err != nil { - return nil, err - } - - if sizeRead = int(r1); sizeRead > size { - b = make([]byte, sizeRead) - size = sizeRead - sizeRead = size + 1 - } else { - k.size = sizeRead - } - } - return b[:k.size], err -} - -// Unlink a key from the keyring it was loaded from (or added to). If the key -// is not linked to any other keyrings, it is destroyed. -func (k *Key) Unlink() error { - _, err := unix.KeyctlInt(unix.KEYCTL_UNLINK, int(k.id), int(k.ring), 0, 0) - return err -} - -// Describe returns a string describing the attributes of a specified key -func (k *Key) Describe() (string, error) { - keyAttr, err := unix.KeyctlString(unix.KEYCTL_DESCRIBE, int(k.id)) - if err != nil { - return "", err - } - return keyAttr, nil -} diff --git a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/keyring.go b/vendor/github.com/containers/image/v5/internal/pkg/keyctl/keyring.go deleted file mode 100644 index 5eaad615c7..0000000000 --- a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/keyring.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2015 Jesse Sipprell. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build linux -// +build linux - -// Package keyctl is a Go interface to linux kernel keyrings (keyctl interface) -package keyctl - -import ( - "unsafe" - - "golang.org/x/sys/unix" -) - -// Keyring is the basic interface to a linux keyctl keyring. -type Keyring interface { - ID - Add(string, []byte) (*Key, error) - Search(string) (*Key, error) -} - -type keyring struct { - id keyID -} - -// ID is unique 32-bit serial number identifiers for all Keys and Keyrings have. -type ID interface { - ID() int32 -} - -// Add a new key to a keyring. The key can be searched for later by name. -func (kr *keyring) Add(name string, key []byte) (*Key, error) { - r, err := unix.AddKey("user", name, key, int(kr.id)) - if err == nil { - key := &Key{Name: name, id: keyID(r), ring: kr.id} - return key, nil - } - return nil, err -} - -// Search for a key by name, this also searches child keyrings linked to this -// one. The key, if found, is linked to the top keyring that Search() was called -// from. -func (kr *keyring) Search(name string) (*Key, error) { - id, err := unix.KeyctlSearch(int(kr.id), "user", name, 0) - if err == nil { - return &Key{Name: name, id: keyID(id), ring: kr.id}, nil - } - return nil, err -} - -// ID returns the 32-bit kernel identifier of a keyring -func (kr *keyring) ID() int32 { - return int32(kr.id) -} - -// SessionKeyring returns the current login session keyring -func SessionKeyring() (Keyring, error) { - return newKeyring(unix.KEY_SPEC_SESSION_KEYRING) -} - -// UserKeyring returns the keyring specific to the current user. -func UserKeyring() (Keyring, error) { - return newKeyring(unix.KEY_SPEC_USER_KEYRING) -} - -// Unlink an object from a keyring -func Unlink(parent Keyring, child ID) error { - _, err := unix.KeyctlInt(unix.KEYCTL_UNLINK, int(child.ID()), int(parent.ID()), 0, 0) - return err -} - -// Link a key into a keyring -func Link(parent Keyring, child ID) error { - _, err := unix.KeyctlInt(unix.KEYCTL_LINK, int(child.ID()), int(parent.ID()), 0, 0) - return err -} - -// ReadUserKeyring reads user keyring and returns slice of key with id(key_serial_t) representing the IDs of all the keys that are linked to it -func ReadUserKeyring() ([]*Key, error) { - var ( - b []byte - err error - sizeRead int - ) - krSize := 4 - size := krSize - b = make([]byte, size) - sizeRead = size + 1 - for sizeRead > size { - r1, err := unix.KeyctlBuffer(unix.KEYCTL_READ, unix.KEY_SPEC_USER_KEYRING, b, size) - if err != nil { - return nil, err - } - - if sizeRead = int(r1); sizeRead > size { - b = make([]byte, sizeRead) - size = sizeRead - sizeRead = size + 1 - } else { - krSize = sizeRead - } - } - keyIDs := getKeyIDsFromByte(b[:krSize]) - return keyIDs, err -} - -func getKeyIDsFromByte(byteKeyIDs []byte) []*Key { - idSize := 4 - var keys []*Key - for idx := 0; idx+idSize <= len(byteKeyIDs); idx = idx + idSize { - tempID := *(*int32)(unsafe.Pointer(&byteKeyIDs[idx])) - keys = append(keys, &Key{id: keyID(tempID)}) - } - return keys -} diff --git a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/perm.go b/vendor/github.com/containers/image/v5/internal/pkg/keyctl/perm.go deleted file mode 100644 index 5f4d2157ae..0000000000 --- a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/perm.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015 Jesse Sipprell. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build linux -// +build linux - -package keyctl - -import ( - "golang.org/x/sys/unix" -) - -// KeyPerm represents in-kernel access control permission to keys and keyrings -// as a 32-bit integer broken up into four permission sets, one per byte. -// In MSB order, the perms are: Processor, User, Group, Other. -type KeyPerm uint32 - -const ( - // PermOtherAll sets all permission for Other - PermOtherAll KeyPerm = 0x3f << (8 * iota) - // PermGroupAll sets all permission for Group - PermGroupAll - // PermUserAll sets all permission for User - PermUserAll - // PermProcessAll sets all permission for Processor - PermProcessAll -) - -// SetPerm sets the permissions on a key or keyring. -func SetPerm(k ID, p KeyPerm) error { - err := unix.KeyctlSetperm(int(k.ID()), uint32(p)) - return err -} diff --git a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/sys_linux.go b/vendor/github.com/containers/image/v5/internal/pkg/keyctl/sys_linux.go deleted file mode 100644 index f61666e42c..0000000000 --- a/vendor/github.com/containers/image/v5/internal/pkg/keyctl/sys_linux.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2015 Jesse Sipprell. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build linux -// +build linux - -package keyctl - -import ( - "golang.org/x/sys/unix" -) - -type keyID int32 - -func newKeyring(id keyID) (*keyring, error) { - r1, err := unix.KeyctlGetKeyringID(int(id), true) - if err != nil { - return nil, err - } - - if id < 0 { - r1 = int(id) - } - return &keyring{id: keyID(r1)}, nil -} diff --git a/vendor/github.com/containers/image/v5/pkg/docker/config/config.go b/vendor/github.com/containers/image/v5/pkg/docker/config/config.go index 1d73dc405e..0790a47f24 100644 --- a/vendor/github.com/containers/image/v5/pkg/docker/config/config.go +++ b/vendor/github.com/containers/image/v5/pkg/docker/config/config.go @@ -3,8 +3,8 @@ package config import ( "encoding/base64" "encoding/json" + "errors" "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -15,10 +15,10 @@ import ( "github.com/containers/image/v5/pkg/sysregistriesv2" "github.com/containers/image/v5/types" "github.com/containers/storage/pkg/homedir" + "github.com/containers/storage/pkg/ioutils" helperclient "github.com/docker/docker-credential-helpers/client" "github.com/docker/docker-credential-helpers/credentials" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -111,7 +111,7 @@ func SetCredentials(sys *types.SystemContext, key, username, password string) (s } func unsupportedNamespaceErr(helper string) error { - return errors.Errorf("namespaced key is not supported for credential helper %s", helper) + return fmt.Errorf("namespaced key is not supported for credential helper %s", helper) } // SetAuthentication stores the username and password in the credential helper or file @@ -149,7 +149,7 @@ func GetAllCredentials(sys *types.SystemContext) (map[string]types.DockerAuthCon // readJSONFile returns an empty map in case the path doesn't exist. auths, err := readJSONFile(path.path, path.legacyFormat) if err != nil { - return nil, errors.Wrapf(err, "reading JSON file %q", path.path) + return nil, fmt.Errorf("reading JSON file %q: %w", path.path, err) } // Credential helpers in the auth file have a // direct mapping to a registry, so we can just @@ -170,16 +170,14 @@ func GetAllCredentials(sys *types.SystemContext) (map[string]types.DockerAuthCon creds, err := listAuthsFromCredHelper(helper) if err != nil { logrus.Debugf("Error listing credentials stored in credential helper %s: %v", helper, err) - } - switch errors.Cause(err) { - case nil: - for registry := range creds { - addKey(registry) + if errors.Is(err, exec.ErrNotFound) { + creds = nil // It's okay if the helper doesn't exist. + } else { + return nil, err } - case exec.ErrNotFound: - // It's okay if the helper doesn't exist. - default: - return nil, err + } + for registry := range creds { + addKey(registry) } } } @@ -358,7 +356,7 @@ func getAuthenticationWithHomeDir(sys *types.SystemContext, key, homeDir string) return "", "", err } if auth.IdentityToken != "" { - return "", "", errors.Wrap(ErrNotSupported, "non-empty identity token found and this API doesn't support it") + return "", "", fmt.Errorf("non-empty identity token found and this API doesn't support it: %w", ErrNotSupported) } return auth.Username, auth.Password, nil } @@ -397,7 +395,7 @@ func RemoveAuthentication(sys *types.SystemContext, key string) error { return } } - multiErr = multierror.Append(multiErr, errors.Wrapf(err, "removing credentials for %s from credential helper %s", key, helper)) + multiErr = multierror.Append(multiErr, fmt.Errorf("removing credentials for %s from credential helper %s: %w", key, helper, err)) } for _, helper := range helpers { @@ -465,19 +463,19 @@ func RemoveAllAuthentication(sys *types.SystemContext) error { default: var creds map[string]string creds, err = listAuthsFromCredHelper(helper) - switch errors.Cause(err) { - case nil: - for registry := range creds { - err = deleteAuthFromCredHelper(helper, registry) - if err != nil { - break - } + if err != nil { + if errors.Is(err, exec.ErrNotFound) { + // It's okay if the helper doesn't exist. + continue + } else { + break + } + } + for registry := range creds { + err = deleteAuthFromCredHelper(helper, registry) + if err != nil { + break } - case exec.ErrNotFound: - // It's okay if the helper doesn't exist. - continue - default: - // fall through } } if err != nil { @@ -530,7 +528,7 @@ func getPathToAuthWithOS(sys *types.SystemContext, goOS string) (string, bool, e // This means the user set the XDG_RUNTIME_DIR variable and either forgot to create the directory // or made a typo while setting the environment variable, // so return an error referring to $XDG_RUNTIME_DIR instead of xdgRuntimeDirPath inside. - return "", false, errors.Wrapf(err, "%q directory set by $XDG_RUNTIME_DIR does not exist. Either create the directory or unset $XDG_RUNTIME_DIR.", runtimeDir) + return "", false, fmt.Errorf("%q directory set by $XDG_RUNTIME_DIR does not exist. Either create the directory or unset $XDG_RUNTIME_DIR.: %w", runtimeDir, err) } // else ignore err and let the caller fail accessing xdgRuntimeDirPath. return filepath.Join(runtimeDir, xdgRuntimeDirPath), false, nil } @@ -543,7 +541,7 @@ func getPathToAuthWithOS(sys *types.SystemContext, goOS string) (string, bool, e func readJSONFile(path string, legacyFormat bool) (dockerConfigFile, error) { var auths dockerConfigFile - raw, err := ioutil.ReadFile(path) + raw, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { auths.AuthConfigs = map[string]dockerAuthConfig{} @@ -554,13 +552,13 @@ func readJSONFile(path string, legacyFormat bool) (dockerConfigFile, error) { if legacyFormat { if err = json.Unmarshal(raw, &auths.AuthConfigs); err != nil { - return dockerConfigFile{}, errors.Wrapf(err, "unmarshaling JSON at %q", path) + return dockerConfigFile{}, fmt.Errorf("unmarshaling JSON at %q: %w", path, err) } return auths, nil } if err = json.Unmarshal(raw, &auths); err != nil { - return dockerConfigFile{}, errors.Wrapf(err, "unmarshaling JSON at %q", path) + return dockerConfigFile{}, fmt.Errorf("unmarshaling JSON at %q: %w", path, err) } if auths.AuthConfigs == nil { @@ -592,21 +590,21 @@ func modifyJSON(sys *types.SystemContext, editor func(auths *dockerConfigFile) ( auths, err := readJSONFile(path, false) if err != nil { - return "", errors.Wrapf(err, "reading JSON file %q", path) + return "", fmt.Errorf("reading JSON file %q: %w", path, err) } updated, err := editor(&auths) if err != nil { - return "", errors.Wrapf(err, "updating %q", path) + return "", fmt.Errorf("updating %q: %w", path, err) } if updated { newData, err := json.MarshalIndent(auths, "", "\t") if err != nil { - return "", errors.Wrapf(err, "marshaling JSON %q", path) + return "", fmt.Errorf("marshaling JSON %q: %w", path, err) } - if err = ioutil.WriteFile(path, newData, 0600); err != nil { - return "", errors.Wrapf(err, "writing to file %q", path) + if err = ioutils.AtomicWriteFile(path, newData, 0600); err != nil { + return "", fmt.Errorf("writing to file %q: %w", path, err) } } @@ -660,7 +658,7 @@ func deleteAuthFromCredHelper(credHelper, registry string) error { func findCredentialsInFile(key, registry, path string, legacyFormat bool) (types.DockerAuthConfig, error) { auths, err := readJSONFile(path, legacyFormat) if err != nil { - return types.DockerAuthConfig{}, errors.Wrapf(err, "reading JSON file %q", path) + return types.DockerAuthConfig{}, fmt.Errorf("reading JSON file %q: %w", path, err) } // First try cred helpers. They should always be normalized. @@ -685,7 +683,7 @@ func findCredentialsInFile(key, registry, path string, legacyFormat bool) (types // keys we prefer exact matches as well. for _, key := range keys { if val, exists := auths.AuthConfigs[key]; exists { - return decodeDockerAuth(val) + return decodeDockerAuth(path, key, val) } } @@ -700,7 +698,7 @@ func findCredentialsInFile(key, registry, path string, legacyFormat bool) (types registry = normalizeRegistry(registry) for k, v := range auths.AuthConfigs { if normalizeAuthFileKey(k, legacyFormat) == registry { - return decodeDockerAuth(v) + return decodeDockerAuth(path, k, v) } } @@ -731,9 +729,9 @@ func authKeysForKey(key string) (res []string) { return res } -// decodeDockerAuth decodes the username and password, which is -// encoded in base64. -func decodeDockerAuth(conf dockerAuthConfig) (types.DockerAuthConfig, error) { +// decodeDockerAuth decodes the username and password from conf, +// which is entry key in path. +func decodeDockerAuth(path, key string, conf dockerAuthConfig) (types.DockerAuthConfig, error) { decoded, err := base64.StdEncoding.DecodeString(conf.Auth) if err != nil { return types.DockerAuthConfig{}, err @@ -742,6 +740,11 @@ func decodeDockerAuth(conf dockerAuthConfig) (types.DockerAuthConfig, error) { parts := strings.SplitN(string(decoded), ":", 2) if len(parts) != 2 { // if it's invalid just skip, as docker does + if len(decoded) > 0 { // Docker writes "auths": { "$host": {} } entries if a credential helper is used, don’t warn about those + logrus.Warnf(`Error parsing the "auth" field of a credential entry %q in %q, missing semicolon`, key, path) // Don’t include the text of decoded, because that might put secrets into a log. + } else { + logrus.Debugf("Found an empty credential entry %q in %q (an unhandled credential helper marker?), moving on", key, path) + } return types.DockerAuthConfig{}, nil } @@ -781,7 +784,7 @@ func normalizeRegistry(registry string) string { // allowed and returns an indicator if the key is namespaced. func validateKey(key string) (bool, error) { if strings.HasPrefix(key, "http://") || strings.HasPrefix(key, "https://") { - return false, errors.Errorf("key %s contains http[s]:// prefix", key) + return false, fmt.Errorf("key %s contains http[s]:// prefix", key) } // Ideally this should only accept explicitly valid keys, compare diff --git a/vendor/github.com/containers/image/v5/pkg/docker/config/config_linux.go b/vendor/github.com/containers/image/v5/pkg/docker/config/config_linux.go deleted file mode 100644 index 0bf1612591..0000000000 --- a/vendor/github.com/containers/image/v5/pkg/docker/config/config_linux.go +++ /dev/null @@ -1,119 +0,0 @@ -package config - -import ( - "fmt" - "strings" - - "github.com/containers/image/v5/internal/pkg/keyctl" - "github.com/pkg/errors" - "github.com/sirupsen/logrus" -) - -// NOTE: none of the functions here are currently used. If we ever want to -// re-enable keyring support, we should introduce a similar built-in credential -// helpers as for `sysregistriesv2.AuthenticationFileHelper`. - -const keyDescribePrefix = "container-registry-login:" //nolint:deadcode,unused - -func getAuthFromKernelKeyring(registry string) (string, string, error) { //nolint:deadcode,unused - userkeyring, err := keyctl.UserKeyring() - if err != nil { - return "", "", err - } - key, err := userkeyring.Search(genDescription(registry)) - if err != nil { - return "", "", err - } - authData, err := key.Get() - if err != nil { - return "", "", err - } - parts := strings.SplitN(string(authData), "\x00", 2) - if len(parts) != 2 { - return "", "", nil - } - return parts[0], parts[1], nil -} - -func deleteAuthFromKernelKeyring(registry string) error { //nolint:deadcode,unused - userkeyring, err := keyctl.UserKeyring() - - if err != nil { - return err - } - key, err := userkeyring.Search(genDescription(registry)) - if err != nil { - return err - } - return key.Unlink() -} - -func removeAllAuthFromKernelKeyring() error { //nolint:deadcode,unused - keys, err := keyctl.ReadUserKeyring() - if err != nil { - return err - } - - userkeyring, err := keyctl.UserKeyring() - if err != nil { - return err - } - - for _, k := range keys { - keyAttr, err := k.Describe() - if err != nil { - return err - } - // split string "type;uid;gid;perm;description" - keyAttrs := strings.SplitN(keyAttr, ";", 5) - if len(keyAttrs) < 5 { - return errors.Errorf("Key attributes of %d are not available", k.ID()) - } - keyDescribe := keyAttrs[4] - if strings.HasPrefix(keyDescribe, keyDescribePrefix) { - err := keyctl.Unlink(userkeyring, k) - if err != nil { - return errors.Wrapf(err, "unlinking key %d", k.ID()) - } - logrus.Debugf("unlinked key %d:%s", k.ID(), keyAttr) - } - } - return nil -} - -func setAuthToKernelKeyring(registry, username, password string) error { //nolint:deadcode,unused - keyring, err := keyctl.SessionKeyring() - if err != nil { - return err - } - id, err := keyring.Add(genDescription(registry), []byte(fmt.Sprintf("%s\x00%s", username, password))) - if err != nil { - return err - } - - // sets all permission(view,read,write,search,link,set attribute) for current user - // it enables the user to search the key after it linked to user keyring and unlinked from session keyring - err = keyctl.SetPerm(id, keyctl.PermUserAll) - if err != nil { - return err - } - // link the key to userKeyring - userKeyring, err := keyctl.UserKeyring() - if err != nil { - return errors.Wrapf(err, "getting user keyring") - } - err = keyctl.Link(userKeyring, id) - if err != nil { - return errors.Wrapf(err, "linking the key to user keyring") - } - // unlink the key from session keyring - err = keyctl.Unlink(keyring, id) - if err != nil { - return errors.Wrapf(err, "unlinking the key from session keyring") - } - return nil -} - -func genDescription(registry string) string { //nolint:deadcode,unused - return fmt.Sprintf("%s%s", keyDescribePrefix, registry) -} diff --git a/vendor/github.com/containers/image/v5/pkg/docker/config/config_unsupported.go b/vendor/github.com/containers/image/v5/pkg/docker/config/config_unsupported.go deleted file mode 100644 index d9827d8edb..0000000000 --- a/vendor/github.com/containers/image/v5/pkg/docker/config/config_unsupported.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build !linux && (!386 || !amd64) -// +build !linux -// +build !386 !amd64 - -package config - -func getAuthFromKernelKeyring(registry string) (string, string, error) { //nolint:deadcode,unused - return "", "", ErrNotSupported -} - -func deleteAuthFromKernelKeyring(registry string) error { //nolint:deadcode,unused - return ErrNotSupported -} - -func setAuthToKernelKeyring(registry, username, password string) error { //nolint:deadcode,unused - return ErrNotSupported -} - -func removeAllAuthFromKernelKeyring() error { //nolint:deadcode,unused - return ErrNotSupported -} diff --git a/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/paths_common.go b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/paths_common.go new file mode 100644 index 0000000000..07fe502942 --- /dev/null +++ b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/paths_common.go @@ -0,0 +1,12 @@ +//go:build !freebsd +// +build !freebsd + +package sysregistriesv2 + +// builtinRegistriesConfPath is the path to the registry configuration file. +// DO NOT change this, instead see systemRegistriesConfPath above. +const builtinRegistriesConfPath = "/etc/containers/registries.conf" + +// builtinRegistriesConfDirPath is the path to the registry configuration directory. +// DO NOT change this, instead see systemRegistriesConfDirectoryPath above. +const builtinRegistriesConfDirPath = "/etc/containers/registries.conf.d" diff --git a/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/paths_freebsd.go b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/paths_freebsd.go new file mode 100644 index 0000000000..741b99f8f7 --- /dev/null +++ b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/paths_freebsd.go @@ -0,0 +1,12 @@ +//go:build freebsd +// +build freebsd + +package sysregistriesv2 + +// builtinRegistriesConfPath is the path to the registry configuration file. +// DO NOT change this, instead see systemRegistriesConfPath above. +const builtinRegistriesConfPath = "/usr/local/etc/containers/registries.conf" + +// builtinRegistriesConfDirPath is the path to the registry configuration directory. +// DO NOT change this, instead see systemRegistriesConfDirectoryPath above. +const builtinRegistriesConfDirPath = "/usr/local/etc/containers/registries.conf.d" diff --git a/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/shortnames.go b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/shortnames.go index 7122e869fe..12939b24da 100644 --- a/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/shortnames.go +++ b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/shortnames.go @@ -1,6 +1,7 @@ package sysregistriesv2 import ( + "fmt" "os" "path/filepath" "reflect" @@ -12,7 +13,7 @@ import ( "github.com/containers/image/v5/types" "github.com/containers/storage/pkg/homedir" "github.com/containers/storage/pkg/lockfile" - "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) // defaultShortNameMode is the default mode of registries.conf files if the @@ -165,7 +166,7 @@ func editShortNameAlias(ctx *types.SystemContext, name string, value *string) er } else { // If the name does not exist, throw an error. if _, exists := conf.Aliases[name]; !exists { - return errors.Errorf("short-name alias %q not found in %q: please check registries.conf files", name, confPath) + return fmt.Errorf("short-name alias %q not found in %q: please check registries.conf files", name, confPath) } delete(conf.Aliases, name) @@ -209,25 +210,25 @@ func RemoveShortNameAlias(ctx *types.SystemContext, name string) error { func parseShortNameValue(alias string) (reference.Named, error) { ref, err := reference.Parse(alias) if err != nil { - return nil, errors.Wrapf(err, "parsing alias %q", alias) + return nil, fmt.Errorf("parsing alias %q: %w", alias, err) } if _, ok := ref.(reference.Digested); ok { - return nil, errors.Errorf("invalid alias %q: must not contain digest", alias) + return nil, fmt.Errorf("invalid alias %q: must not contain digest", alias) } if _, ok := ref.(reference.Tagged); ok { - return nil, errors.Errorf("invalid alias %q: must not contain tag", alias) + return nil, fmt.Errorf("invalid alias %q: must not contain tag", alias) } named, ok := ref.(reference.Named) if !ok { - return nil, errors.Errorf("invalid alias %q: must contain registry and repository", alias) + return nil, fmt.Errorf("invalid alias %q: must contain registry and repository", alias) } registry := reference.Domain(named) if !(strings.ContainsAny(registry, ".:") || registry == "localhost") { - return nil, errors.Errorf("invalid alias %q: must contain registry and repository", alias) + return nil, fmt.Errorf("invalid alias %q: must contain registry and repository", alias) } // A final parse to make sure that docker.io references are correctly @@ -241,25 +242,25 @@ func parseShortNameValue(alias string) (reference.Named, error) { func validateShortName(name string) error { repo, err := reference.Parse(name) if err != nil { - return errors.Wrapf(err, "cannot parse short name: %q", name) + return fmt.Errorf("cannot parse short name: %q: %w", name, err) } if _, ok := repo.(reference.Digested); ok { - return errors.Errorf("invalid short name %q: must not contain digest", name) + return fmt.Errorf("invalid short name %q: must not contain digest", name) } if _, ok := repo.(reference.Tagged); ok { - return errors.Errorf("invalid short name %q: must not contain tag", name) + return fmt.Errorf("invalid short name %q: must not contain tag", name) } named, ok := repo.(reference.Named) if !ok { - return errors.Errorf("invalid short name %q: no name", name) + return fmt.Errorf("invalid short name %q: no name", name) } registry := reference.Domain(named) if strings.ContainsAny(registry, ".:") || registry == "localhost" { - return errors.Errorf("invalid short name %q: must not contain registry", name) + return fmt.Errorf("invalid short name %q: must not contain registry", name) } return nil } @@ -297,7 +298,7 @@ func newShortNameAliasCache(path string, conf *shortNameAliasConf) (*shortNameAl if len(errs) > 0 { err := errs[0] for i := 1; i < len(errs); i++ { - err = errors.Wrapf(err, "%v\n", errs[i]) + err = fmt.Errorf("%v\n: %w", errs[i], err) } return nil, err } @@ -315,17 +316,20 @@ func (c *shortNameAliasCache) updateWithConfigurationFrom(updates *shortNameAlia func loadShortNameAliasConf(confPath string) (*shortNameAliasConf, *shortNameAliasCache, error) { conf := shortNameAliasConf{} - _, err := toml.DecodeFile(confPath, &conf) + meta, err := toml.DecodeFile(confPath, &conf) if err != nil && !os.IsNotExist(err) { // It's okay if the config doesn't exist. Other errors are not. - return nil, nil, errors.Wrapf(err, "loading short-name aliases config file %q", confPath) + return nil, nil, fmt.Errorf("loading short-name aliases config file %q: %w", confPath, err) + } + if keys := meta.Undecoded(); len(keys) > 0 { + logrus.Debugf("Failed to decode keys %q from %q", keys, confPath) } // Even if we don’t always need the cache, doing so validates the machine-generated config. The // file could still be corrupted by another process or user. cache, err := newShortNameAliasCache(confPath, &conf) if err != nil { - return nil, nil, errors.Wrapf(err, "loading short-name aliases config file %q", confPath) + return nil, nil, fmt.Errorf("loading short-name aliases config file %q: %w", confPath, err) } return &conf, cache, nil diff --git a/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/system_registries_v2.go b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/system_registries_v2.go index c8a603c4ef..41204dd9af 100644 --- a/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/system_registries_v2.go +++ b/vendor/github.com/containers/image/v5/pkg/sysregistriesv2/system_registries_v2.go @@ -2,6 +2,7 @@ package sysregistriesv2 import ( "fmt" + "io/fs" "os" "path/filepath" "reflect" @@ -14,7 +15,6 @@ import ( "github.com/containers/image/v5/docker/reference" "github.com/containers/image/v5/types" "github.com/containers/storage/pkg/homedir" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -24,25 +24,27 @@ import ( // -ldflags '-X github.com/containers/image/v5/sysregistries.systemRegistriesConfPath=$your_path' var systemRegistriesConfPath = builtinRegistriesConfPath -// builtinRegistriesConfPath is the path to the registry configuration file. -// DO NOT change this, instead see systemRegistriesConfPath above. -const builtinRegistriesConfPath = "/etc/containers/registries.conf" - // systemRegistriesConfDirPath is the path to the system-wide registry // configuration directory and is used to add/subtract potential registries for // obtaining images. You can override this at build time with // -ldflags '-X github.com/containers/image/v5/sysregistries.systemRegistriesConfDirectoryPath=$your_path' var systemRegistriesConfDirPath = builtinRegistriesConfDirPath -// builtinRegistriesConfDirPath is the path to the registry configuration directory. -// DO NOT change this, instead see systemRegistriesConfDirectoryPath above. -const builtinRegistriesConfDirPath = "/etc/containers/registries.conf.d" - // AuthenticationFileHelper is a special key for credential helpers indicating // the usage of consulting containers-auth.json files instead of a credential // helper. const AuthenticationFileHelper = "containers-auth.json" +const ( + // configuration values for "pull-from-mirror" + // mirrors will be used for both digest pulls and tag pulls + MirrorAll = "all" + // mirrors will only be used for digest pulls + MirrorByDigestOnly = "digest-only" + // mirrors will only be used for tag pulls + MirrorByTagOnly = "tag-only" +) + // Endpoint describes a remote location of a registry. type Endpoint struct { // The endpoint's remote location. Can be empty iff Prefix contains @@ -53,6 +55,18 @@ type Endpoint struct { // If true, certs verification will be skipped and HTTP (non-TLS) // connections will be allowed. Insecure bool `toml:"insecure,omitempty"` + // PullFromMirror is used for adding restrictions to image pull through the mirror. + // Set to "all", "digest-only", or "tag-only". + // If "digest-only", mirrors will only be used for digest pulls. Pulling images by + // tag can potentially yield different images, depending on which endpoint + // we pull from. Restricting mirrors to pulls by digest avoids that issue. + // If "tag-only", mirrors will only be used for tag pulls. For a more up-to-date and expensive mirror + // that it is less likely to be out of sync if tags move, it should not be unnecessarily + // used for digest references. + // Default is "all" (or left empty), mirrors will be used for both digest pulls and tag pulls unless the mirror-by-digest-only is set for the primary registry. + // This can only be set in a registry's Mirror field, not in the registry's primary Endpoint. + // This per-mirror setting is allowed only when mirror-by-digest-only is not configured for the primary registry. + PullFromMirror string `toml:"pull-from-mirror,omitempty"` } // userRegistriesFile is the path to the per user registry configuration file. @@ -88,7 +102,7 @@ func (e *Endpoint) rewriteReference(ref reference.Named, prefix string) (referen newNamedRef = e.Location + refString[prefixLen:] newParsedRef, err := reference.ParseNamed(newNamedRef) if err != nil { - return nil, errors.Wrapf(err, "rewriting reference") + return nil, fmt.Errorf("rewriting reference: %w", err) } return newParsedRef, nil @@ -115,7 +129,7 @@ type Registry struct { Blocked bool `toml:"blocked,omitempty"` // If true, mirrors will only be used for digest pulls. Pulling images by // tag can potentially yield different images, depending on which endpoint - // we pull from. Forcing digest-pulls for mirrors avoids that issue. + // we pull from. Restricting mirrors to pulls by digest avoids that issue. MirrorByDigestOnly bool `toml:"mirror-by-digest-only,omitempty"` } @@ -130,17 +144,29 @@ type PullSource struct { // reference. func (r *Registry) PullSourcesFromReference(ref reference.Named) ([]PullSource, error) { var endpoints []Endpoint - + _, isDigested := ref.(reference.Canonical) if r.MirrorByDigestOnly { - // Only use mirrors when the reference is a digest one. - if _, isDigested := ref.(reference.Canonical); isDigested { - endpoints = append(r.Mirrors, r.Endpoint) - } else { - endpoints = []Endpoint{r.Endpoint} + // Only use mirrors when the reference is a digested one. + if isDigested { + endpoints = append(endpoints, r.Mirrors...) } } else { - endpoints = append(r.Mirrors, r.Endpoint) + for _, mirror := range r.Mirrors { + // skip the mirror if per mirror setting exists but reference does not match the restriction + switch mirror.PullFromMirror { + case MirrorByDigestOnly: + if !isDigested { + continue + } + case MirrorByTagOnly: + if isDigested { + continue + } + } + endpoints = append(endpoints, mirror) + } } + endpoints = append(endpoints, r.Endpoint) sources := []PullSource{} for _, ep := range endpoints { @@ -374,6 +400,10 @@ func (config *V2RegistriesConf) postProcessRegistries() error { } } + // validate the mirror usage settings does not apply to primary registry + if reg.PullFromMirror != "" { + return fmt.Errorf("pull-from-mirror must not be set for a non-mirror registry %q", reg.Prefix) + } // make sure mirrors are valid for _, mir := range reg.Mirrors { mir.Location, err = parseLocation(mir.Location) @@ -387,6 +417,14 @@ func (config *V2RegistriesConf) postProcessRegistries() error { if mir.Location == "" { return &InvalidRegistries{s: "invalid condition: mirror location is unset"} } + + if reg.MirrorByDigestOnly && mir.PullFromMirror != "" { + return &InvalidRegistries{s: fmt.Sprintf("cannot set mirror usage mirror-by-digest-only for the registry (%q) and pull-from-mirror for per-mirror (%q) at the same time", reg.Prefix, mir.Location)} + } + if mir.PullFromMirror != "" && mir.PullFromMirror != MirrorAll && + mir.PullFromMirror != MirrorByDigestOnly && mir.PullFromMirror != MirrorByTagOnly { + return &InvalidRegistries{s: fmt.Sprintf("unsupported pull-from-mirror value %q for mirror %q", mir.PullFromMirror, mir.Location)} + } } if reg.Location == "" { regMap[reg.Prefix] = append(regMap[reg.Prefix], reg) @@ -597,17 +635,17 @@ func dropInConfigs(wrapper configWrapper) ([]string, error) { dirPaths = append(dirPaths, wrapper.userConfigDirPath) } for _, dirPath := range dirPaths { - err := filepath.Walk(dirPath, + err := filepath.WalkDir(dirPath, // WalkFunc to read additional configs - func(path string, info os.FileInfo, err error) error { + func(path string, d fs.DirEntry, err error) error { switch { case err != nil: // return error (could be a permission problem) return err - case info == nil: + case d == nil: // this should only happen when err != nil but let's be sure return nil - case info.IsDir(): + case d.IsDir(): if path != dirPath { // make sure to not recurse into sub-directories return filepath.SkipDir @@ -627,7 +665,7 @@ func dropInConfigs(wrapper configWrapper) ([]string, error) { if err != nil && !os.IsNotExist(err) { // Ignore IsNotExist errors: most systems won't have a registries.conf.d // directory. - return nil, errors.Wrapf(err, "reading registries.conf.d") + return nil, fmt.Errorf("reading registries.conf.d: %w", err) } } @@ -669,7 +707,7 @@ func tryUpdatingCache(ctx *types.SystemContext, wrapper configWrapper) (*parsedC return nil, err // Should never happen } } else { - return nil, errors.Wrapf(err, "loading registries configuration %q", wrapper.configPath) + return nil, fmt.Errorf("loading registries configuration %q: %w", wrapper.configPath, err) } } @@ -682,7 +720,7 @@ func tryUpdatingCache(ctx *types.SystemContext, wrapper configWrapper) (*parsedC // Enforce v2 format for drop-in-configs. dropIn, err := loadConfigFile(path, true) if err != nil { - return nil, errors.Wrapf(err, "loading drop-in registries configuration %q", path) + return nil, fmt.Errorf("loading drop-in registries configuration %q: %w", path, err) } config.updateWithConfigurationFrom(dropIn) } @@ -743,7 +781,7 @@ func parseShortNameMode(mode string) (types.ShortNameMode, error) { case "permissive": return types.ShortNameModePermissive, nil default: - return types.ShortNameModeInvalid, errors.Errorf("invalid short-name mode: %q", mode) + return types.ShortNameModeInvalid, fmt.Errorf("invalid short-name mode: %q", mode) } } @@ -877,10 +915,13 @@ func loadConfigFile(path string, forceV2 bool) (*parsedConfig, error) { // Load the tomlConfig. Note that `DecodeFile` will overwrite set fields. var combinedTOML tomlConfig - _, err := toml.DecodeFile(path, &combinedTOML) + meta, err := toml.DecodeFile(path, &combinedTOML) if err != nil { return nil, err } + if keys := meta.Undecoded(); len(keys) > 0 { + logrus.Debugf("Failed to decode keys %q from %q", keys, path) + } if combinedTOML.V1RegistriesConf.Nonempty() { // Enforce the v2 format if requested. @@ -933,7 +974,7 @@ func loadConfigFile(path string, forceV2 bool) (*parsedConfig, error) { // Parse and validate short-name aliases. cache, err := newShortNameAliasCache(path, &res.partialV2.shortNameAliasConf) if err != nil { - return nil, errors.Wrap(err, "validating short-name aliases") + return nil, fmt.Errorf("validating short-name aliases: %w", err) } res.aliasCache = cache // Clear conf.partialV2.shortNameAliasConf to make it available for garbage collection and diff --git a/vendor/github.com/containers/image/v5/types/types.go b/vendor/github.com/containers/image/v5/types/types.go index dcff8caf76..7075b09e09 100644 --- a/vendor/github.com/containers/image/v5/types/types.go +++ b/vendor/github.com/containers/image/v5/types/types.go @@ -177,24 +177,25 @@ type BICReplacementCandidate struct { // BlobInfoCache records data useful for reusing blobs, or substituting equivalent ones, to avoid unnecessary blob copies. // // It records two kinds of data: -// - Sets of corresponding digest vs. uncompressed digest ("DiffID") pairs: -// One of the two digests is known to be uncompressed, and a single uncompressed digest may correspond to more than one compressed digest. -// This allows matching compressed layer blobs to existing local uncompressed layers (to avoid unnecessary download and decompression), -// or uncompressed layer blobs to existing remote compressed layers (to avoid unnecessary compression and upload)/ // -// It is allowed to record an (uncompressed digest, the same uncompressed digest) correspondence, to express that the digest is known -// to be uncompressed (i.e. that a conversion from schema1 does not have to decompress the blob to compute a DiffID value). +// - Sets of corresponding digest vs. uncompressed digest ("DiffID") pairs: +// One of the two digests is known to be uncompressed, and a single uncompressed digest may correspond to more than one compressed digest. +// This allows matching compressed layer blobs to existing local uncompressed layers (to avoid unnecessary download and decompression), +// or uncompressed layer blobs to existing remote compressed layers (to avoid unnecessary compression and upload)/ // -// This mapping is primarily maintained in generic copy.Image code, but transports may want to contribute more data points if they independently -// compress/decompress blobs for their own purposes. +// It is allowed to record an (uncompressed digest, the same uncompressed digest) correspondence, to express that the digest is known +// to be uncompressed (i.e. that a conversion from schema1 does not have to decompress the blob to compute a DiffID value). // -// - Known blob locations, managed by individual transports: -// The transports call RecordKnownLocation when encountering a blob that could possibly be reused (typically in GetBlob/PutBlob/TryReusingBlob), -// recording transport-specific information that allows the transport to reuse the blob in the future; -// then, TryReusingBlob implementations can call CandidateLocations to look up previously recorded blob locations that could be reused. +// This mapping is primarily maintained in generic copy.Image code, but transports may want to contribute more data points if they independently +// compress/decompress blobs for their own purposes. // -// Each transport defines its own “scopes” within which blob reuse is possible (e.g. in, the docker/distribution case, blobs -// can be directly reused within a registry, or mounted across registries within a registry server.) +// - Known blob locations, managed by individual transports: +// The transports call RecordKnownLocation when encountering a blob that could possibly be reused (typically in GetBlob/PutBlob/TryReusingBlob), +// recording transport-specific information that allows the transport to reuse the blob in the future; +// then, TryReusingBlob implementations can call CandidateLocations to look up previously recorded blob locations that could be reused. +// +// Each transport defines its own “scopes” within which blob reuse is possible (e.g. in, the docker/distribution case, blobs +// can be directly reused within a registry, or mounted across registries within a registry server.) // // None of the methods return an error indication: errors when neither reading from, nor writing to, the cache, should be fatal; // users of the cache should just fall back to copying the blobs the usual way. @@ -465,7 +466,17 @@ type ImageInspectInfo struct { Variant string Os string Layers []string + LayersData []ImageInspectLayer Env []string + Author string +} + +// ImageInspectLayer is a set of metadata describing an image layers' detail +type ImageInspectLayer struct { + MIMEType string // "" if unknown. + Digest digest.Digest + Size int64 // -1 if unknown. + Annotations map[string]string } // DockerAuthConfig contains authorization information for connecting to a registry. diff --git a/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go b/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go index 027db259c1..0883ee0230 100644 --- a/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go +++ b/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go @@ -1,3 +1,4 @@ +//go:build !linux && !darwin && !freebsd // +build !linux,!darwin,!freebsd package homedir diff --git a/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go b/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go index 33177bdf30..9976f19af4 100644 --- a/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go +++ b/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package homedir @@ -46,7 +47,7 @@ func GetShortcutString() string { // See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html func GetRuntimeDir() (string, error) { if xdgRuntimeDir := os.Getenv("XDG_RUNTIME_DIR"); xdgRuntimeDir != "" { - return xdgRuntimeDir, nil + return filepath.EvalSymlinks(xdgRuntimeDir) } return "", errors.New("could not get XDG_RUNTIME_DIR") } @@ -62,7 +63,7 @@ func StickRuntimeDirContents(files []string) ([]string, error) { runtimeDir, err := GetRuntimeDir() if err != nil { // ignore error if runtimeDir is empty - return nil, nil + return nil, nil //nolint: nilerr } runtimeDir, err = filepath.Abs(runtimeDir) if err != nil { diff --git a/vendor/github.com/containers/storage/pkg/idtools/idtools.go b/vendor/github.com/containers/storage/pkg/idtools/idtools.go index 0abe886eb2..1e2d5bcc31 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/idtools.go +++ b/vendor/github.com/containers/storage/pkg/idtools/idtools.go @@ -2,16 +2,19 @@ package idtools import ( "bufio" + "errors" "fmt" "os" "os/user" + "runtime" "sort" "strconv" "strings" + "sync" "syscall" "github.com/containers/storage/pkg/system" - "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) // IDMap contains a single entry for user namespace range remapping. An array @@ -35,8 +38,9 @@ func (e ranges) Swap(i, j int) { e[i], e[j] = e[j], e[i] } func (e ranges) Less(i, j int) bool { return e[i].Start < e[j].Start } const ( - subuidFileName string = "/etc/subuid" - subgidFileName string = "/etc/subgid" + subuidFileName string = "/etc/subuid" + subgidFileName string = "/etc/subgid" + ContainersOverrideXattr = "user.containers.override_stat" ) // MkdirAllAs creates a directory (include any along the path) and then modifies @@ -115,7 +119,7 @@ func RawToContainer(hostID int, idMap []IDMap) (int, error) { return contID, nil } } - return -1, fmt.Errorf("Host ID %d cannot be mapped to a container ID", hostID) + return -1, fmt.Errorf("host ID %d cannot be mapped to a container ID", hostID) } // RawToHost takes an id mapping and a remapped ID, and translates the ID to @@ -135,7 +139,7 @@ func RawToHost(contID int, idMap []IDMap) (int, error) { return hostID, nil } } - return -1, fmt.Errorf("Container ID %d cannot be mapped to a host ID", contID) + return -1, fmt.Errorf("container ID %d cannot be mapped to a host ID", contID) } // IDPair is a UID and GID pair @@ -163,10 +167,10 @@ func NewIDMappings(username, groupname string) (*IDMappings, error) { return nil, err } if len(subuidRanges) == 0 { - return nil, fmt.Errorf("No subuid ranges found for user %q in %s", username, subuidFileName) + return nil, fmt.Errorf("no subuid ranges found for user %q in %s", username, subuidFileName) } if len(subgidRanges) == 0 { - return nil, fmt.Errorf("No subgid ranges found for group %q in %s", groupname, subgidFileName) + return nil, fmt.Errorf("no subgid ranges found for group %q in %s", groupname, subgidFileName) } return &IDMappings{ @@ -190,7 +194,6 @@ func (i *IDMappings) RootPair() IDPair { } // ToHost returns the host UID and GID for the container uid, gid. -// Remapping is only performed if the ids aren't already the remapped root ids func (i *IDMappings) ToHost(pair IDPair) (IDPair, error) { var err error var target IDPair @@ -204,6 +207,67 @@ func (i *IDMappings) ToHost(pair IDPair) (IDPair, error) { return target, err } +var ( + overflowUIDOnce sync.Once + overflowGIDOnce sync.Once + overflowUID int + overflowGID int +) + +// getOverflowUID returns the UID mapped to the overflow user +func getOverflowUID() int { + overflowUIDOnce.Do(func() { + // 65534 is the value on older kernels where /proc/sys/kernel/overflowuid is not present + overflowUID = 65534 + if content, err := os.ReadFile("/proc/sys/kernel/overflowuid"); err == nil { + if tmp, err := strconv.Atoi(string(content)); err == nil { + overflowUID = tmp + } + } + }) + return overflowUID +} + +// getOverflowUID returns the GID mapped to the overflow user +func getOverflowGID() int { + overflowGIDOnce.Do(func() { + // 65534 is the value on older kernels where /proc/sys/kernel/overflowgid is not present + overflowGID = 65534 + if content, err := os.ReadFile("/proc/sys/kernel/overflowgid"); err == nil { + if tmp, err := strconv.Atoi(string(content)); err == nil { + overflowGID = tmp + } + } + }) + return overflowGID +} + +// ToHost returns the host UID and GID for the container uid, gid. +// Remapping is only performed if the ids aren't already the remapped root ids +// If the mapping is not possible because the target ID is not mapped into +// the namespace, then the overflow ID is used. +func (i *IDMappings) ToHostOverflow(pair IDPair) (IDPair, error) { + var err error + target := i.RootPair() + + if pair.UID != target.UID { + target.UID, err = RawToHost(pair.UID, i.uids) + if err != nil { + target.UID = getOverflowUID() + logrus.Debugf("Failed to map UID %v to the target mapping, using the overflow ID %v", pair.UID, target.UID) + } + } + + if pair.GID != target.GID { + target.GID, err = RawToHost(pair.GID, i.gids) + if err != nil { + target.GID = getOverflowGID() + logrus.Debugf("Failed to map GID %v to the target mapping, using the overflow ID %v", pair.GID, target.GID) + } + } + return target, nil +} + // ToContainer returns the container UID and GID for the host uid and gid func (i *IDMappings) ToContainer(pair IDPair) (int, int, error) { uid, err := RawToContainer(pair.UID, i.uids) @@ -278,16 +342,16 @@ func parseSubidFile(path, username string) (ranges, error) { } parts := strings.Split(text, ":") if len(parts) != 3 { - return rangeList, fmt.Errorf("Cannot parse subuid/gid information: Format not correct for %s file", path) + return rangeList, fmt.Errorf("cannot parse subuid/gid information: Format not correct for %s file", path) } if parts[0] == username || username == "ALL" || (parts[0] == uidstr && parts[0] != "") { startid, err := strconv.Atoi(parts[1]) if err != nil { - return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) + return rangeList, fmt.Errorf("string to int conversion failed during subuid/gid parsing of %s: %w", path, err) } length, err := strconv.Atoi(parts[2]) if err != nil { - return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) + return rangeList, fmt.Errorf("string to int conversion failed during subuid/gid parsing of %s: %w", path, err) } rangeList = append(rangeList, subIDRange{startid, length}) } @@ -296,13 +360,33 @@ func parseSubidFile(path, username string) (ranges, error) { } func checkChownErr(err error, name string, uid, gid int) error { - if e, ok := err.(*os.PathError); ok && e.Err == syscall.EINVAL { - return errors.Wrapf(err, "potentially insufficient UIDs or GIDs available in user namespace (requested %d:%d for %s): Check /etc/subuid and /etc/subgid if configured locally", uid, gid, name) + var e *os.PathError + if errors.As(err, &e) && e.Err == syscall.EINVAL { + return fmt.Errorf(`potentially insufficient UIDs or GIDs available in user namespace (requested %d:%d for %s): Check /etc/subuid and /etc/subgid if configured locally and run "podman system migrate": %w`, uid, gid, name, err) } return err } func SafeChown(name string, uid, gid int) error { + if runtime.GOOS == "darwin" { + var mode uint64 = 0o0700 + xstat, err := system.Lgetxattr(name, ContainersOverrideXattr) + if err == nil { + attrs := strings.Split(string(xstat), ":") + if len(attrs) == 3 { + val, err := strconv.ParseUint(attrs[2], 8, 32) + if err == nil { + mode = val + } + } + } + value := fmt.Sprintf("%d:%d:0%o", uid, gid, mode) + if err = system.Lsetxattr(name, ContainersOverrideXattr, []byte(value), 0); err != nil { + return err + } + uid = os.Getuid() + gid = os.Getgid() + } if stat, statErr := system.Stat(name); statErr == nil { if stat.UID() == uint32(uid) && stat.GID() == uint32(gid) { return nil @@ -312,6 +396,25 @@ func SafeChown(name string, uid, gid int) error { } func SafeLchown(name string, uid, gid int) error { + if runtime.GOOS == "darwin" { + var mode uint64 = 0o0700 + xstat, err := system.Lgetxattr(name, ContainersOverrideXattr) + if err == nil { + attrs := strings.Split(string(xstat), ":") + if len(attrs) == 3 { + val, err := strconv.ParseUint(attrs[2], 8, 32) + if err == nil { + mode = val + } + } + } + value := fmt.Sprintf("%d:%d:0%o", uid, gid, mode) + if err = system.Lsetxattr(name, ContainersOverrideXattr, []byte(value), 0); err != nil { + return err + } + uid = os.Getuid() + gid = os.Getgid() + } if stat, statErr := system.Lstat(name); statErr == nil { if stat.UID() == uint32(uid) && stat.GID() == uint32(gid) { return nil diff --git a/vendor/github.com/containers/storage/pkg/idtools/idtools_supported.go b/vendor/github.com/containers/storage/pkg/idtools/idtools_supported.go index 6e6e3b22bc..03e7873763 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/idtools_supported.go +++ b/vendor/github.com/containers/storage/pkg/idtools/idtools_supported.go @@ -1,11 +1,12 @@ +//go:build linux && cgo && libsubid // +build linux,cgo,libsubid package idtools import ( + "errors" + "os/user" "unsafe" - - "github.com/pkg/errors" ) /* @@ -32,19 +33,34 @@ import "C" func readSubid(username string, isUser bool) (ranges, error) { var ret ranges + uidstr := "" + if username == "ALL" { return nil, errors.New("username ALL not supported") } + if u, err := user.Lookup(username); err == nil { + uidstr = u.Uid + } + cUsername := C.CString(username) defer C.free(unsafe.Pointer(cUsername)) + cuidstr := C.CString(uidstr) + defer C.free(unsafe.Pointer(cuidstr)) + var nRanges C.int var cRanges *C.struct_subid_range if isUser { nRanges = C.subid_get_uid_ranges(cUsername, &cRanges) + if nRanges <= 0 { + nRanges = C.subid_get_uid_ranges(cuidstr, &cRanges) + } } else { nRanges = C.subid_get_gid_ranges(cUsername, &cRanges) + if nRanges <= 0 { + nRanges = C.subid_get_gid_ranges(cuidstr, &cRanges) + } } if nRanges < 0 { return nil, errors.New("cannot read subids") diff --git a/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go b/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go index 7f270c61f8..4701dc5acc 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go +++ b/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package idtools @@ -90,13 +91,13 @@ func CanAccess(path string, pair IDPair) bool { } func accessible(isOwner, isGroup bool, perms os.FileMode) bool { - if isOwner && (perms&0100 == 0100) { + if isOwner && (perms&0o100 == 0o100) { return true } - if isGroup && (perms&0010 == 0010) { + if isGroup && (perms&0o010 == 0o010) { return true } - if perms&0001 == 0001 { + if perms&0o001 == 0o001 { return true } return false diff --git a/vendor/github.com/containers/storage/pkg/idtools/idtools_unsupported.go b/vendor/github.com/containers/storage/pkg/idtools/idtools_unsupported.go index 84da1b764b..78141fb859 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/idtools_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/idtools/idtools_unsupported.go @@ -1,3 +1,4 @@ +//go:build !linux || !libsubid || !cgo // +build !linux !libsubid !cgo package idtools diff --git a/vendor/github.com/containers/storage/pkg/idtools/idtools_windows.go b/vendor/github.com/containers/storage/pkg/idtools/idtools_windows.go index 16be94f446..dc69c60764 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/idtools_windows.go +++ b/vendor/github.com/containers/storage/pkg/idtools/idtools_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package idtools diff --git a/vendor/github.com/containers/storage/pkg/idtools/parser.go b/vendor/github.com/containers/storage/pkg/idtools/parser.go index 1c819a1f97..042d0ea957 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/parser.go +++ b/vendor/github.com/containers/storage/pkg/idtools/parser.go @@ -11,22 +11,22 @@ import ( func parseTriple(spec []string) (container, host, size uint32, err error) { cid, err := strconv.ParseUint(spec[0], 10, 32) if err != nil { - return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[0], err) + return 0, 0, 0, fmt.Errorf("parsing id map value %q: %w", spec[0], err) } hid, err := strconv.ParseUint(spec[1], 10, 32) if err != nil { - return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[1], err) + return 0, 0, 0, fmt.Errorf("parsing id map value %q: %w", spec[1], err) } sz, err := strconv.ParseUint(spec[2], 10, 32) if err != nil { - return 0, 0, 0, fmt.Errorf("error parsing id map value %q: %v", spec[2], err) + return 0, 0, 0, fmt.Errorf("parsing id map value %q: %w", spec[2], err) } return uint32(cid), uint32(hid), uint32(sz), nil } // ParseIDMap parses idmap triples from string. func ParseIDMap(mapSpec []string, mapSetting string) (idmap []IDMap, err error) { - stdErr := fmt.Errorf("error initializing ID mappings: %s setting is malformed expected [\"uint32:uint32:uint32\"]: %q", mapSetting, mapSpec) + stdErr := fmt.Errorf("initializing ID mappings: %s setting is malformed expected [\"uint32:uint32:uint32\"]: %q", mapSetting, mapSpec) for _, idMapSpec := range mapSpec { if idMapSpec == "" { continue diff --git a/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_linux.go b/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_linux.go index 3dd7bf2105..ac27718de2 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_linux.go +++ b/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_linux.go @@ -2,11 +2,12 @@ package idtools import ( "fmt" - "regexp" "sort" "strconv" "strings" "sync" + + "github.com/containers/storage/pkg/regexp" ) // add a user and/or group to Linux /etc/passwd, /etc/group using standard @@ -24,7 +25,7 @@ var ( "usermod": "-%s %d-%d %s", } - idOutRegexp = regexp.MustCompile(`uid=([0-9]+).*gid=([0-9]+)`) + idOutRegexp = regexp.Delayed(`uid=([0-9]+).*gid=([0-9]+)`) // default length for a UID/GID subordinate range defaultRangeLen = 65536 defaultRangeStart = 100000 @@ -37,32 +38,32 @@ var ( // mapping ranges in containers. func AddNamespaceRangesUser(name string) (int, int, error) { if err := addUser(name); err != nil { - return -1, -1, fmt.Errorf("Error adding user %q: %v", name, err) + return -1, -1, fmt.Errorf("adding user %q: %w", name, err) } // Query the system for the created uid and gid pair out, err := execCmd("id", name) if err != nil { - return -1, -1, fmt.Errorf("Error trying to find uid/gid for new user %q: %v", name, err) + return -1, -1, fmt.Errorf("trying to find uid/gid for new user %q: %w", name, err) } matches := idOutRegexp.FindStringSubmatch(strings.TrimSpace(string(out))) if len(matches) != 3 { - return -1, -1, fmt.Errorf("Can't find uid, gid from `id` output: %q", string(out)) + return -1, -1, fmt.Errorf("can't find uid, gid from `id` output: %q", string(out)) } uid, err := strconv.Atoi(matches[1]) if err != nil { - return -1, -1, fmt.Errorf("Can't convert found uid (%s) to int: %v", matches[1], err) + return -1, -1, fmt.Errorf("can't convert found uid (%s) to int: %w", matches[1], err) } gid, err := strconv.Atoi(matches[2]) if err != nil { - return -1, -1, fmt.Errorf("Can't convert found gid (%s) to int: %v", matches[2], err) + return -1, -1, fmt.Errorf("can't convert found gid (%s) to int: %w", matches[2], err) } // Now we need to create the subuid/subgid ranges for our new user/group (system users // do not get auto-created ranges in subuid/subgid) if err := createSubordinateRanges(name); err != nil { - return -1, -1, fmt.Errorf("Couldn't create subordinate ID ranges: %v", err) + return -1, -1, fmt.Errorf("couldn't create subordinate ID ranges: %w", err) } return uid, gid, nil } @@ -77,49 +78,48 @@ func addUser(userName string) error { } }) if userCommand == "" { - return fmt.Errorf("Cannot add user; no useradd/adduser binary found") + return fmt.Errorf("cannot add user; no useradd/adduser binary found") } args := fmt.Sprintf(cmdTemplates[userCommand], userName) out, err := execCmd(userCommand, args) if err != nil { - return fmt.Errorf("Failed to add user with error: %v; output: %q", err, string(out)) + return fmt.Errorf("failed to add user with error: %w; output: %q", err, string(out)) } return nil } func createSubordinateRanges(name string) error { - // first, we should verify that ranges weren't automatically created // by the distro tooling ranges, err := readSubuid(name) if err != nil { - return fmt.Errorf("Error while looking for subuid ranges for user %q: %v", name, err) + return fmt.Errorf("while looking for subuid ranges for user %q: %w", name, err) } if len(ranges) == 0 { // no UID ranges; let's create one startID, err := findNextUIDRange() if err != nil { - return fmt.Errorf("Can't find available subuid range: %v", err) + return fmt.Errorf("can't find available subuid range: %w", err) } out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "v", startID, startID+defaultRangeLen-1, name)) if err != nil { - return fmt.Errorf("Unable to add subuid range to user: %q; output: %s, err: %v", name, out, err) + return fmt.Errorf("unable to add subuid range to user: %q; output: %s, err: %w", name, out, err) } } ranges, err = readSubgid(name) if err != nil { - return fmt.Errorf("Error while looking for subgid ranges for user %q: %v", name, err) + return fmt.Errorf("while looking for subgid ranges for user %q: %w", name, err) } if len(ranges) == 0 { // no GID ranges; let's create one startID, err := findNextGIDRange() if err != nil { - return fmt.Errorf("Can't find available subgid range: %v", err) + return fmt.Errorf("can't find available subgid range: %w", err) } out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "w", startID, startID+defaultRangeLen-1, name)) if err != nil { - return fmt.Errorf("Unable to add subgid range to user: %q; output: %s, err: %v", name, out, err) + return fmt.Errorf("unable to add subgid range to user: %q; output: %s, err: %w", name, out, err) } } return nil @@ -128,7 +128,7 @@ func createSubordinateRanges(name string) error { func findNextUIDRange() (int, error) { ranges, err := readSubuid("ALL") if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subuid file: %v", err) + return -1, fmt.Errorf("couldn't parse all ranges in /etc/subuid file: %w", err) } sort.Sort(ranges) return findNextRangeStart(ranges) @@ -137,7 +137,7 @@ func findNextUIDRange() (int, error) { func findNextGIDRange() (int, error) { ranges, err := readSubgid("ALL") if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subgid file: %v", err) + return -1, fmt.Errorf("couldn't parse all ranges in /etc/subgid file: %w", err) } sort.Sort(ranges) return findNextRangeStart(ranges) diff --git a/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_unsupported.go b/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_unsupported.go index d98b354cbd..15bd98edef 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/idtools/usergroupadd_unsupported.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux package idtools @@ -8,5 +9,5 @@ import "fmt" // and calls the appropriate helper function to add the group and then // the user to the group in /etc/group and /etc/passwd respectively. func AddNamespaceRangesUser(name string) (int, int, error) { - return -1, -1, fmt.Errorf("No support for adding users or groups on this OS") + return -1, -1, fmt.Errorf("no support for adding users or groups on this OS") } diff --git a/vendor/github.com/containers/storage/pkg/idtools/utils_unix.go b/vendor/github.com/containers/storage/pkg/idtools/utils_unix.go index 9703ecbd9d..b3772bdb3d 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/utils_unix.go +++ b/vendor/github.com/containers/storage/pkg/idtools/utils_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package idtools @@ -18,12 +19,12 @@ func resolveBinary(binname string) (string, error) { if err != nil { return "", err } - //only return no error if the final resolved binary basename - //matches what was searched for + // only return no error if the final resolved binary basename + // matches what was searched for if filepath.Base(resolvedPath) == binname { return resolvedPath, nil } - return "", fmt.Errorf("Binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) + return "", fmt.Errorf("binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) } func execCmd(cmd, args string) ([]byte, error) { diff --git a/vendor/github.com/containers/storage/pkg/ioutils/buffer.go b/vendor/github.com/containers/storage/pkg/ioutils/buffer.go new file mode 100644 index 0000000000..3d737b3e19 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/buffer.go @@ -0,0 +1,51 @@ +package ioutils + +import ( + "errors" + "io" +) + +var errBufferFull = errors.New("buffer is full") + +type fixedBuffer struct { + buf []byte + pos int + lastRead int +} + +func (b *fixedBuffer) Write(p []byte) (int, error) { + n := copy(b.buf[b.pos:cap(b.buf)], p) + b.pos += n + + if n < len(p) { + if b.pos == cap(b.buf) { + return n, errBufferFull + } + return n, io.ErrShortWrite + } + return n, nil +} + +func (b *fixedBuffer) Read(p []byte) (int, error) { + n := copy(p, b.buf[b.lastRead:b.pos]) + b.lastRead += n + return n, nil +} + +func (b *fixedBuffer) Len() int { + return b.pos - b.lastRead +} + +func (b *fixedBuffer) Cap() int { + return cap(b.buf) +} + +func (b *fixedBuffer) Reset() { + b.pos = 0 + b.lastRead = 0 + b.buf = b.buf[:0] +} + +func (b *fixedBuffer) String() string { + return string(b.buf[b.lastRead:b.pos]) +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/bytespipe.go b/vendor/github.com/containers/storage/pkg/ioutils/bytespipe.go new file mode 100644 index 0000000000..72a04f3491 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/bytespipe.go @@ -0,0 +1,186 @@ +package ioutils + +import ( + "errors" + "io" + "sync" +) + +// maxCap is the highest capacity to use in byte slices that buffer data. +const maxCap = 1e6 + +// minCap is the lowest capacity to use in byte slices that buffer data +const minCap = 64 + +// blockThreshold is the minimum number of bytes in the buffer which will cause +// a write to BytesPipe to block when allocating a new slice. +const blockThreshold = 1e6 + +var ( + // ErrClosed is returned when Write is called on a closed BytesPipe. + ErrClosed = errors.New("write to closed BytesPipe") + + bufPools = make(map[int]*sync.Pool) + bufPoolsLock sync.Mutex +) + +// BytesPipe is io.ReadWriteCloser which works similarly to pipe(queue). +// All written data may be read at most once. Also, BytesPipe allocates +// and releases new byte slices to adjust to current needs, so the buffer +// won't be overgrown after peak loads. +type BytesPipe struct { + mu sync.Mutex + wait *sync.Cond + buf []*fixedBuffer + bufLen int + closeErr error // error to return from next Read. set to nil if not closed. +} + +// NewBytesPipe creates new BytesPipe, initialized by specified slice. +// If buf is nil, then it will be initialized with slice which cap is 64. +// buf will be adjusted in a way that len(buf) == 0, cap(buf) == cap(buf). +func NewBytesPipe() *BytesPipe { + bp := &BytesPipe{} + bp.buf = append(bp.buf, getBuffer(minCap)) + bp.wait = sync.NewCond(&bp.mu) + return bp +} + +// Write writes p to BytesPipe. +// It can allocate new []byte slices in a process of writing. +func (bp *BytesPipe) Write(p []byte) (int, error) { + bp.mu.Lock() + + written := 0 +loop0: + for { + if bp.closeErr != nil { + bp.mu.Unlock() + return written, ErrClosed + } + + if len(bp.buf) == 0 { + bp.buf = append(bp.buf, getBuffer(64)) + } + // get the last buffer + b := bp.buf[len(bp.buf)-1] + + n, err := b.Write(p) + written += n + bp.bufLen += n + + // errBufferFull is an error we expect to get if the buffer is full + if err != nil && err != errBufferFull { + bp.wait.Broadcast() + bp.mu.Unlock() + return written, err + } + + // if there was enough room to write all then break + if len(p) == n { + break + } + + // more data: write to the next slice + p = p[n:] + + // make sure the buffer doesn't grow too big from this write + for bp.bufLen >= blockThreshold { + bp.wait.Wait() + if bp.closeErr != nil { + continue loop0 + } + } + + // add new byte slice to the buffers slice and continue writing + nextCap := b.Cap() * 2 + if nextCap > maxCap { + nextCap = maxCap + } + bp.buf = append(bp.buf, getBuffer(nextCap)) + } + bp.wait.Broadcast() + bp.mu.Unlock() + return written, nil +} + +// CloseWithError causes further reads from a BytesPipe to return immediately. +func (bp *BytesPipe) CloseWithError(err error) error { + bp.mu.Lock() + if err != nil { + bp.closeErr = err + } else { + bp.closeErr = io.EOF + } + bp.wait.Broadcast() + bp.mu.Unlock() + return nil +} + +// Close causes further reads from a BytesPipe to return immediately. +func (bp *BytesPipe) Close() error { + return bp.CloseWithError(nil) +} + +// Read reads bytes from BytesPipe. +// Data could be read only once. +func (bp *BytesPipe) Read(p []byte) (n int, err error) { + bp.mu.Lock() + if bp.bufLen == 0 { + if bp.closeErr != nil { + bp.mu.Unlock() + return 0, bp.closeErr + } + bp.wait.Wait() + if bp.bufLen == 0 && bp.closeErr != nil { + err := bp.closeErr + bp.mu.Unlock() + return 0, err + } + } + + for bp.bufLen > 0 { + b := bp.buf[0] + read, _ := b.Read(p) // ignore error since fixedBuffer doesn't really return an error + n += read + bp.bufLen -= read + + if b.Len() == 0 { + // it's empty so return it to the pool and move to the next one + returnBuffer(b) + bp.buf[0] = nil + bp.buf = bp.buf[1:] + } + + if len(p) == read { + break + } + + p = p[read:] + } + + bp.wait.Broadcast() + bp.mu.Unlock() + return +} + +func returnBuffer(b *fixedBuffer) { + b.Reset() + bufPoolsLock.Lock() + pool := bufPools[b.Cap()] + bufPoolsLock.Unlock() + if pool != nil { + pool.Put(b) + } +} + +func getBuffer(size int) *fixedBuffer { + bufPoolsLock.Lock() + pool, ok := bufPools[size] + if !ok { + pool = &sync.Pool{New: func() interface{} { return &fixedBuffer{buf: make([]byte, 0, size)} }} + bufPools[size] = pool + } + bufPoolsLock.Unlock() + return pool.Get().(*fixedBuffer) +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/fswriters.go b/vendor/github.com/containers/storage/pkg/ioutils/fswriters.go new file mode 100644 index 0000000000..2a8c85ad44 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/fswriters.go @@ -0,0 +1,281 @@ +package ioutils + +import ( + "io" + "os" + "path/filepath" + "time" +) + +// AtomicFileWriterOptions specifies options for creating the atomic file writer. +type AtomicFileWriterOptions struct { + // NoSync specifies whether the sync call must be skipped for the file. + // If NoSync is not specified, the file is synced to the + // storage after it has been written and before it is moved to + // the specified path. + NoSync bool + // On successful return from Close() this is set to the mtime of the + // newly written file. + ModTime time.Time + // Specifies whether Commit() must be explicitly called to write state + // to the destination. This allows an application to preserve the original + // file when an error occurs during processing (and not just during write) + // The default is false, which will auto-commit on Close + ExplicitCommit bool +} + +type CommittableWriter interface { + io.WriteCloser + + // Commit closes the temporary file associated with this writer, and + // provided no errors (during commit or previously during write operations), + // will publish the completed file under the intended destination. + Commit() error +} + +var defaultWriterOptions = AtomicFileWriterOptions{} + +// SetDefaultOptions overrides the default options used when creating an +// atomic file writer. +func SetDefaultOptions(opts AtomicFileWriterOptions) { + defaultWriterOptions = opts +} + +// NewAtomicFileWriterWithOpts returns a CommittableWriter so that writing to it +// writes to a temporary file, which can later be committed to a destination path, +// either by Closing in the case of auto-commit, or manually calling commit if the +// ExplicitCommit option is enabled. Writing and closing concurrently is not +// allowed. +func NewAtomicFileWriterWithOpts(filename string, perm os.FileMode, opts *AtomicFileWriterOptions) (CommittableWriter, error) { + return newAtomicFileWriter(filename, perm, opts) +} + +// newAtomicFileWriter returns a CommittableWriter so that writing to it writes to +// a temporary file, which can later be committed to a destination path, either by +// Closing in the case of auto-commit, or manually calling commit if the +// ExplicitCommit option is enabled. Writing and closing concurrently is not allowed. +func newAtomicFileWriter(filename string, perm os.FileMode, opts *AtomicFileWriterOptions) (*atomicFileWriter, error) { + f, err := os.CreateTemp(filepath.Dir(filename), ".tmp-"+filepath.Base(filename)) + if err != nil { + return nil, err + } + if opts == nil { + opts = &defaultWriterOptions + } + abspath, err := filepath.Abs(filename) + if err != nil { + return nil, err + } + return &atomicFileWriter{ + f: f, + fn: abspath, + perm: perm, + noSync: opts.NoSync, + explicitCommit: opts.ExplicitCommit, + }, nil +} + +// NewAtomicFileWriterWithOpts returns a CommittableWriter, with auto-commit enabled. +// Writing to it writes to a temporary file and closing it atomically changes the +// temporary file to destination path. Writing and closing concurrently is not allowed. +func NewAtomicFileWriter(filename string, perm os.FileMode) (CommittableWriter, error) { + return NewAtomicFileWriterWithOpts(filename, perm, nil) +} + +// AtomicWriteFile atomically writes data to a file named by filename. +func AtomicWriteFileWithOpts(filename string, data []byte, perm os.FileMode, opts *AtomicFileWriterOptions) error { + f, err := newAtomicFileWriter(filename, perm, opts) + if err != nil { + return err + } + n, err := f.Write(data) + if err == nil && n < len(data) { + err = io.ErrShortWrite + f.writeErr = err + } + if err1 := f.Close(); err == nil { + err = err1 + } + + if opts != nil { + opts.ModTime = f.modTime + } + + return err +} + +func AtomicWriteFile(filename string, data []byte, perm os.FileMode) error { + return AtomicWriteFileWithOpts(filename, data, perm, nil) +} + +type atomicFileWriter struct { + f *os.File + fn string + writeErr error + perm os.FileMode + noSync bool + modTime time.Time + closed bool + explicitCommit bool +} + +func (w *atomicFileWriter) Write(dt []byte) (int, error) { + n, err := w.f.Write(dt) + if err != nil { + w.writeErr = err + } + return n, err +} + +func (w *atomicFileWriter) closeTempFile() error { + if w.closed { + return nil + } + + w.closed = true + return w.f.Close() +} + +func (w *atomicFileWriter) Close() error { + return w.complete(!w.explicitCommit) +} + +func (w *atomicFileWriter) Commit() error { + return w.complete(true) +} + +func (w *atomicFileWriter) complete(commit bool) (retErr error) { + if w == nil || w.closed { + return nil + } + + defer func() { + w.closeTempFile() + if retErr != nil || w.writeErr != nil { + os.Remove(w.f.Name()) + } + }() + + if commit { + return w.commitState() + } + + return nil +} + +func (w *atomicFileWriter) commitState() error { + // Perform a data only sync (fdatasync()) if supported + if err := w.postDataWrittenSync(); err != nil { + return err + } + + // Capture fstat before closing the fd + info, err := w.f.Stat() + if err != nil { + return err + } + w.modTime = info.ModTime() + + if err := w.f.Chmod(w.perm); err != nil { + return err + } + + // Perform full sync on platforms that need it + if err := w.preRenameSync(); err != nil { + return err + } + + // Some platforms require closing before rename (Windows) + if err := w.closeTempFile(); err != nil { + return err + } + + if w.writeErr == nil { + return os.Rename(w.f.Name(), w.fn) + } + + return nil +} + +// AtomicWriteSet is used to atomically write a set +// of files and ensure they are visible at the same time. +// Must be committed to a new directory. +type AtomicWriteSet struct { + root string +} + +// NewAtomicWriteSet creates a new atomic write set to +// atomically create a set of files. The given directory +// is used as the base directory for storing files before +// commit. If no temporary directory is given the system +// default is used. +func NewAtomicWriteSet(tmpDir string) (*AtomicWriteSet, error) { + td, err := os.MkdirTemp(tmpDir, "write-set-") + if err != nil { + return nil, err + } + + return &AtomicWriteSet{ + root: td, + }, nil +} + +// WriteFile writes a file to the set, guaranteeing the file +// has been synced. +func (ws *AtomicWriteSet) WriteFile(filename string, data []byte, perm os.FileMode) error { + f, err := ws.FileWriter(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) + if err != nil { + return err + } + n, err := f.Write(data) + if err == nil && n < len(data) { + err = io.ErrShortWrite + } + if err1 := f.Close(); err == nil { + err = err1 + } + return err +} + +type syncFileCloser struct { + *os.File +} + +func (w syncFileCloser) Close() error { + if !defaultWriterOptions.NoSync { + return w.File.Close() + } + err := dataOrFullSync(w.File) + if err1 := w.File.Close(); err == nil { + err = err1 + } + return err +} + +// FileWriter opens a file writer inside the set. The file +// should be synced and closed before calling commit. +func (ws *AtomicWriteSet) FileWriter(name string, flag int, perm os.FileMode) (io.WriteCloser, error) { + f, err := os.OpenFile(filepath.Join(ws.root, name), flag, perm) + if err != nil { + return nil, err + } + return syncFileCloser{f}, nil +} + +// Cancel cancels the set and removes all temporary data +// created in the set. +func (ws *AtomicWriteSet) Cancel() error { + return os.RemoveAll(ws.root) +} + +// Commit moves all created files to the target directory. The +// target directory must not exist and the parent of the target +// directory must exist. +func (ws *AtomicWriteSet) Commit(target string) error { + return os.Rename(ws.root, target) +} + +// String returns the location the set is writing to. +func (ws *AtomicWriteSet) String() string { + return ws.root +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/fswriters_linux.go b/vendor/github.com/containers/storage/pkg/ioutils/fswriters_linux.go new file mode 100644 index 0000000000..10ed48cfd8 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/fswriters_linux.go @@ -0,0 +1,23 @@ +package ioutils + +import ( + "os" + + "golang.org/x/sys/unix" +) + +func dataOrFullSync(f *os.File) error { + return unix.Fdatasync(int(f.Fd())) +} + +func (w *atomicFileWriter) postDataWrittenSync() error { + if w.noSync { + return nil + } + return unix.Fdatasync(int(w.f.Fd())) +} + +func (w *atomicFileWriter) preRenameSync() error { + // On Linux data can be reliably flushed to media without metadata, so defer + return nil +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/fswriters_other.go b/vendor/github.com/containers/storage/pkg/ioutils/fswriters_other.go new file mode 100644 index 0000000000..aec161e0f2 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/fswriters_other.go @@ -0,0 +1,26 @@ +//go:build !linux +// +build !linux + +package ioutils + +import ( + "os" +) + +func dataOrFullSync(f *os.File) error { + return f.Sync() +} + +func (w *atomicFileWriter) postDataWrittenSync() error { + // many platforms (Mac, Windows) require a full sync to reliably flush to media + return nil +} + +func (w *atomicFileWriter) preRenameSync() error { + if w.noSync { + return nil + } + + // fsync() on Non-linux Unix, FlushFileBuffers (Windows), F_FULLFSYNC (Mac) + return w.f.Sync() +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/readers.go b/vendor/github.com/containers/storage/pkg/ioutils/readers.go new file mode 100644 index 0000000000..146e1a5ff0 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/readers.go @@ -0,0 +1,170 @@ +package ioutils + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "io" +) + +type readCloserWrapper struct { + io.Reader + closer func() error +} + +func (r *readCloserWrapper) Close() error { + return r.closer() +} + +type readWriteToCloserWrapper struct { + io.Reader + io.WriterTo + closer func() error +} + +func (r *readWriteToCloserWrapper) Close() error { + return r.closer() +} + +// NewReadCloserWrapper returns a new io.ReadCloser. +func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser { + if wt, ok := r.(io.WriterTo); ok { + return &readWriteToCloserWrapper{ + Reader: r, + WriterTo: wt, + closer: closer, + } + } + return &readCloserWrapper{ + Reader: r, + closer: closer, + } +} + +type readerErrWrapper struct { + reader io.Reader + closer func() +} + +func (r *readerErrWrapper) Read(p []byte) (int, error) { + n, err := r.reader.Read(p) + if err != nil { + r.closer() + } + return n, err +} + +// NewReaderErrWrapper returns a new io.Reader. +func NewReaderErrWrapper(r io.Reader, closer func()) io.Reader { + return &readerErrWrapper{ + reader: r, + closer: closer, + } +} + +// HashData returns the sha256 sum of src. +func HashData(src io.Reader) (string, error) { + h := sha256.New() + if _, err := io.Copy(h, src); err != nil { + return "", err + } + return "sha256:" + hex.EncodeToString(h.Sum(nil)), nil +} + +// OnEOFReader wraps an io.ReadCloser and a function +// the function will run at the end of file or close the file. +type OnEOFReader struct { + Rc io.ReadCloser + Fn func() +} + +func (r *OnEOFReader) Read(p []byte) (n int, err error) { + n, err = r.Rc.Read(p) + if err == io.EOF { + r.runFunc() + } + return +} + +// Close closes the file and run the function. +func (r *OnEOFReader) Close() error { + err := r.Rc.Close() + r.runFunc() + return err +} + +func (r *OnEOFReader) runFunc() { + if fn := r.Fn; fn != nil { + fn() + r.Fn = nil + } +} + +// cancelReadCloser wraps an io.ReadCloser with a context for cancelling read +// operations. +type cancelReadCloser struct { + cancel func() + pR *io.PipeReader // Stream to read from + pW *io.PipeWriter +} + +// NewCancelReadCloser creates a wrapper that closes the ReadCloser when the +// context is cancelled. The returned io.ReadCloser must be closed when it is +// no longer needed. +func NewCancelReadCloser(ctx context.Context, in io.ReadCloser) io.ReadCloser { + pR, pW := io.Pipe() + + // Create a context used to signal when the pipe is closed + doneCtx, cancel := context.WithCancel(context.Background()) + + p := &cancelReadCloser{ + cancel: cancel, + pR: pR, + pW: pW, + } + + go func() { + _, err := io.Copy(pW, in) + select { + case <-ctx.Done(): + // If the context was closed, p.closeWithError + // was already called. Calling it again would + // change the error that Read returns. + default: + p.closeWithError(err) + } + in.Close() + }() + go func() { + for { + select { + case <-ctx.Done(): + p.closeWithError(ctx.Err()) + case <-doneCtx.Done(): + return + } + } + }() + + return p +} + +// Read wraps the Read method of the pipe that provides data from the wrapped +// ReadCloser. +func (p *cancelReadCloser) Read(buf []byte) (n int, err error) { + return p.pR.Read(buf) +} + +// closeWithError closes the wrapper and its underlying reader. It will +// cause future calls to Read to return err. +func (p *cancelReadCloser) closeWithError(err error) { + p.pW.CloseWithError(err) + p.cancel() +} + +// Close closes the wrapper its underlying reader. It will cause +// future calls to Read to return io.EOF. +func (p *cancelReadCloser) Close() error { + p.closeWithError(io.EOF) + return nil +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/temp_unix.go b/vendor/github.com/containers/storage/pkg/ioutils/temp_unix.go new file mode 100644 index 0000000000..9d5af610e0 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/temp_unix.go @@ -0,0 +1,11 @@ +//go:build !windows +// +build !windows + +package ioutils + +import "os" + +// TempDir on Unix systems is equivalent to os.MkdirTemp. +func TempDir(dir, prefix string) (string, error) { + return os.MkdirTemp(dir, prefix) +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/temp_windows.go b/vendor/github.com/containers/storage/pkg/ioutils/temp_windows.go new file mode 100644 index 0000000000..2c2242d69d --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/temp_windows.go @@ -0,0 +1,19 @@ +//go:build windows +// +build windows + +package ioutils + +import ( + "os" + + "github.com/containers/storage/pkg/longpath" +) + +// TempDir is the equivalent of os.MkdirTemp, except that the result is in Windows longpath format. +func TempDir(dir, prefix string) (string, error) { + tempDir, err := os.MkdirTemp(dir, prefix) + if err != nil { + return "", err + } + return longpath.AddPrefix(tempDir), nil +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/writeflusher.go b/vendor/github.com/containers/storage/pkg/ioutils/writeflusher.go new file mode 100644 index 0000000000..52a4901ade --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/writeflusher.go @@ -0,0 +1,92 @@ +package ioutils + +import ( + "io" + "sync" +) + +// WriteFlusher wraps the Write and Flush operation ensuring that every write +// is a flush. In addition, the Close method can be called to intercept +// Read/Write calls if the targets lifecycle has already ended. +type WriteFlusher struct { + w io.Writer + flusher flusher + flushed chan struct{} + flushedOnce sync.Once + closed chan struct{} + closeLock sync.Mutex +} + +type flusher interface { + Flush() +} + +var errWriteFlusherClosed = io.EOF + +func (wf *WriteFlusher) Write(b []byte) (n int, err error) { + select { + case <-wf.closed: + return 0, errWriteFlusherClosed + default: + } + + n, err = wf.w.Write(b) + wf.Flush() // every write is a flush. + return n, err +} + +// Flush the stream immediately. +func (wf *WriteFlusher) Flush() { + select { + case <-wf.closed: + return + default: + } + + wf.flushedOnce.Do(func() { + close(wf.flushed) + }) + wf.flusher.Flush() +} + +// Flushed returns the state of flushed. +// If it's flushed, return true, or else it return false. +func (wf *WriteFlusher) Flushed() bool { + // BUG(stevvooe): Remove this method. Its use is inherently racy. Seems to + // be used to detect whether or a response code has been issued or not. + // Another hook should be used instead. + var flushed bool + select { + case <-wf.flushed: + flushed = true + default: + } + return flushed +} + +// Close closes the write flusher, disallowing any further writes to the +// target. After the flusher is closed, all calls to write or flush will +// result in an error. +func (wf *WriteFlusher) Close() error { + wf.closeLock.Lock() + defer wf.closeLock.Unlock() + + select { + case <-wf.closed: + return errWriteFlusherClosed + default: + close(wf.closed) + } + return nil +} + +// NewWriteFlusher returns a new WriteFlusher. +func NewWriteFlusher(w io.Writer) *WriteFlusher { + var fl flusher + if f, ok := w.(flusher); ok { + fl = f + } else { + fl = &NopFlusher{} + } + return &WriteFlusher{w: w, flusher: fl, closed: make(chan struct{}), flushed: make(chan struct{})} +} diff --git a/vendor/github.com/containers/storage/pkg/ioutils/writers.go b/vendor/github.com/containers/storage/pkg/ioutils/writers.go new file mode 100644 index 0000000000..ccc7f9c23e --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/ioutils/writers.go @@ -0,0 +1,66 @@ +package ioutils + +import "io" + +// NopWriter represents a type which write operation is nop. +type NopWriter struct{} + +func (*NopWriter) Write(buf []byte) (int, error) { + return len(buf), nil +} + +type nopWriteCloser struct { + io.Writer +} + +func (w *nopWriteCloser) Close() error { return nil } + +// NopWriteCloser returns a nopWriteCloser. +func NopWriteCloser(w io.Writer) io.WriteCloser { + return &nopWriteCloser{w} +} + +// NopFlusher represents a type which flush operation is nop. +type NopFlusher struct{} + +// Flush is a nop operation. +func (f *NopFlusher) Flush() {} + +type writeCloserWrapper struct { + io.Writer + closer func() error +} + +func (r *writeCloserWrapper) Close() error { + return r.closer() +} + +// NewWriteCloserWrapper returns a new io.WriteCloser. +func NewWriteCloserWrapper(r io.Writer, closer func() error) io.WriteCloser { + return &writeCloserWrapper{ + Writer: r, + closer: closer, + } +} + +// WriteCounter wraps a concrete io.Writer and hold a count of the number +// of bytes written to the writer during a "session". +// This can be convenient when write return is masked +// (e.g., json.Encoder.Encode()) +type WriteCounter struct { + Count int64 + Writer io.Writer +} + +// NewWriteCounter returns a new WriteCounter. +func NewWriteCounter(w io.Writer) *WriteCounter { + return &WriteCounter{ + Writer: w, + } +} + +func (wc *WriteCounter) Write(p []byte) (count int, err error) { + count, err = wc.Writer.Write(p) + wc.Count += int64(count) + return +} diff --git a/vendor/github.com/containers/storage/pkg/lockfile/lockfile.go b/vendor/github.com/containers/storage/pkg/lockfile/lockfile.go index 6a00141c3d..ec25f8a9cf 100644 --- a/vendor/github.com/containers/storage/pkg/lockfile/lockfile.go +++ b/vendor/github.com/containers/storage/pkg/lockfile/lockfile.go @@ -1,16 +1,17 @@ package lockfile import ( + "fmt" "path/filepath" "sync" "time" - - "github.com/pkg/errors" ) // A Locker represents a file lock where the file is used to cache an // identifier of the last party that made changes to whatever's being protected // by the lock. +// +// Deprecated: Refer directly to *LockFile, the provided implementation, instead. type Locker interface { // Acquire a writer lock. // The default unix implementation panics if: @@ -18,10 +19,6 @@ type Locker interface { // - tried to lock a read-only lock-file Lock() - // Acquire a writer lock recursively, allowing for recursive acquisitions - // within the same process space. - RecursiveLock() - // Unlock the lock. // The default unix implementation panics if: // - unlocking an unlocked lock @@ -33,10 +30,13 @@ type Locker interface { // Touch records, for others sharing the lock, that the caller was the // last writer. It should only be called with the lock held. + // + // Deprecated: Use *LockFile.RecordWrite. Touch() error // Modified() checks if the most recent writer was a party other than the // last recorded writer. It should only be called with the lock held. + // Deprecated: Use *LockFile.ModifiedSince. Modified() (bool, error) // TouchedSince() checks if the most recent writer modified the file (likely using Touch()) after the specified time. @@ -45,63 +45,86 @@ type Locker interface { // IsReadWrite() checks if the lock file is read-write IsReadWrite() bool - // Locked() checks if lock is locked for writing by a thread in this process - Locked() bool + // AssertLocked() can be used by callers that _know_ that they hold the lock (for reading or writing), for sanity checking. + // It might do nothing at all, or it may panic if the caller is not the owner of this lock. + AssertLocked() + + // AssertLockedForWriting() can be used by callers that _know_ that they hold the lock locked for writing, for sanity checking. + // It might do nothing at all, or it may panic if the caller is not the owner of this lock for writing. + AssertLockedForWriting() } var ( - lockfiles map[string]Locker - lockfilesLock sync.Mutex + lockFiles map[string]*LockFile + lockFilesLock sync.Mutex ) +// GetLockFile opens a read-write lock file, creating it if necessary. The +// *LockFile object may already be locked if the path has already been requested +// by the current process. +func GetLockFile(path string) (*LockFile, error) { + return getLockfile(path, false) +} + // GetLockfile opens a read-write lock file, creating it if necessary. The // Locker object may already be locked if the path has already been requested // by the current process. +// +// Deprecated: Use GetLockFile func GetLockfile(path string) (Locker, error) { - return getLockfile(path, false) + return GetLockFile(path) +} + +// GetROLockFile opens a read-only lock file, creating it if necessary. The +// *LockFile object may already be locked if the path has already been requested +// by the current process. +func GetROLockFile(path string) (*LockFile, error) { + return getLockfile(path, true) } // GetROLockfile opens a read-only lock file, creating it if necessary. The // Locker object may already be locked if the path has already been requested // by the current process. +// +// Deprecated: Use GetROLockFile func GetROLockfile(path string) (Locker, error) { - return getLockfile(path, true) + return GetROLockFile(path) } -// getLockfile returns a Locker object, possibly (depending on the platform) +// getLockFile returns a *LockFile object, possibly (depending on the platform) // working inter-process, and associated with the specified path. // -// If ro, the lock is a read-write lock and the returned Locker should correspond to the +// If ro, the lock is a read-write lock and the returned *LockFile should correspond to the // “lock for reading” (shared) operation; otherwise, the lock is either an exclusive lock, -// or a read-write lock and Locker should correspond to the “lock for writing” (exclusive) operation. +// or a read-write lock and *LockFile should correspond to the “lock for writing” (exclusive) operation. // // WARNING: // - The lock may or MAY NOT be inter-process. // - There may or MAY NOT be an actual object on the filesystem created for the specified path. // - Even if ro, the lock MAY be exclusive. -func getLockfile(path string, ro bool) (Locker, error) { - lockfilesLock.Lock() - defer lockfilesLock.Unlock() - if lockfiles == nil { - lockfiles = make(map[string]Locker) +func getLockfile(path string, ro bool) (*LockFile, error) { + lockFilesLock.Lock() + defer lockFilesLock.Unlock() + if lockFiles == nil { + lockFiles = make(map[string]*LockFile) } cleanPath, err := filepath.Abs(path) if err != nil { - return nil, errors.Wrapf(err, "error ensuring that path %q is an absolute path", path) + return nil, fmt.Errorf("ensuring that path %q is an absolute path: %w", path, err) } - if locker, ok := lockfiles[cleanPath]; ok { - if ro && locker.IsReadWrite() { - return nil, errors.Errorf("lock %q is not a read-only lock", cleanPath) + if lockFile, ok := lockFiles[cleanPath]; ok { + if ro && lockFile.IsReadWrite() { + return nil, fmt.Errorf("lock %q is not a read-only lock", cleanPath) } - if !ro && !locker.IsReadWrite() { - return nil, errors.Errorf("lock %q is not a read-write lock", cleanPath) + if !ro && !lockFile.IsReadWrite() { + return nil, fmt.Errorf("lock %q is not a read-write lock", cleanPath) } - return locker, nil + return lockFile, nil } - locker, err := createLockerForPath(cleanPath, ro) // platform-dependent locker + lockFile, err := createLockFileForPath(cleanPath, ro) // platform-dependent LockFile if err != nil { return nil, err } - lockfiles[cleanPath] = locker - return locker, nil + lockFiles[cleanPath] = lockFile + return lockFile, nil } diff --git a/vendor/github.com/containers/storage/pkg/lockfile/lockfile_unix.go b/vendor/github.com/containers/storage/pkg/lockfile/lockfile_unix.go index fc080acbed..a357b809e0 100644 --- a/vendor/github.com/containers/storage/pkg/lockfile/lockfile_unix.go +++ b/vendor/github.com/containers/storage/pkg/lockfile/lockfile_unix.go @@ -1,83 +1,168 @@ +//go:build linux || solaris || darwin || freebsd // +build linux solaris darwin freebsd package lockfile import ( + "bytes" + cryptorand "crypto/rand" + "encoding/binary" "fmt" "os" "path/filepath" "sync" + "sync/atomic" "time" - "github.com/containers/storage/pkg/stringid" "github.com/containers/storage/pkg/system" - "github.com/pkg/errors" "golang.org/x/sys/unix" ) -type lockfile struct { +// *LockFile represents a file lock where the file is used to cache an +// identifier of the last party that made changes to whatever's being protected +// by the lock. +// +// It MUST NOT be created manually. Use GetLockFile or GetROLockFile instead. +type LockFile struct { + // The following fields are only set when constructing *LockFile, and must never be modified afterwards. + // They are safe to access without any other locking. + file string + ro bool + // rwMutex serializes concurrent reader-writer acquisitions in the same process space rwMutex *sync.RWMutex // stateMutex is used to synchronize concurrent accesses to the state below stateMutex *sync.Mutex counter int64 - file string - fd uintptr - lw string + lw LastWrite // A global value valid as of the last .Touch() or .Modified() locktype int16 locked bool - ro bool - recursive bool + // The following fields are only modified on transitions between counter == 0 / counter != 0. + // Thus, they can be safely accessed by users _that currently hold the LockFile_ without locking. + // In other cases, they need to be protected using stateMutex. + fd uintptr +} + +// LastWrite is an opaque identifier of the last write to some *LockFile. +// It can be used by users of a *LockFile to determine if the lock indicates changes +// since the last check. +// +// Never construct a LastWrite manually; only accept it from *LockFile methods, and pass it back. +type LastWrite struct { + // Never modify fields of a LastWrite object; it has value semantics. + state []byte // Contents of the lock file. +} + +const lastWriterIDSize = 64 // This must be the same as len(stringid.GenerateRandomID) +var lastWriterIDCounter uint64 // Private state for newLastWriterID + +// newLastWrite returns a new "last write" ID. +// The value must be different on every call, and also differ from values +// generated by other processes. +func newLastWrite() LastWrite { + // The ID is (PID, time, per-process counter, random) + // PID + time represents both a unique process across reboots, + // and a specific time within the process; the per-process counter + // is an extra safeguard for in-process concurrency. + // The random part disambiguates across process namespaces + // (where PID values might collide), serves as a general-purpose + // extra safety, _and_ is used to pad the output to lastWriterIDSize, + // because other versions of this code exist and they don't work + // efficiently if the size of the value changes. + pid := os.Getpid() + tm := time.Now().UnixNano() + counter := atomic.AddUint64(&lastWriterIDCounter, 1) + + res := make([]byte, lastWriterIDSize) + binary.LittleEndian.PutUint64(res[0:8], uint64(tm)) + binary.LittleEndian.PutUint64(res[8:16], counter) + binary.LittleEndian.PutUint32(res[16:20], uint32(pid)) + if n, err := cryptorand.Read(res[20:lastWriterIDSize]); err != nil || n != lastWriterIDSize-20 { + panic(err) // This shouldn't happen + } + + return LastWrite{ + state: res, + } +} + +// newLastWriteFromData returns a LastWrite corresponding to data that came from a previous LastWrite.serialize +func newLastWriteFromData(serialized []byte) LastWrite { + if serialized == nil { + panic("newLastWriteFromData with nil data") + } + return LastWrite{ + state: serialized, + } +} + +// serialize returns bytes to write to the lock file to represent the specified write. +func (lw LastWrite) serialize() []byte { + if lw.state == nil { + panic("LastWrite.serialize on an uninitialized object") + } + return lw.state +} + +// Equals returns true if lw matches other +func (lw LastWrite) equals(other LastWrite) bool { + if lw.state == nil { + panic("LastWrite.equals on an uninitialized object") + } + if other.state == nil { + panic("LastWrite.equals with an uninitialized counterparty") + } + return bytes.Equal(lw.state, other.state) } // openLock opens the file at path and returns the corresponding file -// descriptor. Note that the path is opened read-only when ro is set. If ro -// is unset, openLock will open the path read-write and create the file if -// necessary. +// descriptor. The path is opened either read-only or read-write, +// depending on the value of ro argument. +// +// openLock will create the file and its parent directories, +// if necessary. func openLock(path string, ro bool) (fd int, err error) { + flags := unix.O_CLOEXEC | os.O_CREATE if ro { - fd, err = unix.Open(path, os.O_RDONLY|unix.O_CLOEXEC|os.O_CREATE, 0) + flags |= os.O_RDONLY } else { - fd, err = unix.Open(path, - os.O_RDWR|unix.O_CLOEXEC|os.O_CREATE, - unix.S_IRUSR|unix.S_IWUSR|unix.S_IRGRP|unix.S_IROTH, - ) + flags |= os.O_RDWR } - + fd, err = unix.Open(path, flags, 0o644) if err == nil { - return + return fd, nil } // the directory of the lockfile seems to be removed, try to create it if os.IsNotExist(err) { - if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil { - return fd, errors.Wrap(err, "creating locker directory") + if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { + return fd, fmt.Errorf("creating lock file directory: %w", err) } return openLock(path, ro) } - return + return fd, &os.PathError{Op: "open", Path: path, Err: err} } -// createLockerForPath returns a Locker object, possibly (depending on the platform) +// createLockFileForPath returns new *LockFile object, possibly (depending on the platform) // working inter-process and associated with the specified path. // // This function will be called at most once for each path value within a single process. // -// If ro, the lock is a read-write lock and the returned Locker should correspond to the +// If ro, the lock is a read-write lock and the returned *LockFile should correspond to the // “lock for reading” (shared) operation; otherwise, the lock is either an exclusive lock, -// or a read-write lock and Locker should correspond to the “lock for writing” (exclusive) operation. +// or a read-write lock and *LockFile should correspond to the “lock for writing” (exclusive) operation. // // WARNING: // - The lock may or MAY NOT be inter-process. // - There may or MAY NOT be an actual object on the filesystem created for the specified path. // - Even if ro, the lock MAY be exclusive. -func createLockerForPath(path string, ro bool) (Locker, error) { +func createLockFileForPath(path string, ro bool) (*LockFile, error) { // Check if we can open the lock. fd, err := openLock(path, ro) if err != nil { - return nil, errors.Wrapf(err, "error opening %q", path) + return nil, err } unix.Close(fd) @@ -85,22 +170,24 @@ func createLockerForPath(path string, ro bool) (Locker, error) { if ro { locktype = unix.F_RDLCK } - return &lockfile{ - stateMutex: &sync.Mutex{}, + return &LockFile{ + file: path, + ro: ro, + rwMutex: &sync.RWMutex{}, - file: path, - lw: stringid.GenerateRandomID(), + stateMutex: &sync.Mutex{}, + lw: newLastWrite(), // For compatibility, the first call of .Modified() will always report a change. locktype: int16(locktype), locked: false, - ro: ro}, nil + }, nil } // lock locks the lockfile via FCTNL(2) based on the specified type and // command. -func (l *lockfile) lock(lType int16, recursive bool) { +func (l *LockFile) lock(lType int16) { lk := unix.Flock_t{ Type: lType, - Whence: int16(os.SEEK_SET), + Whence: int16(unix.SEEK_SET), Start: 0, Len: 0, } @@ -108,13 +195,7 @@ func (l *lockfile) lock(lType int16, recursive bool) { case unix.F_RDLCK: l.rwMutex.RLock() case unix.F_WRLCK: - if recursive { - // NOTE: that's okay as recursive is only set in RecursiveLock(), so - // there's no need to protect against hypothetical RDLCK cases. - l.rwMutex.RLock() - } else { - l.rwMutex.Lock() - } + l.rwMutex.Lock() default: panic(fmt.Sprintf("attempted to acquire a file lock of unrecognized type %d", lType)) } @@ -124,7 +205,7 @@ func (l *lockfile) lock(lType int16, recursive bool) { // If we're the first reference on the lock, we need to open the file again. fd, err := openLock(l.file, l.ro) if err != nil { - panic(fmt.Sprintf("error opening %q: %v", l.file, err)) + panic(err) } l.fd = uintptr(fd) @@ -137,39 +218,27 @@ func (l *lockfile) lock(lType int16, recursive bool) { } l.locktype = lType l.locked = true - l.recursive = recursive l.counter++ } // Lock locks the lockfile as a writer. Panic if the lock is a read-only one. -func (l *lockfile) Lock() { +func (l *LockFile) Lock() { if l.ro { panic("can't take write lock on read-only lock file") } else { - l.lock(unix.F_WRLCK, false) - } -} - -// RecursiveLock locks the lockfile as a writer but allows for recursive -// acquisitions within the same process space. Note that RLock() will be called -// if it's a lockTypReader lock. -func (l *lockfile) RecursiveLock() { - if l.ro { - l.RLock() - } else { - l.lock(unix.F_WRLCK, true) + l.lock(unix.F_WRLCK) } } // LockRead locks the lockfile as a reader. -func (l *lockfile) RLock() { - l.lock(unix.F_RDLCK, false) +func (l *LockFile) RLock() { + l.lock(unix.F_RDLCK) } // Unlock unlocks the lockfile. -func (l *lockfile) Unlock() { +func (l *LockFile) Unlock() { l.stateMutex.Lock() - if l.locked == false { + if !l.locked { // Panic when unlocking an unlocked lock. That's a violation // of the lock semantics and will reveal such. panic("calling Unlock on unlocked lock") @@ -190,7 +259,7 @@ func (l *lockfile) Unlock() { // file lock. unix.Close(int(l.fd)) } - if l.locktype == unix.F_RDLCK || l.recursive { + if l.locktype == unix.F_RDLCK { l.rwMutex.RUnlock() } else { l.rwMutex.Unlock() @@ -198,60 +267,157 @@ func (l *lockfile) Unlock() { l.stateMutex.Unlock() } -// Locked checks if lockfile is locked for writing by a thread in this process. -func (l *lockfile) Locked() bool { - l.stateMutex.Lock() - defer l.stateMutex.Unlock() - return l.locked && (l.locktype == unix.F_WRLCK) +func (l *LockFile) AssertLocked() { + // DO NOT provide a variant that returns the value of l.locked. + // + // If the caller does not hold the lock, l.locked might nevertheless be true because another goroutine does hold it, and + // we can’t tell the difference. + // + // Hence, this “AssertLocked” method, which exists only for sanity checks. + + // Don’t even bother with l.stateMutex: The caller is expected to hold the lock, and in that case l.locked is constant true + // with no possible writers. + // If the caller does not hold the lock, we are violating the locking/memory model anyway, and accessing the data + // without the lock is more efficient for callers, and potentially more visible to lock analysers for incorrect callers. + if !l.locked { + panic("internal error: lock is not held by the expected owner") + } } -// Touch updates the lock file with the UID of the user. -func (l *lockfile) Touch() error { - l.stateMutex.Lock() - if !l.locked || (l.locktype != unix.F_WRLCK) { - panic("attempted to update last-writer in lockfile without the write lock") +func (l *LockFile) AssertLockedForWriting() { + // DO NOT provide a variant that returns the current lock state. + // + // The same caveats as for AssertLocked apply equally. + + l.AssertLocked() + // Like AssertLocked, don’t even bother with l.stateMutex. + if l.locktype != unix.F_WRLCK { + panic("internal error: lock is not held for writing") } - defer l.stateMutex.Unlock() - l.lw = stringid.GenerateRandomID() - id := []byte(l.lw) - n, err := unix.Pwrite(int(l.fd), id, 0) +} + +// GetLastWrite returns a LastWrite value corresponding to current state of the lock. +// This is typically called before (_not after_) loading the state when initializing a consumer +// of the data protected by the lock. +// During the lifetime of the consumer, the consumer should usually call ModifiedSince instead. +// +// The caller must hold the lock (for reading or writing). +func (l *LockFile) GetLastWrite() (LastWrite, error) { + l.AssertLocked() + contents := make([]byte, lastWriterIDSize) + n, err := unix.Pread(int(l.fd), contents, 0) + if err != nil { + return LastWrite{}, err + } + // It is important to handle the partial read case, because + // the initial size of the lock file is zero, which is a valid + // state (no writes yet) + contents = contents[:n] + return newLastWriteFromData(contents), nil +} + +// RecordWrite updates the lock with a new LastWrite value, and returns the new value. +// +// If this function fails, the LastWriter value of the lock is indeterminate; +// the caller should keep using the previously-recorded LastWrite value, +// and possibly detecting its own modification as an external one: +// +// lw, err := state.lock.RecordWrite() +// if err != nil { /* fail */ } +// state.lastWrite = lw +// +// The caller must hold the lock for writing. +func (l *LockFile) RecordWrite() (LastWrite, error) { + l.AssertLockedForWriting() + lw := newLastWrite() + lockContents := lw.serialize() + n, err := unix.Pwrite(int(l.fd), lockContents, 0) + if err != nil { + return LastWrite{}, err + } + if n != len(lockContents) { + return LastWrite{}, unix.ENOSPC + } + return lw, nil +} + +// ModifiedSince checks if the lock has been changed since a provided LastWrite value, +// and returns the one to record instead. +// +// If ModifiedSince reports no modification, the previous LastWrite value +// is still valid and can continue to be used. +// +// If this function fails, the LastWriter value of the lock is indeterminate; +// the caller should fail and keep using the previously-recorded LastWrite value, +// so that it continues failing until the situation is resolved. Similarly, +// it should only update the recorded LastWrite value after processing the update: +// +// lw2, modified, err := state.lock.ModifiedSince(state.lastWrite) +// if err != nil { /* fail */ } +// state.lastWrite = lw2 +// if modified { +// if err := reload(); err != nil { /* fail */ } +// state.lastWrite = lw2 +// } +// +// The caller must hold the lock (for reading or writing). +func (l *LockFile) ModifiedSince(previous LastWrite) (LastWrite, bool, error) { + l.AssertLocked() + currentLW, err := l.GetLastWrite() + if err != nil { + return LastWrite{}, false, err + } + modified := !previous.equals(currentLW) + return currentLW, modified, nil +} + +// Touch updates the lock file with to record that the current lock holder has modified the lock-protected data. +// +// Deprecated: Use *LockFile.RecordWrite. +func (l *LockFile) Touch() error { + lw, err := l.RecordWrite() if err != nil { return err } - if n != len(id) { - return unix.ENOSPC + l.stateMutex.Lock() + if !l.locked || (l.locktype != unix.F_WRLCK) { + panic("attempted to update last-writer in lockfile without the write lock") } + defer l.stateMutex.Unlock() + l.lw = lw return nil } // Modified indicates if the lockfile has been updated since the last time it // was loaded. -func (l *lockfile) Modified() (bool, error) { +// NOTE: Unlike ModifiedSince, this returns true the first time it is called on a *LockFile. +// Callers cannot, in general, rely on this, because that might have happened for some other +// owner of the same *LockFile who created it previously. +// +// Deprecated: Use *LockFile.ModifiedSince. +func (l *LockFile) Modified() (bool, error) { l.stateMutex.Lock() - id := []byte(l.lw) if !l.locked { panic("attempted to check last-writer in lockfile without locking it first") } defer l.stateMutex.Unlock() - n, err := unix.Pread(int(l.fd), id, 0) + oldLW := l.lw + // Note that this is called with stateMutex held; that’s fine because ModifiedSince doesn’t need to lock it. + currentLW, modified, err := l.ModifiedSince(oldLW) if err != nil { return true, err } - if n != len(id) { - return true, nil - } - lw := l.lw - l.lw = string(id) - return l.lw != lw, nil + l.lw = currentLW + return modified, nil } // IsReadWriteLock indicates if the lock file is a read-write lock. -func (l *lockfile) IsReadWrite() bool { +func (l *LockFile) IsReadWrite() bool { return !l.ro } // TouchedSince indicates if the lock file has been touched since the specified time -func (l *lockfile) TouchedSince(when time.Time) bool { +func (l *LockFile) TouchedSince(when time.Time) bool { st, err := system.Fstat(int(l.fd)) if err != nil { return true diff --git a/vendor/github.com/containers/storage/pkg/lockfile/lockfile_windows.go b/vendor/github.com/containers/storage/pkg/lockfile/lockfile_windows.go index 82bd91db9a..ca27a483d9 100644 --- a/vendor/github.com/containers/storage/pkg/lockfile/lockfile_windows.go +++ b/vendor/github.com/containers/storage/pkg/lockfile/lockfile_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package lockfile @@ -8,65 +9,141 @@ import ( "time" ) -// createLockerForPath returns a Locker object, possibly (depending on the platform) +// createLockFileForPath returns a *LockFile object, possibly (depending on the platform) // working inter-process and associated with the specified path. // // This function will be called at most once for each path value within a single process. // -// If ro, the lock is a read-write lock and the returned Locker should correspond to the +// If ro, the lock is a read-write lock and the returned *LockFile should correspond to the // “lock for reading” (shared) operation; otherwise, the lock is either an exclusive lock, -// or a read-write lock and Locker should correspond to the “lock for writing” (exclusive) operation. +// or a read-write lock and *LockFile should correspond to the “lock for writing” (exclusive) operation. // // WARNING: // - The lock may or MAY NOT be inter-process. // - There may or MAY NOT be an actual object on the filesystem created for the specified path. // - Even if ro, the lock MAY be exclusive. -func createLockerForPath(path string, ro bool) (Locker, error) { - return &lockfile{locked: false}, nil +func createLockFileForPath(path string, ro bool) (*LockFile, error) { + return &LockFile{locked: false}, nil } -type lockfile struct { +// *LockFile represents a file lock where the file is used to cache an +// identifier of the last party that made changes to whatever's being protected +// by the lock. +// +// It MUST NOT be created manually. Use GetLockFile or GetROLockFile instead. +type LockFile struct { mu sync.Mutex file string locked bool } -func (l *lockfile) Lock() { - l.mu.Lock() - l.locked = true +// LastWrite is an opaque identifier of the last write to some *LockFile. +// It can be used by users of a *LockFile to determine if the lock indicates changes +// since the last check. +// A default-initialized LastWrite never matches any last write, i.e. it always indicates changes. +type LastWrite struct { + // Nothing: The Windows “implementation” does not actually track writes. } -func (l *lockfile) RecursiveLock() { - // We don't support Windows but a recursive writer-lock in one process-space - // is really a writer lock, so just panic. - panic("not supported") +func (l *LockFile) Lock() { + l.mu.Lock() + l.locked = true } -func (l *lockfile) RLock() { +func (l *LockFile) RLock() { l.mu.Lock() l.locked = true } -func (l *lockfile) Unlock() { +func (l *LockFile) Unlock() { l.locked = false l.mu.Unlock() } -func (l *lockfile) Locked() bool { - return l.locked +func (l *LockFile) AssertLocked() { + // DO NOT provide a variant that returns the value of l.locked. + // + // If the caller does not hold the lock, l.locked might nevertheless be true because another goroutine does hold it, and + // we can’t tell the difference. + // + // Hence, this “AssertLocked” method, which exists only for sanity checks. + if !l.locked { + panic("internal error: lock is not held by the expected owner") + } +} + +func (l *LockFile) AssertLockedForWriting() { + // DO NOT provide a variant that returns the current lock state. + // + // The same caveats as for AssertLocked apply equally. + l.AssertLocked() // The current implementation does not distinguish between read and write locks. +} + +// GetLastWrite() returns a LastWrite value corresponding to current state of the lock. +// This is typically called before (_not after_) loading the state when initializing a consumer +// of the data protected by the lock. +// During the lifetime of the consumer, the consumer should usually call ModifiedSince instead. +// +// The caller must hold the lock (for reading or writing) before this function is called. +func (l *LockFile) GetLastWrite() (LastWrite, error) { + l.AssertLocked() + return LastWrite{}, nil +} + +// RecordWrite updates the lock with a new LastWrite value, and returns the new value. +// +// If this function fails, the LastWriter value of the lock is indeterminate; +// the caller should keep using the previously-recorded LastWrite value, +// and possibly detecting its own modification as an external one: +// +// lw, err := state.lock.RecordWrite() +// if err != nil { /* fail */ } +// state.lastWrite = lw +// +// The caller must hold the lock for writing. +func (l *LockFile) RecordWrite() (LastWrite, error) { + return LastWrite{}, nil +} + +// ModifiedSince checks if the lock has been changed since a provided LastWrite value, +// and returns the one to record instead. +// +// If ModifiedSince reports no modification, the previous LastWrite value +// is still valid and can continue to be used. +// +// If this function fails, the LastWriter value of the lock is indeterminate; +// the caller should fail and keep using the previously-recorded LastWrite value, +// so that it continues failing until the situation is resolved. Similarly, +// it should only update the recorded LastWrite value after processing the update: +// +// lw2, modified, err := state.lock.ModifiedSince(state.lastWrite) +// if err != nil { /* fail */ } +// state.lastWrite = lw2 +// if modified { +// if err := reload(); err != nil { /* fail */ } +// state.lastWrite = lw2 +// } +// +// The caller must hold the lock (for reading or writing). +func (l *LockFile) ModifiedSince(previous LastWrite) (LastWrite, bool, error) { + return LastWrite{}, false, nil } -func (l *lockfile) Modified() (bool, error) { +// Deprecated: Use *LockFile.ModifiedSince. +func (l *LockFile) Modified() (bool, error) { return false, nil } -func (l *lockfile) Touch() error { + +// Deprecated: Use *LockFile.RecordWrite. +func (l *LockFile) Touch() error { return nil } -func (l *lockfile) IsReadWrite() bool { + +func (l *LockFile) IsReadWrite() bool { return false } -func (l *lockfile) TouchedSince(when time.Time) bool { +func (l *LockFile) TouchedSince(when time.Time) bool { stat, err := os.Stat(l.file) if err != nil { return true diff --git a/vendor/github.com/containers/storage/pkg/longpath/longpath.go b/vendor/github.com/containers/storage/pkg/longpath/longpath.go new file mode 100644 index 0000000000..9b15bfff4c --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/longpath/longpath.go @@ -0,0 +1,26 @@ +// longpath introduces some constants and helper functions for handling long paths +// in Windows, which are expected to be prepended with `\\?\` and followed by either +// a drive letter, a UNC server\share, or a volume identifier. + +package longpath + +import ( + "strings" +) + +// Prefix is the longpath prefix for Windows file paths. +const Prefix = `\\?\` + +// AddPrefix will add the Windows long path prefix to the path provided if +// it does not already have it. +func AddPrefix(path string) string { + if !strings.HasPrefix(path, Prefix) { + if strings.HasPrefix(path, `\\`) { + // This is a UNC path, so we need to add 'UNC' to the path as well. + path = Prefix + `UNC` + path[1:] + } else { + path = Prefix + path + } + } + return path +} diff --git a/vendor/github.com/containers/storage/pkg/mount/flags.go b/vendor/github.com/containers/storage/pkg/mount/flags.go index 07a0f4847c..5de3a671dd 100644 --- a/vendor/github.com/containers/storage/pkg/mount/flags.go +++ b/vendor/github.com/containers/storage/pkg/mount/flags.go @@ -99,7 +99,7 @@ func MergeTmpfsOptions(options []string) ([]string, error) { } opt := strings.SplitN(option, "=", 2) if len(opt) != 2 || !validFlags[opt[0]] { - return nil, fmt.Errorf("Invalid tmpfs option %q", opt) + return nil, fmt.Errorf("invalid tmpfs option %q", opt) } if !dataCollisions[opt[0]] { // We prepend the option and add to collision map @@ -142,7 +142,7 @@ func ParseTmpfsOptions(options string) (int, string, error) { for _, o := range strings.Split(data, ",") { opt := strings.SplitN(o, "=", 2) if !validFlags[opt[0]] { - return 0, "", fmt.Errorf("Invalid tmpfs option %q", opt) + return 0, "", fmt.Errorf("invalid tmpfs option %q", opt) } } return flags, data, nil diff --git a/vendor/github.com/containers/storage/pkg/mount/flags_freebsd.go b/vendor/github.com/containers/storage/pkg/mount/flags_freebsd.go new file mode 100644 index 0000000000..3ba99cf935 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/mount/flags_freebsd.go @@ -0,0 +1,48 @@ +package mount + +import ( + "golang.org/x/sys/unix" +) + +const ( + // RDONLY will mount the file system read-only. + RDONLY = unix.MNT_RDONLY + + // NOSUID will not allow set-user-identifier or set-group-identifier bits to + // take effect. + NOSUID = unix.MNT_NOSUID + + // NOEXEC will not allow execution of any binaries on the mounted file system. + NOEXEC = unix.MNT_NOEXEC + + // SYNCHRONOUS will allow I/O to the file system to be done synchronously. + SYNCHRONOUS = unix.MNT_SYNCHRONOUS + + // REMOUNT will attempt to remount an already-mounted file system. This is + // commonly used to change the mount flags for a file system, especially to + // make a readonly file system writeable. It does not change device or mount + // point. + REMOUNT = unix.MNT_UPDATE + + // NOATIME will not update the file access time when reading from a file. + NOATIME = unix.MNT_NOATIME + + mntDetach = unix.MNT_FORCE + + NODIRATIME = 0 + NODEV = 0 + DIRSYNC = 0 + MANDLOCK = 0 + BIND = 0 + RBIND = 0 + UNBINDABLE = 0 + RUNBINDABLE = 0 + PRIVATE = 0 + RPRIVATE = 0 + SLAVE = 0 + RSLAVE = 0 + SHARED = 0 + RSHARED = 0 + RELATIME = 0 + STRICTATIME = 0 +) diff --git a/vendor/github.com/containers/storage/pkg/mount/flags_unsupported.go b/vendor/github.com/containers/storage/pkg/mount/flags_unsupported.go index 9afd26d4c0..ee0f593a50 100644 --- a/vendor/github.com/containers/storage/pkg/mount/flags_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/mount/flags_unsupported.go @@ -1,4 +1,5 @@ -// +build !linux +//go:build !linux && !freebsd +// +build !linux,!freebsd package mount diff --git a/vendor/github.com/containers/storage/pkg/mount/mounter_freebsd.go b/vendor/github.com/containers/storage/pkg/mount/mounter_freebsd.go index b31cf99d0f..c70b0bf991 100644 --- a/vendor/github.com/containers/storage/pkg/mount/mounter_freebsd.go +++ b/vendor/github.com/containers/storage/pkg/mount/mounter_freebsd.go @@ -1,3 +1,6 @@ +//go:build freebsd && cgo +// +build freebsd,cgo + package mount /* @@ -28,14 +31,25 @@ func allocateIOVecs(options []string) []C.struct_iovec { func mount(device, target, mType string, flag uintptr, data string) error { isNullFS := false - xs := strings.Split(data, ",") - for _, x := range xs { - if x == "bind" { - isNullFS = true + options := []string{"fspath", target} + + if data != "" { + xs := strings.Split(data, ",") + for _, x := range xs { + if x == "bind" { + isNullFS = true + continue + } + opt := strings.SplitN(x, "=", 2) + options = append(options, opt[0]) + if len(opt) == 2 { + options = append(options, opt[1]) + } else { + options = append(options, "") + } } } - options := []string{"fspath", target} if isNullFS { options = append(options, "fstype", "nullfs", "target", device) } else { @@ -48,7 +62,7 @@ func mount(device, target, mType string, flag uintptr, data string) error { if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 { reason := C.GoString(C.strerror(*C.__error())) - return fmt.Errorf("Failed to call nmount: %s", reason) + return fmt.Errorf("failed to call nmount: %s", reason) } return nil } diff --git a/vendor/github.com/containers/storage/pkg/mount/mounter_unsupported.go b/vendor/github.com/containers/storage/pkg/mount/mounter_unsupported.go index 9d20cfbf86..74fe666090 100644 --- a/vendor/github.com/containers/storage/pkg/mount/mounter_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/mount/mounter_unsupported.go @@ -1,4 +1,6 @@ -// +build !linux,!freebsd +//go:build !linux && !(freebsd && cgo) +// +build !linux +// +build !freebsd !cgo package mount diff --git a/vendor/github.com/containers/storage/pkg/mount/unmount_unix.go b/vendor/github.com/containers/storage/pkg/mount/unmount_unix.go index 1d1afeee2e..a2a1d40723 100644 --- a/vendor/github.com/containers/storage/pkg/mount/unmount_unix.go +++ b/vendor/github.com/containers/storage/pkg/mount/unmount_unix.go @@ -1,16 +1,29 @@ +//go:build !windows // +build !windows package mount -import "golang.org/x/sys/unix" +import ( + "time" + + "golang.org/x/sys/unix" +) func unmount(target string, flags int) error { - err := unix.Unmount(target, flags) - if err == nil || err == unix.EINVAL { - // Ignore "not mounted" error here. Note the same error - // can be returned if flags are invalid, so this code - // assumes that the flags value is always correct. - return nil + var err error + for i := 0; i < 50; i++ { + err = unix.Unmount(target, flags) + switch err { + case unix.EBUSY: + time.Sleep(50 * time.Millisecond) + continue + case unix.EINVAL, nil: + // Ignore "not mounted" error here. Note the same error + // can be returned if flags are invalid, so this code + // assumes that the flags value is always correct. + return nil + } + break } return &mountError{ diff --git a/vendor/github.com/containers/storage/pkg/mount/unmount_unsupported.go b/vendor/github.com/containers/storage/pkg/mount/unmount_unsupported.go index eebc4ab84e..d3a0cf51ce 100644 --- a/vendor/github.com/containers/storage/pkg/mount/unmount_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/mount/unmount_unsupported.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package mount diff --git a/vendor/github.com/containers/storage/pkg/reexec/command_freebsd.go b/vendor/github.com/containers/storage/pkg/reexec/command_freebsd.go new file mode 100644 index 0000000000..32d6a9f49a --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/reexec/command_freebsd.go @@ -0,0 +1,38 @@ +//go:build freebsd +// +build freebsd + +package reexec + +import ( + "context" + "os" + "os/exec" + + "golang.org/x/sys/unix" +) + +// Self returns the path to the current process's binary. +// Uses sysctl. +func Self() string { + path, err := unix.SysctlArgs("kern.proc.pathname", -1) + if err == nil { + return path + } + return os.Args[0] +} + +// Command returns *exec.Cmd which has Path as current binary. +// For example if current binary is "docker" at "/usr/bin/", then cmd.Path will +// be set to "/usr/bin/docker". +func Command(args ...string) *exec.Cmd { + cmd := exec.Command(Self()) + cmd.Args = args + return cmd +} + +// CommandContext returns *exec.Cmd which has Path as current binary. +func CommandContext(ctx context.Context, args ...string) *exec.Cmd { + cmd := exec.CommandContext(ctx, Self()) + cmd.Args = args + return cmd +} diff --git a/vendor/github.com/containers/storage/pkg/reexec/command_linux.go b/vendor/github.com/containers/storage/pkg/reexec/command_linux.go index d3dd86d349..87b43ed950 100644 --- a/vendor/github.com/containers/storage/pkg/reexec/command_linux.go +++ b/vendor/github.com/containers/storage/pkg/reexec/command_linux.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package reexec diff --git a/vendor/github.com/containers/storage/pkg/reexec/command_unix.go b/vendor/github.com/containers/storage/pkg/reexec/command_unix.go index 9dd8cb9bbe..a56ada2161 100644 --- a/vendor/github.com/containers/storage/pkg/reexec/command_unix.go +++ b/vendor/github.com/containers/storage/pkg/reexec/command_unix.go @@ -1,4 +1,5 @@ -// +build freebsd solaris darwin +//go:build solaris || darwin +// +build solaris darwin package reexec diff --git a/vendor/github.com/containers/storage/pkg/reexec/command_unsupported.go b/vendor/github.com/containers/storage/pkg/reexec/command_unsupported.go index 5b3605f319..77c93b4ab5 100644 --- a/vendor/github.com/containers/storage/pkg/reexec/command_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/reexec/command_unsupported.go @@ -1,3 +1,4 @@ +//go:build !linux && !windows && !freebsd && !solaris && !darwin // +build !linux,!windows,!freebsd,!solaris,!darwin package reexec diff --git a/vendor/github.com/containers/storage/pkg/reexec/command_windows.go b/vendor/github.com/containers/storage/pkg/reexec/command_windows.go index d868564767..c46125ebf5 100644 --- a/vendor/github.com/containers/storage/pkg/reexec/command_windows.go +++ b/vendor/github.com/containers/storage/pkg/reexec/command_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package reexec diff --git a/vendor/github.com/containers/storage/pkg/reexec/reexec.go b/vendor/github.com/containers/storage/pkg/reexec/reexec.go index a1938cd4f3..0c032e6c47 100644 --- a/vendor/github.com/containers/storage/pkg/reexec/reexec.go +++ b/vendor/github.com/containers/storage/pkg/reexec/reexec.go @@ -49,7 +49,7 @@ func panicIfNotInitialized() { } } -func naiveSelf() string { +func naiveSelf() string { //nolint: unused name := os.Args[0] if filepath.Base(name) == name { if lp, err := exec.LookPath(name); err == nil { diff --git a/vendor/github.com/containers/storage/pkg/regexp/regexp.go b/vendor/github.com/containers/storage/pkg/regexp/regexp.go new file mode 100644 index 0000000000..1a3333dba2 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/regexp/regexp.go @@ -0,0 +1,234 @@ +package regexp + +import ( + "io" + "regexp" + "sync" +) + +// Regexp is a wrapper struct used for wrapping MustCompile regex expressions +// used as global variables. Using this structure helps speed the startup time +// of apps that want to use global regex variables. This library initializes them on +// first use as opposed to the start of the executable. +type Regexp struct { + *regexpStruct +} + +type regexpStruct struct { + _ noCopy + once sync.Once + regexp *regexp.Regexp + val string +} + +func Delayed(val string) Regexp { + re := ®expStruct{ + val: val, + } + if precompile { + re.regexp = regexp.MustCompile(re.val) + } + return Regexp{re} +} + +func (re *regexpStruct) compile() { + if precompile { + return + } + re.once.Do(func() { + re.regexp = regexp.MustCompile(re.val) + }) +} + +func (re *regexpStruct) Expand(dst []byte, template []byte, src []byte, match []int) []byte { + re.compile() + return re.regexp.Expand(dst, template, src, match) +} + +func (re *regexpStruct) ExpandString(dst []byte, template string, src string, match []int) []byte { + re.compile() + return re.regexp.ExpandString(dst, template, src, match) +} + +func (re *regexpStruct) Find(b []byte) []byte { + re.compile() + return re.regexp.Find(b) +} + +func (re *regexpStruct) FindAll(b []byte, n int) [][]byte { + re.compile() + return re.regexp.FindAll(b, n) +} + +func (re *regexpStruct) FindAllIndex(b []byte, n int) [][]int { + re.compile() + return re.regexp.FindAllIndex(b, n) +} + +func (re *regexpStruct) FindAllString(s string, n int) []string { + re.compile() + return re.regexp.FindAllString(s, n) +} + +func (re *regexpStruct) FindAllStringIndex(s string, n int) [][]int { + re.compile() + return re.regexp.FindAllStringIndex(s, n) +} + +func (re *regexpStruct) FindAllStringSubmatch(s string, n int) [][]string { + re.compile() + return re.regexp.FindAllStringSubmatch(s, n) +} + +func (re *regexpStruct) FindAllStringSubmatchIndex(s string, n int) [][]int { + re.compile() + return re.regexp.FindAllStringSubmatchIndex(s, n) +} + +func (re *regexpStruct) FindAllSubmatch(b []byte, n int) [][][]byte { + re.compile() + return re.regexp.FindAllSubmatch(b, n) +} + +func (re *regexpStruct) FindAllSubmatchIndex(b []byte, n int) [][]int { + re.compile() + return re.regexp.FindAllSubmatchIndex(b, n) +} + +func (re *regexpStruct) FindIndex(b []byte) (loc []int) { + re.compile() + return re.regexp.FindIndex(b) +} + +func (re *regexpStruct) FindReaderIndex(r io.RuneReader) (loc []int) { + re.compile() + return re.regexp.FindReaderIndex(r) +} + +func (re *regexpStruct) FindReaderSubmatchIndex(r io.RuneReader) []int { + re.compile() + return re.regexp.FindReaderSubmatchIndex(r) +} + +func (re *regexpStruct) FindString(s string) string { + re.compile() + return re.regexp.FindString(s) +} + +func (re *regexpStruct) FindStringIndex(s string) (loc []int) { + re.compile() + return re.regexp.FindStringIndex(s) +} + +func (re *regexpStruct) FindStringSubmatch(s string) []string { + re.compile() + return re.regexp.FindStringSubmatch(s) +} + +func (re *regexpStruct) FindStringSubmatchIndex(s string) []int { + re.compile() + return re.regexp.FindStringSubmatchIndex(s) +} + +func (re *regexpStruct) FindSubmatch(b []byte) [][]byte { + re.compile() + return re.regexp.FindSubmatch(b) +} + +func (re *regexpStruct) FindSubmatchIndex(b []byte) []int { + re.compile() + return re.regexp.FindSubmatchIndex(b) +} + +func (re *regexpStruct) LiteralPrefix() (prefix string, complete bool) { + re.compile() + return re.regexp.LiteralPrefix() +} + +func (re *regexpStruct) Longest() { + re.compile() + re.regexp.Longest() +} + +func (re *regexpStruct) Match(b []byte) bool { + re.compile() + return re.regexp.Match(b) +} + +func (re *regexpStruct) MatchReader(r io.RuneReader) bool { + re.compile() + return re.regexp.MatchReader(r) +} + +func (re *regexpStruct) MatchString(s string) bool { + re.compile() + return re.regexp.MatchString(s) +} + +func (re *regexpStruct) NumSubexp() int { + re.compile() + return re.regexp.NumSubexp() +} + +func (re *regexpStruct) ReplaceAll(src, repl []byte) []byte { + re.compile() + return re.regexp.ReplaceAll(src, repl) +} + +func (re *regexpStruct) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte { + re.compile() + return re.regexp.ReplaceAllFunc(src, repl) +} + +func (re *regexpStruct) ReplaceAllLiteral(src, repl []byte) []byte { + re.compile() + return re.regexp.ReplaceAllLiteral(src, repl) +} + +func (re *regexpStruct) ReplaceAllLiteralString(src, repl string) string { + re.compile() + return re.regexp.ReplaceAllLiteralString(src, repl) +} + +func (re *regexpStruct) ReplaceAllString(src, repl string) string { + re.compile() + return re.regexp.ReplaceAllString(src, repl) +} + +func (re *regexpStruct) ReplaceAllStringFunc(src string, repl func(string) string) string { + re.compile() + return re.regexp.ReplaceAllStringFunc(src, repl) +} + +func (re *regexpStruct) Split(s string, n int) []string { + re.compile() + return re.regexp.Split(s, n) +} + +func (re *regexpStruct) String() string { + re.compile() + return re.regexp.String() +} + +func (re *regexpStruct) SubexpIndex(name string) int { + re.compile() + return re.regexp.SubexpIndex(name) +} + +func (re *regexpStruct) SubexpNames() []string { + re.compile() + return re.regexp.SubexpNames() +} + +// noCopy may be added to structs which must not be copied +// after the first use. +// +// See https://golang.org/issues/8005#issuecomment-190753527 +// for details. +// +// Note that it must not be embedded, due to the Lock and Unlock methods. +type noCopy struct{} + +// Lock is a no-op used by -copylocks checker from `go vet`. +func (*noCopy) Lock() {} +func (*noCopy) Unlock() {} diff --git a/vendor/github.com/containers/storage/pkg/regexp/regexp_dontprecompile.go b/vendor/github.com/containers/storage/pkg/regexp/regexp_dontprecompile.go new file mode 100644 index 0000000000..834dd94337 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/regexp/regexp_dontprecompile.go @@ -0,0 +1,6 @@ +//go:build !regexp_precompile +// +build !regexp_precompile + +package regexp + +const precompile = false diff --git a/vendor/github.com/containers/storage/pkg/regexp/regexp_precompile.go b/vendor/github.com/containers/storage/pkg/regexp/regexp_precompile.go new file mode 100644 index 0000000000..a5fe0dbc49 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/regexp/regexp_precompile.go @@ -0,0 +1,6 @@ +//go:build regexp_precompile +// +build regexp_precompile + +package regexp + +const precompile = true diff --git a/vendor/github.com/containers/storage/pkg/stringid/README.md b/vendor/github.com/containers/storage/pkg/stringid/README.md deleted file mode 100644 index 37a5098fd9..0000000000 --- a/vendor/github.com/containers/storage/pkg/stringid/README.md +++ /dev/null @@ -1 +0,0 @@ -This package provides helper functions for dealing with string identifiers diff --git a/vendor/github.com/containers/storage/pkg/stringid/stringid.go b/vendor/github.com/containers/storage/pkg/stringid/stringid.go deleted file mode 100644 index a0c7c42a05..0000000000 --- a/vendor/github.com/containers/storage/pkg/stringid/stringid.go +++ /dev/null @@ -1,99 +0,0 @@ -// Package stringid provides helper functions for dealing with string identifiers -package stringid - -import ( - cryptorand "crypto/rand" - "encoding/hex" - "fmt" - "io" - "math" - "math/big" - "math/rand" - "regexp" - "strconv" - "strings" - "time" -) - -const shortLen = 12 - -var ( - validShortID = regexp.MustCompile("^[a-f0-9]{12}$") - validHex = regexp.MustCompile(`^[a-f0-9]{64}$`) -) - -// IsShortID determines if an arbitrary string *looks like* a short ID. -func IsShortID(id string) bool { - return validShortID.MatchString(id) -} - -// TruncateID returns a shorthand version of a string identifier for convenience. -// A collision with other shorthands is very unlikely, but possible. -// In case of a collision a lookup with TruncIndex.Get() will fail, and the caller -// will need to use a longer prefix, or the full-length Id. -func TruncateID(id string) string { - if i := strings.IndexRune(id, ':'); i >= 0 { - id = id[i+1:] - } - if len(id) > shortLen { - id = id[:shortLen] - } - return id -} - -func generateID(r io.Reader) string { - b := make([]byte, 32) - for { - if _, err := io.ReadFull(r, b); err != nil { - panic(err) // This shouldn't happen - } - id := hex.EncodeToString(b) - // if we try to parse the truncated for as an int and we don't have - // an error then the value is all numeric and causes issues when - // used as a hostname. ref #3869 - if _, err := strconv.ParseInt(TruncateID(id), 10, 64); err == nil { - continue - } - return id - } -} - -// GenerateRandomID returns a unique id. -func GenerateRandomID() string { - return generateID(cryptorand.Reader) -} - -// GenerateNonCryptoID generates unique id without using cryptographically -// secure sources of random. -// It helps you to save entropy. -func GenerateNonCryptoID() string { - return generateID(readerFunc(rand.Read)) -} - -// ValidateID checks whether an ID string is a valid image ID. -func ValidateID(id string) error { - if ok := validHex.MatchString(id); !ok { - return fmt.Errorf("image ID %q is invalid", id) - } - return nil -} - -func init() { - // safely set the seed globally so we generate random ids. Tries to use a - // crypto seed before falling back to time. - var seed int64 - if cryptoseed, err := cryptorand.Int(cryptorand.Reader, big.NewInt(math.MaxInt64)); err != nil { - // This should not happen, but worst-case fallback to time-based seed. - seed = time.Now().UnixNano() - } else { - seed = cryptoseed.Int64() - } - - rand.Seed(seed) -} - -type readerFunc func(p []byte) (int, error) - -func (fn readerFunc) Read(p []byte) (int, error) { - return fn(p) -} diff --git a/vendor/github.com/containers/storage/pkg/system/chtimes_unix.go b/vendor/github.com/containers/storage/pkg/system/chtimes_unix.go index 09d58bcbfd..1ce4c0d6eb 100644 --- a/vendor/github.com/containers/storage/pkg/system/chtimes_unix.go +++ b/vendor/github.com/containers/storage/pkg/system/chtimes_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package system @@ -6,9 +7,9 @@ import ( "time" ) -//setCTime will set the create time on a file. On Unix, the create -//time is updated as a side effect of setting the modified time, so -//no action is required. +// setCTime will set the create time on a file. On Unix, the create +// time is updated as a side effect of setting the modified time, so +// no action is required. func setCTime(path string, ctime time.Time) error { return nil } diff --git a/vendor/github.com/containers/storage/pkg/system/chtimes_windows.go b/vendor/github.com/containers/storage/pkg/system/chtimes_windows.go index 45428c141c..7a3d7937d6 100644 --- a/vendor/github.com/containers/storage/pkg/system/chtimes_windows.go +++ b/vendor/github.com/containers/storage/pkg/system/chtimes_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package system @@ -8,8 +9,8 @@ import ( "golang.org/x/sys/windows" ) -//setCTime will set the create time on a file. On Windows, this requires -//calling SetFileTime and explicitly including the create time. +// setCTime will set the create time on a file. On Windows, this requires +// calling SetFileTime and explicitly including the create time. func setCTime(path string, ctime time.Time) error { ctimespec := windows.NsecToTimespec(ctime.UnixNano()) pathp, e := windows.UTF16PtrFromString(path) diff --git a/vendor/github.com/containers/storage/pkg/system/errors.go b/vendor/github.com/containers/storage/pkg/system/errors.go index 288318985e..b87d419b57 100644 --- a/vendor/github.com/containers/storage/pkg/system/errors.go +++ b/vendor/github.com/containers/storage/pkg/system/errors.go @@ -4,7 +4,5 @@ import ( "errors" ) -var ( - // ErrNotSupportedPlatform means the platform is not supported. - ErrNotSupportedPlatform = errors.New("platform and architecture is not supported") -) +// ErrNotSupportedPlatform means the platform is not supported. +var ErrNotSupportedPlatform = errors.New("platform and architecture is not supported") diff --git a/vendor/github.com/containers/storage/pkg/system/init.go b/vendor/github.com/containers/storage/pkg/system/init.go index 17935088de..05642f6038 100644 --- a/vendor/github.com/containers/storage/pkg/system/init.go +++ b/vendor/github.com/containers/storage/pkg/system/init.go @@ -6,7 +6,7 @@ import ( "unsafe" ) -// Used by chtimes +// maxTime is used by chtimes. var maxTime time.Time func init() { diff --git a/vendor/github.com/containers/storage/pkg/system/init_windows.go b/vendor/github.com/containers/storage/pkg/system/init_windows.go index 019c66441c..5f6fea1d37 100644 --- a/vendor/github.com/containers/storage/pkg/system/init_windows.go +++ b/vendor/github.com/containers/storage/pkg/system/init_windows.go @@ -13,5 +13,4 @@ func init() { if os.Getenv("LCOW_SUPPORTED") != "" { lcowSupported = true } - } diff --git a/vendor/github.com/containers/storage/pkg/system/lchflags_bsd.go b/vendor/github.com/containers/storage/pkg/system/lchflags_bsd.go new file mode 100644 index 0000000000..4eaeb5d69f --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/system/lchflags_bsd.go @@ -0,0 +1,56 @@ +//go:build freebsd +// +build freebsd + +package system + +import ( + "unsafe" + + "golang.org/x/sys/unix" +) + +// Flag values from +const ( + /* + * Definitions of flags stored in file flags word. + * + * Super-user and owner changeable flags. + */ + UF_SETTABLE uint32 = 0x0000ffff /* mask of owner changeable flags */ + UF_NODUMP uint32 = 0x00000001 /* do not dump file */ + UF_IMMUTABLE uint32 = 0x00000002 /* file may not be changed */ + UF_APPEND uint32 = 0x00000004 /* writes to file may only append */ + UF_OPAQUE uint32 = 0x00000008 /* directory is opaque wrt. union */ + UF_NOUNLINK uint32 = 0x00000010 /* file may not be removed or renamed */ + + UF_SYSTEM uint32 = 0x00000080 /* Windows system file bit */ + UF_SPARSE uint32 = 0x00000100 /* sparse file */ + UF_OFFLINE uint32 = 0x00000200 /* file is offline */ + UF_REPARSE uint32 = 0x00000400 /* Windows reparse point file bit */ + UF_ARCHIVE uint32 = 0x00000800 /* file needs to be archived */ + UF_READONLY uint32 = 0x00001000 /* Windows readonly file bit */ + /* This is the same as the MacOS X definition of UF_HIDDEN. */ + UF_HIDDEN uint32 = 0x00008000 /* file is hidden */ + + /* + * Super-user changeable flags. + */ + SF_SETTABLE uint32 = 0xffff0000 /* mask of superuser changeable flags */ + SF_ARCHIVED uint32 = 0x00010000 /* file is archived */ + SF_IMMUTABLE uint32 = 0x00020000 /* file may not be changed */ + SF_APPEND uint32 = 0x00040000 /* writes to file may only append */ + SF_NOUNLINK uint32 = 0x00100000 /* file may not be removed or renamed */ + SF_SNAPSHOT uint32 = 0x00200000 /* snapshot inode */ +) + +func Lchflags(path string, flags uint32) error { + p, err := unix.BytePtrFromString(path) + if err != nil { + return err + } + _, _, e1 := unix.Syscall(unix.SYS_LCHFLAGS, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + return e1 + } + return nil +} diff --git a/vendor/github.com/containers/storage/pkg/system/lcow_unix.go b/vendor/github.com/containers/storage/pkg/system/lcow_unix.go index cff33bb408..42658c8b9a 100644 --- a/vendor/github.com/containers/storage/pkg/system/lcow_unix.go +++ b/vendor/github.com/containers/storage/pkg/system/lcow_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package system diff --git a/vendor/github.com/containers/storage/pkg/system/lstat_unix.go b/vendor/github.com/containers/storage/pkg/system/lstat_unix.go index e9d301f090..9b13e61468 100644 --- a/vendor/github.com/containers/storage/pkg/system/lstat_unix.go +++ b/vendor/github.com/containers/storage/pkg/system/lstat_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package system @@ -14,7 +15,7 @@ import ( func Lstat(path string) (*StatT, error) { s := &syscall.Stat_t{} if err := syscall.Lstat(path, s); err != nil { - return nil, &os.PathError{"Lstat", path, err} + return nil, &os.PathError{Op: "Lstat", Path: path, Err: err} } return fromStatT(s) } diff --git a/vendor/github.com/containers/storage/pkg/system/meminfo_freebsd.go b/vendor/github.com/containers/storage/pkg/system/meminfo_freebsd.go new file mode 100644 index 0000000000..37da93aa0b --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/system/meminfo_freebsd.go @@ -0,0 +1,86 @@ +//go:build freebsd && cgo +// +build freebsd,cgo + +package system + +import ( + "errors" + "fmt" + "unsafe" + + "golang.org/x/sys/unix" +) + +// #include +// #include +// #include +// #include +import "C" + +func getMemInfo() (int64, int64, error) { + data, err := unix.SysctlRaw("vm.vmtotal") + if err != nil { + return -1, -1, fmt.Errorf("can't get kernel info: %w", err) + } + if len(data) != C.sizeof_struct_vmtotal { + return -1, -1, fmt.Errorf("unexpected vmtotal size %d", len(data)) + } + + total := (*C.struct_vmtotal)(unsafe.Pointer(&data[0])) + + pagesize := int64(C.sysconf(C._SC_PAGESIZE)) + npages := int64(C.sysconf(C._SC_PHYS_PAGES)) + return pagesize * npages, pagesize * int64(total.t_free), nil +} + +func getSwapInfo() (int64, int64, error) { + var ( + total int64 = 0 + used int64 = 0 + ) + swapCount, err := unix.SysctlUint32("vm.nswapdev") + if err != nil { + return -1, -1, fmt.Errorf("reading vm.nswapdev: %w", err) + } + for i := 0; i < int(swapCount); i++ { + data, err := unix.SysctlRaw("vm.swap_info", i) + if err != nil { + return -1, -1, fmt.Errorf("reading vm.swap_info.%d: %w", i, err) + } + if len(data) != C.sizeof_struct_xswdev { + return -1, -1, fmt.Errorf("unexpected swap_info size %d", len(data)) + } + xsw := (*C.struct_xswdev)(unsafe.Pointer(&data[0])) + total += int64(xsw.xsw_nblks) + used += int64(xsw.xsw_used) + } + pagesize := int64(C.sysconf(C._SC_PAGESIZE)) + return pagesize * total, pagesize * (total - used), nil +} + +// ReadMemInfo retrieves memory statistics of the host system and returns a +// +// MemInfo type. +func ReadMemInfo() (*MemInfo, error) { + MemTotal, MemFree, err := getMemInfo() + if err != nil { + return nil, fmt.Errorf("getting memory totals %w", err) + } + SwapTotal, SwapFree, err := getSwapInfo() + if err != nil { + return nil, fmt.Errorf("getting swap totals %w", err) + } + + if MemTotal < 0 || MemFree < 0 || SwapTotal < 0 || SwapFree < 0 { + return nil, errors.New("getting system memory info") + } + + meminfo := &MemInfo{} + // Total memory is total physical memory less than memory locked by kernel + meminfo.MemTotal = MemTotal + meminfo.MemFree = MemFree + meminfo.SwapTotal = SwapTotal + meminfo.SwapFree = SwapFree + + return meminfo, nil +} diff --git a/vendor/github.com/containers/storage/pkg/system/meminfo_solaris.go b/vendor/github.com/containers/storage/pkg/system/meminfo_solaris.go index 925776e789..a90b23e030 100644 --- a/vendor/github.com/containers/storage/pkg/system/meminfo_solaris.go +++ b/vendor/github.com/containers/storage/pkg/system/meminfo_solaris.go @@ -1,3 +1,4 @@ +//go:build solaris && cgo // +build solaris,cgo package system @@ -80,9 +81,9 @@ func getFreeMem() int64 { } // ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. +// +// MemInfo type. func ReadMemInfo() (*MemInfo, error) { - ppKernel := C.getPpKernel() MemTotal := getTotalMem() MemFree := getFreeMem() @@ -90,7 +91,7 @@ func ReadMemInfo() (*MemInfo, error) { if ppKernel < 0 || MemTotal < 0 || MemFree < 0 || SwapTotal < 0 || SwapFree < 0 { - return nil, fmt.Errorf("error getting system memory info %v\n", err) + return nil, fmt.Errorf("getting system memory info %w", err) } meminfo := &MemInfo{} diff --git a/vendor/github.com/containers/storage/pkg/system/meminfo_unsupported.go b/vendor/github.com/containers/storage/pkg/system/meminfo_unsupported.go index 3ce019dffd..0f9feb1d22 100644 --- a/vendor/github.com/containers/storage/pkg/system/meminfo_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/system/meminfo_unsupported.go @@ -1,4 +1,8 @@ -// +build !linux,!windows,!solaris +//go:build !linux && !windows && !solaris && !(freebsd && cgo) +// +build !linux +// +build !windows +// +build !solaris +// +build !freebsd !cgo package system diff --git a/vendor/github.com/containers/storage/pkg/system/meminfo_windows.go b/vendor/github.com/containers/storage/pkg/system/meminfo_windows.go index 883944a4c5..c833f30f76 100644 --- a/vendor/github.com/containers/storage/pkg/system/meminfo_windows.go +++ b/vendor/github.com/containers/storage/pkg/system/meminfo_windows.go @@ -27,7 +27,8 @@ type memorystatusex struct { } // ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. +// +// MemInfo type. func ReadMemInfo() (*MemInfo, error) { msi := &memorystatusex{ dwLength: 64, diff --git a/vendor/github.com/containers/storage/pkg/system/mknod.go b/vendor/github.com/containers/storage/pkg/system/mknod.go index c276ce8e80..d3d0ed8a12 100644 --- a/vendor/github.com/containers/storage/pkg/system/mknod.go +++ b/vendor/github.com/containers/storage/pkg/system/mknod.go @@ -1,3 +1,4 @@ +//go:build !windows && !freebsd // +build !windows,!freebsd package system @@ -8,8 +9,8 @@ import ( // Mknod creates a filesystem node (file, device special file or named pipe) named path // with attributes specified by mode and dev. -func Mknod(path string, mode uint32, dev int) error { - return unix.Mknod(path, mode, dev) +func Mknod(path string, mode uint32, dev uint32) error { + return unix.Mknod(path, mode, int(dev)) } // Mkdev is used to build the value of linux devices (in /dev/) which specifies major diff --git a/vendor/github.com/containers/storage/pkg/system/mknod_freebsd.go b/vendor/github.com/containers/storage/pkg/system/mknod_freebsd.go index d09005589a..53c3f2837e 100644 --- a/vendor/github.com/containers/storage/pkg/system/mknod_freebsd.go +++ b/vendor/github.com/containers/storage/pkg/system/mknod_freebsd.go @@ -1,3 +1,4 @@ +//go:build freebsd // +build freebsd package system @@ -17,6 +18,6 @@ func Mknod(path string, mode uint32, dev uint64) error { // Linux device nodes are a bit weird due to backwards compat with 16 bit device nodes. // They are, from low to high: the lower 8 bits of the minor, then 12 bits of the major, // then the top 12 bits of the minor. -func Mkdev(major int64, minor int64) uint32 { - return uint32(((minor & 0xfff00) << 12) | ((major & 0xfff) << 8) | (minor & 0xff)) +func Mkdev(major int64, minor int64) uint64 { + return uint64(((minor & 0xfff00) << 12) | ((major & 0xfff) << 8) | (minor & 0xff)) } diff --git a/vendor/github.com/containers/storage/pkg/system/mknod_windows.go b/vendor/github.com/containers/storage/pkg/system/mknod_windows.go index 2e863c0215..c35b1b346a 100644 --- a/vendor/github.com/containers/storage/pkg/system/mknod_windows.go +++ b/vendor/github.com/containers/storage/pkg/system/mknod_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package system diff --git a/vendor/github.com/containers/storage/pkg/system/path.go b/vendor/github.com/containers/storage/pkg/system/path.go index f634a6be67..ca076f2bc2 100644 --- a/vendor/github.com/containers/storage/pkg/system/path.go +++ b/vendor/github.com/containers/storage/pkg/system/path.go @@ -17,5 +17,4 @@ func DefaultPathEnv(platform string) string { return "" } return defaultUnixPathEnv - } diff --git a/vendor/github.com/containers/storage/pkg/system/path_unix.go b/vendor/github.com/containers/storage/pkg/system/path_unix.go index f3762e69d3..ff01143eef 100644 --- a/vendor/github.com/containers/storage/pkg/system/path_unix.go +++ b/vendor/github.com/containers/storage/pkg/system/path_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package system diff --git a/vendor/github.com/containers/storage/pkg/system/path_windows.go b/vendor/github.com/containers/storage/pkg/system/path_windows.go index aab891522d..9f25097384 100644 --- a/vendor/github.com/containers/storage/pkg/system/path_windows.go +++ b/vendor/github.com/containers/storage/pkg/system/path_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package system @@ -21,13 +22,13 @@ import ( // d:\ --> Fail func CheckSystemDriveAndRemoveDriveLetter(path string) (string, error) { if len(path) == 2 && string(path[1]) == ":" { - return "", fmt.Errorf("No relative path specified in %q", path) + return "", fmt.Errorf("relative path not specified in %q", path) } if !filepath.IsAbs(path) || len(path) < 2 { return filepath.FromSlash(path), nil } if string(path[1]) == ":" && !strings.EqualFold(string(path[0]), "c") { - return "", fmt.Errorf("The specified path is not on the system drive (C:)") + return "", fmt.Errorf("specified path is not on the system drive (C:)") } return filepath.FromSlash(path[2:]), nil } diff --git a/vendor/github.com/containers/storage/pkg/system/process_unix.go b/vendor/github.com/containers/storage/pkg/system/process_unix.go index a9a0dd7517..7ee59d9262 100644 --- a/vendor/github.com/containers/storage/pkg/system/process_unix.go +++ b/vendor/github.com/containers/storage/pkg/system/process_unix.go @@ -1,3 +1,4 @@ +//go:build linux || freebsd || solaris || darwin // +build linux freebsd solaris darwin package system diff --git a/vendor/github.com/containers/storage/pkg/system/rm.go b/vendor/github.com/containers/storage/pkg/system/rm.go index 510e714283..5917fa251d 100644 --- a/vendor/github.com/containers/storage/pkg/system/rm.go +++ b/vendor/github.com/containers/storage/pkg/system/rm.go @@ -1,12 +1,13 @@ package system import ( + "errors" + "fmt" "os" "syscall" "time" "github.com/containers/storage/pkg/mount" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -29,6 +30,12 @@ func EnsureRemoveAll(dir string) error { exitOnErr := make(map[string]int) maxRetry := 100 + // Attempt a simple remove all first, this avoids the more expensive + // RecursiveUnmount call if not needed. + if err := os.RemoveAll(dir); err == nil { + return nil + } + // Attempt to unmount anything beneath this dir first if err := mount.RecursiveUnmount(dir); err != nil { logrus.Debugf("RecusiveUnmount on %s failed: %v", dir, err) @@ -40,6 +47,19 @@ func EnsureRemoveAll(dir string) error { return nil } + // If the RemoveAll fails with a permission error, we + // may have immutable files so try to remove the + // immutable flag and redo the RemoveAll. + if errors.Is(err, syscall.EPERM) { + if err = resetFileFlags(dir); err != nil { + return fmt.Errorf("resetting file flags: %w", err) + } + err = os.RemoveAll(dir) + if err == nil { + return nil + } + } + pe, ok := err.(*os.PathError) if !ok { return err @@ -62,12 +82,12 @@ func EnsureRemoveAll(dir string) error { continue } - if pe.Err != syscall.EBUSY { + if !IsEBUSY(pe.Err) { return err } if e := mount.Unmount(pe.Path); e != nil { - return errors.Wrapf(e, "error while removing %s", dir) + return fmt.Errorf("while removing %s: %w", dir, e) } if exitOnErr[pe.Path] == maxRetry { diff --git a/vendor/github.com/containers/storage/pkg/system/rm_common.go b/vendor/github.com/containers/storage/pkg/system/rm_common.go new file mode 100644 index 0000000000..117eb1d6dc --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/system/rm_common.go @@ -0,0 +1,10 @@ +//go:build !freebsd +// +build !freebsd + +package system + +// Reset file flags in a directory tree. This allows EnsureRemoveAll +// to delete trees which have the immutable flag set. +func resetFileFlags(dir string) error { + return nil +} diff --git a/vendor/github.com/containers/storage/pkg/system/rm_freebsd.go b/vendor/github.com/containers/storage/pkg/system/rm_freebsd.go new file mode 100644 index 0000000000..39a5de7aa4 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/system/rm_freebsd.go @@ -0,0 +1,17 @@ +package system + +import ( + "io/fs" + "path/filepath" +) + +// Reset file flags in a directory tree. This allows EnsureRemoveAll +// to delete trees which have the immutable flag set. +func resetFileFlags(dir string) error { + return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { + if err := Lchflags(path, 0); err != nil { + return err + } + return nil + }) +} diff --git a/vendor/github.com/containers/storage/pkg/system/stat_common.go b/vendor/github.com/containers/storage/pkg/system/stat_common.go new file mode 100644 index 0000000000..2f44d18b69 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/system/stat_common.go @@ -0,0 +1,12 @@ +//go:build !freebsd +// +build !freebsd + +package system + +type platformStatT struct{} + +// Flags return file flags if supported or zero otherwise +func (s StatT) Flags() uint32 { + _ = s.platformStatT // Silence warnings that StatT.platformStatT is unused (on these platforms) + return 0 +} diff --git a/vendor/github.com/containers/storage/pkg/system/stat_darwin.go b/vendor/github.com/containers/storage/pkg/system/stat_darwin.go index 715f05b938..57850a883f 100644 --- a/vendor/github.com/containers/storage/pkg/system/stat_darwin.go +++ b/vendor/github.com/containers/storage/pkg/system/stat_darwin.go @@ -4,10 +4,12 @@ import "syscall" // fromStatT converts a syscall.Stat_t type to a system.Stat_t type func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, + return &StatT{ + size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil + mtim: s.Mtimespec, + }, nil } diff --git a/vendor/github.com/containers/storage/pkg/system/stat_freebsd.go b/vendor/github.com/containers/storage/pkg/system/stat_freebsd.go index 715f05b938..4b95073a3f 100644 --- a/vendor/github.com/containers/storage/pkg/system/stat_freebsd.go +++ b/vendor/github.com/containers/storage/pkg/system/stat_freebsd.go @@ -2,12 +2,27 @@ package system import "syscall" +type platformStatT struct { + flags uint32 +} + +// Flags return file flags if supported or zero otherwise +func (s StatT) Flags() uint32 { + return s.flags +} + // fromStatT converts a syscall.Stat_t type to a system.Stat_t type func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, + st := &StatT{ + size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil + mtim: s.Mtimespec, + dev: s.Dev, + } + st.flags = s.Flags + st.dev = s.Dev + return st, nil } diff --git a/vendor/github.com/containers/storage/pkg/system/stat_linux.go b/vendor/github.com/containers/storage/pkg/system/stat_linux.go index af7af20fa4..e3d13463f6 100644 --- a/vendor/github.com/containers/storage/pkg/system/stat_linux.go +++ b/vendor/github.com/containers/storage/pkg/system/stat_linux.go @@ -4,12 +4,15 @@ import "syscall" // fromStatT converts a syscall.Stat_t type to a system.Stat_t type func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, + return &StatT{ + size: s.Size, mode: s.Mode, uid: s.Uid, gid: s.Gid, rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil + mtim: s.Mtim, + dev: uint64(s.Dev), + }, nil } // FromStatT converts a syscall.Stat_t type to a system.Stat_t type diff --git a/vendor/github.com/containers/storage/pkg/system/stat_openbsd.go b/vendor/github.com/containers/storage/pkg/system/stat_openbsd.go index b607dea946..a413e17148 100644 --- a/vendor/github.com/containers/storage/pkg/system/stat_openbsd.go +++ b/vendor/github.com/containers/storage/pkg/system/stat_openbsd.go @@ -4,10 +4,12 @@ import "syscall" // fromStatT converts a syscall.Stat_t type to a system.Stat_t type func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, + return &StatT{ + size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil + mtim: s.Mtim, + }, nil } diff --git a/vendor/github.com/containers/storage/pkg/system/stat_solaris.go b/vendor/github.com/containers/storage/pkg/system/stat_solaris.go index b607dea946..a413e17148 100644 --- a/vendor/github.com/containers/storage/pkg/system/stat_solaris.go +++ b/vendor/github.com/containers/storage/pkg/system/stat_solaris.go @@ -4,10 +4,12 @@ import "syscall" // fromStatT converts a syscall.Stat_t type to a system.Stat_t type func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, + return &StatT{ + size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil + mtim: s.Mtim, + }, nil } diff --git a/vendor/github.com/containers/storage/pkg/system/stat_unix.go b/vendor/github.com/containers/storage/pkg/system/stat_unix.go index 2fac918bfc..47ae899f8b 100644 --- a/vendor/github.com/containers/storage/pkg/system/stat_unix.go +++ b/vendor/github.com/containers/storage/pkg/system/stat_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package system @@ -17,6 +18,8 @@ type StatT struct { rdev uint64 size int64 mtim syscall.Timespec + dev uint64 + platformStatT } // Mode returns file's permission mode. @@ -49,6 +52,11 @@ func (s StatT) Mtim() syscall.Timespec { return s.mtim } +// Dev returns a unique identifier for owning filesystem +func (s StatT) Dev() uint64 { + return s.dev +} + // Stat takes a path to a file and returns // a system.StatT type pertaining to that file. // diff --git a/vendor/github.com/containers/storage/pkg/system/stat_windows.go b/vendor/github.com/containers/storage/pkg/system/stat_windows.go index d306360520..6d5c6c142e 100644 --- a/vendor/github.com/containers/storage/pkg/system/stat_windows.go +++ b/vendor/github.com/containers/storage/pkg/system/stat_windows.go @@ -11,6 +11,7 @@ type StatT struct { mode os.FileMode size int64 mtim time.Time + platformStatT } // Size returns file's size. @@ -42,6 +43,11 @@ func (s StatT) GID() uint32 { return 0 } +// Dev returns a unique identifier for owning filesystem +func (s StatT) Dev() uint64 { + return 0 +} + // Stat takes a path to a file and returns // a system.StatT type pertaining to that file. // @@ -59,5 +65,6 @@ func fromStatT(fi *os.FileInfo) (*StatT, error) { return &StatT{ size: (*fi).Size(), mode: (*fi).Mode(), - mtim: (*fi).ModTime()}, nil + mtim: (*fi).ModTime(), + }, nil } diff --git a/vendor/github.com/containers/storage/pkg/system/syscall_unix.go b/vendor/github.com/containers/storage/pkg/system/syscall_unix.go index 1bb852d11f..c4816c133e 100644 --- a/vendor/github.com/containers/storage/pkg/system/syscall_unix.go +++ b/vendor/github.com/containers/storage/pkg/system/syscall_unix.go @@ -1,9 +1,11 @@ +//go:build linux || freebsd || darwin // +build linux freebsd darwin package system import ( - "github.com/pkg/errors" + "errors" + "golang.org/x/sys/unix" ) diff --git a/vendor/github.com/containers/storage/pkg/system/umask.go b/vendor/github.com/containers/storage/pkg/system/umask.go index 5a10eda5af..ad0337db77 100644 --- a/vendor/github.com/containers/storage/pkg/system/umask.go +++ b/vendor/github.com/containers/storage/pkg/system/umask.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package system diff --git a/vendor/github.com/containers/storage/pkg/system/umask_windows.go b/vendor/github.com/containers/storage/pkg/system/umask_windows.go index 13f1de1769..9497596a01 100644 --- a/vendor/github.com/containers/storage/pkg/system/umask_windows.go +++ b/vendor/github.com/containers/storage/pkg/system/umask_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package system diff --git a/vendor/github.com/containers/storage/pkg/system/utimes_freebsd.go b/vendor/github.com/containers/storage/pkg/system/utimes_freebsd.go index 6a77524376..edc588a63f 100644 --- a/vendor/github.com/containers/storage/pkg/system/utimes_freebsd.go +++ b/vendor/github.com/containers/storage/pkg/system/utimes_freebsd.go @@ -10,13 +10,14 @@ import ( // LUtimesNano is used to change access and modification time of the specified path. // It's used for symbol link file because unix.UtimesNano doesn't support a NOFOLLOW flag atm. func LUtimesNano(path string, ts []syscall.Timespec) error { + atFdCwd := unix.AT_FDCWD + var _path *byte _path, err := unix.BytePtrFromString(path) if err != nil { return err } - - if _, _, err := unix.Syscall(unix.SYS_LUTIMES, uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), 0); err != 0 && err != unix.ENOSYS { + if _, _, err := unix.Syscall6(unix.SYS_UTIMENSAT, uintptr(atFdCwd), uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), unix.AT_SYMLINK_NOFOLLOW, 0, 0); err != 0 && err != unix.ENOSYS { return err } diff --git a/vendor/github.com/containers/storage/pkg/system/utimes_unsupported.go b/vendor/github.com/containers/storage/pkg/system/utimes_unsupported.go index 139714544d..843ecdc53a 100644 --- a/vendor/github.com/containers/storage/pkg/system/utimes_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/system/utimes_unsupported.go @@ -1,3 +1,4 @@ +//go:build !linux && !freebsd // +build !linux,!freebsd package system diff --git a/vendor/github.com/containers/storage/pkg/system/xattrs_darwin.go b/vendor/github.com/containers/storage/pkg/system/xattrs_darwin.go new file mode 100644 index 0000000000..75275b964e --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/system/xattrs_darwin.go @@ -0,0 +1,84 @@ +package system + +import ( + "bytes" + "os" + + "golang.org/x/sys/unix" +) + +const ( + // Value is larger than the maximum size allowed + E2BIG unix.Errno = unix.E2BIG + + // Operation not supported + EOPNOTSUPP unix.Errno = unix.EOPNOTSUPP +) + +// Lgetxattr retrieves the value of the extended attribute identified by attr +// and associated with the given path in the file system. +// Returns a []byte slice if the xattr is set and nil otherwise. +func Lgetxattr(path string, attr string) ([]byte, error) { + // Start with a 128 length byte array + dest := make([]byte, 128) + sz, errno := unix.Lgetxattr(path, attr, dest) + + for errno == unix.ERANGE { + // Buffer too small, use zero-sized buffer to get the actual size + sz, errno = unix.Lgetxattr(path, attr, []byte{}) + if errno != nil { + return nil, &os.PathError{Op: "lgetxattr", Path: path, Err: errno} + } + dest = make([]byte, sz) + sz, errno = unix.Lgetxattr(path, attr, dest) + } + + switch { + case errno == unix.ENOATTR: + return nil, nil + case errno != nil: + return nil, &os.PathError{Op: "lgetxattr", Path: path, Err: errno} + } + + return dest[:sz], nil +} + +// Lsetxattr sets the value of the extended attribute identified by attr +// and associated with the given path in the file system. +func Lsetxattr(path string, attr string, data []byte, flags int) error { + if err := unix.Lsetxattr(path, attr, data, flags); err != nil { + return &os.PathError{Op: "lsetxattr", Path: path, Err: err} + } + + return nil +} + +// Llistxattr lists extended attributes associated with the given path +// in the file system. +func Llistxattr(path string) ([]string, error) { + dest := make([]byte, 128) + sz, errno := unix.Llistxattr(path, dest) + + for errno == unix.ERANGE { + // Buffer too small, use zero-sized buffer to get the actual size + sz, errno = unix.Llistxattr(path, []byte{}) + if errno != nil { + return nil, &os.PathError{Op: "llistxattr", Path: path, Err: errno} + } + + dest = make([]byte, sz) + sz, errno = unix.Llistxattr(path, dest) + } + if errno != nil { + return nil, &os.PathError{Op: "llistxattr", Path: path, Err: errno} + } + + var attrs []string + for _, token := range bytes.Split(dest[:sz], []byte{0}) { + if len(token) > 0 { + attrs = append(attrs, string(token)) + } + } + + return attrs, nil +} diff --git a/vendor/github.com/containers/storage/pkg/system/xattrs_linux.go b/vendor/github.com/containers/storage/pkg/system/xattrs_linux.go index 10355848bd..6b47c4e717 100644 --- a/vendor/github.com/containers/storage/pkg/system/xattrs_linux.go +++ b/vendor/github.com/containers/storage/pkg/system/xattrs_linux.go @@ -13,6 +13,9 @@ const ( // Operation not supported EOPNOTSUPP unix.Errno = unix.EOPNOTSUPP + + // Value is too small or too large for maximum size allowed + EOVERFLOW unix.Errno = unix.EOVERFLOW ) // Lgetxattr retrieves the value of the extended attribute identified by attr diff --git a/vendor/github.com/containers/storage/pkg/system/xattrs_unsupported.go b/vendor/github.com/containers/storage/pkg/system/xattrs_unsupported.go index bc8b8e3a5f..8bd7acf1fb 100644 --- a/vendor/github.com/containers/storage/pkg/system/xattrs_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/system/xattrs_unsupported.go @@ -1,4 +1,5 @@ -// +build !linux +//go:build !linux && !darwin +// +build !linux,!darwin package system @@ -10,6 +11,9 @@ const ( // Operation not supported EOPNOTSUPP syscall.Errno = syscall.Errno(0) + + // Value is too small or too large for maximum size allowed + EOVERFLOW syscall.Errno = syscall.Errno(0) ) // Lgetxattr is not supported on platforms other than linux. diff --git a/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_cgo.go b/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_cgo.go index 4f441c32c5..08dbc661da 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_cgo.go +++ b/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_cgo.go @@ -1,3 +1,4 @@ +//go:build linux && cgo // +build linux,cgo package unshare diff --git a/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_nocgo.go b/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_nocgo.go index a5005403af..25054810aa 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_nocgo.go +++ b/vendor/github.com/containers/storage/pkg/unshare/getenv_linux_nocgo.go @@ -1,3 +1,4 @@ +//go:build linux && !cgo // +build linux,!cgo package unshare diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare.c b/vendor/github.com/containers/storage/pkg/unshare/unshare.c index c0e359b276..f5a7c3a259 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare.c +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare.c @@ -1,4 +1,4 @@ -#ifndef UNSHARE_NO_CODE_AT_ALL +#if !defined(UNSHARE_NO_CODE_AT_ALL) && defined(__linux__) #define _GNU_SOURCE #include diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare.go b/vendor/github.com/containers/storage/pkg/unshare/unshare.go index 53cfeb0ec4..00f397f350 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare.go +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare.go @@ -5,19 +5,12 @@ import ( "os" "os/user" "sync" - - "github.com/pkg/errors" - "github.com/syndtr/gocapability/capability" ) var ( homeDirOnce sync.Once homeDirErr error homeDir string - - hasCapSysAdminOnce sync.Once - hasCapSysAdminRet bool - hasCapSysAdminErr error ) // HomeDir returns the home directory for the current user. @@ -27,7 +20,7 @@ func HomeDir() (string, error) { if home == "" { usr, err := user.LookupId(fmt.Sprintf("%d", GetRootlessUID())) if err != nil { - homeDir, homeDirErr = "", errors.Wrapf(err, "unable to resolve HOME directory") + homeDir, homeDirErr = "", fmt.Errorf("unable to resolve HOME directory: %w", err) return } homeDir, homeDirErr = usr.HomeDir, nil @@ -37,20 +30,3 @@ func HomeDir() (string, error) { }) return homeDir, homeDirErr } - -// HasCapSysAdmin returns whether the current process has CAP_SYS_ADMIN. -func HasCapSysAdmin() (bool, error) { - hasCapSysAdminOnce.Do(func() { - currentCaps, err := capability.NewPid2(0) - if err != nil { - hasCapSysAdminErr = err - return - } - if err = currentCaps.Load(); err != nil { - hasCapSysAdminErr = err - return - } - hasCapSysAdminRet = currentCaps.Get(capability.EFFECTIVE, capability.CAP_SYS_ADMIN) - }) - return hasCapSysAdminRet, hasCapSysAdminErr -} diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_cgo.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_cgo.go index b3f8099f6a..fbfb90d599 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare_cgo.go +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_cgo.go @@ -1,10 +1,11 @@ -// +build linux,cgo,!gccgo +//go:build (linux && cgo && !gccgo) || (freebsd && cgo) +// +build linux,cgo,!gccgo freebsd,cgo package unshare // #cgo CFLAGS: -Wall // extern void _containers_unshare(void); -// void __attribute__((constructor)) init(void) { +// static void __attribute__((constructor)) init(void) { // _containers_unshare(); // } import "C" diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_darwin.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_darwin.go new file mode 100644 index 0000000000..86ac12ecab --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_darwin.go @@ -0,0 +1,54 @@ +//go:build darwin +// +build darwin + +package unshare + +import ( + "os" + + "github.com/containers/storage/pkg/idtools" + "github.com/opencontainers/runtime-spec/specs-go" +) + +const ( + // UsernsEnvName is the environment variable, if set indicates in rootless mode + UsernsEnvName = "_CONTAINERS_USERNS_CONFIGURED" +) + +// IsRootless tells us if we are running in rootless mode +func IsRootless() bool { + return true +} + +// GetRootlessUID returns the UID of the user in the parent userNS +func GetRootlessUID() int { + return os.Getuid() +} + +// RootlessEnv returns the environment settings for the rootless containers +func RootlessEnv() []string { + return append(os.Environ(), UsernsEnvName+"=") +} + +// MaybeReexecUsingUserNamespace re-exec the process in a new namespace +func MaybeReexecUsingUserNamespace(evenForRoot bool) { +} + +// GetHostIDMappings reads mappings for the specified process (or the current +// process if pid is "self" or an empty string) from the kernel. +func GetHostIDMappings(pid string) ([]specs.LinuxIDMapping, []specs.LinuxIDMapping, error) { + return nil, nil, nil +} + +// ParseIDMappings parses mapping triples. +func ParseIDMappings(uidmap, gidmap []string) ([]idtools.IDMap, []idtools.IDMap, error) { + uid, err := idtools.ParseIDMap(uidmap, "userns-uid-map") + if err != nil { + return nil, nil, err + } + gid, err := idtools.ParseIDMap(gidmap, "userns-gid-map") + if err != nil { + return nil, nil, err + } + return uid, gid, nil +} diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_freebsd.c b/vendor/github.com/containers/storage/pkg/unshare/unshare_freebsd.c new file mode 100644 index 0000000000..0b2f178869 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_freebsd.c @@ -0,0 +1,76 @@ +#if !defined(UNSHARE_NO_CODE_AT_ALL) && defined(__FreeBSD__) + + +#include +#include +#include +#include +#include +#include + +static int _containers_unshare_parse_envint(const char *envname) { + char *p, *q; + long l; + + p = getenv(envname); + if (p == NULL) { + return -1; + } + q = NULL; + l = strtol(p, &q, 10); + if ((q == NULL) || (*q != '\0')) { + fprintf(stderr, "Error parsing \"%s\"=\"%s\"!\n", envname, p); + _exit(1); + } + unsetenv(envname); + return l; +} + +void _containers_unshare(void) +{ + int pidfd, continuefd, n, pgrp, sid, ctty; + char buf[2048]; + + pidfd = _containers_unshare_parse_envint("_Containers-pid-pipe"); + if (pidfd != -1) { + snprintf(buf, sizeof(buf), "%llu", (unsigned long long) getpid()); + size_t size = write(pidfd, buf, strlen(buf)); + if (size != strlen(buf)) { + fprintf(stderr, "Error writing PID to pipe on fd %d: %m\n", pidfd); + _exit(1); + } + close(pidfd); + } + continuefd = _containers_unshare_parse_envint("_Containers-continue-pipe"); + if (continuefd != -1) { + n = read(continuefd, buf, sizeof(buf)); + if (n > 0) { + fprintf(stderr, "Error: %.*s\n", n, buf); + _exit(1); + } + close(continuefd); + } + sid = _containers_unshare_parse_envint("_Containers-setsid"); + if (sid == 1) { + if (setsid() == -1) { + fprintf(stderr, "Error during setsid: %m\n"); + _exit(1); + } + } + pgrp = _containers_unshare_parse_envint("_Containers-setpgrp"); + if (pgrp == 1) { + if (setpgrp(0, 0) == -1) { + fprintf(stderr, "Error during setpgrp: %m\n"); + _exit(1); + } + } + ctty = _containers_unshare_parse_envint("_Containers-ctty"); + if (ctty != -1) { + if (ioctl(ctty, TIOCSCTTY, 0) == -1) { + fprintf(stderr, "Error while setting controlling terminal to %d: %m\n", ctty); + _exit(1); + } + } +} + +#endif diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_freebsd.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_freebsd.go new file mode 100644 index 0000000000..7a44ca3013 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_freebsd.go @@ -0,0 +1,179 @@ +//go:build freebsd +// +build freebsd + +package unshare + +import ( + "bytes" + "errors" + "fmt" + "io" + "os" + "os/exec" + "runtime" + "strconv" + "syscall" + + "github.com/containers/storage/pkg/reexec" + "github.com/sirupsen/logrus" +) + +// Cmd wraps an exec.Cmd created by the reexec package in unshare(), +// and one day might handle setting ID maps and other related setting*s +// by triggering initialization code in the child. +type Cmd struct { + *exec.Cmd + Setsid bool + Setpgrp bool + Ctty *os.File + Hook func(pid int) error +} + +// Command creates a new Cmd which can be customized. +func Command(args ...string) *Cmd { + cmd := reexec.Command(args...) + return &Cmd{ + Cmd: cmd, + } +} + +func (c *Cmd) Start() error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + // Set environment variables to tell the child to synchronize its startup. + if c.Env == nil { + c.Env = os.Environ() + } + + // Create the pipe for reading the child's PID. + pidRead, pidWrite, err := os.Pipe() + if err != nil { + return fmt.Errorf("creating pid pipe: %w", err) + } + c.Env = append(c.Env, fmt.Sprintf("_Containers-pid-pipe=%d", len(c.ExtraFiles)+3)) + c.ExtraFiles = append(c.ExtraFiles, pidWrite) + + // Create the pipe for letting the child know to proceed. + continueRead, continueWrite, err := os.Pipe() + if err != nil { + pidRead.Close() + pidWrite.Close() + return fmt.Errorf("creating continue read/write pipe: %w", err) + } + c.Env = append(c.Env, fmt.Sprintf("_Containers-continue-pipe=%d", len(c.ExtraFiles)+3)) + c.ExtraFiles = append(c.ExtraFiles, continueRead) + + // Pass along other instructions. + if c.Setsid { + c.Env = append(c.Env, "_Containers-setsid=1") + } + if c.Setpgrp { + c.Env = append(c.Env, "_Containers-setpgrp=1") + } + if c.Ctty != nil { + c.Env = append(c.Env, fmt.Sprintf("_Containers-ctty=%d", len(c.ExtraFiles)+3)) + c.ExtraFiles = append(c.ExtraFiles, c.Ctty) + } + + // Make sure we clean up our pipes. + defer func() { + if pidRead != nil { + pidRead.Close() + } + if pidWrite != nil { + pidWrite.Close() + } + if continueRead != nil { + continueRead.Close() + } + if continueWrite != nil { + continueWrite.Close() + } + }() + + // Start the new process. + err = c.Cmd.Start() + if err != nil { + return err + } + + // Close the ends of the pipes that the parent doesn't need. + continueRead.Close() + continueRead = nil + pidWrite.Close() + pidWrite = nil + + // Read the child's PID from the pipe. + pidString := "" + b := new(bytes.Buffer) + if _, err := io.Copy(b, pidRead); err != nil { + return fmt.Errorf("reading child PID: %w", err) + } + pidString = b.String() + pid, err := strconv.Atoi(pidString) + if err != nil { + fmt.Fprintf(continueWrite, "error parsing PID %q: %v", pidString, err) + return fmt.Errorf("parsing PID %q: %w", pidString, err) + } + + // Run any additional setup that we want to do before the child starts running proper. + if c.Hook != nil { + if err = c.Hook(pid); err != nil { + fmt.Fprintf(continueWrite, "hook error: %v", err) + return err + } + } + + return nil +} + +func (c *Cmd) Run() error { + if err := c.Start(); err != nil { + return err + } + return c.Wait() +} + +func (c *Cmd) CombinedOutput() ([]byte, error) { + return nil, errors.New("unshare: CombinedOutput() not implemented") +} + +func (c *Cmd) Output() ([]byte, error) { + return nil, errors.New("unshare: Output() not implemented") +} + +type Runnable interface { + Run() error +} + +// ExecRunnable runs the specified unshare command, captures its exit status, +// and exits with the same status. +func ExecRunnable(cmd Runnable, cleanup func()) { + exit := func(status int) { + if cleanup != nil { + cleanup() + } + os.Exit(status) + } + if err := cmd.Run(); err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + if exitError.ProcessState.Exited() { + if waitStatus, ok := exitError.ProcessState.Sys().(syscall.WaitStatus); ok { + if waitStatus.Exited() { + logrus.Debugf("%v", exitError) + exit(waitStatus.ExitStatus()) + } + if waitStatus.Signaled() { + logrus.Debugf("%v", exitError) + exit(int(waitStatus.Signal()) + 128) + } + } + } + } + logrus.Errorf("%v", err) + logrus.Errorf("(Unable to determine exit status)") + exit(1) + } + exit(0) +} diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_gccgo.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_gccgo.go index 2f95da7d8e..21a43d38cb 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare_gccgo.go +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_gccgo.go @@ -1,10 +1,11 @@ +//go:build linux && cgo && gccgo // +build linux,cgo,gccgo package unshare // #cgo CFLAGS: -Wall -Wextra // extern void _containers_unshare(void); -// void __attribute__((constructor)) init(void) { +// static void __attribute__((constructor)) init(void) { // _containers_unshare(); // } import "C" diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go index 6d351ce80a..e169633d05 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_linux.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package unshare @@ -5,10 +6,12 @@ package unshare import ( "bufio" "bytes" + "errors" "fmt" "io" "os" "os/exec" + "os/signal" "os/user" "runtime" "strconv" @@ -19,7 +22,6 @@ import ( "github.com/containers/storage/pkg/idtools" "github.com/containers/storage/pkg/reexec" "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/syndtr/gocapability/capability" ) @@ -31,9 +33,9 @@ type Cmd struct { *exec.Cmd UnshareFlags int UseNewuidmap bool - UidMappings []specs.LinuxIDMapping // nolint: golint + UidMappings []specs.LinuxIDMapping // nolint: revive,golint UseNewgidmap bool - GidMappings []specs.LinuxIDMapping // nolint: golint + GidMappings []specs.LinuxIDMapping // nolint: revive,golint GidMappingsEnableSetgroups bool Setsid bool Setpgrp bool @@ -75,6 +77,28 @@ func getRootlessGID() int { return os.Getegid() } +// IsSetID checks if specified path has correct FileMode (Setuid|SETGID) or the +// matching file capability +func IsSetID(path string, modeid os.FileMode, capid capability.Cap) (bool, error) { + info, err := os.Stat(path) + if err != nil { + return false, err + } + + mode := info.Mode() + if mode&modeid == modeid { + return true, nil + } + cap, err := capability.NewFile2(path) + if err != nil { + return false, err + } + if err := cap.Load(); err != nil { + return false, err + } + return cap.Get(capability.EFFECTIVE, capid), nil +} + func (c *Cmd) Start() error { runtime.LockOSThread() defer runtime.UnlockOSThread() @@ -95,7 +119,7 @@ func (c *Cmd) Start() error { // Create the pipe for reading the child's PID. pidRead, pidWrite, err := os.Pipe() if err != nil { - return errors.Wrapf(err, "error creating pid pipe") + return fmt.Errorf("creating pid pipe: %w", err) } c.Env = append(c.Env, fmt.Sprintf("_Containers-pid-pipe=%d", len(c.ExtraFiles)+3)) c.ExtraFiles = append(c.ExtraFiles, pidWrite) @@ -105,7 +129,7 @@ func (c *Cmd) Start() error { if err != nil { pidRead.Close() pidWrite.Close() - return errors.Wrapf(err, "error creating pid pipe") + return fmt.Errorf("creating continue read/write pipe: %w", err) } c.Env = append(c.Env, fmt.Sprintf("_Containers-continue-pipe=%d", len(c.ExtraFiles)+3)) c.ExtraFiles = append(c.ExtraFiles, continueRead) @@ -151,16 +175,15 @@ func (c *Cmd) Start() error { pidWrite = nil // Read the child's PID from the pipe. - pidString := "" b := new(bytes.Buffer) if _, err := io.Copy(b, pidRead); err != nil { - return errors.Wrapf(err, "Reading child PID") + return fmt.Errorf("reading child PID: %w", err) } - pidString = b.String() + pidString := b.String() pid, err := strconv.Atoi(pidString) if err != nil { fmt.Fprintf(continueWrite, "error parsing PID %q: %v", pidString, err) - return errors.Wrapf(err, "error parsing PID %q", pidString) + return fmt.Errorf("parsing PID %q: %w", pidString, err) } pidString = fmt.Sprintf("%d", pid) @@ -170,26 +193,26 @@ func (c *Cmd) Start() error { setgroups, err := os.OpenFile(fmt.Sprintf("/proc/%s/setgroups", pidString), os.O_TRUNC|os.O_WRONLY, 0) if err != nil { fmt.Fprintf(continueWrite, "error opening setgroups: %v", err) - return errors.Wrapf(err, "error opening /proc/%s/setgroups", pidString) + return fmt.Errorf("opening /proc/%s/setgroups: %w", pidString, err) } defer setgroups.Close() if c.GidMappingsEnableSetgroups { if _, err := fmt.Fprintf(setgroups, "allow"); err != nil { fmt.Fprintf(continueWrite, "error writing \"allow\" to setgroups: %v", err) - return errors.Wrapf(err, "error opening \"allow\" to /proc/%s/setgroups", pidString) + return fmt.Errorf("opening \"allow\" to /proc/%s/setgroups: %w", pidString, err) } } else { if _, err := fmt.Fprintf(setgroups, "deny"); err != nil { fmt.Fprintf(continueWrite, "error writing \"deny\" to setgroups: %v", err) - return errors.Wrapf(err, "error writing \"deny\" to /proc/%s/setgroups", pidString) + return fmt.Errorf("writing \"deny\" to /proc/%s/setgroups: %w", pidString, err) } } if len(c.UidMappings) == 0 || len(c.GidMappings) == 0 { uidmap, gidmap, err := GetHostIDMappings("") if err != nil { - fmt.Fprintf(continueWrite, "Reading ID mappings in parent: %v", err) - return errors.Wrapf(err, "Reading ID mappings in parent") + fmt.Fprintf(continueWrite, "error reading ID mappings in parent: %v", err) + return fmt.Errorf("reading ID mappings in parent: %w", err) } if len(c.UidMappings) == 0 { c.UidMappings = uidmap @@ -214,15 +237,26 @@ func (c *Cmd) Start() error { gidmapSet := false // Set the GID map. if c.UseNewgidmap { - cmd := exec.Command("newgidmap", append([]string{pidString}, strings.Fields(strings.Replace(g.String(), "\n", " ", -1))...)...) + path, err := exec.LookPath("newgidmap") + if err != nil { + return fmt.Errorf("finding newgidmap: %w", err) + } + cmd := exec.Command(path, append([]string{pidString}, strings.Fields(strings.Replace(g.String(), "\n", " ", -1))...)...) g.Reset() cmd.Stdout = g cmd.Stderr = g - err := cmd.Run() - if err == nil { + if err := cmd.Run(); err == nil { gidmapSet = true } else { - logrus.Warnf("Error running newgidmap: %v: %s", err, g.String()) + logrus.Warnf("running newgidmap: %v: %s", err, g.String()) + isSetgid, err := IsSetID(path, os.ModeSetgid, capability.CAP_SETGID) + if err != nil { + logrus.Warnf("Failed to check for setgid on %s: %v", path, err) + } else { + if !isSetgid { + logrus.Warnf("%s should be setgid or have filecaps setgid", path) + } + } logrus.Warnf("Falling back to single mapping") g.Reset() g.Write([]byte(fmt.Sprintf("0 %d 1\n", os.Getegid()))) @@ -233,23 +267,23 @@ func (c *Cmd) Start() error { setgroups, err := os.OpenFile(fmt.Sprintf("/proc/%s/setgroups", pidString), os.O_TRUNC|os.O_WRONLY, 0) if err != nil { fmt.Fprintf(continueWrite, "error opening /proc/%s/setgroups: %v", pidString, err) - return errors.Wrapf(err, "error opening /proc/%s/setgroups", pidString) + return fmt.Errorf("opening /proc/%s/setgroups: %w", pidString, err) } defer setgroups.Close() if _, err := fmt.Fprintf(setgroups, "deny"); err != nil { fmt.Fprintf(continueWrite, "error writing 'deny' to /proc/%s/setgroups: %v", pidString, err) - return errors.Wrapf(err, "error writing 'deny' to /proc/%s/setgroups", pidString) + return fmt.Errorf("writing 'deny' to /proc/%s/setgroups: %w", pidString, err) } } gidmap, err := os.OpenFile(fmt.Sprintf("/proc/%s/gid_map", pidString), os.O_TRUNC|os.O_WRONLY, 0) if err != nil { - fmt.Fprintf(continueWrite, "error opening /proc/%s/gid_map: %v", pidString, err) - return errors.Wrapf(err, "error opening /proc/%s/gid_map", pidString) + fmt.Fprintf(continueWrite, "opening /proc/%s/gid_map: %v", pidString, err) + return fmt.Errorf("opening /proc/%s/gid_map: %w", pidString, err) } defer gidmap.Close() if _, err := fmt.Fprintf(gidmap, "%s", g.String()); err != nil { - fmt.Fprintf(continueWrite, "error writing %q to /proc/%s/gid_map: %v", g.String(), pidString, err) - return errors.Wrapf(err, "error writing %q to /proc/%s/gid_map", g.String(), pidString) + fmt.Fprintf(continueWrite, "writing %q to /proc/%s/gid_map: %v", g.String(), pidString, err) + return fmt.Errorf("writing %q to /proc/%s/gid_map: %w", g.String(), pidString, err) } } } @@ -261,17 +295,29 @@ func (c *Cmd) Start() error { fmt.Fprintf(u, "%d %d %d\n", m.ContainerID, m.HostID, m.Size) } uidmapSet := false - // Set the GID map. + // Set the UID map. if c.UseNewuidmap { - cmd := exec.Command("newuidmap", append([]string{pidString}, strings.Fields(strings.Replace(u.String(), "\n", " ", -1))...)...) + path, err := exec.LookPath("newuidmap") + if err != nil { + return fmt.Errorf("finding newuidmap: %w", err) + } + cmd := exec.Command(path, append([]string{pidString}, strings.Fields(strings.Replace(u.String(), "\n", " ", -1))...)...) u.Reset() cmd.Stdout = u cmd.Stderr = u - err := cmd.Run() - if err == nil { + if err := cmd.Run(); err == nil { uidmapSet = true } else { logrus.Warnf("Error running newuidmap: %v: %s", err, u.String()) + isSetuid, err := IsSetID(path, os.ModeSetuid, capability.CAP_SETUID) + if err != nil { + logrus.Warnf("Failed to check for setuid on %s: %v", path, err) + } else { + if !isSetuid { + logrus.Warnf("%s should be setuid or have filecaps setuid", path) + } + } + logrus.Warnf("Falling back to single mapping") u.Reset() u.Write([]byte(fmt.Sprintf("0 %d 1\n", os.Geteuid()))) @@ -281,12 +327,12 @@ func (c *Cmd) Start() error { uidmap, err := os.OpenFile(fmt.Sprintf("/proc/%s/uid_map", pidString), os.O_TRUNC|os.O_WRONLY, 0) if err != nil { fmt.Fprintf(continueWrite, "error opening /proc/%s/uid_map: %v", pidString, err) - return errors.Wrapf(err, "error opening /proc/%s/uid_map", pidString) + return fmt.Errorf("opening /proc/%s/uid_map: %w", pidString, err) } defer uidmap.Close() if _, err := fmt.Fprintf(uidmap, "%s", u.String()); err != nil { fmt.Fprintf(continueWrite, "error writing %q to /proc/%s/uid_map: %v", u.String(), pidString, err) - return errors.Wrapf(err, "error writing %q to /proc/%s/uid_map", u.String(), pidString) + return fmt.Errorf("writing %q to /proc/%s/uid_map: %w", u.String(), pidString, err) } } } @@ -296,12 +342,12 @@ func (c *Cmd) Start() error { oomScoreAdj, err := os.OpenFile(fmt.Sprintf("/proc/%s/oom_score_adj", pidString), os.O_TRUNC|os.O_WRONLY, 0) if err != nil { fmt.Fprintf(continueWrite, "error opening oom_score_adj: %v", err) - return errors.Wrapf(err, "error opening /proc/%s/oom_score_adj", pidString) + return fmt.Errorf("opening /proc/%s/oom_score_adj: %w", pidString, err) } defer oomScoreAdj.Close() if _, err := fmt.Fprintf(oomScoreAdj, "%d\n", *c.OOMScoreAdj); err != nil { fmt.Fprintf(continueWrite, "error writing \"%d\" to oom_score_adj: %v", c.OOMScoreAdj, err) - return errors.Wrapf(err, "error writing \"%d\" to /proc/%s/oom_score_adj", c.OOMScoreAdj, pidString) + return fmt.Errorf("writing \"%d\" to /proc/%s/oom_score_adj: %w", c.OOMScoreAdj, pidString, err) } } // Run any additional setup that we want to do before the child starts running proper. @@ -340,10 +386,47 @@ const ( UsernsEnvName = "_CONTAINERS_USERNS_CONFIGURED" ) +// hasFullUsersMappings checks whether the current user namespace has all the IDs mapped. +func hasFullUsersMappings() (bool, error) { + content, err := os.ReadFile("/proc/self/uid_map") + if err != nil { + return false, err + } + // The kernel rejects attempts to create mappings where either starting + // point is (u32)-1: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/user_namespace.c?id=af3e9579ecfb#n1006 . + // So, if the uid_map contains 4294967295, the entire IDs space is available in the + // user namespace, so it is likely the initial user namespace. + return bytes.Contains(content, []byte("4294967295")), nil +} + +var ( + hasCapSysAdminOnce sync.Once + hasCapSysAdminRet bool + hasCapSysAdminErr error +) + // IsRootless tells us if we are running in rootless mode func IsRootless() bool { isRootlessOnce.Do(func() { isRootless = getRootlessUID() != 0 || getenv(UsernsEnvName) != "" + if !isRootless { + hasCapSysAdmin, err := HasCapSysAdmin() + if err != nil { + logrus.Warnf("Failed to read CAP_SYS_ADMIN presence for the current process") + } + if err == nil && !hasCapSysAdmin { + isRootless = true + } + } + if !isRootless { + hasMappings, err := hasFullUsersMappings() + if err != nil { + logrus.Warnf("Failed to read current user namespace mappings") + } + if err == nil && !hasMappings { + isRootless = true + } + } }) return isRootless } @@ -367,7 +450,7 @@ type Runnable interface { Run() error } -func bailOnError(err error, format string, a ...interface{}) { // nolint: golint,goprintffuncname +func bailOnError(err error, format string, a ...interface{}) { // nolint: revive,goprintffuncname if err != nil { if format != "" { logrus.Errorf("%s: %v", fmt.Sprintf(format, a...), err) @@ -381,7 +464,7 @@ func bailOnError(err error, format string, a ...interface{}) { // nolint: golint // MaybeReexecUsingUserNamespace re-exec the process in a new namespace func MaybeReexecUsingUserNamespace(evenForRoot bool) { // If we've already been through this once, no need to try again. - if os.Geteuid() == 0 && IsRootless() { + if os.Geteuid() == 0 && GetRootlessUID() > 0 { return } @@ -484,6 +567,30 @@ func MaybeReexecUsingUserNamespace(evenForRoot bool) { // Finish up. logrus.Debugf("Running %+v with environment %+v, UID map %+v, and GID map %+v", cmd.Cmd.Args, os.Environ(), cmd.UidMappings, cmd.GidMappings) + + // Forward SIGHUP, SIGINT, and SIGTERM to our child process. + interrupted := make(chan os.Signal, 100) + defer func() { + signal.Stop(interrupted) + close(interrupted) + }() + cmd.Hook = func(int) error { + go func() { + for receivedSignal := range interrupted { + cmd.Cmd.Process.Signal(receivedSignal) + } + }() + return nil + } + signal.Notify(interrupted, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) + + // Make sure our child process gets SIGKILLed if we exit, for whatever + // reason, before it does. + if cmd.Cmd.SysProcAttr == nil { + cmd.Cmd.SysProcAttr = &syscall.SysProcAttr{} + } + cmd.Cmd.SysProcAttr.Pdeathsig = syscall.SIGKILL + ExecRunnable(cmd, nil) } @@ -497,15 +604,15 @@ func ExecRunnable(cmd Runnable, cleanup func()) { os.Exit(status) } if err := cmd.Run(); err != nil { - if exitError, ok := errors.Cause(err).(*exec.ExitError); ok { + if exitError, ok := err.(*exec.ExitError); ok { if exitError.ProcessState.Exited() { if waitStatus, ok := exitError.ProcessState.Sys().(syscall.WaitStatus); ok { if waitStatus.Exited() { - logrus.Errorf("%v", exitError) + logrus.Debugf("%v", exitError) exit(waitStatus.ExitStatus()) } if waitStatus.Signaled() { - logrus.Errorf("%v", exitError) + logrus.Debugf("%v", exitError) exit(int(waitStatus.Signal()) + 128) } } @@ -523,7 +630,7 @@ func getHostIDMappings(path string) ([]specs.LinuxIDMapping, error) { var mappings []specs.LinuxIDMapping f, err := os.Open(path) if err != nil { - return nil, errors.Wrapf(err, "Reading ID mappings from %q", path) + return nil, fmt.Errorf("reading ID mappings from %q: %w", path, err) } defer f.Close() scanner := bufio.NewScanner(f) @@ -531,19 +638,19 @@ func getHostIDMappings(path string) ([]specs.LinuxIDMapping, error) { line := scanner.Text() fields := strings.Fields(line) if len(fields) != 3 { - return nil, errors.Errorf("line %q from %q has %d fields, not 3", line, path, len(fields)) + return nil, fmt.Errorf("line %q from %q has %d fields, not 3", line, path, len(fields)) } cid, err := strconv.ParseUint(fields[0], 10, 32) if err != nil { - return nil, errors.Wrapf(err, "error parsing container ID value %q from line %q in %q", fields[0], line, path) + return nil, fmt.Errorf("parsing container ID value %q from line %q in %q: %w", fields[0], line, path, err) } hid, err := strconv.ParseUint(fields[1], 10, 32) if err != nil { - return nil, errors.Wrapf(err, "error parsing host ID value %q from line %q in %q", fields[1], line, path) + return nil, fmt.Errorf("parsing host ID value %q from line %q in %q: %w", fields[1], line, path, err) } size, err := strconv.ParseUint(fields[2], 10, 32) if err != nil { - return nil, errors.Wrapf(err, "error parsing size value %q from line %q in %q", fields[2], line, path) + return nil, fmt.Errorf("parsing size value %q from line %q in %q: %w", fields[2], line, path, err) } mappings = append(mappings, specs.LinuxIDMapping{ContainerID: uint32(cid), HostID: uint32(hid), Size: uint32(size)}) } @@ -571,7 +678,7 @@ func GetHostIDMappings(pid string) ([]specs.LinuxIDMapping, []specs.LinuxIDMappi func GetSubIDMappings(user, group string) ([]specs.LinuxIDMapping, []specs.LinuxIDMapping, error) { mappings, err := idtools.NewIDMappings(user, group) if err != nil { - return nil, nil, errors.Wrapf(err, "Reading subuid mappings for user %q and subgid mappings for group %q", user, group) + return nil, nil, fmt.Errorf("reading subuid mappings for user %q and subgid mappings for group %q: %w", user, group, err) } var uidmap, gidmap []specs.LinuxIDMapping for _, m := range mappings.UIDs() { @@ -603,3 +710,20 @@ func ParseIDMappings(uidmap, gidmap []string) ([]idtools.IDMap, []idtools.IDMap, } return uid, gid, nil } + +// HasCapSysAdmin returns whether the current process has CAP_SYS_ADMIN. +func HasCapSysAdmin() (bool, error) { + hasCapSysAdminOnce.Do(func() { + currentCaps, err := capability.NewPid2(0) + if err != nil { + hasCapSysAdminErr = err + return + } + if err = currentCaps.Load(); err != nil { + hasCapSysAdminErr = err + return + } + hasCapSysAdminRet = currentCaps.Get(capability.EFFECTIVE, capability.CAP_SYS_ADMIN) + }) + return hasCapSysAdminRet, hasCapSysAdminErr +} diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go index bf4d567b8a..66dd545966 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go @@ -1,4 +1,5 @@ -// +build !linux +//go:build !linux && !darwin +// +build !linux,!darwin package unshare @@ -43,3 +44,8 @@ func GetHostIDMappings(pid string) ([]specs.LinuxIDMapping, []specs.LinuxIDMappi func ParseIDMappings(uidmap, gidmap []string) ([]idtools.IDMap, []idtools.IDMap, error) { return nil, nil, nil } + +// HasCapSysAdmin returns whether the current process has CAP_SYS_ADMIN. +func HasCapSysAdmin() (bool, error) { + return os.Geteuid() == 0, nil +} diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported_cgo.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported_cgo.go index d5f2d22a80..a6b38eda8f 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported_cgo.go +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported_cgo.go @@ -1,4 +1,5 @@ -// +build !linux,cgo +//go:build cgo && !(linux || freebsd) +// +build cgo,!linux,!freebsd package unshare diff --git a/vendor/github.com/docker/cli/cli/config/configfile/file.go b/vendor/github.com/docker/cli/cli/config/configfile/file.go index 609a88c278..5db7f8b827 100644 --- a/vendor/github.com/docker/cli/cli/config/configfile/file.go +++ b/vendor/github.com/docker/cli/cli/config/configfile/file.go @@ -37,7 +37,6 @@ type ConfigFile struct { PruneFilters []string `json:"pruneFilters,omitempty"` Proxies map[string]ProxyConfig `json:"proxies,omitempty"` Experimental string `json:"experimental,omitempty"` - StackOrchestrator string `json:"stackOrchestrator,omitempty"` // Deprecated: swarm is now the default orchestrator, and this option is ignored. CurrentContext string `json:"currentContext,omitempty"` CLIPluginsExtraDirs []string `json:"cliPluginsExtraDirs,omitempty"` Plugins map[string]map[string]string `json:"plugins,omitempty"` diff --git a/vendor/github.com/docker/cli/cli/connhelper/commandconn/commandconn.go b/vendor/github.com/docker/cli/cli/connhelper/commandconn/commandconn.go index a0b035c92a..202ddb84cc 100644 --- a/vendor/github.com/docker/cli/cli/connhelper/commandconn/commandconn.go +++ b/vendor/github.com/docker/cli/cli/connhelper/commandconn/commandconn.go @@ -32,7 +32,7 @@ import ( ) // New returns net.Conn -func New(ctx context.Context, cmd string, args ...string) (net.Conn, error) { +func New(_ context.Context, cmd string, args ...string) (net.Conn, error) { var ( c commandConn err error diff --git a/vendor/github.com/docker/cli/cli/connhelper/connhelper.go b/vendor/github.com/docker/cli/cli/connhelper/connhelper.go index 9ac9d6744d..397149c3e2 100644 --- a/vendor/github.com/docker/cli/cli/connhelper/connhelper.go +++ b/vendor/github.com/docker/cli/cli/connhelper/connhelper.go @@ -47,7 +47,12 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*ConnectionHelper } return &ConnectionHelper{ Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) { - return commandconn.New(ctx, "ssh", append(sshFlags, sp.Args("docker", "system", "dial-stdio")...)...) + args := []string{"docker"} + if sp.Path != "" { + args = append(args, "--host", "unix://"+sp.Path) + } + args = append(args, "system", "dial-stdio") + return commandconn.New(ctx, "ssh", append(sshFlags, sp.Args(args...)...)...) }, Host: "http://docker.example.com", }, nil diff --git a/vendor/github.com/docker/cli/cli/connhelper/ssh/ssh.go b/vendor/github.com/docker/cli/cli/connhelper/ssh/ssh.go index bde01ae7f7..fb4c911105 100644 --- a/vendor/github.com/docker/cli/cli/connhelper/ssh/ssh.go +++ b/vendor/github.com/docker/cli/cli/connhelper/ssh/ssh.go @@ -30,9 +30,7 @@ func ParseURL(daemonURL string) (*Spec, error) { return nil, errors.Errorf("no host specified") } sp.Port = u.Port() - if u.Path != "" { - return nil, errors.Errorf("extra path after the host: %q", u.Path) - } + sp.Path = u.Path if u.RawQuery != "" { return nil, errors.Errorf("extra query after the host: %q", u.RawQuery) } @@ -47,6 +45,7 @@ type Spec struct { User string Host string Port string + Path string } // Args returns args except "ssh" itself combined with optional additional command args diff --git a/vendor/github.com/docker/distribution/reference/reference.go b/vendor/github.com/docker/distribution/reference/reference.go index 8c0c23b2fe..b7cd00b0d6 100644 --- a/vendor/github.com/docker/distribution/reference/reference.go +++ b/vendor/github.com/docker/distribution/reference/reference.go @@ -3,13 +3,13 @@ // // Grammar // -// reference := name [ ":" tag ] [ "@" digest ] +// reference := name [ ":" tag ] [ "@" digest ] // name := [domain '/'] path-component ['/' path-component]* // domain := domain-component ['.' domain-component]* [':' port-number] // domain-component := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ // port-number := /[0-9]+/ // path-component := alpha-numeric [separator alpha-numeric]* -// alpha-numeric := /[a-z0-9]+/ +// alpha-numeric := /[a-z0-9]+/ // separator := /[_.]|__|[-]*/ // // tag := /[\w][\w.-]{0,127}/ diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS index dffacff112..b314181925 100644 --- a/vendor/github.com/docker/docker/AUTHORS +++ b/vendor/github.com/docker/docker/AUTHORS @@ -1,5 +1,6 @@ -# This file lists all individuals having contributed content to the repository. -# For how it is generated, see `hack/generate-authors.sh`. +# File @generated by hack/generate-authors.sh. DO NOT EDIT. +# This file lists all contributors to the repository. +# See hack/generate-authors.sh to make modifications. Aanand Prasad Aaron Davidson @@ -7,16 +8,17 @@ Aaron Feng Aaron Hnatiw Aaron Huslage Aaron L. Xu -Aaron Lehmann +Aaron Lehmann Aaron Welch -Aaron.L.Xu Abel Muiño Abhijeet Kasurde -Abhinandan Prativadi +Abhinandan Prativadi Abhinav Ajgaonkar Abhishek Chanda Abhishek Sharma Abin Shahab +Abirdcfly +Ada Mancini Adam Avilla Adam Dobrawy Adam Eijdenberg @@ -26,6 +28,8 @@ Adam Mills Adam Pointer Adam Singer Adam Walz +Adam Williams +AdamKorcz Addam Hardy Aditi Rajagopal Aditya @@ -51,6 +55,7 @@ Akihiro Suda Akim Demaille Akira Koyasu Akshay Karle +Akshay Moghe Al Tobey alambike Alan Hoyle @@ -58,9 +63,11 @@ Alan Scherger Alan Thompson Albert Callarisa Albert Zhang -Albin Kerouanton +Albin Kerouanton +Alec Benson Alejandro González Hevia Aleksa Sarai +Aleksandr Chebotov Aleksandrs Fadins Alena Prokharchyk Alessandro Boch @@ -72,14 +79,17 @@ Alex Crawford Alex Ellis Alex Gaynor Alex Goodman +Alex Nordlund Alex Olshansky Alex Samorukov +Alex Stockinger Alex Warhawk Alexander Artemenko Alexander Boyd Alexander Larsson Alexander Midlash -Alexander Morozov +Alexander Morozov +Alexander Polakov Alexander Shopov Alexandre Beslic Alexandre Garnier @@ -90,7 +100,8 @@ Alexei Margasov Alexey Guskov Alexey Kotlyarov Alexey Shamrin -Alexis THOMAS +Alexis Ries +Alexis Thomas Alfred Landrum Ali Dehghani Alicia Lauerman @@ -103,6 +114,7 @@ Alvin Deng Alvin Richards amangoel Amen Belayneh +Ameya Gawde Amir Goldstein Amit Bakshi Amit Krishnan @@ -126,6 +138,7 @@ Andreas Köhler Andreas Savvides Andreas Tiefenthaler Andrei Gherzan +Andrei Ushakov Andrei Vagin Andrew C. Bodine Andrew Clay Shafer @@ -135,6 +148,7 @@ Andrew Gerrand Andrew Guenther Andrew He Andrew Hsu +Andrew Kim Andrew Kuklewicz Andrew Macgregor Andrew Macpherson @@ -150,15 +164,17 @@ Andrey Kolomentsev Andrey Petrov Andrey Stolbovsky André Martins -andy Andy Chambers andy diller Andy Goldstein Andy Kipp +Andy Lindeman Andy Rothfusz Andy Smith Andy Wilson +Andy Zhang Anes Hasicic +Angel Velazquez Anil Belur Anil Madhavapeddy Ankit Jain @@ -179,20 +195,25 @@ Antonio Murdaca Antonis Kalipetis Antony Messerli Anuj Bahuguna +Anuj Varma Anusha Ragunathan +Anyu Wang apocas Arash Deshmeh +arcosx ArikaChen -Arko Dasgupta +Arko Dasgupta Arnaud Lefebvre -Arnaud Porterie +Arnaud Porterie Arnaud Rebillout +Artem Khramov Arthur Barr Arthur Gautier Artur Meyster Arun Gupta Asad Saeeduddin Asbjørn Enge +Austin Vazquez averagehuman Avi Das Avi Kivity @@ -200,17 +221,21 @@ Avi Miller Avi Vaid ayoshitake Azat Khuyiyakhmetov +Bao Yonglei Bardia Keyoumarsi Barnaby Gray Barry Allard Bartłomiej Piotrowski Bastiaan Bakker +Bastien Pascard bdevloed +Bearice Ren Ben Bonnefoy Ben Firshman Ben Golub Ben Gould Ben Hall +Ben Langfeld Ben Sargent Ben Severson Ben Toews @@ -218,6 +243,8 @@ Ben Wiklund Benjamin Atkin Benjamin Baker Benjamin Boudreau +Benjamin Böhmke +Benjamin Wang Benjamin Yolken Benny Ng Benoit Chesneau @@ -231,12 +258,15 @@ Bhiraj Butala Bhumika Bayani Bilal Amarni Bill Wang +Billy Ridgway Bily Zhang Bin Liu Bingshen Wang +Bjorn Neergaard Blake Geno Boaz Shuster bobby abbott +Bojun Zhu Boqin Qin Boris Pruessmann Boshi Lian @@ -252,6 +282,7 @@ Brendan Dixon Brent Salisbury Brett Higgins Brett Kochendorfer +Brett Milford Brett Randall Brian (bex) Exelbierd Brian Bland @@ -282,6 +313,7 @@ Byung Kang Caleb Spare Calen Pennington Cameron Boehmer +Cameron Sparr Cameron Spear Campbell Allen Candid Dauth @@ -316,6 +348,7 @@ Charlie Drage Charlie Lewis Chase Bolt ChaYoung You +Chee Hau Lim Chen Chao Chen Chuanliang Chen Hanxiao @@ -325,6 +358,7 @@ Chen Qiu Cheng-mean Liu Chengfei Shang Chengguang Xu +Chenyang Yan chenyuzhu Chetan Birajdar Chewey @@ -339,6 +373,7 @@ Chris Fordham Chris Gavin Chris Gibson Chris Khoo +Chris Kreussling (Flatbush Gardener) Chris McKinnel Chris McKinnel Chris Price @@ -351,6 +386,7 @@ Chris Telfer Chris Wahl Chris Weyl Chris White +Christian Becker Christian Berendt Christian Brauner Christian Böhme @@ -359,6 +395,7 @@ Christian Persson Christian Rotzoll Christian Simon Christian Stefanescu +Christoph Ziebuhr Christophe Mehay Christophe Troestler Christophe Vidal @@ -372,7 +409,9 @@ Christy Norman Chun Chen Ciro S. Costa Clayton Coleman +Clint Armstrong Clinton Kitson +clubby789 Cody Roseborough Coenraad Loubser Colin Dunklau @@ -383,19 +422,23 @@ Colin Walters Collin Guarino Colm Hally companycy +Conor Evans Corbin Coleman Corey Farrell Cory Forsyth +Cory Snider cressie176 -CrimsonGlory Cristian Ariza Cristian Staretu cristiano balducci Cristina Yenyxe Gonzalez Garcia Cruceru Calin-Cristian CUI Wei +cuishuang +Cuong Manh Le Cyprian Gracz Cyril F +Da McGrady Daan van Berkel Daehyeok Mun Dafydd Crosby @@ -413,6 +456,7 @@ Dan Hirsch Dan Keder Dan Levy Dan McPherson +Dan Plamadeala Dan Stine Dan Williams Dani Hodovic @@ -433,6 +477,7 @@ Daniel Mizyrycki Daniel Nephin Daniel Norberg Daniel Nordberg +Daniel P. Berrangé Daniel Robinson Daniel S Daniel Sweet @@ -441,6 +486,7 @@ Daniel Watkins Daniel X Moore Daniel YC Lin Daniel Zhang +Daniele Rondina Danny Berger Danny Milosavljevic Danny Yates @@ -456,6 +502,7 @@ Dave Henderson Dave MacDonald Dave Tucker David Anderson +David Bellotti David Calavera David Chung David Corking @@ -470,9 +517,11 @@ David Lawrence David Lechner David M. Karr David Mackey +David Manouchehri David Mat David Mcanulty David McKay +David O'Rourke David P Hilton David Pelaez David R. Jenni @@ -503,14 +552,14 @@ Dennis Docter Derek Derek Derek Ch -Derek McGowan +Derek McGowan Deric Crago Deshi Xiao -devmeyster Devon Estes Devvyn Murphy Dharmit Shah Dhawal Yogesh Bhanushali +Dhilip Kumars Diego Romero Diego Siqueira Dieter Reuter @@ -522,9 +571,11 @@ Dimitris Rozakis Dimitry Andric Dinesh Subhraveti Ding Fei +dingwei Diogo Monica DiuDiugirl Djibril Koné +Djordje Lukic dkumor Dmitri Logvinenko Dmitri Shuralyov @@ -536,6 +587,8 @@ Dmitry Shyshkin Dmitry Smirnov Dmitry V. Krivenok Dmitry Vorobev +Dmytro Iakovliev +docker-unir[bot] Dolph Mathews Dominic Tubach Dominic Yin @@ -569,8 +622,9 @@ Eivind Uggedal Elan Ruusamäe Elango Sivanandam Elena Morozova -Eli Uriegas +Eli Uriegas Elias Faxö +Elias Koromilas Elias Probst Elijah Zupancic eluck @@ -580,14 +634,17 @@ Emil Hernvall Emily Maier Emily Rose Emir Ozer +Eng Zer Jun Enguerran Eohyung Lee epeterso +er0k Eric Barch Eric Curtin Eric G. Noriega Eric Hanchrow Eric Lee +Eric Mountain Eric Myhre Eric Paris Eric Rafaloff @@ -597,17 +654,21 @@ Eric Soderstrom Eric Yang Eric-Olivier Lamey Erica Windisch +Erich Cordoba Erik Bray Erik Dubbelboer Erik Hollensbe Erik Inge Bolsø Erik Kristensen +Erik Sipsma Erik St. Martin Erik Weathers Erno Hopearuoho Erwin van der Koogh +Espen Suenson Ethan Bell Ethan Mosbaugh +Euan Harris Euan Kemp Eugen Krizo Eugene Yakubovich @@ -657,6 +718,7 @@ Fengtu Wang Ferenc Szabo Fernando Fero Volar +Feroz Salam Ferran Rodenas Filipe Brandenburger Filipe Oliveira @@ -673,6 +735,7 @@ Florin Patan fonglh Foysal Iqbal Francesc Campoy +Francesco Degrassi Francesco Mari Francis Chuang Francisco Carriedo @@ -681,18 +744,24 @@ Frank Groeneveld Frank Herrmann Frank Macreery Frank Rosquin -frankyang +Frank Yang Fred Lifton Frederick F. Kautz IV +Frederico F. de Oliveira Frederik Loeffert Frederik Nordahl Jul Sabroe Freek Kalter Frieder Bluemle +frobnicaty <92033765+frobnicaty@users.noreply.github.com> +Frédéric Dalleau Fu JinLin Félix Baylac-Jacqué Félix Cantournet Gabe Rosenhouse Gabor Nagy +Gabriel Adrian Samfira +Gabriel Goller +Gabriel L. Somlo Gabriel Linder Gabriel Monroy Gabriel Nicolas Avellaneda @@ -707,12 +776,14 @@ Gaurav Singh Gaël PORTAY Genki Takiuchi GennadySpb +Geoff Levand Geoffrey Bachelet Geon Kim George Kontridze George MacRorie George Xie Georgi Hristozov +Georgy Yakovlev Gereon Frey German DZ Gert van Valkenhoef @@ -724,6 +795,7 @@ Gildas Cuisinier Giovan Isa Musthofa gissehel Giuseppe Mazzotta +Giuseppe Scrivano Gleb Fotengauer-Malinovskiy Gleb M Borisov Glyn Normington @@ -746,6 +818,8 @@ Guilhem Lettron Guilherme Salgado Guillaume Dufour Guillaume J. Charmes +Gunadhya S. <6939749+gunadhya@users.noreply.github.com> +Guoqiang QI guoxiuyan Guri Gurjeet Singh @@ -755,12 +829,13 @@ gwx296173 Günter Zöchbauer Haichao Yang haikuoliu +haining.cao Hakan Özler Hamish Hutchings Hannes Ljungberg Hans Kristian Flaatten Hans Rødtang -Hao Shu Wei +Hao Shu Wei Hao Zhang <21521210@zju.edu.cn> Harald Albers Harald Niesche @@ -786,21 +861,23 @@ Hongbin Lu Hongxu Jia Honza Pokorny Hsing-Hui Hsu +Hsing-Yu (David) Chen hsinko <21551195@zju.edu.cn> Hu Keping Hu Tao HuanHuan Ye Huanzhong Zhang Huayi Zhang +Hugo Barrera Hugo Duncan Hugo Marisco <0x6875676f@gmail.com> +Hui Kang Hunter Blanks huqun Huu Nguyen -hyeongkyu.lee +Hyeongkyu Lee Hyzhou Zhy Iago López Galeiras -Ian Babrou Ian Bishop Ian Bull Ian Calvert @@ -817,6 +894,8 @@ Igor Dolzhikov Igor Karpovich Iliana Weller Ilkka Laukkanen +Illia Antypenko +Illo Abdulrahim Ilya Dmitrichenko Ilya Gusev Ilya Khlopotov @@ -847,7 +926,8 @@ Jaivish Kothari Jake Champlin Jake Moshenko Jake Sanders -jakedt +Jakub Drahos +Jakub Guzik James Allen James Carey James Carr @@ -859,11 +939,15 @@ James Lal James Mills James Nesbitt James Nugent +James Sanders James Turnbull James Watkins-Harvey Jamie Hannaford Jamshid Afshar +Jan Breig Jan Chren +Jan Garcia +Jan Götte Jan Keromnes Jan Koprowski Jan Pazdziora @@ -876,7 +960,6 @@ Januar Wayong Jared Biel Jared Hocutt Jaroslaw Zabiello -jaseg Jasmine Hegman Jason A. Donenfeld Jason Divock @@ -891,10 +974,11 @@ Jason Shepherd Jason Smith Jason Sommer Jason Stangroome +Javier Bassi jaxgeller -Jay Jay Jay Kamat +Jay Lim Jean Rouge Jean-Baptiste Barth Jean-Baptiste Dalido @@ -912,12 +996,14 @@ Jeff Minard Jeff Nickoloff Jeff Silberman Jeff Welch +Jeff Zvier Jeffrey Bolle Jeffrey Morgan Jeffrey van Gogh Jenny Gebske Jeremy Chambers Jeremy Grosser +Jeremy Huntwork Jeremy Price Jeremy Qian Jeremy Unruh @@ -933,13 +1019,16 @@ Ji.Zhilong Jian Liao Jian Zhang Jiang Jinyang +Jianyong Wu Jie Luo Jie Ma Jihyun Hwang Jilles Oldenbeuving Jim Alateras +Jim Carroll Jim Ehrismann Jim Galasyn +Jim Lin Jim Minter Jim Perrin Jimmy Cuadra @@ -951,6 +1040,7 @@ Jiri Appl Jiri Popelka Jiuyue Ma Jiří Župka +Joakim Roubert Joao Fernandes Joao Trindade Joe Beda @@ -1012,6 +1102,7 @@ Joost Cassee Jordan Arentsen Jordan Jennings Jordan Sissel +Jordi Massaguer Pla Jorge Marin Jorit Kleine-Möllhoff Jose Diaz-Gonzalez @@ -1044,12 +1135,15 @@ Julien Pervillé Julien Pivotto Julio Guerra Julio Montes +Jun Du Jun-Ru Chang +junxu Jussi Nummelin Justas Brazauskas Justen Martin Justin Cormack Justin Force +Justin Keller <85903732+jk-vb@users.noreply.github.com> Justin Menga Justin Plock Justin Simonelis @@ -1062,6 +1156,7 @@ Jörg Thalheim K. Heller Kai Blin Kai Qiang Wu (Kennan) +Kaijie Chen Kamil Domański Kamjar Gerami Kanstantsin Shautsou @@ -1082,6 +1177,7 @@ Kawsar Saiyeed Kay Yan kayrus Kazuhiro Sera +Kazuyoshi Kato Ke Li Ke Xu Kei Ohmura @@ -1096,6 +1192,7 @@ Kenjiro Nakayama Kent Johnson Kenta Tada Kevin "qwazerty" Houdebert +Kevin Alvarez Kevin Burke Kevin Clark Kevin Feyrer @@ -1118,24 +1215,27 @@ Kimbro Staken Kir Kolyshkin Kiran Gangadharan Kirill SIbirev +Kirk Easterson knappe Kohei Tsuruta Koichi Shiraishi Konrad Kleine +Konrad Ponichtera Konstantin Gribov Konstantin L Konstantin Pelykh +Kostadin Plachkov Krasi Georgiev Krasimir Georgiev Kris-Mikael Krister Kristian Haugene Kristina Zabunova Krystian Wojcicki -Kun Zhang Kunal Kushwaha Kunal Tyagi Kyle Conroy Kyle Linden +Kyle Squizzato Kyle Wuolle kyu Lachlan Coote @@ -1150,21 +1250,28 @@ Lars Kellogg-Stedman Lars R. Damerow Lars-Magnus Skog Laszlo Meszaros +Laura Brehm Laura Frank +Laurent Bernaille Laurent Erignoux Laurie Voss +Leandro Motta Barros Leandro Siqueira +Lee Calcote Lee Chao <932819864@qq.com> Lee, Meng-Han -leeplay Lei Gong Lei Jitang +Leiiwang Len Weincier Lennie Leo Gallucci +Leonardo Nodari +Leonardo Taccari Leszek Kowalski Levi Blackstone Levi Gross +Levi Harrison Lewis Daly Lewis Marshall Lewis Peckover @@ -1173,11 +1280,12 @@ Liam Macgillavry Liana Lo Liang Mingqiang Liang-Chi Hsieh +liangwei Liao Qingwei Lifubang Lihua Tang Lily Guo -limsy +limeidan Lin Lu LingFaKe Linus Heckemann @@ -1207,6 +1315,7 @@ Lucas Chi Lucas Molas Lucas Silvestre Luciano Mores +Luis Henrique Mulinari Luis Martínez de Bartolomé Izquierdo Luiz Svoboda Lukas Heeren @@ -1222,7 +1331,7 @@ Ma Shimiao Mabin Madhan Raj Mookkandy Madhav Puri -Madhu Venugopal +Madhu Venugopal Mageee Mahesh Tiyyagura malnick @@ -1255,12 +1364,14 @@ Marius Gundersen Marius Sturm Marius Voila Mark Allen +Mark Feit Mark Jeromin Mark McGranaghan Mark McKinstry Mark Milstein Mark Oates Mark Parker +Mark Vainomaa Mark West Markan Patel Marko Mikulicic @@ -1269,11 +1380,14 @@ Markus Fix Markus Kortlang Martijn Dwars Martijn van Oosterhout +Martin Braun +Martin Dojcak Martin Honermeyer Martin Kelly Martin Mosegaard Amdisen Martin Muzatko Martin Redmond +Maru Newby Mary Anthony Masahito Zembutsu Masato Ohba @@ -1284,13 +1398,16 @@ Mathias Monnerville Mathieu Champlon Mathieu Le Marec - Pasquet Mathieu Parent +Mathieu Paturel Matt Apperson Matt Bachmann +Matt Bajor Matt Bentley Matt Haggard Matt Hoyle Matt McCormick Matt Moore +Matt Morrison <3maven@gmail.com> Matt Richardson Matt Rickard Matt Robenolt @@ -1305,12 +1422,14 @@ Matthew Riley Matthias Klumpp Matthias Kühnle Matthias Rampke +Matthieu Fronton Matthieu Hauglustaine Mattias Jernberg Mauricio Garavaglia mauriyouth Max Harmathy Max Shytikov +Max Timchenko Maxim Fedchyshyn Maxim Ivanov Maxim Kulkin @@ -1324,14 +1443,16 @@ Megan Kostick Mehul Kar Mei ChunTao Mengdi Gao +Menghui Chen Mert Yazıcıoğlu mgniu Micah Zoltu Michael A. Smith +Michael Beskin Michael Bridgen Michael Brown Michael Chiang -Michael Crosby +Michael Crosby Michael Currie Michael Friis Michael Gorsuch @@ -1340,6 +1461,7 @@ Michael Holzheu Michael Hudson-Doyle Michael Huettermann Michael Irwin +Michael Kuehn Michael Käufl Michael Neale Michael Nussbaum @@ -1349,23 +1471,29 @@ Michael Spetsiotis Michael Stapelberg Michael Steinert Michael Thies +Michael Weidmann Michael West Michael Zhao Michal Fojtik Michal Gebauer Michal Jemala +Michal Kostrzewa Michal Minář +Michal Rostecki Michal Wieczorek Michaël Pailloncy Michał Czeraszkiewicz Michał Gryko +Michał Kosek Michiel de Jong Mickaël Fortunato Mickaël Remars Miguel Angel Fernández Miguel Morales +Miguel Perez Mihai Borobocea Mihuleacc Sergiu +Mikael Davranche Mike Brown Mike Bush Mike Casas @@ -1384,6 +1512,7 @@ Mike Snitzer mikelinjie <294893458@qq.com> Mikhail Sobolev Miklos Szegedi +Milas Bowman Milind Chawre Miloslav Trmač mingqing @@ -1392,7 +1521,7 @@ Misty Stanley-Jones Mitch Capper Mizuki Urushida mlarcher -Mohammad Banikazemi +Mohammad Banikazemi Mohammad Nasirifar Mohammed Aaqib Ansari Mohit Soni @@ -1406,6 +1535,7 @@ Moysés Borges mrfly Mrunal Patel Muayyad Alsadi +Muhammad Zohaib Aslam Mustafa Akın Muthukumar R Máximo Cuadros @@ -1422,6 +1552,8 @@ Natasha Jarus Nate Brennand Nate Eagleson Nate Jones +Nathan Carlson +Nathan Herald Nathan Hsieh Nathan Kleyn Nathan LeClaire @@ -1443,8 +1575,10 @@ Nick Neisen Nick Parker Nick Payne Nick Russo +Nick Santos Nick Stenning Nick Stinemates +Nick Wood NickrenREN Nicola Kabar Nicolas Borboën @@ -1455,6 +1589,7 @@ Nicolas Kaiser Nicolas Sterchele Nicolas V Castet Nicolás Hock Isaza +Niel Drummond Nigel Poulton Nik Nyby Nikhil Chawla @@ -1462,6 +1597,7 @@ NikolaMandic Nikolas Garofil Nikolay Edigaryev Nikolay Milovanov +ningmingxiao Nirmal Mehta Nishant Totla NIWA Hideyuki @@ -1472,6 +1608,7 @@ noducks Nolan Darilek Noriki Nakamura nponeccop +Nurahmadie Nuutti Kotivuori nzwsch O.S. Tezer @@ -1489,7 +1626,10 @@ Olle Jonsson Olli Janatuinen Olly Pomeroy Omri Shiv +Onur Filiz Oriol Francès +Oscar Bonilla <6f6231@gmail.com> +oscar.chen <2972789494@qq.com> Oskar Niburski Otto Kekäläinen Ouyang Liduo @@ -1502,10 +1642,12 @@ Pascal Borreli Pascal Hartig Patrick Böänziger Patrick Devine +Patrick Haas Patrick Hemmer Patrick Stapleton Patrik Cyvoct pattichen +Paul "TBBle" Hampson Paul paul Paul Annesley @@ -1520,6 +1662,7 @@ Paul Liljenberg Paul Morie Paul Nasrat Paul Weaver +Paulo Gomes Paulo Ribeiro Pavel Lobashov Pavel Matěja @@ -1530,6 +1673,7 @@ Pavel Tikhomirov Pavlos Ratis Pavol Vargovcik Pawel Konczalski +Paweł Gronowski Peeyush Gupta Peggy Li Pei Su @@ -1537,6 +1681,7 @@ Peng Tao Penghan Wang Per Weijnitz perhapszzy@sina.com +Pete Woods Peter Bourgon Peter Braden Peter Bücker @@ -1552,8 +1697,10 @@ Peter Salvatore Peter Volpe Peter Waller Petr Švihlík +Petros Angelatos Phil -Phil Estes +Phil Estes +Phil Sphicas Phil Spitler Philip Alexander Etling Philip Monroe @@ -1570,21 +1717,25 @@ Pierre Dal-Pra Pierre Wacrenier Pierre-Alain RIVIERE Piotr Bogdan -pixelistik +Piotr Karbowski Porjo Poul Kjeldager Sørensen Pradeep Chhetri Pradip Dhara +Pradipta Kr. Banerjee Prasanna Gautam Pratik Karki Prayag Verma Priya Wadhwa Projjol Banerji Przemek Hejman +Puneet Pruthi Pure White pysqz Qiang Huang +Qin TianHuan Qinglan Peng +Quan Tian qudongfang Quentin Brossard Quentin Perez @@ -1607,6 +1758,7 @@ Ramon van Alteren RaviTeja Pothana Ray Tsang ReadmeCritic +realityone Recursive Madman Reficul Regan McCooey @@ -1617,9 +1769,9 @@ Renaud Gaubert Rhys Hiltner Ri Xu Ricardo N Feliciano +Rich Horwood Rich Moyse Rich Seymour -Richard Richard Burnison Richard Harvey Richard Mathie @@ -1634,12 +1786,14 @@ Riku Voipio Riley Guerin Ritesh H Shukla Riyaz Faizullabhoy +Rob Cowsill <42620235+rcowsill@users.noreply.github.com> Rob Gulewich Rob Vesse Robert Bachmann Robert Bittle Robert Obryk Robert Schneider +Robert Shade Robert Stern Robert Terhaar Robert Wallis @@ -1652,6 +1806,7 @@ Robin Speekenbrink Robin Thoni robpc Rodolfo Carvalho +Rodrigo Campos Rodrigo Vaz Roel Van Nyen Roger Peppe @@ -1666,11 +1821,14 @@ Roma Sokolov Roman Dudin Roman Mazur Roman Strashkin +Roman Volosatovs +Roman Zabaluev Ron Smits Ron Williams Rong Gao Rong Zhang Rongxiang Song +Rony Weng root root root @@ -1679,6 +1837,7 @@ Rory Hunter Rory McCune Ross Boucher Rovanion Luckey +Roy Reznik Royce Remer Rozhnov Alexandr Rudolph Gottesheim @@ -1690,13 +1849,16 @@ Russ Magee Ryan Abrams Ryan Anderson Ryan Aslett +Ryan Barry Ryan Belgrave +Ryan Campbell Ryan Detzel Ryan Fowler Ryan Liu Ryan McLaughlin Ryan O'Donnell Ryan Seto +Ryan Shea Ryan Simmen Ryan Stelly Ryan Thomas @@ -1706,9 +1868,9 @@ Ryan Zhang ryancooper7 RyanDeng Ryo Nakao +Ryoga Saito Rémy Greinhofer s. rannou -s00318865 Sabin Basyal Sachin Joshi Sagar Hani @@ -1728,8 +1890,9 @@ Sambuddha Basu Sami Wagiaalla Samuel Andaya Samuel Dion-Girardeau -Samuel Karp +Samuel Karp Samuel PHAN +sanchayanghosh Sandeep Bansal Sankar சங்கர் Sanket Saurav @@ -1745,6 +1908,7 @@ Satoshi Tagomori Scott Bessler Scott Collier Scott Johnston +Scott Percival Scott Stamp Scott Walls sdreyesg @@ -1757,6 +1921,9 @@ Sean P. Kane Sean Rodman Sebastiaan van Steenis Sebastiaan van Stijn +Sebastian Höffner +Sebastian Radloff +Sebastien Goasguen Senthil Kumar Selvaraj Senthil Kumaran SeongJae Park @@ -1776,12 +1943,15 @@ shaunol Shawn Landden Shawn Siefkas shawnhe +Shayan Pooya Shayne Wang Shekhar Gulati Sheng Yang Shengbo Song +Shengjing Zhu Shev Yan Shih-Yuan Lee +Shihao Xia Shijiang Wei Shijun Qin Shishir Mahajan @@ -1790,14 +1960,13 @@ Shourya Sarcar Shu-Wai Chow shuai-z Shukui Yang -Shuwei Hao Sian Lerk Lau +Siarhei Rasiukevich Sidhartha Mani sidharthamani Silas Sewell Silvan Jegen Simão Reis -Simei He Simon Barendse Simon Eskildsen Simon Ferquel @@ -1808,13 +1977,16 @@ Simon Vikstrom Sindhu S Sjoerd Langkemper skanehira +Smark Meng Solganik Alexander Solomon Hykes Song Gao Soshi Katsuta +Sotiris Salloumis Soulou Spencer Brown Spencer Smith +Spike Curtis Sridatta Thatipamala Sridhar Ratnakumar Srini Brahmaroutu @@ -1830,6 +2002,7 @@ Stefan S. Stefan Scherer Stefan Staudenmeyer Stefan Weil +Steffen Butzer Stephan Spindler Stephen Benjamin Stephen Crosby @@ -1848,7 +2021,9 @@ Steven Iveson Steven Merrill Steven Richards Steven Taylor +Stéphane Este-Gracias Stig Larsson +Su Wang Subhajit Ghosh Sujith Haridasan Sun Gengze <690388648@qq.com> @@ -1858,15 +2033,16 @@ Sunny Gogoi Suryakumar Sudar Sven Dowideit Swapnil Daingade -Sylvain Baubeau +Sylvain Baubeau Sylvain Bellemare Sébastien Sébastien HOUZÉ Sébastien Luttringer Sébastien Stormacq +Sören Tempel Tabakhase Tadej Janež -TAGOMORI Satoshi +Takuto Sato tang0th Tangi Colin Tatsuki Sugiura @@ -1877,18 +2053,21 @@ Ted M. Young Tehmasp Chaudhri Tejaswini Duggaraju Tejesh Mehta +Terry Chu terryding77 <550147740@qq.com> -tgic Thatcher Peskens theadactyl Thell 'Bo' Fowler Thermionix +Thiago Alves Silva Thijs Terlouw Thomas Bikeev Thomas Frössman Thomas Gazagnaire +Thomas Graf Thomas Grainger Thomas Hansen +Thomas Ledos Thomas Leonard Thomas Léveil Thomas Orozco @@ -1899,11 +2078,13 @@ Thomas Swift Thomas Tanaka Thomas Texier Ti Zhou +Tiago Seabra Tianon Gravi Tianyi Wang Tibor Vass Tiffany Jernigan Tiffany Low +Till Claassen Till Wegmüller Tim Tim Bart @@ -1915,11 +2096,14 @@ Tim Potter Tim Ruffles Tim Smith Tim Terhorst +Tim Wagner Tim Wang Tim Waugh Tim Wraight Tim Zju <21651152@zju.edu.cn> +timchenxiaoyu <837829664@qq.com> timfeirg +Timo Rothenpieler Timothy Hobbs tjwebb123 tobe @@ -1928,6 +2112,7 @@ Tobias Bradtke Tobias Gesellchen Tobias Klauser Tobias Munk +Tobias Pfandzelter Tobias Schmidt Tobias Schwab Todd Crane @@ -1941,25 +2126,33 @@ Tom Fotherby Tom Howe Tom Hulihan Tom Maaswinkel +Tom Parker Tom Sweeney Tom Wilkie Tom X. Tobin +Tom Zhao +Tomas Janousek +Tomas Kral Tomas Tomecek Tomasz Kopczynski Tomasz Lipinski Tomasz Nurkiewicz +Tomek Mańko Tommaso Visconti +Tomoya Tabuchi Tomáš Hrčka +tonic Tonny Xu Tony Abboud Tony Daws Tony Miller toogley Torstein Husebø +Toshiaki Makita Tõnis Tiigi Trace Andreason tracylihui <793912329@qq.com> -Trapier Marshall +Trapier Marshall Travis Cline Travis Thieman Trent Ogren @@ -1969,6 +2162,8 @@ Trevor Sullivan Trishna Guha Tristan Carel Troy Denton +Tudor Brindus +Ty Alexander Tycho Andersen Tyler Brock Tyler Brown @@ -1979,6 +2174,7 @@ Umesh Yadav Utz Bacher vagrant Vaidas Jablonskis +Valentin Kulesh vanderliang Velko Ivanov Veres Lajos @@ -1992,12 +2188,13 @@ Victor Palma Victor Vieux Victoria Bialas Vijaya Kumar K +Vikas Choudhary Vikram bir Singh Viktor Stanchev Viktor Vojnovski VinayRaghavanKS Vincent Batts -Vincent Bernat +Vincent Bernat Vincent Boulineau Vincent Demeester Vincent Giersch @@ -2017,9 +2214,9 @@ Vladimir Pouzanov Vladimir Rutsky Vladimir Varankin VladimirAus +Vladislav Kolesnikov Vlastimil Zeman Vojtech Vitek (V-Teq) -waitingkuo Walter Leibbrandt Walter Stanish Wang Chao @@ -2034,6 +2231,7 @@ wanghuaiqing Ward Vandewege WarheadsSE Wassim Dhif +Wataru Ishida Wayne Chang Wayne Song Weerasak Chongnguluam @@ -2048,7 +2246,6 @@ Wendel Fleming Wenjun Tang Wenkai Yin wenlxie -Wentao Zhang Wenxuan Zhao Wenyu You <21551128@zju.edu.cn> Wenzhi Liang @@ -2068,22 +2265,29 @@ William Thurston Wilson Júnior Wing-Kam Wong WiseTrem +Wolfgang Nagele Wolfgang Powisch Wonjun Kim +WuLonghui xamyzhao +Xia Wu Xian Chaobo Xianglin Gao +Xianjie Xianlu Bird Xiao YongBiao +Xiao Zhang XiaoBing Jiang Xiaodong Liu Xiaodong Zhang +Xiaohua Ding Xiaoxi He Xiaoxu Chen Xiaoyu Zhang xichengliudui <1693291525@qq.com> xiekeyang Ximo Guanter Gonzálbez +xin.li Xinbo Weng Xinfeng Liu Xinzi Zhou @@ -2092,12 +2296,17 @@ Xuecong Liao xuzhaokui Yadnyawalkya Tale Yahya +yalpul YAMADA Tsuyoshi Yamasaki Masahide +Yamazaki Masashi Yan Feng +Yan Zhu Yang Bai +Yang Li Yang Pengfei yangchenliang +Yann Autissier Yanqiang Miao Yao Zaiyong Yash Murty @@ -2117,6 +2326,7 @@ Yosef Fertel You-Sheng Yang (楊有勝) youcai Youcef YEKHLEF +Youfu Zhang Yu Changchun Yu Chengxia Yu Peng @@ -2124,14 +2334,18 @@ Yu-Ju Hong Yuan Sun Yuanhong Peng Yue Zhang +Yufei Xiong Yuhao Fang Yuichiro Kaneko +YujiOshima Yunxiang Huang Yurii Rashkovskii Yusuf Tarık Günaydın +Yves Blusseau <90z7oey02@sneakemail.com> Yves Junqueira Zac Dover Zach Borboa +Zach Gershman Zachary Jaffee Zain Memon Zaiste! @@ -2147,6 +2361,7 @@ Zhenan Ye <21551168@zju.edu.cn> zhenghenghuo Zhenhai Gao Zhenkun Bi +ZhiPeng Lu zhipengzuo Zhou Hao Zhoulin Xie @@ -2164,7 +2379,6 @@ Zou Yu zqh Zuhayr Elahi Zunayed Ali -Álex González Álvaro Lázaro Átila Camurça Alves 尹吉峰 @@ -2173,3 +2387,4 @@ Zunayed Ali 慕陶 搏通 黄艳红00139573 +정재영 diff --git a/vendor/github.com/docker/docker/api/common.go b/vendor/github.com/docker/docker/api/common.go index 1565e2af64..cba66bc462 100644 --- a/vendor/github.com/docker/docker/api/common.go +++ b/vendor/github.com/docker/docker/api/common.go @@ -3,7 +3,7 @@ package api // import "github.com/docker/docker/api" // Common constants for daemon and client. const ( // DefaultVersion of Current REST API - DefaultVersion = "1.41" + DefaultVersion = "1.43" // NoBaseImageSpecifier is the symbol used by the FROM // command to specify that no base image is to be used. diff --git a/vendor/github.com/docker/docker/api/swagger.yaml b/vendor/github.com/docker/docker/api/swagger.yaml index c24f57bc9a..a820f996f9 100644 --- a/vendor/github.com/docker/docker/api/swagger.yaml +++ b/vendor/github.com/docker/docker/api/swagger.yaml @@ -19,10 +19,10 @@ produces: consumes: - "application/json" - "text/plain" -basePath: "/v1.41" +basePath: "/v1.43" info: title: "Docker Engine API" - version: "1.41" + version: "1.43" x-logo: url: "https://docs.docker.com/assets/images/logo-docker-main.png" description: | @@ -55,8 +55,8 @@ info: the URL is not supported by the daemon, a HTTP `400 Bad Request` error message is returned. - If you omit the version-prefix, the current version of the API (v1.41) is used. - For example, calling `/info` is the same as calling `/v1.41/info`. Using the + If you omit the version-prefix, the current version of the API (v1.43) is used. + For example, calling `/info` is the same as calling `/v1.43/info`. Using the API without a version-prefix is deprecated and will be removed in a future release. Engine releases in the near future should support this version of the API, @@ -202,24 +202,74 @@ definitions: MountPoint: type: "object" - description: "A mount point inside a container" + description: | + MountPoint represents a mount point configuration inside the container. + This is used for reporting the mountpoints in use by a container. properties: Type: + description: | + The mount type: + + - `bind` a mount of a file or directory from the host into the container. + - `volume` a docker volume with the given `Name`. + - `tmpfs` a `tmpfs`. + - `npipe` a named pipe from the host into the container. + - `cluster` a Swarm cluster volume type: "string" + enum: + - "bind" + - "volume" + - "tmpfs" + - "npipe" + - "cluster" + example: "volume" Name: + description: | + Name is the name reference to the underlying data defined by `Source` + e.g., the volume name. type: "string" + example: "myvolume" Source: + description: | + Source location of the mount. + + For volumes, this contains the storage location of the volume (within + `/var/lib/docker/volumes/`). For bind-mounts, and `npipe`, this contains + the source (host) part of the bind-mount. For `tmpfs` mount points, this + field is empty. type: "string" + example: "/var/lib/docker/volumes/myvolume/_data" Destination: + description: | + Destination is the path relative to the container root (`/`) where + the `Source` is mounted inside the container. type: "string" + example: "/usr/share/nginx/html/" Driver: + description: | + Driver is the volume driver used to create the volume (if it is a volume). type: "string" + example: "local" Mode: + description: | + Mode is a comma separated list of options supplied by the user when + creating the bind/volume mount. + + The default is platform-specific (`"z"` on Linux, empty on Windows). type: "string" + example: "z" RW: + description: | + Whether the mount is mounted writable (read-write). type: "boolean" + example: true Propagation: + description: | + Propagation describes how mounts are propagated from the host into the + mount point, and vice-versa. Refer to the [Linux kernel documentation](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt) + for details. This field is not used on Windows. type: "string" + example: "" DeviceMapping: type: "object" @@ -302,12 +352,14 @@ definitions: - `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed. - `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs. - `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container. + - `cluster` a Swarm cluster volume type: "string" enum: - "bind" - "volume" - "tmpfs" - "npipe" + - "cluster" ReadOnly: description: "Whether the mount should be read-only." type: "boolean" @@ -332,6 +384,10 @@ definitions: description: "Disable recursive bind mount." type: "boolean" default: false + CreateMountpoint: + description: "Create mount point on host if missing" + type: "boolean" + default: false VolumeOptions: description: "Optional configuration for the `volume` type." type: "object" @@ -382,11 +438,13 @@ definitions: type: "string" description: | - Empty string means not to restart + - `no` Do not automatically restart - `always` Always restart - `unless-stopped` Restart always except when the user has manually stopped the container - `on-failure` Restart only when the container exit code is non-zero enum: - "" + - "no" - "always" - "unless-stopped" - "on-failure" @@ -527,19 +585,13 @@ definitions: type: "array" items: $ref: "#/definitions/DeviceRequest" - KernelMemory: + KernelMemoryTCP: description: | - Kernel memory limit in bytes. - -


+ Hard limit for kernel TCP buffer memory (in bytes). Depending on the + OCI runtime in use, this option may be ignored. It is no longer supported + by the default (runc) runtime. - > **Deprecated**: This field is deprecated as the kernel 5.4 deprecated - > `kmem.limit_in_bytes`. - type: "integer" - format: "int64" - example: 209715200 - KernelMemoryTCP: - description: "Hard limit for kernel TCP buffer memory (in bytes)." + This field is omitted when empty. type: "integer" format: "int64" MemoryReservation: @@ -723,11 +775,13 @@ definitions: The time to wait between checks in nanoseconds. It should be 0 or at least 1000000 (1 ms). 0 means inherit. type: "integer" + format: "int64" Timeout: description: | The time to wait before considering the check to have hung. It should be 0 or at least 1000000 (1 ms). 0 means inherit. type: "integer" + format: "int64" Retries: description: | The number of consecutive failures needed to consider a container as @@ -739,11 +793,13 @@ definitions: health-retries countdown in nanoseconds. It should be 0 or at least 1000000 (1 ms). 0 means inherit. type: "integer" + format: "int64" Health: description: | Health stores information about the container's healthcheck results. type: "object" + x-nullable: true properties: Status: description: | @@ -769,13 +825,13 @@ definitions: description: | Log contains the last few results (oldest first) items: - x-nullable: true $ref: "#/definitions/HealthcheckResult" HealthcheckResult: description: | HealthcheckResult stores information about a single run of a healthcheck probe type: "object" + x-nullable: true properties: Start: description: | @@ -910,6 +966,23 @@ definitions: type: "array" items: $ref: "#/definitions/Mount" + ConsoleSize: + type: "array" + description: | + Initial console size, as an `[height, width]` array. + x-nullable: true + minItems: 2 + maxItems: 2 + items: + type: "integer" + minimum: 0 + Annotations: + type: "object" + description: | + Arbitrary non-identifying metadata attached to container and + provided to the runtime when the container is started. + additionalProperties: + type: "string" # Applicable to UNIX platforms CapAdd: @@ -1024,8 +1097,9 @@ definitions: description: "Mount the container's root filesystem as read only." SecurityOpt: type: "array" - description: "A list of string values to customize labels for MLS - systems, such as SELinux." + description: | + A list of string values to customize labels for MLS systems, such + as SELinux. items: type: "string" StorageOpt: @@ -1055,6 +1129,7 @@ definitions: remapping option is enabled. ShmSize: type: "integer" + format: "int64" description: | Size of `/dev/shm` in bytes. If omitted, the system uses 64MB. minimum: 0 @@ -1073,15 +1148,6 @@ definitions: type: "string" description: "Runtime to use with this container." # Applicable to Windows - ConsoleSize: - type: "array" - description: | - Initial console size, as an `[height, width]` array. (Windows only) - minItems: 2 - maxItems: 2 - items: - type: "integer" - minimum: 0 Isolation: type: "string" description: | @@ -1106,14 +1172,25 @@ definitions: type: "string" ContainerConfig: - description: "Configuration for a container that is portable between hosts" + description: | + Configuration for a container that is portable between hosts. + + When used as `ContainerConfig` field in an image, `ContainerConfig` is an + optional field containing the configuration of the container that was last + committed when creating the image. + + Previous versions of Docker builder used this field to store build cache, + and it is not in active use anymore. type: "object" properties: Hostname: - description: "The hostname to use for the container, as a valid RFC 1123 hostname." + description: | + The hostname to use for the container, as a valid RFC 1123 hostname. type: "string" + example: "439f4e91bd1d" Domainname: - description: "The domain name to use for the container." + description: | + The domain name to use for the container. type: "string" User: description: "The user that commands are run as inside the container." @@ -1136,11 +1213,16 @@ definitions: `{"/": {}}` type: "object" + x-nullable: true additionalProperties: type: "object" enum: - {} default: {} + example: { + "80/tcp": {}, + "443/tcp": {} + } Tty: description: | Attach standard streams to a TTY, including `stdin` if it is not closed. @@ -1162,21 +1244,29 @@ definitions: type: "array" items: type: "string" + example: + - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Cmd: description: | Command to run specified as a string or an array of strings. type: "array" items: type: "string" + example: ["/bin/sh"] Healthcheck: $ref: "#/definitions/HealthConfig" ArgsEscaped: description: "Command is already escaped (Windows only)" type: "boolean" + default: false + example: false + x-nullable: true Image: description: | - The name of the image to use when creating the container/ + The name (or reference) of the image to use when creating the container, + or which was used when the container was created. type: "string" + example: "example-image:1.0" Volumes: description: | An object mapping mount point paths inside the container to empty @@ -1190,6 +1280,7 @@ definitions: WorkingDir: description: "The working directory for commands to run in." type: "string" + example: "/public/" Entrypoint: description: | The entry point for the container as a string or an array of strings. @@ -1200,38 +1291,50 @@ definitions: type: "array" items: type: "string" + example: [] NetworkDisabled: description: "Disable networking for the container." type: "boolean" + x-nullable: true MacAddress: description: "MAC address of the container." type: "string" + x-nullable: true OnBuild: description: | `ONBUILD` metadata that were defined in the image's `Dockerfile`. type: "array" + x-nullable: true items: type: "string" + example: [] Labels: description: "User-defined key/value metadata." type: "object" additionalProperties: type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" StopSignal: description: | Signal to stop a container as a string or unsigned integer. type: "string" - default: "SIGTERM" + example: "SIGTERM" + x-nullable: true StopTimeout: description: "Timeout to stop a container in seconds." type: "integer" default: 10 + x-nullable: true Shell: description: | Shell for when `RUN`, `CMD`, and `ENTRYPOINT` uses a shell. type: "array" + x-nullable: true items: type: "string" + example: ["/bin/sh", "-c"] NetworkingConfig: description: | @@ -1274,7 +1377,7 @@ definitions: type: "object" properties: Bridge: - description: Name of the network'a bridge (for example, `docker0`). + description: Name of the network's bridge (for example, `docker0`). type: "string" example: "docker0" SandboxID: @@ -1488,107 +1591,242 @@ definitions: example: "4443" GraphDriverData: - description: "Information about a container's graph driver." + description: | + Information about the storage driver used to store the container's and + image's filesystem. type: "object" required: [Name, Data] properties: Name: + description: "Name of the storage driver." type: "string" x-nullable: false + example: "overlay2" Data: + description: | + Low-level storage metadata, provided as key/value pairs. + + This information is driver-specific, and depends on the storage-driver + in use, and should be used for informational purposes only. type: "object" x-nullable: false additionalProperties: type: "string" + example: { + "MergedDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/merged", + "UpperDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/diff", + "WorkDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/work" + } - Image: + FilesystemChange: + description: | + Change in the container's filesystem. + type: "object" + required: [Path, Kind] + properties: + Path: + description: | + Path to file or directory that has changed. + type: "string" + x-nullable: false + Kind: + $ref: "#/definitions/ChangeType" + + ChangeType: + description: | + Kind of change + + Can be one of: + + - `0`: Modified ("C") + - `1`: Added ("A") + - `2`: Deleted ("D") + type: "integer" + format: "uint8" + enum: [0, 1, 2] + x-nullable: false + + ImageInspect: + description: | + Information about an image in the local image cache. type: "object" - required: - - Id - - Parent - - Comment - - Created - - Container - - DockerVersion - - Author - - Architecture - - Os - - Size - - VirtualSize - - GraphDriver - - RootFS properties: Id: + description: | + ID is the content-addressable ID of an image. + + This identifier is a content-addressable digest calculated from the + image's configuration (which includes the digests of layers used by + the image). + + Note that this digest differs from the `RepoDigests` below, which + holds digests of image manifests that reference the image. type: "string" x-nullable: false + example: "sha256:ec3f0931a6e6b6855d76b2d7b0be30e81860baccd891b2e243280bf1cd8ad710" RepoTags: + description: | + List of image names/tags in the local image cache that reference this + image. + + Multiple image tags can refer to the same image, and this list may be + empty if no tags reference the image, in which case the image is + "untagged", in which case it can still be referenced by its ID. type: "array" items: type: "string" + example: + - "example:1.0" + - "example:latest" + - "example:stable" + - "internal.registry.example.com:5000/example:1.0" RepoDigests: + description: | + List of content-addressable digests of locally available image manifests + that the image is referenced from. Multiple manifests can refer to the + same image. + + These digests are usually only available if the image was either pulled + from a registry, or if the image was pushed to a registry, which is when + the manifest is generated and its digest calculated. type: "array" items: type: "string" + example: + - "example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb" + - "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578" Parent: + description: | + ID of the parent image. + + Depending on how the image was created, this field may be empty and + is only set for images that were built/created locally. This field + is empty if the image was pulled from an image registry. type: "string" x-nullable: false + example: "" Comment: + description: | + Optional message that was set when committing or importing the image. type: "string" x-nullable: false + example: "" Created: + description: | + Date and time at which the image was created, formatted in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. type: "string" x-nullable: false + example: "2022-02-04T21:20:12.497794809Z" Container: + description: | + The ID of the container that was used to create the image. + + Depending on how the image was created, this field may be empty. type: "string" x-nullable: false + example: "65974bc86f1770ae4bff79f651ebdbce166ae9aada632ee3fa9af3a264911735" ContainerConfig: $ref: "#/definitions/ContainerConfig" DockerVersion: + description: | + The version of Docker that was used to build the image. + + Depending on how the image was created, this field may be empty. type: "string" x-nullable: false + example: "20.10.7" Author: + description: | + Name of the author that was specified when committing the image, or as + specified through MAINTAINER (deprecated) in the Dockerfile. type: "string" x-nullable: false + example: "" Config: $ref: "#/definitions/ContainerConfig" Architecture: + description: | + Hardware CPU architecture that the image runs on. type: "string" x-nullable: false + example: "arm" + Variant: + description: | + CPU architecture variant (presently ARM-only). + type: "string" + x-nullable: true + example: "v7" Os: + description: | + Operating System the image is built to run on. type: "string" x-nullable: false + example: "linux" OsVersion: + description: | + Operating System version the image is built to run on (especially + for Windows). type: "string" + example: "" + x-nullable: true Size: + description: | + Total size of the image including all layers it is composed of. type: "integer" format: "int64" x-nullable: false + example: 1239828 VirtualSize: + description: | + Total size of the image including all layers it is composed of. + + In versions of Docker before v1.10, this field was calculated from + the image itself and all of its parent images. Images are now stored + self-contained, and no longer use a parent-chain, making this field + an equivalent of the Size field. + + > **Deprecated**: this field is kept for backward compatibility, but + > will be removed in API v1.44. type: "integer" format: "int64" - x-nullable: false + example: 1239828 GraphDriver: $ref: "#/definitions/GraphDriverData" RootFS: + description: | + Information about the image's RootFS, including the layer IDs. type: "object" required: [Type] properties: Type: type: "string" x-nullable: false + example: "layers" Layers: type: "array" items: type: "string" - BaseLayer: - type: "string" + example: + - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6" + - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" Metadata: + description: | + Additional metadata of the image in the local cache. This information + is local to the daemon, and not part of the image itself. type: "object" properties: LastTagTime: + description: | + Date and time at which the image was last tagged in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + + This information is only available if the image was tagged locally, + and omitted otherwise. type: "string" format: "dateTime" - + example: "2022-02-28T14:40:02.623929178Z" + x-nullable: true ImageSummary: type: "object" required: @@ -1599,46 +1837,122 @@ definitions: - Created - Size - SharedSize - - VirtualSize - Labels - Containers properties: Id: + description: | + ID is the content-addressable ID of an image. + + This identifier is a content-addressable digest calculated from the + image's configuration (which includes the digests of layers used by + the image). + + Note that this digest differs from the `RepoDigests` below, which + holds digests of image manifests that reference the image. type: "string" x-nullable: false + example: "sha256:ec3f0931a6e6b6855d76b2d7b0be30e81860baccd891b2e243280bf1cd8ad710" ParentId: + description: | + ID of the parent image. + + Depending on how the image was created, this field may be empty and + is only set for images that were built/created locally. This field + is empty if the image was pulled from an image registry. type: "string" x-nullable: false + example: "" RepoTags: + description: | + List of image names/tags in the local image cache that reference this + image. + + Multiple image tags can refer to the same image, and this list may be + empty if no tags reference the image, in which case the image is + "untagged", in which case it can still be referenced by its ID. type: "array" x-nullable: false items: type: "string" + example: + - "example:1.0" + - "example:latest" + - "example:stable" + - "internal.registry.example.com:5000/example:1.0" RepoDigests: + description: | + List of content-addressable digests of locally available image manifests + that the image is referenced from. Multiple manifests can refer to the + same image. + + These digests are usually only available if the image was either pulled + from a registry, or if the image was pushed to a registry, which is when + the manifest is generated and its digest calculated. type: "array" x-nullable: false items: type: "string" + example: + - "example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb" + - "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578" Created: + description: | + Date and time at which the image was created as a Unix timestamp + (number of seconds sinds EPOCH). type: "integer" x-nullable: false + example: "1644009612" Size: + description: | + Total size of the image including all layers it is composed of. type: "integer" + format: "int64" x-nullable: false + example: 172064416 SharedSize: + description: | + Total size of image layers that are shared between this image and other + images. + + This size is not calculated by default. `-1` indicates that the value + has not been set / calculated. type: "integer" + format: "int64" x-nullable: false + example: 1239828 VirtualSize: + description: |- + Total size of the image including all layers it is composed of. + + In versions of Docker before v1.10, this field was calculated from + the image itself and all of its parent images. Images are now stored + self-contained, and no longer use a parent-chain, making this field + an equivalent of the Size field. + + Deprecated: this field is kept for backward compatibility, and will be removed in API v1.44. type: "integer" - x-nullable: false + format: "int64" + example: 172064416 Labels: + description: "User-defined key/value metadata." type: "object" x-nullable: false additionalProperties: type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" Containers: + description: | + Number of containers using this image. Includes both stopped and running + containers. + + This size is not calculated by default, and depends on which API endpoint + is used. `-1` indicates that the value has not been set / calculated. x-nullable: false type: "integer" + example: 2 AuthConfig: type: "object" @@ -1680,18 +1994,22 @@ definitions: type: "string" description: "Name of the volume." x-nullable: false + example: "tardis" Driver: type: "string" description: "Name of the volume driver used by the volume." x-nullable: false + example: "custom" Mountpoint: type: "string" description: "Mount path of the volume on the host." x-nullable: false + example: "/var/lib/docker/volumes/tardis" CreatedAt: type: "string" format: "dateTime" description: "Date/Time the volume was created." + example: "2016-06-07T20:31:11.853781916Z" Status: type: "object" description: | @@ -1703,12 +2021,17 @@ definitions: does not support this feature. additionalProperties: type: "object" + example: + hello: "world" Labels: type: "object" description: "User-defined key/value metadata." x-nullable: false additionalProperties: type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" Scope: type: "string" description: | @@ -1717,15 +2040,23 @@ definitions: default: "local" x-nullable: false enum: ["local", "global"] + example: "local" + ClusterVolume: + $ref: "#/definitions/ClusterVolume" Options: type: "object" description: | The driver specific options used when creating the volume. additionalProperties: type: "string" + example: + device: "tmpfs" + o: "size=100m,uid=1000" + type: "tmpfs" UsageData: type: "object" x-nullable: true + x-go-name: "UsageData" required: [Size, RefCount] description: | Usage details about the volume. This information is used by the @@ -1733,6 +2064,7 @@ definitions: properties: Size: type: "integer" + format: "int64" default: -1 description: | Amount of disk space used by the volume (in bytes). This information @@ -1742,23 +2074,71 @@ definitions: x-nullable: false RefCount: type: "integer" + format: "int64" default: -1 description: | The number of containers referencing this volume. This field is set to `-1` if the reference-count is not available. x-nullable: false - example: - Name: "tardis" - Driver: "custom" - Mountpoint: "/var/lib/docker/volumes/tardis" - Status: - hello: "world" + VolumeCreateOptions: + description: "Volume configuration" + type: "object" + title: "VolumeConfig" + x-go-name: "CreateOptions" + properties: + Name: + description: | + The new volume's name. If not specified, Docker generates a name. + type: "string" + x-nullable: false + example: "tardis" + Driver: + description: "Name of the volume driver to use." + type: "string" + default: "local" + x-nullable: false + example: "custom" + DriverOpts: + description: | + A mapping of driver options and values. These options are + passed directly to the driver and are driver specific. + type: "object" + additionalProperties: + type: "string" + example: + device: "tmpfs" + o: "size=100m,uid=1000" + type: "tmpfs" Labels: - com.example.some-label: "some-value" - com.example.some-other-label: "some-other-value" - Scope: "local" - CreatedAt: "2016-06-07T20:31:11.853781916Z" + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + ClusterVolumeSpec: + $ref: "#/definitions/ClusterVolumeSpec" + + VolumeListResponse: + type: "object" + title: "VolumeListResponse" + x-go-name: "ListResponse" + description: "Volume list response" + properties: + Volumes: + type: "array" + description: "List of volumes" + items: + $ref: "#/definitions/Volume" + Warnings: + type: "array" + description: | + Warnings that occurred when fetching the list of volumes. + items: + type: "string" + example: [] Network: type: "object" @@ -1846,15 +2226,27 @@ definitions: ``` type: "array" items: - type: "object" - additionalProperties: - type: "string" + $ref: "#/definitions/IPAMConfig" Options: description: "Driver-specific options, specified as a map." type: "object" additionalProperties: type: "string" + IPAMConfig: + type: "object" + properties: + Subnet: + type: "string" + IPRange: + type: "string" + Gateway: + type: "string" + AuxiliaryAddresses: + type: "object" + additionalProperties: + type: "string" + NetworkContainer: type: "object" properties: @@ -1902,8 +2294,19 @@ definitions: Parent: description: | ID of the parent build cache record. + + > **Deprecated**: This field is deprecated, and omitted if empty. type: "string" - example: "hw53o5aio51xtltp5xjp8v7fx" + x-nullable: true + example: "" + Parents: + description: | + List of parent build cache record IDs. + type: "array" + items: + type: "string" + x-nullable: true + example: ["hw53o5aio51xtltp5xjp8v7fx"] Type: type: "string" description: | @@ -1972,6 +2375,8 @@ definitions: type: "string" error: type: "string" + errorDetail: + $ref: "#/definitions/ErrorDetail" status: type: "string" progress: @@ -2218,6 +2623,25 @@ definitions: type: "string" x-nullable: false + PluginPrivilege: + description: | + Describes a permission the user has to accept upon installing + the plugin. + type: "object" + x-go-name: "PluginPrivilege" + properties: + Name: + type: "string" + example: "network" + Description: + type: "string" + Value: + type: "array" + items: + type: "string" + example: + - "host" + Plugin: description: "A plugin for the Engine API" type: "object" @@ -3000,19 +3424,7 @@ definitions: PluginPrivilege: type: "array" items: - description: | - Describes a permission accepted by the user upon installing the - plugin. - type: "object" - properties: - Name: - type: "string" - Description: - type: "string" - Value: - type: "array" - items: - type: "string" + $ref: "#/definitions/PluginPrivilege" ContainerSpec: type: "object" description: | @@ -3661,6 +4073,7 @@ definitions: ServiceSpec: description: "User modifiable configuration for a service." + type: object properties: Name: description: "Name of the service." @@ -4052,73 +4465,71 @@ definitions: Warning: "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" ContainerSummary: - type: "array" - items: - type: "object" - properties: - Id: - description: "The ID of this container" - type: "string" - x-go-name: "ID" - Names: - description: "The names that this container has been given" - type: "array" - items: - type: "string" - Image: - description: "The name of the image used when creating this container" - type: "string" - ImageID: - description: "The ID of the image that this container was created from" + type: "object" + properties: + Id: + description: "The ID of this container" + type: "string" + x-go-name: "ID" + Names: + description: "The names that this container has been given" + type: "array" + items: type: "string" - Command: - description: "Command to run when starting the container" + Image: + description: "The name of the image used when creating this container" + type: "string" + ImageID: + description: "The ID of the image that this container was created from" + type: "string" + Command: + description: "Command to run when starting the container" + type: "string" + Created: + description: "When the container was created" + type: "integer" + format: "int64" + Ports: + description: "The ports exposed by this container" + type: "array" + items: + $ref: "#/definitions/Port" + SizeRw: + description: "The size of files that have been created or changed by this container" + type: "integer" + format: "int64" + SizeRootFs: + description: "The total size of all the files in this container" + type: "integer" + format: "int64" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: type: "string" - Created: - description: "When the container was created" - type: "integer" - format: "int64" - Ports: - description: "The ports exposed by this container" - type: "array" - items: - $ref: "#/definitions/Port" - SizeRw: - description: "The size of files that have been created or changed by this container" - type: "integer" - format: "int64" - SizeRootFs: - description: "The total size of all the files in this container" - type: "integer" - format: "int64" - Labels: - description: "User-defined key/value metadata." - type: "object" - additionalProperties: + State: + description: "The state of this container (e.g. `Exited`)" + type: "string" + Status: + description: "Additional human-readable status of this container (e.g. `Exit 0`)" + type: "string" + HostConfig: + type: "object" + properties: + NetworkMode: type: "string" - State: - description: "The state of this container (e.g. `Exited`)" - type: "string" - Status: - description: "Additional human-readable status of this container (e.g. `Exit 0`)" - type: "string" - HostConfig: - type: "object" - properties: - NetworkMode: - type: "string" - NetworkSettings: - description: "A summary of the container's network settings" - type: "object" - properties: - Networks: - type: "object" - additionalProperties: - $ref: "#/definitions/EndpointSettings" - Mounts: - type: "array" - items: - $ref: "#/definitions/Mount" + NetworkSettings: + description: "A summary of the container's network settings" + type: "object" + properties: + Networks: + type: "object" + additionalProperties: + $ref: "#/definitions/EndpointSettings" + Mounts: + type: "array" + items: + $ref: "#/definitions/MountPoint" Driver: description: "Driver represents a driver (network, logging, secrets)." @@ -4240,6 +4651,7 @@ definitions: ContainerState stores container's running state. It's part of ContainerJSONBase and will be returned by the "inspect" command. type: "object" + x-nullable: true properties: Status: description: | @@ -4272,7 +4684,8 @@ definitions: example: false OOMKilled: description: | - Whether this container has been killed because it ran out of memory. + Whether a process within this container has been killed because it ran + out of memory since the container was last started. type: "boolean" example: false Dead: @@ -4297,9 +4710,52 @@ definitions: type: "string" example: "2020-01-06T09:07:59.461876391Z" Health: - x-nullable: true $ref: "#/definitions/Health" + ContainerCreateResponse: + description: "OK response to ContainerCreate operation" + type: "object" + title: "ContainerCreateResponse" + x-go-name: "CreateResponse" + required: [Id, Warnings] + properties: + Id: + description: "The ID of the created container" + type: "string" + x-nullable: false + example: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743" + Warnings: + description: "Warnings encountered when creating the container" + type: "array" + x-nullable: false + items: + type: "string" + example: [] + + ContainerWaitResponse: + description: "OK response to ContainerWait operation" + type: "object" + x-go-name: "WaitResponse" + title: "ContainerWaitResponse" + required: [StatusCode] + properties: + StatusCode: + description: "Exit code of the container" + type: "integer" + format: "int64" + x-nullable: false + Error: + $ref: "#/definitions/ContainerWaitExitError" + + ContainerWaitExitError: + description: "container waiting error, if any" + type: "object" + x-go-name: "WaitExitError" + properties: + Message: + description: "Details of an error" + type: "string" + SystemVersion: type: "object" description: | @@ -4396,7 +4852,6 @@ definitions: type: "string" example: "2020-06-22T15:49:27.000000000+00:00" - SystemInfo: type: "object" properties: @@ -4481,14 +4936,13 @@ definitions: description: "Indicates if the host has memory swap limit support enabled." type: "boolean" example: true - KernelMemory: + KernelMemoryTCP: description: | - Indicates if the host has kernel memory limit support enabled. + Indicates if the host has kernel memory TCP limit support enabled. This + field is omitted if not supported. -


- - > **Deprecated**: This field is deprecated as the kernel 5.4 deprecated - > `kmem.limit_in_bytes`. + Kernel memory TCP limits are not supported when using cgroups v2, which + does not support the corresponding `memory.kmem.tcp.limit_in_bytes` cgroup. type: "boolean" example: true CpuCfsPeriod: @@ -4708,42 +5162,8 @@ definitions: ServerVersion: description: | Version string of the daemon. - - > **Note**: the [standalone Swarm API](https://docs.docker.com/swarm/swarm-api/) - > returns the Swarm version instead of the daemon version, for example - > `swarm/1.2.8`. type: "string" - example: "17.06.0-ce" - ClusterStore: - description: | - URL of the distributed storage backend. - - - The storage backend is used for multihost networking (to store - network and endpoint information) and by the node discovery mechanism. - -


- - > **Deprecated**: This field is only propagated when using standalone Swarm - > mode, and overlay networking using an external k/v store. Overlay - > networks with Swarm mode enabled use the built-in raft store, and - > this field will be empty. - type: "string" - example: "consul://consul.corp.example.com:8600/some/path" - ClusterAdvertise: - description: | - The network endpoint that the Engine advertises for the purpose of - node discovery. ClusterAdvertise is a `host:port` combination on which - the daemon is reachable by other hosts. - -


- - > **Deprecated**: This field is only propagated when using standalone Swarm - > mode, and overlay networking using an external k/v store. Overlay - > networks with Swarm mode enabled use the built-in raft store, and - > this field will be empty. - type: "string" - example: "node5.corp.example.com:8000" + example: "24.0.2" Runtimes: description: | List of [OCI compliant](https://github.com/opencontainers/runtime-spec) @@ -4821,7 +5241,8 @@ definitions: SecurityOptions: description: | List of security features that are enabled on the daemon, such as - apparmor, seccomp, SELinux, user-namespaces (userns), and rootless. + apparmor, seccomp, SELinux, user-namespaces (userns), rootless and + no-new-privileges. Additional configuration options for each security feature may be present, and are included as a comma-separated list of key/value @@ -5198,6 +5619,7 @@ definitions: PeerNode: description: "Represents a peer-node in the swarm" + type: "object" properties: NodeID: description: "Unique identifier of for this node in the swarm." @@ -5229,6 +5651,394 @@ definitions: additionalProperties: type: "string" + EventActor: + description: | + Actor describes something that generates events, like a container, network, + or a volume. + type: "object" + properties: + ID: + description: "The ID of the object emitting the event" + type: "string" + example: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743" + Attributes: + description: | + Various key/value attributes of the object, depending on its type. + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-label-value" + image: "alpine:latest" + name: "my-container" + + EventMessage: + description: | + EventMessage represents the information an event contains. + type: "object" + title: "SystemEventsResponse" + properties: + Type: + description: "The type of object emitting the event" + type: "string" + enum: ["builder", "config", "container", "daemon", "image", "network", "node", "plugin", "secret", "service", "volume"] + example: "container" + Action: + description: "The type of event" + type: "string" + example: "create" + Actor: + $ref: "#/definitions/EventActor" + scope: + description: | + Scope of the event. Engine events are `local` scope. Cluster (Swarm) + events are `swarm` scope. + type: "string" + enum: ["local", "swarm"] + time: + description: "Timestamp of event" + type: "integer" + format: "int64" + example: 1629574695 + timeNano: + description: "Timestamp of event, with nanosecond accuracy" + type: "integer" + format: "int64" + example: 1629574695515050031 + + OCIDescriptor: + type: "object" + x-go-name: Descriptor + description: | + A descriptor struct containing digest, media type, and size, as defined in + the [OCI Content Descriptors Specification](https://github.com/opencontainers/image-spec/blob/v1.0.1/descriptor.md). + properties: + mediaType: + description: | + The media type of the object this schema refers to. + type: "string" + example: "application/vnd.docker.distribution.manifest.v2+json" + digest: + description: | + The digest of the targeted content. + type: "string" + example: "sha256:c0537ff6a5218ef531ece93d4984efc99bbf3f7497c0a7726c88e2bb7584dc96" + size: + description: | + The size in bytes of the blob. + type: "integer" + format: "int64" + example: 3987495 + # TODO Not yet including these fields for now, as they are nil / omitted in our response. + # urls: + # description: | + # List of URLs from which this object MAY be downloaded. + # type: "array" + # items: + # type: "string" + # format: "uri" + # annotations: + # description: | + # Arbitrary metadata relating to the targeted content. + # type: "object" + # additionalProperties: + # type: "string" + # platform: + # $ref: "#/definitions/OCIPlatform" + + OCIPlatform: + type: "object" + x-go-name: Platform + description: | + Describes the platform which the image in the manifest runs on, as defined + in the [OCI Image Index Specification](https://github.com/opencontainers/image-spec/blob/v1.0.1/image-index.md). + properties: + architecture: + description: | + The CPU architecture, for example `amd64` or `ppc64`. + type: "string" + example: "arm" + os: + description: | + The operating system, for example `linux` or `windows`. + type: "string" + example: "windows" + os.version: + description: | + Optional field specifying the operating system version, for example on + Windows `10.0.19041.1165`. + type: "string" + example: "10.0.19041.1165" + os.features: + description: | + Optional field specifying an array of strings, each listing a required + OS feature (for example on Windows `win32k`). + type: "array" + items: + type: "string" + example: + - "win32k" + variant: + description: | + Optional field specifying a variant of the CPU, for example `v7` to + specify ARMv7 when architecture is `arm`. + type: "string" + example: "v7" + + DistributionInspect: + type: "object" + x-go-name: DistributionInspect + title: "DistributionInspectResponse" + required: [Descriptor, Platforms] + description: | + Describes the result obtained from contacting the registry to retrieve + image metadata. + properties: + Descriptor: + $ref: "#/definitions/OCIDescriptor" + Platforms: + type: "array" + description: | + An array containing all platforms supported by the image. + items: + $ref: "#/definitions/OCIPlatform" + + ClusterVolume: + type: "object" + description: | + Options and information specific to, and only present on, Swarm CSI + cluster volumes. + properties: + ID: + type: "string" + description: | + The Swarm ID of this volume. Because cluster volumes are Swarm + objects, they have an ID, unlike non-cluster volumes. This ID can + be used to refer to the Volume instead of the name. + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + type: "string" + format: "dateTime" + UpdatedAt: + type: "string" + format: "dateTime" + Spec: + $ref: "#/definitions/ClusterVolumeSpec" + Info: + type: "object" + description: | + Information about the global status of the volume. + properties: + CapacityBytes: + type: "integer" + format: "int64" + description: | + The capacity of the volume in bytes. A value of 0 indicates that + the capacity is unknown. + VolumeContext: + type: "object" + description: | + A map of strings to strings returned from the storage plugin when + the volume is created. + additionalProperties: + type: "string" + VolumeID: + type: "string" + description: | + The ID of the volume as returned by the CSI storage plugin. This + is distinct from the volume's ID as provided by Docker. This ID + is never used by the user when communicating with Docker to refer + to this volume. If the ID is blank, then the Volume has not been + successfully created in the plugin yet. + AccessibleTopology: + type: "array" + description: | + The topology this volume is actually accessible from. + items: + $ref: "#/definitions/Topology" + PublishStatus: + type: "array" + description: | + The status of the volume as it pertains to its publishing and use on + specific nodes + items: + type: "object" + properties: + NodeID: + type: "string" + description: | + The ID of the Swarm node the volume is published on. + State: + type: "string" + description: | + The published state of the volume. + * `pending-publish` The volume should be published to this node, but the call to the controller plugin to do so has not yet been successfully completed. + * `published` The volume is published successfully to the node. + * `pending-node-unpublish` The volume should be unpublished from the node, and the manager is awaiting confirmation from the worker that it has done so. + * `pending-controller-unpublish` The volume is successfully unpublished from the node, but has not yet been successfully unpublished on the controller. + enum: + - "pending-publish" + - "published" + - "pending-node-unpublish" + - "pending-controller-unpublish" + PublishContext: + type: "object" + description: | + A map of strings to strings returned by the CSI controller + plugin when a volume is published. + additionalProperties: + type: "string" + + ClusterVolumeSpec: + type: "object" + description: | + Cluster-specific options used to create the volume. + properties: + Group: + type: "string" + description: | + Group defines the volume group of this volume. Volumes belonging to + the same group can be referred to by group name when creating + Services. Referring to a volume by group instructs Swarm to treat + volumes in that group interchangeably for the purpose of scheduling. + Volumes with an empty string for a group technically all belong to + the same, emptystring group. + AccessMode: + type: "object" + description: | + Defines how the volume is used by tasks. + properties: + Scope: + type: "string" + description: | + The set of nodes this volume can be used on at one time. + - `single` The volume may only be scheduled to one node at a time. + - `multi` the volume may be scheduled to any supported number of nodes at a time. + default: "single" + enum: ["single", "multi"] + x-nullable: false + Sharing: + type: "string" + description: | + The number and way that different tasks can use this volume + at one time. + - `none` The volume may only be used by one task at a time. + - `readonly` The volume may be used by any number of tasks, but they all must mount the volume as readonly + - `onewriter` The volume may be used by any number of tasks, but only one may mount it as read/write. + - `all` The volume may have any number of readers and writers. + default: "none" + enum: ["none", "readonly", "onewriter", "all"] + x-nullable: false + MountVolume: + type: "object" + description: | + Options for using this volume as a Mount-type volume. + + Either MountVolume or BlockVolume, but not both, must be + present. + properties: + FsType: + type: "string" + description: | + Specifies the filesystem type for the mount volume. + Optional. + MountFlags: + type: "array" + description: | + Flags to pass when mounting the volume. Optional. + items: + type: "string" + BlockVolume: + type: "object" + description: | + Options for using this volume as a Block-type volume. + Intentionally empty. + Secrets: + type: "array" + description: | + Swarm Secrets that are passed to the CSI storage plugin when + operating on this volume. + items: + type: "object" + description: | + One cluster volume secret entry. Defines a key-value pair that + is passed to the plugin. + properties: + Key: + type: "string" + description: | + Key is the name of the key of the key-value pair passed to + the plugin. + Secret: + type: "string" + description: | + Secret is the swarm Secret object from which to read data. + This can be a Secret name or ID. The Secret data is + retrieved by swarm and used as the value of the key-value + pair passed to the plugin. + AccessibilityRequirements: + type: "object" + description: | + Requirements for the accessible topology of the volume. These + fields are optional. For an in-depth description of what these + fields mean, see the CSI specification. + properties: + Requisite: + type: "array" + description: | + A list of required topologies, at least one of which the + volume must be accessible from. + items: + $ref: "#/definitions/Topology" + Preferred: + type: "array" + description: | + A list of topologies that the volume should attempt to be + provisioned in. + items: + $ref: "#/definitions/Topology" + CapacityRange: + type: "object" + description: | + The desired capacity that the volume should be created with. If + empty, the plugin will decide the capacity. + properties: + RequiredBytes: + type: "integer" + format: "int64" + description: | + The volume must be at least this big. The value of 0 + indicates an unspecified minimum + LimitBytes: + type: "integer" + format: "int64" + description: | + The volume must not be bigger than this. The value of 0 + indicates an unspecified maximum. + Availability: + type: "string" + description: | + The availability of the volume for use in tasks. + - `active` The volume is fully available for scheduling on the cluster + - `pause` No new workloads should use the volume, but existing workloads are not stopped. + - `drain` All workloads using this volume should be stopped and rescheduled, and no new ones should be started. + default: "active" + x-nullable: false + enum: + - "active" + - "pause" + - "drain" + + Topology: + description: | + A map of topological domains to topological segments. For in depth + details, see documentation for the Topology object in the CSI + specification. + type: "object" + additionalProperties: + type: "string" + paths: /containers/json: get: @@ -5291,7 +6101,9 @@ paths: 200: description: "no error" schema: - $ref: "#/definitions/ContainerSummary" + type: "array" + items: + $ref: "#/definitions/ContainerSummary" examples: application/json: - Id: "8dfafdbc3a40" @@ -5517,7 +6329,6 @@ paths: Memory: 0 MemorySwap: 0 MemoryReservation: 0 - KernelMemory: 0 NanoCpus: 500000 CpuPercent: 80 CpuShares: 512 @@ -5611,25 +6422,7 @@ paths: 201: description: "Container created successfully" schema: - type: "object" - title: "ContainerCreateResponse" - description: "OK response to ContainerCreate operation" - required: [Id, Warnings] - properties: - Id: - description: "The ID of the created container" - type: "string" - x-nullable: false - Warnings: - description: "Warnings encountered when creating the container" - type: "array" - x-nullable: false - items: - type: "string" - examples: - application/json: - Id: "e90e34656806" - Warnings: [] + $ref: "#/definitions/ContainerCreateResponse" 400: description: "bad parameter" schema: @@ -5679,7 +6472,6 @@ paths: items: type: "string" State: - x-nullable: true $ref: "#/definitions/ContainerState" Image: description: "The container's image ID" @@ -5810,7 +6602,6 @@ paths: Memory: 0 MemorySwap: 0 MemoryReservation: 0 - KernelMemory: 0 OomKillDisable: false OomScoreAdj: 500 NetworkMode: "bridge" @@ -6008,6 +6799,9 @@ paths: Note: This endpoint works only for containers with the `json-file` or `journald` logging driver. + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" operationId: "ContainerLogs" responses: 200: @@ -6081,9 +6875,9 @@ paths: Returns which files in a container's filesystem have been added, deleted, or modified. The `Kind` of modification can be one of: - - `0`: Modified - - `1`: Added - - `2`: Deleted + - `0`: Modified ("C") + - `1`: Added ("A") + - `2`: Deleted ("D") operationId: "ContainerChanges" produces: ["application/json"] responses: @@ -6092,22 +6886,7 @@ paths: schema: type: "array" items: - type: "object" - x-go-name: "ContainerChangeResponseItem" - title: "ContainerChangeResponseItem" - description: "change item in response to ContainerChanges operation" - required: [Path, Kind] - properties: - Path: - description: "Path to file that has changed" - type: "string" - x-nullable: false - Kind: - description: "Kind of change" - type: "integer" - format: "uint8" - enum: [0, 1, 2] - x-nullable: false + $ref: "#/definitions/FilesystemChange" examples: application/json: - Path: "/dev" @@ -6421,6 +7200,11 @@ paths: required: true description: "ID or name of the container" type: "string" + - name: "signal" + in: "query" + description: | + Signal to send to the container as an integer or string (e.g. `SIGINT`). + type: "string" - name: "t" in: "query" description: "Number of seconds to wait before killing the container" @@ -6450,6 +7234,11 @@ paths: required: true description: "ID or name of the container" type: "string" + - name: "signal" + in: "query" + description: | + Signal to send to the container as an integer or string (e.g. `SIGINT`). + type: "string" - name: "t" in: "query" description: "Number of seconds to wait before killing the container" @@ -6491,7 +7280,8 @@ paths: type: "string" - name: "signal" in: "query" - description: "Signal to send to the container as an integer or string (e.g. `SIGINT`)" + description: | + Signal to send to the container as an integer or string (e.g. `SIGINT`). type: "string" default: "SIGKILL" tags: ["Container"] @@ -6555,7 +7345,6 @@ paths: Memory: 314572800 MemorySwap: 514288000 MemoryReservation: 209715200 - KernelMemory: 52428800 RestartPolicy: MaximumRetryCount: 4 Name: "on-failure" @@ -6709,7 +7498,8 @@ paths: ### Stream format When the TTY setting is disabled in [`POST /containers/create`](#operation/ContainerCreate), - the stream over the hijacked connected is multiplexed to separate out + the HTTP Content-Type header is set to application/vnd.docker.multiplexed-stream + and the stream over the hijacked connected is multiplexed to separate out `stdout` and `stderr`. The stream consists of a series of frames, each containing a header and a payload. @@ -6753,6 +7543,7 @@ paths: operationId: "ContainerAttach" produces: - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" responses: 101: description: "no error, hints proxy about hijacking" @@ -6894,22 +7685,11 @@ paths: 200: description: "The container has exit." schema: - type: "object" - title: "ContainerWaitResponse" - description: "OK response to ContainerWait operation" - required: [StatusCode] - properties: - StatusCode: - description: "Exit code of the container" - type: "integer" - x-nullable: false - Error: - description: "container waiting error, if any" - type: "object" - properties: - Message: - description: "Details of an error" - type: "string" + $ref: "#/definitions/ContainerWaitResponse" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" 404: description: "no such container" schema: @@ -6930,9 +7710,14 @@ paths: - name: "condition" in: "query" description: | - Wait until a container state reaches the given condition, either - 'not-running' (default), 'next-exit', or 'removed'. + Wait until a container state reaches the given condition. + + Defaults to `not-running` if omitted or empty. type: "string" + enum: + - "not-running" + - "next-exit" + - "removed" default: "not-running" tags: ["Container"] /containers/{id}: @@ -7008,17 +7793,7 @@ paths: 400: description: "Bad parameter" schema: - allOf: - - $ref: "#/definitions/ErrorResponse" - - type: "object" - properties: - message: - description: | - The error message. Either "must specify path parameter" - (path cannot be empty) or "not a directory" (path was - asserted to be a directory but exists as a file). - type: "string" - x-nullable: false + $ref: "#/definitions/ErrorResponse" 404: description: "Container or path does not exist" schema: @@ -7050,20 +7825,10 @@ paths: responses: 200: description: "no error" - 400: - description: "Bad parameter" - schema: - allOf: - - $ref: "#/definitions/ErrorResponse" - - type: "object" - properties: - message: - description: | - The error message. Either "must specify path parameter" - (path cannot be empty) or "not a directory" (path was - asserted to be a directory but exists as a file). - type: "string" - x-nullable: false + 400: + description: "Bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" 404: description: "Container or path does not exist" schema: @@ -7089,7 +7854,10 @@ paths: tags: ["Container"] put: summary: "Extract an archive of files or folders to a directory in a container" - description: "Upload a tar archive to be extracted to a path in the filesystem of container id." + description: | + Upload a tar archive to be extracted to a path in the filesystem of container id. + `path` parameter is asserted to be a directory. If it exists as a file, 400 error + will be returned with message "not a directory". operationId: "PutContainerArchive" consumes: ["application/x-tar", "application/octet-stream"] responses: @@ -7099,6 +7867,9 @@ paths: description: "Bad parameter" schema: $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "not a directory" 403: description: "Permission denied, the volume or container rootfs is marked as read-only." schema: @@ -7200,35 +7971,6 @@ paths: type: "array" items: $ref: "#/definitions/ImageSummary" - examples: - application/json: - - Id: "sha256:e216a057b1cb1efc11f8a268f37ef62083e70b1b38323ba252e25ac88904a7e8" - ParentId: "" - RepoTags: - - "ubuntu:12.04" - - "ubuntu:precise" - RepoDigests: - - "ubuntu@sha256:992069aee4016783df6345315302fa59681aae51a8eeb2f889dea59290f21787" - Created: 1474925151 - Size: 103579269 - VirtualSize: 103579269 - SharedSize: 0 - Labels: {} - Containers: 2 - - Id: "sha256:3e314f95dcace0f5e4fd37b10862fe8398e3c60ed36600bc0ca5fda78b087175" - ParentId: "" - RepoTags: - - "ubuntu:12.10" - - "ubuntu:quantal" - RepoDigests: - - "ubuntu@sha256:002fba3e3255af10be97ea26e476692a7ebed0bb074a9ab960b2e7a1526b15d7" - - "ubuntu@sha256:68ea0200f0b90df725d99d823905b04cf844f6039ef60c60bf3e019915017bd3" - Created: 1403128455 - Size: 172064416 - VirtualSize: 172064416 - SharedSize: 0 - Labels: {} - Containers: 5 500: description: "server error" schema: @@ -7253,6 +7995,11 @@ paths: - `reference`=(`[:]`) - `since`=(`[:]`, `` or ``) type: "string" + - name: "shared-size" + in: "query" + description: "Compute and show shared size as a `SharedSize` field on each image." + type: "boolean" + default: false - name: "digests" in: "query" description: "Show digest information as a `RepoDigests` field on each image." @@ -7466,7 +8213,7 @@ paths: Available filters: - - `until=`: duration relative to daemon's time, during which build cache was not used, in Go's duration format (e.g., '24h') + - `until=` remove cache older than ``. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon's local time. - `id=` - `parent=` - `type=` @@ -7551,9 +8298,36 @@ paths: Refer to the [authentication section](#section/Authentication) for details. type: "string" + - name: "changes" + in: "query" + description: | + Apply `Dockerfile` instructions to the image that is created, + for example: `changes=ENV DEBUG=true`. + Note that `ENV DEBUG=true` should be URI component encoded. + + Supported `Dockerfile` instructions: + `CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` + type: "array" + items: + type: "string" - name: "platform" in: "query" - description: "Platform in the format os[/arch[/variant]]" + description: | + Platform in the format os[/arch[/variant]]. + + When used in combination with the `fromImage` option, the daemon checks + if the given image is present in the local image cache with the given + OS and Architecture, and otherwise attempts to pull the image. If the + option is not set, the host's native OS and Architecture are used. + If the given image does not exist in the local image cache, the daemon + attempts to pull the image with the host's native OS and Architecture. + If the given image does exists in the local image cache, but its OS or + architecture does not match, a warning is produced. + + When used with the `fromSrc` option to import an image from an archive, + this option sets the platform information for the imported image. If + the option is not set, the host's native OS and Architecture are used + for the imported image. type: "string" default: "" tags: ["Image"] @@ -7568,84 +8342,7 @@ paths: 200: description: "No error" schema: - $ref: "#/definitions/Image" - examples: - application/json: - Id: "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c" - Container: "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a" - Comment: "" - Os: "linux" - Architecture: "amd64" - Parent: "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c" - ContainerConfig: - Tty: false - Hostname: "e611e15f9c9d" - Domainname: "" - AttachStdout: false - PublishService: "" - AttachStdin: false - OpenStdin: false - StdinOnce: false - NetworkDisabled: false - OnBuild: [] - Image: "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c" - User: "" - WorkingDir: "" - MacAddress: "" - AttachStderr: false - Labels: - com.example.license: "GPL" - com.example.version: "1.0" - com.example.vendor: "Acme" - Env: - - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - Cmd: - - "/bin/sh" - - "-c" - - "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0" - DockerVersion: "1.9.0-dev" - VirtualSize: 188359297 - Size: 0 - Author: "" - Created: "2015-09-10T08:30:53.26995814Z" - GraphDriver: - Name: "aufs" - Data: {} - RepoDigests: - - "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - RepoTags: - - "example:1.0" - - "example:latest" - - "example:stable" - Config: - Image: "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c" - NetworkDisabled: false - OnBuild: [] - StdinOnce: false - PublishService: "" - AttachStdin: false - OpenStdin: false - Domainname: "" - AttachStdout: false - Tty: false - Hostname: "e611e15f9c9d" - Cmd: - - "/bin/bash" - Env: - - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - Labels: - com.example.vendor: "Acme" - com.example.version: "1.0" - com.example.license: "GPL" - MacAddress: "" - AttachStderr: false - WorkingDir: "" - User: "" - RootFS: - Type: "layers" - Layers: - - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6" - - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" + $ref: "#/definitions/ImageInspect" 404: description: "No such image" schema: @@ -8015,6 +8712,10 @@ paths: IdentityToken: "9cbaf023786cd7..." 204: description: "No error" + 401: + description: "Auth error" + schema: + $ref: "#/definitions/ErrorResponse" 500: description: "Server error" schema: @@ -8076,10 +8777,27 @@ paths: description: "Max API Version the server supports" Builder-Version: type: "string" - description: "Default version of docker image builder" + description: | + Default version of docker image builder + + The default on Linux is version "2" (BuildKit), but the daemon + can be configured to recommend version "1" (classic Builder). + Windows does not yet support BuildKit for native Windows images, + and uses "1" (classic builder) as a default. + + This value is a recommendation as advertised by the daemon, and + it is up to the client to choose which builder to use. + default: "2" Docker-Experimental: type: "boolean" description: "If the server is running with experimental mode enabled" + Swarm: + type: "string" + enum: ["inactive", "pending", "error", "locked", "active/worker", "active/manager"] + description: | + Contains information about Swarm status of the daemon, + and if the daemon is acting as a manager or worker node. + default: "inactive" Cache-Control: type: "string" default: "no-cache, no-store, must-revalidate" @@ -8119,6 +8837,13 @@ paths: Docker-Experimental: type: "boolean" description: "If the server is running with experimental mode enabled" + Swarm: + type: "string" + enum: ["inactive", "pending", "error", "locked", "active/worker", "active/manager"] + description: | + Contains information about Swarm status of the daemon, + and if the daemon is acting as a manager or worker node. + default: "inactive" Cache-Control: type: "string" default: "no-cache, no-store, must-revalidate" @@ -8225,44 +8950,7 @@ paths: 200: description: "no error" schema: - type: "object" - title: "SystemEventsResponse" - properties: - Type: - description: "The type of object emitting the event" - type: "string" - Action: - description: "The type of event" - type: "string" - Actor: - type: "object" - properties: - ID: - description: "The ID of the object emitting the event" - type: "string" - Attributes: - description: "Various key/value attributes of the object, depending on its type" - type: "object" - additionalProperties: - type: "string" - time: - description: "Timestamp of event" - type: "integer" - timeNano: - description: "Timestamp of event, with nanosecond accuracy" - type: "integer" - format: "int64" - examples: - application/json: - Type: "container" - Action: "create" - Actor: - ID: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743" - Attributes: - com.example.some-label: "some-label-value" - image: "alpine" - name: "my-container" - time: 1461943101 + $ref: "#/definitions/EventMessage" 400: description: "bad parameter" schema: @@ -8390,10 +9078,43 @@ paths: UsageData: Size: 10920104 RefCount: 2 + BuildCache: + - + ID: "hw53o5aio51xtltp5xjp8v7fx" + Parents: [] + Type: "regular" + Description: "pulled from docker.io/library/debian@sha256:234cb88d3020898631af0ccbbcca9a66ae7306ecd30c9720690858c1b007d2a0" + InUse: false + Shared: true + Size: 0 + CreatedAt: "2021-06-28T13:31:01.474619385Z" + LastUsedAt: "2021-07-07T22:02:32.738075951Z" + UsageCount: 26 + - + ID: "ndlpt0hhvkqcdfkputsk4cq9c" + Parents: ["ndlpt0hhvkqcdfkputsk4cq9c"] + Type: "regular" + Description: "mount / from exec /bin/sh -c echo 'Binary::apt::APT::Keep-Downloaded-Packages \"true\";' > /etc/apt/apt.conf.d/keep-cache" + InUse: false + Shared: true + Size: 51 + CreatedAt: "2021-06-28T13:31:03.002625487Z" + LastUsedAt: "2021-07-07T22:02:32.773909517Z" + UsageCount: 26 500: description: "server error" schema: $ref: "#/definitions/ErrorResponse" + parameters: + - name: "type" + in: "query" + description: | + Object types, for which to compute and return data. + type: "array" + collectionFormat: multi + items: + type: "string" + enum: ["container", "image", "volume", "build-cache"] tags: ["System"] /images/{name}/get: get: @@ -8544,6 +9265,7 @@ paths: description: "Exec configuration" schema: type: "object" + title: "ExecConfig" properties: AttachStdin: type: "boolean" @@ -8554,6 +9276,15 @@ paths: AttachStderr: type: "boolean" description: "Attach to `stderr` of the exec command." + ConsoleSize: + type: "array" + description: "Initial console size, as an `[height, width]` array." + x-nullable: true + minItems: 2 + maxItems: 2 + items: + type: "integer" + minimum: 0 DetachKeys: type: "string" description: | @@ -8618,6 +9349,7 @@ paths: - "application/json" produces: - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" responses: 200: description: "No error" @@ -8634,6 +9366,7 @@ paths: in: "body" schema: type: "object" + title: "ExecStartConfig" properties: Detach: type: "boolean" @@ -8641,9 +9374,19 @@ paths: Tty: type: "boolean" description: "Allocate a pseudo-TTY." + ConsoleSize: + type: "array" + description: "Initial console size, as an `[height, width]` array." + x-nullable: true + minItems: 2 + maxItems: 2 + items: + type: "integer" + minimum: 0 example: Detach: false - Tty: false + Tty: true + ConsoleSize: [80, 64] - name: "id" in: "path" description: "Exec instance ID" @@ -8769,41 +9512,7 @@ paths: 200: description: "Summary volume data that matches the query" schema: - type: "object" - title: "VolumeListResponse" - description: "Volume list response" - required: [Volumes, Warnings] - properties: - Volumes: - type: "array" - x-nullable: false - description: "List of volumes" - items: - $ref: "#/definitions/Volume" - Warnings: - type: "array" - x-nullable: false - description: | - Warnings that occurred when fetching the list of volumes. - items: - type: "string" - - examples: - application/json: - Volumes: - - CreatedAt: "2017-07-19T12:00:26Z" - Name: "tardis" - Driver: "local" - Mountpoint: "/var/lib/docker/volumes/tardis" - Labels: - com.example.some-label: "some-value" - com.example.some-other-label: "some-other-value" - Scope: "local" - Options: - device: "tmpfs" - o: "size=100m,uid=1000" - type: "tmpfs" - Warnings: [] + $ref: "#/definitions/VolumeListResponse" 500: description: "Server error" schema: @@ -8848,38 +9557,7 @@ paths: required: true description: "Volume configuration" schema: - type: "object" - description: "Volume configuration" - title: "VolumeConfig" - properties: - Name: - description: | - The new volume's name. If not specified, Docker generates a name. - type: "string" - x-nullable: false - Driver: - description: "Name of the volume driver to use." - type: "string" - default: "local" - x-nullable: false - DriverOpts: - description: | - A mapping of driver options and values. These options are - passed directly to the driver and are driver specific. - type: "object" - additionalProperties: - type: "string" - Labels: - description: "User-defined key/value metadata." - type: "object" - additionalProperties: - type: "string" - example: - Name: "tardis" - Labels: - com.example.some-label: "some-value" - com.example.some-other-label: "some-other-value" - Driver: "custom" + $ref: "#/definitions/VolumeCreateOptions" tags: ["Volume"] /volumes/{name}: @@ -8908,6 +9586,64 @@ paths: type: "string" tags: ["Volume"] + put: + summary: | + "Update a volume. Valid only for Swarm cluster volumes" + operationId: "VolumeUpdate" + consumes: ["application/json"] + produces: ["application/json"] + responses: + 200: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such volume" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "The name or ID of the volume" + type: "string" + required: true + - name: "body" + in: "body" + schema: + # though the schema for is an object that contains only a + # ClusterVolumeSpec, wrapping the ClusterVolumeSpec in this object + # means that if, later on, we support things like changing the + # labels, we can do so without duplicating that information to the + # ClusterVolumeSpec. + type: "object" + description: "Volume configuration" + properties: + Spec: + $ref: "#/definitions/ClusterVolumeSpec" + description: | + The spec of the volume to update. Currently, only Availability may + change. All other fields must remain unchanged. + - name: "version" + in: "query" + description: | + The version number of the volume being updated. This is required to + avoid conflicting writes. Found in the volume's `ClusterVolume` + field. + type: "integer" + format: "int64" + required: true + tags: ["Volume"] + delete: summary: "Remove a volume" description: "Instruct the driver to remove the volume." @@ -8939,6 +9675,7 @@ paths: type: "boolean" default: false tags: ["Volume"] + /volumes/prune: post: summary: "Delete unused volumes" @@ -8953,6 +9690,7 @@ paths: Available filters: - `label` (`label=`, `label==`, `label!=`, or `label!==`) Prune volumes with (or without, in case `label!=...` is used) the specified labels. + - `all` (`all=true`) - Consider all (local) volumes for pruning and not just anonymous volumes. type: "string" responses: 200: @@ -9158,7 +9896,9 @@ paths: Id: "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30" Warning: "" 403: - description: "operation not supported for pre-defined networks" + description: | + Forbidden operation. This happens when trying to create a network named after a pre-defined network, + or when trying to create an overlay network on a daemon which is not part of a Swarm cluster. schema: $ref: "#/definitions/ErrorResponse" 404: @@ -9176,6 +9916,7 @@ paths: required: true schema: type: "object" + title: "NetworkCreateRequest" required: ["Name"] properties: Name: @@ -9286,6 +10027,7 @@ paths: required: true schema: type: "object" + title: "NetworkConnectRequest" properties: Container: type: "string" @@ -9332,6 +10074,7 @@ paths: required: true schema: type: "object" + title: "NetworkDisconnectRequest" properties: Container: type: "string" @@ -9416,20 +10159,7 @@ paths: schema: type: "array" items: - description: | - Describes a permission the user has to accept upon installing - the plugin. - type: "object" - title: "PluginPrivilegeItem" - properties: - Name: - type: "string" - Description: - type: "string" - Value: - type: "array" - items: - type: "string" + $ref: "#/definitions/PluginPrivilege" example: - Name: "network" Description: "" @@ -9505,19 +10235,7 @@ paths: schema: type: "array" items: - description: | - Describes a permission accepted by the user upon installing the - plugin. - type: "object" - properties: - Name: - type: "string" - Description: - type: "string" - Value: - type: "array" - items: - type: "string" + $ref: "#/definitions/PluginPrivilege" example: - Name: "network" Description: "" @@ -9643,6 +10361,12 @@ paths: default if omitted. required: true type: "string" + - name: "force" + in: "query" + description: | + Force disable a plugin even if still in use. + required: false + type: "boolean" tags: ["Plugin"] /plugins/{name}/upgrade: post: @@ -9689,19 +10413,7 @@ paths: schema: type: "array" items: - description: | - Describes a permission accepted by the user upon installing the - plugin. - type: "object" - properties: - Name: - type: "string" - Description: - type: "string" - Value: - type: "array" - items: - type: "string" + $ref: "#/definitions/PluginPrivilege" example: - Name: "network" Description: "" @@ -9991,6 +10703,7 @@ paths: required: true schema: type: "object" + title: "SwarmInitRequest" properties: ListenAddr: description: | @@ -10089,6 +10802,7 @@ paths: required: true schema: type: "object" + title: "SwarmJoinRequest" properties: ListenAddr: description: | @@ -10109,7 +10823,7 @@ paths: description: | Address or interface to use for data path traffic (format: ``), for example, `192.168.1.1`, or an interface, - like `eth0`. If `DataPathAddr` is unspecified, the same addres + like `eth0`. If `DataPathAddr` is unspecified, the same address as `AdvertiseAddr` is used. The `DataPathAddr` specifies the address that global scope @@ -10249,6 +10963,7 @@ paths: required: true schema: type: "object" + title: "SwarmUnlockRequest" properties: UnlockKey: description: "The swarm's unlock key." @@ -10611,6 +11326,9 @@ paths: **Note**: This endpoint works only for services with the `local`, `json-file` or `journald` logging drivers. + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" operationId: "ServiceLogs" responses: 200: @@ -10866,6 +11584,9 @@ paths: **Note**: This endpoint works only for services with the `local`, `json-file` or `journald` logging drivers. operationId: "TaskLogs" + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" responses: 200: description: "logs returned as a stream in response body" @@ -11360,67 +12081,7 @@ paths: 200: description: "descriptor and platform information" schema: - type: "object" - x-go-name: DistributionInspect - title: "DistributionInspectResponse" - required: [Descriptor, Platforms] - properties: - Descriptor: - type: "object" - description: | - A descriptor struct containing digest, media type, and size. - properties: - MediaType: - type: "string" - Size: - type: "integer" - format: "int64" - Digest: - type: "string" - URLs: - type: "array" - items: - type: "string" - Platforms: - type: "array" - description: | - An array containing all platforms supported by the image. - items: - type: "object" - properties: - Architecture: - type: "string" - OS: - type: "string" - OSVersion: - type: "string" - OSFeatures: - type: "array" - items: - type: "string" - Variant: - type: "string" - Features: - type: "array" - items: - type: "string" - examples: - application/json: - Descriptor: - MediaType: "application/vnd.docker.distribution.manifest.v2+json" - Digest: "sha256:c0537ff6a5218ef531ece93d4984efc99bbf3f7497c0a7726c88e2bb7584dc96" - Size: 3987495 - URLs: - - "" - Platforms: - - Architecture: "amd64" - OS: "linux" - OSVersion: "" - OSFeatures: - - "" - Variant: "" - Features: - - "" + $ref: "#/definitions/DistributionInspect" 401: description: "Failed authentication or no image found" schema: diff --git a/vendor/github.com/docker/docker/api/types/auth.go b/vendor/github.com/docker/docker/api/types/auth.go index ddf15bb182..9ee329a2fb 100644 --- a/vendor/github.com/docker/docker/api/types/auth.go +++ b/vendor/github.com/docker/docker/api/types/auth.go @@ -1,22 +1,7 @@ package types // import "github.com/docker/docker/api/types" +import "github.com/docker/docker/api/types/registry" -// AuthConfig contains authorization information for connecting to a Registry -type AuthConfig struct { - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty"` - Auth string `json:"auth,omitempty"` - - // Email is an optional value associated with the username. - // This field is deprecated and will be removed in a later - // version of docker. - Email string `json:"email,omitempty"` - - ServerAddress string `json:"serveraddress,omitempty"` - - // IdentityToken is used to authenticate the user and get - // an access token for the registry. - IdentityToken string `json:"identitytoken,omitempty"` - - // RegistryToken is a bearer token to be sent to a registry - RegistryToken string `json:"registrytoken,omitempty"` -} +// AuthConfig contains authorization information for connecting to a Registry. +// +// Deprecated: use github.com/docker/docker/api/types/registry.AuthConfig +type AuthConfig = registry.AuthConfig diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go index 9c464b73e2..d8cd306135 100644 --- a/vendor/github.com/docker/docker/api/types/client.go +++ b/vendor/github.com/docker/docker/api/types/client.go @@ -7,6 +7,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/registry" units "github.com/docker/go-units" ) @@ -59,7 +60,6 @@ type ContainerExecInspect struct { // ContainerListOptions holds parameters to list containers with. type ContainerListOptions struct { - Quiet bool Size bool All bool Latest bool @@ -113,10 +113,16 @@ type NetworkListOptions struct { Filters filters.Args } +// NewHijackedResponse intializes a HijackedResponse type +func NewHijackedResponse(conn net.Conn, mediaType string) HijackedResponse { + return HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn), mediaType: mediaType} +} + // HijackedResponse holds connection information for a hijacked request. type HijackedResponse struct { - Conn net.Conn - Reader *bufio.Reader + mediaType string + Conn net.Conn + Reader *bufio.Reader } // Close closes the hijacked connection and reader. @@ -124,6 +130,15 @@ func (h *HijackedResponse) Close() { h.Conn.Close() } +// MediaType let client know if HijackedResponse hold a raw or multiplexed stream. +// returns false if HTTP Content-Type is not relevant, and container must be inspected +func (h *HijackedResponse) MediaType() (string, bool) { + if h.mediaType == "" { + return "", false + } + return h.mediaType, true +} + // CloseWriter is an interface that implements structs // that close input streams to prevent from writing. type CloseWriter interface { @@ -166,7 +181,7 @@ type ImageBuildOptions struct { // at all (nil). See the parsing of buildArgs in // api/server/router/build/build_routes.go for even more info. BuildArgs map[string]*string - AuthConfigs map[string]AuthConfig + AuthConfigs map[string]registry.AuthConfig Context io.Reader Labels map[string]string // squash the resulting image's layers to the parent @@ -236,10 +251,20 @@ type ImageImportOptions struct { Platform string // Platform is the target platform of the image } -// ImageListOptions holds parameters to filter the list of images with. +// ImageListOptions holds parameters to list images with. type ImageListOptions struct { - All bool + // All controls whether all images in the graph are filtered, or just + // the heads. + All bool + + // Filters is a JSON-encoded set of filter arguments. Filters filters.Args + + // SharedSize indicates whether the shared size of images should be computed. + SharedSize bool + + // ContainerCount indicates whether container count should be computed. + ContainerCount bool } // ImageLoadResponse returns information to the client about a load process. diff --git a/vendor/github.com/docker/docker/api/types/configs.go b/vendor/github.com/docker/docker/api/types/configs.go index 3dd133a3a5..7d5930bbeb 100644 --- a/vendor/github.com/docker/docker/api/types/configs.go +++ b/vendor/github.com/docker/docker/api/types/configs.go @@ -3,7 +3,7 @@ package types // import "github.com/docker/docker/api/types" import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" - specs "github.com/opencontainers/image-spec/specs-go/v1" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) // configs holds structs used for internal communication between the @@ -16,7 +16,7 @@ type ContainerCreateConfig struct { Config *container.Config HostConfig *container.HostConfig NetworkingConfig *network.NetworkingConfig - Platform *specs.Platform + Platform *ocispec.Platform AdjustCPUShares bool } @@ -33,6 +33,7 @@ type ExecConfig struct { User string // User that will run the command Privileged bool // Is the container in privileged mode Tty bool // Attach standard streams to a tty. + ConsoleSize *[2]uint `json:",omitempty"` // Initial console size [height, width] AttachStdin bool // Attach the standard input, makes possible user interaction AttachStderr bool // Attach the standard error AttachStdout bool // Attach the standard output diff --git a/vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go b/vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go new file mode 100644 index 0000000000..6b4b47390d --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go @@ -0,0 +1,6 @@ +package container + +// ContainerChangeResponseItem change item in response to ContainerChanges operation +// +// Deprecated: use [FilesystemChange]. +type ContainerChangeResponseItem = FilesystemChange diff --git a/vendor/github.com/docker/docker/api/types/container/change_type.go b/vendor/github.com/docker/docker/api/types/container/change_type.go new file mode 100644 index 0000000000..fe8d6d3696 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/change_type.go @@ -0,0 +1,15 @@ +package container + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// ChangeType Kind of change +// +// Can be one of: +// +// - `0`: Modified ("C") +// - `1`: Added ("A") +// - `2`: Deleted ("D") +// +// swagger:model ChangeType +type ChangeType uint8 diff --git a/vendor/github.com/docker/docker/api/types/container/change_types.go b/vendor/github.com/docker/docker/api/types/container/change_types.go new file mode 100644 index 0000000000..3a3a83866e --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/change_types.go @@ -0,0 +1,23 @@ +package container + +const ( + // ChangeModify represents the modify operation. + ChangeModify ChangeType = 0 + // ChangeAdd represents the add operation. + ChangeAdd ChangeType = 1 + // ChangeDelete represents the delete operation. + ChangeDelete ChangeType = 2 +) + +func (ct ChangeType) String() string { + switch ct { + case ChangeModify: + return "C" + case ChangeAdd: + return "A" + case ChangeDelete: + return "D" + default: + return "" + } +} diff --git a/vendor/github.com/docker/docker/api/types/container/config.go b/vendor/github.com/docker/docker/api/types/container/config.go index f767195b94..077583e66c 100644 --- a/vendor/github.com/docker/docker/api/types/container/config.go +++ b/vendor/github.com/docker/docker/api/types/container/config.go @@ -1,6 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" import ( + "io" "time" "github.com/docker/docker/api/types/strslice" @@ -13,6 +14,24 @@ import ( // Docker interprets it as 3 nanoseconds. const MinimumDuration = 1 * time.Millisecond +// StopOptions holds the options to stop or restart a container. +type StopOptions struct { + // Signal (optional) is the signal to send to the container to (gracefully) + // stop it before forcibly terminating the container with SIGKILL after the + // timeout expires. If not value is set, the default (SIGTERM) is used. + Signal string `json:",omitempty"` + + // Timeout (optional) is the timeout (in seconds) to wait for the container + // to stop gracefully before forcibly terminating it with SIGKILL. + // + // - Use nil to use the default timeout (10 seconds). + // - Use '-1' to wait indefinitely. + // - Use '0' to not wait for the container to exit gracefully, and + // immediately proceeds to forcibly terminating the container. + // - Other positive values are used as timeout (in seconds). + Timeout *int `json:",omitempty"` +} + // HealthConfig holds configuration settings for the HEALTHCHECK feature. type HealthConfig struct { // Test is the test to perform to check that the container is healthy. @@ -34,6 +53,14 @@ type HealthConfig struct { Retries int `json:",omitempty"` } +// ExecStartOptions holds the options to start container's exec. +type ExecStartOptions struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer + ConsoleSize *[2]uint `json:",omitempty"` +} + // Config contains the configuration data about a container. // It should hold only portable information about the container. // Here, "portable" means "independent from the host we are running on". diff --git a/vendor/github.com/docker/docker/api/types/container/container_changes.go b/vendor/github.com/docker/docker/api/types/container/container_changes.go deleted file mode 100644 index 16dd5019ee..0000000000 --- a/vendor/github.com/docker/docker/api/types/container/container_changes.go +++ /dev/null @@ -1,20 +0,0 @@ -package container // import "github.com/docker/docker/api/types/container" - -// ---------------------------------------------------------------------------- -// Code generated by `swagger generate operation`. DO NOT EDIT. -// -// See hack/generate-swagger-api.sh -// ---------------------------------------------------------------------------- - -// ContainerChangeResponseItem change item in response to ContainerChanges operation -// swagger:model ContainerChangeResponseItem -type ContainerChangeResponseItem struct { - - // Kind of change - // Required: true - Kind uint8 `json:"Kind"` - - // Path to file that has changed - // Required: true - Path string `json:"Path"` -} diff --git a/vendor/github.com/docker/docker/api/types/container/container_create.go b/vendor/github.com/docker/docker/api/types/container/container_create.go deleted file mode 100644 index d0c852f84d..0000000000 --- a/vendor/github.com/docker/docker/api/types/container/container_create.go +++ /dev/null @@ -1,20 +0,0 @@ -package container // import "github.com/docker/docker/api/types/container" - -// ---------------------------------------------------------------------------- -// Code generated by `swagger generate operation`. DO NOT EDIT. -// -// See hack/generate-swagger-api.sh -// ---------------------------------------------------------------------------- - -// ContainerCreateCreatedBody OK response to ContainerCreate operation -// swagger:model ContainerCreateCreatedBody -type ContainerCreateCreatedBody struct { - - // The ID of the created container - // Required: true - ID string `json:"Id"` - - // Warnings encountered when creating the container - // Required: true - Warnings []string `json:"Warnings"` -} diff --git a/vendor/github.com/docker/docker/api/types/container/container_wait.go b/vendor/github.com/docker/docker/api/types/container/container_wait.go deleted file mode 100644 index 49e05ae669..0000000000 --- a/vendor/github.com/docker/docker/api/types/container/container_wait.go +++ /dev/null @@ -1,28 +0,0 @@ -package container // import "github.com/docker/docker/api/types/container" - -// ---------------------------------------------------------------------------- -// Code generated by `swagger generate operation`. DO NOT EDIT. -// -// See hack/generate-swagger-api.sh -// ---------------------------------------------------------------------------- - -// ContainerWaitOKBodyError container waiting error, if any -// swagger:model ContainerWaitOKBodyError -type ContainerWaitOKBodyError struct { - - // Details of an error - Message string `json:"Message,omitempty"` -} - -// ContainerWaitOKBody OK response to ContainerWait operation -// swagger:model ContainerWaitOKBody -type ContainerWaitOKBody struct { - - // error - // Required: true - Error *ContainerWaitOKBodyError `json:"Error"` - - // Exit code of the container - // Required: true - StatusCode int64 `json:"StatusCode"` -} diff --git a/vendor/github.com/docker/docker/api/types/container/create_response.go b/vendor/github.com/docker/docker/api/types/container/create_response.go new file mode 100644 index 0000000000..aa0e7f7d07 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/create_response.go @@ -0,0 +1,19 @@ +package container + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// CreateResponse ContainerCreateResponse +// +// OK response to ContainerCreate operation +// swagger:model CreateResponse +type CreateResponse struct { + + // The ID of the created container + // Required: true + ID string `json:"Id"` + + // Warnings encountered when creating the container + // Required: true + Warnings []string `json:"Warnings"` +} diff --git a/vendor/github.com/docker/docker/api/types/container/filesystem_change.go b/vendor/github.com/docker/docker/api/types/container/filesystem_change.go new file mode 100644 index 0000000000..9e9c2ad1d5 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/filesystem_change.go @@ -0,0 +1,19 @@ +package container + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// FilesystemChange Change in the container's filesystem. +// +// swagger:model FilesystemChange +type FilesystemChange struct { + + // kind + // Required: true + Kind ChangeType `json:"Kind"` + + // Path to file or directory that has changed. + // + // Required: true + Path string `json:"Path"` +} diff --git a/vendor/github.com/docker/docker/api/types/container/host_config.go b/vendor/github.com/docker/docker/api/types/container/host_config.go deleted file mode 100644 index 2d1cbaa9ab..0000000000 --- a/vendor/github.com/docker/docker/api/types/container/host_config.go +++ /dev/null @@ -1,447 +0,0 @@ -package container // import "github.com/docker/docker/api/types/container" - -import ( - "strings" - - "github.com/docker/docker/api/types/blkiodev" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/go-connections/nat" - units "github.com/docker/go-units" -) - -// CgroupnsMode represents the cgroup namespace mode of the container -type CgroupnsMode string - -// IsPrivate indicates whether the container uses its own private cgroup namespace -func (c CgroupnsMode) IsPrivate() bool { - return c == "private" -} - -// IsHost indicates whether the container shares the host's cgroup namespace -func (c CgroupnsMode) IsHost() bool { - return c == "host" -} - -// IsEmpty indicates whether the container cgroup namespace mode is unset -func (c CgroupnsMode) IsEmpty() bool { - return c == "" -} - -// Valid indicates whether the cgroup namespace mode is valid -func (c CgroupnsMode) Valid() bool { - return c.IsEmpty() || c.IsPrivate() || c.IsHost() -} - -// Isolation represents the isolation technology of a container. The supported -// values are platform specific -type Isolation string - -// IsDefault indicates the default isolation technology of a container. On Linux this -// is the native driver. On Windows, this is a Windows Server Container. -func (i Isolation) IsDefault() bool { - return strings.ToLower(string(i)) == "default" || string(i) == "" -} - -// IsHyperV indicates the use of a Hyper-V partition for isolation -func (i Isolation) IsHyperV() bool { - return strings.ToLower(string(i)) == "hyperv" -} - -// IsProcess indicates the use of process isolation -func (i Isolation) IsProcess() bool { - return strings.ToLower(string(i)) == "process" -} - -const ( - // IsolationEmpty is unspecified (same behavior as default) - IsolationEmpty = Isolation("") - // IsolationDefault is the default isolation mode on current daemon - IsolationDefault = Isolation("default") - // IsolationProcess is process isolation mode - IsolationProcess = Isolation("process") - // IsolationHyperV is HyperV isolation mode - IsolationHyperV = Isolation("hyperv") -) - -// IpcMode represents the container ipc stack. -type IpcMode string - -// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared. -func (n IpcMode) IsPrivate() bool { - return n == "private" -} - -// IsHost indicates whether the container shares the host's ipc namespace. -func (n IpcMode) IsHost() bool { - return n == "host" -} - -// IsShareable indicates whether the container's ipc namespace can be shared with another container. -func (n IpcMode) IsShareable() bool { - return n == "shareable" -} - -// IsContainer indicates whether the container uses another container's ipc namespace. -func (n IpcMode) IsContainer() bool { - parts := strings.SplitN(string(n), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// IsNone indicates whether container IpcMode is set to "none". -func (n IpcMode) IsNone() bool { - return n == "none" -} - -// IsEmpty indicates whether container IpcMode is empty -func (n IpcMode) IsEmpty() bool { - return n == "" -} - -// Valid indicates whether the ipc mode is valid. -func (n IpcMode) Valid() bool { - return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer() -} - -// Container returns the name of the container ipc stack is going to be used. -func (n IpcMode) Container() string { - parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 && parts[0] == "container" { - return parts[1] - } - return "" -} - -// NetworkMode represents the container network stack. -type NetworkMode string - -// IsNone indicates whether container isn't using a network stack. -func (n NetworkMode) IsNone() bool { - return n == "none" -} - -// IsDefault indicates whether container uses the default network stack. -func (n NetworkMode) IsDefault() bool { - return n == "default" -} - -// IsPrivate indicates whether container uses its private network stack. -func (n NetworkMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) -} - -// IsContainer indicates whether container uses a container network stack. -func (n NetworkMode) IsContainer() bool { - parts := strings.SplitN(string(n), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// ConnectedContainer is the id of the container which network this container is connected to. -func (n NetworkMode) ConnectedContainer() string { - parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// UserDefined indicates user-created network -func (n NetworkMode) UserDefined() string { - if n.IsUserDefined() { - return string(n) - } - return "" -} - -// UsernsMode represents userns mode in the container. -type UsernsMode string - -// IsHost indicates whether the container uses the host's userns. -func (n UsernsMode) IsHost() bool { - return n == "host" -} - -// IsPrivate indicates whether the container uses the a private userns. -func (n UsernsMode) IsPrivate() bool { - return !(n.IsHost()) -} - -// Valid indicates whether the userns is valid. -func (n UsernsMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - default: - return false - } - return true -} - -// CgroupSpec represents the cgroup to use for the container. -type CgroupSpec string - -// IsContainer indicates whether the container is using another container cgroup -func (c CgroupSpec) IsContainer() bool { - parts := strings.SplitN(string(c), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// Valid indicates whether the cgroup spec is valid. -func (c CgroupSpec) Valid() bool { - return c.IsContainer() || c == "" -} - -// Container returns the name of the container whose cgroup will be used. -func (c CgroupSpec) Container() string { - parts := strings.SplitN(string(c), ":", 2) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// UTSMode represents the UTS namespace of the container. -type UTSMode string - -// IsPrivate indicates whether the container uses its private UTS namespace. -func (n UTSMode) IsPrivate() bool { - return !(n.IsHost()) -} - -// IsHost indicates whether the container uses the host's UTS namespace. -func (n UTSMode) IsHost() bool { - return n == "host" -} - -// Valid indicates whether the UTS namespace is valid. -func (n UTSMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - default: - return false - } - return true -} - -// PidMode represents the pid namespace of the container. -type PidMode string - -// IsPrivate indicates whether the container uses its own new pid namespace. -func (n PidMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) -} - -// IsHost indicates whether the container uses the host's pid namespace. -func (n PidMode) IsHost() bool { - return n == "host" -} - -// IsContainer indicates whether the container uses a container's pid namespace. -func (n PidMode) IsContainer() bool { - parts := strings.SplitN(string(n), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// Valid indicates whether the pid namespace is valid. -func (n PidMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - case "container": - if len(parts) != 2 || parts[1] == "" { - return false - } - default: - return false - } - return true -} - -// Container returns the name of the container whose pid namespace is going to be used. -func (n PidMode) Container() string { - parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// DeviceRequest represents a request for devices from a device driver. -// Used by GPU device drivers. -type DeviceRequest struct { - Driver string // Name of device driver - Count int // Number of devices to request (-1 = All) - DeviceIDs []string // List of device IDs as recognizable by the device driver - Capabilities [][]string // An OR list of AND lists of device capabilities (e.g. "gpu") - Options map[string]string // Options to pass onto the device driver -} - -// DeviceMapping represents the device mapping between the host and the container. -type DeviceMapping struct { - PathOnHost string - PathInContainer string - CgroupPermissions string -} - -// RestartPolicy represents the restart policies of the container. -type RestartPolicy struct { - Name string - MaximumRetryCount int -} - -// IsNone indicates whether the container has the "no" restart policy. -// This means the container will not automatically restart when exiting. -func (rp *RestartPolicy) IsNone() bool { - return rp.Name == "no" || rp.Name == "" -} - -// IsAlways indicates whether the container has the "always" restart policy. -// This means the container will automatically restart regardless of the exit status. -func (rp *RestartPolicy) IsAlways() bool { - return rp.Name == "always" -} - -// IsOnFailure indicates whether the container has the "on-failure" restart policy. -// This means the container will automatically restart of exiting with a non-zero exit status. -func (rp *RestartPolicy) IsOnFailure() bool { - return rp.Name == "on-failure" -} - -// IsUnlessStopped indicates whether the container has the -// "unless-stopped" restart policy. This means the container will -// automatically restart unless user has put it to stopped state. -func (rp *RestartPolicy) IsUnlessStopped() bool { - return rp.Name == "unless-stopped" -} - -// IsSame compares two RestartPolicy to see if they are the same -func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool { - return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount -} - -// LogMode is a type to define the available modes for logging -// These modes affect how logs are handled when log messages start piling up. -type LogMode string - -// Available logging modes -const ( - LogModeUnset = "" - LogModeBlocking LogMode = "blocking" - LogModeNonBlock LogMode = "non-blocking" -) - -// LogConfig represents the logging configuration of the container. -type LogConfig struct { - Type string - Config map[string]string -} - -// Resources contains container's resources (cgroups config, ulimits...) -type Resources struct { - // Applicable to all platforms - CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers) - Memory int64 // Memory limit (in bytes) - NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10-9 CPUs. - - // Applicable to UNIX platforms - CgroupParent string // Parent cgroup. - BlkioWeight uint16 // Block IO weight (relative weight vs. other containers) - BlkioWeightDevice []*blkiodev.WeightDevice - BlkioDeviceReadBps []*blkiodev.ThrottleDevice - BlkioDeviceWriteBps []*blkiodev.ThrottleDevice - BlkioDeviceReadIOps []*blkiodev.ThrottleDevice - BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice - CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period - CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota - CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` // CPU real-time period - CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` // CPU real-time runtime - CpusetCpus string // CpusetCpus 0-2, 0,1 - CpusetMems string // CpusetMems 0-2, 0,1 - Devices []DeviceMapping // List of devices to map inside the container - DeviceCgroupRules []string // List of rule to be added to the device cgroup - DeviceRequests []DeviceRequest // List of device requests for device drivers - KernelMemory int64 // Kernel memory limit (in bytes), Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes - KernelMemoryTCP int64 // Hard limit for kernel TCP buffer memory (in bytes) - MemoryReservation int64 // Memory soft limit (in bytes) - MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap - MemorySwappiness *int64 // Tuning container memory swappiness behaviour - OomKillDisable *bool // Whether to disable OOM Killer or not - PidsLimit *int64 // Setting PIDs limit for a container; Set `0` or `-1` for unlimited, or `null` to not change. - Ulimits []*units.Ulimit // List of ulimits to be set in the container - - // Applicable to Windows - CPUCount int64 `json:"CpuCount"` // CPU count - CPUPercent int64 `json:"CpuPercent"` // CPU percent - IOMaximumIOps uint64 // Maximum IOps for the container system drive - IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive -} - -// UpdateConfig holds the mutable attributes of a Container. -// Those attributes can be updated at runtime. -type UpdateConfig struct { - // Contains container's resources (cgroups, ulimits) - Resources - RestartPolicy RestartPolicy -} - -// HostConfig the non-portable Config structure of a container. -// Here, "non-portable" means "dependent of the host we are running on". -// Portable information *should* appear in Config. -type HostConfig struct { - // Applicable to all platforms - Binds []string // List of volume bindings for this container - ContainerIDFile string // File (path) where the containerId is written - LogConfig LogConfig // Configuration of the logs for this container - NetworkMode NetworkMode // Network mode to use for the container - PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host - RestartPolicy RestartPolicy // Restart policy to be used for the container - AutoRemove bool // Automatically remove container when it exits - VolumeDriver string // Name of the volume driver used to mount volumes - VolumesFrom []string // List of volumes to take from other container - - // Applicable to UNIX platforms - CapAdd strslice.StrSlice // List of kernel capabilities to add to the container - CapDrop strslice.StrSlice // List of kernel capabilities to remove from the container - CgroupnsMode CgroupnsMode // Cgroup namespace mode to use for the container - DNS []string `json:"Dns"` // List of DNS server to lookup - DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for - DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for - ExtraHosts []string // List of extra hosts - GroupAdd []string // List of additional groups that the container process will run as - IpcMode IpcMode // IPC namespace to use for the container - Cgroup CgroupSpec // Cgroup to use for the container - Links []string // List of links (in the name:alias form) - OomScoreAdj int // Container preference for OOM-killing - PidMode PidMode // PID namespace to use for the container - Privileged bool // Is the container in privileged mode - PublishAllPorts bool // Should docker publish all exposed port for the container - ReadonlyRootfs bool // Is the container root filesystem in read-only - SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux. - StorageOpt map[string]string `json:",omitempty"` // Storage driver options per container. - Tmpfs map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container - UTSMode UTSMode // UTS namespace to use for the container - UsernsMode UsernsMode // The user namespace to use for the container - ShmSize int64 // Total shm memory usage - Sysctls map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container - Runtime string `json:",omitempty"` // Runtime to use with this container - - // Applicable to Windows - ConsoleSize [2]uint // Initial console size (height,width) - Isolation Isolation // Isolation technology of the container (e.g. default, hyperv) - - // Contains container's resources (cgroups, ulimits) - Resources - - // Mounts specs used by the container - Mounts []mount.Mount `json:",omitempty"` - - // MaskedPaths is the list of paths to be masked inside the container (this overrides the default set of paths) - MaskedPaths []string - - // ReadonlyPaths is the list of paths to be set as read-only inside the container (this overrides the default set of paths) - ReadonlyPaths []string - - // Run a custom init inside the container, if null, use the daemon's configured settings - Init *bool `json:",omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig.go b/vendor/github.com/docker/docker/api/types/container/hostconfig.go new file mode 100644 index 0000000000..d4e6f55375 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig.go @@ -0,0 +1,456 @@ +package container // import "github.com/docker/docker/api/types/container" + +import ( + "strings" + + "github.com/docker/docker/api/types/blkiodev" + "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/api/types/strslice" + "github.com/docker/go-connections/nat" + units "github.com/docker/go-units" +) + +// CgroupnsMode represents the cgroup namespace mode of the container +type CgroupnsMode string + +// cgroup namespace modes for containers +const ( + CgroupnsModeEmpty CgroupnsMode = "" + CgroupnsModePrivate CgroupnsMode = "private" + CgroupnsModeHost CgroupnsMode = "host" +) + +// IsPrivate indicates whether the container uses its own private cgroup namespace +func (c CgroupnsMode) IsPrivate() bool { + return c == CgroupnsModePrivate +} + +// IsHost indicates whether the container shares the host's cgroup namespace +func (c CgroupnsMode) IsHost() bool { + return c == CgroupnsModeHost +} + +// IsEmpty indicates whether the container cgroup namespace mode is unset +func (c CgroupnsMode) IsEmpty() bool { + return c == CgroupnsModeEmpty +} + +// Valid indicates whether the cgroup namespace mode is valid +func (c CgroupnsMode) Valid() bool { + return c.IsEmpty() || c.IsPrivate() || c.IsHost() +} + +// Isolation represents the isolation technology of a container. The supported +// values are platform specific +type Isolation string + +// Isolation modes for containers +const ( + IsolationEmpty Isolation = "" // IsolationEmpty is unspecified (same behavior as default) + IsolationDefault Isolation = "default" // IsolationDefault is the default isolation mode on current daemon + IsolationProcess Isolation = "process" // IsolationProcess is process isolation mode + IsolationHyperV Isolation = "hyperv" // IsolationHyperV is HyperV isolation mode +) + +// IsDefault indicates the default isolation technology of a container. On Linux this +// is the native driver. On Windows, this is a Windows Server Container. +func (i Isolation) IsDefault() bool { + // TODO consider making isolation-mode strict (case-sensitive) + v := Isolation(strings.ToLower(string(i))) + return v == IsolationDefault || v == IsolationEmpty +} + +// IsHyperV indicates the use of a Hyper-V partition for isolation +func (i Isolation) IsHyperV() bool { + // TODO consider making isolation-mode strict (case-sensitive) + return Isolation(strings.ToLower(string(i))) == IsolationHyperV +} + +// IsProcess indicates the use of process isolation +func (i Isolation) IsProcess() bool { + // TODO consider making isolation-mode strict (case-sensitive) + return Isolation(strings.ToLower(string(i))) == IsolationProcess +} + +// IpcMode represents the container ipc stack. +type IpcMode string + +// IpcMode constants +const ( + IPCModeNone IpcMode = "none" + IPCModeHost IpcMode = "host" + IPCModeContainer IpcMode = "container" + IPCModePrivate IpcMode = "private" + IPCModeShareable IpcMode = "shareable" +) + +// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared. +func (n IpcMode) IsPrivate() bool { + return n == IPCModePrivate +} + +// IsHost indicates whether the container shares the host's ipc namespace. +func (n IpcMode) IsHost() bool { + return n == IPCModeHost +} + +// IsShareable indicates whether the container's ipc namespace can be shared with another container. +func (n IpcMode) IsShareable() bool { + return n == IPCModeShareable +} + +// IsContainer indicates whether the container uses another container's ipc namespace. +func (n IpcMode) IsContainer() bool { + _, ok := containerID(string(n)) + return ok +} + +// IsNone indicates whether container IpcMode is set to "none". +func (n IpcMode) IsNone() bool { + return n == IPCModeNone +} + +// IsEmpty indicates whether container IpcMode is empty +func (n IpcMode) IsEmpty() bool { + return n == "" +} + +// Valid indicates whether the ipc mode is valid. +func (n IpcMode) Valid() bool { + // TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid. + return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer() +} + +// Container returns the name of the container ipc stack is going to be used. +func (n IpcMode) Container() (idOrName string) { + idOrName, _ = containerID(string(n)) + return idOrName +} + +// NetworkMode represents the container network stack. +type NetworkMode string + +// IsNone indicates whether container isn't using a network stack. +func (n NetworkMode) IsNone() bool { + return n == "none" +} + +// IsDefault indicates whether container uses the default network stack. +func (n NetworkMode) IsDefault() bool { + return n == "default" +} + +// IsPrivate indicates whether container uses its private network stack. +func (n NetworkMode) IsPrivate() bool { + return !(n.IsHost() || n.IsContainer()) +} + +// IsContainer indicates whether container uses a container network stack. +func (n NetworkMode) IsContainer() bool { + _, ok := containerID(string(n)) + return ok +} + +// ConnectedContainer is the id of the container which network this container is connected to. +func (n NetworkMode) ConnectedContainer() (idOrName string) { + idOrName, _ = containerID(string(n)) + return idOrName +} + +// UserDefined indicates user-created network +func (n NetworkMode) UserDefined() string { + if n.IsUserDefined() { + return string(n) + } + return "" +} + +// UsernsMode represents userns mode in the container. +type UsernsMode string + +// IsHost indicates whether the container uses the host's userns. +func (n UsernsMode) IsHost() bool { + return n == "host" +} + +// IsPrivate indicates whether the container uses the a private userns. +func (n UsernsMode) IsPrivate() bool { + return !n.IsHost() +} + +// Valid indicates whether the userns is valid. +func (n UsernsMode) Valid() bool { + return n == "" || n.IsHost() +} + +// CgroupSpec represents the cgroup to use for the container. +type CgroupSpec string + +// IsContainer indicates whether the container is using another container cgroup +func (c CgroupSpec) IsContainer() bool { + _, ok := containerID(string(c)) + return ok +} + +// Valid indicates whether the cgroup spec is valid. +func (c CgroupSpec) Valid() bool { + // TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid. + return c == "" || c.IsContainer() +} + +// Container returns the ID or name of the container whose cgroup will be used. +func (c CgroupSpec) Container() (idOrName string) { + idOrName, _ = containerID(string(c)) + return idOrName +} + +// UTSMode represents the UTS namespace of the container. +type UTSMode string + +// IsPrivate indicates whether the container uses its private UTS namespace. +func (n UTSMode) IsPrivate() bool { + return !n.IsHost() +} + +// IsHost indicates whether the container uses the host's UTS namespace. +func (n UTSMode) IsHost() bool { + return n == "host" +} + +// Valid indicates whether the UTS namespace is valid. +func (n UTSMode) Valid() bool { + return n == "" || n.IsHost() +} + +// PidMode represents the pid namespace of the container. +type PidMode string + +// IsPrivate indicates whether the container uses its own new pid namespace. +func (n PidMode) IsPrivate() bool { + return !(n.IsHost() || n.IsContainer()) +} + +// IsHost indicates whether the container uses the host's pid namespace. +func (n PidMode) IsHost() bool { + return n == "host" +} + +// IsContainer indicates whether the container uses a container's pid namespace. +func (n PidMode) IsContainer() bool { + _, ok := containerID(string(n)) + return ok +} + +// Valid indicates whether the pid namespace is valid. +func (n PidMode) Valid() bool { + return n == "" || n.IsHost() || validContainer(string(n)) +} + +// Container returns the name of the container whose pid namespace is going to be used. +func (n PidMode) Container() (idOrName string) { + idOrName, _ = containerID(string(n)) + return idOrName +} + +// DeviceRequest represents a request for devices from a device driver. +// Used by GPU device drivers. +type DeviceRequest struct { + Driver string // Name of device driver + Count int // Number of devices to request (-1 = All) + DeviceIDs []string // List of device IDs as recognizable by the device driver + Capabilities [][]string // An OR list of AND lists of device capabilities (e.g. "gpu") + Options map[string]string // Options to pass onto the device driver +} + +// DeviceMapping represents the device mapping between the host and the container. +type DeviceMapping struct { + PathOnHost string + PathInContainer string + CgroupPermissions string +} + +// RestartPolicy represents the restart policies of the container. +type RestartPolicy struct { + Name string + MaximumRetryCount int +} + +// IsNone indicates whether the container has the "no" restart policy. +// This means the container will not automatically restart when exiting. +func (rp *RestartPolicy) IsNone() bool { + return rp.Name == "no" || rp.Name == "" +} + +// IsAlways indicates whether the container has the "always" restart policy. +// This means the container will automatically restart regardless of the exit status. +func (rp *RestartPolicy) IsAlways() bool { + return rp.Name == "always" +} + +// IsOnFailure indicates whether the container has the "on-failure" restart policy. +// This means the container will automatically restart of exiting with a non-zero exit status. +func (rp *RestartPolicy) IsOnFailure() bool { + return rp.Name == "on-failure" +} + +// IsUnlessStopped indicates whether the container has the +// "unless-stopped" restart policy. This means the container will +// automatically restart unless user has put it to stopped state. +func (rp *RestartPolicy) IsUnlessStopped() bool { + return rp.Name == "unless-stopped" +} + +// IsSame compares two RestartPolicy to see if they are the same +func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool { + return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount +} + +// LogMode is a type to define the available modes for logging +// These modes affect how logs are handled when log messages start piling up. +type LogMode string + +// Available logging modes +const ( + LogModeUnset LogMode = "" + LogModeBlocking LogMode = "blocking" + LogModeNonBlock LogMode = "non-blocking" +) + +// LogConfig represents the logging configuration of the container. +type LogConfig struct { + Type string + Config map[string]string +} + +// Resources contains container's resources (cgroups config, ulimits...) +type Resources struct { + // Applicable to all platforms + CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers) + Memory int64 // Memory limit (in bytes) + NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10-9 CPUs. + + // Applicable to UNIX platforms + CgroupParent string // Parent cgroup. + BlkioWeight uint16 // Block IO weight (relative weight vs. other containers) + BlkioWeightDevice []*blkiodev.WeightDevice + BlkioDeviceReadBps []*blkiodev.ThrottleDevice + BlkioDeviceWriteBps []*blkiodev.ThrottleDevice + BlkioDeviceReadIOps []*blkiodev.ThrottleDevice + BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice + CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period + CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota + CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` // CPU real-time period + CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` // CPU real-time runtime + CpusetCpus string // CpusetCpus 0-2, 0,1 + CpusetMems string // CpusetMems 0-2, 0,1 + Devices []DeviceMapping // List of devices to map inside the container + DeviceCgroupRules []string // List of rule to be added to the device cgroup + DeviceRequests []DeviceRequest // List of device requests for device drivers + + // KernelMemory specifies the kernel memory limit (in bytes) for the container. + // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes. + KernelMemory int64 `json:",omitempty"` + KernelMemoryTCP int64 `json:",omitempty"` // Hard limit for kernel TCP buffer memory (in bytes) + MemoryReservation int64 // Memory soft limit (in bytes) + MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap + MemorySwappiness *int64 // Tuning container memory swappiness behaviour + OomKillDisable *bool // Whether to disable OOM Killer or not + PidsLimit *int64 // Setting PIDs limit for a container; Set `0` or `-1` for unlimited, or `null` to not change. + Ulimits []*units.Ulimit // List of ulimits to be set in the container + + // Applicable to Windows + CPUCount int64 `json:"CpuCount"` // CPU count + CPUPercent int64 `json:"CpuPercent"` // CPU percent + IOMaximumIOps uint64 // Maximum IOps for the container system drive + IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive +} + +// UpdateConfig holds the mutable attributes of a Container. +// Those attributes can be updated at runtime. +type UpdateConfig struct { + // Contains container's resources (cgroups, ulimits) + Resources + RestartPolicy RestartPolicy +} + +// HostConfig the non-portable Config structure of a container. +// Here, "non-portable" means "dependent of the host we are running on". +// Portable information *should* appear in Config. +type HostConfig struct { + // Applicable to all platforms + Binds []string // List of volume bindings for this container + ContainerIDFile string // File (path) where the containerId is written + LogConfig LogConfig // Configuration of the logs for this container + NetworkMode NetworkMode // Network mode to use for the container + PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host + RestartPolicy RestartPolicy // Restart policy to be used for the container + AutoRemove bool // Automatically remove container when it exits + VolumeDriver string // Name of the volume driver used to mount volumes + VolumesFrom []string // List of volumes to take from other container + ConsoleSize [2]uint // Initial console size (height,width) + Annotations map[string]string `json:",omitempty"` // Arbitrary non-identifying metadata attached to container and provided to the runtime + + // Applicable to UNIX platforms + CapAdd strslice.StrSlice // List of kernel capabilities to add to the container + CapDrop strslice.StrSlice // List of kernel capabilities to remove from the container + CgroupnsMode CgroupnsMode // Cgroup namespace mode to use for the container + DNS []string `json:"Dns"` // List of DNS server to lookup + DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for + DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for + ExtraHosts []string // List of extra hosts + GroupAdd []string // List of additional groups that the container process will run as + IpcMode IpcMode // IPC namespace to use for the container + Cgroup CgroupSpec // Cgroup to use for the container + Links []string // List of links (in the name:alias form) + OomScoreAdj int // Container preference for OOM-killing + PidMode PidMode // PID namespace to use for the container + Privileged bool // Is the container in privileged mode + PublishAllPorts bool // Should docker publish all exposed port for the container + ReadonlyRootfs bool // Is the container root filesystem in read-only + SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux. + StorageOpt map[string]string `json:",omitempty"` // Storage driver options per container. + Tmpfs map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container + UTSMode UTSMode // UTS namespace to use for the container + UsernsMode UsernsMode // The user namespace to use for the container + ShmSize int64 // Total shm memory usage + Sysctls map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container + Runtime string `json:",omitempty"` // Runtime to use with this container + + // Applicable to Windows + Isolation Isolation // Isolation technology of the container (e.g. default, hyperv) + + // Contains container's resources (cgroups, ulimits) + Resources + + // Mounts specs used by the container + Mounts []mount.Mount `json:",omitempty"` + + // MaskedPaths is the list of paths to be masked inside the container (this overrides the default set of paths) + MaskedPaths []string + + // ReadonlyPaths is the list of paths to be set as read-only inside the container (this overrides the default set of paths) + ReadonlyPaths []string + + // Run a custom init inside the container, if null, use the daemon's configured settings + Init *bool `json:",omitempty"` +} + +// containerID splits "container:" values. It returns the container +// ID or name, and whether an ID/name was found. It returns an empty string and +// a "false" if the value does not have a "container:" prefix. Further validation +// of the returned, including checking if the value is empty, should be handled +// by the caller. +func containerID(val string) (idOrName string, ok bool) { + k, v, hasSep := strings.Cut(val, ":") + if !hasSep || k != "container" { + return "", false + } + return v, true +} + +// validContainer checks if the given value is a "container:" mode with +// a non-empty name/ID. +func validContainer(val string) bool { + id, ok := containerID(val) + return ok && id != "" +} diff --git a/vendor/github.com/docker/docker/api/types/container/wait_exit_error.go b/vendor/github.com/docker/docker/api/types/container/wait_exit_error.go new file mode 100644 index 0000000000..ab56d4eed8 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/wait_exit_error.go @@ -0,0 +1,12 @@ +package container + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// WaitExitError container waiting error, if any +// swagger:model WaitExitError +type WaitExitError struct { + + // Details of an error + Message string `json:"Message,omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/container/wait_response.go b/vendor/github.com/docker/docker/api/types/container/wait_response.go new file mode 100644 index 0000000000..84fc6afddc --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/wait_response.go @@ -0,0 +1,18 @@ +package container + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// WaitResponse ContainerWaitResponse +// +// OK response to ContainerWait operation +// swagger:model WaitResponse +type WaitResponse struct { + + // error + Error *WaitExitError `json:"Error,omitempty"` + + // Exit code of the container + // Required: true + StatusCode int64 `json:"StatusCode"` +} diff --git a/vendor/github.com/docker/docker/api/types/events/events.go b/vendor/github.com/docker/docker/api/types/events/events.go index aa8fba8154..9fe07e26fd 100644 --- a/vendor/github.com/docker/docker/api/types/events/events.go +++ b/vendor/github.com/docker/docker/api/types/events/events.go @@ -1,33 +1,26 @@ package events // import "github.com/docker/docker/api/types/events" +// Type is used for event-types. +type Type = string + +// List of known event types. const ( - // BuilderEventType is the event type that the builder generates - BuilderEventType = "builder" - // ContainerEventType is the event type that containers generate - ContainerEventType = "container" - // DaemonEventType is the event type that daemon generate - DaemonEventType = "daemon" - // ImageEventType is the event type that images generate - ImageEventType = "image" - // NetworkEventType is the event type that networks generate - NetworkEventType = "network" - // PluginEventType is the event type that plugins generate - PluginEventType = "plugin" - // VolumeEventType is the event type that volumes generate - VolumeEventType = "volume" - // ServiceEventType is the event type that services generate - ServiceEventType = "service" - // NodeEventType is the event type that nodes generate - NodeEventType = "node" - // SecretEventType is the event type that secrets generate - SecretEventType = "secret" - // ConfigEventType is the event type that configs generate - ConfigEventType = "config" + BuilderEventType Type = "builder" // BuilderEventType is the event type that the builder generates. + ConfigEventType Type = "config" // ConfigEventType is the event type that configs generate. + ContainerEventType Type = "container" // ContainerEventType is the event type that containers generate. + DaemonEventType Type = "daemon" // DaemonEventType is the event type that daemon generate. + ImageEventType Type = "image" // ImageEventType is the event type that images generate. + NetworkEventType Type = "network" // NetworkEventType is the event type that networks generate. + NodeEventType Type = "node" // NodeEventType is the event type that nodes generate. + PluginEventType Type = "plugin" // PluginEventType is the event type that plugins generate. + SecretEventType Type = "secret" // SecretEventType is the event type that secrets generate. + ServiceEventType Type = "service" // ServiceEventType is the event type that services generate. + VolumeEventType Type = "volume" // VolumeEventType is the event type that volumes generate. ) // Actor describes something that generates events, // like a container, or a network, or a volume. -// It has a defined name and a set or attributes. +// It has a defined name and a set of attributes. // The container attributes are its labels, other actors // can generate these attributes from other properties. type Actor struct { @@ -39,11 +32,11 @@ type Actor struct { type Message struct { // Deprecated information from JSONMessage. // With data only in container events. - Status string `json:"status,omitempty"` - ID string `json:"id,omitempty"` - From string `json:"from,omitempty"` + Status string `json:"status,omitempty"` // Deprecated: use Action instead. + ID string `json:"id,omitempty"` // Deprecated: use Actor.ID instead. + From string `json:"from,omitempty"` // Deprecated: use Actor.Attributes["image"] instead. - Type string + Type Type Action string Actor Actor // Engine events are local scope. Cluster events are swarm scope. diff --git a/vendor/github.com/docker/docker/api/types/filters/errors.go b/vendor/github.com/docker/docker/api/types/filters/errors.go new file mode 100644 index 0000000000..f52f694408 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/filters/errors.go @@ -0,0 +1,37 @@ +package filters + +import "fmt" + +// invalidFilter indicates that the provided filter or its value is invalid +type invalidFilter struct { + Filter string + Value []string +} + +func (e invalidFilter) Error() string { + msg := "invalid filter" + if e.Filter != "" { + msg += " '" + e.Filter + if e.Value != nil { + msg = fmt.Sprintf("%s=%s", msg, e.Value) + } + msg += "'" + } + return msg +} + +// InvalidParameter marks this error as ErrInvalidParameter +func (e invalidFilter) InvalidParameter() {} + +// unreachableCode is an error indicating that the code path was not expected to be reached. +type unreachableCode struct { + Filter string + Value []string +} + +// System marks this error as ErrSystem +func (e unreachableCode) System() {} + +func (e unreachableCode) Error() string { + return fmt.Sprintf("unreachable code reached for filter: %q with values: %s", e.Filter, e.Value) +} diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go index 4bc91cffd6..887648cf3e 100644 --- a/vendor/github.com/docker/docker/api/types/filters/parse.go +++ b/vendor/github.com/docker/docker/api/types/filters/parse.go @@ -1,4 +1,5 @@ -/*Package filters provides tools for encoding a mapping of keys to a set of +/* +Package filters provides tools for encoding a mapping of keys to a set of multiple values. */ package filters // import "github.com/docker/docker/api/types/filters" @@ -48,7 +49,7 @@ func (args Args) Keys() []string { // MarshalJSON returns a JSON byte representation of the Args func (args Args) MarshalJSON() ([]byte, error) { if len(args.fields) == 0 { - return []byte{}, nil + return []byte("{}"), nil } return json.Marshal(args.fields) } @@ -97,7 +98,7 @@ func FromJSON(p string) (Args, error) { // Fallback to parsing arguments in the legacy slice format deprecated := map[string][]string{} if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil { - return args, err + return args, invalidFilter{} } args.fields = deprecatedArgs(deprecated) @@ -106,9 +107,6 @@ func FromJSON(p string) (Args, error) { // UnmarshalJSON populates the Args from JSON encode bytes func (args Args) UnmarshalJSON(raw []byte) error { - if len(raw) == 0 { - return nil - } return json.Unmarshal(raw, &args.fields) } @@ -164,13 +162,13 @@ func (args Args) MatchKVList(key string, sources map[string]string) bool { } for value := range fieldValues { - testKV := strings.SplitN(value, "=", 2) + testK, testV, hasValue := strings.Cut(value, "=") - v, ok := sources[testKV[0]] + v, ok := sources[testK] if !ok { return false } - if len(testKV) == 2 && testKV[1] != v { + if hasValue && testV != v { return false } } @@ -197,6 +195,38 @@ func (args Args) Match(field, source string) bool { return false } +// GetBoolOrDefault returns a boolean value of the key if the key is present +// and is intepretable as a boolean value. Otherwise the default value is returned. +// Error is not nil only if the filter values are not valid boolean or are conflicting. +func (args Args) GetBoolOrDefault(key string, defaultValue bool) (bool, error) { + fieldValues, ok := args.fields[key] + + if !ok { + return defaultValue, nil + } + + if len(fieldValues) == 0 { + return defaultValue, invalidFilter{key, nil} + } + + isFalse := fieldValues["0"] || fieldValues["false"] + isTrue := fieldValues["1"] || fieldValues["true"] + + conflicting := isFalse && isTrue + invalid := !isFalse && !isTrue + + if conflicting || invalid { + return defaultValue, invalidFilter{key, args.Get(key)} + } else if isFalse { + return false, nil + } else if isTrue { + return true, nil + } + + // This code shouldn't be reached. + return defaultValue, unreachableCode{Filter: key, Value: args.Get(key)} +} + // ExactMatch returns true if the source matches exactly one of the values. func (args Args) ExactMatch(key, source string) bool { fieldValues, ok := args.fields[key] @@ -247,20 +277,12 @@ func (args Args) Contains(field string) bool { return ok } -type invalidFilter string - -func (e invalidFilter) Error() string { - return "Invalid filter '" + string(e) + "'" -} - -func (invalidFilter) InvalidParameter() {} - // Validate compared the set of accepted keys against the keys in the mapping. // An error is returned if any mapping keys are not in the accepted set. func (args Args) Validate(accepted map[string]bool) error { for name := range args.fields { if !accepted[name] { - return invalidFilter(name) + return invalidFilter{name, nil} } } return nil diff --git a/vendor/github.com/docker/docker/api/types/graph_driver_data.go b/vendor/github.com/docker/docker/api/types/graph_driver_data.go index 4d9bf1c62c..ce3deb331c 100644 --- a/vendor/github.com/docker/docker/api/types/graph_driver_data.go +++ b/vendor/github.com/docker/docker/api/types/graph_driver_data.go @@ -3,15 +3,21 @@ package types // This file was generated by the swagger tool. // Editing this file might prove futile when you re-run the swagger generate command -// GraphDriverData Information about a container's graph driver. +// GraphDriverData Information about the storage driver used to store the container's and +// image's filesystem. +// // swagger:model GraphDriverData type GraphDriverData struct { - // data + // Low-level storage metadata, provided as key/value pairs. + // + // This information is driver-specific, and depends on the storage-driver + // in use, and should be used for informational purposes only. + // // Required: true Data map[string]string `json:"Data"` - // name + // Name of the storage driver. // Required: true Name string `json:"Name"` } diff --git a/vendor/github.com/docker/docker/api/types/image/opts.go b/vendor/github.com/docker/docker/api/types/image/opts.go new file mode 100644 index 0000000000..3cefecb0da --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/image/opts.go @@ -0,0 +1,9 @@ +package image + +import ocispec "github.com/opencontainers/image-spec/specs-go/v1" + +// GetImageOpts holds parameters to inspect an image. +type GetImageOpts struct { + Platform *ocispec.Platform + Details bool +} diff --git a/vendor/github.com/docker/docker/api/types/image_summary.go b/vendor/github.com/docker/docker/api/types/image_summary.go index e145b3dcfc..0f6f144840 100644 --- a/vendor/github.com/docker/docker/api/types/image_summary.go +++ b/vendor/github.com/docker/docker/api/types/image_summary.go @@ -7,43 +7,88 @@ package types // swagger:model ImageSummary type ImageSummary struct { - // containers + // Number of containers using this image. Includes both stopped and running + // containers. + // + // This size is not calculated by default, and depends on which API endpoint + // is used. `-1` indicates that the value has not been set / calculated. + // // Required: true Containers int64 `json:"Containers"` - // created + // Date and time at which the image was created as a Unix timestamp + // (number of seconds sinds EPOCH). + // // Required: true Created int64 `json:"Created"` - // Id + // ID is the content-addressable ID of an image. + // + // This identifier is a content-addressable digest calculated from the + // image's configuration (which includes the digests of layers used by + // the image). + // + // Note that this digest differs from the `RepoDigests` below, which + // holds digests of image manifests that reference the image. + // // Required: true ID string `json:"Id"` - // labels + // User-defined key/value metadata. // Required: true Labels map[string]string `json:"Labels"` - // parent Id + // ID of the parent image. + // + // Depending on how the image was created, this field may be empty and + // is only set for images that were built/created locally. This field + // is empty if the image was pulled from an image registry. + // // Required: true ParentID string `json:"ParentId"` - // repo digests + // List of content-addressable digests of locally available image manifests + // that the image is referenced from. Multiple manifests can refer to the + // same image. + // + // These digests are usually only available if the image was either pulled + // from a registry, or if the image was pushed to a registry, which is when + // the manifest is generated and its digest calculated. + // // Required: true RepoDigests []string `json:"RepoDigests"` - // repo tags + // List of image names/tags in the local image cache that reference this + // image. + // + // Multiple image tags can refer to the same image, and this list may be + // empty if no tags reference the image, in which case the image is + // "untagged", in which case it can still be referenced by its ID. + // // Required: true RepoTags []string `json:"RepoTags"` - // shared size + // Total size of image layers that are shared between this image and other + // images. + // + // This size is not calculated by default. `-1` indicates that the value + // has not been set / calculated. + // // Required: true SharedSize int64 `json:"SharedSize"` - // size + // Total size of the image including all layers it is composed of. + // // Required: true Size int64 `json:"Size"` - // virtual size - // Required: true - VirtualSize int64 `json:"VirtualSize"` + // Total size of the image including all layers it is composed of. + // + // In versions of Docker before v1.10, this field was calculated from + // the image itself and all of its parent images. Images are now stored + // self-contained, and no longer use a parent-chain, making this field + // an equivalent of the Size field. + // + // Deprecated: this field is kept for backward compatibility, and will be removed in API v1.44. + VirtualSize int64 `json:"VirtualSize,omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/mount/mount.go b/vendor/github.com/docker/docker/api/types/mount/mount.go index 443b8d07a9..ac4ce62231 100644 --- a/vendor/github.com/docker/docker/api/types/mount/mount.go +++ b/vendor/github.com/docker/docker/api/types/mount/mount.go @@ -17,6 +17,8 @@ const ( TypeTmpfs Type = "tmpfs" // TypeNamedPipe is the type for mounting Windows named pipes TypeNamedPipe Type = "npipe" + // TypeCluster is the type for Swarm Cluster Volumes. + TypeCluster Type = "cluster" ) // Mount represents a mount (volume). @@ -30,9 +32,10 @@ type Mount struct { ReadOnly bool `json:",omitempty"` Consistency Consistency `json:",omitempty"` - BindOptions *BindOptions `json:",omitempty"` - VolumeOptions *VolumeOptions `json:",omitempty"` - TmpfsOptions *TmpfsOptions `json:",omitempty"` + BindOptions *BindOptions `json:",omitempty"` + VolumeOptions *VolumeOptions `json:",omitempty"` + TmpfsOptions *TmpfsOptions `json:",omitempty"` + ClusterOptions *ClusterOptions `json:",omitempty"` } // Propagation represents the propagation of a mount. @@ -79,8 +82,9 @@ const ( // BindOptions defines options specific to mounts of type "bind". type BindOptions struct { - Propagation Propagation `json:",omitempty"` - NonRecursive bool `json:",omitempty"` + Propagation Propagation `json:",omitempty"` + NonRecursive bool `json:",omitempty"` + CreateMountpoint bool `json:",omitempty"` } // VolumeOptions represents the options for a mount of type volume. @@ -129,3 +133,8 @@ type TmpfsOptions struct { // Some of these may be straightforward to add, but others, such as // uid/gid have implications in a clustered system. } + +// ClusterOptions specifies options for a Cluster volume. +type ClusterOptions struct { + // intentionally empty +} diff --git a/vendor/github.com/docker/docker/api/types/registry/authconfig.go b/vendor/github.com/docker/docker/api/types/registry/authconfig.go new file mode 100644 index 0000000000..97a924e374 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/registry/authconfig.go @@ -0,0 +1,99 @@ +package registry // import "github.com/docker/docker/api/types/registry" +import ( + "encoding/base64" + "encoding/json" + "io" + "strings" + + "github.com/pkg/errors" +) + +// AuthHeader is the name of the header used to send encoded registry +// authorization credentials for registry operations (push/pull). +const AuthHeader = "X-Registry-Auth" + +// AuthConfig contains authorization information for connecting to a Registry. +type AuthConfig struct { + Username string `json:"username,omitempty"` + Password string `json:"password,omitempty"` + Auth string `json:"auth,omitempty"` + + // Email is an optional value associated with the username. + // This field is deprecated and will be removed in a later + // version of docker. + Email string `json:"email,omitempty"` + + ServerAddress string `json:"serveraddress,omitempty"` + + // IdentityToken is used to authenticate the user and get + // an access token for the registry. + IdentityToken string `json:"identitytoken,omitempty"` + + // RegistryToken is a bearer token to be sent to a registry + RegistryToken string `json:"registrytoken,omitempty"` +} + +// EncodeAuthConfig serializes the auth configuration as a base64url encoded +// RFC4648, section 5) JSON string for sending through the X-Registry-Auth header. +// +// For details on base64url encoding, see: +// - RFC4648, section 5: https://tools.ietf.org/html/rfc4648#section-5 +func EncodeAuthConfig(authConfig AuthConfig) (string, error) { + buf, err := json.Marshal(authConfig) + if err != nil { + return "", errInvalidParameter{err} + } + return base64.URLEncoding.EncodeToString(buf), nil +} + +// DecodeAuthConfig decodes base64url encoded (RFC4648, section 5) JSON +// authentication information as sent through the X-Registry-Auth header. +// +// This function always returns an AuthConfig, even if an error occurs. It is up +// to the caller to decide if authentication is required, and if the error can +// be ignored. +// +// For details on base64url encoding, see: +// - RFC4648, section 5: https://tools.ietf.org/html/rfc4648#section-5 +func DecodeAuthConfig(authEncoded string) (*AuthConfig, error) { + if authEncoded == "" { + return &AuthConfig{}, nil + } + + authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded)) + return decodeAuthConfigFromReader(authJSON) +} + +// DecodeAuthConfigBody decodes authentication information as sent as JSON in the +// body of a request. This function is to provide backward compatibility with old +// clients and API versions. Current clients and API versions expect authentication +// to be provided through the X-Registry-Auth header. +// +// Like DecodeAuthConfig, this function always returns an AuthConfig, even if an +// error occurs. It is up to the caller to decide if authentication is required, +// and if the error can be ignored. +func DecodeAuthConfigBody(rdr io.ReadCloser) (*AuthConfig, error) { + return decodeAuthConfigFromReader(rdr) +} + +func decodeAuthConfigFromReader(rdr io.Reader) (*AuthConfig, error) { + authConfig := &AuthConfig{} + if err := json.NewDecoder(rdr).Decode(authConfig); err != nil { + // always return an (empty) AuthConfig to increase compatibility with + // the existing API. + return &AuthConfig{}, invalid(err) + } + return authConfig, nil +} + +func invalid(err error) error { + return errInvalidParameter{errors.Wrap(err, "invalid X-Registry-Auth header")} +} + +type errInvalidParameter struct{ error } + +func (errInvalidParameter) InvalidParameter() {} + +func (e errInvalidParameter) Cause() error { return e.error } + +func (e errInvalidParameter) Unwrap() error { return e.error } diff --git a/vendor/github.com/docker/docker/api/types/registry/registry.go b/vendor/github.com/docker/docker/api/types/registry/registry.go index 53e47084c8..b83f5d7b2e 100644 --- a/vendor/github.com/docker/docker/api/types/registry/registry.go +++ b/vendor/github.com/docker/docker/api/types/registry/registry.go @@ -4,7 +4,7 @@ import ( "encoding/json" "net" - v1 "github.com/opencontainers/image-spec/specs-go/v1" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) // ServiceConfig stores daemon registry services configuration. @@ -45,31 +45,32 @@ func (ipnet *NetIPNet) UnmarshalJSON(b []byte) (err error) { // IndexInfo contains information about a registry // // RepositoryInfo Examples: -// { -// "Index" : { -// "Name" : "docker.io", -// "Mirrors" : ["https://registry-2.docker.io/v1/", "https://registry-3.docker.io/v1/"], -// "Secure" : true, -// "Official" : true, -// }, -// "RemoteName" : "library/debian", -// "LocalName" : "debian", -// "CanonicalName" : "docker.io/debian" -// "Official" : true, -// } // -// { -// "Index" : { -// "Name" : "127.0.0.1:5000", -// "Mirrors" : [], -// "Secure" : false, -// "Official" : false, -// }, -// "RemoteName" : "user/repo", -// "LocalName" : "127.0.0.1:5000/user/repo", -// "CanonicalName" : "127.0.0.1:5000/user/repo", -// "Official" : false, -// } +// { +// "Index" : { +// "Name" : "docker.io", +// "Mirrors" : ["https://registry-2.docker.io/v1/", "https://registry-3.docker.io/v1/"], +// "Secure" : true, +// "Official" : true, +// }, +// "RemoteName" : "library/debian", +// "LocalName" : "debian", +// "CanonicalName" : "docker.io/debian" +// "Official" : true, +// } +// +// { +// "Index" : { +// "Name" : "127.0.0.1:5000", +// "Mirrors" : [], +// "Secure" : false, +// "Official" : false, +// }, +// "RemoteName" : "user/repo", +// "LocalName" : "127.0.0.1:5000/user/repo", +// "CanonicalName" : "127.0.0.1:5000/user/repo", +// "Official" : false, +// } type IndexInfo struct { // Name is the name of the registry, such as "docker.io" Name string @@ -112,8 +113,8 @@ type SearchResults struct { type DistributionInspect struct { // Descriptor contains information about the manifest, including // the content addressable digest - Descriptor v1.Descriptor + Descriptor ocispec.Descriptor // Platforms contains the list of platforms supported by the image, // obtained by parsing the manifest - Platforms []v1.Platform + Platforms []ocispec.Platform } diff --git a/vendor/github.com/docker/docker/api/types/swarm/common.go b/vendor/github.com/docker/docker/api/types/swarm/common.go index ef020f458b..5ded7dba8a 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/common.go +++ b/vendor/github.com/docker/docker/api/types/swarm/common.go @@ -1,12 +1,20 @@ package swarm // import "github.com/docker/docker/api/types/swarm" -import "time" +import ( + "strconv" + "time" +) // Version represents the internal object version. type Version struct { Index uint64 `json:",omitempty"` } +// String implements fmt.Stringer interface. +func (v Version) String() string { + return strconv.FormatUint(v.Index, 10) +} + // Meta is a base object inherited by most of the other once. type Meta struct { Version Version `json:",omitempty"` diff --git a/vendor/github.com/docker/docker/api/types/swarm/node.go b/vendor/github.com/docker/docker/api/types/swarm/node.go index 1e30f5fa10..bb98d5eedc 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/node.go +++ b/vendor/github.com/docker/docker/api/types/swarm/node.go @@ -53,6 +53,7 @@ type NodeDescription struct { Resources Resources `json:",omitempty"` Engine EngineDescription `json:",omitempty"` TLSInfo TLSInfo `json:",omitempty"` + CSIInfo []NodeCSIInfo `json:",omitempty"` } // Platform represents the platform (Arch/OS). @@ -68,6 +69,21 @@ type EngineDescription struct { Plugins []PluginDescription `json:",omitempty"` } +// NodeCSIInfo represents information about a CSI plugin available on the node +type NodeCSIInfo struct { + // PluginName is the name of the CSI plugin. + PluginName string `json:",omitempty"` + // NodeID is the ID of the node as reported by the CSI plugin. This is + // different from the swarm node ID. + NodeID string `json:",omitempty"` + // MaxVolumesPerNode is the maximum number of volumes that may be published + // to this node + MaxVolumesPerNode int64 `json:",omitempty"` + // AccessibleTopology indicates the location of this node in the CSI + // plugin's topology + AccessibleTopology *Topology `json:",omitempty"` +} + // PluginDescription represents the description of an engine plugin. type PluginDescription struct { Type string `json:",omitempty"` @@ -113,3 +129,11 @@ const ( // NodeStateDisconnected DISCONNECTED NodeStateDisconnected NodeState = "disconnected" ) + +// Topology defines the CSI topology of this node. This type is a duplicate of +// github.com/docker/docker/api/types.Topology. Because the type definition +// is so simple and to avoid complicated structure or circular imports, we just +// duplicate it here. See that type for full documentation +type Topology struct { + Segments map[string]string `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/swarm.go b/vendor/github.com/docker/docker/api/types/swarm/swarm.go index b25f999646..3eae4b9b29 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/swarm.go +++ b/vendor/github.com/docker/docker/api/types/swarm/swarm.go @@ -213,6 +213,16 @@ type Info struct { Warnings []string `json:",omitempty"` } +// Status provides information about the current swarm status and role, +// obtained from the "Swarm" header in the API response. +type Status struct { + // NodeState represents the state of the node. + NodeState LocalNodeState + + // ControlAvailable indicates if the node is a swarm manager. + ControlAvailable bool +} + // Peer represents a peer. type Peer struct { NodeID string diff --git a/vendor/github.com/docker/docker/api/types/swarm/task.go b/vendor/github.com/docker/docker/api/types/swarm/task.go index a6f7ab7b5c..ad3eeca0b7 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/task.go +++ b/vendor/github.com/docker/docker/api/types/swarm/task.go @@ -62,6 +62,11 @@ type Task struct { // used to determine which Tasks belong to which run of the job. This field // is absent if the Service mode is Replicated or Global. JobIteration *Version `json:",omitempty"` + + // Volumes is the list of VolumeAttachments for this task. It specifies + // which particular volumes are to be used by this particular task, and + // fulfilling what mounts in the spec. + Volumes []VolumeAttachment } // TaskSpec represents the spec of a task. @@ -204,3 +209,17 @@ type ContainerStatus struct { type PortStatus struct { Ports []PortConfig `json:",omitempty"` } + +// VolumeAttachment contains the associating a Volume to a Task. +type VolumeAttachment struct { + // ID is the Swarmkit ID of the Volume. This is not the CSI VolumeId. + ID string `json:",omitempty"` + + // Source, together with Target, indicates the Mount, as specified in the + // ContainerSpec, that this volume fulfills. + Source string `json:",omitempty"` + + // Target, together with Source, indicates the Mount, as specified + // in the ContainerSpec, that this volume fulfills. + Target string `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/time/duration_convert.go b/vendor/github.com/docker/docker/api/types/time/duration_convert.go deleted file mode 100644 index 84b6f07322..0000000000 --- a/vendor/github.com/docker/docker/api/types/time/duration_convert.go +++ /dev/null @@ -1,12 +0,0 @@ -package time // import "github.com/docker/docker/api/types/time" - -import ( - "strconv" - "time" -) - -// DurationToSecondsString converts the specified duration to the number -// seconds it represents, formatted as a string. -func DurationToSecondsString(duration time.Duration) string { - return strconv.FormatFloat(duration.Seconds(), 'f', 0, 64) -} diff --git a/vendor/github.com/docker/docker/api/types/time/timestamp.go b/vendor/github.com/docker/docker/api/types/time/timestamp.go index ea3495efeb..cab5c32e3f 100644 --- a/vendor/github.com/docker/docker/api/types/time/timestamp.go +++ b/vendor/github.com/docker/docker/api/types/time/timestamp.go @@ -95,35 +95,37 @@ func GetTimestamp(value string, reference time.Time) (string, error) { return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())), nil } -// ParseTimestamps returns seconds and nanoseconds from a timestamp that has the -// format "%d.%09d", time.Unix(), int64(time.Nanosecond())) -// if the incoming nanosecond portion is longer or shorter than 9 digits it is -// converted to nanoseconds. The expectation is that the seconds and -// seconds will be used to create a time variable. For example: -// seconds, nanoseconds, err := ParseTimestamp("1136073600.000000001",0) -// if err == nil since := time.Unix(seconds, nanoseconds) -// returns seconds as def(aultSeconds) if value == "" -func ParseTimestamps(value string, def int64) (int64, int64, error) { +// ParseTimestamps returns seconds and nanoseconds from a timestamp that has +// the format ("%d.%09d", time.Unix(), int64(time.Nanosecond())). +// If the incoming nanosecond portion is longer than 9 digits it is truncated. +// The expectation is that the seconds and nanoseconds will be used to create a +// time variable. For example: +// +// seconds, nanoseconds, _ := ParseTimestamp("1136073600.000000001",0) +// since := time.Unix(seconds, nanoseconds) +// +// returns seconds as defaultSeconds if value == "" +func ParseTimestamps(value string, defaultSeconds int64) (seconds int64, nanoseconds int64, err error) { if value == "" { - return def, 0, nil + return defaultSeconds, 0, nil } return parseTimestamp(value) } -func parseTimestamp(value string) (int64, int64, error) { - sa := strings.SplitN(value, ".", 2) - s, err := strconv.ParseInt(sa[0], 10, 64) +func parseTimestamp(value string) (sec int64, nsec int64, err error) { + s, n, ok := strings.Cut(value, ".") + sec, err = strconv.ParseInt(s, 10, 64) if err != nil { - return s, 0, err + return sec, 0, err } - if len(sa) != 2 { - return s, 0, nil + if !ok { + return sec, 0, nil } - n, err := strconv.ParseInt(sa[1], 10, 64) + nsec, err = strconv.ParseInt(n, 10, 64) if err != nil { - return s, n, err + return sec, nsec, err } // should already be in nanoseconds but just in case convert n to nanoseconds - n = int64(float64(n) * math.Pow(float64(10), float64(9-len(sa[1])))) - return s, n, nil + nsec = int64(float64(nsec) * math.Pow(float64(10), float64(9-len(n)))) + return sec, nsec, nil } diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go index e3a159912e..b413e02000 100644 --- a/vendor/github.com/docker/docker/api/types/types.go +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -14,43 +14,135 @@ import ( "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/api/types/volume" "github.com/docker/go-connections/nat" ) +const ( + // MediaTypeRawStream is vendor specific MIME-Type set for raw TTY streams + MediaTypeRawStream = "application/vnd.docker.raw-stream" + + // MediaTypeMultiplexedStream is vendor specific MIME-Type set for stdin/stdout/stderr multiplexed streams + MediaTypeMultiplexedStream = "application/vnd.docker.multiplexed-stream" +) + // RootFS returns Image's RootFS description including the layer IDs. type RootFS struct { - Type string - Layers []string `json:",omitempty"` - BaseLayer string `json:",omitempty"` + Type string `json:",omitempty"` + Layers []string `json:",omitempty"` } // ImageInspect contains response of Engine API: // GET "/images/{name:.*}/json" type ImageInspect struct { - ID string `json:"Id"` - RepoTags []string - RepoDigests []string - Parent string - Comment string - Created string - Container string + // ID is the content-addressable ID of an image. + // + // This identifier is a content-addressable digest calculated from the + // image's configuration (which includes the digests of layers used by + // the image). + // + // Note that this digest differs from the `RepoDigests` below, which + // holds digests of image manifests that reference the image. + ID string `json:"Id"` + + // RepoTags is a list of image names/tags in the local image cache that + // reference this image. + // + // Multiple image tags can refer to the same image, and this list may be + // empty if no tags reference the image, in which case the image is + // "untagged", in which case it can still be referenced by its ID. + RepoTags []string + + // RepoDigests is a list of content-addressable digests of locally available + // image manifests that the image is referenced from. Multiple manifests can + // refer to the same image. + // + // These digests are usually only available if the image was either pulled + // from a registry, or if the image was pushed to a registry, which is when + // the manifest is generated and its digest calculated. + RepoDigests []string + + // Parent is the ID of the parent image. + // + // Depending on how the image was created, this field may be empty and + // is only set for images that were built/created locally. This field + // is empty if the image was pulled from an image registry. + Parent string + + // Comment is an optional message that can be set when committing or + // importing the image. + Comment string + + // Created is the date and time at which the image was created, formatted in + // RFC 3339 nano-seconds (time.RFC3339Nano). + Created string + + // Container is the ID of the container that was used to create the image. + // + // Depending on how the image was created, this field may be empty. + Container string + + // ContainerConfig is an optional field containing the configuration of the + // container that was last committed when creating the image. + // + // Previous versions of Docker builder used this field to store build cache, + // and it is not in active use anymore. ContainerConfig *container.Config - DockerVersion string - Author string - Config *container.Config - Architecture string - Variant string `json:",omitempty"` - Os string - OsVersion string `json:",omitempty"` - Size int64 - VirtualSize int64 - GraphDriver GraphDriverData - RootFS RootFS - Metadata ImageMetadata + + // DockerVersion is the version of Docker that was used to build the image. + // + // Depending on how the image was created, this field may be empty. + DockerVersion string + + // Author is the name of the author that was specified when committing the + // image, or as specified through MAINTAINER (deprecated) in the Dockerfile. + Author string + Config *container.Config + + // Architecture is the hardware CPU architecture that the image runs on. + Architecture string + + // Variant is the CPU architecture variant (presently ARM-only). + Variant string `json:",omitempty"` + + // OS is the Operating System the image is built to run on. + Os string + + // OsVersion is the version of the Operating System the image is built to + // run on (especially for Windows). + OsVersion string `json:",omitempty"` + + // Size is the total size of the image including all layers it is composed of. + Size int64 + + // VirtualSize is the total size of the image including all layers it is + // composed of. + // + // In versions of Docker before v1.10, this field was calculated from + // the image itself and all of its parent images. Docker v1.10 and up + // store images self-contained, and no longer use a parent-chain, making + // this field an equivalent of the Size field. + // + // Deprecated: Unused in API 1.43 and up, but kept for backward compatibility with older API versions. + VirtualSize int64 `json:"VirtualSize,omitempty"` + + // GraphDriver holds information about the storage driver used to store the + // container's and image's filesystem. + GraphDriver GraphDriverData + + // RootFS contains information about the image's RootFS, including the + // layer IDs. + RootFS RootFS + + // Metadata of the image in the local cache. + // + // This information is local to the daemon, and not part of the image itself. + Metadata ImageMetadata } // ImageMetadata contains engine-local data about the image type ImageMetadata struct { + // LastTagTime is the date and time at which the image was last tagged. LastTagTime time.Time `json:",omitempty"` } @@ -107,6 +199,15 @@ type Ping struct { OSType string Experimental bool BuilderVersion BuilderVersion + + // SwarmStatus provides information about the current swarm status of the + // engine, obtained from the "Swarm" header in the API response. + // + // It can be a nil struct if the API version does not provide this header + // in the ping response, or if an error occurred, in which case the client + // should use other ways to get the current swarm status, such as the /swarm + // endpoint. + SwarmStatus *swarm.Status } // ComponentVersion describes the version information for a specific component. @@ -158,8 +259,8 @@ type Info struct { Plugins PluginsInfo MemoryLimit bool SwapLimit bool - KernelMemory bool // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes - KernelMemoryTCP bool + KernelMemory bool `json:",omitempty"` // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes + KernelMemoryTCP bool `json:",omitempty"` // KernelMemoryTCP is not supported on cgroups v2. CPUCfsPeriod bool `json:"CpuCfsPeriod"` CPUCfsQuota bool `json:"CpuCfsQuota"` CPUShares bool @@ -195,8 +296,6 @@ type Info struct { Labels []string ExperimentalBuild bool ServerVersion string - ClusterStore string `json:",omitempty"` // Deprecated: host-discovery and overlay networks with external k/v stores are deprecated - ClusterAdvertise string `json:",omitempty"` // Deprecated: host-discovery and overlay networks with external k/v stores are deprecated Runtimes map[string]Runtime DefaultRuntime string Swarm swarm.Info @@ -212,7 +311,12 @@ type Info struct { SecurityOptions []string ProductLicense string `json:",omitempty"` DefaultAddressPools []NetworkAddressPool `json:",omitempty"` - Warnings []string + + // Warnings contains a slice of warnings that occurred while collecting + // system information. These warnings are intended to be informational + // messages for the user, and are not intended to be parsed / used for + // other purposes, as they do not have a fixed format. + Warnings []string } // KeyValue holds a key/value pair @@ -243,20 +347,19 @@ func DecodeSecurityOptions(opts []string) ([]SecurityOpt, error) { continue } secopt := SecurityOpt{} - split := strings.Split(opt, ",") - for _, s := range split { - kv := strings.SplitN(s, "=", 2) - if len(kv) != 2 { + for _, s := range strings.Split(opt, ",") { + k, v, ok := strings.Cut(s, "=") + if !ok { return nil, fmt.Errorf("invalid security option %q", s) } - if kv[0] == "" || kv[1] == "" { + if k == "" || v == "" { return nil, errors.New("invalid empty security option") } - if kv[0] == "name" { - secopt.Name = kv[1] + if k == "name" { + secopt.Name = v continue } - secopt.Options = append(secopt.Options, KeyValue{Key: kv[0], Value: kv[1]}) + secopt.Options = append(secopt.Options, KeyValue{Key: k, Value: v}) } so = append(so, secopt) } @@ -283,6 +386,8 @@ type ExecStartCheck struct { Detach bool // Check if there's a tty Tty bool + // Terminal size [height, width], unused if Tty == false + ConsoleSize *[2]uint `json:",omitempty"` } // HealthcheckResult stores information about a single run of a healthcheck probe @@ -416,13 +521,44 @@ type DefaultNetworkSettings struct { // MountPoint represents a mount point configuration inside the container. // This is used for reporting the mountpoints in use by a container. type MountPoint struct { - Type mount.Type `json:",omitempty"` - Name string `json:",omitempty"` - Source string + // Type is the type of mount, see `Type` definitions in + // github.com/docker/docker/api/types/mount.Type + Type mount.Type `json:",omitempty"` + + // Name is the name reference to the underlying data defined by `Source` + // e.g., the volume name. + Name string `json:",omitempty"` + + // Source is the source location of the mount. + // + // For volumes, this contains the storage location of the volume (within + // `/var/lib/docker/volumes/`). For bind-mounts, and `npipe`, this contains + // the source (host) part of the bind-mount. For `tmpfs` mount points, this + // field is empty. + Source string + + // Destination is the path relative to the container root (`/`) where the + // Source is mounted inside the container. Destination string - Driver string `json:",omitempty"` - Mode string - RW bool + + // Driver is the volume driver used to create the volume (if it is a volume). + Driver string `json:",omitempty"` + + // Mode is a comma separated list of options supplied by the user when + // creating the bind/volume mount. + // + // The default is platform-specific (`"z"` on Linux, empty on Windows). + Mode string + + // RW indicates whether the mount is mounted writable (read-write). + RW bool + + // Propagation describes how mounts are propagated from the host into the + // mount point, and vice-versa. Refer to the Linux kernel documentation + // for details: + // https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt + // + // This field is not used on Windows. Propagation mount.Propagation } @@ -516,12 +652,18 @@ type Checkpoint struct { // Runtime describes an OCI runtime type Runtime struct { - Path string `json:"path"` + // "Legacy" runtime configuration for runc-compatible runtimes. + + Path string `json:"path,omitempty"` Args []string `json:"runtimeArgs,omitempty"` + // Shimv2 runtime configuration. Mutually exclusive with the legacy config above. + + Type string `json:"runtimeType,omitempty"` + Options map[string]interface{} `json:"options,omitempty"` + // This is exposed here only for internal use - // It is not currently supported to specify custom shim configs - Shim *ShimConfig `json:"-"` + ShimConfig *ShimConfig `json:"-"` } // ShimConfig is used by runtime to configure containerd shims @@ -530,15 +672,36 @@ type ShimConfig struct { Opts interface{} } +// DiskUsageObject represents an object type used for disk usage query filtering. +type DiskUsageObject string + +const ( + // ContainerObject represents a container DiskUsageObject. + ContainerObject DiskUsageObject = "container" + // ImageObject represents an image DiskUsageObject. + ImageObject DiskUsageObject = "image" + // VolumeObject represents a volume DiskUsageObject. + VolumeObject DiskUsageObject = "volume" + // BuildCacheObject represents a build-cache DiskUsageObject. + BuildCacheObject DiskUsageObject = "build-cache" +) + +// DiskUsageOptions holds parameters for system disk usage query. +type DiskUsageOptions struct { + // Types specifies what object types to include in the response. If empty, + // all object types are returned. + Types []DiskUsageObject +} + // DiskUsage contains response of Engine API: // GET "/system/df" type DiskUsage struct { LayersSize int64 Images []*ImageSummary Containers []*Container - Volumes []*Volume + Volumes []*volume.Volume BuildCache []*BuildCache - BuilderSize int64 // deprecated + BuilderSize int64 `json:",omitempty"` // Deprecated: deprecated in API 1.38, and no longer used since API 1.40. } // ContainersPruneReport contains the response for Engine API: @@ -613,18 +776,31 @@ type BuildResult struct { ID string } -// BuildCache contains information about a build cache record +// BuildCache contains information about a build cache record. type BuildCache struct { - ID string - Parent string - Type string + // ID is the unique ID of the build cache record. + ID string + // Parent is the ID of the parent build cache record. + // + // Deprecated: deprecated in API v1.42 and up, as it was deprecated in BuildKit; use Parents instead. + Parent string `json:"Parent,omitempty"` + // Parents is the list of parent build cache record IDs. + Parents []string `json:" Parents,omitempty"` + // Type is the cache record type. + Type string + // Description is a description of the build-step that produced the build cache. Description string - InUse bool - Shared bool - Size int64 - CreatedAt time.Time - LastUsedAt *time.Time - UsageCount int + // InUse indicates if the build cache is in use. + InUse bool + // Shared indicates if the build cache is shared. + Shared bool + // Size is the amount of disk space used by the build cache (in bytes). + Size int64 + // CreatedAt is the date and time at which the build cache was created. + CreatedAt time.Time + // LastUsedAt is the date and time at which the build cache was last used. + LastUsedAt *time.Time + UsageCount int } // BuildCachePruneOptions hold parameters to prune the build cache diff --git a/vendor/github.com/docker/docker/api/types/versions/compare.go b/vendor/github.com/docker/docker/api/types/versions/compare.go index 8ccb0aa92e..489e917ee5 100644 --- a/vendor/github.com/docker/docker/api/types/versions/compare.go +++ b/vendor/github.com/docker/docker/api/types/versions/compare.go @@ -8,6 +8,9 @@ import ( // compare compares two version strings // returns -1 if v1 < v2, 1 if v1 > v2, 0 otherwise. func compare(v1, v2 string) int { + if v1 == v2 { + return 0 + } var ( currTab = strings.Split(v1, ".") otherTab = strings.Split(v2, ".") diff --git a/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go b/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go new file mode 100644 index 0000000000..55fc5d3899 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go @@ -0,0 +1,420 @@ +package volume + +import ( + "github.com/docker/docker/api/types/swarm" +) + +// ClusterVolume contains options and information specific to, and only present +// on, Swarm CSI cluster volumes. +type ClusterVolume struct { + // ID is the Swarm ID of the volume. Because cluster volumes are Swarm + // objects, they have an ID, unlike non-cluster volumes, which only have a + // Name. This ID can be used to refer to the cluster volume. + ID string + + // Meta is the swarm metadata about this volume. + swarm.Meta + + // Spec is the cluster-specific options from which this volume is derived. + Spec ClusterVolumeSpec + + // PublishStatus contains the status of the volume as it pertains to its + // publishing on Nodes. + PublishStatus []*PublishStatus `json:",omitempty"` + + // Info is information about the global status of the volume. + Info *Info `json:",omitempty"` +} + +// ClusterVolumeSpec contains the spec used to create this volume. +type ClusterVolumeSpec struct { + // Group defines the volume group of this volume. Volumes belonging to the + // same group can be referred to by group name when creating Services. + // Referring to a volume by group instructs swarm to treat volumes in that + // group interchangeably for the purpose of scheduling. Volumes with an + // empty string for a group technically all belong to the same, emptystring + // group. + Group string `json:",omitempty"` + + // AccessMode defines how the volume is used by tasks. + AccessMode *AccessMode `json:",omitempty"` + + // AccessibilityRequirements specifies where in the cluster a volume must + // be accessible from. + // + // This field must be empty if the plugin does not support + // VOLUME_ACCESSIBILITY_CONSTRAINTS capabilities. If it is present but the + // plugin does not support it, volume will not be created. + // + // If AccessibilityRequirements is empty, but the plugin does support + // VOLUME_ACCESSIBILITY_CONSTRAINTS, then Swarmkit will assume the entire + // cluster is a valid target for the volume. + AccessibilityRequirements *TopologyRequirement `json:",omitempty"` + + // CapacityRange defines the desired capacity that the volume should be + // created with. If nil, the plugin will decide the capacity. + CapacityRange *CapacityRange `json:",omitempty"` + + // Secrets defines Swarm Secrets that are passed to the CSI storage plugin + // when operating on this volume. + Secrets []Secret `json:",omitempty"` + + // Availability is the Volume's desired availability. Analogous to Node + // Availability, this allows the user to take volumes offline in order to + // update or delete them. + Availability Availability `json:",omitempty"` +} + +// Availability specifies the availability of the volume. +type Availability string + +const ( + // AvailabilityActive indicates that the volume is active and fully + // schedulable on the cluster. + AvailabilityActive Availability = "active" + + // AvailabilityPause indicates that no new workloads should use the + // volume, but existing workloads can continue to use it. + AvailabilityPause Availability = "pause" + + // AvailabilityDrain indicates that all workloads using this volume + // should be rescheduled, and the volume unpublished from all nodes. + AvailabilityDrain Availability = "drain" +) + +// AccessMode defines the access mode of a volume. +type AccessMode struct { + // Scope defines the set of nodes this volume can be used on at one time. + Scope Scope `json:",omitempty"` + + // Sharing defines the number and way that different tasks can use this + // volume at one time. + Sharing SharingMode `json:",omitempty"` + + // MountVolume defines options for using this volume as a Mount-type + // volume. + // + // Either BlockVolume or MountVolume, but not both, must be present. + MountVolume *TypeMount `json:",omitempty"` + + // BlockVolume defines options for using this volume as a Block-type + // volume. + // + // Either BlockVolume or MountVolume, but not both, must be present. + BlockVolume *TypeBlock `json:",omitempty"` +} + +// Scope defines the Scope of a Cluster Volume. This is how many nodes a +// Volume can be accessed simultaneously on. +type Scope string + +const ( + // ScopeSingleNode indicates the volume can be used on one node at a + // time. + ScopeSingleNode Scope = "single" + + // ScopeMultiNode indicates the volume can be used on many nodes at + // the same time. + ScopeMultiNode Scope = "multi" +) + +// SharingMode defines the Sharing of a Cluster Volume. This is how Tasks using a +// Volume at the same time can use it. +type SharingMode string + +const ( + // SharingNone indicates that only one Task may use the Volume at a + // time. + SharingNone SharingMode = "none" + + // SharingReadOnly indicates that the Volume may be shared by any + // number of Tasks, but they must be read-only. + SharingReadOnly SharingMode = "readonly" + + // SharingOneWriter indicates that the Volume may be shared by any + // number of Tasks, but all after the first must be read-only. + SharingOneWriter SharingMode = "onewriter" + + // SharingAll means that the Volume may be shared by any number of + // Tasks, as readers or writers. + SharingAll SharingMode = "all" +) + +// TypeBlock defines options for using a volume as a block-type volume. +// +// Intentionally empty. +type TypeBlock struct{} + +// TypeMount contains options for using a volume as a Mount-type +// volume. +type TypeMount struct { + // FsType specifies the filesystem type for the mount volume. Optional. + FsType string `json:",omitempty"` + + // MountFlags defines flags to pass when mounting the volume. Optional. + MountFlags []string `json:",omitempty"` +} + +// TopologyRequirement expresses the user's requirements for a volume's +// accessible topology. +type TopologyRequirement struct { + // Requisite specifies a list of Topologies, at least one of which the + // volume must be accessible from. + // + // Taken verbatim from the CSI Spec: + // + // Specifies the list of topologies the provisioned volume MUST be + // accessible from. + // This field is OPTIONAL. If TopologyRequirement is specified either + // requisite or preferred or both MUST be specified. + // + // If requisite is specified, the provisioned volume MUST be + // accessible from at least one of the requisite topologies. + // + // Given + // x = number of topologies provisioned volume is accessible from + // n = number of requisite topologies + // The CO MUST ensure n >= 1. The SP MUST ensure x >= 1 + // If x==n, then the SP MUST make the provisioned volume available to + // all topologies from the list of requisite topologies. If it is + // unable to do so, the SP MUST fail the CreateVolume call. + // For example, if a volume should be accessible from a single zone, + // and requisite = + // {"region": "R1", "zone": "Z2"} + // then the provisioned volume MUST be accessible from the "region" + // "R1" and the "zone" "Z2". + // Similarly, if a volume should be accessible from two zones, and + // requisite = + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"} + // then the provisioned volume MUST be accessible from the "region" + // "R1" and both "zone" "Z2" and "zone" "Z3". + // + // If xn, then the SP MUST make the provisioned volume available from + // all topologies from the list of requisite topologies and MAY choose + // the remaining x-n unique topologies from the list of all possible + // topologies. If it is unable to do so, the SP MUST fail the + // CreateVolume call. + // For example, if a volume should be accessible from two zones, and + // requisite = + // {"region": "R1", "zone": "Z2"} + // then the provisioned volume MUST be accessible from the "region" + // "R1" and the "zone" "Z2" and the SP may select the second zone + // independently, e.g. "R1/Z4". + Requisite []Topology `json:",omitempty"` + + // Preferred is a list of Topologies that the volume should attempt to be + // provisioned in. + // + // Taken from the CSI spec: + // + // Specifies the list of topologies the CO would prefer the volume to + // be provisioned in. + // + // This field is OPTIONAL. If TopologyRequirement is specified either + // requisite or preferred or both MUST be specified. + // + // An SP MUST attempt to make the provisioned volume available using + // the preferred topologies in order from first to last. + // + // If requisite is specified, all topologies in preferred list MUST + // also be present in the list of requisite topologies. + // + // If the SP is unable to to make the provisioned volume available + // from any of the preferred topologies, the SP MAY choose a topology + // from the list of requisite topologies. + // If the list of requisite topologies is not specified, then the SP + // MAY choose from the list of all possible topologies. + // If the list of requisite topologies is specified and the SP is + // unable to to make the provisioned volume available from any of the + // requisite topologies it MUST fail the CreateVolume call. + // + // Example 1: + // Given a volume should be accessible from a single zone, and + // requisite = + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"} + // preferred = + // {"region": "R1", "zone": "Z3"} + // then the the SP SHOULD first attempt to make the provisioned volume + // available from "zone" "Z3" in the "region" "R1" and fall back to + // "zone" "Z2" in the "region" "R1" if that is not possible. + // + // Example 2: + // Given a volume should be accessible from a single zone, and + // requisite = + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"}, + // {"region": "R1", "zone": "Z4"}, + // {"region": "R1", "zone": "Z5"} + // preferred = + // {"region": "R1", "zone": "Z4"}, + // {"region": "R1", "zone": "Z2"} + // then the the SP SHOULD first attempt to make the provisioned volume + // accessible from "zone" "Z4" in the "region" "R1" and fall back to + // "zone" "Z2" in the "region" "R1" if that is not possible. If that + // is not possible, the SP may choose between either the "zone" + // "Z3" or "Z5" in the "region" "R1". + // + // Example 3: + // Given a volume should be accessible from TWO zones (because an + // opaque parameter in CreateVolumeRequest, for example, specifies + // the volume is accessible from two zones, aka synchronously + // replicated), and + // requisite = + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"}, + // {"region": "R1", "zone": "Z4"}, + // {"region": "R1", "zone": "Z5"} + // preferred = + // {"region": "R1", "zone": "Z5"}, + // {"region": "R1", "zone": "Z3"} + // then the the SP SHOULD first attempt to make the provisioned volume + // accessible from the combination of the two "zones" "Z5" and "Z3" in + // the "region" "R1". If that's not possible, it should fall back to + // a combination of "Z5" and other possibilities from the list of + // requisite. If that's not possible, it should fall back to a + // combination of "Z3" and other possibilities from the list of + // requisite. If that's not possible, it should fall back to a + // combination of other possibilities from the list of requisite. + Preferred []Topology `json:",omitempty"` +} + +// Topology is a map of topological domains to topological segments. +// +// This description is taken verbatim from the CSI Spec: +// +// A topological domain is a sub-division of a cluster, like "region", +// "zone", "rack", etc. +// A topological segment is a specific instance of a topological domain, +// like "zone3", "rack3", etc. +// For example {"com.company/zone": "Z1", "com.company/rack": "R3"} +// Valid keys have two segments: an OPTIONAL prefix and name, separated +// by a slash (/), for example: "com.company.example/zone". +// The key name segment is REQUIRED. The prefix is OPTIONAL. +// The key name MUST be 63 characters or less, begin and end with an +// alphanumeric character ([a-z0-9A-Z]), and contain only dashes (-), +// underscores (_), dots (.), or alphanumerics in between, for example +// "zone". +// The key prefix MUST be 63 characters or less, begin and end with a +// lower-case alphanumeric character ([a-z0-9]), contain only +// dashes (-), dots (.), or lower-case alphanumerics in between, and +// follow domain name notation format +// (https://tools.ietf.org/html/rfc1035#section-2.3.1). +// The key prefix SHOULD include the plugin's host company name and/or +// the plugin name, to minimize the possibility of collisions with keys +// from other plugins. +// If a key prefix is specified, it MUST be identical across all +// topology keys returned by the SP (across all RPCs). +// Keys MUST be case-insensitive. Meaning the keys "Zone" and "zone" +// MUST not both exist. +// Each value (topological segment) MUST contain 1 or more strings. +// Each string MUST be 63 characters or less and begin and end with an +// alphanumeric character with '-', '_', '.', or alphanumerics in +// between. +type Topology struct { + Segments map[string]string `json:",omitempty"` +} + +// CapacityRange describes the minimum and maximum capacity a volume should be +// created with +type CapacityRange struct { + // RequiredBytes specifies that a volume must be at least this big. The + // value of 0 indicates an unspecified minimum. + RequiredBytes int64 + + // LimitBytes specifies that a volume must not be bigger than this. The + // value of 0 indicates an unspecified maximum + LimitBytes int64 +} + +// Secret represents a Swarm Secret value that must be passed to the CSI +// storage plugin when operating on this Volume. It represents one key-value +// pair of possibly many. +type Secret struct { + // Key is the name of the key of the key-value pair passed to the plugin. + Key string + + // Secret is the swarm Secret object from which to read data. This can be a + // Secret name or ID. The Secret data is retrieved by Swarm and used as the + // value of the key-value pair passed to the plugin. + Secret string +} + +// PublishState represents the state of a Volume as it pertains to its +// use on a particular Node. +type PublishState string + +const ( + // StatePending indicates that the volume should be published on + // this node, but the call to ControllerPublishVolume has not been + // successfully completed yet and the result recorded by swarmkit. + StatePending PublishState = "pending-publish" + + // StatePublished means the volume is published successfully to the node. + StatePublished PublishState = "published" + + // StatePendingNodeUnpublish indicates that the Volume should be + // unpublished on the Node, and we're waiting for confirmation that it has + // done so. After the Node has confirmed that the Volume has been + // unpublished, the state will move to StatePendingUnpublish. + StatePendingNodeUnpublish PublishState = "pending-node-unpublish" + + // StatePendingUnpublish means the volume is still published to the node + // by the controller, awaiting the operation to unpublish it. + StatePendingUnpublish PublishState = "pending-controller-unpublish" +) + +// PublishStatus represents the status of the volume as published to an +// individual node +type PublishStatus struct { + // NodeID is the ID of the swarm node this Volume is published to. + NodeID string `json:",omitempty"` + + // State is the publish state of the volume. + State PublishState `json:",omitempty"` + + // PublishContext is the PublishContext returned by the CSI plugin when + // a volume is published. + PublishContext map[string]string `json:",omitempty"` +} + +// Info contains information about the Volume as a whole as provided by +// the CSI storage plugin. +type Info struct { + // CapacityBytes is the capacity of the volume in bytes. A value of 0 + // indicates that the capacity is unknown. + CapacityBytes int64 `json:",omitempty"` + + // VolumeContext is the context originating from the CSI storage plugin + // when the Volume is created. + VolumeContext map[string]string `json:",omitempty"` + + // VolumeID is the ID of the Volume as seen by the CSI storage plugin. This + // is distinct from the Volume's Swarm ID, which is the ID used by all of + // the Docker Engine to refer to the Volume. If this field is blank, then + // the Volume has not been successfully created yet. + VolumeID string `json:",omitempty"` + + // AccessibleTopolgoy is the topology this volume is actually accessible + // from. + AccessibleTopology []Topology `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/volume/create_options.go b/vendor/github.com/docker/docker/api/types/volume/create_options.go new file mode 100644 index 0000000000..37c41a6096 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume/create_options.go @@ -0,0 +1,29 @@ +package volume + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// CreateOptions VolumeConfig +// +// Volume configuration +// swagger:model CreateOptions +type CreateOptions struct { + + // cluster volume spec + ClusterVolumeSpec *ClusterVolumeSpec `json:"ClusterVolumeSpec,omitempty"` + + // Name of the volume driver to use. + Driver string `json:"Driver,omitempty"` + + // A mapping of driver options and values. These options are + // passed directly to the driver and are driver specific. + // + DriverOpts map[string]string `json:"DriverOpts,omitempty"` + + // User-defined key/value metadata. + Labels map[string]string `json:"Labels,omitempty"` + + // The new volume's name. If not specified, Docker generates a name. + // + Name string `json:"Name,omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/volume/list_response.go b/vendor/github.com/docker/docker/api/types/volume/list_response.go new file mode 100644 index 0000000000..ca5192a2a9 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume/list_response.go @@ -0,0 +1,18 @@ +package volume + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// ListResponse VolumeListResponse +// +// Volume list response +// swagger:model ListResponse +type ListResponse struct { + + // List of volumes + Volumes []*Volume `json:"Volumes"` + + // Warnings that occurred when fetching the list of volumes. + // + Warnings []string `json:"Warnings"` +} diff --git a/vendor/github.com/docker/docker/api/types/volume/options.go b/vendor/github.com/docker/docker/api/types/volume/options.go new file mode 100644 index 0000000000..8b0dd13899 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume/options.go @@ -0,0 +1,8 @@ +package volume // import "github.com/docker/docker/api/types/volume" + +import "github.com/docker/docker/api/types/filters" + +// ListOptions holds parameters to list volumes. +type ListOptions struct { + Filters filters.Args +} diff --git a/vendor/github.com/docker/docker/api/types/volume.go b/vendor/github.com/docker/docker/api/types/volume/volume.go similarity index 87% rename from vendor/github.com/docker/docker/api/types/volume.go rename to vendor/github.com/docker/docker/api/types/volume/volume.go index c69b08448d..ea7d555e5b 100644 --- a/vendor/github.com/docker/docker/api/types/volume.go +++ b/vendor/github.com/docker/docker/api/types/volume/volume.go @@ -1,4 +1,4 @@ -package types +package volume // This file was generated by the swagger tool. // Editing this file might prove futile when you re-run the swagger generate command @@ -7,6 +7,9 @@ package types // swagger:model Volume type Volume struct { + // cluster volume + ClusterVolume *ClusterVolume `json:"ClusterVolume,omitempty"` + // Date/Time the volume was created. CreatedAt string `json:"CreatedAt,omitempty"` @@ -47,14 +50,14 @@ type Volume struct { Status map[string]interface{} `json:"Status,omitempty"` // usage data - UsageData *VolumeUsageData `json:"UsageData,omitempty"` + UsageData *UsageData `json:"UsageData,omitempty"` } -// VolumeUsageData Usage details about the volume. This information is used by the +// UsageData Usage details about the volume. This information is used by the // `GET /system/df` endpoint, and omitted in other endpoints. // -// swagger:model VolumeUsageData -type VolumeUsageData struct { +// swagger:model UsageData +type UsageData struct { // The number of containers referencing this volume. This field // is set to `-1` if the reference-count is not available. diff --git a/vendor/github.com/docker/docker/api/types/volume/volume_create.go b/vendor/github.com/docker/docker/api/types/volume/volume_create.go deleted file mode 100644 index 8538078dd6..0000000000 --- a/vendor/github.com/docker/docker/api/types/volume/volume_create.go +++ /dev/null @@ -1,31 +0,0 @@ -package volume // import "github.com/docker/docker/api/types/volume" - -// ---------------------------------------------------------------------------- -// Code generated by `swagger generate operation`. DO NOT EDIT. -// -// See hack/generate-swagger-api.sh -// ---------------------------------------------------------------------------- - -// VolumeCreateBody Volume configuration -// swagger:model VolumeCreateBody -type VolumeCreateBody struct { - - // Name of the volume driver to use. - // Required: true - Driver string `json:"Driver"` - - // A mapping of driver options and values. These options are - // passed directly to the driver and are driver specific. - // - // Required: true - DriverOpts map[string]string `json:"DriverOpts"` - - // User-defined key/value metadata. - // Required: true - Labels map[string]string `json:"Labels"` - - // The new volume's name. If not specified, Docker generates a name. - // - // Required: true - Name string `json:"Name"` -} diff --git a/vendor/github.com/docker/docker/api/types/volume/volume_list.go b/vendor/github.com/docker/docker/api/types/volume/volume_list.go deleted file mode 100644 index be06179bf4..0000000000 --- a/vendor/github.com/docker/docker/api/types/volume/volume_list.go +++ /dev/null @@ -1,23 +0,0 @@ -package volume // import "github.com/docker/docker/api/types/volume" - -// ---------------------------------------------------------------------------- -// Code generated by `swagger generate operation`. DO NOT EDIT. -// -// See hack/generate-swagger-api.sh -// ---------------------------------------------------------------------------- - -import "github.com/docker/docker/api/types" - -// VolumeListOKBody Volume list response -// swagger:model VolumeListOKBody -type VolumeListOKBody struct { - - // List of volumes - // Required: true - Volumes []*types.Volume `json:"Volumes"` - - // Warnings that occurred when fetching the list of volumes. - // - // Required: true - Warnings []string `json:"Warnings"` -} diff --git a/vendor/github.com/docker/docker/api/types/volume/volume_update.go b/vendor/github.com/docker/docker/api/types/volume/volume_update.go new file mode 100644 index 0000000000..f958f80a66 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume/volume_update.go @@ -0,0 +1,7 @@ +package volume // import "github.com/docker/docker/api/types/volume" + +// UpdateOptions is configuration to update a Volume with. +type UpdateOptions struct { + // Spec is the ClusterVolumeSpec to update the volume to. + Spec *ClusterVolumeSpec `json:"Spec,omitempty"` +} diff --git a/vendor/github.com/docker/docker/cli/config/configdir.go b/vendor/github.com/docker/docker/cli/config/configdir.go deleted file mode 100644 index f0b68ee387..0000000000 --- a/vendor/github.com/docker/docker/cli/config/configdir.go +++ /dev/null @@ -1,27 +0,0 @@ -package config // import "github.com/docker/docker/cli/config" - -import ( - "os" - "path/filepath" - - "github.com/docker/docker/pkg/homedir" -) - -var ( - configDir = os.Getenv("DOCKER_CONFIG") - configFileDir = ".docker" -) - -// Dir returns the path to the configuration directory as specified by the DOCKER_CONFIG environment variable. -// If DOCKER_CONFIG is unset, Dir returns ~/.docker . -// Dir ignores XDG_CONFIG_HOME (same as the docker client). -// TODO: this was copied from cli/config/configfile and should be removed once cmd/dockerd moves -func Dir() string { - return configDir -} - -func init() { - if configDir == "" { - configDir = filepath.Join(homedir.Get(), configFileDir) - } -} diff --git a/vendor/github.com/docker/docker/client/build_cancel.go b/vendor/github.com/docker/docker/client/build_cancel.go index 3aae43e3d1..b76bf366bb 100644 --- a/vendor/github.com/docker/docker/client/build_cancel.go +++ b/vendor/github.com/docker/docker/client/build_cancel.go @@ -5,7 +5,7 @@ import ( "net/url" ) -// BuildCancel requests the daemon to cancel ongoing build request +// BuildCancel requests the daemon to cancel the ongoing build request. func (cli *Client) BuildCancel(ctx context.Context, id string) error { query := url.Values{} query.Set("id", id) diff --git a/vendor/github.com/docker/docker/client/build_prune.go b/vendor/github.com/docker/docker/client/build_prune.go index 397d67cdcf..2b6606236e 100644 --- a/vendor/github.com/docker/docker/client/build_prune.go +++ b/vendor/github.com/docker/docker/client/build_prune.go @@ -3,8 +3,8 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" - "fmt" "net/url" + "strconv" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" @@ -23,12 +23,12 @@ func (cli *Client) BuildCachePrune(ctx context.Context, opts types.BuildCachePru if opts.All { query.Set("all", "1") } - query.Set("keep-storage", fmt.Sprintf("%d", opts.KeepStorage)) - filters, err := filters.ToJSON(opts.Filters) + query.Set("keep-storage", strconv.Itoa(int(opts.KeepStorage))) + f, err := filters.ToJSON(opts.Filters) if err != nil { return nil, errors.Wrap(err, "prune could not marshal filters option") } - query.Set("filters", filters) + query.Set("filters", f) serverResp, err := cli.post(ctx, "/build/prune", query, nil, nil) defer ensureReaderClosed(serverResp) @@ -38,7 +38,7 @@ func (cli *Client) BuildCachePrune(ctx context.Context, opts types.BuildCachePru } if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { - return nil, fmt.Errorf("Error retrieving disk usage: %v", err) + return nil, errors.Wrap(err, "error retrieving disk usage") } return &report, nil diff --git a/vendor/github.com/docker/docker/client/checkpoint_list.go b/vendor/github.com/docker/docker/client/checkpoint_list.go index 66d46dd161..39cfb959ff 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_list.go +++ b/vendor/github.com/docker/docker/client/checkpoint_list.go @@ -20,7 +20,7 @@ func (cli *Client) CheckpointList(ctx context.Context, container string, options resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil) defer ensureReaderClosed(resp) if err != nil { - return checkpoints, wrapResponseError(err, resp, "container", container) + return checkpoints, err } err = json.NewDecoder(resp.body).Decode(&checkpoints) diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go index 9b2b2eaeb8..54fa36cca8 100644 --- a/vendor/github.com/docker/docker/client/client.go +++ b/vendor/github.com/docker/docker/client/client.go @@ -4,11 +4,12 @@ Package client is a Go client for the Docker Engine API. For more information about the Engine API, see the documentation: https://docs.docker.com/engine/api/ -Usage +# Usage -You use the library by creating a client object and calling methods on it. The -client can be created either from environment variables with NewClientWithOpts(client.FromEnv), -or configured manually with NewClient(). +You use the library by constructing a client object using [NewClientWithOpts] +and calling methods on it. The client can be configured from environment +variables by passing the [FromEnv] option, or configured manually by passing any +of the other available [Opts]. For example, to list running containers (the equivalent of "docker ps"): @@ -37,13 +38,11 @@ For example, to list running containers (the equivalent of "docker ps"): fmt.Printf("%s %s\n", container.ID[:10], container.Image) } } - */ package client // import "github.com/docker/docker/client" import ( "context" - "fmt" "net" "net/http" "net/url" @@ -57,6 +56,36 @@ import ( "github.com/pkg/errors" ) +// DummyHost is a hostname used for local communication. +// +// It acts as a valid formatted hostname for local connections (such as "unix://" +// or "npipe://") which do not require a hostname. It should never be resolved, +// but uses the special-purpose ".localhost" TLD (as defined in [RFC 2606, Section 2] +// and [RFC 6761, Section 6.3]). +// +// [RFC 7230, Section 5.4] defines that an empty header must be used for such +// cases: +// +// If the authority component is missing or undefined for the target URI, +// then a client MUST send a Host header field with an empty field-value. +// +// However, [Go stdlib] enforces the semantics of HTTP(S) over TCP, does not +// allow an empty header to be used, and requires req.URL.Scheme to be either +// "http" or "https". +// +// For further details, refer to: +// +// - https://github.com/docker/engine-api/issues/189 +// - https://github.com/golang/go/issues/13624 +// - https://github.com/golang/go/issues/61076 +// - https://github.com/moby/moby/issues/45935 +// +// [RFC 2606, Section 2]: https://www.rfc-editor.org/rfc/rfc2606.html#section-2 +// [RFC 6761, Section 6.3]: https://www.rfc-editor.org/rfc/rfc6761#section-6.3 +// [RFC 7230, Section 5.4]: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4 +// [Go stdlib]: https://github.com/golang/go/blob/6244b1946bc2101b01955468f1be502dbadd6807/src/net/http/transport.go#L558-L569 +const DummyHost = "api.moby.localhost" + // ErrRedirect is the error returned by checkRedirect when the request is non-GET. var ErrRedirect = errors.New("unexpected redirect in response") @@ -93,15 +122,18 @@ type Client struct { } // CheckRedirect specifies the policy for dealing with redirect responses: -// If the request is non-GET return `ErrRedirect`. Otherwise use the last response. +// If the request is non-GET return ErrRedirect, otherwise use the last response. +// +// Go 1.8 changes behavior for HTTP redirects (specifically 301, 307, and 308) +// in the client. The Docker client (and by extension docker API client) can be +// made to send a request like POST /containers//start where what would normally +// be in the name section of the URL is empty. This triggers an HTTP 301 from +// the daemon. // -// Go 1.8 changes behavior for HTTP redirects (specifically 301, 307, and 308) in the client . -// The Docker client (and by extension docker API client) can be made to send a request -// like POST /containers//start where what would normally be in the name section of the URL is empty. -// This triggers an HTTP 301 from the daemon. -// In go 1.8 this 301 will be converted to a GET request, and ends up getting a 404 from the daemon. -// This behavior change manifests in the client in that before the 301 was not followed and -// the client did not generate an error, but now results in a message like Error response from daemon: page not found. +// In go 1.8 this 301 will be converted to a GET request, and ends up getting +// a 404 from the daemon. This behavior change manifests in the client in that +// before, the 301 was not followed and the client did not generate an error, +// but now results in a message like Error response from daemon: page not found. func CheckRedirect(req *http.Request, via []*http.Request) error { if via[0].Method == http.MethodGet { return http.ErrUseLastResponse @@ -109,15 +141,27 @@ func CheckRedirect(req *http.Request, via []*http.Request) error { return ErrRedirect } -// NewClientWithOpts initializes a new API client with default values. It takes functors -// to modify values when creating it, like `NewClientWithOpts(WithVersion(…))` -// It also initializes the custom http headers to add to each request. +// NewClientWithOpts initializes a new API client with a default HTTPClient, and +// default API host and version. It also initializes the custom HTTP headers to +// add to each request. // -// It won't send any version information if the version number is empty. It is -// highly recommended that you set a version or your client may break if the -// server is upgraded. +// It takes an optional list of Opt functional arguments, which are applied in +// the order they're provided, which allows modifying the defaults when creating +// the client. For example, the following initializes a client that configures +// itself with values from environment variables (client.FromEnv), and has +// automatic API version negotiation enabled (client.WithAPIVersionNegotiation()). +// +// cli, err := client.NewClientWithOpts( +// client.FromEnv, +// client.WithAPIVersionNegotiation(), +// ) func NewClientWithOpts(ops ...Opt) (*Client, error) { - client, err := defaultHTTPClient(DefaultDockerHost) + hostURL, err := ParseHostURL(DefaultDockerHost) + if err != nil { + return nil, err + } + + client, err := defaultHTTPClient(hostURL) if err != nil { return nil, err } @@ -125,8 +169,8 @@ func NewClientWithOpts(ops ...Opt) (*Client, error) { host: DefaultDockerHost, version: api.DefaultVersion, client: client, - proto: defaultProto, - addr: defaultAddr, + proto: hostURL.Scheme, + addr: hostURL.Host, } for _, op := range ops { @@ -152,13 +196,12 @@ func NewClientWithOpts(ops ...Opt) (*Client, error) { return c, nil } -func defaultHTTPClient(host string) (*http.Client, error) { - url, err := ParseHostURL(host) +func defaultHTTPClient(hostURL *url.URL) (*http.Client, error) { + transport := &http.Transport{} + err := sockets.ConfigureTransport(transport, hostURL.Scheme, hostURL.Host) if err != nil { return nil, err } - transport := new(http.Transport) - sockets.ConfigureTransport(transport, url.Scheme, url.Host) return &http.Client{ Transport: transport, CheckRedirect: CheckRedirect, @@ -194,11 +237,21 @@ func (cli *Client) ClientVersion() string { return cli.version } -// NegotiateAPIVersion queries the API and updates the version to match the -// API version. Any errors are silently ignored. If a manual override is in place, -// either through the `DOCKER_API_VERSION` environment variable, or if the client -// was initialized with a fixed version (`opts.WithVersion(xx)`), no negotiation -// will be performed. +// NegotiateAPIVersion queries the API and updates the version to match the API +// version. NegotiateAPIVersion downgrades the client's API version to match the +// APIVersion if the ping version is lower than the default version. If the API +// version reported by the server is higher than the maximum version supported +// by the client, it uses the client's maximum version. +// +// If a manual override is in place, either through the "DOCKER_API_VERSION" +// (EnvOverrideAPIVersion) environment variable, or if the client is initialized +// with a fixed version (WithVersion(xx)), no negotiation is performed. +// +// If the API server's ping response does not contain an API version, or if the +// client did not get a successful ping response, it assumes it is connected with +// an old daemon that does not support API version negotiation, in which case it +// downgrades to the latest version of the API before version negotiation was +// added (1.24). func (cli *Client) NegotiateAPIVersion(ctx context.Context) { if !cli.manualOverride { ping, _ := cli.Ping(ctx) @@ -206,23 +259,31 @@ func (cli *Client) NegotiateAPIVersion(ctx context.Context) { } } -// NegotiateAPIVersionPing updates the client version to match the Ping.APIVersion -// if the ping version is less than the default version. If a manual override is -// in place, either through the `DOCKER_API_VERSION` environment variable, or if -// the client was initialized with a fixed version (`opts.WithVersion(xx)`), no -// negotiation is performed. -func (cli *Client) NegotiateAPIVersionPing(p types.Ping) { +// NegotiateAPIVersionPing downgrades the client's API version to match the +// APIVersion in the ping response. If the API version in pingResponse is higher +// than the maximum version supported by the client, it uses the client's maximum +// version. +// +// If a manual override is in place, either through the "DOCKER_API_VERSION" +// (EnvOverrideAPIVersion) environment variable, or if the client is initialized +// with a fixed version (WithVersion(xx)), no negotiation is performed. +// +// If the API server's ping response does not contain an API version, we assume +// we are connected with an old daemon without API version negotiation support, +// and downgrade to the latest version of the API before version negotiation was +// added (1.24). +func (cli *Client) NegotiateAPIVersionPing(pingResponse types.Ping) { if !cli.manualOverride { - cli.negotiateAPIVersionPing(p) + cli.negotiateAPIVersionPing(pingResponse) } } // negotiateAPIVersionPing queries the API and updates the version to match the -// API version. Any errors are silently ignored. -func (cli *Client) negotiateAPIVersionPing(p types.Ping) { - // try the latest version before versioning headers existed - if p.APIVersion == "" { - p.APIVersion = "1.24" +// API version from the ping response. +func (cli *Client) negotiateAPIVersionPing(pingResponse types.Ping) { + // default to the latest version before versioning headers existed + if pingResponse.APIVersion == "" { + pingResponse.APIVersion = "1.24" } // if the client is not initialized with a version, start with the latest supported version @@ -231,8 +292,8 @@ func (cli *Client) negotiateAPIVersionPing(p types.Ping) { } // if server version is lower than the client version, downgrade - if versions.LessThan(p.APIVersion, cli.version) { - cli.version = p.APIVersion + if versions.LessThan(pingResponse.APIVersion, cli.version) { + cli.version = pingResponse.APIVersion } // Store the results, so that automatic API version negotiation (if enabled) @@ -256,13 +317,12 @@ func (cli *Client) HTTPClient() *http.Client { // ParseHostURL parses a url string, validates the string is a host url, and // returns the parsed URL func ParseHostURL(host string) (*url.URL, error) { - protoAddrParts := strings.SplitN(host, "://", 2) - if len(protoAddrParts) == 1 { - return nil, fmt.Errorf("unable to parse docker host `%s`", host) + proto, addr, ok := strings.Cut(host, "://") + if !ok || addr == "" { + return nil, errors.Errorf("unable to parse docker host `%s`", host) } var basePath string - proto, addr := protoAddrParts[0], protoAddrParts[1] if proto == "tcp" { parsed, err := url.Parse("tcp://" + addr) if err != nil { @@ -278,22 +338,9 @@ func ParseHostURL(host string) (*url.URL, error) { }, nil } -// CustomHTTPHeaders returns the custom http headers stored by the client. -func (cli *Client) CustomHTTPHeaders() map[string]string { - m := make(map[string]string) - for k, v := range cli.customHTTPHeaders { - m[k] = v - } - return m -} - -// SetCustomHTTPHeaders that will be set on every HTTP request made by the client. -// Deprecated: use WithHTTPHeaders when creating the client. -func (cli *Client) SetCustomHTTPHeaders(headers map[string]string) { - cli.customHTTPHeaders = headers -} - -// Dialer returns a dialer for a raw stream connection, with HTTP/1.1 header, that can be used for proxying the daemon connection. +// Dialer returns a dialer for a raw stream connection, with an HTTP/1.1 header, +// that can be used for proxying the daemon connection. +// // Used by `docker dial-stdio` (docker/cli#889). func (cli *Client) Dialer() func(context.Context) (net.Conn, error) { return func(ctx context.Context) (net.Conn, error) { diff --git a/vendor/github.com/docker/docker/client/client_deprecated.go b/vendor/github.com/docker/docker/client/client_deprecated.go index 54cdfc29a8..9e366ce20d 100644 --- a/vendor/github.com/docker/docker/client/client_deprecated.go +++ b/vendor/github.com/docker/docker/client/client_deprecated.go @@ -9,7 +9,11 @@ import "net/http" // It won't send any version information if the version number is empty. It is // highly recommended that you set a version or your client may break if the // server is upgraded. -// Deprecated: use NewClientWithOpts +// +// Deprecated: use [NewClientWithOpts] passing the [WithHost], [WithVersion], +// [WithHTTPClient] and [WithHTTPHeaders] options. We recommend enabling API +// version negotiation by passing the [WithAPIVersionNegotiation] option instead +// of WithVersion. func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) { return NewClientWithOpts(WithHost(host), WithVersion(version), WithHTTPClient(client), WithHTTPHeaders(httpHeaders)) } @@ -17,7 +21,7 @@ func NewClient(host string, version string, client *http.Client, httpHeaders map // NewEnvClient initializes a new API client based on environment variables. // See FromEnv for a list of support environment variables. // -// Deprecated: use NewClientWithOpts(FromEnv) +// Deprecated: use [NewClientWithOpts] passing the [FromEnv] option. func NewEnvClient() (*Client, error) { return NewClientWithOpts(FromEnv) } diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/vendor/github.com/docker/docker/client/client_unix.go index 5846f888fe..319b738d3e 100644 --- a/vendor/github.com/docker/docker/client/client_unix.go +++ b/vendor/github.com/docker/docker/client/client_unix.go @@ -1,10 +1,8 @@ -//go:build linux || freebsd || openbsd || netbsd || darwin || solaris || illumos || dragonfly -// +build linux freebsd openbsd netbsd darwin solaris illumos dragonfly +//go:build !windows +// +build !windows package client // import "github.com/docker/docker/client" -// DefaultDockerHost defines os specific default if DOCKER_HOST is unset +// DefaultDockerHost defines OS-specific default host if the DOCKER_HOST +// (EnvOverrideHost) environment variable is unset or empty. const DefaultDockerHost = "unix:///var/run/docker.sock" - -const defaultProto = "unix" -const defaultAddr = "/var/run/docker.sock" diff --git a/vendor/github.com/docker/docker/client/client_windows.go b/vendor/github.com/docker/docker/client/client_windows.go index c649e54412..56572d1a27 100644 --- a/vendor/github.com/docker/docker/client/client_windows.go +++ b/vendor/github.com/docker/docker/client/client_windows.go @@ -1,7 +1,5 @@ package client // import "github.com/docker/docker/client" -// DefaultDockerHost defines os specific default if DOCKER_HOST is unset +// DefaultDockerHost defines OS-specific default host if the DOCKER_HOST +// (EnvOverrideHost) environment variable is unset or empty. const DefaultDockerHost = "npipe:////./pipe/docker_engine" - -const defaultProto = "npipe" -const defaultAddr = "//./pipe/docker_engine" diff --git a/vendor/github.com/docker/docker/client/config_create.go b/vendor/github.com/docker/docker/client/config_create.go index ee7d411df0..f6b1881fc3 100644 --- a/vendor/github.com/docker/docker/client/config_create.go +++ b/vendor/github.com/docker/docker/client/config_create.go @@ -8,7 +8,7 @@ import ( "github.com/docker/docker/api/types/swarm" ) -// ConfigCreate creates a new Config. +// ConfigCreate creates a new config. func (cli *Client) ConfigCreate(ctx context.Context, config swarm.ConfigSpec) (types.ConfigCreateResponse, error) { var response types.ConfigCreateResponse if err := cli.NewVersionError("1.30", "config create"); err != nil { diff --git a/vendor/github.com/docker/docker/client/config_inspect.go b/vendor/github.com/docker/docker/client/config_inspect.go index 7d0ce3e11c..9be7882c3d 100644 --- a/vendor/github.com/docker/docker/client/config_inspect.go +++ b/vendor/github.com/docker/docker/client/config_inspect.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "github.com/docker/docker/api/types/swarm" ) @@ -20,10 +20,10 @@ func (cli *Client) ConfigInspectWithRaw(ctx context.Context, id string) (swarm.C resp, err := cli.get(ctx, "/configs/"+id, nil, nil) defer ensureReaderClosed(resp) if err != nil { - return swarm.Config{}, nil, wrapResponseError(err, resp, "config", id) + return swarm.Config{}, nil, err } - body, err := ioutil.ReadAll(resp.body) + body, err := io.ReadAll(resp.body) if err != nil { return swarm.Config{}, nil, err } diff --git a/vendor/github.com/docker/docker/client/config_remove.go b/vendor/github.com/docker/docker/client/config_remove.go index a708fcaecf..24b94e9c18 100644 --- a/vendor/github.com/docker/docker/client/config_remove.go +++ b/vendor/github.com/docker/docker/client/config_remove.go @@ -2,12 +2,12 @@ package client // import "github.com/docker/docker/client" import "context" -// ConfigRemove removes a Config. +// ConfigRemove removes a config. func (cli *Client) ConfigRemove(ctx context.Context, id string) error { if err := cli.NewVersionError("1.30", "config remove"); err != nil { return err } resp, err := cli.delete(ctx, "/configs/"+id, nil, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "config", id) + return err } diff --git a/vendor/github.com/docker/docker/client/config_update.go b/vendor/github.com/docker/docker/client/config_update.go index 39e59cf858..1ac2985435 100644 --- a/vendor/github.com/docker/docker/client/config_update.go +++ b/vendor/github.com/docker/docker/client/config_update.go @@ -3,18 +3,17 @@ package client // import "github.com/docker/docker/client" import ( "context" "net/url" - "strconv" "github.com/docker/docker/api/types/swarm" ) -// ConfigUpdate attempts to update a Config +// ConfigUpdate attempts to update a config func (cli *Client) ConfigUpdate(ctx context.Context, id string, version swarm.Version, config swarm.ConfigSpec) error { if err := cli.NewVersionError("1.30", "config update"); err != nil { return err } query := url.Values{} - query.Set("version", strconv.FormatUint(version.Index, 10)) + query.Set("version", version.String()) resp, err := cli.post(ctx, "/configs/"+id+"/update", query, config, nil) ensureReaderClosed(resp) return err diff --git a/vendor/github.com/docker/docker/client/container_attach.go b/vendor/github.com/docker/docker/client/container_attach.go index 88ba1ef639..ba92117d3e 100644 --- a/vendor/github.com/docker/docker/client/container_attach.go +++ b/vendor/github.com/docker/docker/client/container_attach.go @@ -22,7 +22,7 @@ import ( // multiplexed. // The format of the multiplexed stream is as follows: // -// [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT} +// [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT} // // STREAM_TYPE can be 1 for stdout and 2 for stderr // @@ -52,6 +52,8 @@ func (cli *Client) ContainerAttach(ctx context.Context, container string, option query.Set("logs", "1") } - headers := map[string][]string{"Content-Type": {"text/plain"}} + headers := map[string][]string{ + "Content-Type": {"text/plain"}, + } return cli.postHijacked(ctx, "/containers/"+container+"/attach", query, nil, headers) } diff --git a/vendor/github.com/docker/docker/client/container_commit.go b/vendor/github.com/docker/docker/client/container_commit.go index 2966e88c8e..cd7f763464 100644 --- a/vendor/github.com/docker/docker/client/container_commit.go +++ b/vendor/github.com/docker/docker/client/container_commit.go @@ -10,7 +10,7 @@ import ( "github.com/docker/docker/api/types" ) -// ContainerCommit applies changes into a container and creates a new tagged image. +// ContainerCommit applies changes to a container and creates a new tagged image. func (cli *Client) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) { var repository, tag string if options.Reference != "" { diff --git a/vendor/github.com/docker/docker/client/container_copy.go b/vendor/github.com/docker/docker/client/container_copy.go index bb278bf7f3..883be7fa34 100644 --- a/vendor/github.com/docker/docker/client/container_copy.go +++ b/vendor/github.com/docker/docker/client/container_copy.go @@ -14,7 +14,7 @@ import ( "github.com/docker/docker/api/types" ) -// ContainerStatPath returns Stat information about a path inside the container filesystem. +// ContainerStatPath returns stat information about a path inside the container filesystem. func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) { query := url.Values{} query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. @@ -23,7 +23,7 @@ func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path stri response, err := cli.head(ctx, urlStr, query, nil) defer ensureReaderClosed(response) if err != nil { - return types.ContainerPathStat{}, wrapResponseError(err, response, "container:path", containerID+":"+path) + return types.ContainerPathStat{}, err } return getContainerPathStatFromHeader(response.header) } @@ -47,12 +47,7 @@ func (cli *Client) CopyToContainer(ctx context.Context, containerID, dstPath str response, err := cli.putRaw(ctx, apiPath, query, content, nil) defer ensureReaderClosed(response) if err != nil { - return wrapResponseError(err, response, "container:path", containerID+":"+dstPath) - } - - // TODO this code converts non-error status-codes (e.g., "204 No Content") into an error; verify if this is the desired behavior - if response.statusCode != http.StatusOK { - return fmt.Errorf("unexpected status code from daemon: %d", response.statusCode) + return err } return nil @@ -67,12 +62,7 @@ func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath s apiPath := "/containers/" + containerID + "/archive" response, err := cli.get(ctx, apiPath, query, nil) if err != nil { - return nil, types.ContainerPathStat{}, wrapResponseError(err, response, "container:path", containerID+":"+srcPath) - } - - // TODO this code converts non-error status-codes (e.g., "204 No Content") into an error; verify if this is the desired behavior - if response.statusCode != http.StatusOK { - return nil, types.ContainerPathStat{}, fmt.Errorf("unexpected status code from daemon: %d", response.statusCode) + return nil, types.ContainerPathStat{}, err } // In order to get the copy behavior right, we need to know information diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go index c5079ee539..193a2bb562 100644 --- a/vendor/github.com/docker/docker/client/container_create.go +++ b/vendor/github.com/docker/docker/client/container_create.go @@ -9,7 +9,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/versions" - specs "github.com/opencontainers/image-spec/specs-go/v1" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) type configWrapper struct { @@ -18,24 +18,33 @@ type configWrapper struct { NetworkingConfig *network.NetworkingConfig } -// ContainerCreate creates a new container based in the given configuration. +// ContainerCreate creates a new container based on the given configuration. // It can be associated with a name, but it's not mandatory. -func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *specs.Platform, containerName string) (container.ContainerCreateCreatedBody, error) { - var response container.ContainerCreateCreatedBody +func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error) { + var response container.CreateResponse if err := cli.NewVersionError("1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil { return response, err } - - // When using API 1.24 and under, the client is responsible for removing the container - if hostConfig != nil && versions.LessThan(cli.ClientVersion(), "1.25") { - hostConfig.AutoRemove = false - } - if err := cli.NewVersionError("1.41", "specify container image platform"); platform != nil && err != nil { return response, err } + if hostConfig != nil { + if versions.LessThan(cli.ClientVersion(), "1.25") { + // When using API 1.24 and under, the client is responsible for removing the container + hostConfig.AutoRemove = false + } + if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.42") || versions.LessThan(cli.ClientVersion(), "1.40") { + // KernelMemory was added in API 1.40, and deprecated in API 1.42 + hostConfig.KernelMemory = 0 + } + if platform != nil && platform.OS == "linux" && versions.LessThan(cli.ClientVersion(), "1.42") { + // When using API under 1.42, the Linux daemon doesn't respect the ConsoleSize + hostConfig.ConsoleSize = [2]uint{0, 0} + } + } + query := url.Values{} if p := formatPlatform(platform); p != "" { query.Set("platform", p) @@ -66,7 +75,7 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config // Similar to containerd's platforms.Format(), but does allow components to be // omitted (e.g. pass "architecture" only, without "os": // https://github.com/containerd/containerd/blob/v1.5.2/platforms/platforms.go#L243-L263 -func formatPlatform(platform *specs.Platform) string { +func formatPlatform(platform *ocispec.Platform) string { if platform == nil { return "" } diff --git a/vendor/github.com/docker/docker/client/container_diff.go b/vendor/github.com/docker/docker/client/container_diff.go index 29dac8491d..c22c819a79 100644 --- a/vendor/github.com/docker/docker/client/container_diff.go +++ b/vendor/github.com/docker/docker/client/container_diff.go @@ -9,8 +9,8 @@ import ( ) // ContainerDiff shows differences in a container filesystem since it was started. -func (cli *Client) ContainerDiff(ctx context.Context, containerID string) ([]container.ContainerChangeResponseItem, error) { - var changes []container.ContainerChangeResponseItem +func (cli *Client) ContainerDiff(ctx context.Context, containerID string) ([]container.FilesystemChange, error) { + var changes []container.FilesystemChange serverResp, err := cli.get(ctx, "/containers/"+containerID+"/changes", url.Values{}, nil) defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/container_exec.go b/vendor/github.com/docker/docker/client/container_exec.go index e3ee755b71..6a2cb006f8 100644 --- a/vendor/github.com/docker/docker/client/container_exec.go +++ b/vendor/github.com/docker/docker/client/container_exec.go @@ -5,6 +5,7 @@ import ( "encoding/json" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/versions" ) // ContainerExecCreate creates a new exec configuration to run an exec process. @@ -14,6 +15,9 @@ func (cli *Client) ContainerExecCreate(ctx context.Context, container string, co if err := cli.NewVersionError("1.25", "env"); len(config.Env) != 0 && err != nil { return response, err } + if versions.LessThan(cli.ClientVersion(), "1.42") { + config.ConsoleSize = nil + } resp, err := cli.post(ctx, "/containers/"+container+"/exec", nil, config, nil) defer ensureReaderClosed(resp) @@ -26,6 +30,9 @@ func (cli *Client) ContainerExecCreate(ctx context.Context, container string, co // ContainerExecStart starts an exec process already created in the docker host. func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error { + if versions.LessThan(cli.ClientVersion(), "1.42") { + config.ConsoleSize = nil + } resp, err := cli.post(ctx, "/exec/"+execID+"/start", nil, config, nil) ensureReaderClosed(resp) return err @@ -36,7 +43,12 @@ func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config // and the a reader to get output. It's up to the called to close // the hijacked connection by calling types.HijackedResponse.Close. func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) { - headers := map[string][]string{"Content-Type": {"application/json"}} + if versions.LessThan(cli.ClientVersion(), "1.42") { + config.ConsoleSize = nil + } + headers := map[string][]string{ + "Content-Type": {"application/json"}, + } return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers) } diff --git a/vendor/github.com/docker/docker/client/container_inspect.go b/vendor/github.com/docker/docker/client/container_inspect.go index c496bcffea..d48f0d3a68 100644 --- a/vendor/github.com/docker/docker/client/container_inspect.go +++ b/vendor/github.com/docker/docker/client/container_inspect.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "net/url" "github.com/docker/docker/api/types" @@ -18,7 +18,7 @@ func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (ty serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil) defer ensureReaderClosed(serverResp) if err != nil { - return types.ContainerJSON{}, wrapResponseError(err, serverResp, "container", containerID) + return types.ContainerJSON{}, err } var response types.ContainerJSON @@ -38,10 +38,10 @@ func (cli *Client) ContainerInspectWithRaw(ctx context.Context, containerID stri serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil) defer ensureReaderClosed(serverResp) if err != nil { - return types.ContainerJSON{}, nil, wrapResponseError(err, serverResp, "container", containerID) + return types.ContainerJSON{}, nil, err } - body, err := ioutil.ReadAll(serverResp.body) + body, err := io.ReadAll(serverResp.body) if err != nil { return types.ContainerJSON{}, nil, err } diff --git a/vendor/github.com/docker/docker/client/container_kill.go b/vendor/github.com/docker/docker/client/container_kill.go index 4d6f1d23da..7c9529f1e1 100644 --- a/vendor/github.com/docker/docker/client/container_kill.go +++ b/vendor/github.com/docker/docker/client/container_kill.go @@ -8,7 +8,9 @@ import ( // ContainerKill terminates the container process but does not remove the container from the docker host. func (cli *Client) ContainerKill(ctx context.Context, containerID, signal string) error { query := url.Values{} - query.Set("signal", signal) + if signal != "" { + query.Set("signal", signal) + } resp, err := cli.post(ctx, "/containers/"+containerID+"/kill", query, nil, nil) ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go index a973de597f..bd491b3db9 100644 --- a/vendor/github.com/docker/docker/client/container_list.go +++ b/vendor/github.com/docker/docker/client/container_list.go @@ -18,7 +18,7 @@ func (cli *Client) ContainerList(ctx context.Context, options types.ContainerLis query.Set("all", "1") } - if options.Limit != -1 { + if options.Limit > 0 { query.Set("limit", strconv.Itoa(options.Limit)) } diff --git a/vendor/github.com/docker/docker/client/container_logs.go b/vendor/github.com/docker/docker/client/container_logs.go index 5b6541f035..9bdf2b0fa6 100644 --- a/vendor/github.com/docker/docker/client/container_logs.go +++ b/vendor/github.com/docker/docker/client/container_logs.go @@ -24,7 +24,7 @@ import ( // multiplexed. // The format of the multiplexed stream is as follows: // -// [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT} +// [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT} // // STREAM_TYPE can be 1 for stdout and 2 for stderr // @@ -74,7 +74,7 @@ func (cli *Client) ContainerLogs(ctx context.Context, container string, options resp, err := cli.get(ctx, "/containers/"+container+"/logs", query, nil) if err != nil { - return nil, wrapResponseError(err, resp, "container", container) + return nil, err } return resp.body, nil } diff --git a/vendor/github.com/docker/docker/client/container_remove.go b/vendor/github.com/docker/docker/client/container_remove.go index df81461b88..c21de609b0 100644 --- a/vendor/github.com/docker/docker/client/container_remove.go +++ b/vendor/github.com/docker/docker/client/container_remove.go @@ -23,5 +23,5 @@ func (cli *Client) ContainerRemove(ctx context.Context, containerID string, opti resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "container", containerID) + return err } diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go index 41e421969f..1e0ad99981 100644 --- a/vendor/github.com/docker/docker/client/container_restart.go +++ b/vendor/github.com/docker/docker/client/container_restart.go @@ -3,18 +3,22 @@ package client // import "github.com/docker/docker/client" import ( "context" "net/url" - "time" + "strconv" - timetypes "github.com/docker/docker/api/types/time" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/versions" ) // ContainerRestart stops and starts a container again. -// It makes the daemon to wait for the container to be up again for +// It makes the daemon wait for the container to be up again for // a specific amount of time, given the timeout. -func (cli *Client) ContainerRestart(ctx context.Context, containerID string, timeout *time.Duration) error { +func (cli *Client) ContainerRestart(ctx context.Context, containerID string, options container.StopOptions) error { query := url.Values{} - if timeout != nil { - query.Set("t", timetypes.DurationToSecondsString(*timeout)) + if options.Timeout != nil { + query.Set("t", strconv.Itoa(*options.Timeout)) + } + if options.Signal != "" && versions.GreaterThanOrEqualTo(cli.version, "1.42") { + query.Set("signal", options.Signal) } resp, err := cli.post(ctx, "/containers/"+containerID+"/restart", query, nil, nil) ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/container_stop.go b/vendor/github.com/docker/docker/client/container_stop.go index 629d7ab64c..2a43ce2274 100644 --- a/vendor/github.com/docker/docker/client/container_stop.go +++ b/vendor/github.com/docker/docker/client/container_stop.go @@ -3,9 +3,10 @@ package client // import "github.com/docker/docker/client" import ( "context" "net/url" - "time" + "strconv" - timetypes "github.com/docker/docker/api/types/time" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/versions" ) // ContainerStop stops a container. In case the container fails to stop @@ -15,10 +16,13 @@ import ( // If the timeout is nil, the container's StopTimeout value is used, if set, // otherwise the engine default. A negative timeout value can be specified, // meaning no timeout, i.e. no forceful termination is performed. -func (cli *Client) ContainerStop(ctx context.Context, containerID string, timeout *time.Duration) error { +func (cli *Client) ContainerStop(ctx context.Context, containerID string, options container.StopOptions) error { query := url.Values{} - if timeout != nil { - query.Set("t", timetypes.DurationToSecondsString(*timeout)) + if options.Timeout != nil { + query.Set("t", strconv.Itoa(*options.Timeout)) + } + if options.Signal != "" && versions.GreaterThanOrEqualTo(cli.version, "1.42") { + query.Set("signal", options.Signal) } resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil) ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/container_update.go b/vendor/github.com/docker/docker/client/container_update.go index 6917cf9fb3..bf68a5300e 100644 --- a/vendor/github.com/docker/docker/client/container_update.go +++ b/vendor/github.com/docker/docker/client/container_update.go @@ -7,7 +7,7 @@ import ( "github.com/docker/docker/api/types/container" ) -// ContainerUpdate updates resources of a container +// ContainerUpdate updates the resources of a container. func (cli *Client) ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) { var response container.ContainerUpdateOKBody serverResp, err := cli.post(ctx, "/containers/"+containerID+"/update", nil, updateConfig, nil) diff --git a/vendor/github.com/docker/docker/client/container_wait.go b/vendor/github.com/docker/docker/client/container_wait.go index 6ab8c1da96..2375eb1e80 100644 --- a/vendor/github.com/docker/docker/client/container_wait.go +++ b/vendor/github.com/docker/docker/client/container_wait.go @@ -1,14 +1,19 @@ package client // import "github.com/docker/docker/client" import ( + "bytes" "context" "encoding/json" + "errors" + "io" "net/url" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/versions" ) +const containerWaitErrorMsgLimit = 2 * 1024 /* Max: 2KiB */ + // ContainerWait waits until the specified container is in a certain state // indicated by the given condition, either "not-running" (default), // "next-exit", or "removed". @@ -24,16 +29,18 @@ import ( // wait request or in getting the response. This allows the caller to // synchronize ContainerWait with other calls, such as specifying a // "next-exit" condition before issuing a ContainerStart request. -func (cli *Client) ContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) { +func (cli *Client) ContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) (<-chan container.WaitResponse, <-chan error) { if versions.LessThan(cli.ClientVersion(), "1.30") { return cli.legacyContainerWait(ctx, containerID) } - resultC := make(chan container.ContainerWaitOKBody) + resultC := make(chan container.WaitResponse) errC := make(chan error, 1) query := url.Values{} - query.Set("condition", string(condition)) + if condition != "" { + query.Set("condition", string(condition)) + } resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", query, nil, nil) if err != nil { @@ -44,9 +51,23 @@ func (cli *Client) ContainerWait(ctx context.Context, containerID string, condit go func() { defer ensureReaderClosed(resp) - var res container.ContainerWaitOKBody - if err := json.NewDecoder(resp.body).Decode(&res); err != nil { - errC <- err + + body := resp.body + responseText := bytes.NewBuffer(nil) + stream := io.TeeReader(body, responseText) + + var res container.WaitResponse + if err := json.NewDecoder(stream).Decode(&res); err != nil { + // NOTE(nicks): The /wait API does not work well with HTTP proxies. + // At any time, the proxy could cut off the response stream. + // + // But because the HTTP status has already been written, the proxy's + // only option is to write a plaintext error message. + // + // If there's a JSON parsing error, read the real error message + // off the body and send it to the client. + _, _ = io.ReadAll(io.LimitReader(stream, containerWaitErrorMsgLimit)) + errC <- errors.New(responseText.String()) return } @@ -58,8 +79,8 @@ func (cli *Client) ContainerWait(ctx context.Context, containerID string, condit // legacyContainerWait returns immediately and doesn't have an option to wait // until the container is removed. -func (cli *Client) legacyContainerWait(ctx context.Context, containerID string) (<-chan container.ContainerWaitOKBody, <-chan error) { - resultC := make(chan container.ContainerWaitOKBody) +func (cli *Client) legacyContainerWait(ctx context.Context, containerID string) (<-chan container.WaitResponse, <-chan error) { + resultC := make(chan container.WaitResponse) errC := make(chan error) go func() { @@ -70,7 +91,7 @@ func (cli *Client) legacyContainerWait(ctx context.Context, containerID string) } defer ensureReaderClosed(resp) - var res container.ContainerWaitOKBody + var res container.WaitResponse if err := json.NewDecoder(resp.body).Decode(&res); err != nil { errC <- err return diff --git a/vendor/github.com/docker/docker/client/disk_usage.go b/vendor/github.com/docker/docker/client/disk_usage.go index 354cd36939..ba0d92e9e6 100644 --- a/vendor/github.com/docker/docker/client/disk_usage.go +++ b/vendor/github.com/docker/docker/client/disk_usage.go @@ -4,23 +4,30 @@ import ( "context" "encoding/json" "fmt" + "net/url" "github.com/docker/docker/api/types" ) // DiskUsage requests the current data usage from the daemon -func (cli *Client) DiskUsage(ctx context.Context) (types.DiskUsage, error) { - var du types.DiskUsage +func (cli *Client) DiskUsage(ctx context.Context, options types.DiskUsageOptions) (types.DiskUsage, error) { + var query url.Values + if len(options.Types) > 0 { + query = url.Values{} + for _, t := range options.Types { + query.Add("type", string(t)) + } + } - serverResp, err := cli.get(ctx, "/system/df", nil, nil) + serverResp, err := cli.get(ctx, "/system/df", query, nil) defer ensureReaderClosed(serverResp) if err != nil { - return du, err + return types.DiskUsage{}, err } + var du types.DiskUsage if err := json.NewDecoder(serverResp.body).Decode(&du); err != nil { - return du, fmt.Errorf("Error retrieving disk usage: %v", err) + return types.DiskUsage{}, fmt.Errorf("Error retrieving disk usage: %v", err) } - return du, nil } diff --git a/vendor/github.com/docker/docker/client/distribution_inspect.go b/vendor/github.com/docker/docker/client/distribution_inspect.go index f4e3794cb4..efab066d3b 100644 --- a/vendor/github.com/docker/docker/client/distribution_inspect.go +++ b/vendor/github.com/docker/docker/client/distribution_inspect.go @@ -5,13 +5,13 @@ import ( "encoding/json" "net/url" - registrytypes "github.com/docker/docker/api/types/registry" + "github.com/docker/docker/api/types/registry" ) -// DistributionInspect returns the image digest with full Manifest -func (cli *Client) DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registrytypes.DistributionInspect, error) { +// DistributionInspect returns the image digest with the full manifest. +func (cli *Client) DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registry.DistributionInspect, error) { // Contact the registry to retrieve digest and platform information - var distributionInspect registrytypes.DistributionInspect + var distributionInspect registry.DistributionInspect if image == "" { return distributionInspect, objectNotFoundError{object: "distribution", id: image} } @@ -23,7 +23,7 @@ func (cli *Client) DistributionInspect(ctx context.Context, image, encodedRegist if encodedRegistryAuth != "" { headers = map[string][]string{ - "X-Registry-Auth": {encodedRegistryAuth}, + registry.AuthHeader: {encodedRegistryAuth}, } } diff --git a/vendor/github.com/docker/docker/client/envvars.go b/vendor/github.com/docker/docker/client/envvars.go new file mode 100644 index 0000000000..61dd45c1d7 --- /dev/null +++ b/vendor/github.com/docker/docker/client/envvars.go @@ -0,0 +1,90 @@ +package client // import "github.com/docker/docker/client" + +const ( + // EnvOverrideHost is the name of the environment variable that can be used + // to override the default host to connect to (DefaultDockerHost). + // + // This env-var is read by FromEnv and WithHostFromEnv and when set to a + // non-empty value, takes precedence over the default host (which is platform + // specific), or any host already set. + EnvOverrideHost = "DOCKER_HOST" + + // EnvOverrideAPIVersion is the name of the environment variable that can + // be used to override the API version to use. Value should be + // formatted as MAJOR.MINOR, for example, "1.19". + // + // This env-var is read by FromEnv and WithVersionFromEnv and when set to a + // non-empty value, takes precedence over API version negotiation. + // + // This environment variable should be used for debugging purposes only, as + // it can set the client to use an incompatible (or invalid) API version. + EnvOverrideAPIVersion = "DOCKER_API_VERSION" + + // EnvOverrideCertPath is the name of the environment variable that can be + // used to specify the directory from which to load the TLS certificates + // (ca.pem, cert.pem, key.pem) from. These certificates are used to configure + // the Client for a TCP connection protected by TLS client authentication. + // + // TLS certificate verification is enabled by default if the Client is configured + // to use a TLS connection. Refer to EnvTLSVerify below to learn how to + // disable verification for testing purposes. + // + // WARNING: Access to the remote API is equivalent to root access to the + // host where the daemon runs. Do not expose the API without protection, + // and only if needed. Make sure you are familiar with the "daemon attack + // surface" (https://docs.docker.com/go/attack-surface/). + // + // For local access to the API, it is recommended to connect with the daemon + // using the default local socket connection (on Linux), or the named pipe + // (on Windows). + // + // If you need to access the API of a remote daemon, consider using an SSH + // (ssh://) connection, which is easier to set up, and requires no additional + // configuration if the host is accessible using ssh. + // + // If you cannot use the alternatives above, and you must expose the API over + // a TCP connection, refer to https://docs.docker.com/engine/security/protect-access/ + // to learn how to configure the daemon and client to use a TCP connection + // with TLS client authentication. Make sure you know the differences between + // a regular TLS connection and a TLS connection protected by TLS client + // authentication, and verify that the API cannot be accessed by other clients. + EnvOverrideCertPath = "DOCKER_CERT_PATH" + + // EnvTLSVerify is the name of the environment variable that can be used to + // enable or disable TLS certificate verification. When set to a non-empty + // value, TLS certificate verification is enabled, and the client is configured + // to use a TLS connection, using certificates from the default directories + // (within `~/.docker`); refer to EnvOverrideCertPath above for additional + // details. + // + // WARNING: Access to the remote API is equivalent to root access to the + // host where the daemon runs. Do not expose the API without protection, + // and only if needed. Make sure you are familiar with the "daemon attack + // surface" (https://docs.docker.com/go/attack-surface/). + // + // Before setting up your client and daemon to use a TCP connection with TLS + // client authentication, consider using one of the alternatives mentioned + // in EnvOverrideCertPath above. + // + // Disabling TLS certificate verification (for testing purposes) + // + // TLS certificate verification is enabled by default if the Client is configured + // to use a TLS connection, and it is highly recommended to keep verification + // enabled to prevent machine-in-the-middle attacks. Refer to the documentation + // at https://docs.docker.com/engine/security/protect-access/ and pages linked + // from that page to learn how to configure the daemon and client to use a + // TCP connection with TLS client authentication enabled. + // + // Set the "DOCKER_TLS_VERIFY" environment to an empty string ("") to + // disable TLS certificate verification. Disabling verification is insecure, + // so should only be done for testing purposes. From the Go documentation + // (https://pkg.go.dev/crypto/tls#Config): + // + // InsecureSkipVerify controls whether a client verifies the server's + // certificate chain and host name. If InsecureSkipVerify is true, crypto/tls + // accepts any certificate presented by the server and any host name in that + // certificate. In this mode, TLS is susceptible to machine-in-the-middle + // attacks unless custom verification is used. This should be used only for + // testing or in combination with VerifyConnection or VerifyPeerCertificate. + EnvTLSVerify = "DOCKER_TLS_VERIFY" +) diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go index 041bc8d49c..6878144c41 100644 --- a/vendor/github.com/docker/docker/client/errors.go +++ b/vendor/github.com/docker/docker/client/errors.go @@ -2,7 +2,6 @@ package client // import "github.com/docker/docker/client" import ( "fmt" - "net/http" "github.com/docker/docker/api/types/versions" "github.com/docker/docker/errdefs" @@ -41,11 +40,11 @@ type notFound interface { // IsErrNotFound returns true if the error is a NotFound error, which is returned // by the API when some object is not found. func IsErrNotFound(err error) bool { - var e notFound - if errors.As(err, &e) { + if errdefs.IsNotFound(err) { return true } - return errdefs.IsNotFound(err) + var e notFound + return errors.As(err, &e) } type objectNotFoundError struct { @@ -59,75 +58,6 @@ func (e objectNotFoundError) Error() string { return fmt.Sprintf("Error: No such %s: %s", e.object, e.id) } -func wrapResponseError(err error, resp serverResponse, object, id string) error { - switch { - case err == nil: - return nil - case resp.statusCode == http.StatusNotFound: - return objectNotFoundError{object: object, id: id} - case resp.statusCode == http.StatusNotImplemented: - return errdefs.NotImplemented(err) - default: - return err - } -} - -// unauthorizedError represents an authorization error in a remote registry. -type unauthorizedError struct { - cause error -} - -// Error returns a string representation of an unauthorizedError -func (u unauthorizedError) Error() string { - return u.cause.Error() -} - -// IsErrUnauthorized returns true if the error is caused -// when a remote registry authentication fails -func IsErrUnauthorized(err error) bool { - if _, ok := err.(unauthorizedError); ok { - return ok - } - return errdefs.IsUnauthorized(err) -} - -type pluginPermissionDenied struct { - name string -} - -func (e pluginPermissionDenied) Error() string { - return "Permission denied while installing plugin " + e.name -} - -// IsErrPluginPermissionDenied returns true if the error is caused -// when a user denies a plugin's permissions -func IsErrPluginPermissionDenied(err error) bool { - _, ok := err.(pluginPermissionDenied) - return ok -} - -type notImplementedError struct { - message string -} - -func (e notImplementedError) Error() string { - return e.message -} - -func (e notImplementedError) NotImplemented() bool { - return true -} - -// IsErrNotImplemented returns true if the error is a NotImplemented error. -// This is returned by the API when a requested feature has not been -// implemented. -func IsErrNotImplemented(err error) bool { - if _, ok := err.(notImplementedError); ok { - return ok - } - return errdefs.IsNotImplemented(err) -} - // NewVersionError returns an error if the APIVersion required // if less than the current supported version func (cli *Client) NewVersionError(APIrequired, feature string) error { diff --git a/vendor/github.com/docker/docker/client/events.go b/vendor/github.com/docker/docker/client/events.go index f0dc9d9e12..a9c48a9288 100644 --- a/vendor/github.com/docker/docker/client/events.go +++ b/vendor/github.com/docker/docker/client/events.go @@ -17,7 +17,6 @@ import ( // be sent over the error channel. If an error is sent all processing will be stopped. It's up // to the caller to reopen the stream in the event of an error by reinvoking this method. func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) { - messages := make(chan events.Message) errs := make(chan error, 1) diff --git a/vendor/github.com/docker/docker/client/hijack.go b/vendor/github.com/docker/docker/client/hijack.go index e1dc49ef0f..7e84865f69 100644 --- a/vendor/github.com/docker/docker/client/hijack.go +++ b/vendor/github.com/docker/docker/client/hijack.go @@ -12,6 +12,7 @@ import ( "time" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/versions" "github.com/docker/go-connections/sockets" "github.com/pkg/errors" ) @@ -22,20 +23,16 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu if err != nil { return types.HijackedResponse{}, err } - - apiPath := cli.getAPIPath(ctx, path, query) - req, err := http.NewRequest(http.MethodPost, apiPath, bodyEncoded) + req, err := cli.buildRequest(http.MethodPost, cli.getAPIPath(ctx, path, query), bodyEncoded, headers) if err != nil { return types.HijackedResponse{}, err } - req = cli.addHeaders(req, headers) - - conn, err := cli.setupHijackConn(ctx, req, "tcp") + conn, mediaType, err := cli.setupHijackConn(ctx, req, "tcp") if err != nil { return types.HijackedResponse{}, err } - return types.HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn)}, err + return types.NewHijackedResponse(conn, mediaType), err } // DialHijack returns a hijacked connection with negotiated protocol proto. @@ -46,7 +43,8 @@ func (cli *Client) DialHijack(ctx context.Context, url, proto string, meta map[s } req = cli.addHeaders(req, meta) - return cli.setupHijackConn(ctx, req, proto) + conn, _, err := cli.setupHijackConn(ctx, req, proto) + return conn, err } // fallbackDial is used when WithDialer() was not called. @@ -61,15 +59,14 @@ func fallbackDial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) { return net.Dial(proto, addr) } -func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto string) (net.Conn, error) { - req.Host = cli.addr +func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto string) (net.Conn, string, error) { req.Header.Set("Connection", "Upgrade") req.Header.Set("Upgrade", proto) dialer := cli.Dialer() conn, err := dialer(ctx) if err != nil { - return nil, errors.Wrap(err, "cannot connect to the Docker daemon. Is 'docker daemon' running on this host?") + return nil, "", errors.Wrap(err, "cannot connect to the Docker daemon. Is 'docker daemon' running on this host?") } // When we set up a TCP connection for hijack, there could be long periods @@ -78,8 +75,8 @@ func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto // state. Setting TCP KeepAlive on the socket connection will prohibit // ECONNTIMEOUT unless the socket connection truly is broken if tcpConn, ok := conn.(*net.TCPConn); ok { - tcpConn.SetKeepAlive(true) - tcpConn.SetKeepAlivePeriod(30 * time.Second) + _ = tcpConn.SetKeepAlive(true) + _ = tcpConn.SetKeepAlivePeriod(30 * time.Second) } clientconn := httputil.NewClientConn(conn, nil) @@ -91,18 +88,18 @@ func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto //nolint:staticcheck // ignore SA1019 for connecting to old (pre go1.8) daemons if err != httputil.ErrPersistEOF { if err != nil { - return nil, err + return nil, "", err } if resp.StatusCode != http.StatusSwitchingProtocols { - resp.Body.Close() - return nil, fmt.Errorf("unable to upgrade to %s, received %d", proto, resp.StatusCode) + _ = resp.Body.Close() + return nil, "", fmt.Errorf("unable to upgrade to %s, received %d", proto, resp.StatusCode) } } c, br := clientconn.Hijack() if br.Buffered() > 0 { // If there is buffered content, wrap the connection. We return an - // object that implements CloseWrite iff the underlying connection + // object that implements CloseWrite if the underlying connection // implements it. if _, ok := c.(types.CloseWriter); ok { c = &hijackedConnCloseWriter{&hijackedConn{c, br}} @@ -113,7 +110,13 @@ func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto br.Reset(nil) } - return c, nil + var mediaType string + if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.42") { + // Prior to 1.42, Content-Type is always set to raw-stream and not relevant + mediaType = resp.Header.Get("Content-Type") + } + + return c, mediaType, nil } // hijackedConn wraps a net.Conn and is returned by setupHijackConn in the case diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go index 8fcf995036..d16e1d8ea9 100644 --- a/vendor/github.com/docker/docker/client/image_build.go +++ b/vendor/github.com/docker/docker/client/image_build.go @@ -14,8 +14,8 @@ import ( "github.com/docker/docker/api/types/container" ) -// ImageBuild sends request to the daemon to build images. -// The Body in the response implement an io.ReadCloser and it's up to the caller to +// ImageBuild sends a request to the daemon to build images. +// The Body in the response implements an io.ReadCloser and it's up to the caller to // close it. func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) { query, err := cli.imageBuildOptionsToQuery(options) diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go index 239380474e..6a9b708f7d 100644 --- a/vendor/github.com/docker/docker/client/image_create.go +++ b/vendor/github.com/docker/docker/client/image_create.go @@ -8,9 +8,10 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" ) -// ImageCreate creates a new image based in the parent options. +// ImageCreate creates a new image based on the parent options. // It returns the JSON content in the response body. func (cli *Client) ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) { ref, err := reference.ParseNormalizedNamed(parentReference) @@ -32,6 +33,6 @@ func (cli *Client) ImageCreate(ctx context.Context, parentReference string, opti } func (cli *Client) tryImageCreate(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + headers := map[string][]string{registry.AuthHeader: {registryAuth}} return cli.post(ctx, "/images/create", query, nil, headers) } diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go index d3336d4106..c5de42cb79 100644 --- a/vendor/github.com/docker/docker/client/image_import.go +++ b/vendor/github.com/docker/docker/client/image_import.go @@ -10,7 +10,7 @@ import ( "github.com/docker/docker/api/types" ) -// ImageImport creates a new image based in the source options. +// ImageImport creates a new image based on the source options. // It returns the JSON content in the response body. func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) { if ref != "" { diff --git a/vendor/github.com/docker/docker/client/image_inspect.go b/vendor/github.com/docker/docker/client/image_inspect.go index 1eb8dce025..1de10e5a08 100644 --- a/vendor/github.com/docker/docker/client/image_inspect.go +++ b/vendor/github.com/docker/docker/client/image_inspect.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "github.com/docker/docker/api/types" ) @@ -17,10 +17,10 @@ func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (typ serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil) defer ensureReaderClosed(serverResp) if err != nil { - return types.ImageInspect{}, nil, wrapResponseError(err, serverResp, "image", imageID) + return types.ImageInspect{}, nil, err } - body, err := ioutil.ReadAll(serverResp.body) + body, err := io.ReadAll(serverResp.body) if err != nil { return types.ImageInspect{}, nil, err } diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go index a4d7505094..950d513334 100644 --- a/vendor/github.com/docker/docker/client/image_list.go +++ b/vendor/github.com/docker/docker/client/image_list.go @@ -34,6 +34,9 @@ func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions if options.All { query.Set("all", "1") } + if options.SharedSize && versions.GreaterThanOrEqualTo(cli.version, "1.42") { + query.Set("shared-size", "1") + } serverResp, err := cli.get(ctx, "/images/json", query, nil) defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go index 845580d4a4..dd1b8f3471 100644 --- a/vendor/github.com/docker/docker/client/image_push.go +++ b/vendor/github.com/docker/docker/client/image_push.go @@ -8,6 +8,7 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" "github.com/docker/docker/errdefs" ) @@ -49,6 +50,6 @@ func (cli *Client) ImagePush(ctx context.Context, image string, options types.Im } func (cli *Client) tryImagePush(ctx context.Context, imageID string, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + headers := map[string][]string{registry.AuthHeader: {registryAuth}} return cli.post(ctx, "/images/"+imageID+"/push", query, nil, headers) } diff --git a/vendor/github.com/docker/docker/client/image_remove.go b/vendor/github.com/docker/docker/client/image_remove.go index 84a41af0f2..6a9fb3f41f 100644 --- a/vendor/github.com/docker/docker/client/image_remove.go +++ b/vendor/github.com/docker/docker/client/image_remove.go @@ -23,7 +23,7 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options type resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) defer ensureReaderClosed(resp) if err != nil { - return dels, wrapResponseError(err, resp, "image", imageID) + return dels, err } err = json.NewDecoder(resp.body).Decode(&dels) diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go index 82955a7477..5f0c49ed30 100644 --- a/vendor/github.com/docker/docker/client/image_search.go +++ b/vendor/github.com/docker/docker/client/image_search.go @@ -3,8 +3,8 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" - "fmt" "net/url" + "strconv" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" @@ -12,13 +12,15 @@ import ( "github.com/docker/docker/errdefs" ) -// ImageSearch makes the docker host to search by a term in a remote registry. +// ImageSearch makes the docker host search by a term in a remote registry. // The list of results is not sorted in any fashion. func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) { var results []registry.SearchResult query := url.Values{} query.Set("term", term) - query.Set("limit", fmt.Sprintf("%d", options.Limit)) + if options.Limit > 0 { + query.Set("limit", strconv.Itoa(options.Limit)) + } if options.Filters.Len() > 0 { filterJSON, err := filters.ToJSON(options.Filters) @@ -46,6 +48,6 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options types.I } func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + headers := map[string][]string{registry.AuthHeader: {registryAuth}} return cli.get(ctx, "/images/search", query, headers) } diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go index aabad4a911..7993c5a48f 100644 --- a/vendor/github.com/docker/docker/client/interface.go +++ b/vendor/github.com/docker/docker/client/interface.go @@ -5,18 +5,17 @@ import ( "io" "net" "net/http" - "time" "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/events" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/image" - networktypes "github.com/docker/docker/api/types/network" + "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" - volumetypes "github.com/docker/docker/api/types/volume" - specs "github.com/opencontainers/image-spec/specs-go/v1" + "github.com/docker/docker/api/types/volume" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) // CommonAPIClient is the common methods between stable and experimental versions of APIClient. @@ -48,8 +47,8 @@ type CommonAPIClient interface { type ContainerAPIClient interface { ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) - ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, platform *specs.Platform, containerName string) (containertypes.ContainerCreateCreatedBody, error) - ContainerDiff(ctx context.Context, container string) ([]containertypes.ContainerChangeResponseItem, error) + ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error) + ContainerDiff(ctx context.Context, container string) ([]container.FilesystemChange, error) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) @@ -65,16 +64,16 @@ type ContainerAPIClient interface { ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error ContainerRename(ctx context.Context, container, newContainerName string) error ContainerResize(ctx context.Context, container string, options types.ResizeOptions) error - ContainerRestart(ctx context.Context, container string, timeout *time.Duration) error + ContainerRestart(ctx context.Context, container string, options container.StopOptions) error ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) ContainerStatsOneShot(ctx context.Context, container string) (types.ContainerStats, error) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error - ContainerStop(ctx context.Context, container string, timeout *time.Duration) error - ContainerTop(ctx context.Context, container string, arguments []string) (containertypes.ContainerTopOKBody, error) + ContainerStop(ctx context.Context, container string, options container.StopOptions) error + ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error) ContainerUnpause(ctx context.Context, container string) error - ContainerUpdate(ctx context.Context, container string, updateConfig containertypes.UpdateConfig) (containertypes.ContainerUpdateOKBody, error) - ContainerWait(ctx context.Context, container string, condition containertypes.WaitCondition) (<-chan containertypes.ContainerWaitOKBody, <-chan error) + ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) + ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.WaitResponse, <-chan error) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) @@ -107,7 +106,7 @@ type ImageAPIClient interface { // NetworkAPIClient defines API client methods for the networks type NetworkAPIClient interface { - NetworkConnect(ctx context.Context, network, container string, config *networktypes.EndpointSettings) error + NetworkConnect(ctx context.Context, network, container string, config *network.EndpointSettings) error NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) NetworkDisconnect(ctx context.Context, network, container string, force bool) error NetworkInspect(ctx context.Context, network string, options types.NetworkInspectOptions) (types.NetworkResource, error) @@ -167,19 +166,20 @@ type SwarmAPIClient interface { type SystemAPIClient interface { Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) Info(ctx context.Context) (types.Info, error) - RegistryLogin(ctx context.Context, auth types.AuthConfig) (registry.AuthenticateOKBody, error) - DiskUsage(ctx context.Context) (types.DiskUsage, error) + RegistryLogin(ctx context.Context, auth registry.AuthConfig) (registry.AuthenticateOKBody, error) + DiskUsage(ctx context.Context, options types.DiskUsageOptions) (types.DiskUsage, error) Ping(ctx context.Context) (types.Ping, error) } // VolumeAPIClient defines API client methods for the volumes type VolumeAPIClient interface { - VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) - VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) - VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) - VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumeListOKBody, error) + VolumeCreate(ctx context.Context, options volume.CreateOptions) (volume.Volume, error) + VolumeInspect(ctx context.Context, volumeID string) (volume.Volume, error) + VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error) + VolumeList(ctx context.Context, options volume.ListOptions) (volume.ListResponse, error) VolumeRemove(ctx context.Context, volumeID string, force bool) error VolumesPrune(ctx context.Context, pruneFilter filters.Args) (types.VolumesPruneReport, error) + VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error } // SecretAPIClient defines API client methods for secrets diff --git a/vendor/github.com/docker/docker/client/login.go b/vendor/github.com/docker/docker/client/login.go index f058520638..19e985e0b9 100644 --- a/vendor/github.com/docker/docker/client/login.go +++ b/vendor/github.com/docker/docker/client/login.go @@ -5,13 +5,12 @@ import ( "encoding/json" "net/url" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" ) // RegistryLogin authenticates the docker server with a given docker registry. // It returns unauthorizedError when the authentication fails. -func (cli *Client) RegistryLogin(ctx context.Context, auth types.AuthConfig) (registry.AuthenticateOKBody, error) { +func (cli *Client) RegistryLogin(ctx context.Context, auth registry.AuthConfig) (registry.AuthenticateOKBody, error) { resp, err := cli.post(ctx, "/auth", url.Values{}, auth, nil) defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/network_inspect.go b/vendor/github.com/docker/docker/client/network_inspect.go index 89a05b3021..0f90e2bb90 100644 --- a/vendor/github.com/docker/docker/client/network_inspect.go +++ b/vendor/github.com/docker/docker/client/network_inspect.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "net/url" "github.com/docker/docker/api/types" @@ -36,10 +36,10 @@ func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, resp, err = cli.get(ctx, "/networks/"+networkID, query, nil) defer ensureReaderClosed(resp) if err != nil { - return networkResource, nil, wrapResponseError(err, resp, "network", networkID) + return networkResource, nil, err } - body, err := ioutil.ReadAll(resp.body) + body, err := io.ReadAll(resp.body) if err != nil { return networkResource, nil, err } diff --git a/vendor/github.com/docker/docker/client/network_remove.go b/vendor/github.com/docker/docker/client/network_remove.go index e71b16d869..9d6c6cef07 100644 --- a/vendor/github.com/docker/docker/client/network_remove.go +++ b/vendor/github.com/docker/docker/client/network_remove.go @@ -6,5 +6,5 @@ import "context" func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error { resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "network", networkID) + return err } diff --git a/vendor/github.com/docker/docker/client/node_inspect.go b/vendor/github.com/docker/docker/client/node_inspect.go index d296c9fdde..95ab9b1be0 100644 --- a/vendor/github.com/docker/docker/client/node_inspect.go +++ b/vendor/github.com/docker/docker/client/node_inspect.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "github.com/docker/docker/api/types/swarm" ) @@ -17,10 +17,10 @@ func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil) defer ensureReaderClosed(serverResp) if err != nil { - return swarm.Node{}, nil, wrapResponseError(err, serverResp, "node", nodeID) + return swarm.Node{}, nil, err } - body, err := ioutil.ReadAll(serverResp.body) + body, err := io.ReadAll(serverResp.body) if err != nil { return swarm.Node{}, nil, err } diff --git a/vendor/github.com/docker/docker/client/node_remove.go b/vendor/github.com/docker/docker/client/node_remove.go index 03ab878097..e44436debc 100644 --- a/vendor/github.com/docker/docker/client/node_remove.go +++ b/vendor/github.com/docker/docker/client/node_remove.go @@ -16,5 +16,5 @@ func (cli *Client) NodeRemove(ctx context.Context, nodeID string, options types. resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "node", nodeID) + return err } diff --git a/vendor/github.com/docker/docker/client/node_update.go b/vendor/github.com/docker/docker/client/node_update.go index de32a617fb..0d0fc3b788 100644 --- a/vendor/github.com/docker/docker/client/node_update.go +++ b/vendor/github.com/docker/docker/client/node_update.go @@ -3,7 +3,6 @@ package client // import "github.com/docker/docker/client" import ( "context" "net/url" - "strconv" "github.com/docker/docker/api/types/swarm" ) @@ -11,7 +10,7 @@ import ( // NodeUpdate updates a Node. func (cli *Client) NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error { query := url.Values{} - query.Set("version", strconv.FormatUint(version.Index, 10)) + query.Set("version", version.String()) resp, err := cli.post(ctx, "/nodes/"+nodeID+"/update", query, node, nil) ensureReaderClosed(resp) return err diff --git a/vendor/github.com/docker/docker/client/options.go b/vendor/github.com/docker/docker/client/options.go index 6f77f0955f..099ad41846 100644 --- a/vendor/github.com/docker/docker/client/options.go +++ b/vendor/github.com/docker/docker/client/options.go @@ -18,51 +18,32 @@ type Opt func(*Client) error // FromEnv configures the client with values from environment variables. // -// Supported environment variables: -// DOCKER_HOST to set the url to the docker server. -// DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. -// DOCKER_CERT_PATH to load the TLS certificates from. -// DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. +// FromEnv uses the following environment variables: +// +// DOCKER_HOST (EnvOverrideHost) to set the URL to the docker server. +// +// DOCKER_API_VERSION (EnvOverrideAPIVersion) to set the version of the API to +// use, leave empty for latest. +// +// DOCKER_CERT_PATH (EnvOverrideCertPath) to specify the directory from which to +// load the TLS certificates (ca.pem, cert.pem, key.pem). +// +// DOCKER_TLS_VERIFY (EnvTLSVerify) to enable or disable TLS verification (off by +// default). func FromEnv(c *Client) error { - if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" { - options := tlsconfig.Options{ - CAFile: filepath.Join(dockerCertPath, "ca.pem"), - CertFile: filepath.Join(dockerCertPath, "cert.pem"), - KeyFile: filepath.Join(dockerCertPath, "key.pem"), - InsecureSkipVerify: os.Getenv("DOCKER_TLS_VERIFY") == "", - } - tlsc, err := tlsconfig.Client(options) - if err != nil { - return err - } - - c.client = &http.Client{ - Transport: &http.Transport{TLSClientConfig: tlsc}, - CheckRedirect: CheckRedirect, - } - } - - if host := os.Getenv("DOCKER_HOST"); host != "" { - if err := WithHost(host)(c); err != nil { - return err - } + ops := []Opt{ + WithTLSClientConfigFromEnv(), + WithHostFromEnv(), + WithVersionFromEnv(), } - - if version := os.Getenv("DOCKER_API_VERSION"); version != "" { - if err := WithVersion(version)(c); err != nil { + for _, op := range ops { + if err := op(c); err != nil { return err } } return nil } -// WithDialer applies the dialer.DialContext to the client transport. This can be -// used to set the Timeout and KeepAlive settings of the client. -// Deprecated: use WithDialContext -func WithDialer(dialer *net.Dialer) Opt { - return WithDialContext(dialer.DialContext) -} - // WithDialContext applies the dialer to the client transport. This can be // used to set the Timeout and KeepAlive settings of the client. func WithDialContext(dialContext func(ctx context.Context, network, addr string) (net.Conn, error)) Opt { @@ -93,6 +74,18 @@ func WithHost(host string) Opt { } } +// WithHostFromEnv overrides the client host with the host specified in the +// DOCKER_HOST (EnvOverrideHost) environment variable. If DOCKER_HOST is not set, +// or set to an empty value, the host is not modified. +func WithHostFromEnv() Opt { + return func(c *Client) error { + if host := os.Getenv(EnvOverrideHost); host != "" { + return WithHost(host)(c) + } + return nil + } +} + // WithHTTPClient overrides the client http client with the specified one func WithHTTPClient(client *http.Client) Opt { return func(c *Client) error { @@ -148,6 +141,42 @@ func WithTLSClientConfig(cacertPath, certPath, keyPath string) Opt { } } +// WithTLSClientConfigFromEnv configures the client's TLS settings with the +// settings in the DOCKER_CERT_PATH and DOCKER_TLS_VERIFY environment variables. +// If DOCKER_CERT_PATH is not set or empty, TLS configuration is not modified. +// +// WithTLSClientConfigFromEnv uses the following environment variables: +// +// DOCKER_CERT_PATH (EnvOverrideCertPath) to specify the directory from which to +// load the TLS certificates (ca.pem, cert.pem, key.pem). +// +// DOCKER_TLS_VERIFY (EnvTLSVerify) to enable or disable TLS verification (off by +// default). +func WithTLSClientConfigFromEnv() Opt { + return func(c *Client) error { + dockerCertPath := os.Getenv(EnvOverrideCertPath) + if dockerCertPath == "" { + return nil + } + options := tlsconfig.Options{ + CAFile: filepath.Join(dockerCertPath, "ca.pem"), + CertFile: filepath.Join(dockerCertPath, "cert.pem"), + KeyFile: filepath.Join(dockerCertPath, "key.pem"), + InsecureSkipVerify: os.Getenv(EnvTLSVerify) == "", + } + tlsc, err := tlsconfig.Client(options) + if err != nil { + return err + } + + c.client = &http.Client{ + Transport: &http.Transport{TLSClientConfig: tlsc}, + CheckRedirect: CheckRedirect, + } + return nil + } +} + // WithVersion overrides the client version with the specified one. If an empty // version is specified, the value will be ignored to allow version negotiation. func WithVersion(version string) Opt { @@ -160,6 +189,15 @@ func WithVersion(version string) Opt { } } +// WithVersionFromEnv overrides the client version with the version specified in +// the DOCKER_API_VERSION environment variable. If DOCKER_API_VERSION is not set, +// the version is not modified. +func WithVersionFromEnv() Opt { + return func(c *Client) error { + return WithVersion(os.Getenv(EnvOverrideAPIVersion))(c) + } +} + // WithAPIVersionNegotiation enables automatic API version negotiation for the client. // With this option enabled, the client automatically negotiates the API version // to use when making requests. API version negotiation is performed on the first diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go index a9af001ef4..347ae71e02 100644 --- a/vendor/github.com/docker/docker/client/ping.go +++ b/vendor/github.com/docker/docker/client/ping.go @@ -4,8 +4,10 @@ import ( "context" "net/http" "path" + "strings" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/errdefs" ) @@ -61,6 +63,13 @@ func parsePingResponse(cli *Client, resp serverResponse) (types.Ping, error) { if bv := resp.header.Get("Builder-Version"); bv != "" { ping.BuilderVersion = types.BuilderVersion(bv) } + if si := resp.header.Get("Swarm"); si != "" { + state, role, _ := strings.Cut(si, "/") + ping.SwarmStatus = &swarm.Status{ + NodeState: swarm.LocalNodeState(state), + ControlAvailable: role == "manager", + } + } err := cli.checkResponseErr(resp) return ping, errdefs.FromStatusCode(err, resp.statusCode) } diff --git a/vendor/github.com/docker/docker/client/plugin_inspect.go b/vendor/github.com/docker/docker/client/plugin_inspect.go index 81b89732b0..f09e460660 100644 --- a/vendor/github.com/docker/docker/client/plugin_inspect.go +++ b/vendor/github.com/docker/docker/client/plugin_inspect.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "github.com/docker/docker/api/types" ) @@ -17,10 +17,10 @@ func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*type resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil) defer ensureReaderClosed(resp) if err != nil { - return nil, nil, wrapResponseError(err, resp, "plugin", name) + return nil, nil, err } - body, err := ioutil.ReadAll(resp.body) + body, err := io.ReadAll(resp.body) if err != nil { return nil, nil, err } diff --git a/vendor/github.com/docker/docker/client/plugin_install.go b/vendor/github.com/docker/docker/client/plugin_install.go index 012afe61ca..3a740ec4f6 100644 --- a/vendor/github.com/docker/docker/client/plugin_install.go +++ b/vendor/github.com/docker/docker/client/plugin_install.go @@ -8,6 +8,7 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" "github.com/docker/docker/errdefs" "github.com/pkg/errors" ) @@ -67,12 +68,12 @@ func (cli *Client) PluginInstall(ctx context.Context, name string, options types } func (cli *Client) tryPluginPrivileges(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + headers := map[string][]string{registry.AuthHeader: {registryAuth}} return cli.get(ctx, "/plugins/privileges", query, headers) } func (cli *Client) tryPluginPull(ctx context.Context, query url.Values, privileges types.PluginPrivileges, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + headers := map[string][]string{registry.AuthHeader: {registryAuth}} return cli.post(ctx, "/plugins/pull", query, privileges, headers) } @@ -106,7 +107,7 @@ func (cli *Client) checkPluginPermissions(ctx context.Context, query url.Values, return nil, err } if !accept { - return nil, pluginPermissionDenied{options.RemoteRef} + return nil, errors.Errorf("permission denied while installing plugin %s", options.RemoteRef) } } return privileges, nil diff --git a/vendor/github.com/docker/docker/client/plugin_list.go b/vendor/github.com/docker/docker/client/plugin_list.go index cf1935e2f5..2091a054d6 100644 --- a/vendor/github.com/docker/docker/client/plugin_list.go +++ b/vendor/github.com/docker/docker/client/plugin_list.go @@ -25,7 +25,7 @@ func (cli *Client) PluginList(ctx context.Context, filter filters.Args) (types.P resp, err := cli.get(ctx, "/plugins", query, nil) defer ensureReaderClosed(resp) if err != nil { - return plugins, wrapResponseError(err, resp, "plugin", "") + return plugins, err } err = json.NewDecoder(resp.body).Decode(&plugins) diff --git a/vendor/github.com/docker/docker/client/plugin_push.go b/vendor/github.com/docker/docker/client/plugin_push.go index d20bfe8447..18f9754c4c 100644 --- a/vendor/github.com/docker/docker/client/plugin_push.go +++ b/vendor/github.com/docker/docker/client/plugin_push.go @@ -3,11 +3,13 @@ package client // import "github.com/docker/docker/client" import ( "context" "io" + + "github.com/docker/docker/api/types/registry" ) // PluginPush pushes a plugin to a registry func (cli *Client) PluginPush(ctx context.Context, name string, registryAuth string) (io.ReadCloser, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + headers := map[string][]string{registry.AuthHeader: {registryAuth}} resp, err := cli.post(ctx, "/plugins/"+name+"/push", nil, nil, headers) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/plugin_remove.go b/vendor/github.com/docker/docker/client/plugin_remove.go index 51ca1040d6..4cd66958c3 100644 --- a/vendor/github.com/docker/docker/client/plugin_remove.go +++ b/vendor/github.com/docker/docker/client/plugin_remove.go @@ -16,5 +16,5 @@ func (cli *Client) PluginRemove(ctx context.Context, name string, options types. resp, err := cli.delete(ctx, "/plugins/"+name, query, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "plugin", name) + return err } diff --git a/vendor/github.com/docker/docker/client/plugin_upgrade.go b/vendor/github.com/docker/docker/client/plugin_upgrade.go index 115cea945b..995d1fd2ca 100644 --- a/vendor/github.com/docker/docker/client/plugin_upgrade.go +++ b/vendor/github.com/docker/docker/client/plugin_upgrade.go @@ -7,6 +7,7 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" "github.com/pkg/errors" ) @@ -34,6 +35,6 @@ func (cli *Client) PluginUpgrade(ctx context.Context, name string, options types } func (cli *Client) tryPluginUpgrade(ctx context.Context, query url.Values, privileges types.PluginPrivileges, name, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + headers := map[string][]string{registry.AuthHeader: {registryAuth}} return cli.post(ctx, "/plugins/"+name+"/upgrade", query, privileges, headers) } diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go index 7f54b1dd80..bcedcf3bd9 100644 --- a/vendor/github.com/docker/docker/client/request.go +++ b/vendor/github.com/docker/docker/client/request.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "net/url" @@ -50,6 +49,14 @@ func (cli *Client) postRaw(ctx context.Context, path string, query url.Values, b return cli.sendRequest(ctx, http.MethodPost, path, query, body, headers) } +func (cli *Client) put(ctx context.Context, path string, query url.Values, obj interface{}, headers map[string][]string) (serverResponse, error) { + body, headers, err := encodeBody(obj, headers) + if err != nil { + return serverResponse{}, err + } + return cli.sendRequest(ctx, http.MethodPut, path, query, body, headers) +} + // putRaw sends an http request to the docker API using the method PUT. func (cli *Client) putRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (serverResponse, error) { return cli.sendRequest(ctx, http.MethodPut, path, query, body, headers) @@ -89,16 +96,14 @@ func (cli *Client) buildRequest(method, path string, body io.Reader, headers hea return nil, err } req = cli.addHeaders(req, headers) + req.URL.Scheme = cli.scheme + req.URL.Host = cli.addr if cli.proto == "unix" || cli.proto == "npipe" { - // For local communications, it doesn't matter what the host is. We just - // need a valid and meaningful host name. (See #189) - req.Host = "docker" + // Override host header for non-tcp connections. + req.Host = DummyHost } - req.URL.Host = cli.addr - req.URL.Scheme = cli.scheme - if expectedPayload && req.Header.Get("Content-Type") == "" { req.Header.Set("Content-Type", "text/plain") } @@ -110,11 +115,16 @@ func (cli *Client) sendRequest(ctx context.Context, method, path string, query u if err != nil { return serverResponse{}, err } + resp, err := cli.doRequest(ctx, req) - if err != nil { - return resp, errdefs.FromStatusCode(err, resp.statusCode) + switch { + case errors.Is(err, context.Canceled): + return serverResponse{}, errdefs.Cancelled(err) + case errors.Is(err, context.DeadlineExceeded): + return serverResponse{}, errdefs.Deadline(err) + case err == nil: + err = cli.checkResponseErr(resp) } - err = cli.checkResponseErr(resp) return resp, errdefs.FromStatusCode(err, resp.statusCode) } @@ -129,7 +139,7 @@ func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResp } if cli.scheme == "https" && strings.Contains(err.Error(), "bad certificate") { - return serverResp, errors.Wrap(err, "The server probably has client authentication (--tlsverify) enabled. Please check your TLS client certification settings") + return serverResp, errors.Wrap(err, "the server probably has client authentication (--tlsverify) enabled; check your TLS client certification settings") } // Don't decorate context sentinel errors; users may be comparing to @@ -141,7 +151,7 @@ func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResp if nErr, ok := err.(*url.Error); ok { if nErr, ok := nErr.Err.(*net.OpError); ok { if os.IsPermission(nErr.Err) { - return serverResp, errors.Wrapf(err, "Got permission denied while trying to connect to the Docker daemon socket at %v", cli.host) + return serverResp, errors.Wrapf(err, "permission denied while trying to connect to the Docker daemon socket at %v", cli.host) } } } @@ -168,10 +178,10 @@ func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResp if strings.Contains(err.Error(), `open //./pipe/docker_engine`) { // Checks if client is running with elevated privileges if f, elevatedErr := os.Open("\\\\.\\PHYSICALDRIVE0"); elevatedErr == nil { - err = errors.Wrap(err, "In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect.") + err = errors.Wrap(err, "in the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect") } else { f.Close() - err = errors.Wrap(err, "This error may indicate that the docker daemon is not running.") + err = errors.Wrap(err, "this error may indicate that the docker daemon is not running") } } @@ -199,7 +209,7 @@ func (cli *Client) checkResponseErr(serverResp serverResponse) error { R: serverResp.body, N: int64(bodyMax), } - body, err = ioutil.ReadAll(bodyR) + body, err = io.ReadAll(bodyR) if err != nil { return err } @@ -234,14 +244,14 @@ func (cli *Client) addHeaders(req *http.Request, headers headers) *http.Request // Add CLI Config's HTTP Headers BEFORE we set the Docker headers // then the user can't change OUR headers for k, v := range cli.customHTTPHeaders { - if versions.LessThan(cli.version, "1.25") && k == "User-Agent" { + if versions.LessThan(cli.version, "1.25") && http.CanonicalHeaderKey(k) == "User-Agent" { continue } req.Header.Set(k, v) } for k, v := range headers { - req.Header[k] = v + req.Header[http.CanonicalHeaderKey(k)] = v } return req } @@ -259,7 +269,7 @@ func encodeData(data interface{}) (*bytes.Buffer, error) { func ensureReaderClosed(response serverResponse) { if response.body != nil { // Drain up to 512 bytes and close the body to let the Transport reuse the connection - io.CopyN(ioutil.Discard, response.body, 512) + io.CopyN(io.Discard, response.body, 512) response.body.Close() } } diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go index fd5b914136..c65d38a191 100644 --- a/vendor/github.com/docker/docker/client/secret_create.go +++ b/vendor/github.com/docker/docker/client/secret_create.go @@ -8,7 +8,7 @@ import ( "github.com/docker/docker/api/types/swarm" ) -// SecretCreate creates a new Secret. +// SecretCreate creates a new secret. func (cli *Client) SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) { var response types.SecretCreateResponse if err := cli.NewVersionError("1.25", "secret create"); err != nil { diff --git a/vendor/github.com/docker/docker/client/secret_inspect.go b/vendor/github.com/docker/docker/client/secret_inspect.go index d093916c9a..5906874b15 100644 --- a/vendor/github.com/docker/docker/client/secret_inspect.go +++ b/vendor/github.com/docker/docker/client/secret_inspect.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "github.com/docker/docker/api/types/swarm" ) @@ -20,10 +20,10 @@ func (cli *Client) SecretInspectWithRaw(ctx context.Context, id string) (swarm.S resp, err := cli.get(ctx, "/secrets/"+id, nil, nil) defer ensureReaderClosed(resp) if err != nil { - return swarm.Secret{}, nil, wrapResponseError(err, resp, "secret", id) + return swarm.Secret{}, nil, err } - body, err := ioutil.ReadAll(resp.body) + body, err := io.ReadAll(resp.body) if err != nil { return swarm.Secret{}, nil, err } diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go index c16f555804..f47f68b6e0 100644 --- a/vendor/github.com/docker/docker/client/secret_remove.go +++ b/vendor/github.com/docker/docker/client/secret_remove.go @@ -2,12 +2,12 @@ package client // import "github.com/docker/docker/client" import "context" -// SecretRemove removes a Secret. +// SecretRemove removes a secret. func (cli *Client) SecretRemove(ctx context.Context, id string) error { if err := cli.NewVersionError("1.25", "secret remove"); err != nil { return err } resp, err := cli.delete(ctx, "/secrets/"+id, nil, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "secret", id) + return err } diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go index 164256bbc1..2e939e8ced 100644 --- a/vendor/github.com/docker/docker/client/secret_update.go +++ b/vendor/github.com/docker/docker/client/secret_update.go @@ -3,18 +3,17 @@ package client // import "github.com/docker/docker/client" import ( "context" "net/url" - "strconv" "github.com/docker/docker/api/types/swarm" ) -// SecretUpdate attempts to update a Secret +// SecretUpdate attempts to update a secret. func (cli *Client) SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error { if err := cli.NewVersionError("1.25", "secret update"); err != nil { return err } query := url.Values{} - query.Set("version", strconv.FormatUint(version.Index, 10)) + query.Set("version", version.String()) resp, err := cli.post(ctx, "/secrets/"+id+"/update", query, secret, nil) ensureReaderClosed(resp) return err diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go index e0428bf98b..b6065b8eef 100644 --- a/vendor/github.com/docker/docker/client/service_create.go +++ b/vendor/github.com/docker/docker/client/service_create.go @@ -8,12 +8,13 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" - digest "github.com/opencontainers/go-digest" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" ) -// ServiceCreate creates a new Service. +// ServiceCreate creates a new service. func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) { var response types.ServiceCreateResponse headers := map[string][]string{ @@ -21,7 +22,7 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, } if options.EncodedRegistryAuth != "" { - headers["X-Registry-Auth"] = []string{options.EncodedRegistryAuth} + headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth} } // Make sure containerSpec is not nil when no runtime is set or the runtime is set to container diff --git a/vendor/github.com/docker/docker/client/service_inspect.go b/vendor/github.com/docker/docker/client/service_inspect.go index 2801483b80..cee020c98b 100644 --- a/vendor/github.com/docker/docker/client/service_inspect.go +++ b/vendor/github.com/docker/docker/client/service_inspect.go @@ -5,7 +5,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "net/url" "github.com/docker/docker/api/types" @@ -22,10 +22,10 @@ func (cli *Client) ServiceInspectWithRaw(ctx context.Context, serviceID string, serverResp, err := cli.get(ctx, "/services/"+serviceID, query, nil) defer ensureReaderClosed(serverResp) if err != nil { - return swarm.Service{}, nil, wrapResponseError(err, serverResp, "service", serviceID) + return swarm.Service{}, nil, err } - body, err := ioutil.ReadAll(serverResp.body) + body, err := io.ReadAll(serverResp.body) if err != nil { return swarm.Service{}, nil, err } diff --git a/vendor/github.com/docker/docker/client/service_remove.go b/vendor/github.com/docker/docker/client/service_remove.go index 953a2adf5a..2c46326ebc 100644 --- a/vendor/github.com/docker/docker/client/service_remove.go +++ b/vendor/github.com/docker/docker/client/service_remove.go @@ -6,5 +6,5 @@ import "context" func (cli *Client) ServiceRemove(ctx context.Context, serviceID string) error { resp, err := cli.delete(ctx, "/services/"+serviceID, nil, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "service", serviceID) + return err } diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go index c63895f74f..ff8cded8be 100644 --- a/vendor/github.com/docker/docker/client/service_update.go +++ b/vendor/github.com/docker/docker/client/service_update.go @@ -4,9 +4,9 @@ import ( "context" "encoding/json" "net/url" - "strconv" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" ) @@ -24,7 +24,7 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version } if options.EncodedRegistryAuth != "" { - headers["X-Registry-Auth"] = []string{options.EncodedRegistryAuth} + headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth} } if options.RegistryAuthFrom != "" { @@ -35,7 +35,7 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version query.Set("rollback", options.Rollback) } - query.Set("version", strconv.FormatUint(version.Index, 10)) + query.Set("version", version.String()) if err := validateServiceSpec(service); err != nil { return response, err diff --git a/vendor/github.com/docker/docker/client/swarm_update.go b/vendor/github.com/docker/docker/client/swarm_update.go index 56a5bea761..9fde7d75ee 100644 --- a/vendor/github.com/docker/docker/client/swarm_update.go +++ b/vendor/github.com/docker/docker/client/swarm_update.go @@ -2,7 +2,6 @@ package client // import "github.com/docker/docker/client" import ( "context" - "fmt" "net/url" "strconv" @@ -12,10 +11,10 @@ import ( // SwarmUpdate updates the swarm. func (cli *Client) SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error { query := url.Values{} - query.Set("version", strconv.FormatUint(version.Index, 10)) - query.Set("rotateWorkerToken", fmt.Sprintf("%v", flags.RotateWorkerToken)) - query.Set("rotateManagerToken", fmt.Sprintf("%v", flags.RotateManagerToken)) - query.Set("rotateManagerUnlockKey", fmt.Sprintf("%v", flags.RotateManagerUnlockKey)) + query.Set("version", version.String()) + query.Set("rotateWorkerToken", strconv.FormatBool(flags.RotateWorkerToken)) + query.Set("rotateManagerToken", strconv.FormatBool(flags.RotateManagerToken)) + query.Set("rotateManagerUnlockKey", strconv.FormatBool(flags.RotateManagerUnlockKey)) resp, err := cli.post(ctx, "/swarm/update", query, swarm, nil) ensureReaderClosed(resp) return err diff --git a/vendor/github.com/docker/docker/client/task_inspect.go b/vendor/github.com/docker/docker/client/task_inspect.go index 44d40ba5ae..dde1f6c59d 100644 --- a/vendor/github.com/docker/docker/client/task_inspect.go +++ b/vendor/github.com/docker/docker/client/task_inspect.go @@ -4,12 +4,12 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "github.com/docker/docker/api/types/swarm" ) -// TaskInspectWithRaw returns the task information and its raw representation.. +// TaskInspectWithRaw returns the task information and its raw representation. func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) { if taskID == "" { return swarm.Task{}, nil, objectNotFoundError{object: "task", id: taskID} @@ -17,10 +17,10 @@ func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm serverResp, err := cli.get(ctx, "/tasks/"+taskID, nil, nil) defer ensureReaderClosed(serverResp) if err != nil { - return swarm.Task{}, nil, wrapResponseError(err, serverResp, "task", taskID) + return swarm.Task{}, nil, err } - body, err := ioutil.ReadAll(serverResp.body) + body, err := io.ReadAll(serverResp.body) if err != nil { return swarm.Task{}, nil, err } diff --git a/vendor/github.com/docker/docker/client/volume_create.go b/vendor/github.com/docker/docker/client/volume_create.go index 92761b3c63..b3b182437b 100644 --- a/vendor/github.com/docker/docker/client/volume_create.go +++ b/vendor/github.com/docker/docker/client/volume_create.go @@ -4,18 +4,17 @@ import ( "context" "encoding/json" - "github.com/docker/docker/api/types" - volumetypes "github.com/docker/docker/api/types/volume" + "github.com/docker/docker/api/types/volume" ) // VolumeCreate creates a volume in the docker host. -func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) { - var volume types.Volume +func (cli *Client) VolumeCreate(ctx context.Context, options volume.CreateOptions) (volume.Volume, error) { + var vol volume.Volume resp, err := cli.post(ctx, "/volumes/create", nil, options, nil) defer ensureReaderClosed(resp) if err != nil { - return volume, err + return vol, err } - err = json.NewDecoder(resp.body).Decode(&volume) - return volume, err + err = json.NewDecoder(resp.body).Decode(&vol) + return vol, err } diff --git a/vendor/github.com/docker/docker/client/volume_inspect.go b/vendor/github.com/docker/docker/client/volume_inspect.go index e20b2c67c7..b3ba4e6046 100644 --- a/vendor/github.com/docker/docker/client/volume_inspect.go +++ b/vendor/github.com/docker/docker/client/volume_inspect.go @@ -4,35 +4,35 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/volume" ) // VolumeInspect returns the information about a specific volume in the docker host. -func (cli *Client) VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) { - volume, _, err := cli.VolumeInspectWithRaw(ctx, volumeID) - return volume, err +func (cli *Client) VolumeInspect(ctx context.Context, volumeID string) (volume.Volume, error) { + vol, _, err := cli.VolumeInspectWithRaw(ctx, volumeID) + return vol, err } // VolumeInspectWithRaw returns the information about a specific volume in the docker host and its raw representation -func (cli *Client) VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) { +func (cli *Client) VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error) { if volumeID == "" { - return types.Volume{}, nil, objectNotFoundError{object: "volume", id: volumeID} + return volume.Volume{}, nil, objectNotFoundError{object: "volume", id: volumeID} } - var volume types.Volume + var vol volume.Volume resp, err := cli.get(ctx, "/volumes/"+volumeID, nil, nil) defer ensureReaderClosed(resp) if err != nil { - return volume, nil, wrapResponseError(err, resp, "volume", volumeID) + return vol, nil, err } - body, err := ioutil.ReadAll(resp.body) + body, err := io.ReadAll(resp.body) if err != nil { - return volume, nil, err + return vol, nil, err } rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&volume) - return volume, body, err + err = json.NewDecoder(rdr).Decode(&vol) + return vol, body, err } diff --git a/vendor/github.com/docker/docker/client/volume_list.go b/vendor/github.com/docker/docker/client/volume_list.go index 942498dde2..d5ea9827c7 100644 --- a/vendor/github.com/docker/docker/client/volume_list.go +++ b/vendor/github.com/docker/docker/client/volume_list.go @@ -6,17 +6,17 @@ import ( "net/url" "github.com/docker/docker/api/types/filters" - volumetypes "github.com/docker/docker/api/types/volume" + "github.com/docker/docker/api/types/volume" ) // VolumeList returns the volumes configured in the docker host. -func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumeListOKBody, error) { - var volumes volumetypes.VolumeListOKBody +func (cli *Client) VolumeList(ctx context.Context, options volume.ListOptions) (volume.ListResponse, error) { + var volumes volume.ListResponse query := url.Values{} - if filter.Len() > 0 { + if options.Filters.Len() > 0 { //nolint:staticcheck // ignore SA1019 for old code - filterJSON, err := filters.ToParamWithVersion(cli.version, filter) + filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) if err != nil { return volumes, err } diff --git a/vendor/github.com/docker/docker/client/volume_remove.go b/vendor/github.com/docker/docker/client/volume_remove.go index 79decdafab..1f26438360 100644 --- a/vendor/github.com/docker/docker/client/volume_remove.go +++ b/vendor/github.com/docker/docker/client/volume_remove.go @@ -17,5 +17,5 @@ func (cli *Client) VolumeRemove(ctx context.Context, volumeID string, force bool } resp, err := cli.delete(ctx, "/volumes/"+volumeID, query, nil) defer ensureReaderClosed(resp) - return wrapResponseError(err, resp, "volume", volumeID) + return err } diff --git a/vendor/github.com/docker/docker/client/volume_update.go b/vendor/github.com/docker/docker/client/volume_update.go new file mode 100644 index 0000000000..33bd31e531 --- /dev/null +++ b/vendor/github.com/docker/docker/client/volume_update.go @@ -0,0 +1,24 @@ +package client // import "github.com/docker/docker/client" + +import ( + "context" + "net/url" + + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/api/types/volume" +) + +// VolumeUpdate updates a volume. This only works for Cluster Volumes, and +// only some fields can be updated. +func (cli *Client) VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error { + if err := cli.NewVersionError("1.42", "volume update"); err != nil { + return err + } + + query := url.Values{} + query.Set("version", version.String()) + + resp, err := cli.put(ctx, "/volumes/"+volumeID, query, options, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/errdefs/http_helpers.go b/vendor/github.com/docker/docker/errdefs/http_helpers.go index 5afe486779..77bda389d1 100644 --- a/vendor/github.com/docker/docker/errdefs/http_helpers.go +++ b/vendor/github.com/docker/docker/errdefs/http_helpers.go @@ -2,14 +2,12 @@ package errdefs // import "github.com/docker/docker/errdefs" import ( "net/http" - - "github.com/sirupsen/logrus" ) // FromStatusCode creates an errdef error, based on the provided HTTP status-code func FromStatusCode(err error, statusCode int) error { if err == nil { - return err + return nil } switch statusCode { case http.StatusNotFound: @@ -33,11 +31,6 @@ func FromStatusCode(err error, statusCode int) error { err = System(err) } default: - logrus.WithError(err).WithFields(logrus.Fields{ - "module": "api", - "status_code": statusCode, - }).Debug("FIXME: Got an status-code for which error does not match any expected type!!!") - switch { case statusCode >= 200 && statusCode < 400: // it's a client error diff --git a/vendor/github.com/docker/docker/pkg/archive/README.md b/vendor/github.com/docker/docker/pkg/archive/README.md deleted file mode 100644 index 7307d9694f..0000000000 --- a/vendor/github.com/docker/docker/pkg/archive/README.md +++ /dev/null @@ -1 +0,0 @@ -This code provides helper functions for dealing with archive files. diff --git a/vendor/github.com/docker/docker/pkg/archive/archive.go b/vendor/github.com/docker/docker/pkg/archive/archive.go index 50b83c62c6..34361a24ac 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive.go @@ -1,3 +1,4 @@ +// Package archive provides helper functions for dealing with archive files. package archive // import "github.com/docker/docker/pkg/archive" import ( @@ -7,10 +8,11 @@ import ( "compress/bzip2" "compress/gzip" "context" + "encoding/binary" "fmt" "io" - "io/ioutil" "os" + "os/exec" "path/filepath" "runtime" "strconv" @@ -18,15 +20,30 @@ import ( "syscall" "time" - "github.com/docker/docker/pkg/fileutils" + "github.com/containerd/containerd/pkg/userns" "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/pools" "github.com/docker/docker/pkg/system" + "github.com/klauspost/compress/zstd" + "github.com/moby/patternmatcher" + "github.com/moby/sys/sequential" + "github.com/pkg/errors" "github.com/sirupsen/logrus" - exec "golang.org/x/sys/execabs" ) +// ImpliedDirectoryMode represents the mode (Unix permissions) applied to directories that are implied by files in a +// tar, but that do not have their own header entry. +// +// The permissions mask is stored in a constant instead of locally to ensure that magic numbers do not +// proliferate in the codebase. The default value 0755 has been selected based on the default umask of 0022, and +// a convention of mkdir(1) calling mkdir(2) with permissions of 0777, resulting in a final value of 0755. +// +// This value is currently implementation-defined, and not captured in any cross-runtime specification. Thus, it is +// subject to change in Moby at any time -- image authors who require consistent or known directory permissions +// should explicitly control them by ensuring that header entries exist for any applicable path. +const ImpliedDirectoryMode = 0755 + type ( // Compression is the state represents if compressed or not. Compression int @@ -39,8 +56,7 @@ type ( ExcludePatterns []string Compression Compression NoLchown bool - UIDMaps []idtools.IDMap - GIDMaps []idtools.IDMap + IDMap idtools.IdentityMapping ChownOpts *idtools.Identity IncludeSourceDir bool // WhiteoutFormat is the expected on disk format for whiteout files. @@ -62,12 +78,12 @@ type ( // mappings for untar, an Archiver can be created with maps which will then be passed to Untar operations. type Archiver struct { Untar func(io.Reader, string, *TarOptions) error - IDMapping *idtools.IdentityMapping + IDMapping idtools.IdentityMapping } // NewDefaultArchiver returns a new Archiver without any IdentityMapping func NewDefaultArchiver() *Archiver { - return &Archiver{Untar: Untar, IDMapping: &idtools.IdentityMapping{}} + return &Archiver{Untar: Untar} } // breakoutError is used to differentiate errors related to breaking out @@ -84,6 +100,8 @@ const ( Gzip // Xz is xz compression algorithm. Xz + // Zstd is zstd compression algorithm. + Zstd ) const ( @@ -94,16 +112,6 @@ const ( OverlayWhiteoutFormat ) -const ( - modeISDIR = 040000 // Directory - modeISFIFO = 010000 // FIFO - modeISREG = 0100000 // Regular file - modeISLNK = 0120000 // Symbolic link - modeISBLK = 060000 // Block special file - modeISCHR = 020000 // Character special file - modeISSOCK = 0140000 // Socket -) - // IsArchivePath checks if the (possibly compressed) file at the given path // starts with a tar file header. func IsArchivePath(path string) bool { @@ -122,18 +130,59 @@ func IsArchivePath(path string) bool { return err == nil } +const ( + zstdMagicSkippableStart = 0x184D2A50 + zstdMagicSkippableMask = 0xFFFFFFF0 +) + +var ( + bzip2Magic = []byte{0x42, 0x5A, 0x68} + gzipMagic = []byte{0x1F, 0x8B, 0x08} + xzMagic = []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00} + zstdMagic = []byte{0x28, 0xb5, 0x2f, 0xfd} +) + +type matcher = func([]byte) bool + +func magicNumberMatcher(m []byte) matcher { + return func(source []byte) bool { + return bytes.HasPrefix(source, m) + } +} + +// zstdMatcher detects zstd compression algorithm. +// Zstandard compressed data is made of one or more frames. +// There are two frame formats defined by Zstandard: Zstandard frames and Skippable frames. +// See https://tools.ietf.org/id/draft-kucherawy-dispatch-zstd-00.html#rfc.section.2 for more details. +func zstdMatcher() matcher { + return func(source []byte) bool { + if bytes.HasPrefix(source, zstdMagic) { + // Zstandard frame + return true + } + // skippable frame + if len(source) < 8 { + return false + } + // magic number from 0x184D2A50 to 0x184D2A5F. + if binary.LittleEndian.Uint32(source[:4])&zstdMagicSkippableMask == zstdMagicSkippableStart { + return true + } + return false + } +} + // DetectCompression detects the compression algorithm of the source. func DetectCompression(source []byte) Compression { - for compression, m := range map[Compression][]byte{ - Bzip2: {0x42, 0x5A, 0x68}, - Gzip: {0x1F, 0x8B, 0x08}, - Xz: {0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}, - } { - if len(source) < len(m) { - logrus.Debug("Len too short") - continue - } - if bytes.Equal(m, source[:len(m)]) { + compressionMap := map[Compression]matcher{ + Bzip2: magicNumberMatcher(bzip2Magic), + Gzip: magicNumberMatcher(gzipMagic), + Xz: magicNumberMatcher(xzMagic), + Zstd: zstdMatcher(), + } + for _, compression := range []Compression{Bzip2, Gzip, Xz, Zstd} { + fn := compressionMap[compression] + if fn(source) { return compression } } @@ -147,20 +196,15 @@ func xzDecompress(ctx context.Context, archive io.Reader) (io.ReadCloser, error) } func gzDecompress(ctx context.Context, buf io.Reader) (io.ReadCloser, error) { - noPigzEnv := os.Getenv("MOBY_DISABLE_PIGZ") - var noPigz bool - - if noPigzEnv != "" { - var err error - noPigz, err = strconv.ParseBool(noPigzEnv) + if noPigzEnv := os.Getenv("MOBY_DISABLE_PIGZ"); noPigzEnv != "" { + noPigz, err := strconv.ParseBool(noPigzEnv) if err != nil { logrus.WithError(err).Warn("invalid value in MOBY_DISABLE_PIGZ env var") } - } - - if noPigz { - logrus.Debugf("Use of pigz is disabled due to MOBY_DISABLE_PIGZ=%s", noPigzEnv) - return gzip.NewReader(buf) + if noPigz { + logrus.Debugf("Use of pigz is disabled due to MOBY_DISABLE_PIGZ=%s", noPigzEnv) + return gzip.NewReader(buf) + } } unpigzPath, err := exec.LookPath("unpigz") @@ -225,6 +269,13 @@ func DecompressStream(archive io.Reader) (io.ReadCloser, error) { } readBufWrapper := p.NewReadCloserWrapper(buf, xzReader) return wrapReadCloser(readBufWrapper, cancel), nil + case Zstd: + zstdReader, err := zstd.NewReader(buf) + if err != nil { + return nil, err + } + readBufWrapper := p.NewReadCloserWrapper(buf, zstdReader) + return readBufWrapper, nil default: return nil, fmt.Errorf("Unsupported compression format %s", (&compression).Extension()) } @@ -278,7 +329,9 @@ func ReplaceFileTarWrapper(inputTarStream io.ReadCloser, mods map[string]TarModi return nil } - header.Name = name + if header.Name == "" { + header.Name = name + } header.Size = int64(len(data)) if err := tarWriter.WriteHeader(header); err != nil { return err @@ -333,7 +386,6 @@ func ReplaceFileTarWrapper(inputTarStream io.ReadCloser, mods map[string]TarModi } pipeWriter.Close() - }() return pipeReader } @@ -349,16 +401,68 @@ func (compression *Compression) Extension() string { return "tar.gz" case Xz: return "tar.xz" + case Zstd: + return "tar.zst" } return "" } +// nosysFileInfo hides the system-dependent info of the wrapped FileInfo to +// prevent tar.FileInfoHeader from introspecting it and potentially calling into +// glibc. +type nosysFileInfo struct { + os.FileInfo +} + +func (fi nosysFileInfo) Sys() interface{} { + // A Sys value of type *tar.Header is safe as it is system-independent. + // The tar.FileInfoHeader function copies the fields into the returned + // header without performing any OS lookups. + if sys, ok := fi.FileInfo.Sys().(*tar.Header); ok { + return sys + } + return nil +} + +// sysStat, if non-nil, populates hdr from system-dependent fields of fi. +var sysStat func(fi os.FileInfo, hdr *tar.Header) error + +// FileInfoHeaderNoLookups creates a partially-populated tar.Header from fi. +// +// Compared to the archive/tar.FileInfoHeader function, this function is safe to +// call from a chrooted process as it does not populate fields which would +// require operating system lookups. It behaves identically to +// tar.FileInfoHeader when fi is a FileInfo value returned from +// tar.Header.FileInfo(). +// +// When fi is a FileInfo for a native file, such as returned from os.Stat() and +// os.Lstat(), the returned Header value differs from one returned from +// tar.FileInfoHeader in the following ways. The Uname and Gname fields are not +// set as OS lookups would be required to populate them. The AccessTime and +// ChangeTime fields are not currently set (not yet implemented) although that +// is subject to change. Callers which require the AccessTime or ChangeTime +// fields to be zeroed should explicitly zero them out in the returned Header +// value to avoid any compatibility issues in the future. +func FileInfoHeaderNoLookups(fi os.FileInfo, link string) (*tar.Header, error) { + hdr, err := tar.FileInfoHeader(nosysFileInfo{fi}, link) + if err != nil { + return nil, err + } + if sysStat != nil { + return hdr, sysStat(fi, hdr) + } + return hdr, nil +} + // FileInfoHeader creates a populated Header from fi. -// Compared to archive pkg this function fills in more information. -// Also, regardless of Go version, this function fills file type bits (e.g. hdr.Mode |= modeISDIR), -// which have been deleted since Go 1.9 archive/tar. +// +// Compared to the archive/tar package, this function fills in less information +// but is safe to call from a chrooted process. The AccessTime and ChangeTime +// fields are not set in the returned header, ModTime is truncated to one-second +// precision, and the Uname and Gname fields are only set when fi is a FileInfo +// value returned from tar.Header.FileInfo(). func FileInfoHeader(name string, fi os.FileInfo, link string) (*tar.Header, error) { - hdr, err := tar.FileInfoHeader(fi, link) + hdr, err := FileInfoHeaderNoLookups(fi, link) if err != nil { return nil, err } @@ -366,39 +470,11 @@ func FileInfoHeader(name string, fi os.FileInfo, link string) (*tar.Header, erro hdr.ModTime = hdr.ModTime.Truncate(time.Second) hdr.AccessTime = time.Time{} hdr.ChangeTime = time.Time{} - hdr.Mode = fillGo18FileTypeBits(int64(chmodTarEntry(os.FileMode(hdr.Mode))), fi) + hdr.Mode = int64(chmodTarEntry(os.FileMode(hdr.Mode))) hdr.Name = canonicalTarName(name, fi.IsDir()) - if err := setHeaderForSpecialDevice(hdr, name, fi.Sys()); err != nil { - return nil, err - } return hdr, nil } -// fillGo18FileTypeBits fills type bits which have been removed on Go 1.9 archive/tar -// https://github.com/golang/go/commit/66b5a2f -func fillGo18FileTypeBits(mode int64, fi os.FileInfo) int64 { - fm := fi.Mode() - switch { - case fm.IsRegular(): - mode |= modeISREG - case fi.IsDir(): - mode |= modeISDIR - case fm&os.ModeSymlink != 0: - mode |= modeISLNK - case fm&os.ModeDevice != 0: - if fm&os.ModeCharDevice != 0 { - mode |= modeISCHR - } else { - mode |= modeISBLK - } - case fm&os.ModeNamedPipe != 0: - mode |= modeISFIFO - case fm&os.ModeSocket != 0: - mode |= modeISSOCK - } - return mode -} - // ReadSecurityXattrToTarHeader reads security.capability xattr from filesystem // to a tar header func ReadSecurityXattrToTarHeader(path string, hdr *tar.Header) error { @@ -435,7 +511,7 @@ type tarAppender struct { // for hardlink mapping SeenFiles map[uint64]string - IdentityMapping *idtools.IdentityMapping + IdentityMapping idtools.IdentityMapping ChownOpts *idtools.Identity // For packing and unpacking whiteout files in the @@ -445,7 +521,7 @@ type tarAppender struct { WhiteoutConverter tarWhiteoutConverter } -func newTarAppender(idMapping *idtools.IdentityMapping, writer io.Writer, chownOpts *idtools.Identity) *tarAppender { +func newTarAppender(idMapping idtools.IdentityMapping, writer io.Writer, chownOpts *idtools.Identity) *tarAppender { return &tarAppender{ SeenFiles: make(map[uint64]string), TarWriter: tar.NewWriter(writer), @@ -455,10 +531,17 @@ func newTarAppender(idMapping *idtools.IdentityMapping, writer io.Writer, chownO } } -// canonicalTarName provides a platform-independent and consistent posix-style +// CanonicalTarNameForPath canonicalizes relativePath to a POSIX-style path using +// forward slashes. It is an alias for filepath.ToSlash, which is a no-op on +// Linux and Unix. +func CanonicalTarNameForPath(relativePath string) string { + return filepath.ToSlash(relativePath) +} + +// canonicalTarName provides a platform-independent and consistent POSIX-style // path for files and directories to be archived regardless of the platform. func canonicalTarName(name string, isDir bool) string { - name = CanonicalTarNameForPath(name) + name = filepath.ToSlash(name) // suffix with '/' for directories if isDir && !strings.HasSuffix(name, "/") { @@ -560,10 +643,9 @@ func (ta *tarAppender) addTarFile(path, name string) error { } if hdr.Typeflag == tar.TypeReg && hdr.Size > 0 { - // We use system.OpenSequential to ensure we use sequential file - // access on Windows to avoid depleting the standby list. - // On Linux, this equates to a regular os.Open. - file, err := system.OpenSequential(path) + // We use sequential file access to avoid depleting the standby list on + // Windows. On Linux, this equates to a regular os.Open. + file, err := sequential.Open(path) if err != nil { return err } @@ -600,11 +682,10 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L } } - case tar.TypeReg, tar.TypeRegA: - // Source is regular file. We use system.OpenFileSequential to use sequential - // file access to avoid depleting the standby list on Windows. - // On Linux, this equates to a regular os.OpenFile - file, err := system.OpenFileSequential(path, os.O_CREATE|os.O_WRONLY, hdrInfo.Mode()) + case tar.TypeReg: + // Source is regular file. We use sequential file access to avoid depleting + // the standby list on Windows. On Linux, this equates to a regular os.OpenFile. + file, err := sequential.OpenFile(path, os.O_CREATE|os.O_WRONLY, hdrInfo.Mode()) if err != nil { return err } @@ -630,6 +711,7 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L } case tar.TypeLink: + // #nosec G305 -- The target path is checked for path traversal. targetPath := filepath.Join(extractDir, hdr.Linkname) // check for hardlink breakout if !strings.HasPrefix(targetPath, extractDir) { @@ -642,7 +724,7 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L case tar.TypeSymlink: // path -> hdr.Linkname = targetPath // e.g. /extractDir/path/to/symlink -> ../2/file = /extractDir/path/2/file - targetPath := filepath.Join(filepath.Dir(path), hdr.Linkname) + targetPath := filepath.Join(filepath.Dir(path), hdr.Linkname) // #nosec G305 -- The target path is checked for path traversal. // the reason we don't need to check symlinks in the path (with FollowSymlinkInScope) is because // that symlink would first have to be created, which would be caught earlier, at this very check: @@ -667,7 +749,11 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L chownOpts = &idtools.Identity{UID: hdr.Uid, GID: hdr.Gid} } if err := os.Lchown(path, chownOpts.UID, chownOpts.GID); err != nil { - return err + msg := "failed to Lchown %q for UID %d, GID %d" + if errors.Is(err, syscall.EINVAL) && userns.RunningInUserNS() { + msg += " (try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid)" + } + return errors.Wrapf(err, msg, path, hdr.Uid, hdr.Gid) } } @@ -686,7 +772,6 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L } return err } - } if len(errors) > 0 { @@ -736,12 +821,30 @@ func Tar(path string, compression Compression) (io.ReadCloser, error) { // TarWithOptions creates an archive from the directory at `path`, only including files whose relative // paths are included in `options.IncludeFiles` (if non-nil) or not in `options.ExcludePatterns`. func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error) { + tb, err := NewTarballer(srcPath, options) + if err != nil { + return nil, err + } + go tb.Do() + return tb.Reader(), nil +} - // Fix the source path to work with long path names. This is a no-op - // on platforms other than Windows. - srcPath = fixVolumePathPrefix(srcPath) +// Tarballer is a lower-level interface to TarWithOptions which gives the caller +// control over which goroutine the archiving operation executes on. +type Tarballer struct { + srcPath string + options *TarOptions + pm *patternmatcher.PatternMatcher + pipeReader *io.PipeReader + pipeWriter *io.PipeWriter + compressWriter io.WriteCloser + whiteoutConverter tarWhiteoutConverter +} - pm, err := fileutils.NewPatternMatcher(options.ExcludePatterns) +// NewTarballer constructs a new tarballer. The arguments are the same as for +// TarWithOptions. +func NewTarballer(srcPath string, options *TarOptions) (*Tarballer, error) { + pm, err := patternmatcher.New(options.ExcludePatterns) if err != nil { return nil, err } @@ -758,159 +861,201 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error) return nil, err } - go func() { - ta := newTarAppender( - idtools.NewIDMappingsFromMaps(options.UIDMaps, options.GIDMaps), - compressWriter, - options.ChownOpts, - ) - ta.WhiteoutConverter = whiteoutConverter - - defer func() { - // Make sure to check the error on Close. - if err := ta.TarWriter.Close(); err != nil { - logrus.Errorf("Can't close tar writer: %s", err) - } - if err := compressWriter.Close(); err != nil { - logrus.Errorf("Can't close compress writer: %s", err) - } - if err := pipeWriter.Close(); err != nil { - logrus.Errorf("Can't close pipe writer: %s", err) - } - }() + return &Tarballer{ + // Fix the source path to work with long path names. This is a no-op + // on platforms other than Windows. + srcPath: fixVolumePathPrefix(srcPath), + options: options, + pm: pm, + pipeReader: pipeReader, + pipeWriter: pipeWriter, + compressWriter: compressWriter, + whiteoutConverter: whiteoutConverter, + }, nil +} - // this buffer is needed for the duration of this piped stream - defer pools.BufioWriter32KPool.Put(ta.Buffer) +// Reader returns the reader for the created archive. +func (t *Tarballer) Reader() io.ReadCloser { + return t.pipeReader +} - // In general we log errors here but ignore them because - // during e.g. a diff operation the container can continue - // mutating the filesystem and we can see transient errors - // from this +// Do performs the archiving operation in the background. The resulting archive +// can be read from t.Reader(). Do should only be called once on each Tarballer +// instance. +func (t *Tarballer) Do() { + ta := newTarAppender( + t.options.IDMap, + t.compressWriter, + t.options.ChownOpts, + ) + ta.WhiteoutConverter = t.whiteoutConverter - stat, err := os.Lstat(srcPath) - if err != nil { - return + defer func() { + // Make sure to check the error on Close. + if err := ta.TarWriter.Close(); err != nil { + logrus.Errorf("Can't close tar writer: %s", err) + } + if err := t.compressWriter.Close(); err != nil { + logrus.Errorf("Can't close compress writer: %s", err) + } + if err := t.pipeWriter.Close(); err != nil { + logrus.Errorf("Can't close pipe writer: %s", err) } + }() - if !stat.IsDir() { - // We can't later join a non-dir with any includes because the - // 'walk' will error if "file/." is stat-ed and "file" is not a - // directory. So, we must split the source path and use the - // basename as the include. - if len(options.IncludeFiles) > 0 { - logrus.Warn("Tar: Can't archive a file with includes") - } + // this buffer is needed for the duration of this piped stream + defer pools.BufioWriter32KPool.Put(ta.Buffer) - dir, base := SplitPathDirEntry(srcPath) - srcPath = dir - options.IncludeFiles = []string{base} - } + // In general we log errors here but ignore them because + // during e.g. a diff operation the container can continue + // mutating the filesystem and we can see transient errors + // from this - if len(options.IncludeFiles) == 0 { - options.IncludeFiles = []string{"."} + stat, err := os.Lstat(t.srcPath) + if err != nil { + return + } + + if !stat.IsDir() { + // We can't later join a non-dir with any includes because the + // 'walk' will error if "file/." is stat-ed and "file" is not a + // directory. So, we must split the source path and use the + // basename as the include. + if len(t.options.IncludeFiles) > 0 { + logrus.Warn("Tar: Can't archive a file with includes") } - seen := make(map[string]bool) + dir, base := SplitPathDirEntry(t.srcPath) + t.srcPath = dir + t.options.IncludeFiles = []string{base} + } - for _, include := range options.IncludeFiles { - rebaseName := options.RebaseNames[include] + if len(t.options.IncludeFiles) == 0 { + t.options.IncludeFiles = []string{"."} + } - walkRoot := getWalkRoot(srcPath, include) - filepath.Walk(walkRoot, func(filePath string, f os.FileInfo, err error) error { - if err != nil { - logrus.Errorf("Tar: Can't stat file %s to tar: %s", srcPath, err) - return nil - } + seen := make(map[string]bool) - relFilePath, err := filepath.Rel(srcPath, filePath) - if err != nil || (!options.IncludeSourceDir && relFilePath == "." && f.IsDir()) { - // Error getting relative path OR we are looking - // at the source directory path. Skip in both situations. - return nil - } + for _, include := range t.options.IncludeFiles { + rebaseName := t.options.RebaseNames[include] - if options.IncludeSourceDir && include == "." && relFilePath != "." { - relFilePath = strings.Join([]string{".", relFilePath}, string(filepath.Separator)) - } + var ( + parentMatchInfo []patternmatcher.MatchInfo + parentDirs []string + ) - skip := false - - // If "include" is an exact match for the current file - // then even if there's an "excludePatterns" pattern that - // matches it, don't skip it. IOW, assume an explicit 'include' - // is asking for that file no matter what - which is true - // for some files, like .dockerignore and Dockerfile (sometimes) - if include != relFilePath { - skip, err = pm.Matches(relFilePath) - if err != nil { - logrus.Errorf("Error matching %s: %v", relFilePath, err) - return err - } - } + walkRoot := getWalkRoot(t.srcPath, include) + filepath.WalkDir(walkRoot, func(filePath string, f os.DirEntry, err error) error { + if err != nil { + logrus.Errorf("Tar: Can't stat file %s to tar: %s", t.srcPath, err) + return nil + } - if skip { - // If we want to skip this file and its a directory - // then we should first check to see if there's an - // excludes pattern (e.g. !dir/file) that starts with this - // dir. If so then we can't skip this dir. + relFilePath, err := filepath.Rel(t.srcPath, filePath) + if err != nil || (!t.options.IncludeSourceDir && relFilePath == "." && f.IsDir()) { + // Error getting relative path OR we are looking + // at the source directory path. Skip in both situations. + return nil + } - // Its not a dir then so we can just return/skip. - if !f.IsDir() { - return nil - } + if t.options.IncludeSourceDir && include == "." && relFilePath != "." { + relFilePath = strings.Join([]string{".", relFilePath}, string(filepath.Separator)) + } - // No exceptions (!...) in patterns so just skip dir - if !pm.Exclusions() { - return filepath.SkipDir + skip := false + + // If "include" is an exact match for the current file + // then even if there's an "excludePatterns" pattern that + // matches it, don't skip it. IOW, assume an explicit 'include' + // is asking for that file no matter what - which is true + // for some files, like .dockerignore and Dockerfile (sometimes) + if include != relFilePath { + for len(parentDirs) != 0 { + lastParentDir := parentDirs[len(parentDirs)-1] + if strings.HasPrefix(relFilePath, lastParentDir+string(os.PathSeparator)) { + break } + parentDirs = parentDirs[:len(parentDirs)-1] + parentMatchInfo = parentMatchInfo[:len(parentMatchInfo)-1] + } - dirSlash := relFilePath + string(filepath.Separator) - - for _, pat := range pm.Patterns() { - if !pat.Exclusion() { - continue - } - if strings.HasPrefix(pat.String()+string(filepath.Separator), dirSlash) { - // found a match - so can't skip this dir - return nil - } - } + var matchInfo patternmatcher.MatchInfo + if len(parentMatchInfo) != 0 { + skip, matchInfo, err = t.pm.MatchesUsingParentResults(relFilePath, parentMatchInfo[len(parentMatchInfo)-1]) + } else { + skip, matchInfo, err = t.pm.MatchesUsingParentResults(relFilePath, patternmatcher.MatchInfo{}) + } + if err != nil { + logrus.Errorf("Error matching %s: %v", relFilePath, err) + return err + } - // No matching exclusion dir so just skip dir - return filepath.SkipDir + if f.IsDir() { + parentDirs = append(parentDirs, relFilePath) + parentMatchInfo = append(parentMatchInfo, matchInfo) } + } + + if skip { + // If we want to skip this file and its a directory + // then we should first check to see if there's an + // excludes pattern (e.g. !dir/file) that starts with this + // dir. If so then we can't skip this dir. - if seen[relFilePath] { + // Its not a dir then so we can just return/skip. + if !f.IsDir() { return nil } - seen[relFilePath] = true - - // Rename the base resource. - if rebaseName != "" { - var replacement string - if rebaseName != string(filepath.Separator) { - // Special case the root directory to replace with an - // empty string instead so that we don't end up with - // double slashes in the paths. - replacement = rebaseName - } - relFilePath = strings.Replace(relFilePath, include, replacement, 1) + // No exceptions (!...) in patterns so just skip dir + if !t.pm.Exclusions() { + return filepath.SkipDir } - if err := ta.addTarFile(filePath, relFilePath); err != nil { - logrus.Errorf("Can't add file %s to tar: %s", filePath, err) - // if pipe is broken, stop writing tar stream to it - if err == io.ErrClosedPipe { - return err + dirSlash := relFilePath + string(filepath.Separator) + + for _, pat := range t.pm.Patterns() { + if !pat.Exclusion() { + continue + } + if strings.HasPrefix(pat.String()+string(filepath.Separator), dirSlash) { + // found a match - so can't skip this dir + return nil } } + + // No matching exclusion dir so just skip dir + return filepath.SkipDir + } + + if seen[relFilePath] { return nil - }) - } - }() + } + seen[relFilePath] = true + + // Rename the base resource. + if rebaseName != "" { + var replacement string + if rebaseName != string(filepath.Separator) { + // Special case the root directory to replace with an + // empty string instead so that we don't end up with + // double slashes in the paths. + replacement = rebaseName + } - return pipeReader, nil + relFilePath = strings.Replace(relFilePath, include, replacement, 1) + } + + if err := ta.addTarFile(filePath, relFilePath); err != nil { + logrus.Errorf("Can't add file %s to tar: %s", filePath, err) + // if pipe is broken, stop writing tar stream to it + if err == io.ErrClosedPipe { + return err + } + } + return nil + }) + } } // Unpack unpacks the decompressedArchive to dest with options. @@ -920,8 +1065,6 @@ func Unpack(decompressedArchive io.Reader, dest string, options *TarOptions) err defer pools.BufioReader32KPool.Put(trBuf) var dirs []*tar.Header - idMapping := idtools.NewIDMappingsFromMaps(options.UIDMaps, options.GIDMaps) - rootIDs := idMapping.RootPair() whiteoutConverter, err := getWhiteoutConverter(options.WhiteoutFormat, options.InUserNS) if err != nil { return err @@ -956,21 +1099,13 @@ loop: } } - // After calling filepath.Clean(hdr.Name) above, hdr.Name will now be in - // the filepath format for the OS on which the daemon is running. Hence - // the check for a slash-suffix MUST be done in an OS-agnostic way. - if !strings.HasSuffix(hdr.Name, string(os.PathSeparator)) { - // Not the root directory, ensure that the parent directory exists - parent := filepath.Dir(hdr.Name) - parentPath := filepath.Join(dest, parent) - if _, err := os.Lstat(parentPath); err != nil && os.IsNotExist(err) { - err = idtools.MkdirAllAndChownNew(parentPath, 0755, rootIDs) - if err != nil { - return err - } - } + // Ensure that the parent directory exists. + err = createImpliedDirectories(dest, hdr, options) + if err != nil { + return err } + // #nosec G305 -- The joined path is checked for path traversal. path := filepath.Join(dest, hdr.Name) rel, err := filepath.Rel(dest, path) if err != nil { @@ -1009,7 +1144,7 @@ loop: } trBuf.Reset(tr) - if err := remapIDs(idMapping, hdr); err != nil { + if err := remapIDs(options.IDMap, hdr); err != nil { return err } @@ -1035,6 +1170,7 @@ loop: } for _, hdr := range dirs { + // #nosec G305 -- The header was checked for path traversal before it was appended to the dirs slice. path := filepath.Join(dest, hdr.Name) if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { @@ -1044,10 +1180,40 @@ loop: return nil } +// createImpliedDirectories will create all parent directories of the current path with default permissions, if they do +// not already exist. This is possible as the tar format supports 'implicit' directories, where their existence is +// defined by the paths of files in the tar, but there are no header entries for the directories themselves, and thus +// we most both create them and choose metadata like permissions. +// +// The caller should have performed filepath.Clean(hdr.Name), so hdr.Name will now be in the filepath format for the OS +// on which the daemon is running. This precondition is required because this function assumes a OS-specific path +// separator when checking that a path is not the root. +func createImpliedDirectories(dest string, hdr *tar.Header, options *TarOptions) error { + // Not the root directory, ensure that the parent directory exists + if !strings.HasSuffix(hdr.Name, string(os.PathSeparator)) { + parent := filepath.Dir(hdr.Name) + parentPath := filepath.Join(dest, parent) + if _, err := os.Lstat(parentPath); err != nil && os.IsNotExist(err) { + // RootPair() is confined inside this loop as most cases will not require a call, so we can spend some + // unneeded function calls in the uncommon case to encapsulate logic -- implied directories are a niche + // usage that reduces the portability of an image. + rootIDs := options.IDMap.RootPair() + + err = idtools.MkdirAllAndChownNew(parentPath, ImpliedDirectoryMode, rootIDs) + if err != nil { + return err + } + } + } + + return nil +} + // Untar reads a stream of bytes from `archive`, parses it as a tar archive, // and unpacks it into the directory at `dest`. // The archive may be compressed with one of the following algorithms: -// identity (uncompressed), gzip, bzip2, xz. +// identity (uncompressed), gzip, bzip2, xz. +// // FIXME: specify behavior when target path exists vs. doesn't exist. func Untar(tarArchive io.Reader, dest string, options *TarOptions) error { return untarHandler(tarArchive, dest, options, true) @@ -1089,15 +1255,13 @@ func untarHandler(tarArchive io.Reader, dest string, options *TarOptions, decomp // TarUntar is a convenience function which calls Tar and Untar, with the output of one piped into the other. // If either Tar or Untar fails, TarUntar aborts and returns the error. func (archiver *Archiver) TarUntar(src, dst string) error { - logrus.Debugf("TarUntar(%s %s)", src, dst) archive, err := TarWithOptions(src, &TarOptions{Compression: Uncompressed}) if err != nil { return err } defer archive.Close() options := &TarOptions{ - UIDMaps: archiver.IDMapping.UIDs(), - GIDMaps: archiver.IDMapping.GIDs(), + IDMap: archiver.IDMapping, } return archiver.Untar(archive, dst, options) } @@ -1110,8 +1274,7 @@ func (archiver *Archiver) UntarPath(src, dst string) error { } defer archive.Close() options := &TarOptions{ - UIDMaps: archiver.IDMapping.UIDs(), - GIDMaps: archiver.IDMapping.GIDs(), + IDMap: archiver.IDMapping, } return archiver.Untar(archive, dst, options) } @@ -1134,11 +1297,9 @@ func (archiver *Archiver) CopyWithTar(src, dst string) error { // as owner rootIDs := archiver.IDMapping.RootPair() // Create dst, copy src's content into it - logrus.Debugf("Creating dest directory: %s", dst) if err := idtools.MkdirAllAndChownNew(dst, 0755, rootIDs); err != nil { return err } - logrus.Debugf("Calling TarUntar(%s, %s)", src, dst) return archiver.TarUntar(src, dst) } @@ -1146,7 +1307,6 @@ func (archiver *Archiver) CopyWithTar(src, dst string) error { // for a single file. It copies a regular file from path `src` to // path `dst`, and preserves all its metadata. func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { - logrus.Debugf("CopyFileWithTar(%s, %s)", src, dst) srcSt, err := os.Stat(src) if err != nil { return err @@ -1181,7 +1341,7 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { } defer srcF.Close() - hdr, err := tar.FileInfoHeader(srcSt, "") + hdr, err := FileInfoHeaderNoLookups(srcSt, "") if err != nil { return err } @@ -1221,11 +1381,11 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { } // IdentityMapping returns the IdentityMapping of the archiver. -func (archiver *Archiver) IdentityMapping() *idtools.IdentityMapping { +func (archiver *Archiver) IdentityMapping() idtools.IdentityMapping { return archiver.IDMapping } -func remapIDs(idMapping *idtools.IdentityMapping, hdr *tar.Header) error { +func remapIDs(idMapping idtools.IdentityMapping, hdr *tar.Header) error { ids, err := idMapping.ToHost(idtools.Identity{UID: hdr.Uid, GID: hdr.Gid}) hdr.Uid, hdr.Gid = ids.UID, ids.GID return err @@ -1272,7 +1432,7 @@ func cmdStream(cmd *exec.Cmd, input io.Reader) (io.ReadCloser, error) { // of that file as an archive. The archive can only be read once - as soon as reading completes, // the file will be deleted. func NewTempArchive(src io.Reader, dir string) (*TempArchive, error) { - f, err := ioutil.TempFile(dir, "") + f, err := os.CreateTemp(dir, "") if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_linux.go b/vendor/github.com/docker/docker/pkg/archive/archive_linux.go index 0a3cc1f92b..76321a35e3 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_linux.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_linux.go @@ -59,7 +59,7 @@ func (overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi os Gname: hdr.Gname, AccessTime: hdr.AccessTime, ChangeTime: hdr.ChangeTime, - } + } //#nosec G305 -- An archive is being created, not extracted. } } diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go b/vendor/github.com/docker/docker/pkg/archive/archive_unix.go index fea53d3ae2..92d8e23dd0 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_unix.go @@ -11,12 +11,16 @@ import ( "strings" "syscall" - "github.com/containerd/containerd/sys" + "github.com/containerd/containerd/pkg/userns" "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/system" "golang.org/x/sys/unix" ) +func init() { + sysStat = statUnix +} + // fixVolumePathPrefix does platform specific processing to ensure that if // the path being passed in is not in a volume path format, convert it to one. func fixVolumePathPrefix(srcPath string) string { @@ -31,33 +35,30 @@ func getWalkRoot(srcPath string, include string) string { return strings.TrimSuffix(srcPath, string(filepath.Separator)) + string(filepath.Separator) + include } -// CanonicalTarNameForPath returns platform-specific filepath -// to canonical posix-style path for tar archival. p is relative -// path. -func CanonicalTarNameForPath(p string) string { - return p // already unix-style -} - // chmodTarEntry is used to adjust the file permissions used in tar header based // on the platform the archival is done. - func chmodTarEntry(perm os.FileMode) os.FileMode { return perm // noop for unix as golang APIs provide perm bits correctly } -func setHeaderForSpecialDevice(hdr *tar.Header, name string, stat interface{}) (err error) { - s, ok := stat.(*syscall.Stat_t) +// statUnix populates hdr from system-dependent fields of fi without performing +// any OS lookups. +func statUnix(fi os.FileInfo, hdr *tar.Header) error { + s, ok := fi.Sys().(*syscall.Stat_t) + if !ok { + return nil + } - if ok { - // Currently go does not fill in the major/minors - if s.Mode&unix.S_IFBLK != 0 || - s.Mode&unix.S_IFCHR != 0 { - hdr.Devmajor = int64(unix.Major(uint64(s.Rdev))) //nolint: unconvert - hdr.Devminor = int64(unix.Minor(uint64(s.Rdev))) //nolint: unconvert - } + hdr.Uid = int(s.Uid) + hdr.Gid = int(s.Gid) + + if s.Mode&unix.S_IFBLK != 0 || + s.Mode&unix.S_IFCHR != 0 { + hdr.Devmajor = int64(unix.Major(uint64(s.Rdev))) //nolint: unconvert + hdr.Devminor = int64(unix.Minor(uint64(s.Rdev))) //nolint: unconvert } - return + return nil } func getInodeFromStat(stat interface{}) (inode uint64, err error) { @@ -93,7 +94,7 @@ func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { } err := system.Mknod(path, mode, int(system.Mkdev(hdr.Devmajor, hdr.Devminor))) - if errors.Is(err, syscall.EPERM) && sys.RunningInUserNS() { + if errors.Is(err, syscall.EPERM) && userns.RunningInUserNS() { // In most cases, cannot create a device if running in user namespace err = nil } diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go b/vendor/github.com/docker/docker/pkg/archive/archive_windows.go index 7260174bfb..09a25832e8 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_windows.go @@ -21,24 +21,14 @@ func getWalkRoot(srcPath string, include string) string { return filepath.Join(srcPath, include) } -// CanonicalTarNameForPath returns platform-specific filepath -// to canonical posix-style path for tar archival. p is relative -// path. -func CanonicalTarNameForPath(p string) string { - return filepath.ToSlash(p) -} - // chmodTarEntry is used to adjust the file permissions used in tar header based // on the platform the archival is done. func chmodTarEntry(perm os.FileMode) os.FileMode { - // perm &= 0755 // this 0-ed out tar flags (like link, regular file, directory marker etc.) - permPart := perm & os.ModePerm - noPermPart := perm &^ os.ModePerm - // Add the x bit: make everything +x from windows - permPart |= 0111 - permPart &= 0755 + // Remove group- and world-writable bits. + perm &= 0o755 - return noPermPart | permPart + // Add the x bit: make everything +x on Windows + return perm | 0o111 } func setHeaderForSpecialDevice(hdr *tar.Header, name string, stat interface{}) (err error) { diff --git a/vendor/github.com/docker/docker/pkg/archive/changes.go b/vendor/github.com/docker/docker/pkg/archive/changes.go index aedb91b035..7f7242be50 100644 --- a/vendor/github.com/docker/docker/pkg/archive/changes.go +++ b/vendor/github.com/docker/docker/pkg/archive/changes.go @@ -5,7 +5,6 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "os" "path/filepath" "sort" @@ -247,7 +246,6 @@ func (info *FileInfo) path() string { } func (info *FileInfo) addChanges(oldInfo *FileInfo, changes *[]Change) { - sizeAtEntry := len(*changes) if oldInfo == nil { @@ -320,7 +318,6 @@ func (info *FileInfo) addChanges(oldInfo *FileInfo, changes *[]Change) { copy((*changes)[sizeAtEntry+1:], (*changes)[sizeAtEntry:]) (*changes)[sizeAtEntry] = change } - } // Changes add changes to file information. @@ -348,7 +345,7 @@ func ChangesDirs(newDir, oldDir string) ([]Change, error) { oldRoot, newRoot *FileInfo ) if oldDir == "" { - emptyDir, err := ioutil.TempDir("", "empty") + emptyDir, err := os.MkdirTemp("", "empty") if err != nil { return nil, err } @@ -395,10 +392,10 @@ func ChangesSize(newDir string, changes []Change) int64 { } // ExportChanges produces an Archive from the provided changes, relative to dir. -func ExportChanges(dir string, changes []Change, uidMaps, gidMaps []idtools.IDMap) (io.ReadCloser, error) { +func ExportChanges(dir string, changes []Change, idMap idtools.IdentityMapping) (io.ReadCloser, error) { reader, writer := io.Pipe() go func() { - ta := newTarAppender(idtools.NewIDMappingsFromMaps(uidMaps, gidMaps), writer, nil) + ta := newTarAppender(idMap, writer, nil) // this buffer is needed for the duration of this piped stream defer pools.BufioWriter32KPool.Put(ta.Buffer) diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_other.go b/vendor/github.com/docker/docker/pkg/archive/changes_other.go index 0e4399a43b..833798bd11 100644 --- a/vendor/github.com/docker/docker/pkg/archive/changes_other.go +++ b/vendor/github.com/docker/docker/pkg/archive/changes_other.go @@ -41,7 +41,7 @@ func collectFileInfoForChanges(oldDir, newDir string) (*FileInfo, *FileInfo, err func collectFileInfo(sourceDir string) (*FileInfo, error) { root := newRootFileInfo() - err := filepath.Walk(sourceDir, func(path string, f os.FileInfo, err error) error { + err := filepath.WalkDir(sourceDir, func(path string, _ os.DirEntry, err error) error { if err != nil { return err } diff --git a/vendor/github.com/docker/docker/pkg/archive/copy.go b/vendor/github.com/docker/docker/pkg/archive/copy.go index 4b9f504d7d..0ea1596278 100644 --- a/vendor/github.com/docker/docker/pkg/archive/copy.go +++ b/vendor/github.com/docker/docker/pkg/archive/copy.go @@ -4,7 +4,6 @@ import ( "archive/tar" "errors" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -27,23 +26,23 @@ var ( // path (from before being processed by utility functions from the path or // filepath stdlib packages) ends with a trailing `/.` or `/`. If the cleaned // path already ends in a `.` path segment, then another is not added. If the -// clean path already ends in the separator, then another is not added. -func PreserveTrailingDotOrSeparator(cleanedPath string, originalPath string, sep byte) string { +// clean path already ends in a path separator, then another is not added. +func PreserveTrailingDotOrSeparator(cleanedPath string, originalPath string) string { // Ensure paths are in platform semantics - cleanedPath = strings.Replace(cleanedPath, "/", string(sep), -1) - originalPath = strings.Replace(originalPath, "/", string(sep), -1) + cleanedPath = normalizePath(cleanedPath) + originalPath = normalizePath(originalPath) if !specifiesCurrentDir(cleanedPath) && specifiesCurrentDir(originalPath) { - if !hasTrailingPathSeparator(cleanedPath, sep) { + if !hasTrailingPathSeparator(cleanedPath) { // Add a separator if it doesn't already end with one (a cleaned // path would only end in a separator if it is the root). - cleanedPath += string(sep) + cleanedPath += string(filepath.Separator) } cleanedPath += "." } - if !hasTrailingPathSeparator(cleanedPath, sep) && hasTrailingPathSeparator(originalPath, sep) { - cleanedPath += string(sep) + if !hasTrailingPathSeparator(cleanedPath) && hasTrailingPathSeparator(originalPath) { + cleanedPath += string(filepath.Separator) } return cleanedPath @@ -52,14 +51,14 @@ func PreserveTrailingDotOrSeparator(cleanedPath string, originalPath string, sep // assertsDirectory returns whether the given path is // asserted to be a directory, i.e., the path ends with // a trailing '/' or `/.`, assuming a path separator of `/`. -func assertsDirectory(path string, sep byte) bool { - return hasTrailingPathSeparator(path, sep) || specifiesCurrentDir(path) +func assertsDirectory(path string) bool { + return hasTrailingPathSeparator(path) || specifiesCurrentDir(path) } // hasTrailingPathSeparator returns whether the given // path ends with the system's path separator character. -func hasTrailingPathSeparator(path string, sep byte) bool { - return len(path) > 0 && path[len(path)-1] == sep +func hasTrailingPathSeparator(path string) bool { + return len(path) > 0 && path[len(path)-1] == filepath.Separator } // specifiesCurrentDir returns whether the given path specifies @@ -261,7 +260,7 @@ func PrepareArchiveCopy(srcContent io.Reader, srcInfo, dstInfo CopyInfo) (dstDir // The destination exists as a directory. No alteration // to srcContent is needed as its contents can be // simply extracted to the destination directory. - return dstInfo.Path, ioutil.NopCloser(srcContent), nil + return dstInfo.Path, io.NopCloser(srcContent), nil case dstInfo.Exists && srcInfo.IsDir: // The destination exists as some type of file and the source // content is a directory. This is an error condition since @@ -286,7 +285,7 @@ func PrepareArchiveCopy(srcContent io.Reader, srcInfo, dstInfo CopyInfo) (dstDir srcBase = srcInfo.RebaseName } return dstDir, RebaseArchiveEntries(srcContent, srcBase, dstBase), nil - case assertsDirectory(dstInfo.Path, os.PathSeparator): + case assertsDirectory(dstInfo.Path): // The destination does not exist and is asserted to be created as a // directory, but the source content is not a directory. This is an // error condition since you cannot create a directory from a file @@ -304,7 +303,6 @@ func PrepareArchiveCopy(srcContent io.Reader, srcInfo, dstInfo CopyInfo) (dstDir } return dstDir, RebaseArchiveEntries(srcContent, srcBase, dstBase), nil } - } // RebaseArchiveEntries rewrites the given srcContent archive replacing @@ -374,9 +372,6 @@ func RebaseArchiveEntries(srcContent io.Reader, oldBase, newBase string) io.Read return rebased } -// TODO @gupta-ak. These might have to be changed in the future to be -// continuity driver aware as well to support LCOW. - // CopyResource performs an archive copy from the given source path to the // given destination path. The source path MUST exist and the destination // path's parent directory must exist. @@ -391,8 +386,8 @@ func CopyResource(srcPath, dstPath string, followLink bool) error { dstPath = normalizePath(dstPath) // Clean the source and destination paths. - srcPath = PreserveTrailingDotOrSeparator(filepath.Clean(srcPath), srcPath, os.PathSeparator) - dstPath = PreserveTrailingDotOrSeparator(filepath.Clean(dstPath), dstPath, os.PathSeparator) + srcPath = PreserveTrailingDotOrSeparator(filepath.Clean(srcPath), srcPath) + dstPath = PreserveTrailingDotOrSeparator(filepath.Clean(dstPath), dstPath) if srcInfo, err = CopyInfoSourcePath(srcPath, followLink); err != nil { return err @@ -455,7 +450,7 @@ func ResolveHostSourcePath(path string, followLink bool) (resolvedPath, rebaseNa // resolvedDirPath will have been cleaned (no trailing path separators) so // we can manually join it with the base path element. resolvedPath = resolvedDirPath + string(filepath.Separator) + basePath - if hasTrailingPathSeparator(path, os.PathSeparator) && + if hasTrailingPathSeparator(path) && filepath.Base(path) != filepath.Base(resolvedPath) { rebaseName = filepath.Base(path) } @@ -474,8 +469,8 @@ func GetRebaseName(path, resolvedPath string) (string, string) { resolvedPath += string(filepath.Separator) + "." } - if hasTrailingPathSeparator(path, os.PathSeparator) && - !hasTrailingPathSeparator(resolvedPath, os.PathSeparator) { + if hasTrailingPathSeparator(path) && + !hasTrailingPathSeparator(resolvedPath) { resolvedPath += string(filepath.Separator) } diff --git a/vendor/github.com/docker/docker/pkg/archive/diff.go b/vendor/github.com/docker/docker/pkg/archive/diff.go index 27897e6ab7..c8c7be7479 100644 --- a/vendor/github.com/docker/docker/pkg/archive/diff.go +++ b/vendor/github.com/docker/docker/pkg/archive/diff.go @@ -4,13 +4,11 @@ import ( "archive/tar" "fmt" "io" - "io/ioutil" "os" "path/filepath" "runtime" "strings" - "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/pools" "github.com/docker/docker/pkg/system" "github.com/sirupsen/logrus" @@ -33,7 +31,6 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, if options.ExcludePatterns == nil { options.ExcludePatterns = []string{} } - idMapping := idtools.NewIDMappingsFromMaps(options.UIDMaps, options.GIDMaps) aufsTempdir := "" aufsHardlinks := make(map[string]*tar.Header) @@ -75,20 +72,10 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, } } - // Note as these operations are platform specific, so must the slash be. - if !strings.HasSuffix(hdr.Name, string(os.PathSeparator)) { - // Not the root directory, ensure that the parent directory exists. - // This happened in some tests where an image had a tarfile without any - // parent directories. - parent := filepath.Dir(hdr.Name) - parentPath := filepath.Join(dest, parent) - - if _, err := os.Lstat(parentPath); err != nil && os.IsNotExist(err) { - err = system.MkdirAll(parentPath, 0600) - if err != nil { - return 0, err - } - } + // Ensure that the parent directory exists. + err = createImpliedDirectories(dest, hdr, options) + if err != nil { + return 0, err } // Skip AUFS metadata dirs @@ -100,7 +87,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, basename := filepath.Base(hdr.Name) aufsHardlinks[basename] = hdr if aufsTempdir == "" { - if aufsTempdir, err = ioutil.TempDir("", "dockerplnk"); err != nil { + if aufsTempdir, err = os.MkdirTemp(dest, "dockerplnk"); err != nil { return 0, err } defer os.RemoveAll(aufsTempdir) @@ -114,6 +101,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, continue } } + //#nosec G305 -- The joined path is guarded against path traversal. path := filepath.Join(dest, hdr.Name) rel, err := filepath.Rel(dest, path) if err != nil { @@ -133,7 +121,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, if err != nil { return 0, err } - err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + err = filepath.WalkDir(dir, func(path string, info os.DirEntry, err error) error { if err != nil { if os.IsNotExist(err) { err = nil // parent was deleted @@ -144,8 +132,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, return nil } if _, exists := unpackedPaths[path]; !exists { - err := os.RemoveAll(path) - return err + return os.RemoveAll(path) } return nil }) @@ -192,7 +179,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, srcData = tmpFile } - if err := remapIDs(idMapping, srcHdr); err != nil { + if err := remapIDs(options.IDMap, srcHdr); err != nil { return 0, err } @@ -210,6 +197,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, } for _, hdr := range dirs { + //#nosec G305 -- The header was checked for path traversal before it was appended to the dirs slice. path := filepath.Join(dest, hdr.Name) if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { return 0, err @@ -240,13 +228,8 @@ func applyLayerHandler(dest string, layer io.Reader, options *TarOptions, decomp dest = filepath.Clean(dest) // We need to be able to set any perms - if runtime.GOOS != "windows" { - oldmask, err := system.Umask(0) - if err != nil { - return 0, err - } - defer system.Umask(oldmask) - } + restore := overrideUmask(0) + defer restore() if decompress { decompLayer, err := DecompressStream(layer) diff --git a/vendor/github.com/docker/docker/pkg/archive/diff_unix.go b/vendor/github.com/docker/docker/pkg/archive/diff_unix.go new file mode 100644 index 0000000000..d7f806445e --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/archive/diff_unix.go @@ -0,0 +1,22 @@ +//go:build !windows +// +build !windows + +package archive + +import "golang.org/x/sys/unix" + +// overrideUmask sets current process's file mode creation mask to newmask +// and returns a function to restore it. +// +// WARNING for readers stumbling upon this code. Changing umask in a multi- +// threaded environment isn't safe. Don't use this without understanding the +// risks, and don't export this function for others to use (we shouldn't even +// be using this ourself). +// +// FIXME(thaJeztah): we should get rid of these hacks if possible. +func overrideUmask(newMask int) func() { + oldMask := unix.Umask(newMask) + return func() { + unix.Umask(oldMask) + } +} diff --git a/vendor/github.com/docker/docker/pkg/archive/diff_windows.go b/vendor/github.com/docker/docker/pkg/archive/diff_windows.go new file mode 100644 index 0000000000..d28f5b2dfd --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/archive/diff_windows.go @@ -0,0 +1,6 @@ +package archive + +// overrideUmask is a no-op on windows. +func overrideUmask(newmask int) func() { + return func() {} +} diff --git a/vendor/github.com/docker/docker/pkg/archive/path.go b/vendor/github.com/docker/docker/pkg/archive/path.go new file mode 100644 index 0000000000..888a697581 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/archive/path.go @@ -0,0 +1,20 @@ +package archive + +// CheckSystemDriveAndRemoveDriveLetter verifies that a path, if it includes a drive letter, +// is the system drive. +// On Linux: this is a no-op. +// On Windows: this does the following> +// CheckSystemDriveAndRemoveDriveLetter verifies and manipulates a Windows path. +// This is used, for example, when validating a user provided path in docker cp. +// If a drive letter is supplied, it must be the system drive. The drive letter +// is always removed. Also, it translates it to OS semantics (IOW / to \). We +// need the path in this syntax so that it can ultimately be concatenated with +// a Windows long-path which doesn't support drive-letters. Examples: +// C: --> Fail +// C:\ --> \ +// a --> a +// /a --> \a +// d:\ --> Fail +func CheckSystemDriveAndRemoveDriveLetter(path string) (string, error) { + return checkSystemDriveAndRemoveDriveLetter(path) +} diff --git a/vendor/github.com/docker/docker/pkg/archive/path_unix.go b/vendor/github.com/docker/docker/pkg/archive/path_unix.go new file mode 100644 index 0000000000..0b135aea75 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/archive/path_unix.go @@ -0,0 +1,10 @@ +//go:build !windows +// +build !windows + +package archive + +// checkSystemDriveAndRemoveDriveLetter is the non-Windows implementation +// of CheckSystemDriveAndRemoveDriveLetter +func checkSystemDriveAndRemoveDriveLetter(path string) (string, error) { + return path, nil +} diff --git a/vendor/github.com/docker/docker/pkg/archive/path_windows.go b/vendor/github.com/docker/docker/pkg/archive/path_windows.go new file mode 100644 index 0000000000..7e18c8e449 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/archive/path_windows.go @@ -0,0 +1,22 @@ +package archive + +import ( + "fmt" + "path/filepath" + "strings" +) + +// checkSystemDriveAndRemoveDriveLetter is the Windows implementation +// of CheckSystemDriveAndRemoveDriveLetter +func checkSystemDriveAndRemoveDriveLetter(path string) (string, error) { + if len(path) == 2 && string(path[1]) == ":" { + return "", fmt.Errorf("no relative path specified in %q", path) + } + if !filepath.IsAbs(path) || len(path) < 2 { + return filepath.FromSlash(path), nil + } + if string(path[1]) == ":" && !strings.EqualFold(string(path[0]), "c") { + return "", fmt.Errorf("the specified path is not on the system drive (C:)") + } + return filepath.FromSlash(path[2:]), nil +} diff --git a/vendor/github.com/docker/docker/pkg/archive/wrap.go b/vendor/github.com/docker/docker/pkg/archive/wrap.go index 85435694cf..032db82cea 100644 --- a/vendor/github.com/docker/docker/pkg/archive/wrap.go +++ b/vendor/github.com/docker/docker/pkg/archive/wrap.go @@ -17,8 +17,8 @@ import ( // Generate("foo.txt", "hello world", "emptyfile") // // The above call will return an archive with 2 files: -// * ./foo.txt with content "hello world" -// * ./empty with empty content +// - ./foo.txt with content "hello world" +// - ./empty with empty content // // FIXME: stream content instead of buffering // FIXME: specify permissions and other archive metadata diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go deleted file mode 100644 index 34f1c726fb..0000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go +++ /dev/null @@ -1,298 +0,0 @@ -package fileutils // import "github.com/docker/docker/pkg/fileutils" - -import ( - "errors" - "fmt" - "io" - "os" - "path/filepath" - "regexp" - "strings" - "text/scanner" - - "github.com/sirupsen/logrus" -) - -// PatternMatcher allows checking paths against a list of patterns -type PatternMatcher struct { - patterns []*Pattern - exclusions bool -} - -// NewPatternMatcher creates a new matcher object for specific patterns that can -// be used later to match against patterns against paths -func NewPatternMatcher(patterns []string) (*PatternMatcher, error) { - pm := &PatternMatcher{ - patterns: make([]*Pattern, 0, len(patterns)), - } - for _, p := range patterns { - // Eliminate leading and trailing whitespace. - p = strings.TrimSpace(p) - if p == "" { - continue - } - p = filepath.Clean(p) - newp := &Pattern{} - if p[0] == '!' { - if len(p) == 1 { - return nil, errors.New("illegal exclusion pattern: \"!\"") - } - newp.exclusion = true - p = p[1:] - pm.exclusions = true - } - // Do some syntax checking on the pattern. - // filepath's Match() has some really weird rules that are inconsistent - // so instead of trying to dup their logic, just call Match() for its - // error state and if there is an error in the pattern return it. - // If this becomes an issue we can remove this since its really only - // needed in the error (syntax) case - which isn't really critical. - if _, err := filepath.Match(p, "."); err != nil { - return nil, err - } - newp.cleanedPattern = p - newp.dirs = strings.Split(p, string(os.PathSeparator)) - pm.patterns = append(pm.patterns, newp) - } - return pm, nil -} - -// Matches matches path against all the patterns. Matches is not safe to be -// called concurrently -func (pm *PatternMatcher) Matches(file string) (bool, error) { - matched := false - file = filepath.FromSlash(file) - parentPath := filepath.Dir(file) - parentPathDirs := strings.Split(parentPath, string(os.PathSeparator)) - - for _, pattern := range pm.patterns { - negative := false - - if pattern.exclusion { - negative = true - } - - match, err := pattern.match(file) - if err != nil { - return false, err - } - - if !match && parentPath != "." { - // Check to see if the pattern matches one of our parent dirs. - if len(pattern.dirs) <= len(parentPathDirs) { - match, _ = pattern.match(strings.Join(parentPathDirs[:len(pattern.dirs)], string(os.PathSeparator))) - } - } - - if match { - matched = !negative - } - } - - if matched { - logrus.Debugf("Skipping excluded path: %s", file) - } - - return matched, nil -} - -// Exclusions returns true if any of the patterns define exclusions -func (pm *PatternMatcher) Exclusions() bool { - return pm.exclusions -} - -// Patterns returns array of active patterns -func (pm *PatternMatcher) Patterns() []*Pattern { - return pm.patterns -} - -// Pattern defines a single regexp used to filter file paths. -type Pattern struct { - cleanedPattern string - dirs []string - regexp *regexp.Regexp - exclusion bool -} - -func (p *Pattern) String() string { - return p.cleanedPattern -} - -// Exclusion returns true if this pattern defines exclusion -func (p *Pattern) Exclusion() bool { - return p.exclusion -} - -func (p *Pattern) match(path string) (bool, error) { - - if p.regexp == nil { - if err := p.compile(); err != nil { - return false, filepath.ErrBadPattern - } - } - - b := p.regexp.MatchString(path) - - return b, nil -} - -func (p *Pattern) compile() error { - regStr := "^" - pattern := p.cleanedPattern - // Go through the pattern and convert it to a regexp. - // We use a scanner so we can support utf-8 chars. - var scan scanner.Scanner - scan.Init(strings.NewReader(pattern)) - - sl := string(os.PathSeparator) - escSL := sl - if sl == `\` { - escSL += `\` - } - - for scan.Peek() != scanner.EOF { - ch := scan.Next() - - if ch == '*' { - if scan.Peek() == '*' { - // is some flavor of "**" - scan.Next() - - // Treat **/ as ** so eat the "/" - if string(scan.Peek()) == sl { - scan.Next() - } - - if scan.Peek() == scanner.EOF { - // is "**EOF" - to align with .gitignore just accept all - regStr += ".*" - } else { - // is "**" - // Note that this allows for any # of /'s (even 0) because - // the .* will eat everything, even /'s - regStr += "(.*" + escSL + ")?" - } - } else { - // is "*" so map it to anything but "/" - regStr += "[^" + escSL + "]*" - } - } else if ch == '?' { - // "?" is any char except "/" - regStr += "[^" + escSL + "]" - } else if ch == '.' || ch == '$' { - // Escape some regexp special chars that have no meaning - // in golang's filepath.Match - regStr += `\` + string(ch) - } else if ch == '\\' { - // escape next char. Note that a trailing \ in the pattern - // will be left alone (but need to escape it) - if sl == `\` { - // On windows map "\" to "\\", meaning an escaped backslash, - // and then just continue because filepath.Match on - // Windows doesn't allow escaping at all - regStr += escSL - continue - } - if scan.Peek() != scanner.EOF { - regStr += `\` + string(scan.Next()) - } else { - regStr += `\` - } - } else { - regStr += string(ch) - } - } - - regStr += "$" - - re, err := regexp.Compile(regStr) - if err != nil { - return err - } - - p.regexp = re - return nil -} - -// Matches returns true if file matches any of the patterns -// and isn't excluded by any of the subsequent patterns. -func Matches(file string, patterns []string) (bool, error) { - pm, err := NewPatternMatcher(patterns) - if err != nil { - return false, err - } - file = filepath.Clean(file) - - if file == "." { - // Don't let them exclude everything, kind of silly. - return false, nil - } - - return pm.Matches(file) -} - -// CopyFile copies from src to dst until either EOF is reached -// on src or an error occurs. It verifies src exists and removes -// the dst if it exists. -func CopyFile(src, dst string) (int64, error) { - cleanSrc := filepath.Clean(src) - cleanDst := filepath.Clean(dst) - if cleanSrc == cleanDst { - return 0, nil - } - sf, err := os.Open(cleanSrc) - if err != nil { - return 0, err - } - defer sf.Close() - if err := os.Remove(cleanDst); err != nil && !os.IsNotExist(err) { - return 0, err - } - df, err := os.Create(cleanDst) - if err != nil { - return 0, err - } - defer df.Close() - return io.Copy(df, sf) -} - -// ReadSymlinkedDirectory returns the target directory of a symlink. -// The target of the symbolic link may not be a file. -func ReadSymlinkedDirectory(path string) (string, error) { - var realPath string - var err error - if realPath, err = filepath.Abs(path); err != nil { - return "", fmt.Errorf("unable to get absolute path for %s: %s", path, err) - } - if realPath, err = filepath.EvalSymlinks(realPath); err != nil { - return "", fmt.Errorf("failed to canonicalise path for %s: %s", path, err) - } - realPathInfo, err := os.Stat(realPath) - if err != nil { - return "", fmt.Errorf("failed to stat target '%s' of '%s': %s", realPath, path, err) - } - if !realPathInfo.Mode().IsDir() { - return "", fmt.Errorf("canonical path points to a file '%s'", realPath) - } - return realPath, nil -} - -// CreateIfNotExists creates a file or a directory only if it does not already exist. -func CreateIfNotExists(path string, isDir bool) error { - if _, err := os.Stat(path); err != nil { - if os.IsNotExist(err) { - if isDir { - return os.MkdirAll(path, 0755) - } - if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { - return err - } - f, err := os.OpenFile(path, os.O_CREATE, 0755) - if err != nil { - return err - } - f.Close() - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_darwin.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_darwin.go deleted file mode 100644 index e40cc271b3..0000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_darwin.go +++ /dev/null @@ -1,27 +0,0 @@ -package fileutils // import "github.com/docker/docker/pkg/fileutils" - -import ( - "os" - "os/exec" - "strconv" - "strings" -) - -// GetTotalUsedFds returns the number of used File Descriptors by -// executing `lsof -p PID` -func GetTotalUsedFds() int { - pid := os.Getpid() - - cmd := exec.Command("lsof", "-p", strconv.Itoa(pid)) - - output, err := cmd.CombinedOutput() - if err != nil { - return -1 - } - - outputStr := strings.TrimSpace(string(output)) - - fds := strings.Split(outputStr, "\n") - - return len(fds) - 1 -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go deleted file mode 100644 index af0c26b614..0000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build linux || freebsd -// +build linux freebsd - -package fileutils // import "github.com/docker/docker/pkg/fileutils" - -import ( - "fmt" - "io/ioutil" - "os" - - "github.com/sirupsen/logrus" -) - -// GetTotalUsedFds Returns the number of used File Descriptors by -// reading it via /proc filesystem. -func GetTotalUsedFds() int { - if fds, err := ioutil.ReadDir(fmt.Sprintf("/proc/%d/fd", os.Getpid())); err != nil { - logrus.Errorf("Error opening /proc/%d/fd: %s", os.Getpid(), err) - } else { - return len(fds) - } - return -1 -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go deleted file mode 100644 index 3f1ebb6567..0000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -package fileutils // import "github.com/docker/docker/pkg/fileutils" - -// GetTotalUsedFds Returns the number of used File Descriptors. Not supported -// on Windows. -func GetTotalUsedFds() int { - return -1 -} diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go index 5e6310fdcd..ded1c7c8c6 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go @@ -64,13 +64,14 @@ func stick(f string) error { // GetDataHome returns XDG_DATA_HOME. // GetDataHome returns $HOME/.local/share and nil error if XDG_DATA_HOME is not set. +// If HOME and XDG_DATA_HOME are not set, getpwent(3) is consulted to determine the users home directory. // // See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html func GetDataHome() (string, error) { if xdgDataHome := os.Getenv("XDG_DATA_HOME"); xdgDataHome != "" { return xdgDataHome, nil } - home := os.Getenv("HOME") + home := Get() if home == "" { return "", errors.New("could not get either XDG_DATA_HOME or HOME") } @@ -79,15 +80,26 @@ func GetDataHome() (string, error) { // GetConfigHome returns XDG_CONFIG_HOME. // GetConfigHome returns $HOME/.config and nil error if XDG_CONFIG_HOME is not set. +// If HOME and XDG_CONFIG_HOME are not set, getpwent(3) is consulted to determine the users home directory. // // See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html func GetConfigHome() (string, error) { if xdgConfigHome := os.Getenv("XDG_CONFIG_HOME"); xdgConfigHome != "" { return xdgConfigHome, nil } - home := os.Getenv("HOME") + home := Get() if home == "" { return "", errors.New("could not get either XDG_CONFIG_HOME or HOME") } return filepath.Join(home, ".config"), nil } + +// GetLibHome returns $HOME/.local/lib +// If HOME is not set, getpwent(3) is consulted to determine the users home directory. +func GetLibHome() (string, error) { + home := Get() + if home == "" { + return "", errors.New("could not get HOME") + } + return filepath.Join(home, ".local/lib"), nil +} diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go index fc48e674c1..11f1bec985 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go @@ -26,3 +26,8 @@ func GetDataHome() (string, error) { func GetConfigHome() (string, error) { return "", errors.New("homedir.GetConfigHome() is not supported on this system") } + +// GetLibHome is unsupported on non-linux system. +func GetLibHome() (string, error) { + return "", errors.New("homedir.GetLibHome() is not supported on this system") +} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools.go b/vendor/github.com/docker/docker/pkg/idtools/idtools.go index 25a57b231e..79d682c694 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools.go +++ b/vendor/github.com/docker/docker/pkg/idtools/idtools.go @@ -108,70 +108,58 @@ type Identity struct { SID string } -// IdentityMapping contains a mappings of UIDs and GIDs -type IdentityMapping struct { - uids []IDMap - gids []IDMap +// Chown changes the numeric uid and gid of the named file to id.UID and id.GID. +func (id Identity) Chown(name string) error { + return os.Chown(name, id.UID, id.GID) } -// NewIDMappingsFromMaps creates a new mapping from two slices -// Deprecated: this is a temporary shim while transitioning to IDMapping -func NewIDMappingsFromMaps(uids []IDMap, gids []IDMap) *IdentityMapping { - return &IdentityMapping{uids: uids, gids: gids} +// IdentityMapping contains a mappings of UIDs and GIDs. +// The zero value represents an empty mapping. +type IdentityMapping struct { + UIDMaps []IDMap `json:"UIDMaps"` + GIDMaps []IDMap `json:"GIDMaps"` } // RootPair returns a uid and gid pair for the root user. The error is ignored // because a root user always exists, and the defaults are correct when the uid // and gid maps are empty. -func (i *IdentityMapping) RootPair() Identity { - uid, gid, _ := GetRootUIDGID(i.uids, i.gids) +func (i IdentityMapping) RootPair() Identity { + uid, gid, _ := GetRootUIDGID(i.UIDMaps, i.GIDMaps) return Identity{UID: uid, GID: gid} } // ToHost returns the host UID and GID for the container uid, gid. // Remapping is only performed if the ids aren't already the remapped root ids -func (i *IdentityMapping) ToHost(pair Identity) (Identity, error) { +func (i IdentityMapping) ToHost(pair Identity) (Identity, error) { var err error target := i.RootPair() if pair.UID != target.UID { - target.UID, err = toHost(pair.UID, i.uids) + target.UID, err = toHost(pair.UID, i.UIDMaps) if err != nil { return target, err } } if pair.GID != target.GID { - target.GID, err = toHost(pair.GID, i.gids) + target.GID, err = toHost(pair.GID, i.GIDMaps) } return target, err } // ToContainer returns the container UID and GID for the host uid and gid -func (i *IdentityMapping) ToContainer(pair Identity) (int, int, error) { - uid, err := toContainer(pair.UID, i.uids) +func (i IdentityMapping) ToContainer(pair Identity) (int, int, error) { + uid, err := toContainer(pair.UID, i.UIDMaps) if err != nil { return -1, -1, err } - gid, err := toContainer(pair.GID, i.gids) + gid, err := toContainer(pair.GID, i.GIDMaps) return uid, gid, err } // Empty returns true if there are no id mappings -func (i *IdentityMapping) Empty() bool { - return len(i.uids) == 0 && len(i.gids) == 0 -} - -// UIDs return the UID mapping -// TODO: remove this once everything has been refactored to use pairs -func (i *IdentityMapping) UIDs() []IDMap { - return i.uids -} - -// GIDs return the UID mapping -// TODO: remove this once everything has been refactored to use pairs -func (i *IdentityMapping) GIDs() []IDMap { - return i.gids +func (i IdentityMapping) Empty() bool { + return len(i.UIDMaps) == 0 && len(i.GIDMaps) == 0 } func createIDMap(subidRanges ranges) []IDMap { diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go index ceec0339b5..a4001c3b87 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go +++ b/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go @@ -8,14 +8,13 @@ import ( "fmt" "io" "os" + "os/exec" "path/filepath" "strconv" "sync" "syscall" - "github.com/docker/docker/pkg/system" "github.com/opencontainers/runc/libcontainer/user" - "github.com/pkg/errors" ) var ( @@ -24,14 +23,12 @@ var ( ) func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting bool) error { - // make an array containing the original path asked for, plus (for mkAll == true) - // all path components leading up to the complete path that don't exist before we MkdirAll - // so that we can chown all of them properly at the end. If chownExisting is false, we won't - // chown the full directory path if it exists - - var paths []string + path, err := filepath.Abs(path) + if err != nil { + return err + } - stat, err := system.Stat(path) + stat, err := os.Stat(path) if err == nil { if !stat.IsDir() { return &os.PathError{Op: "mkdir", Path: path, Err: syscall.ENOTDIR} @@ -40,10 +37,15 @@ func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting return nil } - // short-circuit--we were called with an existing directory and chown was requested - return setPermissions(path, mode, owner.UID, owner.GID, stat) + // short-circuit -- we were called with an existing directory and chown was requested + return setPermissions(path, mode, owner, stat) } + // make an array containing the original path asked for, plus (for mkAll == true) + // all path components leading up to the complete path that don't exist before we MkdirAll + // so that we can chown all of them properly at the end. If chownExisting is false, we won't + // chown the full directory path if it exists + var paths []string if os.IsNotExist(err) { paths = []string{path} } @@ -57,54 +59,26 @@ func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting if dirPath == "/" { break } - if _, err := os.Stat(dirPath); err != nil && os.IsNotExist(err) { + if _, err = os.Stat(dirPath); err != nil && os.IsNotExist(err) { paths = append(paths, dirPath) } } - if err := system.MkdirAll(path, mode); err != nil { - return err - } - } else { - if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) { + if err = os.MkdirAll(path, mode); err != nil { return err } + } else if err = os.Mkdir(path, mode); err != nil { + return err } // even if it existed, we will chown the requested path + any subpaths that // didn't exist when we called MkdirAll for _, pathComponent := range paths { - if err := setPermissions(pathComponent, mode, owner.UID, owner.GID, nil); err != nil { + if err = setPermissions(pathComponent, mode, owner, nil); err != nil { return err } } return nil } -// CanAccess takes a valid (existing) directory and a uid, gid pair and determines -// if that uid, gid pair has access (execute bit) to the directory -func CanAccess(path string, pair Identity) bool { - statInfo, err := system.Stat(path) - if err != nil { - return false - } - fileMode := os.FileMode(statInfo.Mode()) - permBits := fileMode.Perm() - return accessible(statInfo.UID() == uint32(pair.UID), - statInfo.GID() == uint32(pair.GID), permBits) -} - -func accessible(isOwner, isGroup bool, perms os.FileMode) bool { - if isOwner && (perms&0100 == 0100) { - return true - } - if isGroup && (perms&0010 == 0010) { - return true - } - if perms&0001 == 0001 { - return true - } - return false -} - // LookupUser uses traditional local system files lookup (from libcontainer/user) on a username, // followed by a call to `getent` for supporting host configured non-files passwd and group dbs func LookupUser(name string) (user.User, error) { @@ -193,9 +167,12 @@ func callGetent(database, key string) (io.Reader, error) { if getentCmd == "" { return nil, fmt.Errorf("unable to find getent command") } - out, err := execCmd(getentCmd, database, key) + command := exec.Command(getentCmd, database, key) + // we run getent within container filesystem, but without /dev so /dev/null is not available for exec to mock stdin + command.Stdin = io.NopCloser(bytes.NewReader(nil)) + out, err := command.CombinedOutput() if err != nil { - exitCode, errC := system.GetExitCode(err) + exitCode, errC := getExitCode(err) if errC != nil { return nil, err } @@ -209,55 +186,67 @@ func callGetent(database, key string) (io.Reader, error) { default: return nil, err } - } return bytes.NewReader(out), nil } +// getExitCode returns the ExitStatus of the specified error if its type is +// exec.ExitError, returns 0 and an error otherwise. +func getExitCode(err error) (int, error) { + exitCode := 0 + if exiterr, ok := err.(*exec.ExitError); ok { + if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok { + return procExit.ExitStatus(), nil + } + } + return exitCode, fmt.Errorf("failed to get exit code") +} + // setPermissions performs a chown/chmod only if the uid/gid don't match what's requested // Normally a Chown is a no-op if uid/gid match, but in some cases this can still cause an error, e.g. if the // dir is on an NFS share, so don't call chown unless we absolutely must. // Likewise for setting permissions. -func setPermissions(p string, mode os.FileMode, uid, gid int, stat *system.StatT) error { +func setPermissions(p string, mode os.FileMode, owner Identity, stat os.FileInfo) error { if stat == nil { var err error - stat, err = system.Stat(p) + stat, err = os.Stat(p) if err != nil { return err } } - if os.FileMode(stat.Mode()).Perm() != mode.Perm() { + if stat.Mode().Perm() != mode.Perm() { if err := os.Chmod(p, mode.Perm()); err != nil { return err } } - if stat.UID() == uint32(uid) && stat.GID() == uint32(gid) { + ssi := stat.Sys().(*syscall.Stat_t) + if ssi.Uid == uint32(owner.UID) && ssi.Gid == uint32(owner.GID) { return nil } - return os.Chown(p, uid, gid) + return os.Chown(p, owner.UID, owner.GID) } -// NewIdentityMapping takes a requested username and +// LoadIdentityMapping takes a requested username and // using the data from /etc/sub{uid,gid} ranges, creates the // proper uid and gid remapping ranges for that user/group pair -func NewIdentityMapping(name string) (*IdentityMapping, error) { +func LoadIdentityMapping(name string) (IdentityMapping, error) { usr, err := LookupUser(name) if err != nil { - return nil, fmt.Errorf("Could not get user for username %s: %v", name, err) + return IdentityMapping{}, fmt.Errorf("could not get user for username %s: %v", name, err) } subuidRanges, err := lookupSubUIDRanges(usr) if err != nil { - return nil, err + return IdentityMapping{}, err } subgidRanges, err := lookupSubGIDRanges(usr) if err != nil { - return nil, err + return IdentityMapping{}, err } - return &IdentityMapping{ - uids: subuidRanges, - gids: subgidRanges, + return IdentityMapping{ + UIDMaps: subuidRanges, + GIDMaps: subgidRanges, }, nil } @@ -273,7 +262,7 @@ func lookupSubUIDRanges(usr user.User) ([]IDMap, error) { } } if len(rangeList) == 0 { - return nil, errors.Errorf("no subuid ranges found for user %q", usr.Name) + return nil, fmt.Errorf("no subuid ranges found for user %q", usr.Name) } return createIDMap(rangeList), nil } @@ -290,7 +279,7 @@ func lookupSubGIDRanges(usr user.User) ([]IDMap, error) { } } if len(rangeList) == 0 { - return nil, errors.Errorf("no subgid ranges found for user %q", usr.Name) + return nil, fmt.Errorf("no subgid ranges found for user %q", usr.Name) } return createIDMap(rangeList), nil } diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go index 35ede0fffa..32953f4563 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go +++ b/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go @@ -6,20 +6,19 @@ import ( "github.com/docker/docker/pkg/system" ) +const ( + SeTakeOwnershipPrivilege = "SeTakeOwnershipPrivilege" +) + +const ( + ContainerAdministratorSidString = "S-1-5-93-2-1" + ContainerUserSidString = "S-1-5-93-2-2" +) + // This is currently a wrapper around MkdirAll, however, since currently // permissions aren't set through this path, the identity isn't utilized. // Ownership is handled elsewhere, but in the future could be support here // too. -func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting bool) error { - if err := system.MkdirAll(path, mode); err != nil { - return err - } - return nil -} - -// CanAccess takes a valid (existing) directory and a uid, gid pair and determines -// if that uid, gid pair has access (execute bit) to the directory -// Windows does not require/support this function, so always return true -func CanAccess(path string, identity Identity) bool { - return true +func mkdirAs(path string, _ os.FileMode, _ Identity, _, _ bool) error { + return system.MkdirAll(path, 0) } diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go index bf7ae0564b..f0c075e20f 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go +++ b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go @@ -2,6 +2,7 @@ package idtools // import "github.com/docker/docker/pkg/idtools" import ( "fmt" + "os/exec" "regexp" "sort" "strconv" @@ -32,21 +33,21 @@ const ( // mapping ranges in containers. func AddNamespaceRangesUser(name string) (int, int, error) { if err := addUser(name); err != nil { - return -1, -1, fmt.Errorf("Error adding user %q: %v", name, err) + return -1, -1, fmt.Errorf("error adding user %q: %v", name, err) } // Query the system for the created uid and gid pair - out, err := execCmd("id", name) + out, err := exec.Command("id", name).CombinedOutput() if err != nil { - return -1, -1, fmt.Errorf("Error trying to find uid/gid for new user %q: %v", name, err) + return -1, -1, fmt.Errorf("error trying to find uid/gid for new user %q: %v", name, err) } matches := idOutRegexp.FindStringSubmatch(strings.TrimSpace(string(out))) if len(matches) != 3 { - return -1, -1, fmt.Errorf("Can't find uid, gid from `id` output: %q", string(out)) + return -1, -1, fmt.Errorf("can't find uid, gid from `id` output: %q", string(out)) } uid, err := strconv.Atoi(matches[1]) if err != nil { - return -1, -1, fmt.Errorf("Can't convert found uid (%s) to int: %v", matches[1], err) + return -1, -1, fmt.Errorf("can't convert found uid (%s) to int: %v", matches[1], err) } gid, err := strconv.Atoi(matches[2]) if err != nil { @@ -57,7 +58,7 @@ func AddNamespaceRangesUser(name string) (int, int, error) { // do not get auto-created ranges in subuid/subgid) if err := createSubordinateRanges(name); err != nil { - return -1, -1, fmt.Errorf("Couldn't create subordinate ID ranges: %v", err) + return -1, -1, fmt.Errorf("couldn't create subordinate ID ranges: %v", err) } return uid, gid, nil } @@ -81,45 +82,46 @@ func addUser(name string) error { return fmt.Errorf("cannot add user; no useradd/adduser binary found") } - if out, err := execCmd(userCommand, args...); err != nil { + if out, err := exec.Command(userCommand, args...).CombinedOutput(); err != nil { return fmt.Errorf("failed to add user with error: %v; output: %q", err, string(out)) } return nil } func createSubordinateRanges(name string) error { - // first, we should verify that ranges weren't automatically created // by the distro tooling ranges, err := parseSubuid(name) if err != nil { - return fmt.Errorf("Error while looking for subuid ranges for user %q: %v", name, err) + return fmt.Errorf("error while looking for subuid ranges for user %q: %v", name, err) } if len(ranges) == 0 { // no UID ranges; let's create one startID, err := findNextUIDRange() if err != nil { - return fmt.Errorf("Can't find available subuid range: %v", err) + return fmt.Errorf("can't find available subuid range: %v", err) } - out, err := execCmd("usermod", "-v", fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1), name) + idRange := fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1) + out, err := exec.Command("usermod", "-v", idRange, name).CombinedOutput() if err != nil { - return fmt.Errorf("Unable to add subuid range to user: %q; output: %s, err: %v", name, out, err) + return fmt.Errorf("unable to add subuid range to user: %q; output: %s, err: %v", name, out, err) } } ranges, err = parseSubgid(name) if err != nil { - return fmt.Errorf("Error while looking for subgid ranges for user %q: %v", name, err) + return fmt.Errorf("error while looking for subgid ranges for user %q: %v", name, err) } if len(ranges) == 0 { // no GID ranges; let's create one startID, err := findNextGIDRange() if err != nil { - return fmt.Errorf("Can't find available subgid range: %v", err) + return fmt.Errorf("can't find available subgid range: %v", err) } - out, err := execCmd("usermod", "-w", fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1), name) + idRange := fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1) + out, err := exec.Command("usermod", "-w", idRange, name).CombinedOutput() if err != nil { - return fmt.Errorf("Unable to add subgid range to user: %q; output: %s, err: %v", name, out, err) + return fmt.Errorf("unable to add subgid range to user: %q; output: %s, err: %v", name, out, err) } } return nil @@ -128,7 +130,7 @@ func createSubordinateRanges(name string) error { func findNextUIDRange() (int, error) { ranges, err := parseSubuid("ALL") if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subuid file: %v", err) + return -1, fmt.Errorf("couldn't parse all ranges in /etc/subuid file: %v", err) } sort.Sort(ranges) return findNextRangeStart(ranges) @@ -137,7 +139,7 @@ func findNextUIDRange() (int, error) { func findNextGIDRange() (int, error) { ranges, err := parseSubgid("ALL") if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subgid file: %v", err) + return -1, fmt.Errorf("couldn't parse all ranges in /etc/subgid file: %v", err) } sort.Sort(ranges) return findNextRangeStart(ranges) diff --git a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go b/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go index 540672af5a..05cc696365 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go +++ b/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go @@ -25,8 +25,3 @@ func resolveBinary(binname string) (string, error) { } return "", fmt.Errorf("Binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) } - -func execCmd(cmd string, arg ...string) ([]byte, error) { - execCmd := exec.Command(cmd, arg...) - return execCmd.CombinedOutput() -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go index 87514b643d..c1cfa62fd2 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go +++ b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go @@ -29,11 +29,12 @@ var ( // and releases new byte slices to adjust to current needs, so the buffer // won't be overgrown after peak loads. type BytesPipe struct { - mu sync.Mutex - wait *sync.Cond - buf []*fixedBuffer - bufLen int - closeErr error // error to return from next Read. set to nil if not closed. + mu sync.Mutex + wait *sync.Cond + buf []*fixedBuffer + bufLen int + closeErr error // error to return from next Read. set to nil if not closed. + readBlock bool // check read BytesPipe is Wait() or not } // NewBytesPipe creates new BytesPipe, initialized by specified slice. @@ -50,12 +51,12 @@ func NewBytesPipe() *BytesPipe { // It can allocate new []byte slices in a process of writing. func (bp *BytesPipe) Write(p []byte) (int, error) { bp.mu.Lock() + defer bp.mu.Unlock() written := 0 loop0: for { if bp.closeErr != nil { - bp.mu.Unlock() return written, ErrClosed } @@ -72,7 +73,6 @@ loop0: // errBufferFull is an error we expect to get if the buffer is full if err != nil && err != errBufferFull { bp.wait.Broadcast() - bp.mu.Unlock() return written, err } @@ -86,6 +86,9 @@ loop0: // make sure the buffer doesn't grow too big from this write for bp.bufLen >= blockThreshold { + if bp.readBlock { + bp.wait.Broadcast() + } bp.wait.Wait() if bp.closeErr != nil { continue loop0 @@ -100,7 +103,6 @@ loop0: bp.buf = append(bp.buf, getBuffer(nextCap)) } bp.wait.Broadcast() - bp.mu.Unlock() return written, nil } @@ -126,17 +128,16 @@ func (bp *BytesPipe) Close() error { // Data could be read only once. func (bp *BytesPipe) Read(p []byte) (n int, err error) { bp.mu.Lock() + defer bp.mu.Unlock() if bp.bufLen == 0 { if bp.closeErr != nil { - err := bp.closeErr - bp.mu.Unlock() - return 0, err + return 0, bp.closeErr } + bp.readBlock = true bp.wait.Wait() + bp.readBlock = false if bp.bufLen == 0 && bp.closeErr != nil { - err := bp.closeErr - bp.mu.Unlock() - return 0, err + return 0, bp.closeErr } } @@ -161,7 +162,6 @@ func (bp *BytesPipe) Read(p []byte) (n int, err error) { } bp.wait.Broadcast() - bp.mu.Unlock() return } diff --git a/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go b/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go index 534d66ac26..82671d8cd5 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go +++ b/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go @@ -2,7 +2,6 @@ package ioutils // import "github.com/docker/docker/pkg/ioutils" import ( "io" - "io/ioutil" "os" "path/filepath" ) @@ -11,7 +10,7 @@ import ( // temporary file and closing it atomically changes the temporary file to // destination path. Writing and closing concurrently is not allowed. func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) { - f, err := ioutil.TempFile(filepath.Dir(filename), ".tmp-"+filepath.Base(filename)) + f, err := os.CreateTemp(filepath.Dir(filename), ".tmp-"+filepath.Base(filename)) if err != nil { return nil, err } @@ -94,7 +93,7 @@ type AtomicWriteSet struct { // commit. If no temporary directory is given the system // default is used. func NewAtomicWriteSet(tmpDir string) (*AtomicWriteSet, error) { - td, err := ioutil.TempDir(tmpDir, "write-set-") + td, err := os.MkdirTemp(tmpDir, "write-set-") if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/pkg/ioutils/readers.go b/vendor/github.com/docker/docker/pkg/ioutils/readers.go index 1f657bd3dc..de00b95e3f 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/readers.go +++ b/vendor/github.com/docker/docker/pkg/ioutils/readers.go @@ -2,9 +2,12 @@ package ioutils // import "github.com/docker/docker/pkg/ioutils" import ( "context" - "crypto/sha256" - "encoding/hex" "io" + + // make sure crypto.SHA256, crypto.sha512 and crypto.SHA384 are registered + // TODO remove once https://github.com/opencontainers/go-digest/pull/64 is merged. + _ "crypto/sha256" + _ "crypto/sha512" ) // ReadCloserWrapper wraps an io.Reader, and implements an io.ReadCloser @@ -49,15 +52,6 @@ func NewReaderErrWrapper(r io.Reader, closer func()) io.Reader { } } -// HashData returns the sha256 sum of src. -func HashData(src io.Reader) (string, error) { - h := sha256.New() - if _, err := io.Copy(h, src); err != nil { - return "", err - } - return "sha256:" + hex.EncodeToString(h.Sum(nil)), nil -} - // OnEOFReader wraps an io.ReadCloser and a function // the function will run at the end of file or close the file. type OnEOFReader struct { diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go deleted file mode 100644 index 4e67ec2f53..0000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build !windows -// +build !windows - -package ioutils // import "github.com/docker/docker/pkg/ioutils" - -import "io/ioutil" - -// TempDir on Unix systems is equivalent to ioutil.TempDir. -func TempDir(dir, prefix string) (string, error) { - return ioutil.TempDir(dir, prefix) -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go deleted file mode 100644 index ecaba2e36d..0000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go +++ /dev/null @@ -1,16 +0,0 @@ -package ioutils // import "github.com/docker/docker/pkg/ioutils" - -import ( - "io/ioutil" - - "github.com/docker/docker/pkg/longpath" -) - -// TempDir is the equivalent of ioutil.TempDir, except that the result is in Windows longpath format. -func TempDir(dir, prefix string) (string, error) { - tempDir, err := ioutil.TempDir(dir, prefix) - if err != nil { - return "", err - } - return longpath.AddPrefix(tempDir), nil -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/tempdir_deprecated.go b/vendor/github.com/docker/docker/pkg/ioutils/tempdir_deprecated.go new file mode 100644 index 0000000000..b3321602c2 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/ioutils/tempdir_deprecated.go @@ -0,0 +1,10 @@ +package ioutils + +import "github.com/docker/docker/pkg/longpath" + +// TempDir is the equivalent of [os.MkdirTemp], except that on Windows +// the result is in Windows longpath format. On Unix systems it is +// equivalent to [os.MkdirTemp]. +// +// Deprecated: use [longpath.MkdirTemp]. +var TempDir = longpath.MkdirTemp diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go index cf8d04b1b2..035160c834 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go @@ -16,8 +16,8 @@ import ( // ensure the formatted time isalways the same number of characters. const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" -// JSONError wraps a concrete Code and Message, `Code` is -// is an integer error code, `Message` is the error message. +// JSONError wraps a concrete Code and Message, Code is +// an integer error code, Message is the error message. type JSONError struct { Code int `json:"code,omitempty"` Message string `json:"message,omitempty"` @@ -27,20 +27,28 @@ func (e *JSONError) Error() string { return e.Message } -// JSONProgress describes a Progress. terminalFd is the fd of the current terminal, -// Start is the initial value for the operation. Current is the current status and -// value of the progress made towards Total. Total is the end value describing when -// we made 100% progress for an operation. +// JSONProgress describes a progress message in a JSON stream. type JSONProgress struct { + // Current is the current status and value of the progress made towards Total. + Current int64 `json:"current,omitempty"` + // Total is the end value describing when we made 100% progress for an operation. + Total int64 `json:"total,omitempty"` + // Start is the initial value for the operation. + Start int64 `json:"start,omitempty"` + // HideCounts. if true, hides the progress count indicator (xB/yB). + HideCounts bool `json:"hidecounts,omitempty"` + // Units is the unit to print for progress. It defaults to "bytes" if empty. + Units string `json:"units,omitempty"` + + // terminalFd is the fd of the current terminal, if any. It is used + // to get the terminal width. terminalFd uintptr - Current int64 `json:"current,omitempty"` - Total int64 `json:"total,omitempty"` - Start int64 `json:"start,omitempty"` - // If true, don't show xB/yB - HideCounts bool `json:"hidecounts,omitempty"` - Units string `json:"units,omitempty"` - nowFunc func() time.Time - winSize int + + // nowFunc is used to override the current time in tests. + nowFunc func() time.Time + + // winSize is used to override the terminal width in tests. + winSize int } func (p *JSONProgress) String() string { @@ -56,8 +64,7 @@ func (p *JSONProgress) String() string { if p.Total <= 0 { switch p.Units { case "": - current := units.HumanSize(float64(p.Current)) - return fmt.Sprintf("%8v", current) + return fmt.Sprintf("%8v", units.HumanSize(float64(p.Current))) default: return fmt.Sprintf("%d %s", p.Current, p.Units) } @@ -110,17 +117,17 @@ func (p *JSONProgress) String() string { return pbBox + numbersBox + timeLeftBox } -// shim for testing +// now returns the current time in UTC, but can be overridden in tests +// by setting JSONProgress.nowFunc to a custom function. func (p *JSONProgress) now() time.Time { - if p.nowFunc == nil { - p.nowFunc = func() time.Time { - return time.Now().UTC() - } + if p.nowFunc != nil { + return p.nowFunc() } - return p.nowFunc() + return time.Now().UTC() } -// shim for testing +// width returns the current terminal's width, but can be overridden +// in tests by setting JSONProgress.winSize to a non-zero value. func (p *JSONProgress) width() int { if p.winSize != 0 { return p.winSize @@ -164,13 +171,11 @@ func cursorDown(out io.Writer, l uint) { fmt.Fprint(out, aec.Down(l)) } -// Display displays the JSONMessage to `out`. If `isTerminal` is true, it will erase the -// entire current line when displaying the progressbar. +// Display prints the JSONMessage to out. If isTerminal is true, it erases +// the entire current line when displaying the progressbar. It returns an +// error if the [JSONMessage.Error] field is non-nil. func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error { if jm.Error != nil { - if jm.Error.Code == 401 { - return fmt.Errorf("authentication is required") - } return jm.Error } var endl string @@ -204,9 +209,22 @@ func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error { return nil } -// DisplayJSONMessagesStream displays a json message stream from `in` to `out`, `isTerminal` -// describes if `out` is a terminal. If this is the case, it will print `\n` at the end of -// each line and move the cursor while displaying. +// DisplayJSONMessagesStream reads a JSON message stream from in, and writes +// each [JSONMessage] to out. It returns an error if an invalid JSONMessage +// is received, or if a JSONMessage containers a non-zero [JSONMessage.Error]. +// +// Presentation of the JSONMessage depends on whether a terminal is attached, +// and on the terminal width. Progress bars ([JSONProgress]) are suppressed +// on narrower terminals (< 110 characters). +// +// - isTerminal describes if out is a terminal, in which case it prints +// a newline ("\n") at the end of each line and moves the cursor while +// displaying. +// - terminalFd is the fd of the current terminal (if any), and used +// to get the terminal width. +// - auxCallback allows handling the [JSONMessage.Aux] field. It is +// called if a JSONMessage contains an Aux field, in which case +// DisplayJSONMessagesStream does not present the JSONMessage. func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(JSONMessage)) error { var ( dec = json.NewDecoder(in) @@ -271,13 +289,19 @@ func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, return nil } -type stream interface { +// Stream is an io.Writer for output with utilities to get the output's file +// descriptor and to detect wether it's a terminal. +// +// it is subset of the streams.Out type in +// https://pkg.go.dev/github.com/docker/cli@v20.10.17+incompatible/cli/streams#Out +type Stream interface { io.Writer FD() uintptr IsTerminal() bool } -// DisplayJSONMessagesToStream prints json messages to the output stream -func DisplayJSONMessagesToStream(in io.Reader, stream stream, auxCallback func(JSONMessage)) error { +// DisplayJSONMessagesToStream prints json messages to the output Stream. It is +// used by the Docker CLI to print JSONMessage streams. +func DisplayJSONMessagesToStream(in io.Reader, stream Stream, auxCallback func(JSONMessage)) error { return DisplayJSONMessagesStream(in, stream, stream.FD(), stream.IsTerminal(), auxCallback) } diff --git a/vendor/github.com/docker/docker/pkg/longpath/longpath.go b/vendor/github.com/docker/docker/pkg/longpath/longpath.go index 4177affba2..1c5dde5218 100644 --- a/vendor/github.com/docker/docker/pkg/longpath/longpath.go +++ b/vendor/github.com/docker/docker/pkg/longpath/longpath.go @@ -1,17 +1,20 @@ -// longpath introduces some constants and helper functions for handling long paths -// in Windows, which are expected to be prepended with `\\?\` and followed by either -// a drive letter, a UNC server\share, or a volume identifier. - +// Package longpath introduces some constants and helper functions for handling +// long paths in Windows. +// +// Long paths are expected to be prepended with "\\?\" and followed by either a +// drive letter, a UNC server\share, or a volume identifier. package longpath // import "github.com/docker/docker/pkg/longpath" import ( + "os" + "runtime" "strings" ) // Prefix is the longpath prefix for Windows file paths. const Prefix = `\\?\` -// AddPrefix will add the Windows long path prefix to the path provided if +// AddPrefix adds the Windows long path prefix to the path provided if // it does not already have it. func AddPrefix(path string) string { if !strings.HasPrefix(path, Prefix) { @@ -24,3 +27,17 @@ func AddPrefix(path string) string { } return path } + +// MkdirTemp is the equivalent of [os.MkdirTemp], except that on Windows +// the result is in Windows longpath format. On Unix systems it is +// equivalent to [os.MkdirTemp]. +func MkdirTemp(dir, prefix string) (string, error) { + tempDir, err := os.MkdirTemp(dir, prefix) + if err != nil { + return "", err + } + if runtime.GOOS != "windows" { + return tempDir, nil + } + return AddPrefix(tempDir), nil +} diff --git a/vendor/github.com/docker/docker/pkg/meminfo/meminfo.go b/vendor/github.com/docker/docker/pkg/meminfo/meminfo.go new file mode 100644 index 0000000000..4f33ad26bf --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/meminfo/meminfo.go @@ -0,0 +1,26 @@ +// Package meminfo provides utilites to retrieve memory statistics of +// the host system. +package meminfo + +// Read retrieves memory statistics of the host system and returns a +// Memory type. It is only supported on Linux and Windows, and returns an +// error on other platforms. +func Read() (*Memory, error) { + return readMemInfo() +} + +// Memory contains memory statistics of the host system. +type Memory struct { + // Total usable RAM (i.e. physical RAM minus a few reserved bits and the + // kernel binary code). + MemTotal int64 + + // Amount of free memory. + MemFree int64 + + // Total amount of swap space available. + SwapTotal int64 + + // Amount of swap space that is currently unused. + SwapFree int64 +} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go b/vendor/github.com/docker/docker/pkg/meminfo/meminfo_linux.go similarity index 75% rename from vendor/github.com/docker/docker/pkg/system/meminfo_linux.go rename to vendor/github.com/docker/docker/pkg/meminfo/meminfo_linux.go index cd060eff24..0c1cd21d49 100644 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go +++ b/vendor/github.com/docker/docker/pkg/meminfo/meminfo_linux.go @@ -1,4 +1,4 @@ -package system // import "github.com/docker/docker/pkg/system" +package meminfo import ( "bufio" @@ -6,13 +6,11 @@ import ( "os" "strconv" "strings" - - units "github.com/docker/go-units" ) -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { +// readMemInfo retrieves memory statistics of the host system and returns a +// Memory type. +func readMemInfo() (*Memory, error) { file, err := os.Open("/proc/meminfo") if err != nil { return nil, err @@ -22,10 +20,10 @@ func ReadMemInfo() (*MemInfo, error) { } // parseMemInfo parses the /proc/meminfo file into -// a MemInfo object given an io.Reader to the file. +// a Memory object given an io.Reader to the file. // Throws error if there are problems reading from the file -func parseMemInfo(reader io.Reader) (*MemInfo, error) { - meminfo := &MemInfo{} +func parseMemInfo(reader io.Reader) (*Memory, error) { + meminfo := &Memory{} scanner := bufio.NewScanner(reader) memAvailable := int64(-1) for scanner.Scan() { @@ -42,7 +40,8 @@ func parseMemInfo(reader io.Reader) (*MemInfo, error) { if err != nil { continue } - bytes := int64(size) * units.KiB + // Convert to KiB + bytes := int64(size) * 1024 switch parts[0] { case "MemTotal:": @@ -56,7 +55,6 @@ func parseMemInfo(reader io.Reader) (*MemInfo, error) { case "SwapFree:": meminfo.SwapFree = bytes } - } if memAvailable != -1 { meminfo.MemFree = memAvailable diff --git a/vendor/github.com/docker/docker/pkg/meminfo/meminfo_unsupported.go b/vendor/github.com/docker/docker/pkg/meminfo/meminfo_unsupported.go new file mode 100644 index 0000000000..ebfadd5343 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/meminfo/meminfo_unsupported.go @@ -0,0 +1,11 @@ +//go:build !linux && !windows +// +build !linux,!windows + +package meminfo + +import "errors" + +// readMemInfo is not supported on platforms other than linux and windows. +func readMemInfo() (*Memory, error) { + return nil, errors.New("platform and architecture is not supported") +} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go b/vendor/github.com/docker/docker/pkg/meminfo/meminfo_windows.go similarity index 81% rename from vendor/github.com/docker/docker/pkg/system/meminfo_windows.go rename to vendor/github.com/docker/docker/pkg/meminfo/meminfo_windows.go index 6ed93f2fe2..aa7d9375be 100644 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go +++ b/vendor/github.com/docker/docker/pkg/meminfo/meminfo_windows.go @@ -1,4 +1,4 @@ -package system // import "github.com/docker/docker/pkg/system" +package meminfo import ( "unsafe" @@ -26,17 +26,17 @@ type memorystatusex struct { ullAvailExtendedVirtual uint64 } -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { +// readMemInfo retrieves memory statistics of the host system and returns a +// Memory type. +func readMemInfo() (*Memory, error) { msi := &memorystatusex{ dwLength: 64, } r1, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msi))) if r1 == 0 { - return &MemInfo{}, nil + return &Memory{}, nil } - return &MemInfo{ + return &Memory{ MemTotal: int64(msi.ullTotalPhys), MemFree: int64(msi.ullAvailPhys), SwapTotal: int64(msi.ullTotalPageFile), diff --git a/vendor/github.com/docker/docker/pkg/process/doc.go b/vendor/github.com/docker/docker/pkg/process/doc.go new file mode 100644 index 0000000000..dae536d7db --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/process/doc.go @@ -0,0 +1,3 @@ +// Package process provides a set of basic functions to manage individual +// processes. +package process diff --git a/vendor/github.com/docker/docker/pkg/process/process_unix.go b/vendor/github.com/docker/docker/pkg/process/process_unix.go new file mode 100644 index 0000000000..daf3923626 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/process/process_unix.go @@ -0,0 +1,82 @@ +//go:build !windows +// +build !windows + +package process + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "runtime" + "strconv" + + "golang.org/x/sys/unix" +) + +// Alive returns true if process with a given pid is running. It only considers +// positive PIDs; 0 (all processes in the current process group), -1 (all processes +// with a PID larger than 1), and negative (-n, all processes in process group +// "n") values for pid are never considered to be alive. +func Alive(pid int) bool { + if pid < 1 { + return false + } + switch runtime.GOOS { + case "darwin": + // OS X does not have a proc filesystem. Use kill -0 pid to judge if the + // process exists. From KILL(2): https://www.freebsd.org/cgi/man.cgi?query=kill&sektion=2&manpath=OpenDarwin+7.2.1 + // + // Sig may be one of the signals specified in sigaction(2) or it may + // be 0, in which case error checking is performed but no signal is + // actually sent. This can be used to check the validity of pid. + err := unix.Kill(pid, 0) + + // Either the PID was found (no error) or we get an EPERM, which means + // the PID exists, but we don't have permissions to signal it. + return err == nil || err == unix.EPERM + default: + _, err := os.Stat(filepath.Join("/proc", strconv.Itoa(pid))) + return err == nil + } +} + +// Kill force-stops a process. It only considers positive PIDs; 0 (all processes +// in the current process group), -1 (all processes with a PID larger than 1), +// and negative (-n, all processes in process group "n") values for pid are +// ignored. Refer to [KILL(2)] for details. +// +// [KILL(2)]: https://man7.org/linux/man-pages/man2/kill.2.html +func Kill(pid int) error { + if pid < 1 { + return fmt.Errorf("invalid PID (%d): only positive PIDs are allowed", pid) + } + err := unix.Kill(pid, unix.SIGKILL) + if err != nil && err != unix.ESRCH { + return err + } + return nil +} + +// Zombie return true if process has a state with "Z". It only considers positive +// PIDs; 0 (all processes in the current process group), -1 (all processes with +// a PID larger than 1), and negative (-n, all processes in process group "n") +// values for pid are ignored. Refer to [PROC(5)] for details. +// +// [PROC(5)]: https://man7.org/linux/man-pages/man5/proc.5.html +func Zombie(pid int) (bool, error) { + if pid < 1 { + return false, nil + } + data, err := os.ReadFile(fmt.Sprintf("/proc/%d/stat", pid)) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + if cols := bytes.SplitN(data, []byte(" "), 4); len(cols) >= 3 && string(cols[2]) == "Z" { + return true, nil + } + return false, nil +} diff --git a/vendor/github.com/docker/docker/pkg/process/process_windows.go b/vendor/github.com/docker/docker/pkg/process/process_windows.go new file mode 100644 index 0000000000..26158d09ec --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/process/process_windows.go @@ -0,0 +1,52 @@ +package process + +import ( + "os" + + "golang.org/x/sys/windows" +) + +// Alive returns true if process with a given pid is running. +func Alive(pid int) bool { + h, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, uint32(pid)) + if err != nil { + return false + } + var c uint32 + err = windows.GetExitCodeProcess(h, &c) + _ = windows.CloseHandle(h) + if err != nil { + // From the GetExitCodeProcess function (processthreadsapi.h) API docs: + // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getexitcodeprocess + // + // The GetExitCodeProcess function returns a valid error code defined by the + // application only after the thread terminates. Therefore, an application should + // not use STILL_ACTIVE (259) as an error code (STILL_ACTIVE is a macro for + // STATUS_PENDING (minwinbase.h)). If a thread returns STILL_ACTIVE (259) as + // an error code, then applications that test for that value could interpret it + // to mean that the thread is still running, and continue to test for the + // completion of the thread after the thread has terminated, which could put + // the application into an infinite loop. + return c == uint32(windows.STATUS_PENDING) + } + return true +} + +// Kill force-stops a process. +func Kill(pid int) error { + p, err := os.FindProcess(pid) + if err == nil { + err = p.Kill() + if err != nil && err != os.ErrProcessDone { + return err + } + } + return nil +} + +// Zombie is not supported on Windows. +// +// TODO(thaJeztah): remove once we remove the stubs from pkg/system. +func Zombie(_ int) (bool, error) { + return false, nil +} diff --git a/vendor/github.com/docker/docker/pkg/stringid/README.md b/vendor/github.com/docker/docker/pkg/stringid/README.md deleted file mode 100644 index 37a5098fd9..0000000000 --- a/vendor/github.com/docker/docker/pkg/stringid/README.md +++ /dev/null @@ -1 +0,0 @@ -This package provides helper functions for dealing with string identifiers diff --git a/vendor/github.com/docker/docker/pkg/stringid/stringid.go b/vendor/github.com/docker/docker/pkg/stringid/stringid.go index 5fe071d628..d3d1014acf 100644 --- a/vendor/github.com/docker/docker/pkg/stringid/stringid.go +++ b/vendor/github.com/docker/docker/pkg/stringid/stringid.go @@ -4,21 +4,28 @@ package stringid // import "github.com/docker/docker/pkg/stringid" import ( "crypto/rand" "encoding/hex" - "fmt" + "errors" "regexp" "strconv" "strings" ) -const shortLen = 12 +const ( + shortLen = 12 + fullLen = 64 +) var ( validShortID = regexp.MustCompile("^[a-f0-9]{12}$") validHex = regexp.MustCompile(`^[a-f0-9]{64}$`) ) -// IsShortID determines if an arbitrary string *looks like* a short ID. +// IsShortID determines if id has the correct format and length for a short ID. +// It checks the IDs length and if it consists of valid characters for IDs (a-f0-9). func IsShortID(id string) bool { + if len(id) != shortLen { + return false + } return validShortID.MatchString(id) } @@ -54,10 +61,13 @@ func GenerateRandomID() string { } } -// ValidateID checks whether an ID string is a valid image ID. +// ValidateID checks whether an ID string is a valid, full-length image ID. func ValidateID(id string) error { - if ok := validHex.MatchString(id); !ok { - return fmt.Errorf("image ID %q is invalid", id) + if len(id) != fullLen { + return errors.New("image ID '" + id + "' is invalid") + } + if !validHex.MatchString(id) { + return errors.New("image ID '" + id + "' is invalid") } return nil } diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes.go b/vendor/github.com/docker/docker/pkg/system/chtimes.go index c26a4e24b6..6a6bca43ed 100644 --- a/vendor/github.com/docker/docker/pkg/system/chtimes.go +++ b/vendor/github.com/docker/docker/pkg/system/chtimes.go @@ -2,24 +2,41 @@ package system // import "github.com/docker/docker/pkg/system" import ( "os" + "syscall" "time" + "unsafe" ) -// Chtimes changes the access time and modified time of a file at the given path -func Chtimes(name string, atime time.Time, mtime time.Time) error { - unixMinTime := time.Unix(0, 0) - unixMaxTime := maxTime +// Used by Chtimes +var unixEpochTime, unixMaxTime time.Time - // If the modified time is prior to the Unix Epoch, or after the - // end of Unix Time, os.Chtimes has undefined behavior - // default to Unix Epoch in this case, just in case +func init() { + unixEpochTime = time.Unix(0, 0) + if unsafe.Sizeof(syscall.Timespec{}.Nsec) == 8 { + // This is a 64 bit timespec + // os.Chtimes limits time to the following + // + // Note that this intentionally sets nsec (not sec), which sets both sec + // and nsec internally in time.Unix(); + // https://github.com/golang/go/blob/go1.19.2/src/time/time.go#L1364-L1380 + unixMaxTime = time.Unix(0, 1<<63-1) + } else { + // This is a 32 bit timespec + unixMaxTime = time.Unix(1<<31-1, 0) + } +} - if atime.Before(unixMinTime) || atime.After(unixMaxTime) { - atime = unixMinTime +// Chtimes changes the access time and modified time of a file at the given path. +// If the modified time is prior to the Unix Epoch (unixMinTime), or after the +// end of Unix Time (unixEpochTime), os.Chtimes has undefined behavior. In this +// case, Chtimes defaults to Unix Epoch, just in case. +func Chtimes(name string, atime time.Time, mtime time.Time) error { + if atime.Before(unixEpochTime) || atime.After(unixMaxTime) { + atime = unixEpochTime } - if mtime.Before(unixMinTime) || mtime.After(unixMaxTime) { - mtime = unixMinTime + if mtime.Before(unixEpochTime) || mtime.After(unixMaxTime) { + mtime = unixEpochTime } if err := os.Chtimes(name, atime, mtime); err != nil { diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go b/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go index 6664b8bcad..ab478f5c38 100644 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go @@ -9,18 +9,17 @@ import ( // setCTime will set the create time on a file. On Windows, this requires // calling SetFileTime and explicitly including the create time. func setCTime(path string, ctime time.Time) error { - ctimespec := windows.NsecToTimespec(ctime.UnixNano()) - pathp, e := windows.UTF16PtrFromString(path) - if e != nil { - return e + pathp, err := windows.UTF16PtrFromString(path) + if err != nil { + return err } - h, e := windows.CreateFile(pathp, + h, err := windows.CreateFile(pathp, windows.FILE_WRITE_ATTRIBUTES, windows.FILE_SHARE_WRITE, nil, windows.OPEN_EXISTING, windows.FILE_FLAG_BACKUP_SEMANTICS, 0) - if e != nil { - return e + if err != nil { + return err } defer windows.Close(h) - c := windows.NsecToFiletime(windows.TimespecToNsec(ctimespec)) + c := windows.NsecToFiletime(ctime.UnixNano()) return windows.SetFileTime(h, &c, nil, nil) } diff --git a/vendor/github.com/docker/docker/pkg/system/exitcode.go b/vendor/github.com/docker/docker/pkg/system/exitcode.go deleted file mode 100644 index 4ba8fe35bf..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/exitcode.go +++ /dev/null @@ -1,19 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "fmt" - "os/exec" - "syscall" -) - -// GetExitCode returns the ExitStatus of the specified error if its type is -// exec.ExitError, returns 0 and an error otherwise. -func GetExitCode(err error) (int, error) { - exitCode := 0 - if exiterr, ok := err.(*exec.ExitError); ok { - if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok { - return procExit.ExitStatus(), nil - } - } - return exitCode, fmt.Errorf("failed to get exit code") -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys.go b/vendor/github.com/docker/docker/pkg/system/filesys.go new file mode 100644 index 0000000000..ce5990c914 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/filesys.go @@ -0,0 +1,19 @@ +package system + +import ( + "os" + "path/filepath" + "strings" +) + +// IsAbs is a platform-agnostic wrapper for filepath.IsAbs. +// +// On Windows, golang filepath.IsAbs does not consider a path \windows\system32 +// as absolute as it doesn't start with a drive-letter/colon combination. However, +// in docker we need to verify things such as WORKDIR /windows/system32 in +// a Dockerfile (which gets translated to \windows\system32 when being processed +// by the daemon). This SHOULD be treated as absolute from a docker processing +// perspective. +func IsAbs(path string) bool { + return filepath.IsAbs(path) || strings.HasPrefix(path, string(os.PathSeparator)) +} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_unix.go b/vendor/github.com/docker/docker/pkg/system/filesys_unix.go index 186d9d9a11..3801129404 100644 --- a/vendor/github.com/docker/docker/pkg/system/filesys_unix.go +++ b/vendor/github.com/docker/docker/pkg/system/filesys_unix.go @@ -3,11 +3,7 @@ package system // import "github.com/docker/docker/pkg/system" -import ( - "io/ioutil" - "os" - "path/filepath" -) +import "os" // MkdirAllWithACL is a wrapper for os.MkdirAll on unix systems. func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { @@ -19,50 +15,3 @@ func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { func MkdirAll(path string, perm os.FileMode) error { return os.MkdirAll(path, perm) } - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. -func IsAbs(path string) bool { - return filepath.IsAbs(path) -} - -// The functions below here are wrappers for the equivalents in the os and ioutils packages. -// They are passthrough on Unix platforms, and only relevant on Windows. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return os.Create(name) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return os.Open(name) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. It opens the named file with specified flag -// (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, -// methods on the returned File can be used for I/O. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, perm os.FileMode) (*os.File, error) { - return os.OpenFile(name, flag, perm) -} - -// TempFileSequential creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *os.File. -// If dir is the empty string, TempFile uses the default directory -// for temporary files (see os.TempDir). -// Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility -// to remove the file when no longer needed. -func TempFileSequential(dir, prefix string) (f *os.File, err error) { - return ioutil.TempFile(dir, prefix) -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go index b4646277ab..92e972ea2e 100644 --- a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go @@ -2,40 +2,43 @@ package system // import "github.com/docker/docker/pkg/system" import ( "os" - "path/filepath" "regexp" - "strconv" - "strings" - "sync" "syscall" - "time" "unsafe" "golang.org/x/sys/windows" ) -const ( - // SddlAdministratorsLocalSystem is local administrators plus NT AUTHORITY\System - SddlAdministratorsLocalSystem = "D:P(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" -) +// SddlAdministratorsLocalSystem is local administrators plus NT AUTHORITY\System. +const SddlAdministratorsLocalSystem = "D:P(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" + +// volumePath is a regular expression to check if a path is a Windows +// volume path (e.g., "\\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}" +// or "\\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}\"). +var volumePath = regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}\\?$`) -// MkdirAllWithACL is a wrapper for MkdirAll that creates a directory -// with an appropriate SDDL defined ACL. -func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { - return mkdirall(path, true, sddl) +// MkdirAllWithACL is a custom version of os.MkdirAll modified for use on Windows +// so that it is both volume path aware, and can create a directory with +// an appropriate SDDL defined ACL. +func MkdirAllWithACL(path string, _ os.FileMode, sddl string) error { + sa, err := makeSecurityAttributes(sddl) + if err != nil { + return &os.PathError{Op: "mkdirall", Path: path, Err: err} + } + return mkdirall(path, sa) } -// MkdirAll implementation that is volume path aware for Windows. It can be used -// as a drop-in replacement for os.MkdirAll() +// MkdirAll is a custom version of os.MkdirAll that is volume path aware for +// Windows. It can be used as a drop-in replacement for os.MkdirAll. func MkdirAll(path string, _ os.FileMode) error { - return mkdirall(path, false, "") + return mkdirall(path, nil) } // mkdirall is a custom version of os.MkdirAll modified for use on Windows // so that it is both volume path aware, and can create a directory with // a DACL. -func mkdirall(path string, applyACL bool, sddl string) error { - if re := regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}$`); re.MatchString(path) { +func mkdirall(path string, perm *windows.SecurityAttributes) error { + if volumePath.MatchString(path) { return nil } @@ -48,11 +51,7 @@ func mkdirall(path string, applyACL bool, sddl string) error { if dir.IsDir() { return nil } - return &os.PathError{ - Op: "mkdir", - Path: path, - Err: syscall.ENOTDIR, - } + return &os.PathError{Op: "mkdir", Path: path, Err: syscall.ENOTDIR} } // Slow path: make sure parent exists and then call Mkdir for path. @@ -67,20 +66,15 @@ func mkdirall(path string, applyACL bool, sddl string) error { } if j > 1 { - // Create parent - err = mkdirall(path[0:j-1], false, sddl) + // Create parent. + err = mkdirall(fixRootDirectory(path[:j-1]), perm) if err != nil { return err } } - // Parent now exists; invoke os.Mkdir or mkdirWithACL and use its result. - if applyACL { - err = mkdirWithACL(path, sddl) - } else { - err = os.Mkdir(path, 0) - } - + // Parent now exists; invoke Mkdir and use its result. + err = mkdirWithACL(path, perm) if err != nil { // Handle arguments like "foo/." by // double-checking that directory doesn't exist. @@ -100,193 +94,42 @@ func mkdirall(path string, applyACL bool, sddl string) error { // in golang to cater for creating a directory am ACL permitting full // access, with inheritance, to any subfolder/file for Built-in Administrators // and Local System. -func mkdirWithACL(name string, sddl string) error { - sa := windows.SecurityAttributes{Length: 0} - sd, err := windows.SecurityDescriptorFromString(sddl) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} +func mkdirWithACL(name string, sa *windows.SecurityAttributes) error { + if sa == nil { + return os.Mkdir(name, 0) } - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - sa.SecurityDescriptor = sd namep, err := windows.UTF16PtrFromString(name) if err != nil { return &os.PathError{Op: "mkdir", Path: name, Err: err} } - e := windows.CreateDirectory(namep, &sa) - if e != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: e} + err = windows.CreateDirectory(namep, sa) + if err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} } return nil } -// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, -// golang filepath.IsAbs does not consider a path \windows\system32 as absolute -// as it doesn't start with a drive-letter/colon combination. However, in -// docker we need to verify things such as WORKDIR /windows/system32 in -// a Dockerfile (which gets translated to \windows\system32 when being processed -// by the daemon. This SHOULD be treated as absolute from a docker processing -// perspective. -func IsAbs(path string) bool { - if filepath.IsAbs(path) || strings.HasPrefix(path, string(os.PathSeparator)) { - return true - } - return false -} - -// The origin of the functions below here are the golang OS and windows packages, -// slightly modified to only cope with files, not directories due to the -// specific use case. -// -// The alteration is to allow a file on Windows to be opened with -// FILE_FLAG_SEQUENTIAL_SCAN (particular for docker load), to avoid eating -// the standby list, particularly when accessing large files such as layer.tar. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDONLY, 0) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, _ os.FileMode) (*os.File, error) { - if name == "" { - return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT} - } - r, errf := windowsOpenFileSequential(name, flag, 0) - if errf == nil { - return r, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: errf} -} - -func windowsOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) { - r, e := windowsOpenSequential(name, flag|windows.O_CLOEXEC, 0) - if e != nil { - return nil, e +// fixRootDirectory fixes a reference to a drive's root directory to +// have the required trailing slash. +func fixRootDirectory(p string) string { + if len(p) == len(`\\?\c:`) { + if os.IsPathSeparator(p[0]) && os.IsPathSeparator(p[1]) && p[2] == '?' && os.IsPathSeparator(p[3]) && p[5] == ':' { + return p + `\` + } } - return os.NewFile(uintptr(r), name), nil + return p } -func makeInheritSa() *windows.SecurityAttributes { +func makeSecurityAttributes(sddl string) (*windows.SecurityAttributes, error) { var sa windows.SecurityAttributes sa.Length = uint32(unsafe.Sizeof(sa)) sa.InheritHandle = 1 - return &sa -} - -func windowsOpenSequential(path string, mode int, _ uint32) (fd windows.Handle, err error) { - if len(path) == 0 { - return windows.InvalidHandle, windows.ERROR_FILE_NOT_FOUND - } - pathp, err := windows.UTF16PtrFromString(path) + var err error + sa.SecurityDescriptor, err = windows.SecurityDescriptorFromString(sddl) if err != nil { - return windows.InvalidHandle, err - } - var access uint32 - switch mode & (windows.O_RDONLY | windows.O_WRONLY | windows.O_RDWR) { - case windows.O_RDONLY: - access = windows.GENERIC_READ - case windows.O_WRONLY: - access = windows.GENERIC_WRITE - case windows.O_RDWR: - access = windows.GENERIC_READ | windows.GENERIC_WRITE - } - if mode&windows.O_CREAT != 0 { - access |= windows.GENERIC_WRITE - } - if mode&windows.O_APPEND != 0 { - access &^= windows.GENERIC_WRITE - access |= windows.FILE_APPEND_DATA - } - sharemode := uint32(windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE) - var sa *windows.SecurityAttributes - if mode&windows.O_CLOEXEC == 0 { - sa = makeInheritSa() - } - var createmode uint32 - switch { - case mode&(windows.O_CREAT|windows.O_EXCL) == (windows.O_CREAT | windows.O_EXCL): - createmode = windows.CREATE_NEW - case mode&(windows.O_CREAT|windows.O_TRUNC) == (windows.O_CREAT | windows.O_TRUNC): - createmode = windows.CREATE_ALWAYS - case mode&windows.O_CREAT == windows.O_CREAT: - createmode = windows.OPEN_ALWAYS - case mode&windows.O_TRUNC == windows.O_TRUNC: - createmode = windows.TRUNCATE_EXISTING - default: - createmode = windows.OPEN_EXISTING - } - // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx - const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN - h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) - return h, e -} - -// Helpers for TempFileSequential -var rand uint32 -var randmu sync.Mutex - -func reseed() uint32 { - return uint32(time.Now().UnixNano() + int64(os.Getpid())) -} -func nextSuffix() string { - randmu.Lock() - r := rand - if r == 0 { - r = reseed() - } - r = r*1664525 + 1013904223 // constants from Numerical Recipes - rand = r - randmu.Unlock() - return strconv.Itoa(int(1e9 + r%1e9))[1:] -} - -// TempFileSequential is a copy of ioutil.TempFile, modified to use sequential -// file access. Below is the original comment from golang: -// TempFile creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *os.File. -// If dir is the empty string, TempFile uses the default directory -// for temporary files (see os.TempDir). -// Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility -// to remove the file when no longer needed. -func TempFileSequential(dir, prefix string) (f *os.File, err error) { - if dir == "" { - dir = os.TempDir() - } - - nconflict := 0 - for i := 0; i < 10000; i++ { - name := filepath.Join(dir, prefix+nextSuffix()) - f, err = OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if os.IsExist(err) { - if nconflict++; nconflict > 10 { - randmu.Lock() - rand = reseed() - randmu.Unlock() - } - continue - } - break + return nil, err } - return + return &sa, nil } diff --git a/vendor/github.com/docker/docker/pkg/system/image_os.go b/vendor/github.com/docker/docker/pkg/system/image_os.go new file mode 100644 index 0000000000..e3de86be29 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/image_os.go @@ -0,0 +1,10 @@ +package system // import "github.com/docker/docker/pkg/system" +import ( + "runtime" + "strings" +) + +// IsOSSupported determines if an operating system is supported by the host. +func IsOSSupported(os string) bool { + return strings.EqualFold(runtime.GOOS, os) +} diff --git a/vendor/github.com/docker/docker/pkg/system/init.go b/vendor/github.com/docker/docker/pkg/system/init.go deleted file mode 100644 index a17597aaba..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/init.go +++ /dev/null @@ -1,22 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "syscall" - "time" - "unsafe" -) - -// Used by chtimes -var maxTime time.Time - -func init() { - // chtimes initialization - if unsafe.Sizeof(syscall.Timespec{}.Nsec) == 8 { - // This is a 64 bit timespec - // os.Chtimes limits time to the following - maxTime = time.Unix(0, 1<<63-1) - } else { - // This is a 32 bit timespec - maxTime = time.Unix(1<<31-1, 0) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/init_windows.go b/vendor/github.com/docker/docker/pkg/system/init_windows.go index a91288c60b..3c2a43ddbd 100644 --- a/vendor/github.com/docker/docker/pkg/system/init_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/init_windows.go @@ -1,29 +1,18 @@ package system // import "github.com/docker/docker/pkg/system" -import ( - "os" - - "github.com/sirupsen/logrus" -) - var ( - // containerdRuntimeSupported determines if ContainerD should be the runtime. - // As of March 2019, this is an experimental feature. + // containerdRuntimeSupported determines if containerd should be the runtime. containerdRuntimeSupported = false ) -// InitContainerdRuntime sets whether to use ContainerD for runtime -// on Windows. This is an experimental feature still in development, and -// also requires an environment variable to be set (so as not to turn the -// feature on from simply experimental which would also mean LCOW. -func InitContainerdRuntime(experimental bool, cdPath string) { - if experimental && len(cdPath) > 0 && len(os.Getenv("DOCKER_WINDOWS_CONTAINERD_RUNTIME")) > 0 { - logrus.Warnf("Using ContainerD runtime. This feature is experimental") +// InitContainerdRuntime sets whether to use containerd for runtime on Windows. +func InitContainerdRuntime(cdPath string) { + if len(cdPath) > 0 { containerdRuntimeSupported = true } } -// ContainerdRuntimeSupported returns true if the use of ContainerD runtime is supported. +// ContainerdRuntimeSupported returns true if the use of containerd runtime is supported. func ContainerdRuntimeSupported() bool { return containerdRuntimeSupported } diff --git a/vendor/github.com/docker/docker/pkg/system/lcow.go b/vendor/github.com/docker/docker/pkg/system/lcow.go deleted file mode 100644 index 4599a3f23c..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow.go +++ /dev/null @@ -1,49 +0,0 @@ -//go:build windows && !no_lcow -// +build windows,!no_lcow - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "strings" - - "github.com/Microsoft/hcsshim/osversion" - specs "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/pkg/errors" -) - -var ( - // lcowSupported determines if Linux Containers on Windows are supported. - lcowSupported = false -) - -// InitLCOW sets whether LCOW is supported or not. Requires RS5+ -func InitLCOW(experimental bool) { - if experimental && osversion.Build() >= osversion.RS5 { - lcowSupported = true - } -} - -func LCOWSupported() bool { - return lcowSupported -} - -// ValidatePlatform determines if a platform structure is valid. -// TODO This is a temporary windows-only function, should be replaced by -// comparison of worker capabilities -func ValidatePlatform(platform specs.Platform) error { - if !IsOSSupported(platform.OS) { - return errors.Errorf("unsupported os %s", platform.OS) - } - return nil -} - -// IsOSSupported determines if an operating system is supported by the host -func IsOSSupported(os string) bool { - if strings.EqualFold("windows", os) { - return true - } - if LCOWSupported() && strings.EqualFold(os, "linux") { - return true - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go b/vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go deleted file mode 100644 index daadef31d5..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go +++ /dev/null @@ -1,29 +0,0 @@ -//go:build !windows || (windows && no_lcow) -// +build !windows windows,no_lcow - -package system // import "github.com/docker/docker/pkg/system" -import ( - "runtime" - "strings" - - specs "github.com/opencontainers/image-spec/specs-go/v1" -) - -// InitLCOW does nothing since LCOW is a windows only feature -func InitLCOW(_ bool) {} - -// LCOWSupported returns true if Linux containers on Windows are supported. -func LCOWSupported() bool { - return false -} - -// ValidatePlatform determines if a platform structure is valid. This function -// is used for LCOW, and is a no-op on non-windows platforms. -func ValidatePlatform(_ specs.Platform) error { - return nil -} - -// IsOSSupported determines if an operating system is supported by the host. -func IsOSSupported(os string) bool { - return strings.EqualFold(runtime.GOOS, os) -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo.go b/vendor/github.com/docker/docker/pkg/system/meminfo.go deleted file mode 100644 index 6667eb84dc..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo.go +++ /dev/null @@ -1,17 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -// MemInfo contains memory statistics of the host system. -type MemInfo struct { - // Total usable RAM (i.e. physical RAM minus a few reserved bits and the - // kernel binary code). - MemTotal int64 - - // Amount of free memory. - MemFree int64 - - // Total amount of swap space available. - SwapTotal int64 - - // Amount of swap space that is currently unused. - SwapFree int64 -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_deprecated.go b/vendor/github.com/docker/docker/pkg/system/meminfo_deprecated.go new file mode 100644 index 0000000000..216519923e --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/meminfo_deprecated.go @@ -0,0 +1,16 @@ +package system + +import "github.com/docker/docker/pkg/meminfo" + +// MemInfo contains memory statistics of the host system. +// +// Deprecated: use [meminfo.Memory]. +type MemInfo = meminfo.Memory + +// ReadMemInfo retrieves memory statistics of the host system and returns a +// MemInfo type. +// +// Deprecated: use [meminfo.Read]. +func ReadMemInfo() (*meminfo.Memory, error) { + return meminfo.Read() +} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go b/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go deleted file mode 100644 index 207ee58ee6..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build !linux && !windows -// +build !linux,!windows - -package system // import "github.com/docker/docker/pkg/system" - -// ReadMemInfo is not supported on platforms other than linux and windows. -func ReadMemInfo() (*MemInfo, error) { - return nil, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/path.go b/vendor/github.com/docker/docker/pkg/system/path.go deleted file mode 100644 index 64e892289a..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/path.go +++ /dev/null @@ -1,64 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "fmt" - "path/filepath" - "runtime" - "strings" -) - -const defaultUnixPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - -// DefaultPathEnv is unix style list of directories to search for -// executables. Each directory is separated from the next by a colon -// ':' character . -func DefaultPathEnv(os string) string { - if runtime.GOOS == "windows" { - if os != runtime.GOOS { - return defaultUnixPathEnv - } - // Deliberately empty on Windows containers on Windows as the default path will be set by - // the container. Docker has no context of what the default path should be. - return "" - } - return defaultUnixPathEnv - -} - -// PathVerifier defines the subset of a PathDriver that CheckSystemDriveAndRemoveDriveLetter -// actually uses in order to avoid system depending on containerd/continuity. -type PathVerifier interface { - IsAbs(string) bool -} - -// CheckSystemDriveAndRemoveDriveLetter verifies that a path, if it includes a drive letter, -// is the system drive. -// On Linux: this is a no-op. -// On Windows: this does the following> -// CheckSystemDriveAndRemoveDriveLetter verifies and manipulates a Windows path. -// This is used, for example, when validating a user provided path in docker cp. -// If a drive letter is supplied, it must be the system drive. The drive letter -// is always removed. Also, it translates it to OS semantics (IOW / to \). We -// need the path in this syntax so that it can ultimately be concatenated with -// a Windows long-path which doesn't support drive-letters. Examples: -// C: --> Fail -// C:\ --> \ -// a --> a -// /a --> \a -// d:\ --> Fail -func CheckSystemDriveAndRemoveDriveLetter(path string, driver PathVerifier) (string, error) { - if runtime.GOOS != "windows" || LCOWSupported() { - return path, nil - } - - if len(path) == 2 && string(path[1]) == ":" { - return "", fmt.Errorf("No relative path specified in %q", path) - } - if !driver.IsAbs(path) || len(path) < 2 { - return filepath.FromSlash(path), nil - } - if string(path[1]) == ":" && !strings.EqualFold(string(path[0]), "c") { - return "", fmt.Errorf("The specified path is not on the system drive (C:)") - } - return filepath.FromSlash(path[2:]), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_deprecated.go b/vendor/github.com/docker/docker/pkg/system/path_deprecated.go new file mode 100644 index 0000000000..5c95026c3d --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/path_deprecated.go @@ -0,0 +1,18 @@ +package system + +const defaultUnixPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + +// DefaultPathEnv is unix style list of directories to search for +// executables. Each directory is separated from the next by a colon +// ':' character . +// For Windows containers, an empty string is returned as the default +// path will be set by the container, and Docker has no context of what the +// default path should be. +// +// Deprecated: use oci.DefaultPathEnv +func DefaultPathEnv(os string) string { + if os == "windows" { + return "" + } + return defaultUnixPathEnv +} diff --git a/vendor/github.com/docker/docker/pkg/system/path_unix.go b/vendor/github.com/docker/docker/pkg/system/path_unix.go deleted file mode 100644 index 2c85371b5e..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_unix.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build !windows -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -// GetLongPathName converts Windows short pathnames to full pathnames. -// For example C:\Users\ADMIN~1 --> C:\Users\Administrator. -// It is a no-op on non-Windows platforms -func GetLongPathName(path string) (string, error) { - return path, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_windows.go b/vendor/github.com/docker/docker/pkg/system/path_windows.go deleted file mode 100644 index 22a56136c8..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "golang.org/x/sys/windows" - -// GetLongPathName converts Windows short pathnames to full pathnames. -// For example C:\Users\ADMIN~1 --> C:\Users\Administrator. -// It is a no-op on non-Windows platforms -func GetLongPathName(path string) (string, error) { - // See https://groups.google.com/forum/#!topic/golang-dev/1tufzkruoTg - p, err := windows.UTF16FromString(path) - if err != nil { - return "", err - } - b := p // GetLongPathName says we can reuse buffer - n, err := windows.GetLongPathName(&p[0], &b[0], uint32(len(b))) - if err != nil { - return "", err - } - if n > uint32(len(b)) { - b = make([]uint16, n) - _, err = windows.GetLongPathName(&p[0], &b[0], uint32(len(b))) - if err != nil { - return "", err - } - } - return windows.UTF16ToString(b), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/process_deprecated.go b/vendor/github.com/docker/docker/pkg/system/process_deprecated.go new file mode 100644 index 0000000000..7b9f19acd5 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/process_deprecated.go @@ -0,0 +1,27 @@ +//go:build linux || freebsd || darwin || windows +// +build linux freebsd darwin windows + +package system + +import "github.com/docker/docker/pkg/process" + +var ( + // IsProcessAlive returns true if process with a given pid is running. + // + // Deprecated: use [process.Alive]. + IsProcessAlive = process.Alive + + // IsProcessZombie return true if process has a state with "Z" + // + // Deprecated: use [process.Zombie]. + // + // TODO(thaJeztah): remove the Windows implementation in process once we remove this stub. + IsProcessZombie = process.Zombie +) + +// KillProcess force-stops a process. +// +// Deprecated: use [process.Kill]. +func KillProcess(pid int) { + _ = process.Kill(pid) +} diff --git a/vendor/github.com/docker/docker/pkg/system/process_unix.go b/vendor/github.com/docker/docker/pkg/system/process_unix.go deleted file mode 100644 index 145689b88a..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/process_unix.go +++ /dev/null @@ -1,45 +0,0 @@ -//go:build linux || freebsd || darwin -// +build linux freebsd darwin - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "fmt" - "io/ioutil" - "strings" - "syscall" - - "golang.org/x/sys/unix" -) - -// IsProcessAlive returns true if process with a given pid is running. -func IsProcessAlive(pid int) bool { - err := unix.Kill(pid, syscall.Signal(0)) - if err == nil || err == unix.EPERM { - return true - } - - return false -} - -// KillProcess force-stops a process. -func KillProcess(pid int) { - unix.Kill(pid, unix.SIGKILL) -} - -// IsProcessZombie return true if process has a state with "Z" -// http://man7.org/linux/man-pages/man5/proc.5.html -func IsProcessZombie(pid int) (bool, error) { - statPath := fmt.Sprintf("/proc/%d/stat", pid) - dataBytes, err := ioutil.ReadFile(statPath) - if err != nil { - return false, err - } - data := string(dataBytes) - sdata := strings.SplitN(data, " ", 4) - if len(sdata) >= 3 && sdata[2] == "Z" { - return true, nil - } - - return false, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/process_windows.go b/vendor/github.com/docker/docker/pkg/system/process_windows.go deleted file mode 100644 index 09bdfa0ca0..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/process_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "os" - -// IsProcessAlive returns true if process with a given pid is running. -func IsProcessAlive(pid int) bool { - _, err := os.FindProcess(pid) - - return err == nil -} - -// KillProcess force-stops a process. -func KillProcess(pid int) { - p, err := os.FindProcess(pid) - if err == nil { - _ = p.Kill() - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/rm.go b/vendor/github.com/docker/docker/pkg/system/rm.go deleted file mode 100644 index f2d81597c9..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/rm.go +++ /dev/null @@ -1,79 +0,0 @@ -//go:build !darwin && !windows -// +build !darwin,!windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "os" - "syscall" - "time" - - "github.com/moby/sys/mount" - "github.com/pkg/errors" -) - -// EnsureRemoveAll wraps `os.RemoveAll` to check for specific errors that can -// often be remedied. -// Only use `EnsureRemoveAll` if you really want to make every effort to remove -// a directory. -// -// Because of the way `os.Remove` (and by extension `os.RemoveAll`) works, there -// can be a race between reading directory entries and then actually attempting -// to remove everything in the directory. -// These types of errors do not need to be returned since it's ok for the dir to -// be gone we can just retry the remove operation. -// -// This should not return a `os.ErrNotExist` kind of error under any circumstances -func EnsureRemoveAll(dir string) error { - notExistErr := make(map[string]bool) - - // track retries - exitOnErr := make(map[string]int) - maxRetry := 50 - - // Attempt to unmount anything beneath this dir first - mount.RecursiveUnmount(dir) - - for { - err := os.RemoveAll(dir) - if err == nil { - return nil - } - - pe, ok := err.(*os.PathError) - if !ok { - return err - } - - if os.IsNotExist(err) { - if notExistErr[pe.Path] { - return err - } - notExistErr[pe.Path] = true - - // There is a race where some subdir can be removed but after the parent - // dir entries have been read. - // So the path could be from `os.Remove(subdir)` - // If the reported non-existent path is not the passed in `dir` we - // should just retry, but otherwise return with no error. - if pe.Path == dir { - return nil - } - continue - } - - if pe.Err != syscall.EBUSY { - return err - } - - if e := mount.Unmount(pe.Path); e != nil { - return errors.Wrapf(e, "error while removing %s", dir) - } - - if exitOnErr[pe.Path] == maxRetry { - return err - } - exitOnErr[pe.Path]++ - time.Sleep(100 * time.Millisecond) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/rm_windows.go b/vendor/github.com/docker/docker/pkg/system/rm_windows.go deleted file mode 100644 index ed9c5dcb8a..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/rm_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package system - -import "os" - -// EnsureRemoveAll is an alias to os.RemoveAll on Windows -var EnsureRemoveAll = os.RemoveAll diff --git a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go b/vendor/github.com/docker/docker/pkg/system/stat_solaris.go deleted file mode 100644 index 6a51ccd642..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go +++ /dev/null @@ -1,13 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: s.Mode, - uid: s.Uid, - gid: s.Gid, - rdev: s.Rdev, - mtim: s.Mtim}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_windows.go b/vendor/github.com/docker/docker/pkg/system/stat_windows.go index b2456cb887..0ff3af2fa1 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/stat_windows.go @@ -20,12 +20,12 @@ func (s StatT) Size() int64 { // Mode returns file's permission mode. func (s StatT) Mode() os.FileMode { - return os.FileMode(s.mode) + return s.mode } // Mtim returns file's last modification time. func (s StatT) Mtim() time.Time { - return time.Time(s.mtim) + return s.mtim } // Stat takes a path to a file and returns diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go b/vendor/github.com/docker/docker/pkg/system/syscall_unix.go deleted file mode 100644 index 7c90bffaa5..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build linux || freebsd -// +build linux freebsd - -package system // import "github.com/docker/docker/pkg/system" - -import "golang.org/x/sys/unix" - -// Unmount is a platform-specific helper function to call -// the unmount syscall. -func Unmount(dest string) error { - return unix.Unmount(dest, 0) -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go b/vendor/github.com/docker/docker/pkg/system/syscall_windows.go deleted file mode 100644 index 1588aa3ef9..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go +++ /dev/null @@ -1,136 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "syscall" - "unsafe" - - "github.com/Microsoft/hcsshim/osversion" - "github.com/sirupsen/logrus" - "golang.org/x/sys/windows" -) - -const ( - OWNER_SECURITY_INFORMATION = windows.OWNER_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.OWNER_SECURITY_INFORMATION - GROUP_SECURITY_INFORMATION = windows.GROUP_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.GROUP_SECURITY_INFORMATION - DACL_SECURITY_INFORMATION = windows.DACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.DACL_SECURITY_INFORMATION - SACL_SECURITY_INFORMATION = windows.SACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.SACL_SECURITY_INFORMATION - LABEL_SECURITY_INFORMATION = windows.LABEL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.LABEL_SECURITY_INFORMATION - ATTRIBUTE_SECURITY_INFORMATION = windows.ATTRIBUTE_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.ATTRIBUTE_SECURITY_INFORMATION - SCOPE_SECURITY_INFORMATION = windows.SCOPE_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.SCOPE_SECURITY_INFORMATION - PROCESS_TRUST_LABEL_SECURITY_INFORMATION = 0x00000080 - ACCESS_FILTER_SECURITY_INFORMATION = 0x00000100 - BACKUP_SECURITY_INFORMATION = windows.BACKUP_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.BACKUP_SECURITY_INFORMATION - PROTECTED_DACL_SECURITY_INFORMATION = windows.PROTECTED_DACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.PROTECTED_DACL_SECURITY_INFORMATION - PROTECTED_SACL_SECURITY_INFORMATION = windows.PROTECTED_SACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.PROTECTED_SACL_SECURITY_INFORMATION - UNPROTECTED_DACL_SECURITY_INFORMATION = windows.UNPROTECTED_DACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.UNPROTECTED_DACL_SECURITY_INFORMATION - UNPROTECTED_SACL_SECURITY_INFORMATION = windows.UNPROTECTED_SACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.UNPROTECTED_SACL_SECURITY_INFORMATION -) - -const ( - SE_UNKNOWN_OBJECT_TYPE = windows.SE_UNKNOWN_OBJECT_TYPE // Deprecated: use golang.org/x/sys/windows.SE_UNKNOWN_OBJECT_TYPE - SE_FILE_OBJECT = windows.SE_FILE_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_FILE_OBJECT - SE_SERVICE = windows.SE_SERVICE // Deprecated: use golang.org/x/sys/windows.SE_SERVICE - SE_PRINTER = windows.SE_PRINTER // Deprecated: use golang.org/x/sys/windows.SE_PRINTER - SE_REGISTRY_KEY = windows.SE_REGISTRY_KEY // Deprecated: use golang.org/x/sys/windows.SE_REGISTRY_KEY - SE_LMSHARE = windows.SE_LMSHARE // Deprecated: use golang.org/x/sys/windows.SE_LMSHARE - SE_KERNEL_OBJECT = windows.SE_KERNEL_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_KERNEL_OBJECT - SE_WINDOW_OBJECT = windows.SE_WINDOW_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_WINDOW_OBJECT - SE_DS_OBJECT = windows.SE_DS_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_DS_OBJECT - SE_DS_OBJECT_ALL = windows.SE_DS_OBJECT_ALL // Deprecated: use golang.org/x/sys/windows.SE_DS_OBJECT_ALL - SE_PROVIDER_DEFINED_OBJECT = windows.SE_PROVIDER_DEFINED_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_PROVIDER_DEFINED_OBJECT - SE_WMIGUID_OBJECT = windows.SE_WMIGUID_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_WMIGUID_OBJECT - SE_REGISTRY_WOW64_32KEY = windows.SE_REGISTRY_WOW64_32KEY // Deprecated: use golang.org/x/sys/windows.SE_REGISTRY_WOW64_32KEY -) - -const ( - SeTakeOwnershipPrivilege = "SeTakeOwnershipPrivilege" -) - -const ( - ContainerAdministratorSidString = "S-1-5-93-2-1" - ContainerUserSidString = "S-1-5-93-2-2" -) - -var ( - ntuserApiset = windows.NewLazyDLL("ext-ms-win-ntuser-window-l1-1-0") - modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") - procGetVersionExW = modkernel32.NewProc("GetVersionExW") - procSetNamedSecurityInfo = modadvapi32.NewProc("SetNamedSecurityInfoW") - procGetSecurityDescriptorDacl = modadvapi32.NewProc("GetSecurityDescriptorDacl") -) - -// OSVersion is a wrapper for Windows version information -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx -type OSVersion = osversion.OSVersion - -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx -// TODO: use golang.org/x/sys/windows.OsVersionInfoEx (needs OSVersionInfoSize to be exported) -type osVersionInfoEx struct { - OSVersionInfoSize uint32 - MajorVersion uint32 - MinorVersion uint32 - BuildNumber uint32 - PlatformID uint32 - CSDVersion [128]uint16 - ServicePackMajor uint16 - ServicePackMinor uint16 - SuiteMask uint16 - ProductType byte - Reserve byte -} - -// GetOSVersion gets the operating system version on Windows. Note that -// dockerd.exe must be manifested to get the correct version information. -// Deprecated: use github.com/Microsoft/hcsshim/osversion.Get() instead -func GetOSVersion() OSVersion { - return osversion.Get() -} - -// IsWindowsClient returns true if the SKU is client -func IsWindowsClient() bool { - osviex := &osVersionInfoEx{OSVersionInfoSize: 284} - r1, _, err := procGetVersionExW.Call(uintptr(unsafe.Pointer(osviex))) - if r1 == 0 { - logrus.Warnf("GetVersionExW failed - assuming server SKU: %v", err) - return false - } - const verNTWorkstation = 0x00000001 - return osviex.ProductType == verNTWorkstation -} - -// Unmount is a platform-specific helper function to call -// the unmount syscall. Not supported on Windows -func Unmount(_ string) error { - return nil -} - -// HasWin32KSupport determines whether containers that depend on win32k can -// run on this machine. Win32k is the driver used to implement windowing. -func HasWin32KSupport() bool { - // For now, check for ntuser API support on the host. In the future, a host - // may support win32k in containers even if the host does not support ntuser - // APIs. - return ntuserApiset.Load() == nil -} - -// Deprecated: use golang.org/x/sys/windows.SetNamedSecurityInfo() -func SetNamedSecurityInfo(objectName *uint16, objectType uint32, securityInformation uint32, sidOwner *windows.SID, sidGroup *windows.SID, dacl *byte, sacl *byte) (result error) { - r0, _, _ := syscall.Syscall9(procSetNamedSecurityInfo.Addr(), 7, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(sidOwner)), uintptr(unsafe.Pointer(sidGroup)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0) - if r0 != 0 { - result = syscall.Errno(r0) - } - return -} - -// Deprecated: uses golang.org/x/sys/windows.SecurityDescriptorFromString() and golang.org/x/sys/windows.SECURITY_DESCRIPTOR.DACL() -func GetSecurityDescriptorDacl(securityDescriptor *byte, daclPresent *uint32, dacl **byte, daclDefaulted *uint32) (result error) { - r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(securityDescriptor)), uintptr(unsafe.Pointer(daclPresent)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(daclDefaulted)), 0, 0) - if r1 == 0 { - if e1 != 0 { - result = e1 - } else { - result = syscall.EINVAL - } - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask.go b/vendor/github.com/docker/docker/pkg/system/umask.go deleted file mode 100644 index d4a15cbedc..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !windows -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "golang.org/x/sys/unix" -) - -// Umask sets current process's file mode creation mask to newmask -// and returns oldmask. -func Umask(newmask int) (oldmask int, err error) { - return unix.Umask(newmask), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask_windows.go b/vendor/github.com/docker/docker/pkg/system/umask_windows.go deleted file mode 100644 index fc62388c38..0000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -// Umask is not supported on the windows platform. -func Umask(newmask int) (oldmask int, err error) { - // should not be called on cli code path - return 0, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/volume/mounts/lcow_parser.go b/vendor/github.com/docker/docker/volume/mounts/lcow_parser.go index bafb7b07f8..3158f39024 100644 --- a/vendor/github.com/docker/docker/volume/mounts/lcow_parser.go +++ b/vendor/github.com/docker/docker/volume/mounts/lcow_parser.go @@ -2,18 +2,46 @@ package mounts // import "github.com/docker/docker/volume/mounts" import ( "errors" + "fmt" "path" + "regexp" + "strings" "github.com/docker/docker/api/types/mount" ) -var lcowSpecificValidators mountValidator = func(m *mount.Mount) error { +// NewLCOWParser creates a parser with Linux Containers on Windows semantics. +func NewLCOWParser() Parser { + return &lcowParser{ + windowsParser{ + fi: defaultFileInfoProvider{}, + }, + } +} + +// rxLCOWDestination is the regex expression for the mount destination for LCOW +// +// Destination (aka container path): +// - Variation on hostdir but can be a drive followed by colon as well +// - If a path, must be absolute. Can include spaces +// - Drive cannot be c: (explicitly checked in code, not RegEx) +const rxLCOWDestination = `(?P/(?:[^\\/:*?"<>\r\n]+[/]?)*)` + +var ( + lcowMountDestinationRegex = regexp.MustCompile(`^` + rxLCOWDestination + `$`) + lcowSplitRawSpec = regexp.MustCompile(`^` + rxSource + rxLCOWDestination + rxMode + `$`) +) + +var lcowValidators mountValidator = func(m *mount.Mount) error { if path.Clean(m.Target) == "/" { return ErrVolumeTargetIsRoot } if m.Type == mount.TypeNamedPipe { return errors.New("Linux containers on Windows do not support named pipe mounts") } + if !lcowMountDestinationRegex.MatchString(strings.ToLower(m.Target)) { + return fmt.Errorf("invalid mount path: '%s'", m.Target) + } return nil } @@ -22,13 +50,17 @@ type lcowParser struct { } func (p *lcowParser) ValidateMountConfig(mnt *mount.Mount) error { - return p.validateMountConfigReg(mnt, rxLCOWDestination, lcowSpecificValidators) + return p.validateMountConfigReg(mnt, lcowValidators) } func (p *lcowParser) ParseMountRaw(raw, volumeDriver string) (*MountPoint, error) { - return p.parseMountRaw(raw, volumeDriver, rxLCOWDestination, false, lcowSpecificValidators) + arr, err := p.splitRawSpec(raw, lcowSplitRawSpec) + if err != nil { + return nil, err + } + return p.parseMount(arr, raw, volumeDriver, false, lcowValidators) } func (p *lcowParser) ParseMountSpec(cfg mount.Mount) (*MountPoint, error) { - return p.parseMountSpec(cfg, rxLCOWDestination, false, lcowSpecificValidators) + return p.parseMountSpec(cfg, false, lcowValidators) } diff --git a/vendor/github.com/docker/docker/volume/mounts/linux_parser.go b/vendor/github.com/docker/docker/volume/mounts/linux_parser.go index b5ed4af6a3..17bc3c9878 100644 --- a/vendor/github.com/docker/docker/volume/mounts/linux_parser.go +++ b/vendor/github.com/docker/docker/volume/mounts/linux_parser.go @@ -12,30 +12,26 @@ import ( "github.com/docker/docker/volume" ) -type linuxParser struct { -} - -func linuxSplitRawSpec(raw string) ([]string, error) { - if strings.Count(raw, ":") > 2 { - return nil, errInvalidSpec(raw) +// NewLinuxParser creates a parser with Linux semantics. +func NewLinuxParser() Parser { + return &linuxParser{ + fi: defaultFileInfoProvider{}, } +} - arr := strings.SplitN(raw, ":", 3) - if arr[0] == "" { - return nil, errInvalidSpec(raw) - } - return arr, nil +type linuxParser struct { + fi fileInfoProvider } func linuxValidateNotRoot(p string) error { - p = path.Clean(strings.Replace(p, `\`, `/`, -1)) + p = path.Clean(strings.ReplaceAll(p, `\`, `/`)) if p == "/" { return ErrVolumeTargetIsRoot } return nil } func linuxValidateAbsolute(p string) error { - p = strings.Replace(p, `\`, `/`, -1) + p = strings.ReplaceAll(p, `\`, `/`) if path.IsAbs(p) { return nil } @@ -82,7 +78,7 @@ func (p *linuxParser) validateMountConfigImpl(mnt *mount.Mount, validateBindSour } if validateBindSourceExists { - exists, _, err := currentFileInfoProvider.fileInfo(mnt.Source) + exists, _, err := p.fi.fileInfo(mnt.Source) if err != nil { return &errMountConfig{mnt, err} } @@ -115,12 +111,6 @@ func (p *linuxParser) validateMountConfigImpl(mnt *mount.Mount, validateBindSour return nil } -// read-write modes -var rwModes = map[string]bool{ - "rw": true, - "ro": true, -} - // label modes var linuxLabelModes = map[string]bool{ "Z": true, @@ -212,9 +202,9 @@ func (p *linuxParser) ReadWrite(mode string) bool { } func (p *linuxParser) ParseMountRaw(raw, volumeDriver string) (*MountPoint, error) { - arr, err := linuxSplitRawSpec(raw) - if err != nil { - return nil, err + arr := strings.SplitN(raw, ":", 4) + if arr[0] == "" { + return nil, errInvalidSpec(raw) } var spec mount.Mount @@ -332,26 +322,23 @@ func (p *linuxParser) ParseVolumesFrom(spec string) (string, string, error) { return "", "", fmt.Errorf("volumes-from specification cannot be an empty string") } - specParts := strings.SplitN(spec, ":", 2) - id := specParts[0] - mode := "rw" - - if len(specParts) == 2 { - mode = specParts[1] - if !linuxValidMountMode(mode) { - return "", "", errInvalidMode(mode) - } - // For now don't allow propagation properties while importing - // volumes from data container. These volumes will inherit - // the same propagation property as of the original volume - // in data container. This probably can be relaxed in future. - if linuxHasPropagation(mode) { - return "", "", errInvalidMode(mode) - } - // Do not allow copy modes on volumes-from - if _, isSet := getCopyMode(mode, p.DefaultCopyMode()); isSet { - return "", "", errInvalidMode(mode) - } + id, mode, _ := strings.Cut(spec, ":") + if mode == "" { + return id, "rw", nil + } + if !linuxValidMountMode(mode) { + return "", "", errInvalidMode(mode) + } + // For now don't allow propagation properties while importing + // volumes from data container. These volumes will inherit + // the same propagation property as of the original volume + // in data container. This probably can be relaxed in future. + if linuxHasPropagation(mode) { + return "", "", errInvalidMode(mode) + } + // Do not allow copy modes on volumes-from + if _, isSet := getCopyMode(mode, p.DefaultCopyMode()); isSet { + return "", "", errInvalidMode(mode) } return id, mode, nil } diff --git a/vendor/github.com/docker/docker/volume/mounts/mounts.go b/vendor/github.com/docker/docker/volume/mounts/mounts.go index c441e51ed9..bc90bb9def 100644 --- a/vendor/github.com/docker/docker/volume/mounts/mounts.go +++ b/vendor/github.com/docker/docker/volume/mounts/mounts.go @@ -1,17 +1,20 @@ package mounts // import "github.com/docker/docker/volume/mounts" import ( + "context" "fmt" "os" "path/filepath" "syscall" + "github.com/containerd/containerd/log" mounttypes "github.com/docker/docker/api/types/mount" "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/volume" "github.com/opencontainers/selinux/go-selinux/label" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) // MountPoint is the intersection point between a volume and a container. It @@ -164,6 +167,32 @@ func (m *MountPoint) Setup(mountLabel string, rootIDs idtools.Identity, checkFun return m.Source, nil } +func (m *MountPoint) LiveRestore(ctx context.Context) error { + if m.Volume == nil { + logrus.Debug("No volume to restore") + return nil + } + + lrv, ok := m.Volume.(volume.LiveRestorer) + if !ok { + log.G(ctx).WithField("volume", m.Volume.Name()).Debugf("Volume does not support live restore: %T", m.Volume) + return nil + } + + id := m.ID + if id == "" { + id = stringid.GenerateRandomID() + } + + if err := lrv.LiveRestoreVolume(ctx, id); err != nil { + return errors.Wrapf(err, "error while restoring volume '%s'", m.Source) + } + + m.ID = id + m.active++ + return nil +} + // Path returns the path of a volume in a mount point. func (m *MountPoint) Path() string { if m.Volume != nil { diff --git a/vendor/github.com/docker/docker/volume/mounts/parser.go b/vendor/github.com/docker/docker/volume/mounts/parser.go index 73681750ea..58107f490c 100644 --- a/vendor/github.com/docker/docker/volume/mounts/parser.go +++ b/vendor/github.com/docker/docker/volume/mounts/parser.go @@ -7,17 +7,16 @@ import ( "github.com/docker/docker/api/types/mount" ) -const ( - // OSLinux is the same as runtime.GOOS on linux - OSLinux = "linux" - // OSWindows is the same as runtime.GOOS on windows - OSWindows = "windows" -) - // ErrVolumeTargetIsRoot is returned when the target destination is root. // It's used by both LCOW and Linux parsers. var ErrVolumeTargetIsRoot = errors.New("invalid specification: destination can't be '/'") +// read-write modes +var rwModes = map[string]bool{ + "rw": true, + "ro": true, +} + // Parser represents a platform specific parser for mount expressions type Parser interface { ParseMountRaw(raw, volumeDriver string) (*MountPoint, error) @@ -34,14 +33,10 @@ type Parser interface { ValidateMountConfig(mt *mount.Mount) error } -// NewParser creates a parser for a given container OS, depending on the current host OS (linux on a windows host will resolve to an lcowParser) -func NewParser(containerOS string) Parser { - switch containerOS { - case OSWindows: - return &windowsParser{} - } - if runtime.GOOS == OSWindows { - return &lcowParser{} +// NewParser creates a parser for the current host OS +func NewParser() Parser { + if runtime.GOOS == "windows" { + return NewWindowsParser() } - return &linuxParser{} + return NewLinuxParser() } diff --git a/vendor/github.com/docker/docker/volume/mounts/volume_unix.go b/vendor/github.com/docker/docker/volume/mounts/volume_unix.go index e7e7bcc038..92eadce518 100644 --- a/vendor/github.com/docker/docker/volume/mounts/volume_unix.go +++ b/vendor/github.com/docker/docker/volume/mounts/volume_unix.go @@ -13,7 +13,3 @@ func (p *linuxParser) HasResource(m *MountPoint, absolutePath string) bool { relPath, err := filepath.Rel(m.Destination, absolutePath) return err == nil && relPath != ".." && !strings.HasPrefix(relPath, fmt.Sprintf("..%c", filepath.Separator)) } - -func (p *windowsParser) HasResource(m *MountPoint, absolutePath string) bool { - return false -} diff --git a/vendor/github.com/docker/docker/volume/mounts/volume_windows.go b/vendor/github.com/docker/docker/volume/mounts/volume_windows.go index 773e7db88a..d91f6cee3a 100644 --- a/vendor/github.com/docker/docker/volume/mounts/volume_windows.go +++ b/vendor/github.com/docker/docker/volume/mounts/volume_windows.go @@ -1,8 +1,5 @@ package mounts // import "github.com/docker/docker/volume/mounts" -func (p *windowsParser) HasResource(m *MountPoint, absolutePath string) bool { - return false -} func (p *linuxParser) HasResource(m *MountPoint, absolutePath string) bool { return false } diff --git a/vendor/github.com/docker/docker/volume/mounts/windows_parser.go b/vendor/github.com/docker/docker/volume/mounts/windows_parser.go index 8f427d8c50..7800aa8c08 100644 --- a/vendor/github.com/docker/docker/volume/mounts/windows_parser.go +++ b/vendor/github.com/docker/docker/volume/mounts/windows_parser.go @@ -12,7 +12,15 @@ import ( "github.com/docker/docker/pkg/stringid" ) +// NewWindowsParser creates a parser with Windows semantics. +func NewWindowsParser() Parser { + return &windowsParser{ + fi: defaultFileInfoProvider{}, + } +} + type windowsParser struct { + fi fileInfoProvider } const ( @@ -39,7 +47,7 @@ const ( rxName = `[^\\/:*?"<>|\r\n]+` // RXReservedNames are reserved names not possible on Windows - rxReservedNames = `(con)|(prn)|(nul)|(aux)|(com[1-9])|(lpt[1-9])` + rxReservedNames = `(con|prn|nul|aux|com[1-9]|lpt[1-9])` // rxPipe is a named path pipe (starts with `\\.\pipe\`, possibly with / instead of \) rxPipe = `[/\\]{2}.[/\\]pipe[/\\][^:*?"<>|\r\n]+` @@ -63,12 +71,6 @@ const ( // rxDestination is the regex expression for the mount destination rxDestination = `(?P((?:\\\\\?\\)?([a-z]):((?:[\\/][^\\/:*?"<>\r\n]+)*[\\/]?))|(` + rxPipe + `))` - rxLCOWDestination = `(?P/(?:[^\\/:*?"<>\r\n]+[/]?)*)` - // Destination (aka container path): - // - Variation on hostdir but can be a drive followed by colon as well - // - If a path, must be absolute. Can include spaces - // - Drive cannot be c: (explicitly checked in code, not RegEx) - // rxMode is the regex expression for the mode of the mount // Mode (optional): // - Hopefully self explanatory in comparison to above regex's. @@ -76,13 +78,18 @@ const ( rxMode = `(:(?P(?i)ro|rw))?` ) -type mountValidator func(mnt *mount.Mount) error +var ( + volumeNameRegexp = regexp.MustCompile(`^` + rxName + `$`) + reservedNameRegexp = regexp.MustCompile(`^` + rxReservedNames + `$`) + hostDirRegexp = regexp.MustCompile(`^` + rxHostDir + `$`) + mountDestinationRegexp = regexp.MustCompile(`^` + rxDestination + `$`) + windowsSplitRawSpecRegexp = regexp.MustCompile(`^` + rxSource + rxDestination + rxMode + `$`) +) -func windowsSplitRawSpec(raw, destRegex string) ([]string, error) { - specExp := regexp.MustCompile(`^` + rxSource + destRegex + rxMode + `$`) - match := specExp.FindStringSubmatch(strings.ToLower(raw)) +type mountValidator func(mnt *mount.Mount) error - // Must have something back +func (p *windowsParser) splitRawSpec(raw string, splitRegexp *regexp.Regexp) ([]string, error) { + match := splitRegexp.FindStringSubmatch(strings.ToLower(raw)) if len(match) == 0 { return nil, errInvalidSpec(raw) } @@ -90,7 +97,7 @@ func windowsSplitRawSpec(raw, destRegex string) ([]string, error) { var split []string matchgroups := make(map[string]string) // Pull out the sub expressions from the named capture groups - for i, name := range specExp.SubexpNames() { + for i, name := range splitRegexp.SubexpNames() { matchgroups[name] = strings.ToLower(match[i]) } if source, exists := matchgroups["source"]; exists { @@ -113,19 +120,14 @@ func windowsSplitRawSpec(raw, destRegex string) ([]string, error) { // situation where the user intention was to map a file into a container through // a local volume, but this is not supported by the platform. if matchgroups["source"] == "" && matchgroups["destination"] != "" { - volExp := regexp.MustCompile(`^` + rxName + `$`) - reservedNameExp := regexp.MustCompile(`^` + rxReservedNames + `$`) - - if volExp.MatchString(matchgroups["destination"]) { - if reservedNameExp.MatchString(matchgroups["destination"]) { + if volumeNameRegexp.MatchString(matchgroups["destination"]) { + if reservedNameRegexp.MatchString(matchgroups["destination"]) { return nil, fmt.Errorf("volume name %q cannot be a reserved word for Windows filenames", matchgroups["destination"]) } } else { - - exists, isDir, _ := currentFileInfoProvider.fileInfo(matchgroups["destination"]) + exists, isDir, _ := p.fi.fileInfo(matchgroups["destination"]) if exists && !isDir { return nil, fmt.Errorf("file '%s' cannot be mapped. Only directories can be mapped on this platform", matchgroups["destination"]) - } } } @@ -136,28 +138,30 @@ func windowsValidMountMode(mode string) bool { if mode == "" { return true } + // TODO should windows mounts produce an error if any mode was provided (they're a no-op on windows) return rwModes[strings.ToLower(mode)] } + func windowsValidateNotRoot(p string) error { - p = strings.ToLower(strings.Replace(p, `/`, `\`, -1)) + p = strings.ToLower(strings.ReplaceAll(p, `/`, `\`)) if p == "c:" || p == `c:\` { return fmt.Errorf("destination path cannot be `c:` or `c:\\`: %v", p) } return nil } -var windowsSpecificValidators mountValidator = func(mnt *mount.Mount) error { - return windowsValidateNotRoot(mnt.Target) -} - -func windowsValidateRegex(p, r string) error { - if regexp.MustCompile(`^` + r + `$`).MatchString(strings.ToLower(p)) { - return nil +var windowsValidators mountValidator = func(m *mount.Mount) error { + if err := windowsValidateNotRoot(m.Target); err != nil { + return err + } + if !mountDestinationRegexp.MatchString(strings.ToLower(m.Target)) { + return fmt.Errorf("invalid mount path: '%s'", m.Target) } - return fmt.Errorf("invalid mount path: '%s'", p) + return nil } + func windowsValidateAbsolute(p string) error { - if err := windowsValidateRegex(p, rxDestination); err != nil { + if !mountDestinationRegexp.MatchString(strings.ToLower(p)) { return fmt.Errorf("invalid mount path: '%s' mount path must be absolute", p) } return nil @@ -166,7 +170,7 @@ func windowsValidateAbsolute(p string) error { func windowsDetectMountType(p string) mount.Type { if strings.HasPrefix(p, `\\.\pipe\`) { return mount.TypeNamedPipe - } else if regexp.MustCompile(`^` + rxHostDir + `$`).MatchString(p) { + } else if hostDirRegexp.MatchString(p) { return mount.TypeBind } else { return mount.TypeVolume @@ -177,20 +181,18 @@ func (p *windowsParser) ReadWrite(mode string) bool { return strings.ToLower(mode) != "ro" } -// IsVolumeNameValid checks a volume name in a platform specific manner. +// ValidateVolumeName checks a volume name in a platform specific manner. func (p *windowsParser) ValidateVolumeName(name string) error { - nameExp := regexp.MustCompile(`^` + rxName + `$`) - if !nameExp.MatchString(name) { + if !volumeNameRegexp.MatchString(name) { return errors.New("invalid volume name") } - nameExp = regexp.MustCompile(`^` + rxReservedNames + `$`) - if nameExp.MatchString(name) { + if reservedNameRegexp.MatchString(name) { return fmt.Errorf("volume name %q cannot be a reserved word for Windows filenames", name) } return nil } func (p *windowsParser) ValidateMountConfig(mnt *mount.Mount) error { - return p.validateMountConfigReg(mnt, rxDestination, windowsSpecificValidators) + return p.validateMountConfigReg(mnt, windowsValidators) } type fileInfoProvider interface { @@ -211,22 +213,15 @@ func (defaultFileInfoProvider) fileInfo(path string) (exist, isDir bool, err err return true, fi.IsDir(), nil } -var currentFileInfoProvider fileInfoProvider = defaultFileInfoProvider{} - -func (p *windowsParser) validateMountConfigReg(mnt *mount.Mount, destRegex string, additionalValidators ...mountValidator) error { - +func (p *windowsParser) validateMountConfigReg(mnt *mount.Mount, additionalValidators ...mountValidator) error { + if len(mnt.Target) == 0 { + return &errMountConfig{mnt, errMissingField("Target")} + } for _, v := range additionalValidators { if err := v(mnt); err != nil { return &errMountConfig{mnt, err} } } - if len(mnt.Target) == 0 { - return &errMountConfig{mnt, errMissingField("Target")} - } - - if err := windowsValidateRegex(mnt.Target, destRegex); err != nil { - return &errMountConfig{mnt, err} - } switch mnt.Type { case mount.TypeBind: @@ -247,7 +242,7 @@ func (p *windowsParser) validateMountConfigReg(mnt *mount.Mount, destRegex strin return &errMountConfig{mnt, err} } - exists, isdir, err := currentFileInfoProvider.fileInfo(mnt.Source) + exists, isdir, err := p.fi.fileInfo(mnt.Source) if err != nil { return &errMountConfig{mnt, err} } @@ -297,16 +292,16 @@ func (p *windowsParser) validateMountConfigReg(mnt *mount.Mount, destRegex strin } return nil } -func (p *windowsParser) ParseMountRaw(raw, volumeDriver string) (*MountPoint, error) { - return p.parseMountRaw(raw, volumeDriver, rxDestination, true, windowsSpecificValidators) -} -func (p *windowsParser) parseMountRaw(raw, volumeDriver, destRegex string, convertTargetToBackslash bool, additionalValidators ...mountValidator) (*MountPoint, error) { - arr, err := windowsSplitRawSpec(raw, destRegex) +func (p *windowsParser) ParseMountRaw(raw, volumeDriver string) (*MountPoint, error) { + arr, err := p.splitRawSpec(raw, windowsSplitRawSpecRegexp) if err != nil { return nil, err } + return p.parseMount(arr, raw, volumeDriver, true, windowsValidators) +} +func (p *windowsParser) parseMount(arr []string, raw, volumeDriver string, convertTargetToBackslash bool, additionalValidators ...mountValidator) (*MountPoint, error) { var spec mount.Mount var mode string switch len(arr) { @@ -320,18 +315,18 @@ func (p *windowsParser) parseMountRaw(raw, volumeDriver, destRegex string, conve return nil, errInvalidSpec(raw) } // Host Source Path or Name + Destination - spec.Source = strings.Replace(arr[0], `/`, `\`, -1) + spec.Source = strings.ReplaceAll(arr[0], `/`, `\`) spec.Target = arr[1] case 3: // HostSourcePath+DestinationPath+Mode - spec.Source = strings.Replace(arr[0], `/`, `\`, -1) + spec.Source = strings.ReplaceAll(arr[0], `/`, `\`) spec.Target = arr[1] mode = arr[2] default: return nil, errInvalidSpec(raw) } if convertTargetToBackslash { - spec.Target = strings.Replace(spec.Target, `/`, `\`, -1) + spec.Target = strings.ReplaceAll(spec.Target, `/`, `\`) } if !windowsValidMountMode(mode) { @@ -355,7 +350,7 @@ func (p *windowsParser) parseMountRaw(raw, volumeDriver, destRegex string, conve spec.VolumeOptions.NoCopy = !copyData } - mp, err := p.parseMountSpec(spec, destRegex, convertTargetToBackslash, additionalValidators...) + mp, err := p.parseMountSpec(spec, convertTargetToBackslash, additionalValidators...) if mp != nil { mp.Mode = mode } @@ -366,10 +361,11 @@ func (p *windowsParser) parseMountRaw(raw, volumeDriver, destRegex string, conve } func (p *windowsParser) ParseMountSpec(cfg mount.Mount) (*MountPoint, error) { - return p.parseMountSpec(cfg, rxDestination, true, windowsSpecificValidators) + return p.parseMountSpec(cfg, true, windowsValidators) } -func (p *windowsParser) parseMountSpec(cfg mount.Mount, destRegex string, convertTargetToBackslash bool, additionalValidators ...mountValidator) (*MountPoint, error) { - if err := p.validateMountConfigReg(&cfg, destRegex, additionalValidators...); err != nil { + +func (p *windowsParser) parseMountSpec(cfg mount.Mount, convertTargetToBackslash bool, additionalValidators ...mountValidator) (*MountPoint, error) { + if err := p.validateMountConfigReg(&cfg, additionalValidators...); err != nil { return nil, err } mp := &MountPoint{ @@ -379,7 +375,7 @@ func (p *windowsParser) parseMountSpec(cfg mount.Mount, destRegex string, conver Spec: cfg, } if convertTargetToBackslash { - mp.Destination = strings.Replace(cfg.Target, `/`, `\`, -1) + mp.Destination = strings.ReplaceAll(cfg.Target, `/`, `\`) } switch cfg.Type { @@ -400,9 +396,9 @@ func (p *windowsParser) parseMountSpec(cfg mount.Mount, destRegex string, conver } } case mount.TypeBind: - mp.Source = strings.Replace(cfg.Source, `/`, `\`, -1) + mp.Source = strings.ReplaceAll(cfg.Source, `/`, `\`) case mount.TypeNamedPipe: - mp.Source = strings.Replace(cfg.Source, `/`, `\`, -1) + mp.Source = strings.ReplaceAll(cfg.Source, `/`, `\`) } // cleanup trailing `\` except for paths like `c:\` if len(mp.Source) > 3 && mp.Source[len(mp.Source)-1] == '\\' { @@ -419,38 +415,42 @@ func (p *windowsParser) ParseVolumesFrom(spec string) (string, string, error) { return "", "", fmt.Errorf("volumes-from specification cannot be an empty string") } - specParts := strings.SplitN(spec, ":", 2) - id := specParts[0] - mode := "rw" + id, mode, _ := strings.Cut(spec, ":") + if mode == "" { + return id, "rw", nil + } - if len(specParts) == 2 { - mode = specParts[1] - if !windowsValidMountMode(mode) { - return "", "", errInvalidMode(mode) - } + if !windowsValidMountMode(mode) { + return "", "", errInvalidMode(mode) + } - // Do not allow copy modes on volumes-from - if _, isSet := getCopyMode(mode, p.DefaultCopyMode()); isSet { - return "", "", errInvalidMode(mode) - } + // Do not allow copy modes on volumes-from + if _, isSet := getCopyMode(mode, p.DefaultCopyMode()); isSet { + return "", "", errInvalidMode(mode) } return id, mode, nil } func (p *windowsParser) DefaultPropagationMode() mount.Propagation { - return mount.Propagation("") + return "" } func (p *windowsParser) ConvertTmpfsOptions(opt *mount.TmpfsOptions, readOnly bool) (string, error) { return "", fmt.Errorf("%s does not support tmpfs", runtime.GOOS) } + func (p *windowsParser) DefaultCopyMode() bool { return false } + func (p *windowsParser) IsBackwardCompatible(m *MountPoint) bool { return false } func (p *windowsParser) ValidateTmpfsMountDestination(dest string) error { - return errors.New("Platform does not support tmpfs") + return errors.New("platform does not support tmpfs") +} + +func (p *windowsParser) HasResource(m *MountPoint, absolutePath string) bool { + return false } diff --git a/vendor/github.com/docker/docker/volume/volume.go b/vendor/github.com/docker/docker/volume/volume.go index 61c8243979..2dcbdebe16 100644 --- a/vendor/github.com/docker/docker/volume/volume.go +++ b/vendor/github.com/docker/docker/volume/volume.go @@ -1,6 +1,7 @@ package volume // import "github.com/docker/docker/volume" import ( + "context" "time" ) @@ -60,6 +61,15 @@ type Volume interface { Status() map[string]interface{} } +// LiveRestorer is an optional interface that can be implemented by a volume driver +// It is used to restore any resources that are necessary for a volume to be used by a live-restored container +type LiveRestorer interface { + // LiveRestoreVolume allows a volume driver which implements this interface to restore any necessary resources (such as reference counting) + // This is called only after the daemon is restarted with live-restored containers + // It is called once per live-restored container. + LiveRestoreVolume(_ context.Context, ref string) error +} + // DetailedVolume wraps a Volume with user-defined labels, options, and cluster scope (e.g., `local` or `global`) type DetailedVolume interface { Labels() map[string]string diff --git a/vendor/github.com/fatih/color/README.md b/vendor/github.com/fatih/color/README.md index 5152bf59bf..be82827cac 100644 --- a/vendor/github.com/fatih/color/README.md +++ b/vendor/github.com/fatih/color/README.md @@ -7,7 +7,6 @@ suits you. ![Color](https://user-images.githubusercontent.com/438920/96832689-03b3e000-13f4-11eb-9803-46f4c4de3406.jpg) - ## Install ```bash @@ -124,17 +123,17 @@ fmt.Println("All text will now be bold magenta.") ``` ### Disable/Enable color - + There might be a case where you want to explicitly disable/enable color output. the `go-isatty` package will automatically disable color output for non-tty output streams (for example if the output were piped directly to `less`). The `color` package also disables color output if the [`NO_COLOR`](https://no-color.org) environment -variable is set (regardless of its value). +variable is set to a non-empty string. -`Color` has support to disable/enable colors programatically both globally and +`Color` has support to disable/enable colors programmatically both globally and for single color definitions. For example suppose you have a CLI app and a -`--no-color` bool flag. You can easily disable the color output with: +`-no-color` bool flag. You can easily disable the color output with: ```go var flagNoColor = flag.Bool("no-color", false, "Disable color output") @@ -167,11 +166,10 @@ To output color in GitHub Actions (or other CI systems that support ANSI colors) * Save/Return previous values * Evaluate fmt.Formatter interface - ## Credits - * [Fatih Arslan](https://github.com/fatih) - * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable) +* [Fatih Arslan](https://github.com/fatih) +* Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable) ## License diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go index 98a60f3c88..889f9e77bd 100644 --- a/vendor/github.com/fatih/color/color.go +++ b/vendor/github.com/fatih/color/color.go @@ -19,10 +19,10 @@ var ( // set (regardless of its value). This is a global option and affects all // colors. For more control over each color block use the methods // DisableColor() individually. - NoColor = noColorExists() || os.Getenv("TERM") == "dumb" || + NoColor = noColorIsSet() || os.Getenv("TERM") == "dumb" || (!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd())) - // Output defines the standard output of the print functions. By default + // Output defines the standard output of the print functions. By default, // os.Stdout is used. Output = colorable.NewColorableStdout() @@ -35,10 +35,9 @@ var ( colorsCacheMu sync.Mutex // protects colorsCache ) -// noColorExists returns true if the environment variable NO_COLOR exists. -func noColorExists() bool { - _, exists := os.LookupEnv("NO_COLOR") - return exists +// noColorIsSet returns true if the environment variable NO_COLOR is set to a non-empty string. +func noColorIsSet() bool { + return os.Getenv("NO_COLOR") != "" } // Color defines a custom color object which is defined by SGR parameters. @@ -120,7 +119,7 @@ func New(value ...Attribute) *Color { params: make([]Attribute, 0), } - if noColorExists() { + if noColorIsSet() { c.noColor = boolPtr(true) } @@ -152,7 +151,7 @@ func (c *Color) Set() *Color { return c } - fmt.Fprintf(Output, c.format()) + fmt.Fprint(Output, c.format()) return c } @@ -164,16 +163,21 @@ func (c *Color) unset() { Unset() } -func (c *Color) setWriter(w io.Writer) *Color { +// SetWriter is used to set the SGR sequence with the given io.Writer. This is +// a low-level function, and users should use the higher-level functions, such +// as color.Fprint, color.Print, etc. +func (c *Color) SetWriter(w io.Writer) *Color { if c.isNoColorSet() { return c } - fmt.Fprintf(w, c.format()) + fmt.Fprint(w, c.format()) return c } -func (c *Color) unsetWriter(w io.Writer) { +// UnsetWriter resets all escape attributes and clears the output with the give +// io.Writer. Usually should be called after SetWriter(). +func (c *Color) UnsetWriter(w io.Writer) { if c.isNoColorSet() { return } @@ -192,20 +196,14 @@ func (c *Color) Add(value ...Attribute) *Color { return c } -func (c *Color) prepend(value Attribute) { - c.params = append(c.params, 0) - copy(c.params[1:], c.params[0:]) - c.params[0] = value -} - // Fprint formats using the default formats for its operands and writes to w. // Spaces are added between operands when neither is a string. // It returns the number of bytes written and any write error encountered. // On Windows, users should wrap w with colorable.NewColorable() if w is of // type *os.File. func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) + c.SetWriter(w) + defer c.UnsetWriter(w) return fmt.Fprint(w, a...) } @@ -227,8 +225,8 @@ func (c *Color) Print(a ...interface{}) (n int, err error) { // On Windows, users should wrap w with colorable.NewColorable() if w is of // type *os.File. func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) + c.SetWriter(w) + defer c.UnsetWriter(w) return fmt.Fprintf(w, format, a...) } @@ -248,8 +246,8 @@ func (c *Color) Printf(format string, a ...interface{}) (n int, err error) { // On Windows, users should wrap w with colorable.NewColorable() if w is of // type *os.File. func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) + c.SetWriter(w) + defer c.UnsetWriter(w) return fmt.Fprintln(w, a...) } @@ -396,7 +394,7 @@ func (c *Color) DisableColor() { } // EnableColor enables the color output. Use it in conjunction with -// DisableColor(). Otherwise this method has no side effects. +// DisableColor(). Otherwise, this method has no side effects. func (c *Color) EnableColor() { c.noColor = boolPtr(false) } diff --git a/vendor/github.com/fatih/color/color_windows.go b/vendor/github.com/fatih/color/color_windows.go new file mode 100644 index 0000000000..be01c558e5 --- /dev/null +++ b/vendor/github.com/fatih/color/color_windows.go @@ -0,0 +1,19 @@ +package color + +import ( + "os" + + "golang.org/x/sys/windows" +) + +func init() { + // Opt-in for ansi color support for current process. + // https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#output-sequences + var outMode uint32 + out := windows.Handle(os.Stdout.Fd()) + if err := windows.GetConsoleMode(out, &outMode); err != nil { + return + } + outMode |= windows.ENABLE_PROCESSED_OUTPUT | windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING + _ = windows.SetConsoleMode(out, outMode) +} diff --git a/vendor/github.com/fatih/color/doc.go b/vendor/github.com/fatih/color/doc.go index 04541de786..9491ad5413 100644 --- a/vendor/github.com/fatih/color/doc.go +++ b/vendor/github.com/fatih/color/doc.go @@ -5,106 +5,105 @@ that suits you. Use simple and default helper functions with predefined foreground colors: - color.Cyan("Prints text in cyan.") + color.Cyan("Prints text in cyan.") - // a newline will be appended automatically - color.Blue("Prints %s in blue.", "text") + // a newline will be appended automatically + color.Blue("Prints %s in blue.", "text") - // More default foreground colors.. - color.Red("We have red") - color.Yellow("Yellow color too!") - color.Magenta("And many others ..") + // More default foreground colors.. + color.Red("We have red") + color.Yellow("Yellow color too!") + color.Magenta("And many others ..") - // Hi-intensity colors - color.HiGreen("Bright green color.") - color.HiBlack("Bright black means gray..") - color.HiWhite("Shiny white color!") + // Hi-intensity colors + color.HiGreen("Bright green color.") + color.HiBlack("Bright black means gray..") + color.HiWhite("Shiny white color!") -However there are times where custom color mixes are required. Below are some +However, there are times when custom color mixes are required. Below are some examples to create custom color objects and use the print functions of each separate color object. - // Create a new color object - c := color.New(color.FgCyan).Add(color.Underline) - c.Println("Prints cyan text with an underline.") + // Create a new color object + c := color.New(color.FgCyan).Add(color.Underline) + c.Println("Prints cyan text with an underline.") - // Or just add them to New() - d := color.New(color.FgCyan, color.Bold) - d.Printf("This prints bold cyan %s\n", "too!.") + // Or just add them to New() + d := color.New(color.FgCyan, color.Bold) + d.Printf("This prints bold cyan %s\n", "too!.") - // Mix up foreground and background colors, create new mixes! - red := color.New(color.FgRed) + // Mix up foreground and background colors, create new mixes! + red := color.New(color.FgRed) - boldRed := red.Add(color.Bold) - boldRed.Println("This will print text in bold red.") + boldRed := red.Add(color.Bold) + boldRed.Println("This will print text in bold red.") - whiteBackground := red.Add(color.BgWhite) - whiteBackground.Println("Red text with White background.") + whiteBackground := red.Add(color.BgWhite) + whiteBackground.Println("Red text with White background.") - // Use your own io.Writer output - color.New(color.FgBlue).Fprintln(myWriter, "blue color!") + // Use your own io.Writer output + color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - blue := color.New(color.FgBlue) - blue.Fprint(myWriter, "This will print text in blue.") + blue := color.New(color.FgBlue) + blue.Fprint(myWriter, "This will print text in blue.") You can create PrintXxx functions to simplify even more: - // Create a custom print function for convenient - red := color.New(color.FgRed).PrintfFunc() - red("warning") - red("error: %s", err) + // Create a custom print function for convenient + red := color.New(color.FgRed).PrintfFunc() + red("warning") + red("error: %s", err) - // Mix up multiple attributes - notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() - notice("don't forget this...") + // Mix up multiple attributes + notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() + notice("don't forget this...") You can also FprintXxx functions to pass your own io.Writer: - blue := color.New(FgBlue).FprintfFunc() - blue(myWriter, "important notice: %s", stars) - - // Mix up with multiple attributes - success := color.New(color.Bold, color.FgGreen).FprintlnFunc() - success(myWriter, don't forget this...") + blue := color.New(FgBlue).FprintfFunc() + blue(myWriter, "important notice: %s", stars) + // Mix up with multiple attributes + success := color.New(color.Bold, color.FgGreen).FprintlnFunc() + success(myWriter, don't forget this...") Or create SprintXxx functions to mix strings with other non-colorized strings: - yellow := New(FgYellow).SprintFunc() - red := New(FgRed).SprintFunc() + yellow := New(FgYellow).SprintFunc() + red := New(FgRed).SprintFunc() - fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error")) + fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error")) - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Printf("this %s rocks!\n", info("package")) + info := New(FgWhite, BgGreen).SprintFunc() + fmt.Printf("this %s rocks!\n", info("package")) Windows support is enabled by default. All Print functions work as intended. -However only for color.SprintXXX functions, user should use fmt.FprintXXX and +However, only for color.SprintXXX functions, user should use fmt.FprintXXX and set the output to color.Output: - fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) + fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Fprintf(color.Output, "this %s rocks!\n", info("package")) + info := New(FgWhite, BgGreen).SprintFunc() + fmt.Fprintf(color.Output, "this %s rocks!\n", info("package")) Using with existing code is possible. Just use the Set() method to set the standard output to the given parameters. That way a rewrite of an existing code is not required. - // Use handy standard colors. - color.Set(color.FgYellow) + // Use handy standard colors. + color.Set(color.FgYellow) - fmt.Println("Existing text will be now in Yellow") - fmt.Printf("This one %s\n", "too") + fmt.Println("Existing text will be now in Yellow") + fmt.Printf("This one %s\n", "too") - color.Unset() // don't forget to unset + color.Unset() // don't forget to unset - // You can mix up parameters - color.Set(color.FgMagenta, color.Bold) - defer color.Unset() // use it in your function + // You can mix up parameters + color.Set(color.FgMagenta, color.Bold) + defer color.Unset() // use it in your function - fmt.Println("All text will be now bold magenta.") + fmt.Println("All text will be now bold magenta.") There might be a case where you want to disable color output (for example to pipe the standard output of your app to somewhere else). `Color` has support to @@ -112,24 +111,24 @@ disable colors both globally and for single color definition. For example suppose you have a CLI app and a `--no-color` bool flag. You can easily disable the color output with: - var flagNoColor = flag.Bool("no-color", false, "Disable color output") + var flagNoColor = flag.Bool("no-color", false, "Disable color output") - if *flagNoColor { - color.NoColor = true // disables colorized output - } + if *flagNoColor { + color.NoColor = true // disables colorized output + } You can also disable the color by setting the NO_COLOR environment variable to any value. It also has support for single color definitions (local). You can disable/enable color output on the fly: - c := color.New(color.FgCyan) - c.Println("Prints cyan text") + c := color.New(color.FgCyan) + c.Println("Prints cyan text") - c.DisableColor() - c.Println("This is printed without any color") + c.DisableColor() + c.Println("This is printed without any color") - c.EnableColor() - c.Println("This prints again cyan...") + c.EnableColor() + c.Println("This prints again cyan...") */ package color diff --git a/vendor/github.com/go-git/gcfg/.gitignore b/vendor/github.com/go-git/gcfg/.gitignore new file mode 100644 index 0000000000..2d830686d4 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/.gitignore @@ -0,0 +1 @@ +coverage.out diff --git a/vendor/github.com/go-git/gcfg/Makefile b/vendor/github.com/go-git/gcfg/Makefile new file mode 100644 index 0000000000..73604da6b6 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/Makefile @@ -0,0 +1,17 @@ +# General +WORKDIR = $(PWD) + +# Go parameters +GOCMD = go +GOTEST = $(GOCMD) test + +# Coverage +COVERAGE_REPORT = coverage.out +COVERAGE_MODE = count + +test: + $(GOTEST) ./... + +test-coverage: + echo "" > $(COVERAGE_REPORT); \ + $(GOTEST) -coverprofile=$(COVERAGE_REPORT) -coverpkg=./... -covermode=$(COVERAGE_MODE) ./... diff --git a/vendor/github.com/go-git/gcfg/go1_0.go b/vendor/github.com/go-git/gcfg/go1_0.go deleted file mode 100644 index 6670210791..0000000000 --- a/vendor/github.com/go-git/gcfg/go1_0.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !go1.2 - -package gcfg - -type textUnmarshaler interface { - UnmarshalText(text []byte) error -} diff --git a/vendor/github.com/go-git/gcfg/go1_2.go b/vendor/github.com/go-git/gcfg/go1_2.go deleted file mode 100644 index 6f5843bc7c..0000000000 --- a/vendor/github.com/go-git/gcfg/go1_2.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build go1.2 - -package gcfg - -import ( - "encoding" -) - -type textUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/go-git/gcfg/read.go b/vendor/github.com/go-git/gcfg/read.go index 4dfdc5cf30..ea5d2edd06 100644 --- a/vendor/github.com/go-git/gcfg/read.go +++ b/vendor/github.com/go-git/gcfg/read.go @@ -3,16 +3,16 @@ package gcfg import ( "fmt" "io" - "io/ioutil" "os" "strings" + "gopkg.in/warnings.v0" + "github.com/go-git/gcfg/scanner" "github.com/go-git/gcfg/token" - "gopkg.in/warnings.v0" ) -var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t', 'b': '\b'} +var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t', 'b': '\b', '\n': '\n'} // no error: invalid literals should be caught by scanner func unquote(s string) string { @@ -224,7 +224,7 @@ func readInto(config interface{}, fset *token.FileSet, file *token.File, // // If callback returns an error, ReadWithCallback terminates with an error too. func ReadWithCallback(reader io.Reader, callback func(string, string, string, string, bool) error) error { - src, err := ioutil.ReadAll(reader) + src, err := io.ReadAll(reader) if err != nil { return err } @@ -239,7 +239,7 @@ func ReadWithCallback(reader io.Reader, callback func(string, string, string, st // ReadInto reads gcfg formatted data from reader and sets the values into the // corresponding fields in config. func ReadInto(config interface{}, reader io.Reader) error { - src, err := ioutil.ReadAll(reader) + src, err := io.ReadAll(reader) if err != nil { return err } @@ -263,7 +263,7 @@ func ReadFileInto(config interface{}, filename string) error { return err } defer f.Close() - src, err := ioutil.ReadAll(f) + src, err := io.ReadAll(f) if err != nil { return err } diff --git a/vendor/github.com/go-git/gcfg/scanner/scanner.go b/vendor/github.com/go-git/gcfg/scanner/scanner.go index 41aafec758..b3da03d0eb 100644 --- a/vendor/github.com/go-git/gcfg/scanner/scanner.go +++ b/vendor/github.com/go-git/gcfg/scanner/scanner.go @@ -8,7 +8,6 @@ // // Note that the API for the scanner package may change to accommodate new // features or implementation changes in gcfg. -// package scanner import ( @@ -16,9 +15,7 @@ import ( "path/filepath" "unicode" "unicode/utf8" -) -import ( "github.com/go-git/gcfg/token" ) @@ -26,13 +23,11 @@ import ( // encountered and a handler was installed, the handler is called with a // position and an error message. The position points to the beginning of // the offending token. -// type ErrorHandler func(pos token.Position, msg string) // A Scanner holds the scanner's internal state while processing // a given text. It can be allocated as part of another data // structure but must be initialized via Init before use. -// type Scanner struct { // immutable state file *token.File // source file handle @@ -54,7 +49,6 @@ type Scanner struct { // Read the next Unicode char into s.ch. // s.ch < 0 means end-of-file. -// func (s *Scanner) next() { if s.rdOffset < len(s.src) { s.offset = s.rdOffset @@ -87,7 +81,6 @@ func (s *Scanner) next() { // A mode value is a set of flags (or 0). // They control scanner behavior. -// type Mode uint const ( @@ -108,7 +101,6 @@ const ( // // Note that Init may call err if there is an error in the first character // of the file. -// func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode) { // Explicitly initialize all fields since a scanner may be reused. if file.Size() != len(src) { @@ -163,12 +155,13 @@ func (s *Scanner) scanIdentifier() string { return string(s.src[offs:s.offset]) } +// val indicate if we are scanning a value (vs a header) func (s *Scanner) scanEscape(val bool) { offs := s.offset ch := s.ch s.next() // always make progress switch ch { - case '\\', '"': + case '\\', '"', '\n': // ok case 'n', 't', 'b': if val { @@ -289,7 +282,6 @@ func (s *Scanner) skipWhitespace() { // Scan adds line information to the file added to the file // set with Init. Token positions are relative to that file // and thus relative to the file set. -// func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string) { scanAgain: s.skipWhitespace() diff --git a/vendor/github.com/go-git/gcfg/set.go b/vendor/github.com/go-git/gcfg/set.go index e2d9278025..dc9795dbdb 100644 --- a/vendor/github.com/go-git/gcfg/set.go +++ b/vendor/github.com/go-git/gcfg/set.go @@ -2,6 +2,7 @@ package gcfg import ( "bytes" + "encoding" "encoding/gob" "fmt" "math/big" @@ -10,8 +11,9 @@ import ( "unicode" "unicode/utf8" - "github.com/go-git/gcfg/types" "gopkg.in/warnings.v0" + + "github.com/go-git/gcfg/types" ) type tag struct { @@ -65,7 +67,7 @@ var setters = []setter{ } func textUnmarshalerSetter(d interface{}, blank bool, val string, t tag) error { - dtu, ok := d.(textUnmarshaler) + dtu, ok := d.(encoding.TextUnmarshaler) if !ok { return errUnsupportedType } diff --git a/vendor/github.com/go-git/go-billy/v5/memfs/memory.go b/vendor/github.com/go-git/go-billy/v5/memfs/memory.go index f217693e6f..dab73968b6 100644 --- a/vendor/github.com/go-git/go-billy/v5/memfs/memory.go +++ b/vendor/github.com/go-git/go-billy/v5/memfs/memory.go @@ -310,14 +310,14 @@ func (f *file) Duplicate(filename string, mode os.FileMode, flag int) billy.File flag: flag, } - if isAppend(flag) { - new.position = int64(new.content.Len()) - } - if isTruncate(flag) { new.content.Truncate() } + if isAppend(flag) { + new.position = int64(new.content.Len()) + } + return new } diff --git a/vendor/github.com/go-git/go-git/v5/.gitignore b/vendor/github.com/go-git/go-git/v5/.gitignore index e8d25f5483..361133d03d 100644 --- a/vendor/github.com/go-git/go-git/v5/.gitignore +++ b/vendor/github.com/go-git/go-git/v5/.gitignore @@ -2,4 +2,5 @@ coverage.out *~ coverage.txt profile.out -.tmp/ \ No newline at end of file +.tmp/ +.git-dist/ diff --git a/vendor/github.com/go-git/go-git/v5/Makefile b/vendor/github.com/go-git/go-git/v5/Makefile index d10922fb10..66adc8cedc 100644 --- a/vendor/github.com/go-git/go-git/v5/Makefile +++ b/vendor/github.com/go-git/go-git/v5/Makefile @@ -27,7 +27,13 @@ build-git: test: @echo "running against `git version`"; \ - $(GOTEST) ./... + $(GOTEST) -race ./... + +TEMP_REPO := $(shell mktemp) +test-sha256: + $(GOCMD) run -tags sha256 _examples/sha256/main.go $(TEMP_REPO) + cd $(TEMP_REPO) && git fsck + rm -rf $(TEMP_REPO) test-coverage: @echo "running against `git version`"; \ @@ -35,4 +41,4 @@ test-coverage: $(GOTEST) -coverprofile=$(COVERAGE_REPORT) -coverpkg=./... -covermode=$(COVERAGE_MODE) ./... clean: - rm -rf $(GIT_DIST_PATH) \ No newline at end of file + rm -rf $(GIT_DIST_PATH) diff --git a/vendor/github.com/go-git/go-git/v5/config/config.go b/vendor/github.com/go-git/go-git/v5/config/config.go index 8051bc1455..82af12d282 100644 --- a/vendor/github.com/go-git/go-git/v5/config/config.go +++ b/vendor/github.com/go-git/go-git/v5/config/config.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "os" "path/filepath" "sort" @@ -59,6 +58,8 @@ type Config struct { // CommentChar is the character indicating the start of a // comment for commands like commit and tag CommentChar string + // RepositoryFormatVersion identifies the repository format and layout version. + RepositoryFormatVersion format.RepositoryFormatVersion } User struct { @@ -96,6 +97,17 @@ type Config struct { DefaultBranch string } + Extensions struct { + // ObjectFormat specifies the hash algorithm to use. The + // acceptable values are sha1 and sha256. If not specified, + // sha1 is assumed. It is an error to specify this key unless + // core.repositoryFormatVersion is 1. + // + // This setting must not be changed after repository initialization + // (e.g. clone or init). + ObjectFormat format.ObjectFormat + } + // Remotes list of repository remotes, the key of the map is the name // of the remote, should equal to RemoteConfig.Name. Remotes map[string]*RemoteConfig @@ -131,7 +143,7 @@ func NewConfig() *Config { // ReadConfig reads a config file from a io.Reader. func ReadConfig(r io.Reader) (*Config, error) { - b, err := ioutil.ReadAll(r) + b, err := io.ReadAll(r) if err != nil { return nil, err } @@ -226,28 +238,32 @@ func (c *Config) Validate() error { } const ( - remoteSection = "remote" - submoduleSection = "submodule" - branchSection = "branch" - coreSection = "core" - packSection = "pack" - userSection = "user" - authorSection = "author" - committerSection = "committer" - initSection = "init" - urlSection = "url" - fetchKey = "fetch" - urlKey = "url" - bareKey = "bare" - worktreeKey = "worktree" - commentCharKey = "commentChar" - windowKey = "window" - mergeKey = "merge" - rebaseKey = "rebase" - nameKey = "name" - emailKey = "email" - descriptionKey = "description" - defaultBranchKey = "defaultBranch" + remoteSection = "remote" + submoduleSection = "submodule" + branchSection = "branch" + coreSection = "core" + packSection = "pack" + userSection = "user" + authorSection = "author" + committerSection = "committer" + initSection = "init" + urlSection = "url" + extensionsSection = "extensions" + fetchKey = "fetch" + urlKey = "url" + bareKey = "bare" + worktreeKey = "worktree" + commentCharKey = "commentChar" + windowKey = "window" + mergeKey = "merge" + rebaseKey = "rebase" + nameKey = "name" + emailKey = "email" + descriptionKey = "description" + defaultBranchKey = "defaultBranch" + repositoryFormatVersionKey = "repositoryformatversion" + objectFormat = "objectformat" + mirrorKey = "mirror" // DefaultPackWindow holds the number of previous objects used to // generate deltas. The value 10 is the same used by git command. @@ -391,6 +407,7 @@ func (c *Config) unmarshalInit() { // Marshal returns Config encoded as a git-config file. func (c *Config) Marshal() ([]byte, error) { c.marshalCore() + c.marshalExtensions() c.marshalUser() c.marshalPack() c.marshalRemotes() @@ -410,12 +427,24 @@ func (c *Config) Marshal() ([]byte, error) { func (c *Config) marshalCore() { s := c.Raw.Section(coreSection) s.SetOption(bareKey, fmt.Sprintf("%t", c.Core.IsBare)) + if string(c.Core.RepositoryFormatVersion) != "" { + s.SetOption(repositoryFormatVersionKey, string(c.Core.RepositoryFormatVersion)) + } if c.Core.Worktree != "" { s.SetOption(worktreeKey, c.Core.Worktree) } } +func (c *Config) marshalExtensions() { + // Extensions are only supported on Version 1, therefore + // ignore them otherwise. + if c.Core.RepositoryFormatVersion == format.Version_1 { + s := c.Raw.Section(extensionsSection) + s.SetOption(objectFormat, string(c.Extensions.ObjectFormat)) + } +} + func (c *Config) marshalUser() { s := c.Raw.Section(userSection) if c.User.Name != "" { @@ -549,6 +578,8 @@ type RemoteConfig struct { // URLs the URLs of a remote repository. It must be non-empty. Fetch will // always use the first URL, while push will use all of them. URLs []string + // Mirror indicates that the repository is a mirror of remote. + Mirror bool // insteadOfRulesApplied have urls been modified insteadOfRulesApplied bool @@ -602,6 +633,7 @@ func (c *RemoteConfig) unmarshal(s *format.Subsection) error { c.Name = c.raw.Name c.URLs = append([]string(nil), c.raw.Options.GetAll(urlKey)...) c.Fetch = fetch + c.Mirror = c.raw.Options.Get(mirrorKey) == "true" return nil } @@ -634,6 +666,10 @@ func (c *RemoteConfig) marshal() *format.Subsection { c.raw.SetOption(fetchKey, values...) } + if c.Mirror { + c.raw.SetOption(mirrorKey, strconv.FormatBool(c.Mirror)) + } + return c.raw } diff --git a/vendor/github.com/go-git/go-git/v5/internal/url/url.go b/vendor/github.com/go-git/go-git/v5/internal/url/url.go index 14cf133de8..2662448693 100644 --- a/vendor/github.com/go-git/go-git/v5/internal/url/url.go +++ b/vendor/github.com/go-git/go-git/v5/internal/url/url.go @@ -5,8 +5,10 @@ import ( ) var ( - isSchemeRegExp = regexp.MustCompile(`^[^:]+://`) - scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P[^@]+)@)?(?P[^:\s]+):(?:(?P[0-9]{1,5})(?:\/|:))?(?P[^\\].*\/[^\\].*)$`) + isSchemeRegExp = regexp.MustCompile(`^[^:]+://`) + + // Ref: https://github.com/git/git/blob/master/Documentation/urls.txt#L37 + scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P[^@]+)@)?(?P[^:\s]+):(?:(?P[0-9]{1,5}):)?(?P[^\\].*)$`) ) // MatchesScheme returns true if the given string matches a URL-like diff --git a/vendor/github.com/go-git/go-git/v5/options.go b/vendor/github.com/go-git/go-git/v5/options.go index 747d512bc1..d607b3078d 100644 --- a/vendor/github.com/go-git/go-git/v5/options.go +++ b/vendor/github.com/go-git/go-git/v5/options.go @@ -10,6 +10,7 @@ import ( "github.com/ProtonMail/go-crypto/openpgp" "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing" + formatcfg "github.com/go-git/go-git/v5/plumbing/format/config" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" "github.com/go-git/go-git/v5/plumbing/transport" @@ -45,6 +46,14 @@ type CloneOptions struct { ReferenceName plumbing.ReferenceName // Fetch only ReferenceName if true. SingleBranch bool + // Mirror clones the repository as a mirror. + // + // Compared to a bare clone, mirror not only maps local branches of the + // source to local branches of the target, it maps all refs (including + // remote-tracking branches, notes etc.) and sets up a refspec configuration + // such that all these refs are overwritten by a git remote update in the + // target repository. + Mirror bool // No checkout of HEAD after clone if true. NoCheckout bool // Limit fetching to the specified number of commits. @@ -64,6 +73,8 @@ type CloneOptions struct { InsecureSkipTLS bool // CABundle specify additional ca bundle with system cert pool CABundle []byte + // ProxyOptions provides info required for connecting to a proxy. + ProxyOptions transport.ProxyOptions } // Validate validates the fields and sets the default values. @@ -115,6 +126,8 @@ type PullOptions struct { InsecureSkipTLS bool // CABundle specify additional ca bundle with system cert pool CABundle []byte + // ProxyOptions provides info required for connecting to a proxy. + ProxyOptions transport.ProxyOptions } // Validate validates the fields and sets the default values. @@ -171,6 +184,8 @@ type FetchOptions struct { InsecureSkipTLS bool // CABundle specify additional ca bundle with system cert pool CABundle []byte + // ProxyOptions provides info required for connecting to a proxy. + ProxyOptions transport.ProxyOptions } // Validate validates the fields and sets the default values. @@ -234,6 +249,8 @@ type PushOptions struct { Options map[string]string // Atomic sets option to be an atomic push Atomic bool + // ProxyOptions provides info required for connecting to a proxy. + ProxyOptions transport.ProxyOptions } // ForceWithLease sets fields on the lease @@ -283,6 +300,9 @@ type SubmoduleUpdateOptions struct { RecurseSubmodules SubmoduleRescursivity // Auth credentials, if required, to use with the remote repository. Auth transport.AuthMethod + // Depth limit fetching to the specified number of commits from the tip of + // each remote branch history. + Depth int } var ( @@ -615,8 +635,31 @@ type ListOptions struct { InsecureSkipTLS bool // CABundle specify additional ca bundle with system cert pool CABundle []byte + // PeelingOption defines how peeled objects are handled during a + // remote list. + PeelingOption PeelingOption + // ProxyOptions provides info required for connecting to a proxy. + ProxyOptions transport.ProxyOptions + // Timeout specifies the timeout in seconds for list operations + Timeout int } +// PeelingOption represents the different ways to handle peeled references. +// +// Peeled references represent the underlying object of an annotated +// (or signed) tag. Refer to upstream documentation for more info: +// https://github.com/git/git/blob/master/Documentation/technical/reftable.txt +type PeelingOption uint8 + +const ( + // IgnorePeeled ignores all peeled reference names. This is the default behavior. + IgnorePeeled PeelingOption = 0 + // OnlyPeeled returns only peeled reference names. + OnlyPeeled PeelingOption = 1 + // AppendPeeled appends peeled reference names to the reference list. + AppendPeeled PeelingOption = 2 +) + // CleanOptions describes how a clean should be performed. type CleanOptions struct { Dir bool @@ -641,7 +684,13 @@ var ( ) // Validate validates the fields and sets the default values. +// +// TODO: deprecate in favor of Validate(r *Repository) in v6. func (o *GrepOptions) Validate(w *Worktree) error { + return o.validate(w.r) +} + +func (o *GrepOptions) validate(r *Repository) error { if !o.CommitHash.IsZero() && o.ReferenceName != "" { return ErrHashOrReference } @@ -649,7 +698,7 @@ func (o *GrepOptions) Validate(w *Worktree) error { // If none of CommitHash and ReferenceName are provided, set commit hash of // the repository's head. if o.CommitHash.IsZero() && o.ReferenceName == "" { - ref, err := w.r.Head() + ref, err := r.Head() if err != nil { return err } @@ -672,3 +721,10 @@ type PlainOpenOptions struct { // Validate validates the fields and sets the default values. func (o *PlainOpenOptions) Validate() error { return nil } + +type PlainInitOptions struct { + ObjectFormat formatcfg.ObjectFormat +} + +// Validate validates the fields and sets the default values. +func (o *PlainInitOptions) Validate() error { return nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/format.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/format.go new file mode 100644 index 0000000000..4873ea9258 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/format.go @@ -0,0 +1,53 @@ +package config + +// RepositoryFormatVersion represents the repository format version, +// as per defined at: +// +// https://git-scm.com/docs/repository-version +type RepositoryFormatVersion string + +const ( + // Version_0 is the format defined by the initial version of git, + // including but not limited to the format of the repository + // directory, the repository configuration file, and the object + // and ref storage. + // + // Specifying the complete behavior of git is beyond the scope + // of this document. + Version_0 = "0" + + // Version_1 is identical to version 0, with the following exceptions: + // + // 1. When reading the core.repositoryformatversion variable, a git + // implementation which supports version 1 MUST also read any + // configuration keys found in the extensions section of the + // configuration file. + // + // 2. If a version-1 repository specifies any extensions.* keys that + // the running git has not implemented, the operation MUST NOT proceed. + // Similarly, if the value of any known key is not understood by the + // implementation, the operation MUST NOT proceed. + // + // Note that if no extensions are specified in the config file, then + // core.repositoryformatversion SHOULD be set to 0 (setting it to 1 provides + // no benefit, and makes the repository incompatible with older + // implementations of git). + Version_1 = "1" + + // DefaultRepositoryFormatVersion holds the default repository format version. + DefaultRepositoryFormatVersion = Version_0 +) + +// ObjectFormat defines the object format. +type ObjectFormat string + +const ( + // SHA1 represents the object format used for SHA1. + SHA1 ObjectFormat = "sha1" + + // SHA256 represents the object format used for SHA256. + SHA256 ObjectFormat = "sha256" + + // DefaultObjectFormat holds the default object format. + DefaultObjectFormat = SHA1 +) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go index 15bc9c779f..bb786557c8 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go @@ -3,7 +3,7 @@ package gitignore import ( "bufio" "bytes" - "io/ioutil" + "io" "os" "strings" @@ -86,7 +86,7 @@ func loadPatterns(fs billy.Filesystem, path string) (ps []Pattern, err error) { defer gioutil.CheckClose(f, &err) - b, err := ioutil.ReadAll(f) + b, err := io.ReadAll(f) if err != nil { return } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go index 51a3904894..9afdce3011 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go @@ -6,6 +6,7 @@ import ( "errors" "io" + "github.com/go-git/go-git/v5/plumbing/hash" "github.com/go-git/go-git/v5/utils/binary" ) @@ -19,7 +20,7 @@ var ( const ( fanout = 256 - objectIDLength = 20 + objectIDLength = hash.Size ) // Decoder reads and decodes idx files from an input stream. diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go index 6ac445ff6e..75147376b6 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go @@ -1,7 +1,6 @@ package idxfile import ( - "crypto" "io" "github.com/go-git/go-git/v5/plumbing/hash" @@ -16,7 +15,7 @@ type Encoder struct { // NewEncoder returns a new stream encoder that writes to w. func NewEncoder(w io.Writer) *Encoder { - h := hash.New(crypto.SHA1) + h := hash.New(hash.CryptoType) mw := io.MultiWriter(w, h) return &Encoder{mw, h} } @@ -133,10 +132,10 @@ func (e *Encoder) encodeChecksums(idx *MemoryIndex) (int, error) { return 0, err } - copy(idx.IdxChecksum[:], e.hash.Sum(nil)[:20]) + copy(idx.IdxChecksum[:], e.hash.Sum(nil)[:hash.Size]) if _, err := e.Write(idx.IdxChecksum[:]); err != nil { return 0, err } - return 40, nil + return hash.HexSize, nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go index 64dd8dcef4..9237a74342 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go @@ -8,6 +8,7 @@ import ( encbin "encoding/binary" "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/hash" ) const ( @@ -53,8 +54,8 @@ type MemoryIndex struct { Offset32 [][]byte CRC32 [][]byte Offset64 []byte - PackfileChecksum [20]byte - IdxChecksum [20]byte + PackfileChecksum [hash.Size]byte + IdxChecksum [hash.Size]byte offsetHash map[int64]plumbing.Hash offsetHashIsFull bool diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go index daa160502a..c4c21e1676 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go @@ -84,11 +84,8 @@ func (w *Writer) OnFooter(h plumbing.Hash) error { w.checksum = h w.finished = true _, err := w.createIndex() - if err != nil { - return err - } - return nil + return err } // creatIndex returns a filled MemoryIndex with the information filled by @@ -139,15 +136,23 @@ func (w *Writer) createIndex() (*MemoryIndex, error) { offset := o.Offset if offset > math.MaxInt32 { - offset = w.addOffset64(offset) + var err error + offset, err = w.addOffset64(offset) + if err != nil { + return nil, err + } } buf.Truncate(0) - binary.WriteUint32(buf, uint32(offset)) + if err := binary.WriteUint32(buf, uint32(offset)); err != nil { + return nil, err + } idx.Offset32[bucket] = append(idx.Offset32[bucket], buf.Bytes()...) buf.Truncate(0) - binary.WriteUint32(buf, o.CRC32) + if err := binary.WriteUint32(buf, o.CRC32); err != nil { + return nil, err + } idx.CRC32[bucket] = append(idx.CRC32[bucket], buf.Bytes()...) } @@ -161,15 +166,17 @@ func (w *Writer) createIndex() (*MemoryIndex, error) { return idx, nil } -func (w *Writer) addOffset64(pos uint64) uint64 { +func (w *Writer) addOffset64(pos uint64) (uint64, error) { buf := new(bytes.Buffer) - binary.WriteUint64(buf, pos) - w.index.Offset64 = append(w.index.Offset64, buf.Bytes()...) + if err := binary.WriteUint64(buf, pos); err != nil { + return 0, err + } + w.index.Offset64 = append(w.index.Offset64, buf.Bytes()...) index := uint64(w.offset64 | (1 << 31)) w.offset64++ - return index + return index, nil } func (o objects) Len() int { diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go index c4da20c088..6778cf74ec 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go @@ -3,10 +3,9 @@ package index import ( "bufio" "bytes" - "crypto" "errors" "io" - "io/ioutil" + "strconv" "time" @@ -49,7 +48,7 @@ type Decoder struct { // NewDecoder returns a new decoder that reads from r. func NewDecoder(r io.Reader) *Decoder { - h := hash.New(crypto.SHA1) + h := hash.New(hash.CryptoType) return &Decoder{ r: io.TeeReader(r, h), hash: h, @@ -202,7 +201,7 @@ func (d *Decoder) padEntry(idx *Index, e *Entry, read int) error { entrySize := read + len(e.Name) padLen := 8 - entrySize%8 - _, err := io.CopyN(ioutil.Discard, d.r, int64(padLen)) + _, err := io.CopyN(io.Discard, d.r, int64(padLen)) return err } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go index a91537870c..fa2d814454 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go @@ -2,7 +2,6 @@ package index import ( "bytes" - "crypto" "errors" "io" "sort" @@ -29,7 +28,7 @@ type Encoder struct { // NewEncoder returns a new encoder that writes to w. func NewEncoder(w io.Writer) *Encoder { - h := hash.New(crypto.SHA1) + h := hash.New(hash.CryptoType) mw := io.MultiWriter(w, h) return &Encoder{mw, h} } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go index a8a7e967bf..804f5a876b 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go @@ -2,7 +2,6 @@ package packfile import ( "compress/zlib" - "crypto" "fmt" "io" @@ -29,7 +28,7 @@ type Encoder struct { // OFSDeltaObject. To use Reference deltas, set useRefDeltas to true. func NewEncoder(w io.Writer, s storer.EncodedObjectStorer, useRefDeltas bool) *Encoder { h := plumbing.Hasher{ - Hash: hash.New(crypto.SHA1), + Hash: hash.New(hash.CryptoType), } mw := io.MultiWriter(w, h) ow := newOffsetWriter(mw) @@ -132,11 +131,7 @@ func (e *Encoder) entry(o *ObjectToPack) (err error) { defer ioutil.CheckClose(or, &err) _, err = io.Copy(e.zw, or) - if err != nil { - return err - } - - return nil + return err } func (e *Encoder) writeBaseIfDelta(o *ObjectToPack) error { diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go index 522c146f29..edbc0e796b 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go @@ -4,7 +4,6 @@ import ( "bytes" "errors" "io" - stdioutil "io/ioutil" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/cache" @@ -237,6 +236,15 @@ func (p *Parser) indexObjects() error { return err } + // Move children of placeholder parent into actual parent, in case this + // was a non-external delta reference. + if placeholder, ok := p.oiByHash[sha1]; ok { + ota.Children = placeholder.Children + for _, c := range ota.Children { + c.Parent = ota + } + } + ota.SHA1 = sha1 p.oiByHash[ota.SHA1] = ota } @@ -288,7 +296,7 @@ func (p *Parser) resolveDeltas() error { if !obj.IsDelta() && len(obj.Children) > 0 { for _, child := range obj.Children { - if err := p.resolveObject(stdioutil.Discard, child, content); err != nil { + if err := p.resolveObject(io.Discard, child, content); err != nil { return err } p.resolveExternalRef(child) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go index 9ebb84a24a..730343ee39 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go @@ -7,7 +7,6 @@ import ( "hash" "hash/crc32" "io" - stdioutil "io/ioutil" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/utils/binary" @@ -242,7 +241,7 @@ func (s *Scanner) discardObjectIfNeeded() error { } h := s.pendingObject - n, _, err := s.NextObject(stdioutil.Discard) + n, _, err := s.NextObject(io.Discard) if err != nil { return err } @@ -381,7 +380,7 @@ func (s *Scanner) Checksum() (plumbing.Hash, error) { // Close reads the reader until io.EOF func (s *Scanner) Close() error { buf := sync.GetByteSlice() - _, err := io.CopyBuffer(stdioutil.Discard, s.r, *buf) + _, err := io.CopyBuffer(io.Discard, s.r, *buf) sync.PutByteSlice(buf) return err diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/hash.go b/vendor/github.com/go-git/go-git/v5/plumbing/hash.go index 2fab7593bf..39bb73fbb4 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/hash.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/hash.go @@ -2,7 +2,6 @@ package plumbing import ( "bytes" - "crypto" "encoding/hex" "sort" "strconv" @@ -11,7 +10,7 @@ import ( ) // Hash SHA1 hashed content -type Hash [20]byte +type Hash [hash.Size]byte // ZeroHash is Hash with value zero var ZeroHash Hash @@ -47,7 +46,7 @@ type Hasher struct { } func NewHasher(t ObjectType, size int64) Hasher { - h := Hasher{hash.New(crypto.SHA1)} + h := Hasher{hash.New(hash.CryptoType)} h.Write(t.Bytes()) h.Write([]byte(" ")) h.Write([]byte(strconv.FormatInt(size, 10))) @@ -75,10 +74,11 @@ func (p HashSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } // IsHash returns true if the given string is a valid hash. func IsHash(s string) bool { - if len(s) != 40 { + switch len(s) { + case hash.HexSize: + _, err := hex.DecodeString(s) + return err == nil + default: return false } - - _, err := hex.DecodeString(s) - return err == nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash.go b/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash.go index 80e4b5f254..82d1856167 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash.go @@ -21,6 +21,7 @@ func init() { // that registers new algorithms to avoid side effects. func reset() { algos[crypto.SHA1] = sha1cd.New + algos[crypto.SHA256] = crypto.SHA256.New } // RegisterHash allows for the hash algorithm used to be overriden. @@ -34,6 +35,8 @@ func RegisterHash(h crypto.Hash, f func() hash.Hash) error { switch h { case crypto.SHA1: algos[h] = f + case crypto.SHA256: + algos[h] = f default: return fmt.Errorf("unsupported hash function: %v", h) } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha1.go b/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha1.go new file mode 100644 index 0000000000..e3cb60fec9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha1.go @@ -0,0 +1,15 @@ +//go:build !sha256 +// +build !sha256 + +package hash + +import "crypto" + +const ( + // CryptoType defines what hash algorithm is being used. + CryptoType = crypto.SHA1 + // Size defines the amount of bytes the hash yields. + Size = 20 + // HexSize defines the strings size of the hash when represented in hexadecimal. + HexSize = 40 +) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha256.go b/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha256.go new file mode 100644 index 0000000000..1c52b89753 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha256.go @@ -0,0 +1,15 @@ +//go:build sha256 +// +build sha256 + +package hash + +import "crypto" + +const ( + // CryptoType defines what hash algorithm is being used. + CryptoType = crypto.SHA256 + // Size defines the amount of bytes the hash yields. + Size = 32 + // HexSize defines the strings size of the hash when represented in hexadecimal. + HexSize = 64 +) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go index 0394613fff..ad2b902c25 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go @@ -741,10 +741,7 @@ func (i *similarityIndex) add(key int, cnt uint64) error { // It's the same key, so increment the counter. var err error i.hashes[j], err = newKeyCountPair(key, v.count()+cnt) - if err != nil { - return err - } - return nil + return err } else if j+1 >= len(i.hashes) { j = 0 } else { diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go index 1bd724cad5..f93ad30471 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go @@ -57,7 +57,7 @@ func (a *AdvRefs) AddReference(r *plumbing.Reference) error { switch r.Type() { case plumbing.SymbolicReference: v := fmt.Sprintf("%s:%s", r.Name().String(), r.Target().String()) - a.Capabilities.Add(capability.SymRef, v) + return a.Capabilities.Add(capability.SymRef, v) case plumbing.HashReference: a.References[r.Name().String()] = r.Hash() default: @@ -96,12 +96,12 @@ func (a *AdvRefs) addRefs(s storer.ReferenceStorer) error { // // Git versions prior to 1.8.4.3 has an special procedure to get // the reference where is pointing to HEAD: -// - Check if a reference called master exists. If exists and it -// has the same hash as HEAD hash, we can say that HEAD is pointing to master -// - If master does not exists or does not have the same hash as HEAD, -// order references and check in that order if that reference has the same -// hash than HEAD. If yes, set HEAD pointing to that branch hash -// - If no reference is found, throw an error +// - Check if a reference called master exists. If exists and it +// has the same hash as HEAD hash, we can say that HEAD is pointing to master +// - If master does not exists or does not have the same hash as HEAD, +// order references and check in that order if that reference has the same +// hash than HEAD. If yes, set HEAD pointing to that branch hash +// - If no reference is found, throw an error func (a *AdvRefs) resolveHead(s storer.ReferenceStorer) error { if a.Head == nil { return nil diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go index 2c9843a566..076de545f8 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/format/pktline" @@ -81,7 +80,7 @@ func (req *ReferenceUpdateRequest) Decode(r io.Reader) error { var ok bool rc, ok = r.(io.ReadCloser) if !ok { - rc = ioutil.NopCloser(r) + rc = io.NopCloser(r) } d := &updReqDecoder{r: rc, s: pktline.NewScanner(r)} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/reference.go b/vendor/github.com/go-git/go-git/v5/plumbing/reference.go index eef11e8275..aeb4227bf9 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/reference.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/reference.go @@ -126,6 +126,7 @@ func (r ReferenceName) Short() string { const ( HEAD ReferenceName = "HEAD" Master ReferenceName = "refs/heads/master" + Main ReferenceName = "refs/heads/main" ) // Reference is a representation of git reference diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go index 20c3d0560e..1948c2301a 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go @@ -3,10 +3,7 @@ package client import ( - "crypto/tls" - "crypto/x509" "fmt" - gohttp "net/http" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/file" @@ -24,14 +21,6 @@ var Protocols = map[string]transport.Transport{ "file": file.DefaultClient, } -var insecureClient = http.NewClient(&gohttp.Client{ - Transport: &gohttp.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - }, -}) - // InstallProtocol adds or modifies an existing protocol. func InstallProtocol(scheme string, c transport.Transport) { if c == nil { @@ -50,27 +39,6 @@ func NewClient(endpoint *transport.Endpoint) (transport.Transport, error) { } func getTransport(endpoint *transport.Endpoint) (transport.Transport, error) { - if endpoint.Protocol == "https" { - if endpoint.InsecureSkipTLS { - return insecureClient, nil - } - - if len(endpoint.CaBundle) != 0 { - rootCAs, _ := x509.SystemCertPool() - if rootCAs == nil { - rootCAs = x509.NewCertPool() - } - rootCAs.AppendCertsFromPEM(endpoint.CaBundle) - return http.NewClient(&gohttp.Client{ - Transport: &gohttp.Transport{ - TLSClientConfig: &tls.Config{ - RootCAs: rootCAs, - }, - }, - }), nil - } - } - f, ok := Protocols[endpoint.Protocol] if !ok { return nil, fmt.Errorf("unsupported scheme %q", endpoint.Protocol) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go index a2a78f0289..89bd3d5289 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go @@ -116,6 +116,37 @@ type Endpoint struct { InsecureSkipTLS bool // CaBundle specify additional ca bundle with system cert pool CaBundle []byte + // Proxy provides info required for connecting to a proxy. + Proxy ProxyOptions +} + +type ProxyOptions struct { + URL string + Username string + Password string +} + +func (o *ProxyOptions) Validate() error { + if o.URL != "" { + _, err := url.Parse(o.URL) + return err + } + return nil +} + +func (o *ProxyOptions) FullURL() (*url.URL, error) { + proxyURL, err := url.Parse(o.URL) + if err != nil { + return nil, err + } + if o.Username != "" { + if o.Password != "" { + proxyURL.User = url.UserPassword(o.Username, o.Password) + } else { + proxyURL.User = url.User(o.Username) + } + } + return proxyURL, nil } var defaultPorts = map[string]int{ diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go index c18d600c21..92fc0becc0 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net" + "strconv" "github.com/go-git/go-git/v5/plumbing/format/pktline" "github.com/go-git/go-git/v5/plumbing/transport" @@ -69,7 +70,7 @@ func (c *command) getHostWithPort() string { port = DefaultPort } - return fmt.Sprintf("%s:%d", host, port) + return net.JoinHostPort(host, strconv.Itoa(port)) } // StderrPipe git protocol doesn't have any dedicated error channel @@ -92,7 +93,7 @@ func (c *command) StdoutPipe() (io.Reader, error) { func endpointToCommand(cmd string, ep *transport.Endpoint) string { host := ep.Host if ep.Port != DefaultPort { - host = fmt.Sprintf("%s:%d", ep.Host, ep.Port) + host = net.JoinHostPort(ep.Host, strconv.Itoa(ep.Port)) } return fmt.Sprintf("%s %s%chost=%s%c", cmd, ep.Path, 0, host, 0) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go index d57c0feef5..f9b7a0e590 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go @@ -4,16 +4,22 @@ package http import ( "bytes" "context" + "crypto/tls" + "crypto/x509" "fmt" "net" "net/http" + "net/url" + "reflect" "strconv" "strings" + "sync" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/protocol/packp" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/golang/groupcache/lru" ) // it requires a bytes.Buffer, because we need to know the length @@ -74,40 +80,83 @@ func advertisedReferences(ctx context.Context, s *session, serviceName string) ( } type client struct { - c *http.Client + c *http.Client + transports *lru.Cache + m sync.RWMutex } -// DefaultClient is the default HTTP client, which uses `http.DefaultClient`. -var DefaultClient = NewClient(nil) +// ClientOptions holds user configurable options for the client. +type ClientOptions struct { + // CacheMaxEntries is the max no. of entries that the transport objects + // cache will hold at any given point of time. It must be a positive integer. + // Calling `client.addTransport()` after the cache has reached the specified + // size, will result in the least recently used transport getting deleted + // before the provided transport is added to the cache. + CacheMaxEntries int +} + +var ( + // defaultTransportCacheSize is the default capacity of the transport objects cache. + // Its value is 0 because transport caching is turned off by default and is an + // opt-in feature. + defaultTransportCacheSize = 0 + + // DefaultClient is the default HTTP client, which uses a net/http client configured + // with http.DefaultTransport. + DefaultClient = NewClient(nil) +) // NewClient creates a new client with a custom net/http client. // See `InstallProtocol` to install and override default http client. -// Unless a properly initialized client is given, it will fall back into -// `http.DefaultClient`. +// If the net/http client is nil or empty, it will use a net/http client configured +// with http.DefaultTransport. // // Note that for HTTP client cannot distinguish between private repositories and // unexistent repositories on GitHub. So it returns `ErrAuthorizationRequired` // for both. func NewClient(c *http.Client) transport.Transport { if c == nil { - return &client{http.DefaultClient} + c = &http.Client{ + Transport: http.DefaultTransport, + } } + return NewClientWithOptions(c, &ClientOptions{ + CacheMaxEntries: defaultTransportCacheSize, + }) +} - return &client{ +// NewClientWithOptions returns a new client configured with the provided net/http client +// and other custom options specific to the client. +// If the net/http client is nil or empty, it will use a net/http client configured +// with http.DefaultTransport. +func NewClientWithOptions(c *http.Client, opts *ClientOptions) transport.Transport { + if c == nil { + c = &http.Client{ + Transport: http.DefaultTransport, + } + } + cl := &client{ c: c, } + + if opts != nil { + if opts.CacheMaxEntries > 0 { + cl.transports = lru.New(opts.CacheMaxEntries) + } + } + return cl } func (c *client) NewUploadPackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( transport.UploadPackSession, error) { - return newUploadPackSession(c.c, ep, auth) + return newUploadPackSession(c, ep, auth) } func (c *client) NewReceivePackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( transport.ReceivePackSession, error) { - return newReceivePackSession(c.c, ep, auth) + return newReceivePackSession(c, ep, auth) } type session struct { @@ -117,10 +166,106 @@ type session struct { advRefs *packp.AdvRefs } -func newSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (*session, error) { +func transportWithInsecureTLS(transport *http.Transport) { + if transport.TLSClientConfig == nil { + transport.TLSClientConfig = &tls.Config{} + } + transport.TLSClientConfig.InsecureSkipVerify = true +} + +func transportWithCABundle(transport *http.Transport, caBundle []byte) error { + rootCAs, err := x509.SystemCertPool() + if err != nil { + return err + } + if rootCAs == nil { + rootCAs = x509.NewCertPool() + } + rootCAs.AppendCertsFromPEM(caBundle) + if transport.TLSClientConfig == nil { + transport.TLSClientConfig = &tls.Config{} + } + transport.TLSClientConfig.RootCAs = rootCAs + return nil +} + +func transportWithProxy(transport *http.Transport, proxyURL *url.URL) { + transport.Proxy = http.ProxyURL(proxyURL) +} + +func configureTransport(transport *http.Transport, ep *transport.Endpoint) error { + if len(ep.CaBundle) > 0 { + if err := transportWithCABundle(transport, ep.CaBundle); err != nil { + return err + } + } + if ep.InsecureSkipTLS { + transportWithInsecureTLS(transport) + } + + if ep.Proxy.URL != "" { + proxyURL, err := ep.Proxy.FullURL() + if err != nil { + return err + } + transportWithProxy(transport, proxyURL) + } + return nil +} + +func newSession(c *client, ep *transport.Endpoint, auth transport.AuthMethod) (*session, error) { + var httpClient *http.Client + + // We need to configure the http transport if there are transport specific + // options present in the endpoint. + if len(ep.CaBundle) > 0 || ep.InsecureSkipTLS || ep.Proxy.URL != "" { + var transport *http.Transport + // if the client wasn't configured to have a cache for transports then just configure + // the transport and use it directly, otherwise try to use the cache. + if c.transports == nil { + tr, ok := c.c.Transport.(*http.Transport) + if !ok { + return nil, fmt.Errorf("expected underlying client transport to be of type: %s; got: %s", + reflect.TypeOf(transport), reflect.TypeOf(c.c.Transport)) + } + + transport = tr.Clone() + configureTransport(transport, ep) + } else { + transportOpts := transportOptions{ + caBundle: string(ep.CaBundle), + insecureSkipTLS: ep.InsecureSkipTLS, + } + if ep.Proxy.URL != "" { + proxyURL, err := ep.Proxy.FullURL() + if err != nil { + return nil, err + } + transportOpts.proxyURL = *proxyURL + } + var found bool + transport, found = c.fetchTransport(transportOpts) + + if !found { + transport = c.c.Transport.(*http.Transport).Clone() + configureTransport(transport, ep) + c.addTransport(transportOpts, transport) + } + } + + httpClient = &http.Client{ + Transport: transport, + CheckRedirect: c.c.CheckRedirect, + Jar: c.c.Jar, + Timeout: c.c.Timeout, + } + } else { + httpClient = c.c + } + s := &session{ auth: basicAuthFromEndpoint(ep), - client: c, + client: httpClient, endpoint: ep, } if auth != nil { diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go index 4d14ff21ea..4387ecffe9 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go @@ -19,7 +19,7 @@ type rpSession struct { *session } -func newReceivePackSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.ReceivePackSession, error) { +func newReceivePackSession(c *client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.ReceivePackSession, error) { s, err := newSession(c, ep, auth) return &rpSession{s}, err } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/transport.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/transport.go new file mode 100644 index 0000000000..052f3c8e28 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/transport.go @@ -0,0 +1,40 @@ +package http + +import ( + "net/http" + "net/url" +) + +// transportOptions contains transport specific configuration. +type transportOptions struct { + insecureSkipTLS bool + // []byte is not comparable. + caBundle string + proxyURL url.URL +} + +func (c *client) addTransport(opts transportOptions, transport *http.Transport) { + c.m.Lock() + c.transports.Add(opts, transport) + c.m.Unlock() +} + +func (c *client) removeTransport(opts transportOptions) { + c.m.Lock() + c.transports.Remove(opts) + c.m.Unlock() +} + +func (c *client) fetchTransport(opts transportOptions) (*http.Transport, bool) { + c.m.RLock() + t, ok := c.transports.Get(opts) + c.m.RUnlock() + if !ok { + return nil, false + } + transport, ok := t.(*http.Transport) + if !ok { + return nil, false + } + return transport, true +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go index e735b3d7c9..4f851459f6 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go @@ -19,7 +19,7 @@ type upSession struct { *session } -func newUploadPackSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.UploadPackSession, error) { +func newUploadPackSession(c *client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.UploadPackSession, error) { s, err := newSession(c, ep, auth) return &upSession{s}, err } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go index d0e9a2974e..99e0850f93 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go @@ -11,7 +11,6 @@ import ( "errors" "fmt" "io" - stdioutil "io/ioutil" "strings" "time" @@ -156,7 +155,7 @@ func (c *client) listenFirstError(r io.Reader) chan string { close(errLine) } - _, _ = io.Copy(stdioutil.Discard, r) + _, _ = io.Copy(io.Discard, r) }() return errLine @@ -374,7 +373,7 @@ func (s *session) checkNotFoundError() error { case <-t.C: return ErrTimeoutExceeded case line, ok := <-s.firstErrLine: - if !ok { + if !ok || len(line) == 0 { return nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go index 9d3bcd359c..ac4e3583c8 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go @@ -3,7 +3,6 @@ package ssh import ( "errors" "fmt" - "io/ioutil" "os" "os/user" "path/filepath" @@ -43,6 +42,7 @@ const ( type KeyboardInteractive struct { User string Challenge ssh.KeyboardInteractiveChallenge + HostKeyCallbackHelper } func (a *KeyboardInteractive) Name() string { @@ -54,18 +54,19 @@ func (a *KeyboardInteractive) String() string { } func (a *KeyboardInteractive) ClientConfig() (*ssh.ClientConfig, error) { - return &ssh.ClientConfig{ + return a.SetHostKeyCallback(&ssh.ClientConfig{ User: a.User, Auth: []ssh.AuthMethod{ a.Challenge, }, - }, nil + }) } // Password implements AuthMethod by using the given password. type Password struct { User string Password string + HostKeyCallbackHelper } func (a *Password) Name() string { @@ -77,10 +78,10 @@ func (a *Password) String() string { } func (a *Password) ClientConfig() (*ssh.ClientConfig, error) { - return &ssh.ClientConfig{ + return a.SetHostKeyCallback(&ssh.ClientConfig{ User: a.User, Auth: []ssh.AuthMethod{ssh.Password(a.Password)}, - }, nil + }) } // PasswordCallback implements AuthMethod by using a callback @@ -88,6 +89,7 @@ func (a *Password) ClientConfig() (*ssh.ClientConfig, error) { type PasswordCallback struct { User string Callback func() (pass string, err error) + HostKeyCallbackHelper } func (a *PasswordCallback) Name() string { @@ -99,16 +101,17 @@ func (a *PasswordCallback) String() string { } func (a *PasswordCallback) ClientConfig() (*ssh.ClientConfig, error) { - return &ssh.ClientConfig{ + return a.SetHostKeyCallback(&ssh.ClientConfig{ User: a.User, Auth: []ssh.AuthMethod{ssh.PasswordCallback(a.Callback)}, - }, nil + }) } // PublicKeys implements AuthMethod by using the given key pairs. type PublicKeys struct { User string Signer ssh.Signer + HostKeyCallbackHelper } // NewPublicKeys returns a PublicKeys from a PEM encoded private key. An @@ -130,7 +133,7 @@ func NewPublicKeys(user string, pemBytes []byte, password string) (*PublicKeys, // encoded private key. An encryption password should be given if the pemBytes // contains a password encrypted PEM block otherwise password should be empty. func NewPublicKeysFromFile(user, pemFile, password string) (*PublicKeys, error) { - bytes, err := ioutil.ReadFile(pemFile) + bytes, err := os.ReadFile(pemFile) if err != nil { return nil, err } @@ -147,10 +150,10 @@ func (a *PublicKeys) String() string { } func (a *PublicKeys) ClientConfig() (*ssh.ClientConfig, error) { - return &ssh.ClientConfig{ + return a.SetHostKeyCallback(&ssh.ClientConfig{ User: a.User, Auth: []ssh.AuthMethod{ssh.PublicKeys(a.Signer)}, - }, nil + }) } func username() (string, error) { @@ -173,6 +176,7 @@ func username() (string, error) { type PublicKeysCallback struct { User string Callback func() (signers []ssh.Signer, err error) + HostKeyCallbackHelper } // NewSSHAgentAuth returns a PublicKeysCallback based on a SSH agent, it opens @@ -207,10 +211,10 @@ func (a *PublicKeysCallback) String() string { } func (a *PublicKeysCallback) ClientConfig() (*ssh.ClientConfig, error) { - return &ssh.ClientConfig{ + return a.SetHostKeyCallback(&ssh.ClientConfig{ User: a.User, Auth: []ssh.AuthMethod{ssh.PublicKeysCallback(a.Callback)}, - }, nil + }) } // NewKnownHostsCallback returns ssh.HostKeyCallback based on a file based on a @@ -286,9 +290,6 @@ func filterKnownHostsFiles(files ...string) ([]string, error) { // HostKeyCallbackHelper is a helper that provides common functionality to // configure HostKeyCallback into a ssh.ClientConfig. -// Deprecated in favor of SetConfigHostKeyFields (see common.go) which provides -// a mechanism for also setting ClientConfig.HostKeyAlgorithms for a specific -// host. type HostKeyCallbackHelper struct { // HostKeyCallback is the function type used for verifying server keys. // If nil default callback will be create using NewKnownHostsCallback diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go index 4b9ac07977..15316038b3 100644 --- a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go @@ -4,12 +4,14 @@ package ssh import ( "context" "fmt" + "net" "reflect" "strconv" "strings" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/skeema/knownhosts" "github.com/kevinburke/ssh_config" "golang.org/x/crypto/ssh" @@ -122,14 +124,23 @@ func (c *command) connect() error { return err } hostWithPort := c.getHostWithPort() - config, err = SetConfigHostKeyFields(config, hostWithPort) - if err != nil { - return err + if config.HostKeyCallback == nil { + kh, err := newKnownHosts() + if err != nil { + return err + } + config.HostKeyCallback = kh.HostKeyCallback() + config.HostKeyAlgorithms = kh.HostKeyAlgorithms(hostWithPort) + } else if len(config.HostKeyAlgorithms) == 0 { + // Set the HostKeyAlgorithms based on HostKeyCallback. + // For background see https://github.com/go-git/go-git/issues/411 as well as + // https://github.com/golang/go/issues/29286 for root cause. + config.HostKeyAlgorithms = knownhosts.HostKeyAlgorithms(config.HostKeyCallback, hostWithPort) } overrideConfig(c.config, config) - c.client, err = dial("tcp", hostWithPort, config) + c.client, err = dial("tcp", hostWithPort, c.endpoint.Proxy, config) if err != nil { return err } @@ -144,7 +155,7 @@ func (c *command) connect() error { return nil } -func dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) { +func dial(network, addr string, proxyOpts transport.ProxyOptions, config *ssh.ClientConfig) (*ssh.Client, error) { var ( ctx = context.Background() cancel context.CancelFunc @@ -156,10 +167,33 @@ func dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) { } defer cancel() - conn, err := proxy.Dial(ctx, network, addr) + var conn net.Conn + var err error + + if proxyOpts.URL != "" { + proxyUrl, err := proxyOpts.FullURL() + if err != nil { + return nil, err + } + dialer, err := proxy.FromURL(proxyUrl, proxy.Direct) + if err != nil { + return nil, err + } + + // Try to use a ContextDialer, but fall back to a Dialer if that goes south. + ctxDialer, ok := dialer.(proxy.ContextDialer) + if !ok { + return nil, fmt.Errorf("expected ssh proxy dialer to be of type %s; got %s", + reflect.TypeOf(ctxDialer), reflect.TypeOf(dialer)) + } + conn, err = ctxDialer.DialContext(ctx, "tcp", addr) + } else { + conn, err = proxy.Dial(ctx, network, addr) + } if err != nil { return nil, err } + c, chans, reqs, err := ssh.NewClientConn(conn, addr, config) if err != nil { return nil, err @@ -167,23 +201,6 @@ func dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) { return ssh.NewClient(c, chans, reqs), nil } -// SetConfigHostKeyFields sets cfg.HostKeyCallback and cfg.HostKeyAlgorithms -// based on OpenSSH known_hosts. cfg is modified in-place. hostWithPort must be -// supplied, since the algorithms will be set based on the known host keys for -// that specific host. Otherwise, golang.org/x/crypto/ssh can return an error -// upon connecting to a host whose *first* key is not known, even though other -// keys (of different types) are known and match properly. -// For background see https://github.com/go-git/go-git/issues/411 as well as -// https://github.com/golang/go/issues/29286 for root cause. -func SetConfigHostKeyFields(cfg *ssh.ClientConfig, hostWithPort string) (*ssh.ClientConfig, error) { - kh, err := newKnownHosts() - if err == nil { - cfg.HostKeyCallback = kh.HostKeyCallback() - cfg.HostKeyAlgorithms = kh.HostKeyAlgorithms(hostWithPort) - } - return cfg, err -} - func (c *command) getHostWithPort() string { if addr, found := c.doGetHostWithPortFromSSHConfig(); found { return addr @@ -195,7 +212,7 @@ func (c *command) getHostWithPort() string { port = DefaultPort } - return fmt.Sprintf("%s:%d", host, port) + return net.JoinHostPort(host, strconv.Itoa(port)) } func (c *command) doGetHostWithPortFromSSHConfig() (addr string, found bool) { @@ -223,7 +240,7 @@ func (c *command) doGetHostWithPortFromSSHConfig() (addr string, found bool) { } } - addr = fmt.Sprintf("%s:%d", host, port) + addr = net.JoinHostPort(host, strconv.Itoa(port)) return } diff --git a/vendor/github.com/go-git/go-git/v5/remote.go b/vendor/github.com/go-git/go-git/v5/remote.go index db78ae7187..7b2741a439 100644 --- a/vendor/github.com/go-git/go-git/v5/remote.go +++ b/vendor/github.com/go-git/go-git/v5/remote.go @@ -33,6 +33,7 @@ var ( ErrDeleteRefNotSupported = errors.New("server does not support delete-refs") ErrForceNeeded = errors.New("some refs were not updated") ErrExactSHA1NotSupported = errors.New("server does not support exact SHA1 refspec") + ErrEmptyUrls = errors.New("URLs cannot be empty") ) type NoMatchingRefSpecError struct { @@ -54,6 +55,9 @@ const ( // repo containing this remote, when not using the multi-ack // protocol. Setting this to 0 means there is no limit. maxHavesToVisitPerRef = 100 + + // peeledSuffix is the suffix used to build peeled reference names. + peeledSuffix = "^{}" ) // Remote represents a connection to a remote repository. @@ -109,7 +113,7 @@ func (r *Remote) PushContext(ctx context.Context, o *PushOptions) (err error) { o.RemoteURL = r.c.URLs[0] } - s, err := newSendPackSession(o.RemoteURL, o.Auth, o.InsecureSkipTLS, o.CABundle) + s, err := newSendPackSession(o.RemoteURL, o.Auth, o.InsecureSkipTLS, o.CABundle, o.ProxyOptions) if err != nil { return err } @@ -410,7 +414,7 @@ func (r *Remote) fetch(ctx context.Context, o *FetchOptions) (sto storer.Referen o.RemoteURL = r.c.URLs[0] } - s, err := newUploadPackSession(o.RemoteURL, o.Auth, o.InsecureSkipTLS, o.CABundle) + s, err := newUploadPackSession(o.RemoteURL, o.Auth, o.InsecureSkipTLS, o.CABundle, o.ProxyOptions) if err != nil { return nil, err } @@ -507,8 +511,8 @@ func depthChanged(before []plumbing.Hash, s storage.Storer) (bool, error) { return false, nil } -func newUploadPackSession(url string, auth transport.AuthMethod, insecure bool, cabundle []byte) (transport.UploadPackSession, error) { - c, ep, err := newClient(url, auth, insecure, cabundle) +func newUploadPackSession(url string, auth transport.AuthMethod, insecure bool, cabundle []byte, proxyOpts transport.ProxyOptions) (transport.UploadPackSession, error) { + c, ep, err := newClient(url, insecure, cabundle, proxyOpts) if err != nil { return nil, err } @@ -516,8 +520,8 @@ func newUploadPackSession(url string, auth transport.AuthMethod, insecure bool, return c.NewUploadPackSession(ep, auth) } -func newSendPackSession(url string, auth transport.AuthMethod, insecure bool, cabundle []byte) (transport.ReceivePackSession, error) { - c, ep, err := newClient(url, auth, insecure, cabundle) +func newSendPackSession(url string, auth transport.AuthMethod, insecure bool, cabundle []byte, proxyOpts transport.ProxyOptions) (transport.ReceivePackSession, error) { + c, ep, err := newClient(url, insecure, cabundle, proxyOpts) if err != nil { return nil, err } @@ -525,13 +529,14 @@ func newSendPackSession(url string, auth transport.AuthMethod, insecure bool, ca return c.NewReceivePackSession(ep, auth) } -func newClient(url string, auth transport.AuthMethod, insecure bool, cabundle []byte) (transport.Transport, *transport.Endpoint, error) { +func newClient(url string, insecure bool, cabundle []byte, proxyOpts transport.ProxyOptions) (transport.Transport, *transport.Endpoint, error) { ep, err := transport.NewEndpoint(url) if err != nil { return nil, nil, err } ep.InsecureSkipTLS = insecure ep.CaBundle = cabundle + ep.Proxy = proxyOpts c, err := client.NewClient(ep) if err != nil { @@ -1245,21 +1250,29 @@ func (r *Remote) buildFetchedTags(refs memory.ReferenceStorage) (updated bool, e // operation is complete, an error is returned. The context only affects to the // transport operations. func (r *Remote) ListContext(ctx context.Context, o *ListOptions) (rfs []*plumbing.Reference, err error) { - refs, err := r.list(ctx, o) - if err != nil { - return refs, err - } - return refs, nil + return r.list(ctx, o) } func (r *Remote) List(o *ListOptions) (rfs []*plumbing.Reference, err error) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + timeout := o.Timeout + // Default to the old hardcoded 10s value if a timeout is not explicitly set. + if timeout == 0 { + timeout = 10 + } + if timeout < 0 { + return nil, fmt.Errorf("invalid timeout: %d", timeout) + } + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second) defer cancel() return r.ListContext(ctx, o) } func (r *Remote) list(ctx context.Context, o *ListOptions) (rfs []*plumbing.Reference, err error) { - s, err := newUploadPackSession(r.c.URLs[0], o.Auth, o.InsecureSkipTLS, o.CABundle) + if r.c == nil || len(r.c.URLs) == 0 { + return nil, ErrEmptyUrls + } + + s, err := newUploadPackSession(r.c.URLs[0], o.Auth, o.InsecureSkipTLS, o.CABundle, o.ProxyOptions) if err != nil { return nil, err } @@ -1282,13 +1295,22 @@ func (r *Remote) list(ctx context.Context, o *ListOptions) (rfs []*plumbing.Refe } var resultRefs []*plumbing.Reference - err = refs.ForEach(func(ref *plumbing.Reference) error { - resultRefs = append(resultRefs, ref) - return nil - }) - if err != nil { - return nil, err + if o.PeelingOption == AppendPeeled || o.PeelingOption == IgnorePeeled { + err = refs.ForEach(func(ref *plumbing.Reference) error { + resultRefs = append(resultRefs, ref) + return nil + }) + if err != nil { + return nil, err + } } + + if o.PeelingOption == AppendPeeled || o.PeelingOption == OnlyPeeled { + for k, v := range ar.Peeled { + resultRefs = append(resultRefs, plumbing.NewReferenceFromStrings(k+"^{}", v.String())) + } + } + return resultRefs, nil } diff --git a/vendor/github.com/go-git/go-git/v5/repository.go b/vendor/github.com/go-git/go-git/v5/repository.go index 7292df627c..f3540c63b8 100644 --- a/vendor/github.com/go-git/go-git/v5/repository.go +++ b/vendor/github.com/go-git/go-git/v5/repository.go @@ -3,10 +3,11 @@ package git import ( "bytes" "context" + "crypto" "encoding/hex" "errors" "fmt" - stdioutil "io/ioutil" + "io" "os" "path" "path/filepath" @@ -21,7 +22,9 @@ import ( "github.com/go-git/go-git/v5/internal/revision" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/cache" + formatcfg "github.com/go-git/go-git/v5/plumbing/format/config" "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/hash" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/plumbing/storer" "github.com/go-git/go-git/v5/storage" @@ -57,6 +60,7 @@ var ( ErrIsBareRepository = errors.New("worktree not available in a bare repository") ErrUnableToResolveCommit = errors.New("unable to resolve commit") ErrPackedObjectsNotSupported = errors.New("packed objects not supported") + ErrSHA256NotSupported = errors.New("go-git was not compiled with SHA256 support") ) // Repository represents a git repository @@ -67,14 +71,30 @@ type Repository struct { wt billy.Filesystem } +type InitOptions struct { + // The default branch (e.g. "refs/heads/master") + DefaultBranch plumbing.ReferenceName +} + // Init creates an empty git repository, based on the given Storer and worktree. // The worktree Filesystem is optional, if nil a bare repository is created. If // the given storer is not empty ErrRepositoryAlreadyExists is returned func Init(s storage.Storer, worktree billy.Filesystem) (*Repository, error) { + options := InitOptions{ + DefaultBranch: plumbing.Master, + } + return InitWithOptions(s, worktree, options) +} + +func InitWithOptions(s storage.Storer, worktree billy.Filesystem, options InitOptions) (*Repository, error) { if err := initStorer(s); err != nil { return nil, err } + if options.DefaultBranch == "" { + options.DefaultBranch = plumbing.Master + } + r := newRepository(s, worktree) _, err := r.Reference(plumbing.HEAD, false) switch err { @@ -85,7 +105,7 @@ func Init(s storage.Storer, worktree billy.Filesystem) (*Repository, error) { return nil, err } - h := plumbing.NewSymbolicReference(plumbing.HEAD, plumbing.Master) + h := plumbing.NewSymbolicReference(plumbing.HEAD, options.DefaultBranch) if err := s.SetReference(h); err != nil { return nil, err } @@ -228,6 +248,39 @@ func PlainInit(path string, isBare bool) (*Repository, error) { return Init(s, wt) } +func PlainInitWithOptions(path string, opts *PlainInitOptions) (*Repository, error) { + wt := osfs.New(path) + dot, _ := wt.Chroot(GitDirName) + + s := filesystem.NewStorage(dot, cache.NewObjectLRUDefault()) + + r, err := Init(s, wt) + if err != nil { + return nil, err + } + + cfg, err := r.Config() + if err != nil { + return nil, err + } + + if opts != nil { + if opts.ObjectFormat == formatcfg.SHA256 && hash.CryptoType != crypto.SHA256 { + return nil, ErrSHA256NotSupported + } + + cfg.Core.RepositoryFormatVersion = formatcfg.Version_1 + cfg.Extensions.ObjectFormat = opts.ObjectFormat + } + + err = r.Storer.SetConfig(cfg) + if err != nil { + return nil, err + } + + return r, err +} + // PlainOpen opens a git repository from the given path. It detects if the // repository is bare or a normal one. If the path doesn't contain a valid // repository ErrRepositoryNotExists is returned @@ -330,7 +383,7 @@ func dotGitFileToOSFilesystem(path string, fs billy.Filesystem) (bfs billy.Files } defer ioutil.CheckClose(f, &err) - b, err := stdioutil.ReadAll(f) + b, err := io.ReadAll(f) if err != nil { return nil, err } @@ -359,7 +412,7 @@ func dotGitCommonDirectory(fs billy.Filesystem) (commonDir billy.Filesystem, err return nil, err } - b, err := stdioutil.ReadAll(f) + b, err := io.ReadAll(f) if err != nil { return nil, err } @@ -407,6 +460,9 @@ func PlainCloneContext(ctx context.Context, path string, isBare bool, o *CloneOp return nil, err } + if o.Mirror { + isBare = true + } r, err := PlainInit(path, isBare) if err != nil { return nil, err @@ -750,21 +806,20 @@ func (r *Repository) buildTagSignature(tag *object.Tag, signKey *openpgp.Entity) // If you want to check to see if the tag is an annotated tag, you can call // TagObject on the hash of the reference in ForEach: // -// ref, err := r.Tag("v0.1.0") -// if err != nil { -// // Handle error -// } -// -// obj, err := r.TagObject(ref.Hash()) -// switch err { -// case nil: -// // Tag object present -// case plumbing.ErrObjectNotFound: -// // Not a tag object -// default: -// // Some other error -// } +// ref, err := r.Tag("v0.1.0") +// if err != nil { +// // Handle error +// } // +// obj, err := r.TagObject(ref.Hash()) +// switch err { +// case nil: +// // Tag object present +// case plumbing.ErrObjectNotFound: +// // Not a tag object +// default: +// // Some other error +// } func (r *Repository) Tag(name string) (*plumbing.Reference, error) { ref, err := r.Reference(plumbing.ReferenceName(path.Join("refs", "tags", name)), false) if err != nil { @@ -815,9 +870,10 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error { } c := &config.RemoteConfig{ - Name: o.RemoteName, - URLs: []string{o.URL}, - Fetch: r.cloneRefSpec(o), + Name: o.RemoteName, + URLs: []string{o.URL}, + Fetch: r.cloneRefSpec(o), + Mirror: o.Mirror, } if _, err := r.CreateRemote(c); err != nil { @@ -833,6 +889,7 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error { RemoteName: o.RemoteName, InsecureSkipTLS: o.InsecureSkipTLS, CABundle: o.CABundle, + ProxyOptions: o.ProxyOptions, }, o.ReferenceName) if err != nil { return err @@ -870,7 +927,7 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error { return err } - if ref.Name().IsBranch() { + if !o.Mirror && ref.Name().IsBranch() { branchRef := ref.Name() branchName := strings.Split(string(branchRef), "refs/heads/")[1] @@ -901,6 +958,8 @@ const ( func (r *Repository) cloneRefSpec(o *CloneOptions) []config.RefSpec { switch { + case o.Mirror: + return []config.RefSpec{"+refs/*:refs/*"} case o.ReferenceName.IsTag(): return []config.RefSpec{ config.RefSpec(fmt.Sprintf(refspecTag, o.ReferenceName.Short())), @@ -970,9 +1029,21 @@ func (r *Repository) fetchAndUpdateReferences( return nil, err } - resolvedRef, err := storer.ResolveReference(remoteRefs, ref) + var resolvedRef *plumbing.Reference + // return error from checking the raw ref passed in + var rawRefError error + for _, rule := range append([]string{"%s"}, plumbing.RefRevParseRules...) { + resolvedRef, err = storer.ResolveReference(remoteRefs, plumbing.ReferenceName(fmt.Sprintf(rule, ref))) + + if err == nil { + break + } else if rawRefError == nil { + rawRefError = err + } + } + if err != nil { - return nil, err + return nil, rawRefError } refsUpdated, err := r.updateReferences(remote.c.Fetch, resolvedRef) @@ -1241,26 +1312,25 @@ func commitIterFunc(order LogOrder) func(c *object.Commit) object.CommitIter { // If you want to check to see if the tag is an annotated tag, you can call // TagObject on the hash Reference passed in through ForEach: // -// iter, err := r.Tags() -// if err != nil { -// // Handle error -// } -// -// if err := iter.ForEach(func (ref *plumbing.Reference) error { -// obj, err := r.TagObject(ref.Hash()) -// switch err { -// case nil: -// // Tag object present -// case plumbing.ErrObjectNotFound: -// // Not a tag object -// default: -// // Some other error -// return err -// } -// }); err != nil { -// // Handle outer iterator error -// } +// iter, err := r.Tags() +// if err != nil { +// // Handle error +// } // +// if err := iter.ForEach(func (ref *plumbing.Reference) error { +// obj, err := r.TagObject(ref.Hash()) +// switch err { +// case nil: +// // Tag object present +// case plumbing.ErrObjectNotFound: +// // Not a tag object +// default: +// // Some other error +// return err +// } +// }); err != nil { +// // Handle outer iterator error +// } func (r *Repository) Tags() (storer.ReferenceIter, error) { refIter, err := r.Storer.IterReferences() if err != nil { @@ -1424,9 +1494,13 @@ func (r *Repository) Worktree() (*Worktree, error) { // // Implemented resolvers : HEAD, branch, tag, heads/branch, refs/heads/branch, // refs/tags/tag, refs/remotes/origin/branch, refs/remotes/origin/HEAD, tilde and caret (HEAD~1, master~^, tag~2, ref/heads/master~1, ...), selection by text (HEAD^{/fix nasty bug}), hash (prefix and full) -func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, error) { - p := revision.NewParserFromString(string(rev)) +func (r *Repository) ResolveRevision(in plumbing.Revision) (*plumbing.Hash, error) { + rev := in.String() + if rev == "" { + return &plumbing.ZeroHash, plumbing.ErrReferenceNotFound + } + p := revision.NewParserFromString(rev) items, err := p.Parse() if err != nil { @@ -1557,6 +1631,10 @@ func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, err } } + if commit == nil { + return &plumbing.ZeroHash, plumbing.ErrReferenceNotFound + } + return &commit.Hash, nil } diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go index 6c386f7992..19d7026328 100644 --- a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "io" - stdioutil "io/ioutil" "os" "path/filepath" "sort" @@ -16,6 +15,7 @@ import ( "github.com/go-git/go-billy/v5/osfs" "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/hash" "github.com/go-git/go-git/v5/storage" "github.com/go-git/go-git/v5/utils/ioutil" @@ -552,8 +552,8 @@ func (d *DotGit) hasPack(h plumbing.Hash) error { } func (d *DotGit) objectPath(h plumbing.Hash) string { - hash := h.String() - return d.fs.Join(objectsPath, hash[0:2], hash[2:40]) + hex := h.String() + return d.fs.Join(objectsPath, hex[0:2], hex[2:hash.HexSize]) } // incomingObjectPath is intended to add support for a git pre-receive hook @@ -563,15 +563,16 @@ func (d *DotGit) objectPath(h plumbing.Hash) string { // // More on git hooks found here : https://git-scm.com/docs/githooks // More on 'quarantine'/incoming directory here: -// https://git-scm.com/docs/git-receive-pack +// +// https://git-scm.com/docs/git-receive-pack func (d *DotGit) incomingObjectPath(h plumbing.Hash) string { hString := h.String() if d.incomingDirName == "" { - return d.fs.Join(objectsPath, hString[0:2], hString[2:40]) + return d.fs.Join(objectsPath, hString[0:2], hString[2:hash.HexSize]) } - return d.fs.Join(objectsPath, d.incomingDirName, hString[0:2], hString[2:40]) + return d.fs.Join(objectsPath, d.incomingDirName, hString[0:2], hString[2:hash.HexSize]) } // hasIncomingObjects searches for an incoming directory and keeps its name @@ -645,7 +646,7 @@ func (d *DotGit) ObjectDelete(h plumbing.Hash) error { } func (d *DotGit) readReferenceFrom(rd io.Reader, name string) (ref *plumbing.Reference, err error) { - b, err := stdioutil.ReadAll(rd) + b, err := io.ReadAll(rd) if err != nil { return nil, err } @@ -716,48 +717,56 @@ func (d *DotGit) Ref(name plumbing.ReferenceName) (*plumbing.Reference, error) { return d.packedRef(name) } -func (d *DotGit) findPackedRefsInFile(f billy.File) ([]*plumbing.Reference, error) { +func (d *DotGit) findPackedRefsInFile(f billy.File, recv refsRecv) error { s := bufio.NewScanner(f) - var refs []*plumbing.Reference for s.Scan() { ref, err := d.processLine(s.Text()) if err != nil { - return nil, err + return err } - if ref != nil { - refs = append(refs, ref) + if !recv(ref) { + // skip parse + return nil } } - - return refs, s.Err() + if err := s.Err(); err != nil { + return err + } + return nil } -func (d *DotGit) findPackedRefs() (r []*plumbing.Reference, err error) { +// refsRecv: returning true means that the reference continues to be resolved, otherwise it is stopped, which will speed up the lookup of a single reference. +type refsRecv func(*plumbing.Reference) bool + +func (d *DotGit) findPackedRefs(recv refsRecv) error { f, err := d.fs.Open(packedRefsPath) if err != nil { if os.IsNotExist(err) { - return nil, nil + return nil } - return nil, err + return err } defer ioutil.CheckClose(f, &err) - return d.findPackedRefsInFile(f) + return d.findPackedRefsInFile(f, recv) } func (d *DotGit) packedRef(name plumbing.ReferenceName) (*plumbing.Reference, error) { - refs, err := d.findPackedRefs() - if err != nil { + var ref *plumbing.Reference + if err := d.findPackedRefs(func(r *plumbing.Reference) bool { + if r != nil && r.Name() == name { + ref = r + // ref found + return false + } + return true + }); err != nil { return nil, err } - - for _, ref := range refs { - if ref.Name() == name { - return ref, nil - } + if ref != nil { + return ref, nil } - return nil, plumbing.ErrReferenceNotFound } @@ -777,34 +786,22 @@ func (d *DotGit) RemoveRef(name plumbing.ReferenceName) error { return d.rewritePackedRefsWithoutRef(name) } -func (d *DotGit) addRefsFromPackedRefs(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) (err error) { - packedRefs, err := d.findPackedRefs() - if err != nil { - return err - } - - for _, ref := range packedRefs { - if !seen[ref.Name()] { - *refs = append(*refs, ref) - seen[ref.Name()] = true +func refsRecvFunc(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) refsRecv { + return func(r *plumbing.Reference) bool { + if r != nil && !seen[r.Name()] { + *refs = append(*refs, r) + seen[r.Name()] = true } + return true } - return nil } -func (d *DotGit) addRefsFromPackedRefsFile(refs *[]*plumbing.Reference, f billy.File, seen map[plumbing.ReferenceName]bool) (err error) { - packedRefs, err := d.findPackedRefsInFile(f) - if err != nil { - return err - } +func (d *DotGit) addRefsFromPackedRefs(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) (err error) { + return d.findPackedRefs(refsRecvFunc(refs, seen)) +} - for _, ref := range packedRefs { - if !seen[ref.Name()] { - *refs = append(*refs, ref) - seen[ref.Name()] = true - } - } - return nil +func (d *DotGit) addRefsFromPackedRefsFile(refs *[]*plumbing.Reference, f billy.File, seen map[plumbing.ReferenceName]bool) (err error) { + return d.findPackedRefsInFile(f, refsRecvFunc(refs, seen)) } func (d *DotGit) openAndLockPackedRefs(doCreate bool) ( @@ -943,6 +940,7 @@ func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []strin files, err := d.fs.ReadDir(d.fs.Join(relPath...)) if err != nil { if os.IsNotExist(err) { + // a race happened, and our directory is gone now return nil } @@ -960,6 +958,10 @@ func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []strin } ref, err := d.readReferenceFile(".", strings.Join(newRelPath, "/")) + if os.IsNotExist(err) { + // a race happened, and our file is gone now + continue + } if err != nil { return err } diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go index e2ede938cc..849b7a1760 100644 --- a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go @@ -9,6 +9,7 @@ import ( "github.com/go-git/go-git/v5/plumbing/format/idxfile" "github.com/go-git/go-git/v5/plumbing/format/objfile" "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/hash" "github.com/go-git/go-billy/v5" ) @@ -277,8 +278,8 @@ func (w *ObjectWriter) Close() error { } func (w *ObjectWriter) save() error { - hash := w.Hash().String() - file := w.fs.Join(objectsPath, hash[0:2], hash[2:40]) + hex := w.Hash().String() + file := w.fs.Join(objectsPath, hex[0:2], hex[2:hash.HexSize]) return w.fs.Rename(w.f.Name(), file) } diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go index 21667fa5a8..846a7b8602 100644 --- a/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go @@ -537,14 +537,21 @@ func (s *ObjectStorage) findObjectInPackfile(h plumbing.Hash) (plumbing.Hash, pl return plumbing.ZeroHash, plumbing.ZeroHash, -1 } +// HashesWithPrefix returns all objects with a hash that starts with a prefix by searching for +// them in the packfile and the git object directories. func (s *ObjectStorage) HashesWithPrefix(prefix []byte) ([]plumbing.Hash, error) { hashes, err := s.dir.ObjectsWithPrefix(prefix) if err != nil { return nil, err } + seen := hashListAsMap(hashes) + // TODO: This could be faster with some idxfile changes, // or diving into the packfile. + if err := s.requireIndex(); err != nil { + return nil, err + } for _, index := range s.index { ei, err := index.Entries() if err != nil { @@ -558,6 +565,9 @@ func (s *ObjectStorage) HashesWithPrefix(prefix []byte) ([]plumbing.Hash, error) return nil, err } if bytes.HasPrefix(e.Hash[:], prefix) { + if _, ok := seen[e.Hash]; ok { + continue + } hashes = append(hashes, e.Hash) } } diff --git a/vendor/github.com/go-git/go-git/v5/submodule.go b/vendor/github.com/go-git/go-git/v5/submodule.go index a202a9b600..b0c4169613 100644 --- a/vendor/github.com/go-git/go-git/v5/submodule.go +++ b/vendor/github.com/go-git/go-git/v5/submodule.go @@ -243,7 +243,7 @@ func (s *Submodule) fetchAndCheckout( ctx context.Context, r *Repository, o *SubmoduleUpdateOptions, hash plumbing.Hash, ) error { if !o.NoFetch { - err := r.FetchContext(ctx, &FetchOptions{Auth: o.Auth}) + err := r.FetchContext(ctx, &FetchOptions{Auth: o.Auth, Depth: o.Depth}) if err != nil && err != NoErrAlreadyUpToDate { return err } @@ -265,6 +265,7 @@ func (s *Submodule) fetchAndCheckout( err := r.FetchContext(ctx, &FetchOptions{ Auth: o.Auth, RefSpecs: []config.RefSpec{refSpec}, + Depth: o.Depth, }) if err != nil && err != NoErrAlreadyUpToDate && err != ErrExactSHA1NotSupported { return err diff --git a/vendor/github.com/go-git/go-git/v5/worktree.go b/vendor/github.com/go-git/go-git/v5/worktree.go index d28ba32419..595dceaae0 100644 --- a/vendor/github.com/go-git/go-git/v5/worktree.go +++ b/vendor/github.com/go-git/go-git/v5/worktree.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - stdioutil "io/ioutil" "os" "path/filepath" "strings" @@ -290,7 +289,7 @@ func (w *Worktree) ResetSparsely(opts *ResetOptions, dirs []string) error { return nil } - t, err := w.getTreeFromCommitHash(opts.Commit) + t, err := w.r.getTreeFromCommitHash(opts.Commit) if err != nil { return err } @@ -569,7 +568,7 @@ func (w *Worktree) checkoutFileSymlink(f *object.File) (err error) { defer ioutil.CheckClose(from, &err) - bytes, err := stdioutil.ReadAll(from) + bytes, err := io.ReadAll(from) if err != nil { return } @@ -633,8 +632,8 @@ func (w *Worktree) addIndexFromFile(name string, h plumbing.Hash, idx *indexBuil return nil } -func (w *Worktree) getTreeFromCommitHash(commit plumbing.Hash) (*object.Tree, error) { - c, err := w.r.CommitObject(commit) +func (r *Repository) getTreeFromCommitHash(commit plumbing.Hash) (*object.Tree, error) { + c, err := r.CommitObject(commit) if err != nil { return nil, err } @@ -718,7 +717,7 @@ func (w *Worktree) readGitmodulesFile() (*config.Modules, error) { } defer f.Close() - input, err := stdioutil.ReadAll(f) + input, err := io.ReadAll(f) if err != nil { return nil, err } @@ -802,9 +801,9 @@ func (gr GrepResult) String() string { return fmt.Sprintf("%s:%s:%d:%s", gr.TreeName, gr.FileName, gr.LineNumber, gr.Content) } -// Grep performs grep on a worktree. -func (w *Worktree) Grep(opts *GrepOptions) ([]GrepResult, error) { - if err := opts.Validate(w); err != nil { +// Grep performs grep on a repository. +func (r *Repository) Grep(opts *GrepOptions) ([]GrepResult, error) { + if err := opts.validate(r); err != nil { return nil, err } @@ -814,7 +813,7 @@ func (w *Worktree) Grep(opts *GrepOptions) ([]GrepResult, error) { var treeName string if opts.ReferenceName != "" { - ref, err := w.r.Reference(opts.ReferenceName, true) + ref, err := r.Reference(opts.ReferenceName, true) if err != nil { return nil, err } @@ -827,7 +826,7 @@ func (w *Worktree) Grep(opts *GrepOptions) ([]GrepResult, error) { // Obtain a tree from the commit hash and get a tracked files iterator from // the tree. - tree, err := w.getTreeFromCommitHash(commitHash) + tree, err := r.getTreeFromCommitHash(commitHash) if err != nil { return nil, err } @@ -836,6 +835,11 @@ func (w *Worktree) Grep(opts *GrepOptions) ([]GrepResult, error) { return findMatchInFiles(fileiter, treeName, opts) } +// Grep performs grep on a worktree. +func (w *Worktree) Grep(opts *GrepOptions) ([]GrepResult, error) { + return w.r.Grep(opts) +} + // findMatchInFiles takes a FileIter, worktree name and GrepOptions, and // returns a slice of GrepResult containing the result of regex pattern matching // in content of all the files. diff --git a/vendor/github.com/go-git/go-git/v5/worktree_status.go b/vendor/github.com/go-git/go-git/v5/worktree_status.go index f3091cff60..a26c9e51ff 100644 --- a/vendor/github.com/go-git/go-git/v5/worktree_status.go +++ b/vendor/github.com/go-git/go-git/v5/worktree_status.go @@ -169,7 +169,9 @@ func (w *Worktree) excludeIgnoredChanges(changes merkletrie.Changes) merkletrie. if len(path) != 0 { isDir := (len(ch.To) > 0 && ch.To.IsDir()) || (len(ch.From) > 0 && ch.From.IsDir()) if m.Match(path, isDir) { - continue + if len(ch.From) == 0 { + continue + } } } res = append(res, ch) diff --git a/vendor/github.com/go-logfmt/logfmt/CHANGELOG.md b/vendor/github.com/go-logfmt/logfmt/CHANGELOG.md index 1a9a27bcf6..8f349c4b8f 100644 --- a/vendor/github.com/go-logfmt/logfmt/CHANGELOG.md +++ b/vendor/github.com/go-logfmt/logfmt/CHANGELOG.md @@ -1,48 +1,82 @@ # Changelog + All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.6.0] - 2023-01-30 + +[0.6.0]: https://github.com/go-logfmt/logfmt/compare/v0.5.1...v0.6.0 + +### Added + +- NewDecoderSize by [@alexanderjophus] + +## [0.5.1] - 2021-08-18 + +[0.5.1]: https://github.com/go-logfmt/logfmt/compare/v0.5.0...v0.5.1 + +### Changed + +- Update the `go.mod` file for Go 1.17 as described in the [Go 1.17 release + notes](https://golang.org/doc/go1.17#go-command) + ## [0.5.0] - 2020-01-03 +[0.5.0]: https://github.com/go-logfmt/logfmt/compare/v0.4.0...v0.5.0 + ### Changed + - Remove the dependency on github.com/kr/logfmt by [@ChrisHines] - Move fuzz code to github.com/go-logfmt/fuzzlogfmt by [@ChrisHines] ## [0.4.0] - 2018-11-21 +[0.4.0]: https://github.com/go-logfmt/logfmt/compare/v0.3.0...v0.4.0 + ### Added + - Go module support by [@ChrisHines] - CHANGELOG by [@ChrisHines] ### Changed + - Drop invalid runes from keys instead of returning ErrInvalidKey by [@ChrisHines] - On panic while printing, attempt to print panic value by [@bboreham] ## [0.3.0] - 2016-11-15 + +[0.3.0]: https://github.com/go-logfmt/logfmt/compare/v0.2.0...v0.3.0 + ### Added + - Pool buffers for quoted strings and byte slices by [@nussjustin] + ### Fixed + - Fuzz fix, quote invalid UTF-8 values by [@judwhite] ## [0.2.0] - 2016-05-08 + +[0.2.0]: https://github.com/go-logfmt/logfmt/compare/v0.1.0...v0.2.0 + ### Added + - Encoder.EncodeKeyvals by [@ChrisHines] ## [0.1.0] - 2016-03-28 + +[0.1.0]: https://github.com/go-logfmt/logfmt/commits/v0.1.0 + ### Added + - Encoder by [@ChrisHines] - Decoder by [@ChrisHines] - MarshalKeyvals by [@ChrisHines] -[0.5.0]: https://github.com/go-logfmt/logfmt/compare/v0.4.0...v0.5.0 -[0.4.0]: https://github.com/go-logfmt/logfmt/compare/v0.3.0...v0.4.0 -[0.3.0]: https://github.com/go-logfmt/logfmt/compare/v0.2.0...v0.3.0 -[0.2.0]: https://github.com/go-logfmt/logfmt/compare/v0.1.0...v0.2.0 -[0.1.0]: https://github.com/go-logfmt/logfmt/commits/v0.1.0 - [@ChrisHines]: https://github.com/ChrisHines [@bboreham]: https://github.com/bboreham [@judwhite]: https://github.com/judwhite [@nussjustin]: https://github.com/nussjustin +[@alexanderjophus]: https://github.com/alexanderjophus diff --git a/vendor/github.com/go-logfmt/logfmt/README.md b/vendor/github.com/go-logfmt/logfmt/README.md index 8e48fcd3ab..71c57944e2 100644 --- a/vendor/github.com/go-logfmt/logfmt/README.md +++ b/vendor/github.com/go-logfmt/logfmt/README.md @@ -1,20 +1,25 @@ +# logfmt + [![Go Reference](https://pkg.go.dev/badge/github.com/go-logfmt/logfmt.svg)](https://pkg.go.dev/github.com/go-logfmt/logfmt) [![Go Report Card](https://goreportcard.com/badge/go-logfmt/logfmt)](https://goreportcard.com/report/go-logfmt/logfmt) [![Github Actions](https://github.com/go-logfmt/logfmt/actions/workflows/test.yml/badge.svg)](https://github.com/go-logfmt/logfmt/actions/workflows/test.yml) -[![Coverage Status](https://coveralls.io/repos/github/go-logfmt/logfmt/badge.svg?branch=master)](https://coveralls.io/github/go-logfmt/logfmt?branch=master) - -# logfmt +[![Coverage Status](https://coveralls.io/repos/github/go-logfmt/logfmt/badge.svg?branch=master)](https://coveralls.io/github/go-logfmt/logfmt?branch=main) Package logfmt implements utilities to marshal and unmarshal data in the [logfmt -format](https://brandur.org/logfmt). It provides an API similar to -[encoding/json](http://golang.org/pkg/encoding/json/) and -[encoding/xml](http://golang.org/pkg/encoding/xml/). +format][fmt]. It provides an API similar to [encoding/json][json] and +[encoding/xml][xml]. + +[fmt]: https://brandur.org/logfmt +[json]: https://pkg.go.dev/encoding/json +[xml]: https://pkg.go.dev/encoding/xml The logfmt format was first documented by Brandur Leach in [this -article](https://brandur.org/logfmt). The format has not been formally -standardized. The most authoritative public specification to date has been the -documentation of a Go Language [package](http://godoc.org/github.com/kr/logfmt) -written by Blake Mizerany and Keith Rarick. +article][origin]. The format has not been formally standardized. The most +authoritative public specification to date has been the documentation of a Go +Language [package][parser] written by Blake Mizerany and Keith Rarick. + +[origin]: https://brandur.org/logfmt +[parser]: https://pkg.go.dev/github.com/kr/logfmt ## Goals @@ -30,4 +35,7 @@ standard as a goal. ## Versioning -Package logfmt publishes releases via [semver](http://semver.org/) compatible Git tags prefixed with a single 'v'. +This project publishes releases according to the Go language guidelines for +[developing and publishing modules][pub]. + +[pub]: https://go.dev/doc/modules/developing diff --git a/vendor/github.com/go-logfmt/logfmt/decode.go b/vendor/github.com/go-logfmt/logfmt/decode.go index 2013708e48..a1c22dcbda 100644 --- a/vendor/github.com/go-logfmt/logfmt/decode.go +++ b/vendor/github.com/go-logfmt/logfmt/decode.go @@ -29,6 +29,23 @@ func NewDecoder(r io.Reader) *Decoder { return dec } +// NewDecoderSize returns a new decoder that reads from r. +// +// The decoder introduces its own buffering and may read data from r beyond +// the logfmt records requested. +// The size argument specifies the size of the initial buffer that the +// Decoder will use to read records from r. +// If a log line is longer than the size argument, the Decoder will return +// a bufio.ErrTooLong error. +func NewDecoderSize(r io.Reader, size int) *Decoder { + scanner := bufio.NewScanner(r) + scanner.Buffer(make([]byte, 0, size), size) + dec := &Decoder{ + s: scanner, + } + return dec +} + // ScanRecord advances the Decoder to the next record, which can then be // parsed with the ScanKeyval method. It returns false when decoding stops, // either by reaching the end of the input or an error. After ScanRecord diff --git a/vendor/github.com/go-logr/logr/.golangci.yaml b/vendor/github.com/go-logr/logr/.golangci.yaml index 94ff801df1..0cffafa7bf 100644 --- a/vendor/github.com/go-logr/logr/.golangci.yaml +++ b/vendor/github.com/go-logr/logr/.golangci.yaml @@ -6,7 +6,6 @@ linters: disable-all: true enable: - asciicheck - - deadcode - errcheck - forcetypeassert - gocritic @@ -18,10 +17,8 @@ linters: - misspell - revive - staticcheck - - structcheck - typecheck - unused - - varcheck issues: exclude-use-default: false diff --git a/vendor/github.com/go-logr/logr/discard.go b/vendor/github.com/go-logr/logr/discard.go index 9d92a38f1d..99fe8be93c 100644 --- a/vendor/github.com/go-logr/logr/discard.go +++ b/vendor/github.com/go-logr/logr/discard.go @@ -20,35 +20,5 @@ package logr // used whenever the caller is not interested in the logs. Logger instances // produced by this function always compare as equal. func Discard() Logger { - return Logger{ - level: 0, - sink: discardLogSink{}, - } -} - -// discardLogSink is a LogSink that discards all messages. -type discardLogSink struct{} - -// Verify that it actually implements the interface -var _ LogSink = discardLogSink{} - -func (l discardLogSink) Init(RuntimeInfo) { -} - -func (l discardLogSink) Enabled(int) bool { - return false -} - -func (l discardLogSink) Info(int, string, ...interface{}) { -} - -func (l discardLogSink) Error(error, string, ...interface{}) { -} - -func (l discardLogSink) WithValues(...interface{}) LogSink { - return l -} - -func (l discardLogSink) WithName(string) LogSink { - return l + return New(nil) } diff --git a/vendor/github.com/go-logr/logr/logr.go b/vendor/github.com/go-logr/logr/logr.go index c3b56b3d2c..e027aea3fd 100644 --- a/vendor/github.com/go-logr/logr/logr.go +++ b/vendor/github.com/go-logr/logr/logr.go @@ -21,7 +21,7 @@ limitations under the License. // to back that API. Packages in the Go ecosystem can depend on this package, // while callers can implement logging with whatever backend is appropriate. // -// Usage +// # Usage // // Logging is done using a Logger instance. Logger is a concrete type with // methods, which defers the actual logging to a LogSink interface. The main @@ -30,16 +30,20 @@ limitations under the License. // "structured logging". // // With Go's standard log package, we might write: -// log.Printf("setting target value %s", targetValue) +// +// log.Printf("setting target value %s", targetValue) // // With logr's structured logging, we'd write: -// logger.Info("setting target", "value", targetValue) +// +// logger.Info("setting target", "value", targetValue) // // Errors are much the same. Instead of: -// log.Printf("failed to open the pod bay door for user %s: %v", user, err) +// +// log.Printf("failed to open the pod bay door for user %s: %v", user, err) // // We'd write: -// logger.Error(err, "failed to open the pod bay door", "user", user) +// +// logger.Error(err, "failed to open the pod bay door", "user", user) // // Info() and Error() are very similar, but they are separate methods so that // LogSink implementations can choose to do things like attach additional @@ -47,7 +51,7 @@ limitations under the License. // always logged, regardless of the current verbosity. If there is no error // instance available, passing nil is valid. // -// Verbosity +// # Verbosity // // Often we want to log information only when the application in "verbose // mode". To write log lines that are more verbose, Logger has a V() method. @@ -58,20 +62,22 @@ limitations under the License. // Error messages do not have a verbosity level and are always logged. // // Where we might have written: -// if flVerbose >= 2 { -// log.Printf("an unusual thing happened") -// } +// +// if flVerbose >= 2 { +// log.Printf("an unusual thing happened") +// } // // We can write: -// logger.V(2).Info("an unusual thing happened") // -// Logger Names +// logger.V(2).Info("an unusual thing happened") +// +// # Logger Names // // Logger instances can have name strings so that all messages logged through // that instance have additional context. For example, you might want to add // a subsystem name: // -// logger.WithName("compactor").Info("started", "time", time.Now()) +// logger.WithName("compactor").Info("started", "time", time.Now()) // // The WithName() method returns a new Logger, which can be passed to // constructors or other functions for further use. Repeated use of WithName() @@ -82,25 +88,27 @@ limitations under the License. // joining operation (e.g. whitespace, commas, periods, slashes, brackets, // quotes, etc). // -// Saved Values +// # Saved Values // // Logger instances can store any number of key/value pairs, which will be // logged alongside all messages logged through that instance. For example, // you might want to create a Logger instance per managed object: // // With the standard log package, we might write: -// log.Printf("decided to set field foo to value %q for object %s/%s", -// targetValue, object.Namespace, object.Name) +// +// log.Printf("decided to set field foo to value %q for object %s/%s", +// targetValue, object.Namespace, object.Name) // // With logr we'd write: -// // Elsewhere: set up the logger to log the object name. -// obj.logger = mainLogger.WithValues( -// "name", obj.name, "namespace", obj.namespace) // -// // later on... -// obj.logger.Info("setting foo", "value", targetValue) +// // Elsewhere: set up the logger to log the object name. +// obj.logger = mainLogger.WithValues( +// "name", obj.name, "namespace", obj.namespace) +// +// // later on... +// obj.logger.Info("setting foo", "value", targetValue) // -// Best Practices +// # Best Practices // // Logger has very few hard rules, with the goal that LogSink implementations // might have a lot of freedom to differentiate. There are, however, some @@ -124,15 +132,15 @@ limitations under the License. // around. For cases where passing a logger is optional, a pointer to Logger // should be used. // -// Key Naming Conventions +// # Key Naming Conventions // // Keys are not strictly required to conform to any specification or regex, but // it is recommended that they: -// * be human-readable and meaningful (not auto-generated or simple ordinals) -// * be constant (not dependent on input data) -// * contain only printable characters -// * not contain whitespace or punctuation -// * use lower case for simple keys and lowerCamelCase for more complex ones +// - be human-readable and meaningful (not auto-generated or simple ordinals) +// - be constant (not dependent on input data) +// - contain only printable characters +// - not contain whitespace or punctuation +// - use lower case for simple keys and lowerCamelCase for more complex ones // // These guidelines help ensure that log data is processed properly regardless // of the log implementation. For example, log implementations will try to @@ -141,51 +149,54 @@ limitations under the License. // While users are generally free to use key names of their choice, it's // generally best to avoid using the following keys, as they're frequently used // by implementations: -// * "caller": the calling information (file/line) of a particular log line -// * "error": the underlying error value in the `Error` method -// * "level": the log level -// * "logger": the name of the associated logger -// * "msg": the log message -// * "stacktrace": the stack trace associated with a particular log line or -// error (often from the `Error` message) -// * "ts": the timestamp for a log line +// - "caller": the calling information (file/line) of a particular log line +// - "error": the underlying error value in the `Error` method +// - "level": the log level +// - "logger": the name of the associated logger +// - "msg": the log message +// - "stacktrace": the stack trace associated with a particular log line or +// error (often from the `Error` message) +// - "ts": the timestamp for a log line // // Implementations are encouraged to make use of these keys to represent the // above concepts, when necessary (for example, in a pure-JSON output form, it // would be necessary to represent at least message and timestamp as ordinary // named values). // -// Break Glass +// # Break Glass // // Implementations may choose to give callers access to the underlying // logging implementation. The recommended pattern for this is: -// // Underlier exposes access to the underlying logging implementation. -// // Since callers only have a logr.Logger, they have to know which -// // implementation is in use, so this interface is less of an abstraction -// // and more of way to test type conversion. -// type Underlier interface { -// GetUnderlying() -// } +// +// // Underlier exposes access to the underlying logging implementation. +// // Since callers only have a logr.Logger, they have to know which +// // implementation is in use, so this interface is less of an abstraction +// // and more of way to test type conversion. +// type Underlier interface { +// GetUnderlying() +// } // // Logger grants access to the sink to enable type assertions like this: -// func DoSomethingWithImpl(log logr.Logger) { -// if underlier, ok := log.GetSink()(impl.Underlier) { -// implLogger := underlier.GetUnderlying() -// ... -// } -// } +// +// func DoSomethingWithImpl(log logr.Logger) { +// if underlier, ok := log.GetSink().(impl.Underlier); ok { +// implLogger := underlier.GetUnderlying() +// ... +// } +// } // // Custom `With*` functions can be implemented by copying the complete // Logger struct and replacing the sink in the copy: -// // WithFooBar changes the foobar parameter in the log sink and returns a -// // new logger with that modified sink. It does nothing for loggers where -// // the sink doesn't support that parameter. -// func WithFoobar(log logr.Logger, foobar int) logr.Logger { -// if foobarLogSink, ok := log.GetSink()(FoobarSink); ok { -// log = log.WithSink(foobarLogSink.WithFooBar(foobar)) -// } -// return log -// } +// +// // WithFooBar changes the foobar parameter in the log sink and returns a +// // new logger with that modified sink. It does nothing for loggers where +// // the sink doesn't support that parameter. +// func WithFoobar(log logr.Logger, foobar int) logr.Logger { +// if foobarLogSink, ok := log.GetSink().(FoobarSink); ok { +// log = log.WithSink(foobarLogSink.WithFooBar(foobar)) +// } +// return log +// } // // Don't use New to construct a new Logger with a LogSink retrieved from an // existing Logger. Source code attribution might not work correctly and @@ -201,11 +212,14 @@ import ( ) // New returns a new Logger instance. This is primarily used by libraries -// implementing LogSink, rather than end users. +// implementing LogSink, rather than end users. Passing a nil sink will create +// a Logger which discards all log lines. func New(sink LogSink) Logger { logger := Logger{} logger.setSink(sink) - sink.Init(runtimeInfo) + if sink != nil { + sink.Init(runtimeInfo) + } return logger } @@ -244,7 +258,7 @@ type Logger struct { // Enabled tests whether this Logger is enabled. For example, commandline // flags might be used to set the logging verbosity and disable some info logs. func (l Logger) Enabled() bool { - return l.sink.Enabled(l.level) + return l.sink != nil && l.sink.Enabled(l.level) } // Info logs a non-error message with the given key/value pairs as context. @@ -254,6 +268,9 @@ func (l Logger) Enabled() bool { // information. The key/value pairs must alternate string keys and arbitrary // values. func (l Logger) Info(msg string, keysAndValues ...interface{}) { + if l.sink == nil { + return + } if l.Enabled() { if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { withHelper.GetCallStackHelper()() @@ -273,6 +290,9 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) { // triggered this log line, if present. The err parameter is optional // and nil may be passed instead of an error instance. func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { + if l.sink == nil { + return + } if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { withHelper.GetCallStackHelper()() } @@ -284,6 +304,9 @@ func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { // level means a log message is less important. Negative V-levels are treated // as 0. func (l Logger) V(level int) Logger { + if l.sink == nil { + return l + } if level < 0 { level = 0 } @@ -294,6 +317,9 @@ func (l Logger) V(level int) Logger { // WithValues returns a new Logger instance with additional key/value pairs. // See Info for documentation on how key/value pairs work. func (l Logger) WithValues(keysAndValues ...interface{}) Logger { + if l.sink == nil { + return l + } l.setSink(l.sink.WithValues(keysAndValues...)) return l } @@ -304,6 +330,9 @@ func (l Logger) WithValues(keysAndValues ...interface{}) Logger { // contain only letters, digits, and hyphens (see the package documentation for // more information). func (l Logger) WithName(name string) Logger { + if l.sink == nil { + return l + } l.setSink(l.sink.WithName(name)) return l } @@ -324,6 +353,9 @@ func (l Logger) WithName(name string) Logger { // WithCallDepth(1) because it works with implementions that support the // CallDepthLogSink and/or CallStackHelperLogSink interfaces. func (l Logger) WithCallDepth(depth int) Logger { + if l.sink == nil { + return l + } if withCallDepth, ok := l.sink.(CallDepthLogSink); ok { l.setSink(withCallDepth.WithCallDepth(depth)) } @@ -345,6 +377,9 @@ func (l Logger) WithCallDepth(depth int) Logger { // implementation does not support either of these, the original Logger will be // returned. func (l Logger) WithCallStackHelper() (func(), Logger) { + if l.sink == nil { + return func() {}, l + } var helper func() if withCallDepth, ok := l.sink.(CallDepthLogSink); ok { l.setSink(withCallDepth.WithCallDepth(1)) @@ -357,6 +392,11 @@ func (l Logger) WithCallStackHelper() (func(), Logger) { return helper, l } +// IsZero returns true if this logger is an uninitialized zero value +func (l Logger) IsZero() bool { + return l.sink == nil +} + // contextKey is how we find Loggers in a context.Context. type contextKey struct{} @@ -442,7 +482,7 @@ type LogSink interface { WithName(name string) LogSink } -// CallDepthLogSink represents a Logger that knows how to climb the call stack +// CallDepthLogSink represents a LogSink that knows how to climb the call stack // to identify the original call site and can offset the depth by a specified // number of frames. This is useful for users who have helper functions // between the "real" call site and the actual calls to Logger methods. @@ -467,7 +507,7 @@ type CallDepthLogSink interface { WithCallDepth(depth int) LogSink } -// CallStackHelperLogSink represents a Logger that knows how to climb +// CallStackHelperLogSink represents a LogSink that knows how to climb // the call stack to identify the original call site and can skip // intermediate helper functions if they mark themselves as // helper. Go's testing package uses that approach. diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go index f78ab684a0..d971fbe34b 100644 --- a/vendor/github.com/go-openapi/swag/util.go +++ b/vendor/github.com/go-openapi/swag/util.go @@ -341,12 +341,21 @@ type zeroable interface { // IsZero returns true when the value passed into the function is a zero value. // This allows for safer checking of interface values. func IsZero(data interface{}) bool { + v := reflect.ValueOf(data) + // check for nil data + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + if v.IsNil() { + return true + } + } + // check for things that have an IsZero method instead if vv, ok := data.(zeroable); ok { return vv.IsZero() } + // continue with slightly more complex reflection - v := reflect.ValueOf(data) switch v.Kind() { case reflect.String: return v.Len() == 0 @@ -358,14 +367,13 @@ func IsZero(data interface{}) bool { return v.Uint() == 0 case reflect.Float32, reflect.Float64: return v.Float() == 0 - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() case reflect.Struct, reflect.Array: return reflect.DeepEqual(data, reflect.Zero(v.Type()).Interface()) case reflect.Invalid: return true + default: + return false } - return false } // AddInitialisms add additional initialisms diff --git a/vendor/github.com/gogo/protobuf/gogoproto/Makefile b/vendor/github.com/gogo/protobuf/gogoproto/Makefile deleted file mode 100644 index 0b4659b731..0000000000 --- a/vendor/github.com/gogo/protobuf/gogoproto/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# Protocol Buffers for Go with Gadgets -# -# Copyright (c) 2013, The GoGo Authors. All rights reserved. -# http://github.com/gogo/protobuf -# -# 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. -# -# 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. - -regenerate: - go install github.com/gogo/protobuf/protoc-gen-gogo - protoc --gogo_out=Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:../../../../ --proto_path=../../../../:../protobuf/:. *.proto - -restore: - cp gogo.pb.golden gogo.pb.go - -preserve: - cp gogo.pb.go gogo.pb.golden diff --git a/vendor/github.com/gogo/protobuf/gogoproto/doc.go b/vendor/github.com/gogo/protobuf/gogoproto/doc.go deleted file mode 100644 index 081c86fa8e..0000000000 --- a/vendor/github.com/gogo/protobuf/gogoproto/doc.go +++ /dev/null @@ -1,169 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// 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. -// -// 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 gogoproto provides extensions for protocol buffers to achieve: - - - fast marshalling and unmarshalling. - - peace of mind by optionally generating test and benchmark code. - - more canonical Go structures. - - less typing by optionally generating extra helper code. - - goprotobuf compatibility - -More Canonical Go Structures - -A lot of time working with a goprotobuf struct will lead you to a place where you create another struct that is easier to work with and then have a function to copy the values between the two structs. -You might also find that basic structs that started their life as part of an API need to be sent over the wire. With gob, you could just send it. With goprotobuf, you need to make a parallel struct. -Gogoprotobuf tries to fix these problems with the nullable, embed, customtype and customname field extensions. - - - nullable, if false, a field is generated without a pointer (see warning below). - - embed, if true, the field is generated as an embedded field. - - customtype, It works with the Marshal and Unmarshal methods, to allow you to have your own types in your struct, but marshal to bytes. For example, custom.Uuid or custom.Fixed128 - - customname (beta), Changes the generated fieldname. This is especially useful when generated methods conflict with fieldnames. - - casttype (beta), Changes the generated fieldtype. All generated code assumes that this type is castable to the protocol buffer field type. It does not work for structs or enums. - - castkey (beta), Changes the generated fieldtype for a map key. All generated code assumes that this type is castable to the protocol buffer field type. Only supported on maps. - - castvalue (beta), Changes the generated fieldtype for a map value. All generated code assumes that this type is castable to the protocol buffer field type. Only supported on maps. - -Warning about nullable: According to the Protocol Buffer specification, you should be able to tell whether a field is set or unset. With the option nullable=false this feature is lost, since your non-nullable fields will always be set. It can be seen as a layer on top of Protocol Buffers, where before and after marshalling all non-nullable fields are set and they cannot be unset. - -Let us look at: - - github.com/gogo/protobuf/test/example/example.proto - -for a quicker overview. - -The following message: - - package test; - - import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - - message A { - optional string Description = 1 [(gogoproto.nullable) = false]; - optional int64 Number = 2 [(gogoproto.nullable) = false]; - optional bytes Id = 3 [(gogoproto.customtype) = "github.com/gogo/protobuf/test/custom.Uuid", (gogoproto.nullable) = false]; - } - -Will generate a go struct which looks a lot like this: - - type A struct { - Description string - Number int64 - Id github_com_gogo_protobuf_test_custom.Uuid - } - -You will see there are no pointers, since all fields are non-nullable. -You will also see a custom type which marshals to a string. -Be warned it is your responsibility to test your custom types thoroughly. -You should think of every possible empty and nil case for your marshaling, unmarshaling and size methods. - -Next we will embed the message A in message B. - - message B { - optional A A = 1 [(gogoproto.nullable) = false, (gogoproto.embed) = true]; - repeated bytes G = 2 [(gogoproto.customtype) = "github.com/gogo/protobuf/test/custom.Uint128", (gogoproto.nullable) = false]; - } - -See below that A is embedded in B. - - type B struct { - A - G []github_com_gogo_protobuf_test_custom.Uint128 - } - -Also see the repeated custom type. - - type Uint128 [2]uint64 - -Next we will create a custom name for one of our fields. - - message C { - optional int64 size = 1 [(gogoproto.customname) = "MySize"]; - } - -See below that the field's name is MySize and not Size. - - type C struct { - MySize *int64 - } - -The is useful when having a protocol buffer message with a field name which conflicts with a generated method. -As an example, having a field name size and using the sizer plugin to generate a Size method will cause a go compiler error. -Using customname you can fix this error without changing the field name. -This is typically useful when working with a protocol buffer that was designed before these methods and/or the go language were avialable. - -Gogoprotobuf also has some more subtle changes, these could be changed back: - - - the generated package name for imports do not have the extra /filename.pb, - but are actually the imports specified in the .proto file. - -Gogoprotobuf also has lost some features which should be brought back with time: - - - Marshalling and unmarshalling with reflect and without the unsafe package, - this requires work in pointer_reflect.go - -Why does nullable break protocol buffer specifications: - -The protocol buffer specification states, somewhere, that you should be able to tell whether a -field is set or unset. With the option nullable=false this feature is lost, -since your non-nullable fields will always be set. It can be seen as a layer on top of -protocol buffers, where before and after marshalling all non-nullable fields are set -and they cannot be unset. - -Goprotobuf Compatibility: - -Gogoprotobuf is compatible with Goprotobuf, because it is compatible with protocol buffers. -Gogoprotobuf generates the same code as goprotobuf if no extensions are used. -The enumprefix, getters and stringer extensions can be used to remove some of the unnecessary code generated by goprotobuf: - - - gogoproto_import, if false, the generated code imports github.com/golang/protobuf/proto instead of github.com/gogo/protobuf/proto. - - goproto_enum_prefix, if false, generates the enum constant names without the messagetype prefix - - goproto_enum_stringer (experimental), if false, the enum is generated without the default string method, this is useful for rather using enum_stringer, or allowing you to write your own string method. - - goproto_getters, if false, the message is generated without get methods, this is useful when you would rather want to use face - - goproto_stringer, if false, the message is generated without the default string method, this is useful for rather using stringer, or allowing you to write your own string method. - - goproto_extensions_map (beta), if false, the extensions field is generated as type []byte instead of type map[int32]proto.Extension - - goproto_unrecognized (beta), if false, XXX_unrecognized field is not generated. This is useful in conjunction with gogoproto.nullable=false, to generate structures completely devoid of pointers and reduce GC pressure at the cost of losing information about unrecognized fields. - - goproto_registration (beta), if true, the generated files will register all messages and types against both gogo/protobuf and golang/protobuf. This is necessary when using third-party packages which read registrations from golang/protobuf (such as the grpc-gateway). - -Less Typing and Peace of Mind is explained in their specific plugin folders godoc: - - - github.com/gogo/protobuf/plugin/ - -If you do not use any of these extension the code that is generated -will be the same as if goprotobuf has generated it. - -The most complete way to see examples is to look at - - github.com/gogo/protobuf/test/thetest.proto - -Gogoprototest is a seperate project, -because we want to keep gogoprotobuf independent of goprotobuf, -but we still want to test it thoroughly. - -*/ -package gogoproto diff --git a/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go b/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go deleted file mode 100644 index 1e91766aee..0000000000 --- a/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go +++ /dev/null @@ -1,874 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: gogo.proto - -package gogoproto - -import ( - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" - 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -var E_GoprotoEnumPrefix = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.EnumOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 62001, - Name: "gogoproto.goproto_enum_prefix", - Tag: "varint,62001,opt,name=goproto_enum_prefix", - Filename: "gogo.proto", -} - -var E_GoprotoEnumStringer = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.EnumOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 62021, - Name: "gogoproto.goproto_enum_stringer", - Tag: "varint,62021,opt,name=goproto_enum_stringer", - Filename: "gogo.proto", -} - -var E_EnumStringer = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.EnumOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 62022, - Name: "gogoproto.enum_stringer", - Tag: "varint,62022,opt,name=enum_stringer", - Filename: "gogo.proto", -} - -var E_EnumCustomname = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.EnumOptions)(nil), - ExtensionType: (*string)(nil), - Field: 62023, - Name: "gogoproto.enum_customname", - Tag: "bytes,62023,opt,name=enum_customname", - Filename: "gogo.proto", -} - -var E_Enumdecl = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.EnumOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 62024, - Name: "gogoproto.enumdecl", - Tag: "varint,62024,opt,name=enumdecl", - Filename: "gogo.proto", -} - -var E_EnumvalueCustomname = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.EnumValueOptions)(nil), - ExtensionType: (*string)(nil), - Field: 66001, - Name: "gogoproto.enumvalue_customname", - Tag: "bytes,66001,opt,name=enumvalue_customname", - Filename: "gogo.proto", -} - -var E_GoprotoGettersAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63001, - Name: "gogoproto.goproto_getters_all", - Tag: "varint,63001,opt,name=goproto_getters_all", - Filename: "gogo.proto", -} - -var E_GoprotoEnumPrefixAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63002, - Name: "gogoproto.goproto_enum_prefix_all", - Tag: "varint,63002,opt,name=goproto_enum_prefix_all", - Filename: "gogo.proto", -} - -var E_GoprotoStringerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63003, - Name: "gogoproto.goproto_stringer_all", - Tag: "varint,63003,opt,name=goproto_stringer_all", - Filename: "gogo.proto", -} - -var E_VerboseEqualAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63004, - Name: "gogoproto.verbose_equal_all", - Tag: "varint,63004,opt,name=verbose_equal_all", - Filename: "gogo.proto", -} - -var E_FaceAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63005, - Name: "gogoproto.face_all", - Tag: "varint,63005,opt,name=face_all", - Filename: "gogo.proto", -} - -var E_GostringAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63006, - Name: "gogoproto.gostring_all", - Tag: "varint,63006,opt,name=gostring_all", - Filename: "gogo.proto", -} - -var E_PopulateAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63007, - Name: "gogoproto.populate_all", - Tag: "varint,63007,opt,name=populate_all", - Filename: "gogo.proto", -} - -var E_StringerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63008, - Name: "gogoproto.stringer_all", - Tag: "varint,63008,opt,name=stringer_all", - Filename: "gogo.proto", -} - -var E_OnlyoneAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63009, - Name: "gogoproto.onlyone_all", - Tag: "varint,63009,opt,name=onlyone_all", - Filename: "gogo.proto", -} - -var E_EqualAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63013, - Name: "gogoproto.equal_all", - Tag: "varint,63013,opt,name=equal_all", - Filename: "gogo.proto", -} - -var E_DescriptionAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63014, - Name: "gogoproto.description_all", - Tag: "varint,63014,opt,name=description_all", - Filename: "gogo.proto", -} - -var E_TestgenAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63015, - Name: "gogoproto.testgen_all", - Tag: "varint,63015,opt,name=testgen_all", - Filename: "gogo.proto", -} - -var E_BenchgenAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63016, - Name: "gogoproto.benchgen_all", - Tag: "varint,63016,opt,name=benchgen_all", - Filename: "gogo.proto", -} - -var E_MarshalerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63017, - Name: "gogoproto.marshaler_all", - Tag: "varint,63017,opt,name=marshaler_all", - Filename: "gogo.proto", -} - -var E_UnmarshalerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63018, - Name: "gogoproto.unmarshaler_all", - Tag: "varint,63018,opt,name=unmarshaler_all", - Filename: "gogo.proto", -} - -var E_StableMarshalerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63019, - Name: "gogoproto.stable_marshaler_all", - Tag: "varint,63019,opt,name=stable_marshaler_all", - Filename: "gogo.proto", -} - -var E_SizerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63020, - Name: "gogoproto.sizer_all", - Tag: "varint,63020,opt,name=sizer_all", - Filename: "gogo.proto", -} - -var E_GoprotoEnumStringerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63021, - Name: "gogoproto.goproto_enum_stringer_all", - Tag: "varint,63021,opt,name=goproto_enum_stringer_all", - Filename: "gogo.proto", -} - -var E_EnumStringerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63022, - Name: "gogoproto.enum_stringer_all", - Tag: "varint,63022,opt,name=enum_stringer_all", - Filename: "gogo.proto", -} - -var E_UnsafeMarshalerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63023, - Name: "gogoproto.unsafe_marshaler_all", - Tag: "varint,63023,opt,name=unsafe_marshaler_all", - Filename: "gogo.proto", -} - -var E_UnsafeUnmarshalerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63024, - Name: "gogoproto.unsafe_unmarshaler_all", - Tag: "varint,63024,opt,name=unsafe_unmarshaler_all", - Filename: "gogo.proto", -} - -var E_GoprotoExtensionsMapAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63025, - Name: "gogoproto.goproto_extensions_map_all", - Tag: "varint,63025,opt,name=goproto_extensions_map_all", - Filename: "gogo.proto", -} - -var E_GoprotoUnrecognizedAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63026, - Name: "gogoproto.goproto_unrecognized_all", - Tag: "varint,63026,opt,name=goproto_unrecognized_all", - Filename: "gogo.proto", -} - -var E_GogoprotoImport = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63027, - Name: "gogoproto.gogoproto_import", - Tag: "varint,63027,opt,name=gogoproto_import", - Filename: "gogo.proto", -} - -var E_ProtosizerAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63028, - Name: "gogoproto.protosizer_all", - Tag: "varint,63028,opt,name=protosizer_all", - Filename: "gogo.proto", -} - -var E_CompareAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63029, - Name: "gogoproto.compare_all", - Tag: "varint,63029,opt,name=compare_all", - Filename: "gogo.proto", -} - -var E_TypedeclAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63030, - Name: "gogoproto.typedecl_all", - Tag: "varint,63030,opt,name=typedecl_all", - Filename: "gogo.proto", -} - -var E_EnumdeclAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63031, - Name: "gogoproto.enumdecl_all", - Tag: "varint,63031,opt,name=enumdecl_all", - Filename: "gogo.proto", -} - -var E_GoprotoRegistration = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63032, - Name: "gogoproto.goproto_registration", - Tag: "varint,63032,opt,name=goproto_registration", - Filename: "gogo.proto", -} - -var E_MessagenameAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63033, - Name: "gogoproto.messagename_all", - Tag: "varint,63033,opt,name=messagename_all", - Filename: "gogo.proto", -} - -var E_GoprotoSizecacheAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63034, - Name: "gogoproto.goproto_sizecache_all", - Tag: "varint,63034,opt,name=goproto_sizecache_all", - Filename: "gogo.proto", -} - -var E_GoprotoUnkeyedAll = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FileOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 63035, - Name: "gogoproto.goproto_unkeyed_all", - Tag: "varint,63035,opt,name=goproto_unkeyed_all", - Filename: "gogo.proto", -} - -var E_GoprotoGetters = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64001, - Name: "gogoproto.goproto_getters", - Tag: "varint,64001,opt,name=goproto_getters", - Filename: "gogo.proto", -} - -var E_GoprotoStringer = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64003, - Name: "gogoproto.goproto_stringer", - Tag: "varint,64003,opt,name=goproto_stringer", - Filename: "gogo.proto", -} - -var E_VerboseEqual = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64004, - Name: "gogoproto.verbose_equal", - Tag: "varint,64004,opt,name=verbose_equal", - Filename: "gogo.proto", -} - -var E_Face = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64005, - Name: "gogoproto.face", - Tag: "varint,64005,opt,name=face", - Filename: "gogo.proto", -} - -var E_Gostring = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64006, - Name: "gogoproto.gostring", - Tag: "varint,64006,opt,name=gostring", - Filename: "gogo.proto", -} - -var E_Populate = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64007, - Name: "gogoproto.populate", - Tag: "varint,64007,opt,name=populate", - Filename: "gogo.proto", -} - -var E_Stringer = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 67008, - Name: "gogoproto.stringer", - Tag: "varint,67008,opt,name=stringer", - Filename: "gogo.proto", -} - -var E_Onlyone = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64009, - Name: "gogoproto.onlyone", - Tag: "varint,64009,opt,name=onlyone", - Filename: "gogo.proto", -} - -var E_Equal = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64013, - Name: "gogoproto.equal", - Tag: "varint,64013,opt,name=equal", - Filename: "gogo.proto", -} - -var E_Description = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64014, - Name: "gogoproto.description", - Tag: "varint,64014,opt,name=description", - Filename: "gogo.proto", -} - -var E_Testgen = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64015, - Name: "gogoproto.testgen", - Tag: "varint,64015,opt,name=testgen", - Filename: "gogo.proto", -} - -var E_Benchgen = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64016, - Name: "gogoproto.benchgen", - Tag: "varint,64016,opt,name=benchgen", - Filename: "gogo.proto", -} - -var E_Marshaler = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64017, - Name: "gogoproto.marshaler", - Tag: "varint,64017,opt,name=marshaler", - Filename: "gogo.proto", -} - -var E_Unmarshaler = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64018, - Name: "gogoproto.unmarshaler", - Tag: "varint,64018,opt,name=unmarshaler", - Filename: "gogo.proto", -} - -var E_StableMarshaler = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64019, - Name: "gogoproto.stable_marshaler", - Tag: "varint,64019,opt,name=stable_marshaler", - Filename: "gogo.proto", -} - -var E_Sizer = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64020, - Name: "gogoproto.sizer", - Tag: "varint,64020,opt,name=sizer", - Filename: "gogo.proto", -} - -var E_UnsafeMarshaler = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64023, - Name: "gogoproto.unsafe_marshaler", - Tag: "varint,64023,opt,name=unsafe_marshaler", - Filename: "gogo.proto", -} - -var E_UnsafeUnmarshaler = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64024, - Name: "gogoproto.unsafe_unmarshaler", - Tag: "varint,64024,opt,name=unsafe_unmarshaler", - Filename: "gogo.proto", -} - -var E_GoprotoExtensionsMap = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64025, - Name: "gogoproto.goproto_extensions_map", - Tag: "varint,64025,opt,name=goproto_extensions_map", - Filename: "gogo.proto", -} - -var E_GoprotoUnrecognized = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64026, - Name: "gogoproto.goproto_unrecognized", - Tag: "varint,64026,opt,name=goproto_unrecognized", - Filename: "gogo.proto", -} - -var E_Protosizer = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64028, - Name: "gogoproto.protosizer", - Tag: "varint,64028,opt,name=protosizer", - Filename: "gogo.proto", -} - -var E_Compare = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64029, - Name: "gogoproto.compare", - Tag: "varint,64029,opt,name=compare", - Filename: "gogo.proto", -} - -var E_Typedecl = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64030, - Name: "gogoproto.typedecl", - Tag: "varint,64030,opt,name=typedecl", - Filename: "gogo.proto", -} - -var E_Messagename = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64033, - Name: "gogoproto.messagename", - Tag: "varint,64033,opt,name=messagename", - Filename: "gogo.proto", -} - -var E_GoprotoSizecache = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64034, - Name: "gogoproto.goproto_sizecache", - Tag: "varint,64034,opt,name=goproto_sizecache", - Filename: "gogo.proto", -} - -var E_GoprotoUnkeyed = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.MessageOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 64035, - Name: "gogoproto.goproto_unkeyed", - Tag: "varint,64035,opt,name=goproto_unkeyed", - Filename: "gogo.proto", -} - -var E_Nullable = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 65001, - Name: "gogoproto.nullable", - Tag: "varint,65001,opt,name=nullable", - Filename: "gogo.proto", -} - -var E_Embed = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 65002, - Name: "gogoproto.embed", - Tag: "varint,65002,opt,name=embed", - Filename: "gogo.proto", -} - -var E_Customtype = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 65003, - Name: "gogoproto.customtype", - Tag: "bytes,65003,opt,name=customtype", - Filename: "gogo.proto", -} - -var E_Customname = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 65004, - Name: "gogoproto.customname", - Tag: "bytes,65004,opt,name=customname", - Filename: "gogo.proto", -} - -var E_Jsontag = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 65005, - Name: "gogoproto.jsontag", - Tag: "bytes,65005,opt,name=jsontag", - Filename: "gogo.proto", -} - -var E_Moretags = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 65006, - Name: "gogoproto.moretags", - Tag: "bytes,65006,opt,name=moretags", - Filename: "gogo.proto", -} - -var E_Casttype = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 65007, - Name: "gogoproto.casttype", - Tag: "bytes,65007,opt,name=casttype", - Filename: "gogo.proto", -} - -var E_Castkey = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 65008, - Name: "gogoproto.castkey", - Tag: "bytes,65008,opt,name=castkey", - Filename: "gogo.proto", -} - -var E_Castvalue = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 65009, - Name: "gogoproto.castvalue", - Tag: "bytes,65009,opt,name=castvalue", - Filename: "gogo.proto", -} - -var E_Stdtime = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 65010, - Name: "gogoproto.stdtime", - Tag: "varint,65010,opt,name=stdtime", - Filename: "gogo.proto", -} - -var E_Stdduration = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 65011, - Name: "gogoproto.stdduration", - Tag: "varint,65011,opt,name=stdduration", - Filename: "gogo.proto", -} - -var E_Wktpointer = &proto.ExtensionDesc{ - ExtendedType: (*descriptor.FieldOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 65012, - Name: "gogoproto.wktpointer", - Tag: "varint,65012,opt,name=wktpointer", - Filename: "gogo.proto", -} - -func init() { - proto.RegisterExtension(E_GoprotoEnumPrefix) - proto.RegisterExtension(E_GoprotoEnumStringer) - proto.RegisterExtension(E_EnumStringer) - proto.RegisterExtension(E_EnumCustomname) - proto.RegisterExtension(E_Enumdecl) - proto.RegisterExtension(E_EnumvalueCustomname) - proto.RegisterExtension(E_GoprotoGettersAll) - proto.RegisterExtension(E_GoprotoEnumPrefixAll) - proto.RegisterExtension(E_GoprotoStringerAll) - proto.RegisterExtension(E_VerboseEqualAll) - proto.RegisterExtension(E_FaceAll) - proto.RegisterExtension(E_GostringAll) - proto.RegisterExtension(E_PopulateAll) - proto.RegisterExtension(E_StringerAll) - proto.RegisterExtension(E_OnlyoneAll) - proto.RegisterExtension(E_EqualAll) - proto.RegisterExtension(E_DescriptionAll) - proto.RegisterExtension(E_TestgenAll) - proto.RegisterExtension(E_BenchgenAll) - proto.RegisterExtension(E_MarshalerAll) - proto.RegisterExtension(E_UnmarshalerAll) - proto.RegisterExtension(E_StableMarshalerAll) - proto.RegisterExtension(E_SizerAll) - proto.RegisterExtension(E_GoprotoEnumStringerAll) - proto.RegisterExtension(E_EnumStringerAll) - proto.RegisterExtension(E_UnsafeMarshalerAll) - proto.RegisterExtension(E_UnsafeUnmarshalerAll) - proto.RegisterExtension(E_GoprotoExtensionsMapAll) - proto.RegisterExtension(E_GoprotoUnrecognizedAll) - proto.RegisterExtension(E_GogoprotoImport) - proto.RegisterExtension(E_ProtosizerAll) - proto.RegisterExtension(E_CompareAll) - proto.RegisterExtension(E_TypedeclAll) - proto.RegisterExtension(E_EnumdeclAll) - proto.RegisterExtension(E_GoprotoRegistration) - proto.RegisterExtension(E_MessagenameAll) - proto.RegisterExtension(E_GoprotoSizecacheAll) - proto.RegisterExtension(E_GoprotoUnkeyedAll) - proto.RegisterExtension(E_GoprotoGetters) - proto.RegisterExtension(E_GoprotoStringer) - proto.RegisterExtension(E_VerboseEqual) - proto.RegisterExtension(E_Face) - proto.RegisterExtension(E_Gostring) - proto.RegisterExtension(E_Populate) - proto.RegisterExtension(E_Stringer) - proto.RegisterExtension(E_Onlyone) - proto.RegisterExtension(E_Equal) - proto.RegisterExtension(E_Description) - proto.RegisterExtension(E_Testgen) - proto.RegisterExtension(E_Benchgen) - proto.RegisterExtension(E_Marshaler) - proto.RegisterExtension(E_Unmarshaler) - proto.RegisterExtension(E_StableMarshaler) - proto.RegisterExtension(E_Sizer) - proto.RegisterExtension(E_UnsafeMarshaler) - proto.RegisterExtension(E_UnsafeUnmarshaler) - proto.RegisterExtension(E_GoprotoExtensionsMap) - proto.RegisterExtension(E_GoprotoUnrecognized) - proto.RegisterExtension(E_Protosizer) - proto.RegisterExtension(E_Compare) - proto.RegisterExtension(E_Typedecl) - proto.RegisterExtension(E_Messagename) - proto.RegisterExtension(E_GoprotoSizecache) - proto.RegisterExtension(E_GoprotoUnkeyed) - proto.RegisterExtension(E_Nullable) - proto.RegisterExtension(E_Embed) - proto.RegisterExtension(E_Customtype) - proto.RegisterExtension(E_Customname) - proto.RegisterExtension(E_Jsontag) - proto.RegisterExtension(E_Moretags) - proto.RegisterExtension(E_Casttype) - proto.RegisterExtension(E_Castkey) - proto.RegisterExtension(E_Castvalue) - proto.RegisterExtension(E_Stdtime) - proto.RegisterExtension(E_Stdduration) - proto.RegisterExtension(E_Wktpointer) -} - -func init() { proto.RegisterFile("gogo.proto", fileDescriptor_592445b5231bc2b9) } - -var fileDescriptor_592445b5231bc2b9 = []byte{ - // 1328 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x98, 0x49, 0x6f, 0x1c, 0x45, - 0x14, 0x80, 0x85, 0x48, 0x64, 0x4f, 0x79, 0x8b, 0xc7, 0xc6, 0x84, 0x08, 0x44, 0xe0, 0xc4, 0xc9, - 0x3e, 0x45, 0x28, 0x65, 0x45, 0x96, 0x63, 0x39, 0x56, 0x10, 0x0e, 0xc6, 0x89, 0xc3, 0x76, 0x18, - 0xf5, 0xf4, 0x94, 0xdb, 0x8d, 0xbb, 0xbb, 0x9a, 0xee, 0xea, 0x10, 0xe7, 0x86, 0xc2, 0x22, 0x84, - 0xd8, 0x91, 0x20, 0x21, 0x09, 0x04, 0xc4, 0xbe, 0x86, 0x7d, 0xb9, 0x70, 0x61, 0xb9, 0xf2, 0x1f, - 0xb8, 0x00, 0x66, 0xf7, 0xcd, 0x17, 0xf4, 0xba, 0xdf, 0xeb, 0xa9, 0x69, 0x8f, 0x54, 0x35, 0xb7, - 0xf6, 0xb8, 0xbe, 0x6f, 0xaa, 0xdf, 0xeb, 0x7a, 0xef, 0x4d, 0x33, 0xe6, 0x49, 0x4f, 0x4e, 0xc6, - 0x89, 0x54, 0xb2, 0x5e, 0x83, 0xeb, 0xfc, 0x72, 0xdf, 0x7e, 0x4f, 0x4a, 0x2f, 0x10, 0x53, 0xf9, - 0x5f, 0xcd, 0x6c, 0x75, 0xaa, 0x25, 0x52, 0x37, 0xf1, 0x63, 0x25, 0x93, 0x62, 0x31, 0x3f, 0xc6, - 0xc6, 0x70, 0x71, 0x43, 0x44, 0x59, 0xd8, 0x88, 0x13, 0xb1, 0xea, 0x9f, 0xae, 0x5f, 0x3f, 0x59, - 0x90, 0x93, 0x44, 0x4e, 0xce, 0x47, 0x59, 0x78, 0x47, 0xac, 0x7c, 0x19, 0xa5, 0x7b, 0xaf, 0xfc, - 0x72, 0xf5, 0xfe, 0xab, 0x6e, 0xe9, 0x5f, 0x1e, 0x45, 0x14, 0xfe, 0xb7, 0x94, 0x83, 0x7c, 0x99, - 0x5d, 0xd3, 0xe1, 0x4b, 0x55, 0xe2, 0x47, 0x9e, 0x48, 0x0c, 0xc6, 0xef, 0xd1, 0x38, 0xa6, 0x19, - 0x8f, 0x23, 0xca, 0xe7, 0xd8, 0x50, 0x2f, 0xae, 0x1f, 0xd0, 0x35, 0x28, 0x74, 0xc9, 0x02, 0x1b, - 0xc9, 0x25, 0x6e, 0x96, 0x2a, 0x19, 0x46, 0x4e, 0x28, 0x0c, 0x9a, 0x1f, 0x73, 0x4d, 0x6d, 0x79, - 0x18, 0xb0, 0xb9, 0x92, 0xe2, 0x9c, 0xf5, 0xc3, 0x27, 0x2d, 0xe1, 0x06, 0x06, 0xc3, 0x4f, 0xb8, - 0x91, 0x72, 0x3d, 0x3f, 0xc9, 0xc6, 0xe1, 0xfa, 0x94, 0x13, 0x64, 0x42, 0xdf, 0xc9, 0x4d, 0x5d, - 0x3d, 0x27, 0x61, 0x19, 0xc9, 0x7e, 0x3e, 0xbb, 0x2b, 0xdf, 0xce, 0x58, 0x29, 0xd0, 0xf6, 0xa4, - 0x65, 0xd1, 0x13, 0x4a, 0x89, 0x24, 0x6d, 0x38, 0x41, 0xb7, 0xed, 0x1d, 0xf1, 0x83, 0xd2, 0x78, - 0x6e, 0xb3, 0x33, 0x8b, 0x0b, 0x05, 0x39, 0x1b, 0x04, 0x7c, 0x85, 0x5d, 0xdb, 0xe5, 0xa9, 0xb0, - 0x70, 0x9e, 0x47, 0xe7, 0xf8, 0x8e, 0x27, 0x03, 0xb4, 0x4b, 0x8c, 0x3e, 0x2f, 0x73, 0x69, 0xe1, - 0x7c, 0x19, 0x9d, 0x75, 0x64, 0x29, 0xa5, 0x60, 0xbc, 0x8d, 0x8d, 0x9e, 0x12, 0x49, 0x53, 0xa6, - 0xa2, 0x21, 0x1e, 0xc8, 0x9c, 0xc0, 0x42, 0x77, 0x01, 0x75, 0x23, 0x08, 0xce, 0x03, 0x07, 0xae, - 0x83, 0xac, 0x7f, 0xd5, 0x71, 0x85, 0x85, 0xe2, 0x22, 0x2a, 0xfa, 0x60, 0x3d, 0xa0, 0xb3, 0x6c, - 0xd0, 0x93, 0xc5, 0x2d, 0x59, 0xe0, 0x97, 0x10, 0x1f, 0x20, 0x06, 0x15, 0xb1, 0x8c, 0xb3, 0xc0, - 0x51, 0x36, 0x3b, 0x78, 0x85, 0x14, 0xc4, 0xa0, 0xa2, 0x87, 0xb0, 0xbe, 0x4a, 0x8a, 0x54, 0x8b, - 0xe7, 0x0c, 0x1b, 0x90, 0x51, 0xb0, 0x21, 0x23, 0x9b, 0x4d, 0x5c, 0x46, 0x03, 0x43, 0x04, 0x04, - 0xd3, 0xac, 0x66, 0x9b, 0x88, 0x37, 0x36, 0xe9, 0x78, 0x50, 0x06, 0x16, 0xd8, 0x08, 0x15, 0x28, - 0x5f, 0x46, 0x16, 0x8a, 0x37, 0x51, 0x31, 0xac, 0x61, 0x78, 0x1b, 0x4a, 0xa4, 0xca, 0x13, 0x36, - 0x92, 0xb7, 0xe8, 0x36, 0x10, 0xc1, 0x50, 0x36, 0x45, 0xe4, 0xae, 0xd9, 0x19, 0xde, 0xa6, 0x50, - 0x12, 0x03, 0x8a, 0x39, 0x36, 0x14, 0x3a, 0x49, 0xba, 0xe6, 0x04, 0x56, 0xe9, 0x78, 0x07, 0x1d, - 0x83, 0x25, 0x84, 0x11, 0xc9, 0xa2, 0x5e, 0x34, 0xef, 0x52, 0x44, 0x34, 0x0c, 0x8f, 0x5e, 0xaa, - 0x9c, 0x66, 0x20, 0x1a, 0xbd, 0xd8, 0xde, 0xa3, 0xa3, 0x57, 0xb0, 0x8b, 0xba, 0x71, 0x9a, 0xd5, - 0x52, 0xff, 0x8c, 0x95, 0xe6, 0x7d, 0xca, 0x74, 0x0e, 0x00, 0x7c, 0x0f, 0xbb, 0xae, 0x6b, 0x9b, - 0xb0, 0x90, 0x7d, 0x80, 0xb2, 0x89, 0x2e, 0xad, 0x02, 0x4b, 0x42, 0xaf, 0xca, 0x0f, 0xa9, 0x24, - 0x88, 0x8a, 0x6b, 0x89, 0x8d, 0x67, 0x51, 0xea, 0xac, 0xf6, 0x16, 0xb5, 0x8f, 0x28, 0x6a, 0x05, - 0xdb, 0x11, 0xb5, 0x13, 0x6c, 0x02, 0x8d, 0xbd, 0xe5, 0xf5, 0x63, 0x2a, 0xac, 0x05, 0xbd, 0xd2, - 0x99, 0xdd, 0xfb, 0xd8, 0xbe, 0x32, 0x9c, 0xa7, 0x95, 0x88, 0x52, 0x60, 0x1a, 0xa1, 0x13, 0x5b, - 0x98, 0xaf, 0xa0, 0x99, 0x2a, 0xfe, 0x7c, 0x29, 0x58, 0x74, 0x62, 0x90, 0xdf, 0xcd, 0xf6, 0x92, - 0x3c, 0x8b, 0x12, 0xe1, 0x4a, 0x2f, 0xf2, 0xcf, 0x88, 0x96, 0x85, 0xfa, 0x93, 0x4a, 0xaa, 0x56, - 0x34, 0x1c, 0xcc, 0x47, 0xd9, 0x9e, 0x72, 0x56, 0x69, 0xf8, 0x61, 0x2c, 0x13, 0x65, 0x30, 0x7e, - 0x4a, 0x99, 0x2a, 0xb9, 0xa3, 0x39, 0xc6, 0xe7, 0xd9, 0x70, 0xfe, 0xa7, 0xed, 0x23, 0xf9, 0x19, - 0x8a, 0x86, 0xda, 0x14, 0x16, 0x0e, 0x57, 0x86, 0xb1, 0x93, 0xd8, 0xd4, 0xbf, 0xcf, 0xa9, 0x70, - 0x20, 0x82, 0x85, 0x43, 0x6d, 0xc4, 0x02, 0xba, 0xbd, 0x85, 0xe1, 0x0b, 0x2a, 0x1c, 0xc4, 0xa0, - 0x82, 0x06, 0x06, 0x0b, 0xc5, 0x97, 0xa4, 0x20, 0x06, 0x14, 0x77, 0xb6, 0x1b, 0x6d, 0x22, 0x3c, - 0x3f, 0x55, 0x89, 0x03, 0xab, 0x0d, 0xaa, 0xaf, 0x36, 0x3b, 0x87, 0xb0, 0x65, 0x0d, 0x85, 0x4a, - 0x14, 0x8a, 0x34, 0x75, 0x3c, 0x01, 0x13, 0x87, 0xc5, 0xc6, 0xbe, 0xa6, 0x4a, 0xa4, 0x61, 0xb0, - 0x37, 0x6d, 0x42, 0x84, 0xb0, 0xbb, 0x8e, 0xbb, 0x66, 0xa3, 0xfb, 0xa6, 0xb2, 0xb9, 0xe3, 0xc4, - 0x82, 0x53, 0x9b, 0x7f, 0xb2, 0x68, 0x5d, 0x6c, 0x58, 0x3d, 0x9d, 0xdf, 0x56, 0xe6, 0x9f, 0x95, - 0x82, 0x2c, 0x6a, 0xc8, 0x48, 0x65, 0x9e, 0xaa, 0xdf, 0xb8, 0xc3, 0xb5, 0x58, 0xdc, 0x17, 0xe9, - 0x1e, 0xda, 0xc2, 0xfb, 0xed, 0x1c, 0xa7, 0xf8, 0xed, 0xf0, 0x90, 0x77, 0x0e, 0x3d, 0x66, 0xd9, - 0xd9, 0xad, 0xf2, 0x39, 0xef, 0x98, 0x79, 0xf8, 0x11, 0x36, 0xd4, 0x31, 0xf0, 0x98, 0x55, 0x0f, - 0xa3, 0x6a, 0x50, 0x9f, 0x77, 0xf8, 0x01, 0xb6, 0x0b, 0x86, 0x17, 0x33, 0xfe, 0x08, 0xe2, 0xf9, - 0x72, 0x7e, 0x88, 0xf5, 0xd3, 0xd0, 0x62, 0x46, 0x1f, 0x45, 0xb4, 0x44, 0x00, 0xa7, 0x81, 0xc5, - 0x8c, 0x3f, 0x46, 0x38, 0x21, 0x80, 0xdb, 0x87, 0xf0, 0xbb, 0x27, 0x76, 0x61, 0xd3, 0xa1, 0xd8, - 0x4d, 0xb3, 0x3e, 0x9c, 0x54, 0xcc, 0xf4, 0xe3, 0xf8, 0xe5, 0x44, 0xf0, 0x5b, 0xd9, 0x6e, 0xcb, - 0x80, 0x3f, 0x89, 0x68, 0xb1, 0x9e, 0xcf, 0xb1, 0x01, 0x6d, 0x3a, 0x31, 0xe3, 0x4f, 0x21, 0xae, - 0x53, 0xb0, 0x75, 0x9c, 0x4e, 0xcc, 0x82, 0xa7, 0x69, 0xeb, 0x48, 0x40, 0xd8, 0x68, 0x30, 0x31, - 0xd3, 0xcf, 0x50, 0xd4, 0x09, 0xe1, 0x33, 0xac, 0x56, 0x36, 0x1b, 0x33, 0xff, 0x2c, 0xf2, 0x6d, - 0x06, 0x22, 0xa0, 0x35, 0x3b, 0xb3, 0xe2, 0x39, 0x8a, 0x80, 0x46, 0xc1, 0x31, 0xaa, 0x0e, 0x30, - 0x66, 0xd3, 0xf3, 0x74, 0x8c, 0x2a, 0xf3, 0x0b, 0x64, 0x33, 0xaf, 0xf9, 0x66, 0xc5, 0x0b, 0x94, - 0xcd, 0x7c, 0x3d, 0x6c, 0xa3, 0x3a, 0x11, 0x98, 0x1d, 0x2f, 0xd2, 0x36, 0x2a, 0x03, 0x01, 0x5f, - 0x62, 0xf5, 0x9d, 0xd3, 0x80, 0xd9, 0xf7, 0x12, 0xfa, 0x46, 0x77, 0x0c, 0x03, 0xfc, 0x2e, 0x36, - 0xd1, 0x7d, 0x12, 0x30, 0x5b, 0xcf, 0x6d, 0x55, 0x7e, 0xbb, 0xe9, 0x83, 0x00, 0x3f, 0xd1, 0x6e, - 0x29, 0xfa, 0x14, 0x60, 0xd6, 0x9e, 0xdf, 0xea, 0x2c, 0xdc, 0xfa, 0x10, 0xc0, 0x67, 0x19, 0x6b, - 0x37, 0x60, 0xb3, 0xeb, 0x02, 0xba, 0x34, 0x08, 0x8e, 0x06, 0xf6, 0x5f, 0x33, 0x7f, 0x91, 0x8e, - 0x06, 0x12, 0x70, 0x34, 0xa8, 0xf5, 0x9a, 0xe9, 0x4b, 0x74, 0x34, 0x08, 0x81, 0x27, 0x5b, 0xeb, - 0x6e, 0x66, 0xc3, 0x65, 0x7a, 0xb2, 0x35, 0x8a, 0x1f, 0x63, 0xa3, 0x3b, 0x1a, 0xa2, 0x59, 0xf5, - 0x1a, 0xaa, 0xf6, 0x54, 0xfb, 0xa1, 0xde, 0xbc, 0xb0, 0x19, 0x9a, 0x6d, 0xaf, 0x57, 0x9a, 0x17, - 0xf6, 0x42, 0x3e, 0xcd, 0xfa, 0xa3, 0x2c, 0x08, 0xe0, 0xf0, 0xd4, 0x6f, 0xe8, 0xd2, 0x4d, 0x45, - 0xd0, 0x22, 0xc5, 0xaf, 0xdb, 0x18, 0x1d, 0x02, 0xf8, 0x01, 0xb6, 0x5b, 0x84, 0x4d, 0xd1, 0x32, - 0x91, 0xbf, 0x6d, 0x53, 0xc1, 0x84, 0xd5, 0x7c, 0x86, 0xb1, 0xe2, 0xd5, 0x08, 0x84, 0xd9, 0xc4, - 0xfe, 0xbe, 0x5d, 0xbc, 0xa5, 0xd1, 0x90, 0xb6, 0x20, 0x4f, 0x8a, 0x41, 0xb0, 0xd9, 0x29, 0xc8, - 0x33, 0x72, 0x90, 0xf5, 0xdd, 0x9f, 0xca, 0x48, 0x39, 0x9e, 0x89, 0xfe, 0x03, 0x69, 0x5a, 0x0f, - 0x01, 0x0b, 0x65, 0x22, 0x94, 0xe3, 0xa5, 0x26, 0xf6, 0x4f, 0x64, 0x4b, 0x00, 0x60, 0xd7, 0x49, - 0x95, 0xcd, 0x7d, 0xff, 0x45, 0x30, 0x01, 0xb0, 0x69, 0xb8, 0x5e, 0x17, 0x1b, 0x26, 0xf6, 0x6f, - 0xda, 0x34, 0xae, 0xe7, 0x87, 0x58, 0x0d, 0x2e, 0xf3, 0xb7, 0x4a, 0x26, 0xf8, 0x1f, 0x84, 0xdb, - 0x04, 0x7c, 0x73, 0xaa, 0x5a, 0xca, 0x37, 0x07, 0xfb, 0x5f, 0xcc, 0x34, 0xad, 0xe7, 0xb3, 0x6c, - 0x20, 0x55, 0xad, 0x56, 0x86, 0xf3, 0xa9, 0x01, 0xff, 0x6f, 0xbb, 0x7c, 0x65, 0x51, 0x32, 0x90, - 0xed, 0x07, 0xd7, 0x55, 0x2c, 0xfd, 0x48, 0x89, 0xc4, 0x64, 0xd8, 0x42, 0x83, 0x86, 0x1c, 0x9e, - 0x67, 0x63, 0xae, 0x0c, 0xab, 0xdc, 0x61, 0xb6, 0x20, 0x17, 0xe4, 0x52, 0x5e, 0x67, 0xee, 0xbd, - 0xd9, 0xf3, 0xd5, 0x5a, 0xd6, 0x9c, 0x74, 0x65, 0x38, 0x05, 0xbf, 0x3c, 0xda, 0x2f, 0x54, 0xcb, - 0xdf, 0x21, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x9c, 0xaf, 0x70, 0x4e, 0x83, 0x15, 0x00, 0x00, -} diff --git a/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden b/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden deleted file mode 100644 index f6502e4b90..0000000000 --- a/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by protoc-gen-go. -// source: gogo.proto -// DO NOT EDIT! - -package gogoproto - -import proto "github.com/gogo/protobuf/proto" -import json "encoding/json" -import math "math" -import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" - -// Reference proto, json, and math imports to suppress error if they are not otherwise used. -var _ = proto.Marshal -var _ = &json.SyntaxError{} -var _ = math.Inf - -var E_Nullable = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.FieldOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 51235, - Name: "gogoproto.nullable", - Tag: "varint,51235,opt,name=nullable", -} - -var E_Embed = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.FieldOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 51236, - Name: "gogoproto.embed", - Tag: "varint,51236,opt,name=embed", -} - -var E_Customtype = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.FieldOptions)(nil), - ExtensionType: (*string)(nil), - Field: 51237, - Name: "gogoproto.customtype", - Tag: "bytes,51237,opt,name=customtype", -} - -func init() { - proto.RegisterExtension(E_Nullable) - proto.RegisterExtension(E_Embed) - proto.RegisterExtension(E_Customtype) -} diff --git a/vendor/github.com/gogo/protobuf/gogoproto/gogo.proto b/vendor/github.com/gogo/protobuf/gogoproto/gogo.proto deleted file mode 100644 index b80c85653f..0000000000 --- a/vendor/github.com/gogo/protobuf/gogoproto/gogo.proto +++ /dev/null @@ -1,144 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// 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. -// -// 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. - -syntax = "proto2"; -package gogoproto; - -import "google/protobuf/descriptor.proto"; - -option java_package = "com.google.protobuf"; -option java_outer_classname = "GoGoProtos"; -option go_package = "github.com/gogo/protobuf/gogoproto"; - -extend google.protobuf.EnumOptions { - optional bool goproto_enum_prefix = 62001; - optional bool goproto_enum_stringer = 62021; - optional bool enum_stringer = 62022; - optional string enum_customname = 62023; - optional bool enumdecl = 62024; -} - -extend google.protobuf.EnumValueOptions { - optional string enumvalue_customname = 66001; -} - -extend google.protobuf.FileOptions { - optional bool goproto_getters_all = 63001; - optional bool goproto_enum_prefix_all = 63002; - optional bool goproto_stringer_all = 63003; - optional bool verbose_equal_all = 63004; - optional bool face_all = 63005; - optional bool gostring_all = 63006; - optional bool populate_all = 63007; - optional bool stringer_all = 63008; - optional bool onlyone_all = 63009; - - optional bool equal_all = 63013; - optional bool description_all = 63014; - optional bool testgen_all = 63015; - optional bool benchgen_all = 63016; - optional bool marshaler_all = 63017; - optional bool unmarshaler_all = 63018; - optional bool stable_marshaler_all = 63019; - - optional bool sizer_all = 63020; - - optional bool goproto_enum_stringer_all = 63021; - optional bool enum_stringer_all = 63022; - - optional bool unsafe_marshaler_all = 63023; - optional bool unsafe_unmarshaler_all = 63024; - - optional bool goproto_extensions_map_all = 63025; - optional bool goproto_unrecognized_all = 63026; - optional bool gogoproto_import = 63027; - optional bool protosizer_all = 63028; - optional bool compare_all = 63029; - optional bool typedecl_all = 63030; - optional bool enumdecl_all = 63031; - - optional bool goproto_registration = 63032; - optional bool messagename_all = 63033; - - optional bool goproto_sizecache_all = 63034; - optional bool goproto_unkeyed_all = 63035; -} - -extend google.protobuf.MessageOptions { - optional bool goproto_getters = 64001; - optional bool goproto_stringer = 64003; - optional bool verbose_equal = 64004; - optional bool face = 64005; - optional bool gostring = 64006; - optional bool populate = 64007; - optional bool stringer = 67008; - optional bool onlyone = 64009; - - optional bool equal = 64013; - optional bool description = 64014; - optional bool testgen = 64015; - optional bool benchgen = 64016; - optional bool marshaler = 64017; - optional bool unmarshaler = 64018; - optional bool stable_marshaler = 64019; - - optional bool sizer = 64020; - - optional bool unsafe_marshaler = 64023; - optional bool unsafe_unmarshaler = 64024; - - optional bool goproto_extensions_map = 64025; - optional bool goproto_unrecognized = 64026; - - optional bool protosizer = 64028; - optional bool compare = 64029; - - optional bool typedecl = 64030; - - optional bool messagename = 64033; - - optional bool goproto_sizecache = 64034; - optional bool goproto_unkeyed = 64035; -} - -extend google.protobuf.FieldOptions { - optional bool nullable = 65001; - optional bool embed = 65002; - optional string customtype = 65003; - optional string customname = 65004; - optional string jsontag = 65005; - optional string moretags = 65006; - optional string casttype = 65007; - optional string castkey = 65008; - optional string castvalue = 65009; - - optional bool stdtime = 65010; - optional bool stdduration = 65011; - optional bool wktpointer = 65012; - -} diff --git a/vendor/github.com/gogo/protobuf/gogoproto/helper.go b/vendor/github.com/gogo/protobuf/gogoproto/helper.go deleted file mode 100644 index 390d4e4be6..0000000000 --- a/vendor/github.com/gogo/protobuf/gogoproto/helper.go +++ /dev/null @@ -1,415 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// 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. -// -// 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 gogoproto - -import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" -import proto "github.com/gogo/protobuf/proto" - -func IsEmbed(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Embed, false) -} - -func IsNullable(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Nullable, true) -} - -func IsStdTime(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Stdtime, false) -} - -func IsStdDuration(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Stdduration, false) -} - -func IsStdDouble(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.DoubleValue" -} - -func IsStdFloat(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.FloatValue" -} - -func IsStdInt64(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int64Value" -} - -func IsStdUInt64(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt64Value" -} - -func IsStdInt32(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int32Value" -} - -func IsStdUInt32(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt32Value" -} - -func IsStdBool(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BoolValue" -} - -func IsStdString(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.StringValue" -} - -func IsStdBytes(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BytesValue" -} - -func IsStdType(field *google_protobuf.FieldDescriptorProto) bool { - return (IsStdTime(field) || IsStdDuration(field) || - IsStdDouble(field) || IsStdFloat(field) || - IsStdInt64(field) || IsStdUInt64(field) || - IsStdInt32(field) || IsStdUInt32(field) || - IsStdBool(field) || - IsStdString(field) || IsStdBytes(field)) -} - -func IsWktPtr(field *google_protobuf.FieldDescriptorProto) bool { - return proto.GetBoolExtension(field.Options, E_Wktpointer, false) -} - -func NeedsNilCheck(proto3 bool, field *google_protobuf.FieldDescriptorProto) bool { - nullable := IsNullable(field) - if field.IsMessage() || IsCustomType(field) { - return nullable - } - if proto3 { - return false - } - return nullable || *field.Type == google_protobuf.FieldDescriptorProto_TYPE_BYTES -} - -func IsCustomType(field *google_protobuf.FieldDescriptorProto) bool { - typ := GetCustomType(field) - if len(typ) > 0 { - return true - } - return false -} - -func IsCastType(field *google_protobuf.FieldDescriptorProto) bool { - typ := GetCastType(field) - if len(typ) > 0 { - return true - } - return false -} - -func IsCastKey(field *google_protobuf.FieldDescriptorProto) bool { - typ := GetCastKey(field) - if len(typ) > 0 { - return true - } - return false -} - -func IsCastValue(field *google_protobuf.FieldDescriptorProto) bool { - typ := GetCastValue(field) - if len(typ) > 0 { - return true - } - return false -} - -func HasEnumDecl(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { - return proto.GetBoolExtension(enum.Options, E_Enumdecl, proto.GetBoolExtension(file.Options, E_EnumdeclAll, true)) -} - -func HasTypeDecl(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Typedecl, proto.GetBoolExtension(file.Options, E_TypedeclAll, true)) -} - -func GetCustomType(field *google_protobuf.FieldDescriptorProto) string { - if field == nil { - return "" - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_Customtype) - if err == nil && v.(*string) != nil { - return *(v.(*string)) - } - } - return "" -} - -func GetCastType(field *google_protobuf.FieldDescriptorProto) string { - if field == nil { - return "" - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_Casttype) - if err == nil && v.(*string) != nil { - return *(v.(*string)) - } - } - return "" -} - -func GetCastKey(field *google_protobuf.FieldDescriptorProto) string { - if field == nil { - return "" - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_Castkey) - if err == nil && v.(*string) != nil { - return *(v.(*string)) - } - } - return "" -} - -func GetCastValue(field *google_protobuf.FieldDescriptorProto) string { - if field == nil { - return "" - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_Castvalue) - if err == nil && v.(*string) != nil { - return *(v.(*string)) - } - } - return "" -} - -func IsCustomName(field *google_protobuf.FieldDescriptorProto) bool { - name := GetCustomName(field) - if len(name) > 0 { - return true - } - return false -} - -func IsEnumCustomName(field *google_protobuf.EnumDescriptorProto) bool { - name := GetEnumCustomName(field) - if len(name) > 0 { - return true - } - return false -} - -func IsEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) bool { - name := GetEnumValueCustomName(field) - if len(name) > 0 { - return true - } - return false -} - -func GetCustomName(field *google_protobuf.FieldDescriptorProto) string { - if field == nil { - return "" - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_Customname) - if err == nil && v.(*string) != nil { - return *(v.(*string)) - } - } - return "" -} - -func GetEnumCustomName(field *google_protobuf.EnumDescriptorProto) string { - if field == nil { - return "" - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_EnumCustomname) - if err == nil && v.(*string) != nil { - return *(v.(*string)) - } - } - return "" -} - -func GetEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) string { - if field == nil { - return "" - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_EnumvalueCustomname) - if err == nil && v.(*string) != nil { - return *(v.(*string)) - } - } - return "" -} - -func GetJsonTag(field *google_protobuf.FieldDescriptorProto) *string { - if field == nil { - return nil - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_Jsontag) - if err == nil && v.(*string) != nil { - return (v.(*string)) - } - } - return nil -} - -func GetMoreTags(field *google_protobuf.FieldDescriptorProto) *string { - if field == nil { - return nil - } - if field.Options != nil { - v, err := proto.GetExtension(field.Options, E_Moretags) - if err == nil && v.(*string) != nil { - return (v.(*string)) - } - } - return nil -} - -type EnableFunc func(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool - -func EnabledGoEnumPrefix(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { - return proto.GetBoolExtension(enum.Options, E_GoprotoEnumPrefix, proto.GetBoolExtension(file.Options, E_GoprotoEnumPrefixAll, true)) -} - -func EnabledGoStringer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_GoprotoStringer, proto.GetBoolExtension(file.Options, E_GoprotoStringerAll, true)) -} - -func HasGoGetters(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_GoprotoGetters, proto.GetBoolExtension(file.Options, E_GoprotoGettersAll, true)) -} - -func IsUnion(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Onlyone, proto.GetBoolExtension(file.Options, E_OnlyoneAll, false)) -} - -func HasGoString(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Gostring, proto.GetBoolExtension(file.Options, E_GostringAll, false)) -} - -func HasEqual(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Equal, proto.GetBoolExtension(file.Options, E_EqualAll, false)) -} - -func HasVerboseEqual(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_VerboseEqual, proto.GetBoolExtension(file.Options, E_VerboseEqualAll, false)) -} - -func IsStringer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Stringer, proto.GetBoolExtension(file.Options, E_StringerAll, false)) -} - -func IsFace(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Face, proto.GetBoolExtension(file.Options, E_FaceAll, false)) -} - -func HasDescription(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Description, proto.GetBoolExtension(file.Options, E_DescriptionAll, false)) -} - -func HasPopulate(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Populate, proto.GetBoolExtension(file.Options, E_PopulateAll, false)) -} - -func HasTestGen(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Testgen, proto.GetBoolExtension(file.Options, E_TestgenAll, false)) -} - -func HasBenchGen(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Benchgen, proto.GetBoolExtension(file.Options, E_BenchgenAll, false)) -} - -func IsMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Marshaler, proto.GetBoolExtension(file.Options, E_MarshalerAll, false)) -} - -func IsUnmarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Unmarshaler, proto.GetBoolExtension(file.Options, E_UnmarshalerAll, false)) -} - -func IsStableMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_StableMarshaler, proto.GetBoolExtension(file.Options, E_StableMarshalerAll, false)) -} - -func IsSizer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Sizer, proto.GetBoolExtension(file.Options, E_SizerAll, false)) -} - -func IsProtoSizer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Protosizer, proto.GetBoolExtension(file.Options, E_ProtosizerAll, false)) -} - -func IsGoEnumStringer(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { - return proto.GetBoolExtension(enum.Options, E_GoprotoEnumStringer, proto.GetBoolExtension(file.Options, E_GoprotoEnumStringerAll, true)) -} - -func IsEnumStringer(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { - return proto.GetBoolExtension(enum.Options, E_EnumStringer, proto.GetBoolExtension(file.Options, E_EnumStringerAll, false)) -} - -func IsUnsafeMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_UnsafeMarshaler, proto.GetBoolExtension(file.Options, E_UnsafeMarshalerAll, false)) -} - -func IsUnsafeUnmarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_UnsafeUnmarshaler, proto.GetBoolExtension(file.Options, E_UnsafeUnmarshalerAll, false)) -} - -func HasExtensionsMap(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_GoprotoExtensionsMap, proto.GetBoolExtension(file.Options, E_GoprotoExtensionsMapAll, true)) -} - -func HasUnrecognized(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_GoprotoUnrecognized, proto.GetBoolExtension(file.Options, E_GoprotoUnrecognizedAll, true)) -} - -func IsProto3(file *google_protobuf.FileDescriptorProto) bool { - return file.GetSyntax() == "proto3" -} - -func ImportsGoGoProto(file *google_protobuf.FileDescriptorProto) bool { - return proto.GetBoolExtension(file.Options, E_GogoprotoImport, true) -} - -func HasCompare(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Compare, proto.GetBoolExtension(file.Options, E_CompareAll, false)) -} - -func RegistersGolangProto(file *google_protobuf.FileDescriptorProto) bool { - return proto.GetBoolExtension(file.Options, E_GoprotoRegistration, false) -} - -func HasMessageName(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_Messagename, proto.GetBoolExtension(file.Options, E_MessagenameAll, false)) -} - -func HasSizecache(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_GoprotoSizecache, proto.GetBoolExtension(file.Options, E_GoprotoSizecacheAll, true)) -} - -func HasUnkeyed(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { - return proto.GetBoolExtension(message.Options, E_GoprotoUnkeyed, proto.GetBoolExtension(file.Options, E_GoprotoUnkeyedAll, true)) -} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile deleted file mode 100644 index 3496dc99d5..0000000000 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# 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. - -regenerate: - go install github.com/gogo/protobuf/protoc-gen-gogo - go install github.com/gogo/protobuf/protoc-gen-gostring - protoc --gogo_out=. -I=../../protobuf/google/protobuf ../../protobuf/google/protobuf/descriptor.proto - protoc --gostring_out=. -I=../../protobuf/google/protobuf ../../protobuf/google/protobuf/descriptor.proto diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go deleted file mode 100644 index a85bf1984c..0000000000 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go +++ /dev/null @@ -1,118 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 descriptor provides functions for obtaining protocol buffer -// descriptors for generated Go types. -// -// These functions cannot go in package proto because they depend on the -// generated protobuf descriptor messages, which themselves depend on proto. -package descriptor - -import ( - "bytes" - "compress/gzip" - "fmt" - "io/ioutil" - - "github.com/gogo/protobuf/proto" -) - -// extractFile extracts a FileDescriptorProto from a gzip'd buffer. -func extractFile(gz []byte) (*FileDescriptorProto, error) { - r, err := gzip.NewReader(bytes.NewReader(gz)) - if err != nil { - return nil, fmt.Errorf("failed to open gzip reader: %v", err) - } - defer r.Close() - - b, err := ioutil.ReadAll(r) - if err != nil { - return nil, fmt.Errorf("failed to uncompress descriptor: %v", err) - } - - fd := new(FileDescriptorProto) - if err := proto.Unmarshal(b, fd); err != nil { - return nil, fmt.Errorf("malformed FileDescriptorProto: %v", err) - } - - return fd, nil -} - -// Message is a proto.Message with a method to return its descriptor. -// -// Message types generated by the protocol compiler always satisfy -// the Message interface. -type Message interface { - proto.Message - Descriptor() ([]byte, []int) -} - -// ForMessage returns a FileDescriptorProto and a DescriptorProto from within it -// describing the given message. -func ForMessage(msg Message) (fd *FileDescriptorProto, md *DescriptorProto) { - gz, path := msg.Descriptor() - fd, err := extractFile(gz) - if err != nil { - panic(fmt.Sprintf("invalid FileDescriptorProto for %T: %v", msg, err)) - } - - md = fd.MessageType[path[0]] - for _, i := range path[1:] { - md = md.NestedType[i] - } - return fd, md -} - -// Is this field a scalar numeric type? -func (field *FieldDescriptorProto) IsScalar() bool { - if field.Type == nil { - return false - } - switch *field.Type { - case FieldDescriptorProto_TYPE_DOUBLE, - FieldDescriptorProto_TYPE_FLOAT, - FieldDescriptorProto_TYPE_INT64, - FieldDescriptorProto_TYPE_UINT64, - FieldDescriptorProto_TYPE_INT32, - FieldDescriptorProto_TYPE_FIXED64, - FieldDescriptorProto_TYPE_FIXED32, - FieldDescriptorProto_TYPE_BOOL, - FieldDescriptorProto_TYPE_UINT32, - FieldDescriptorProto_TYPE_ENUM, - FieldDescriptorProto_TYPE_SFIXED32, - FieldDescriptorProto_TYPE_SFIXED64, - FieldDescriptorProto_TYPE_SINT32, - FieldDescriptorProto_TYPE_SINT64: - return true - default: - return false - } -} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go deleted file mode 100644 index 18b2a3318a..0000000000 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go +++ /dev/null @@ -1,2865 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: descriptor.proto - -package descriptor - -import ( - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type FieldDescriptorProto_Type int32 - -const ( - // 0 is reserved for errors. - // Order is weird for historical reasons. - FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 - FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if - // negative values are likely. - FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 - FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if - // negative values are likely. - FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 - FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 - FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 - FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 - FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 - // Tag-delimited aggregate. - // Group type is deprecated and not supported in proto3. However, Proto3 - // implementations should still be able to parse the group wire format and - // treat group fields as unknown fields. - FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 - FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 - // New in version 2. - FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 - FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 - FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 - FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 - FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 - FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 - FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 -) - -var FieldDescriptorProto_Type_name = map[int32]string{ - 1: "TYPE_DOUBLE", - 2: "TYPE_FLOAT", - 3: "TYPE_INT64", - 4: "TYPE_UINT64", - 5: "TYPE_INT32", - 6: "TYPE_FIXED64", - 7: "TYPE_FIXED32", - 8: "TYPE_BOOL", - 9: "TYPE_STRING", - 10: "TYPE_GROUP", - 11: "TYPE_MESSAGE", - 12: "TYPE_BYTES", - 13: "TYPE_UINT32", - 14: "TYPE_ENUM", - 15: "TYPE_SFIXED32", - 16: "TYPE_SFIXED64", - 17: "TYPE_SINT32", - 18: "TYPE_SINT64", -} - -var FieldDescriptorProto_Type_value = map[string]int32{ - "TYPE_DOUBLE": 1, - "TYPE_FLOAT": 2, - "TYPE_INT64": 3, - "TYPE_UINT64": 4, - "TYPE_INT32": 5, - "TYPE_FIXED64": 6, - "TYPE_FIXED32": 7, - "TYPE_BOOL": 8, - "TYPE_STRING": 9, - "TYPE_GROUP": 10, - "TYPE_MESSAGE": 11, - "TYPE_BYTES": 12, - "TYPE_UINT32": 13, - "TYPE_ENUM": 14, - "TYPE_SFIXED32": 15, - "TYPE_SFIXED64": 16, - "TYPE_SINT32": 17, - "TYPE_SINT64": 18, -} - -func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { - p := new(FieldDescriptorProto_Type) - *p = x - return p -} - -func (x FieldDescriptorProto_Type) String() string { - return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) -} - -func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") - if err != nil { - return err - } - *x = FieldDescriptorProto_Type(value) - return nil -} - -func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{4, 0} -} - -type FieldDescriptorProto_Label int32 - -const ( - // 0 is reserved for errors - FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 - FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 - FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 -) - -var FieldDescriptorProto_Label_name = map[int32]string{ - 1: "LABEL_OPTIONAL", - 2: "LABEL_REQUIRED", - 3: "LABEL_REPEATED", -} - -var FieldDescriptorProto_Label_value = map[string]int32{ - "LABEL_OPTIONAL": 1, - "LABEL_REQUIRED": 2, - "LABEL_REPEATED": 3, -} - -func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { - p := new(FieldDescriptorProto_Label) - *p = x - return p -} - -func (x FieldDescriptorProto_Label) String() string { - return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) -} - -func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") - if err != nil { - return err - } - *x = FieldDescriptorProto_Label(value) - return nil -} - -func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{4, 1} -} - -// Generated classes can be optimized for speed or code size. -type FileOptions_OptimizeMode int32 - -const ( - FileOptions_SPEED FileOptions_OptimizeMode = 1 - // etc. - FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 - FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 -) - -var FileOptions_OptimizeMode_name = map[int32]string{ - 1: "SPEED", - 2: "CODE_SIZE", - 3: "LITE_RUNTIME", -} - -var FileOptions_OptimizeMode_value = map[string]int32{ - "SPEED": 1, - "CODE_SIZE": 2, - "LITE_RUNTIME": 3, -} - -func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { - p := new(FileOptions_OptimizeMode) - *p = x - return p -} - -func (x FileOptions_OptimizeMode) String() string { - return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) -} - -func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") - if err != nil { - return err - } - *x = FileOptions_OptimizeMode(value) - return nil -} - -func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{10, 0} -} - -type FieldOptions_CType int32 - -const ( - // Default mode. - FieldOptions_STRING FieldOptions_CType = 0 - FieldOptions_CORD FieldOptions_CType = 1 - FieldOptions_STRING_PIECE FieldOptions_CType = 2 -) - -var FieldOptions_CType_name = map[int32]string{ - 0: "STRING", - 1: "CORD", - 2: "STRING_PIECE", -} - -var FieldOptions_CType_value = map[string]int32{ - "STRING": 0, - "CORD": 1, - "STRING_PIECE": 2, -} - -func (x FieldOptions_CType) Enum() *FieldOptions_CType { - p := new(FieldOptions_CType) - *p = x - return p -} - -func (x FieldOptions_CType) String() string { - return proto.EnumName(FieldOptions_CType_name, int32(x)) -} - -func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") - if err != nil { - return err - } - *x = FieldOptions_CType(value) - return nil -} - -func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{12, 0} -} - -type FieldOptions_JSType int32 - -const ( - // Use the default type. - FieldOptions_JS_NORMAL FieldOptions_JSType = 0 - // Use JavaScript strings. - FieldOptions_JS_STRING FieldOptions_JSType = 1 - // Use JavaScript numbers. - FieldOptions_JS_NUMBER FieldOptions_JSType = 2 -) - -var FieldOptions_JSType_name = map[int32]string{ - 0: "JS_NORMAL", - 1: "JS_STRING", - 2: "JS_NUMBER", -} - -var FieldOptions_JSType_value = map[string]int32{ - "JS_NORMAL": 0, - "JS_STRING": 1, - "JS_NUMBER": 2, -} - -func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { - p := new(FieldOptions_JSType) - *p = x - return p -} - -func (x FieldOptions_JSType) String() string { - return proto.EnumName(FieldOptions_JSType_name, int32(x)) -} - -func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") - if err != nil { - return err - } - *x = FieldOptions_JSType(value) - return nil -} - -func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{12, 1} -} - -// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, -// or neither? HTTP based RPC implementation may choose GET verb for safe -// methods, and PUT verb for idempotent methods instead of the default POST. -type MethodOptions_IdempotencyLevel int32 - -const ( - MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0 - MethodOptions_NO_SIDE_EFFECTS MethodOptions_IdempotencyLevel = 1 - MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 -) - -var MethodOptions_IdempotencyLevel_name = map[int32]string{ - 0: "IDEMPOTENCY_UNKNOWN", - 1: "NO_SIDE_EFFECTS", - 2: "IDEMPOTENT", -} - -var MethodOptions_IdempotencyLevel_value = map[string]int32{ - "IDEMPOTENCY_UNKNOWN": 0, - "NO_SIDE_EFFECTS": 1, - "IDEMPOTENT": 2, -} - -func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { - p := new(MethodOptions_IdempotencyLevel) - *p = x - return p -} - -func (x MethodOptions_IdempotencyLevel) String() string { - return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) -} - -func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") - if err != nil { - return err - } - *x = MethodOptions_IdempotencyLevel(value) - return nil -} - -func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{17, 0} -} - -// The protocol compiler can output a FileDescriptorSet containing the .proto -// files it parses. -type FileDescriptorSet struct { - File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } -func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } -func (*FileDescriptorSet) ProtoMessage() {} -func (*FileDescriptorSet) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{0} -} -func (m *FileDescriptorSet) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FileDescriptorSet.Unmarshal(m, b) -} -func (m *FileDescriptorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FileDescriptorSet.Marshal(b, m, deterministic) -} -func (m *FileDescriptorSet) XXX_Merge(src proto.Message) { - xxx_messageInfo_FileDescriptorSet.Merge(m, src) -} -func (m *FileDescriptorSet) XXX_Size() int { - return xxx_messageInfo_FileDescriptorSet.Size(m) -} -func (m *FileDescriptorSet) XXX_DiscardUnknown() { - xxx_messageInfo_FileDescriptorSet.DiscardUnknown(m) -} - -var xxx_messageInfo_FileDescriptorSet proto.InternalMessageInfo - -func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { - if m != nil { - return m.File - } - return nil -} - -// Describes a complete .proto file. -type FileDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` - // Names of files imported by this file. - Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` - // Indexes of the public imported files in the dependency list above. - PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` - // Indexes of the weak imported files in the dependency list. - // For Google-internal migration only. Do not use. - WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` - // All top-level definitions in this file. - MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` - EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` - Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` - Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` - Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` - // This field contains optional information about the original source code. - // You may safely remove this entire field without harming runtime - // functionality of the descriptors -- the information is needed only by - // development tools. - SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` - // The syntax of the proto file. - // The supported values are "proto2" and "proto3". - Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } -func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*FileDescriptorProto) ProtoMessage() {} -func (*FileDescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{1} -} -func (m *FileDescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FileDescriptorProto.Unmarshal(m, b) -} -func (m *FileDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FileDescriptorProto.Marshal(b, m, deterministic) -} -func (m *FileDescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_FileDescriptorProto.Merge(m, src) -} -func (m *FileDescriptorProto) XXX_Size() int { - return xxx_messageInfo_FileDescriptorProto.Size(m) -} -func (m *FileDescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_FileDescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_FileDescriptorProto proto.InternalMessageInfo - -func (m *FileDescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *FileDescriptorProto) GetPackage() string { - if m != nil && m.Package != nil { - return *m.Package - } - return "" -} - -func (m *FileDescriptorProto) GetDependency() []string { - if m != nil { - return m.Dependency - } - return nil -} - -func (m *FileDescriptorProto) GetPublicDependency() []int32 { - if m != nil { - return m.PublicDependency - } - return nil -} - -func (m *FileDescriptorProto) GetWeakDependency() []int32 { - if m != nil { - return m.WeakDependency - } - return nil -} - -func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { - if m != nil { - return m.MessageType - } - return nil -} - -func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { - if m != nil { - return m.EnumType - } - return nil -} - -func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { - if m != nil { - return m.Service - } - return nil -} - -func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { - if m != nil { - return m.Extension - } - return nil -} - -func (m *FileDescriptorProto) GetOptions() *FileOptions { - if m != nil { - return m.Options - } - return nil -} - -func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { - if m != nil { - return m.SourceCodeInfo - } - return nil -} - -func (m *FileDescriptorProto) GetSyntax() string { - if m != nil && m.Syntax != nil { - return *m.Syntax - } - return "" -} - -// Describes a message type. -type DescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` - Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` - NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` - EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` - ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` - OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` - Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` - ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` - // Reserved field names, which may not be used by fields in the same message. - // A given name may only be reserved once. - ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } -func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } -func (*DescriptorProto) ProtoMessage() {} -func (*DescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{2} -} -func (m *DescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DescriptorProto.Unmarshal(m, b) -} -func (m *DescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DescriptorProto.Marshal(b, m, deterministic) -} -func (m *DescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_DescriptorProto.Merge(m, src) -} -func (m *DescriptorProto) XXX_Size() int { - return xxx_messageInfo_DescriptorProto.Size(m) -} -func (m *DescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_DescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_DescriptorProto proto.InternalMessageInfo - -func (m *DescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *DescriptorProto) GetField() []*FieldDescriptorProto { - if m != nil { - return m.Field - } - return nil -} - -func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { - if m != nil { - return m.Extension - } - return nil -} - -func (m *DescriptorProto) GetNestedType() []*DescriptorProto { - if m != nil { - return m.NestedType - } - return nil -} - -func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { - if m != nil { - return m.EnumType - } - return nil -} - -func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { - if m != nil { - return m.ExtensionRange - } - return nil -} - -func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { - if m != nil { - return m.OneofDecl - } - return nil -} - -func (m *DescriptorProto) GetOptions() *MessageOptions { - if m != nil { - return m.Options - } - return nil -} - -func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { - if m != nil { - return m.ReservedRange - } - return nil -} - -func (m *DescriptorProto) GetReservedName() []string { - if m != nil { - return m.ReservedName - } - return nil -} - -type DescriptorProto_ExtensionRange struct { - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` - Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } -func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } -func (*DescriptorProto_ExtensionRange) ProtoMessage() {} -func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{2, 0} -} -func (m *DescriptorProto_ExtensionRange) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DescriptorProto_ExtensionRange.Unmarshal(m, b) -} -func (m *DescriptorProto_ExtensionRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DescriptorProto_ExtensionRange.Marshal(b, m, deterministic) -} -func (m *DescriptorProto_ExtensionRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_DescriptorProto_ExtensionRange.Merge(m, src) -} -func (m *DescriptorProto_ExtensionRange) XXX_Size() int { - return xxx_messageInfo_DescriptorProto_ExtensionRange.Size(m) -} -func (m *DescriptorProto_ExtensionRange) XXX_DiscardUnknown() { - xxx_messageInfo_DescriptorProto_ExtensionRange.DiscardUnknown(m) -} - -var xxx_messageInfo_DescriptorProto_ExtensionRange proto.InternalMessageInfo - -func (m *DescriptorProto_ExtensionRange) GetStart() int32 { - if m != nil && m.Start != nil { - return *m.Start - } - return 0 -} - -func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { - if m != nil && m.End != nil { - return *m.End - } - return 0 -} - -func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { - if m != nil { - return m.Options - } - return nil -} - -// Range of reserved tag numbers. Reserved tag numbers may not be used by -// fields or extension ranges in the same message. Reserved ranges may -// not overlap. -type DescriptorProto_ReservedRange struct { - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } -func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } -func (*DescriptorProto_ReservedRange) ProtoMessage() {} -func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{2, 1} -} -func (m *DescriptorProto_ReservedRange) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DescriptorProto_ReservedRange.Unmarshal(m, b) -} -func (m *DescriptorProto_ReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DescriptorProto_ReservedRange.Marshal(b, m, deterministic) -} -func (m *DescriptorProto_ReservedRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_DescriptorProto_ReservedRange.Merge(m, src) -} -func (m *DescriptorProto_ReservedRange) XXX_Size() int { - return xxx_messageInfo_DescriptorProto_ReservedRange.Size(m) -} -func (m *DescriptorProto_ReservedRange) XXX_DiscardUnknown() { - xxx_messageInfo_DescriptorProto_ReservedRange.DiscardUnknown(m) -} - -var xxx_messageInfo_DescriptorProto_ReservedRange proto.InternalMessageInfo - -func (m *DescriptorProto_ReservedRange) GetStart() int32 { - if m != nil && m.Start != nil { - return *m.Start - } - return 0 -} - -func (m *DescriptorProto_ReservedRange) GetEnd() int32 { - if m != nil && m.End != nil { - return *m.End - } - return 0 -} - -type ExtensionRangeOptions struct { - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} } -func (m *ExtensionRangeOptions) String() string { return proto.CompactTextString(m) } -func (*ExtensionRangeOptions) ProtoMessage() {} -func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{3} -} - -var extRange_ExtensionRangeOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*ExtensionRangeOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_ExtensionRangeOptions -} - -func (m *ExtensionRangeOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ExtensionRangeOptions.Unmarshal(m, b) -} -func (m *ExtensionRangeOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ExtensionRangeOptions.Marshal(b, m, deterministic) -} -func (m *ExtensionRangeOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_ExtensionRangeOptions.Merge(m, src) -} -func (m *ExtensionRangeOptions) XXX_Size() int { - return xxx_messageInfo_ExtensionRangeOptions.Size(m) -} -func (m *ExtensionRangeOptions) XXX_DiscardUnknown() { - xxx_messageInfo_ExtensionRangeOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_ExtensionRangeOptions proto.InternalMessageInfo - -func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -// Describes a field within a message. -type FieldDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` - Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` - // If type_name is set, this need not be set. If both this and type_name - // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. - Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` - // For message and enum types, this is the name of the type. If the name - // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping - // rules are used to find the type (i.e. first the nested types within this - // message are searched, then within the parent, on up to the root - // namespace). - TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` - // For extensions, this is the name of the type being extended. It is - // resolved in the same manner as type_name. - Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` - // For numeric types, contains the original text representation of the value. - // For booleans, "true" or "false". - // For strings, contains the default text contents (not escaped in any way). - // For bytes, contains the C escaped value. All bytes >= 128 are escaped. - // TODO(kenton): Base-64 encode? - DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` - // If set, gives the index of a oneof in the containing type's oneof_decl - // list. This field is a member of that oneof. - OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` - // JSON name of this field. The value is set by protocol compiler. If the - // user has set a "json_name" option on this field, that option's value - // will be used. Otherwise, it's deduced from the field's name by converting - // it to camelCase. - JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` - Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } -func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*FieldDescriptorProto) ProtoMessage() {} -func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{4} -} -func (m *FieldDescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FieldDescriptorProto.Unmarshal(m, b) -} -func (m *FieldDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FieldDescriptorProto.Marshal(b, m, deterministic) -} -func (m *FieldDescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_FieldDescriptorProto.Merge(m, src) -} -func (m *FieldDescriptorProto) XXX_Size() int { - return xxx_messageInfo_FieldDescriptorProto.Size(m) -} -func (m *FieldDescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_FieldDescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_FieldDescriptorProto proto.InternalMessageInfo - -func (m *FieldDescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *FieldDescriptorProto) GetNumber() int32 { - if m != nil && m.Number != nil { - return *m.Number - } - return 0 -} - -func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { - if m != nil && m.Label != nil { - return *m.Label - } - return FieldDescriptorProto_LABEL_OPTIONAL -} - -func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { - if m != nil && m.Type != nil { - return *m.Type - } - return FieldDescriptorProto_TYPE_DOUBLE -} - -func (m *FieldDescriptorProto) GetTypeName() string { - if m != nil && m.TypeName != nil { - return *m.TypeName - } - return "" -} - -func (m *FieldDescriptorProto) GetExtendee() string { - if m != nil && m.Extendee != nil { - return *m.Extendee - } - return "" -} - -func (m *FieldDescriptorProto) GetDefaultValue() string { - if m != nil && m.DefaultValue != nil { - return *m.DefaultValue - } - return "" -} - -func (m *FieldDescriptorProto) GetOneofIndex() int32 { - if m != nil && m.OneofIndex != nil { - return *m.OneofIndex - } - return 0 -} - -func (m *FieldDescriptorProto) GetJsonName() string { - if m != nil && m.JsonName != nil { - return *m.JsonName - } - return "" -} - -func (m *FieldDescriptorProto) GetOptions() *FieldOptions { - if m != nil { - return m.Options - } - return nil -} - -// Describes a oneof. -type OneofDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } -func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*OneofDescriptorProto) ProtoMessage() {} -func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{5} -} -func (m *OneofDescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_OneofDescriptorProto.Unmarshal(m, b) -} -func (m *OneofDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_OneofDescriptorProto.Marshal(b, m, deterministic) -} -func (m *OneofDescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_OneofDescriptorProto.Merge(m, src) -} -func (m *OneofDescriptorProto) XXX_Size() int { - return xxx_messageInfo_OneofDescriptorProto.Size(m) -} -func (m *OneofDescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_OneofDescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_OneofDescriptorProto proto.InternalMessageInfo - -func (m *OneofDescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *OneofDescriptorProto) GetOptions() *OneofOptions { - if m != nil { - return m.Options - } - return nil -} - -// Describes an enum type. -type EnumDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` - Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` - // Range of reserved numeric values. Reserved numeric values may not be used - // by enum values in the same enum declaration. Reserved ranges may not - // overlap. - ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` - // Reserved enum value names, which may not be reused. A given name may only - // be reserved once. - ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } -func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*EnumDescriptorProto) ProtoMessage() {} -func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{6} -} -func (m *EnumDescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EnumDescriptorProto.Unmarshal(m, b) -} -func (m *EnumDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EnumDescriptorProto.Marshal(b, m, deterministic) -} -func (m *EnumDescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnumDescriptorProto.Merge(m, src) -} -func (m *EnumDescriptorProto) XXX_Size() int { - return xxx_messageInfo_EnumDescriptorProto.Size(m) -} -func (m *EnumDescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_EnumDescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_EnumDescriptorProto proto.InternalMessageInfo - -func (m *EnumDescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { - if m != nil { - return m.Value - } - return nil -} - -func (m *EnumDescriptorProto) GetOptions() *EnumOptions { - if m != nil { - return m.Options - } - return nil -} - -func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange { - if m != nil { - return m.ReservedRange - } - return nil -} - -func (m *EnumDescriptorProto) GetReservedName() []string { - if m != nil { - return m.ReservedName - } - return nil -} - -// Range of reserved numeric values. Reserved values may not be used by -// entries in the same enum. Reserved ranges may not overlap. -// -// Note that this is distinct from DescriptorProto.ReservedRange in that it -// is inclusive such that it can appropriately represent the entire int32 -// domain. -type EnumDescriptorProto_EnumReservedRange struct { - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnumDescriptorProto_EnumReservedRange) Reset() { *m = EnumDescriptorProto_EnumReservedRange{} } -func (m *EnumDescriptorProto_EnumReservedRange) String() string { return proto.CompactTextString(m) } -func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} -func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{6, 0} -} -func (m *EnumDescriptorProto_EnumReservedRange) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Unmarshal(m, b) -} -func (m *EnumDescriptorProto_EnumReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Marshal(b, m, deterministic) -} -func (m *EnumDescriptorProto_EnumReservedRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Merge(m, src) -} -func (m *EnumDescriptorProto_EnumReservedRange) XXX_Size() int { - return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Size(m) -} -func (m *EnumDescriptorProto_EnumReservedRange) XXX_DiscardUnknown() { - xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.DiscardUnknown(m) -} - -var xxx_messageInfo_EnumDescriptorProto_EnumReservedRange proto.InternalMessageInfo - -func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 { - if m != nil && m.Start != nil { - return *m.Start - } - return 0 -} - -func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { - if m != nil && m.End != nil { - return *m.End - } - return 0 -} - -// Describes a value within an enum. -type EnumValueDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` - Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } -func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*EnumValueDescriptorProto) ProtoMessage() {} -func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{7} -} -func (m *EnumValueDescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EnumValueDescriptorProto.Unmarshal(m, b) -} -func (m *EnumValueDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EnumValueDescriptorProto.Marshal(b, m, deterministic) -} -func (m *EnumValueDescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnumValueDescriptorProto.Merge(m, src) -} -func (m *EnumValueDescriptorProto) XXX_Size() int { - return xxx_messageInfo_EnumValueDescriptorProto.Size(m) -} -func (m *EnumValueDescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_EnumValueDescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_EnumValueDescriptorProto proto.InternalMessageInfo - -func (m *EnumValueDescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *EnumValueDescriptorProto) GetNumber() int32 { - if m != nil && m.Number != nil { - return *m.Number - } - return 0 -} - -func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { - if m != nil { - return m.Options - } - return nil -} - -// Describes a service. -type ServiceDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` - Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } -func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*ServiceDescriptorProto) ProtoMessage() {} -func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{8} -} -func (m *ServiceDescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServiceDescriptorProto.Unmarshal(m, b) -} -func (m *ServiceDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServiceDescriptorProto.Marshal(b, m, deterministic) -} -func (m *ServiceDescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceDescriptorProto.Merge(m, src) -} -func (m *ServiceDescriptorProto) XXX_Size() int { - return xxx_messageInfo_ServiceDescriptorProto.Size(m) -} -func (m *ServiceDescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceDescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceDescriptorProto proto.InternalMessageInfo - -func (m *ServiceDescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { - if m != nil { - return m.Method - } - return nil -} - -func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { - if m != nil { - return m.Options - } - return nil -} - -// Describes a method of a service. -type MethodDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Input and output type names. These are resolved in the same way as - // FieldDescriptorProto.type_name, but must refer to a message type. - InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` - OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` - Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` - // Identifies if client streams multiple client messages - ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` - // Identifies if server streams multiple server messages - ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } -func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*MethodDescriptorProto) ProtoMessage() {} -func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{9} -} -func (m *MethodDescriptorProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MethodDescriptorProto.Unmarshal(m, b) -} -func (m *MethodDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MethodDescriptorProto.Marshal(b, m, deterministic) -} -func (m *MethodDescriptorProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_MethodDescriptorProto.Merge(m, src) -} -func (m *MethodDescriptorProto) XXX_Size() int { - return xxx_messageInfo_MethodDescriptorProto.Size(m) -} -func (m *MethodDescriptorProto) XXX_DiscardUnknown() { - xxx_messageInfo_MethodDescriptorProto.DiscardUnknown(m) -} - -var xxx_messageInfo_MethodDescriptorProto proto.InternalMessageInfo - -const Default_MethodDescriptorProto_ClientStreaming bool = false -const Default_MethodDescriptorProto_ServerStreaming bool = false - -func (m *MethodDescriptorProto) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MethodDescriptorProto) GetInputType() string { - if m != nil && m.InputType != nil { - return *m.InputType - } - return "" -} - -func (m *MethodDescriptorProto) GetOutputType() string { - if m != nil && m.OutputType != nil { - return *m.OutputType - } - return "" -} - -func (m *MethodDescriptorProto) GetOptions() *MethodOptions { - if m != nil { - return m.Options - } - return nil -} - -func (m *MethodDescriptorProto) GetClientStreaming() bool { - if m != nil && m.ClientStreaming != nil { - return *m.ClientStreaming - } - return Default_MethodDescriptorProto_ClientStreaming -} - -func (m *MethodDescriptorProto) GetServerStreaming() bool { - if m != nil && m.ServerStreaming != nil { - return *m.ServerStreaming - } - return Default_MethodDescriptorProto_ServerStreaming -} - -type FileOptions struct { - // Sets the Java package where classes generated from this .proto will be - // placed. By default, the proto package is used, but this is often - // inappropriate because proto packages do not normally start with backwards - // domain names. - JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` - // If set, all the classes from the .proto file are wrapped in a single - // outer class with the given name. This applies to both Proto1 - // (equivalent to the old "--one_java_file" option) and Proto2 (where - // a .proto always translates to a single class, but you may want to - // explicitly choose the class name). - JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` - // If set true, then the Java code generator will generate a separate .java - // file for each top-level message, enum, and service defined in the .proto - // file. Thus, these types will *not* be nested inside the outer class - // named by java_outer_classname. However, the outer class will still be - // generated to contain the file's getDescriptor() method as well as any - // top-level extensions defined in the file. - JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` - // This option does nothing. - JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use. - // If set true, then the Java2 code generator will generate code that - // throws an exception whenever an attempt is made to assign a non-UTF-8 - // byte sequence to a string field. - // Message reflection will do the same. - // However, an extension field still accepts non-UTF-8 byte sequences. - // This option has no effect on when used with the lite runtime. - JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` - OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` - // Sets the Go package where structs generated from this .proto will be - // placed. If omitted, the Go package will be derived from the following: - // - The basename of the package import path, if provided. - // - Otherwise, the package statement in the .proto file, if present. - // - Otherwise, the basename of the .proto file, without extension. - GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` - // Should generic services be generated in each language? "Generic" services - // are not specific to any particular RPC system. They are generated by the - // main code generators in each language (without additional plugins). - // Generic services were the only kind of service generation supported by - // early versions of google.protobuf. - // - // Generic services are now considered deprecated in favor of using plugins - // that generate code specific to your particular RPC system. Therefore, - // these default to false. Old code which depends on generic services should - // explicitly set them to true. - CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` - JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` - PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` - PhpGenericServices *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"` - // Is this file deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for everything in the file, or it will be completely ignored; in the very - // least, this is a formalization for deprecating files. - Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - // Enables the use of arenas for the proto messages in this file. This applies - // only to generated classes for C++. - CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` - // Sets the objective c class prefix which is prepended to all objective c - // generated classes from this .proto. There is no default. - ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"` - // Namespace for generated classes; defaults to the package. - CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"` - // By default Swift generators will take the proto package and CamelCase it - // replacing '.' with underscore and use that to prefix the types/symbols - // defined. When this options is provided, they will use this value instead - // to prefix the types/symbols defined. - SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"` - // Sets the php class prefix which is prepended to all php generated classes - // from this .proto. Default is empty. - PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` - // Use this option to change the namespace of php generated classes. Default - // is empty. When this option is empty, the package name will be used for - // determining the namespace. - PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"` - // Use this option to change the namespace of php generated metadata classes. - // Default is empty. When this option is empty, the proto file name will be - // used for determining the namespace. - PhpMetadataNamespace *string `protobuf:"bytes,44,opt,name=php_metadata_namespace,json=phpMetadataNamespace" json:"php_metadata_namespace,omitempty"` - // Use this option to change the package of ruby generated classes. Default - // is empty. When this option is not set, the package name will be used for - // determining the ruby package. - RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"` - // The parser stores options it doesn't recognize here. - // See the documentation for the "Options" section above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FileOptions) Reset() { *m = FileOptions{} } -func (m *FileOptions) String() string { return proto.CompactTextString(m) } -func (*FileOptions) ProtoMessage() {} -func (*FileOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{10} -} - -var extRange_FileOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_FileOptions -} - -func (m *FileOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FileOptions.Unmarshal(m, b) -} -func (m *FileOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FileOptions.Marshal(b, m, deterministic) -} -func (m *FileOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_FileOptions.Merge(m, src) -} -func (m *FileOptions) XXX_Size() int { - return xxx_messageInfo_FileOptions.Size(m) -} -func (m *FileOptions) XXX_DiscardUnknown() { - xxx_messageInfo_FileOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_FileOptions proto.InternalMessageInfo - -const Default_FileOptions_JavaMultipleFiles bool = false -const Default_FileOptions_JavaStringCheckUtf8 bool = false -const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED -const Default_FileOptions_CcGenericServices bool = false -const Default_FileOptions_JavaGenericServices bool = false -const Default_FileOptions_PyGenericServices bool = false -const Default_FileOptions_PhpGenericServices bool = false -const Default_FileOptions_Deprecated bool = false -const Default_FileOptions_CcEnableArenas bool = false - -func (m *FileOptions) GetJavaPackage() string { - if m != nil && m.JavaPackage != nil { - return *m.JavaPackage - } - return "" -} - -func (m *FileOptions) GetJavaOuterClassname() string { - if m != nil && m.JavaOuterClassname != nil { - return *m.JavaOuterClassname - } - return "" -} - -func (m *FileOptions) GetJavaMultipleFiles() bool { - if m != nil && m.JavaMultipleFiles != nil { - return *m.JavaMultipleFiles - } - return Default_FileOptions_JavaMultipleFiles -} - -// Deprecated: Do not use. -func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { - if m != nil && m.JavaGenerateEqualsAndHash != nil { - return *m.JavaGenerateEqualsAndHash - } - return false -} - -func (m *FileOptions) GetJavaStringCheckUtf8() bool { - if m != nil && m.JavaStringCheckUtf8 != nil { - return *m.JavaStringCheckUtf8 - } - return Default_FileOptions_JavaStringCheckUtf8 -} - -func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { - if m != nil && m.OptimizeFor != nil { - return *m.OptimizeFor - } - return Default_FileOptions_OptimizeFor -} - -func (m *FileOptions) GetGoPackage() string { - if m != nil && m.GoPackage != nil { - return *m.GoPackage - } - return "" -} - -func (m *FileOptions) GetCcGenericServices() bool { - if m != nil && m.CcGenericServices != nil { - return *m.CcGenericServices - } - return Default_FileOptions_CcGenericServices -} - -func (m *FileOptions) GetJavaGenericServices() bool { - if m != nil && m.JavaGenericServices != nil { - return *m.JavaGenericServices - } - return Default_FileOptions_JavaGenericServices -} - -func (m *FileOptions) GetPyGenericServices() bool { - if m != nil && m.PyGenericServices != nil { - return *m.PyGenericServices - } - return Default_FileOptions_PyGenericServices -} - -func (m *FileOptions) GetPhpGenericServices() bool { - if m != nil && m.PhpGenericServices != nil { - return *m.PhpGenericServices - } - return Default_FileOptions_PhpGenericServices -} - -func (m *FileOptions) GetDeprecated() bool { - if m != nil && m.Deprecated != nil { - return *m.Deprecated - } - return Default_FileOptions_Deprecated -} - -func (m *FileOptions) GetCcEnableArenas() bool { - if m != nil && m.CcEnableArenas != nil { - return *m.CcEnableArenas - } - return Default_FileOptions_CcEnableArenas -} - -func (m *FileOptions) GetObjcClassPrefix() string { - if m != nil && m.ObjcClassPrefix != nil { - return *m.ObjcClassPrefix - } - return "" -} - -func (m *FileOptions) GetCsharpNamespace() string { - if m != nil && m.CsharpNamespace != nil { - return *m.CsharpNamespace - } - return "" -} - -func (m *FileOptions) GetSwiftPrefix() string { - if m != nil && m.SwiftPrefix != nil { - return *m.SwiftPrefix - } - return "" -} - -func (m *FileOptions) GetPhpClassPrefix() string { - if m != nil && m.PhpClassPrefix != nil { - return *m.PhpClassPrefix - } - return "" -} - -func (m *FileOptions) GetPhpNamespace() string { - if m != nil && m.PhpNamespace != nil { - return *m.PhpNamespace - } - return "" -} - -func (m *FileOptions) GetPhpMetadataNamespace() string { - if m != nil && m.PhpMetadataNamespace != nil { - return *m.PhpMetadataNamespace - } - return "" -} - -func (m *FileOptions) GetRubyPackage() string { - if m != nil && m.RubyPackage != nil { - return *m.RubyPackage - } - return "" -} - -func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -type MessageOptions struct { - // Set true to use the old proto1 MessageSet wire format for extensions. - // This is provided for backwards-compatibility with the MessageSet wire - // format. You should not use this for any other reason: It's less - // efficient, has fewer features, and is more complicated. - // - // The message must be defined exactly as follows: - // message Foo { - // option message_set_wire_format = true; - // extensions 4 to max; - // } - // Note that the message cannot have any defined fields; MessageSets only - // have extensions. - // - // All extensions of your type must be singular messages; e.g. they cannot - // be int32s, enums, or repeated messages. - // - // Because this is an option, the above two restrictions are not enforced by - // the protocol compiler. - MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` - // Disables the generation of the standard "descriptor()" accessor, which can - // conflict with a field of the same name. This is meant to make migration - // from proto1 easier; new code should avoid fields named "descriptor". - NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` - // Is this message deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the message, or it will be completely ignored; in the very least, - // this is a formalization for deprecating messages. - Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - // Whether the message is an automatically generated map entry type for the - // maps field. - // - // For maps fields: - // map map_field = 1; - // The parsed descriptor looks like: - // message MapFieldEntry { - // option map_entry = true; - // optional KeyType key = 1; - // optional ValueType value = 2; - // } - // repeated MapFieldEntry map_field = 1; - // - // Implementations may choose not to generate the map_entry=true message, but - // use a native map in the target language to hold the keys and values. - // The reflection APIs in such implementations still need to work as - // if the field is a repeated message field. - // - // NOTE: Do not set the option in .proto files. Always use the maps syntax - // instead. The option should only be implicitly set by the proto compiler - // parser. - MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MessageOptions) Reset() { *m = MessageOptions{} } -func (m *MessageOptions) String() string { return proto.CompactTextString(m) } -func (*MessageOptions) ProtoMessage() {} -func (*MessageOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{11} -} - -var extRange_MessageOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MessageOptions -} - -func (m *MessageOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MessageOptions.Unmarshal(m, b) -} -func (m *MessageOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MessageOptions.Marshal(b, m, deterministic) -} -func (m *MessageOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_MessageOptions.Merge(m, src) -} -func (m *MessageOptions) XXX_Size() int { - return xxx_messageInfo_MessageOptions.Size(m) -} -func (m *MessageOptions) XXX_DiscardUnknown() { - xxx_messageInfo_MessageOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_MessageOptions proto.InternalMessageInfo - -const Default_MessageOptions_MessageSetWireFormat bool = false -const Default_MessageOptions_NoStandardDescriptorAccessor bool = false -const Default_MessageOptions_Deprecated bool = false - -func (m *MessageOptions) GetMessageSetWireFormat() bool { - if m != nil && m.MessageSetWireFormat != nil { - return *m.MessageSetWireFormat - } - return Default_MessageOptions_MessageSetWireFormat -} - -func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { - if m != nil && m.NoStandardDescriptorAccessor != nil { - return *m.NoStandardDescriptorAccessor - } - return Default_MessageOptions_NoStandardDescriptorAccessor -} - -func (m *MessageOptions) GetDeprecated() bool { - if m != nil && m.Deprecated != nil { - return *m.Deprecated - } - return Default_MessageOptions_Deprecated -} - -func (m *MessageOptions) GetMapEntry() bool { - if m != nil && m.MapEntry != nil { - return *m.MapEntry - } - return false -} - -func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -type FieldOptions struct { - // The ctype option instructs the C++ code generator to use a different - // representation of the field than it normally would. See the specific - // options below. This option is not yet implemented in the open source - // release -- sorry, we'll try to include it in a future version! - Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` - // The packed option can be enabled for repeated primitive fields to enable - // a more efficient representation on the wire. Rather than repeatedly - // writing the tag and type for each element, the entire array is encoded as - // a single length-delimited blob. In proto3, only explicit setting it to - // false will avoid using packed encoding. - Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` - // The jstype option determines the JavaScript type used for values of the - // field. The option is permitted only for 64 bit integral and fixed types - // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING - // is represented as JavaScript string, which avoids loss of precision that - // can happen when a large value is converted to a floating point JavaScript. - // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to - // use the JavaScript "number" type. The behavior of the default option - // JS_NORMAL is implementation dependent. - // - // This option is an enum to permit additional types to be added, e.g. - // goog.math.Integer. - Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` - // Should this field be parsed lazily? Lazy applies only to message-type - // fields. It means that when the outer message is initially parsed, the - // inner message's contents will not be parsed but instead stored in encoded - // form. The inner message will actually be parsed when it is first accessed. - // - // This is only a hint. Implementations are free to choose whether to use - // eager or lazy parsing regardless of the value of this option. However, - // setting this option true suggests that the protocol author believes that - // using lazy parsing on this field is worth the additional bookkeeping - // overhead typically needed to implement it. - // - // This option does not affect the public interface of any generated code; - // all method signatures remain the same. Furthermore, thread-safety of the - // interface is not affected by this option; const methods remain safe to - // call from multiple threads concurrently, while non-const methods continue - // to require exclusive access. - // - // - // Note that implementations may choose not to check required fields within - // a lazy sub-message. That is, calling IsInitialized() on the outer message - // may return true even if the inner message has missing required fields. - // This is necessary because otherwise the inner message would have to be - // parsed in order to perform the check, defeating the purpose of lazy - // parsing. An implementation which chooses not to check required fields - // must be consistent about it. That is, for any particular sub-message, the - // implementation must either *always* check its required fields, or *never* - // check its required fields, regardless of whether or not the message has - // been parsed. - Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` - // Is this field deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for accessors, or it will be completely ignored; in the very least, this - // is a formalization for deprecating fields. - Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - // For Google-internal migration only. Do not use. - Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FieldOptions) Reset() { *m = FieldOptions{} } -func (m *FieldOptions) String() string { return proto.CompactTextString(m) } -func (*FieldOptions) ProtoMessage() {} -func (*FieldOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{12} -} - -var extRange_FieldOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_FieldOptions -} - -func (m *FieldOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FieldOptions.Unmarshal(m, b) -} -func (m *FieldOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FieldOptions.Marshal(b, m, deterministic) -} -func (m *FieldOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_FieldOptions.Merge(m, src) -} -func (m *FieldOptions) XXX_Size() int { - return xxx_messageInfo_FieldOptions.Size(m) -} -func (m *FieldOptions) XXX_DiscardUnknown() { - xxx_messageInfo_FieldOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_FieldOptions proto.InternalMessageInfo - -const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING -const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL -const Default_FieldOptions_Lazy bool = false -const Default_FieldOptions_Deprecated bool = false -const Default_FieldOptions_Weak bool = false - -func (m *FieldOptions) GetCtype() FieldOptions_CType { - if m != nil && m.Ctype != nil { - return *m.Ctype - } - return Default_FieldOptions_Ctype -} - -func (m *FieldOptions) GetPacked() bool { - if m != nil && m.Packed != nil { - return *m.Packed - } - return false -} - -func (m *FieldOptions) GetJstype() FieldOptions_JSType { - if m != nil && m.Jstype != nil { - return *m.Jstype - } - return Default_FieldOptions_Jstype -} - -func (m *FieldOptions) GetLazy() bool { - if m != nil && m.Lazy != nil { - return *m.Lazy - } - return Default_FieldOptions_Lazy -} - -func (m *FieldOptions) GetDeprecated() bool { - if m != nil && m.Deprecated != nil { - return *m.Deprecated - } - return Default_FieldOptions_Deprecated -} - -func (m *FieldOptions) GetWeak() bool { - if m != nil && m.Weak != nil { - return *m.Weak - } - return Default_FieldOptions_Weak -} - -func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -type OneofOptions struct { - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *OneofOptions) Reset() { *m = OneofOptions{} } -func (m *OneofOptions) String() string { return proto.CompactTextString(m) } -func (*OneofOptions) ProtoMessage() {} -func (*OneofOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{13} -} - -var extRange_OneofOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_OneofOptions -} - -func (m *OneofOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_OneofOptions.Unmarshal(m, b) -} -func (m *OneofOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_OneofOptions.Marshal(b, m, deterministic) -} -func (m *OneofOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_OneofOptions.Merge(m, src) -} -func (m *OneofOptions) XXX_Size() int { - return xxx_messageInfo_OneofOptions.Size(m) -} -func (m *OneofOptions) XXX_DiscardUnknown() { - xxx_messageInfo_OneofOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_OneofOptions proto.InternalMessageInfo - -func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -type EnumOptions struct { - // Set this option to true to allow mapping different tag names to the same - // value. - AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` - // Is this enum deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum, or it will be completely ignored; in the very least, this - // is a formalization for deprecating enums. - Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnumOptions) Reset() { *m = EnumOptions{} } -func (m *EnumOptions) String() string { return proto.CompactTextString(m) } -func (*EnumOptions) ProtoMessage() {} -func (*EnumOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{14} -} - -var extRange_EnumOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_EnumOptions -} - -func (m *EnumOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EnumOptions.Unmarshal(m, b) -} -func (m *EnumOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EnumOptions.Marshal(b, m, deterministic) -} -func (m *EnumOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnumOptions.Merge(m, src) -} -func (m *EnumOptions) XXX_Size() int { - return xxx_messageInfo_EnumOptions.Size(m) -} -func (m *EnumOptions) XXX_DiscardUnknown() { - xxx_messageInfo_EnumOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_EnumOptions proto.InternalMessageInfo - -const Default_EnumOptions_Deprecated bool = false - -func (m *EnumOptions) GetAllowAlias() bool { - if m != nil && m.AllowAlias != nil { - return *m.AllowAlias - } - return false -} - -func (m *EnumOptions) GetDeprecated() bool { - if m != nil && m.Deprecated != nil { - return *m.Deprecated - } - return Default_EnumOptions_Deprecated -} - -func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -type EnumValueOptions struct { - // Is this enum value deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum value, or it will be completely ignored; in the very least, - // this is a formalization for deprecating enum values. - Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } -func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } -func (*EnumValueOptions) ProtoMessage() {} -func (*EnumValueOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{15} -} - -var extRange_EnumValueOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_EnumValueOptions -} - -func (m *EnumValueOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EnumValueOptions.Unmarshal(m, b) -} -func (m *EnumValueOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EnumValueOptions.Marshal(b, m, deterministic) -} -func (m *EnumValueOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnumValueOptions.Merge(m, src) -} -func (m *EnumValueOptions) XXX_Size() int { - return xxx_messageInfo_EnumValueOptions.Size(m) -} -func (m *EnumValueOptions) XXX_DiscardUnknown() { - xxx_messageInfo_EnumValueOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_EnumValueOptions proto.InternalMessageInfo - -const Default_EnumValueOptions_Deprecated bool = false - -func (m *EnumValueOptions) GetDeprecated() bool { - if m != nil && m.Deprecated != nil { - return *m.Deprecated - } - return Default_EnumValueOptions_Deprecated -} - -func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -type ServiceOptions struct { - // Is this service deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the service, or it will be completely ignored; in the very least, - // this is a formalization for deprecating services. - Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } -func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } -func (*ServiceOptions) ProtoMessage() {} -func (*ServiceOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{16} -} - -var extRange_ServiceOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_ServiceOptions -} - -func (m *ServiceOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServiceOptions.Unmarshal(m, b) -} -func (m *ServiceOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServiceOptions.Marshal(b, m, deterministic) -} -func (m *ServiceOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceOptions.Merge(m, src) -} -func (m *ServiceOptions) XXX_Size() int { - return xxx_messageInfo_ServiceOptions.Size(m) -} -func (m *ServiceOptions) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceOptions proto.InternalMessageInfo - -const Default_ServiceOptions_Deprecated bool = false - -func (m *ServiceOptions) GetDeprecated() bool { - if m != nil && m.Deprecated != nil { - return *m.Deprecated - } - return Default_ServiceOptions_Deprecated -} - -func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -type MethodOptions struct { - // Is this method deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the method, or it will be completely ignored; in the very least, - // this is a formalization for deprecating methods. - Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MethodOptions) Reset() { *m = MethodOptions{} } -func (m *MethodOptions) String() string { return proto.CompactTextString(m) } -func (*MethodOptions) ProtoMessage() {} -func (*MethodOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{17} -} - -var extRange_MethodOptions = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MethodOptions -} - -func (m *MethodOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MethodOptions.Unmarshal(m, b) -} -func (m *MethodOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MethodOptions.Marshal(b, m, deterministic) -} -func (m *MethodOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_MethodOptions.Merge(m, src) -} -func (m *MethodOptions) XXX_Size() int { - return xxx_messageInfo_MethodOptions.Size(m) -} -func (m *MethodOptions) XXX_DiscardUnknown() { - xxx_messageInfo_MethodOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_MethodOptions proto.InternalMessageInfo - -const Default_MethodOptions_Deprecated bool = false -const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN - -func (m *MethodOptions) GetDeprecated() bool { - if m != nil && m.Deprecated != nil { - return *m.Deprecated - } - return Default_MethodOptions_Deprecated -} - -func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { - if m != nil && m.IdempotencyLevel != nil { - return *m.IdempotencyLevel - } - return Default_MethodOptions_IdempotencyLevel -} - -func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { - if m != nil { - return m.UninterpretedOption - } - return nil -} - -// A message representing a option the parser does not recognize. This only -// appears in options protos created by the compiler::Parser class. -// DescriptorPool resolves these when building Descriptor objects. Therefore, -// options protos in descriptor objects (e.g. returned by Descriptor::options(), -// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions -// in them. -type UninterpretedOption struct { - Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` - // The value of the uninterpreted option, in whatever type the tokenizer - // identified it as during parsing. Exactly one of these should be set. - IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` - PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` - NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` - DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` - StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` - AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } -func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } -func (*UninterpretedOption) ProtoMessage() {} -func (*UninterpretedOption) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{18} -} -func (m *UninterpretedOption) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UninterpretedOption.Unmarshal(m, b) -} -func (m *UninterpretedOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UninterpretedOption.Marshal(b, m, deterministic) -} -func (m *UninterpretedOption) XXX_Merge(src proto.Message) { - xxx_messageInfo_UninterpretedOption.Merge(m, src) -} -func (m *UninterpretedOption) XXX_Size() int { - return xxx_messageInfo_UninterpretedOption.Size(m) -} -func (m *UninterpretedOption) XXX_DiscardUnknown() { - xxx_messageInfo_UninterpretedOption.DiscardUnknown(m) -} - -var xxx_messageInfo_UninterpretedOption proto.InternalMessageInfo - -func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { - if m != nil { - return m.Name - } - return nil -} - -func (m *UninterpretedOption) GetIdentifierValue() string { - if m != nil && m.IdentifierValue != nil { - return *m.IdentifierValue - } - return "" -} - -func (m *UninterpretedOption) GetPositiveIntValue() uint64 { - if m != nil && m.PositiveIntValue != nil { - return *m.PositiveIntValue - } - return 0 -} - -func (m *UninterpretedOption) GetNegativeIntValue() int64 { - if m != nil && m.NegativeIntValue != nil { - return *m.NegativeIntValue - } - return 0 -} - -func (m *UninterpretedOption) GetDoubleValue() float64 { - if m != nil && m.DoubleValue != nil { - return *m.DoubleValue - } - return 0 -} - -func (m *UninterpretedOption) GetStringValue() []byte { - if m != nil { - return m.StringValue - } - return nil -} - -func (m *UninterpretedOption) GetAggregateValue() string { - if m != nil && m.AggregateValue != nil { - return *m.AggregateValue - } - return "" -} - -// The name of the uninterpreted option. Each string represents a segment in -// a dot-separated name. is_extension is true iff a segment represents an -// extension (denoted with parentheses in options specs in .proto files). -// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents -// "foo.(bar.baz).qux". -type UninterpretedOption_NamePart struct { - NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` - IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } -func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } -func (*UninterpretedOption_NamePart) ProtoMessage() {} -func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{18, 0} -} -func (m *UninterpretedOption_NamePart) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UninterpretedOption_NamePart.Unmarshal(m, b) -} -func (m *UninterpretedOption_NamePart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UninterpretedOption_NamePart.Marshal(b, m, deterministic) -} -func (m *UninterpretedOption_NamePart) XXX_Merge(src proto.Message) { - xxx_messageInfo_UninterpretedOption_NamePart.Merge(m, src) -} -func (m *UninterpretedOption_NamePart) XXX_Size() int { - return xxx_messageInfo_UninterpretedOption_NamePart.Size(m) -} -func (m *UninterpretedOption_NamePart) XXX_DiscardUnknown() { - xxx_messageInfo_UninterpretedOption_NamePart.DiscardUnknown(m) -} - -var xxx_messageInfo_UninterpretedOption_NamePart proto.InternalMessageInfo - -func (m *UninterpretedOption_NamePart) GetNamePart() string { - if m != nil && m.NamePart != nil { - return *m.NamePart - } - return "" -} - -func (m *UninterpretedOption_NamePart) GetIsExtension() bool { - if m != nil && m.IsExtension != nil { - return *m.IsExtension - } - return false -} - -// Encapsulates information about the original source file from which a -// FileDescriptorProto was generated. -type SourceCodeInfo struct { - // A Location identifies a piece of source code in a .proto file which - // corresponds to a particular definition. This information is intended - // to be useful to IDEs, code indexers, documentation generators, and similar - // tools. - // - // For example, say we have a file like: - // message Foo { - // optional string foo = 1; - // } - // Let's look at just the field definition: - // optional string foo = 1; - // ^ ^^ ^^ ^ ^^^ - // a bc de f ghi - // We have the following locations: - // span path represents - // [a,i) [ 4, 0, 2, 0 ] The whole field definition. - // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). - // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). - // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). - // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). - // - // Notes: - // - A location may refer to a repeated field itself (i.e. not to any - // particular index within it). This is used whenever a set of elements are - // logically enclosed in a single code segment. For example, an entire - // extend block (possibly containing multiple extension definitions) will - // have an outer location whose path refers to the "extensions" repeated - // field without an index. - // - Multiple locations may have the same path. This happens when a single - // logical declaration is spread out across multiple places. The most - // obvious example is the "extend" block again -- there may be multiple - // extend blocks in the same scope, each of which will have the same path. - // - A location's span is not always a subset of its parent's span. For - // example, the "extendee" of an extension declaration appears at the - // beginning of the "extend" block and is shared by all extensions within - // the block. - // - Just because a location's span is a subset of some other location's span - // does not mean that it is a descendant. For example, a "group" defines - // both a type and a field in a single declaration. Thus, the locations - // corresponding to the type and field and their components will overlap. - // - Code which tries to interpret locations should probably be designed to - // ignore those that it doesn't understand, as more types of locations could - // be recorded in the future. - Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } -func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } -func (*SourceCodeInfo) ProtoMessage() {} -func (*SourceCodeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{19} -} -func (m *SourceCodeInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SourceCodeInfo.Unmarshal(m, b) -} -func (m *SourceCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SourceCodeInfo.Marshal(b, m, deterministic) -} -func (m *SourceCodeInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_SourceCodeInfo.Merge(m, src) -} -func (m *SourceCodeInfo) XXX_Size() int { - return xxx_messageInfo_SourceCodeInfo.Size(m) -} -func (m *SourceCodeInfo) XXX_DiscardUnknown() { - xxx_messageInfo_SourceCodeInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_SourceCodeInfo proto.InternalMessageInfo - -func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { - if m != nil { - return m.Location - } - return nil -} - -type SourceCodeInfo_Location struct { - // Identifies which part of the FileDescriptorProto was defined at this - // location. - // - // Each element is a field number or an index. They form a path from - // the root FileDescriptorProto to the place where the definition. For - // example, this path: - // [ 4, 3, 2, 7, 1 ] - // refers to: - // file.message_type(3) // 4, 3 - // .field(7) // 2, 7 - // .name() // 1 - // This is because FileDescriptorProto.message_type has field number 4: - // repeated DescriptorProto message_type = 4; - // and DescriptorProto.field has field number 2: - // repeated FieldDescriptorProto field = 2; - // and FieldDescriptorProto.name has field number 1: - // optional string name = 1; - // - // Thus, the above path gives the location of a field name. If we removed - // the last element: - // [ 4, 3, 2, 7 ] - // this path refers to the whole field declaration (from the beginning - // of the label to the terminating semicolon). - Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` - // Always has exactly three or four elements: start line, start column, - // end line (optional, otherwise assumed same as start line), end column. - // These are packed into a single field for efficiency. Note that line - // and column numbers are zero-based -- typically you will want to add - // 1 to each before displaying to a user. - Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` - // If this SourceCodeInfo represents a complete declaration, these are any - // comments appearing before and after the declaration which appear to be - // attached to the declaration. - // - // A series of line comments appearing on consecutive lines, with no other - // tokens appearing on those lines, will be treated as a single comment. - // - // leading_detached_comments will keep paragraphs of comments that appear - // before (but not connected to) the current element. Each paragraph, - // separated by empty lines, will be one comment element in the repeated - // field. - // - // Only the comment content is provided; comment markers (e.g. //) are - // stripped out. For block comments, leading whitespace and an asterisk - // will be stripped from the beginning of each line other than the first. - // Newlines are included in the output. - // - // Examples: - // - // optional int32 foo = 1; // Comment attached to foo. - // // Comment attached to bar. - // optional int32 bar = 2; - // - // optional string baz = 3; - // // Comment attached to baz. - // // Another line attached to baz. - // - // // Comment attached to qux. - // // - // // Another line attached to qux. - // optional double qux = 4; - // - // // Detached comment for corge. This is not leading or trailing comments - // // to qux or corge because there are blank lines separating it from - // // both. - // - // // Detached comment for corge paragraph 2. - // - // optional string corge = 5; - // /* Block comment attached - // * to corge. Leading asterisks - // * will be removed. */ - // /* Block comment attached to - // * grault. */ - // optional int32 grault = 6; - // - // // ignored detached comments. - LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` - TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` - LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } -func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } -func (*SourceCodeInfo_Location) ProtoMessage() {} -func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{19, 0} -} -func (m *SourceCodeInfo_Location) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SourceCodeInfo_Location.Unmarshal(m, b) -} -func (m *SourceCodeInfo_Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SourceCodeInfo_Location.Marshal(b, m, deterministic) -} -func (m *SourceCodeInfo_Location) XXX_Merge(src proto.Message) { - xxx_messageInfo_SourceCodeInfo_Location.Merge(m, src) -} -func (m *SourceCodeInfo_Location) XXX_Size() int { - return xxx_messageInfo_SourceCodeInfo_Location.Size(m) -} -func (m *SourceCodeInfo_Location) XXX_DiscardUnknown() { - xxx_messageInfo_SourceCodeInfo_Location.DiscardUnknown(m) -} - -var xxx_messageInfo_SourceCodeInfo_Location proto.InternalMessageInfo - -func (m *SourceCodeInfo_Location) GetPath() []int32 { - if m != nil { - return m.Path - } - return nil -} - -func (m *SourceCodeInfo_Location) GetSpan() []int32 { - if m != nil { - return m.Span - } - return nil -} - -func (m *SourceCodeInfo_Location) GetLeadingComments() string { - if m != nil && m.LeadingComments != nil { - return *m.LeadingComments - } - return "" -} - -func (m *SourceCodeInfo_Location) GetTrailingComments() string { - if m != nil && m.TrailingComments != nil { - return *m.TrailingComments - } - return "" -} - -func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { - if m != nil { - return m.LeadingDetachedComments - } - return nil -} - -// Describes the relationship between generated code and its original source -// file. A GeneratedCodeInfo message is associated with only one generated -// source file, but may contain references to different source .proto files. -type GeneratedCodeInfo struct { - // An Annotation connects some span of text in generated code to an element - // of its generating .proto file. - Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } -func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } -func (*GeneratedCodeInfo) ProtoMessage() {} -func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{20} -} -func (m *GeneratedCodeInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GeneratedCodeInfo.Unmarshal(m, b) -} -func (m *GeneratedCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GeneratedCodeInfo.Marshal(b, m, deterministic) -} -func (m *GeneratedCodeInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_GeneratedCodeInfo.Merge(m, src) -} -func (m *GeneratedCodeInfo) XXX_Size() int { - return xxx_messageInfo_GeneratedCodeInfo.Size(m) -} -func (m *GeneratedCodeInfo) XXX_DiscardUnknown() { - xxx_messageInfo_GeneratedCodeInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_GeneratedCodeInfo proto.InternalMessageInfo - -func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { - if m != nil { - return m.Annotation - } - return nil -} - -type GeneratedCodeInfo_Annotation struct { - // Identifies the element in the original source .proto file. This field - // is formatted the same as SourceCodeInfo.Location.path. - Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` - // Identifies the filesystem path to the original source .proto. - SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` - // Identifies the starting offset in bytes in the generated code - // that relates to the identified object. - Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` - // Identifies the ending offset in bytes in the generated code that - // relates to the identified offset. The end offset should be one past - // the last relevant byte (so the length of the text = end - begin). - End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } -func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } -func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} -func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { - return fileDescriptor_308767df5ffe18af, []int{20, 0} -} -func (m *GeneratedCodeInfo_Annotation) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GeneratedCodeInfo_Annotation.Unmarshal(m, b) -} -func (m *GeneratedCodeInfo_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GeneratedCodeInfo_Annotation.Marshal(b, m, deterministic) -} -func (m *GeneratedCodeInfo_Annotation) XXX_Merge(src proto.Message) { - xxx_messageInfo_GeneratedCodeInfo_Annotation.Merge(m, src) -} -func (m *GeneratedCodeInfo_Annotation) XXX_Size() int { - return xxx_messageInfo_GeneratedCodeInfo_Annotation.Size(m) -} -func (m *GeneratedCodeInfo_Annotation) XXX_DiscardUnknown() { - xxx_messageInfo_GeneratedCodeInfo_Annotation.DiscardUnknown(m) -} - -var xxx_messageInfo_GeneratedCodeInfo_Annotation proto.InternalMessageInfo - -func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { - if m != nil { - return m.Path - } - return nil -} - -func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string { - if m != nil && m.SourceFile != nil { - return *m.SourceFile - } - return "" -} - -func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 { - if m != nil && m.Begin != nil { - return *m.Begin - } - return 0 -} - -func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { - if m != nil && m.End != nil { - return *m.End - } - return 0 -} - -func init() { - proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) - proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) - proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) - proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) - proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) - proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) - proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") - proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") - proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") - proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") - proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") - proto.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions") - proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") - proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") - proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") - proto.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange") - proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") - proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") - proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") - proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") - proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") - proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") - proto.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions") - proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") - proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") - proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") - proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") - proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") - proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") - proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") - proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") - proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") - proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") -} - -func init() { proto.RegisterFile("descriptor.proto", fileDescriptor_308767df5ffe18af) } - -var fileDescriptor_308767df5ffe18af = []byte{ - // 2522 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xcd, 0x6f, 0xdb, 0xc8, - 0x15, 0x5f, 0x7d, 0x5a, 0x7a, 0x92, 0x65, 0x7a, 0xec, 0x75, 0x18, 0xef, 0x47, 0x1c, 0xed, 0x66, - 0xe3, 0x24, 0xbb, 0xca, 0xc2, 0x49, 0x9c, 0xac, 0x53, 0x6c, 0x2b, 0x4b, 0x8c, 0x57, 0xa9, 0xbe, - 0x4a, 0xc9, 0xdd, 0x64, 0x8b, 0x82, 0x18, 0x93, 0x23, 0x89, 0x09, 0x45, 0x72, 0x49, 0x2a, 0x89, - 0x83, 0x1e, 0x02, 0xf4, 0x54, 0xa0, 0x7f, 0x40, 0x51, 0x14, 0x3d, 0xf4, 0xb2, 0x40, 0xff, 0x80, - 0x02, 0xed, 0xbd, 0xd7, 0x02, 0xbd, 0xf7, 0x50, 0xa0, 0x05, 0xda, 0x3f, 0xa1, 0xc7, 0x62, 0x66, - 0x48, 0x8a, 0xd4, 0x47, 0xe2, 0x5d, 0x20, 0xd9, 0x93, 0x3d, 0xef, 0xfd, 0xde, 0x9b, 0x37, 0x8f, - 0xbf, 0x79, 0xf3, 0x66, 0x04, 0x82, 0x46, 0x5c, 0xd5, 0xd1, 0x6d, 0xcf, 0x72, 0x2a, 0xb6, 0x63, - 0x79, 0x16, 0x5a, 0x1b, 0x5a, 0xd6, 0xd0, 0x20, 0x7c, 0x74, 0x32, 0x19, 0x94, 0x5b, 0xb0, 0x7e, - 0x4f, 0x37, 0x48, 0x3d, 0x04, 0xf6, 0x88, 0x87, 0xee, 0x40, 0x7a, 0xa0, 0x1b, 0x44, 0x4c, 0xec, - 0xa4, 0x76, 0x0b, 0x7b, 0x1f, 0x56, 0x66, 0x8c, 0x2a, 0x71, 0x8b, 0x2e, 0x15, 0xcb, 0xcc, 0xa2, - 0xfc, 0xef, 0x34, 0x6c, 0x2c, 0xd0, 0x22, 0x04, 0x69, 0x13, 0x8f, 0xa9, 0xc7, 0xc4, 0x6e, 0x5e, - 0x66, 0xff, 0x23, 0x11, 0x56, 0x6c, 0xac, 0x3e, 0xc6, 0x43, 0x22, 0x26, 0x99, 0x38, 0x18, 0xa2, - 0xf7, 0x01, 0x34, 0x62, 0x13, 0x53, 0x23, 0xa6, 0x7a, 0x2a, 0xa6, 0x76, 0x52, 0xbb, 0x79, 0x39, - 0x22, 0x41, 0xd7, 0x60, 0xdd, 0x9e, 0x9c, 0x18, 0xba, 0xaa, 0x44, 0x60, 0xb0, 0x93, 0xda, 0xcd, - 0xc8, 0x02, 0x57, 0xd4, 0xa7, 0xe0, 0xcb, 0xb0, 0xf6, 0x94, 0xe0, 0xc7, 0x51, 0x68, 0x81, 0x41, - 0x4b, 0x54, 0x1c, 0x01, 0xd6, 0xa0, 0x38, 0x26, 0xae, 0x8b, 0x87, 0x44, 0xf1, 0x4e, 0x6d, 0x22, - 0xa6, 0xd9, 0xea, 0x77, 0xe6, 0x56, 0x3f, 0xbb, 0xf2, 0x82, 0x6f, 0xd5, 0x3f, 0xb5, 0x09, 0xaa, - 0x42, 0x9e, 0x98, 0x93, 0x31, 0xf7, 0x90, 0x59, 0x92, 0x3f, 0xc9, 0x9c, 0x8c, 0x67, 0xbd, 0xe4, - 0xa8, 0x99, 0xef, 0x62, 0xc5, 0x25, 0xce, 0x13, 0x5d, 0x25, 0x62, 0x96, 0x39, 0xb8, 0x3c, 0xe7, - 0xa0, 0xc7, 0xf5, 0xb3, 0x3e, 0x02, 0x3b, 0x54, 0x83, 0x3c, 0x79, 0xe6, 0x11, 0xd3, 0xd5, 0x2d, - 0x53, 0x5c, 0x61, 0x4e, 0x2e, 0x2d, 0xf8, 0x8a, 0xc4, 0xd0, 0x66, 0x5d, 0x4c, 0xed, 0xd0, 0x3e, - 0xac, 0x58, 0xb6, 0xa7, 0x5b, 0xa6, 0x2b, 0xe6, 0x76, 0x12, 0xbb, 0x85, 0xbd, 0x77, 0x17, 0x12, - 0xa1, 0xc3, 0x31, 0x72, 0x00, 0x46, 0x0d, 0x10, 0x5c, 0x6b, 0xe2, 0xa8, 0x44, 0x51, 0x2d, 0x8d, - 0x28, 0xba, 0x39, 0xb0, 0xc4, 0x3c, 0x73, 0x70, 0x61, 0x7e, 0x21, 0x0c, 0x58, 0xb3, 0x34, 0xd2, - 0x30, 0x07, 0x96, 0x5c, 0x72, 0x63, 0x63, 0xb4, 0x05, 0x59, 0xf7, 0xd4, 0xf4, 0xf0, 0x33, 0xb1, - 0xc8, 0x18, 0xe2, 0x8f, 0xca, 0x7f, 0xce, 0xc2, 0xda, 0x59, 0x28, 0x76, 0x17, 0x32, 0x03, 0xba, - 0x4a, 0x31, 0xf9, 0x6d, 0x72, 0xc0, 0x6d, 0xe2, 0x49, 0xcc, 0x7e, 0xc7, 0x24, 0x56, 0xa1, 0x60, - 0x12, 0xd7, 0x23, 0x1a, 0x67, 0x44, 0xea, 0x8c, 0x9c, 0x02, 0x6e, 0x34, 0x4f, 0xa9, 0xf4, 0x77, - 0xa2, 0xd4, 0x03, 0x58, 0x0b, 0x43, 0x52, 0x1c, 0x6c, 0x0e, 0x03, 0x6e, 0x5e, 0x7f, 0x55, 0x24, - 0x15, 0x29, 0xb0, 0x93, 0xa9, 0x99, 0x5c, 0x22, 0xb1, 0x31, 0xaa, 0x03, 0x58, 0x26, 0xb1, 0x06, - 0x8a, 0x46, 0x54, 0x43, 0xcc, 0x2d, 0xc9, 0x52, 0x87, 0x42, 0xe6, 0xb2, 0x64, 0x71, 0xa9, 0x6a, - 0xa0, 0xcf, 0xa6, 0x54, 0x5b, 0x59, 0xc2, 0x94, 0x16, 0xdf, 0x64, 0x73, 0x6c, 0x3b, 0x86, 0x92, - 0x43, 0x28, 0xef, 0x89, 0xe6, 0xaf, 0x2c, 0xcf, 0x82, 0xa8, 0xbc, 0x72, 0x65, 0xb2, 0x6f, 0xc6, - 0x17, 0xb6, 0xea, 0x44, 0x87, 0xe8, 0x03, 0x08, 0x05, 0x0a, 0xa3, 0x15, 0xb0, 0x2a, 0x54, 0x0c, - 0x84, 0x6d, 0x3c, 0x26, 0xdb, 0xcf, 0xa1, 0x14, 0x4f, 0x0f, 0xda, 0x84, 0x8c, 0xeb, 0x61, 0xc7, - 0x63, 0x2c, 0xcc, 0xc8, 0x7c, 0x80, 0x04, 0x48, 0x11, 0x53, 0x63, 0x55, 0x2e, 0x23, 0xd3, 0x7f, - 0xd1, 0x8f, 0xa6, 0x0b, 0x4e, 0xb1, 0x05, 0x7f, 0x34, 0xff, 0x45, 0x63, 0x9e, 0x67, 0xd7, 0xbd, - 0x7d, 0x1b, 0x56, 0x63, 0x0b, 0x38, 0xeb, 0xd4, 0xe5, 0x5f, 0xc0, 0xdb, 0x0b, 0x5d, 0xa3, 0x07, - 0xb0, 0x39, 0x31, 0x75, 0xd3, 0x23, 0x8e, 0xed, 0x10, 0xca, 0x58, 0x3e, 0x95, 0xf8, 0x9f, 0x95, - 0x25, 0x9c, 0x3b, 0x8e, 0xa2, 0xb9, 0x17, 0x79, 0x63, 0x32, 0x2f, 0xbc, 0x9a, 0xcf, 0xfd, 0x77, - 0x45, 0x78, 0xf1, 0xe2, 0xc5, 0x8b, 0x64, 0xf9, 0x37, 0x59, 0xd8, 0x5c, 0xb4, 0x67, 0x16, 0x6e, - 0xdf, 0x2d, 0xc8, 0x9a, 0x93, 0xf1, 0x09, 0x71, 0x58, 0x92, 0x32, 0xb2, 0x3f, 0x42, 0x55, 0xc8, - 0x18, 0xf8, 0x84, 0x18, 0x62, 0x7a, 0x27, 0xb1, 0x5b, 0xda, 0xbb, 0x76, 0xa6, 0x5d, 0x59, 0x69, - 0x52, 0x13, 0x99, 0x5b, 0xa2, 0xcf, 0x21, 0xed, 0x97, 0x68, 0xea, 0xe1, 0xea, 0xd9, 0x3c, 0xd0, - 0xbd, 0x24, 0x33, 0x3b, 0xf4, 0x0e, 0xe4, 0xe9, 0x5f, 0xce, 0x8d, 0x2c, 0x8b, 0x39, 0x47, 0x05, - 0x94, 0x17, 0x68, 0x1b, 0x72, 0x6c, 0x9b, 0x68, 0x24, 0x38, 0xda, 0xc2, 0x31, 0x25, 0x96, 0x46, - 0x06, 0x78, 0x62, 0x78, 0xca, 0x13, 0x6c, 0x4c, 0x08, 0x23, 0x7c, 0x5e, 0x2e, 0xfa, 0xc2, 0x9f, - 0x52, 0x19, 0xba, 0x00, 0x05, 0xbe, 0xab, 0x74, 0x53, 0x23, 0xcf, 0x58, 0xf5, 0xcc, 0xc8, 0x7c, - 0xa3, 0x35, 0xa8, 0x84, 0x4e, 0xff, 0xc8, 0xb5, 0xcc, 0x80, 0x9a, 0x6c, 0x0a, 0x2a, 0x60, 0xd3, - 0xdf, 0x9e, 0x2d, 0xdc, 0xef, 0x2d, 0x5e, 0xde, 0x2c, 0xa7, 0xca, 0x7f, 0x4a, 0x42, 0x9a, 0xd5, - 0x8b, 0x35, 0x28, 0xf4, 0x1f, 0x76, 0x25, 0xa5, 0xde, 0x39, 0x3e, 0x6c, 0x4a, 0x42, 0x02, 0x95, - 0x00, 0x98, 0xe0, 0x5e, 0xb3, 0x53, 0xed, 0x0b, 0xc9, 0x70, 0xdc, 0x68, 0xf7, 0xf7, 0x6f, 0x0a, - 0xa9, 0xd0, 0xe0, 0x98, 0x0b, 0xd2, 0x51, 0xc0, 0x8d, 0x3d, 0x21, 0x83, 0x04, 0x28, 0x72, 0x07, - 0x8d, 0x07, 0x52, 0x7d, 0xff, 0xa6, 0x90, 0x8d, 0x4b, 0x6e, 0xec, 0x09, 0x2b, 0x68, 0x15, 0xf2, - 0x4c, 0x72, 0xd8, 0xe9, 0x34, 0x85, 0x5c, 0xe8, 0xb3, 0xd7, 0x97, 0x1b, 0xed, 0x23, 0x21, 0x1f, - 0xfa, 0x3c, 0x92, 0x3b, 0xc7, 0x5d, 0x01, 0x42, 0x0f, 0x2d, 0xa9, 0xd7, 0xab, 0x1e, 0x49, 0x42, - 0x21, 0x44, 0x1c, 0x3e, 0xec, 0x4b, 0x3d, 0xa1, 0x18, 0x0b, 0xeb, 0xc6, 0x9e, 0xb0, 0x1a, 0x4e, - 0x21, 0xb5, 0x8f, 0x5b, 0x42, 0x09, 0xad, 0xc3, 0x2a, 0x9f, 0x22, 0x08, 0x62, 0x6d, 0x46, 0xb4, - 0x7f, 0x53, 0x10, 0xa6, 0x81, 0x70, 0x2f, 0xeb, 0x31, 0xc1, 0xfe, 0x4d, 0x01, 0x95, 0x6b, 0x90, - 0x61, 0xec, 0x42, 0x08, 0x4a, 0xcd, 0xea, 0xa1, 0xd4, 0x54, 0x3a, 0xdd, 0x7e, 0xa3, 0xd3, 0xae, - 0x36, 0x85, 0xc4, 0x54, 0x26, 0x4b, 0x3f, 0x39, 0x6e, 0xc8, 0x52, 0x5d, 0x48, 0x46, 0x65, 0x5d, - 0xa9, 0xda, 0x97, 0xea, 0x42, 0xaa, 0xac, 0xc2, 0xe6, 0xa2, 0x3a, 0xb9, 0x70, 0x67, 0x44, 0x3e, - 0x71, 0x72, 0xc9, 0x27, 0x66, 0xbe, 0xe6, 0x3e, 0xf1, 0xbf, 0x92, 0xb0, 0xb1, 0xe0, 0xac, 0x58, - 0x38, 0xc9, 0x0f, 0x21, 0xc3, 0x29, 0xca, 0x4f, 0xcf, 0x2b, 0x0b, 0x0f, 0x1d, 0x46, 0xd8, 0xb9, - 0x13, 0x94, 0xd9, 0x45, 0x3b, 0x88, 0xd4, 0x92, 0x0e, 0x82, 0xba, 0x98, 0xab, 0xe9, 0x3f, 0x9f, - 0xab, 0xe9, 0xfc, 0xd8, 0xdb, 0x3f, 0xcb, 0xb1, 0xc7, 0x64, 0xdf, 0xae, 0xb6, 0x67, 0x16, 0xd4, - 0xf6, 0xbb, 0xb0, 0x3e, 0xe7, 0xe8, 0xcc, 0x35, 0xf6, 0x97, 0x09, 0x10, 0x97, 0x25, 0xe7, 0x15, - 0x95, 0x2e, 0x19, 0xab, 0x74, 0x77, 0x67, 0x33, 0x78, 0x71, 0xf9, 0x47, 0x98, 0xfb, 0xd6, 0xdf, - 0x24, 0x60, 0x6b, 0x71, 0xa7, 0xb8, 0x30, 0x86, 0xcf, 0x21, 0x3b, 0x26, 0xde, 0xc8, 0x0a, 0xba, - 0xa5, 0x8f, 0x16, 0x9c, 0xc1, 0x54, 0x3d, 0xfb, 0xb1, 0x7d, 0xab, 0xe8, 0x21, 0x9e, 0x5a, 0xd6, - 0xee, 0xf1, 0x68, 0xe6, 0x22, 0xfd, 0x55, 0x12, 0xde, 0x5e, 0xe8, 0x7c, 0x61, 0xa0, 0xef, 0x01, - 0xe8, 0xa6, 0x3d, 0xf1, 0x78, 0x47, 0xc4, 0x0b, 0x6c, 0x9e, 0x49, 0x58, 0xf1, 0xa2, 0xc5, 0x73, - 0xe2, 0x85, 0xfa, 0x14, 0xd3, 0x03, 0x17, 0x31, 0xc0, 0x9d, 0x69, 0xa0, 0x69, 0x16, 0xe8, 0xfb, - 0x4b, 0x56, 0x3a, 0x47, 0xcc, 0x4f, 0x41, 0x50, 0x0d, 0x9d, 0x98, 0x9e, 0xe2, 0x7a, 0x0e, 0xc1, - 0x63, 0xdd, 0x1c, 0xb2, 0x13, 0x24, 0x77, 0x90, 0x19, 0x60, 0xc3, 0x25, 0xf2, 0x1a, 0x57, 0xf7, - 0x02, 0x2d, 0xb5, 0x60, 0x04, 0x72, 0x22, 0x16, 0xd9, 0x98, 0x05, 0x57, 0x87, 0x16, 0xe5, 0x5f, - 0xe7, 0xa1, 0x10, 0xe9, 0xab, 0xd1, 0x45, 0x28, 0x3e, 0xc2, 0x4f, 0xb0, 0x12, 0xdc, 0x95, 0x78, - 0x26, 0x0a, 0x54, 0xd6, 0xf5, 0xef, 0x4b, 0x9f, 0xc2, 0x26, 0x83, 0x58, 0x13, 0x8f, 0x38, 0x8a, - 0x6a, 0x60, 0xd7, 0x65, 0x49, 0xcb, 0x31, 0x28, 0xa2, 0xba, 0x0e, 0x55, 0xd5, 0x02, 0x0d, 0xba, - 0x05, 0x1b, 0xcc, 0x62, 0x3c, 0x31, 0x3c, 0xdd, 0x36, 0x88, 0x42, 0x6f, 0x6f, 0x2e, 0x3b, 0x49, - 0xc2, 0xc8, 0xd6, 0x29, 0xa2, 0xe5, 0x03, 0x68, 0x44, 0x2e, 0xaa, 0xc3, 0x7b, 0xcc, 0x6c, 0x48, - 0x4c, 0xe2, 0x60, 0x8f, 0x28, 0xe4, 0xeb, 0x09, 0x36, 0x5c, 0x05, 0x9b, 0x9a, 0x32, 0xc2, 0xee, - 0x48, 0xdc, 0xa4, 0x0e, 0x0e, 0x93, 0x62, 0x42, 0x3e, 0x4f, 0x81, 0x47, 0x3e, 0x4e, 0x62, 0xb0, - 0xaa, 0xa9, 0x7d, 0x81, 0xdd, 0x11, 0x3a, 0x80, 0x2d, 0xe6, 0xc5, 0xf5, 0x1c, 0xdd, 0x1c, 0x2a, - 0xea, 0x88, 0xa8, 0x8f, 0x95, 0x89, 0x37, 0xb8, 0x23, 0xbe, 0x13, 0x9d, 0x9f, 0x45, 0xd8, 0x63, - 0x98, 0x1a, 0x85, 0x1c, 0x7b, 0x83, 0x3b, 0xa8, 0x07, 0x45, 0xfa, 0x31, 0xc6, 0xfa, 0x73, 0xa2, - 0x0c, 0x2c, 0x87, 0x1d, 0x8d, 0xa5, 0x05, 0xa5, 0x29, 0x92, 0xc1, 0x4a, 0xc7, 0x37, 0x68, 0x59, - 0x1a, 0x39, 0xc8, 0xf4, 0xba, 0x92, 0x54, 0x97, 0x0b, 0x81, 0x97, 0x7b, 0x96, 0x43, 0x09, 0x35, - 0xb4, 0xc2, 0x04, 0x17, 0x38, 0xa1, 0x86, 0x56, 0x90, 0xde, 0x5b, 0xb0, 0xa1, 0xaa, 0x7c, 0xcd, - 0xba, 0xaa, 0xf8, 0x77, 0x2c, 0x57, 0x14, 0x62, 0xc9, 0x52, 0xd5, 0x23, 0x0e, 0xf0, 0x39, 0xee, - 0xa2, 0xcf, 0xe0, 0xed, 0x69, 0xb2, 0xa2, 0x86, 0xeb, 0x73, 0xab, 0x9c, 0x35, 0xbd, 0x05, 0x1b, - 0xf6, 0xe9, 0xbc, 0x21, 0x8a, 0xcd, 0x68, 0x9f, 0xce, 0x9a, 0xdd, 0x86, 0x4d, 0x7b, 0x64, 0xcf, - 0xdb, 0x5d, 0x8d, 0xda, 0x21, 0x7b, 0x64, 0xcf, 0x1a, 0x5e, 0x62, 0x17, 0x6e, 0x87, 0xa8, 0xd8, - 0x23, 0x9a, 0x78, 0x2e, 0x0a, 0x8f, 0x28, 0xd0, 0x75, 0x10, 0x54, 0x55, 0x21, 0x26, 0x3e, 0x31, - 0x88, 0x82, 0x1d, 0x62, 0x62, 0x57, 0xbc, 0x10, 0x05, 0x97, 0x54, 0x55, 0x62, 0xda, 0x2a, 0x53, - 0xa2, 0xab, 0xb0, 0x6e, 0x9d, 0x3c, 0x52, 0x39, 0x25, 0x15, 0xdb, 0x21, 0x03, 0xfd, 0x99, 0xf8, - 0x21, 0xcb, 0xef, 0x1a, 0x55, 0x30, 0x42, 0x76, 0x99, 0x18, 0x5d, 0x01, 0x41, 0x75, 0x47, 0xd8, - 0xb1, 0x59, 0x4d, 0x76, 0x6d, 0xac, 0x12, 0xf1, 0x12, 0x87, 0x72, 0x79, 0x3b, 0x10, 0xd3, 0x2d, - 0xe1, 0x3e, 0xd5, 0x07, 0x5e, 0xe0, 0xf1, 0x32, 0xdf, 0x12, 0x4c, 0xe6, 0x7b, 0xdb, 0x05, 0x81, - 0xa6, 0x22, 0x36, 0xf1, 0x2e, 0x83, 0x95, 0xec, 0x91, 0x1d, 0x9d, 0xf7, 0x03, 0x58, 0xa5, 0xc8, - 0xe9, 0xa4, 0x57, 0x78, 0x43, 0x66, 0x8f, 0x22, 0x33, 0xde, 0x84, 0x2d, 0x0a, 0x1a, 0x13, 0x0f, - 0x6b, 0xd8, 0xc3, 0x11, 0xf4, 0xc7, 0x0c, 0x4d, 0xf3, 0xde, 0xf2, 0x95, 0xb1, 0x38, 0x9d, 0xc9, - 0xc9, 0x69, 0xc8, 0xac, 0x4f, 0x78, 0x9c, 0x54, 0x16, 0x70, 0xeb, 0xb5, 0x35, 0xdd, 0xe5, 0x03, - 0x28, 0x46, 0x89, 0x8f, 0xf2, 0xc0, 0xa9, 0x2f, 0x24, 0x68, 0x17, 0x54, 0xeb, 0xd4, 0x69, 0xff, - 0xf2, 0x95, 0x24, 0x24, 0x69, 0x1f, 0xd5, 0x6c, 0xf4, 0x25, 0x45, 0x3e, 0x6e, 0xf7, 0x1b, 0x2d, - 0x49, 0x48, 0x45, 0x1b, 0xf6, 0xbf, 0x26, 0xa1, 0x14, 0xbf, 0x7b, 0xa1, 0x1f, 0xc0, 0xb9, 0xe0, - 0xa1, 0xc4, 0x25, 0x9e, 0xf2, 0x54, 0x77, 0xd8, 0x5e, 0x1c, 0x63, 0x7e, 0x2e, 0x86, 0x6c, 0xd8, - 0xf4, 0x51, 0x3d, 0xe2, 0x7d, 0xa9, 0x3b, 0x74, 0xa7, 0x8d, 0xb1, 0x87, 0x9a, 0x70, 0xc1, 0xb4, - 0x14, 0xd7, 0xc3, 0xa6, 0x86, 0x1d, 0x4d, 0x99, 0x3e, 0x51, 0x29, 0x58, 0x55, 0x89, 0xeb, 0x5a, - 0xfc, 0x0c, 0x0c, 0xbd, 0xbc, 0x6b, 0x5a, 0x3d, 0x1f, 0x3c, 0x3d, 0x1c, 0xaa, 0x3e, 0x74, 0x86, - 0xb9, 0xa9, 0x65, 0xcc, 0x7d, 0x07, 0xf2, 0x63, 0x6c, 0x2b, 0xc4, 0xf4, 0x9c, 0x53, 0xd6, 0x71, - 0xe7, 0xe4, 0xdc, 0x18, 0xdb, 0x12, 0x1d, 0xbf, 0x99, 0x8b, 0xcf, 0x3f, 0x52, 0x50, 0x8c, 0x76, - 0xdd, 0xf4, 0x12, 0xa3, 0xb2, 0x03, 0x2a, 0xc1, 0x4a, 0xd8, 0x07, 0x2f, 0xed, 0xd1, 0x2b, 0x35, - 0x7a, 0x72, 0x1d, 0x64, 0x79, 0x2f, 0x2c, 0x73, 0x4b, 0xda, 0x35, 0x50, 0x6a, 0x11, 0xde, 0x7b, - 0xe4, 0x64, 0x7f, 0x84, 0x8e, 0x20, 0xfb, 0xc8, 0x65, 0xbe, 0xb3, 0xcc, 0xf7, 0x87, 0x2f, 0xf7, - 0x7d, 0xbf, 0xc7, 0x9c, 0xe7, 0xef, 0xf7, 0x94, 0x76, 0x47, 0x6e, 0x55, 0x9b, 0xb2, 0x6f, 0x8e, - 0xce, 0x43, 0xda, 0xc0, 0xcf, 0x4f, 0xe3, 0x67, 0x1c, 0x13, 0x9d, 0x35, 0xf1, 0xe7, 0x21, 0xfd, - 0x94, 0xe0, 0xc7, 0xf1, 0x93, 0x85, 0x89, 0x5e, 0x23, 0xf5, 0xaf, 0x43, 0x86, 0xe5, 0x0b, 0x01, - 0xf8, 0x19, 0x13, 0xde, 0x42, 0x39, 0x48, 0xd7, 0x3a, 0x32, 0xa5, 0xbf, 0x00, 0x45, 0x2e, 0x55, - 0xba, 0x0d, 0xa9, 0x26, 0x09, 0xc9, 0xf2, 0x2d, 0xc8, 0xf2, 0x24, 0xd0, 0xad, 0x11, 0xa6, 0x41, - 0x78, 0xcb, 0x1f, 0xfa, 0x3e, 0x12, 0x81, 0xf6, 0xb8, 0x75, 0x28, 0xc9, 0x42, 0x32, 0xfa, 0x79, - 0x5d, 0x28, 0x46, 0x1b, 0xee, 0x37, 0xc3, 0xa9, 0xbf, 0x24, 0xa0, 0x10, 0x69, 0xa0, 0x69, 0xe7, - 0x83, 0x0d, 0xc3, 0x7a, 0xaa, 0x60, 0x43, 0xc7, 0xae, 0x4f, 0x0a, 0x60, 0xa2, 0x2a, 0x95, 0x9c, - 0xf5, 0xa3, 0xbd, 0x91, 0xe0, 0x7f, 0x9f, 0x00, 0x61, 0xb6, 0x77, 0x9d, 0x09, 0x30, 0xf1, 0xbd, - 0x06, 0xf8, 0xbb, 0x04, 0x94, 0xe2, 0x0d, 0xeb, 0x4c, 0x78, 0x17, 0xbf, 0xd7, 0xf0, 0xfe, 0x99, - 0x84, 0xd5, 0x58, 0x9b, 0x7a, 0xd6, 0xe8, 0xbe, 0x86, 0x75, 0x5d, 0x23, 0x63, 0xdb, 0xf2, 0x88, - 0xa9, 0x9e, 0x2a, 0x06, 0x79, 0x42, 0x0c, 0xb1, 0xcc, 0x0a, 0xc5, 0xf5, 0x97, 0x37, 0xc2, 0x95, - 0xc6, 0xd4, 0xae, 0x49, 0xcd, 0x0e, 0x36, 0x1a, 0x75, 0xa9, 0xd5, 0xed, 0xf4, 0xa5, 0x76, 0xed, - 0xa1, 0x72, 0xdc, 0xfe, 0x71, 0xbb, 0xf3, 0x65, 0x5b, 0x16, 0xf4, 0x19, 0xd8, 0x6b, 0xdc, 0xea, - 0x5d, 0x10, 0x66, 0x83, 0x42, 0xe7, 0x60, 0x51, 0x58, 0xc2, 0x5b, 0x68, 0x03, 0xd6, 0xda, 0x1d, - 0xa5, 0xd7, 0xa8, 0x4b, 0x8a, 0x74, 0xef, 0x9e, 0x54, 0xeb, 0xf7, 0xf8, 0xd3, 0x46, 0x88, 0xee, - 0xc7, 0x37, 0xf5, 0x6f, 0x53, 0xb0, 0xb1, 0x20, 0x12, 0x54, 0xf5, 0x2f, 0x25, 0xfc, 0x9e, 0xf4, - 0xc9, 0x59, 0xa2, 0xaf, 0xd0, 0xae, 0xa0, 0x8b, 0x1d, 0xcf, 0xbf, 0xc3, 0x5c, 0x01, 0x9a, 0x25, - 0xd3, 0xd3, 0x07, 0x3a, 0x71, 0xfc, 0x97, 0x20, 0x7e, 0x53, 0x59, 0x9b, 0xca, 0xf9, 0x63, 0xd0, - 0xc7, 0x80, 0x6c, 0xcb, 0xd5, 0x3d, 0xfd, 0x09, 0x51, 0x74, 0x33, 0x78, 0x36, 0xa2, 0x37, 0x97, - 0xb4, 0x2c, 0x04, 0x9a, 0x86, 0xe9, 0x85, 0x68, 0x93, 0x0c, 0xf1, 0x0c, 0x9a, 0x16, 0xf0, 0x94, - 0x2c, 0x04, 0x9a, 0x10, 0x7d, 0x11, 0x8a, 0x9a, 0x35, 0xa1, 0xed, 0x1c, 0xc7, 0xd1, 0xf3, 0x22, - 0x21, 0x17, 0xb8, 0x2c, 0x84, 0xf8, 0x8d, 0xfa, 0xf4, 0xbd, 0xaa, 0x28, 0x17, 0xb8, 0x8c, 0x43, - 0x2e, 0xc3, 0x1a, 0x1e, 0x0e, 0x1d, 0xea, 0x3c, 0x70, 0xc4, 0xaf, 0x1e, 0xa5, 0x50, 0xcc, 0x80, - 0xdb, 0xf7, 0x21, 0x17, 0xe4, 0x81, 0x1e, 0xc9, 0x34, 0x13, 0x8a, 0xcd, 0xef, 0xd3, 0xc9, 0xdd, - 0xbc, 0x9c, 0x33, 0x03, 0xe5, 0x45, 0x28, 0xea, 0xae, 0x32, 0x7d, 0x7e, 0x4f, 0xee, 0x24, 0x77, - 0x73, 0x72, 0x41, 0x77, 0xc3, 0xa7, 0xcb, 0xf2, 0x37, 0x49, 0x28, 0xc5, 0x7f, 0x3e, 0x40, 0x75, - 0xc8, 0x19, 0x96, 0x8a, 0x19, 0xb5, 0xf8, 0x6f, 0x57, 0xbb, 0xaf, 0xf8, 0xc5, 0xa1, 0xd2, 0xf4, - 0xf1, 0x72, 0x68, 0xb9, 0xfd, 0xb7, 0x04, 0xe4, 0x02, 0x31, 0xda, 0x82, 0xb4, 0x8d, 0xbd, 0x11, - 0x73, 0x97, 0x39, 0x4c, 0x0a, 0x09, 0x99, 0x8d, 0xa9, 0xdc, 0xb5, 0xb1, 0xc9, 0x28, 0xe0, 0xcb, - 0xe9, 0x98, 0x7e, 0x57, 0x83, 0x60, 0x8d, 0xdd, 0x6b, 0xac, 0xf1, 0x98, 0x98, 0x9e, 0x1b, 0x7c, - 0x57, 0x5f, 0x5e, 0xf3, 0xc5, 0xe8, 0x1a, 0xac, 0x7b, 0x0e, 0xd6, 0x8d, 0x18, 0x36, 0xcd, 0xb0, - 0x42, 0xa0, 0x08, 0xc1, 0x07, 0x70, 0x3e, 0xf0, 0xab, 0x11, 0x0f, 0xab, 0x23, 0xa2, 0x4d, 0x8d, - 0xb2, 0xec, 0xfd, 0xe2, 0x9c, 0x0f, 0xa8, 0xfb, 0xfa, 0xc0, 0xb6, 0xfc, 0xf7, 0x04, 0xac, 0x07, - 0x37, 0x31, 0x2d, 0x4c, 0x56, 0x0b, 0x00, 0x9b, 0xa6, 0xe5, 0x45, 0xd3, 0x35, 0x4f, 0xe5, 0x39, - 0xbb, 0x4a, 0x35, 0x34, 0x92, 0x23, 0x0e, 0xb6, 0xc7, 0x00, 0x53, 0xcd, 0xd2, 0xb4, 0x5d, 0x80, - 0x82, 0xff, 0xdb, 0x10, 0xfb, 0x81, 0x91, 0xdf, 0xdd, 0x81, 0x8b, 0xe8, 0x95, 0x0d, 0x6d, 0x42, - 0xe6, 0x84, 0x0c, 0x75, 0xd3, 0x7f, 0xf1, 0xe5, 0x83, 0xe0, 0x85, 0x25, 0x1d, 0xbe, 0xb0, 0x1c, - 0xfe, 0x0c, 0x36, 0x54, 0x6b, 0x3c, 0x1b, 0xee, 0xa1, 0x30, 0xf3, 0x7e, 0xe0, 0x7e, 0x91, 0xf8, - 0x0a, 0xa6, 0x2d, 0xe6, 0xff, 0x12, 0x89, 0x3f, 0x24, 0x53, 0x47, 0xdd, 0xc3, 0x3f, 0x26, 0xb7, - 0x8f, 0xb8, 0x69, 0x37, 0x58, 0xa9, 0x4c, 0x06, 0x06, 0x51, 0x69, 0xf4, 0xff, 0x0f, 0x00, 0x00, - 0xff, 0xff, 0x88, 0x17, 0xc1, 0xbe, 0x38, 0x1d, 0x00, 0x00, -} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go deleted file mode 100644 index 165b2110df..0000000000 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go +++ /dev/null @@ -1,752 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: descriptor.proto - -package descriptor - -import ( - fmt "fmt" - github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" - proto "github.com/gogo/protobuf/proto" - math "math" - reflect "reflect" - sort "sort" - strconv "strconv" - strings "strings" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -func (this *FileDescriptorSet) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&descriptor.FileDescriptorSet{") - if this.File != nil { - s = append(s, "File: "+fmt.Sprintf("%#v", this.File)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *FileDescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 16) - s = append(s, "&descriptor.FileDescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.Package != nil { - s = append(s, "Package: "+valueToGoStringDescriptor(this.Package, "string")+",\n") - } - if this.Dependency != nil { - s = append(s, "Dependency: "+fmt.Sprintf("%#v", this.Dependency)+",\n") - } - if this.PublicDependency != nil { - s = append(s, "PublicDependency: "+fmt.Sprintf("%#v", this.PublicDependency)+",\n") - } - if this.WeakDependency != nil { - s = append(s, "WeakDependency: "+fmt.Sprintf("%#v", this.WeakDependency)+",\n") - } - if this.MessageType != nil { - s = append(s, "MessageType: "+fmt.Sprintf("%#v", this.MessageType)+",\n") - } - if this.EnumType != nil { - s = append(s, "EnumType: "+fmt.Sprintf("%#v", this.EnumType)+",\n") - } - if this.Service != nil { - s = append(s, "Service: "+fmt.Sprintf("%#v", this.Service)+",\n") - } - if this.Extension != nil { - s = append(s, "Extension: "+fmt.Sprintf("%#v", this.Extension)+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.SourceCodeInfo != nil { - s = append(s, "SourceCodeInfo: "+fmt.Sprintf("%#v", this.SourceCodeInfo)+",\n") - } - if this.Syntax != nil { - s = append(s, "Syntax: "+valueToGoStringDescriptor(this.Syntax, "string")+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *DescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 14) - s = append(s, "&descriptor.DescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.Field != nil { - s = append(s, "Field: "+fmt.Sprintf("%#v", this.Field)+",\n") - } - if this.Extension != nil { - s = append(s, "Extension: "+fmt.Sprintf("%#v", this.Extension)+",\n") - } - if this.NestedType != nil { - s = append(s, "NestedType: "+fmt.Sprintf("%#v", this.NestedType)+",\n") - } - if this.EnumType != nil { - s = append(s, "EnumType: "+fmt.Sprintf("%#v", this.EnumType)+",\n") - } - if this.ExtensionRange != nil { - s = append(s, "ExtensionRange: "+fmt.Sprintf("%#v", this.ExtensionRange)+",\n") - } - if this.OneofDecl != nil { - s = append(s, "OneofDecl: "+fmt.Sprintf("%#v", this.OneofDecl)+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.ReservedRange != nil { - s = append(s, "ReservedRange: "+fmt.Sprintf("%#v", this.ReservedRange)+",\n") - } - if this.ReservedName != nil { - s = append(s, "ReservedName: "+fmt.Sprintf("%#v", this.ReservedName)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *DescriptorProto_ExtensionRange) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&descriptor.DescriptorProto_ExtensionRange{") - if this.Start != nil { - s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n") - } - if this.End != nil { - s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *DescriptorProto_ReservedRange) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&descriptor.DescriptorProto_ReservedRange{") - if this.Start != nil { - s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n") - } - if this.End != nil { - s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *ExtensionRangeOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&descriptor.ExtensionRangeOptions{") - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *FieldDescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 14) - s = append(s, "&descriptor.FieldDescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.Number != nil { - s = append(s, "Number: "+valueToGoStringDescriptor(this.Number, "int32")+",\n") - } - if this.Label != nil { - s = append(s, "Label: "+valueToGoStringDescriptor(this.Label, "FieldDescriptorProto_Label")+",\n") - } - if this.Type != nil { - s = append(s, "Type: "+valueToGoStringDescriptor(this.Type, "FieldDescriptorProto_Type")+",\n") - } - if this.TypeName != nil { - s = append(s, "TypeName: "+valueToGoStringDescriptor(this.TypeName, "string")+",\n") - } - if this.Extendee != nil { - s = append(s, "Extendee: "+valueToGoStringDescriptor(this.Extendee, "string")+",\n") - } - if this.DefaultValue != nil { - s = append(s, "DefaultValue: "+valueToGoStringDescriptor(this.DefaultValue, "string")+",\n") - } - if this.OneofIndex != nil { - s = append(s, "OneofIndex: "+valueToGoStringDescriptor(this.OneofIndex, "int32")+",\n") - } - if this.JsonName != nil { - s = append(s, "JsonName: "+valueToGoStringDescriptor(this.JsonName, "string")+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *OneofDescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&descriptor.OneofDescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *EnumDescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 9) - s = append(s, "&descriptor.EnumDescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.Value != nil { - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.ReservedRange != nil { - s = append(s, "ReservedRange: "+fmt.Sprintf("%#v", this.ReservedRange)+",\n") - } - if this.ReservedName != nil { - s = append(s, "ReservedName: "+fmt.Sprintf("%#v", this.ReservedName)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *EnumDescriptorProto_EnumReservedRange) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&descriptor.EnumDescriptorProto_EnumReservedRange{") - if this.Start != nil { - s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n") - } - if this.End != nil { - s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *EnumValueDescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&descriptor.EnumValueDescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.Number != nil { - s = append(s, "Number: "+valueToGoStringDescriptor(this.Number, "int32")+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *ServiceDescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&descriptor.ServiceDescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.Method != nil { - s = append(s, "Method: "+fmt.Sprintf("%#v", this.Method)+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *MethodDescriptorProto) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 10) - s = append(s, "&descriptor.MethodDescriptorProto{") - if this.Name != nil { - s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") - } - if this.InputType != nil { - s = append(s, "InputType: "+valueToGoStringDescriptor(this.InputType, "string")+",\n") - } - if this.OutputType != nil { - s = append(s, "OutputType: "+valueToGoStringDescriptor(this.OutputType, "string")+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.ClientStreaming != nil { - s = append(s, "ClientStreaming: "+valueToGoStringDescriptor(this.ClientStreaming, "bool")+",\n") - } - if this.ServerStreaming != nil { - s = append(s, "ServerStreaming: "+valueToGoStringDescriptor(this.ServerStreaming, "bool")+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *FileOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 25) - s = append(s, "&descriptor.FileOptions{") - if this.JavaPackage != nil { - s = append(s, "JavaPackage: "+valueToGoStringDescriptor(this.JavaPackage, "string")+",\n") - } - if this.JavaOuterClassname != nil { - s = append(s, "JavaOuterClassname: "+valueToGoStringDescriptor(this.JavaOuterClassname, "string")+",\n") - } - if this.JavaMultipleFiles != nil { - s = append(s, "JavaMultipleFiles: "+valueToGoStringDescriptor(this.JavaMultipleFiles, "bool")+",\n") - } - if this.JavaGenerateEqualsAndHash != nil { - s = append(s, "JavaGenerateEqualsAndHash: "+valueToGoStringDescriptor(this.JavaGenerateEqualsAndHash, "bool")+",\n") - } - if this.JavaStringCheckUtf8 != nil { - s = append(s, "JavaStringCheckUtf8: "+valueToGoStringDescriptor(this.JavaStringCheckUtf8, "bool")+",\n") - } - if this.OptimizeFor != nil { - s = append(s, "OptimizeFor: "+valueToGoStringDescriptor(this.OptimizeFor, "FileOptions_OptimizeMode")+",\n") - } - if this.GoPackage != nil { - s = append(s, "GoPackage: "+valueToGoStringDescriptor(this.GoPackage, "string")+",\n") - } - if this.CcGenericServices != nil { - s = append(s, "CcGenericServices: "+valueToGoStringDescriptor(this.CcGenericServices, "bool")+",\n") - } - if this.JavaGenericServices != nil { - s = append(s, "JavaGenericServices: "+valueToGoStringDescriptor(this.JavaGenericServices, "bool")+",\n") - } - if this.PyGenericServices != nil { - s = append(s, "PyGenericServices: "+valueToGoStringDescriptor(this.PyGenericServices, "bool")+",\n") - } - if this.PhpGenericServices != nil { - s = append(s, "PhpGenericServices: "+valueToGoStringDescriptor(this.PhpGenericServices, "bool")+",\n") - } - if this.Deprecated != nil { - s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") - } - if this.CcEnableArenas != nil { - s = append(s, "CcEnableArenas: "+valueToGoStringDescriptor(this.CcEnableArenas, "bool")+",\n") - } - if this.ObjcClassPrefix != nil { - s = append(s, "ObjcClassPrefix: "+valueToGoStringDescriptor(this.ObjcClassPrefix, "string")+",\n") - } - if this.CsharpNamespace != nil { - s = append(s, "CsharpNamespace: "+valueToGoStringDescriptor(this.CsharpNamespace, "string")+",\n") - } - if this.SwiftPrefix != nil { - s = append(s, "SwiftPrefix: "+valueToGoStringDescriptor(this.SwiftPrefix, "string")+",\n") - } - if this.PhpClassPrefix != nil { - s = append(s, "PhpClassPrefix: "+valueToGoStringDescriptor(this.PhpClassPrefix, "string")+",\n") - } - if this.PhpNamespace != nil { - s = append(s, "PhpNamespace: "+valueToGoStringDescriptor(this.PhpNamespace, "string")+",\n") - } - if this.PhpMetadataNamespace != nil { - s = append(s, "PhpMetadataNamespace: "+valueToGoStringDescriptor(this.PhpMetadataNamespace, "string")+",\n") - } - if this.RubyPackage != nil { - s = append(s, "RubyPackage: "+valueToGoStringDescriptor(this.RubyPackage, "string")+",\n") - } - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *MessageOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 9) - s = append(s, "&descriptor.MessageOptions{") - if this.MessageSetWireFormat != nil { - s = append(s, "MessageSetWireFormat: "+valueToGoStringDescriptor(this.MessageSetWireFormat, "bool")+",\n") - } - if this.NoStandardDescriptorAccessor != nil { - s = append(s, "NoStandardDescriptorAccessor: "+valueToGoStringDescriptor(this.NoStandardDescriptorAccessor, "bool")+",\n") - } - if this.Deprecated != nil { - s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") - } - if this.MapEntry != nil { - s = append(s, "MapEntry: "+valueToGoStringDescriptor(this.MapEntry, "bool")+",\n") - } - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *FieldOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 11) - s = append(s, "&descriptor.FieldOptions{") - if this.Ctype != nil { - s = append(s, "Ctype: "+valueToGoStringDescriptor(this.Ctype, "FieldOptions_CType")+",\n") - } - if this.Packed != nil { - s = append(s, "Packed: "+valueToGoStringDescriptor(this.Packed, "bool")+",\n") - } - if this.Jstype != nil { - s = append(s, "Jstype: "+valueToGoStringDescriptor(this.Jstype, "FieldOptions_JSType")+",\n") - } - if this.Lazy != nil { - s = append(s, "Lazy: "+valueToGoStringDescriptor(this.Lazy, "bool")+",\n") - } - if this.Deprecated != nil { - s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") - } - if this.Weak != nil { - s = append(s, "Weak: "+valueToGoStringDescriptor(this.Weak, "bool")+",\n") - } - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *OneofOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&descriptor.OneofOptions{") - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *EnumOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&descriptor.EnumOptions{") - if this.AllowAlias != nil { - s = append(s, "AllowAlias: "+valueToGoStringDescriptor(this.AllowAlias, "bool")+",\n") - } - if this.Deprecated != nil { - s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") - } - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *EnumValueOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&descriptor.EnumValueOptions{") - if this.Deprecated != nil { - s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") - } - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *ServiceOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&descriptor.ServiceOptions{") - if this.Deprecated != nil { - s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") - } - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *MethodOptions) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&descriptor.MethodOptions{") - if this.Deprecated != nil { - s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") - } - if this.IdempotencyLevel != nil { - s = append(s, "IdempotencyLevel: "+valueToGoStringDescriptor(this.IdempotencyLevel, "MethodOptions_IdempotencyLevel")+",\n") - } - if this.UninterpretedOption != nil { - s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") - } - s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *UninterpretedOption) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 11) - s = append(s, "&descriptor.UninterpretedOption{") - if this.Name != nil { - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - } - if this.IdentifierValue != nil { - s = append(s, "IdentifierValue: "+valueToGoStringDescriptor(this.IdentifierValue, "string")+",\n") - } - if this.PositiveIntValue != nil { - s = append(s, "PositiveIntValue: "+valueToGoStringDescriptor(this.PositiveIntValue, "uint64")+",\n") - } - if this.NegativeIntValue != nil { - s = append(s, "NegativeIntValue: "+valueToGoStringDescriptor(this.NegativeIntValue, "int64")+",\n") - } - if this.DoubleValue != nil { - s = append(s, "DoubleValue: "+valueToGoStringDescriptor(this.DoubleValue, "float64")+",\n") - } - if this.StringValue != nil { - s = append(s, "StringValue: "+valueToGoStringDescriptor(this.StringValue, "byte")+",\n") - } - if this.AggregateValue != nil { - s = append(s, "AggregateValue: "+valueToGoStringDescriptor(this.AggregateValue, "string")+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *UninterpretedOption_NamePart) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&descriptor.UninterpretedOption_NamePart{") - if this.NamePart != nil { - s = append(s, "NamePart: "+valueToGoStringDescriptor(this.NamePart, "string")+",\n") - } - if this.IsExtension != nil { - s = append(s, "IsExtension: "+valueToGoStringDescriptor(this.IsExtension, "bool")+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *SourceCodeInfo) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&descriptor.SourceCodeInfo{") - if this.Location != nil { - s = append(s, "Location: "+fmt.Sprintf("%#v", this.Location)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *SourceCodeInfo_Location) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 9) - s = append(s, "&descriptor.SourceCodeInfo_Location{") - if this.Path != nil { - s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") - } - if this.Span != nil { - s = append(s, "Span: "+fmt.Sprintf("%#v", this.Span)+",\n") - } - if this.LeadingComments != nil { - s = append(s, "LeadingComments: "+valueToGoStringDescriptor(this.LeadingComments, "string")+",\n") - } - if this.TrailingComments != nil { - s = append(s, "TrailingComments: "+valueToGoStringDescriptor(this.TrailingComments, "string")+",\n") - } - if this.LeadingDetachedComments != nil { - s = append(s, "LeadingDetachedComments: "+fmt.Sprintf("%#v", this.LeadingDetachedComments)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *GeneratedCodeInfo) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&descriptor.GeneratedCodeInfo{") - if this.Annotation != nil { - s = append(s, "Annotation: "+fmt.Sprintf("%#v", this.Annotation)+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func (this *GeneratedCodeInfo_Annotation) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 8) - s = append(s, "&descriptor.GeneratedCodeInfo_Annotation{") - if this.Path != nil { - s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") - } - if this.SourceFile != nil { - s = append(s, "SourceFile: "+valueToGoStringDescriptor(this.SourceFile, "string")+",\n") - } - if this.Begin != nil { - s = append(s, "Begin: "+valueToGoStringDescriptor(this.Begin, "int32")+",\n") - } - if this.End != nil { - s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") - } - if this.XXX_unrecognized != nil { - s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") - } - s = append(s, "}") - return strings.Join(s, "") -} -func valueToGoStringDescriptor(v interface{}, typ string) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) -} -func extensionToGoStringDescriptor(m github_com_gogo_protobuf_proto.Message) string { - e := github_com_gogo_protobuf_proto.GetUnsafeExtensionsMap(m) - if e == nil { - return "nil" - } - s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{" - keys := make([]int, 0, len(e)) - for k := range e { - keys = append(keys, int(k)) - } - sort.Ints(keys) - ss := []string{} - for _, k := range keys { - ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString()) - } - s += strings.Join(ss, ",") + "})" - return s -} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go deleted file mode 100644 index e0846a357d..0000000000 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go +++ /dev/null @@ -1,390 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// 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. -// -// 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 descriptor - -import ( - "strings" -) - -func (msg *DescriptorProto) GetMapFields() (*FieldDescriptorProto, *FieldDescriptorProto) { - if !msg.GetOptions().GetMapEntry() { - return nil, nil - } - return msg.GetField()[0], msg.GetField()[1] -} - -func dotToUnderscore(r rune) rune { - if r == '.' { - return '_' - } - return r -} - -func (field *FieldDescriptorProto) WireType() (wire int) { - switch *field.Type { - case FieldDescriptorProto_TYPE_DOUBLE: - return 1 - case FieldDescriptorProto_TYPE_FLOAT: - return 5 - case FieldDescriptorProto_TYPE_INT64: - return 0 - case FieldDescriptorProto_TYPE_UINT64: - return 0 - case FieldDescriptorProto_TYPE_INT32: - return 0 - case FieldDescriptorProto_TYPE_UINT32: - return 0 - case FieldDescriptorProto_TYPE_FIXED64: - return 1 - case FieldDescriptorProto_TYPE_FIXED32: - return 5 - case FieldDescriptorProto_TYPE_BOOL: - return 0 - case FieldDescriptorProto_TYPE_STRING: - return 2 - case FieldDescriptorProto_TYPE_GROUP: - return 2 - case FieldDescriptorProto_TYPE_MESSAGE: - return 2 - case FieldDescriptorProto_TYPE_BYTES: - return 2 - case FieldDescriptorProto_TYPE_ENUM: - return 0 - case FieldDescriptorProto_TYPE_SFIXED32: - return 5 - case FieldDescriptorProto_TYPE_SFIXED64: - return 1 - case FieldDescriptorProto_TYPE_SINT32: - return 0 - case FieldDescriptorProto_TYPE_SINT64: - return 0 - } - panic("unreachable") -} - -func (field *FieldDescriptorProto) GetKeyUint64() (x uint64) { - packed := field.IsPacked() - wireType := field.WireType() - fieldNumber := field.GetNumber() - if packed { - wireType = 2 - } - x = uint64(uint32(fieldNumber)<<3 | uint32(wireType)) - return x -} - -func (field *FieldDescriptorProto) GetKey3Uint64() (x uint64) { - packed := field.IsPacked3() - wireType := field.WireType() - fieldNumber := field.GetNumber() - if packed { - wireType = 2 - } - x = uint64(uint32(fieldNumber)<<3 | uint32(wireType)) - return x -} - -func (field *FieldDescriptorProto) GetKey() []byte { - x := field.GetKeyUint64() - i := 0 - keybuf := make([]byte, 0) - for i = 0; x > 127; i++ { - keybuf = append(keybuf, 0x80|uint8(x&0x7F)) - x >>= 7 - } - keybuf = append(keybuf, uint8(x)) - return keybuf -} - -func (field *FieldDescriptorProto) GetKey3() []byte { - x := field.GetKey3Uint64() - i := 0 - keybuf := make([]byte, 0) - for i = 0; x > 127; i++ { - keybuf = append(keybuf, 0x80|uint8(x&0x7F)) - x >>= 7 - } - keybuf = append(keybuf, uint8(x)) - return keybuf -} - -func (desc *FileDescriptorSet) GetField(packageName, messageName, fieldName string) *FieldDescriptorProto { - msg := desc.GetMessage(packageName, messageName) - if msg == nil { - return nil - } - for _, field := range msg.GetField() { - if field.GetName() == fieldName { - return field - } - } - return nil -} - -func (file *FileDescriptorProto) GetMessage(typeName string) *DescriptorProto { - for _, msg := range file.GetMessageType() { - if msg.GetName() == typeName { - return msg - } - nes := file.GetNestedMessage(msg, strings.TrimPrefix(typeName, msg.GetName()+".")) - if nes != nil { - return nes - } - } - return nil -} - -func (file *FileDescriptorProto) GetNestedMessage(msg *DescriptorProto, typeName string) *DescriptorProto { - for _, nes := range msg.GetNestedType() { - if nes.GetName() == typeName { - return nes - } - res := file.GetNestedMessage(nes, strings.TrimPrefix(typeName, nes.GetName()+".")) - if res != nil { - return res - } - } - return nil -} - -func (desc *FileDescriptorSet) GetMessage(packageName string, typeName string) *DescriptorProto { - for _, file := range desc.GetFile() { - if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) { - continue - } - for _, msg := range file.GetMessageType() { - if msg.GetName() == typeName { - return msg - } - } - for _, msg := range file.GetMessageType() { - for _, nes := range msg.GetNestedType() { - if nes.GetName() == typeName { - return nes - } - if msg.GetName()+"."+nes.GetName() == typeName { - return nes - } - } - } - } - return nil -} - -func (desc *FileDescriptorSet) IsProto3(packageName string, typeName string) bool { - for _, file := range desc.GetFile() { - if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) { - continue - } - for _, msg := range file.GetMessageType() { - if msg.GetName() == typeName { - return file.GetSyntax() == "proto3" - } - } - for _, msg := range file.GetMessageType() { - for _, nes := range msg.GetNestedType() { - if nes.GetName() == typeName { - return file.GetSyntax() == "proto3" - } - if msg.GetName()+"."+nes.GetName() == typeName { - return file.GetSyntax() == "proto3" - } - } - } - } - return false -} - -func (msg *DescriptorProto) IsExtendable() bool { - return len(msg.GetExtensionRange()) > 0 -} - -func (desc *FileDescriptorSet) FindExtension(packageName string, typeName string, fieldName string) (extPackageName string, field *FieldDescriptorProto) { - parent := desc.GetMessage(packageName, typeName) - if parent == nil { - return "", nil - } - if !parent.IsExtendable() { - return "", nil - } - extendee := "." + packageName + "." + typeName - for _, file := range desc.GetFile() { - for _, ext := range file.GetExtension() { - if strings.Map(dotToUnderscore, file.GetPackage()) == strings.Map(dotToUnderscore, packageName) { - if !(ext.GetExtendee() == typeName || ext.GetExtendee() == extendee) { - continue - } - } else { - if ext.GetExtendee() != extendee { - continue - } - } - if ext.GetName() == fieldName { - return file.GetPackage(), ext - } - } - } - return "", nil -} - -func (desc *FileDescriptorSet) FindExtensionByFieldNumber(packageName string, typeName string, fieldNum int32) (extPackageName string, field *FieldDescriptorProto) { - parent := desc.GetMessage(packageName, typeName) - if parent == nil { - return "", nil - } - if !parent.IsExtendable() { - return "", nil - } - extendee := "." + packageName + "." + typeName - for _, file := range desc.GetFile() { - for _, ext := range file.GetExtension() { - if strings.Map(dotToUnderscore, file.GetPackage()) == strings.Map(dotToUnderscore, packageName) { - if !(ext.GetExtendee() == typeName || ext.GetExtendee() == extendee) { - continue - } - } else { - if ext.GetExtendee() != extendee { - continue - } - } - if ext.GetNumber() == fieldNum { - return file.GetPackage(), ext - } - } - } - return "", nil -} - -func (desc *FileDescriptorSet) FindMessage(packageName string, typeName string, fieldName string) (msgPackageName string, msgName string) { - parent := desc.GetMessage(packageName, typeName) - if parent == nil { - return "", "" - } - field := parent.GetFieldDescriptor(fieldName) - if field == nil { - var extPackageName string - extPackageName, field = desc.FindExtension(packageName, typeName, fieldName) - if field == nil { - return "", "" - } - packageName = extPackageName - } - typeNames := strings.Split(field.GetTypeName(), ".") - if len(typeNames) == 1 { - msg := desc.GetMessage(packageName, typeName) - if msg == nil { - return "", "" - } - return packageName, msg.GetName() - } - if len(typeNames) > 2 { - for i := 1; i < len(typeNames)-1; i++ { - packageName = strings.Join(typeNames[1:len(typeNames)-i], ".") - typeName = strings.Join(typeNames[len(typeNames)-i:], ".") - msg := desc.GetMessage(packageName, typeName) - if msg != nil { - typeNames := strings.Split(msg.GetName(), ".") - if len(typeNames) == 1 { - return packageName, msg.GetName() - } - return strings.Join(typeNames[1:len(typeNames)-1], "."), typeNames[len(typeNames)-1] - } - } - } - return "", "" -} - -func (msg *DescriptorProto) GetFieldDescriptor(fieldName string) *FieldDescriptorProto { - for _, field := range msg.GetField() { - if field.GetName() == fieldName { - return field - } - } - return nil -} - -func (desc *FileDescriptorSet) GetEnum(packageName string, typeName string) *EnumDescriptorProto { - for _, file := range desc.GetFile() { - if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) { - continue - } - for _, enum := range file.GetEnumType() { - if enum.GetName() == typeName { - return enum - } - } - } - return nil -} - -func (f *FieldDescriptorProto) IsEnum() bool { - return *f.Type == FieldDescriptorProto_TYPE_ENUM -} - -func (f *FieldDescriptorProto) IsMessage() bool { - return *f.Type == FieldDescriptorProto_TYPE_MESSAGE -} - -func (f *FieldDescriptorProto) IsBytes() bool { - return *f.Type == FieldDescriptorProto_TYPE_BYTES -} - -func (f *FieldDescriptorProto) IsRepeated() bool { - return f.Label != nil && *f.Label == FieldDescriptorProto_LABEL_REPEATED -} - -func (f *FieldDescriptorProto) IsString() bool { - return *f.Type == FieldDescriptorProto_TYPE_STRING -} - -func (f *FieldDescriptorProto) IsBool() bool { - return *f.Type == FieldDescriptorProto_TYPE_BOOL -} - -func (f *FieldDescriptorProto) IsRequired() bool { - return f.Label != nil && *f.Label == FieldDescriptorProto_LABEL_REQUIRED -} - -func (f *FieldDescriptorProto) IsPacked() bool { - return f.Options != nil && f.GetOptions().GetPacked() -} - -func (f *FieldDescriptorProto) IsPacked3() bool { - if f.IsRepeated() && f.IsScalar() { - if f.Options == nil || f.GetOptions().Packed == nil { - return true - } - return f.Options != nil && f.GetOptions().GetPacked() - } - return false -} - -func (m *DescriptorProto) HasExtension() bool { - return len(m.ExtensionRange) > 0 -} diff --git a/vendor/github.com/golang-jwt/jwt/v4/token.go b/vendor/github.com/golang-jwt/jwt/v4/token.go index 71e909ea65..786b275ce0 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/token.go +++ b/vendor/github.com/golang-jwt/jwt/v4/token.go @@ -14,6 +14,12 @@ import ( // To use the non-recommended decoding, set this boolean to `true` prior to using this package. var DecodePaddingAllowed bool +// DecodeStrict will switch the codec used for decoding JWTs into strict mode. +// In this mode, the decoder requires that trailing padding bits are zero, as described in RFC 4648 section 3.5. +// Note that this is a global variable, and updating it will change the behavior on a package level, and is also NOT go-routine safe. +// To use strict decoding, set this boolean to `true` prior to using this package. +var DecodeStrict bool + // TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). // You can override it to use another time value. This is useful for testing or if your // server uses a different time zone than your tokens. @@ -121,12 +127,17 @@ func EncodeSegment(seg []byte) string { // Deprecated: In a future release, we will demote this function to a non-exported function, since it // should only be used internally func DecodeSegment(seg string) ([]byte, error) { + encoding := base64.RawURLEncoding + if DecodePaddingAllowed { if l := len(seg) % 4; l > 0 { seg += strings.Repeat("=", 4-l) } - return base64.URLEncoding.DecodeString(seg) + encoding = base64.URLEncoding } - return base64.RawURLEncoding.DecodeString(seg) + if DecodeStrict { + encoding = encoding.Strict() + } + return encoding.DecodeString(seg) } diff --git a/vendor/github.com/golang/protobuf/jsonpb/decode.go b/vendor/github.com/golang/protobuf/jsonpb/decode.go index 60e82caa9a..6c16c255ff 100644 --- a/vendor/github.com/golang/protobuf/jsonpb/decode.go +++ b/vendor/github.com/golang/protobuf/jsonpb/decode.go @@ -386,8 +386,14 @@ func (u *Unmarshaler) unmarshalMessage(m protoreflect.Message, in []byte) error } func isSingularWellKnownValue(fd protoreflect.FieldDescriptor) bool { + if fd.Cardinality() == protoreflect.Repeated { + return false + } if md := fd.Message(); md != nil { - return md.FullName() == "google.protobuf.Value" && fd.Cardinality() != protoreflect.Repeated + return md.FullName() == "google.protobuf.Value" + } + if ed := fd.Enum(); ed != nil { + return ed.FullName() == "google.protobuf.NullValue" } return false } diff --git a/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go b/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go index a4a88b3d55..4e32500cda 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go +++ b/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go @@ -18,6 +18,7 @@ import ( "os" "path/filepath" "sync" + "time" "github.com/docker/cli/cli/config" "github.com/docker/cli/cli/config/configfile" @@ -52,7 +53,7 @@ type defaultKeychain struct { var ( // DefaultKeychain implements Keychain by interpreting the docker config file. - DefaultKeychain Keychain = &defaultKeychain{} + DefaultKeychain = RefreshingKeychain(&defaultKeychain{}, 5*time.Minute) ) const ( @@ -178,3 +179,71 @@ func (w wrapper) Resolve(r Resource) (Authenticator, error) { } return FromConfig(AuthConfig{Username: u, Password: p}), nil } + +func RefreshingKeychain(inner Keychain, duration time.Duration) Keychain { + return &refreshingKeychain{ + keychain: inner, + duration: duration, + } +} + +type refreshingKeychain struct { + keychain Keychain + duration time.Duration + clock func() time.Time +} + +func (r *refreshingKeychain) Resolve(target Resource) (Authenticator, error) { + last := time.Now() + auth, err := r.keychain.Resolve(target) + if err != nil || auth == Anonymous { + return auth, err + } + return &refreshing{ + target: target, + keychain: r.keychain, + last: last, + cached: auth, + duration: r.duration, + clock: r.clock, + }, nil +} + +type refreshing struct { + sync.Mutex + target Resource + keychain Keychain + + duration time.Duration + + last time.Time + cached Authenticator + + // for testing + clock func() time.Time +} + +func (r *refreshing) Authorization() (*AuthConfig, error) { + r.Lock() + defer r.Unlock() + if r.cached == nil || r.expired() { + r.last = r.now() + auth, err := r.keychain.Resolve(r.target) + if err != nil { + return nil, err + } + r.cached = auth + } + return r.cached.Authorization() +} + +func (r *refreshing) now() time.Time { + if r.clock == nil { + return time.Now() + } + return r.clock() +} + +func (r *refreshing) expired() bool { + return r.now().Sub(r.last) > r.duration +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/name/digest.go b/vendor/github.com/google/go-containerregistry/pkg/name/digest.go index c4a2e693e3..c049c1ef48 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/name/digest.go +++ b/vendor/github.com/google/go-containerregistry/pkg/name/digest.go @@ -15,6 +15,7 @@ package name import ( + // nolint: depguard _ "crypto/sha256" // Recommended by go-digest. "strings" diff --git a/vendor/github.com/google/go-containerregistry/pkg/name/registry.go b/vendor/github.com/google/go-containerregistry/pkg/name/registry.go index 2a26b66d04..5b0d01769c 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/name/registry.go +++ b/vendor/github.com/google/go-containerregistry/pkg/name/registry.go @@ -17,6 +17,7 @@ package name import ( "net" "net/url" + "path" "regexp" "strings" ) @@ -50,6 +51,11 @@ func (r Registry) String() string { return r.Name() } +// Repo returns a Repository in the Registry with the given name. +func (r Registry) Repo(repo ...string) Repository { + return Repository{Registry: r, repository: path.Join(repo...)} +} + // Scope returns the scope required to access the registry. func (r Registry) Scope(string) string { // The only resource under 'registry' is 'catalog'. http://goo.gl/N9cN9Z diff --git a/vendor/github.com/google/go-containerregistry/pkg/registry/manifest.go b/vendor/github.com/google/go-containerregistry/pkg/registry/manifest.go index 6c556604c5..cd788f7baf 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/registry/manifest.go +++ b/vendor/github.com/google/go-containerregistry/pkg/registry/manifest.go @@ -16,8 +16,6 @@ package registry import ( "bytes" - "crypto/sha256" - "encoding/hex" "encoding/json" "fmt" "io" @@ -81,6 +79,16 @@ func isCatalog(req *http.Request) bool { return elems[len(elems)-1] == "_catalog" } +// Returns whether this url should be handled by the referrers handler +func isReferrers(req *http.Request) bool { + elems := strings.Split(req.URL.Path, "/") + elems = elems[1:] + if len(elems) < 4 { + return false + } + return elems[len(elems)-2] == "referrers" +} + // https://github.com/opencontainers/distribution-spec/blob/master/spec.md#pulling-an-image-manifest // https://github.com/opencontainers/distribution-spec/blob/master/spec.md#pushing-an-image func (m *manifests) handle(resp http.ResponseWriter, req *http.Request) *regError { @@ -110,9 +118,8 @@ func (m *manifests) handle(resp http.ResponseWriter, req *http.Request) *regErro Message: "Unknown manifest", } } - rd := sha256.Sum256(m.blob) - d := "sha256:" + hex.EncodeToString(rd[:]) - resp.Header().Set("Docker-Content-Digest", d) + h, _, _ := v1.SHA256(bytes.NewReader(m.blob)) + resp.Header().Set("Docker-Content-Digest", h.String()) resp.Header().Set("Content-Type", m.contentType) resp.Header().Set("Content-Length", fmt.Sprint(len(m.blob))) resp.WriteHeader(http.StatusOK) @@ -137,9 +144,8 @@ func (m *manifests) handle(resp http.ResponseWriter, req *http.Request) *regErro Message: "Unknown manifest", } } - rd := sha256.Sum256(m.blob) - d := "sha256:" + hex.EncodeToString(rd[:]) - resp.Header().Set("Docker-Content-Digest", d) + h, _, _ := v1.SHA256(bytes.NewReader(m.blob)) + resp.Header().Set("Docker-Content-Digest", h.String()) resp.Header().Set("Content-Type", m.contentType) resp.Header().Set("Content-Length", fmt.Sprint(len(m.blob))) resp.WriteHeader(http.StatusOK) @@ -153,8 +159,8 @@ func (m *manifests) handle(resp http.ResponseWriter, req *http.Request) *regErro } b := &bytes.Buffer{} io.Copy(b, req.Body) - rd := sha256.Sum256(b.Bytes()) - digest := "sha256:" + hex.EncodeToString(rd[:]) + h, _, _ := v1.SHA256(bytes.NewReader(b.Bytes())) + digest := h.String() mf := manifest{ blob: b.Bytes(), contentType: req.Header.Get("Content-Type"), @@ -343,3 +349,82 @@ func (m *manifests) handleCatalog(resp http.ResponseWriter, req *http.Request) * Message: "We don't understand your method + url", } } + +// TODO: implement handling of artifactType querystring +func (m *manifests) handleReferrers(resp http.ResponseWriter, req *http.Request) *regError { + // Ensure this is a GET request + if req.Method != "GET" { + return ®Error{ + Status: http.StatusBadRequest, + Code: "METHOD_UNKNOWN", + Message: "We don't understand your method + url", + } + } + + elem := strings.Split(req.URL.Path, "/") + elem = elem[1:] + target := elem[len(elem)-1] + repo := strings.Join(elem[1:len(elem)-2], "/") + + // Validate that incoming target is a valid digest + if _, err := v1.NewHash(target); err != nil { + return ®Error{ + Status: http.StatusBadRequest, + Code: "UNSUPPORTED", + Message: "Target must be a valid digest", + } + } + + m.lock.Lock() + defer m.lock.Unlock() + + digestToManifestMap, repoExists := m.manifests[repo] + if !repoExists { + return ®Error{ + Status: http.StatusNotFound, + Code: "NAME_UNKNOWN", + Message: "Unknown name", + } + } + + im := v1.IndexManifest{ + SchemaVersion: 2, + MediaType: types.OCIImageIndex, + Manifests: []v1.Descriptor{}, + } + for digest, manifest := range digestToManifestMap { + h, err := v1.NewHash(digest) + if err != nil { + continue + } + var refPointer struct { + Subject *v1.Descriptor `json:"subject"` + } + json.Unmarshal(manifest.blob, &refPointer) + if refPointer.Subject == nil { + continue + } + referenceDigest := refPointer.Subject.Digest + if referenceDigest.String() != target { + continue + } + // At this point, we know the current digest references the target + var imageAsArtifact struct { + Config struct { + MediaType string `json:"mediaType"` + } `json:"config"` + } + json.Unmarshal(manifest.blob, &imageAsArtifact) + im.Manifests = append(im.Manifests, v1.Descriptor{ + MediaType: types.MediaType(manifest.contentType), + Size: int64(len(manifest.blob)), + Digest: h, + ArtifactType: imageAsArtifact.Config.MediaType, + }) + } + msg, _ := json.Marshal(&im) + resp.Header().Set("Content-Length", fmt.Sprint(len(msg))) + resp.WriteHeader(http.StatusOK) + io.Copy(resp, bytes.NewReader([]byte(msg))) + return nil +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/registry/registry.go b/vendor/github.com/google/go-containerregistry/pkg/registry/registry.go index e612909208..a98d77a93e 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/registry/registry.go +++ b/vendor/github.com/google/go-containerregistry/pkg/registry/registry.go @@ -24,20 +24,33 @@ package registry import ( + "fmt" "log" + "math/rand" "net/http" "os" ) type registry struct { - log *log.Logger - blobs blobs - manifests manifests + log *log.Logger + blobs blobs + manifests manifests + referrersEnabled bool + warnings map[float64]string } // https://docs.docker.com/registry/spec/api/#api-version-check // https://github.com/opencontainers/distribution-spec/blob/master/spec.md#api-version-check func (r *registry) v2(resp http.ResponseWriter, req *http.Request) *regError { + if r.warnings != nil { + rnd := rand.Float64() + for prob, msg := range r.warnings { + if prob > rnd { + resp.Header().Add("Warning", fmt.Sprintf(`299 - "%s"`, msg)) + } + } + } + if isBlob(req) { return r.blobs.handle(resp, req) } @@ -50,6 +63,9 @@ func (r *registry) v2(resp http.ResponseWriter, req *http.Request) *regError { if isCatalog(req) { return r.manifests.handleCatalog(resp, req) } + if r.referrersEnabled && isReferrers(req) { + return r.manifests.handleReferrers(resp, req) + } resp.Header().Set("Docker-Distribution-API-Version", "registry/2.0") if req.URL.Path != "/v2/" && req.URL.Path != "/v2" { return ®Error{ @@ -104,3 +120,19 @@ func Logger(l *log.Logger) Option { r.blobs.log = l } } + +// WithReferrersSupport enables the referrers API endpoint (OCI 1.1+) +func WithReferrersSupport(enabled bool) Option { + return func(r *registry) { + r.referrersEnabled = enabled + } +} + +func WithWarning(prob float64, msg string) Option { + return func(r *registry) { + if r.warnings == nil { + r.warnings = map[float64]string{} + } + r.warnings[prob] = msg + } +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/config.go b/vendor/github.com/google/go-containerregistry/pkg/v1/config.go index 08ec0158f6..960c93b5f4 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/config.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/config.go @@ -38,6 +38,21 @@ type ConfigFile struct { Config Config `json:"config"` OSVersion string `json:"os.version,omitempty"` Variant string `json:"variant,omitempty"` + OSFeatures []string `json:"os.features,omitempty"` +} + +// Platform attempts to generates a Platform from the ConfigFile fields. +func (cf *ConfigFile) Platform() *Platform { + if cf.OS == "" && cf.Architecture == "" && cf.OSVersion == "" && cf.Variant == "" && len(cf.OSFeatures) == 0 { + return nil + } + return &Platform{ + OS: cf.OS, + Architecture: cf.Architecture, + OSVersion: cf.OSVersion, + Variant: cf.Variant, + OSFeatures: cf.OSFeatures, + } } // History is one entry of a list recording how this container image was built. diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go index 55ba833524..d2efcb372e 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go @@ -19,6 +19,10 @@ import ( "context" "io" "sync" + "time" + + api "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -30,7 +34,9 @@ type image struct { ref name.Reference opener *imageOpener tarballImage v1.Image + computed bool id *v1.Hash + configFile *v1.ConfigFile once sync.Once err error @@ -121,6 +127,28 @@ func (i *image) initialize() error { return i.err } +func (i *image) compute() error { + // Don't re-compute if already computed. + if i.computed { + return nil + } + + inspect, _, err := i.opener.client.ImageInspectWithRaw(i.opener.ctx, i.ref.String()) + if err != nil { + return err + } + + configFile, err := i.computeConfigFile(inspect) + if err != nil { + return err + } + + i.configFile = configFile + i.computed = true + + return nil +} + func (i *image) Layers() ([]v1.Layer, error) { if err := i.initialize(); err != nil { return nil, err @@ -154,16 +182,19 @@ func (i *image) ConfigName() (v1.Hash, error) { } func (i *image) ConfigFile() (*v1.ConfigFile, error) { - if err := i.initialize(); err != nil { + if err := i.compute(); err != nil { return nil, err } - return i.tarballImage.ConfigFile() + return i.configFile.DeepCopy(), nil } func (i *image) RawConfigFile() ([]byte, error) { if err := i.initialize(); err != nil { return nil, err } + + // RawConfigFile cannot be generated from "docker inspect" because Docker Engine API returns serialized data, + // and formatting information of the raw config such as indent and prefix will be lost. return i.tarballImage.RawConfigFile() } @@ -201,3 +232,119 @@ func (i *image) LayerByDiffID(h v1.Hash) (v1.Layer, error) { } return i.tarballImage.LayerByDiffID(h) } + +func (i *image) configHistory(author string) ([]v1.History, error) { + historyItems, err := i.opener.client.ImageHistory(i.opener.ctx, i.ref.String()) + if err != nil { + return nil, err + } + + history := make([]v1.History, len(historyItems)) + for j, h := range historyItems { + history[j] = v1.History{ + Author: author, + Created: v1.Time{ + Time: time.Unix(h.Created, 0).UTC(), + }, + CreatedBy: h.CreatedBy, + Comment: h.Comment, + EmptyLayer: h.Size == 0, + } + } + return history, nil +} + +func (i *image) diffIDs(rootFS api.RootFS) ([]v1.Hash, error) { + diffIDs := make([]v1.Hash, len(rootFS.Layers)) + for j, l := range rootFS.Layers { + h, err := v1.NewHash(l) + if err != nil { + return nil, err + } + diffIDs[j] = h + } + return diffIDs, nil +} + +func (i *image) computeConfigFile(inspect api.ImageInspect) (*v1.ConfigFile, error) { + diffIDs, err := i.diffIDs(inspect.RootFS) + if err != nil { + return nil, err + } + + history, err := i.configHistory(inspect.Author) + if err != nil { + return nil, err + } + + created, err := time.Parse(time.RFC3339Nano, inspect.Created) + if err != nil { + return nil, err + } + + return &v1.ConfigFile{ + Architecture: inspect.Architecture, + Author: inspect.Author, + Container: inspect.Container, + Created: v1.Time{Time: created}, + DockerVersion: inspect.DockerVersion, + History: history, + OS: inspect.Os, + RootFS: v1.RootFS{ + Type: inspect.RootFS.Type, + DiffIDs: diffIDs, + }, + Config: i.computeImageConfig(inspect.Config), + OSVersion: inspect.OsVersion, + }, nil +} + +func (i *image) computeImageConfig(config *container.Config) v1.Config { + if config == nil { + return v1.Config{} + } + + c := v1.Config{ + AttachStderr: config.AttachStderr, + AttachStdin: config.AttachStdin, + AttachStdout: config.AttachStdout, + Cmd: config.Cmd, + Domainname: config.Domainname, + Entrypoint: config.Entrypoint, + Env: config.Env, + Hostname: config.Hostname, + Image: config.Image, + Labels: config.Labels, + OnBuild: config.OnBuild, + OpenStdin: config.OpenStdin, + StdinOnce: config.StdinOnce, + Tty: config.Tty, + User: config.User, + Volumes: config.Volumes, + WorkingDir: config.WorkingDir, + ArgsEscaped: config.ArgsEscaped, + NetworkDisabled: config.NetworkDisabled, + MacAddress: config.MacAddress, + StopSignal: config.StopSignal, + Shell: config.Shell, + } + + if config.Healthcheck != nil { + c.Healthcheck = &v1.HealthConfig{ + Test: config.Healthcheck.Test, + Interval: config.Healthcheck.Interval, + Timeout: config.Healthcheck.Timeout, + StartPeriod: config.Healthcheck.StartPeriod, + Retries: config.Healthcheck.Retries, + } + } + + if len(config.ExposedPorts) > 0 { + c.ExposedPorts = map[string]struct{}{} + for port := range c.ExposedPorts { + c.ExposedPorts[port] = struct{}{} + } + } + + return c +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go index e8a5a1e5de..b806463697 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go @@ -19,6 +19,7 @@ import ( "io" "github.com/docker/docker/api/types" + api "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" ) @@ -100,4 +101,5 @@ type Client interface { ImageLoad(context.Context, io.Reader, bool) (types.ImageLoadResponse, error) ImageTag(context.Context, string, string) error ImageInspectWithRaw(context.Context, string) (types.ImageInspect, []byte, error) + ImageHistory(context.Context, string) ([]api.HistoryResponseItem, error) } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.go b/vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.go index 8edab24d4a..18b414891b 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.go @@ -59,5 +59,7 @@ func (i emptyIndex) ImageIndex(v1.Hash) (v1.ImageIndex, error) { func base() *v1.IndexManifest { return &v1.IndexManifest{ SchemaVersion: 2, + MediaType: types.OCIImageIndex, + Manifests: []v1.Descriptor{}, } } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/hash.go b/vendor/github.com/google/go-containerregistry/pkg/v1/hash.go index e9630087e1..f78a5fa89e 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/hash.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/hash.go @@ -15,7 +15,7 @@ package v1 import ( - "crypto/sha256" + "crypto" "encoding/hex" "encoding/json" "fmt" @@ -78,7 +78,7 @@ func (h *Hash) UnmarshalText(text []byte) error { func Hasher(name string) (hash.Hash, error) { switch name { case "sha256": - return sha256.New(), nil + return crypto.SHA256.New(), nil default: return nil, fmt.Errorf("unsupported hash: %q", name) } @@ -111,7 +111,7 @@ func (h *Hash) parse(unquoted string) error { // SHA256 computes the Hash of the provided io.Reader's content. func SHA256(r io.Reader) (Hash, int64, error) { - hasher := sha256.New() + hasher := crypto.SHA256.New() n, err := io.Copy(hasher, r) if err != nil { return Hash{}, 0, err diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/manifest.go b/vendor/github.com/google/go-containerregistry/pkg/v1/manifest.go index 8ded1ee53a..22d483f3bd 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/manifest.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/manifest.go @@ -28,6 +28,7 @@ type Manifest struct { Config Descriptor `json:"config"` Layers []Descriptor `json:"layers"` Annotations map[string]string `json:"annotations,omitempty"` + Subject *Descriptor `json:"subject,omitempty"` } // IndexManifest represents an OCI image index in a structured way. @@ -36,17 +37,19 @@ type IndexManifest struct { MediaType types.MediaType `json:"mediaType,omitempty"` Manifests []Descriptor `json:"manifests"` Annotations map[string]string `json:"annotations,omitempty"` + Subject *Descriptor `json:"subject,omitempty"` } // Descriptor holds a reference from the manifest to one of its constituent elements. type Descriptor struct { - MediaType types.MediaType `json:"mediaType"` - Size int64 `json:"size"` - Digest Hash `json:"digest"` - Data []byte `json:"data,omitempty"` - URLs []string `json:"urls,omitempty"` - Annotations map[string]string `json:"annotations,omitempty"` - Platform *Platform `json:"platform,omitempty"` + MediaType types.MediaType `json:"mediaType"` + Size int64 `json:"size"` + Digest Hash `json:"digest"` + Data []byte `json:"data,omitempty"` + URLs []string `json:"urls,omitempty"` + Annotations map[string]string `json:"annotations,omitempty"` + Platform *Platform `json:"platform,omitempty"` + ArtifactType string `json:"artifactType,omitempty"` } // ParseManifest parses the io.Reader's contents into a Manifest. diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go b/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go index 93c230e3b2..3ea27fe47f 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go @@ -18,6 +18,7 @@ import ( "bytes" "encoding/json" "errors" + "sync" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/partial" @@ -37,6 +38,9 @@ type image struct { configMediaType *types.MediaType diffIDMap map[v1.Hash]v1.Layer digestMap map[v1.Hash]v1.Layer + subject *v1.Descriptor + + sync.Mutex } var _ v1.Image = (*image)(nil) @@ -49,6 +53,9 @@ func (i *image) MediaType() (types.MediaType, error) { } func (i *image) compute() error { + i.Lock() + defer i.Unlock() + // Don't re-compute if already computed. if i.computed { return nil @@ -153,6 +160,7 @@ func (i *image) compute() error { manifest.Annotations[k] = v } } + manifest.Subject = i.subject i.configFile = configFile i.manifest = manifest diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go b/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go index 841995f158..512effef67 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go @@ -16,12 +16,15 @@ package mutate import ( "encoding/json" + "errors" "fmt" + "sync" "github.com/google/go-containerregistry/pkg/logs" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/match" "github.com/google/go-containerregistry/pkg/v1/partial" + "github.com/google/go-containerregistry/pkg/v1/stream" "github.com/google/go-containerregistry/pkg/v1/types" ) @@ -70,6 +73,9 @@ type index struct { imageMap map[v1.Hash]v1.Image indexMap map[v1.Hash]v1.ImageIndex layerMap map[v1.Hash]v1.Layer + subject *v1.Descriptor + + sync.Mutex } var _ v1.ImageIndex = (*index)(nil) @@ -84,6 +90,9 @@ func (i *index) MediaType() (types.MediaType, error) { func (i *index) Size() (int64, error) { return partial.Size(i) } func (i *index) compute() error { + i.Lock() + defer i.Unlock() + // Don't re-compute if already computed. if i.computed { return nil @@ -142,6 +151,7 @@ func (i *index) compute() error { manifest.Annotations[k] = v } } + manifest.Subject = i.subject i.manifest = manifest i.computed = true @@ -200,3 +210,23 @@ func (i *index) RawManifest() ([]byte, error) { } return json.Marshal(i.manifest) } + +func (i *index) Manifests() ([]partial.Describable, error) { + if err := i.compute(); errors.Is(err, stream.ErrNotComputed) { + // Index contains a streamable layer which has not yet been + // consumed. Just return the manifests we have in case the caller + // is going to consume the streamable layers. + manifests, err := partial.Manifests(i.base) + if err != nil { + return nil, err + } + for _, add := range i.adds { + manifests = append(manifests, add.Add) + } + return manifests, nil + } else if err != nil { + return nil, err + } + + return partial.ComputeManifests(i) +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go b/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go index 022fc818a1..e4a0e5273e 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go @@ -115,9 +115,33 @@ func Config(base v1.Image, cfg v1.Config) (v1.Image, error) { return ConfigFile(base, cf) } -// Annotatable represents a manifest that can carry annotations. -type Annotatable interface { - partial.WithRawManifest +// Subject mutates the subject on an image or index manifest. +// +// The input is expected to be a v1.Image or v1.ImageIndex, and +// returns the same type. You can type-assert the result like so: +// +// img := Subject(empty.Image, subj).(v1.Image) +// +// Or for an index: +// +// idx := Subject(empty.Index, subj).(v1.ImageIndex) +// +// If the input is not an Image or ImageIndex, the result will +// attempt to lazily annotate the raw manifest. +func Subject(f partial.WithRawManifest, subject v1.Descriptor) partial.WithRawManifest { + if img, ok := f.(v1.Image); ok { + return &image{ + base: img, + subject: &subject, + } + } + if idx, ok := f.(v1.ImageIndex); ok { + return &index{ + base: idx, + subject: &subject, + } + } + return arbitraryRawManifest{a: f, subject: &subject} } // Annotations mutates the annotations on an annotatable image or index manifest. @@ -137,7 +161,7 @@ type Annotatable interface { // // If the input Annotatable is not an Image or ImageIndex, the result will // attempt to lazily annotate the raw manifest. -func Annotations(f Annotatable, anns map[string]string) Annotatable { +func Annotations(f partial.WithRawManifest, anns map[string]string) partial.WithRawManifest { if img, ok := f.(v1.Image); ok { return &image{ base: img, @@ -150,12 +174,13 @@ func Annotations(f Annotatable, anns map[string]string) Annotatable { annotations: anns, } } - return arbitraryRawManifest{f, anns} + return arbitraryRawManifest{a: f, anns: anns} } type arbitraryRawManifest struct { - a Annotatable - anns map[string]string + a partial.WithRawManifest + anns map[string]string + subject *v1.Descriptor } func (a arbitraryRawManifest) RawManifest() ([]byte, error) { @@ -178,6 +203,9 @@ func (a arbitraryRawManifest) RawManifest() ([]byte, error) { } else { m["annotations"] = a.anns } + if a.subject != nil { + m["subject"] = a.subject + } return json.Marshal(m) } @@ -437,6 +465,13 @@ func layerTime(layer v1.Layer, t time.Time) (v1.Layer, error) { } header.ModTime = t + + //PAX and GNU Format support additional timestamps in the header + if header.Format == tar.FormatPAX || header.Format == tar.FormatGNU { + header.AccessTime = t + header.ChangeTime = t + } + if err := tarWriter.WriteHeader(header); err != nil { return nil, fmt.Errorf("writing tar header: %w", err) } @@ -500,6 +535,8 @@ func MediaType(img v1.Image, mt types.MediaType) v1.Image { } // ConfigMediaType modifies the MediaType() of the given image's Config. +// +// If !mt.IsConfig(), this will be the image's artifactType in any indexes it's a part of. func ConfigMediaType(img v1.Image, mt types.MediaType) v1.Image { return &image{ base: img, diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.go b/vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.go index f17f27446f..10cfb2b2f6 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.go @@ -19,6 +19,7 @@ import ( v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/match" + "github.com/google/go-containerregistry/pkg/v1/types" ) // FindManifests given a v1.ImageIndex, find the manifests that fit the matcher. @@ -83,3 +84,82 @@ func FindIndexes(index v1.ImageIndex, matcher match.Matcher) ([]v1.ImageIndex, e } return matches, nil } + +type withManifests interface { + Manifests() ([]Describable, error) +} + +type withLayer interface { + Layer(v1.Hash) (v1.Layer, error) +} + +type describable struct { + desc v1.Descriptor +} + +func (d describable) Digest() (v1.Hash, error) { + return d.desc.Digest, nil +} + +func (d describable) Size() (int64, error) { + return d.desc.Size, nil +} + +func (d describable) MediaType() (types.MediaType, error) { + return d.desc.MediaType, nil +} + +func (d describable) Descriptor() (*v1.Descriptor, error) { + return &d.desc, nil +} + +// Manifests is analogous to v1.Image.Layers in that it allows values in the +// returned list to be lazily evaluated, which enables an index to contain +// an image that contains a streaming layer. +// +// This should have been part of the v1.ImageIndex interface, but wasn't. +// It is instead usable through this extension interface. +func Manifests(idx v1.ImageIndex) ([]Describable, error) { + if wm, ok := idx.(withManifests); ok { + return wm.Manifests() + } + + return ComputeManifests(idx) +} + +// ComputeManifests provides a fallback implementation for Manifests. +func ComputeManifests(idx v1.ImageIndex) ([]Describable, error) { + m, err := idx.IndexManifest() + if err != nil { + return nil, err + } + manifests := []Describable{} + for _, desc := range m.Manifests { + switch { + case desc.MediaType.IsImage(): + img, err := idx.Image(desc.Digest) + if err != nil { + return nil, err + } + manifests = append(manifests, img) + case desc.MediaType.IsIndex(): + idx, err := idx.ImageIndex(desc.Digest) + if err != nil { + return nil, err + } + manifests = append(manifests, idx) + default: + if wl, ok := idx.(withLayer); ok { + layer, err := wl.Layer(desc.Digest) + if err != nil { + return nil, err + } + manifests = append(manifests, layer) + } else { + manifests = append(manifests, describable{desc}) + } + } + } + + return manifests, nil +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go b/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go index 3ad4992892..c8b22b3f95 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go @@ -328,10 +328,28 @@ func Descriptor(d Describable) (*v1.Descriptor, error) { if desc.MediaType, err = d.MediaType(); err != nil { return nil, err } + if wat, ok := d.(withArtifactType); ok { + if desc.ArtifactType, err = wat.ArtifactType(); err != nil { + return nil, err + } + } else { + if wrm, ok := d.(WithRawManifest); ok && desc.MediaType.IsImage() { + mf, _ := Manifest(wrm) + // Failing to parse as a manifest should just be ignored. + // The manifest might not be valid, and that's okay. + if mf != nil && !mf.Config.MediaType.IsConfig() { + desc.ArtifactType = string(mf.Config.MediaType) + } + } + } return &desc, nil } +type withArtifactType interface { + ArtifactType() (string, error) +} + type withUncompressedSize interface { UncompressedSize() (int64, error) } @@ -399,3 +417,20 @@ func unwrap(i any) any { } return i } + +// ArtifactType returns the artifact type for the given manifest. +// +// If the manifest reports its own artifact type, that's returned, otherwise +// the manifest is parsed and, if successful, its config.mediaType is returned. +func ArtifactType(w WithManifest) (string, error) { + if wat, ok := w.(withArtifactType); ok { + return wat.ArtifactType() + } + mf, _ := w.Manifest() + // Failing to parse as a manifest should just be ignored. + // The manifest might not be valid, and that's okay. + if mf != nil && !mf.Config.MediaType.IsConfig() { + return string(mf.Config.MediaType), nil + } + return "", nil +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go b/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go index 9ee91ee292..59ca402698 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go @@ -85,6 +85,47 @@ func (p Platform) Equals(o Platform) bool { stringSliceEqualIgnoreOrder(p.Features, o.Features) } +// Satisfies returns true if this Platform "satisfies" the given spec Platform. +// +// Note that this is different from Equals and that Satisfies is not reflexive. +// +// The given spec represents "requirements" such that any missing values in the +// spec are not compared. +// +// For OSFeatures and Features, Satisfies will return true if this Platform's +// fields contain a superset of the values in the spec's fields (order ignored). +func (p Platform) Satisfies(spec Platform) bool { + return satisfies(spec.OS, p.OS) && + satisfies(spec.Architecture, p.Architecture) && + satisfies(spec.Variant, p.Variant) && + satisfies(spec.OSVersion, p.OSVersion) && + satisfiesList(spec.OSFeatures, p.OSFeatures) && + satisfiesList(spec.Features, p.Features) +} + +func satisfies(want, have string) bool { + return want == "" || want == have +} + +func satisfiesList(want, have []string) bool { + if len(want) == 0 { + return true + } + + set := map[string]struct{}{} + for _, h := range have { + set[h] = struct{}{} + } + + for _, w := range want { + if _, ok := set[w]; !ok { + return false + } + } + + return true +} + // stringSliceEqual compares 2 string slices and returns if their contents are identical. func stringSliceEqual(a, b []string) bool { if len(a) != len(b) { diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.go index eb4306f287..a0281b9fd2 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.go @@ -25,38 +25,35 @@ import ( "github.com/google/go-containerregistry/pkg/v1/remote/transport" ) -type catalog struct { +type Catalogs struct { Repos []string `json:"repositories"` + Next string `json:"next,omitempty"` } // CatalogPage calls /_catalog, returning the list of repositories on the registry. func CatalogPage(target name.Registry, last string, n int, options ...Option) ([]string, error) { - o, err := makeOptions(target, options...) + o, err := makeOptions(options...) if err != nil { return nil, err } - scopes := []string{target.Scope(transport.PullScope)} - tr, err := transport.NewWithContext(o.context, target, o.auth, o.transport, scopes) + f, err := newPuller(o).fetcher(o.context, target) if err != nil { return nil, err } - query := fmt.Sprintf("last=%s&n=%d", url.QueryEscape(last), n) - uri := url.URL{ Scheme: target.Scheme(), Host: target.RegistryStr(), Path: "/v2/_catalog", - RawQuery: query, + RawQuery: fmt.Sprintf("last=%s&n=%d", url.QueryEscape(last), n), } - client := http.Client{Transport: tr} req, err := http.NewRequest(http.MethodGet, uri.String(), nil) if err != nil { return nil, err } - resp, err := client.Do(req.WithContext(o.context)) + resp, err := f.client.Do(req.WithContext(o.context)) if err != nil { return nil, err } @@ -66,7 +63,7 @@ func CatalogPage(target name.Registry, last string, n int, options ...Option) ([ return nil, err } - var parsed catalog + var parsed Catalogs if err := json.NewDecoder(resp.Body).Decode(&parsed); err != nil { return nil, err } @@ -76,79 +73,87 @@ func CatalogPage(target name.Registry, last string, n int, options ...Option) ([ // Catalog calls /_catalog, returning the list of repositories on the registry. func Catalog(ctx context.Context, target name.Registry, options ...Option) ([]string, error) { - o, err := makeOptions(target, options...) + o, err := makeOptions(options...) if err != nil { return nil, err } - scopes := []string{target.Scope(transport.PullScope)} - tr, err := transport.NewWithContext(o.context, target, o.auth, o.transport, scopes) + // WithContext overrides the ctx passed directly. + if o.context != context.Background() { + ctx = o.context + } + + return newPuller(o).catalog(ctx, target, o.pageSize) +} + +func (f *fetcher) catalogPage(ctx context.Context, reg name.Registry, next string, pageSize int) (*Catalogs, error) { + if next == "" { + uri := &url.URL{ + Scheme: reg.Scheme(), + Host: reg.RegistryStr(), + Path: "/v2/_catalog", + } + if pageSize > 0 { + uri.RawQuery = fmt.Sprintf("n=%d", pageSize) + } + next = uri.String() + } + + req, err := http.NewRequestWithContext(ctx, "GET", next, nil) if err != nil { return nil, err } - uri := &url.URL{ - Scheme: target.Scheme(), - Host: target.RegistryStr(), - Path: "/v2/_catalog", + resp, err := f.client.Do(req) + if err != nil { + return nil, err } - if o.pageSize > 0 { - uri.RawQuery = fmt.Sprintf("n=%d", o.pageSize) + if err := transport.CheckError(resp, http.StatusOK); err != nil { + return nil, err } - client := http.Client{Transport: tr} - - // WithContext overrides the ctx passed directly. - if o.context != context.Background() { - ctx = o.context + parsed := Catalogs{} + if err := json.NewDecoder(resp.Body).Decode(&parsed); err != nil { + return nil, err } - var ( - parsed catalog - repoList []string - ) + if err := resp.Body.Close(); err != nil { + return nil, err + } - // get responses until there is no next page - for { - select { - case <-ctx.Done(): - return nil, ctx.Err() - default: - } + uri, err := getNextPageURL(resp) + if err != nil { + return nil, err + } - req, err := http.NewRequest("GET", uri.String(), nil) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) + if uri != nil { + parsed.Next = uri.String() + } - resp, err := client.Do(req) - if err != nil { - return nil, err - } + return &parsed, nil +} - if err := transport.CheckError(resp, http.StatusOK); err != nil { - return nil, err - } +type Catalogger struct { + f *fetcher + reg name.Registry + pageSize int - if err := json.NewDecoder(resp.Body).Decode(&parsed); err != nil { - return nil, err - } - if err := resp.Body.Close(); err != nil { - return nil, err - } + page *Catalogs + err error - repoList = append(repoList, parsed.Repos...) + needMore bool +} - uri, err = getNextPageURL(resp) - if err != nil { - return nil, err - } - // no next page - if uri == nil { - break - } +func (l *Catalogger) Next(ctx context.Context) (*Catalogs, error) { + if l.needMore { + l.page, l.err = l.f.catalogPage(ctx, l.reg, l.page.Next, l.pageSize) + } else { + l.needMore = true } - return repoList, nil + return l.page, l.err +} + +func (l *Catalogger) HasNext() bool { + return l.page != nil && (!l.needMore || l.page.Next != "") } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.go index 3b9022719c..36e1d0816e 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.go @@ -15,43 +15,14 @@ package remote import ( - "fmt" - "net/http" - "net/url" - "github.com/google/go-containerregistry/pkg/name" - "github.com/google/go-containerregistry/pkg/v1/remote/transport" ) // Delete removes the specified image reference from the remote registry. func Delete(ref name.Reference, options ...Option) error { - o, err := makeOptions(ref.Context(), options...) - if err != nil { - return err - } - scopes := []string{ref.Scope(transport.DeleteScope)} - tr, err := transport.NewWithContext(o.context, ref.Context().Registry, o.auth, o.transport, scopes) + o, err := makeOptions(options...) if err != nil { return err } - c := &http.Client{Transport: tr} - - u := url.URL{ - Scheme: ref.Context().Registry.Scheme(), - Host: ref.Context().RegistryStr(), - Path: fmt.Sprintf("/v2/%s/manifests/%s", ref.Context().RepositoryStr(), ref.Identifier()), - } - - req, err := http.NewRequest(http.MethodDelete, u.String(), nil) - if err != nil { - return err - } - - resp, err := c.Do(req.WithContext(o.context)) - if err != nil { - return err - } - defer resp.Body.Close() - - return transport.CheckError(resp, http.StatusOK, http.StatusAccepted) + return newPusher(o).Delete(o.context, ref) } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go index 9c8ae168fa..61f28f4c04 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go @@ -15,24 +15,21 @@ package remote import ( - "bytes" "context" "fmt" - "io" - "net/http" - "net/url" - "strings" - "github.com/google/go-containerregistry/internal/redact" - "github.com/google/go-containerregistry/internal/verify" "github.com/google/go-containerregistry/pkg/logs" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/partial" - "github.com/google/go-containerregistry/pkg/v1/remote/transport" "github.com/google/go-containerregistry/pkg/v1/types" ) +var allManifestMediaTypes = append(append([]types.MediaType{ + types.DockerManifestSchema1, + types.DockerManifestSchema1Signed, +}, acceptableImageMediaTypes...), acceptableIndexMediaTypes...) + // ErrSchema1 indicates that we received a schema1 manifest from the registry. // This library doesn't have plans to support this legacy image format: // https://github.com/google/go-containerregistry/issues/377 @@ -55,14 +52,21 @@ func (e *ErrSchema1) Error() string { // Descriptor provides access to metadata about remote artifact and accessors // for efficiently converting it into a v1.Image or v1.ImageIndex. type Descriptor struct { - fetcher + fetcher fetcher v1.Descriptor + + ref name.Reference Manifest []byte + ctx context.Context - // So we can share this implementation with Image.. + // So we can share this implementation with Image. platform v1.Platform } +func (d *Descriptor) toDesc() v1.Descriptor { + return d.Descriptor +} + // RawManifest exists to satisfy the Taggable interface. func (d *Descriptor) RawManifest() ([]byte, error) { return d.Manifest, nil @@ -74,14 +78,7 @@ func (d *Descriptor) RawManifest() ([]byte, error) { // // See Head if you don't need the response body. func Get(ref name.Reference, options ...Option) (*Descriptor, error) { - acceptable := []types.MediaType{ - // Just to look at them. - types.DockerManifestSchema1, - types.DockerManifestSchema1Signed, - } - acceptable = append(acceptable, acceptableImageMediaTypes...) - acceptable = append(acceptable, acceptableIndexMediaTypes...) - return get(ref, acceptable, options...) + return get(ref, allManifestMediaTypes, options...) } // Head returns a v1.Descriptor for the given reference by issuing a HEAD @@ -90,48 +87,22 @@ func Get(ref name.Reference, options ...Option) (*Descriptor, error) { // Note that the server response will not have a body, so any errors encountered // should be retried with Get to get more details. func Head(ref name.Reference, options ...Option) (*v1.Descriptor, error) { - acceptable := []types.MediaType{ - // Just to look at them. - types.DockerManifestSchema1, - types.DockerManifestSchema1Signed, - } - acceptable = append(acceptable, acceptableImageMediaTypes...) - acceptable = append(acceptable, acceptableIndexMediaTypes...) - - o, err := makeOptions(ref.Context(), options...) - if err != nil { - return nil, err - } - - f, err := makeFetcher(ref, o) + o, err := makeOptions(options...) if err != nil { return nil, err } - return f.headManifest(ref, acceptable) + return newPuller(o).Head(o.context, ref) } // Handle options and fetch the manifest with the acceptable MediaTypes in the // Accept header. func get(ref name.Reference, acceptable []types.MediaType, options ...Option) (*Descriptor, error) { - o, err := makeOptions(ref.Context(), options...) - if err != nil { - return nil, err - } - f, err := makeFetcher(ref, o) - if err != nil { - return nil, err - } - b, desc, err := f.fetchManifest(ref, acceptable) + o, err := makeOptions(options...) if err != nil { return nil, err } - return &Descriptor{ - fetcher: *f, - Manifest: b, - Descriptor: *desc, - platform: o.platform, - }, nil + return newPuller(o).get(o.context, ref, acceptable, o.platform) } // Image converts the Descriptor into a v1.Image. @@ -167,7 +138,28 @@ func (d *Descriptor) Image() (v1.Image, error) { } return &mountableImage{ Image: imgCore, - Reference: d.Ref, + Reference: d.ref, + }, nil +} + +// Schema1 converts the Descriptor into a v1.Image for v2 schema 1 media types. +// +// The v1.Image returned by this method does not implement the entire interface because it would be inefficient. +// This exists mostly to make it easier to copy schema 1 images around or look at their filesystems. +// This is separate from Image() to avoid a backward incompatible change for callers expecting ErrSchema1. +func (d *Descriptor) Schema1() (v1.Image, error) { + i := &schema1{ + ref: d.ref, + fetcher: d.fetcher, + ctx: d.ctx, + manifest: d.Manifest, + mediaType: d.MediaType, + descriptor: &d.Descriptor, + } + + return &mountableImage{ + Image: i, + Reference: d.ref, }, nil } @@ -193,6 +185,8 @@ func (d *Descriptor) ImageIndex() (v1.ImageIndex, error) { func (d *Descriptor) remoteImage() *remoteImage { return &remoteImage{ + ref: d.ref, + ctx: d.ctx, fetcher: d.fetcher, manifest: d.Manifest, mediaType: d.MediaType, @@ -202,229 +196,11 @@ func (d *Descriptor) remoteImage() *remoteImage { func (d *Descriptor) remoteIndex() *remoteIndex { return &remoteIndex{ + ref: d.ref, + ctx: d.ctx, fetcher: d.fetcher, manifest: d.Manifest, mediaType: d.MediaType, descriptor: &d.Descriptor, } } - -// fetcher implements methods for reading from a registry. -type fetcher struct { - Ref name.Reference - Client *http.Client - context context.Context -} - -func makeFetcher(ref name.Reference, o *options) (*fetcher, error) { - tr, err := transport.NewWithContext(o.context, ref.Context().Registry, o.auth, o.transport, []string{ref.Scope(transport.PullScope)}) - if err != nil { - return nil, err - } - return &fetcher{ - Ref: ref, - Client: &http.Client{Transport: tr}, - context: o.context, - }, nil -} - -// url returns a url.Url for the specified path in the context of this remote image reference. -func (f *fetcher) url(resource, identifier string) url.URL { - return url.URL{ - Scheme: f.Ref.Context().Registry.Scheme(), - Host: f.Ref.Context().RegistryStr(), - Path: fmt.Sprintf("/v2/%s/%s/%s", f.Ref.Context().RepositoryStr(), resource, identifier), - } -} - -func (f *fetcher) fetchManifest(ref name.Reference, acceptable []types.MediaType) ([]byte, *v1.Descriptor, error) { - u := f.url("manifests", ref.Identifier()) - req, err := http.NewRequest(http.MethodGet, u.String(), nil) - if err != nil { - return nil, nil, err - } - accept := []string{} - for _, mt := range acceptable { - accept = append(accept, string(mt)) - } - req.Header.Set("Accept", strings.Join(accept, ",")) - - resp, err := f.Client.Do(req.WithContext(f.context)) - if err != nil { - return nil, nil, err - } - defer resp.Body.Close() - - if err := transport.CheckError(resp, http.StatusOK); err != nil { - return nil, nil, err - } - - manifest, err := io.ReadAll(resp.Body) - if err != nil { - return nil, nil, err - } - - digest, size, err := v1.SHA256(bytes.NewReader(manifest)) - if err != nil { - return nil, nil, err - } - - mediaType := types.MediaType(resp.Header.Get("Content-Type")) - contentDigest, err := v1.NewHash(resp.Header.Get("Docker-Content-Digest")) - if err == nil && mediaType == types.DockerManifestSchema1Signed { - // If we can parse the digest from the header, and it's a signed schema 1 - // manifest, let's use that for the digest to appease older registries. - digest = contentDigest - } - - // Validate the digest matches what we asked for, if pulling by digest. - if dgst, ok := ref.(name.Digest); ok { - if digest.String() != dgst.DigestStr() { - return nil, nil, fmt.Errorf("manifest digest: %q does not match requested digest: %q for %q", digest, dgst.DigestStr(), f.Ref) - } - } - // Do nothing for tags; I give up. - // - // We'd like to validate that the "Docker-Content-Digest" header matches what is returned by the registry, - // but so many registries implement this incorrectly that it's not worth checking. - // - // For reference: - // https://github.com/GoogleContainerTools/kaniko/issues/298 - - // Return all this info since we have to calculate it anyway. - desc := v1.Descriptor{ - Digest: digest, - Size: size, - MediaType: mediaType, - } - - return manifest, &desc, nil -} - -func (f *fetcher) headManifest(ref name.Reference, acceptable []types.MediaType) (*v1.Descriptor, error) { - u := f.url("manifests", ref.Identifier()) - req, err := http.NewRequest(http.MethodHead, u.String(), nil) - if err != nil { - return nil, err - } - accept := []string{} - for _, mt := range acceptable { - accept = append(accept, string(mt)) - } - req.Header.Set("Accept", strings.Join(accept, ",")) - - resp, err := f.Client.Do(req.WithContext(f.context)) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - if err := transport.CheckError(resp, http.StatusOK); err != nil { - return nil, err - } - - mth := resp.Header.Get("Content-Type") - if mth == "" { - return nil, fmt.Errorf("HEAD %s: response did not include Content-Type header", u.String()) - } - mediaType := types.MediaType(mth) - - size := resp.ContentLength - if size == -1 { - return nil, fmt.Errorf("GET %s: response did not include Content-Length header", u.String()) - } - - dh := resp.Header.Get("Docker-Content-Digest") - if dh == "" { - return nil, fmt.Errorf("HEAD %s: response did not include Docker-Content-Digest header", u.String()) - } - digest, err := v1.NewHash(dh) - if err != nil { - return nil, err - } - - // Validate the digest matches what we asked for, if pulling by digest. - if dgst, ok := ref.(name.Digest); ok { - if digest.String() != dgst.DigestStr() { - return nil, fmt.Errorf("manifest digest: %q does not match requested digest: %q for %q", digest, dgst.DigestStr(), f.Ref) - } - } - - // Return all this info since we have to calculate it anyway. - return &v1.Descriptor{ - Digest: digest, - Size: size, - MediaType: mediaType, - }, nil -} - -func (f *fetcher) fetchBlob(ctx context.Context, size int64, h v1.Hash) (io.ReadCloser, error) { - u := f.url("blobs", h.String()) - req, err := http.NewRequest(http.MethodGet, u.String(), nil) - if err != nil { - return nil, err - } - - resp, err := f.Client.Do(req.WithContext(ctx)) - if err != nil { - return nil, redact.Error(err) - } - - if err := transport.CheckError(resp, http.StatusOK); err != nil { - resp.Body.Close() - return nil, err - } - - // Do whatever we can. - // If we have an expected size and Content-Length doesn't match, return an error. - // If we don't have an expected size and we do have a Content-Length, use Content-Length. - if hsize := resp.ContentLength; hsize != -1 { - if size == verify.SizeUnknown { - size = hsize - } else if hsize != size { - return nil, fmt.Errorf("GET %s: Content-Length header %d does not match expected size %d", u.String(), hsize, size) - } - } - - return verify.ReadCloser(resp.Body, size, h) -} - -func (f *fetcher) headBlob(h v1.Hash) (*http.Response, error) { - u := f.url("blobs", h.String()) - req, err := http.NewRequest(http.MethodHead, u.String(), nil) - if err != nil { - return nil, err - } - - resp, err := f.Client.Do(req.WithContext(f.context)) - if err != nil { - return nil, redact.Error(err) - } - - if err := transport.CheckError(resp, http.StatusOK); err != nil { - resp.Body.Close() - return nil, err - } - - return resp, nil -} - -func (f *fetcher) blobExists(h v1.Hash) (bool, error) { - u := f.url("blobs", h.String()) - req, err := http.NewRequest(http.MethodHead, u.String(), nil) - if err != nil { - return false, err - } - - resp, err := f.Client.Do(req.WithContext(f.context)) - if err != nil { - return false, redact.Error(err) - } - defer resp.Body.Close() - - if err := transport.CheckError(resp, http.StatusOK, http.StatusNotFound); err != nil { - return false, err - } - - return resp.StatusCode == http.StatusOK, nil -} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.go new file mode 100644 index 0000000000..b671f836c9 --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.go @@ -0,0 +1,311 @@ +// Copyright 2023 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + "net/url" + "strings" + + "github.com/google/go-containerregistry/internal/redact" + "github.com/google/go-containerregistry/internal/verify" + "github.com/google/go-containerregistry/pkg/authn" + "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/remote/transport" + "github.com/google/go-containerregistry/pkg/v1/types" +) + +// fetcher implements methods for reading from a registry. +type fetcher struct { + target resource + client *http.Client +} + +func makeFetcher(ctx context.Context, target resource, o *options) (*fetcher, error) { + auth := o.auth + if o.keychain != nil { + kauth, err := o.keychain.Resolve(target) + if err != nil { + return nil, err + } + auth = kauth + } + + reg, ok := target.(name.Registry) + if !ok { + repo, ok := target.(name.Repository) + if !ok { + return nil, fmt.Errorf("unexpected resource: %T", target) + } + reg = repo.Registry + } + + tr, err := transport.NewWithContext(ctx, reg, auth, o.transport, []string{target.Scope(transport.PullScope)}) + if err != nil { + return nil, err + } + return &fetcher{ + target: target, + client: &http.Client{Transport: tr}, + }, nil +} + +func (f *fetcher) Do(req *http.Request) (*http.Response, error) { + return f.client.Do(req) +} + +type resource interface { + Scheme() string + RegistryStr() string + Scope(string) string + + authn.Resource +} + +// url returns a url.Url for the specified path in the context of this remote image reference. +func (f *fetcher) url(resource, identifier string) url.URL { + u := url.URL{ + Scheme: f.target.Scheme(), + Host: f.target.RegistryStr(), + // Default path if this is not a repository. + Path: "/v2/_catalog", + } + if repo, ok := f.target.(name.Repository); ok { + u.Path = fmt.Sprintf("/v2/%s/%s/%s", repo.RepositoryStr(), resource, identifier) + } + return u +} + +func (f *fetcher) get(ctx context.Context, ref name.Reference, acceptable []types.MediaType, platform v1.Platform) (*Descriptor, error) { + b, desc, err := f.fetchManifest(ctx, ref, acceptable) + if err != nil { + return nil, err + } + return &Descriptor{ + ref: ref, + ctx: ctx, + fetcher: *f, + Manifest: b, + Descriptor: *desc, + platform: platform, + }, nil +} + +func (f *fetcher) fetchManifest(ctx context.Context, ref name.Reference, acceptable []types.MediaType) ([]byte, *v1.Descriptor, error) { + u := f.url("manifests", ref.Identifier()) + req, err := http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return nil, nil, err + } + accept := []string{} + for _, mt := range acceptable { + accept = append(accept, string(mt)) + } + req.Header.Set("Accept", strings.Join(accept, ",")) + + resp, err := f.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + if err := transport.CheckError(resp, http.StatusOK); err != nil { + return nil, nil, err + } + + manifest, err := io.ReadAll(resp.Body) + if err != nil { + return nil, nil, err + } + + digest, size, err := v1.SHA256(bytes.NewReader(manifest)) + if err != nil { + return nil, nil, err + } + + mediaType := types.MediaType(resp.Header.Get("Content-Type")) + contentDigest, err := v1.NewHash(resp.Header.Get("Docker-Content-Digest")) + if err == nil && mediaType == types.DockerManifestSchema1Signed { + // If we can parse the digest from the header, and it's a signed schema 1 + // manifest, let's use that for the digest to appease older registries. + digest = contentDigest + } + + // Validate the digest matches what we asked for, if pulling by digest. + if dgst, ok := ref.(name.Digest); ok { + if digest.String() != dgst.DigestStr() { + return nil, nil, fmt.Errorf("manifest digest: %q does not match requested digest: %q for %q", digest, dgst.DigestStr(), ref) + } + } + + var artifactType string + mf, _ := v1.ParseManifest(bytes.NewReader(manifest)) + // Failing to parse as a manifest should just be ignored. + // The manifest might not be valid, and that's okay. + if mf != nil && !mf.Config.MediaType.IsConfig() { + artifactType = string(mf.Config.MediaType) + } + + // Do nothing for tags; I give up. + // + // We'd like to validate that the "Docker-Content-Digest" header matches what is returned by the registry, + // but so many registries implement this incorrectly that it's not worth checking. + // + // For reference: + // https://github.com/GoogleContainerTools/kaniko/issues/298 + + // Return all this info since we have to calculate it anyway. + desc := v1.Descriptor{ + Digest: digest, + Size: size, + MediaType: mediaType, + ArtifactType: artifactType, + } + + return manifest, &desc, nil +} + +func (f *fetcher) headManifest(ctx context.Context, ref name.Reference, acceptable []types.MediaType) (*v1.Descriptor, error) { + u := f.url("manifests", ref.Identifier()) + req, err := http.NewRequest(http.MethodHead, u.String(), nil) + if err != nil { + return nil, err + } + accept := []string{} + for _, mt := range acceptable { + accept = append(accept, string(mt)) + } + req.Header.Set("Accept", strings.Join(accept, ",")) + + resp, err := f.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if err := transport.CheckError(resp, http.StatusOK); err != nil { + return nil, err + } + + mth := resp.Header.Get("Content-Type") + if mth == "" { + return nil, fmt.Errorf("HEAD %s: response did not include Content-Type header", u.String()) + } + mediaType := types.MediaType(mth) + + size := resp.ContentLength + if size == -1 { + return nil, fmt.Errorf("GET %s: response did not include Content-Length header", u.String()) + } + + dh := resp.Header.Get("Docker-Content-Digest") + if dh == "" { + return nil, fmt.Errorf("HEAD %s: response did not include Docker-Content-Digest header", u.String()) + } + digest, err := v1.NewHash(dh) + if err != nil { + return nil, err + } + + // Validate the digest matches what we asked for, if pulling by digest. + if dgst, ok := ref.(name.Digest); ok { + if digest.String() != dgst.DigestStr() { + return nil, fmt.Errorf("manifest digest: %q does not match requested digest: %q for %q", digest, dgst.DigestStr(), ref) + } + } + + // Return all this info since we have to calculate it anyway. + return &v1.Descriptor{ + Digest: digest, + Size: size, + MediaType: mediaType, + }, nil +} + +func (f *fetcher) fetchBlob(ctx context.Context, size int64, h v1.Hash) (io.ReadCloser, error) { + u := f.url("blobs", h.String()) + req, err := http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return nil, err + } + + resp, err := f.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, redact.Error(err) + } + + if err := transport.CheckError(resp, http.StatusOK); err != nil { + resp.Body.Close() + return nil, err + } + + // Do whatever we can. + // If we have an expected size and Content-Length doesn't match, return an error. + // If we don't have an expected size and we do have a Content-Length, use Content-Length. + if hsize := resp.ContentLength; hsize != -1 { + if size == verify.SizeUnknown { + size = hsize + } else if hsize != size { + return nil, fmt.Errorf("GET %s: Content-Length header %d does not match expected size %d", u.String(), hsize, size) + } + } + + return verify.ReadCloser(resp.Body, size, h) +} + +func (f *fetcher) headBlob(ctx context.Context, h v1.Hash) (*http.Response, error) { + u := f.url("blobs", h.String()) + req, err := http.NewRequest(http.MethodHead, u.String(), nil) + if err != nil { + return nil, err + } + + resp, err := f.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, redact.Error(err) + } + + if err := transport.CheckError(resp, http.StatusOK); err != nil { + resp.Body.Close() + return nil, err + } + + return resp, nil +} + +func (f *fetcher) blobExists(ctx context.Context, h v1.Hash) (bool, error) { + u := f.url("blobs", h.String()) + req, err := http.NewRequest(http.MethodHead, u.String(), nil) + if err != nil { + return false, err + } + + resp, err := f.client.Do(req.WithContext(ctx)) + if err != nil { + return false, redact.Error(err) + } + defer resp.Body.Close() + + if err := transport.CheckError(resp, http.StatusOK, http.StatusNotFound); err != nil { + return false, err + } + + return resp.StatusCode == http.StatusOK, nil +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go index 4e17de76e8..f085967ed5 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go @@ -16,6 +16,7 @@ package remote import ( "bytes" + "context" "io" "net/http" "net/url" @@ -37,7 +38,9 @@ var acceptableImageMediaTypes = []types.MediaType{ // remoteImage accesses an image from a remote registry type remoteImage struct { - fetcher + fetcher fetcher + ref name.Reference + ctx context.Context manifestLock sync.Mutex // Protects manifest manifest []byte configLock sync.Mutex // Protects config @@ -46,6 +49,15 @@ type remoteImage struct { descriptor *v1.Descriptor } +func (r *remoteImage) ArtifactType() (string, error) { + // kind of a hack, but RawManifest does appropriate locking/memoization + // and makes sure r.descriptor is populated. + if _, err := r.RawManifest(); err != nil { + return "", err + } + return r.descriptor.ArtifactType, nil +} + var _ partial.CompressedImageCore = (*remoteImage)(nil) // Image provides access to a remote image reference. @@ -75,7 +87,7 @@ func (r *remoteImage) RawManifest() ([]byte, error) { // NOTE(jonjohnsonjr): We should never get here because the public entrypoints // do type-checking via remote.Descriptor. I've left this here for tests that // directly instantiate a remoteImage. - manifest, desc, err := r.fetchManifest(r.Ref, acceptableImageMediaTypes) + manifest, desc, err := r.fetcher.fetchManifest(r.ctx, r.ref, acceptableImageMediaTypes) if err != nil { return nil, err } @@ -108,7 +120,7 @@ func (r *remoteImage) RawConfigFile() ([]byte, error) { return r.config, nil } - body, err := r.fetchBlob(r.context, m.Config.Size, m.Config.Digest) + body, err := r.fetcher.fetchBlob(r.ctx, m.Config.Size, m.Config.Digest) if err != nil { return nil, err } @@ -130,9 +142,26 @@ func (r *remoteImage) Descriptor() (*v1.Descriptor, error) { return r.descriptor, err } +func (r *remoteImage) ConfigLayer() (v1.Layer, error) { + if _, err := r.RawManifest(); err != nil { + return nil, err + } + m, err := partial.Manifest(r) + if err != nil { + return nil, err + } + + return partial.CompressedToLayer(&remoteImageLayer{ + ri: r, + ctx: r.ctx, + digest: m.Config.Digest, + }) +} + // remoteImageLayer implements partial.CompressedLayer type remoteImageLayer struct { ri *remoteImage + ctx context.Context digest v1.Hash } @@ -143,7 +172,7 @@ func (rl *remoteImageLayer) Digest() (v1.Hash, error) { // Compressed implements partial.CompressedLayer func (rl *remoteImageLayer) Compressed() (io.ReadCloser, error) { - urls := []url.URL{rl.ri.url("blobs", rl.digest.String())} + urls := []url.URL{rl.ri.fetcher.url("blobs", rl.digest.String())} // Add alternative layer sources from URLs (usually none). d, err := partial.BlobDescriptor(rl, rl.digest) @@ -156,7 +185,7 @@ func (rl *remoteImageLayer) Compressed() (io.ReadCloser, error) { } // We don't want to log binary layers -- this can break terminals. - ctx := redact.NewContext(rl.ri.context, "omitting binary blobs from logs") + ctx := redact.NewContext(rl.ctx, "omitting binary blobs from logs") for _, s := range d.URLs { u, err := url.Parse(s) @@ -177,7 +206,7 @@ func (rl *remoteImageLayer) Compressed() (io.ReadCloser, error) { return nil, err } - resp, err := rl.ri.Client.Do(req.WithContext(ctx)) + resp, err := rl.ri.fetcher.Do(req.WithContext(ctx)) if err != nil { lastErr = err continue @@ -235,13 +264,14 @@ func (rl *remoteImageLayer) Descriptor() (*v1.Descriptor, error) { // See partial.Exists. func (rl *remoteImageLayer) Exists() (bool, error) { - return rl.ri.blobExists(rl.digest) + return rl.ri.fetcher.blobExists(rl.ri.ctx, rl.digest) } // LayerByDigest implements partial.CompressedLayer func (r *remoteImage) LayerByDigest(h v1.Hash) (partial.CompressedLayer, error) { return &remoteImageLayer{ ri: r, + ctx: r.ctx, digest: h, }, nil } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go index a4ee74c057..b80972c80e 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go @@ -16,6 +16,7 @@ package remote import ( "bytes" + "context" "fmt" "sync" @@ -33,7 +34,9 @@ var acceptableIndexMediaTypes = []types.MediaType{ // remoteIndex accesses an index from a remote registry type remoteIndex struct { - fetcher + fetcher fetcher + ref name.Reference + ctx context.Context manifestLock sync.Mutex // Protects manifest manifest []byte mediaType types.MediaType @@ -75,7 +78,7 @@ func (r *remoteIndex) RawManifest() ([]byte, error) { // NOTE(jonjohnsonjr): We should never get here because the public entrypoints // do type-checking via remote.Descriptor. I've left this here for tests that // directly instantiate a remoteIndex. - manifest, desc, err := r.fetchManifest(r.Ref, acceptableIndexMediaTypes) + manifest, desc, err := r.fetcher.fetchManifest(r.ctx, r.ref, acceptableIndexMediaTypes) if err != nil { return nil, err } @@ -133,6 +136,7 @@ func (r *remoteIndex) Layer(h v1.Hash) (v1.Layer, error) { if h == childDesc.Digest { l, err := partial.CompressedToLayer(&remoteLayer{ fetcher: r.fetcher, + ctx: r.ctx, digest: h, }) if err != nil { @@ -140,47 +144,13 @@ func (r *remoteIndex) Layer(h v1.Hash) (v1.Layer, error) { } return &MountableLayer{ Layer: l, - Reference: r.Ref.Context().Digest(h.String()), + Reference: r.ref.Context().Digest(h.String()), }, nil } } return nil, fmt.Errorf("layer not found: %s", h) } -// Experiment with a better API for v1.ImageIndex. We might want to move this -// to partial? -func (r *remoteIndex) Manifests() ([]partial.Describable, error) { - m, err := r.IndexManifest() - if err != nil { - return nil, err - } - manifests := []partial.Describable{} - for _, desc := range m.Manifests { - switch { - case desc.MediaType.IsImage(): - img, err := r.Image(desc.Digest) - if err != nil { - return nil, err - } - manifests = append(manifests, img) - case desc.MediaType.IsIndex(): - idx, err := r.ImageIndex(desc.Digest) - if err != nil { - return nil, err - } - manifests = append(manifests, idx) - default: - layer, err := r.Layer(desc.Digest) - if err != nil { - return nil, err - } - manifests = append(manifests, layer) - } - } - - return manifests, nil -} - func (r *remoteIndex) imageByPlatform(platform v1.Platform) (v1.Image, error) { desc, err := r.childByPlatform(platform) if err != nil { @@ -216,7 +186,7 @@ func (r *remoteIndex) childByPlatform(platform v1.Platform) (*Descriptor, error) return r.childDescriptor(childDesc, platform) } } - return nil, fmt.Errorf("no child with platform %+v in index %s", platform, r.Ref) + return nil, fmt.Errorf("no child with platform %+v in index %s", platform, r.ref) } func (r *remoteIndex) childByHash(h v1.Hash) (*Descriptor, error) { @@ -229,12 +199,12 @@ func (r *remoteIndex) childByHash(h v1.Hash) (*Descriptor, error) { return r.childDescriptor(childDesc, defaultPlatform) } } - return nil, fmt.Errorf("no child with digest %s in index %s", h, r.Ref) + return nil, fmt.Errorf("no child with digest %s in index %s", h, r.ref) } // Convert one of this index's child's v1.Descriptor into a remote.Descriptor, with the given platform option. func (r *remoteIndex) childDescriptor(child v1.Descriptor, platform v1.Platform) (*Descriptor, error) { - ref := r.Ref.Context().Digest(child.Digest.String()) + ref := r.ref.Context().Digest(child.Digest.String()) var ( manifest []byte err error @@ -245,17 +215,25 @@ func (r *remoteIndex) childDescriptor(child v1.Descriptor, platform v1.Platform) } manifest = child.Data } else { - manifest, _, err = r.fetchManifest(ref, []types.MediaType{child.MediaType}) + manifest, _, err = r.fetcher.fetchManifest(r.ctx, ref, []types.MediaType{child.MediaType}) if err != nil { return nil, err } } + + if child.MediaType.IsImage() { + mf, _ := v1.ParseManifest(bytes.NewReader(manifest)) + // Failing to parse as a manifest should just be ignored. + // The manifest might not be valid, and that's okay. + if mf != nil && !mf.Config.MediaType.IsConfig() { + child.ArtifactType = string(mf.Config.MediaType) + } + } + return &Descriptor{ - fetcher: fetcher{ - Ref: ref, - Client: r.Client, - context: r.context, - }, + ref: ref, + ctx: r.ctx, + fetcher: r.fetcher, Manifest: manifest, Descriptor: child, platform: platform, diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.go index b2126f599d..39c2059502 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.go @@ -15,32 +15,33 @@ package remote import ( + "context" "io" "github.com/google/go-containerregistry/internal/redact" "github.com/google/go-containerregistry/internal/verify" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/partial" "github.com/google/go-containerregistry/pkg/v1/types" ) // remoteImagelayer implements partial.CompressedLayer type remoteLayer struct { - fetcher - digest v1.Hash + ctx context.Context + fetcher fetcher + digest v1.Hash } // Compressed implements partial.CompressedLayer func (rl *remoteLayer) Compressed() (io.ReadCloser, error) { // We don't want to log binary layers -- this can break terminals. - ctx := redact.NewContext(rl.context, "omitting binary blobs from logs") - return rl.fetchBlob(ctx, verify.SizeUnknown, rl.digest) + ctx := redact.NewContext(rl.ctx, "omitting binary blobs from logs") + return rl.fetcher.fetchBlob(ctx, verify.SizeUnknown, rl.digest) } // Compressed implements partial.CompressedLayer func (rl *remoteLayer) Size() (int64, error) { - resp, err := rl.headBlob(rl.digest) + resp, err := rl.fetcher.headBlob(rl.ctx, rl.digest) if err != nil { return -1, err } @@ -60,7 +61,7 @@ func (rl *remoteLayer) MediaType() (types.MediaType, error) { // See partial.Exists. func (rl *remoteLayer) Exists() (bool, error) { - return rl.blobExists(rl.digest) + return rl.fetcher.blobExists(rl.ctx, rl.digest) } // Layer reads the given blob reference from a registry as a Layer. A blob @@ -68,27 +69,9 @@ func (rl *remoteLayer) Exists() (bool, error) { // digest of the blob to be read and the repository portion is the repo where // that blob lives. func Layer(ref name.Digest, options ...Option) (v1.Layer, error) { - o, err := makeOptions(ref.Context(), options...) + o, err := makeOptions(options...) if err != nil { return nil, err } - f, err := makeFetcher(ref, o) - if err != nil { - return nil, err - } - h, err := v1.NewHash(ref.Identifier()) - if err != nil { - return nil, err - } - l, err := partial.CompressedToLayer(&remoteLayer{ - fetcher: *f, - digest: h, - }) - if err != nil { - return nil, err - } - return &MountableLayer{ - Layer: l, - Reference: ref, - }, nil + return newPuller(o).Layer(o.context, ref) } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.go index e643c49aab..910d2a94c7 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.go @@ -26,11 +26,6 @@ import ( "github.com/google/go-containerregistry/pkg/v1/remote/transport" ) -type tags struct { - Name string `json:"name"` - Tags []string `json:"tags"` -} - // ListWithContext calls List with the given context. // // Deprecated: Use List and WithContext. This will be removed in a future release. @@ -41,73 +36,65 @@ func ListWithContext(ctx context.Context, repo name.Repository, options ...Optio // List calls /tags/list for the given repository, returning the list of tags // in the "tags" property. func List(repo name.Repository, options ...Option) ([]string, error) { - o, err := makeOptions(repo, options...) + o, err := makeOptions(options...) if err != nil { return nil, err } - scopes := []string{repo.Scope(transport.PullScope)} - tr, err := transport.NewWithContext(o.context, repo.Registry, o.auth, o.transport, scopes) + return newPuller(o).List(o.context, repo) +} + +type Tags struct { + Name string `json:"name"` + Tags []string `json:"tags"` + Next string `json:"next,omitempty"` +} + +func (f *fetcher) listPage(ctx context.Context, repo name.Repository, next string, pageSize int) (*Tags, error) { + if next == "" { + uri := &url.URL{ + Scheme: repo.Scheme(), + Host: repo.RegistryStr(), + Path: fmt.Sprintf("/v2/%s/tags/list", repo.RepositoryStr()), + } + if pageSize > 0 { + uri.RawQuery = fmt.Sprintf("n=%d", pageSize) + } + next = uri.String() + } + + req, err := http.NewRequestWithContext(ctx, "GET", next, nil) if err != nil { return nil, err } - uri := &url.URL{ - Scheme: repo.Registry.Scheme(), - Host: repo.Registry.RegistryStr(), - Path: fmt.Sprintf("/v2/%s/tags/list", repo.RepositoryStr()), + resp, err := f.client.Do(req) + if err != nil { + return nil, err } - if o.pageSize > 0 { - uri.RawQuery = fmt.Sprintf("n=%d", o.pageSize) + if err := transport.CheckError(resp, http.StatusOK); err != nil { + return nil, err } - client := http.Client{Transport: tr} - tagList := []string{} - parsed := tags{} - - // get responses until there is no next page - for { - select { - case <-o.context.Done(): - return nil, o.context.Err() - default: - } - - req, err := http.NewRequestWithContext(o.context, "GET", uri.String(), nil) - if err != nil { - return nil, err - } - - resp, err := client.Do(req) - if err != nil { - return nil, err - } - - if err := transport.CheckError(resp, http.StatusOK); err != nil { - return nil, err - } - - if err := json.NewDecoder(resp.Body).Decode(&parsed); err != nil { - return nil, err - } + parsed := Tags{} + if err := json.NewDecoder(resp.Body).Decode(&parsed); err != nil { + return nil, err + } - if err := resp.Body.Close(); err != nil { - return nil, err - } + if err := resp.Body.Close(); err != nil { + return nil, err + } - tagList = append(tagList, parsed.Tags...) + uri, err := getNextPageURL(resp) + if err != nil { + return nil, err + } - uri, err = getNextPageURL(resp) - if err != nil { - return nil, err - } - // no next page - if uri == nil { - break - } + if uri != nil { + parsed.Next = uri.String() } - return tagList, nil + return &parsed, nil } // getNextPageURL checks if there is a Link header in a http.Response which @@ -139,3 +126,27 @@ func getNextPageURL(resp *http.Response) (*url.URL, error) { linkURL = resp.Request.URL.ResolveReference(linkURL) return linkURL, nil } + +type Lister struct { + f *fetcher + repo name.Repository + pageSize int + + page *Tags + err error + + needMore bool +} + +func (l *Lister) Next(ctx context.Context) (*Tags, error) { + if l.needMore { + l.page, l.err = l.f.listPage(ctx, l.repo, l.page.Next, l.pageSize) + } else { + l.needMore = true + } + return l.page, l.err +} + +func (l *Lister) HasNext() bool { + return l.page != nil && (!l.needMore || l.page.Next != "") +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go index 7f32413cee..a6705de895 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go @@ -15,288 +15,32 @@ package remote import ( - "context" - "fmt" - "net/http" - "github.com/google/go-containerregistry/pkg/name" - v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/partial" - "github.com/google/go-containerregistry/pkg/v1/remote/transport" - "github.com/google/go-containerregistry/pkg/v1/types" "golang.org/x/sync/errgroup" ) // MultiWrite writes the given Images or ImageIndexes to the given refs, as -// efficiently as possible, by deduping shared layer blobs and uploading layers -// in parallel, then uploading all manifests in parallel. -// -// Current limitations: -// - All refs must share the same repository. -// - Images cannot consist of stream.Layers. -func MultiWrite(m map[name.Reference]Taggable, options ...Option) (rerr error) { - // Determine the repository being pushed to; if asked to push to - // multiple repositories, give up. - var repo, zero name.Repository - for ref := range m { - if repo == zero { - repo = ref.Context() - } else if ref.Context() != repo { - return fmt.Errorf("MultiWrite can only push to the same repository (saw %q and %q)", repo, ref.Context()) - } - } - - o, err := makeOptions(repo, options...) - if err != nil { - return err - } - - // Collect unique blobs (layers and config blobs). - blobs := map[v1.Hash]v1.Layer{} - newManifests := []map[name.Reference]Taggable{} - // Separate originally requested images and indexes, so we can push images first. - images, indexes := map[name.Reference]Taggable{}, map[name.Reference]Taggable{} - for ref, i := range m { - if img, ok := i.(v1.Image); ok { - images[ref] = i - if err := addImageBlobs(img, blobs, o.allowNondistributableArtifacts); err != nil { - return err - } - continue - } - if idx, ok := i.(v1.ImageIndex); ok { - indexes[ref] = i - newManifests, err = addIndexBlobs(idx, blobs, repo, newManifests, 0, o.allowNondistributableArtifacts) - if err != nil { - return err - } - continue - } - return fmt.Errorf("pushable resource was not Image or ImageIndex: %T", i) - } - - // Determine if any of the layers are Mountable, because if so we need - // to request Pull scope too. - ls := []v1.Layer{} - for _, l := range blobs { - ls = append(ls, l) - } - scopes := scopesForUploadingImage(repo, ls) - tr, err := transport.NewWithContext(o.context, repo.Registry, o.auth, o.transport, scopes) +// efficiently as possible, by deduping shared layer blobs while uploading them +// in parallel. +func MultiWrite(todo map[name.Reference]Taggable, options ...Option) (rerr error) { + o, err := makeOptions(options...) if err != nil { return err } - w := writer{ - repo: repo, - client: &http.Client{Transport: tr}, - backoff: o.retryBackoff, - predicate: o.retryPredicate, + if o.progress != nil { + defer func() { o.progress.Close(rerr) }() } + p := newPusher(o) - // Collect the total size of blobs and manifests we're about to write. - if o.updates != nil { - w.progress = &progress{updates: o.updates} - w.progress.lastUpdate = &v1.Update{} - defer close(o.updates) - defer func() { _ = w.progress.err(rerr) }() - for _, b := range blobs { - size, err := b.Size() - if err != nil { - return err - } - w.progress.total(size) - } - countManifest := func(t Taggable) error { - b, err := t.RawManifest() - if err != nil { - return err - } - w.progress.total(int64(len(b))) - return nil - } - for _, i := range images { - if err := countManifest(i); err != nil { - return err - } - } - for _, nm := range newManifests { - for _, i := range nm { - if err := countManifest(i); err != nil { - return err - } - } - } - for _, i := range indexes { - if err := countManifest(i); err != nil { - return err - } - } - } + g, ctx := errgroup.WithContext(o.context) + g.SetLimit(o.jobs) - // Upload individual blobs and collect any errors. - blobChan := make(chan v1.Layer, 2*o.jobs) - ctx := o.context - g, gctx := errgroup.WithContext(o.context) - for i := 0; i < o.jobs; i++ { - // Start N workers consuming blobs to upload. + for ref, t := range todo { + ref, t := ref, t g.Go(func() error { - for b := range blobChan { - if err := w.uploadOne(gctx, b); err != nil { - return err - } - } - return nil + return p.Push(ctx, ref, t) }) } - g.Go(func() error { - defer close(blobChan) - for _, b := range blobs { - select { - case blobChan <- b: - case <-gctx.Done(): - return gctx.Err() - } - } - return nil - }) - if err := g.Wait(); err != nil { - return err - } - - commitMany := func(ctx context.Context, m map[name.Reference]Taggable) error { - g, ctx := errgroup.WithContext(ctx) - // With all of the constituent elements uploaded, upload the manifests - // to commit the images and indexes, and collect any errors. - type task struct { - i Taggable - ref name.Reference - } - taskChan := make(chan task, 2*o.jobs) - for i := 0; i < o.jobs; i++ { - // Start N workers consuming tasks to upload manifests. - g.Go(func() error { - for t := range taskChan { - if err := w.commitManifest(ctx, t.i, t.ref); err != nil { - return err - } - } - return nil - }) - } - go func() { - for ref, i := range m { - taskChan <- task{i, ref} - } - close(taskChan) - }() - return g.Wait() - } - // Push originally requested image manifests. These have no - // dependencies. - if err := commitMany(ctx, images); err != nil { - return err - } - // Push new manifests from lowest levels up. - for i := len(newManifests) - 1; i >= 0; i-- { - if err := commitMany(ctx, newManifests[i]); err != nil { - return err - } - } - // Push originally requested index manifests, which might depend on - // newly discovered manifests. - - return commitMany(ctx, indexes) -} -// addIndexBlobs adds blobs to the set of blobs we intend to upload, and -// returns the latest copy of the ordered collection of manifests to upload. -func addIndexBlobs(idx v1.ImageIndex, blobs map[v1.Hash]v1.Layer, repo name.Repository, newManifests []map[name.Reference]Taggable, lvl int, allowNondistributableArtifacts bool) ([]map[name.Reference]Taggable, error) { - if lvl > len(newManifests)-1 { - newManifests = append(newManifests, map[name.Reference]Taggable{}) - } - - im, err := idx.IndexManifest() - if err != nil { - return nil, err - } - for _, desc := range im.Manifests { - switch desc.MediaType { - case types.OCIImageIndex, types.DockerManifestList: - idx, err := idx.ImageIndex(desc.Digest) - if err != nil { - return nil, err - } - newManifests, err = addIndexBlobs(idx, blobs, repo, newManifests, lvl+1, allowNondistributableArtifacts) - if err != nil { - return nil, err - } - - // Also track the sub-index manifest to upload later by digest. - newManifests[lvl][repo.Digest(desc.Digest.String())] = idx - case types.OCIManifestSchema1, types.DockerManifestSchema2: - img, err := idx.Image(desc.Digest) - if err != nil { - return nil, err - } - if err := addImageBlobs(img, blobs, allowNondistributableArtifacts); err != nil { - return nil, err - } - - // Also track the sub-image manifest to upload later by digest. - newManifests[lvl][repo.Digest(desc.Digest.String())] = img - default: - // Workaround for #819. - if wl, ok := idx.(withLayer); ok { - layer, err := wl.Layer(desc.Digest) - if err != nil { - return nil, err - } - if err := addLayerBlob(layer, blobs, allowNondistributableArtifacts); err != nil { - return nil, err - } - } else { - return nil, fmt.Errorf("unknown media type: %v", desc.MediaType) - } - } - } - return newManifests, nil -} - -func addLayerBlob(l v1.Layer, blobs map[v1.Hash]v1.Layer, allowNondistributableArtifacts bool) error { - // Ignore foreign layers. - mt, err := l.MediaType() - if err != nil { - return err - } - - if mt.IsDistributable() || allowNondistributableArtifacts { - d, err := l.Digest() - if err != nil { - return err - } - - blobs[d] = l - } - - return nil -} - -func addImageBlobs(img v1.Image, blobs map[v1.Hash]v1.Layer, allowNondistributableArtifacts bool) error { - ls, err := img.Layers() - if err != nil { - return err - } - // Collect all layers. - for _, l := range ls { - if err := addLayerBlob(l, blobs, allowNondistributableArtifacts); err != nil { - return err - } - } - - // Collect config blob. - cl, err := partial.ConfigLayer(img) - if err != nil { - return err - } - return addLayerBlob(cl, blobs, allowNondistributableArtifacts) + return g.Wait() } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go index 91b9005c99..a722c2ca62 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go @@ -37,15 +37,23 @@ type options struct { auth authn.Authenticator keychain authn.Keychain transport http.RoundTripper - platform v1.Platform context context.Context jobs int userAgent string allowNondistributableArtifacts bool - updates chan<- v1.Update - pageSize int + progress *progress retryBackoff Backoff retryPredicate retry.Predicate + retryStatusCodes []int + + // Only these options can overwrite Reuse()d options. + platform v1.Platform + pageSize int + filter map[string]string + + // Set by Reuse, we currently store one or the other. + puller *Puller + pusher *Pusher } var defaultPlatform = v1.Platform{ @@ -59,7 +67,7 @@ type Backoff = retry.Backoff var defaultRetryPredicate retry.Predicate = func(err error) bool { // Various failure modes here, as we're often reading from and writing to // the network. - if retry.IsTemporary(err) || errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF) || errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) { + if retry.IsTemporary(err) || errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF) || errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) || errors.Is(err, net.ErrClosed) { logs.Warn.Printf("retrying %v", err) return true } @@ -82,12 +90,13 @@ var fastBackoff = Backoff{ Steps: 3, } -var retryableStatusCodes = []int{ +var defaultRetryStatusCodes = []int{ http.StatusRequestTimeout, http.StatusInternalServerError, http.StatusBadGateway, http.StatusServiceUnavailable, http.StatusGatewayTimeout, + 499, } const ( @@ -111,17 +120,20 @@ var DefaultTransport http.RoundTripper = &http.Transport{ IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, + // We usually are dealing with 2 hosts (at most), split MaxIdleConns between them. + MaxIdleConnsPerHost: 50, } -func makeOptions(target authn.Resource, opts ...Option) (*options, error) { +func makeOptions(opts ...Option) (*options, error) { o := &options{ - transport: DefaultTransport, - platform: defaultPlatform, - context: context.Background(), - jobs: defaultJobs, - pageSize: defaultPageSize, - retryPredicate: defaultRetryPredicate, - retryBackoff: defaultRetryBackoff, + transport: DefaultTransport, + platform: defaultPlatform, + context: context.Background(), + jobs: defaultJobs, + pageSize: defaultPageSize, + retryPredicate: defaultRetryPredicate, + retryBackoff: defaultRetryBackoff, + retryStatusCodes: defaultRetryStatusCodes, } for _, option := range opts { @@ -135,12 +147,6 @@ func makeOptions(target authn.Resource, opts ...Option) (*options, error) { // It is a better experience to explicitly tell a caller their auth is misconfigured // than potentially fail silently when the correct auth is overridden by option misuse. return nil, errors.New("provide an option for either authn.Authenticator or authn.Keychain, not both") - case o.keychain != nil: - auth, err := o.keychain.Resolve(target) - if err != nil { - return nil, err - } - o.auth = auth case o.auth == nil: o.auth = authn.Anonymous } @@ -156,7 +162,7 @@ func makeOptions(target authn.Resource, opts ...Option) (*options, error) { } // Wrap the transport in something that can retry network flakes. - o.transport = transport.NewRetry(o.transport, transport.WithRetryPredicate(defaultRetryPredicate), transport.WithRetryStatusCodes(retryableStatusCodes...)) + o.transport = transport.NewRetry(o.transport, transport.WithRetryPredicate(defaultRetryPredicate), transport.WithRetryStatusCodes(o.retryStatusCodes...)) // Wrap this last to prevent transport.New from double-wrapping. if o.userAgent != "" { @@ -272,7 +278,8 @@ func WithNondistributable(o *options) error { // should provide a buffered channel to avoid potential deadlocks. func WithProgress(updates chan<- v1.Update) Option { return func(o *options) error { - o.updates = updates + o.progress = &progress{updates: updates} + o.progress.lastUpdate = &v1.Update{} return nil } } @@ -303,3 +310,39 @@ func WithRetryPredicate(predicate retry.Predicate) Option { return nil } } + +// WithRetryStatusCodes sets which http response codes will be retried. +func WithRetryStatusCodes(codes ...int) Option { + return func(o *options) error { + o.retryStatusCodes = codes + return nil + } +} + +// WithFilter sets the filter querystring for HTTP operations. +func WithFilter(key string, value string) Option { + return func(o *options) error { + if o.filter == nil { + o.filter = map[string]string{} + } + o.filter[key] = value + return nil + } +} + +// Reuse takes a Puller or Pusher and reuses it for remote interactions +// rather than starting from a clean slate. For example, it will reuse token exchanges +// when possible and avoid sending redundant HEAD requests. +// +// Reuse will take precedence over other options passed to most remote functions because +// most options deal with setting up auth and transports, which Reuse intetionally skips. +func Reuse[I *Puller | *Pusher](i I) Option { + return func(o *options) error { + if puller, ok := any(i).(*Puller); ok { + o.puller = puller + } else if pusher, ok := any(i).(*Pusher); ok { + o.pusher = pusher + } + return nil + } +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go index 1f4396350a..fe60c8c353 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go @@ -29,6 +29,8 @@ type progress struct { } func (p *progress) total(delta int64) { + p.Lock() + defer p.Unlock() atomic.AddInt64(&p.lastUpdate.Total, delta) } @@ -48,6 +50,11 @@ func (p *progress) err(err error) error { return err } +func (p *progress) Close(err error) { + _ = p.err(err) + close(p.updates) +} + type progressReader struct { rc io.ReadCloser diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.go new file mode 100644 index 0000000000..7da8017eec --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.go @@ -0,0 +1,222 @@ +// Copyright 2023 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "context" + "sync" + + "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/partial" + "github.com/google/go-containerregistry/pkg/v1/types" +) + +type Puller struct { + o *options + + // map[resource]*reader + readers sync.Map +} + +func NewPuller(options ...Option) (*Puller, error) { + o, err := makeOptions(options...) + if err != nil { + return nil, err + } + + return newPuller(o), nil +} + +func newPuller(o *options) *Puller { + if o.puller != nil { + return o.puller + } + return &Puller{ + o: o, + } +} + +type reader struct { + // in + target resource + o *options + + // f() + once sync.Once + + // out + f *fetcher + err error +} + +// this will run once per reader instance +func (r *reader) init(ctx context.Context) error { + r.once.Do(func() { + r.f, r.err = makeFetcher(ctx, r.target, r.o) + }) + return r.err +} + +func (p *Puller) fetcher(ctx context.Context, target resource) (*fetcher, error) { + v, _ := p.readers.LoadOrStore(target, &reader{ + target: target, + o: p.o, + }) + rr := v.(*reader) + return rr.f, rr.init(ctx) +} + +// Head is like remote.Head, but avoids re-authenticating when possible. +func (p *Puller) Head(ctx context.Context, ref name.Reference) (*v1.Descriptor, error) { + f, err := p.fetcher(ctx, ref.Context()) + if err != nil { + return nil, err + } + + return f.headManifest(ctx, ref, allManifestMediaTypes) +} + +// Get is like remote.Get, but avoids re-authenticating when possible. +func (p *Puller) Get(ctx context.Context, ref name.Reference) (*Descriptor, error) { + return p.get(ctx, ref, allManifestMediaTypes, p.o.platform) +} + +func (p *Puller) get(ctx context.Context, ref name.Reference, acceptable []types.MediaType, platform v1.Platform) (*Descriptor, error) { + f, err := p.fetcher(ctx, ref.Context()) + if err != nil { + return nil, err + } + return f.get(ctx, ref, acceptable, platform) +} + +// Layer is like remote.Layer, but avoids re-authenticating when possible. +func (p *Puller) Layer(ctx context.Context, ref name.Digest) (v1.Layer, error) { + f, err := p.fetcher(ctx, ref.Context()) + if err != nil { + return nil, err + } + + h, err := v1.NewHash(ref.Identifier()) + if err != nil { + return nil, err + } + l, err := partial.CompressedToLayer(&remoteLayer{ + fetcher: *f, + ctx: ctx, + digest: h, + }) + if err != nil { + return nil, err + } + return &MountableLayer{ + Layer: l, + Reference: ref, + }, nil +} + +// List lists tags in a repo and handles pagination, returning the full list of tags. +func (p *Puller) List(ctx context.Context, repo name.Repository) ([]string, error) { + lister, err := p.Lister(ctx, repo) + if err != nil { + return nil, err + } + + tagList := []string{} + for lister.HasNext() { + tags, err := lister.Next(ctx) + if err != nil { + return nil, err + } + tagList = append(tagList, tags.Tags...) + } + + return tagList, nil +} + +// Lister lists tags in a repo and returns a Lister for paginating through the results. +func (p *Puller) Lister(ctx context.Context, repo name.Repository) (*Lister, error) { + return p.lister(ctx, repo, p.o.pageSize) +} + +func (p *Puller) lister(ctx context.Context, repo name.Repository, pageSize int) (*Lister, error) { + f, err := p.fetcher(ctx, repo) + if err != nil { + return nil, err + } + page, err := f.listPage(ctx, repo, "", pageSize) + if err != nil { + return nil, err + } + return &Lister{ + f: f, + repo: repo, + pageSize: pageSize, + page: page, + err: err, + }, nil +} + +// Catalog lists repos in a registry and handles pagination, returning the full list of repos. +func (p *Puller) Catalog(ctx context.Context, reg name.Registry) ([]string, error) { + return p.catalog(ctx, reg, p.o.pageSize) +} + +func (p *Puller) catalog(ctx context.Context, reg name.Registry, pageSize int) ([]string, error) { + catalogger, err := p.catalogger(ctx, reg, pageSize) + if err != nil { + return nil, err + } + repoList := []string{} + for catalogger.HasNext() { + repos, err := catalogger.Next(ctx) + if err != nil { + return nil, err + } + repoList = append(repoList, repos.Repos...) + } + return repoList, nil +} + +// Catalogger lists repos in a registry and returns a Catalogger for paginating through the results. +func (p *Puller) Catalogger(ctx context.Context, reg name.Registry) (*Catalogger, error) { + return p.catalogger(ctx, reg, p.o.pageSize) +} + +func (p *Puller) catalogger(ctx context.Context, reg name.Registry, pageSize int) (*Catalogger, error) { + f, err := p.fetcher(ctx, reg) + if err != nil { + return nil, err + } + page, err := f.catalogPage(ctx, reg, "", pageSize) + if err != nil { + return nil, err + } + return &Catalogger{ + f: f, + reg: reg, + pageSize: pageSize, + page: page, + err: err, + }, nil +} + +func (p *Puller) referrers(ctx context.Context, d name.Digest, filter map[string]string) (v1.ImageIndex, error) { + f, err := p.fetcher(ctx, d.Context()) + if err != nil { + return nil, err + } + return f.fetchReferrers(ctx, filter, d) +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.go new file mode 100644 index 0000000000..1c07bd4759 --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.go @@ -0,0 +1,559 @@ +// Copyright 2023 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "bytes" + "context" + "errors" + "fmt" + "net/http" + "net/url" + "sync" + + "github.com/google/go-containerregistry/pkg/logs" + "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/partial" + "github.com/google/go-containerregistry/pkg/v1/remote/transport" + "github.com/google/go-containerregistry/pkg/v1/stream" + "github.com/google/go-containerregistry/pkg/v1/types" + "golang.org/x/sync/errgroup" +) + +type manifest interface { + Taggable + partial.Describable +} + +// key is either v1.Hash or v1.Layer (for stream.Layer) +type workers struct { + // map[v1.Hash|v1.Layer]*sync.Once + onces sync.Map + + // map[v1.Hash|v1.Layer]error + errors sync.Map +} + +func nop() error { + return nil +} + +func (w *workers) err(digest v1.Hash) error { + v, ok := w.errors.Load(digest) + if !ok || v == nil { + return nil + } + return v.(error) +} + +func (w *workers) Do(digest v1.Hash, f func() error) error { + // We don't care if it was loaded or not because the sync.Once will do it for us. + once, _ := w.onces.LoadOrStore(digest, &sync.Once{}) + + once.(*sync.Once).Do(func() { + w.errors.Store(digest, f()) + }) + + err := w.err(digest) + if err != nil { + // Allow this to be retried by another caller. + w.onces.Delete(digest) + } + return err +} + +func (w *workers) Stream(layer v1.Layer, f func() error) error { + // We don't care if it was loaded or not because the sync.Once will do it for us. + once, _ := w.onces.LoadOrStore(layer, &sync.Once{}) + + once.(*sync.Once).Do(func() { + w.errors.Store(layer, f()) + }) + + v, ok := w.errors.Load(layer) + if !ok || v == nil { + return nil + } + + return v.(error) +} + +type Pusher struct { + o *options + + // map[name.Repository]*repoWriter + writers sync.Map +} + +func NewPusher(options ...Option) (*Pusher, error) { + o, err := makeOptions(options...) + if err != nil { + return nil, err + } + + return newPusher(o), nil +} + +func newPusher(o *options) *Pusher { + if o.pusher != nil { + return o.pusher + } + return &Pusher{ + o: o, + } +} + +func (p *Pusher) writer(ctx context.Context, repo name.Repository, o *options) (*repoWriter, error) { + v, _ := p.writers.LoadOrStore(repo, &repoWriter{ + repo: repo, + o: o, + }) + rw := v.(*repoWriter) + return rw, rw.init(ctx) +} + +func (p *Pusher) Push(ctx context.Context, ref name.Reference, t Taggable) error { + w, err := p.writer(ctx, ref.Context(), p.o) + if err != nil { + return err + } + return w.writeManifest(ctx, ref, t) +} + +func (p *Pusher) Upload(ctx context.Context, repo name.Repository, l v1.Layer) error { + w, err := p.writer(ctx, repo, p.o) + if err != nil { + return err + } + return w.writeLayer(ctx, l) +} + +func (p *Pusher) Delete(ctx context.Context, ref name.Reference) error { + w, err := p.writer(ctx, ref.Context(), p.o) + if err != nil { + return err + } + + u := url.URL{ + Scheme: ref.Context().Registry.Scheme(), + Host: ref.Context().RegistryStr(), + Path: fmt.Sprintf("/v2/%s/manifests/%s", ref.Context().RepositoryStr(), ref.Identifier()), + } + + req, err := http.NewRequest(http.MethodDelete, u.String(), nil) + if err != nil { + return err + } + + resp, err := w.w.client.Do(req.WithContext(ctx)) + if err != nil { + return err + } + defer resp.Body.Close() + + return transport.CheckError(resp, http.StatusOK, http.StatusAccepted) + + // TODO(jason): If the manifest had a `subject`, and if the registry + // doesn't support Referrers, update the index pointed to by the + // subject's fallback tag to remove the descriptor for this manifest. +} + +type repoWriter struct { + repo name.Repository + o *options + once sync.Once + + w *writer + err error + + work *workers +} + +// this will run once per repoWriter instance +func (rw *repoWriter) init(ctx context.Context) error { + rw.once.Do(func() { + rw.work = &workers{} + rw.w, rw.err = makeWriter(ctx, rw.repo, nil, rw.o) + }) + return rw.err +} + +func (rw *repoWriter) writeDeps(ctx context.Context, m manifest) error { + if img, ok := m.(v1.Image); ok { + return rw.writeLayers(ctx, img) + } + + if idx, ok := m.(v1.ImageIndex); ok { + return rw.writeChildren(ctx, idx) + } + + // This has no deps, not an error (e.g. something you want to just PUT). + return nil +} + +type describable struct { + desc v1.Descriptor +} + +func (d describable) Digest() (v1.Hash, error) { + return d.desc.Digest, nil +} + +func (d describable) Size() (int64, error) { + return d.desc.Size, nil +} + +func (d describable) MediaType() (types.MediaType, error) { + return d.desc.MediaType, nil +} + +type tagManifest struct { + Taggable + partial.Describable +} + +func taggableToManifest(t Taggable) (manifest, error) { + if m, ok := t.(manifest); ok { + return m, nil + } + + if d, ok := t.(*Descriptor); ok { + if d.MediaType.IsIndex() { + return d.ImageIndex() + } + + if d.MediaType.IsImage() { + return d.Image() + } + + if d.MediaType.IsSchema1() { + return d.Schema1() + } + + return tagManifest{t, describable{d.toDesc()}}, nil + } + + desc := v1.Descriptor{ + // A reasonable default if Taggable doesn't implement MediaType. + MediaType: types.DockerManifestSchema2, + } + + b, err := t.RawManifest() + if err != nil { + return nil, err + } + + if wmt, ok := t.(withMediaType); ok { + desc.MediaType, err = wmt.MediaType() + if err != nil { + return nil, err + } + } + + desc.Digest, desc.Size, err = v1.SHA256(bytes.NewReader(b)) + if err != nil { + return nil, err + } + + return tagManifest{t, describable{desc}}, nil +} + +func (rw *repoWriter) writeManifest(ctx context.Context, ref name.Reference, t Taggable) error { + m, err := taggableToManifest(t) + if err != nil { + return err + } + + needDeps := true + + digest, err := m.Digest() + if errors.Is(err, stream.ErrNotComputed) { + if err := rw.writeDeps(ctx, m); err != nil { + return err + } + + needDeps = false + + digest, err = m.Digest() + if err != nil { + return err + } + } else if err != nil { + return err + } + + // This may be a lazy child where we have no ref until digest is computed. + if ref == nil { + ref = rw.repo.Digest(digest.String()) + } + + // For tags, we want to do this check outside of our Work.Do closure because + // we don't want to dedupe based on the manifest digest. + _, byTag := ref.(name.Tag) + if byTag { + if exists, err := rw.manifestExists(ctx, ref, t); err != nil { + return err + } else if exists { + return nil + } + } + + // The following work.Do will get deduped by digest, so it won't happen unless + // this tag happens to be the first commitManifest to run for that digest. + needPut := byTag + + if err := rw.work.Do(digest, func() error { + if !byTag { + if exists, err := rw.manifestExists(ctx, ref, t); err != nil { + return err + } else if exists { + return nil + } + } + + if needDeps { + if err := rw.writeDeps(ctx, m); err != nil { + return err + } + } + + needPut = false + return rw.commitManifest(ctx, ref, m) + }); err != nil { + return err + } + + if !needPut { + return nil + } + + // Only runs for tags that got deduped by digest. + return rw.commitManifest(ctx, ref, m) +} + +func (rw *repoWriter) writeChildren(ctx context.Context, idx v1.ImageIndex) error { + children, err := partial.Manifests(idx) + if err != nil { + return err + } + + g, ctx := errgroup.WithContext(ctx) + g.SetLimit(rw.o.jobs) + + for _, child := range children { + child := child + if err := rw.writeChild(ctx, child, g); err != nil { + return err + } + } + + return g.Wait() +} + +func (rw *repoWriter) writeChild(ctx context.Context, child partial.Describable, g *errgroup.Group) error { + switch child := child.(type) { + case v1.ImageIndex: + // For recursive index, we want to do a depth-first launching of goroutines + // to avoid deadlocking. + // + // Note that this is rare, so the impact of this should be really small. + return rw.writeManifest(ctx, nil, child) + case v1.Image: + g.Go(func() error { + return rw.writeManifest(ctx, nil, child) + }) + case v1.Layer: + g.Go(func() error { + return rw.writeLayer(ctx, child) + }) + default: + // This can't happen. + return fmt.Errorf("encountered unknown child: %T", child) + } + return nil +} + +// TODO: Consider caching some representation of the tags/digests in the destination +// repository as a hint to avoid this optimistic check in cases where we will most +// likely have to do a PUT anyway, e.g. if we are overwriting a tag we just wrote. +func (rw *repoWriter) manifestExists(ctx context.Context, ref name.Reference, t Taggable) (bool, error) { + f := &fetcher{ + target: ref.Context(), + client: rw.w.client, + } + + m, err := taggableToManifest(t) + if err != nil { + return false, err + } + + digest, err := m.Digest() + if err != nil { + // Possibly due to streaming layers. + return false, nil + } + got, err := f.headManifest(ctx, ref, allManifestMediaTypes) + if err != nil { + var terr *transport.Error + if errors.As(err, &terr) { + if terr.StatusCode == http.StatusNotFound { + return false, nil + } + + // We treat a 403 here as non-fatal because this existence check is an optimization and + // some registries will return a 403 instead of a 404 in certain situations. + // E.g. https://jfrog.atlassian.net/browse/RTFACT-13797 + if terr.StatusCode == http.StatusForbidden { + logs.Debug.Printf("manifestExists unexpected 403: %v", err) + return false, nil + } + } + + return false, err + } + + if digest != got.Digest { + // Mark that we saw this digest in the registry so we don't have to check it again. + rw.work.Do(got.Digest, nop) + + return false, nil + } + + if tag, ok := ref.(name.Tag); ok { + logs.Progress.Printf("existing manifest: %s@%s", tag.Identifier(), got.Digest) + } else { + logs.Progress.Print("existing manifest: ", got.Digest) + } + + return true, nil +} + +func (rw *repoWriter) commitManifest(ctx context.Context, ref name.Reference, m manifest) error { + if rw.o.progress != nil { + size, err := m.Size() + if err != nil { + return err + } + rw.o.progress.total(size) + } + + return rw.w.commitManifest(ctx, m, ref) +} + +func (rw *repoWriter) writeLayers(pctx context.Context, img v1.Image) error { + ls, err := img.Layers() + if err != nil { + return err + } + + g, ctx := errgroup.WithContext(pctx) + g.SetLimit(rw.o.jobs) + + for _, l := range ls { + l := l + + g.Go(func() error { + return rw.writeLayer(ctx, l) + }) + } + + mt, err := img.MediaType() + if err != nil { + return err + } + + if mt.IsSchema1() { + return g.Wait() + } + + cl, err := partial.ConfigLayer(img) + if errors.Is(err, stream.ErrNotComputed) { + if err := g.Wait(); err != nil { + return err + } + + cl, err := partial.ConfigLayer(img) + if err != nil { + return err + } + + return rw.writeLayer(pctx, cl) + } else if err != nil { + return err + } + + g.Go(func() error { + return rw.writeLayer(ctx, cl) + }) + + return g.Wait() +} + +func (rw *repoWriter) writeLayer(ctx context.Context, l v1.Layer) error { + // Skip any non-distributable things. + mt, err := l.MediaType() + if err != nil { + return err + } + if !mt.IsDistributable() && !rw.o.allowNondistributableArtifacts { + return nil + } + + digest, err := l.Digest() + if err != nil { + if errors.Is(err, stream.ErrNotComputed) { + return rw.lazyWriteLayer(ctx, l) + } + return err + } + + return rw.work.Do(digest, func() error { + if rw.o.progress != nil { + size, err := l.Size() + if err != nil { + return err + } + rw.o.progress.total(size) + } + return rw.w.uploadOne(ctx, l) + }) +} + +func (rw *repoWriter) lazyWriteLayer(ctx context.Context, l v1.Layer) error { + return rw.work.Stream(l, func() error { + if err := rw.w.uploadOne(ctx, l); err != nil { + return err + } + + // Mark this upload completed. + digest, err := l.Digest() + if err != nil { + return err + } + + rw.work.Do(digest, nop) + + if rw.o.progress != nil { + size, err := l.Size() + if err != nil { + return err + } + rw.o.progress.total(size) + } + + return nil + }) +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/referrers.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/referrers.go new file mode 100644 index 0000000000..e30ca57ed8 --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/referrers.go @@ -0,0 +1,117 @@ +// Copyright 2023 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "bytes" + "context" + "errors" + "io" + "net/http" + "strings" + + "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/empty" + "github.com/google/go-containerregistry/pkg/v1/mutate" + "github.com/google/go-containerregistry/pkg/v1/remote/transport" + "github.com/google/go-containerregistry/pkg/v1/types" +) + +// Referrers returns a list of descriptors that refer to the given manifest digest. +// +// The subject manifest doesn't have to exist in the registry for there to be descriptors that refer to it. +func Referrers(d name.Digest, options ...Option) (v1.ImageIndex, error) { + o, err := makeOptions(options...) + if err != nil { + return nil, err + } + return newPuller(o).referrers(o.context, d, o.filter) +} + +// https://github.com/opencontainers/distribution-spec/blob/main/spec.md#referrers-tag-schema +func fallbackTag(d name.Digest) name.Tag { + return d.Context().Tag(strings.Replace(d.DigestStr(), ":", "-", 1)) +} + +func (f *fetcher) fetchReferrers(ctx context.Context, filter map[string]string, d name.Digest) (v1.ImageIndex, error) { + // Check the Referrers API endpoint first. + u := f.url("referrers", d.DigestStr()) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + return nil, err + } + req.Header.Set("Accept", string(types.OCIImageIndex)) + + resp, err := f.client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if err := transport.CheckError(resp, http.StatusOK, http.StatusNotFound, http.StatusBadRequest); err != nil { + return nil, err + } + + var b []byte + if resp.StatusCode == http.StatusOK { + b, err = io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + } else { + // The registry doesn't support the Referrers API endpoint, so we'll use the fallback tag scheme. + b, _, err = f.fetchManifest(ctx, fallbackTag(d), []types.MediaType{types.OCIImageIndex}) + var terr *transport.Error + if errors.As(err, &terr) && terr.StatusCode == http.StatusNotFound { + // Not found just means there are no attachments yet. Start with an empty manifest. + return empty.Index, nil + } else if err != nil { + return nil, err + } + } + + h, sz, err := v1.SHA256(bytes.NewReader(b)) + if err != nil { + return nil, err + } + idx := &remoteIndex{ + fetcher: *f, + ctx: ctx, + manifest: b, + mediaType: types.OCIImageIndex, + descriptor: &v1.Descriptor{ + Digest: h, + MediaType: types.OCIImageIndex, + Size: sz, + }, + } + return filterReferrersResponse(filter, idx), nil +} + +// If filter applied, filter out by artifactType. +// See https://github.com/opencontainers/distribution-spec/blob/main/spec.md#listing-referrers +func filterReferrersResponse(filter map[string]string, in v1.ImageIndex) v1.ImageIndex { + if filter == nil { + return in + } + v, ok := filter["artifactType"] + if !ok { + return in + } + return mutate.RemoveManifests(in, func(desc v1.Descriptor) bool { + return desc.ArtifactType != v + }) +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.go new file mode 100644 index 0000000000..4bc1c4c457 --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.go @@ -0,0 +1,118 @@ +// Copyright 2023 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "bytes" + "context" + "encoding/json" + + "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/partial" + "github.com/google/go-containerregistry/pkg/v1/types" +) + +type schema1 struct { + ref name.Reference + ctx context.Context + fetcher fetcher + manifest []byte + mediaType types.MediaType + descriptor *v1.Descriptor +} + +func (s *schema1) Layers() ([]v1.Layer, error) { + m := schema1Manifest{} + if err := json.NewDecoder(bytes.NewReader(s.manifest)).Decode(&m); err != nil { + return nil, err + } + + layers := []v1.Layer{} + for i := len(m.FSLayers) - 1; i >= 0; i-- { + fsl := m.FSLayers[i] + + h, err := v1.NewHash(fsl.BlobSum) + if err != nil { + return nil, err + } + l, err := s.LayerByDigest(h) + if err != nil { + return nil, err + } + layers = append(layers, l) + } + + return layers, nil +} + +func (s *schema1) MediaType() (types.MediaType, error) { + return s.mediaType, nil +} + +func (s *schema1) Size() (int64, error) { + return s.descriptor.Size, nil +} + +func (s *schema1) ConfigName() (v1.Hash, error) { + return partial.ConfigName(s) +} + +func (s *schema1) ConfigFile() (*v1.ConfigFile, error) { + return nil, newErrSchema1(s.mediaType) +} + +func (s *schema1) RawConfigFile() ([]byte, error) { + return []byte("{}"), nil +} + +func (s *schema1) Digest() (v1.Hash, error) { + return s.descriptor.Digest, nil +} + +func (s *schema1) Manifest() (*v1.Manifest, error) { + return nil, newErrSchema1(s.mediaType) +} + +func (s *schema1) RawManifest() ([]byte, error) { + return s.manifest, nil +} + +func (s *schema1) LayerByDigest(h v1.Hash) (v1.Layer, error) { + l, err := partial.CompressedToLayer(&remoteLayer{ + fetcher: s.fetcher, + ctx: s.ctx, + digest: h, + }) + if err != nil { + return nil, err + } + return &MountableLayer{ + Layer: l, + Reference: s.ref.Context().Digest(h.String()), + }, nil +} + +func (s *schema1) LayerByDiffID(v1.Hash) (v1.Layer, error) { + return nil, newErrSchema1(s.mediaType) +} + +type fslayer struct { + BlobSum string `json:"blobSum"` +} + +type schema1Manifest struct { + FSLayers []fslayer `json:"fsLayers"` +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go index c0e4337300..482a4adee7 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go @@ -34,6 +34,9 @@ type Error struct { Request *http.Request // The raw body if we couldn't understand it. rawBody string + + // Bit of a hack to make it easier to force a retry. + temporary bool } // Check that Error implements error @@ -72,6 +75,10 @@ func (e *Error) responseErr() string { // Temporary returns whether the request that preceded the error is temporary. func (e *Error) Temporary() bool { + if e.temporary { + return true + } + if len(e.Errors) == 0 { _, ok := temporaryStatusCodes[e.StatusCode] return ok @@ -153,21 +160,37 @@ func CheckError(resp *http.Response, codes ...int) error { return nil } } + b, err := io.ReadAll(resp.Body) if err != nil { return err } + return makeError(resp, b) +} + +func makeError(resp *http.Response, body []byte) *Error { // https://github.com/docker/distribution/blob/master/docs/spec/api.md#errors structuredError := &Error{} // This can fail if e.g. the response body is not valid JSON. That's fine, // we'll construct an appropriate error string from the body and status code. - _ = json.Unmarshal(b, structuredError) + _ = json.Unmarshal(body, structuredError) - structuredError.rawBody = string(b) + structuredError.rawBody = string(body) structuredError.StatusCode = resp.StatusCode structuredError.Request = resp.Request return structuredError } + +func retryError(resp *http.Response) error { + b, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + rerr := makeError(resp, b) + rerr.temporary = true + return rerr +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go index e5621e3053..093f55d02f 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go @@ -100,7 +100,7 @@ func (t *retryTransport) RoundTrip(in *http.Request) (out *http.Response, err er if out != nil { for _, code := range t.codes { if out.StatusCode == code { - return CheckError(out) + return retryError(out) } } } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go index 99e9fe837b..f4369e2a07 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go @@ -17,23 +17,25 @@ package remote import ( "bytes" "context" + "encoding/json" "errors" "fmt" "io" "net/http" "net/url" + "sort" "strings" + "sync" "github.com/google/go-containerregistry/internal/redact" "github.com/google/go-containerregistry/internal/retry" + "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/logs" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/partial" "github.com/google/go-containerregistry/pkg/v1/remote/transport" "github.com/google/go-containerregistry/pkg/v1/stream" "github.com/google/go-containerregistry/pkg/v1/types" - "golang.org/x/sync/errgroup" ) // Taggable is an interface that enables a manifest PUT (e.g. for tagging). @@ -43,146 +45,101 @@ type Taggable interface { // Write pushes the provided img to the specified image reference. func Write(ref name.Reference, img v1.Image, options ...Option) (rerr error) { - o, err := makeOptions(ref.Context(), options...) + o, err := makeOptions(options...) if err != nil { return err } + if o.progress != nil { + defer func() { o.progress.Close(rerr) }() + } + return newPusher(o).Push(o.context, ref, img) +} + +// writer writes the elements of an image to a remote image reference. +type writer struct { + repo name.Repository + auth authn.Authenticator + transport http.RoundTripper + + client *http.Client + + progress *progress + backoff Backoff + predicate retry.Predicate - var p *progress - if o.updates != nil { - p = &progress{updates: o.updates} - p.lastUpdate = &v1.Update{} - p.lastUpdate.Total, err = countImage(img, o.allowNondistributableArtifacts) + scopeLock sync.Mutex + // Keep track of scopes that we have already requested. + scopeSet map[string]struct{} + scopes []string +} + +func makeWriter(ctx context.Context, repo name.Repository, ls []v1.Layer, o *options) (*writer, error) { + auth := o.auth + if o.keychain != nil { + kauth, err := o.keychain.Resolve(repo) if err != nil { - return err + return nil, err } - defer close(o.updates) - defer func() { _ = p.err(rerr) }() + auth = kauth } - return writeImage(o.context, ref, img, o, p) -} - -func writeImage(ctx context.Context, ref name.Reference, img v1.Image, o *options, progress *progress) error { - ls, err := img.Layers() + scopes := scopesForUploadingImage(repo, ls) + tr, err := transport.NewWithContext(ctx, repo.Registry, auth, o.transport, scopes) if err != nil { - return err + return nil, err } - scopes := scopesForUploadingImage(ref.Context(), ls) - tr, err := transport.NewWithContext(o.context, ref.Context().Registry, o.auth, o.transport, scopes) - if err != nil { - return err + + scopeSet := map[string]struct{}{} + for _, scope := range scopes { + scopeSet[scope] = struct{}{} } - w := writer{ - repo: ref.Context(), + return &writer{ + repo: repo, client: &http.Client{Transport: tr}, - progress: progress, + auth: auth, + transport: o.transport, + progress: o.progress, backoff: o.retryBackoff, predicate: o.retryPredicate, - } + scopes: scopes, + scopeSet: scopeSet, + }, nil +} - // Upload individual blobs and collect any errors. - blobChan := make(chan v1.Layer, 2*o.jobs) - g, gctx := errgroup.WithContext(ctx) - for i := 0; i < o.jobs; i++ { - // Start N workers consuming blobs to upload. - g.Go(func() error { - for b := range blobChan { - if err := w.uploadOne(gctx, b); err != nil { - return err - } - } - return nil - }) +// url returns a url.Url for the specified path in the context of this remote image reference. +func (w *writer) url(path string) url.URL { + return url.URL{ + Scheme: w.repo.Registry.Scheme(), + Host: w.repo.RegistryStr(), + Path: path, } +} - // Upload individual layers in goroutines and collect any errors. - // If we can dedupe by the layer digest, try to do so. If we can't determine - // the digest for whatever reason, we can't dedupe and might re-upload. - g.Go(func() error { - defer close(blobChan) - uploaded := map[v1.Hash]bool{} - for _, l := range ls { - l := l +func (w *writer) maybeUpdateScopes(ctx context.Context, ml *MountableLayer) error { + if ml.Reference.Context().String() == w.repo.String() { + return nil + } + if ml.Reference.Context().Registry.String() != w.repo.Registry.String() { + return nil + } - // Handle foreign layers. - mt, err := l.MediaType() - if err != nil { - return err - } - if !mt.IsDistributable() && !o.allowNondistributableArtifacts { - continue - } + scope := ml.Reference.Scope(transport.PullScope) - // Streaming layers calculate their digests while uploading them. Assume - // an error here indicates we need to upload the layer. - h, err := l.Digest() - if err == nil { - // If we can determine the layer's digest ahead of - // time, use it to dedupe uploads. - if uploaded[h] { - continue // Already uploading. - } - uploaded[h] = true - } - select { - case blobChan <- l: - case <-gctx.Done(): - return gctx.Err() - } - } - return nil - }) + w.scopeLock.Lock() + defer w.scopeLock.Unlock() - if l, err := partial.ConfigLayer(img); err != nil { - // We can't read the ConfigLayer, possibly because of streaming layers, - // since the layer DiffIDs haven't been calculated yet. Attempt to wait - // for the other layers to be uploaded, then try the config again. - if err := g.Wait(); err != nil { - return err - } + if _, ok := w.scopeSet[scope]; !ok { + w.scopeSet[scope] = struct{}{} + w.scopes = append(w.scopes, scope) - // Now that all the layers are uploaded, try to upload the config file blob. - l, err := partial.ConfigLayer(img) + logs.Debug.Printf("Refreshing token to add scope %q", scope) + wt, err := transport.NewWithContext(ctx, w.repo.Registry, w.auth, w.transport, w.scopes) if err != nil { return err } - if err := w.uploadOne(ctx, l); err != nil { - return err - } - } else { - // We *can* read the ConfigLayer, so upload it concurrently with the layers. - g.Go(func() error { - return w.uploadOne(gctx, l) - }) - - // Wait for the layers + config. - if err := g.Wait(); err != nil { - return err - } + w.client = &http.Client{Transport: wt} } - // With all of the constituent elements uploaded, upload the manifest - // to commit the image. - return w.commitManifest(ctx, img, ref) -} - -// writer writes the elements of an image to a remote image reference. -type writer struct { - repo name.Repository - client *http.Client - - progress *progress - backoff Backoff - predicate retry.Predicate -} - -// url returns a url.Url for the specified path in the context of this remote image reference. -func (w *writer) url(path string) url.URL { - return url.URL{ - Scheme: w.repo.Registry.Scheme(), - Host: w.repo.RegistryStr(), - Path: path, - } + return nil } // nextLocation extracts the fully-qualified URL to which we should send the next request in an upload sequence. @@ -226,30 +183,6 @@ func (w *writer) checkExistingBlob(ctx context.Context, h v1.Hash) (bool, error) return resp.StatusCode == http.StatusOK, nil } -// checkExistingManifest checks if a manifest exists already in the repository -// by making a HEAD request to the manifest API. -func (w *writer) checkExistingManifest(ctx context.Context, h v1.Hash, mt types.MediaType) (bool, error) { - u := w.url(fmt.Sprintf("/v2/%s/manifests/%s", w.repo.RepositoryStr(), h.String())) - - req, err := http.NewRequest(http.MethodHead, u.String(), nil) - if err != nil { - return false, err - } - req.Header.Set("Accept", string(mt)) - - resp, err := w.client.Do(req.WithContext(ctx)) - if err != nil { - return false, err - } - defer resp.Body.Close() - - if err := transport.CheckError(resp, http.StatusOK, http.StatusNotFound); err != nil { - return false, err - } - - return resp.StatusCode == http.StatusOK, nil -} - // initiateUpload initiates the blob upload, which starts with a POST that can // optionally include the hash of the layer and a list of repositories from // which that layer might be read. On failure, an error is returned. @@ -277,6 +210,11 @@ func (w *writer) initiateUpload(ctx context.Context, from, mount, origin string) req.Header.Set("Content-Type", "application/json") resp, err := w.client.Do(req.WithContext(ctx)) if err != nil { + if origin != "" && origin != w.repo.RegistryStr() { + // https://github.com/google/go-containerregistry/issues/1679 + logs.Warn.Printf("retrying without mount: %v", err) + return w.initiateUpload(ctx, "", "", "") + } return "", false, err } defer resp.Body.Close() @@ -419,6 +357,9 @@ func (w *writer) uploadOne(ctx context.Context, l v1.Layer) error { mount = h.String() } if ml, ok := l.(*MountableLayer); ok { + if err := w.maybeUpdateScopes(ctx, ml); err != nil { + return err + } from = ml.Reference.Context().RepositoryStr() origin = ml.Reference.Context().RegistryStr() } @@ -472,69 +413,6 @@ func (w *writer) uploadOne(ctx context.Context, l v1.Layer) error { return retry.Retry(tryUpload, w.predicate, w.backoff) } -type withLayer interface { - Layer(v1.Hash) (v1.Layer, error) -} - -func (w *writer) writeIndex(ctx context.Context, ref name.Reference, ii v1.ImageIndex, options ...Option) error { - index, err := ii.IndexManifest() - if err != nil { - return err - } - - o, err := makeOptions(ref.Context(), options...) - if err != nil { - return err - } - - // TODO(#803): Pipe through remote.WithJobs and upload these in parallel. - for _, desc := range index.Manifests { - ref := ref.Context().Digest(desc.Digest.String()) - exists, err := w.checkExistingManifest(ctx, desc.Digest, desc.MediaType) - if err != nil { - return err - } - if exists { - logs.Progress.Print("existing manifest: ", desc.Digest) - continue - } - - switch desc.MediaType { - case types.OCIImageIndex, types.DockerManifestList: - ii, err := ii.ImageIndex(desc.Digest) - if err != nil { - return err - } - if err := w.writeIndex(ctx, ref, ii, options...); err != nil { - return err - } - case types.OCIManifestSchema1, types.DockerManifestSchema2: - img, err := ii.Image(desc.Digest) - if err != nil { - return err - } - if err := writeImage(ctx, ref, img, o, w.progress); err != nil { - return err - } - default: - // Workaround for #819. - if wl, ok := ii.(withLayer); ok { - layer, err := wl.Layer(desc.Digest) - if err != nil { - return err - } - if err := w.uploadOne(ctx, layer); err != nil { - return err - } - } - } - } - - // With all of the constituent elements uploaded, upload the manifest - // to commit the image. - return w.commitManifest(ctx, ii, ref) -} - type withMediaType interface { MediaType() (types.MediaType, error) } @@ -577,8 +455,110 @@ func unpackTaggable(t Taggable) ([]byte, *v1.Descriptor, error) { }, nil } +// commitSubjectReferrers is responsible for updating the fallback tag manifest to track descriptors referring to a subject for registries that don't yet support the Referrers API. +// TODO: use conditional requests to avoid race conditions +func (w *writer) commitSubjectReferrers(ctx context.Context, sub name.Digest, add v1.Descriptor) error { + // Check if the registry supports Referrers API. + // TODO: This should be done once per registry, not once per subject. + u := w.url(fmt.Sprintf("/v2/%s/referrers/%s", w.repo.RepositoryStr(), sub.DigestStr())) + req, err := http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return err + } + req.Header.Set("Accept", string(types.OCIImageIndex)) + resp, err := w.client.Do(req.WithContext(ctx)) + if err != nil { + return err + } + defer resp.Body.Close() + + if err := transport.CheckError(resp, http.StatusOK, http.StatusNotFound, http.StatusBadRequest); err != nil { + return err + } + if resp.StatusCode == http.StatusOK { + // The registry supports Referrers API. The registry is responsible for updating the referrers list. + return nil + } + + // The registry doesn't support Referrers API, we need to update the manifest tagged with the fallback tag. + // Make the request to GET the current manifest. + t := fallbackTag(sub) + u = w.url(fmt.Sprintf("/v2/%s/manifests/%s", w.repo.RepositoryStr(), t.Identifier())) + req, err = http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return err + } + req.Header.Set("Accept", string(types.OCIImageIndex)) + resp, err = w.client.Do(req.WithContext(ctx)) + if err != nil { + return err + } + defer resp.Body.Close() + + var im v1.IndexManifest + if err := transport.CheckError(resp, http.StatusOK, http.StatusNotFound); err != nil { + return err + } else if resp.StatusCode == http.StatusNotFound { + // Not found just means there are no attachments. Start with an empty index. + im = v1.IndexManifest{ + SchemaVersion: 2, + MediaType: types.OCIImageIndex, + Manifests: []v1.Descriptor{add}, + } + } else { + if err := json.NewDecoder(resp.Body).Decode(&im); err != nil { + return err + } + if im.SchemaVersion != 2 { + return fmt.Errorf("fallback tag manifest is not a schema version 2: %d", im.SchemaVersion) + } + if im.MediaType != types.OCIImageIndex { + return fmt.Errorf("fallback tag manifest is not an OCI image index: %s", im.MediaType) + } + for _, desc := range im.Manifests { + if desc.Digest == add.Digest { + // The digest is already attached, nothing to do. + logs.Progress.Printf("fallback tag %s already had referrer", t.Identifier()) + return nil + } + } + // Append the new descriptor to the index. + im.Manifests = append(im.Manifests, add) + } + + // Sort the manifests for reproducibility. + sort.Slice(im.Manifests, func(i, j int) bool { + return im.Manifests[i].Digest.String() < im.Manifests[j].Digest.String() + }) + logs.Progress.Printf("updating fallback tag %s with new referrer", t.Identifier()) + return w.commitManifest(ctx, fallbackTaggable{im}, t) +} + +type fallbackTaggable struct { + im v1.IndexManifest +} + +func (f fallbackTaggable) RawManifest() ([]byte, error) { return json.Marshal(f.im) } +func (f fallbackTaggable) MediaType() (types.MediaType, error) { return types.OCIImageIndex, nil } + // commitManifest does a PUT of the image's manifest. func (w *writer) commitManifest(ctx context.Context, t Taggable, ref name.Reference) error { + // If the manifest refers to a subject, we need to check whether we need to update the fallback tag manifest. + raw, err := t.RawManifest() + if err != nil { + return err + } + var mf struct { + MediaType types.MediaType `json:"mediaType"` + Subject *v1.Descriptor `json:"subject,omitempty"` + Config struct { + MediaType types.MediaType `json:"mediaType"` + } `json:"config"` + } + if err := json.Unmarshal(raw, &mf); err != nil { + return err + } + tryUpload := func() error { ctx := retry.Never(ctx) raw, desc, err := unpackTaggable(t) @@ -605,6 +585,26 @@ func (w *writer) commitManifest(ctx context.Context, t Taggable, ref name.Refere return err } + // If the manifest referred to a subject, we may need to update the fallback tag manifest. + // TODO: If this fails, we'll retry the whole upload. We should retry just this part. + if mf.Subject != nil { + h, size, err := v1.SHA256(bytes.NewReader(raw)) + if err != nil { + return err + } + desc := v1.Descriptor{ + ArtifactType: string(mf.Config.MediaType), + MediaType: mf.MediaType, + Digest: h, + Size: size, + } + if err := w.commitSubjectReferrers(ctx, + ref.Context().Digest(mf.Subject.Digest.String()), + desc); err != nil { + return err + } + } + // The image was successfully pushed! logs.Progress.Printf("%v: digest: %v size: %d", ref, desc.Digest, desc.Size) w.incrProgress(int64(len(raw))) @@ -643,183 +643,26 @@ func scopesForUploadingImage(repo name.Repository, layers []v1.Layer) []string { // WriteIndex will attempt to push all of the referenced manifests before // attempting to push the ImageIndex, to retain referential integrity. func WriteIndex(ref name.Reference, ii v1.ImageIndex, options ...Option) (rerr error) { - o, err := makeOptions(ref.Context(), options...) + o, err := makeOptions(options...) if err != nil { return err } - - scopes := []string{ref.Scope(transport.PushScope)} - tr, err := transport.NewWithContext(o.context, ref.Context().Registry, o.auth, o.transport, scopes) - if err != nil { - return err - } - w := writer{ - repo: ref.Context(), - client: &http.Client{Transport: tr}, - backoff: o.retryBackoff, - predicate: o.retryPredicate, + if o.progress != nil { + defer func() { o.progress.Close(rerr) }() } - - if o.updates != nil { - w.progress = &progress{updates: o.updates} - w.progress.lastUpdate = &v1.Update{} - - defer close(o.updates) - defer func() { w.progress.err(rerr) }() - - w.progress.lastUpdate.Total, err = countIndex(ii, o.allowNondistributableArtifacts) - if err != nil { - return err - } - } - - return w.writeIndex(o.context, ref, ii, options...) -} - -// countImage counts the total size of all layers + config blob + manifest for -// an image. It de-dupes duplicate layers. -func countImage(img v1.Image, allowNondistributableArtifacts bool) (int64, error) { - var total int64 - ls, err := img.Layers() - if err != nil { - return 0, err - } - seen := map[v1.Hash]bool{} - for _, l := range ls { - // Handle foreign layers. - mt, err := l.MediaType() - if err != nil { - return 0, err - } - if !mt.IsDistributable() && !allowNondistributableArtifacts { - continue - } - - // TODO: support streaming layers which update the total count as they write. - if _, ok := l.(*stream.Layer); ok { - return 0, errors.New("cannot use stream.Layer and WithProgress") - } - - // Dedupe layers. - d, err := l.Digest() - if err != nil { - return 0, err - } - if seen[d] { - continue - } - seen[d] = true - - size, err := l.Size() - if err != nil { - return 0, err - } - total += size - } - b, err := img.RawConfigFile() - if err != nil { - return 0, err - } - total += int64(len(b)) - size, err := img.Size() - if err != nil { - return 0, err - } - total += size - return total, nil -} - -// countIndex counts the total size of all images + sub-indexes for an index. -// It does not attempt to de-dupe duplicate images, etc. -func countIndex(idx v1.ImageIndex, allowNondistributableArtifacts bool) (int64, error) { - var total int64 - mf, err := idx.IndexManifest() - if err != nil { - return 0, err - } - - for _, desc := range mf.Manifests { - switch desc.MediaType { - case types.OCIImageIndex, types.DockerManifestList: - sidx, err := idx.ImageIndex(desc.Digest) - if err != nil { - return 0, err - } - size, err := countIndex(sidx, allowNondistributableArtifacts) - if err != nil { - return 0, err - } - total += size - case types.OCIManifestSchema1, types.DockerManifestSchema2: - simg, err := idx.Image(desc.Digest) - if err != nil { - return 0, err - } - size, err := countImage(simg, allowNondistributableArtifacts) - if err != nil { - return 0, err - } - total += size - default: - // Workaround for #819. - if wl, ok := idx.(withLayer); ok { - layer, err := wl.Layer(desc.Digest) - if err != nil { - return 0, err - } - size, err := layer.Size() - if err != nil { - return 0, err - } - total += size - } - } - } - - size, err := idx.Size() - if err != nil { - return 0, err - } - total += size - return total, nil + return newPusher(o).Push(o.context, ref, ii) } // WriteLayer uploads the provided Layer to the specified repo. func WriteLayer(repo name.Repository, layer v1.Layer, options ...Option) (rerr error) { - o, err := makeOptions(repo, options...) - if err != nil { - return err - } - scopes := scopesForUploadingImage(repo, []v1.Layer{layer}) - tr, err := transport.NewWithContext(o.context, repo.Registry, o.auth, o.transport, scopes) + o, err := makeOptions(options...) if err != nil { return err } - w := writer{ - repo: repo, - client: &http.Client{Transport: tr}, - backoff: o.retryBackoff, - predicate: o.retryPredicate, - } - - if o.updates != nil { - w.progress = &progress{updates: o.updates} - w.progress.lastUpdate = &v1.Update{} - - defer close(o.updates) - defer func() { w.progress.err(rerr) }() - - // TODO: support streaming layers which update the total count as they write. - if _, ok := layer.(*stream.Layer); ok { - return errors.New("cannot use stream.Layer and WithProgress") - } - size, err := layer.Size() - if err != nil { - return err - } - w.progress.total(size) + if o.progress != nil { + defer func() { o.progress.Close(rerr) }() } - return w.uploadOne(o.context, layer) + return newPusher(o).Upload(o.context, repo, layer) } // Tag adds a tag to the given Taggable via PUT /v2/.../manifests/ @@ -849,28 +692,9 @@ func Tag(tag name.Tag, t Taggable, options ...Option) error { // should ensure that all blobs or manifests that are referenced by t exist // in the target registry. func Put(ref name.Reference, t Taggable, options ...Option) error { - o, err := makeOptions(ref.Context(), options...) + o, err := makeOptions(options...) if err != nil { return err } - scopes := []string{ref.Scope(transport.PushScope)} - - // TODO: This *always* does a token exchange. For some registries, - // that's pretty slow. Some ideas; - // * Tag could take a list of tags. - // * Allow callers to pass in a transport.Transport, typecheck - // it to allow them to reuse the transport across multiple calls. - // * WithTag option to do multiple manifest PUTs in commitManifest. - tr, err := transport.NewWithContext(o.context, ref.Context().Registry, o.auth, o.transport, scopes) - if err != nil { - return err - } - w := writer{ - repo: ref.Context(), - client: &http.Client{Transport: tr}, - backoff: o.retryBackoff, - predicate: o.retryPredicate, - } - - return w.commitManifest(o.context, t, ref) + return newPusher(o).Push(o.context, ref, t) } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go b/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go index 9dd3e5ffbe..2b03544795 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go @@ -18,7 +18,7 @@ package stream import ( "bufio" "compress/gzip" - "crypto/sha256" + "crypto" "encoding/hex" "errors" "hash" @@ -130,6 +130,8 @@ func (l *Layer) Uncompressed() (io.ReadCloser, error) { // Compressed implements v1.Layer. func (l *Layer) Compressed() (io.ReadCloser, error) { + l.mu.Lock() + defer l.mu.Unlock() if l.consumed { return nil, ErrConsumed } @@ -166,8 +168,8 @@ type compressedReader struct { func newCompressedReader(l *Layer) (*compressedReader, error) { // Collect digests of compressed and uncompressed stream and size of // compressed stream. - h := sha256.New() - zh := sha256.New() + h := crypto.SHA256.New() + zh := crypto.SHA256.New() count := &countWriter{} // gzip.Writer writes to the output stream via pipe, a hasher to diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go b/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go index 1f977e16a9..c984f3c8f2 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go @@ -223,9 +223,9 @@ func extractFileFromTar(opener Opener, filePath string) (io.ReadCloser, error) { if err != nil { return nil, err } - close := true + needClose := true defer func() { - if close { + if needClose { f.Close() } }() @@ -244,7 +244,7 @@ func extractFileFromTar(opener Opener, filePath string) (io.ReadCloser, error) { currentDir := filepath.Dir(filePath) return extractFileFromTar(opener, path.Join(currentDir, path.Clean(hdr.Linkname))) } - close = false + needClose = false return tarFile{ Reader: tf, Closer: f, diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go b/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go index a344e92069..8a26309618 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go @@ -160,6 +160,8 @@ func WithCompressedCaching(l *layer) { // WithEstargzOptions is a functional option that allow the caller to pass // through estargz.Options to the underlying compression layer. This is // only meaningful when estargz is enabled. +// +// Deprecated: WithEstargz is deprecated, and will be removed in a future release. func WithEstargzOptions(opts ...estargz.Option) LayerOption { return func(l *layer) { l.estgzopts = opts @@ -167,6 +169,8 @@ func WithEstargzOptions(opts ...estargz.Option) LayerOption { } // WithEstargz is a functional option that explicitly enables estargz support. +// +// Deprecated: WithEstargz is deprecated, and will be removed in a future release. func WithEstargz(l *layer) { oguncompressed := l.uncompressedopener estargz := func() (io.ReadCloser, error) { @@ -238,6 +242,7 @@ func LayerFromOpener(opener Opener, opts ...LayerOption) (v1.Layer, error) { } if estgz := os.Getenv("GGCR_EXPERIMENT_ESTARGZ"); estgz == "1" { + logs.Warn.Println("GGCR_EXPERIMENT_ESTARGZ is deprecated, and will be removed in a future release.") opts = append([]LayerOption{WithEstargz}, opts...) } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go b/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go index 7d7a0b3b68..e607df164a 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go @@ -69,7 +69,7 @@ func Write(ref name.Reference, img v1.Image, w io.Writer, opts ...WriteOption) e return MultiRefWrite(map[name.Reference]v1.Image{ref: img}, w, opts...) } -// MultiWrite writes the contents of each image to the provided reader, in the compressed format. +// MultiWrite writes the contents of each image to the provided writer, in the compressed format. // The contents are written in the following format: // One manifest.json file at the top level containing information about several images. // One file for each layer, named after the layer's SHA. @@ -82,7 +82,7 @@ func MultiWrite(tagToImage map[name.Tag]v1.Image, w io.Writer, opts ...WriteOpti return MultiRefWrite(refToImage, w, opts...) } -// MultiRefWrite writes the contents of each image to the provided reader, in the compressed format. +// MultiRefWrite writes the contents of each image to the provided writer, in the compressed format. // The contents are written in the following format: // One manifest.json file at the top level containing information about several images. // One file for each layer, named after the layer's SHA. @@ -98,12 +98,13 @@ func MultiRefWrite(refToImage map[name.Reference]v1.Image, w io.Writer, opts ... } } - size, mBytes, err := getSizeAndManifest(refToImage) + imageToTags := dedupRefToImage(refToImage) + size, mBytes, err := getSizeAndManifest(imageToTags) if err != nil { return sendUpdateReturn(o, err) } - return writeImagesToTar(refToImage, mBytes, size, w, o) + return writeImagesToTar(imageToTags, mBytes, size, w, o) } // sendUpdateReturn return the passed in error message, also sending on update channel, if it exists @@ -125,11 +126,10 @@ func sendProgressWriterReturn(pw *progressWriter, err error) error { } // writeImagesToTar writes the images to the tarball -func writeImagesToTar(refToImage map[name.Reference]v1.Image, m []byte, size int64, w io.Writer, o *writeOptions) (err error) { +func writeImagesToTar(imageToTags map[v1.Image][]string, m []byte, size int64, w io.Writer, o *writeOptions) (err error) { if w == nil { return sendUpdateReturn(o, errors.New("must pass valid writer")) } - imageToTags := dedupRefToImage(refToImage) tw := w var pw *progressWriter @@ -219,9 +219,7 @@ func writeImagesToTar(refToImage map[name.Reference]v1.Image, m []byte, size int } // calculateManifest calculates the manifest and optionally the size of the tar file -func calculateManifest(refToImage map[name.Reference]v1.Image) (m Manifest, err error) { - imageToTags := dedupRefToImage(refToImage) - +func calculateManifest(imageToTags map[v1.Image][]string) (m Manifest, err error) { if len(imageToTags) == 0 { return nil, errors.New("set of images is empty") } @@ -290,12 +288,13 @@ func calculateManifest(refToImage map[name.Reference]v1.Image) (m Manifest, err // CalculateSize calculates the expected complete size of the output tar file func CalculateSize(refToImage map[name.Reference]v1.Image) (size int64, err error) { - size, _, err = getSizeAndManifest(refToImage) + imageToTags := dedupRefToImage(refToImage) + size, _, err = getSizeAndManifest(imageToTags) return size, err } -func getSizeAndManifest(refToImage map[name.Reference]v1.Image) (int64, []byte, error) { - m, err := calculateManifest(refToImage) +func getSizeAndManifest(imageToTags map[v1.Image][]string) (int64, []byte, error) { + m, err := calculateManifest(imageToTags) if err != nil { return 0, nil, fmt.Errorf("unable to calculate manifest: %w", err) } @@ -304,7 +303,7 @@ func getSizeAndManifest(refToImage map[name.Reference]v1.Image) (int64, []byte, return 0, nil, fmt.Errorf("could not marshall manifest to bytes: %w", err) } - size, err := calculateTarballSize(refToImage, mBytes) + size, err := calculateTarballSize(imageToTags, mBytes) if err != nil { return 0, nil, fmt.Errorf("error calculating tarball size: %w", err) } @@ -312,9 +311,7 @@ func getSizeAndManifest(refToImage map[name.Reference]v1.Image) (int64, []byte, } // calculateTarballSize calculates the size of the tar file -func calculateTarballSize(refToImage map[name.Reference]v1.Image, mBytes []byte) (size int64, err error) { - imageToTags := dedupRefToImage(refToImage) - +func calculateTarballSize(imageToTags map[v1.Image][]string, mBytes []byte) (size int64, err error) { seenLayerDigests := make(map[string]struct{}) for img, name := range imageToTags { manifest, err := img.Manifest() @@ -386,7 +383,8 @@ func writeTarEntry(tf *tar.Writer, path string, r io.Reader, size int64) error { // ComputeManifest get the manifest.json that will be written to the tarball // for multiple references func ComputeManifest(refToImage map[name.Reference]v1.Image) (Manifest, error) { - return calculateManifest(refToImage) + imageToTags := dedupRefToImage(refToImage) + return calculateManifest(imageToTags) } // WriteOption a function option to pass to Write() diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go b/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go index 363e989fe2..c86657d7b8 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go @@ -71,3 +71,28 @@ func (m MediaType) IsIndex() bool { } return false } + +// IsConfig returns true if the mediaType represents a config, as opposed to something else, like an image. +func (m MediaType) IsConfig() bool { + switch m { + case OCIConfigJSON, DockerConfigJSON: + return true + } + return false +} + +func (m MediaType) IsSchema1() bool { + switch m { + case DockerManifestSchema1, DockerManifestSchema1Signed: + return true + } + return false +} + +func (m MediaType) IsLayer() bool { + switch m { + case DockerLayer, DockerUncompressedLayer, OCILayer, OCILayerZStd, OCIUncompressedLayer, DockerForeignLayer, OCIRestrictedLayer, OCIUncompressedRestrictedLayer: + return true + } + return false +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/validate/doc.go b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/doc.go new file mode 100644 index 0000000000..91ca87a5fb --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/doc.go @@ -0,0 +1,16 @@ +// Copyright 2018 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package validate provides methods for validating image correctness. +package validate diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/validate/image.go b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/image.go new file mode 100644 index 0000000000..94fb767bbc --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/image.go @@ -0,0 +1,288 @@ +// Copyright 2018 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package validate + +import ( + "bytes" + "errors" + "fmt" + "io" + "strings" + + "github.com/google/go-cmp/cmp" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/partial" +) + +// Image validates that img does not violate any invariants of the image format. +func Image(img v1.Image, opt ...Option) error { + errs := []string{} + if err := validateLayers(img, opt...); err != nil { + errs = append(errs, fmt.Sprintf("validating layers: %v", err)) + } + + if err := validateConfig(img); err != nil { + errs = append(errs, fmt.Sprintf("validating config: %v", err)) + } + + if err := validateManifest(img); err != nil { + errs = append(errs, fmt.Sprintf("validating manifest: %v", err)) + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n\n")) + } + return nil +} + +func validateConfig(img v1.Image) error { + cn, err := img.ConfigName() + if err != nil { + return err + } + + rc, err := img.RawConfigFile() + if err != nil { + return err + } + + hash, size, err := v1.SHA256(bytes.NewReader(rc)) + if err != nil { + return err + } + + m, err := img.Manifest() + if err != nil { + return err + } + + cf, err := img.ConfigFile() + if err != nil { + return err + } + + pcf, err := v1.ParseConfigFile(bytes.NewReader(rc)) + if err != nil { + return err + } + + errs := []string{} + if cn != hash { + errs = append(errs, fmt.Sprintf("mismatched config digest: ConfigName()=%s, SHA256(RawConfigFile())=%s", cn, hash)) + } + + if want, got := m.Config.Size, size; want != got { + errs = append(errs, fmt.Sprintf("mismatched config size: Manifest.Config.Size()=%d, len(RawConfigFile())=%d", want, got)) + } + + if diff := cmp.Diff(pcf, cf); diff != "" { + errs = append(errs, fmt.Sprintf("mismatched config content: (-ParseConfigFile(RawConfigFile()) +ConfigFile()) %s", diff)) + } + + if cf.RootFS.Type != "layers" { + errs = append(errs, fmt.Sprintf("invalid ConfigFile.RootFS.Type: %q != %q", cf.RootFS.Type, "layers")) + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n")) + } + + return nil +} + +func validateLayers(img v1.Image, opt ...Option) error { + o := makeOptions(opt...) + + layers, err := img.Layers() + if err != nil { + return err + } + + if o.fast { + return layersExist(layers) + } + + digests := []v1.Hash{} + diffids := []v1.Hash{} + udiffids := []v1.Hash{} + sizes := []int64{} + for i, layer := range layers { + cl, err := computeLayer(layer) + if errors.Is(err, io.ErrUnexpectedEOF) { + // Errored while reading tar content of layer because a header or + // content section was not the correct length. This is most likely + // due to an incomplete download or otherwise interrupted process. + m, err := img.Manifest() + if err != nil { + return fmt.Errorf("undersized layer[%d] content", i) + } + return fmt.Errorf("undersized layer[%d] content: Manifest.Layers[%d].Size=%d", i, i, m.Layers[i].Size) + } + if err != nil { + return err + } + // Compute all of these first before we call Config() and Manifest() to allow + // for lazy access e.g. for stream.Layer. + digests = append(digests, cl.digest) + diffids = append(diffids, cl.diffid) + udiffids = append(udiffids, cl.uncompressedDiffid) + sizes = append(sizes, cl.size) + } + + cf, err := img.ConfigFile() + if err != nil { + return err + } + + m, err := img.Manifest() + if err != nil { + return err + } + + errs := []string{} + for i, layer := range layers { + digest, err := layer.Digest() + if err != nil { + return err + } + diffid, err := layer.DiffID() + if err != nil { + return err + } + size, err := layer.Size() + if err != nil { + return err + } + mediaType, err := layer.MediaType() + if err != nil { + return err + } + + if _, err := img.LayerByDigest(digest); err != nil { + return err + } + + if _, err := img.LayerByDiffID(diffid); err != nil { + return err + } + + if digest != digests[i] { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] digest: Digest()=%s, SHA256(Compressed())=%s", i, digest, digests[i])) + } + + if m.Layers[i].Digest != digests[i] { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] digest: Manifest.Layers[%d].Digest=%s, SHA256(Compressed())=%s", i, i, m.Layers[i].Digest, digests[i])) + } + + if diffid != diffids[i] { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] diffid: DiffID()=%s, SHA256(Gunzip(Compressed()))=%s", i, diffid, diffids[i])) + } + + if diffid != udiffids[i] { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] diffid: DiffID()=%s, SHA256(Uncompressed())=%s", i, diffid, udiffids[i])) + } + + if cf.RootFS.DiffIDs[i] != diffids[i] { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] diffid: ConfigFile.RootFS.DiffIDs[%d]=%s, SHA256(Gunzip(Compressed()))=%s", i, i, cf.RootFS.DiffIDs[i], diffids[i])) + } + + if size != sizes[i] { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] size: Size()=%d, len(Compressed())=%d", i, size, sizes[i])) + } + + if m.Layers[i].Size != sizes[i] { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] size: Manifest.Layers[%d].Size=%d, len(Compressed())=%d", i, i, m.Layers[i].Size, sizes[i])) + } + + if m.Layers[i].MediaType != mediaType { + errs = append(errs, fmt.Sprintf("mismatched layer[%d] mediaType: Manifest.Layers[%d].MediaType=%s, layer.MediaType()=%s", i, i, m.Layers[i].MediaType, mediaType)) + } + } + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n")) + } + + return nil +} + +func validateManifest(img v1.Image) error { + digest, err := img.Digest() + if err != nil { + return err + } + + size, err := img.Size() + if err != nil { + return err + } + + rm, err := img.RawManifest() + if err != nil { + return err + } + + hash, _, err := v1.SHA256(bytes.NewReader(rm)) + if err != nil { + return err + } + + m, err := img.Manifest() + if err != nil { + return err + } + + pm, err := v1.ParseManifest(bytes.NewReader(rm)) + if err != nil { + return err + } + + errs := []string{} + if digest != hash { + errs = append(errs, fmt.Sprintf("mismatched manifest digest: Digest()=%s, SHA256(RawManifest())=%s", digest, hash)) + } + + if diff := cmp.Diff(pm, m); diff != "" { + errs = append(errs, fmt.Sprintf("mismatched manifest content: (-ParseManifest(RawManifest()) +Manifest()) %s", diff)) + } + + if size != int64(len(rm)) { + errs = append(errs, fmt.Sprintf("mismatched manifest size: Size()=%d, len(RawManifest())=%d", size, len(rm))) + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n")) + } + + return nil +} + +func layersExist(layers []v1.Layer) error { + errs := []string{} + for _, layer := range layers { + ok, err := partial.Exists(layer) + if err != nil { + errs = append(errs, err.Error()) + } + if !ok { + errs = append(errs, "layer does not exist") + } + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n")) + } + + return nil +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/validate/index.go b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/index.go new file mode 100644 index 0000000000..7514dc48a0 --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/index.go @@ -0,0 +1,175 @@ +// Copyright 2018 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package validate + +import ( + "bytes" + "errors" + "fmt" + "strings" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-containerregistry/pkg/logs" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/types" +) + +// Index validates that idx does not violate any invariants of the index format. +func Index(idx v1.ImageIndex, opt ...Option) error { + errs := []string{} + + if err := validateChildren(idx, opt...); err != nil { + errs = append(errs, fmt.Sprintf("validating children: %v", err)) + } + + if err := validateIndexManifest(idx); err != nil { + errs = append(errs, fmt.Sprintf("validating index manifest: %v", err)) + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n\n")) + } + return nil +} + +type withLayer interface { + Layer(v1.Hash) (v1.Layer, error) +} + +func validateChildren(idx v1.ImageIndex, opt ...Option) error { + manifest, err := idx.IndexManifest() + if err != nil { + return err + } + + errs := []string{} + for i, desc := range manifest.Manifests { + switch desc.MediaType { + case types.OCIImageIndex, types.DockerManifestList: + idx, err := idx.ImageIndex(desc.Digest) + if err != nil { + return err + } + if err := Index(idx, opt...); err != nil { + errs = append(errs, fmt.Sprintf("failed to validate index Manifests[%d](%s): %v", i, desc.Digest, err)) + } + if err := validateMediaType(idx, desc.MediaType); err != nil { + errs = append(errs, fmt.Sprintf("failed to validate index MediaType[%d](%s): %v", i, desc.Digest, err)) + } + case types.OCIManifestSchema1, types.DockerManifestSchema2: + img, err := idx.Image(desc.Digest) + if err != nil { + return err + } + if err := Image(img, opt...); err != nil { + errs = append(errs, fmt.Sprintf("failed to validate image Manifests[%d](%s): %v", i, desc.Digest, err)) + } + if err := validateMediaType(img, desc.MediaType); err != nil { + errs = append(errs, fmt.Sprintf("failed to validate image MediaType[%d](%s): %v", i, desc.Digest, err)) + } + default: + // Workaround for #819. + if wl, ok := idx.(withLayer); ok { + layer, err := wl.Layer(desc.Digest) + if err != nil { + return fmt.Errorf("failed to get layer Manifests[%d]: %w", i, err) + } + if err := Layer(layer, opt...); err != nil { + lerr := fmt.Sprintf("failed to validate layer Manifests[%d](%s): %v", i, desc.Digest, err) + if desc.MediaType.IsDistributable() { + errs = append(errs, lerr) + } else { + logs.Warn.Printf("nondistributable layer failure: %v", lerr) + } + } + } else { + logs.Warn.Printf("Unexpected manifest: %s", desc.MediaType) + } + } + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n")) + } + + return nil +} + +type withMediaType interface { + MediaType() (types.MediaType, error) +} + +func validateMediaType(i withMediaType, want types.MediaType) error { + got, err := i.MediaType() + if err != nil { + return err + } + if want != got { + return fmt.Errorf("mismatched mediaType: MediaType() = %v != %v", got, want) + } + + return nil +} + +func validateIndexManifest(idx v1.ImageIndex) error { + digest, err := idx.Digest() + if err != nil { + return err + } + + size, err := idx.Size() + if err != nil { + return err + } + + rm, err := idx.RawManifest() + if err != nil { + return err + } + + hash, _, err := v1.SHA256(bytes.NewReader(rm)) + if err != nil { + return err + } + + m, err := idx.IndexManifest() + if err != nil { + return err + } + + pm, err := v1.ParseIndexManifest(bytes.NewReader(rm)) + if err != nil { + return err + } + + errs := []string{} + if digest != hash { + errs = append(errs, fmt.Sprintf("mismatched manifest digest: Digest()=%s, SHA256(RawManifest())=%s", digest, hash)) + } + + if diff := cmp.Diff(pm, m); diff != "" { + errs = append(errs, fmt.Sprintf("mismatched manifest content: (-ParseIndexManifest(RawManifest()) +Manifest()) %s", diff)) + } + + if size != int64(len(rm)) { + errs = append(errs, fmt.Sprintf("mismatched manifest size: Size()=%d, len(RawManifest())=%d", size, len(rm))) + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n")) + } + + return nil +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/validate/layer.go b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/layer.go new file mode 100644 index 0000000000..fdd8f38cb5 --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/layer.go @@ -0,0 +1,191 @@ +// Copyright 2019 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package validate + +import ( + "archive/tar" + "compress/gzip" + "crypto" + "encoding/hex" + "errors" + "fmt" + "io" + "strings" + + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/partial" +) + +// Layer validates that the values return by its methods are consistent with the +// contents returned by Compressed and Uncompressed. +func Layer(layer v1.Layer, opt ...Option) error { + o := makeOptions(opt...) + if o.fast { + ok, err := partial.Exists(layer) + if err != nil { + return err + } + if !ok { + return fmt.Errorf("layer does not exist") + } + return nil + } + + cl, err := computeLayer(layer) + if err != nil { + return err + } + + errs := []string{} + + digest, err := layer.Digest() + if err != nil { + return err + } + diffid, err := layer.DiffID() + if err != nil { + return err + } + size, err := layer.Size() + if err != nil { + return err + } + + if digest != cl.digest { + errs = append(errs, fmt.Sprintf("mismatched digest: Digest()=%s, SHA256(Compressed())=%s", digest, cl.digest)) + } + + if diffid != cl.diffid { + errs = append(errs, fmt.Sprintf("mismatched diffid: DiffID()=%s, SHA256(Gunzip(Compressed()))=%s", diffid, cl.diffid)) + } + + if diffid != cl.uncompressedDiffid { + errs = append(errs, fmt.Sprintf("mismatched diffid: DiffID()=%s, SHA256(Uncompressed())=%s", diffid, cl.uncompressedDiffid)) + } + + if size != cl.size { + errs = append(errs, fmt.Sprintf("mismatched size: Size()=%d, len(Compressed())=%d", size, cl.size)) + } + + if len(errs) != 0 { + return errors.New(strings.Join(errs, "\n")) + } + + return nil +} + +type computedLayer struct { + // Calculated from Compressed stream. + digest v1.Hash + size int64 + diffid v1.Hash + + // Calculated from Uncompressed stream. + uncompressedDiffid v1.Hash + uncompressedSize int64 +} + +func computeLayer(layer v1.Layer) (*computedLayer, error) { + compressed, err := layer.Compressed() + if err != nil { + return nil, err + } + + // Keep track of compressed digest. + digester := crypto.SHA256.New() + // Everything read from compressed is written to digester to compute digest. + hashCompressed := io.TeeReader(compressed, digester) + + // Call io.Copy to write from the layer Reader through to the tarReader on + // the other side of the pipe. + pr, pw := io.Pipe() + var size int64 + go func() { + n, err := io.Copy(pw, hashCompressed) + if err != nil { + pw.CloseWithError(err) + return + } + size = n + + // Now close the compressed reader, to flush the gzip stream + // and calculate digest/diffID/size. This will cause pr to + // return EOF which will cause readers of the Compressed stream + // to finish reading. + pw.CloseWithError(compressed.Close()) + }() + + // Read the bytes through gzip.Reader to compute the DiffID. + uncompressed, err := gzip.NewReader(pr) + if err != nil { + return nil, err + } + diffider := crypto.SHA256.New() + hashUncompressed := io.TeeReader(uncompressed, diffider) + + // Ensure there aren't duplicate file paths. + tarReader := tar.NewReader(hashUncompressed) + files := make(map[string]struct{}) + for { + hdr, err := tarReader.Next() + if errors.Is(err, io.EOF) { + break + } + if err != nil { + return nil, err + } + if _, ok := files[hdr.Name]; ok { + return nil, fmt.Errorf("duplicate file path: %s", hdr.Name) + } + files[hdr.Name] = struct{}{} + } + + // Discard any trailing padding that the tar.Reader doesn't consume. + if _, err := io.Copy(io.Discard, hashUncompressed); err != nil { + return nil, err + } + + if err := uncompressed.Close(); err != nil { + return nil, err + } + + digest := v1.Hash{ + Algorithm: "sha256", + Hex: hex.EncodeToString(digester.Sum(make([]byte, 0, digester.Size()))), + } + + diffid := v1.Hash{ + Algorithm: "sha256", + Hex: hex.EncodeToString(diffider.Sum(make([]byte, 0, diffider.Size()))), + } + + ur, err := layer.Uncompressed() + if err != nil { + return nil, err + } + defer ur.Close() + udiffid, usize, err := v1.SHA256(ur) + if err != nil { + return nil, err + } + + return &computedLayer{ + digest: digest, + diffid: diffid, + size: size, + uncompressedDiffid: udiffid, + uncompressedSize: usize, + }, nil +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/validate/options.go b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/options.go new file mode 100644 index 0000000000..a6bf2dcc2c --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/validate/options.go @@ -0,0 +1,37 @@ +// Copyright 2021 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package validate + +// Option is a functional option for validate. +type Option func(*options) + +type options struct { + fast bool +} + +func makeOptions(opts ...Option) options { + opt := options{ + fast: false, + } + for _, o := range opts { + o(&opt) + } + return opt +} + +// Fast causes validate to skip reading and digesting layer bytes. +func Fast(o *options) { + o.fast = true +} diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go b/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go index 0cb1586f1e..a47b7475ed 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go @@ -99,6 +99,11 @@ func (in *ConfigFile) DeepCopyInto(out *ConfigFile) { } in.RootFS.DeepCopyInto(&out.RootFS) in.Config.DeepCopyInto(&out.Config) + if in.OSFeatures != nil { + in, out := &in.OSFeatures, &out.OSFeatures + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -222,6 +227,11 @@ func (in *IndexManifest) DeepCopyInto(out *IndexManifest) { (*out)[key] = val } } + if in.Subject != nil { + in, out := &in.Subject, &out.Subject + *out = new(Descriptor) + (*in).DeepCopyInto(*out) + } return } @@ -253,6 +263,11 @@ func (in *Manifest) DeepCopyInto(out *Manifest) { (*out)[key] = val } } + if in.Subject != nil { + in, out := &in.Subject, &out.Subject + *out = new(Descriptor) + (*in).DeepCopyInto(*out) + } return } diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go index 52a8561f0f..65ffcf5cf8 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go @@ -167,7 +167,7 @@ func (p *parser) segment() (segment, error) { if err != nil { return nil, fmt.Errorf("segment neither wildcards, literal or variable: %w", err) } - return v, err + return v, nil } func (p *parser) literal() (segment, error) { @@ -192,7 +192,7 @@ func (p *parser) variable() (segment, error) { if _, err := p.accept("="); err == nil { segs, err = p.segments() if err != nil { - return nil, fmt.Errorf("invalid segment in variable %q: %v", path, err) + return nil, fmt.Errorf("invalid segment in variable %q: %w", path, err) } } else { segs = []segment{wildcard{}} @@ -219,7 +219,7 @@ func (p *parser) fieldPath() (string, error) { } c, err := p.accept(typeIdent) if err != nil { - return "", fmt.Errorf("invalid field path component: %v", err) + return "", fmt.Errorf("invalid field path component: %w", err) } components = append(components, c) } diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go index 5ab5b3841d..31553e7848 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go @@ -13,6 +13,7 @@ import ( "time" "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" ) @@ -99,6 +100,38 @@ func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Reque return metadata.NewIncomingContext(ctx, md), nil } +func isValidGRPCMetadataKey(key string) bool { + // Must be a valid gRPC "Header-Name" as defined here: + // https://github.com/grpc/grpc/blob/4b05dc88b724214d0c725c8e7442cbc7a61b1374/doc/PROTOCOL-HTTP2.md + // This means 0-9 a-z _ - . + // Only lowercase letters are valid in the wire protocol, but the client library will normalize + // uppercase ASCII to lowercase, so uppercase ASCII is also acceptable. + bytes := []byte(key) // gRPC validates strings on the byte level, not Unicode. + for _, ch := range bytes { + validLowercaseLetter := ch >= 'a' && ch <= 'z' + validUppercaseLetter := ch >= 'A' && ch <= 'Z' + validDigit := ch >= '0' && ch <= '9' + validOther := ch == '.' || ch == '-' || ch == '_' + if !validLowercaseLetter && !validUppercaseLetter && !validDigit && !validOther { + return false + } + } + return true +} + +func isValidGRPCMetadataTextValue(textValue string) bool { + // Must be a valid gRPC "ASCII-Value" as defined here: + // https://github.com/grpc/grpc/blob/4b05dc88b724214d0c725c8e7442cbc7a61b1374/doc/PROTOCOL-HTTP2.md + // This means printable ASCII (including/plus spaces); 0x20 to 0x7E inclusive. + bytes := []byte(textValue) // gRPC validates strings on the byte level, not Unicode. + for _, ch := range bytes { + if ch < 0x20 || ch > 0x7E { + return false + } + } + return true +} + func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcMethodName string, options ...AnnotateContextOption) (context.Context, metadata.MD, error) { ctx = withRPCMethod(ctx, rpcMethodName) for _, o := range options { @@ -121,6 +154,10 @@ func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcM pairs = append(pairs, "authorization", val) } if h, ok := mux.incomingHeaderMatcher(key); ok { + if !isValidGRPCMetadataKey(h) { + grpclog.Errorf("HTTP header name %q is not valid as gRPC metadata key; skipping", h) + continue + } // Handles "-bin" metadata in grpc, since grpc will do another base64 // encode before sending to server, we need to decode it first. if strings.HasSuffix(key, metadataHeaderBinarySuffix) { @@ -130,6 +167,9 @@ func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcM } val = string(b) + } else if !isValidGRPCMetadataTextValue(val) { + grpclog.Errorf("Value of HTTP header %q contains non-ASCII value (not valid as gRPC metadata): skipping", h) + continue } pairs = append(pairs, h, val) } diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go index 524ea057cc..51b8247da2 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go @@ -92,23 +92,20 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { if rv.Type().Elem().Implements(protoMessageType) { var buf bytes.Buffer - err := buf.WriteByte('[') - if err != nil { + if err := buf.WriteByte('['); err != nil { return nil, err } for i := 0; i < rv.Len(); i++ { if i != 0 { - err = buf.WriteByte(',') - if err != nil { + if err := buf.WriteByte(','); err != nil { return nil, err } } - if err = j.marshalTo(&buf, rv.Index(i).Interface().(proto.Message)); err != nil { + if err := j.marshalTo(&buf, rv.Index(i).Interface().(proto.Message)); err != nil { return nil, err } } - err = buf.WriteByte(']') - if err != nil { + if err := buf.WriteByte(']'); err != nil { return nil, err } @@ -117,17 +114,16 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { if rv.Type().Elem().Implements(typeProtoEnum) { var buf bytes.Buffer - err := buf.WriteByte('[') - if err != nil { + if err := buf.WriteByte('['); err != nil { return nil, err } for i := 0; i < rv.Len(); i++ { if i != 0 { - err = buf.WriteByte(',') - if err != nil { + if err := buf.WriteByte(','); err != nil { return nil, err } } + var err error if j.UseEnumNumbers { _, err = buf.WriteString(strconv.FormatInt(rv.Index(i).Int(), 10)) } else { @@ -137,8 +133,7 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { return nil, err } } - err = buf.WriteByte(']') - if err != nil { + if err := buf.WriteByte(']'); err != nil { return nil, err } @@ -219,8 +214,7 @@ func decodeJSONPb(d *json.Decoder, unmarshaler protojson.UnmarshalOptions, v int // Decode into bytes for marshalling var b json.RawMessage - err := d.Decode(&b) - if err != nil { + if err := d.Decode(&b); err != nil { return err } @@ -239,8 +233,7 @@ func decodeNonProtoField(d *json.Decoder, unmarshaler protojson.UnmarshalOptions if rv.Type().ConvertibleTo(typeProtoMessage) { // Decode into bytes for marshalling var b json.RawMessage - err := d.Decode(&b) - if err != nil { + if err := d.Decode(&b); err != nil { return err } diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go index 9fb2960d95..139bbbad49 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go @@ -80,7 +80,7 @@ func WithForwardResponseOption(forwardResponseOption func(context.Context, http. } } -// WithEscapingType sets the escaping type. See the definitions of UnescapingMode +// WithUnescapingMode sets the escaping type. See the definitions of UnescapingMode // for more information. func WithUnescapingMode(mode UnescapingMode) ServeMuxOption { return func(serveMux *ServeMux) { @@ -101,8 +101,9 @@ func SetQueryParameterParser(queryParameterParser QueryParameterParser) ServeMux type HeaderMatcherFunc func(string) (string, bool) // DefaultHeaderMatcher is used to pass http request headers to/from gRPC context. This adds permanent HTTP header -// keys (as specified by the IANA) to gRPC context with grpcgateway- prefix. HTTP headers that start with -// 'Grpc-Metadata-' are mapped to gRPC metadata after removing prefix 'Grpc-Metadata-'. +// keys (as specified by the IANA, e.g: Accept, Cookie, Host) to the gRPC metadata with the grpcgateway- prefix. If you want to know which headers are considered permanent, you can view the isPermanentHTTPHeader function. +// HTTP headers that start with 'Grpc-Metadata-' are mapped to gRPC metadata after removing the prefix 'Grpc-Metadata-'. +// Other headers are not added to the gRPC metadata. func DefaultHeaderMatcher(key string) (string, bool) { switch key = textproto.CanonicalMIMEHeaderKey(key); { case isPermanentHTTPHeader(key): @@ -230,7 +231,6 @@ func WithHealthEndpointAt(healthCheckClient grpc_health_v1.HealthClient, endpoin w.Header().Set("Content-Type", "application/json") if resp.GetStatus() != grpc_health_v1.HealthCheckResponse_SERVING { - var err error switch resp.GetStatus() { case grpc_health_v1.HealthCheckResponse_NOT_SERVING, grpc_health_v1.HealthCheckResponse_UNKNOWN: err = status.Error(codes.Unavailable, resp.String()) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/pattern.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/pattern.go index df7cb81426..8f90d15a56 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/pattern.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/pattern.go @@ -15,8 +15,6 @@ var ( ErrNotMatch = errors.New("not match to the path pattern") // ErrInvalidPattern indicates that the given definition of Pattern is not valid. ErrInvalidPattern = errors.New("invalid pattern") - // ErrMalformedSequence indicates that an escape sequence was malformed. - ErrMalformedSequence = errors.New("malformed escape sequence") ) type MalformedSequenceError string diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go index 56b796e6f4..31ce33a762 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go @@ -47,8 +47,7 @@ type DefaultQueryParser struct{} // A value is ignored if its key starts with one of the elements in "filter". func (*DefaultQueryParser) Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { for key, values := range values { - match := valuesKeyRegexp.FindStringSubmatch(key) - if len(match) == 3 { + if match := valuesKeyRegexp.FindStringSubmatch(key); len(match) == 3 { key = match[1] values = append([]string{match[2]}, values...) } @@ -321,15 +320,13 @@ func parseMessage(msgDescriptor protoreflect.MessageDescriptor, value string) (p msg = fm case "google.protobuf.Value": var v structpb.Value - err := protojson.Unmarshal([]byte(value), &v) - if err != nil { + if err := protojson.Unmarshal([]byte(value), &v); err != nil { return protoreflect.Value{}, err } msg = &v case "google.protobuf.Struct": var v structpb.Struct - err := protojson.Unmarshal([]byte(value), &v) - if err != nil { + if err := protojson.Unmarshal([]byte(value), &v); err != nil { return protoreflect.Value{}, err } msg = &v diff --git a/vendor/github.com/hashicorp/go-cleanhttp/LICENSE b/vendor/github.com/hashicorp/go-cleanhttp/LICENSE new file mode 100644 index 0000000000..e87a115e46 --- /dev/null +++ b/vendor/github.com/hashicorp/go-cleanhttp/LICENSE @@ -0,0 +1,363 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/hashicorp/go-cleanhttp/README.md b/vendor/github.com/hashicorp/go-cleanhttp/README.md new file mode 100644 index 0000000000..036e5313fc --- /dev/null +++ b/vendor/github.com/hashicorp/go-cleanhttp/README.md @@ -0,0 +1,30 @@ +# cleanhttp + +Functions for accessing "clean" Go http.Client values + +------------- + +The Go standard library contains a default `http.Client` called +`http.DefaultClient`. It is a common idiom in Go code to start with +`http.DefaultClient` and tweak it as necessary, and in fact, this is +encouraged; from the `http` package documentation: + +> The Client's Transport typically has internal state (cached TCP connections), +so Clients should be reused instead of created as needed. Clients are safe for +concurrent use by multiple goroutines. + +Unfortunately, this is a shared value, and it is not uncommon for libraries to +assume that they are free to modify it at will. With enough dependencies, it +can be very easy to encounter strange problems and race conditions due to +manipulation of this shared value across libraries and goroutines (clients are +safe for concurrent use, but writing values to the client struct itself is not +protected). + +Making things worse is the fact that a bare `http.Client` will use a default +`http.Transport` called `http.DefaultTransport`, which is another global value +that behaves the same way. So it is not simply enough to replace +`http.DefaultClient` with `&http.Client{}`. + +This repository provides some simple functions to get a "clean" `http.Client` +-- one that uses the same default values as the Go standard library, but +returns a client that does not share any state with other clients. diff --git a/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go b/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go new file mode 100644 index 0000000000..fe28d15b6f --- /dev/null +++ b/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go @@ -0,0 +1,58 @@ +package cleanhttp + +import ( + "net" + "net/http" + "runtime" + "time" +) + +// DefaultTransport returns a new http.Transport with similar default values to +// http.DefaultTransport, but with idle connections and keepalives disabled. +func DefaultTransport() *http.Transport { + transport := DefaultPooledTransport() + transport.DisableKeepAlives = true + transport.MaxIdleConnsPerHost = -1 + return transport +} + +// DefaultPooledTransport returns a new http.Transport with similar default +// values to http.DefaultTransport. Do not use this for transient transports as +// it can leak file descriptors over time. Only use this for transports that +// will be re-used for the same host(s). +func DefaultPooledTransport() *http.Transport { + transport := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + }).DialContext, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + ForceAttemptHTTP2: true, + MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1, + } + return transport +} + +// DefaultClient returns a new http.Client with similar default values to +// http.Client, but with a non-shared Transport, idle connections disabled, and +// keepalives disabled. +func DefaultClient() *http.Client { + return &http.Client{ + Transport: DefaultTransport(), + } +} + +// DefaultPooledClient returns a new http.Client with similar default values to +// http.Client, but with a shared Transport. Do not use this function for +// transient clients as it can leak file descriptors over time. Only use this +// for clients that will be re-used for the same host(s). +func DefaultPooledClient() *http.Client { + return &http.Client{ + Transport: DefaultPooledTransport(), + } +} diff --git a/vendor/github.com/hashicorp/go-cleanhttp/doc.go b/vendor/github.com/hashicorp/go-cleanhttp/doc.go new file mode 100644 index 0000000000..05841092a7 --- /dev/null +++ b/vendor/github.com/hashicorp/go-cleanhttp/doc.go @@ -0,0 +1,20 @@ +// Package cleanhttp offers convenience utilities for acquiring "clean" +// http.Transport and http.Client structs. +// +// Values set on http.DefaultClient and http.DefaultTransport affect all +// callers. This can have detrimental effects, esepcially in TLS contexts, +// where client or root certificates set to talk to multiple endpoints can end +// up displacing each other, leading to hard-to-debug issues. This package +// provides non-shared http.Client and http.Transport structs to ensure that +// the configuration will not be overwritten by other parts of the application +// or dependencies. +// +// The DefaultClient and DefaultTransport functions disable idle connections +// and keepalives. Without ensuring that idle connections are closed before +// garbage collection, short-term clients/transports can leak file descriptors, +// eventually leading to "too many open files" errors. If you will be +// connecting to the same hosts repeatedly from the same client, you can use +// DefaultPooledClient to receive a client that has connection pooling +// semantics similar to http.DefaultClient. +// +package cleanhttp diff --git a/vendor/github.com/hashicorp/go-cleanhttp/handlers.go b/vendor/github.com/hashicorp/go-cleanhttp/handlers.go new file mode 100644 index 0000000000..3c845dc0dc --- /dev/null +++ b/vendor/github.com/hashicorp/go-cleanhttp/handlers.go @@ -0,0 +1,48 @@ +package cleanhttp + +import ( + "net/http" + "strings" + "unicode" +) + +// HandlerInput provides input options to cleanhttp's handlers +type HandlerInput struct { + ErrStatus int +} + +// PrintablePathCheckHandler is a middleware that ensures the request path +// contains only printable runes. +func PrintablePathCheckHandler(next http.Handler, input *HandlerInput) http.Handler { + // Nil-check on input to make it optional + if input == nil { + input = &HandlerInput{ + ErrStatus: http.StatusBadRequest, + } + } + + // Default to http.StatusBadRequest on error + if input.ErrStatus == 0 { + input.ErrStatus = http.StatusBadRequest + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r != nil { + // Check URL path for non-printable characters + idx := strings.IndexFunc(r.URL.Path, func(c rune) bool { + return !unicode.IsPrint(c) + }) + + if idx != -1 { + w.WriteHeader(input.ErrStatus) + return + } + + if next != nil { + next.ServeHTTP(w, r) + } + } + + return + }) +} diff --git a/vendor/github.com/hashicorp/go-retryablehttp/.gitignore b/vendor/github.com/hashicorp/go-retryablehttp/.gitignore new file mode 100644 index 0000000000..4e309e0b32 --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/.gitignore @@ -0,0 +1,4 @@ +.idea/ +*.iml +*.test +.vscode/ \ No newline at end of file diff --git a/vendor/github.com/hashicorp/go-retryablehttp/CHANGELOG.md b/vendor/github.com/hashicorp/go-retryablehttp/CHANGELOG.md new file mode 100644 index 0000000000..33686e4da8 --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/CHANGELOG.md @@ -0,0 +1,9 @@ +## 0.7.4 (Jun 6, 2023) + +BUG FIXES + +- client: fixing an issue where the Content-Type header wouldn't be sent with an empty payload when using HTTP/2 [GH-194] + +## 0.7.3 (May 15, 2023) + +Initial release diff --git a/vendor/github.com/hashicorp/go-retryablehttp/CODEOWNERS b/vendor/github.com/hashicorp/go-retryablehttp/CODEOWNERS new file mode 100644 index 0000000000..f8389c995e --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/CODEOWNERS @@ -0,0 +1 @@ +* @hashicorp/release-engineering \ No newline at end of file diff --git a/vendor/github.com/hashicorp/go-retryablehttp/LICENSE b/vendor/github.com/hashicorp/go-retryablehttp/LICENSE new file mode 100644 index 0000000000..f4f97ee585 --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/LICENSE @@ -0,0 +1,365 @@ +Copyright (c) 2015 HashiCorp, Inc. + +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/hashicorp/go-retryablehttp/Makefile b/vendor/github.com/hashicorp/go-retryablehttp/Makefile new file mode 100644 index 0000000000..da17640e64 --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/Makefile @@ -0,0 +1,11 @@ +default: test + +test: + go vet ./... + go test -race ./... + +updatedeps: + go get -f -t -u ./... + go get -f -u ./... + +.PHONY: default test updatedeps diff --git a/vendor/github.com/hashicorp/go-retryablehttp/README.md b/vendor/github.com/hashicorp/go-retryablehttp/README.md new file mode 100644 index 0000000000..8943becf19 --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/README.md @@ -0,0 +1,62 @@ +go-retryablehttp +================ + +[![Build Status](http://img.shields.io/travis/hashicorp/go-retryablehttp.svg?style=flat-square)][travis] +[![Go Documentation](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)][godocs] + +[travis]: http://travis-ci.org/hashicorp/go-retryablehttp +[godocs]: http://godoc.org/github.com/hashicorp/go-retryablehttp + +The `retryablehttp` package provides a familiar HTTP client interface with +automatic retries and exponential backoff. It is a thin wrapper over the +standard `net/http` client library and exposes nearly the same public API. This +makes `retryablehttp` very easy to drop into existing programs. + +`retryablehttp` performs automatic retries under certain conditions. Mainly, if +an error is returned by the client (connection errors, etc.), or if a 500-range +response code is received (except 501), then a retry is invoked after a wait +period. Otherwise, the response is returned and left to the caller to +interpret. + +The main difference from `net/http` is that requests which take a request body +(POST/PUT et. al) can have the body provided in a number of ways (some more or +less efficient) that allow "rewinding" the request body if the initial request +fails so that the full request can be attempted again. See the +[godoc](http://godoc.org/github.com/hashicorp/go-retryablehttp) for more +details. + +Version 0.6.0 and before are compatible with Go prior to 1.12. From 0.6.1 onward, Go 1.12+ is required. +From 0.6.7 onward, Go 1.13+ is required. + +Example Use +=========== + +Using this library should look almost identical to what you would do with +`net/http`. The most simple example of a GET request is shown below: + +```go +resp, err := retryablehttp.Get("/foo") +if err != nil { + panic(err) +} +``` + +The returned response object is an `*http.Response`, the same thing you would +usually get from `net/http`. Had the request failed one or more times, the above +call would block and retry with exponential backoff. + +## Getting a stdlib `*http.Client` with retries + +It's possible to convert a `*retryablehttp.Client` directly to a `*http.Client`. +This makes use of retryablehttp broadly applicable with minimal effort. Simply +configure a `*retryablehttp.Client` as you wish, and then call `StandardClient()`: + +```go +retryClient := retryablehttp.NewClient() +retryClient.RetryMax = 10 + +standardClient := retryClient.StandardClient() // *http.Client +``` + +For more usage and examples see the +[godoc](http://godoc.org/github.com/hashicorp/go-retryablehttp). diff --git a/vendor/github.com/hashicorp/go-retryablehttp/client.go b/vendor/github.com/hashicorp/go-retryablehttp/client.go new file mode 100644 index 0000000000..cad96bd97b --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/client.go @@ -0,0 +1,832 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +// Package retryablehttp provides a familiar HTTP client interface with +// automatic retries and exponential backoff. It is a thin wrapper over the +// standard net/http client library and exposes nearly the same public API. +// This makes retryablehttp very easy to drop into existing programs. +// +// retryablehttp performs automatic retries under certain conditions. Mainly, if +// an error is returned by the client (connection errors etc), or if a 500-range +// response is received, then a retry is invoked. Otherwise, the response is +// returned and left to the caller to interpret. +// +// Requests which take a request body should provide a non-nil function +// parameter. The best choice is to provide either a function satisfying +// ReaderFunc which provides multiple io.Readers in an efficient manner, a +// *bytes.Buffer (the underlying raw byte slice will be used) or a raw byte +// slice. As it is a reference type, and we will wrap it as needed by readers, +// we can efficiently re-use the request body without needing to copy it. If an +// io.Reader (such as a *bytes.Reader) is provided, the full body will be read +// prior to the first request, and will be efficiently re-used for any retries. +// ReadSeeker can be used, but some users have observed occasional data races +// between the net/http library and the Seek functionality of some +// implementations of ReadSeeker, so should be avoided if possible. +package retryablehttp + +import ( + "bytes" + "context" + "crypto/x509" + "fmt" + "io" + "io/ioutil" + "log" + "math" + "math/rand" + "net/http" + "net/url" + "os" + "regexp" + "strconv" + "strings" + "sync" + "time" + + cleanhttp "github.com/hashicorp/go-cleanhttp" +) + +var ( + // Default retry configuration + defaultRetryWaitMin = 1 * time.Second + defaultRetryWaitMax = 30 * time.Second + defaultRetryMax = 4 + + // defaultLogger is the logger provided with defaultClient + defaultLogger = log.New(os.Stderr, "", log.LstdFlags) + + // defaultClient is used for performing requests without explicitly making + // a new client. It is purposely private to avoid modifications. + defaultClient = NewClient() + + // We need to consume response bodies to maintain http connections, but + // limit the size we consume to respReadLimit. + respReadLimit = int64(4096) + + // A regular expression to match the error returned by net/http when the + // configured number of redirects is exhausted. This error isn't typed + // specifically so we resort to matching on the error string. + redirectsErrorRe = regexp.MustCompile(`stopped after \d+ redirects\z`) + + // A regular expression to match the error returned by net/http when the + // scheme specified in the URL is invalid. This error isn't typed + // specifically so we resort to matching on the error string. + schemeErrorRe = regexp.MustCompile(`unsupported protocol scheme`) + + // A regular expression to match the error returned by net/http when the + // TLS certificate is not trusted. This error isn't typed + // specifically so we resort to matching on the error string. + notTrustedErrorRe = regexp.MustCompile(`certificate is not trusted`) +) + +// ReaderFunc is the type of function that can be given natively to NewRequest +type ReaderFunc func() (io.Reader, error) + +// ResponseHandlerFunc is a type of function that takes in a Response, and does something with it. +// The ResponseHandlerFunc is called when the HTTP client successfully receives a response and the +// CheckRetry function indicates that a retry of the base request is not necessary. +// If an error is returned from this function, the CheckRetry policy will be used to determine +// whether to retry the whole request (including this handler). +// +// Make sure to check status codes! Even if the request was completed it may have a non-2xx status code. +// +// The response body is not automatically closed. It must be closed either by the ResponseHandlerFunc or +// by the caller out-of-band. Failure to do so will result in a memory leak. +type ResponseHandlerFunc func(*http.Response) error + +// LenReader is an interface implemented by many in-memory io.Reader's. Used +// for automatically sending the right Content-Length header when possible. +type LenReader interface { + Len() int +} + +// Request wraps the metadata needed to create HTTP requests. +type Request struct { + // body is a seekable reader over the request body payload. This is + // used to rewind the request data in between retries. + body ReaderFunc + + responseHandler ResponseHandlerFunc + + // Embed an HTTP request directly. This makes a *Request act exactly + // like an *http.Request so that all meta methods are supported. + *http.Request +} + +// WithContext returns wrapped Request with a shallow copy of underlying *http.Request +// with its context changed to ctx. The provided ctx must be non-nil. +func (r *Request) WithContext(ctx context.Context) *Request { + return &Request{ + body: r.body, + responseHandler: r.responseHandler, + Request: r.Request.WithContext(ctx), + } +} + +// SetResponseHandler allows setting the response handler. +func (r *Request) SetResponseHandler(fn ResponseHandlerFunc) { + r.responseHandler = fn +} + +// BodyBytes allows accessing the request body. It is an analogue to +// http.Request's Body variable, but it returns a copy of the underlying data +// rather than consuming it. +// +// This function is not thread-safe; do not call it at the same time as another +// call, or at the same time this request is being used with Client.Do. +func (r *Request) BodyBytes() ([]byte, error) { + if r.body == nil { + return nil, nil + } + body, err := r.body() + if err != nil { + return nil, err + } + buf := new(bytes.Buffer) + _, err = buf.ReadFrom(body) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// SetBody allows setting the request body. +// +// It is useful if a new body needs to be set without constructing a new Request. +func (r *Request) SetBody(rawBody interface{}) error { + bodyReader, contentLength, err := getBodyReaderAndContentLength(rawBody) + if err != nil { + return err + } + r.body = bodyReader + r.ContentLength = contentLength + return nil +} + +// WriteTo allows copying the request body into a writer. +// +// It writes data to w until there's no more data to write or +// when an error occurs. The return int64 value is the number of bytes +// written. Any error encountered during the write is also returned. +// The signature matches io.WriterTo interface. +func (r *Request) WriteTo(w io.Writer) (int64, error) { + body, err := r.body() + if err != nil { + return 0, err + } + if c, ok := body.(io.Closer); ok { + defer c.Close() + } + return io.Copy(w, body) +} + +func getBodyReaderAndContentLength(rawBody interface{}) (ReaderFunc, int64, error) { + var bodyReader ReaderFunc + var contentLength int64 + + switch body := rawBody.(type) { + // If they gave us a function already, great! Use it. + case ReaderFunc: + bodyReader = body + tmp, err := body() + if err != nil { + return nil, 0, err + } + if lr, ok := tmp.(LenReader); ok { + contentLength = int64(lr.Len()) + } + if c, ok := tmp.(io.Closer); ok { + c.Close() + } + + case func() (io.Reader, error): + bodyReader = body + tmp, err := body() + if err != nil { + return nil, 0, err + } + if lr, ok := tmp.(LenReader); ok { + contentLength = int64(lr.Len()) + } + if c, ok := tmp.(io.Closer); ok { + c.Close() + } + + // If a regular byte slice, we can read it over and over via new + // readers + case []byte: + buf := body + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf), nil + } + contentLength = int64(len(buf)) + + // If a bytes.Buffer we can read the underlying byte slice over and + // over + case *bytes.Buffer: + buf := body + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf.Bytes()), nil + } + contentLength = int64(buf.Len()) + + // We prioritize *bytes.Reader here because we don't really want to + // deal with it seeking so want it to match here instead of the + // io.ReadSeeker case. + case *bytes.Reader: + buf, err := ioutil.ReadAll(body) + if err != nil { + return nil, 0, err + } + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf), nil + } + contentLength = int64(len(buf)) + + // Compat case + case io.ReadSeeker: + raw := body + bodyReader = func() (io.Reader, error) { + _, err := raw.Seek(0, 0) + return ioutil.NopCloser(raw), err + } + if lr, ok := raw.(LenReader); ok { + contentLength = int64(lr.Len()) + } + + // Read all in so we can reset + case io.Reader: + buf, err := ioutil.ReadAll(body) + if err != nil { + return nil, 0, err + } + if len(buf) == 0 { + bodyReader = func() (io.Reader, error) { + return http.NoBody, nil + } + contentLength = 0 + } else { + bodyReader = func() (io.Reader, error) { + return bytes.NewReader(buf), nil + } + contentLength = int64(len(buf)) + } + + // No body provided, nothing to do + case nil: + + // Unrecognized type + default: + return nil, 0, fmt.Errorf("cannot handle type %T", rawBody) + } + return bodyReader, contentLength, nil +} + +// FromRequest wraps an http.Request in a retryablehttp.Request +func FromRequest(r *http.Request) (*Request, error) { + bodyReader, _, err := getBodyReaderAndContentLength(r.Body) + if err != nil { + return nil, err + } + // Could assert contentLength == r.ContentLength + return &Request{body: bodyReader, Request: r}, nil +} + +// NewRequest creates a new wrapped request. +func NewRequest(method, url string, rawBody interface{}) (*Request, error) { + return NewRequestWithContext(context.Background(), method, url, rawBody) +} + +// NewRequestWithContext creates a new wrapped request with the provided context. +// +// The context controls the entire lifetime of a request and its response: +// obtaining a connection, sending the request, and reading the response headers and body. +func NewRequestWithContext(ctx context.Context, method, url string, rawBody interface{}) (*Request, error) { + bodyReader, contentLength, err := getBodyReaderAndContentLength(rawBody) + if err != nil { + return nil, err + } + + httpReq, err := http.NewRequestWithContext(ctx, method, url, nil) + if err != nil { + return nil, err + } + httpReq.ContentLength = contentLength + + return &Request{body: bodyReader, Request: httpReq}, nil +} + +// Logger interface allows to use other loggers than +// standard log.Logger. +type Logger interface { + Printf(string, ...interface{}) +} + +// LeveledLogger is an interface that can be implemented by any logger or a +// logger wrapper to provide leveled logging. The methods accept a message +// string and a variadic number of key-value pairs. For log.Printf style +// formatting where message string contains a format specifier, use Logger +// interface. +type LeveledLogger interface { + Error(msg string, keysAndValues ...interface{}) + Info(msg string, keysAndValues ...interface{}) + Debug(msg string, keysAndValues ...interface{}) + Warn(msg string, keysAndValues ...interface{}) +} + +// hookLogger adapts an LeveledLogger to Logger for use by the existing hook functions +// without changing the API. +type hookLogger struct { + LeveledLogger +} + +func (h hookLogger) Printf(s string, args ...interface{}) { + h.Info(fmt.Sprintf(s, args...)) +} + +// RequestLogHook allows a function to run before each retry. The HTTP +// request which will be made, and the retry number (0 for the initial +// request) are available to users. The internal logger is exposed to +// consumers. +type RequestLogHook func(Logger, *http.Request, int) + +// ResponseLogHook is like RequestLogHook, but allows running a function +// on each HTTP response. This function will be invoked at the end of +// every HTTP request executed, regardless of whether a subsequent retry +// needs to be performed or not. If the response body is read or closed +// from this method, this will affect the response returned from Do(). +type ResponseLogHook func(Logger, *http.Response) + +// CheckRetry specifies a policy for handling retries. It is called +// following each request with the response and error values returned by +// the http.Client. If CheckRetry returns false, the Client stops retrying +// and returns the response to the caller. If CheckRetry returns an error, +// that error value is returned in lieu of the error from the request. The +// Client will close any response body when retrying, but if the retry is +// aborted it is up to the CheckRetry callback to properly close any +// response body before returning. +type CheckRetry func(ctx context.Context, resp *http.Response, err error) (bool, error) + +// Backoff specifies a policy for how long to wait between retries. +// It is called after a failing request to determine the amount of time +// that should pass before trying again. +type Backoff func(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration + +// ErrorHandler is called if retries are expired, containing the last status +// from the http library. If not specified, default behavior for the library is +// to close the body and return an error indicating how many tries were +// attempted. If overriding this, be sure to close the body if needed. +type ErrorHandler func(resp *http.Response, err error, numTries int) (*http.Response, error) + +// Client is used to make HTTP requests. It adds additional functionality +// like automatic retries to tolerate minor outages. +type Client struct { + HTTPClient *http.Client // Internal HTTP client. + Logger interface{} // Customer logger instance. Can be either Logger or LeveledLogger + + RetryWaitMin time.Duration // Minimum time to wait + RetryWaitMax time.Duration // Maximum time to wait + RetryMax int // Maximum number of retries + + // RequestLogHook allows a user-supplied function to be called + // before each retry. + RequestLogHook RequestLogHook + + // ResponseLogHook allows a user-supplied function to be called + // with the response from each HTTP request executed. + ResponseLogHook ResponseLogHook + + // CheckRetry specifies the policy for handling retries, and is called + // after each request. The default policy is DefaultRetryPolicy. + CheckRetry CheckRetry + + // Backoff specifies the policy for how long to wait between retries + Backoff Backoff + + // ErrorHandler specifies the custom error handler to use, if any + ErrorHandler ErrorHandler + + loggerInit sync.Once + clientInit sync.Once +} + +// NewClient creates a new Client with default settings. +func NewClient() *Client { + return &Client{ + HTTPClient: cleanhttp.DefaultPooledClient(), + Logger: defaultLogger, + RetryWaitMin: defaultRetryWaitMin, + RetryWaitMax: defaultRetryWaitMax, + RetryMax: defaultRetryMax, + CheckRetry: DefaultRetryPolicy, + Backoff: DefaultBackoff, + } +} + +func (c *Client) logger() interface{} { + c.loggerInit.Do(func() { + if c.Logger == nil { + return + } + + switch c.Logger.(type) { + case Logger, LeveledLogger: + // ok + default: + // This should happen in dev when they are setting Logger and work on code, not in prod. + panic(fmt.Sprintf("invalid logger type passed, must be Logger or LeveledLogger, was %T", c.Logger)) + } + }) + + return c.Logger +} + +// DefaultRetryPolicy provides a default callback for Client.CheckRetry, which +// will retry on connection errors and server errors. +func DefaultRetryPolicy(ctx context.Context, resp *http.Response, err error) (bool, error) { + // do not retry on context.Canceled or context.DeadlineExceeded + if ctx.Err() != nil { + return false, ctx.Err() + } + + // don't propagate other errors + shouldRetry, _ := baseRetryPolicy(resp, err) + return shouldRetry, nil +} + +// ErrorPropagatedRetryPolicy is the same as DefaultRetryPolicy, except it +// propagates errors back instead of returning nil. This allows you to inspect +// why it decided to retry or not. +func ErrorPropagatedRetryPolicy(ctx context.Context, resp *http.Response, err error) (bool, error) { + // do not retry on context.Canceled or context.DeadlineExceeded + if ctx.Err() != nil { + return false, ctx.Err() + } + + return baseRetryPolicy(resp, err) +} + +func baseRetryPolicy(resp *http.Response, err error) (bool, error) { + if err != nil { + if v, ok := err.(*url.Error); ok { + // Don't retry if the error was due to too many redirects. + if redirectsErrorRe.MatchString(v.Error()) { + return false, v + } + + // Don't retry if the error was due to an invalid protocol scheme. + if schemeErrorRe.MatchString(v.Error()) { + return false, v + } + + // Don't retry if the error was due to TLS cert verification failure. + if notTrustedErrorRe.MatchString(v.Error()) { + return false, v + } + if _, ok := v.Err.(x509.UnknownAuthorityError); ok { + return false, v + } + } + + // The error is likely recoverable so retry. + return true, nil + } + + // 429 Too Many Requests is recoverable. Sometimes the server puts + // a Retry-After response header to indicate when the server is + // available to start processing request from client. + if resp.StatusCode == http.StatusTooManyRequests { + return true, nil + } + + // Check the response code. We retry on 500-range responses to allow + // the server time to recover, as 500's are typically not permanent + // errors and may relate to outages on the server side. This will catch + // invalid response codes as well, like 0 and 999. + if resp.StatusCode == 0 || (resp.StatusCode >= 500 && resp.StatusCode != http.StatusNotImplemented) { + return true, fmt.Errorf("unexpected HTTP status %s", resp.Status) + } + + return false, nil +} + +// DefaultBackoff provides a default callback for Client.Backoff which +// will perform exponential backoff based on the attempt number and limited +// by the provided minimum and maximum durations. +// +// It also tries to parse Retry-After response header when a http.StatusTooManyRequests +// (HTTP Code 429) is found in the resp parameter. Hence it will return the number of +// seconds the server states it may be ready to process more requests from this client. +func DefaultBackoff(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration { + if resp != nil { + if resp.StatusCode == http.StatusTooManyRequests || resp.StatusCode == http.StatusServiceUnavailable { + if s, ok := resp.Header["Retry-After"]; ok { + if sleep, err := strconv.ParseInt(s[0], 10, 64); err == nil { + return time.Second * time.Duration(sleep) + } + } + } + } + + mult := math.Pow(2, float64(attemptNum)) * float64(min) + sleep := time.Duration(mult) + if float64(sleep) != mult || sleep > max { + sleep = max + } + return sleep +} + +// LinearJitterBackoff provides a callback for Client.Backoff which will +// perform linear backoff based on the attempt number and with jitter to +// prevent a thundering herd. +// +// min and max here are *not* absolute values. The number to be multiplied by +// the attempt number will be chosen at random from between them, thus they are +// bounding the jitter. +// +// For instance: +// * To get strictly linear backoff of one second increasing each retry, set +// both to one second (1s, 2s, 3s, 4s, ...) +// * To get a small amount of jitter centered around one second increasing each +// retry, set to around one second, such as a min of 800ms and max of 1200ms +// (892ms, 2102ms, 2945ms, 4312ms, ...) +// * To get extreme jitter, set to a very wide spread, such as a min of 100ms +// and a max of 20s (15382ms, 292ms, 51321ms, 35234ms, ...) +func LinearJitterBackoff(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration { + // attemptNum always starts at zero but we want to start at 1 for multiplication + attemptNum++ + + if max <= min { + // Unclear what to do here, or they are the same, so return min * + // attemptNum + return min * time.Duration(attemptNum) + } + + // Seed rand; doing this every time is fine + rand := rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) + + // Pick a random number that lies somewhere between the min and max and + // multiply by the attemptNum. attemptNum starts at zero so we always + // increment here. We first get a random percentage, then apply that to the + // difference between min and max, and add to min. + jitter := rand.Float64() * float64(max-min) + jitterMin := int64(jitter) + int64(min) + return time.Duration(jitterMin * int64(attemptNum)) +} + +// PassthroughErrorHandler is an ErrorHandler that directly passes through the +// values from the net/http library for the final request. The body is not +// closed. +func PassthroughErrorHandler(resp *http.Response, err error, _ int) (*http.Response, error) { + return resp, err +} + +// Do wraps calling an HTTP method with retries. +func (c *Client) Do(req *Request) (*http.Response, error) { + c.clientInit.Do(func() { + if c.HTTPClient == nil { + c.HTTPClient = cleanhttp.DefaultPooledClient() + } + }) + + logger := c.logger() + + if logger != nil { + switch v := logger.(type) { + case LeveledLogger: + v.Debug("performing request", "method", req.Method, "url", req.URL) + case Logger: + v.Printf("[DEBUG] %s %s", req.Method, req.URL) + } + } + + var resp *http.Response + var attempt int + var shouldRetry bool + var doErr, respErr, checkErr error + + for i := 0; ; i++ { + doErr, respErr = nil, nil + attempt++ + + // Always rewind the request body when non-nil. + if req.body != nil { + body, err := req.body() + if err != nil { + c.HTTPClient.CloseIdleConnections() + return resp, err + } + if c, ok := body.(io.ReadCloser); ok { + req.Body = c + } else { + req.Body = ioutil.NopCloser(body) + } + } + + if c.RequestLogHook != nil { + switch v := logger.(type) { + case LeveledLogger: + c.RequestLogHook(hookLogger{v}, req.Request, i) + case Logger: + c.RequestLogHook(v, req.Request, i) + default: + c.RequestLogHook(nil, req.Request, i) + } + } + + // Attempt the request + resp, doErr = c.HTTPClient.Do(req.Request) + + // Check if we should continue with retries. + shouldRetry, checkErr = c.CheckRetry(req.Context(), resp, doErr) + if !shouldRetry && doErr == nil && req.responseHandler != nil { + respErr = req.responseHandler(resp) + shouldRetry, checkErr = c.CheckRetry(req.Context(), resp, respErr) + } + + err := doErr + if respErr != nil { + err = respErr + } + if err != nil { + switch v := logger.(type) { + case LeveledLogger: + v.Error("request failed", "error", err, "method", req.Method, "url", req.URL) + case Logger: + v.Printf("[ERR] %s %s request failed: %v", req.Method, req.URL, err) + } + } else { + // Call this here to maintain the behavior of logging all requests, + // even if CheckRetry signals to stop. + if c.ResponseLogHook != nil { + // Call the response logger function if provided. + switch v := logger.(type) { + case LeveledLogger: + c.ResponseLogHook(hookLogger{v}, resp) + case Logger: + c.ResponseLogHook(v, resp) + default: + c.ResponseLogHook(nil, resp) + } + } + } + + if !shouldRetry { + break + } + + // We do this before drainBody because there's no need for the I/O if + // we're breaking out + remain := c.RetryMax - i + if remain <= 0 { + break + } + + // We're going to retry, consume any response to reuse the connection. + if doErr == nil { + c.drainBody(resp.Body) + } + + wait := c.Backoff(c.RetryWaitMin, c.RetryWaitMax, i, resp) + if logger != nil { + desc := fmt.Sprintf("%s %s", req.Method, req.URL) + if resp != nil { + desc = fmt.Sprintf("%s (status: %d)", desc, resp.StatusCode) + } + switch v := logger.(type) { + case LeveledLogger: + v.Debug("retrying request", "request", desc, "timeout", wait, "remaining", remain) + case Logger: + v.Printf("[DEBUG] %s: retrying in %s (%d left)", desc, wait, remain) + } + } + timer := time.NewTimer(wait) + select { + case <-req.Context().Done(): + timer.Stop() + c.HTTPClient.CloseIdleConnections() + return nil, req.Context().Err() + case <-timer.C: + } + + // Make shallow copy of http Request so that we can modify its body + // without racing against the closeBody call in persistConn.writeLoop. + httpreq := *req.Request + req.Request = &httpreq + } + + // this is the closest we have to success criteria + if doErr == nil && respErr == nil && checkErr == nil && !shouldRetry { + return resp, nil + } + + defer c.HTTPClient.CloseIdleConnections() + + var err error + if checkErr != nil { + err = checkErr + } else if respErr != nil { + err = respErr + } else { + err = doErr + } + + if c.ErrorHandler != nil { + return c.ErrorHandler(resp, err, attempt) + } + + // By default, we close the response body and return an error without + // returning the response + if resp != nil { + c.drainBody(resp.Body) + } + + // this means CheckRetry thought the request was a failure, but didn't + // communicate why + if err == nil { + return nil, fmt.Errorf("%s %s giving up after %d attempt(s)", + req.Method, req.URL, attempt) + } + + return nil, fmt.Errorf("%s %s giving up after %d attempt(s): %w", + req.Method, req.URL, attempt, err) +} + +// Try to read the response body so we can reuse this connection. +func (c *Client) drainBody(body io.ReadCloser) { + defer body.Close() + _, err := io.Copy(ioutil.Discard, io.LimitReader(body, respReadLimit)) + if err != nil { + if c.logger() != nil { + switch v := c.logger().(type) { + case LeveledLogger: + v.Error("error reading response body", "error", err) + case Logger: + v.Printf("[ERR] error reading response body: %v", err) + } + } + } +} + +// Get is a shortcut for doing a GET request without making a new client. +func Get(url string) (*http.Response, error) { + return defaultClient.Get(url) +} + +// Get is a convenience helper for doing simple GET requests. +func (c *Client) Get(url string) (*http.Response, error) { + req, err := NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return c.Do(req) +} + +// Head is a shortcut for doing a HEAD request without making a new client. +func Head(url string) (*http.Response, error) { + return defaultClient.Head(url) +} + +// Head is a convenience method for doing simple HEAD requests. +func (c *Client) Head(url string) (*http.Response, error) { + req, err := NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return c.Do(req) +} + +// Post is a shortcut for doing a POST request without making a new client. +func Post(url, bodyType string, body interface{}) (*http.Response, error) { + return defaultClient.Post(url, bodyType, body) +} + +// Post is a convenience method for doing simple POST requests. +func (c *Client) Post(url, bodyType string, body interface{}) (*http.Response, error) { + req, err := NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return c.Do(req) +} + +// PostForm is a shortcut to perform a POST with form data without creating +// a new client. +func PostForm(url string, data url.Values) (*http.Response, error) { + return defaultClient.PostForm(url, data) +} + +// PostForm is a convenience method for doing simple POST operations using +// pre-filled url.Values form data. +func (c *Client) PostForm(url string, data url.Values) (*http.Response, error) { + return c.Post(url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} + +// StandardClient returns a stdlib *http.Client with a custom Transport, which +// shims in a *retryablehttp.Client for added retries. +func (c *Client) StandardClient() *http.Client { + return &http.Client{ + Transport: &RoundTripper{Client: c}, + } +} diff --git a/vendor/github.com/hashicorp/go-retryablehttp/roundtripper.go b/vendor/github.com/hashicorp/go-retryablehttp/roundtripper.go new file mode 100644 index 0000000000..8c407adb3b --- /dev/null +++ b/vendor/github.com/hashicorp/go-retryablehttp/roundtripper.go @@ -0,0 +1,55 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package retryablehttp + +import ( + "errors" + "net/http" + "net/url" + "sync" +) + +// RoundTripper implements the http.RoundTripper interface, using a retrying +// HTTP client to execute requests. +// +// It is important to note that retryablehttp doesn't always act exactly as a +// RoundTripper should. This is highly dependent on the retryable client's +// configuration. +type RoundTripper struct { + // The client to use during requests. If nil, the default retryablehttp + // client and settings will be used. + Client *Client + + // once ensures that the logic to initialize the default client runs at + // most once, in a single thread. + once sync.Once +} + +// init initializes the underlying retryable client. +func (rt *RoundTripper) init() { + if rt.Client == nil { + rt.Client = NewClient() + } +} + +// RoundTrip satisfies the http.RoundTripper interface. +func (rt *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + rt.once.Do(rt.init) + + // Convert the request to be retryable. + retryableReq, err := FromRequest(req) + if err != nil { + return nil, err + } + + // Execute the request. + resp, err := rt.Client.Do(retryableReq) + // If we got an error returned by standard library's `Do` method, unwrap it + // otherwise we will wind up erroneously re-nesting the error. + if _, ok := err.(*url.Error); ok { + return resp, errors.Unwrap(err) + } + + return resp, err +} diff --git a/vendor/github.com/hashicorp/golang-lru/.golangci.yml b/vendor/github.com/hashicorp/golang-lru/.golangci.yml new file mode 100644 index 0000000000..49202fc41e --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/.golangci.yml @@ -0,0 +1,30 @@ +linters: + enable: + - megacheck + - revive + - govet + - unconvert + - megacheck + - gas + - gocyclo + - dupl + - misspell + - unparam + - unused + - typecheck + - ineffassign + - stylecheck + - exportloopref + - gocritic + - nakedret + - gosimple + - prealloc + fast: false + disable-all: true + +issues: + exclude-rules: + - path: _test\.go + linters: + - dupl + exclude-use-default: false diff --git a/vendor/github.com/hashicorp/golang-lru/2q.go b/vendor/github.com/hashicorp/golang-lru/2q.go index e474cd0758..15fcad0306 100644 --- a/vendor/github.com/hashicorp/golang-lru/2q.go +++ b/vendor/github.com/hashicorp/golang-lru/2q.go @@ -44,7 +44,7 @@ func New2Q(size int) (*TwoQueueCache, error) { // New2QParams creates a new TwoQueueCache using the provided // parameter values. -func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) { +func New2QParams(size int, recentRatio, ghostRatio float64) (*TwoQueueCache, error) { if size <= 0 { return nil, fmt.Errorf("invalid size") } @@ -138,7 +138,6 @@ func (c *TwoQueueCache) Add(key, value interface{}) { // Add to the recently seen list c.ensureSpace(false) c.recent.Add(key, value) - return } // ensureSpace is used to ensure we have space in the cache diff --git a/vendor/github.com/hashicorp/golang-lru/LICENSE b/vendor/github.com/hashicorp/golang-lru/LICENSE index be2cc4dfb6..0e5d580e0e 100644 --- a/vendor/github.com/hashicorp/golang-lru/LICENSE +++ b/vendor/github.com/hashicorp/golang-lru/LICENSE @@ -1,3 +1,5 @@ +Copyright (c) 2014 HashiCorp, Inc. + Mozilla Public License, version 2.0 1. Definitions diff --git a/vendor/github.com/hashicorp/golang-lru/README.md b/vendor/github.com/hashicorp/golang-lru/README.md index 33e58cfaf9..063bb16056 100644 --- a/vendor/github.com/hashicorp/golang-lru/README.md +++ b/vendor/github.com/hashicorp/golang-lru/README.md @@ -7,7 +7,7 @@ thread safe LRU cache. It is based on the cache in Groupcache. Documentation ============= -Full docs are available on [Godoc](http://godoc.org/github.com/hashicorp/golang-lru) +Full docs are available on [Godoc](https://pkg.go.dev/github.com/hashicorp/golang-lru) Example ======= diff --git a/vendor/github.com/hashicorp/golang-lru/arc.go b/vendor/github.com/hashicorp/golang-lru/arc.go index 555225a218..e396f8428a 100644 --- a/vendor/github.com/hashicorp/golang-lru/arc.go +++ b/vendor/github.com/hashicorp/golang-lru/arc.go @@ -173,7 +173,6 @@ func (c *ARCCache) Add(key, value interface{}) { // Add to the recently seen list c.t1.Add(key, value) - return } // replace is used to adaptively evict from either T1 or T2 diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go index 4e5e9d8fd0..895d8e3ea0 100644 --- a/vendor/github.com/hashicorp/golang-lru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/lru.go @@ -6,10 +6,17 @@ import ( "github.com/hashicorp/golang-lru/simplelru" ) +const ( + // DefaultEvictedBufferSize defines the default buffer size to store evicted key/val + DefaultEvictedBufferSize = 16 +) + // Cache is a thread-safe fixed size LRU cache. type Cache struct { - lru simplelru.LRUCache - lock sync.RWMutex + lru *simplelru.LRU + evictedKeys, evictedVals []interface{} + onEvictedCB func(k, v interface{}) + lock sync.RWMutex } // New creates an LRU of the given size. @@ -19,30 +26,63 @@ func New(size int) (*Cache, error) { // NewWithEvict constructs a fixed size cache with the given eviction // callback. -func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) { - lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted)) - if err != nil { - return nil, err +func NewWithEvict(size int, onEvicted func(key, value interface{})) (c *Cache, err error) { + // create a cache with default settings + c = &Cache{ + onEvictedCB: onEvicted, } - c := &Cache{ - lru: lru, + if onEvicted != nil { + c.initEvictBuffers() + onEvicted = c.onEvicted } - return c, nil + c.lru, err = simplelru.NewLRU(size, onEvicted) + return +} + +func (c *Cache) initEvictBuffers() { + c.evictedKeys = make([]interface{}, 0, DefaultEvictedBufferSize) + c.evictedVals = make([]interface{}, 0, DefaultEvictedBufferSize) +} + +// onEvicted save evicted key/val and sent in externally registered callback +// outside of critical section +func (c *Cache) onEvicted(k, v interface{}) { + c.evictedKeys = append(c.evictedKeys, k) + c.evictedVals = append(c.evictedVals, v) } // Purge is used to completely clear the cache. func (c *Cache) Purge() { + var ks, vs []interface{} c.lock.Lock() c.lru.Purge() + if c.onEvictedCB != nil && len(c.evictedKeys) > 0 { + ks, vs = c.evictedKeys, c.evictedVals + c.initEvictBuffers() + } c.lock.Unlock() + // invoke callback outside of critical section + if c.onEvictedCB != nil { + for i := 0; i < len(ks); i++ { + c.onEvictedCB(ks[i], vs[i]) + } + } } // Add adds a value to the cache. Returns true if an eviction occurred. func (c *Cache) Add(key, value interface{}) (evicted bool) { + var k, v interface{} c.lock.Lock() evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() - return evicted + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } + return } // Get looks up a key's value from the cache. @@ -75,13 +115,21 @@ func (c *Cache) Peek(key interface{}) (value interface{}, ok bool) { // recent-ness or deleting it for being stale, and if not, adds the value. // Returns whether found and whether an eviction occurred. func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { + var k, v interface{} c.lock.Lock() - defer c.lock.Unlock() - if c.lru.Contains(key) { + c.lock.Unlock() return true, false } evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } return false, evicted } @@ -89,47 +137,80 @@ func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { // recent-ness or deleting it for being stale, and if not, adds the value. // Returns whether found and whether an eviction occurred. func (c *Cache) PeekOrAdd(key, value interface{}) (previous interface{}, ok, evicted bool) { + var k, v interface{} c.lock.Lock() - defer c.lock.Unlock() - previous, ok = c.lru.Peek(key) if ok { + c.lock.Unlock() return previous, true, false } - evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } return nil, false, evicted } // Remove removes the provided key from the cache. func (c *Cache) Remove(key interface{}) (present bool) { + var k, v interface{} c.lock.Lock() present = c.lru.Remove(key) + if c.onEvictedCB != nil && present { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() + if c.onEvictedCB != nil && present { + c.onEvictedCB(k, v) + } return } // Resize changes the cache size. func (c *Cache) Resize(size int) (evicted int) { + var ks, vs []interface{} c.lock.Lock() evicted = c.lru.Resize(size) + if c.onEvictedCB != nil && evicted > 0 { + ks, vs = c.evictedKeys, c.evictedVals + c.initEvictBuffers() + } c.lock.Unlock() + if c.onEvictedCB != nil && evicted > 0 { + for i := 0; i < len(ks); i++ { + c.onEvictedCB(ks[i], vs[i]) + } + } return evicted } // RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() (key interface{}, value interface{}, ok bool) { +func (c *Cache) RemoveOldest() (key, value interface{}, ok bool) { + var k, v interface{} c.lock.Lock() key, value, ok = c.lru.RemoveOldest() + if c.onEvictedCB != nil && ok { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() + if c.onEvictedCB != nil && ok { + c.onEvictedCB(k, v) + } return } // GetOldest returns the oldest entry -func (c *Cache) GetOldest() (key interface{}, value interface{}, ok bool) { - c.lock.Lock() +func (c *Cache) GetOldest() (key, value interface{}, ok bool) { + c.lock.RLock() key, value, ok = c.lru.GetOldest() - c.lock.Unlock() + c.lock.RUnlock() return } diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go index a86c8539e0..9233583c91 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go @@ -25,7 +25,7 @@ type entry struct { // NewLRU constructs an LRU of the given size func NewLRU(size int, onEvict EvictCallback) (*LRU, error) { if size <= 0 { - return nil, errors.New("Must provide a positive size") + return nil, errors.New("must provide a positive size") } c := &LRU{ size: size, @@ -109,7 +109,7 @@ func (c *LRU) Remove(key interface{}) (present bool) { } // RemoveOldest removes the oldest item from the cache. -func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { +func (c *LRU) RemoveOldest() (key, value interface{}, ok bool) { ent := c.evictList.Back() if ent != nil { c.removeElement(ent) @@ -120,7 +120,7 @@ func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { } // GetOldest returns the oldest entry -func (c *LRU) GetOldest() (key interface{}, value interface{}, ok bool) { +func (c *LRU) GetOldest() (key, value interface{}, ok bool) { ent := c.evictList.Back() if ent != nil { kv := ent.Value.(*entry) diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go index 92d70934d6..cb7f8caf03 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go @@ -1,3 +1,4 @@ +// Package simplelru provides simple LRU implementation based on build-in container/list. package simplelru // LRUCache is the interface for simple LRU cache. @@ -34,6 +35,6 @@ type LRUCache interface { // Clears all cache entries. Purge() - // Resizes cache, returning number evicted - Resize(int) int + // Resizes cache, returning number evicted + Resize(int) int } diff --git a/vendor/github.com/hashicorp/golang-lru/testing.go b/vendor/github.com/hashicorp/golang-lru/testing.go new file mode 100644 index 0000000000..492760782c --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/testing.go @@ -0,0 +1,16 @@ +package lru + +import ( + "crypto/rand" + "math" + "math/big" + "testing" +) + +func getRand(tb testing.TB) int64 { + out, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64)) + if err != nil { + tb.Fatal(err) + } + return out.Int64() +} diff --git a/vendor/github.com/imdario/mergo/CONTRIBUTING.md b/vendor/github.com/imdario/mergo/CONTRIBUTING.md new file mode 100644 index 0000000000..0a1ff9f94d --- /dev/null +++ b/vendor/github.com/imdario/mergo/CONTRIBUTING.md @@ -0,0 +1,112 @@ + +# Contributing to mergo + +First off, thanks for taking the time to contribute! ❤️ + +All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉 + +> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: +> - Star the project +> - Tweet about it +> - Refer this project in your project's readme +> - Mention the project at local meetups and tell your friends/colleagues + + +## Table of Contents + +- [Code of Conduct](#code-of-conduct) +- [I Have a Question](#i-have-a-question) +- [I Want To Contribute](#i-want-to-contribute) +- [Reporting Bugs](#reporting-bugs) +- [Suggesting Enhancements](#suggesting-enhancements) + +## Code of Conduct + +This project and everyone participating in it is governed by the +[mergo Code of Conduct](https://github.com/imdario/mergoblob/master/CODE_OF_CONDUCT.md). +By participating, you are expected to uphold this code. Please report unacceptable behavior +to <>. + + +## I Have a Question + +> If you want to ask a question, we assume that you have read the available [Documentation](https://pkg.go.dev/github.com/imdario/mergo). + +Before you ask a question, it is best to search for existing [Issues](https://github.com/imdario/mergo/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first. + +If you then still feel the need to ask a question and need clarification, we recommend the following: + +- Open an [Issue](https://github.com/imdario/mergo/issues/new). +- Provide as much context as you can about what you're running into. +- Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant. + +We will then take care of the issue as soon as possible. + +## I Want To Contribute + +> ### Legal Notice +> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license. + +### Reporting Bugs + + +#### Before Submitting a Bug Report + +A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible. + +- Make sure that you are using the latest version. +- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](). If you are looking for support, you might want to check [this section](#i-have-a-question)). +- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/imdario/mergoissues?q=label%3Abug). +- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. +- Collect information about the bug: +- Stack trace (Traceback) +- OS, Platform and Version (Windows, Linux, macOS, x86, ARM) +- Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant. +- Possibly your input and the output +- Can you reliably reproduce the issue? And can you also reproduce it with older versions? + + +#### How Do I Submit a Good Bug Report? + +> You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to . + + +We use GitHub issues to track bugs and errors. If you run into an issue with the project: + +- Open an [Issue](https://github.com/imdario/mergo/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) +- Explain the behavior you would expect and the actual behavior. +- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. +- Provide the information you collected in the previous section. + +Once it's filed: + +- The project team will label the issue accordingly. +- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced. +- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be implemented by someone. + +### Suggesting Enhancements + +This section guides you through submitting an enhancement suggestion for mergo, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions. + + +#### Before Submitting an Enhancement + +- Make sure that you are using the latest version. +- Read the [documentation]() carefully and find out if the functionality is already covered, maybe by an individual configuration. +- Perform a [search](https://github.com/imdario/mergo/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. +- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library. + + +#### How Do I Submit a Good Enhancement Suggestion? + +Enhancement suggestions are tracked as [GitHub issues](https://github.com/imdario/mergo/issues). + +- Use a **clear and descriptive title** for the issue to identify the suggestion. +- Provide a **step-by-step description of the suggested enhancement** in as many details as possible. +- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. +- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. +- **Explain why this enhancement would be useful** to most mergo users. You may also want to point out the other projects that solved it better and which could serve as inspiration. + + +## Attribution +This guide is based on the **contributing-gen**. [Make your own](https://github.com/bttger/contributing-gen)! diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md index 7e6f7aeee8..4f02874985 100644 --- a/vendor/github.com/imdario/mergo/README.md +++ b/vendor/github.com/imdario/mergo/README.md @@ -1,6 +1,5 @@ # Mergo - [![GoDoc][3]][4] [![GitHub release][5]][6] [![GoCard][7]][8] @@ -9,6 +8,7 @@ [![Sourcegraph][11]][12] [![FOSSA Status][13]][14] [![Become my sponsor][15]][16] +[![Tidelift][17]][18] [1]: https://travis-ci.org/imdario/mergo.png [2]: https://travis-ci.org/imdario/mergo @@ -26,6 +26,8 @@ [14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield [15]: https://img.shields.io/github/sponsors/imdario [16]: https://github.com/sponsors/imdario +[17]: https://tidelift.com/badges/package/go/github.com%2Fimdario%2Fmergo +[18]: https://tidelift.com/subscription/pkg/go-github.com-imdario-mergo A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. @@ -55,7 +57,6 @@ If Mergo is useful to you, consider buying me a coffee, a beer, or making a mont ### Mergo in the wild -- [cli/cli](https://github.com/cli/cli) - [moby/moby](https://github.com/moby/moby) - [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes) - [vmware/dispatch](https://github.com/vmware/dispatch) diff --git a/vendor/github.com/imdario/mergo/SECURITY.md b/vendor/github.com/imdario/mergo/SECURITY.md new file mode 100644 index 0000000000..a5de61f77b --- /dev/null +++ b/vendor/github.com/imdario/mergo/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.3.x | :white_check_mark: | +| < 0.3 | :x: | + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go index a13a7ee46c..b50d5c2a4e 100644 --- a/vendor/github.com/imdario/mergo/map.go +++ b/vendor/github.com/imdario/mergo/map.go @@ -44,7 +44,7 @@ func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, conf } } // Remember, remember... - visited[h] = &visit{addr, typ, seen} + visited[h] = &visit{typ, seen, addr} } zeroValue := reflect.Value{} switch dst.Kind() { @@ -58,7 +58,7 @@ func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, conf } fieldName := field.Name fieldName = changeInitialCase(fieldName, unicode.ToLower) - if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v)) || overwrite) { + if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v), !config.ShouldNotDereference) || overwrite) { dstMap[fieldName] = src.Field(i).Interface() } } @@ -142,7 +142,7 @@ func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { func _map(dst, src interface{}, opts ...func(*Config)) error { if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { - return ErrNonPointerAgument + return ErrNonPointerArgument } var ( vDst, vSrc reflect.Value diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go index 8b4e2f47a0..0ef9b2138c 100644 --- a/vendor/github.com/imdario/mergo/merge.go +++ b/vendor/github.com/imdario/mergo/merge.go @@ -38,10 +38,11 @@ func isExportedComponent(field *reflect.StructField) bool { } type Config struct { + Transformers Transformers Overwrite bool + ShouldNotDereference bool AppendSlice bool TypeCheck bool - Transformers Transformers overwriteWithEmptyValue bool overwriteSliceWithEmptyValue bool sliceDeepCopy bool @@ -76,7 +77,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } } // Remember, remember... - visited[h] = &visit{addr, typ, seen} + visited[h] = &visit{typ, seen, addr} } if config.Transformers != nil && !isReflectNil(dst) && dst.IsValid() { @@ -95,7 +96,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } } } else { - if dst.CanSet() && (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { + if dst.CanSet() && (isReflectNil(dst) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc) { dst.Set(src) } } @@ -110,7 +111,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } if src.Kind() != reflect.Map { - if overwrite { + if overwrite && dst.CanSet() { dst.Set(src) } return @@ -162,7 +163,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co dstSlice = reflect.ValueOf(dstElement.Interface()) } - if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { + if (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy { if typeCheck && srcSlice.Type() != dstSlice.Type() { return fmt.Errorf("cannot override two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) } @@ -194,22 +195,38 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co dst.SetMapIndex(key, dstSlice) } } - if dstElement.IsValid() && !isEmptyValue(dstElement) && (reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map || reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice) { - continue + + if dstElement.IsValid() && !isEmptyValue(dstElement, !config.ShouldNotDereference) { + if reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice { + continue + } + if reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map && reflect.TypeOf(dstElement.Interface()).Kind() == reflect.Map { + continue + } } - if srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement)) { + if srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement, !config.ShouldNotDereference)) { if dst.IsNil() { dst.Set(reflect.MakeMap(dst.Type())) } dst.SetMapIndex(key, srcElement) } } + + // Ensure that all keys in dst are deleted if they are not in src. + if overwriteWithEmptySrc { + for _, key := range dst.MapKeys() { + srcElement := src.MapIndex(key) + if !srcElement.IsValid() { + dst.SetMapIndex(key, reflect.Value{}) + } + } + } case reflect.Slice: if !dst.CanSet() { break } - if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { + if (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy { dst.Set(src) } else if config.AppendSlice { if src.Type() != dst.Type() { @@ -244,12 +261,18 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if src.Kind() != reflect.Interface { if dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + if dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) { dst.Set(src) } } else if src.Kind() == reflect.Ptr { - if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return + if !config.ShouldNotDereference { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + } else { + if overwriteWithEmptySrc || (overwrite && !src.IsNil()) || dst.IsNil() { + dst.Set(src) + } } } else if dst.Elem().Type() == src.Type() { if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { @@ -262,7 +285,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } if dst.IsNil() || overwrite { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + if dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) { dst.Set(src) } break @@ -275,7 +298,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co break } default: - mustSet := (isEmptyValue(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) + mustSet := (isEmptyValue(dst, !config.ShouldNotDereference) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc) if mustSet { if dst.CanSet() { dst.Set(src) @@ -326,6 +349,12 @@ func WithOverrideEmptySlice(config *Config) { config.overwriteSliceWithEmptyValue = true } +// WithoutDereference prevents dereferencing pointers when evaluating whether they are empty +// (i.e. a non-nil pointer is never considered empty). +func WithoutDereference(config *Config) { + config.ShouldNotDereference = true +} + // WithAppendSlice will make merge append slices instead of overwriting it. func WithAppendSlice(config *Config) { config.AppendSlice = true @@ -344,7 +373,7 @@ func WithSliceDeepCopy(config *Config) { func merge(dst, src interface{}, opts ...func(*Config)) error { if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { - return ErrNonPointerAgument + return ErrNonPointerArgument } var ( vDst, vSrc reflect.Value diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go index 9fe362d476..0a721e2d85 100644 --- a/vendor/github.com/imdario/mergo/mergo.go +++ b/vendor/github.com/imdario/mergo/mergo.go @@ -20,7 +20,7 @@ var ( ErrNotSupported = errors.New("only structs, maps, and slices are supported") ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") - ErrNonPointerAgument = errors.New("dst must be a pointer") + ErrNonPointerArgument = errors.New("dst must be a pointer") ) // During deepMerge, must keep track of checks that are @@ -28,13 +28,13 @@ var ( // checks in progress are true when it reencounters them. // Visited are stored in a map indexed by 17 * a1 + a2; type visit struct { - ptr uintptr typ reflect.Type next *visit + ptr uintptr } // From src/pkg/encoding/json/encode.go. -func isEmptyValue(v reflect.Value) bool { +func isEmptyValue(v reflect.Value, shouldDereference bool) bool { switch v.Kind() { case reflect.Array, reflect.Map, reflect.Slice, reflect.String: return v.Len() == 0 @@ -50,7 +50,10 @@ func isEmptyValue(v reflect.Value) bool { if v.IsNil() { return true } - return isEmptyValue(v.Elem()) + if shouldDereference { + return isEmptyValue(v.Elem(), shouldDereference) + } + return false case reflect.Func: return v.IsNil() case reflect.Invalid: diff --git a/vendor/github.com/jonboulle/clockwork/README.md b/vendor/github.com/jonboulle/clockwork/README.md index cad6083572..42970da802 100644 --- a/vendor/github.com/jonboulle/clockwork/README.md +++ b/vendor/github.com/jonboulle/clockwork/README.md @@ -2,9 +2,9 @@ [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge-flat.svg)](https://github.com/avelino/awesome-go#utilities) -[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/jonboulle/clockwork/CI?style=flat-square)](https://github.com/jonboulle/clockwork/actions?query=workflow%3ACI) +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/jonboulle/clockwork/ci.yaml?style=flat-square)](https://github.com/jonboulle/clockwork/actions?query=workflow%3ACI) [![Go Report Card](https://goreportcard.com/badge/github.com/jonboulle/clockwork?style=flat-square)](https://goreportcard.com/report/github.com/jonboulle/clockwork) -![Go Version](https://img.shields.io/badge/go%20version-%3E=1.11-61CFDD.svg?style=flat-square) +![Go Version](https://img.shields.io/badge/go%20version-%3E=1.15-61CFDD.svg?style=flat-square) [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/jonboulle/clockwork) **A simple fake clock for Go.** diff --git a/vendor/github.com/jonboulle/clockwork/clockwork.go b/vendor/github.com/jonboulle/clockwork/clockwork.go index 9e1c8143ad..3206b36e4e 100644 --- a/vendor/github.com/jonboulle/clockwork/clockwork.go +++ b/vendor/github.com/jonboulle/clockwork/clockwork.go @@ -1,12 +1,14 @@ package clockwork import ( + "context" + "sort" "sync" "time" ) -// Clock provides an interface that packages can use instead of directly -// using the time module, so that chronology-related behavior can be tested +// Clock provides an interface that packages can use instead of directly using +// the [time] module, so that chronology-related behavior can be tested. type Clock interface { After(d time.Duration) <-chan time.Time Sleep(d time.Duration) @@ -14,18 +16,23 @@ type Clock interface { Since(t time.Time) time.Duration NewTicker(d time.Duration) Ticker NewTimer(d time.Duration) Timer + AfterFunc(d time.Duration, f func()) Timer } -// FakeClock provides an interface for a clock which can be -// manually advanced through time +// FakeClock provides an interface for a clock which can be manually advanced +// through time. +// +// FakeClock maintains a list of "waiters," which consists of all callers +// waiting on the underlying clock (i.e. Tickers and Timers including callers of +// Sleep or After). Users can call BlockUntil to block until the clock has an +// expected number of waiters. type FakeClock interface { Clock // Advance advances the FakeClock to a new point in time, ensuring any existing - // sleepers are notified appropriately before returning + // waiters are notified appropriately before returning. Advance(d time.Duration) - // BlockUntil will block until the FakeClock has the given number of - // sleepers (callers of Sleep or After) - BlockUntil(n int) + // BlockUntil blocks until the FakeClock has the given number of waiters. + BlockUntil(waiters int) } // NewRealClock returns a Clock which simply delegates calls to the actual time @@ -36,10 +43,11 @@ func NewRealClock() Clock { // NewFakeClock returns a FakeClock implementation which can be // manually advanced through time for testing. The initial time of the -// FakeClock will be an arbitrary non-zero time. +// FakeClock will be the current system time. +// +// Tests that require a deterministic time must use NewFakeClockAt. func NewFakeClock() FakeClock { - // use a fixture that does not fulfill Time.IsZero() - return NewFakeClockAt(time.Date(1984, time.April, 4, 0, 0, 0, 0, time.UTC)) + return NewFakeClockAt(time.Now()) } // NewFakeClockAt returns a FakeClock initialised at the given time.Time. @@ -68,71 +76,52 @@ func (rc *realClock) Since(t time.Time) time.Duration { } func (rc *realClock) NewTicker(d time.Duration) Ticker { - return &realTicker{time.NewTicker(d)} + return realTicker{time.NewTicker(d)} } func (rc *realClock) NewTimer(d time.Duration) Timer { - return &realTimer{time.NewTimer(d)} + return realTimer{time.NewTimer(d)} +} + +func (rc *realClock) AfterFunc(d time.Duration, f func()) Timer { + return realTimer{time.AfterFunc(d, f)} } type fakeClock struct { - sleepers []*sleeper + // l protects all attributes of the clock, including all attributes of all + // waiters and blockers. + l sync.RWMutex + waiters []expirer blockers []*blocker time time.Time - - l sync.RWMutex -} - -// sleeper represents a caller of After or Sleep -type sleeper struct { - until time.Time - done chan time.Time } -// blocker represents a caller of BlockUntil +// blocker is a caller of BlockUntil. type blocker struct { count int - ch chan struct{} + + // ch is closed when the underlying clock has the specificed number of blockers. + ch chan struct{} } -// After mimics time.After; it waits for the given duration to elapse on the -// fakeClock, then sends the current time on the returned channel. -func (fc *fakeClock) After(d time.Duration) <-chan time.Time { - fc.l.Lock() - defer fc.l.Unlock() - now := fc.time - done := make(chan time.Time, 1) - if d.Nanoseconds() <= 0 { - // special case - trigger immediately - done <- now - } else { - // otherwise, add to the set of sleepers - s := &sleeper{ - until: now.Add(d), - done: done, - } - fc.sleepers = append(fc.sleepers, s) - // and notify any blockers - fc.blockers = notifyBlockers(fc.blockers, len(fc.sleepers)) - } - return done +// expirer is a timer or ticker that expires at some point in the future. +type expirer interface { + // expire the expirer at the given time, returning the desired duration until + // the next expiration, if any. + expire(now time.Time) (next *time.Duration) + + // Get and set the expiration time. + expiry() time.Time + setExpiry(time.Time) } -// notifyBlockers notifies all the blockers waiting until the at least the given -// number of sleepers are waiting on the fakeClock. It returns an updated slice -// of blockers (i.e. those still waiting) -func notifyBlockers(blockers []*blocker, count int) (newBlockers []*blocker) { - for _, b := range blockers { - if b.count <= count { - close(b.ch) - } else { - newBlockers = append(newBlockers, b) - } - } - return +// After mimics [time.After]; it waits for the given duration to elapse on the +// fakeClock, then sends the current time on the returned channel. +func (fc *fakeClock) After(d time.Duration) <-chan time.Time { + return fc.NewTimer(d).Chan() } -// Sleep blocks until the given duration has passed on the fakeClock +// Sleep blocks until the given duration has passed on the fakeClock. func (fc *fakeClock) Sleep(d time.Duration) { <-fc.After(d) } @@ -140,82 +129,221 @@ func (fc *fakeClock) Sleep(d time.Duration) { // Now returns the current time of the fakeClock func (fc *fakeClock) Now() time.Time { fc.l.RLock() - t := fc.time - fc.l.RUnlock() - return t + defer fc.l.RUnlock() + return fc.time } -// Since returns the duration that has passed since the given time on the fakeClock +// Since returns the duration that has passed since the given time on the +// fakeClock. func (fc *fakeClock) Since(t time.Time) time.Duration { return fc.Now().Sub(t) } -// NewTicker returns a ticker that will expire only after calls to fakeClock -// Advance have moved the clock passed the given duration +// NewTicker returns a Ticker that will expire only after calls to +// fakeClock.Advance() have moved the clock past the given duration. func (fc *fakeClock) NewTicker(d time.Duration) Ticker { - ft := &fakeTicker{ - c: make(chan time.Time, 1), - stop: make(chan bool, 1), - clock: fc, - period: d, + var ft *fakeTicker + ft = &fakeTicker{ + firer: newFirer(), + d: d, + reset: func(d time.Duration) { fc.set(ft, d) }, + stop: func() { fc.stop(ft) }, } - ft.runTickThread() + fc.set(ft, d) return ft } -// NewTimer returns a timer that will fire only after calls to fakeClock -// Advance have moved the clock passed the given duration +// NewTimer returns a Timer that will fire only after calls to +// fakeClock.Advance() have moved the clock past the given duration. func (fc *fakeClock) NewTimer(d time.Duration) Timer { - stopped := uint32(0) - if d <= 0 { - stopped = 1 - } - ft := &fakeTimer{ - c: make(chan time.Time, 1), - stop: make(chan struct{}, 1), - reset: make(chan reset, 1), - clock: fc, - stopped: stopped, - } + return fc.newTimer(d, nil) +} - ft.run(d) +// AfterFunc mimics [time.AfterFunc]; it returns a Timer that will invoke the +// given function only after calls to fakeClock.Advance() have moved the clock +// past the given duration. +func (fc *fakeClock) AfterFunc(d time.Duration, f func()) Timer { + return fc.newTimer(d, f) +} + +// newTimer returns a new timer, using an optional afterFunc. +func (fc *fakeClock) newTimer(d time.Duration, afterfunc func()) *fakeTimer { + var ft *fakeTimer + ft = &fakeTimer{ + firer: newFirer(), + reset: func(d time.Duration) bool { + fc.l.Lock() + defer fc.l.Unlock() + // fc.l must be held across the calls to stopExpirer & setExpirer. + stopped := fc.stopExpirer(ft) + fc.setExpirer(ft, d) + return stopped + }, + stop: func() bool { return fc.stop(ft) }, + + afterFunc: afterfunc, + } + fc.set(ft, d) return ft } -// Advance advances fakeClock to a new point in time, ensuring channels from any -// previous invocations of After are notified appropriately before returning +// Advance advances fakeClock to a new point in time, ensuring waiters and +// blockers are notified appropriately before returning. func (fc *fakeClock) Advance(d time.Duration) { fc.l.Lock() defer fc.l.Unlock() end := fc.time.Add(d) - var newSleepers []*sleeper - for _, s := range fc.sleepers { - if end.Sub(s.until) >= 0 { - s.done <- end - } else { - newSleepers = append(newSleepers, s) + // Expire the earliest waiter until the earliest waiter's expiration is after + // end. + // + // We don't iterate because the callback of the waiter might register a new + // waiter, so the list of waiters might change as we execute this. + for len(fc.waiters) > 0 && !end.Before(fc.waiters[0].expiry()) { + w := fc.waiters[0] + fc.waiters = fc.waiters[1:] + + // Use the waiter's expriation as the current time for this expiration. + now := w.expiry() + fc.time = now + if d := w.expire(now); d != nil { + // Set the new exipration if needed. + fc.setExpirer(w, *d) } } - fc.sleepers = newSleepers - fc.blockers = notifyBlockers(fc.blockers, len(fc.sleepers)) fc.time = end } -// BlockUntil will block until the fakeClock has the given number of sleepers -// (callers of Sleep or After) +// BlockUntil blocks until the fakeClock has the given number of waiters. +// +// Prefer BlockUntilContext, which offers context cancellation to prevent +// deadlock. +// +// Deprecation warning: This function might be deprecated in later versions. func (fc *fakeClock) BlockUntil(n int) { - fc.l.Lock() - // Fast path: we already have >= n sleepers. - if len(fc.sleepers) >= n { - fc.l.Unlock() + b := fc.newBlocker(n) + if b == nil { return } - // Otherwise, we have < n sleepers. Set up a new blocker to wait for more. + <-b.ch +} + +// BlockUntilContext blocks until the fakeClock has the given number of waiters +// or the context is cancelled. +func (fc *fakeClock) BlockUntilContext(ctx context.Context, n int) error { + b := fc.newBlocker(n) + if b == nil { + return nil + } + + select { + case <-b.ch: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + +func (fc *fakeClock) newBlocker(n int) *blocker { + fc.l.Lock() + defer fc.l.Unlock() + // Fast path: we already have >= n waiters. + if len(fc.waiters) >= n { + return nil + } + // Set up a new blocker to wait for more waiters. b := &blocker{ count: n, ch: make(chan struct{}), } fc.blockers = append(fc.blockers, b) - fc.l.Unlock() - <-b.ch + return b +} + +// stop stops an expirer, returning true if the expirer was stopped. +func (fc *fakeClock) stop(e expirer) bool { + fc.l.Lock() + defer fc.l.Unlock() + return fc.stopExpirer(e) +} + +// stopExpirer stops an expirer, returning true if the expirer was stopped. +// +// The caller must hold fc.l. +func (fc *fakeClock) stopExpirer(e expirer) bool { + for i, t := range fc.waiters { + if t == e { + // Remove element, maintaining order. + copy(fc.waiters[i:], fc.waiters[i+1:]) + fc.waiters[len(fc.waiters)-1] = nil + fc.waiters = fc.waiters[:len(fc.waiters)-1] + return true + } + } + return false +} + +// set sets an expirer to expire at a future point in time. +func (fc *fakeClock) set(e expirer, d time.Duration) { + fc.l.Lock() + defer fc.l.Unlock() + fc.setExpirer(e, d) +} + +// setExpirer sets an expirer to expire at a future point in time. +// +// The caller must hold fc.l. +func (fc *fakeClock) setExpirer(e expirer, d time.Duration) { + if d.Nanoseconds() <= 0 { + // special case - trigger immediately, never reset. + // + // TODO: Explain what cases this covers. + e.expire(fc.time) + return + } + // Add the expirer to the set of waiters and notify any blockers. + e.setExpiry(fc.time.Add(d)) + fc.waiters = append(fc.waiters, e) + sort.Slice(fc.waiters, func(i int, j int) bool { + return fc.waiters[i].expiry().Before(fc.waiters[j].expiry()) + }) + + // Notify blockers of our new waiter. + var blocked []*blocker + count := len(fc.waiters) + for _, b := range fc.blockers { + if b.count <= count { + close(b.ch) + continue + } + blocked = append(blocked, b) + } + fc.blockers = blocked +} + +// firer is used by fakeTimer and fakeTicker used to help implement expirer. +type firer struct { + // The channel associated with the firer, used to send expriation times. + c chan time.Time + + // The time when the firer expires. Only meaningful if the firer is currently + // one of a fakeClock's waiters. + exp time.Time +} + +func newFirer() firer { + return firer{c: make(chan time.Time, 1)} +} + +func (f *firer) Chan() <-chan time.Time { + return f.c +} + +// expiry implements expirer. +func (f *firer) expiry() time.Time { + return f.exp +} + +// setExpiry implements expirer. +func (f *firer) setExpiry(t time.Time) { + f.exp = t } diff --git a/vendor/github.com/jonboulle/clockwork/ticker.go b/vendor/github.com/jonboulle/clockwork/ticker.go index 32b5d01e75..b68e4d7773 100644 --- a/vendor/github.com/jonboulle/clockwork/ticker.go +++ b/vendor/github.com/jonboulle/clockwork/ticker.go @@ -1,72 +1,48 @@ package clockwork -import ( - "time" -) +import "time" -// Ticker provides an interface which can be used instead of directly -// using the ticker within the time module. The real-time ticker t -// provides ticks through t.C which becomes now t.Chan() to make -// this channel requirement definable in this interface. +// Ticker provides an interface which can be used instead of directly using +// [time.Ticker]. The real-time ticker t provides ticks through t.C which +// becomes t.Chan() to make this channel requirement definable in this +// interface. type Ticker interface { Chan() <-chan time.Time + Reset(d time.Duration) Stop() } type realTicker struct{ *time.Ticker } -func (rt *realTicker) Chan() <-chan time.Time { - return rt.C +func (r realTicker) Chan() <-chan time.Time { + return r.C } type fakeTicker struct { - c chan time.Time - stop chan bool - clock FakeClock - period time.Duration + firer + + // reset and stop provide the implementation of the respective exported + // functions. + reset func(d time.Duration) + stop func() + + // The duration of the ticker. + d time.Duration } -func (ft *fakeTicker) Chan() <-chan time.Time { - return ft.c +func (f *fakeTicker) Reset(d time.Duration) { + f.reset(d) } -func (ft *fakeTicker) Stop() { - ft.stop <- true +func (f *fakeTicker) Stop() { + f.stop() } -// runTickThread initializes a background goroutine to send the tick time to the ticker channel -// after every period. Tick events are discarded if the underlying ticker channel does not have -// enough capacity. -func (ft *fakeTicker) runTickThread() { - nextTick := ft.clock.Now().Add(ft.period) - next := ft.clock.After(ft.period) - go func() { - for { - select { - case <-ft.stop: - return - case <-next: - // We send the time that the tick was supposed to occur at. - tick := nextTick - // Before sending the tick, we'll compute the next tick time and star the clock.After call. - now := ft.clock.Now() - // First, figure out how many periods there have been between "now" and the time we were - // supposed to have trigged, then advance over all of those. - skipTicks := (now.Sub(tick) + ft.period - 1) / ft.period - nextTick = nextTick.Add(skipTicks * ft.period) - // Now, keep advancing until we are past now. This should happen at most once. - for !nextTick.After(now) { - nextTick = nextTick.Add(ft.period) - } - // Figure out how long between now and the next scheduled tick, then wait that long. - remaining := nextTick.Sub(now) - next = ft.clock.After(remaining) - // Finally, we can actually send the tick. - select { - case ft.c <- tick: - default: - } - } - } - }() +func (f *fakeTicker) expire(now time.Time) *time.Duration { + // Never block on expiration. + select { + case f.c <- now: + default: + } + return &f.d } diff --git a/vendor/github.com/jonboulle/clockwork/timer.go b/vendor/github.com/jonboulle/clockwork/timer.go index d41d9616cc..6f928b3dde 100644 --- a/vendor/github.com/jonboulle/clockwork/timer.go +++ b/vendor/github.com/jonboulle/clockwork/timer.go @@ -1,97 +1,53 @@ package clockwork -import ( - "sync/atomic" - "time" -) +import "time" -// Timer provides an interface which can be used instead of directly -// using the timer within the time module. The real-time timer t -// provides events through t.C which becomes now t.Chan() to make -// this channel requirement definable in this interface. +// Timer provides an interface which can be used instead of directly using +// [time.Timer]. The real-time timer t provides events through t.C which becomes +// t.Chan() to make this channel requirement definable in this interface. type Timer interface { Chan() <-chan time.Time Reset(d time.Duration) bool Stop() bool } -type realTimer struct { - *time.Timer -} +type realTimer struct{ *time.Timer } func (r realTimer) Chan() <-chan time.Time { return r.C } type fakeTimer struct { - c chan time.Time - clock FakeClock - stop chan struct{} - reset chan reset - stopped uint32 -} + firer -func (f *fakeTimer) Chan() <-chan time.Time { - return f.c + // reset and stop provide the implmenetation of the respective exported + // functions. + reset func(d time.Duration) bool + stop func() bool + + // If present when the timer fires, the timer calls afterFunc in its own + // goroutine rather than sending the time on Chan(). + afterFunc func() } func (f *fakeTimer) Reset(d time.Duration) bool { - stopped := f.Stop() - - f.reset <- reset{t: f.clock.Now().Add(d), next: f.clock.After(d)} - if d > 0 { - atomic.StoreUint32(&f.stopped, 0) - } - - return stopped + return f.reset(d) } func (f *fakeTimer) Stop() bool { - if atomic.CompareAndSwapUint32(&f.stopped, 0, 1) { - f.stop <- struct{}{} - return true - } - return false + return f.stop() } -type reset struct { - t time.Time - next <-chan time.Time -} - -// run initializes a background goroutine to send the timer event to the timer channel -// after the period. Events are discarded if the underlying ticker channel does not have -// enough capacity. -func (f *fakeTimer) run(initialDuration time.Duration) { - nextTick := f.clock.Now().Add(initialDuration) - next := f.clock.After(initialDuration) - - waitForReset := func() (time.Time, <-chan time.Time) { - for { - select { - case <-f.stop: - continue - case r := <-f.reset: - return r.t, r.next - } - } +func (f *fakeTimer) expire(now time.Time) *time.Duration { + if f.afterFunc != nil { + go f.afterFunc() + return nil } - go func() { - for { - select { - case <-f.stop: - case <-next: - atomic.StoreUint32(&f.stopped, 1) - select { - case f.c <- nextTick: - default: - } - - next = nil - } - - nextTick, next = waitForReset() - } - }() + // Never block on expiration. + select { + case f.c <- now: + default: + } + return nil } diff --git a/vendor/github.com/klauspost/compress/.goreleaser.yml b/vendor/github.com/klauspost/compress/.goreleaser.yml index a2bf06e94f..7a008a4d23 100644 --- a/vendor/github.com/klauspost/compress/.goreleaser.yml +++ b/vendor/github.com/klauspost/compress/.goreleaser.yml @@ -3,7 +3,7 @@ before: hooks: - ./gen.sh - - go install mvdan.cc/garble@v0.7.2 + - go install mvdan.cc/garble@v0.9.3 builds: - diff --git a/vendor/github.com/klauspost/compress/README.md b/vendor/github.com/klauspost/compress/README.md index 63f2cd5b25..f710a34ec7 100644 --- a/vendor/github.com/klauspost/compress/README.md +++ b/vendor/github.com/klauspost/compress/README.md @@ -16,6 +16,40 @@ This package provides various compression algorithms. # changelog +* Apr 16, 2023 - [v1.16.5](https://github.com/klauspost/compress/releases/tag/v1.16.5) + * zstd: readByte needs to use io.ReadFull by @jnoxon in https://github.com/klauspost/compress/pull/802 + * gzip: Fix WriterTo after initial read https://github.com/klauspost/compress/pull/804 + +* Apr 5, 2023 - [v1.16.4](https://github.com/klauspost/compress/releases/tag/v1.16.4) + * zstd: Improve zstd best efficiency by @greatroar and @klauspost in https://github.com/klauspost/compress/pull/784 + * zstd: Respect WithAllLitEntropyCompression https://github.com/klauspost/compress/pull/792 + * zstd: Fix amd64 not always detecting corrupt data https://github.com/klauspost/compress/pull/785 + * zstd: Various minor improvements by @greatroar in https://github.com/klauspost/compress/pull/788 https://github.com/klauspost/compress/pull/794 https://github.com/klauspost/compress/pull/795 + * s2: Fix huge block overflow https://github.com/klauspost/compress/pull/779 + * s2: Allow CustomEncoder fallback https://github.com/klauspost/compress/pull/780 + * gzhttp: Suppport ResponseWriter Unwrap() in gzhttp handler by @jgimenez in https://github.com/klauspost/compress/pull/799 + +* Mar 13, 2023 - [v1.16.1](https://github.com/klauspost/compress/releases/tag/v1.16.1) + * zstd: Speed up + improve best encoder by @greatroar in https://github.com/klauspost/compress/pull/776 + * gzhttp: Add optional [BREACH mitigation](https://github.com/klauspost/compress/tree/master/gzhttp#breach-mitigation). https://github.com/klauspost/compress/pull/762 https://github.com/klauspost/compress/pull/768 https://github.com/klauspost/compress/pull/769 https://github.com/klauspost/compress/pull/770 https://github.com/klauspost/compress/pull/767 + * s2: Add Intel LZ4s converter https://github.com/klauspost/compress/pull/766 + * zstd: Minor bug fixes https://github.com/klauspost/compress/pull/771 https://github.com/klauspost/compress/pull/772 https://github.com/klauspost/compress/pull/773 + * huff0: Speed up compress1xDo by @greatroar in https://github.com/klauspost/compress/pull/774 + +* Feb 26, 2023 - [v1.16.0](https://github.com/klauspost/compress/releases/tag/v1.16.0) + * s2: Add [Dictionary](https://github.com/klauspost/compress/tree/master/s2#dictionaries) support. https://github.com/klauspost/compress/pull/685 + * s2: Add Compression Size Estimate. https://github.com/klauspost/compress/pull/752 + * s2: Add support for custom stream encoder. https://github.com/klauspost/compress/pull/755 + * s2: Add LZ4 block converter. https://github.com/klauspost/compress/pull/748 + * s2: Support io.ReaderAt in ReadSeeker. https://github.com/klauspost/compress/pull/747 + * s2c/s2sx: Use concurrent decoding. https://github.com/klauspost/compress/pull/746 + +* Jan 21st, 2023 (v1.15.15) + * deflate: Improve level 7-9 by @klauspost in https://github.com/klauspost/compress/pull/739 + * zstd: Add delta encoding support by @greatroar in https://github.com/klauspost/compress/pull/728 + * zstd: Various speed improvements by @greatroar https://github.com/klauspost/compress/pull/741 https://github.com/klauspost/compress/pull/734 https://github.com/klauspost/compress/pull/736 https://github.com/klauspost/compress/pull/744 https://github.com/klauspost/compress/pull/743 https://github.com/klauspost/compress/pull/745 + * gzhttp: Add SuffixETag() and DropETag() options to prevent ETag collisions on compressed responses by @willbicks in https://github.com/klauspost/compress/pull/740 + * Jan 3rd, 2023 (v1.15.14) * flate: Improve speed in big stateless blocks https://github.com/klauspost/compress/pull/718 @@ -594,6 +628,8 @@ Here are other packages of good quality and pure Go (no cgo wrappers or autoconv * [github.com/pierrec/lz4](https://github.com/pierrec/lz4) - strong multithreaded LZ4 compression. * [github.com/cosnicolaou/pbzip2](https://github.com/cosnicolaou/pbzip2) - multithreaded bzip2 decompression. * [github.com/dsnet/compress](https://github.com/dsnet/compress) - brotli decompression, bzip2 writer. +* [github.com/ronanh/intcomp](https://github.com/ronanh/intcomp) - Integer compression. +* [github.com/spenczar/fpc](https://github.com/spenczar/fpc) - Float compression. # license diff --git a/vendor/github.com/klauspost/compress/SECURITY.md b/vendor/github.com/klauspost/compress/SECURITY.md new file mode 100644 index 0000000000..23a43387b6 --- /dev/null +++ b/vendor/github.com/klauspost/compress/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policy + +## Supported Versions + +Security updates are applied only to the latest release. + +## Vulnerability Definition + +A security vulnerability is a bug that with certain input triggers a crash or an infinite loop. Most calls will have varying execution time and only in rare cases will slow operation be considered a security vulnerability. + +Corrupted output generally is not considered a security vulnerability, unless independent operations are able to affect each other. Note that not all functionality is re-entrant and safe to use concurrently. + +Out-of-memory crashes only applies if the en/decoder uses an abnormal amount of memory, with appropriate options applied, to limit maximum window size, concurrency, etc. However, if you are in doubt you are welcome to file a security issue. + +It is assumed that all callers are trusted, meaning internal data exposed through reflection or inspection of returned data structures is not considered a vulnerability. + +Vulnerabilities resulting from compiler/assembler errors should be reported upstream. Depending on the severity this package may or may not implement a workaround. + +## Reporting a Vulnerability + +If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. + +Please disclose it at [security advisory](https://github.com/klaupost/compress/security/advisories/new). If possible please provide a minimal reproducer. If the issue only applies to a single platform, it would be helpful to provide access to that. + +This project is maintained by a team of volunteers on a reasonable-effort basis. As such, vulnerabilities will be disclosed in a best effort base. diff --git a/vendor/github.com/klauspost/compress/fse/decompress.go b/vendor/github.com/klauspost/compress/fse/decompress.go index 926f5f1535..cc05d0f7ea 100644 --- a/vendor/github.com/klauspost/compress/fse/decompress.go +++ b/vendor/github.com/klauspost/compress/fse/decompress.go @@ -260,7 +260,9 @@ func (s *Scratch) buildDtable() error { // If the buffer is over-read an error is returned. func (s *Scratch) decompress() error { br := &s.bits - br.init(s.br.unread()) + if err := br.init(s.br.unread()); err != nil { + return err + } var s1, s2 decoder // Initialize and decode first state and symbol. diff --git a/vendor/github.com/klauspost/compress/huff0/bitwriter.go b/vendor/github.com/klauspost/compress/huff0/bitwriter.go index ec71f7a349..b4d7164e3f 100644 --- a/vendor/github.com/klauspost/compress/huff0/bitwriter.go +++ b/vendor/github.com/klauspost/compress/huff0/bitwriter.go @@ -13,14 +13,6 @@ type bitWriter struct { out []byte } -// bitMask16 is bitmasks. Has extra to avoid bounds check. -var bitMask16 = [32]uint16{ - 0, 1, 3, 7, 0xF, 0x1F, - 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, - 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF} /* up to 16 bits */ - // addBits16Clean will add up to 16 bits. value may not contain more set bits than indicated. // It will not check if there is space for them, so the caller must ensure that it has flushed recently. func (b *bitWriter) addBits16Clean(value uint16, bits uint8) { @@ -60,6 +52,22 @@ func (b *bitWriter) encTwoSymbols(ct cTable, av, bv byte) { b.nBits += encA.nBits + encB.nBits } +// encFourSymbols adds up to 32 bits from four symbols. +// It will not check if there is space for them, +// so the caller must ensure that b has been flushed recently. +func (b *bitWriter) encFourSymbols(encA, encB, encC, encD cTableEntry) { + bitsA := encA.nBits + bitsB := bitsA + encB.nBits + bitsC := bitsB + encC.nBits + bitsD := bitsC + encD.nBits + combined := uint64(encA.val) | + (uint64(encB.val) << (bitsA & 63)) | + (uint64(encC.val) << (bitsB & 63)) | + (uint64(encD.val) << (bitsC & 63)) + b.bitContainer |= combined << (b.nBits & 63) + b.nBits += bitsD +} + // flush32 will flush out, so there are at least 32 bits available for writing. func (b *bitWriter) flush32() { if b.nBits < 32 { diff --git a/vendor/github.com/klauspost/compress/huff0/compress.go b/vendor/github.com/klauspost/compress/huff0/compress.go index cdc94856f2..4ee4fa18dd 100644 --- a/vendor/github.com/klauspost/compress/huff0/compress.go +++ b/vendor/github.com/klauspost/compress/huff0/compress.go @@ -248,8 +248,7 @@ func (s *Scratch) compress1xDo(dst, src []byte) ([]byte, error) { tmp := src[n : n+4] // tmp should be len 4 bw.flush32() - bw.encTwoSymbols(cTable, tmp[3], tmp[2]) - bw.encTwoSymbols(cTable, tmp[1], tmp[0]) + bw.encFourSymbols(cTable[tmp[3]], cTable[tmp[2]], cTable[tmp[1]], cTable[tmp[0]]) } } else { for ; n >= 0; n -= 4 { diff --git a/vendor/github.com/klauspost/compress/huff0/decompress.go b/vendor/github.com/klauspost/compress/huff0/decompress.go index 42a237eac4..54bd08b25c 100644 --- a/vendor/github.com/klauspost/compress/huff0/decompress.go +++ b/vendor/github.com/klauspost/compress/huff0/decompress.go @@ -61,7 +61,7 @@ func ReadTable(in []byte, s *Scratch) (s2 *Scratch, remain []byte, err error) { b, err := fse.Decompress(in[:iSize], s.fse) s.fse.Out = nil if err != nil { - return s, nil, err + return s, nil, fmt.Errorf("fse decompress returned: %w", err) } if len(b) > 255 { return s, nil, errors.New("corrupt input: output table too large") @@ -253,7 +253,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { switch d.actualTableLog { case 8: - const shift = 8 - 8 + const shift = 0 for br.off >= 4 { br.fillFast() v := dt[uint8(br.value>>(56+shift))] diff --git a/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go b/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go index 298c4f8e97..2aa6a95a02 100644 --- a/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go +++ b/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go @@ -87,22 +87,32 @@ func emitCopy(dst []byte, offset, length int) int { return i + 2 } -// extendMatch returns the largest k such that k <= len(src) and that -// src[i:i+k-j] and src[j:k] have the same contents. -// -// It assumes that: -// -// 0 <= i && i < j && j <= len(src) -func extendMatch(src []byte, i, j int) int { - for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { - } - return j -} - func hash(u, shift uint32) uint32 { return (u * 0x1e35a7bd) >> shift } +// EncodeBlockInto exposes encodeBlock but checks dst size. +func EncodeBlockInto(dst, src []byte) (d int) { + if MaxEncodedLen(len(src)) > len(dst) { + return 0 + } + + // encodeBlock breaks on too big blocks, so split. + for len(src) > 0 { + p := src + src = nil + if len(p) > maxBlockSize { + p, src = p[:maxBlockSize], p[maxBlockSize:] + } + if len(p) < minNonLiteralBlockSize { + d += emitLiteral(dst[d:], p) + } else { + d += encodeBlock(dst[d:], p) + } + } + return d +} + // encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It // assumes that the varint-encoded length of the decompressed bytes has already // been written. diff --git a/vendor/github.com/klauspost/compress/zstd/README.md b/vendor/github.com/klauspost/compress/zstd/README.md index 65b38abed8..bdd49c8b25 100644 --- a/vendor/github.com/klauspost/compress/zstd/README.md +++ b/vendor/github.com/klauspost/compress/zstd/README.md @@ -304,7 +304,7 @@ import "github.com/klauspost/compress/zstd" // Create a reader that caches decompressors. // For this operation type we supply a nil Reader. -var decoder, _ = zstd.NewReader(nil, WithDecoderConcurrency(0)) +var decoder, _ = zstd.NewReader(nil, zstd.WithDecoderConcurrency(0)) // Decompress a buffer. We don't supply a destination buffer, // so it will be allocated by the decoder. diff --git a/vendor/github.com/klauspost/compress/zstd/blockdec.go b/vendor/github.com/klauspost/compress/zstd/blockdec.go index 2445bb4fe5..9f17ce601f 100644 --- a/vendor/github.com/klauspost/compress/zstd/blockdec.go +++ b/vendor/github.com/klauspost/compress/zstd/blockdec.go @@ -9,6 +9,7 @@ import ( "encoding/binary" "errors" "fmt" + "hash/crc32" "io" "os" "path/filepath" @@ -442,6 +443,9 @@ func (b *blockDec) decodeLiterals(in []byte, hist *history) (remain []byte, err } } var err error + if debugDecoder { + println("huff table input:", len(literals), "CRC:", crc32.ChecksumIEEE(literals)) + } huff, literals, err = huff0.ReadTable(literals, huff) if err != nil { println("reading huffman table:", err) @@ -588,7 +592,7 @@ func (b *blockDec) prepareSequences(in []byte, hist *history) (err error) { } seq.fse.setRLE(symb) if debugDecoder { - printf("RLE set to %+v, code: %v", symb, v) + printf("RLE set to 0x%x, code: %v", symb, v) } case compModeFSE: println("Reading table for", tableIndex(i)) diff --git a/vendor/github.com/klauspost/compress/zstd/blockenc.go b/vendor/github.com/klauspost/compress/zstd/blockenc.go index 12e8f6f0b6..fd4a36f730 100644 --- a/vendor/github.com/klauspost/compress/zstd/blockenc.go +++ b/vendor/github.com/klauspost/compress/zstd/blockenc.go @@ -473,7 +473,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error { return b.encodeLits(b.literals, rawAllLits) } // We want some difference to at least account for the headers. - saved := b.size - len(b.literals) - (b.size >> 5) + saved := b.size - len(b.literals) - (b.size >> 6) if saved < 16 { if org == nil { return errIncompressible @@ -779,10 +779,13 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error { } b.output = wr.out + // Maybe even add a bigger margin. if len(b.output)-3-bhOffset >= b.size { - // Maybe even add a bigger margin. + // Discard and encode as raw block. + b.output = b.encodeRawTo(b.output[:bhOffset], org) + b.popOffsets() b.litEnc.Reuse = huff0.ReusePolicyNone - return errIncompressible + return nil } // Size is output minus block header. diff --git a/vendor/github.com/klauspost/compress/zstd/bytebuf.go b/vendor/github.com/klauspost/compress/zstd/bytebuf.go index 176788f259..55a388553d 100644 --- a/vendor/github.com/klauspost/compress/zstd/bytebuf.go +++ b/vendor/github.com/klauspost/compress/zstd/bytebuf.go @@ -54,7 +54,7 @@ func (b *byteBuf) readBig(n int, dst []byte) ([]byte, error) { func (b *byteBuf) readByte() (byte, error) { bb := *b if len(bb) < 1 { - return 0, nil + return 0, io.ErrUnexpectedEOF } r := bb[0] *b = bb[1:] @@ -109,7 +109,7 @@ func (r *readerWrapper) readBig(n int, dst []byte) ([]byte, error) { } func (r *readerWrapper) readByte() (byte, error) { - n2, err := r.r.Read(r.tmp[:1]) + n2, err := io.ReadFull(r.r, r.tmp[:1]) if err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF diff --git a/vendor/github.com/klauspost/compress/zstd/decoder.go b/vendor/github.com/klauspost/compress/zstd/decoder.go index 7113e69ee3..f04aaa21eb 100644 --- a/vendor/github.com/klauspost/compress/zstd/decoder.go +++ b/vendor/github.com/klauspost/compress/zstd/decoder.go @@ -455,12 +455,7 @@ func (d *Decoder) nextBlock(blocking bool) (ok bool) { } if len(next.b) > 0 { - n, err := d.current.crc.Write(next.b) - if err == nil { - if n != len(next.b) { - d.current.err = io.ErrShortWrite - } - } + d.current.crc.Write(next.b) } if next.err == nil && next.d != nil && next.d.hasCRC { got := uint32(d.current.crc.Sum64()) diff --git a/vendor/github.com/klauspost/compress/zstd/decoder_options.go b/vendor/github.com/klauspost/compress/zstd/decoder_options.go index 07a90dd7af..774c5f00fe 100644 --- a/vendor/github.com/klauspost/compress/zstd/decoder_options.go +++ b/vendor/github.com/klauspost/compress/zstd/decoder_options.go @@ -107,7 +107,7 @@ func WithDecoderDicts(dicts ...[]byte) DOption { } } -// WithEncoderDictRaw registers a dictionary that may be used by the decoder. +// WithDecoderDictRaw registers a dictionary that may be used by the decoder. // The slice content can be arbitrary data. func WithDecoderDictRaw(id uint32, content []byte) DOption { return func(o *decoderOptions) error { diff --git a/vendor/github.com/klauspost/compress/zstd/dict.go b/vendor/github.com/klauspost/compress/zstd/dict.go index 66a95c18ef..ca0951452e 100644 --- a/vendor/github.com/klauspost/compress/zstd/dict.go +++ b/vendor/github.com/klauspost/compress/zstd/dict.go @@ -32,14 +32,38 @@ func (d *dict) ID() uint32 { return d.id } -// DictContentSize returns the dictionary content size or 0 if d is nil. -func (d *dict) DictContentSize() int { +// ContentSize returns the dictionary content size or 0 if d is nil. +func (d *dict) ContentSize() int { if d == nil { return 0 } return len(d.content) } +// Content returns the dictionary content. +func (d *dict) Content() []byte { + if d == nil { + return nil + } + return d.content +} + +// Offsets returns the initial offsets. +func (d *dict) Offsets() [3]int { + if d == nil { + return [3]int{} + } + return d.offsets +} + +// LitEncoder returns the literal encoder. +func (d *dict) LitEncoder() *huff0.Scratch { + if d == nil { + return nil + } + return d.litEnc +} + // Load a dictionary as described in // https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#dictionary-format func loadDict(b []byte) (*dict, error) { @@ -64,7 +88,7 @@ func loadDict(b []byte) (*dict, error) { var err error d.litEnc, b, err = huff0.ReadTable(b[8:], nil) if err != nil { - return nil, err + return nil, fmt.Errorf("loading literal table: %w", err) } d.litEnc.Reuse = huff0.ReusePolicyMust @@ -122,3 +146,16 @@ func loadDict(b []byte) (*dict, error) { return &d, nil } + +// InspectDictionary loads a zstd dictionary and provides functions to inspect the content. +func InspectDictionary(b []byte) (interface { + ID() uint32 + ContentSize() int + Content() []byte + Offsets() [3]int + LitEncoder() *huff0.Scratch +}, error) { + initPredefined() + d, err := loadDict(b) + return d, err +} diff --git a/vendor/github.com/klauspost/compress/zstd/enc_base.go b/vendor/github.com/klauspost/compress/zstd/enc_base.go index bfb2e146c3..e008b99298 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_base.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_base.go @@ -149,7 +149,7 @@ func (e *fastBase) resetBase(d *dict, singleBlock bool) { if singleBlock { e.lowMem = true } - e.ensureHist(d.DictContentSize() + maxCompressedBlockSize) + e.ensureHist(d.ContentSize() + maxCompressedBlockSize) e.lowMem = low } diff --git a/vendor/github.com/klauspost/compress/zstd/enc_best.go b/vendor/github.com/klauspost/compress/zstd/enc_best.go index 830f5ba74a..9819d41453 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_best.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_best.go @@ -32,10 +32,9 @@ type match struct { length int32 rep int32 est int32 - _ [12]byte // Aligned size to cache line: 4+4+4+4+4 bytes + 12 bytes padding = 32 bytes } -const highScore = 25000 +const highScore = maxMatchLen * 8 // estBits will estimate output bits from predefined tables. func (m *match) estBits(bitsPerByte int32) { @@ -160,7 +159,6 @@ func (e *bestFastEncoder) Encode(blk *blockEnc, src []byte) { // nextEmit is where in src the next emitLiteral should start from. nextEmit := s - cv := load6432(src, s) // Relative offsets offset1 := int32(blk.recentOffsets[0]) @@ -174,7 +172,6 @@ func (e *bestFastEncoder) Encode(blk *blockEnc, src []byte) { blk.literals = append(blk.literals, src[nextEmit:until]...) s.litLen = uint32(until - nextEmit) } - _ = addLiterals if debugEncoder { println("recent offsets:", blk.recentOffsets) @@ -189,53 +186,96 @@ encodeLoop: panic("offset0 was 0") } - bestOf := func(a, b *match) *match { - if a.est-b.est+(a.s-b.s)*bitsPerByte>>10 < 0 { - return a - } - return b - } - const goodEnough = 100 + const goodEnough = 250 + + cv := load6432(src, s) nextHashL := hashLen(cv, bestLongTableBits, bestLongLen) nextHashS := hashLen(cv, bestShortTableBits, bestShortLen) candidateL := e.longTable[nextHashL] candidateS := e.table[nextHashS] - matchAt := func(offset int32, s int32, first uint32, rep int32) match { + // Set m to a match at offset if it looks like that will improve compression. + improve := func(m *match, offset int32, s int32, first uint32, rep int32) { if s-offset >= e.maxMatchOff || load3232(src, offset) != first { - return match{s: s, est: highScore} + return } if debugAsserts { + if offset <= 0 { + panic(offset) + } if !bytes.Equal(src[s:s+4], src[offset:offset+4]) { panic(fmt.Sprintf("first match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first)) } } - m := match{offset: offset, s: s, length: 4 + e.matchlen(s+4, offset+4, src), rep: rep} - m.estBits(bitsPerByte) - return m + // Try to quick reject if we already have a long match. + if m.length > 16 { + left := len(src) - int(m.s+m.length) + // If we are too close to the end, keep as is. + if left <= 0 { + return + } + checkLen := m.length - (s - m.s) - 8 + if left > 2 && checkLen > 4 { + // Check 4 bytes, 4 bytes from the end of the current match. + a := load3232(src, offset+checkLen) + b := load3232(src, s+checkLen) + if a != b { + return + } + } + } + l := 4 + e.matchlen(s+4, offset+4, src) + if rep < 0 { + // Extend candidate match backwards as far as possible. + tMin := s - e.maxMatchOff + if tMin < 0 { + tMin = 0 + } + for offset > tMin && s > nextEmit && src[offset-1] == src[s-1] && l < maxMatchLength { + s-- + offset-- + l++ + } + } + + cand := match{offset: offset, s: s, length: l, rep: rep} + cand.estBits(bitsPerByte) + if m.est >= highScore || cand.est-m.est+(cand.s-m.s)*bitsPerByte>>10 < 0 { + *m = cand + } } - m1 := matchAt(candidateL.offset-e.cur, s, uint32(cv), -1) - m2 := matchAt(candidateL.prev-e.cur, s, uint32(cv), -1) - m3 := matchAt(candidateS.offset-e.cur, s, uint32(cv), -1) - m4 := matchAt(candidateS.prev-e.cur, s, uint32(cv), -1) - best := bestOf(bestOf(&m1, &m2), bestOf(&m3, &m4)) + best := match{s: s, est: highScore} + improve(&best, candidateL.offset-e.cur, s, uint32(cv), -1) + improve(&best, candidateL.prev-e.cur, s, uint32(cv), -1) + improve(&best, candidateS.offset-e.cur, s, uint32(cv), -1) + improve(&best, candidateS.prev-e.cur, s, uint32(cv), -1) if canRepeat && best.length < goodEnough { - cv32 := uint32(cv >> 8) - spp := s + 1 - m1 := matchAt(spp-offset1, spp, cv32, 1) - m2 := matchAt(spp-offset2, spp, cv32, 2) - m3 := matchAt(spp-offset3, spp, cv32, 3) - best = bestOf(bestOf(best, &m1), bestOf(&m2, &m3)) - if best.length > 0 { - cv32 = uint32(cv >> 24) - spp += 2 - m1 := matchAt(spp-offset1, spp, cv32, 1) - m2 := matchAt(spp-offset2, spp, cv32, 2) - m3 := matchAt(spp-offset3, spp, cv32, 3) - best = bestOf(bestOf(best, &m1), bestOf(&m2, &m3)) + if s == nextEmit { + // Check repeats straight after a match. + improve(&best, s-offset2, s, uint32(cv), 1|4) + improve(&best, s-offset3, s, uint32(cv), 2|4) + if offset1 > 1 { + improve(&best, s-(offset1-1), s, uint32(cv), 3|4) + } + } + + // If either no match or a non-repeat match, check at + 1 + if best.rep <= 0 { + cv32 := uint32(cv >> 8) + spp := s + 1 + improve(&best, spp-offset1, spp, cv32, 1) + improve(&best, spp-offset2, spp, cv32, 2) + improve(&best, spp-offset3, spp, cv32, 3) + if best.rep < 0 { + cv32 = uint32(cv >> 24) + spp += 2 + improve(&best, spp-offset1, spp, cv32, 1) + improve(&best, spp-offset2, spp, cv32, 2) + improve(&best, spp-offset3, spp, cv32, 3) + } } } // Load next and check... @@ -250,47 +290,45 @@ encodeLoop: if s >= sLimit { break encodeLoop } - cv = load6432(src, s) continue } - s++ candidateS = e.table[hashLen(cv>>8, bestShortTableBits, bestShortLen)] - cv = load6432(src, s) - cv2 := load6432(src, s+1) + cv = load6432(src, s+1) + cv2 := load6432(src, s+2) candidateL = e.longTable[hashLen(cv, bestLongTableBits, bestLongLen)] candidateL2 := e.longTable[hashLen(cv2, bestLongTableBits, bestLongLen)] // Short at s+1 - m1 := matchAt(candidateS.offset-e.cur, s, uint32(cv), -1) + improve(&best, candidateS.offset-e.cur, s+1, uint32(cv), -1) // Long at s+1, s+2 - m2 := matchAt(candidateL.offset-e.cur, s, uint32(cv), -1) - m3 := matchAt(candidateL.prev-e.cur, s, uint32(cv), -1) - m4 := matchAt(candidateL2.offset-e.cur, s+1, uint32(cv2), -1) - m5 := matchAt(candidateL2.prev-e.cur, s+1, uint32(cv2), -1) - best = bestOf(bestOf(bestOf(best, &m1), &m2), bestOf(bestOf(&m3, &m4), &m5)) + improve(&best, candidateL.offset-e.cur, s+1, uint32(cv), -1) + improve(&best, candidateL.prev-e.cur, s+1, uint32(cv), -1) + improve(&best, candidateL2.offset-e.cur, s+2, uint32(cv2), -1) + improve(&best, candidateL2.prev-e.cur, s+2, uint32(cv2), -1) if false { // Short at s+3. // Too often worse... - m := matchAt(e.table[hashLen(cv2>>8, bestShortTableBits, bestShortLen)].offset-e.cur, s+2, uint32(cv2>>8), -1) - best = bestOf(best, &m) + improve(&best, e.table[hashLen(cv2>>8, bestShortTableBits, bestShortLen)].offset-e.cur, s+3, uint32(cv2>>8), -1) } - // See if we can find a better match by checking where the current best ends. - // Use that offset to see if we can find a better full match. - if sAt := best.s + best.length; sAt < sLimit { - nextHashL := hashLen(load6432(src, sAt), bestLongTableBits, bestLongLen) - candidateEnd := e.longTable[nextHashL] - // Start check at a fixed offset to allow for a few mismatches. - // For this compression level 2 yields the best results. - const skipBeginning = 2 - if pos := candidateEnd.offset - e.cur - best.length + skipBeginning; pos >= 0 { - m := matchAt(pos, best.s+skipBeginning, load3232(src, best.s+skipBeginning), -1) - bestEnd := bestOf(best, &m) - if pos := candidateEnd.prev - e.cur - best.length + skipBeginning; pos >= 0 { - m := matchAt(pos, best.s+skipBeginning, load3232(src, best.s+skipBeginning), -1) - bestEnd = bestOf(bestEnd, &m) + + // Start check at a fixed offset to allow for a few mismatches. + // For this compression level 2 yields the best results. + // We cannot do this if we have already indexed this position. + const skipBeginning = 2 + if best.s > s-skipBeginning { + // See if we can find a better match by checking where the current best ends. + // Use that offset to see if we can find a better full match. + if sAt := best.s + best.length; sAt < sLimit { + nextHashL := hashLen(load6432(src, sAt), bestLongTableBits, bestLongLen) + candidateEnd := e.longTable[nextHashL] + + if off := candidateEnd.offset - e.cur - best.length + skipBeginning; off >= 0 { + improve(&best, off, best.s+skipBeginning, load3232(src, best.s+skipBeginning), -1) + if off := candidateEnd.prev - e.cur - best.length + skipBeginning; off >= 0 { + improve(&best, off, best.s+skipBeginning, load3232(src, best.s+skipBeginning), -1) + } } - best = bestEnd } } } @@ -303,51 +341,34 @@ encodeLoop: // We have a match, we can store the forward value if best.rep > 0 { - s = best.s var seq seq seq.matchLen = uint32(best.length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := best.s - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - repIndex := best.offset - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch-1 { - repIndex-- - start-- - seq.matchLen++ + if debugAsserts && s <= nextEmit { + panic("s <= nextEmit") } - addLiterals(&seq, start) + addLiterals(&seq, best.s) - // rep 0 - seq.offset = uint32(best.rep) + // Repeat. If bit 4 is set, this is a non-lit repeat. + seq.offset = uint32(best.rep & 3) if debugSequences { println("repeat sequence", seq, "next s:", s) } blk.sequences = append(blk.sequences, seq) - // Index match start+1 (long) -> s - 1 - index0 := s + // Index old s + 1 -> s - 1 + index0 := s + 1 s = best.s + best.length nextEmit = s if s >= sLimit { if debugEncoder { println("repeat ended", s, best.length) - } break encodeLoop } // Index skipped... off := index0 + e.cur - for index0 < s-1 { + for index0 < s { cv0 := load6432(src, index0) h0 := hashLen(cv0, bestLongTableBits, bestLongLen) h1 := hashLen(cv0, bestShortTableBits, bestShortLen) @@ -357,17 +378,19 @@ encodeLoop: index0++ } switch best.rep { - case 2: + case 2, 4 | 1: offset1, offset2 = offset2, offset1 - case 3: + case 3, 4 | 2: offset1, offset2, offset3 = offset3, offset1, offset2 + case 4 | 3: + offset1, offset2, offset3 = offset1-1, offset1, offset2 } - cv = load6432(src, s) continue } // A 4-byte match has been found. Update recent offsets. // We'll later see if more than 4 bytes. + index0 := s + 1 s = best.s t := best.offset offset1, offset2, offset3 = s-t, offset1, offset2 @@ -380,22 +403,9 @@ encodeLoop: panic("invalid offset") } - // Extend the n-byte match as long as possible. - l := best.length - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] && l < maxMatchLength { - s-- - t-- - l++ - } - // Write our sequence var seq seq + l := best.length seq.litLen = uint32(s - nextEmit) seq.matchLen = uint32(l - zstdMinMatch) if seq.litLen > 0 { @@ -412,10 +422,8 @@ encodeLoop: break encodeLoop } - // Index match start+1 (long) -> s - 1 - index0 := s - l + 1 - // every entry - for index0 < s-1 { + // Index old s + 1 -> s - 1 + for index0 < s { cv0 := load6432(src, index0) h0 := hashLen(cv0, bestLongTableBits, bestLongLen) h1 := hashLen(cv0, bestShortTableBits, bestShortLen) @@ -424,50 +432,6 @@ encodeLoop: e.table[h1] = prevEntry{offset: off, prev: e.table[h1].offset} index0++ } - - cv = load6432(src, s) - if !canRepeat { - continue - } - - // Check offset 2 - for { - o2 := s - offset2 - if load3232(src, o2) != uint32(cv) { - // Do regular search - break - } - - // Store this, since we have it. - nextHashS := hashLen(cv, bestShortTableBits, bestShortLen) - nextHashL := hashLen(cv, bestLongTableBits, bestLongLen) - - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - e.longTable[nextHashL] = prevEntry{offset: s + e.cur, prev: e.longTable[nextHashL].offset} - e.table[nextHashS] = prevEntry{offset: s + e.cur, prev: e.table[nextHashS].offset} - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - // Finished - break encodeLoop - } - cv = load6432(src, s) - } } if int(nextEmit) < len(src) { diff --git a/vendor/github.com/klauspost/compress/zstd/enc_fast.go b/vendor/github.com/klauspost/compress/zstd/enc_fast.go index 315b1a8f2f..cbc626eec6 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_fast.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_fast.go @@ -133,8 +133,7 @@ encodeLoop: if canRepeat && repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>16) { // Consider history as well. var seq seq - var length int32 - length = 4 + e.matchlen(s+6, repIndex+4, src) + length := 4 + e.matchlen(s+6, repIndex+4, src) seq.matchLen = uint32(length - zstdMinMatch) // We might be able to match backwards. @@ -645,8 +644,7 @@ encodeLoop: if canRepeat && repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>16) { // Consider history as well. var seq seq - var length int32 - length = 4 + e.matchlen(s+6, repIndex+4, src) + length := 4 + e.matchlen(s+6, repIndex+4, src) seq.matchLen = uint32(length - zstdMinMatch) diff --git a/vendor/github.com/klauspost/compress/zstd/encoder.go b/vendor/github.com/klauspost/compress/zstd/encoder.go index 65c6c36dc1..4de0aed0d0 100644 --- a/vendor/github.com/klauspost/compress/zstd/encoder.go +++ b/vendor/github.com/klauspost/compress/zstd/encoder.go @@ -277,23 +277,9 @@ func (e *Encoder) nextBlock(final bool) error { s.eofWritten = true } - err := errIncompressible - // If we got the exact same number of literals as input, - // assume the literals cannot be compressed. - if len(src) != len(blk.literals) || len(src) != e.o.blockSize { - err = blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) - } - switch err { - case errIncompressible: - if debugEncoder { - println("Storing incompressible block as raw") - } - blk.encodeRaw(src) - // In fast mode, we do not transfer offsets, so we don't have to deal with changing the. - case nil: - default: - s.err = err - return err + s.err = blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) + if s.err != nil { + return s.err } _, s.err = s.w.Write(blk.output) s.nWritten += int64(len(blk.output)) @@ -343,22 +329,8 @@ func (e *Encoder) nextBlock(final bool) error { } s.wWg.Done() }() - err := errIncompressible - // If we got the exact same number of literals as input, - // assume the literals cannot be compressed. - if len(src) != len(blk.literals) || len(src) != e.o.blockSize { - err = blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) - } - switch err { - case errIncompressible: - if debugEncoder { - println("Storing incompressible block as raw") - } - blk.encodeRaw(src) - // In fast mode, we do not transfer offsets, so we don't have to deal with changing the. - case nil: - default: - s.writeErr = err + s.writeErr = blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) + if s.writeErr != nil { return } _, s.writeErr = s.w.Write(blk.output) @@ -568,25 +540,15 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { // If we got the exact same number of literals as input, // assume the literals cannot be compressed. - err := errIncompressible oldout := blk.output - if len(blk.literals) != len(src) || len(src) != e.o.blockSize { - // Output directly to dst - blk.output = dst - err = blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) - } + // Output directly to dst + blk.output = dst - switch err { - case errIncompressible: - if debugEncoder { - println("Storing incompressible block as raw") - } - dst = blk.encodeRawTo(dst, src) - case nil: - dst = blk.output - default: + err := blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) + if err != nil { panic(err) } + dst = blk.output blk.output = oldout } else { enc.Reset(e.o.dict, false) @@ -605,25 +567,11 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { if len(src) == 0 { blk.last = true } - err := errIncompressible - // If we got the exact same number of literals as input, - // assume the literals cannot be compressed. - if len(blk.literals) != len(todo) || len(todo) != e.o.blockSize { - err = blk.encode(todo, e.o.noEntropy, !e.o.allLitEntropy) - } - - switch err { - case errIncompressible: - if debugEncoder { - println("Storing incompressible block as raw") - } - dst = blk.encodeRawTo(dst, todo) - blk.popOffsets() - case nil: - dst = append(dst, blk.output...) - default: + err := blk.encode(todo, e.o.noEntropy, !e.o.allLitEntropy) + if err != nil { panic(err) } + dst = append(dst, blk.output...) blk.reset(nil) } } diff --git a/vendor/github.com/klauspost/compress/zstd/encoder_options.go b/vendor/github.com/klauspost/compress/zstd/encoder_options.go index 8e15be2f7f..faaf81921c 100644 --- a/vendor/github.com/klauspost/compress/zstd/encoder_options.go +++ b/vendor/github.com/klauspost/compress/zstd/encoder_options.go @@ -39,7 +39,7 @@ func (o *encoderOptions) setDefault() { blockSize: maxCompressedBlockSize, windowSize: 8 << 20, level: SpeedDefault, - allLitEntropy: true, + allLitEntropy: false, lowMem: false, } } @@ -129,7 +129,7 @@ func WithEncoderPadding(n int) EOption { } // No need to waste our time. if n == 1 { - o.pad = 0 + n = 0 } if n > 1<<30 { return fmt.Errorf("padding must less than 1GB (1<<30 bytes) ") @@ -238,7 +238,7 @@ func WithEncoderLevel(l EncoderLevel) EOption { } } if !o.customALEntropy { - o.allLitEntropy = l > SpeedFastest + o.allLitEntropy = l > SpeedDefault } return nil diff --git a/vendor/github.com/klauspost/compress/zstd/framedec.go b/vendor/github.com/klauspost/compress/zstd/framedec.go index d8e8a05bd7..53e160f7e5 100644 --- a/vendor/github.com/klauspost/compress/zstd/framedec.go +++ b/vendor/github.com/klauspost/compress/zstd/framedec.go @@ -73,20 +73,20 @@ func (d *frameDec) reset(br byteBuffer) error { switch err { case io.EOF, io.ErrUnexpectedEOF: return io.EOF - default: - return err case nil: signature[0] = b[0] + default: + return err } // Read the rest, don't allow io.ErrUnexpectedEOF b, err = br.readSmall(3) switch err { case io.EOF: return io.EOF - default: - return err case nil: copy(signature[1:], b) + default: + return err } if string(signature[1:4]) != skippableFrameMagic || signature[0]&0xf0 != 0x50 { @@ -293,13 +293,9 @@ func (d *frameDec) next(block *blockDec) error { return nil } -// checkCRC will check the checksum if the frame has one. +// checkCRC will check the checksum, assuming the frame has one. // Will return ErrCRCMismatch if crc check failed, otherwise nil. func (d *frameDec) checkCRC() error { - if !d.HasCheckSum { - return nil - } - // We can overwrite upper tmp now buf, err := d.rawInput.readSmall(4) if err != nil { @@ -307,10 +303,6 @@ func (d *frameDec) checkCRC() error { return err } - if d.o.ignoreChecksum { - return nil - } - want := binary.LittleEndian.Uint32(buf[:4]) got := uint32(d.crc.Sum64()) @@ -326,17 +318,13 @@ func (d *frameDec) checkCRC() error { return nil } -// consumeCRC reads the checksum data if the frame has one. +// consumeCRC skips over the checksum, assuming the frame has one. func (d *frameDec) consumeCRC() error { - if d.HasCheckSum { - _, err := d.rawInput.readSmall(4) - if err != nil { - println("CRC missing?", err) - return err - } + _, err := d.rawInput.readSmall(4) + if err != nil { + println("CRC missing?", err) } - - return nil + return err } // runDecoder will run the decoder for the remainder of the frame. @@ -415,15 +403,8 @@ func (d *frameDec) runDecoder(dst []byte, dec *blockDec) ([]byte, error) { if d.o.ignoreChecksum { err = d.consumeCRC() } else { - var n int - n, err = d.crc.Write(dst[crcStart:]) - if err == nil { - if n != len(dst)-crcStart { - err = io.ErrShortWrite - } else { - err = d.checkCRC() - } - } + d.crc.Write(dst[crcStart:]) + err = d.checkCRC() } } } diff --git a/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go b/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go new file mode 100644 index 0000000000..f41932b7a4 --- /dev/null +++ b/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go @@ -0,0 +1,16 @@ +//go:build amd64 && !appengine && !noasm && gc +// +build amd64,!appengine,!noasm,gc + +// Copyright 2019+ Klaus Post. All rights reserved. +// License information can be found in the LICENSE file. + +package zstd + +// matchLen returns how many bytes match in a and b +// +// It assumes that: +// +// len(a) <= len(b) and len(a) > 0 +// +//go:noescape +func matchLen(a []byte, b []byte) int diff --git a/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s b/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s new file mode 100644 index 0000000000..9a7655c0f7 --- /dev/null +++ b/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s @@ -0,0 +1,68 @@ +// Copied from S2 implementation. + +//go:build !appengine && !noasm && gc && !noasm + +#include "textflag.h" + +// func matchLen(a []byte, b []byte) int +// Requires: BMI +TEXT ·matchLen(SB), NOSPLIT, $0-56 + MOVQ a_base+0(FP), AX + MOVQ b_base+24(FP), CX + MOVQ a_len+8(FP), DX + + // matchLen + XORL SI, SI + CMPL DX, $0x08 + JB matchlen_match4_standalone + +matchlen_loopback_standalone: + MOVQ (AX)(SI*1), BX + XORQ (CX)(SI*1), BX + TESTQ BX, BX + JZ matchlen_loop_standalone + +#ifdef GOAMD64_v3 + TZCNTQ BX, BX +#else + BSFQ BX, BX +#endif + SARQ $0x03, BX + LEAL (SI)(BX*1), SI + JMP gen_match_len_end + +matchlen_loop_standalone: + LEAL -8(DX), DX + LEAL 8(SI), SI + CMPL DX, $0x08 + JAE matchlen_loopback_standalone + +matchlen_match4_standalone: + CMPL DX, $0x04 + JB matchlen_match2_standalone + MOVL (AX)(SI*1), BX + CMPL (CX)(SI*1), BX + JNE matchlen_match2_standalone + LEAL -4(DX), DX + LEAL 4(SI), SI + +matchlen_match2_standalone: + CMPL DX, $0x02 + JB matchlen_match1_standalone + MOVW (AX)(SI*1), BX + CMPW (CX)(SI*1), BX + JNE matchlen_match1_standalone + LEAL -2(DX), DX + LEAL 2(SI), SI + +matchlen_match1_standalone: + CMPL DX, $0x01 + JB gen_match_len_end + MOVB (AX)(SI*1), BL + CMPB (CX)(SI*1), BL + JNE gen_match_len_end + INCL SI + +gen_match_len_end: + MOVQ SI, ret+48(FP) + RET diff --git a/vendor/github.com/klauspost/compress/zstd/matchlen_generic.go b/vendor/github.com/klauspost/compress/zstd/matchlen_generic.go new file mode 100644 index 0000000000..57b9c31c02 --- /dev/null +++ b/vendor/github.com/klauspost/compress/zstd/matchlen_generic.go @@ -0,0 +1,33 @@ +//go:build !amd64 || appengine || !gc || noasm +// +build !amd64 appengine !gc noasm + +// Copyright 2019+ Klaus Post. All rights reserved. +// License information can be found in the LICENSE file. + +package zstd + +import ( + "encoding/binary" + "math/bits" +) + +// matchLen returns the maximum common prefix length of a and b. +// a must be the shortest of the two. +func matchLen(a, b []byte) (n int) { + for ; len(a) >= 8 && len(b) >= 8; a, b = a[8:], b[8:] { + diff := binary.LittleEndian.Uint64(a) ^ binary.LittleEndian.Uint64(b) + if diff != 0 { + return n + bits.TrailingZeros64(diff)>>3 + } + n += 8 + } + + for i := range a { + if a[i] != b[i] { + break + } + n++ + } + return n + +} diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec.go b/vendor/github.com/klauspost/compress/zstd/seqdec.go index f833d1541f..9405fcf101 100644 --- a/vendor/github.com/klauspost/compress/zstd/seqdec.go +++ b/vendor/github.com/klauspost/compress/zstd/seqdec.go @@ -236,9 +236,12 @@ func (s *sequenceDecs) decodeSync(hist []byte) error { maxBlockSize = s.windowSize } + if debugDecoder { + println("decodeSync: decoding", seqs, "sequences", br.remain(), "bits remain on stream") + } for i := seqs - 1; i >= 0; i-- { if br.overread() { - printf("reading sequence %d, exceeded available data\n", seqs-i) + printf("reading sequence %d, exceeded available data. Overread by %d\n", seqs-i, -br.remain()) return io.ErrUnexpectedEOF } var ll, mo, ml int @@ -314,9 +317,6 @@ func (s *sequenceDecs) decodeSync(hist []byte) error { } size := ll + ml + len(out) if size-startSize > maxBlockSize { - if size-startSize == 424242 { - panic("here") - } return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) } if size > cap(out) { @@ -427,8 +427,7 @@ func (s *sequenceDecs) decodeSync(hist []byte) error { } } - // Check if space for literals - if size := len(s.literals) + len(s.out) - startSize; size > maxBlockSize { + if size := len(s.literals) + len(out) - startSize; size > maxBlockSize { return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) } diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go index 191384adfd..8adabd8287 100644 --- a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go +++ b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go @@ -5,6 +5,7 @@ package zstd import ( "fmt" + "io" "github.com/klauspost/compress/internal/cpuinfo" ) @@ -134,6 +135,9 @@ func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) { return true, fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ctx.ll, ctx.litRemain+ctx.ll) + case errorOverread: + return true, io.ErrUnexpectedEOF + case errorNotEnoughSpace: size := ctx.outPosition + ctx.ll + ctx.ml if debugDecoder { @@ -148,7 +152,6 @@ func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) { s.seqSize += ctx.litRemain if s.seqSize > maxBlockSize { return true, fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - } err := br.close() if err != nil { @@ -203,6 +206,9 @@ const errorNotEnoughLiterals = 4 // error reported when capacity of `out` is too small const errorNotEnoughSpace = 5 +// error reported when bits are overread. +const errorOverread = 6 + // sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm. // // Please refer to seqdec_generic.go for the reference implementation. @@ -248,6 +254,10 @@ func (s *sequenceDecs) decode(seqs []seqVals) error { litRemain: len(s.literals), } + if debugDecoder { + println("decode: decoding", len(seqs), "sequences", br.remain(), "bits remain on stream") + } + s.seqSize = 0 lte56bits := s.maxBits+s.offsets.fse.actualTableLog+s.matchLengths.fse.actualTableLog+s.litLengths.fse.actualTableLog <= 56 var errCode int @@ -278,6 +288,8 @@ func (s *sequenceDecs) decode(seqs []seqVals) error { case errorNotEnoughLiterals: ll := ctx.seqs[i].ll return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, ctx.litRemain+ll) + case errorOverread: + return io.ErrUnexpectedEOF } return fmt.Errorf("sequenceDecs_decode_amd64 returned erronous code %d", errCode) @@ -292,6 +304,9 @@ func (s *sequenceDecs) decode(seqs []seqVals) error { if s.seqSize > maxBlockSize { return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) } + if debugDecoder { + println("decode: ", br.remain(), "bits remain on stream. code:", errCode) + } err := br.close() if err != nil { printf("Closing sequences: %v, %+v\n", err, *br) diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s index b94993a072..b6f4ba6fc5 100644 --- a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s +++ b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s @@ -38,7 +38,7 @@ sequenceDecs_decode_amd64_main_loop: sequenceDecs_decode_amd64_fill_byte_by_byte: CMPQ SI, $0x00 - JLE sequenceDecs_decode_amd64_fill_end + JLE sequenceDecs_decode_amd64_fill_check_overread CMPQ BX, $0x07 JLE sequenceDecs_decode_amd64_fill_end SHLQ $0x08, DX @@ -49,6 +49,10 @@ sequenceDecs_decode_amd64_fill_byte_by_byte: ORQ AX, DX JMP sequenceDecs_decode_amd64_fill_byte_by_byte +sequenceDecs_decode_amd64_fill_check_overread: + CMPQ BX, $0x40 + JA error_overread + sequenceDecs_decode_amd64_fill_end: // Update offset MOVQ R9, AX @@ -105,7 +109,7 @@ sequenceDecs_decode_amd64_ml_update_zero: sequenceDecs_decode_amd64_fill_2_byte_by_byte: CMPQ SI, $0x00 - JLE sequenceDecs_decode_amd64_fill_2_end + JLE sequenceDecs_decode_amd64_fill_2_check_overread CMPQ BX, $0x07 JLE sequenceDecs_decode_amd64_fill_2_end SHLQ $0x08, DX @@ -116,6 +120,10 @@ sequenceDecs_decode_amd64_fill_2_byte_by_byte: ORQ AX, DX JMP sequenceDecs_decode_amd64_fill_2_byte_by_byte +sequenceDecs_decode_amd64_fill_2_check_overread: + CMPQ BX, $0x40 + JA error_overread + sequenceDecs_decode_amd64_fill_2_end: // Update literal length MOVQ DI, AX @@ -320,6 +328,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // func sequenceDecs_decode_56_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int // Requires: CMOV TEXT ·sequenceDecs_decode_56_amd64(SB), $8-32 @@ -356,7 +369,7 @@ sequenceDecs_decode_56_amd64_main_loop: sequenceDecs_decode_56_amd64_fill_byte_by_byte: CMPQ SI, $0x00 - JLE sequenceDecs_decode_56_amd64_fill_end + JLE sequenceDecs_decode_56_amd64_fill_check_overread CMPQ BX, $0x07 JLE sequenceDecs_decode_56_amd64_fill_end SHLQ $0x08, DX @@ -367,6 +380,10 @@ sequenceDecs_decode_56_amd64_fill_byte_by_byte: ORQ AX, DX JMP sequenceDecs_decode_56_amd64_fill_byte_by_byte +sequenceDecs_decode_56_amd64_fill_check_overread: + CMPQ BX, $0x40 + JA error_overread + sequenceDecs_decode_56_amd64_fill_end: // Update offset MOVQ R9, AX @@ -613,6 +630,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // func sequenceDecs_decode_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int // Requires: BMI, BMI2, CMOV TEXT ·sequenceDecs_decode_bmi2(SB), $8-32 @@ -649,7 +671,7 @@ sequenceDecs_decode_bmi2_main_loop: sequenceDecs_decode_bmi2_fill_byte_by_byte: CMPQ BX, $0x00 - JLE sequenceDecs_decode_bmi2_fill_end + JLE sequenceDecs_decode_bmi2_fill_check_overread CMPQ DX, $0x07 JLE sequenceDecs_decode_bmi2_fill_end SHLQ $0x08, AX @@ -660,6 +682,10 @@ sequenceDecs_decode_bmi2_fill_byte_by_byte: ORQ CX, AX JMP sequenceDecs_decode_bmi2_fill_byte_by_byte +sequenceDecs_decode_bmi2_fill_check_overread: + CMPQ DX, $0x40 + JA error_overread + sequenceDecs_decode_bmi2_fill_end: // Update offset MOVQ $0x00000808, CX @@ -700,7 +726,7 @@ sequenceDecs_decode_bmi2_fill_end: sequenceDecs_decode_bmi2_fill_2_byte_by_byte: CMPQ BX, $0x00 - JLE sequenceDecs_decode_bmi2_fill_2_end + JLE sequenceDecs_decode_bmi2_fill_2_check_overread CMPQ DX, $0x07 JLE sequenceDecs_decode_bmi2_fill_2_end SHLQ $0x08, AX @@ -711,6 +737,10 @@ sequenceDecs_decode_bmi2_fill_2_byte_by_byte: ORQ CX, AX JMP sequenceDecs_decode_bmi2_fill_2_byte_by_byte +sequenceDecs_decode_bmi2_fill_2_check_overread: + CMPQ DX, $0x40 + JA error_overread + sequenceDecs_decode_bmi2_fill_2_end: // Update literal length MOVQ $0x00000808, CX @@ -889,6 +919,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // func sequenceDecs_decode_56_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int // Requires: BMI, BMI2, CMOV TEXT ·sequenceDecs_decode_56_bmi2(SB), $8-32 @@ -925,7 +960,7 @@ sequenceDecs_decode_56_bmi2_main_loop: sequenceDecs_decode_56_bmi2_fill_byte_by_byte: CMPQ BX, $0x00 - JLE sequenceDecs_decode_56_bmi2_fill_end + JLE sequenceDecs_decode_56_bmi2_fill_check_overread CMPQ DX, $0x07 JLE sequenceDecs_decode_56_bmi2_fill_end SHLQ $0x08, AX @@ -936,6 +971,10 @@ sequenceDecs_decode_56_bmi2_fill_byte_by_byte: ORQ CX, AX JMP sequenceDecs_decode_56_bmi2_fill_byte_by_byte +sequenceDecs_decode_56_bmi2_fill_check_overread: + CMPQ DX, $0x40 + JA error_overread + sequenceDecs_decode_56_bmi2_fill_end: // Update offset MOVQ $0x00000808, CX @@ -1140,6 +1179,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // func sequenceDecs_executeSimple_amd64(ctx *executeAsmContext) bool // Requires: SSE TEXT ·sequenceDecs_executeSimple_amd64(SB), $8-9 @@ -1804,7 +1848,7 @@ sequenceDecs_decodeSync_amd64_main_loop: sequenceDecs_decodeSync_amd64_fill_byte_by_byte: CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_amd64_fill_end + JLE sequenceDecs_decodeSync_amd64_fill_check_overread CMPQ BX, $0x07 JLE sequenceDecs_decodeSync_amd64_fill_end SHLQ $0x08, DX @@ -1815,6 +1859,10 @@ sequenceDecs_decodeSync_amd64_fill_byte_by_byte: ORQ AX, DX JMP sequenceDecs_decodeSync_amd64_fill_byte_by_byte +sequenceDecs_decodeSync_amd64_fill_check_overread: + CMPQ BX, $0x40 + JA error_overread + sequenceDecs_decodeSync_amd64_fill_end: // Update offset MOVQ R9, AX @@ -1871,7 +1919,7 @@ sequenceDecs_decodeSync_amd64_ml_update_zero: sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte: CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_amd64_fill_2_end + JLE sequenceDecs_decodeSync_amd64_fill_2_check_overread CMPQ BX, $0x07 JLE sequenceDecs_decodeSync_amd64_fill_2_end SHLQ $0x08, DX @@ -1882,6 +1930,10 @@ sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte: ORQ AX, DX JMP sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte +sequenceDecs_decodeSync_amd64_fill_2_check_overread: + CMPQ BX, $0x40 + JA error_overread + sequenceDecs_decodeSync_amd64_fill_2_end: // Update literal length MOVQ DI, AX @@ -2291,6 +2343,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // Return with not enough output space error error_not_enough_space: MOVQ ctx+16(FP), AX @@ -2356,7 +2413,7 @@ sequenceDecs_decodeSync_bmi2_main_loop: sequenceDecs_decodeSync_bmi2_fill_byte_by_byte: CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_bmi2_fill_end + JLE sequenceDecs_decodeSync_bmi2_fill_check_overread CMPQ DX, $0x07 JLE sequenceDecs_decodeSync_bmi2_fill_end SHLQ $0x08, AX @@ -2367,6 +2424,10 @@ sequenceDecs_decodeSync_bmi2_fill_byte_by_byte: ORQ CX, AX JMP sequenceDecs_decodeSync_bmi2_fill_byte_by_byte +sequenceDecs_decodeSync_bmi2_fill_check_overread: + CMPQ DX, $0x40 + JA error_overread + sequenceDecs_decodeSync_bmi2_fill_end: // Update offset MOVQ $0x00000808, CX @@ -2407,7 +2468,7 @@ sequenceDecs_decodeSync_bmi2_fill_end: sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte: CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_bmi2_fill_2_end + JLE sequenceDecs_decodeSync_bmi2_fill_2_check_overread CMPQ DX, $0x07 JLE sequenceDecs_decodeSync_bmi2_fill_2_end SHLQ $0x08, AX @@ -2418,6 +2479,10 @@ sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte: ORQ CX, AX JMP sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte +sequenceDecs_decodeSync_bmi2_fill_2_check_overread: + CMPQ DX, $0x40 + JA error_overread + sequenceDecs_decodeSync_bmi2_fill_2_end: // Update literal length MOVQ $0x00000808, CX @@ -2801,6 +2866,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // Return with not enough output space error error_not_enough_space: MOVQ ctx+16(FP), AX @@ -2866,7 +2936,7 @@ sequenceDecs_decodeSync_safe_amd64_main_loop: sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte: CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_safe_amd64_fill_end + JLE sequenceDecs_decodeSync_safe_amd64_fill_check_overread CMPQ BX, $0x07 JLE sequenceDecs_decodeSync_safe_amd64_fill_end SHLQ $0x08, DX @@ -2877,6 +2947,10 @@ sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte: ORQ AX, DX JMP sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte +sequenceDecs_decodeSync_safe_amd64_fill_check_overread: + CMPQ BX, $0x40 + JA error_overread + sequenceDecs_decodeSync_safe_amd64_fill_end: // Update offset MOVQ R9, AX @@ -2933,7 +3007,7 @@ sequenceDecs_decodeSync_safe_amd64_ml_update_zero: sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte: CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_safe_amd64_fill_2_end + JLE sequenceDecs_decodeSync_safe_amd64_fill_2_check_overread CMPQ BX, $0x07 JLE sequenceDecs_decodeSync_safe_amd64_fill_2_end SHLQ $0x08, DX @@ -2944,6 +3018,10 @@ sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte: ORQ AX, DX JMP sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte +sequenceDecs_decodeSync_safe_amd64_fill_2_check_overread: + CMPQ BX, $0x40 + JA error_overread + sequenceDecs_decodeSync_safe_amd64_fill_2_end: // Update literal length MOVQ DI, AX @@ -3455,6 +3533,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // Return with not enough output space error error_not_enough_space: MOVQ ctx+16(FP), AX @@ -3520,7 +3603,7 @@ sequenceDecs_decodeSync_safe_bmi2_main_loop: sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte: CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_safe_bmi2_fill_end + JLE sequenceDecs_decodeSync_safe_bmi2_fill_check_overread CMPQ DX, $0x07 JLE sequenceDecs_decodeSync_safe_bmi2_fill_end SHLQ $0x08, AX @@ -3531,6 +3614,10 @@ sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte: ORQ CX, AX JMP sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte +sequenceDecs_decodeSync_safe_bmi2_fill_check_overread: + CMPQ DX, $0x40 + JA error_overread + sequenceDecs_decodeSync_safe_bmi2_fill_end: // Update offset MOVQ $0x00000808, CX @@ -3571,7 +3658,7 @@ sequenceDecs_decodeSync_safe_bmi2_fill_end: sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte: CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_safe_bmi2_fill_2_end + JLE sequenceDecs_decodeSync_safe_bmi2_fill_2_check_overread CMPQ DX, $0x07 JLE sequenceDecs_decodeSync_safe_bmi2_fill_2_end SHLQ $0x08, AX @@ -3582,6 +3669,10 @@ sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte: ORQ CX, AX JMP sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte +sequenceDecs_decodeSync_safe_bmi2_fill_2_check_overread: + CMPQ DX, $0x40 + JA error_overread + sequenceDecs_decodeSync_safe_bmi2_fill_2_end: // Update literal length MOVQ $0x00000808, CX @@ -4067,6 +4158,11 @@ error_not_enough_literals: MOVQ $0x00000004, ret+24(FP) RET + // Return with overread error +error_overread: + MOVQ $0x00000006, ret+24(FP) + RET + // Return with not enough output space error error_not_enough_space: MOVQ ctx+16(FP), AX diff --git a/vendor/github.com/klauspost/compress/zstd/zstd.go b/vendor/github.com/klauspost/compress/zstd/zstd.go index 5ffa82f5ac..4be7cc7367 100644 --- a/vendor/github.com/klauspost/compress/zstd/zstd.go +++ b/vendor/github.com/klauspost/compress/zstd/zstd.go @@ -9,7 +9,6 @@ import ( "errors" "log" "math" - "math/bits" ) // enable debug printing @@ -106,33 +105,12 @@ func printf(format string, a ...interface{}) { } } -// matchLen returns the maximum common prefix length of a and b. -// a must be the shortest of the two. -func matchLen(a, b []byte) (n int) { - for ; len(a) >= 8 && len(b) >= 8; a, b = a[8:], b[8:] { - diff := binary.LittleEndian.Uint64(a) ^ binary.LittleEndian.Uint64(b) - if diff != 0 { - return n + bits.TrailingZeros64(diff)>>3 - } - n += 8 - } - - for i := range a { - if a[i] != b[i] { - break - } - n++ - } - return n - -} - func load3232(b []byte, i int32) uint32 { - return binary.LittleEndian.Uint32(b[i:]) + return binary.LittleEndian.Uint32(b[:len(b):len(b)][i:]) } func load6432(b []byte, i int32) uint64 { - return binary.LittleEndian.Uint64(b[i:]) + return binary.LittleEndian.Uint64(b[:len(b):len(b)][i:]) } type byter interface { diff --git a/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/magiconair/properties/.travis.yml deleted file mode 100644 index baf9031dfe..0000000000 --- a/vendor/github.com/magiconair/properties/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: go -go: - - 1.3.x - - 1.4.x - - 1.5.x - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - - "1.10.x" - - "1.11.x" - - "1.12.x" - - "1.13.x" - - "1.14.x" - - "1.15.x" - - "1.16.x" - - tip diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md index ff8d02535a..842e8e24fb 100644 --- a/vendor/github.com/magiconair/properties/CHANGELOG.md +++ b/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -1,5 +1,50 @@ ## Changelog +### [1.8.7](https://github.com/magiconair/properties/tree/v1.8.7) - 08 Dec 2022 + + * [PR #65](https://github.com/magiconair/properties/pull/65): Speedup Merge + + Thanks to [@AdityaVallabh](https://github.com/AdityaVallabh) for the patch. + + * [PR #66](https://github.com/magiconair/properties/pull/66): use github actions + +### [1.8.6](https://github.com/magiconair/properties/tree/v1.8.6) - 23 Feb 2022 + + * [PR #57](https://github.com/magiconair/properties/pull/57):Fix "unreachable code" lint error + + Thanks to [@ellie](https://github.com/ellie) for the patch. + + * [PR #63](https://github.com/magiconair/properties/pull/63): Make TestMustGetParsedDuration backwards compatible + + This patch ensures that the `TestMustGetParsedDuration` still works with `go1.3` to make the + author happy until it affects real users. + + Thanks to [@maage](https://github.com/maage) for the patch. + +### [1.8.5](https://github.com/magiconair/properties/tree/v1.8.5) - 24 Mar 2021 + + * [PR #55](https://github.com/magiconair/properties/pull/55): Fix: Encoding Bug in Comments + + When reading comments \ are loaded correctly, but when writing they are then + replaced by \\. This leads to wrong comments when writing and reading multiple times. + + Thanks to [@doxsch](https://github.com/doxsch) for the patch. + +### [1.8.4](https://github.com/magiconair/properties/tree/v1.8.4) - 23 Sep 2020 + + * [PR #50](https://github.com/magiconair/properties/pull/50): enhance error message for circular references + + Thanks to [@sriv](https://github.com/sriv) for the patch. + +### [1.8.3](https://github.com/magiconair/properties/tree/v1.8.3) - 14 Sep 2020 + + * [PR #49](https://github.com/magiconair/properties/pull/49): Include the key in error message causing the circular reference + + The change is include the key in the error message which is causing the circular + reference when parsing/loading the properties files. + + Thanks to [@haroon-sheikh](https://github.com/haroon-sheikh) for the patch. + ### [1.8.2](https://github.com/magiconair/properties/tree/v1.8.2) - 25 Aug 2020 * [PR #36](https://github.com/magiconair/properties/pull/36): Escape backslash on write diff --git a/vendor/github.com/magiconair/properties/decode.go b/vendor/github.com/magiconair/properties/decode.go index 3ebf8049c7..8e6aa441d9 100644 --- a/vendor/github.com/magiconair/properties/decode.go +++ b/vendor/github.com/magiconair/properties/decode.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -48,49 +48,49 @@ import ( // // Examples: // -// // Field is ignored. -// Field int `properties:"-"` +// // Field is ignored. +// Field int `properties:"-"` // -// // Field is assigned value of 'Field'. -// Field int +// // Field is assigned value of 'Field'. +// Field int // -// // Field is assigned value of 'myName'. -// Field int `properties:"myName"` +// // Field is assigned value of 'myName'. +// Field int `properties:"myName"` // -// // Field is assigned value of key 'myName' and has a default -// // value 15 if the key does not exist. -// Field int `properties:"myName,default=15"` +// // Field is assigned value of key 'myName' and has a default +// // value 15 if the key does not exist. +// Field int `properties:"myName,default=15"` // -// // Field is assigned value of key 'Field' and has a default -// // value 15 if the key does not exist. -// Field int `properties:",default=15"` +// // Field is assigned value of key 'Field' and has a default +// // value 15 if the key does not exist. +// Field int `properties:",default=15"` // -// // Field is assigned value of key 'date' and the date -// // is in format 2006-01-02 -// Field time.Time `properties:"date,layout=2006-01-02"` +// // Field is assigned value of key 'date' and the date +// // is in format 2006-01-02 +// Field time.Time `properties:"date,layout=2006-01-02"` // -// // Field is assigned the non-empty and whitespace trimmed -// // values of key 'Field' split by commas. -// Field []string +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas. +// Field []string // -// // Field is assigned the non-empty and whitespace trimmed -// // values of key 'Field' split by commas and has a default -// // value ["a", "b", "c"] if the key does not exist. -// Field []string `properties:",default=a;b;c"` +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas and has a default +// // value ["a", "b", "c"] if the key does not exist. +// Field []string `properties:",default=a;b;c"` // -// // Field is decoded recursively with "Field." as key prefix. -// Field SomeStruct +// // Field is decoded recursively with "Field." as key prefix. +// Field SomeStruct // -// // Field is decoded recursively with "myName." as key prefix. -// Field SomeStruct `properties:"myName"` +// // Field is decoded recursively with "myName." as key prefix. +// Field SomeStruct `properties:"myName"` // -// // Field is decoded recursively with "Field." as key prefix -// // and the next dotted element of the key as map key. -// Field map[string]string +// // Field is decoded recursively with "Field." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string // -// // Field is decoded recursively with "myName." as key prefix -// // and the next dotted element of the key as map key. -// Field map[string]string `properties:"myName"` +// // Field is decoded recursively with "myName." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string `properties:"myName"` func (p *Properties) Decode(x interface{}) error { t, v := reflect.TypeOf(x), reflect.ValueOf(x) if t.Kind() != reflect.Ptr || v.Elem().Type().Kind() != reflect.Struct { diff --git a/vendor/github.com/magiconair/properties/doc.go b/vendor/github.com/magiconair/properties/doc.go index f8822da2ba..7c79793159 100644 --- a/vendor/github.com/magiconair/properties/doc.go +++ b/vendor/github.com/magiconair/properties/doc.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -13,7 +13,7 @@ // // To load a single properties file use MustLoadFile(): // -// p := properties.MustLoadFile(filename, properties.UTF8) +// p := properties.MustLoadFile(filename, properties.UTF8) // // To load multiple properties files use MustLoadFiles() // which loads the files in the given order and merges the @@ -23,25 +23,25 @@ // Filenames can contain environment variables which are expanded // before loading. // -// f1 := "/etc/myapp/myapp.conf" -// f2 := "/home/${USER}/myapp.conf" -// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true) +// f1 := "/etc/myapp/myapp.conf" +// f2 := "/home/${USER}/myapp.conf" +// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true) // // All of the different key/value delimiters ' ', ':' and '=' are // supported as well as the comment characters '!' and '#' and // multi-line values. // -// ! this is a comment -// # and so is this +// ! this is a comment +// # and so is this // -// # the following expressions are equal -// key value -// key=value -// key:value -// key = value -// key : value -// key = val\ -// ue +// # the following expressions are equal +// key value +// key=value +// key:value +// key = value +// key : value +// key = val\ +// ue // // Properties stores all comments preceding a key and provides // GetComments() and SetComments() methods to retrieve and @@ -55,62 +55,62 @@ // and malformed expressions are not allowed and cause an // error. Expansion of environment variables is supported. // -// # standard property -// key = value +// # standard property +// key = value // -// # property expansion: key2 = value -// key2 = ${key} +// # property expansion: key2 = value +// key2 = ${key} // -// # recursive expansion: key3 = value -// key3 = ${key2} +// # recursive expansion: key3 = value +// key3 = ${key2} // -// # circular reference (error) -// key = ${key} +// # circular reference (error) +// key = ${key} // -// # malformed expression (error) -// key = ${ke +// # malformed expression (error) +// key = ${ke // -// # refers to the users' home dir -// home = ${HOME} +// # refers to the users' home dir +// home = ${HOME} // -// # local key takes precedence over env var: u = foo -// USER = foo -// u = ${USER} +// # local key takes precedence over env var: u = foo +// USER = foo +// u = ${USER} // // The default property expansion format is ${key} but can be // changed by setting different pre- and postfix values on the // Properties object. // -// p := properties.NewProperties() -// p.Prefix = "#[" -// p.Postfix = "]#" +// p := properties.NewProperties() +// p.Prefix = "#[" +// p.Postfix = "]#" // // Properties provides convenience functions for getting typed // values with default values if the key does not exist or the // type conversion failed. // -// # Returns true if the value is either "1", "on", "yes" or "true" -// # Returns false for every other value and the default value if -// # the key does not exist. -// v = p.GetBool("key", false) +// # Returns true if the value is either "1", "on", "yes" or "true" +// # Returns false for every other value and the default value if +// # the key does not exist. +// v = p.GetBool("key", false) // -// # Returns the value if the key exists and the format conversion -// # was successful. Otherwise, the default value is returned. -// v = p.GetInt64("key", 999) -// v = p.GetUint64("key", 999) -// v = p.GetFloat64("key", 123.0) -// v = p.GetString("key", "def") -// v = p.GetDuration("key", 999) +// # Returns the value if the key exists and the format conversion +// # was successful. Otherwise, the default value is returned. +// v = p.GetInt64("key", 999) +// v = p.GetUint64("key", 999) +// v = p.GetFloat64("key", 123.0) +// v = p.GetString("key", "def") +// v = p.GetDuration("key", 999) // // As an alternative properties may be applied with the standard // library's flag implementation at any time. // -// # Standard configuration -// v = flag.Int("key", 999, "help message") -// flag.Parse() +// # Standard configuration +// v = flag.Int("key", 999, "help message") +// flag.Parse() // -// # Merge p into the flag set -// p.MustFlag(flag.CommandLine) +// # Merge p into the flag set +// p.MustFlag(flag.CommandLine) // // Properties provides several MustXXX() convenience functions // which will terminate the app if an error occurs. The behavior @@ -119,30 +119,30 @@ // of logging the error set a different ErrorHandler before // you use the Properties package. // -// properties.ErrorHandler = properties.PanicHandler +// properties.ErrorHandler = properties.PanicHandler // -// # Will panic instead of logging an error -// p := properties.MustLoadFile("config.properties") +// # Will panic instead of logging an error +// p := properties.MustLoadFile("config.properties") // // You can also provide your own ErrorHandler function. The only requirement // is that the error handler function must exit after handling the error. // -// properties.ErrorHandler = func(err error) { -// fmt.Println(err) -// os.Exit(1) -// } +// properties.ErrorHandler = func(err error) { +// fmt.Println(err) +// os.Exit(1) +// } // -// # Will write to stdout and then exit -// p := properties.MustLoadFile("config.properties") +// # Will write to stdout and then exit +// p := properties.MustLoadFile("config.properties") // // Properties can also be loaded into a struct via the `Decode` // method, e.g. // -// type S struct { -// A string `properties:"a,default=foo"` -// D time.Duration `properties:"timeout,default=5s"` -// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"` -// } +// type S struct { +// A string `properties:"a,default=foo"` +// D time.Duration `properties:"timeout,default=5s"` +// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"` +// } // // See `Decode()` method for the full documentation. // @@ -152,5 +152,4 @@ // http://en.wikipedia.org/wiki/.properties // // http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29 -// package properties diff --git a/vendor/github.com/magiconair/properties/integrate.go b/vendor/github.com/magiconair/properties/integrate.go index 74d38dc677..35d0ae97b3 100644 --- a/vendor/github.com/magiconair/properties/integrate.go +++ b/vendor/github.com/magiconair/properties/integrate.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -10,8 +10,9 @@ import "flag" // the respective key for flag.Flag.Name. // // It's use is recommended with command line arguments as in: -// flag.Parse() -// p.MustFlag(flag.CommandLine) +// +// flag.Parse() +// p.MustFlag(flag.CommandLine) func (p *Properties) MustFlag(dst *flag.FlagSet) { m := make(map[string]*flag.Flag) dst.VisitAll(func(f *flag.Flag) { diff --git a/vendor/github.com/magiconair/properties/lex.go b/vendor/github.com/magiconair/properties/lex.go index e1e9dd7b12..3d15a1f6ed 100644 --- a/vendor/github.com/magiconair/properties/lex.go +++ b/vendor/github.com/magiconair/properties/lex.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go index c83c2dadd6..635368dc8a 100644 --- a/vendor/github.com/magiconair/properties/load.go +++ b/vendor/github.com/magiconair/properties/load.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/github.com/magiconair/properties/parser.go b/vendor/github.com/magiconair/properties/parser.go index 430e4fcd2c..fccfd39f6b 100644 --- a/vendor/github.com/magiconair/properties/parser.go +++ b/vendor/github.com/magiconair/properties/parser.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go index 62ae2d67ab..fb2f7b4048 100644 --- a/vendor/github.com/magiconair/properties/properties.go +++ b/vendor/github.com/magiconair/properties/properties.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -700,22 +700,17 @@ func (p *Properties) Delete(key string) { // Merge merges properties, comments and keys from other *Properties into p func (p *Properties) Merge(other *Properties) { + for _, k := range other.k { + if _, ok := p.m[k]; !ok { + p.k = append(p.k, k) + } + } for k, v := range other.m { p.m[k] = v } for k, v := range other.c { p.c[k] = v } - -outer: - for _, otherKey := range other.k { - for _, key := range p.k { - if otherKey == key { - continue outer - } - } - p.k = append(p.k, otherKey) - } } // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/magiconair/properties/rangecheck.go b/vendor/github.com/magiconair/properties/rangecheck.go index b013a2e5e1..dbd60b36e7 100644 --- a/vendor/github.com/magiconair/properties/rangecheck.go +++ b/vendor/github.com/magiconair/properties/rangecheck.go @@ -1,4 +1,4 @@ -// Copyright 2018 Frank Schroeder. All rights reserved. +// Copyright 2013-2022 Frank Schroeder. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/github.com/manifestival/client-go-client/.gitignore b/vendor/github.com/manifestival/client-go-client/.gitignore new file mode 100644 index 0000000000..edfc3a48fd --- /dev/null +++ b/vendor/github.com/manifestival/client-go-client/.gitignore @@ -0,0 +1,14 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +vendor/ diff --git a/vendor/github.com/manifestival/client-go-client/LICENSE b/vendor/github.com/manifestival/client-go-client/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/vendor/github.com/manifestival/client-go-client/LICENSE @@ -0,0 +1,201 @@ + 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/github.com/manifestival/client-go-client/README.md b/vendor/github.com/manifestival/client-go-client/README.md new file mode 100644 index 0000000000..a2f6637f1e --- /dev/null +++ b/vendor/github.com/manifestival/client-go-client/README.md @@ -0,0 +1,40 @@ +[![Build Status](https://github.com/manifestival/client-go-client/workflows/Build%20and%20Test/badge.svg)](https://github.com/manifestival/client-go-client/actions) + +# client-go-client + +A [client-go](https://github.com/kubernetes/client-go) implementation +of the [Manifestival](https://github.com/manifestival/manifestival) +`Client`. + +Usage +----- + +```go +import ( + mfc "github.com/manifestival/client-go-client" + mf "github.com/manifestival/manifestival" + "k8s.io/client-go/rest" +) + +func main() { + var config *rest.Config = ... + + manifest, err := mfc.NewManifest("file.yaml", config) + if err != nil { + panic("Failed to load manifest") + } + manifest.Apply() + + // a slightly more complex example + client, _ := mfc.NewClient(config) + m, err := mf.ManifestFrom(mf.Recursive("dir/"), mf.UseClient(client)) + if err != nil { + panic("Failed to load manifest") + } + m.Apply() +} +``` + +The `NewManifest` function in this library delegates to the function +of the same name in the `manifestival` package after constructing a +`manifestival.Client` implementation from the `*rest.Config`. diff --git a/vendor/github.com/manifestival/client-go-client/client.go b/vendor/github.com/manifestival/client-go-client/client.go new file mode 100644 index 0000000000..558ed823b6 --- /dev/null +++ b/vendor/github.com/manifestival/client-go-client/client.go @@ -0,0 +1,84 @@ +package client + +import ( + "context" + mfDynamic "github.com/manifestival/client-go-client/pkg/dynamic" + mf "github.com/manifestival/manifestival" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" +) + +// NewManifest returns a manifestival Manifest based on a path and config +func NewManifest(pathname string, config *rest.Config, opts ...mf.Option) (mf.Manifest, error) { + client, err := NewClient(config) + if err != nil { + return mf.Manifest{}, err + } + return mf.NewManifest(pathname, append(opts, mf.UseClient(client))...) +} + +// NewClient returns a manifestival client based on a rest config +func NewClient(config *rest.Config) (mf.Client, error) { + resourceGetter, err := mfDynamic.NewForConfig(config) + if err != nil { + return nil, err + } + return &clientGoClient{resourceGetter: resourceGetter}, nil +} + +// NewUnsafeDynamicClient returns a manifestival client based on dynamic kubernetes client +func NewUnsafeDynamicClient(client dynamic.Interface) (mf.Client, error) { + resourceGetter := mfDynamic.NewUnsafeResourceGetter(client) + return &clientGoClient{resourceGetter: resourceGetter}, nil +} + +type clientGoClient struct { + resourceGetter mfDynamic.ResourceGetter +} + +// verify implementation +var _ mf.Client = (*clientGoClient)(nil) + +func (c *clientGoClient) Create(obj *unstructured.Unstructured, options ...mf.ApplyOption) error { + resource, err := c.resourceGetter.ResourceInterface(obj) + if err != nil { + return err + } + opts := mf.ApplyWith(options) + _, err = resource.Create(context.TODO(), obj, *opts.ForCreate) + return err +} + +func (c *clientGoClient) Update(obj *unstructured.Unstructured, options ...mf.ApplyOption) error { + resource, err := c.resourceGetter.ResourceInterface(obj) + if err != nil { + return err + } + opts := mf.ApplyWith(options) + _, err = resource.Update(context.TODO(), obj, *opts.ForUpdate) + return err +} + +func (c *clientGoClient) Delete(obj *unstructured.Unstructured, options ...mf.DeleteOption) error { + resource, err := c.resourceGetter.ResourceInterface(obj) + if err != nil { + return err + } + opts := mf.DeleteWith(options) + err = resource.Delete(context.TODO(), obj.GetName(), *opts.ForDelete) + if apierrors.IsNotFound(err) && opts.IgnoreNotFound { + return nil + } + return err +} + +func (c *clientGoClient) Get(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + resource, err := c.resourceGetter.ResourceInterface(obj) + if err != nil { + return nil, err + } + return resource.Get(context.TODO(), obj.GetName(), metav1.GetOptions{}) +} diff --git a/vendor/github.com/manifestival/client-go-client/pkg/dynamic/interface.go b/vendor/github.com/manifestival/client-go-client/pkg/dynamic/interface.go new file mode 100644 index 0000000000..21ae052145 --- /dev/null +++ b/vendor/github.com/manifestival/client-go-client/pkg/dynamic/interface.go @@ -0,0 +1,13 @@ +package dynamic + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/client-go/dynamic" +) + +// ResourceGetter is the interface to returning a Resource +type ResourceGetter interface { + // ResourceInterface translates an Unstructured object to a ResourceInterface + // The ResourceInterface can then be used to execute k8s api calls. + ResourceInterface(obj *unstructured.Unstructured) (dynamic.ResourceInterface, error) +} diff --git a/vendor/github.com/manifestival/client-go-client/pkg/dynamic/rest_mapper_resource_interface.go b/vendor/github.com/manifestival/client-go-client/pkg/dynamic/rest_mapper_resource_interface.go new file mode 100644 index 0000000000..3360482eed --- /dev/null +++ b/vendor/github.com/manifestival/client-go-client/pkg/dynamic/rest_mapper_resource_interface.go @@ -0,0 +1,48 @@ +package dynamic + +import ( + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" +) + +type clientRestMapper struct { + client dynamic.Interface + mapper meta.RESTMapper +} + +// NewForConfig returns a ResourceGetter for a rest config. +func NewForConfig(config *rest.Config) (ResourceGetter, error) { + client, err := dynamic.NewForConfig(config) + if err != nil { + return nil, err + } + + mapper, err := apiutil.NewDynamicRESTMapper(config) + + if err != nil { + return nil, err + } + + resourceGetter := &clientRestMapper{ + client: client, + mapper: mapper, + } + return resourceGetter, nil +} + +func (cm *clientRestMapper) ResourceInterface(obj *unstructured.Unstructured) (dynamic.ResourceInterface, error) { + gvk := obj.GroupVersionKind() + mapping, err := cm.mapper.RESTMapping(gvk.GroupKind(), gvk.Version) + if err != nil { + return nil, err + } + if mapping.Scope.Name() == meta.RESTScopeNameRoot { + return cm.client.Resource(mapping.Resource), nil + } + return cm.client.Resource(mapping.Resource).Namespace(obj.GetNamespace()), nil +} + +var _ ResourceGetter = (*clientRestMapper)(nil) diff --git a/vendor/github.com/manifestival/client-go-client/pkg/dynamic/unsafe_resource_interface.go b/vendor/github.com/manifestival/client-go-client/pkg/dynamic/unsafe_resource_interface.go new file mode 100644 index 0000000000..55e512cae3 --- /dev/null +++ b/vendor/github.com/manifestival/client-go-client/pkg/dynamic/unsafe_resource_interface.go @@ -0,0 +1,27 @@ +package dynamic + +import ( + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/client-go/dynamic" +) + +type unsafeResourceInterface struct { + client dynamic.Interface +} + +// NewUnsafeResourceGetter returns a ResourceGetter based on a dynamic client. +// It is considered unsafe because it makes an assumption on the resource name +// based on the Kind. +func NewUnsafeResourceGetter(client dynamic.Interface) ResourceGetter { + return &unsafeResourceInterface{ + client: client, + } +} + +func (unsaferi *unsafeResourceInterface) ResourceInterface(obj *unstructured.Unstructured) (dynamic.ResourceInterface, error) { + plural, _ := meta.UnsafeGuessKindToResource(obj.GroupVersionKind()) + return unsaferi.client.Resource(plural).Namespace(obj.GetNamespace()), nil +} + +var _ ResourceGetter = (*unsafeResourceInterface)(nil) diff --git a/vendor/github.com/manifestival/manifestival/.gitignore b/vendor/github.com/manifestival/manifestival/.gitignore new file mode 100644 index 0000000000..31e3ac6d81 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/.gitignore @@ -0,0 +1,2 @@ +vendor/ +.idea diff --git a/vendor/github.com/manifestival/manifestival/CHANGELOG.md b/vendor/github.com/manifestival/manifestival/CHANGELOG.md new file mode 100644 index 0000000000..7a369f35ce --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/CHANGELOG.md @@ -0,0 +1,296 @@ +# Changelog + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) + + +## [Unreleased] + +### Changed + +### Added + +### Removed + + +## [0.7.2] - 2022-11-08 + +### Changed + +- No longer ignoring errors resulting from invalid YAML manifests [#88](https://github.com/manifestival/manifestival/issues/88) +- No longer preventing cluster-scoped resources from being owned [#90](https://github.com/manifestival/manifestival/issues/90) +- Fixed panic when unexpected errors occur during deletion [#92](https://github.com/manifestival/manifestival/issues/92) + + +## [0.7.1] - 2022-01-19 + +### Changed + +- Bump K8s dependencies to v0.22.5 - also bumped klog (v2.40.1) & go-logr (v1.2.2) +- Fixed the lifecycle of the `manifestival` annotation to be stored in the + database rather than the `Manifest` object state. Namespaces created from + varying manifests will now be deleted correctly if the annotation is + present. [#85](https://github.com/manifestival/manifestival/issues/85) + + +## [0.7.0] - 2021-02-11 + +### Changed + +- It is no longer possible to mutate manifest resources with the + `Filter` method, since now only deep copies of each resource are + passed to each `Predicate`. The only way to change a manifest's + resources is via the `Transform` method. [#75](https://github.com/manifestival/manifestival/issues/75) +- Updated Golang version to 1.15. +- Updated Kubernetes dependencies to 1.19.7. +- Updated `github.com/evanphx/json-patch` to `v5.2.0` +- Updated `github.com/go-logr/logr` to `v0.4.0` + + +## [0.6.1] - 2020-08-19 + +### Added + +- Support for generated names: if `metadata.generateName` is set and + `metadata.name` is *not* set on any resource in a manifest, that resource will + always be _created_ when the manifest is _applied_. [#65](https://github.com/manifestival/manifestival/issues/65) +- Support for CRD apiextensions.k8s.io/v1: CRD v1/v1beta has a difference + in the specification on the conversion webhook field, which needs to be + compatible in the InjectNamespace function. + +### Changed + +- Fixed the `In` predicate to not incorporate the API version in its comparison + of manifest resources. Only Group, Kind, Namespace, and Name are used to test + for equality. [#67](https://github.com/manifestival/manifestival/issues/67) +- After experimenting with dynamically constructing `Any` and `All` + predicates, we decided to partially revert + [#56](https://github.com/manifestival/manifestival/pull/56): `Any` + and `All` no longer require at least one argument as it has become + clear that `All()` should match `Everything` and `Any()` should + match `Nothing`. [#69](https://github.com/manifestival/manifestival/issues/69) + + +## [0.6.0] - 2020-07-07 + +### Changed + +- Migrated from [dep](https://github.com/golang/dep) to [go + modules](https://blog.golang.org/using-go-modules) + [#47](https://github.com/manifestival/manifestival/pull/47) +- Restored `FieldManager` option for creates and updates, essentially + reverting [#17](https://github.com/manifestival/manifestival/issues/17). + [#26](https://github.com/manifestival/manifestival/issues/26) +- Fixed the `InjectNamespace` transformer to properly update the + `spec.conversion` field in a `CustomResourceDefinition` + [#55](https://github.com/manifestival/manifestival/issues/55) +- Predicate changes: `None` was removed and replaced with `Not`, which + only accepts a single predicate. `Any` and `All` now require at + least one predicate since it wasn't clear how they should behave + without one. [#56](https://github.com/manifestival/manifestival/pull/56) +- Fixed bug where manifestival wasn't deleting namespaces it created. + (It should never delete a namespace it didn't create) + [#61](https://github.com/manifestival/manifestival/issues/61) + +### Added + +- Introduced `Append` to the `Manifestival` interface. This enables + the creation of new manifests from the concatenation of others. The + resulting manifest retains the options, e.g. client and logger, of + the receiver. [#41](https://github.com/manifestival/manifestival/issues/41) +- New fake `Client` to facilitate testing. Provides both a simple + in-memory object store and easily-override-able stubs for all the + `Client` functions: `Create`, `Update`, `Delete`, or `Get` + [#43](https://github.com/manifestival/manifestival/pull/43) +- More [docs](README.md), including + [godoc](https://godoc.org/github.com/manifestival/manifestival) + [#42](https://github.com/manifestival/manifestival/pull/42) +- New filter `Predicate`, `In`, that returns true if a resource is in + a given manifest, uniquely identified by GVK, namespace, and name + [#50](https://github.com/manifestival/manifestival/pull/50) +- New filter `Predicate`, `ByAnnotation`, that does for annotations + what `ByLabel` did for labels! + [#52](https://github.com/manifestival/manifestival/pull/52) +- Defaulting the `FieldManager` for create/updates to "manifestival" + to help reconcile changes in `metadata.managedFields`, in + anticipation of server-side apply. [#64](https://github.com/manifestival/manifestival/pull/64) + +### Removed + +- Removed dependency on `k8s.io/kubernetes`. It was only used in a + test, to verify a proper response to server-side validation errors, + but 'go modules' doesn't distinguish test-only dependencies, and + `k8s.io/kubernetes` was never intended to be consumed as a module, + so we replicated the validation logic in the test itself. + + +## [0.5.0] - 2020-03-31 + +### Changed + +- Renamed the `Replace` option to `Overwrite` to better match the + behavior of the `kubectl apply` subcommand. Its default value is now + true, which will cause `Apply` to "automatically resolve conflicts + between the modified and live configuration by using values from the + modified configuration". To override this behavior and have invalid + patches return an error, call `Apply(Overwrite(false))` [#39](https://github.com/manifestival/manifestival/pull/39) +- Made the `None` filter variadic, accepting multiple `Predicates`, + returning only those resources matching none of them. [#36](https://github.com/manifestival/manifestival/issues/36) + + +## [0.4.0] - 2020-03-11 + +### Added + +- New `DryRun` function shows how applying the manifest will change + the cluster. Its return value is a list of strategic merge patches + [#29](https://github.com/manifestival/manifestival/pull/29) +- New `ByLabels` function which is similar to `ByLabel`, but it + accepts multiple labels in a map and filters all resources that + match any of them [#32](https://github.com/manifestival/manifestival/pull/32) + +### Changed + +- Reordered/renamed parameters in the `patch` package to be more + consistent with its upstream functions. +- The `Patch` interface is now a struct +- Renamed `Patch.Apply` to `Patch.Merge` +- `Delete` may now return the errors that it was previously only + logging. It will still ignore `NotFound` errors when the + `IgnoreNotFound` option is true, of course. +- Fixed bug when transformers use `scheme.Scheme.Convert` to + manipulate resources [#33](https://github.com/manifestival/manifestival/pull/33) + + +## [0.3.1] - 2020-02-26 + +### Changed + +- Bugfix: set LastAppliedConfigAnnotation correctly on updates + [#27](https://github.com/manifestival/manifestival/issues/27) + + +## [0.3.0] - 2020-02-25 + +### Added + +- Introduced `All` and `Any` predicates, implementing `Filter` in + terms of the former +- A new `ApplyOption` called `Replace` that defaults to false. Can be + used to force a replace update instead of a merge patch when + applying a manifest, e.g. `m.Apply(Replace(true))` or + `m.Apply(ForceReplace)` [#23](https://github.com/manifestival/manifestival/issues/23) + +### Removed + +- `ConfigMaps` are no longer handled specially when applying manifests + +### Changed + +- Renamed `Complement` to `None`, `JustCRDs` to `CRDs`, and `NotCRDs` + to `NoCRDs`. + + +## [0.2.0] - 2020-02-21 + +### Added + +- Introduced the `Source` interface, enabling the creation of a + Manifest from any source [#11](https://github.com/manifestival/manifestival/pull/11) +- Added a `ManifestFrom` constructor to complement `NewManifest`, + which now only works for paths to files, directories, and URL's +- Use `ManifestFrom(Recursive("dirname/"))` to create a manifest from + a recursive directory search for yaml files. +- Use `ManifestFrom(Slice(v))` to create a manifest from any `v` of type + `[]unstructured.Unstructured` +- Use `ManifestFrom(Reader(r))` to create a manifest from any `r` of + type `io.Reader` +- Introduced a new `Filter` function in the `Manifestival` interface + that returns a subset of resources matching one or more `Predicates` +- Convenient predicates provided: `ByName`, `ByKind`, `ByLabel`, + `ByGVK`, `Complement`, `JustCRDs`, and `NotCRDs` + +### Removed + +- In order to support k8s versions <1.14, the code no longer + references the `FieldManager` field of either `metav1.CreateOptions` + or `metav1.UpdateOptions`. This only affects `client-go` clients who + set `FieldManager` on their creates/updates; `controller-runtime` + clients aren't affected. + [#17](https://github.com/manifestival/manifestival/issues/17) + +### Changed + +- Removed the "convenience" functions from the `Manifestival` + interface and renamed `ApplyAll` and `DeleteAll` to `Apply` and + `Delete`, respectively. [#14](https://github.com/manifestival/manifestival/issues/14) +- The `Manifest` struct's `Client` is now public, so the handy `Get` + and `Delete` functions formerly in the `Manifestival` interface can + now be invoked directly on any manifest's `Client` member. +- Manifests created from a recursive directory search are now only + possible via the new `ManifestFrom` constructor. The `NewManifest` + constructor no longer supports a `recursive` option. +- Moved the path/yaml parsing logic into its own `sources` package to + reduce the exported names in the `manifestival` package. +- Split the `ClientOption` type into `ApplyOption` and `DeleteOption`, + adding `IgnoreNotFound` to the latter, thereby enabling `Client` + implementations to honor it, simplifying delete logic for users + invoking the `Client` directly. All `ApplyOptions` apply to both + creates and updates + [#12](https://github.com/manifestival/manifestival/pull/12) +- The `Manifest` struct's `Resources` member is no longer public. + Instead, a `Manifest.Resources()` function is provided to return a + deep copy of the manifest's resources, if needed. +- `Transform` now returns a `Manifest` by value, like `Filter`. This + is a stronger indicator of immutability and conveniently matches the + return type of `NewManifest`. [#18](https://github.com/manifestival/manifestival/issues/18) +- The receiver types for the `Apply`, `Delete`, and `Resources` + methods on `Manifest` are now values, enabling convenient chaining + of calls involving `Filter`, for example. [#21](https://github.com/manifestival/manifestival/issues/21) + + +## [0.1.0] - 2020-02-17 + +### Changed + +- Factored client API calls into a `Client` interface; implementations + for [controller-runtime] and [client-go] reside in separate repos + within this org [#4](https://github.com/manifestival/manifestival/issues/4) +- Introduced `Option` and `ClientOption` types, enabling golang's + "functional options" pattern for both Manifest creation and `Client` + interface options, respectively [#6](https://github.com/manifestival/manifestival/issues/6) +- Transforms are now immutable, a feature developed in the old + `client-go` branch +- Except for `ConfigMaps`, manifest resources are now applied using + kubectl's strategic 3-way merging, a feature also developed in the + old `client-go` branch. `ConfigMaps` use a JSON merge patch, + which is essentially a "replace" +- Other small fixes from the old `client-go` branch have also been + merged + + +## [0.0.0] - 2020-01-11 + +### Changed + +- This release represents the move from this project's original home, + https://github.com/jcrossley3/manifestival. +- There were no releases in the old repo, just two branches: `master`, + based on the `controller-runtime` client API, and `client-go`, based + on the `client-go` API. + + +[controller-runtime]: https://github.com/manifestival/controller-runtime-client +[client-go]: https://github.com/manifestival/client-go-client +[Unreleased]: https://github.com/manifestival/manifestival/compare/v0.7.2...HEAD +[0.7.2]: https://github.com/manifestival/manifestival/compare/v0.7.1...v0.7.2 +[0.7.1]: https://github.com/manifestival/manifestival/compare/v0.7.0...v0.7.1 +[0.7.0]: https://github.com/manifestival/manifestival/compare/v0.6.1...v0.7.0 +[0.6.1]: https://github.com/manifestival/manifestival/compare/v0.6.0...v0.6.1 +[0.6.0]: https://github.com/manifestival/manifestival/compare/v0.5.0...v0.6.0 +[0.5.0]: https://github.com/manifestival/manifestival/compare/v0.4.0...v0.5.0 +[0.4.0]: https://github.com/manifestival/manifestival/compare/v0.3.1...v0.4.0 +[0.3.1]: https://github.com/manifestival/manifestival/compare/v0.3.0...v0.3.1 +[0.3.0]: https://github.com/manifestival/manifestival/compare/v0.2.0...v0.3.0 +[0.2.0]: https://github.com/manifestival/manifestival/compare/v0.1.0...v0.2.0 +[0.1.0]: https://github.com/manifestival/manifestival/compare/v0.0.0...v0.1.0 +[0.0.0]: https://github.com/manifestival/manifestival/releases/tag/v0.0.0 diff --git a/vendor/github.com/manifestival/manifestival/LICENSE b/vendor/github.com/manifestival/manifestival/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/LICENSE @@ -0,0 +1,201 @@ + 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/github.com/manifestival/manifestival/README.md b/vendor/github.com/manifestival/manifestival/README.md new file mode 100644 index 0000000000..d1151791c9 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/README.md @@ -0,0 +1,318 @@ +# Manifestival + +[![Build Status](https://github.com/manifestival/manifestival/workflows/Build%20and%20Test/badge.svg)](https://github.com/manifestival/manifestival/actions) +[![PkgGoDev](https://pkg.go.dev/badge/github.com/manifestival/manifestival)](https://pkg.go.dev/github.com/manifestival/manifestival) + +Manifestival is a library for manipulating a set of unstructured +Kubernetes resources. Essentially, it enables you to toss a "bag of +YAML" at a k8s cluster. + +It's sort of like embedding a simplified `kubectl` in your Go +application. You can load a manifest of resources from a variety of +sources, optionally transform/filter those resources, and then +apply/delete them to/from your k8s cluster. + +See [CHANGELOG.md](CHANGELOG.md) + +* [Creating Manifests](#creating-manifests) + * [Sources](#sources) + * [Append](#append) + * [Filter](#filter) + * [Transform](#transform) +* [Applying Manifests](#applying-manifests) + * [Client](#client) + * [fake.Client](#fakeclient) + * [Logging](#logging) + * [Apply](#apply) + * [Delete](#delete) + * [DryRun](#dryrun) + + +## Creating Manifests + +Manifests may be constructed from a variety of sources. Once created, +they are immutable, but new instances may be created from them using +their [Append], [Filter] and [Transform] functions. + +The typical way to create a manifest is by calling `NewManifest` + +```go +manifest, err := NewManifest("/path/to/file.yaml") +``` + +But `NewManifest` is just a convenience function that calls +`ManifestFrom` with a `Path`, an implementation of `Source`. + +### Sources + +A manifest is created by passing an implementation of the [Source] +interface to the `ManifestFrom` function. Here are the built-in types +that implement `Source`: + +* `Path` +* `Recursive` +* `Slice` +* `Reader` + +The `Path` source is the most versatile. It's a string representing +the location of some YAML content in many possible forms: a file, a +directory of files, a URL, or a comma-delimited list of any of those +things, all of which will be combined into a single manifest. + +```go +// Single file +m, err := ManifestFrom(Path("/path/to/file.yaml")) + +// All files in a directory +m, err := ManifestFrom(Path("/path/to/dir")) + +// A remote URL +m, err := ManifestFrom(Path("http://site.com/manifest.yaml")) + +// All of the above +m, err := ManifestFrom(Path("/path/to/file.yaml,/path/to/dir,http://site.com/manifest.yaml")) +``` + +`Recursive` works exactly like `Path` except that directories are +searched recursively. + +The `Slice` source enables the creation of a manifest from an existing +slice of `[]unstructured.Unstructured`. This is helpful for testing +and, combined with the [Resources] accessor, facilitates more +sophisticated combinations of manifests, e.g. a crude form of +[Append](#append): + +```go +m3, _ := ManifestFrom(Slice(append(m1.Resources(), m2.Resources()...))) +``` + +And `Reader` is a function that takes an `io.Reader` and returns a +`Source` from which valid YAML is expected. + +### Append + +The `Append` function enables the creation of new manifests from the +concatenation of others. The resulting manifest retains the options, +e.g. client and logger, of the receiver. For example, + +```go +core, _ := NewManifest(path, UseLogger(logger), UseClient(client)) +istio, _ := NewManifest(pathToIstio) +kafka, _ := NewManifest(pathToKafka) + +manifest := core.Append(istio, kafka) +``` + +### Filter + +[Filter] returns a new Manifest containing only the resources for +which _all_ passed predicates return true. A [Predicate] is a function +that takes an `Unstructured` resource and returns a bool indicating +whether the resource should be included in the filtered results. + +There are a few built-in predicates and some helper functions for +creating your own: + +* `All` returns a `Predicate` that returns true unless any of its + arguments returns false +* `Everything` is equivalent to `All()` +* `Any` returns a `Predicate` that returns false unless any of its + arguments returns true +* `Nothing` is equivalent to `Any()` +* `Not` negates its argument, returning false if its argument returns + true +* `ByName`, `ByKind`, `ByLabel`, `ByAnnotation`, and `ByGVK` filter + resources by their respective attributes. +* `CRDs` and its complement `NoCRDs` are handy filters for + `CustomResourceDefinitions` +* `In` can be used to find the "intersection" of two manifests + +```go +clusterRBAC := Any(ByKind("ClusterRole"), ByKind("ClusterRoleBinding")) +namespaceRBAC := Any(ByKind("Role"), ByKind("RoleBinding")) +rbac := Any(clusterRBAC, namespaceRBAC) + +theRBAC := manifest.Filter(rbac) +theRest := manifest.Filter(Not(rbac)) + +// Find all resources named "controller" w/label 'foo=bar' that aren't CRD's +m := manifest.Filter(ByLabel("foo", "bar"), ByName("controller"), NoCRDs) +``` + +The `Predicate` receives a deep copy of each resource, so no +modifications made to any resource will be reflected in the returned +`Manifest`, which is immutable. The only way to alter resources in a +`Manifest` is with its `Transform` method. + + +### Transform + +[Transform] will apply some function to every resource in your +manifest, and return a new Manifest with the results. It's common for +a [Transformer] function to include a guard that simply returns if the +unstructured resource isn't of interest. + +There are a few useful transformers provided, including +`InjectNamespace` and `InjectOwner`. An example should help to +clarify: + +```go +func updateDeployment(resource *unstructured.Unstructured) error { + if resource.GetKind() != "Deployment" { + return nil + } + // Either manipulate the Unstructured resource directly or... + // convert it to a structured type... + var deployment = &appsv1.Deployment{} + if err := scheme.Scheme.Convert(resource, deployment, nil); err != nil { + return err + } + + // Now update the deployment! + + // If you converted it, convert it back, otherwise return nil + return scheme.Scheme.Convert(deployment, resource, nil) +} + +m, err := manifest.Transform(updateDeployment, InjectOwner(parent), InjectNamespace("foo")) +``` + + +## Applying Manifests + +Persisting manifests is accomplished via the [Apply] and [Delete] +functions of the [Manifestival] interface, and though [DryRun] doesn't +change anything, it does query the API Server. Therefore all of these +functions require a [Client]. + +### Client + +Manifests require a [Client] implementation to interact with a k8s API +server. There are currently two alternatives: + +- +- + +To apply your manifest, you'll need to provide a client when you +create it with the `UseClient` functional option, like so: + +```go +manifest, err := NewManifest("/path/to/file.yaml", UseClient(client)) +if err != nil { + panic("Failed to load manifest") +} +``` + +It's the `Client` that enables you to persist the resources in your +manifest using `Apply`, remove them using `Delete`, compute +differences using `DryRun`, and occasionally it's even helpful to +invoke the manifest's `Client` directly... + +```go +manifest.Apply() +manifest.Filter(NoCRDs).Delete() + +u := manifest.Resources()[0] +u.SetName("foo") +manifest.Client.Create(&u) +``` + +#### fake.Client + +The [fake] package includes a fake `Client` with stubs you can easily +override in your unit tests. For example, + +```go +func verifySomething(t *testing.T, expected *unstructured.Unstructured) { + client := fake.Client{ + fake.Stubs{ + Create: func(u *unstructured.Unstructured) error { + if !reflect.DeepEqual(u, expected) { + t.Error("You did it wrong!") + } + return nil + }, + }, + } + manifest, _ := NewManifest("testdata/some.yaml", UseClient(client)) + callSomethingThatUltimatelyAppliesThis(manifest) +} +``` + +There is also a convenient `New` function that returns a +fully-functioning fake Client by overriding the stubs to persist the +resources in a map. Here's an example using it to test the `DryRun` +function: + +```go +client := fake.New() +current, _ := NewManifest("testdata/current.yaml", UseClient(client)) +current.Apply() +modified, _ := NewManifest("testdata/modified.yaml", UseClient(client)) +diffs, err := modified.DryRun() +``` + +### Logging + +By default, Manifestival logs nothing, but it will happily log its +actions if you pass it a [logr.Logger] via its `UseLogger` functional +option, like so: + +```go +m, _ := NewManifest(path, UseLogger(log.WithName("manifestival")), UseClient(c)) +``` + +### Apply + +[Apply] will persist every resource in the manifest to the cluster. It +will invoke either `Create` or `Update` depending on whether the +resource already exists. And if it does exist, the same 3-way +[strategic merge patch] used by `kubectl apply` will be applied. And +the same annotation used by `kubectl` to record the resource's +previous configuration will be updated, too. + +The following functional options are supported, all of which map to +either the k8s `metav1.CreateOptions` and `metav1.UpdateOptions` +fields or `kubectl apply` flags: + +* `Overwrite` [true] resolve any conflicts in favor of the manifest +* `FieldManager` the name of the actor applying changes +* `DryRunAll` if present, changes won't persist + +### Delete + +[Delete] attempts to delete all the manifest's resources in reverse +order. Depending on the resources' owner references, race conditions +with the k8s garbage collector may occur, and by default `NotFound` +errors are silently ignored. + +The following functional options are supported, all except +`IgnoreNotFound` mirror the k8s `metav1.DeleteOptions`: + +* `IgnoreNotFound` [true] silently ignore any `NotFound` errors +* `GracePeriodSeconds` the number of seconds before the object should be deleted +* `Preconditions` must be fulfilled before a deletion is carried out +* `PropagationPolicy` whether and how garbage collection will be performed + +### DryRun + +[DryRun] returns a list of JSON merge patches that show the effects of +applying the manifest without modifying the live system. Each item in +the returned list is valid content for the `kubectl patch` command. + + +[Resources]: https://godoc.org/github.com/manifestival/manifestival#Manifest.Resources +[Source]: https://godoc.org/github.com/manifestival/manifestival#Source +[Manifestival]: https://godoc.org/github.com/manifestival/manifestival#Manifestival +[Append]: https://godoc.org/github.com/manifestival/manifestival#Manifest.Append +[Filter]: https://godoc.org/github.com/manifestival/manifestival#Manifest.Filter +[Transform]: https://godoc.org/github.com/manifestival/manifestival#Manifest.Transform +[Apply]: https://godoc.org/github.com/manifestival/manifestival#Manifest.Apply +[Delete]: https://godoc.org/github.com/manifestival/manifestival#Manifest.Delete +[DryRun]: https://godoc.org/github.com/manifestival/manifestival#Manifest.DryRun +[Predicate]: https://godoc.org/github.com/manifestival/manifestival#Predicate +[Client]: https://godoc.org/github.com/manifestival/manifestival#Client +[Transformer]: https://godoc.org/github.com/manifestival/manifestival#Transformer +[logr.Logger]: https://github.com/go-logr/logr +[fake]: https://godoc.org/github.com/manifestival/manifestival/fake +[strategic merge patch]: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/#merge-patch-calculation diff --git a/vendor/github.com/manifestival/manifestival/client.go b/vendor/github.com/manifestival/manifestival/client.go new file mode 100644 index 0000000000..a8d108cede --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/client.go @@ -0,0 +1,115 @@ +package manifestival + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +const ( + defaultManager = FieldManager("manifestival") +) + +// Client includes the operations required by the Manifestival interface +type Client interface { + Create(obj *unstructured.Unstructured, options ...ApplyOption) error + Update(obj *unstructured.Unstructured, options ...ApplyOption) error + Delete(obj *unstructured.Unstructured, options ...DeleteOption) error + Get(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) +} + +func ApplyWith(options []ApplyOption) *ApplyOptions { + result := &ApplyOptions{ + ForCreate: &metav1.CreateOptions{}, + ForUpdate: &metav1.UpdateOptions{}, + Overwrite: true, + } + defaultManager.ApplyWith(result) + for _, f := range options { + f.ApplyWith(result) + } + return result +} + +func DeleteWith(options []DeleteOption) *DeleteOptions { + result := &DeleteOptions{ + ForDelete: &metav1.DeleteOptions{}, + IgnoreNotFound: true, + } + for _, f := range options { + f.DeleteWith(result) + } + return result +} + +// Functional options pattern +type ApplyOption interface { + ApplyWith(*ApplyOptions) +} +type DeleteOption interface { + DeleteWith(*DeleteOptions) +} + +type ApplyOptions struct { + ForCreate *metav1.CreateOptions + ForUpdate *metav1.UpdateOptions + Overwrite bool +} +type DeleteOptions struct { + ForDelete *metav1.DeleteOptions + IgnoreNotFound bool // default to true in DeleteWith() +} + +// Indicates that changes should not be persisted +var DryRunAll = dryRunAll{} + +// FieldManager is the name of the actor applying changes +type FieldManager string + +// The duration in seconds before the object should be deleted +type GracePeriodSeconds int64 + +// Must be fulfilled before a deletion is carried out +type Preconditions metav1.Preconditions + +// Whether and how garbage collection will be performed. +type PropagationPolicy metav1.DeletionPropagation + +// Whether to error when deleting a non-existent resource [true] +type IgnoreNotFound bool + +// Resolve conflicts by using values from the manifest values +type Overwrite bool + +type dryRunAll struct{} // for both apply and delete + +func (dryRunAll) ApplyWith(opts *ApplyOptions) { + opts.ForCreate.DryRun = []string{metav1.DryRunAll} + opts.ForUpdate.DryRun = []string{metav1.DryRunAll} +} +func (i Overwrite) ApplyWith(opts *ApplyOptions) { + opts.Overwrite = bool(i) +} +func (f FieldManager) ApplyWith(opts *ApplyOptions) { + fm := string(f) + opts.ForCreate.FieldManager = fm + opts.ForUpdate.FieldManager = fm +} + +func (dryRunAll) DeleteWith(opts *DeleteOptions) { + opts.ForDelete.DryRun = []string{metav1.DryRunAll} +} +func (g GracePeriodSeconds) DeleteWith(opts *DeleteOptions) { + s := int64(g) + opts.ForDelete.GracePeriodSeconds = &s +} +func (p Preconditions) DeleteWith(opts *DeleteOptions) { + preconds := metav1.Preconditions(p) + opts.ForDelete.Preconditions = &preconds +} +func (p PropagationPolicy) DeleteWith(opts *DeleteOptions) { + policy := metav1.DeletionPropagation(p) + opts.ForDelete.PropagationPolicy = &policy +} +func (i IgnoreNotFound) DeleteWith(opts *DeleteOptions) { + opts.IgnoreNotFound = bool(i) +} diff --git a/vendor/github.com/manifestival/manifestival/dry.go b/vendor/github.com/manifestival/manifestival/dry.go new file mode 100644 index 0000000000..edeb4a6d61 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/dry.go @@ -0,0 +1,99 @@ +package manifestival + +import ( + "encoding/json" + + jsonpatch "github.com/evanphx/json-patch/v5" + "github.com/manifestival/manifestival/internal/patch" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/client-go/kubernetes/scheme" +) + +type MergePatch map[string]interface{} + +// DryRun returns a list of merge patches, either strategic or +// RFC-7386 for unregistered types, that show the effects of applying +// the manifest. +func (m Manifest) DryRun() ([]MergePatch, error) { + diffs, err := m.diff() + if err != nil { + return nil, err + } + result := make([]MergePatch, len(diffs)) + for i, bytes := range diffs { + if err := json.Unmarshal(bytes, &result[i]); err != nil { + return nil, err + } + } + return result, nil +} + +// diff loads the resources in the manifest and computes their difference +func (m Manifest) diff() ([][]byte, error) { + result := make([][]byte, 0, len(m.resources)) + for _, spec := range m.resources { + current, err := m.Client.Get(&spec) + if err != nil { + if errors.IsNotFound(err) { + // this resource will be created when applied + jmp, _ := spec.MarshalJSON() + result = append(result, jmp) + continue + } + return nil, err + } + // ignore manifestival metadata by forcing it to match + if anns := current.GetAnnotations(); anns != nil { + if v, ok := anns["manifestival"]; ok { + annotate(&spec, "manifestival", v) + } + } + // create diff + diff, err := patch.New(current, &spec) + if err != nil { + return nil, err + } + if diff == nil { + // ignore things that won't change + continue + } + // apply diff + modified := current.DeepCopy() + if err := diff.Merge(modified); err != nil { + return nil, err + } + // Remove these fields so they'll be included in the patch + current.SetAPIVersion("") + current.SetKind("") + current.SetName("") + jmp, err := mergePatch(current, modified) + if err != nil { + return nil, err + } + result = append(result, jmp) + } + return result, nil +} + +// mergePatch returns a 2-way merge patch +func mergePatch(orig, mod *unstructured.Unstructured) (_ []byte, err error) { + var original, modified []byte + if original, err = orig.MarshalJSON(); err != nil { + return + } + if modified, err = mod.MarshalJSON(); err != nil { + return + } + obj, err := scheme.Scheme.New(mod.GroupVersionKind()) + switch { + case runtime.IsNotRegisteredError(err): + return jsonpatch.CreateMergePatch(original, modified) + case err != nil: + return nil, err + default: + return strategicpatch.CreateTwoWayMergePatch(original, modified, obj) + } +} diff --git a/vendor/github.com/manifestival/manifestival/fake/client.go b/vendor/github.com/manifestival/manifestival/fake/client.go new file mode 100644 index 0000000000..60e9c31bea --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/fake/client.go @@ -0,0 +1,102 @@ +package fake + +import ( + "fmt" + + mf "github.com/manifestival/manifestival" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/kubernetes/scheme" +) + +var _ mf.Client = &Client{} + +// A convenient way to stub out a Client for test fixtures. Default +// behavior does nothing and returns a nil error. +type Client struct { + Stubs +} + +// Override any of the Client functions +type Stubs struct { + Create mutator + Update mutator + Delete mutator + Get accessor +} + +type mutator func(obj *unstructured.Unstructured) error +type accessor func(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) + +// New returns a fully-functioning Client, "persisting" resources in a +// map, optionally initialized with some API objects +func New(objs ...runtime.Object) Client { + store := map[string]*unstructured.Unstructured{} + key := func(u *unstructured.Unstructured) string { + return fmt.Sprintf("%s, %s/%s", u.GroupVersionKind(), u.GetNamespace(), u.GetName()) + } + for _, obj := range objs { + u := &unstructured.Unstructured{} + if err := scheme.Scheme.Convert(obj, u, nil); err != nil { + panic(err) + } + store[key(u)] = u + } + apply := func(u *unstructured.Unstructured) error { + store[key(u)] = u + return nil + } + return Client{ + Stubs{ + Create: apply, + Update: apply, + Delete: func(u *unstructured.Unstructured) error { + delete(store, key(u)) + return nil + }, + Get: func(u *unstructured.Unstructured) (*unstructured.Unstructured, error) { + v, found := store[key(u)] + if !found { + gvk := u.GroupVersionKind() + gr := schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind} + return nil, errors.NewNotFound(gr, u.GetName()) + } + return v, nil + }, + }, + } +} + +// Manifestival.Client.Create +func (c Client) Create(obj *unstructured.Unstructured, options ...mf.ApplyOption) error { + if c.Stubs.Create != nil { + return c.Stubs.Create(obj) + } + return nil +} + +// Manifestival.Client.Update +func (c Client) Update(obj *unstructured.Unstructured, options ...mf.ApplyOption) error { + if c.Stubs.Update != nil { + return c.Stubs.Update(obj) + } + return nil +} + +// Manifestival.Client.Delete +func (c Client) Delete(obj *unstructured.Unstructured, options ...mf.DeleteOption) error { + if c.Stubs.Delete != nil { + return c.Stubs.Delete(obj) + } + return nil +} + +// Manifestival.Client.Get +func (c Client) Get(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + if c.Stubs.Get != nil { + return c.Stubs.Get(obj) + } + return nil, nil +} diff --git a/vendor/github.com/manifestival/manifestival/filter.go b/vendor/github.com/manifestival/manifestival/filter.go new file mode 100644 index 0000000000..f8ac76d8f7 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/filter.go @@ -0,0 +1,145 @@ +package manifestival + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" +) + +// Predicate returns true if u should be included in result +type Predicate func(u *unstructured.Unstructured) bool + +var ( + Everything = All() + Nothing = Any() +) + +// Filter returns a Manifest containing only those resources for which +// *no* Predicate returns false. Any changes callers make to the +// resources passed to their Predicate[s] will only be reflected in +// the returned Manifest. +func (m Manifest) Filter(preds ...Predicate) Manifest { + result := m + result.resources = []unstructured.Unstructured{} + pred := All(preds...) + for _, spec := range m.resources { + if !pred(spec.DeepCopy()) { + continue + } + result.resources = append(result.resources, spec) + } + return result +} + +// All returns a predicate that returns true unless any of its passed +// predicates return false. +func All(preds ...Predicate) Predicate { + return func(u *unstructured.Unstructured) bool { + for _, p := range preds { + if !p(u) { + return false + } + } + return true + } +} + +// Any returns a predicate that returns false unless any of its passed +// predicates return true. +func Any(preds ...Predicate) Predicate { + return func(u *unstructured.Unstructured) bool { + for _, p := range preds { + if p(u) { + return true + } + } + return false + } +} + +// Not returns the complement of a given predicate. +func Not(pred Predicate) Predicate { + return func(u *unstructured.Unstructured) bool { + return !pred(u) + } +} + +// CRDs returns only CustomResourceDefinitions +var CRDs = ByKind("CustomResourceDefinition") + +// NoCRDs returns no CustomResourceDefinitions +var NoCRDs = Not(CRDs) + +// ByName returns resources with a specifc name +func ByName(name string) Predicate { + return func(u *unstructured.Unstructured) bool { + return u.GetName() == name + } +} + +// ByKind returns resources matching a particular kind +func ByKind(kind string) Predicate { + return func(u *unstructured.Unstructured) bool { + return u.GetKind() == kind + } +} + +// ByAnnotation returns resources that contain a particular annotation +// and value. A value of "" denotes *ANY* value +func ByAnnotation(annotation, value string) Predicate { + return func(u *unstructured.Unstructured) bool { + v, ok := u.GetAnnotations()[annotation] + if value == "" { + return ok + } + return v == value + } +} + +// ByLabel returns resources that contain a particular label and +// value. A value of "" denotes *ANY* value +func ByLabel(label, value string) Predicate { + return func(u *unstructured.Unstructured) bool { + v, ok := u.GetLabels()[label] + if value == "" { + return ok + } + return v == value + } +} + +// ByLabels returns true when the resource contains any of the labels. +func ByLabels(labels map[string]string) Predicate { + return func(u *unstructured.Unstructured) bool { + for key, value := range labels { + if v := u.GetLabels()[key]; v == value { + return true + } + } + return false + } +} + +// ByGVK returns resources of a particular GroupVersionKind +func ByGVK(gvk schema.GroupVersionKind) Predicate { + return func(u *unstructured.Unstructured) bool { + return u.GroupVersionKind() == gvk + } +} + +// In(m) returns a Predicate that tests for membership in m, using +// "gk|ns/name" as a unique identifier +func In(manifest Manifest) Predicate { + key := func(u *unstructured.Unstructured) string { + return fmt.Sprintf("%s|%s/%s", u.GroupVersionKind().GroupKind(), u.GetNamespace(), u.GetName()) + } + index := sets.NewString() + for _, u := range manifest.resources { + index.Insert(key(&u)) + } + return func(u *unstructured.Unstructured) bool { + return index.Has(key(u)) + } +} diff --git a/vendor/github.com/manifestival/manifestival/internal/overlay/overlay.go b/vendor/github.com/manifestival/manifestival/internal/overlay/overlay.go new file mode 100644 index 0000000000..78b976bb5b --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/internal/overlay/overlay.go @@ -0,0 +1,36 @@ +package overlay + +// Overlays the values of src onto tgt +func Copy(src, tgt map[string]interface{}) { + for k, v := range src { + switch y := tgt[k].(type) { + case map[string]interface{}: + if x, ok := v.(map[string]interface{}); ok { + Copy(x, y) + } else { + tgt[k] = v + } + case []interface{}: + if x, ok := v.([]interface{}); ok { + if len(y) < len(x) { + tgt[k] = v + continue + } + for i := range x { + xi, xok := x[i].(map[string]interface{}) + yi, yok := y[i].(map[string]interface{}) + if xok && yok { + Copy(xi, yi) + } else { + y[i] = x[i] + } + } + tgt[k] = y[:len(x)] + } else { + tgt[k] = v + } + default: + tgt[k] = v + } + } +} diff --git a/vendor/github.com/manifestival/manifestival/internal/patch/patch.go b/vendor/github.com/manifestival/manifestival/internal/patch/patch.go new file mode 100644 index 0000000000..3c76e7b3d5 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/internal/patch/patch.go @@ -0,0 +1,90 @@ +package patch + +import ( + "bytes" + + jsonpatch "github.com/evanphx/json-patch/v5" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/jsonmergepatch" + "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/client-go/kubernetes/scheme" +) + +type Patch struct { + patch []byte + schema strategicpatch.LookupPatchMeta +} + +// Attempts to create a 3-way strategic JSON merge patch. Falls back +// to RFC-7386 if object's type isn't registered +func New(curr, mod *unstructured.Unstructured) (_ *Patch, err error) { + var original, modified, current []byte + original = getLastAppliedConfig(curr) + if modified, err = mod.MarshalJSON(); err != nil { + return + } + if current, err = curr.MarshalJSON(); err != nil { + return + } + obj, err := scheme.Scheme.New(mod.GroupVersionKind()) + switch { + case runtime.IsNotRegisteredError(err): + return createJsonMergePatch(original, modified, current) + case err != nil: + return + default: + return createStrategicMergePatch(original, modified, current, obj) + } +} + +// Apply the patch to the resource +func (p *Patch) Merge(obj *unstructured.Unstructured) (err error) { + var current, result []byte + if current, err = obj.MarshalJSON(); err != nil { + return + } + if p.schema == nil { + result, err = jsonpatch.MergePatch(current, p.patch) + } else { + result, err = strategicpatch.StrategicMergePatchUsingLookupPatchMeta(current, p.patch, p.schema) + } + if err != nil { + return + } + return obj.UnmarshalJSON(result) +} + +func (p *Patch) String() string { + return string(p.patch) +} + +func createJsonMergePatch(original, modified, current []byte) (*Patch, error) { + patch, err := jsonmergepatch.CreateThreeWayJSONMergePatch(original, modified, current) + return create(patch, nil), err +} + +func createStrategicMergePatch(original, modified, current []byte, obj runtime.Object) (*Patch, error) { + schema, err := strategicpatch.NewPatchMetaFromStruct(obj) + if err != nil { + return nil, err + } + patch, err := strategicpatch.CreateThreeWayMergePatch(original, modified, current, schema, true) + return create(patch, schema), err +} + +func create(patch []byte, schema strategicpatch.LookupPatchMeta) *Patch { + if bytes.Equal(patch, []byte("{}")) { + return nil + } + return &Patch{patch, schema} +} + +func getLastAppliedConfig(obj *unstructured.Unstructured) []byte { + annotations := obj.GetAnnotations() + if annotations == nil { + return nil + } + return []byte(annotations[v1.LastAppliedConfigAnnotation]) +} diff --git a/vendor/github.com/manifestival/manifestival/internal/sources/path.go b/vendor/github.com/manifestival/manifestival/internal/sources/path.go new file mode 100644 index 0000000000..37dbb6f95b --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/internal/sources/path.go @@ -0,0 +1,120 @@ +package sources + +import ( + "io/ioutil" + "net/http" + "net/url" + "os" + "path" + "strings" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +// Parse parses YAML files into Unstructured objects. +// +// It supports 5 cases today: +// 1. pathname = path to a file --> parses that file. +// 2. pathname = path to a directory, recursive = false --> parses all files in +// that directory. +// 3. pathname = path to a directory, recursive = true --> parses all files in +// that directory and it's descendants +// 4. pathname = url --> fetches the contents of that URL and parses them as YAML. +// 5. pathname = combination of all previous cases, the string can contain +// multiple records (file, directory or url) separated by comma +func Parse(pathname string, recursive bool) ([]unstructured.Unstructured, error) { + + pathnames := strings.Split(pathname, ",") + aggregated := []unstructured.Unstructured{} + for _, pth := range pathnames { + els, err := read(pth, recursive) + if err != nil { + return nil, err + } + + aggregated = append(aggregated, els...) + } + return aggregated, nil +} + +// read cotains a logic to distinguish the type of record in pathname +// (file, directory or url) and calls the appropriate function +func read(pathname string, recursive bool) ([]unstructured.Unstructured, error) { + if isURL(pathname) { + return readURL(pathname) + } + + info, err := os.Stat(pathname) + if err != nil { + return nil, err + } + + if info.IsDir() { + return readDir(pathname, recursive) + } + return readFile(pathname) +} + +// readFile parses a single file. +func readFile(pathname string) ([]unstructured.Unstructured, error) { + file, err := os.Open(pathname) + if err != nil { + return nil, err + } + defer file.Close() + + return Decode(file) +} + +// readDir parses all files in a single directory and it's descendant directories +// if the recursive flag is set to true. +func readDir(pathname string, recursive bool) ([]unstructured.Unstructured, error) { + list, err := ioutil.ReadDir(pathname) + if err != nil { + return nil, err + } + + aggregated := []unstructured.Unstructured{} + for _, f := range list { + name := path.Join(pathname, f.Name()) + pathDirOrFile, err := os.Stat(name) + var els []unstructured.Unstructured + + if os.IsNotExist(err) || os.IsPermission(err) { + return aggregated, err + } + + switch { + case pathDirOrFile.IsDir() && recursive: + els, err = readDir(name, recursive) + case !pathDirOrFile.IsDir(): + els, err = readFile(name) + } + + if err != nil { + return nil, err + } + aggregated = append(aggregated, els...) + } + return aggregated, nil +} + +// readURL fetches a URL and parses its contents as YAML. +func readURL(url string) ([]unstructured.Unstructured, error) { + resp, err := http.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + return Decode(resp.Body) +} + +// isURL checks whether or not the given path parses as a URL. +func isURL(pathname string) bool { + if _, err := os.Lstat(pathname); err == nil { + return false + } + url, err := url.ParseRequestURI(pathname) + return err == nil && url.Scheme != "" +} diff --git a/vendor/github.com/manifestival/manifestival/internal/sources/yaml.go b/vendor/github.com/manifestival/manifestival/internal/sources/yaml.go new file mode 100644 index 0000000000..c4f2b98c56 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/internal/sources/yaml.go @@ -0,0 +1,30 @@ +package sources + +import ( + "io" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/util/yaml" +) + +// decode consumes the given reader and parses its contents as YAML. +func Decode(reader io.Reader) ([]unstructured.Unstructured, error) { + decoder := yaml.NewYAMLToJSONDecoder(reader) + objs := []unstructured.Unstructured{} + var err error + for { + out := unstructured.Unstructured{} + err = decoder.Decode(&out) + if err != nil { + break + } + if len(out.Object) == 0 { + continue + } + objs = append(objs, out) + } + if err != io.EOF { + return nil, err + } + return objs, nil +} diff --git a/vendor/github.com/manifestival/manifestival/manifestival.go b/vendor/github.com/manifestival/manifestival/manifestival.go new file mode 100644 index 0000000000..b8d07b8bc2 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/manifestival.go @@ -0,0 +1,244 @@ +package manifestival + +import ( + "fmt" + + "github.com/go-logr/logr" + "github.com/manifestival/manifestival/internal/overlay" + "github.com/manifestival/manifestival/internal/patch" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +// Manifestival defines the operations allowed on a set of Kubernetes +// resources (typically, a set of YAML files, aka a manifest) +type Manifestival interface { + // Either updates or creates all resources in the manifest + Apply(opts ...ApplyOption) error + // Deletes all resources in the manifest + Delete(opts ...DeleteOption) error + // Transforms the resources within a Manifest + Transform(fns ...Transformer) (Manifest, error) + // Filters resources in a Manifest; Predicates are AND'd + Filter(fns ...Predicate) Manifest + // Append the resources from other Manifests to create a new one + Append(mfs ...Manifest) Manifest + // Show how applying the manifest would change the cluster + DryRun() ([]MergePatch, error) +} + +// Manifest tracks a set of concrete resources which should be managed as a +// group using a Kubernetes client +type Manifest struct { + resources []unstructured.Unstructured + Client Client + log logr.Logger +} + +var _ Manifestival = &Manifest{} + +// Option follows the "functional object" idiom +type Option func(*Manifest) + +// UseLogger will cause manifestival to log its actions +func UseLogger(log logr.Logger) Option { + return func(m *Manifest) { + m.log = log + } +} + +// UseClient enables interaction with the k8s API server +func UseClient(client Client) Option { + return func(m *Manifest) { + m.Client = client + } +} + +// NewManifest creates a Manifest from a comma-separated set of YAML +// files, directories, or URLs. It's equivalent to +// `ManifestFrom(Path(pathname))` +func NewManifest(pathname string, opts ...Option) (Manifest, error) { + return ManifestFrom(Path(pathname), opts...) +} + +// ManifestFrom creates a Manifest from any Source implementation +func ManifestFrom(src Source, opts ...Option) (m Manifest, err error) { + m = Manifest{log: logr.Discard()} + for _, opt := range opts { + opt(&m) + } + m.log.Info("Parsing manifest") + m.resources, err = src.Parse() + return +} + +// Append creates a new Manifest by appending the resources from other +// Manifests onto this one. No equality checking is done, so for any +// resources sharing the same GVK+name, the last one will "win". +func (m Manifest) Append(mfs ...Manifest) Manifest { + result := m + result.resources = m.Resources() // deep copies + for _, mf := range mfs { + result.resources = append(result.resources, mf.Resources()...) + } + return result +} + +// Resources returns a deep copy of the Manifest resources +func (m Manifest) Resources() []unstructured.Unstructured { + result := make([]unstructured.Unstructured, len(m.resources)) + for i, v := range m.resources { + result[i] = *v.DeepCopy() + } + return result +} + +// Apply updates or creates all resources in the manifest. +func (m Manifest) Apply(opts ...ApplyOption) error { + for _, spec := range m.resources { + if err := m.apply(&spec, opts...); err != nil { + return err + } + } + return nil +} + +// Delete removes all resources in the Manifest +func (m Manifest) Delete(opts ...DeleteOption) error { + a := make([]unstructured.Unstructured, len(m.resources)) + copy(a, m.resources) // shallow copy is fine + // we want to delete in reverse order + for left, right := 0, len(a)-1; left < right; left, right = left+1, right-1 { + a[left], a[right] = a[right], a[left] + } + for _, spec := range a { + if err := m.delete(&spec, opts...); err != nil { + return err + } + } + return nil +} + +// apply updates or creates a particular resource +func (m Manifest) apply(spec *unstructured.Unstructured, opts ...ApplyOption) error { + current, err := m.get(spec) + if err != nil { + return err + } + if current == nil { + m.logResource("Creating", spec) + current = spec.DeepCopy() + annotate(current, "manifestival", resourceCreated) + annotate(current, v1.LastAppliedConfigAnnotation, lastApplied(current)) + return m.Client.Create(current, opts...) + } else { + diff, err := patch.New(current, spec) + if err != nil { + return err + } + if diff == nil { + return nil + } + + isResourceCreated := current.GetAnnotations()["manifestival"] == resourceCreated + m.log.Info("Merging", "diff", diff) + if err := diff.Merge(current); err != nil { + return err + } + + // Make sure the manifestival annotation is carried over. + if isResourceCreated { + annotate(current, "manifestival", resourceCreated) + } + + return m.update(current, spec, opts...) + } +} + +// update a single resource +func (m Manifest) update(live, spec *unstructured.Unstructured, opts ...ApplyOption) error { + m.logResource("Updating", live) + annotate(live, v1.LastAppliedConfigAnnotation, lastApplied(spec)) + err := m.Client.Update(live, opts...) + if errors.IsInvalid(err) && ApplyWith(opts).Overwrite { + m.log.Error(err, "Failed to update merged resource, trying overwrite") + overlay.Copy(spec.Object, live.Object) + return m.Client.Update(live, opts...) + } + return err +} + +// delete removes the specified object +func (m Manifest) delete(spec *unstructured.Unstructured, opts ...DeleteOption) error { + current, err := m.get(spec) + if err != nil { + return err + } + if current == nil { + return nil + } + if !okToDelete(current) { + return nil + } + m.logResource("Deleting", spec) + return m.Client.Delete(spec, opts...) +} + +// get collects a full resource body (or `nil`) from a partial +// resource supplied in `spec` +func (m Manifest) get(spec *unstructured.Unstructured) (*unstructured.Unstructured, error) { + if spec.GetName() == "" && spec.GetGenerateName() != "" { + // expected to be created; never fetched + return nil, nil + } + result, err := m.Client.Get(spec) + if err != nil { + result = nil + if errors.IsNotFound(err) { + err = nil + } + } + return result, err +} + +// logResource logs a consistent formatted message +func (m Manifest) logResource(msg string, spec *unstructured.Unstructured) { + name := fmt.Sprintf("%s/%s", spec.GetNamespace(), spec.GetName()) + m.log.Info(msg, "name", name, "type", spec.GroupVersionKind()) +} + +// annotate sets an annotation in the resource +func annotate(spec *unstructured.Unstructured, key string, value string) { + annotations := spec.GetAnnotations() + if annotations == nil { + annotations = make(map[string]string) + } + annotations[key] = value + spec.SetAnnotations(annotations) +} + +// lastApplied returns a JSON string denoting the resource's state +func lastApplied(obj *unstructured.Unstructured) string { + ann := obj.GetAnnotations() + if len(ann) > 0 { + delete(ann, v1.LastAppliedConfigAnnotation) + obj.SetAnnotations(ann) + } + bytes, _ := obj.MarshalJSON() + return string(bytes) +} + +// okToDelete checks for an annotation indicating that the resources +// was originally created by this library +func okToDelete(spec *unstructured.Unstructured) bool { + switch spec.GetKind() { + case "Namespace": + return spec.GetAnnotations()["manifestival"] == resourceCreated + } + return true +} + +const ( + resourceCreated = "new" +) diff --git a/vendor/github.com/manifestival/manifestival/source.go b/vendor/github.com/manifestival/manifestival/source.go new file mode 100644 index 0000000000..bd83db1e74 --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/source.go @@ -0,0 +1,53 @@ +package manifestival + +import ( + "io" + + "github.com/manifestival/manifestival/internal/sources" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +// Source is the interface through which all Manifests are created. +type Source interface { + Parse() ([]unstructured.Unstructured, error) +} + +// Path is a Source represented as a comma-delimited list of files, +// directories, and URL's +type Path string + +// Recursive is identical to Path, but dirs are searched recursively +type Recursive string + +// Slice is a Source comprised of existing objects +type Slice []unstructured.Unstructured + +// Reader takes an io.Reader from which YAML content is expected +func Reader(r io.Reader) Source { + return reader{r} +} + +var _ Source = Path("") +var _ Source = Recursive("") +var _ Source = Slice([]unstructured.Unstructured{}) +var _ Source = reader{} // see Reader(io.Reader) + +func (p Path) Parse() ([]unstructured.Unstructured, error) { + return sources.Parse(string(p), false) +} + +func (r Recursive) Parse() ([]unstructured.Unstructured, error) { + return sources.Parse(string(r), true) +} + +func (s Slice) Parse() ([]unstructured.Unstructured, error) { + return []unstructured.Unstructured(s), nil +} + +func (r reader) Parse() ([]unstructured.Unstructured, error) { + return sources.Decode(r.real) +} + +type reader struct { + real io.Reader +} diff --git a/vendor/github.com/manifestival/manifestival/transform.go b/vendor/github.com/manifestival/manifestival/transform.go new file mode 100644 index 0000000000..b1f9102ccc --- /dev/null +++ b/vendor/github.com/manifestival/manifestival/transform.go @@ -0,0 +1,135 @@ +package manifestival + +import ( + "os" + "strings" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// Transformer transforms a resource from the manifest in place. +type Transformer func(u *unstructured.Unstructured) error + +// Owner is a partial Kubernetes metadata schema. +type Owner interface { + v1.Object + schema.ObjectKind +} + +// Transform applies an ordered set of Transformer functions to the +// `Resources` in this Manifest. If an error occurs, no resources are +// transformed. +func (m Manifest) Transform(fns ...Transformer) (Manifest, error) { + result := m + result.resources = m.Resources() // deep copies + for i := range result.resources { + spec := &result.resources[i] + for _, transform := range fns { + if transform != nil { + err := transform(spec) + if err != nil { + return Manifest{}, err + } + } + } + } + return result, nil +} + +// InjectNamespace creates a Transformer which adds a namespace to existing +// resources if appropriate. We assume all resources in the manifest live in +// the same namespace. +func InjectNamespace(ns string) Transformer { + namespace := resolveEnv(ns) + updateService := func(obj map[string]interface{}, fields ...string) error { + srv, found, err := unstructured.NestedFieldNoCopy(obj, fields...) + if err != nil { + return err + } + if found { + m := srv.(map[string]interface{}) + if _, ok := m["namespace"]; ok { + m["namespace"] = namespace + } + } + return nil + } + return func(u *unstructured.Unstructured) error { + if !isClusterScoped(u.GetKind()) { + u.SetNamespace(namespace) + } + switch strings.ToLower(u.GetKind()) { + case "namespace": + u.SetName(namespace) + case "clusterrolebinding", "rolebinding": + subjects, _, _ := unstructured.NestedFieldNoCopy(u.Object, "subjects") + for _, subject := range subjects.([]interface{}) { + m := subject.(map[string]interface{}) + if _, ok := m["namespace"]; ok { + m["namespace"] = namespace + } + } + case "validatingwebhookconfiguration", "mutatingwebhookconfiguration": + hooks, _, _ := unstructured.NestedFieldNoCopy(u.Object, "webhooks") + for _, hook := range hooks.([]interface{}) { + if err := updateService(hook.(map[string]interface{}), "clientConfig", "service"); err != nil { + return err + } + } + case "apiservice": + return updateService(u.Object, "spec", "service") + case "customresourcedefinition": + if u.GroupVersionKind().Version == "v1" { + return updateService(u.Object, "spec", "conversion", "webhook", "clientConfig", "service") + } + return updateService(u.Object, "spec", "conversion", "webhookClientConfig", "service") + } + return nil + } +} + +// InjectOwner creates a Transformer which adds an OwnerReference +// pointing to `owner` +func InjectOwner(owner Owner) Transformer { + return func(u *unstructured.Unstructured) error { + u.SetOwnerReferences([]v1.OwnerReference{*v1.NewControllerRef(owner, owner.GroupVersionKind())}) + return nil + } +} + +func isClusterScoped(kind string) bool { + // TODO: something more clever using !APIResource.Namespaced maybe? + switch strings.ToLower(kind) { + case "componentstatus", + "namespace", + "node", + "persistentvolume", + "mutatingwebhookconfiguration", + "validatingwebhookconfiguration", + "customresourcedefinition", + "apiservice", + "meshpolicy", + "tokenreview", + "selfsubjectaccessreview", + "selfsubjectrulesreview", + "subjectaccessreview", + "certificatesigningrequest", + "podsecuritypolicy", + "clusterrolebinding", + "clusterrole", + "priorityclass", + "storageclass", + "volumeattachment": + return true + } + return false +} + +func resolveEnv(x string) string { + if len(x) > 1 && x[:1] == "$" { + return os.Getenv(x[1:]) + } + return x +} diff --git a/vendor/github.com/moby/patternmatcher/LICENSE b/vendor/github.com/moby/patternmatcher/LICENSE new file mode 100644 index 0000000000..6d8d58fb67 --- /dev/null +++ b/vendor/github.com/moby/patternmatcher/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://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 + + Copyright 2013-2018 Docker, Inc. + + 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 + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/moby/patternmatcher/NOTICE b/vendor/github.com/moby/patternmatcher/NOTICE new file mode 100644 index 0000000000..e5154640fe --- /dev/null +++ b/vendor/github.com/moby/patternmatcher/NOTICE @@ -0,0 +1,16 @@ +Docker +Copyright 2012-2017 Docker, Inc. + +This product includes software developed at Docker, Inc. (https://www.docker.com). + +The following is courtesy of our legal counsel: + + +Use and transfer of Docker may be subject to certain restrictions by the +United States and other governments. +It is your responsibility to ensure that your use and/or transfer does not +violate applicable laws. + +For more information, please see https://www.bis.doc.gov + +See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. diff --git a/vendor/github.com/moby/patternmatcher/patternmatcher.go b/vendor/github.com/moby/patternmatcher/patternmatcher.go new file mode 100644 index 0000000000..37a1a59ac4 --- /dev/null +++ b/vendor/github.com/moby/patternmatcher/patternmatcher.go @@ -0,0 +1,474 @@ +package patternmatcher + +import ( + "errors" + "os" + "path/filepath" + "regexp" + "strings" + "text/scanner" + "unicode/utf8" +) + +// escapeBytes is a bitmap used to check whether a character should be escaped when creating the regex. +var escapeBytes [8]byte + +// shouldEscape reports whether a rune should be escaped as part of the regex. +// +// This only includes characters that require escaping in regex but are also NOT valid filepath pattern characters. +// Additionally, '\' is not excluded because there is specific logic to properly handle this, as it's a path separator +// on Windows. +// +// Adapted from regexp::QuoteMeta in go stdlib. +// See https://cs.opensource.google/go/go/+/refs/tags/go1.17.2:src/regexp/regexp.go;l=703-715;drc=refs%2Ftags%2Fgo1.17.2 +func shouldEscape(b rune) bool { + return b < utf8.RuneSelf && escapeBytes[b%8]&(1<<(b/8)) != 0 +} + +func init() { + for _, b := range []byte(`.+()|{}$`) { + escapeBytes[b%8] |= 1 << (b / 8) + } +} + +// PatternMatcher allows checking paths against a list of patterns +type PatternMatcher struct { + patterns []*Pattern + exclusions bool +} + +// New creates a new matcher object for specific patterns that can +// be used later to match against patterns against paths +func New(patterns []string) (*PatternMatcher, error) { + pm := &PatternMatcher{ + patterns: make([]*Pattern, 0, len(patterns)), + } + for _, p := range patterns { + // Eliminate leading and trailing whitespace. + p = strings.TrimSpace(p) + if p == "" { + continue + } + p = filepath.Clean(p) + newp := &Pattern{} + if p[0] == '!' { + if len(p) == 1 { + return nil, errors.New("illegal exclusion pattern: \"!\"") + } + newp.exclusion = true + p = p[1:] + pm.exclusions = true + } + // Do some syntax checking on the pattern. + // filepath's Match() has some really weird rules that are inconsistent + // so instead of trying to dup their logic, just call Match() for its + // error state and if there is an error in the pattern return it. + // If this becomes an issue we can remove this since its really only + // needed in the error (syntax) case - which isn't really critical. + if _, err := filepath.Match(p, "."); err != nil { + return nil, err + } + newp.cleanedPattern = p + newp.dirs = strings.Split(p, string(os.PathSeparator)) + pm.patterns = append(pm.patterns, newp) + } + return pm, nil +} + +// Matches returns true if "file" matches any of the patterns +// and isn't excluded by any of the subsequent patterns. +// +// The "file" argument should be a slash-delimited path. +// +// Matches is not safe to call concurrently. +// +// Deprecated: This implementation is buggy (it only checks a single parent dir +// against the pattern) and will be removed soon. Use either +// MatchesOrParentMatches or MatchesUsingParentResults instead. +func (pm *PatternMatcher) Matches(file string) (bool, error) { + matched := false + file = filepath.FromSlash(file) + parentPath := filepath.Dir(file) + parentPathDirs := strings.Split(parentPath, string(os.PathSeparator)) + + for _, pattern := range pm.patterns { + // Skip evaluation if this is an inclusion and the filename + // already matched the pattern, or it's an exclusion and it has + // not matched the pattern yet. + if pattern.exclusion != matched { + continue + } + + match, err := pattern.match(file) + if err != nil { + return false, err + } + + if !match && parentPath != "." { + // Check to see if the pattern matches one of our parent dirs. + if len(pattern.dirs) <= len(parentPathDirs) { + match, _ = pattern.match(strings.Join(parentPathDirs[:len(pattern.dirs)], string(os.PathSeparator))) + } + } + + if match { + matched = !pattern.exclusion + } + } + + return matched, nil +} + +// MatchesOrParentMatches returns true if "file" matches any of the patterns +// and isn't excluded by any of the subsequent patterns. +// +// The "file" argument should be a slash-delimited path. +// +// Matches is not safe to call concurrently. +func (pm *PatternMatcher) MatchesOrParentMatches(file string) (bool, error) { + matched := false + file = filepath.FromSlash(file) + parentPath := filepath.Dir(file) + parentPathDirs := strings.Split(parentPath, string(os.PathSeparator)) + + for _, pattern := range pm.patterns { + // Skip evaluation if this is an inclusion and the filename + // already matched the pattern, or it's an exclusion and it has + // not matched the pattern yet. + if pattern.exclusion != matched { + continue + } + + match, err := pattern.match(file) + if err != nil { + return false, err + } + + if !match && parentPath != "." { + // Check to see if the pattern matches one of our parent dirs. + for i := range parentPathDirs { + match, _ = pattern.match(strings.Join(parentPathDirs[:i+1], string(os.PathSeparator))) + if match { + break + } + } + } + + if match { + matched = !pattern.exclusion + } + } + + return matched, nil +} + +// MatchesUsingParentResult returns true if "file" matches any of the patterns +// and isn't excluded by any of the subsequent patterns. The functionality is +// the same as Matches, but as an optimization, the caller keeps track of +// whether the parent directory matched. +// +// The "file" argument should be a slash-delimited path. +// +// MatchesUsingParentResult is not safe to call concurrently. +// +// Deprecated: this function does behave correctly in some cases (see +// https://github.com/docker/buildx/issues/850). +// +// Use MatchesUsingParentResults instead. +func (pm *PatternMatcher) MatchesUsingParentResult(file string, parentMatched bool) (bool, error) { + matched := parentMatched + file = filepath.FromSlash(file) + + for _, pattern := range pm.patterns { + // Skip evaluation if this is an inclusion and the filename + // already matched the pattern, or it's an exclusion and it has + // not matched the pattern yet. + if pattern.exclusion != matched { + continue + } + + match, err := pattern.match(file) + if err != nil { + return false, err + } + + if match { + matched = !pattern.exclusion + } + } + return matched, nil +} + +// MatchInfo tracks information about parent dir matches while traversing a +// filesystem. +type MatchInfo struct { + parentMatched []bool +} + +// MatchesUsingParentResults returns true if "file" matches any of the patterns +// and isn't excluded by any of the subsequent patterns. The functionality is +// the same as Matches, but as an optimization, the caller passes in +// intermediate results from matching the parent directory. +// +// The "file" argument should be a slash-delimited path. +// +// MatchesUsingParentResults is not safe to call concurrently. +func (pm *PatternMatcher) MatchesUsingParentResults(file string, parentMatchInfo MatchInfo) (bool, MatchInfo, error) { + parentMatched := parentMatchInfo.parentMatched + if len(parentMatched) != 0 && len(parentMatched) != len(pm.patterns) { + return false, MatchInfo{}, errors.New("wrong number of values in parentMatched") + } + + file = filepath.FromSlash(file) + matched := false + + matchInfo := MatchInfo{ + parentMatched: make([]bool, len(pm.patterns)), + } + for i, pattern := range pm.patterns { + match := false + // If the parent matched this pattern, we don't need to recheck. + if len(parentMatched) != 0 { + match = parentMatched[i] + } + + if !match { + // Skip evaluation if this is an inclusion and the filename + // already matched the pattern, or it's an exclusion and it has + // not matched the pattern yet. + if pattern.exclusion != matched { + continue + } + + var err error + match, err = pattern.match(file) + if err != nil { + return false, matchInfo, err + } + + // If the zero value of MatchInfo was passed in, we don't have + // any information about the parent dir's match results, and we + // apply the same logic as MatchesOrParentMatches. + if !match && len(parentMatched) == 0 { + if parentPath := filepath.Dir(file); parentPath != "." { + parentPathDirs := strings.Split(parentPath, string(os.PathSeparator)) + // Check to see if the pattern matches one of our parent dirs. + for i := range parentPathDirs { + match, _ = pattern.match(strings.Join(parentPathDirs[:i+1], string(os.PathSeparator))) + if match { + break + } + } + } + } + } + matchInfo.parentMatched[i] = match + + if match { + matched = !pattern.exclusion + } + } + return matched, matchInfo, nil +} + +// Exclusions returns true if any of the patterns define exclusions +func (pm *PatternMatcher) Exclusions() bool { + return pm.exclusions +} + +// Patterns returns array of active patterns +func (pm *PatternMatcher) Patterns() []*Pattern { + return pm.patterns +} + +// Pattern defines a single regexp used to filter file paths. +type Pattern struct { + matchType matchType + cleanedPattern string + dirs []string + regexp *regexp.Regexp + exclusion bool +} + +type matchType int + +const ( + unknownMatch matchType = iota + exactMatch + prefixMatch + suffixMatch + regexpMatch +) + +func (p *Pattern) String() string { + return p.cleanedPattern +} + +// Exclusion returns true if this pattern defines exclusion +func (p *Pattern) Exclusion() bool { + return p.exclusion +} + +func (p *Pattern) match(path string) (bool, error) { + if p.matchType == unknownMatch { + if err := p.compile(string(os.PathSeparator)); err != nil { + return false, filepath.ErrBadPattern + } + } + + switch p.matchType { + case exactMatch: + return path == p.cleanedPattern, nil + case prefixMatch: + // strip trailing ** + return strings.HasPrefix(path, p.cleanedPattern[:len(p.cleanedPattern)-2]), nil + case suffixMatch: + // strip leading ** + suffix := p.cleanedPattern[2:] + if strings.HasSuffix(path, suffix) { + return true, nil + } + // **/foo matches "foo" + return suffix[0] == os.PathSeparator && path == suffix[1:], nil + case regexpMatch: + return p.regexp.MatchString(path), nil + } + + return false, nil +} + +func (p *Pattern) compile(sl string) error { + regStr := "^" + pattern := p.cleanedPattern + // Go through the pattern and convert it to a regexp. + // We use a scanner so we can support utf-8 chars. + var scan scanner.Scanner + scan.Init(strings.NewReader(pattern)) + + escSL := sl + if sl == `\` { + escSL += `\` + } + + p.matchType = exactMatch + for i := 0; scan.Peek() != scanner.EOF; i++ { + ch := scan.Next() + + if ch == '*' { + if scan.Peek() == '*' { + // is some flavor of "**" + scan.Next() + + // Treat **/ as ** so eat the "/" + if string(scan.Peek()) == sl { + scan.Next() + } + + if scan.Peek() == scanner.EOF { + // is "**EOF" - to align with .gitignore just accept all + if p.matchType == exactMatch { + p.matchType = prefixMatch + } else { + regStr += ".*" + p.matchType = regexpMatch + } + } else { + // is "**" + // Note that this allows for any # of /'s (even 0) because + // the .* will eat everything, even /'s + regStr += "(.*" + escSL + ")?" + p.matchType = regexpMatch + } + + if i == 0 { + p.matchType = suffixMatch + } + } else { + // is "*" so map it to anything but "/" + regStr += "[^" + escSL + "]*" + p.matchType = regexpMatch + } + } else if ch == '?' { + // "?" is any char except "/" + regStr += "[^" + escSL + "]" + p.matchType = regexpMatch + } else if shouldEscape(ch) { + // Escape some regexp special chars that have no meaning + // in golang's filepath.Match + regStr += `\` + string(ch) + } else if ch == '\\' { + // escape next char. Note that a trailing \ in the pattern + // will be left alone (but need to escape it) + if sl == `\` { + // On windows map "\" to "\\", meaning an escaped backslash, + // and then just continue because filepath.Match on + // Windows doesn't allow escaping at all + regStr += escSL + continue + } + if scan.Peek() != scanner.EOF { + regStr += `\` + string(scan.Next()) + p.matchType = regexpMatch + } else { + regStr += `\` + } + } else if ch == '[' || ch == ']' { + regStr += string(ch) + p.matchType = regexpMatch + } else { + regStr += string(ch) + } + } + + if p.matchType != regexpMatch { + return nil + } + + regStr += "$" + + re, err := regexp.Compile(regStr) + if err != nil { + return err + } + + p.regexp = re + p.matchType = regexpMatch + return nil +} + +// Matches returns true if file matches any of the patterns +// and isn't excluded by any of the subsequent patterns. +// +// This implementation is buggy (it only checks a single parent dir against the +// pattern) and will be removed soon. Use MatchesOrParentMatches instead. +func Matches(file string, patterns []string) (bool, error) { + pm, err := New(patterns) + if err != nil { + return false, err + } + file = filepath.Clean(file) + + if file == "." { + // Don't let them exclude everything, kind of silly. + return false, nil + } + + return pm.Matches(file) +} + +// MatchesOrParentMatches returns true if file matches any of the patterns +// and isn't excluded by any of the subsequent patterns. +func MatchesOrParentMatches(file string, patterns []string) (bool, error) { + pm, err := New(patterns) + if err != nil { + return false, err + } + file = filepath.Clean(file) + + if file == "." { + // Don't let them exclude everything, kind of silly. + return false, nil + } + + return pm.MatchesOrParentMatches(file) +} diff --git a/vendor/github.com/moby/sys/mount/doc.go b/vendor/github.com/moby/sys/mount/doc.go deleted file mode 100644 index 86c2e01bbd..0000000000 --- a/vendor/github.com/moby/sys/mount/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package mount provides a set of functions to mount and unmount mounts. -// -// Currently it supports Linux. For historical reasons, there is also some support for FreeBSD. -package mount diff --git a/vendor/github.com/moby/sys/mount/flags_bsd.go b/vendor/github.com/moby/sys/mount/flags_bsd.go deleted file mode 100644 index a7f8a71957..0000000000 --- a/vendor/github.com/moby/sys/mount/flags_bsd.go +++ /dev/null @@ -1,46 +0,0 @@ -//go:build freebsd || openbsd -// +build freebsd openbsd - -package mount - -import "golang.org/x/sys/unix" - -const ( - // RDONLY will mount the filesystem as read-only. - RDONLY = unix.MNT_RDONLY - - // NOSUID will not allow set-user-identifier or set-group-identifier bits to - // take effect. - NOSUID = unix.MNT_NOSUID - - // NOEXEC will not allow execution of any binaries on the mounted file system. - NOEXEC = unix.MNT_NOEXEC - - // SYNCHRONOUS will allow any I/O to the file system to be done synchronously. - SYNCHRONOUS = unix.MNT_SYNCHRONOUS - - // NOATIME will not update the file access time when reading from a file. - NOATIME = unix.MNT_NOATIME -) - -// These flags are unsupported. -const ( - BIND = 0 - DIRSYNC = 0 - MANDLOCK = 0 - NODEV = 0 - NODIRATIME = 0 - UNBINDABLE = 0 - RUNBINDABLE = 0 - PRIVATE = 0 - RPRIVATE = 0 - SHARED = 0 - RSHARED = 0 - SLAVE = 0 - RSLAVE = 0 - RBIND = 0 - RELATIME = 0 - REMOUNT = 0 - STRICTATIME = 0 - mntDetach = 0 -) diff --git a/vendor/github.com/moby/sys/mount/flags_linux.go b/vendor/github.com/moby/sys/mount/flags_linux.go deleted file mode 100644 index 0425d0dd63..0000000000 --- a/vendor/github.com/moby/sys/mount/flags_linux.go +++ /dev/null @@ -1,87 +0,0 @@ -package mount - -import ( - "golang.org/x/sys/unix" -) - -const ( - // RDONLY will mount the file system read-only. - RDONLY = unix.MS_RDONLY - - // NOSUID will not allow set-user-identifier or set-group-identifier bits to - // take effect. - NOSUID = unix.MS_NOSUID - - // NODEV will not interpret character or block special devices on the file - // system. - NODEV = unix.MS_NODEV - - // NOEXEC will not allow execution of any binaries on the mounted file system. - NOEXEC = unix.MS_NOEXEC - - // SYNCHRONOUS will allow I/O to the file system to be done synchronously. - SYNCHRONOUS = unix.MS_SYNCHRONOUS - - // DIRSYNC will force all directory updates within the file system to be done - // synchronously. This affects the following system calls: create, link, - // unlink, symlink, mkdir, rmdir, mknod and rename. - DIRSYNC = unix.MS_DIRSYNC - - // REMOUNT will attempt to remount an already-mounted file system. This is - // commonly used to change the mount flags for a file system, especially to - // make a readonly file system writeable. It does not change device or mount - // point. - REMOUNT = unix.MS_REMOUNT - - // MANDLOCK will force mandatory locks on a filesystem. - MANDLOCK = unix.MS_MANDLOCK - - // NOATIME will not update the file access time when reading from a file. - NOATIME = unix.MS_NOATIME - - // NODIRATIME will not update the directory access time. - NODIRATIME = unix.MS_NODIRATIME - - // BIND remounts a subtree somewhere else. - BIND = unix.MS_BIND - - // RBIND remounts a subtree and all possible submounts somewhere else. - RBIND = unix.MS_BIND | unix.MS_REC - - // UNBINDABLE creates a mount which cannot be cloned through a bind operation. - UNBINDABLE = unix.MS_UNBINDABLE - - // RUNBINDABLE marks the entire mount tree as UNBINDABLE. - RUNBINDABLE = unix.MS_UNBINDABLE | unix.MS_REC - - // PRIVATE creates a mount which carries no propagation abilities. - PRIVATE = unix.MS_PRIVATE - - // RPRIVATE marks the entire mount tree as PRIVATE. - RPRIVATE = unix.MS_PRIVATE | unix.MS_REC - - // SLAVE creates a mount which receives propagation from its master, but not - // vice versa. - SLAVE = unix.MS_SLAVE - - // RSLAVE marks the entire mount tree as SLAVE. - RSLAVE = unix.MS_SLAVE | unix.MS_REC - - // SHARED creates a mount which provides the ability to create mirrors of - // that mount such that mounts and unmounts within any of the mirrors - // propagate to the other mirrors. - SHARED = unix.MS_SHARED - - // RSHARED marks the entire mount tree as SHARED. - RSHARED = unix.MS_SHARED | unix.MS_REC - - // RELATIME updates inode access times relative to modify or change time. - RELATIME = unix.MS_RELATIME - - // STRICTATIME allows to explicitly request full atime updates. This makes - // it possible for the kernel to default to relatime or noatime but still - // allow userspace to override it. - STRICTATIME = unix.MS_STRICTATIME - - mntDetach = unix.MNT_DETACH -) diff --git a/vendor/github.com/moby/sys/mount/flags_unix.go b/vendor/github.com/moby/sys/mount/flags_unix.go deleted file mode 100644 index 19fa61fcca..0000000000 --- a/vendor/github.com/moby/sys/mount/flags_unix.go +++ /dev/null @@ -1,140 +0,0 @@ -//go:build !darwin && !windows -// +build !darwin,!windows - -package mount - -import ( - "fmt" - "strings" -) - -var flags = map[string]struct { - clear bool - flag int -}{ - "defaults": {false, 0}, - "ro": {false, RDONLY}, - "rw": {true, RDONLY}, - "suid": {true, NOSUID}, - "nosuid": {false, NOSUID}, - "dev": {true, NODEV}, - "nodev": {false, NODEV}, - "exec": {true, NOEXEC}, - "noexec": {false, NOEXEC}, - "sync": {false, SYNCHRONOUS}, - "async": {true, SYNCHRONOUS}, - "dirsync": {false, DIRSYNC}, - "remount": {false, REMOUNT}, - "mand": {false, MANDLOCK}, - "nomand": {true, MANDLOCK}, - "atime": {true, NOATIME}, - "noatime": {false, NOATIME}, - "diratime": {true, NODIRATIME}, - "nodiratime": {false, NODIRATIME}, - "bind": {false, BIND}, - "rbind": {false, RBIND}, - "unbindable": {false, UNBINDABLE}, - "runbindable": {false, RUNBINDABLE}, - "private": {false, PRIVATE}, - "rprivate": {false, RPRIVATE}, - "shared": {false, SHARED}, - "rshared": {false, RSHARED}, - "slave": {false, SLAVE}, - "rslave": {false, RSLAVE}, - "relatime": {false, RELATIME}, - "norelatime": {true, RELATIME}, - "strictatime": {false, STRICTATIME}, - "nostrictatime": {true, STRICTATIME}, -} - -var validFlags = map[string]bool{ - "": true, - "size": true, - "mode": true, - "uid": true, - "gid": true, - "nr_inodes": true, - "nr_blocks": true, - "mpol": true, -} - -var propagationFlags = map[string]bool{ - "bind": true, - "rbind": true, - "unbindable": true, - "runbindable": true, - "private": true, - "rprivate": true, - "shared": true, - "rshared": true, - "slave": true, - "rslave": true, -} - -// MergeTmpfsOptions merge mount options to make sure there is no duplicate. -func MergeTmpfsOptions(options []string) ([]string, error) { - // We use collisions maps to remove duplicates. - // For flag, the key is the flag value (the key for propagation flag is -1) - // For data=value, the key is the data - flagCollisions := map[int]bool{} - dataCollisions := map[string]bool{} - - var newOptions []string - // We process in reverse order - for i := len(options) - 1; i >= 0; i-- { - option := options[i] - if option == "defaults" { - continue - } - if f, ok := flags[option]; ok && f.flag != 0 { - // There is only one propagation mode - key := f.flag - if propagationFlags[option] { - key = -1 - } - // Check to see if there is collision for flag - if !flagCollisions[key] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - flagCollisions[key] = true - } - continue - } - opt := strings.SplitN(option, "=", 2) - if len(opt) != 2 || !validFlags[opt[0]] { - return nil, fmt.Errorf("invalid tmpfs option %q", opt) - } - if !dataCollisions[opt[0]] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - dataCollisions[opt[0]] = true - } - } - - return newOptions, nil -} - -// Parse fstab type mount options into mount() flags -// and device specific data -func parseOptions(options string) (int, string) { - var ( - flag int - data []string - ) - - for _, o := range strings.Split(options, ",") { - // If the option does not exist in the flags table or the flag - // is not supported on the platform, - // then it is a data value for a specific fs type - if f, exists := flags[o]; exists && f.flag != 0 { - if f.clear { - flag &= ^f.flag - } else { - flag |= f.flag - } - } else { - data = append(data, o) - } - } - return flag, strings.Join(data, ",") -} diff --git a/vendor/github.com/moby/sys/mount/mount_errors.go b/vendor/github.com/moby/sys/mount/mount_errors.go deleted file mode 100644 index b0d8582e84..0000000000 --- a/vendor/github.com/moby/sys/mount/mount_errors.go +++ /dev/null @@ -1,47 +0,0 @@ -//go:build !darwin && !windows -// +build !darwin,!windows - -package mount - -import "strconv" - -// mountError records an error from mount or unmount operation -type mountError struct { - op string - source, target string - flags uintptr - data string - err error -} - -func (e *mountError) Error() string { - out := e.op + " " - - if e.source != "" { - out += e.source + ":" + e.target - } else { - out += e.target - } - - if e.flags != uintptr(0) { - out += ", flags: 0x" + strconv.FormatUint(uint64(e.flags), 16) - } - if e.data != "" { - out += ", data: " + e.data - } - - out += ": " + e.err.Error() - return out -} - -// Cause returns the underlying cause of the error. -// This is a convention used in github.com/pkg/errors -func (e *mountError) Cause() error { - return e.err -} - -// Unwrap returns the underlying error. -// This is a convention used in golang 1.13+ -func (e *mountError) Unwrap() error { - return e.err -} diff --git a/vendor/github.com/moby/sys/mount/mount_unix.go b/vendor/github.com/moby/sys/mount/mount_unix.go deleted file mode 100644 index 4053fbbeb8..0000000000 --- a/vendor/github.com/moby/sys/mount/mount_unix.go +++ /dev/null @@ -1,88 +0,0 @@ -//go:build !darwin && !windows -// +build !darwin,!windows - -package mount - -import ( - "fmt" - "sort" - - "github.com/moby/sys/mountinfo" - "golang.org/x/sys/unix" -) - -// Mount will mount filesystem according to the specified configuration. -// Options must be specified like the mount or fstab unix commands: -// "opt1=val1,opt2=val2". See flags.go for supported option flags. -func Mount(device, target, mType, options string) error { - flag, data := parseOptions(options) - return mount(device, target, mType, uintptr(flag), data) -} - -// Unmount lazily unmounts a filesystem on supported platforms, otherwise does -// a normal unmount. If target is not a mount point, no error is returned. -func Unmount(target string) error { - err := unix.Unmount(target, mntDetach) - if err == nil || err == unix.EINVAL { //nolint:errorlint // unix errors are bare - // Ignore "not mounted" error here. Note the same error - // can be returned if flags are invalid, so this code - // assumes that the flags value is always correct. - return nil - } - - return &mountError{ - op: "umount", - target: target, - flags: uintptr(mntDetach), - err: err, - } -} - -// RecursiveUnmount unmounts the target and all mounts underneath, starting -// with the deepest mount first. The argument does not have to be a mount -// point itself. -func RecursiveUnmount(target string) error { - // Fast path, works if target is a mount point that can be unmounted. - // On Linux, mntDetach flag ensures a recursive unmount. For other - // platforms, if there are submounts, we'll get EBUSY (and fall back - // to the slow path). NOTE we do not ignore EINVAL here as target might - // not be a mount point itself (but there can be mounts underneath). - if err := unix.Unmount(target, mntDetach); err == nil { - return nil - } - - // Slow path: get all submounts, sort, unmount one by one. - mounts, err := mountinfo.GetMounts(mountinfo.PrefixFilter(target)) - if err != nil { - return err - } - - // Make the deepest mount be first - sort.Slice(mounts, func(i, j int) bool { - return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) - }) - - var ( - suberr error - lastMount = len(mounts) - 1 - ) - for i, m := range mounts { - err = Unmount(m.Mountpoint) - if err != nil { - if i == lastMount { - if suberr != nil { - return fmt.Errorf("%w (possible cause: %s)", err, suberr) - } - return err - } - // This is a submount, we can ignore the error for now, - // the final unmount will fail if this is a real problem. - // With that in mind, the _first_ failed unmount error - // might be the real error cause, so let's keep it. - if suberr == nil { - suberr = err - } - } - } - return nil -} diff --git a/vendor/github.com/moby/sys/mount/mounter_freebsd.go b/vendor/github.com/moby/sys/mount/mounter_freebsd.go deleted file mode 100644 index 1fffb69015..0000000000 --- a/vendor/github.com/moby/sys/mount/mounter_freebsd.go +++ /dev/null @@ -1,62 +0,0 @@ -//go:build freebsd && cgo -// +build freebsd,cgo - -package mount - -/* -#include -#include -#include -#include -#include -#include -*/ -import "C" - -import ( - "strings" - "syscall" - "unsafe" -) - -func allocateIOVecs(options []string) []C.struct_iovec { - out := make([]C.struct_iovec, len(options)) - for i, option := range options { - out[i].iov_base = unsafe.Pointer(C.CString(option)) - out[i].iov_len = C.size_t(len(option) + 1) - } - return out -} - -func mount(device, target, mType string, flag uintptr, data string) error { - isNullFS := false - - xs := strings.Split(data, ",") - for _, x := range xs { - if x == "bind" { - isNullFS = true - } - } - - options := []string{"fspath", target} - if isNullFS { - options = append(options, "fstype", "nullfs", "target", device) - } else { - options = append(options, "fstype", mType, "from", device) - } - rawOptions := allocateIOVecs(options) - for _, rawOption := range rawOptions { - defer C.free(rawOption.iov_base) - } - - if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 { - return &mountError{ - op: "mount", - source: device, - target: target, - flags: flag, - err: syscall.Errno(errno), - } - } - return nil -} diff --git a/vendor/github.com/moby/sys/mount/mounter_linux.go b/vendor/github.com/moby/sys/mount/mounter_linux.go deleted file mode 100644 index 4e18f4b678..0000000000 --- a/vendor/github.com/moby/sys/mount/mounter_linux.go +++ /dev/null @@ -1,72 +0,0 @@ -package mount - -import ( - "golang.org/x/sys/unix" -) - -const ( - // ptypes is the set propagation types. - ptypes = unix.MS_SHARED | unix.MS_PRIVATE | unix.MS_SLAVE | unix.MS_UNBINDABLE - - // pflags is the full set valid flags for a change propagation call. - pflags = ptypes | unix.MS_REC | unix.MS_SILENT - - // broflags is the combination of bind and read only - broflags = unix.MS_BIND | unix.MS_RDONLY -) - -// isremount returns true if either device name or flags identify a remount request, false otherwise. -func isremount(device string, flags uintptr) bool { - switch { - // We treat device "" and "none" as a remount request to provide compatibility with - // requests that don't explicitly set MS_REMOUNT such as those manipulating bind mounts. - case flags&unix.MS_REMOUNT != 0, device == "", device == "none": - return true - default: - return false - } -} - -func mount(device, target, mType string, flags uintptr, data string) error { - oflags := flags &^ ptypes - if !isremount(device, flags) || data != "" { - // Initial call applying all non-propagation flags for mount - // or remount with changed data - if err := unix.Mount(device, target, mType, oflags, data); err != nil { - return &mountError{ - op: "mount", - source: device, - target: target, - flags: oflags, - data: data, - err: err, - } - } - } - - if flags&ptypes != 0 { - // Change the propagation type. - if err := unix.Mount("", target, "", flags&pflags, ""); err != nil { - return &mountError{ - op: "remount", - target: target, - flags: flags & pflags, - err: err, - } - } - } - - if oflags&broflags == broflags { - // Remount the bind to apply read only. - if err := unix.Mount("", target, "", oflags|unix.MS_REMOUNT, ""); err != nil { - return &mountError{ - op: "remount-ro", - target: target, - flags: oflags | unix.MS_REMOUNT, - err: err, - } - } - } - - return nil -} diff --git a/vendor/github.com/moby/sys/mount/mounter_openbsd.go b/vendor/github.com/moby/sys/mount/mounter_openbsd.go deleted file mode 100644 index 3c0718b907..0000000000 --- a/vendor/github.com/moby/sys/mount/mounter_openbsd.go +++ /dev/null @@ -1,78 +0,0 @@ -//go:build openbsd && cgo -// +build openbsd,cgo - -/* - Due to how OpenBSD mount(2) works, filesystem types need to be - supported explicitly since it uses separate structs to pass - filesystem-specific arguments. - - For now only UFS/FFS is supported as it's the default fs - on OpenBSD systems. - - See: https://man.openbsd.org/mount.2 -*/ - -package mount - -/* -#include -#include -*/ -import "C" - -import ( - "fmt" - "syscall" - "unsafe" -) - -func createExportInfo(readOnly bool) C.struct_export_args { - exportFlags := C.int(0) - if readOnly { - exportFlags = C.MNT_EXRDONLY - } - out := C.struct_export_args{ - ex_root: 0, - ex_flags: exportFlags, - } - return out -} - -func createUfsArgs(device string, readOnly bool) unsafe.Pointer { - out := &C.struct_ufs_args{ - fspec: C.CString(device), - export_info: createExportInfo(readOnly), - } - return unsafe.Pointer(out) -} - -func mount(device, target, mType string, flag uintptr, data string) error { - readOnly := flag&RDONLY != 0 - - var fsArgs unsafe.Pointer - - switch mType { - case "ffs": - fsArgs = createUfsArgs(device, readOnly) - default: - return &mountError{ - op: "mount", - source: device, - target: target, - flags: flag, - err: fmt.Errorf("unsupported file system type: %s", mType), - } - } - - if errno := C.mount(C.CString(mType), C.CString(target), C.int(flag), fsArgs); errno != 0 { - return &mountError{ - op: "mount", - source: device, - target: target, - flags: flag, - err: syscall.Errno(errno), - } - } - - return nil -} diff --git a/vendor/github.com/moby/sys/mount/mounter_unsupported.go b/vendor/github.com/moby/sys/mount/mounter_unsupported.go deleted file mode 100644 index b69d62bd65..0000000000 --- a/vendor/github.com/moby/sys/mount/mounter_unsupported.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build (!linux && !freebsd && !openbsd && !windows && !darwin) || (freebsd && !cgo) || (openbsd && !cgo) -// +build !linux,!freebsd,!openbsd,!windows,!darwin freebsd,!cgo openbsd,!cgo - -package mount - -func mount(device, target, mType string, flag uintptr, data string) error { - panic("cgo required on freebsd and openbsd") -} diff --git a/vendor/github.com/moby/sys/mount/sharedsubtree_linux.go b/vendor/github.com/moby/sys/mount/sharedsubtree_linux.go deleted file mode 100644 index 948e6bacd8..0000000000 --- a/vendor/github.com/moby/sys/mount/sharedsubtree_linux.go +++ /dev/null @@ -1,73 +0,0 @@ -package mount - -import "github.com/moby/sys/mountinfo" - -// MakeShared ensures a mounted filesystem has the SHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeShared(mountPoint string) error { - return ensureMountedAs(mountPoint, SHARED) -} - -// MakeRShared ensures a mounted filesystem has the RSHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRShared(mountPoint string) error { - return ensureMountedAs(mountPoint, RSHARED) -} - -// MakePrivate ensures a mounted filesystem has the PRIVATE mount option enabled. -// See the supported options in flags.go for further reference. -func MakePrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, PRIVATE) -} - -// MakeRPrivate ensures a mounted filesystem has the RPRIVATE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeRPrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, RPRIVATE) -} - -// MakeSlave ensures a mounted filesystem has the SLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, SLAVE) -} - -// MakeRSlave ensures a mounted filesystem has the RSLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, RSLAVE) -} - -// MakeUnbindable ensures a mounted filesystem has the UNBINDABLE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, UNBINDABLE) -} - -// MakeRUnbindable ensures a mounted filesystem has the RUNBINDABLE mount -// option enabled. See the supported options in flags.go for further reference. -func MakeRUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, RUNBINDABLE) -} - -// MakeMount ensures that the file or directory given is a mount point, -// bind mounting it to itself it case it is not. -func MakeMount(mnt string) error { - mounted, err := mountinfo.Mounted(mnt) - if err != nil { - return err - } - if mounted { - return nil - } - - return mount(mnt, mnt, "none", uintptr(BIND), "") -} - -func ensureMountedAs(mnt string, flags int) error { - if err := MakeMount(mnt); err != nil { - return err - } - - return mount("", mnt, "none", uintptr(flags), "") -} diff --git a/vendor/github.com/moby/sys/sequential/LICENSE b/vendor/github.com/moby/sys/sequential/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/moby/sys/sequential/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/github.com/moby/sys/sequential/doc.go b/vendor/github.com/moby/sys/sequential/doc.go new file mode 100644 index 0000000000..af2817504b --- /dev/null +++ b/vendor/github.com/moby/sys/sequential/doc.go @@ -0,0 +1,15 @@ +// Package sequential provides a set of functions for managing sequential +// files on Windows. +// +// The origin of these functions are the golang OS and windows packages, +// slightly modified to only cope with files, not directories due to the +// specific use case. +// +// The alteration is to allow a file on Windows to be opened with +// FILE_FLAG_SEQUENTIAL_SCAN (particular for docker load), to avoid eating +// the standby list, particularly when accessing large files such as layer.tar. +// +// For non-Windows platforms, the package provides wrappers for the equivalents +// in the os packages. They are passthrough on Unix platforms, and only relevant +// on Windows. +package sequential diff --git a/vendor/github.com/moby/sys/sequential/sequential_unix.go b/vendor/github.com/moby/sys/sequential/sequential_unix.go new file mode 100644 index 0000000000..a3c7340e3a --- /dev/null +++ b/vendor/github.com/moby/sys/sequential/sequential_unix.go @@ -0,0 +1,45 @@ +//go:build !windows +// +build !windows + +package sequential + +import "os" + +// Create creates the named file with mode 0666 (before umask), truncating +// it if it already exists. If successful, methods on the returned +// File can be used for I/O; the associated file descriptor has mode +// O_RDWR. +// If there is an error, it will be of type *PathError. +func Create(name string) (*os.File, error) { + return os.Create(name) +} + +// Open opens the named file for reading. If successful, methods on +// the returned file can be used for reading; the associated file +// descriptor has mode O_RDONLY. +// If there is an error, it will be of type *PathError. +func Open(name string) (*os.File, error) { + return os.Open(name) +} + +// OpenFile is the generalized open call; most users will use Open +// or Create instead. It opens the named file with specified flag +// (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, +// methods on the returned File can be used for I/O. +// If there is an error, it will be of type *PathError. +func OpenFile(name string, flag int, perm os.FileMode) (*os.File, error) { + return os.OpenFile(name, flag, perm) +} + +// CreateTemp creates a new temporary file in the directory dir +// with a name beginning with prefix, opens the file for reading +// and writing, and returns the resulting *os.File. +// If dir is the empty string, TempFile uses the default directory +// for temporary files (see os.TempDir). +// Multiple programs calling TempFile simultaneously +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func CreateTemp(dir, prefix string) (f *os.File, err error) { + return os.CreateTemp(dir, prefix) +} diff --git a/vendor/github.com/moby/sys/sequential/sequential_windows.go b/vendor/github.com/moby/sys/sequential/sequential_windows.go new file mode 100644 index 0000000000..3f7f0d83e0 --- /dev/null +++ b/vendor/github.com/moby/sys/sequential/sequential_windows.go @@ -0,0 +1,161 @@ +package sequential + +import ( + "os" + "path/filepath" + "strconv" + "sync" + "syscall" + "time" + "unsafe" + + "golang.org/x/sys/windows" +) + +// Create creates the named file with mode 0666 (before umask), truncating +// it if it already exists. If successful, methods on the returned +// File can be used for I/O; the associated file descriptor has mode +// O_RDWR. +// If there is an error, it will be of type *PathError. +func Create(name string) (*os.File, error) { + return OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) +} + +// Open opens the named file for reading. If successful, methods on +// the returned file can be used for reading; the associated file +// descriptor has mode O_RDONLY. +// If there is an error, it will be of type *PathError. +func Open(name string) (*os.File, error) { + return OpenFile(name, os.O_RDONLY, 0) +} + +// OpenFile is the generalized open call; most users will use Open +// or Create instead. +// If there is an error, it will be of type *PathError. +func OpenFile(name string, flag int, _ os.FileMode) (*os.File, error) { + if name == "" { + return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT} + } + r, err := openFileSequential(name, flag, 0) + if err == nil { + return r, nil + } + return nil, &os.PathError{Op: "open", Path: name, Err: err} +} + +func openFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) { + r, e := openSequential(name, flag|windows.O_CLOEXEC, 0) + if e != nil { + return nil, e + } + return os.NewFile(uintptr(r), name), nil +} + +func makeInheritSa() *windows.SecurityAttributes { + var sa windows.SecurityAttributes + sa.Length = uint32(unsafe.Sizeof(sa)) + sa.InheritHandle = 1 + return &sa +} + +func openSequential(path string, mode int, _ uint32) (fd windows.Handle, err error) { + if len(path) == 0 { + return windows.InvalidHandle, windows.ERROR_FILE_NOT_FOUND + } + pathp, err := windows.UTF16PtrFromString(path) + if err != nil { + return windows.InvalidHandle, err + } + var access uint32 + switch mode & (windows.O_RDONLY | windows.O_WRONLY | windows.O_RDWR) { + case windows.O_RDONLY: + access = windows.GENERIC_READ + case windows.O_WRONLY: + access = windows.GENERIC_WRITE + case windows.O_RDWR: + access = windows.GENERIC_READ | windows.GENERIC_WRITE + } + if mode&windows.O_CREAT != 0 { + access |= windows.GENERIC_WRITE + } + if mode&windows.O_APPEND != 0 { + access &^= windows.GENERIC_WRITE + access |= windows.FILE_APPEND_DATA + } + sharemode := uint32(windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE) + var sa *windows.SecurityAttributes + if mode&windows.O_CLOEXEC == 0 { + sa = makeInheritSa() + } + var createmode uint32 + switch { + case mode&(windows.O_CREAT|windows.O_EXCL) == (windows.O_CREAT | windows.O_EXCL): + createmode = windows.CREATE_NEW + case mode&(windows.O_CREAT|windows.O_TRUNC) == (windows.O_CREAT | windows.O_TRUNC): + createmode = windows.CREATE_ALWAYS + case mode&windows.O_CREAT == windows.O_CREAT: + createmode = windows.OPEN_ALWAYS + case mode&windows.O_TRUNC == windows.O_TRUNC: + createmode = windows.TRUNCATE_EXISTING + default: + createmode = windows.OPEN_EXISTING + } + // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx + const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN + h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) + return h, e +} + +// Helpers for CreateTemp +var rand uint32 +var randmu sync.Mutex + +func reseed() uint32 { + return uint32(time.Now().UnixNano() + int64(os.Getpid())) +} + +func nextSuffix() string { + randmu.Lock() + r := rand + if r == 0 { + r = reseed() + } + r = r*1664525 + 1013904223 // constants from Numerical Recipes + rand = r + randmu.Unlock() + return strconv.Itoa(int(1e9 + r%1e9))[1:] +} + +// CreateTemp is a copy of os.CreateTemp, modified to use sequential +// file access. Below is the original comment from golang: +// TempFile creates a new temporary file in the directory dir +// with a name beginning with prefix, opens the file for reading +// and writing, and returns the resulting *os.File. +// If dir is the empty string, TempFile uses the default directory +// for temporary files (see os.TempDir). +// Multiple programs calling TempFile simultaneously +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func CreateTemp(dir, prefix string) (f *os.File, err error) { + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + name := filepath.Join(dir, prefix+nextSuffix()) + f, err = OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o600) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + break + } + return +} diff --git a/vendor/github.com/moby/term/doc.go b/vendor/github.com/moby/term/doc.go new file mode 100644 index 0000000000..c9bc032443 --- /dev/null +++ b/vendor/github.com/moby/term/doc.go @@ -0,0 +1,3 @@ +// Package term provides structures and helper functions to work with +// terminal (state, sizes). +package term diff --git a/vendor/github.com/moby/term/tc.go b/vendor/github.com/moby/term/tc.go deleted file mode 100644 index 8a5e09f584..0000000000 --- a/vendor/github.com/moby/term/tc.go +++ /dev/null @@ -1,20 +0,0 @@ -//go:build !windows -// +build !windows - -package term - -import ( - "golang.org/x/sys/unix" -) - -func tcget(fd uintptr) (*Termios, error) { - p, err := unix.IoctlGetTermios(int(fd), getTermios) - if err != nil { - return nil, err - } - return p, nil -} - -func tcset(fd uintptr, p *Termios) error { - return unix.IoctlSetTermios(int(fd), setTermios, p) -} diff --git a/vendor/github.com/moby/term/term.go b/vendor/github.com/moby/term/term.go index 2dd3d090df..f9d8988ef8 100644 --- a/vendor/github.com/moby/term/term.go +++ b/vendor/github.com/moby/term/term.go @@ -1,100 +1,85 @@ -//go:build !windows -// +build !windows - -// Package term provides structures and helper functions to work with -// terminal (state, sizes). package term -import ( - "errors" - "io" - "os" - - "golang.org/x/sys/unix" -) - -// ErrInvalidState is returned if the state of the terminal is invalid. -var ErrInvalidState = errors.New("Invalid terminal state") +import "io" -// State represents the state of the terminal. -type State struct { - termios Termios -} +// State holds the platform-specific state / console mode for the terminal. +type State terminalState // Winsize represents the size of the terminal window. type Winsize struct { Height uint16 Width uint16 - x uint16 - y uint16 + + // Only used on Unix + x uint16 + y uint16 } // StdStreams returns the standard streams (stdin, stdout, stderr). +// +// On Windows, it attempts to turn on VT handling on all std handles if +// supported, or falls back to terminal emulation. On Unix, this returns +// the standard [os.Stdin], [os.Stdout] and [os.Stderr]. func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { - return os.Stdin, os.Stdout, os.Stderr + return stdStreams() } // GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. -func GetFdInfo(in interface{}) (uintptr, bool) { - var inFd uintptr - var isTerminalIn bool - if file, ok := in.(*os.File); ok { - inFd = file.Fd() - isTerminalIn = IsTerminal(inFd) - } - return inFd, isTerminalIn +func GetFdInfo(in interface{}) (fd uintptr, isTerminal bool) { + return getFdInfo(in) +} + +// GetWinsize returns the window size based on the specified file descriptor. +func GetWinsize(fd uintptr) (*Winsize, error) { + return getWinsize(fd) +} + +// SetWinsize tries to set the specified window size for the specified file +// descriptor. It is only implemented on Unix, and returns an error on Windows. +func SetWinsize(fd uintptr, ws *Winsize) error { + return setWinsize(fd, ws) } // IsTerminal returns true if the given file descriptor is a terminal. func IsTerminal(fd uintptr) bool { - _, err := tcget(fd) - return err == nil + return isTerminal(fd) } // RestoreTerminal restores the terminal connected to the given file descriptor // to a previous state. func RestoreTerminal(fd uintptr, state *State) error { - if state == nil { - return ErrInvalidState - } - return tcset(fd, &state.termios) + return restoreTerminal(fd, state) } // SaveState saves the state of the terminal connected to the given file descriptor. func SaveState(fd uintptr) (*State, error) { - termios, err := tcget(fd) - if err != nil { - return nil, err - } - return &State{termios: *termios}, nil + return saveState(fd) } // DisableEcho applies the specified state to the terminal connected to the file // descriptor, with echo disabled. func DisableEcho(fd uintptr, state *State) error { - newState := state.termios - newState.Lflag &^= unix.ECHO - - if err := tcset(fd, &newState); err != nil { - return err - } - return nil + return disableEcho(fd, state) } // SetRawTerminal puts the terminal connected to the given file descriptor into -// raw mode and returns the previous state. On UNIX, this puts both the input -// and output into raw mode. On Windows, it only puts the input into raw mode. -func SetRawTerminal(fd uintptr) (*State, error) { - oldState, err := MakeRaw(fd) - if err != nil { - return nil, err - } - return oldState, err +// raw mode and returns the previous state. On UNIX, this is the equivalent of +// [MakeRaw], and puts both the input and output into raw mode. On Windows, it +// only puts the input into raw mode. +func SetRawTerminal(fd uintptr) (previousState *State, err error) { + return setRawTerminal(fd) } // SetRawTerminalOutput puts the output of terminal connected to the given file // descriptor into raw mode. On UNIX, this does nothing and returns nil for the // state. On Windows, it disables LF -> CRLF translation. -func SetRawTerminalOutput(fd uintptr) (*State, error) { - return nil, nil +func SetRawTerminalOutput(fd uintptr) (previousState *State, err error) { + return setRawTerminalOutput(fd) +} + +// MakeRaw puts the terminal (Windows Console) connected to the +// given file descriptor into raw mode and returns the previous state of +// the terminal so that it can be restored. +func MakeRaw(fd uintptr) (previousState *State, err error) { + return makeRaw(fd) } diff --git a/vendor/github.com/moby/term/term_unix.go b/vendor/github.com/moby/term/term_unix.go new file mode 100644 index 0000000000..2ec7706a16 --- /dev/null +++ b/vendor/github.com/moby/term/term_unix.go @@ -0,0 +1,98 @@ +//go:build !windows +// +build !windows + +package term + +import ( + "errors" + "io" + "os" + + "golang.org/x/sys/unix" +) + +// ErrInvalidState is returned if the state of the terminal is invalid. +// +// Deprecated: ErrInvalidState is no longer used. +var ErrInvalidState = errors.New("Invalid terminal state") + +// terminalState holds the platform-specific state / console mode for the terminal. +type terminalState struct { + termios unix.Termios +} + +func stdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { + return os.Stdin, os.Stdout, os.Stderr +} + +func getFdInfo(in interface{}) (uintptr, bool) { + var inFd uintptr + var isTerminalIn bool + if file, ok := in.(*os.File); ok { + inFd = file.Fd() + isTerminalIn = isTerminal(inFd) + } + return inFd, isTerminalIn +} + +func getWinsize(fd uintptr) (*Winsize, error) { + uws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) + ws := &Winsize{Height: uws.Row, Width: uws.Col, x: uws.Xpixel, y: uws.Ypixel} + return ws, err +} + +func setWinsize(fd uintptr, ws *Winsize) error { + return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, &unix.Winsize{ + Row: ws.Height, + Col: ws.Width, + Xpixel: ws.x, + Ypixel: ws.y, + }) +} + +func isTerminal(fd uintptr) bool { + _, err := tcget(fd) + return err == nil +} + +func restoreTerminal(fd uintptr, state *State) error { + if state == nil { + return errors.New("invalid terminal state") + } + return tcset(fd, &state.termios) +} + +func saveState(fd uintptr) (*State, error) { + termios, err := tcget(fd) + if err != nil { + return nil, err + } + return &State{termios: *termios}, nil +} + +func disableEcho(fd uintptr, state *State) error { + newState := state.termios + newState.Lflag &^= unix.ECHO + + return tcset(fd, &newState) +} + +func setRawTerminal(fd uintptr) (*State, error) { + return makeRaw(fd) +} + +func setRawTerminalOutput(fd uintptr) (*State, error) { + return nil, nil +} + +func tcget(fd uintptr) (*unix.Termios, error) { + p, err := unix.IoctlGetTermios(int(fd), getTermios) + if err != nil { + return nil, err + } + return p, nil +} + +func tcset(fd uintptr, p *unix.Termios) error { + return unix.IoctlSetTermios(int(fd), setTermios, p) +} diff --git a/vendor/github.com/moby/term/term_windows.go b/vendor/github.com/moby/term/term_windows.go index 3cdc8edbda..81ccff0428 100644 --- a/vendor/github.com/moby/term/term_windows.go +++ b/vendor/github.com/moby/term/term_windows.go @@ -1,6 +1,7 @@ package term import ( + "fmt" "io" "os" "os/signal" @@ -9,22 +10,15 @@ import ( "golang.org/x/sys/windows" ) -// State holds the console mode for the terminal. -type State struct { +// terminalState holds the platform-specific state / console mode for the terminal. +type terminalState struct { mode uint32 } -// Winsize is used for window size. -type Winsize struct { - Height uint16 - Width uint16 -} - // vtInputSupported is true if winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported by the console var vtInputSupported bool -// StdStreams returns the standard streams (stdin, stdout, stderr). -func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { +func stdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { // Turn on VT handling on all std handles, if possible. This might // fail, in which case we will fall back to terminal emulation. var ( @@ -87,16 +81,14 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { stdErr = os.Stderr } - return + return stdIn, stdOut, stdErr } -// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. -func GetFdInfo(in interface{}) (uintptr, bool) { +func getFdInfo(in interface{}) (uintptr, bool) { return windowsconsole.GetHandleInfo(in) } -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { +func getWinsize(fd uintptr) (*Winsize, error) { var info windows.ConsoleScreenBufferInfo if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { return nil, err @@ -110,21 +102,21 @@ func GetWinsize(fd uintptr) (*Winsize, error) { return winsize, nil } -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd uintptr) bool { +func setWinsize(fd uintptr, ws *Winsize) error { + return fmt.Errorf("not implemented on Windows") +} + +func isTerminal(fd uintptr) bool { var mode uint32 err := windows.GetConsoleMode(windows.Handle(fd), &mode) return err == nil } -// RestoreTerminal restores the terminal connected to the given file descriptor -// to a previous state. -func RestoreTerminal(fd uintptr, state *State) error { +func restoreTerminal(fd uintptr, state *State) error { return windows.SetConsoleMode(windows.Handle(fd), state.mode) } -// SaveState saves the state of the terminal connected to the given file descriptor. -func SaveState(fd uintptr) (*State, error) { +func saveState(fd uintptr) (*State, error) { var mode uint32 if err := windows.GetConsoleMode(windows.Handle(fd), &mode); err != nil { @@ -134,9 +126,8 @@ func SaveState(fd uintptr) (*State, error) { return &State{mode: mode}, nil } -// DisableEcho disables echo for the terminal connected to the given file descriptor. -// -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx -func DisableEcho(fd uintptr, state *State) error { +func disableEcho(fd uintptr, state *State) error { + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx mode := state.mode mode &^= windows.ENABLE_ECHO_INPUT mode |= windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT @@ -150,69 +141,27 @@ func DisableEcho(fd uintptr, state *State) error { return nil } -// SetRawTerminal puts the terminal connected to the given file descriptor into -// raw mode and returns the previous state. On UNIX, this puts both the input -// and output into raw mode. On Windows, it only puts the input into raw mode. -func SetRawTerminal(fd uintptr) (*State, error) { - state, err := MakeRaw(fd) +func setRawTerminal(fd uintptr) (*State, error) { + oldState, err := MakeRaw(fd) if err != nil { return nil, err } // Register an interrupt handler to catch and restore prior state - restoreAtInterrupt(fd, state) - return state, err + restoreAtInterrupt(fd, oldState) + return oldState, err } -// SetRawTerminalOutput puts the output of terminal connected to the given file -// descriptor into raw mode. On UNIX, this does nothing and returns nil for the -// state. On Windows, it disables LF -> CRLF translation. -func SetRawTerminalOutput(fd uintptr) (*State, error) { - state, err := SaveState(fd) +func setRawTerminalOutput(fd uintptr) (*State, error) { + oldState, err := saveState(fd) if err != nil { return nil, err } // Ignore failures, since winterm.DISABLE_NEWLINE_AUTO_RETURN might not be supported on this // version of Windows. - _ = windows.SetConsoleMode(windows.Handle(fd), state.mode|windows.DISABLE_NEWLINE_AUTO_RETURN) - return state, err -} - -// MakeRaw puts the terminal (Windows Console) connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be restored. -func MakeRaw(fd uintptr) (*State, error) { - state, err := SaveState(fd) - if err != nil { - return nil, err - } - - mode := state.mode - - // See - // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx - // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx - - // Disable these modes - mode &^= windows.ENABLE_ECHO_INPUT - mode &^= windows.ENABLE_LINE_INPUT - mode &^= windows.ENABLE_MOUSE_INPUT - mode &^= windows.ENABLE_WINDOW_INPUT - mode &^= windows.ENABLE_PROCESSED_INPUT - - // Enable these modes - mode |= windows.ENABLE_EXTENDED_FLAGS - mode |= windows.ENABLE_INSERT_MODE - mode |= windows.ENABLE_QUICK_EDIT_MODE - if vtInputSupported { - mode |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT - } - - err = windows.SetConsoleMode(windows.Handle(fd), mode) - if err != nil { - return nil, err - } - return state, nil + _ = windows.SetConsoleMode(windows.Handle(fd), oldState.mode|windows.DISABLE_NEWLINE_AUTO_RETURN) + return oldState, err } func restoreAtInterrupt(fd uintptr, state *State) { diff --git a/vendor/github.com/moby/term/termios.go b/vendor/github.com/moby/term/termios.go deleted file mode 100644 index 99c0f7de60..0000000000 --- a/vendor/github.com/moby/term/termios.go +++ /dev/null @@ -1,36 +0,0 @@ -//go:build !windows -// +build !windows - -package term - -import ( - "golang.org/x/sys/unix" -) - -// Termios is the Unix API for terminal I/O. -type Termios = unix.Termios - -// MakeRaw puts the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - termios, err := tcget(fd) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - termios.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) - termios.Oflag &^= unix.OPOST - termios.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) - termios.Cflag &^= (unix.CSIZE | unix.PARENB) - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - - if err := tcset(fd, termios); err != nil { - return nil, err - } - return &oldState, nil -} diff --git a/vendor/github.com/moby/term/termios_unix.go b/vendor/github.com/moby/term/termios_unix.go new file mode 100644 index 0000000000..60c823783c --- /dev/null +++ b/vendor/github.com/moby/term/termios_unix.go @@ -0,0 +1,35 @@ +//go:build !windows +// +build !windows + +package term + +import ( + "golang.org/x/sys/unix" +) + +// Termios is the Unix API for terminal I/O. +// +// Deprecated: use [unix.Termios]. +type Termios = unix.Termios + +func makeRaw(fd uintptr) (*State, error) { + termios, err := tcget(fd) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + + if err := tcset(fd, termios); err != nil { + return nil, err + } + return &oldState, nil +} diff --git a/vendor/github.com/moby/term/termios_windows.go b/vendor/github.com/moby/term/termios_windows.go new file mode 100644 index 0000000000..5be4e76011 --- /dev/null +++ b/vendor/github.com/moby/term/termios_windows.go @@ -0,0 +1,37 @@ +package term + +import "golang.org/x/sys/windows" + +func makeRaw(fd uintptr) (*State, error) { + state, err := SaveState(fd) + if err != nil { + return nil, err + } + + mode := state.mode + + // See + // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx + // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx + + // Disable these modes + mode &^= windows.ENABLE_ECHO_INPUT + mode &^= windows.ENABLE_LINE_INPUT + mode &^= windows.ENABLE_MOUSE_INPUT + mode &^= windows.ENABLE_WINDOW_INPUT + mode &^= windows.ENABLE_PROCESSED_INPUT + + // Enable these modes + mode |= windows.ENABLE_EXTENDED_FLAGS + mode |= windows.ENABLE_INSERT_MODE + mode |= windows.ENABLE_QUICK_EDIT_MODE + if vtInputSupported { + mode |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT + } + + err = windows.SetConsoleMode(windows.Handle(fd), mode) + if err != nil { + return nil, err + } + return state, nil +} diff --git a/vendor/github.com/moby/term/windows/ansi_reader.go b/vendor/github.com/moby/term/windows/ansi_reader.go index f32aa537ef..fb34c547aa 100644 --- a/vendor/github.com/moby/term/windows/ansi_reader.go +++ b/vendor/github.com/moby/term/windows/ansi_reader.go @@ -195,10 +195,10 @@ func keyToString(keyEvent *winterm.KEY_EVENT_RECORD, escapeSequence []byte) stri // +Key generates ESC N Key if !control && alt { - return ansiterm.KEY_ESC_N + strings.ToLower(string(keyEvent.UnicodeChar)) + return ansiterm.KEY_ESC_N + strings.ToLower(string(rune(keyEvent.UnicodeChar))) } - return string(keyEvent.UnicodeChar) + return string(rune(keyEvent.UnicodeChar)) } // formatVirtualKey converts a virtual key (e.g., up arrow) into the appropriate ANSI string. diff --git a/vendor/github.com/moby/term/windows/console.go b/vendor/github.com/moby/term/windows/console.go index 116b74e8f5..21e57bd52f 100644 --- a/vendor/github.com/moby/term/windows/console.go +++ b/vendor/github.com/moby/term/windows/console.go @@ -30,8 +30,11 @@ func GetHandleInfo(in interface{}) (uintptr, bool) { // IsConsole returns true if the given file descriptor is a Windows Console. // The code assumes that GetConsoleMode will return an error for file descriptors that are not a console. -// Deprecated: use golang.org/x/sys/windows.GetConsoleMode() or golang.org/x/term.IsTerminal() -var IsConsole = isConsole +// +// Deprecated: use [windows.GetConsoleMode] or [golang.org/x/term.IsTerminal]. +func IsConsole(fd uintptr) bool { + return isConsole(fd) +} func isConsole(fd uintptr) bool { var mode uint32 diff --git a/vendor/github.com/moby/term/winsize.go b/vendor/github.com/moby/term/winsize.go deleted file mode 100644 index bea8d4595c..0000000000 --- a/vendor/github.com/moby/term/winsize.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build !windows -// +build !windows - -package term - -import ( - "golang.org/x/sys/unix" -) - -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { - uws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) - ws := &Winsize{Height: uws.Row, Width: uws.Col, x: uws.Xpixel, y: uws.Ypixel} - return ws, err -} - -// SetWinsize tries to set the specified window size for the specified file descriptor. -func SetWinsize(fd uintptr, ws *Winsize) error { - uws := &unix.Winsize{Row: ws.Height, Col: ws.Width, Xpixel: ws.x, Ypixel: ws.y} - return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, uws) -} diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/v1/annotations.go b/vendor/github.com/opencontainers/image-spec/specs-go/v1/annotations.go index 6f9e6fd3ab..581cf7cdfa 100644 --- a/vendor/github.com/opencontainers/image-spec/specs-go/v1/annotations.go +++ b/vendor/github.com/opencontainers/image-spec/specs-go/v1/annotations.go @@ -59,13 +59,4 @@ const ( // AnnotationBaseImageName is the annotation key for the image reference of the image's base image. AnnotationBaseImageName = "org.opencontainers.image.base.name" - - // AnnotationArtifactCreated is the annotation key for the date and time on which the artifact was built, conforming to RFC 3339. - AnnotationArtifactCreated = "org.opencontainers.artifact.created" - - // AnnotationArtifactDescription is the annotation key for the human readable description for the artifact. - AnnotationArtifactDescription = "org.opencontainers.artifact.description" - - // AnnotationReferrersFiltersApplied is the annotation key for the comma separated list of filters applied by the registry in the referrers listing. - AnnotationReferrersFiltersApplied = "org.opencontainers.referrers.filtersApplied" ) diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/v1/artifact.go b/vendor/github.com/opencontainers/image-spec/specs-go/v1/artifact.go deleted file mode 100644 index 03d76ce437..0000000000 --- a/vendor/github.com/opencontainers/image-spec/specs-go/v1/artifact.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2022 The Linux Foundation -// -// 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 v1 - -// Artifact describes an artifact manifest. -// This structure provides `application/vnd.oci.artifact.manifest.v1+json` mediatype when marshalled to JSON. -type Artifact struct { - // MediaType is the media type of the object this schema refers to. - MediaType string `json:"mediaType"` - - // ArtifactType is the IANA media type of the artifact this schema refers to. - ArtifactType string `json:"artifactType"` - - // Blobs is a collection of blobs referenced by this manifest. - Blobs []Descriptor `json:"blobs,omitempty"` - - // Subject (reference) is an optional link from the artifact to another manifest forming an association between the artifact and the other manifest. - Subject *Descriptor `json:"subject,omitempty"` - - // Annotations contains arbitrary metadata for the artifact manifest. - Annotations map[string]string `json:"annotations,omitempty"` -} diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go b/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go index ffff4b6d18..36b0aeb8f1 100644 --- a/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go +++ b/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go @@ -48,6 +48,17 @@ type ImageConfig struct { // StopSignal contains the system call signal that will be sent to the container to exit. StopSignal string `json:"StopSignal,omitempty"` + + // ArgsEscaped + // + // Deprecated: This field is present only for legacy compatibility with + // Docker and should not be used by new image builders. It is used by Docker + // for Windows images to indicate that the `Entrypoint` or `Cmd` or both, + // contains only a single element array, that is a pre-escaped, and combined + // into a single string `CommandLine`. If `true` the value in `Entrypoint` or + // `Cmd` should be used as-is to avoid double escaping. + // https://github.com/opencontainers/image-spec/pull/892 + ArgsEscaped bool `json:"ArgsEscaped,omitempty"` } // RootFS describes a layer content addresses @@ -86,22 +97,8 @@ type Image struct { // Author defines the name and/or email address of the person or entity which created and is responsible for maintaining the image. Author string `json:"author,omitempty"` - // Architecture is the CPU architecture which the binaries in this image are built to run on. - Architecture string `json:"architecture"` - - // Variant is the variant of the specified CPU architecture which image binaries are intended to run on. - Variant string `json:"variant,omitempty"` - - // OS is the name of the operating system which the image is built to run on. - OS string `json:"os"` - - // OSVersion is an optional field specifying the operating system - // version, for example on Windows `10.0.14393.1066`. - OSVersion string `json:"os.version,omitempty"` - - // OSFeatures is an optional field specifying an array of strings, - // each listing a required OS feature (for example on Windows `win32k`). - OSFeatures []string `json:"os.features,omitempty"` + // Platform describes the platform which the image in the manifest runs on. + Platform // Config defines the execution parameters which should be used as a base when running a container using the image. Config ImageConfig `json:"config,omitempty"` diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go b/vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go index 9654aa5af6..3004e9a40d 100644 --- a/vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go +++ b/vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go @@ -52,7 +52,7 @@ type Descriptor struct { // Platform describes the platform which the image in the manifest runs on. type Platform struct { // Architecture field specifies the CPU architecture, for example - // `amd64` or `ppc64`. + // `amd64` or `ppc64le`. Architecture string `json:"architecture"` // OS specifies the operating system, for example `linux` or `windows`. @@ -70,3 +70,11 @@ type Platform struct { // example `v7` to specify ARMv7 when architecture is `arm`. Variant string `json:"variant,omitempty"` } + +// DescriptorEmptyJSON is the descriptor of a blob with content of `{}`. +var DescriptorEmptyJSON = Descriptor{ + MediaType: MediaTypeEmptyJSON, + Digest: `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a`, + Size: 2, + Data: []byte(`{}`), +} diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/v1/index.go b/vendor/github.com/opencontainers/image-spec/specs-go/v1/index.go index ed4a56e59e..e2bed9d4e4 100644 --- a/vendor/github.com/opencontainers/image-spec/specs-go/v1/index.go +++ b/vendor/github.com/opencontainers/image-spec/specs-go/v1/index.go @@ -24,9 +24,15 @@ type Index struct { // MediaType specifies the type of this document data structure e.g. `application/vnd.oci.image.index.v1+json` MediaType string `json:"mediaType,omitempty"` + // ArtifactType specifies the IANA media type of artifact when the manifest is used for an artifact. + ArtifactType string `json:"artifactType,omitempty"` + // Manifests references platform specific manifests. Manifests []Descriptor `json:"manifests"` + // Subject is an optional link from the image manifest to another manifest forming an association between the image manifest and the other manifest. + Subject *Descriptor `json:"subject,omitempty"` + // Annotations contains arbitrary metadata for the image index. Annotations map[string]string `json:"annotations,omitempty"` } diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go b/vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go index 730a09359b..26fec52a6b 100644 --- a/vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go +++ b/vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go @@ -23,6 +23,9 @@ type Manifest struct { // MediaType specifies the type of this document data structure e.g. `application/vnd.oci.image.manifest.v1+json` MediaType string `json:"mediaType,omitempty"` + // ArtifactType specifies the IANA media type of artifact when the manifest is used for an artifact. + ArtifactType string `json:"artifactType,omitempty"` + // Config references a configuration object for a container, by digest. // The referenced configuration object is a JSON blob that the runtime uses to set up the container. Config Descriptor `json:"config"` diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go b/vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go index 935b481e3e..892ba3de9d 100644 --- a/vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go +++ b/vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go @@ -40,21 +40,36 @@ const ( // MediaTypeImageLayerNonDistributable is the media type for layers referenced by // the manifest but with distribution restrictions. + // + // Deprecated: Non-distributable layers are deprecated, and not recommended + // for future use. Implementations SHOULD NOT produce new non-distributable + // layers. + // https://github.com/opencontainers/image-spec/pull/965 MediaTypeImageLayerNonDistributable = "application/vnd.oci.image.layer.nondistributable.v1.tar" // MediaTypeImageLayerNonDistributableGzip is the media type for // gzipped layers referenced by the manifest but with distribution // restrictions. + // + // Deprecated: Non-distributable layers are deprecated, and not recommended + // for future use. Implementations SHOULD NOT produce new non-distributable + // layers. + // https://github.com/opencontainers/image-spec/pull/965 MediaTypeImageLayerNonDistributableGzip = "application/vnd.oci.image.layer.nondistributable.v1.tar+gzip" // MediaTypeImageLayerNonDistributableZstd is the media type for zstd // compressed layers referenced by the manifest but with distribution // restrictions. + // + // Deprecated: Non-distributable layers are deprecated, and not recommended + // for future use. Implementations SHOULD NOT produce new non-distributable + // layers. + // https://github.com/opencontainers/image-spec/pull/965 MediaTypeImageLayerNonDistributableZstd = "application/vnd.oci.image.layer.nondistributable.v1.tar+zstd" // MediaTypeImageConfig specifies the media type for the image configuration. MediaTypeImageConfig = "application/vnd.oci.image.config.v1+json" - // MediaTypeArtifactManifest specifies the media type for a content descriptor. - MediaTypeArtifactManifest = "application/vnd.oci.artifact.manifest.v1+json" + // MediaTypeEmptyJSON specifies the media type for an unused blob containing the value `{}` + MediaTypeEmptyJSON = "application/vnd.oci.empty.v1+json" ) diff --git a/vendor/github.com/opencontainers/image-spec/specs-go/version.go b/vendor/github.com/opencontainers/image-spec/specs-go/version.go index d279035796..e3b7ac03a9 100644 --- a/vendor/github.com/opencontainers/image-spec/specs-go/version.go +++ b/vendor/github.com/opencontainers/image-spec/specs-go/version.go @@ -25,7 +25,7 @@ const ( VersionPatch = 0 // VersionDev indicates development branch. Releases will be empty string. - VersionDev = "-rc2" + VersionDev = "-rc.4" ) // Version is the specification version that the package types support. diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/user.go b/vendor/github.com/opencontainers/runc/libcontainer/user/user.go index 2473c5eadd..a1e216683d 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/user.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/user/user.go @@ -280,13 +280,13 @@ func GetExecUserPath(userSpec string, defaults *ExecUser, passwdPath, groupPath // found in any entry in passwd and group respectively. // // Examples of valid user specifications are: -// * "" -// * "user" -// * "uid" -// * "user:group" -// * "uid:gid -// * "user:gid" -// * "uid:group" +// - "" +// - "user" +// - "uid" +// - "user:group" +// - "uid:gid +// - "user:gid" +// - "uid:group" // // It should be noted that if you specify a numeric user or group id, they will // not be evaluated as usernames (only the metadata will be filled). So attempting diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go index 6a7a91e559..4e7717d53f 100644 --- a/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go @@ -12,10 +12,12 @@ type Spec struct { Root *Root `json:"root,omitempty"` // Hostname configures the container's hostname. Hostname string `json:"hostname,omitempty"` + // Domainname configures the container's domainname. + Domainname string `json:"domainname,omitempty"` // Mounts configures additional mounts (on top of Root). Mounts []Mount `json:"mounts,omitempty"` // Hooks configures callbacks for container lifecycle events. - Hooks *Hooks `json:"hooks,omitempty" platform:"linux,solaris"` + Hooks *Hooks `json:"hooks,omitempty" platform:"linux,solaris,zos"` // Annotations contains arbitrary metadata for the container. Annotations map[string]string `json:"annotations,omitempty"` @@ -27,6 +29,36 @@ type Spec struct { Windows *Windows `json:"windows,omitempty" platform:"windows"` // VM specifies configuration for virtual-machine-based containers. VM *VM `json:"vm,omitempty" platform:"vm"` + // ZOS is platform-specific configuration for z/OS based containers. + ZOS *ZOS `json:"zos,omitempty" platform:"zos"` +} + +// Scheduler represents the scheduling attributes for a process. It is based on +// the Linux sched_setattr(2) syscall. +type Scheduler struct { + // Policy represents the scheduling policy (e.g., SCHED_FIFO, SCHED_RR, SCHED_OTHER). + Policy LinuxSchedulerPolicy `json:"policy"` + + // Nice is the nice value for the process, which affects its priority. + Nice int32 `json:"nice,omitempty"` + + // Priority represents the static priority of the process. + Priority int32 `json:"priority,omitempty"` + + // Flags is an array of scheduling flags. + Flags []LinuxSchedulerFlag `json:"flags,omitempty"` + + // The following ones are used by the DEADLINE scheduler. + + // Runtime is the amount of time in nanoseconds during which the process + // is allowed to run in a given period. + Runtime uint64 `json:"runtime,omitempty"` + + // Deadline is the absolute deadline for the process to complete its execution. + Deadline uint64 `json:"deadline,omitempty"` + + // Period is the length of the period in nanoseconds used for determining the process runtime. + Period uint64 `json:"period,omitempty"` } // Process contains information to start a specific application inside the container. @@ -49,15 +81,19 @@ type Process struct { // Capabilities are Linux capabilities that are kept for the process. Capabilities *LinuxCapabilities `json:"capabilities,omitempty" platform:"linux"` // Rlimits specifies rlimit options to apply to the process. - Rlimits []POSIXRlimit `json:"rlimits,omitempty" platform:"linux,solaris"` + Rlimits []POSIXRlimit `json:"rlimits,omitempty" platform:"linux,solaris,zos"` // NoNewPrivileges controls whether additional privileges could be gained by processes in the container. NoNewPrivileges bool `json:"noNewPrivileges,omitempty" platform:"linux"` // ApparmorProfile specifies the apparmor profile for the container. ApparmorProfile string `json:"apparmorProfile,omitempty" platform:"linux"` // Specify an oom_score_adj for the container. OOMScoreAdj *int `json:"oomScoreAdj,omitempty" platform:"linux"` + // Scheduler specifies the scheduling attributes for a process + Scheduler *Scheduler `json:"scheduler,omitempty" platform:"linux"` // SelinuxLabel specifies the selinux context that the container process is run as. SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"` + // IOPriority contains the I/O priority settings for the cgroup. + IOPriority *LinuxIOPriority `json:"ioPriority,omitempty" platform:"linux"` } // LinuxCapabilities specifies the list of allowed capabilities that are kept for a process. @@ -75,6 +111,22 @@ type LinuxCapabilities struct { Ambient []string `json:"ambient,omitempty" platform:"linux"` } +// IOPriority represents I/O priority settings for the container's processes within the process group. +type LinuxIOPriority struct { + Class IOPriorityClass `json:"class"` + Priority int `json:"priority"` +} + +// IOPriorityClass represents an I/O scheduling class. +type IOPriorityClass string + +// Possible values for IOPriorityClass. +const ( + IOPRIO_CLASS_RT IOPriorityClass = "IOPRIO_CLASS_RT" + IOPRIO_CLASS_BE IOPriorityClass = "IOPRIO_CLASS_BE" + IOPRIO_CLASS_IDLE IOPriorityClass = "IOPRIO_CLASS_IDLE" +) + // Box specifies dimensions of a rectangle. Used for specifying the size of a console. type Box struct { // Height is the vertical dimension of a box. @@ -86,11 +138,11 @@ type Box struct { // User specifies specific user (and group) information for the container process. type User struct { // UID is the user id. - UID uint32 `json:"uid" platform:"linux,solaris"` + UID uint32 `json:"uid" platform:"linux,solaris,zos"` // GID is the group id. - GID uint32 `json:"gid" platform:"linux,solaris"` + GID uint32 `json:"gid" platform:"linux,solaris,zos"` // Umask is the umask for the init process. - Umask *uint32 `json:"umask,omitempty" platform:"linux,solaris"` + Umask *uint32 `json:"umask,omitempty" platform:"linux,solaris,zos"` // AdditionalGids are additional group ids set for the container's process. AdditionalGids []uint32 `json:"additionalGids,omitempty" platform:"linux,solaris"` // Username is the user name. @@ -110,11 +162,16 @@ type Mount struct { // Destination is the absolute path where the mount will be placed in the container. Destination string `json:"destination"` // Type specifies the mount kind. - Type string `json:"type,omitempty" platform:"linux,solaris"` + Type string `json:"type,omitempty" platform:"linux,solaris,zos"` // Source specifies the source path of the mount. Source string `json:"source,omitempty"` // Options are fstab style mount options. Options []string `json:"options,omitempty"` + + // UID/GID mappings used for changing file owners w/o calling chown, fs should support it. + // Every mount point could have its own mapping. + UIDMappings []LinuxIDMapping `json:"uidMappings,omitempty" platform:"linux"` + GIDMappings []LinuxIDMapping `json:"gidMappings,omitempty" platform:"linux"` } // Hook specifies a command that is run at a particular event in the lifecycle of a container @@ -178,10 +235,12 @@ type Linux struct { // MountLabel specifies the selinux context for the mounts in the container. MountLabel string `json:"mountLabel,omitempty"` // IntelRdt contains Intel Resource Director Technology (RDT) information for - // handling resource constraints (e.g., L3 cache, memory bandwidth) for the container + // handling resource constraints and monitoring metrics (e.g., L3 cache, memory bandwidth) for the container IntelRdt *LinuxIntelRdt `json:"intelRdt,omitempty"` // Personality contains configuration for the Linux personality syscall Personality *LinuxPersonality `json:"personality,omitempty"` + // TimeOffsets specifies the offset for supporting time namespaces. + TimeOffsets map[string]LinuxTimeOffset `json:"timeOffsets,omitempty"` } // LinuxNamespace is the configuration for a Linux namespace @@ -211,6 +270,8 @@ const ( UserNamespace LinuxNamespaceType = "user" // CgroupNamespace for isolating cgroup hierarchies CgroupNamespace LinuxNamespaceType = "cgroup" + // TimeNamespace for isolating the clocks + TimeNamespace LinuxNamespaceType = "time" ) // LinuxIDMapping specifies UID/GID mappings @@ -223,6 +284,14 @@ type LinuxIDMapping struct { Size uint32 `json:"size"` } +// LinuxTimeOffset specifies the offset for Time Namespace +type LinuxTimeOffset struct { + // Secs is the offset of clock (in secs) in the container + Secs int64 `json:"secs,omitempty"` + // Nanosecs is the additional offset for Secs (in nanosecs) + Nanosecs uint32 `json:"nanosecs,omitempty"` +} + // POSIXRlimit type and restrictions type POSIXRlimit struct { // Type of the rlimit to set @@ -233,12 +302,13 @@ type POSIXRlimit struct { Soft uint64 `json:"soft"` } -// LinuxHugepageLimit structure corresponds to limiting kernel hugepages +// LinuxHugepageLimit structure corresponds to limiting kernel hugepages. +// Default to reservation limits if supported. Otherwise fallback to page fault limits. type LinuxHugepageLimit struct { - // Pagesize is the hugepage size - // Format: "B' (e.g. 64KB, 2MB, 1GB, etc.) + // Pagesize is the hugepage size. + // Format: "B' (e.g. 64KB, 2MB, 1GB, etc.). Pagesize string `json:"pageSize"` - // Limit is the limit of "hugepagesize" hugetlb usage + // Limit is the limit of "hugepagesize" hugetlb reservations (if supported) or usage. Limit uint64 `json:"limit"` } @@ -250,8 +320,8 @@ type LinuxInterfacePriority struct { Priority uint32 `json:"priority"` } -// linuxBlockIODevice holds major:minor format supported in blkio cgroup -type linuxBlockIODevice struct { +// LinuxBlockIODevice holds major:minor format supported in blkio cgroup +type LinuxBlockIODevice struct { // Major is the device's major number. Major int64 `json:"major"` // Minor is the device's minor number. @@ -260,7 +330,7 @@ type linuxBlockIODevice struct { // LinuxWeightDevice struct holds a `major:minor weight` pair for weightDevice type LinuxWeightDevice struct { - linuxBlockIODevice + LinuxBlockIODevice // Weight is the bandwidth rate for the device. Weight *uint16 `json:"weight,omitempty"` // LeafWeight is the bandwidth rate for the device while competing with the cgroup's child cgroups, CFQ scheduler only @@ -269,7 +339,7 @@ type LinuxWeightDevice struct { // LinuxThrottleDevice struct holds a `major:minor rate_per_second` pair type LinuxThrottleDevice struct { - linuxBlockIODevice + LinuxBlockIODevice // Rate is the IO rate limit per cgroup per device Rate uint64 `json:"rate"` } @@ -310,6 +380,10 @@ type LinuxMemory struct { DisableOOMKiller *bool `json:"disableOOMKiller,omitempty"` // Enables hierarchical memory accounting UseHierarchy *bool `json:"useHierarchy,omitempty"` + // CheckBeforeUpdate enables checking if a new memory limit is lower + // than the current usage during update, and if so, rejecting the new + // limit. + CheckBeforeUpdate *bool `json:"checkBeforeUpdate,omitempty"` } // LinuxCPU for Linux cgroup 'cpu' resource management @@ -318,6 +392,9 @@ type LinuxCPU struct { Shares *uint64 `json:"shares,omitempty"` // CPU hardcap limit (in usecs). Allowed cpu time in a given period. Quota *int64 `json:"quota,omitempty"` + // CPU hardcap burst limit (in usecs). Allowed accumulated cpu time additionally for burst in a + // given period. + Burst *uint64 `json:"burst,omitempty"` // CPU period to be used for hardcapping (in usecs). Period *uint64 `json:"period,omitempty"` // How much time realtime scheduling may use (in usecs). @@ -328,6 +405,8 @@ type LinuxCPU struct { Cpus string `json:"cpus,omitempty"` // List of memory nodes in the cpuset. Default is to use any available memory node. Mems string `json:"mems,omitempty"` + // cgroups are configured with minimum weight, 0: default behavior, 1: SCHED_IDLE. + Idle *int64 `json:"idle,omitempty"` } // LinuxPids for Linux cgroup 'pids' resource management (Linux 4.3) @@ -364,7 +443,7 @@ type LinuxResources struct { Pids *LinuxPids `json:"pids,omitempty"` // BlockIO restriction configuration BlockIO *LinuxBlockIO `json:"blockIO,omitempty"` - // Hugetlb limit (in bytes) + // Hugetlb limits (in bytes). Default to reservation limits if supported. HugepageLimits []LinuxHugepageLimit `json:"hugepageLimits,omitempty"` // Network restriction configuration Network *LinuxNetwork `json:"network,omitempty"` @@ -522,11 +601,21 @@ type WindowsMemoryResources struct { // WindowsCPUResources contains CPU resource management settings. type WindowsCPUResources struct { - // Number of CPUs available to the container. + // Count is the number of CPUs available to the container. It represents the + // fraction of the configured processor `count` in a container in relation + // to the processors available in the host. The fraction ultimately + // determines the portion of processor cycles that the threads in a + // container can use during each scheduling interval, as the number of + // cycles per 10,000 cycles. Count *uint64 `json:"count,omitempty"` - // CPU shares (relative weight to other containers with cpu shares). + // Shares limits the share of processor time given to the container relative + // to other workloads on the processor. The processor `shares` (`weight` at + // the platform level) is a value between 0 and 10000. Shares *uint16 `json:"shares,omitempty"` - // Specifies the portion of processor cycles that this container can use as a percentage times 100. + // Maximum determines the portion of processor cycles that the threads in a + // container can use during each scheduling interval, as the number of + // cycles per 10,000 cycles. Set processor `maximum` to a percentage times + // 100. Maximum *uint16 `json:"maximum,omitempty"` } @@ -613,6 +702,23 @@ type Arch string // LinuxSeccompFlag is a flag to pass to seccomp(2). type LinuxSeccompFlag string +const ( + // LinuxSeccompFlagLog is a seccomp flag to request all returned + // actions except SECCOMP_RET_ALLOW to be logged. An administrator may + // override this filter flag by preventing specific actions from being + // logged via the /proc/sys/kernel/seccomp/actions_logged file. (since + // Linux 4.14) + LinuxSeccompFlagLog LinuxSeccompFlag = "SECCOMP_FILTER_FLAG_LOG" + + // LinuxSeccompFlagSpecAllow can be used to disable Speculative Store + // Bypass mitigation. (since Linux 4.17) + LinuxSeccompFlagSpecAllow LinuxSeccompFlag = "SECCOMP_FILTER_FLAG_SPEC_ALLOW" + + // LinuxSeccompFlagWaitKillableRecv can be used to switch to the wait + // killable semantics. (since Linux 5.19) + LinuxSeccompFlagWaitKillableRecv LinuxSeccompFlag = "SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV" +) + // Additional architectures permitted to be used for system calls // By default only the native architecture of the kernel is permitted const ( @@ -683,8 +789,9 @@ type LinuxSyscall struct { Args []LinuxSeccompArg `json:"args,omitempty"` } -// LinuxIntelRdt has container runtime resource constraints for Intel RDT -// CAT and MBA features which introduced in Linux 4.10 and 4.12 kernel +// LinuxIntelRdt has container runtime resource constraints for Intel RDT CAT and MBA +// features and flags enabling Intel RDT CMT and MBM features. +// Intel RDT features are available in Linux 4.14 and newer kernel versions. type LinuxIntelRdt struct { // The identity for RDT Class of Service ClosID string `json:"closID,omitempty"` @@ -697,4 +804,76 @@ type LinuxIntelRdt struct { // The unit of memory bandwidth is specified in "percentages" by // default, and in "MBps" if MBA Software Controller is enabled. MemBwSchema string `json:"memBwSchema,omitempty"` + + // EnableCMT is the flag to indicate if the Intel RDT CMT is enabled. CMT (Cache Monitoring Technology) supports monitoring of + // the last-level cache (LLC) occupancy for the container. + EnableCMT bool `json:"enableCMT,omitempty"` + + // EnableMBM is the flag to indicate if the Intel RDT MBM is enabled. MBM (Memory Bandwidth Monitoring) supports monitoring of + // total and local memory bandwidth for the container. + EnableMBM bool `json:"enableMBM,omitempty"` +} + +// ZOS contains platform-specific configuration for z/OS based containers. +type ZOS struct { + // Devices are a list of device nodes that are created for the container + Devices []ZOSDevice `json:"devices,omitempty"` } + +// ZOSDevice represents the mknod information for a z/OS special device file +type ZOSDevice struct { + // Path to the device. + Path string `json:"path"` + // Device type, block, char, etc. + Type string `json:"type"` + // Major is the device's major number. + Major int64 `json:"major"` + // Minor is the device's minor number. + Minor int64 `json:"minor"` + // FileMode permission bits for the device. + FileMode *os.FileMode `json:"fileMode,omitempty"` + // UID of the device. + UID *uint32 `json:"uid,omitempty"` + // Gid of the device. + GID *uint32 `json:"gid,omitempty"` +} + +// LinuxSchedulerPolicy represents different scheduling policies used with the Linux Scheduler +type LinuxSchedulerPolicy string + +const ( + // SchedOther is the default scheduling policy + SchedOther LinuxSchedulerPolicy = "SCHED_OTHER" + // SchedFIFO is the First-In-First-Out scheduling policy + SchedFIFO LinuxSchedulerPolicy = "SCHED_FIFO" + // SchedRR is the Round-Robin scheduling policy + SchedRR LinuxSchedulerPolicy = "SCHED_RR" + // SchedBatch is the Batch scheduling policy + SchedBatch LinuxSchedulerPolicy = "SCHED_BATCH" + // SchedISO is the Isolation scheduling policy + SchedISO LinuxSchedulerPolicy = "SCHED_ISO" + // SchedIdle is the Idle scheduling policy + SchedIdle LinuxSchedulerPolicy = "SCHED_IDLE" + // SchedDeadline is the Deadline scheduling policy + SchedDeadline LinuxSchedulerPolicy = "SCHED_DEADLINE" +) + +// LinuxSchedulerFlag represents the flags used by the Linux Scheduler. +type LinuxSchedulerFlag string + +const ( + // SchedFlagResetOnFork represents the reset on fork scheduling flag + SchedFlagResetOnFork LinuxSchedulerFlag = "SCHED_FLAG_RESET_ON_FORK" + // SchedFlagReclaim represents the reclaim scheduling flag + SchedFlagReclaim LinuxSchedulerFlag = "SCHED_FLAG_RECLAIM" + // SchedFlagDLOverrun represents the deadline overrun scheduling flag + SchedFlagDLOverrun LinuxSchedulerFlag = "SCHED_FLAG_DL_OVERRUN" + // SchedFlagKeepPolicy represents the keep policy scheduling flag + SchedFlagKeepPolicy LinuxSchedulerFlag = "SCHED_FLAG_KEEP_POLICY" + // SchedFlagKeepParams represents the keep parameters scheduling flag + SchedFlagKeepParams LinuxSchedulerFlag = "SCHED_FLAG_KEEP_PARAMS" + // SchedFlagUtilClampMin represents the utilization clamp minimum scheduling flag + SchedFlagUtilClampMin LinuxSchedulerFlag = "SCHED_FLAG_UTIL_CLAMP_MIN" + // SchedFlagUtilClampMin represents the utilization clamp maximum scheduling flag + SchedFlagUtilClampMax LinuxSchedulerFlag = "SCHED_FLAG_UTIL_CLAMP_MAX" +) diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go index 596af0c2fd..41933fb171 100644 --- a/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go @@ -6,12 +6,12 @@ const ( // VersionMajor is for an API incompatible changes VersionMajor = 1 // VersionMinor is for functionality in a backwards-compatible manner - VersionMinor = 0 + VersionMinor = 1 // VersionPatch is for backwards-compatible bug fixes - VersionPatch = 2 + VersionPatch = 0 // VersionDev indicates development branch. Releases will be empty string. - VersionDev = "-dev" + VersionDev = "-rc.3" ) // Version is the specification version that the package types support. diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/label/label.go b/vendor/github.com/opencontainers/selinux/go-selinux/label/label.go index fea096c180..07e0f77dc2 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/label/label.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/label/label.go @@ -78,6 +78,9 @@ func ReleaseLabel(label string) error { // Deprecated: use selinux.DupSecOpt var DupSecOpt = selinux.DupSecOpt +// FormatMountLabel returns a string to be used by the mount command. Using +// the SELinux `context` mount option. Changing labels of files on mount +// points with this option can never be changed. // FormatMountLabel returns a string to be used by the mount command. // The format of this string will be used to alter the labeling of the mountpoint. // The string returned is suitable to be used as the options field of the mount command. @@ -85,12 +88,27 @@ var DupSecOpt = selinux.DupSecOpt // the first parameter. Second parameter is the label that you wish to apply // to all content in the mount point. func FormatMountLabel(src, mountLabel string) string { + return FormatMountLabelByType(src, mountLabel, "context") +} + +// FormatMountLabelByType returns a string to be used by the mount command. +// Allow caller to specify the mount options. For example using the SELinux +// `fscontext` mount option would allow certain container processes to change +// labels of files created on the mount points, where as `context` option does +// not. +// FormatMountLabelByType returns a string to be used by the mount command. +// The format of this string will be used to alter the labeling of the mountpoint. +// The string returned is suitable to be used as the options field of the mount command. +// If you need to have additional mount point options, you can pass them in as +// the first parameter. Second parameter is the label that you wish to apply +// to all content in the mount point. +func FormatMountLabelByType(src, mountLabel, contextType string) string { if mountLabel != "" { switch src { case "": - src = fmt.Sprintf("context=%q", mountLabel) + src = fmt.Sprintf("%s=%q", contextType, mountLabel) default: - src = fmt.Sprintf("%s,context=%q", src, mountLabel) + src = fmt.Sprintf("%s,%s=%q", src, contextType, mountLabel) } } return src diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/rchcon.go b/vendor/github.com/opencontainers/selinux/go-selinux/rchcon.go deleted file mode 100644 index 8bff293557..0000000000 --- a/vendor/github.com/opencontainers/selinux/go-selinux/rchcon.go +++ /dev/null @@ -1,34 +0,0 @@ -//go:build linux && go1.16 -// +build linux,go1.16 - -package selinux - -import ( - "errors" - "io/fs" - "os" - - "github.com/opencontainers/selinux/pkg/pwalkdir" -) - -func rchcon(fpath, label string) error { - fastMode := false - // If the current label matches the new label, assume - // other labels are correct. - if cLabel, err := lFileLabel(fpath); err == nil && cLabel == label { - fastMode = true - } - return pwalkdir.Walk(fpath, func(p string, _ fs.DirEntry, _ error) error { - if fastMode { - if cLabel, err := lFileLabel(fpath); err == nil && cLabel == label { - return nil - } - } - e := lSetFileLabel(p, label) - // Walk a file tree can race with removal, so ignore ENOENT. - if errors.Is(e, os.ErrNotExist) { - return nil - } - return e - }) -} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/rchcon_go115.go b/vendor/github.com/opencontainers/selinux/go-selinux/rchcon_go115.go deleted file mode 100644 index 303cb1890a..0000000000 --- a/vendor/github.com/opencontainers/selinux/go-selinux/rchcon_go115.go +++ /dev/null @@ -1,22 +0,0 @@ -//go:build linux && !go1.16 -// +build linux,!go1.16 - -package selinux - -import ( - "errors" - "os" - - "github.com/opencontainers/selinux/pkg/pwalk" -) - -func rchcon(fpath, label string) error { - return pwalk.Walk(fpath, func(p string, _ os.FileInfo, _ error) error { - e := lSetFileLabel(p, label) - // Walk a file tree can race with removal, so ignore ENOENT. - if errors.Is(e, os.ErrNotExist) { - return nil - } - return e - }) -} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go b/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go index 5a59d151f6..af058b84b1 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go @@ -23,8 +23,13 @@ var ( // ErrEmptyPath is returned when an empty path has been specified. ErrEmptyPath = errors.New("empty path") + // ErrInvalidLabel is returned when an invalid label is specified. + ErrInvalidLabel = errors.New("invalid Label") + // InvalidLabel is returned when an invalid label is specified. - InvalidLabel = errors.New("Invalid Label") + // + // Deprecated: use [ErrInvalidLabel]. + InvalidLabel = ErrInvalidLabel // ErrIncomparable is returned two levels are not comparable ErrIncomparable = errors.New("incomparable levels") @@ -144,7 +149,7 @@ func CalculateGlbLub(sourceRange, targetRange string) (string, error) { // of the program is finished to guarantee another goroutine does not migrate to the current // thread before execution is complete. func SetExecLabel(label string) error { - return setExecLabel(label) + return writeCon(attrPath("exec"), label) } // SetTaskLabel sets the SELinux label for the current thread, or an error. @@ -152,21 +157,21 @@ func SetExecLabel(label string) error { // be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() to guarantee // the current thread does not run in a new mislabeled thread. func SetTaskLabel(label string) error { - return setTaskLabel(label) + return writeCon(attrPath("current"), label) } // SetSocketLabel takes a process label and tells the kernel to assign the // label to the next socket that gets created. Calls to SetSocketLabel // should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until -// the the socket is created to guarantee another goroutine does not migrate +// the socket is created to guarantee another goroutine does not migrate // to the current thread before execution is complete. func SetSocketLabel(label string) error { - return setSocketLabel(label) + return writeCon(attrPath("sockcreate"), label) } // SocketLabel retrieves the current socket label setting func SocketLabel() (string, error) { - return socketLabel() + return readCon(attrPath("sockcreate")) } // PeerLabel retrieves the label of the client on the other side of a socket @@ -185,7 +190,7 @@ func SetKeyLabel(label string) error { // KeyLabel retrieves the current kernel keyring label setting func KeyLabel() (string, error) { - return keyLabel() + return readCon("/proc/self/attr/keycreate") } // Get returns the Context as a string @@ -208,6 +213,11 @@ func ReserveLabel(label string) { reserveLabel(label) } +// MLSEnabled checks if MLS is enabled. +func MLSEnabled() bool { + return isMLSEnabled() +} + // EnforceMode returns the current SELinux mode Enforcing, Permissive, Disabled func EnforceMode() int { return enforceMode() @@ -220,7 +230,7 @@ func SetEnforceMode(mode int) error { } // DefaultEnforceMode returns the systems default SELinux mode Enforcing, -// Permissive or Disabled. Note this is is just the default at boot time. +// Permissive or Disabled. Note this is just the default at boot time. // EnforceMode tells you the systems current mode. func DefaultEnforceMode() int { return defaultEnforceMode() @@ -266,7 +276,7 @@ func CopyLevel(src, dest string) (string, error) { return copyLevel(src, dest) } -// Chcon changes the fpath file object to the SELinux label label. +// Chcon changes the fpath file object to the SELinux label. // If fpath is a directory and recurse is true, then Chcon walks the // directory tree setting the label. // @@ -284,7 +294,7 @@ func DupSecOpt(src string) ([]string, error) { // DisableSecOpt returns a security opt that can be used to disable SELinux // labeling support for future container processes. func DisableSecOpt() []string { - return disableSecOpt() + return []string{"disable"} } // GetDefaultContextWithLevel gets a single context for the specified SELinux user diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go index 4582cc9e0a..f1e95977d3 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go @@ -8,16 +8,16 @@ import ( "errors" "fmt" "io" - "io/ioutil" + "io/fs" "math/big" "os" "os/user" - "path" "path/filepath" "strconv" "strings" "sync" + "github.com/opencontainers/selinux/pkg/pwalkdir" "golang.org/x/sys/unix" ) @@ -35,17 +35,17 @@ const ( ) type selinuxState struct { + mcsList map[string]bool + selinuxfs string + selinuxfsOnce sync.Once enabledSet bool enabled bool - selinuxfsOnce sync.Once - selinuxfs string - mcsList map[string]bool sync.Mutex } type level struct { - sens uint cats *big.Int + sens uint } type mlsRange struct { @@ -54,10 +54,10 @@ type mlsRange struct { } type defaultSECtx struct { - user, level, scon string - userRdr, defaultRdr io.Reader - - verifier func(string) error + userRdr io.Reader + verifier func(string) error + defaultRdr io.Reader + user, level, scon string } type levelItem byte @@ -155,7 +155,7 @@ func findSELinuxfs() string { } // check if selinuxfs is available before going the slow path - fs, err := ioutil.ReadFile("/proc/filesystems") + fs, err := os.ReadFile("/proc/filesystems") if err != nil { return "" } @@ -292,7 +292,7 @@ func readCon(fpath string) (string, error) { } func readConFd(in *os.File) (string, error) { - data, err := ioutil.ReadAll(in) + data, err := io.ReadAll(in) if err != nil { return "", err } @@ -305,7 +305,7 @@ func classIndex(class string) (int, error) { permpath := fmt.Sprintf("class/%s/index", class) indexpath := filepath.Join(getSelinuxMountPoint(), permpath) - indexB, err := ioutil.ReadFile(indexpath) + indexB, err := os.ReadFile(indexpath) if err != nil { return -1, err } @@ -391,21 +391,19 @@ func lFileLabel(fpath string) (string, error) { return string(label), nil } -// setFSCreateLabel tells kernel the label to create all file system objects -// created by this task. Setting label="" to return to default. func setFSCreateLabel(label string) error { - return writeAttr("fscreate", label) + return writeCon(attrPath("fscreate"), label) } // fsCreateLabel returns the default label the kernel which the kernel is using // for file system objects created by this task. "" indicates default. func fsCreateLabel() (string, error) { - return readAttr("fscreate") + return readCon(attrPath("fscreate")) } // currentLabel returns the SELinux label of the current process thread, or an error. func currentLabel() (string, error) { - return readAttr("current") + return readCon(attrPath("current")) } // pidLabel returns the SELinux label of the given pid, or an error. @@ -416,7 +414,7 @@ func pidLabel(pid int) (string, error) { // ExecLabel returns the SELinux label that the kernel will use for any programs // that are executed by the current process thread, or an error. func execLabel() (string, error) { - return readAttr("exec") + return readCon(attrPath("exec")) } func writeCon(fpath, val string) error { @@ -462,18 +460,10 @@ func attrPath(attr string) string { }) if haveThreadSelf { - return path.Join(threadSelfPrefix, attr) + return filepath.Join(threadSelfPrefix, attr) } - return path.Join("/proc/self/task/", strconv.Itoa(unix.Gettid()), "/attr/", attr) -} - -func readAttr(attr string) (string, error) { - return readCon(attrPath(attr)) -} - -func writeAttr(attr, val string) error { - return writeCon(attrPath(attr), val) + return filepath.Join("/proc/self/task", strconv.Itoa(unix.Gettid()), "attr", attr) } // canonicalizeContext takes a context string and writes it to the kernel @@ -560,30 +550,30 @@ func (l *level) parseLevel(levelStr string) error { // rangeStrToMLSRange marshals a string representation of a range. func rangeStrToMLSRange(rangeStr string) (*mlsRange, error) { - mlsRange := &mlsRange{} - levelSlice := strings.SplitN(rangeStr, "-", 2) + r := &mlsRange{} + l := strings.SplitN(rangeStr, "-", 2) - switch len(levelSlice) { + switch len(l) { // rangeStr that has a low and a high level, e.g. s4:c0.c1023-s6:c0.c1023 case 2: - mlsRange.high = &level{} - if err := mlsRange.high.parseLevel(levelSlice[1]); err != nil { - return nil, fmt.Errorf("failed to parse high level %q: %w", levelSlice[1], err) + r.high = &level{} + if err := r.high.parseLevel(l[1]); err != nil { + return nil, fmt.Errorf("failed to parse high level %q: %w", l[1], err) } fallthrough // rangeStr that is single level, e.g. s6:c0,c3,c5,c30.c1023 case 1: - mlsRange.low = &level{} - if err := mlsRange.low.parseLevel(levelSlice[0]); err != nil { - return nil, fmt.Errorf("failed to parse low level %q: %w", levelSlice[0], err) + r.low = &level{} + if err := r.low.parseLevel(l[0]); err != nil { + return nil, fmt.Errorf("failed to parse low level %q: %w", l[0], err) } } - if mlsRange.high == nil { - mlsRange.high = mlsRange.low + if r.high == nil { + r.high = r.low } - return mlsRange, nil + return r, nil } // bitsetToStr takes a category bitset and returns it in the @@ -617,17 +607,17 @@ func bitsetToStr(c *big.Int) string { return str } -func (l1 *level) equal(l2 *level) bool { - if l2 == nil || l1 == nil { - return l1 == l2 +func (l *level) equal(l2 *level) bool { + if l2 == nil || l == nil { + return l == l2 } - if l1.sens != l2.sens { + if l2.sens != l.sens { return false } - if l2.cats == nil || l1.cats == nil { - return l2.cats == l1.cats + if l2.cats == nil || l.cats == nil { + return l2.cats == l.cats } - return l1.cats.Cmp(l2.cats) == 0 + return l.cats.Cmp(l2.cats) == 0 } // String returns an mlsRange as a string. @@ -721,36 +711,13 @@ func readWriteCon(fpath string, val string) (string, error) { return readConFd(f) } -// setExecLabel sets the SELinux label that the kernel will use for any programs -// that are executed by the current process thread, or an error. -func setExecLabel(label string) error { - return writeAttr("exec", label) -} - -// setTaskLabel sets the SELinux label for the current thread, or an error. -// This requires the dyntransition permission. -func setTaskLabel(label string) error { - return writeAttr("current", label) -} - -// setSocketLabel takes a process label and tells the kernel to assign the -// label to the next socket that gets created -func setSocketLabel(label string) error { - return writeAttr("sockcreate", label) -} - -// socketLabel retrieves the current socket label setting -func socketLabel() (string, error) { - return readAttr("sockcreate") -} - // peerLabel retrieves the label of the client on the other side of a socket func peerLabel(fd uintptr) (string, error) { - label, err := unix.GetsockoptString(int(fd), unix.SOL_SOCKET, unix.SO_PEERSEC) + l, err := unix.GetsockoptString(int(fd), unix.SOL_SOCKET, unix.SO_PEERSEC) if err != nil { return "", &os.PathError{Op: "getsockopt", Path: "fd " + strconv.Itoa(int(fd)), Err: err} } - return label, nil + return l, nil } // setKeyLabel takes a process label and tells the kernel to assign the @@ -766,15 +733,10 @@ func setKeyLabel(label string) error { return err } -// keyLabel retrieves the current kernel keyring label setting -func keyLabel() (string, error) { - return readCon("/proc/self/attr/keycreate") -} - // get returns the Context as a string func (c Context) get() string { - if level := c["level"]; level != "" { - return c["user"] + ":" + c["role"] + ":" + c["type"] + ":" + level + if l := c["level"]; l != "" { + return c["user"] + ":" + c["role"] + ":" + c["type"] + ":" + l } return c["user"] + ":" + c["role"] + ":" + c["type"] } @@ -786,7 +748,7 @@ func newContext(label string) (Context, error) { if len(label) != 0 { con := strings.SplitN(label, ":", 4) if len(con) < 3 { - return c, InvalidLabel + return c, ErrInvalidLabel } c["user"] = con[0] c["role"] = con[1] @@ -816,14 +778,23 @@ func reserveLabel(label string) { } func selinuxEnforcePath() string { - return path.Join(getSelinuxMountPoint(), "enforce") + return filepath.Join(getSelinuxMountPoint(), "enforce") +} + +// isMLSEnabled checks if MLS is enabled. +func isMLSEnabled() bool { + enabledB, err := os.ReadFile(filepath.Join(getSelinuxMountPoint(), "mls")) + if err != nil { + return false + } + return bytes.Equal(enabledB, []byte{'1'}) } // enforceMode returns the current SELinux mode Enforcing, Permissive, Disabled func enforceMode() int { var enforce int - enforceB, err := ioutil.ReadFile(selinuxEnforcePath()) + enforceB, err := os.ReadFile(selinuxEnforcePath()) if err != nil { return -1 } @@ -837,11 +808,12 @@ func enforceMode() int { // setEnforceMode sets the current SELinux mode Enforcing, Permissive. // Disabled is not valid, since this needs to be set at boot time. func setEnforceMode(mode int) error { - return ioutil.WriteFile(selinuxEnforcePath(), []byte(strconv.Itoa(mode)), 0o644) + //nolint:gosec // ignore G306: permissions to be 0600 or less. + return os.WriteFile(selinuxEnforcePath(), []byte(strconv.Itoa(mode)), 0o644) } // defaultEnforceMode returns the systems default SELinux mode Enforcing, -// Permissive or Disabled. Note this is is just the default at boot time. +// Permissive or Disabled. Note this is just the default at boot time. // EnforceMode tells you the systems current mode. func defaultEnforceMode() int { switch readConfig(selinuxTag) { @@ -941,7 +913,7 @@ func openContextFile() (*os.File, error) { if f, err := os.Open(contextFile); err == nil { return f, nil } - return os.Open(filepath.Join(policyRoot(), "/contexts/lxc_contexts")) + return os.Open(filepath.Join(policyRoot(), "contexts", "lxc_contexts")) } func loadLabels() { @@ -1044,7 +1016,8 @@ func addMcs(processLabel, fileLabel string) (string, string) { // securityCheckContext validates that the SELinux label is understood by the kernel func securityCheckContext(val string) error { - return ioutil.WriteFile(path.Join(getSelinuxMountPoint(), "context"), []byte(val), 0o644) + //nolint:gosec // ignore G306: permissions to be 0600 or less. + return os.WriteFile(filepath.Join(getSelinuxMountPoint(), "context"), []byte(val), 0o644) } // copyLevel returns a label with the MLS/MCS level from src label replaced on @@ -1073,7 +1046,7 @@ func copyLevel(src, dest string) (string, error) { return tcon.Get(), nil } -// chcon changes the fpath file object to the SELinux label label. +// chcon changes the fpath file object to the SELinux label. // If fpath is a directory and recurse is true, then chcon walks the // directory tree setting the label. func chcon(fpath string, label string, recurse bool) error { @@ -1084,7 +1057,7 @@ func chcon(fpath string, label string, recurse bool) error { return nil } - exclude_paths := map[string]bool{ + excludePaths := map[string]bool{ "/": true, "/bin": true, "/boot": true, @@ -1112,19 +1085,19 @@ func chcon(fpath string, label string, recurse bool) error { } if home := os.Getenv("HOME"); home != "" { - exclude_paths[home] = true + excludePaths[home] = true } if sudoUser := os.Getenv("SUDO_USER"); sudoUser != "" { if usr, err := user.Lookup(sudoUser); err == nil { - exclude_paths[usr.HomeDir] = true + excludePaths[usr.HomeDir] = true } } if fpath != "/" { fpath = strings.TrimSuffix(fpath, "/") } - if exclude_paths[fpath] { + if excludePaths[fpath] { return fmt.Errorf("SELinux relabeling of %s is not allowed", fpath) } @@ -1152,6 +1125,28 @@ func chcon(fpath string, label string, recurse bool) error { return rchcon(fpath, label) } +func rchcon(fpath, label string) error { //revive:disable:cognitive-complexity + fastMode := false + // If the current label matches the new label, assume + // other labels are correct. + if cLabel, err := lFileLabel(fpath); err == nil && cLabel == label { + fastMode = true + } + return pwalkdir.Walk(fpath, func(p string, _ fs.DirEntry, _ error) error { + if fastMode { + if cLabel, err := lFileLabel(fpath); err == nil && cLabel == label { + return nil + } + } + err := lSetFileLabel(p, label) + // Walk a file tree can race with removal, so ignore ENOENT. + if errors.Is(err, os.ErrNotExist) { + return nil + } + return err + }) +} + // dupSecOpt takes an SELinux process label and returns security options that // can be used to set the SELinux Type and Level for future container processes. func dupSecOpt(src string) ([]string, error) { @@ -1180,12 +1175,6 @@ func dupSecOpt(src string) ([]string, error) { return dup, nil } -// disableSecOpt returns a security opt that can be used to disable SELinux -// labeling support for future container processes. -func disableSecOpt() []string { - return []string{"disable"} -} - // findUserInContext scans the reader for a valid SELinux context // match that is verified with the verifier. Invalid contexts are // skipped. It returns a matched context or an empty string if no diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go index 20d8880312..bc3fd3b370 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go @@ -3,9 +3,20 @@ package selinux -func setDisabled() { +func attrPath(string) string { + return "" +} + +func readCon(fpath string) (string, error) { + return "", nil +} + +func writeCon(string, string) error { + return nil } +func setDisabled() {} + func getEnabled() bool { return false } @@ -62,22 +73,6 @@ func calculateGlbLub(sourceRange, targetRange string) (string, error) { return "", nil } -func setExecLabel(label string) error { - return nil -} - -func setTaskLabel(label string) error { - return nil -} - -func setSocketLabel(label string) error { - return nil -} - -func socketLabel() (string, error) { - return "", nil -} - func peerLabel(fd uintptr) (string, error) { return "", nil } @@ -86,17 +81,12 @@ func setKeyLabel(label string) error { return nil } -func keyLabel() (string, error) { - return "", nil -} - func (c Context) get() string { return "" } func newContext(label string) (Context, error) { - c := make(Context) - return c, nil + return Context{}, nil } func clearLabels() { @@ -105,6 +95,10 @@ func clearLabels() { func reserveLabel(label string) { } +func isMLSEnabled() bool { + return false +} + func enforceMode() int { return Disabled } @@ -152,10 +146,6 @@ func dupSecOpt(src string) ([]string, error) { return nil, nil } -func disableSecOpt() []string { - return []string{"disable"} -} - func getDefaultContextWithLevel(user, level, scon string) (string, error) { return "", nil } diff --git a/vendor/github.com/opencontainers/selinux/pkg/pwalk/README.md b/vendor/github.com/opencontainers/selinux/pkg/pwalk/README.md deleted file mode 100644 index 7e78dce015..0000000000 --- a/vendor/github.com/opencontainers/selinux/pkg/pwalk/README.md +++ /dev/null @@ -1,48 +0,0 @@ -## pwalk: parallel implementation of filepath.Walk - -This is a wrapper for [filepath.Walk](https://pkg.go.dev/path/filepath?tab=doc#Walk) -which may speed it up by calling multiple callback functions (WalkFunc) in parallel, -utilizing goroutines. - -By default, it utilizes 2\*runtime.NumCPU() goroutines for callbacks. -This can be changed by using WalkN function which has the additional -parameter, specifying the number of goroutines (concurrency). - -### pwalk vs pwalkdir - -This package is deprecated in favor of -[pwalkdir](https://pkg.go.dev/github.com/opencontainers/selinux/pkg/pwalkdir), -which is faster, but requires at least Go 1.16. - -### Caveats - -Please note the following limitations of this code: - -* Unlike filepath.Walk, the order of calls is non-deterministic; - -* Only primitive error handling is supported: - - * filepath.SkipDir is not supported; - - * no errors are ever passed to WalkFunc; - - * once any error is returned from any WalkFunc instance, no more new calls - to WalkFunc are made, and the error is returned to the caller of Walk; - - * if more than one walkFunc instance will return an error, only one - of such errors will be propagated and returned by Walk, others - will be silently discarded. - -### Documentation - -For the official documentation, see -https://pkg.go.dev/github.com/opencontainers/selinux/pkg/pwalk?tab=doc - -### Benchmarks - -For a WalkFunc that consists solely of the return statement, this -implementation is about 10% slower than the standard library's -filepath.Walk. - -Otherwise (if a WalkFunc is doing something) this is usually faster, -except when the WalkN(..., 1) is used. diff --git a/vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go b/vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go deleted file mode 100644 index 202c80da59..0000000000 --- a/vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go +++ /dev/null @@ -1,115 +0,0 @@ -package pwalk - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "sync" -) - -type WalkFunc = filepath.WalkFunc - -// Walk is a wrapper for filepath.Walk which can call multiple walkFn -// in parallel, allowing to handle each item concurrently. A maximum of -// twice the runtime.NumCPU() walkFn will be called at any one time. -// If you want to change the maximum, use WalkN instead. -// -// The order of calls is non-deterministic. -// -// Note that this implementation only supports primitive error handling: -// -// - no errors are ever passed to walkFn; -// -// - once a walkFn returns any error, all further processing stops -// and the error is returned to the caller of Walk; -// -// - filepath.SkipDir is not supported; -// -// - if more than one walkFn instance will return an error, only one -// of such errors will be propagated and returned by Walk, others -// will be silently discarded. -func Walk(root string, walkFn WalkFunc) error { - return WalkN(root, walkFn, runtime.NumCPU()*2) -} - -// WalkN is a wrapper for filepath.Walk which can call multiple walkFn -// in parallel, allowing to handle each item concurrently. A maximum of -// num walkFn will be called at any one time. -// -// Please see Walk documentation for caveats of using this function. -func WalkN(root string, walkFn WalkFunc, num int) error { - // make sure limit is sensible - if num < 1 { - return fmt.Errorf("walk(%q): num must be > 0", root) - } - - files := make(chan *walkArgs, 2*num) - errCh := make(chan error, 1) // get the first error, ignore others - - // Start walking a tree asap - var ( - err error - wg sync.WaitGroup - - rootLen = len(root) - rootEntry *walkArgs - ) - wg.Add(1) - go func() { - err = filepath.Walk(root, func(p string, info os.FileInfo, err error) error { - if err != nil { - close(files) - return err - } - if len(p) == rootLen { - // Root entry is processed separately below. - rootEntry = &walkArgs{path: p, info: &info} - return nil - } - // add a file to the queue unless a callback sent an error - select { - case e := <-errCh: - close(files) - return e - default: - files <- &walkArgs{path: p, info: &info} - return nil - } - }) - if err == nil { - close(files) - } - wg.Done() - }() - - wg.Add(num) - for i := 0; i < num; i++ { - go func() { - for file := range files { - if e := walkFn(file.path, *file.info, nil); e != nil { - select { - case errCh <- e: // sent ok - default: // buffer full - } - } - } - wg.Done() - }() - } - - wg.Wait() - - if err == nil { - err = walkFn(rootEntry.path, *rootEntry.info, nil) - } - - return err -} - -// walkArgs holds the arguments that were passed to the Walk or WalkN -// functions. -type walkArgs struct { - path string - info *os.FileInfo -} diff --git a/vendor/github.com/opencontainers/selinux/pkg/pwalkdir/pwalkdir.go b/vendor/github.com/opencontainers/selinux/pkg/pwalkdir/pwalkdir.go index a5796b2c4f..0f5d9f580d 100644 --- a/vendor/github.com/opencontainers/selinux/pkg/pwalkdir/pwalkdir.go +++ b/vendor/github.com/opencontainers/selinux/pkg/pwalkdir/pwalkdir.go @@ -111,6 +111,6 @@ func WalkN(root string, walkFn fs.WalkDirFunc, num int) error { // walkArgs holds the arguments that were passed to the Walk or WalkN // functions. type walkArgs struct { - path string entry fs.DirEntry + path string } diff --git a/vendor/github.com/openshift/source-to-image/pkg/docker/docker.go b/vendor/github.com/openshift/source-to-image/pkg/docker/docker.go index 48fcbbef85..9dc2c0aa89 100644 --- a/vendor/github.com/openshift/source-to-image/pkg/docker/docker.go +++ b/vendor/github.com/openshift/source-to-image/pkg/docker/docker.go @@ -25,7 +25,7 @@ import ( dockermessage "github.com/docker/docker/pkg/jsonmessage" dockerstdcopy "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/tlsconfig" - dockerspecs "github.com/opencontainers/image-spec/specs-go/v1" + v1 "github.com/opencontainers/image-spec/specs-go/v1" "golang.org/x/net/context" "github.com/openshift/source-to-image/pkg/api" @@ -122,12 +122,12 @@ type Docker interface { type Client interface { ContainerAttach(ctx context.Context, container string, options dockertypes.ContainerAttachOptions) (dockertypes.HijackedResponse, error) ContainerCommit(ctx context.Context, container string, options dockertypes.ContainerCommitOptions) (dockertypes.IDResponse, error) - ContainerCreate(ctx context.Context, config *dockercontainer.Config, hostConfig *dockercontainer.HostConfig, networkingConfig *dockernetwork.NetworkingConfig, platform *dockerspecs.Platform, containerName string) (dockercontainer.ContainerCreateCreatedBody, error) + ContainerCreate(ctx context.Context, config *dockercontainer.Config, hostConfig *dockercontainer.HostConfig, networkingConfig *dockernetwork.NetworkingConfig, platform *v1.Platform, containerName string) (dockercontainer.CreateResponse, error) ContainerInspect(ctx context.Context, container string) (dockertypes.ContainerJSON, error) ContainerRemove(ctx context.Context, container string, options dockertypes.ContainerRemoveOptions) error ContainerStart(ctx context.Context, container string, options dockertypes.ContainerStartOptions) error ContainerKill(ctx context.Context, container, signal string) error - ContainerWait(ctx context.Context, container string, condition dockercontainer.WaitCondition) (<-chan dockercontainer.ContainerWaitOKBody, <-chan error) + ContainerWait(ctx context.Context, container string, condition dockercontainer.WaitCondition) (<-chan dockercontainer.WaitResponse, <-chan error) CopyToContainer(ctx context.Context, container, path string, content io.Reader, opts dockertypes.CopyToContainerOptions) error CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, dockertypes.ContainerPathStat, error) ImageBuild(ctx context.Context, buildContext io.Reader, options dockertypes.ImageBuildOptions) (dockertypes.ImageBuildResponse, error) @@ -809,7 +809,7 @@ func determineCommandBaseDir(opts RunContainerOptions, imageMetadata *api.Image, } // dumpContainerInfo dumps information about a running container (port/IP/etc). -func dumpContainerInfo(container dockercontainer.ContainerCreateCreatedBody, d *stiDocker, image string) { +func dumpContainerInfo(container dockercontainer.CreateResponse, d *stiDocker, image string) { ctx, cancel := getDefaultContext() defer cancel() diff --git a/vendor/github.com/openshift/source-to-image/pkg/docker/util.go b/vendor/github.com/openshift/source-to-image/pkg/docker/util.go index 1fd3216555..924a03e7af 100644 --- a/vendor/github.com/openshift/source-to-image/pkg/docker/util.go +++ b/vendor/github.com/openshift/source-to-image/pkg/docker/util.go @@ -14,8 +14,8 @@ import ( "strings" "github.com/docker/distribution/reference" - cliconfig "github.com/docker/docker/cli/config" "github.com/docker/docker/client" + "github.com/docker/docker/pkg/homedir" "github.com/openshift/source-to-image/pkg/api" "github.com/openshift/source-to-image/pkg/api/constants" @@ -39,6 +39,18 @@ type AuthConfigurations struct { Configs map[string]api.AuthConfig } +// Dir returns the path to the configuration directory as specified by the DOCKER_CONFIG environment variable. +// If DOCKER_CONFIG is unset, Dir returns ~/.docker . +// Dir ignores XDG_CONFIG_HOME (same as the docker client). +// TODO: this was copied from github.com/docker/docker/cli/config@v23.0.6 +func Dir() string { + configDir := os.Getenv("DOCKER_CONFIG") + if len(configDir) == 0 { + configDir = filepath.Join(homedir.Get(), ".docker") + } + return configDir +} + type dockerConfig struct { Auth string `json:"auth"` Email string `json:"email"` @@ -427,7 +439,7 @@ func GetDefaultDockerConfig() *api.DockerConfig { certPath := os.Getenv("DOCKER_CERT_PATH") if certPath == "" { - certPath = cliconfig.Dir() + certPath = Dir() } cfg.CertFile = filepath.Join(certPath, "cert.pem") @@ -453,7 +465,10 @@ func GetAssembleUser(docker Docker, config *api.Config) (string, error) { if len(config.AssembleUser) > 0 { return config.AssembleUser, nil } - return extractAssembleUser(docker, config.BuilderImage) + if assembleUser, err := extractAssembleUser(docker, config.BuilderImage); err == nil && assembleUser != "" { + return assembleUser, nil + } + return docker.GetImageUser(config.BuilderImage) } func extractAssembleUser(docker Docker, imageName string) (string, error) { diff --git a/vendor/github.com/openshift/source-to-image/pkg/scm/downloaders/file/download.go b/vendor/github.com/openshift/source-to-image/pkg/scm/downloaders/file/download.go index acf2333554..34326e5cce 100644 --- a/vendor/github.com/openshift/source-to-image/pkg/scm/downloaders/file/download.go +++ b/vendor/github.com/openshift/source-to-image/pkg/scm/downloaders/file/download.go @@ -3,6 +3,7 @@ package file import ( "fmt" "path/filepath" + "regexp" "github.com/openshift/source-to-image/pkg/api" "github.com/openshift/source-to-image/pkg/api/constants" @@ -54,9 +55,27 @@ func (f *File) Download(config *api.Config) (*git.SourceInfo, error) { return nil, lerr } + var isIgnored func(path string) bool + + if config.ExcludeRegExp != "" { + exclude, err := regexp.Compile(config.ExcludeRegExp) + if err != nil { + return nil, err + } + isIgnored = func(path string) bool { + _, ok := filesToIgnore[path] + return ok || exclude.MatchString(path) + } + } else { + isIgnored = func(path string) bool { + _, ok := filesToIgnore[path] + return ok + } + } + if copySrc != config.WorkingSourceDir { f.KeepSymlinks(config.KeepSymlinks) - err := f.CopyContents(copySrc, config.WorkingSourceDir, filesToIgnore) + err = f.CopyContents(copySrc, config.WorkingSourceDir, isIgnored) if err != nil { return nil, err } diff --git a/vendor/github.com/openshift/source-to-image/pkg/scm/git/testhelpers.go b/vendor/github.com/openshift/source-to-image/pkg/scm/git/testhelpers.go index 8b1b0cb9b3..a078b1c28f 100644 --- a/vendor/github.com/openshift/source-to-image/pkg/scm/git/testhelpers.go +++ b/vendor/github.com/openshift/source-to-image/pkg/scm/git/testhelpers.go @@ -77,7 +77,7 @@ func CreateLocalGitDirectoryWithSubmodule() (string, error) { return "", err } - err = cr.RunWithOptions(cmd.CommandOpts{Dir: dir}, "git", "submodule", "add", submodule, "submodule") + err = cr.RunWithOptions(cmd.CommandOpts{Dir: dir}, "git", "-c", "protocol.file.allow=always", "submodule", "add", submodule, "submodule") if err != nil { return "", err } diff --git a/vendor/github.com/openshift/source-to-image/pkg/util/fs/fs.go b/vendor/github.com/openshift/source-to-image/pkg/util/fs/fs.go index 92d01303a2..eb7eda6c13 100644 --- a/vendor/github.com/openshift/source-to-image/pkg/util/fs/fs.go +++ b/vendor/github.com/openshift/source-to-image/pkg/util/fs/fs.go @@ -26,8 +26,8 @@ type FileSystem interface { MkdirAllWithPermissions(dirname string, perm os.FileMode) error Mkdir(dirname string) error Exists(file string) bool - Copy(sourcePath, targetPath string, filesToIgnore map[string]string) error - CopyContents(sourcePath, targetPath string, filesToIgnore map[string]string) error + Copy(sourcePath, targetPath string, isIgnored func(path string) bool) error + CopyContents(sourcePath, targetPath string, isIgnored func(path string) bool) error RemoveDirectory(dir string) error CreateWorkingDirectory() (string, error) Open(file string) (io.ReadCloser, error) @@ -184,8 +184,8 @@ func (h *fs) Exists(file string) bool { // If the source is a directory, then the destination has to be a directory and // we copy the content of the source directory to destination directory // recursively. -func (h *fs) Copy(source string, dest string, filesToIgnore map[string]string) (err error) { - return doCopy(h, source, dest, filesToIgnore) +func (h *fs) Copy(source string, dest string, isIgnored func(path string) bool) (err error) { + return doCopy(h, source, dest, isIgnored) } // KeepSymlinks configures fs to copy symlinks from src as symlinks to dst. @@ -227,7 +227,7 @@ func handleSymlink(h FileSystem, source, dest string) (bool, error) { return false, nil } -func doCopy(h FileSystem, source, dest string, filesToIgnore map[string]string) error { +func doCopy(h FileSystem, source, dest string, isIgnored func(path string) bool) error { if handled, err := handleSymlink(h, source, dest); handled || err != nil { return err } @@ -242,13 +242,13 @@ func doCopy(h FileSystem, source, dest string, filesToIgnore map[string]string) } if sourceinfo.IsDir() { - _, ok := filesToIgnore[source] + ok := isIgnored != nil && isIgnored(source) if ok { log.V(5).Infof("Directory %q ignored", source) return nil } log.V(5).Infof("D %q -> %q", source, dest) - return h.CopyContents(source, dest, filesToIgnore) + return h.CopyContents(source, dest, isIgnored) } destinfo, _ := h.Stat(dest) @@ -260,7 +260,7 @@ func doCopy(h FileSystem, source, dest string, filesToIgnore map[string]string) return err } defer destfile.Close() - _, ok := filesToIgnore[source] + ok := isIgnored != nil && isIgnored(source) if ok { log.V(5).Infof("File %q ignored", source) return nil @@ -279,7 +279,7 @@ func doCopy(h FileSystem, source, dest string, filesToIgnore map[string]string) // The source directory itself will not be copied, only its content. If you // want this behavior, the destination must include the source directory name. // It will skip any files provided in filesToIgnore from being copied -func (h *fs) CopyContents(src string, dest string, filesToIgnore map[string]string) (err error) { +func (h *fs) CopyContents(src, dest string, isIgnored func(path string) bool) (err error) { sourceinfo, err := h.Stat(src) if err != nil { return err @@ -287,12 +287,7 @@ func (h *fs) CopyContents(src string, dest string, filesToIgnore map[string]stri if err = os.MkdirAll(dest, sourceinfo.Mode()); err != nil { return err } - directory, err := os.Open(src) - if err != nil { - return err - } - defer directory.Close() - objects, err := directory.Readdir(-1) + objects, err := os.ReadDir(src) if err != nil { return err } @@ -300,7 +295,7 @@ func (h *fs) CopyContents(src string, dest string, filesToIgnore map[string]stri for _, obj := range objects { source := filepath.Join(src, obj.Name()) destination := filepath.Join(dest, obj.Name()) - if err := h.Copy(source, destination, filesToIgnore); err != nil { + if err := h.Copy(source, destination, isIgnored); err != nil { return err } } diff --git a/vendor/github.com/openshift/source-to-image/pkg/util/timeout.go b/vendor/github.com/openshift/source-to-image/pkg/util/timeout.go index 68a3ae0779..aa76c42444 100644 --- a/vendor/github.com/openshift/source-to-image/pkg/util/timeout.go +++ b/vendor/github.com/openshift/source-to-image/pkg/util/timeout.go @@ -23,9 +23,11 @@ func (t *TimeoutError) Error() string { // case that the execution time of the function exceeded the provided duration. // The provided function is passed the timer in case it wishes to reset it. If // so, the following pattern must be used: -// if !timer.Stop() { -// return &TimeoutError{} -// } +// +// if !timer.Stop() { +// return &TimeoutError{} +// } +// // timer.Reset(timeout) func TimeoutAfter(t time.Duration, errorMsg string, f func(*time.Timer) error) error { c := make(chan error, 1) diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go index a912b75a05..62de4dc59a 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -59,6 +59,18 @@ type ExemplarAdder interface { // CounterOpts is an alias for Opts. See there for doc comments. type CounterOpts Opts +// CounterVecOpts bundles the options to create a CounterVec metric. +// It is mandatory to set CounterOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type CounterVecOpts struct { + CounterOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // NewCounter creates a new Counter based on the provided CounterOpts. // // The returned implementation also implements ExemplarAdder. It is safe to @@ -174,16 +186,24 @@ type CounterVec struct { // NewCounterVec creates a new CounterVec based on the provided CounterOpts and // partitioned by the given label names. func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { - desc := NewDesc( + return V2.NewCounterVec(CounterVecOpts{ + CounterOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewCounterVec creates a new CounterVec based on the provided CounterVecOpts. +func (v2) NewCounterVec(opts CounterVecOpts) *CounterVec { + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &CounterVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) } result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: time.Now} result.init(result) // Init self-collection. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go index 8bc5e44e2f..12331542dd 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -14,20 +14,16 @@ package prometheus import ( - "errors" "fmt" "sort" "strings" - "github.com/cespare/xxhash/v2" - "github.com/prometheus/client_golang/prometheus/internal" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - "github.com/prometheus/common/model" - + "github.com/cespare/xxhash/v2" dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/model" + "google.golang.org/protobuf/proto" ) // Desc is the descriptor used by every Prometheus Metric. It is essentially @@ -54,9 +50,9 @@ type Desc struct { // constLabelPairs contains precalculated DTO label pairs based on // the constant labels. constLabelPairs []*dto.LabelPair - // variableLabels contains names of labels for which the metric - // maintains variable values. - variableLabels []string + // variableLabels contains names of labels and normalization function for + // which the metric maintains variable values. + variableLabels ConstrainedLabels // id is a hash of the values of the ConstLabels and fqName. This // must be unique among all registered descriptors and can therefore be // used as an identifier of the descriptor. @@ -80,10 +76,24 @@ type Desc struct { // For constLabels, the label values are constant. Therefore, they are fully // specified in the Desc. See the Collector example for a usage pattern. func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + return V2.NewDesc(fqName, help, UnconstrainedLabels(variableLabels), constLabels) +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName must not be empty. +// +// variableLabels only contain the label names and normalization functions. Their +// label values are variable and therefore not part of the Desc. (They are managed +// within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Collector example for a usage pattern. +func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, constLabels Labels) *Desc { d := &Desc{ fqName: fqName, help: help, - variableLabels: variableLabels, + variableLabels: variableLabels.constrainedLabels(), } if !model.IsValidMetricName(model.LabelValue(fqName)) { d.err = fmt.Errorf("%q is not a valid metric name", fqName) @@ -93,7 +103,7 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * // their sorted label names) plus the fqName (at position 0). labelValues := make([]string, 1, len(constLabels)+1) labelValues[0] = fqName - labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNames := make([]string, 0, len(constLabels)+len(d.variableLabels)) labelNameSet := map[string]struct{}{} // First add only the const label names and sort them... for labelName := range constLabels { @@ -118,16 +128,16 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * // Now add the variable label names, but prefix them with something that // cannot be in a regular label name. That prevents matching the label // dimension with a different mix between preset and variable labels. - for _, labelName := range variableLabels { - if !checkLabelName(labelName) { - d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) + for _, label := range d.variableLabels { + if !checkLabelName(label.Name) { + d.err = fmt.Errorf("%q is not a valid label name for metric %q", label.Name, fqName) return d } - labelNames = append(labelNames, "$"+labelName) - labelNameSet[labelName] = struct{}{} + labelNames = append(labelNames, "$"+label.Name) + labelNameSet[label.Name] = struct{}{} } if len(labelNames) != len(labelNameSet) { - d.err = errors.New("duplicate label names") + d.err = fmt.Errorf("duplicate label names in constant and variable labels for metric %q", fqName) return d } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/vendor/github.com/prometheus/client_golang/prometheus/doc.go index 811072cbd5..962608f02c 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/doc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -37,35 +37,35 @@ // // type metrics struct { // cpuTemp prometheus.Gauge -// hdFailures *prometheus.CounterVec +// hdFailures *prometheus.CounterVec // } // // func NewMetrics(reg prometheus.Registerer) *metrics { -// m := &metrics{ -// cpuTemp: prometheus.NewGauge(prometheus.GaugeOpts{ -// Name: "cpu_temperature_celsius", -// Help: "Current temperature of the CPU.", -// }), -// hdFailures: prometheus.NewCounterVec( -// prometheus.CounterOpts{ -// Name: "hd_errors_total", -// Help: "Number of hard-disk errors.", -// }, -// []string{"device"}, -// ), -// } -// reg.MustRegister(m.cpuTemp) -// reg.MustRegister(m.hdFailures) -// return m +// m := &metrics{ +// cpuTemp: prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }), +// hdFailures: prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ), +// } +// reg.MustRegister(m.cpuTemp) +// reg.MustRegister(m.hdFailures) +// return m // } // // func main() { -// // Create a non-global registry. -// reg := prometheus.NewRegistry() +// // Create a non-global registry. +// reg := prometheus.NewRegistry() // -// // Create new metrics and register them using the custom registry. -// m := NewMetrics(reg) -// // Set values for the new created metrics. +// // Create new metrics and register them using the custom registry. +// m := NewMetrics(reg) +// // Set values for the new created metrics. // m.cpuTemp.Set(65.3) // m.hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() // diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go index 21271a5bb4..f1ea6c76f7 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -55,6 +55,18 @@ type Gauge interface { // GaugeOpts is an alias for Opts. See there for doc comments. type GaugeOpts Opts +// GaugeVecOpts bundles the options to create a GaugeVec metric. +// It is mandatory to set GaugeOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type GaugeVecOpts struct { + GaugeOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // NewGauge creates a new Gauge based on the provided GaugeOpts. // // The returned implementation is optimized for a fast Set method. If you have a @@ -138,16 +150,24 @@ type GaugeVec struct { // NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and // partitioned by the given label names. func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { - desc := NewDesc( + return V2.NewGaugeVec(GaugeVecOpts{ + GaugeOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeVecOpts. +func (v2) NewGaugeVec(opts GaugeVecOpts) *GaugeVec { + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &GaugeVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) } result := &gauge{desc: desc, labelPairs: MakeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go index 3a2d55e84b..2d8d9f64f4 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go @@ -23,11 +23,10 @@ import ( "strings" "sync" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" - "github.com/prometheus/client_golang/prometheus/internal" + + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" ) const ( diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index 4c873a01c3..5b69965b25 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -22,10 +22,9 @@ import ( "sync/atomic" "time" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" + + "google.golang.org/protobuf/proto" ) // nativeHistogramBounds for the frac of observed values. Only relevant for @@ -469,6 +468,18 @@ type HistogramOpts struct { NativeHistogramMaxZeroThreshold float64 } +// HistogramVecOpts bundles the options to create a HistogramVec metric. +// It is mandatory to set HistogramOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type HistogramVecOpts struct { + HistogramOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // NewHistogram creates a new Histogram based on the provided HistogramOpts. It // panics if the buckets in HistogramOpts are not in strictly increasing order. // @@ -489,11 +500,11 @@ func NewHistogram(opts HistogramOpts) Histogram { func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) } for _, n := range desc.variableLabels { - if n == bucketLabel { + if n.Name == bucketLabel { panic(errBucketLabelNotAllowed) } } @@ -544,16 +555,12 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr } // Finally we know the final length of h.upperBounds and can make buckets // for both counts as well as exemplars: - h.counts[0] = &histogramCounts{ - buckets: make([]uint64, len(h.upperBounds)), - nativeHistogramZeroThresholdBits: math.Float64bits(h.nativeHistogramZeroThreshold), - nativeHistogramSchema: h.nativeHistogramSchema, - } - h.counts[1] = &histogramCounts{ - buckets: make([]uint64, len(h.upperBounds)), - nativeHistogramZeroThresholdBits: math.Float64bits(h.nativeHistogramZeroThreshold), - nativeHistogramSchema: h.nativeHistogramSchema, - } + h.counts[0] = &histogramCounts{buckets: make([]uint64, len(h.upperBounds))} + atomic.StoreUint64(&h.counts[0].nativeHistogramZeroThresholdBits, math.Float64bits(h.nativeHistogramZeroThreshold)) + atomic.StoreInt32(&h.counts[0].nativeHistogramSchema, h.nativeHistogramSchema) + h.counts[1] = &histogramCounts{buckets: make([]uint64, len(h.upperBounds))} + atomic.StoreUint64(&h.counts[1].nativeHistogramZeroThresholdBits, math.Float64bits(h.nativeHistogramZeroThreshold)) + atomic.StoreInt32(&h.counts[1].nativeHistogramSchema, h.nativeHistogramSchema) h.exemplars = make([]atomic.Value, len(h.upperBounds)+1) h.init(h) // Init self-collection. @@ -1034,15 +1041,23 @@ type HistogramVec struct { // NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and // partitioned by the given label names. func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { - desc := NewDesc( + return V2.NewHistogramVec(HistogramVecOpts{ + HistogramOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramVecOpts. +func (v2) NewHistogramVec(opts HistogramVecOpts) *HistogramVec { + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &HistogramVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - return newHistogram(desc, opts, lvs...) + return newHistogram(desc, opts.HistogramOpts, lvs...) }), } } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go index c1b8fad36a..63ff8683ce 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/labels.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/labels.go @@ -32,6 +32,78 @@ import ( // create a Desc. type Labels map[string]string +// ConstrainedLabels represents a label name and its constrain function +// to normalize label values. This type is commonly used when constructing +// metric vector Collectors. +type ConstrainedLabel struct { + Name string + Constraint func(string) string +} + +func (cl ConstrainedLabel) Constrain(v string) string { + if cl.Constraint == nil { + return v + } + return cl.Constraint(v) +} + +// ConstrainableLabels is an interface that allows creating of labels that can +// be optionally constrained. +// +// prometheus.V2().NewCounterVec(CounterVecOpts{ +// CounterOpts: {...}, // Usual CounterOpts fields +// VariableLabels: []ConstrainedLabels{ +// {Name: "A"}, +// {Name: "B", Constraint: func(v string) string { ... }}, +// }, +// }) +type ConstrainableLabels interface { + constrainedLabels() ConstrainedLabels + labelNames() []string +} + +// ConstrainedLabels represents a collection of label name -> constrain function +// to normalize label values. This type is commonly used when constructing +// metric vector Collectors. +type ConstrainedLabels []ConstrainedLabel + +func (cls ConstrainedLabels) constrainedLabels() ConstrainedLabels { + return cls +} + +func (cls ConstrainedLabels) labelNames() []string { + names := make([]string, len(cls)) + for i, label := range cls { + names[i] = label.Name + } + return names +} + +// UnconstrainedLabels represents collection of label without any constraint on +// their value. Thus, it is simply a collection of label names. +// +// UnconstrainedLabels([]string{ "A", "B" }) +// +// is equivalent to +// +// ConstrainedLabels { +// { Name: "A" }, +// { Name: "B" }, +// } +type UnconstrainedLabels []string + +func (uls UnconstrainedLabels) constrainedLabels() ConstrainedLabels { + constrainedLabels := make([]ConstrainedLabel, len(uls)) + for i, l := range uls { + constrainedLabels[i] = ConstrainedLabel{Name: l} + } + return constrainedLabels +} + +func (uls UnconstrainedLabels) labelNames() []string { + return uls +} + // reservedLabelPrefix is a prefix which is not legal in user-supplied // label names. const reservedLabelPrefix = "__" diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/metric.go index b5119c5041..07bbc9d768 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -20,11 +20,9 @@ import ( "strings" "time" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - "github.com/prometheus/common/model" - dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/model" + "google.golang.org/protobuf/proto" ) var separatorByteSlice = []byte{model.SeparatorByte} // For convenient use with xxhash. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go index 2108678162..d3482c40ca 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go @@ -68,16 +68,17 @@ func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.Rou o.apply(rtOpts) } - code, method := checkLabels(counter) + // Curry the counter with dynamic labels before checking the remaining labels. + code, method := checkLabels(counter.MustCurryWith(rtOpts.emptyDynamicLabels())) return func(r *http.Request) (*http.Response, error) { resp, err := next.RoundTrip(r) if err == nil { - addWithExemplar( - counter.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)), - 1, - rtOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...) + for label, resolve := range rtOpts.extraLabelsFromCtx { + l[label] = resolve(resp.Request.Context()) + } + addWithExemplar(counter.With(l), 1, rtOpts.getExemplarFn(r.Context())) } return resp, err } @@ -110,17 +111,18 @@ func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundT o.apply(rtOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(rtOpts.emptyDynamicLabels())) return func(r *http.Request) (*http.Response, error) { start := time.Now() resp, err := next.RoundTrip(r) if err == nil { - observeWithExemplar( - obs.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)), - time.Since(start).Seconds(), - rtOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...) + for label, resolve := range rtOpts.extraLabelsFromCtx { + l[label] = resolve(resp.Request.Context()) + } + observeWithExemplar(obs.With(l), time.Since(start).Seconds(), rtOpts.getExemplarFn(r.Context())) } return resp, err } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go index cca67a78a9..3793036ad0 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go @@ -87,7 +87,8 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) if code { return func(w http.ResponseWriter, r *http.Request) { @@ -95,23 +96,22 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op d := newDelegator(w, nil) next.ServeHTTP(d, r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - time.Since(now).Seconds(), - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { now := time.Now() next.ServeHTTP(w, r) - - observeWithExemplar( - obs.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), - time.Since(now).Seconds(), - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, 0, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) } } @@ -138,28 +138,30 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler, o.apply(hOpts) } - code, method := checkLabels(counter) + // Curry the counter with dynamic labels before checking the remaining labels. + code, method := checkLabels(counter.MustCurryWith(hOpts.emptyDynamicLabels())) if code { return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) - addWithExemplar( - counter.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - 1, - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + addWithExemplar(counter.With(l), 1, hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) - addWithExemplar( - counter.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), - 1, - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, 0, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + addWithExemplar(counter.With(l), 1, hOpts.getExemplarFn(r.Context())) } } @@ -191,16 +193,17 @@ func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Ha o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) return func(w http.ResponseWriter, r *http.Request) { now := time.Now() d := newDelegator(w, func(status int) { - observeWithExemplar( - obs.With(labels(code, method, r.Method, status, hOpts.extraMethods...)), - time.Since(now).Seconds(), - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, status, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) }) next.ServeHTTP(d, r) } @@ -231,28 +234,32 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler, o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) + if code { return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) size := computeApproximateRequestSize(r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - float64(size), - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), float64(size), hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) size := computeApproximateRequestSize(r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), - float64(size), - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, 0, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), float64(size), hOpts.getExemplarFn(r.Context())) } } @@ -281,16 +288,18 @@ func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - float64(d.Written()), - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), float64(d.Written()), hOpts.getExemplarFn(r.Context())) }) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go index c590d912c9..5d4383aa14 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go @@ -24,14 +24,32 @@ type Option interface { apply(*options) } +// LabelValueFromCtx are used to compute the label value from request context. +// Context can be filled with values from request through middleware. +type LabelValueFromCtx func(ctx context.Context) string + // options store options for both a handler or round tripper. type options struct { - extraMethods []string - getExemplarFn func(requestCtx context.Context) prometheus.Labels + extraMethods []string + getExemplarFn func(requestCtx context.Context) prometheus.Labels + extraLabelsFromCtx map[string]LabelValueFromCtx } func defaultOptions() *options { - return &options{getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil }} + return &options{ + getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil }, + extraLabelsFromCtx: map[string]LabelValueFromCtx{}, + } +} + +func (o *options) emptyDynamicLabels() prometheus.Labels { + labels := prometheus.Labels{} + + for label := range o.extraLabelsFromCtx { + labels[label] = "" + } + + return labels } type optionApplyFunc func(*options) @@ -48,11 +66,19 @@ func WithExtraMethods(methods ...string) Option { }) } -// WithExemplarFromContext adds allows to put a hook to all counter and histogram metrics. -// If the hook function returns non-nil labels, exemplars will be added for that request, otherwise metric -// will get instrumented without exemplar. +// WithExemplarFromContext allows to inject function that will get exemplar from context that will be put to counter and histogram metrics. +// If the function returns nil labels or the metric does not support exemplars, no exemplar will be added (noop), but +// metric will continue to observe/increment. func WithExemplarFromContext(getExemplarFn func(requestCtx context.Context) prometheus.Labels) Option { return optionApplyFunc(func(o *options) { o.getExemplarFn = getExemplarFn }) } + +// WithLabelFromCtx registers a label for dynamic resolution with access to context. +// See the example for ExampleInstrumentHandlerWithLabelResolver for example usage +func WithLabelFromCtx(name string, valueFn LabelValueFromCtx) Option { + return optionApplyFunc(func(o *options) { + o.extraLabelsFromCtx[name] = valueFn + }) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go index 09e34d307c..44da9433be 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -21,18 +21,17 @@ import ( "path/filepath" "runtime" "sort" + "strconv" "strings" "sync" "unicode/utf8" - "github.com/cespare/xxhash/v2" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - "github.com/prometheus/common/expfmt" + "github.com/prometheus/client_golang/prometheus/internal" + "github.com/cespare/xxhash/v2" dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus/internal" + "github.com/prometheus/common/expfmt" + "google.golang.org/protobuf/proto" ) const ( @@ -933,6 +932,10 @@ func checkMetricConsistency( h.WriteString(lp.GetValue()) h.Write(separatorByteSlice) } + if dtoMetric.TimestampMs != nil { + h.WriteString(strconv.FormatInt(*(dtoMetric.TimestampMs), 10)) + h.Write(separatorByteSlice) + } hSum := h.Sum64() if _, exists := metricHashes[hSum]; exists { return fmt.Errorf( @@ -962,7 +965,7 @@ func checkDescConsistency( copy(lpsFromDesc, desc.constLabelPairs) for _, l := range desc.variableLabels { lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ - Name: proto.String(l), + Name: proto.String(l.Name), }) } if len(lpsFromDesc) != len(dtoMetric.Label) { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/prometheus/client_golang/prometheus/summary.go index 7bc448a893..dd359264e5 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -22,11 +22,10 @@ import ( "sync/atomic" "time" - "github.com/beorn7/perks/quantile" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" + + "github.com/beorn7/perks/quantile" + "google.golang.org/protobuf/proto" ) // quantileLabel is used for the label that defines the quantile in a @@ -148,6 +147,18 @@ type SummaryOpts struct { BufCap uint32 } +// SummaryVecOpts bundles the options to create a SummaryVec metric. +// It is mandatory to set SummaryOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type SummaryVecOpts struct { + SummaryOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // Problem with the sliding-window decay algorithm... The Merge method of // perk/quantile is actually not working as advertised - and it might be // unfixable, as the underlying algorithm is apparently not capable of merging @@ -178,11 +189,11 @@ func NewSummary(opts SummaryOpts) Summary { func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) } for _, n := range desc.variableLabels { - if n == quantileLabel { + if n.Name == quantileLabel { panic(errQuantileLabelNotAllowed) } } @@ -530,20 +541,28 @@ type SummaryVec struct { // it is handled by the Prometheus server internally, “quantile” is an illegal // label name. NewSummaryVec will panic if this label name is used. func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { - for _, ln := range labelNames { + return V2.NewSummaryVec(SummaryVecOpts{ + SummaryOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryVecOpts. +func (v2) NewSummaryVec(opts SummaryVecOpts) *SummaryVec { + for _, ln := range opts.VariableLabels.labelNames() { if ln == quantileLabel { panic(errQuantileLabelNotAllowed) } } - desc := NewDesc( + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &SummaryVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - return newSummary(desc, opts, lvs...) + return newSummary(desc, opts.SummaryOpts, lvs...) }), } } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/timer.go b/vendor/github.com/prometheus/client_golang/prometheus/timer.go index f28a76f3a6..52344fef53 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/timer.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/timer.go @@ -23,7 +23,9 @@ type Timer struct { } // NewTimer creates a new Timer. The provided Observer is used to observe a -// duration in seconds. Timer is usually used to time a function call in the +// duration in seconds. If the Observer implements ExemplarObserver, passing exemplar +// later on will be also supported. +// Timer is usually used to time a function call in the // following way: // // func TimeMe() { @@ -31,6 +33,14 @@ type Timer struct { // defer timer.ObserveDuration() // // Do actual work. // } +// +// or +// +// func TimeMeWithExemplar() { +// timer := NewTimer(myHistogram) +// defer timer.ObserveDurationWithExemplar(exemplar) +// // Do actual work. +// } func NewTimer(o Observer) *Timer { return &Timer{ begin: time.Now(), @@ -53,3 +63,19 @@ func (t *Timer) ObserveDuration() time.Duration { } return d } + +// ObserveDurationWithExemplar is like ObserveDuration, but it will also +// observe exemplar with the duration unless exemplar is nil or provided Observer can't +// be casted to ExemplarObserver. +func (t *Timer) ObserveDurationWithExemplar(exemplar Labels) time.Duration { + d := time.Since(t.begin) + eo, ok := t.observer.(ExemplarObserver) + if ok && exemplar != nil { + eo.ObserveWithExemplar(d.Seconds(), exemplar) + return d + } + if t.observer != nil { + t.observer.Observe(d.Seconds()) + } + return d +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/prometheus/client_golang/prometheus/value.go index 2d3abc1cbd..5f6bb80014 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -19,13 +19,11 @@ import ( "time" "unicode/utf8" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - "google.golang.org/protobuf/types/known/timestamppb" - "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" ) // ValueType is an enumeration of metric types that represent a simple value. @@ -188,9 +186,9 @@ func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { return desc.constLabelPairs } labelPairs := make([]*dto.LabelPair, 0, totalLen) - for i, n := range desc.variableLabels { + for i, l := range desc.variableLabels { labelPairs = append(labelPairs, &dto.LabelPair{ - Name: proto.String(n), + Name: proto.String(l.Name), Value: proto.String(labelValues[i]), }) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go index 7ae322590c..386fb2d23e 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -72,6 +72,7 @@ func NewMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { // with a performance overhead (for creating and processing the Labels map). // See also the CounterVec example. func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { + lvs = constrainLabelValues(m.desc, lvs, m.curry) h, err := m.hashLabelValues(lvs) if err != nil { return false @@ -91,6 +92,7 @@ func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { // This method is used for the same purpose as DeleteLabelValues(...string). See // there for pros and cons of the two methods. func (m *MetricVec) Delete(labels Labels) bool { + labels = constrainLabels(m.desc, labels) h, err := m.hashLabels(labels) if err != nil { return false @@ -106,6 +108,7 @@ func (m *MetricVec) Delete(labels Labels) bool { // Note that curried labels will never be matched if deleting from the curried vector. // To match curried labels with DeletePartialMatch, it must be called on the base vector. func (m *MetricVec) DeletePartialMatch(labels Labels) int { + labels = constrainLabels(m.desc, labels) return m.metricMap.deleteByLabels(labels, m.curry) } @@ -145,10 +148,10 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { iCurry int ) for i, label := range m.desc.variableLabels { - val, ok := labels[label] + val, ok := labels[label.Name] if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { if ok { - return nil, fmt.Errorf("label name %q is already curried", label) + return nil, fmt.Errorf("label name %q is already curried", label.Name) } newCurry = append(newCurry, oldCurry[iCurry]) iCurry++ @@ -156,7 +159,7 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { if !ok { continue // Label stays uncurried. } - newCurry = append(newCurry, curriedLabelValue{i, val}) + newCurry = append(newCurry, curriedLabelValue{i, label.Constrain(val)}) } } if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { @@ -199,6 +202,7 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { // a wrapper around MetricVec, implementing a vector for a specific Metric // implementation, for example GaugeVec. func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { + lvs = constrainLabelValues(m.desc, lvs, m.curry) h, err := m.hashLabelValues(lvs) if err != nil { return nil, err @@ -224,6 +228,7 @@ func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { // around MetricVec, implementing a vector for a specific Metric implementation, // for example GaugeVec. func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { + labels = constrainLabels(m.desc, labels) h, err := m.hashLabels(labels) if err != nil { return nil, err @@ -266,16 +271,16 @@ func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { iCurry int ) for i, label := range m.desc.variableLabels { - val, ok := labels[label] + val, ok := labels[label.Name] if iCurry < len(curry) && curry[iCurry].index == i { if ok { - return 0, fmt.Errorf("label name %q is already curried", label) + return 0, fmt.Errorf("label name %q is already curried", label.Name) } h = m.hashAdd(h, curry[iCurry].value) iCurry++ } else { if !ok { - return 0, fmt.Errorf("label name %q missing in label map", label) + return 0, fmt.Errorf("label name %q missing in label map", label.Name) } h = m.hashAdd(h, val) } @@ -453,7 +458,7 @@ func valueMatchesVariableOrCurriedValue(targetValue string, index int, values [] func matchPartialLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { for l, v := range labels { // Check if the target label exists in our metrics and get the index. - varLabelIndex, validLabel := indexOf(l, desc.variableLabels) + varLabelIndex, validLabel := indexOf(l, desc.variableLabels.labelNames()) if validLabel { // Check the value of that label against the target value. // We don't consider curried values in partial matches. @@ -605,7 +610,7 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe iCurry++ continue } - if values[i] != labels[k] { + if values[i] != labels[k.Name] { return false } } @@ -621,7 +626,7 @@ func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) [] iCurry++ continue } - labelValues[i] = labels[k] + labelValues[i] = labels[k.Name] } return labelValues } @@ -640,3 +645,34 @@ func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { } return labelValues } + +func constrainLabels(desc *Desc, labels Labels) Labels { + constrainedValues := make(Labels, len(labels)) + for l, v := range labels { + if i, ok := indexOf(l, desc.variableLabels.labelNames()); ok { + constrainedValues[l] = desc.variableLabels[i].Constrain(v) + continue + } + constrainedValues[l] = v + } + return constrainedValues +} + +func constrainLabelValues(desc *Desc, lvs []string, curry []curriedLabelValue) []string { + constrainedValues := make([]string, len(lvs)) + var iCurry, iLVs int + for i := 0; i < len(lvs)+len(curry); i++ { + if iCurry < len(curry) && curry[iCurry].index == i { + iCurry++ + continue + } + + if i < len(desc.variableLabels) { + constrainedValues[iLVs] = desc.variableLabels[i].Constrain(lvs[iLVs]) + } else { + constrainedValues[iLVs] = lvs[iLVs] + } + iLVs++ + } + return constrainedValues +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vnext.go b/vendor/github.com/prometheus/client_golang/prometheus/vnext.go new file mode 100644 index 0000000000..42bc3a8f06 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/vnext.go @@ -0,0 +1,23 @@ +// Copyright 2022 The Prometheus 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 prometheus + +type v2 struct{} + +// V2 is a struct that can be referenced to access experimental API that might +// be present in v2 of client golang someday. It offers extended functionality +// of v1 with slightly changed API. It is acceptable to use some pieces from v1 +// and e.g `prometheus.NewGauge` and some from v2 e.g. `prometheus.V2.NewDesc` +// in the same codebase. +var V2 = v2{} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go index 1498ee144c..25da157f15 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go @@ -17,12 +17,10 @@ import ( "fmt" "sort" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" + "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus/internal" + "google.golang.org/protobuf/proto" ) // WrapRegistererWith returns a Registerer wrapping the provided @@ -206,7 +204,7 @@ func wrapDesc(desc *Desc, prefix string, labels Labels) *Desc { constLabels[ln] = lv } // NewDesc will do remaining validations. - newDesc := NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) + newDesc := V2.NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) // Propagate errors if there was any. This will override any errer // created by NewDesc above, i.e. earlier errors get precedence. if desc.err != nil { diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go index 35904ea198..2b5bca4b99 100644 --- a/vendor/github.com/prometheus/client_model/go/metrics.pb.go +++ b/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -1,25 +1,38 @@ +// Copyright 2013 Prometheus Team +// 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 protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v3.20.3 // source: io/prometheus/client/metrics.proto package io_prometheus_client import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - math "math" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) type MetricType int32 @@ -38,23 +51,25 @@ const ( MetricType_GAUGE_HISTOGRAM MetricType = 5 ) -var MetricType_name = map[int32]string{ - 0: "COUNTER", - 1: "GAUGE", - 2: "SUMMARY", - 3: "UNTYPED", - 4: "HISTOGRAM", - 5: "GAUGE_HISTOGRAM", -} - -var MetricType_value = map[string]int32{ - "COUNTER": 0, - "GAUGE": 1, - "SUMMARY": 2, - "UNTYPED": 3, - "HISTOGRAM": 4, - "GAUGE_HISTOGRAM": 5, -} +// Enum value maps for MetricType. +var ( + MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", + 5: "GAUGE_HISTOGRAM", + } + MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, + "GAUGE_HISTOGRAM": 5, + } +) func (x MetricType) Enum() *MetricType { p := new(MetricType) @@ -63,449 +78,519 @@ func (x MetricType) Enum() *MetricType { } func (x MetricType) String() string { - return proto.EnumName(MetricType_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *MetricType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") +func (MetricType) Descriptor() protoreflect.EnumDescriptor { + return file_io_prometheus_client_metrics_proto_enumTypes[0].Descriptor() +} + +func (MetricType) Type() protoreflect.EnumType { + return &file_io_prometheus_client_metrics_proto_enumTypes[0] +} + +func (x MetricType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *MetricType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } - *x = MetricType(value) + *x = MetricType(num) return nil } +// Deprecated: Use MetricType.Descriptor instead. func (MetricType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{0} + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{0} } type LabelPair struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *LabelPair) Reset() { *m = LabelPair{} } -func (m *LabelPair) String() string { return proto.CompactTextString(m) } -func (*LabelPair) ProtoMessage() {} -func (*LabelPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{0} + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` } -func (m *LabelPair) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelPair.Unmarshal(m, b) -} -func (m *LabelPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelPair.Marshal(b, m, deterministic) -} -func (m *LabelPair) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelPair.Merge(m, src) +func (x *LabelPair) Reset() { + *x = LabelPair{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *LabelPair) XXX_Size() int { - return xxx_messageInfo_LabelPair.Size(m) + +func (x *LabelPair) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *LabelPair) XXX_DiscardUnknown() { - xxx_messageInfo_LabelPair.DiscardUnknown(m) + +func (*LabelPair) ProtoMessage() {} + +func (x *LabelPair) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_LabelPair proto.InternalMessageInfo +// Deprecated: Use LabelPair.ProtoReflect.Descriptor instead. +func (*LabelPair) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{0} +} -func (m *LabelPair) GetName() string { - if m != nil && m.Name != nil { - return *m.Name +func (x *LabelPair) GetName() string { + if x != nil && x.Name != nil { + return *x.Name } return "" } -func (m *LabelPair) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value +func (x *LabelPair) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value } return "" } type Gauge struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Gauge) Reset() { *m = Gauge{} } -func (m *Gauge) String() string { return proto.CompactTextString(m) } -func (*Gauge) ProtoMessage() {} -func (*Gauge) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{1} + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` } -func (m *Gauge) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Gauge.Unmarshal(m, b) -} -func (m *Gauge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Gauge.Marshal(b, m, deterministic) -} -func (m *Gauge) XXX_Merge(src proto.Message) { - xxx_messageInfo_Gauge.Merge(m, src) +func (x *Gauge) Reset() { + *x = Gauge{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Gauge) XXX_Size() int { - return xxx_messageInfo_Gauge.Size(m) + +func (x *Gauge) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Gauge) XXX_DiscardUnknown() { - xxx_messageInfo_Gauge.DiscardUnknown(m) + +func (*Gauge) ProtoMessage() {} + +func (x *Gauge) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Gauge proto.InternalMessageInfo +// Deprecated: Use Gauge.ProtoReflect.Descriptor instead. +func (*Gauge) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{1} +} -func (m *Gauge) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Gauge) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } type Counter struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Counter) Reset() { *m = Counter{} } -func (m *Counter) String() string { return proto.CompactTextString(m) } -func (*Counter) ProtoMessage() {} -func (*Counter) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{2} + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` } -func (m *Counter) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Counter.Unmarshal(m, b) -} -func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Counter.Marshal(b, m, deterministic) -} -func (m *Counter) XXX_Merge(src proto.Message) { - xxx_messageInfo_Counter.Merge(m, src) +func (x *Counter) Reset() { + *x = Counter{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Counter) XXX_Size() int { - return xxx_messageInfo_Counter.Size(m) + +func (x *Counter) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Counter) XXX_DiscardUnknown() { - xxx_messageInfo_Counter.DiscardUnknown(m) + +func (*Counter) ProtoMessage() {} + +func (x *Counter) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Counter proto.InternalMessageInfo +// Deprecated: Use Counter.ProtoReflect.Descriptor instead. +func (*Counter) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{2} +} -func (m *Counter) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Counter) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } -func (m *Counter) GetExemplar() *Exemplar { - if m != nil { - return m.Exemplar +func (x *Counter) GetExemplar() *Exemplar { + if x != nil { + return x.Exemplar } return nil } type Quantile struct { - Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` - Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Quantile) Reset() { *m = Quantile{} } -func (m *Quantile) String() string { return proto.CompactTextString(m) } -func (*Quantile) ProtoMessage() {} -func (*Quantile) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{3} + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` } -func (m *Quantile) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Quantile.Unmarshal(m, b) -} -func (m *Quantile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Quantile.Marshal(b, m, deterministic) -} -func (m *Quantile) XXX_Merge(src proto.Message) { - xxx_messageInfo_Quantile.Merge(m, src) +func (x *Quantile) Reset() { + *x = Quantile{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Quantile) XXX_Size() int { - return xxx_messageInfo_Quantile.Size(m) + +func (x *Quantile) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Quantile) XXX_DiscardUnknown() { - xxx_messageInfo_Quantile.DiscardUnknown(m) + +func (*Quantile) ProtoMessage() {} + +func (x *Quantile) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Quantile proto.InternalMessageInfo +// Deprecated: Use Quantile.ProtoReflect.Descriptor instead. +func (*Quantile) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{3} +} -func (m *Quantile) GetQuantile() float64 { - if m != nil && m.Quantile != nil { - return *m.Quantile +func (x *Quantile) GetQuantile() float64 { + if x != nil && x.Quantile != nil { + return *x.Quantile } return 0 } -func (m *Quantile) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Quantile) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } type Summary struct { - SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` - Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Summary) Reset() { *m = Summary{} } -func (m *Summary) String() string { return proto.CompactTextString(m) } -func (*Summary) ProtoMessage() {} -func (*Summary) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{4} + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` } -func (m *Summary) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Summary.Unmarshal(m, b) -} -func (m *Summary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Summary.Marshal(b, m, deterministic) -} -func (m *Summary) XXX_Merge(src proto.Message) { - xxx_messageInfo_Summary.Merge(m, src) +func (x *Summary) Reset() { + *x = Summary{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Summary) XXX_Size() int { - return xxx_messageInfo_Summary.Size(m) + +func (x *Summary) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Summary) XXX_DiscardUnknown() { - xxx_messageInfo_Summary.DiscardUnknown(m) + +func (*Summary) ProtoMessage() {} + +func (x *Summary) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Summary proto.InternalMessageInfo +// Deprecated: Use Summary.ProtoReflect.Descriptor instead. +func (*Summary) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{4} +} -func (m *Summary) GetSampleCount() uint64 { - if m != nil && m.SampleCount != nil { - return *m.SampleCount +func (x *Summary) GetSampleCount() uint64 { + if x != nil && x.SampleCount != nil { + return *x.SampleCount } return 0 } -func (m *Summary) GetSampleSum() float64 { - if m != nil && m.SampleSum != nil { - return *m.SampleSum +func (x *Summary) GetSampleSum() float64 { + if x != nil && x.SampleSum != nil { + return *x.SampleSum } return 0 } -func (m *Summary) GetQuantile() []*Quantile { - if m != nil { - return m.Quantile +func (x *Summary) GetQuantile() []*Quantile { + if x != nil { + return x.Quantile } return nil } type Untyped struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Untyped) Reset() { *m = Untyped{} } -func (m *Untyped) String() string { return proto.CompactTextString(m) } -func (*Untyped) ProtoMessage() {} -func (*Untyped) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{5} + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` } -func (m *Untyped) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Untyped.Unmarshal(m, b) -} -func (m *Untyped) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Untyped.Marshal(b, m, deterministic) -} -func (m *Untyped) XXX_Merge(src proto.Message) { - xxx_messageInfo_Untyped.Merge(m, src) +func (x *Untyped) Reset() { + *x = Untyped{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Untyped) XXX_Size() int { - return xxx_messageInfo_Untyped.Size(m) + +func (x *Untyped) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Untyped) XXX_DiscardUnknown() { - xxx_messageInfo_Untyped.DiscardUnknown(m) + +func (*Untyped) ProtoMessage() {} + +func (x *Untyped) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Untyped proto.InternalMessageInfo +// Deprecated: Use Untyped.ProtoReflect.Descriptor instead. +func (*Untyped) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{5} +} -func (m *Untyped) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Untyped) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } type Histogram struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleCountFloat *float64 `protobuf:"fixed64,4,opt,name=sample_count_float,json=sampleCountFloat" json:"sample_count_float,omitempty"` + SampleCountFloat *float64 `protobuf:"fixed64,4,opt,name=sample_count_float,json=sampleCountFloat" json:"sample_count_float,omitempty"` // Overrides sample_count if > 0. SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` // Buckets for the conventional histogram. - Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` // Ordered in increasing order of upper_bound, +Inf bucket is optional. // schema defines the bucket schema. Currently, valid numbers are -4 <= n <= 8. // They are all for base-2 bucket schemas, where 1 is a bucket boundary in each case, and // then each power of two is divided into 2^n logarithmic buckets. // Or in other words, each bucket boundary is the previous boundary times 2^(2^-n). // In the future, more bucket schemas may be added using numbers < -4 or > 8. Schema *int32 `protobuf:"zigzag32,5,opt,name=schema" json:"schema,omitempty"` - ZeroThreshold *float64 `protobuf:"fixed64,6,opt,name=zero_threshold,json=zeroThreshold" json:"zero_threshold,omitempty"` - ZeroCount *uint64 `protobuf:"varint,7,opt,name=zero_count,json=zeroCount" json:"zero_count,omitempty"` - ZeroCountFloat *float64 `protobuf:"fixed64,8,opt,name=zero_count_float,json=zeroCountFloat" json:"zero_count_float,omitempty"` + ZeroThreshold *float64 `protobuf:"fixed64,6,opt,name=zero_threshold,json=zeroThreshold" json:"zero_threshold,omitempty"` // Breadth of the zero bucket. + ZeroCount *uint64 `protobuf:"varint,7,opt,name=zero_count,json=zeroCount" json:"zero_count,omitempty"` // Count in zero bucket. + ZeroCountFloat *float64 `protobuf:"fixed64,8,opt,name=zero_count_float,json=zeroCountFloat" json:"zero_count_float,omitempty"` // Overrides sb_zero_count if > 0. // Negative buckets for the native histogram. NegativeSpan []*BucketSpan `protobuf:"bytes,9,rep,name=negative_span,json=negativeSpan" json:"negative_span,omitempty"` // Use either "negative_delta" or "negative_count", the former for // regular histograms with integer counts, the latter for float // histograms. - NegativeDelta []int64 `protobuf:"zigzag64,10,rep,name=negative_delta,json=negativeDelta" json:"negative_delta,omitempty"` - NegativeCount []float64 `protobuf:"fixed64,11,rep,name=negative_count,json=negativeCount" json:"negative_count,omitempty"` + NegativeDelta []int64 `protobuf:"zigzag64,10,rep,name=negative_delta,json=negativeDelta" json:"negative_delta,omitempty"` // Count delta of each bucket compared to previous one (or to zero for 1st bucket). + NegativeCount []float64 `protobuf:"fixed64,11,rep,name=negative_count,json=negativeCount" json:"negative_count,omitempty"` // Absolute count of each bucket. // Positive buckets for the native histogram. PositiveSpan []*BucketSpan `protobuf:"bytes,12,rep,name=positive_span,json=positiveSpan" json:"positive_span,omitempty"` // Use either "positive_delta" or "positive_count", the former for // regular histograms with integer counts, the latter for float // histograms. - PositiveDelta []int64 `protobuf:"zigzag64,13,rep,name=positive_delta,json=positiveDelta" json:"positive_delta,omitempty"` - PositiveCount []float64 `protobuf:"fixed64,14,rep,name=positive_count,json=positiveCount" json:"positive_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + PositiveDelta []int64 `protobuf:"zigzag64,13,rep,name=positive_delta,json=positiveDelta" json:"positive_delta,omitempty"` // Count delta of each bucket compared to previous one (or to zero for 1st bucket). + PositiveCount []float64 `protobuf:"fixed64,14,rep,name=positive_count,json=positiveCount" json:"positive_count,omitempty"` // Absolute count of each bucket. } -func (m *Histogram) Reset() { *m = Histogram{} } -func (m *Histogram) String() string { return proto.CompactTextString(m) } -func (*Histogram) ProtoMessage() {} -func (*Histogram) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{6} +func (x *Histogram) Reset() { + *x = Histogram{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Histogram) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Histogram.Unmarshal(m, b) +func (x *Histogram) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Histogram) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Histogram.Marshal(b, m, deterministic) -} -func (m *Histogram) XXX_Merge(src proto.Message) { - xxx_messageInfo_Histogram.Merge(m, src) -} -func (m *Histogram) XXX_Size() int { - return xxx_messageInfo_Histogram.Size(m) -} -func (m *Histogram) XXX_DiscardUnknown() { - xxx_messageInfo_Histogram.DiscardUnknown(m) + +func (*Histogram) ProtoMessage() {} + +func (x *Histogram) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Histogram proto.InternalMessageInfo +// Deprecated: Use Histogram.ProtoReflect.Descriptor instead. +func (*Histogram) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{6} +} -func (m *Histogram) GetSampleCount() uint64 { - if m != nil && m.SampleCount != nil { - return *m.SampleCount +func (x *Histogram) GetSampleCount() uint64 { + if x != nil && x.SampleCount != nil { + return *x.SampleCount } return 0 } -func (m *Histogram) GetSampleCountFloat() float64 { - if m != nil && m.SampleCountFloat != nil { - return *m.SampleCountFloat +func (x *Histogram) GetSampleCountFloat() float64 { + if x != nil && x.SampleCountFloat != nil { + return *x.SampleCountFloat } return 0 } -func (m *Histogram) GetSampleSum() float64 { - if m != nil && m.SampleSum != nil { - return *m.SampleSum +func (x *Histogram) GetSampleSum() float64 { + if x != nil && x.SampleSum != nil { + return *x.SampleSum } return 0 } -func (m *Histogram) GetBucket() []*Bucket { - if m != nil { - return m.Bucket +func (x *Histogram) GetBucket() []*Bucket { + if x != nil { + return x.Bucket } return nil } -func (m *Histogram) GetSchema() int32 { - if m != nil && m.Schema != nil { - return *m.Schema +func (x *Histogram) GetSchema() int32 { + if x != nil && x.Schema != nil { + return *x.Schema } return 0 } -func (m *Histogram) GetZeroThreshold() float64 { - if m != nil && m.ZeroThreshold != nil { - return *m.ZeroThreshold +func (x *Histogram) GetZeroThreshold() float64 { + if x != nil && x.ZeroThreshold != nil { + return *x.ZeroThreshold } return 0 } -func (m *Histogram) GetZeroCount() uint64 { - if m != nil && m.ZeroCount != nil { - return *m.ZeroCount +func (x *Histogram) GetZeroCount() uint64 { + if x != nil && x.ZeroCount != nil { + return *x.ZeroCount } return 0 } -func (m *Histogram) GetZeroCountFloat() float64 { - if m != nil && m.ZeroCountFloat != nil { - return *m.ZeroCountFloat +func (x *Histogram) GetZeroCountFloat() float64 { + if x != nil && x.ZeroCountFloat != nil { + return *x.ZeroCountFloat } return 0 } -func (m *Histogram) GetNegativeSpan() []*BucketSpan { - if m != nil { - return m.NegativeSpan +func (x *Histogram) GetNegativeSpan() []*BucketSpan { + if x != nil { + return x.NegativeSpan } return nil } -func (m *Histogram) GetNegativeDelta() []int64 { - if m != nil { - return m.NegativeDelta +func (x *Histogram) GetNegativeDelta() []int64 { + if x != nil { + return x.NegativeDelta } return nil } -func (m *Histogram) GetNegativeCount() []float64 { - if m != nil { - return m.NegativeCount +func (x *Histogram) GetNegativeCount() []float64 { + if x != nil { + return x.NegativeCount } return nil } -func (m *Histogram) GetPositiveSpan() []*BucketSpan { - if m != nil { - return m.PositiveSpan +func (x *Histogram) GetPositiveSpan() []*BucketSpan { + if x != nil { + return x.PositiveSpan } return nil } -func (m *Histogram) GetPositiveDelta() []int64 { - if m != nil { - return m.PositiveDelta +func (x *Histogram) GetPositiveDelta() []int64 { + if x != nil { + return x.PositiveDelta } return nil } -func (m *Histogram) GetPositiveCount() []float64 { - if m != nil { - return m.PositiveCount +func (x *Histogram) GetPositiveCount() []float64 { + if x != nil { + return x.PositiveCount } return nil } @@ -513,64 +598,72 @@ func (m *Histogram) GetPositiveCount() []float64 { // A Bucket of a conventional histogram, each of which is treated as // an individual counter-like time series by Prometheus. type Bucket struct { - CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` - CumulativeCountFloat *float64 `protobuf:"fixed64,4,opt,name=cumulative_count_float,json=cumulativeCountFloat" json:"cumulative_count_float,omitempty"` - UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` // Cumulative in increasing order. + CumulativeCountFloat *float64 `protobuf:"fixed64,4,opt,name=cumulative_count_float,json=cumulativeCountFloat" json:"cumulative_count_float,omitempty"` // Overrides cumulative_count if > 0. + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` // Inclusive. Exemplar *Exemplar `protobuf:"bytes,3,opt,name=exemplar" json:"exemplar,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` } -func (m *Bucket) Reset() { *m = Bucket{} } -func (m *Bucket) String() string { return proto.CompactTextString(m) } -func (*Bucket) ProtoMessage() {} -func (*Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{7} +func (x *Bucket) Reset() { + *x = Bucket{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Bucket) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Bucket.Unmarshal(m, b) -} -func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Bucket.Marshal(b, m, deterministic) -} -func (m *Bucket) XXX_Merge(src proto.Message) { - xxx_messageInfo_Bucket.Merge(m, src) -} -func (m *Bucket) XXX_Size() int { - return xxx_messageInfo_Bucket.Size(m) +func (x *Bucket) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Bucket) XXX_DiscardUnknown() { - xxx_messageInfo_Bucket.DiscardUnknown(m) + +func (*Bucket) ProtoMessage() {} + +func (x *Bucket) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Bucket proto.InternalMessageInfo +// Deprecated: Use Bucket.ProtoReflect.Descriptor instead. +func (*Bucket) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{7} +} -func (m *Bucket) GetCumulativeCount() uint64 { - if m != nil && m.CumulativeCount != nil { - return *m.CumulativeCount +func (x *Bucket) GetCumulativeCount() uint64 { + if x != nil && x.CumulativeCount != nil { + return *x.CumulativeCount } return 0 } -func (m *Bucket) GetCumulativeCountFloat() float64 { - if m != nil && m.CumulativeCountFloat != nil { - return *m.CumulativeCountFloat +func (x *Bucket) GetCumulativeCountFloat() float64 { + if x != nil && x.CumulativeCountFloat != nil { + return *x.CumulativeCountFloat } return 0 } -func (m *Bucket) GetUpperBound() float64 { - if m != nil && m.UpperBound != nil { - return *m.UpperBound +func (x *Bucket) GetUpperBound() float64 { + if x != nil && x.UpperBound != nil { + return *x.UpperBound } return 0 } -func (m *Bucket) GetExemplar() *Exemplar { - if m != nil { - return m.Exemplar +func (x *Bucket) GetExemplar() *Exemplar { + if x != nil { + return x.Exemplar } return nil } @@ -582,333 +675,658 @@ func (m *Bucket) GetExemplar() *Exemplar { // structured here (with all the buckets in a single array separate // from the Spans). type BucketSpan struct { - Offset *int32 `protobuf:"zigzag32,1,opt,name=offset" json:"offset,omitempty"` - Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *BucketSpan) Reset() { *m = BucketSpan{} } -func (m *BucketSpan) String() string { return proto.CompactTextString(m) } -func (*BucketSpan) ProtoMessage() {} -func (*BucketSpan) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{8} + Offset *int32 `protobuf:"zigzag32,1,opt,name=offset" json:"offset,omitempty"` // Gap to previous span, or starting point for 1st span (which can be negative). + Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` // Length of consecutive buckets. } -func (m *BucketSpan) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BucketSpan.Unmarshal(m, b) -} -func (m *BucketSpan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BucketSpan.Marshal(b, m, deterministic) -} -func (m *BucketSpan) XXX_Merge(src proto.Message) { - xxx_messageInfo_BucketSpan.Merge(m, src) +func (x *BucketSpan) Reset() { + *x = BucketSpan{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *BucketSpan) XXX_Size() int { - return xxx_messageInfo_BucketSpan.Size(m) + +func (x *BucketSpan) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *BucketSpan) XXX_DiscardUnknown() { - xxx_messageInfo_BucketSpan.DiscardUnknown(m) + +func (*BucketSpan) ProtoMessage() {} + +func (x *BucketSpan) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_BucketSpan proto.InternalMessageInfo +// Deprecated: Use BucketSpan.ProtoReflect.Descriptor instead. +func (*BucketSpan) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{8} +} -func (m *BucketSpan) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset +func (x *BucketSpan) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset } return 0 } -func (m *BucketSpan) GetLength() uint32 { - if m != nil && m.Length != nil { - return *m.Length +func (x *BucketSpan) GetLength() uint32 { + if x != nil && x.Length != nil { + return *x.Length } return 0 } type Exemplar struct { - Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` - Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` - Timestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=timestamp" json:"timestamp,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Exemplar) Reset() { *m = Exemplar{} } -func (m *Exemplar) String() string { return proto.CompactTextString(m) } -func (*Exemplar) ProtoMessage() {} -func (*Exemplar) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{9} + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp" json:"timestamp,omitempty"` // OpenMetrics-style. } -func (m *Exemplar) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Exemplar.Unmarshal(m, b) -} -func (m *Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Exemplar.Marshal(b, m, deterministic) -} -func (m *Exemplar) XXX_Merge(src proto.Message) { - xxx_messageInfo_Exemplar.Merge(m, src) +func (x *Exemplar) Reset() { + *x = Exemplar{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Exemplar) XXX_Size() int { - return xxx_messageInfo_Exemplar.Size(m) + +func (x *Exemplar) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Exemplar) XXX_DiscardUnknown() { - xxx_messageInfo_Exemplar.DiscardUnknown(m) + +func (*Exemplar) ProtoMessage() {} + +func (x *Exemplar) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Exemplar proto.InternalMessageInfo +// Deprecated: Use Exemplar.ProtoReflect.Descriptor instead. +func (*Exemplar) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{9} +} -func (m *Exemplar) GetLabel() []*LabelPair { - if m != nil { - return m.Label +func (x *Exemplar) GetLabel() []*LabelPair { + if x != nil { + return x.Label } return nil } -func (m *Exemplar) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Exemplar) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } -func (m *Exemplar) GetTimestamp() *timestamp.Timestamp { - if m != nil { - return m.Timestamp +func (x *Exemplar) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp } return nil } type Metric struct { - Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` - Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` - Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` - Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` - Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` - Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` - TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms,json=timestampMs" json:"timestamp_ms,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Metric) Reset() { *m = Metric{} } -func (m *Metric) String() string { return proto.CompactTextString(m) } -func (*Metric) ProtoMessage() {} -func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{10} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms,json=timestampMs" json:"timestamp_ms,omitempty"` +} + +func (x *Metric) Reset() { + *x = Metric{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Metric) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Metric.Unmarshal(m, b) +func (x *Metric) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Metric.Marshal(b, m, deterministic) -} -func (m *Metric) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metric.Merge(m, src) -} -func (m *Metric) XXX_Size() int { - return xxx_messageInfo_Metric.Size(m) -} -func (m *Metric) XXX_DiscardUnknown() { - xxx_messageInfo_Metric.DiscardUnknown(m) + +func (*Metric) ProtoMessage() {} + +func (x *Metric) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Metric proto.InternalMessageInfo +// Deprecated: Use Metric.ProtoReflect.Descriptor instead. +func (*Metric) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{10} +} -func (m *Metric) GetLabel() []*LabelPair { - if m != nil { - return m.Label +func (x *Metric) GetLabel() []*LabelPair { + if x != nil { + return x.Label } return nil } -func (m *Metric) GetGauge() *Gauge { - if m != nil { - return m.Gauge +func (x *Metric) GetGauge() *Gauge { + if x != nil { + return x.Gauge } return nil } -func (m *Metric) GetCounter() *Counter { - if m != nil { - return m.Counter +func (x *Metric) GetCounter() *Counter { + if x != nil { + return x.Counter } return nil } -func (m *Metric) GetSummary() *Summary { - if m != nil { - return m.Summary +func (x *Metric) GetSummary() *Summary { + if x != nil { + return x.Summary } return nil } -func (m *Metric) GetUntyped() *Untyped { - if m != nil { - return m.Untyped +func (x *Metric) GetUntyped() *Untyped { + if x != nil { + return x.Untyped } return nil } -func (m *Metric) GetHistogram() *Histogram { - if m != nil { - return m.Histogram +func (x *Metric) GetHistogram() *Histogram { + if x != nil { + return x.Histogram } return nil } -func (m *Metric) GetTimestampMs() int64 { - if m != nil && m.TimestampMs != nil { - return *m.TimestampMs +func (x *Metric) GetTimestampMs() int64 { + if x != nil && x.TimestampMs != nil { + return *x.TimestampMs } return 0 } type MetricFamily struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` - Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` - Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MetricFamily) Reset() { *m = MetricFamily{} } -func (m *MetricFamily) String() string { return proto.CompactTextString(m) } -func (*MetricFamily) ProtoMessage() {} -func (*MetricFamily) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{11} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` +} + +func (x *MetricFamily) Reset() { + *x = MetricFamily{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *MetricFamily) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MetricFamily.Unmarshal(m, b) -} -func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MetricFamily.Marshal(b, m, deterministic) -} -func (m *MetricFamily) XXX_Merge(src proto.Message) { - xxx_messageInfo_MetricFamily.Merge(m, src) -} -func (m *MetricFamily) XXX_Size() int { - return xxx_messageInfo_MetricFamily.Size(m) +func (x *MetricFamily) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *MetricFamily) XXX_DiscardUnknown() { - xxx_messageInfo_MetricFamily.DiscardUnknown(m) + +func (*MetricFamily) ProtoMessage() {} + +func (x *MetricFamily) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_MetricFamily proto.InternalMessageInfo +// Deprecated: Use MetricFamily.ProtoReflect.Descriptor instead. +func (*MetricFamily) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{11} +} -func (m *MetricFamily) GetName() string { - if m != nil && m.Name != nil { - return *m.Name +func (x *MetricFamily) GetName() string { + if x != nil && x.Name != nil { + return *x.Name } return "" } -func (m *MetricFamily) GetHelp() string { - if m != nil && m.Help != nil { - return *m.Help +func (x *MetricFamily) GetHelp() string { + if x != nil && x.Help != nil { + return *x.Help } return "" } -func (m *MetricFamily) GetType() MetricType { - if m != nil && m.Type != nil { - return *m.Type +func (x *MetricFamily) GetType() MetricType { + if x != nil && x.Type != nil { + return *x.Type } return MetricType_COUNTER } -func (m *MetricFamily) GetMetric() []*Metric { - if m != nil { - return m.Metric +func (x *MetricFamily) GetMetric() []*Metric { + if x != nil { + return x.Metric } return nil } -func init() { - proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) - proto.RegisterType((*LabelPair)(nil), "io.prometheus.client.LabelPair") - proto.RegisterType((*Gauge)(nil), "io.prometheus.client.Gauge") - proto.RegisterType((*Counter)(nil), "io.prometheus.client.Counter") - proto.RegisterType((*Quantile)(nil), "io.prometheus.client.Quantile") - proto.RegisterType((*Summary)(nil), "io.prometheus.client.Summary") - proto.RegisterType((*Untyped)(nil), "io.prometheus.client.Untyped") - proto.RegisterType((*Histogram)(nil), "io.prometheus.client.Histogram") - proto.RegisterType((*Bucket)(nil), "io.prometheus.client.Bucket") - proto.RegisterType((*BucketSpan)(nil), "io.prometheus.client.BucketSpan") - proto.RegisterType((*Exemplar)(nil), "io.prometheus.client.Exemplar") - proto.RegisterType((*Metric)(nil), "io.prometheus.client.Metric") - proto.RegisterType((*MetricFamily)(nil), "io.prometheus.client.MetricFamily") -} - -func init() { - proto.RegisterFile("io/prometheus/client/metrics.proto", fileDescriptor_d1e5ddb18987a258) -} - -var fileDescriptor_d1e5ddb18987a258 = []byte{ - // 896 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x8e, 0xdb, 0x44, - 0x18, 0xc5, 0x9b, 0x5f, 0x7f, 0xd9, 0x6c, 0xd3, 0x61, 0x55, 0x59, 0x0b, 0xcb, 0x06, 0x4b, 0x48, - 0x0b, 0x42, 0x8e, 0x40, 0x5b, 0x81, 0x0a, 0x5c, 0xec, 0xb6, 0xe9, 0x16, 0x89, 0xb4, 0x65, 0x92, - 0x5c, 0x14, 0x2e, 0xac, 0x49, 0x32, 0xeb, 0x58, 0x78, 0x3c, 0xc6, 0x1e, 0x57, 0x2c, 0x2f, 0xc0, - 0x35, 0xaf, 0xc0, 0xc3, 0xf0, 0x22, 0x3c, 0x08, 0x68, 0xfe, 0xec, 0xdd, 0xe2, 0x94, 0xd2, 0x3b, - 0x7f, 0x67, 0xce, 0xf7, 0xcd, 0x39, 0xe3, 0xc9, 0x71, 0xc0, 0x8f, 0xf9, 0x24, 0xcb, 0x39, 0xa3, - 0x62, 0x4b, 0xcb, 0x62, 0xb2, 0x4e, 0x62, 0x9a, 0x8a, 0x09, 0xa3, 0x22, 0x8f, 0xd7, 0x45, 0x90, - 0xe5, 0x5c, 0x70, 0x74, 0x18, 0xf3, 0xa0, 0xe6, 0x04, 0x9a, 0x73, 0x74, 0x12, 0x71, 0x1e, 0x25, - 0x74, 0xa2, 0x38, 0xab, 0xf2, 0x6a, 0x22, 0x62, 0x46, 0x0b, 0x41, 0x58, 0xa6, 0xdb, 0xfc, 0xfb, - 0xe0, 0x7e, 0x47, 0x56, 0x34, 0x79, 0x4e, 0xe2, 0x1c, 0x21, 0x68, 0xa7, 0x84, 0x51, 0xcf, 0x19, - 0x3b, 0xa7, 0x2e, 0x56, 0xcf, 0xe8, 0x10, 0x3a, 0x2f, 0x49, 0x52, 0x52, 0x6f, 0x4f, 0x81, 0xba, - 0xf0, 0x8f, 0xa1, 0x73, 0x49, 0xca, 0xe8, 0xc6, 0xb2, 0xec, 0x71, 0xec, 0xf2, 0x8f, 0xd0, 0x7b, - 0xc8, 0xcb, 0x54, 0xd0, 0xbc, 0x99, 0x80, 0x1e, 0x40, 0x9f, 0xfe, 0x42, 0x59, 0x96, 0x90, 0x5c, - 0x0d, 0x1e, 0x7c, 0xfe, 0x41, 0xd0, 0x64, 0x20, 0x98, 0x1a, 0x16, 0xae, 0xf8, 0xfe, 0xd7, 0xd0, - 0xff, 0xbe, 0x24, 0xa9, 0x88, 0x13, 0x8a, 0x8e, 0xa0, 0xff, 0xb3, 0x79, 0x36, 0x1b, 0x54, 0xf5, - 0x6d, 0xe5, 0x95, 0xb4, 0xdf, 0x1c, 0xe8, 0xcd, 0x4b, 0xc6, 0x48, 0x7e, 0x8d, 0x3e, 0x84, 0xfd, - 0x82, 0xb0, 0x2c, 0xa1, 0xe1, 0x5a, 0xaa, 0x55, 0x13, 0xda, 0x78, 0xa0, 0x31, 0x65, 0x00, 0x1d, - 0x03, 0x18, 0x4a, 0x51, 0x32, 0x33, 0xc9, 0xd5, 0xc8, 0xbc, 0x64, 0xd2, 0x47, 0xb5, 0x7f, 0x6b, - 0xdc, 0xda, 0xed, 0xc3, 0x2a, 0xae, 0xf5, 0xf9, 0x27, 0xd0, 0x5b, 0xa6, 0xe2, 0x3a, 0xa3, 0x9b, - 0x1d, 0xa7, 0xf8, 0x57, 0x1b, 0xdc, 0x27, 0x71, 0x21, 0x78, 0x94, 0x13, 0xf6, 0x26, 0x62, 0x3f, - 0x05, 0x74, 0x93, 0x12, 0x5e, 0x25, 0x9c, 0x08, 0xaf, 0xad, 0x66, 0x8e, 0x6e, 0x10, 0x1f, 0x4b, - 0xfc, 0xbf, 0xac, 0x9d, 0x41, 0x77, 0x55, 0xae, 0x7f, 0xa2, 0xc2, 0x18, 0x7b, 0xbf, 0xd9, 0xd8, - 0x85, 0xe2, 0x60, 0xc3, 0x45, 0xf7, 0xa0, 0x5b, 0xac, 0xb7, 0x94, 0x11, 0xaf, 0x33, 0x76, 0x4e, - 0xef, 0x62, 0x53, 0xa1, 0x8f, 0xe0, 0xe0, 0x57, 0x9a, 0xf3, 0x50, 0x6c, 0x73, 0x5a, 0x6c, 0x79, - 0xb2, 0xf1, 0xba, 0x6a, 0xc3, 0xa1, 0x44, 0x17, 0x16, 0x94, 0x9a, 0x14, 0x4d, 0x5b, 0xec, 0x29, - 0x8b, 0xae, 0x44, 0xb4, 0xc1, 0x53, 0x18, 0xd5, 0xcb, 0xc6, 0x5e, 0x5f, 0xcd, 0x39, 0xa8, 0x48, - 0xda, 0xdc, 0x14, 0x86, 0x29, 0x8d, 0x88, 0x88, 0x5f, 0xd2, 0xb0, 0xc8, 0x48, 0xea, 0xb9, 0xca, - 0xc4, 0xf8, 0x75, 0x26, 0xe6, 0x19, 0x49, 0xf1, 0xbe, 0x6d, 0x93, 0x95, 0x94, 0x5d, 0x8d, 0xd9, - 0xd0, 0x44, 0x10, 0x0f, 0xc6, 0xad, 0x53, 0x84, 0xab, 0xe1, 0x8f, 0x24, 0x78, 0x8b, 0xa6, 0xa5, - 0x0f, 0xc6, 0x2d, 0xe9, 0xce, 0xa2, 0x5a, 0xfe, 0x14, 0x86, 0x19, 0x2f, 0xe2, 0x5a, 0xd4, 0xfe, - 0x9b, 0x8a, 0xb2, 0x6d, 0x56, 0x54, 0x35, 0x46, 0x8b, 0x1a, 0x6a, 0x51, 0x16, 0xad, 0x44, 0x55, - 0x34, 0x2d, 0xea, 0x40, 0x8b, 0xb2, 0xa8, 0x12, 0xe5, 0xff, 0xe9, 0x40, 0x57, 0x6f, 0x85, 0x3e, - 0x86, 0xd1, 0xba, 0x64, 0x65, 0x72, 0xd3, 0x88, 0xbe, 0x66, 0x77, 0x6a, 0x5c, 0x5b, 0x39, 0x83, - 0x7b, 0xaf, 0x52, 0x6f, 0x5d, 0xb7, 0xc3, 0x57, 0x1a, 0xf4, 0x5b, 0x39, 0x81, 0x41, 0x99, 0x65, - 0x34, 0x0f, 0x57, 0xbc, 0x4c, 0x37, 0xe6, 0xce, 0x81, 0x82, 0x2e, 0x24, 0x72, 0x2b, 0x17, 0x5a, - 0xff, 0x3b, 0x17, 0xa0, 0x3e, 0x32, 0x79, 0x11, 0xf9, 0xd5, 0x55, 0x41, 0xb5, 0x83, 0xbb, 0xd8, - 0x54, 0x12, 0x4f, 0x68, 0x1a, 0x89, 0xad, 0xda, 0x7d, 0x88, 0x4d, 0xe5, 0xff, 0xee, 0x40, 0xdf, - 0x0e, 0x45, 0xf7, 0xa1, 0x93, 0xc8, 0x54, 0xf4, 0x1c, 0xf5, 0x82, 0x4e, 0x9a, 0x35, 0x54, 0xc1, - 0x89, 0x35, 0xbb, 0x39, 0x71, 0xd0, 0x97, 0xe0, 0x56, 0xa9, 0x6b, 0x4c, 0x1d, 0x05, 0x3a, 0x97, - 0x03, 0x9b, 0xcb, 0xc1, 0xc2, 0x32, 0x70, 0x4d, 0xf6, 0xff, 0xde, 0x83, 0xee, 0x4c, 0xa5, 0xfc, - 0xdb, 0x2a, 0xfa, 0x0c, 0x3a, 0x91, 0xcc, 0x69, 0x13, 0xb2, 0xef, 0x35, 0xb7, 0xa9, 0x28, 0xc7, - 0x9a, 0x89, 0xbe, 0x80, 0xde, 0x5a, 0x67, 0xb7, 0x11, 0x7b, 0xdc, 0xdc, 0x64, 0x02, 0x1e, 0x5b, - 0xb6, 0x6c, 0x2c, 0x74, 0xb0, 0xaa, 0x3b, 0xb0, 0xb3, 0xd1, 0xa4, 0x2f, 0xb6, 0x6c, 0xd9, 0x58, - 0xea, 0x20, 0x54, 0xa1, 0xb1, 0xb3, 0xd1, 0xa4, 0x25, 0xb6, 0x6c, 0xf4, 0x0d, 0xb8, 0x5b, 0x9b, - 0x8f, 0x2a, 0x2c, 0x76, 0x1e, 0x4c, 0x15, 0xa3, 0xb8, 0xee, 0x90, 0x89, 0x5a, 0x9d, 0x75, 0xc8, - 0x0a, 0x95, 0x48, 0x2d, 0x3c, 0xa8, 0xb0, 0x59, 0xe1, 0xff, 0xe1, 0xc0, 0xbe, 0x7e, 0x03, 0x8f, - 0x09, 0x8b, 0x93, 0xeb, 0xc6, 0x4f, 0x24, 0x82, 0xf6, 0x96, 0x26, 0x99, 0xf9, 0x42, 0xaa, 0x67, - 0x74, 0x06, 0x6d, 0xa9, 0x51, 0x1d, 0xe1, 0xc1, 0xae, 0x5f, 0xb8, 0x9e, 0xbc, 0xb8, 0xce, 0x28, - 0x56, 0x6c, 0x99, 0xb9, 0xfa, 0xab, 0xee, 0xb5, 0x5f, 0x97, 0xb9, 0xba, 0x0f, 0x1b, 0xee, 0x27, - 0x2b, 0x80, 0x7a, 0x12, 0x1a, 0x40, 0xef, 0xe1, 0xb3, 0xe5, 0xd3, 0xc5, 0x14, 0x8f, 0xde, 0x41, - 0x2e, 0x74, 0x2e, 0xcf, 0x97, 0x97, 0xd3, 0x91, 0x23, 0xf1, 0xf9, 0x72, 0x36, 0x3b, 0xc7, 0x2f, - 0x46, 0x7b, 0xb2, 0x58, 0x3e, 0x5d, 0xbc, 0x78, 0x3e, 0x7d, 0x34, 0x6a, 0xa1, 0x21, 0xb8, 0x4f, - 0xbe, 0x9d, 0x2f, 0x9e, 0x5d, 0xe2, 0xf3, 0xd9, 0xa8, 0x8d, 0xde, 0x85, 0x3b, 0xaa, 0x27, 0xac, - 0xc1, 0xce, 0x05, 0x86, 0xc6, 0x3f, 0x18, 0x3f, 0x3c, 0x88, 0x62, 0xb1, 0x2d, 0x57, 0xc1, 0x9a, - 0xb3, 0x7f, 0xff, 0x45, 0x09, 0x19, 0xdf, 0xd0, 0x64, 0x12, 0xf1, 0xaf, 0x62, 0x1e, 0xd6, 0xab, - 0xa1, 0x5e, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x16, 0x77, 0x81, 0x98, 0xd7, 0x08, 0x00, 0x00, +var File_io_prometheus_client_metrics_proto protoreflect.FileDescriptor + +var file_io_prometheus_client_metrics_proto_rawDesc = []byte{ + 0x0a, 0x22, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, + 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x35, 0x0a, 0x09, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x47, 0x61, 0x75, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x5b, 0x0a, 0x07, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, + 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, + 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x87, 0x01, 0x0a, + 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x09, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x1f, 0x0a, 0x07, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe3, 0x04, 0x0a, 0x09, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x7a, 0x65, 0x72, + 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x7a, 0x65, + 0x72, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x7a, 0x65, 0x72, + 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, + 0x6f, 0x61, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x73, 0x70, 0x61, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, + 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x6e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x12, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x74, + 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, + 0x6e, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, + 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc6, 0x01, + 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0f, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, 0x0a, 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x53, 0x70, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x72, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, + 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xff, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, + 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, + 0x61, 0x69, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x31, 0x0a, 0x05, 0x67, 0x61, + 0x75, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x70, + 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x61, 0x75, 0x67, 0x65, 0x52, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x12, 0x37, 0x0a, + 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, + 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x37, 0x0a, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x52, + 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, + 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x09, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x0c, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, + 0x65, 0x6c, 0x70, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, + 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, + 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2a, + 0x62, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, + 0x55, 0x47, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, + 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x44, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x04, 0x12, 0x13, + 0x0a, 0x0f, 0x47, 0x41, 0x55, 0x47, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, + 0x4d, 0x10, 0x05, 0x42, 0x52, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, + 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5a, 0x3a, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, + 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, + 0x67, 0x6f, 0x3b, 0x69, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, +} + +var ( + file_io_prometheus_client_metrics_proto_rawDescOnce sync.Once + file_io_prometheus_client_metrics_proto_rawDescData = file_io_prometheus_client_metrics_proto_rawDesc +) + +func file_io_prometheus_client_metrics_proto_rawDescGZIP() []byte { + file_io_prometheus_client_metrics_proto_rawDescOnce.Do(func() { + file_io_prometheus_client_metrics_proto_rawDescData = protoimpl.X.CompressGZIP(file_io_prometheus_client_metrics_proto_rawDescData) + }) + return file_io_prometheus_client_metrics_proto_rawDescData +} + +var file_io_prometheus_client_metrics_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_io_prometheus_client_metrics_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_io_prometheus_client_metrics_proto_goTypes = []interface{}{ + (MetricType)(0), // 0: io.prometheus.client.MetricType + (*LabelPair)(nil), // 1: io.prometheus.client.LabelPair + (*Gauge)(nil), // 2: io.prometheus.client.Gauge + (*Counter)(nil), // 3: io.prometheus.client.Counter + (*Quantile)(nil), // 4: io.prometheus.client.Quantile + (*Summary)(nil), // 5: io.prometheus.client.Summary + (*Untyped)(nil), // 6: io.prometheus.client.Untyped + (*Histogram)(nil), // 7: io.prometheus.client.Histogram + (*Bucket)(nil), // 8: io.prometheus.client.Bucket + (*BucketSpan)(nil), // 9: io.prometheus.client.BucketSpan + (*Exemplar)(nil), // 10: io.prometheus.client.Exemplar + (*Metric)(nil), // 11: io.prometheus.client.Metric + (*MetricFamily)(nil), // 12: io.prometheus.client.MetricFamily + (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp +} +var file_io_prometheus_client_metrics_proto_depIdxs = []int32{ + 10, // 0: io.prometheus.client.Counter.exemplar:type_name -> io.prometheus.client.Exemplar + 4, // 1: io.prometheus.client.Summary.quantile:type_name -> io.prometheus.client.Quantile + 8, // 2: io.prometheus.client.Histogram.bucket:type_name -> io.prometheus.client.Bucket + 9, // 3: io.prometheus.client.Histogram.negative_span:type_name -> io.prometheus.client.BucketSpan + 9, // 4: io.prometheus.client.Histogram.positive_span:type_name -> io.prometheus.client.BucketSpan + 10, // 5: io.prometheus.client.Bucket.exemplar:type_name -> io.prometheus.client.Exemplar + 1, // 6: io.prometheus.client.Exemplar.label:type_name -> io.prometheus.client.LabelPair + 13, // 7: io.prometheus.client.Exemplar.timestamp:type_name -> google.protobuf.Timestamp + 1, // 8: io.prometheus.client.Metric.label:type_name -> io.prometheus.client.LabelPair + 2, // 9: io.prometheus.client.Metric.gauge:type_name -> io.prometheus.client.Gauge + 3, // 10: io.prometheus.client.Metric.counter:type_name -> io.prometheus.client.Counter + 5, // 11: io.prometheus.client.Metric.summary:type_name -> io.prometheus.client.Summary + 6, // 12: io.prometheus.client.Metric.untyped:type_name -> io.prometheus.client.Untyped + 7, // 13: io.prometheus.client.Metric.histogram:type_name -> io.prometheus.client.Histogram + 0, // 14: io.prometheus.client.MetricFamily.type:type_name -> io.prometheus.client.MetricType + 11, // 15: io.prometheus.client.MetricFamily.metric:type_name -> io.prometheus.client.Metric + 16, // [16:16] is the sub-list for method output_type + 16, // [16:16] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name +} + +func init() { file_io_prometheus_client_metrics_proto_init() } +func file_io_prometheus_client_metrics_proto_init() { + if File_io_prometheus_client_metrics_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_io_prometheus_client_metrics_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LabelPair); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Gauge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Counter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Quantile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Summary); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Untyped); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Histogram); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Bucket); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BucketSpan); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Exemplar); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Metric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetricFamily); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_io_prometheus_client_metrics_proto_rawDesc, + NumEnums: 1, + NumMessages: 12, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_io_prometheus_client_metrics_proto_goTypes, + DependencyIndexes: file_io_prometheus_client_metrics_proto_depIdxs, + EnumInfos: file_io_prometheus_client_metrics_proto_enumTypes, + MessageInfos: file_io_prometheus_client_metrics_proto_msgTypes, + }.Build() + File_io_prometheus_client_metrics_proto = out.File + file_io_prometheus_client_metrics_proto_rawDesc = nil + file_io_prometheus_client_metrics_proto_goTypes = nil + file_io_prometheus_client_metrics_proto_depIdxs = nil } diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go index 7657f841d6..9063978151 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -115,32 +115,31 @@ func (d *protoDecoder) Decode(v *dto.MetricFamily) error { // textDecoder implements the Decoder interface for the text protocol. type textDecoder struct { r io.Reader - p TextParser - fams []*dto.MetricFamily + fams map[string]*dto.MetricFamily + err error } // Decode implements the Decoder interface. func (d *textDecoder) Decode(v *dto.MetricFamily) error { - // TODO(fabxc): Wrap this as a line reader to make streaming safer. - if len(d.fams) == 0 { - // No cached metric families, read everything and parse metrics. - fams, err := d.p.TextToMetricFamilies(d.r) - if err != nil { - return err - } - if len(fams) == 0 { - return io.EOF - } - d.fams = make([]*dto.MetricFamily, 0, len(fams)) - for _, f := range fams { - d.fams = append(d.fams, f) + if d.err == nil { + // Read all metrics in one shot. + var p TextParser + d.fams, d.err = p.TextToMetricFamilies(d.r) + // If we don't get an error, store io.EOF for the end. + if d.err == nil { + d.err = io.EOF } } - - *v = *d.fams[0] - d.fams = d.fams[1:] - - return nil + // Pick off one MetricFamily per Decode until there's nothing left. + for key, fam := range d.fams { + v.Name = fam.Name + v.Help = fam.Help + v.Type = fam.Type + v.Metric = fam.Metric + delete(d.fams, key) + return nil + } + return d.err } // SampleDecoder wraps a Decoder to extract samples from the metric families diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go index 64dc0eb40c..7f611ffaad 100644 --- a/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -18,9 +18,9 @@ import ( "io" "net/http" - "github.com/golang/protobuf/proto" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/matttproud/golang_protobuf_extensions/pbutil" "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + "google.golang.org/protobuf/encoding/prototext" dto "github.com/prometheus/client_model/go" ) @@ -99,8 +99,11 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format { if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { return FmtText } - if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion || ver == "") { - return FmtOpenMetrics + if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") { + if ver == OpenMetricsVersion_1_0_0 { + return FmtOpenMetrics_1_0_0 + } + return FmtOpenMetrics_0_0_1 } } return FmtText @@ -133,7 +136,7 @@ func NewEncoder(w io.Writer, format Format) Encoder { case FmtProtoText: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + _, err := fmt.Fprintln(w, prototext.Format(v)) return err }, close: func() error { return nil }, @@ -146,7 +149,7 @@ func NewEncoder(w io.Writer, format Format) Encoder { }, close: func() error { return nil }, } - case FmtOpenMetrics: + case FmtOpenMetrics_0_0_1, FmtOpenMetrics_1_0_0: return encoderCloser{ encode: func(v *dto.MetricFamily) error { _, err := MetricFamilyToOpenMetrics(w, v) diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/prometheus/common/expfmt/expfmt.go index 0f176fa64f..c4cb20f0d3 100644 --- a/vendor/github.com/prometheus/common/expfmt/expfmt.go +++ b/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -19,20 +19,22 @@ type Format string // Constants to assemble the Content-Type values for the different wire protocols. const ( - TextVersion = "0.0.4" - ProtoType = `application/vnd.google.protobuf` - ProtoProtocol = `io.prometheus.client.MetricFamily` - ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" - OpenMetricsType = `application/openmetrics-text` - OpenMetricsVersion = "0.0.1" + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + OpenMetricsType = `application/openmetrics-text` + OpenMetricsVersion_0_0_1 = "0.0.1" + OpenMetricsVersion_1_0_0 = "1.0.0" // The Content-Type values for the different wire protocols. - FmtUnknown Format = `` - FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` - FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` - FmtProtoText Format = ProtoFmt + ` encoding=text` - FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` - FmtOpenMetrics Format = OpenMetricsType + `; version=` + OpenMetricsVersion + `; charset=utf-8` + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` + FmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` + FmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` ) const ( diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go index 84be0643ec..35db1cc9d7 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -24,8 +24,8 @@ import ( dto "github.com/prometheus/client_model/go" - "github.com/golang/protobuf/proto" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/prometheus/common/model" + "google.golang.org/protobuf/proto" ) // A stateFn is a function that represents a state in a state machine. By @@ -142,9 +142,13 @@ func (p *TextParser) reset(in io.Reader) { func (p *TextParser) startOfLine() stateFn { p.lineCount++ if p.skipBlankTab(); p.err != nil { - // End of input reached. This is the only case where - // that is not an error but a signal that we are done. - p.err = nil + // This is the only place that we expect to see io.EOF, + // which is not an error but the signal that we are done. + // Any other error that happens to align with the start of + // a line is still an error. + if p.err == io.EOF { + p.err = nil + } return nil } switch p.currentByte { diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go index c909b8aa8c..5727452c1e 100644 --- a/vendor/github.com/prometheus/common/model/time.go +++ b/vendor/github.com/prometheus/common/model/time.go @@ -18,7 +18,6 @@ import ( "errors" "fmt" "math" - "regexp" "strconv" "strings" "time" @@ -183,54 +182,78 @@ func (d *Duration) Type() string { return "duration" } -var durationRE = regexp.MustCompile("^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$") +func isdigit(c byte) bool { return c >= '0' && c <= '9' } + +// Units are required to go in order from biggest to smallest. +// This guards against confusion from "1m1d" being 1 minute + 1 day, not 1 month + 1 day. +var unitMap = map[string]struct { + pos int + mult uint64 +}{ + "ms": {7, uint64(time.Millisecond)}, + "s": {6, uint64(time.Second)}, + "m": {5, uint64(time.Minute)}, + "h": {4, uint64(time.Hour)}, + "d": {3, uint64(24 * time.Hour)}, + "w": {2, uint64(7 * 24 * time.Hour)}, + "y": {1, uint64(365 * 24 * time.Hour)}, +} // ParseDuration parses a string into a time.Duration, assuming that a year // always has 365d, a week always has 7d, and a day always has 24h. -func ParseDuration(durationStr string) (Duration, error) { - switch durationStr { +func ParseDuration(s string) (Duration, error) { + switch s { case "0": // Allow 0 without a unit. return 0, nil case "": return 0, errors.New("empty duration string") } - matches := durationRE.FindStringSubmatch(durationStr) - if matches == nil { - return 0, fmt.Errorf("not a valid duration string: %q", durationStr) - } - var dur time.Duration - // Parse the match at pos `pos` in the regex and use `mult` to turn that - // into ms, then add that value to the total parsed duration. - var overflowErr error - m := func(pos int, mult time.Duration) { - if matches[pos] == "" { - return + orig := s + var dur uint64 + lastUnitPos := 0 + + for s != "" { + if !isdigit(s[0]) { + return 0, fmt.Errorf("not a valid duration string: %q", orig) + } + // Consume [0-9]* + i := 0 + for ; i < len(s) && isdigit(s[i]); i++ { + } + v, err := strconv.ParseUint(s[:i], 10, 0) + if err != nil { + return 0, fmt.Errorf("not a valid duration string: %q", orig) } - n, _ := strconv.Atoi(matches[pos]) + s = s[i:] + // Consume unit. + for i = 0; i < len(s) && !isdigit(s[i]); i++ { + } + if i == 0 { + return 0, fmt.Errorf("not a valid duration string: %q", orig) + } + u := s[:i] + s = s[i:] + unit, ok := unitMap[u] + if !ok { + return 0, fmt.Errorf("unknown unit %q in duration %q", u, orig) + } + if unit.pos <= lastUnitPos { // Units must go in order from biggest to smallest. + return 0, fmt.Errorf("not a valid duration string: %q", orig) + } + lastUnitPos = unit.pos // Check if the provided duration overflows time.Duration (> ~ 290years). - if n > int((1<<63-1)/mult/time.Millisecond) { - overflowErr = errors.New("duration out of range") + if v > 1<<63/unit.mult { + return 0, errors.New("duration out of range") } - d := time.Duration(n) * time.Millisecond - dur += d * mult - - if dur < 0 { - overflowErr = errors.New("duration out of range") + dur += v * unit.mult + if dur > 1<<63-1 { + return 0, errors.New("duration out of range") } } - - m(2, 1000*60*60*24*365) // y - m(4, 1000*60*60*24*7) // w - m(6, 1000*60*60*24) // d - m(8, 1000*60*60) // h - m(10, 1000*60) // m - m(12, 1000) // s - m(14, 1) // ms - - return Duration(dur), overflowErr + return Duration(dur), nil } func (d Duration) String() string { diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/prometheus/common/model/value.go index c9d8fb1a28..9eb440413f 100644 --- a/vendor/github.com/prometheus/common/model/value.go +++ b/vendor/github.com/prometheus/common/model/value.go @@ -16,20 +16,12 @@ package model import ( "encoding/json" "fmt" - "math" "sort" "strconv" "strings" ) var ( - // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a - // non-existing sample pair. It is a SamplePair with timestamp Earliest and - // value 0.0. Note that the natural zero value of SamplePair has a timestamp - // of 0, which is possible to appear in a real SamplePair and thus not - // suitable to signal a non-existing SamplePair. - ZeroSamplePair = SamplePair{Timestamp: Earliest} - // ZeroSample is the pseudo zero-value of Sample used to signal a // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, // and metric nil. Note that the natural zero value of Sample has a timestamp @@ -38,82 +30,14 @@ var ( ZeroSample = Sample{Timestamp: Earliest} ) -// A SampleValue is a representation of a value for a given sample at a given -// time. -type SampleValue float64 - -// MarshalJSON implements json.Marshaler. -func (v SampleValue) MarshalJSON() ([]byte, error) { - return json.Marshal(v.String()) -} - -// UnmarshalJSON implements json.Unmarshaler. -func (v *SampleValue) UnmarshalJSON(b []byte) error { - if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { - return fmt.Errorf("sample value must be a quoted string") - } - f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) - if err != nil { - return err - } - *v = SampleValue(f) - return nil -} - -// Equal returns true if the value of v and o is equal or if both are NaN. Note -// that v==o is false if both are NaN. If you want the conventional float -// behavior, use == to compare two SampleValues. -func (v SampleValue) Equal(o SampleValue) bool { - if v == o { - return true - } - return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) -} - -func (v SampleValue) String() string { - return strconv.FormatFloat(float64(v), 'f', -1, 64) -} - -// SamplePair pairs a SampleValue with a Timestamp. -type SamplePair struct { - Timestamp Time - Value SampleValue -} - -// MarshalJSON implements json.Marshaler. -func (s SamplePair) MarshalJSON() ([]byte, error) { - t, err := json.Marshal(s.Timestamp) - if err != nil { - return nil, err - } - v, err := json.Marshal(s.Value) - if err != nil { - return nil, err - } - return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil -} - -// UnmarshalJSON implements json.Unmarshaler. -func (s *SamplePair) UnmarshalJSON(b []byte) error { - v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} - return json.Unmarshal(b, &v) -} - -// Equal returns true if this SamplePair and o have equal Values and equal -// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. -func (s *SamplePair) Equal(o *SamplePair) bool { - return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) -} - -func (s SamplePair) String() string { - return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) -} - -// Sample is a sample pair associated with a metric. +// Sample is a sample pair associated with a metric. A single sample must either +// define Value or Histogram but not both. Histogram == nil implies the Value +// field is used, otherwise it should be ignored. type Sample struct { - Metric Metric `json:"metric"` - Value SampleValue `json:"value"` - Timestamp Time `json:"timestamp"` + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` + Histogram *SampleHistogram `json:"histogram"` } // Equal compares first the metrics, then the timestamp, then the value. The @@ -129,11 +53,19 @@ func (s *Sample) Equal(o *Sample) bool { if !s.Timestamp.Equal(o.Timestamp) { return false } - + if s.Histogram != nil { + return s.Histogram.Equal(o.Histogram) + } return s.Value.Equal(o.Value) } func (s Sample) String() string { + if s.Histogram != nil { + return fmt.Sprintf("%s => %s", s.Metric, SampleHistogramPair{ + Timestamp: s.Timestamp, + Histogram: s.Histogram, + }) + } return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ Timestamp: s.Timestamp, Value: s.Value, @@ -142,6 +74,19 @@ func (s Sample) String() string { // MarshalJSON implements json.Marshaler. func (s Sample) MarshalJSON() ([]byte, error) { + if s.Histogram != nil { + v := struct { + Metric Metric `json:"metric"` + Histogram SampleHistogramPair `json:"histogram"` + }{ + Metric: s.Metric, + Histogram: SampleHistogramPair{ + Timestamp: s.Timestamp, + Histogram: s.Histogram, + }, + } + return json.Marshal(&v) + } v := struct { Metric Metric `json:"metric"` Value SamplePair `json:"value"` @@ -152,21 +97,25 @@ func (s Sample) MarshalJSON() ([]byte, error) { Value: s.Value, }, } - return json.Marshal(&v) } // UnmarshalJSON implements json.Unmarshaler. func (s *Sample) UnmarshalJSON(b []byte) error { v := struct { - Metric Metric `json:"metric"` - Value SamplePair `json:"value"` + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + Histogram SampleHistogramPair `json:"histogram"` }{ Metric: s.Metric, Value: SamplePair{ Timestamp: s.Timestamp, Value: s.Value, }, + Histogram: SampleHistogramPair{ + Timestamp: s.Timestamp, + Histogram: s.Histogram, + }, } if err := json.Unmarshal(b, &v); err != nil { @@ -174,8 +123,13 @@ func (s *Sample) UnmarshalJSON(b []byte) error { } s.Metric = v.Metric - s.Timestamp = v.Value.Timestamp - s.Value = v.Value.Value + if v.Histogram.Histogram != nil { + s.Timestamp = v.Histogram.Timestamp + s.Histogram = v.Histogram.Histogram + } else { + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + } return nil } @@ -221,80 +175,76 @@ func (s Samples) Equal(o Samples) bool { // SampleStream is a stream of Values belonging to an attached COWMetric. type SampleStream struct { - Metric Metric `json:"metric"` - Values []SamplePair `json:"values"` + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + Histograms []SampleHistogramPair `json:"histograms"` } func (ss SampleStream) String() string { - vals := make([]string, len(ss.Values)) + valuesLength := len(ss.Values) + vals := make([]string, valuesLength+len(ss.Histograms)) for i, v := range ss.Values { vals[i] = v.String() } + for i, v := range ss.Histograms { + vals[i+valuesLength] = v.String() + } return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) } -// Value is a generic interface for values resulting from a query evaluation. -type Value interface { - Type() ValueType - String() string +func (ss SampleStream) MarshalJSON() ([]byte, error) { + if len(ss.Histograms) > 0 && len(ss.Values) > 0 { + v := struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + Histograms []SampleHistogramPair `json:"histograms"` + }{ + Metric: ss.Metric, + Values: ss.Values, + Histograms: ss.Histograms, + } + return json.Marshal(&v) + } else if len(ss.Histograms) > 0 { + v := struct { + Metric Metric `json:"metric"` + Histograms []SampleHistogramPair `json:"histograms"` + }{ + Metric: ss.Metric, + Histograms: ss.Histograms, + } + return json.Marshal(&v) + } else { + v := struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + }{ + Metric: ss.Metric, + Values: ss.Values, + } + return json.Marshal(&v) + } } -func (Matrix) Type() ValueType { return ValMatrix } -func (Vector) Type() ValueType { return ValVector } -func (*Scalar) Type() ValueType { return ValScalar } -func (*String) Type() ValueType { return ValString } - -type ValueType int - -const ( - ValNone ValueType = iota - ValScalar - ValVector - ValMatrix - ValString -) - -// MarshalJSON implements json.Marshaler. -func (et ValueType) MarshalJSON() ([]byte, error) { - return json.Marshal(et.String()) -} +func (ss *SampleStream) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + Histograms []SampleHistogramPair `json:"histograms"` + }{ + Metric: ss.Metric, + Values: ss.Values, + Histograms: ss.Histograms, + } -func (et *ValueType) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { + if err := json.Unmarshal(b, &v); err != nil { return err } - switch s { - case "": - *et = ValNone - case "scalar": - *et = ValScalar - case "vector": - *et = ValVector - case "matrix": - *et = ValMatrix - case "string": - *et = ValString - default: - return fmt.Errorf("unknown value type %q", s) - } - return nil -} -func (e ValueType) String() string { - switch e { - case ValNone: - return "" - case ValScalar: - return "scalar" - case ValVector: - return "vector" - case ValMatrix: - return "matrix" - case ValString: - return "string" - } - panic("ValueType.String: unhandled value type") + ss.Metric = v.Metric + ss.Values = v.Values + ss.Histograms = v.Histograms + + return nil } // Scalar is a scalar value evaluated at the set timestamp. diff --git a/vendor/github.com/prometheus/common/model/value_float.go b/vendor/github.com/prometheus/common/model/value_float.go new file mode 100644 index 0000000000..0f615a7053 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value_float.go @@ -0,0 +1,100 @@ +// Copyright 2013 The Prometheus 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 model + +import ( + "encoding/json" + "fmt" + "math" + "strconv" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} diff --git a/vendor/github.com/prometheus/common/model/value_histogram.go b/vendor/github.com/prometheus/common/model/value_histogram.go new file mode 100644 index 0000000000..54bb038cff --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value_histogram.go @@ -0,0 +1,178 @@ +// Copyright 2013 The Prometheus 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 model + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" +) + +type FloatString float64 + +func (v FloatString) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +func (v FloatString) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +func (v *FloatString) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("float value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = FloatString(f) + return nil +} + +type HistogramBucket struct { + Boundaries int32 + Lower FloatString + Upper FloatString + Count FloatString +} + +func (s HistogramBucket) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(s.Boundaries) + if err != nil { + return nil, err + } + l, err := json.Marshal(s.Lower) + if err != nil { + return nil, err + } + u, err := json.Marshal(s.Upper) + if err != nil { + return nil, err + } + c, err := json.Marshal(s.Count) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s,%s,%s]", b, l, u, c)), nil +} + +func (s *HistogramBucket) UnmarshalJSON(buf []byte) error { + tmp := []interface{}{&s.Boundaries, &s.Lower, &s.Upper, &s.Count} + wantLen := len(tmp) + if err := json.Unmarshal(buf, &tmp); err != nil { + return err + } + if gotLen := len(tmp); gotLen != wantLen { + return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen) + } + return nil +} + +func (s *HistogramBucket) Equal(o *HistogramBucket) bool { + return s == o || (s.Boundaries == o.Boundaries && s.Lower == o.Lower && s.Upper == o.Upper && s.Count == o.Count) +} + +func (b HistogramBucket) String() string { + var sb strings.Builder + lowerInclusive := b.Boundaries == 1 || b.Boundaries == 3 + upperInclusive := b.Boundaries == 0 || b.Boundaries == 3 + if lowerInclusive { + sb.WriteRune('[') + } else { + sb.WriteRune('(') + } + fmt.Fprintf(&sb, "%g,%g", b.Lower, b.Upper) + if upperInclusive { + sb.WriteRune(']') + } else { + sb.WriteRune(')') + } + fmt.Fprintf(&sb, ":%v", b.Count) + return sb.String() +} + +type HistogramBuckets []*HistogramBucket + +func (s HistogramBuckets) Equal(o HistogramBuckets) bool { + if len(s) != len(o) { + return false + } + + for i, bucket := range s { + if !bucket.Equal(o[i]) { + return false + } + } + return true +} + +type SampleHistogram struct { + Count FloatString `json:"count"` + Sum FloatString `json:"sum"` + Buckets HistogramBuckets `json:"buckets"` +} + +func (s SampleHistogram) String() string { + return fmt.Sprintf("Count: %f, Sum: %f, Buckets: %v", s.Count, s.Sum, s.Buckets) +} + +func (s *SampleHistogram) Equal(o *SampleHistogram) bool { + return s == o || (s.Count == o.Count && s.Sum == o.Sum && s.Buckets.Equal(o.Buckets)) +} + +type SampleHistogramPair struct { + Timestamp Time + // Histogram should never be nil, it's only stored as pointer for efficiency. + Histogram *SampleHistogram +} + +func (s SampleHistogramPair) MarshalJSON() ([]byte, error) { + if s.Histogram == nil { + return nil, fmt.Errorf("histogram is nil") + } + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Histogram) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +func (s *SampleHistogramPair) UnmarshalJSON(buf []byte) error { + tmp := []interface{}{&s.Timestamp, &s.Histogram} + wantLen := len(tmp) + if err := json.Unmarshal(buf, &tmp); err != nil { + return err + } + if gotLen := len(tmp); gotLen != wantLen { + return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen) + } + if s.Histogram == nil { + return fmt.Errorf("histogram is null") + } + return nil +} + +func (s SampleHistogramPair) String() string { + return fmt.Sprintf("%s @[%s]", s.Histogram, s.Timestamp) +} + +func (s *SampleHistogramPair) Equal(o *SampleHistogramPair) bool { + return s == o || (s.Histogram.Equal(o.Histogram) && s.Timestamp.Equal(o.Timestamp)) +} diff --git a/vendor/github.com/prometheus/common/model/value_type.go b/vendor/github.com/prometheus/common/model/value_type.go new file mode 100644 index 0000000000..726c50ee63 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value_type.go @@ -0,0 +1,83 @@ +// Copyright 2013 The Prometheus 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 model + +import ( + "encoding/json" + "fmt" +) + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common index e358db69c5..b111d25620 100644 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -61,7 +61,7 @@ PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_ SKIP_GOLANGCI_LINT := GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.49.0 +GOLANGCI_LINT_VERSION ?= v1.51.2 # golangci-lint only supports linux, darwin and windows platforms on i386/amd64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) @@ -91,6 +91,8 @@ BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) +SANITIZED_DOCKER_IMAGE_TAG := $(subst +,-,$(DOCKER_IMAGE_TAG)) + ifeq ($(GOHOSTARCH),amd64) ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) # Only supported on amd64 @@ -205,7 +207,7 @@ common-tarball: promu .PHONY: common-docker $(BUILD_DOCKER_ARCHS) common-docker: $(BUILD_DOCKER_ARCHS) $(BUILD_DOCKER_ARCHS): common-docker-%: - docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \ + docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" \ -f $(DOCKERFILE_PATH) \ --build-arg ARCH="$*" \ --build-arg OS="linux" \ @@ -214,19 +216,19 @@ $(BUILD_DOCKER_ARCHS): common-docker-%: .PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) common-docker-publish: $(PUBLISH_DOCKER_ARCHS) $(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: - docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" + docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION))) .PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) common-docker-tag-latest: $(TAG_DOCKER_ARCHS) $(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: - docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" - docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)" + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)" .PHONY: common-docker-manifest common-docker-manifest: - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG)) - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG)) + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" .PHONY: promu promu: $(PROMU) diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go index 0102ab0fd8..60c551e026 100644 --- a/vendor/github.com/prometheus/procfs/fs.go +++ b/vendor/github.com/prometheus/procfs/fs.go @@ -21,6 +21,7 @@ import ( // kernel data structures. type FS struct { proc fs.FS + real bool } // DefaultMountPoint is the common mount point of the proc filesystem. @@ -39,5 +40,11 @@ func NewFS(mountPoint string) (FS, error) { if err != nil { return FS{}, err } - return FS{fs}, nil + + real, err := isRealProc(mountPoint) + if err != nil { + return FS{}, err + } + + return FS{fs, real}, nil } diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_notype.go b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go new file mode 100644 index 0000000000..8005769689 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go @@ -0,0 +1,23 @@ +// Copyright 2018 The Prometheus 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. + +//go:build netbsd || openbsd || solaris || windows +// +build netbsd openbsd solaris windows + +package procfs + +// isRealProc returns true on architectures that don't have a Type argument +// in their Statfs_t struct +func isRealProc(mountPoint string) (bool, error) { + return true, nil +} diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_type.go b/vendor/github.com/prometheus/procfs/fs_statfs_type.go new file mode 100644 index 0000000000..6233217ad2 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fs_statfs_type.go @@ -0,0 +1,33 @@ +// Copyright 2018 The Prometheus 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. + +//go:build !netbsd && !openbsd && !solaris && !windows +// +build !netbsd,!openbsd,!solaris,!windows + +package procfs + +import ( + "syscall" +) + +// isRealProc determines whether supplied mountpoint is really a proc filesystem. +func isRealProc(mountPoint string) (bool, error) { + stat := syscall.Statfs_t{} + err := syscall.Statfs(mountPoint, &stat) + if err != nil { + return false, err + } + + // 0x9fa0 is PROC_SUPER_MAGIC: https://elixir.bootlin.com/linux/v6.1/source/include/uapi/linux/magic.h#L87 + return stat.Type == 0x9fa0, nil +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/prometheus/procfs/internal/util/parse.go index b030951faf..14272dc788 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/parse.go +++ b/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -64,6 +64,21 @@ func ParsePInt64s(ss []string) ([]*int64, error) { return us, nil } +// Parses a uint64 from given hex in string. +func ParseHexUint64s(ss []string) ([]*uint64, error) { + us := make([]*uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return nil, err + } + + us = append(us, &u) + } + + return us, nil +} + // ReadUintFromFile reads a file and attempts to parse a uint64 from it. func ReadUintFromFile(path string) (uint64, error) { data, err := os.ReadFile(path) diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go index 0c482c18cc..7f68890cff 100644 --- a/vendor/github.com/prometheus/procfs/mountstats.go +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -186,6 +186,8 @@ type NFSOperationStats struct { CumulativeTotalResponseMilliseconds uint64 // Duration from when a request was enqueued to when it was completely handled. CumulativeTotalRequestMilliseconds uint64 + // The average time from the point the client sends RPC requests until it receives the response. + AverageRTTMilliseconds float64 // The count of operations that complete with tk_status < 0. These statuses usually indicate error conditions. Errors uint64 } @@ -534,7 +536,6 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { ns = append(ns, n) } - opStats := NFSOperationStats{ Operation: strings.TrimSuffix(ss[0], ":"), Requests: ns[0], @@ -546,6 +547,9 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { CumulativeTotalResponseMilliseconds: ns[6], CumulativeTotalRequestMilliseconds: ns[7], } + if ns[0] != 0 { + opStats.AverageRTTMilliseconds = float64(ns[6]) / float64(ns[0]) + } if len(ns) > 8 { opStats.Errors = ns[8] diff --git a/vendor/github.com/prometheus/procfs/net_conntrackstat.go b/vendor/github.com/prometheus/procfs/net_conntrackstat.go index 8300daca05..64a0e94606 100644 --- a/vendor/github.com/prometheus/procfs/net_conntrackstat.go +++ b/vendor/github.com/prometheus/procfs/net_conntrackstat.go @@ -18,7 +18,6 @@ import ( "bytes" "fmt" "io" - "strconv" "strings" "github.com/prometheus/procfs/internal/util" @@ -28,9 +27,13 @@ import ( // and contains netfilter conntrack statistics at one CPU core. type ConntrackStatEntry struct { Entries uint64 + Searched uint64 Found uint64 + New uint64 Invalid uint64 Ignore uint64 + Delete uint64 + DeleteList uint64 Insert uint64 InsertFailed uint64 Drop uint64 @@ -81,73 +84,34 @@ func parseConntrackStat(r io.Reader) ([]ConntrackStatEntry, error) { // Parses a ConntrackStatEntry from given array of fields. func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) { - if len(fields) != 17 { - return nil, fmt.Errorf("invalid conntrackstat entry, missing fields") - } - entry := &ConntrackStatEntry{} - - entries, err := parseConntrackStatField(fields[0]) - if err != nil { - return nil, err - } - entry.Entries = entries - - found, err := parseConntrackStatField(fields[2]) - if err != nil { - return nil, err - } - entry.Found = found - - invalid, err := parseConntrackStatField(fields[4]) - if err != nil { - return nil, err - } - entry.Invalid = invalid - - ignore, err := parseConntrackStatField(fields[5]) - if err != nil { - return nil, err - } - entry.Ignore = ignore - - insert, err := parseConntrackStatField(fields[8]) + entries, err := util.ParseHexUint64s(fields) if err != nil { - return nil, err + return nil, fmt.Errorf("invalid conntrackstat entry, couldn't parse fields: %s", err) } - entry.Insert = insert - - insertFailed, err := parseConntrackStatField(fields[9]) - if err != nil { - return nil, err + numEntries := len(entries) + if numEntries < 16 || numEntries > 17 { + return nil, fmt.Errorf("invalid conntrackstat entry, invalid number of fields: %d", numEntries) } - entry.InsertFailed = insertFailed - drop, err := parseConntrackStatField(fields[10]) - if err != nil { - return nil, err + stats := &ConntrackStatEntry{ + Entries: *entries[0], + Searched: *entries[1], + Found: *entries[2], + New: *entries[3], + Invalid: *entries[4], + Ignore: *entries[5], + Delete: *entries[6], + DeleteList: *entries[7], + Insert: *entries[8], + InsertFailed: *entries[9], + Drop: *entries[10], + EarlyDrop: *entries[11], } - entry.Drop = drop - earlyDrop, err := parseConntrackStatField(fields[11]) - if err != nil { - return nil, err + // Ignore missing search_restart on Linux < 2.6.35. + if numEntries == 17 { + stats.SearchRestart = *entries[16] } - entry.EarlyDrop = earlyDrop - searchRestart, err := parseConntrackStatField(fields[16]) - if err != nil { - return nil, err - } - entry.SearchRestart = searchRestart - - return entry, nil -} - -// Parses a uint64 from given hex in string. -func parseConntrackStatField(field string) (uint64, error) { - val, err := strconv.ParseUint(field, 16, 64) - if err != nil { - return 0, fmt.Errorf("couldn't parse %q field: %w", field, err) - } - return val, err + return stats, nil } diff --git a/vendor/github.com/prometheus/procfs/net_softnet.go b/vendor/github.com/prometheus/procfs/net_softnet.go index 06b7b8f216..540cea52c6 100644 --- a/vendor/github.com/prometheus/procfs/net_softnet.go +++ b/vendor/github.com/prometheus/procfs/net_softnet.go @@ -76,6 +76,7 @@ func parseSoftnet(r io.Reader) ([]SoftnetStat, error) { s := bufio.NewScanner(r) var stats []SoftnetStat + cpuIndex := 0 for s.Scan() { columns := strings.Fields(s.Text()) width := len(columns) @@ -127,9 +128,13 @@ func parseSoftnet(r io.Reader) ([]SoftnetStat, error) { softnetStat.SoftnetBacklogLen = us[0] softnetStat.Index = us[1] + } else { + // For older kernels, create the Index based on the scan line number. + softnetStat.Index = uint32(cpuIndex) } softnetStat.Width = width stats = append(stats, softnetStat) + cpuIndex++ } return stats, nil diff --git a/vendor/github.com/prometheus/procfs/net_wireless.go b/vendor/github.com/prometheus/procfs/net_wireless.go new file mode 100644 index 0000000000..c80fb15424 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_wireless.go @@ -0,0 +1,182 @@ +// Copyright 2023 The Prometheus 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 procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Wireless models the content of /proc/net/wireless. +type Wireless struct { + Name string + + // Status is the current 4-digit hex value status of the interface. + Status uint64 + + // QualityLink is the link quality. + QualityLink int + + // QualityLevel is the signal gain (dBm). + QualityLevel int + + // QualityNoise is the signal noise baseline (dBm). + QualityNoise int + + // DiscardedNwid is the number of discarded packets with wrong nwid/essid. + DiscardedNwid int + + // DiscardedCrypt is the number of discarded packets with wrong code/decode (WEP). + DiscardedCrypt int + + // DiscardedFrag is the number of discarded packets that can't perform MAC reassembly. + DiscardedFrag int + + // DiscardedRetry is the number of discarded packets that reached max MAC retries. + DiscardedRetry int + + // DiscardedMisc is the number of discarded packets for other reasons. + DiscardedMisc int + + // MissedBeacon is the number of missed beacons/superframe. + MissedBeacon int +} + +// Wireless returns kernel wireless statistics. +func (fs FS) Wireless() ([]*Wireless, error) { + b, err := util.ReadFileNoStat(fs.proc.Path("net/wireless")) + if err != nil { + return nil, err + } + + m, err := parseWireless(bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("failed to parse wireless: %w", err) + } + + return m, nil +} + +// parseWireless parses the contents of /proc/net/wireless. +/* +Inter-| sta-| Quality | Discarded packets | Missed | WE +face | tus | link level noise | nwid crypt frag retry misc | beacon | 22 + eth1: 0000 5. -256. -10. 0 1 0 3 0 0 + eth2: 0000 5. -256. -20. 0 2 0 4 0 0 +*/ +func parseWireless(r io.Reader) ([]*Wireless, error) { + var ( + interfaces []*Wireless + scanner = bufio.NewScanner(r) + ) + + for n := 0; scanner.Scan(); n++ { + // Skip the 2 header lines. + if n < 2 { + continue + } + + line := scanner.Text() + + parts := strings.Split(line, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("expected 2 parts after splitting line by ':', got %d for line %q", len(parts), line) + } + + name := strings.TrimSpace(parts[0]) + stats := strings.Fields(parts[1]) + + if len(stats) < 10 { + return nil, fmt.Errorf("invalid number of fields in line %d, expected at least 10, got %d: %q", n, len(stats), line) + } + + status, err := strconv.ParseUint(stats[0], 16, 16) + if err != nil { + return nil, fmt.Errorf("invalid status in line %d: %q", n, line) + } + + qlink, err := strconv.Atoi(strings.TrimSuffix(stats[1], ".")) + if err != nil { + return nil, fmt.Errorf("failed to parse Quality:link as integer %q: %w", qlink, err) + } + + qlevel, err := strconv.Atoi(strings.TrimSuffix(stats[2], ".")) + if err != nil { + return nil, fmt.Errorf("failed to parse Quality:level as integer %q: %w", qlevel, err) + } + + qnoise, err := strconv.Atoi(strings.TrimSuffix(stats[3], ".")) + if err != nil { + return nil, fmt.Errorf("failed to parse Quality:noise as integer %q: %w", qnoise, err) + } + + dnwid, err := strconv.Atoi(stats[4]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:nwid as integer %q: %w", dnwid, err) + } + + dcrypt, err := strconv.Atoi(stats[5]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:crypt as integer %q: %w", dcrypt, err) + } + + dfrag, err := strconv.Atoi(stats[6]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:frag as integer %q: %w", dfrag, err) + } + + dretry, err := strconv.Atoi(stats[7]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:retry as integer %q: %w", dretry, err) + } + + dmisc, err := strconv.Atoi(stats[8]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:misc as integer %q: %w", dmisc, err) + } + + mbeacon, err := strconv.Atoi(stats[9]) + if err != nil { + return nil, fmt.Errorf("failed to parse Missed:beacon as integer %q: %w", mbeacon, err) + } + + w := &Wireless{ + Name: name, + Status: status, + QualityLink: qlink, + QualityLevel: qlevel, + QualityNoise: qnoise, + DiscardedNwid: dnwid, + DiscardedCrypt: dcrypt, + DiscardedFrag: dfrag, + DiscardedRetry: dretry, + DiscardedMisc: dmisc, + MissedBeacon: mbeacon, + } + + interfaces = append(interfaces, w) + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("failed to scan /proc/net/wireless: %w", err) + } + + return interfaces, nil +} diff --git a/vendor/github.com/prometheus/procfs/netstat.go b/vendor/github.com/prometheus/procfs/netstat.go index 5cc40aef55..742dff453b 100644 --- a/vendor/github.com/prometheus/procfs/netstat.go +++ b/vendor/github.com/prometheus/procfs/netstat.go @@ -15,7 +15,6 @@ package procfs import ( "bufio" - "io" "os" "path/filepath" "strconv" @@ -38,12 +37,7 @@ func (fs FS) NetStat() ([]NetStat, error) { var netStatsTotal []NetStat for _, filePath := range statFiles { - file, err := os.Open(filePath) - if err != nil { - return nil, err - } - - procNetstat, err := parseNetstat(file) + procNetstat, err := parseNetstat(filePath) if err != nil { return nil, err } @@ -56,14 +50,17 @@ func (fs FS) NetStat() ([]NetStat, error) { // parseNetstat parses the metrics from `/proc/net/stat/` file // and returns a NetStat structure. -func parseNetstat(r io.Reader) (NetStat, error) { - var ( - scanner = bufio.NewScanner(r) - netStat = NetStat{ - Stats: make(map[string][]uint64), - } - ) +func parseNetstat(filePath string) (NetStat, error) { + netStat := NetStat{ + Stats: make(map[string][]uint64), + } + file, err := os.Open(filePath) + if err != nil { + return netStat, err + } + defer file.Close() + scanner := bufio.NewScanner(file) scanner.Scan() // First string is always a header for stats diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go index c30223af72..48f39dafd2 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -21,7 +21,6 @@ import ( "strconv" "strings" - "github.com/prometheus/procfs/internal/fs" "github.com/prometheus/procfs/internal/util" ) @@ -30,7 +29,7 @@ type Proc struct { // The process ID. PID int - fs fs.FS + fs FS } // Procs represents a list of Proc structs. @@ -92,7 +91,7 @@ func (fs FS) Proc(pid int) (Proc, error) { if _, err := os.Stat(fs.proc.Path(strconv.Itoa(pid))); err != nil { return Proc{}, err } - return Proc{PID: pid, fs: fs.proc}, nil + return Proc{PID: pid, fs: fs}, nil } // AllProcs returns a list of all currently available processes. @@ -114,7 +113,7 @@ func (fs FS) AllProcs() (Procs, error) { if err != nil { continue } - p = append(p, Proc{PID: int(pid), fs: fs.proc}) + p = append(p, Proc{PID: int(pid), fs: fs}) } return p, nil @@ -237,6 +236,19 @@ func (p Proc) FileDescriptorTargets() ([]string, error) { // FileDescriptorsLen returns the number of currently open file descriptors of // a process. func (p Proc) FileDescriptorsLen() (int, error) { + // Use fast path if available (Linux v6.2): https://github.com/torvalds/linux/commit/f1f1f2569901 + if p.fs.real { + stat, err := os.Stat(p.path("fd")) + if err != nil { + return 0, err + } + + size := stat.Size() + if size > 0 { + return int(size), nil + } + } + fds, err := p.fileDescriptors() if err != nil { return 0, err @@ -285,7 +297,7 @@ func (p Proc) fileDescriptors() ([]string, error) { } func (p Proc) path(pa ...string) string { - return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) + return p.fs.proc.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) } // FileDescriptorsInfo retrieves information about all file descriptors of diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go index b278eb2c2d..14b249f4fc 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -18,7 +18,6 @@ import ( "fmt" "os" - "github.com/prometheus/procfs/internal/fs" "github.com/prometheus/procfs/internal/util" ) @@ -112,7 +111,7 @@ type ProcStat struct { // Aggregated block I/O delays, measured in clock ticks (centiseconds). DelayAcctBlkIOTicks uint64 - proc fs.FS + proc FS } // NewStat returns the current status information of the process. @@ -210,8 +209,7 @@ func (s ProcStat) ResidentMemory() int { // StartTime returns the unix timestamp of the process in seconds. func (s ProcStat) StartTime() (float64, error) { - fs := FS{proc: s.proc} - stat, err := fs.Stat() + stat, err := s.proc.Stat() if err != nil { return 0, err } diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go index 3d8c06439a..c055d075db 100644 --- a/vendor/github.com/prometheus/procfs/proc_status.go +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -15,6 +15,7 @@ package procfs import ( "bytes" + "sort" "strconv" "strings" @@ -76,6 +77,9 @@ type ProcStatus struct { UIDs [4]string // GIDs of the process (Real, effective, saved set, and filesystem GIDs) GIDs [4]string + + // CpusAllowedList: List of cpu cores processes are allowed to run on. + CpusAllowedList []uint64 } // NewStatus returns the current status information of the process. @@ -161,10 +165,38 @@ func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintByt s.VoluntaryCtxtSwitches = vUint case "nonvoluntary_ctxt_switches": s.NonVoluntaryCtxtSwitches = vUint + case "Cpus_allowed_list": + s.CpusAllowedList = calcCpusAllowedList(vString) } + } // TotalCtxtSwitches returns the total context switch. func (s ProcStatus) TotalCtxtSwitches() uint64 { return s.VoluntaryCtxtSwitches + s.NonVoluntaryCtxtSwitches } + +func calcCpusAllowedList(cpuString string) []uint64 { + s := strings.Split(cpuString, ",") + + var g []uint64 + + for _, cpu := range s { + // parse cpu ranges, example: 1-3=[1,2,3] + if l := strings.Split(strings.TrimSpace(cpu), "-"); len(l) > 1 { + startCPU, _ := strconv.ParseUint(l[0], 10, 64) + endCPU, _ := strconv.ParseUint(l[1], 10, 64) + + for i := startCPU; i <= endCPU; i++ { + g = append(g, i) + } + } else if len(l) == 1 { + cpu, _ := strconv.ParseUint(l[0], 10, 64) + g = append(g, cpu) + } + + } + + sort.Slice(g, func(i, j int) bool { return g[i] < g[j] }) + return g +} diff --git a/vendor/github.com/prometheus/procfs/thread.go b/vendor/github.com/prometheus/procfs/thread.go index f08bfc769d..490c14708d 100644 --- a/vendor/github.com/prometheus/procfs/thread.go +++ b/vendor/github.com/prometheus/procfs/thread.go @@ -54,7 +54,8 @@ func (fs FS) AllThreads(pid int) (Procs, error) { if err != nil { continue } - t = append(t, Proc{PID: int(tid), fs: fsi.FS(taskPath)}) + + t = append(t, Proc{PID: int(tid), fs: FS{fsi.FS(taskPath), fs.real}}) } return t, nil @@ -66,13 +67,13 @@ func (fs FS) Thread(pid, tid int) (Proc, error) { if _, err := os.Stat(taskPath); err != nil { return Proc{}, err } - return Proc{PID: tid, fs: fsi.FS(taskPath)}, nil + return Proc{PID: tid, fs: FS{fsi.FS(taskPath), fs.real}}, nil } // Thread returns a process for a given TID of Proc. func (proc Proc) Thread(tid int) (Proc, error) { - tfs := fsi.FS(proc.path("task")) - if _, err := os.Stat(tfs.Path(strconv.Itoa(tid))); err != nil { + tfs := FS{fsi.FS(proc.path("task")), proc.fs.real} + if _, err := os.Stat(tfs.proc.Path(strconv.Itoa(tid))); err != nil { return Proc{}, err } return Proc{PID: tid, fs: tfs}, nil diff --git a/vendor/github.com/rivo/uniseg/grapheme.go b/vendor/github.com/rivo/uniseg/grapheme.go index d5d4c09e51..0086fc1b20 100644 --- a/vendor/github.com/rivo/uniseg/grapheme.go +++ b/vendor/github.com/rivo/uniseg/grapheme.go @@ -187,8 +187,8 @@ func ReverseString(s string) string { const shiftGraphemePropState = 4 // FirstGraphemeCluster returns the first grapheme cluster found in the given -// byte slice according to the rules of Unicode Standard Annex #29, Grapheme -// Cluster Boundaries. This function can be called continuously to extract all +// byte slice according to the rules of [Unicode Standard Annex #29, Grapheme +// Cluster Boundaries]. This function can be called continuously to extract all // grapheme clusters from a byte slice, as illustrated in the example below. // // If you don't know the current state, for example when calling the function @@ -209,6 +209,8 @@ const shiftGraphemePropState = 4 // While slightly less convenient than using the Graphemes class, this function // has much better performance and makes no allocations. It lends itself well to // large byte slices. +// +// [Unicode Standard Annex #29, Grapheme Cluster Boundaries]: http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries func FirstGraphemeCluster(b []byte, state int) (cluster, rest []byte, width, newState int) { // An empty byte slice returns nothing. if len(b) == 0 { diff --git a/vendor/github.com/rivo/uniseg/graphemerules.go b/vendor/github.com/rivo/uniseg/graphemerules.go index 907b30bd0a..9f46b575bb 100644 --- a/vendor/github.com/rivo/uniseg/graphemerules.go +++ b/vendor/github.com/rivo/uniseg/graphemerules.go @@ -48,7 +48,7 @@ var grTransitions = map[[2]int][3]int{ {grControlLF, prAny}: {grAny, grBoundary, 40}, // GB3. - {grCR, prLF}: {grAny, grNoBoundary, 30}, + {grCR, prLF}: {grControlLF, grNoBoundary, 30}, // GB6. {grAny, prL}: {grL, grBoundary, 9990}, diff --git a/vendor/github.com/rivo/uniseg/line.go b/vendor/github.com/rivo/uniseg/line.go index c0398cacf8..87f28503f4 100644 --- a/vendor/github.com/rivo/uniseg/line.go +++ b/vendor/github.com/rivo/uniseg/line.go @@ -4,7 +4,7 @@ import "unicode/utf8" // FirstLineSegment returns the prefix of the given byte slice after which a // decision to break the string over to the next line can or must be made, -// according to the rules of Unicode Standard Annex #14. This is used to +// according to the rules of [Unicode Standard Annex #14]. This is used to // implement line breaking. // // Line breaking, also known as word wrapping, is the process of breaking a @@ -35,7 +35,7 @@ import "unicode/utf8" // // Given an empty byte slice "b", the function returns nil values. // -// Note that in accordance with UAX #14 LB3, the final segment will end with +// Note that in accordance with [UAX #14 LB3], the final segment will end with // "mustBreak" set to true. You can choose to ignore this by checking if the // length of the "rest" slice is 0 and calling [HasTrailingLineBreak] or // [HasTrailingLineBreakInString] on the last rune. @@ -43,6 +43,9 @@ import "unicode/utf8" // Note also that this algorithm may break within grapheme clusters. This is // addressed in Section 8.2 Example 6 of UAX #14. To avoid this, you can use // the [Step] function instead. +// +// [Unicode Standard Annex #14]: https://www.unicode.org/reports/tr14/ +// [UAX #14 LB3]: https://www.unicode.org/reports/tr14/#Algorithm func FirstLineSegment(b []byte, state int) (segment, rest []byte, mustBreak bool, newState int) { // An empty byte slice returns nothing. if len(b) == 0 { diff --git a/vendor/github.com/rivo/uniseg/sentence.go b/vendor/github.com/rivo/uniseg/sentence.go index b7fc70996e..adc2a35773 100644 --- a/vendor/github.com/rivo/uniseg/sentence.go +++ b/vendor/github.com/rivo/uniseg/sentence.go @@ -3,7 +3,7 @@ package uniseg import "unicode/utf8" // FirstSentence returns the first sentence found in the given byte slice -// according to the rules of Unicode Standard Annex #29, Sentence Boundaries. +// according to the rules of [Unicode Standard Annex #29, Sentence Boundaries]. // This function can be called continuously to extract all sentences from a byte // slice, as illustrated in the example below. // @@ -17,6 +17,8 @@ import "unicode/utf8" // slice is the sub-slice of the input slice containing the identified sentence. // // Given an empty byte slice "b", the function returns nil values. +// +// [Unicode Standard Annex #29, Sentence Boundaries]: http://unicode.org/reports/tr29/#Sentence_Boundaries func FirstSentence(b []byte, state int) (sentence, rest []byte, newState int) { // An empty byte slice returns nothing. if len(b) == 0 { diff --git a/vendor/github.com/rivo/uniseg/step.go b/vendor/github.com/rivo/uniseg/step.go index 55e7f1219e..6eca4b5dc7 100644 --- a/vendor/github.com/rivo/uniseg/step.go +++ b/vendor/github.com/rivo/uniseg/step.go @@ -83,10 +83,12 @@ const ( // has much better performance and makes no allocations. It lends itself well to // large byte slices. // -// Note that in accordance with UAX #14 LB3, the final segment will end with +// Note that in accordance with [UAX #14 LB3], the final segment will end with // a mandatory line break (boundaries&MaskLine == LineMustBreak). You can choose // to ignore this by checking if the length of the "rest" slice is 0 and calling // [HasTrailingLineBreak] or [HasTrailingLineBreakInString] on the last rune. +// +// [UAX #14 LB3]: https://www.unicode.org/reports/tr14/#Algorithm func Step(b []byte, state int) (cluster, rest []byte, boundaries int, newState int) { // An empty byte slice returns nothing. if len(b) == 0 { diff --git a/vendor/github.com/rivo/uniseg/word.go b/vendor/github.com/rivo/uniseg/word.go index 785af1e87b..34fba7f291 100644 --- a/vendor/github.com/rivo/uniseg/word.go +++ b/vendor/github.com/rivo/uniseg/word.go @@ -3,7 +3,7 @@ package uniseg import "unicode/utf8" // FirstWord returns the first word found in the given byte slice according to -// the rules of Unicode Standard Annex #29, Word Boundaries. This function can +// the rules of [Unicode Standard Annex #29, Word Boundaries]. This function can // be called continuously to extract all words from a byte slice, as illustrated // in the example below. // @@ -17,6 +17,8 @@ import "unicode/utf8" // the sub-slice of the input slice containing the identified word. // // Given an empty byte slice "b", the function returns nil values. +// +// [Unicode Standard Annex #29, Word Boundaries]: http://unicode.org/reports/tr29/#Word_Boundaries func FirstWord(b []byte, state int) (word, rest []byte, newState int) { // An empty byte slice returns nothing. if len(b) == 0 { diff --git a/vendor/github.com/sirupsen/logrus/README.md b/vendor/github.com/sirupsen/logrus/README.md index b042c896f2..d1d4a85fd7 100644 --- a/vendor/github.com/sirupsen/logrus/README.md +++ b/vendor/github.com/sirupsen/logrus/README.md @@ -9,7 +9,7 @@ the last thing you want from your Logging library (again...). This does not mean Logrus is dead. Logrus will continue to be maintained for security, (backwards compatible) bug fixes, and performance (where we are -limited by the interface). +limited by the interface). I believe Logrus' biggest contribution is to have played a part in today's widespread use of structured logging in Golang. There doesn't seem to be a @@ -43,7 +43,7 @@ plain text): With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash or Splunk: -```json +```text {"animal":"walrus","level":"info","msg":"A group of walrus emerges from the ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} @@ -99,7 +99,7 @@ time="2015-03-26T01:27:38-04:00" level=fatal method=github.com/sirupsen/arcticcr ``` Note that this does add measurable overhead - the cost will depend on the version of Go, but is between 20 and 40% in recent tests with 1.6 and 1.7. You can validate this in your -environment via benchmarks: +environment via benchmarks: ``` go test -bench=.*CallerTracing ``` @@ -317,6 +317,8 @@ log.SetLevel(log.InfoLevel) It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose environment if your application has that. +Note: If you want different log levels for global (`log.SetLevel(...)`) and syslog logging, please check the [syslog hook README](hooks/syslog/README.md#different-log-levels-for-local-and-remote-logging). + #### Entries Besides the fields added with `WithField` or `WithFields` some fields are diff --git a/vendor/github.com/sirupsen/logrus/writer.go b/vendor/github.com/sirupsen/logrus/writer.go index 72e8e3a1b6..074fd4b8bd 100644 --- a/vendor/github.com/sirupsen/logrus/writer.go +++ b/vendor/github.com/sirupsen/logrus/writer.go @@ -4,6 +4,7 @@ import ( "bufio" "io" "runtime" + "strings" ) // Writer at INFO level. See WriterLevel for details. @@ -20,15 +21,18 @@ func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { return NewEntry(logger).WriterLevel(level) } +// Writer returns an io.Writer that writes to the logger at the info log level func (entry *Entry) Writer() *io.PipeWriter { return entry.WriterLevel(InfoLevel) } +// WriterLevel returns an io.Writer that writes to the logger at the given log level func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { reader, writer := io.Pipe() var printFunc func(args ...interface{}) + // Determine which log function to use based on the specified log level switch level { case TraceLevel: printFunc = entry.Trace @@ -48,23 +52,51 @@ func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { printFunc = entry.Print } + // Start a new goroutine to scan the input and write it to the logger using the specified print function. + // It splits the input into chunks of up to 64KB to avoid buffer overflows. go entry.writerScanner(reader, printFunc) + + // Set a finalizer function to close the writer when it is garbage collected runtime.SetFinalizer(writer, writerFinalizer) return writer } +// writerScanner scans the input from the reader and writes it to the logger func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { scanner := bufio.NewScanner(reader) + + // Set the buffer size to the maximum token size to avoid buffer overflows + scanner.Buffer(make([]byte, bufio.MaxScanTokenSize), bufio.MaxScanTokenSize) + + // Define a split function to split the input into chunks of up to 64KB + chunkSize := bufio.MaxScanTokenSize // 64KB + splitFunc := func(data []byte, atEOF bool) (int, []byte, error) { + if len(data) >= chunkSize { + return chunkSize, data[:chunkSize], nil + } + + return bufio.ScanLines(data, atEOF) + } + + // Use the custom split function to split the input + scanner.Split(splitFunc) + + // Scan the input and write it to the logger using the specified print function for scanner.Scan() { - printFunc(scanner.Text()) + printFunc(strings.TrimRight(scanner.Text(), "\r\n")) } + + // If there was an error while scanning the input, log an error if err := scanner.Err(); err != nil { entry.Errorf("Error while reading from Writer: %s", err) } + + // Close the reader when we are done reader.Close() } +// WriterFinalizer is a finalizer function that closes then given writer when it is garbage collected func writerFinalizer(writer *io.PipeWriter) { writer.Close() } diff --git a/vendor/github.com/skeema/knownhosts/NOTICE b/vendor/github.com/skeema/knownhosts/NOTICE index 12db8fc650..794c676a26 100644 --- a/vendor/github.com/skeema/knownhosts/NOTICE +++ b/vendor/github.com/skeema/knownhosts/NOTICE @@ -1,4 +1,4 @@ -Copyright 2022 Skeema LLC +Copyright 2023 Skeema LLC and the Skeema authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/skeema/knownhosts/README.md b/vendor/github.com/skeema/knownhosts/README.md index 23ac9e337b..3740039f4b 100644 --- a/vendor/github.com/skeema/knownhosts/README.md +++ b/vendor/github.com/skeema/knownhosts/README.md @@ -1,6 +1,6 @@ # knownhosts: enhanced Golang SSH known_hosts management -[![build status](https://img.shields.io/github/workflow/status/skeema/knownhosts/Tests/main)](https://github.com/skeema/knownhosts/actions) +[![build status](https://img.shields.io/github/actions/workflow/status/skeema/knownhosts/tests.yml?branch=main)](https://github.com/skeema/knownhosts/actions) [![godoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/skeema/knownhosts) @@ -97,3 +97,20 @@ config := &ssh.ClientConfig{ } ``` +## License + +**Source code copyright 2023 Skeema LLC and the Skeema authors** + +```text +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` diff --git a/vendor/github.com/spf13/afero/afero.go b/vendor/github.com/spf13/afero/afero.go index 199480cd05..39f6585209 100644 --- a/vendor/github.com/spf13/afero/afero.go +++ b/vendor/github.com/spf13/afero/afero.go @@ -97,7 +97,7 @@ type Fs interface { // Chown changes the uid and gid of the named file. Chown(name string, uid, gid int) error - //Chtimes changes the access and modification times of the named file + // Chtimes changes the access and modification times of the named file Chtimes(name string, atime time.Time, mtime time.Time) error } diff --git a/vendor/github.com/spf13/afero/basepath.go b/vendor/github.com/spf13/afero/basepath.go index 70a1d91680..2e72793a3e 100644 --- a/vendor/github.com/spf13/afero/basepath.go +++ b/vendor/github.com/spf13/afero/basepath.go @@ -40,7 +40,6 @@ func (f *BasePathFile) Name() string { func (f *BasePathFile) ReadDir(n int) ([]fs.DirEntry, error) { if rdf, ok := f.File.(fs.ReadDirFile); ok { return rdf.ReadDir(n) - } return readDirFile{f.File}.ReadDir(n) } diff --git a/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/spf13/afero/copyOnWriteFs.go index 6ff8f3099a..184d6dd702 100644 --- a/vendor/github.com/spf13/afero/copyOnWriteFs.go +++ b/vendor/github.com/spf13/afero/copyOnWriteFs.go @@ -223,7 +223,7 @@ func (u *CopyOnWriteFs) OpenFile(name string, flag int, perm os.FileMode) (File, return nil, err } if isaDir { - if err = u.layer.MkdirAll(dir, 0777); err != nil { + if err = u.layer.MkdirAll(dir, 0o777); err != nil { return nil, err } return u.layer.OpenFile(name, flag, perm) @@ -247,8 +247,9 @@ func (u *CopyOnWriteFs) OpenFile(name string, flag int, perm os.FileMode) (File, // This function handles the 9 different possibilities caused // by the union which are the intersection of the following... -// layer: doesn't exist, exists as a file, and exists as a directory -// base: doesn't exist, exists as a file, and exists as a directory +// +// layer: doesn't exist, exists as a file, and exists as a directory +// base: doesn't exist, exists as a file, and exists as a directory func (u *CopyOnWriteFs) Open(name string) (File, error) { // Since the overlay overrides the base we check that first b, err := u.isBaseFile(name) @@ -322,5 +323,5 @@ func (u *CopyOnWriteFs) MkdirAll(name string, perm os.FileMode) error { } func (u *CopyOnWriteFs) Create(name string) (File, error) { - return u.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0666) + return u.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0o666) } diff --git a/vendor/github.com/spf13/afero/ioutil.go b/vendor/github.com/spf13/afero/ioutil.go index 386c9cdc22..fa6abe1eee 100644 --- a/vendor/github.com/spf13/afero/ioutil.go +++ b/vendor/github.com/spf13/afero/ioutil.go @@ -141,8 +141,10 @@ func WriteFile(fs Fs, filename string, data []byte, perm os.FileMode) error { // We generate random temporary file names so that there's a good // chance the file doesn't exist yet - keeps the number of tries in // TempFile to a minimum. -var randNum uint32 -var randmu sync.Mutex +var ( + randNum uint32 + randmu sync.Mutex +) func reseed() uint32 { return uint32(time.Now().UnixNano() + int64(os.Getpid())) @@ -190,7 +192,7 @@ func TempFile(fs Fs, dir, pattern string) (f File, err error) { nconflict := 0 for i := 0; i < 10000; i++ { name := filepath.Join(dir, prefix+nextRandom()+suffix) - f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) + f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o600) if os.IsExist(err) { if nconflict++; nconflict > 10 { randmu.Lock() @@ -214,6 +216,7 @@ func TempFile(fs Fs, dir, pattern string) (f File, err error) { func (a Afero) TempDir(dir, prefix string) (name string, err error) { return TempDir(a.Fs, dir, prefix) } + func TempDir(fs Fs, dir, prefix string) (name string, err error) { if dir == "" { dir = os.TempDir() @@ -222,7 +225,7 @@ func TempDir(fs Fs, dir, prefix string) (name string, err error) { nconflict := 0 for i := 0; i < 10000; i++ { try := filepath.Join(dir, prefix+nextRandom()) - err = fs.Mkdir(try, 0700) + err = fs.Mkdir(try, 0o700) if os.IsExist(err) { if nconflict++; nconflict > 10 { randmu.Lock() diff --git a/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/spf13/afero/mem/file.go index 3cf4693b5a..62fe4498e1 100644 --- a/vendor/github.com/spf13/afero/mem/file.go +++ b/vendor/github.com/spf13/afero/mem/file.go @@ -245,7 +245,7 @@ func (f *File) Truncate(size int64) error { defer f.fileData.Unlock() if size > int64(len(f.fileData.data)) { diff := size - int64(len(f.fileData.data)) - f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{00}, int(diff))...) + f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{0o0}, int(diff))...) } else { f.fileData.data = f.fileData.data[0:size] } @@ -285,7 +285,7 @@ func (f *File) Write(b []byte) (n int, err error) { tail = f.fileData.data[n+int(cur):] } if diff > 0 { - f.fileData.data = append(f.fileData.data, append(bytes.Repeat([]byte{00}, int(diff)), b...)...) + f.fileData.data = append(f.fileData.data, append(bytes.Repeat([]byte{0o0}, int(diff)), b...)...) f.fileData.data = append(f.fileData.data, tail...) } else { f.fileData.data = append(f.fileData.data[:cur], b...) @@ -321,16 +321,19 @@ func (s *FileInfo) Name() string { s.Unlock() return name } + func (s *FileInfo) Mode() os.FileMode { s.Lock() defer s.Unlock() return s.mode } + func (s *FileInfo) ModTime() time.Time { s.Lock() defer s.Unlock() return s.modtime } + func (s *FileInfo) IsDir() bool { s.Lock() defer s.Unlock() diff --git a/vendor/github.com/spf13/afero/memmap.go b/vendor/github.com/spf13/afero/memmap.go index d06975e712..e6b7d70b94 100644 --- a/vendor/github.com/spf13/afero/memmap.go +++ b/vendor/github.com/spf13/afero/memmap.go @@ -15,6 +15,7 @@ package afero import ( "fmt" + "io" "log" "os" "path/filepath" @@ -43,7 +44,7 @@ func (m *MemMapFs) getData() map[string]*mem.FileData { // Root should always exist, right? // TODO: what about windows? root := mem.CreateDir(FilePathSeparator) - mem.SetMode(root, os.ModeDir|0755) + mem.SetMode(root, os.ModeDir|0o755) m.data[FilePathSeparator] = root }) return m.data @@ -96,12 +97,12 @@ func (m *MemMapFs) registerWithParent(f *mem.FileData, perm os.FileMode) { pdir := filepath.Dir(filepath.Clean(f.Name())) err := m.lockfreeMkdir(pdir, perm) if err != nil { - //log.Println("Mkdir error:", err) + // log.Println("Mkdir error:", err) return } parent, err = m.lockfreeOpen(pdir) if err != nil { - //log.Println("Open after Mkdir error:", err) + // log.Println("Open after Mkdir error:", err) return } } @@ -237,7 +238,7 @@ func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, erro file = mem.NewReadOnlyFileHandle(file.(*mem.File).Data()) } if flag&os.O_APPEND > 0 { - _, err = file.Seek(0, os.SEEK_END) + _, err = file.Seek(0, io.SeekEnd) if err != nil { file.Close() return nil, err @@ -319,6 +320,18 @@ func (m *MemMapFs) Rename(oldname, newname string) error { } else { return &os.PathError{Op: "rename", Path: oldname, Err: ErrFileNotFound} } + + for p, fileData := range m.getData() { + if strings.HasPrefix(p, oldname+FilePathSeparator) { + m.mu.RUnlock() + m.mu.Lock() + delete(m.getData(), p) + p := strings.Replace(p, oldname, newname, 1) + m.getData()[p] = fileData + m.mu.Unlock() + m.mu.RLock() + } + } return nil } diff --git a/vendor/github.com/spf13/afero/regexpfs.go b/vendor/github.com/spf13/afero/regexpfs.go index ac359c62a0..218f3b235b 100644 --- a/vendor/github.com/spf13/afero/regexpfs.go +++ b/vendor/github.com/spf13/afero/regexpfs.go @@ -10,7 +10,6 @@ import ( // The RegexpFs filters files (not directories) by regular expression. Only // files matching the given regexp will be allowed, all others get a ENOENT error ( // "No such file or directory"). -// type RegexpFs struct { re *regexp.Regexp source Fs diff --git a/vendor/github.com/spf13/afero/symlink.go b/vendor/github.com/spf13/afero/symlink.go index d1c6ea53d9..aa6ae125b6 100644 --- a/vendor/github.com/spf13/afero/symlink.go +++ b/vendor/github.com/spf13/afero/symlink.go @@ -21,9 +21,9 @@ import ( // filesystems saying so. // It indicates support for 3 symlink related interfaces that implement the // behaviors of the os methods: -// - Lstat -// - Symlink, and -// - Readlink +// - Lstat +// - Symlink, and +// - Readlink type Symlinker interface { Lstater Linker diff --git a/vendor/github.com/spf13/afero/unionFile.go b/vendor/github.com/spf13/afero/unionFile.go index 333d367f48..62dd6c93c8 100644 --- a/vendor/github.com/spf13/afero/unionFile.go +++ b/vendor/github.com/spf13/afero/unionFile.go @@ -47,7 +47,7 @@ func (f *UnionFile) Read(s []byte) (int, error) { if (err == nil || err == io.EOF) && f.Base != nil { // advance the file position also in the base file, the next // call may be a write at this position (or a seek with SEEK_CUR) - if _, seekErr := f.Base.Seek(int64(n), os.SEEK_CUR); seekErr != nil { + if _, seekErr := f.Base.Seek(int64(n), io.SeekCurrent); seekErr != nil { // only overwrite err in case the seek fails: we need to // report an eventual io.EOF to the caller err = seekErr @@ -130,7 +130,7 @@ func (f *UnionFile) Name() string { type DirsMerger func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) { - var files = make(map[string]os.FileInfo) + files := make(map[string]os.FileInfo) for _, fi := range lofi { files[fi.Name()] = fi @@ -151,7 +151,6 @@ var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, err } return rfi, nil - } // Readdir will weave the two directories together and @@ -275,7 +274,7 @@ func copyFile(base Fs, layer Fs, name string, bfh File) error { return err } if !exists { - err = layer.MkdirAll(filepath.Dir(name), 0777) // FIXME? + err = layer.MkdirAll(filepath.Dir(name), 0o777) // FIXME? if err != nil { return err } diff --git a/vendor/github.com/spf13/afero/util.go b/vendor/github.com/spf13/afero/util.go index cb7de23f26..9e4cba2746 100644 --- a/vendor/github.com/spf13/afero/util.go +++ b/vendor/github.com/spf13/afero/util.go @@ -43,7 +43,7 @@ func WriteReader(fs Fs, path string, r io.Reader) (err error) { ospath := filepath.FromSlash(dir) if ospath != "" { - err = fs.MkdirAll(ospath, 0777) // rwx, rw, r + err = fs.MkdirAll(ospath, 0o777) // rwx, rw, r if err != nil { if err != os.ErrExist { return err @@ -71,7 +71,7 @@ func SafeWriteReader(fs Fs, path string, r io.Reader) (err error) { ospath := filepath.FromSlash(dir) if ospath != "" { - err = fs.MkdirAll(ospath, 0777) // rwx, rw, r + err = fs.MkdirAll(ospath, 0o777) // rwx, rw, r if err != nil { return } @@ -124,7 +124,7 @@ func GetTempDir(fs Fs, subPath string) string { return addSlash(dir) } - err := fs.MkdirAll(dir, 0777) + err := fs.MkdirAll(dir, 0o777) if err != nil { panic(err) } @@ -197,7 +197,6 @@ func FileContainsAnyBytes(fs Fs, filename string, subslices [][]byte) (bool, err // readerContains reports whether any of the subslices is within r. func readerContainsAny(r io.Reader, subslices ...[]byte) bool { - if r == nil || len(subslices) == 0 { return false } diff --git a/vendor/github.com/spf13/cobra/.golangci.yml b/vendor/github.com/spf13/cobra/.golangci.yml index 439d3e1de4..2578d94b5e 100644 --- a/vendor/github.com/spf13/cobra/.golangci.yml +++ b/vendor/github.com/spf13/cobra/.golangci.yml @@ -1,4 +1,4 @@ -# Copyright 2013-2022 The Cobra Authors +# Copyright 2013-2023 The Cobra Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/Makefile b/vendor/github.com/spf13/cobra/Makefile index c433a01bce..0da8d7aa08 100644 --- a/vendor/github.com/spf13/cobra/Makefile +++ b/vendor/github.com/spf13/cobra/Makefile @@ -5,10 +5,6 @@ ifeq (, $(shell which golangci-lint)) $(warning "could not find golangci-lint in $(PATH), run: curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh") endif -ifeq (, $(shell which richgo)) -$(warning "could not find richgo in $(PATH), run: go install github.com/kyoh86/richgo@latest") -endif - .PHONY: fmt lint test install_deps clean default: all @@ -25,6 +21,10 @@ lint: test: install_deps $(info ******************** running tests ********************) + go test -v ./... + +richtest: install_deps + $(info ******************** running tests with kyoh86/richgo ********************) richgo test -v ./... install_deps: diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md index 7cc726beb4..592c0b8ab0 100644 --- a/vendor/github.com/spf13/cobra/README.md +++ b/vendor/github.com/spf13/cobra/README.md @@ -1,4 +1,4 @@ -![cobra logo](https://cloud.githubusercontent.com/assets/173412/10886352/ad566232-814f-11e5-9cd0-aa101788c117.png) +![cobra logo](assets/CobraMain.png) Cobra is a library for creating powerful modern CLI applications. @@ -6,7 +6,7 @@ Cobra is used in many Go projects such as [Kubernetes](https://kubernetes.io/), [Hugo](https://gohugo.io), and [GitHub CLI](https://github.com/cli/cli) to name a few. [This list](./projects_using_cobra.md) contains a more extensive list of projects using Cobra. -[![](https://img.shields.io/github/workflow/status/spf13/cobra/Test?longCache=tru&label=Test&logo=github%20actions&logoColor=fff)](https://github.com/spf13/cobra/actions?query=workflow%3ATest) +[![](https://img.shields.io/github/actions/workflow/status/spf13/cobra/test.yml?branch=main&longCache=true&label=Test&logo=github%20actions&logoColor=fff)](https://github.com/spf13/cobra/actions?query=workflow%3ATest) [![Go Reference](https://pkg.go.dev/badge/github.com/spf13/cobra.svg)](https://pkg.go.dev/github.com/spf13/cobra) [![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cobra)](https://goreportcard.com/report/github.com/spf13/cobra) [![Slack](https://img.shields.io/badge/Slack-cobra-brightgreen)](https://gophers.slack.com/archives/CD3LP1199) diff --git a/vendor/github.com/spf13/cobra/active_help.go b/vendor/github.com/spf13/cobra/active_help.go index 95e03aecb6..2d0239437a 100644 --- a/vendor/github.com/spf13/cobra/active_help.go +++ b/vendor/github.com/spf13/cobra/active_help.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/args.go b/vendor/github.com/spf13/cobra/args.go index 2c1f99e787..e79ec33a81 100644 --- a/vendor/github.com/spf13/cobra/args.go +++ b/vendor/github.com/spf13/cobra/args.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import ( type PositionalArgs func(cmd *Command, args []string) error -// Legacy arg validation has the following behaviour: +// legacyArgs validation has the following behaviour: // - root commands with no subcommands can take arbitrary arguments // - root commands with subcommands will do subcommand validity checking // - subcommands will always accept arbitrary arguments diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go index 3acdb27974..10c78847de 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.go +++ b/vendor/github.com/spf13/cobra/bash_completions.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -532,7 +532,7 @@ func writeLocalNonPersistentFlag(buf io.StringWriter, flag *pflag.Flag) { } } -// Setup annotations for go completions for registered flags +// prepareCustomAnnotationsForFlags setup annotations for go completions for registered flags func prepareCustomAnnotationsForFlags(cmd *Command) { flagCompletionMutex.RLock() defer flagCompletionMutex.RUnlock() diff --git a/vendor/github.com/spf13/cobra/bash_completionsV2.go b/vendor/github.com/spf13/cobra/bash_completionsV2.go index bb4b71892c..19b09560c1 100644 --- a/vendor/github.com/spf13/cobra/bash_completionsV2.go +++ b/vendor/github.com/spf13/cobra/bash_completionsV2.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ func genBashComp(buf io.StringWriter, name string, includeDesc bool) { __%[1]s_debug() { - if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then + if [[ -n ${BASH_COMP_DEBUG_FILE-} ]]; then echo "$*" >> "${BASH_COMP_DEBUG_FILE}" fi } @@ -65,7 +65,7 @@ __%[1]s_get_completion_results() { lastChar=${lastParam:$((${#lastParam}-1)):1} __%[1]s_debug "lastParam ${lastParam}, lastChar ${lastChar}" - if [ -z "${cur}" ] && [ "${lastChar}" != "=" ]; then + if [[ -z ${cur} && ${lastChar} != = ]]; then # If the last parameter is complete (there is a space following it) # We add an extra empty parameter so we can indicate this to the go method. __%[1]s_debug "Adding extra empty parameter" @@ -75,7 +75,7 @@ __%[1]s_get_completion_results() { # When completing a flag with an = (e.g., %[1]s -n=) # bash focuses on the part after the =, so we need to remove # the flag part from $cur - if [[ "${cur}" == -*=* ]]; then + if [[ ${cur} == -*=* ]]; then cur="${cur#*=}" fi @@ -87,7 +87,7 @@ __%[1]s_get_completion_results() { directive=${out##*:} # Remove the directive out=${out%%:*} - if [ "${directive}" = "${out}" ]; then + if [[ ${directive} == "${out}" ]]; then # There is not directive specified directive=0 fi @@ -101,22 +101,36 @@ __%[1]s_process_completion_results() { local shellCompDirectiveNoFileComp=%[5]d local shellCompDirectiveFilterFileExt=%[6]d local shellCompDirectiveFilterDirs=%[7]d + local shellCompDirectiveKeepOrder=%[8]d - if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then + if (((directive & shellCompDirectiveError) != 0)); then # Error code. No completion. __%[1]s_debug "Received error from custom completion go code" return else - if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then - if [[ $(type -t compopt) = "builtin" ]]; then + if (((directive & shellCompDirectiveNoSpace) != 0)); then + if [[ $(type -t compopt) == builtin ]]; then __%[1]s_debug "Activating no space" compopt -o nospace else __%[1]s_debug "No space directive not supported in this version of bash" fi fi - if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then - if [[ $(type -t compopt) = "builtin" ]]; then + if (((directive & shellCompDirectiveKeepOrder) != 0)); then + if [[ $(type -t compopt) == builtin ]]; then + # no sort isn't supported for bash less than < 4.4 + if [[ ${BASH_VERSINFO[0]} -lt 4 || ( ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 4 ) ]]; then + __%[1]s_debug "No sort directive not supported in this version of bash" + else + __%[1]s_debug "Activating keep order" + compopt -o nosort + fi + else + __%[1]s_debug "No sort directive not supported in this version of bash" + fi + fi + if (((directive & shellCompDirectiveNoFileComp) != 0)); then + if [[ $(type -t compopt) == builtin ]]; then __%[1]s_debug "Activating no file completion" compopt +o default else @@ -130,7 +144,7 @@ __%[1]s_process_completion_results() { local activeHelp=() __%[1]s_extract_activeHelp - if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then + if (((directive & shellCompDirectiveFilterFileExt) != 0)); then # File extension filtering local fullFilter filter filteringCmd @@ -143,13 +157,12 @@ __%[1]s_process_completion_results() { filteringCmd="_filedir $fullFilter" __%[1]s_debug "File filtering command: $filteringCmd" $filteringCmd - elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then + elif (((directive & shellCompDirectiveFilterDirs) != 0)); then # File completion for directories only - # Use printf to strip any trailing newline local subdir - subdir=$(printf "%%s" "${completions[0]}") - if [ -n "$subdir" ]; then + subdir=${completions[0]} + if [[ -n $subdir ]]; then __%[1]s_debug "Listing directories in $subdir" pushd "$subdir" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return else @@ -164,7 +177,7 @@ __%[1]s_process_completion_results() { __%[1]s_handle_special_char "$cur" = # Print the activeHelp statements before we finish - if [ ${#activeHelp[*]} -ne 0 ]; then + if ((${#activeHelp[*]} != 0)); then printf "\n"; printf "%%s\n" "${activeHelp[@]}" printf "\n" @@ -184,21 +197,21 @@ __%[1]s_process_completion_results() { # Separate activeHelp lines from real completions. # Fills the $activeHelp and $completions arrays. __%[1]s_extract_activeHelp() { - local activeHelpMarker="%[8]s" + local activeHelpMarker="%[9]s" local endIndex=${#activeHelpMarker} while IFS='' read -r comp; do - if [ "${comp:0:endIndex}" = "$activeHelpMarker" ]; then + if [[ ${comp:0:endIndex} == $activeHelpMarker ]]; then comp=${comp:endIndex} __%[1]s_debug "ActiveHelp found: $comp" - if [ -n "$comp" ]; then + if [[ -n $comp ]]; then activeHelp+=("$comp") fi else # Not an activeHelp line but a normal completion completions+=("$comp") fi - done < <(printf "%%s\n" "${out}") + done <<<"${out}" } __%[1]s_handle_completion_types() { @@ -254,7 +267,7 @@ __%[1]s_handle_standard_completion_case() { done < <(printf "%%s\n" "${completions[@]}") # If there is a single completion left, remove the description text - if [ ${#COMPREPLY[*]} -eq 1 ]; then + if ((${#COMPREPLY[*]} == 1)); then __%[1]s_debug "COMPREPLY[0]: ${COMPREPLY[0]}" comp="${COMPREPLY[0]%%%%$tab*}" __%[1]s_debug "Removed description from single completion, which is now: ${comp}" @@ -271,8 +284,8 @@ __%[1]s_handle_special_char() if [[ "$comp" == *${char}* && "$COMP_WORDBREAKS" == *${char}* ]]; then local word=${comp%%"${comp##*${char}}"} local idx=${#COMPREPLY[*]} - while [[ $((--idx)) -ge 0 ]]; do - COMPREPLY[$idx]=${COMPREPLY[$idx]#"$word"} + while ((--idx >= 0)); do + COMPREPLY[idx]=${COMPREPLY[idx]#"$word"} done fi } @@ -298,7 +311,7 @@ __%[1]s_format_comp_descriptions() # Make sure we can fit a description of at least 8 characters # if we are to align the descriptions. - if [[ $maxdesclength -gt 8 ]]; then + if ((maxdesclength > 8)); then # Add the proper number of spaces to align the descriptions for ((i = ${#comp} ; i < longest ; i++)); do comp+=" " @@ -310,8 +323,8 @@ __%[1]s_format_comp_descriptions() # If there is enough space for any description text, # truncate the descriptions that are too long for the shell width - if [ $maxdesclength -gt 0 ]; then - if [ ${#desc} -gt $maxdesclength ]; then + if ((maxdesclength > 0)); then + if ((${#desc} > maxdesclength)); then desc=${desc:0:$(( maxdesclength - 1 ))} desc+="…" fi @@ -332,9 +345,9 @@ __start_%[1]s() # Call _init_completion from the bash-completion package # to prepare the arguments properly if declare -F _init_completion >/dev/null 2>&1; then - _init_completion -n "=:" || return + _init_completion -n =: || return else - __%[1]s_init_completion -n "=:" || return + __%[1]s_init_completion -n =: || return fi __%[1]s_debug @@ -361,7 +374,7 @@ fi # ex: ts=4 sw=4 et filetype=sh `, name, compCmd, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, - ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder, activeHelpMarker)) } diff --git a/vendor/github.com/spf13/cobra/cobra.go b/vendor/github.com/spf13/cobra/cobra.go index fe44bc8a07..b07b44a0ce 100644 --- a/vendor/github.com/spf13/cobra/cobra.go +++ b/vendor/github.com/spf13/cobra/cobra.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -167,8 +167,8 @@ func appendIfNotPresent(s, stringToAppend string) string { // rpad adds padding to the right of a string. func rpad(s string, padding int) string { - template := fmt.Sprintf("%%-%ds", padding) - return fmt.Sprintf(template, s) + formattedString := fmt.Sprintf("%%-%ds", padding) + return fmt.Sprintf(formattedString, s) } // tmpl executes the given template text on data, writing the result to w. diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go index 6ff47dd5c3..01f7c6f1c5 100644 --- a/vendor/github.com/spf13/cobra/command.go +++ b/vendor/github.com/spf13/cobra/command.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -35,7 +35,7 @@ const FlagSetByCobraAnnotation = "cobra_annotation_flag_set_by_cobra" // FParseErrWhitelist configures Flag parse errors to be ignored type FParseErrWhitelist flag.ParseErrorsWhitelist -// Structure to manage groups for commands +// Group Structure to manage groups for commands type Group struct { ID string Title string @@ -47,7 +47,7 @@ type Group struct { // definition to ensure usability. type Command struct { // Use is the one-line usage message. - // Recommended syntax is as follow: + // Recommended syntax is as follows: // [ ] identifies an optional argument. Arguments that are not enclosed in brackets are required. // ... indicates that you can specify multiple values for the previous argument. // | indicates mutually exclusive information. You can use the argument to the left of the separator or the @@ -321,7 +321,7 @@ func (c *Command) SetHelpCommand(cmd *Command) { c.helpCommand = cmd } -// SetHelpCommandGroup sets the group id of the help command. +// SetHelpCommandGroupID sets the group id of the help command. func (c *Command) SetHelpCommandGroupID(groupID string) { if c.helpCommand != nil { c.helpCommand.GroupID = groupID @@ -330,7 +330,7 @@ func (c *Command) SetHelpCommandGroupID(groupID string) { c.helpCommandGroupID = groupID } -// SetCompletionCommandGroup sets the group id of the completion command. +// SetCompletionCommandGroupID sets the group id of the completion command. func (c *Command) SetCompletionCommandGroupID(groupID string) { // completionCommandGroupID is used if no completion command is defined by the user c.Root().completionCommandGroupID = groupID @@ -655,20 +655,44 @@ Loop: // argsMinusFirstX removes only the first x from args. Otherwise, commands that look like // openshift admin policy add-role-to-user admin my-user, lose the admin argument (arg[4]). -func argsMinusFirstX(args []string, x string) []string { - for i, y := range args { - if x == y { - ret := []string{} - ret = append(ret, args[:i]...) - ret = append(ret, args[i+1:]...) - return ret +// Special care needs to be taken not to remove a flag value. +func (c *Command) argsMinusFirstX(args []string, x string) []string { + if len(args) == 0 { + return args + } + c.mergePersistentFlags() + flags := c.Flags() + +Loop: + for pos := 0; pos < len(args); pos++ { + s := args[pos] + switch { + case s == "--": + // -- means we have reached the end of the parseable args. Break out of the loop now. + break Loop + case strings.HasPrefix(s, "--") && !strings.Contains(s, "=") && !hasNoOptDefVal(s[2:], flags): + fallthrough + case strings.HasPrefix(s, "-") && !strings.Contains(s, "=") && len(s) == 2 && !shortHasNoOptDefVal(s[1:], flags): + // This is a flag without a default value, and an equal sign is not used. Increment pos in order to skip + // over the next arg, because that is the value of this flag. + pos++ + continue + case !strings.HasPrefix(s, "-"): + // This is not a flag or a flag value. Check to see if it matches what we're looking for, and if so, + // return the args, excluding the one at this position. + if s == x { + ret := []string{} + ret = append(ret, args[:pos]...) + ret = append(ret, args[pos+1:]...) + return ret + } } } return args } func isFlagArg(arg string) bool { - return ((len(arg) >= 3 && arg[1] == '-') || + return ((len(arg) >= 3 && arg[0:2] == "--") || (len(arg) >= 2 && arg[0] == '-' && arg[1] != '-')) } @@ -686,7 +710,7 @@ func (c *Command) Find(args []string) (*Command, []string, error) { cmd := c.findNext(nextSubCmd) if cmd != nil { - return innerfind(cmd, argsMinusFirstX(innerArgs, nextSubCmd)) + return innerfind(cmd, c.argsMinusFirstX(innerArgs, nextSubCmd)) } return c, innerArgs } @@ -1272,7 +1296,7 @@ func (c *Command) AllChildCommandsHaveGroup() bool { return true } -// ContainGroups return if groupID exists in the list of command groups. +// ContainsGroup return if groupID exists in the list of command groups. func (c *Command) ContainsGroup(groupID string) bool { for _, x := range c.commandgroups { if x.ID == groupID { diff --git a/vendor/github.com/spf13/cobra/command_notwin.go b/vendor/github.com/spf13/cobra/command_notwin.go index 2b77f8f019..307f0c127f 100644 --- a/vendor/github.com/spf13/cobra/command_notwin.go +++ b/vendor/github.com/spf13/cobra/command_notwin.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/command_win.go b/vendor/github.com/spf13/cobra/command_win.go index 520f23abf0..adbef395c2 100644 --- a/vendor/github.com/spf13/cobra/command_win.go +++ b/vendor/github.com/spf13/cobra/command_win.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/completions.go b/vendor/github.com/spf13/cobra/completions.go index e8a0206db1..ee38c4d0b8 100644 --- a/vendor/github.com/spf13/cobra/completions.go +++ b/vendor/github.com/spf13/cobra/completions.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -77,6 +77,10 @@ const ( // obtain the same behavior but only for flags. ShellCompDirectiveFilterDirs + // ShellCompDirectiveKeepOrder indicates that the shell should preserve the order + // in which the completions are provided + ShellCompDirectiveKeepOrder + // =========================================================================== // All directives using iota should be above this one. @@ -159,6 +163,9 @@ func (d ShellCompDirective) string() string { if d&ShellCompDirectiveFilterDirs != 0 { directives = append(directives, "ShellCompDirectiveFilterDirs") } + if d&ShellCompDirectiveKeepOrder != 0 { + directives = append(directives, "ShellCompDirectiveKeepOrder") + } if len(directives) == 0 { directives = append(directives, "ShellCompDirectiveDefault") } @@ -169,7 +176,7 @@ func (d ShellCompDirective) string() string { return strings.Join(directives, ", ") } -// Adds a special hidden command that can be used to request custom completions. +// initCompleteCmd adds a special hidden command that can be used to request custom completions. func (c *Command) initCompleteCmd(args []string) { completeCmd := &Command{ Use: fmt.Sprintf("%s [command-line]", ShellCompRequestCmd), @@ -727,7 +734,7 @@ to enable it. You can execute the following once: To load completions in your current shell session: - source <(%[1]s completion zsh); compdef _%[1]s %[1]s + source <(%[1]s completion zsh) To load completions for every new session, execute once: diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.go b/vendor/github.com/spf13/cobra/doc/man_docs.go index b5a2c596e9..b8c15ce885 100644 --- a/vendor/github.com/spf13/cobra/doc/man_docs.go +++ b/vendor/github.com/spf13/cobra/doc/man_docs.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.go b/vendor/github.com/spf13/cobra/doc/md_docs.go index bab4b49636..c4a27c0093 100644 --- a/vendor/github.com/spf13/cobra/doc/md_docs.go +++ b/vendor/github.com/spf13/cobra/doc/md_docs.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/doc/rest_docs.go b/vendor/github.com/spf13/cobra/doc/rest_docs.go index d65890652d..2cca6fd778 100644 --- a/vendor/github.com/spf13/cobra/doc/rest_docs.go +++ b/vendor/github.com/spf13/cobra/doc/rest_docs.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -48,7 +48,7 @@ func printOptionsReST(buf *bytes.Buffer, cmd *cobra.Command, name string) error return nil } -// linkHandler for default ReST hyperlink markup +// defaultLinkHandler for default ReST hyperlink markup func defaultLinkHandler(name, ref string) string { return fmt.Sprintf("`%s <%s.rst>`_", name, ref) } @@ -169,7 +169,7 @@ func GenReSTTreeCustom(cmd *cobra.Command, dir string, filePrepender func(string return nil } -// adapted from: https://github.com/kr/text/blob/main/indent.go +// indentString adapted from: https://github.com/kr/text/blob/main/indent.go func indentString(s, p string) string { var res []byte b := []byte(s) diff --git a/vendor/github.com/spf13/cobra/doc/util.go b/vendor/github.com/spf13/cobra/doc/util.go index 499ecdd919..0aaa07a166 100644 --- a/vendor/github.com/spf13/cobra/doc/util.go +++ b/vendor/github.com/spf13/cobra/doc/util.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs.go b/vendor/github.com/spf13/cobra/doc/yaml_docs.go index 12f8cf33b8..2b26d6ec0f 100644 --- a/vendor/github.com/spf13/cobra/doc/yaml_docs.go +++ b/vendor/github.com/spf13/cobra/doc/yaml_docs.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/fish_completions.go b/vendor/github.com/spf13/cobra/fish_completions.go index 97112a17b2..12ca0d2b11 100644 --- a/vendor/github.com/spf13/cobra/fish_completions.go +++ b/vendor/github.com/spf13/cobra/fish_completions.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ function __%[1]s_perform_completion __%[1]s_debug "last arg: $lastArg" # Disable ActiveHelp which is not supported for fish shell - set -l requestComp "%[9]s=0 $args[1] %[3]s $args[2..-1] $lastArg" + set -l requestComp "%[10]s=0 $args[1] %[3]s $args[2..-1] $lastArg" __%[1]s_debug "Calling $requestComp" set -l results (eval $requestComp 2> /dev/null) @@ -89,6 +89,60 @@ function __%[1]s_perform_completion printf "%%s\n" "$directiveLine" end +# this function limits calls to __%[1]s_perform_completion, by caching the result behind $__%[1]s_perform_completion_once_result +function __%[1]s_perform_completion_once + __%[1]s_debug "Starting __%[1]s_perform_completion_once" + + if test -n "$__%[1]s_perform_completion_once_result" + __%[1]s_debug "Seems like a valid result already exists, skipping __%[1]s_perform_completion" + return 0 + end + + set --global __%[1]s_perform_completion_once_result (__%[1]s_perform_completion) + if test -z "$__%[1]s_perform_completion_once_result" + __%[1]s_debug "No completions, probably due to a failure" + return 1 + end + + __%[1]s_debug "Performed completions and set __%[1]s_perform_completion_once_result" + return 0 +end + +# this function is used to clear the $__%[1]s_perform_completion_once_result variable after completions are run +function __%[1]s_clear_perform_completion_once_result + __%[1]s_debug "" + __%[1]s_debug "========= clearing previously set __%[1]s_perform_completion_once_result variable ==========" + set --erase __%[1]s_perform_completion_once_result + __%[1]s_debug "Succesfully erased the variable __%[1]s_perform_completion_once_result" +end + +function __%[1]s_requires_order_preservation + __%[1]s_debug "" + __%[1]s_debug "========= checking if order preservation is required ==========" + + __%[1]s_perform_completion_once + if test -z "$__%[1]s_perform_completion_once_result" + __%[1]s_debug "Error determining if order preservation is required" + return 1 + end + + set -l directive (string sub --start 2 $__%[1]s_perform_completion_once_result[-1]) + __%[1]s_debug "Directive is: $directive" + + set -l shellCompDirectiveKeepOrder %[9]d + set -l keeporder (math (math --scale 0 $directive / $shellCompDirectiveKeepOrder) %% 2) + __%[1]s_debug "Keeporder is: $keeporder" + + if test $keeporder -ne 0 + __%[1]s_debug "This does require order preservation" + return 0 + end + + __%[1]s_debug "This doesn't require order preservation" + return 1 +end + + # This function does two things: # - Obtain the completions and store them in the global __%[1]s_comp_results # - Return false if file completion should be performed @@ -99,17 +153,17 @@ function __%[1]s_prepare_completions # Start fresh set --erase __%[1]s_comp_results - set -l results (__%[1]s_perform_completion) - __%[1]s_debug "Completion results: $results" + __%[1]s_perform_completion_once + __%[1]s_debug "Completion results: $__%[1]s_perform_completion_once_result" - if test -z "$results" + if test -z "$__%[1]s_perform_completion_once_result" __%[1]s_debug "No completion, probably due to a failure" # Might as well do file completion, in case it helps return 1 end - set -l directive (string sub --start 2 $results[-1]) - set --global __%[1]s_comp_results $results[1..-2] + set -l directive (string sub --start 2 $__%[1]s_perform_completion_once_result[-1]) + set --global __%[1]s_comp_results $__%[1]s_perform_completion_once_result[1..-2] __%[1]s_debug "Completions are: $__%[1]s_comp_results" __%[1]s_debug "Directive is: $directive" @@ -205,13 +259,17 @@ end # Remove any pre-existing completions for the program since we will be handling all of them. complete -c %[2]s -e +# this will get called after the two calls below and clear the $__%[1]s_perform_completion_once_result global +complete -c %[2]s -n '__%[1]s_clear_perform_completion_once_result' # The call to __%[1]s_prepare_completions will setup __%[1]s_comp_results # which provides the program's completion choices. -complete -c %[2]s -n '__%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results' - +# If this doesn't require order preservation, we don't use the -k flag +complete -c %[2]s -n 'not __%[1]s_requires_order_preservation && __%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results' +# otherwise we use the -k flag +complete -k -c %[2]s -n '__%[1]s_requires_order_preservation && __%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results' `, nameForVar, name, compCmd, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, - ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, activeHelpEnvVar(name))) + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder, activeHelpEnvVar(name))) } // GenFishCompletion generates fish completion file and writes to the passed writer. diff --git a/vendor/github.com/spf13/cobra/flag_groups.go b/vendor/github.com/spf13/cobra/flag_groups.go index 9c377aaf9c..b35fde1554 100644 --- a/vendor/github.com/spf13/cobra/flag_groups.go +++ b/vendor/github.com/spf13/cobra/flag_groups.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/powershell_completions.go b/vendor/github.com/spf13/cobra/powershell_completions.go index 004de42e41..177d2755f2 100644 --- a/vendor/github.com/spf13/cobra/powershell_completions.go +++ b/vendor/github.com/spf13/cobra/powershell_completions.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -77,6 +77,7 @@ filter __%[1]s_escapeStringWithSpecialChars { $ShellCompDirectiveNoFileComp=%[6]d $ShellCompDirectiveFilterFileExt=%[7]d $ShellCompDirectiveFilterDirs=%[8]d + $ShellCompDirectiveKeepOrder=%[9]d # Prepare the command to request completions for the program. # Split the command at the first space to separate the program and arguments. @@ -106,13 +107,22 @@ filter __%[1]s_escapeStringWithSpecialChars { # If the last parameter is complete (there is a space following it) # We add an extra empty parameter so we can indicate this to the go method. __%[1]s_debug "Adding extra empty parameter" -`+" # We need to use `\"`\" to pass an empty argument a \"\" or '' does not work!!!"+` -`+" $RequestComp=\"$RequestComp\" + ' `\"`\"'"+` + # PowerShell 7.2+ changed the way how the arguments are passed to executables, + # so for pre-7.2 or when Legacy argument passing is enabled we need to use +`+" # `\"`\" to pass an empty argument, a \"\" or '' does not work!!!"+` + if ($PSVersionTable.PsVersion -lt [version]'7.2.0' -or + ($PSVersionTable.PsVersion -lt [version]'7.3.0' -and -not [ExperimentalFeature]::IsEnabled("PSNativeCommandArgumentPassing")) -or + (($PSVersionTable.PsVersion -ge [version]'7.3.0' -or [ExperimentalFeature]::IsEnabled("PSNativeCommandArgumentPassing")) -and + $PSNativeCommandArgumentPassing -eq 'Legacy')) { +`+" $RequestComp=\"$RequestComp\" + ' `\"`\"'"+` + } else { + $RequestComp="$RequestComp" + ' ""' + } } __%[1]s_debug "Calling $RequestComp" # First disable ActiveHelp which is not supported for Powershell - $env:%[9]s=0 + $env:%[10]s=0 #call the command store the output in $out and redirect stderr and stdout to null # $Out is an array contains each line per element @@ -137,7 +147,7 @@ filter __%[1]s_escapeStringWithSpecialChars { } $Longest = 0 - $Values = $Out | ForEach-Object { + [Array]$Values = $Out | ForEach-Object { #Split the output in name and description `+" $Name, $Description = $_.Split(\"`t\",2)"+` __%[1]s_debug "Name: $Name Description: $Description" @@ -182,6 +192,11 @@ filter __%[1]s_escapeStringWithSpecialChars { } } + # we sort the values in ascending order by name if keep order isn't passed + if (($Directive -band $ShellCompDirectiveKeepOrder) -eq 0 ) { + $Values = $Values | Sort-Object -Property Name + } + if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) { __%[1]s_debug "ShellCompDirectiveNoFileComp is called" @@ -267,7 +282,7 @@ filter __%[1]s_escapeStringWithSpecialChars { Register-ArgumentCompleter -CommandName '%[1]s' -ScriptBlock $__%[2]sCompleterBlock `, name, nameForVar, compCmd, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, - ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, activeHelpEnvVar(name))) + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder, activeHelpEnvVar(name))) } func (c *Command) genPowerShellCompletion(w io.Writer, includeDesc bool) error { diff --git a/vendor/github.com/spf13/cobra/projects_using_cobra.md b/vendor/github.com/spf13/cobra/projects_using_cobra.md index 6865f88e79..8a291eb20e 100644 --- a/vendor/github.com/spf13/cobra/projects_using_cobra.md +++ b/vendor/github.com/spf13/cobra/projects_using_cobra.md @@ -1,11 +1,13 @@ ## Projects using Cobra - [Allero](https://github.com/allero-io/allero) +- [Arewefastyet](https://benchmark.vitess.io) - [Arduino CLI](https://github.com/arduino/arduino-cli) - [Bleve](https://blevesearch.com/) - [Cilium](https://cilium.io/) - [CloudQuery](https://github.com/cloudquery/cloudquery) - [CockroachDB](https://www.cockroachlabs.com/) +- [Constellation](https://github.com/edgelesssys/constellation) - [Cosmos SDK](https://github.com/cosmos/cosmos-sdk) - [Datree](https://github.com/datreeio/datree) - [Delve](https://github.com/derekparker/delve) @@ -25,7 +27,7 @@ - [Istio](https://istio.io) - [Kool](https://github.com/kool-dev/kool) - [Kubernetes](https://kubernetes.io/) -- [Kubescape](https://github.com/armosec/kubescape) +- [Kubescape](https://github.com/kubescape/kubescape) - [KubeVirt](https://github.com/kubevirt/kubevirt) - [Linkerd](https://linkerd.io/) - [Mattermost-server](https://github.com/mattermost/mattermost-server) @@ -51,10 +53,12 @@ - [Random](https://github.com/erdaltsksn/random) - [Rclone](https://rclone.org/) - [Scaleway CLI](https://github.com/scaleway/scaleway-cli) +- [Sia](https://github.com/SiaFoundation/siad) - [Skaffold](https://skaffold.dev/) - [Tendermint](https://github.com/tendermint/tendermint) - [Twitch CLI](https://github.com/twitchdev/twitch-cli) - [UpCloud CLI (`upctl`)](https://github.com/UpCloudLtd/upcloud-cli) +- [Vitess](https://vitess.io) - VMware's [Tanzu Community Edition](https://github.com/vmware-tanzu/community-edition) & [Tanzu Framework](https://github.com/vmware-tanzu/tanzu-framework) - [Werf](https://werf.io/) - [ZITADEL](https://github.com/zitadel/zitadel) diff --git a/vendor/github.com/spf13/cobra/shell_completions.go b/vendor/github.com/spf13/cobra/shell_completions.go index 126e83c307..b035742d39 100644 --- a/vendor/github.com/spf13/cobra/shell_completions.go +++ b/vendor/github.com/spf13/cobra/shell_completions.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/github.com/spf13/cobra/shell_completions.md b/vendor/github.com/spf13/cobra/shell_completions.md index 553ee5df8a..065c0621d4 100644 --- a/vendor/github.com/spf13/cobra/shell_completions.md +++ b/vendor/github.com/spf13/cobra/shell_completions.md @@ -71,7 +71,7 @@ PowerShell: `,cmd.Root().Name()), DisableFlagsInUseLine: true, ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, - Args: cobra.ExactValidArgs(1), + Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs), Run: func(cmd *cobra.Command, args []string) { switch args[0] { case "bash": @@ -162,16 +162,7 @@ cmd := &cobra.Command{ } ``` -The aliases are not shown to the user on tab completion, but they are accepted as valid nouns by -the completion algorithm if entered manually, e.g. in: - -```bash -$ kubectl get rc [tab][tab] -backend frontend database -``` - -Note that without declaring `rc` as an alias, the completion algorithm would not know to show the list of -replication controllers following `rc`. +The aliases are shown to the user on tab completion only if no completions were found within sub-commands or `ValidArgs`. ### Dynamic completion of nouns @@ -237,6 +228,10 @@ ShellCompDirectiveFilterFileExt // return []string{"themes"}, ShellCompDirectiveFilterDirs // ShellCompDirectiveFilterDirs + +// ShellCompDirectiveKeepOrder indicates that the shell should preserve the order +// in which the completions are provided +ShellCompDirectiveKeepOrder ``` ***Note***: When using the `ValidArgsFunction`, Cobra will call your registered function after having parsed all flags and arguments provided in the command-line. You therefore don't need to do this parsing yourself. For example, when a user calls `helm status --namespace my-rook-ns [tab][tab]`, Cobra will call your registered `ValidArgsFunction` after having parsed the `--namespace` flag, as it would have done when calling the `RunE` function. @@ -385,6 +380,19 @@ or ```go ValidArgs: []string{"bash\tCompletions for bash", "zsh\tCompletions for zsh"} ``` + +If you don't want to show descriptions in the completions, you can add `--no-descriptions` to the default `completion` command to disable them, like: + +```bash +$ source <(helm completion bash) +$ helm completion [tab][tab] +bash (generate autocompletion script for bash) powershell (generate autocompletion script for powershell) +fish (generate autocompletion script for fish) zsh (generate autocompletion script for zsh) + +$ source <(helm completion bash --no-descriptions) +$ helm completion [tab][tab] +bash fish powershell zsh +``` ## Bash completions ### Dependencies diff --git a/vendor/github.com/spf13/cobra/user_guide.md b/vendor/github.com/spf13/cobra/user_guide.md index e55367e853..85201d840c 100644 --- a/vendor/github.com/spf13/cobra/user_guide.md +++ b/vendor/github.com/spf13/cobra/user_guide.md @@ -188,6 +188,37 @@ var versionCmd = &cobra.Command{ } ``` +### Organizing subcommands + +A command may have subcommands which in turn may have other subcommands. This is achieved by using +`AddCommand`. In some cases, especially in larger applications, each subcommand may be defined in +its own go package. + +The suggested approach is for the parent command to use `AddCommand` to add its most immediate +subcommands. For example, consider the following directory structure: + +```text +├── cmd +│   ├── root.go +│   └── sub1 +│   ├── sub1.go +│   └── sub2 +│   ├── leafA.go +│   ├── leafB.go +│   └── sub2.go +└── main.go +``` + +In this case: + +* The `init` function of `root.go` adds the command defined in `sub1.go` to the root command. +* The `init` function of `sub1.go` adds the command defined in `sub2.go` to the sub1 command. +* The `init` function of `sub2.go` adds the commands defined in `leafA.go` and `leafB.go` to the + sub2 command. + +This approach ensures the subcommands are always included at compile time while avoiding cyclic +references. + ### Returning and handling errors If you wish to return an error to the caller of a command, `RunE` can be used. @@ -313,8 +344,8 @@ rootCmd.MarkFlagsRequiredTogether("username", "password") You can also prevent different flags from being provided together if they represent mutually exclusive options such as specifying an output format as either `--json` or `--yaml` but never both: ```go -rootCmd.Flags().BoolVar(&u, "json", false, "Output in JSON") -rootCmd.Flags().BoolVar(&pw, "yaml", false, "Output in YAML") +rootCmd.Flags().BoolVar(&ofJson, "json", false, "Output in JSON") +rootCmd.Flags().BoolVar(&ofYaml, "yaml", false, "Output in YAML") rootCmd.MarkFlagsMutuallyExclusive("json", "yaml") ``` @@ -349,7 +380,7 @@ shown below: ```go var cmd = &cobra.Command{ Short: "hello", - Args: MatchAll(ExactArgs(2), OnlyValidArgs), + Args: cobra.MatchAll(cobra.ExactArgs(2), cobra.OnlyValidArgs), Run: func(cmd *cobra.Command, args []string) { fmt.Println("Hello, World!") }, diff --git a/vendor/github.com/spf13/cobra/zsh_completions.go b/vendor/github.com/spf13/cobra/zsh_completions.go index 84cec76fde..1856e4c7f6 100644 --- a/vendor/github.com/spf13/cobra/zsh_completions.go +++ b/vendor/github.com/spf13/cobra/zsh_completions.go @@ -1,4 +1,4 @@ -// Copyright 2013-2022 The Cobra Authors +// Copyright 2013-2023 The Cobra Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -90,6 +90,7 @@ func genZshComp(buf io.StringWriter, name string, includeDesc bool) { compCmd = ShellCompNoDescRequestCmd } WriteStringAndCheck(buf, fmt.Sprintf(`#compdef %[1]s +compdef _%[1]s %[1]s # zsh completion for %-36[1]s -*- shell-script -*- @@ -108,8 +109,9 @@ _%[1]s() local shellCompDirectiveNoFileComp=%[5]d local shellCompDirectiveFilterFileExt=%[6]d local shellCompDirectiveFilterDirs=%[7]d + local shellCompDirectiveKeepOrder=%[8]d - local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace + local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace keepOrder local -a completions __%[1]s_debug "\n========= starting completion logic ==========" @@ -177,7 +179,7 @@ _%[1]s() return fi - local activeHelpMarker="%[8]s" + local activeHelpMarker="%[9]s" local endIndex=${#activeHelpMarker} local startIndex=$((${#activeHelpMarker}+1)) local hasActiveHelp=0 @@ -227,6 +229,11 @@ _%[1]s() noSpace="-S ''" fi + if [ $((directive & shellCompDirectiveKeepOrder)) -ne 0 ]; then + __%[1]s_debug "Activating keep order." + keepOrder="-V" + fi + if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then # File extension filtering local filteringCmd @@ -262,7 +269,7 @@ _%[1]s() return $result else __%[1]s_debug "Calling _describe" - if eval _describe "completions" completions $flagPrefix $noSpace; then + if eval _describe $keepOrder "completions" completions $flagPrefix $noSpace; then __%[1]s_debug "_describe found some completions" # Return the success of having called _describe @@ -296,6 +303,6 @@ if [ "$funcstack[1]" = "_%[1]s" ]; then fi `, name, compCmd, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, - ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder, activeHelpMarker)) } diff --git a/vendor/github.com/subosito/gotenv/gotenv.go b/vendor/github.com/subosito/gotenv/gotenv.go index 7b1186e1fd..dc013e1e07 100644 --- a/vendor/github.com/subosito/gotenv/gotenv.go +++ b/vendor/github.com/subosito/gotenv/gotenv.go @@ -3,6 +3,7 @@ package gotenv import ( "bufio" + "bytes" "fmt" "io" "os" @@ -174,9 +175,36 @@ func Write(env Env, filename string) error { return file.Sync() } +// splitLines is a valid SplitFunc for a bufio.Scanner. It will split lines on CR ('\r'), LF ('\n') or CRLF (any of the three sequences). +// If a CR is immediately followed by a LF, it is treated as a CRLF (one single line break). +func splitLines(data []byte, atEOF bool) (advance int, token []byte, err error) { + if atEOF && len(data) == 0 { + return 0, nil, bufio.ErrFinalToken + } + + idx := bytes.IndexAny(data, "\r\n") + switch { + case atEOF && idx < 0: + return len(data), data, bufio.ErrFinalToken + + case idx < 0: + return 0, nil, nil + } + + // consume CR or LF + eol := idx + 1 + // detect CRLF + if len(data) > eol && data[eol-1] == '\r' && data[eol] == '\n' { + eol++ + } + + return eol, data[:idx], nil +} + func strictParse(r io.Reader, override bool) (Env, error) { env := make(Env) scanner := bufio.NewScanner(r) + scanner.Split(splitLines) firstLine := true @@ -283,7 +311,6 @@ func parseLine(s string, env Env, override bool) error { return varReplacement(s, hsq, env, override) } val = varRgx.ReplaceAllStringFunc(val, fv) - val = parseVal(val, env, hdq, override) } env[key] = val @@ -352,18 +379,3 @@ func checkFormat(s string, env Env) error { return fmt.Errorf("line `%s` doesn't match format", s) } - -func parseVal(val string, env Env, ignoreNewlines bool, override bool) string { - if strings.Contains(val, "=") && !ignoreNewlines { - kv := strings.Split(val, "\r") - - if len(kv) > 1 { - val = kv[0] - for _, l := range kv[1:] { - _ = parseLine(l, env, override) - } - } - } - - return val -} diff --git a/vendor/github.com/tektoncd/cli/pkg/actions/get.go b/vendor/github.com/tektoncd/cli/pkg/actions/get.go index 518af92326..c6f39d1d98 100644 --- a/vendor/github.com/tektoncd/cli/pkg/actions/get.go +++ b/vendor/github.com/tektoncd/cli/pkg/actions/get.go @@ -18,15 +18,18 @@ import ( "context" "io" + "github.com/tektoncd/cli/pkg/cli" "github.com/tektoncd/cli/pkg/printer" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" cliopts "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" ) +// TODO: remove as all the function uses are moved to new func // PrintObject is used to take a partial resource and the name of an object in the cluster, fetch it using the dynamic client, and print out the object. func PrintObject(groupResource schema.GroupVersionResource, obj string, w io.Writer, dynamic dynamic.Interface, discovery discovery.DiscoveryInterface, f *cliopts.PrintFlags, ns string) error { res, err := Get(groupResource, dynamic, discovery, obj, ns, metav1.GetOptions{}) @@ -37,6 +40,39 @@ func PrintObject(groupResource schema.GroupVersionResource, obj string, w io.Wri return printer.PrintObject(w, res, f) } +// PrintObject is used to take a partial resource and the name of an object in the cluster, fetch it using the dynamic client, and print out the object. +func PrintObjectV1(groupResource schema.GroupVersionResource, obj string, w io.Writer, client *cli.Clients, f *cliopts.PrintFlags, ns string) error { + res, err := GetUnstructured(groupResource, client, obj, ns, metav1.GetOptions{}) + if err != nil { + return err + } + + return printer.PrintObject(w, res, f) +} + +// GetV1 is used to take a partial resource and the name of an object in the cluster and fetch it from the cluster using the dynamic client. +func GetV1(gr schema.GroupVersionResource, c *cli.Clients, objname, ns string, op metav1.GetOptions, obj interface{}) error { + unstructuredObj, err := GetUnstructured(gr, c, objname, ns, op) + if err != nil { + return err + } + return runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredObj.UnstructuredContent(), obj) +} + +func GetUnstructured(gr schema.GroupVersionResource, c *cli.Clients, objname, ns string, op metav1.GetOptions) (*unstructured.Unstructured, error) { + gvr, err := GetGroupVersionResource(gr, c.Tekton.Discovery()) + if err != nil { + return nil, err + } + + unstructuredObj, err := c.Dynamic.Resource(*gvr).Namespace(ns).Get(context.Background(), objname, op) + if err != nil { + return nil, err + } + return unstructuredObj, nil +} + +// TODO: remove as all the function uses are moved to new func // Get is used to take a partial resource and the name of an object in the cluster and fetch it from the cluster using the dynamic client. func Get(gr schema.GroupVersionResource, dynamic dynamic.Interface, discovery discovery.DiscoveryInterface, objname, ns string, op metav1.GetOptions) (*unstructured.Unstructured, error) { gvr, err := GetGroupVersionResource(gr, discovery) diff --git a/vendor/github.com/tektoncd/cli/pkg/actions/list.go b/vendor/github.com/tektoncd/cli/pkg/actions/list.go index 13389d4289..64af2b1a5d 100644 --- a/vendor/github.com/tektoncd/cli/pkg/actions/list.go +++ b/vendor/github.com/tektoncd/cli/pkg/actions/list.go @@ -16,11 +16,15 @@ package actions import ( "context" + "fmt" "io" + "os" + "github.com/tektoncd/cli/pkg/cli" "github.com/tektoncd/cli/pkg/printer" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" cliopts "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/discovery" @@ -29,7 +33,7 @@ import ( // PrintObjects takes a partial resource, fetches a list of that resource's objects in the cluster using the dynamic client, and prints out the objects. func PrintObjects(groupResource schema.GroupVersionResource, w io.Writer, dynamic dynamic.Interface, discovery discovery.DiscoveryInterface, f *cliopts.PrintFlags, ns string) error { - allres, err := List(groupResource, dynamic, discovery, ns, metav1.ListOptions{}) + allres, err := list(groupResource, dynamic, discovery, ns, metav1.ListOptions{}) if err != nil { return err } @@ -37,6 +41,33 @@ func PrintObjects(groupResource schema.GroupVersionResource, w io.Writer, dynami return printer.PrintObject(w, allres, f) } +// List fetches the resource and convert it to respective object +func ListV1(gr schema.GroupVersionResource, c *cli.Clients, opts metav1.ListOptions, ns string, obj interface{}) error { + unstructuredObj, err := list(gr, c.Dynamic, c.Tekton.Discovery(), ns, opts) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to list objects from %s namespace \n", ns) + return err + } + + return runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredObj.UnstructuredContent(), obj) +} + +// list takes a partial resource and fetches a list of that resource's objects in the cluster using the dynamic client. +func list(gr schema.GroupVersionResource, dynamic dynamic.Interface, discovery discovery.DiscoveryInterface, ns string, op metav1.ListOptions) (*unstructured.UnstructuredList, error) { + gvr, err := GetGroupVersionResource(gr, discovery) + if err != nil { + return nil, err + } + + allRes, err := dynamic.Resource(*gvr).Namespace(ns).List(context.Background(), op) + if err != nil { + return nil, err + } + + return allRes, nil +} + +// TODO: remove as all the function uses are moved to new func // List takes a partial resource and fetches a list of that resource's objects in the cluster using the dynamic client. func List(gr schema.GroupVersionResource, dynamic dynamic.Interface, discovery discovery.DiscoveryInterface, ns string, op metav1.ListOptions) (*unstructured.UnstructuredList, error) { gvr, err := GetGroupVersionResource(gr, discovery) diff --git a/vendor/github.com/tektoncd/cli/pkg/actions/patch.go b/vendor/github.com/tektoncd/cli/pkg/actions/patch.go index 40eede66b3..01db5ec5b6 100644 --- a/vendor/github.com/tektoncd/cli/pkg/actions/patch.go +++ b/vendor/github.com/tektoncd/cli/pkg/actions/patch.go @@ -16,24 +16,27 @@ package actions import ( "context" + "fmt" + "os" "github.com/tektoncd/cli/pkg/cli" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" ) // Patch takes a partial resource, an object name in the cluster, and patch data to be applied to that object, and patches the object using the dynamic client. -func Patch(gr schema.GroupVersionResource, clients *cli.Clients, objName string, data []byte, opt metav1.PatchOptions, ns string) (*unstructured.Unstructured, error) { +func Patch(gr schema.GroupVersionResource, clients *cli.Clients, objName string, data []byte, opt metav1.PatchOptions, ns string, obj interface{}) error { gvr, err := GetGroupVersionResource(gr, clients.Tekton.Discovery()) if err != nil { - return nil, err + return err } - patchedObj, err := clients.Dynamic.Resource(*gvr).Namespace(ns).Patch(context.Background(), objName, types.JSONPatchType, data, opt) + unstructuredObj, err := clients.Dynamic.Resource(*gvr).Namespace(ns).Patch(context.Background(), objName, types.JSONPatchType, data, opt) if err != nil { - return nil, err + fmt.Fprintf(os.Stderr, "Failed to patch object from %s namespace \n", ns) + return err } - return patchedObj, nil + return runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredObj.UnstructuredContent(), obj) } diff --git a/vendor/github.com/tektoncd/cli/pkg/cli/interface.go b/vendor/github.com/tektoncd/cli/pkg/cli/interface.go index 44aa762708..25ae0d7dfe 100644 --- a/vendor/github.com/tektoncd/cli/pkg/cli/interface.go +++ b/vendor/github.com/tektoncd/cli/pkg/cli/interface.go @@ -20,7 +20,6 @@ import ( "github.com/jonboulle/clockwork" "github.com/tektoncd/pipeline/pkg/client/clientset/versioned" - versionedResource "github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned" versionedTriggers "github.com/tektoncd/triggers/pkg/client/clientset/versioned" "k8s.io/client-go/dynamic" k8s "k8s.io/client-go/kubernetes" @@ -37,7 +36,6 @@ type Clients struct { Tekton versioned.Interface Kube k8s.Interface Triggers versionedTriggers.Interface - Resource versionedResource.Interface HTTPClient http.Client Dynamic dynamic.Interface } diff --git a/vendor/github.com/tektoncd/cli/pkg/cli/params.go b/vendor/github.com/tektoncd/cli/pkg/cli/params.go index 668af4c6cd..28fec4afc9 100644 --- a/vendor/github.com/tektoncd/cli/pkg/cli/params.go +++ b/vendor/github.com/tektoncd/cli/pkg/cli/params.go @@ -19,7 +19,6 @@ import ( "github.com/jonboulle/clockwork" "github.com/pkg/errors" "github.com/tektoncd/pipeline/pkg/client/clientset/versioned" - versionedResource "github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned" versionedTriggers "github.com/tektoncd/triggers/pkg/client/clientset/versioned" "k8s.io/client-go/dynamic" k8s "k8s.io/client-go/kubernetes" @@ -63,15 +62,6 @@ func (p *TektonParams) triggersClient(config *rest.Config) (versionedTriggers.In return cs, nil } -func (p *TektonParams) resourceClient(config *rest.Config) (versionedResource.Interface, error) { - cs, err := versionedResource.NewForConfig(config) - if err != nil { - return nil, err - } - - return cs, nil -} - // Set kube client based on config func (p *TektonParams) kubeClient(config *rest.Config) (k8s.Interface, error) { k8scs, err := k8s.NewForConfig(config) @@ -127,11 +117,6 @@ func (p *TektonParams) Clients(cfg ...*rest.Config) (*Clients, error) { return nil, err } - resource, err := p.resourceClient(config) - if err != nil { - return nil, err - } - triggers, err := p.triggersClient(config) if err != nil { return nil, err @@ -150,7 +135,6 @@ func (p *TektonParams) Clients(cfg ...*rest.Config) (*Clients, error) { p.clients = &Clients{ Tekton: tekton, Kube: kube, - Resource: resource, Triggers: triggers, Dynamic: dynamic, } diff --git a/vendor/github.com/tektoncd/cli/pkg/formatted/completion.go b/vendor/github.com/tektoncd/cli/pkg/formatted/completion.go index e093d57070..89275acea3 100644 --- a/vendor/github.com/tektoncd/cli/pkg/formatted/completion.go +++ b/vendor/github.com/tektoncd/cli/pkg/formatted/completion.go @@ -26,6 +26,6 @@ func BaseCompletion(target string, args []string) ([]string, cobra.ShellCompDire } // ParentCompletion do completion of command to the Parent -func ParentCompletion(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { +func ParentCompletion(cmd *cobra.Command, args []string, _ string) ([]string, cobra.ShellCompDirective) { return BaseCompletion(cmd.Parent().Name(), args) } diff --git a/vendor/github.com/tektoncd/cli/pkg/formatted/description.go b/vendor/github.com/tektoncd/cli/pkg/formatted/description.go index 54b96f9431..bbeeb50a4f 100644 --- a/vendor/github.com/tektoncd/cli/pkg/formatted/description.go +++ b/vendor/github.com/tektoncd/cli/pkg/formatted/description.go @@ -15,6 +15,7 @@ package formatted import ( + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" corev1 "k8s.io/api/core/v1" ) @@ -36,3 +37,21 @@ func RemoveLastAppliedConfig(annotations map[string]string) map[string]string { } return removed } + +// Check if PipelineRef exists on a PipelineRunSpec. Returns empty string if not present. +func PipelineRefExists(spec v1.PipelineRunSpec) string { + if spec.PipelineRef == nil { + return "" + } + + return spec.PipelineRef.Name +} + +// Check if TaskRef exists on a TaskRunSpec. Returns empty string if not present. +func TaskRefExists(spec v1.TaskRunSpec) string { + if spec.TaskRef == nil { + return "" + } + + return spec.TaskRef.Name +} diff --git a/vendor/github.com/tektoncd/cli/pkg/formatted/k8s.go b/vendor/github.com/tektoncd/cli/pkg/formatted/k8s.go index 57a87c05a4..00cfb0d439 100644 --- a/vendor/github.com/tektoncd/cli/pkg/formatted/k8s.go +++ b/vendor/github.com/tektoncd/cli/pkg/formatted/k8s.go @@ -20,7 +20,7 @@ import ( "github.com/fatih/color" corev1 "k8s.io/api/core/v1" - "knative.dev/pkg/apis/duck/v1beta1" + v1 "knative.dev/pkg/apis/duck/v1" ) var ConditionColor = map[string]color.Attribute{ @@ -52,7 +52,7 @@ func AutoStepName(stepName string) string { } // Condition returns a human readable text based on the status of the Condition -func Condition(c v1beta1.Conditions) string { +func Condition(c v1.Conditions) string { var status string if len(c) == 0 { return "---" diff --git a/vendor/github.com/tektoncd/cli/pkg/formatted/param.go b/vendor/github.com/tektoncd/cli/pkg/formatted/param.go index 7667ad56b8..7de003cd18 100644 --- a/vendor/github.com/tektoncd/cli/pkg/formatted/param.go +++ b/vendor/github.com/tektoncd/cli/pkg/formatted/param.go @@ -18,47 +18,56 @@ import ( "fmt" "strings" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" ) // Param returns params with their values. If user value is not defined then returns default value, // if default value is not defined then returns param's type -func Param(params []v1beta1.Param, paramSpec []v1beta1.ParamSpec) string { +func Param(params []v1.Param, paramSpec []v1.ParamSpec) string { if len(params) == 0 { return "---" } var str string for i, param := range params { - if param.Value.Type == "string" { - paramValue := CheckParamDefaultValue(param.Value.StringVal, paramSpec) - if i == len(params)-1 { - str += fmt.Sprintf("%s: %s", param.Name, paramValue) - } else { - str += fmt.Sprintf("%s: %s, ", param.Name, paramValue) - } - } else { - paramValues := " [" + paramValue := "" + switch param.Value.Type { + case "string": + paramValue = CheckParamDefaultValue(param.Value.StringVal, paramSpec) + case "array": + paramValue = "[" for j, pv := range param.Value.ArrayVal { pv = CheckParamDefaultValue(pv, paramSpec) if j == len(param.Value.ArrayVal)-1 { - paramValues += " " + pv + " ]" + paramValue += " " + pv + " ]" } else { - paramValues += " " + pv + "," + paramValue += " " + pv + "," } } - if i == len(params)-1 { - str += fmt.Sprintf("%s:%s", param.Name, paramValues) - } else { - str += fmt.Sprintf("%s:%s, ", param.Name, paramValues) + default: + paramValue = "{" + j := 0 + for k, v := range param.Value.ObjectVal { + pv := CheckParamDefaultValue(v, paramSpec) + if j == len(param.Value.ObjectVal)-1 { + paramValue += fmt.Sprintf(" %s: %s }", k, pv) + } else { + paramValue += fmt.Sprintf(" %s: %s ,", k, pv) + } + j++ } } + if i == len(params)-1 { + str += fmt.Sprintf("%s: %s", param.Name, paramValue) + } else { + str += fmt.Sprintf("%s: %s, ", param.Name, paramValue) + } } return str } // CheckParamDefaultValue returns param's value if defined, if not then checks for default value // If default value is not defined then returns param's type -func CheckParamDefaultValue(param string, paramSpec []v1beta1.ParamSpec) string { +func CheckParamDefaultValue(param string, paramSpec []v1.ParamSpec) string { if strings.ContainsAny(param, "$") { paramValue := "" replacer := strings.NewReplacer("$", "", "(", "", ")", "", "params.", "") @@ -69,9 +78,10 @@ func CheckParamDefaultValue(param string, paramSpec []v1beta1.ParamSpec) string paramValue = string(spec.Type) break } - if spec.Default.Type == "string" { + switch spec.Default.Type { + case "string": paramValue = spec.Default.StringVal - } else if spec.Default.Type == "array" { + case "array": pv := "" for k, val := range spec.Default.ArrayVal { if k == 0 { @@ -81,6 +91,17 @@ func CheckParamDefaultValue(param string, paramSpec []v1beta1.ParamSpec) string } } paramValue = pv + default: + pv := "{" + first := true + for k, val := range spec.Default.ObjectVal { + if !first { + pv += "," + } + pv += k + ":" + val + first = false + } + paramValue = pv + "}" } break } diff --git a/vendor/github.com/tektoncd/cli/pkg/formatted/results.go b/vendor/github.com/tektoncd/cli/pkg/formatted/results.go index d999817685..dfc668f7bf 100644 --- a/vendor/github.com/tektoncd/cli/pkg/formatted/results.go +++ b/vendor/github.com/tektoncd/cli/pkg/formatted/results.go @@ -18,30 +18,21 @@ import ( "encoding/json" "strings" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" ) // Result will format a given result value -func Result(value v1beta1.ArrayOrString) string { +func Result(value v1.ParamValue) string { switch value.Type { - case v1beta1.ParamTypeString: + case v1.ParamTypeString: // remove trailing new-line from value return strings.TrimSuffix(value.StringVal, "\n") - case v1beta1.ParamTypeArray: + case v1.ParamTypeArray: return strings.Join(value.ArrayVal, ", ") - case v1beta1.ParamTypeObject: + case v1.ParamTypeObject: // FIXME: do not ignore the error v, _ := json.Marshal(value.ObjectVal) return string(v) } return "" } - -// ResultString will format a given result value. -// This is a deprecated function, that should get removed once all results -// are using ArrayOrString. -// Deprecated -func ResultString(value string) string { - // remove trailing new-line from value - return strings.TrimSuffix(value, "\n") -} diff --git a/vendor/github.com/tektoncd/cli/pkg/formatted/task.go b/vendor/github.com/tektoncd/cli/pkg/formatted/task.go index df86cb4e62..be2584fa67 100644 --- a/vendor/github.com/tektoncd/cli/pkg/formatted/task.go +++ b/vendor/github.com/tektoncd/cli/pkg/formatted/task.go @@ -15,10 +15,10 @@ package formatted import ( - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" ) -func GetTaskRefName(task *v1beta1.PipelineTask) string { +func GetTaskRefName(task *v1.PipelineTask) string { if task.TaskRef != nil { return task.TaskRef.Name } diff --git a/vendor/github.com/tektoncd/cli/pkg/formatted/workspace.go b/vendor/github.com/tektoncd/cli/pkg/formatted/workspace.go index 5da0d187e4..2b66ad1e16 100644 --- a/vendor/github.com/tektoncd/cli/pkg/formatted/workspace.go +++ b/vendor/github.com/tektoncd/cli/pkg/formatted/workspace.go @@ -17,11 +17,11 @@ package formatted import ( "fmt" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" corev1 "k8s.io/api/core/v1" ) -func Workspace(ws v1beta1.WorkspaceBinding) string { +func Workspace(ws v1.WorkspaceBinding) string { if ws.VolumeClaimTemplate != nil { return "VolumeClaimTemplate" } diff --git a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/description.go b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/description.go new file mode 100644 index 0000000000..08ed306e15 --- /dev/null +++ b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/description.go @@ -0,0 +1,287 @@ +// Copyright © 2020 The Tekton 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 pipelinerun + +import ( + "context" + "fmt" + "io" + "sort" + "strings" + "text/tabwriter" + "text/template" + + "github.com/jonboulle/clockwork" + "github.com/tektoncd/cli/pkg/actions" + "github.com/tektoncd/cli/pkg/cli" + "github.com/tektoncd/cli/pkg/formatted" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +const describeTemplate = `{{decorate "bold" "Name"}}: {{ .PipelineRun.Name }} +{{decorate "bold" "Namespace"}}: {{ .PipelineRun.Namespace }} +{{- $pRefName := pipelineRefExists .PipelineRun.Spec }}{{- if ne $pRefName "" }} +{{decorate "bold" "Pipeline Ref"}}: {{ $pRefName }} +{{- end }} +{{- if ne .PipelineRun.Spec.TaskRunTemplate.ServiceAccountName "" }} +{{decorate "bold" "Service Account"}}: {{ .PipelineRun.Spec.TaskRunTemplate.ServiceAccountName }} +{{- end }} + +{{- $l := len .PipelineRun.Labels }}{{ if eq $l 0 }} +{{- else }} +{{decorate "bold" "Labels"}}: +{{- range $k, $v := .PipelineRun.Labels }} + {{ $k }}={{ $v }} +{{- end }} +{{- end }} +{{- $annotations := removeLastAppliedConfig .PipelineRun.Annotations -}} +{{- if $annotations }} +{{decorate "bold" "Annotations"}}: +{{- range $k, $v := $annotations }} + {{ $k }}={{ $v }} +{{- end }} +{{- end }} + +{{decorate "status" ""}}{{decorate "underline bold" "Status\n"}} +STARTED DURATION STATUS +{{ formatAge .PipelineRun.Status.StartTime .Time }} {{ formatDuration .PipelineRun.Status.StartTime .PipelineRun.Status.CompletionTime }} {{ formatCondition .PipelineRun.Status.Conditions }} +{{- $msg := hasFailed .PipelineRun .TaskrunList -}} +{{- if ne $msg "" }} + +{{decorate "message" ""}}{{decorate "underline bold" "Message\n"}} +{{ $msg }} +{{- end }} + + +{{- if .PipelineRun.Spec.Timeouts }} + +{{decorate "timeouts" ""}}{{decorate "underline bold" "Timeouts"}} +{{- $timeout := .PipelineRun.Spec.Timeouts.Pipeline -}} +{{- if $timeout }} + {{decorate "bold" "Pipeline"}}: {{ $timeout.Duration.String }} +{{- end }} +{{- $timeout := .PipelineRun.Spec.Timeouts.Tasks -}} +{{- if $timeout }} + {{decorate "bold" "Tasks"}}: {{ $timeout.Duration.String }} +{{- end }} +{{- $timeout := .PipelineRun.Spec.Timeouts.Finally -}} +{{- if $timeout }} + {{decorate "bold" "Finally"}}: {{ $timeout.Duration.String }} +{{- end }} +{{- end }} + +{{- if ne (len .PipelineRun.Spec.Params) 0 }} + +{{decorate "params" ""}}{{decorate "underline bold" "Params\n"}} + NAME VALUE +{{- range $i, $p := .PipelineRun.Spec.Params }} +{{- if eq $p.Value.Type "string" }} + {{decorate "bullet" $p.Name }} {{ $p.Value.StringVal }} +{{- else if eq $p.Value.Type "array" }} + {{decorate "bullet" $p.Name }} {{ $p.Value.ArrayVal }} +{{- else }} + {{decorate "bullet" $p.Name }} {{ $p.Value.ObjectVal }} +{{- end }} +{{- end }} +{{- end }} + +{{- if ne (len .PipelineRun.Status.Results) 0 }} + +{{decorate "results" ""}}{{decorate "underline bold" "Results\n"}} + NAME VALUE +{{- range $result := .PipelineRun.Status.Results }} +{{- if eq $result.Value.Type "string" }} + {{decorate "bullet" $result.Name }} {{ $result.Value.StringVal }} +{{- else }} + {{decorate "bullet" $result.Name }} {{ $result.Value.ArrayVal }} +{{- end }} +{{- end }} +{{- end }} + +{{- if ne (len .PipelineRun.Spec.Workspaces) 0 }} + +{{decorate "workspaces" ""}}{{decorate "underline bold" "Workspaces\n"}} + NAME SUB PATH WORKSPACE BINDING +{{- range $workspace := .PipelineRun.Spec.Workspaces }} +{{- if not $workspace.SubPath }} + {{ decorate "bullet" $workspace.Name }} {{ "---" }} {{ formatWorkspace $workspace }} +{{- else }} + {{ decorate "bullet" $workspace.Name }} {{ $workspace.SubPath }} {{ formatWorkspace $workspace }} +{{- end }} +{{- end }} +{{- end }} + +{{- if ne (len .TaskrunList) 0 }} + +{{decorate "taskruns" ""}}{{decorate "underline bold" "Taskruns\n"}} + NAME TASK NAME STARTED DURATION STATUS +{{- range $taskrun := .TaskrunList }}{{ if checkTRStatus $taskrun }} + {{decorate "bullet" $taskrun.TaskRunName }} {{ $taskrun.PipelineTaskName }} {{ formatAge $taskrun.Status.StartTime $.Time }} {{ formatDuration $taskrun.Status.StartTime $taskrun.Status.CompletionTime }} {{ formatCondition $taskrun.Status.Conditions }} +{{- end }} +{{- end }} +{{- end }} + +{{- if ne (len .PipelineRun.Status.SkippedTasks) 0 }} + +{{decorate "skippedtasks" ""}}{{decorate "underline bold" "Skipped Tasks\n"}} + NAME +{{- range $skippedTask := .PipelineRun.Status.SkippedTasks }} + {{decorate "bullet" $skippedTask.Name }} +{{- end }} +{{- end }} +` + +type TaskRunWithStatus struct { + TaskRunName string + PipelineTaskName string + Status *v1.TaskRunStatus +} + +type TaskRunWithStatusList []TaskRunWithStatus + +func (trs TaskRunWithStatusList) Len() int { return len(trs) } +func (trs TaskRunWithStatusList) Swap(i, j int) { trs[i], trs[j] = trs[j], trs[i] } +func (trs TaskRunWithStatusList) Less(i, j int) bool { + if trs[j].Status == nil || trs[j].Status.StartTime == nil { + return false + } + + if trs[i].Status == nil || trs[i].Status.StartTime == nil { + return true + } + + return trs[j].Status.StartTime.Before(trs[i].Status.StartTime) +} + +func PrintPipelineRunDescription(out io.Writer, c *cli.Clients, ns string, prName string, time clockwork.Clock) error { + pr, err := GetPipelineRun(pipelineRunGroupResource, c, prName, ns) + if err != nil { + return fmt.Errorf("failed to find pipelinerun %q", prName) + } + + var taskRunList TaskRunWithStatusList + for _, child := range pr.Status.ChildReferences { + if child.Kind == "TaskRun" { + var tr *v1.TaskRun + err = actions.GetV1(taskrunGroupResource, c, child.Name, ns, metav1.GetOptions{}, &tr) + if err != nil { + return fmt.Errorf("failed to find get taskruns of the pipelineruns") + } + taskRunList = append(taskRunList, TaskRunWithStatus{ + tr.Name, + child.PipelineTaskName, + &tr.Status, + }) + } + } + + if len(taskRunList) != 0 { + sort.Sort(taskRunList) + } + + var data = struct { + PipelineRun *v1.PipelineRun + Time clockwork.Clock + TaskrunList TaskRunWithStatusList + }{ + PipelineRun: pr, + Time: time, + TaskrunList: taskRunList, + } + + funcMap := template.FuncMap{ + "formatAge": formatted.Age, + "formatDuration": formatted.Duration, + "formatCondition": formatted.Condition, + "formatWorkspace": formatted.Workspace, + "hasFailed": hasFailed, + "pipelineRefExists": formatted.PipelineRefExists, + "decorate": formatted.DecorateAttr, + "checkTRStatus": checkTaskRunStatus, + "removeLastAppliedConfig": formatted.RemoveLastAppliedConfig, + } + + w := tabwriter.NewWriter(out, 0, 5, 3, ' ', tabwriter.TabIndent) + t := template.Must(template.New("Describe Pipelinerun").Funcs(funcMap).Parse(describeTemplate)) + + if err = t.Execute(w, data); err != nil { + return err + } + return w.Flush() +} + +func GetPipelineRun(gr schema.GroupVersionResource, c *cli.Clients, prName, ns string) (*v1.PipelineRun, error) { + var pipelinerun v1.PipelineRun + gvr, err := actions.GetGroupVersionResource(gr, c.Tekton.Discovery()) + if err != nil { + return nil, err + } + + if gvr.Version == "v1" { + err := actions.GetV1(pipelineRunGroupResource, c, prName, ns, metav1.GetOptions{}, &pipelinerun) + if err != nil { + return nil, err + } + return &pipelinerun, nil + } + + var pipelinerunV1beta1 v1beta1.PipelineRun + err = actions.GetV1(pipelineRunGroupResource, c, prName, ns, metav1.GetOptions{}, &pipelinerunV1beta1) + if err != nil { + return nil, err + } + + err = pipelinerunV1beta1.ConvertTo(context.Background(), &pipelinerun) + if err != nil { + return nil, err + } + return &pipelinerun, nil +} + +func hasFailed(pr *v1.PipelineRun, taskruns TaskRunWithStatusList) string { + if len(pr.Status.Conditions) == 0 { + return "" + } + + if pr.Status.Conditions[0].Status == corev1.ConditionFalse { + var trNames []string + for _, taskrun := range taskruns { + if taskrun.Status == nil { + continue + } + if len(taskrun.Status.Conditions) == 0 { + continue + } + if taskrun.Status.Conditions[0].Status == corev1.ConditionFalse { + trNames = append(trNames, taskrun.TaskRunName) + } + } + message := pr.Status.Conditions[0].Message + if len(trNames) != 0 { + sort.Strings(trNames) + message += fmt.Sprintf("\nTaskRun(s) cancelled: %s", strings.Join(trNames, ", ")) + } + return message + } + return "" +} + +func checkTaskRunStatus(taskRun TaskRunWithStatus) bool { + return taskRun.Status != nil +} diff --git a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/pipelinerun.go b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/pipelinerun.go index c2a52fab4c..3f08191a19 100644 --- a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/pipelinerun.go +++ b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/pipelinerun.go @@ -18,119 +18,54 @@ import ( "context" "encoding/json" "fmt" - "os" + "github.com/jonboulle/clockwork" "github.com/tektoncd/cli/pkg/actions" "github.com/tektoncd/cli/pkg/cli" "github.com/tektoncd/cli/pkg/formatted" prsort "github.com/tektoncd/cli/pkg/pipelinerun/sort" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - "github.com/tektoncd/pipeline/pkg/status" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/watch" ) -var prGroupResource = schema.GroupVersionResource{Group: "tekton.dev", Resource: "pipelineruns"} +var pipelineRunGroupResource = schema.GroupVersionResource{Group: "tekton.dev", Resource: "pipelineruns"} +var taskrunGroupResource = schema.GroupVersionResource{Group: "tekton.dev", Resource: "taskruns"} // GetAllPipelineRuns returns all pipelinesruns running in a namespace -func GetAllPipelineRuns(p cli.Params, opts metav1.ListOptions, limit int) ([]string, error) { - cs, err := p.Clients() - if err != nil { - return nil, err - } - - runs, err := List(cs, opts, p.Namespace()) - if err != nil { - return nil, err - } - - runslen := len(runs.Items) - if runslen > 1 { - prsort.SortByStartTime(runs.Items) +func GetAllPipelineRuns(gr schema.GroupVersionResource, opts metav1.ListOptions, c *cli.Clients, ns string, limit int, time clockwork.Clock) ([]string, error) { + var pipelineruns *v1.PipelineRunList + if err := actions.ListV1(gr, c, opts, ns, &pipelineruns); err != nil { + return nil, fmt.Errorf("failed to list PipelineRuns from namespace %s: %v", ns, err) } + runslen := len(pipelineruns.Items) if limit > runslen { limit = runslen } + if runslen > 1 { + prsort.SortByStartTime(pipelineruns.Items) + } ret := []string{} - for i, run := range runs.Items { + for i, run := range pipelineruns.Items { if i < limit { - ret = append(ret, run.ObjectMeta.Name+" started "+formatted.Age(run.Status.StartTime, p.Time())) + ret = append(ret, run.ObjectMeta.Name+" started "+formatted.Age(run.Status.StartTime, time)) } } return ret, nil } -func List(c *cli.Clients, opts metav1.ListOptions, ns string) (*v1beta1.PipelineRunList, error) { - unstructuredPR, err := actions.List(prGroupResource, c.Dynamic, c.Tekton.Discovery(), ns, opts) - if err != nil { - return nil, err - } - - var prList *v1beta1.PipelineRunList - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredPR.UnstructuredContent(), &prList); err != nil { - return nil, err - } - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to list pipelineruns from %s namespace \n", ns) - return nil, err - } - - var populatedPRs []v1beta1.PipelineRun - - for _, pr := range prList.Items { - updatedPR, err := populatePipelineRunTaskStatuses(c, ns, pr) - if err != nil { - return nil, err - } - populatedPRs = append(populatedPRs, *updatedPR) - } - - prList.Items = populatedPRs - - return prList, nil -} - -// It will fetch the resource in v1beta1 struct format -func Get(c *cli.Clients, prname string, opts metav1.GetOptions, ns string) (*v1beta1.PipelineRun, error) { - unstructuredPR, err := actions.Get(prGroupResource, c.Dynamic, c.Tekton.Discovery(), prname, ns, opts) - if err != nil { - return nil, err - } - - var pipelinerun *v1beta1.PipelineRun - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredPR.UnstructuredContent(), &pipelinerun); err != nil { - fmt.Fprintf(os.Stderr, "Failed to get pipelinerun from %s namespace \n", ns) - return nil, err - } - - populatedPR, err := populatePipelineRunTaskStatuses(c, ns, *pipelinerun) - if err != nil { - return nil, err - } - - return populatedPR, nil -} - -func Watch(c *cli.Clients, opts metav1.ListOptions, ns string) (watch.Interface, error) { - watch, err := actions.Watch(prGroupResource, c, ns, opts) - if err != nil { - return nil, err - } - return watch, nil -} - type patchStringValue struct { Op string `json:"op"` Path string `json:"path"` Value string `json:"value"` } -func Cancel(c *cli.Clients, prname string, opts metav1.PatchOptions, cancelStatus, ns string) (*v1beta1.PipelineRun, error) { +func Cancel(c *cli.Clients, prname string, opts metav1.PatchOptions, cancelStatus, ns string) (*v1.PipelineRun, error) { payload := []patchStringValue{{ Op: "replace", Path: "/spec/status", @@ -139,27 +74,60 @@ func Cancel(c *cli.Clients, prname string, opts metav1.PatchOptions, cancelStatu data, _ := json.Marshal(payload) prGroupResource := schema.GroupVersionResource{Group: "tekton.dev", Resource: "pipelineruns"} - unstructuredPR, err := actions.Patch(prGroupResource, c, prname, data, opts, ns) + var pipelinerun *v1.PipelineRun + err := actions.Patch(prGroupResource, c, prname, data, opts, ns, &pipelinerun) if err != nil { return nil, err } - var pipelinerun *v1beta1.PipelineRun - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredPR.UnstructuredContent(), &pipelinerun); err != nil { - return nil, err - } - return pipelinerun, nil } // It will create the resource based on the api available. func Create(c *cli.Clients, pr *v1beta1.PipelineRun, opts metav1.CreateOptions, ns string) (*v1beta1.PipelineRun, error) { + gvr, err := actions.GetGroupVersionResource(pipelineRunGroupResource, c.Tekton.Discovery()) + if err != nil { + return nil, err + } + + if gvr.Version == "v1" { + prv1 := v1.PipelineRun{} + err = pr.ConvertTo(context.Background(), &prv1) + if err != nil { + return nil, err + } + prv1.Kind = "PipelineRun" + prv1.APIVersion = "tekton.dev/v1" + + object, _ := runtime.DefaultUnstructuredConverter.ToUnstructured(&prv1) + unstructuredPR := &unstructured.Unstructured{ + Object: object, + } + newUnstructuredPR, err := actions.Create(pipelineRunGroupResource, c, unstructuredPR, ns, opts) + if err != nil { + return nil, err + } + var pipelinerun v1.PipelineRun + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(newUnstructuredPR.UnstructuredContent(), &pipelinerun); err != nil { + return nil, err + } + + pipelinerunv1beta1 := v1beta1.PipelineRun{} + err = pipelinerunv1beta1.ConvertFrom(context.Background(), &pipelinerun) + if err != nil { + return nil, err + } + pipelinerunv1beta1.Kind = "PipelineRun" + pipelinerunv1beta1.APIVersion = "tekton.dev/v1beta1" + return &pipelinerunv1beta1, nil + } + object, _ := runtime.DefaultUnstructuredConverter.ToUnstructured(pr) unstructuredPR := &unstructured.Unstructured{ Object: object, } - newUnstructuredPR, err := actions.Create(prGroupResource, c, unstructuredPR, ns, opts) + newUnstructuredPR, err := actions.Create(pipelineRunGroupResource, c, unstructuredPR, ns, opts) if err != nil { return nil, err } @@ -171,15 +139,3 @@ func Create(c *cli.Clients, pr *v1beta1.PipelineRun, opts metav1.CreateOptions, return pipelinerun, nil } - -func populatePipelineRunTaskStatuses(c *cli.Clients, ns string, pr v1beta1.PipelineRun) (*v1beta1.PipelineRun, error) { - taskRunMap, runMap, err := status.GetFullPipelineTaskStatuses(context.Background(), c.Tekton, ns, &pr) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to get TaskRun and Run statuses for PipelineRun %s from namespace %s\n", pr.Name, ns) - return nil, err - } - pr.Status.TaskRuns = taskRunMap - pr.Status.Runs = runMap - - return &pr, nil -} diff --git a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_namespace.go b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_namespace.go index 1c1ccb8048..3b36d30c17 100644 --- a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_namespace.go +++ b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_namespace.go @@ -17,14 +17,14 @@ package pipelinerun import ( "sort" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" ) -func SortByNamespace(prs []v1beta1.PipelineRun) { +func SortByNamespace(prs []v1.PipelineRun) { sort.Sort(byNamespace(prs)) } -type byNamespace []v1beta1.PipelineRun +type byNamespace []v1.PipelineRun func (prs byNamespace) compareNamespace(ins, jns string) (lt, eq bool) { lt, eq = ins < jns, ins == jns diff --git a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_start_time.go b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_start_time.go index ce34a92d0d..4aba2f0aad 100644 --- a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_start_time.go +++ b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/sort/by_start_time.go @@ -17,14 +17,14 @@ package pipelinerun import ( "sort" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" ) -func SortByStartTime(prs []v1beta1.PipelineRun) { +func SortByStartTime(prs []v1.PipelineRun) { sort.Sort(byStartTime(prs)) } -type byStartTime []v1beta1.PipelineRun +type byStartTime []v1.PipelineRun func (prs byStartTime) Len() int { return len(prs) } func (prs byStartTime) Swap(i, j int) { prs[i], prs[j] = prs[j], prs[i] } diff --git a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/tracker.go b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/tracker.go index 734d18df9b..075ae4afa9 100644 --- a/vendor/github.com/tektoncd/cli/pkg/pipelinerun/tracker.go +++ b/vendor/github.com/tektoncd/cli/pkg/pipelinerun/tracker.go @@ -16,18 +16,18 @@ package pipelinerun import ( "context" + "sync" "time" "github.com/tektoncd/cli/pkg/actions" - trh "github.com/tektoncd/cli/pkg/taskrun" + "github.com/tektoncd/cli/pkg/cli" + taskrunpkg "github.com/tektoncd/cli/pkg/taskrun" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - "github.com/tektoncd/pipeline/pkg/client/clientset/versioned" informers "github.com/tektoncd/pipeline/pkg/client/informers/externalversions" - "github.com/tektoncd/pipeline/pkg/status" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/tools/cache" ) @@ -35,16 +35,16 @@ import ( type Tracker struct { Name string Ns string - Tekton versioned.Interface + Client *cli.Clients ongoingTasks map[string]bool } // NewTracker returns a new instance of Tracker -func NewTracker(name string, ns string, tekton versioned.Interface) *Tracker { +func NewTracker(name string, ns string, client *cli.Clients) *Tracker { return &Tracker{ Name: name, Ns: ns, - Tekton: tekton, + Client: client, ongoingTasks: map[string]bool{}, } } @@ -53,46 +53,51 @@ func NewTracker(name string, ns string, tekton versioned.Interface) *Tracker { // an event upon starting of a new Pipeline's Task. // allowed containers the name of the Pipeline tasks, which used as filter // limit the events to only those tasks -func (t *Tracker) Monitor(allowed []string) <-chan []trh.Run { +func (t *Tracker) Monitor(allowed []string) <-chan []taskrunpkg.Run { factory := informers.NewSharedInformerFactoryWithOptions( - t.Tekton, + t.Client.Tekton, time.Second*10, informers.WithNamespace(t.Ns), informers.WithTweakListOptions(pipelinerunOpts(t.Name))) gvr, _ := actions.GetGroupVersionResource( - schema.GroupVersionResource{Group: "tekton.dev", Resource: "pipelineruns"}, - t.Tekton.Discovery(), + pipelineRunGroupResource, + t.Client.Tekton.Discovery(), ) genericInformer, _ := factory.ForResource(*gvr) informer := genericInformer.Informer() - + mu := &sync.Mutex{} stopC := make(chan struct{}) - trC := make(chan []trh.Run) - + trC := make(chan []taskrunpkg.Run) go func() { <-stopC close(trC) }() eventHandler := func(obj interface{}) { - var pipelinerunConverted v1beta1.PipelineRun - pr, ok := obj.(*v1beta1.PipelineRun) + var pipelinerunConverted v1.PipelineRun + pr, ok := obj.(*v1.PipelineRun) if !ok || pr == nil { - return + prV1beta1, ok := obj.(*v1beta1.PipelineRun) + if !ok || prV1beta1 == nil { + return + } + var prv1 v1.PipelineRun + err := prV1beta1.ConvertTo(context.Background(), &prv1) + if err != nil { + return + } + pr = &prv1 } - trMap, runMap, err := status.GetFullPipelineTaskStatuses(context.Background(), t.Tekton, t.Ns, pr) + trsMap, err := GetTaskRunsWithStatus(pr, t.Client, t.Ns) if err != nil { return } pr.DeepCopyInto(&pipelinerunConverted) - pipelinerunConverted.Status.TaskRuns = trMap - pipelinerunConverted.Status.Runs = runMap - - trC <- t.findNewTaskruns(&pipelinerunConverted, allowed) + trC <- t.findNewTaskruns(&pipelinerunConverted, allowed, trsMap) if hasCompleted(&pipelinerunConverted) { close(stopC) // should close trC @@ -101,8 +106,38 @@ func (t *Tracker) Monitor(allowed []string) <-chan []trh.Run { informer.AddEventHandler( cache.ResourceEventHandlerFuncs{ - AddFunc: eventHandler, - UpdateFunc: func(_, newObj interface{}) { eventHandler(newObj) }, + AddFunc: func(obj interface{}) { + // To ensure synchonization and checks is the stopC channel has received a signal to stop + // If it receives a signal then return and does nothing + mu.Lock() + defer mu.Unlock() + select { + case <-stopC: + return + default: + eventHandler(obj) + } + }, + UpdateFunc: func(_, newObj interface{}) { + mu.Lock() + defer mu.Unlock() + select { + case <-stopC: + return + default: + eventHandler(newObj) + } + }, + DeleteFunc: func(obj interface{}) { + mu.Lock() + defer mu.Unlock() + select { + case <-stopC: + return + default: + eventHandler(obj) + } + }, }, ) @@ -122,9 +157,9 @@ func pipelinerunOpts(name string) func(opts *metav1.ListOptions) { // handles changes to pipelinerun and pushes the Run information to the // channel if the task is new and is in the allowed list of tasks // returns true if the pipelinerun has finished -func (t *Tracker) findNewTaskruns(pr *v1beta1.PipelineRun, allowed []string) []trh.Run { - ret := []trh.Run{} - for tr, trs := range pr.Status.TaskRuns { +func (t *Tracker) findNewTaskruns(pr *v1.PipelineRun, allowed []string, trStatuses map[string]*v1.PipelineRunTaskRunStatus) []taskrunpkg.Run { + ret := []taskrunpkg.Run{} + for tr, trs := range trStatuses { retries := 0 if pr.Status.PipelineSpec != nil { for _, pipelineTask := range pr.Status.PipelineSpec.Tasks { @@ -133,11 +168,11 @@ func (t *Tracker) findNewTaskruns(pr *v1beta1.PipelineRun, allowed []string) []t } } } - run := trh.Run{Name: tr, Task: trs.PipelineTaskName, Retries: retries} + run := taskrunpkg.Run{Name: tr, Task: trs.PipelineTaskName, Retries: retries} if t.loggingInProgress(tr) || - !trh.HasScheduled(trs) || - trh.IsFiltered(run, allowed) { + !taskrunpkg.HasScheduled(trs) || + taskrunpkg.IsFiltered(run, allowed) { continue } @@ -148,11 +183,10 @@ func (t *Tracker) findNewTaskruns(pr *v1beta1.PipelineRun, allowed []string) []t return ret } -func hasCompleted(pr *v1beta1.PipelineRun) bool { +func hasCompleted(pr *v1.PipelineRun) bool { if len(pr.Status.Conditions) == 0 { return false } - return pr.Status.Conditions[0].Status != corev1.ConditionUnknown } @@ -160,3 +194,34 @@ func (t *Tracker) loggingInProgress(tr string) bool { _, ok := t.ongoingTasks[tr] return ok } + +func GetTaskRunsWithStatus(pr *v1.PipelineRun, c *cli.Clients, ns string) (map[string]*v1.PipelineRunTaskRunStatus, error) { + // If the PipelineRun is nil, just return + if pr == nil { + return nil, nil + } + + // If there are no child references return the existing TaskRuns and Runs maps + if len(pr.Status.ChildReferences) == 0 { + return map[string]*v1.PipelineRunTaskRunStatus{}, nil + } + + trStatuses := make(map[string]*v1.PipelineRunTaskRunStatus) + for _, cr := range pr.Status.ChildReferences { + //TODO: Needs to handle Run, CustomRun later + if cr.Kind == "TaskRun" { + tr, err := taskrunpkg.GetTaskRun(taskrunGroupResource, c, cr.Name, ns) + if err != nil { + return nil, err + } + + trStatuses[cr.Name] = &v1.PipelineRunTaskRunStatus{ + PipelineTaskName: cr.PipelineTaskName, + Status: &tr.Status, + } + + } + } + + return trStatuses, nil +} diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/create.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/create.go index 7ae6aff3fb..467f43ba0a 100644 --- a/vendor/github.com/tektoncd/cli/pkg/taskrun/create.go +++ b/vendor/github.com/tektoncd/cli/pkg/taskrun/create.go @@ -15,8 +15,11 @@ package taskrun import ( + "context" + "github.com/tektoncd/cli/pkg/actions" "github.com/tektoncd/cli/pkg/cli" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -24,11 +27,48 @@ import ( ) func Create(c *cli.Clients, tr *v1beta1.TaskRun, opts metav1.CreateOptions, ns string) (*v1beta1.TaskRun, error) { + gvr, err := actions.GetGroupVersionResource(taskrunGroupResource, c.Tekton.Discovery()) + if err != nil { + return nil, err + } + + if gvr.Version == "v1" { + trv1 := v1.TaskRun{} + err = tr.ConvertTo(context.Background(), &trv1) + if err != nil { + return nil, err + } + trv1.Kind = "TaskRun" + trv1.APIVersion = "tekton.dev/v1" + + object, _ := runtime.DefaultUnstructuredConverter.ToUnstructured(&trv1) + unstructuredTR := &unstructured.Unstructured{ + Object: object, + } + newUnstructuredTR, err := actions.Create(taskrunGroupResource, c, unstructuredTR, ns, opts) + if err != nil { + return nil, err + } + var taskrun v1.TaskRun + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(newUnstructuredTR.UnstructuredContent(), &taskrun); err != nil { + return nil, err + } + + taskrunv1beta1 := v1beta1.TaskRun{} + err = taskrunv1beta1.ConvertFrom(context.Background(), &taskrun) + if err != nil { + return nil, err + } + taskrunv1beta1.Kind = "TaskRun" + taskrunv1beta1.APIVersion = "tekton.dev/v1beta1" + return &taskrunv1beta1, nil + } + object, _ := runtime.DefaultUnstructuredConverter.ToUnstructured(tr) unstructuredTR := &unstructured.Unstructured{ Object: object, } - newUnstructuredTR, err := actions.Create(trGroupResource, c, unstructuredTR, ns, opts) + newUnstructuredTR, err := actions.Create(taskrunGroupResource, c, unstructuredTR, ns, opts) if err != nil { return nil, err } diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/description.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/description.go new file mode 100644 index 0000000000..ebf7cd6f2e --- /dev/null +++ b/vendor/github.com/tektoncd/cli/pkg/taskrun/description.go @@ -0,0 +1,303 @@ +// Copyright © 2020 The Tekton 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 taskrun + +import ( + "context" + "fmt" + "io" + "sort" + "text/tabwriter" + "text/template" + + "github.com/jonboulle/clockwork" + "github.com/tektoncd/cli/pkg/actions" + "github.com/tektoncd/cli/pkg/cli" + "github.com/tektoncd/cli/pkg/formatted" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +const templ = `{{decorate "bold" "Name"}}: {{ .TaskRun.Name }} +{{decorate "bold" "Namespace"}}: {{ .TaskRun.Namespace }} +{{- $tRefName := taskRefExists .TaskRun.Spec }}{{- if ne $tRefName "" }} +{{decorate "bold" "Task Ref"}}: {{ $tRefName }} +{{- end }} +{{- if ne .TaskRun.Spec.ServiceAccountName "" }} +{{decorate "bold" "Service Account"}}: {{ .TaskRun.Spec.ServiceAccountName }} +{{- end }} + +{{- $timeout := getTimeout .TaskRun -}} +{{- if and (ne $timeout "") (ne $timeout "0s") }} +{{decorate "bold" "Timeout"}}: {{ .TaskRun.Spec.Timeout.Duration.String }} +{{- end }} +{{- $l := len .TaskRun.Labels }}{{ if eq $l 0 }} +{{- else }} +{{decorate "bold" "Labels"}}: +{{- range $k, $v := .TaskRun.Labels }} + {{ $k }}={{ $v }} +{{- end }} +{{- end }} +{{- $annotations := removeLastAppliedConfig .TaskRun.Annotations -}} +{{- if $annotations }} +{{decorate "bold" "Annotations"}}: +{{- range $k, $v := $annotations }} + {{ $k }}={{ $v }} +{{- end }} +{{- end }} + +{{decorate "status" ""}}{{decorate "underline bold" "Status"}} + +STARTED DURATION STATUS +{{ formatAge .TaskRun.Status.StartTime .Time }} {{ formatDuration .TaskRun.Status.StartTime .TaskRun.Status.CompletionTime }} {{ formatCondition .TaskRun.Status.Conditions }} +{{- $msg := hasFailed .TaskRun -}} +{{- if ne $msg "" }} + +{{decorate "underline bold" "Message"}} + +{{ $msg }} +{{- end }} + +{{- if ne (len .TaskRun.Spec.Params) 0 }} + +{{decorate "params" ""}}{{decorate "underline bold" "Params"}} + + NAME VALUE +{{- range $i, $p := .TaskRun.Spec.Params }} +{{- if eq $p.Value.Type "string" }} + {{decorate "bullet" $p.Name }} {{ $p.Value.StringVal }} +{{- else if eq $p.Value.Type "array" }} + {{decorate "bullet" $p.Name }} {{ $p.Value.ArrayVal }} +{{- else }} + {{decorate "bullet" $p.Name }} {{ $p.Value.ObjectVal }} +{{- end }} +{{- end }} +{{- end }} + +{{- if ne (len .TaskRun.Status.Results) 0 }} + +{{decorate "results" ""}}{{decorate "underline bold" "Results"}} + + NAME VALUE +{{- range $result := .TaskRun.Status.Results }} + {{decorate "bullet" $result.Name }} {{ formatResult $result.Value }} +{{- end }} +{{- end }} + +{{- if ne (len .TaskRun.Spec.Workspaces) 0 }} + +{{decorate "workspaces" ""}}{{decorate "underline bold" "Workspaces"}} + + NAME SUB PATH WORKSPACE BINDING +{{- range $workspace := .TaskRun.Spec.Workspaces }} +{{- if not $workspace.SubPath }} + {{ decorate "bullet" $workspace.Name }} {{ "---" }} {{ formatWorkspace $workspace }} +{{- else }} + {{ decorate "bullet" $workspace.Name }} {{ $workspace.SubPath }} {{ formatWorkspace $workspace }} +{{- end }} +{{- end }} +{{- end }} + +{{- $sortedSteps := sortStepStates .TaskRun.Status.Steps }} +{{- if ne (len $sortedSteps) 0 }} + +{{decorate "steps" ""}}{{decorate "underline bold" "Steps"}} + + NAME STATUS +{{- range $step := $sortedSteps }} +{{- $reason := stepReasonExists $step }} + {{decorate "bullet" $step.Name }} {{ $reason }} +{{- end }} +{{- end }} + +{{- $sidecars := .TaskRun.Status.Sidecars }} +{{- if ne (len $sidecars) 0 }} + +{{decorate "sidecars" ""}}{{decorate "underline bold" "Sidecars"}} + + NAME STATUS +{{- range $sidecar := $sidecars }} +{{- $reason := sidecarReasonExists $sidecar }} + {{decorate "bullet" $sidecar.Name }} {{ $reason }} +{{- end }} +{{- end }} +` + +func sortStepStatesByStartTime(steps []v1.StepState) []v1.StepState { + sort.Slice(steps, func(i, j int) bool { + if steps[j].Waiting != nil && steps[i].Waiting != nil { + return false + } + + var jStartTime metav1.Time + jRunning := false + var iStartTime metav1.Time + iRunning := false + if steps[j].Terminated == nil { + if steps[j].Running != nil { + jStartTime = steps[j].Running.StartedAt + jRunning = true + } else { + return true + } + } + + if steps[i].Terminated == nil { + if steps[i].Running != nil { + iStartTime = steps[i].Running.StartedAt + iRunning = true + } else { + return false + } + } + + if !jRunning { + jStartTime = steps[j].Terminated.StartedAt + } + + if !iRunning { + iStartTime = steps[i].Terminated.StartedAt + } + + return iStartTime.Before(&jStartTime) + }) + + return steps +} + +func PrintTaskRunDescription(out io.Writer, c *cli.Clients, ns string, trName string, time clockwork.Clock) error { + tr, err := GetTaskRun(taskrunGroupResource, c, trName, ns) + if err != nil { + return fmt.Errorf("failed to get TaskRun %s: %v", trName, err) + } + + var data = struct { + TaskRun *v1.TaskRun + Time clockwork.Clock + }{ + TaskRun: tr, + Time: time, + } + + funcMap := template.FuncMap{ + "formatAge": formatted.Age, + "formatDuration": formatted.Duration, + "formatCondition": formatted.Condition, + "formatResult": formatted.Result, + "formatWorkspace": formatted.Workspace, + "hasFailed": hasFailed, + "taskRefExists": formatted.TaskRefExists, + "stepReasonExists": stepReasonExists, + "sidecarReasonExists": sidecarReasonExists, + "decorate": formatted.DecorateAttr, + "sortStepStates": sortStepStatesByStartTime, + "getTimeout": getTimeoutValue, + "removeLastAppliedConfig": formatted.RemoveLastAppliedConfig, + } + + w := tabwriter.NewWriter(out, 0, 5, 3, ' ', tabwriter.TabIndent) + t := template.Must(template.New("Describe TaskRun").Funcs(funcMap).Parse(templ)) + + err = t.Execute(w, data) + if err != nil { + return err + } + return w.Flush() +} + +func hasFailed(tr *v1.TaskRun) string { + if len(tr.Status.Conditions) == 0 { + return "" + } + + if tr.Status.Conditions[0].Status == corev1.ConditionFalse { + return tr.Status.Conditions[0].Message + } + + return "" +} + +func getTimeoutValue(tr *v1.TaskRun) string { + if tr.Spec.Timeout != nil { + return tr.Spec.Timeout.Duration.String() + } + return "" +} + +// Check if step is in waiting, running, or terminated state by checking StepState of the step. +func stepReasonExists(state v1.StepState) string { + if state.Waiting == nil { + if state.Running != nil { + return formatted.ColorStatus("Running") + } + + if state.Terminated != nil { + return formatted.ColorStatus(state.Terminated.Reason) + } + + return formatted.ColorStatus("---") + } + + return formatted.ColorStatus(state.Waiting.Reason) +} + +// Check if sidecar is in waiting, running, or terminated state by checking SidecarState of the sidecar. +func sidecarReasonExists(state v1.SidecarState) string { + if state.Waiting == nil { + + if state.Running != nil { + return formatted.ColorStatus("Running") + } + + if state.Terminated != nil { + return formatted.ColorStatus(state.Terminated.Reason) + } + + return formatted.ColorStatus("---") + } + + return formatted.ColorStatus(state.Waiting.Reason) +} + +func GetTaskRun(gr schema.GroupVersionResource, c *cli.Clients, trName, ns string) (*v1.TaskRun, error) { + var taskrun v1.TaskRun + gvr, err := actions.GetGroupVersionResource(gr, c.Tekton.Discovery()) + if err != nil { + return nil, err + } + + if gvr.Version == "v1" { + err := actions.GetV1(gr, c, trName, ns, metav1.GetOptions{}, &taskrun) + if err != nil { + return nil, err + } + return &taskrun, nil + } + + var taskrunV1beta1 v1beta1.TaskRun + err = actions.GetV1(gr, c, trName, ns, metav1.GetOptions{}, &taskrunV1beta1) + if err != nil { + return nil, err + } + + err = taskrunV1beta1.ConvertTo(context.Background(), &taskrun) + if err != nil { + return nil, err + } + return &taskrun, nil +} diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/get.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/get.go deleted file mode 100644 index 209399433f..0000000000 --- a/vendor/github.com/tektoncd/cli/pkg/taskrun/get.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2019-2020 The Tekton 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 taskrun - -import ( - "fmt" - - "github.com/tektoncd/cli/pkg/actions" - "github.com/tektoncd/cli/pkg/cli" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -// Get will fetch the taskrun resource based on the taskrun name -func Get(c *cli.Clients, trname string, opts metav1.GetOptions, ns string) (*v1beta1.TaskRun, error) { - unstructuredTR, err := actions.Get(trGroupResource, c.Dynamic, c.Tekton.Discovery(), trname, ns, opts) - if err != nil { - return nil, err - } - - var taskrun *v1beta1.TaskRun - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredTR.UnstructuredContent(), &taskrun); err != nil { - return nil, fmt.Errorf("failed to get TaskRun from namespace %s", ns) - } - return taskrun, nil -} diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/list.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/list.go new file mode 100644 index 0000000000..3838792415 --- /dev/null +++ b/vendor/github.com/tektoncd/cli/pkg/taskrun/list.go @@ -0,0 +1,51 @@ +// Copyright © 2019 The Tekton 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 taskrun + +import ( + "fmt" + + "github.com/jonboulle/clockwork" + "github.com/tektoncd/cli/pkg/actions" + "github.com/tektoncd/cli/pkg/cli" + "github.com/tektoncd/cli/pkg/formatted" + trsort "github.com/tektoncd/cli/pkg/taskrun/sort" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +var taskrunGroupResource = schema.GroupVersionResource{Group: "tekton.dev", Resource: "taskruns"} + +func GetAllTaskRuns(gr schema.GroupVersionResource, opts metav1.ListOptions, c *cli.Clients, ns string, limit int, time clockwork.Clock) ([]string, error) { + var taskruns *v1.TaskRunList + if err := actions.ListV1(gr, c, opts, ns, &taskruns); err != nil { + return nil, fmt.Errorf("failed to list TaskRuns from namespace %s: %v", ns, err) + } + + runslen := len(taskruns.Items) + if limit > runslen { + limit = runslen + } + + trsort.SortByStartTime(taskruns.Items) + ret := []string{} + for i, run := range taskruns.Items { + if i < limit { + ret = append(ret, run.ObjectMeta.Name+" started "+formatted.Age(run.Status.StartTime, time)) + } + } + return ret, nil +} diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/patch.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/patch.go deleted file mode 100644 index 932a9ac213..0000000000 --- a/vendor/github.com/tektoncd/cli/pkg/taskrun/patch.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2019-2020 The Tekton 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 taskrun - -import ( - "encoding/json" - - "github.com/tektoncd/cli/pkg/actions" - "github.com/tektoncd/cli/pkg/cli" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -type patchStringValue struct { - Op string `json:"op"` - Path string `json:"path"` - Value string `json:"value"` -} - -func Patch(c *cli.Clients, trname string, opts metav1.PatchOptions, ns string) (*v1beta1.TaskRun, error) { - payload := []patchStringValue{{ - Op: "replace", - Path: "/spec/status", - Value: v1beta1.TaskRunSpecStatusCancelled, - }} - - data, _ := json.Marshal(payload) - unstructuredTR, err := actions.Patch(trGroupResource, c, trname, data, opts, ns) - if err != nil { - return nil, err - } - - var taskrun *v1beta1.TaskRun - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredTR.UnstructuredContent(), &taskrun); err != nil { - return nil, err - } - - return taskrun, nil -} diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/sort/by_namespace.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/sort/by_namespace.go new file mode 100644 index 0000000000..ad5362b4c4 --- /dev/null +++ b/vendor/github.com/tektoncd/cli/pkg/taskrun/sort/by_namespace.go @@ -0,0 +1,48 @@ +// Copyright © 2020 The Tekton 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 taskrun + +import ( + "sort" + + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" +) + +func SortByNamespace(trs []v1.TaskRun) { + sort.Sort(byNamespace(trs)) +} + +type byNamespace []v1.TaskRun + +func (trs byNamespace) compareNamespace(ins, jns string) (lt, eq bool) { + lt, eq = ins < jns, ins == jns + return lt, eq +} + +func (trs byNamespace) Len() int { return len(trs) } +func (trs byNamespace) Swap(i, j int) { trs[i], trs[j] = trs[j], trs[i] } +func (trs byNamespace) Less(i, j int) bool { + var lt, eq bool + if lt, eq = trs.compareNamespace(trs[i].Namespace, trs[j].Namespace); eq { + if trs[j].Status.StartTime == nil { + return false + } + if trs[i].Status.StartTime == nil { + return true + } + return trs[j].Status.StartTime.Before(trs[i].Status.StartTime) + } + return lt +} diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/sort/by_start_time.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/sort/by_start_time.go new file mode 100644 index 0000000000..bfdf2da915 --- /dev/null +++ b/vendor/github.com/tektoncd/cli/pkg/taskrun/sort/by_start_time.go @@ -0,0 +1,39 @@ +// Copyright © 2020 The Tekton 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 taskrun + +import ( + "sort" + + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" +) + +func SortByStartTime(trs []v1.TaskRun) { + sort.Sort(byStartTime(trs)) +} + +type byStartTime []v1.TaskRun + +func (trs byStartTime) Len() int { return len(trs) } +func (trs byStartTime) Swap(i, j int) { trs[i], trs[j] = trs[j], trs[i] } +func (trs byStartTime) Less(i, j int) bool { + if trs[j].Status.StartTime == nil { + return false + } + if trs[i].Status.StartTime == nil { + return true + } + return trs[j].Status.StartTime.Before(trs[i].Status.StartTime) +} diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/taskrun.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/taskrun.go index ee2eb9c307..18d4ad42dd 100644 --- a/vendor/github.com/tektoncd/cli/pkg/taskrun/taskrun.go +++ b/vendor/github.com/tektoncd/cli/pkg/taskrun/taskrun.go @@ -17,13 +17,10 @@ package taskrun import ( "sort" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" ) -var trGroupResource = schema.GroupVersionResource{Group: "tekton.dev", Resource: "taskruns"} - type Run struct { Name string Task string @@ -54,7 +51,7 @@ func IsFiltered(tr Run, allowed []string) bool { return len(Filter(trs, allowed)) == 0 } -func HasScheduled(trs *v1beta1.PipelineRunTaskRunStatus) bool { +func HasScheduled(trs *v1.PipelineRunTaskRunStatus) bool { if trs.Status != nil { return trs.Status.PodName != "" } @@ -81,9 +78,7 @@ func Filter(trs []Run, ts []string) []Run { return filtered } -type taskRunMap map[string]*v1beta1.PipelineRunTaskRunStatus - -func SortTasksBySpecOrder(pipelineTasks []v1beta1.PipelineTask, pipelinesTaskRuns taskRunMap) []Run { +func SortTasksBySpecOrder(pipelineTasks []v1.PipelineTask, pipelinesTaskRuns map[string]*v1.PipelineRunTaskRunStatus) []Run { trNames := map[string]string{} for name, t := range pipelinesTaskRuns { diff --git a/vendor/github.com/tektoncd/cli/pkg/taskrun/watch.go b/vendor/github.com/tektoncd/cli/pkg/taskrun/watch.go deleted file mode 100644 index d9ac0cec9b..0000000000 --- a/vendor/github.com/tektoncd/cli/pkg/taskrun/watch.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright © 2022 The Tekton 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 taskrun - -import ( - "github.com/tektoncd/cli/pkg/actions" - "github.com/tektoncd/cli/pkg/cli" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/watch" -) - -func Watch(c *cli.Clients, opts metav1.ListOptions, ns string) (watch.Interface, error) { - watch, err := actions.Watch(trGroupResource, c, ns, opts) - if err != nil { - return nil, err - } - - return watch, nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/artifact_bucket.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/artifact_bucket.go deleted file mode 100644 index abdfc6e7d8..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/artifact_bucket.go +++ /dev/null @@ -1,112 +0,0 @@ -/* -Copyright 2019 The Tekton 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 config - -import ( - "os" - - corev1 "k8s.io/api/core/v1" -) - -const ( - // BucketLocationKey is the name of the configmap entry that specifies - // loction of the bucket. - BucketLocationKey = "location" - - // BucketServiceAccountSecretNameKey is the name of the configmap entry that specifies - // the name of the secret that will provide the servie account with bucket access. - // This secret must have a key called serviceaccount that will have a value with - // the service account with access to the bucket - BucketServiceAccountSecretNameKey = "bucket.service.account.secret.name" - - // BucketServiceAccountSecretKeyKey is the name of the configmap entry that specifies - // the secret key that will have a value with the service account json with access - // to the bucket - BucketServiceAccountSecretKeyKey = "bucket.service.account.secret.key" - - // DefaultBucketServiceFieldName defaults to a gcs bucket - DefaultBucketServiceFieldName = "GOOGLE_APPLICATION_CREDENTIALS" - - // BucketServiceAccountFieldNameKey is the name of the configmap entry that specifies - // the field name that should be used for the service account. - // Valid values: GOOGLE_APPLICATION_CREDENTIALS, BOTO_CONFIG. - BucketServiceAccountFieldNameKey = "bucket.service.account.field.name" -) - -// ArtifactBucket holds the configurations for the artifacts PVC -// +k8s:deepcopy-gen=true -type ArtifactBucket struct { - Location string - ServiceAccountSecretName string - ServiceAccountSecretKey string - ServiceAccountFieldName string -} - -// GetArtifactBucketConfigName returns the name of the configmap containing all -// customizations for the storage bucket. -func GetArtifactBucketConfigName() string { - if e := os.Getenv("CONFIG_ARTIFACT_BUCKET_NAME"); e != "" { - return e - } - return "config-artifact-bucket" -} - -// Equals returns true if two Configs are identical -func (cfg *ArtifactBucket) Equals(other *ArtifactBucket) bool { - if cfg == nil && other == nil { - return true - } - - if cfg == nil || other == nil { - return false - } - - return other.Location == cfg.Location && - other.ServiceAccountSecretName == cfg.ServiceAccountSecretName && - other.ServiceAccountSecretKey == cfg.ServiceAccountSecretKey && - other.ServiceAccountFieldName == cfg.ServiceAccountFieldName -} - -// NewArtifactBucketFromMap returns a Config given a map corresponding to a ConfigMap -func NewArtifactBucketFromMap(cfgMap map[string]string) (*ArtifactBucket, error) { - tc := ArtifactBucket{ - ServiceAccountFieldName: DefaultBucketServiceFieldName, - } - - if location, ok := cfgMap[BucketLocationKey]; ok { - tc.Location = location - } - - if serviceAccountSecretName, ok := cfgMap[BucketServiceAccountSecretNameKey]; ok { - tc.ServiceAccountSecretName = serviceAccountSecretName - } - - if serviceAccountSecretKey, ok := cfgMap[BucketServiceAccountSecretKeyKey]; ok { - tc.ServiceAccountSecretKey = serviceAccountSecretKey - } - - if serviceAccountFieldName, ok := cfgMap[BucketServiceAccountFieldNameKey]; ok { - tc.ServiceAccountFieldName = serviceAccountFieldName - } - - return &tc, nil -} - -// NewArtifactBucketFromConfigMap returns a Config for the given configmap -func NewArtifactBucketFromConfigMap(config *corev1.ConfigMap) (*ArtifactBucket, error) { - return NewArtifactBucketFromMap(config.Data) -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/artifact_pvc.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/artifact_pvc.go deleted file mode 100644 index 5434353d39..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/artifact_pvc.go +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2019 The Tekton 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 config - -import ( - "os" - - corev1 "k8s.io/api/core/v1" -) - -const ( - // DefaultPVCSize is the default size of the PVC to create - DefaultPVCSize = "5Gi" - - // PVCSizeKey is the name of the configmap entry that specifies the size of the PVC to create - PVCSizeKey = "size" - - // PVCStorageClassNameKey is the name of the configmap entry that specifies the storage class of the PVC to create - PVCStorageClassNameKey = "storageClassName" -) - -// ArtifactPVC holds the configurations for the artifacts PVC -// +k8s:deepcopy-gen=true -type ArtifactPVC struct { - Size string - StorageClassName string -} - -// GetArtifactPVCConfigName returns the name of the configmap containing all -// customizations for the storage PVC. -func GetArtifactPVCConfigName() string { - if e := os.Getenv("CONFIG_ARTIFACT_PVC_NAME"); e != "" { - return e - } - return "config-artifact-pvc" -} - -// Equals returns true if two Configs are identical -func (cfg *ArtifactPVC) Equals(other *ArtifactPVC) bool { - if cfg == nil && other == nil { - return true - } - - if cfg == nil || other == nil { - return false - } - - return other.Size == cfg.Size && - other.StorageClassName == cfg.StorageClassName -} - -// NewArtifactPVCFromMap returns a Config given a map corresponding to a ConfigMap -func NewArtifactPVCFromMap(cfgMap map[string]string) (*ArtifactPVC, error) { - tc := ArtifactPVC{ - Size: DefaultPVCSize, - } - - if size, ok := cfgMap[PVCSizeKey]; ok { - tc.Size = size - } - - if storageClassName, ok := cfgMap[PVCStorageClassNameKey]; ok { - tc.StorageClassName = storageClassName - } - - return &tc, nil -} - -// NewArtifactPVCFromConfigMap returns a Config for the given configmap -func NewArtifactPVCFromConfigMap(config *corev1.ConfigMap) (*ArtifactPVC, error) { - return NewArtifactPVCFromMap(config.Data) -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/default.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/default.go index aa7656a1fb..968dae25e8 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/default.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/default.go @@ -20,11 +20,14 @@ import ( "fmt" "log" "os" + "reflect" "strconv" + "strings" "time" "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/yaml" ) @@ -41,6 +44,8 @@ const ( DefaultCloudEventSinkValue = "" // DefaultMaxMatrixCombinationsCount is used when no max matrix combinations count is specified. DefaultMaxMatrixCombinationsCount = 256 + // DefaultResolverTypeValue is used when no default resolver type is specified + DefaultResolverTypeValue = "" defaultTimeoutMinutesKey = "default-timeout-minutes" defaultServiceAccountKey = "default-service-account" @@ -50,6 +55,8 @@ const ( defaultCloudEventsSinkKey = "default-cloud-events-sink" defaultTaskRunWorkspaceBinding = "default-task-run-workspace-binding" defaultMaxMatrixCombinationsCountKey = "default-max-matrix-combinations-count" + defaultForbiddenEnv = "default-forbidden-env" + defaultResolverTypeKey = "default-resolver-type" ) // Defaults holds the default configurations @@ -63,6 +70,8 @@ type Defaults struct { DefaultCloudEventsSink string DefaultTaskRunWorkspaceBinding string DefaultMaxMatrixCombinationsCount int + DefaultForbiddenEnv []string + DefaultResolverType string } // GetDefaultsConfigName returns the name of the configmap containing all @@ -91,7 +100,9 @@ func (cfg *Defaults) Equals(other *Defaults) bool { other.DefaultAAPodTemplate.Equals(cfg.DefaultAAPodTemplate) && other.DefaultCloudEventsSink == cfg.DefaultCloudEventsSink && other.DefaultTaskRunWorkspaceBinding == cfg.DefaultTaskRunWorkspaceBinding && - other.DefaultMaxMatrixCombinationsCount == cfg.DefaultMaxMatrixCombinationsCount + other.DefaultMaxMatrixCombinationsCount == cfg.DefaultMaxMatrixCombinationsCount && + other.DefaultResolverType == cfg.DefaultResolverType && + reflect.DeepEqual(other.DefaultForbiddenEnv, cfg.DefaultForbiddenEnv) } // NewDefaultsFromMap returns a Config given a map corresponding to a ConfigMap @@ -102,6 +113,7 @@ func NewDefaultsFromMap(cfgMap map[string]string) (*Defaults, error) { DefaultManagedByLabelValue: DefaultManagedByLabelValue, DefaultCloudEventsSink: DefaultCloudEventSinkValue, DefaultMaxMatrixCombinationsCount: DefaultMaxMatrixCombinationsCount, + DefaultResolverType: DefaultResolverTypeValue, } if defaultTimeoutMin, ok := cfgMap[defaultTimeoutMinutesKey]; ok { @@ -151,6 +163,18 @@ func NewDefaultsFromMap(cfgMap map[string]string) (*Defaults, error) { } tc.DefaultMaxMatrixCombinationsCount = int(matrixCombinationsCount) } + if defaultForbiddenEnvString, ok := cfgMap[defaultForbiddenEnv]; ok { + tmpString := sets.NewString() + fEnvs := strings.Split(defaultForbiddenEnvString, ",") + for _, fEnv := range fEnvs { + tmpString.Insert(strings.TrimSpace(fEnv)) + } + tc.DefaultForbiddenEnv = tmpString.List() + } + + if defaultResolverType, ok := cfgMap[defaultResolverTypeKey]; ok { + tc.DefaultResolverType = defaultResolverType + } return &tc, nil } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/feature_flags.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/feature_flags.go index c3e605662a..699a65516e 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/feature_flags.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/feature_flags.go @@ -33,23 +33,19 @@ const ( AlphaAPIFields = "alpha" // BetaAPIFields is the value used for "enable-api-fields" when beta APIs should be usable as well. BetaAPIFields = "beta" - // FullEmbeddedStatus is the value used for "embedded-status" when the full statuses of TaskRuns and Runs should be - // embedded in PipelineRunStatusFields, but ChildReferences should not be used. - FullEmbeddedStatus = "full" - // BothEmbeddedStatus is the value used for "embedded-status" when full embedded statuses of TaskRuns and Runs as - // well as ChildReferences should be used in PipelineRunStatusFields. - BothEmbeddedStatus = "both" - // MinimalEmbeddedStatus is the value used for "embedded-status" when only ChildReferences should be used in - // PipelineRunStatusFields. - MinimalEmbeddedStatus = "minimal" - // EnforceResourceVerificationMode is the value used for "resource-verification-mode" when verification is applied and fail the - // TaskRun or PipelineRun when verification fails - EnforceResourceVerificationMode = "enforce" - // WarnResourceVerificationMode is the value used for "resource-verification-mode" when verification is applied but only log - // the warning when verification fails - WarnResourceVerificationMode = "warn" - // SkipResourceVerificationMode is the value used for "resource-verification-mode" when verification is skipped - SkipResourceVerificationMode = "skip" + // FailNoMatchPolicy is the value used for "trusted-resources-verification-no-match-policy" to fail TaskRun or PipelineRun + // when no matching policies are found + FailNoMatchPolicy = "fail" + // WarnNoMatchPolicy is the value used for "trusted-resources-verification-no-match-policy" to log warning and skip verification + // when no matching policies are found + WarnNoMatchPolicy = "warn" + // IgnoreNoMatchPolicy is the value used for "trusted-resources-verification-no-match-policy" to skip verification + // when no matching policies are found + IgnoreNoMatchPolicy = "ignore" + // ResultExtractionMethodTerminationMessage is the value used for "results-from" as a way to extract results from tasks using kubernetes termination message. + ResultExtractionMethodTerminationMessage = "termination-message" + // ResultExtractionMethodSidecarLogs is the value used for "results-from" as a way to extract results from tasks using sidecar logs. + ResultExtractionMethodSidecarLogs = "sidecar-logs" // DefaultDisableAffinityAssistant is the default value for "disable-affinity-assistant". DefaultDisableAffinityAssistant = false // DefaultDisableCredsInit is the default value for "disable-creds-init". @@ -62,53 +58,64 @@ const ( DefaultRequireGitSSHSecretKnownHosts = false // DefaultEnableTektonOciBundles is the default value for "enable-tekton-oci-bundles". DefaultEnableTektonOciBundles = false - // DefaultEnableCustomTasks is the default value for "enable-custom-tasks". - DefaultEnableCustomTasks = false // DefaultEnableAPIFields is the default value for "enable-api-fields". DefaultEnableAPIFields = StableAPIFields // DefaultSendCloudEventsForRuns is the default value for "send-cloudevents-for-runs". DefaultSendCloudEventsForRuns = false - // DefaultEmbeddedStatus is the default value for "embedded-status". - DefaultEmbeddedStatus = FullEmbeddedStatus - // DefaultEnableSpire is the default value for "enable-spire". - DefaultEnableSpire = false - // DefaultResourceVerificationMode is the default value for "resource-verification-mode". - DefaultResourceVerificationMode = SkipResourceVerificationMode + // EnforceNonfalsifiabilityWithSpire is the value used for "enable-nonfalsifiability" when SPIRE is used to enable non-falsifiability. + EnforceNonfalsifiabilityWithSpire = "spire" + // EnforceNonfalsifiabilityNone is the value used for "enable-nonfalsifiability" when non-falsifiability is not enabled. + EnforceNonfalsifiabilityNone = "" + // DefaultEnforceNonfalsifiability is the default value for "enforce-nonfalsifiability". + DefaultEnforceNonfalsifiability = EnforceNonfalsifiabilityNone + // DefaultNoMatchPolicyConfig is the default value for "trusted-resources-verification-no-match-policy". + DefaultNoMatchPolicyConfig = IgnoreNoMatchPolicy // DefaultEnableProvenanceInStatus is the default value for "enable-provenance-status". DefaultEnableProvenanceInStatus = false + // DefaultResultExtractionMethod is the default value for ResultExtractionMethod + DefaultResultExtractionMethod = ResultExtractionMethodTerminationMessage + // DefaultMaxResultSize is the default value in bytes for the size of a result + DefaultMaxResultSize = 4096 disableAffinityAssistantKey = "disable-affinity-assistant" disableCredsInitKey = "disable-creds-init" runningInEnvWithInjectedSidecarsKey = "running-in-environment-with-injected-sidecars" awaitSidecarReadinessKey = "await-sidecar-readiness" - requireGitSSHSecretKnownHostsKey = "require-git-ssh-secret-known-hosts" // nolint: gosec + requireGitSSHSecretKnownHostsKey = "require-git-ssh-secret-known-hosts" //nolint:gosec enableTektonOCIBundles = "enable-tekton-oci-bundles" - enableCustomTasks = "enable-custom-tasks" enableAPIFields = "enable-api-fields" sendCloudEventsForRuns = "send-cloudevents-for-runs" - embeddedStatus = "embedded-status" - enableSpire = "enable-spire" - verificationMode = "resource-verification-mode" + enforceNonfalsifiability = "enforce-nonfalsifiability" + verificationNoMatchPolicy = "trusted-resources-verification-no-match-policy" enableProvenanceInStatus = "enable-provenance-in-status" + resultExtractionMethod = "results-from" + maxResultSize = "max-result-size" ) // FeatureFlags holds the features configurations // +k8s:deepcopy-gen=true +// +//nolint:musttag type FeatureFlags struct { DisableAffinityAssistant bool DisableCredsInit bool RunningInEnvWithInjectedSidecars bool RequireGitSSHSecretKnownHosts bool EnableTektonOCIBundles bool - EnableCustomTasks bool ScopeWhenExpressionsToTask bool EnableAPIFields string SendCloudEventsForRuns bool AwaitSidecarReadiness bool - EmbeddedStatus string - EnableSpire bool - ResourceVerificationMode string - EnableProvenanceInStatus bool + EnforceNonfalsifiability string + // VerificationNoMatchPolicy is the feature flag for "trusted-resources-verification-no-match-policy" + // VerificationNoMatchPolicy can be set to "ignore", "warn" and "fail" values. + // ignore: skip trusted resources verification when no matching verification policies found + // warn: skip trusted resources verification when no matching verification policies found and log a warning + // fail: fail the taskrun or pipelines run if no matching verification policies found + VerificationNoMatchPolicy string + EnableProvenanceInStatus bool + ResultExtractionMethod string + MaxResultSize int } // GetFeatureFlagsConfigName returns the name of the configmap containing all @@ -126,7 +133,7 @@ func NewFeatureFlagsFromMap(cfgMap map[string]string) (*FeatureFlags, error) { if cfg, ok := cfgMap[key]; ok { value, err := strconv.ParseBool(cfg) if err != nil { - return fmt.Errorf("failed parsing feature flags config %q: %v", cfg, err) + return fmt.Errorf("failed parsing feature flags config %q: %w", cfg, err) } *feature = value return nil @@ -157,13 +164,19 @@ func NewFeatureFlagsFromMap(cfgMap map[string]string) (*FeatureFlags, error) { if err := setFeature(sendCloudEventsForRuns, DefaultSendCloudEventsForRuns, &tc.SendCloudEventsForRuns); err != nil { return nil, err } - if err := setEmbeddedStatus(cfgMap, DefaultEmbeddedStatus, &tc.EmbeddedStatus); err != nil { + if err := setVerificationNoMatchPolicy(cfgMap, DefaultNoMatchPolicyConfig, &tc.VerificationNoMatchPolicy); err != nil { return nil, err } - if err := setResourceVerificationMode(cfgMap, DefaultResourceVerificationMode, &tc.ResourceVerificationMode); err != nil { + if err := setFeature(enableProvenanceInStatus, DefaultEnableProvenanceInStatus, &tc.EnableProvenanceInStatus); err != nil { return nil, err } - if err := setFeature(enableProvenanceInStatus, DefaultEnableProvenanceInStatus, &tc.EnableProvenanceInStatus); err != nil { + if err := setResultExtractionMethod(cfgMap, DefaultResultExtractionMethod, &tc.ResultExtractionMethod); err != nil { + return nil, err + } + if err := setMaxResultSize(cfgMap, DefaultMaxResultSize, &tc.MaxResultSize); err != nil { + return nil, err + } + if err := setEnforceNonFalsifiability(cfgMap, tc.EnableAPIFields, &tc.EnforceNonfalsifiability); err != nil { return nil, err } @@ -175,18 +188,10 @@ func NewFeatureFlagsFromMap(cfgMap map[string]string) (*FeatureFlags, error) { // defeat the purpose of having a single shared gate for all alpha features. if tc.EnableAPIFields == AlphaAPIFields { tc.EnableTektonOCIBundles = true - tc.EnableCustomTasks = true - tc.EnableSpire = true } else { if err := setFeature(enableTektonOCIBundles, DefaultEnableTektonOciBundles, &tc.EnableTektonOCIBundles); err != nil { return nil, err } - if err := setFeature(enableCustomTasks, DefaultEnableCustomTasks, &tc.EnableCustomTasks); err != nil { - return nil, err - } - if err := setFeature(enableSpire, DefaultEnableSpire, &tc.EnableSpire); err != nil { - return nil, err - } } return &tc, nil } @@ -207,34 +212,82 @@ func setEnabledAPIFields(cfgMap map[string]string, defaultValue string, feature return nil } -// setEmbeddedStatus sets the "embedded-status" flag based on the content of a given map. +// setEnforceNonFalsifiability sets the "enforce-nonfalsifiability" flag based on the content of a given map. +// If the feature gate is invalid, then an error is returned. +func setEnforceNonFalsifiability(cfgMap map[string]string, enableAPIFields string, feature *string) error { + var value = DefaultEnforceNonfalsifiability + if cfg, ok := cfgMap[enforceNonfalsifiability]; ok { + value = strings.ToLower(cfg) + } + + // validate that "enforce-nonfalsifiability" is set to a valid value + switch value { + case EnforceNonfalsifiabilityNone, EnforceNonfalsifiabilityWithSpire: + break + default: + return fmt.Errorf("invalid value for feature flag %q: %q", enforceNonfalsifiability, value) + } + + // validate that "enforce-nonfalsifiability" is set to allowed values for stability level + switch enableAPIFields { + case AlphaAPIFields: + *feature = value + default: + // Do not consider any form of non-falsifiability enforcement in non-alpha mode + if value != DefaultEnforceNonfalsifiability { + return fmt.Errorf("%q can be set to non-default values (%q) only in alpha", enforceNonfalsifiability, value) + } + } + return nil +} + +// setResultExtractionMethod sets the "results-from" flag based on the content of a given map. // If the feature gate is invalid or missing then an error is returned. -func setEmbeddedStatus(cfgMap map[string]string, defaultValue string, feature *string) error { +func setResultExtractionMethod(cfgMap map[string]string, defaultValue string, feature *string) error { value := defaultValue - if cfg, ok := cfgMap[embeddedStatus]; ok { + if cfg, ok := cfgMap[resultExtractionMethod]; ok { value = strings.ToLower(cfg) } switch value { - case FullEmbeddedStatus, BothEmbeddedStatus, MinimalEmbeddedStatus: + case ResultExtractionMethodTerminationMessage, ResultExtractionMethodSidecarLogs: *feature = value default: - return fmt.Errorf("invalid value for feature flag %q: %q", embeddedStatus, value) + return fmt.Errorf("invalid value for feature flag %q: %q", resultExtractionMethod, value) + } + return nil +} + +// setMaxResultSize sets the "max-result-size" flag based on the content of a given map. +// If the feature gate is invalid or missing then an error is returned. +func setMaxResultSize(cfgMap map[string]string, defaultValue int, feature *int) error { + value := defaultValue + if cfg, ok := cfgMap[maxResultSize]; ok { + v, err := strconv.Atoi(cfg) + if err != nil { + return err + } + value = v + } + // if max limit is > 1.5 MB (CRD limit). + if value >= 1572864 { + return fmt.Errorf("invalid value for feature flag %q: %q. This is exceeding the CRD limit", resultExtractionMethod, fmt.Sprint(value)) } + *feature = value return nil } -// setResourceVerificationMode sets the "resource-verification-mode" flag based on the content of a given map. +// setVerificationNoMatchPolicy sets the "trusted-resources-verification-no-match-policy" flag based on the content of a given map. // If the value is invalid or missing then an error is returned. -func setResourceVerificationMode(cfgMap map[string]string, defaultValue string, feature *string) error { +func setVerificationNoMatchPolicy(cfgMap map[string]string, defaultValue string, feature *string) error { value := defaultValue - if cfg, ok := cfgMap[verificationMode]; ok { + if cfg, ok := cfgMap[verificationNoMatchPolicy]; ok { value = strings.ToLower(cfg) } switch value { - case EnforceResourceVerificationMode, WarnResourceVerificationMode, SkipResourceVerificationMode: + case FailNoMatchPolicy, WarnNoMatchPolicy, IgnoreNoMatchPolicy: *feature = value default: - return fmt.Errorf("invalid value for feature flag %q: %q", verificationMode, value) + return fmt.Errorf("invalid value for feature flag %q: %q", verificationNoMatchPolicy, value) } return nil } @@ -246,12 +299,33 @@ func NewFeatureFlagsFromConfigMap(config *corev1.ConfigMap) (*FeatureFlags, erro // EnableAlphaAPIFields enables alpha features in an existing context (for use in testing) func EnableAlphaAPIFields(ctx context.Context) context.Context { - return setEnableAPIFields(ctx, "alpha") + return setEnableAPIFields(ctx, AlphaAPIFields) } // EnableBetaAPIFields enables beta features in an existing context (for use in testing) func EnableBetaAPIFields(ctx context.Context) context.Context { - return setEnableAPIFields(ctx, "beta") + return setEnableAPIFields(ctx, BetaAPIFields) +} + +// EnableStableAPIFields enables stable features in an existing context (for use in testing) +func EnableStableAPIFields(ctx context.Context) context.Context { + return setEnableAPIFields(ctx, StableAPIFields) +} + +// GetVerificationNoMatchPolicy returns the "trusted-resources-verification-no-match-policy" value +func GetVerificationNoMatchPolicy(ctx context.Context) string { + return FromContextOrDefaults(ctx).FeatureFlags.VerificationNoMatchPolicy +} + +// CheckAlphaOrBetaAPIFields return true if the enable-api-fields is either set to alpha or set to beta +func CheckAlphaOrBetaAPIFields(ctx context.Context) bool { + cfg := FromContextOrDefaults(ctx) + return cfg.FeatureFlags.EnableAPIFields == AlphaAPIFields || cfg.FeatureFlags.EnableAPIFields == BetaAPIFields +} + +// IsSpireEnabled checks if non-falsifiable provenance is enforced through SPIRE +func IsSpireEnabled(ctx context.Context) bool { + return FromContextOrDefaults(ctx).FeatureFlags.EnforceNonfalsifiability == EnforceNonfalsifiabilityWithSpire } func setEnableAPIFields(ctx context.Context, want string) context.Context { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/spire_config.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/spire_config.go new file mode 100644 index 0000000000..7ad507f202 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/spire_config.go @@ -0,0 +1,83 @@ +/* +Copyright 2022 The Tekton 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 config + +import ( + "fmt" + "os" + + sc "github.com/tektoncd/pipeline/pkg/spire/config" + corev1 "k8s.io/api/core/v1" +) + +const ( + // SpireConfigMapName is the name of the trusted resources configmap + SpireConfigMapName = "config-spire" + + // SpireTrustDomain is the key to extract out the SPIRE trust domain to use + SpireTrustDomain = "spire-trust-domain" + // SpireSocketPath is the key to extract out the SPIRE agent socket for SPIFFE workload API + SpireSocketPath = "spire-socket-path" + // SpireServerAddr is the key to extract out the SPIRE server address for workload/node registration + SpireServerAddr = "spire-server-addr" + // SpireNodeAliasPrefix is the key to extract out the SPIRE node alias prefix to use + SpireNodeAliasPrefix = "spire-node-alias-prefix" + + // SpireTrustDomainDefault is the default value for the SpireTrustDomain + SpireTrustDomainDefault = "example.org" + // SpireSocketPathDefault is the default value for the SpireSocketPath + SpireSocketPathDefault = "unix:///spiffe-workload-api/spire-agent.sock" + // SpireServerAddrDefault is the default value for the SpireServerAddr + SpireServerAddrDefault = "spire-server.spire.svc.cluster.local:8081" + // SpireNodeAliasPrefixDefault is the default value for the SpireNodeAliasPrefix + SpireNodeAliasPrefixDefault = "/tekton-node/" +) + +// NewSpireConfigFromMap creates a Config from the supplied map +func NewSpireConfigFromMap(data map[string]string) (*sc.SpireConfig, error) { + cfg := &sc.SpireConfig{} + var ok bool + if cfg.TrustDomain, ok = data[SpireTrustDomain]; !ok { + cfg.TrustDomain = SpireTrustDomainDefault + } + if cfg.SocketPath, ok = data[SpireSocketPath]; !ok { + cfg.SocketPath = SpireSocketPathDefault + } + if cfg.ServerAddr, ok = data[SpireServerAddr]; !ok { + cfg.ServerAddr = SpireServerAddrDefault + } + if cfg.NodeAliasPrefix, ok = data[SpireNodeAliasPrefix]; !ok { + cfg.NodeAliasPrefix = SpireNodeAliasPrefixDefault + } + if err := cfg.Validate(); err != nil { + return nil, fmt.Errorf("failed to parse SPIRE configmap: %w", err) + } + return cfg, nil +} + +// NewSpireConfigFromConfigMap creates a Config from the supplied ConfigMap +func NewSpireConfigFromConfigMap(configMap *corev1.ConfigMap) (*sc.SpireConfig, error) { + return NewSpireConfigFromMap(configMap.Data) +} + +// GetSpireConfigName returns the name of Spire ConfigMap +func GetSpireConfigName() string { + if e := os.Getenv("CONFIG_SPIRE"); e != "" { + return e + } + return SpireConfigMapName +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/store.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/store.go index 338a05c2ff..9cb15bdf0b 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/store.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/store.go @@ -19,6 +19,7 @@ package config import ( "context" + sc "github.com/tektoncd/pipeline/pkg/spire/config" "knative.dev/pkg/configmap" ) @@ -27,12 +28,10 @@ type cfgKey struct{} // Config holds the collection of configurations that we attach to contexts. // +k8s:deepcopy-gen=false type Config struct { - Defaults *Defaults - FeatureFlags *FeatureFlags - ArtifactBucket *ArtifactBucket - ArtifactPVC *ArtifactPVC - Metrics *Metrics - TrustedResources *TrustedResources + Defaults *Defaults + FeatureFlags *FeatureFlags + Metrics *Metrics + SpireConfig *sc.SpireConfig } // FromContext extracts a Config from the provided context. @@ -52,17 +51,14 @@ func FromContextOrDefaults(ctx context.Context) *Config { } defaults, _ := NewDefaultsFromMap(map[string]string{}) featureFlags, _ := NewFeatureFlagsFromMap(map[string]string{}) - artifactBucket, _ := NewArtifactBucketFromMap(map[string]string{}) - artifactPVC, _ := NewArtifactPVCFromMap(map[string]string{}) metrics, _ := newMetricsFromMap(map[string]string{}) - trustedresources, _ := NewTrustedResourcesConfigFromMap(map[string]string{}) + spireconfig, _ := NewSpireConfigFromMap(map[string]string{}) + return &Config{ - Defaults: defaults, - FeatureFlags: featureFlags, - ArtifactBucket: artifactBucket, - ArtifactPVC: artifactPVC, - Metrics: metrics, - TrustedResources: trustedresources, + Defaults: defaults, + FeatureFlags: featureFlags, + Metrics: metrics, + SpireConfig: spireconfig, } } @@ -85,12 +81,10 @@ func NewStore(logger configmap.Logger, onAfterStore ...func(name string, value i "defaults/features/artifacts", logger, configmap.Constructors{ - GetDefaultsConfigName(): NewDefaultsFromConfigMap, - GetFeatureFlagsConfigName(): NewFeatureFlagsFromConfigMap, - GetArtifactBucketConfigName(): NewArtifactBucketFromConfigMap, - GetArtifactPVCConfigName(): NewArtifactPVCFromConfigMap, - GetMetricsConfigName(): NewMetricsFromConfigMap, - GetTrustedResourcesConfigName(): NewTrustedResourcesConfigFromConfigMap, + GetDefaultsConfigName(): NewDefaultsFromConfigMap, + GetFeatureFlagsConfigName(): NewFeatureFlagsFromConfigMap, + GetMetricsConfigName(): NewMetricsFromConfigMap, + GetSpireConfigName(): NewSpireConfigFromConfigMap, }, onAfterStore..., ), @@ -114,30 +108,20 @@ func (s *Store) Load() *Config { if featureFlags == nil { featureFlags, _ = NewFeatureFlagsFromMap(map[string]string{}) } - artifactBucket := s.UntypedLoad(GetArtifactBucketConfigName()) - if artifactBucket == nil { - artifactBucket, _ = NewArtifactBucketFromMap(map[string]string{}) - } - artifactPVC := s.UntypedLoad(GetArtifactPVCConfigName()) - if artifactPVC == nil { - artifactPVC, _ = NewArtifactPVCFromMap(map[string]string{}) - } - metrics := s.UntypedLoad(GetMetricsConfigName()) if metrics == nil { metrics, _ = newMetricsFromMap(map[string]string{}) } - trustedresources := s.UntypedLoad(GetTrustedResourcesConfigName()) - if trustedresources == nil { - trustedresources, _ = NewTrustedResourcesConfigFromMap(map[string]string{}) + + spireconfig := s.UntypedLoad(GetSpireConfigName()) + if spireconfig == nil { + spireconfig, _ = NewSpireConfigFromMap(map[string]string{}) } return &Config{ - Defaults: defaults.(*Defaults).DeepCopy(), - FeatureFlags: featureFlags.(*FeatureFlags).DeepCopy(), - ArtifactBucket: artifactBucket.(*ArtifactBucket).DeepCopy(), - ArtifactPVC: artifactPVC.(*ArtifactPVC).DeepCopy(), - Metrics: metrics.(*Metrics).DeepCopy(), - TrustedResources: trustedresources.(*TrustedResources).DeepCopy(), + Defaults: defaults.(*Defaults).DeepCopy(), + FeatureFlags: featureFlags.(*FeatureFlags).DeepCopy(), + Metrics: metrics.(*Metrics).DeepCopy(), + SpireConfig: spireconfig.(*sc.SpireConfig).DeepCopy(), } } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/trusted_resources.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/trusted_resources.go deleted file mode 100644 index aee081bfd1..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/trusted_resources.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2022 The Tekton 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 config - -import ( - "fmt" - "os" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/sets" - - cm "knative.dev/pkg/configmap" -) - -// TrustedResources holds the collection of configurations that we attach to contexts. -// Configmap named with "config-trusted-resources" where cosign pub key path and -// KMS pub key path can be configured -// +k8s:deepcopy-gen=true -type TrustedResources struct { - // Keys defines the name of the key in configmap data - Keys sets.String -} - -const ( - // DefaultPublicKeyPath is the default path of public key - DefaultPublicKeyPath = "" - // PublicKeys is the name of the public key keyref in configmap data - PublicKeys = "publickeys" - // TrustedTaskConfig is the name of the trusted resources configmap - TrustedTaskConfig = "config-trusted-resources" -) - -// NewTrustedResourcesConfigFromMap creates a Config from the supplied map -func NewTrustedResourcesConfigFromMap(data map[string]string) (*TrustedResources, error) { - cfg := &TrustedResources{ - Keys: sets.NewString(DefaultPublicKeyPath), - } - if err := cm.Parse(data, - cm.AsStringSet(PublicKeys, &cfg.Keys), - ); err != nil { - return nil, fmt.Errorf("failed to parse data: %w", err) - } - return cfg, nil -} - -// NewTrustedResourcesConfigFromConfigMap creates a Config from the supplied ConfigMap -func NewTrustedResourcesConfigFromConfigMap(configMap *corev1.ConfigMap) (*TrustedResources, error) { - return NewTrustedResourcesConfigFromMap(configMap.Data) -} - -// GetTrustedResourcesConfigName returns the name of TrustedResources ConfigMap -func GetTrustedResourcesConfigName() string { - if e := os.Getenv("CONFIG_TRUSTED_RESOURCES_NAME"); e != "" { - return e - } - return TrustedTaskConfig -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/zz_generated.deepcopy.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/zz_generated.deepcopy.go index 0415be8ae1..15d1070d8e 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/config/zz_generated.deepcopy.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/config/zz_generated.deepcopy.go @@ -23,41 +23,8 @@ package config import ( pod "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - sets "k8s.io/apimachinery/pkg/util/sets" ) -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ArtifactBucket) DeepCopyInto(out *ArtifactBucket) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArtifactBucket. -func (in *ArtifactBucket) DeepCopy() *ArtifactBucket { - if in == nil { - return nil - } - out := new(ArtifactBucket) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ArtifactPVC) DeepCopyInto(out *ArtifactPVC) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArtifactPVC. -func (in *ArtifactPVC) DeepCopy() *ArtifactPVC { - if in == nil { - return nil - } - out := new(ArtifactPVC) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Defaults) DeepCopyInto(out *Defaults) { *out = *in @@ -71,6 +38,11 @@ func (in *Defaults) DeepCopyInto(out *Defaults) { *out = new(pod.AffinityAssistantTemplate) (*in).DeepCopyInto(*out) } + if in.DefaultForbiddenEnv != nil { + in, out := &in.DefaultForbiddenEnv, &out.DefaultForbiddenEnv + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -115,26 +87,3 @@ func (in *Metrics) DeepCopy() *Metrics { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrustedResources) DeepCopyInto(out *TrustedResources) { - *out = *in - if in.Keys != nil { - in, out := &in.Keys, &out.Keys - *out = make(sets.String, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrustedResources. -func (in *TrustedResources) DeepCopy() *TrustedResources { - if in == nil { - return nil - } - out := new(TrustedResources) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/controller.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/controller.go index dd5669174a..5f15500709 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/controller.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/controller.go @@ -18,11 +18,9 @@ package pipeline const ( // PipelineRunControllerName holds the name of the PipelineRun controller - // nolint: revive PipelineRunControllerName = "PipelineRun" // PipelineControllerName holds the name of the Pipeline controller - // nolint: revive PipelineControllerName = "Pipeline" // TaskRunControllerName holds the name of the TaskRun controller diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/images.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/images.go index e40ebfe563..ae3127ca73 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/images.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/images.go @@ -26,22 +26,14 @@ import ( type Images struct { // EntrypointImage is container image containing our entrypoint binary. EntrypointImage string + // SidecarLogResultsImage is container image containing the binary that fetches results from the steps and logs it to stdout. + SidecarLogResultsImage string // NopImage is the container image used to kill sidecars. NopImage string - // GitImage is the container image with Git that we use to implement the Git source step. - GitImage string - // KubeconfigWriterImage is the container image containing our kubeconfig writer binary. - KubeconfigWriterImage string // ShellImage is the container image containing bash shell. ShellImage string // ShellImageWin is the container image containing powershell. ShellImageWin string - // GsutilImage is the container image containing gsutil. - GsutilImage string - // PRImage is the container image that we use to implement the PR source step. - PRImage string - // ImageDigestExporterImage is the container image containing our image digest exporter binary. - ImageDigestExporterImage string // WorkingDirInitImage is the container image containing our working dir init binary. WorkingDirInitImage string @@ -55,14 +47,10 @@ func (i Images) Validate() error { v, name string }{ {i.EntrypointImage, "entrypoint-image"}, + {i.SidecarLogResultsImage, "sidecarlogresults-image"}, {i.NopImage, "nop-image"}, - {i.GitImage, "git-image"}, - {i.KubeconfigWriterImage, "kubeconfig-writer-image"}, {i.ShellImage, "shell-image"}, {i.ShellImageWin, "shell-image-win"}, - {i.GsutilImage, "gsutil-image"}, - {i.PRImage, "pr-image"}, - {i.ImageDigestExporterImage, "imagedigest-exporter-image"}, {i.WorkingDirInitImage, "workingdirinit-image"}, } { if f.v == "" { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/template.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/template.go index 2ebfd462a2..e9f75fa3b7 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/template.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/template.go @@ -32,6 +32,13 @@ type Template struct { // +optional NodeSelector map[string]string `json:"nodeSelector,omitempty"` + // List of environment variables that can be provided to the containers belonging to the pod. + // +optional + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=atomic + Env []corev1.EnvVar `json:"env,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=env"` + // If specified, the pod's tolerations. // +optional // +listType=atomic @@ -148,6 +155,7 @@ func (tpl *Template) ToAffinityAssistantTemplate() *AffinityAssistantTemplate { } // PodTemplate holds pod specific configuration +// //nolint:revive type PodTemplate = Template @@ -164,6 +172,9 @@ func MergePodTemplateWithDefault(tpl, defaultTpl *PodTemplate) *PodTemplate { return defaultTpl default: // Otherwise, merge fields + if tpl.Env == nil { + tpl.Env = defaultTpl.Env + } if tpl.NodeSelector == nil { tpl.NodeSelector = defaultTpl.NodeSelector } @@ -206,7 +217,7 @@ func MergePodTemplateWithDefault(tpl, defaultTpl *PodTemplate) *PodTemplate { if tpl.HostAliases == nil { tpl.HostAliases = defaultTpl.HostAliases } - if tpl.HostNetwork == false && defaultTpl.HostNetwork == true { + if !tpl.HostNetwork && defaultTpl.HostNetwork { tpl.HostNetwork = true } if tpl.TopologySpreadConstraints == nil { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/zz_generated.deepcopy.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/zz_generated.deepcopy.go index 000cb713d3..450128e3a9 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/zz_generated.deepcopy.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/pod/zz_generated.deepcopy.go @@ -70,6 +70,13 @@ func (in *Template) DeepCopyInto(out *Template) { (*out)[key] = val } } + if in.Env != nil { + in, out := &in.Env, &out.Env + *out = make([]v1.EnvVar, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.Tolerations != nil { in, out := &in.Tolerations, &out.Tolerations *out = make([]v1.Toleration, len(*in)) diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/register.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/register.go index a95b23e72a..0a5ab30547 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/register.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/register.go @@ -43,6 +43,9 @@ const ( // RunKey is used as the label identifier for a Run RunKey = GroupName + "/run" + // CustomRunKey is used as the label identifier for a CustomRun + CustomRunKey = GroupName + "/customRun" + // MemberOfLabelKey is used as the label identifier for a PipelineTask // Set to Tasks/Finally depending on the position of the PipelineTask MemberOfLabelKey = GroupName + "/memberOf" @@ -80,9 +83,9 @@ var ( Resource: "pipelineruns", } - // PipelineResourceResource represents a Tekton PipelineResource - PipelineResourceResource = schema.GroupResource{ + // CustomRunResource represents a Tekton CustomRun + CustomRunResource = schema.GroupResource{ Group: GroupName, - Resource: "pipelineresources", + Resource: "customruns", } ) diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/sidecarlogs.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/sidecarlogs.go new file mode 100644 index 0000000000..a0c570675e --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/sidecarlogs.go @@ -0,0 +1,27 @@ +/* +Copyright 2022 The Tekton 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 pipeline + +const ( + // ReservedResultsSidecarName is the name of the results sidecar that outputs the results to stdout + // when the results-from feature-flag is set to "sidecar-logs". + ReservedResultsSidecarName = "tekton-log-results" + + // ReservedResultsSidecarContainerName is the name of the results sidecar container that is injected + // by the reconciler. + ReservedResultsSidecarContainerName = "sidecar-tekton-log-results" +) diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/container_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/container_types.go index c3831ed218..79c9922f46 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/container_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/container_types.go @@ -5,7 +5,7 @@ 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 + 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, @@ -22,7 +22,6 @@ import ( // Step runs a subcomponent of a Task type Step struct { - // Name of the Step specified as a DNS_LABEL. // Each Step in a Task must have a unique name. Name string `json:"name" protobuf:"bytes,1,opt,name=name"` @@ -191,7 +190,6 @@ func (s *Step) SetContainerFields(c corev1.Container) { // StepTemplate is a template for a Step type StepTemplate struct { - // Image reference name. // More info: https://kubernetes.io/docs/concepts/containers/images // This field is optional to allow higher level config management to default or override @@ -308,7 +306,6 @@ func (s *StepTemplate) ToK8sContainer() *corev1.Container { // Sidecar has nearly the same data structure as Step but does not have the ability to timeout. type Sidecar struct { - // Name of the Sidecar specified as a DNS_LABEL. // Each Sidecar in a Task must have a unique name (DNS_LABEL). // Cannot be updated. diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/matrix_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/matrix_types.go new file mode 100644 index 0000000000..67fb8a6b81 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/matrix_types.go @@ -0,0 +1,362 @@ +/* +Copyright 2023 The Tekton 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 v1 + +import ( + "context" + "fmt" + "sort" + + "github.com/tektoncd/pipeline/pkg/apis/config" + "golang.org/x/exp/maps" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/utils/strings/slices" + "knative.dev/pkg/apis" +) + +// Matrix is used to fan out Tasks in a Pipeline +type Matrix struct { + // Params is a list of parameters used to fan out the pipelineTask + // Params takes only `Parameters` of type `"array"` + // Each array element is supplied to the `PipelineTask` by substituting `params` of type `"string"` in the underlying `Task`. + // The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting. + // +listType=atomic + Params Params `json:"params,omitempty"` + + // Include is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix. + // +optional + // +listType=atomic + Include IncludeParamsList `json:"include,omitempty"` +} + +// IncludeParamsList is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix. +type IncludeParamsList []IncludeParams + +// IncludeParams allows passing in a specific combinations of Parameters into the Matrix. +type IncludeParams struct { + // Name the specified combination + Name string `json:"name,omitempty"` + + // Params takes only `Parameters` of type `"string"` + // The names of the `params` must match the names of the `params` in the underlying `Task` + // +listType=atomic + Params Params `json:"params,omitempty"` +} + +// Combination is a map, mainly defined to hold a single combination from a Matrix with key as param.Name and value as param.Value +type Combination map[string]string + +// Combinations is a Combination list +type Combinations []Combination + +// FanOut returns an list of params that represent combinations +func (m *Matrix) FanOut() []Params { + var combinations, includeCombinations Combinations + includeCombinations = m.getIncludeCombinations() + if m.HasInclude() && !m.HasParams() { + // If there are only Matrix Include Parameters return explicit combinations + return includeCombinations.toParams() + } + // Generate combinations from Matrix Parameters + for _, parameter := range m.Params { + combinations = combinations.fanOutMatrixParams(parameter) + } + combinations.overwriteCombinations(includeCombinations) + combinations = combinations.addNewCombinations(includeCombinations) + return combinations.toParams() +} + +// overwriteCombinations replaces any missing include params in the initial +// matrix params combinations by overwriting the initial combinations with the +// include combinations +func (cs Combinations) overwriteCombinations(ics Combinations) { + for _, paramCombination := range cs { + for _, includeCombination := range ics { + if paramCombination.contains(includeCombination) { + // overwrite the parameter name and value in existing combination + // with the include combination + for name, val := range includeCombination { + paramCombination[name] = val + } + } + } + } +} + +// addNewCombinations creates a new combination for any include parameter +// values that are missing entirely from the initial combinations and +// returns all combinations +func (cs Combinations) addNewCombinations(ics Combinations) Combinations { + for _, includeCombination := range ics { + if cs.shouldAddNewCombination(includeCombination) { + cs = append(cs, includeCombination) + } + } + return cs +} + +// contains returns true if the include parameter name and value exists in combinations +func (c Combination) contains(includeCombination Combination) bool { + for name, val := range includeCombination { + if _, exist := c[name]; exist { + if c[name] != val { + return false + } + } + } + return true +} + +// shouldAddNewCombination returns true if the include parameter name exists but the value is +// missing from combinations +func (cs Combinations) shouldAddNewCombination(includeCombination map[string]string) bool { + if len(includeCombination) == 0 { + return false + } + for _, paramCombination := range cs { + for name, val := range includeCombination { + if _, exist := paramCombination[name]; exist { + if paramCombination[name] == val { + return false + } + } + } + } + return true +} + +// toParams transforms Combinations from a slice of map[string]string to a slice of Params +// such that, these combinations can be directly consumed in creating taskRun/run object +func (cs Combinations) toParams() []Params { + listOfParams := make([]Params, len(cs)) + for i := range cs { + var params Params + combination := cs[i] + order, _ := combination.sortCombination() + for _, key := range order { + params = append(params, Param{ + Name: key, + Value: ParamValue{Type: ParamTypeString, StringVal: combination[key]}, + }) + } + listOfParams[i] = params + } + return listOfParams +} + +// fanOutMatrixParams generates new combinations based on Matrix Parameters. +func (cs Combinations) fanOutMatrixParams(param Param) Combinations { + if len(cs) == 0 { + return initializeCombinations(param) + } + return cs.distribute(param) +} + +// getIncludeCombinations generates combinations based on Matrix Include Parameters +func (m *Matrix) getIncludeCombinations() Combinations { + var combinations Combinations + for i := range m.Include { + includeParams := m.Include[i].Params + newCombination := make(Combination) + for _, param := range includeParams { + newCombination[param.Name] = param.Value.StringVal + } + combinations = append(combinations, newCombination) + } + return combinations +} + +// distribute generates a new Combination of Parameters by adding a new Parameter to an existing list of Combinations. +func (cs Combinations) distribute(param Param) Combinations { + var expandedCombinations Combinations + for _, value := range param.Value.ArrayVal { + for _, combination := range cs { + newCombination := make(Combination) + maps.Copy(newCombination, combination) + newCombination[param.Name] = value + _, orderedCombination := newCombination.sortCombination() + expandedCombinations = append(expandedCombinations, orderedCombination) + } + } + return expandedCombinations +} + +// initializeCombinations generates a new Combination based on the first Parameter in the Matrix. +func initializeCombinations(param Param) Combinations { + var combinations Combinations + for _, value := range param.Value.ArrayVal { + combinations = append(combinations, Combination{param.Name: value}) + } + return combinations +} + +// sortCombination sorts the given Combination based on the Parameter names to produce a deterministic ordering +func (c Combination) sortCombination() ([]string, Combination) { + sortedCombination := make(Combination, len(c)) + order := make([]string, 0, len(c)) + for key := range c { + order = append(order, key) + } + sort.Slice(order, func(i, j int) bool { + return order[i] <= order[j] + }) + for _, key := range order { + sortedCombination[key] = c[key] + } + return order, sortedCombination +} + +// CountCombinations returns the count of Combinations of Parameters generated from the Matrix in PipelineTask. +func (m *Matrix) CountCombinations() int { + // Iterate over Matrix Parameters and compute count of all generated Combinations + count := m.countGeneratedCombinationsFromParams() + + // Add any additional Combinations generated from Matrix Include Parameters + count += m.countNewCombinationsFromInclude() + + return count +} + +// countGeneratedCombinationsFromParams returns the count of Combinations of Parameters generated from the Matrix +// Parameters +func (m *Matrix) countGeneratedCombinationsFromParams() int { + if !m.HasParams() { + return 0 + } + count := 1 + for _, param := range m.Params { + count *= len(param.Value.ArrayVal) + } + return count +} + +// countNewCombinationsFromInclude returns the count of Combinations of Parameters generated from the Matrix +// Include Parameters +func (m *Matrix) countNewCombinationsFromInclude() int { + if !m.HasInclude() { + return 0 + } + if !m.HasParams() { + return len(m.Include) + } + count := 0 + matrixParamMap := m.Params.extractParamMapArrVals() + for _, include := range m.Include { + for _, param := range include.Params { + if val, exist := matrixParamMap[param.Name]; exist { + // If the Matrix Include param values does not exist, a new Combination will be generated + if !slices.Contains(val, param.Value.StringVal) { + count++ + } else { + break + } + } + } + } + return count +} + +// HasInclude returns true if the Matrix has Include Parameters +func (m *Matrix) HasInclude() bool { + return m != nil && m.Include != nil && len(m.Include) > 0 +} + +// HasParams returns true if the Matrix has Parameters +func (m *Matrix) HasParams() bool { + return m != nil && m.Params != nil && len(m.Params) > 0 +} + +// GetAllParams returns a list of all Matrix Parameters +func (m *Matrix) GetAllParams() Params { + var params Params + if m.HasParams() { + params = append(params, m.Params...) + } + if m.HasInclude() { + for _, include := range m.Include { + params = append(params, include.Params...) + } + } + return params +} + +func (m *Matrix) validateCombinationsCount(ctx context.Context) (errs *apis.FieldError) { + matrixCombinationsCount := m.CountCombinations() + maxMatrixCombinationsCount := config.FromContextOrDefaults(ctx).Defaults.DefaultMaxMatrixCombinationsCount + if matrixCombinationsCount > maxMatrixCombinationsCount { + errs = errs.Also(apis.ErrOutOfBoundsValue(matrixCombinationsCount, 0, maxMatrixCombinationsCount, "matrix")) + } + return errs +} + +// validateParams validates the type of Parameter for Matrix.Params and Matrix.Include.Params +// Matrix.Params must be of type array. Matrix.Include.Params must be of type string. +// validateParams also validates Matrix.Params for a unique list of params +// and a unique list of params in each Matrix.Include.Params specification +func (m *Matrix) validateParams() (errs *apis.FieldError) { + if m != nil { + if m.HasInclude() { + for i, include := range m.Include { + errs = errs.Also(include.Params.validateDuplicateParameters().ViaField(fmt.Sprintf("matrix.include[%d].params", i))) + for _, param := range include.Params { + if param.Value.Type != ParamTypeString { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("parameters of type string only are allowed, but got param type %s", string(param.Value.Type)), "").ViaFieldKey("matrix.include.params", param.Name)) + } + } + } + } + if m.HasParams() { + errs = errs.Also(m.Params.validateDuplicateParameters().ViaField("matrix.params")) + for _, param := range m.Params { + if param.Value.Type != ParamTypeArray { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("parameters of type array only are allowed, but got param type %s", string(param.Value.Type)), "").ViaFieldKey("matrix.params", param.Name)) + } + } + } + } + return errs +} + +// validatePipelineParametersVariablesInMatrixParameters validates all pipeline parameter variables including Matrix.Params and Matrix.Include.Params +// that may contain the reference(s) to other params to make sure those references are used appropriately. +func (m *Matrix) validatePipelineParametersVariablesInMatrixParameters(prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { + if m.HasInclude() { + for _, include := range m.Include { + for idx, param := range include.Params { + stringElement := param.Value.StringVal + // Matrix Include Params must be of type string + errs = errs.Also(validateStringVariable(stringElement, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldIndex("", idx).ViaField("matrix.include.params", "")) + } + } + } + if m.HasParams() { + for _, param := range m.Params { + for idx, arrayElement := range param.Value.ArrayVal { + // Matrix Params must be of type array + errs = errs.Also(validateArrayVariable(arrayElement, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldIndex("value", idx).ViaFieldKey("matrix.params", param.Name)) + } + } + } + return errs +} + +func (m *Matrix) validateParameterInOneOfMatrixOrParams(params []Param) (errs *apis.FieldError) { + matrixParamNames := m.GetAllParams().ExtractNames() + for _, param := range params { + if matrixParamNames.Has(param.Name) { + errs = errs.Also(apis.ErrMultipleOneOf("matrix["+param.Name+"]", "params["+param.Name+"]")) + } + } + return errs +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/merge.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/merge.go index b7995ae90a..b500ef8758 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/merge.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/merge.go @@ -20,6 +20,7 @@ import ( "encoding/json" corev1 "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/strategicpatch" ) @@ -57,6 +58,8 @@ func MergeStepsWithStepTemplate(template *StepTemplate, steps []Step) ([]Step, e merged.Args = []string{} } + amendConflictingContainerFields(&merged, s) + // Pass through original step Script, for later conversion. newStep := Step{Script: s.Script, OnError: s.OnError, Timeout: s.Timeout, StdoutConfig: s.StdoutConfig, StderrConfig: s.StderrConfig} newStep.SetContainerFields(merged) @@ -65,6 +68,65 @@ func MergeStepsWithStepTemplate(template *StepTemplate, steps []Step) ([]Step, e return steps, nil } +// MergeStepsWithSpecs takes a possibly nil list of overrides and a +// list of steps, merging each of the steps with the overrides' resource requirements, if +// it's not nil, and returning the resulting list. +func MergeStepsWithSpecs(steps []Step, overrides []TaskRunStepSpec) ([]Step, error) { + stepNameToOverride := make(map[string]TaskRunStepSpec, len(overrides)) + for _, o := range overrides { + stepNameToOverride[o.Name] = o + } + for i, s := range steps { + o, found := stepNameToOverride[s.Name] + if !found { + continue + } + merged := v1.ResourceRequirements{} + err := mergeObjWithTemplate(&s.ComputeResources, &o.ComputeResources, &merged) + if err != nil { + return nil, err + } + steps[i].ComputeResources = merged + } + return steps, nil +} + +// MergeSidecarsWithSpecs takes a possibly nil list of overrides and a +// list of sidecars, merging each of the sidecars with the overrides' resource requirements, if +// it's not nil, and returning the resulting list. +func MergeSidecarsWithSpecs(sidecars []Sidecar, overrides []TaskRunSidecarSpec) ([]Sidecar, error) { + if len(overrides) == 0 { + return sidecars, nil + } + sidecarNameToOverride := make(map[string]TaskRunSidecarSpec, len(overrides)) + for _, o := range overrides { + sidecarNameToOverride[o.Name] = o + } + for i, s := range sidecars { + o, found := sidecarNameToOverride[s.Name] + if !found { + continue + } + merged := v1.ResourceRequirements{} + err := mergeObjWithTemplate(&s.ComputeResources, &o.ComputeResources, &merged) + if err != nil { + return nil, err + } + sidecars[i].ComputeResources = merged + } + return sidecars, nil +} + +// mergeObjWithTemplate merges obj with template and updates out to reflect the merged result. +// template, obj, and out should point to the same type. out points to the zero value of that type. +func mergeObjWithTemplate(template, obj, out interface{}) error { + md, err := getMergeData(template, out) + if err != nil { + return err + } + return mergeObjWithTemplateBytes(md, obj, out) +} + // getMergeData serializes the template and empty object to get the intermediate results necessary for // merging an object of the same type with this template. // This function is provided to avoid repeatedly serializing an identical template. @@ -114,3 +176,24 @@ func mergeObjWithTemplateBytes(md *mergeData, obj, out interface{}) error { // Unmarshal the merged JSON to a pointer, and return it. return json.Unmarshal(mergedAsJSON, out) } + +// amendConflictingContainerFields amends conflicting container fields after merge, and overrides conflicting fields +// by fields in step. +func amendConflictingContainerFields(container *corev1.Container, step Step) { + if container == nil || len(step.Env) == 0 { + return + } + + envNameToStepEnv := make(map[string]corev1.EnvVar, len(step.Env)) + for _, e := range step.Env { + envNameToStepEnv[e.Name] = e + } + + for index, env := range container.Env { + if env.ValueFrom != nil && len(env.Value) > 0 { + if e, ok := envNameToStepEnv[env.Name]; ok { + container.Env[index] = e + } + } + } +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/openapi_generated.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/openapi_generated.go index c586cb3b27..5915648f90 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/openapi_generated.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/openapi_generated.go @@ -33,8 +33,8 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod.AffinityAssistantTemplate": schema_pkg_apis_pipeline_pod_AffinityAssistantTemplate(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod.Template": schema_pkg_apis_pipeline_pod_Template(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.ChildStatusReference": schema_pkg_apis_pipeline_v1_ChildStatusReference(ref), - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.ConfigSource": schema_pkg_apis_pipeline_v1_ConfigSource(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.EmbeddedTask": schema_pkg_apis_pipeline_v1_EmbeddedTask(ref), + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.IncludeParams": schema_pkg_apis_pipeline_v1_IncludeParams(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Matrix": schema_pkg_apis_pipeline_v1_Matrix(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Param": schema_pkg_apis_pipeline_v1_Param(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.ParamSpec": schema_pkg_apis_pipeline_v1_ParamSpec(ref), @@ -61,6 +61,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.PipelineWorkspaceDeclaration": schema_pkg_apis_pipeline_v1_PipelineWorkspaceDeclaration(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.PropertySpec": schema_pkg_apis_pipeline_v1_PropertySpec(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Provenance": schema_pkg_apis_pipeline_v1_Provenance(ref), + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.RefSource": schema_pkg_apis_pipeline_v1_RefSource(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.ResolverRef": schema_pkg_apis_pipeline_v1_ResolverRef(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.ResultRef": schema_pkg_apis_pipeline_v1_ResultRef(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Sidecar": schema_pkg_apis_pipeline_v1_Sidecar(ref), @@ -186,6 +187,27 @@ func schema_pkg_apis_pipeline_pod_Template(ref common.ReferenceCallback) common. }, }, }, + "env": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "List of environment variables that can be provided to the containers belonging to the pod.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.EnvVar"), + }, + }, + }, + }, + }, "tolerations": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -354,7 +376,7 @@ func schema_pkg_apis_pipeline_pod_Template(ref common.ReferenceCallback) common. }, }, Dependencies: []string{ - "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.TopologySpreadConstraint", "k8s.io/api/core/v1.Volume"}, + "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.TopologySpreadConstraint", "k8s.io/api/core/v1.Volume"}, } } @@ -418,49 +440,6 @@ func schema_pkg_apis_pipeline_v1_ChildStatusReference(ref common.ReferenceCallba } } -func schema_pkg_apis_pipeline_v1_ConfigSource(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ConfigSource identifies the source where a resource came from. This can include Git repositories, Task Bundles, file checksums, or other information that allows users to identify where the resource came from and what version was used.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "uri": { - SchemaProps: spec.SchemaProps{ - Description: "URI indicates the identity of the source of the config. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.uri Example: \"https://github.com/tektoncd/catalog\"", - Type: []string{"string"}, - Format: "", - }, - }, - "digest": { - SchemaProps: spec.SchemaProps{ - Description: "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.digest Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Allows: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "entryPoint": { - SchemaProps: spec.SchemaProps{ - Description: "EntryPoint identifies the entry point into the build. This is often a path to a configuration file and/or a target label within that file. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.entryPoint Example: \"task/git-clone/0.8/git-clone.yaml\"", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - } -} - func schema_pkg_apis_pipeline_v1_EmbeddedTask(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -512,6 +491,13 @@ func schema_pkg_apis_pipeline_v1_EmbeddedTask(ref common.ReferenceCallback) comm }, }, }, + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is a user-facing name of the task that may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "description": { SchemaProps: spec.SchemaProps{ Description: "Description is a user-facing description of the task that may be used to populate a UI.", @@ -628,6 +614,47 @@ func schema_pkg_apis_pipeline_v1_EmbeddedTask(ref common.ReferenceCallback) comm } } +func schema_pkg_apis_pipeline_v1_IncludeParams(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "IncludeParams allows passing in a specific combinations of Parameters into the Matrix.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name the specified combination", + Type: []string{"string"}, + Format: "", + }, + }, + "params": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Params takes only `Parameters` of type `\"string\"` The names of the `params` must match the names of the `params` in the underlying `Task`", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Param"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Param"}, + } +} + func schema_pkg_apis_pipeline_v1_Matrix(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -654,11 +681,30 @@ func schema_pkg_apis_pipeline_v1_Matrix(ref common.ReferenceCallback) common.Ope }, }, }, + "include": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Include is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.IncludeParams"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Param"}, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.IncludeParams", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Param"}, } } @@ -757,14 +803,14 @@ func schema_pkg_apis_pipeline_v1_ParamValue(ref common.ReferenceCallback) common Description: "ResultValue is a type alias of ParamValue", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "type": { + "Type": { SchemaProps: spec.SchemaProps{ Default: "", Type: []string{"string"}, Format: "", }, }, - "stringVal": { + "StringVal": { SchemaProps: spec.SchemaProps{ Description: "Represents the stored type of ParamValues.", Default: "", @@ -772,7 +818,7 @@ func schema_pkg_apis_pipeline_v1_ParamValue(ref common.ReferenceCallback) common Format: "", }, }, - "arrayVal": { + "ArrayVal": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ "x-kubernetes-list-type": "atomic", @@ -791,7 +837,7 @@ func schema_pkg_apis_pipeline_v1_ParamValue(ref common.ReferenceCallback) common }, }, }, - "objectVal": { + "ObjectVal": { SchemaProps: spec.SchemaProps{ Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ @@ -807,7 +853,7 @@ func schema_pkg_apis_pipeline_v1_ParamValue(ref common.ReferenceCallback) common }, }, }, - Required: []string{"type", "stringVal", "arrayVal", "objectVal"}, + Required: []string{"Type", "StringVal", "ArrayVal", "ObjectVal"}, }, }, } @@ -1120,7 +1166,7 @@ func schema_pkg_apis_pipeline_v1_PipelineRunRunStatus(ref common.ReferenceCallba "status": { SchemaProps: spec.SchemaProps{ Description: "Status is the RunStatus for the corresponding Run", - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1.RunStatus"), + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/run/v1beta1.CustomRunStatus"), }, }, "whenExpressions": { @@ -1146,7 +1192,7 @@ func schema_pkg_apis_pipeline_v1_PipelineRunRunStatus(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.WhenExpression", "github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1.RunStatus"}, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.WhenExpression", "github.com/tektoncd/pipeline/pkg/apis/run/v1beta1.CustomRunStatus"}, } } @@ -1389,6 +1435,22 @@ func schema_pkg_apis_pipeline_v1_PipelineRunStatus(ref common.ReferenceCallback) Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, }, }, @@ -1491,6 +1553,22 @@ func schema_pkg_apis_pipeline_v1_PipelineRunStatusFields(ref common.ReferenceCal Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, }, }, @@ -1553,6 +1631,13 @@ func schema_pkg_apis_pipeline_v1_PipelineSpec(ref common.ReferenceCallback) comm Description: "PipelineSpec defines the desired state of Pipeline.", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is a user-facing name of the pipeline that may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "description": { SchemaProps: spec.SchemaProps{ Description: "Description is a user-facing description of the pipeline that may be used to populate a UI.", @@ -1677,6 +1762,20 @@ func schema_pkg_apis_pipeline_v1_PipelineTask(ref common.ReferenceCallback) comm Format: "", }, }, + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is the display name of this task within the context of a Pipeline. This display name may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, + "description": { + SchemaProps: spec.SchemaProps{ + Description: "Description is the description of this task within the context of a Pipeline. This description may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "taskRef": { SchemaProps: spec.SchemaProps{ Description: "TaskRef is a reference to a task definition.", @@ -1987,7 +2086,7 @@ func schema_pkg_apis_pipeline_v1_PipelineWorkspaceDeclaration(ref common.Referen return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding. Deprecated: use PipelineWorkspaceDeclaration type instead", + Description: "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding.\n\nDeprecated: use PipelineWorkspaceDeclaration type instead", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -2042,20 +2141,69 @@ func schema_pkg_apis_pipeline_v1_Provenance(ref common.ReferenceCallback) common return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). For now, it only contains the subfield `ConfigSource` that identifies the source where a build config file came from. In future, it can be expanded as needed to include more metadata about the build. This field aims to be used to carry minimum amount of the authenticated metadata in *Run status so that Tekton Chains can pick it up and record in the provenance it generates.", + Description: "Provenance contains metadata about resources used in the TaskRun/PipelineRun such as the source from where a remote build definition was fetched. This field aims to carry minimum amoumt of metadata in *Run status so that Tekton Chains can capture them in the provenance.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "configSource": { + "refSource": { + SchemaProps: spec.SchemaProps{ + Description: "RefSource identifies the source where a remote task/pipeline came from.", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.RefSource"), + }, + }, + "featureFlags": { SchemaProps: spec.SchemaProps{ - Description: "ConfigSource identifies the source where a resource came from.", - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.ConfigSource"), + Description: "FeatureFlags identifies the feature flags that were used during the task/pipeline run", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/config.FeatureFlags"), }, }, }, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.ConfigSource"}, + "github.com/tektoncd/pipeline/pkg/apis/config.FeatureFlags", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.RefSource"}, + } +} + +func schema_pkg_apis_pipeline_v1_RefSource(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RefSource contains the information that can uniquely identify where a remote built definition came from i.e. Git repositories, Tekton Bundles in OCI registry and hub.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "uri": { + SchemaProps: spec.SchemaProps{ + Description: "URI indicates the identity of the source of the build definition. Example: \"https://github.com/tektoncd/catalog\"", + Type: []string{"string"}, + Format: "", + }, + }, + "digest": { + SchemaProps: spec.SchemaProps{ + Description: "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "entryPoint": { + SchemaProps: spec.SchemaProps{ + Description: "EntryPoint identifies the entry point into the build. This is often a path to a build definition file and/or a target label within that file. Example: \"task/git-clone/0.8/git-clone.yaml\"", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, } } @@ -3114,14 +3262,14 @@ func schema_pkg_apis_pipeline_v1_TaskRef(ref common.ReferenceCallback) common.Op }, "kind": { SchemaProps: spec.SchemaProps{ - Description: "TaskKind indicates the kind of the task, namespaced or cluster scoped.", + Description: "TaskKind indicates the Kind of the Task: 1. Namespaced Task when Kind is set to \"Task\". If Kind is \"\", it defaults to \"Task\". 2. Custom Task when Kind is non-empty and APIVersion is non-empty", Type: []string{"string"}, Format: "", }, }, "apiVersion": { SchemaProps: spec.SchemaProps{ - Description: "API version of the referent", + Description: "API version of the referent Note: A Task with non-empty APIVersion and Kind is considered a Custom Task", Type: []string{"string"}, Format: "", }, @@ -3465,7 +3613,7 @@ func schema_pkg_apis_pipeline_v1_TaskRunSpec(ref common.ReferenceCallback) commo }, "status": { SchemaProps: spec.SchemaProps{ - Description: "Used for cancelling a taskrun (and maybe more later on)", + Description: "Used for cancelling a TaskRun (and maybe more later on)", Type: []string{"string"}, Format: "", }, @@ -3477,9 +3625,16 @@ func schema_pkg_apis_pipeline_v1_TaskRunSpec(ref common.ReferenceCallback) commo Format: "", }, }, + "retries": { + SchemaProps: spec.SchemaProps{ + Description: "Retries represents how many times this TaskRun should be retried in the event of task failure.", + Type: []string{"integer"}, + Format: "int32", + }, + }, "timeout": { SchemaProps: spec.SchemaProps{ - Description: "Time after which the build times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + Description: "Time after which one retry attempt times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Duration"), }, }, @@ -3718,6 +3873,22 @@ func schema_pkg_apis_pipeline_v1_TaskRunStatus(ref common.ReferenceCallback) com Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, Required: []string{"podName"}, }, @@ -3842,6 +4013,22 @@ func schema_pkg_apis_pipeline_v1_TaskRunStatusFields(ref common.ReferenceCallbac Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, Required: []string{"podName"}, }, @@ -3908,6 +4095,13 @@ func schema_pkg_apis_pipeline_v1_TaskSpec(ref common.ReferenceCallback) common.O }, }, }, + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is a user-facing name of the task that may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "description": { SchemaProps: spec.SchemaProps{ Description: "Description is a user-facing description of the task that may be used to populate a UI.", diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/param_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/param_types.go index 2269c0896c..746cd3d4cb 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/param_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/param_types.go @@ -23,8 +23,8 @@ import ( "regexp" "strings" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" "github.com/tektoncd/pipeline/pkg/substitution" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" "knative.dev/pkg/apis" ) @@ -62,6 +62,9 @@ type ParamSpec struct { Default *ParamValue `json:"default,omitempty"` } +// ParamSpecs is a list of ParamSpec +type ParamSpecs []ParamSpec + // PropertySpec defines the struct for object keys type PropertySpec struct { Type ParamType `json:"type,omitempty"` @@ -107,16 +110,253 @@ func (pp *ParamSpec) setDefaultsForProperties() { } } -// ResourceParam declares a string value to use for the parameter called Name, and is used in -// the specific context of PipelineResources. -type ResourceParam = resource.ResourceParam - // Param declares an ParamValues to use for the parameter called name. type Param struct { Name string `json:"name"` Value ParamValue `json:"value"` } +// ExtractNames returns a set of unique names +func (ps Params) ExtractNames() sets.String { + names := sets.String{} + for _, p := range ps { + names.Insert(p.Name) + } + return names +} + +func (ps Params) extractValues() []string { + pvs := []string{} + for i := range ps { + pvs = append(pvs, ps[i].Value.StringVal) + pvs = append(pvs, ps[i].Value.ArrayVal...) + for _, v := range ps[i].Value.ObjectVal { + pvs = append(pvs, v) + } + } + return pvs +} + +// extractParamMapArrVals creates a param map with the key: param.Name and +// val: param.Value.ArrayVal +func (ps Params) extractParamMapArrVals() map[string][]string { + paramsMap := make(map[string][]string) + for _, p := range ps { + paramsMap[p.Name] = p.Value.ArrayVal + } + return paramsMap +} + +// Params is a list of Param +type Params []Param + +// extractParamArrayLengths extract and return the lengths of all array params +// Example of returned value: {"a-array-params": 2,"b-array-params": 2 } +func (ps Params) extractParamArrayLengths() map[string]int { + // Collect all array params + arrayParamsLengths := make(map[string]int) + + // Collect array params lengths from params + for _, p := range ps { + if p.Value.Type == ParamTypeArray { + arrayParamsLengths[p.Name] = len(p.Value.ArrayVal) + } + } + return arrayParamsLengths +} + +// validateDuplicateParameters checks if a parameter with the same name is defined more than once +func (ps Params) validateDuplicateParameters() (errs *apis.FieldError) { + taskParamNames := sets.NewString() + for i, param := range ps { + if taskParamNames.Has(param.Name) { + errs = errs.Also(apis.ErrGeneric(fmt.Sprintf("parameter names must be unique,"+ + " the parameter \"%s\" is also defined at", param.Name), fmt.Sprintf("[%d].name", i))) + } + taskParamNames.Insert(param.Name) + } + return errs +} + +// extractParamArrayLengths extract and return the lengths of all array params +// Example of returned value: {"a-array-params": 2,"b-array-params": 2 } +func (ps ParamSpecs) extractParamArrayLengths() map[string]int { + // Collect all array params + arrayParamsLengths := make(map[string]int) + + // Collect array params lengths from defaults + for _, p := range ps { + if p.Default != nil { + if p.Default.Type == ParamTypeArray { + arrayParamsLengths[p.Name] = len(p.Default.ArrayVal) + } + } + } + return arrayParamsLengths +} + +// validateOutofBoundArrayParams validates if the array indexing params are out of bound +// example of arrayIndexingParams: ["$(params.a-array-param[1])", "$(params.b-array-param[2])"] +// example of arrayParamsLengths: {"a-array-params": 2,"b-array-params": 2 } +func validateOutofBoundArrayParams(arrayIndexingParams []string, arrayParamsLengths map[string]int) error { + outofBoundParams := sets.String{} + for _, val := range arrayIndexingParams { + indexString := substitution.ExtractIndexString(val) + idx, _ := substitution.ExtractIndex(indexString) + // this will extract the param name from reference + // e.g. $(params.a-array-param[1]) -> a-array-param + paramName, _, _ := substitution.ExtractVariablesFromString(substitution.TrimArrayIndex(val), "params") + + if paramLength, ok := arrayParamsLengths[paramName[0]]; ok { + if idx >= paramLength { + outofBoundParams.Insert(val) + } + } + } + if outofBoundParams.Len() > 0 { + return fmt.Errorf("non-existent param references:%v", outofBoundParams.List()) + } + return nil +} + +// extractArrayIndexingParamRefs takes a string of the form `foo-$(params.array-param[1])-bar` and extracts the portions of the string that reference an element in an array param. +// For example, for the string “foo-$(params.array-param[1])-bar-$(params.other-array-param[2])-$(params.string-param)`, +// it would return ["$(params.array-param[1])", "$(params.other-array-param[2])"]. +func extractArrayIndexingParamRefs(paramReference string) []string { + l := []string{} + list := substitution.ExtractParamsExpressions(paramReference) + for _, val := range list { + indexString := substitution.ExtractIndexString(val) + if indexString != "" { + l = append(l, val) + } + } + return l +} + +// extractParamRefsFromSteps get all array indexing references from steps +func extractParamRefsFromSteps(steps []Step) []string { + paramsRefs := []string{} + for _, step := range steps { + paramsRefs = append(paramsRefs, step.Script) + container := step.ToK8sContainer() + paramsRefs = append(paramsRefs, extractParamRefsFromContainer(container)...) + } + return paramsRefs +} + +// extractParamRefsFromStepTemplate get all array indexing references from StepsTemplate +func extractParamRefsFromStepTemplate(stepTemplate *StepTemplate) []string { + if stepTemplate == nil { + return nil + } + container := stepTemplate.ToK8sContainer() + return extractParamRefsFromContainer(container) +} + +// extractParamRefsFromSidecars get all array indexing references from sidecars +func extractParamRefsFromSidecars(sidecars []Sidecar) []string { + paramsRefs := []string{} + for _, s := range sidecars { + paramsRefs = append(paramsRefs, s.Script) + container := s.ToK8sContainer() + paramsRefs = append(paramsRefs, extractParamRefsFromContainer(container)...) + } + return paramsRefs +} + +// extractParamRefsFromVolumes get all array indexing references from volumes +func extractParamRefsFromVolumes(volumes []corev1.Volume) []string { + paramsRefs := []string{} + for i, v := range volumes { + paramsRefs = append(paramsRefs, v.Name) + if v.VolumeSource.ConfigMap != nil { + paramsRefs = append(paramsRefs, v.ConfigMap.Name) + for _, item := range v.ConfigMap.Items { + paramsRefs = append(paramsRefs, item.Key) + paramsRefs = append(paramsRefs, item.Path) + } + } + if v.VolumeSource.Secret != nil { + paramsRefs = append(paramsRefs, v.Secret.SecretName) + for _, item := range v.Secret.Items { + paramsRefs = append(paramsRefs, item.Key) + paramsRefs = append(paramsRefs, item.Path) + } + } + if v.PersistentVolumeClaim != nil { + paramsRefs = append(paramsRefs, v.PersistentVolumeClaim.ClaimName) + } + if v.Projected != nil { + for _, s := range volumes[i].Projected.Sources { + if s.ConfigMap != nil { + paramsRefs = append(paramsRefs, s.ConfigMap.Name) + } + if s.Secret != nil { + paramsRefs = append(paramsRefs, s.Secret.Name) + } + if s.ServiceAccountToken != nil { + paramsRefs = append(paramsRefs, s.ServiceAccountToken.Audience) + } + } + } + if v.CSI != nil { + if v.CSI.NodePublishSecretRef != nil { + paramsRefs = append(paramsRefs, v.CSI.NodePublishSecretRef.Name) + } + if v.CSI.VolumeAttributes != nil { + for _, value := range v.CSI.VolumeAttributes { + paramsRefs = append(paramsRefs, value) + } + } + } + } + return paramsRefs +} + +// extractParamRefsFromContainer get all array indexing references from container +func extractParamRefsFromContainer(c *corev1.Container) []string { + paramsRefs := []string{} + paramsRefs = append(paramsRefs, c.Name) + paramsRefs = append(paramsRefs, c.Image) + paramsRefs = append(paramsRefs, string(c.ImagePullPolicy)) + paramsRefs = append(paramsRefs, c.Args...) + + for ie, e := range c.Env { + paramsRefs = append(paramsRefs, e.Value) + if c.Env[ie].ValueFrom != nil { + if e.ValueFrom.SecretKeyRef != nil { + paramsRefs = append(paramsRefs, e.ValueFrom.SecretKeyRef.LocalObjectReference.Name) + paramsRefs = append(paramsRefs, e.ValueFrom.SecretKeyRef.Key) + } + if e.ValueFrom.ConfigMapKeyRef != nil { + paramsRefs = append(paramsRefs, e.ValueFrom.ConfigMapKeyRef.LocalObjectReference.Name) + paramsRefs = append(paramsRefs, e.ValueFrom.ConfigMapKeyRef.Key) + } + } + } + + for _, e := range c.EnvFrom { + paramsRefs = append(paramsRefs, e.Prefix) + if e.ConfigMapRef != nil { + paramsRefs = append(paramsRefs, e.ConfigMapRef.LocalObjectReference.Name) + } + if e.SecretRef != nil { + paramsRefs = append(paramsRefs, e.SecretRef.LocalObjectReference.Name) + } + } + + paramsRefs = append(paramsRefs, c.WorkingDir) + paramsRefs = append(paramsRefs, c.Command...) + + for _, v := range c.VolumeMounts { + paramsRefs = append(paramsRefs, v.Name) + paramsRefs = append(paramsRefs, v.MountPath) + paramsRefs = append(paramsRefs, v.SubPath) + } + return paramsRefs +} + // ParamType indicates the type of an input parameter; // Used to distinguish between a single string and an array of strings. type ParamType string @@ -137,11 +377,11 @@ var AllParamTypes = []ParamType{ParamTypeString, ParamTypeArray, ParamTypeObject // Used in JSON unmarshalling so that a single JSON field can accept // either an individual string or an array of strings. type ParamValue struct { - Type ParamType `json:"type"` // Represents the stored type of ParamValues. - StringVal string `json:"stringVal"` + Type ParamType // Represents the stored type of ParamValues. + StringVal string // +listType=atomic - ArrayVal []string `json:"arrayVal"` - ObjectVal map[string]string `json:"objectVal"` + ArrayVal []string + ObjectVal map[string]string } // UnmarshalJSON implements the json.Unmarshaller interface. @@ -214,6 +454,8 @@ func (paramValues *ParamValue) ApplyReplacements(stringReplacements map[string]s newObjectVal[k] = substitution.ApplyReplacements(v, stringReplacements) } paramValues.ObjectVal = newObjectVal + case ParamTypeString: + fallthrough default: paramValues.applyOrCorrect(stringReplacements, arrayReplacements, objectReplacements) } @@ -291,12 +533,9 @@ func ArrayReference(a string) string { // validatePipelineParametersVariablesInTaskParameters validates param value that // may contain the reference(s) to other params to make sure those references are used appropriately. -func validatePipelineParametersVariablesInTaskParameters(params []Param, prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { - taskParamNames := sets.NewString() - for i, param := range params { - if taskParamNames.Has(param.Name) { - errs = errs.Also(apis.ErrGeneric(fmt.Sprintf("params names must be unique, the same param: %s is defined multiple times at", param.Name), fmt.Sprintf("params[%d].name", i))) - } +func validatePipelineParametersVariablesInTaskParameters(params Params, prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { + errs = errs.Also(params.validateDuplicateParameters()).ViaField("params") + for _, param := range params { switch param.Value.Type { case ParamTypeArray: for idx, arrayElement := range param.Value.ArrayVal { @@ -306,47 +545,11 @@ func validatePipelineParametersVariablesInTaskParameters(params []Param, prefix for key, val := range param.Value.ObjectVal { errs = errs.Also(validateStringVariable(val, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldKey("properties", key).ViaFieldKey("params", param.Name)) } + case ParamTypeString: + fallthrough default: errs = errs.Also(validateParamStringValue(param, prefix, paramNames, arrayParamNames, objectParamNameKeys)) } - taskParamNames.Insert(param.Name) - } - return errs -} - -// validatePipelineParametersVariablesInMatrixParameters validates matrix param value -// that may contain the reference(s) to other params to make sure those references are used appropriately. -func validatePipelineParametersVariablesInMatrixParameters(matrix []Param, prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { - for _, param := range matrix { - for idx, arrayElement := range param.Value.ArrayVal { - errs = errs.Also(validateArrayVariable(arrayElement, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldIndex("value", idx).ViaFieldKey("matrix", param.Name)) - } - } - return errs -} - -func validateParametersInTaskMatrix(matrix *Matrix) (errs *apis.FieldError) { - if matrix != nil { - for _, param := range matrix.Params { - if param.Value.Type != ParamTypeArray { - errs = errs.Also(apis.ErrInvalidValue("parameters of type array only are allowed in matrix", "").ViaFieldKey("matrix", param.Name)) - } - } - } - return errs -} - -func validateParameterInOneOfMatrixOrParams(matrix *Matrix, params []Param) (errs *apis.FieldError) { - matrixParameterNames := sets.NewString() - if matrix != nil { - for _, param := range matrix.Params { - matrixParameterNames.Insert(param.Name) - } - } - for _, param := range params { - if matrixParameterNames.Has(param.Name) { - errs = errs.Also(apis.ErrMultipleOneOf("matrix["+param.Name+"]", "params["+param.Name+"]")) - } } return errs } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_defaults.go index 594e1761e5..a6c7190e8e 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_defaults.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_defaults.go @@ -19,6 +19,7 @@ package v1 import ( "context" + "github.com/tektoncd/pipeline/pkg/apis/config" "knative.dev/pkg/apis" ) @@ -36,25 +37,27 @@ func (ps *PipelineSpec) SetDefaults(ctx context.Context) { } for _, pt := range ps.Tasks { - if pt.TaskRef != nil { - if pt.TaskRef.Kind == "" { - pt.TaskRef.Kind = NamespacedTaskKind - } - } - if pt.TaskSpec != nil { - pt.TaskSpec.SetDefaults(ctx) - } + pt.SetDefaults(ctx) } for _, ft := range ps.Finally { ctx := ctx // Ensure local scoping per Task - if ft.TaskRef != nil { - if ft.TaskRef.Kind == "" { - ft.TaskRef.Kind = NamespacedTaskKind - } + ft.SetDefaults(ctx) + } +} + +// SetDefaults sets default values for a PipelineTask +func (pt *PipelineTask) SetDefaults(ctx context.Context) { + cfg := config.FromContextOrDefaults(ctx) + if pt.TaskRef != nil { + if pt.TaskRef.Kind == "" { + pt.TaskRef.Kind = NamespacedTaskKind } - if ft.TaskSpec != nil { - ft.TaskSpec.SetDefaults(ctx) + if pt.TaskRef.Name == "" && pt.TaskRef.Resolver == "" { + pt.TaskRef.Resolver = ResolverName(cfg.Defaults.DefaultResolverType) } } + if pt.TaskSpec != nil { + pt.TaskSpec.SetDefaults(ctx) + } } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_types.go index f6420521c6..d338944881 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_types.go @@ -17,21 +17,12 @@ limitations under the License. package v1 import ( - "context" - "fmt" - "strings" - - "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" - "github.com/tektoncd/pipeline/pkg/apis/version" - "github.com/tektoncd/pipeline/pkg/reconciler/pipeline/dag" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/validation" - "knative.dev/pkg/apis" "knative.dev/pkg/kmeta" ) @@ -81,6 +72,10 @@ func (*Pipeline) GetGroupVersionKind() schema.GroupVersionKind { // PipelineSpec defines the desired state of Pipeline. type PipelineSpec struct { + // DisplayName is a user-facing name of the pipeline that may be + // used to populate a UI. + // +optional + DisplayName string `json:"displayName,omitempty"` // Description is a user-facing description of the pipeline that may be // used to populate a UI. // +optional @@ -91,7 +86,7 @@ type PipelineSpec struct { // Params declares a list of input parameters that must be supplied when // this Pipeline is run. // +listType=atomic - Params []ParamSpec `json:"params,omitempty"` + Params ParamSpecs `json:"params,omitempty"` // Workspaces declares a set of named workspaces that are expected to be // provided by a PipelineRun. // +optional @@ -160,6 +155,16 @@ type PipelineTask struct { // the execution order of tasks relative to one another. Name string `json:"name,omitempty"` + // DisplayName is the display name of this task within the context of a Pipeline. + // This display name may be used to populate a UI. + // +optional + DisplayName string `json:"displayName,omitempty"` + + // Description is the description of this task within the context of a Pipeline. + // This description may be used to populate a UI. + // +optional + Description string `json:"description,omitempty"` + // TaskRef is a reference to a task definition. // +optional TaskRef *TaskRef `json:"taskRef,omitempty"` @@ -185,7 +190,7 @@ type PipelineTask struct { // Parameters declares parameters passed to this task. // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` // Matrix declares parameters used to fan out this task. // +optional @@ -204,246 +209,16 @@ type PipelineTask struct { Timeout *metav1.Duration `json:"timeout,omitempty"` } -// Matrix is used to fan out Tasks in a Pipeline -type Matrix struct { - // Params is a list of parameters used to fan out the pipelineTask - // Params takes only `Parameters` of type `"array"` - // Each array element is supplied to the `PipelineTask` by substituting `params` of type `"string"` in the underlying `Task`. - // The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting. - // +listType=atomic - Params []Param `json:"params,omitempty"` -} - -// validateRefOrSpec validates at least one of taskRef or taskSpec is specified -func (pt PipelineTask) validateRefOrSpec() (errs *apis.FieldError) { - // can't have both taskRef and taskSpec at the same time - if pt.TaskRef != nil && pt.TaskSpec != nil { - errs = errs.Also(apis.ErrMultipleOneOf("taskRef", "taskSpec")) - } - // Check that one of TaskRef and TaskSpec is present - if pt.TaskRef == nil && pt.TaskSpec == nil { - errs = errs.Also(apis.ErrMissingOneOf("taskRef", "taskSpec")) - } - return errs -} - -// validateCustomTask validates custom task specifications - checking kind and fail if not yet supported features specified -func (pt PipelineTask) validateCustomTask() (errs *apis.FieldError) { - if pt.TaskRef != nil && pt.TaskRef.Kind == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify kind", "taskRef.kind")) - } - if pt.TaskSpec != nil && pt.TaskSpec.Kind == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify kind", "taskSpec.kind")) - } - if pt.TaskRef != nil && pt.TaskRef.APIVersion == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify apiVersion", "taskRef.apiVersion")) - } - if pt.TaskSpec != nil && pt.TaskSpec.APIVersion == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify apiVersion", "taskSpec.apiVersion")) - } - return errs -} - -// validateTask validates a pipeline task or a final task for taskRef and taskSpec -func (pt PipelineTask) validateTask(ctx context.Context) (errs *apis.FieldError) { - cfg := config.FromContextOrDefaults(ctx) - // Validate TaskSpec if it's present - if pt.TaskSpec != nil { - errs = errs.Also(pt.TaskSpec.Validate(ctx).ViaField("taskSpec")) - } - if pt.TaskRef != nil { - if pt.TaskRef.Name != "" { - // TaskRef name must be a valid k8s name - if errSlice := validation.IsQualifiedName(pt.TaskRef.Name); len(errSlice) != 0 { - errs = errs.Also(apis.ErrInvalidValue(strings.Join(errSlice, ","), "name")) - } - } else if pt.TaskRef.Resolver == "" { - errs = errs.Also(apis.ErrInvalidValue("taskRef must specify name", "taskRef.name")) - } - if cfg.FeatureFlags.EnableAPIFields != config.BetaAPIFields && cfg.FeatureFlags.EnableAPIFields != config.AlphaAPIFields { - // fail if resolver or resource are present when enable-api-fields is false. - if pt.TaskRef.Resolver != "" { - errs = errs.Also(apis.ErrDisallowedFields("taskref.resolver")) - } - if len(pt.TaskRef.Params) > 0 { - errs = errs.Also(apis.ErrDisallowedFields("taskref.params")) - } - } - } - return errs +// IsCustomTask checks whether an embedded TaskSpec is a Custom Task +func (et *EmbeddedTask) IsCustomTask() bool { + // Note that if `apiVersion` is set to `"tekton.dev/v1beta1"` and `kind` is set to `"Task"`, + // the reference will be considered a Custom Task - https://github.com/tektoncd/pipeline/issues/6457 + return et != nil && et.APIVersion != "" && et.Kind != "" } // IsMatrixed return whether pipeline task is matrixed func (pt *PipelineTask) IsMatrixed() bool { - return pt.Matrix != nil && len(pt.Matrix.Params) > 0 -} - -func (pt *PipelineTask) validateMatrix(ctx context.Context) (errs *apis.FieldError) { - if pt.IsMatrixed() { - // This is an alpha feature and will fail validation if it's used in a pipeline spec - // when the enable-api-fields feature gate is anything but "alpha". - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "matrix", config.AlphaAPIFields)) - // Matrix requires "embedded-status" feature gate to be set to "minimal", and will fail - // validation if it is anything but "minimal". - errs = errs.Also(ValidateEmbeddedStatus(ctx, "matrix", config.MinimalEmbeddedStatus)) - errs = errs.Also(pt.validateMatrixCombinationsCount(ctx)) - } - errs = errs.Also(validateParameterInOneOfMatrixOrParams(pt.Matrix, pt.Params)) - errs = errs.Also(validateParametersInTaskMatrix(pt.Matrix)) - return errs -} - -func (pt *PipelineTask) validateMatrixCombinationsCount(ctx context.Context) (errs *apis.FieldError) { - matrixCombinationsCount := pt.GetMatrixCombinationsCount() - maxMatrixCombinationsCount := config.FromContextOrDefaults(ctx).Defaults.DefaultMaxMatrixCombinationsCount - if matrixCombinationsCount > maxMatrixCombinationsCount { - errs = errs.Also(apis.ErrOutOfBoundsValue(matrixCombinationsCount, 0, maxMatrixCombinationsCount, "matrix")) - } - return errs -} - -func (pt PipelineTask) validateEmbeddedOrType() (errs *apis.FieldError) { - // Reject cases where APIVersion and/or Kind are specified alongside an embedded Task. - // We determine if this is an embedded Task by checking of TaskSpec.TaskSpec.Steps has items. - if pt.TaskSpec != nil && len(pt.TaskSpec.TaskSpec.Steps) > 0 { - if pt.TaskSpec.APIVersion != "" { - errs = errs.Also(&apis.FieldError{ - Message: "taskSpec.apiVersion cannot be specified when using taskSpec.steps", - Paths: []string{"taskSpec.apiVersion"}, - }) - } - if pt.TaskSpec.Kind != "" { - errs = errs.Also(&apis.FieldError{ - Message: "taskSpec.kind cannot be specified when using taskSpec.steps", - Paths: []string{"taskSpec.kind"}, - }) - } - } - return -} - -// GetMatrixCombinationsCount returns the count of combinations of Parameters generated from the Matrix in PipelineTask. -func (pt *PipelineTask) GetMatrixCombinationsCount() int { - if !pt.IsMatrixed() { - return 0 - } - count := 1 - for _, param := range pt.Matrix.Params { - count *= len(param.Value.ArrayVal) - } - return count -} - -func (pt *PipelineTask) validateResultsFromMatrixedPipelineTasksNotConsumed(matrixedPipelineTasks sets.String) (errs *apis.FieldError) { - for _, ref := range PipelineTaskResultRefs(pt) { - if matrixedPipelineTasks.Has(ref.PipelineTask) { - errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("consuming results from matrixed task %s is not allowed", ref.PipelineTask), "")) - } - } - return errs -} - -func (pt *PipelineTask) validateExecutionStatusVariablesDisallowed() (errs *apis.FieldError) { - for _, param := range pt.Params { - if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { - errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, "value"). - ViaFieldKey("params", param.Name)) - } - } - for i, we := range pt.When { - if expressions, ok := we.GetVarSubstitutionExpressions(); ok { - errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, ""). - ViaFieldIndex("when", i)) - } - } - return errs -} - -func (pt *PipelineTask) validateExecutionStatusVariablesAllowed(ptNames sets.String) (errs *apis.FieldError) { - for _, param := range pt.Params { - if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { - errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, "value"). - ViaFieldKey("params", param.Name)) - } - } - for i, we := range pt.When { - if expressions, ok := we.GetVarSubstitutionExpressions(); ok { - errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, ""). - ViaFieldIndex("when", i)) - } - } - return errs -} - -func validateContainsExecutionStatusVariablesDisallowed(expressions []string, path string) (errs *apis.FieldError) { - if containsExecutionStatusReferences(expressions) { - errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline tasks can not refer to execution status"+ - " of any other pipeline task or aggregate status of tasks"), path)) - } - return errs -} - -func containsExecutionStatusReferences(expressions []string) bool { - // validate tasks.pipelineTask.status/tasks.status if this expression is not a result reference - if !LooksLikeContainsResultRefs(expressions) { - for _, e := range expressions { - // check if it contains context variable accessing execution status - $(tasks.taskname.status) - // or an aggregate status - $(tasks.status) - if containsExecutionStatusRef(e) { - return true - } - } - } - return false -} - -func validateExecutionStatusVariablesExpressions(expressions []string, ptNames sets.String, fieldPath string) (errs *apis.FieldError) { - // validate tasks.pipelineTask.status if this expression is not a result reference - if !LooksLikeContainsResultRefs(expressions) { - for _, expression := range expressions { - // its a reference to aggregate status of dag tasks - $(tasks.status) - if expression == PipelineTasksAggregateStatus { - continue - } - // check if it contains context variable accessing execution status - $(tasks.taskname.status) - if containsExecutionStatusRef(expression) { - // strip tasks. and .status from tasks.taskname.status to further verify task name - pt := strings.TrimSuffix(strings.TrimPrefix(expression, "tasks."), ".status") - // report an error if the task name does not exist in the list of dag tasks - if !ptNames.Has(pt) { - errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline task %s is not defined in the pipeline", pt), fieldPath)) - } - } - } - } - return errs -} - -func (pt *PipelineTask) validateWorkspaces(workspaceNames sets.String) (errs *apis.FieldError) { - workspaceBindingNames := sets.NewString() - for i, ws := range pt.Workspaces { - if workspaceBindingNames.Has(ws.Name) { - errs = errs.Also(apis.ErrGeneric( - fmt.Sprintf("workspace name %q must be unique", ws.Name), "").ViaFieldIndex("workspaces", i)) - } - - if ws.Workspace == "" { - if !workspaceNames.Has(ws.Name) { - errs = errs.Also(apis.ErrInvalidValue( - fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Name), - "", - ).ViaFieldIndex("workspaces", i)) - } - } else if !workspaceNames.Has(ws.Workspace) { - errs = errs.Also(apis.ErrInvalidValue( - fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Workspace), - "", - ).ViaFieldIndex("workspaces", i)) - } - - workspaceBindingNames.Insert(ws.Name) - } - return errs + return pt.Matrix.HasParams() || pt.Matrix.HasInclude() } // TaskSpecMetadata returns the metadata of the PipelineTask's EmbeddedTask spec. @@ -456,40 +231,6 @@ func (pt PipelineTask) HashKey() string { return pt.Name } -// ValidateName checks whether the PipelineTask's name is a valid DNS label -func (pt PipelineTask) ValidateName() *apis.FieldError { - if err := validation.IsDNS1123Label(pt.Name); len(err) > 0 { - return &apis.FieldError{ - Message: fmt.Sprintf("invalid value %q", pt.Name), - Paths: []string{"name"}, - Details: "Pipeline Task name must be a valid DNS Label." + - "For more info refer to https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", - } - } - return nil -} - -// Validate classifies whether a task is a custom task or a regular task(dag/final) -// calls the validation routine based on the type of the task -func (pt PipelineTask) Validate(ctx context.Context) (errs *apis.FieldError) { - errs = errs.Also(pt.validateRefOrSpec()) - - errs = errs.Also(pt.validateEmbeddedOrType()) - - cfg := config.FromContextOrDefaults(ctx) - // If EnableCustomTasks feature flag is on, validate custom task specifications - // pipeline task having taskRef with APIVersion is classified as custom task - switch { - case cfg.FeatureFlags.EnableCustomTasks && pt.TaskRef != nil && pt.TaskRef.APIVersion != "": - errs = errs.Also(pt.validateCustomTask()) - case cfg.FeatureFlags.EnableCustomTasks && pt.TaskSpec != nil && pt.TaskSpec.APIVersion != "": - errs = errs.Also(pt.validateCustomTask()) - default: - errs = errs.Also(pt.validateTask(ctx)) - } - return -} - // Deps returns all other PipelineTask dependencies of this PipelineTask, based on resource usage or ordering func (pt PipelineTask) Deps() []string { // hold the list of dependencies in a set to avoid duplicates @@ -543,22 +284,6 @@ func (l PipelineTaskList) Names() sets.String { return names } -// Validate a list of pipeline tasks including custom task -func (l PipelineTaskList) Validate(ctx context.Context, taskNames sets.String, path string) (errs *apis.FieldError) { - for i, t := range l { - // validate pipeline task name - errs = errs.Also(t.ValidateName().ViaFieldIndex(path, i)) - // names cannot be duplicated - checking that pipelineTask names are unique - if _, ok := taskNames[t.Name]; ok { - errs = errs.Also(apis.ErrMultipleOneOf("name").ViaFieldIndex(path, i)) - } - taskNames.Insert(t.Name) - // validate custom task, dag, or final task - errs = errs.Also(t.Validate(ctx).ViaFieldIndex(path, i)) - } - return errs -} - // PipelineTaskParam is used to provide arbitrary string parameters to a Task. type PipelineTaskParam struct { Name string `json:"name"` diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_validation.go index 6c6da8cc37..0c60fae33b 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipeline_validation.go @@ -23,11 +23,13 @@ import ( "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/validate" + "github.com/tektoncd/pipeline/pkg/apis/version" "github.com/tektoncd/pipeline/pkg/reconciler/pipeline/dag" "github.com/tektoncd/pipeline/pkg/substitution" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/validation" "knative.dev/pkg/apis" "knative.dev/pkg/webhook/resourcesemantics" ) @@ -89,6 +91,181 @@ func ValidatePipelineTasks(ctx context.Context, tasks []PipelineTask, finalTasks return errs } +// Validate a list of pipeline tasks including custom task +func (l PipelineTaskList) Validate(ctx context.Context, taskNames sets.String, path string) (errs *apis.FieldError) { + for i, t := range l { + // validate pipeline task name + errs = errs.Also(t.ValidateName().ViaFieldIndex(path, i)) + // names cannot be duplicated - checking that pipelineTask names are unique + if _, ok := taskNames[t.Name]; ok { + errs = errs.Also(apis.ErrMultipleOneOf("name").ViaFieldIndex(path, i)) + } + taskNames.Insert(t.Name) + // validate custom task, dag, or final task + errs = errs.Also(t.Validate(ctx).ViaFieldIndex(path, i)) + } + return errs +} + +// ValidateName checks whether the PipelineTask's name is a valid DNS label +func (pt PipelineTask) ValidateName() *apis.FieldError { + if err := validation.IsDNS1123Label(pt.Name); len(err) > 0 { + return &apis.FieldError{ + Message: fmt.Sprintf("invalid value %q", pt.Name), + Paths: []string{"name"}, + Details: "Pipeline Task name must be a valid DNS Label." + + "For more info refer to https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + } + } + return nil +} + +// Validate classifies whether a task is a custom task or a regular task(dag/final) +// calls the validation routine based on the type of the task +func (pt PipelineTask) Validate(ctx context.Context) (errs *apis.FieldError) { + errs = errs.Also(pt.validateRefOrSpec()) + + errs = errs.Also(pt.validateEmbeddedOrType()) + + // Pipeline task having taskRef/taskSpec with APIVersion is classified as custom task + switch { + case pt.TaskRef != nil && pt.TaskRef.APIVersion != "": + errs = errs.Also(pt.validateCustomTask()) + case pt.TaskSpec != nil && pt.TaskSpec.APIVersion != "": + errs = errs.Also(pt.validateCustomTask()) + default: + errs = errs.Also(pt.validateTask(ctx)) + } + return +} + +func (pt *PipelineTask) validateMatrix(ctx context.Context) (errs *apis.FieldError) { + if pt.IsMatrixed() { + // This is an alpha feature and will fail validation if it's used in a pipeline spec + // when the enable-api-fields feature gate is anything but "alpha". + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "matrix", config.AlphaAPIFields)) + errs = errs.Also(pt.Matrix.validateCombinationsCount(ctx)) + } + errs = errs.Also(pt.Matrix.validateParameterInOneOfMatrixOrParams(pt.Params)) + errs = errs.Also(pt.Matrix.validateParams()) + return errs +} + +func (pt PipelineTask) validateEmbeddedOrType() (errs *apis.FieldError) { + // Reject cases where APIVersion and/or Kind are specified alongside an embedded Task. + // We determine if this is an embedded Task by checking of TaskSpec.TaskSpec.Steps has items. + if pt.TaskSpec != nil && len(pt.TaskSpec.TaskSpec.Steps) > 0 { + if pt.TaskSpec.APIVersion != "" { + errs = errs.Also(&apis.FieldError{ + Message: "taskSpec.apiVersion cannot be specified when using taskSpec.steps", + Paths: []string{"taskSpec.apiVersion"}, + }) + } + if pt.TaskSpec.Kind != "" { + errs = errs.Also(&apis.FieldError{ + Message: "taskSpec.kind cannot be specified when using taskSpec.steps", + Paths: []string{"taskSpec.kind"}, + }) + } + } + return +} + +func (pt *PipelineTask) validateResultsFromMatrixedPipelineTasksNotConsumed(matrixedPipelineTasks sets.String) (errs *apis.FieldError) { + for _, ref := range PipelineTaskResultRefs(pt) { + if matrixedPipelineTasks.Has(ref.PipelineTask) { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("consuming results from matrixed task %s is not allowed", ref.PipelineTask), "")) + } + } + return errs +} + +func (pt *PipelineTask) validateWorkspaces(workspaceNames sets.String) (errs *apis.FieldError) { + workspaceBindingNames := sets.NewString() + for i, ws := range pt.Workspaces { + if workspaceBindingNames.Has(ws.Name) { + errs = errs.Also(apis.ErrGeneric( + fmt.Sprintf("workspace name %q must be unique", ws.Name), "").ViaFieldIndex("workspaces", i)) + } + + if ws.Workspace == "" { + if !workspaceNames.Has(ws.Name) { + errs = errs.Also(apis.ErrInvalidValue( + fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Name), + "", + ).ViaFieldIndex("workspaces", i)) + } + } else if !workspaceNames.Has(ws.Workspace) { + errs = errs.Also(apis.ErrInvalidValue( + fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Workspace), + "", + ).ViaFieldIndex("workspaces", i)) + } + + workspaceBindingNames.Insert(ws.Name) + } + return errs +} + +// validateRefOrSpec validates at least one of taskRef or taskSpec is specified +func (pt PipelineTask) validateRefOrSpec() (errs *apis.FieldError) { + // can't have both taskRef and taskSpec at the same time + if pt.TaskRef != nil && pt.TaskSpec != nil { + errs = errs.Also(apis.ErrMultipleOneOf("taskRef", "taskSpec")) + } + // Check that one of TaskRef and TaskSpec is present + if pt.TaskRef == nil && pt.TaskSpec == nil { + errs = errs.Also(apis.ErrMissingOneOf("taskRef", "taskSpec")) + } + return errs +} + +// validateCustomTask validates custom task specifications - checking kind and fail if not yet supported features specified +func (pt PipelineTask) validateCustomTask() (errs *apis.FieldError) { + if pt.TaskRef != nil && pt.TaskRef.Kind == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify kind", "taskRef.kind")) + } + if pt.TaskSpec != nil && pt.TaskSpec.Kind == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify kind", "taskSpec.kind")) + } + if pt.TaskRef != nil && pt.TaskRef.APIVersion == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify apiVersion", "taskRef.apiVersion")) + } + if pt.TaskSpec != nil && pt.TaskSpec.APIVersion == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify apiVersion", "taskSpec.apiVersion")) + } + return errs +} + +// validateTask validates a pipeline task or a final task for taskRef and taskSpec +func (pt PipelineTask) validateTask(ctx context.Context) (errs *apis.FieldError) { + cfg := config.FromContextOrDefaults(ctx) + // Validate TaskSpec if it's present + if pt.TaskSpec != nil { + errs = errs.Also(pt.TaskSpec.Validate(ctx).ViaField("taskSpec")) + } + if pt.TaskRef != nil { + if pt.TaskRef.Name != "" { + // TaskRef name must be a valid k8s name + if errSlice := validation.IsQualifiedName(pt.TaskRef.Name); len(errSlice) != 0 { + errs = errs.Also(apis.ErrInvalidValue(strings.Join(errSlice, ","), "name")) + } + } else if pt.TaskRef.Resolver == "" { + errs = errs.Also(apis.ErrInvalidValue("taskRef must specify name", "taskRef.name")) + } + if cfg.FeatureFlags.EnableAPIFields != config.BetaAPIFields && cfg.FeatureFlags.EnableAPIFields != config.AlphaAPIFields { + // fail if resolver or resource are present when enable-api-fields is false. + if pt.TaskRef.Resolver != "" { + errs = errs.Also(apis.ErrDisallowedFields("taskref.resolver")) + } + if len(pt.TaskRef.Params) > 0 { + errs = errs.Also(apis.ErrDisallowedFields("taskref.params")) + } + } + } + return errs +} + // validatePipelineWorkspacesDeclarations validates the specified workspaces, ensuring having unique name without any // empty string, func validatePipelineWorkspacesDeclarations(wss []PipelineWorkspaceDeclaration) (errs *apis.FieldError) { @@ -111,7 +288,7 @@ func validatePipelineWorkspacesDeclarations(wss []PipelineWorkspaceDeclaration) // validatePipelineWorkspacesUsage validates that all the referenced workspaces (by pipeline tasks) are specified in // the pipeline func validatePipelineWorkspacesUsage(ctx context.Context, wss []PipelineWorkspaceDeclaration, pts []PipelineTask) (errs *apis.FieldError) { - if config.ValidateParameterVariablesAndWorkspaces(ctx) == false { + if !config.ValidateParameterVariablesAndWorkspaces(ctx) { return nil } workspaceNames := sets.NewString() @@ -152,7 +329,7 @@ func ValidatePipelineParameterVariables(ctx context.Context, tasks []PipelineTas } } } - if config.ValidateParameterVariablesAndWorkspaces(ctx) == true { + if config.ValidateParameterVariablesAndWorkspaces(ctx) { errs = errs.Also(validatePipelineParametersVariables(tasks, "params", parameterNames, arrayParameterNames, objectParameterNameKeys)) } return errs @@ -162,7 +339,7 @@ func validatePipelineParametersVariables(tasks []PipelineTask, prefix string, pa for idx, task := range tasks { errs = errs.Also(validatePipelineParametersVariablesInTaskParameters(task.Params, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) if task.IsMatrixed() { - errs = errs.Also(validatePipelineParametersVariablesInMatrixParameters(task.Matrix.Params, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) + errs = errs.Also(task.Matrix.validatePipelineParametersVariablesInMatrixParameters(prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) } errs = errs.Also(task.When.validatePipelineParametersVariables(prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) } @@ -183,14 +360,7 @@ func validatePipelineContextVariables(tasks []PipelineTask) *apis.FieldError { ) var paramValues []string for _, task := range tasks { - var matrixParams []Param - if task.IsMatrixed() { - matrixParams = task.Matrix.Params - } - for _, param := range append(task.Params, matrixParams...) { - paramValues = append(paramValues, param.Value.StringVal) - paramValues = append(paramValues, param.Value.ArrayVal...) - } + paramValues = task.extractAllParams().extractValues() } errs := validatePipelineContextVariablesInParamValues(paramValues, "context\\.pipelineRun", pipelineRunContextNames). Also(validatePipelineContextVariablesInParamValues(paramValues, "context\\.pipeline", pipelineContextNames)). @@ -198,6 +368,23 @@ func validatePipelineContextVariables(tasks []PipelineTask) *apis.FieldError { return errs } +// extractAllParams extracts all the parameters in a PipelineTask: +// - pt.Params +// - pt.Matrix.Params +// - pt.Matrix.Include.Params +func (pt *PipelineTask) extractAllParams() Params { + allParams := pt.Params + if pt.Matrix.HasParams() { + allParams = append(allParams, pt.Matrix.Params...) + } + if pt.Matrix.HasInclude() { + for _, include := range pt.Matrix.Include { + allParams = append(allParams, include.Params...) + } + } + return allParams +} + func containsExecutionStatusRef(p string) bool { if strings.HasPrefix(p, "tasks.") && strings.HasSuffix(p, ".status") { return true @@ -205,6 +392,12 @@ func containsExecutionStatusRef(p string) bool { return false } +func validateExecutionStatusVariables(tasks []PipelineTask, finallyTasks []PipelineTask) (errs *apis.FieldError) { + errs = errs.Also(validateExecutionStatusVariablesInTasks(tasks).ViaField("tasks")) + errs = errs.Also(validateExecutionStatusVariablesInFinally(PipelineTaskList(tasks).Names(), finallyTasks).ViaField("finally")) + return errs +} + // validate dag pipeline tasks, task params can not access execution status of any other task // dag tasks cannot have param value as $(tasks.pipelineTask.status) func validateExecutionStatusVariablesInTasks(tasks []PipelineTask) (errs *apis.FieldError) { @@ -223,12 +416,81 @@ func validateExecutionStatusVariablesInFinally(tasksNames sets.String, finally [ return errs } -func validateExecutionStatusVariables(tasks []PipelineTask, finallyTasks []PipelineTask) (errs *apis.FieldError) { - errs = errs.Also(validateExecutionStatusVariablesInTasks(tasks).ViaField("tasks")) - errs = errs.Also(validateExecutionStatusVariablesInFinally(PipelineTaskList(tasks).Names(), finallyTasks).ViaField("finally")) +func (pt *PipelineTask) validateExecutionStatusVariablesDisallowed() (errs *apis.FieldError) { + for _, param := range pt.Params { + if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { + errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, "value"). + ViaFieldKey("params", param.Name)) + } + } + for i, we := range pt.When { + if expressions, ok := we.GetVarSubstitutionExpressions(); ok { + errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, ""). + ViaFieldIndex("when", i)) + } + } return errs } +func (pt *PipelineTask) validateExecutionStatusVariablesAllowed(ptNames sets.String) (errs *apis.FieldError) { + for _, param := range pt.Params { + if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { + errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, "value"). + ViaFieldKey("params", param.Name)) + } + } + for i, we := range pt.When { + if expressions, ok := we.GetVarSubstitutionExpressions(); ok { + errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, ""). + ViaFieldIndex("when", i)) + } + } + return errs +} + +func validateContainsExecutionStatusVariablesDisallowed(expressions []string, path string) (errs *apis.FieldError) { + if containsExecutionStatusReferences(expressions) { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline tasks can not refer to execution status"+ + " of any other pipeline task or aggregate status of tasks"), path)) + } + return errs +} + +func containsExecutionStatusReferences(expressions []string) bool { + // validate tasks.pipelineTask.status/tasks.status if this expression is not a result reference + if !LooksLikeContainsResultRefs(expressions) { + for _, e := range expressions { + // check if it contains context variable accessing execution status - $(tasks.taskname.status) + // or an aggregate status - $(tasks.status) + if containsExecutionStatusRef(e) { + return true + } + } + } + return false +} + +func validateExecutionStatusVariablesExpressions(expressions []string, ptNames sets.String, fieldPath string) (errs *apis.FieldError) { + // validate tasks.pipelineTask.status if this expression is not a result reference + if !LooksLikeContainsResultRefs(expressions) { + for _, expression := range expressions { + // its a reference to aggregate status of dag tasks - $(tasks.status) + if expression == PipelineTasksAggregateStatus { + continue + } + // check if it contains context variable accessing execution status - $(tasks.taskname.status) + if containsExecutionStatusRef(expression) { + // strip tasks. and .status from tasks.taskname.status to further verify task name + pt := strings.TrimSuffix(strings.TrimPrefix(expression, "tasks."), ".status") + // report an error if the task name does not exist in the list of dag tasks + if !ptNames.Has(pt) { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline task %s is not defined in the pipeline", pt), fieldPath)) + } + } + } + } + return errs +} func validatePipelineContextVariablesInParamValues(paramValues []string, prefix string, contextNames sets.String) (errs *apis.FieldError) { for _, paramValue := range paramValues { errs = errs.Also(substitution.ValidateVariableP(paramValue, prefix, contextNames).ViaField("value")) @@ -309,7 +571,6 @@ func taskContainsResult(resultExpression string, pipelineTaskNames sets.String, if strings.HasPrefix(value, "finally") && !pipelineFinallyTaskNames.Has(pipelineTaskName) { return false } - } } return true @@ -413,3 +674,51 @@ func validateResultsFromMatrixedPipelineTasksNotConsumed(tasks []PipelineTask, f } return errs } + +// ValidateParamArrayIndex validates if the param reference to an array param is out of bound. +// error is returned when the array indexing reference is out of bound of the array param +// e.g. if a param reference of $(params.array-param[2]) and the array param is of length 2. +func (ps *PipelineSpec) ValidateParamArrayIndex(ctx context.Context, params Params) error { + if !config.CheckAlphaOrBetaAPIFields(ctx) { + return nil + } + + // Collect all array params lengths + arrayParamsLengths := ps.Params.extractParamArrayLengths() + for k, v := range params.extractParamArrayLengths() { + arrayParamsLengths[k] = v + } + + paramsRefs := []string{} + for i := range ps.Tasks { + paramsRefs = append(paramsRefs, ps.Tasks[i].Params.extractValues()...) + if ps.Tasks[i].IsMatrixed() { + paramsRefs = append(paramsRefs, ps.Tasks[i].Matrix.Params.extractValues()...) + } + for j := range ps.Tasks[i].Workspaces { + paramsRefs = append(paramsRefs, ps.Tasks[i].Workspaces[j].SubPath) + } + for _, wes := range ps.Tasks[i].When { + paramsRefs = append(paramsRefs, wes.Input) + paramsRefs = append(paramsRefs, wes.Values...) + } + } + + for i := range ps.Finally { + paramsRefs = append(paramsRefs, ps.Finally[i].Params.extractValues()...) + if ps.Finally[i].IsMatrixed() { + paramsRefs = append(paramsRefs, ps.Finally[i].Matrix.Params.extractValues()...) + } + for _, wes := range ps.Finally[i].When { + paramsRefs = append(paramsRefs, wes.Values...) + } + } + + // extract all array indexing references, for example []{"$(params.array-params[1])"} + arrayIndexParamRefs := []string{} + for _, p := range paramsRefs { + arrayIndexParamRefs = append(arrayIndexParamRefs, extractArrayIndexingParamRefs(p)...) + } + + return validateOutofBoundArrayParams(arrayIndexParamRefs, arrayParamsLengths) +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelineref_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelineref_validation.go index e68b775115..ee91841717 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelineref_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelineref_validation.go @@ -39,7 +39,7 @@ func (ref *PipelineRef) Validate(ctx context.Context) (errs *apis.FieldError) { } } if ref.Params != nil { - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "params", config.BetaAPIFields).ViaField("params")) + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "resolver params", config.BetaAPIFields).ViaField("params")) if ref.Name != "" { errs = errs.Also(apis.ErrMultipleOneOf("name", "params")) } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_defaults.go index d386021959..e53efe5e5a 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_defaults.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_defaults.go @@ -36,8 +36,15 @@ func (pr *PipelineRun) SetDefaults(ctx context.Context) { // SetDefaults implements apis.Defaultable func (prs *PipelineRunSpec) SetDefaults(ctx context.Context) { cfg := config.FromContextOrDefaults(ctx) + if prs.PipelineRef != nil && prs.PipelineRef.Name == "" && prs.PipelineRef.Resolver == "" { + prs.PipelineRef.Resolver = ResolverName(cfg.Defaults.DefaultResolverType) + } + + if prs.Timeouts == nil { + prs.Timeouts = &TimeoutFields{} + } - if prs.Timeouts != nil && prs.Timeouts.Pipeline == nil { + if prs.Timeouts.Pipeline == nil { prs.Timeouts.Pipeline = &metav1.Duration{Duration: time.Duration(cfg.Defaults.DefaultTimeoutMinutes) * time.Minute} } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_types.go index 11f8296395..4f4e33b3a1 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_types.go @@ -20,20 +20,19 @@ import ( "context" "time" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "github.com/tektoncd/pipeline/pkg/apis/config" apisconfig "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" pod "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - runv1alpha1 "github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1" + runv1beta1 "github.com/tektoncd/pipeline/pkg/apis/run/v1beta1" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/clock" "knative.dev/pkg/apis" - duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1" + duckv1 "knative.dev/pkg/apis/duck/v1" ) // +genclient @@ -98,7 +97,7 @@ func (pr *PipelineRun) IsGracefullyStopped() bool { return pr.Spec.Status == PipelineRunSpecStatusStoppedRunFinally } -// PipelineTimeout returns the the applicable timeout for the PipelineRun +// PipelineTimeout returns the applicable timeout for the PipelineRun func (pr *PipelineRun) PipelineTimeout(ctx context.Context) time.Duration { if pr.Spec.Timeouts != nil && pr.Spec.Timeouts.Pipeline != nil { return pr.Spec.Timeouts.Pipeline.Duration @@ -106,7 +105,7 @@ func (pr *PipelineRun) PipelineTimeout(ctx context.Context) time.Duration { return time.Duration(config.FromContextOrDefaults(ctx).Defaults.DefaultTimeoutMinutes) * time.Minute } -// TasksTimeout returns the the tasks timeout for the PipelineRun, if set, +// TasksTimeout returns the tasks timeout for the PipelineRun, if set, // or the tasks timeout computed from the Pipeline and Finally timeouts, if those are set. func (pr *PipelineRun) TasksTimeout() *metav1.Duration { t := pr.Spec.Timeouts @@ -125,7 +124,7 @@ func (pr *PipelineRun) TasksTimeout() *metav1.Duration { return nil } -// FinallyTimeout returns the the finally timeout for the PipelineRun, if set, +// FinallyTimeout returns the finally timeout for the PipelineRun, if set, // or the finally timeout computed from the Pipeline and Tasks timeouts, if those are set. func (pr *PipelineRun) FinallyTimeout() *metav1.Duration { t := pr.Spec.Timeouts @@ -224,7 +223,7 @@ type PipelineRunSpec struct { PipelineSpec *PipelineSpec `json:"pipelineSpec,omitempty"` // Params is a list of parameter names and values. // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` // Used for cancelling a pipelinerun (and maybe more later on) // +optional @@ -285,7 +284,7 @@ const ( // PipelineRunStatus defines the observed state of PipelineRun type PipelineRunStatus struct { - duckv1beta1.Status `json:",inline"` + duckv1.Status `json:",inline"` // PipelineRunStatusFields inlines the status fields. PipelineRunStatusFields `json:",inline"` @@ -399,11 +398,9 @@ type ChildStatusReference struct { // consume these fields via duck typing. type PipelineRunStatusFields struct { // StartTime is the time the PipelineRun is actually started. - // +optional StartTime *metav1.Time `json:"startTime,omitempty"` // CompletionTime is the time the PipelineRun completed. - // +optional CompletionTime *metav1.Time `json:"completionTime,omitempty"` // Results are the list of results written out by the pipeline task's containers @@ -429,7 +426,11 @@ type PipelineRunStatusFields struct { FinallyStartTime *metav1.Time `json:"finallyStartTime,omitempty"` // Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). + // +optional Provenance *Provenance `json:"provenance,omitempty"` + + // SpanContext contains tracing span context fields + SpanContext map[string]string `json:"spanContext,omitempty"` } // SkippedTask is used to describe the Tasks that were skipped due to their When Expressions @@ -468,6 +469,8 @@ const ( TasksTimedOutSkip SkippingReason = "PipelineRun Tasks timeout has been reached" // FinallyTimedOutSkip means the task was skipped because the PipelineRun has passed its Timeouts.Finally. FinallyTimedOutSkip SkippingReason = "PipelineRun Finally timeout has been reached" + // EmptyArrayInMatrixParams means the task was skipped because Matrix parameters contain empty array. + EmptyArrayInMatrixParams SkippingReason = "Matrix Parameters have an empty array" // None means the task was not skipped None SkippingReason = "None" ) @@ -500,7 +503,7 @@ type PipelineRunRunStatus struct { PipelineTaskName string `json:"pipelineTaskName,omitempty"` // Status is the RunStatus for the corresponding Run // +optional - Status *runv1alpha1.RunStatus `json:"status,omitempty"` + Status *runv1beta1.CustomRunStatus `json:"status,omitempty"` // WhenExpressions is the list of checks guarding the execution of the PipelineTask // +optional // +listType=atomic diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_validation.go index 701ff7d708..d5e8361f8c 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/pipelinerun_validation.go @@ -190,7 +190,7 @@ func appendParamSpec(paramSpec []ParamSpec, params []ParamSpec) []ParamSpec { return paramSpec } -func appendParam(paramSpec []ParamSpec, params []Param) []ParamSpec { +func appendParam(paramSpec []ParamSpec, params Params) []ParamSpec { for _, p := range params { skip := false for _, ps := range paramSpec { @@ -227,7 +227,6 @@ func validateSpecStatus(status PipelineRunSpecStatus) *apis.FieldError { PipelineRunSpecStatusCancelledRunFinally, PipelineRunSpecStatusStoppedRunFinally, PipelineRunSpecStatusPending), "status") - } func validateTimeoutDuration(field string, d *metav1.Duration) (errs *apis.FieldError) { @@ -291,5 +290,8 @@ func validateTaskRunSpec(ctx context.Context, trs PipelineTaskRunSpec) (errs *ap errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "computeResources", config.AlphaAPIFields).ViaField("computeResources")) errs = errs.Also(validateTaskRunComputeResources(trs.ComputeResources, trs.StepSpecs)) } + if trs.PodTemplate != nil { + errs = errs.Also(validatePodTemplateEnv(ctx, *trs.PodTemplate)) + } return errs } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/provenance.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/provenance.go index f0034a3ae7..de9f2a5c5d 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/provenance.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/provenance.go @@ -13,34 +13,34 @@ limitations under the License. package v1 -// Provenance contains some key authenticated metadata about how a software artifact was -// built (what sources, what inputs/outputs, etc.). For now, it only contains the subfield -// `ConfigSource` that identifies the source where a build config file came from. -// In future, it can be expanded as needed to include more metadata about the build. -// This field aims to be used to carry minimum amount of the authenticated metadata in *Run status -// so that Tekton Chains can pick it up and record in the provenance it generates. +import "github.com/tektoncd/pipeline/pkg/apis/config" + +// Provenance contains metadata about resources used in the TaskRun/PipelineRun +// such as the source from where a remote build definition was fetched. +// This field aims to carry minimum amoumt of metadata in *Run status so that +// Tekton Chains can capture them in the provenance. type Provenance struct { - // ConfigSource identifies the source where a resource came from. - ConfigSource *ConfigSource `json:"configSource,omitempty"` + // RefSource identifies the source where a remote task/pipeline came from. + RefSource *RefSource `json:"refSource,omitempty"` + + // FeatureFlags identifies the feature flags that were used during the task/pipeline run + FeatureFlags *config.FeatureFlags `json:"featureFlags,omitempty"` } -// ConfigSource identifies the source where a resource came from. -// This can include Git repositories, Task Bundles, file checksums, or other information -// that allows users to identify where the resource came from and what version was used. -type ConfigSource struct { - // URI indicates the identity of the source of the config. - // Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.uri +// RefSource contains the information that can uniquely identify where a remote +// built definition came from i.e. Git repositories, Tekton Bundles in OCI registry +// and hub. +type RefSource struct { + // URI indicates the identity of the source of the build definition. // Example: "https://github.com/tektoncd/catalog" URI string `json:"uri,omitempty"` // Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. - // Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.digest // Example: {"sha1": "f99d13e554ffcb696dee719fa85b695cb5b0f428"} Digest map[string]string `json:"digest,omitempty"` // EntryPoint identifies the entry point into the build. This is often a path to a - // configuration file and/or a target label within that file. - // Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.entryPoint + // build definition file and/or a target label within that file. // Example: "task/git-clone/0.8/git-clone.yaml" EntryPoint string `json:"entryPoint,omitempty"` } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/register.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/register.go index b72b5467b5..df1db014d5 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/register.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/register.go @@ -50,8 +50,11 @@ func addKnownTypes(scheme *runtime.Scheme) error { &TaskList{}, &Pipeline{}, &PipelineList{}, - ) // TODO(#4983): v1 types go here - + &TaskRun{}, + &TaskRunList{}, + &PipelineRun{}, + &PipelineRunList{}, + ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resolver_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resolver_types.go index c27b0decfc..095a9d00a2 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resolver_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resolver_types.go @@ -34,5 +34,5 @@ type ResolverRef struct { // the chosen resolver. // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_types.go index a64c867f22..3a5b97d919 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_types.go @@ -54,7 +54,7 @@ type ResultValue = ParamValue // ResultsType indicates the type of a result; // Used to distinguish between a single string and an array of strings. // Note that there is ResultType used to find out whether a -// PipelineResourceResult is from a task result or not, which is different from +// RunResult is from a task result or not, which is different from // this ResultsType. type ResultsType string diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_validation.go index 4d227cb6b1..1fd9ddd6b1 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/result_validation.go @@ -23,7 +23,7 @@ import ( "knative.dev/pkg/apis" ) -// ResultNameFormat Constant used to define the the regex Result.Name should follow +// ResultNameFormat Constant used to define the regex Result.Name should follow const ResultNameFormat = `^([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$` var resultNameFormatRegex = regexp.MustCompile(ResultNameFormat) @@ -33,22 +33,24 @@ func (tr TaskResult) Validate(ctx context.Context) (errs *apis.FieldError) { if !resultNameFormatRegex.MatchString(tr.Name) { return apis.ErrInvalidKeyName(tr.Name, "name", fmt.Sprintf("Name must consist of alphanumeric characters, '-', '_', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my-name', or 'my_name', regex used for validation is '%s')", ResultNameFormat)) } - // Array and Object are alpha features - if tr.Type == ResultsTypeArray || tr.Type == ResultsTypeObject { + + switch { + // Object results is beta feature - check if the feature flag is set to "beta" or "alpha" + case tr.Type == ResultsTypeObject: errs := validateObjectResult(tr) - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "results type", config.AlphaAPIFields)) + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "results type", config.BetaAPIFields)) + return errs + // Array results is a beta feature - check if the feature flag is set to "beta" or "alpha" + case tr.Type == ResultsTypeArray: + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "results type", config.BetaAPIFields)) return errs - } - // Resources created before the result. Type was introduced may not have Type set // and should be considered valid - if tr.Type == "" { + case tr.Type == "": return nil - } - - // By default the result type is string - if tr.Type != ResultsTypeString { - return apis.ErrInvalidValue(tr.Type, "type", fmt.Sprintf("type must be string")) + // By default, the result type is string + case tr.Type != ResultsTypeString: + return apis.ErrInvalidValue(tr.Type, "type", "type must be string") } return nil diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resultref.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resultref.go index 8fcc1b9f5a..1dcd06e6e2 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resultref.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/resultref.go @@ -200,19 +200,13 @@ func ParseResultName(resultName string) (string, string) { // in a PipelineTask and returns a list of any references that are found. func PipelineTaskResultRefs(pt *PipelineTask) []*ResultRef { refs := []*ResultRef{} - var matrixParams []Param - if pt.IsMatrixed() { - matrixParams = pt.Matrix.Params - } - for _, p := range append(pt.Params, matrixParams...) { + for _, p := range pt.extractAllParams() { expressions, _ := GetVarSubstitutionExpressionsForParam(p) refs = append(refs, NewResultRefs(expressions)...) } - for _, whenExpression := range pt.When { expressions, _ := whenExpression.GetVarSubstitutionExpressions() refs = append(refs, NewResultRefs(expressions)...) } - return refs } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/status_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/status_validation.go deleted file mode 100644 index c5a8ac36f7..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/status_validation.go +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright 2022 The Tekton 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 v1 - -import ( - "context" - "fmt" - - "github.com/tektoncd/pipeline/pkg/apis/config" - "knative.dev/pkg/apis" -) - -// ValidateEmbeddedStatus checks that the embedded-status feature gate is set to the wantEmbeddedStatus value and, -// if not, returns an error stating which feature is dependent on the status and what the current status actually is. -func ValidateEmbeddedStatus(ctx context.Context, featureName, wantEmbeddedStatus string) *apis.FieldError { - embeddedStatus := config.FromContextOrDefaults(ctx).FeatureFlags.EmbeddedStatus - if embeddedStatus != wantEmbeddedStatus { - message := fmt.Sprintf(`%s requires "embedded-status" feature gate to be %q but it is %q`, featureName, wantEmbeddedStatus, embeddedStatus) - return apis.ErrGeneric(message) - } - return nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/swagger.json b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/swagger.json index 0960125b90..f7b05c14f2 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/swagger.json +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/swagger.json @@ -63,6 +63,17 @@ "description": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.", "type": "boolean" }, + "env": { + "description": "List of environment variables that can be provided to the containers belonging to the pod.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.EnvVar" + }, + "x-kubernetes-list-type": "atomic", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, "hostAliases": { "description": "HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods.", "type": "array", @@ -169,28 +180,6 @@ } } }, - "v1.ConfigSource": { - "description": "ConfigSource identifies the source where a resource came from. This can include Git repositories, Task Bundles, file checksums, or other information that allows users to identify where the resource came from and what version was used.", - "type": "object", - "properties": { - "digest": { - "description": "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.digest Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", - "type": "object", - "additionalProperties": { - "type": "string", - "default": "" - } - }, - "entryPoint": { - "description": "EntryPoint identifies the entry point into the build. This is often a path to a configuration file and/or a target label within that file. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.entryPoint Example: \"task/git-clone/0.8/git-clone.yaml\"", - "type": "string" - }, - "uri": { - "description": "URI indicates the identity of the source of the config. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.uri Example: \"https://github.com/tektoncd/catalog\"", - "type": "string" - } - } - }, "v1.EmbeddedTask": { "description": "EmbeddedTask is used to define a Task inline within a Pipeline's PipelineTasks.", "type": "object", @@ -202,6 +191,10 @@ "description": "Description is a user-facing description of the task that may be used to populate a UI.", "type": "string" }, + "displayName": { + "description": "DisplayName is a user-facing name of the task that may be used to populate a UI.", + "type": "string" + }, "kind": { "type": "string" }, @@ -274,10 +267,38 @@ } } }, + "v1.IncludeParams": { + "description": "IncludeParams allows passing in a specific combinations of Parameters into the Matrix.", + "type": "object", + "properties": { + "name": { + "description": "Name the specified combination", + "type": "string" + }, + "params": { + "description": "Params takes only `Parameters` of type `\"string\"` The names of the `params` must match the names of the `params` in the underlying `Task`", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.Param" + }, + "x-kubernetes-list-type": "atomic" + } + } + }, "v1.Matrix": { "description": "Matrix is used to fan out Tasks in a Pipeline", "type": "object", "properties": { + "include": { + "description": "Include is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.IncludeParams" + }, + "x-kubernetes-list-type": "atomic" + }, "params": { "description": "Params is a list of parameters used to fan out the pipelineTask Params takes only `Parameters` of type `\"array\"` Each array element is supplied to the `PipelineTask` by substituting `params` of type `\"string\"` in the underlying `Task`. The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting.", "type": "array", @@ -345,13 +366,13 @@ "description": "ResultValue is a type alias of ParamValue", "type": "object", "required": [ - "type", - "stringVal", - "arrayVal", - "objectVal" + "Type", + "StringVal", + "ArrayVal", + "ObjectVal" ], "properties": { - "arrayVal": { + "ArrayVal": { "type": "array", "items": { "type": "string", @@ -359,19 +380,19 @@ }, "x-kubernetes-list-type": "atomic" }, - "objectVal": { + "ObjectVal": { "type": "object", "additionalProperties": { "type": "string", "default": "" } }, - "stringVal": { + "StringVal": { "description": "Represents the stored type of ParamValues.", "type": "string", "default": "" }, - "type": { + "Type": { "type": "string", "default": "" } @@ -552,7 +573,7 @@ }, "status": { "description": "Status is the RunStatus for the corresponding Run", - "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.run.v1alpha1.RunStatus" + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.run.v1beta1.CustomRunStatus" }, "whenExpressions": { "description": "WhenExpressions is the list of checks guarding the execution of the PipelineTask", @@ -687,6 +708,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the PipelineRun is actually started.", "$ref": "#/definitions/v1.Time" @@ -740,6 +769,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the PipelineRun is actually started.", "$ref": "#/definitions/v1.Time" @@ -777,6 +814,10 @@ "description": "Description is a user-facing description of the pipeline that may be used to populate a UI.", "type": "string" }, + "displayName": { + "description": "DisplayName is a user-facing name of the pipeline that may be used to populate a UI.", + "type": "string" + }, "finally": { "description": "Finally declares the list of Tasks that execute just before leaving the Pipeline i.e. either after all Tasks are finished executing successfully or after a failure which would result in ending the Pipeline", "type": "array", @@ -828,6 +869,14 @@ "description": "PipelineTask defines a task in a Pipeline, passing inputs from both Params and from the output of previous tasks.", "type": "object", "properties": { + "description": { + "description": "Description is the description of this task within the context of a Pipeline. This description may be used to populate a UI.", + "type": "string" + }, + "displayName": { + "description": "DisplayName is the display name of this task within the context of a Pipeline. This display name may be used to populate a UI.", + "type": "string" + }, "matrix": { "description": "Matrix declares parameters used to fan out this task.", "$ref": "#/definitions/v1.Matrix" @@ -988,7 +1037,7 @@ } }, "v1.PipelineWorkspaceDeclaration": { - "description": "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding. Deprecated: use PipelineWorkspaceDeclaration type instead", + "description": "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding.\n\nDeprecated: use PipelineWorkspaceDeclaration type instead", "type": "object", "required": [ "name" @@ -1019,12 +1068,38 @@ } }, "v1.Provenance": { - "description": "Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). For now, it only contains the subfield `ConfigSource` that identifies the source where a build config file came from. In future, it can be expanded as needed to include more metadata about the build. This field aims to be used to carry minimum amount of the authenticated metadata in *Run status so that Tekton Chains can pick it up and record in the provenance it generates.", + "description": "Provenance contains metadata about resources used in the TaskRun/PipelineRun such as the source from where a remote build definition was fetched. This field aims to carry minimum amoumt of metadata in *Run status so that Tekton Chains can capture them in the provenance.", "type": "object", "properties": { - "configSource": { - "description": "ConfigSource identifies the source where a resource came from.", - "$ref": "#/definitions/v1.ConfigSource" + "featureFlags": { + "description": "FeatureFlags identifies the feature flags that were used during the task/pipeline run", + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.config.FeatureFlags" + }, + "refSource": { + "description": "RefSource identifies the source where a remote task/pipeline came from.", + "$ref": "#/definitions/v1.RefSource" + } + } + }, + "v1.RefSource": { + "description": "RefSource contains the information that can uniquely identify where a remote built definition came from i.e. Git repositories, Tekton Bundles in OCI registry and hub.", + "type": "object", + "properties": { + "digest": { + "description": "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, + "entryPoint": { + "description": "EntryPoint identifies the entry point into the build. This is often a path to a build definition file and/or a target label within that file. Example: \"task/git-clone/0.8/git-clone.yaml\"", + "type": "string" + }, + "uri": { + "description": "URI indicates the identity of the source of the build definition. Example: \"https://github.com/tektoncd/catalog\"", + "type": "string" } } }, @@ -1595,11 +1670,11 @@ "type": "object", "properties": { "apiVersion": { - "description": "API version of the referent", + "description": "API version of the referent Note: A Task with non-empty APIVersion and Kind is considered a Custom Task", "type": "string" }, "kind": { - "description": "TaskKind indicates the kind of the task, namespaced or cluster scoped.", + "description": "TaskKind indicates the Kind of the Task: 1. Namespaced Task when Kind is set to \"Task\". If Kind is \"\", it defaults to \"Task\". 2. Custom Task when Kind is non-empty and APIVersion is non-empty", "type": "string" }, "name": { @@ -1787,6 +1862,11 @@ "description": "PodTemplate holds pod specific configuration", "$ref": "#/definitions/pod.Template" }, + "retries": { + "description": "Retries represents how many times this TaskRun should be retried in the event of task failure.", + "type": "integer", + "format": "int32" + }, "serviceAccountName": { "type": "string", "default": "" @@ -1801,7 +1881,7 @@ "x-kubernetes-list-type": "atomic" }, "status": { - "description": "Used for cancelling a taskrun (and maybe more later on)", + "description": "Used for cancelling a TaskRun (and maybe more later on)", "type": "string" }, "statusMessage": { @@ -1825,7 +1905,7 @@ "$ref": "#/definitions/v1.TaskSpec" }, "timeout": { - "description": "Time after which the build times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + "description": "Time after which one retry attempt times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", "$ref": "#/definitions/v1.Duration" }, "workspaces": { @@ -1909,6 +1989,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the build is actually started.", "$ref": "#/definitions/v1.Time" @@ -1975,6 +2063,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the build is actually started.", "$ref": "#/definitions/v1.Time" @@ -2022,6 +2118,10 @@ "description": "Description is a user-facing description of the task that may be used to populate a UI.", "type": "string" }, + "displayName": { + "description": "DisplayName is a user-facing name of the task that may be used to populate a UI.", + "type": "string" + }, "params": { "description": "Params is a list of input parameters required to run the task. Params must be supplied as inputs in TaskRuns unless they declare a default value.", "type": "array", diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_types.go index 4283e8119c..9a46de41b8 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_types.go @@ -54,13 +54,17 @@ func (*Task) GetGroupVersionKind() schema.GroupVersionKind { // TaskSpec defines the desired state of Task. type TaskSpec struct { - // Params is a list of input parameters required to run the task. Params // must be supplied as inputs in TaskRuns unless they declare a default // value. // +optional // +listType=atomic - Params []ParamSpec `json:"params,omitempty"` + Params ParamSpecs `json:"params,omitempty"` + + // DisplayName is a user-facing name of the task that may be + // used to populate a UI. + // +optional + DisplayName string `json:"displayName,omitempty"` // Description is a user-facing description of the task that may be // used to populate a UI. diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_validation.go index d2ce8de157..5848053bf6 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/task_validation.go @@ -25,6 +25,7 @@ import ( "time" "github.com/tektoncd/pipeline/pkg/apis/config" + "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/validate" "github.com/tektoncd/pipeline/pkg/apis/version" "github.com/tektoncd/pipeline/pkg/substitution" @@ -92,13 +93,27 @@ func (ts *TaskSpec) Validate(ctx context.Context) (errs *apis.FieldError) { } errs = errs.Also(validateSteps(ctx, mergedSteps).ViaField("steps")) + errs = errs.Also(validateSidecarNames(ts.Sidecars)) errs = errs.Also(ValidateParameterTypes(ctx, ts.Params).ViaField("params")) errs = errs.Also(ValidateParameterVariables(ctx, ts.Steps, ts.Params)) errs = errs.Also(validateTaskContextVariables(ctx, ts.Steps)) + errs = errs.Also(validateTaskResultsVariables(ctx, ts.Steps, ts.Results)) errs = errs.Also(validateResults(ctx, ts.Results).ViaField("results")) return errs } +func validateSidecarNames(sidecars []Sidecar) (errs *apis.FieldError) { + for _, sc := range sidecars { + if sc.Name == pipeline.ReservedResultsSidecarName { + errs = errs.Also(&apis.FieldError{ + Message: fmt.Sprintf("Invalid: cannot use reserved sidecar name %v ", sc.Name), + Paths: []string{"sidecars"}, + }) + } + } + return errs +} + func validateResults(ctx context.Context, results []TaskResult) (errs *apis.FieldError) { for index, result := range results { errs = errs.Also(result.Validate(ctx).ViaIndex(index)) @@ -210,7 +225,7 @@ func validateStep(ctx context.Context, s Step, names sets.String) (errs *apis.Fi if s.Script != "" { if len(s.Command) > 0 { errs = errs.Also(&apis.FieldError{ - Message: fmt.Sprintf("script cannot be used with command"), + Message: "script cannot be used with command", Paths: []string{"script"}, }) } @@ -280,9 +295,9 @@ func validateStep(ctx context.Context, s Step, names sets.String) (errs *apis.Fi func ValidateParameterTypes(ctx context.Context, params []ParamSpec) (errs *apis.FieldError) { for _, p := range params { if p.Type == ParamTypeObject { - // Object type parameter is an alpha feature and will fail validation if it's used in a task spec - // when the enable-api-fields feature gate is not "alpha". - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.AlphaAPIFields)) + // Object type parameter is a beta feature and will fail validation if it's used in a task spec + // when the enable-api-fields feature gate is not "alpha" or "beta". + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.BetaAPIFields)) } errs = errs.Also(p.ValidateType(ctx)) } @@ -325,7 +340,7 @@ func (p ParamSpec) ValidateObjectType(ctx context.Context) *apis.FieldError { if p.Type == ParamTypeObject && p.Properties == nil { // If this we are not skipping validation checks due to propagated params // then properties field is required. - if config.ValidateParameterVariablesAndWorkspaces(ctx) == true { + if config.ValidateParameterVariablesAndWorkspaces(ctx) { return apis.ErrMissingField(fmt.Sprintf("%s.properties", p.Name)) } } @@ -366,12 +381,14 @@ func ValidateParameterVariables(ctx context.Context, steps []Step, params []Para arrayParameterNames.Insert(p.Name) case ParamTypeObject: objectParamSpecs = append(objectParamSpecs, p) + case ParamTypeString: + fallthrough default: stringParameterNames.Insert(p.Name) } } errs = errs.Also(validateNameFormat(stringParameterNames.Insert(arrayParameterNames.List()...), objectParamSpecs)) - if config.ValidateParameterVariablesAndWorkspaces(ctx) == true { + if config.ValidateParameterVariablesAndWorkspaces(ctx) { errs = errs.Also(validateVariables(ctx, steps, "params", allParameterNames)) errs = errs.Also(validateObjectUsage(ctx, steps, objectParamSpecs)) } @@ -392,6 +409,18 @@ func validateTaskContextVariables(ctx context.Context, steps []Step) *apis.Field return errs.Also(validateVariables(ctx, steps, "context\\.task", taskContextNames)) } +// validateTaskResultsVariables validates if the results referenced in step script are defined in task results +func validateTaskResultsVariables(ctx context.Context, steps []Step, results []TaskResult) (errs *apis.FieldError) { + resultsNames := sets.NewString() + for _, r := range results { + resultsNames.Insert(r.Name) + } + for idx, step := range steps { + errs = errs.Also(validateTaskVariable(step.Script, "results", resultsNames).ViaField("script").ViaFieldIndex("steps", idx)) + } + return errs +} + // validateObjectUsage validates the usage of individual attributes of an object param and the usage of the entire object func validateObjectUsage(ctx context.Context, steps []Step, params []ParamSpec) (errs *apis.FieldError) { objectParameterNames := sets.NewString() @@ -431,7 +460,6 @@ func validateStepObjectUsageAsWhole(step Step, prefix string, vars sets.String) } for i, arg := range step.Args { errs = errs.Also(validateTaskNoObjectReferenced(arg, prefix, vars).ViaFieldIndex("args", i)) - } for _, env := range step.Env { errs = errs.Also(validateTaskNoObjectReferenced(env.Value, prefix, vars).ViaFieldKey("env", env.Name)) @@ -461,7 +489,6 @@ func validateStepArrayUsage(step Step, prefix string, vars sets.String) *apis.Fi } for i, arg := range step.Args { errs = errs.Also(validateTaskArraysIsolated(arg, prefix, vars).ViaFieldIndex("args", i)) - } for _, env := range step.Env { errs = errs.Also(validateTaskNoArrayReferenced(env.Value, prefix, vars).ViaFieldKey("env", env.Name)) @@ -575,3 +602,39 @@ func validateTaskArraysIsolated(value, prefix string, arrayNames sets.String) *a func isParamRefs(s string) bool { return strings.HasPrefix(s, "$("+ParamsPrefix) } + +// ValidateParamArrayIndex validates if the param reference to an array param is out of bound. +// error is returned when the array indexing reference is out of bound of the array param +// e.g. if a param reference of $(params.array-param[2]) and the array param is of length 2. +// - `trParams` are params from taskrun. +// - `taskSpec` contains params declarations. +func (ts *TaskSpec) ValidateParamArrayIndex(ctx context.Context, params Params) error { + cfg := config.FromContextOrDefaults(ctx) + if cfg.FeatureFlags.EnableAPIFields != config.AlphaAPIFields { + return nil + } + + // Collect all array params lengths + arrayParamsLengths := ts.Params.extractParamArrayLengths() + for k, v := range params.extractParamArrayLengths() { + arrayParamsLengths[k] = v + } + + // collect all the possible places to use param references + paramsRefs := []string{} + paramsRefs = append(paramsRefs, extractParamRefsFromSteps(ts.Steps)...) + paramsRefs = append(paramsRefs, extractParamRefsFromStepTemplate(ts.StepTemplate)...) + paramsRefs = append(paramsRefs, extractParamRefsFromVolumes(ts.Volumes)...) + for _, v := range ts.Workspaces { + paramsRefs = append(paramsRefs, v.MountPath) + } + paramsRefs = append(paramsRefs, extractParamRefsFromSidecars(ts.Sidecars)...) + + // extract all array indexing references, for example []{"$(params.array-params[1])"} + arrayIndexParamRefs := []string{} + for _, p := range paramsRefs { + arrayIndexParamRefs = append(arrayIndexParamRefs, extractArrayIndexingParamRefs(p)...) + } + + return validateOutofBoundArrayParams(arrayIndexParamRefs, arrayParamsLengths) +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_types.go index 74a319dd71..2bb395dac2 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_types.go @@ -20,9 +20,12 @@ package v1 type TaskRef struct { // Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names Name string `json:"name,omitempty"` - // TaskKind indicates the kind of the task, namespaced or cluster scoped. + // TaskKind indicates the Kind of the Task: + // 1. Namespaced Task when Kind is set to "Task". If Kind is "", it defaults to "Task". + // 2. Custom Task when Kind is non-empty and APIVersion is non-empty Kind TaskKind `json:"kind,omitempty"` // API version of the referent + // Note: A Task with non-empty APIVersion and Kind is considered a Custom Task // +optional APIVersion string `json:"apiVersion,omitempty"` @@ -40,3 +43,10 @@ const ( // NamespacedTaskKind indicates that the task type has a namespaced scope. NamespacedTaskKind TaskKind = "Task" ) + +// IsCustomTask checks whether the reference is to a Custom Task +func (tr *TaskRef) IsCustomTask() bool { + // Note that if `apiVersion` is set to `"tekton.dev/v1beta1"` and `kind` is set to `"Task"`, + // the reference will be considered a Custom Task - https://github.com/tektoncd/pipeline/issues/6457 + return tr != nil && tr.APIVersion != "" && tr.Kind != "" +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_validation.go index 9de4940517..02dca53018 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskref_validation.go @@ -39,7 +39,7 @@ func (ref *TaskRef) Validate(ctx context.Context) (errs *apis.FieldError) { } } if ref.Params != nil { - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "params", config.BetaAPIFields).ViaField("params")) + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "resolver params", config.BetaAPIFields).ViaField("params")) if ref.Name != "" { errs = errs.Also(apis.ErrMultipleOneOf("name", "params")) } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_defaults.go index 61932f4668..9f34e6b5c7 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_defaults.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_defaults.go @@ -50,8 +50,13 @@ func (tr *TaskRun) SetDefaults(ctx context.Context) { // SetDefaults implements apis.Defaultable func (trs *TaskRunSpec) SetDefaults(ctx context.Context) { cfg := config.FromContextOrDefaults(ctx) - if trs.TaskRef != nil && trs.TaskRef.Kind == "" { - trs.TaskRef.Kind = NamespacedTaskKind + if trs.TaskRef != nil { + if trs.TaskRef.Kind == "" { + trs.TaskRef.Kind = NamespacedTaskKind + } + if trs.TaskRef.Name == "" && trs.TaskRef.Resolver == "" { + trs.TaskRef.Resolver = ResolverName(cfg.Defaults.DefaultResolverType) + } } if trs.Timeout == nil { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_types.go index bf29a83642..7375c01ff5 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_types.go @@ -1,12 +1,9 @@ /* Copyright 2022 The Tekton 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. @@ -40,7 +37,7 @@ type TaskRunSpec struct { Debug *TaskRunDebug `json:"debug,omitempty"` // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` // +optional ServiceAccountName string `json:"serviceAccountName"` // no more than one of the TaskRef and TaskSpec may be specified. @@ -48,13 +45,16 @@ type TaskRunSpec struct { TaskRef *TaskRef `json:"taskRef,omitempty"` // +optional TaskSpec *TaskSpec `json:"taskSpec,omitempty"` - // Used for cancelling a taskrun (and maybe more later on) + // Used for cancelling a TaskRun (and maybe more later on) // +optional Status TaskRunSpecStatus `json:"status,omitempty"` // Status message for cancellation. // +optional StatusMessage TaskRunSpecStatusMessage `json:"statusMessage,omitempty"` - // Time after which the build times out. Defaults to 1 hour. + // Retries represents how many times this TaskRun should be retried in the event of task failure. + // +optional + Retries int `json:"retries,omitempty"` + // Time after which one retry attempt times out. Defaults to 1 hour. // Specified build timeout should be less than 24h. // Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration // +optional @@ -83,7 +83,7 @@ type TaskRunSpec struct { ComputeResources *corev1.ResourceRequirements `json:"computeResources,omitempty"` } -// TaskRunSpecStatus defines the taskrun spec status the user can provide +// TaskRunSpecStatus defines the TaskRun spec status the user can provide type TaskRunSpecStatus string const ( @@ -114,7 +114,7 @@ type TaskRunDebug struct { type TaskRunInputs struct { // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` } var taskRunCondSet = apis.NewBatchConditionSet() @@ -141,15 +141,21 @@ const ( TaskRunReasonSuccessful TaskRunReason = "Succeeded" // TaskRunReasonFailed is the reason set when the TaskRun completed with a failure TaskRunReasonFailed TaskRunReason = "Failed" - // TaskRunReasonCancelled is the reason set when the Taskrun is cancelled by the user + // TaskRunReasonToBeRetried is the reason set when the last TaskRun execution failed, and will be retried + TaskRunReasonToBeRetried TaskRunReason = "ToBeRetried" + // TaskRunReasonCancelled is the reason set when the TaskRun is cancelled by the user TaskRunReasonCancelled TaskRunReason = "TaskRunCancelled" - // TaskRunReasonTimedOut is the reason set when the Taskrun has timed out + // TaskRunReasonTimedOut is the reason set when one TaskRun execution has timed out TaskRunReasonTimedOut TaskRunReason = "TaskRunTimeout" // TaskRunReasonResolvingTaskRef indicates that the TaskRun is waiting for // its taskRef to be asynchronously resolved. TaskRunReasonResolvingTaskRef = "ResolvingTaskRef" // TaskRunReasonImagePullFailed is the reason set when the step of a task fails due to image not being pulled TaskRunReasonImagePullFailed TaskRunReason = "TaskRunImagePullFailed" + // TaskRunReasonResultLargerThanAllowedLimit is the reason set when one of the results exceeds its maximum allowed limit of 1 KB + TaskRunReasonResultLargerThanAllowedLimit TaskRunReason = "TaskRunResultLargerThanAllowedLimit" + // TaskRunReasonStopSidecarFailed indicates that the sidecar is not properly stopped. + TaskRunReasonStopSidecarFailed = "TaskRunStopSidecarFailed" ) func (t TaskRunReason) String() string { @@ -201,11 +207,9 @@ type TaskRunStatusFields struct { PodName string `json:"podName"` // StartTime is the time the build is actually started. - // +optional StartTime *metav1.Time `json:"startTime,omitempty"` // CompletionTime is the time the build completed. - // +optional CompletionTime *metav1.Time `json:"completionTime,omitempty"` // Steps describes the state of each build step container. @@ -233,7 +237,11 @@ type TaskRunStatusFields struct { TaskSpec *TaskSpec `json:"taskSpec,omitempty"` // Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). + // +optional Provenance *Provenance `json:"provenance,omitempty"` + + // SpanContext contains tracing span context fields + SpanContext map[string]string `json:"spanContext,omitempty"` } // TaskRunStepSpec is used to override the values of a Step in the corresponding Task. @@ -339,7 +347,7 @@ type TaskRunList struct { Items []TaskRun `json:"items"` } -// GetPipelineRunPVCName for taskrun gets pipelinerun +// GetPipelineRunPVCName for TaskRun gets pipelinerun func (tr *TaskRun) GetPipelineRunPVCName() string { if tr == nil { return "" @@ -368,7 +376,7 @@ func (tr *TaskRun) IsDone() bool { return !tr.Status.GetCondition(apis.ConditionSucceeded).IsUnknown() } -// HasStarted function check whether taskrun has valid start time set in its status +// HasStarted function check whether TaskRun has valid start time set in its status func (tr *TaskRun) HasStarted() bool { return tr.Status.StartTime != nil && !tr.Status.StartTime.IsZero() } @@ -383,6 +391,11 @@ func (tr *TaskRun) IsCancelled() bool { return tr.Spec.Status == TaskRunSpecStatusCancelled } +// IsRetriable returns true if the TaskRun's Retries is not exhausted. +func (tr *TaskRun) IsRetriable() bool { + return len(tr.Status.RetriesStatus) < tr.Spec.Retries +} + // HasTimedOut returns true if the TaskRun runtime is beyond the allowed timeout func (tr *TaskRun) HasTimedOut(ctx context.Context, c clock.PassiveClock) bool { if tr.Status.StartTime.IsZero() { @@ -402,7 +415,7 @@ func (tr *TaskRun) GetTimeout(ctx context.Context) time.Duration { // Use the platform default is no timeout is set if tr.Spec.Timeout == nil { defaultTimeout := time.Duration(config.FromContextOrDefaults(ctx).Defaults.DefaultTimeoutMinutes) - return defaultTimeout * time.Minute + return defaultTimeout * time.Minute //nolint:durationcheck } return tr.Spec.Timeout.Duration } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_validation.go index 21139341e8..055094bb6a 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/taskrun_validation.go @@ -22,11 +22,13 @@ import ( "strings" "github.com/tektoncd/pipeline/pkg/apis/config" + "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" "github.com/tektoncd/pipeline/pkg/apis/validate" "github.com/tektoncd/pipeline/pkg/apis/version" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/utils/strings/slices" "knative.dev/pkg/apis" "knative.dev/pkg/webhook/resourcesemantics" ) @@ -105,6 +107,9 @@ func (ts *TaskRunSpec) Validate(ctx context.Context) (errs *apis.FieldError) { } } + if ts.PodTemplate != nil { + errs = errs.Also(validatePodTemplateEnv(ctx, *ts.PodTemplate)) + } return errs } @@ -141,6 +146,19 @@ func (ts *TaskRunSpec) validateInlineParameters(ctx context.Context) (errs *apis return errs } +func validatePodTemplateEnv(ctx context.Context, podTemplate pod.Template) (errs *apis.FieldError) { + forbiddenEnvsConfigured := config.FromContextOrDefaults(ctx).Defaults.DefaultForbiddenEnv + if len(forbiddenEnvsConfigured) == 0 { + return errs + } + for _, pEnv := range podTemplate.Env { + if slices.Contains(forbiddenEnvsConfigured, pEnv.Name) { + errs = errs.Also(apis.ErrInvalidValue("PodTemplate cannot update a forbidden env: "+pEnv.Name, "PodTemplate.Env")) + } + } + return errs +} + func createParamSpecFromParam(p Param, paramSpecForValidation map[string]ParamSpec) map[string]ParamSpec { value := p.Value pSpec := ParamSpec{ @@ -220,13 +238,13 @@ func ValidateWorkspaceBindings(ctx context.Context, wb []WorkspaceBinding) (errs } // ValidateParameters makes sure the params for the Task are valid. -func ValidateParameters(ctx context.Context, params []Param) (errs *apis.FieldError) { +func ValidateParameters(ctx context.Context, params Params) (errs *apis.FieldError) { var names []string for _, p := range params { if p.Value.Type == ParamTypeObject { - // Object type parameter is an alpha feature and will fail validation if it's used in a taskrun spec - // when the enable-api-fields feature gate is not "alpha". - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.AlphaAPIFields)) + // Object type parameter is a beta feature and will fail validation if it's used in a taskrun spec + // when the enable-api-fields feature gate is not "alpha" or "beta". + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.BetaAPIFields)) } names = append(names, p.Name) } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/workspace_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/workspace_types.go index a68c3064eb..f556201c4b 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/workspace_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/workspace_types.go @@ -87,6 +87,7 @@ type WorkspaceBinding struct { // WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun // is expected to populate with a workspace binding. +// // Deprecated: use PipelineWorkspaceDeclaration type instead type WorkspacePipelineDeclaration = PipelineWorkspaceDeclaration diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/zz_generated.deepcopy.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/zz_generated.deepcopy.go index ef03a3bb5a..bd2f039f69 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1/zz_generated.deepcopy.go @@ -22,8 +22,9 @@ limitations under the License. package v1 import ( + config "github.com/tektoncd/pipeline/pkg/apis/config" pod "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - v1alpha1 "github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1" + v1beta1 "github.com/tektoncd/pipeline/pkg/apis/run/v1beta1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" @@ -54,26 +55,53 @@ func (in *ChildStatusReference) DeepCopy() *ChildStatusReference { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ConfigSource) DeepCopyInto(out *ConfigSource) { - *out = *in - if in.Digest != nil { - in, out := &in.Digest, &out.Digest - *out = make(map[string]string, len(*in)) +func (in Combination) DeepCopyInto(out *Combination) { + { + in := &in + *out = make(Combination, len(*in)) for key, val := range *in { (*out)[key] = val } + return } - return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigSource. -func (in *ConfigSource) DeepCopy() *ConfigSource { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Combination. +func (in Combination) DeepCopy() Combination { if in == nil { return nil } - out := new(ConfigSource) + out := new(Combination) in.DeepCopyInto(out) - return out + return *out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in Combinations) DeepCopyInto(out *Combinations) { + { + in := &in + *out = make(Combinations, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = make(Combination, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Combinations. +func (in Combinations) DeepCopy() Combinations { + if in == nil { + return nil + } + out := new(Combinations) + in.DeepCopyInto(out) + return *out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -96,12 +124,64 @@ func (in *EmbeddedTask) DeepCopy() *EmbeddedTask { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IncludeParams) DeepCopyInto(out *IncludeParams) { + *out = *in + if in.Params != nil { + in, out := &in.Params, &out.Params + *out = make(Params, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IncludeParams. +func (in *IncludeParams) DeepCopy() *IncludeParams { + if in == nil { + return nil + } + out := new(IncludeParams) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in IncludeParamsList) DeepCopyInto(out *IncludeParamsList) { + { + in := &in + *out = make(IncludeParamsList, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IncludeParamsList. +func (in IncludeParamsList) DeepCopy() IncludeParamsList { + if in == nil { + return nil + } + out := new(IncludeParamsList) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Matrix) DeepCopyInto(out *Matrix) { *out = *in if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Include != nil { + in, out := &in.Include, &out.Include + *out = make(IncludeParamsList, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -164,6 +244,28 @@ func (in *ParamSpec) DeepCopy() *ParamSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in ParamSpecs) DeepCopyInto(out *ParamSpecs) { + { + in := &in + *out = make(ParamSpecs, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParamSpecs. +func (in ParamSpecs) DeepCopy() ParamSpecs { + if in == nil { + return nil + } + out := new(ParamSpecs) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ParamValue) DeepCopyInto(out *ParamValue) { *out = *in @@ -192,6 +294,28 @@ func (in *ParamValue) DeepCopy() *ParamValue { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in Params) DeepCopyInto(out *Params) { + { + in := &in + *out = make(Params, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Params. +func (in Params) DeepCopy() Params { + if in == nil { + return nil + } + out := new(Params) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Pipeline) DeepCopyInto(out *Pipeline) { *out = *in @@ -369,7 +493,7 @@ func (in *PipelineRunRunStatus) DeepCopyInto(out *PipelineRunRunStatus) { *out = *in if in.Status != nil { in, out := &in.Status, &out.Status - *out = new(v1alpha1.RunStatus) + *out = new(v1beta1.CustomRunStatus) (*in).DeepCopyInto(*out) } if in.WhenExpressions != nil { @@ -407,7 +531,7 @@ func (in *PipelineRunSpec) DeepCopyInto(out *PipelineRunSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -509,6 +633,13 @@ func (in *PipelineRunStatusFields) DeepCopyInto(out *PipelineRunStatusFields) { *out = new(Provenance) (*in).DeepCopyInto(*out) } + if in.SpanContext != nil { + in, out := &in.SpanContext, &out.SpanContext + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return } @@ -562,7 +693,7 @@ func (in *PipelineSpec) DeepCopyInto(out *PipelineSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]ParamSpec, len(*in)) + *out = make(ParamSpecs, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -626,7 +757,7 @@ func (in *PipelineTask) DeepCopyInto(out *PipelineTask) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -844,11 +975,16 @@ func (in *PropertySpec) DeepCopy() *PropertySpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Provenance) DeepCopyInto(out *Provenance) { *out = *in - if in.ConfigSource != nil { - in, out := &in.ConfigSource, &out.ConfigSource - *out = new(ConfigSource) + if in.RefSource != nil { + in, out := &in.RefSource, &out.RefSource + *out = new(RefSource) (*in).DeepCopyInto(*out) } + if in.FeatureFlags != nil { + in, out := &in.FeatureFlags, &out.FeatureFlags + *out = new(config.FeatureFlags) + **out = **in + } return } @@ -862,12 +998,35 @@ func (in *Provenance) DeepCopy() *Provenance { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RefSource) DeepCopyInto(out *RefSource) { + *out = *in + if in.Digest != nil { + in, out := &in.Digest, &out.Digest + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RefSource. +func (in *RefSource) DeepCopy() *RefSource { + if in == nil { + return nil + } + out := new(RefSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResolverRef) DeepCopyInto(out *ResolverRef) { *out = *in if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1352,7 +1511,7 @@ func (in *TaskRunInputs) DeepCopyInto(out *TaskRunInputs) { *out = *in if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1447,7 +1606,7 @@ func (in *TaskRunSpec) DeepCopyInto(out *TaskRunSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1578,6 +1737,13 @@ func (in *TaskRunStatusFields) DeepCopyInto(out *TaskRunStatusFields) { *out = new(Provenance) (*in).DeepCopyInto(*out) } + if in.SpanContext != nil { + in, out := &in.SpanContext, &out.SpanContext + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return } @@ -1613,7 +1779,7 @@ func (in *TaskSpec) DeepCopyInto(out *TaskSpec) { *out = *in if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]ParamSpec, len(*in)) + *out = make(ParamSpecs, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/register.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/register.go index 42b5e4b18e..fe5e76f459 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/register.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/register.go @@ -48,6 +48,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &Run{}, &RunList{}, + &VerificationPolicy{}, + &VerificationPolicyList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/run_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/run_types.go index d10e2dc3d1..68198cf44f 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/run_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/run_types.go @@ -55,7 +55,7 @@ type RunSpec struct { Spec *EmbeddedRunSpec `json:"spec,omitempty"` // +optional - Params []v1beta1.Param `json:"params,omitempty"` + Params v1beta1.Params `json:"params,omitempty"` // Used for cancelling a run (and maybe more later on) // +optional @@ -263,3 +263,8 @@ func (r *Run) GetTimeout() time.Duration { } return r.Spec.Timeout.Duration } + +// GetRetryCount returns the number of times this Run has already been retried +func (r *Run) GetRetryCount() int { + return len(r.Status.RetriesStatus) +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_defaults.go new file mode 100644 index 0000000000..6b18c31866 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_defaults.go @@ -0,0 +1,30 @@ +/* +Copyright 2020 The Tekton 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 v1alpha1 + +import ( + "context" + + "knative.dev/pkg/apis" +) + +var _ apis.Defaultable = (*VerificationPolicy)(nil) + +// SetDefaults implements apis.Defaultable +func (v *VerificationPolicy) SetDefaults(ctx context.Context) { + +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_types.go new file mode 100644 index 0000000000..c16483cb8c --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_types.go @@ -0,0 +1,139 @@ +/* +Copyright 2022 The Tekton 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 v1alpha1 + +import ( + "crypto" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// +genclient +// +genclient:noStatus +// +genreconciler:krshapedlogic=false +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// VerificationPolicy defines the rules to verify Tekton resources. +// VerificationPolicy can config the mapping from resources to a list of public +// keys, so when verifying the resources we can use the corresponding public keys. +// +k8s:openapi-gen=true +type VerificationPolicy struct { + metav1.TypeMeta `json:",inline"` + // +optional + metav1.ObjectMeta `json:"metadata"` + + // Spec holds the desired state of the VerificationPolicy. + Spec VerificationPolicySpec `json:"spec"` +} + +// VerificationPolicyList contains a list of VerificationPolicy +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type VerificationPolicyList struct { + metav1.TypeMeta `json:",inline"` + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + Items []VerificationPolicy `json:"items"` +} + +// GetGroupVersionKind implements kmeta.OwnerRefable. +func (*VerificationPolicy) GetGroupVersionKind() schema.GroupVersionKind { + return SchemeGroupVersion.WithKind("VerificationPolicy") +} + +// VerificationPolicySpec defines the patterns and authorities. +type VerificationPolicySpec struct { + // Resources defines the patterns of resources sources that should be subject to this policy. + // For example, we may want to apply this Policy from a certain GitHub repo. + // Then the ResourcesPattern should be valid regex. E.g. If using gitresolver, and we want to config keys from a certain git repo. + // `ResourcesPattern` can be `https://github.com/tektoncd/catalog.git`, we will use regex to filter out those resources. + Resources []ResourcePattern `json:"resources"` + // Authorities defines the rules for validating signatures. + Authorities []Authority `json:"authorities"` + // Mode controls whether a failing policy will fail the taskrun/pipelinerun, or only log the warnings + // enforce - fail the taskrun/pipelinerun if verification fails (default) + // warn - don't fail the taskrun/pipelinerun if verification fails but log warnings + // +optional + Mode ModeType `json:"mode,omitempty"` +} + +// ResourcePattern defines the pattern of the resource source +type ResourcePattern struct { + // Pattern defines a resource pattern. Regex is created to filter resources based on `Pattern` + // Example patterns: + // GitHub resource: https://github.com/tektoncd/catalog.git, https://github.com/tektoncd/* + // Bundle resource: gcr.io/tekton-releases/catalog/upstream/git-clone, gcr.io/tekton-releases/catalog/upstream/* + // Hub resource: https://artifacthub.io/*, + Pattern string `json:"pattern"` +} + +// The Authority block defines the keys for validating signatures. +type Authority struct { + // Name is the name for this authority. + Name string `json:"name"` + // Key contains the public key to validate the resource. + Key *KeyRef `json:"key,omitempty"` +} + +// ModeType indicates the type of a mode for VerificationPolicy +type ModeType string + +// Valid ModeType: +const ( + ModeWarn ModeType = "warn" + ModeEnforce ModeType = "enforce" +) + +// KeyRef defines the reference to a public key +type KeyRef struct { + // SecretRef sets a reference to a secret with the key. + // +optional + SecretRef *v1.SecretReference `json:"secretRef,omitempty"` + // Data contains the inline public key. + // +optional + Data string `json:"data,omitempty"` + // KMS contains the KMS url of the public key + // Supported formats differ based on the KMS system used. + // One example of a KMS url could be: + // gcpkms://projects/[PROJECT]/locations/[LOCATION]>/keyRings/[KEYRING]/cryptoKeys/[KEY]/cryptoKeyVersions/[KEY_VERSION] + // For more examples please refer https://docs.sigstore.dev/cosign/kms_support. + // Note that the KMS is not supported yet. + // +optional + KMS string `json:"kms,omitempty"` + // HashAlgorithm always defaults to sha256 if the algorithm hasn't been explicitly set + // +optional + HashAlgorithm HashAlgorithm `json:"hashAlgorithm,omitempty"` +} + +// HashAlgorithm defines the hash algorithm used for the public key +type HashAlgorithm string + +const ( + sha224 HashAlgorithm = "sha224" + sha256 HashAlgorithm = "sha256" + sha384 HashAlgorithm = "sha384" + sha512 HashAlgorithm = "sha512" + empty HashAlgorithm = "" +) + +// SupportedSignatureAlgorithms sets a list of support signature algorithms that is similar to the list supported by cosign. +// empty HashAlgorithm is allowed and will be set to SHA256. +var SupportedSignatureAlgorithms = map[HashAlgorithm]crypto.Hash{ + sha224: crypto.SHA224, + sha256: crypto.SHA256, + sha384: crypto.SHA384, + sha512: crypto.SHA512, + empty: crypto.SHA256, +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_validation.go new file mode 100644 index 0000000000..316ba55da2 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/verificationpolicy_validation.go @@ -0,0 +1,110 @@ +/* +Copyright 2022 The Tekton 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 v1alpha1 + +import ( + "context" + "fmt" + "regexp" + "strings" + + "github.com/tektoncd/pipeline/pkg/apis/validate" + "knative.dev/pkg/apis" +) + +var _ apis.Validatable = (*VerificationPolicy)(nil) + +var ( + // InvalidResourcePatternErr is returned when the pattern is not valid regex expression + InvalidResourcePatternErr = "resourcePattern cannot be compiled by regex" +) + +// Validate VerificationPolicy +func (v *VerificationPolicy) Validate(ctx context.Context) (errs *apis.FieldError) { + errs = errs.Also(validate.ObjectMetadata(v.GetObjectMeta()).ViaField("metadata")) + errs = errs.Also(v.Spec.Validate(ctx)) + return errs +} + +// Validate VerificationPolicySpec, the validation requires Resources is not empty, for each +// resource it must be able to be regex expression and can be compiled with no error. The Authorities +// shouldn't be empty and each Authority should be valid. +func (vs *VerificationPolicySpec) Validate(ctx context.Context) (errs *apis.FieldError) { + if len(vs.Resources) == 0 { + errs = errs.Also(apis.ErrMissingField("resources")) + } + for _, r := range vs.Resources { + errs = errs.Also(r.Validate(ctx)) + } + if len(vs.Authorities) == 0 { + errs = errs.Also(apis.ErrMissingField("authorities")) + } + for i, a := range vs.Authorities { + if a.Key != nil { + errs = errs.Also(a.Key.Validate(ctx).ViaFieldIndex("key", i)) + } + } + if vs.Mode != "" && vs.Mode != ModeEnforce && vs.Mode != ModeWarn { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("available values are: %s, %s, but got: %s", ModeEnforce, ModeWarn, vs.Mode), "mode")) + } + return errs +} + +// Validate KeyRef will check if one of KeyRef's Data or SecretRef exists, and the +// Supported HashAlgorithm is in supportedSignatureAlgorithms. +func (key *KeyRef) Validate(ctx context.Context) (errs *apis.FieldError) { + // Validate that one and only one of Data, SecretRef, KMS is defined. + keyCount := 0 + if key.Data != "" { + keyCount++ + } + if key.SecretRef != nil { + keyCount++ + } + if key.KMS != "" { + keyCount++ + } + + switch keyCount { + case 0: + errs = errs.Also(apis.ErrMissingOneOf("data", "kms", "secretref")) + case 1: + // do nothing -- a single key definition is valid + default: + errs = errs.Also(apis.ErrMultipleOneOf("data", "kms", "secretref")) + } + + errs = errs.Also(validateHashAlgorithm(key.HashAlgorithm)) + + return errs +} + +// Validate ResourcePattern and make sure the Pattern is valid regex expression +func (r *ResourcePattern) Validate(ctx context.Context) (errs *apis.FieldError) { + if _, err := regexp.Compile(r.Pattern); err != nil { + errs = errs.Also(apis.ErrInvalidValue(r.Pattern, "ResourcePattern", fmt.Sprintf("%v: %v", InvalidResourcePatternErr, err))) + return errs + } + return nil +} + +// validateHashAlgorithm checks if the algorithm is supported +func validateHashAlgorithm(algorithmName HashAlgorithm) (errs *apis.FieldError) { + normalizedAlgo := strings.ToLower(string(algorithmName)) + _, exists := SupportedSignatureAlgorithms[HashAlgorithm(normalizedAlgo)] + if !exists { + return apis.ErrInvalidValue(algorithmName, "HashAlgorithm") + } + return nil +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go index 47123e63dd..2da3fac462 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1/zz_generated.deepcopy.go @@ -24,10 +24,32 @@ package v1alpha1 import ( pod "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" v1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Authority) DeepCopyInto(out *Authority) { + *out = *in + if in.Key != nil { + in, out := &in.Key, &out.Key + *out = new(KeyRef) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Authority. +func (in *Authority) DeepCopy() *Authority { + if in == nil { + return nil + } + out := new(Authority) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EmbeddedRunSpec) DeepCopyInto(out *EmbeddedRunSpec) { *out = *in @@ -47,6 +69,43 @@ func (in *EmbeddedRunSpec) DeepCopy() *EmbeddedRunSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KeyRef) DeepCopyInto(out *KeyRef) { + *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + *out = new(v1.SecretReference) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeyRef. +func (in *KeyRef) DeepCopy() *KeyRef { + if in == nil { + return nil + } + out := new(KeyRef) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ResourcePattern) DeepCopyInto(out *ResourcePattern) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourcePattern. +func (in *ResourcePattern) DeepCopy() *ResourcePattern { + if in == nil { + return nil + } + out := new(ResourcePattern) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Run) DeepCopyInto(out *Run) { *out = *in @@ -123,7 +182,7 @@ func (in *RunSpec) DeepCopyInto(out *RunSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]v1beta1.Param, len(*in)) + *out = make(v1beta1.Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -135,7 +194,7 @@ func (in *RunSpec) DeepCopyInto(out *RunSpec) { } if in.Timeout != nil { in, out := &in.Timeout, &out.Timeout - *out = new(v1.Duration) + *out = new(metav1.Duration) **out = **in } if in.Workspaces != nil { @@ -157,3 +216,91 @@ func (in *RunSpec) DeepCopy() *RunSpec { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerificationPolicy) DeepCopyInto(out *VerificationPolicy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerificationPolicy. +func (in *VerificationPolicy) DeepCopy() *VerificationPolicy { + if in == nil { + return nil + } + out := new(VerificationPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VerificationPolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerificationPolicyList) DeepCopyInto(out *VerificationPolicyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]VerificationPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerificationPolicyList. +func (in *VerificationPolicyList) DeepCopy() *VerificationPolicyList { + if in == nil { + return nil + } + out := new(VerificationPolicyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VerificationPolicyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerificationPolicySpec) DeepCopyInto(out *VerificationPolicySpec) { + *out = *in + if in.Resources != nil { + in, out := &in.Resources, &out.Resources + *out = make([]ResourcePattern, len(*in)) + copy(*out, *in) + } + if in.Authorities != nil { + in, out := &in.Authorities, &out.Authorities + *out = make([]Authority, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerificationPolicySpec. +func (in *VerificationPolicySpec) DeepCopy() *VerificationPolicySpec { + if in == nil { + return nil + } + out := new(VerificationPolicySpec) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/cluster_task_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/cluster_task_types.go index 1a78de2605..aaaf03b9cf 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/cluster_task_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/cluster_task_types.go @@ -31,7 +31,9 @@ import ( // ClusterTask is a Task with a cluster scope. ClusterTasks are used to // represent Tasks that should be publicly addressable from any namespace in the -// cluster. Deprecated: Please use the cluster resolver instead. +// cluster. +// +// Deprecated: Please use the cluster resolver instead. type ClusterTask struct { metav1.TypeMeta `json:",inline"` // +optional diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_conversion.go index 746831bfda..816e4e9918 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_conversion.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_types.go index 624a1c373f..980ad392c8 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/container_types.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( @@ -7,7 +23,6 @@ import ( // Step runs a subcomponent of a Task type Step struct { - // Name of the Step specified as a DNS_LABEL. // Each Step in a Task must have a unique name. Name string `json:"name" protobuf:"bytes,1,opt,name=name"` @@ -43,7 +58,6 @@ type Step struct { // Cannot be updated. // +optional WorkingDir string `json:"workingDir,omitempty" protobuf:"bytes,5,opt,name=workingDir"` - // Deprecated. This field will be removed in a future release. // List of ports to expose from the Step's container. Exposing a port here gives // the system additional information about the network connections a // container uses, but is primarily informational. Not specifying a port here @@ -51,6 +65,9 @@ type Step struct { // listening on the default "0.0.0.0" address inside a container will be // accessible from the network. // Cannot be updated. + // + // Deprecated: This field will be removed in a future release. + // // +optional // +patchMergeKey=containerPort // +patchStrategy=merge @@ -92,21 +109,25 @@ type Step struct { // +optional // +listType=atomic VolumeDevices []corev1.VolumeDevice `json:"volumeDevices,omitempty" patchStrategy:"merge" patchMergeKey:"devicePath" protobuf:"bytes,21,rep,name=volumeDevices"` - // Deprecated. This field will be removed in a future release. // Periodic probe of container liveness. // Step will be restarted if the probe fails. // Cannot be updated. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedLivenessProbe *corev1.Probe `json:"livenessProbe,omitempty" protobuf:"bytes,10,opt,name=livenessProbe"` - // Deprecated. This field will be removed in a future release. // Periodic probe of container service readiness. // Step will be removed from service endpoints if the probe fails. // Cannot be updated. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"` - // Deprecated. This field will be removed in a future release. + // DeprecatedStartupProbe indicates that the Pod this Step runs in has successfully initialized. // If specified, no other probes are executed until this completes successfully. // If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. @@ -114,17 +135,22 @@ type Step struct { // when it might take a long time to load data or warm a cache, than during steady-state operation. // This cannot be updated. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedStartupProbe *corev1.Probe `json:"startupProbe,omitempty" protobuf:"bytes,22,opt,name=startupProbe"` - // Deprecated. This field will be removed in a future release. // Actions that the management system should take in response to container lifecycle events. // Cannot be updated. + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedLifecycle *corev1.Lifecycle `json:"lifecycle,omitempty" protobuf:"bytes,12,opt,name=lifecycle"` - // Deprecated. This field will be removed in a future release and can't be meaningfully used. + // Deprecated: This field will be removed in a future release and can't be meaningfully used. // +optional DeprecatedTerminationMessagePath string `json:"terminationMessagePath,omitempty" protobuf:"bytes,13,opt,name=terminationMessagePath"` - // Deprecated. This field will be removed in a future release and can't be meaningfully used. + // Deprecated: This field will be removed in a future release and can't be meaningfully used. // +optional DeprecatedTerminationMessagePolicy corev1.TerminationMessagePolicy `json:"terminationMessagePolicy,omitempty" protobuf:"bytes,20,opt,name=terminationMessagePolicy,casttype=TerminationMessagePolicy"` // Image pull policy. @@ -142,13 +168,14 @@ type Step struct { // Variables for interactive containers, these are deprecated and should not be used. - // Deprecated. This field will be removed in a future release. // Whether this container should allocate a buffer for stdin in the container runtime. If this // is not set, reads from stdin in the container will always result in EOF. // Default is false. + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedStdin bool `json:"stdin,omitempty" protobuf:"varint,16,opt,name=stdin"` - // Deprecated. This field will be removed in a future release. // Whether the container runtime should close the stdin channel after it has been opened by // a single attach. When stdin is true the stdin stream will remain open across multiple attach // sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the @@ -156,11 +183,16 @@ type Step struct { // at which time stdin is closed and remains closed until the container is restarted. If this // flag is false, a container processes that reads from stdin will never receive an EOF. // Default is false + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedStdinOnce bool `json:"stdinOnce,omitempty" protobuf:"varint,17,opt,name=stdinOnce"` - // Deprecated. This field will be removed in a future release. // Whether this container should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. // Default is false. + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedTTY bool `json:"tty,omitempty" protobuf:"varint,18,opt,name=tty"` @@ -271,11 +303,12 @@ func (s *Step) SetContainerFields(c corev1.Container) { // StepTemplate is a template for a Step type StepTemplate struct { - - // Deprecated. This field will be removed in a future release. // Default name for each Step specified as a DNS_LABEL. // Each Step in a Task must have a unique name. // Cannot be updated. + // + // Deprecated: This field will be removed in a future release. + // DeprecatedName string `json:"name" protobuf:"bytes,1,opt,name=name"` // Default image name to use for each Step. // More info: https://kubernetes.io/docs/concepts/containers/images @@ -311,7 +344,6 @@ type StepTemplate struct { // Cannot be updated. // +optional WorkingDir string `json:"workingDir,omitempty" protobuf:"bytes,5,opt,name=workingDir"` - // Deprecated. This field will be removed in a future release. // List of ports to expose from the Step's container. Exposing a port here gives // the system additional information about the network connections a // container uses, but is primarily informational. Not specifying a port here @@ -319,6 +351,9 @@ type StepTemplate struct { // listening on the default "0.0.0.0" address inside a container will be // accessible from the network. // Cannot be updated. + // + // Deprecated: This field will be removed in a future release. + // // +optional // +patchMergeKey=containerPort // +patchStrategy=merge @@ -360,21 +395,24 @@ type StepTemplate struct { // +optional // +listType=atomic VolumeDevices []corev1.VolumeDevice `json:"volumeDevices,omitempty" patchStrategy:"merge" patchMergeKey:"devicePath" protobuf:"bytes,21,rep,name=volumeDevices"` - // Deprecated. This field will be removed in a future release. // Periodic probe of container liveness. // Container will be restarted if the probe fails. // Cannot be updated. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedLivenessProbe *corev1.Probe `json:"livenessProbe,omitempty" protobuf:"bytes,10,opt,name=livenessProbe"` - // Deprecated. This field will be removed in a future release. // Periodic probe of container service readiness. // Container will be removed from service endpoints if the probe fails. // Cannot be updated. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"` - // Deprecated. This field will be removed in a future release. // DeprecatedStartupProbe indicates that the Pod has successfully initialized. // If specified, no other probes are executed until this completes successfully. // If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. @@ -382,17 +420,22 @@ type StepTemplate struct { // when it might take a long time to load data or warm a cache, than during steady-state operation. // This cannot be updated. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedStartupProbe *corev1.Probe `json:"startupProbe,omitempty" protobuf:"bytes,22,opt,name=startupProbe"` - // Deprecated. This field will be removed in a future release. // Actions that the management system should take in response to container lifecycle events. // Cannot be updated. + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedLifecycle *corev1.Lifecycle `json:"lifecycle,omitempty" protobuf:"bytes,12,opt,name=lifecycle"` - // Deprecated. This field will be removed in a future release and cannot be meaningfully used. + // Deprecated: This field will be removed in a future release and cannot be meaningfully used. // +optional DeprecatedTerminationMessagePath string `json:"terminationMessagePath,omitempty" protobuf:"bytes,13,opt,name=terminationMessagePath"` - // Deprecated. This field will be removed in a future release and cannot be meaningfully used. + // Deprecated: This field will be removed in a future release and cannot be meaningfully used. // +optional DeprecatedTerminationMessagePolicy corev1.TerminationMessagePolicy `json:"terminationMessagePolicy,omitempty" protobuf:"bytes,20,opt,name=terminationMessagePolicy,casttype=TerminationMessagePolicy"` // Image pull policy. @@ -410,13 +453,14 @@ type StepTemplate struct { // Variables for interactive containers, these are deprecated and should not be used. - // Deprecated. This field will be removed in a future release. // Whether this Step should allocate a buffer for stdin in the container runtime. If this // is not set, reads from stdin in the Step will always result in EOF. // Default is false. + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedStdin bool `json:"stdin,omitempty" protobuf:"varint,16,opt,name=stdin"` - // Deprecated. This field will be removed in a future release. // Whether the container runtime should close the stdin channel after it has been opened by // a single attach. When stdin is true the stdin stream will remain open across multiple attach // sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the @@ -424,11 +468,16 @@ type StepTemplate struct { // at which time stdin is closed and remains closed until the container is restarted. If this // flag is false, a container processes that reads from stdin will never receive an EOF. // Default is false + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedStdinOnce bool `json:"stdinOnce,omitempty" protobuf:"varint,17,opt,name=stdinOnce"` - // Deprecated. This field will be removed in a future release. // Whether this Step should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. // Default is false. + // + // Deprecated: This field will be removed in a future release. + // // +optional DeprecatedTTY bool `json:"tty,omitempty" protobuf:"varint,18,opt,name=tty"` } @@ -489,7 +538,6 @@ func (s *StepTemplate) ToK8sContainer() *corev1.Container { // Sidecar has nearly the same data structure as Step but does not have the ability to timeout. type Sidecar struct { - // Name of the Sidecar specified as a DNS_LABEL. // Each Sidecar in a Task must have a unique name (DNS_LABEL). // Cannot be updated. diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/customrun_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/customrun_types.go index a24f57a1e0..233270037d 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/customrun_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/customrun_types.go @@ -54,7 +54,7 @@ type CustomRunSpec struct { // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` // Used for cancelling a customrun (and maybe more later on) // +optional @@ -194,7 +194,7 @@ func (r *CustomRun) GetStatusCondition() apis.ConditionAccessor { // GetGroupVersionKind implements kmeta.OwnerRefable. func (*CustomRun) GetGroupVersionKind() schema.GroupVersionKind { - return SchemeGroupVersion.WithKind(pipeline.RunControllerName) + return SchemeGroupVersion.WithKind(pipeline.CustomRunControllerName) } // HasPipelineRunOwnerReference returns true of CustomRun has @@ -256,3 +256,8 @@ func (r *CustomRun) GetTimeout() time.Duration { } return r.Spec.Timeout.Duration } + +// GetRetryCount returns the number of times this CustomRun has already been retried +func (r *CustomRun) GetRetryCount() int { + return len(r.Status.RetriesStatus) +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/matrix_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/matrix_types.go new file mode 100644 index 0000000000..f1c86d4e06 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/matrix_types.go @@ -0,0 +1,362 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 + +import ( + "context" + "fmt" + "sort" + + "github.com/tektoncd/pipeline/pkg/apis/config" + "golang.org/x/exp/maps" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/utils/strings/slices" + "knative.dev/pkg/apis" +) + +// Matrix is used to fan out Tasks in a Pipeline +type Matrix struct { + // Params is a list of parameters used to fan out the pipelineTask + // Params takes only `Parameters` of type `"array"` + // Each array element is supplied to the `PipelineTask` by substituting `params` of type `"string"` in the underlying `Task`. + // The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting. + // +listType=atomic + Params Params `json:"params,omitempty"` + + // Include is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix. + // +optional + // +listType=atomic + Include IncludeParamsList `json:"include,omitempty"` +} + +// IncludeParamsList is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix. +type IncludeParamsList []IncludeParams + +// IncludeParams allows passing in a specific combinations of Parameters into the Matrix. +type IncludeParams struct { + // Name the specified combination + Name string `json:"name,omitempty"` + + // Params takes only `Parameters` of type `"string"` + // The names of the `params` must match the names of the `params` in the underlying `Task` + // +listType=atomic + Params Params `json:"params,omitempty"` +} + +// Combination is a map, mainly defined to hold a single combination from a Matrix with key as param.Name and value as param.Value +type Combination map[string]string + +// Combinations is a Combination list +type Combinations []Combination + +// FanOut returns an list of params that represent combinations +func (m *Matrix) FanOut() []Params { + var combinations, includeCombinations Combinations + includeCombinations = m.getIncludeCombinations() + if m.HasInclude() && !m.HasParams() { + // If there are only Matrix Include Parameters return explicit combinations + return includeCombinations.toParams() + } + // Generate combinations from Matrix Parameters + for _, parameter := range m.Params { + combinations = combinations.fanOutMatrixParams(parameter) + } + combinations.overwriteCombinations(includeCombinations) + combinations = combinations.addNewCombinations(includeCombinations) + return combinations.toParams() +} + +// overwriteCombinations replaces any missing include params in the initial +// matrix params combinations by overwriting the initial combinations with the +// include combinations +func (cs Combinations) overwriteCombinations(ics Combinations) { + for _, paramCombination := range cs { + for _, includeCombination := range ics { + if paramCombination.contains(includeCombination) { + // overwrite the parameter name and value in existing combination + // with the include combination + for name, val := range includeCombination { + paramCombination[name] = val + } + } + } + } +} + +// addNewCombinations creates a new combination for any include parameter +// values that are missing entirely from the initial combinations and +// returns all combinations +func (cs Combinations) addNewCombinations(ics Combinations) Combinations { + for _, includeCombination := range ics { + if cs.shouldAddNewCombination(includeCombination) { + cs = append(cs, includeCombination) + } + } + return cs +} + +// contains returns true if the include parameter name and value exists in combinations +func (c Combination) contains(includeCombination Combination) bool { + for name, val := range includeCombination { + if _, exist := c[name]; exist { + if c[name] != val { + return false + } + } + } + return true +} + +// shouldAddNewCombination returns true if the include parameter name exists but the value is +// missing from combinations +func (cs Combinations) shouldAddNewCombination(includeCombination map[string]string) bool { + if len(includeCombination) == 0 { + return false + } + for _, paramCombination := range cs { + for name, val := range includeCombination { + if _, exist := paramCombination[name]; exist { + if paramCombination[name] == val { + return false + } + } + } + } + return true +} + +// toParams transforms Combinations from a slice of map[string]string to a slice of Params +// such that, these combinations can be directly consumed in creating taskRun/run object +func (cs Combinations) toParams() []Params { + listOfParams := make([]Params, len(cs)) + for i := range cs { + var params Params + combination := cs[i] + order, _ := combination.sortCombination() + for _, key := range order { + params = append(params, Param{ + Name: key, + Value: ParamValue{Type: ParamTypeString, StringVal: combination[key]}, + }) + } + listOfParams[i] = params + } + return listOfParams +} + +// fanOutMatrixParams generates new combinations based on Matrix Parameters. +func (cs Combinations) fanOutMatrixParams(param Param) Combinations { + if len(cs) == 0 { + return initializeCombinations(param) + } + return cs.distribute(param) +} + +// getIncludeCombinations generates combinations based on Matrix Include Parameters +func (m *Matrix) getIncludeCombinations() Combinations { + var combinations Combinations + for i := range m.Include { + includeParams := m.Include[i].Params + newCombination := make(Combination) + for _, param := range includeParams { + newCombination[param.Name] = param.Value.StringVal + } + combinations = append(combinations, newCombination) + } + return combinations +} + +// distribute generates a new Combination of Parameters by adding a new Parameter to an existing list of Combinations. +func (cs Combinations) distribute(param Param) Combinations { + var expandedCombinations Combinations + for _, value := range param.Value.ArrayVal { + for _, combination := range cs { + newCombination := make(Combination) + maps.Copy(newCombination, combination) + newCombination[param.Name] = value + _, orderedCombination := newCombination.sortCombination() + expandedCombinations = append(expandedCombinations, orderedCombination) + } + } + return expandedCombinations +} + +// initializeCombinations generates a new Combination based on the first Parameter in the Matrix. +func initializeCombinations(param Param) Combinations { + var combinations Combinations + for _, value := range param.Value.ArrayVal { + combinations = append(combinations, Combination{param.Name: value}) + } + return combinations +} + +// sortCombination sorts the given Combination based on the Parameter names to produce a deterministic ordering +func (c Combination) sortCombination() ([]string, Combination) { + sortedCombination := make(Combination, len(c)) + order := make([]string, 0, len(c)) + for key := range c { + order = append(order, key) + } + sort.Slice(order, func(i, j int) bool { + return order[i] <= order[j] + }) + for _, key := range order { + sortedCombination[key] = c[key] + } + return order, sortedCombination +} + +// CountCombinations returns the count of Combinations of Parameters generated from the Matrix in PipelineTask. +func (m *Matrix) CountCombinations() int { + // Iterate over Matrix Parameters and compute count of all generated Combinations + count := m.countGeneratedCombinationsFromParams() + + // Add any additional Combinations generated from Matrix Include Parameters + count += m.countNewCombinationsFromInclude() + + return count +} + +// countGeneratedCombinationsFromParams returns the count of Combinations of Parameters generated from the Matrix +// Parameters +func (m *Matrix) countGeneratedCombinationsFromParams() int { + if !m.HasParams() { + return 0 + } + count := 1 + for _, param := range m.Params { + count *= len(param.Value.ArrayVal) + } + return count +} + +// countNewCombinationsFromInclude returns the count of Combinations of Parameters generated from the Matrix +// Include Parameters +func (m *Matrix) countNewCombinationsFromInclude() int { + if !m.HasInclude() { + return 0 + } + if !m.HasParams() { + return len(m.Include) + } + count := 0 + matrixParamMap := m.Params.extractParamMapArrVals() + for _, include := range m.Include { + for _, param := range include.Params { + if val, exist := matrixParamMap[param.Name]; exist { + // If the Matrix Include param values does not exist, a new Combination will be generated + if !slices.Contains(val, param.Value.StringVal) { + count++ + } else { + break + } + } + } + } + return count +} + +// HasInclude returns true if the Matrix has Include Parameters +func (m *Matrix) HasInclude() bool { + return m != nil && m.Include != nil && len(m.Include) > 0 +} + +// HasParams returns true if the Matrix has Parameters +func (m *Matrix) HasParams() bool { + return m != nil && m.Params != nil && len(m.Params) > 0 +} + +// GetAllParams returns a list of all Matrix Parameters +func (m *Matrix) GetAllParams() Params { + var params Params + if m.HasParams() { + params = append(params, m.Params...) + } + if m.HasInclude() { + for _, include := range m.Include { + params = append(params, include.Params...) + } + } + return params +} + +func (m *Matrix) validateCombinationsCount(ctx context.Context) (errs *apis.FieldError) { + matrixCombinationsCount := m.CountCombinations() + maxMatrixCombinationsCount := config.FromContextOrDefaults(ctx).Defaults.DefaultMaxMatrixCombinationsCount + if matrixCombinationsCount > maxMatrixCombinationsCount { + errs = errs.Also(apis.ErrOutOfBoundsValue(matrixCombinationsCount, 0, maxMatrixCombinationsCount, "matrix")) + } + return errs +} + +// validateParams validates the type of Parameter for Matrix.Params and Matrix.Include.Params +// Matrix.Params must be of type array. Matrix.Include.Params must be of type string. +// validateParams also validates Matrix.Params for a unique list of params +// and a unique list of params in each Matrix.Include.Params specification +func (m *Matrix) validateParams() (errs *apis.FieldError) { + if m != nil { + if m.HasInclude() { + for i, include := range m.Include { + errs = errs.Also(include.Params.validateDuplicateParameters().ViaField(fmt.Sprintf("matrix.include[%d].params", i))) + for _, param := range include.Params { + if param.Value.Type != ParamTypeString { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("parameters of type string only are allowed, but got param type %s", string(param.Value.Type)), "").ViaFieldKey("matrix.include.params", param.Name)) + } + } + } + } + if m.HasParams() { + errs = errs.Also(m.Params.validateDuplicateParameters().ViaField("matrix.params")) + for _, param := range m.Params { + if param.Value.Type != ParamTypeArray { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("parameters of type array only are allowed, but got param type %s", string(param.Value.Type)), "").ViaFieldKey("matrix.params", param.Name)) + } + } + } + } + return errs +} + +// validatePipelineParametersVariablesInMatrixParameters validates all pipeline parameter variables including Matrix.Params and Matrix.Include.Params +// that may contain the reference(s) to other params to make sure those references are used appropriately. +func (m *Matrix) validatePipelineParametersVariablesInMatrixParameters(prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { + if m.HasInclude() { + for _, include := range m.Include { + for idx, param := range include.Params { + stringElement := param.Value.StringVal + // Matrix Include Params must be of type string + errs = errs.Also(validateStringVariable(stringElement, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldIndex("", idx).ViaField("matrix.include.params", "")) + } + } + } + if m.HasParams() { + for _, param := range m.Params { + for idx, arrayElement := range param.Value.ArrayVal { + // Matrix Params must be of type array + errs = errs.Also(validateArrayVariable(arrayElement, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldIndex("value", idx).ViaFieldKey("matrix.params", param.Name)) + } + } + } + return errs +} + +func (m *Matrix) validateParameterInOneOfMatrixOrParams(params Params) (errs *apis.FieldError) { + matrixParamNames := m.GetAllParams().ExtractNames() + for _, param := range params { + if matrixParamNames.Has(param.Name) { + errs = errs.Also(apis.ErrMultipleOneOf("matrix["+param.Name+"]", "params["+param.Name+"]")) + } + } + return errs +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/merge.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/merge.go index 335a43f777..c34bb13e0a 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/merge.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/merge.go @@ -58,6 +58,8 @@ func MergeStepsWithStepTemplate(template *StepTemplate, steps []Step) ([]Step, e merged.Args = []string{} } + amendConflictingContainerFields(&merged, s) + // Pass through original step Script, for later conversion. newStep := Step{Script: s.Script, OnError: s.OnError, Timeout: s.Timeout, StdoutConfig: s.StdoutConfig, StderrConfig: s.StderrConfig} newStep.SetContainerFields(merged) @@ -174,3 +176,24 @@ func mergeObjWithTemplateBytes(md *mergeData, obj, out interface{}) error { // Unmarshal the merged JSON to a pointer, and return it. return json.Unmarshal(mergedAsJSON, out) } + +// amendConflictingContainerFields amends conflicting container fields after merge, and overrides conflicting fields +// by fields in step. +func amendConflictingContainerFields(container *corev1.Container, step Step) { + if container == nil || len(step.Env) == 0 { + return + } + + envNameToStepEnv := make(map[string]corev1.EnvVar, len(step.Env)) + for _, e := range step.Env { + envNameToStepEnv[e.Name] = e + } + + for index, env := range container.Env { + if env.ValueFrom != nil && len(env.Value) > 0 { + if e, ok := envNameToStepEnv[env.Name]; ok { + container.Env[index] = e + } + } + } +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/openapi_generated.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/openapi_generated.go index 10ee016640..df879cd588 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/openapi_generated.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/openapi_generated.go @@ -43,6 +43,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.CustomRunSpec": schema_pkg_apis_pipeline_v1beta1_CustomRunSpec(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.EmbeddedCustomRunSpec": schema_pkg_apis_pipeline_v1beta1_EmbeddedCustomRunSpec(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.EmbeddedTask": schema_pkg_apis_pipeline_v1beta1_EmbeddedTask(ref), + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.IncludeParams": schema_pkg_apis_pipeline_v1beta1_IncludeParams(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.InternalTaskModifier": schema_pkg_apis_pipeline_v1beta1_InternalTaskModifier(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Matrix": schema_pkg_apis_pipeline_v1beta1_Matrix(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Param": schema_pkg_apis_pipeline_v1beta1_Param(ref), @@ -54,7 +55,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineRef": schema_pkg_apis_pipeline_v1beta1_PipelineRef(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResourceBinding": schema_pkg_apis_pipeline_v1beta1_PipelineResourceBinding(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResourceRef": schema_pkg_apis_pipeline_v1beta1_PipelineResourceRef(ref), - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResourceResult": schema_pkg_apis_pipeline_v1beta1_PipelineResourceResult(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResult": schema_pkg_apis_pipeline_v1beta1_PipelineResult(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineRun": schema_pkg_apis_pipeline_v1beta1_PipelineRun(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineRunList": schema_pkg_apis_pipeline_v1beta1_PipelineRunList(ref), @@ -76,6 +76,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineWorkspaceDeclaration": schema_pkg_apis_pipeline_v1beta1_PipelineWorkspaceDeclaration(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PropertySpec": schema_pkg_apis_pipeline_v1beta1_PropertySpec(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance": schema_pkg_apis_pipeline_v1beta1_Provenance(ref), + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.RefSource": schema_pkg_apis_pipeline_v1beta1_RefSource(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ResolverRef": schema_pkg_apis_pipeline_v1beta1_ResolverRef(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ResultRef": schema_pkg_apis_pipeline_v1beta1_ResultRef(ref), "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Sidecar": schema_pkg_apis_pipeline_v1beta1_Sidecar(ref), @@ -116,13 +117,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/tektoncd/pipeline/pkg/apis/resolution/v1beta1.ResolutionRequestSpec": schema_pkg_apis_resolution_v1beta1_ResolutionRequestSpec(ref), "github.com/tektoncd/pipeline/pkg/apis/resolution/v1beta1.ResolutionRequestStatus": schema_pkg_apis_resolution_v1beta1_ResolutionRequestStatus(ref), "github.com/tektoncd/pipeline/pkg/apis/resolution/v1beta1.ResolutionRequestStatusFields": schema_pkg_apis_resolution_v1beta1_ResolutionRequestStatusFields(ref), - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResource": schema_pkg_apis_resource_v1alpha1_PipelineResource(ref), - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResourceList": schema_pkg_apis_resource_v1alpha1_PipelineResourceList(ref), - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResourceSpec": schema_pkg_apis_resource_v1alpha1_PipelineResourceSpec(ref), - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResourceStatus": schema_pkg_apis_resource_v1alpha1_PipelineResourceStatus(ref), - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.ResourceDeclaration": schema_pkg_apis_resource_v1alpha1_ResourceDeclaration(ref), - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.ResourceParam": schema_pkg_apis_resource_v1alpha1_ResourceParam(ref), - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.SecretParam": schema_pkg_apis_resource_v1alpha1_SecretParam(ref), } } @@ -218,6 +212,27 @@ func schema_pkg_apis_pipeline_pod_Template(ref common.ReferenceCallback) common. }, }, }, + "env": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "List of environment variables that can be provided to the containers belonging to the pod.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.EnvVar"), + }, + }, + }, + }, + }, "tolerations": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ @@ -386,7 +401,7 @@ func schema_pkg_apis_pipeline_pod_Template(ref common.ReferenceCallback) common. }, }, Dependencies: []string{ - "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.TopologySpreadConstraint", "k8s.io/api/core/v1.Volume"}, + "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.EnvVar", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.TopologySpreadConstraint", "k8s.io/api/core/v1.Volume"}, } } @@ -527,7 +542,7 @@ func schema_pkg_apis_pipeline_v1beta1_ClusterTask(ref common.ReferenceCallback) return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ClusterTask is a Task with a cluster scope. ClusterTasks are used to represent Tasks that should be publicly addressable from any namespace in the cluster. Deprecated: Please use the cluster resolver instead.", + Description: "ClusterTask is a Task with a cluster scope. ClusterTasks are used to represent Tasks that should be publicly addressable from any namespace in the cluster.\n\nDeprecated: Please use the cluster resolver instead.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -618,19 +633,19 @@ func schema_pkg_apis_pipeline_v1beta1_ConfigSource(ref common.ReferenceCallback) return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ConfigSource identifies the source where a resource came from. This can include Git repositories, Task Bundles, file checksums, or other information that allows users to identify where the resource came from and what version was used.", + Description: "ConfigSource contains the information that can uniquely identify where a remote built definition came from i.e. Git repositories, Tekton Bundles in OCI registry and hub.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "uri": { SchemaProps: spec.SchemaProps{ - Description: "URI indicates the identity of the source of the config. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.uri Example: \"https://github.com/tektoncd/catalog\"", + Description: "URI indicates the identity of the source of the build definition. Example: \"https://github.com/tektoncd/catalog\"", Type: []string{"string"}, Format: "", }, }, "digest": { SchemaProps: spec.SchemaProps{ - Description: "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.digest Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", + Description: "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -646,7 +661,7 @@ func schema_pkg_apis_pipeline_v1beta1_ConfigSource(ref common.ReferenceCallback) }, "entryPoint": { SchemaProps: spec.SchemaProps{ - Description: "EntryPoint identifies the entry point into the build. This is often a path to a configuration file and/or a target label within that file. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.entryPoint Example: \"task/git-clone/0.8/git-clone.yaml\"", + Description: "EntryPoint identifies the entry point into the build. This is often a path to a build definition file and/or a target label within that file. Example: \"task/git-clone/0.8/git-clone.yaml\"", Type: []string{"string"}, Format: "", }, @@ -924,7 +939,7 @@ func schema_pkg_apis_pipeline_v1beta1_EmbeddedTask(ref common.ReferenceCallback) }, "resources": { SchemaProps: spec.SchemaProps{ - Description: "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.", + Description: "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.\n\nDeprecated: Unused, preserved only for backwards compatibility", Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskResources"), }, }, @@ -947,6 +962,13 @@ func schema_pkg_apis_pipeline_v1beta1_EmbeddedTask(ref common.ReferenceCallback) }, }, }, + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is a user-facing name of the task that may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "description": { SchemaProps: spec.SchemaProps{ Description: "Description is a user-facing description of the task that may be used to populate a UI.", @@ -1063,11 +1085,52 @@ func schema_pkg_apis_pipeline_v1beta1_EmbeddedTask(ref common.ReferenceCallback) } } +func schema_pkg_apis_pipeline_v1beta1_IncludeParams(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "IncludeParams allows passing in a specific combinations of Parameters into the Matrix.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name the specified combination", + Type: []string{"string"}, + Format: "", + }, + }, + "params": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Params takes only `Parameters` of type `\"string\"` The names of the `params` must match the names of the `params` in the underlying `Task`", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Param"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Param"}, + } +} + func schema_pkg_apis_pipeline_v1beta1_InternalTaskModifier(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "InternalTaskModifier implements TaskModifier for resources that are built-in to Tekton Pipelines.", + Description: "InternalTaskModifier implements TaskModifier for resources that are built-in to Tekton Pipelines.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "stepsToPrepend": { @@ -1159,11 +1222,30 @@ func schema_pkg_apis_pipeline_v1beta1_Matrix(ref common.ReferenceCallback) commo }, }, }, + "include": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Include is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.IncludeParams"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Param"}, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.IncludeParams", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Param"}, } } @@ -1262,14 +1344,14 @@ func schema_pkg_apis_pipeline_v1beta1_ParamValue(ref common.ReferenceCallback) c Description: "ResultValue is a type alias of ParamValue", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "type": { + "Type": { SchemaProps: spec.SchemaProps{ Default: "", Type: []string{"string"}, Format: "", }, }, - "stringVal": { + "StringVal": { SchemaProps: spec.SchemaProps{ Description: "Represents the stored type of ParamValues.", Default: "", @@ -1277,7 +1359,7 @@ func schema_pkg_apis_pipeline_v1beta1_ParamValue(ref common.ReferenceCallback) c Format: "", }, }, - "arrayVal": { + "ArrayVal": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ "x-kubernetes-list-type": "atomic", @@ -1296,7 +1378,7 @@ func schema_pkg_apis_pipeline_v1beta1_ParamValue(ref common.ReferenceCallback) c }, }, }, - "objectVal": { + "ObjectVal": { SchemaProps: spec.SchemaProps{ Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ @@ -1312,7 +1394,7 @@ func schema_pkg_apis_pipeline_v1beta1_ParamValue(ref common.ReferenceCallback) c }, }, }, - Required: []string{"type", "stringVal", "arrayVal", "objectVal"}, + Required: []string{"Type", "StringVal", "ArrayVal", "ObjectVal"}, }, }, } @@ -1364,7 +1446,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineDeclaredResource(ref common.Refere return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PipelineDeclaredResource is used by a Pipeline to declare the types of the PipelineResources that it will required to run and names which can be used to refer to these PipelineResources in PipelineTaskResourceBindings.", + Description: "PipelineDeclaredResource is used by a Pipeline to declare the types of the PipelineResources that it will required to run and names which can be used to refer to these PipelineResources in PipelineTaskResourceBindings.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -1469,7 +1551,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRef(ref common.ReferenceCallback) }, "bundle": { SchemaProps: spec.SchemaProps{ - Description: "Bundle url reference to a Tekton Bundle. Deprecated: Please use ResolverRef with the bundles resolver instead.", + Description: "Bundle url reference to a Tekton Bundle.\n\nDeprecated: Please use ResolverRef with the bundles resolver instead.", Type: []string{"string"}, Format: "", }, @@ -1484,7 +1566,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineResourceBinding(ref common.Referen return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PipelineResourceBinding connects a reference to an instance of a PipelineResource with a PipelineResource dependency that the Pipeline has declared", + Description: "PipelineResourceBinding connects a reference to an instance of a PipelineResource with a PipelineResource dependency that the Pipeline has declared\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -1518,7 +1600,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineResourceRef(ref common.ReferenceCa return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PipelineResourceRef can be used to refer to a specific instance of a Resource", + Description: "PipelineResourceRef can be used to refer to a specific instance of a Resource\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -1541,46 +1623,6 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineResourceRef(ref common.ReferenceCa } } -func schema_pkg_apis_pipeline_v1beta1_PipelineResourceResult(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "PipelineResourceResult used to export the image name and digest as json", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "key": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "value": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "resourceName": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "type": { - SchemaProps: spec.SchemaProps{ - Type: []string{"integer"}, - Format: "int32", - }, - }, - }, - Required: []string{"key", "value"}, - }, - }, - } -} - func schema_pkg_apis_pipeline_v1beta1_PipelineResult(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1757,7 +1799,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunRunStatus(ref common.ReferenceC return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PipelineRunRunStatus contains the name of the PipelineTask for this Run and the Run's Status", + Description: "PipelineRunRunStatus contains the name of the PipelineTask for this CustomRun or Run and the CustomRun or Run's Status", Type: []string{"object"}, Properties: map[string]spec.Schema{ "pipelineTaskName": { @@ -1769,8 +1811,8 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunRunStatus(ref common.ReferenceC }, "status": { SchemaProps: spec.SchemaProps{ - Description: "Status is the RunStatus for the corresponding Run", - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1.RunStatus"), + Description: "Status is the CustomRunStatus for the corresponding CustomRun or Run", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/run/v1beta1.CustomRunStatus"), }, }, "whenExpressions": { @@ -1796,7 +1838,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunRunStatus(ref common.ReferenceC }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.WhenExpression", "github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1.RunStatus"}, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.WhenExpression", "github.com/tektoncd/pipeline/pkg/apis/run/v1beta1.CustomRunStatus"}, } } @@ -1824,7 +1866,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunSpec(ref common.ReferenceCallba }, }, SchemaProps: spec.SchemaProps{ - Description: "Resources is a list of bindings specifying which actual instances of PipelineResources to use for the resources the Pipeline has declared it needs.", + Description: "Resources is a list of bindings specifying which actual instances of PipelineResources to use for the resources the Pipeline has declared it needs.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -1876,7 +1918,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunSpec(ref common.ReferenceCallba }, "timeout": { SchemaProps: spec.SchemaProps{ - Description: "Timeout Deprecated: use pipelineRunSpec.Timeouts.Pipeline instead Time after which the Pipeline times out. Defaults to never. Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + Description: "Timeout is the Time after which the Pipeline times out. Defaults to never. Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration\n\nDeprecated: use pipelineRunSpec.Timeouts.Pipeline instead", Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Duration"), }, }, @@ -1996,7 +2038,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunStatus(ref common.ReferenceCall }, "taskRuns": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated - use ChildReferences instead. map of PipelineRunTaskRunStatus with the taskRun name as the key", + Description: "TaskRuns is a map of PipelineRunTaskRunStatus with the taskRun name as the key.\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -2010,7 +2052,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunStatus(ref common.ReferenceCall }, "runs": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated - use ChildReferences instead. map of PipelineRunRunStatus with the run name as the key", + Description: "Runs is a map of PipelineRunRunStatus with the run name as the key\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -2097,6 +2139,22 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunStatus(ref common.ReferenceCall Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, }, }, @@ -2126,7 +2184,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunStatusFields(ref common.Referen }, "taskRuns": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated - use ChildReferences instead. map of PipelineRunTaskRunStatus with the taskRun name as the key", + Description: "TaskRuns is a map of PipelineRunTaskRunStatus with the taskRun name as the key.\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -2140,7 +2198,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunStatusFields(ref common.Referen }, "runs": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated - use ChildReferences instead. map of PipelineRunRunStatus with the run name as the key", + Description: "Runs is a map of PipelineRunRunStatus with the run name as the key\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -2227,6 +2285,22 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineRunStatusFields(ref common.Referen Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, }, }, @@ -2289,6 +2363,13 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineSpec(ref common.ReferenceCallback) Description: "PipelineSpec defines the desired state of Pipeline.", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is a user-facing name of the pipeline that may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "description": { SchemaProps: spec.SchemaProps{ Description: "Description is a user-facing description of the pipeline that may be used to populate a UI.", @@ -2303,7 +2384,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineSpec(ref common.ReferenceCallback) }, }, SchemaProps: spec.SchemaProps{ - Description: "Resources declares the names and types of the resources given to the Pipeline's tasks as inputs and outputs.", + Description: "Deprecated: Unused, preserved only for backwards compatibility", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -2432,6 +2513,20 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineTask(ref common.ReferenceCallback) Format: "", }, }, + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is the display name of this task within the context of a Pipeline. This display name may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, + "description": { + SchemaProps: spec.SchemaProps{ + Description: "Description is the description of this task within the context of a Pipeline. This description may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "taskRef": { SchemaProps: spec.SchemaProps{ Description: "TaskRef is a reference to a task definition.", @@ -2487,7 +2582,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineTask(ref common.ReferenceCallback) }, "resources": { SchemaProps: spec.SchemaProps{ - Description: "Resources declares the resources given to this task as inputs and outputs.", + Description: "Deprecated: Unused, preserved only for backwards compatibility", Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineTaskResources"), }, }, @@ -2553,7 +2648,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineTaskInputResource(ref common.Refer return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PipelineTaskInputResource maps the name of a declared PipelineResource input dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used. This input may come from a previous task.", + Description: "PipelineTaskInputResource maps the name of a declared PipelineResource input dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used. This input may come from a previous task.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -2646,7 +2741,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineTaskOutputResource(ref common.Refe return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PipelineTaskOutputResource maps the name of a declared PipelineResource output dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used.", + Description: "PipelineTaskOutputResource maps the name of a declared PipelineResource output dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -2704,7 +2799,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineTaskResources(ref common.Reference return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PipelineTaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.", + Description: "PipelineTaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "inputs": { @@ -2855,7 +2950,7 @@ func schema_pkg_apis_pipeline_v1beta1_PipelineWorkspaceDeclaration(ref common.Re return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding. Deprecated: use PipelineWorkspaceDeclaration type instead", + Description: "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding.\n\nDeprecated: use PipelineWorkspaceDeclaration type instead", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -2910,20 +3005,75 @@ func schema_pkg_apis_pipeline_v1beta1_Provenance(ref common.ReferenceCallback) c return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). For now, it only contains the subfield `ConfigSource` that identifies the source where a build config file came from. In future, it can be expanded as needed to include more metadata about the build. This field aims to be used to carry minimum amount of the authenticated metadata in *Run status so that Tekton Chains can pick it up and record in the provenance it generates.", + Description: "Provenance contains metadata about resources used in the TaskRun/PipelineRun such as the source from where a remote build definition was fetched. This field aims to carry minimum amoumt of metadata in *Run status so that Tekton Chains can capture them in the provenance.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "configSource": { SchemaProps: spec.SchemaProps{ - Description: "ConfigSource identifies the source where a resource came from.", + Description: "Deprecated: Use RefSource instead", Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource"), }, }, + "refSource": { + SchemaProps: spec.SchemaProps{ + Description: "RefSource identifies the source where a remote task/pipeline came from.", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.RefSource"), + }, + }, + "featureFlags": { + SchemaProps: spec.SchemaProps{ + Description: "FeatureFlags identifies the feature flags that were used during the task/pipeline run", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/config.FeatureFlags"), + }, + }, }, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource"}, + "github.com/tektoncd/pipeline/pkg/apis/config.FeatureFlags", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.RefSource"}, + } +} + +func schema_pkg_apis_pipeline_v1beta1_RefSource(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RefSource contains the information that can uniquely identify where a remote built definition came from i.e. Git repositories, Tekton Bundles in OCI registry and hub.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "uri": { + SchemaProps: spec.SchemaProps{ + Description: "URI indicates the identity of the source of the build definition. Example: \"https://github.com/tektoncd/catalog\"", + Type: []string{"string"}, + Format: "", + }, + }, + "digest": { + SchemaProps: spec.SchemaProps{ + Description: "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "entryPoint": { + SchemaProps: spec.SchemaProps{ + Description: "EntryPoint identifies the entry point into the build. This is often a path to a build definition file and/or a target label within that file. Example: \"task/git-clone/0.8/git-clone.yaml\"", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, } } @@ -3484,7 +3634,7 @@ func schema_pkg_apis_pipeline_v1beta1_Step(ref common.ReferenceCallback) common. }, }, SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + Description: "List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -3587,38 +3737,38 @@ func schema_pkg_apis_pipeline_v1beta1_Step(ref common.ReferenceCallback) common. }, "livenessProbe": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Periodic probe of container liveness. Step will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Description: "Periodic probe of container liveness. Step will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Probe"), }, }, "readinessProbe": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Periodic probe of container service readiness. Step will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Description: "Periodic probe of container service readiness. Step will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Probe"), }, }, "startupProbe": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. DeprecatedStartupProbe indicates that the Pod this Step runs in has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Description: "DeprecatedStartupProbe indicates that the Pod this Step runs in has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Probe"), }, }, "lifecycle": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Actions that the management system should take in response to container lifecycle events. Cannot be updated.", + Description: "Actions that the management system should take in response to container lifecycle events. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Lifecycle"), }, }, "terminationMessagePath": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release and can't be meaningfully used.", + Description: "Deprecated: This field will be removed in a future release and can't be meaningfully used.", Type: []string{"string"}, Format: "", }, }, "terminationMessagePolicy": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release and can't be meaningfully used.", + Description: "Deprecated: This field will be removed in a future release and can't be meaningfully used.", Type: []string{"string"}, Format: "", }, @@ -3638,21 +3788,21 @@ func schema_pkg_apis_pipeline_v1beta1_Step(ref common.ReferenceCallback) common. }, "stdin": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.", + Description: "Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.\n\nDeprecated: This field will be removed in a future release.", Type: []string{"boolean"}, Format: "", }, }, "stdinOnce": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + Description: "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false\n\nDeprecated: This field will be removed in a future release.", Type: []string{"boolean"}, Format: "", }, }, "tty": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Whether this container should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.", + Description: "Whether this container should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.\n\nDeprecated: This field will be removed in a future release.", Type: []string{"boolean"}, Format: "", }, @@ -3797,7 +3947,7 @@ func schema_pkg_apis_pipeline_v1beta1_StepTemplate(ref common.ReferenceCallback) Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Default name for each Step specified as a DNS_LABEL. Each Step in a Task must have a unique name. Cannot be updated.", + Description: "Default name for each Step specified as a DNS_LABEL. Each Step in a Task must have a unique name. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", Default: "", Type: []string{"string"}, Format: "", @@ -3870,7 +4020,7 @@ func schema_pkg_apis_pipeline_v1beta1_StepTemplate(ref common.ReferenceCallback) }, }, SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + Description: "List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -3973,38 +4123,38 @@ func schema_pkg_apis_pipeline_v1beta1_StepTemplate(ref common.ReferenceCallback) }, "livenessProbe": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Description: "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Probe"), }, }, "readinessProbe": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Description: "Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Probe"), }, }, "startupProbe": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. DeprecatedStartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + Description: "DeprecatedStartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Probe"), }, }, "lifecycle": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Actions that the management system should take in response to container lifecycle events. Cannot be updated.", + Description: "Actions that the management system should take in response to container lifecycle events. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", Ref: ref("k8s.io/api/core/v1.Lifecycle"), }, }, "terminationMessagePath": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release and cannot be meaningfully used.", + Description: "Deprecated: This field will be removed in a future release and cannot be meaningfully used.", Type: []string{"string"}, Format: "", }, }, "terminationMessagePolicy": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release and cannot be meaningfully used.", + Description: "Deprecated: This field will be removed in a future release and cannot be meaningfully used.", Type: []string{"string"}, Format: "", }, @@ -4024,21 +4174,21 @@ func schema_pkg_apis_pipeline_v1beta1_StepTemplate(ref common.ReferenceCallback) }, "stdin": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Whether this Step should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the Step will always result in EOF. Default is false.", + Description: "Whether this Step should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the Step will always result in EOF. Default is false.\n\nDeprecated: This field will be removed in a future release.", Type: []string{"boolean"}, Format: "", }, }, "stdinOnce": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + Description: "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false\n\nDeprecated: This field will be removed in a future release.", Type: []string{"boolean"}, Format: "", }, }, "tty": { SchemaProps: spec.SchemaProps{ - Description: "Deprecated. This field will be removed in a future release. Whether this Step should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.", + Description: "Whether this Step should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.\n\nDeprecated: This field will be removed in a future release.", Type: []string{"boolean"}, Format: "", }, @@ -4159,21 +4309,21 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRef(ref common.ReferenceCallback) comm }, "kind": { SchemaProps: spec.SchemaProps{ - Description: "TaskKind indicates the kind of the task, namespaced or cluster scoped.", + Description: "TaskKind indicates the Kind of the Task: 1. Namespaced Task when Kind is set to \"Task\". If Kind is \"\", it defaults to \"Task\". 2. Cluster-Scoped Task when Kind is set to \"ClusterTask\" 3. Custom Task when Kind is non-empty and APIVersion is non-empty", Type: []string{"string"}, Format: "", }, }, "apiVersion": { SchemaProps: spec.SchemaProps{ - Description: "API version of the referent", + Description: "API version of the referent Note: A Task with non-empty APIVersion and Kind is considered a Custom Task", Type: []string{"string"}, Format: "", }, }, "bundle": { SchemaProps: spec.SchemaProps{ - Description: "Bundle url reference to a Tekton Bundle. Deprecated: Please use ResolverRef with the bundles resolver instead.", + Description: "Bundle url reference to a Tekton Bundle.\n\nDeprecated: Please use ResolverRef with the bundles resolver instead.", Type: []string{"string"}, Format: "", }, @@ -4188,7 +4338,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskResource(ref common.ReferenceCallback) return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "TaskResource defines an input or output Resource declared as a requirement by a Task. The Name field will be used to refer to these Resources within the Task definition, and when provided as an Input, the Name will be the path to the volume mounted containing this Resource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).", + Description: "TaskResource defines an input or output Resource declared as a requirement by a Task. The Name field will be used to refer to these Resources within the Task definition, and when provided as an Input, the Name will be the path to the volume mounted containing this Resource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -4239,7 +4389,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskResourceBinding(ref common.ReferenceCa return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "TaskResourceBinding points to the PipelineResource that will be used for the Task input or output called Name.", + Description: "TaskResourceBinding points to the PipelineResource that will be used for the Task input or output called Name.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { @@ -4293,7 +4443,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskResources(ref common.ReferenceCallback return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "TaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.", + Description: "TaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "inputs": { @@ -4478,7 +4628,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunInputs(ref common.ReferenceCallback return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "TaskRunInputs holds the input values that this task was invoked with.", + Description: "TaskRunInputs holds the input values that this task was invoked with.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "resources": { @@ -4578,7 +4728,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunOutputs(ref common.ReferenceCallbac return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "TaskRunOutputs holds the output values that this task was invoked with.", + Description: "TaskRunOutputs holds the output values that this task was invoked with.\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "resources": { @@ -4611,7 +4761,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunResources(ref common.ReferenceCallb return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "TaskRunResources allows a TaskRun to declare inputs and outputs TaskResourceBinding", + Description: "TaskRunResources allows a TaskRun to declare inputs and outputs TaskResourceBinding\n\nDeprecated: Unused, preserved only for backwards compatibility", Type: []string{"object"}, Properties: map[string]spec.Schema{ "inputs": { @@ -4761,7 +4911,8 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunSpec(ref common.ReferenceCallback) }, "resources": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunResources"), + Description: "Deprecated: Unused, preserved only for backwards compatibility", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunResources"), }, }, "serviceAccountName": { @@ -4784,7 +4935,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunSpec(ref common.ReferenceCallback) }, "status": { SchemaProps: spec.SchemaProps{ - Description: "Used for cancelling a taskrun (and maybe more later on)", + Description: "Used for cancelling a TaskRun (and maybe more later on)", Type: []string{"string"}, Format: "", }, @@ -4796,9 +4947,16 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunSpec(ref common.ReferenceCallback) Format: "", }, }, + "retries": { + SchemaProps: spec.SchemaProps{ + Description: "Retries represents how many times this TaskRun should be retried in the event of Task failure.", + Type: []string{"integer"}, + Format: "int32", + }, + }, "timeout": { SchemaProps: spec.SchemaProps{ - Description: "Time after which the build times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + Description: "Time after which one retry attempt times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Duration"), }, }, @@ -4975,7 +5133,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunStatus(ref common.ReferenceCallback }, }, SchemaProps: spec.SchemaProps{ - Description: "CloudEvents describe the state of each cloud event requested via a CloudEventResource.", + Description: "CloudEvents describe the state of each cloud event requested via a CloudEventResource.\n\nDeprecated: Removed in v0.44.0.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -5013,13 +5171,13 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunStatus(ref common.ReferenceCallback }, }, SchemaProps: spec.SchemaProps{ - Description: "Results from Resources built during the taskRun. currently includes the digest of build container images", + Description: "Results from Resources built during the TaskRun. This is tomb-stoned along with the removal of pipelineResources Deprecated: this field is not populated and is preserved only for backwards compatibility", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResourceResult"), + Ref: ref("github.com/tektoncd/pipeline/pkg/result.RunResult"), }, }, }, @@ -5075,12 +5233,28 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunStatus(ref common.ReferenceCallback Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, Required: []string{"podName"}, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.CloudEventDelivery", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResourceResult", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.SidecarState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.StepState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunResult", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunStatus", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.Time", "knative.dev/pkg/apis.Condition"}, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.CloudEventDelivery", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.SidecarState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.StepState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunResult", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunStatus", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskSpec", "github.com/tektoncd/pipeline/pkg/result.RunResult", "k8s.io/apimachinery/pkg/apis/meta/v1.Time", "knative.dev/pkg/apis.Condition"}, } } @@ -5137,7 +5311,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunStatusFields(ref common.ReferenceCa }, }, SchemaProps: spec.SchemaProps{ - Description: "CloudEvents describe the state of each cloud event requested via a CloudEventResource.", + Description: "CloudEvents describe the state of each cloud event requested via a CloudEventResource.\n\nDeprecated: Removed in v0.44.0.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -5175,13 +5349,13 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunStatusFields(ref common.ReferenceCa }, }, SchemaProps: spec.SchemaProps{ - Description: "Results from Resources built during the taskRun. currently includes the digest of build container images", + Description: "Results from Resources built during the TaskRun. This is tomb-stoned along with the removal of pipelineResources Deprecated: this field is not populated and is preserved only for backwards compatibility", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResourceResult"), + Ref: ref("github.com/tektoncd/pipeline/pkg/result.RunResult"), }, }, }, @@ -5237,12 +5411,28 @@ func schema_pkg_apis_pipeline_v1beta1_TaskRunStatusFields(ref common.ReferenceCa Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance"), }, }, + "spanContext": { + SchemaProps: spec.SchemaProps{ + Description: "SpanContext contains tracing span context fields", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, Required: []string{"podName"}, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.CloudEventDelivery", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.PipelineResourceResult", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.SidecarState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.StepState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunResult", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunStatus", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.CloudEventDelivery", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.Provenance", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.SidecarState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.StepState", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunResult", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskRunStatus", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskSpec", "github.com/tektoncd/pipeline/pkg/result.RunResult", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } @@ -5286,7 +5476,7 @@ func schema_pkg_apis_pipeline_v1beta1_TaskSpec(ref common.ReferenceCallback) com Properties: map[string]spec.Schema{ "resources": { SchemaProps: spec.SchemaProps{ - Description: "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.", + Description: "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.\n\nDeprecated: Unused, preserved only for backwards compatibility", Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.TaskResources"), }, }, @@ -5309,6 +5499,13 @@ func schema_pkg_apis_pipeline_v1beta1_TaskSpec(ref common.ReferenceCallback) com }, }, }, + "displayName": { + SchemaProps: spec.SchemaProps{ + Description: "DisplayName is a user-facing name of the task that may be used to populate a UI.", + Type: []string{"string"}, + Format: "", + }, + }, "description": { SchemaProps: spec.SchemaProps{ Description: "Description is a user-facing description of the task that may be used to populate a UI.", @@ -5889,16 +6086,22 @@ func schema_pkg_apis_resolution_v1beta1_ResolutionRequestStatus(ref common.Refer }, "source": { SchemaProps: spec.SchemaProps{ - Description: "Source is the source reference of the remote data that records the url, digest and the entrypoint.", + Description: "Deprecated: Use RefSource instead", Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource"), }, }, + "refSource": { + SchemaProps: spec.SchemaProps{ + Description: "RefSource is the source reference of the remote data that records the url, digest and the entrypoint.", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.RefSource"), + }, + }, }, - Required: []string{"data", "source"}, + Required: []string{"data", "source", "refSource"}, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource", "knative.dev/pkg/apis.Condition"}, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.RefSource", "knative.dev/pkg/apis.Condition"}, } } @@ -5919,304 +6122,21 @@ func schema_pkg_apis_resolution_v1beta1_ResolutionRequestStatusFields(ref common }, "source": { SchemaProps: spec.SchemaProps{ - Description: "Source is the source reference of the remote data that records the url, digest and the entrypoint.", + Description: "Deprecated: Use RefSource instead", Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource"), }, }, - }, - Required: []string{"data", "source"}, - }, - }, - Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource"}, - } -} - -func schema_pkg_apis_resource_v1alpha1_PipelineResource(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "PipelineResource describes a resource that is an input to or output from a Task.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { + "refSource": { SchemaProps: spec.SchemaProps{ - Description: "Spec holds the desired state of the PipelineResource from the client", - Default: map[string]interface{}{}, - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResourceSpec"), - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Description: "Status is deprecated. It usually is used to communicate the observed state of the PipelineResource from the controller, but was unused as there is no controller for PipelineResource.", - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResourceStatus"), + Description: "RefSource is the source reference of the remote data that records the url, digest and the entrypoint.", + Ref: ref("github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.RefSource"), }, }, }, + Required: []string{"data", "source", "refSource"}, }, }, Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResourceSpec", "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResourceStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_pkg_apis_resource_v1alpha1_PipelineResourceList(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "PipelineResourceList contains a list of PipelineResources", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResource"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.PipelineResource", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - } -} - -func schema_pkg_apis_resource_v1alpha1_PipelineResourceSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "PipelineResourceSpec defines an individual resources used in the pipeline.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "description": { - SchemaProps: spec.SchemaProps{ - Description: "Description is a user-facing description of the resource that may be used to populate a UI.", - Type: []string{"string"}, - Format: "", - }, - }, - "type": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "params": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.ResourceParam"), - }, - }, - }, - }, - }, - "secrets": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "Secrets to fetch to populate some of resource fields", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.SecretParam"), - }, - }, - }, - }, - }, - }, - Required: []string{"type", "params"}, - }, - }, - Dependencies: []string{ - "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.ResourceParam", "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1.SecretParam"}, - } -} - -func schema_pkg_apis_resource_v1alpha1_PipelineResourceStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "PipelineResourceStatus does not contain anything because PipelineResources on their own do not have a status Deprecated", - Type: []string{"object"}, - }, - }, - } -} - -func schema_pkg_apis_resource_v1alpha1_ResourceDeclaration(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceDeclaration defines an input or output PipelineResource declared as a requirement by another type such as a Task or Condition. The Name field will be used to refer to these PipelineResources within the type's definition, and when provided as an Input, the Name will be the path to the volume mounted containing this PipelineResource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name declares the name by which a resource is referenced in the definition. Resources may be referenced by name in the definition of a Task's steps.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "type": { - SchemaProps: spec.SchemaProps{ - Description: "Type is the type of this resource;", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "description": { - SchemaProps: spec.SchemaProps{ - Description: "Description is a user-facing description of the declared resource that may be used to populate a UI.", - Type: []string{"string"}, - Format: "", - }, - }, - "targetPath": { - SchemaProps: spec.SchemaProps{ - Description: "TargetPath is the path in workspace directory where the resource will be copied.", - Type: []string{"string"}, - Format: "", - }, - }, - "optional": { - SchemaProps: spec.SchemaProps{ - Description: "Optional declares the resource as optional. By default optional is set to false which makes a resource required. optional: true - the resource is considered optional optional: false - the resource is considered required (equivalent of not specifying it)", - Type: []string{"boolean"}, - Format: "", - }, - }, - }, - Required: []string{"name", "type"}, - }, - }, - } -} - -func schema_pkg_apis_resource_v1alpha1_ResourceParam(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceParam declares a string value to use for the parameter called Name, and is used in the specific context of PipelineResources.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "value": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"name", "value"}, - }, - }, - } -} - -func schema_pkg_apis_resource_v1alpha1_SecretParam(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "SecretParam indicates which secret can be used to populate a field of the resource", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "fieldName": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "secretKey": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "secretName": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"fieldName", "secretKey", "secretName"}, - }, - }, + "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.ConfigSource", "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1.RefSource"}, } } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_conversion.go index 443c94ddde..18de6bd71d 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_conversion.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_types.go index 959d6b7ca7..a2d7e78f3d 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/param_types.go @@ -22,8 +22,8 @@ import ( "fmt" "strings" - resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" "github.com/tektoncd/pipeline/pkg/substitution" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" "knative.dev/pkg/apis" ) @@ -55,6 +55,9 @@ type ParamSpec struct { Default *ParamValue `json:"default,omitempty"` } +// ParamSpecs is a list of ParamSpec +type ParamSpecs []ParamSpec + // PropertySpec defines the struct for object keys type PropertySpec struct { Type ParamType `json:"type,omitempty"` @@ -100,16 +103,253 @@ func (pp *ParamSpec) setDefaultsForProperties() { } } -// ResourceParam declares a string value to use for the parameter called Name, and is used in -// the specific context of PipelineResources. -type ResourceParam = resource.ResourceParam - // Param declares an ParamValues to use for the parameter called name. type Param struct { Name string `json:"name"` Value ParamValue `json:"value"` } +// Params is a list of Param +type Params []Param + +// ExtractNames returns a set of unique names +func (ps Params) ExtractNames() sets.String { + names := sets.String{} + for _, p := range ps { + names.Insert(p.Name) + } + return names +} + +func (ps Params) extractValues() []string { + pvs := []string{} + for i := range ps { + pvs = append(pvs, ps[i].Value.StringVal) + pvs = append(pvs, ps[i].Value.ArrayVal...) + for _, v := range ps[i].Value.ObjectVal { + pvs = append(pvs, v) + } + } + return pvs +} + +// extractParamMapArrVals creates a param map with the key: param.Name and +// val: param.Value.ArrayVal +func (ps Params) extractParamMapArrVals() map[string][]string { + paramsMap := make(map[string][]string) + for _, p := range ps { + paramsMap[p.Name] = p.Value.ArrayVal + } + return paramsMap +} + +// extractParamArrayLengths extract and return the lengths of all array params +// Example of returned value: {"a-array-params": 2,"b-array-params": 2 } +func (ps Params) extractParamArrayLengths() map[string]int { + // Collect all array params + arrayParamsLengths := make(map[string]int) + + // Collect array params lengths from params + for _, p := range ps { + if p.Value.Type == ParamTypeArray { + arrayParamsLengths[p.Name] = len(p.Value.ArrayVal) + } + } + return arrayParamsLengths +} + +// validateDuplicateParameters checks if a parameter with the same name is defined more than once +func (ps Params) validateDuplicateParameters() (errs *apis.FieldError) { + taskParamNames := sets.NewString() + for i, param := range ps { + if taskParamNames.Has(param.Name) { + errs = errs.Also(apis.ErrGeneric(fmt.Sprintf("parameter names must be unique,"+ + " the parameter \"%s\" is also defined at", param.Name), fmt.Sprintf("[%d].name", i))) + } + taskParamNames.Insert(param.Name) + } + return errs +} + +// extractParamArrayLengths extract and return the lengths of all array params +// Example of returned value: {"a-array-params": 2,"b-array-params": 2 } +func (ps ParamSpecs) extractParamArrayLengths() map[string]int { + // Collect all array params + arrayParamsLengths := make(map[string]int) + + // Collect array params lengths from defaults + for _, p := range ps { + if p.Default != nil { + if p.Default.Type == ParamTypeArray { + arrayParamsLengths[p.Name] = len(p.Default.ArrayVal) + } + } + } + return arrayParamsLengths +} + +// validateOutofBoundArrayParams validates if the array indexing params are out of bound +// example of arrayIndexingParams: ["$(params.a-array-param[1])", "$(params.b-array-param[2])"] +// example of arrayParamsLengths: {"a-array-params": 2,"b-array-params": 2 } +func validateOutofBoundArrayParams(arrayIndexingParams []string, arrayParamsLengths map[string]int) error { + outofBoundParams := sets.String{} + for _, val := range arrayIndexingParams { + indexString := substitution.ExtractIndexString(val) + idx, _ := substitution.ExtractIndex(indexString) + // this will extract the param name from reference + // e.g. $(params.a-array-param[1]) -> a-array-param + paramName, _, _ := substitution.ExtractVariablesFromString(substitution.TrimArrayIndex(val), "params") + + if paramLength, ok := arrayParamsLengths[paramName[0]]; ok { + if idx >= paramLength { + outofBoundParams.Insert(val) + } + } + } + if outofBoundParams.Len() > 0 { + return fmt.Errorf("non-existent param references:%v", outofBoundParams.List()) + } + return nil +} + +// extractArrayIndexingParamRefs takes a string of the form `foo-$(params.array-param[1])-bar` and extracts the portions of the string that reference an element in an array param. +// For example, for the string “foo-$(params.array-param[1])-bar-$(params.other-array-param[2])-$(params.string-param)`, +// it would return ["$(params.array-param[1])", "$(params.other-array-param[2])"]. +func extractArrayIndexingParamRefs(paramReference string) []string { + l := []string{} + list := substitution.ExtractParamsExpressions(paramReference) + for _, val := range list { + indexString := substitution.ExtractIndexString(val) + if indexString != "" { + l = append(l, val) + } + } + return l +} + +// extractParamRefsFromSteps get all array indexing references from steps +func extractParamRefsFromSteps(steps []Step) []string { + paramsRefs := []string{} + for _, step := range steps { + paramsRefs = append(paramsRefs, step.Script) + container := step.ToK8sContainer() + paramsRefs = append(paramsRefs, extractParamRefsFromContainer(container)...) + } + return paramsRefs +} + +// extractParamRefsFromStepTemplate get all array indexing references from StepsTemplate +func extractParamRefsFromStepTemplate(stepTemplate *StepTemplate) []string { + if stepTemplate == nil { + return nil + } + container := stepTemplate.ToK8sContainer() + return extractParamRefsFromContainer(container) +} + +// extractParamRefsFromSidecars get all array indexing references from sidecars +func extractParamRefsFromSidecars(sidecars []Sidecar) []string { + paramsRefs := []string{} + for _, s := range sidecars { + paramsRefs = append(paramsRefs, s.Script) + container := s.ToK8sContainer() + paramsRefs = append(paramsRefs, extractParamRefsFromContainer(container)...) + } + return paramsRefs +} + +// extractParamRefsFromVolumes get all array indexing references from volumes +func extractParamRefsFromVolumes(volumes []corev1.Volume) []string { + paramsRefs := []string{} + for i, v := range volumes { + paramsRefs = append(paramsRefs, v.Name) + if v.VolumeSource.ConfigMap != nil { + paramsRefs = append(paramsRefs, v.ConfigMap.Name) + for _, item := range v.ConfigMap.Items { + paramsRefs = append(paramsRefs, item.Key) + paramsRefs = append(paramsRefs, item.Path) + } + } + if v.VolumeSource.Secret != nil { + paramsRefs = append(paramsRefs, v.Secret.SecretName) + for _, item := range v.Secret.Items { + paramsRefs = append(paramsRefs, item.Key) + paramsRefs = append(paramsRefs, item.Path) + } + } + if v.PersistentVolumeClaim != nil { + paramsRefs = append(paramsRefs, v.PersistentVolumeClaim.ClaimName) + } + if v.Projected != nil { + for _, s := range volumes[i].Projected.Sources { + if s.ConfigMap != nil { + paramsRefs = append(paramsRefs, s.ConfigMap.Name) + } + if s.Secret != nil { + paramsRefs = append(paramsRefs, s.Secret.Name) + } + if s.ServiceAccountToken != nil { + paramsRefs = append(paramsRefs, s.ServiceAccountToken.Audience) + } + } + } + if v.CSI != nil { + if v.CSI.NodePublishSecretRef != nil { + paramsRefs = append(paramsRefs, v.CSI.NodePublishSecretRef.Name) + } + if v.CSI.VolumeAttributes != nil { + for _, value := range v.CSI.VolumeAttributes { + paramsRefs = append(paramsRefs, value) + } + } + } + } + return paramsRefs +} + +// extractParamRefsFromContainer get all array indexing references from container +func extractParamRefsFromContainer(c *corev1.Container) []string { + paramsRefs := []string{} + paramsRefs = append(paramsRefs, c.Name) + paramsRefs = append(paramsRefs, c.Image) + paramsRefs = append(paramsRefs, string(c.ImagePullPolicy)) + paramsRefs = append(paramsRefs, c.Args...) + + for ie, e := range c.Env { + paramsRefs = append(paramsRefs, e.Value) + if c.Env[ie].ValueFrom != nil { + if e.ValueFrom.SecretKeyRef != nil { + paramsRefs = append(paramsRefs, e.ValueFrom.SecretKeyRef.LocalObjectReference.Name) + paramsRefs = append(paramsRefs, e.ValueFrom.SecretKeyRef.Key) + } + if e.ValueFrom.ConfigMapKeyRef != nil { + paramsRefs = append(paramsRefs, e.ValueFrom.ConfigMapKeyRef.LocalObjectReference.Name) + paramsRefs = append(paramsRefs, e.ValueFrom.ConfigMapKeyRef.Key) + } + } + } + + for _, e := range c.EnvFrom { + paramsRefs = append(paramsRefs, e.Prefix) + if e.ConfigMapRef != nil { + paramsRefs = append(paramsRefs, e.ConfigMapRef.LocalObjectReference.Name) + } + if e.SecretRef != nil { + paramsRefs = append(paramsRefs, e.SecretRef.LocalObjectReference.Name) + } + } + + paramsRefs = append(paramsRefs, c.WorkingDir) + paramsRefs = append(paramsRefs, c.Command...) + + for _, v := range c.VolumeMounts { + paramsRefs = append(paramsRefs, v.Name) + paramsRefs = append(paramsRefs, v.MountPath) + paramsRefs = append(paramsRefs, v.SubPath) + } + return paramsRefs +} + // ParamType indicates the type of an input parameter; // Used to distinguish between a single string and an array of strings. type ParamType string @@ -130,14 +370,16 @@ var AllParamTypes = []ParamType{ParamTypeString, ParamTypeArray, ParamTypeObject // Used in JSON unmarshalling so that a single JSON field can accept // either an individual string or an array of strings. type ParamValue struct { - Type ParamType `json:"type"` // Represents the stored type of ParamValues. - StringVal string `json:"stringVal"` + Type ParamType // Represents the stored type of ParamValues. + StringVal string // +listType=atomic - ArrayVal []string `json:"arrayVal"` - ObjectVal map[string]string `json:"objectVal"` + ArrayVal []string + ObjectVal map[string]string } // ArrayOrString is deprecated, this is to keep backward compatibility +// +// Deprecated: Use ParamValue instead. type ArrayOrString = ParamValue // UnmarshalJSON implements the json.Unmarshaller interface. @@ -210,6 +452,8 @@ func (paramValues *ParamValue) ApplyReplacements(stringReplacements map[string]s newObjectVal[k] = substitution.ApplyReplacements(v, stringReplacements) } paramValues.ObjectVal = newObjectVal + case ParamTypeString: + fallthrough default: paramValues.applyOrCorrect(stringReplacements, arrayReplacements, objectReplacements) } @@ -285,12 +529,9 @@ func ArrayReference(a string) string { // validatePipelineParametersVariablesInTaskParameters validates param value that // may contain the reference(s) to other params to make sure those references are used appropriately. -func validatePipelineParametersVariablesInTaskParameters(params []Param, prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { - taskParamNames := sets.NewString() - for i, param := range params { - if taskParamNames.Has(param.Name) { - errs = errs.Also(apis.ErrGeneric(fmt.Sprintf("params names must be unique, the same param: %s is defined multiple times at", param.Name), fmt.Sprintf("params[%d].name", i))) - } +func validatePipelineParametersVariablesInTaskParameters(params Params, prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { + errs = errs.Also(params.validateDuplicateParameters()).ViaField("params") + for _, param := range params { switch param.Value.Type { case ParamTypeArray: for idx, arrayElement := range param.Value.ArrayVal { @@ -300,47 +541,11 @@ func validatePipelineParametersVariablesInTaskParameters(params []Param, prefix for key, val := range param.Value.ObjectVal { errs = errs.Also(validateStringVariable(val, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldKey("properties", key).ViaFieldKey("params", param.Name)) } + case ParamTypeString: + fallthrough default: errs = errs.Also(validateParamStringValue(param, prefix, paramNames, arrayParamNames, objectParamNameKeys)) } - taskParamNames.Insert(param.Name) - } - return errs -} - -// validatePipelineParametersVariablesInMatrixParameters validates matrix param value -// that may contain the reference(s) to other params to make sure those references are used appropriately. -func validatePipelineParametersVariablesInMatrixParameters(matrix []Param, prefix string, paramNames sets.String, arrayParamNames sets.String, objectParamNameKeys map[string][]string) (errs *apis.FieldError) { - for _, param := range matrix { - for idx, arrayElement := range param.Value.ArrayVal { - errs = errs.Also(validateArrayVariable(arrayElement, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaFieldIndex("value", idx).ViaFieldKey("matrix", param.Name)) - } - } - return errs -} - -func validateParametersInTaskMatrix(matrix *Matrix) (errs *apis.FieldError) { - if matrix != nil { - for _, param := range matrix.Params { - if param.Value.Type != ParamTypeArray { - errs = errs.Also(apis.ErrInvalidValue("parameters of type array only are allowed in matrix", "").ViaFieldKey("matrix", param.Name)) - } - } - } - return errs -} - -func validateParameterInOneOfMatrixOrParams(matrix *Matrix, params []Param) (errs *apis.FieldError) { - matrixParameterNames := sets.NewString() - if matrix != nil { - for _, param := range matrix.Params { - matrixParameterNames.Insert(param.Name) - } - } - for _, param := range params { - if matrixParameterNames.Has(param.Name) { - errs = errs.Also(apis.ErrMultipleOneOf("matrix["+param.Name+"]", "params["+param.Name+"]")) - } } return errs } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_conversion.go index 992d738d14..0c66a3bd13 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_conversion.go @@ -21,8 +21,6 @@ import ( "fmt" v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" - "github.com/tektoncd/pipeline/pkg/apis/version" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/pkg/apis" ) @@ -36,9 +34,6 @@ func (p *Pipeline) ConvertTo(ctx context.Context, to apis.Convertible) error { switch sink := to.(type) { case *v1.Pipeline: sink.ObjectMeta = p.ObjectMeta - if err := serializePipelineResources(&sink.ObjectMeta, &p.Spec); err != nil { - return err - } return p.Spec.ConvertTo(ctx, &sink.Spec) default: return fmt.Errorf("unknown version, got: %T", sink) @@ -47,6 +42,7 @@ func (p *Pipeline) ConvertTo(ctx context.Context, to apis.Convertible) error { // ConvertTo implements apis.Convertible func (ps *PipelineSpec) ConvertTo(ctx context.Context, sink *v1.PipelineSpec) error { + sink.DisplayName = ps.DisplayName sink.Description = ps.Description sink.Tasks = nil for _, t := range ps.Tasks { @@ -92,9 +88,6 @@ func (p *Pipeline) ConvertFrom(ctx context.Context, from apis.Convertible) error switch source := from.(type) { case *v1.Pipeline: p.ObjectMeta = source.ObjectMeta - if err := deserializePipelineResources(&p.ObjectMeta, &p.Spec); err != nil { - return err - } return p.Spec.ConvertFrom(ctx, &source.Spec) default: return fmt.Errorf("unknown version, got: %T", p) @@ -103,6 +96,7 @@ func (p *Pipeline) ConvertFrom(ctx context.Context, from apis.Convertible) error // ConvertFrom implements apis.Convertible func (ps *PipelineSpec) ConvertFrom(ctx context.Context, source *v1.PipelineSpec) error { + ps.DisplayName = source.DisplayName ps.Description = source.Description ps.Tasks = nil for _, t := range source.Tasks { @@ -145,6 +139,8 @@ func (ps *PipelineSpec) ConvertFrom(ctx context.Context, source *v1.PipelineSpec func (pt PipelineTask) convertTo(ctx context.Context, sink *v1.PipelineTask) error { sink.Name = pt.Name + sink.DisplayName = pt.DisplayName + sink.Description = pt.Description if pt.TaskRef != nil { sink.TaskRef = &v1.TaskRef{} pt.TaskRef.convertTo(ctx, sink.TaskRef) @@ -189,6 +185,8 @@ func (pt PipelineTask) convertTo(ctx context.Context, sink *v1.PipelineTask) err func (pt *PipelineTask) convertFrom(ctx context.Context, source v1.PipelineTask) error { pt.Name = source.Name + pt.DisplayName = source.DisplayName + pt.Description = source.Description if source.TaskRef != nil { newTaskRef := TaskRef{} newTaskRef.convertFrom(ctx, *source.TaskRef) @@ -267,6 +265,14 @@ func (m *Matrix) convertTo(ctx context.Context, sink *v1.Matrix) { param.convertTo(ctx, &new) sink.Params = append(sink.Params, new) } + for i, include := range m.Include { + sink.Include = append(sink.Include, v1.IncludeParams{Name: include.Name}) + for _, param := range include.Params { + newIncludeParam := v1.Param{} + param.convertTo(ctx, &newIncludeParam) + sink.Include[i].Params = append(sink.Include[i].Params, newIncludeParam) + } + } } func (m *Matrix) convertFrom(ctx context.Context, source v1.Matrix) { @@ -275,6 +281,15 @@ func (m *Matrix) convertFrom(ctx context.Context, source v1.Matrix) { new.convertFrom(ctx, param) m.Params = append(m.Params, new) } + + for i, include := range source.Include { + m.Include = append(m.Include, IncludeParams{Name: include.Name}) + for _, p := range include.Params { + new := Param{} + new.convertFrom(ctx, p) + m.Include[i].Params = append(m.Include[i].Params, new) + } + } } func (pr PipelineResult) convertTo(ctx context.Context, sink *v1.PipelineResult) { @@ -304,22 +319,3 @@ func (ptm *PipelineTaskMetadata) convertFrom(ctx context.Context, source v1.Pipe ptm.Labels = source.Labels ptm.Annotations = source.Labels } - -func serializePipelineResources(meta *metav1.ObjectMeta, spec *PipelineSpec) error { - if spec.Resources == nil { - return nil - } - return version.SerializeToMetadata(meta, spec.Resources, resourcesAnnotationKey) -} - -func deserializePipelineResources(meta *metav1.ObjectMeta, spec *PipelineSpec) error { - resources := &[]PipelineDeclaredResource{} - err := version.DeserializeFromMetadata(meta, resources, resourcesAnnotationKey) - if err != nil { - return err - } - if len(*resources) != 0 { - spec.Resources = *resources - } - return nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_defaults.go index a7463ae53e..ec28f038e9 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_defaults.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_defaults.go @@ -19,6 +19,7 @@ package v1beta1 import ( "context" + "github.com/tektoncd/pipeline/pkg/apis/config" "knative.dev/pkg/apis" ) @@ -36,25 +37,27 @@ func (ps *PipelineSpec) SetDefaults(ctx context.Context) { } for _, pt := range ps.Tasks { - if pt.TaskRef != nil { - if pt.TaskRef.Kind == "" { - pt.TaskRef.Kind = NamespacedTaskKind - } - } - if pt.TaskSpec != nil { - pt.TaskSpec.SetDefaults(ctx) - } + pt.SetDefaults(ctx) } for _, ft := range ps.Finally { ctx := ctx // Ensure local scoping per Task - if ft.TaskRef != nil { - if ft.TaskRef.Kind == "" { - ft.TaskRef.Kind = NamespacedTaskKind - } + ft.SetDefaults(ctx) + } +} + +// SetDefaults sets default values for a PipelineTask +func (pt *PipelineTask) SetDefaults(ctx context.Context) { + cfg := config.FromContextOrDefaults(ctx) + if pt.TaskRef != nil { + if pt.TaskRef.Kind == "" { + pt.TaskRef.Kind = NamespacedTaskKind } - if ft.TaskSpec != nil { - ft.TaskSpec.SetDefaults(ctx) + if pt.TaskRef.Name == "" && pt.TaskRef.Resolver == "" { + pt.TaskRef.Resolver = ResolverName(cfg.Defaults.DefaultResolverType) } } + if pt.TaskSpec != nil { + pt.TaskSpec.SetDefaults(ctx) + } } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_interface.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_interface.go index fb21e16daf..58768ceea4 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_interface.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_interface.go @@ -21,7 +21,7 @@ import ( "knative.dev/pkg/apis" ) -// PipelineObject is implemented by Pipeline and ClusterPipeline +// PipelineObject is implemented by Pipeline type PipelineObject interface { apis.Defaultable PipelineMetadata() metav1.ObjectMeta diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_types.go index dc2bdf6de3..efb6607dfc 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_types.go @@ -17,22 +17,12 @@ limitations under the License. package v1beta1 import ( - "context" - "fmt" - "strings" - - "github.com/google/go-containerregistry/pkg/name" - "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" - "github.com/tektoncd/pipeline/pkg/apis/version" - "github.com/tektoncd/pipeline/pkg/reconciler/pipeline/dag" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/validation" - "knative.dev/pkg/apis" "knative.dev/pkg/kmeta" ) @@ -87,12 +77,15 @@ func (*Pipeline) GetGroupVersionKind() schema.GroupVersionKind { // PipelineSpec defines the desired state of Pipeline. type PipelineSpec struct { + // DisplayName is a user-facing name of the pipeline that may be + // used to populate a UI. + // +optional + DisplayName string `json:"displayName,omitempty"` // Description is a user-facing description of the pipeline that may be // used to populate a UI. // +optional Description string `json:"description,omitempty"` - // Resources declares the names and types of the resources given to the - // Pipeline's tasks as inputs and outputs. + // Deprecated: Unused, preserved only for backwards compatibility // +listType=atomic Resources []PipelineDeclaredResource `json:"resources,omitempty"` // Tasks declares the graph of Tasks that execute when this Pipeline is run. @@ -101,7 +94,7 @@ type PipelineSpec struct { // Params declares a list of input parameters that must be supplied when // this Pipeline is run. // +listType=atomic - Params []ParamSpec `json:"params,omitempty"` + Params ParamSpecs `json:"params,omitempty"` // Workspaces declares a set of named workspaces that are expected to be // provided by a PipelineRun. // +optional @@ -162,16 +155,6 @@ type EmbeddedTask struct { TaskSpec `json:",inline,omitempty"` } -// Matrix is used to fan out Tasks in a Pipeline -type Matrix struct { - // Params is a list of parameters used to fan out the pipelineTask - // Params takes only `Parameters` of type `"array"` - // Each array element is supplied to the `PipelineTask` by substituting `params` of type `"string"` in the underlying `Task`. - // The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting. - // +listType=atomic - Params []Param `json:"params,omitempty"` -} - // PipelineTask defines a task in a Pipeline, passing inputs from both // Params and from the output of previous tasks. type PipelineTask struct { @@ -180,6 +163,16 @@ type PipelineTask struct { // the execution order of tasks relative to one another. Name string `json:"name,omitempty"` + // DisplayName is the display name of this task within the context of a Pipeline. + // This display name may be used to populate a UI. + // +optional + DisplayName string `json:"displayName,omitempty"` + + // Description is the description of this task within the context of a Pipeline. + // This description may be used to populate a UI. + // +optional + Description string `json:"description,omitempty"` + // TaskRef is a reference to a task definition. // +optional TaskRef *TaskRef `json:"taskRef,omitempty"` @@ -202,15 +195,14 @@ type PipelineTask struct { // +listType=atomic RunAfter []string `json:"runAfter,omitempty"` - // Resources declares the resources given to this task as inputs and - // outputs. + // Deprecated: Unused, preserved only for backwards compatibility // +optional Resources *PipelineTaskResources `json:"resources,omitempty"` // Parameters declares parameters passed to this task. // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` // Matrix declares parameters used to fan out this task. // +optional @@ -229,207 +221,16 @@ type PipelineTask struct { Timeout *metav1.Duration `json:"timeout,omitempty"` } -// validateRefOrSpec validates at least one of taskRef or taskSpec is specified -func (pt PipelineTask) validateRefOrSpec() (errs *apis.FieldError) { - // can't have both taskRef and taskSpec at the same time - if pt.TaskRef != nil && pt.TaskSpec != nil { - errs = errs.Also(apis.ErrMultipleOneOf("taskRef", "taskSpec")) - } - // Check that one of TaskRef and TaskSpec is present - if pt.TaskRef == nil && pt.TaskSpec == nil { - errs = errs.Also(apis.ErrMissingOneOf("taskRef", "taskSpec")) - } - return errs -} - -// validateCustomTask validates custom task specifications - checking kind and fail if not yet supported features specified -func (pt PipelineTask) validateCustomTask() (errs *apis.FieldError) { - if pt.TaskRef != nil && pt.TaskRef.Kind == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify kind", "taskRef.kind")) - } - if pt.TaskSpec != nil && pt.TaskSpec.Kind == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify kind", "taskSpec.kind")) - } - if pt.TaskRef != nil && pt.TaskRef.APIVersion == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify apiVersion", "taskRef.apiVersion")) - } - if pt.TaskSpec != nil && pt.TaskSpec.APIVersion == "" { - errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify apiVersion", "taskSpec.apiVersion")) - } - - // TODO(#3133): Support these features if possible. - if pt.Resources != nil { - errs = errs.Also(apis.ErrInvalidValue("custom tasks do not support PipelineResources", "resources")) - } - return errs -} - -// validateBundle validates bundle specifications - checking name and bundle -func (pt PipelineTask) validateBundle() (errs *apis.FieldError) { - // bundle requires a TaskRef to be specified - if (pt.TaskRef != nil && pt.TaskRef.Bundle != "") && pt.TaskRef.Name == "" { - errs = errs.Also(apis.ErrMissingField("taskRef.name")) - } - // If a bundle url is specified, ensure it is parsable - if pt.TaskRef != nil && pt.TaskRef.Bundle != "" { - if _, err := name.ParseReference(pt.TaskRef.Bundle); err != nil { - errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("invalid bundle reference (%s)", err.Error()), "taskRef.bundle")) - } - } - return errs -} - -// validateTask validates a pipeline task or a final task for taskRef and taskSpec -func (pt PipelineTask) validateTask(ctx context.Context) (errs *apis.FieldError) { - cfg := config.FromContextOrDefaults(ctx) - // Validate TaskSpec if it's present - if pt.TaskSpec != nil { - errs = errs.Also(pt.TaskSpec.Validate(ctx).ViaField("taskSpec")) - } - if pt.TaskRef != nil { - if pt.TaskRef.Name != "" { - // TaskRef name must be a valid k8s name - if errSlice := validation.IsQualifiedName(pt.TaskRef.Name); len(errSlice) != 0 { - errs = errs.Also(apis.ErrInvalidValue(strings.Join(errSlice, ","), "name")) - } - } else if pt.TaskRef.Resolver == "" { - errs = errs.Also(apis.ErrInvalidValue("taskRef must specify name", "taskRef.name")) - } - // fail if bundle is present when EnableTektonOCIBundles feature flag is off (as it won't be allowed nor used) - if !cfg.FeatureFlags.EnableTektonOCIBundles && pt.TaskRef.Bundle != "" { - errs = errs.Also(apis.ErrDisallowedFields("taskref.bundle")) - } - } - return errs +// IsCustomTask checks whether an embedded TaskSpec is a Custom Task +func (et *EmbeddedTask) IsCustomTask() bool { + // Note that if `apiVersion` is set to `"tekton.dev/v1beta1"` and `kind` is set to `"Task"`, + // the reference will be considered a Custom Task - https://github.com/tektoncd/pipeline/issues/6457 + return et != nil && et.APIVersion != "" && et.Kind != "" } // IsMatrixed return whether pipeline task is matrixed func (pt *PipelineTask) IsMatrixed() bool { - return pt.Matrix != nil && len(pt.Matrix.Params) > 0 -} - -func (pt *PipelineTask) validateMatrix(ctx context.Context) (errs *apis.FieldError) { - if pt.IsMatrixed() { - // This is an alpha feature and will fail validation if it's used in a pipeline spec - // when the enable-api-fields feature gate is anything but "alpha". - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "matrix", config.AlphaAPIFields)) - // Matrix requires "embedded-status" feature gate to be set to "minimal", and will fail - // validation if it is anything but "minimal". - errs = errs.Also(ValidateEmbeddedStatus(ctx, "matrix", config.MinimalEmbeddedStatus)) - errs = errs.Also(pt.validateMatrixCombinationsCount(ctx)) - } - errs = errs.Also(validateParameterInOneOfMatrixOrParams(pt.Matrix, pt.Params)) - errs = errs.Also(validateParametersInTaskMatrix(pt.Matrix)) - return errs -} - -func (pt *PipelineTask) validateMatrixCombinationsCount(ctx context.Context) (errs *apis.FieldError) { - matrixCombinationsCount := pt.GetMatrixCombinationsCount() - maxMatrixCombinationsCount := config.FromContextOrDefaults(ctx).Defaults.DefaultMaxMatrixCombinationsCount - if matrixCombinationsCount > maxMatrixCombinationsCount { - errs = errs.Also(apis.ErrOutOfBoundsValue(matrixCombinationsCount, 0, maxMatrixCombinationsCount, "matrix")) - } - return errs -} - -func (pt PipelineTask) validateEmbeddedOrType() (errs *apis.FieldError) { - // Reject cases where APIVersion and/or Kind are specified alongside an embedded Task. - // We determine if this is an embedded Task by checking of TaskSpec.TaskSpec.Steps has items. - if pt.TaskSpec != nil && len(pt.TaskSpec.TaskSpec.Steps) > 0 { - if pt.TaskSpec.APIVersion != "" { - errs = errs.Also(&apis.FieldError{ - Message: "taskSpec.apiVersion cannot be specified when using taskSpec.steps", - Paths: []string{"taskSpec.apiVersion"}, - }) - } - if pt.TaskSpec.Kind != "" { - errs = errs.Also(&apis.FieldError{ - Message: "taskSpec.kind cannot be specified when using taskSpec.steps", - Paths: []string{"taskSpec.kind"}, - }) - } - } - return -} - -// GetMatrixCombinationsCount returns the count of combinations of Parameters generated from the Matrix in PipelineTask. -func (pt *PipelineTask) GetMatrixCombinationsCount() int { - if !pt.IsMatrixed() { - return 0 - } - count := 1 - for _, param := range pt.Matrix.Params { - count *= len(param.Value.ArrayVal) - } - return count -} - -func (pt *PipelineTask) validateResultsFromMatrixedPipelineTasksNotConsumed(matrixedPipelineTasks sets.String) (errs *apis.FieldError) { - for _, ref := range PipelineTaskResultRefs(pt) { - if matrixedPipelineTasks.Has(ref.PipelineTask) { - errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("consuming results from matrixed task %s is not allowed", ref.PipelineTask), "")) - } - } - return errs -} - -func (pt *PipelineTask) validateExecutionStatusVariablesDisallowed() (errs *apis.FieldError) { - for _, param := range pt.Params { - if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { - errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, "value"). - ViaFieldKey("params", param.Name)) - } - } - for i, we := range pt.WhenExpressions { - if expressions, ok := we.GetVarSubstitutionExpressions(); ok { - errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, ""). - ViaFieldIndex("when", i)) - } - } - return errs -} - -func (pt *PipelineTask) validateExecutionStatusVariablesAllowed(ptNames sets.String) (errs *apis.FieldError) { - for _, param := range pt.Params { - if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { - errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, "value"). - ViaFieldKey("params", param.Name)) - } - } - for i, we := range pt.WhenExpressions { - if expressions, ok := we.GetVarSubstitutionExpressions(); ok { - errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, ""). - ViaFieldIndex("when", i)) - } - } - return errs -} - -func (pt *PipelineTask) validateWorkspaces(workspaceNames sets.String) (errs *apis.FieldError) { - workspaceBindingNames := sets.NewString() - for i, ws := range pt.Workspaces { - if workspaceBindingNames.Has(ws.Name) { - errs = errs.Also(apis.ErrGeneric( - fmt.Sprintf("workspace name %q must be unique", ws.Name), "").ViaFieldIndex("workspaces", i)) - } - - if ws.Workspace == "" { - if !workspaceNames.Has(ws.Name) { - errs = errs.Also(apis.ErrInvalidValue( - fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Name), - "", - ).ViaFieldIndex("workspaces", i)) - } - } else if !workspaceNames.Has(ws.Workspace) { - errs = errs.Also(apis.ErrInvalidValue( - fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Workspace), - "", - ).ViaFieldIndex("workspaces", i)) - } - - workspaceBindingNames.Insert(ws.Name) - } - return errs + return pt.Matrix.HasParams() || pt.Matrix.HasInclude() } // TaskSpecMetadata returns the metadata of the PipelineTask's EmbeddedTask spec. @@ -442,57 +243,11 @@ func (pt PipelineTask) HashKey() string { return pt.Name } -// ValidateName checks whether the PipelineTask's name is a valid DNS label -func (pt PipelineTask) ValidateName() *apis.FieldError { - if err := validation.IsDNS1123Label(pt.Name); len(err) > 0 { - return &apis.FieldError{ - Message: fmt.Sprintf("invalid value %q", pt.Name), - Paths: []string{"name"}, - Details: "Pipeline Task name must be a valid DNS Label." + - "For more info refer to https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", - } - } - return nil -} - -// Validate classifies whether a task is a custom task, bundle, or a regular task(dag/final) -// calls the validation routine based on the type of the task -func (pt PipelineTask) Validate(ctx context.Context) (errs *apis.FieldError) { - errs = errs.Also(pt.validateRefOrSpec()) - - errs = errs.Also(pt.validateEmbeddedOrType()) - - cfg := config.FromContextOrDefaults(ctx) - // If EnableCustomTasks feature flag is on, validate custom task specifications - // pipeline task having taskRef with APIVersion is classified as custom task - switch { - case cfg.FeatureFlags.EnableCustomTasks && pt.TaskRef != nil && pt.TaskRef.APIVersion != "": - errs = errs.Also(pt.validateCustomTask()) - case cfg.FeatureFlags.EnableCustomTasks && pt.TaskSpec != nil && pt.TaskSpec.APIVersion != "": - errs = errs.Also(pt.validateCustomTask()) - // If EnableTektonOCIBundles feature flag is on, validate bundle specifications - case cfg.FeatureFlags.EnableTektonOCIBundles && pt.TaskRef != nil && pt.TaskRef.Bundle != "": - errs = errs.Also(pt.validateBundle()) - default: - errs = errs.Also(pt.validateTask(ctx)) - } - return -} - // Deps returns all other PipelineTask dependencies of this PipelineTask, based on resource usage or ordering func (pt PipelineTask) Deps() []string { // hold the list of dependencies in a set to avoid duplicates deps := sets.NewString() - // add any new dependents from a resource/workspace - if pt.Resources != nil { - for _, rd := range pt.Resources.Inputs { - for _, f := range rd.From { - deps.Insert(f) - } - } - } - // add any new dependents from result references - resource dependency for _, ref := range PipelineTaskResultRefs(&pt) { deps.Insert(ref.PipelineTask) @@ -541,83 +296,12 @@ func (l PipelineTaskList) Names() sets.String { return names } -// Validate a list of pipeline tasks including custom task and bundles -func (l PipelineTaskList) Validate(ctx context.Context, taskNames sets.String, path string) (errs *apis.FieldError) { - for i, t := range l { - // validate pipeline task name - errs = errs.Also(t.ValidateName().ViaFieldIndex(path, i)) - // names cannot be duplicated - checking that pipelineTask names are unique - if _, ok := taskNames[t.Name]; ok { - errs = errs.Also(apis.ErrMultipleOneOf("name").ViaFieldIndex(path, i)) - } - taskNames.Insert(t.Name) - // validate custom task, bundle, dag, or final task - errs = errs.Also(t.Validate(ctx).ViaFieldIndex(path, i)) - } - return errs -} - // PipelineTaskParam is used to provide arbitrary string parameters to a Task. type PipelineTaskParam struct { Name string `json:"name"` Value string `json:"value"` } -// PipelineDeclaredResource is used by a Pipeline to declare the types of the -// PipelineResources that it will required to run and names which can be used to -// refer to these PipelineResources in PipelineTaskResourceBindings. -type PipelineDeclaredResource struct { - // Name is the name that will be used by the Pipeline to refer to this resource. - // It does not directly correspond to the name of any PipelineResources Task - // inputs or outputs, and it does not correspond to the actual names of the - // PipelineResources that will be bound in the PipelineRun. - Name string `json:"name"` - // Type is the type of the PipelineResource. - Type PipelineResourceType `json:"type"` - // Optional declares the resource as optional. - // optional: true - the resource is considered optional - // optional: false - the resource is considered required (default/equivalent of not specifying it) - Optional bool `json:"optional,omitempty"` -} - -// PipelineTaskResources allows a Pipeline to declare how its DeclaredPipelineResources -// should be provided to a Task as its inputs and outputs. -type PipelineTaskResources struct { - // Inputs holds the mapping from the PipelineResources declared in - // DeclaredPipelineResources to the input PipelineResources required by the Task. - // +listType=atomic - Inputs []PipelineTaskInputResource `json:"inputs,omitempty"` - // Outputs holds the mapping from the PipelineResources declared in - // DeclaredPipelineResources to the input PipelineResources required by the Task. - // +listType=atomic - Outputs []PipelineTaskOutputResource `json:"outputs,omitempty"` -} - -// PipelineTaskInputResource maps the name of a declared PipelineResource input -// dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources -// that should be used. This input may come from a previous task. -type PipelineTaskInputResource struct { - // Name is the name of the PipelineResource as declared by the Task. - Name string `json:"name"` - // Resource is the name of the DeclaredPipelineResource to use. - Resource string `json:"resource"` - // From is the list of PipelineTask names that the resource has to come from. - // (Implies an ordering in the execution graph.) - // +optional - // +listType=atomic - From []string `json:"from,omitempty"` -} - -// PipelineTaskOutputResource maps the name of a declared PipelineResource output -// dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources -// that should be used. -type PipelineTaskOutputResource struct { - // Name is the name of the PipelineResource as declared by the Task. - Name string `json:"name"` - // Resource is the name of the DeclaredPipelineResource to use. - Resource string `json:"resource"` -} - // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // PipelineList contains a list of Pipeline @@ -627,47 +311,3 @@ type PipelineList struct { metav1.ListMeta `json:"metadata,omitempty"` Items []Pipeline `json:"items"` } - -func validateContainsExecutionStatusVariablesDisallowed(expressions []string, path string) (errs *apis.FieldError) { - if containsExecutionStatusReferences(expressions) { - errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline tasks can not refer to execution status"+ - " of any other pipeline task or aggregate status of tasks"), path)) - } - return errs -} - -func containsExecutionStatusReferences(expressions []string) bool { - // validate tasks.pipelineTask.status/tasks.status if this expression is not a result reference - if !LooksLikeContainsResultRefs(expressions) { - for _, e := range expressions { - // check if it contains context variable accessing execution status - $(tasks.taskname.status) - // or an aggregate status - $(tasks.status) - if containsExecutionStatusRef(e) { - return true - } - } - } - return false -} - -func validateExecutionStatusVariablesExpressions(expressions []string, ptNames sets.String, fieldPath string) (errs *apis.FieldError) { - // validate tasks.pipelineTask.status if this expression is not a result reference - if !LooksLikeContainsResultRefs(expressions) { - for _, expression := range expressions { - // its a reference to aggregate status of dag tasks - $(tasks.status) - if expression == PipelineTasksAggregateStatus { - continue - } - // check if it contains context variable accessing execution status - $(tasks.taskname.status) - if containsExecutionStatusRef(expression) { - // strip tasks. and .status from tasks.taskname.status to further verify task name - pt := strings.TrimSuffix(strings.TrimPrefix(expression, "tasks."), ".status") - // report an error if the task name does not exist in the list of dag tasks - if !ptNames.Has(pt) { - errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline task %s is not defined in the pipeline", pt), fieldPath)) - } - } - } - } - return errs -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_validation.go index c3d9cd1cd7..c170e85a3b 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipeline_validation.go @@ -21,14 +21,16 @@ import ( "fmt" "strings" + "github.com/google/go-containerregistry/pkg/name" "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/validate" - "github.com/tektoncd/pipeline/pkg/list" + "github.com/tektoncd/pipeline/pkg/apis/version" "github.com/tektoncd/pipeline/pkg/reconciler/pipeline/dag" "github.com/tektoncd/pipeline/pkg/substitution" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/validation" "knative.dev/pkg/apis" "knative.dev/pkg/webhook/resourcesemantics" ) @@ -57,11 +59,9 @@ func (ps *PipelineSpec) Validate(ctx context.Context) (errs *apis.FieldError) { } // PipelineTask must have a valid unique label and at least one of taskRef or taskSpec should be specified errs = errs.Also(ValidatePipelineTasks(ctx, ps.Tasks, ps.Finally)) - // All declared resources should be used, and the Pipeline shouldn't try to use any resources - // that aren't declared - errs = errs.Also(validateDeclaredResources(ps.Resources, ps.Tasks, ps.Finally)) - // The from values should make sense - errs = errs.Also(validateFrom(ps.Tasks)) + if len(ps.Resources) > 0 { + errs = errs.Also(apis.ErrDisallowedFields("resources")) + } // Validate the pipeline task graph errs = errs.Also(validateGraph(ps.Tasks)) // The parameter variables should be valid @@ -95,6 +95,199 @@ func ValidatePipelineTasks(ctx context.Context, tasks []PipelineTask, finalTasks return errs } +// Validate a list of pipeline tasks including custom task and bundles +func (l PipelineTaskList) Validate(ctx context.Context, taskNames sets.String, path string) (errs *apis.FieldError) { + for i, t := range l { + // validate pipeline task name + errs = errs.Also(t.ValidateName().ViaFieldIndex(path, i)) + // names cannot be duplicated - checking that pipelineTask names are unique + if _, ok := taskNames[t.Name]; ok { + errs = errs.Also(apis.ErrMultipleOneOf("name").ViaFieldIndex(path, i)) + } + taskNames.Insert(t.Name) + // validate custom task, bundle, dag, or final task + errs = errs.Also(t.Validate(ctx).ViaFieldIndex(path, i)) + } + return errs +} + +// ValidateName checks whether the PipelineTask's name is a valid DNS label +func (pt PipelineTask) ValidateName() *apis.FieldError { + if err := validation.IsDNS1123Label(pt.Name); len(err) > 0 { + return &apis.FieldError{ + Message: fmt.Sprintf("invalid value %q", pt.Name), + Paths: []string{"name"}, + Details: "Pipeline Task name must be a valid DNS Label." + + "For more info refer to https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + } + } + return nil +} + +// Validate classifies whether a task is a custom task, bundle, or a regular task(dag/final) +// calls the validation routine based on the type of the task +func (pt PipelineTask) Validate(ctx context.Context) (errs *apis.FieldError) { + errs = errs.Also(pt.validateRefOrSpec()) + + errs = errs.Also(pt.validateEmbeddedOrType()) + + if pt.Resources != nil { + errs = errs.Also(apis.ErrDisallowedFields("resources")) + } + + cfg := config.FromContextOrDefaults(ctx) + // Pipeline task having taskRef/taskSpec with APIVersion is classified as custom task + switch { + case pt.TaskRef != nil && pt.TaskRef.APIVersion != "": + errs = errs.Also(pt.validateCustomTask()) + case pt.TaskSpec != nil && pt.TaskSpec.APIVersion != "": + errs = errs.Also(pt.validateCustomTask()) + // If EnableTektonOCIBundles feature flag is on, validate bundle specifications + case cfg.FeatureFlags.EnableTektonOCIBundles && pt.TaskRef != nil && pt.TaskRef.Bundle != "": + errs = errs.Also(pt.validateBundle()) + default: + errs = errs.Also(pt.validateTask(ctx)) + } + return +} + +func (pt *PipelineTask) validateMatrix(ctx context.Context) (errs *apis.FieldError) { + if pt.IsMatrixed() { + // This is an alpha feature and will fail validation if it's used in a pipeline spec + // when the enable-api-fields feature gate is anything but "alpha". + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "matrix", config.AlphaAPIFields)) + errs = errs.Also(pt.Matrix.validateCombinationsCount(ctx)) + } + errs = errs.Also(pt.Matrix.validateParameterInOneOfMatrixOrParams(pt.Params)) + errs = errs.Also(pt.Matrix.validateParams()) + return errs +} + +func (pt PipelineTask) validateEmbeddedOrType() (errs *apis.FieldError) { + // Reject cases where APIVersion and/or Kind are specified alongside an embedded Task. + // We determine if this is an embedded Task by checking of TaskSpec.TaskSpec.Steps has items. + if pt.TaskSpec != nil && len(pt.TaskSpec.TaskSpec.Steps) > 0 { + if pt.TaskSpec.APIVersion != "" { + errs = errs.Also(&apis.FieldError{ + Message: "taskSpec.apiVersion cannot be specified when using taskSpec.steps", + Paths: []string{"taskSpec.apiVersion"}, + }) + } + if pt.TaskSpec.Kind != "" { + errs = errs.Also(&apis.FieldError{ + Message: "taskSpec.kind cannot be specified when using taskSpec.steps", + Paths: []string{"taskSpec.kind"}, + }) + } + } + return +} + +func (pt *PipelineTask) validateResultsFromMatrixedPipelineTasksNotConsumed(matrixedPipelineTasks sets.String) (errs *apis.FieldError) { + for _, ref := range PipelineTaskResultRefs(pt) { + if matrixedPipelineTasks.Has(ref.PipelineTask) { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("consuming results from matrixed task %s is not allowed", ref.PipelineTask), "")) + } + } + return errs +} + +func (pt *PipelineTask) validateWorkspaces(workspaceNames sets.String) (errs *apis.FieldError) { + workspaceBindingNames := sets.NewString() + for i, ws := range pt.Workspaces { + if workspaceBindingNames.Has(ws.Name) { + errs = errs.Also(apis.ErrGeneric( + fmt.Sprintf("workspace name %q must be unique", ws.Name), "").ViaFieldIndex("workspaces", i)) + } + + if ws.Workspace == "" { + if !workspaceNames.Has(ws.Name) { + errs = errs.Also(apis.ErrInvalidValue( + fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Name), + "", + ).ViaFieldIndex("workspaces", i)) + } + } else if !workspaceNames.Has(ws.Workspace) { + errs = errs.Also(apis.ErrInvalidValue( + fmt.Sprintf("pipeline task %q expects workspace with name %q but none exists in pipeline spec", pt.Name, ws.Workspace), + "", + ).ViaFieldIndex("workspaces", i)) + } + + workspaceBindingNames.Insert(ws.Name) + } + return errs +} + +// validateRefOrSpec validates at least one of taskRef or taskSpec is specified +func (pt PipelineTask) validateRefOrSpec() (errs *apis.FieldError) { + // can't have both taskRef and taskSpec at the same time + if pt.TaskRef != nil && pt.TaskSpec != nil { + errs = errs.Also(apis.ErrMultipleOneOf("taskRef", "taskSpec")) + } + // Check that one of TaskRef and TaskSpec is present + if pt.TaskRef == nil && pt.TaskSpec == nil { + errs = errs.Also(apis.ErrMissingOneOf("taskRef", "taskSpec")) + } + return errs +} + +// validateCustomTask validates custom task specifications - checking kind and fail if not yet supported features specified +func (pt PipelineTask) validateCustomTask() (errs *apis.FieldError) { + if pt.TaskRef != nil && pt.TaskRef.Kind == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify kind", "taskRef.kind")) + } + if pt.TaskSpec != nil && pt.TaskSpec.Kind == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify kind", "taskSpec.kind")) + } + if pt.TaskRef != nil && pt.TaskRef.APIVersion == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task ref must specify apiVersion", "taskRef.apiVersion")) + } + if pt.TaskSpec != nil && pt.TaskSpec.APIVersion == "" { + errs = errs.Also(apis.ErrInvalidValue("custom task spec must specify apiVersion", "taskSpec.apiVersion")) + } + return errs +} + +// validateBundle validates bundle specifications - checking name and bundle +func (pt PipelineTask) validateBundle() (errs *apis.FieldError) { + // bundle requires a TaskRef to be specified + if (pt.TaskRef != nil && pt.TaskRef.Bundle != "") && pt.TaskRef.Name == "" { + errs = errs.Also(apis.ErrMissingField("taskRef.name")) + } + // If a bundle url is specified, ensure it is parsable + if pt.TaskRef != nil && pt.TaskRef.Bundle != "" { + if _, err := name.ParseReference(pt.TaskRef.Bundle); err != nil { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("invalid bundle reference (%s)", err.Error()), "taskRef.bundle")) + } + } + return errs +} + +// validateTask validates a pipeline task or a final task for taskRef and taskSpec +func (pt PipelineTask) validateTask(ctx context.Context) (errs *apis.FieldError) { + cfg := config.FromContextOrDefaults(ctx) + // Validate TaskSpec if it's present + if pt.TaskSpec != nil { + errs = errs.Also(pt.TaskSpec.Validate(ctx).ViaField("taskSpec")) + } + if pt.TaskRef != nil { + if pt.TaskRef.Name != "" { + // TaskRef name must be a valid k8s name + if errSlice := validation.IsQualifiedName(pt.TaskRef.Name); len(errSlice) != 0 { + errs = errs.Also(apis.ErrInvalidValue(strings.Join(errSlice, ","), "taskRef.name")) + } + } else if pt.TaskRef.Resolver == "" { + errs = errs.Also(apis.ErrInvalidValue("taskRef must specify name", "taskRef.name")) + } + // fail if bundle is present when EnableTektonOCIBundles feature flag is off (as it won't be allowed nor used) + if !cfg.FeatureFlags.EnableTektonOCIBundles && pt.TaskRef.Bundle != "" { + errs = errs.Also(apis.ErrDisallowedFields("taskRef.bundle")) + } + } + return errs +} + // validatePipelineWorkspacesDeclarations validates the specified workspaces, ensuring having unique name without any // empty string, func validatePipelineWorkspacesDeclarations(wss []PipelineWorkspaceDeclaration) (errs *apis.FieldError) { @@ -117,7 +310,7 @@ func validatePipelineWorkspacesDeclarations(wss []PipelineWorkspaceDeclaration) // validatePipelineWorkspacesUsage validates that all the referenced workspaces (by pipeline tasks) are specified in // the pipeline func validatePipelineWorkspacesUsage(ctx context.Context, wss []PipelineWorkspaceDeclaration, pts []PipelineTask) (errs *apis.FieldError) { - if config.ValidateParameterVariablesAndWorkspaces(ctx) == false { + if !config.ValidateParameterVariablesAndWorkspaces(ctx) { return nil } workspaceNames := sets.NewString() @@ -158,7 +351,7 @@ func ValidatePipelineParameterVariables(ctx context.Context, tasks []PipelineTas } } } - if config.ValidateParameterVariablesAndWorkspaces(ctx) == true { + if config.ValidateParameterVariablesAndWorkspaces(ctx) { errs = errs.Also(validatePipelineParametersVariables(tasks, "params", parameterNames, arrayParameterNames, objectParameterNameKeys)) } return errs @@ -168,7 +361,7 @@ func validatePipelineParametersVariables(tasks []PipelineTask, prefix string, pa for idx, task := range tasks { errs = errs.Also(validatePipelineParametersVariablesInTaskParameters(task.Params, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) if task.IsMatrixed() { - errs = errs.Also(validatePipelineParametersVariablesInMatrixParameters(task.Matrix.Params, prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) + errs = errs.Also(task.Matrix.validatePipelineParametersVariablesInMatrixParameters(prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) } errs = errs.Also(task.WhenExpressions.validatePipelineParametersVariables(prefix, paramNames, arrayParamNames, objectParamNameKeys).ViaIndex(idx)) } @@ -189,14 +382,7 @@ func validatePipelineContextVariables(tasks []PipelineTask) *apis.FieldError { ) var paramValues []string for _, task := range tasks { - var matrixParams []Param - if task.IsMatrixed() { - matrixParams = task.Matrix.Params - } - for _, param := range append(task.Params, matrixParams...) { - paramValues = append(paramValues, param.Value.StringVal) - paramValues = append(paramValues, param.Value.ArrayVal...) - } + paramValues = task.extractAllParams().extractValues() } errs := validatePipelineContextVariablesInParamValues(paramValues, "context\\.pipelineRun", pipelineRunContextNames). Also(validatePipelineContextVariablesInParamValues(paramValues, "context\\.pipeline", pipelineContextNames)). @@ -204,6 +390,23 @@ func validatePipelineContextVariables(tasks []PipelineTask) *apis.FieldError { return errs } +// extractAllParams extracts all the parameters in a PipelineTask: +// - pt.Params +// - pt.Matrix.Params +// - pt.Matrix.Include.Params +func (pt *PipelineTask) extractAllParams() Params { + allParams := pt.Params + if pt.Matrix.HasParams() { + allParams = append(allParams, pt.Matrix.Params...) + } + if pt.Matrix.HasInclude() { + for _, include := range pt.Matrix.Include { + allParams = append(allParams, include.Params...) + } + } + return allParams +} + func containsExecutionStatusRef(p string) bool { if strings.HasPrefix(p, "tasks.") && strings.HasSuffix(p, ".status") { return true @@ -211,6 +414,12 @@ func containsExecutionStatusRef(p string) bool { return false } +func validateExecutionStatusVariables(tasks []PipelineTask, finallyTasks []PipelineTask) (errs *apis.FieldError) { + errs = errs.Also(validateExecutionStatusVariablesInTasks(tasks).ViaField("tasks")) + errs = errs.Also(validateExecutionStatusVariablesInFinally(PipelineTaskList(tasks).Names(), finallyTasks).ViaField("finally")) + return errs +} + // validate dag pipeline tasks, task params can not access execution status of any other task // dag tasks cannot have param value as $(tasks.pipelineTask.status) func validateExecutionStatusVariablesInTasks(tasks []PipelineTask) (errs *apis.FieldError) { @@ -229,9 +438,79 @@ func validateExecutionStatusVariablesInFinally(tasksNames sets.String, finally [ return errs } -func validateExecutionStatusVariables(tasks []PipelineTask, finallyTasks []PipelineTask) (errs *apis.FieldError) { - errs = errs.Also(validateExecutionStatusVariablesInTasks(tasks).ViaField("tasks")) - errs = errs.Also(validateExecutionStatusVariablesInFinally(PipelineTaskList(tasks).Names(), finallyTasks).ViaField("finally")) +func (pt *PipelineTask) validateExecutionStatusVariablesDisallowed() (errs *apis.FieldError) { + for _, param := range pt.Params { + if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { + errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, "value"). + ViaFieldKey("params", param.Name)) + } + } + for i, we := range pt.WhenExpressions { + if expressions, ok := we.GetVarSubstitutionExpressions(); ok { + errs = errs.Also(validateContainsExecutionStatusVariablesDisallowed(expressions, ""). + ViaFieldIndex("when", i)) + } + } + return errs +} + +func validateContainsExecutionStatusVariablesDisallowed(expressions []string, path string) (errs *apis.FieldError) { + if containsExecutionStatusReferences(expressions) { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline tasks can not refer to execution status"+ + " of any other pipeline task or aggregate status of tasks"), path)) + } + return errs +} + +func containsExecutionStatusReferences(expressions []string) bool { + // validate tasks.pipelineTask.status/tasks.status if this expression is not a result reference + if !LooksLikeContainsResultRefs(expressions) { + for _, e := range expressions { + // check if it contains context variable accessing execution status - $(tasks.taskname.status) + // or an aggregate status - $(tasks.status) + if containsExecutionStatusRef(e) { + return true + } + } + } + return false +} + +func (pt *PipelineTask) validateExecutionStatusVariablesAllowed(ptNames sets.String) (errs *apis.FieldError) { + for _, param := range pt.Params { + if expressions, ok := GetVarSubstitutionExpressionsForParam(param); ok { + errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, "value"). + ViaFieldKey("params", param.Name)) + } + } + for i, we := range pt.WhenExpressions { + if expressions, ok := we.GetVarSubstitutionExpressions(); ok { + errs = errs.Also(validateExecutionStatusVariablesExpressions(expressions, ptNames, ""). + ViaFieldIndex("when", i)) + } + } + return errs +} + +func validateExecutionStatusVariablesExpressions(expressions []string, ptNames sets.String, fieldPath string) (errs *apis.FieldError) { + // validate tasks.pipelineTask.status if this expression is not a result reference + if !LooksLikeContainsResultRefs(expressions) { + for _, expression := range expressions { + // its a reference to aggregate status of dag tasks - $(tasks.status) + if expression == PipelineTasksAggregateStatus { + continue + } + // check if it contains context variable accessing execution status - $(tasks.taskname.status) + if containsExecutionStatusRef(expression) { + // strip tasks. and .status from tasks.taskname.status to further verify task name + pt := strings.TrimSuffix(strings.TrimPrefix(expression, "tasks."), ".status") + // report an error if the task name does not exist in the list of dag tasks + if !ptNames.Has(pt) { + errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("pipeline task %s is not defined in the pipeline", pt), fieldPath)) + } + } + } + } return errs } @@ -315,7 +594,6 @@ func taskContainsResult(resultExpression string, pipelineTaskNames sets.String, if strings.HasPrefix(value, "finally") && !pipelineFinallyTaskNames.Has(pipelineTaskName) { return false } - } } return true @@ -339,7 +617,6 @@ func validateFinalTasks(tasks []PipelineTask, finalTasks []PipelineTask) (errs * fts := PipelineTaskList(finalTasks).Names() errs = errs.Also(validateTaskResultReferenceInFinallyTasks(finalTasks, ts, fts)) - errs = errs.Also(validateTasksInputFrom(finalTasks).ViaField("finally")) return errs } @@ -379,22 +656,6 @@ func validateResultsVariablesExpressionsInFinally(expressions []string, pipeline return errs } -func validateTasksInputFrom(tasks []PipelineTask) (errs *apis.FieldError) { - for idx, t := range tasks { - inputResources := []PipelineTaskInputResource{} - if t.Resources != nil { - inputResources = append(inputResources, t.Resources.Inputs...) - } - for i, rd := range inputResources { - if len(rd.From) != 0 { - errs = errs.Also(apis.ErrGeneric(fmt.Sprintf("no from allowed under inputs,"+ - " final task %s has from specified", rd.Name), "").ViaFieldIndex("inputs", i).ViaField("resources").ViaIndex(idx)) - } - } - } - return errs -} - func validateWhenExpressions(tasks []PipelineTask, finalTasks []PipelineTask) (errs *apis.FieldError) { for i, t := range tasks { errs = errs.Also(t.WhenExpressions.validate().ViaFieldIndex("tasks", i)) @@ -405,94 +666,6 @@ func validateWhenExpressions(tasks []PipelineTask, finalTasks []PipelineTask) (e return errs } -// validateDeclaredResources ensures that the specified resources have unique names and -// validates that all the resources referenced by pipeline tasks are declared in the pipeline -func validateDeclaredResources(resources []PipelineDeclaredResource, tasks []PipelineTask, finalTasks []PipelineTask) *apis.FieldError { - encountered := sets.NewString() - for _, r := range resources { - if encountered.Has(r.Name) { - return apis.ErrInvalidValue(fmt.Sprintf("resource with name %q appears more than once", r.Name), "resources") - } - encountered.Insert(r.Name) - } - required := []string{} - for _, t := range tasks { - if t.Resources != nil { - for _, input := range t.Resources.Inputs { - required = append(required, input.Resource) - } - for _, output := range t.Resources.Outputs { - required = append(required, output.Resource) - } - } - - } - for _, t := range finalTasks { - if t.Resources != nil { - for _, input := range t.Resources.Inputs { - required = append(required, input.Resource) - } - for _, output := range t.Resources.Outputs { - required = append(required, output.Resource) - } - } - } - - provided := make([]string, 0, len(resources)) - for _, resource := range resources { - provided = append(provided, resource.Name) - } - missing := list.DiffLeft(required, provided) - if len(missing) > 0 { - return apis.ErrInvalidValue(fmt.Sprintf("pipeline declared resources didn't match usage in Tasks: Didn't provide required values: %s", missing), "resources") - } - return nil -} - -func isOutput(outputs []PipelineTaskOutputResource, resource string) bool { - for _, output := range outputs { - if output.Resource == resource { - return true - } - } - return false -} - -// validateFrom ensures that the `from` values make sense: that they rely on values from Tasks -// that ran previously, and that the PipelineResource is actually an output of the Task it should come from. -func validateFrom(tasks []PipelineTask) (errs *apis.FieldError) { - taskOutputs := map[string][]PipelineTaskOutputResource{} - for _, task := range tasks { - var to []PipelineTaskOutputResource - if task.Resources != nil { - to = make([]PipelineTaskOutputResource, len(task.Resources.Outputs)) - copy(to, task.Resources.Outputs) - } - taskOutputs[task.Name] = to - } - for i, t := range tasks { - inputResources := []PipelineTaskInputResource{} - if t.Resources != nil { - inputResources = append(inputResources, t.Resources.Inputs...) - } - - for j, rd := range inputResources { - for _, pt := range rd.From { - outputs, found := taskOutputs[pt] - if !found { - return apis.ErrInvalidValue(fmt.Sprintf("expected resource %s to be from task %s, but task %s doesn't exist", rd.Resource, pt, pt), - "from").ViaFieldIndex("inputs", j).ViaField("resources").ViaFieldIndex("tasks", i) - } - if !isOutput(outputs, rd.Resource) { - return apis.ErrInvalidValue(fmt.Sprintf("the resource %s from %s must be an output but is an input", rd.Resource, pt), - "from").ViaFieldIndex("inputs", j).ViaField("resources").ViaFieldIndex("tasks", i) - } - } - } - } - return errs -} - // validateGraph ensures the Pipeline's dependency Graph (DAG) make sense: that there is no dependency // cycle or that they rely on values from Tasks that ran previously, and that the PipelineResource // is actually an output of the Task it should come from. @@ -525,3 +698,51 @@ func validateResultsFromMatrixedPipelineTasksNotConsumed(tasks []PipelineTask, f } return errs } + +// ValidateParamArrayIndex validates if the param reference to an array param is out of bound. +// error is returned when the array indexing reference is out of bound of the array param +// e.g. if a param reference of $(params.array-param[2]) and the array param is of length 2. +func (ps *PipelineSpec) ValidateParamArrayIndex(ctx context.Context, params Params) error { + if !config.CheckAlphaOrBetaAPIFields(ctx) { + return nil + } + + // Collect all array params lengths + arrayParamsLengths := ps.Params.extractParamArrayLengths() + for k, v := range params.extractParamArrayLengths() { + arrayParamsLengths[k] = v + } + + paramsRefs := []string{} + for i := range ps.Tasks { + paramsRefs = append(paramsRefs, ps.Tasks[i].Params.extractValues()...) + if ps.Tasks[i].IsMatrixed() { + paramsRefs = append(paramsRefs, ps.Tasks[i].Matrix.Params.extractValues()...) + } + for j := range ps.Tasks[i].Workspaces { + paramsRefs = append(paramsRefs, ps.Tasks[i].Workspaces[j].SubPath) + } + for _, wes := range ps.Tasks[i].WhenExpressions { + paramsRefs = append(paramsRefs, wes.Input) + paramsRefs = append(paramsRefs, wes.Values...) + } + } + + for i := range ps.Finally { + paramsRefs = append(paramsRefs, ps.Finally[i].Params.extractValues()...) + if ps.Finally[i].IsMatrixed() { + paramsRefs = append(paramsRefs, ps.Finally[i].Matrix.Params.extractValues()...) + } + for _, wes := range ps.Finally[i].WhenExpressions { + paramsRefs = append(paramsRefs, wes.Values...) + } + } + + // extract all array indexing references, for example []{"$(params.array-params[1])"} + arrayIndexParamRefs := []string{} + for _, p := range paramsRefs { + arrayIndexParamRefs = append(arrayIndexParamRefs, extractArrayIndexingParamRefs(p)...) + } + + return validateOutofBoundArrayParams(arrayIndexParamRefs, arrayParamsLengths) +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_conversion.go index d2c7d4bda4..88fed430cc 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_conversion.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( @@ -32,7 +48,7 @@ func (pr PipelineRef) convertBundleToResolver(sink *v1.PipelineRef) { if pr.Bundle != "" { sink.ResolverRef = v1.ResolverRef{ Resolver: "bundles", - Params: []v1.Param{{ + Params: v1.Params{{ Name: "bundle", Value: v1.ParamValue{StringVal: pr.Bundle, Type: v1.ParamTypeString}, }, { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_types.go index efb6f13cd3..ab943a3242 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_types.go @@ -24,6 +24,7 @@ type PipelineRef struct { // +optional APIVersion string `json:"apiVersion,omitempty"` // Bundle url reference to a Tekton Bundle. + // // Deprecated: Please use ResolverRef with the bundles resolver instead. // +optional Bundle string `json:"bundle,omitempty"` diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_validation.go index c52e2d1de3..6186c177a2 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelineref_validation.go @@ -64,7 +64,7 @@ func (ref *PipelineRef) Validate(ctx context.Context) (errs *apis.FieldError) { } } } - return + return //nolint:nakedret } func validateBundleFeatureFlag(ctx context.Context, featureName string, wantValue bool) *apis.FieldError { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_conversion.go index 85f538e914..68a475233f 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_conversion.go @@ -21,8 +21,6 @@ import ( "fmt" v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" - "github.com/tektoncd/pipeline/pkg/apis/version" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/pkg/apis" ) @@ -36,7 +34,7 @@ func (pr *PipelineRun) ConvertTo(ctx context.Context, to apis.Convertible) error switch sink := to.(type) { case *v1.PipelineRun: sink.ObjectMeta = pr.ObjectMeta - if err := serializePipelineRunResources(&sink.ObjectMeta, &pr.Spec); err != nil { + if err := pr.Status.convertTo(ctx, &sink.Status); err != nil { return err } return pr.Spec.ConvertTo(ctx, &sink.Spec) @@ -96,7 +94,7 @@ func (pr *PipelineRun) ConvertFrom(ctx context.Context, from apis.Convertible) e switch source := from.(type) { case *v1.PipelineRun: pr.ObjectMeta = source.ObjectMeta - if err := deserializePipelineRunResources(&pr.ObjectMeta, &pr.Spec); err != nil { + if err := pr.Status.convertFrom(ctx, &source.Status); err != nil { return err } return pr.Spec.ConvertFrom(ctx, &source.Spec) @@ -208,21 +206,140 @@ func (ptrs *PipelineTaskRunSpec) convertFrom(ctx context.Context, source v1.Pipe ptrs.ComputeResources = source.ComputeResources } -func serializePipelineRunResources(meta *metav1.ObjectMeta, spec *PipelineRunSpec) error { - if spec.Resources == nil { - return nil +func (prs *PipelineRunStatus) convertTo(ctx context.Context, sink *v1.PipelineRunStatus) error { + sink.Status = prs.Status + sink.StartTime = prs.StartTime + sink.CompletionTime = prs.CompletionTime + sink.Results = nil + for _, pr := range prs.PipelineResults { + new := v1.PipelineRunResult{} + pr.convertTo(ctx, &new) + sink.Results = append(sink.Results, new) + } + if prs.PipelineSpec != nil { + sink.PipelineSpec = &v1.PipelineSpec{} + err := prs.PipelineSpec.ConvertTo(ctx, sink.PipelineSpec) + if err != nil { + return err + } + } + sink.SkippedTasks = nil + for _, st := range prs.SkippedTasks { + new := v1.SkippedTask{} + st.convertTo(ctx, &new) + sink.SkippedTasks = append(sink.SkippedTasks, new) + } + sink.ChildReferences = nil + for _, cr := range prs.ChildReferences { + new := v1.ChildStatusReference{} + cr.convertTo(ctx, &new) + sink.ChildReferences = append(sink.ChildReferences, new) } - return version.SerializeToMetadata(meta, spec.Resources, resourcesAnnotationKey) + sink.FinallyStartTime = prs.FinallyStartTime + if prs.Provenance != nil { + new := v1.Provenance{} + prs.Provenance.convertTo(ctx, &new) + sink.Provenance = &new + } + return nil } -func deserializePipelineRunResources(meta *metav1.ObjectMeta, spec *PipelineRunSpec) error { - resources := []PipelineResourceBinding{} - err := version.DeserializeFromMetadata(meta, &resources, resourcesAnnotationKey) - if err != nil { - return err +func (prs *PipelineRunStatus) convertFrom(ctx context.Context, source *v1.PipelineRunStatus) error { + prs.Status = source.Status + prs.StartTime = source.StartTime + prs.CompletionTime = source.CompletionTime + prs.PipelineResults = nil + for _, pr := range source.Results { + new := PipelineRunResult{} + new.convertFrom(ctx, pr) + prs.PipelineResults = append(prs.PipelineResults, new) + } + if source.PipelineSpec != nil { + newPipelineSpec := PipelineSpec{} + err := newPipelineSpec.ConvertFrom(ctx, source.PipelineSpec) + if err != nil { + return err + } + prs.PipelineSpec = &newPipelineSpec } - if len(resources) != 0 { - spec.Resources = resources + prs.SkippedTasks = nil + for _, st := range source.SkippedTasks { + new := SkippedTask{} + new.convertFrom(ctx, st) + prs.SkippedTasks = append(prs.SkippedTasks, new) + } + prs.ChildReferences = nil + for _, cr := range source.ChildReferences { + new := ChildStatusReference{} + new.convertFrom(ctx, cr) + prs.ChildReferences = append(prs.ChildReferences, new) + } + + prs.FinallyStartTime = source.FinallyStartTime + if source.Provenance != nil { + new := Provenance{} + new.convertFrom(ctx, *source.Provenance) + prs.Provenance = &new } return nil } + +func (prr PipelineRunResult) convertTo(ctx context.Context, sink *v1.PipelineRunResult) { + sink.Name = prr.Name + newValue := v1.ParamValue{} + prr.Value.convertTo(ctx, &newValue) + sink.Value = newValue +} + +func (prr *PipelineRunResult) convertFrom(ctx context.Context, source v1.PipelineRunResult) { + prr.Name = source.Name + newValue := ParamValue{} + newValue.convertFrom(ctx, source.Value) + prr.Value = newValue +} + +func (st SkippedTask) convertTo(ctx context.Context, sink *v1.SkippedTask) { + sink.Name = st.Name + sink.Reason = v1.SkippingReason(st.Reason) + sink.WhenExpressions = nil + for _, we := range st.WhenExpressions { + new := v1.WhenExpression{} + we.convertTo(ctx, &new) + sink.WhenExpressions = append(sink.WhenExpressions, new) + } +} + +func (st *SkippedTask) convertFrom(ctx context.Context, source v1.SkippedTask) { + st.Name = source.Name + st.Reason = SkippingReason(source.Reason) + st.WhenExpressions = nil + for _, we := range source.WhenExpressions { + new := WhenExpression{} + new.convertFrom(ctx, we) + st.WhenExpressions = append(st.WhenExpressions, new) + } +} + +func (csr ChildStatusReference) convertTo(ctx context.Context, sink *v1.ChildStatusReference) { + sink.TypeMeta = csr.TypeMeta + sink.Name = csr.Name + sink.PipelineTaskName = csr.PipelineTaskName + sink.WhenExpressions = nil + for _, we := range csr.WhenExpressions { + new := v1.WhenExpression{} + we.convertTo(ctx, &new) + sink.WhenExpressions = append(sink.WhenExpressions, new) + } +} + +func (csr *ChildStatusReference) convertFrom(ctx context.Context, source v1.ChildStatusReference) { + csr.TypeMeta = source.TypeMeta + csr.Name = source.Name + csr.PipelineTaskName = source.PipelineTaskName + csr.WhenExpressions = nil + for _, we := range source.WhenExpressions { + new := WhenExpression{} + new.convertFrom(ctx, we) + csr.WhenExpressions = append(csr.WhenExpressions, new) + } +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_defaults.go index a47a0d3e55..86592824a2 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_defaults.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_defaults.go @@ -36,6 +36,10 @@ func (pr *PipelineRun) SetDefaults(ctx context.Context) { // SetDefaults implements apis.Defaultable func (prs *PipelineRunSpec) SetDefaults(ctx context.Context) { cfg := config.FromContextOrDefaults(ctx) + if prs.PipelineRef != nil && prs.PipelineRef.Name == "" && prs.PipelineRef.Resolver == "" { + prs.PipelineRef.Resolver = ResolverName(cfg.Defaults.DefaultResolverType) + } + if prs.Timeout == nil && prs.Timeouts == nil { prs.Timeout = &metav1.Duration{Duration: time.Duration(cfg.Defaults.DefaultTimeoutMinutes) * time.Minute} } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_types.go index 6e81abd7be..83bf2c22e1 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_types.go @@ -18,22 +18,21 @@ package v1beta1 import ( "context" + "fmt" "time" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "github.com/tektoncd/pipeline/pkg/apis/config" apisconfig "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" pod "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" - runv1alpha1 "github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/clock" "knative.dev/pkg/apis" - duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1" + duckv1 "knative.dev/pkg/apis/duck/v1" ) // +genclient @@ -98,7 +97,7 @@ func (pr *PipelineRun) IsGracefullyStopped() bool { return pr.Spec.Status == PipelineRunSpecStatusStoppedRunFinally } -// PipelineTimeout returns the the applicable timeout for the PipelineRun +// PipelineTimeout returns the applicable timeout for the PipelineRun func (pr *PipelineRun) PipelineTimeout(ctx context.Context) time.Duration { if pr.Spec.Timeout != nil { return pr.Spec.Timeout.Duration @@ -109,7 +108,7 @@ func (pr *PipelineRun) PipelineTimeout(ctx context.Context) time.Duration { return time.Duration(config.FromContextOrDefaults(ctx).Defaults.DefaultTimeoutMinutes) * time.Minute } -// TasksTimeout returns the the tasks timeout for the PipelineRun, if set, +// TasksTimeout returns the tasks timeout for the PipelineRun, if set, // or the tasks timeout computed from the Pipeline and Finally timeouts, if those are set. func (pr *PipelineRun) TasksTimeout() *metav1.Duration { t := pr.Spec.Timeouts @@ -128,7 +127,7 @@ func (pr *PipelineRun) TasksTimeout() *metav1.Duration { return nil } -// FinallyTimeout returns the the finally timeout for the PipelineRun, if set, +// FinallyTimeout returns the finally timeout for the PipelineRun, if set, // or the finally timeout computed from the Pipeline and Tasks timeouts, if those are set. func (pr *PipelineRun) FinallyTimeout() *metav1.Duration { t := pr.Spec.Timeouts @@ -157,6 +156,22 @@ func (pr *PipelineRun) GetNamespacedName() types.NamespacedName { return types.NamespacedName{Namespace: pr.Namespace, Name: pr.Name} } +// IsTimeoutConditionSet returns true when the pipelinerun has the pipelinerun timed out reason +func (pr *PipelineRun) IsTimeoutConditionSet() bool { + condition := pr.Status.GetCondition(apis.ConditionSucceeded) + return condition.IsFalse() && condition.Reason == PipelineRunReasonTimedOut.String() +} + +// SetTimeoutCondition sets the status of the PipelineRun to timed out. +func (pr *PipelineRun) SetTimeoutCondition(ctx context.Context) { + pr.Status.SetCondition(&apis.Condition{ + Type: apis.ConditionSucceeded, + Status: corev1.ConditionFalse, + Reason: PipelineRunReasonTimedOut.String(), + Message: fmt.Sprintf("PipelineRun %q failed to finish within %q", pr.Name, pr.PipelineTimeout(ctx).String()), + }) +} + // HasTimedOut returns true if a pipelinerun has exceeded its spec.Timeout based on its status.Timeout func (pr *PipelineRun) HasTimedOut(ctx context.Context, c clock.PassiveClock) bool { timeout := pr.PipelineTimeout(ctx) @@ -174,6 +189,19 @@ func (pr *PipelineRun) HasTimedOut(ctx context.Context, c clock.PassiveClock) bo return false } +// HasTimedOutForALongTime returns true if a pipelinerun has exceeed its spec.Timeout based its status.StartTime +// by a large margin +func (pr *PipelineRun) HasTimedOutForALongTime(ctx context.Context, c clock.PassiveClock) bool { + if !pr.HasTimedOut(ctx, c) { + return false + } + timeout := pr.PipelineTimeout(ctx) + startTime := pr.Status.StartTime + runtime := c.Since(startTime.Time) + // We are arbitrarily defining large margin as doubling the spec.timeout + return runtime >= 2*timeout +} + // HaveTasksTimedOut returns true if a pipelinerun has exceeded its spec.Timeouts.Tasks func (pr *PipelineRun) HaveTasksTimedOut(ctx context.Context, c clock.PassiveClock) bool { timeout := pr.TasksTimeout() @@ -228,11 +256,13 @@ type PipelineRunSpec struct { // Resources is a list of bindings specifying which actual instances of // PipelineResources to use for the resources the Pipeline has declared // it needs. + // + // Deprecated: Unused, preserved only for backwards compatibility // +listType=atomic Resources []PipelineResourceBinding `json:"resources,omitempty"` // Params is a list of parameter names and values. // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` // +optional ServiceAccountName string `json:"serviceAccountName,omitempty"` @@ -246,9 +276,12 @@ type PipelineRunSpec struct { // +optional Timeouts *TimeoutFields `json:"timeouts,omitempty"` - // Timeout Deprecated: use pipelineRunSpec.Timeouts.Pipeline instead - // Time after which the Pipeline times out. Defaults to never. + // Timeout is the Time after which the Pipeline times out. + // Defaults to never. // Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration + // + // Deprecated: use pipelineRunSpec.Timeouts.Pipeline instead + // // +optional Timeout *metav1.Duration `json:"timeout,omitempty"` // PodTemplate holds pod specific configuration @@ -298,7 +331,7 @@ const ( // PipelineRunStatus defines the observed state of PipelineRun type PipelineRunStatus struct { - duckv1beta1.Status `json:",inline"` + duckv1.Status `json:",inline"` // PipelineRunStatusFields inlines the status fields. PipelineRunStatusFields `json:",inline"` @@ -352,12 +385,6 @@ func (pr *PipelineRunStatus) GetCondition(t apis.ConditionType) *apis.Condition // and set the started time to the current time func (pr *PipelineRunStatus) InitializeConditions(c clock.PassiveClock) { started := false - if pr.TaskRuns == nil { - pr.TaskRuns = make(map[string]*PipelineRunTaskRunStatus) - } - if pr.Runs == nil { - pr.Runs = make(map[string]*PipelineRunRunStatus) - } if pr.StartTime.IsZero() { pr.StartTime = &metav1.Time{Time: c.Now()} started = true @@ -418,20 +445,24 @@ type ChildStatusReference struct { // consume these fields via duck typing. type PipelineRunStatusFields struct { // StartTime is the time the PipelineRun is actually started. - // +optional StartTime *metav1.Time `json:"startTime,omitempty"` // CompletionTime is the time the PipelineRun completed. - // +optional CompletionTime *metav1.Time `json:"completionTime,omitempty"` - // Deprecated - use ChildReferences instead. - // map of PipelineRunTaskRunStatus with the taskRun name as the key + // TaskRuns is a map of PipelineRunTaskRunStatus with the taskRun name as the key. + // + // Deprecated: use ChildReferences instead. As of v0.45.0, this field is no + // longer populated and is only included for backwards compatibility with + // older server versions. // +optional TaskRuns map[string]*PipelineRunTaskRunStatus `json:"taskRuns,omitempty"` - // Deprecated - use ChildReferences instead. - // map of PipelineRunRunStatus with the run name as the key + // Runs is a map of PipelineRunRunStatus with the run name as the key + // + // Deprecated: use ChildReferences instead. As of v0.45.0, this field is no + // longer populated and is only included for backwards compatibility with + // older server versions. // +optional Runs map[string]*PipelineRunRunStatus `json:"runs,omitempty"` @@ -458,7 +489,11 @@ type PipelineRunStatusFields struct { FinallyStartTime *metav1.Time `json:"finallyStartTime,omitempty"` // Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). + // +optional Provenance *Provenance `json:"provenance,omitempty"` + + // SpanContext contains tracing span context fields + SpanContext map[string]string `json:"spanContext,omitempty"` } // SkippedTask is used to describe the Tasks that were skipped due to their When Expressions @@ -497,6 +532,8 @@ const ( TasksTimedOutSkip SkippingReason = "PipelineRun Tasks timeout has been reached" // FinallyTimedOutSkip means the task was skipped because the PipelineRun has passed its Timeouts.Finally. FinallyTimedOutSkip SkippingReason = "PipelineRun Finally timeout has been reached" + // EmptyArrayInMatrixParams means the task was skipped because Matrix parameters contain empty array. + EmptyArrayInMatrixParams SkippingReason = "Matrix Parameters have an empty array" // None means the task was not skipped None SkippingReason = "None" ) @@ -523,13 +560,13 @@ type PipelineRunTaskRunStatus struct { WhenExpressions []WhenExpression `json:"whenExpressions,omitempty"` } -// PipelineRunRunStatus contains the name of the PipelineTask for this Run and the Run's Status +// PipelineRunRunStatus contains the name of the PipelineTask for this CustomRun or Run and the CustomRun or Run's Status type PipelineRunRunStatus struct { // PipelineTaskName is the name of the PipelineTask. PipelineTaskName string `json:"pipelineTaskName,omitempty"` - // Status is the RunStatus for the corresponding Run + // Status is the CustomRunStatus for the corresponding CustomRun or Run // +optional - Status *runv1alpha1.RunStatus `json:"status,omitempty"` + Status *CustomRunStatus `json:"status,omitempty"` // WhenExpressions is the list of checks guarding the execution of the PipelineTask // +optional // +listType=atomic diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_validation.go index 4e874f12c6..ed7ac5cce1 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/pipelinerun_validation.go @@ -128,6 +128,12 @@ func (ps *PipelineRunSpec) Validate(ctx context.Context) (errs *apis.FieldError) for idx, trs := range ps.TaskRunSpecs { errs = errs.Also(validateTaskRunSpec(ctx, trs).ViaIndex(idx).ViaField("taskRunSpecs")) } + if ps.PodTemplate != nil { + errs = errs.Also(validatePodTemplateEnv(ctx, *ps.PodTemplate)) + } + if ps.Resources != nil { + errs = errs.Also(apis.ErrDisallowedFields("resources")) + } return errs } @@ -236,7 +242,7 @@ func (ps *PipelineRunSpec) validateInlineParameters(ctx context.Context) (errs * return errs } -func appendPipelineTaskParams(paramSpecForValidation map[string]ParamSpec, params []Param) map[string]ParamSpec { +func appendPipelineTaskParams(paramSpecForValidation map[string]ParamSpec, params Params) map[string]ParamSpec { for _, p := range params { if pSpec, ok := paramSpecForValidation[p.Name]; ok { if p.Value.ObjectVal != nil { @@ -270,7 +276,6 @@ func validateSpecStatus(status PipelineRunSpecStatus) *apis.FieldError { PipelineRunSpecStatusCancelledRunFinally, PipelineRunSpecStatusStoppedRunFinally, PipelineRunSpecStatusPending), "status") - } func validateTimeoutDuration(field string, d *metav1.Duration) (errs *apis.FieldError) { @@ -334,5 +339,8 @@ func validateTaskRunSpec(ctx context.Context, trs PipelineTaskRunSpec) (errs *ap errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "computeResources", config.AlphaAPIFields).ViaField("computeResources")) errs = errs.Also(validateTaskRunComputeResources(trs.ComputeResources, trs.StepOverrides)) } + if trs.TaskPodTemplate != nil { + errs = errs.Also(validatePodTemplateEnv(ctx, *trs.TaskPodTemplate)) + } return errs } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/provenance.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/provenance.go index 7ab90ae3fc..3ae27eb55d 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/provenance.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/provenance.go @@ -13,34 +13,55 @@ limitations under the License. package v1beta1 -// Provenance contains some key authenticated metadata about how a software artifact was -// built (what sources, what inputs/outputs, etc.). For now, it only contains the subfield -// `ConfigSource` that identifies the source where a build config file came from. -// In future, it can be expanded as needed to include more metadata about the build. -// This field aims to be used to carry minimum amount of the authenticated metadata in *Run status -// so that Tekton Chains can pick it up and record in the provenance it generates. +import "github.com/tektoncd/pipeline/pkg/apis/config" + +// Provenance contains metadata about resources used in the TaskRun/PipelineRun +// such as the source from where a remote build definition was fetched. +// This field aims to carry minimum amoumt of metadata in *Run status so that +// Tekton Chains can capture them in the provenance. type Provenance struct { - // ConfigSource identifies the source where a resource came from. + // Deprecated: Use RefSource instead ConfigSource *ConfigSource `json:"configSource,omitempty"` + + // RefSource identifies the source where a remote task/pipeline came from. + RefSource *RefSource `json:"refSource,omitempty"` + + // FeatureFlags identifies the feature flags that were used during the task/pipeline run + FeatureFlags *config.FeatureFlags `json:"featureFlags,omitempty"` +} + +// RefSource contains the information that can uniquely identify where a remote +// built definition came from i.e. Git repositories, Tekton Bundles in OCI registry +// and hub. +type RefSource struct { + // URI indicates the identity of the source of the build definition. + // Example: "https://github.com/tektoncd/catalog" + URI string `json:"uri,omitempty"` + + // Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. + // Example: {"sha1": "f99d13e554ffcb696dee719fa85b695cb5b0f428"} + Digest map[string]string `json:"digest,omitempty"` + + // EntryPoint identifies the entry point into the build. This is often a path to a + // build definition file and/or a target label within that file. + // Example: "task/git-clone/0.8/git-clone.yaml" + EntryPoint string `json:"entryPoint,omitempty"` } -// ConfigSource identifies the source where a resource came from. -// This can include Git repositories, Task Bundles, file checksums, or other information -// that allows users to identify where the resource came from and what version was used. +// ConfigSource contains the information that can uniquely identify where a remote +// built definition came from i.e. Git repositories, Tekton Bundles in OCI registry +// and hub. type ConfigSource struct { - // URI indicates the identity of the source of the config. - // Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.uri + // URI indicates the identity of the source of the build definition. // Example: "https://github.com/tektoncd/catalog" URI string `json:"uri,omitempty"` // Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. - // Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.digest // Example: {"sha1": "f99d13e554ffcb696dee719fa85b695cb5b0f428"} Digest map[string]string `json:"digest,omitempty"` // EntryPoint identifies the entry point into the build. This is often a path to a - // configuration file and/or a target label within that file. - // Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.entryPoint + // build definition file and/or a target label within that file. // Example: "task/git-clone/0.8/git-clone.yaml" EntryPoint string `json:"entryPoint,omitempty"` } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/provenance_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/provenance_conversion.go new file mode 100644 index 0000000000..4e4afe25b5 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/provenance_conversion.go @@ -0,0 +1,54 @@ +/* +Copyright 2022 The Tekton 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 v1beta1 + +import ( + "context" + + v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" +) + +func (p Provenance) convertTo(ctx context.Context, sink *v1.Provenance) { + if p.RefSource != nil { + new := v1.RefSource{} + p.RefSource.convertTo(ctx, &new) + sink.RefSource = &new + } + if p.FeatureFlags != nil { + sink.FeatureFlags = p.FeatureFlags + } +} + +func (p *Provenance) convertFrom(ctx context.Context, source v1.Provenance) { + if source.RefSource != nil { + new := RefSource{} + new.convertFrom(ctx, *source.RefSource) + p.RefSource = &new + } + if source.FeatureFlags != nil { + p.FeatureFlags = source.FeatureFlags + } +} + +func (cs RefSource) convertTo(ctx context.Context, sink *v1.RefSource) { + sink.URI = cs.URI + sink.Digest = cs.Digest + sink.EntryPoint = cs.EntryPoint +} + +func (cs *RefSource) convertFrom(ctx context.Context, source v1.RefSource) { + cs.URI = source.URI + cs.Digest = source.Digest + cs.EntryPoint = source.EntryPoint +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_conversion.go index 18d3c07bb6..3bbed85032 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_conversion.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_types.go index 1cb0c85fe2..70b1c78867 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resolver_types.go @@ -33,5 +33,5 @@ type ResolverRef struct { // the chosen resolver. // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_paths.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_paths.go deleted file mode 100644 index 260a2ed5f9..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_paths.go +++ /dev/null @@ -1,40 +0,0 @@ -/* - Copyright 2019 The Tekton 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 v1beta1 - -import "path/filepath" - -// InputResourcePath returns the path where the given input resource -// will get mounted in a Pod -func InputResourcePath(r ResourceDeclaration) string { - return path("/workspace", r) -} - -// OutputResourcePath returns the path to the output resource in a Pod -func OutputResourcePath(r ResourceDeclaration) string { - return path("/workspace/output", r) -} - -func path(root string, r ResourceDeclaration) string { - if r.TargetPath != "" { - if filepath.IsAbs(r.TargetPath) { - return r.TargetPath - } - return filepath.Join("/workspace", r.TargetPath) - } - return filepath.Join(root, r.Name) -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_types.go index 203a87c40a..0e5ec62de3 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_types.go @@ -17,50 +17,59 @@ limitations under the License. package v1beta1 import ( - "encoding/json" - "fmt" - - "github.com/google/go-cmp/cmp" - "github.com/hashicorp/go-multierror" resource "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" + "github.com/tektoncd/pipeline/pkg/result" v1 "k8s.io/api/core/v1" ) -// PipelineResourceType represents the type of endpoint the pipelineResource is, so that the -// controller will know this pipelineResource should be fetched and optionally what -// additional metatdata should be provided for it. -type PipelineResourceType = resource.PipelineResourceType - -var ( - // AllowedOutputResources are the resource types that can be used as outputs - AllowedOutputResources = resource.AllowedOutputResources -) +// RunResult is used to write key/value pairs to TaskRun pod termination messages. +// It has been migrated to the result package and kept for backward compatibility +type RunResult = result.RunResult -const ( - // PipelineResourceTypeGit indicates that this source is a GitHub repo. - PipelineResourceTypeGit PipelineResourceType = resource.PipelineResourceTypeGit +// PipelineResourceResult has been deprecated with the migration of PipelineResources +// Deprecated: Use RunResult instead +type PipelineResourceResult = result.RunResult - // PipelineResourceTypeStorage indicates that this source is a storage blob resource. - PipelineResourceTypeStorage PipelineResourceType = resource.PipelineResourceTypeStorage +// ResultType of PipelineResourceResult has been deprecated with the migration of PipelineResources +// Deprecated: v1beta1.ResultType is only kept for backward compatibility +type ResultType = result.ResultType - // PipelineResourceTypeImage indicates that this source is a docker Image. - PipelineResourceTypeImage PipelineResourceType = resource.PipelineResourceTypeImage +// ResourceParam declares a string value to use for the parameter called Name, and is used in +// the specific context of PipelineResources. +// +// Deprecated: Unused, preserved only for backwards compatibility +type ResourceParam = resource.ResourceParam - // PipelineResourceTypeCluster indicates that this source is a k8s cluster Image. - PipelineResourceTypeCluster PipelineResourceType = resource.PipelineResourceTypeCluster - - // PipelineResourceTypePullRequest indicates that this source is a SCM Pull Request. - PipelineResourceTypePullRequest PipelineResourceType = resource.PipelineResourceTypePullRequest - - // PipelineResourceTypeCloudEvent indicates that this source is a cloud event URI - PipelineResourceTypeCloudEvent PipelineResourceType = resource.PipelineResourceTypeCloudEvent -) +// PipelineResourceType represents the type of endpoint the pipelineResource is, so that the +// controller will know this pipelineResource should be fetched and optionally what +// additional metatdata should be provided for it. +// +// Deprecated: Unused, preserved only for backwards compatibility +type PipelineResourceType = resource.PipelineResourceType -// AllResourceTypes can be used for validation to check if a provided Resource type is one of the known types. -var AllResourceTypes = resource.AllResourceTypes +// PipelineDeclaredResource is used by a Pipeline to declare the types of the +// PipelineResources that it will required to run and names which can be used to +// refer to these PipelineResources in PipelineTaskResourceBindings. +// +// Deprecated: Unused, preserved only for backwards compatibility +type PipelineDeclaredResource struct { + // Name is the name that will be used by the Pipeline to refer to this resource. + // It does not directly correspond to the name of any PipelineResources Task + // inputs or outputs, and it does not correspond to the actual names of the + // PipelineResources that will be bound in the PipelineRun. + Name string `json:"name"` + // Type is the type of the PipelineResource. + Type PipelineResourceType `json:"type"` + // Optional declares the resource as optional. + // optional: true - the resource is considered optional + // optional: false - the resource is considered required (default/equivalent of not specifying it) + Optional bool `json:"optional,omitempty"` +} // TaskResources allows a Pipeline to declare how its DeclaredPipelineResources // should be provided to a Task as its inputs and outputs. +// +// Deprecated: Unused, preserved only for backwards compatibility type TaskResources struct { // Inputs holds the mapping from the PipelineResources declared in // DeclaredPipelineResources to the input PipelineResources required by the Task. @@ -77,11 +86,15 @@ type TaskResources struct { // the Task definition, and when provided as an Input, the Name will be the // path to the volume mounted containing this Resource as an input (e.g. // an input Resource named `workspace` will be mounted at `/workspace`). +// +// Deprecated: Unused, preserved only for backwards compatibility type TaskResource struct { ResourceDeclaration `json:",inline"` } // TaskRunResources allows a TaskRun to declare inputs and outputs TaskResourceBinding +// +// Deprecated: Unused, preserved only for backwards compatibility type TaskRunResources struct { // Inputs holds the inputs resources this task was invoked with // +listType=atomic @@ -93,6 +106,8 @@ type TaskRunResources struct { // TaskResourceBinding points to the PipelineResource that // will be used for the Task input or output called Name. +// +// Deprecated: Unused, preserved only for backwards compatibility type TaskResourceBinding struct { PipelineResourceBinding `json:",inline"` // Paths will probably be removed in #1284, and then PipelineResourceBinding can be used instead. @@ -108,10 +123,14 @@ type TaskResourceBinding struct { // PipelineResources within the type's definition, and when provided as an Input, the Name will be the // path to the volume mounted containing this PipelineResource as an input (e.g. // an input Resource named `workspace` will be mounted at `/workspace`). +// +// Deprecated: Unused, preserved only for backwards compatibility type ResourceDeclaration = resource.ResourceDeclaration // PipelineResourceBinding connects a reference to an instance of a PipelineResource // with a PipelineResource dependency that the Pipeline has declared +// +// Deprecated: Unused, preserved only for backwards compatibility type PipelineResourceBinding struct { // Name is the name of the PipelineResource in the Pipeline's declaration Name string `json:"name,omitempty"` @@ -126,59 +145,74 @@ type PipelineResourceBinding struct { ResourceSpec *resource.PipelineResourceSpec `json:"resourceSpec,omitempty"` } -// PipelineResourceResult used to export the image name and digest as json -type PipelineResourceResult struct { - Key string `json:"key"` - Value string `json:"value"` - ResourceName string `json:"resourceName,omitempty"` - ResultType ResultType `json:"type,omitempty"` +// PipelineTaskResources allows a Pipeline to declare how its DeclaredPipelineResources +// should be provided to a Task as its inputs and outputs. +// +// Deprecated: Unused, preserved only for backwards compatibility +type PipelineTaskResources struct { + // Inputs holds the mapping from the PipelineResources declared in + // DeclaredPipelineResources to the input PipelineResources required by the Task. + // +listType=atomic + Inputs []PipelineTaskInputResource `json:"inputs,omitempty"` + // Outputs holds the mapping from the PipelineResources declared in + // DeclaredPipelineResources to the input PipelineResources required by the Task. + // +listType=atomic + Outputs []PipelineTaskOutputResource `json:"outputs,omitempty"` } -// ResultType used to find out whether a PipelineResourceResult is from a task result or not -// Note that ResultsType is another type which is used to define the data type -// (e.g. string, array, etc) we used for Results -type ResultType int - -// UnmarshalJSON unmarshals either an int or a string into a ResultType. String -// ResultTypes were removed because they made JSON messages bigger, which in -// turn limited the amount of space in termination messages for task results. String -// support is maintained for backwards compatibility - the Pipelines controller could -// be stopped midway through TaskRun execution, updated with support for int in place -// of string, and then fail the running TaskRun because it doesn't know how to interpret -// the string value that the TaskRun's entrypoint will emit when it completes. -func (r *ResultType) UnmarshalJSON(data []byte) error { - - var asInt int - var intErr error - - if err := json.Unmarshal(data, &asInt); err != nil { - intErr = err - } else { - *r = ResultType(asInt) - return nil - } - - var asString string +// PipelineTaskInputResource maps the name of a declared PipelineResource input +// dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources +// that should be used. This input may come from a previous task. +// +// Deprecated: Unused, preserved only for backwards compatibility +type PipelineTaskInputResource struct { + // Name is the name of the PipelineResource as declared by the Task. + Name string `json:"name"` + // Resource is the name of the DeclaredPipelineResource to use. + Resource string `json:"resource"` + // From is the list of PipelineTask names that the resource has to come from. + // (Implies an ordering in the execution graph.) + // +optional + // +listType=atomic + From []string `json:"from,omitempty"` +} - if err := json.Unmarshal(data, &asString); err != nil { - return fmt.Errorf("unsupported value type, neither int nor string: %v", multierror.Append(intErr, err).ErrorOrNil()) - } +// PipelineTaskOutputResource maps the name of a declared PipelineResource output +// dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources +// that should be used. +// +// Deprecated: Unused, preserved only for backwards compatibility +type PipelineTaskOutputResource struct { + // Name is the name of the PipelineResource as declared by the Task. + Name string `json:"name"` + // Resource is the name of the DeclaredPipelineResource to use. + Resource string `json:"resource"` +} - switch asString { - case "TaskRunResult": - *r = TaskRunResultType - case "PipelineResourceResult": - *r = PipelineResourceResultType - case "InternalTektonResult": - *r = InternalTektonResultType - default: - *r = UnknownResultType - } +// TaskRunInputs holds the input values that this task was invoked with. +// +// Deprecated: Unused, preserved only for backwards compatibility +type TaskRunInputs struct { + // +optional + // +listType=atomic + Resources []TaskResourceBinding `json:"resources,omitempty"` + // +optional + // +listType=atomic + Params []Param `json:"params,omitempty"` +} - return nil +// TaskRunOutputs holds the output values that this task was invoked with. +// +// Deprecated: Unused, preserved only for backwards compatibility +type TaskRunOutputs struct { + // +optional + // +listType=atomic + Resources []TaskResourceBinding `json:"resources,omitempty"` } // PipelineResourceRef can be used to refer to a specific instance of a Resource +// +// Deprecated: Unused, preserved only for backwards compatibility type PipelineResourceRef struct { // Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names Name string `json:"name,omitempty"` @@ -188,6 +222,8 @@ type PipelineResourceRef struct { } // PipelineResourceInterface interface to be implemented by different PipelineResource types +// +// Deprecated: Unused, preserved only for backwards compatibility type PipelineResourceInterface interface { // GetName returns the name of this PipelineResource instance. GetName() string @@ -205,6 +241,8 @@ type PipelineResourceInterface interface { } // TaskModifier is an interface to be implemented by different PipelineResources +// +// Deprecated: Unused, preserved only for backwards compatibility type TaskModifier interface { GetStepsToPrepend() []Step GetStepsToAppend() []Step @@ -212,6 +250,8 @@ type TaskModifier interface { } // InternalTaskModifier implements TaskModifier for resources that are built-in to Tekton Pipelines. +// +// Deprecated: Unused, preserved only for backwards compatibility type InternalTaskModifier struct { // +listType=atomic StepsToPrepend []Step `json:"stepsToPrepend"` @@ -220,69 +260,3 @@ type InternalTaskModifier struct { // +listType=atomic Volumes []v1.Volume `json:"volumes"` } - -// GetStepsToPrepend returns a set of Steps to prepend to the Task. -func (tm *InternalTaskModifier) GetStepsToPrepend() []Step { - return tm.StepsToPrepend -} - -// GetStepsToAppend returns a set of Steps to append to the Task. -func (tm *InternalTaskModifier) GetStepsToAppend() []Step { - return tm.StepsToAppend -} - -// GetVolumes returns a set of Volumes to prepend to the Task pod. -func (tm *InternalTaskModifier) GetVolumes() []v1.Volume { - return tm.Volumes -} - -// ApplyTaskModifier applies a modifier to the task by appending and prepending steps and volumes. -// If steps with the same name exist in ts an error will be returned. If identical Volumes have -// been added, they will not be added again. If Volumes with the same name but different contents -// have been added, an error will be returned. -func ApplyTaskModifier(ts *TaskSpec, tm TaskModifier) error { - steps := tm.GetStepsToPrepend() - for _, step := range steps { - if err := checkStepNotAlreadyAdded(step, ts.Steps); err != nil { - return err - } - } - ts.Steps = append(steps, ts.Steps...) - - steps = tm.GetStepsToAppend() - for _, step := range steps { - if err := checkStepNotAlreadyAdded(step, ts.Steps); err != nil { - return err - } - } - ts.Steps = append(ts.Steps, steps...) - - volumes := tm.GetVolumes() - for _, volume := range volumes { - var alreadyAdded bool - for _, v := range ts.Volumes { - if volume.Name == v.Name { - // If a Volume with the same name but different contents has already been added, we can't add both - if d := cmp.Diff(volume, v); d != "" { - return fmt.Errorf("tried to add volume %s already added but with different contents", volume.Name) - } - // If an identical Volume has already been added, don't add it again - alreadyAdded = true - } - } - if !alreadyAdded { - ts.Volumes = append(ts.Volumes, volume) - } - } - - return nil -} - -func checkStepNotAlreadyAdded(s Step, steps []Step) error { - for _, step := range steps { - if s.Name == step.Name { - return fmt.Errorf("Step %s cannot be added again", step.Name) - } - } - return nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_types_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_types_validation.go deleted file mode 100644 index 2898fd9dfc..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resource_types_validation.go +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright 2019 The Tekton 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 v1beta1 - -import ( - "context" - "fmt" - "strings" - - "k8s.io/apimachinery/pkg/util/sets" - "knative.dev/pkg/apis" -) - -// Validate implements apis.Validatable -func (tr *TaskResources) Validate(context.Context) (errs *apis.FieldError) { - if tr != nil { - errs = errs.Also(validateTaskResources(tr.Inputs).ViaField("inputs")) - errs = errs.Also(validateTaskResources(tr.Outputs).ViaField("outputs")) - } - return errs -} - -func validateTaskResources(resources []TaskResource) (errs *apis.FieldError) { - for idx, resource := range resources { - errs = errs.Also(validateResourceType(resource, fmt.Sprintf("%s.type", resource.Name))).ViaIndex(idx) - } - return errs.Also(checkForDuplicates(resources, "name")) -} - -func checkForDuplicates(resources []TaskResource, path string) *apis.FieldError { - encountered := sets.NewString() - for _, r := range resources { - if encountered.Has(strings.ToLower(r.Name)) { - return apis.ErrMultipleOneOf(path) - } - encountered.Insert(strings.ToLower(r.Name)) - } - return nil -} - -func validateResourceType(r TaskResource, path string) *apis.FieldError { - for _, allowed := range AllResourceTypes { - if r.Type == allowed { - return nil - } - } - return apis.ErrInvalidValue(r.Type, path) -} - -// Validate implements apis.Validatable -func (tr *TaskRunResources) Validate(ctx context.Context) *apis.FieldError { - if tr == nil { - return nil - } - if err := validateTaskRunResources(ctx, tr.Inputs, "spec.resources.inputs.name"); err != nil { - return err - } - return validateTaskRunResources(ctx, tr.Outputs, "spec.resources.outputs.name") -} - -// validateTaskRunResources validates that -// 1. resource is not declared more than once -// 2. if both resource reference and resource spec is defined at the same time -// 3. at least resource ref or resource spec is defined -func validateTaskRunResources(ctx context.Context, resources []TaskResourceBinding, path string) *apis.FieldError { - encountered := sets.NewString() - for _, r := range resources { - // We should provide only one binding for each resource required by the Task. - name := strings.ToLower(r.Name) - if encountered.Has(strings.ToLower(name)) { - return apis.ErrMultipleOneOf(path) - } - encountered.Insert(name) - // Check that both resource ref and resource Spec are not present - if r.ResourceRef != nil && r.ResourceSpec != nil { - return apis.ErrDisallowedFields(fmt.Sprintf("%s.resourceRef", path), fmt.Sprintf("%s.resourceSpec", path)) - } - // Check that one of resource ref and resource Spec is present - if (r.ResourceRef == nil || r.ResourceRef.Name == "") && r.ResourceSpec == nil { - return apis.ErrMissingField(fmt.Sprintf("%s.resourceRef", path), fmt.Sprintf("%s.resourceSpec", path)) - } - if r.ResourceSpec != nil && r.ResourceSpec.Validate(ctx) != nil { - return r.ResourceSpec.Validate(ctx) - } - - } - return nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_conversion.go index 70197bed16..5e0facad2a 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_conversion.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_types.go index d71f513c4b..b4e3764c89 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_types.go @@ -54,7 +54,7 @@ type ResultValue = ParamValue // ResultsType indicates the type of a result; // Used to distinguish between a single string and an array of strings. // Note that there is ResultType used to find out whether a -// PipelineResourceResult is from a task result or not, which is different from +// RunResult is from a task result or not, which is different from // this ResultsType. type ResultsType string diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_validation.go index 4232b174fa..fe2fca41a6 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/result_validation.go @@ -27,22 +27,24 @@ func (tr TaskResult) Validate(ctx context.Context) (errs *apis.FieldError) { if !resultNameFormatRegex.MatchString(tr.Name) { return apis.ErrInvalidKeyName(tr.Name, "name", fmt.Sprintf("Name must consist of alphanumeric characters, '-', '_', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my-name', or 'my_name', regex used for validation is '%s')", ResultNameFormat)) } - // Array and Object is alpha feature - if tr.Type == ResultsTypeArray || tr.Type == ResultsTypeObject { + + switch { + // Object results is a beta feature - make sure the feature flag is set to "beta" + case tr.Type == ResultsTypeObject: errs := validateObjectResult(tr) - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "results type", config.AlphaAPIFields)) + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "results type", config.BetaAPIFields)) + return errs + // Array results is a beta feature - make sure the feature flag is set to "beta" + case tr.Type == ResultsTypeArray: + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "results type", config.BetaAPIFields)) return errs - } - // Resources created before the result. Type was introduced may not have Type set // and should be considered valid - if tr.Type == "" { + case tr.Type == "": return nil - } - - // By default the result type is string - if tr.Type != ResultsTypeString { - return apis.ErrInvalidValue(tr.Type, "type", fmt.Sprintf("type must be string")) + // By default, the result type is string + case tr.Type != ResultsTypeString: + return apis.ErrInvalidValue(tr.Type, "type", "type must be string") } return nil diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resultref.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resultref.go index c6d2526fc3..43ad32036f 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resultref.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/resultref.go @@ -51,7 +51,7 @@ const ( exactVariableSubstitutionFormat = `^\$\([_a-zA-Z0-9.-]+(\.[_a-zA-Z0-9.-]+)*(\[([0-9]+|\*)\])?\)$` // arrayIndexing will match all `[int]` and `[*]` for parseExpression arrayIndexing = `\[([0-9])*\*?\]` - // ResultNameFormat Constant used to define the the regex Result.Name should follow + // ResultNameFormat Constant used to define the regex Result.Name should follow ResultNameFormat = `^([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$` ) @@ -171,7 +171,6 @@ func stripVarSubExpression(expression string) string { // - Output: "", "", 0, "", error // TODO: may use regex for each type to handle possible reference formats func parseExpression(substitutionExpression string) (string, string, int, string, error) { - if looksLikeResultRef(substitutionExpression) { subExpressions := strings.Split(substitutionExpression, ".") // For string result: tasks..results. @@ -209,19 +208,13 @@ func ParseResultName(resultName string) (string, string) { // in a PipelineTask and returns a list of any references that are found. func PipelineTaskResultRefs(pt *PipelineTask) []*ResultRef { refs := []*ResultRef{} - var matrixParams []Param - if pt.IsMatrixed() { - matrixParams = pt.Matrix.Params - } - for _, p := range append(pt.Params, matrixParams...) { + for _, p := range pt.extractAllParams() { expressions, _ := GetVarSubstitutionExpressionsForParam(p) refs = append(refs, NewResultRefs(expressions)...) } - for _, whenExpression := range pt.WhenExpressions { expressions, _ := whenExpression.GetVarSubstitutionExpressions() refs = append(refs, NewResultRefs(expressions)...) } - return refs } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/run_interface.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/run_interface.go new file mode 100644 index 0000000000..2a0ada19d6 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/run_interface.go @@ -0,0 +1,43 @@ +/* + Copyright 2022 The Tekton 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 v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "knative.dev/pkg/apis" +) + +// RunObject is implemented by CustomRun and Run +type RunObject interface { + // Object requires GetObjectKind() and DeepCopyObject() + runtime.Object + + // ObjectMetaAccessor requires a GetObjectMeta that returns the ObjectMeta + metav1.ObjectMetaAccessor + + // GetStatusCondition returns a ConditionAccessor for the status of the objectWithCondition + GetStatusCondition() apis.ConditionAccessor + + IsSuccessful() bool + IsCancelled() bool + HasStarted() bool + IsDone() bool + + GetRetryCount() int +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/status_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/status_validation.go deleted file mode 100644 index 860bd7f1f8..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/status_validation.go +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright 2022 The Tekton 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 v1beta1 - -import ( - "context" - "fmt" - - "github.com/tektoncd/pipeline/pkg/apis/config" - "knative.dev/pkg/apis" -) - -// ValidateEmbeddedStatus checks that the embedded-status feature gate is set to the wantEmbeddedStatus value and, -// if not, returns an error stating which feature is dependent on the status and what the current status actually is. -func ValidateEmbeddedStatus(ctx context.Context, featureName, wantEmbeddedStatus string) *apis.FieldError { - embeddedStatus := config.FromContextOrDefaults(ctx).FeatureFlags.EmbeddedStatus - if embeddedStatus != wantEmbeddedStatus { - message := fmt.Sprintf(`%s requires "embedded-status" feature gate to be %q but it is %q`, featureName, wantEmbeddedStatus, embeddedStatus) - return apis.ErrGeneric(message) - } - return nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/swagger.json b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/swagger.json index 1f45183282..c0b8e2770c 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/swagger.json +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/swagger.json @@ -63,6 +63,17 @@ "description": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.", "type": "boolean" }, + "env": { + "description": "List of environment variables that can be provided to the containers belonging to the pod.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.EnvVar" + }, + "x-kubernetes-list-type": "atomic", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, "hostAliases": { "description": "HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods.", "type": "array", @@ -140,173 +151,6 @@ } } }, - "v1alpha1.PipelineResource": { - "description": "PipelineResource describes a resource that is an input to or output from a Task.", - "type": "object", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "default": {}, - "$ref": "#/definitions/v1.ObjectMeta" - }, - "spec": { - "description": "Spec holds the desired state of the PipelineResource from the client", - "default": {}, - "$ref": "#/definitions/v1alpha1.PipelineResourceSpec" - }, - "status": { - "description": "Status is deprecated. It usually is used to communicate the observed state of the PipelineResource from the controller, but was unused as there is no controller for PipelineResource.", - "$ref": "#/definitions/v1alpha1.PipelineResourceStatus" - } - } - }, - "v1alpha1.PipelineResourceList": { - "description": "PipelineResourceList contains a list of PipelineResources", - "type": "object", - "required": [ - "items" - ], - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1alpha1.PipelineResource" - } - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "default": {}, - "$ref": "#/definitions/v1.ListMeta" - } - } - }, - "v1alpha1.PipelineResourceSpec": { - "description": "PipelineResourceSpec defines an individual resources used in the pipeline.", - "type": "object", - "required": [ - "type", - "params" - ], - "properties": { - "description": { - "description": "Description is a user-facing description of the resource that may be used to populate a UI.", - "type": "string" - }, - "params": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1alpha1.ResourceParam" - }, - "x-kubernetes-list-type": "atomic" - }, - "secrets": { - "description": "Secrets to fetch to populate some of resource fields", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1alpha1.SecretParam" - }, - "x-kubernetes-list-type": "atomic" - }, - "type": { - "type": "string", - "default": "" - } - } - }, - "v1alpha1.PipelineResourceStatus": { - "description": "PipelineResourceStatus does not contain anything because PipelineResources on their own do not have a status Deprecated", - "type": "object" - }, - "v1alpha1.ResourceDeclaration": { - "description": "ResourceDeclaration defines an input or output PipelineResource declared as a requirement by another type such as a Task or Condition. The Name field will be used to refer to these PipelineResources within the type's definition, and when provided as an Input, the Name will be the path to the volume mounted containing this PipelineResource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).", - "type": "object", - "required": [ - "name", - "type" - ], - "properties": { - "description": { - "description": "Description is a user-facing description of the declared resource that may be used to populate a UI.", - "type": "string" - }, - "name": { - "description": "Name declares the name by which a resource is referenced in the definition. Resources may be referenced by name in the definition of a Task's steps.", - "type": "string", - "default": "" - }, - "optional": { - "description": "Optional declares the resource as optional. By default optional is set to false which makes a resource required. optional: true - the resource is considered optional optional: false - the resource is considered required (equivalent of not specifying it)", - "type": "boolean" - }, - "targetPath": { - "description": "TargetPath is the path in workspace directory where the resource will be copied.", - "type": "string" - }, - "type": { - "description": "Type is the type of this resource;", - "type": "string", - "default": "" - } - } - }, - "v1alpha1.ResourceParam": { - "description": "ResourceParam declares a string value to use for the parameter called Name, and is used in the specific context of PipelineResources.", - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string", - "default": "" - }, - "value": { - "type": "string", - "default": "" - } - } - }, - "v1alpha1.SecretParam": { - "description": "SecretParam indicates which secret can be used to populate a field of the resource", - "type": "object", - "required": [ - "fieldName", - "secretKey", - "secretName" - ], - "properties": { - "fieldName": { - "type": "string", - "default": "" - }, - "secretKey": { - "type": "string", - "default": "" - }, - "secretName": { - "type": "string", - "default": "" - } - } - }, "v1beta1.ChildStatusReference": { "description": "ChildStatusReference is used to point to the statuses of individual TaskRuns and Runs within this PipelineRun.", "type": "object", @@ -380,7 +224,7 @@ } }, "v1beta1.ClusterTask": { - "description": "ClusterTask is a Task with a cluster scope. ClusterTasks are used to represent Tasks that should be publicly addressable from any namespace in the cluster. Deprecated: Please use the cluster resolver instead.", + "description": "ClusterTask is a Task with a cluster scope. ClusterTasks are used to represent Tasks that should be publicly addressable from any namespace in the cluster.\n\nDeprecated: Please use the cluster resolver instead.", "type": "object", "properties": { "apiVersion": { @@ -431,11 +275,11 @@ } }, "v1beta1.ConfigSource": { - "description": "ConfigSource identifies the source where a resource came from. This can include Git repositories, Task Bundles, file checksums, or other information that allows users to identify where the resource came from and what version was used.", + "description": "ConfigSource contains the information that can uniquely identify where a remote built definition came from i.e. Git repositories, Tekton Bundles in OCI registry and hub.", "type": "object", "properties": { "digest": { - "description": "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.digest Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", + "description": "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", "type": "object", "additionalProperties": { "type": "string", @@ -443,11 +287,11 @@ } }, "entryPoint": { - "description": "EntryPoint identifies the entry point into the build. This is often a path to a configuration file and/or a target label within that file. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.entryPoint Example: \"task/git-clone/0.8/git-clone.yaml\"", + "description": "EntryPoint identifies the entry point into the build. This is often a path to a build definition file and/or a target label within that file. Example: \"task/git-clone/0.8/git-clone.yaml\"", "type": "string" }, "uri": { - "description": "URI indicates the identity of the source of the config. Definition: https://slsa.dev/provenance/v0.2#invocation.configSource.uri Example: \"https://github.com/tektoncd/catalog\"", + "description": "URI indicates the identity of the source of the build definition. Example: \"https://github.com/tektoncd/catalog\"", "type": "string" } } @@ -589,6 +433,10 @@ "description": "Description is a user-facing description of the task that may be used to populate a UI.", "type": "string" }, + "displayName": { + "description": "DisplayName is a user-facing name of the task that may be used to populate a UI.", + "type": "string" + }, "kind": { "type": "string" }, @@ -606,7 +454,7 @@ "x-kubernetes-list-type": "atomic" }, "resources": { - "description": "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.", + "description": "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.\n\nDeprecated: Unused, preserved only for backwards compatibility", "$ref": "#/definitions/v1beta1.TaskResources" }, "results": { @@ -665,8 +513,27 @@ } } }, + "v1beta1.IncludeParams": { + "description": "IncludeParams allows passing in a specific combinations of Parameters into the Matrix.", + "type": "object", + "properties": { + "name": { + "description": "Name the specified combination", + "type": "string" + }, + "params": { + "description": "Params takes only `Parameters` of type `\"string\"` The names of the `params` must match the names of the `params` in the underlying `Task`", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1beta1.Param" + }, + "x-kubernetes-list-type": "atomic" + } + } + }, "v1beta1.InternalTaskModifier": { - "description": "InternalTaskModifier implements TaskModifier for resources that are built-in to Tekton Pipelines.", + "description": "InternalTaskModifier implements TaskModifier for resources that are built-in to Tekton Pipelines.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "required": [ "stepsToPrepend", @@ -704,6 +571,15 @@ "description": "Matrix is used to fan out Tasks in a Pipeline", "type": "object", "properties": { + "include": { + "description": "Include is a list of IncludeParams which allows passing in specific combinations of Parameters into the Matrix.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1beta1.IncludeParams" + }, + "x-kubernetes-list-type": "atomic" + }, "params": { "description": "Params is a list of parameters used to fan out the pipelineTask Params takes only `Parameters` of type `\"array\"` Each array element is supplied to the `PipelineTask` by substituting `params` of type `\"string\"` in the underlying `Task`. The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting.", "type": "array", @@ -771,13 +647,13 @@ "description": "ResultValue is a type alias of ParamValue", "type": "object", "required": [ - "type", - "stringVal", - "arrayVal", - "objectVal" + "Type", + "StringVal", + "ArrayVal", + "ObjectVal" ], "properties": { - "arrayVal": { + "ArrayVal": { "type": "array", "items": { "type": "string", @@ -785,19 +661,19 @@ }, "x-kubernetes-list-type": "atomic" }, - "objectVal": { + "ObjectVal": { "type": "object", "additionalProperties": { "type": "string", "default": "" } }, - "stringVal": { + "StringVal": { "description": "Represents the stored type of ParamValues.", "type": "string", "default": "" }, - "type": { + "Type": { "type": "string", "default": "" } @@ -827,7 +703,7 @@ } }, "v1beta1.PipelineDeclaredResource": { - "description": "PipelineDeclaredResource is used by a Pipeline to declare the types of the PipelineResources that it will required to run and names which can be used to refer to these PipelineResources in PipelineTaskResourceBindings.", + "description": "PipelineDeclaredResource is used by a Pipeline to declare the types of the PipelineResources that it will required to run and names which can be used to refer to these PipelineResources in PipelineTaskResourceBindings.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "required": [ "name", @@ -887,7 +763,7 @@ "type": "string" }, "bundle": { - "description": "Bundle url reference to a Tekton Bundle. Deprecated: Please use ResolverRef with the bundles resolver instead.", + "description": "Bundle url reference to a Tekton Bundle.\n\nDeprecated: Please use ResolverRef with the bundles resolver instead.", "type": "string" }, "name": { @@ -897,7 +773,7 @@ } }, "v1beta1.PipelineResourceBinding": { - "description": "PipelineResourceBinding connects a reference to an instance of a PipelineResource with a PipelineResource dependency that the Pipeline has declared", + "description": "PipelineResourceBinding connects a reference to an instance of a PipelineResource with a PipelineResource dependency that the Pipeline has declared\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "name": { @@ -915,7 +791,7 @@ } }, "v1beta1.PipelineResourceRef": { - "description": "PipelineResourceRef can be used to refer to a specific instance of a Resource", + "description": "PipelineResourceRef can be used to refer to a specific instance of a Resource\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "apiVersion": { @@ -928,31 +804,6 @@ } } }, - "v1beta1.PipelineResourceResult": { - "description": "PipelineResourceResult used to export the image name and digest as json", - "type": "object", - "required": [ - "key", - "value" - ], - "properties": { - "key": { - "type": "string", - "default": "" - }, - "resourceName": { - "type": "string" - }, - "type": { - "type": "integer", - "format": "int32" - }, - "value": { - "type": "string", - "default": "" - } - } - }, "v1beta1.PipelineResult": { "description": "PipelineResult used to describe the results of a pipeline", "type": "object", @@ -1054,7 +905,7 @@ } }, "v1beta1.PipelineRunRunStatus": { - "description": "PipelineRunRunStatus contains the name of the PipelineTask for this Run and the Run's Status", + "description": "PipelineRunRunStatus contains the name of the PipelineTask for this CustomRun or Run and the CustomRun or Run's Status", "type": "object", "properties": { "pipelineTaskName": { @@ -1062,8 +913,8 @@ "type": "string" }, "status": { - "description": "Status is the RunStatus for the corresponding Run", - "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.run.v1alpha1.RunStatus" + "description": "Status is the CustomRunStatus for the corresponding CustomRun or Run", + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.run.v1beta1.CustomRunStatus" }, "whenExpressions": { "description": "WhenExpressions is the list of checks guarding the execution of the PipelineTask", @@ -1100,7 +951,7 @@ "$ref": "#/definitions/pod.Template" }, "resources": { - "description": "Resources is a list of bindings specifying which actual instances of PipelineResources to use for the resources the Pipeline has declared it needs.", + "description": "Resources is a list of bindings specifying which actual instances of PipelineResources to use for the resources the Pipeline has declared it needs.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "array", "items": { "default": {}, @@ -1125,7 +976,7 @@ "x-kubernetes-list-type": "atomic" }, "timeout": { - "description": "Timeout Deprecated: use pipelineRunSpec.Timeouts.Pipeline instead Time after which the Pipeline times out. Defaults to never. Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + "description": "Timeout is the Time after which the Pipeline times out. Defaults to never. Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration\n\nDeprecated: use pipelineRunSpec.Timeouts.Pipeline instead", "$ref": "#/definitions/v1.Duration" }, "timeouts": { @@ -1205,7 +1056,7 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "runs": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunRunStatus with the run name as the key", + "description": "Runs is a map of PipelineRunRunStatus with the run name as the key\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunRunStatus" @@ -1220,12 +1071,20 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the PipelineRun is actually started.", "$ref": "#/definitions/v1.Time" }, "taskRuns": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunTaskRunStatus with the taskRun name as the key", + "description": "TaskRuns is a map of PipelineRunTaskRunStatus with the taskRun name as the key.\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunTaskRunStatus" @@ -1272,7 +1131,7 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "runs": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunRunStatus with the run name as the key", + "description": "Runs is a map of PipelineRunRunStatus with the run name as the key\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunRunStatus" @@ -1287,12 +1146,20 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the PipelineRun is actually started.", "$ref": "#/definitions/v1.Time" }, "taskRuns": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunTaskRunStatus with the taskRun name as the key", + "description": "TaskRuns is a map of PipelineRunTaskRunStatus with the taskRun name as the key.\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunTaskRunStatus" @@ -1331,6 +1198,10 @@ "description": "Description is a user-facing description of the pipeline that may be used to populate a UI.", "type": "string" }, + "displayName": { + "description": "DisplayName is a user-facing name of the pipeline that may be used to populate a UI.", + "type": "string" + }, "finally": { "description": "Finally declares the list of Tasks that execute just before leaving the Pipeline i.e. either after all Tasks are finished executing successfully or after a failure which would result in ending the Pipeline", "type": "array", @@ -1350,7 +1221,7 @@ "x-kubernetes-list-type": "atomic" }, "resources": { - "description": "Resources declares the names and types of the resources given to the Pipeline's tasks as inputs and outputs.", + "description": "Deprecated: Unused, preserved only for backwards compatibility", "type": "array", "items": { "default": {}, @@ -1391,6 +1262,14 @@ "description": "PipelineTask defines a task in a Pipeline, passing inputs from both Params and from the output of previous tasks.", "type": "object", "properties": { + "description": { + "description": "Description is the description of this task within the context of a Pipeline. This description may be used to populate a UI.", + "type": "string" + }, + "displayName": { + "description": "DisplayName is the display name of this task within the context of a Pipeline. This display name may be used to populate a UI.", + "type": "string" + }, "matrix": { "description": "Matrix declares parameters used to fan out this task.", "$ref": "#/definitions/v1beta1.Matrix" @@ -1409,7 +1288,7 @@ "x-kubernetes-list-type": "atomic" }, "resources": { - "description": "Resources declares the resources given to this task as inputs and outputs.", + "description": "Deprecated: Unused, preserved only for backwards compatibility", "$ref": "#/definitions/v1beta1.PipelineTaskResources" }, "retries": { @@ -1458,7 +1337,7 @@ } }, "v1beta1.PipelineTaskInputResource": { - "description": "PipelineTaskInputResource maps the name of a declared PipelineResource input dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used. This input may come from a previous task.", + "description": "PipelineTaskInputResource maps the name of a declared PipelineResource input dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used. This input may come from a previous task.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "required": [ "name", @@ -1507,7 +1386,7 @@ } }, "v1beta1.PipelineTaskOutputResource": { - "description": "PipelineTaskOutputResource maps the name of a declared PipelineResource output dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used.", + "description": "PipelineTaskOutputResource maps the name of a declared PipelineResource output dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "required": [ "name", @@ -1545,7 +1424,7 @@ } }, "v1beta1.PipelineTaskResources": { - "description": "PipelineTaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.", + "description": "PipelineTaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "inputs": { @@ -1616,7 +1495,7 @@ } }, "v1beta1.PipelineWorkspaceDeclaration": { - "description": "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding. Deprecated: use PipelineWorkspaceDeclaration type instead", + "description": "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding.\n\nDeprecated: use PipelineWorkspaceDeclaration type instead", "type": "object", "required": [ "name" @@ -1647,12 +1526,42 @@ } }, "v1beta1.Provenance": { - "description": "Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). For now, it only contains the subfield `ConfigSource` that identifies the source where a build config file came from. In future, it can be expanded as needed to include more metadata about the build. This field aims to be used to carry minimum amount of the authenticated metadata in *Run status so that Tekton Chains can pick it up and record in the provenance it generates.", + "description": "Provenance contains metadata about resources used in the TaskRun/PipelineRun such as the source from where a remote build definition was fetched. This field aims to carry minimum amoumt of metadata in *Run status so that Tekton Chains can capture them in the provenance.", "type": "object", "properties": { "configSource": { - "description": "ConfigSource identifies the source where a resource came from.", + "description": "Deprecated: Use RefSource instead", "$ref": "#/definitions/v1beta1.ConfigSource" + }, + "featureFlags": { + "description": "FeatureFlags identifies the feature flags that were used during the task/pipeline run", + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.config.FeatureFlags" + }, + "refSource": { + "description": "RefSource identifies the source where a remote task/pipeline came from.", + "$ref": "#/definitions/v1beta1.RefSource" + } + } + }, + "v1beta1.RefSource": { + "description": "RefSource contains the information that can uniquely identify where a remote built definition came from i.e. Git repositories, Tekton Bundles in OCI registry and hub.", + "type": "object", + "properties": { + "digest": { + "description": "Digest is a collection of cryptographic digests for the contents of the artifact specified by URI. Example: {\"sha1\": \"f99d13e554ffcb696dee719fa85b695cb5b0f428\"}", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, + "entryPoint": { + "description": "EntryPoint identifies the entry point into the build. This is often a path to a build definition file and/or a target label within that file. Example: \"task/git-clone/0.8/git-clone.yaml\"", + "type": "string" + }, + "uri": { + "description": "URI indicates the identity of the source of the build definition. Example: \"https://github.com/tektoncd/catalog\"", + "type": "string" } } }, @@ -1732,7 +1641,8 @@ "type": "object", "required": [ "data", - "source" + "source", + "refSource" ], "properties": { "annotations": { @@ -1763,8 +1673,12 @@ "type": "integer", "format": "int64" }, + "refSource": { + "description": "RefSource is the source reference of the remote data that records the url, digest and the entrypoint.", + "$ref": "#/definitions/v1beta1.RefSource" + }, "source": { - "description": "Source is the source reference of the remote data that records the url, digest and the entrypoint.", + "description": "Deprecated: Use RefSource instead", "$ref": "#/definitions/v1beta1.ConfigSource" } } @@ -1774,7 +1688,8 @@ "type": "object", "required": [ "data", - "source" + "source", + "refSource" ], "properties": { "data": { @@ -1782,8 +1697,12 @@ "type": "string", "default": "" }, + "refSource": { + "description": "RefSource is the source reference of the remote data that records the url, digest and the entrypoint.", + "$ref": "#/definitions/v1beta1.RefSource" + }, "source": { - "description": "Source is the source reference of the remote data that records the url, digest and the entrypoint.", + "description": "Deprecated: Use RefSource instead", "$ref": "#/definitions/v1beta1.ConfigSource" } } @@ -2105,11 +2024,11 @@ "type": "string" }, "lifecycle": { - "description": "Deprecated. This field will be removed in a future release. Actions that the management system should take in response to container lifecycle events. Cannot be updated.", + "description": "Actions that the management system should take in response to container lifecycle events. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Lifecycle" }, "livenessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container liveness. Step will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container liveness. Step will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "name": { @@ -2122,7 +2041,7 @@ "type": "string" }, "ports": { - "description": "Deprecated. This field will be removed in a future release. List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + "description": "List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "type": "array", "items": { "default": {}, @@ -2137,7 +2056,7 @@ "x-kubernetes-patch-strategy": "merge" }, "readinessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container service readiness. Step will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container service readiness. Step will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "resources": { @@ -2154,7 +2073,7 @@ "$ref": "#/definitions/v1.SecurityContext" }, "startupProbe": { - "description": "Deprecated. This field will be removed in a future release. DeprecatedStartupProbe indicates that the Pod this Step runs in has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "DeprecatedStartupProbe indicates that the Pod this Step runs in has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "stderrConfig": { @@ -2162,11 +2081,11 @@ "$ref": "#/definitions/v1beta1.StepOutputConfig" }, "stdin": { - "description": "Deprecated. This field will be removed in a future release. Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.", + "description": "Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "stdinOnce": { - "description": "Deprecated. This field will be removed in a future release. Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + "description": "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "stdoutConfig": { @@ -2174,11 +2093,11 @@ "$ref": "#/definitions/v1beta1.StepOutputConfig" }, "terminationMessagePath": { - "description": "Deprecated. This field will be removed in a future release and can't be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and can't be meaningfully used.", "type": "string" }, "terminationMessagePolicy": { - "description": "Deprecated. This field will be removed in a future release and can't be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and can't be meaningfully used.", "type": "string" }, "timeout": { @@ -2186,7 +2105,7 @@ "$ref": "#/definitions/v1.Duration" }, "tty": { - "description": "Deprecated. This field will be removed in a future release. Whether this container should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.", + "description": "Whether this container should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "volumeDevices": { @@ -2317,20 +2236,20 @@ "type": "string" }, "lifecycle": { - "description": "Deprecated. This field will be removed in a future release. Actions that the management system should take in response to container lifecycle events. Cannot be updated.", + "description": "Actions that the management system should take in response to container lifecycle events. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Lifecycle" }, "livenessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "name": { - "description": "Deprecated. This field will be removed in a future release. Default name for each Step specified as a DNS_LABEL. Each Step in a Task must have a unique name. Cannot be updated.", + "description": "Default name for each Step specified as a DNS_LABEL. Each Step in a Task must have a unique name. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "type": "string", "default": "" }, "ports": { - "description": "Deprecated. This field will be removed in a future release. List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + "description": "List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "type": "array", "items": { "default": {}, @@ -2345,7 +2264,7 @@ "x-kubernetes-patch-strategy": "merge" }, "readinessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "resources": { @@ -2358,27 +2277,27 @@ "$ref": "#/definitions/v1.SecurityContext" }, "startupProbe": { - "description": "Deprecated. This field will be removed in a future release. DeprecatedStartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "DeprecatedStartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "stdin": { - "description": "Deprecated. This field will be removed in a future release. Whether this Step should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the Step will always result in EOF. Default is false.", + "description": "Whether this Step should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the Step will always result in EOF. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "stdinOnce": { - "description": "Deprecated. This field will be removed in a future release. Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + "description": "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "terminationMessagePath": { - "description": "Deprecated. This field will be removed in a future release and cannot be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and cannot be meaningfully used.", "type": "string" }, "terminationMessagePolicy": { - "description": "Deprecated. This field will be removed in a future release and cannot be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and cannot be meaningfully used.", "type": "string" }, "tty": { - "description": "Deprecated. This field will be removed in a future release. Whether this Step should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.", + "description": "Whether this Step should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "volumeDevices": { @@ -2465,15 +2384,15 @@ "type": "object", "properties": { "apiVersion": { - "description": "API version of the referent", + "description": "API version of the referent Note: A Task with non-empty APIVersion and Kind is considered a Custom Task", "type": "string" }, "bundle": { - "description": "Bundle url reference to a Tekton Bundle. Deprecated: Please use ResolverRef with the bundles resolver instead.", + "description": "Bundle url reference to a Tekton Bundle.\n\nDeprecated: Please use ResolverRef with the bundles resolver instead.", "type": "string" }, "kind": { - "description": "TaskKind indicates the kind of the task, namespaced or cluster scoped.", + "description": "TaskKind indicates the Kind of the Task: 1. Namespaced Task when Kind is set to \"Task\". If Kind is \"\", it defaults to \"Task\". 2. Cluster-Scoped Task when Kind is set to \"ClusterTask\" 3. Custom Task when Kind is non-empty and APIVersion is non-empty", "type": "string" }, "name": { @@ -2483,7 +2402,7 @@ } }, "v1beta1.TaskResource": { - "description": "TaskResource defines an input or output Resource declared as a requirement by a Task. The Name field will be used to refer to these Resources within the Task definition, and when provided as an Input, the Name will be the path to the volume mounted containing this Resource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).", + "description": "TaskResource defines an input or output Resource declared as a requirement by a Task. The Name field will be used to refer to these Resources within the Task definition, and when provided as an Input, the Name will be the path to the volume mounted containing this Resource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "required": [ "name", @@ -2515,7 +2434,7 @@ } }, "v1beta1.TaskResourceBinding": { - "description": "TaskResourceBinding points to the PipelineResource that will be used for the Task input or output called Name.", + "description": "TaskResourceBinding points to the PipelineResource that will be used for the Task input or output called Name.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "name": { @@ -2542,7 +2461,7 @@ } }, "v1beta1.TaskResources": { - "description": "TaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.", + "description": "TaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "inputs": { @@ -2636,7 +2555,7 @@ } }, "v1beta1.TaskRunInputs": { - "description": "TaskRunInputs holds the input values that this task was invoked with.", + "description": "TaskRunInputs holds the input values that this task was invoked with.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "params": { @@ -2686,7 +2605,7 @@ } }, "v1beta1.TaskRunOutputs": { - "description": "TaskRunOutputs holds the output values that this task was invoked with.", + "description": "TaskRunOutputs holds the output values that this task was invoked with.\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "resources": { @@ -2700,7 +2619,7 @@ } }, "v1beta1.TaskRunResources": { - "description": "TaskRunResources allows a TaskRun to declare inputs and outputs TaskResourceBinding", + "description": "TaskRunResources allows a TaskRun to declare inputs and outputs TaskResourceBinding\n\nDeprecated: Unused, preserved only for backwards compatibility", "type": "object", "properties": { "inputs": { @@ -2791,8 +2710,14 @@ "$ref": "#/definitions/pod.Template" }, "resources": { + "description": "Deprecated: Unused, preserved only for backwards compatibility", "$ref": "#/definitions/v1beta1.TaskRunResources" }, + "retries": { + "description": "Retries represents how many times this TaskRun should be retried in the event of Task failure.", + "type": "integer", + "format": "int32" + }, "serviceAccountName": { "type": "string", "default": "" @@ -2807,7 +2732,7 @@ "x-kubernetes-list-type": "atomic" }, "status": { - "description": "Used for cancelling a taskrun (and maybe more later on)", + "description": "Used for cancelling a TaskRun (and maybe more later on)", "type": "string" }, "statusMessage": { @@ -2831,7 +2756,7 @@ "$ref": "#/definitions/v1beta1.TaskSpec" }, "timeout": { - "description": "Time after which the build times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + "description": "Time after which one retry attempt times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", "$ref": "#/definitions/v1.Duration" }, "workspaces": { @@ -2861,7 +2786,7 @@ } }, "cloudEvents": { - "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.", + "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.\n\nDeprecated: Removed in v0.44.0.", "type": "array", "items": { "default": {}, @@ -2898,11 +2823,11 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "resourcesResult": { - "description": "Results from Resources built during the taskRun. currently includes the digest of build container images", + "description": "Results from Resources built during the TaskRun. This is tomb-stoned along with the removal of pipelineResources Deprecated: this field is not populated and is preserved only for backwards compatibility", "type": "array", "items": { "default": {}, - "$ref": "#/definitions/v1beta1.PipelineResourceResult" + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.result.RunResult" }, "x-kubernetes-list-type": "atomic" }, @@ -2924,6 +2849,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the build is actually started.", "$ref": "#/definitions/v1.Time" @@ -2960,7 +2893,7 @@ ], "properties": { "cloudEvents": { - "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.", + "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.\n\nDeprecated: Removed in v0.44.0.", "type": "array", "items": { "default": {}, @@ -2982,11 +2915,11 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "resourcesResult": { - "description": "Results from Resources built during the taskRun. currently includes the digest of build container images", + "description": "Results from Resources built during the TaskRun. This is tomb-stoned along with the removal of pipelineResources Deprecated: this field is not populated and is preserved only for backwards compatibility", "type": "array", "items": { "default": {}, - "$ref": "#/definitions/v1beta1.PipelineResourceResult" + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.result.RunResult" }, "x-kubernetes-list-type": "atomic" }, @@ -3008,6 +2941,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the build is actually started.", "$ref": "#/definitions/v1.Time" @@ -3064,6 +3005,10 @@ "description": "Description is a user-facing description of the task that may be used to populate a UI.", "type": "string" }, + "displayName": { + "description": "DisplayName is a user-facing name of the task that may be used to populate a UI.", + "type": "string" + }, "params": { "description": "Params is a list of input parameters required to run the task. Params must be supplied as inputs in TaskRuns unless they declare a default value.", "type": "array", @@ -3074,7 +3019,7 @@ "x-kubernetes-list-type": "atomic" }, "resources": { - "description": "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.", + "description": "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.\n\nDeprecated: Unused, preserved only for backwards compatibility", "$ref": "#/definitions/v1beta1.TaskResources" }, "results": { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_conversion.go index ee0e8bd7b1..19bbec3fde 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_conversion.go @@ -21,13 +21,9 @@ import ( "fmt" v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" - "github.com/tektoncd/pipeline/pkg/apis/version" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/pkg/apis" ) -const resourcesAnnotationKey = "tekton.dev/v1beta1Resources" - var _ apis.Convertible = (*Task)(nil) // ConvertTo implements apis.Convertible @@ -38,9 +34,6 @@ func (t *Task) ConvertTo(ctx context.Context, to apis.Convertible) error { switch sink := to.(type) { case *v1.Task: sink.ObjectMeta = t.ObjectMeta - if err := serializeResources(&sink.ObjectMeta, &t.Spec); err != nil { - return err - } return t.Spec.ConvertTo(ctx, &sink.Spec) default: return fmt.Errorf("unknown version, got: %T", sink) @@ -85,6 +78,7 @@ func (ts *TaskSpec) ConvertTo(ctx context.Context, sink *v1.TaskSpec) error { p.convertTo(ctx, &new) sink.Params = append(sink.Params, new) } + sink.DisplayName = ts.DisplayName sink.Description = ts.Description return nil } @@ -97,9 +91,6 @@ func (t *Task) ConvertFrom(ctx context.Context, from apis.Convertible) error { switch source := from.(type) { case *v1.Task: t.ObjectMeta = source.ObjectMeta - if err := deserializeResources(&t.ObjectMeta, &t.Spec); err != nil { - return err - } return t.Spec.ConvertFrom(ctx, &source.Spec) default: return fmt.Errorf("unknown version, got: %T", t) @@ -144,25 +135,7 @@ func (ts *TaskSpec) ConvertFrom(ctx context.Context, source *v1.TaskSpec) error new.convertFrom(ctx, p) ts.Params = append(ts.Params, new) } + ts.DisplayName = source.DisplayName ts.Description = source.Description return nil } - -func serializeResources(meta *metav1.ObjectMeta, spec *TaskSpec) error { - if spec.Resources == nil { - return nil - } - return version.SerializeToMetadata(meta, spec.Resources, resourcesAnnotationKey) -} - -func deserializeResources(meta *metav1.ObjectMeta, spec *TaskSpec) error { - resources := &TaskResources{} - err := version.DeserializeFromMetadata(meta, resources, resourcesAnnotationKey) - if err != nil { - return err - } - if resources.Inputs != nil || resources.Outputs != nil { - spec.Resources = resources - } - return nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_types.go index 957b0aef69..850929d015 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_types.go @@ -24,17 +24,6 @@ import ( "knative.dev/pkg/kmeta" ) -const ( - // TaskRunResultType default task run result value - TaskRunResultType ResultType = 1 - // PipelineResourceResultType default pipeline result value - PipelineResourceResultType = 2 - // InternalTektonResultType default internal tekton result value - InternalTektonResultType = 3 - // UnknownResultType default unknown result type value - UnknownResultType = 10 -) - // +genclient // +genclient:noStatus // +genreconciler:krshapedlogic=false @@ -83,6 +72,8 @@ type TaskSpec struct { // Resources is a list input and output resource to run the task // Resources are represented in TaskRuns as bindings to instances of // PipelineResources. + // + // Deprecated: Unused, preserved only for backwards compatibility // +optional Resources *TaskResources `json:"resources,omitempty"` @@ -91,7 +82,12 @@ type TaskSpec struct { // value. // +optional // +listType=atomic - Params []ParamSpec `json:"params,omitempty"` + Params ParamSpecs `json:"params,omitempty"` + + // DisplayName is a user-facing name of the task that may be + // used to populate a UI. + // +optional + DisplayName string `json:"displayName,omitempty"` // Description is a user-facing description of the task that may be // used to populate a UI. diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_validation.go index a64d5bdb81..e76f342121 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/task_validation.go @@ -25,6 +25,7 @@ import ( "time" "github.com/tektoncd/pipeline/pkg/apis/config" + "github.com/tektoncd/pipeline/pkg/apis/pipeline" "github.com/tektoncd/pipeline/pkg/apis/validate" "github.com/tektoncd/pipeline/pkg/apis/version" "github.com/tektoncd/pipeline/pkg/substitution" @@ -92,12 +93,27 @@ func (ts *TaskSpec) Validate(ctx context.Context) (errs *apis.FieldError) { } errs = errs.Also(validateSteps(ctx, mergedSteps).ViaField("steps")) - errs = errs.Also(ts.Resources.Validate(ctx).ViaField("resources")) + errs = errs.Also(validateSidecarNames(ts.Sidecars)) errs = errs.Also(ValidateParameterTypes(ctx, ts.Params).ViaField("params")) errs = errs.Also(ValidateParameterVariables(ctx, ts.Steps, ts.Params)) - errs = errs.Also(ValidateResourcesVariables(ctx, ts.Steps, ts.Resources)) errs = errs.Also(validateTaskContextVariables(ctx, ts.Steps)) + errs = errs.Also(validateTaskResultsVariables(ctx, ts.Steps, ts.Results)) errs = errs.Also(validateResults(ctx, ts.Results).ViaField("results")) + if ts.Resources != nil { + errs = errs.Also(apis.ErrDisallowedFields("resources")) + } + return errs +} + +func validateSidecarNames(sidecars []Sidecar) (errs *apis.FieldError) { + for _, sc := range sidecars { + if sc.Name == pipeline.ReservedResultsSidecarName { + errs = errs.Also(&apis.FieldError{ + Message: fmt.Sprintf("Invalid: cannot use reserved sidecar name %v ", sc.Name), + Paths: []string{"sidecars"}, + }) + } + } return errs } @@ -212,7 +228,7 @@ func validateStep(ctx context.Context, s Step, names sets.String) (errs *apis.Fi if s.Script != "" { if len(s.Command) > 0 { errs = errs.Also(&apis.FieldError{ - Message: fmt.Sprintf("script cannot be used with command"), + Message: "script cannot be used with command", Paths: []string{"script"}, }) } @@ -282,9 +298,9 @@ func validateStep(ctx context.Context, s Step, names sets.String) (errs *apis.Fi func ValidateParameterTypes(ctx context.Context, params []ParamSpec) (errs *apis.FieldError) { for _, p := range params { if p.Type == ParamTypeObject { - // Object type parameter is an alpha feature and will fail validation if it's used in a task spec - // when the enable-api-fields feature gate is not "alpha". - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.AlphaAPIFields)) + // Object type parameter is a beta feature and will fail validation if it's used in a task spec + // when the enable-api-fields feature gate is not "alpha" or "beta". + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.BetaAPIFields)) } errs = errs.Also(p.ValidateType(ctx)) } @@ -327,7 +343,7 @@ func (p ParamSpec) ValidateObjectType(ctx context.Context) *apis.FieldError { if p.Type == ParamTypeObject && p.Properties == nil { // If this we are not skipping validation checks due to propagated params // then properties field is required. - if config.ValidateParameterVariablesAndWorkspaces(ctx) == true { + if config.ValidateParameterVariablesAndWorkspaces(ctx) { return apis.ErrMissingField(fmt.Sprintf("%s.properties", p.Name)) } } @@ -368,12 +384,14 @@ func ValidateParameterVariables(ctx context.Context, steps []Step, params []Para arrayParameterNames.Insert(p.Name) case ParamTypeObject: objectParamSpecs = append(objectParamSpecs, p) + case ParamTypeString: + fallthrough default: stringParameterNames.Insert(p.Name) } } errs = errs.Also(validateNameFormat(stringParameterNames.Insert(arrayParameterNames.List()...), objectParamSpecs)) - if config.ValidateParameterVariablesAndWorkspaces(ctx) == true { + if config.ValidateParameterVariablesAndWorkspaces(ctx) { errs = errs.Also(validateVariables(ctx, steps, "params", allParameterNames)) errs = errs.Also(validateObjectUsage(ctx, steps, objectParamSpecs)) } @@ -394,23 +412,16 @@ func validateTaskContextVariables(ctx context.Context, steps []Step) *apis.Field return errs.Also(validateVariables(ctx, steps, "context\\.task", taskContextNames)) } -// ValidateResourcesVariables validates all variables within a TaskResources against a slice of Steps -func ValidateResourcesVariables(ctx context.Context, steps []Step, resources *TaskResources) *apis.FieldError { - if resources == nil { - return nil - } - resourceNames := sets.NewString() - if resources.Inputs != nil { - for _, r := range resources.Inputs { - resourceNames.Insert(r.Name) - } +// validateTaskResultsVariables validates if the results referenced in step script are defined in task results +func validateTaskResultsVariables(ctx context.Context, steps []Step, results []TaskResult) (errs *apis.FieldError) { + resultsNames := sets.NewString() + for _, r := range results { + resultsNames.Insert(r.Name) } - if resources.Outputs != nil { - for _, r := range resources.Outputs { - resourceNames.Insert(r.Name) - } + for idx, step := range steps { + errs = errs.Also(validateTaskVariable(step.Script, "results", resultsNames).ViaField("script").ViaFieldIndex("steps", idx)) } - return validateVariables(ctx, steps, "resources.(?:inputs|outputs)", resourceNames) + return errs } // validateObjectUsage validates the usage of individual attributes of an object param and the usage of the entire object @@ -452,7 +463,6 @@ func validateStepObjectUsageAsWhole(step Step, prefix string, vars sets.String) } for i, arg := range step.Args { errs = errs.Also(validateTaskNoObjectReferenced(arg, prefix, vars).ViaFieldIndex("args", i)) - } for _, env := range step.Env { errs = errs.Also(validateTaskNoObjectReferenced(env.Value, prefix, vars).ViaFieldKey("env", env.Name)) @@ -482,7 +492,6 @@ func validateStepArrayUsage(step Step, prefix string, vars sets.String) *apis.Fi } for i, arg := range step.Args { errs = errs.Also(validateTaskArraysIsolated(arg, prefix, vars).ViaFieldIndex("args", i)) - } for _, env := range step.Env { errs = errs.Also(validateTaskNoArrayReferenced(env.Value, prefix, vars).ViaFieldKey("env", env.Name)) @@ -596,3 +605,39 @@ func validateTaskArraysIsolated(value, prefix string, arrayNames sets.String) *a func isParamRefs(s string) bool { return strings.HasPrefix(s, "$("+ParamsPrefix) } + +// ValidateParamArrayIndex validates if the param reference to an array param is out of bound. +// error is returned when the array indexing reference is out of bound of the array param +// e.g. if a param reference of $(params.array-param[2]) and the array param is of length 2. +// - `trParams` are params from taskrun. +// - `taskSpec` contains params declarations. +func (ts *TaskSpec) ValidateParamArrayIndex(ctx context.Context, params Params) error { + cfg := config.FromContextOrDefaults(ctx) + if cfg.FeatureFlags.EnableAPIFields != config.AlphaAPIFields { + return nil + } + + // Collect all array params lengths + arrayParamsLengths := ts.Params.extractParamArrayLengths() + for k, v := range params.extractParamArrayLengths() { + arrayParamsLengths[k] = v + } + + // collect all the possible places to use param references + paramsRefs := []string{} + paramsRefs = append(paramsRefs, extractParamRefsFromSteps(ts.Steps)...) + paramsRefs = append(paramsRefs, extractParamRefsFromStepTemplate(ts.StepTemplate)...) + paramsRefs = append(paramsRefs, extractParamRefsFromVolumes(ts.Volumes)...) + for _, v := range ts.Workspaces { + paramsRefs = append(paramsRefs, v.MountPath) + } + paramsRefs = append(paramsRefs, extractParamRefsFromSidecars(ts.Sidecars)...) + + // extract all array indexing references, for example []{"$(params.array-params[1])"} + arrayIndexParamRefs := []string{} + for _, p := range paramsRefs { + arrayIndexParamRefs = append(arrayIndexParamRefs, extractArrayIndexingParamRefs(p)...) + } + + return validateOutofBoundArrayParams(arrayIndexParamRefs, arrayParamsLengths) +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_conversion.go index 2816dc2437..e8e695194b 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_conversion.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( @@ -34,7 +50,7 @@ func (tr TaskRef) convertBundleToResolver(sink *v1.TaskRef) { if tr.Bundle != "" { sink.ResolverRef = v1.ResolverRef{ Resolver: "bundles", - Params: []v1.Param{{ + Params: v1.Params{{ Name: "bundle", Value: v1.ParamValue{StringVal: tr.Bundle, Type: v1.ParamTypeString}, }, { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_types.go index 49f9ff66ea..f8f231cd96 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_types.go @@ -20,12 +20,17 @@ package v1beta1 type TaskRef struct { // Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names Name string `json:"name,omitempty"` - // TaskKind indicates the kind of the task, namespaced or cluster scoped. + // TaskKind indicates the Kind of the Task: + // 1. Namespaced Task when Kind is set to "Task". If Kind is "", it defaults to "Task". + // 2. Cluster-Scoped Task when Kind is set to "ClusterTask" + // 3. Custom Task when Kind is non-empty and APIVersion is non-empty Kind TaskKind `json:"kind,omitempty"` // API version of the referent + // Note: A Task with non-empty APIVersion and Kind is considered a Custom Task // +optional APIVersion string `json:"apiVersion,omitempty"` // Bundle url reference to a Tekton Bundle. + // // Deprecated: Please use ResolverRef with the bundles resolver instead. // +optional Bundle string `json:"bundle,omitempty"` @@ -48,3 +53,10 @@ const ( // ClusterTaskKind indicates that task type has a cluster scope. ClusterTaskKind TaskKind = "ClusterTask" ) + +// IsCustomTask checks whether the reference is to a Custom Task +func (tr *TaskRef) IsCustomTask() bool { + // Note that if `apiVersion` is set to `"tekton.dev/v1beta1"` and `kind` is set to `"Task"`, + // the reference will be considered a Custom Task - https://github.com/tektoncd/pipeline/issues/6457 + return tr != nil && tr.APIVersion != "" && tr.Kind != "" +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_validation.go index 971a78498b..0297139922 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskref_validation.go @@ -62,5 +62,5 @@ func (ref *TaskRef) Validate(ctx context.Context) (errs *apis.FieldError) { } } } - return + return //nolint:nakedret } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_conversion.go index d6d5cd09a4..b2745ec5c7 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_conversion.go @@ -26,6 +26,11 @@ import ( "knative.dev/pkg/apis" ) +const ( + cloudEventsAnnotationKey = "tekton.dev/v1beta1CloudEvents" + resourcesResultAnnotationKey = "tekton.dev/v1beta1ResourcesResult" +) + var _ apis.Convertible = (*TaskRun)(nil) // ConvertTo implements apis.Convertible @@ -36,7 +41,10 @@ func (tr *TaskRun) ConvertTo(ctx context.Context, to apis.Convertible) error { switch sink := to.(type) { case *v1.TaskRun: sink.ObjectMeta = tr.ObjectMeta - if err := serializeTaskRunResources(&sink.ObjectMeta, &tr.Spec); err != nil { + if err := serializeTaskRunCloudEvents(&sink.ObjectMeta, &tr.Status); err != nil { + return err + } + if err := tr.Status.ConvertTo(ctx, &sink.Status); err != nil { return err } return tr.Spec.ConvertTo(ctx, &sink.Spec) @@ -71,6 +79,7 @@ func (trs *TaskRunSpec) ConvertTo(ctx context.Context, sink *v1.TaskRunSpec) err } sink.Status = v1.TaskRunSpecStatus(trs.Status) sink.StatusMessage = v1.TaskRunSpecStatusMessage(trs.StatusMessage) + sink.Retries = trs.Retries sink.Timeout = trs.Timeout sink.PodTemplate = trs.PodTemplate sink.Workspaces = nil @@ -103,7 +112,10 @@ func (tr *TaskRun) ConvertFrom(ctx context.Context, from apis.Convertible) error switch source := from.(type) { case *v1.TaskRun: tr.ObjectMeta = source.ObjectMeta - if err := deserializeTaskRunResources(&tr.ObjectMeta, &tr.Spec); err != nil { + if err := deserializeTaskRunCloudEvents(&tr.ObjectMeta, &tr.Status); err != nil { + return err + } + if err := tr.Status.ConvertFrom(ctx, source.Status); err != nil { return err } return tr.Spec.ConvertFrom(ctx, &source.Spec) @@ -141,6 +153,7 @@ func (trs *TaskRunSpec) ConvertFrom(ctx context.Context, source *v1.TaskRunSpec) } trs.Status = TaskRunSpecStatus(source.Status) trs.StatusMessage = TaskRunSpecStatusMessage(source.StatusMessage) + trs.Retries = source.Retries trs.Timeout = source.Timeout trs.PodTemplate = source.PodTemplate trs.Workspaces = nil @@ -193,21 +206,163 @@ func (trso *TaskRunSidecarOverride) convertFrom(ctx context.Context, source v1.T trso.Resources = source.ComputeResources } -func serializeTaskRunResources(meta *metav1.ObjectMeta, spec *TaskRunSpec) error { - if spec.Resources == nil { +// ConvertTo implements apis.Convertible +func (trs *TaskRunStatus) ConvertTo(ctx context.Context, sink *v1.TaskRunStatus) error { + sink.Status = trs.Status + sink.PodName = trs.PodName + sink.StartTime = trs.StartTime + sink.CompletionTime = trs.CompletionTime + sink.Steps = nil + for _, ss := range trs.Steps { + new := v1.StepState{} + ss.convertTo(ctx, &new) + sink.Steps = append(sink.Steps, new) + } + sink.RetriesStatus = nil + for _, rr := range trs.RetriesStatus { + new := v1.TaskRunStatus{} + err := rr.ConvertTo(ctx, &new) + if err != nil { + return err + } + sink.RetriesStatus = append(sink.RetriesStatus, new) + } + sink.Results = nil + for _, trr := range trs.TaskRunResults { + new := v1.TaskRunResult{} + trr.convertTo(ctx, &new) + sink.Results = append(sink.Results, new) + } + sink.Sidecars = nil + for _, sc := range trs.Sidecars { + new := v1.SidecarState{} + sc.convertTo(ctx, &new) + sink.Sidecars = append(sink.Sidecars, new) + } + + if trs.TaskSpec != nil { + sink.TaskSpec = &v1.TaskSpec{} + err := trs.TaskSpec.ConvertTo(ctx, sink.TaskSpec) + if err != nil { + return err + } + } + if trs.Provenance != nil { + new := v1.Provenance{} + trs.Provenance.convertTo(ctx, &new) + sink.Provenance = &new + } + return nil +} + +// ConvertFrom implements apis.Convertible +func (trs *TaskRunStatus) ConvertFrom(ctx context.Context, source v1.TaskRunStatus) error { + trs.Status = source.Status + trs.PodName = source.PodName + trs.StartTime = source.StartTime + trs.CompletionTime = source.CompletionTime + trs.Steps = nil + for _, ss := range source.Steps { + new := StepState{} + new.convertFrom(ctx, ss) + trs.Steps = append(trs.Steps, new) + } + trs.RetriesStatus = nil + for _, rr := range source.RetriesStatus { + new := TaskRunStatus{} + err := new.ConvertFrom(ctx, rr) + if err != nil { + return err + } + trs.RetriesStatus = append(trs.RetriesStatus, new) + } + trs.TaskRunResults = nil + for _, trr := range source.Results { + new := TaskRunResult{} + new.convertFrom(ctx, trr) + trs.TaskRunResults = append(trs.TaskRunResults, new) + } + trs.Sidecars = nil + for _, sc := range source.Sidecars { + new := SidecarState{} + new.convertFrom(ctx, sc) + trs.Sidecars = append(trs.Sidecars, new) + } + + if source.TaskSpec != nil { + trs.TaskSpec = &TaskSpec{} + err := trs.TaskSpec.ConvertFrom(ctx, source.TaskSpec) + if err != nil { + return err + } + } + if source.Provenance != nil { + new := Provenance{} + new.convertFrom(ctx, *source.Provenance) + trs.Provenance = &new + } + return nil +} + +func (ss StepState) convertTo(ctx context.Context, sink *v1.StepState) { + sink.ContainerState = ss.ContainerState + sink.Name = ss.Name + sink.Container = ss.ContainerName + sink.ImageID = ss.ImageID +} + +func (ss *StepState) convertFrom(ctx context.Context, source v1.StepState) { + ss.ContainerState = source.ContainerState + ss.Name = source.Name + ss.ContainerName = source.Container + ss.ImageID = source.ImageID +} + +func (trr TaskRunResult) convertTo(ctx context.Context, sink *v1.TaskRunResult) { + sink.Name = trr.Name + sink.Type = v1.ResultsType(trr.Type) + newValue := v1.ParamValue{} + trr.Value.convertTo(ctx, &newValue) + sink.Value = newValue +} + +func (trr *TaskRunResult) convertFrom(ctx context.Context, source v1.TaskRunResult) { + trr.Name = source.Name + trr.Type = ResultsType(source.Type) + newValue := ParamValue{} + newValue.convertFrom(ctx, source.Value) + trr.Value = newValue +} + +func (ss SidecarState) convertTo(ctx context.Context, sink *v1.SidecarState) { + sink.ContainerState = ss.ContainerState + sink.Name = ss.Name + sink.Container = ss.ContainerName + sink.ImageID = ss.ImageID +} + +func (ss *SidecarState) convertFrom(ctx context.Context, source v1.SidecarState) { + ss.ContainerState = source.ContainerState + ss.Name = source.Name + ss.ContainerName = source.Container + ss.ImageID = source.ImageID +} + +func serializeTaskRunCloudEvents(meta *metav1.ObjectMeta, status *TaskRunStatus) error { + if status.CloudEvents == nil { return nil } - return version.SerializeToMetadata(meta, spec.Resources, resourcesAnnotationKey) + return version.SerializeToMetadata(meta, status.CloudEvents, cloudEventsAnnotationKey) } -func deserializeTaskRunResources(meta *metav1.ObjectMeta, spec *TaskRunSpec) error { - resources := &TaskRunResources{} - err := version.DeserializeFromMetadata(meta, resources, resourcesAnnotationKey) +func deserializeTaskRunCloudEvents(meta *metav1.ObjectMeta, status *TaskRunStatus) error { + cloudEvents := []CloudEventDelivery{} + err := version.DeserializeFromMetadata(meta, &cloudEvents, cloudEventsAnnotationKey) if err != nil { return err } - if resources.Inputs != nil || resources.Outputs != nil { - spec.Resources = resources + if len(cloudEvents) != 0 { + status.CloudEvents = cloudEvents } return nil } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_defaults.go index feecece526..61f3285dec 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_defaults.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_defaults.go @@ -50,8 +50,13 @@ func (tr *TaskRun) SetDefaults(ctx context.Context) { // SetDefaults implements apis.Defaultable func (trs *TaskRunSpec) SetDefaults(ctx context.Context) { cfg := config.FromContextOrDefaults(ctx) - if trs.TaskRef != nil && trs.TaskRef.Kind == "" { - trs.TaskRef.Kind = NamespacedTaskKind + if trs.TaskRef != nil { + if trs.TaskRef.Kind == "" { + trs.TaskRef.Kind = NamespacedTaskKind + } + if trs.TaskRef.Name == "" && trs.TaskRef.Resolver == "" { + trs.TaskRef.Resolver = ResolverName(cfg.Defaults.DefaultResolverType) + } } if trs.Timeout == nil { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_types.go index 76b3dee647..27bb514322 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_types.go @@ -31,7 +31,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/utils/clock" "knative.dev/pkg/apis" - duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1" + duckv1 "knative.dev/pkg/apis/duck/v1" ) // TaskRunSpec defines the desired state of TaskRun @@ -40,7 +40,8 @@ type TaskRunSpec struct { Debug *TaskRunDebug `json:"debug,omitempty"` // +optional // +listType=atomic - Params []Param `json:"params,omitempty"` + Params Params `json:"params,omitempty"` + // Deprecated: Unused, preserved only for backwards compatibility // +optional Resources *TaskRunResources `json:"resources,omitempty"` // +optional @@ -50,13 +51,16 @@ type TaskRunSpec struct { TaskRef *TaskRef `json:"taskRef,omitempty"` // +optional TaskSpec *TaskSpec `json:"taskSpec,omitempty"` - // Used for cancelling a taskrun (and maybe more later on) + // Used for cancelling a TaskRun (and maybe more later on) // +optional Status TaskRunSpecStatus `json:"status,omitempty"` // Status message for cancellation. // +optional StatusMessage TaskRunSpecStatusMessage `json:"statusMessage,omitempty"` - // Time after which the build times out. Defaults to 1 hour. + // Retries represents how many times this TaskRun should be retried in the event of Task failure. + // +optional + Retries int `json:"retries,omitempty"` + // Time after which one retry attempt times out. Defaults to 1 hour. // Specified build timeout should be less than 24h. // Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration // +optional @@ -85,7 +89,7 @@ type TaskRunSpec struct { ComputeResources *corev1.ResourceRequirements `json:"computeResources,omitempty"` } -// TaskRunSpecStatus defines the taskrun spec status the user can provide +// TaskRunSpecStatus defines the TaskRun spec status the user can provide type TaskRunSpecStatus string const ( @@ -112,34 +116,17 @@ type TaskRunDebug struct { Breakpoint []string `json:"breakpoint,omitempty"` } -// TaskRunInputs holds the input values that this task was invoked with. -type TaskRunInputs struct { - // +optional - // +listType=atomic - Resources []TaskResourceBinding `json:"resources,omitempty"` - // +optional - // +listType=atomic - Params []Param `json:"params,omitempty"` -} - -// TaskRunOutputs holds the output values that this task was invoked with. -type TaskRunOutputs struct { - // +optional - // +listType=atomic - Resources []TaskResourceBinding `json:"resources,omitempty"` -} - var taskRunCondSet = apis.NewBatchConditionSet() // TaskRunStatus defines the observed state of TaskRun type TaskRunStatus struct { - duckv1beta1.Status `json:",inline"` + duckv1.Status `json:",inline"` // TaskRunStatusFields inlines the status fields. TaskRunStatusFields `json:",inline"` } -// TaskRunConditionType is an enum used to store TaskRun custom conditions +// TaskRunConditionType is an enum used to store TaskRun custom // conditions such as one used in spire results verification type TaskRunConditionType string @@ -166,9 +153,11 @@ const ( TaskRunReasonSuccessful TaskRunReason = "Succeeded" // TaskRunReasonFailed is the reason set when the TaskRun completed with a failure TaskRunReasonFailed TaskRunReason = "Failed" - // TaskRunReasonCancelled is the reason set when the Taskrun is cancelled by the user + // TaskRunReasonToBeRetried is the reason set when the last TaskRun execution failed, and will be retried + TaskRunReasonToBeRetried TaskRunReason = "ToBeRetried" + // TaskRunReasonCancelled is the reason set when the TaskRun is cancelled by the user TaskRunReasonCancelled TaskRunReason = "TaskRunCancelled" - // TaskRunReasonTimedOut is the reason set when the Taskrun has timed out + // TaskRunReasonTimedOut is the reason set when one TaskRun execution has timed out TaskRunReasonTimedOut TaskRunReason = "TaskRunTimeout" // TaskRunReasonResolvingTaskRef indicates that the TaskRun is waiting for // its taskRef to be asynchronously resolved. @@ -181,6 +170,10 @@ const ( TaskRunReasonsResultsVerificationFailed TaskRunReason = "TaskRunResultsVerificationFailed" // AwaitingTaskRunResults is the reason set when waiting upon `TaskRun` results and signatures to verify AwaitingTaskRunResults TaskRunReason = "AwaitingTaskRunResults" + // TaskRunReasonResultLargerThanAllowedLimit is the reason set when one of the results exceeds its maximum allowed limit of 1 KB + TaskRunReasonResultLargerThanAllowedLimit TaskRunReason = "TaskRunResultLargerThanAllowedLimit" + // TaskRunReasonStopSidecarFailed indicates that the sidecar is not properly stopped. + TaskRunReasonStopSidecarFailed = "TaskRunStopSidecarFailed" ) func (t TaskRunReason) String() string { @@ -232,11 +225,9 @@ type TaskRunStatusFields struct { PodName string `json:"podName"` // StartTime is the time the build is actually started. - // +optional StartTime *metav1.Time `json:"startTime,omitempty"` // CompletionTime is the time the build completed. - // +optional CompletionTime *metav1.Time `json:"completionTime,omitempty"` // Steps describes the state of each build step container. @@ -246,6 +237,9 @@ type TaskRunStatusFields struct { // CloudEvents describe the state of each cloud event requested via a // CloudEventResource. + // + // Deprecated: Removed in v0.44.0. + // // +optional // +listType=atomic CloudEvents []CloudEventDelivery `json:"cloudEvents,omitempty"` @@ -256,8 +250,9 @@ type TaskRunStatusFields struct { // +listType=atomic RetriesStatus []TaskRunStatus `json:"retriesStatus,omitempty"` - // Results from Resources built during the taskRun. currently includes - // the digest of build container images + // Results from Resources built during the TaskRun. + // This is tomb-stoned along with the removal of pipelineResources + // Deprecated: this field is not populated and is preserved only for backwards compatibility // +optional // +listType=atomic ResourcesResult []PipelineResourceResult `json:"resourcesResult,omitempty"` @@ -276,7 +271,11 @@ type TaskRunStatusFields struct { TaskSpec *TaskSpec `json:"taskSpec,omitempty"` // Provenance contains some key authenticated metadata about how a software artifact was built (what sources, what inputs/outputs, etc.). + // +optional Provenance *Provenance `json:"provenance,omitempty"` + + // SpanContext contains tracing span context fields + SpanContext map[string]string `json:"spanContext,omitempty"` } // TaskRunStepOverride is used to override the values of a Step in the corresponding Task. @@ -417,7 +416,7 @@ type TaskRunList struct { Items []TaskRun `json:"items"` } -// GetPipelineRunPVCName for taskrun gets pipelinerun +// GetPipelineRunPVCName for TaskRun gets pipelinerun func (tr *TaskRun) GetPipelineRunPVCName() string { if tr == nil { return "" @@ -446,7 +445,7 @@ func (tr *TaskRun) IsDone() bool { return !tr.Status.GetCondition(apis.ConditionSucceeded).IsUnknown() } -// HasStarted function check whether taskrun has valid start time set in its status +// HasStarted function check whether TaskRun has valid start time set in its status func (tr *TaskRun) HasStarted() bool { return tr.Status.StartTime != nil && !tr.Status.StartTime.IsZero() } @@ -471,6 +470,11 @@ func (tr *TaskRun) IsTaskRunResultDone() bool { return !tr.Status.GetCondition(apis.ConditionType(TaskRunConditionResultsVerified.String())).IsUnknown() } +// IsRetriable returns true if the TaskRun's Retries is not exhausted. +func (tr *TaskRun) IsRetriable() bool { + return len(tr.Status.RetriesStatus) < tr.Spec.Retries +} + // HasTimedOut returns true if the TaskRun runtime is beyond the allowed timeout func (tr *TaskRun) HasTimedOut(ctx context.Context, c clock.PassiveClock) bool { if tr.Status.StartTime.IsZero() { @@ -490,7 +494,7 @@ func (tr *TaskRun) GetTimeout(ctx context.Context) time.Duration { // Use the platform default is no timeout is set if tr.Spec.Timeout == nil { defaultTimeout := time.Duration(config.FromContextOrDefaults(ctx).Defaults.DefaultTimeoutMinutes) - return defaultTimeout * time.Minute + return defaultTimeout * time.Minute //nolint:durationcheck } return tr.Spec.Timeout.Duration } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_validation.go index 94b639c4cb..ef414612b4 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_validation.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/taskrun_validation.go @@ -22,11 +22,13 @@ import ( "strings" "github.com/tektoncd/pipeline/pkg/apis/config" + pod "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" "github.com/tektoncd/pipeline/pkg/apis/validate" "github.com/tektoncd/pipeline/pkg/apis/version" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/utils/strings/slices" "knative.dev/pkg/apis" "knative.dev/pkg/webhook/resourcesemantics" ) @@ -70,7 +72,6 @@ func (ts *TaskRunSpec) Validate(ctx context.Context) (errs *apis.FieldError) { // Validate propagated parameters errs = errs.Also(ts.validateInlineParameters(ctx)) errs = errs.Also(ValidateWorkspaceBindings(ctx, ts.Workspaces).ViaField("workspaces")) - errs = errs.Also(ts.Resources.Validate(ctx).ViaField("resources")) if ts.Debug != nil { errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "debug", config.AlphaAPIFields).ViaField("debug")) errs = errs.Also(validateDebug(ts.Debug).ViaField("debug")) @@ -105,7 +106,12 @@ func (ts *TaskRunSpec) Validate(ctx context.Context) (errs *apis.FieldError) { errs = errs.Also(apis.ErrInvalidValue(fmt.Sprintf("%s should be >= 0", ts.Timeout.Duration.String()), "timeout")) } } - + if ts.PodTemplate != nil { + errs = errs.Also(validatePodTemplateEnv(ctx, *ts.PodTemplate)) + } + if ts.Resources != nil { + errs = errs.Also(apis.ErrDisallowedFields("resources")) + } return errs } @@ -142,6 +148,19 @@ func (ts *TaskRunSpec) validateInlineParameters(ctx context.Context) (errs *apis return errs } +func validatePodTemplateEnv(ctx context.Context, podTemplate pod.Template) (errs *apis.FieldError) { + forbiddenEnvsConfigured := config.FromContextOrDefaults(ctx).Defaults.DefaultForbiddenEnv + if len(forbiddenEnvsConfigured) == 0 { + return errs + } + for _, pEnv := range podTemplate.Env { + if slices.Contains(forbiddenEnvsConfigured, pEnv.Name) { + errs = errs.Also(apis.ErrInvalidValue("PodTemplate cannot update a forbidden env: "+pEnv.Name, "PodTemplate.Env")) + } + } + return errs +} + func createParamSpecFromParam(p Param, paramSpecForValidation map[string]ParamSpec) map[string]ParamSpec { value := p.Value pSpec := ParamSpec{ @@ -221,13 +240,13 @@ func ValidateWorkspaceBindings(ctx context.Context, wb []WorkspaceBinding) (errs } // ValidateParameters makes sure the params for the Task are valid. -func ValidateParameters(ctx context.Context, params []Param) (errs *apis.FieldError) { +func ValidateParameters(ctx context.Context, params Params) (errs *apis.FieldError) { var names []string for _, p := range params { if p.Value.Type == ParamTypeObject { - // Object type parameter is an alpha feature and will fail validation if it's used in a taskrun spec - // when the enable-api-fields feature gate is not "alpha". - errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.AlphaAPIFields)) + // Object type parameter is a beta feature and will fail validation if it's used in a taskrun spec + // when the enable-api-fields feature gate is not "alpha" or "beta". + errs = errs.Also(version.ValidateEnabledAPIFields(ctx, "object type parameter", config.BetaAPIFields)) } names = append(names, p.Name) } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_conversion.go index 727e8e6f3a..f7daa5cfb4 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_conversion.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 The Tekton 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 v1beta1 import ( diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_types.go index f915fe13df..194821afce 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/workspace_types.go @@ -87,6 +87,7 @@ type WorkspaceBinding struct { // WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun // is expected to populate with a workspace binding. +// // Deprecated: use PipelineWorkspaceDeclaration type instead type WorkspacePipelineDeclaration = PipelineWorkspaceDeclaration diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/zz_generated.deepcopy.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/zz_generated.deepcopy.go index 2706537bef..fdd0282578 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/zz_generated.deepcopy.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1/zz_generated.deepcopy.go @@ -22,9 +22,11 @@ limitations under the License. package v1beta1 import ( + config "github.com/tektoncd/pipeline/pkg/apis/config" pod "github.com/tektoncd/pipeline/pkg/apis/pipeline/pod" v1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - runv1alpha1 "github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1" + runv1beta1 "github.com/tektoncd/pipeline/pkg/apis/run/v1beta1" + result "github.com/tektoncd/pipeline/pkg/result" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" @@ -151,6 +153,56 @@ func (in *ClusterTaskList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in Combination) DeepCopyInto(out *Combination) { + { + in := &in + *out = make(Combination, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Combination. +func (in Combination) DeepCopy() Combination { + if in == nil { + return nil + } + out := new(Combination) + in.DeepCopyInto(out) + return *out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in Combinations) DeepCopyInto(out *Combinations) { + { + in := &in + *out = make(Combinations, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = make(Combination, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Combinations. +func (in Combinations) DeepCopy() Combinations { + if in == nil { + return nil + } + out := new(Combinations) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ConfigSource) DeepCopyInto(out *ConfigSource) { *out = *in @@ -250,7 +302,7 @@ func (in *CustomRunSpec) DeepCopyInto(out *CustomRunSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -319,6 +371,51 @@ func (in *EmbeddedTask) DeepCopy() *EmbeddedTask { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IncludeParams) DeepCopyInto(out *IncludeParams) { + *out = *in + if in.Params != nil { + in, out := &in.Params, &out.Params + *out = make(Params, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IncludeParams. +func (in *IncludeParams) DeepCopy() *IncludeParams { + if in == nil { + return nil + } + out := new(IncludeParams) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in IncludeParamsList) DeepCopyInto(out *IncludeParamsList) { + { + in := &in + *out = make(IncludeParamsList, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IncludeParamsList. +func (in IncludeParamsList) DeepCopy() IncludeParamsList { + if in == nil { + return nil + } + out := new(IncludeParamsList) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *InternalTaskModifier) DeepCopyInto(out *InternalTaskModifier) { *out = *in @@ -361,7 +458,14 @@ func (in *Matrix) DeepCopyInto(out *Matrix) { *out = *in if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Include != nil { + in, out := &in.Include, &out.Include + *out = make(IncludeParamsList, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -424,6 +528,28 @@ func (in *ParamSpec) DeepCopy() *ParamSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in ParamSpecs) DeepCopyInto(out *ParamSpecs) { + { + in := &in + *out = make(ParamSpecs, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParamSpecs. +func (in ParamSpecs) DeepCopy() ParamSpecs { + if in == nil { + return nil + } + out := new(ParamSpecs) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ParamValue) DeepCopyInto(out *ParamValue) { *out = *in @@ -452,6 +578,28 @@ func (in *ParamValue) DeepCopy() *ParamValue { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in Params) DeepCopyInto(out *Params) { + { + in := &in + *out = make(Params, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Params. +func (in Params) DeepCopy() Params { + if in == nil { + return nil + } + out := new(Params) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Pipeline) DeepCopyInto(out *Pipeline) { *out = *in @@ -587,22 +735,6 @@ func (in *PipelineResourceRef) DeepCopy() *PipelineResourceRef { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PipelineResourceResult) DeepCopyInto(out *PipelineResourceResult) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineResourceResult. -func (in *PipelineResourceResult) DeepCopy() *PipelineResourceResult { - if in == nil { - return nil - } - out := new(PipelineResourceResult) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PipelineResult) DeepCopyInto(out *PipelineResult) { *out = *in @@ -703,7 +835,7 @@ func (in *PipelineRunRunStatus) DeepCopyInto(out *PipelineRunRunStatus) { *out = *in if in.Status != nil { in, out := &in.Status, &out.Status - *out = new(runv1alpha1.RunStatus) + *out = new(runv1beta1.CustomRunStatus) (*in).DeepCopyInto(*out) } if in.WhenExpressions != nil { @@ -748,7 +880,7 @@ func (in *PipelineRunSpec) DeepCopyInto(out *PipelineRunSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -889,6 +1021,13 @@ func (in *PipelineRunStatusFields) DeepCopyInto(out *PipelineRunStatusFields) { *out = new(Provenance) (*in).DeepCopyInto(*out) } + if in.SpanContext != nil { + in, out := &in.SpanContext, &out.SpanContext + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return } @@ -947,7 +1086,7 @@ func (in *PipelineSpec) DeepCopyInto(out *PipelineSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]ParamSpec, len(*in)) + *out = make(ParamSpecs, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1016,7 +1155,7 @@ func (in *PipelineTask) DeepCopyInto(out *PipelineTask) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1283,6 +1422,16 @@ func (in *Provenance) DeepCopyInto(out *Provenance) { *out = new(ConfigSource) (*in).DeepCopyInto(*out) } + if in.RefSource != nil { + in, out := &in.RefSource, &out.RefSource + *out = new(RefSource) + (*in).DeepCopyInto(*out) + } + if in.FeatureFlags != nil { + in, out := &in.FeatureFlags, &out.FeatureFlags + *out = new(config.FeatureFlags) + **out = **in + } return } @@ -1296,12 +1445,35 @@ func (in *Provenance) DeepCopy() *Provenance { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RefSource) DeepCopyInto(out *RefSource) { + *out = *in + if in.Digest != nil { + in, out := &in.Digest, &out.Digest + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RefSource. +func (in *RefSource) DeepCopy() *RefSource { + if in == nil { + return nil + } + out := new(RefSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResolverRef) DeepCopyInto(out *ResolverRef) { *out = *in if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2056,7 +2228,7 @@ func (in *TaskRunSpec) DeepCopyInto(out *TaskRunSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]Param, len(*in)) + *out = make(Params, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2177,7 +2349,7 @@ func (in *TaskRunStatusFields) DeepCopyInto(out *TaskRunStatusFields) { } if in.ResourcesResult != nil { in, out := &in.ResourcesResult, &out.ResourcesResult - *out = make([]PipelineResourceResult, len(*in)) + *out = make([]result.RunResult, len(*in)) copy(*out, *in) } if in.TaskRunResults != nil { @@ -2204,6 +2376,13 @@ func (in *TaskRunStatusFields) DeepCopyInto(out *TaskRunStatusFields) { *out = new(Provenance) (*in).DeepCopyInto(*out) } + if in.SpanContext != nil { + in, out := &in.SpanContext, &out.SpanContext + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return } @@ -2244,7 +2423,7 @@ func (in *TaskSpec) DeepCopyInto(out *TaskSpec) { } if in.Params != nil { in, out := &in.Params, &out.Params - *out = make([]ParamSpec, len(*in)) + *out = make(ParamSpecs, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/doc.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/doc.go index b2c8398ab3..65c3fe6b91 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/doc.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/doc.go @@ -1,12 +1,9 @@ /* Copyright 2019 The Tekton 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. @@ -15,7 +12,6 @@ limitations under the License. */ // Package v1alpha1 contains API Schema definitions for the pipeline v1alpha1 API group -// +k8s:openapi-gen=true // +k8s:deepcopy-gen=package,register // +k8s:conversion-gen=github.com/tektoncd/pipeline/pkg/apis/resource // +k8s:defaulter-gen=TypeMeta diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipeline_resource_defaults.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipeline_resource_defaults.go deleted file mode 100644 index faf03c08c1..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipeline_resource_defaults.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2019 The Tekton 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 v1alpha1 - -import ( - "context" - - "knative.dev/pkg/apis" -) - -var _ apis.Defaultable = (*PipelineResource)(nil) - -// SetDefaults implements api.Defaultable -func (t *PipelineResource) SetDefaults(ctx context.Context) { - t.Spec.SetDefaults(ctx) -} - -// SetDefaults implements api.Defaultable -func (ts *PipelineResourceSpec) SetDefaults(ctx context.Context) { -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipeline_resource_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipeline_resource_types.go index 9d1f2ff6e3..6cde87cb8a 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipeline_resource_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipeline_resource_types.go @@ -1,12 +1,10 @@ /* +// Deprecated: Unused, preserved only for backwards compatibility Copyright 2019 The Tekton 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. @@ -14,6 +12,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// The contents of this package are deprecated and unused. Preserved for backwards compatibility. package v1alpha1 import ( @@ -23,42 +22,10 @@ import ( // PipelineResourceType represents the type of endpoint the pipelineResource is, so that the // controller will know this pipelineResource shouldx be fetched and optionally what // additional metatdata should be provided for it. +// +// Deprecated: Unused, preserved only for backwards compatibility type PipelineResourceType = string -var ( - // AllowedOutputResources are the resource types that can be used as outputs - AllowedOutputResources = map[PipelineResourceType]bool{ - PipelineResourceTypeStorage: true, - PipelineResourceTypeGit: true, - } -) - -const ( - // PipelineResourceTypeGit indicates that this source is a GitHub repo. - PipelineResourceTypeGit PipelineResourceType = "git" - - // PipelineResourceTypeStorage indicates that this source is a storage blob resource. - PipelineResourceTypeStorage PipelineResourceType = "storage" - - // PipelineResourceTypeImage indicates that this source is a docker Image. - PipelineResourceTypeImage PipelineResourceType = "image" - - // PipelineResourceTypeCluster indicates that this source is a k8s cluster Image. - PipelineResourceTypeCluster PipelineResourceType = "cluster" - - // PipelineResourceTypePullRequest indicates that this source is a SCM Pull Request. - PipelineResourceTypePullRequest PipelineResourceType = "pullRequest" - - // PipelineResourceTypeCloudEvent indicates that this source is a cloud event URI - PipelineResourceTypeCloudEvent PipelineResourceType = "cloudEvent" - - // PipelineResourceTypeGCS is the subtype for the GCSResources, which is backed by a GCS blob/directory. - PipelineResourceTypeGCS PipelineResourceType = "gcs" -) - -// AllResourceTypes can be used for validation to check if a provided Resource type is one of the known types. -var AllResourceTypes = []PipelineResourceType{PipelineResourceTypeGit, PipelineResourceTypeStorage, PipelineResourceTypeImage, PipelineResourceTypeCluster, PipelineResourceTypePullRequest, PipelineResourceTypeCloudEvent} - // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +genclient:noStatus @@ -66,6 +33,7 @@ var AllResourceTypes = []PipelineResourceType{PipelineResourceTypeGit, PipelineR // PipelineResource describes a resource that is an input to or output from a // Task. // +// Deprecated: Unused, preserved only for backwards compatibility // +k8s:openapi-gen=true type PipelineResource struct { metav1.TypeMeta `json:",inline"` @@ -75,20 +43,23 @@ type PipelineResource struct { // Spec holds the desired state of the PipelineResource from the client Spec PipelineResourceSpec `json:"spec,omitempty"` - // Status is deprecated. - // It usually is used to communicate the observed state of the PipelineResource from + // Status is used to communicate the observed state of the PipelineResource from // the controller, but was unused as there is no controller for PipelineResource. + // // +optional Status *PipelineResourceStatus `json:"status,omitempty"` } // PipelineResourceStatus does not contain anything because PipelineResources on their own // do not have a status -// Deprecated +// +// Deprecated: Unused, preserved only for backwards compatibility type PipelineResourceStatus struct { } -// PipelineResourceSpec defines an individual resources used in the pipeline. +// PipelineResourceSpec defines an individual resources used in the pipeline. +// +// Deprecated: Unused, preserved only for backwards compatibility type PipelineResourceSpec struct { // Description is a user-facing description of the resource that may be // used to populate a UI. @@ -104,6 +75,8 @@ type PipelineResourceSpec struct { } // SecretParam indicates which secret can be used to populate a field of the resource +// +// Deprecated: Unused, preserved only for backwards compatibility type SecretParam struct { FieldName string `json:"fieldName"` SecretKey string `json:"secretKey"` @@ -112,6 +85,8 @@ type SecretParam struct { // ResourceParam declares a string value to use for the parameter called Name, and is used in // the specific context of PipelineResources. +// +// Deprecated: Unused, preserved only for backwards compatibility type ResourceParam struct { Name string `json:"name"` Value string `json:"value"` @@ -122,6 +97,8 @@ type ResourceParam struct { // PipelineResources within the type's definition, and when provided as an Input, the Name will be the // path to the volume mounted containing this PipelineResource as an input (e.g. // an input Resource named `workspace` will be mounted at `/workspace`). +// +// Deprecated: Unused, preserved only for backwards compatibility type ResourceDeclaration struct { // Name declares the name by which a resource is referenced in the // definition. Resources may be referenced by name in the definition of a @@ -147,6 +124,8 @@ type ResourceDeclaration struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // PipelineResourceList contains a list of PipelineResources +// +// Deprecated: Unused, preserved only for backwards compatibility type PipelineResourceList struct { metav1.TypeMeta `json:",inline"` // +optional diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipelineresource_validation.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipelineresource_validation.go deleted file mode 100644 index 5feb1afe28..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/pipelineresource_validation.go +++ /dev/null @@ -1,157 +0,0 @@ -/* -Copyright 2019 The Tekton 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 v1alpha1 - -import ( - "context" - "fmt" - "net/url" - "strconv" - "strings" - - "github.com/tektoncd/pipeline/pkg/apis/validate" - "k8s.io/apimachinery/pkg/api/equality" - "knative.dev/pkg/apis" -) - -var _ apis.Validatable = (*PipelineResource)(nil) - -// Validate validates the PipelineResource's ObjectMeta and Spec -func (r *PipelineResource) Validate(ctx context.Context) *apis.FieldError { - if err := validate.ObjectMetadata(r.GetObjectMeta()); err != nil { - return err.ViaField("metadata") - } - if apis.IsInDelete(ctx) { - return nil - } - return r.Spec.Validate(ctx) -} - -// Validate validates the PipelineResourceSpec based on its type -func (rs *PipelineResourceSpec) Validate(ctx context.Context) *apis.FieldError { - if equality.Semantic.DeepEqual(rs, &PipelineResourceSpec{}) { - return apis.ErrMissingField("spec.type") - } - if rs.Type == PipelineResourceTypeCluster { - var authFound, cadataFound, clientKeyDataFound, clientCertificateDataFound, isInsecure bool - for _, param := range rs.Params { - switch { - case strings.EqualFold(param.Name, "URL"): - if err := validateURL(param.Value, "URL"); err != nil { - return err - } - case strings.EqualFold(param.Name, "Username"): - authFound = true - case strings.EqualFold(param.Name, "CAData"): - authFound = true - cadataFound = true - case strings.EqualFold(param.Name, "ClientKeyData"): - clientKeyDataFound = true - case strings.EqualFold(param.Name, "ClientCertificateData"): - clientCertificateDataFound = true - case strings.EqualFold(param.Name, "Token"): - authFound = true - case strings.EqualFold(param.Name, "insecure"): - b, _ := strconv.ParseBool(param.Value) - isInsecure = b - } - } - - for _, secret := range rs.SecretParams { - switch { - case strings.EqualFold(secret.FieldName, "Username"): - authFound = true - case strings.EqualFold(secret.FieldName, "CAData"): - authFound = true - cadataFound = true - } - } - // if both clientKeyData and clientCertificateData found - if clientCertificateDataFound && clientKeyDataFound { - authFound = true - } - - // One auth method must be supplied - if !(authFound) { - return apis.ErrMissingField("username or CAData or token param or clientKeyData or ClientCertificateData") - } - if !cadataFound && !isInsecure { - return apis.ErrMissingField("CAData param") - } - } - if rs.Type == PipelineResourceTypeStorage { - foundTypeParam := false - var location string - for _, param := range rs.Params { - switch { - case strings.EqualFold(param.Name, "type"): - if !AllowedStorageType(param.Value) { - return apis.ErrInvalidValue(param.Value, "spec.params.type") - } - foundTypeParam = true - case strings.EqualFold(param.Name, "Location"): - location = param.Value - } - } - - if !foundTypeParam { - return apis.ErrMissingField("spec.params.type") - } - if location == "" { - return apis.ErrMissingField("spec.params.location") - } - } - - if rs.Type == PipelineResourceTypePullRequest { - if err := validatePullRequest(rs); err != nil { - return err - } - } - - for _, allowedType := range AllResourceTypes { - if allowedType == rs.Type { - return nil - } - } - - return apis.ErrInvalidValue("spec.type", rs.Type) -} - -// AllowedStorageType returns true if the provided string can be used as a storage type, and false otherwise -func AllowedStorageType(gotType string) bool { - return gotType == PipelineResourceTypeGCS -} - -func validateURL(u, path string) *apis.FieldError { - if u == "" { - return nil - } - _, err := url.ParseRequestURI(u) - if err != nil { - return apis.ErrInvalidValue(u, path) - } - return nil -} - -func validatePullRequest(s *PipelineResourceSpec) *apis.FieldError { - for _, param := range s.SecretParams { - if param.FieldName != "authToken" { - return apis.ErrInvalidValue(fmt.Sprintf("invalid field name %q in secret parameter. Expected %q", param.FieldName, "authToken"), "spec.secrets.fieldName") - } - } - return nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/register.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/register.go index 78367093f3..67ccbd27b7 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/register.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1/register.go @@ -1,12 +1,9 @@ /* Copyright 2019 The Tekton 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. diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/run/v1beta1/customrunstatus_types.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/run/v1beta1/customrunstatus_types.go index ff41f0e4c8..2f8d9847c0 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/run/v1beta1/customrunstatus_types.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/run/v1beta1/customrunstatus_types.go @@ -20,6 +20,7 @@ import ( "encoding/json" "time" + "github.com/tektoncd/pipeline/pkg/apis/run/v1alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "knative.dev/pkg/apis" @@ -145,3 +146,28 @@ func (r *CustomRunStatus) EncodeExtraFields(from interface{}) error { } return nil } + +// FromRunStatus converts a v1alpha1.RunStatus into a corresponding v1beta1.CustomRunStatus +func FromRunStatus(orig v1alpha1.RunStatus) CustomRunStatus { + crs := CustomRunStatus{ + Status: orig.Status, + CustomRunStatusFields: CustomRunStatusFields{ + StartTime: orig.StartTime, + CompletionTime: orig.CompletionTime, + ExtraFields: orig.ExtraFields, + }, + } + + for _, origRes := range orig.Results { + crs.Results = append(crs.Results, CustomRunResult{ + Name: origRes.Name, + Value: origRes.Value, + }) + } + + for _, origRetryStatus := range orig.RetriesStatus { + crs.RetriesStatus = append(crs.RetriesStatus, FromRunStatus(origRetryStatus)) + } + + return crs +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/apis/version/conversion.go b/vendor/github.com/tektoncd/pipeline/pkg/apis/version/conversion.go index f32ca9a944..1d509ceadd 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/apis/version/conversion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/apis/version/conversion.go @@ -28,7 +28,7 @@ import ( func SerializeToMetadata(meta *metav1.ObjectMeta, field interface{}, key string) error { bytes, err := json.Marshal(field) if err != nil { - return fmt.Errorf("error serializing field: %s", err) + return fmt.Errorf("error serializing field: %w", err) } if meta.Annotations == nil { meta.Annotations = make(map[string]string) @@ -46,7 +46,7 @@ func DeserializeFromMetadata(meta *metav1.ObjectMeta, to interface{}, key string } if str, ok := meta.Annotations[key]; ok { if err := json.Unmarshal([]byte(str), to); err != nil { - return fmt.Errorf("error deserializing key %s from metadata: %s", key, err) + return fmt.Errorf("error deserializing key %s from metadata: %w", key, err) } delete(meta.Annotations, key) if len(meta.Annotations) == 0 { diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/scheme/register.go b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/scheme/register.go index 21c3e532df..ffc8f29c1f 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/scheme/register.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/scheme/register.go @@ -41,14 +41,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/generated_expansion.go b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/generated_expansion.go index 40814697cf..490c227c6d 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/generated_expansion.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/generated_expansion.go @@ -19,3 +19,5 @@ limitations under the License. package v1alpha1 type RunExpansion interface{} + +type VerificationPolicyExpansion interface{} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/pipeline_client.go b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/pipeline_client.go index 28d39482a6..19d91e935d 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/pipeline_client.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/pipeline_client.go @@ -29,6 +29,7 @@ import ( type TektonV1alpha1Interface interface { RESTClient() rest.Interface RunsGetter + VerificationPoliciesGetter } // TektonV1alpha1Client is used to interact with features provided by the tekton.dev group. @@ -40,6 +41,10 @@ func (c *TektonV1alpha1Client) Runs(namespace string) RunInterface { return newRuns(c, namespace) } +func (c *TektonV1alpha1Client) VerificationPolicies(namespace string) VerificationPolicyInterface { + return newVerificationPolicies(c, namespace) +} + // NewForConfig creates a new TektonV1alpha1Client for the given config. // NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), // where httpClient was generated with rest.HTTPClientFor(c). diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/verificationpolicy.go b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/verificationpolicy.go new file mode 100644 index 0000000000..92f534093f --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1alpha1/verificationpolicy.go @@ -0,0 +1,178 @@ +/* +Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + "time" + + v1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" + scheme "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// VerificationPoliciesGetter has a method to return a VerificationPolicyInterface. +// A group's client should implement this interface. +type VerificationPoliciesGetter interface { + VerificationPolicies(namespace string) VerificationPolicyInterface +} + +// VerificationPolicyInterface has methods to work with VerificationPolicy resources. +type VerificationPolicyInterface interface { + Create(ctx context.Context, verificationPolicy *v1alpha1.VerificationPolicy, opts v1.CreateOptions) (*v1alpha1.VerificationPolicy, error) + Update(ctx context.Context, verificationPolicy *v1alpha1.VerificationPolicy, opts v1.UpdateOptions) (*v1alpha1.VerificationPolicy, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.VerificationPolicy, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.VerificationPolicyList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.VerificationPolicy, err error) + VerificationPolicyExpansion +} + +// verificationPolicies implements VerificationPolicyInterface +type verificationPolicies struct { + client rest.Interface + ns string +} + +// newVerificationPolicies returns a VerificationPolicies +func newVerificationPolicies(c *TektonV1alpha1Client, namespace string) *verificationPolicies { + return &verificationPolicies{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the verificationPolicy, and returns the corresponding verificationPolicy object, and an error if there is any. +func (c *verificationPolicies) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.VerificationPolicy, err error) { + result = &v1alpha1.VerificationPolicy{} + err = c.client.Get(). + Namespace(c.ns). + Resource("verificationpolicies"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of VerificationPolicies that match those selectors. +func (c *verificationPolicies) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.VerificationPolicyList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.VerificationPolicyList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("verificationpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested verificationPolicies. +func (c *verificationPolicies) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("verificationpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a verificationPolicy and creates it. Returns the server's representation of the verificationPolicy, and an error, if there is any. +func (c *verificationPolicies) Create(ctx context.Context, verificationPolicy *v1alpha1.VerificationPolicy, opts v1.CreateOptions) (result *v1alpha1.VerificationPolicy, err error) { + result = &v1alpha1.VerificationPolicy{} + err = c.client.Post(). + Namespace(c.ns). + Resource("verificationpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(verificationPolicy). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a verificationPolicy and updates it. Returns the server's representation of the verificationPolicy, and an error, if there is any. +func (c *verificationPolicies) Update(ctx context.Context, verificationPolicy *v1alpha1.VerificationPolicy, opts v1.UpdateOptions) (result *v1alpha1.VerificationPolicy, err error) { + result = &v1alpha1.VerificationPolicy{} + err = c.client.Put(). + Namespace(c.ns). + Resource("verificationpolicies"). + Name(verificationPolicy.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(verificationPolicy). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the verificationPolicy and deletes it. Returns an error if one occurs. +func (c *verificationPolicies) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("verificationpolicies"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *verificationPolicies) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("verificationpolicies"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched verificationPolicy. +func (c *verificationPolicies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.VerificationPolicy, err error) { + result = &v1alpha1.VerificationPolicy{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("verificationpolicies"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/generic.go b/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/generic.go index 3f3c58d271..50110a1fd2 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/generic.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/generic.go @@ -67,6 +67,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource // Group=tekton.dev, Version=v1alpha1 case v1alpha1.SchemeGroupVersion.WithResource("runs"): return &genericInformer{resource: resource.GroupResource(), informer: f.Tekton().V1alpha1().Runs().Informer()}, nil + case v1alpha1.SchemeGroupVersion.WithResource("verificationpolicies"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Tekton().V1alpha1().VerificationPolicies().Informer()}, nil // Group=tekton.dev, Version=v1beta1 case v1beta1.SchemeGroupVersion.WithResource("clustertasks"): diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1alpha1/interface.go b/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1alpha1/interface.go index 25a56f8134..c9b783d319 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1alpha1/interface.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1alpha1/interface.go @@ -26,6 +26,8 @@ import ( type Interface interface { // Runs returns a RunInformer. Runs() RunInformer + // VerificationPolicies returns a VerificationPolicyInformer. + VerificationPolicies() VerificationPolicyInformer } type version struct { @@ -43,3 +45,8 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList func (v *version) Runs() RunInformer { return &runInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } + +// VerificationPolicies returns a VerificationPolicyInformer. +func (v *version) VerificationPolicies() VerificationPolicyInformer { + return &verificationPolicyInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1alpha1/verificationpolicy.go b/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1alpha1/verificationpolicy.go new file mode 100644 index 0000000000..622a6a030d --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1alpha1/verificationpolicy.go @@ -0,0 +1,90 @@ +/* +Copyright 2020 The Tekton 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 informer-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + time "time" + + pipelinev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" + versioned "github.com/tektoncd/pipeline/pkg/client/clientset/versioned" + internalinterfaces "github.com/tektoncd/pipeline/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// VerificationPolicyInformer provides access to a shared informer and lister for +// VerificationPolicies. +type VerificationPolicyInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.VerificationPolicyLister +} + +type verificationPolicyInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewVerificationPolicyInformer constructs a new informer for VerificationPolicy type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewVerificationPolicyInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredVerificationPolicyInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredVerificationPolicyInformer constructs a new informer for VerificationPolicy type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredVerificationPolicyInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.TektonV1alpha1().VerificationPolicies(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.TektonV1alpha1().VerificationPolicies(namespace).Watch(context.TODO(), options) + }, + }, + &pipelinev1alpha1.VerificationPolicy{}, + resyncPeriod, + indexers, + ) +} + +func (f *verificationPolicyInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredVerificationPolicyInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *verificationPolicyInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&pipelinev1alpha1.VerificationPolicy{}, f.defaultInformer) +} + +func (f *verificationPolicyInformer) Lister() v1alpha1.VerificationPolicyLister { + return v1alpha1.NewVerificationPolicyLister(f.Informer().GetIndexer()) +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1/expansion_generated.go b/vendor/github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1/expansion_generated.go index ef742ea349..459ebc6ce5 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1/expansion_generated.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1/expansion_generated.go @@ -25,3 +25,11 @@ type RunListerExpansion interface{} // RunNamespaceListerExpansion allows custom methods to be added to // RunNamespaceLister. type RunNamespaceListerExpansion interface{} + +// VerificationPolicyListerExpansion allows custom methods to be added to +// VerificationPolicyLister. +type VerificationPolicyListerExpansion interface{} + +// VerificationPolicyNamespaceListerExpansion allows custom methods to be added to +// VerificationPolicyNamespaceLister. +type VerificationPolicyNamespaceListerExpansion interface{} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1/verificationpolicy.go b/vendor/github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1/verificationpolicy.go new file mode 100644 index 0000000000..7682fa51ba --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1/verificationpolicy.go @@ -0,0 +1,99 @@ +/* +Copyright 2020 The Tekton 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 lister-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// VerificationPolicyLister helps list VerificationPolicies. +// All objects returned here must be treated as read-only. +type VerificationPolicyLister interface { + // List lists all VerificationPolicies in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.VerificationPolicy, err error) + // VerificationPolicies returns an object that can list and get VerificationPolicies. + VerificationPolicies(namespace string) VerificationPolicyNamespaceLister + VerificationPolicyListerExpansion +} + +// verificationPolicyLister implements the VerificationPolicyLister interface. +type verificationPolicyLister struct { + indexer cache.Indexer +} + +// NewVerificationPolicyLister returns a new VerificationPolicyLister. +func NewVerificationPolicyLister(indexer cache.Indexer) VerificationPolicyLister { + return &verificationPolicyLister{indexer: indexer} +} + +// List lists all VerificationPolicies in the indexer. +func (s *verificationPolicyLister) List(selector labels.Selector) (ret []*v1alpha1.VerificationPolicy, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.VerificationPolicy)) + }) + return ret, err +} + +// VerificationPolicies returns an object that can list and get VerificationPolicies. +func (s *verificationPolicyLister) VerificationPolicies(namespace string) VerificationPolicyNamespaceLister { + return verificationPolicyNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// VerificationPolicyNamespaceLister helps list and get VerificationPolicies. +// All objects returned here must be treated as read-only. +type VerificationPolicyNamespaceLister interface { + // List lists all VerificationPolicies in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.VerificationPolicy, err error) + // Get retrieves the VerificationPolicy from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1alpha1.VerificationPolicy, error) + VerificationPolicyNamespaceListerExpansion +} + +// verificationPolicyNamespaceLister implements the VerificationPolicyNamespaceLister +// interface. +type verificationPolicyNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all VerificationPolicies in the indexer for a given namespace. +func (s verificationPolicyNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.VerificationPolicy, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.VerificationPolicy)) + }) + return ret, err +} + +// Get retrieves the VerificationPolicy from the indexer for a given namespace and name. +func (s verificationPolicyNamespaceLister) Get(name string) (*v1alpha1.VerificationPolicy, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("verificationpolicy"), name) + } + return obj.(*v1alpha1.VerificationPolicy), nil +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/clientset.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/clientset.go deleted file mode 100644 index 9a624825bb..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/clientset.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -package versioned - -import ( - "fmt" - "net/http" - - tektonv1alpha1 "github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1" - discovery "k8s.io/client-go/discovery" - rest "k8s.io/client-go/rest" - flowcontrol "k8s.io/client-go/util/flowcontrol" -) - -type Interface interface { - Discovery() discovery.DiscoveryInterface - TektonV1alpha1() tektonv1alpha1.TektonV1alpha1Interface -} - -// Clientset contains the clients for groups. Each group has exactly one -// version included in a Clientset. -type Clientset struct { - *discovery.DiscoveryClient - tektonV1alpha1 *tektonv1alpha1.TektonV1alpha1Client -} - -// TektonV1alpha1 retrieves the TektonV1alpha1Client -func (c *Clientset) TektonV1alpha1() tektonv1alpha1.TektonV1alpha1Interface { - return c.tektonV1alpha1 -} - -// Discovery retrieves the DiscoveryClient -func (c *Clientset) Discovery() discovery.DiscoveryInterface { - if c == nil { - return nil - } - return c.DiscoveryClient -} - -// NewForConfig creates a new Clientset for the given config. -// If config's RateLimiter is not set and QPS and Burst are acceptable, -// NewForConfig will generate a rate-limiter in configShallowCopy. -// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), -// where httpClient was generated with rest.HTTPClientFor(c). -func NewForConfig(c *rest.Config) (*Clientset, error) { - configShallowCopy := *c - - if configShallowCopy.UserAgent == "" { - configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent() - } - - // share the transport between all clients - httpClient, err := rest.HTTPClientFor(&configShallowCopy) - if err != nil { - return nil, err - } - - return NewForConfigAndClient(&configShallowCopy, httpClient) -} - -// NewForConfigAndClient creates a new Clientset for the given config and http client. -// Note the http client provided takes precedence over the configured transport values. -// If config's RateLimiter is not set and QPS and Burst are acceptable, -// NewForConfigAndClient will generate a rate-limiter in configShallowCopy. -func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset, error) { - configShallowCopy := *c - if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { - if configShallowCopy.Burst <= 0 { - return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") - } - configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) - } - - var cs Clientset - var err error - cs.tektonV1alpha1, err = tektonv1alpha1.NewForConfigAndClient(&configShallowCopy, httpClient) - if err != nil { - return nil, err - } - - cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfigAndClient(&configShallowCopy, httpClient) - if err != nil { - return nil, err - } - return &cs, nil -} - -// NewForConfigOrDie creates a new Clientset for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *Clientset { - cs, err := NewForConfig(c) - if err != nil { - panic(err) - } - return cs -} - -// New creates a new Clientset for the given RESTClient. -func New(c rest.Interface) *Clientset { - var cs Clientset - cs.tektonV1alpha1 = tektonv1alpha1.New(c) - - cs.DiscoveryClient = discovery.NewDiscoveryClient(c) - return &cs -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/doc.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/doc.go deleted file mode 100644 index 0d13552ae2..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -// This package has the automatically generated clientset. -package versioned diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme/doc.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme/doc.go deleted file mode 100644 index 0fb16cc056..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -// This package contains the scheme of the automatically generated clientset. -package scheme diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme/register.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme/register.go deleted file mode 100644 index 2eb6b537e5..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme/register.go +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -package scheme - -import ( - tektonv1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - schema "k8s.io/apimachinery/pkg/runtime/schema" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" -) - -var Scheme = runtime.NewScheme() -var Codecs = serializer.NewCodecFactory(Scheme) -var ParameterCodec = runtime.NewParameterCodec(Scheme) -var localSchemeBuilder = runtime.SchemeBuilder{ - tektonv1alpha1.AddToScheme, -} - -// AddToScheme adds all types of this clientset into the given scheme. This allows composition -// of clientsets, like in: -// -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) -// -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) -// -// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types -// correctly. -var AddToScheme = localSchemeBuilder.AddToScheme - -func init() { - v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - utilruntime.Must(AddToScheme(Scheme)) -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/doc.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/doc.go deleted file mode 100644 index 69ed294b82..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v1alpha1 diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/generated_expansion.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/generated_expansion.go deleted file mode 100644 index 1536d99ffb..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/generated_expansion.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -package v1alpha1 - -type PipelineResourceExpansion interface{} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/pipelineresource.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/pipelineresource.go deleted file mode 100644 index ec03040eeb..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/pipelineresource.go +++ /dev/null @@ -1,178 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - "context" - "time" - - v1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - scheme "github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// PipelineResourcesGetter has a method to return a PipelineResourceInterface. -// A group's client should implement this interface. -type PipelineResourcesGetter interface { - PipelineResources(namespace string) PipelineResourceInterface -} - -// PipelineResourceInterface has methods to work with PipelineResource resources. -type PipelineResourceInterface interface { - Create(ctx context.Context, pipelineResource *v1alpha1.PipelineResource, opts v1.CreateOptions) (*v1alpha1.PipelineResource, error) - Update(ctx context.Context, pipelineResource *v1alpha1.PipelineResource, opts v1.UpdateOptions) (*v1alpha1.PipelineResource, error) - Delete(ctx context.Context, name string, opts v1.DeleteOptions) error - DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error - Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.PipelineResource, error) - List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.PipelineResourceList, error) - Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) - Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.PipelineResource, err error) - PipelineResourceExpansion -} - -// pipelineResources implements PipelineResourceInterface -type pipelineResources struct { - client rest.Interface - ns string -} - -// newPipelineResources returns a PipelineResources -func newPipelineResources(c *TektonV1alpha1Client, namespace string) *pipelineResources { - return &pipelineResources{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the pipelineResource, and returns the corresponding pipelineResource object, and an error if there is any. -func (c *pipelineResources) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.PipelineResource, err error) { - result = &v1alpha1.PipelineResource{} - err = c.client.Get(). - Namespace(c.ns). - Resource("pipelineresources"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(ctx). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of PipelineResources that match those selectors. -func (c *pipelineResources) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.PipelineResourceList, err error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - result = &v1alpha1.PipelineResourceList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("pipelineresources"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Do(ctx). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested pipelineResources. -func (c *pipelineResources) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("pipelineresources"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Watch(ctx) -} - -// Create takes the representation of a pipelineResource and creates it. Returns the server's representation of the pipelineResource, and an error, if there is any. -func (c *pipelineResources) Create(ctx context.Context, pipelineResource *v1alpha1.PipelineResource, opts v1.CreateOptions) (result *v1alpha1.PipelineResource, err error) { - result = &v1alpha1.PipelineResource{} - err = c.client.Post(). - Namespace(c.ns). - Resource("pipelineresources"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(pipelineResource). - Do(ctx). - Into(result) - return -} - -// Update takes the representation of a pipelineResource and updates it. Returns the server's representation of the pipelineResource, and an error, if there is any. -func (c *pipelineResources) Update(ctx context.Context, pipelineResource *v1alpha1.PipelineResource, opts v1.UpdateOptions) (result *v1alpha1.PipelineResource, err error) { - result = &v1alpha1.PipelineResource{} - err = c.client.Put(). - Namespace(c.ns). - Resource("pipelineresources"). - Name(pipelineResource.Name). - VersionedParams(&opts, scheme.ParameterCodec). - Body(pipelineResource). - Do(ctx). - Into(result) - return -} - -// Delete takes name of the pipelineResource and deletes it. Returns an error if one occurs. -func (c *pipelineResources) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("pipelineresources"). - Name(name). - Body(&opts). - Do(ctx). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *pipelineResources) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - var timeout time.Duration - if listOpts.TimeoutSeconds != nil { - timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second - } - return c.client.Delete(). - Namespace(c.ns). - Resource("pipelineresources"). - VersionedParams(&listOpts, scheme.ParameterCodec). - Timeout(timeout). - Body(&opts). - Do(ctx). - Error() -} - -// Patch applies the patch and returns the patched pipelineResource. -func (c *pipelineResources) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.PipelineResource, err error) { - result = &v1alpha1.PipelineResource{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("pipelineresources"). - Name(name). - SubResource(subresources...). - VersionedParams(&opts, scheme.ParameterCodec). - Body(data). - Do(ctx). - Into(result) - return -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/resource_client.go b/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/resource_client.go deleted file mode 100644 index eaf177014b..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1/resource_client.go +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2020 The Tekton 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 client-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - "net/http" - - v1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" - "github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme" - rest "k8s.io/client-go/rest" -) - -type TektonV1alpha1Interface interface { - RESTClient() rest.Interface - PipelineResourcesGetter -} - -// TektonV1alpha1Client is used to interact with features provided by the tekton.dev group. -type TektonV1alpha1Client struct { - restClient rest.Interface -} - -func (c *TektonV1alpha1Client) PipelineResources(namespace string) PipelineResourceInterface { - return newPipelineResources(c, namespace) -} - -// NewForConfig creates a new TektonV1alpha1Client for the given config. -// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), -// where httpClient was generated with rest.HTTPClientFor(c). -func NewForConfig(c *rest.Config) (*TektonV1alpha1Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - httpClient, err := rest.HTTPClientFor(&config) - if err != nil { - return nil, err - } - return NewForConfigAndClient(&config, httpClient) -} - -// NewForConfigAndClient creates a new TektonV1alpha1Client for the given config and http client. -// Note the http client provided takes precedence over the configured transport values. -func NewForConfigAndClient(c *rest.Config, h *http.Client) (*TektonV1alpha1Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientForConfigAndClient(&config, h) - if err != nil { - return nil, err - } - return &TektonV1alpha1Client{client}, nil -} - -// NewForConfigOrDie creates a new TektonV1alpha1Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *TektonV1alpha1Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new TektonV1alpha1Client for the given RESTClient. -func New(c rest.Interface) *TektonV1alpha1Client { - return &TektonV1alpha1Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v1alpha1.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *TektonV1alpha1Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/result/result.go b/vendor/github.com/tektoncd/pipeline/pkg/result/result.go new file mode 100644 index 0000000000..cfcbc3e90a --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/result/result.go @@ -0,0 +1,92 @@ +/* +Copyright 2023 The Tekton 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 result + +import ( + "encoding/json" + "fmt" + + "github.com/hashicorp/go-multierror" +) + +const ( + // TaskRunResultType default task run result value + TaskRunResultType ResultType = 1 + // reserved: 2 + // was RunResultType + + // InternalTektonResultType default internal tekton result value + InternalTektonResultType = 3 + // UnknownResultType default unknown result type value + UnknownResultType = 10 +) + +// RunResult is used to write key/value pairs to TaskRun pod termination messages. +// The key/value pairs may come from the entrypoint binary, or represent a TaskRunResult. +// If they represent a TaskRunResult, the key is the name of the result and the value is the +// JSON-serialized value of the result. +type RunResult struct { + Key string `json:"key"` + Value string `json:"value"` + // ResourceName may be used in tests, but it is not populated in termination messages. + // It is preserved here for backwards compatibility and will not be ported to v1. + ResourceName string `json:"resourceName,omitempty"` + ResultType ResultType `json:"type,omitempty"` +} + +// ResultType used to find out whether a RunResult is from a task result or not +// Note that ResultsType is another type which is used to define the data type +// (e.g. string, array, etc) we used for Results +// +//nolint:revive // revive complains about stutter of `result.ResultType`. +type ResultType int + +// UnmarshalJSON unmarshals either an int or a string into a ResultType. String +// ResultTypes were removed because they made JSON messages bigger, which in +// turn limited the amount of space in termination messages for task results. String +// support is maintained for backwards compatibility - the Pipelines controller could +// be stopped midway through TaskRun execution, updated with support for int in place +// of string, and then fail the running TaskRun because it doesn't know how to interpret +// the string value that the TaskRun's entrypoint will emit when it completes. +func (r *ResultType) UnmarshalJSON(data []byte) error { + var asInt int + var intErr error + + if err := json.Unmarshal(data, &asInt); err != nil { + intErr = err + } else { + *r = ResultType(asInt) + return nil + } + + var asString string + + if err := json.Unmarshal(data, &asString); err != nil { + return fmt.Errorf("unsupported value type, neither int nor string: %w", multierror.Append(intErr, err).ErrorOrNil()) + } + + switch asString { + case "TaskRunResult": + *r = TaskRunResultType + case "InternalTektonResult": + *r = InternalTektonResultType + default: + *r = UnknownResultType + } + + return nil +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/spire/config/config.go b/vendor/github.com/tektoncd/pipeline/pkg/spire/config/config.go new file mode 100644 index 0000000000..f8fed32daf --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/spire/config/config.go @@ -0,0 +1,69 @@ +/* +Copyright 2022 The Tekton 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 config + +import ( + "fmt" + "sort" + "strings" +) + +// SpireConfig holds the images reference for a number of container images used +// across tektoncd pipelines. +// +k8s:deepcopy-gen=true +type SpireConfig struct { + // The trust domain corresponds to the trust root of a SPIFFE identity provider. + TrustDomain string + // Path to the spire agent socket defined by the CSI driver + SocketPath string + // Spire server address + ServerAddr string + // Prefix to attach to the node name when registering it with the spire server + NodeAliasPrefix string + + // MockSpire only to be used for testing the controller, will not exhibit + // all characteristics of spire since it is only being used in the context + // of process memory. + MockSpire bool +} + +// Validate returns an error if any image is not set. +func (c SpireConfig) Validate() error { + var unset []string + for _, f := range []struct { + v, name string + }{ + {c.TrustDomain, "spire-trust-domain"}, + {c.SocketPath, "spire-socket-path"}, + {c.ServerAddr, "spire-server-addr"}, + {c.NodeAliasPrefix, "spire-node-alias-prefix"}, + } { + if f.v == "" { + unset = append(unset, f.name) + } + } + if len(unset) > 0 { + sort.Strings(unset) + return fmt.Errorf("found unset spire configuration flags: %s", unset) + } + + if !strings.HasPrefix(c.NodeAliasPrefix, "/") { + return fmt.Errorf("Spire node alias should start with a /") + } + + return nil +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/spire/config/zz_generated.deepcopy.go b/vendor/github.com/tektoncd/pipeline/pkg/spire/config/zz_generated.deepcopy.go new file mode 100644 index 0000000000..56590eee53 --- /dev/null +++ b/vendor/github.com/tektoncd/pipeline/pkg/spire/config/zz_generated.deepcopy.go @@ -0,0 +1,38 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright 2020 The Tekton 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 deepcopy-gen. DO NOT EDIT. + +package config + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SpireConfig) DeepCopyInto(out *SpireConfig) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SpireConfig. +func (in *SpireConfig) DeepCopy() *SpireConfig { + if in == nil { + return nil + } + out := new(SpireConfig) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/status/status.go b/vendor/github.com/tektoncd/pipeline/pkg/status/status.go deleted file mode 100644 index 4952ab2763..0000000000 --- a/vendor/github.com/tektoncd/pipeline/pkg/status/status.go +++ /dev/null @@ -1,119 +0,0 @@ -/* -Copyright 2022 The Tekton 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 - -import ( - "context" - "fmt" - - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" - "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - "github.com/tektoncd/pipeline/pkg/client/clientset/versioned" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// GetTaskRunStatusForPipelineTask takes a minimal embedded status child reference and returns the actual TaskRunStatus -// for the PipelineTask. It returns an error if the child reference's kind isn't TaskRun. -func GetTaskRunStatusForPipelineTask(ctx context.Context, client versioned.Interface, ns string, childRef v1beta1.ChildStatusReference) (*v1beta1.TaskRunStatus, error) { - if childRef.Kind != "TaskRun" { - return nil, fmt.Errorf("could not fetch status for PipelineTask %s: should have kind TaskRun, but is %s", childRef.PipelineTaskName, childRef.Kind) - } - - tr, err := client.TektonV1beta1().TaskRuns(ns).Get(ctx, childRef.Name, metav1.GetOptions{}) - if err != nil && !errors.IsNotFound(err) { - return nil, err - } - if tr == nil { - return nil, nil - } - - return &tr.Status, nil -} - -// GetRunStatusForPipelineTask takes a minimal embedded status child reference and returns the actual RunStatus for the -// PipelineTask. It returns an error if the child reference's kind isn't Run. -func GetRunStatusForPipelineTask(ctx context.Context, client versioned.Interface, ns string, childRef v1beta1.ChildStatusReference) (*v1alpha1.RunStatus, error) { - if childRef.Kind != "Run" { - return nil, fmt.Errorf("could not fetch status for PipelineTask %s: should have kind Run, but is %s", childRef.PipelineTaskName, childRef.Kind) - } - - r, err := client.TektonV1alpha1().Runs(ns).Get(ctx, childRef.Name, metav1.GetOptions{}) - if err != nil && !errors.IsNotFound(err) { - return nil, err - } - if r == nil { - return nil, nil - } - - return &r.Status, nil -} - -// GetFullPipelineTaskStatuses returns populated TaskRun and Run status maps for a PipelineRun from its ChildReferences. -// If the PipelineRun has no ChildReferences, its .Status.TaskRuns and .Status.Runs will be returned instead. -func GetFullPipelineTaskStatuses(ctx context.Context, client versioned.Interface, ns string, pr *v1beta1.PipelineRun) (map[string]*v1beta1.PipelineRunTaskRunStatus, - map[string]*v1beta1.PipelineRunRunStatus, error) { - // If the PipelineRun is nil, just return - if pr == nil { - return nil, nil, nil - } - - // If there are no child references or either TaskRuns or Runs is non-zero, return the existing TaskRuns and Runs maps - if len(pr.Status.ChildReferences) == 0 || len(pr.Status.TaskRuns) > 0 || len(pr.Status.Runs) > 0 { - return pr.Status.TaskRuns, pr.Status.Runs, nil - } - - trStatuses := make(map[string]*v1beta1.PipelineRunTaskRunStatus) - runStatuses := make(map[string]*v1beta1.PipelineRunRunStatus) - - for _, cr := range pr.Status.ChildReferences { - switch cr.Kind { - case "TaskRun": - tr, err := client.TektonV1beta1().TaskRuns(ns).Get(ctx, cr.Name, metav1.GetOptions{}) - if err != nil && !errors.IsNotFound(err) { - return nil, nil, err - } - - trStatuses[cr.Name] = &v1beta1.PipelineRunTaskRunStatus{ - PipelineTaskName: cr.PipelineTaskName, - WhenExpressions: cr.WhenExpressions, - } - - if tr != nil { - trStatuses[cr.Name].Status = &tr.Status - } - case "Run": - r, err := client.TektonV1alpha1().Runs(ns).Get(ctx, cr.Name, metav1.GetOptions{}) - if err != nil && !errors.IsNotFound(err) { - return nil, nil, err - } - - runStatuses[cr.Name] = &v1beta1.PipelineRunRunStatus{ - PipelineTaskName: cr.PipelineTaskName, - WhenExpressions: cr.WhenExpressions, - } - - if r != nil { - runStatuses[cr.Name].Status = &r.Status - } - default: - // Don't do anything for unknown types. - } - } - - return trStatuses, runStatuses, nil -} diff --git a/vendor/github.com/tektoncd/pipeline/pkg/substitution/substitution.go b/vendor/github.com/tektoncd/pipeline/pkg/substitution/substitution.go index 78807fc33a..cb93bc8e7f 100644 --- a/vendor/github.com/tektoncd/pipeline/pkg/substitution/substitution.go +++ b/vendor/github.com/tektoncd/pipeline/pkg/substitution/substitution.go @@ -72,7 +72,6 @@ func ValidateVariableP(value, prefix string, vars sets.String) *apis.FieldError Message: errString, Paths: []string{""}, } - } for _, v := range vs { v = TrimArrayIndex(v) @@ -112,7 +111,6 @@ func ValidateVariableProhibitedP(value, prefix string, vars sets.String) *apis.F Message: errString, Paths: []string{""}, } - } for _, v := range vs { v = strings.TrimSuffix(v, "[*]") @@ -180,7 +178,6 @@ func ValidateVariableIsolatedP(value, prefix string, vars sets.String) *apis.Fie Message: errString, Paths: []string{""}, } - } firstMatch, _ := extractExpressionFromString(value, prefix) for _, v := range vs { @@ -279,7 +276,7 @@ func extractEntireVariablesFromString(s, prefix string) ([]string, error) { pattern := fmt.Sprintf(braceMatchingRegex, prefix, parameterSubstitution, parameterSubstitution, parameterSubstitution) re, err := regexp.Compile(pattern) if err != nil { - return nil, fmt.Errorf("Fail to parse regex pattern: %v", err) + return nil, fmt.Errorf("Fail to parse regex pattern: %w", err) } matches := re.FindAllStringSubmatch(s, -1) diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/config/allowed_types.go b/vendor/github.com/tektoncd/triggers/pkg/apis/config/allowed_types.go index a57704be48..d8aeb9962a 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/config/allowed_types.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/config/allowed_types.go @@ -1,8 +1,9 @@ package config import ( + pipelinev1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" + customrunsv1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1" pipelinev1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" - pipelineresourcev1alpha1 "github.com/tektoncd/pipeline/pkg/apis/resource/v1alpha1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -13,12 +14,14 @@ var Decoder runtime.Decoder // TODO(dibyom): We should have a way of configuring this instead of an init function? func init() { scheme := runtime.NewScheme() - utilruntime.Must(pipelineresourcev1alpha1.AddToScheme(scheme)) + utilruntime.Must(customrunsv1alpha1.AddToScheme(scheme)) utilruntime.Must(pipelinev1beta1.AddToScheme(scheme)) + utilruntime.Must(pipelinev1.AddToScheme(scheme)) codec := serializer.NewCodecFactory(scheme) Decoder = codec.UniversalDecoder( - pipelineresourcev1alpha1.SchemeGroupVersion, + customrunsv1alpha1.SchemeGroupVersion, // customrunsv1alpha1 share the same SchemeGroupVersion pipelinev1beta1.SchemeGroupVersion, + pipelinev1.SchemeGroupVersion, ) } @@ -28,3 +31,15 @@ func EnsureAllowedType(rt runtime.RawExtension) error { _, err := runtime.Decode(Decoder, rt.Raw) return err } + +var ( + AllowedPipelineTypes = map[string][]string{ + "v1alpha1": {"pipelineruns", "taskruns", "pipelines", "clustertasks", "tasks", "conditions", "runs"}, + "v1beta1": {"pipelineruns", "taskruns", "pipelines", "clustertasks", "tasks", "customruns"}, + "v1": {"pipelineruns", "taskruns", "pipelines", "tasks"}, + } + AllowedTriggersTypes = map[string][]string{ + "v1alpha1": {"clusterinterceptors", "interceptors"}, + "v1beta1": {"clustertriggerbindings", "eventlisteners", "triggerbindings", "triggers", "triggertemplates"}, + } +) diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_interceptor_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_interceptor_validation.go index f8bf39e99d..e8a55294c0 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_interceptor_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_interceptor_validation.go @@ -30,6 +30,8 @@ func (it *ClusterInterceptor) Validate(ctx context.Context) *apis.FieldError { return it.Spec.validate(ctx) } +// revive:disable:unused-parameter + func (s *ClusterInterceptorSpec) validate(ctx context.Context) (errs *apis.FieldError) { if s.ClientConfig.URL != nil && s.ClientConfig.Service != nil { errs = errs.Also(apis.ErrMultipleOneOf("spec.clientConfig.url", "spec.clientConfig.service")) diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_trigger_binding_defaults.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_trigger_binding_defaults.go index eae67beee3..997d39c9e7 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_trigger_binding_defaults.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/cluster_trigger_binding_defaults.go @@ -20,5 +20,7 @@ import ( "context" ) +// revive:disable:unused-parameter + // SetDefaults initializes ClusterTriggerBinding ctb with its default values. func (ctb *ClusterTriggerBinding) SetDefaults(ctx context.Context) {} diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/event_listener_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/event_listener_validation.go index a063939926..f6668d7fdf 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/event_listener_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/event_listener_validation.go @@ -23,11 +23,13 @@ import ( "fmt" "github.com/tektoncd/triggers/pkg/apis/triggers" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" "knative.dev/pkg/apis" duckv1 "knative.dev/pkg/apis/duck/v1" + "knative.dev/pkg/webhook/resourcesemantics" ) var ( @@ -37,6 +39,13 @@ var ( ) ) +var _ resourcesemantics.VerbLimited = (*EventListener)(nil) + +// SupportedVerbs returns the operations that validation should be called for +func (e *EventListener) SupportedVerbs() []admissionregistrationv1.OperationType { + return []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update} +} + // Validate EventListener. func (e *EventListener) Validate(ctx context.Context) *apis.FieldError { if apis.IsInDelete(ctx) { diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/interceptor_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/interceptor_validation.go index b16f9b4ae6..7cbd8f7e03 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/interceptor_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/interceptor_validation.go @@ -30,6 +30,8 @@ func (it *Interceptor) Validate(ctx context.Context) *apis.FieldError { return it.Spec.validate(ctx) } +// revive:disable:unused-parameter + func (s *InterceptorSpec) validate(ctx context.Context) (errs *apis.FieldError) { if s.ClientConfig.URL != nil && s.ClientConfig.Service != nil { errs = errs.Also(apis.ErrMultipleOneOf("spec.clientConfig.url", "spec.clientConfig.service")) diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_defaults.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_defaults.go index 5ed3a3a847..335b36a1d4 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_defaults.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_defaults.go @@ -20,5 +20,7 @@ import ( "context" ) +// revive:disable:unused-parameter + // SetDefaults initializes TriggerBinding tb with its default values. func (tb *TriggerBinding) SetDefaults(ctx context.Context) {} diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_validation.go index f3439e99cb..ac0dcb9109 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_binding_validation.go @@ -37,6 +37,8 @@ func (tb *TriggerBinding) Validate(ctx context.Context) (errs *apis.FieldError) return errs.Also(tb.Spec.Validate(ctx).ViaField("spec")) } +// revive:disable:unused-parameter + // Validate TriggerBindingSpec. func (s *TriggerBindingSpec) Validate(ctx context.Context) (errs *apis.FieldError) { if equality.Semantic.DeepEqual(s, &TriggerBindingSpec{}) { diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_defaults.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_defaults.go index 2e705888fc..ff341c3254 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_defaults.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_defaults.go @@ -20,5 +20,7 @@ import ( "context" ) +// revive:disable:unused-parameter + // SetDefaults initializes TriggerTemplate with default values. func (tt *TriggerTemplate) SetDefaults(ctx context.Context) {} diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_validation.go index 12b59a4dd4..ef23af6892 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_template_validation.go @@ -33,6 +33,8 @@ import ( // paramsRegexp captures TriggerTemplate parameter names $(tt.params.NAME) var paramsRegexp = regexp.MustCompile(`\$\(tt.params.(?P[_a-zA-Z][_a-zA-Z0-9.-]*)\)`) +// revive:disable:unused-parameter + // Validate validates a TriggerTemplate. func (t *TriggerTemplate) Validate(ctx context.Context) *apis.FieldError { if apis.IsInDelete(ctx) { diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_validation.go index 9fefe51b50..1917a879dc 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1/trigger_validation.go @@ -51,6 +51,8 @@ func (t *TriggerSpec) validate(ctx context.Context) *apis.FieldError { return errs } +// revive:disable:unused-parameter + func (t TriggerSpecTemplate) validate(ctx context.Context) (errs *apis.FieldError) { // Optional explicit match if t.APIVersion != "" { diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_defaults.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_defaults.go index 9d1badc009..27c9f98cfe 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_defaults.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_defaults.go @@ -20,5 +20,7 @@ import ( "context" ) +// revive:disable:unused-parameter + // SetDefaults initializes ClusterTriggerBinding ctb with its default values. func (ctb *ClusterTriggerBinding) SetDefaults(ctx context.Context) {} diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_validation.go index 6dfdb8ab0c..265de4d24e 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/cluster_trigger_binding_validation.go @@ -20,13 +20,19 @@ import ( "context" "github.com/tektoncd/pipeline/pkg/apis/validate" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" "knative.dev/pkg/apis" + "knative.dev/pkg/webhook/resourcesemantics" ) +var _ resourcesemantics.VerbLimited = (*ClusterTriggerBinding)(nil) + +// SupportedVerbs returns the operations that validation should be called for +func (ctb *ClusterTriggerBinding) SupportedVerbs() []admissionregistrationv1.OperationType { + return []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update} +} + func (ctb *ClusterTriggerBinding) Validate(ctx context.Context) *apis.FieldError { - if apis.IsInDelete(ctx) { - return nil - } if err := validate.ObjectMetadata(ctb.GetObjectMeta()); err != nil { return err.ViaField("metadata") } diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_defaults.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_defaults.go index 1d57b3d1c4..fa642c4238 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_defaults.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_defaults.go @@ -47,5 +47,13 @@ func (el *EventListener) SetDefaults(ctx context.Context) { } } } + + for _, tg := range el.Spec.TriggerGroups { + for _, ti := range tg.Interceptors { + if ti != nil { + ti.defaultInterceptorKind() + } + } + } } } diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_validation.go index 9d0828b831..2810136ac5 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/event_listener_validation.go @@ -23,11 +23,13 @@ import ( "fmt" "github.com/tektoncd/triggers/pkg/apis/triggers" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" "knative.dev/pkg/apis" duckv1 "knative.dev/pkg/apis/duck/v1" + "knative.dev/pkg/webhook/resourcesemantics" ) var ( @@ -37,12 +39,17 @@ var ( ) ) +var _ resourcesemantics.VerbLimited = (*EventListener)(nil) + +// SupportedVerbs returns the operations that validation should be called for +func (e *EventListener) SupportedVerbs() []admissionregistrationv1.OperationType { + return []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update} +} + +// revive:disable:unused-parameter + // Validate EventListener. func (e *EventListener) Validate(ctx context.Context) *apis.FieldError { - if apis.IsInDelete(ctx) { - return nil - } - var errs *apis.FieldError if len(e.ObjectMeta.Name) > 60 { // Since `el-` is added as the prefix of EventListener services, the name of EventListener must be no more than 60 characters long. diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/openapi_generated.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/openapi_generated.go index 693fa5669d..bb58c9f1c7 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/openapi_generated.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/openapi_generated.go @@ -46,6 +46,8 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.EventListenerTriggerSelector": schema_pkg_apis_triggers_v1beta1_EventListenerTriggerSelector(ref), "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GitHubInterceptor": schema_pkg_apis_triggers_v1beta1_GitHubInterceptor(ref), "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GitLabInterceptor": schema_pkg_apis_triggers_v1beta1_GitLabInterceptor(ref), + "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GithubAddChangedFiles": schema_pkg_apis_triggers_v1beta1_GithubAddChangedFiles(ref), + "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GithubOwners": schema_pkg_apis_triggers_v1beta1_GithubOwners(ref), "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.InterceptorParams": schema_pkg_apis_triggers_v1beta1_InterceptorParams(ref), "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.InterceptorRef": schema_pkg_apis_triggers_v1beta1_InterceptorRef(ref), "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.InterceptorRequest": schema_pkg_apis_triggers_v1beta1_InterceptorRequest(ref), @@ -735,11 +737,23 @@ func schema_pkg_apis_triggers_v1beta1_GitHubInterceptor(ref common.ReferenceCall }, }, }, + "addChangedFiles": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GithubAddChangedFiles"), + }, + }, + "githubOwners": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GithubOwners"), + }, + }, }, }, }, Dependencies: []string{ - "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.SecretRef"}, + "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GithubAddChangedFiles", "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.GithubOwners", "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.SecretRef"}, } } @@ -782,6 +796,64 @@ func schema_pkg_apis_triggers_v1beta1_GitLabInterceptor(ref common.ReferenceCall } } +func schema_pkg_apis_triggers_v1beta1_GithubAddChangedFiles(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "enabled": { + SchemaProps: spec.SchemaProps{ + Type: []string{"boolean"}, + Format: "", + }, + }, + "personalAccessToken": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.SecretRef"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.SecretRef"}, + } +} + +func schema_pkg_apis_triggers_v1beta1_GithubOwners(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "enabled": { + SchemaProps: spec.SchemaProps{ + Type: []string{"boolean"}, + Format: "", + }, + }, + "personalAccessToken": { + SchemaProps: spec.SchemaProps{ + Description: "This param/variable is required for private repos or when checkType is set to orgMembers or repoMembers or all", + Ref: ref("github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.SecretRef"), + }, + }, + "checkType": { + SchemaProps: spec.SchemaProps{ + Description: "Set the value to one of the supported values (orgMembers, repoMembers, both, none)", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1.SecretRef"}, + } +} + func schema_pkg_apis_triggers_v1beta1_InterceptorParams(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/swagger.json b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/swagger.json index d68c7d6515..4eda03cff0 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/swagger.json +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/swagger.json @@ -195,6 +195,17 @@ "description": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.", "type": "boolean" }, + "env": { + "description": "List of environment variables that can be provided to the containers belonging to the pod.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1.EnvVar" + }, + "x-kubernetes-list-type": "atomic", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, "hostAliases": { "description": "HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods.", "type": "array", @@ -272,173 +283,6 @@ } } }, - "v1alpha1.PipelineResource": { - "description": "PipelineResource describes a resource that is an input to or output from a Task.", - "type": "object", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "default": {}, - "$ref": "#/definitions/v1.ObjectMeta" - }, - "spec": { - "description": "Spec holds the desired state of the PipelineResource from the client", - "default": {}, - "$ref": "#/definitions/v1alpha1.PipelineResourceSpec" - }, - "status": { - "description": "Status is deprecated. It usually is used to communicate the observed state of the PipelineResource from the controller, but was unused as there is no controller for PipelineResource.", - "$ref": "#/definitions/v1alpha1.PipelineResourceStatus" - } - } - }, - "v1alpha1.PipelineResourceList": { - "description": "PipelineResourceList contains a list of PipelineResources", - "type": "object", - "required": [ - "items" - ], - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1alpha1.PipelineResource" - } - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "default": {}, - "$ref": "#/definitions/v1.ListMeta" - } - } - }, - "v1alpha1.PipelineResourceSpec": { - "description": "PipelineResourceSpec defines an individual resources used in the pipeline.", - "type": "object", - "required": [ - "type", - "params" - ], - "properties": { - "description": { - "description": "Description is a user-facing description of the resource that may be used to populate a UI.", - "type": "string" - }, - "params": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1alpha1.ResourceParam" - }, - "x-kubernetes-list-type": "atomic" - }, - "secrets": { - "description": "Secrets to fetch to populate some of resource fields", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1alpha1.SecretParam" - }, - "x-kubernetes-list-type": "atomic" - }, - "type": { - "type": "string", - "default": "" - } - } - }, - "v1alpha1.PipelineResourceStatus": { - "description": "PipelineResourceStatus does not contain anything because PipelineResources on their own do not have a status Deprecated", - "type": "object" - }, - "v1alpha1.ResourceDeclaration": { - "description": "ResourceDeclaration defines an input or output PipelineResource declared as a requirement by another type such as a Task or Condition. The Name field will be used to refer to these PipelineResources within the type's definition, and when provided as an Input, the Name will be the path to the volume mounted containing this PipelineResource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).", - "type": "object", - "required": [ - "name", - "type" - ], - "properties": { - "description": { - "description": "Description is a user-facing description of the declared resource that may be used to populate a UI.", - "type": "string" - }, - "name": { - "description": "Name declares the name by which a resource is referenced in the definition. Resources may be referenced by name in the definition of a Task's steps.", - "type": "string", - "default": "" - }, - "optional": { - "description": "Optional declares the resource as optional. By default optional is set to false which makes a resource required. optional: true - the resource is considered optional optional: false - the resource is considered required (equivalent of not specifying it)", - "type": "boolean" - }, - "targetPath": { - "description": "TargetPath is the path in workspace directory where the resource will be copied.", - "type": "string" - }, - "type": { - "description": "Type is the type of this resource;", - "type": "string", - "default": "" - } - } - }, - "v1alpha1.ResourceParam": { - "description": "ResourceParam declares a string value to use for the parameter called Name, and is used in the specific context of PipelineResources.", - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string", - "default": "" - }, - "value": { - "type": "string", - "default": "" - } - } - }, - "v1alpha1.SecretParam": { - "description": "SecretParam indicates which secret can be used to populate a field of the resource", - "type": "object", - "required": [ - "fieldName", - "secretKey", - "secretName" - ], - "properties": { - "fieldName": { - "type": "string", - "default": "" - }, - "secretKey": { - "type": "string", - "default": "" - }, - "secretName": { - "type": "string", - "default": "" - } - } - }, "v1beta1.ChildStatusReference": { "description": "ChildStatusReference is used to point to the statuses of individual TaskRuns and Runs within this PipelineRun.", "type": "object", @@ -512,7 +356,7 @@ } }, "v1beta1.ClusterTask": { - "description": "ClusterTask is a Task with a cluster scope. ClusterTasks are used to represent Tasks that should be publicly addressable from any namespace in the cluster. Deprecated: Please use the cluster resolver instead.", + "description": "ClusterTask is a Task with a cluster scope. ClusterTasks are used to represent Tasks that should be publicly addressable from any namespace in the cluster.\n\nDeprecated: Please use the cluster resolver instead.", "type": "object", "properties": { "apiVersion": { @@ -737,10 +581,6 @@ }, "x-kubernetes-list-type": "atomic" }, - "resources": { - "description": "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.", - "$ref": "#/definitions/v1beta1.TaskResources" - }, "results": { "description": "Results are values that this Task can output", "type": "array", @@ -797,47 +637,40 @@ } } }, - "v1beta1.InternalTaskModifier": { - "description": "InternalTaskModifier implements TaskModifier for resources that are built-in to Tekton Pipelines.", + "v1beta1.Matrix": { + "description": "Matrix is used to fan out Tasks in a Pipeline", "type": "object", - "required": [ - "stepsToPrepend", - "stepsToAppend", - "volumes" - ], "properties": { - "stepsToAppend": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.Step" - }, - "x-kubernetes-list-type": "atomic" - }, - "stepsToPrepend": { + "include": { + "description": "Include is a list of MatrixInclude which allows passing in specific combinations of Parameters into the Matrix. Note that Include is in preview mode and not yet supported.", "type": "array", "items": { "default": {}, - "$ref": "#/definitions/v1beta1.Step" + "$ref": "#/definitions/v1beta1.MatrixInclude" }, "x-kubernetes-list-type": "atomic" }, - "volumes": { + "params": { + "description": "Params is a list of parameters used to fan out the pipelineTask Params takes only `Parameters` of type `\"array\"` Each array element is supplied to the `PipelineTask` by substituting `params` of type `\"string\"` in the underlying `Task`. The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting.", "type": "array", "items": { "default": {}, - "$ref": "#/definitions/v1.Volume" + "$ref": "#/definitions/v1beta1.Param" }, "x-kubernetes-list-type": "atomic" } } }, - "v1beta1.Matrix": { - "description": "Matrix is used to fan out Tasks in a Pipeline", + "v1beta1.MatrixInclude": { + "description": "MatrixInclude allows passing in a specific combinations of Parameters into the Matrix. Note this struct is in preview mode and not yet supported", "type": "object", "properties": { + "name": { + "description": "Name the specified combination", + "type": "string" + }, "params": { - "description": "Params is a list of parameters used to fan out the pipelineTask Params takes only `Parameters` of type `\"array\"` Each array element is supplied to the `PipelineTask` by substituting `params` of type `\"string\"` in the underlying `Task`. The names of the `params` in the `Matrix` must match the names of the `params` in the underlying `Task` that they will be substituting.", + "description": "Params takes only `Parameters` of type `\"string\"` The names of the `params` must match the names of the `params` in the underlying `Task`", "type": "array", "items": { "default": {}, @@ -958,30 +791,6 @@ } } }, - "v1beta1.PipelineDeclaredResource": { - "description": "PipelineDeclaredResource is used by a Pipeline to declare the types of the PipelineResources that it will required to run and names which can be used to refer to these PipelineResources in PipelineTaskResourceBindings.", - "type": "object", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "description": "Name is the name that will be used by the Pipeline to refer to this resource. It does not directly correspond to the name of any PipelineResources Task inputs or outputs, and it does not correspond to the actual names of the PipelineResources that will be bound in the PipelineRun.", - "type": "string", - "default": "" - }, - "optional": { - "description": "Optional declares the resource as optional. optional: true - the resource is considered optional optional: false - the resource is considered required (default/equivalent of not specifying it)", - "type": "boolean" - }, - "type": { - "description": "Type is the type of the PipelineResource.", - "type": "string", - "default": "" - } - } - }, "v1beta1.PipelineList": { "description": "PipelineList contains a list of Pipeline", "type": "object", @@ -1019,39 +828,7 @@ "type": "string" }, "bundle": { - "description": "Bundle url reference to a Tekton Bundle. Deprecated: Please use ResolverRef with the bundles resolver instead.", - "type": "string" - }, - "name": { - "description": "Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names", - "type": "string" - } - } - }, - "v1beta1.PipelineResourceBinding": { - "description": "PipelineResourceBinding connects a reference to an instance of a PipelineResource with a PipelineResource dependency that the Pipeline has declared", - "type": "object", - "properties": { - "name": { - "description": "Name is the name of the PipelineResource in the Pipeline's declaration", - "type": "string" - }, - "resourceRef": { - "description": "ResourceRef is a reference to the instance of the actual PipelineResource that should be used", - "$ref": "#/definitions/v1beta1.PipelineResourceRef" - }, - "resourceSpec": { - "description": "ResourceSpec is specification of a resource that should be created and consumed by the task", - "$ref": "#/definitions/v1alpha1.PipelineResourceSpec" - } - } - }, - "v1beta1.PipelineResourceRef": { - "description": "PipelineResourceRef can be used to refer to a specific instance of a Resource", - "type": "object", - "properties": { - "apiVersion": { - "description": "API version of the referent", + "description": "Bundle url reference to a Tekton Bundle.\n\nDeprecated: Please use ResolverRef with the bundles resolver instead.", "type": "string" }, "name": { @@ -1061,7 +838,7 @@ } }, "v1beta1.PipelineResourceResult": { - "description": "PipelineResourceResult used to export the image name and digest as json", + "description": "PipelineResourceResult is used to write key/value pairs to TaskRun pod termination messages. The key/value pairs may come from the entrypoint binary, or represent a TaskRunResult. If they represent a TaskRunResult, the key is the name of the result and the value is the JSON-serialized value of the result.", "type": "object", "required": [ "key", @@ -1073,6 +850,7 @@ "default": "" }, "resourceName": { + "description": "ResourceName may be used in tests, but it is not populated in termination messages. It is preserved here for backwards compatibility and will not be ported to v1.", "type": "string" }, "type": { @@ -1186,7 +964,7 @@ } }, "v1beta1.PipelineRunRunStatus": { - "description": "PipelineRunRunStatus contains the name of the PipelineTask for this Run and the Run's Status", + "description": "PipelineRunRunStatus contains the name of the PipelineTask for this CustomRun or Run and the CustomRun or Run's Status", "type": "object", "properties": { "pipelineTaskName": { @@ -1194,8 +972,8 @@ "type": "string" }, "status": { - "description": "Status is the RunStatus for the corresponding Run", - "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.run.v1alpha1.RunStatus" + "description": "Status is the CustomRunStatus for the corresponding CustomRun or Run", + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.run.v1beta1.CustomRunStatus" }, "whenExpressions": { "description": "WhenExpressions is the list of checks guarding the execution of the PipelineTask", @@ -1231,15 +1009,6 @@ "description": "PodTemplate holds pod specific configuration", "$ref": "#/definitions/pod.Template" }, - "resources": { - "description": "Resources is a list of bindings specifying which actual instances of PipelineResources to use for the resources the Pipeline has declared it needs.", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.PipelineResourceBinding" - }, - "x-kubernetes-list-type": "atomic" - }, "serviceAccountName": { "type": "string" }, @@ -1257,7 +1026,7 @@ "x-kubernetes-list-type": "atomic" }, "timeout": { - "description": "Timeout Deprecated: use pipelineRunSpec.Timeouts.Pipeline instead Time after which the Pipeline times out. Defaults to never. Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + "description": "Timeout is the Time after which the Pipeline times out. Defaults to never. Refer to Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration\n\nDeprecated: use pipelineRunSpec.Timeouts.Pipeline instead", "$ref": "#/definitions/v1.Duration" }, "timeouts": { @@ -1337,7 +1106,7 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "runs": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunRunStatus with the run name as the key", + "description": "Runs is a map of PipelineRunRunStatus with the run name as the key\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunRunStatus" @@ -1352,12 +1121,20 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the PipelineRun is actually started.", "$ref": "#/definitions/v1.Time" }, "taskRuns": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunTaskRunStatus with the taskRun name as the key", + "description": "TaskRuns is a map of PipelineRunTaskRunStatus with the taskRun name as the key.\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunTaskRunStatus" @@ -1404,7 +1181,7 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "runs": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunRunStatus with the run name as the key", + "description": "Runs is a map of PipelineRunRunStatus with the run name as the key\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunRunStatus" @@ -1419,12 +1196,20 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the PipelineRun is actually started.", "$ref": "#/definitions/v1.Time" }, "taskRuns": { - "description": "Deprecated - use ChildReferences instead. map of PipelineRunTaskRunStatus with the taskRun name as the key", + "description": "TaskRuns is a map of PipelineRunTaskRunStatus with the taskRun name as the key.\n\nDeprecated: use ChildReferences instead. As of v0.45.0, this field is no longer populated and is only included for backwards compatibility with older server versions.", "type": "object", "additionalProperties": { "$ref": "#/definitions/v1beta1.PipelineRunTaskRunStatus" @@ -1481,15 +1266,6 @@ }, "x-kubernetes-list-type": "atomic" }, - "resources": { - "description": "Resources declares the names and types of the resources given to the Pipeline's tasks as inputs and outputs.", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.PipelineDeclaredResource" - }, - "x-kubernetes-list-type": "atomic" - }, "results": { "description": "Results are values that this pipeline can output once run", "type": "array", @@ -1540,10 +1316,6 @@ }, "x-kubernetes-list-type": "atomic" }, - "resources": { - "description": "Resources declares the resources given to this task as inputs and outputs.", - "$ref": "#/definitions/v1beta1.PipelineTaskResources" - }, "retries": { "description": "Retries represents how many times this task should be retried in case of task failure: ConditionSucceeded set to False", "type": "integer", @@ -1589,35 +1361,6 @@ } } }, - "v1beta1.PipelineTaskInputResource": { - "description": "PipelineTaskInputResource maps the name of a declared PipelineResource input dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used. This input may come from a previous task.", - "type": "object", - "required": [ - "name", - "resource" - ], - "properties": { - "from": { - "description": "From is the list of PipelineTask names that the resource has to come from. (Implies an ordering in the execution graph.)", - "type": "array", - "items": { - "type": "string", - "default": "" - }, - "x-kubernetes-list-type": "atomic" - }, - "name": { - "description": "Name is the name of the PipelineResource as declared by the Task.", - "type": "string", - "default": "" - }, - "resource": { - "description": "Resource is the name of the DeclaredPipelineResource to use.", - "type": "string", - "default": "" - } - } - }, "v1beta1.PipelineTaskMetadata": { "description": "PipelineTaskMetadata contains the labels or annotations for an EmbeddedTask", "type": "object", @@ -1638,26 +1381,6 @@ } } }, - "v1beta1.PipelineTaskOutputResource": { - "description": "PipelineTaskOutputResource maps the name of a declared PipelineResource output dependency in a Task to the resource in the Pipeline's DeclaredPipelineResources that should be used.", - "type": "object", - "required": [ - "name", - "resource" - ], - "properties": { - "name": { - "description": "Name is the name of the PipelineResource as declared by the Task.", - "type": "string", - "default": "" - }, - "resource": { - "description": "Resource is the name of the DeclaredPipelineResource to use.", - "type": "string", - "default": "" - } - } - }, "v1beta1.PipelineTaskParam": { "description": "PipelineTaskParam is used to provide arbitrary string parameters to a Task.", "type": "object", @@ -1676,30 +1399,6 @@ } } }, - "v1beta1.PipelineTaskResources": { - "description": "PipelineTaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.", - "type": "object", - "properties": { - "inputs": { - "description": "Inputs holds the mapping from the PipelineResources declared in DeclaredPipelineResources to the input PipelineResources required by the Task.", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.PipelineTaskInputResource" - }, - "x-kubernetes-list-type": "atomic" - }, - "outputs": { - "description": "Outputs holds the mapping from the PipelineResources declared in DeclaredPipelineResources to the input PipelineResources required by the Task.", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.PipelineTaskOutputResource" - }, - "x-kubernetes-list-type": "atomic" - } - } - }, "v1beta1.PipelineTaskRun": { "description": "PipelineTaskRun reports the results of running a step in the Task. Each task has the potential to succeed or fail (based on the exit code) and produces logs.", "type": "object", @@ -1748,7 +1447,7 @@ } }, "v1beta1.PipelineWorkspaceDeclaration": { - "description": "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding. Deprecated: use PipelineWorkspaceDeclaration type instead", + "description": "WorkspacePipelineDeclaration creates a named slot in a Pipeline that a PipelineRun is expected to populate with a workspace binding.\n\nDeprecated: use PipelineWorkspaceDeclaration type instead", "type": "object", "required": [ "name" @@ -1785,6 +1484,10 @@ "configSource": { "description": "ConfigSource identifies the source where a resource came from.", "$ref": "#/definitions/v1beta1.ConfigSource" + }, + "featureFlags": { + "description": "FeatureFlags identifies the feature flags that were used during the task/pipeline run", + "$ref": "#/definitions/github.com.tektoncd.pipeline.pkg.apis.config.FeatureFlags" } } }, @@ -2105,11 +1808,11 @@ "type": "string" }, "lifecycle": { - "description": "Deprecated. This field will be removed in a future release. Actions that the management system should take in response to container lifecycle events. Cannot be updated.", + "description": "Actions that the management system should take in response to container lifecycle events. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Lifecycle" }, "livenessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container liveness. Step will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container liveness. Step will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "name": { @@ -2122,7 +1825,7 @@ "type": "string" }, "ports": { - "description": "Deprecated. This field will be removed in a future release. List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + "description": "List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "type": "array", "items": { "default": {}, @@ -2137,7 +1840,7 @@ "x-kubernetes-patch-strategy": "merge" }, "readinessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container service readiness. Step will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container service readiness. Step will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "resources": { @@ -2154,7 +1857,7 @@ "$ref": "#/definitions/v1.SecurityContext" }, "startupProbe": { - "description": "Deprecated. This field will be removed in a future release. DeprecatedStartupProbe indicates that the Pod this Step runs in has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "DeprecatedStartupProbe indicates that the Pod this Step runs in has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "stderrConfig": { @@ -2162,11 +1865,11 @@ "$ref": "#/definitions/v1beta1.StepOutputConfig" }, "stdin": { - "description": "Deprecated. This field will be removed in a future release. Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.", + "description": "Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "stdinOnce": { - "description": "Deprecated. This field will be removed in a future release. Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + "description": "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "stdoutConfig": { @@ -2174,11 +1877,11 @@ "$ref": "#/definitions/v1beta1.StepOutputConfig" }, "terminationMessagePath": { - "description": "Deprecated. This field will be removed in a future release and can't be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and can't be meaningfully used.", "type": "string" }, "terminationMessagePolicy": { - "description": "Deprecated. This field will be removed in a future release and can't be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and can't be meaningfully used.", "type": "string" }, "timeout": { @@ -2186,7 +1889,7 @@ "$ref": "#/definitions/v1.Duration" }, "tty": { - "description": "Deprecated. This field will be removed in a future release. Whether this container should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.", + "description": "Whether this container should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "volumeDevices": { @@ -2317,20 +2020,20 @@ "type": "string" }, "lifecycle": { - "description": "Deprecated. This field will be removed in a future release. Actions that the management system should take in response to container lifecycle events. Cannot be updated.", + "description": "Actions that the management system should take in response to container lifecycle events. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Lifecycle" }, "livenessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "name": { - "description": "Deprecated. This field will be removed in a future release. Default name for each Step specified as a DNS_LABEL. Each Step in a Task must have a unique name. Cannot be updated.", + "description": "Default name for each Step specified as a DNS_LABEL. Each Step in a Task must have a unique name. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "type": "string", "default": "" }, "ports": { - "description": "Deprecated. This field will be removed in a future release. List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + "description": "List of ports to expose from the Step's container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.\n\nDeprecated: This field will be removed in a future release.", "type": "array", "items": { "default": {}, @@ -2345,7 +2048,7 @@ "x-kubernetes-patch-strategy": "merge" }, "readinessProbe": { - "description": "Deprecated. This field will be removed in a future release. Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "resources": { @@ -2358,27 +2061,27 @@ "$ref": "#/definitions/v1.SecurityContext" }, "startupProbe": { - "description": "Deprecated. This field will be removed in a future release. DeprecatedStartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "description": "DeprecatedStartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n\nDeprecated: This field will be removed in a future release.", "$ref": "#/definitions/v1.Probe" }, "stdin": { - "description": "Deprecated. This field will be removed in a future release. Whether this Step should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the Step will always result in EOF. Default is false.", + "description": "Whether this Step should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the Step will always result in EOF. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "stdinOnce": { - "description": "Deprecated. This field will be removed in a future release. Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + "description": "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "terminationMessagePath": { - "description": "Deprecated. This field will be removed in a future release and cannot be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and cannot be meaningfully used.", "type": "string" }, "terminationMessagePolicy": { - "description": "Deprecated. This field will be removed in a future release and cannot be meaningfully used.", + "description": "Deprecated: This field will be removed in a future release and cannot be meaningfully used.", "type": "string" }, "tty": { - "description": "Deprecated. This field will be removed in a future release. Whether this Step should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.", + "description": "Whether this Step should allocate a DeprecatedTTY for itself, also requires 'stdin' to be true. Default is false.\n\nDeprecated: This field will be removed in a future release.", "type": "boolean" }, "volumeDevices": { @@ -2469,7 +2172,7 @@ "type": "string" }, "bundle": { - "description": "Bundle url reference to a Tekton Bundle. Deprecated: Please use ResolverRef with the bundles resolver instead.", + "description": "Bundle url reference to a Tekton Bundle.\n\nDeprecated: Please use ResolverRef with the bundles resolver instead.", "type": "string" }, "kind": { @@ -2482,89 +2185,6 @@ } } }, - "v1beta1.TaskResource": { - "description": "TaskResource defines an input or output Resource declared as a requirement by a Task. The Name field will be used to refer to these Resources within the Task definition, and when provided as an Input, the Name will be the path to the volume mounted containing this Resource as an input (e.g. an input Resource named `workspace` will be mounted at `/workspace`).", - "type": "object", - "required": [ - "name", - "type" - ], - "properties": { - "description": { - "description": "Description is a user-facing description of the declared resource that may be used to populate a UI.", - "type": "string" - }, - "name": { - "description": "Name declares the name by which a resource is referenced in the definition. Resources may be referenced by name in the definition of a Task's steps.", - "type": "string", - "default": "" - }, - "optional": { - "description": "Optional declares the resource as optional. By default optional is set to false which makes a resource required. optional: true - the resource is considered optional optional: false - the resource is considered required (equivalent of not specifying it)", - "type": "boolean" - }, - "targetPath": { - "description": "TargetPath is the path in workspace directory where the resource will be copied.", - "type": "string" - }, - "type": { - "description": "Type is the type of this resource;", - "type": "string", - "default": "" - } - } - }, - "v1beta1.TaskResourceBinding": { - "description": "TaskResourceBinding points to the PipelineResource that will be used for the Task input or output called Name.", - "type": "object", - "properties": { - "name": { - "description": "Name is the name of the PipelineResource in the Pipeline's declaration", - "type": "string" - }, - "paths": { - "description": "Paths will probably be removed in #1284, and then PipelineResourceBinding can be used instead. The optional Path field corresponds to a path on disk at which the Resource can be found (used when providing the resource via mounted volume, overriding the default logic to fetch the Resource).", - "type": "array", - "items": { - "type": "string", - "default": "" - }, - "x-kubernetes-list-type": "atomic" - }, - "resourceRef": { - "description": "ResourceRef is a reference to the instance of the actual PipelineResource that should be used", - "$ref": "#/definitions/v1beta1.PipelineResourceRef" - }, - "resourceSpec": { - "description": "ResourceSpec is specification of a resource that should be created and consumed by the task", - "$ref": "#/definitions/v1alpha1.PipelineResourceSpec" - } - } - }, - "v1beta1.TaskResources": { - "description": "TaskResources allows a Pipeline to declare how its DeclaredPipelineResources should be provided to a Task as its inputs and outputs.", - "type": "object", - "properties": { - "inputs": { - "description": "Inputs holds the mapping from the PipelineResources declared in DeclaredPipelineResources to the input PipelineResources required by the Task.", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.TaskResource" - }, - "x-kubernetes-list-type": "atomic" - }, - "outputs": { - "description": "Outputs holds the mapping from the PipelineResources declared in DeclaredPipelineResources to the input PipelineResources required by the Task.", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.TaskResource" - }, - "x-kubernetes-list-type": "atomic" - } - } - }, "v1beta1.TaskResult": { "description": "TaskResult used to describe the results of a task", "type": "object", @@ -2635,28 +2255,6 @@ } } }, - "v1beta1.TaskRunInputs": { - "description": "TaskRunInputs holds the input values that this task was invoked with.", - "type": "object", - "properties": { - "params": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.Param" - }, - "x-kubernetes-list-type": "atomic" - }, - "resources": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.TaskResourceBinding" - }, - "x-kubernetes-list-type": "atomic" - } - } - }, "v1beta1.TaskRunList": { "description": "TaskRunList contains a list of TaskRun", "type": "object", @@ -2685,44 +2283,6 @@ } } }, - "v1beta1.TaskRunOutputs": { - "description": "TaskRunOutputs holds the output values that this task was invoked with.", - "type": "object", - "properties": { - "resources": { - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.TaskResourceBinding" - }, - "x-kubernetes-list-type": "atomic" - } - } - }, - "v1beta1.TaskRunResources": { - "description": "TaskRunResources allows a TaskRun to declare inputs and outputs TaskResourceBinding", - "type": "object", - "properties": { - "inputs": { - "description": "Inputs holds the inputs resources this task was invoked with", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.TaskResourceBinding" - }, - "x-kubernetes-list-type": "atomic" - }, - "outputs": { - "description": "Outputs holds the inputs resources this task was invoked with", - "type": "array", - "items": { - "default": {}, - "$ref": "#/definitions/v1beta1.TaskResourceBinding" - }, - "x-kubernetes-list-type": "atomic" - } - } - }, "v1beta1.TaskRunResult": { "description": "TaskRunResult used to describe the results of a task", "type": "object", @@ -2790,8 +2350,10 @@ "description": "PodTemplate holds pod specific configuration", "$ref": "#/definitions/pod.Template" }, - "resources": { - "$ref": "#/definitions/v1beta1.TaskRunResources" + "retries": { + "description": "Retries represents how many times this TaskRun should be retried in the event of Task failure.", + "type": "integer", + "format": "int32" }, "serviceAccountName": { "type": "string", @@ -2807,7 +2369,7 @@ "x-kubernetes-list-type": "atomic" }, "status": { - "description": "Used for cancelling a taskrun (and maybe more later on)", + "description": "Used for cancelling a TaskRun (and maybe more later on)", "type": "string" }, "statusMessage": { @@ -2831,7 +2393,7 @@ "$ref": "#/definitions/v1beta1.TaskSpec" }, "timeout": { - "description": "Time after which the build times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", + "description": "Time after which one retry attempt times out. Defaults to 1 hour. Specified build timeout should be less than 24h. Refer Go's ParseDuration documentation for expected format: https://golang.org/pkg/time/#ParseDuration", "$ref": "#/definitions/v1.Duration" }, "workspaces": { @@ -2861,7 +2423,7 @@ } }, "cloudEvents": { - "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.", + "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.\n\nDeprecated: Removed in v0.44.0.", "type": "array", "items": { "default": {}, @@ -2898,7 +2460,7 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "resourcesResult": { - "description": "Results from Resources built during the taskRun. currently includes the digest of build container images", + "description": "Results from Resources built during the TaskRun. currently includes the digest of build container images", "type": "array", "items": { "default": {}, @@ -2924,6 +2486,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the build is actually started.", "$ref": "#/definitions/v1.Time" @@ -2960,7 +2530,7 @@ ], "properties": { "cloudEvents": { - "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.", + "description": "CloudEvents describe the state of each cloud event requested via a CloudEventResource.\n\nDeprecated: Removed in v0.44.0.", "type": "array", "items": { "default": {}, @@ -2982,7 +2552,7 @@ "$ref": "#/definitions/v1beta1.Provenance" }, "resourcesResult": { - "description": "Results from Resources built during the taskRun. currently includes the digest of build container images", + "description": "Results from Resources built during the TaskRun. currently includes the digest of build container images", "type": "array", "items": { "default": {}, @@ -3008,6 +2578,14 @@ }, "x-kubernetes-list-type": "atomic" }, + "spanContext": { + "description": "SpanContext contains tracing span context fields", + "type": "object", + "additionalProperties": { + "type": "string", + "default": "" + } + }, "startTime": { "description": "StartTime is the time the build is actually started.", "$ref": "#/definitions/v1.Time" @@ -3073,10 +2651,6 @@ }, "x-kubernetes-list-type": "atomic" }, - "resources": { - "description": "Resources is a list input and output resource to run the task Resources are represented in TaskRuns as bindings to instances of PipelineResources.", - "$ref": "#/definitions/v1beta1.TaskResources" - }, "results": { "description": "Results are values that this Task can output", "type": "array", diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_defaults.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_defaults.go index 1bd52d80fe..9c2f036b4a 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_defaults.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_defaults.go @@ -20,5 +20,7 @@ import ( "context" ) +// revive:disable:unused-parameter + // SetDefaults initializes TriggerBinding tb with its default values. func (tb *TriggerBinding) SetDefaults(ctx context.Context) {} diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_validation.go index b7ffd55159..d13c5a0c37 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_binding_validation.go @@ -22,21 +22,28 @@ import ( "strings" "github.com/tektoncd/pipeline/pkg/apis/validate" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/util/sets" "knative.dev/pkg/apis" + "knative.dev/pkg/webhook/resourcesemantics" ) +var _ resourcesemantics.VerbLimited = (*TriggerBinding)(nil) + +// SupportedVerbs returns the operations that validation should be called for +func (tb *TriggerBinding) SupportedVerbs() []admissionregistrationv1.OperationType { + return []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update} +} + // Validate TriggerBinding. func (tb *TriggerBinding) Validate(ctx context.Context) *apis.FieldError { - if apis.IsInDelete(ctx) { - return nil - } - errs := validate.ObjectMetadata(tb.GetObjectMeta()).ViaField("metadata") return errs.Also(tb.Spec.Validate(ctx).ViaField("spec")) } +// revive:disable:unused-parameter + // Validate TriggerBindingSpec. func (s *TriggerBindingSpec) Validate(ctx context.Context) (errs *apis.FieldError) { if equality.Semantic.DeepEqual(s, &TriggerBindingSpec{}) { diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_defaults.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_defaults.go index de7097e8a2..27c76af0f6 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_defaults.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_defaults.go @@ -20,5 +20,7 @@ import ( "context" ) +// revive:disable:unused-parameter + // SetDefaults initializes TriggerTemplate with default values. func (tt *TriggerTemplate) SetDefaults(ctx context.Context) {} diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_validation.go index 5378916117..6200787c85 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_template_validation.go @@ -24,25 +24,32 @@ import ( "github.com/tektoncd/pipeline/pkg/apis/validate" "github.com/tektoncd/triggers/pkg/apis/config" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" "knative.dev/pkg/apis" + "knative.dev/pkg/webhook/resourcesemantics" ) // paramsRegexp captures TriggerTemplate parameter names $(tt.params.NAME) var paramsRegexp = regexp.MustCompile(`\$\(tt.params.(?P[_a-zA-Z][_a-zA-Z0-9.-]*)\)`) +var _ resourcesemantics.VerbLimited = (*TriggerTemplate)(nil) + +// SupportedVerbs returns the operations that validation should be called for +func (t *TriggerTemplate) SupportedVerbs() []admissionregistrationv1.OperationType { + return []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update} +} + // Validate validates a TriggerTemplate. func (t *TriggerTemplate) Validate(ctx context.Context) *apis.FieldError { - if apis.IsInDelete(ctx) { - return nil - } - errs := validate.ObjectMetadata(t.GetObjectMeta()).ViaField("metadata") return errs.Also(t.Spec.validate(ctx).ViaField("spec")) } +// revive:disable:unused-parameter + // Validate validates a TriggerTemplateSpec. func (s *TriggerTemplateSpec) validate(ctx context.Context) (errs *apis.FieldError) { if equality.Semantic.DeepEqual(s, &TriggerTemplateSpec{}) { diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_types.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_types.go index 2eb83d6aff..0a57458068 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_types.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_types.go @@ -166,7 +166,35 @@ type BitbucketInterceptor struct { type GitHubInterceptor struct { SecretRef *SecretRef `json:"secretRef,omitempty"` // +listType=atomic - EventTypes []string `json:"eventTypes,omitempty"` + EventTypes []string `json:"eventTypes,omitempty"` + AddChangedFiles GithubAddChangedFiles `json:"addChangedFiles,omitempty"` + GithubOwners GithubOwners `json:"githubOwners,omitempty"` +} + +type CheckType string + +const ( + // Set the checkType to orgMembers to allow org members to submit or comment on PR to proceed + OrgMembers CheckType = "orgMembers" + // Set the checkType to repoMembers to allow repo members to submit or comment on PR to proceed + RepoMembers CheckType = "repoMembers" + // Set the checkType to all if both repo members or org members can submit or comment on PR to proceed + All CheckType = "all" + // Set the checkType to none if neither of repo members or org members can not submit or comment on PR to proceed + None CheckType = "none" +) + +type GithubOwners struct { + Enabled bool `json:"enabled,omitempty"` + // This param/variable is required for private repos or when checkType is set to orgMembers or repoMembers or all + PersonalAccessToken *SecretRef `json:"personalAccessToken,omitempty"` + // Set the value to one of the supported values (orgMembers, repoMembers, both, none) + CheckType CheckType `json:"checkType,omitempty"` +} + +type GithubAddChangedFiles struct { + Enabled bool `json:"enabled,omitempty"` + PersonalAccessToken *SecretRef `json:"personalAccessToken,omitempty"` } // GitLabInterceptor provides a webhook to intercept and pre-process events diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_validation.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_validation.go index 3dad437e3d..c97e1f5d9f 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_validation.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/trigger_validation.go @@ -23,15 +23,20 @@ import ( pipelinev1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" "github.com/tektoncd/pipeline/pkg/apis/validate" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" "knative.dev/pkg/apis" + "knative.dev/pkg/webhook/resourcesemantics" ) +var _ resourcesemantics.VerbLimited = (*Trigger)(nil) + +// SupportedVerbs returns the operations that validation should be called for +func (t *Trigger) SupportedVerbs() []admissionregistrationv1.OperationType { + return []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update} +} + // Validate validates a Trigger func (t *Trigger) Validate(ctx context.Context) *apis.FieldError { - if apis.IsInDelete(ctx) { - return nil - } - errs := validate.ObjectMetadata(t.GetObjectMeta()).ViaField("metadata") return errs.Also(t.Spec.validate(ctx).ViaField("spec")) } @@ -71,6 +76,8 @@ func (t TriggerSpecTemplate) validate(ctx context.Context) (errs *apis.FieldErro return errs } +// revive:disable:unused-parameter + func (t triggerSpecBindingArray) validate(ctx context.Context) (errs *apis.FieldError) { for i, b := range t { switch { diff --git a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/zz_generated.deepcopy.go b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/zz_generated.deepcopy.go index 099da278eb..bd26eca03e 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/zz_generated.deepcopy.go +++ b/vendor/github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1/zz_generated.deepcopy.go @@ -409,6 +409,8 @@ func (in *GitHubInterceptor) DeepCopyInto(out *GitHubInterceptor) { *out = make([]string, len(*in)) copy(*out, *in) } + in.AddChangedFiles.DeepCopyInto(&out.AddChangedFiles) + in.GithubOwners.DeepCopyInto(&out.GithubOwners) return } @@ -448,6 +450,48 @@ func (in *GitLabInterceptor) DeepCopy() *GitLabInterceptor { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GithubAddChangedFiles) DeepCopyInto(out *GithubAddChangedFiles) { + *out = *in + if in.PersonalAccessToken != nil { + in, out := &in.PersonalAccessToken, &out.PersonalAccessToken + *out = new(SecretRef) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GithubAddChangedFiles. +func (in *GithubAddChangedFiles) DeepCopy() *GithubAddChangedFiles { + if in == nil { + return nil + } + out := new(GithubAddChangedFiles) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GithubOwners) DeepCopyInto(out *GithubOwners) { + *out = *in + if in.PersonalAccessToken != nil { + in, out := &in.PersonalAccessToken, &out.PersonalAccessToken + *out = new(SecretRef) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GithubOwners. +func (in *GithubOwners) DeepCopy() *GithubOwners { + if in == nil { + return nil + } + out := new(GithubOwners) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *InterceptorParams) DeepCopyInto(out *InterceptorParams) { *out = *in diff --git a/vendor/github.com/tektoncd/triggers/pkg/client/clientset/versioned/scheme/register.go b/vendor/github.com/tektoncd/triggers/pkg/client/clientset/versioned/scheme/register.go index b3ba74848a..da59cdf0e0 100644 --- a/vendor/github.com/tektoncd/triggers/pkg/client/clientset/versioned/scheme/register.go +++ b/vendor/github.com/tektoncd/triggers/pkg/client/clientset/versioned/scheme/register.go @@ -39,14 +39,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. diff --git a/vendor/github.com/vbatts/tar-split/archive/tar/reader.go b/vendor/github.com/vbatts/tar-split/archive/tar/reader.go index ea64a38207..fcf3215539 100644 --- a/vendor/github.com/vbatts/tar-split/archive/tar/reader.go +++ b/vendor/github.com/vbatts/tar-split/archive/tar/reader.go @@ -41,7 +41,7 @@ type fileReader interface { // RawBytes accesses the raw bytes of the archive, apart from the file payload itself. // This includes the header and padding. // -// This call resets the current rawbytes buffer +// # This call resets the current rawbytes buffer // // Only when RawAccounting is enabled, otherwise this returns nil func (tr *Reader) RawBytes() []byte { @@ -126,7 +126,9 @@ func (tr *Reader) next() (*Header, error) { return nil, err } if hdr.Typeflag == TypeXGlobalHeader { - mergePAX(hdr, paxHdrs) + if err = mergePAX(hdr, paxHdrs); err != nil { + return nil, err + } return &Header{ Name: hdr.Name, Typeflag: hdr.Typeflag, @@ -381,9 +383,9 @@ func parsePAX(r io.Reader) (map[string]string, error) { // header in case further processing is required. // // The err will be set to io.EOF only when one of the following occurs: -// * Exactly 0 bytes are read and EOF is hit. -// * Exactly 1 block of zeros is read and EOF is hit. -// * At least 2 blocks of zeros are read. +// - Exactly 0 bytes are read and EOF is hit. +// - Exactly 1 block of zeros is read and EOF is hit. +// - At least 2 blocks of zeros are read. func (tr *Reader) readHeader() (*Header, *block, error) { // Two blocks of zero bytes marks the end of the archive. n, err := io.ReadFull(tr.r, tr.blk[:]) diff --git a/vendor/github.com/xanzy/go-gitlab/.gitignore b/vendor/github.com/xanzy/go-gitlab/.gitignore new file mode 100644 index 0000000000..76a9f4df79 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/.gitignore @@ -0,0 +1,33 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof + +# IDE specific files and folders +.idea +*.iml +*.swp +*.swo + +# vendor +vendor diff --git a/vendor/github.com/xanzy/go-gitlab/.golangci.yml b/vendor/github.com/xanzy/go-gitlab/.golangci.yml new file mode 100644 index 0000000000..2d4daeb22e --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/.golangci.yml @@ -0,0 +1,59 @@ +# This file contains all available configuration options +# with their default values. + +# Options for analysis running +run: + concurrency: 4 + timeout: 10m + issues-exit-code: 1 + # Include test files or not, default is true + tests: true + +# Output configuration options +output: + format: line-number + +# All available settings of specific linters +linters-settings: + misspell: + locale: US + ignore-words: + - noteable + unused: + # Treat code as a program (not a library) and report unused exported identifiers + check-exported: false + +linters: + enable: + - asciicheck + - deadcode + - dogsled + - errorlint + - exportloopref + - goconst + - golint + - gosimple + - govet + - ineffassign + - megacheck + - misspell + - nakedret + - nolintlint + - staticcheck + - structcheck + - typecheck + - unconvert + - unused + - varcheck + - whitespace + disable: + - errcheck + disable-all: false + fast: false + +issues: + # Maximum issues count per one linter (set to 0 to disable) + max-issues-per-linter: 0 + + # Maximum count of issues with the same text (set to 0 to disable) + max-same-issues: 0 diff --git a/vendor/github.com/xanzy/go-gitlab/LICENSE b/vendor/github.com/xanzy/go-gitlab/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/LICENSE @@ -0,0 +1,201 @@ + 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/github.com/xanzy/go-gitlab/README.md b/vendor/github.com/xanzy/go-gitlab/README.md new file mode 100644 index 0000000000..a7fd7cfbb5 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/README.md @@ -0,0 +1,202 @@ +# go-gitlab + +A GitLab API client enabling Go programs to interact with GitLab in a simple and uniform way + +[![Build Status](https://github.com/xanzy/go-gitlab/workflows/Lint%20and%20Test/badge.svg)](https://github.com/xanzy/go-gitlab/actions?workflow=Lint%20and%20Test) +[![Sourcegraph](https://sourcegraph.com/github.com/xanzy/go-gitlab/-/badge.svg)](https://sourcegraph.com/github.com/xanzy/go-gitlab?badge) +[![GoDoc](https://godoc.org/github.com/xanzy/go-gitlab?status.svg)](https://godoc.org/github.com/xanzy/go-gitlab) +[![Go Report Card](https://goreportcard.com/badge/github.com/xanzy/go-gitlab)](https://goreportcard.com/report/github.com/xanzy/go-gitlab) + +## NOTE + +Release v0.6.0 (released on 25-08-2017) no longer supports the older V3 GitLab API. If +you need V3 support, please use the `f-api-v3` branch. This release contains some backwards +incompatible changes that were needed to fully support the V4 GitLab API. + +## Coverage + +This API client package covers most of the existing GitLab API calls and is updated regularly +to add new and/or missing endpoints. Currently, the following services are supported: + +- [x] Applications +- [x] Award Emojis +- [x] Branches +- [x] Broadcast Messages +- [x] Commits +- [x] Container Registry +- [x] Custom Attributes +- [x] Deploy Keys +- [x] Deployments +- [x] Discussions (threaded comments) +- [x] Environments +- [x] Epic Issues +- [x] Epics +- [x] Error Tracking +- [x] Events +- [x] Feature Flags +- [x] Geo Nodes +- [x] Generic Packages +- [x] GitLab CI Config Templates +- [x] Gitignores Templates +- [x] Group Access Requests +- [x] Group Issue Boards +- [x] Group Members +- [x] Group Milestones +- [x] Group Wikis +- [x] Group-Level Variables +- [x] Groups +- [x] Instance Clusters +- [x] Invites +- [x] Issue Boards +- [x] Issues +- [x] Jobs +- [x] Keys +- [x] Labels +- [x] License +- [x] Markdown +- [x] Merge Request Approvals +- [x] Merge Requests +- [x] Namespaces +- [x] Notes (comments) +- [x] Notification Settings +- [x] Open Source License Templates +- [x] Packages +- [x] Pages +- [x] Pages Domains +- [x] Personal Access Tokens +- [x] Pipeline Schedules +- [x] Pipeline Triggers +- [x] Pipelines +- [x] Plan limits +- [x] Project Access Requests +- [x] Project Badges +- [x] Project Clusters +- [x] Project Import/export +- [x] Project Members +- [x] Project Milestones +- [x] Project Snippets +- [x] Project Vulnerabilities +- [x] Project-Level Variables +- [x] Projects (including setting Webhooks) +- [x] Protected Branches +- [x] Protected Environments +- [x] Protected Tags +- [x] Repositories +- [x] Repository Files +- [x] Repository Submodules +- [x] Runners +- [x] Search +- [x] Services +- [x] Settings +- [x] Sidekiq Metrics +- [x] System Hooks +- [x] Tags +- [x] Todos +- [x] Topics +- [x] Users +- [x] Validate CI Configuration +- [x] Version +- [x] Wikis + +## Usage + +```go +import "github.com/xanzy/go-gitlab" +``` + +Construct a new GitLab client, then use the various services on the client to +access different parts of the GitLab API. For example, to list all +users: + +```go +git, err := gitlab.NewClient("yourtokengoeshere") +if err != nil { + log.Fatalf("Failed to create client: %v", err) +} +users, _, err := git.Users.ListUsers(&gitlab.ListUsersOptions{}) +``` + +There are a few `With...` option functions that can be used to customize +the API client. For example, to set a custom base URL: + +```go +git, err := gitlab.NewClient("yourtokengoeshere", gitlab.WithBaseURL("https://git.mydomain.com/api/v4")) +if err != nil { + log.Fatalf("Failed to create client: %v", err) +} +users, _, err := git.Users.ListUsers(&gitlab.ListUsersOptions{}) +``` + +Some API methods have optional parameters that can be passed. For example, +to list all projects for user "svanharmelen": + +```go +git := gitlab.NewClient("yourtokengoeshere") +opt := &gitlab.ListProjectsOptions{Search: gitlab.String("svanharmelen")} +projects, _, err := git.Projects.ListProjects(opt) +``` + +### Examples + +The [examples](https://github.com/xanzy/go-gitlab/tree/master/examples) directory +contains a couple for clear examples, of which one is partially listed here as well: + +```go +package main + +import ( + "log" + + "github.com/xanzy/go-gitlab" +) + +func main() { + git, err := gitlab.NewClient("yourtokengoeshere") + if err != nil { + log.Fatalf("Failed to create client: %v", err) + } + + // Create new project + p := &gitlab.CreateProjectOptions{ + Name: gitlab.String("My Project"), + Description: gitlab.String("Just a test project to play with"), + MergeRequestsEnabled: gitlab.Bool(true), + SnippetsEnabled: gitlab.Bool(true), + Visibility: gitlab.Visibility(gitlab.PublicVisibility), + } + project, _, err := git.Projects.CreateProject(p) + if err != nil { + log.Fatal(err) + } + + // Add a new snippet + s := &gitlab.CreateProjectSnippetOptions{ + Title: gitlab.String("Dummy Snippet"), + FileName: gitlab.String("snippet.go"), + Content: gitlab.String("package main...."), + Visibility: gitlab.Visibility(gitlab.PublicVisibility), + } + _, _, err = git.ProjectSnippets.CreateSnippet(project.ID, s) + if err != nil { + log.Fatal(err) + } +} +``` + +For complete usage of go-gitlab, see the full [package docs](https://godoc.org/github.com/xanzy/go-gitlab). + +## ToDo + +- The biggest thing this package still needs is tests :disappointed: + +## Issues + +- If you have an issue: report it on the [issue tracker](https://github.com/xanzy/go-gitlab/issues) + +## Author + +Sander van Harmelen () + +## License + +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 diff --git a/vendor/github.com/xanzy/go-gitlab/access_requests.go b/vendor/github.com/xanzy/go-gitlab/access_requests.go new file mode 100644 index 0000000000..a38f7ec829 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/access_requests.go @@ -0,0 +1,253 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// AccessRequest represents a access request for a group or project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html +type AccessRequest struct { + ID int `json:"id"` + Username string `json:"username"` + Name string `json:"name"` + State string `json:"state"` + CreatedAt *time.Time `json:"created_at"` + RequestedAt *time.Time `json:"requested_at"` + AccessLevel AccessLevelValue `json:"access_level"` +} + +// AccessRequestsService handles communication with the project/group +// access requests related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/access_requests.html +type AccessRequestsService struct { + client *Client +} + +// ListAccessRequestsOptions represents the available +// ListProjectAccessRequests() or ListGroupAccessRequests() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#list-access-requests-for-a-group-or-project +type ListAccessRequestsOptions ListOptions + +// ListProjectAccessRequests gets a list of access requests +// viewable by the authenticated user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#list-access-requests-for-a-group-or-project +func (s *AccessRequestsService) ListProjectAccessRequests(pid interface{}, opt *ListAccessRequestsOptions, options ...RequestOptionFunc) ([]*AccessRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/access_requests", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ars []*AccessRequest + resp, err := s.client.Do(req, &ars) + if err != nil { + return nil, resp, err + } + + return ars, resp, err +} + +// ListGroupAccessRequests gets a list of access requests +// viewable by the authenticated user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#list-access-requests-for-a-group-or-project +func (s *AccessRequestsService) ListGroupAccessRequests(gid interface{}, opt *ListAccessRequestsOptions, options ...RequestOptionFunc) ([]*AccessRequest, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/access_requests", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ars []*AccessRequest + resp, err := s.client.Do(req, &ars) + if err != nil { + return nil, resp, err + } + + return ars, resp, err +} + +// RequestProjectAccess requests access for the authenticated user +// to a group or project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#request-access-to-a-group-or-project +func (s *AccessRequestsService) RequestProjectAccess(pid interface{}, options ...RequestOptionFunc) (*AccessRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/access_requests", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + ar := new(AccessRequest) + resp, err := s.client.Do(req, ar) + if err != nil { + return nil, resp, err + } + + return ar, resp, err +} + +// RequestGroupAccess requests access for the authenticated user +// to a group or project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#request-access-to-a-group-or-project +func (s *AccessRequestsService) RequestGroupAccess(gid interface{}, options ...RequestOptionFunc) (*AccessRequest, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/access_requests", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + ar := new(AccessRequest) + resp, err := s.client.Do(req, ar) + if err != nil { + return nil, resp, err + } + + return ar, resp, err +} + +// ApproveAccessRequestOptions represents the available +// ApproveProjectAccessRequest() and ApproveGroupAccessRequest() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#approve-an-access-request +type ApproveAccessRequestOptions struct { + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` +} + +// ApproveProjectAccessRequest approves an access request for the given user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#approve-an-access-request +func (s *AccessRequestsService) ApproveProjectAccessRequest(pid interface{}, user int, opt *ApproveAccessRequestOptions, options ...RequestOptionFunc) (*AccessRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/access_requests/%d/approve", PathEscape(project), user) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ar := new(AccessRequest) + resp, err := s.client.Do(req, ar) + if err != nil { + return nil, resp, err + } + + return ar, resp, err +} + +// ApproveGroupAccessRequest approves an access request for the given user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#approve-an-access-request +func (s *AccessRequestsService) ApproveGroupAccessRequest(gid interface{}, user int, opt *ApproveAccessRequestOptions, options ...RequestOptionFunc) (*AccessRequest, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/access_requests/%d/approve", PathEscape(group), user) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ar := new(AccessRequest) + resp, err := s.client.Do(req, ar) + if err != nil { + return nil, resp, err + } + + return ar, resp, err +} + +// DenyProjectAccessRequest denies an access request for the given user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#deny-an-access-request +func (s *AccessRequestsService) DenyProjectAccessRequest(pid interface{}, user int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/access_requests/%d", PathEscape(project), user) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DenyGroupAccessRequest denies an access request for the given user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/access_requests.html#deny-an-access-request +func (s *AccessRequestsService) DenyGroupAccessRequest(gid interface{}, user int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/access_requests/%d", PathEscape(group), user) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/applications.go b/vendor/github.com/xanzy/go-gitlab/applications.go new file mode 100644 index 0000000000..cae0ca5f79 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/applications.go @@ -0,0 +1,106 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ApplicationsService handles communication with administrables applications +// of the Gitlab API. +// +// Gitlab API docs : https://docs.gitlab.com/ee/api/applications.html +type ApplicationsService struct { + client *Client +} + +// Application represents a GitLab application +type Application struct { + ID int `json:"id"` + ApplicationID string `json:"application_id"` + ApplicationName string `json:"application_name"` + Secret string `json:"secret"` + CallbackURL string `json:"callback_url"` + Confidential bool `json:"confidential"` +} + +// CreateApplicationOptions represents the available CreateApplication() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/applications.html#create-an-application +type CreateApplicationOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + RedirectURI *string `url:"redirect_uri,omitempty" json:"redirect_uri,omitempty"` + Scopes *string `url:"scopes,omitempty" json:"scopes,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` +} + +// CreateApplication creates a new application owned by the authenticated user. +// +// Gitlab API docs : https://docs.gitlab.com/ee/api/applications.html#create-an-application +func (s *ApplicationsService) CreateApplication(opt *CreateApplicationOptions, options ...RequestOptionFunc) (*Application, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "applications", opt, options) + if err != nil { + return nil, nil, err + } + + a := new(Application) + resp, err := s.client.Do(req, a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// ListApplicationsOptions represents the available +// ListApplications() options. +type ListApplicationsOptions ListOptions + +// ListApplications get a list of administrables applications by the authenticated user +// +// Gitlab API docs : https://docs.gitlab.com/ee/api/applications.html#list-all-applications +func (s *ApplicationsService) ListApplications(opt *ListApplicationsOptions, options ...RequestOptionFunc) ([]*Application, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "applications", opt, options) + if err != nil { + return nil, nil, err + } + + var as []*Application + resp, err := s.client.Do(req, &as) + if err != nil { + return nil, resp, err + } + + return as, resp, err +} + +// DeleteApplication removes a specific application. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/applications.html#delete-an-application +func (s *ApplicationsService) DeleteApplication(application int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("applications/%d", application) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/audit_events.go b/vendor/github.com/xanzy/go-gitlab/audit_events.go new file mode 100644 index 0000000000..7473ecc39f --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/audit_events.go @@ -0,0 +1,199 @@ +package gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// AuditEvent represents an audit event for a group, a project or the instance. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html +type AuditEvent struct { + ID int `json:"id"` + AuthorID int `json:"author_id"` + EntityID int `json:"entity_id"` + EntityType string `json:"entity_type"` + Details AuditEventDetails `json:"details"` + CreatedAt *time.Time `json:"created_at"` +} + +// AuditEventDetails represents the details portion of an audit event for +// a group, a project or the instance. The exact fields that are returned +// for an audit event depend on the action being recorded. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html +type AuditEventDetails struct { + With string `json:"with"` + Add string `json:"add"` + As string `json:"as"` + Change string `json:"change"` + From string `json:"from"` + To string `json:"to"` + Remove string `json:"remove"` + CustomMessage string `json:"custom_message"` + AuthorName string `json:"author_name"` + TargetID interface{} `json:"target_id"` + TargetType string `json:"target_type"` + TargetDetails string `json:"target_details"` + IPAddress string `json:"ip_address"` + EntityPath string `json:"entity_path"` + FailedLogin string `json:"failed_login"` +} + +// AuditEventsService handles communication with the project/group/instance +// audit event related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html +type AuditEventsService struct { + client *Client +} + +// ListAuditEventsOptions represents the available ListProjectAuditEvents(), +// ListGroupAuditEvents() or ListInstanceAuditEvents() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html +type ListAuditEventsOptions struct { + ListOptions + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` +} + +// ListInstanceAuditEvents gets a list of audit events for instance. +// Authentication as Administrator is required. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html#retrieve-all-instance-audit-events +func (s *AuditEventsService) ListInstanceAuditEvents(opt *ListAuditEventsOptions, options ...RequestOptionFunc) ([]*AuditEvent, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "audit_events", opt, options) + if err != nil { + return nil, nil, err + } + + var aes []*AuditEvent + resp, err := s.client.Do(req, &aes) + if err != nil { + return nil, resp, err + } + + return aes, resp, err +} + +// GetInstanceAuditEvent gets a specific instance audit event. +// Authentication as Administrator is required. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html#retrieve-single-instance-audit-event +func (s *AuditEventsService) GetInstanceAuditEvent(event int, options ...RequestOptionFunc) (*AuditEvent, *Response, error) { + u := fmt.Sprintf("audit_events/%d", event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ae := new(AuditEvent) + resp, err := s.client.Do(req, ae) + if err != nil { + return nil, resp, err + } + + return ae, resp, err +} + +// ListGroupAuditEvents gets a list of audit events for the specified group +// viewable by the authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html#retrieve-all-group-audit-events +func (s *AuditEventsService) ListGroupAuditEvents(gid interface{}, opt *ListAuditEventsOptions, options ...RequestOptionFunc) ([]*AuditEvent, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/audit_events", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var aes []*AuditEvent + resp, err := s.client.Do(req, &aes) + if err != nil { + return nil, resp, err + } + + return aes, resp, err +} + +// GetGroupAuditEvent gets a specific group audit event. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html#retrieve-a-specific-group-audit-event +func (s *AuditEventsService) GetGroupAuditEvent(gid interface{}, event int, options ...RequestOptionFunc) (*AuditEvent, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/audit_events/%d", PathEscape(group), event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ae := new(AuditEvent) + resp, err := s.client.Do(req, ae) + if err != nil { + return nil, resp, err + } + + return ae, resp, err +} + +// ListProjectAuditEvents gets a list of audit events for the specified project +// viewable by the authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/audit_events.html#retrieve-all-project-audit-events +func (s *AuditEventsService) ListProjectAuditEvents(pid interface{}, opt *ListAuditEventsOptions, options ...RequestOptionFunc) ([]*AuditEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/audit_events", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var aes []*AuditEvent + resp, err := s.client.Do(req, &aes) + if err != nil { + return nil, resp, err + } + + return aes, resp, err +} + +// GetProjectAuditEvent gets a specific project audit event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/audit_events.html#retrieve-a-specific-project-audit-event +func (s *AuditEventsService) GetProjectAuditEvent(pid interface{}, event int, options ...RequestOptionFunc) (*AuditEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/audit_events/%d", PathEscape(project), event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ae := new(AuditEvent) + resp, err := s.client.Do(req, ae) + if err != nil { + return nil, resp, err + } + + return ae, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/avatar.go b/vendor/github.com/xanzy/go-gitlab/avatar.go new file mode 100644 index 0000000000..1a7b923f3d --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/avatar.go @@ -0,0 +1,64 @@ +// +// Copyright 2021, Pavel Kostohrys +// +// 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 gitlab + +import ( + "net/http" +) + +// AvatarRequestsService handles communication with the avatar related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/avatar.html +type AvatarRequestsService struct { + client *Client +} + +// Avatar represents a GitLab avatar. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/avatar.html +type Avatar struct { + AvatarURL string `json:"avatar_url"` +} + +// GetAvatarOptions represents the available GetAvatar() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/avatar.html#get-a-single-avatar-url +type GetAvatarOptions struct { + Email *string `url:"email,omitempty" json:"email,omitempty"` + Size *int `url:"size,omitempty" json:"size,omitempty"` +} + +// GetAvatar gets the avatar URL for a user with the given email address. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/avatar.html#get-a-single-avatar-url +func (s *AvatarRequestsService) GetAvatar(opt *GetAvatarOptions, options ...RequestOptionFunc) (*Avatar, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "avatar", opt, options) + if err != nil { + return nil, nil, err + } + + avatar := new(Avatar) + response, err := s.client.Do(req, avatar) + if err != nil { + return nil, response, err + } + + return avatar, response, nil +} diff --git a/vendor/github.com/xanzy/go-gitlab/award_emojis.go b/vendor/github.com/xanzy/go-gitlab/award_emojis.go new file mode 100644 index 0000000000..88475376b1 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/award_emojis.go @@ -0,0 +1,468 @@ +// +// Copyright 2021, Arkbriar +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// AwardEmojiService handles communication with the emoji awards related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/award_emoji.html +type AwardEmojiService struct { + client *Client +} + +// AwardEmoji represents a GitLab Award Emoji. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/award_emoji.html +type AwardEmoji struct { + ID int `json:"id"` + Name string `json:"name"` + User struct { + Name string `json:"name"` + Username string `json:"username"` + ID int `json:"id"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"user"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + AwardableID int `json:"awardable_id"` + AwardableType string `json:"awardable_type"` +} + +const ( + awardMergeRequest = "merge_requests" + awardIssue = "issues" + awardSnippets = "snippets" +) + +// ListAwardEmojiOptions represents the available options for listing emoji +// for each resources +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html +type ListAwardEmojiOptions ListOptions + +// ListMergeRequestAwardEmoji gets a list of all award emoji on the merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#list-an-awardables-award-emojis +func (s *AwardEmojiService) ListMergeRequestAwardEmoji(pid interface{}, mergeRequestIID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + return s.listAwardEmoji(pid, awardMergeRequest, mergeRequestIID, opt, options...) +} + +// ListIssueAwardEmoji gets a list of all award emoji on the issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#list-an-awardables-award-emojis +func (s *AwardEmojiService) ListIssueAwardEmoji(pid interface{}, issueIID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + return s.listAwardEmoji(pid, awardIssue, issueIID, opt, options...) +} + +// ListSnippetAwardEmoji gets a list of all award emoji on the snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#list-an-awardables-award-emojis +func (s *AwardEmojiService) ListSnippetAwardEmoji(pid interface{}, snippetID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + return s.listAwardEmoji(pid, awardSnippets, snippetID, opt, options...) +} + +func (s *AwardEmojiService) listAwardEmoji(pid interface{}, resource string, resourceID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/award_emoji", + PathEscape(project), + resource, + resourceID, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var as []*AwardEmoji + resp, err := s.client.Do(req, &as) + if err != nil { + return nil, resp, err + } + + return as, resp, err +} + +// GetMergeRequestAwardEmoji get an award emoji from merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#get-single-award-emoji +func (s *AwardEmojiService) GetMergeRequestAwardEmoji(pid interface{}, mergeRequestIID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.getAwardEmoji(pid, awardMergeRequest, mergeRequestIID, awardID, options...) +} + +// GetIssueAwardEmoji get an award emoji from issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#get-single-award-emoji +func (s *AwardEmojiService) GetIssueAwardEmoji(pid interface{}, issueIID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.getAwardEmoji(pid, awardIssue, issueIID, awardID, options...) +} + +// GetSnippetAwardEmoji get an award emoji from snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#get-single-award-emoji +func (s *AwardEmojiService) GetSnippetAwardEmoji(pid interface{}, snippetID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.getAwardEmoji(pid, awardSnippets, snippetID, awardID, options...) +} + +func (s *AwardEmojiService) getAwardEmoji(pid interface{}, resource string, resourceID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/award_emoji/%d", + PathEscape(project), + resource, + resourceID, + awardID, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + a := new(AwardEmoji) + resp, err := s.client.Do(req, &a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// CreateAwardEmojiOptions represents the available options for awarding emoji +// for a resource +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji +type CreateAwardEmojiOptions struct { + Name string `json:"name"` +} + +// CreateMergeRequestAwardEmoji get an award emoji from merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji +func (s *AwardEmojiService) CreateMergeRequestAwardEmoji(pid interface{}, mergeRequestIID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.createAwardEmoji(pid, awardMergeRequest, mergeRequestIID, opt, options...) +} + +// CreateIssueAwardEmoji get an award emoji from issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji +func (s *AwardEmojiService) CreateIssueAwardEmoji(pid interface{}, issueIID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.createAwardEmoji(pid, awardIssue, issueIID, opt, options...) +} + +// CreateSnippetAwardEmoji get an award emoji from snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji +func (s *AwardEmojiService) CreateSnippetAwardEmoji(pid interface{}, snippetID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.createAwardEmoji(pid, awardSnippets, snippetID, opt, options...) +} + +func (s *AwardEmojiService) createAwardEmoji(pid interface{}, resource string, resourceID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/award_emoji", + PathEscape(project), + resource, + resourceID, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + a := new(AwardEmoji) + resp, err := s.client.Do(req, &a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// DeleteIssueAwardEmoji delete award emoji on an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#delete-an-award-emoji +func (s *AwardEmojiService) DeleteIssueAwardEmoji(pid interface{}, issueIID, awardID int, options ...RequestOptionFunc) (*Response, error) { + return s.deleteAwardEmoji(pid, awardIssue, issueIID, awardID, options...) +} + +// DeleteMergeRequestAwardEmoji delete award emoji on a merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#delete-an-award-emoji +func (s *AwardEmojiService) DeleteMergeRequestAwardEmoji(pid interface{}, mergeRequestIID, awardID int, options ...RequestOptionFunc) (*Response, error) { + return s.deleteAwardEmoji(pid, awardMergeRequest, mergeRequestIID, awardID, options...) +} + +// DeleteSnippetAwardEmoji delete award emoji on a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#delete-an-award-emoji +func (s *AwardEmojiService) DeleteSnippetAwardEmoji(pid interface{}, snippetID, awardID int, options ...RequestOptionFunc) (*Response, error) { + return s.deleteAwardEmoji(pid, awardSnippets, snippetID, awardID, options...) +} + +// DeleteAwardEmoji Delete an award emoji on the specified resource. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#delete-an-award-emoji +func (s *AwardEmojiService) deleteAwardEmoji(pid interface{}, resource string, resourceID, awardID int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/award_emoji/%d", PathEscape(project), resource, + resourceID, awardID) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + return s.client.Do(req, nil) +} + +// ListIssuesAwardEmojiOnNote gets a list of all award emoji on a note from the +// issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#list-a-comments-award-emojis +func (s *AwardEmojiService) ListIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + return s.listAwardEmojiOnNote(pid, awardIssue, issueID, noteID, opt, options...) +} + +// ListMergeRequestAwardEmojiOnNote gets a list of all award emoji on a note +// from the merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#list-a-comments-award-emojis +func (s *AwardEmojiService) ListMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + return s.listAwardEmojiOnNote(pid, awardMergeRequest, mergeRequestIID, noteID, opt, options...) +} + +// ListSnippetAwardEmojiOnNote gets a list of all award emoji on a note from the +// snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#list-a-comments-award-emojis +func (s *AwardEmojiService) ListSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + return s.listAwardEmojiOnNote(pid, awardSnippets, snippetIID, noteID, opt, options...) +} + +func (s *AwardEmojiService) listAwardEmojiOnNote(pid interface{}, resources string, ressourceID, noteID int, opt *ListAwardEmojiOptions, options ...RequestOptionFunc) ([]*AwardEmoji, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji", PathEscape(project), resources, + ressourceID, noteID) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var as []*AwardEmoji + resp, err := s.client.Do(req, &as) + if err != nil { + return nil, resp, err + } + + return as, resp, err +} + +// GetIssuesAwardEmojiOnNote gets an award emoji on a note from an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#get-an-award-emoji-for-a-comment +func (s *AwardEmojiService) GetIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.getSingleNoteAwardEmoji(pid, awardIssue, issueID, noteID, awardID, options...) +} + +// GetMergeRequestAwardEmojiOnNote gets an award emoji on a note from a +// merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#get-an-award-emoji-for-a-comment +func (s *AwardEmojiService) GetMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.getSingleNoteAwardEmoji(pid, awardMergeRequest, mergeRequestIID, noteID, awardID, + options...) +} + +// GetSnippetAwardEmojiOnNote gets an award emoji on a note from a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#get-an-award-emoji-for-a-comment +func (s *AwardEmojiService) GetSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.getSingleNoteAwardEmoji(pid, awardSnippets, snippetIID, noteID, awardID, options...) +} + +func (s *AwardEmojiService) getSingleNoteAwardEmoji(pid interface{}, ressource string, resourceID, noteID, awardID int, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji/%d", + PathEscape(project), + ressource, + resourceID, + noteID, + awardID, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + a := new(AwardEmoji) + resp, err := s.client.Do(req, &a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// CreateIssuesAwardEmojiOnNote gets an award emoji on a note from an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji-on-a-comment +func (s *AwardEmojiService) CreateIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.createAwardEmojiOnNote(pid, awardIssue, issueID, noteID, opt, options...) +} + +// CreateMergeRequestAwardEmojiOnNote gets an award emoji on a note from a +// merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji-on-a-comment +func (s *AwardEmojiService) CreateMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.createAwardEmojiOnNote(pid, awardMergeRequest, mergeRequestIID, noteID, opt, options...) +} + +// CreateSnippetAwardEmojiOnNote gets an award emoji on a note from a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji-on-a-comment +func (s *AwardEmojiService) CreateSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + return s.createAwardEmojiOnNote(pid, awardSnippets, snippetIID, noteID, opt, options...) +} + +// CreateAwardEmojiOnNote award emoji on a note. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#award-a-new-emoji-on-a-comment +func (s *AwardEmojiService) createAwardEmojiOnNote(pid interface{}, resource string, resourceID, noteID int, opt *CreateAwardEmojiOptions, options ...RequestOptionFunc) (*AwardEmoji, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji", + PathEscape(project), + resource, + resourceID, + noteID, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + a := new(AwardEmoji) + resp, err := s.client.Do(req, &a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// DeleteIssuesAwardEmojiOnNote deletes an award emoji on a note from an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#delete-an-award-emoji-from-a-comment +func (s *AwardEmojiService) DeleteIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID, awardID int, options ...RequestOptionFunc) (*Response, error) { + return s.deleteAwardEmojiOnNote(pid, awardIssue, issueID, noteID, awardID, options...) +} + +// DeleteMergeRequestAwardEmojiOnNote deletes an award emoji on a note from a +// merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#delete-an-award-emoji-from-a-comment +func (s *AwardEmojiService) DeleteMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID, awardID int, options ...RequestOptionFunc) (*Response, error) { + return s.deleteAwardEmojiOnNote(pid, awardMergeRequest, mergeRequestIID, noteID, awardID, + options...) +} + +// DeleteSnippetAwardEmojiOnNote deletes an award emoji on a note from a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/award_emoji.html#delete-an-award-emoji-from-a-comment +func (s *AwardEmojiService) DeleteSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID, awardID int, options ...RequestOptionFunc) (*Response, error) { + return s.deleteAwardEmojiOnNote(pid, awardSnippets, snippetIID, noteID, awardID, options...) +} + +func (s *AwardEmojiService) deleteAwardEmojiOnNote(pid interface{}, resource string, resourceID, noteID, awardID int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji/%d", + PathEscape(project), + resource, + resourceID, + noteID, + awardID, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/boards.go b/vendor/github.com/xanzy/go-gitlab/boards.go new file mode 100644 index 0000000000..d8ce457e81 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/boards.go @@ -0,0 +1,367 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// IssueBoardsService handles communication with the issue board related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html +type IssueBoardsService struct { + client *Client +} + +// IssueBoard represents a GitLab issue board. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html +type IssueBoard struct { + ID int `json:"id"` + Name string `json:"name"` + Project *Project `json:"project"` + Milestone *Milestone `json:"milestone"` + Assignee *struct { + ID int `json:"id"` + Username string `json:"username"` + Name string `json:"name"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"assignee"` + Lists []*BoardList `json:"lists"` + Weight int `json:"weight"` + Labels []*LabelDetails `json:"labels"` +} + +func (b IssueBoard) String() string { + return Stringify(b) +} + +// BoardList represents a GitLab board list. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html +type BoardList struct { + ID int `json:"id"` + Assignee *struct { + ID int `json:"id"` + Name string `json:"name"` + Username string `json:"username"` + } `json:"assignee"` + Iteration *ProjectIteration `json:"iteration"` + Label *Label `json:"label"` + MaxIssueCount int `json:"max_issue_count"` + MaxIssueWeight int `json:"max_issue_weight"` + Milestone *Milestone `json:"milestone"` + Position int `json:"position"` +} + +func (b BoardList) String() string { + return Stringify(b) +} + +// CreateIssueBoardOptions represents the available CreateIssueBoard() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#create-an-issue-board +type CreateIssueBoardOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` +} + +// CreateIssueBoard creates a new issue board. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#create-an-issue-board +func (s *IssueBoardsService) CreateIssueBoard(pid interface{}, opt *CreateIssueBoardOptions, options ...RequestOptionFunc) (*IssueBoard, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + board := new(IssueBoard) + resp, err := s.client.Do(req, board) + if err != nil { + return nil, resp, err + } + + return board, resp, err +} + +// UpdateIssueBoardOptions represents the available UpdateIssueBoard() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#update-an-issue-board +type UpdateIssueBoardOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + MilestoneID *int `url:"milestone_id,omitempty" json:"milestone_id,omitempty"` + Labels *Labels `url:"labels,omitempty" json:"labels,omitempty"` + Weight *int `url:"weight,omitempty" json:"weight,omitempty"` +} + +// UpdateIssueBoard update an issue board. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#update-an-issue-board +func (s *IssueBoardsService) UpdateIssueBoard(pid interface{}, board int, opt *UpdateIssueBoardOptions, options ...RequestOptionFunc) (*IssueBoard, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d", PathEscape(project), board) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + is := new(IssueBoard) + resp, err := s.client.Do(req, is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} + +// DeleteIssueBoard deletes an issue board. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#delete-an-issue-board +func (s *IssueBoardsService) DeleteIssueBoard(pid interface{}, board int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d", PathEscape(project), board) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListIssueBoardsOptions represents the available ListIssueBoards() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#list-project-issue-boards +type ListIssueBoardsOptions ListOptions + +// ListIssueBoards gets a list of all issue boards in a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#list-project-issue-boards +func (s *IssueBoardsService) ListIssueBoards(pid interface{}, opt *ListIssueBoardsOptions, options ...RequestOptionFunc) ([]*IssueBoard, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var is []*IssueBoard + resp, err := s.client.Do(req, &is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} + +// GetIssueBoard gets a single issue board of a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#show-a-single-issue-board +func (s *IssueBoardsService) GetIssueBoard(pid interface{}, board int, options ...RequestOptionFunc) (*IssueBoard, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d", PathEscape(project), board) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ib := new(IssueBoard) + resp, err := s.client.Do(req, ib) + if err != nil { + return nil, resp, err + } + + return ib, resp, err +} + +// GetIssueBoardListsOptions represents the available GetIssueBoardLists() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#list-board-lists-in-a-project-issue-board +type GetIssueBoardListsOptions ListOptions + +// GetIssueBoardLists gets a list of the issue board's lists. Does not include +// backlog and closed lists. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#list-board-lists-in-a-project-issue-board +func (s *IssueBoardsService) GetIssueBoardLists(pid interface{}, board int, opt *GetIssueBoardListsOptions, options ...RequestOptionFunc) ([]*BoardList, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d/lists", PathEscape(project), board) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var bl []*BoardList + resp, err := s.client.Do(req, &bl) + if err != nil { + return nil, resp, err + } + + return bl, resp, err +} + +// GetIssueBoardList gets a single issue board list. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#show-a-single-board-list +func (s *IssueBoardsService) GetIssueBoardList(pid interface{}, board, list int, options ...RequestOptionFunc) (*BoardList, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d/lists/%d", + PathEscape(project), + board, + list, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + bl := new(BoardList) + resp, err := s.client.Do(req, bl) + if err != nil { + return nil, resp, err + } + + return bl, resp, err +} + +// CreateIssueBoardListOptions represents the available CreateIssueBoardList() +// options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#create-a-board-list +type CreateIssueBoardListOptions struct { + LabelID *int `url:"label_id,omitempty" json:"label_id,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + MilestoneID *int `url:"milestone_id,omitempty" json:"milestone_id,omitempty"` + IterationID *int `url:"iteration_id,omitempty" json:"iteration_id,omitempty"` +} + +// CreateIssueBoardList creates a new issue board list. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#create-a-board-list +func (s *IssueBoardsService) CreateIssueBoardList(pid interface{}, board int, opt *CreateIssueBoardListOptions, options ...RequestOptionFunc) (*BoardList, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d/lists", PathEscape(project), board) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + bl := new(BoardList) + resp, err := s.client.Do(req, bl) + if err != nil { + return nil, resp, err + } + + return bl, resp, err +} + +// UpdateIssueBoardListOptions represents the available UpdateIssueBoardList() +// options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#reorder-a-list-in-a-board +type UpdateIssueBoardListOptions struct { + Position *int `url:"position" json:"position"` +} + +// UpdateIssueBoardList updates the position of an existing issue board list. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#reorder-a-list-in-a-board +func (s *IssueBoardsService) UpdateIssueBoardList(pid interface{}, board, list int, opt *UpdateIssueBoardListOptions, options ...RequestOptionFunc) (*BoardList, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d/lists/%d", + PathEscape(project), + board, + list, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + bl := new(BoardList) + resp, err := s.client.Do(req, bl) + if err != nil { + return nil, resp, err + } + + return bl, resp, err +} + +// DeleteIssueBoardList soft deletes an issue board list. Only for admins and +// project owners. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/boards.html#delete-a-board-list-from-a-board +func (s *IssueBoardsService) DeleteIssueBoardList(pid interface{}, board, list int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/boards/%d/lists/%d", + PathEscape(project), + board, + list, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/branches.go b/vendor/github.com/xanzy/go-gitlab/branches.go new file mode 100644 index 0000000000..57ccdc0390 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/branches.go @@ -0,0 +1,251 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// BranchesService handles communication with the branch related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/branches.html +type BranchesService struct { + client *Client +} + +// Branch represents a GitLab branch. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/branches.html +type Branch struct { + Commit *Commit `json:"commit"` + Name string `json:"name"` + Protected bool `json:"protected"` + Merged bool `json:"merged"` + Default bool `json:"default"` + CanPush bool `json:"can_push"` + DevelopersCanPush bool `json:"developers_can_push"` + DevelopersCanMerge bool `json:"developers_can_merge"` + WebURL string `json:"web_url"` +} + +func (b Branch) String() string { + return Stringify(b) +} + +// ListBranchesOptions represents the available ListBranches() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#list-repository-branches +type ListBranchesOptions struct { + ListOptions + Search *string `url:"search,omitempty" json:"search,omitempty"` +} + +// ListBranches gets a list of repository branches from a project, sorted by +// name alphabetically. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#list-repository-branches +func (s *BranchesService) ListBranches(pid interface{}, opts *ListBranchesOptions, options ...RequestOptionFunc) ([]*Branch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/branches", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, nil, err + } + + var b []*Branch + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// GetBranch gets a single project repository branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#get-single-repository-branch +func (s *BranchesService) GetBranch(pid interface{}, branch string, options ...RequestOptionFunc) (*Branch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/branches/%s", PathEscape(project), url.PathEscape(branch)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + b := new(Branch) + resp, err := s.client.Do(req, b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// ProtectBranchOptions represents the available ProtectBranch() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#protect-repository-branch +type ProtectBranchOptions struct { + DevelopersCanPush *bool `url:"developers_can_push,omitempty" json:"developers_can_push,omitempty"` + DevelopersCanMerge *bool `url:"developers_can_merge,omitempty" json:"developers_can_merge,omitempty"` +} + +// ProtectBranch protects a single project repository branch. This is an +// idempotent function, protecting an already protected repository branch +// still returns a 200 OK status code. +// +// Deprecated: This endpoint has been replaced by +// ProtectedBranchesService.ProtectRepositoryBranches() +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#protect-repository-branch +func (s *BranchesService) ProtectBranch(pid interface{}, branch string, opts *ProtectBranchOptions, options ...RequestOptionFunc) (*Branch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/branches/%s/protect", PathEscape(project), url.PathEscape(branch)) + + req, err := s.client.NewRequest(http.MethodPut, u, opts, options) + if err != nil { + return nil, nil, err + } + + b := new(Branch) + resp, err := s.client.Do(req, b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// UnprotectBranch unprotects a single project repository branch. This is an +// idempotent function, unprotecting an already unprotected repository branch +// still returns a 200 OK status code. +// +// Deprecated: This endpoint has been replaced by +// ProtectedBranchesService.UnprotectRepositoryBranches() +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#unprotect-repository-branch +func (s *BranchesService) UnprotectBranch(pid interface{}, branch string, options ...RequestOptionFunc) (*Branch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/branches/%s/unprotect", PathEscape(project), url.PathEscape(branch)) + + req, err := s.client.NewRequest(http.MethodPut, u, nil, options) + if err != nil { + return nil, nil, err + } + + b := new(Branch) + resp, err := s.client.Do(req, b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// CreateBranchOptions represents the available CreateBranch() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#create-repository-branch +type CreateBranchOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` +} + +// CreateBranch creates branch from commit SHA or existing branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#create-repository-branch +func (s *BranchesService) CreateBranch(pid interface{}, opt *CreateBranchOptions, options ...RequestOptionFunc) (*Branch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/branches", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + b := new(Branch) + resp, err := s.client.Do(req, b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// DeleteBranch deletes an existing branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#delete-repository-branch +func (s *BranchesService) DeleteBranch(pid interface{}, branch string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/repository/branches/%s", PathEscape(project), url.PathEscape(branch)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteMergedBranches deletes all branches that are merged into the project's default branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/branches.html#delete-merged-branches +func (s *BranchesService) DeleteMergedBranches(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/repository/merged_branches", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/broadcast_messages.go b/vendor/github.com/xanzy/go-gitlab/broadcast_messages.go new file mode 100644 index 0000000000..029f9397fd --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/broadcast_messages.go @@ -0,0 +1,191 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// BroadcastMessagesService handles communication with the broadcast +// messages methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/broadcast_messages.html +type BroadcastMessagesService struct { + client *Client +} + +// BroadcastMessage represents a GitLab issue board. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#get-all-broadcast-messages +type BroadcastMessage struct { + Message string `json:"message"` + StartsAt *time.Time `json:"starts_at"` + EndsAt *time.Time `json:"ends_at"` + Font string `json:"font"` + ID int `json:"id"` + Active bool `json:"active"` + TargetAccessLevels []AccessLevelValue `json:"target_access_levels"` + TargetPath string `json:"target_path"` + BroadcastType string `json:"broadcast_type"` + Dismissable bool `json:"dismissable"` + + // Deprecated: This parameter was removed in GitLab 15.6. + Color string `json:"color"` +} + +// ListBroadcastMessagesOptions represents the available ListBroadcastMessages() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#get-all-broadcast-messages +type ListBroadcastMessagesOptions ListOptions + +// ListBroadcastMessages gets a list of all broadcasted messages. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#get-all-broadcast-messages +func (s *BroadcastMessagesService) ListBroadcastMessages(opt *ListBroadcastMessagesOptions, options ...RequestOptionFunc) ([]*BroadcastMessage, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "broadcast_messages", opt, options) + if err != nil { + return nil, nil, err + } + + var bs []*BroadcastMessage + resp, err := s.client.Do(req, &bs) + if err != nil { + return nil, resp, err + } + + return bs, resp, err +} + +// GetBroadcastMessage gets a single broadcast message. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#get-a-specific-broadcast-message +func (s *BroadcastMessagesService) GetBroadcastMessage(broadcast int, options ...RequestOptionFunc) (*BroadcastMessage, *Response, error) { + u := fmt.Sprintf("broadcast_messages/%d", broadcast) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + b := new(BroadcastMessage) + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// CreateBroadcastMessageOptions represents the available CreateBroadcastMessage() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#create-a-broadcast-message +type CreateBroadcastMessageOptions struct { + Message *string `url:"message" json:"message"` + StartsAt *time.Time `url:"starts_at,omitempty" json:"starts_at,omitempty"` + EndsAt *time.Time `url:"ends_at,omitempty" json:"ends_at,omitempty"` + Font *string `url:"font,omitempty" json:"font,omitempty"` + TargetAccessLevels []AccessLevelValue `url:"target_access_levels,omitempty" json:"target_access_levels,omitempty"` + TargetPath *string `url:"target_path,omitempty" json:"target_path,omitempty"` + BroadcastType *string `url:"broadcast_type,omitempty" json:"broadcast_type,omitempty"` + Dismissable *bool `url:"dismissable,omitempty" json:"dismissable,omitempty"` + + // Deprecated: This parameter was removed in GitLab 15.6. + Color *string `url:"color,omitempty" json:"color,omitempty"` +} + +// CreateBroadcastMessage creates a message to broadcast. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#create-a-broadcast-message +func (s *BroadcastMessagesService) CreateBroadcastMessage(opt *CreateBroadcastMessageOptions, options ...RequestOptionFunc) (*BroadcastMessage, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "broadcast_messages", opt, options) + if err != nil { + return nil, nil, err + } + + b := new(BroadcastMessage) + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// UpdateBroadcastMessageOptions represents the available CreateBroadcastMessage() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#update-a-broadcast-message +type UpdateBroadcastMessageOptions struct { + Message *string `url:"message,omitempty" json:"message,omitempty"` + StartsAt *time.Time `url:"starts_at,omitempty" json:"starts_at,omitempty"` + EndsAt *time.Time `url:"ends_at,omitempty" json:"ends_at,omitempty"` + Font *string `url:"font,omitempty" json:"font,omitempty"` + TargetAccessLevels []AccessLevelValue `url:"target_access_levels,omitempty" json:"target_access_levels,omitempty"` + TargetPath *string `url:"target_path,omitempty" json:"target_path,omitempty"` + BroadcastType *string `url:"broadcast_type,omitempty" json:"broadcast_type,omitempty"` + Dismissable *bool `url:"dismissable,omitempty" json:"dismissable,omitempty"` + + // Deprecated: This parameter was removed in GitLab 15.6. + Color *string `url:"color,omitempty" json:"color,omitempty"` +} + +// UpdateBroadcastMessage update a broadcasted message. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#update-a-broadcast-message +func (s *BroadcastMessagesService) UpdateBroadcastMessage(broadcast int, opt *UpdateBroadcastMessageOptions, options ...RequestOptionFunc) (*BroadcastMessage, *Response, error) { + u := fmt.Sprintf("broadcast_messages/%d", broadcast) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + b := new(BroadcastMessage) + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b, resp, err +} + +// DeleteBroadcastMessage deletes a broadcasted message. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/broadcast_messages.html#delete-a-broadcast-message +func (s *BroadcastMessagesService) DeleteBroadcastMessage(broadcast int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("broadcast_messages/%d", broadcast) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/ci_yml_templates.go b/vendor/github.com/xanzy/go-gitlab/ci_yml_templates.go new file mode 100644 index 0000000000..974ab7deb4 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/ci_yml_templates.go @@ -0,0 +1,95 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// CIYMLTemplatesService handles communication with the gitlab +// CI YML templates related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitlab_ci_ymls.html +type CIYMLTemplatesService struct { + client *Client +} + +// CIYMLTemplate represents a GitLab CI YML template. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitlab_ci_ymls.html +type CIYMLTemplate struct { + Name string `json:"name"` + Content string `json:"content"` +} + +// CIYMLTemplateListItem represents a GitLab CI YML template from the list. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitlab_ci_ymls.html +type CIYMLTemplateListItem struct { + Key string `json:"key"` + Name string `json:"name"` +} + +// ListCIYMLTemplatesOptions represents the available ListAllTemplates() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitlab_ci_ymls.html#list-gitlab-ci-yaml-templates +type ListCIYMLTemplatesOptions ListOptions + +// ListAllTemplates get all GitLab CI YML templates. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitlab_ci_ymls.html#list-gitlab-ci-yaml-templates +func (s *CIYMLTemplatesService) ListAllTemplates(opt *ListCIYMLTemplatesOptions, options ...RequestOptionFunc) ([]*CIYMLTemplateListItem, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "templates/gitlab_ci_ymls", opt, options) + if err != nil { + return nil, nil, err + } + + var cts []*CIYMLTemplateListItem + resp, err := s.client.Do(req, &cts) + if err != nil { + return nil, resp, err + } + + return cts, resp, err +} + +// GetTemplate get a single GitLab CI YML template. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitlab_ci_ymls.html#single-gitlab-ci-yaml-template +func (s *CIYMLTemplatesService) GetTemplate(key string, options ...RequestOptionFunc) (*CIYMLTemplate, *Response, error) { + u := fmt.Sprintf("templates/gitlab_ci_ymls/%s", PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ct := new(CIYMLTemplate) + resp, err := s.client.Do(req, ct) + if err != nil { + return nil, resp, err + } + + return ct, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/client_options.go b/vendor/github.com/xanzy/go-gitlab/client_options.go new file mode 100644 index 0000000000..2ff7bab9bf --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/client_options.go @@ -0,0 +1,142 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "net/http" + "time" + + retryablehttp "github.com/hashicorp/go-retryablehttp" +) + +// ClientOptionFunc can be used to customize a new GitLab API client. +type ClientOptionFunc func(*Client) error + +// WithBaseURL sets the base URL for API requests to a custom endpoint. +func WithBaseURL(urlStr string) ClientOptionFunc { + return func(c *Client) error { + return c.setBaseURL(urlStr) + } +} + +// WithCustomBackoff can be used to configure a custom backoff policy. +func WithCustomBackoff(backoff retryablehttp.Backoff) ClientOptionFunc { + return func(c *Client) error { + c.client.Backoff = backoff + return nil + } +} + +// WithCustomLeveledLogger can be used to configure a custom retryablehttp +// leveled logger. +func WithCustomLeveledLogger(leveledLogger retryablehttp.LeveledLogger) ClientOptionFunc { + return func(c *Client) error { + c.client.Logger = leveledLogger + return nil + } +} + +// WithCustomLimiter injects a custom rate limiter to the client. +func WithCustomLimiter(limiter RateLimiter) ClientOptionFunc { + return func(c *Client) error { + c.configureLimiterOnce.Do(func() {}) + c.limiter = limiter + return nil + } +} + +// WithCustomLogger can be used to configure a custom retryablehttp logger. +func WithCustomLogger(logger retryablehttp.Logger) ClientOptionFunc { + return func(c *Client) error { + c.client.Logger = logger + return nil + } +} + +// WithCustomRetry can be used to configure a custom retry policy. +func WithCustomRetry(checkRetry retryablehttp.CheckRetry) ClientOptionFunc { + return func(c *Client) error { + c.client.CheckRetry = checkRetry + return nil + } +} + +// WithCustomRetryMax can be used to configure a custom maximum number of retries. +func WithCustomRetryMax(retryMax int) ClientOptionFunc { + return func(c *Client) error { + c.client.RetryMax = retryMax + return nil + } +} + +// WithCustomRetryWaitMinMax can be used to configure a custom minimum and +// maximum time to wait between retries. +func WithCustomRetryWaitMinMax(waitMin, waitMax time.Duration) ClientOptionFunc { + return func(c *Client) error { + c.client.RetryWaitMin = waitMin + c.client.RetryWaitMax = waitMax + return nil + } +} + +// WithErrorHandler can be used to configure a custom error handler. +func WithErrorHandler(handler retryablehttp.ErrorHandler) ClientOptionFunc { + return func(c *Client) error { + c.client.ErrorHandler = handler + return nil + } +} + +// WithHTTPClient can be used to configure a custom HTTP client. +func WithHTTPClient(httpClient *http.Client) ClientOptionFunc { + return func(c *Client) error { + c.client.HTTPClient = httpClient + return nil + } +} + +// WithRequestLogHook can be used to configure a custom request log hook. +func WithRequestLogHook(hook retryablehttp.RequestLogHook) ClientOptionFunc { + return func(c *Client) error { + c.client.RequestLogHook = hook + return nil + } +} + +// WithResponseLogHook can be used to configure a custom response log hook. +func WithResponseLogHook(hook retryablehttp.ResponseLogHook) ClientOptionFunc { + return func(c *Client) error { + c.client.ResponseLogHook = hook + return nil + } +} + +// WithoutRetries disables the default retry logic. +func WithoutRetries() ClientOptionFunc { + return func(c *Client) error { + c.disableRetries = true + return nil + } +} + +// WithRequestOptions can be used to configure default request options applied to every request. +func WithRequestOptions(options ...RequestOptionFunc) ClientOptionFunc { + return func(c *Client) error { + c.defaultRequestOptions = append(c.defaultRequestOptions, options...) + return nil + } +} diff --git a/vendor/github.com/xanzy/go-gitlab/cluster_agents.go b/vendor/github.com/xanzy/go-gitlab/cluster_agents.go new file mode 100644 index 0000000000..907f753e1f --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/cluster_agents.go @@ -0,0 +1,294 @@ +// +// Copyright 2022, Timo Furrer +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ClusterAgentsService handles communication with the cluster agents related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/cluster_agents.html +type ClusterAgentsService struct { + client *Client +} + +// Agent represents a GitLab agent for Kubernetes. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/cluster_agents.html +type Agent struct { + ID int `json:"id"` + Name string `json:"name"` + CreatedAt *time.Time `json:"created_at"` + CreatedByUserID int `json:"created_by_user_id"` + ConfigProject ConfigProject `json:"config_project"` +} + +type ConfigProject struct { + ID int `json:"id"` + Description string `json:"description"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + CreatedAt *time.Time `json:"created_at"` +} + +func (a Agent) String() string { + return Stringify(a) +} + +// AgentToken represents a GitLab agent token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#list-tokens-for-an-agent +type AgentToken struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AgentID int `json:"agent_id"` + Status string `json:"status"` + CreatedAt *time.Time `json:"created_at"` + CreatedByUserID int `json:"created_by_user_id"` + LastUsedAt *time.Time `json:"last_used_at"` + Token string `json:"token"` +} + +func (a AgentToken) String() string { + return Stringify(a) +} + +// ListAgentsOptions represents the available ListAgents() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#list-the-agents-for-a-project +type ListAgentsOptions ListOptions + +// ListAgents returns a list of agents registered for the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#list-the-agents-for-a-project +func (s *ClusterAgentsService) ListAgents(pid interface{}, opt *ListAgentsOptions, options ...RequestOptionFunc) ([]*Agent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, uri, opt, options) + if err != nil { + return nil, nil, err + } + + var as []*Agent + resp, err := s.client.Do(req, &as) + if err != nil { + return nil, resp, err + } + + return as, resp, err +} + +// GetAgent gets a single agent details. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#get-details-about-an-agent +func (s *ClusterAgentsService) GetAgent(pid interface{}, id int, options ...RequestOptionFunc) (*Agent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents/%d", PathEscape(project), id) + + req, err := s.client.NewRequest(http.MethodGet, uri, nil, options) + if err != nil { + return nil, nil, err + } + + a := new(Agent) + resp, err := s.client.Do(req, a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// RegisterAgentOptions represents the available RegisterAgent() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#register-an-agent-with-a-project +type RegisterAgentOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` +} + +// RegisterAgent registers an agent to the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#register-an-agent-with-a-project +func (s *ClusterAgentsService) RegisterAgent(pid interface{}, opt *RegisterAgentOptions, options ...RequestOptionFunc) (*Agent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, uri, opt, options) + if err != nil { + return nil, nil, err + } + + a := new(Agent) + resp, err := s.client.Do(req, a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// DeleteAgent deletes an existing agent registration. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#delete-a-registered-agent +func (s *ClusterAgentsService) DeleteAgent(pid interface{}, id int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents/%d", PathEscape(project), id) + + req, err := s.client.NewRequest(http.MethodDelete, uri, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListAgentTokensOptions represents the available ListAgentTokens() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#list-tokens-for-an-agent +type ListAgentTokensOptions ListOptions + +// ListAgentTokens returns a list of tokens for an agent. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#list-tokens-for-an-agent +func (s *ClusterAgentsService) ListAgentTokens(pid interface{}, aid int, opt *ListAgentTokensOptions, options ...RequestOptionFunc) ([]*AgentToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents/%d/tokens", PathEscape(project), aid) + + req, err := s.client.NewRequest(http.MethodGet, uri, opt, options) + if err != nil { + return nil, nil, err + } + + var ats []*AgentToken + resp, err := s.client.Do(req, &ats) + if err != nil { + return nil, resp, err + } + + return ats, resp, err +} + +// GetAgentToken gets a single agent token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#get-a-single-agent-token +func (s *ClusterAgentsService) GetAgentToken(pid interface{}, aid int, id int, options ...RequestOptionFunc) (*AgentToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents/%d/tokens/%d", PathEscape(project), aid, id) + + req, err := s.client.NewRequest(http.MethodGet, uri, nil, options) + if err != nil { + return nil, nil, err + } + + at := new(AgentToken) + resp, err := s.client.Do(req, at) + if err != nil { + return nil, resp, err + } + + return at, resp, err +} + +// CreateAgentTokenOptions represents the available CreateAgentToken() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#create-an-agent-token +type CreateAgentTokenOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` +} + +// CreateAgentToken creates a new token for an agent. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#create-an-agent-token +func (s *ClusterAgentsService) CreateAgentToken(pid interface{}, aid int, opt *CreateAgentTokenOptions, options ...RequestOptionFunc) (*AgentToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents/%d/tokens", PathEscape(project), aid) + + req, err := s.client.NewRequest(http.MethodPost, uri, opt, options) + if err != nil { + return nil, nil, err + } + + at := new(AgentToken) + resp, err := s.client.Do(req, at) + if err != nil { + return nil, resp, err + } + + return at, resp, err +} + +// RevokeAgentToken revokes an agent token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/cluster_agents.html#revoke-an-agent-token +func (s *ClusterAgentsService) RevokeAgentToken(pid interface{}, aid int, id int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + uri := fmt.Sprintf("projects/%s/cluster_agents/%d/tokens/%d", PathEscape(project), aid, id) + + req, err := s.client.NewRequest(http.MethodDelete, uri, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/commits.go b/vendor/github.com/xanzy/go-gitlab/commits.go new file mode 100644 index 0000000000..e6d64c4d01 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/commits.go @@ -0,0 +1,596 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" + "time" +) + +// CommitsService handles communication with the commit related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html +type CommitsService struct { + client *Client +} + +// Commit represents a GitLab commit. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html +type Commit struct { + ID string `json:"id"` + ShortID string `json:"short_id"` + Title string `json:"title"` + AuthorName string `json:"author_name"` + AuthorEmail string `json:"author_email"` + AuthoredDate *time.Time `json:"authored_date"` + CommitterName string `json:"committer_name"` + CommitterEmail string `json:"committer_email"` + CommittedDate *time.Time `json:"committed_date"` + CreatedAt *time.Time `json:"created_at"` + Message string `json:"message"` + ParentIDs []string `json:"parent_ids"` + Stats *CommitStats `json:"stats"` + Status *BuildStateValue `json:"status"` + LastPipeline *PipelineInfo `json:"last_pipeline"` + ProjectID int `json:"project_id"` + Trailers map[string]string `json:"trailers"` + WebURL string `json:"web_url"` +} + +// CommitStats represents the number of added and deleted files in a commit. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html +type CommitStats struct { + Additions int `json:"additions"` + Deletions int `json:"deletions"` + Total int `json:"total"` +} + +func (c Commit) String() string { + return Stringify(c) +} + +// ListCommitsOptions represents the available ListCommits() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#list-repository-commits +type ListCommitsOptions struct { + ListOptions + RefName *string `url:"ref_name,omitempty" json:"ref_name,omitempty"` + Since *time.Time `url:"since,omitempty" json:"since,omitempty"` + Until *time.Time `url:"until,omitempty" json:"until,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + All *bool `url:"all,omitempty" json:"all,omitempty"` + WithStats *bool `url:"with_stats,omitempty" json:"with_stats,omitempty"` + FirstParent *bool `url:"first_parent,omitempty" json:"first_parent,omitempty"` + Trailers *bool `url:"trailers,omitempty" json:"trailers,omitempty"` +} + +// ListCommits gets a list of repository commits in a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#list-repository-commits +func (s *CommitsService) ListCommits(pid interface{}, opt *ListCommitsOptions, options ...RequestOptionFunc) ([]*Commit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var c []*Commit + resp, err := s.client.Do(req, &c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// CommitRef represents the reference of branches/tags in a commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-references-a-commit-is-pushed-to +type CommitRef struct { + Type string `json:"type"` + Name string `json:"name"` +} + +// GetCommitRefsOptions represents the available GetCommitRefs() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-references-a-commit-is-pushed-to +type GetCommitRefsOptions struct { + ListOptions + Type *string `url:"type,omitempty" json:"type,omitempty"` +} + +// GetCommitRefs gets all references (from branches or tags) a commit is pushed to +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-references-a-commit-is-pushed-to +func (s *CommitsService) GetCommitRefs(pid interface{}, sha string, opt *GetCommitRefsOptions, options ...RequestOptionFunc) ([]*CommitRef, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/refs", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var cs []*CommitRef + resp, err := s.client.Do(req, &cs) + if err != nil { + return nil, resp, err + } + + return cs, resp, err +} + +// GetCommit gets a specific commit identified by the commit hash or name of a +// branch or tag. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#get-a-single-commit +func (s *CommitsService) GetCommit(pid interface{}, sha string, options ...RequestOptionFunc) (*Commit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + if sha == "" { + return nil, nil, fmt.Errorf("SHA must be a non-empty string") + } + u := fmt.Sprintf("projects/%s/repository/commits/%s", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + c := new(Commit) + resp, err := s.client.Do(req, c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// CreateCommitOptions represents the available options for a new commit. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#create-a-commit-with-multiple-files-and-actions +type CreateCommitOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"` + StartBranch *string `url:"start_branch,omitempty" json:"start_branch,omitempty"` + StartSHA *string `url:"start_sha,omitempty" json:"start_sha,omitempty"` + StartProject *string `url:"start_project,omitempty" json:"start_project,omitempty"` + Actions []*CommitActionOptions `url:"actions" json:"actions"` + AuthorEmail *string `url:"author_email,omitempty" json:"author_email,omitempty"` + AuthorName *string `url:"author_name,omitempty" json:"author_name,omitempty"` + Stats *bool `url:"stats,omitempty" json:"stats,omitempty"` + Force *bool `url:"force,omitempty" json:"force,omitempty"` +} + +// CommitActionOptions represents the available options for a new single +// file action. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#create-a-commit-with-multiple-files-and-actions +type CommitActionOptions struct { + Action *FileActionValue `url:"action,omitempty" json:"action,omitempty"` + FilePath *string `url:"file_path,omitempty" json:"file_path,omitempty"` + PreviousPath *string `url:"previous_path,omitempty" json:"previous_path,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + Encoding *string `url:"encoding,omitempty" json:"encoding,omitempty"` + LastCommitID *string `url:"last_commit_id,omitempty" json:"last_commit_id,omitempty"` + ExecuteFilemode *bool `url:"execute_filemode,omitempty" json:"execute_filemode,omitempty"` +} + +// CreateCommit creates a commit with multiple files and actions. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#create-a-commit-with-multiple-files-and-actions +func (s *CommitsService) CreateCommit(pid interface{}, opt *CreateCommitOptions, options ...RequestOptionFunc) (*Commit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + c := new(Commit) + resp, err := s.client.Do(req, &c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// Diff represents a GitLab diff. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html +type Diff struct { + Diff string `json:"diff"` + NewPath string `json:"new_path"` + OldPath string `json:"old_path"` + AMode string `json:"a_mode"` + BMode string `json:"b_mode"` + NewFile bool `json:"new_file"` + RenamedFile bool `json:"renamed_file"` + DeletedFile bool `json:"deleted_file"` +} + +func (d Diff) String() string { + return Stringify(d) +} + +// GetCommitDiffOptions represents the available GetCommitDiff() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-the-diff-of-a-commit +type GetCommitDiffOptions ListOptions + +// GetCommitDiff gets the diff of a commit in a project.. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-the-diff-of-a-commit +func (s *CommitsService) GetCommitDiff(pid interface{}, sha string, opt *GetCommitDiffOptions, options ...RequestOptionFunc) ([]*Diff, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/diff", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var d []*Diff + resp, err := s.client.Do(req, &d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// CommitComment represents a GitLab commit comment. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html +type CommitComment struct { + Note string `json:"note"` + Path string `json:"path"` + Line int `json:"line"` + LineType string `json:"line_type"` + Author Author `json:"author"` +} + +// Author represents a GitLab commit author +type Author struct { + ID int `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Name string `json:"name"` + State string `json:"state"` + Blocked bool `json:"blocked"` + CreatedAt *time.Time `json:"created_at"` +} + +func (c CommitComment) String() string { + return Stringify(c) +} + +// GetCommitCommentsOptions represents the available GetCommitComments() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-the-comments-of-a-commit +type GetCommitCommentsOptions ListOptions + +// GetCommitComments gets the comments of a commit in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-the-comments-of-a-commit +func (s *CommitsService) GetCommitComments(pid interface{}, sha string, opt *GetCommitCommentsOptions, options ...RequestOptionFunc) ([]*CommitComment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/comments", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var c []*CommitComment + resp, err := s.client.Do(req, &c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// PostCommitCommentOptions represents the available PostCommitComment() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#post-comment-to-commit +type PostCommitCommentOptions struct { + Note *string `url:"note,omitempty" json:"note,omitempty"` + Path *string `url:"path" json:"path"` + Line *int `url:"line" json:"line"` + LineType *string `url:"line_type" json:"line_type"` +} + +// PostCommitComment adds a comment to a commit. Optionally you can post +// comments on a specific line of a commit. Therefor both path, line_new and +// line_old are required. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#post-comment-to-commit +func (s *CommitsService) PostCommitComment(pid interface{}, sha string, opt *PostCommitCommentOptions, options ...RequestOptionFunc) (*CommitComment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/comments", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + c := new(CommitComment) + resp, err := s.client.Do(req, c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// GetCommitStatusesOptions represents the available GetCommitStatuses() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#list-the-statuses-of-a-commit +type GetCommitStatusesOptions struct { + ListOptions + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + Stage *string `url:"stage,omitempty" json:"stage,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + All *bool `url:"all,omitempty" json:"all,omitempty"` +} + +// CommitStatus represents a GitLab commit status. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#commit-status +type CommitStatus struct { + ID int `json:"id"` + SHA string `json:"sha"` + Ref string `json:"ref"` + Status string `json:"status"` + CreatedAt *time.Time `json:"created_at"` + StartedAt *time.Time `json:"started_at"` + FinishedAt *time.Time `json:"finished_at"` + Name string `json:"name"` + AllowFailure bool `json:"allow_failure"` + Coverage float64 `json:"coverage"` + Author Author `json:"author"` + Description string `json:"description"` + TargetURL string `json:"target_url"` +} + +// GetCommitStatuses gets the statuses of a commit in a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#list-the-statuses-of-a-commit +func (s *CommitsService) GetCommitStatuses(pid interface{}, sha string, opt *GetCommitStatusesOptions, options ...RequestOptionFunc) ([]*CommitStatus, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/statuses", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var cs []*CommitStatus + resp, err := s.client.Do(req, &cs) + if err != nil { + return nil, resp, err + } + + return cs, resp, err +} + +// SetCommitStatusOptions represents the available SetCommitStatus() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#set-the-pipeline-status-of-a-commit +type SetCommitStatusOptions struct { + State BuildStateValue `url:"state" json:"state"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + Context *string `url:"context,omitempty" json:"context,omitempty"` + TargetURL *string `url:"target_url,omitempty" json:"target_url,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Coverage *float64 `url:"coverage,omitempty" json:"coverage,omitempty"` + PipelineID *int `url:"pipeline_id,omitempty" json:"pipeline_id,omitempty"` +} + +// SetCommitStatus sets the status of a commit in a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#set-the-pipeline-status-of-a-commit +func (s *CommitsService) SetCommitStatus(pid interface{}, sha string, opt *SetCommitStatusOptions, options ...RequestOptionFunc) (*CommitStatus, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/statuses/%s", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + cs := new(CommitStatus) + resp, err := s.client.Do(req, &cs) + if err != nil { + return nil, resp, err + } + + return cs, resp, err +} + +// ListMergeRequestsByCommit gets merge request associated with a commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#list-merge-requests-associated-with-a-commit +func (s *CommitsService) ListMergeRequestsByCommit(pid interface{}, sha string, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/merge_requests", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var mrs []*MergeRequest + resp, err := s.client.Do(req, &mrs) + if err != nil { + return nil, resp, err + } + + return mrs, resp, err +} + +// CherryPickCommitOptions represents the available CherryPickCommit() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#cherry-pick-a-commit +type CherryPickCommitOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + DryRun *bool `url:"dry_run,omitempty" json:"dry_run,omitempty"` + Message *string `url:"message,omitempty" json:"message,omitempty"` +} + +// CherryPickCommit cherry picks a commit to a given branch. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#cherry-pick-a-commit +func (s *CommitsService) CherryPickCommit(pid interface{}, sha string, opt *CherryPickCommitOptions, options ...RequestOptionFunc) (*Commit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/cherry_pick", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + c := new(Commit) + resp, err := s.client.Do(req, &c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// RevertCommitOptions represents the available RevertCommit() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#revert-a-commit +type RevertCommitOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` +} + +// RevertCommit reverts a commit in a given branch. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#revert-a-commit +func (s *CommitsService) RevertCommit(pid interface{}, sha string, opt *RevertCommitOptions, options ...RequestOptionFunc) (*Commit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/revert", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + c := new(Commit) + resp, err := s.client.Do(req, &c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// GPGSignature represents a Gitlab commit's GPG Signature. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/commits.html#get-gpg-signature-of-a-commit +type GPGSignature struct { + KeyID int `json:"gpg_key_id"` + KeyPrimaryKeyID string `json:"gpg_key_primary_keyid"` + KeyUserName string `json:"gpg_key_user_name"` + KeyUserEmail string `json:"gpg_key_user_email"` + VerificationStatus string `json:"verification_status"` + KeySubkeyID int `json:"gpg_key_subkey_id"` +} + +// GetGPGSiganature gets a GPG signature of a commit. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#get-gpg-signature-of-a-commit +func (s *CommitsService) GetGPGSiganature(pid interface{}, sha string, options ...RequestOptionFunc) (*GPGSignature, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/signature", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + sig := new(GPGSignature) + resp, err := s.client.Do(req, &sig) + if err != nil { + return nil, resp, err + } + + return sig, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/container_registry.go b/vendor/github.com/xanzy/go-gitlab/container_registry.go new file mode 100644 index 0000000000..a85e0cb8a6 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/container_registry.go @@ -0,0 +1,310 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ContainerRegistryService handles communication with the container registry +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/container_registry.html +type ContainerRegistryService struct { + client *Client +} + +// RegistryRepository represents a GitLab content registry repository. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/container_registry.html +type RegistryRepository struct { + ID int `json:"id"` + Name string `json:"name"` + Path string `json:"path"` + ProjectID int `json:"project_id"` + Location string `json:"location"` + CreatedAt *time.Time `json:"created_at"` + CleanupPolicyStartedAt *time.Time `json:"cleanup_policy_started_at"` + TagsCount int `json:"tags_count"` + Tags []*RegistryRepositoryTag `json:"tags"` +} + +func (s RegistryRepository) String() string { + return Stringify(s) +} + +// RegistryRepositoryTag represents a GitLab registry image tag. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/container_registry.html +type RegistryRepositoryTag struct { + Name string `json:"name"` + Path string `json:"path"` + Location string `json:"location"` + Revision string `json:"revision"` + ShortRevision string `json:"short_revision"` + Digest string `json:"digest"` + CreatedAt *time.Time `json:"created_at"` + TotalSize int `json:"total_size"` +} + +func (s RegistryRepositoryTag) String() string { + return Stringify(s) +} + +// ListRegistryRepositoriesOptions represents the available +// ListRegistryRepositories() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#list-registry-repositories +type ListRegistryRepositoriesOptions struct { + ListOptions + + // Deprecated: These options are deprecated for ListGroupRegistryRepositories calls. (Removed in GitLab 15.0) + Tags *bool `url:"tags,omitempty" json:"tags,omitempty"` + TagsCount *bool `url:"tags_count,omitempty" json:"tags_count,omitempty"` +} + +// ListProjectRegistryRepositories gets a list of registry repositories in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#within-a-project +func (s *ContainerRegistryService) ListProjectRegistryRepositories(pid interface{}, opt *ListRegistryRepositoriesOptions, options ...RequestOptionFunc) ([]*RegistryRepository, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/registry/repositories", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var repos []*RegistryRepository + resp, err := s.client.Do(req, &repos) + if err != nil { + return nil, resp, err + } + + return repos, resp, err +} + +// ListGroupRegistryRepositories gets a list of registry repositories in a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#within-a-group +func (s *ContainerRegistryService) ListGroupRegistryRepositories(gid interface{}, opt *ListRegistryRepositoriesOptions, options ...RequestOptionFunc) ([]*RegistryRepository, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/registry/repositories", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var repos []*RegistryRepository + resp, err := s.client.Do(req, &repos) + if err != nil { + return nil, resp, err + } + + return repos, resp, err +} + +// GetSingleRegistryRepositoryOptions represents the available +// GetSingleRegistryRepository() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#get-details-of-a-single-repository +type GetSingleRegistryRepositoryOptions struct { + Tags *bool `url:"tags,omitempty" json:"tags,omitempty"` + TagsCount *bool `url:"tags_count,omitempty" json:"tags_count,omitempty"` +} + +// GetSingleRegistryRepository gets the details of single registry repository. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#get-details-of-a-single-repository +func (s *ContainerRegistryService) GetSingleRegistryRepository(pid interface{}, opt *GetSingleRegistryRepositoryOptions, options ...RequestOptionFunc) (*RegistryRepository, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("registry/repositories/%s", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + repo := new(RegistryRepository) + resp, err := s.client.Do(req, repo) + if err != nil { + return nil, resp, err + } + + return repo, resp, err +} + +// DeleteRegistryRepository deletes a repository in a registry. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#delete-registry-repository +func (s *ContainerRegistryService) DeleteRegistryRepository(pid interface{}, repository int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/registry/repositories/%d", PathEscape(project), repository) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListRegistryRepositoryTagsOptions represents the available +// ListRegistryRepositoryTags() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#list-registry-repository-tags +type ListRegistryRepositoryTagsOptions ListOptions + +// ListRegistryRepositoryTags gets a list of tags for given registry repository. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#list-registry-repository-tags +func (s *ContainerRegistryService) ListRegistryRepositoryTags(pid interface{}, repository int, opt *ListRegistryRepositoryTagsOptions, options ...RequestOptionFunc) ([]*RegistryRepositoryTag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags", + PathEscape(project), + repository, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var tags []*RegistryRepositoryTag + resp, err := s.client.Do(req, &tags) + if err != nil { + return nil, resp, err + } + + return tags, resp, err +} + +// GetRegistryRepositoryTagDetail get details of a registry repository tag +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#get-details-of-a-registry-repository-tag +func (s *ContainerRegistryService) GetRegistryRepositoryTagDetail(pid interface{}, repository int, tagName string, options ...RequestOptionFunc) (*RegistryRepositoryTag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags/%s", + PathEscape(project), + repository, + tagName, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + tag := new(RegistryRepositoryTag) + resp, err := s.client.Do(req, &tag) + if err != nil { + return nil, resp, err + } + + return tag, resp, err +} + +// DeleteRegistryRepositoryTag deletes a registry repository tag. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#delete-a-registry-repository-tag +func (s *ContainerRegistryService) DeleteRegistryRepositoryTag(pid interface{}, repository int, tagName string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags/%s", + PathEscape(project), + repository, + tagName, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteRegistryRepositoryTagsOptions represents the available +// DeleteRegistryRepositoryTags() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#delete-registry-repository-tags-in-bulk +type DeleteRegistryRepositoryTagsOptions struct { + NameRegexpDelete *string `url:"name_regex_delete,omitempty" json:"name_regex_delete,omitempty"` + NameRegexpKeep *string `url:"name_regex_keep,omitempty" json:"name_regex_keep,omitempty"` + KeepN *int `url:"keep_n,omitempty" json:"keep_n,omitempty"` + OlderThan *string `url:"older_than,omitempty" json:"older_than,omitempty"` + + // Deprecated: NameRegexp is deprecated in favor of NameRegexpDelete. + NameRegexp *string `url:"name_regex,omitempty" json:"name_regex,omitempty"` +} + +// DeleteRegistryRepositoryTags deletes repository tags in bulk based on +// given criteria. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/container_registry.html#delete-registry-repository-tags-in-bulk +func (s *ContainerRegistryService) DeleteRegistryRepositoryTags(pid interface{}, repository int, opt *DeleteRegistryRepositoryTagsOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags", + PathEscape(project), + repository, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/custom_attributes.go b/vendor/github.com/xanzy/go-gitlab/custom_attributes.go new file mode 100644 index 0000000000..54f61cec6c --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/custom_attributes.go @@ -0,0 +1,188 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// CustomAttributesService handles communication with the group, project and +// user custom attributes related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/custom_attributes.html +type CustomAttributesService struct { + client *Client +} + +// CustomAttribute struct is used to unmarshal response to api calls. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/custom_attributes.html +type CustomAttribute struct { + Key string `json:"key"` + Value string `json:"value"` +} + +// ListCustomUserAttributes lists the custom attributes of the specified user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#list-custom-attributes +func (s *CustomAttributesService) ListCustomUserAttributes(user int, options ...RequestOptionFunc) ([]*CustomAttribute, *Response, error) { + return s.listCustomAttributes("users", user, options...) +} + +// ListCustomGroupAttributes lists the custom attributes of the specified group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#list-custom-attributes +func (s *CustomAttributesService) ListCustomGroupAttributes(group int, options ...RequestOptionFunc) ([]*CustomAttribute, *Response, error) { + return s.listCustomAttributes("groups", group, options...) +} + +// ListCustomProjectAttributes lists the custom attributes of the specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#list-custom-attributes +func (s *CustomAttributesService) ListCustomProjectAttributes(project int, options ...RequestOptionFunc) ([]*CustomAttribute, *Response, error) { + return s.listCustomAttributes("projects", project, options...) +} + +func (s *CustomAttributesService) listCustomAttributes(resource string, id int, options ...RequestOptionFunc) ([]*CustomAttribute, *Response, error) { + u := fmt.Sprintf("%s/%d/custom_attributes", resource, id) + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var cas []*CustomAttribute + resp, err := s.client.Do(req, &cas) + if err != nil { + return nil, resp, err + } + return cas, resp, err +} + +// GetCustomUserAttribute returns the user attribute with a speciifc key. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#single-custom-attribute +func (s *CustomAttributesService) GetCustomUserAttribute(user int, key string, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + return s.getCustomAttribute("users", user, key, options...) +} + +// GetCustomGroupAttribute returns the group attribute with a speciifc key. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#single-custom-attribute +func (s *CustomAttributesService) GetCustomGroupAttribute(group int, key string, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + return s.getCustomAttribute("groups", group, key, options...) +} + +// GetCustomProjectAttribute returns the project attribute with a speciifc key. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#single-custom-attribute +func (s *CustomAttributesService) GetCustomProjectAttribute(project int, key string, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + return s.getCustomAttribute("projects", project, key, options...) +} + +func (s *CustomAttributesService) getCustomAttribute(resource string, id int, key string, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + u := fmt.Sprintf("%s/%d/custom_attributes/%s", resource, id, key) + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var ca *CustomAttribute + resp, err := s.client.Do(req, &ca) + if err != nil { + return nil, resp, err + } + return ca, resp, err +} + +// SetCustomUserAttribute sets the custom attributes of the specified user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#set-custom-attribute +func (s *CustomAttributesService) SetCustomUserAttribute(user int, c CustomAttribute, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + return s.setCustomAttribute("users", user, c, options...) +} + +// SetCustomGroupAttribute sets the custom attributes of the specified group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#set-custom-attribute +func (s *CustomAttributesService) SetCustomGroupAttribute(group int, c CustomAttribute, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + return s.setCustomAttribute("groups", group, c, options...) +} + +// SetCustomProjectAttribute sets the custom attributes of the specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#set-custom-attribute +func (s *CustomAttributesService) SetCustomProjectAttribute(project int, c CustomAttribute, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + return s.setCustomAttribute("projects", project, c, options...) +} + +func (s *CustomAttributesService) setCustomAttribute(resource string, id int, c CustomAttribute, options ...RequestOptionFunc) (*CustomAttribute, *Response, error) { + u := fmt.Sprintf("%s/%d/custom_attributes/%s", resource, id, c.Key) + req, err := s.client.NewRequest(http.MethodPut, u, c, options) + if err != nil { + return nil, nil, err + } + + ca := new(CustomAttribute) + resp, err := s.client.Do(req, ca) + if err != nil { + return nil, resp, err + } + return ca, resp, err +} + +// DeleteCustomUserAttribute removes the custom attribute of the specified user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#delete-custom-attribute +func (s *CustomAttributesService) DeleteCustomUserAttribute(user int, key string, options ...RequestOptionFunc) (*Response, error) { + return s.deleteCustomAttribute("users", user, key, options...) +} + +// DeleteCustomGroupAttribute removes the custom attribute of the specified group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#delete-custom-attribute +func (s *CustomAttributesService) DeleteCustomGroupAttribute(group int, key string, options ...RequestOptionFunc) (*Response, error) { + return s.deleteCustomAttribute("groups", group, key, options...) +} + +// DeleteCustomProjectAttribute removes the custom attribute of the specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/custom_attributes.html#delete-custom-attribute +func (s *CustomAttributesService) DeleteCustomProjectAttribute(project int, key string, options ...RequestOptionFunc) (*Response, error) { + return s.deleteCustomAttribute("projects", project, key, options...) +} + +func (s *CustomAttributesService) deleteCustomAttribute(resource string, id int, key string, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("%s/%d/custom_attributes/%s", resource, id, key) + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/deploy_keys.go b/vendor/github.com/xanzy/go-gitlab/deploy_keys.go new file mode 100644 index 0000000000..6e1cafb460 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/deploy_keys.go @@ -0,0 +1,275 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// DeployKeysService handles communication with the keys related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deploy_keys.html +type DeployKeysService struct { + client *Client +} + +// InstanceDeployKey represents a GitLab deploy key with the associated +// projects it has write access to. +type InstanceDeployKey struct { + ID int `json:"id"` + Title string `json:"title"` + CreatedAt *time.Time `json:"created_at"` + Key string `json:"key"` + Fingerprint string `json:"fingerprint"` + ProjectsWithWriteAccess []*DeployKeyProject `json:"projects_with_write_access"` +} + +func (k InstanceDeployKey) String() string { + return Stringify(k) +} + +// DeployKeyProject refers to a project an InstanceDeployKey has write access to. +type DeployKeyProject struct { + ID int `json:"id"` + Description string `json:"description"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + CreatedAt *time.Time `json:"created_at"` +} + +func (k DeployKeyProject) String() string { + return Stringify(k) +} + +// ProjectDeployKey represents a GitLab project deploy key. +type ProjectDeployKey struct { + ID int `json:"id"` + Title string `json:"title"` + Key string `json:"key"` + CreatedAt *time.Time `json:"created_at"` + CanPush bool `json:"can_push"` +} + +func (k ProjectDeployKey) String() string { + return Stringify(k) +} + +// ListProjectDeployKeysOptions represents the available ListAllDeployKeys() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#list-all-deploy-keys +type ListInstanceDeployKeysOptions struct { + ListOptions + Public *bool `url:"public,omitempty" json:"public,omitempty"` +} + +// ListAllDeployKeys gets a list of all deploy keys +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#list-all-deploy-keys +func (s *DeployKeysService) ListAllDeployKeys(opt *ListInstanceDeployKeysOptions, options ...RequestOptionFunc) ([]*InstanceDeployKey, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "deploy_keys", opt, options) + if err != nil { + return nil, nil, err + } + + var ks []*InstanceDeployKey + resp, err := s.client.Do(req, &ks) + if err != nil { + return nil, resp, err + } + + return ks, resp, err +} + +// ListProjectDeployKeysOptions represents the available ListProjectDeployKeys() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#list-deploy-keys-for-project +type ListProjectDeployKeysOptions ListOptions + +// ListProjectDeployKeys gets a list of a project's deploy keys +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#list-deploy-keys-for-project +func (s *DeployKeysService) ListProjectDeployKeys(pid interface{}, opt *ListProjectDeployKeysOptions, options ...RequestOptionFunc) ([]*ProjectDeployKey, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_keys", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ks []*ProjectDeployKey + resp, err := s.client.Do(req, &ks) + if err != nil { + return nil, resp, err + } + + return ks, resp, err +} + +// GetDeployKey gets a single deploy key. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#get-a-single-deploy-key +func (s *DeployKeysService) GetDeployKey(pid interface{}, deployKey int, options ...RequestOptionFunc) (*ProjectDeployKey, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_keys/%d", PathEscape(project), deployKey) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + k := new(ProjectDeployKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// AddDeployKeyOptions represents the available ADDDeployKey() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#add-deploy-key +type AddDeployKeyOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Key *string `url:"key,omitempty" json:"key,omitempty"` + CanPush *bool `url:"can_push,omitempty" json:"can_push,omitempty"` +} + +// AddDeployKey creates a new deploy key for a project. If deploy key already +// exists in another project - it will be joined to project but only if +// original one was is accessible by same user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#add-deploy-key +func (s *DeployKeysService) AddDeployKey(pid interface{}, opt *AddDeployKeyOptions, options ...RequestOptionFunc) (*ProjectDeployKey, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_keys", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + k := new(ProjectDeployKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// DeleteDeployKey deletes a deploy key from a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#delete-deploy-key +func (s *DeployKeysService) DeleteDeployKey(pid interface{}, deployKey int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/deploy_keys/%d", PathEscape(project), deployKey) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// EnableDeployKey enables a deploy key. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#enable-a-deploy-key +func (s *DeployKeysService) EnableDeployKey(pid interface{}, deployKey int, options ...RequestOptionFunc) (*ProjectDeployKey, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_keys/%d/enable", PathEscape(project), deployKey) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + k := new(ProjectDeployKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// UpdateDeployKeyOptions represents the available UpdateDeployKey() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#update-deploy-key +type UpdateDeployKeyOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + CanPush *bool `url:"can_push,omitempty" json:"can_push,omitempty"` +} + +// UpdateDeployKey updates a deploy key for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_keys.html#update-deploy-key +func (s *DeployKeysService) UpdateDeployKey(pid interface{}, deployKey int, opt *UpdateDeployKeyOptions, options ...RequestOptionFunc) (*ProjectDeployKey, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_keys/%d", PathEscape(project), deployKey) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + k := new(ProjectDeployKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/deploy_tokens.go b/vendor/github.com/xanzy/go-gitlab/deploy_tokens.go new file mode 100644 index 0000000000..07c53cc20a --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/deploy_tokens.go @@ -0,0 +1,290 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// DeployTokensService handles communication with the deploy tokens related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deploy_tokens.html +type DeployTokensService struct { + client *Client +} + +// DeployToken represents a GitLab deploy token. +type DeployToken struct { + ID int `json:"id"` + Name string `json:"name"` + Username string `json:"username"` + ExpiresAt *time.Time `json:"expires_at"` + Revoked bool `json:"revoked"` + Expired bool `json:"expired"` + Token string `json:"token,omitempty"` + Scopes []string `json:"scopes"` +} + +func (k DeployToken) String() string { + return Stringify(k) +} + +// ListAllDeployTokens gets a list of all deploy tokens. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#list-all-deploy-tokens +func (s *DeployTokensService) ListAllDeployTokens(options ...RequestOptionFunc) ([]*DeployToken, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "deploy_tokens", nil, options) + if err != nil { + return nil, nil, err + } + + var ts []*DeployToken + resp, err := s.client.Do(req, &ts) + if err != nil { + return nil, resp, err + } + + return ts, resp, err +} + +// ListProjectDeployTokensOptions represents the available ListProjectDeployTokens() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#list-project-deploy-tokens +type ListProjectDeployTokensOptions ListOptions + +// ListProjectDeployTokens gets a list of a project's deploy tokens. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#list-project-deploy-tokens +func (s *DeployTokensService) ListProjectDeployTokens(pid interface{}, opt *ListProjectDeployTokensOptions, options ...RequestOptionFunc) ([]*DeployToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_tokens", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ts []*DeployToken + resp, err := s.client.Do(req, &ts) + if err != nil { + return nil, resp, err + } + + return ts, resp, err +} + +// GetProjectDeployToken gets a single deploy token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#get-a-project-deploy-token +func (s *DeployTokensService) GetProjectDeployToken(pid interface{}, deployToken int, options ...RequestOptionFunc) (*DeployToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_tokens/%d", PathEscape(project), deployToken) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(DeployToken) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// CreateProjectDeployTokenOptions represents the available CreateProjectDeployToken() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#create-a-project-deploy-token +type CreateProjectDeployTokenOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ExpiresAt *time.Time `url:"expires_at,omitempty" json:"expires_at,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + Scopes *[]string `url:"scopes,omitempty" json:"scopes,omitempty"` +} + +// CreateProjectDeployToken creates a new deploy token for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#create-a-project-deploy-token +func (s *DeployTokensService) CreateProjectDeployToken(pid interface{}, opt *CreateProjectDeployTokenOptions, options ...RequestOptionFunc) (*DeployToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deploy_tokens", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + t := new(DeployToken) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// DeleteProjectDeployToken removes a deploy token from the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#delete-a-project-deploy-token +func (s *DeployTokensService) DeleteProjectDeployToken(pid interface{}, deployToken int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/deploy_tokens/%d", PathEscape(project), deployToken) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListGroupDeployTokensOptions represents the available ListGroupDeployTokens() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#list-group-deploy-tokens +type ListGroupDeployTokensOptions ListOptions + +// ListGroupDeployTokens gets a list of a group’s deploy tokens. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#list-group-deploy-tokens +func (s *DeployTokensService) ListGroupDeployTokens(gid interface{}, opt *ListGroupDeployTokensOptions, options ...RequestOptionFunc) ([]*DeployToken, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/deploy_tokens", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ts []*DeployToken + resp, err := s.client.Do(req, &ts) + if err != nil { + return nil, resp, err + } + + return ts, resp, err +} + +// GetGroupDeployToken gets a single deploy token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#get-a-group-deploy-token +func (s *DeployTokensService) GetGroupDeployToken(gid interface{}, deployToken int, options ...RequestOptionFunc) (*DeployToken, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/deploy_tokens/%d", PathEscape(group), deployToken) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(DeployToken) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// CreateGroupDeployTokenOptions represents the available CreateGroupDeployToken() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#create-a-group-deploy-token +type CreateGroupDeployTokenOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ExpiresAt *time.Time `url:"expires_at,omitempty" json:"expires_at,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + Scopes *[]string `url:"scopes,omitempty" json:"scopes,omitempty"` +} + +// CreateGroupDeployToken creates a new deploy token for a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#create-a-group-deploy-token +func (s *DeployTokensService) CreateGroupDeployToken(gid interface{}, opt *CreateGroupDeployTokenOptions, options ...RequestOptionFunc) (*DeployToken, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/deploy_tokens", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + t := new(DeployToken) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// DeleteGroupDeployToken removes a deploy token from the group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deploy_tokens.html#delete-a-group-deploy-token +func (s *DeployTokensService) DeleteGroupDeployToken(gid interface{}, deployToken int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/deploy_tokens/%d", PathEscape(group), deployToken) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/deployments.go b/vendor/github.com/xanzy/go-gitlab/deployments.go new file mode 100644 index 0000000000..251dd2fc48 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/deployments.go @@ -0,0 +1,203 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// DeploymentsService handles communication with the deployment related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deployments.html +type DeploymentsService struct { + client *Client +} + +// Deployment represents the Gitlab deployment +type Deployment struct { + ID int `json:"id"` + IID int `json:"iid"` + Ref string `json:"ref"` + SHA string `json:"sha"` + Status string `json:"status"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + User *ProjectUser `json:"user"` + Environment *Environment `json:"environment"` + Deployable struct { + ID int `json:"id"` + Status string `json:"status"` + Stage string `json:"stage"` + Name string `json:"name"` + Ref string `json:"ref"` + Tag bool `json:"tag"` + Coverage float64 `json:"coverage"` + CreatedAt *time.Time `json:"created_at"` + StartedAt *time.Time `json:"started_at"` + FinishedAt *time.Time `json:"finished_at"` + Duration float64 `json:"duration"` + User *User `json:"user"` + Commit *Commit `json:"commit"` + Pipeline struct { + ID int `json:"id"` + SHA string `json:"sha"` + Ref string `json:"ref"` + Status string `json:"status"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + } `json:"pipeline"` + Runner *Runner `json:"runner"` + } `json:"deployable"` +} + +// ListProjectDeploymentsOptions represents the available ListProjectDeployments() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deployments.html#list-project-deployments +type ListProjectDeploymentsOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Environment *string `url:"environment,omitempty" json:"environment,omitempty"` + Status *string `url:"status,omitempty" json:"status,omitempty"` + + // Only for Gitlab versions less than 14 + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + + // Only for Gitlab 14 or higher + FinishedAfter *time.Time `url:"finished_after,omitempty" json:"finished_after,omitempty"` + FinishedBefore *time.Time `url:"finished_before,omitempty" json:"finished_before,omitempty"` +} + +// ListProjectDeployments gets a list of deployments in a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deployments.html#list-project-deployments +func (s *DeploymentsService) ListProjectDeployments(pid interface{}, opts *ListProjectDeploymentsOptions, options ...RequestOptionFunc) ([]*Deployment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deployments", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, nil, err + } + + var ds []*Deployment + resp, err := s.client.Do(req, &ds) + if err != nil { + return nil, resp, err + } + + return ds, resp, err +} + +// GetProjectDeployment get a deployment for a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deployments.html#get-a-specific-deployment +func (s *DeploymentsService) GetProjectDeployment(pid interface{}, deployment int, options ...RequestOptionFunc) (*Deployment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deployments/%d", PathEscape(project), deployment) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + d := new(Deployment) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// CreateProjectDeploymentOptions represents the available +// CreateProjectDeployment() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deployments.html#create-a-deployment +type CreateProjectDeploymentOptions struct { + Environment *string `url:"environment,omitempty" json:"environment,omitempty"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + SHA *string `url:"sha,omitempty" json:"sha,omitempty"` + Tag *bool `url:"tag,omitempty" json:"tag,omitempty"` + Status *DeploymentStatusValue `url:"status,omitempty" json:"status,omitempty"` +} + +// CreateProjectDeployment creates a project deployment. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deployments.html#create-a-deployment +func (s *DeploymentsService) CreateProjectDeployment(pid interface{}, opt *CreateProjectDeploymentOptions, options ...RequestOptionFunc) (*Deployment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deployments", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Deployment) + resp, err := s.client.Do(req, &d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// UpdateProjectDeploymentOptions represents the available +// UpdateProjectDeployment() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deployments.html#update-a-deployment +type UpdateProjectDeploymentOptions struct { + Status *DeploymentStatusValue `url:"status,omitempty" json:"status,omitempty"` +} + +// UpdateProjectDeployment updates a project deployment. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/deployments.html#update-a-deployment +func (s *DeploymentsService) UpdateProjectDeployment(pid interface{}, deployment int, opt *UpdateProjectDeploymentOptions, options ...RequestOptionFunc) (*Deployment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deployments/%d", PathEscape(project), deployment) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Deployment) + resp, err := s.client.Do(req, &d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/deployments_merge_requests.go b/vendor/github.com/xanzy/go-gitlab/deployments_merge_requests.go new file mode 100644 index 0000000000..1958f0e5a2 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/deployments_merge_requests.go @@ -0,0 +1,53 @@ +// Copyright 2022, Daniela Filipe Bento +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// DeploymentMergeRequestsService handles communication with the deployment's +// merge requests related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deployments.html#list-of-merge-requests-associated-with-a-deployment +type DeploymentMergeRequestsService struct { + client *Client +} + +// ListDeploymentMergeRequests get the merge requests associated with deployment. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/deployments.html#list-of-merge-requests-associated-with-a-deployment +func (s *DeploymentMergeRequestsService) ListDeploymentMergeRequests(pid interface{}, deployment int, opts *ListMergeRequestsOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/deployments/%d/merge_requests", PathEscape(project), deployment) + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, nil, err + } + + var mrs []*MergeRequest + resp, err := s.client.Do(req, &mrs) + if err != nil { + return nil, resp, err + } + + return mrs, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/discussions.go b/vendor/github.com/xanzy/go-gitlab/discussions.go new file mode 100644 index 0000000000..9b673e2aed --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/discussions.go @@ -0,0 +1,1114 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// DiscussionsService handles communication with the discussions related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/discussions.html +type DiscussionsService struct { + client *Client +} + +// Discussion represents a GitLab discussion. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/discussions.html +type Discussion struct { + ID string `json:"id"` + IndividualNote bool `json:"individual_note"` + Notes []*Note `json:"notes"` +} + +func (d Discussion) String() string { + return Stringify(d) +} + +// ListIssueDiscussionsOptions represents the available ListIssueDiscussions() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-issue-discussion-items +type ListIssueDiscussionsOptions ListOptions + +// ListIssueDiscussions gets a list of all discussions for a single +// issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-issue-discussion-items +func (s *DiscussionsService) ListIssueDiscussions(pid interface{}, issue int, opt *ListIssueDiscussionsOptions, options ...RequestOptionFunc) ([]*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/discussions", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ds []*Discussion + resp, err := s.client.Do(req, &ds) + if err != nil { + return nil, resp, err + } + + return ds, resp, err +} + +// GetIssueDiscussion returns a single discussion for a specific project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#get-single-issue-discussion-item +func (s *DiscussionsService) GetIssueDiscussion(pid interface{}, issue int, discussion string, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/discussions/%s", + PathEscape(project), + issue, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// CreateIssueDiscussionOptions represents the available CreateIssueDiscussion() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-issue-thread +type CreateIssueDiscussionOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// CreateIssueDiscussion creates a new discussion to a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-issue-thread +func (s *DiscussionsService) CreateIssueDiscussion(pid interface{}, issue int, opt *CreateIssueDiscussionOptions, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/discussions", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// AddIssueDiscussionNoteOptions represents the available AddIssueDiscussionNote() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-issue-thread +type AddIssueDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// AddIssueDiscussionNote creates a new discussion to a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-issue-thread +func (s *DiscussionsService) AddIssueDiscussionNote(pid interface{}, issue int, discussion string, opt *AddIssueDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/discussions/%s/notes", + PathEscape(project), + issue, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateIssueDiscussionNoteOptions represents the available +// UpdateIssueDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-existing-issue-thread-note +type UpdateIssueDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// UpdateIssueDiscussionNote modifies existing discussion of an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-existing-issue-thread-note +func (s *DiscussionsService) UpdateIssueDiscussionNote(pid interface{}, issue int, discussion string, note int, opt *UpdateIssueDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/discussions/%s/notes/%d", + PathEscape(project), + issue, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteIssueDiscussionNote deletes an existing discussion of an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#delete-an-issue-thread-note +func (s *DiscussionsService) DeleteIssueDiscussionNote(pid interface{}, issue int, discussion string, note int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/discussions/%s/notes/%d", + PathEscape(project), + issue, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListSnippetDiscussionsOptions represents the available ListSnippetDiscussions() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-snippet-discussion-items +type ListSnippetDiscussionsOptions ListOptions + +// ListSnippetDiscussions gets a list of all discussions for a single +// snippet. Snippet discussions are comments users can post to a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-snippet-discussion-items +func (s *DiscussionsService) ListSnippetDiscussions(pid interface{}, snippet int, opt *ListSnippetDiscussionsOptions, options ...RequestOptionFunc) ([]*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/discussions", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ds []*Discussion + resp, err := s.client.Do(req, &ds) + if err != nil { + return nil, resp, err + } + + return ds, resp, err +} + +// GetSnippetDiscussion returns a single discussion for a given snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#get-single-snippet-discussion-item +func (s *DiscussionsService) GetSnippetDiscussion(pid interface{}, snippet int, discussion string, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/discussions/%s", + PathEscape(project), + snippet, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// CreateSnippetDiscussionOptions represents the available +// CreateSnippetDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-snippet-thread +type CreateSnippetDiscussionOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// CreateSnippetDiscussion creates a new discussion for a single snippet. +// Snippet discussions are comments users can post to a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-snippet-thread +func (s *DiscussionsService) CreateSnippetDiscussion(pid interface{}, snippet int, opt *CreateSnippetDiscussionOptions, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/discussions", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// AddSnippetDiscussionNoteOptions represents the available +// AddSnippetDiscussionNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-snippet-thread +type AddSnippetDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// AddSnippetDiscussionNote creates a new discussion to a single project +// snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-snippet-thread +func (s *DiscussionsService) AddSnippetDiscussionNote(pid interface{}, snippet int, discussion string, opt *AddSnippetDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/discussions/%s/notes", + PathEscape(project), + snippet, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateSnippetDiscussionNoteOptions represents the available +// UpdateSnippetDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-existing-snippet-thread-note +type UpdateSnippetDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// UpdateSnippetDiscussionNote modifies existing discussion of a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-existing-snippet-thread-note +func (s *DiscussionsService) UpdateSnippetDiscussionNote(pid interface{}, snippet int, discussion string, note int, opt *UpdateSnippetDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/discussions/%s/notes/%d", + PathEscape(project), + snippet, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteSnippetDiscussionNote deletes an existing discussion of a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#delete-a-snippet-thread-note +func (s *DiscussionsService) DeleteSnippetDiscussionNote(pid interface{}, snippet int, discussion string, note int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/discussions/%s/notes/%d", + PathEscape(project), + snippet, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListGroupEpicDiscussionsOptions represents the available +// ListEpicDiscussions() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-group-epic-discussion-items +type ListGroupEpicDiscussionsOptions ListOptions + +// ListGroupEpicDiscussions gets a list of all discussions for a single +// epic. Epic discussions are comments users can post to a epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-group-epic-discussion-items +func (s *DiscussionsService) ListGroupEpicDiscussions(gid interface{}, epic int, opt *ListGroupEpicDiscussionsOptions, options ...RequestOptionFunc) ([]*Discussion, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/discussions", + PathEscape(group), + epic, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ds []*Discussion + resp, err := s.client.Do(req, &ds) + if err != nil { + return nil, resp, err + } + + return ds, resp, err +} + +// GetEpicDiscussion returns a single discussion for a given epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#get-single-epic-discussion-item +func (s *DiscussionsService) GetEpicDiscussion(gid interface{}, epic int, discussion string, options ...RequestOptionFunc) (*Discussion, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/discussions/%s", + PathEscape(group), + epic, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// CreateEpicDiscussionOptions represents the available CreateEpicDiscussion() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-epic-thread +type CreateEpicDiscussionOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// CreateEpicDiscussion creates a new discussion for a single epic. Epic +// discussions are comments users can post to a epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-epic-thread +func (s *DiscussionsService) CreateEpicDiscussion(gid interface{}, epic int, opt *CreateEpicDiscussionOptions, options ...RequestOptionFunc) (*Discussion, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/discussions", + PathEscape(group), + epic, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// AddEpicDiscussionNoteOptions represents the available +// AddEpicDiscussionNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-epic-thread +type AddEpicDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// AddEpicDiscussionNote creates a new discussion to a single project epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-epic-thread +func (s *DiscussionsService) AddEpicDiscussionNote(gid interface{}, epic int, discussion string, opt *AddEpicDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/discussions/%s/notes", + PathEscape(group), + epic, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateEpicDiscussionNoteOptions represents the available UpdateEpicDiscussion() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-existing-epic-thread-note +type UpdateEpicDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// UpdateEpicDiscussionNote modifies existing discussion of a epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-existing-epic-thread-note +func (s *DiscussionsService) UpdateEpicDiscussionNote(gid interface{}, epic int, discussion string, note int, opt *UpdateEpicDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/discussions/%s/notes/%d", + PathEscape(group), + epic, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteEpicDiscussionNote deletes an existing discussion of a epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#delete-an-epic-thread-note +func (s *DiscussionsService) DeleteEpicDiscussionNote(gid interface{}, epic int, discussion string, note int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/discussions/%s/notes/%d", + PathEscape(group), + epic, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListMergeRequestDiscussionsOptions represents the available +// ListMergeRequestDiscussions() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-merge-request-discussion-items +type ListMergeRequestDiscussionsOptions ListOptions + +// ListMergeRequestDiscussions gets a list of all discussions for a single +// merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-merge-request-discussion-items +func (s *DiscussionsService) ListMergeRequestDiscussions(pid interface{}, mergeRequest int, opt *ListMergeRequestDiscussionsOptions, options ...RequestOptionFunc) ([]*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/discussions", + PathEscape(project), + mergeRequest, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ds []*Discussion + resp, err := s.client.Do(req, &ds) + if err != nil { + return nil, resp, err + } + + return ds, resp, err +} + +// GetMergeRequestDiscussion returns a single discussion for a given merge +// request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#get-single-merge-request-discussion-item +func (s *DiscussionsService) GetMergeRequestDiscussion(pid interface{}, mergeRequest int, discussion string, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/discussions/%s", + PathEscape(project), + mergeRequest, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// CreateMergeRequestDiscussionOptions represents the available +// CreateMergeRequestDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-merge-request-thread +type CreateMergeRequestDiscussionOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CommitID *string `url:"commit_id,omitempty" json:"commit_id,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` + Position *NotePosition `url:"position,omitempty" json:"position,omitempty"` +} + +// CreateMergeRequestDiscussion creates a new discussion for a single merge +// request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-merge-request-thread +func (s *DiscussionsService) CreateMergeRequestDiscussion(pid interface{}, mergeRequest int, opt *CreateMergeRequestDiscussionOptions, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/discussions", + PathEscape(project), + mergeRequest, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// ResolveMergeRequestDiscussionOptions represents the available +// ResolveMergeRequestDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#resolve-a-merge-request-thread +type ResolveMergeRequestDiscussionOptions struct { + Resolved *bool `url:"resolved,omitempty" json:"resolved,omitempty"` +} + +// ResolveMergeRequestDiscussion resolves/unresolves whole discussion of a merge +// request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#resolve-a-merge-request-thread +func (s *DiscussionsService) ResolveMergeRequestDiscussion(pid interface{}, mergeRequest int, discussion string, opt *ResolveMergeRequestDiscussionOptions, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/discussions/%s", + PathEscape(project), + mergeRequest, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// AddMergeRequestDiscussionNoteOptions represents the available +// AddMergeRequestDiscussionNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-merge-request-thread +type AddMergeRequestDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// AddMergeRequestDiscussionNote creates a new discussion to a single project +// merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-merge-request-thread +func (s *DiscussionsService) AddMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, opt *AddMergeRequestDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/discussions/%s/notes", + PathEscape(project), + mergeRequest, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateMergeRequestDiscussionNoteOptions represents the available +// UpdateMergeRequestDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-an-existing-merge-request-thread-note +type UpdateMergeRequestDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` + Resolved *bool `url:"resolved,omitempty" json:"resolved,omitempty"` +} + +// UpdateMergeRequestDiscussionNote modifies existing discussion of a merge +// request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-an-existing-merge-request-thread-note +func (s *DiscussionsService) UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, opt *UpdateMergeRequestDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/discussions/%s/notes/%d", + PathEscape(project), + mergeRequest, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteMergeRequestDiscussionNote deletes an existing discussion of a merge +// request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#delete-a-merge-request-thread-note +func (s *DiscussionsService) DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/discussions/%s/notes/%d", + PathEscape(project), + mergeRequest, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListCommitDiscussionsOptions represents the available +// ListCommitDiscussions() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-commit-discussion-items +type ListCommitDiscussionsOptions ListOptions + +// ListCommitDiscussions gets a list of all discussions for a single +// commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#list-project-commit-discussion-items +func (s *DiscussionsService) ListCommitDiscussions(pid interface{}, commit string, opt *ListCommitDiscussionsOptions, options ...RequestOptionFunc) ([]*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/discussions", + PathEscape(project), + commit, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ds []*Discussion + resp, err := s.client.Do(req, &ds) + if err != nil { + return nil, resp, err + } + + return ds, resp, err +} + +// GetCommitDiscussion returns a single discussion for a specific project +// commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#get-single-commit-discussion-item +func (s *DiscussionsService) GetCommitDiscussion(pid interface{}, commit string, discussion string, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/discussions/%s", + PathEscape(project), + commit, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// CreateCommitDiscussionOptions represents the available +// CreateCommitDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-commit-thread +type CreateCommitDiscussionOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` + Position *NotePosition `url:"position,omitempty" json:"position,omitempty"` +} + +// CreateCommitDiscussion creates a new discussion to a single project commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#create-new-commit-thread +func (s *DiscussionsService) CreateCommitDiscussion(pid interface{}, commit string, opt *CreateCommitDiscussionOptions, options ...RequestOptionFunc) (*Discussion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/discussions", + PathEscape(project), + commit, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + d := new(Discussion) + resp, err := s.client.Do(req, d) + if err != nil { + return nil, resp, err + } + + return d, resp, err +} + +// AddCommitDiscussionNoteOptions represents the available +// AddCommitDiscussionNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-commit-thread +type AddCommitDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// AddCommitDiscussionNote creates a new discussion to a single project commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#add-note-to-existing-commit-thread +func (s *DiscussionsService) AddCommitDiscussionNote(pid interface{}, commit string, discussion string, opt *AddCommitDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/discussions/%s/notes", + PathEscape(project), + commit, + discussion, + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateCommitDiscussionNoteOptions represents the available +// UpdateCommitDiscussion() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-an-existing-commit-thread-note +type UpdateCommitDiscussionNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// UpdateCommitDiscussionNote modifies existing discussion of an commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#modify-an-existing-commit-thread-note +func (s *DiscussionsService) UpdateCommitDiscussionNote(pid interface{}, commit string, discussion string, note int, opt *UpdateCommitDiscussionNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/discussions/%s/notes/%d", + PathEscape(project), + commit, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteCommitDiscussionNote deletes an existing discussion of an commit. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/discussions.html#delete-a-commit-thread-note +func (s *DiscussionsService) DeleteCommitDiscussionNote(pid interface{}, commit string, discussion string, note int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/repository/commits/%s/discussions/%s/notes/%d", + PathEscape(project), + commit, + discussion, + note, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/dockerfile_templates.go b/vendor/github.com/xanzy/go-gitlab/dockerfile_templates.go new file mode 100644 index 0000000000..ba91342414 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/dockerfile_templates.go @@ -0,0 +1,93 @@ +// +// Copyright 2022, FantasyTeddy +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// DockerfileTemplatesService handles communication with the Dockerfile +// templates related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/templates/dockerfiles.html +type DockerfileTemplatesService struct { + client *Client +} + +// DockerfileTemplate represents a GitLab Dockerfile template. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/templates/dockerfiles.html +type DockerfileTemplate struct { + Name string `json:"name"` + Content string `json:"content"` +} + +// DockerfileTemplateListItem represents a GitLab Dockerfile template from the list. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/templates/dockerfiles.html +type DockerfileTemplateListItem struct { + Key string `json:"key"` + Name string `json:"name"` +} + +// ListDockerfileTemplatesOptions represents the available ListAllTemplates() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/dockerfiles.html#list-dockerfile-templates +type ListDockerfileTemplatesOptions ListOptions + +// ListTemplates get a list of available Dockerfile templates. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/dockerfiles.html#list-dockerfile-templates +func (s *DockerfileTemplatesService) ListTemplates(opt *ListDockerfileTemplatesOptions, options ...RequestOptionFunc) ([]*DockerfileTemplateListItem, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "templates/dockerfiles", opt, options) + if err != nil { + return nil, nil, err + } + + var gs []*DockerfileTemplateListItem + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// GetTemplate get a single Dockerfile template. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/dockerfiles.html#single-dockerfile-template +func (s *DockerfileTemplatesService) GetTemplate(key string, options ...RequestOptionFunc) (*DockerfileTemplate, *Response, error) { + u := fmt.Sprintf("templates/dockerfiles/%s", url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + g := new(DockerfileTemplate) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/environments.go b/vendor/github.com/xanzy/go-gitlab/environments.go new file mode 100644 index 0000000000..119111ff8c --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/environments.go @@ -0,0 +1,224 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// EnvironmentsService handles communication with the environment related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/environments.html +type EnvironmentsService struct { + client *Client +} + +// Environment represents a GitLab environment. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/environments.html +type Environment struct { + ID int `json:"id"` + Name string `json:"name"` + Slug string `json:"slug"` + State string `json:"state"` + Tier string `json:"tier"` + ExternalURL string `json:"external_url"` + Project *Project `json:"project"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + LastDeployment *Deployment `json:"last_deployment"` +} + +func (env Environment) String() string { + return Stringify(env) +} + +// ListEnvironmentsOptions represents the available ListEnvironments() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#list-environments +type ListEnvironmentsOptions struct { + ListOptions + Name *string `url:"name,omitempty" json:"name,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + States *string `url:"states,omitempty" json:"states,omitempty"` +} + +// ListEnvironments gets a list of environments from a project, sorted by name +// alphabetically. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#list-environments +func (s *EnvironmentsService) ListEnvironments(pid interface{}, opts *ListEnvironmentsOptions, options ...RequestOptionFunc) ([]*Environment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/environments", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, nil, err + } + + var envs []*Environment + resp, err := s.client.Do(req, &envs) + if err != nil { + return nil, resp, err + } + + return envs, resp, err +} + +// GetEnvironment gets a specific environment from a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#get-a-specific-environment +func (s *EnvironmentsService) GetEnvironment(pid interface{}, environment int, options ...RequestOptionFunc) (*Environment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/environments/%d", PathEscape(project), environment) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + env := new(Environment) + resp, err := s.client.Do(req, env) + if err != nil { + return nil, resp, err + } + + return env, resp, err +} + +// CreateEnvironmentOptions represents the available CreateEnvironment() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#create-a-new-environment +type CreateEnvironmentOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ExternalURL *string `url:"external_url,omitempty" json:"external_url,omitempty"` + Tier *string `url:"tier,omitempty" json:"tier,omitempty"` +} + +// CreateEnvironment adds an environment to a project. This is an idempotent +// method and can be called multiple times with the same parameters. Createing +// an environment that is already a environment does not affect the +// existing environmentship. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#create-a-new-environment +func (s *EnvironmentsService) CreateEnvironment(pid interface{}, opt *CreateEnvironmentOptions, options ...RequestOptionFunc) (*Environment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/environments", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + env := new(Environment) + resp, err := s.client.Do(req, env) + if err != nil { + return nil, resp, err + } + + return env, resp, err +} + +// EditEnvironmentOptions represents the available EditEnvironment() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#update-an-existing-environment +type EditEnvironmentOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ExternalURL *string `url:"external_url,omitempty" json:"external_url,omitempty"` + Tier *string `url:"tier,omitempty" json:"tier,omitempty"` +} + +// EditEnvironment updates a project team environment to a specified access level.. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#update-an-existing-environment +func (s *EnvironmentsService) EditEnvironment(pid interface{}, environment int, opt *EditEnvironmentOptions, options ...RequestOptionFunc) (*Environment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/environments/%d", PathEscape(project), environment) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + env := new(Environment) + resp, err := s.client.Do(req, env) + if err != nil { + return nil, resp, err + } + + return env, resp, err +} + +// DeleteEnvironment removes an environment from a project team. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#delete-an-environment +func (s *EnvironmentsService) DeleteEnvironment(pid interface{}, environment int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/environments/%d", PathEscape(project), environment) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// StopEnvironment stop an environment from a project team. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/environments.html#stop-an-environment +func (s *EnvironmentsService) StopEnvironment(pid interface{}, environmentID int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/environments/%d/stop", PathEscape(project), environmentID) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/epic_issues.go b/vendor/github.com/xanzy/go-gitlab/epic_issues.go new file mode 100644 index 0000000000..9064c89b2a --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/epic_issues.go @@ -0,0 +1,152 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// EpicIssuesService handles communication with the epic issue related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epic_issues.html +type EpicIssuesService struct { + client *Client +} + +// EpicIssueAssignment contains both the epic and issue objects returned from +// Gitlab with the assignment ID. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epic_issues.html +type EpicIssueAssignment struct { + ID int `json:"id"` + Epic *Epic `json:"epic"` + Issue *Issue `json:"issue"` +} + +// ListEpicIssues get a list of epic issues. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/epic_issues.html#list-issues-for-an-epic +func (s *EpicIssuesService) ListEpicIssues(gid interface{}, epic int, opt *ListOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/issues", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var is []*Issue + resp, err := s.client.Do(req, &is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} + +// AssignEpicIssue assigns an existing issue to an epic. +// +// Gitlab API Docs: +// https://docs.gitlab.com/ee/api/epic_issues.html#assign-an-issue-to-the-epic +func (s *EpicIssuesService) AssignEpicIssue(gid interface{}, epic, issue int, options ...RequestOptionFunc) (*EpicIssueAssignment, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/issues/%d", PathEscape(group), epic, issue) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + a := new(EpicIssueAssignment) + resp, err := s.client.Do(req, a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// RemoveEpicIssue removes an issue from an epic. +// +// Gitlab API Docs: +// https://docs.gitlab.com/ee/api/epic_issues.html#remove-an-issue-from-the-epic +func (s *EpicIssuesService) RemoveEpicIssue(gid interface{}, epic, epicIssue int, options ...RequestOptionFunc) (*EpicIssueAssignment, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/issues/%d", PathEscape(group), epic, epicIssue) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, nil, err + } + + a := new(EpicIssueAssignment) + resp, err := s.client.Do(req, a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// UpdateEpicIsssueAssignmentOptions describes the UpdateEpicIssueAssignment() +// options. +// +// Gitlab API Docs: +// https://docs.gitlab.com/ee/api/epic_issues.html#update-epic---issue-association +type UpdateEpicIsssueAssignmentOptions struct { + *ListOptions + MoveBeforeID *int `url:"move_before_id,omitempty" json:"move_before_id,omitempty"` + MoveAfterID *int `url:"move_after_id,omitempty" json:"move_after_id,omitempty"` +} + +// UpdateEpicIssueAssignment moves an issue before or after another issue in an +// epic issue list. +// +// Gitlab API Docs: +// https://docs.gitlab.com/ee/api/epic_issues.html#update-epic---issue-association +func (s *EpicIssuesService) UpdateEpicIssueAssignment(gid interface{}, epic, epicIssue int, opt *UpdateEpicIsssueAssignmentOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/issues/%d", PathEscape(group), epic, epicIssue) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + var is []*Issue + resp, err := s.client.Do(req, &is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/epics.go b/vendor/github.com/xanzy/go-gitlab/epics.go new file mode 100644 index 0000000000..cff3354b16 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/epics.go @@ -0,0 +1,266 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// EpicsService handles communication with the epic related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html +type EpicsService struct { + client *Client +} + +// EpicAuthor represents a author of the epic. +type EpicAuthor struct { + ID int `json:"id"` + State string `json:"state"` + WebURL string `json:"web_url"` + Name string `json:"name"` + AvatarURL string `json:"avatar_url"` + Username string `json:"username"` +} + +// Epic represents a GitLab epic. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html +type Epic struct { + ID int `json:"id"` + IID int `json:"iid"` + GroupID int `json:"group_id"` + ParentID int `json:"parent_id"` + Title string `json:"title"` + Description string `json:"description"` + State string `json:"state"` + Confidential bool `json:"confidential"` + WebURL string `json:"web_url"` + Author *EpicAuthor `json:"author"` + StartDate *ISOTime `json:"start_date"` + StartDateIsFixed bool `json:"start_date_is_fixed"` + StartDateFixed *ISOTime `json:"start_date_fixed"` + StartDateFromMilestones *ISOTime `json:"start_date_from_milestones"` + DueDate *ISOTime `json:"due_date"` + DueDateIsFixed bool `json:"due_date_is_fixed"` + DueDateFixed *ISOTime `json:"due_date_fixed"` + DueDateFromMilestones *ISOTime `json:"due_date_from_milestones"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + ClosedAt *time.Time `json:"closed_at"` + Labels []string `json:"labels"` + Upvotes int `json:"upvotes"` + Downvotes int `json:"downvotes"` + UserNotesCount int `json:"user_notes_count"` + URL string `json:"url"` +} + +func (e Epic) String() string { + return Stringify(e) +} + +// ListGroupEpicsOptions represents the available ListGroupEpics() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#list-epics-for-a-group +type ListGroupEpicsOptions struct { + ListOptions + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + WithLabelDetails *bool `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + State *string `url:"state,omitempty" json:"state,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + IncludeAncestorGroups *bool `url:"include_ancestor_groups,omitempty" json:"include_ancestor_groups,omitempty"` + IncludeDescendantGroups *bool `url:"include_descendant_groups,omitempty" json:"include_descendant_groups,omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` +} + +// ListGroupEpics gets a list of group epics. This function accepts pagination +// parameters page and per_page to return the list of group epics. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#list-epics-for-a-group +func (s *EpicsService) ListGroupEpics(gid interface{}, opt *ListGroupEpicsOptions, options ...RequestOptionFunc) ([]*Epic, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var es []*Epic + resp, err := s.client.Do(req, &es) + if err != nil { + return nil, resp, err + } + + return es, resp, err +} + +// GetEpic gets a single group epic. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#single-epic +func (s *EpicsService) GetEpic(gid interface{}, epic int, options ...RequestOptionFunc) (*Epic, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + e := new(Epic) + resp, err := s.client.Do(req, e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// GetEpicLinks gets all child epics of an epic. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epic_links.html +func (s *EpicsService) GetEpicLinks(gid interface{}, epic int, options ...RequestOptionFunc) ([]*Epic, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/epics", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var e []*Epic + resp, err := s.client.Do(req, &e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// CreateEpicOptions represents the available CreateEpic() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#new-epic +type CreateEpicOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + StartDateIsFixed *bool `url:"start_date_is_fixed,omitempty" json:"start_date_is_fixed,omitempty"` + StartDateFixed *ISOTime `url:"start_date_fixed,omitempty" json:"start_date_fixed,omitempty"` + DueDateIsFixed *bool `url:"due_date_is_fixed,omitempty" json:"due_date_is_fixed,omitempty"` + DueDateFixed *ISOTime `url:"due_date_fixed,omitempty" json:"due_date_fixed,omitempty"` +} + +// CreateEpic creates a new group epic. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#new-epic +func (s *EpicsService) CreateEpic(gid interface{}, opt *CreateEpicOptions, options ...RequestOptionFunc) (*Epic, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + e := new(Epic) + resp, err := s.client.Do(req, e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// UpdateEpicOptions represents the available UpdateEpic() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#update-epic +type UpdateEpicOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + StartDateIsFixed *bool `url:"start_date_is_fixed,omitempty" json:"start_date_is_fixed,omitempty"` + StartDateFixed *ISOTime `url:"start_date_fixed,omitempty" json:"start_date_fixed,omitempty"` + DueDateIsFixed *bool `url:"due_date_is_fixed,omitempty" json:"due_date_is_fixed,omitempty"` + DueDateFixed *ISOTime `url:"due_date_fixed,omitempty" json:"due_date_fixed,omitempty"` + StateEvent *string `url:"state_event,omitempty" json:"state_event,omitempty"` +} + +// UpdateEpic updates an existing group epic. This function is also used +// to mark an epic as closed. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#update-epic +func (s *EpicsService) UpdateEpic(gid interface{}, epic int, opt *UpdateEpicOptions, options ...RequestOptionFunc) (*Epic, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + e := new(Epic) + resp, err := s.client.Do(req, e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// DeleteEpic deletes a single group epic. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#delete-epic +func (s *EpicsService) DeleteEpic(gid interface{}, epic int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/error_tracking.go b/vendor/github.com/xanzy/go-gitlab/error_tracking.go new file mode 100644 index 0000000000..afa6be43d6 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/error_tracking.go @@ -0,0 +1,196 @@ +// +// Copyright 2022, Ryan Glab +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ErrorTrackingService handles communication with the error tracking +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/error_tracking.html +type ErrorTrackingService struct { + client *Client +} + +// ErrorTrackingClientKey represents an error tracking client key. +// +// GitLab docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#error-tracking-client-keys +type ErrorTrackingClientKey struct { + ID int `json:"id"` + Active bool `json:"active"` + PublicKey string `json:"public_key"` + SentryDsn string `json:"sentry_dsn"` +} + +func (p ErrorTrackingClientKey) String() string { + return Stringify(p) +} + +// ErrorTrackingSettings represents error tracking settings for a GitLab project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/error_tracking.html#error-tracking-project-settings +type ErrorTrackingSettings struct { + Active bool `json:"active"` + ProjectName string `json:"project_name"` + SentryExternalURL string `json:"sentry_external_url"` + APIURL string `json:"api_url"` + Integrated bool `json:"integrated"` +} + +func (p ErrorTrackingSettings) String() string { + return Stringify(p) +} + +// GetErrorTrackingSettings gets error tracking settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#get-error-tracking-settings +func (s *ErrorTrackingService) GetErrorTrackingSettings(pid interface{}, options ...RequestOptionFunc) (*ErrorTrackingSettings, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/error_tracking/settings", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ets := new(ErrorTrackingSettings) + resp, err := s.client.Do(req, ets) + if err != nil { + return nil, resp, err + } + + return ets, resp, err +} + +// EnableDisableErrorTrackingOptions represents the available +// EnableDisableErrorTracking() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#enable-or-disable-the-error-tracking-project-settings +type EnableDisableErrorTrackingOptions struct { + Active *bool `url:"active,omitempty" json:"active,omitempty"` + Integrated *bool `url:"integrated,omitempty" json:"integrated,omitempty"` +} + +// EnableDisableErrorTracking allows you to enable or disable the error tracking +// settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#enable-or-disable-the-error-tracking-project-settings +func (s *ErrorTrackingService) EnableDisableErrorTracking(pid interface{}, opt *EnableDisableErrorTrackingOptions, options ...RequestOptionFunc) (*ErrorTrackingSettings, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/error_tracking/settings", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPatch, u, opt, options) + if err != nil { + return nil, nil, err + } + + ets := new(ErrorTrackingSettings) + resp, err := s.client.Do(req, &ets) + if err != nil { + return nil, resp, err + } + + return ets, resp, err +} + +// ListClientKeysOptions represents the available ListClientKeys() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#list-project-client-keys +type ListClientKeysOptions ListOptions + +// ListClientKeys lists error tracking project client keys. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#list-project-client-keys +func (s *ErrorTrackingService) ListClientKeys(pid interface{}, opt *ListClientKeysOptions, options ...RequestOptionFunc) ([]*ErrorTrackingClientKey, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/error_tracking/client_keys", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var cks []*ErrorTrackingClientKey + resp, err := s.client.Do(req, &cks) + if err != nil { + return nil, resp, err + } + + return cks, resp, err +} + +// CreateClientKey creates a new client key for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#create-a-client-key +func (s *ErrorTrackingService) CreateClientKey(pid interface{}, options ...RequestOptionFunc) (*ErrorTrackingClientKey, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/error_tracking/client_keys", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + ck := new(ErrorTrackingClientKey) + resp, err := s.client.Do(req, ck) + if err != nil { + return nil, resp, err + } + + return ck, resp, err +} + +// DeleteClientKey removes a client key from the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/error_tracking.html#delete-a-client-key +func (s *ErrorTrackingService) DeleteClientKey(pid interface{}, keyID int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/error_tracking/client_keys/%d", PathEscape(project), keyID) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/event_parsing.go b/vendor/github.com/xanzy/go-gitlab/event_parsing.go new file mode 100644 index 0000000000..3943abadb1 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/event_parsing.go @@ -0,0 +1,286 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "encoding/json" + "fmt" + "net/http" +) + +// EventType represents a Gitlab event type. +type EventType string + +// List of available event types. +const ( + EventConfidentialIssue EventType = "Confidential Issue Hook" + EventConfidentialNote EventType = "Confidential Note Hook" + EventTypeBuild EventType = "Build Hook" + EventTypeDeployment EventType = "Deployment Hook" + EventTypeFeatureFlag EventType = "Feature Flag Hook" + EventTypeIssue EventType = "Issue Hook" + EventTypeJob EventType = "Job Hook" + EventTypeMember EventType = "Member Hook" + EventTypeMergeRequest EventType = "Merge Request Hook" + EventTypeNote EventType = "Note Hook" + EventTypePipeline EventType = "Pipeline Hook" + EventTypePush EventType = "Push Hook" + EventTypeRelease EventType = "Release Hook" + EventTypeServiceHook EventType = "Service Hook" + EventTypeSubGroup EventType = "Subgroup Hook" + EventTypeSystemHook EventType = "System Hook" + EventTypeTagPush EventType = "Tag Push Hook" + EventTypeWikiPage EventType = "Wiki Page Hook" +) + +const ( + eventObjectKindPush = "push" + eventObjectKindTagPush = "tag_push" + eventObjectKindMergeRequest = "merge_request" +) + +const ( + noteableTypeCommit = "Commit" + noteableTypeIssue = "Issue" + noteableTypeMergeRequest = "MergeRequest" + noteableTypeSnippet = "Snippet" +) + +type noteEvent struct { + ObjectKind string `json:"object_kind"` + ObjectAttributes struct { + NoteableType string `json:"noteable_type"` + } `json:"object_attributes"` +} + +type serviceEvent struct { + ObjectKind string `json:"object_kind"` +} + +const eventTypeHeader = "X-Gitlab-Event" + +// HookEventType returns the event type for the given request. +func HookEventType(r *http.Request) EventType { + return EventType(r.Header.Get(eventTypeHeader)) +} + +// ParseHook tries to parse both web- and system hooks. +// +// Example usage: +// +// func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { +// payload, err := ioutil.ReadAll(r.Body) +// if err != nil { ... } +// event, err := gitlab.ParseHook(gitlab.HookEventType(r), payload) +// if err != nil { ... } +// switch event := event.(type) { +// case *gitlab.PushEvent: +// processPushEvent(event) +// case *gitlab.MergeEvent: +// processMergeEvent(event) +// ... +// } +// } +func ParseHook(eventType EventType, payload []byte) (event interface{}, err error) { + switch eventType { + case EventTypeSystemHook: + return ParseSystemhook(payload) + default: + return ParseWebhook(eventType, payload) + } +} + +// ParseSystemhook parses the event payload. For recognized event types, a +// value of the corresponding struct type will be returned. An error will be +// returned for unrecognized event types. +// +// Example usage: +// +// func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { +// payload, err := ioutil.ReadAll(r.Body) +// if err != nil { ... } +// event, err := gitlab.ParseSystemhook(payload) +// if err != nil { ... } +// switch event := event.(type) { +// case *gitlab.PushSystemEvent: +// processPushSystemEvent(event) +// case *gitlab.MergeSystemEvent: +// processMergeSystemEvent(event) +// ... +// } +// } +func ParseSystemhook(payload []byte) (event interface{}, err error) { + e := &systemHookEvent{} + err = json.Unmarshal(payload, e) + if err != nil { + return nil, err + } + + switch e.EventName { + case eventObjectKindPush: + event = &PushSystemEvent{} + case eventObjectKindTagPush: + event = &TagPushSystemEvent{} + case "repository_update": + event = &RepositoryUpdateSystemEvent{} + case + "project_create", + "project_update", + "project_destroy", + "project_transfer", + "project_rename": + event = &ProjectSystemEvent{} + case + "group_create", + "group_destroy", + "group_rename": + event = &GroupSystemEvent{} + case "key_create", "key_destroy": + event = &KeySystemEvent{} + case + "user_create", + "user_destroy", + "user_rename", + "user_failed_login": + event = &UserSystemEvent{} + case + "user_add_to_group", + "user_remove_from_group", + "user_update_for_group": + event = &UserGroupSystemEvent{} + case + "user_add_to_team", + "user_remove_from_team", + "user_update_for_team": + event = &UserTeamSystemEvent{} + default: + switch e.ObjectKind { + case string(MergeRequestEventTargetType): + event = &MergeEvent{} + default: + return nil, fmt.Errorf("unexpected system hook type %s", e.EventName) + } + } + + if err := json.Unmarshal(payload, event); err != nil { + return nil, err + } + + return event, nil +} + +// WebhookEventType returns the event type for the given request. +func WebhookEventType(r *http.Request) EventType { + return EventType(r.Header.Get(eventTypeHeader)) +} + +// ParseWebhook parses the event payload. For recognized event types, a +// value of the corresponding struct type will be returned. An error will +// be returned for unrecognized event types. +// +// Example usage: +// +// func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { +// payload, err := ioutil.ReadAll(r.Body) +// if err != nil { ... } +// event, err := gitlab.ParseWebhook(gitlab.HookEventType(r), payload) +// if err != nil { ... } +// switch event := event.(type) { +// case *gitlab.PushEvent: +// processPushEvent(event) +// case *gitlab.MergeEvent: +// processMergeEvent(event) +// ... +// } +// } +func ParseWebhook(eventType EventType, payload []byte) (event interface{}, err error) { + switch eventType { + case EventTypeBuild: + event = &BuildEvent{} + case EventTypeDeployment: + event = &DeploymentEvent{} + case EventTypeFeatureFlag: + event = &FeatureFlagEvent{} + case EventTypeIssue, EventConfidentialIssue: + event = &IssueEvent{} + case EventTypeJob: + event = &JobEvent{} + case EventTypeMember: + event = &MemberEvent{} + case EventTypeMergeRequest: + event = &MergeEvent{} + case EventTypeNote, EventConfidentialNote: + note := ¬eEvent{} + err := json.Unmarshal(payload, note) + if err != nil { + return nil, err + } + + if note.ObjectKind != string(NoteEventTargetType) { + return nil, fmt.Errorf("unexpected object kind %s", note.ObjectKind) + } + + switch note.ObjectAttributes.NoteableType { + case noteableTypeCommit: + event = &CommitCommentEvent{} + case noteableTypeMergeRequest: + event = &MergeCommentEvent{} + case noteableTypeIssue: + event = &IssueCommentEvent{} + case noteableTypeSnippet: + event = &SnippetCommentEvent{} + default: + return nil, fmt.Errorf("unexpected noteable type %s", note.ObjectAttributes.NoteableType) + } + case EventTypePipeline: + event = &PipelineEvent{} + case EventTypePush: + event = &PushEvent{} + case EventTypeRelease: + event = &ReleaseEvent{} + case EventTypeServiceHook: + service := &serviceEvent{} + err := json.Unmarshal(payload, service) + if err != nil { + return nil, err + } + switch service.ObjectKind { + case eventObjectKindPush: + event = &PushEvent{} + case eventObjectKindTagPush: + event = &TagEvent{} + case eventObjectKindMergeRequest: + event = &MergeEvent{} + default: + return nil, fmt.Errorf("unexpected service type %s", service.ObjectKind) + } + case EventTypeSubGroup: + event = &SubGroupEvent{} + case EventTypeTagPush: + event = &TagEvent{} + case EventTypeWikiPage: + event = &WikiPageEvent{} + default: + return nil, fmt.Errorf("unexpected event type: %s", eventType) + } + + if err := json.Unmarshal(payload, event); err != nil { + return nil, err + } + + return event, nil +} diff --git a/vendor/github.com/xanzy/go-gitlab/event_systemhook_types.go b/vendor/github.com/xanzy/go-gitlab/event_systemhook_types.go new file mode 100644 index 0000000000..a653d15b58 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/event_systemhook_types.go @@ -0,0 +1,249 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import "time" + +// systemHookEvent is used to pre-process events to determine the +// system hook event type. +type systemHookEvent struct { + BaseSystemEvent + ObjectKind string `json:"object_kind"` +} + +// BaseSystemEvent contains system hook's common properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html +type BaseSystemEvent struct { + EventName string `json:"event_name"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` +} + +// ProjectSystemEvent represents a project system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html +type ProjectSystemEvent struct { + BaseSystemEvent + Name string `json:"name"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + ProjectID int `json:"project_id"` + OwnerName string `json:"owner_name"` + OwnerEmail string `json:"owner_email"` + ProjectVisibility string `json:"project_visibility"` + OldPathWithNamespace string `json:"old_path_with_namespace,omitempty"` +} + +// GroupSystemEvent represents a group system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html +type GroupSystemEvent struct { + BaseSystemEvent + Name string `json:"name"` + Path string `json:"path"` + PathWithNamespace string `json:"full_path"` + GroupID int `json:"group_id"` + OwnerName string `json:"owner_name"` + OwnerEmail string `json:"owner_email"` + ProjectVisibility string `json:"project_visibility"` + OldPath string `json:"old_path,omitempty"` + OldPathWithNamespace string `json:"old_full_path,omitempty"` +} + +// KeySystemEvent represents a key system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html +type KeySystemEvent struct { + BaseSystemEvent + ID int `json:"id"` + Username string `json:"username"` + Key string `json:"key"` +} + +// UserSystemEvent represents a user system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html +type UserSystemEvent struct { + BaseSystemEvent + ID int `json:"user_id"` + Name string `json:"name"` + Username string `json:"username"` + OldUsername string `json:"old_username,omitempty"` + Email string `json:"email"` + State string `json:"state,omitempty"` +} + +// UserGroupSystemEvent represents a user group system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html +type UserGroupSystemEvent struct { + BaseSystemEvent + ID int `json:"user_id"` + Name string `json:"user_name"` + Username string `json:"user_username"` + Email string `json:"user_email"` + GroupID int `json:"group_id"` + GroupName string `json:"group_name"` + GroupPath string `json:"group_path"` + GroupAccess string `json:"group_access"` +} + +// UserTeamSystemEvent represents a user team system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html +type UserTeamSystemEvent struct { + BaseSystemEvent + ID int `json:"user_id"` + Name string `json:"user_name"` + Username string `json:"user_username"` + Email string `json:"user_email"` + ProjectID int `json:"project_id"` + ProjectName string `json:"project_name"` + ProjectPath string `json:"project_path"` + ProjectPathWithNamespace string `json:"project_path_with_namespace"` + ProjectVisibility string `json:"project_visibility"` + AccessLevel string `json:"access_level"` +} + +// PushSystemEvent represents a push system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html#push-events +type PushSystemEvent struct { + BaseSystemEvent + Before string `json:"before"` + After string `json:"after"` + Ref string `json:"ref"` + CheckoutSHA string `json:"checkout_sha"` + UserID int `json:"user_id"` + UserName string `json:"user_name"` + UserUsername string `json:"user_username"` + UserEmail string `json:"user_email"` + UserAvatar string `json:"user_avatar"` + ProjectID int `json:"project_id"` + Project struct { + Name string `json:"name"` + Description string `json:"description"` + WebURL string `json:"web_url"` + AvatarURL string `json:"avatar_url"` + GitHTTPURL string `json:"git_http_url"` + GitSSHURL string `json:"git_ssh_url"` + Namespace string `json:"namespace"` + VisibilityLevel int `json:"visibility_level"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + } `json:"project"` + Commits []struct { + ID string `json:"id"` + Message string `json:"message"` + Timestamp time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + } `json:"commits"` + TotalCommitsCount int `json:"total_commits_count"` +} + +// TagPushSystemEvent represents a tag push system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html#tag-events +type TagPushSystemEvent struct { + BaseSystemEvent + Before string `json:"before"` + After string `json:"after"` + Ref string `json:"ref"` + CheckoutSHA string `json:"checkout_sha"` + UserID int `json:"user_id"` + UserName string `json:"user_name"` + UserUsername string `json:"user_username"` + UserEmail string `json:"user_email"` + UserAvatar string `json:"user_avatar"` + ProjectID int `json:"project_id"` + Project struct { + Name string `json:"name"` + Description string `json:"description"` + WebURL string `json:"web_url"` + AvatarURL string `json:"avatar_url"` + GitHTTPURL string `json:"git_http_url"` + GitSSHURL string `json:"git_ssh_url"` + Namespace string `json:"namespace"` + VisibilityLevel int `json:"visibility_level"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + } `json:"project"` + Commits []struct { + ID string `json:"id"` + Message string `json:"message"` + Timestamp time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + } `json:"commits"` + TotalCommitsCount int `json:"total_commits_count"` +} + +// RepositoryUpdateSystemEvent represents a repository updated system event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/administration/system_hooks.html#repository-update-events +type RepositoryUpdateSystemEvent struct { + BaseSystemEvent + UserID int `json:"user_id"` + UserName string `json:"user_name"` + UserEmail string `json:"user_email"` + UserAvatar string `json:"user_avatar"` + ProjectID int `json:"project_id"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + WebURL string `json:"web_url"` + AvatarURL string `json:"avatar_url"` + GitHTTPURL string `json:"git_http_url"` + GitSSHURL string `json:"git_ssh_url"` + Namespace string `json:"namespace"` + VisibilityLevel int `json:"visibility_level"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + CiConfigPath string `json:"ci_config_path"` + Homepage string `json:"homepage"` + URL string `json:"url"` + } `json:"project"` + Changes []struct { + Before string `json:"before"` + After string `json:"after"` + Ref string `json:"ref"` + } `json:"changes"` + Refs []string `json:"refs"` +} diff --git a/vendor/github.com/xanzy/go-gitlab/event_webhook_types.go b/vendor/github.com/xanzy/go-gitlab/event_webhook_types.go new file mode 100644 index 0000000000..b3eebf944f --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/event_webhook_types.go @@ -0,0 +1,1173 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "encoding/json" + "fmt" + "strconv" + "time" +) + +// StateID identifies the state of an issue or merge request. +// +// There are no GitLab API docs on the subject, but the mappings can be found in +// GitLab's codebase: +// https://gitlab.com/gitlab-org/gitlab-foss/-/blob/ba5be4989e/app/models/concerns/issuable.rb#L39-42 +type StateID int + +const ( + StateIDNone StateID = 0 + StateIDOpen StateID = 1 + StateIDClosed StateID = 2 + StateIDMerged StateID = 3 + StateIDLocked StateID = 4 +) + +// BuildEvent represents a build event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#job-events +type BuildEvent struct { + ObjectKind string `json:"object_kind"` + Ref string `json:"ref"` + Tag bool `json:"tag"` + BeforeSHA string `json:"before_sha"` + SHA string `json:"sha"` + BuildID int `json:"build_id"` + BuildName string `json:"build_name"` + BuildStage string `json:"build_stage"` + BuildStatus string `json:"build_status"` + BuildCreatedAt string `json:"build_created_at"` + BuildStartedAt string `json:"build_started_at"` + BuildFinishedAt string `json:"build_finished_at"` + BuildDuration float64 `json:"build_duration"` + BuildAllowFailure bool `json:"build_allow_failure"` + ProjectID int `json:"project_id"` + ProjectName string `json:"project_name"` + User *EventUser `json:"user"` + Commit struct { + ID int `json:"id"` + SHA string `json:"sha"` + Message string `json:"message"` + AuthorName string `json:"author_name"` + AuthorEmail string `json:"author_email"` + Status string `json:"status"` + Duration int `json:"duration"` + StartedAt string `json:"started_at"` + FinishedAt string `json:"finished_at"` + } `json:"commit"` + Repository *Repository `json:"repository"` +} + +// CommitCommentEvent represents a comment on a commit event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#comment-on-a-commit +type CommitCommentEvent struct { + ObjectKind string `json:"object_kind"` + EventType string `json:"event_type"` + User *User `json:"user"` + ProjectID int `json:"project_id"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Repository *Repository `json:"repository"` + ObjectAttributes struct { + ID int `json:"id"` + Note string `json:"note"` + NoteableType string `json:"noteable_type"` + AuthorID int `json:"author_id"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` + ProjectID int `json:"project_id"` + Attachment string `json:"attachment"` + LineCode string `json:"line_code"` + CommitID string `json:"commit_id"` + NoteableID int `json:"noteable_id"` + System bool `json:"system"` + StDiff *Diff `json:"st_diff"` + Description string `json:"description"` + URL string `json:"url"` + } `json:"object_attributes"` + Commit *struct { + ID string `json:"id"` + Title string `json:"title"` + Message string `json:"message"` + Timestamp *time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + } `json:"commit"` +} + +// DeploymentEvent represents a deployment event +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#deployment-events +type DeploymentEvent struct { + ObjectKind string `json:"object_kind"` + Status string `json:"status"` + StatusChangedAt string `json:"status_changed_at"` + DeploymentID int `json:"deployment_id"` + DeployableID int `json:"deployable_id"` + DeployableURL string `json:"deployable_url"` + Environment string `json:"environment"` + EnvironmentSlug string `json:"environment_slug"` + EnvironmentExternalURL string `json:"environment_external_url"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + WebURL string `json:"web_url"` + AvatarURL *string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + VisibilityLevel int `json:"visibility_level"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + CIConfigPath string `json:"ci_config_path"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + } `json:"project"` + Ref string `json:"ref"` + ShortSHA string `json:"short_sha"` + User *EventUser `json:"user"` + UserURL string `json:"user_url"` + CommitURL string `json:"commit_url"` + CommitTitle string `json:"commit_title"` +} + +// FeatureFlagEvent represents a feature flag event +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#feature-flag-events +type FeatureFlagEvent struct { + ObjectKind string `json:"object_kind"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + WebURL string `json:"web_url"` + AvatarURL *string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + VisibilityLevel int `json:"visibility_level"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + CIConfigPath string `json:"ci_config_path"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + } `json:"project"` + User *EventUser `json:"user"` + UserURL string `json:"user_url"` + ObjectAttributes struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Active bool `json:"active"` + } `json:"object_attributes"` +} + +// IssueCommentEvent represents a comment on an issue event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#comment-on-an-issue +type IssueCommentEvent struct { + ObjectKind string `json:"object_kind"` + EventType string `json:"event_type"` + User *User `json:"user"` + ProjectID int `json:"project_id"` + Project struct { + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Repository *Repository `json:"repository"` + ObjectAttributes struct { + ID int `json:"id"` + Note string `json:"note"` + NoteableType string `json:"noteable_type"` + AuthorID int `json:"author_id"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` + ProjectID int `json:"project_id"` + Attachment string `json:"attachment"` + LineCode string `json:"line_code"` + CommitID string `json:"commit_id"` + DiscussionID string `json:"discussion_id"` + NoteableID int `json:"noteable_id"` + System bool `json:"system"` + StDiff []*Diff `json:"st_diff"` + Description string `json:"description"` + URL string `json:"url"` + } `json:"object_attributes"` + Issue struct { + ID int `json:"id"` + IID int `json:"iid"` + ProjectID int `json:"project_id"` + MilestoneID int `json:"milestone_id"` + AuthorID int `json:"author_id"` + Position int `json:"position"` + BranchName string `json:"branch_name"` + Description string `json:"description"` + State string `json:"state"` + Title string `json:"title"` + Labels []*EventLabel `json:"labels"` + LastEditedAt string `json:"last_edit_at"` + LastEditedByID int `json:"last_edited_by_id"` + UpdatedAt string `json:"updated_at"` + UpdatedByID int `json:"updated_by_id"` + CreatedAt string `json:"created_at"` + ClosedAt string `json:"closed_at"` + DueDate *ISOTime `json:"due_date"` + URL string `json:"url"` + TimeEstimate int `json:"time_estimate"` + Confidential bool `json:"confidential"` + TotalTimeSpent int `json:"total_time_spent"` + HumanTotalTimeSpent string `json:"human_total_time_spent"` + HumanTimeEstimate string `json:"human_time_estimate"` + AssigneeIDs []int `json:"assignee_ids"` + AssigneeID int `json:"assignee_id"` + } `json:"issue"` +} + +// IssueEvent represents a issue event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#issue-events +type IssueEvent struct { + ObjectKind string `json:"object_kind"` + EventType string `json:"event_type"` + User *EventUser `json:"user"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Repository *Repository `json:"repository"` + ObjectAttributes struct { + ID int `json:"id"` + Title string `json:"title"` + AssigneeIDs []int `json:"assignee_ids"` + AssigneeID int `json:"assignee_id"` + AuthorID int `json:"author_id"` + ProjectID int `json:"project_id"` + CreatedAt string `json:"created_at"` // Should be *time.Time (see Gitlab issue #21468) + UpdatedAt string `json:"updated_at"` // Should be *time.Time (see Gitlab issue #21468) + UpdatedByID int `json:"updated_by_id"` + LastEditedAt string `json:"last_edited_at"` + LastEditedByID int `json:"last_edited_by_id"` + RelativePosition int `json:"relative_position"` + BranchName string `json:"branch_name"` + Description string `json:"description"` + MilestoneID int `json:"milestone_id"` + StateID StateID `json:"state_id"` + Confidential bool `json:"confidential"` + DiscussionLocked bool `json:"discussion_locked"` + DueDate *ISOTime `json:"due_date"` + MovedToID int `json:"moved_to_id"` + DuplicatedToID int `json:"duplicated_to_id"` + TimeEstimate int `json:"time_estimate"` + TotalTimeSpent int `json:"total_time_spent"` + TimeChange int `json:"time_change"` + HumanTotalTimeSpent string `json:"human_total_time_spent"` + HumanTimeEstimate string `json:"human_time_estimate"` + HumanTimeChange string `json:"human_time_change"` + Weight string `json:"weight"` + IID int `json:"iid"` + URL string `json:"url"` + State string `json:"state"` + Action string `json:"action"` + Severity string `json:"severity"` + EscalationStatus string `json:"escalation_status"` + EscalationPolicy struct { + ID int `json:"id"` + Name string `json:"name"` + } `json:"escalation_policy"` + Labels []*EventLabel `json:"labels"` + } `json:"object_attributes"` + Assignee *EventUser `json:"assignee"` + Assignees *[]EventUser `json:"assignees"` + Labels []*EventLabel `json:"labels"` + Changes struct { + Assignees struct { + Previous []*EventUser `json:"previous"` + Current []*EventUser `json:"current"` + } `json:"assignees"` + Description struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"description"` + Labels struct { + Previous []*EventLabel `json:"previous"` + Current []*EventLabel `json:"current"` + } `json:"labels"` + Title struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"title"` + ClosedAt struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"closed_at"` + StateID struct { + Previous StateID `json:"previous"` + Current StateID `json:"current"` + } `json:"state_id"` + UpdatedAt struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"updated_at"` + UpdatedByID struct { + Previous int `json:"previous"` + Current int `json:"current"` + } `json:"updated_by_id"` + TotalTimeSpent struct { + Previous int `json:"previous"` + Current int `json:"current"` + } `json:"total_time_spent"` + } `json:"changes"` +} + +// JobEvent represents a job event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#job-events +type JobEvent struct { + ObjectKind string `json:"object_kind"` + Ref string `json:"ref"` + Tag bool `json:"tag"` + BeforeSHA string `json:"before_sha"` + SHA string `json:"sha"` + BuildID int `json:"build_id"` + BuildName string `json:"build_name"` + BuildStage string `json:"build_stage"` + BuildStatus string `json:"build_status"` + BuildCreatedAt string `json:"build_created_at"` + BuildStartedAt string `json:"build_started_at"` + BuildFinishedAt string `json:"build_finished_at"` + BuildDuration float64 `json:"build_duration"` + BuildQueuedDuration float64 `json:"build_queued_duration"` + BuildAllowFailure bool `json:"build_allow_failure"` + BuildFailureReason string `json:"build_failure_reason"` + RetriesCount int `json:"retries_count"` + PipelineID int `json:"pipeline_id"` + ProjectID int `json:"project_id"` + ProjectName string `json:"project_name"` + User *EventUser `json:"user"` + Commit struct { + ID int `json:"id"` + Name string `json:"name"` + SHA string `json:"sha"` + Message string `json:"message"` + AuthorName string `json:"author_name"` + AuthorEmail string `json:"author_email"` + AuthorURL string `json:"author_url"` + Status string `json:"status"` + Duration int `json:"duration"` + StartedAt string `json:"started_at"` + FinishedAt string `json:"finished_at"` + } `json:"commit"` + Repository *Repository `json:"repository"` + Runner struct { + ID int `json:"id"` + Active bool `json:"active"` + RunnerType string `json:"runner_type"` + IsShared bool `json:"is_shared"` + Description string `json:"description"` + Tags []string `json:"tags"` + } `json:"runner"` + Environment string `json:"environment"` +} + +// MemberEvent represents a member event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#group-member-events +type MemberEvent struct { + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + GroupName string `json:"group_name"` + GroupPath string `json:"group_path"` + GroupID int `json:"group_id"` + UserUsername string `json:"user_username"` + UserName string `json:"user_name"` + UserEmail string `json:"user_email"` + UserID int `json:"user_id"` + GroupAccess string `json:"group_access"` + GroupPlan string `json:"group_plan"` + ExpiresAt *time.Time `json:"expires_at"` + EventName string `json:"event_name"` +} + +// MergeCommentEvent represents a comment on a merge event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#comment-on-a-merge-request +type MergeCommentEvent struct { + ObjectKind string `json:"object_kind"` + EventType string `json:"event_type"` + User *EventUser `json:"user"` + ProjectID int `json:"project_id"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + ObjectAttributes struct { + Attachment string `json:"attachment"` + AuthorID int `json:"author_id"` + ChangePosition *NotePosition `json:"change_position"` + CommitID string `json:"commit_id"` + CreatedAt string `json:"created_at"` + DiscussionID string `json:"discussion_id"` + ID int `json:"id"` + LineCode string `json:"line_code"` + Note string `json:"note"` + NoteableID int `json:"noteable_id"` + NoteableType string `json:"noteable_type"` + OriginalPosition *NotePosition `json:"original_position"` + Position *NotePosition `json:"position"` + ProjectID int `json:"project_id"` + ResolvedAt string `json:"resolved_at"` + ResolvedByID int `json:"resolved_by_id"` + ResolvedByPush bool `json:"resolved_by_push"` + StDiff *Diff `json:"st_diff"` + System bool `json:"system"` + Type string `json:"type"` + UpdatedAt string `json:"updated_at"` + UpdatedByID string `json:"updated_by_id"` + Description string `json:"description"` + URL string `json:"url"` + } `json:"object_attributes"` + Repository *Repository `json:"repository"` + MergeRequest struct { + ID int `json:"id"` + TargetBranch string `json:"target_branch"` + SourceBranch string `json:"source_branch"` + SourceProjectID int `json:"source_project_id"` + AuthorID int `json:"author_id"` + AssigneeID int `json:"assignee_id"` + AssigneeIDs []int `json:"assignee_ids"` + Title string `json:"title"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` + MilestoneID int `json:"milestone_id"` + State string `json:"state"` + MergeStatus string `json:"merge_status"` + TargetProjectID int `json:"target_project_id"` + IID int `json:"iid"` + Description string `json:"description"` + Position int `json:"position"` + Labels []*EventLabel `json:"labels"` + LockedAt string `json:"locked_at"` + UpdatedByID int `json:"updated_by_id"` + MergeError string `json:"merge_error"` + MergeParams *MergeParams `json:"merge_params"` + MergeWhenPipelineSucceeds bool `json:"merge_when_pipeline_succeeds"` + MergeUserID int `json:"merge_user_id"` + MergeCommitSHA string `json:"merge_commit_sha"` + DeletedAt string `json:"deleted_at"` + InProgressMergeCommitSHA string `json:"in_progress_merge_commit_sha"` + LockVersion int `json:"lock_version"` + ApprovalsBeforeMerge string `json:"approvals_before_merge"` + RebaseCommitSHA string `json:"rebase_commit_sha"` + TimeEstimate int `json:"time_estimate"` + Squash bool `json:"squash"` + LastEditedAt string `json:"last_edited_at"` + LastEditedByID int `json:"last_edited_by_id"` + Source *Repository `json:"source"` + Target *Repository `json:"target"` + LastCommit struct { + ID string `json:"id"` + Title string `json:"title"` + Message string `json:"message"` + Timestamp *time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + } `json:"last_commit"` + WorkInProgress bool `json:"work_in_progress"` + TotalTimeSpent int `json:"total_time_spent"` + HeadPipelineID int `json:"head_pipeline_id"` + Assignee *EventUser `json:"assignee"` + DetailedMergeStatus string `json:"detailed_merge_status"` + } `json:"merge_request"` +} + +// MergeEvent represents a merge event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#merge-request-events +type MergeEvent struct { + ObjectKind string `json:"object_kind"` + User *EventUser `json:"user"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + ObjectAttributes struct { + ID int `json:"id"` + TargetBranch string `json:"target_branch"` + SourceBranch string `json:"source_branch"` + SourceProjectID int `json:"source_project_id"` + AuthorID int `json:"author_id"` + AssigneeID int `json:"assignee_id"` + AssigneeIDs []int `json:"assignee_ids"` + ReviewerIDs []int `json:"reviewer_ids"` + Title string `json:"title"` + CreatedAt string `json:"created_at"` // Should be *time.Time (see Gitlab issue #21468) + UpdatedAt string `json:"updated_at"` // Should be *time.Time (see Gitlab issue #21468) + StCommits []*Commit `json:"st_commits"` + StDiffs []*Diff `json:"st_diffs"` + MilestoneID int `json:"milestone_id"` + State string `json:"state"` + MergeStatus string `json:"merge_status"` + TargetProjectID int `json:"target_project_id"` + IID int `json:"iid"` + Description string `json:"description"` + Position int `json:"position"` + LockedAt string `json:"locked_at"` + UpdatedByID int `json:"updated_by_id"` + MergeError string `json:"merge_error"` + MergeParams *MergeParams `json:"merge_params"` + MergeWhenBuildSucceeds bool `json:"merge_when_build_succeeds"` + MergeUserID int `json:"merge_user_id"` + MergeCommitSHA string `json:"merge_commit_sha"` + DeletedAt string `json:"deleted_at"` + ApprovalsBeforeMerge string `json:"approvals_before_merge"` + RebaseCommitSHA string `json:"rebase_commit_sha"` + InProgressMergeCommitSHA string `json:"in_progress_merge_commit_sha"` + LockVersion int `json:"lock_version"` + TimeEstimate int `json:"time_estimate"` + Source *Repository `json:"source"` + Target *Repository `json:"target"` + HeadPipelineID *int `json:"head_pipeline_id"` + LastCommit struct { + ID string `json:"id"` + Message string `json:"message"` + Timestamp *time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + } `json:"last_commit"` + BlockingDiscussionsResolved bool `json:"blocking_discussions_resolved"` + WorkInProgress bool `json:"work_in_progress"` + FirstContribution bool `json:"first_contribution"` + URL string `json:"url"` + Labels []*EventLabel `json:"labels"` + Action string `json:"action"` + DetailedMergeStatus string `json:"detailed_merge_status"` + OldRev string `json:"oldrev"` + Assignee *EventUser `json:"assignee"` + } `json:"object_attributes"` + Repository *Repository `json:"repository"` + Assignee *EventUser `json:"assignee"` + Assignees []*EventUser `json:"assignees"` + Reviewers []*EventUser `json:"reviewers"` + Labels []*EventLabel `json:"labels"` + Changes struct { + Assignees struct { + Previous []*EventUser `json:"previous"` + Current []*EventUser `json:"current"` + } `json:"assignees"` + Reviewers struct { + Previous []*EventUser `json:"previous"` + Current []*EventUser `json:"current"` + } `json:"reviewers"` + Description struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"description"` + Labels struct { + Previous []*EventLabel `json:"previous"` + Current []*EventLabel `json:"current"` + } `json:"labels"` + SourceBranch struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"source_branch"` + SourceProjectID struct { + Previous int `json:"previous"` + Current int `json:"current"` + } `json:"source_project_id"` + StateID struct { + Previous StateID `json:"previous"` + Current StateID `json:"current"` + } `json:"state_id"` + TargetBranch struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"target_branch"` + TargetProjectID struct { + Previous int `json:"previous"` + Current int `json:"current"` + } `json:"target_project_id"` + Title struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"title"` + UpdatedAt struct { + Previous string `json:"previous"` + Current string `json:"current"` + } `json:"updated_at"` + UpdatedByID struct { + Previous int `json:"previous"` + Current int `json:"current"` + } `json:"updated_by_id"` + MilestoneID struct { + Previous int `json:"previous"` + Current int `json:"current"` + } `json:"milestone_id"` + } `json:"changes"` +} + +// EventUser represents a user record in an event and is used as an even initiator or a merge assignee. +type EventUser struct { + ID int `json:"id"` + Name string `json:"name"` + Username string `json:"username"` + AvatarURL string `json:"avatar_url"` + Email string `json:"email"` +} + +// MergeParams represents the merge params. +type MergeParams struct { + ForceRemoveSourceBranch bool `json:"force_remove_source_branch"` +} + +// UnmarshalJSON decodes the merge parameters +// +// This allows support of ForceRemoveSourceBranch for both type bool (>11.9) and string (<11.9) +func (p *MergeParams) UnmarshalJSON(b []byte) error { + type Alias MergeParams + raw := struct { + *Alias + ForceRemoveSourceBranch interface{} `json:"force_remove_source_branch"` + }{ + Alias: (*Alias)(p), + } + + err := json.Unmarshal(b, &raw) + if err != nil { + return err + } + + switch v := raw.ForceRemoveSourceBranch.(type) { + case nil: + // No action needed. + case bool: + p.ForceRemoveSourceBranch = v + case string: + p.ForceRemoveSourceBranch, err = strconv.ParseBool(v) + if err != nil { + return err + } + default: + return fmt.Errorf("failed to unmarshal ForceRemoveSourceBranch of type: %T", v) + } + + return nil +} + +// PipelineEvent represents a pipeline event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#pipeline-events +type PipelineEvent struct { + ObjectKind string `json:"object_kind"` + ObjectAttributes struct { + ID int `json:"id"` + Ref string `json:"ref"` + Tag bool `json:"tag"` + SHA string `json:"sha"` + BeforeSHA string `json:"before_sha"` + Source string `json:"source"` + Status string `json:"status"` + DetailedStatus string `json:"detailed_status"` + Stages []string `json:"stages"` + CreatedAt string `json:"created_at"` + FinishedAt string `json:"finished_at"` + Duration int `json:"duration"` + QueuedDuration int `json:"queued_duration"` + Variables []struct { + Key string `json:"key"` + Value string `json:"value"` + } `json:"variables"` + } `json:"object_attributes"` + MergeRequest struct { + ID int `json:"id"` + IID int `json:"iid"` + Title string `json:"title"` + SourceBranch string `json:"source_branch"` + SourceProjectID int `json:"source_project_id"` + TargetBranch string `json:"target_branch"` + TargetProjectID int `json:"target_project_id"` + State string `json:"state"` + MergeRequestStatus string `json:"merge_status"` + DetailedMergeStatus string `json:"detailed_merge_status"` + URL string `json:"url"` + } `json:"merge_request"` + User *EventUser `json:"user"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Commit struct { + ID string `json:"id"` + Message string `json:"message"` + Title string `json:"title"` + Timestamp *time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + } `json:"commit"` + SourcePipline struct { + Project struct { + ID int `json:"id"` + WebURL string `json:"web_url"` + PathWithNamespace string `json:"path_with_namespace"` + } `json:"project"` + PipelineID int `json:"pipeline_id"` + JobID int `json:"job_id"` + } `json:"source_pipeline"` + Builds []struct { + ID int `json:"id"` + Stage string `json:"stage"` + Name string `json:"name"` + Status string `json:"status"` + CreatedAt string `json:"created_at"` + StartedAt string `json:"started_at"` + FinishedAt string `json:"finished_at"` + Duration float64 `json:"duration"` + QueuedDuration float64 `json:"queued_duration"` + FailureReason string `json:"failure_reason"` + When string `json:"when"` + Manual bool `json:"manual"` + AllowFailure bool `json:"allow_failure"` + User *EventUser `json:"user"` + Runner struct { + ID int `json:"id"` + Description string `json:"description"` + Active bool `json:"active"` + IsShared bool `json:"is_shared"` + RunnerType string `json:"runner_type"` + Tags []string `json:"tags"` + } `json:"runner"` + ArtifactsFile struct { + Filename string `json:"filename"` + Size int `json:"size"` + } `json:"artifacts_file"` + Environment struct { + Name string `json:"name"` + Action string `json:"action"` + DeploymentTier string `json:"deployment_tier"` + } `json:"environment"` + } `json:"builds"` +} + +// PushEvent represents a push event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#push-events +type PushEvent struct { + ObjectKind string `json:"object_kind"` + EventName string `json:"event_name"` + Before string `json:"before"` + After string `json:"after"` + Ref string `json:"ref"` + CheckoutSHA string `json:"checkout_sha"` + UserID int `json:"user_id"` + UserName string `json:"user_name"` + UserUsername string `json:"user_username"` + UserEmail string `json:"user_email"` + UserAvatar string `json:"user_avatar"` + ProjectID int `json:"project_id"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Repository *Repository `json:"repository"` + Commits []*struct { + ID string `json:"id"` + Message string `json:"message"` + Title string `json:"title"` + Timestamp *time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + Added []string `json:"added"` + Modified []string `json:"modified"` + Removed []string `json:"removed"` + } `json:"commits"` + TotalCommitsCount int `json:"total_commits_count"` +} + +// ReleaseEvent represents a release event +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#release-events +type ReleaseEvent struct { + ID int `json:"id"` + CreatedAt string `json:"created_at"` // Should be *time.Time (see Gitlab issue #21468) + Description string `json:"description"` + Name string `json:"name"` + Tag string `json:"tag"` + ReleasedAt string `json:"released_at"` // Should be *time.Time (see Gitlab issue #21468) + ObjectKind string `json:"object_kind"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + WebURL string `json:"web_url"` + AvatarURL *string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + VisibilityLevel int `json:"visibility_level"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + CIConfigPath string `json:"ci_config_path"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + } `json:"project"` + URL string `json:"url"` + Action string `json:"action"` + Assets struct { + Count int `json:"count"` + Links []struct { + ID int `json:"id"` + External bool `json:"external"` + LinkType string `json:"link_type"` + Name string `json:"name"` + URL string `json:"url"` + } `json:"links"` + Sources []struct { + Format string `json:"format"` + URL string `json:"url"` + } `json:"sources"` + } `json:"assets"` + Commit struct { + ID string `json:"id"` + Message string `json:"message"` + Title string `json:"title"` + Timestamp string `json:"timestamp"` // Should be *time.Time (see Gitlab issue #21468) + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + } `json:"commit"` +} + +// SnippetCommentEvent represents a comment on a snippet event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#comment-on-a-code-snippet +type SnippetCommentEvent struct { + ObjectKind string `json:"object_kind"` + EventType string `json:"event_type"` + User *EventUser `json:"user"` + ProjectID int `json:"project_id"` + Project struct { + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Repository *Repository `json:"repository"` + ObjectAttributes struct { + ID int `json:"id"` + Note string `json:"note"` + NoteableType string `json:"noteable_type"` + AuthorID int `json:"author_id"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` + ProjectID int `json:"project_id"` + Attachment string `json:"attachment"` + LineCode string `json:"line_code"` + CommitID string `json:"commit_id"` + NoteableID int `json:"noteable_id"` + System bool `json:"system"` + StDiff *Diff `json:"st_diff"` + Description string `json:"description"` + URL string `json:"url"` + } `json:"object_attributes"` + Snippet *struct { + ID int `json:"id"` + Title string `json:"title"` + Content string `json:"content"` + AuthorID int `json:"author_id"` + ProjectID int `json:"project_id"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` + Filename string `json:"file_name"` + ExpiresAt string `json:"expires_at"` + Type string `json:"type"` + VisibilityLevel int `json:"visibility_level"` + Description string `json:"description"` + Secret bool `json:"secret"` + RepositoryReadOnly bool `json:"repository_read_only"` + } `json:"snippet"` +} + +// SubGroupEvent represents a subgroup event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#subgroup-events +type SubGroupEvent struct { + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + EventName string `json:"event_name"` + Name string `json:"name"` + Path string `json:"path"` + FullPath string `json:"full_path"` + GroupID int `json:"group_id"` + ParentGroupID int `json:"parent_group_id"` + ParentName string `json:"parent_name"` + ParentPath string `json:"parent_path"` + ParentFullPath string `json:"parent_full_path"` +} + +// TagEvent represents a tag event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#tag-events +type TagEvent struct { + ObjectKind string `json:"object_kind"` + EventName string `json:"event_name"` + Before string `json:"before"` + After string `json:"after"` + Ref string `json:"ref"` + CheckoutSHA string `json:"checkout_sha"` + UserID int `json:"user_id"` + UserName string `json:"user_name"` + UserUsername string `json:"user_username"` + UserAvatar string `json:"user_avatar"` + UserEmail string `json:"user_email"` + ProjectID int `json:"project_id"` + Message string `json:"message"` + Project struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Repository *Repository `json:"repository"` + Commits []*struct { + ID string `json:"id"` + Message string `json:"message"` + Title string `json:"title"` + Timestamp *time.Time `json:"timestamp"` + URL string `json:"url"` + Author struct { + Name string `json:"name"` + Email string `json:"email"` + } `json:"author"` + Added []string `json:"added"` + Modified []string `json:"modified"` + Removed []string `json:"removed"` + } `json:"commits"` + TotalCommitsCount int `json:"total_commits_count"` +} + +// WikiPageEvent represents a wiki page event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#wiki-page-events +type WikiPageEvent struct { + ObjectKind string `json:"object_kind"` + User *EventUser `json:"user"` + Project struct { + Name string `json:"name"` + Description string `json:"description"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` + WebURL string `json:"web_url"` + Visibility VisibilityValue `json:"visibility"` + } `json:"project"` + Wiki struct { + WebURL string `json:"web_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + } `json:"wiki"` + ObjectAttributes struct { + Title string `json:"title"` + Content string `json:"content"` + Format string `json:"format"` + Message string `json:"message"` + Slug string `json:"slug"` + URL string `json:"url"` + Action string `json:"action"` + DiffURL string `json:"diff_url"` + } `json:"object_attributes"` +} + +// EventLabel represents a label inside a webhook event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#issue-events +type EventLabel struct { + ID int `json:"id"` + Title string `json:"title"` + Color string `json:"color"` + ProjectID int `json:"project_id"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` + Template bool `json:"template"` + Description string `json:"description"` + Type string `json:"type"` + GroupID int `json:"group_id"` +} diff --git a/vendor/github.com/xanzy/go-gitlab/events.go b/vendor/github.com/xanzy/go-gitlab/events.go new file mode 100644 index 0000000000..fb77219dbb --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/events.go @@ -0,0 +1,224 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// EventsService handles communication with the event related methods of +// the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/events.html +type EventsService struct { + client *Client +} + +// ContributionEvent represents a user's contribution +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/events.html#get-user-contribution-events +type ContributionEvent struct { + ID int `json:"id"` + Title string `json:"title"` + ProjectID int `json:"project_id"` + ActionName string `json:"action_name"` + TargetID int `json:"target_id"` + TargetIID int `json:"target_iid"` + TargetType string `json:"target_type"` + AuthorID int `json:"author_id"` + TargetTitle string `json:"target_title"` + CreatedAt *time.Time `json:"created_at"` + PushData struct { + CommitCount int `json:"commit_count"` + Action string `json:"action"` + RefType string `json:"ref_type"` + CommitFrom string `json:"commit_from"` + CommitTo string `json:"commit_to"` + Ref string `json:"ref"` + CommitTitle string `json:"commit_title"` + } `json:"push_data"` + Note *Note `json:"note"` + Author struct { + Name string `json:"name"` + Username string `json:"username"` + ID int `json:"id"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"author"` + AuthorUsername string `json:"author_username"` +} + +// ListContributionEventsOptions represents the options for GetUserContributionEvents +// +// GitLap API docs: +// https://docs.gitlab.com/ee/api/events.html#get-user-contribution-events +type ListContributionEventsOptions struct { + ListOptions + Action *EventTypeValue `url:"action,omitempty" json:"action,omitempty"` + TargetType *EventTargetTypeValue `url:"target_type,omitempty" json:"target_type,omitempty"` + Before *ISOTime `url:"before,omitempty" json:"before,omitempty"` + After *ISOTime `url:"after,omitempty" json:"after,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListUserContributionEvents retrieves user contribution events +// for the specified user, sorted from newest to oldest. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/events.html#get-user-contribution-events +func (s *UsersService) ListUserContributionEvents(uid interface{}, opt *ListContributionEventsOptions, options ...RequestOptionFunc) ([]*ContributionEvent, *Response, error) { + user, err := parseID(uid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("users/%s/events", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var cs []*ContributionEvent + resp, err := s.client.Do(req, &cs) + if err != nil { + return nil, resp, err + } + + return cs, resp, err +} + +// ListCurrentUserContributionEvents gets a list currently authenticated user's events +// +// GitLab API docs: https://docs.gitlab.com/ee/api/events.html#list-currently-authenticated-users-events +func (s *EventsService) ListCurrentUserContributionEvents(opt *ListContributionEventsOptions, options ...RequestOptionFunc) ([]*ContributionEvent, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "events", opt, options) + if err != nil { + return nil, nil, err + } + + var cs []*ContributionEvent + resp, err := s.client.Do(req, &cs) + if err != nil { + return nil, resp, err + } + + return cs, resp, err +} + +// ProjectEvent represents a GitLab project event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/events.html#list-a-projects-visible-events +type ProjectEvent struct { + ID int `json:"id"` + Title string `json:"title"` + ProjectID int `json:"project_id"` + ActionName string `json:"action_name"` + TargetID int `json:"target_id"` + TargetIID int `json:"target_iid"` + TargetType string `json:"target_type"` + AuthorID int `json:"author_id"` + TargetTitle string `json:"target_title"` + CreatedAt string `json:"created_at"` + Author struct { + Name string `json:"name"` + Username string `json:"username"` + ID int `json:"id"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"author"` + AuthorUsername string `json:"author_username"` + Data struct { + Before string `json:"before"` + After string `json:"after"` + Ref string `json:"ref"` + UserID int `json:"user_id"` + UserName string `json:"user_name"` + Repository *Repository `json:"repository"` + Commits []*Commit `json:"commits"` + TotalCommitsCount int `json:"total_commits_count"` + } `json:"data"` + Note struct { + ID int `json:"id"` + Body string `json:"body"` + Attachment string `json:"attachment"` + Author struct { + ID int `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Name string `json:"name"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"author"` + CreatedAt *time.Time `json:"created_at"` + System bool `json:"system"` + NoteableID int `json:"noteable_id"` + NoteableType string `json:"noteable_type"` + NoteableIID int `json:"noteable_iid"` + } `json:"note"` + PushData struct { + CommitCount int `json:"commit_count"` + Action string `json:"action"` + RefType string `json:"ref_type"` + CommitFrom string `json:"commit_from"` + CommitTo string `json:"commit_to"` + Ref string `json:"ref"` + CommitTitle string `json:"commit_title"` + } `json:"push_data"` +} + +func (s ProjectEvent) String() string { + return Stringify(s) +} + +// ListProjectVisibleEventsOptions represents the available +// ListProjectVisibleEvents() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/events.html#list-a-projects-visible-events +type ListProjectVisibleEventsOptions ListOptions + +// ListProjectVisibleEvents gets the events for the specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/events.html#list-a-projects-visible-events +func (s *EventsService) ListProjectVisibleEvents(pid interface{}, opt *ListProjectVisibleEventsOptions, options ...RequestOptionFunc) ([]*ProjectEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/events", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*ProjectEvent + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/external_status_checks.go b/vendor/github.com/xanzy/go-gitlab/external_status_checks.go new file mode 100644 index 0000000000..cc2d6679ac --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/external_status_checks.go @@ -0,0 +1,199 @@ +package gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ExternalStatusChecksService handles communication with the external +// status check related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/status_checks.html +type ExternalStatusChecksService struct { + client *Client +} + +type MergeStatusCheck struct { + ID int `json:"id"` + Name string `json:"name"` + ExternalURL string `json:"external_url"` + Status string `json:"status"` +} + +type ProjectStatusCheck struct { + ID int `json:"id"` + Name string `json:"name"` + ProjectID int `json:"project_id"` + ExternalURL string `json:"external_url"` + ProtectedBranches []StatusCheckProtectedBranch `json:"protected_branches"` +} + +type StatusCheckProtectedBranch struct { + ID int `json:"id"` + ProjectID int `json:"project_id"` + Name string `json:"name"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + CodeOwnerApprovalRequired bool `json:"code_owner_approval_required"` +} + +// ListMergeStatusChecks lists the external status checks that apply to it +// and their status for a single merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#list-status-checks-for-a-merge-request +func (s *ExternalStatusChecksService) ListMergeStatusChecks(pid interface{}, mr int, opt *ListOptions, options ...RequestOptionFunc) ([]*MergeStatusCheck, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/status_checks", PathEscape(project), mr) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var mscs []*MergeStatusCheck + resp, err := s.client.Do(req, &mscs) + if err != nil { + return nil, resp, err + } + + return mscs, resp, err +} + +// SetExternalStatusCheckStatusOptions represents the available +// SetExternalStatusCheckStatus() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#set-status-of-an-external-status-check +type SetExternalStatusCheckStatusOptions struct { + SHA *string `url:"sha,omitempty" json:"sha,omitempty"` + ExternalStatusCheckID *int `url:"external_status_check_id,omitempty" json:"external_status_check_id,omitempty"` + Status *string `url:"status,omitempty" json:"status,omitempty"` +} + +// SetExternalStatusCheckStatus sets the status of an external status check. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#set-status-of-an-external-status-check +func (s *ExternalStatusChecksService) SetExternalStatusCheckStatus(pid interface{}, mergeRequest int, opt *SetExternalStatusCheckStatusOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/status_check_responses", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListProjectStatusChecks lists the project external status checks. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#get-project-external-status-checks +func (s *ExternalStatusChecksService) ListProjectStatusChecks(pid interface{}, opt *ListOptions, options ...RequestOptionFunc) ([]*ProjectStatusCheck, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/external_status_checks", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pscs []*ProjectStatusCheck + resp, err := s.client.Do(req, &pscs) + if err != nil { + return nil, resp, err + } + + return pscs, resp, err +} + +// CreateExternalStatusCheckOptions represents the available +// CreateExternalStatusCheck() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#create-external-status-check +type CreateExternalStatusCheckOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ExternalURL *string `url:"external_url,omitempty" json:"external_url,omitempty"` + ProtectedBranchIDs *[]int `url:"protected_branch_ids,omitempty" json:"protected_branch_ids,omitempty"` +} + +// CreateExternalStatusCheck creates an external status check. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#create-external-status-check +func (s *ExternalStatusChecksService) CreateExternalStatusCheck(pid interface{}, opt *CreateExternalStatusCheckOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/external_status_checks", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteExternalStatusCheck deletes an external status check. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#delete-external-status-check +func (s *ExternalStatusChecksService) DeleteExternalStatusCheck(pid interface{}, check int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/external_status_checks/%d", PathEscape(project), check) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// UpdateExternalStatusCheckOptions represents the available +// UpdateExternalStatusCheck() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#update-external-status-check +type UpdateExternalStatusCheckOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ExternalURL *string `url:"external_url,omitempty" json:"external_url,omitempty"` + ProtectedBranchIDs *[]int `url:"protected_branch_ids,omitempty" json:"protected_branch_ids,omitempty"` +} + +// UpdateExternalStatusCheck updates an external status check. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/status_checks.html#update-external-status-check +func (s *ExternalStatusChecksService) UpdateExternalStatusCheck(pid interface{}, check int, opt *UpdateExternalStatusCheckOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/external_status_checks/%d", PathEscape(project), check) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/feature_flags.go b/vendor/github.com/xanzy/go-gitlab/feature_flags.go new file mode 100644 index 0000000000..180f4534f0 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/feature_flags.go @@ -0,0 +1,96 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// FeaturesService handles the communication with the application FeaturesService +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/features.html +type FeaturesService struct { + client *Client +} + +// Feature represents a GitLab feature flag. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/features.html +type Feature struct { + Name string `json:"name"` + State string `json:"state"` + Gates []Gate +} + +// Gate represents a gate of a GitLab feature flag. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/features.html +type Gate struct { + Key string `json:"key"` + Value interface{} `json:"value"` +} + +func (f Feature) String() string { + return Stringify(f) +} + +// ListFeatures gets a list of feature flags +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/features.html#list-all-features +func (s *FeaturesService) ListFeatures(options ...RequestOptionFunc) ([]*Feature, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "features", nil, options) + if err != nil { + return nil, nil, err + } + + var f []*Feature + resp, err := s.client.Do(req, &f) + if err != nil { + return nil, resp, err + } + return f, resp, err +} + +// SetFeatureFlag sets or creates a feature flag gate +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/features.html#set-or-create-a-feature +func (s *FeaturesService) SetFeatureFlag(name string, value interface{}, options ...RequestOptionFunc) (*Feature, *Response, error) { + u := fmt.Sprintf("features/%s", url.PathEscape(name)) + + opt := struct { + Value interface{} `url:"value" json:"value"` + }{ + value, + } + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + f := &Feature{} + resp, err := s.client.Do(req, f) + if err != nil { + return nil, resp, err + } + return f, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/freeze_periods.go b/vendor/github.com/xanzy/go-gitlab/freeze_periods.go new file mode 100644 index 0000000000..8e1a64d2a9 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/freeze_periods.go @@ -0,0 +1,194 @@ +// +// Copyright 2021 Paul Cioanca +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// FreezePeriodsService handles the communication with the freeze periods +// related methods of the GitLab API. +// +// https://docs.gitlab.com/ee/api/freeze_periods.html +type FreezePeriodsService struct { + client *Client +} + +// FreezePeriod represents a freeze period object. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#list-freeze-periods +type FreezePeriod struct { + ID int `json:"id"` + FreezeStart string `json:"freeze_start"` + FreezeEnd string `json:"freeze_end"` + CronTimezone string `json:"cron_timezone"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` +} + +// ListFreezePeriodsOptions represents the available ListFreezePeriodsOptions() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#list-freeze-periods +type ListFreezePeriodsOptions ListOptions + +// ListFreezePeriods gets a list of project project freeze periods. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#list-freeze-periods +func (s *FreezePeriodsService) ListFreezePeriods(pid interface{}, opt *ListFreezePeriodsOptions, options ...RequestOptionFunc) ([]*FreezePeriod, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/freeze_periods", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var fp []*FreezePeriod + resp, err := s.client.Do(req, &fp) + if err != nil { + return nil, resp, err + } + + return fp, resp, err +} + +// GetFreezePeriod gets a specific freeze period for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#get-a-freeze-period-by-a-freeze_period_id +func (s *FreezePeriodsService) GetFreezePeriod(pid interface{}, freezePeriod int, options ...RequestOptionFunc) (*FreezePeriod, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/freeze_periods/%d", PathEscape(project), freezePeriod) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + fp := new(FreezePeriod) + resp, err := s.client.Do(req, fp) + if err != nil { + return nil, resp, err + } + + return fp, resp, err +} + +// CreateFreezePeriodOptions represents the available CreateFreezePeriodOptions() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#create-a-freeze-period +type CreateFreezePeriodOptions struct { + FreezeStart *string `url:"freeze_start,omitempty" json:"freeze_start,omitempty"` + FreezeEnd *string `url:"freeze_end,omitempty" json:"freeze_end,omitempty"` + CronTimezone *string `url:"cron_timezone,omitempty" json:"cron_timezone,omitempty"` +} + +// CreateFreezePeriodOptions adds a freeze period to a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#create-a-freeze-period +func (s *FreezePeriodsService) CreateFreezePeriodOptions(pid interface{}, opt *CreateFreezePeriodOptions, options ...RequestOptionFunc) (*FreezePeriod, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/freeze_periods", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + fp := new(FreezePeriod) + resp, err := s.client.Do(req, fp) + if err != nil { + return nil, resp, err + } + + return fp, resp, err +} + +// UpdateFreezePeriodOptions represents the available UpdateFreezePeriodOptions() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#update-a-freeze-period +type UpdateFreezePeriodOptions struct { + FreezeStart *string `url:"freeze_start,omitempty" json:"freeze_start,omitempty"` + FreezeEnd *string `url:"freeze_end,omitempty" json:"freeze_end,omitempty"` + CronTimezone *string `url:"cron_timezone,omitempty" json:"cron_timezone,omitempty"` +} + +// UpdateFreezePeriodOptions edits a freeze period for a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#update-a-freeze-period +func (s *FreezePeriodsService) UpdateFreezePeriodOptions(pid interface{}, freezePeriod int, opt *UpdateFreezePeriodOptions, options ...RequestOptionFunc) (*FreezePeriod, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/freeze_periods/%d", PathEscape(project), freezePeriod) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + fp := new(FreezePeriod) + resp, err := s.client.Do(req, fp) + if err != nil { + return nil, resp, err + } + + return fp, resp, err +} + +// DeleteFreezePeriod removes a freeze period from a project. This is an +// idempotent method and can be called multiple times. Either the hook is +// available or not. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/freeze_periods.html#delete-a-freeze-period +func (s *FreezePeriodsService) DeleteFreezePeriod(pid interface{}, freezePeriod int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/freeze_periods/%d", PathEscape(project), freezePeriod) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/generic_packages.go b/vendor/github.com/xanzy/go-gitlab/generic_packages.go new file mode 100644 index 0000000000..95f382abc2 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/generic_packages.go @@ -0,0 +1,158 @@ +// +// Copyright 2021, Sune Keller +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "io" + "net/http" + "time" +) + +// GenericPackagesService handles communication with the packages related +// methods of the GitLab API. +// +// GitLab docs: +// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html +type GenericPackagesService struct { + client *Client +} + +// GenericPackagesFile represents a GitLab generic package file. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#publish-a-package-file +type GenericPackagesFile struct { + ID int `json:"id"` + PackageID int `json:"package_id"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + Size int `json:"size"` + FileStore int `json:"file_store"` + FileMD5 string `json:"file_md5"` + FileSHA1 string `json:"file_sha1"` + FileName string `json:"file_name"` + File struct { + URL string `json:"url"` + } `json:"file"` + FileSHA256 string `json:"file_sha256"` + VerificationRetryAt *time.Time `json:"verification_retry_at"` + VerifiedAt *time.Time `json:"verified_at"` + VerificationFailure bool `json:"verification_failure"` + VerificationRetryCount int `json:"verification_retry_count"` + VerificationChecksum string `json:"verification_checksum"` + VerificationState int `json:"verification_state"` + VerificationStartedAt *time.Time `json:"verification_started_at"` + NewFilePath string `json:"new_file_path"` +} + +// FormatPackageURL returns the GitLab Package Registry URL for the given artifact metadata, without the BaseURL. +// This does not make a GitLab API request, but rather computes it based on their documentation. +func (s *GenericPackagesService) FormatPackageURL(pid interface{}, packageName, packageVersion, fileName string) (string, error) { + project, err := parseID(pid) + if err != nil { + return "", err + } + u := fmt.Sprintf( + "projects/%s/packages/generic/%s/%s/%s", + PathEscape(project), + PathEscape(packageName), + PathEscape(packageVersion), + PathEscape(fileName), + ) + return u, nil +} + +// PublishPackageFileOptions represents the available PublishPackageFile() +// options. +// +// GitLab docs: +// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#publish-a-package-file +type PublishPackageFileOptions struct { + Status *GenericPackageStatusValue `url:"status,omitempty" json:"status,omitempty"` + Select *GenericPackageSelectValue `url:"select,omitempty" json:"select,omitempty"` +} + +// PublishPackageFile uploads a file to a project's package registry. +// +// GitLab docs: +// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#publish-a-package-file +func (s *GenericPackagesService) PublishPackageFile(pid interface{}, packageName, packageVersion, fileName string, content io.Reader, opt *PublishPackageFileOptions, options ...RequestOptionFunc) (*GenericPackagesFile, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/packages/generic/%s/%s/%s", + PathEscape(project), + PathEscape(packageName), + PathEscape(packageVersion), + PathEscape(fileName), + ) + + // We need to create the request as a GET request to make sure the options + // are set correctly. After the request is created we will overwrite both + // the method and the body. + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + // Overwrite the method and body. + req.Method = http.MethodPut + req.SetBody(content) + + f := new(GenericPackagesFile) + resp, err := s.client.Do(req, f) + if err != nil { + return nil, resp, err + } + + return f, resp, err +} + +// DownloadPackageFile allows you to download the package file. +// +// GitLab docs: +// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#download-package-file +func (s *GenericPackagesService) DownloadPackageFile(pid interface{}, packageName, packageVersion, fileName string, options ...RequestOptionFunc) ([]byte, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/packages/generic/%s/%s/%s", + PathEscape(project), + PathEscape(packageName), + PathEscape(packageVersion), + PathEscape(fileName), + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var f bytes.Buffer + resp, err := s.client.Do(req, &f) + if err != nil { + return nil, resp, err + } + + return f.Bytes(), resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/geo_nodes.go b/vendor/github.com/xanzy/go-gitlab/geo_nodes.go new file mode 100644 index 0000000000..fa7c2546a5 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/geo_nodes.go @@ -0,0 +1,433 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// GeoNode represents a GitLab Geo Node. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/geo_nodes.html +type GeoNode struct { + ID int `json:"id"` + Name string `json:"name"` + URL string `json:"url"` + InternalURL string `json:"internal_url"` + Primary bool `json:"primary"` + Enabled bool `json:"enabled"` + Current bool `json:"current"` + FilesMaxCapacity int `json:"files_max_capacity"` + ReposMaxCapacity int `json:"repos_max_capacity"` + VerificationMaxCapacity int `json:"verification_max_capacity"` + SelectiveSyncType string `json:"selective_sync_type"` + SelectiveSyncShards []string `json:"selective_sync_shards"` + SelectiveSyncNamespaceIds []int `json:"selective_sync_namespace_ids"` + MinimumReverificationInterval int `json:"minimum_reverification_interval"` + ContainerRepositoriesMaxCapacity int `json:"container_repositories_max_capacity"` + SyncObjectStorage bool `json:"sync_object_storage"` + CloneProtocol string `json:"clone_protocol"` + WebEditURL string `json:"web_edit_url"` + WebGeoProjectsURL string `json:"web_geo_projects_url"` + Links GeoNodeLinks `json:"_links"` +} + +// GeoNodeLinks represents links for GitLab GeoNode. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/geo_nodes.html +type GeoNodeLinks struct { + Self string `json:"self"` + Status string `json:"status"` + Repair string `json:"repair"` +} + +// GeoNodesService handles communication with Geo Nodes related methods +// of GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/geo_nodes.html +type GeoNodesService struct { + client *Client +} + +// CreateGeoNodesOptions represents the available CreateGeoNode() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#create-a-new-geo-node +type CreateGeoNodesOptions struct { + Primary *bool `url:"primary,omitempty" json:"primary,omitempty"` + Enabled *bool `url:"enabled,omitempty" json:"enabled,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + URL *string `url:"url,omitempty" json:"url,omitempty"` + InternalURL *string `url:"internal_url,omitempty" json:"internal_url,omitempty"` + FilesMaxCapacity *int `url:"files_max_capacity,omitempty" json:"files_max_capacity,omitempty"` + ReposMaxCapacity *int `url:"repos_max_capacity,omitempty" json:"repos_max_capacity,omitempty"` + VerificationMaxCapacity *int `url:"verification_max_capacity,omitempty" json:"verification_max_capacity,omitempty"` + ContainerRepositoriesMaxCapacity *int `url:"container_repositories_max_capacity,omitempty" json:"container_repositories_max_capacity,omitempty"` + SyncObjectStorage *bool `url:"sync_object_storage,omitempty" json:"sync_object_storage,omitempty"` + SelectiveSyncType *string `url:"selective_sync_type,omitempty" json:"selective_sync_type,omitempty"` + SelectiveSyncShards *[]string `url:"selective_sync_shards,omitempty" json:"selective_sync_shards,omitempty"` + SelectiveSyncNamespaceIds *[]int `url:"selective_sync_namespace_ids,omitempty" json:"selective_sync_namespace_ids,omitempty"` + MinimumReverificationInterval *int `url:"minimum_reverification_interval,omitempty" json:"minimum_reverification_interval,omitempty"` +} + +// CreateGeoNode creates a new Geo Node. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#create-a-new-geo-node +func (s *GeoNodesService) CreateGeoNode(opt *CreateGeoNodesOptions, options ...RequestOptionFunc) (*GeoNode, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "geo_nodes", opt, options) + if err != nil { + return nil, nil, err + } + + g := new(GeoNode) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// ListGeoNodesOptions represents the available ListGeoNodes() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#retrieve-configuration-about-all-geo-nodes +type ListGeoNodesOptions ListOptions + +// ListGeoNodes gets a list of geo nodes. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#retrieve-configuration-about-all-geo-nodes +func (s *GeoNodesService) ListGeoNodes(opt *ListGeoNodesOptions, options ...RequestOptionFunc) ([]*GeoNode, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "geo_nodes", opt, options) + if err != nil { + return nil, nil, err + } + + var gs []*GeoNode + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// GetGeoNode gets a specific geo node. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#retrieve-configuration-about-a-specific-geo-node +func (s *GeoNodesService) GetGeoNode(id int, options ...RequestOptionFunc) (*GeoNode, *Response, error) { + u := fmt.Sprintf("geo_nodes/%d", id) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + g := new(GeoNode) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// UpdateGeoNodesOptions represents the available EditGeoNode() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#edit-a-geo-node +type UpdateGeoNodesOptions struct { + ID *int `url:"primary,omitempty" json:"primary,omitempty"` + Enabled *bool `url:"enabled,omitempty" json:"enabled,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + URL *string `url:"url,omitempty" json:"url,omitempty"` + InternalURL *string `url:"internal_url,omitempty" json:"internal_url,omitempty"` + FilesMaxCapacity *int `url:"files_max_capacity,omitempty" json:"files_max_capacity,omitempty"` + ReposMaxCapacity *int `url:"repos_max_capacity,omitempty" json:"repos_max_capacity,omitempty"` + VerificationMaxCapacity *int `url:"verification_max_capacity,omitempty" json:"verification_max_capacity,omitempty"` + ContainerRepositoriesMaxCapacity *int `url:"container_repositories_max_capacity,omitempty" json:"container_repositories_max_capacity,omitempty"` + SyncObjectStorage *bool `url:"sync_object_storage,omitempty" json:"sync_object_storage,omitempty"` + SelectiveSyncType *string `url:"selective_sync_type,omitempty" json:"selective_sync_type,omitempty"` + SelectiveSyncShards *[]string `url:"selective_sync_shards,omitempty" json:"selective_sync_shards,omitempty"` + SelectiveSyncNamespaceIds *[]int `url:"selective_sync_namespace_ids,omitempty" json:"selective_sync_namespace_ids,omitempty"` + MinimumReverificationInterval *int `url:"minimum_reverification_interval,omitempty" json:"minimum_reverification_interval,omitempty"` +} + +// EditGeoNode updates settings of an existing Geo node. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#edit-a-geo-node +func (s *GeoNodesService) EditGeoNode(id int, opt *UpdateGeoNodesOptions, options ...RequestOptionFunc) (*GeoNode, *Response, error) { + u := fmt.Sprintf("geo_nodes/%d", id) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + g := new(GeoNode) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// DeleteGeoNode removes the Geo node. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#delete-a-geo-node +func (s *GeoNodesService) DeleteGeoNode(id int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("geo_nodes/%d", id) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// RepairGeoNode to repair the OAuth authentication of a Geo node. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#repair-a-geo-node +func (s *GeoNodesService) RepairGeoNode(id int, options ...RequestOptionFunc) (*GeoNode, *Response, error) { + u := fmt.Sprintf("geo_nodes/%d/repair", id) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + g := new(GeoNode) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// GeoNodeStatus represents the status of Geo Node. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#retrieve-status-about-all-geo-nodes +type GeoNodeStatus struct { + GeoNodeID int `json:"geo_node_id"` + Healthy bool `json:"healthy"` + Health string `json:"health"` + HealthStatus string `json:"health_status"` + MissingOauthApplication bool `json:"missing_oauth_application"` + AttachmentsCount int `json:"attachments_count"` + AttachmentsSyncedCount int `json:"attachments_synced_count"` + AttachmentsFailedCount int `json:"attachments_failed_count"` + AttachmentsSyncedMissingOnPrimaryCount int `json:"attachments_synced_missing_on_primary_count"` + AttachmentsSyncedInPercentage string `json:"attachments_synced_in_percentage"` + DbReplicationLagSeconds int `json:"db_replication_lag_seconds"` + LfsObjectsCount int `json:"lfs_objects_count"` + LfsObjectsSyncedCount int `json:"lfs_objects_synced_count"` + LfsObjectsFailedCount int `json:"lfs_objects_failed_count"` + LfsObjectsSyncedMissingOnPrimaryCount int `json:"lfs_objects_synced_missing_on_primary_count"` + LfsObjectsSyncedInPercentage string `json:"lfs_objects_synced_in_percentage"` + JobArtifactsCount int `json:"job_artifacts_count"` + JobArtifactsSyncedCount int `json:"job_artifacts_synced_count"` + JobArtifactsFailedCount int `json:"job_artifacts_failed_count"` + JobArtifactsSyncedMissingOnPrimaryCount int `json:"job_artifacts_synced_missing_on_primary_count"` + JobArtifactsSyncedInPercentage string `json:"job_artifacts_synced_in_percentage"` + ContainerRepositoriesCount int `json:"container_repositories_count"` + ContainerRepositoriesSyncedCount int `json:"container_repositories_synced_count"` + ContainerRepositoriesFailedCount int `json:"container_repositories_failed_count"` + ContainerRepositoriesSyncedInPercentage string `json:"container_repositories_synced_in_percentage"` + DesignRepositoriesCount int `json:"design_repositories_count"` + DesignRepositoriesSyncedCount int `json:"design_repositories_synced_count"` + DesignRepositoriesFailedCount int `json:"design_repositories_failed_count"` + DesignRepositoriesSyncedInPercentage string `json:"design_repositories_synced_in_percentage"` + ProjectsCount int `json:"projects_count"` + RepositoriesCount int `json:"repositories_count"` + RepositoriesFailedCount int `json:"repositories_failed_count"` + RepositoriesSyncedCount int `json:"repositories_synced_count"` + RepositoriesSyncedInPercentage string `json:"repositories_synced_in_percentage"` + WikisCount int `json:"wikis_count"` + WikisFailedCount int `json:"wikis_failed_count"` + WikisSyncedCount int `json:"wikis_synced_count"` + WikisSyncedInPercentage string `json:"wikis_synced_in_percentage"` + ReplicationSlotsCount int `json:"replication_slots_count"` + ReplicationSlotsUsedCount int `json:"replication_slots_used_count"` + ReplicationSlotsUsedInPercentage string `json:"replication_slots_used_in_percentage"` + ReplicationSlotsMaxRetainedWalBytes int `json:"replication_slots_max_retained_wal_bytes"` + RepositoriesCheckedCount int `json:"repositories_checked_count"` + RepositoriesCheckedFailedCount int `json:"repositories_checked_failed_count"` + RepositoriesCheckedInPercentage string `json:"repositories_checked_in_percentage"` + RepositoriesChecksummedCount int `json:"repositories_checksummed_count"` + RepositoriesChecksumFailedCount int `json:"repositories_checksum_failed_count"` + RepositoriesChecksummedInPercentage string `json:"repositories_checksummed_in_percentage"` + WikisChecksummedCount int `json:"wikis_checksummed_count"` + WikisChecksumFailedCount int `json:"wikis_checksum_failed_count"` + WikisChecksummedInPercentage string `json:"wikis_checksummed_in_percentage"` + RepositoriesVerifiedCount int `json:"repositories_verified_count"` + RepositoriesVerificationFailedCount int `json:"repositories_verification_failed_count"` + RepositoriesVerifiedInPercentage string `json:"repositories_verified_in_percentage"` + RepositoriesChecksumMismatchCount int `json:"repositories_checksum_mismatch_count"` + WikisVerifiedCount int `json:"wikis_verified_count"` + WikisVerificationFailedCount int `json:"wikis_verification_failed_count"` + WikisVerifiedInPercentage string `json:"wikis_verified_in_percentage"` + WikisChecksumMismatchCount int `json:"wikis_checksum_mismatch_count"` + RepositoriesRetryingVerificationCount int `json:"repositories_retrying_verification_count"` + WikisRetryingVerificationCount int `json:"wikis_retrying_verification_count"` + LastEventID int `json:"last_event_id"` + LastEventTimestamp int `json:"last_event_timestamp"` + CursorLastEventID int `json:"cursor_last_event_id"` + CursorLastEventTimestamp int `json:"cursor_last_event_timestamp"` + LastSuccessfulStatusCheckTimestamp int `json:"last_successful_status_check_timestamp"` + Version string `json:"version"` + Revision string `json:"revision"` + MergeRequestDiffsCount int `json:"merge_request_diffs_count"` + MergeRequestDiffsChecksumTotalCount int `json:"merge_request_diffs_checksum_total_count"` + MergeRequestDiffsChecksummedCount int `json:"merge_request_diffs_checksummed_count"` + MergeRequestDiffsChecksumFailedCount int `json:"merge_request_diffs_checksum_failed_count"` + MergeRequestDiffsSyncedCount int `json:"merge_request_diffs_synced_count"` + MergeRequestDiffsFailedCount int `json:"merge_request_diffs_failed_count"` + MergeRequestDiffsRegistryCount int `json:"merge_request_diffs_registry_count"` + MergeRequestDiffsVerificationTotalCount int `json:"merge_request_diffs_verification_total_count"` + MergeRequestDiffsVerifiedCount int `json:"merge_request_diffs_verified_count"` + MergeRequestDiffsVerificationFailedCount int `json:"merge_request_diffs_verification_failed_count"` + MergeRequestDiffsSyncedInPercentage string `json:"merge_request_diffs_synced_in_percentage"` + MergeRequestDiffsVerifiedInPercentage string `json:"merge_request_diffs_verified_in_percentage"` + PackageFilesCount int `json:"package_files_count"` + PackageFilesChecksumTotalCount int `json:"package_files_checksum_total_count"` + PackageFilesChecksummedCount int `json:"package_files_checksummed_count"` + PackageFilesChecksumFailedCount int `json:"package_files_checksum_failed_count"` + PackageFilesSyncedCount int `json:"package_files_synced_count"` + PackageFilesFailedCount int `json:"package_files_failed_count"` + PackageFilesRegistryCount int `json:"package_files_registry_count"` + PackageFilesVerificationTotalCount int `json:"package_files_verification_total_count"` + PackageFilesVerifiedCount int `json:"package_files_verified_count"` + PackageFilesVerificationFailedCount int `json:"package_files_verification_failed_count"` + PackageFilesSyncedInPercentage string `json:"package_files_synced_in_percentage"` + PackageFilesVerifiedInPercentage string `json:"package_files_verified_in_percentage"` + PagesDeploymentsCount int `json:"pages_deployments_count"` + PagesDeploymentsChecksumTotalCount int `json:"pages_deployments_checksum_total_count"` + PagesDeploymentsChecksummedCount int `json:"pages_deployments_checksummed_count"` + PagesDeploymentsChecksumFailedCount int `json:"pages_deployments_checksum_failed_count"` + PagesDeploymentsSyncedCount int `json:"pages_deployments_synced_count"` + PagesDeploymentsFailedCount int `json:"pages_deployments_failed_count"` + PagesDeploymentsRegistryCount int `json:"pages_deployments_registry_count"` + PagesDeploymentsVerificationTotalCount int `json:"pages_deployments_verification_total_count"` + PagesDeploymentsVerifiedCount int `json:"pages_deployments_verified_count"` + PagesDeploymentsVerificationFailedCount int `json:"pages_deployments_verification_failed_count"` + PagesDeploymentsSyncedInPercentage string `json:"pages_deployments_synced_in_percentage"` + PagesDeploymentsVerifiedInPercentage string `json:"pages_deployments_verified_in_percentage"` + TerraformStateVersionsCount int `json:"terraform_state_versions_count"` + TerraformStateVersionsChecksumTotalCount int `json:"terraform_state_versions_checksum_total_count"` + TerraformStateVersionsChecksummedCount int `json:"terraform_state_versions_checksummed_count"` + TerraformStateVersionsChecksumFailedCount int `json:"terraform_state_versions_checksum_failed_count"` + TerraformStateVersionsSyncedCount int `json:"terraform_state_versions_synced_count"` + TerraformStateVersionsFailedCount int `json:"terraform_state_versions_failed_count"` + TerraformStateVersionsRegistryCount int `json:"terraform_state_versions_registry_count"` + TerraformStateVersionsVerificationTotalCount int `json:"terraform_state_versions_verification_total_count"` + TerraformStateVersionsVerifiedCount int `json:"terraform_state_versions_verified_count"` + TerraformStateVersionsVerificationFailedCount int `json:"terraform_state_versions_verification_failed_count"` + TerraformStateVersionsSyncedInPercentage string `json:"terraform_state_versions_synced_in_percentage"` + TerraformStateVersionsVerifiedInPercentage string `json:"terraform_state_versions_verified_in_percentage"` + SnippetRepositoriesCount int `json:"snippet_repositories_count"` + SnippetRepositoriesChecksumTotalCount int `json:"snippet_repositories_checksum_total_count"` + SnippetRepositoriesChecksummedCount int `json:"snippet_repositories_checksummed_count"` + SnippetRepositoriesChecksumFailedCount int `json:"snippet_repositories_checksum_failed_count"` + SnippetRepositoriesSyncedCount int `json:"snippet_repositories_synced_count"` + SnippetRepositoriesFailedCount int `json:"snippet_repositories_failed_count"` + SnippetRepositoriesRegistryCount int `json:"snippet_repositories_registry_count"` + SnippetRepositoriesVerificationTotalCount int `json:"snippet_repositories_verification_total_count"` + SnippetRepositoriesVerifiedCount int `json:"snippet_repositories_verified_count"` + SnippetRepositoriesVerificationFailedCount int `json:"snippet_repositories_verification_failed_count"` + SnippetRepositoriesSyncedInPercentage string `json:"snippet_repositories_synced_in_percentage"` + SnippetRepositoriesVerifiedInPercentage string `json:"snippet_repositories_verified_in_percentage"` + GroupWikiRepositoriesCount int `json:"group_wiki_repositories_count"` + GroupWikiRepositoriesChecksumTotalCount int `json:"group_wiki_repositories_checksum_total_count"` + GroupWikiRepositoriesChecksummedCount int `json:"group_wiki_repositories_checksummed_count"` + GroupWikiRepositoriesChecksumFailedCount int `json:"group_wiki_repositories_checksum_failed_count"` + GroupWikiRepositoriesSyncedCount int `json:"group_wiki_repositories_synced_count"` + GroupWikiRepositoriesFailedCount int `json:"group_wiki_repositories_failed_count"` + GroupWikiRepositoriesRegistryCount int `json:"group_wiki_repositories_registry_count"` + GroupWikiRepositoriesVerificationTotalCount int `json:"group_wiki_repositories_verification_total_count"` + GroupWikiRepositoriesVerifiedCount int `json:"group_wiki_repositories_verified_count"` + GroupWikiRepositoriesVerificationFailedCount int `json:"group_wiki_repositories_verification_failed_count"` + GroupWikiRepositoriesSyncedInPercentage string `json:"group_wiki_repositories_synced_in_percentage"` + GroupWikiRepositoriesVerifiedInPercentage string `json:"group_wiki_repositories_verified_in_percentage"` + PipelineArtifactsCount int `json:"pipeline_artifacts_count"` + PipelineArtifactsChecksumTotalCount int `json:"pipeline_artifacts_checksum_total_count"` + PipelineArtifactsChecksummedCount int `json:"pipeline_artifacts_checksummed_count"` + PipelineArtifactsChecksumFailedCount int `json:"pipeline_artifacts_checksum_failed_count"` + PipelineArtifactsSyncedCount int `json:"pipeline_artifacts_synced_count"` + PipelineArtifactsFailedCount int `json:"pipeline_artifacts_failed_count"` + PipelineArtifactsRegistryCount int `json:"pipeline_artifacts_registry_count"` + PipelineArtifactsVerificationTotalCount int `json:"pipeline_artifacts_verification_total_count"` + PipelineArtifactsVerifiedCount int `json:"pipeline_artifacts_verified_count"` + PipelineArtifactsVerificationFailedCount int `json:"pipeline_artifacts_verification_failed_count"` + PipelineArtifactsSyncedInPercentage string `json:"pipeline_artifacts_synced_in_percentage"` + PipelineArtifactsVerifiedInPercentage string `json:"pipeline_artifacts_verified_in_percentage"` + UploadsCount int `json:"uploads_count"` + UploadsSyncedCount int `json:"uploads_synced_count"` + UploadsFailedCount int `json:"uploads_failed_count"` + UploadsRegistryCount int `json:"uploads_registry_count"` + UploadsSyncedInPercentage string `json:"uploads_synced_in_percentage"` +} + +// RetrieveStatusOfAllGeoNodes get the list of status of all Geo Nodes. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#retrieve-status-about-all-geo-nodes +func (s *GeoNodesService) RetrieveStatusOfAllGeoNodes(options ...RequestOptionFunc) ([]*GeoNodeStatus, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "geo_nodes/status", nil, options) + if err != nil { + return nil, nil, err + } + + var gnss []*GeoNodeStatus + resp, err := s.client.Do(req, &gnss) + if err != nil { + return nil, resp, err + } + + return gnss, resp, err +} + +// RetrieveStatusOfGeoNode get the of status of a specific Geo Nodes. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/geo_nodes.html#retrieve-status-about-a-specific-geo-node +func (s *GeoNodesService) RetrieveStatusOfGeoNode(id int, options ...RequestOptionFunc) (*GeoNodeStatus, *Response, error) { + u := fmt.Sprintf("geo_nodes/%d/status", id) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gns := new(GeoNodeStatus) + resp, err := s.client.Do(req, gns) + if err != nil { + return nil, resp, err + } + + return gns, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/gitignore_templates.go b/vendor/github.com/xanzy/go-gitlab/gitignore_templates.go new file mode 100644 index 0000000000..36b13995b3 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/gitignore_templates.go @@ -0,0 +1,93 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// GitIgnoreTemplatesService handles communication with the gitignore +// templates related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/templates/gitignores.html +type GitIgnoreTemplatesService struct { + client *Client +} + +// GitIgnoreTemplate represents a GitLab gitignore template. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/templates/gitignores.html +type GitIgnoreTemplate struct { + Name string `json:"name"` + Content string `json:"content"` +} + +// GitIgnoreTemplateListItem represents a GitLab gitignore template from the list. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/templates/gitignores.html +type GitIgnoreTemplateListItem struct { + Key string `json:"key"` + Name string `json:"name"` +} + +// ListTemplatesOptions represents the available ListAllTemplates() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitignores.html#get-all-gitignore-templates +type ListTemplatesOptions ListOptions + +// ListTemplates get a list of available git ignore templates +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitignores.html#get-all-gitignore-templates +func (s *GitIgnoreTemplatesService) ListTemplates(opt *ListTemplatesOptions, options ...RequestOptionFunc) ([]*GitIgnoreTemplateListItem, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "templates/gitignores", opt, options) + if err != nil { + return nil, nil, err + } + + var gs []*GitIgnoreTemplateListItem + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// GetTemplate get a git ignore template +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/gitignores.html#get-a-single-gitignore-template +func (s *GitIgnoreTemplatesService) GetTemplate(key string, options ...RequestOptionFunc) (*GitIgnoreTemplate, *Response, error) { + u := fmt.Sprintf("templates/gitignores/%s", url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + g := new(GitIgnoreTemplate) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/gitlab.go b/vendor/github.com/xanzy/go-gitlab/gitlab.go new file mode 100644 index 0000000000..81cf3ff9e6 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/gitlab.go @@ -0,0 +1,952 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab implements a GitLab API client. +package gitlab + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "math/rand" + "mime/multipart" + "net/http" + "net/url" + "sort" + "strconv" + "strings" + "sync" + "time" + + "github.com/google/go-querystring/query" + "github.com/hashicorp/go-cleanhttp" + retryablehttp "github.com/hashicorp/go-retryablehttp" + "golang.org/x/oauth2" + "golang.org/x/time/rate" +) + +const ( + defaultBaseURL = "https://gitlab.com/" + apiVersionPath = "api/v4/" + userAgent = "go-gitlab" + + headerRateLimit = "RateLimit-Limit" + headerRateReset = "RateLimit-Reset" +) + +// AuthType represents an authentication type within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +type AuthType int + +// List of available authentication types. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +const ( + BasicAuth AuthType = iota + JobToken + OAuthToken + PrivateToken +) + +// A Client manages communication with the GitLab API. +type Client struct { + // HTTP client used to communicate with the API. + client *retryablehttp.Client + + // Base URL for API requests. Defaults to the public GitLab API, but can be + // set to a domain endpoint to use with a self hosted GitLab server. baseURL + // should always be specified with a trailing slash. + baseURL *url.URL + + // disableRetries is used to disable the default retry logic. + disableRetries bool + + // configureLimiterOnce is used to make sure the limiter is configured exactly + // once and block all other calls until the initial (one) call is done. + configureLimiterOnce sync.Once + + // Limiter is used to limit API calls and prevent 429 responses. + limiter RateLimiter + + // Token type used to make authenticated API calls. + authType AuthType + + // Username and password used for basic authentication. + username, password string + + // Token used to make authenticated API calls. + token string + + // Protects the token field from concurrent read/write accesses. + tokenLock sync.RWMutex + + // Default request options applied to every request. + defaultRequestOptions []RequestOptionFunc + + // User agent used when communicating with the GitLab API. + UserAgent string + + // Services used for talking to different parts of the GitLab API. + AccessRequests *AccessRequestsService + Applications *ApplicationsService + AuditEvents *AuditEventsService + Avatar *AvatarRequestsService + AwardEmoji *AwardEmojiService + Boards *IssueBoardsService + Branches *BranchesService + BroadcastMessage *BroadcastMessagesService + CIYMLTemplate *CIYMLTemplatesService + ClusterAgents *ClusterAgentsService + Commits *CommitsService + ContainerRegistry *ContainerRegistryService + CustomAttribute *CustomAttributesService + DeployKeys *DeployKeysService + DeployTokens *DeployTokensService + DeploymentMergeRequests *DeploymentMergeRequestsService + Deployments *DeploymentsService + Discussions *DiscussionsService + DockerfileTemplate *DockerfileTemplatesService + Environments *EnvironmentsService + EpicIssues *EpicIssuesService + Epics *EpicsService + ErrorTracking *ErrorTrackingService + Events *EventsService + ExternalStatusChecks *ExternalStatusChecksService + Features *FeaturesService + FreezePeriods *FreezePeriodsService + GenericPackages *GenericPackagesService + GeoNodes *GeoNodesService + GitIgnoreTemplates *GitIgnoreTemplatesService + GroupAccessTokens *GroupAccessTokensService + GroupBadges *GroupBadgesService + GroupCluster *GroupClustersService + GroupImportExport *GroupImportExportService + GroupIssueBoards *GroupIssueBoardsService + GroupIterations *GroupIterationsService + GroupLabels *GroupLabelsService + GroupMembers *GroupMembersService + GroupMilestones *GroupMilestonesService + GroupVariables *GroupVariablesService + GroupWikis *GroupWikisService + Groups *GroupsService + InstanceCluster *InstanceClustersService + InstanceVariables *InstanceVariablesService + Invites *InvitesService + IssueLinks *IssueLinksService + Issues *IssuesService + IssuesStatistics *IssuesStatisticsService + Jobs *JobsService + Keys *KeysService + Labels *LabelsService + License *LicenseService + LicenseTemplates *LicenseTemplatesService + ManagedLicenses *ManagedLicensesService + Markdown *MarkdownService + MergeRequestApprovals *MergeRequestApprovalsService + MergeRequests *MergeRequestsService + Metadata *MetadataService + Milestones *MilestonesService + Namespaces *NamespacesService + Notes *NotesService + NotificationSettings *NotificationSettingsService + Packages *PackagesService + Pages *PagesService + PagesDomains *PagesDomainsService + PersonalAccessTokens *PersonalAccessTokensService + PipelineSchedules *PipelineSchedulesService + PipelineTriggers *PipelineTriggersService + Pipelines *PipelinesService + PlanLimits *PlanLimitsService + ProjectAccessTokens *ProjectAccessTokensService + ProjectBadges *ProjectBadgesService + ProjectCluster *ProjectClustersService + ProjectFeatureFlags *ProjectFeatureFlagService + ProjectImportExport *ProjectImportExportService + ProjectIterations *ProjectIterationsService + ProjectMembers *ProjectMembersService + ProjectMirrors *ProjectMirrorService + ProjectSnippets *ProjectSnippetsService + ProjectTemplates *ProjectTemplatesService + ProjectVariables *ProjectVariablesService + ProjectVulnerabilities *ProjectVulnerabilitiesService + Projects *ProjectsService + ProtectedBranches *ProtectedBranchesService + ProtectedEnvironments *ProtectedEnvironmentsService + ProtectedTags *ProtectedTagsService + ReleaseLinks *ReleaseLinksService + Releases *ReleasesService + Repositories *RepositoriesService + RepositoryFiles *RepositoryFilesService + RepositorySubmodules *RepositorySubmodulesService + ResourceLabelEvents *ResourceLabelEventsService + ResourceMilestoneEvents *ResourceMilestoneEventsService + ResourceStateEvents *ResourceStateEventsService + ResourceWeightEvents *ResourceWeightEventsService + Runners *RunnersService + Search *SearchService + Services *ServicesService + Settings *SettingsService + Sidekiq *SidekiqService + Snippets *SnippetsService + SystemHooks *SystemHooksService + Tags *TagsService + Todos *TodosService + Topics *TopicsService + Users *UsersService + Validate *ValidateService + Version *VersionService + Wikis *WikisService +} + +// ListOptions specifies the optional parameters to various List methods that +// support pagination. +type ListOptions struct { + // For paginated result sets, page of results to retrieve. + Page int `url:"page,omitempty" json:"page,omitempty"` + + // For paginated result sets, the number of results to include per page. + PerPage int `url:"per_page,omitempty" json:"per_page,omitempty"` +} + +// RateLimiter describes the interface that all (custom) rate limiters must implement. +type RateLimiter interface { + Wait(context.Context) error +} + +// NewClient returns a new GitLab API client. To use API methods which require +// authentication, provide a valid private or personal token. +func NewClient(token string, options ...ClientOptionFunc) (*Client, error) { + client, err := newClient(options...) + if err != nil { + return nil, err + } + client.authType = PrivateToken + client.token = token + return client, nil +} + +// NewBasicAuthClient returns a new GitLab API client. To use API methods which +// require authentication, provide a valid username and password. +func NewBasicAuthClient(username, password string, options ...ClientOptionFunc) (*Client, error) { + client, err := newClient(options...) + if err != nil { + return nil, err + } + + client.authType = BasicAuth + client.username = username + client.password = password + + return client, nil +} + +// NewJobClient returns a new GitLab API client. To use API methods which require +// authentication, provide a valid job token. +func NewJobClient(token string, options ...ClientOptionFunc) (*Client, error) { + client, err := newClient(options...) + if err != nil { + return nil, err + } + client.authType = JobToken + client.token = token + return client, nil +} + +// NewOAuthClient returns a new GitLab API client. To use API methods which +// require authentication, provide a valid oauth token. +func NewOAuthClient(token string, options ...ClientOptionFunc) (*Client, error) { + client, err := newClient(options...) + if err != nil { + return nil, err + } + client.authType = OAuthToken + client.token = token + return client, nil +} + +func newClient(options ...ClientOptionFunc) (*Client, error) { + c := &Client{UserAgent: userAgent} + + // Configure the HTTP client. + c.client = &retryablehttp.Client{ + Backoff: c.retryHTTPBackoff, + CheckRetry: c.retryHTTPCheck, + ErrorHandler: retryablehttp.PassthroughErrorHandler, + HTTPClient: cleanhttp.DefaultPooledClient(), + RetryWaitMin: 100 * time.Millisecond, + RetryWaitMax: 400 * time.Millisecond, + RetryMax: 5, + } + + // Set the default base URL. + c.setBaseURL(defaultBaseURL) + + // Apply any given client options. + for _, fn := range options { + if fn == nil { + continue + } + if err := fn(c); err != nil { + return nil, err + } + } + + // If no custom limiter was set using a client option, configure + // the default rate limiter with values that implicitly disable + // rate limiting until an initial HTTP call is done and we can + // use the headers to try and properly configure the limiter. + if c.limiter == nil { + c.limiter = rate.NewLimiter(rate.Inf, 0) + } + + // Create the internal timeStats service. + timeStats := &timeStatsService{client: c} + + // Create all the public services. + c.AccessRequests = &AccessRequestsService{client: c} + c.Applications = &ApplicationsService{client: c} + c.AuditEvents = &AuditEventsService{client: c} + c.Avatar = &AvatarRequestsService{client: c} + c.AwardEmoji = &AwardEmojiService{client: c} + c.Boards = &IssueBoardsService{client: c} + c.Branches = &BranchesService{client: c} + c.BroadcastMessage = &BroadcastMessagesService{client: c} + c.CIYMLTemplate = &CIYMLTemplatesService{client: c} + c.ClusterAgents = &ClusterAgentsService{client: c} + c.Commits = &CommitsService{client: c} + c.ContainerRegistry = &ContainerRegistryService{client: c} + c.CustomAttribute = &CustomAttributesService{client: c} + c.DeployKeys = &DeployKeysService{client: c} + c.DeployTokens = &DeployTokensService{client: c} + c.DeploymentMergeRequests = &DeploymentMergeRequestsService{client: c} + c.Deployments = &DeploymentsService{client: c} + c.Discussions = &DiscussionsService{client: c} + c.DockerfileTemplate = &DockerfileTemplatesService{client: c} + c.Environments = &EnvironmentsService{client: c} + c.EpicIssues = &EpicIssuesService{client: c} + c.Epics = &EpicsService{client: c} + c.ErrorTracking = &ErrorTrackingService{client: c} + c.Events = &EventsService{client: c} + c.ExternalStatusChecks = &ExternalStatusChecksService{client: c} + c.Features = &FeaturesService{client: c} + c.FreezePeriods = &FreezePeriodsService{client: c} + c.GenericPackages = &GenericPackagesService{client: c} + c.GeoNodes = &GeoNodesService{client: c} + c.GitIgnoreTemplates = &GitIgnoreTemplatesService{client: c} + c.GroupAccessTokens = &GroupAccessTokensService{client: c} + c.GroupBadges = &GroupBadgesService{client: c} + c.GroupCluster = &GroupClustersService{client: c} + c.GroupImportExport = &GroupImportExportService{client: c} + c.GroupIssueBoards = &GroupIssueBoardsService{client: c} + c.GroupIterations = &GroupIterationsService{client: c} + c.GroupLabels = &GroupLabelsService{client: c} + c.GroupMembers = &GroupMembersService{client: c} + c.GroupMilestones = &GroupMilestonesService{client: c} + c.GroupVariables = &GroupVariablesService{client: c} + c.GroupWikis = &GroupWikisService{client: c} + c.Groups = &GroupsService{client: c} + c.InstanceCluster = &InstanceClustersService{client: c} + c.InstanceVariables = &InstanceVariablesService{client: c} + c.Invites = &InvitesService{client: c} + c.IssueLinks = &IssueLinksService{client: c} + c.Issues = &IssuesService{client: c, timeStats: timeStats} + c.IssuesStatistics = &IssuesStatisticsService{client: c} + c.Jobs = &JobsService{client: c} + c.Keys = &KeysService{client: c} + c.Labels = &LabelsService{client: c} + c.License = &LicenseService{client: c} + c.LicenseTemplates = &LicenseTemplatesService{client: c} + c.ManagedLicenses = &ManagedLicensesService{client: c} + c.Markdown = &MarkdownService{client: c} + c.MergeRequestApprovals = &MergeRequestApprovalsService{client: c} + c.MergeRequests = &MergeRequestsService{client: c, timeStats: timeStats} + c.Metadata = &MetadataService{client: c} + c.Milestones = &MilestonesService{client: c} + c.Namespaces = &NamespacesService{client: c} + c.Notes = &NotesService{client: c} + c.NotificationSettings = &NotificationSettingsService{client: c} + c.Packages = &PackagesService{client: c} + c.Pages = &PagesService{client: c} + c.PagesDomains = &PagesDomainsService{client: c} + c.PersonalAccessTokens = &PersonalAccessTokensService{client: c} + c.PipelineSchedules = &PipelineSchedulesService{client: c} + c.PipelineTriggers = &PipelineTriggersService{client: c} + c.Pipelines = &PipelinesService{client: c} + c.PlanLimits = &PlanLimitsService{client: c} + c.ProjectAccessTokens = &ProjectAccessTokensService{client: c} + c.ProjectBadges = &ProjectBadgesService{client: c} + c.ProjectCluster = &ProjectClustersService{client: c} + c.ProjectFeatureFlags = &ProjectFeatureFlagService{client: c} + c.ProjectImportExport = &ProjectImportExportService{client: c} + c.ProjectIterations = &ProjectIterationsService{client: c} + c.ProjectMembers = &ProjectMembersService{client: c} + c.ProjectMirrors = &ProjectMirrorService{client: c} + c.ProjectSnippets = &ProjectSnippetsService{client: c} + c.ProjectTemplates = &ProjectTemplatesService{client: c} + c.ProjectVariables = &ProjectVariablesService{client: c} + c.ProjectVulnerabilities = &ProjectVulnerabilitiesService{client: c} + c.Projects = &ProjectsService{client: c} + c.ProtectedBranches = &ProtectedBranchesService{client: c} + c.ProtectedEnvironments = &ProtectedEnvironmentsService{client: c} + c.ProtectedTags = &ProtectedTagsService{client: c} + c.ReleaseLinks = &ReleaseLinksService{client: c} + c.Releases = &ReleasesService{client: c} + c.Repositories = &RepositoriesService{client: c} + c.RepositoryFiles = &RepositoryFilesService{client: c} + c.RepositorySubmodules = &RepositorySubmodulesService{client: c} + c.ResourceLabelEvents = &ResourceLabelEventsService{client: c} + c.ResourceMilestoneEvents = &ResourceMilestoneEventsService{client: c} + c.ResourceStateEvents = &ResourceStateEventsService{client: c} + c.ResourceWeightEvents = &ResourceWeightEventsService{client: c} + c.Runners = &RunnersService{client: c} + c.Search = &SearchService{client: c} + c.Services = &ServicesService{client: c} + c.Settings = &SettingsService{client: c} + c.Sidekiq = &SidekiqService{client: c} + c.Snippets = &SnippetsService{client: c} + c.SystemHooks = &SystemHooksService{client: c} + c.Tags = &TagsService{client: c} + c.Todos = &TodosService{client: c} + c.Topics = &TopicsService{client: c} + c.Users = &UsersService{client: c} + c.Validate = &ValidateService{client: c} + c.Version = &VersionService{client: c} + c.Wikis = &WikisService{client: c} + + return c, nil +} + +// retryHTTPCheck provides a callback for Client.CheckRetry which +// will retry both rate limit (429) and server (>= 500) errors. +func (c *Client) retryHTTPCheck(ctx context.Context, resp *http.Response, err error) (bool, error) { + if ctx.Err() != nil { + return false, ctx.Err() + } + if err != nil { + return false, err + } + if !c.disableRetries && (resp.StatusCode == 429 || resp.StatusCode >= 500) { + return true, nil + } + return false, nil +} + +// retryHTTPBackoff provides a generic callback for Client.Backoff which +// will pass through all calls based on the status code of the response. +func (c *Client) retryHTTPBackoff(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration { + // Use the rate limit backoff function when we are rate limited. + if resp != nil && resp.StatusCode == 429 { + return rateLimitBackoff(min, max, attemptNum, resp) + } + + // Set custom duration's when we experience a service interruption. + min = 700 * time.Millisecond + max = 900 * time.Millisecond + + return retryablehttp.LinearJitterBackoff(min, max, attemptNum, resp) +} + +// rateLimitBackoff provides a callback for Client.Backoff which will use the +// RateLimit-Reset header to determine the time to wait. We add some jitter +// to prevent a thundering herd. +// +// min and max are mainly used for bounding the jitter that will be added to +// the reset time retrieved from the headers. But if the final wait time is +// less then min, min will be used instead. +func rateLimitBackoff(min, max time.Duration, attemptNum int, resp *http.Response) time.Duration { + // rnd is used to generate pseudo-random numbers. + rnd := rand.New(rand.NewSource(time.Now().UnixNano())) + + // First create some jitter bounded by the min and max durations. + jitter := time.Duration(rnd.Float64() * float64(max-min)) + + if resp != nil { + if v := resp.Header.Get(headerRateReset); v != "" { + if reset, _ := strconv.ParseInt(v, 10, 64); reset > 0 { + // Only update min if the given time to wait is longer. + if wait := time.Until(time.Unix(reset, 0)); wait > min { + min = wait + } + } + } + } + + return min + jitter +} + +// configureLimiter configures the rate limiter. +func (c *Client) configureLimiter(ctx context.Context, headers http.Header) { + if v := headers.Get(headerRateLimit); v != "" { + if rateLimit, _ := strconv.ParseFloat(v, 64); rateLimit > 0 { + // The rate limit is based on requests per minute, so for our limiter to + // work correctly we divide the limit by 60 to get the limit per second. + rateLimit /= 60 + + // Configure the limit and burst using a split of 2/3 for the limit and + // 1/3 for the burst. This enables clients to burst 1/3 of the allowed + // calls before the limiter kicks in. The remaining calls will then be + // spread out evenly using intervals of time.Second / limit which should + // prevent hitting the rate limit. + limit := rate.Limit(rateLimit * 0.66) + burst := int(rateLimit * 0.33) + + // Create a new limiter using the calculated values. + c.limiter = rate.NewLimiter(limit, burst) + + // Call the limiter once as we have already made a request + // to get the headers and the limiter is not aware of this. + c.limiter.Wait(ctx) + } + } +} + +// BaseURL return a copy of the baseURL. +func (c *Client) BaseURL() *url.URL { + u := *c.baseURL + return &u +} + +// setBaseURL sets the base URL for API requests to a custom endpoint. +func (c *Client) setBaseURL(urlStr string) error { + // Make sure the given URL end with a slash + if !strings.HasSuffix(urlStr, "/") { + urlStr += "/" + } + + baseURL, err := url.Parse(urlStr) + if err != nil { + return err + } + + if !strings.HasSuffix(baseURL.Path, apiVersionPath) { + baseURL.Path += apiVersionPath + } + + // Update the base URL of the client. + c.baseURL = baseURL + + return nil +} + +// NewRequest creates a new API request. The method expects a relative URL +// path that will be resolved relative to the base URL of the Client. +// Relative URL paths should always be specified without a preceding slash. +// If specified, the value pointed to by body is JSON encoded and included +// as the request body. +func (c *Client) NewRequest(method, path string, opt interface{}, options []RequestOptionFunc) (*retryablehttp.Request, error) { + u := *c.baseURL + unescaped, err := url.PathUnescape(path) + if err != nil { + return nil, err + } + + // Set the encoded path data + u.RawPath = c.baseURL.Path + path + u.Path = c.baseURL.Path + unescaped + + // Create a request specific headers map. + reqHeaders := make(http.Header) + reqHeaders.Set("Accept", "application/json") + + if c.UserAgent != "" { + reqHeaders.Set("User-Agent", c.UserAgent) + } + + var body interface{} + switch { + case method == http.MethodPatch || method == http.MethodPost || method == http.MethodPut: + reqHeaders.Set("Content-Type", "application/json") + + if opt != nil { + body, err = json.Marshal(opt) + if err != nil { + return nil, err + } + } + case opt != nil: + q, err := query.Values(opt) + if err != nil { + return nil, err + } + u.RawQuery = q.Encode() + } + + req, err := retryablehttp.NewRequest(method, u.String(), body) + if err != nil { + return nil, err + } + + for _, fn := range append(c.defaultRequestOptions, options...) { + if fn == nil { + continue + } + if err := fn(req); err != nil { + return nil, err + } + } + + // Set the request specific headers. + for k, v := range reqHeaders { + req.Header[k] = v + } + + return req, nil +} + +// UploadRequest creates an API request for uploading a file. The method +// expects a relative URL path that will be resolved relative to the base +// URL of the Client. Relative URL paths should always be specified without +// a preceding slash. If specified, the value pointed to by body is JSON +// encoded and included as the request body. +func (c *Client) UploadRequest(method, path string, content io.Reader, filename string, uploadType UploadType, opt interface{}, options []RequestOptionFunc) (*retryablehttp.Request, error) { + u := *c.baseURL + unescaped, err := url.PathUnescape(path) + if err != nil { + return nil, err + } + + // Set the encoded path data + u.RawPath = c.baseURL.Path + path + u.Path = c.baseURL.Path + unescaped + + // Create a request specific headers map. + reqHeaders := make(http.Header) + reqHeaders.Set("Accept", "application/json") + + if c.UserAgent != "" { + reqHeaders.Set("User-Agent", c.UserAgent) + } + + b := new(bytes.Buffer) + w := multipart.NewWriter(b) + + fw, err := w.CreateFormFile(string(uploadType), filename) + if err != nil { + return nil, err + } + + if _, err := io.Copy(fw, content); err != nil { + return nil, err + } + + if opt != nil { + fields, err := query.Values(opt) + if err != nil { + return nil, err + } + for name := range fields { + if err = w.WriteField(name, fmt.Sprintf("%v", fields.Get(name))); err != nil { + return nil, err + } + } + } + + if err = w.Close(); err != nil { + return nil, err + } + + reqHeaders.Set("Content-Type", w.FormDataContentType()) + + req, err := retryablehttp.NewRequest(method, u.String(), b) + if err != nil { + return nil, err + } + + for _, fn := range append(c.defaultRequestOptions, options...) { + if fn == nil { + continue + } + if err := fn(req); err != nil { + return nil, err + } + } + + // Set the request specific headers. + for k, v := range reqHeaders { + req.Header[k] = v + } + + return req, nil +} + +// Response is a GitLab API response. This wraps the standard http.Response +// returned from GitLab and provides convenient access to things like +// pagination links. +type Response struct { + *http.Response + + // These fields provide the page values for paginating through a set of + // results. Any or all of these may be set to the zero value for + // responses that are not part of a paginated set, or for which there + // are no additional pages. + TotalItems int + TotalPages int + ItemsPerPage int + CurrentPage int + NextPage int + PreviousPage int +} + +// newResponse creates a new Response for the provided http.Response. +func newResponse(r *http.Response) *Response { + response := &Response{Response: r} + response.populatePageValues() + return response +} + +const ( + xTotal = "X-Total" + xTotalPages = "X-Total-Pages" + xPerPage = "X-Per-Page" + xPage = "X-Page" + xNextPage = "X-Next-Page" + xPrevPage = "X-Prev-Page" +) + +// populatePageValues parses the HTTP Link response headers and populates the +// various pagination link values in the Response. +func (r *Response) populatePageValues() { + if totalItems := r.Header.Get(xTotal); totalItems != "" { + r.TotalItems, _ = strconv.Atoi(totalItems) + } + if totalPages := r.Header.Get(xTotalPages); totalPages != "" { + r.TotalPages, _ = strconv.Atoi(totalPages) + } + if itemsPerPage := r.Header.Get(xPerPage); itemsPerPage != "" { + r.ItemsPerPage, _ = strconv.Atoi(itemsPerPage) + } + if currentPage := r.Header.Get(xPage); currentPage != "" { + r.CurrentPage, _ = strconv.Atoi(currentPage) + } + if nextPage := r.Header.Get(xNextPage); nextPage != "" { + r.NextPage, _ = strconv.Atoi(nextPage) + } + if previousPage := r.Header.Get(xPrevPage); previousPage != "" { + r.PreviousPage, _ = strconv.Atoi(previousPage) + } +} + +// Do sends an API request and returns the API response. The API response is +// JSON decoded and stored in the value pointed to by v, or returned as an +// error if an API error has occurred. If v implements the io.Writer +// interface, the raw response body will be written to v, without attempting to +// first decode it. +func (c *Client) Do(req *retryablehttp.Request, v interface{}) (*Response, error) { + // Wait will block until the limiter can obtain a new token. + err := c.limiter.Wait(req.Context()) + if err != nil { + return nil, err + } + + // Set the correct authentication header. If using basic auth, then check + // if we already have a token and if not first authenticate and get one. + var basicAuthToken string + switch c.authType { + case BasicAuth: + c.tokenLock.RLock() + basicAuthToken = c.token + c.tokenLock.RUnlock() + if basicAuthToken == "" { + // If we don't have a token yet, we first need to request one. + basicAuthToken, err = c.requestOAuthToken(req.Context(), basicAuthToken) + if err != nil { + return nil, err + } + } + req.Header.Set("Authorization", "Bearer "+basicAuthToken) + case JobToken: + if values := req.Header.Values("JOB-TOKEN"); len(values) == 0 { + req.Header.Set("JOB-TOKEN", c.token) + } + case OAuthToken: + if values := req.Header.Values("Authorization"); len(values) == 0 { + req.Header.Set("Authorization", "Bearer "+c.token) + } + case PrivateToken: + if values := req.Header.Values("PRIVATE-TOKEN"); len(values) == 0 { + req.Header.Set("PRIVATE-TOKEN", c.token) + } + } + + resp, err := c.client.Do(req) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusUnauthorized && c.authType == BasicAuth { + resp.Body.Close() + // The token most likely expired, so we need to request a new one and try again. + if _, err := c.requestOAuthToken(req.Context(), basicAuthToken); err != nil { + return nil, err + } + return c.Do(req, v) + } + defer resp.Body.Close() + + // If not yet configured, try to configure the rate limiter + // using the response headers we just received. Fail silently + // so the limiter will remain disabled in case of an error. + c.configureLimiterOnce.Do(func() { c.configureLimiter(req.Context(), resp.Header) }) + + response := newResponse(resp) + + err = CheckResponse(resp) + if err != nil { + // Even though there was an error, we still return the response + // in case the caller wants to inspect it further. + return response, err + } + + if v != nil { + if w, ok := v.(io.Writer); ok { + _, err = io.Copy(w, resp.Body) + } else { + err = json.NewDecoder(resp.Body).Decode(v) + } + } + + return response, err +} + +func (c *Client) requestOAuthToken(ctx context.Context, token string) (string, error) { + c.tokenLock.Lock() + defer c.tokenLock.Unlock() + + // Return early if the token was updated while waiting for the lock. + if c.token != token { + return c.token, nil + } + + config := &oauth2.Config{ + Endpoint: oauth2.Endpoint{ + AuthURL: strings.TrimSuffix(c.baseURL.String(), apiVersionPath) + "oauth/authorize", + TokenURL: strings.TrimSuffix(c.baseURL.String(), apiVersionPath) + "oauth/token", + }, + } + + ctx = context.WithValue(ctx, oauth2.HTTPClient, c.client.HTTPClient) + t, err := config.PasswordCredentialsToken(ctx, c.username, c.password) + if err != nil { + return "", err + } + c.token = t.AccessToken + + return c.token, nil +} + +// Helper function to accept and format both the project ID or name as project +// identifier for all API calls. +func parseID(id interface{}) (string, error) { + switch v := id.(type) { + case int: + return strconv.Itoa(v), nil + case string: + return v, nil + default: + return "", fmt.Errorf("invalid ID type %#v, the ID must be an int or a string", id) + } +} + +// Helper function to escape a project identifier. +func PathEscape(s string) string { + return strings.ReplaceAll(url.PathEscape(s), ".", "%2E") +} + +// An ErrorResponse reports one or more errors caused by an API request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/index.html#data-validation-and-error-reporting +type ErrorResponse struct { + Body []byte + Response *http.Response + Message string +} + +func (e *ErrorResponse) Error() string { + path, _ := url.QueryUnescape(e.Response.Request.URL.Path) + u := fmt.Sprintf("%s://%s%s", e.Response.Request.URL.Scheme, e.Response.Request.URL.Host, path) + return fmt.Sprintf("%s %s: %d %s", e.Response.Request.Method, u, e.Response.StatusCode, e.Message) +} + +// CheckResponse checks the API response for errors, and returns them if present. +func CheckResponse(r *http.Response) error { + switch r.StatusCode { + case 200, 201, 202, 204, 304: + return nil + } + + errorResponse := &ErrorResponse{Response: r} + data, err := io.ReadAll(r.Body) + if err == nil && data != nil { + errorResponse.Body = data + + var raw interface{} + if err := json.Unmarshal(data, &raw); err != nil { + errorResponse.Message = fmt.Sprintf("failed to parse unknown error format: %s", data) + } else { + errorResponse.Message = parseError(raw) + } + } + + return errorResponse +} + +// Format: +// +// { +// "message": { +// "": [ +// "", +// "", +// ... +// ], +// "": { +// "": [ +// "", +// "", +// ... +// ], +// } +// }, +// "error": "" +// } +func parseError(raw interface{}) string { + switch raw := raw.(type) { + case string: + return raw + + case []interface{}: + var errs []string + for _, v := range raw { + errs = append(errs, parseError(v)) + } + return fmt.Sprintf("[%s]", strings.Join(errs, ", ")) + + case map[string]interface{}: + var errs []string + for k, v := range raw { + errs = append(errs, fmt.Sprintf("{%s: %s}", k, parseError(v))) + } + sort.Strings(errs) + return strings.Join(errs, ", ") + + default: + return fmt.Sprintf("failed to parse unexpected error type: %T", raw) + } +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_access_tokens.go b/vendor/github.com/xanzy/go-gitlab/group_access_tokens.go new file mode 100644 index 0000000000..94c53fd716 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_access_tokens.go @@ -0,0 +1,165 @@ +// +// Copyright 2022, Masahiro Yoshida +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// GroupAccessTokensService handles communication with the +// groups access tokens related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_access_tokens.html +type GroupAccessTokensService struct { + client *Client +} + +// GroupAccessToken represents a GitLab group access token. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_access_tokens.html +type GroupAccessToken struct { + ID int `json:"id"` + UserID int `json:"user_id"` + Name string `json:"name"` + Scopes []string `json:"scopes"` + CreatedAt *time.Time `json:"created_at"` + ExpiresAt *ISOTime `json:"expires_at"` + LastUsedAt *time.Time `json:"last_used_at"` + Active bool `json:"active"` + Revoked bool `json:"revoked"` + Token string `json:"token"` + AccessLevel AccessLevelValue `json:"access_level"` +} + +func (v GroupAccessToken) String() string { + return Stringify(v) +} + +// ListGroupAccessTokensOptions represents the available options for +// listing variables in a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_access_tokens.html#list-group-access-tokens +type ListGroupAccessTokensOptions ListOptions + +// ListGroupAccessTokens gets a list of all group access tokens in a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_access_tokens.html#list-group-access-tokens +func (s *GroupAccessTokensService) ListGroupAccessTokens(gid interface{}, opt *ListGroupAccessTokensOptions, options ...RequestOptionFunc) ([]*GroupAccessToken, *Response, error) { + groups, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/access_tokens", PathEscape(groups)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gats []*GroupAccessToken + resp, err := s.client.Do(req, &gats) + if err != nil { + return nil, resp, err + } + + return gats, resp, err +} + +// GetGroupAccessToken gets a single group access tokens in a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_access_tokens.html#get-a-group-access-token +func (s *GroupAccessTokensService) GetGroupAccessToken(gid interface{}, id int, options ...RequestOptionFunc) (*GroupAccessToken, *Response, error) { + groups, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/access_tokens/%d", PathEscape(groups), id) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gat := new(GroupAccessToken) + resp, err := s.client.Do(req, &gat) + if err != nil { + return nil, resp, err + } + + return gat, resp, err +} + +// CreateGroupAccessTokenOptions represents the available CreateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_access_tokens.html#create-a-group-access-token +type CreateGroupAccessTokenOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Scopes *[]string `url:"scopes,omitempty" json:"scopes,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// CreateGroupAccessToken creates a new group access token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_access_tokens.html#create-a-group-access-token +func (s *GroupAccessTokensService) CreateGroupAccessToken(gid interface{}, opt *CreateGroupAccessTokenOptions, options ...RequestOptionFunc) (*GroupAccessToken, *Response, error) { + groups, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/access_tokens", PathEscape(groups)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pat := new(GroupAccessToken) + resp, err := s.client.Do(req, pat) + if err != nil { + return nil, resp, err + } + + return pat, resp, err +} + +// RevokeGroupAccessToken revokes a group access token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_access_tokens.html#revoke-a-group-access-token +func (s *GroupAccessTokensService) RevokeGroupAccessToken(gid interface{}, id int, options ...RequestOptionFunc) (*Response, error) { + groups, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/access_tokens/%d", PathEscape(groups), id) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_badges.go b/vendor/github.com/xanzy/go-gitlab/group_badges.go new file mode 100644 index 0000000000..7207fe71c8 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_badges.go @@ -0,0 +1,230 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// GroupBadgesService handles communication with the group badges +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html +type GroupBadgesService struct { + client *Client +} + +// BadgeKind represents a GitLab Badge Kind +type BadgeKind string + +// all possible values Badge Kind +const ( + ProjectBadgeKind BadgeKind = "project" + GroupBadgeKind BadgeKind = "group" +) + +// GroupBadge represents a group badge. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html +type GroupBadge struct { + ID int `json:"id"` + LinkURL string `json:"link_url"` + ImageURL string `json:"image_url"` + RenderedLinkURL string `json:"rendered_link_url"` + RenderedImageURL string `json:"rendered_image_url"` + Kind BadgeKind `json:"kind"` +} + +// ListGroupBadgesOptions represents the available ListGroupBadges() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#list-all-badges-of-a-group +type ListGroupBadgesOptions ListOptions + +// ListGroupBadges gets a list of a group badges. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#list-all-badges-of-a-group +func (s *GroupBadgesService) ListGroupBadges(gid interface{}, opt *ListGroupBadgesOptions, options ...RequestOptionFunc) ([]*GroupBadge, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/badges", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gb []*GroupBadge + resp, err := s.client.Do(req, &gb) + if err != nil { + return nil, resp, err + } + + return gb, resp, err +} + +// GetGroupBadge gets a group badge. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#get-a-badge-of-a-group +func (s *GroupBadgesService) GetGroupBadge(gid interface{}, badge int, options ...RequestOptionFunc) (*GroupBadge, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/badges/%d", PathEscape(group), badge) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gb := new(GroupBadge) + resp, err := s.client.Do(req, gb) + if err != nil { + return nil, resp, err + } + + return gb, resp, err +} + +// AddGroupBadgeOptions represents the available AddGroupBadge() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#add-a-badge-to-a-group +type AddGroupBadgeOptions struct { + LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"` + ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"` +} + +// AddGroupBadge adds a badge to a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#add-a-badge-to-a-group +func (s *GroupBadgesService) AddGroupBadge(gid interface{}, opt *AddGroupBadgeOptions, options ...RequestOptionFunc) (*GroupBadge, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/badges", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gb := new(GroupBadge) + resp, err := s.client.Do(req, gb) + if err != nil { + return nil, resp, err + } + + return gb, resp, err +} + +// EditGroupBadgeOptions represents the available EditGroupBadge() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#edit-a-badge-of-a-group +type EditGroupBadgeOptions struct { + LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"` + ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"` +} + +// EditGroupBadge updates a badge of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#edit-a-badge-of-a-group +func (s *GroupBadgesService) EditGroupBadge(gid interface{}, badge int, opt *EditGroupBadgeOptions, options ...RequestOptionFunc) (*GroupBadge, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/badges/%d", PathEscape(group), badge) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + gb := new(GroupBadge) + resp, err := s.client.Do(req, gb) + if err != nil { + return nil, resp, err + } + + return gb, resp, err +} + +// DeleteGroupBadge removes a badge from a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#remove-a-badge-from-a-group +func (s *GroupBadgesService) DeleteGroupBadge(gid interface{}, badge int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/badges/%d", PathEscape(group), badge) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// GroupBadgePreviewOptions represents the available PreviewGroupBadge() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#preview-a-badge-from-a-group +type GroupBadgePreviewOptions struct { + LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"` + ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"` +} + +// PreviewGroupBadge returns how the link_url and image_url final URLs would be after +// resolving the placeholder interpolation. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_badges.html#preview-a-badge-from-a-group +func (s *GroupBadgesService) PreviewGroupBadge(gid interface{}, opt *GroupBadgePreviewOptions, options ...RequestOptionFunc) (*GroupBadge, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/badges/render", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + gb := new(GroupBadge) + resp, err := s.client.Do(req, &gb) + if err != nil { + return nil, resp, err + } + + return gb, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_boards.go b/vendor/github.com/xanzy/go-gitlab/group_boards.go new file mode 100644 index 0000000000..b751086300 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_boards.go @@ -0,0 +1,352 @@ +// +// Copyright 2021, Patrick Webster +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// GroupIssueBoardsService handles communication with the group issue board +// related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html +type GroupIssueBoardsService struct { + client *Client +} + +// GroupIssueBoard represents a GitLab group issue board. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html +type GroupIssueBoard struct { + ID int `json:"id"` + Name string `json:"name"` + Group *Group `json:"group"` + Milestone *Milestone `json:"milestone"` + Lists []*BoardList `json:"lists"` +} + +func (b GroupIssueBoard) String() string { + return Stringify(b) +} + +// ListGroupIssueBoardsOptions represents the available +// ListGroupIssueBoards() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#list-all-group-issue-boards-in-a-group +type ListGroupIssueBoardsOptions ListOptions + +// ListGroupIssueBoards gets a list of all issue boards in a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#list-all-group-issue-boards-in-a-group +func (s *GroupIssueBoardsService) ListGroupIssueBoards(gid interface{}, opt *ListGroupIssueBoardsOptions, options ...RequestOptionFunc) ([]*GroupIssueBoard, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gs []*GroupIssueBoard + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// CreateGroupIssueBoardOptions represents the available +// CreateGroupIssueBoard() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#create-a-group-issue-board +type CreateGroupIssueBoardOptions struct { + Name *string `url:"name" json:"name"` +} + +// CreateGroupIssueBoard creates a new issue board. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#create-a-group-issue-board +func (s *GroupIssueBoardsService) CreateGroupIssueBoard(gid interface{}, opt *CreateGroupIssueBoardOptions, options ...RequestOptionFunc) (*GroupIssueBoard, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gib := new(GroupIssueBoard) + resp, err := s.client.Do(req, gib) + if err != nil { + return nil, resp, err + } + + return gib, resp, err +} + +// GetGroupIssueBoard gets a single issue board of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#single-group-issue-board +func (s *GroupIssueBoardsService) GetGroupIssueBoard(gid interface{}, board int, options ...RequestOptionFunc) (*GroupIssueBoard, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d", PathEscape(group), board) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gib := new(GroupIssueBoard) + resp, err := s.client.Do(req, gib) + if err != nil { + return nil, resp, err + } + + return gib, resp, err +} + +// UpdateGroupIssueBoardOptions represents a group issue board. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#update-a-group-issue-board +type UpdateGroupIssueBoardOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + MilestoneID *int `url:"milestone_id,omitempty" json:"milestone_id,omitempty"` + Labels *Labels `url:"labels,omitempty" json:"labels,omitempty"` + Weight *int `url:"weight,omitempty" json:"weight,omitempty"` +} + +// UpdateIssueBoard updates a single issue board of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#update-a-group-issue-board +func (s *GroupIssueBoardsService) UpdateIssueBoard(gid interface{}, board int, opt *UpdateGroupIssueBoardOptions, options ...RequestOptionFunc) (*GroupIssueBoard, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d", PathEscape(group), board) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + gib := new(GroupIssueBoard) + resp, err := s.client.Do(req, gib) + if err != nil { + return nil, resp, err + } + + return gib, resp, err +} + +// DeleteIssueBoard delete a single issue board of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#delete-a-group-issue-board +func (s *GroupIssueBoardsService) DeleteIssueBoard(gid interface{}, board int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d", PathEscape(group), board) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListGroupIssueBoardListsOptions represents the available +// ListGroupIssueBoardLists() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#list-group-issue-board-lists +type ListGroupIssueBoardListsOptions ListOptions + +// ListGroupIssueBoardLists gets a list of the issue board's lists. Does not include +// backlog and closed lists. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_boards.html#list-group-issue-board-lists +func (s *GroupIssueBoardsService) ListGroupIssueBoardLists(gid interface{}, board int, opt *ListGroupIssueBoardListsOptions, options ...RequestOptionFunc) ([]*BoardList, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d/lists", PathEscape(group), board) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gbl []*BoardList + resp, err := s.client.Do(req, &gbl) + if err != nil { + return nil, resp, err + } + + return gbl, resp, err +} + +// GetGroupIssueBoardList gets a single issue board list. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#single-group-issue-board-list +func (s *GroupIssueBoardsService) GetGroupIssueBoardList(gid interface{}, board, list int, options ...RequestOptionFunc) (*BoardList, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d/lists/%d", + PathEscape(group), + board, + list, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gbl := new(BoardList) + resp, err := s.client.Do(req, gbl) + if err != nil { + return nil, resp, err + } + + return gbl, resp, err +} + +// CreateGroupIssueBoardListOptions represents the available +// CreateGroupIssueBoardList() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#new-group-issue-board-list +type CreateGroupIssueBoardListOptions struct { + LabelID *int `url:"label_id" json:"label_id"` +} + +// CreateGroupIssueBoardList creates a new issue board list. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#new-group-issue-board-list +func (s *GroupIssueBoardsService) CreateGroupIssueBoardList(gid interface{}, board int, opt *CreateGroupIssueBoardListOptions, options ...RequestOptionFunc) (*BoardList, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d/lists", PathEscape(group), board) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gbl := new(BoardList) + resp, err := s.client.Do(req, gbl) + if err != nil { + return nil, resp, err + } + + return gbl, resp, err +} + +// UpdateGroupIssueBoardListOptions represents the available +// UpdateGroupIssueBoardList() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#edit-group-issue-board-list +type UpdateGroupIssueBoardListOptions struct { + Position *int `url:"position" json:"position"` +} + +// UpdateIssueBoardList updates the position of an existing +// group issue board list. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#edit-group-issue-board-list +func (s *GroupIssueBoardsService) UpdateIssueBoardList(gid interface{}, board, list int, opt *UpdateGroupIssueBoardListOptions, options ...RequestOptionFunc) ([]*BoardList, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d/lists/%d", + PathEscape(group), + board, + list, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gbl []*BoardList + resp, err := s.client.Do(req, &gbl) + if err != nil { + return nil, resp, err + } + + return gbl, resp, err +} + +// DeleteGroupIssueBoardList soft deletes a group issue board list. +// Only for admins and group owners. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_boards.html#delete-a-group-issue-board-list +func (s *GroupIssueBoardsService) DeleteGroupIssueBoardList(gid interface{}, board, list int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/boards/%d/lists/%d", + PathEscape(group), + board, + list, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_clusters.go b/vendor/github.com/xanzy/go-gitlab/group_clusters.go new file mode 100644 index 0000000000..f2b9e2ac57 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_clusters.go @@ -0,0 +1,217 @@ +// +// Copyright 2021, Paul Shoemaker +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// GroupClustersService handles communication with the +// group clusters related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html +type GroupClustersService struct { + client *Client +} + +// GroupCluster represents a GitLab Group Cluster. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_clusters.html +type GroupCluster struct { + ID int `json:"id"` + Name string `json:"name"` + Domain string `json:"domain"` + CreatedAt *time.Time `json:"created_at"` + Managed bool `json:"managed"` + Enabled bool `json:"enabled"` + ProviderType string `json:"provider_type"` + PlatformType string `json:"platform_type"` + EnvironmentScope string `json:"environment_scope"` + ClusterType string `json:"cluster_type"` + User *User `json:"user"` + PlatformKubernetes *PlatformKubernetes `json:"platform_kubernetes"` + ManagementProject *ManagementProject `json:"management_project"` + Group *Group `json:"group"` +} + +func (v GroupCluster) String() string { + return Stringify(v) +} + +// ListClusters gets a list of all clusters in a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html#list-group-clusters +func (s *GroupClustersService) ListClusters(pid interface{}, options ...RequestOptionFunc) ([]*GroupCluster, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/clusters", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var pcs []*GroupCluster + resp, err := s.client.Do(req, &pcs) + if err != nil { + return nil, resp, err + } + + return pcs, resp, err +} + +// GetCluster gets a cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html#get-a-single-group-cluster +func (s *GroupClustersService) GetCluster(pid interface{}, cluster int, options ...RequestOptionFunc) (*GroupCluster, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/clusters/%d", PathEscape(group), cluster) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gc := new(GroupCluster) + resp, err := s.client.Do(req, &gc) + if err != nil { + return nil, resp, err + } + + return gc, resp, err +} + +// AddGroupClusterOptions represents the available AddCluster() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html#add-existing-cluster-to-group +type AddGroupClusterOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Domain *string `url:"domain,omitempty" json:"domain,omitempty"` + ManagementProjectID *string `url:"management_project_id,omitempty" json:"management_project_id,omitempty"` + Enabled *bool `url:"enabled,omitempty" json:"enabled,omitempty"` + Managed *bool `url:"managed,omitempty" json:"managed,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` + PlatformKubernetes *AddGroupPlatformKubernetesOptions `url:"platform_kubernetes_attributes,omitempty" json:"platform_kubernetes_attributes,omitempty"` +} + +// AddGroupPlatformKubernetesOptions represents the available PlatformKubernetes options for adding. +type AddGroupPlatformKubernetesOptions struct { + APIURL *string `url:"api_url,omitempty" json:"api_url,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` + CaCert *string `url:"ca_cert,omitempty" json:"ca_cert,omitempty"` + Namespace *string `url:"namespace,omitempty" json:"namespace,omitempty"` + AuthorizationType *string `url:"authorization_type,omitempty" json:"authorization_type,omitempty"` +} + +// AddCluster adds an existing cluster to the group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html#add-existing-cluster-to-group +func (s *GroupClustersService) AddCluster(pid interface{}, opt *AddGroupClusterOptions, options ...RequestOptionFunc) (*GroupCluster, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/clusters/user", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gc := new(GroupCluster) + resp, err := s.client.Do(req, gc) + if err != nil { + return nil, resp, err + } + + return gc, resp, err +} + +// EditGroupClusterOptions represents the available EditCluster() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html#edit-group-cluster +type EditGroupClusterOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Domain *string `url:"domain,omitempty" json:"domain,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` + PlatformKubernetes *EditGroupPlatformKubernetesOptions `url:"platform_kubernetes_attributes,omitempty" json:"platform_kubernetes_attributes,omitempty"` + ManagementProjectID *string `url:"management_project_id,omitempty" json:"management_project_id,omitempty"` +} + +// EditGroupPlatformKubernetesOptions represents the available PlatformKubernetes options for editing. +type EditGroupPlatformKubernetesOptions struct { + APIURL *string `url:"api_url,omitempty" json:"api_url,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` + CaCert *string `url:"ca_cert,omitempty" json:"ca_cert,omitempty"` +} + +// EditCluster updates an existing group cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html#edit-group-cluster +func (s *GroupClustersService) EditCluster(pid interface{}, cluster int, opt *EditGroupClusterOptions, options ...RequestOptionFunc) (*GroupCluster, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/clusters/%d", PathEscape(group), cluster) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + gc := new(GroupCluster) + resp, err := s.client.Do(req, gc) + if err != nil { + return nil, resp, err + } + + return gc, resp, err +} + +// DeleteCluster deletes an existing group cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_clusters.html#delete-group-cluster +func (s *GroupClustersService) DeleteCluster(pid interface{}, cluster int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/clusters/%d", PathEscape(group), cluster) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_hooks.go b/vendor/github.com/xanzy/go-gitlab/group_hooks.go new file mode 100644 index 0000000000..a408948308 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_hooks.go @@ -0,0 +1,218 @@ +// +// Copyright 2021, Eric Stevens +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// GroupHook represents a GitLab group hook. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#list-group-hooks +type GroupHook struct { + ID int `json:"id"` + URL string `json:"url"` + GroupID int `json:"group_id"` + PushEvents bool `json:"push_events"` + PushEventsBranchFilter string `json:"push_events_branch_filter"` + IssuesEvents bool `json:"issues_events"` + ConfidentialIssuesEvents bool `json:"confidential_issues_events"` + ConfidentialNoteEvents bool `json:"confidential_note_events"` + MergeRequestsEvents bool `json:"merge_requests_events"` + TagPushEvents bool `json:"tag_push_events"` + NoteEvents bool `json:"note_events"` + JobEvents bool `json:"job_events"` + PipelineEvents bool `json:"pipeline_events"` + WikiPageEvents bool `json:"wiki_page_events"` + DeploymentEvents bool `json:"deployment_events"` + ReleasesEvents bool `json:"releases_events"` + SubGroupEvents bool `json:"subgroup_events"` + EnableSSLVerification bool `json:"enable_ssl_verification"` + AlertStatus string `json:"alert_status"` + CreatedAt *time.Time `json:"created_at"` +} + +// ListGroupHooksOptions represents the available ListGroupHooks() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#list-group-hooks +type ListGroupHooksOptions ListOptions + +// ListGroupHooks gets a list of group hooks. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#list-group-hooks +func (s *GroupsService) ListGroupHooks(gid interface{}, opt *ListGroupHooksOptions, options ...RequestOptionFunc) ([]*GroupHook, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/hooks", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + var gh []*GroupHook + resp, err := s.client.Do(req, &gh) + if err != nil { + return nil, resp, err + } + + return gh, resp, err +} + +// GetGroupHook gets a specific hook for a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#get-group-hook +func (s *GroupsService) GetGroupHook(pid interface{}, hook int, options ...RequestOptionFunc) (*GroupHook, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/hooks/%d", PathEscape(group), hook) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gh := new(GroupHook) + resp, err := s.client.Do(req, gh) + if err != nil { + return nil, resp, err + } + + return gh, resp, err +} + +// AddGroupHookOptions represents the available AddGroupHook() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#add-group-hook +type AddGroupHookOptions struct { + URL *string `url:"url,omitempty" json:"url,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + PushEventsBranchFilter *string `url:"push_events_branch_filter,omitempty" json:"push_events_branch_filter,omitempty"` + IssuesEvents *bool `url:"issues_events,omitempty" json:"issues_events,omitempty"` + ConfidentialIssuesEvents *bool `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"` + ConfidentialNoteEvents *bool `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + NoteEvents *bool `url:"note_events,omitempty" json:"note_events,omitempty"` + JobEvents *bool `url:"job_events,omitempty" json:"job_events,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` + WikiPageEvents *bool `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"` + DeploymentEvents *bool `url:"deployment_events,omitempty" json:"deployment_events,omitempty"` + ReleasesEvents *bool `url:"releases_events,omitempty" json:"releases_events,omitempty"` + SubGroupEvents *bool `url:"subgroup_events,omitempty" json:"subgroup_events,omitempty"` + EnableSSLVerification *bool `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` +} + +// AddGroupHook create a new group scoped webhook. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#add-group-hook +func (s *GroupsService) AddGroupHook(gid interface{}, opt *AddGroupHookOptions, options ...RequestOptionFunc) (*GroupHook, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/hooks", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gh := new(GroupHook) + resp, err := s.client.Do(req, gh) + if err != nil { + return nil, resp, err + } + + return gh, resp, err +} + +// EditGroupHookOptions represents the available EditGroupHook() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#edit-group-hook +type EditGroupHookOptions struct { + URL *string `url:"url,omitempty" json:"url,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + PushEventsBranchFilter *string `url:"push_events_branch_filter,omitempty" json:"push_events_branch_filter,omitempty"` + IssuesEvents *bool `url:"issues_events,omitempty" json:"issues_events,omitempty"` + ConfidentialIssuesEvents *bool `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"` + ConfidentialNoteEvents *bool `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + NoteEvents *bool `url:"note_events,omitempty" json:"note_events,omitempty"` + JobEvents *bool `url:"job_events,omitempty" json:"job_events,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` + WikiPageEvents *bool `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"` + DeploymentEvents *bool `url:"deployment_events,omitempty" json:"deployment_events,omitempty"` + ReleasesEvents *bool `url:"releases_events,omitempty" json:"releases_events,omitempty"` + SubGroupEvents *bool `url:"subgroup_events,omitempty" json:"subgroup_events,omitempty"` + EnableSSLVerification *bool `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` +} + +// EditGroupHook edits a hook for a specified group. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/groups.html#edit-group-hook +func (s *GroupsService) EditGroupHook(pid interface{}, hook int, opt *EditGroupHookOptions, options ...RequestOptionFunc) (*GroupHook, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/hooks/%d", PathEscape(group), hook) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + gh := new(GroupHook) + resp, err := s.client.Do(req, gh) + if err != nil { + return nil, resp, err + } + + return gh, resp, err +} + +// DeleteGroupHook removes a hook from a group. This is an idempotent +// method and can be called multiple times. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-group-hook +func (s *GroupsService) DeleteGroupHook(pid interface{}, hook int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/hooks/%d", PathEscape(group), hook) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_import_export.go b/vendor/github.com/xanzy/go-gitlab/group_import_export.go new file mode 100644 index 0000000000..b35245ed49 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_import_export.go @@ -0,0 +1,180 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "io" + "mime/multipart" + "net/http" + "os" + "path/filepath" + "strconv" +) + +// GroupImportExportService handles communication with the group import export +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_import_export.html +type GroupImportExportService struct { + client *Client +} + +// ScheduleExport starts a new group export. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_import_export.html#schedule-new-export +func (s *GroupImportExportService) ScheduleExport(gid interface{}, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/export", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ExportDownload downloads the finished export. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_import_export.html#export-download +func (s *GroupImportExportService) ExportDownload(gid interface{}, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/export/download", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + exportDownload := new(bytes.Buffer) + resp, err := s.client.Do(req, exportDownload) + if err != nil { + return nil, resp, err + } + + return bytes.NewReader(exportDownload.Bytes()), resp, err +} + +// GroupImportFileOptions represents the available ImportFile() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_import_export.html#import-a-file +type GroupImportFileOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + File *string `url:"file,omitempty" json:"file,omitempty"` + ParentID *int `url:"parent_id,omitempty" json:"parent_id,omitempty"` +} + +// ImportFile imports a file. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_import_export.html#import-a-file +func (s *GroupImportExportService) ImportFile(opt *GroupImportFileOptions, options ...RequestOptionFunc) (*Response, error) { + // First check if we got all required options. + if opt.Name == nil || *opt.Name == "" { + return nil, fmt.Errorf("Missing required option: Name") + } + if opt.Path == nil || *opt.Path == "" { + return nil, fmt.Errorf("Missing required option: Path") + } + if opt.File == nil || *opt.File == "" { + return nil, fmt.Errorf("Missing required option: File") + } + + f, err := os.Open(*opt.File) + if err != nil { + return nil, err + } + defer f.Close() + + b := &bytes.Buffer{} + w := multipart.NewWriter(b) + + _, filename := filepath.Split(*opt.File) + fw, err := w.CreateFormFile("file", filename) + if err != nil { + return nil, err + } + + _, err = io.Copy(fw, f) + if err != nil { + return nil, err + } + + // Populate the additional fields. + fw, err = w.CreateFormField("name") + if err != nil { + return nil, err + } + + _, err = fw.Write([]byte(*opt.Name)) + if err != nil { + return nil, err + } + + fw, err = w.CreateFormField("path") + if err != nil { + return nil, err + } + + _, err = fw.Write([]byte(*opt.Path)) + if err != nil { + return nil, err + } + + if opt.ParentID != nil { + fw, err = w.CreateFormField("parent_id") + if err != nil { + return nil, err + } + + _, err = fw.Write([]byte(strconv.Itoa(*opt.ParentID))) + if err != nil { + return nil, err + } + } + + if err = w.Close(); err != nil { + return nil, err + } + + req, err := s.client.NewRequest(http.MethodPost, "groups/import", nil, options) + if err != nil { + return nil, err + } + + // Set the buffer as the request body. + if err = req.SetBody(b); err != nil { + return nil, err + } + + // Overwrite the default content type. + req.Header.Set("Content-Type", w.FormDataContentType()) + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_iterations.go b/vendor/github.com/xanzy/go-gitlab/group_iterations.go new file mode 100644 index 0000000000..a642091c27 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_iterations.go @@ -0,0 +1,90 @@ +// +// Copyright 2022, Daniel Steinke +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// IterationsAPI handles communication with the iterations related methods +// of the GitLab API +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_iterations.html +type GroupIterationsService struct { + client *Client +} + +// GroupInteration represents a GitLab iteration. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_iterations.html +type GroupIteration struct { + ID int `json:"id"` + IID int `json:"iid"` + Sequence int `json:"sequence"` + GroupID int `json:"group_id"` + Title string `json:"title"` + Description string `json:"description"` + State int `json:"state"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + DueDate *ISOTime `json:"due_date"` + StartDate *ISOTime `json:"start_date"` + WebURL string `json:"web_url"` +} + +func (i GroupIteration) String() string { + return Stringify(i) +} + +// ListGroupIterationsOptions contains the available ListGroupIterations() +// options +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_iterations.html#list-group-iterations +type ListGroupIterationsOptions struct { + ListOptions + State *string `url:"state,omitempty" json:"state,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + IncludeAncestors *bool `url:"include_ancestors,omitempty" json:"include_ancestors,omitempty"` +} + +// ListGroupIterations returns a list of group iterations. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_iterations.html#list-group-iterations +func (s *GroupIterationsService) ListGroupIterations(gid interface{}, opt *ListGroupIterationsOptions, options ...RequestOptionFunc) ([]*GroupIteration, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/iterations", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gis []*GroupIteration + resp, err := s.client.Do(req, &gis) + if err != nil { + return nil, nil, err + } + + return gis, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_labels.go b/vendor/github.com/xanzy/go-gitlab/group_labels.go new file mode 100644 index 0000000000..d7ccd44306 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_labels.go @@ -0,0 +1,249 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// GroupLabelsService handles communication with the label related methods of the +// GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_labels.html +type GroupLabelsService struct { + client *Client +} + +// GroupLabel represents a GitLab group label. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_labels.html +type GroupLabel Label + +func (l GroupLabel) String() string { + return Stringify(l) +} + +// ListGroupLabelsOptions represents the available ListGroupLabels() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_labels.html#list-group-labels +type ListGroupLabelsOptions struct { + ListOptions + WithCounts *bool `url:"with_counts,omitempty" json:"with_counts,omitempty"` + IncludeAncestorGroups *bool `url:"include_ancestor_groups,omitempty" json:"include_ancestor_groups,omitempty"` + IncludeDescendantGrouops *bool `url:"include_descendant_groups,omitempty" json:"include_descendant_groups,omitempty"` + OnlyGroupLabels *bool `url:"only_group_labels,omitempty" json:"only_group_labels,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` +} + +// ListGroupLabels gets all labels for given group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#list-group-labels +func (s *GroupLabelsService) ListGroupLabels(gid interface{}, opt *ListGroupLabelsOptions, options ...RequestOptionFunc) ([]*GroupLabel, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/labels", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var l []*GroupLabel + resp, err := s.client.Do(req, &l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// GetGroupLabel get a single label for a given group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#get-a-single-group-label +func (s *GroupLabelsService) GetGroupLabel(gid interface{}, labelID interface{}, options ...RequestOptionFunc) (*GroupLabel, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + label, err := parseID(labelID) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/labels/%s", PathEscape(group), PathEscape(label)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var l *GroupLabel + resp, err := s.client.Do(req, &l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// CreateGroupLabelOptions represents the available CreateGroupLabel() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#create-a-new-group-label +type CreateGroupLabelOptions CreateLabelOptions + +// CreateGroupLabel creates a new label for given group with given name and +// color. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#create-a-new-group-label +func (s *GroupLabelsService) CreateGroupLabel(gid interface{}, opt *CreateGroupLabelOptions, options ...RequestOptionFunc) (*GroupLabel, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/labels", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + l := new(GroupLabel) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// DeleteGroupLabelOptions represents the available DeleteGroupLabel() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#delete-a-group-label +type DeleteGroupLabelOptions DeleteLabelOptions + +// DeleteGroupLabel deletes a group label given by its name. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_labels.html#delete-a-group-label +func (s *GroupLabelsService) DeleteGroupLabel(gid interface{}, opt *DeleteGroupLabelOptions, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/labels", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodDelete, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// UpdateGroupLabelOptions represents the available UpdateGroupLabel() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#update-a-group-label +type UpdateGroupLabelOptions UpdateLabelOptions + +// UpdateGroupLabel updates an existing label with new name or now color. At least +// one parameter is required, to update the label. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#update-a-group-label +func (s *GroupLabelsService) UpdateGroupLabel(gid interface{}, opt *UpdateGroupLabelOptions, options ...RequestOptionFunc) (*GroupLabel, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/labels", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + l := new(GroupLabel) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// SubscribeToGroupLabel subscribes the authenticated user to a label to receive +// notifications. If the user is already subscribed to the label, the status +// code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#subscribe-to-a-group-label +func (s *GroupLabelsService) SubscribeToGroupLabel(gid interface{}, labelID interface{}, options ...RequestOptionFunc) (*GroupLabel, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + label, err := parseID(labelID) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/labels/%s/subscribe", PathEscape(group), PathEscape(label)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + l := new(GroupLabel) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// UnsubscribeFromGroupLabel unsubscribes the authenticated user from a label to not +// receive notifications from it. If the user is not subscribed to the label, the +// status code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_labels.html#unsubscribe-from-a-group-label +func (s *GroupLabelsService) UnsubscribeFromGroupLabel(gid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + label, err := parseID(labelID) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/labels/%s/unsubscribe", PathEscape(group), PathEscape(label)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_members.go b/vendor/github.com/xanzy/go-gitlab/group_members.go new file mode 100644 index 0000000000..4a169cdf38 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_members.go @@ -0,0 +1,362 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// GroupMembersService handles communication with the group members +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/members.html +type GroupMembersService struct { + client *Client +} + +// GroupMemberSAMLIdentity represents the SAML Identity link for the group member. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project +// Gitlab MR for API change: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20357 +// Gitlab MR for API Doc change: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25652 +type GroupMemberSAMLIdentity struct { + ExternUID string `json:"extern_uid"` + Provider string `json:"provider"` + SAMLProviderID int `json:"saml_provider_id"` +} + +// GroupMember represents a GitLab group member. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/members.html +type GroupMember struct { + ID int `json:"id"` + Username string `json:"username"` + Name string `json:"name"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + CreatedAt *time.Time `json:"created_at"` + ExpiresAt *ISOTime `json:"expires_at"` + AccessLevel AccessLevelValue `json:"access_level"` + Email string `json:"email,omitempty"` + GroupSAMLIdentity *GroupMemberSAMLIdentity `json:"group_saml_identity"` +} + +// ListGroupMembersOptions represents the available ListGroupMembers() and +// ListAllGroupMembers() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project +type ListGroupMembersOptions struct { + ListOptions + Query *string `url:"query,omitempty" json:"query,omitempty"` + UserIDs *[]int `url:"user_ids[],omitempty" json:"user_ids,omitempty"` +} + +// ListGroupMembers get a list of group members viewable by the authenticated +// user. Inherited members through ancestor groups are not included. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project +func (s *GroupsService) ListGroupMembers(gid interface{}, opt *ListGroupMembersOptions, options ...RequestOptionFunc) ([]*GroupMember, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/members", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gm []*GroupMember + resp, err := s.client.Do(req, &gm) + if err != nil { + return nil, resp, err + } + + return gm, resp, err +} + +// ListAllGroupMembers get a list of group members viewable by the authenticated +// user. Returns a list including inherited members through ancestor groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project-including-inherited-and-invited-members +func (s *GroupsService) ListAllGroupMembers(gid interface{}, opt *ListGroupMembersOptions, options ...RequestOptionFunc) ([]*GroupMember, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/members/all", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gm []*GroupMember + resp, err := s.client.Do(req, &gm) + if err != nil { + return nil, resp, err + } + + return gm, resp, err +} + +// AddGroupMemberOptions represents the available AddGroupMember() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#add-a-member-to-a-group-or-project +type AddGroupMemberOptions struct { + UserID *int `url:"user_id,omitempty" json:"user_id,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + ExpiresAt *string `url:"expires_at,omitempty" json:"expires_at"` +} + +// GetGroupMember gets a member of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#get-a-member-of-a-group-or-project +func (s *GroupMembersService) GetGroupMember(gid interface{}, user int, options ...RequestOptionFunc) (*GroupMember, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/members/%d", PathEscape(group), user) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gm := new(GroupMember) + resp, err := s.client.Do(req, gm) + if err != nil { + return nil, resp, err + } + + return gm, resp, err +} + +// BillableGroupMember represents a GitLab billable group member. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/members.html#list-all-billable-members-of-a-group +type BillableGroupMember struct { + ID int `json:"id"` + Username string `json:"username"` + Name string `json:"name"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + Email string `json:"email"` + LastActivityOn *ISOTime `json:"last_activity_on"` + MembershipType string `json:"membership_type"` + Removable bool `json:"removable"` + CreatedAt *time.Time `json:"created_at"` + IsLastOwner bool `json:"is_last_owner"` + LastLoginAt *time.Time `json:"last_login_at"` +} + +// ListBillableGroupMembersOptions represents the available ListBillableGroupMembers() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-billable-members-of-a-group +type ListBillableGroupMembersOptions struct { + ListOptions + Search *string `url:"search,omitempty" json:"search,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListBillableGroupMembers Gets a list of group members that count as billable. +// The list includes members in the subgroup or subproject. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-billable-members-of-a-group +func (s *GroupsService) ListBillableGroupMembers(gid interface{}, opt *ListBillableGroupMembersOptions, options ...RequestOptionFunc) ([]*BillableGroupMember, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/billable_members", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var bgm []*BillableGroupMember + resp, err := s.client.Do(req, &bgm) + if err != nil { + return nil, resp, err + } + + return bgm, resp, err +} + +// RemoveBillableGroupMember removes a given group members that count as billable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#remove-a-billable-member-from-a-group +func (s *GroupsService) RemoveBillableGroupMember(gid interface{}, user int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/billable_members/%d", PathEscape(group), user) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// AddGroupMember adds a user to the list of group members. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#add-a-member-to-a-group-or-project +func (s *GroupMembersService) AddGroupMember(gid interface{}, opt *AddGroupMemberOptions, options ...RequestOptionFunc) (*GroupMember, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/members", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gm := new(GroupMember) + resp, err := s.client.Do(req, gm) + if err != nil { + return nil, resp, err + } + + return gm, resp, err +} + +// ShareWithGroup shares a group with the group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#share-groups-with-groups +func (s *GroupMembersService) ShareWithGroup(gid interface{}, opt *ShareWithGroupOptions, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/share", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// DeleteShareWithGroup allows to unshare a group from a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-link-sharing-group-with-another-group +func (s *GroupMembersService) DeleteShareWithGroup(gid interface{}, groupID int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/share/%d", PathEscape(group), groupID) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// EditGroupMemberOptions represents the available EditGroupMember() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#edit-a-member-of-a-group-or-project +type EditGroupMemberOptions struct { + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + ExpiresAt *string `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// EditGroupMember updates a member of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#edit-a-member-of-a-group-or-project +func (s *GroupMembersService) EditGroupMember(gid interface{}, user int, opt *EditGroupMemberOptions, options ...RequestOptionFunc) (*GroupMember, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/members/%d", PathEscape(group), user) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + gm := new(GroupMember) + resp, err := s.client.Do(req, gm) + if err != nil { + return nil, resp, err + } + + return gm, resp, err +} + +// RemoveGroupMemberOptions represents the available options to remove a group member. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/members.html#remove-a-member-from-a-group-or-project +type RemoveGroupMemberOptions struct { + SkipSubresources *bool `url:"skip_subresources,omitempty" json:"skip_subresources,omitempty"` + UnassignIssuables *bool `url:"unassign_issuables,omitempty" json:"unassign_issuables,omitempty"` +} + +// RemoveGroupMember removes user from user team. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#remove-a-member-from-a-group-or-project +func (s *GroupMembersService) RemoveGroupMember(gid interface{}, user int, opt *RemoveGroupMemberOptions, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/members/%d", PathEscape(group), user) + + req, err := s.client.NewRequest(http.MethodDelete, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_milestones.go b/vendor/github.com/xanzy/go-gitlab/group_milestones.go new file mode 100644 index 0000000000..0f64fca59f --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_milestones.go @@ -0,0 +1,296 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// GroupMilestonesService handles communication with the milestone related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_milestones.html +type GroupMilestonesService struct { + client *Client +} + +// GroupMilestone represents a GitLab milestone. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_milestones.html +type GroupMilestone struct { + ID int `json:"id"` + IID int `json:"iid"` + GroupID int `json:"group_id"` + Title string `json:"title"` + Description string `json:"description"` + StartDate *ISOTime `json:"start_date"` + DueDate *ISOTime `json:"due_date"` + State string `json:"state"` + UpdatedAt *time.Time `json:"updated_at"` + CreatedAt *time.Time `json:"created_at"` + Expired *bool `json:"expired"` +} + +func (m GroupMilestone) String() string { + return Stringify(m) +} + +// ListGroupMilestonesOptions represents the available +// ListGroupMilestones() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#list-group-milestones +type ListGroupMilestonesOptions struct { + ListOptions + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + State *string `url:"state,omitempty" json:"state,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + IncludeParentMilestones *bool `url:"include_parent_milestones,omitempty" json:"include_parent_milestones,omitempty"` +} + +// ListGroupMilestones returns a list of group milestones. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#list-group-milestones +func (s *GroupMilestonesService) ListGroupMilestones(gid interface{}, opt *ListGroupMilestonesOptions, options ...RequestOptionFunc) ([]*GroupMilestone, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/milestones", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var m []*GroupMilestone + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// GetGroupMilestone gets a single group milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-single-milestone +func (s *GroupMilestonesService) GetGroupMilestone(gid interface{}, milestone int, options ...RequestOptionFunc) (*GroupMilestone, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/milestones/%d", PathEscape(group), milestone) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + m := new(GroupMilestone) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// CreateGroupMilestoneOptions represents the available CreateGroupMilestone() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#create-new-milestone +type CreateGroupMilestoneOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + StartDate *ISOTime `url:"start_date,omitempty" json:"start_date,omitempty"` + DueDate *ISOTime `url:"due_date,omitempty" json:"due_date,omitempty"` +} + +// CreateGroupMilestone creates a new group milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#create-new-milestone +func (s *GroupMilestonesService) CreateGroupMilestone(gid interface{}, opt *CreateGroupMilestoneOptions, options ...RequestOptionFunc) (*GroupMilestone, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/milestones", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(GroupMilestone) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// UpdateGroupMilestoneOptions represents the available UpdateGroupMilestone() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#edit-milestone +type UpdateGroupMilestoneOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + StartDate *ISOTime `url:"start_date,omitempty" json:"start_date,omitempty"` + DueDate *ISOTime `url:"due_date,omitempty" json:"due_date,omitempty"` + StateEvent *string `url:"state_event,omitempty" json:"state_event,omitempty"` +} + +// UpdateGroupMilestone updates an existing group milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#edit-milestone +func (s *GroupMilestonesService) UpdateGroupMilestone(gid interface{}, milestone int, opt *UpdateGroupMilestoneOptions, options ...RequestOptionFunc) (*GroupMilestone, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/milestones/%d", PathEscape(group), milestone) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(GroupMilestone) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// GetGroupMilestoneIssuesOptions represents the available GetGroupMilestoneIssues() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-all-issues-assigned-to-a-single-milestone +type GetGroupMilestoneIssuesOptions ListOptions + +// GetGroupMilestoneIssues gets all issues assigned to a single group milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-all-issues-assigned-to-a-single-milestone +func (s *GroupMilestonesService) GetGroupMilestoneIssues(gid interface{}, milestone int, opt *GetGroupMilestoneIssuesOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/milestones/%d/issues", PathEscape(group), milestone) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var i []*Issue + resp, err := s.client.Do(req, &i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// GetGroupMilestoneMergeRequestsOptions represents the available +// GetGroupMilestoneMergeRequests() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-all-merge-requests-assigned-to-a-single-milestone +type GetGroupMilestoneMergeRequestsOptions ListOptions + +// GetGroupMilestoneMergeRequests gets all merge requests assigned to a +// single group milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-all-merge-requests-assigned-to-a-single-milestone +func (s *GroupMilestonesService) GetGroupMilestoneMergeRequests(gid interface{}, milestone int, opt *GetGroupMilestoneMergeRequestsOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/milestones/%d/merge_requests", PathEscape(group), milestone) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var mr []*MergeRequest + resp, err := s.client.Do(req, &mr) + if err != nil { + return nil, resp, err + } + + return mr, resp, err +} + +// BurndownChartEvent reprensents a burnout chart event +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-all-burndown-chart-events-for-a-single-milestone +type BurndownChartEvent struct { + CreatedAt *time.Time `json:"created_at"` + Weight *int `json:"weight"` + Action *string `json:"action"` +} + +// GetGroupMilestoneBurndownChartEventsOptions represents the available +// GetGroupMilestoneBurndownChartEventsOptions() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-all-burndown-chart-events-for-a-single-milestone +type GetGroupMilestoneBurndownChartEventsOptions ListOptions + +// GetGroupMilestoneBurndownChartEvents gets all merge requests assigned to a +// single group milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_milestones.html#get-all-burndown-chart-events-for-a-single-milestone +func (s *GroupMilestonesService) GetGroupMilestoneBurndownChartEvents(gid interface{}, milestone int, opt *GetGroupMilestoneBurndownChartEventsOptions, options ...RequestOptionFunc) ([]*BurndownChartEvent, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/milestones/%d/burndown_events", PathEscape(group), milestone) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var be []*BurndownChartEvent + resp, err := s.client.Do(req, &be) + if err != nil { + return nil, resp, err + } + + return be, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_variables.go b/vendor/github.com/xanzy/go-gitlab/group_variables.go new file mode 100644 index 0000000000..1d2c69fcdd --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_variables.go @@ -0,0 +1,206 @@ +// +// Copyright 2021, Patrick Webster +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// GroupVariablesService handles communication with the +// group variables related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html +type GroupVariablesService struct { + client *Client +} + +// GroupVariable represents a GitLab group Variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html +type GroupVariable struct { + Key string `json:"key"` + Value string `json:"value"` + VariableType VariableTypeValue `json:"variable_type"` + Protected bool `json:"protected"` + Masked bool `json:"masked"` + Raw bool `json:"raw"` + EnvironmentScope string `json:"environment_scope"` +} + +func (v GroupVariable) String() string { + return Stringify(v) +} + +// ListGroupVariablesOptions represents the available options for listing variables +// for a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#list-group-variables +type ListGroupVariablesOptions ListOptions + +// ListVariables gets a list of all variables for a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#list-group-variables +func (s *GroupVariablesService) ListVariables(gid interface{}, opt *ListGroupVariablesOptions, options ...RequestOptionFunc) ([]*GroupVariable, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/variables", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var vs []*GroupVariable + resp, err := s.client.Do(req, &vs) + if err != nil { + return nil, resp, err + } + + return vs, resp, err +} + +// GetVariable gets a variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#show-variable-details +func (s *GroupVariablesService) GetVariable(gid interface{}, key string, options ...RequestOptionFunc) (*GroupVariable, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/variables/%s", PathEscape(group), url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + v := new(GroupVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// CreateGroupVariableOptions represents the available CreateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#create-variable +type CreateGroupVariableOptions struct { + Key *string `url:"key,omitempty" json:"key,omitempty"` + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"` + Protected *bool `url:"protected,omitempty" json:"protected,omitempty"` + Masked *bool `url:"masked,omitempty" json:"masked,omitempty"` + Raw *bool `url:"raw,omitempty" json:"raw,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` +} + +// CreateVariable creates a new group variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#create-variable +func (s *GroupVariablesService) CreateVariable(gid interface{}, opt *CreateGroupVariableOptions, options ...RequestOptionFunc) (*GroupVariable, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/variables", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + v := new(GroupVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// UpdateGroupVariableOptions represents the available UpdateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#update-variable +type UpdateGroupVariableOptions struct { + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"` + Protected *bool `url:"protected,omitempty" json:"protected,omitempty"` + Masked *bool `url:"masked,omitempty" json:"masked,omitempty"` + Raw *bool `url:"raw,omitempty" json:"raw,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` +} + +// UpdateVariable updates the position of an existing +// group issue board list. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#update-variable +func (s *GroupVariablesService) UpdateVariable(gid interface{}, key string, opt *UpdateGroupVariableOptions, options ...RequestOptionFunc) (*GroupVariable, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/variables/%s", PathEscape(group), url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + v := new(GroupVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// RemoveVariable removes a group's variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_level_variables.html#remove-variable +func (s *GroupVariablesService) RemoveVariable(gid interface{}, key string, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/variables/%s", PathEscape(group), url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/group_wikis.go b/vendor/github.com/xanzy/go-gitlab/group_wikis.go new file mode 100644 index 0000000000..ecf9c272c8 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/group_wikis.go @@ -0,0 +1,204 @@ +// +// Copyright 2021, Markus Lackner +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// GroupWikisService handles communication with the group wikis related methods of +// the Gitlab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_wikis.html +type GroupWikisService struct { + client *Client +} + +// GroupWiki represents a GitLab groups wiki. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/group_wikis.html +type GroupWiki struct { + Content string `json:"content"` + Encoding string `json:"encoding"` + Format WikiFormatValue `json:"format"` + Slug string `json:"slug"` + Title string `json:"title"` +} + +func (w GroupWiki) String() string { + return Stringify(w) +} + +// ListGroupWikisOptions represents the available ListGroupWikis options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#list-wiki-pages +type ListGroupWikisOptions struct { + WithContent *bool `url:"with_content,omitempty" json:"with_content,omitempty"` +} + +// ListGroupWikis lists all pages of the wiki of the given group id. +// When with_content is set, it also returns the content of the pages. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#list-wiki-pages +func (s *GroupWikisService) ListGroupWikis(gid interface{}, opt *ListGroupWikisOptions, options ...RequestOptionFunc) ([]*GroupWiki, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/wikis", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gws []*GroupWiki + resp, err := s.client.Do(req, &gws) + if err != nil { + return nil, resp, err + } + + return gws, resp, err +} + +// GetGroupWikiPageOptions represents options to GetGroupWikiPage +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#get-a-wiki-page +type GetGroupWikiPageOptions struct { + RenderHTML *bool `url:"render_html,omitempty" json:"render_html,omitempty"` + Version *string `url:"version,omitempty" json:"version,omitempty"` +} + +// GetGroupWikiPage gets a wiki page for a given group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#get-a-wiki-page +func (s *GroupWikisService) GetGroupWikiPage(gid interface{}, slug string, opt *GetGroupWikiPageOptions, options ...RequestOptionFunc) (*GroupWiki, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/wikis/%s", PathEscape(group), url.PathEscape(slug)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + gw := new(GroupWiki) + resp, err := s.client.Do(req, gw) + if err != nil { + return nil, resp, err + } + + return gw, resp, err +} + +// CreateGroupWikiPageOptions represents options to CreateGroupWikiPage. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#create-a-new-wiki-page +type CreateGroupWikiPageOptions struct { + Content *string `url:"content,omitempty" json:"content,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Format *WikiFormatValue `url:"format,omitempty" json:"format,omitempty"` +} + +// CreateGroupWikiPage creates a new wiki page for the given group with +// the given title, slug, and content. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#create-a-new-wiki-page +func (s *GroupWikisService) CreateGroupWikiPage(gid interface{}, opt *CreateGroupWikiPageOptions, options ...RequestOptionFunc) (*GroupWiki, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/wikis", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + w := new(GroupWiki) + resp, err := s.client.Do(req, w) + if err != nil { + return nil, resp, err + } + + return w, resp, err +} + +// EditGroupWikiPageOptions represents options to EditGroupWikiPage. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#edit-an-existing-wiki-page +type EditGroupWikiPageOptions struct { + Content *string `url:"content,omitempty" json:"content,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Format *WikiFormatValue `url:"format,omitempty" json:"format,omitempty"` +} + +// EditGroupWikiPage Updates an existing wiki page. At least one parameter is +// required to update the wiki page. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#edit-an-existing-wiki-page +func (s *GroupWikisService) EditGroupWikiPage(gid interface{}, slug string, opt *EditGroupWikiPageOptions, options ...RequestOptionFunc) (*GroupWiki, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/wikis/%s", PathEscape(group), url.PathEscape(slug)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + w := new(GroupWiki) + resp, err := s.client.Do(req, w) + if err != nil { + return nil, resp, err + } + + return w, resp, err +} + +// DeleteGroupWikiPage deletes a wiki page with a given slug. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/group_wikis.html#delete-a-wiki-page +func (s *GroupWikisService) DeleteGroupWikiPage(gid interface{}, slug string, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/wikis/%s", PathEscape(group), url.PathEscape(slug)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/groups.go b/vendor/github.com/xanzy/go-gitlab/groups.go new file mode 100644 index 0000000000..753238773c --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/groups.go @@ -0,0 +1,1113 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + retryablehttp "github.com/hashicorp/go-retryablehttp" +) + +// GroupsService handles communication with the group related methods of +// the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html +type GroupsService struct { + client *Client +} + +// Group represents a GitLab group. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html +type Group struct { + ID int `json:"id"` + Name string `json:"name"` + Path string `json:"path"` + Description string `json:"description"` + MembershipLock bool `json:"membership_lock"` + Visibility VisibilityValue `json:"visibility"` + LFSEnabled bool `json:"lfs_enabled"` + DefaultBranchProtection int `json:"default_branch_protection"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + RequestAccessEnabled bool `json:"request_access_enabled"` + FullName string `json:"full_name"` + FullPath string `json:"full_path"` + FileTemplateProjectID int `json:"file_template_project_id"` + ParentID int `json:"parent_id"` + Projects []*Project `json:"projects"` + Statistics *Statistics `json:"statistics"` + CustomAttributes []*CustomAttribute `json:"custom_attributes"` + ShareWithGroupLock bool `json:"share_with_group_lock"` + RequireTwoFactorAuth bool `json:"require_two_factor_authentication"` + TwoFactorGracePeriod int `json:"two_factor_grace_period"` + ProjectCreationLevel ProjectCreationLevelValue `json:"project_creation_level"` + AutoDevopsEnabled bool `json:"auto_devops_enabled"` + SubGroupCreationLevel SubGroupCreationLevelValue `json:"subgroup_creation_level"` + EmailsDisabled bool `json:"emails_disabled"` + MentionsDisabled bool `json:"mentions_disabled"` + RunnersToken string `json:"runners_token"` + SharedProjects []*Project `json:"shared_projects"` + SharedRunnersEnabled bool `json:"shared_runners_enabled"` + SharedWithGroups []struct { + GroupID int `json:"group_id"` + GroupName string `json:"group_name"` + GroupFullPath string `json:"group_full_path"` + GroupAccessLevel int `json:"group_access_level"` + ExpiresAt *ISOTime `json:"expires_at"` + } `json:"shared_with_groups"` + LDAPCN string `json:"ldap_cn"` + LDAPAccess AccessLevelValue `json:"ldap_access"` + LDAPGroupLinks []*LDAPGroupLink `json:"ldap_group_links"` + SAMLGroupLinks []*SAMLGroupLink `json:"saml_group_links"` + SharedRunnersMinutesLimit int `json:"shared_runners_minutes_limit"` + ExtraSharedRunnersMinutesLimit int `json:"extra_shared_runners_minutes_limit"` + PreventForkingOutsideGroup bool `json:"prevent_forking_outside_group"` + MarkedForDeletionOn *ISOTime `json:"marked_for_deletion_on"` + CreatedAt *time.Time `json:"created_at"` + IPRestrictionRanges string `json:"ip_restriction_ranges"` +} + +// GroupAvatar represents a GitLab group avatar. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html +type GroupAvatar struct { + Filename string + Image io.Reader +} + +// MarshalJSON implements the json.Marshaler interface. +func (a *GroupAvatar) MarshalJSON() ([]byte, error) { + if a.Filename == "" && a.Image == nil { + return []byte(`""`), nil + } + type alias GroupAvatar + return json.Marshal((*alias)(a)) +} + +// LDAPGroupLink represents a GitLab LDAP group link. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#ldap-group-links +type LDAPGroupLink struct { + CN string `json:"cn"` + Filter string `json:"filter"` + GroupAccess AccessLevelValue `json:"group_access"` + Provider string `json:"provider"` +} + +// SAMLGroupLink represents a GitLab SAML group link. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#saml-group-links +type SAMLGroupLink struct { + Name string `json:"name"` + AccessLevel AccessLevelValue `json:"access_level"` +} + +// ListGroupsOptions represents the available ListGroups() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#list-groups +type ListGroupsOptions struct { + ListOptions + AllAvailable *bool `url:"all_available,omitempty" json:"all_available,omitempty"` + MinAccessLevel *AccessLevelValue `url:"min_access_level,omitempty" json:"min_access_level,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Owned *bool `url:"owned,omitempty" json:"owned,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + SkipGroups *[]int `url:"skip_groups,omitempty" del:"," json:"skip_groups,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Statistics *bool `url:"statistics,omitempty" json:"statistics,omitempty"` + TopLevelOnly *bool `url:"top_level_only,omitempty" json:"top_level_only,omitempty"` + WithCustomAttributes *bool `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"` +} + +// ListGroups gets a list of groups (as user: my groups, as admin: all groups). +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-groups +func (s *GroupsService) ListGroups(opt *ListGroupsOptions, options ...RequestOptionFunc) ([]*Group, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "groups", opt, options) + if err != nil { + return nil, nil, err + } + + var gs []*Group + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// ListSubGroupsOptions represents the available ListSubGroups() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-a-groups-subgroups +type ListSubGroupsOptions ListGroupsOptions + +// ListSubGroups gets a list of subgroups for a given group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-a-groups-subgroups +func (s *GroupsService) ListSubGroups(gid interface{}, opt *ListSubGroupsOptions, options ...RequestOptionFunc) ([]*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/subgroups", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gs []*Group + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// ListDescendantGroupsOptions represents the available ListDescendantGroups() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-a-groups-descendant-groups +type ListDescendantGroupsOptions ListGroupsOptions + +// ListDescendantGroups gets a list of subgroups for a given project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-a-groups-descendant-groups +func (s *GroupsService) ListDescendantGroups(gid interface{}, opt *ListDescendantGroupsOptions, options ...RequestOptionFunc) ([]*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/descendant_groups", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var gs []*Group + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// ListGroupProjectsOptions represents the available ListGroup() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-a-groups-projects +type ListGroupProjectsOptions struct { + ListOptions + Archived *bool `url:"archived,omitempty" json:"archived,omitempty"` + IncludeSubGroups *bool `url:"include_subgroups,omitempty" json:"include_subgroups,omitempty"` + MinAccessLevel *AccessLevelValue `url:"min_access_level,omitempty" json:"min_access_level,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Owned *bool `url:"owned,omitempty" json:"owned,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + Simple *bool `url:"simple,omitempty" json:"simple,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Starred *bool `url:"starred,omitempty" json:"starred,omitempty"` + Topic *string `url:"topic,omitempty" json:"topic,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + WithCustomAttributes *bool `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"` + WithIssuesEnabled *bool `url:"with_issues_enabled,omitempty" json:"with_issues_enabled,omitempty"` + WithMergeRequestsEnabled *bool `url:"with_merge_requests_enabled,omitempty" json:"with_merge_requests_enabled,omitempty"` + WithSecurityReports *bool `url:"with_security_reports,omitempty" json:"with_security_reports,omitempty"` + WithShared *bool `url:"with_shared,omitempty" json:"with_shared,omitempty"` +} + +// ListGroupProjects get a list of group projects +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-a-groups-projects +func (s *GroupsService) ListGroupProjects(gid interface{}, opt *ListGroupProjectsOptions, options ...RequestOptionFunc) ([]*Project, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/projects", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ps []*Project + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// GetGroupOptions represents the available GetGroup() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#details-of-a-group +type GetGroupOptions struct { + ListOptions + WithCustomAttributes *bool `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"` + WithProjects *bool `url:"with_projects,omitempty" json:"with_projects,omitempty"` +} + +// GetGroup gets all details of a group. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#details-of-a-group +func (s *GroupsService) GetGroup(gid interface{}, opt *GetGroupOptions, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// DownloadAvatar downloads a group avatar. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#download-a-group-avatar +func (s *GroupsService) DownloadAvatar(gid interface{}, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/avatar", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + avatar := new(bytes.Buffer) + resp, err := s.client.Do(req, avatar) + if err != nil { + return nil, resp, err + } + + return bytes.NewReader(avatar.Bytes()), resp, err +} + +// CreateGroupOptions represents the available CreateGroup() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#new-group +type CreateGroupOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + Avatar *GroupAvatar `url:"-" json:"-"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + MembershipLock *bool `url:"membership_lock,omitempty" json:"membership_lock,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + ShareWithGroupLock *bool `url:"share_with_group_lock,omitempty" json:"share_with_group_lock,omitempty"` + RequireTwoFactorAuth *bool `url:"require_two_factor_authentication,omitempty" json:"require_two_factor_authentication,omitempty"` + TwoFactorGracePeriod *int `url:"two_factor_grace_period,omitempty" json:"two_factor_grace_period,omitempty"` + ProjectCreationLevel *ProjectCreationLevelValue `url:"project_creation_level,omitempty" json:"project_creation_level,omitempty"` + AutoDevopsEnabled *bool `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"` + SubGroupCreationLevel *SubGroupCreationLevelValue `url:"subgroup_creation_level,omitempty" json:"subgroup_creation_level,omitempty"` + EmailsDisabled *bool `url:"emails_disabled,omitempty" json:"emails_disabled,omitempty"` + MentionsDisabled *bool `url:"mentions_disabled,omitempty" json:"mentions_disabled,omitempty"` + LFSEnabled *bool `url:"lfs_enabled,omitempty" json:"lfs_enabled,omitempty"` + DefaultBranchProtection *int `url:"default_branch_protection,omitempty" json:"default_branch_protection"` + RequestAccessEnabled *bool `url:"request_access_enabled,omitempty" json:"request_access_enabled,omitempty"` + ParentID *int `url:"parent_id,omitempty" json:"parent_id,omitempty"` + SharedRunnersMinutesLimit *int `url:"shared_runners_minutes_limit,omitempty" json:"shared_runners_minutes_limit,omitempty"` + ExtraSharedRunnersMinutesLimit *int `url:"extra_shared_runners_minutes_limit,omitempty" json:"extra_shared_runners_minutes_limit,omitempty"` + IPRestrictionRanges *string `url:"ip_restriction_ranges,omitempty" json:"ip_restriction_ranges,omitempty"` +} + +// CreateGroup creates a new project group. Available only for users who can +// create groups. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#new-group +func (s *GroupsService) CreateGroup(opt *CreateGroupOptions, options ...RequestOptionFunc) (*Group, *Response, error) { + var err error + var req *retryablehttp.Request + + if opt.Avatar == nil { + req, err = s.client.NewRequest(http.MethodPost, "groups", opt, options) + } else { + req, err = s.client.UploadRequest( + http.MethodPost, + "groups", + opt.Avatar.Image, + opt.Avatar.Filename, + UploadAvatar, + opt, + options, + ) + } + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// TransferGroup transfers a project to the Group namespace. Available only +// for admin. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#transfer-project-to-group +func (s *GroupsService) TransferGroup(gid interface{}, pid interface{}, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/projects/%s", PathEscape(group), PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// TransferSubGroupOptions represents the available TransferSubGroup() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#transfer-a-group-to-a-new-parent-group--turn-a-subgroup-to-a-top-level-group +type TransferSubGroupOptions struct { + GroupID *int `url:"group_id,omitempty" json:"group_id,omitempty"` +} + +// TransferSubGroup transfers a group to a new parent group or turn a subgroup +// to a top-level group. Available to administrators and users. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#transfer-a-group-to-a-new-parent-group--turn-a-subgroup-to-a-top-level-group +func (s *GroupsService) TransferSubGroup(gid interface{}, opt *TransferSubGroupOptions, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/transfer", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// UpdateGroupOptions represents the available UpdateGroup() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#update-group +type UpdateGroupOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + Avatar *GroupAvatar `url:"-" json:"avatar,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + MembershipLock *bool `url:"membership_lock,omitempty" json:"membership_lock,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + ShareWithGroupLock *bool `url:"share_with_group_lock,omitempty" json:"share_with_group_lock,omitempty"` + RequireTwoFactorAuth *bool `url:"require_two_factor_authentication,omitempty" json:"require_two_factor_authentication,omitempty"` + TwoFactorGracePeriod *int `url:"two_factor_grace_period,omitempty" json:"two_factor_grace_period,omitempty"` + ProjectCreationLevel *ProjectCreationLevelValue `url:"project_creation_level,omitempty" json:"project_creation_level,omitempty"` + AutoDevopsEnabled *bool `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"` + SubGroupCreationLevel *SubGroupCreationLevelValue `url:"subgroup_creation_level,omitempty" json:"subgroup_creation_level,omitempty"` + EmailsDisabled *bool `url:"emails_disabled,omitempty" json:"emails_disabled,omitempty"` + MentionsDisabled *bool `url:"mentions_disabled,omitempty" json:"mentions_disabled,omitempty"` + LFSEnabled *bool `url:"lfs_enabled,omitempty" json:"lfs_enabled,omitempty"` + RequestAccessEnabled *bool `url:"request_access_enabled,omitempty" json:"request_access_enabled,omitempty"` + DefaultBranchProtection *int `url:"default_branch_protection,omitempty" json:"default_branch_protection,omitempty"` + FileTemplateProjectID *int `url:"file_template_project_id,omitempty" json:"file_template_project_id,omitempty"` + SharedRunnersMinutesLimit *int `url:"shared_runners_minutes_limit,omitempty" json:"shared_runners_minutes_limit,omitempty"` + ExtraSharedRunnersMinutesLimit *int `url:"extra_shared_runners_minutes_limit,omitempty" json:"extra_shared_runners_minutes_limit,omitempty"` + PreventForkingOutsideGroup *bool `url:"prevent_forking_outside_group,omitempty" json:"prevent_forking_outside_group,omitempty"` + SharedRunnersSetting *SharedRunnersSettingValue `url:"shared_runners_setting,omitempty" json:"shared_runners_setting,omitempty"` + PreventSharingGroupsOutsideHierarchy *bool `url:"prevent_sharing_groups_outside_hierarchy,omitempty" json:"prevent_sharing_groups_outside_hierarchy,omitempty"` + IPRestrictionRanges *string `url:"ip_restriction_ranges,omitempty" json:"ip_restriction_ranges,omitempty"` +} + +// UpdateGroup updates an existing group; only available to group owners and +// administrators. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#update-group +func (s *GroupsService) UpdateGroup(gid interface{}, opt *UpdateGroupOptions, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s", PathEscape(group)) + + var req *retryablehttp.Request + + if opt.Avatar == nil || (opt.Avatar.Filename == "" && opt.Avatar.Image == nil) { + req, err = s.client.NewRequest(http.MethodPut, u, opt, options) + } else { + req, err = s.client.UploadRequest( + http.MethodPut, + u, + opt.Avatar.Image, + opt.Avatar.Filename, + UploadAvatar, + opt, + options, + ) + } + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// UploadAvatar uploads a group avatar. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#upload-a-group-avatar +func (s *GroupsService) UploadAvatar(gid interface{}, avatar io.Reader, filename string, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s", PathEscape(group)) + + req, err := s.client.UploadRequest( + http.MethodPut, + u, + avatar, + filename, + UploadAvatar, + nil, + options, + ) + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// DeleteGroup removes group with all projects inside. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#remove-group +func (s *GroupsService) DeleteGroup(gid interface{}, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// RestoreGroup restores a previously deleted group +// +// GitLap API docs: +// https://docs.gitlab.com/ee/api/groups.html#restore-group-marked-for-deletion +func (s *GroupsService) RestoreGroup(gid interface{}, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/restore", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, nil +} + +// SearchGroup get all groups that match your string in their name or path. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#search-for-group +func (s *GroupsService) SearchGroup(query string, options ...RequestOptionFunc) ([]*Group, *Response, error) { + var q struct { + Search string `url:"search,omitempty" json:"search,omitempty"` + } + q.Search = query + + req, err := s.client.NewRequest(http.MethodGet, "groups", &q, options) + if err != nil { + return nil, nil, err + } + + var gs []*Group + resp, err := s.client.Do(req, &gs) + if err != nil { + return nil, resp, err + } + + return gs, resp, err +} + +// ListProvisionedUsersOptions represents the available ListProvisionedUsers() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-provisioned-users +type ListProvisionedUsersOptions struct { + ListOptions + Username *string `url:"username,omitempty" json:"username,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + Active *bool `url:"active,omitempty" json:"active,omitempty"` + Blocked *bool `url:"blocked,omitempty" json:"blocked,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` +} + +// ListProvisionedUsers gets a list of users provisioned by the given group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-provisioned-users +func (s *GroupsService) ListProvisionedUsers(gid interface{}, opt *ListProvisionedUsersOptions, options ...RequestOptionFunc) ([]*User, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/provisioned_users", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var us []*User + resp, err := s.client.Do(req, &us) + if err != nil { + return nil, resp, err + } + + return us, resp, err +} + +// ListGroupLDAPLinks lists the group's LDAP links. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-ldap-group-links +func (s *GroupsService) ListGroupLDAPLinks(gid interface{}, options ...RequestOptionFunc) ([]*LDAPGroupLink, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/ldap_group_links", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var gls []*LDAPGroupLink + resp, err := s.client.Do(req, &gls) + if err != nil { + return nil, resp, err + } + + return gls, resp, nil +} + +// AddGroupLDAPLinkOptions represents the available AddGroupLDAPLink() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#add-ldap-group-link-with-cn-or-filter +type AddGroupLDAPLinkOptions struct { + CN *string `url:"cn,omitempty" json:"cn,omitempty"` + Filter *string `url:"filter,omitempty" json:"filter,omitempty"` + GroupAccess *AccessLevelValue `url:"group_access,omitempty" json:"group_access,omitempty"` + Provider *string `url:"provider,omitempty" json:"provider,omitempty"` +} + +// DeleteGroupLDAPLinkWithCNOrFilterOptions represents the available DeleteGroupLDAPLinkWithCNOrFilter() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-ldap-group-link-with-cn-or-filter +type DeleteGroupLDAPLinkWithCNOrFilterOptions struct { + CN *string `url:"cn,omitempty" json:"cn,omitempty"` + Filter *string `url:"filter,omitempty" json:"filter,omitempty"` + Provider *string `url:"provider,omitempty" json:"provider,omitempty"` +} + +// AddGroupLDAPLink creates a new group LDAP link. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#add-ldap-group-link-with-cn-or-filter +func (s *GroupsService) AddGroupLDAPLink(gid interface{}, opt *AddGroupLDAPLinkOptions, options ...RequestOptionFunc) (*LDAPGroupLink, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/ldap_group_links", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gl := new(LDAPGroupLink) + resp, err := s.client.Do(req, gl) + if err != nil { + return nil, resp, err + } + + return gl, resp, err +} + +// DeleteGroupLDAPLink deletes a group LDAP link. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-ldap-group-link +func (s *GroupsService) DeleteGroupLDAPLink(gid interface{}, cn string, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/ldap_group_links/%s", PathEscape(group), PathEscape(cn)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteGroupLDAPLinkWithCNOrFilter deletes a group LDAP link. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-ldap-group-link-with-cn-or-filter +func (s *GroupsService) DeleteGroupLDAPLinkWithCNOrFilter(gid interface{}, opts *DeleteGroupLDAPLinkWithCNOrFilterOptions, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/ldap_group_links", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodDelete, u, opts, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteGroupLDAPLinkForProvider deletes a group LDAP link from a specific +// provider. Available only for users who can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-ldap-group-link +func (s *GroupsService) DeleteGroupLDAPLinkForProvider(gid interface{}, provider, cn string, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf( + "groups/%s/ldap_group_links/%s/%s", + PathEscape(group), + PathEscape(provider), + PathEscape(cn), + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListGroupSAMLLinks lists the group's SAML links. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#list-saml-group-links +func (s *GroupsService) ListGroupSAMLLinks(gid interface{}, options ...RequestOptionFunc) ([]*SAMLGroupLink, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/saml_group_links", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var gl []*SAMLGroupLink + resp, err := s.client.Do(req, &gl) + if err != nil { + return nil, resp, err + } + + return gl, resp, nil +} + +// GetGroupSAMLLink get a specific group SAML link. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#get-saml-group-link +func (s *GroupsService) GetGroupSAMLLink(gid interface{}, samlGroupName string, options ...RequestOptionFunc) (*SAMLGroupLink, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/saml_group_links/%s", PathEscape(group), PathEscape(samlGroupName)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gl := new(SAMLGroupLink) + resp, err := s.client.Do(req, &gl) + if err != nil { + return nil, resp, err + } + + return gl, resp, nil +} + +// AddGroupSAMLLinkOptions represents the available AddGroupSAMLLink() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#add-saml-group-link +type AddGroupSAMLLinkOptions struct { + SAMLGroupName *string `url:"saml_group_name,omitempty" json:"saml_group_name,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` +} + +// AddGroupSAMLLink creates a new group SAML link. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#add-saml-group-link +func (s *GroupsService) AddGroupSAMLLink(gid interface{}, opt *AddGroupSAMLLinkOptions, options ...RequestOptionFunc) (*SAMLGroupLink, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/saml_group_links", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gl := new(SAMLGroupLink) + resp, err := s.client.Do(req, &gl) + if err != nil { + return nil, resp, err + } + + return gl, resp, err +} + +// DeleteGroupSAMLLink deletes a group SAML link. Available only for users who +// can edit groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-saml-group-link +func (s *GroupsService) DeleteGroupSAMLLink(gid interface{}, samlGroupName string, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/saml_group_links/%s", PathEscape(group), PathEscape(samlGroupName)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ShareGroupWithGroupOptions represents the available ShareGroupWithGroup() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#share-groups-with-groups +type ShareGroupWithGroupOptions struct { + GroupID *int `url:"group_id,omitempty" json:"group_id,omitempty"` + GroupAccess *AccessLevelValue `url:"group_access,omitempty" json:"group_access,omitempty"` + ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// ShareGroupWithGroup shares a group with another group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#create-a-link-to-share-a-group-with-another-group +func (s *GroupsService) ShareGroupWithGroup(gid interface{}, opt *ShareGroupWithGroupOptions, options ...RequestOptionFunc) (*Group, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/share", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + g := new(Group) + resp, err := s.client.Do(req, g) + if err != nil { + return nil, resp, err + } + + return g, resp, err +} + +// UnshareGroupFromGroup unshares a group from another group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-link-sharing-group-with-another-group +func (s *GroupsService) UnshareGroupFromGroup(gid interface{}, groupID int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/share/%d", PathEscape(group), groupID) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// GroupPushRules represents a group push rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#get-group-push-rules +type GroupPushRules struct { + ID int `json:"id"` + CreatedAt *time.Time `json:"created_at"` + CommitMessageRegex string `json:"commit_message_regex"` + CommitMessageNegativeRegex string `json:"commit_message_negative_regex"` + BranchNameRegex string `json:"branch_name_regex"` + DenyDeleteTag bool `json:"deny_delete_tag"` + MemberCheck bool `json:"member_check"` + PreventSecrets bool `json:"prevent_secrets"` + AuthorEmailRegex string `json:"author_email_regex"` + FileNameRegex string `json:"file_name_regex"` + MaxFileSize int `json:"max_file_size"` + CommitCommitterCheck bool `json:"commit_committer_check"` + RejectUnsignedCommits bool `json:"reject_unsigned_commits"` +} + +// GetGroupPushRules gets the push rules of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#get-group-push-rules +func (s *GroupsService) GetGroupPushRules(gid interface{}, options ...RequestOptionFunc) (*GroupPushRules, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/push_rule", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + gpr := new(GroupPushRules) + resp, err := s.client.Do(req, gpr) + if err != nil { + return nil, resp, err + } + + return gpr, resp, err +} + +// AddGroupPushRuleOptions represents the available AddGroupPushRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#add-group-push-rule +type AddGroupPushRuleOptions struct { + AuthorEmailRegex *string `url:"author_email_regex,omitempty" json:"author_email_regex,omitempty"` + BranchNameRegex *string `url:"branch_name_regex,omitempty" json:"branch_name_regex,omitempty"` + CommitCommitterCheck *bool `url:"commit_committer_check,omitempty" json:"commit_committer_check,omitempty"` + CommitMessageNegativeRegex *string `url:"commit_message_negative_regex,omitempty" json:"commit_message_negative_regex,omitempty"` + CommitMessageRegex *string `url:"commit_message_regex,omitempty" json:"commit_message_regex,omitempty"` + DenyDeleteTag *bool `url:"deny_delete_tag,omitempty" json:"deny_delete_tag,omitempty"` + FileNameRegex *string `url:"file_name_regex,omitempty" json:"file_name_regex,omitempty"` + MaxFileSize *int `url:"max_file_size,omitempty" json:"max_file_size,omitempty"` + MemberCheck *bool `url:"member_check,omitempty" json:"member_check,omitempty"` + PreventSecrets *bool `url:"prevent_secrets,omitempty" json:"prevent_secrets,omitempty"` + RejectUnsignedCommits *bool `url:"reject_unsigned_commits,omitempty" json:"reject_unsigned_commits,omitempty"` +} + +// AddGroupPushRule adds push rules to the specified group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#add-group-push-rule +func (s *GroupsService) AddGroupPushRule(gid interface{}, opt *AddGroupPushRuleOptions, options ...RequestOptionFunc) (*GroupPushRules, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/push_rule", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + gpr := new(GroupPushRules) + resp, err := s.client.Do(req, gpr) + if err != nil { + return nil, resp, err + } + + return gpr, resp, err +} + +// EditGroupPushRuleOptions represents the available EditGroupPushRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#edit-group-push-rule +type EditGroupPushRuleOptions struct { + AuthorEmailRegex *string `url:"author_email_regex,omitempty" json:"author_email_regex,omitempty"` + BranchNameRegex *string `url:"branch_name_regex,omitempty" json:"branch_name_regex,omitempty"` + CommitCommitterCheck *bool `url:"commit_committer_check,omitempty" json:"commit_committer_check,omitempty"` + CommitMessageNegativeRegex *string `url:"commit_message_negative_regex,omitempty" json:"commit_message_negative_regex,omitempty"` + CommitMessageRegex *string `url:"commit_message_regex,omitempty" json:"commit_message_regex,omitempty"` + DenyDeleteTag *bool `url:"deny_delete_tag,omitempty" json:"deny_delete_tag,omitempty"` + FileNameRegex *string `url:"file_name_regex,omitempty" json:"file_name_regex,omitempty"` + MaxFileSize *int `url:"max_file_size,omitempty" json:"max_file_size,omitempty"` + MemberCheck *bool `url:"member_check,omitempty" json:"member_check,omitempty"` + PreventSecrets *bool `url:"prevent_secrets,omitempty" json:"prevent_secrets,omitempty"` + RejectUnsignedCommits *bool `url:"reject_unsigned_commits,omitempty" json:"reject_unsigned_commits,omitempty"` +} + +// EditGroupPushRule edits a push rule for a specified group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#edit-group-push-rule +func (s *GroupsService) EditGroupPushRule(gid interface{}, opt *EditGroupPushRuleOptions, options ...RequestOptionFunc) (*GroupPushRules, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/push_rule", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + gpr := new(GroupPushRules) + resp, err := s.client.Do(req, gpr) + if err != nil { + return nil, resp, err + } + + return gpr, resp, err +} + +// DeleteGroupPushRule deletes the push rules of a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#delete-group-push-rule +func (s *GroupsService) DeleteGroupPushRule(gid interface{}, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/push_rule", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/instance_clusters.go b/vendor/github.com/xanzy/go-gitlab/instance_clusters.go new file mode 100644 index 0000000000..0014653fe8 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/instance_clusters.go @@ -0,0 +1,153 @@ +// +// Copyright 2021, Serena Fang +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// InstanceClustersService handles communication with the +// instance clusters related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_clusters.html +type InstanceClustersService struct { + client *Client +} + +// InstanceCluster represents a GitLab Instance Cluster. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/instance_clusters.html +type InstanceCluster struct { + ID int `json:"id"` + Name string `json:"name"` + Domain string `json:"domain"` + Managed bool `json:"managed"` + CreatedAt *time.Time `json:"created_at"` + ProviderType string `json:"provider_type"` + PlatformType string `json:"platform_type"` + EnvironmentScope string `json:"environment_scope"` + ClusterType string `json:"cluster_type"` + User *User `json:"user"` + PlatformKubernetes *PlatformKubernetes `json:"platform_kubernetes"` + ManagementProject *ManagementProject `json:"management_project"` +} + +func (v InstanceCluster) String() string { + return Stringify(v) +} + +// ListClusters gets a list of all instance clusters. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_clusters.html#list-instance-clusters +func (s *InstanceClustersService) ListClusters(options ...RequestOptionFunc) ([]*InstanceCluster, *Response, error) { + u := "admin/clusters" + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var ics []*InstanceCluster + resp, err := s.client.Do(req, &ics) + if err != nil { + return nil, resp, err + } + + return ics, resp, err +} + +// GetCluster gets an instance cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_clusters.html#get-a-single-instance-cluster +func (s *InstanceClustersService) GetCluster(cluster int, options ...RequestOptionFunc) (*InstanceCluster, *Response, error) { + u := fmt.Sprintf("admin/clusters/%d", cluster) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ic := new(InstanceCluster) + resp, err := s.client.Do(req, &ic) + if err != nil { + return nil, resp, err + } + + return ic, resp, err +} + +// AddCluster adds an existing cluster to the instance. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_clusters.html#add-existing-instance-cluster +func (s *InstanceClustersService) AddCluster(opt *AddClusterOptions, options ...RequestOptionFunc) (*InstanceCluster, *Response, error) { + u := "admin/clusters/add" + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + ic := new(InstanceCluster) + resp, err := s.client.Do(req, ic) + if err != nil { + return nil, resp, err + } + + return ic, resp, err +} + +// EditCluster updates an existing instance cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_clusters.html#edit-instance-cluster +func (s *InstanceClustersService) EditCluster(cluster int, opt *EditClusterOptions, options ...RequestOptionFunc) (*InstanceCluster, *Response, error) { + u := fmt.Sprintf("admin/clusters/%d", cluster) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ic := new(InstanceCluster) + resp, err := s.client.Do(req, ic) + if err != nil { + return nil, resp, err + } + + return ic, resp, err +} + +// DeleteCluster deletes an existing instance cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_clusters.html#delete-instance-cluster +func (s *InstanceClustersService) DeleteCluster(cluster int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("admin/clusters/%d", cluster) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/instance_variables.go b/vendor/github.com/xanzy/go-gitlab/instance_variables.go new file mode 100644 index 0000000000..79b6304a1f --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/instance_variables.go @@ -0,0 +1,183 @@ +// +// Copyright 2021, Patrick Webster +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// InstanceVariablesService handles communication with the +// instance level CI variables related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html +type InstanceVariablesService struct { + client *Client +} + +// InstanceVariable represents a GitLab instance level CI Variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html +type InstanceVariable struct { + Key string `json:"key"` + Value string `json:"value"` + VariableType VariableTypeValue `json:"variable_type"` + Protected bool `json:"protected"` + Masked bool `json:"masked"` + Raw bool `json:"raw"` +} + +func (v InstanceVariable) String() string { + return Stringify(v) +} + +// ListInstanceVariablesOptions represents the available options for listing variables +// for an instance. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#list-all-instance-variables +type ListInstanceVariablesOptions ListOptions + +// ListVariables gets a list of all variables for an instance. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#list-all-instance-variables +func (s *InstanceVariablesService) ListVariables(opt *ListInstanceVariablesOptions, options ...RequestOptionFunc) ([]*InstanceVariable, *Response, error) { + u := "admin/ci/variables" + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var vs []*InstanceVariable + resp, err := s.client.Do(req, &vs) + if err != nil { + return nil, resp, err + } + + return vs, resp, err +} + +// GetVariable gets a variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#show-instance-variable-details +func (s *InstanceVariablesService) GetVariable(key string, options ...RequestOptionFunc) (*InstanceVariable, *Response, error) { + u := fmt.Sprintf("admin/ci/variables/%s", url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + v := new(InstanceVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// CreateInstanceVariableOptions represents the available CreateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#create-instance-variable +type CreateInstanceVariableOptions struct { + Key *string `url:"key,omitempty" json:"key,omitempty"` + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"` + Protected *bool `url:"protected,omitempty" json:"protected,omitempty"` + Masked *bool `url:"masked,omitempty" json:"masked,omitempty"` + Raw *bool `url:"raw,omitempty" json:"raw,omitempty"` +} + +// CreateVariable creates a new instance level CI variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#create-instance-variable +func (s *InstanceVariablesService) CreateVariable(opt *CreateInstanceVariableOptions, options ...RequestOptionFunc) (*InstanceVariable, *Response, error) { + u := "admin/ci/variables" + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + v := new(InstanceVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// UpdateInstanceVariableOptions represents the available UpdateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#update-instance-variable +type UpdateInstanceVariableOptions struct { + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"` + Protected *bool `url:"protected,omitempty" json:"protected,omitempty"` + Masked *bool `url:"masked,omitempty" json:"masked,omitempty"` + Raw *bool `url:"raw,omitempty" json:"raw,omitempty"` +} + +// UpdateVariable updates the position of an existing +// instance level CI variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#update-instance-variable +func (s *InstanceVariablesService) UpdateVariable(key string, opt *UpdateInstanceVariableOptions, options ...RequestOptionFunc) (*InstanceVariable, *Response, error) { + u := fmt.Sprintf("admin/ci/variables/%s", url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + v := new(InstanceVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// RemoveVariable removes an instance level CI variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/instance_level_ci_variables.html#remove-instance-variable +func (s *InstanceVariablesService) RemoveVariable(key string, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("admin/ci/variables/%s", url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/invites.go b/vendor/github.com/xanzy/go-gitlab/invites.go new file mode 100644 index 0000000000..c261fde64b --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/invites.go @@ -0,0 +1,176 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// InvitesService handles communication with the invitation related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/invitations.html +type InvitesService struct { + client *Client +} + +// PendingInvite represents a pending invite. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/invitations.html +type PendingInvite struct { + ID int `json:"id"` + InviteEmail string `json:"invite_email"` + CreatedAt *time.Time `json:"created_at"` + AccessLevel AccessLevelValue `json:"access_level"` + ExpiresAt *time.Time `json:"expires_at"` + UserName string `json:"user_name"` + CreatedByName string `json:"created_by_name"` +} + +// ListPendingInvitationsOptions represents the available +// ListPendingInvitations() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/invitations.html#list-all-invitations-pending-for-a-group-or-project +type ListPendingInvitationsOptions struct { + ListOptions + Query *string `url:"query,omitempty" json:"query,omitempty"` +} + +// ListPendingGroupInvitations gets a list of invited group members. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/invitations.html#list-all-invitations-pending-for-a-group-or-project +func (s *InvitesService) ListPendingGroupInvitations(gid interface{}, opt *ListPendingInvitationsOptions, options ...RequestOptionFunc) ([]*PendingInvite, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/invitations", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pis []*PendingInvite + resp, err := s.client.Do(req, &pis) + if err != nil { + return nil, resp, err + } + + return pis, resp, err +} + +// ListPendingProjectInvitations gets a list of invited project members. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/invitations.html#list-all-invitations-pending-for-a-group-or-project +func (s *InvitesService) ListPendingProjectInvitations(pid interface{}, opt *ListPendingInvitationsOptions, options ...RequestOptionFunc) ([]*PendingInvite, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/invitations", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pis []*PendingInvite + resp, err := s.client.Do(req, &pis) + if err != nil { + return nil, resp, err + } + + return pis, resp, err +} + +// InvitesOptions represents the available GroupInvites() and ProjectInvites() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/invitations.html#add-a-member-to-a-group-or-project +type InvitesOptions struct { + ID interface{} `url:"id,omitempty" json:"id,omitempty"` + Email *string `url:"email,omitempty" json:"email,omitempty"` + UserID interface{} `url:"user_id,omitempty" json:"user_id,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// InvitesResult represents an invitations result. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/invitations.html#add-a-member-to-a-group-or-project +type InvitesResult struct { + Status string `json:"status"` + Message map[string]string `json:"message,omitempty"` +} + +// GroupInvites invites new users by email to join a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/invitations.html#add-a-member-to-a-group-or-project +func (s *InvitesService) GroupInvites(gid interface{}, opt *InvitesOptions, options ...RequestOptionFunc) (*InvitesResult, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/invitations", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + ir := new(InvitesResult) + resp, err := s.client.Do(req, ir) + if err != nil { + return nil, resp, err + } + + return ir, resp, err +} + +// ProjectInvites invites new users by email to join a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/invitations.html#add-a-member-to-a-group-or-project +func (s *InvitesService) ProjectInvites(pid interface{}, opt *InvitesOptions, options ...RequestOptionFunc) (*InvitesResult, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/invitations", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + ir := new(InvitesResult) + resp, err := s.client.Do(req, ir) + if err != nil { + return nil, resp, err + } + + return ir, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/issue_links.go b/vendor/github.com/xanzy/go-gitlab/issue_links.go new file mode 100644 index 0000000000..d155cc1dcd --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/issue_links.go @@ -0,0 +1,186 @@ +// +// Copyright 2021, Arkbriar +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// IssueLinksService handles communication with the issue relations related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issue_links.html +type IssueLinksService struct { + client *Client +} + +// IssueLink represents a two-way relation between two issues. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issue_links.html +type IssueLink struct { + SourceIssue *Issue `json:"source_issue"` + TargetIssue *Issue `json:"target_issue"` + LinkType string `json:"link_type"` +} + +// IssueRelation gets a relation between two issues. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issue_links.html#list-issue-relations +type IssueRelation struct { + ID int `json:"id"` + IID int `json:"iid"` + State string `json:"state"` + Description string `json:"description"` + Confidential bool `json:"confidential"` + Author *IssueAuthor `json:"author"` + Milestone *Milestone `json:"milestone"` + ProjectID int `json:"project_id"` + Assignees []*IssueAssignee `json:"assignees"` + Assignee *IssueAssignee `json:"assignee"` + UpdatedAt *time.Time `json:"updated_at"` + Title string `json:"title"` + CreatedAt *time.Time `json:"created_at"` + Labels Labels `json:"labels"` + DueDate *ISOTime `json:"due_date"` + WebURL string `json:"web_url"` + References *IssueReferences `json:"references"` + Weight int `json:"weight"` + UserNotesCount int `json:"user_notes_count"` + IssueLinkID int `json:"issue_link_id"` + LinkType string `json:"link_type"` + LinkCreatedAt *time.Time `json:"link_created_at"` + LinkUpdatedAt *time.Time `json:"link_updated_at"` +} + +// ListIssueRelations gets a list of related issues of a given issue, +// sorted by the relationship creation datetime (ascending). +// +// Issues will be filtered according to the user authorizations. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issue_links.html#list-issue-relations +func (s *IssueLinksService) ListIssueRelations(pid interface{}, issue int, options ...RequestOptionFunc) ([]*IssueRelation, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/links", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var is []*IssueRelation + resp, err := s.client.Do(req, &is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} + +// GetIssueLink gets a specific issue link. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issue_links.html#get-an-issue-link +func (s *IssueLinksService) GetIssueLink(pid interface{}, issue, issueLink int, options ...RequestOptionFunc) (*IssueLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/links/%d", PathEscape(project), issue, issueLink) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + il := new(IssueLink) + resp, err := s.client.Do(req, il) + if err != nil { + return nil, resp, err + } + + return il, resp, err +} + +// CreateIssueLinkOptions represents the available CreateIssueLink() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issue_links.html#create-an-issue-link +type CreateIssueLinkOptions struct { + TargetProjectID *string `json:"target_project_id"` + TargetIssueIID *string `json:"target_issue_iid"` + LinkType *string `json:"link_type"` +} + +// CreateIssueLink creates a two-way relation between two issues. +// User must be allowed to update both issues in order to succeed. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issue_links.html#create-an-issue-link +func (s *IssueLinksService) CreateIssueLink(pid interface{}, issue int, opt *CreateIssueLinkOptions, options ...RequestOptionFunc) (*IssueLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/links", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + i := new(IssueLink) + resp, err := s.client.Do(req, &i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// DeleteIssueLink deletes an issue link, thus removes the two-way relationship. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issue_links.html#delete-an-issue-link +func (s *IssueLinksService) DeleteIssueLink(pid interface{}, issue, issueLink int, options ...RequestOptionFunc) (*IssueLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/links/%d", + PathEscape(project), + issue, + issueLink) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, nil, err + } + + il := new(IssueLink) + resp, err := s.client.Do(req, &il) + if err != nil { + return nil, resp, err + } + + return il, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/issues.go b/vendor/github.com/xanzy/go-gitlab/issues.go new file mode 100644 index 0000000000..4d06fd334b --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/issues.go @@ -0,0 +1,786 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "net/url" + "reflect" + "strings" + "time" +) + +// IssuesService handles communication with the issue related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html +type IssuesService struct { + client *Client + timeStats *timeStatsService +} + +// IssueAuthor represents a author of the issue. +type IssueAuthor struct { + ID int `json:"id"` + State string `json:"state"` + WebURL string `json:"web_url"` + Name string `json:"name"` + AvatarURL string `json:"avatar_url"` + Username string `json:"username"` +} + +// IssueAssignee represents a assignee of the issue. +type IssueAssignee struct { + ID int `json:"id"` + State string `json:"state"` + WebURL string `json:"web_url"` + Name string `json:"name"` + AvatarURL string `json:"avatar_url"` + Username string `json:"username"` +} + +// IssueReferences represents references of the issue. +type IssueReferences struct { + Short string `json:"short"` + Relative string `json:"relative"` + Full string `json:"full"` +} + +// IssueCloser represents a closer of the issue. +type IssueCloser struct { + ID int `json:"id"` + State string `json:"state"` + WebURL string `json:"web_url"` + Name string `json:"name"` + AvatarURL string `json:"avatar_url"` + Username string `json:"username"` +} + +// IssueLinks represents links of the issue. +type IssueLinks struct { + Self string `json:"self"` + Notes string `json:"notes"` + AwardEmoji string `json:"award_emoji"` + Project string `json:"project"` +} + +// Issue represents a GitLab issue. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html +type Issue struct { + ID int `json:"id"` + IID int `json:"iid"` + ExternalID string `json:"external_id"` + State string `json:"state"` + Description string `json:"description"` + HealthStatus string `json:"health_status"` + Author *IssueAuthor `json:"author"` + Milestone *Milestone `json:"milestone"` + ProjectID int `json:"project_id"` + Assignees []*IssueAssignee `json:"assignees"` + Assignee *IssueAssignee `json:"assignee"` + UpdatedAt *time.Time `json:"updated_at"` + ClosedAt *time.Time `json:"closed_at"` + ClosedBy *IssueCloser `json:"closed_by"` + Title string `json:"title"` + CreatedAt *time.Time `json:"created_at"` + MovedToID int `json:"moved_to_id"` + Labels Labels `json:"labels"` + LabelDetails []*LabelDetails `json:"label_details"` + Upvotes int `json:"upvotes"` + Downvotes int `json:"downvotes"` + DueDate *ISOTime `json:"due_date"` + WebURL string `json:"web_url"` + References *IssueReferences `json:"references"` + TimeStats *TimeStats `json:"time_stats"` + Confidential bool `json:"confidential"` + Weight int `json:"weight"` + DiscussionLocked bool `json:"discussion_locked"` + IssueType *string `json:"issue_type,omitempty"` + Subscribed bool `json:"subscribed"` + UserNotesCount int `json:"user_notes_count"` + Links *IssueLinks `json:"_links"` + IssueLinkID int `json:"issue_link_id"` + MergeRequestCount int `json:"merge_requests_count"` + EpicIssueID int `json:"epic_issue_id"` + Epic *Epic `json:"epic"` + Iteration *GroupIteration `json:"iteration"` + TaskCompletionStatus *TasksCompletionStatus `json:"task_completion_status"` +} + +func (i Issue) String() string { + return Stringify(i) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (i *Issue) UnmarshalJSON(data []byte) error { + type alias Issue + + raw := make(map[string]interface{}) + err := json.Unmarshal(data, &raw) + if err != nil { + return err + } + + if reflect.TypeOf(raw["id"]).Kind() == reflect.String { + raw["external_id"] = raw["id"] + delete(raw, "id") + } + + labelDetails, ok := raw["labels"].([]interface{}) + if ok && len(labelDetails) > 0 { + // We only want to change anything if we got label details. + if _, ok := labelDetails[0].(map[string]interface{}); ok { + labels := make([]interface{}, len(labelDetails)) + for i, details := range labelDetails { + labels[i] = details.(map[string]interface{})["name"] + } + + // Set the correct values + raw["labels"] = labels + raw["label_details"] = labelDetails + } + } + + data, err = json.Marshal(raw) + if err != nil { + return err + } + + return json.Unmarshal(data, (*alias)(i)) +} + +// Labels is a custom type with specific marshaling characteristics. +type Labels []string + +// MarshalJSON implements the json.Marshaler interface. +func (l *Labels) MarshalJSON() ([]byte, error) { + if *l == nil { + return []byte(`null`), nil + } + return json.Marshal(strings.Join(*l, ",")) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *Labels) UnmarshalJSON(data []byte) error { + type alias Labels + if !bytes.HasPrefix(data, []byte("[")) { + data = []byte(fmt.Sprintf("[%s]", string(data))) + } + return json.Unmarshal(data, (*alias)(l)) +} + +// EncodeValues implements the query.EncodeValues interface +func (l *Labels) EncodeValues(key string, v *url.Values) error { + v.Set(key, strings.Join(*l, ",")) + return nil +} + +// LabelDetails represents detailed label information. +type LabelDetails struct { + ID int `json:"id"` + Name string `json:"name"` + Color string `json:"color"` + Description string `json:"description"` + DescriptionHTML string `json:"description_html"` + TextColor string `json:"text_color"` +} + +// ListIssuesOptions represents the available ListIssues() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#list-issues +type ListIssuesOptions struct { + ListOptions + State *string `url:"state,omitempty" json:"state,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + NotLabels *Labels `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"` + WithLabelDetails *bool `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + NotMilestone *string `url:"not[milestone],omitempty" json:"not[milestone],omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + NotAuthorUsername *string `url:"not[author_username],omitempty" json:"not[author_username],omitempty"` + NotAuthorID *[]int `url:"not[author_id],omitempty" json:"not[author_id],omitempty"` + AssigneeID *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + NotAssigneeID *[]int `url:"not[assignee_id],omitempty" json:"not[assignee_id],omitempty"` + AssigneeUsername *string `url:"assignee_username,omitempty" json:"assignee_username,omitempty"` + NotAssigneeUsername *string `url:"not[assignee_username],omitempty" json:"not[assignee_username],omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + NotMyReactionEmoji *[]string `url:"not[my_reaction_emoji],omitempty" json:"not[my_reaction_emoji],omitempty"` + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + In *string `url:"in,omitempty" json:"in,omitempty"` + NotIn *string `url:"not[in],omitempty" json:"not[in],omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + NotSearch *string `url:"not[search],omitempty" json:"not[search],omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + DueDate *string `url:"due_date,omitempty" json:"due_date,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` + IssueType *string `url:"issue_type,omitempty" json:"issue_type,omitempty"` + IterationID *int `url:"iteration_id,omitempty" json:"iteration_id,omitempty"` +} + +// ListIssues gets all issues created by authenticated user. This function +// takes pagination parameters page and per_page to restrict the list of issues. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#list-issues +func (s *IssuesService) ListIssues(opt *ListIssuesOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "issues", opt, options) + if err != nil { + return nil, nil, err + } + + var i []*Issue + resp, err := s.client.Do(req, &i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// ListGroupIssuesOptions represents the available ListGroupIssues() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#list-group-issues +type ListGroupIssuesOptions struct { + ListOptions + State *string `url:"state,omitempty" json:"state,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + NotLabels *Labels `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"` + WithLabelDetails *bool `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"` + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + NotMilestone *string `url:"not[milestone],omitempty" json:"not[milestone],omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + NotAuthorID *[]int `url:"not[author_id],omitempty" json:"not[author_id],omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + NotAuthorUsername *string `url:"not[author_username],omitempty" json:"not[author_username],omitempty"` + + AssigneeID *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + NotAssigneeID *[]int `url:"not[assignee_id],omitempty" json:"not[assignee_id],omitempty"` + AssigneeUsername *string `url:"assignee_username,omitempty" json:"assignee_username,omitempty"` + NotAssigneeUsername *string `url:"not[assignee_username],omitempty" json:"not[assignee_username],omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + NotMyReactionEmoji *[]string `url:"not[my_reaction_emoji],omitempty" json:"not[my_reaction_emoji],omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + NotSearch *string `url:"not[search],omitempty" json:"not[search],omitempty"` + In *string `url:"in,omitempty" json:"in,omitempty"` + NotIn *string `url:"not[in],omitempty" json:"not[in],omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + DueDate *string `url:"due_date,omitempty" json:"due_date,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + IssueType *string `url:"issue_type,omitempty" json:"issue_type,omitempty"` + IterationID *int `url:"iteration_id,omitempty" json:"iteration_id,omitempty"` +} + +// ListGroupIssues gets a list of group issues. This function accepts +// pagination parameters page and per_page to return the list of group issues. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#list-group-issues +func (s *IssuesService) ListGroupIssues(pid interface{}, opt *ListGroupIssuesOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/issues", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var i []*Issue + resp, err := s.client.Do(req, &i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// ListProjectIssuesOptions represents the available ListProjectIssues() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#list-project-issues +type ListProjectIssuesOptions struct { + ListOptions + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + State *string `url:"state,omitempty" json:"state,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + NotLabels *Labels `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"` + WithLabelDetails *bool `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + NotMilestone *string `url:"not[milestone],omitempty" json:"not[milestone],omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + NotAuthorUsername *string `url:"not[author_username],omitempty" json:"not[author_username],omitempty"` + NotAuthorID *[]int `url:"not[author_id],omitempty" json:"not[author_id],omitempty"` + AssigneeID *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + NotAssigneeID *[]int `url:"not[assignee_id],omitempty" json:"not[assignee_id],omitempty"` + AssigneeUsername *string `url:"assignee_username,omitempty" json:"assignee_username,omitempty"` + NotAssigneeUsername *string `url:"not[assignee_username],omitempty" json:"not[assignee_username],omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + NotMyReactionEmoji *[]string `url:"not[my_reaction_emoji],omitempty" json:"not[my_reaction_emoji],omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + In *string `url:"in,omitempty" json:"in,omitempty"` + NotIn *string `url:"not[in],omitempty" json:"not[in],omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + DueDate *string `url:"due_date,omitempty" json:"due_date,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` + IssueType *string `url:"issue_type,omitempty" json:"issue_type,omitempty"` + IterationID *int `url:"iteration_id,omitempty" json:"iteration_id,omitempty"` +} + +// ListProjectIssues gets a list of project issues. This function accepts +// pagination parameters page and per_page to return the list of project issues. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#list-project-issues +func (s *IssuesService) ListProjectIssues(pid interface{}, opt *ListProjectIssuesOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var i []*Issue + resp, err := s.client.Do(req, &i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// GetIssueByID gets a single issue. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#single-issue +func (s *IssuesService) GetIssueByID(issue int, options ...RequestOptionFunc) (*Issue, *Response, error) { + u := fmt.Sprintf("issues/%d", issue) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + i := new(Issue) + resp, err := s.client.Do(req, i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// GetIssue gets a single project issue. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#single-project-issue +func (s *IssuesService) GetIssue(pid interface{}, issue int, options ...RequestOptionFunc) (*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + i := new(Issue) + resp, err := s.client.Do(req, i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// CreateIssueOptions represents the available CreateIssue() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#new-issue +type CreateIssueOptions struct { + IID *int `url:"iid,omitempty" json:"iid,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` + AssigneeIDs *[]int `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"` + MilestoneID *int `url:"milestone_id,omitempty" json:"milestone_id,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` + DueDate *ISOTime `url:"due_date,omitempty" json:"due_date,omitempty"` + MergeRequestToResolveDiscussionsOf *int `url:"merge_request_to_resolve_discussions_of,omitempty" json:"merge_request_to_resolve_discussions_of,omitempty"` + DiscussionToResolve *string `url:"discussion_to_resolve,omitempty" json:"discussion_to_resolve,omitempty"` + Weight *int `url:"weight,omitempty" json:"weight,omitempty"` + IssueType *string `url:"issue_type,omitempty" json:"issue_type,omitempty"` +} + +// CreateIssue creates a new project issue. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#new-issue +func (s *IssuesService) CreateIssue(pid interface{}, opt *CreateIssueOptions, options ...RequestOptionFunc) (*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + i := new(Issue) + resp, err := s.client.Do(req, i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// UpdateIssueOptions represents the available UpdateIssue() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#edit-issue +type UpdateIssueOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` + AssigneeIDs *[]int `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"` + MilestoneID *int `url:"milestone_id,omitempty" json:"milestone_id,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + AddLabels *Labels `url:"add_labels,comma,omitempty" json:"add_labels,omitempty"` + RemoveLabels *Labels `url:"remove_labels,comma,omitempty" json:"remove_labels,omitempty"` + StateEvent *string `url:"state_event,omitempty" json:"state_event,omitempty"` + UpdatedAt *time.Time `url:"updated_at,omitempty" json:"updated_at,omitempty"` + DueDate *ISOTime `url:"due_date,omitempty" json:"due_date,omitempty"` + Weight *int `url:"weight,omitempty" json:"weight,omitempty"` + DiscussionLocked *bool `url:"discussion_locked,omitempty" json:"discussion_locked,omitempty"` + IssueType *string `url:"issue_type,omitempty" json:"issue_type,omitempty"` +} + +// UpdateIssue updates an existing project issue. This function is also used +// to mark an issue as closed. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#edit-issues +func (s *IssuesService) UpdateIssue(pid interface{}, issue int, opt *UpdateIssueOptions, options ...RequestOptionFunc) (*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + i := new(Issue) + resp, err := s.client.Do(req, i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// DeleteIssue deletes a single project issue. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#delete-an-issue +func (s *IssuesService) DeleteIssue(pid interface{}, issue int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// MoveIssueOptions represents the available MoveIssue() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#move-an-issue +type MoveIssueOptions struct { + ToProjectID *int `url:"to_project_id,omitempty" json:"to_project_id,omitempty"` +} + +// MoveIssue updates an existing project issue. This function is also used +// to mark an issue as closed. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#move-an-issue +func (s *IssuesService) MoveIssue(pid interface{}, issue int, opt *MoveIssueOptions, options ...RequestOptionFunc) (*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/move", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + i := new(Issue) + resp, err := s.client.Do(req, i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// SubscribeToIssue subscribes the authenticated user to the given issue to +// receive notifications. If the user is already subscribed to the issue, the +// status code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#subscribe-to-an-issue +func (s *IssuesService) SubscribeToIssue(pid interface{}, issue int, options ...RequestOptionFunc) (*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/subscribe", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + i := new(Issue) + resp, err := s.client.Do(req, i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// UnsubscribeFromIssue unsubscribes the authenticated user from the given +// issue to not receive notifications from that merge request. If the user +// is not subscribed to the issue, status code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#unsubscribe-from-an-issue +func (s *IssuesService) UnsubscribeFromIssue(pid interface{}, issue int, options ...RequestOptionFunc) (*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/unsubscribe", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + i := new(Issue) + resp, err := s.client.Do(req, i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// CreateTodo creates a todo for the current user for an issue. +// If there already exists a todo for the user on that issue, status code +// 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#create-a-to-do-item +func (s *IssuesService) CreateTodo(pid interface{}, issue int, options ...RequestOptionFunc) (*Todo, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/todo", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(Todo) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// ListMergeRequestsClosingIssueOptions represents the available +// ListMergeRequestsClosingIssue() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#list-merge-requests-that-close-a-particular-issue-on-merge +type ListMergeRequestsClosingIssueOptions ListOptions + +// ListMergeRequestsClosingIssue gets all the merge requests that will close +// issue when merged. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#list-merge-requests-that-close-a-particular-issue-on-merge +func (s *IssuesService) ListMergeRequestsClosingIssue(pid interface{}, issue int, opt *ListMergeRequestsClosingIssueOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/closed_by", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var m []*MergeRequest + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// ListMergeRequestsRelatedToIssueOptions represents the available +// ListMergeRequestsRelatedToIssue() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#list-merge-requests-related-to-issue +type ListMergeRequestsRelatedToIssueOptions ListOptions + +// ListMergeRequestsRelatedToIssue gets all the merge requests that are +// related to the issue +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#list-merge-requests-related-to-issue +func (s *IssuesService) ListMergeRequestsRelatedToIssue(pid interface{}, issue int, opt *ListMergeRequestsRelatedToIssueOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/related_merge_requests", + PathEscape(project), + issue, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var m []*MergeRequest + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// SetTimeEstimate sets the time estimate for a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#set-a-time-estimate-for-an-issue +func (s *IssuesService) SetTimeEstimate(pid interface{}, issue int, opt *SetTimeEstimateOptions, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.setTimeEstimate(pid, "issues", issue, opt, options...) +} + +// ResetTimeEstimate resets the time estimate for a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#reset-the-time-estimate-for-an-issue +func (s *IssuesService) ResetTimeEstimate(pid interface{}, issue int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.resetTimeEstimate(pid, "issues", issue, options...) +} + +// AddSpentTime adds spent time for a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#add-spent-time-for-an-issue +func (s *IssuesService) AddSpentTime(pid interface{}, issue int, opt *AddSpentTimeOptions, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.addSpentTime(pid, "issues", issue, opt, options...) +} + +// ResetSpentTime resets the spent time for a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#reset-spent-time-for-an-issue +func (s *IssuesService) ResetSpentTime(pid interface{}, issue int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.resetSpentTime(pid, "issues", issue, options...) +} + +// GetTimeSpent gets the spent time for a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#get-time-tracking-stats +func (s *IssuesService) GetTimeSpent(pid interface{}, issue int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.getTimeSpent(pid, "issues", issue, options...) +} + +// GetParticipants gets a list of issue participants. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues.html#participants-on-issues +func (s *IssuesService) GetParticipants(pid interface{}, issue int, options ...RequestOptionFunc) ([]*BasicUser, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/participants", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var bu []*BasicUser + resp, err := s.client.Do(req, &bu) + if err != nil { + return nil, resp, err + } + + return bu, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/issues_statistics.go b/vendor/github.com/xanzy/go-gitlab/issues_statistics.go new file mode 100644 index 0000000000..16b9fce74e --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/issues_statistics.go @@ -0,0 +1,187 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// IssuesStatisticsService handles communication with the issues statistics +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues_statistics.html +type IssuesStatisticsService struct { + client *Client +} + +// IssuesStatistics represents a GitLab issues statistic. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/issues_statistics.html +type IssuesStatistics struct { + Statistics struct { + Counts struct { + All int `json:"all"` + Closed int `json:"closed"` + Opened int `json:"opened"` + } `json:"counts"` + } `json:"statistics"` +} + +func (n IssuesStatistics) String() string { + return Stringify(n) +} + +// GetIssuesStatisticsOptions represents the available GetIssuesStatistics() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics +type GetIssuesStatisticsOptions struct { + Labels *Labels `url:"labels,omitempty" json:"labels,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + AssigneeUsername *[]string `url:"assignee_username,omitempty" json:"assignee_username,omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + In *string `url:"in,omitempty" json:"in,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` +} + +// GetIssuesStatistics gets issues statistics on all issues the authenticated +// user has access to. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics +func (s *IssuesStatisticsService) GetIssuesStatistics(opt *GetIssuesStatisticsOptions, options ...RequestOptionFunc) (*IssuesStatistics, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "issues_statistics", opt, options) + if err != nil { + return nil, nil, err + } + + is := new(IssuesStatistics) + resp, err := s.client.Do(req, is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} + +// GetGroupIssuesStatisticsOptions represents the available GetGroupIssuesStatistics() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues_statistics.html#get-group-issues-statistics +type GetGroupIssuesStatisticsOptions struct { + Labels *Labels `url:"labels,omitempty" json:"labels,omitempty"` + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + AssigneeUsername *[]string `url:"assignee_username,omitempty" json:"assignee_username,omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` +} + +// GetGroupIssuesStatistics gets issues count statistics for given group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues_statistics.html#get-group-issues-statistics +func (s *IssuesStatisticsService) GetGroupIssuesStatistics(gid interface{}, opt *GetGroupIssuesStatisticsOptions, options ...RequestOptionFunc) (*IssuesStatistics, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/issues_statistics", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + is := new(IssuesStatistics) + resp, err := s.client.Do(req, is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} + +// GetProjectIssuesStatisticsOptions represents the available +// GetProjectIssuesStatistics() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues_statistics.html#get-project-issues-statistics +type GetProjectIssuesStatisticsOptions struct { + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + Labels *Labels `url:"labels,omitempty" json:"labels,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + AssigneeUsername *[]string `url:"assignee_username,omitempty" json:"assignee_username,omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Confidential *bool `url:"confidential,omitempty" json:"confidential,omitempty"` +} + +// GetProjectIssuesStatistics gets issues count statistics for given project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/issues_statistics.html#get-project-issues-statistics +func (s *IssuesStatisticsService) GetProjectIssuesStatistics(pid interface{}, opt *GetProjectIssuesStatisticsOptions, options ...RequestOptionFunc) (*IssuesStatistics, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues_statistics", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + is := new(IssuesStatistics) + resp, err := s.client.Do(req, is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/jobs.go b/vendor/github.com/xanzy/go-gitlab/jobs.go new file mode 100644 index 0000000000..ba1b6f4530 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/jobs.go @@ -0,0 +1,562 @@ +// +// Copyright 2021, Arkbriar +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "net/http" + "time" +) + +// JobsService handles communication with the ci builds related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/jobs.html +type JobsService struct { + client *Client +} + +// Job represents a ci build. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/jobs.html +type Job struct { + Commit *Commit `json:"commit"` + Coverage float64 `json:"coverage"` + AllowFailure bool `json:"allow_failure"` + CreatedAt *time.Time `json:"created_at"` + StartedAt *time.Time `json:"started_at"` + FinishedAt *time.Time `json:"finished_at"` + Duration float64 `json:"duration"` + QueuedDuration float64 `json:"queued_duration"` + ArtifactsExpireAt *time.Time `json:"artifacts_expire_at"` + TagList []string `json:"tag_list"` + ID int `json:"id"` + Name string `json:"name"` + Pipeline struct { + ID int `json:"id"` + ProjectID int `json:"project_id"` + Ref string `json:"ref"` + Sha string `json:"sha"` + Status string `json:"status"` + } `json:"pipeline"` + Ref string `json:"ref"` + Artifacts []struct { + FileType string `json:"file_type"` + Filename string `json:"filename"` + Size int `json:"size"` + FileFormat string `json:"file_format"` + } `json:"artifacts"` + ArtifactsFile struct { + Filename string `json:"filename"` + Size int `json:"size"` + } `json:"artifacts_file"` + Runner struct { + ID int `json:"id"` + Description string `json:"description"` + Active bool `json:"active"` + IsShared bool `json:"is_shared"` + Name string `json:"name"` + } `json:"runner"` + Stage string `json:"stage"` + Status string `json:"status"` + FailureReason string `json:"failure_reason"` + Tag bool `json:"tag"` + WebURL string `json:"web_url"` + Project *Project `json:"project"` + User *User `json:"user"` +} + +// Bridge represents a pipeline bridge. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/jobs.html#list-pipeline-bridges +type Bridge struct { + Commit *Commit `json:"commit"` + Coverage float64 `json:"coverage"` + AllowFailure bool `json:"allow_failure"` + CreatedAt *time.Time `json:"created_at"` + StartedAt *time.Time `json:"started_at"` + FinishedAt *time.Time `json:"finished_at"` + Duration float64 `json:"duration"` + ID int `json:"id"` + Name string `json:"name"` + Pipeline PipelineInfo `json:"pipeline"` + Ref string `json:"ref"` + Stage string `json:"stage"` + Status string `json:"status"` + Tag bool `json:"tag"` + WebURL string `json:"web_url"` + User *User `json:"user"` + DownstreamPipeline *PipelineInfo `json:"downstream_pipeline"` +} + +// ListJobsOptions represents the available ListProjectJobs() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#list-project-jobs +type ListJobsOptions struct { + ListOptions + Scope *[]BuildStateValue `url:"scope[],omitempty" json:"scope,omitempty"` + IncludeRetried *bool `url:"include_retried,omitempty" json:"include_retried,omitempty"` +} + +// ListProjectJobs gets a list of jobs in a project. +// +// The scope of jobs to show, one or array of: created, pending, running, +// failed, success, canceled, skipped; showing all jobs if none provided +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#list-project-jobs +func (s *JobsService) ListProjectJobs(pid interface{}, opts *ListJobsOptions, options ...RequestOptionFunc) ([]*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, nil, err + } + + var jobs []*Job + resp, err := s.client.Do(req, &jobs) + if err != nil { + return nil, resp, err + } + + return jobs, resp, err +} + +// ListPipelineJobs gets a list of jobs for specific pipeline in a +// project. If the pipeline ID is not found, it will respond with 404. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#list-pipeline-jobs +func (s *JobsService) ListPipelineJobs(pid interface{}, pipelineID int, opts *ListJobsOptions, options ...RequestOptionFunc) ([]*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d/jobs", PathEscape(project), pipelineID) + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, nil, err + } + + var jobs []*Job + resp, err := s.client.Do(req, &jobs) + if err != nil { + return nil, resp, err + } + + return jobs, resp, err +} + +// ListPipelineBridges gets a list of bridges for specific pipeline in a +// project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#list-pipeline-jobs +func (s *JobsService) ListPipelineBridges(pid interface{}, pipelineID int, opts *ListJobsOptions, options ...RequestOptionFunc) ([]*Bridge, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d/bridges", PathEscape(project), pipelineID) + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, nil, err + } + + var bridges []*Bridge + resp, err := s.client.Do(req, &bridges) + if err != nil { + return nil, resp, err + } + + return bridges, resp, err +} + +// GetJobTokensJobOptions represents the available GetJobTokensJob() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/jobs.html#get-job-tokens-job +type GetJobTokensJobOptions struct { + JobToken *string `url:"job_token,omitempty" json:"job_token,omitempty"` +} + +// GetJobTokensJob retrieves the job that generated a job token. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/jobs.html#get-job-tokens-job +func (s *JobsService) GetJobTokensJob(opts *GetJobTokensJobOptions, options ...RequestOptionFunc) (*Job, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "job", opts, options) + if err != nil { + return nil, nil, err + } + + job := new(Job) + resp, err := s.client.Do(req, job) + if err != nil { + return nil, resp, err + } + + return job, resp, err +} + +// GetJob gets a single job of a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#get-a-single-job +func (s *JobsService) GetJob(pid interface{}, jobID int, options ...RequestOptionFunc) (*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + job := new(Job) + resp, err := s.client.Do(req, job) + if err != nil { + return nil, resp, err + } + + return job, resp, err +} + +// GetJobArtifacts get jobs artifacts of a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/job_artifacts.html#get-job-artifacts +func (s *JobsService) GetJobArtifacts(pid interface{}, jobID int, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/artifacts", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + artifactsBuf := new(bytes.Buffer) + resp, err := s.client.Do(req, artifactsBuf) + if err != nil { + return nil, resp, err + } + + return bytes.NewReader(artifactsBuf.Bytes()), resp, err +} + +// DownloadArtifactsFileOptions represents the available DownloadArtifactsFile() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/job_artifacts.html#download-the-artifacts-archive +type DownloadArtifactsFileOptions struct { + Job *string `url:"job" json:"job"` +} + +// DownloadArtifactsFile download the artifacts file from the given +// reference name and job provided the job finished successfully. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/job_artifacts.html#download-the-artifacts-archive +func (s *JobsService) DownloadArtifactsFile(pid interface{}, refName string, opt *DownloadArtifactsFileOptions, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/artifacts/%s/download", PathEscape(project), refName) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + artifactsBuf := new(bytes.Buffer) + resp, err := s.client.Do(req, artifactsBuf) + if err != nil { + return nil, resp, err + } + + return bytes.NewReader(artifactsBuf.Bytes()), resp, err +} + +// DownloadSingleArtifactsFile download a file from the artifacts from the +// given reference name and job provided the job finished successfully. +// Only a single file is going to be extracted from the archive and streamed +// to a client. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/job_artifacts.html#download-a-single-artifact-file-by-job-id +func (s *JobsService) DownloadSingleArtifactsFile(pid interface{}, jobID int, artifactPath string, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + + u := fmt.Sprintf( + "projects/%s/jobs/%d/artifacts/%s", + PathEscape(project), + jobID, + artifactPath, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + artifactBuf := new(bytes.Buffer) + resp, err := s.client.Do(req, artifactBuf) + if err != nil { + return nil, resp, err + } + + return bytes.NewReader(artifactBuf.Bytes()), resp, err +} + +// DownloadSingleArtifactsFile download a single artifact file for a specific +// job of the latest successful pipeline for the given reference name from +// inside the job’s artifacts archive. The file is extracted from the archive +// and streamed to the client. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/job_artifacts.html#download-a-single-artifact-file-from-specific-tag-or-branch +func (s *JobsService) DownloadSingleArtifactsFileByTagOrBranch(pid interface{}, refName string, artifactPath string, opt *DownloadArtifactsFileOptions, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + + u := fmt.Sprintf( + "projects/%s/jobs/artifacts/%s/raw/%s", + PathEscape(project), + PathEscape(refName), + artifactPath, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + artifactBuf := new(bytes.Buffer) + resp, err := s.client.Do(req, artifactBuf) + if err != nil { + return nil, resp, err + } + + return bytes.NewReader(artifactBuf.Bytes()), resp, err +} + +// GetTraceFile gets a trace of a specific job of a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#get-a-log-file +func (s *JobsService) GetTraceFile(pid interface{}, jobID int, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/trace", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + traceBuf := new(bytes.Buffer) + resp, err := s.client.Do(req, traceBuf) + if err != nil { + return nil, resp, err + } + + return bytes.NewReader(traceBuf.Bytes()), resp, err +} + +// CancelJob cancels a single job of a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#cancel-a-job +func (s *JobsService) CancelJob(pid interface{}, jobID int, options ...RequestOptionFunc) (*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/cancel", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + job := new(Job) + resp, err := s.client.Do(req, job) + if err != nil { + return nil, resp, err + } + + return job, resp, err +} + +// RetryJob retries a single job of a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#retry-a-job +func (s *JobsService) RetryJob(pid interface{}, jobID int, options ...RequestOptionFunc) (*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/retry", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + job := new(Job) + resp, err := s.client.Do(req, job) + if err != nil { + return nil, resp, err + } + + return job, resp, err +} + +// EraseJob erases a single job of a project, removes a job +// artifacts and a job trace. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#erase-a-job +func (s *JobsService) EraseJob(pid interface{}, jobID int, options ...RequestOptionFunc) (*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/erase", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + job := new(Job) + resp, err := s.client.Do(req, job) + if err != nil { + return nil, resp, err + } + + return job, resp, err +} + +// KeepArtifacts prevents artifacts from being deleted when +// expiration is set. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/job_artifacts.html#keep-artifacts +func (s *JobsService) KeepArtifacts(pid interface{}, jobID int, options ...RequestOptionFunc) (*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/artifacts/keep", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + job := new(Job) + resp, err := s.client.Do(req, job) + if err != nil { + return nil, resp, err + } + + return job, resp, err +} + +// PlayJobOptions represents the available PlayJob() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#run-a-job +type PlayJobOptions struct { + JobVariablesAttributes *[]*JobVariableOptions `url:"job_variables_attributes,omitempty" json:"job_variables_attributes,omitempty"` +} + +// JobVariableOptions represents a single job variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#run-a-job +type JobVariableOptions struct { + Key *string `url:"key,omitempty" json:"key,omitempty"` + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *string `url:"variable_type,omitempty" json:"variable_type,omitempty"` +} + +// PlayJob triggers a manual action to start a job. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/jobs.html#run-a-job +func (s *JobsService) PlayJob(pid interface{}, jobID int, opt *PlayJobOptions, options ...RequestOptionFunc) (*Job, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/play", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + job := new(Job) + resp, err := s.client.Do(req, job) + if err != nil { + return nil, resp, err + } + + return job, resp, err +} + +// DeleteArtifacts delete artifacts of a job +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/job_artifacts.html#delete-job-artifacts +func (s *JobsService) DeleteArtifacts(pid interface{}, jobID int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/jobs/%d/artifacts", PathEscape(project), jobID) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/keys.go b/vendor/github.com/xanzy/go-gitlab/keys.go new file mode 100644 index 0000000000..29f2541f42 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/keys.go @@ -0,0 +1,66 @@ +// +// Copyright 2021, Patrick Webster +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// KeysService handles communication with the +// keys related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/keys.html +type KeysService struct { + client *Client +} + +// Key represents a GitLab user's SSH key. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/keys.html +type Key struct { + ID int `json:"id"` + Title string `json:"title"` + Key string `json:"key"` + CreatedAt *time.Time `json:"created_at"` + User User `json:"user"` +} + +// GetKeyWithUser gets a single key by id along with the associated +// user information. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/keys.html#get-ssh-key-with-user-by-id-of-an-ssh-key +func (s *KeysService) GetKeyWithUser(key int, options ...RequestOptionFunc) (*Key, *Response, error) { + u := fmt.Sprintf("keys/%d", key) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + k := new(Key) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/labels.go b/vendor/github.com/xanzy/go-gitlab/labels.go new file mode 100644 index 0000000000..d4c8b44108 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/labels.go @@ -0,0 +1,309 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "encoding/json" + "fmt" + "net/http" +) + +// LabelsService handles communication with the label related methods of the +// GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html +type LabelsService struct { + client *Client +} + +// Label represents a GitLab label. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html +type Label struct { + ID int `json:"id"` + Name string `json:"name"` + Color string `json:"color"` + TextColor string `json:"text_color"` + Description string `json:"description"` + OpenIssuesCount int `json:"open_issues_count"` + ClosedIssuesCount int `json:"closed_issues_count"` + OpenMergeRequestsCount int `json:"open_merge_requests_count"` + Subscribed bool `json:"subscribed"` + Priority int `json:"priority"` + IsProjectLabel bool `json:"is_project_label"` +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *Label) UnmarshalJSON(data []byte) error { + type alias Label + if err := json.Unmarshal(data, (*alias)(l)); err != nil { + return err + } + + if l.Name == "" { + var raw map[string]interface{} + if err := json.Unmarshal(data, &raw); err != nil { + return err + } + if title, ok := raw["title"].(string); ok { + l.Name = title + } + } + + return nil +} + +func (l Label) String() string { + return Stringify(l) +} + +// ListLabelsOptions represents the available ListLabels() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#list-labels +type ListLabelsOptions struct { + ListOptions + WithCounts *bool `url:"with_counts,omitempty" json:"with_counts,omitempty"` + IncludeAncestorGroups *bool `url:"include_ancestor_groups,omitempty" json:"include_ancestor_groups,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` +} + +// ListLabels gets all labels for given project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#list-labels +func (s *LabelsService) ListLabels(pid interface{}, opt *ListLabelsOptions, options ...RequestOptionFunc) ([]*Label, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/labels", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var l []*Label + resp, err := s.client.Do(req, &l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// GetLabel get a single label for a given project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#get-a-single-project-label +func (s *LabelsService) GetLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Label, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + label, err := parseID(labelID) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/labels/%s", PathEscape(project), PathEscape(label)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var l *Label + resp, err := s.client.Do(req, &l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// CreateLabelOptions represents the available CreateLabel() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#create-a-new-label +type CreateLabelOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Color *string `url:"color,omitempty" json:"color,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Priority *int `url:"priority,omitempty" json:"priority,omitempty"` +} + +// CreateLabel creates a new label for given repository with given name and +// color. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#create-a-new-label +func (s *LabelsService) CreateLabel(pid interface{}, opt *CreateLabelOptions, options ...RequestOptionFunc) (*Label, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/labels", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + l := new(Label) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// DeleteLabelOptions represents the available DeleteLabel() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#delete-a-label +type DeleteLabelOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` +} + +// DeleteLabel deletes a label given by its name. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#delete-a-label +func (s *LabelsService) DeleteLabel(pid interface{}, opt *DeleteLabelOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/labels", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// UpdateLabelOptions represents the available UpdateLabel() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#edit-an-existing-label +type UpdateLabelOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + NewName *string `url:"new_name,omitempty" json:"new_name,omitempty"` + Color *string `url:"color,omitempty" json:"color,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Priority *int `url:"priority,omitempty" json:"priority,omitempty"` +} + +// UpdateLabel updates an existing label with new name or now color. At least +// one parameter is required, to update the label. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#edit-an-existing-label +func (s *LabelsService) UpdateLabel(pid interface{}, opt *UpdateLabelOptions, options ...RequestOptionFunc) (*Label, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/labels", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + l := new(Label) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// SubscribeToLabel subscribes the authenticated user to a label to receive +// notifications. If the user is already subscribed to the label, the status +// code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/labels.html#subscribe-to-a-label +func (s *LabelsService) SubscribeToLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Label, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + label, err := parseID(labelID) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/labels/%s/subscribe", PathEscape(project), PathEscape(label)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + l := new(Label) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// UnsubscribeFromLabel unsubscribes the authenticated user from a label to not +// receive notifications from it. If the user is not subscribed to the label, the +// status code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/labels.html#unsubscribe-from-a-label +func (s *LabelsService) UnsubscribeFromLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + label, err := parseID(labelID) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/labels/%s/unsubscribe", PathEscape(project), PathEscape(label)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// PromoteLabel Promotes a project label to a group label. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/labels.html#promote-a-project-label-to-a-group-label +func (s *LabelsService) PromoteLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + label, err := parseID(labelID) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/labels/%s/promote", PathEscape(project), PathEscape(label)) + + req, err := s.client.NewRequest(http.MethodPut, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/license.go b/vendor/github.com/xanzy/go-gitlab/license.go new file mode 100644 index 0000000000..1c739967ad --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/license.go @@ -0,0 +1,128 @@ +// +// Copyright 2021, Patrick Webster +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// LicenseService handles communication with the license +// related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/license.html +type LicenseService struct { + client *Client +} + +// License represents a GitLab license. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/license.html +type License struct { + ID int `json:"id"` + Plan string `json:"plan"` + CreatedAt *time.Time `json:"created_at"` + StartsAt *ISOTime `json:"starts_at"` + ExpiresAt *ISOTime `json:"expires_at"` + HistoricalMax int `json:"historical_max"` + MaximumUserCount int `json:"maximum_user_count"` + Expired bool `json:"expired"` + Overage int `json:"overage"` + UserLimit int `json:"user_limit"` + ActiveUsers int `json:"active_users"` + Licensee struct { + Name string `json:"Name"` + Company string `json:"Company"` + Email string `json:"Email"` + } `json:"licensee"` + // Add on codes that may occur in legacy licenses that don't have a plan yet. + // https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/license.rb + AddOns struct { + GitLabAuditorUser int `json:"GitLab_Auditor_User"` + GitLabDeployBoard int `json:"GitLab_DeployBoard"` + GitLabFileLocks int `json:"GitLab_FileLocks"` + GitLabGeo int `json:"GitLab_Geo"` + GitLabServiceDesk int `json:"GitLab_ServiceDesk"` + } `json:"add_ons"` +} + +func (l License) String() string { + return Stringify(l) +} + +// GetLicense retrieves information about the current license. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/license.html#retrieve-information-about-the-current-license +func (s *LicenseService) GetLicense(options ...RequestOptionFunc) (*License, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "license", nil, options) + if err != nil { + return nil, nil, err + } + + l := new(License) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// AddLicenseOptions represents the available AddLicense() options. +// +// https://docs.gitlab.com/ee/api/license.html#add-a-new-license +type AddLicenseOptions struct { + License *string `url:"license" json:"license"` +} + +// AddLicense adds a new license. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/license.html#add-a-new-license +func (s *LicenseService) AddLicense(opt *AddLicenseOptions, options ...RequestOptionFunc) (*License, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "license", opt, options) + if err != nil { + return nil, nil, err + } + + l := new(License) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// DeleteLicense deletes an existing license. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/license.html#delete-a-license +func (s *LicenseService) DeleteLicense(licenseID int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("license/%d", licenseID) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/license_templates.go b/vendor/github.com/xanzy/go-gitlab/license_templates.go new file mode 100644 index 0000000000..70e050edec --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/license_templates.go @@ -0,0 +1,109 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// LicenseTemplate represents a license template. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/licenses.html +type LicenseTemplate struct { + Key string `json:"key"` + Name string `json:"name"` + Nickname string `json:"nickname"` + Featured bool `json:"featured"` + HTMLURL string `json:"html_url"` + SourceURL string `json:"source_url"` + Description string `json:"description"` + Conditions []string `json:"conditions"` + Permissions []string `json:"permissions"` + Limitations []string `json:"limitations"` + Content string `json:"content"` +} + +// LicenseTemplatesService handles communication with the license templates +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/templates/licenses.html +type LicenseTemplatesService struct { + client *Client +} + +// ListLicenseTemplatesOptions represents the available +// ListLicenseTemplates() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/licenses.html#list-license-templates +type ListLicenseTemplatesOptions struct { + ListOptions + Popular *bool `url:"popular,omitempty" json:"popular,omitempty"` +} + +// ListLicenseTemplates get all license templates. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/licenses.html#list-license-templates +func (s *LicenseTemplatesService) ListLicenseTemplates(opt *ListLicenseTemplatesOptions, options ...RequestOptionFunc) ([]*LicenseTemplate, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "templates/licenses", opt, options) + if err != nil { + return nil, nil, err + } + + var lts []*LicenseTemplate + resp, err := s.client.Do(req, <s) + if err != nil { + return nil, resp, err + } + + return lts, resp, err +} + +// GetLicenseTemplateOptions represents the available +// GetLicenseTemplate() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/licenses.html#single-license-template +type GetLicenseTemplateOptions struct { + Project *string `url:"project,omitempty" json:"project,omitempty"` + Fullname *string `url:"fullname,omitempty" json:"fullname,omitempty"` +} + +// GetLicenseTemplate get a single license template. You can pass parameters +// to replace the license placeholder. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/templates/licenses.html#single-license-template +func (s *LicenseTemplatesService) GetLicenseTemplate(template string, opt *GetLicenseTemplateOptions, options ...RequestOptionFunc) (*LicenseTemplate, *Response, error) { + u := fmt.Sprintf("templates/licenses/%s", template) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + lt := new(LicenseTemplate) + resp, err := s.client.Do(req, lt) + if err != nil { + return nil, resp, err + } + + return lt, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/markdown.go b/vendor/github.com/xanzy/go-gitlab/markdown.go new file mode 100644 index 0000000000..8c20749fe8 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/markdown.go @@ -0,0 +1,47 @@ +package gitlab + +import "net/http" + +// MarkdownService handles communication with the markdown related methods of +// the GitLab API. +// +// Gitlab API docs: https://docs.gitlab.com/ee/api/markdown.html +type MarkdownService struct { + client *Client +} + +// Markdown represents a markdown document. +// +// Gitlab API docs: https://docs.gitlab.com/ee/api/markdown.html +type Markdown struct { + HTML string `json:"html"` +} + +// RenderOptions represents the available Render() options. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/markdown.html#render-an-arbitrary-markdown-document +type RenderOptions struct { + Text *string `url:"text,omitempty" json:"text,omitempty"` + GitlabFlavouredMarkdown *bool `url:"gfm,omitempty" json:"gfm,omitempty"` + Project *string `url:"project,omitempty" json:"project,omitempty"` +} + +// Render an arbitrary markdown document. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/markdown.html#render-an-arbitrary-markdown-document +func (s *MarkdownService) Render(opt *RenderOptions, options ...RequestOptionFunc) (*Markdown, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "markdown", opt, options) + if err != nil { + return nil, nil, err + } + + md := new(Markdown) + response, err := s.client.Do(req, md) + if err != nil { + return nil, response, err + } + + return md, response, nil +} diff --git a/vendor/github.com/xanzy/go-gitlab/merge_request_approvals.go b/vendor/github.com/xanzy/go-gitlab/merge_request_approvals.go new file mode 100644 index 0000000000..09b7d8d9d7 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/merge_request_approvals.go @@ -0,0 +1,419 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// MergeRequestApprovalsService handles communication with the merge request +// approvals related methods of the GitLab API. This includes reading/updating +// approval settings and approve/unapproving merge requests +// +// GitLab API docs: https://docs.gitlab.com/ee/api/merge_request_approvals.html +type MergeRequestApprovalsService struct { + client *Client +} + +// MergeRequestApprovals represents GitLab merge request approvals. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#merge-request-level-mr-approvals +type MergeRequestApprovals struct { + ID int `json:"id"` + IID int `json:"iid"` + ProjectID int `json:"project_id"` + Title string `json:"title"` + Description string `json:"description"` + State string `json:"state"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + MergeStatus string `json:"merge_status"` + Approved bool `json:"approved"` + ApprovalsBeforeMerge int `json:"approvals_before_merge"` + ApprovalsRequired int `json:"approvals_required"` + ApprovalsLeft int `json:"approvals_left"` + RequirePasswordToApprove bool `json:"require_password_to_approve"` + ApprovedBy []*MergeRequestApproverUser `json:"approved_by"` + SuggestedApprovers []*BasicUser `json:"suggested_approvers"` + Approvers []*MergeRequestApproverUser `json:"approvers"` + ApproverGroups []*MergeRequestApproverGroup `json:"approver_groups"` + UserHasApproved bool `json:"user_has_approved"` + UserCanApprove bool `json:"user_can_approve"` + ApprovalRulesLeft []*MergeRequestApprovalRule `json:"approval_rules_left"` + HasApprovalRules bool `json:"has_approval_rules"` + MergeRequestApproversAvailable bool `json:"merge_request_approvers_available"` + MultipleApprovalRulesAvailable bool `json:"multiple_approval_rules_available"` +} + +func (m MergeRequestApprovals) String() string { + return Stringify(m) +} + +// MergeRequestApproverGroup represents GitLab project level merge request approver group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals +type MergeRequestApproverGroup struct { + Group struct { + ID int `json:"id"` + Name string `json:"name"` + Path string `json:"path"` + Description string `json:"description"` + Visibility string `json:"visibility"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + FullName string `json:"full_name"` + FullPath string `json:"full_path"` + LFSEnabled bool `json:"lfs_enabled"` + RequestAccessEnabled bool `json:"request_access_enabled"` + } +} + +// MergeRequestApprovalRule represents a GitLab merge request approval rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-merge-request-level-rules +type MergeRequestApprovalRule struct { + ID int `json:"id"` + Name string `json:"name"` + RuleType string `json:"rule_type"` + EligibleApprovers []*BasicUser `json:"eligible_approvers"` + ApprovalsRequired int `json:"approvals_required"` + SourceRule *ProjectApprovalRule `json:"source_rule"` + Users []*BasicUser `json:"users"` + Groups []*Group `json:"groups"` + ContainsHiddenGroups bool `json:"contains_hidden_groups"` + Section string `json:"section"` + ApprovedBy []*BasicUser `json:"approved_by"` + Approved bool `json:"approved"` +} + +// MergeRequestApprovalState represents a GitLab merge request approval state. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-the-approval-state-of-merge-requests +type MergeRequestApprovalState struct { + ApprovalRulesOverwritten bool `json:"approval_rules_overwritten"` + Rules []*MergeRequestApprovalRule `json:"rules"` +} + +// String is a stringify for MergeRequestApprovalRule +func (s MergeRequestApprovalRule) String() string { + return Stringify(s) +} + +// MergeRequestApproverUser represents GitLab project level merge request approver user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals +type MergeRequestApproverUser struct { + User *BasicUser +} + +// ApproveMergeRequestOptions represents the available ApproveMergeRequest() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request +type ApproveMergeRequestOptions struct { + SHA *string `url:"sha,omitempty" json:"sha,omitempty"` +} + +// ApproveMergeRequest approves a merge request on GitLab. If a non-empty sha +// is provided then it must match the sha at the HEAD of the MR. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request +func (s *MergeRequestApprovalsService) ApproveMergeRequest(pid interface{}, mr int, opt *ApproveMergeRequestOptions, options ...RequestOptionFunc) (*MergeRequestApprovals, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approve", PathEscape(project), mr) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequestApprovals) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// UnapproveMergeRequest unapproves a previously approved merge request on GitLab. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#unapprove-merge-request +func (s *MergeRequestApprovalsService) UnapproveMergeRequest(pid interface{}, mr int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/unapprove", PathEscape(project), mr) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ChangeMergeRequestApprovalConfigurationOptions represents the available +// ChangeMergeRequestApprovalConfiguration() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-approval-configuration-deprecated +type ChangeMergeRequestApprovalConfigurationOptions struct { + ApprovalsRequired *int `url:"approvals_required,omitempty" json:"approvals_required,omitempty"` +} + +// GetConfiguration shows information about single merge request approvals +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-configuration-1 +func (s *MergeRequestApprovalsService) GetConfiguration(pid interface{}, mr int, options ...RequestOptionFunc) (*MergeRequestApprovals, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approvals", PathEscape(project), mr) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequestApprovals) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// ChangeApprovalConfiguration updates the approval configuration of a merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-approval-configuration-deprecated +func (s *MergeRequestApprovalsService) ChangeApprovalConfiguration(pid interface{}, mergeRequest int, opt *ChangeMergeRequestApprovalConfigurationOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approvals", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// ChangeMergeRequestAllowedApproversOptions represents the available +// ChangeMergeRequestAllowedApprovers() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers-for-merge-request +type ChangeMergeRequestAllowedApproversOptions struct { + ApproverIDs []int `url:"approver_ids" json:"approver_ids"` + ApproverGroupIDs []int `url:"approver_group_ids" json:"approver_group_ids"` +} + +// ChangeAllowedApprovers updates the approvers for a merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers-for-merge-request +func (s *MergeRequestApprovalsService) ChangeAllowedApprovers(pid interface{}, mergeRequest int, opt *ChangeMergeRequestAllowedApproversOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approvers", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// GetApprovalRules requests information about a merge request’s approval rules +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-merge-request-level-rules +func (s *MergeRequestApprovalsService) GetApprovalRules(pid interface{}, mergeRequest int, options ...RequestOptionFunc) ([]*MergeRequestApprovalRule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var par []*MergeRequestApprovalRule + resp, err := s.client.Do(req, &par) + if err != nil { + return nil, resp, err + } + + return par, resp, err +} + +// GetApprovalState requests information about a merge request’s approval state +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-the-approval-state-of-merge-requests +func (s *MergeRequestApprovalsService) GetApprovalState(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*MergeRequestApprovalState, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_state", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var pas *MergeRequestApprovalState + resp, err := s.client.Do(req, &pas) + if err != nil { + return nil, resp, err + } + + return pas, resp, err +} + +// CreateMergeRequestApprovalRuleOptions represents the available CreateApprovalRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-merge-request-level-rule +type CreateMergeRequestApprovalRuleOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ApprovalsRequired *int `url:"approvals_required,omitempty" json:"approvals_required,omitempty"` + ApprovalProjectRuleID *int `url:"approval_project_rule_id,omitempty" json:"approval_project_rule_id,omitempty"` + UserIDs *[]int `url:"user_ids,omitempty" json:"user_ids,omitempty"` + GroupIDs *[]int `url:"group_ids,omitempty" json:"group_ids,omitempty"` +} + +// CreateApprovalRule creates a new MR level approval rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-merge-request-level-rule +func (s *MergeRequestApprovalsService) CreateApprovalRule(pid interface{}, mergeRequest int, opt *CreateMergeRequestApprovalRuleOptions, options ...RequestOptionFunc) (*MergeRequestApprovalRule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + par := new(MergeRequestApprovalRule) + resp, err := s.client.Do(req, &par) + if err != nil { + return nil, resp, err + } + + return par, resp, err +} + +// UpdateMergeRequestApprovalRuleOptions represents the available UpdateApprovalRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-merge-request-level-rule +type UpdateMergeRequestApprovalRuleOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ApprovalsRequired *int `url:"approvals_required,omitempty" json:"approvals_required,omitempty"` + UserIDs *[]int `url:"user_ids,omitempty" json:"user_ids,omitempty"` + GroupIDs *[]int `url:"group_ids,omitempty" json:"group_ids,omitempty"` +} + +// UpdateApprovalRule updates an existing approval rule with new options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-merge-request-level-rule +func (s *MergeRequestApprovalsService) UpdateApprovalRule(pid interface{}, mergeRequest int, approvalRule int, opt *UpdateMergeRequestApprovalRuleOptions, options ...RequestOptionFunc) (*MergeRequestApprovalRule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules/%d", PathEscape(project), mergeRequest, approvalRule) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + par := new(MergeRequestApprovalRule) + resp, err := s.client.Do(req, &par) + if err != nil { + return nil, resp, err + } + + return par, resp, err +} + +// DeleteApprovalRule deletes a mr level approval rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#delete-merge-request-level-rule +func (s *MergeRequestApprovalsService) DeleteApprovalRule(pid interface{}, mergeRequest int, approvalRule int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules/%d", PathEscape(project), mergeRequest, approvalRule) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/merge_requests.go b/vendor/github.com/xanzy/go-gitlab/merge_requests.go new file mode 100644 index 0000000000..0aaed1ce1c --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/merge_requests.go @@ -0,0 +1,941 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// MergeRequestsService handles communication with the merge requests related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/merge_requests.html +type MergeRequestsService struct { + client *Client + timeStats *timeStatsService +} + +// MergeRequest represents a GitLab merge request. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/merge_requests.html +type MergeRequest struct { + ID int `json:"id"` + IID int `json:"iid"` + TargetBranch string `json:"target_branch"` + SourceBranch string `json:"source_branch"` + ProjectID int `json:"project_id"` + Title string `json:"title"` + State string `json:"state"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + Upvotes int `json:"upvotes"` + Downvotes int `json:"downvotes"` + Author *BasicUser `json:"author"` + Assignee *BasicUser `json:"assignee"` + Assignees []*BasicUser `json:"assignees"` + Reviewers []*BasicUser `json:"reviewers"` + SourceProjectID int `json:"source_project_id"` + TargetProjectID int `json:"target_project_id"` + Labels Labels `json:"labels"` + Description string `json:"description"` + Draft bool `json:"draft"` + WorkInProgress bool `json:"work_in_progress"` + Milestone *Milestone `json:"milestone"` + MergeWhenPipelineSucceeds bool `json:"merge_when_pipeline_succeeds"` + DetailedMergeStatus string `json:"detailed_merge_status"` + MergeError string `json:"merge_error"` + MergedBy *BasicUser `json:"merged_by"` + MergedAt *time.Time `json:"merged_at"` + ClosedBy *BasicUser `json:"closed_by"` + ClosedAt *time.Time `json:"closed_at"` + Subscribed bool `json:"subscribed"` + SHA string `json:"sha"` + MergeCommitSHA string `json:"merge_commit_sha"` + SquashCommitSHA string `json:"squash_commit_sha"` + UserNotesCount int `json:"user_notes_count"` + ChangesCount string `json:"changes_count"` + ShouldRemoveSourceBranch bool `json:"should_remove_source_branch"` + ForceRemoveSourceBranch bool `json:"force_remove_source_branch"` + AllowCollaboration bool `json:"allow_collaboration"` + WebURL string `json:"web_url"` + References *IssueReferences `json:"references"` + DiscussionLocked bool `json:"discussion_locked"` + Changes []struct { + OldPath string `json:"old_path"` + NewPath string `json:"new_path"` + AMode string `json:"a_mode"` + BMode string `json:"b_mode"` + Diff string `json:"diff"` + NewFile bool `json:"new_file"` + RenamedFile bool `json:"renamed_file"` + DeletedFile bool `json:"deleted_file"` + } `json:"changes"` + User struct { + CanMerge bool `json:"can_merge"` + } `json:"user"` + TimeStats *TimeStats `json:"time_stats"` + Squash bool `json:"squash"` + Pipeline *PipelineInfo `json:"pipeline"` + HeadPipeline *Pipeline `json:"head_pipeline"` + DiffRefs struct { + BaseSha string `json:"base_sha"` + HeadSha string `json:"head_sha"` + StartSha string `json:"start_sha"` + } `json:"diff_refs"` + DivergedCommitsCount int `json:"diverged_commits_count"` + RebaseInProgress bool `json:"rebase_in_progress"` + ApprovalsBeforeMerge int `json:"approvals_before_merge"` + Reference string `json:"reference"` + FirstContribution bool `json:"first_contribution"` + TaskCompletionStatus *TasksCompletionStatus `json:"task_completion_status"` + HasConflicts bool `json:"has_conflicts"` + BlockingDiscussionsResolved bool `json:"blocking_discussions_resolved"` + Overflow bool `json:"overflow"` + + // Deprecated: This parameter is replaced by DetailedMergeStatus in GitLab 15.6. + MergeStatus string `json:"merge_status"` +} + +func (m MergeRequest) String() string { + return Stringify(m) +} + +// MergeRequestDiffVersion represents Gitlab merge request version. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-merge-request-diff-versions +type MergeRequestDiffVersion struct { + ID int `json:"id"` + HeadCommitSHA string `json:"head_commit_sha,omitempty"` + BaseCommitSHA string `json:"base_commit_sha,omitempty"` + StartCommitSHA string `json:"start_commit_sha,omitempty"` + CreatedAt *time.Time `json:"created_at,omitempty"` + MergeRequestID int `json:"merge_request_id,omitempty"` + State string `json:"state,omitempty"` + RealSize string `json:"real_size,omitempty"` + Commits []*Commit `json:"commits,omitempty"` + Diffs []*Diff `json:"diffs,omitempty"` +} + +func (m MergeRequestDiffVersion) String() string { + return Stringify(m) +} + +// ListMergeRequestsOptions represents the available ListMergeRequests() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests +type ListMergeRequestsOptions struct { + ListOptions + State *string `url:"state,omitempty" json:"state,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + View *string `url:"view,omitempty" json:"view,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + NotLabels *Labels `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"` + WithLabelsDetails *bool `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"` + WithMergeStatusRecheck *bool `url:"with_merge_status_recheck,omitempty" json:"with_merge_status_recheck,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + AssigneeID *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + ApproverIDs *ApproverIDsValue `url:"approver_ids,omitempty" json:"approver_ids,omitempty"` + ApprovedByIDs *ApproverIDsValue `url:"approved_by_ids,omitempty" json:"approved_by_ids,omitempty"` + ReviewerID *ReviewerIDValue `url:"reviewer_id,omitempty" json:"reviewer_id,omitempty"` + ReviewerUsername *string `url:"reviewer_username,omitempty" json:"reviewer_username,omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + SourceBranch *string `url:"source_branch,omitempty" json:"source_branch,omitempty"` + TargetBranch *string `url:"target_branch,omitempty" json:"target_branch,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + In *string `url:"in,omitempty" json:"in,omitempty"` + Draft *bool `url:"draft,omitempty" json:"draft,omitempty"` + WIP *string `url:"wip,omitempty" json:"wip,omitempty"` +} + +// ListMergeRequests gets all merge requests. The state parameter can be used +// to get only merge requests with a given state (opened, closed, or merged) +// or all of them (all). The pagination parameters page and per_page can be +// used to restrict the list of merge requests. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests +func (s *MergeRequestsService) ListMergeRequests(opt *ListMergeRequestsOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "merge_requests", opt, options) + if err != nil { + return nil, nil, err + } + + var m []*MergeRequest + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// ListProjectMergeRequestsOptions represents the available ListMergeRequests() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-project-merge-requests +type ListProjectMergeRequestsOptions struct { + ListOptions + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + State *string `url:"state,omitempty" json:"state,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + View *string `url:"view,omitempty" json:"view,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + NotLabels *Labels `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"` + WithLabelsDetails *bool `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"` + WithMergeStatusRecheck *bool `url:"with_merge_status_recheck,omitempty" json:"with_merge_status_recheck,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + AssigneeID *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + ApproverIDs *ApproverIDsValue `url:"approver_ids,omitempty" json:"approver_ids,omitempty"` + ApprovedByIDs *ApproverIDsValue `url:"approved_by_ids,omitempty" json:"approved_by_ids,omitempty"` + ReviewerID *ReviewerIDValue `url:"reviewer_id,omitempty" json:"reviewer_id,omitempty"` + ReviewerUsername *string `url:"reviewer_username,omitempty" json:"reviewer_username,omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + SourceBranch *string `url:"source_branch,omitempty" json:"source_branch,omitempty"` + TargetBranch *string `url:"target_branch,omitempty" json:"target_branch,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + Draft *bool `url:"draft,omitempty" json:"draft,omitempty"` + WIP *string `url:"wip,omitempty" json:"wip,omitempty"` +} + +// ListProjectMergeRequests gets all merge requests for this project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-project-merge-requests +func (s *MergeRequestsService) ListProjectMergeRequests(pid interface{}, opt *ListProjectMergeRequestsOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var m []*MergeRequest + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// ListGroupMergeRequestsOptions represents the available ListGroupMergeRequests() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-group-merge-requests +type ListGroupMergeRequestsOptions struct { + ListOptions + State *string `url:"state,omitempty" json:"state,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Milestone *string `url:"milestone,omitempty" json:"milestone,omitempty"` + View *string `url:"view,omitempty" json:"view,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + NotLabels *Labels `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"` + WithLabelsDetails *bool `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"` + WithMergeStatusRecheck *bool `url:"with_merge_status_recheck,omitempty" json:"with_merge_status_recheck,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + AuthorUsername *string `url:"author_username,omitempty" json:"author_username,omitempty"` + AssigneeID *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + ApproverIDs *ApproverIDsValue `url:"approver_ids,omitempty" json:"approver_ids,omitempty"` + ApprovedByIDs *ApproverIDsValue `url:"approved_by_ids,omitempty" json:"approved_by_ids,omitempty"` + ReviewerID *ReviewerIDValue `url:"reviewer_id,omitempty" json:"reviewer_id,omitempty"` + ReviewerUsername *string `url:"reviewer_username,omitempty" json:"reviewer_username,omitempty"` + MyReactionEmoji *string `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"` + SourceBranch *string `url:"source_branch,omitempty" json:"source_branch,omitempty"` + TargetBranch *string `url:"target_branch,omitempty" json:"target_branch,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + In *string `url:"in,omitempty" json:"in,omitempty"` + Draft *bool `url:"draft,omitempty" json:"draft,omitempty"` + WIP *string `url:"wip,omitempty" json:"wip,omitempty"` +} + +// ListGroupMergeRequests gets all merge requests for this group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-group-merge-requests +func (s *MergeRequestsService) ListGroupMergeRequests(gid interface{}, opt *ListGroupMergeRequestsOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/merge_requests", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var m []*MergeRequest + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// GetMergeRequestsOptions represents the available GetMergeRequests() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-single-mr +type GetMergeRequestsOptions struct { + RenderHTML *bool `url:"render_html,omitempty" json:"render_html,omitempty"` + IncludeDivergedCommitsCount *bool `url:"include_diverged_commits_count,omitempty" json:"include_diverged_commits_count,omitempty"` + IncludeRebaseInProgress *bool `url:"include_rebase_in_progress,omitempty" json:"include_rebase_in_progress,omitempty"` +} + +// GetMergeRequest shows information about a single merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-single-mr +func (s *MergeRequestsService) GetMergeRequest(pid interface{}, mergeRequest int, opt *GetMergeRequestsOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// GetMergeRequestApprovals gets information about a merge requests approvals +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#merge-request-level-mr-approvals +func (s *MergeRequestsService) GetMergeRequestApprovals(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*MergeRequestApprovals, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/approvals", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + a := new(MergeRequestApprovals) + resp, err := s.client.Do(req, a) + if err != nil { + return nil, resp, err + } + + return a, resp, err +} + +// GetMergeRequestCommitsOptions represents the available GetMergeRequestCommits() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-single-merge-request-commits +type GetMergeRequestCommitsOptions ListOptions + +// GetMergeRequestCommits gets a list of merge request commits. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-single-merge-request-commits +func (s *MergeRequestsService) GetMergeRequestCommits(pid interface{}, mergeRequest int, opt *GetMergeRequestCommitsOptions, options ...RequestOptionFunc) ([]*Commit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/commits", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var c []*Commit + resp, err := s.client.Do(req, &c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// GetMergeRequestChangesOptions represents the available GetMergeRequestChanges() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-single-merge-request-changes +type GetMergeRequestChangesOptions struct { + AccessRawDiffs *bool `url:"access_raw_diffs,omitempty" json:"access_raw_diffs,omitempty"` +} + +// GetMergeRequestChanges shows information about the merge request including +// its files and changes. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-single-merge-request-changes +func (s *MergeRequestsService) GetMergeRequestChanges(pid interface{}, mergeRequest int, opt *GetMergeRequestChangesOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/changes", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// GetMergeRequestParticipants gets a list of merge request participants. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-single-merge-request-participants +func (s *MergeRequestsService) GetMergeRequestParticipants(pid interface{}, mergeRequest int, options ...RequestOptionFunc) ([]*BasicUser, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/participants", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var ps []*BasicUser + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// ListMergeRequestPipelines gets all pipelines for the provided merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-request-pipelines +func (s *MergeRequestsService) ListMergeRequestPipelines(pid interface{}, mergeRequest int, options ...RequestOptionFunc) ([]*PipelineInfo, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/pipelines", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var p []*PipelineInfo + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// CreateMergeRequestPipeline creates a new pipeline for a merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#create-merge-request-pipeline +func (s *MergeRequestsService) CreateMergeRequestPipeline(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*PipelineInfo, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/pipelines", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineInfo) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// GetIssuesClosedOnMergeOptions represents the available GetIssuesClosedOnMerge() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-issues-that-close-on-merge +type GetIssuesClosedOnMergeOptions ListOptions + +// GetIssuesClosedOnMerge gets all the issues that would be closed by merging the +// provided merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#list-issues-that-close-on-merge +func (s *MergeRequestsService) GetIssuesClosedOnMerge(pid interface{}, mergeRequest int, opt *GetIssuesClosedOnMergeOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/closes_issues", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var i []*Issue + resp, err := s.client.Do(req, &i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// CreateMergeRequestOptions represents the available CreateMergeRequest() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#create-mr +type CreateMergeRequestOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + SourceBranch *string `url:"source_branch,omitempty" json:"source_branch,omitempty"` + TargetBranch *string `url:"target_branch,omitempty" json:"target_branch,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + AssigneeIDs *[]int `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"` + ReviewerIDs *[]int `url:"reviewer_ids,omitempty" json:"reviewer_ids,omitempty"` + TargetProjectID *int `url:"target_project_id,omitempty" json:"target_project_id,omitempty"` + MilestoneID *int `url:"milestone_id,omitempty" json:"milestone_id,omitempty"` + RemoveSourceBranch *bool `url:"remove_source_branch,omitempty" json:"remove_source_branch,omitempty"` + Squash *bool `url:"squash,omitempty" json:"squash,omitempty"` + AllowCollaboration *bool `url:"allow_collaboration,omitempty" json:"allow_collaboration,omitempty"` +} + +// CreateMergeRequest creates a new merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#create-mr +func (s *MergeRequestsService) CreateMergeRequest(pid interface{}, opt *CreateMergeRequestOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// UpdateMergeRequestOptions represents the available UpdateMergeRequest() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#update-mr +type UpdateMergeRequestOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + TargetBranch *string `url:"target_branch,omitempty" json:"target_branch,omitempty"` + AssigneeID *int `url:"assignee_id,omitempty" json:"assignee_id,omitempty"` + AssigneeIDs *[]int `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"` + ReviewerIDs *[]int `url:"reviewer_ids,omitempty" json:"reviewer_ids,omitempty"` + Labels *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"` + AddLabels *Labels `url:"add_labels,comma,omitempty" json:"add_labels,omitempty"` + RemoveLabels *Labels `url:"remove_labels,comma,omitempty" json:"remove_labels,omitempty"` + MilestoneID *int `url:"milestone_id,omitempty" json:"milestone_id,omitempty"` + StateEvent *string `url:"state_event,omitempty" json:"state_event,omitempty"` + RemoveSourceBranch *bool `url:"remove_source_branch,omitempty" json:"remove_source_branch,omitempty"` + Squash *bool `url:"squash,omitempty" json:"squash,omitempty"` + DiscussionLocked *bool `url:"discussion_locked,omitempty" json:"discussion_locked,omitempty"` + AllowCollaboration *bool `url:"allow_collaboration,omitempty" json:"allow_collaboration,omitempty"` +} + +// UpdateMergeRequest updates an existing project milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#update-mr +func (s *MergeRequestsService) UpdateMergeRequest(pid interface{}, mergeRequest int, opt *UpdateMergeRequestOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// DeleteMergeRequest deletes a merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#delete-a-merge-request +func (s *MergeRequestsService) DeleteMergeRequest(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// AcceptMergeRequestOptions represents the available AcceptMergeRequest() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#merge-a-merge-request +type AcceptMergeRequestOptions struct { + MergeCommitMessage *string `url:"merge_commit_message,omitempty" json:"merge_commit_message,omitempty"` + SquashCommitMessage *string `url:"squash_commit_message,omitempty" json:"squash_commit_message,omitempty"` + Squash *bool `url:"squash,omitempty" json:"squash,omitempty"` + ShouldRemoveSourceBranch *bool `url:"should_remove_source_branch,omitempty" json:"should_remove_source_branch,omitempty"` + MergeWhenPipelineSucceeds *bool `url:"merge_when_pipeline_succeeds,omitempty" json:"merge_when_pipeline_succeeds,omitempty"` + SHA *string `url:"sha,omitempty" json:"sha,omitempty"` +} + +// AcceptMergeRequest merges changes submitted with MR using this API. If merge +// success you get 200 OK. If it has some conflicts and can not be merged - you +// get 405 and error message 'Branch cannot be merged'. If merge request is +// already merged or closed - you get 405 and error message 'Method Not Allowed' +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#merge-a-merge-request +func (s *MergeRequestsService) AcceptMergeRequest(pid interface{}, mergeRequest int, opt *AcceptMergeRequestOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/merge", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// CancelMergeWhenPipelineSucceeds cancels a merge when pipeline succeeds. If +// you don't have permissions to accept this merge request - you'll get a 401. +// If the merge request is already merged or closed - you get 405 and error +// message 'Method Not Allowed'. In case the merge request is not set to be +// merged when the pipeline succeeds, you'll also get a 406 error. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#cancel-merge-when-pipeline-succeeds +func (s *MergeRequestsService) CancelMergeWhenPipelineSucceeds(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/cancel_merge_when_pipeline_succeeds", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// RebaseMergeRequest automatically rebases the source_branch of the merge +// request against its target_branch. If you don’t have permissions to push +// to the merge request’s source branch, you’ll get a 403 Forbidden response. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#rebase-a-merge-request +func (s *MergeRequestsService) RebaseMergeRequest(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/rebase", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPut, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// GetMergeRequestDiffVersionsOptions represents the available +// GetMergeRequestDiffVersions() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-merge-request-diff-versions +type GetMergeRequestDiffVersionsOptions ListOptions + +// GetMergeRequestDiffVersions get a list of merge request diff versions. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-merge-request-diff-versions +func (s *MergeRequestsService) GetMergeRequestDiffVersions(pid interface{}, mergeRequest int, opt *GetMergeRequestDiffVersionsOptions, options ...RequestOptionFunc) ([]*MergeRequestDiffVersion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/versions", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var v []*MergeRequestDiffVersion + resp, err := s.client.Do(req, &v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// GetSingleMergeRequestDiffVersion get a single MR diff version +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-a-single-merge-request-diff-version +func (s *MergeRequestsService) GetSingleMergeRequestDiffVersion(pid interface{}, mergeRequest, version int, options ...RequestOptionFunc) (*MergeRequestDiffVersion, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/versions/%d", PathEscape(project), mergeRequest, version) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + v := new(MergeRequestDiffVersion) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// SubscribeToMergeRequest subscribes the authenticated user to the given merge +// request to receive notifications. If the user is already subscribed to the +// merge request, the status code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#subscribe-to-a-merge-request +func (s *MergeRequestsService) SubscribeToMergeRequest(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/subscribe", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// UnsubscribeFromMergeRequest unsubscribes the authenticated user from the +// given merge request to not receive notifications from that merge request. +// If the user is not subscribed to the merge request, status code 304 is +// returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#unsubscribe-from-a-merge-request +func (s *MergeRequestsService) UnsubscribeFromMergeRequest(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/unsubscribe", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + m := new(MergeRequest) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// CreateTodo manually creates a todo for the current user on a merge request. +// If there already exists a todo for the user on that merge request, +// status code 304 is returned. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#create-a-to-do-item +func (s *MergeRequestsService) CreateTodo(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*Todo, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/todo", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(Todo) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// SetTimeEstimate sets the time estimate for a single project merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#set-a-time-estimate-for-a-merge-request +func (s *MergeRequestsService) SetTimeEstimate(pid interface{}, mergeRequest int, opt *SetTimeEstimateOptions, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.setTimeEstimate(pid, "merge_requests", mergeRequest, opt, options...) +} + +// ResetTimeEstimate resets the time estimate for a single project merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#reset-the-time-estimate-for-a-merge-request +func (s *MergeRequestsService) ResetTimeEstimate(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.resetTimeEstimate(pid, "merge_requests", mergeRequest, options...) +} + +// AddSpentTime adds spent time for a single project merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#add-spent-time-for-a-merge-request +func (s *MergeRequestsService) AddSpentTime(pid interface{}, mergeRequest int, opt *AddSpentTimeOptions, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.addSpentTime(pid, "merge_requests", mergeRequest, opt, options...) +} + +// ResetSpentTime resets the spent time for a single project merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#reset-spent-time-for-a-merge-request +func (s *MergeRequestsService) ResetSpentTime(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.resetSpentTime(pid, "merge_requests", mergeRequest, options...) +} + +// GetTimeSpent gets the spent time for a single project merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_requests.html#get-time-tracking-stats +func (s *MergeRequestsService) GetTimeSpent(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + return s.timeStats.getTimeSpent(pid, "merge_requests", mergeRequest, options...) +} diff --git a/vendor/github.com/xanzy/go-gitlab/metadata.go b/vendor/github.com/xanzy/go-gitlab/metadata.go new file mode 100644 index 0000000000..1713f3c3f2 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/metadata.go @@ -0,0 +1,63 @@ +// +// Copyright 2022, Timo Furrer +// +// 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 gitlab + +import "net/http" + +// MetadataService handles communication with the GitLab server instance to +// retrieve its metadata information via the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/metadata.html +type MetadataService struct { + client *Client +} + +// Metadata represents a GitLab instance version. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/metadata.html +type Metadata struct { + Version string `json:"version"` + Revision string `json:"revision"` + KAS struct { + Enabled bool `json:"enabled"` + ExternalURL string `json:"externalUrl"` + Version string `json:"version"` + } `json:"kas"` + Enterprise bool `json:"enterprise"` +} + +func (s Metadata) String() string { + return Stringify(s) +} + +// GetMetadata gets a GitLab server instance meteadata. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/metadata.html +func (s *MetadataService) GetMetadata(options ...RequestOptionFunc) (*Metadata, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "metadata", nil, options) + if err != nil { + return nil, nil, err + } + + v := new(Metadata) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/milestones.go b/vendor/github.com/xanzy/go-gitlab/milestones.go new file mode 100644 index 0000000000..cba00f577d --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/milestones.go @@ -0,0 +1,271 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// MilestonesService handles communication with the milestone related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/milestones.html +type MilestonesService struct { + client *Client +} + +// Milestone represents a GitLab milestone. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/milestones.html +type Milestone struct { + ID int `json:"id"` + IID int `json:"iid"` + ProjectID int `json:"project_id"` + Title string `json:"title"` + Description string `json:"description"` + StartDate *ISOTime `json:"start_date"` + DueDate *ISOTime `json:"due_date"` + State string `json:"state"` + WebURL string `json:"web_url"` + UpdatedAt *time.Time `json:"updated_at"` + CreatedAt *time.Time `json:"created_at"` + Expired *bool `json:"expired"` +} + +func (m Milestone) String() string { + return Stringify(m) +} + +// ListMilestonesOptions represents the available ListMilestones() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#list-project-milestones +type ListMilestonesOptions struct { + ListOptions + IIDs *[]int `url:"iids[],omitempty" json:"iids,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + State *string `url:"state,omitempty" json:"state,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + IncludeParentMilestones *bool `url:"include_parent_milestones,omitempty" json:"include_parent_milestones,omitempty"` +} + +// ListMilestones returns a list of project milestones. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#list-project-milestones +func (s *MilestonesService) ListMilestones(pid interface{}, opt *ListMilestonesOptions, options ...RequestOptionFunc) ([]*Milestone, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/milestones", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var m []*Milestone + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// GetMilestone gets a single project milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#get-single-milestone +func (s *MilestonesService) GetMilestone(pid interface{}, milestone int, options ...RequestOptionFunc) (*Milestone, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/milestones/%d", PathEscape(project), milestone) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + m := new(Milestone) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// CreateMilestoneOptions represents the available CreateMilestone() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#create-new-milestone +type CreateMilestoneOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + StartDate *ISOTime `url:"start_date,omitempty" json:"start_date,omitempty"` + DueDate *ISOTime `url:"due_date,omitempty" json:"due_date,omitempty"` +} + +// CreateMilestone creates a new project milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#create-new-milestone +func (s *MilestonesService) CreateMilestone(pid interface{}, opt *CreateMilestoneOptions, options ...RequestOptionFunc) (*Milestone, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/milestones", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(Milestone) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// UpdateMilestoneOptions represents the available UpdateMilestone() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#edit-milestone +type UpdateMilestoneOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + StartDate *ISOTime `url:"start_date,omitempty" json:"start_date,omitempty"` + DueDate *ISOTime `url:"due_date,omitempty" json:"due_date,omitempty"` + StateEvent *string `url:"state_event,omitempty" json:"state_event,omitempty"` +} + +// UpdateMilestone updates an existing project milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#edit-milestone +func (s *MilestonesService) UpdateMilestone(pid interface{}, milestone int, opt *UpdateMilestoneOptions, options ...RequestOptionFunc) (*Milestone, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/milestones/%d", PathEscape(project), milestone) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + m := new(Milestone) + resp, err := s.client.Do(req, m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// DeleteMilestone deletes a specified project milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#delete-project-milestone +func (s *MilestonesService) DeleteMilestone(pid interface{}, milestone int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/milestones/%d", PathEscape(project), milestone) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + return s.client.Do(req, nil) +} + +// GetMilestoneIssuesOptions represents the available GetMilestoneIssues() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#get-all-issues-assigned-to-a-single-milestone +type GetMilestoneIssuesOptions ListOptions + +// GetMilestoneIssues gets all issues assigned to a single project milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#get-all-issues-assigned-to-a-single-milestone +func (s *MilestonesService) GetMilestoneIssues(pid interface{}, milestone int, opt *GetMilestoneIssuesOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/milestones/%d/issues", PathEscape(project), milestone) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var i []*Issue + resp, err := s.client.Do(req, &i) + if err != nil { + return nil, resp, err + } + + return i, resp, err +} + +// GetMilestoneMergeRequestsOptions represents the available +// GetMilestoneMergeRequests() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#get-all-merge-requests-assigned-to-a-single-milestone +type GetMilestoneMergeRequestsOptions ListOptions + +// GetMilestoneMergeRequests gets all merge requests assigned to a single +// project milestone. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/milestones.html#get-all-merge-requests-assigned-to-a-single-milestone +func (s *MilestonesService) GetMilestoneMergeRequests(pid interface{}, milestone int, opt *GetMilestoneMergeRequestsOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/milestones/%d/merge_requests", PathEscape(project), milestone) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var mr []*MergeRequest + resp, err := s.client.Do(req, &mr) + if err != nil { + return nil, resp, err + } + + return mr, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/namespaces.go b/vendor/github.com/xanzy/go-gitlab/namespaces.go new file mode 100644 index 0000000000..26a0ccaf23 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/namespaces.go @@ -0,0 +1,174 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// NamespacesService handles communication with the namespace related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/namespaces.html +type NamespacesService struct { + client *Client +} + +// Namespace represents a GitLab namespace. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/namespaces.html +type Namespace struct { + ID int `json:"id"` + Name string `json:"name"` + Path string `json:"path"` + Kind string `json:"kind"` + FullPath string `json:"full_path"` + ParentID int `json:"parent_id"` + AvatarURL *string `json:"avatar_url"` + WebURL string `json:"web_url"` + MembersCountWithDescendants int `json:"members_count_with_descendants"` + BillableMembersCount int `json:"billable_members_count"` + Plan string `json:"plan"` + TrialEndsOn *ISOTime `json:"trial_ends_on"` + Trial bool `json:"trial"` + MaxSeatsUsed *int `json:"max_seats_used"` + SeatsInUse *int `json:"seats_in_use"` +} + +func (n Namespace) String() string { + return Stringify(n) +} + +// ListNamespacesOptions represents the available ListNamespaces() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/namespaces.html#list-namespaces +type ListNamespacesOptions struct { + ListOptions + Search *string `url:"search,omitempty" json:"search,omitempty"` + OwnedOnly *bool `url:"owned_only,omitempty" json:"owned_only,omitempty"` +} + +// ListNamespaces gets a list of projects accessible by the authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/namespaces.html#list-namespaces +func (s *NamespacesService) ListNamespaces(opt *ListNamespacesOptions, options ...RequestOptionFunc) ([]*Namespace, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "namespaces", opt, options) + if err != nil { + return nil, nil, err + } + + var n []*Namespace + resp, err := s.client.Do(req, &n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// SearchNamespace gets all namespaces that match your string in their name +// or path. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/namespaces.html#list-namespaces +func (s *NamespacesService) SearchNamespace(query string, options ...RequestOptionFunc) ([]*Namespace, *Response, error) { + var q struct { + Search string `url:"search,omitempty" json:"search,omitempty"` + } + q.Search = query + + req, err := s.client.NewRequest(http.MethodGet, "namespaces", &q, options) + if err != nil { + return nil, nil, err + } + + var n []*Namespace + resp, err := s.client.Do(req, &n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// GetNamespace gets a namespace by id. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/namespaces.html#get-namespace-by-id +func (s *NamespacesService) GetNamespace(id interface{}, options ...RequestOptionFunc) (*Namespace, *Response, error) { + namespace, err := parseID(id) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("namespaces/%s", PathEscape(namespace)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + n := new(Namespace) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// NamespaceExistance represents a namespace exists result. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/namespaces.html#get-existence-of-a-namespace +type NamespaceExistance struct { + Exists bool `json:"exists"` + Suggests []string `json:"suggests"` +} + +// NamespaceExistsOptions represents the available NamespaceExists() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/namespaces.html#get-existence-of-a-namespace +type NamespaceExistsOptions struct { + ParentID *int `url:"parent_id,omitempty" json:"parent_id,omitempty"` +} + +// NamespaceExists checks the existence of a namespace. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/namespaces.html#get-existence-of-a-namespace +func (s *NamespacesService) NamespaceExists(id interface{}, opt *NamespaceExistsOptions, options ...RequestOptionFunc) (*NamespaceExistance, *Response, error) { + namespace, err := parseID(id) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("namespaces/%s/exists", namespace) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(NamespaceExistance) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/notes.go b/vendor/github.com/xanzy/go-gitlab/notes.go new file mode 100644 index 0000000000..a71a947ba5 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/notes.go @@ -0,0 +1,693 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// NotesService handles communication with the notes related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/notes.html +type NotesService struct { + client *Client +} + +// Note represents a GitLab note. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/notes.html +type Note struct { + ID int `json:"id"` + Type NoteTypeValue `json:"type"` + Body string `json:"body"` + Attachment string `json:"attachment"` + Title string `json:"title"` + FileName string `json:"file_name"` + Author struct { + ID int `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Name string `json:"name"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"author"` + System bool `json:"system"` + ExpiresAt *time.Time `json:"expires_at"` + UpdatedAt *time.Time `json:"updated_at"` + CreatedAt *time.Time `json:"created_at"` + NoteableID int `json:"noteable_id"` + NoteableType string `json:"noteable_type"` + CommitID string `json:"commit_id"` + Position *NotePosition `json:"position"` + Resolvable bool `json:"resolvable"` + Resolved bool `json:"resolved"` + ResolvedBy struct { + ID int `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Name string `json:"name"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"resolved_by"` + ResolvedAt *time.Time `json:"resolved_at"` + NoteableIID int `json:"noteable_iid"` +} + +// NotePosition represents the position attributes of a note. +type NotePosition struct { + BaseSHA string `json:"base_sha"` + StartSHA string `json:"start_sha"` + HeadSHA string `json:"head_sha"` + PositionType string `json:"position_type"` + NewPath string `json:"new_path,omitempty"` + NewLine int `json:"new_line,omitempty"` + OldPath string `json:"old_path,omitempty"` + OldLine int `json:"old_line,omitempty"` + LineRange *LineRange `json:"line_range,omitempty"` +} + +// LineRange represents the range of a note. +type LineRange struct { + StartRange *LinePosition `json:"start"` + EndRange *LinePosition `json:"end"` +} + +// LinePosition represents a position in a line range. +type LinePosition struct { + LineCode string `json:"line_code"` + Type string `json:"type"` + OldLine int `json:"old_line"` + NewLine int `json:"new_line"` +} + +func (n Note) String() string { + return Stringify(n) +} + +// ListIssueNotesOptions represents the available ListIssueNotes() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-project-issue-notes +type ListIssueNotesOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListIssueNotes gets a list of all notes for a single issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-project-issue-notes +func (s *NotesService) ListIssueNotes(pid interface{}, issue int, opt *ListIssueNotesOptions, options ...RequestOptionFunc) ([]*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/notes", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var n []*Note + resp, err := s.client.Do(req, &n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// GetIssueNote returns a single note for a specific project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#get-single-issue-note +func (s *NotesService) GetIssueNote(pid interface{}, issue, note int, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/notes/%d", PathEscape(project), issue, note) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// CreateIssueNoteOptions represents the available CreateIssueNote() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-issue-note +type CreateIssueNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` + CreatedAt *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` +} + +// CreateIssueNote creates a new note to a single project issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-issue-note +func (s *NotesService) CreateIssueNote(pid interface{}, issue int, opt *CreateIssueNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/notes", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateIssueNoteOptions represents the available UpdateIssueNote() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-issue-note +type UpdateIssueNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` +} + +// UpdateIssueNote modifies existing note of an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-issue-note +func (s *NotesService) UpdateIssueNote(pid interface{}, issue, note int, opt *UpdateIssueNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/notes/%d", PathEscape(project), issue, note) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteIssueNote deletes an existing note of an issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#delete-an-issue-note +func (s *NotesService) DeleteIssueNote(pid interface{}, issue, note int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/notes/%d", PathEscape(project), issue, note) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListSnippetNotesOptions represents the available ListSnippetNotes() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-all-snippet-notes +type ListSnippetNotesOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListSnippetNotes gets a list of all notes for a single snippet. Snippet +// notes are comments users can post to a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-all-snippet-notes +func (s *NotesService) ListSnippetNotes(pid interface{}, snippet int, opt *ListSnippetNotesOptions, options ...RequestOptionFunc) ([]*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/notes", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var n []*Note + resp, err := s.client.Do(req, &n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// GetSnippetNote returns a single note for a given snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#get-single-snippet-note +func (s *NotesService) GetSnippetNote(pid interface{}, snippet, note int, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/notes/%d", PathEscape(project), snippet, note) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// CreateSnippetNoteOptions represents the available CreateSnippetNote() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-snippet-note +type CreateSnippetNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` +} + +// CreateSnippetNote creates a new note for a single snippet. Snippet notes are +// comments users can post to a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-snippet-note +func (s *NotesService) CreateSnippetNote(pid interface{}, snippet int, opt *CreateSnippetNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/notes", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateSnippetNoteOptions represents the available UpdateSnippetNote() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-snippet-note +type UpdateSnippetNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` +} + +// UpdateSnippetNote modifies existing note of a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-snippet-note +func (s *NotesService) UpdateSnippetNote(pid interface{}, snippet, note int, opt *UpdateSnippetNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/notes/%d", PathEscape(project), snippet, note) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteSnippetNote deletes an existing note of a snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#delete-a-snippet-note +func (s *NotesService) DeleteSnippetNote(pid interface{}, snippet, note int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/notes/%d", PathEscape(project), snippet, note) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListMergeRequestNotesOptions represents the available ListMergeRequestNotes() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-all-merge-request-notes +type ListMergeRequestNotesOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListMergeRequestNotes gets a list of all notes for a single merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-all-merge-request-notes +func (s *NotesService) ListMergeRequestNotes(pid interface{}, mergeRequest int, opt *ListMergeRequestNotesOptions, options ...RequestOptionFunc) ([]*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/notes", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var n []*Note + resp, err := s.client.Do(req, &n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// GetMergeRequestNote returns a single note for a given merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#get-single-merge-request-note +func (s *NotesService) GetMergeRequestNote(pid interface{}, mergeRequest, note int, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/notes/%d", PathEscape(project), mergeRequest, note) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// CreateMergeRequestNoteOptions represents the available +// CreateMergeRequestNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-merge-request-note +type CreateMergeRequestNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` +} + +// CreateMergeRequestNote creates a new note for a single merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-merge-request-note +func (s *NotesService) CreateMergeRequestNote(pid interface{}, mergeRequest int, opt *CreateMergeRequestNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/notes", PathEscape(project), mergeRequest) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateMergeRequestNoteOptions represents the available +// UpdateMergeRequestNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-merge-request-note +type UpdateMergeRequestNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` +} + +// UpdateMergeRequestNote modifies existing note of a merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-merge-request-note +func (s *NotesService) UpdateMergeRequestNote(pid interface{}, mergeRequest, note int, opt *UpdateMergeRequestNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/merge_requests/%d/notes/%d", PathEscape(project), mergeRequest, note) + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteMergeRequestNote deletes an existing note of a merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#delete-a-merge-request-note +func (s *NotesService) DeleteMergeRequestNote(pid interface{}, mergeRequest, note int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf( + "projects/%s/merge_requests/%d/notes/%d", PathEscape(project), mergeRequest, note) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListEpicNotesOptions represents the available ListEpicNotes() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-all-epic-notes +type ListEpicNotesOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListEpicNotes gets a list of all notes for a single epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#list-all-epic-notes +func (s *NotesService) ListEpicNotes(gid interface{}, epic int, opt *ListEpicNotesOptions, options ...RequestOptionFunc) ([]*Note, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/notes", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var n []*Note + resp, err := s.client.Do(req, &n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// GetEpicNote returns a single note for an epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#get-single-epic-note +func (s *NotesService) GetEpicNote(gid interface{}, epic, note int, options ...RequestOptionFunc) (*Note, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/notes/%d", PathEscape(group), epic, note) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// CreateEpicNoteOptions represents the available CreateEpicNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-epic-note +type CreateEpicNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` +} + +// CreateEpicNote creates a new note for a single merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#create-new-epic-note +func (s *NotesService) CreateEpicNote(gid interface{}, epic int, opt *CreateEpicNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/notes", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// UpdateEpicNoteOptions represents the available UpdateEpicNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-epic-note +type UpdateEpicNoteOptions struct { + Body *string `url:"body,omitempty" json:"body,omitempty"` +} + +// UpdateEpicNote modifies existing note of an epic. +// +// https://docs.gitlab.com/ee/api/notes.html#modify-existing-epic-note +func (s *NotesService) UpdateEpicNote(gid interface{}, epic, note int, opt *UpdateEpicNoteOptions, options ...RequestOptionFunc) (*Note, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/notes/%d", PathEscape(group), epic, note) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + n := new(Note) + resp, err := s.client.Do(req, n) + if err != nil { + return nil, resp, err + } + + return n, resp, err +} + +// DeleteEpicNote deletes an existing note of a merge request. +// +// https://docs.gitlab.com/ee/api/notes.html#delete-an-epic-note +func (s *NotesService) DeleteEpicNote(gid interface{}, epic, note int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/notes/%d", PathEscape(group), epic, note) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/notifications.go b/vendor/github.com/xanzy/go-gitlab/notifications.go new file mode 100644 index 0000000000..13b9aa645a --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/notifications.go @@ -0,0 +1,230 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "errors" + "fmt" + "net/http" +) + +// NotificationSettingsService handles communication with the notification settings +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/notification_settings.html +type NotificationSettingsService struct { + client *Client +} + +// NotificationSettings represents the Gitlab notification setting. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#valid-notification-levels +type NotificationSettings struct { + Level NotificationLevelValue `json:"level"` + NotificationEmail string `json:"notification_email"` + Events *NotificationEvents `json:"events"` +} + +// NotificationEvents represents the available notification setting events. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#valid-notification-levels +type NotificationEvents struct { + CloseIssue bool `json:"close_issue"` + CloseMergeRequest bool `json:"close_merge_request"` + FailedPipeline bool `json:"failed_pipeline"` + MergeMergeRequest bool `json:"merge_merge_request"` + NewIssue bool `json:"new_issue"` + NewMergeRequest bool `json:"new_merge_request"` + NewNote bool `json:"new_note"` + ReassignIssue bool `json:"reassign_issue"` + ReassignMergeRequest bool `json:"reassign_merge_request"` + ReopenIssue bool `json:"reopen_issue"` + ReopenMergeRequest bool `json:"reopen_merge_request"` + SuccessPipeline bool `json:"success_pipeline"` +} + +func (ns NotificationSettings) String() string { + return Stringify(ns) +} + +// GetGlobalSettings returns current notification settings and email address. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#global-notification-settings +func (s *NotificationSettingsService) GetGlobalSettings(options ...RequestOptionFunc) (*NotificationSettings, *Response, error) { + u := "notification_settings" + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ns := new(NotificationSettings) + resp, err := s.client.Do(req, ns) + if err != nil { + return nil, resp, err + } + + return ns, resp, err +} + +// NotificationSettingsOptions represents the available options that can be passed +// to the API when updating the notification settings. +type NotificationSettingsOptions struct { + Level *NotificationLevelValue `url:"level,omitempty" json:"level,omitempty"` + NotificationEmail *string `url:"notification_email,omitempty" json:"notification_email,omitempty"` + CloseIssue *bool `url:"close_issue,omitempty" json:"close_issue,omitempty"` + CloseMergeRequest *bool `url:"close_merge_request,omitempty" json:"close_merge_request,omitempty"` + FailedPipeline *bool `url:"failed_pipeline,omitempty" json:"failed_pipeline,omitempty"` + MergeMergeRequest *bool `url:"merge_merge_request,omitempty" json:"merge_merge_request,omitempty"` + NewIssue *bool `url:"new_issue,omitempty" json:"new_issue,omitempty"` + NewMergeRequest *bool `url:"new_merge_request,omitempty" json:"new_merge_request,omitempty"` + NewNote *bool `url:"new_note,omitempty" json:"new_note,omitempty"` + ReassignIssue *bool `url:"reassign_issue,omitempty" json:"reassign_issue,omitempty"` + ReassignMergeRequest *bool `url:"reassign_merge_request,omitempty" json:"reassign_merge_request,omitempty"` + ReopenIssue *bool `url:"reopen_issue,omitempty" json:"reopen_issue,omitempty"` + ReopenMergeRequest *bool `url:"reopen_merge_request,omitempty" json:"reopen_merge_request,omitempty"` + SuccessPipeline *bool `url:"success_pipeline,omitempty" json:"success_pipeline,omitempty"` +} + +// UpdateGlobalSettings updates current notification settings and email address. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#update-global-notification-settings +func (s *NotificationSettingsService) UpdateGlobalSettings(opt *NotificationSettingsOptions, options ...RequestOptionFunc) (*NotificationSettings, *Response, error) { + if opt.Level != nil && *opt.Level == GlobalNotificationLevel { + return nil, nil, errors.New( + "notification level 'global' is not valid for global notification settings") + } + + u := "notification_settings" + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ns := new(NotificationSettings) + resp, err := s.client.Do(req, ns) + if err != nil { + return nil, resp, err + } + + return ns, resp, err +} + +// GetSettingsForGroup returns current group notification settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#group--project-level-notification-settings +func (s *NotificationSettingsService) GetSettingsForGroup(gid interface{}, options ...RequestOptionFunc) (*NotificationSettings, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/notification_settings", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ns := new(NotificationSettings) + resp, err := s.client.Do(req, ns) + if err != nil { + return nil, resp, err + } + + return ns, resp, err +} + +// GetSettingsForProject returns current project notification settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#group--project-level-notification-settings +func (s *NotificationSettingsService) GetSettingsForProject(pid interface{}, options ...RequestOptionFunc) (*NotificationSettings, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/notification_settings", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ns := new(NotificationSettings) + resp, err := s.client.Do(req, ns) + if err != nil { + return nil, resp, err + } + + return ns, resp, err +} + +// UpdateSettingsForGroup updates current group notification settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#update-groupproject-level-notification-settings +func (s *NotificationSettingsService) UpdateSettingsForGroup(gid interface{}, opt *NotificationSettingsOptions, options ...RequestOptionFunc) (*NotificationSettings, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/notification_settings", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ns := new(NotificationSettings) + resp, err := s.client.Do(req, ns) + if err != nil { + return nil, resp, err + } + + return ns, resp, err +} + +// UpdateSettingsForProject updates current project notification settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/notification_settings.html#update-groupproject-level-notification-settings +func (s *NotificationSettingsService) UpdateSettingsForProject(pid interface{}, opt *NotificationSettingsOptions, options ...RequestOptionFunc) (*NotificationSettings, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/notification_settings", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ns := new(NotificationSettings) + resp, err := s.client.Do(req, ns) + if err != nil { + return nil, resp, err + } + + return ns, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/packages.go b/vendor/github.com/xanzy/go-gitlab/packages.go new file mode 100644 index 0000000000..e309ebdc76 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/packages.go @@ -0,0 +1,259 @@ +// +// Copyright 2021, Kordian Bruck +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// PackagesService handles communication with the packages related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/packages.html +type PackagesService struct { + client *Client +} + +// Package represents a GitLab package. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/packages.html +type Package struct { + ID int `json:"id"` + Name string `json:"name"` + Version string `json:"version"` + PackageType string `json:"package_type"` + Status string `json:"status"` + Links *PackageLinks `json:"_links"` + CreatedAt *time.Time `json:"created_at"` + LastDownloadedAt *time.Time `json:"last_downloaded_at"` + Tags []PackageTag `json:"tags"` +} + +func (s Package) String() string { + return Stringify(s) +} + +// GroupPackage represents a GitLab group package. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/packages.html +type GroupPackage struct { + Package + ProjectID int `json:"project_id"` + ProjectPath string `json:"project_path"` +} + +func (s GroupPackage) String() string { + return Stringify(s) +} + +// PackageLinks holds links for itself and deleting. +type PackageLinks struct { + WebPath string `json:"web_path"` + DeleteAPIPath string `json:"delete_api_path"` +} + +func (s PackageLinks) String() string { + return Stringify(s) +} + +// PackageTag holds label information about the package +type PackageTag struct { + ID int `json:"id"` + PackageID int `json:"package_id"` + Name string `json:"name"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` +} + +func (s PackageTag) String() string { + return Stringify(s) +} + +// PackageFile represents one file contained within a package. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/packages.html +type PackageFile struct { + ID int `json:"id"` + PackageID int `json:"package_id"` + CreatedAt *time.Time `json:"created_at"` + FileName string `json:"file_name"` + Size int `json:"size"` + FileMD5 string `json:"file_md5"` + FileSHA1 string `json:"file_sha1"` + Pipeline *[]Pipeline `json:"pipelines"` +} + +func (s PackageFile) String() string { + return Stringify(s) +} + +// ListProjectPackagesOptions represents the available ListProjectPackages() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#within-a-project +type ListProjectPackagesOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + PackageType *string `url:"package_type,omitempty" json:"package_type,omitempty"` + PackageName *string `url:"package_name,omitempty" json:"package_name,omitempty"` + IncludeVersionless *bool `url:"include_versionless,omitempty" json:"include_versionless,omitempty"` + Status *string `url:"status,omitempty" json:"status,omitempty"` +} + +// ListProjectPackages gets a list of packages in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#within-a-project +func (s *PackagesService) ListProjectPackages(pid interface{}, opt *ListProjectPackagesOptions, options ...RequestOptionFunc) ([]*Package, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/packages", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ps []*Package + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// ListGroupPackagesOptions represents the available ListGroupPackages() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#within-a-group +type ListGroupPackagesOptions struct { + ListOptions + ExcludeSubGroups *bool `url:"exclude_subgroups,omitempty" json:"exclude_subgroups,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + PackageType *string `url:"package_type,omitempty" json:"package_type,omitempty"` + PackageName *string `url:"package_name,omitempty" json:"package_name,omitempty"` + IncludeVersionless *bool `url:"include_versionless,omitempty" json:"include_versionless,omitempty"` + Status *string `url:"status,omitempty" json:"status,omitempty"` +} + +// ListGroupPackages gets a list of packages in a group. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#within-a-group +func (s *PackagesService) ListGroupPackages(gid interface{}, opt *ListGroupPackagesOptions, options ...RequestOptionFunc) ([]*GroupPackage, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/packages", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ps []*GroupPackage + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// ListPackageFilesOptions represents the available ListPackageFiles() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#list-package-files +type ListPackageFilesOptions ListOptions + +// ListPackageFiles gets a list of files that are within a package +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#list-package-files +func (s *PackagesService) ListPackageFiles(pid interface{}, pkg int, opt *ListPackageFilesOptions, options ...RequestOptionFunc) ([]*PackageFile, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/packages/%d/package_files", + PathEscape(project), + pkg, + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pfs []*PackageFile + resp, err := s.client.Do(req, &pfs) + if err != nil { + return nil, resp, err + } + + return pfs, resp, err +} + +// DeleteProjectPackage deletes a package in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#delete-a-project-package +func (s *PackagesService) DeleteProjectPackage(pid interface{}, pkg int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/packages/%d", PathEscape(project), pkg) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeletePackageFile deletes a file in project package +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/packages.html#delete-a-package-file +func (s *PackagesService) DeletePackageFile(pid interface{}, pkg, file int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/packages/%d/package_files/%d", PathEscape(project), pkg, file) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/pages.go b/vendor/github.com/xanzy/go-gitlab/pages.go new file mode 100644 index 0000000000..617b0ba4b9 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/pages.go @@ -0,0 +1,45 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +type PagesService struct { + client *Client +} + +// UnpublishPages unpublished pages. The user must have admin privileges. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages.html#unpublish-pages +func (s *PagesService) UnpublishPages(gid interface{}, options ...RequestOptionFunc) (*Response, error) { + page, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/pages", PathEscape(page)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/pages_domains.go b/vendor/github.com/xanzy/go-gitlab/pages_domains.go new file mode 100644 index 0000000000..c3b9aba902 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/pages_domains.go @@ -0,0 +1,216 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// PagesDomainsService handles communication with the pages domains +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pages_domains.html +type PagesDomainsService struct { + client *Client +} + +// PagesDomain represents a pages domain. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pages_domains.html +type PagesDomain struct { + Domain string `json:"domain"` + AutoSslEnabled bool `json:"auto_ssl_enabled"` + URL string `json:"url"` + ProjectID int `json:"project_id"` + Verified bool `json:"verified"` + VerificationCode string `json:"verification_code"` + EnabledUntil *time.Time `json:"enabled_until"` + Certificate struct { + Subject string `json:"subject"` + Expired bool `json:"expired"` + Expiration *time.Time `json:"expiration"` + Certificate string `json:"certificate"` + CertificateText string `json:"certificate_text"` + } `json:"certificate"` +} + +// ListPagesDomainsOptions represents the available ListPagesDomains() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#list-pages-domains +type ListPagesDomainsOptions ListOptions + +// ListPagesDomains gets a list of project pages domains. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#list-pages-domains +func (s *PagesDomainsService) ListPagesDomains(pid interface{}, opt *ListPagesDomainsOptions, options ...RequestOptionFunc) ([]*PagesDomain, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pages/domains", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pd []*PagesDomain + resp, err := s.client.Do(req, &pd) + if err != nil { + return nil, resp, err + } + + return pd, resp, err +} + +// ListAllPagesDomains gets a list of all pages domains. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#list-all-pages-domains +func (s *PagesDomainsService) ListAllPagesDomains(options ...RequestOptionFunc) ([]*PagesDomain, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "pages/domains", nil, options) + if err != nil { + return nil, nil, err + } + + var pd []*PagesDomain + resp, err := s.client.Do(req, &pd) + if err != nil { + return nil, resp, err + } + + return pd, resp, err +} + +// GetPagesDomain get a specific pages domain for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#single-pages-domain +func (s *PagesDomainsService) GetPagesDomain(pid interface{}, domain string, options ...RequestOptionFunc) (*PagesDomain, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pages/domains/%s", PathEscape(project), domain) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pd := new(PagesDomain) + resp, err := s.client.Do(req, pd) + if err != nil { + return nil, resp, err + } + + return pd, resp, err +} + +// CreatePagesDomainOptions represents the available CreatePagesDomain() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#create-new-pages-domain +type CreatePagesDomainOptions struct { + Domain *string `url:"domain,omitempty" json:"domain,omitempty"` + AutoSslEnabled *bool `url:"auto_ssl_enabled,omitempty" json:"auto_ssl_enabled,omitempty"` + Certificate *string `url:"certificate,omitempty" json:"certificate,omitempty"` + Key *string `url:"key,omitempty" json:"key,omitempty"` +} + +// CreatePagesDomain creates a new project pages domain. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#create-new-pages-domain +func (s *PagesDomainsService) CreatePagesDomain(pid interface{}, opt *CreatePagesDomainOptions, options ...RequestOptionFunc) (*PagesDomain, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pages/domains", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pd := new(PagesDomain) + resp, err := s.client.Do(req, pd) + if err != nil { + return nil, resp, err + } + + return pd, resp, err +} + +// UpdatePagesDomainOptions represents the available UpdatePagesDomain() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#update-pages-domain +type UpdatePagesDomainOptions struct { + AutoSslEnabled *bool `url:"auto_ssl_enabled,omitempty" json:"auto_ssl_enabled,omitempty"` + Certificate *string `url:"certificate,omitempty" json:"certificate,omitempty"` + Key *string `url:"key,omitempty" json:"key,omitempty"` +} + +// UpdatePagesDomain updates an existing project pages domain. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#update-pages-domain +func (s *PagesDomainsService) UpdatePagesDomain(pid interface{}, domain string, opt *UpdatePagesDomainOptions, options ...RequestOptionFunc) (*PagesDomain, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pages/domains/%s", PathEscape(project), domain) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + pd := new(PagesDomain) + resp, err := s.client.Do(req, pd) + if err != nil { + return nil, resp, err + } + + return pd, resp, err +} + +// DeletePagesDomain deletes an existing prject pages domain. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pages_domains.html#delete-pages-domain +func (s *PagesDomainsService) DeletePagesDomain(pid interface{}, domain string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/pages/domains/%s", PathEscape(project), domain) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/personal_access_tokens.go b/vendor/github.com/xanzy/go-gitlab/personal_access_tokens.go new file mode 100644 index 0000000000..07d6de28d9 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/personal_access_tokens.go @@ -0,0 +1,136 @@ +// +// Copyright 2022, Ryan Glab +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// PersonalAccessTokensService handles communication with the personal access +// tokens related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/personal_access_tokens.html +type PersonalAccessTokensService struct { + client *Client +} + +// PersonalAccessToken represents a personal access token. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/personal_access_tokens.html +type PersonalAccessToken struct { + ID int `json:"id"` + Name string `json:"name"` + Revoked bool `json:"revoked"` + CreatedAt *time.Time `json:"created_at"` + Scopes []string `json:"scopes"` + UserID int `json:"user_id"` + LastUsedAt *time.Time `json:"last_used_at,omitempty"` + Active bool `json:"active"` + ExpiresAt *ISOTime `json:"expires_at"` + Token string `json:"token,omitempty"` +} + +func (p PersonalAccessToken) String() string { + return Stringify(p) +} + +// ListPersonalAccessTokensOptions represents the available +// ListPersonalAccessTokens() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/personal_access_tokens.html#list-personal-access-tokens +type ListPersonalAccessTokensOptions struct { + ListOptions + UserID *int `url:"user_id,omitempty" json:"user_id,omitempty"` +} + +// ListPersonalAccessTokens gets a list of all personal access tokens. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/personal_access_tokens.html#list-personal-access-tokens +func (s *PersonalAccessTokensService) ListPersonalAccessTokens(opt *ListPersonalAccessTokensOptions, options ...RequestOptionFunc) ([]*PersonalAccessToken, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "personal_access_tokens", opt, options) + if err != nil { + return nil, nil, err + } + + var pats []*PersonalAccessToken + resp, err := s.client.Do(req, &pats) + if err != nil { + return nil, resp, err + } + + return pats, resp, err +} + +// GetSinglePersonalAccessTokenByID get a single personal access token by its ID. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/personal_access_tokens.html#using-a-personal-access-token-id +func (s *PersonalAccessTokensService) GetSinglePersonalAccessTokenByID(user int, options ...RequestOptionFunc) (*PersonalAccessToken, *Response, error) { + u := fmt.Sprintf("personal_access_tokens/%d", user) + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pat := new(PersonalAccessToken) + resp, err := s.client.Do(req, pat) + if err != nil { + return nil, resp, err + } + + return pat, resp, err +} + +// GetSinglePersonalAccessToken get a single personal access token by using +// passing the token in a header. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/personal_access_tokens.html#using-a-request-header +func (s *PersonalAccessTokensService) GetSinglePersonalAccessToken(options ...RequestOptionFunc) (*PersonalAccessToken, *Response, error) { + u := "personal_access_tokens/self" + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pat := new(PersonalAccessToken) + resp, err := s.client.Do(req, pat) + if err != nil { + return nil, resp, err + } + + return pat, resp, err +} + +// RevokePersonalAccessToken revokes a personal access token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/personal_access_tokens.html#revoke-a-personal-access-token +func (s *PersonalAccessTokensService) RevokePersonalAccessToken(token int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("personal_access_tokens/%d", token) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/pipeline_schedules.go b/vendor/github.com/xanzy/go-gitlab/pipeline_schedules.go new file mode 100644 index 0000000000..0f307cbe7f --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/pipeline_schedules.go @@ -0,0 +1,380 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// PipelineSchedulesService handles communication with the pipeline +// schedules related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipeline_schedules.html +type PipelineSchedulesService struct { + client *Client +} + +// PipelineSchedule represents a pipeline schedule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html +type PipelineSchedule struct { + ID int `json:"id"` + Description string `json:"description"` + Ref string `json:"ref"` + Cron string `json:"cron"` + CronTimezone string `json:"cron_timezone"` + NextRunAt *time.Time `json:"next_run_at"` + Active bool `json:"active"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + Owner *User `json:"owner"` + LastPipeline struct { + ID int `json:"id"` + SHA string `json:"sha"` + Ref string `json:"ref"` + Status string `json:"status"` + } `json:"last_pipeline"` + Variables []*PipelineVariable `json:"variables"` +} + +// ListPipelineSchedulesOptions represents the available ListPipelineTriggers() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#get-all-pipeline-schedules +type ListPipelineSchedulesOptions ListOptions + +// ListPipelineSchedules gets a list of project triggers. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#get-all-pipeline-schedules +func (s *PipelineSchedulesService) ListPipelineSchedules(pid interface{}, opt *ListPipelineSchedulesOptions, options ...RequestOptionFunc) ([]*PipelineSchedule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ps []*PipelineSchedule + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// GetPipelineSchedule gets a pipeline schedule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#get-a-single-pipeline-schedule +func (s *PipelineSchedulesService) GetPipelineSchedule(pid interface{}, schedule int, options ...RequestOptionFunc) (*PipelineSchedule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d", PathEscape(project), schedule) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineSchedule) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ListPipelinesTriggeredByScheduleOptions represents the available +// ListPipelinesTriggeredBySchedule() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#get-all-pipelines-triggered-by-a-pipeline-schedule +type ListPipelinesTriggeredByScheduleOptions ListOptions + +// ListPipelinesTriggeredBySchedule gets all pipelines triggered by a pipeline +// schedule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#get-all-pipelines-triggered-by-a-pipeline-schedule +func (s *PipelineSchedulesService) ListPipelinesTriggeredBySchedule(pid interface{}, schedule int, opt *ListPipelinesTriggeredByScheduleOptions, options ...RequestOptionFunc) ([]*Pipeline, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d/pipelines", PathEscape(project), schedule) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*Pipeline + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// CreatePipelineScheduleOptions represents the available +// CreatePipelineSchedule() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#create-a-new-pipeline-schedule +type CreatePipelineScheduleOptions struct { + Description *string `url:"description" json:"description"` + Ref *string `url:"ref" json:"ref"` + Cron *string `url:"cron" json:"cron"` + CronTimezone *string `url:"cron_timezone,omitempty" json:"cron_timezone,omitempty"` + Active *bool `url:"active,omitempty" json:"active,omitempty"` +} + +// CreatePipelineSchedule creates a pipeline schedule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#create-a-new-pipeline-schedule +func (s *PipelineSchedulesService) CreatePipelineSchedule(pid interface{}, opt *CreatePipelineScheduleOptions, options ...RequestOptionFunc) (*PipelineSchedule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineSchedule) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// EditPipelineScheduleOptions represents the available +// EditPipelineSchedule() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#edit-a-pipeline-schedule +type EditPipelineScheduleOptions struct { + Description *string `url:"description,omitempty" json:"description,omitempty"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + Cron *string `url:"cron,omitempty" json:"cron,omitempty"` + CronTimezone *string `url:"cron_timezone,omitempty" json:"cron_timezone,omitempty"` + Active *bool `url:"active,omitempty" json:"active,omitempty"` +} + +// EditPipelineSchedule edits a pipeline schedule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#edit-a-pipeline-schedule +func (s *PipelineSchedulesService) EditPipelineSchedule(pid interface{}, schedule int, opt *EditPipelineScheduleOptions, options ...RequestOptionFunc) (*PipelineSchedule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d", PathEscape(project), schedule) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineSchedule) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// TakeOwnershipOfPipelineSchedule sets the owner of the specified +// pipeline schedule to the user issuing the request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#take-ownership-of-a-pipeline-schedule +func (s *PipelineSchedulesService) TakeOwnershipOfPipelineSchedule(pid interface{}, schedule int, options ...RequestOptionFunc) (*PipelineSchedule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d/take_ownership", PathEscape(project), schedule) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineSchedule) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// DeletePipelineSchedule deletes a pipeline schedule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#delete-a-pipeline-schedule +func (s *PipelineSchedulesService) DeletePipelineSchedule(pid interface{}, schedule int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d", PathEscape(project), schedule) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// RunPipelineSchedule triggers a new scheduled pipeline to run immediately. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#run-a-scheduled-pipeline-immediately +func (s *PipelineSchedulesService) RunPipelineSchedule(pid interface{}, schedule int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d/play", PathEscape(project), schedule) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// CreatePipelineScheduleVariableOptions represents the available +// CreatePipelineScheduleVariable() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#create-a-new-pipeline-schedule +type CreatePipelineScheduleVariableOptions struct { + Key *string `url:"key" json:"key"` + Value *string `url:"value" json:"value"` + VariableType *string `url:"variable_type,omitempty" json:"variable_type,omitempty"` +} + +// CreatePipelineScheduleVariable creates a pipeline schedule variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#create-a-new-pipeline-schedule +func (s *PipelineSchedulesService) CreatePipelineScheduleVariable(pid interface{}, schedule int, opt *CreatePipelineScheduleVariableOptions, options ...RequestOptionFunc) (*PipelineVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d/variables", PathEscape(project), schedule) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineVariable) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// EditPipelineScheduleVariableOptions represents the available +// EditPipelineScheduleVariable() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#edit-a-pipeline-schedule-variable +type EditPipelineScheduleVariableOptions struct { + Value *string `url:"value" json:"value"` + VariableType *string `url:"variable_type,omitempty" json:"variable_type,omitempty"` +} + +// EditPipelineScheduleVariable creates a pipeline schedule variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#edit-a-pipeline-schedule-variable +func (s *PipelineSchedulesService) EditPipelineScheduleVariable(pid interface{}, schedule int, key string, opt *EditPipelineScheduleVariableOptions, options ...RequestOptionFunc) (*PipelineVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d/variables/%s", PathEscape(project), schedule, key) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineVariable) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// DeletePipelineScheduleVariable creates a pipeline schedule variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_schedules.html#delete-a-pipeline-schedule-variable +func (s *PipelineSchedulesService) DeletePipelineScheduleVariable(pid interface{}, schedule int, key string, options ...RequestOptionFunc) (*PipelineVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline_schedules/%d/variables/%s", PathEscape(project), schedule, key) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineVariable) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/pipeline_triggers.go b/vendor/github.com/xanzy/go-gitlab/pipeline_triggers.go new file mode 100644 index 0000000000..01b3f6b0d3 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/pipeline_triggers.go @@ -0,0 +1,248 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// PipelineTriggersService handles Project pipeline triggers. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html +type PipelineTriggersService struct { + client *Client +} + +// PipelineTrigger represents a project pipeline trigger. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html +type PipelineTrigger struct { + ID int `json:"id"` + Description string `json:"description"` + CreatedAt *time.Time `json:"created_at"` + DeletedAt *time.Time `json:"deleted_at"` + LastUsed *time.Time `json:"last_used"` + Token string `json:"token"` + UpdatedAt *time.Time `json:"updated_at"` + Owner *User `json:"owner"` +} + +// ListPipelineTriggersOptions represents the available ListPipelineTriggers() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#list-project-trigger-tokens +type ListPipelineTriggersOptions ListOptions + +// ListPipelineTriggers gets a list of project triggers. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#list-project-trigger-tokens +func (s *PipelineTriggersService) ListPipelineTriggers(pid interface{}, opt *ListPipelineTriggersOptions, options ...RequestOptionFunc) ([]*PipelineTrigger, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/triggers", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pt []*PipelineTrigger + resp, err := s.client.Do(req, &pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// GetPipelineTrigger gets a specific pipeline trigger for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#get-trigger-token-details +func (s *PipelineTriggersService) GetPipelineTrigger(pid interface{}, trigger int, options ...RequestOptionFunc) (*PipelineTrigger, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/triggers/%d", PathEscape(project), trigger) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pt := new(PipelineTrigger) + resp, err := s.client.Do(req, pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// AddPipelineTriggerOptions represents the available AddPipelineTrigger() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#create-a-trigger-token +type AddPipelineTriggerOptions struct { + Description *string `url:"description,omitempty" json:"description,omitempty"` +} + +// AddPipelineTrigger adds a pipeline trigger to a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#create-a-trigger-token +func (s *PipelineTriggersService) AddPipelineTrigger(pid interface{}, opt *AddPipelineTriggerOptions, options ...RequestOptionFunc) (*PipelineTrigger, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/triggers", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pt := new(PipelineTrigger) + resp, err := s.client.Do(req, pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// EditPipelineTriggerOptions represents the available EditPipelineTrigger() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#update-a-project-trigger-token +type EditPipelineTriggerOptions struct { + Description *string `url:"description,omitempty" json:"description,omitempty"` +} + +// EditPipelineTrigger edits a trigger for a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#update-a-project-trigger-token +func (s *PipelineTriggersService) EditPipelineTrigger(pid interface{}, trigger int, opt *EditPipelineTriggerOptions, options ...RequestOptionFunc) (*PipelineTrigger, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/triggers/%d", PathEscape(project), trigger) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + pt := new(PipelineTrigger) + resp, err := s.client.Do(req, pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// TakeOwnershipOfPipelineTrigger sets the owner of the specified +// pipeline trigger to the user issuing the request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#take-ownership-of-a-project-trigger +func (s *PipelineTriggersService) TakeOwnershipOfPipelineTrigger(pid interface{}, trigger int, options ...RequestOptionFunc) (*PipelineTrigger, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/triggers/%d/take_ownership", PathEscape(project), trigger) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + pt := new(PipelineTrigger) + resp, err := s.client.Do(req, pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// DeletePipelineTrigger removes a trigger from a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#remove-a-project-trigger-token +func (s *PipelineTriggersService) DeletePipelineTrigger(pid interface{}, trigger int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/triggers/%d", PathEscape(project), trigger) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// RunPipelineTriggerOptions represents the available RunPipelineTrigger() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#trigger-a-pipeline-with-a-token +type RunPipelineTriggerOptions struct { + Ref *string `url:"ref" json:"ref"` + Token *string `url:"token" json:"token"` + Variables map[string]string `url:"variables,omitempty" json:"variables,omitempty"` +} + +// RunPipelineTrigger starts a trigger from a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipeline_triggers.html#trigger-a-pipeline-with-a-token +func (s *PipelineTriggersService) RunPipelineTrigger(pid interface{}, opt *RunPipelineTriggerOptions, options ...RequestOptionFunc) (*Pipeline, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/trigger/pipeline", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pt := new(Pipeline) + resp, err := s.client.Do(req, pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/pipelines.go b/vendor/github.com/xanzy/go-gitlab/pipelines.go new file mode 100644 index 0000000000..df77edfcf4 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/pipelines.go @@ -0,0 +1,412 @@ +// +// Copyright 2021, Igor Varavko +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// PipelinesService handles communication with the repositories related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html +type PipelinesService struct { + client *Client +} + +// PipelineVariable represents a pipeline variable. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html +type PipelineVariable struct { + Key string `json:"key"` + Value string `json:"value"` + VariableType string `json:"variable_type"` +} + +// Pipeline represents a GitLab pipeline. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html +type Pipeline struct { + ID int `json:"id"` + IID int `json:"iid"` + ProjectID int `json:"project_id"` + Status string `json:"status"` + Source string `json:"source"` + Ref string `json:"ref"` + SHA string `json:"sha"` + BeforeSHA string `json:"before_sha"` + Tag bool `json:"tag"` + YamlErrors string `json:"yaml_errors"` + User *BasicUser `json:"user"` + UpdatedAt *time.Time `json:"updated_at"` + CreatedAt *time.Time `json:"created_at"` + StartedAt *time.Time `json:"started_at"` + FinishedAt *time.Time `json:"finished_at"` + CommittedAt *time.Time `json:"committed_at"` + Duration int `json:"duration"` + QueuedDuration int `json:"queued_duration"` + Coverage string `json:"coverage"` + WebURL string `json:"web_url"` + DetailedStatus *DetailedStatus `json:"detailed_status"` +} + +// DetailedStatus contains detailed information about the status of a pipeline. +type DetailedStatus struct { + Icon string `json:"icon"` + Text string `json:"text"` + Label string `json:"label"` + Group string `json:"group"` + Tooltip string `json:"tooltip"` + HasDetails bool `json:"has_details"` + DetailsPath string `json:"details_path"` + Illustration struct { + Image string `json:"image"` + } `json:"illustration"` + Favicon string `json:"favicon"` +} + +func (p Pipeline) String() string { + return Stringify(p) +} + +// PipelineTestReport contains a detailed report of a test run. +type PipelineTestReport struct { + TotalTime float64 `json:"total_time"` + TotalCount int `json:"total_count"` + SuccessCount int `json:"success_count"` + FailedCount int `json:"failed_count"` + SkippedCount int `json:"skipped_count"` + ErrorCount int `json:"error_count"` + TestSuites []*PipelineTestSuites `json:"test_suites"` +} + +// PipelineTestSuites contains test suites results. +type PipelineTestSuites struct { + Name string `json:"name"` + TotalTime float64 `json:"total_time"` + TotalCount int `json:"total_count"` + SuccessCount int `json:"success_count"` + FailedCount int `json:"failed_count"` + SkippedCount int `json:"skipped_count"` + ErrorCount int `json:"error_count"` + TestCases []*PipelineTestCases `json:"test_cases"` +} + +// PipelineTestCases contains test cases details. +type PipelineTestCases struct { + Status string `json:"status"` + Name string `json:"name"` + Classname string `json:"classname"` + File string `json:"file"` + ExecutionTime float64 `json:"execution_time"` + SystemOutput *SystemOutput `json:"system_output"` + StackTrace string `json:"stack_trace"` + AttachmentURL string `json:"attachment_url"` + RecentFailures *RecentFailures `json:"recent_failures"` +} + +// SystemOutput contains information about test cases when it fails. +type SystemOutput struct { + Type string `json:"type"` + Message string `json:"message"` +} + +// RecentFailures contains failures count for the project's default branch. +type RecentFailures struct { + Count int `json:"count"` + BaseBranch string `json:"base_branch"` +} + +func (p PipelineTestReport) String() string { + return Stringify(p) +} + +// PipelineInfo shows the basic entities of a pipeline, mostly used as fields +// on other assets, like Commit. +type PipelineInfo struct { + ID int `json:"id"` + ProjectID int `json:"project_id"` + Status string `json:"status"` + Source string `json:"source"` + Ref string `json:"ref"` + SHA string `json:"sha"` + WebURL string `json:"web_url"` + UpdatedAt *time.Time `json:"updated_at"` + CreatedAt *time.Time `json:"created_at"` +} + +func (p PipelineInfo) String() string { + return Stringify(p) +} + +// ListProjectPipelinesOptions represents the available ListProjectPipelines() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines +type ListProjectPipelinesOptions struct { + ListOptions + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` + Status *BuildStateValue `url:"status,omitempty" json:"status,omitempty"` + Source *string `url:"source,omitempty" json:"source,omitempty"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + SHA *string `url:"sha,omitempty" json:"sha,omitempty"` + YamlErrors *bool `url:"yaml_errors,omitempty" json:"yaml_errors,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + UpdatedAfter *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"` + UpdatedBefore *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListProjectPipelines gets a list of project piplines. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines +func (s *PipelinesService) ListProjectPipelines(pid interface{}, opt *ListProjectPipelinesOptions, options ...RequestOptionFunc) ([]*PipelineInfo, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*PipelineInfo + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// GetPipeline gets a single project pipeline. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-a-single-pipeline +func (s *PipelinesService) GetPipeline(pid interface{}, pipeline int, options ...RequestOptionFunc) (*Pipeline, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d", PathEscape(project), pipeline) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(Pipeline) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// GetPipelineVariables gets the variables of a single project pipeline. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-variables-of-a-pipeline +func (s *PipelinesService) GetPipelineVariables(pid interface{}, pipeline int, options ...RequestOptionFunc) ([]*PipelineVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d/variables", PathEscape(project), pipeline) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var p []*PipelineVariable + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// GetPipelineTestReport gets the test report of a single project pipeline. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-a-pipelines-test-report +func (s *PipelinesService) GetPipelineTestReport(pid interface{}, pipeline int, options ...RequestOptionFunc) (*PipelineTestReport, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d/test_report", PathEscape(project), pipeline) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(PipelineTestReport) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// GetLatestPipelineOptions represents the available GetLatestPipeline() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-the-latest-pipeline +type GetLatestPipelineOptions struct { + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` +} + +// GetLatestPipeline gets the latest pipeline for a specific ref in a project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-the-latest-pipeline +func (s *PipelinesService) GetLatestPipeline(pid interface{}, opt *GetLatestPipelineOptions, options ...RequestOptionFunc) (*Pipeline, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/latest", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(Pipeline) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// CreatePipelineOptions represents the available CreatePipeline() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline +type CreatePipelineOptions struct { + Ref *string `url:"ref" json:"ref"` + Variables *[]*PipelineVariableOptions `url:"variables,omitempty" json:"variables,omitempty"` +} + +// PipelineVariable represents a pipeline variable. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline +type PipelineVariableOptions struct { + Key *string `url:"key,omitempty" json:"key,omitempty"` + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *string `url:"variable_type,omitempty" json:"variable_type,omitempty"` +} + +// CreatePipeline creates a new project pipeline. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline +func (s *PipelinesService) CreatePipeline(pid interface{}, opt *CreatePipelineOptions, options ...RequestOptionFunc) (*Pipeline, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipeline", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(Pipeline) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// RetryPipelineBuild retries failed builds in a pipeline +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipelines.html#retry-jobs-in-a-pipeline +func (s *PipelinesService) RetryPipelineBuild(pid interface{}, pipeline int, options ...RequestOptionFunc) (*Pipeline, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d/retry", PathEscape(project), pipeline) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(Pipeline) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// CancelPipelineBuild cancels a pipeline builds +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipelines.html#cancel-a-pipelines-jobs +func (s *PipelinesService) CancelPipelineBuild(pid interface{}, pipeline int, options ...RequestOptionFunc) (*Pipeline, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d/cancel", PathEscape(project), pipeline) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(Pipeline) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// DeletePipeline deletes an existing pipeline. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/pipelines.html#delete-a-pipeline +func (s *PipelinesService) DeletePipeline(pid interface{}, pipeline int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/pipelines/%d", PathEscape(project), pipeline) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/plan_limits.go b/vendor/github.com/xanzy/go-gitlab/plan_limits.go new file mode 100644 index 0000000000..e6be78f994 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/plan_limits.go @@ -0,0 +1,104 @@ +// +// Copyright 2021, Igor Varavko +// +// 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 gitlab + +import "net/http" + +// PlanLimitsService handles communication with the repositories related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/plan_limits.html +type PlanLimitsService struct { + client *Client +} + +// PlanLimit represents a GitLab pipeline. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/plan_limits.html +type PlanLimit struct { + ConanMaxFileSize int `json:"conan_max_file_size,omitempty"` + GenericPackagesMaxFileSize int `json:"generic_packages_max_file_size,omitempty"` + HelmMaxFileSize int `json:"helm_max_file_size,omitempty"` + MavenMaxFileSize int `json:"maven_max_file_size,omitempty"` + NPMMaxFileSize int `json:"npm_max_file_size,omitempty"` + NugetMaxFileSize int `json:"nuget_max_file_size,omitempty"` + PyPiMaxFileSize int `json:"pypi_max_file_size,omitempty"` + TerraformModuleMaxFileSize int `json:"terraform_module_max_file_size,omitempty"` +} + +// GetCurrentPlanLimitsOptions represents the available GetCurrentPlanLimits() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/plan_limits.html#get-current-plan-limits +type GetCurrentPlanLimitsOptions struct { + PlanName *string `url:"plan_name,omitempty" json:"plan_name,omitempty"` +} + +// List the current limits of a plan on the GitLab instance. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/plan_limits.html#get-current-plan-limits +func (s *PlanLimitsService) GetCurrentPlanLimits(opt *GetCurrentPlanLimitsOptions, options ...RequestOptionFunc) (*PlanLimit, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "application/plan_limits", opt, options) + if err != nil { + return nil, nil, err + } + + pl := new(PlanLimit) + resp, err := s.client.Do(req, pl) + if err != nil { + return nil, resp, err + } + + return pl, resp, err +} + +// ChangePlanLimitOptions represents the available ChangePlanLimits() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/plan_limits.html#change-plan-limits +type ChangePlanLimitOptions struct { + PlanName *string `url:"plan_name,omitempty" json:"plan_name,omitempty"` + ConanMaxFileSize *int `url:"conan_max_file_size,omitempty" json:"conan_max_file_size,omitempty"` + GenericPackagesMaxFileSize *int `url:"generic_packages_max_file_size,omitempty" json:"generic_packages_max_file_size,omitempty"` + HelmMaxFileSize *int `url:"helm_max_file_size,omitempty" json:"helm_max_file_size,omitempty"` + MavenMaxFileSize *int `url:"maven_max_file_size,omitempty" json:"maven_max_file_size,omitempty"` + NPMMaxFileSize *int `url:"npm_max_file_size,omitempty" json:"npm_max_file_size,omitempty"` + NugetMaxFileSize *int `url:"nuget_max_file_size,omitempty" json:"nuget_max_file_size,omitempty"` + PyPiMaxFileSize *int `url:"pypi_max_file_size,omitempty" json:"pypi_max_file_size,omitempty"` + TerraformModuleMaxFileSize *int `url:"terraform_module_max_file_size,omitempty" json:"terraform_module_max_file_size,omitempty"` +} + +// ChangePlanLimits modifies the limits of a plan on the GitLab instance. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/plan_limits.html#change-plan-limits +func (s *PlanLimitsService) ChangePlanLimits(opt *ChangePlanLimitOptions, options ...RequestOptionFunc) (*PlanLimit, *Response, error) { + req, err := s.client.NewRequest(http.MethodPut, "application/plan_limits", opt, options) + if err != nil { + return nil, nil, err + } + + pl := new(PlanLimit) + resp, err := s.client.Do(req, pl) + if err != nil { + return nil, resp, err + } + + return pl, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_access_tokens.go b/vendor/github.com/xanzy/go-gitlab/project_access_tokens.go new file mode 100644 index 0000000000..1c0d3c7533 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_access_tokens.go @@ -0,0 +1,166 @@ +// +// Copyright 2021, Patrick Webster +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ProjectAccessTokensService handles communication with the +// project access tokens related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_access_tokens.html +type ProjectAccessTokensService struct { + client *Client +} + +// ProjectAccessToken represents a GitLab project access token. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_access_tokens.html +type ProjectAccessToken struct { + ID int `json:"id"` + UserID int `json:"user_id"` + Name string `json:"name"` + Scopes []string `json:"scopes"` + CreatedAt *time.Time `json:"created_at"` + LastUsedAt *time.Time `json:"last_used_at"` + ExpiresAt *ISOTime `json:"expires_at"` + Active bool `json:"active"` + Revoked bool `json:"revoked"` + Token string `json:"token"` + AccessLevel AccessLevelValue `json:"access_level"` +} + +func (v ProjectAccessToken) String() string { + return Stringify(v) +} + +// ListProjectAccessTokensOptions represents the available +// ListProjectAccessTokens() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_access_tokens.html#list-project-access-tokens +type ListProjectAccessTokensOptions ListOptions + +// ListProjectAccessTokens gets a list of all project access tokens in a +// project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_access_tokens.html#list-project-access-tokens +func (s *ProjectAccessTokensService) ListProjectAccessTokens(pid interface{}, opt *ListProjectAccessTokensOptions, options ...RequestOptionFunc) ([]*ProjectAccessToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/access_tokens", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pats []*ProjectAccessToken + resp, err := s.client.Do(req, &pats) + if err != nil { + return nil, resp, err + } + + return pats, resp, err +} + +// GetProjectAccessToken gets a single project access tokens in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_access_tokens.html#get-a-project-access-token +func (s *ProjectAccessTokensService) GetProjectAccessToken(pid interface{}, id int, options ...RequestOptionFunc) (*ProjectAccessToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/access_tokens/%d", PathEscape(project), id) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pat := new(ProjectAccessToken) + resp, err := s.client.Do(req, &pat) + if err != nil { + return nil, resp, err + } + + return pat, resp, err +} + +// CreateProjectAccessTokenOptions represents the available CreateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_access_tokens.html#create-a-project-access-token +type CreateProjectAccessTokenOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Scopes *[]string `url:"scopes,omitempty" json:"scopes,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// CreateProjectAccessToken creates a new project access token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_access_tokens.html#create-a-project-access-token +func (s *ProjectAccessTokensService) CreateProjectAccessToken(pid interface{}, opt *CreateProjectAccessTokenOptions, options ...RequestOptionFunc) (*ProjectAccessToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/access_tokens", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pat := new(ProjectAccessToken) + resp, err := s.client.Do(req, pat) + if err != nil { + return nil, resp, err + } + + return pat, resp, err +} + +// RevokeProjectAccessToken revokes a project access token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_access_tokens.html#revoke-a-project-access-token +func (s *ProjectAccessTokensService) RevokeProjectAccessToken(pid interface{}, id int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/access_tokens/%d", PathEscape(project), id) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_badges.go b/vendor/github.com/xanzy/go-gitlab/project_badges.go new file mode 100644 index 0000000000..aa62a1f62d --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_badges.go @@ -0,0 +1,230 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ProjectBadge represents a project badge. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#list-all-badges-of-a-project +type ProjectBadge struct { + ID int `json:"id"` + Name string `json:"name"` + LinkURL string `json:"link_url"` + ImageURL string `json:"image_url"` + RenderedLinkURL string `json:"rendered_link_url"` + RenderedImageURL string `json:"rendered_image_url"` + // Kind represents a project badge kind. Can be empty, when used PreviewProjectBadge(). + Kind string `json:"kind"` +} + +// ProjectBadgesService handles communication with the project badges +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_badges.html +type ProjectBadgesService struct { + client *Client +} + +// ListProjectBadgesOptions represents the available ListProjectBadges() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#list-all-badges-of-a-project +type ListProjectBadgesOptions struct { + ListOptions + Name *string `url:"name,omitempty" json:"name,omitempty"` +} + +// ListProjectBadges gets a list of a project's badges and its group badges. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#list-all-badges-of-a-project +func (s *ProjectBadgesService) ListProjectBadges(pid interface{}, opt *ListProjectBadgesOptions, options ...RequestOptionFunc) ([]*ProjectBadge, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/badges", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pb []*ProjectBadge + resp, err := s.client.Do(req, &pb) + if err != nil { + return nil, resp, err + } + + return pb, resp, err +} + +// GetProjectBadge gets a project badge. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#get-a-badge-of-a-project +func (s *ProjectBadgesService) GetProjectBadge(pid interface{}, badge int, options ...RequestOptionFunc) (*ProjectBadge, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/badges/%d", PathEscape(project), badge) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pb := new(ProjectBadge) + resp, err := s.client.Do(req, pb) + if err != nil { + return nil, resp, err + } + + return pb, resp, err +} + +// AddProjectBadgeOptions represents the available AddProjectBadge() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#add-a-badge-to-a-project +type AddProjectBadgeOptions struct { + LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"` + ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` +} + +// AddProjectBadge adds a badge to a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#add-a-badge-to-a-project +func (s *ProjectBadgesService) AddProjectBadge(pid interface{}, opt *AddProjectBadgeOptions, options ...RequestOptionFunc) (*ProjectBadge, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/badges", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pb := new(ProjectBadge) + resp, err := s.client.Do(req, pb) + if err != nil { + return nil, resp, err + } + + return pb, resp, err +} + +// EditProjectBadgeOptions represents the available EditProjectBadge() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#edit-a-badge-of-a-project +type EditProjectBadgeOptions struct { + LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"` + ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` +} + +// EditProjectBadge updates a badge of a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#edit-a-badge-of-a-project +func (s *ProjectBadgesService) EditProjectBadge(pid interface{}, badge int, opt *EditProjectBadgeOptions, options ...RequestOptionFunc) (*ProjectBadge, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/badges/%d", PathEscape(project), badge) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + pb := new(ProjectBadge) + resp, err := s.client.Do(req, pb) + if err != nil { + return nil, resp, err + } + + return pb, resp, err +} + +// DeleteProjectBadge removes a badge from a project. Only project's +// badges will be removed by using this endpoint. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#remove-a-badge-from-a-project +func (s *ProjectBadgesService) DeleteProjectBadge(pid interface{}, badge int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/badges/%d", PathEscape(project), badge) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ProjectBadgePreviewOptions represents the available PreviewProjectBadge() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#preview-a-badge-from-a-project +type ProjectBadgePreviewOptions struct { + LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"` + ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"` +} + +// PreviewProjectBadge returns how the link_url and image_url final URLs would be after +// resolving the placeholder interpolation. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_badges.html#preview-a-badge-from-a-project +func (s *ProjectBadgesService) PreviewProjectBadge(pid interface{}, opt *ProjectBadgePreviewOptions, options ...RequestOptionFunc) (*ProjectBadge, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/badges/render", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + pb := new(ProjectBadge) + resp, err := s.client.Do(req, &pb) + if err != nil { + return nil, resp, err + } + + return pb, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_clusters.go b/vendor/github.com/xanzy/go-gitlab/project_clusters.go new file mode 100644 index 0000000000..f515821a7a --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_clusters.go @@ -0,0 +1,236 @@ +// +// Copyright 2021, Matej Velikonja +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ProjectClustersService handles communication with the +// project clusters related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html +type ProjectClustersService struct { + client *Client +} + +// ProjectCluster represents a GitLab Project Cluster. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_clusters.html +type ProjectCluster struct { + ID int `json:"id"` + Name string `json:"name"` + Domain string `json:"domain"` + CreatedAt *time.Time `json:"created_at"` + ProviderType string `json:"provider_type"` + PlatformType string `json:"platform_type"` + EnvironmentScope string `json:"environment_scope"` + ClusterType string `json:"cluster_type"` + User *User `json:"user"` + PlatformKubernetes *PlatformKubernetes `json:"platform_kubernetes"` + ManagementProject *ManagementProject `json:"management_project"` + Project *Project `json:"project"` +} + +func (v ProjectCluster) String() string { + return Stringify(v) +} + +// PlatformKubernetes represents a GitLab Project Cluster PlatformKubernetes. +type PlatformKubernetes struct { + APIURL string `json:"api_url"` + Token string `json:"token"` + CaCert string `json:"ca_cert"` + Namespace string `json:"namespace"` + AuthorizationType string `json:"authorization_type"` +} + +// ManagementProject represents a GitLab Project Cluster management_project. +type ManagementProject struct { + ID int `json:"id"` + Description string `json:"description"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + CreatedAt *time.Time `json:"created_at"` +} + +// ListClusters gets a list of all clusters in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html#list-project-clusters +func (s *ProjectClustersService) ListClusters(pid interface{}, options ...RequestOptionFunc) ([]*ProjectCluster, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/clusters", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var pcs []*ProjectCluster + resp, err := s.client.Do(req, &pcs) + if err != nil { + return nil, resp, err + } + + return pcs, resp, err +} + +// GetCluster gets a cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html#get-a-single-project-cluster +func (s *ProjectClustersService) GetCluster(pid interface{}, cluster int, options ...RequestOptionFunc) (*ProjectCluster, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/clusters/%d", PathEscape(project), cluster) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pc := new(ProjectCluster) + resp, err := s.client.Do(req, &pc) + if err != nil { + return nil, resp, err + } + + return pc, resp, err +} + +// AddClusterOptions represents the available AddCluster() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html#add-existing-cluster-to-project +type AddClusterOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Domain *string `url:"domain,omitempty" json:"domain,omitempty"` + Enabled *bool `url:"enabled,omitempty" json:"enabled,omitempty"` + Managed *bool `url:"managed,omitempty" json:"managed,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` + PlatformKubernetes *AddPlatformKubernetesOptions `url:"platform_kubernetes_attributes,omitempty" json:"platform_kubernetes_attributes,omitempty"` + ManagementProjectID *string `url:"management_project_id,omitempty" json:"management_project_id,omitempty"` +} + +// AddPlatformKubernetesOptions represents the available PlatformKubernetes options for adding. +type AddPlatformKubernetesOptions struct { + APIURL *string `url:"api_url,omitempty" json:"api_url,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` + CaCert *string `url:"ca_cert,omitempty" json:"ca_cert,omitempty"` + Namespace *string `url:"namespace,omitempty" json:"namespace,omitempty"` + AuthorizationType *string `url:"authorization_type,omitempty" json:"authorization_type,omitempty"` +} + +// AddCluster adds an existing cluster to the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html#add-existing-cluster-to-project +func (s *ProjectClustersService) AddCluster(pid interface{}, opt *AddClusterOptions, options ...RequestOptionFunc) (*ProjectCluster, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/clusters/user", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pc := new(ProjectCluster) + resp, err := s.client.Do(req, pc) + if err != nil { + return nil, resp, err + } + + return pc, resp, err +} + +// EditClusterOptions represents the available EditCluster() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html#edit-project-cluster +type EditClusterOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Domain *string `url:"domain,omitempty" json:"domain,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` + ManagementProjectID *string `url:"management_project_id,omitempty" json:"management_project_id,omitempty"` + PlatformKubernetes *EditPlatformKubernetesOptions `url:"platform_kubernetes_attributes,omitempty" json:"platform_kubernetes_attributes,omitempty"` +} + +// EditPlatformKubernetesOptions represents the available PlatformKubernetes options for editing. +type EditPlatformKubernetesOptions struct { + APIURL *string `url:"api_url,omitempty" json:"api_url,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` + CaCert *string `url:"ca_cert,omitempty" json:"ca_cert,omitempty"` + Namespace *string `url:"namespace,omitempty" json:"namespace,omitempty"` +} + +// EditCluster updates an existing project cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html#edit-project-cluster +func (s *ProjectClustersService) EditCluster(pid interface{}, cluster int, opt *EditClusterOptions, options ...RequestOptionFunc) (*ProjectCluster, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/clusters/%d", PathEscape(project), cluster) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + pc := new(ProjectCluster) + resp, err := s.client.Do(req, pc) + if err != nil { + return nil, resp, err + } + + return pc, resp, err +} + +// DeleteCluster deletes an existing project cluster. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_clusters.html#delete-project-cluster +func (s *ProjectClustersService) DeleteCluster(pid interface{}, cluster int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/clusters/%d", PathEscape(project), cluster) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_feature_flags.go b/vendor/github.com/xanzy/go-gitlab/project_feature_flags.go new file mode 100644 index 0000000000..79aaf8b36d --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_feature_flags.go @@ -0,0 +1,240 @@ +package gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ProjectFeatureFlagService handles operations on gitlab project feature +// flags using the following api: +// +// GitLab API docs: https://docs.gitlab.com/ee/api/feature_flags.html +type ProjectFeatureFlagService struct { + client *Client +} + +// ProjectFeatureFlag represents a GitLab project iteration. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/feature_flags.html +type ProjectFeatureFlag struct { + Name string `json:"name"` + Description string `json:"description"` + Active bool `json:"active"` + Version string `json:"version"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + Scopes []*ProjectFeatureFlagScope `json:"scopes"` + Strategies []*ProjectFeatureFlagStrategy `json:"strategies"` +} + +// ProjectFeatureFlagScope defines the scopes of a feature flag +// +// GitLab API docs: https://docs.gitlab.com/ee/api/feature_flags.html +type ProjectFeatureFlagScope struct { + ID int `json:"id"` + EnvironmentScope string `json:"environment_scope"` +} + +// ProjectFeatureFlagStrategy defines the strategy used for a feature flag +// +// GitLab API docs: https://docs.gitlab.com/ee/api/feature_flags.html +type ProjectFeatureFlagStrategy struct { + ID int `json:"id"` + Name string `json:"name"` + Parameters *ProjectFeatureFlagStrategyParameter `json:"parameters"` + Scopes []*ProjectFeatureFlagScope `json:"scopes"` +} + +// ProjectFeatureFlagStrategyParameter is used in updating and creating feature flags +// +// GitLab API docs: https://docs.gitlab.com/ee/api/feature_flags.html +type ProjectFeatureFlagStrategyParameter struct { + GroupID string `json:"groupId,omitempty"` + UserIDs string `json:"userIds,omitempty"` + Percentage string `json:"percentage,omitempty"` +} + +func (i ProjectFeatureFlag) String() string { + return Stringify(i) +} + +// ListProjectFeatureFlagOptions contains the options for ListProjectFeatureFlags +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#list-feature-flags-for-a-project +type ListProjectFeatureFlagOptions struct { + ListOptions + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` +} + +// ListProjectFeatureFlags returns a list with the feature flags of a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#list-feature-flags-for-a-project +func (s *ProjectFeatureFlagService) ListProjectFeatureFlags(pid interface{}, opt *ListProjectFeatureFlagOptions, options ...RequestOptionFunc) ([]*ProjectFeatureFlag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/feature_flags", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pffs []*ProjectFeatureFlag + resp, err := s.client.Do(req, &pffs) + if err != nil { + return nil, resp, err + } + + return pffs, resp, err +} + +// GetProjectFeatureFlag gets a single feature flag for the specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#get-a-single-feature-flag +func (s *ProjectFeatureFlagService) GetProjectFeatureFlag(pid interface{}, name string, options ...RequestOptionFunc) (*ProjectFeatureFlag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/feature_flags/%s", PathEscape(project), name) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + flag := new(ProjectFeatureFlag) + resp, err := s.client.Do(req, flag) + if err != nil { + return nil, resp, err + } + + return flag, resp, err +} + +// CreateProjectFeatureFlagOptions represents the available +// CreateProjectFeatureFlag() options. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#create-a-feature-flag +type CreateProjectFeatureFlagOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Version *string `url:"version,omitempty" json:"version,omitempty"` + Active *bool `url:"active,omitempty" json:"active,omitempty"` + Strategies *[]*FeatureFlagStrategyOptions `url:"strategies,omitempty" json:"strategies,omitempty"` +} + +// FeatureFlagStrategyOptions represents the available feature flag strategy +// options. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#create-a-feature-flag +type FeatureFlagStrategyOptions struct { + ID *int `url:"id,omitempty" json:"id,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + Parameters *ProjectFeatureFlagStrategyParameter `url:"parameters,omitempty" json:"parameters,omitempty"` + Scopes *[]*ProjectFeatureFlagScope `url:"scopes,omitempty" json:"scopes,omitempty"` +} + +// ProjectFeatureFlagScopeOptions represents the available feature flag scope +// options. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#create-a-feature-flag +type ProjectFeatureFlagScopeOptions struct { + ID *int `url:"id,omitempty" json:"id,omitempty"` + EnvironmentScope *string `url:"id,omitempty" json:"environment_scope,omitempty"` +} + +// CreateProjectFeatureFlag creates a feature flag +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#create-a-feature-flag +func (s *ProjectFeatureFlagService) CreateProjectFeatureFlag(pid interface{}, opt *CreateProjectFeatureFlagOptions, options ...RequestOptionFunc) (*ProjectFeatureFlag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/feature_flags", + PathEscape(project), + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + flag := new(ProjectFeatureFlag) + resp, err := s.client.Do(req, flag) + if err != nil { + return flag, resp, err + } + + return flag, resp, err +} + +// UpdateProjectFeatureFlagOptions represents the available +// UpdateProjectFeatureFlag() options. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#update-a-feature-flag +type UpdateProjectFeatureFlagOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Active *bool `url:"active,omitempty" json:"active,omitempty"` + Strategies *[]*FeatureFlagStrategyOptions `url:"strategies,omitempty" json:"strategies,omitempty"` +} + +// UpdateProjectFeatureFlag updates a feature flag +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#update-a-feature-flag +func (s *ProjectFeatureFlagService) UpdateProjectFeatureFlag(pid interface{}, name string, opt *UpdateProjectFeatureFlagOptions, options ...RequestOptionFunc) (*ProjectFeatureFlag, *Response, error) { + group, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/feature_flags/%s", + PathEscape(group), + name, + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + flag := new(ProjectFeatureFlag) + resp, err := s.client.Do(req, flag) + if err != nil { + return flag, resp, err + } + + return flag, resp, err +} + +// DeleteProjectFeatureFlag deletes a feature flag +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/feature_flags.html#delete-a-feature-flag +func (s *ProjectFeatureFlagService) DeleteProjectFeatureFlag(pid interface{}, name string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/feature_flags/%s", PathEscape(project), name) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_import_export.go b/vendor/github.com/xanzy/go-gitlab/project_import_export.go new file mode 100644 index 0000000000..ffd4acec39 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_import_export.go @@ -0,0 +1,225 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "io" + "net/http" + "time" +) + +// ProjectImportExportService handles communication with the project +// import/export related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html +type ProjectImportExportService struct { + client *Client +} + +// ImportStatus represents a project import status. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#import-status +type ImportStatus struct { + ID int `json:"id"` + Description string `json:"description"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + CreateAt *time.Time `json:"create_at"` + ImportStatus string `json:"import_status"` + ImportType string `json:"import_type"` + CorrelationID string `json:"correlation_id"` + ImportError string `json:"import_error"` +} + +func (s ImportStatus) String() string { + return Stringify(s) +} + +// ExportStatus represents a project export status. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#export-status +type ExportStatus struct { + ID int `json:"id"` + Description string `json:"description"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + CreatedAt *time.Time `json:"created_at"` + ExportStatus string `json:"export_status"` + Message string `json:"message"` + Links struct { + APIURL string `json:"api_url"` + WebURL string `json:"web_url"` + } `json:"_links"` +} + +func (s ExportStatus) String() string { + return Stringify(s) +} + +// ScheduleExportOptions represents the available ScheduleExport() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#schedule-an-export +type ScheduleExportOptions struct { + Description *string `url:"description,omitempty" json:"description,omitempty"` + Upload struct { + URL *string `url:"url,omitempty" json:"url,omitempty"` + HTTPMethod *string `url:"http_method,omitempty" json:"http_method,omitempty"` + } `url:"upload,omitempty" json:"upload,omitempty"` +} + +// ScheduleExport schedules a project export. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#schedule-an-export +func (s *ProjectImportExportService) ScheduleExport(pid interface{}, opt *ScheduleExportOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/export", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ExportStatus get the status of export. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#export-status +func (s *ProjectImportExportService) ExportStatus(pid interface{}, options ...RequestOptionFunc) (*ExportStatus, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/export", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + es := new(ExportStatus) + resp, err := s.client.Do(req, es) + if err != nil { + return nil, resp, err + } + + return es, resp, err +} + +// ExportDownload download the finished export. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#export-download +func (s *ProjectImportExportService) ExportDownload(pid interface{}, options ...RequestOptionFunc) ([]byte, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/export/download", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var b bytes.Buffer + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b.Bytes(), resp, err +} + +// ImportFileOptions represents the available ImportFile() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#import-a-file +type ImportFileOptions struct { + Namespace *string `url:"namespace,omitempty" json:"namespace,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + Overwrite *bool `url:"overwrite,omitempty" json:"overwrite,omitempty"` + OverrideParams *CreateProjectOptions `url:"override_params,omitempty" json:"override_params,omitempty"` +} + +// Import a project from an archive file. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#import-a-file +func (s *ProjectImportExportService) ImportFromFile(archive io.Reader, opt *ImportFileOptions, options ...RequestOptionFunc) (*ImportStatus, *Response, error) { + req, err := s.client.UploadRequest( + http.MethodPost, + "projects/import", + archive, + "archive.tar.gz", + UploadFile, + opt, + options, + ) + if err != nil { + return nil, nil, err + } + + is := new(ImportStatus) + resp, err := s.client.Do(req, is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} + +// ImportStatus get the status of an import. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_import_export.html#import-status +func (s *ProjectImportExportService) ImportStatus(pid interface{}, options ...RequestOptionFunc) (*ImportStatus, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/import", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + is := new(ImportStatus) + resp, err := s.client.Do(req, is) + if err != nil { + return nil, resp, err + } + + return is, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_iterations.go b/vendor/github.com/xanzy/go-gitlab/project_iterations.go new file mode 100644 index 0000000000..12c42db4d6 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_iterations.go @@ -0,0 +1,90 @@ +// +// Copyright 2022, Daniel Steinke +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// IterationsAPI handles communication with the project iterations related +// methods of the GitLab API +// +// GitLab API docs: https://docs.gitlab.com/ee/api/iterations.html +type ProjectIterationsService struct { + client *Client +} + +// ProjectIteration represents a GitLab project iteration. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/iterations.html +type ProjectIteration struct { + ID int `json:"id"` + IID int `json:"iid"` + Sequence int `json:"sequence"` + GroupID int `json:"group_id"` + Title string `json:"title"` + Description string `json:"description"` + State int `json:"state"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + DueDate *ISOTime `json:"due_date"` + StartDate *ISOTime `json:"start_date"` + WebURL string `json:"web_url"` +} + +func (i ProjectIteration) String() string { + return Stringify(i) +} + +// ListProjectIterationsOptions contains the available ListProjectIterations() +// options +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/iterations.html#list-project-iterations +type ListProjectIterationsOptions struct { + ListOptions + State *string `url:"state,omitempty" json:"state,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + IncludeAncestors *bool `url:"include_ancestors,omitempty" json:"include_ancestors,omitempty"` +} + +// ListProjectIterations returns a list of projects iterations. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/iterations.html#list-project-iterations +func (i *ProjectIterationsService) ListProjectIterations(pid interface{}, opt *ListProjectIterationsOptions, options ...RequestOptionFunc) ([]*ProjectIteration, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/iterations", PathEscape(project)) + + req, err := i.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pis []*ProjectIteration + resp, err := i.client.Do(req, &pis) + if err != nil { + return nil, resp, err + } + + return pis, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_managed_licenses.go b/vendor/github.com/xanzy/go-gitlab/project_managed_licenses.go new file mode 100644 index 0000000000..25c8ef6c85 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_managed_licenses.go @@ -0,0 +1,188 @@ +// +// Copyright 2021, Andrea Perizzato +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ManagedLicensesService handles communication with the managed licenses +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/managed_licenses.html +type ManagedLicensesService struct { + client *Client +} + +// ManagedLicense represents a managed license. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/managed_licenses.html +type ManagedLicense struct { + ID int `json:"id"` + Name string `json:"name"` + ApprovalStatus LicenseApprovalStatusValue `json:"approval_status"` +} + +// ListManagedLicenses returns a list of managed licenses from a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/managed_licenses.html#list-managed-licenses +func (s *ManagedLicensesService) ListManagedLicenses(pid interface{}, options ...RequestOptionFunc) ([]*ManagedLicense, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/managed_licenses", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var mls []*ManagedLicense + resp, err := s.client.Do(req, &mls) + if err != nil { + return nil, resp, err + } + + return mls, resp, err +} + +// GetManagedLicense returns an existing managed license. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/managed_licenses.html#show-an-existing-managed-license +func (s *ManagedLicensesService) GetManagedLicense(pid, mlid interface{}, options ...RequestOptionFunc) (*ManagedLicense, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + license, err := parseID(mlid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/managed_licenses/%s", PathEscape(project), PathEscape(license)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ml := new(ManagedLicense) + resp, err := s.client.Do(req, ml) + if err != nil { + return nil, resp, err + } + + return ml, resp, err +} + +// AddManagedLicenseOptions represents the available AddManagedLicense() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/managed_licenses.html#create-a-new-managed-license +type AddManagedLicenseOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ApprovalStatus *LicenseApprovalStatusValue `url:"approval_status,omitempty" json:"approval_status,omitempty"` +} + +// AddManagedLicense adds a managed license to a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/managed_licenses.html#create-a-new-managed-license +func (s *ManagedLicensesService) AddManagedLicense(pid interface{}, opt *AddManagedLicenseOptions, options ...RequestOptionFunc) (*ManagedLicense, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/managed_licenses", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + ml := new(ManagedLicense) + resp, err := s.client.Do(req, ml) + if err != nil { + return nil, resp, err + } + + return ml, resp, err +} + +// DeleteManagedLicense deletes a managed license with a given ID. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/managed_licenses.html#delete-a-managed-license +func (s *ManagedLicensesService) DeleteManagedLicense(pid, mlid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + license, err := parseID(mlid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/managed_licenses/%s", PathEscape(project), PathEscape(license)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// EditManagedLicenceOptions represents the available EditManagedLicense() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/managed_licenses.html#edit-an-existing-managed-license +type EditManagedLicenceOptions struct { + ApprovalStatus *LicenseApprovalStatusValue `url:"approval_status,omitempty" json:"approval_status,omitempty"` +} + +// EditManagedLicense updates an existing managed license with a new approval +// status. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/managed_licenses.html#edit-an-existing-managed-license +func (s *ManagedLicensesService) EditManagedLicense(pid, mlid interface{}, opt *EditManagedLicenceOptions, options ...RequestOptionFunc) (*ManagedLicense, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + license, err := parseID(mlid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/managed_licenses/%s", PathEscape(project), PathEscape(license)) + + req, err := s.client.NewRequest(http.MethodPatch, u, opt, options) + if err != nil { + return nil, nil, err + } + + ml := new(ManagedLicense) + resp, err := s.client.Do(req, ml) + if err != nil { + return nil, resp, err + } + + return ml, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_members.go b/vendor/github.com/xanzy/go-gitlab/project_members.go new file mode 100644 index 0000000000..7042dfbbd3 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_members.go @@ -0,0 +1,236 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ProjectMembersService handles communication with the project members +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/members.html +type ProjectMembersService struct { + client *Client +} + +// ListProjectMembersOptions represents the available ListProjectMembers() and +// ListAllProjectMembers() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project +type ListProjectMembersOptions struct { + ListOptions + Query *string `url:"query,omitempty" json:"query,omitempty"` + UserIDs *[]int `url:"user_ids[],omitempty" json:"user_ids,omitempty"` +} + +// ListProjectMembers gets a list of a project's team members viewable by the +// authenticated user. Returns only direct members and not inherited members +// through ancestors groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project +func (s *ProjectMembersService) ListProjectMembers(pid interface{}, opt *ListProjectMembersOptions, options ...RequestOptionFunc) ([]*ProjectMember, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/members", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pm []*ProjectMember + resp, err := s.client.Do(req, &pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// ListAllProjectMembers gets a list of a project's team members viewable by the +// authenticated user. Returns a list including inherited members through +// ancestor groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project-including-inherited-and-invited-members +func (s *ProjectMembersService) ListAllProjectMembers(pid interface{}, opt *ListProjectMembersOptions, options ...RequestOptionFunc) ([]*ProjectMember, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/members/all", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pm []*ProjectMember + resp, err := s.client.Do(req, &pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// GetProjectMember gets a project team member. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#get-a-member-of-a-group-or-project +func (s *ProjectMembersService) GetProjectMember(pid interface{}, user int, options ...RequestOptionFunc) (*ProjectMember, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/members/%d", PathEscape(project), user) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pm := new(ProjectMember) + resp, err := s.client.Do(req, pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// GetInheritedProjectMember gets a project team member, including inherited +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#get-a-member-of-a-group-or-project-including-inherited-and-invited-members +func (s *ProjectMembersService) GetInheritedProjectMember(pid interface{}, user int, options ...RequestOptionFunc) (*ProjectMember, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/members/all/%d", PathEscape(project), user) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pm := new(ProjectMember) + resp, err := s.client.Do(req, pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// AddProjectMemberOptions represents the available AddProjectMember() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#add-a-member-to-a-group-or-project +type AddProjectMemberOptions struct { + UserID interface{} `url:"user_id,omitempty" json:"user_id,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + ExpiresAt *string `url:"expires_at,omitempty" json:"expires_at"` +} + +// AddProjectMember adds a user to a project team. This is an idempotent +// method and can be called multiple times with the same parameters. Adding +// team membership to a user that is already a member does not affect the +// existing membership. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#add-a-member-to-a-group-or-project +func (s *ProjectMembersService) AddProjectMember(pid interface{}, opt *AddProjectMemberOptions, options ...RequestOptionFunc) (*ProjectMember, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/members", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pm := new(ProjectMember) + resp, err := s.client.Do(req, pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// EditProjectMemberOptions represents the available EditProjectMember() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#edit-a-member-of-a-group-or-project +type EditProjectMemberOptions struct { + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + ExpiresAt *string `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// EditProjectMember updates a project team member to a specified access level.. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#edit-a-member-of-a-group-or-project +func (s *ProjectMembersService) EditProjectMember(pid interface{}, user int, opt *EditProjectMemberOptions, options ...RequestOptionFunc) (*ProjectMember, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/members/%d", PathEscape(project), user) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + pm := new(ProjectMember) + resp, err := s.client.Do(req, pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// DeleteProjectMember removes a user from a project team. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#remove-a-member-from-a-group-or-project +func (s *ProjectMembersService) DeleteProjectMember(pid interface{}, user int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/members/%d", PathEscape(project), user) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_mirror.go b/vendor/github.com/xanzy/go-gitlab/project_mirror.go new file mode 100644 index 0000000000..a8c1ad22b0 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_mirror.go @@ -0,0 +1,192 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ProjectMirrorService handles communication with the project mirror +// related methods of the GitLab API. +// +// GitLAb API docs: https://docs.gitlab.com/ee/api/remote_mirrors.html +type ProjectMirrorService struct { + client *Client +} + +// ProjectMirror represents a project mirror configuration. +// +// GitLAb API docs: https://docs.gitlab.com/ee/api/remote_mirrors.html +type ProjectMirror struct { + Enabled bool `json:"enabled"` + ID int `json:"id"` + LastError string `json:"last_error"` + LastSuccessfulUpdateAt *time.Time `json:"last_successful_update_at"` + LastUpdateAt *time.Time `json:"last_update_at"` + LastUpdateStartedAt *time.Time `json:"last_update_started_at"` + OnlyProtectedBranches bool `json:"only_protected_branches"` + KeepDivergentRefs bool `json:"keep_divergent_refs"` + UpdateStatus string `json:"update_status"` + URL string `json:"url"` +} + +// ListProjectMirrorOptions represents the available ListProjectMirror() options. +type ListProjectMirrorOptions ListOptions + +// ListProjectMirror gets a list of mirrors configured on the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/remote_mirrors.html#list-a-projects-remote-mirrors +func (s *ProjectMirrorService) ListProjectMirror(pid interface{}, opt *ListProjectMirrorOptions, options ...RequestOptionFunc) ([]*ProjectMirror, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/remote_mirrors", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pm []*ProjectMirror + resp, err := s.client.Do(req, &pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// GetProjectMirror gets a single mirror configured on the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/remote_mirrors.html#get-a-single-projects-remote-mirror +func (s *ProjectMirrorService) GetProjectMirror(pid interface{}, mirror int, options ...RequestOptionFunc) (*ProjectMirror, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/remote_mirrors/%d", PathEscape(project), mirror) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pm := new(ProjectMirror) + resp, err := s.client.Do(req, &pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// AddProjectMirrorOptions contains the properties requires to create +// a new project mirror. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/remote_mirrors.html#create-a-push-mirror +type AddProjectMirrorOptions struct { + URL *string `url:"url,omitempty" json:"url,omitempty"` + Enabled *bool `url:"enabled,omitempty" json:"enabled,omitempty"` + OnlyProtectedBranches *bool `url:"only_protected_branches,omitempty" json:"only_protected_branches,omitempty"` + KeepDivergentRefs *bool `url:"keep_divergent_refs,omitempty" json:"keep_divergent_refs,omitempty"` +} + +// AddProjectMirror creates a new mirror on the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/remote_mirrors.html#create-a-push-mirror +func (s *ProjectMirrorService) AddProjectMirror(pid interface{}, opt *AddProjectMirrorOptions, options ...RequestOptionFunc) (*ProjectMirror, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/remote_mirrors", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pm := new(ProjectMirror) + resp, err := s.client.Do(req, pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// EditProjectMirrorOptions contains the properties requires to edit +// an existing project mirror. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/remote_mirrors.html#update-a-remote-mirrors-attributes +type EditProjectMirrorOptions struct { + Enabled *bool `url:"enabled,omitempty" json:"enabled,omitempty"` + OnlyProtectedBranches *bool `url:"only_protected_branches,omitempty" json:"only_protected_branches,omitempty"` + KeepDivergentRefs *bool `url:"keep_divergent_refs,omitempty" json:"keep_divergent_refs,omitempty"` +} + +// EditProjectMirror updates a project team member to a specified access level.. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/remote_mirrors.html#update-a-remote-mirrors-attributes +func (s *ProjectMirrorService) EditProjectMirror(pid interface{}, mirror int, opt *EditProjectMirrorOptions, options ...RequestOptionFunc) (*ProjectMirror, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/remote_mirrors/%d", PathEscape(project), mirror) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + pm := new(ProjectMirror) + resp, err := s.client.Do(req, pm) + if err != nil { + return nil, resp, err + } + + return pm, resp, err +} + +// DeleteProjectMirror deletes a project mirror. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/remote_mirrors.html#delete-a-remote-mirror +func (s *ProjectMirrorService) DeleteProjectMirror(pid interface{}, mirror int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/remote_mirrors/%d", PathEscape(project), mirror) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_snippets.go b/vendor/github.com/xanzy/go-gitlab/project_snippets.go new file mode 100644 index 0000000000..b3616be9a5 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_snippets.go @@ -0,0 +1,209 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "net/http" +) + +// ProjectSnippetsService handles communication with the project snippets +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_snippets.html +type ProjectSnippetsService struct { + client *Client +} + +// ListProjectSnippetsOptions represents the available ListSnippets() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_snippets.html#list-snippets +type ListProjectSnippetsOptions ListOptions + +// ListSnippets gets a list of project snippets. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_snippets.html#list-snippets +func (s *ProjectSnippetsService) ListSnippets(pid interface{}, opt *ListProjectSnippetsOptions, options ...RequestOptionFunc) ([]*Snippet, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ps []*Snippet + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// GetSnippet gets a single project snippet +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_snippets.html#single-snippet +func (s *ProjectSnippetsService) GetSnippet(pid interface{}, snippet int, options ...RequestOptionFunc) (*Snippet, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ps := new(Snippet) + resp, err := s.client.Do(req, ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// CreateProjectSnippetOptions represents the available CreateSnippet() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_snippets.html#create-new-snippet +type CreateProjectSnippetOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + FileName *string `url:"file_name,omitempty" json:"file_name,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + Files *[]*CreateSnippetFileOptions `url:"files,omitempty" json:"files,omitempty"` +} + +// CreateSnippet creates a new project snippet. The user must have permission +// to create new snippets. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_snippets.html#create-new-snippet +func (s *ProjectSnippetsService) CreateSnippet(pid interface{}, opt *CreateProjectSnippetOptions, options ...RequestOptionFunc) (*Snippet, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + ps := new(Snippet) + resp, err := s.client.Do(req, ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// UpdateProjectSnippetOptions represents the available UpdateSnippet() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_snippets.html#update-snippet +type UpdateProjectSnippetOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + FileName *string `url:"file_name,omitempty" json:"file_name,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + Files *[]*UpdateSnippetFileOptions `url:"files,omitempty" json:"files,omitempty"` +} + +// UpdateSnippet updates an existing project snippet. The user must have +// permission to change an existing snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_snippets.html#update-snippet +func (s *ProjectSnippetsService) UpdateSnippet(pid interface{}, snippet int, opt *UpdateProjectSnippetOptions, options ...RequestOptionFunc) (*Snippet, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ps := new(Snippet) + resp, err := s.client.Do(req, ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// DeleteSnippet deletes an existing project snippet. This is an idempotent +// function and deleting a non-existent snippet still returns a 200 OK status +// code. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_snippets.html#delete-snippet +func (s *ProjectSnippetsService) DeleteSnippet(pid interface{}, snippet int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// SnippetContent returns the raw project snippet as plain text. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_snippets.html#snippet-content +func (s *ProjectSnippetsService) SnippetContent(pid interface{}, snippet int, options ...RequestOptionFunc) ([]byte, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/snippets/%d/raw", PathEscape(project), snippet) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var b bytes.Buffer + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b.Bytes(), resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_templates.go b/vendor/github.com/xanzy/go-gitlab/project_templates.go new file mode 100644 index 0000000000..0501660dbd --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_templates.go @@ -0,0 +1,110 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ProjectTemplatesService handles communication with the project templates +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_templates.html +type ProjectTemplatesService struct { + client *Client +} + +// ProjectTemplate represents a GitLab ProjectTemplate. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_templates.html +type ProjectTemplate struct { + Key string `json:"key"` + Name string `json:"name"` + Nickname string `json:"nickname"` + Popular bool `json:"popular"` + HTMLURL string `json:"html_url"` + SourceURL string `json:"source_url"` + Description string `json:"description"` + Conditions []string `json:"conditions"` + Permissions []string `json:"permissions"` + Limitations []string `json:"limitations"` + Content string `json:"content"` +} + +func (s ProjectTemplate) String() string { + return Stringify(s) +} + +// ListProjectTemplatesOptions represents the available ListSnippets() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_templates.html#get-all-templates-of-a-particular-type +type ListProjectTemplatesOptions struct { + ListOptions + ID *int `url:"id,omitempty" json:"id,omitempty"` + Type *string `url:"type,omitempty" json:"type,omitempty"` +} + +// ListTemplates gets a list of project templates. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_templates.html#get-all-templates-of-a-particular-type +func (s *ProjectTemplatesService) ListTemplates(pid interface{}, templateType string, opt *ListProjectTemplatesOptions, options ...RequestOptionFunc) ([]*ProjectTemplate, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/templates/%s", PathEscape(project), templateType) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pt []*ProjectTemplate + resp, err := s.client.Do(req, &pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// GetProjectTemplate gets a single project template. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_templates.html#get-one-template-of-a-particular-type +func (s *ProjectTemplatesService) GetProjectTemplate(pid interface{}, templateType string, templateName string, options ...RequestOptionFunc) (*ProjectTemplate, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/templates/%s/%s", PathEscape(project), templateType, templateName) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ptd := new(ProjectTemplate) + resp, err := s.client.Do(req, ptd) + if err != nil { + return nil, resp, err + } + + return ptd, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_variables.go b/vendor/github.com/xanzy/go-gitlab/project_variables.go new file mode 100644 index 0000000000..693a0f7466 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_variables.go @@ -0,0 +1,229 @@ +// +// Copyright 2021, Patrick Webster +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// ProjectVariablesService handles communication with the +// project variables related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html +type ProjectVariablesService struct { + client *Client +} + +// ProjectVariable represents a GitLab Project Variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html +type ProjectVariable struct { + Key string `json:"key"` + Value string `json:"value"` + VariableType VariableTypeValue `json:"variable_type"` + Protected bool `json:"protected"` + Masked bool `json:"masked"` + Raw bool `json:"raw"` + EnvironmentScope string `json:"environment_scope"` +} + +func (v ProjectVariable) String() string { + return Stringify(v) +} + +// VariableFilter filters available for project variable related functions +type VariableFilter struct { + EnvironmentScope string `url:"environment_scope, omitempty" json:"environment_scope,omitempty"` +} + +// ListProjectVariablesOptions represents the available options for listing variables +// in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#list-project-variables +type ListProjectVariablesOptions ListOptions + +// ListVariables gets a list of all variables in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#list-project-variables +func (s *ProjectVariablesService) ListVariables(pid interface{}, opt *ListProjectVariablesOptions, options ...RequestOptionFunc) ([]*ProjectVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/variables", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var vs []*ProjectVariable + resp, err := s.client.Do(req, &vs) + if err != nil { + return nil, resp, err + } + + return vs, resp, err +} + +// GetProjectVariableOptions represents the available GetVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#get-a-single-variable +type GetProjectVariableOptions struct { + Filter *VariableFilter `url:"filter,omitempty" json:"filter,omitempty"` +} + +// GetVariable gets a variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#get-a-single-variable +func (s *ProjectVariablesService) GetVariable(pid interface{}, key string, opt *GetProjectVariableOptions, options ...RequestOptionFunc) (*ProjectVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/variables/%s", PathEscape(project), url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + v := new(ProjectVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// CreateProjectVariableOptions represents the available CreateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#create-a-variable +type CreateProjectVariableOptions struct { + Key *string `url:"key,omitempty" json:"key,omitempty"` + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"` + Protected *bool `url:"protected,omitempty" json:"protected,omitempty"` + Masked *bool `url:"masked,omitempty" json:"masked,omitempty"` + Raw *bool `url:"raw,omitempty" json:"raw,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` +} + +// CreateVariable creates a new project variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#create-a-variable +func (s *ProjectVariablesService) CreateVariable(pid interface{}, opt *CreateProjectVariableOptions, options ...RequestOptionFunc) (*ProjectVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/variables", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + v := new(ProjectVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// UpdateProjectVariableOptions represents the available UpdateVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#update-a-variable +type UpdateProjectVariableOptions struct { + Value *string `url:"value,omitempty" json:"value,omitempty"` + VariableType *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"` + Protected *bool `url:"protected,omitempty" json:"protected,omitempty"` + Masked *bool `url:"masked,omitempty" json:"masked,omitempty"` + Raw *bool `url:"raw,omitempty" json:"raw,omitempty"` + EnvironmentScope *string `url:"environment_scope,omitempty" json:"environment_scope,omitempty"` + Filter *VariableFilter `url:"filter,omitempty" json:"filter,omitempty"` +} + +// UpdateVariable updates a project's variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#update-a-variable +func (s *ProjectVariablesService) UpdateVariable(pid interface{}, key string, opt *UpdateProjectVariableOptions, options ...RequestOptionFunc) (*ProjectVariable, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/variables/%s", PathEscape(project), url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + v := new(ProjectVariable) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} + +// RemoveProjectVariableOptions represents the available RemoveVariable() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#delete-a-variable +type RemoveProjectVariableOptions struct { + Filter *VariableFilter `url:"filter,omitempty" json:"filter,omitempty"` +} + +// RemoveVariable removes a project's variable. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_level_variables.html#delete-a-variable +func (s *ProjectVariablesService) RemoveVariable(pid interface{}, key string, opt *RemoveProjectVariableOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/variables/%s", PathEscape(project), url.PathEscape(key)) + + req, err := s.client.NewRequest(http.MethodDelete, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/project_vulnerabilities.go b/vendor/github.com/xanzy/go-gitlab/project_vulnerabilities.go new file mode 100644 index 0000000000..168ee1adb8 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/project_vulnerabilities.go @@ -0,0 +1,150 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ProjectVulnerabilitiesService handles communication with the projects +// vulnerabilities related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_vulnerabilities.html +type ProjectVulnerabilitiesService struct { + client *Client +} + +// Project represents a GitLab project vulnerability. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_vulnerabilities.html +type ProjectVulnerability struct { + AuthorID int `json:"author_id"` + Confidence string `json:"confidence"` + CreatedAt *time.Time `json:"created_at"` + Description string `json:"description"` + DismissedAt *time.Time `json:"dismissed_at"` + DismissedByID int `json:"dismissed_by_id"` + DueDate *time.Time `json:"due_date"` + Finding *Finding `json:"finding"` + ID int `json:"id"` + LastEditedAt *time.Time `json:"last_edited_at"` + LastEditedByID int `json:"last_edited_by_id"` + Project *Project `json:"project"` + ProjectDefaultBranch string `json:"project_default_branch"` + ReportType string `json:"report_type"` + ResolvedAt *time.Time `json:"resolved_at"` + ResolvedByID int `json:"resolved_by_id"` + ResolvedOnDefaultBranch bool `json:"resolved_on_default_branch"` + Severity string `json:"severity"` + StartDate *time.Time `json:"start_date"` + State string `json:"state"` + Title string `json:"title"` + UpdatedAt *time.Time `json:"updated_at"` + UpdatedByID int `json:"updated_by_id"` +} + +// Project represents a GitLab project vulnerability finding. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/project_vulnerabilities.html +type Finding struct { + Confidence string `json:"confidence"` + CreatedAt *time.Time `json:"created_at"` + ID int `json:"id"` + LocationFingerprint string `json:"location_fingerprint"` + MetadataVersion string `json:"metadata_version"` + Name string `json:"name"` + PrimaryIdentifierID int `json:"primary_identifier_id"` + ProjectFingerprint string `json:"project_fingerprint"` + ProjectID int `json:"project_id"` + RawMetadata string `json:"raw_metadata"` + ReportType string `json:"report_type"` + ScannerID int `json:"scanner_id"` + Severity string `json:"severity"` + UpdatedAt *time.Time `json:"updated_at"` + UUID string `json:"uuid"` + VulnerabilityID int `json:"vulnerability_id"` +} + +// ListProjectVulnerabilitiesOptions represents the available +// ListProjectVulnerabilities() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_vulnerabilities.html#list-project-vulnerabilities +type ListProjectVulnerabilitiesOptions struct { + ListOptions +} + +// ListProjectVulnerabilities gets a list of all project vulnerabilities. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_vulnerabilities.html#list-project-vulnerabilities +func (s *ProjectVulnerabilitiesService) ListProjectVulnerabilities(pid interface{}, opt *ListProjectVulnerabilitiesOptions, options ...RequestOptionFunc) ([]*ProjectVulnerability, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/vulnerabilities", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*ProjectVulnerability + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// CreateVulnerabilityOptions represents the available CreateVulnerability() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_vulnerabilities.html#new-vulnerability +type CreateVulnerabilityOptions struct { + FindingID *int `url:"finding_id,omitempty" json:"finding_id,omitempty"` +} + +// CreateVulnerability creates a new vulnerability on the selected project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/project_vulnerabilities.html#new-vulnerability +func (s *ProjectVulnerabilitiesService) CreateVulnerability(pid interface{}, opt *CreateVulnerabilityOptions, options ...RequestOptionFunc) (*ProjectVulnerability, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/vulnerabilities", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(ProjectVulnerability) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/projects.go b/vendor/github.com/xanzy/go-gitlab/projects.go new file mode 100644 index 0000000000..662a67cd2a --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/projects.go @@ -0,0 +1,2075 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/hashicorp/go-retryablehttp" +) + +// ProjectsService handles communication with the repositories related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html +type ProjectsService struct { + client *Client +} + +// Project represents a GitLab project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html +type Project struct { + ID int `json:"id"` + Description string `json:"description"` + DefaultBranch string `json:"default_branch"` + Public bool `json:"public"` + Visibility VisibilityValue `json:"visibility"` + SSHURLToRepo string `json:"ssh_url_to_repo"` + HTTPURLToRepo string `json:"http_url_to_repo"` + WebURL string `json:"web_url"` + ReadmeURL string `json:"readme_url"` + TagList []string `json:"tag_list"` + Topics []string `json:"topics"` + Owner *User `json:"owner"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + IssuesEnabled bool `json:"issues_enabled"` + OpenIssuesCount int `json:"open_issues_count"` + MergeRequestsEnabled bool `json:"merge_requests_enabled"` + ApprovalsBeforeMerge int `json:"approvals_before_merge"` + JobsEnabled bool `json:"jobs_enabled"` + WikiEnabled bool `json:"wiki_enabled"` + SnippetsEnabled bool `json:"snippets_enabled"` + ResolveOutdatedDiffDiscussions bool `json:"resolve_outdated_diff_discussions"` + ContainerExpirationPolicy *ContainerExpirationPolicy `json:"container_expiration_policy,omitempty"` + ContainerRegistryEnabled bool `json:"container_registry_enabled"` + ContainerRegistryAccessLevel AccessControlValue `json:"container_registry_access_level"` + ContainerRegistryImagePrefix string `json:"container_registry_image_prefix,omitempty"` + CreatedAt *time.Time `json:"created_at,omitempty"` + LastActivityAt *time.Time `json:"last_activity_at,omitempty"` + CreatorID int `json:"creator_id"` + Namespace *ProjectNamespace `json:"namespace"` + Permissions *Permissions `json:"permissions"` + MarkedForDeletionAt *ISOTime `json:"marked_for_deletion_at"` + EmptyRepo bool `json:"empty_repo"` + Archived bool `json:"archived"` + AvatarURL string `json:"avatar_url"` + LicenseURL string `json:"license_url"` + License *ProjectLicense `json:"license"` + SharedRunnersEnabled bool `json:"shared_runners_enabled"` + GroupRunnersEnabled bool `json:"group_runners_enabled"` + RunnerTokenExpirationInterval int `json:"runner_token_expiration_interval"` + ForksCount int `json:"forks_count"` + StarCount int `json:"star_count"` + RunnersToken string `json:"runners_token"` + AllowMergeOnSkippedPipeline bool `json:"allow_merge_on_skipped_pipeline"` + OnlyAllowMergeIfPipelineSucceeds bool `json:"only_allow_merge_if_pipeline_succeeds"` + OnlyAllowMergeIfAllDiscussionsAreResolved bool `json:"only_allow_merge_if_all_discussions_are_resolved"` + RemoveSourceBranchAfterMerge bool `json:"remove_source_branch_after_merge"` + PrintingMergeRequestLinkEnabled bool `json:"printing_merge_request_link_enabled"` + LFSEnabled bool `json:"lfs_enabled"` + RepositoryStorage string `json:"repository_storage"` + RequestAccessEnabled bool `json:"request_access_enabled"` + MergeMethod MergeMethodValue `json:"merge_method"` + CanCreateMergeRequestIn bool `json:"can_create_merge_request_in"` + ForkedFromProject *ForkParent `json:"forked_from_project"` + Mirror bool `json:"mirror"` + MirrorUserID int `json:"mirror_user_id"` + MirrorTriggerBuilds bool `json:"mirror_trigger_builds"` + OnlyMirrorProtectedBranches bool `json:"only_mirror_protected_branches"` + MirrorOverwritesDivergedBranches bool `json:"mirror_overwrites_diverged_branches"` + PackagesEnabled bool `json:"packages_enabled"` + ServiceDeskEnabled bool `json:"service_desk_enabled"` + ServiceDeskAddress string `json:"service_desk_address"` + IssuesAccessLevel AccessControlValue `json:"issues_access_level"` + ReleasesAccessLevel AccessControlValue `json:"releases_access_level,omitempty"` + RepositoryAccessLevel AccessControlValue `json:"repository_access_level"` + MergeRequestsAccessLevel AccessControlValue `json:"merge_requests_access_level"` + ForkingAccessLevel AccessControlValue `json:"forking_access_level"` + WikiAccessLevel AccessControlValue `json:"wiki_access_level"` + BuildsAccessLevel AccessControlValue `json:"builds_access_level"` + SnippetsAccessLevel AccessControlValue `json:"snippets_access_level"` + PagesAccessLevel AccessControlValue `json:"pages_access_level"` + OperationsAccessLevel AccessControlValue `json:"operations_access_level"` + AnalyticsAccessLevel AccessControlValue `json:"analytics_access_level"` + EnvironmentsAccessLevel AccessControlValue `json:"environments_access_level"` + FeatureFlagsAccessLevel AccessControlValue `json:"feature_flags_access_level"` + InfrastructureAccessLevel AccessControlValue `json:"infrastructure_access_level"` + MonitorAccessLevel AccessControlValue `json:"monitor_access_level"` + AutocloseReferencedIssues bool `json:"autoclose_referenced_issues"` + SuggestionCommitMessage string `json:"suggestion_commit_message"` + SquashOption SquashOptionValue `json:"squash_option"` + EnforceAuthChecksOnUploads bool `json:"enforce_auth_checks_on_uploads,omitempty"` + SharedWithGroups []struct { + GroupID int `json:"group_id"` + GroupName string `json:"group_name"` + GroupFullPath string `json:"group_full_path"` + GroupAccessLevel int `json:"group_access_level"` + } `json:"shared_with_groups"` + Statistics *Statistics `json:"statistics"` + Links *Links `json:"_links,omitempty"` + ImportURL string `json:"import_url"` + ImportType string `json:"import_type"` + ImportStatus string `json:"import_status"` + ImportError string `json:"import_error"` + CIDefaultGitDepth int `json:"ci_default_git_depth"` + CIForwardDeploymentEnabled bool `json:"ci_forward_deployment_enabled"` + CISeperateCache bool `json:"ci_separated_caches"` + CIJobTokenScopeEnabled bool `json:"ci_job_token_scope_enabled"` + CIOptInJWT bool `json:"ci_opt_in_jwt"` + CIAllowForkPipelinesToRunInParentProject bool `json:"ci_allow_fork_pipelines_to_run_in_parent_project"` + PublicJobs bool `json:"public_jobs"` + BuildTimeout int `json:"build_timeout"` + AutoCancelPendingPipelines string `json:"auto_cancel_pending_pipelines"` + CIConfigPath string `json:"ci_config_path"` + CustomAttributes []*CustomAttribute `json:"custom_attributes"` + ComplianceFrameworks []string `json:"compliance_frameworks"` + BuildCoverageRegex string `json:"build_coverage_regex"` + IssuesTemplate string `json:"issues_template"` + MergeRequestsTemplate string `json:"merge_requests_template"` + IssueBranchTemplate string `json:"issue_branch_template"` + KeepLatestArtifact bool `json:"keep_latest_artifact"` + MergePipelinesEnabled bool `json:"merge_pipelines_enabled"` + MergeTrainsEnabled bool `json:"merge_trains_enabled"` + RestrictUserDefinedVariables bool `json:"restrict_user_defined_variables"` + MergeCommitTemplate string `json:"merge_commit_template"` + SquashCommitTemplate string `json:"squash_commit_template"` + AutoDevopsDeployStrategy string `json:"auto_devops_deploy_strategy"` + AutoDevopsEnabled bool `json:"auto_devops_enabled"` + BuildGitStrategy string `json:"build_git_strategy"` + EmailsDisabled bool `json:"emails_disabled"` + ExternalAuthorizationClassificationLabel string `json:"external_authorization_classification_label"` + RequirementsEnabled bool `json:"requirements_enabled"` + RequirementsAccessLevel AccessControlValue `json:"requirements_access_level"` + SecurityAndComplianceEnabled bool `json:"security_and_compliance_enabled"` + SecurityAndComplianceAccessLevel AccessControlValue `json:"security_and_compliance_access_level"` + MergeRequestDefaultTargetSelf bool `json:"mr_default_target_self"` + + // Deprecated: This parameter has been renamed to PublicJobs in GitLab 9.0. + PublicBuilds bool `json:"public_builds"` +} + +// BasicProject included in other service responses (such as todos). +type BasicProject struct { + ID int `json:"id"` + Description string `json:"description"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + CreatedAt *time.Time `json:"created_at"` +} + +// ContainerExpirationPolicy represents the container expiration policy. +type ContainerExpirationPolicy struct { + Cadence string `json:"cadence"` + KeepN int `json:"keep_n"` + OlderThan string `json:"older_than"` + NameRegex string `json:"name_regex"` + NameRegexDelete string `json:"name_regex_delete"` + NameRegexKeep string `json:"name_regex_keep"` + Enabled bool `json:"enabled"` + NextRunAt *time.Time `json:"next_run_at"` +} + +// ForkParent represents the parent project when this is a fork. +type ForkParent struct { + HTTPURLToRepo string `json:"http_url_to_repo"` + ID int `json:"id"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + WebURL string `json:"web_url"` +} + +// GroupAccess represents group access. +type GroupAccess struct { + AccessLevel AccessLevelValue `json:"access_level"` + NotificationLevel NotificationLevelValue `json:"notification_level"` +} + +// Links represents a project web links for self, issues, merge_requests, +// repo_branches, labels, events, members. +type Links struct { + Self string `json:"self"` + Issues string `json:"issues"` + MergeRequests string `json:"merge_requests"` + RepoBranches string `json:"repo_branches"` + Labels string `json:"labels"` + Events string `json:"events"` + Members string `json:"members"` + ClusterAgents string `json:"cluster_agents"` +} + +// Permissions represents permissions. +type Permissions struct { + ProjectAccess *ProjectAccess `json:"project_access"` + GroupAccess *GroupAccess `json:"group_access"` +} + +// ProjectAccess represents project access. +type ProjectAccess struct { + AccessLevel AccessLevelValue `json:"access_level"` + NotificationLevel NotificationLevelValue `json:"notification_level"` +} + +// ProjectLicense represent the license for a project. +type ProjectLicense struct { + Key string `json:"key"` + Name string `json:"name"` + Nickname string `json:"nickname"` + HTMLURL string `json:"html_url"` + SourceURL string `json:"source_url"` +} + +// ProjectNamespace represents a project namespace. +type ProjectNamespace struct { + ID int `json:"id"` + Name string `json:"name"` + Path string `json:"path"` + Kind string `json:"kind"` + FullPath string `json:"full_path"` + ParentID int `json:"parent_id"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` +} + +// Repository represents a repository. +type Repository struct { + Name string `json:"name"` + Description string `json:"description"` + WebURL string `json:"web_url"` + AvatarURL string `json:"avatar_url"` + GitSSHURL string `json:"git_ssh_url"` + GitHTTPURL string `json:"git_http_url"` + Namespace string `json:"namespace"` + Visibility VisibilityValue `json:"visibility"` + PathWithNamespace string `json:"path_with_namespace"` + DefaultBranch string `json:"default_branch"` + Homepage string `json:"homepage"` + URL string `json:"url"` + SSHURL string `json:"ssh_url"` + HTTPURL string `json:"http_url"` +} + +// Statistics represents a statistics record for a group or project. +type Statistics struct { + CommitCount int64 `json:"commit_count"` + StorageSize int64 `json:"storage_size"` + RepositorySize int64 `json:"repository_size"` + WikiSize int64 `json:"wiki_size"` + LFSObjectsSize int64 `json:"lfs_objects_size"` + JobArtifactsSize int64 `json:"job_artifacts_size"` + PipelineArtifactsSize int64 `json:"pipeline_artifacts_size"` + PackagesSize int64 `json:"packages_size"` + SnippetsSize int64 `json:"snippets_size"` + UploadsSize int64 `json:"uploads_size"` +} + +func (s Project) String() string { + return Stringify(s) +} + +// ProjectApprovalRule represents a GitLab project approval rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules +type ProjectApprovalRule struct { + ID int `json:"id"` + Name string `json:"name"` + RuleType string `json:"rule_type"` + EligibleApprovers []*BasicUser `json:"eligible_approvers"` + ApprovalsRequired int `json:"approvals_required"` + Users []*BasicUser `json:"users"` + Groups []*Group `json:"groups"` + ContainsHiddenGroups bool `json:"contains_hidden_groups"` + ProtectedBranches []*ProtectedBranch `json:"protected_branches"` + AppliesToAllProtectedBranches bool `json:"applies_to_all_protected_branches"` +} + +func (s ProjectApprovalRule) String() string { + return Stringify(s) +} + +// ListProjectsOptions represents the available ListProjects() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#list-all-projects +type ListProjectsOptions struct { + ListOptions + Archived *bool `url:"archived,omitempty" json:"archived,omitempty"` + IDAfter *int `url:"id_after,omitempty" json:"id_after,omitempty"` + IDBefore *int `url:"id_before,omitempty" json:"id_before,omitempty"` + Imported *bool `url:"imported,omitempty" json:"imported,omitempty"` + LastActivityAfter *time.Time `url:"last_activity_after,omitempty" json:"last_activity_after,omitempty"` + LastActivityBefore *time.Time `url:"last_activity_before,omitempty" json:"last_activity_before,omitempty"` + Membership *bool `url:"membership,omitempty" json:"membership,omitempty"` + MinAccessLevel *AccessLevelValue `url:"min_access_level,omitempty" json:"min_access_level,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Owned *bool `url:"owned,omitempty" json:"owned,omitempty"` + RepositoryChecksumFailed *bool `url:"repository_checksum_failed,omitempty" json:"repository_checksum_failed,omitempty"` + RepositoryStorage *string `url:"repository_storage,omitempty" json:"repository_storage,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + SearchNamespaces *bool `url:"search_namespaces,omitempty" json:"search_namespaces,omitempty"` + Simple *bool `url:"simple,omitempty" json:"simple,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + Starred *bool `url:"starred,omitempty" json:"starred,omitempty"` + Statistics *bool `url:"statistics,omitempty" json:"statistics,omitempty"` + Topic *string `url:"topic,omitempty" json:"topic,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + WikiChecksumFailed *bool `url:"wiki_checksum_failed,omitempty" json:"wiki_checksum_failed,omitempty"` + WithCustomAttributes *bool `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"` + WithIssuesEnabled *bool `url:"with_issues_enabled,omitempty" json:"with_issues_enabled,omitempty"` + WithMergeRequestsEnabled *bool `url:"with_merge_requests_enabled,omitempty" json:"with_merge_requests_enabled,omitempty"` + WithProgrammingLanguage *string `url:"with_programming_language,omitempty" json:"with_programming_language,omitempty"` +} + +// ListProjects gets a list of projects accessible by the authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#list-all-projects +func (s *ProjectsService) ListProjects(opt *ListProjectsOptions, options ...RequestOptionFunc) ([]*Project, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "projects", opt, options) + if err != nil { + return nil, nil, err + } + + var p []*Project + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ListUserProjects gets a list of projects for the given user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#list-user-projects +func (s *ProjectsService) ListUserProjects(uid interface{}, opt *ListProjectsOptions, options ...RequestOptionFunc) ([]*Project, *Response, error) { + user, err := parseID(uid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("users/%s/projects", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*Project + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ListUserStarredProjects gets a list of projects starred by the given user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#list-projects-starred-by-a-user +func (s *ProjectsService) ListUserStarredProjects(uid interface{}, opt *ListProjectsOptions, options ...RequestOptionFunc) ([]*Project, *Response, error) { + user, err := parseID(uid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("users/%s/starred_projects", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*Project + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ProjectUser represents a GitLab project user. +type ProjectUser struct { + ID int `json:"id"` + Name string `json:"name"` + Username string `json:"username"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` +} + +// ListProjectUserOptions represents the available ListProjectsUsers() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#get-project-users +type ListProjectUserOptions struct { + ListOptions + Search *string `url:"search,omitempty" json:"search,omitempty"` +} + +// ListProjectsUsers gets a list of users for the given project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#get-project-users +func (s *ProjectsService) ListProjectsUsers(pid interface{}, opt *ListProjectUserOptions, options ...RequestOptionFunc) ([]*ProjectUser, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/users", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*ProjectUser + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ProjectGroup represents a GitLab project group. +type ProjectGroup struct { + ID int `json:"id"` + Name string `json:"name"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + FullName string `json:"full_name"` + FullPath string `json:"full_path"` +} + +// ListProjectGroupOptions represents the available ListProjectsGroups() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#list-a-projects-groups +type ListProjectGroupOptions struct { + ListOptions + Search *string `url:"search,omitempty" json:"search,omitempty"` + SharedMinAccessLevel *AccessLevelValue `url:"shared_min_access_level,omitempty" json:"shared_min_access_level,omitempty"` + SharedVisiableOnly *bool `url:"shared_visible_only,omitempty" json:"shared_visible_only,omitempty"` + SkipGroups *[]int `url:"skip_groups,omitempty" json:"skip_groups,omitempty"` + WithShared *bool `url:"with_shared,omitempty" json:"with_shared,omitempty"` +} + +// ListProjectsGroups gets a list of groups for the given project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#list-a-projects-groups +func (s *ProjectsService) ListProjectsGroups(pid interface{}, opt *ListProjectGroupOptions, options ...RequestOptionFunc) ([]*ProjectGroup, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/groups", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*ProjectGroup + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ProjectLanguages is a map of strings because the response is arbitrary +// +// Gitlab API docs: https://docs.gitlab.com/ee/api/projects.html#languages +type ProjectLanguages map[string]float32 + +// GetProjectLanguages gets a list of languages used by the project +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#languages +func (s *ProjectsService) GetProjectLanguages(pid interface{}, options ...RequestOptionFunc) (*ProjectLanguages, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/languages", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(ProjectLanguages) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// GetProjectOptions represents the available GetProject() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#get-single-project +type GetProjectOptions struct { + License *bool `url:"license,omitempty" json:"license,omitempty"` + Statistics *bool `url:"statistics,omitempty" json:"statistics,omitempty"` + WithCustomAttributes *bool `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"` +} + +// GetProject gets a specific project, identified by project ID or +// NAMESPACE/PROJECT_NAME, which is owned by the authenticated user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#get-single-project +func (s *ProjectsService) GetProject(pid interface{}, opt *GetProjectOptions, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// CreateProjectOptions represents the available CreateProject() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#create-project +type CreateProjectOptions struct { + AllowMergeOnSkippedPipeline *bool `url:"allow_merge_on_skipped_pipeline,omitempty" json:"allow_merge_on_skipped_pipeline,omitempty"` + OnlyAllowMergeIfAllStatusChecksPassed *bool `url:"only_allow_merge_if_all_status_checks_passed,omitempty" json:"only_allow_merge_if_all_status_checks_passed,omitempty"` + AnalyticsAccessLevel *AccessControlValue `url:"analytics_access_level,omitempty" json:"analytics_access_level,omitempty"` + ApprovalsBeforeMerge *int `url:"approvals_before_merge,omitempty" json:"approvals_before_merge,omitempty"` + AutoCancelPendingPipelines *string `url:"auto_cancel_pending_pipelines,omitempty" json:"auto_cancel_pending_pipelines,omitempty"` + AutoDevopsDeployStrategy *string `url:"auto_devops_deploy_strategy,omitempty" json:"auto_devops_deploy_strategy,omitempty"` + AutoDevopsEnabled *bool `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"` + AutocloseReferencedIssues *bool `url:"autoclose_referenced_issues,omitempty" json:"autoclose_referenced_issues,omitempty"` + Avatar *ProjectAvatar `url:"-" json:"-"` + BuildCoverageRegex *string `url:"build_coverage_regex,omitempty" json:"build_coverage_regex,omitempty"` + BuildGitStrategy *string `url:"build_git_strategy,omitempty" json:"build_git_strategy,omitempty"` + BuildTimeout *int `url:"build_timeout,omitempty" json:"build_timeout,omitempty"` + BuildsAccessLevel *AccessControlValue `url:"builds_access_level,omitempty" json:"builds_access_level,omitempty"` + CIConfigPath *string `url:"ci_config_path,omitempty" json:"ci_config_path,omitempty"` + ContainerExpirationPolicyAttributes *ContainerExpirationPolicyAttributes `url:"container_expiration_policy_attributes,omitempty" json:"container_expiration_policy_attributes,omitempty"` + ContainerRegistryAccessLevel *AccessControlValue `url:"container_registry_access_level,omitempty" json:"container_registry_access_level,omitempty"` + DefaultBranch *string `url:"default_branch,omitempty" json:"default_branch,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + EmailsDisabled *bool `url:"emails_disabled,omitempty" json:"emails_disabled,omitempty"` + EnforceAuthChecksOnUploads *bool `url:"enforce_auth_checks_on_uploads,omitempty" json:"enforce_auth_checks_on_uploads,omitempty"` + ExternalAuthorizationClassificationLabel *string `url:"external_authorization_classification_label,omitempty" json:"external_authorization_classification_label,omitempty"` + ForkingAccessLevel *AccessControlValue `url:"forking_access_level,omitempty" json:"forking_access_level,omitempty"` + GroupWithProjectTemplatesID *int `url:"group_with_project_templates_id,omitempty" json:"group_with_project_templates_id,omitempty"` + ImportURL *string `url:"import_url,omitempty" json:"import_url,omitempty"` + InitializeWithReadme *bool `url:"initialize_with_readme,omitempty" json:"initialize_with_readme,omitempty"` + IssuesAccessLevel *AccessControlValue `url:"issues_access_level,omitempty" json:"issues_access_level,omitempty"` + IssueBranchTemplate *string `url:"issue_branch_template,omitempty" json:"issue_branch_template,omitempty"` + LFSEnabled *bool `url:"lfs_enabled,omitempty" json:"lfs_enabled,omitempty"` + MergeCommitTemplate *string `url:"merge_commit_template,omitempty" json:"merge_commit_template,omitempty"` + MergeMethod *MergeMethodValue `url:"merge_method,omitempty" json:"merge_method,omitempty"` + MergePipelinesEnabled *bool `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"` + MergeRequestsAccessLevel *AccessControlValue `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"` + MergeTrainsEnabled *bool `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"` + Mirror *bool `url:"mirror,omitempty" json:"mirror,omitempty"` + MirrorTriggerBuilds *bool `url:"mirror_trigger_builds,omitempty" json:"mirror_trigger_builds,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + NamespaceID *int `url:"namespace_id,omitempty" json:"namespace_id,omitempty"` + OnlyAllowMergeIfAllDiscussionsAreResolved *bool `url:"only_allow_merge_if_all_discussions_are_resolved,omitempty" json:"only_allow_merge_if_all_discussions_are_resolved,omitempty"` + OnlyAllowMergeIfPipelineSucceeds *bool `url:"only_allow_merge_if_pipeline_succeeds,omitempty" json:"only_allow_merge_if_pipeline_succeeds,omitempty"` + OperationsAccessLevel *AccessControlValue `url:"operations_access_level,omitempty" json:"operations_access_level,omitempty"` + PackagesEnabled *bool `url:"packages_enabled,omitempty" json:"packages_enabled,omitempty"` + PagesAccessLevel *AccessControlValue `url:"pages_access_level,omitempty" json:"pages_access_level,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + PublicBuilds *bool `url:"public_builds,omitempty" json:"public_builds,omitempty"` + ReleasesAccessLevel *AccessControlValue `url:"releases_access_level,omitempty" json:"releases_access_level,omitempty"` + EnvironmentsAccessLevel *AccessControlValue `url:"environments_access_level,omitempty" json:"environments_access_level,omitempty"` + FeatureFlagsAccessLevel *AccessControlValue `url:"feature_flags_access_level,omitempty" json:"feature_flags_access_level,omitempty"` + InfrastructureAccessLevel *AccessControlValue `url:"infrastructure_access_level,omitempty" json:"infrastructure_access_level,omitempty"` + MonitorAccessLevel *AccessControlValue `url:"monitor_access_level,omitempty" json:"monitor_access_level,omitempty"` + RemoveSourceBranchAfterMerge *bool `url:"remove_source_branch_after_merge,omitempty" json:"remove_source_branch_after_merge,omitempty"` + PrintingMergeRequestLinkEnabled *bool `url:"printing_merge_request_link_enabled,omitempty" json:"printing_merge_request_link_enabled,omitempty"` + RepositoryAccessLevel *AccessControlValue `url:"repository_access_level,omitempty" json:"repository_access_level,omitempty"` + RepositoryStorage *string `url:"repository_storage,omitempty" json:"repository_storage,omitempty"` + RequestAccessEnabled *bool `url:"request_access_enabled,omitempty" json:"request_access_enabled,omitempty"` + RequirementsAccessLevel *AccessControlValue `url:"requirements_access_level,omitempty" json:"requirements_access_level,omitempty"` + ResolveOutdatedDiffDiscussions *bool `url:"resolve_outdated_diff_discussions,omitempty" json:"resolve_outdated_diff_discussions,omitempty"` + SecurityAndComplianceAccessLevel *AccessControlValue `url:"security_and_compliance_access_level,omitempty" json:"security_and_compliance_access_level,omitempty"` + SharedRunnersEnabled *bool `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"` + GroupRunnersEnabled *bool `url:"group_runners_enabled,omitempty" json:"group_runners_enabled,omitempty"` + ShowDefaultAwardEmojis *bool `url:"show_default_award_emojis,omitempty" json:"show_default_award_emojis,omitempty"` + SnippetsAccessLevel *AccessControlValue `url:"snippets_access_level,omitempty" json:"snippets_access_level,omitempty"` + SquashCommitTemplate *string `url:"squash_commit_template,omitempty" json:"squash_commit_template,omitempty"` + SquashOption *SquashOptionValue `url:"squash_option,omitempty" json:"squash_option,omitempty"` + SuggestionCommitMessage *string `url:"suggestion_commit_message,omitempty" json:"suggestion_commit_message,omitempty"` + TemplateName *string `url:"template_name,omitempty" json:"template_name,omitempty"` + TemplateProjectID *int `url:"template_project_id,omitempty" json:"template_project_id,omitempty"` + Topics *[]string `url:"topics,omitempty" json:"topics,omitempty"` + UseCustomTemplate *bool `url:"use_custom_template,omitempty" json:"use_custom_template,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + WikiAccessLevel *AccessControlValue `url:"wiki_access_level,omitempty" json:"wiki_access_level,omitempty"` + + // Deprecated: No longer supported in recent versions. + CIForwardDeploymentEnabled *bool `url:"ci_forward_deployment_enabled,omitempty" json:"ci_forward_deployment_enabled,omitempty"` + // Deprecated: Use ContainerRegistryAccessLevel instead. + ContainerRegistryEnabled *bool `url:"container_registry_enabled,omitempty" json:"container_registry_enabled,omitempty"` + // Deprecated: Use IssuesAccessLevel instead. + IssuesEnabled *bool `url:"issues_enabled,omitempty" json:"issues_enabled,omitempty"` + // Deprecated: No longer supported in recent versions. + IssuesTemplate *string `url:"issues_template,omitempty" json:"issues_template,omitempty"` + // Deprecated: Use BuildsAccessLevel instead. + JobsEnabled *bool `url:"jobs_enabled,omitempty" json:"jobs_enabled,omitempty"` + // Deprecated: Use MergeRequestsAccessLevel instead. + MergeRequestsEnabled *bool `url:"merge_requests_enabled,omitempty" json:"merge_requests_enabled,omitempty"` + // Deprecated: No longer supported in recent versions. + MergeRequestsTemplate *string `url:"merge_requests_template,omitempty" json:"merge_requests_template,omitempty"` + // Deprecated: No longer supported in recent versions. + ServiceDeskEnabled *bool `url:"service_desk_enabled,omitempty" json:"service_desk_enabled,omitempty"` + // Deprecated: Use SnippetsAccessLevel instead. + SnippetsEnabled *bool `url:"snippets_enabled,omitempty" json:"snippets_enabled,omitempty"` + // Deprecated: Use Topics instead. (Deprecated in GitLab 14.0) + TagList *[]string `url:"tag_list,omitempty" json:"tag_list,omitempty"` + // Deprecated: Use WikiAccessLevel instead. + WikiEnabled *bool `url:"wiki_enabled,omitempty" json:"wiki_enabled,omitempty"` +} + +// ContainerExpirationPolicyAttributes represents the available container +// expiration policy attributes. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#create-project +type ContainerExpirationPolicyAttributes struct { + Cadence *string `url:"cadence,omitempty" json:"cadence,omitempty"` + KeepN *int `url:"keep_n,omitempty" json:"keep_n,omitempty"` + OlderThan *string `url:"older_than,omitempty" json:"older_than,omitempty"` + NameRegexDelete *string `url:"name_regex_delete,omitempty" json:"name_regex_delete,omitempty"` + NameRegexKeep *string `url:"name_regex_keep,omitempty" json:"name_regex_keep,omitempty"` + Enabled *bool `url:"enabled,omitempty" json:"enabled,omitempty"` + + // Deprecated: Is replaced by NameRegexDelete and is internally hardwired to its value. + NameRegex *string `url:"name_regex,omitempty" json:"name_regex,omitempty"` +} + +// ProjectAvatar represents a GitLab project avatar. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#create-project +type ProjectAvatar struct { + Filename string + Image io.Reader +} + +// MarshalJSON implements the json.Marshaler interface. +func (a *ProjectAvatar) MarshalJSON() ([]byte, error) { + if a.Filename == "" && a.Image == nil { + return []byte(`""`), nil + } + type alias ProjectAvatar + return json.Marshal((*alias)(a)) +} + +// CreateProject creates a new project owned by the authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#create-project +func (s *ProjectsService) CreateProject(opt *CreateProjectOptions, options ...RequestOptionFunc) (*Project, *Response, error) { + if opt.ContainerExpirationPolicyAttributes != nil { + // This is needed to satisfy the API. Should be deleted + // when NameRegex is removed (it's now deprecated). + opt.ContainerExpirationPolicyAttributes.NameRegex = opt.ContainerExpirationPolicyAttributes.NameRegexDelete + } + + var err error + var req *retryablehttp.Request + + if opt.Avatar == nil { + req, err = s.client.NewRequest(http.MethodPost, "projects", opt, options) + } else { + req, err = s.client.UploadRequest( + http.MethodPost, + "projects", + opt.Avatar.Image, + opt.Avatar.Filename, + UploadAvatar, + opt, + options, + ) + } + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// CreateProjectForUserOptions represents the available CreateProjectForUser() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#create-project-for-user +type CreateProjectForUserOptions CreateProjectOptions + +// CreateProjectForUser creates a new project owned by the specified user. +// Available only for admins. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#create-project-for-user +func (s *ProjectsService) CreateProjectForUser(user int, opt *CreateProjectForUserOptions, options ...RequestOptionFunc) (*Project, *Response, error) { + if opt.ContainerExpirationPolicyAttributes != nil { + // This is needed to satisfy the API. Should be deleted + // when NameRegex is removed (it's now deprecated). + opt.ContainerExpirationPolicyAttributes.NameRegex = opt.ContainerExpirationPolicyAttributes.NameRegexDelete + } + + var err error + var req *retryablehttp.Request + u := fmt.Sprintf("projects/user/%d", user) + + if opt.Avatar == nil { + req, err = s.client.NewRequest(http.MethodPost, u, opt, options) + } else { + req, err = s.client.UploadRequest( + http.MethodPost, + u, + opt.Avatar.Image, + opt.Avatar.Filename, + UploadAvatar, + opt, + options, + ) + } + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// EditProjectOptions represents the available EditProject() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#edit-project +type EditProjectOptions struct { + AllowMergeOnSkippedPipeline *bool `url:"allow_merge_on_skipped_pipeline,omitempty" json:"allow_merge_on_skipped_pipeline,omitempty"` + OnlyAllowMergeIfAllStatusChecksPassed *bool `url:"only_allow_merge_if_all_status_checks_passed,omitempty" json:"only_allow_merge_if_all_status_checks_passed,omitempty"` + AnalyticsAccessLevel *AccessControlValue `url:"analytics_access_level,omitempty" json:"analytics_access_level,omitempty"` + ApprovalsBeforeMerge *int `url:"approvals_before_merge,omitempty" json:"approvals_before_merge,omitempty"` + AutoCancelPendingPipelines *string `url:"auto_cancel_pending_pipelines,omitempty" json:"auto_cancel_pending_pipelines,omitempty"` + AutoDevopsDeployStrategy *string `url:"auto_devops_deploy_strategy,omitempty" json:"auto_devops_deploy_strategy,omitempty"` + AutoDevopsEnabled *bool `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"` + AutocloseReferencedIssues *bool `url:"autoclose_referenced_issues,omitempty" json:"autoclose_referenced_issues,omitempty"` + Avatar *ProjectAvatar `url:"-" json:"avatar,omitempty"` + BuildCoverageRegex *string `url:"build_coverage_regex,omitempty" json:"build_coverage_regex,omitempty"` + BuildGitStrategy *string `url:"build_git_strategy,omitempty" json:"build_git_strategy,omitempty"` + BuildTimeout *int `url:"build_timeout,omitempty" json:"build_timeout,omitempty"` + BuildsAccessLevel *AccessControlValue `url:"builds_access_level,omitempty" json:"builds_access_level,omitempty"` + CIConfigPath *string `url:"ci_config_path,omitempty" json:"ci_config_path,omitempty"` + CIDefaultGitDepth *int `url:"ci_default_git_depth,omitempty" json:"ci_default_git_depth,omitempty"` + CIForwardDeploymentEnabled *bool `url:"ci_forward_deployment_enabled,omitempty" json:"ci_forward_deployment_enabled,omitempty"` + CISeperateCache *bool `url:"ci_separated_caches,omitempty" json:"ci_separated_caches,omitempty"` + ContainerExpirationPolicyAttributes *ContainerExpirationPolicyAttributes `url:"container_expiration_policy_attributes,omitempty" json:"container_expiration_policy_attributes,omitempty"` + ContainerRegistryAccessLevel *AccessControlValue `url:"container_registry_access_level,omitempty" json:"container_registry_access_level,omitempty"` + DefaultBranch *string `url:"default_branch,omitempty" json:"default_branch,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + EmailsDisabled *bool `url:"emails_disabled,omitempty" json:"emails_disabled,omitempty"` + EnforceAuthChecksOnUploads *bool `url:"enforce_auth_checks_on_uploads,omitempty" json:"enforce_auth_checks_on_uploads,omitempty"` + ExternalAuthorizationClassificationLabel *string `url:"external_authorization_classification_label,omitempty" json:"external_authorization_classification_label,omitempty"` + ForkingAccessLevel *AccessControlValue `url:"forking_access_level,omitempty" json:"forking_access_level,omitempty"` + ImportURL *string `url:"import_url,omitempty" json:"import_url,omitempty"` + IssuesAccessLevel *AccessControlValue `url:"issues_access_level,omitempty" json:"issues_access_level,omitempty"` + IssueBranchTemplate *string `url:"issue_branch_template,omitempty" json:"issue_branch_template,omitempty"` + IssuesTemplate *string `url:"issues_template,omitempty" json:"issues_template,omitempty"` + KeepLatestArtifact *bool `url:"keep_latest_artifact,omitempty" json:"keep_latest_artifact,omitempty"` + LFSEnabled *bool `url:"lfs_enabled,omitempty" json:"lfs_enabled,omitempty"` + MergeCommitTemplate *string `url:"merge_commit_template,omitempty" json:"merge_commit_template,omitempty"` + MergeRequestDefaultTargetSelf *bool `url:"mr_default_target_self,omitempty" json:"mr_default_target_self,omitempty"` + MergeMethod *MergeMethodValue `url:"merge_method,omitempty" json:"merge_method,omitempty"` + MergePipelinesEnabled *bool `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"` + MergeRequestsAccessLevel *AccessControlValue `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"` + MergeRequestsTemplate *string `url:"merge_requests_template,omitempty" json:"merge_requests_template,omitempty"` + MergeTrainsEnabled *bool `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"` + Mirror *bool `url:"mirror,omitempty" json:"mirror,omitempty"` + MirrorOverwritesDivergedBranches *bool `url:"mirror_overwrites_diverged_branches,omitempty" json:"mirror_overwrites_diverged_branches,omitempty"` + MirrorTriggerBuilds *bool `url:"mirror_trigger_builds,omitempty" json:"mirror_trigger_builds,omitempty"` + MirrorUserID *int `url:"mirror_user_id,omitempty" json:"mirror_user_id,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + OnlyAllowMergeIfAllDiscussionsAreResolved *bool `url:"only_allow_merge_if_all_discussions_are_resolved,omitempty" json:"only_allow_merge_if_all_discussions_are_resolved,omitempty"` + OnlyAllowMergeIfPipelineSucceeds *bool `url:"only_allow_merge_if_pipeline_succeeds,omitempty" json:"only_allow_merge_if_pipeline_succeeds,omitempty"` + OnlyMirrorProtectedBranches *bool `url:"only_mirror_protected_branches,omitempty" json:"only_mirror_protected_branches,omitempty"` + OperationsAccessLevel *AccessControlValue `url:"operations_access_level,omitempty" json:"operations_access_level,omitempty"` + PackagesEnabled *bool `url:"packages_enabled,omitempty" json:"packages_enabled,omitempty"` + PagesAccessLevel *AccessControlValue `url:"pages_access_level,omitempty" json:"pages_access_level,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + PublicBuilds *bool `url:"public_builds,omitempty" json:"public_builds,omitempty"` + ReleasesAccessLevel *AccessControlValue `url:"releases_access_level,omitempty" json:"releases_access_level,omitempty"` + EnvironmentsAccessLevel *AccessControlValue `url:"environments_access_level,omitempty" json:"environments_access_level,omitempty"` + FeatureFlagsAccessLevel *AccessControlValue `url:"feature_flags_access_level,omitempty" json:"feature_flags_access_level,omitempty"` + InfrastructureAccessLevel *AccessControlValue `url:"infrastructure_access_level,omitempty" json:"infrastructure_access_level,omitempty"` + MonitorAccessLevel *AccessControlValue `url:"monitor_access_level,omitempty" json:"monitor_access_level,omitempty"` + RemoveSourceBranchAfterMerge *bool `url:"remove_source_branch_after_merge,omitempty" json:"remove_source_branch_after_merge,omitempty"` + PrintingMergeRequestLinkEnabled *bool `url:"printing_merge_request_link_enabled,omitempty" json:"printing_merge_request_link_enabled,omitempty"` + RepositoryAccessLevel *AccessControlValue `url:"repository_access_level,omitempty" json:"repository_access_level,omitempty"` + RepositoryStorage *string `url:"repository_storage,omitempty" json:"repository_storage,omitempty"` + RequestAccessEnabled *bool `url:"request_access_enabled,omitempty" json:"request_access_enabled,omitempty"` + RequirementsAccessLevel *AccessControlValue `url:"requirements_access_level,omitempty" json:"requirements_access_level,omitempty"` + ResolveOutdatedDiffDiscussions *bool `url:"resolve_outdated_diff_discussions,omitempty" json:"resolve_outdated_diff_discussions,omitempty"` + RestrictUserDefinedVariables *bool `url:"restrict_user_defined_variables,omitempty" json:"restrict_user_defined_variables,omitempty"` + SecurityAndComplianceAccessLevel *AccessControlValue `url:"security_and_compliance_access_level,omitempty" json:"security_and_compliance_access_level,omitempty"` + ServiceDeskEnabled *bool `url:"service_desk_enabled,omitempty" json:"service_desk_enabled,omitempty"` + SharedRunnersEnabled *bool `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"` + GroupRunnersEnabled *bool `url:"group_runners_enabled,omitempty" json:"group_runners_enabled,omitempty"` + ShowDefaultAwardEmojis *bool `url:"show_default_award_emojis,omitempty" json:"show_default_award_emojis,omitempty"` + SnippetsAccessLevel *AccessControlValue `url:"snippets_access_level,omitempty" json:"snippets_access_level,omitempty"` + SquashCommitTemplate *string `url:"squash_commit_template,omitempty" json:"squash_commit_template,omitempty"` + SquashOption *SquashOptionValue `url:"squash_option,omitempty" json:"squash_option,omitempty"` + SuggestionCommitMessage *string `url:"suggestion_commit_message,omitempty" json:"suggestion_commit_message,omitempty"` + Topics *[]string `url:"topics,omitempty" json:"topics,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + WikiAccessLevel *AccessControlValue `url:"wiki_access_level,omitempty" json:"wiki_access_level,omitempty"` + + // Deprecated: Use ContainerRegistryAccessLevel instead. + ContainerRegistryEnabled *bool `url:"container_registry_enabled,omitempty" json:"container_registry_enabled,omitempty"` + // Deprecated: Use IssuesAccessLevel instead. + IssuesEnabled *bool `url:"issues_enabled,omitempty" json:"issues_enabled,omitempty"` + // Deprecated: Use BuildsAccessLevel instead. + JobsEnabled *bool `url:"jobs_enabled,omitempty" json:"jobs_enabled,omitempty"` + // Deprecated: Use MergeRequestsAccessLevel instead. + MergeRequestsEnabled *bool `url:"merge_requests_enabled,omitempty" json:"merge_requests_enabled,omitempty"` + // Deprecated: Use SnippetsAccessLevel instead. + SnippetsEnabled *bool `url:"snippets_enabled,omitempty" json:"snippets_enabled,omitempty"` + // Deprecated: Use Topics instead. (Deprecated in GitLab 14.0) + TagList *[]string `url:"tag_list,omitempty" json:"tag_list,omitempty"` + // Deprecated: Use WikiAccessLevel instead. + WikiEnabled *bool `url:"wiki_enabled,omitempty" json:"wiki_enabled,omitempty"` +} + +// EditProject updates an existing project. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#edit-project +func (s *ProjectsService) EditProject(pid interface{}, opt *EditProjectOptions, options ...RequestOptionFunc) (*Project, *Response, error) { + if opt.ContainerExpirationPolicyAttributes != nil { + // This is needed to satisfy the API. Should be deleted + // when NameRegex is removed (it's now deprecated). + opt.ContainerExpirationPolicyAttributes.NameRegex = opt.ContainerExpirationPolicyAttributes.NameRegexDelete + } + + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s", PathEscape(project)) + + var req *retryablehttp.Request + + if opt.Avatar == nil || (opt.Avatar.Filename == "" && opt.Avatar.Image == nil) { + req, err = s.client.NewRequest(http.MethodPut, u, opt, options) + } else { + req, err = s.client.UploadRequest( + http.MethodPut, + u, + opt.Avatar.Image, + opt.Avatar.Filename, + UploadAvatar, + opt, + options, + ) + } + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ForkProjectOptions represents the available ForkProject() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#fork-project +type ForkProjectOptions struct { + Description *string `url:"description,omitempty" json:"description,omitempty"` + MergeRequestDefaultTargetSelf *bool `url:"mr_default_target_self,omitempty" json:"mr_default_target_self,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + NamespaceID *int `url:"namespace_id,omitempty" json:"namespace_id,omitempty"` + NamespacePath *string `url:"namespace_path,omitempty" json:"namespace_path,omitempty"` + Path *string `url:"path,omitempty" json:"path,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + + // Deprecated: This parameter has been split into NamespaceID and NamespacePath. + Namespace *string `url:"namespace,omitempty" json:"namespace,omitempty"` +} + +// ForkProject forks a project into the user namespace of the authenticated +// user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#fork-project +func (s *ProjectsService) ForkProject(pid interface{}, opt *ForkProjectOptions, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/fork", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// StarProject stars a given the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#star-a-project +func (s *ProjectsService) StarProject(pid interface{}, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/star", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// UnstarProject unstars a given project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#unstar-a-project +func (s *ProjectsService) UnstarProject(pid interface{}, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/unstar", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ArchiveProject archives the project if the user is either admin or the +// project owner of this project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#archive-a-project +func (s *ProjectsService) ArchiveProject(pid interface{}, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/archive", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// UnarchiveProject unarchives the project if the user is either admin or +// the project owner of this project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#unarchive-a-project +func (s *ProjectsService) UnarchiveProject(pid interface{}, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/unarchive", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// DeleteProject removes a project including all associated resources +// (issues, merge requests etc.) +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#delete-project +func (s *ProjectsService) DeleteProject(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ShareWithGroupOptions represents options to share project with groups +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#share-project-with-group +type ShareWithGroupOptions struct { + ExpiresAt *string `url:"expires_at" json:"expires_at"` + GroupAccess *AccessLevelValue `url:"group_access" json:"group_access"` + GroupID *int `url:"group_id" json:"group_id"` +} + +// ShareProjectWithGroup allows to share a project with a group. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#share-project-with-group +func (s *ProjectsService) ShareProjectWithGroup(pid interface{}, opt *ShareWithGroupOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/share", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteSharedProjectFromGroup allows to unshare a project from a group. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#delete-a-shared-project-link-within-a-group +func (s *ProjectsService) DeleteSharedProjectFromGroup(pid interface{}, groupID int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/share/%d", PathEscape(project), groupID) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ProjectMember represents a project member. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/members.html#list-all-members-of-a-group-or-project +type ProjectMember struct { + ID int `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Name string `json:"name"` + State string `json:"state"` + CreatedAt *time.Time `json:"created_at"` + ExpiresAt *ISOTime `json:"expires_at"` + AccessLevel AccessLevelValue `json:"access_level"` + WebURL string `json:"web_url"` + AvatarURL string `json:"avatar_url"` +} + +// ProjectHook represents a project hook. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#list-project-hooks +type ProjectHook struct { + ID int `json:"id"` + URL string `json:"url"` + ConfidentialNoteEvents bool `json:"confidential_note_events"` + ProjectID int `json:"project_id"` + PushEvents bool `json:"push_events"` + PushEventsBranchFilter string `json:"push_events_branch_filter"` + IssuesEvents bool `json:"issues_events"` + ConfidentialIssuesEvents bool `json:"confidential_issues_events"` + MergeRequestsEvents bool `json:"merge_requests_events"` + TagPushEvents bool `json:"tag_push_events"` + NoteEvents bool `json:"note_events"` + JobEvents bool `json:"job_events"` + PipelineEvents bool `json:"pipeline_events"` + WikiPageEvents bool `json:"wiki_page_events"` + DeploymentEvents bool `json:"deployment_events"` + ReleasesEvents bool `json:"releases_events"` + EnableSSLVerification bool `json:"enable_ssl_verification"` + CreatedAt *time.Time `json:"created_at"` +} + +// ListProjectHooksOptions represents the available ListProjectHooks() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#list-project-hooks +type ListProjectHooksOptions ListOptions + +// ListProjectHooks gets a list of project hooks. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#list-project-hooks +func (s *ProjectsService) ListProjectHooks(pid interface{}, opt *ListProjectHooksOptions, options ...RequestOptionFunc) ([]*ProjectHook, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/hooks", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ph []*ProjectHook + resp, err := s.client.Do(req, &ph) + if err != nil { + return nil, resp, err + } + + return ph, resp, err +} + +// GetProjectHook gets a specific hook for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#get-project-hook +func (s *ProjectsService) GetProjectHook(pid interface{}, hook int, options ...RequestOptionFunc) (*ProjectHook, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/hooks/%d", PathEscape(project), hook) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ph := new(ProjectHook) + resp, err := s.client.Do(req, ph) + if err != nil { + return nil, resp, err + } + + return ph, resp, err +} + +// AddProjectHookOptions represents the available AddProjectHook() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#add-project-hook +type AddProjectHookOptions struct { + ConfidentialIssuesEvents *bool `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"` + ConfidentialNoteEvents *bool `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"` + DeploymentEvents *bool `url:"deployment_events,omitempty" json:"deployment_events,omitempty"` + EnableSSLVerification *bool `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"` + IssuesEvents *bool `url:"issues_events,omitempty" json:"issues_events,omitempty"` + JobEvents *bool `url:"job_events,omitempty" json:"job_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + NoteEvents *bool `url:"note_events,omitempty" json:"note_events,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + PushEventsBranchFilter *string `url:"push_events_branch_filter,omitempty" json:"push_events_branch_filter,omitempty"` + ReleasesEvents *bool `url:"releases_events,omitempty" json:"releases_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` + URL *string `url:"url,omitempty" json:"url,omitempty"` + WikiPageEvents *bool `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"` +} + +// AddProjectHook adds a hook to a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#add-project-hook +func (s *ProjectsService) AddProjectHook(pid interface{}, opt *AddProjectHookOptions, options ...RequestOptionFunc) (*ProjectHook, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/hooks", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + ph := new(ProjectHook) + resp, err := s.client.Do(req, ph) + if err != nil { + return nil, resp, err + } + + return ph, resp, err +} + +// EditProjectHookOptions represents the available EditProjectHook() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#edit-project-hook +type EditProjectHookOptions struct { + ConfidentialIssuesEvents *bool `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"` + ConfidentialNoteEvents *bool `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"` + DeploymentEvents *bool `url:"deployment_events,omitempty" json:"deployment_events,omitempty"` + EnableSSLVerification *bool `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"` + IssuesEvents *bool `url:"issues_events,omitempty" json:"issues_events,omitempty"` + JobEvents *bool `url:"job_events,omitempty" json:"job_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + NoteEvents *bool `url:"note_events,omitempty" json:"note_events,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + PushEventsBranchFilter *string `url:"push_events_branch_filter,omitempty" json:"push_events_branch_filter,omitempty"` + ReleasesEvents *bool `url:"releases_events,omitempty" json:"releases_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` + URL *string `url:"url,omitempty" json:"url,omitempty"` + WikiPageEvents *bool `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"` +} + +// EditProjectHook edits a hook for a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#edit-project-hook +func (s *ProjectsService) EditProjectHook(pid interface{}, hook int, opt *EditProjectHookOptions, options ...RequestOptionFunc) (*ProjectHook, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/hooks/%d", PathEscape(project), hook) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ph := new(ProjectHook) + resp, err := s.client.Do(req, ph) + if err != nil { + return nil, resp, err + } + + return ph, resp, err +} + +// DeleteProjectHook removes a hook from a project. This is an idempotent +// method and can be called multiple times. Either the hook is available or not. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#delete-project-hook +func (s *ProjectsService) DeleteProjectHook(pid interface{}, hook int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/hooks/%d", PathEscape(project), hook) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ProjectForkRelation represents a project fork relationship. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#admin-fork-relation +type ProjectForkRelation struct { + ID int `json:"id"` + ForkedToProjectID int `json:"forked_to_project_id"` + ForkedFromProjectID int `json:"forked_from_project_id"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` +} + +// CreateProjectForkRelation creates a forked from/to relation between +// existing projects. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#create-a-forked-fromto-relation-between-existing-projects. +func (s *ProjectsService) CreateProjectForkRelation(pid interface{}, fork int, options ...RequestOptionFunc) (*ProjectForkRelation, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/fork/%d", PathEscape(project), fork) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + pfr := new(ProjectForkRelation) + resp, err := s.client.Do(req, pfr) + if err != nil { + return nil, resp, err + } + + return pfr, resp, err +} + +// DeleteProjectForkRelation deletes an existing forked from relationship. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#delete-an-existing-forked-from-relationship +func (s *ProjectsService) DeleteProjectForkRelation(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/fork", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ProjectFile represents an uploaded project file. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#upload-a-file +type ProjectFile struct { + Alt string `json:"alt"` + URL string `json:"url"` + Markdown string `json:"markdown"` +} + +// UploadFile uploads a file. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#upload-a-file +func (s *ProjectsService) UploadFile(pid interface{}, content io.Reader, filename string, options ...RequestOptionFunc) (*ProjectFile, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/uploads", PathEscape(project)) + + req, err := s.client.UploadRequest( + http.MethodPost, + u, + content, + filename, + UploadFile, + nil, + options, + ) + if err != nil { + return nil, nil, err + } + + pf := new(ProjectFile) + resp, err := s.client.Do(req, pf) + if err != nil { + return nil, resp, err + } + + return pf, resp, nil +} + +// UploadAvatar uploads an avatar. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#upload-a-project-avatar +func (s *ProjectsService) UploadAvatar(pid interface{}, avatar io.Reader, filename string, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s", PathEscape(project)) + + req, err := s.client.UploadRequest( + http.MethodPut, + u, + avatar, + filename, + UploadAvatar, + nil, + options, + ) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ListProjectForks gets a list of project forks. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#list-forks-of-a-project +func (s *ProjectsService) ListProjectForks(pid interface{}, opt *ListProjectsOptions, options ...RequestOptionFunc) ([]*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/forks", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var forks []*Project + resp, err := s.client.Do(req, &forks) + if err != nil { + return nil, resp, err + } + + return forks, resp, err +} + +// ProjectPushRules represents a project push rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#push-rules +type ProjectPushRules struct { + ID int `json:"id"` + ProjectID int `json:"project_id"` + CommitMessageRegex string `json:"commit_message_regex"` + CommitMessageNegativeRegex string `json:"commit_message_negative_regex"` + BranchNameRegex string `json:"branch_name_regex"` + DenyDeleteTag bool `json:"deny_delete_tag"` + CreatedAt *time.Time `json:"created_at"` + MemberCheck bool `json:"member_check"` + PreventSecrets bool `json:"prevent_secrets"` + AuthorEmailRegex string `json:"author_email_regex"` + FileNameRegex string `json:"file_name_regex"` + MaxFileSize int `json:"max_file_size"` + CommitCommitterCheck bool `json:"commit_committer_check"` + RejectUnsignedCommits bool `json:"reject_unsigned_commits"` +} + +// GetProjectPushRules gets the push rules of a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#get-project-push-rules +func (s *ProjectsService) GetProjectPushRules(pid interface{}, options ...RequestOptionFunc) (*ProjectPushRules, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/push_rule", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ppr := new(ProjectPushRules) + resp, err := s.client.Do(req, ppr) + if err != nil { + return nil, resp, err + } + + return ppr, resp, err +} + +// AddProjectPushRuleOptions represents the available AddProjectPushRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#add-project-push-rule +type AddProjectPushRuleOptions struct { + AuthorEmailRegex *string `url:"author_email_regex,omitempty" json:"author_email_regex,omitempty"` + BranchNameRegex *string `url:"branch_name_regex,omitempty" json:"branch_name_regex,omitempty"` + CommitCommitterCheck *bool `url:"commit_committer_check,omitempty" json:"commit_committer_check,omitempty"` + CommitMessageNegativeRegex *string `url:"commit_message_negative_regex,omitempty" json:"commit_message_negative_regex,omitempty"` + CommitMessageRegex *string `url:"commit_message_regex,omitempty" json:"commit_message_regex,omitempty"` + DenyDeleteTag *bool `url:"deny_delete_tag,omitempty" json:"deny_delete_tag,omitempty"` + FileNameRegex *string `url:"file_name_regex,omitempty" json:"file_name_regex,omitempty"` + MaxFileSize *int `url:"max_file_size,omitempty" json:"max_file_size,omitempty"` + MemberCheck *bool `url:"member_check,omitempty" json:"member_check,omitempty"` + PreventSecrets *bool `url:"prevent_secrets,omitempty" json:"prevent_secrets,omitempty"` + RejectUnsignedCommits *bool `url:"reject_unsigned_commits,omitempty" json:"reject_unsigned_commits,omitempty"` +} + +// AddProjectPushRule adds a push rule to a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#add-project-push-rule +func (s *ProjectsService) AddProjectPushRule(pid interface{}, opt *AddProjectPushRuleOptions, options ...RequestOptionFunc) (*ProjectPushRules, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/push_rule", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + ppr := new(ProjectPushRules) + resp, err := s.client.Do(req, ppr) + if err != nil { + return nil, resp, err + } + + return ppr, resp, err +} + +// EditProjectPushRuleOptions represents the available EditProjectPushRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#edit-project-push-rule +type EditProjectPushRuleOptions struct { + AuthorEmailRegex *string `url:"author_email_regex,omitempty" json:"author_email_regex,omitempty"` + BranchNameRegex *string `url:"branch_name_regex,omitempty" json:"branch_name_regex,omitempty"` + CommitCommitterCheck *bool `url:"commit_committer_check,omitempty" json:"commit_committer_check,omitempty"` + CommitMessageNegativeRegex *string `url:"commit_message_negative_regex,omitempty" json:"commit_message_negative_regex,omitempty"` + CommitMessageRegex *string `url:"commit_message_regex,omitempty" json:"commit_message_regex,omitempty"` + DenyDeleteTag *bool `url:"deny_delete_tag,omitempty" json:"deny_delete_tag,omitempty"` + FileNameRegex *string `url:"file_name_regex,omitempty" json:"file_name_regex,omitempty"` + MaxFileSize *int `url:"max_file_size,omitempty" json:"max_file_size,omitempty"` + MemberCheck *bool `url:"member_check,omitempty" json:"member_check,omitempty"` + PreventSecrets *bool `url:"prevent_secrets,omitempty" json:"prevent_secrets,omitempty"` + RejectUnsignedCommits *bool `url:"reject_unsigned_commits,omitempty" json:"reject_unsigned_commits,omitempty"` +} + +// EditProjectPushRule edits a push rule for a specified project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#edit-project-push-rule +func (s *ProjectsService) EditProjectPushRule(pid interface{}, opt *EditProjectPushRuleOptions, options ...RequestOptionFunc) (*ProjectPushRules, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/push_rule", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ppr := new(ProjectPushRules) + resp, err := s.client.Do(req, ppr) + if err != nil { + return nil, resp, err + } + + return ppr, resp, err +} + +// DeleteProjectPushRule removes a push rule from a project. This is an +// idempotent method and can be called multiple times. Either the push rule is +// available or not. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#delete-project-push-rule +func (s *ProjectsService) DeleteProjectPushRule(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/push_rule", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ProjectApprovals represents GitLab project level merge request approvals. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals +type ProjectApprovals struct { + Approvers []*MergeRequestApproverUser `json:"approvers"` + ApproverGroups []*MergeRequestApproverGroup `json:"approver_groups"` + ApprovalsBeforeMerge int `json:"approvals_before_merge"` + ResetApprovalsOnPush bool `json:"reset_approvals_on_push"` + DisableOverridingApproversPerMergeRequest bool `json:"disable_overriding_approvers_per_merge_request"` + MergeRequestsAuthorApproval bool `json:"merge_requests_author_approval"` + MergeRequestsDisableCommittersApproval bool `json:"merge_requests_disable_committers_approval"` + RequirePasswordToApprove bool `json:"require_password_to_approve"` + SelectiveCodeOwnerRemovals bool `json:"selective_code_owner_removals,omitempty"` +} + +// GetApprovalConfiguration get the approval configuration for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-configuration +func (s *ProjectsService) GetApprovalConfiguration(pid interface{}, options ...RequestOptionFunc) (*ProjectApprovals, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/approvals", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pa := new(ProjectApprovals) + resp, err := s.client.Do(req, pa) + if err != nil { + return nil, resp, err + } + + return pa, resp, err +} + +// ChangeApprovalConfigurationOptions represents the available +// ApprovalConfiguration() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-configuration +type ChangeApprovalConfigurationOptions struct { + ApprovalsBeforeMerge *int `url:"approvals_before_merge,omitempty" json:"approvals_before_merge,omitempty"` + DisableOverridingApproversPerMergeRequest *bool `url:"disable_overriding_approvers_per_merge_request,omitempty" json:"disable_overriding_approvers_per_merge_request,omitempty"` + MergeRequestsAuthorApproval *bool `url:"merge_requests_author_approval,omitempty" json:"merge_requests_author_approval,omitempty"` + MergeRequestsDisableCommittersApproval *bool `url:"merge_requests_disable_committers_approval,omitempty" json:"merge_requests_disable_committers_approval,omitempty"` + RequirePasswordToApprove *bool `url:"require_password_to_approve,omitempty" json:"require_password_to_approve,omitempty"` + ResetApprovalsOnPush *bool `url:"reset_approvals_on_push,omitempty" json:"reset_approvals_on_push,omitempty"` + SelectiveCodeOwnerRemovals *bool `url:"selective_code_owner_removals,omitempty" json:"selective_code_owner_removals,omitempty"` +} + +// ChangeApprovalConfiguration updates the approval configuration for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-configuration +func (s *ProjectsService) ChangeApprovalConfiguration(pid interface{}, opt *ChangeApprovalConfigurationOptions, options ...RequestOptionFunc) (*ProjectApprovals, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/approvals", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pa := new(ProjectApprovals) + resp, err := s.client.Do(req, pa) + if err != nil { + return nil, resp, err + } + + return pa, resp, err +} + +// GetProjectApprovalRulesListsOptions represents the available GetProjectApprovalRules() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules +type GetProjectApprovalRulesListsOptions ListOptions + +// GetProjectApprovalRules looks up the list of project level approver rules. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules +func (s *ProjectsService) GetProjectApprovalRules(pid interface{}, opt *GetProjectApprovalRulesListsOptions, options ...RequestOptionFunc) ([]*ProjectApprovalRule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/approval_rules", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var par []*ProjectApprovalRule + resp, err := s.client.Do(req, &par) + if err != nil { + return nil, resp, err + } + + return par, resp, err +} + +// GetProjectApprovalRule gets the project level approvers. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-a-single-project-level-rule +func (s *ProjectsService) GetProjectApprovalRule(pid interface{}, ruleID int, options ...RequestOptionFunc) (*ProjectApprovalRule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/approval_rules/%d", PathEscape(project), ruleID) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + par := new(ProjectApprovalRule) + resp, err := s.client.Do(req, &par) + if err != nil { + return nil, resp, err + } + + return par, resp, err +} + +// CreateProjectLevelRuleOptions represents the available CreateProjectApprovalRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-project-level-rule +type CreateProjectLevelRuleOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ApprovalsRequired *int `url:"approvals_required,omitempty" json:"approvals_required,omitempty"` + RuleType *string `url:"rule_type,omitempty" json:"rule_type,omitempty"` + UserIDs *[]int `url:"user_ids,omitempty" json:"user_ids,omitempty"` + GroupIDs *[]int `url:"group_ids,omitempty" json:"group_ids,omitempty"` + ProtectedBranchIDs *[]int `url:"protected_branch_ids,omitempty" json:"protected_branch_ids,omitempty"` + AppliesToAllProtectedBranches *bool `url:"applies_to_all_protected_branches,omitempty" json:"applies_to_all_protected_branches,omitempty"` +} + +// CreateProjectApprovalRule creates a new project-level approval rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-project-level-rule +func (s *ProjectsService) CreateProjectApprovalRule(pid interface{}, opt *CreateProjectLevelRuleOptions, options ...RequestOptionFunc) (*ProjectApprovalRule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/approval_rules", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + par := new(ProjectApprovalRule) + resp, err := s.client.Do(req, &par) + if err != nil { + return nil, resp, err + } + + return par, resp, err +} + +// UpdateProjectLevelRuleOptions represents the available UpdateProjectApprovalRule() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-project-level-rule +type UpdateProjectLevelRuleOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ApprovalsRequired *int `url:"approvals_required,omitempty" json:"approvals_required,omitempty"` + UserIDs *[]int `url:"user_ids,omitempty" json:"user_ids,omitempty"` + GroupIDs *[]int `url:"group_ids,omitempty" json:"group_ids,omitempty"` + ProtectedBranchIDs *[]int `url:"protected_branch_ids,omitempty" json:"protected_branch_ids,omitempty"` + AppliesToAllProtectedBranches *bool `url:"applies_to_all_protected_branches,omitempty" json:"applies_to_all_protected_branches,omitempty"` +} + +// UpdateProjectApprovalRule updates an existing approval rule with new options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-project-level-rule +func (s *ProjectsService) UpdateProjectApprovalRule(pid interface{}, approvalRule int, opt *UpdateProjectLevelRuleOptions, options ...RequestOptionFunc) (*ProjectApprovalRule, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/approval_rules/%d", PathEscape(project), approvalRule) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + par := new(ProjectApprovalRule) + resp, err := s.client.Do(req, &par) + if err != nil { + return nil, resp, err + } + + return par, resp, err +} + +// DeleteProjectApprovalRule deletes a project-level approval rule. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#delete-project-level-rule +func (s *ProjectsService) DeleteProjectApprovalRule(pid interface{}, approvalRule int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/approval_rules/%d", PathEscape(project), approvalRule) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ChangeAllowedApproversOptions represents the available ChangeAllowedApprovers() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers +type ChangeAllowedApproversOptions struct { + ApproverGroupIDs *[]int `url:"approver_group_ids,omitempty" json:"approver_group_ids,omitempty"` + ApproverIDs *[]int `url:"approver_ids,omitempty" json:"approver_ids,omitempty"` +} + +// ChangeAllowedApprovers updates the list of approvers and approver groups. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers +func (s *ProjectsService) ChangeAllowedApprovers(pid interface{}, opt *ChangeAllowedApproversOptions, options ...RequestOptionFunc) (*ProjectApprovals, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/approvers", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + pa := new(ProjectApprovals) + resp, err := s.client.Do(req, pa) + if err != nil { + return nil, resp, err + } + + return pa, resp, err +} + +// ProjectPullMirrorDetails represent the details of the configuration pull +// mirror and its update status. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#get-a-projects-pull-mirror-details +type ProjectPullMirrorDetails struct { + ID int `json:"id"` + LastError string `json:"last_error"` + LastSuccessfulUpdateAt *time.Time `json:"last_successful_update_at"` + LastUpdateAt *time.Time `json:"last_update_at"` + LastUpdateStartedAt *time.Time `json:"last_update_started_at"` + UpdateStatus string `json:"update_status"` + URL string `json:"url"` +} + +// GetProjectPullMirrorDetails returns the pull mirror details. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#get-a-projects-pull-mirror-details +func (s *ProjectsService) GetProjectPullMirrorDetails(pid interface{}, options ...RequestOptionFunc) (*ProjectPullMirrorDetails, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/mirror/pull", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pmd := new(ProjectPullMirrorDetails) + resp, err := s.client.Do(req, pmd) + if err != nil { + return nil, resp, err + } + + return pmd, resp, err +} + +// StartMirroringProject start the pull mirroring process for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#start-the-pull-mirroring-process-for-a-project +func (s *ProjectsService) StartMirroringProject(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/mirror/pull", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + resp, err := s.client.Do(req, nil) + if err != nil { + return resp, err + } + + return resp, err +} + +// TransferProjectOptions represents the available TransferProject() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#transfer-a-project-to-a-new-namespace +type TransferProjectOptions struct { + Namespace interface{} `url:"namespace,omitempty" json:"namespace,omitempty"` +} + +// TransferProject transfer a project into the specified namespace +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#transfer-a-project-to-a-new-namespace +func (s *ProjectsService) TransferProject(pid interface{}, opt *TransferProjectOptions, options ...RequestOptionFunc) (*Project, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/transfer", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(Project) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// StartHousekeepingProject start the Housekeeping task for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#start-the-housekeeping-task-for-a-project +func (s *ProjectsService) StartHousekeepingProject(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/housekeeping", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// GetRepositoryStorage Get the path to repository storage. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/projects.html#get-the-path-to-repository-storage +type ProjectReposityStorage struct { + ProjectID int `json:"project_id"` + DiskPath string `json:"disk_path"` + CreatedAt *time.Time `json:"created_at"` + RepositoryStorage string `json:"repository_storage"` +} + +func (s *ProjectsService) GetRepositoryStorage(pid interface{}, options ...RequestOptionFunc) (*ProjectReposityStorage, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/storage", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + prs := new(ProjectReposityStorage) + resp, err := s.client.Do(req, prs) + if err != nil { + return nil, resp, err + } + + return prs, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/protected_branches.go b/vendor/github.com/xanzy/go-gitlab/protected_branches.go new file mode 100644 index 0000000000..b398bdb475 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/protected_branches.go @@ -0,0 +1,257 @@ +// +// Copyright 2021, Sander van Harmelen, Michael Lihs +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// ProtectedBranchesService handles communication with the protected branch +// related methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html +type ProtectedBranchesService struct { + client *Client +} + +// ProtectedBranch represents a protected branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#list-protected-branches +type ProtectedBranch struct { + ID int `json:"id"` + Name string `json:"name"` + PushAccessLevels []*BranchAccessDescription `json:"push_access_levels"` + MergeAccessLevels []*BranchAccessDescription `json:"merge_access_levels"` + UnprotectAccessLevels []*BranchAccessDescription `json:"unprotect_access_levels"` + AllowForcePush bool `json:"allow_force_push"` + CodeOwnerApprovalRequired bool `json:"code_owner_approval_required"` +} + +// BranchAccessDescription represents the access description for a protected +// branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#list-protected-branches +type BranchAccessDescription struct { + ID int `json:"id"` + AccessLevel AccessLevelValue `json:"access_level"` + AccessLevelDescription string `json:"access_level_description"` + UserID int `json:"user_id"` + GroupID int `json:"group_id"` +} + +// ListProtectedBranchesOptions represents the available ListProtectedBranches() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#list-protected-branches +type ListProtectedBranchesOptions struct { + ListOptions + Search *string `url:"search,omitempty" json:"search,omitempty"` +} + +// ListProtectedBranches gets a list of protected branches from a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#list-protected-branches +func (s *ProtectedBranchesService) ListProtectedBranches(pid interface{}, opt *ListProtectedBranchesOptions, options ...RequestOptionFunc) ([]*ProtectedBranch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_branches", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var p []*ProtectedBranch + resp, err := s.client.Do(req, &p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// GetProtectedBranch gets a single protected branch or wildcard protected branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#get-a-single-protected-branch-or-wildcard-protected-branch +func (s *ProtectedBranchesService) GetProtectedBranch(pid interface{}, branch string, options ...RequestOptionFunc) (*ProtectedBranch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_branches/%s", PathEscape(project), url.PathEscape(branch)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + p := new(ProtectedBranch) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// ProtectRepositoryBranchesOptions represents the available +// ProtectRepositoryBranches() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#protect-repository-branches +type ProtectRepositoryBranchesOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + PushAccessLevel *AccessLevelValue `url:"push_access_level,omitempty" json:"push_access_level,omitempty"` + MergeAccessLevel *AccessLevelValue `url:"merge_access_level,omitempty" json:"merge_access_level,omitempty"` + UnprotectAccessLevel *AccessLevelValue `url:"unprotect_access_level,omitempty" json:"unprotect_access_level,omitempty"` + AllowForcePush *bool `url:"allow_force_push,omitempty" json:"allow_force_push,omitempty"` + AllowedToPush *[]*BranchPermissionOptions `url:"allowed_to_push,omitempty" json:"allowed_to_push,omitempty"` + AllowedToMerge *[]*BranchPermissionOptions `url:"allowed_to_merge,omitempty" json:"allowed_to_merge,omitempty"` + AllowedToUnprotect *[]*BranchPermissionOptions `url:"allowed_to_unprotect,omitempty" json:"allowed_to_unprotect,omitempty"` + CodeOwnerApprovalRequired *bool `url:"code_owner_approval_required,omitempty" json:"code_owner_approval_required,omitempty"` +} + +// BranchPermissionOptions represents a branch permission option. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#protect-repository-branches +type BranchPermissionOptions struct { + ID *int `url:"id,omitempty" json:"id,omitempty"` + UserID *int `url:"user_id,omitempty" json:"user_id,omitempty"` + GroupID *int `url:"group_id,omitempty" json:"group_id,omitempty"` + DeployKeyID *int `url:"deploy_key_id,omitempty" json:"deploy_key_id,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + Destroy *bool `url:"_destroy,omitempty" json:"_destroy,omitempty"` +} + +// ProtectRepositoryBranches protects a single repository branch or several +// project repository branches using a wildcard protected branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#protect-repository-branches +func (s *ProtectedBranchesService) ProtectRepositoryBranches(pid interface{}, opt *ProtectRepositoryBranchesOptions, options ...RequestOptionFunc) (*ProtectedBranch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_branches", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(ProtectedBranch) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// UnprotectRepositoryBranches unprotects the given protected branch or wildcard +// protected branch. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#unprotect-repository-branches +func (s *ProtectedBranchesService) UnprotectRepositoryBranches(pid interface{}, branch string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/protected_branches/%s", PathEscape(project), url.PathEscape(branch)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// UpdateProtectedBranchOptions represents the available +// UpdateProtectedBranch() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#update-a-protected-branch +type UpdateProtectedBranchOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + AllowForcePush *bool `url:"allow_force_push,omitempty" json:"allow_force_push,omitempty"` + CodeOwnerApprovalRequired *bool `url:"code_owner_approval_required,omitempty" json:"code_owner_approval_required,omitempty"` + AllowedToPush *[]*BranchPermissionOptions `url:"allowed_to_push,omitempty" json:"allowed_to_push,omitempty"` + AllowedToMerge *[]*BranchPermissionOptions `url:"allowed_to_merge,omitempty" json:"allowed_to_merge,omitempty"` + AllowedToUnprotect *[]*BranchPermissionOptions `url:"allowed_to_unprotect,omitempty" json:"allowed_to_unprotect,omitempty"` +} + +// UpdateProtectedBranch updates a protected branch. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#update-a-protected-branch +func (s *ProtectedBranchesService) UpdateProtectedBranch(pid interface{}, branch string, opt *UpdateProtectedBranchOptions, options ...RequestOptionFunc) (*ProtectedBranch, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_branches/%s", PathEscape(project), url.PathEscape(branch)) + + req, err := s.client.NewRequest(http.MethodPatch, u, opt, options) + if err != nil { + return nil, nil, err + } + + p := new(ProtectedBranch) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// RequireCodeOwnerApprovalsOptions represents the available +// RequireCodeOwnerApprovals() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#update-a-protected-branch +type RequireCodeOwnerApprovalsOptions struct { + CodeOwnerApprovalRequired *bool `url:"code_owner_approval_required,omitempty" json:"code_owner_approval_required,omitempty"` +} + +// RequireCodeOwnerApprovals updates the code owner approval option. +// +// Deprecated: Use UpdateProtectedBranch() instead. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/protected_branches.html#update-a-protected-branch +func (s *ProtectedBranchesService) RequireCodeOwnerApprovals(pid interface{}, branch string, opt *RequireCodeOwnerApprovalsOptions, options ...RequestOptionFunc) (*Response, error) { + updateOptions := &UpdateProtectedBranchOptions{ + CodeOwnerApprovalRequired: opt.CodeOwnerApprovalRequired, + } + _, req, err := s.UpdateProtectedBranch(pid, branch, updateOptions, options...) + return req, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/protected_environments.go b/vendor/github.com/xanzy/go-gitlab/protected_environments.go new file mode 100644 index 0000000000..70affe175d --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/protected_environments.go @@ -0,0 +1,180 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ProtectedEnvironmentsService handles communication with the protected +// environment methods of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html +type ProtectedEnvironmentsService struct { + client *Client +} + +// ProtectedEnvironment represents a protected environment. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html +type ProtectedEnvironment struct { + Name string `json:"name"` + DeployAccessLevels []*EnvironmentAccessDescription `json:"deploy_access_levels"` + RequiredApprovalCount int `json:"required_approval_count"` +} + +// EnvironmentAccessDescription represents the access decription for a protected +// environment. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html +type EnvironmentAccessDescription struct { + AccessLevel AccessLevelValue `json:"access_level"` + AccessLevelDescription string `json:"access_level_description"` + UserID int `json:"user_id"` + GroupID int `json:"group_id"` +} + +// ListProtectedEnvironmentsOptions represents the available +// ListProtectedEnvironments() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html#list-protected-environments +type ListProtectedEnvironmentsOptions ListOptions + +// ListProtectedEnvironments returns a list of protected environments from a +// project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html#list-protected-environments +func (s *ProtectedEnvironmentsService) ListProtectedEnvironments(pid interface{}, opt *ListProtectedEnvironmentsOptions, options ...RequestOptionFunc) ([]*ProtectedEnvironment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_environments", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pes []*ProtectedEnvironment + resp, err := s.client.Do(req, &pes) + if err != nil { + return nil, resp, err + } + + return pes, resp, err +} + +// GetProtectedEnvironment returns a single protected environment or wildcard +// protected environment. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html#get-a-single-protected-environment +func (s *ProtectedEnvironmentsService) GetProtectedEnvironment(pid interface{}, environment string, options ...RequestOptionFunc) (*ProtectedEnvironment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_environments/%s", PathEscape(project), PathEscape(environment)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pe := new(ProtectedEnvironment) + resp, err := s.client.Do(req, pe) + if err != nil { + return nil, resp, err + } + + return pe, resp, err +} + +// ProtectRepositoryEnvironmentsOptions represents the available +// ProtectRepositoryEnvironments() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html#protect-a-single-environment +type ProtectRepositoryEnvironmentsOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + DeployAccessLevels *[]*EnvironmentAccessOptions `url:"deploy_access_levels,omitempty" json:"deploy_access_levels,omitempty"` + RequiredApprovalCount *int `url:"required_approval_count,omitempty" json:"required_approval_count,omitempty"` +} + +// EnvironmentAccessOptions represents the options for an access decription for +// a protected environment. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html#protect-a-single-environment +type EnvironmentAccessOptions struct { + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` + UserID *int `url:"user_id,omitempty" json:"user_id,omitempty"` + GroupID *int `url:"group_id,omitempty" json:"group_id,omitempty"` +} + +// ProtectRepositoryEnvironments protects a single repository environment or +// several project repository environments using wildcard protected environment. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html#protect-a-single-environment +func (s *ProtectedEnvironmentsService) ProtectRepositoryEnvironments(pid interface{}, opt *ProtectRepositoryEnvironmentsOptions, options ...RequestOptionFunc) (*ProtectedEnvironment, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_environments", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pe := new(ProtectedEnvironment) + resp, err := s.client.Do(req, pe) + if err != nil { + return nil, resp, err + } + + return pe, resp, err +} + +// UnprotectEnvironment unprotects the given protected environment or wildcard +// protected environment. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_environments.html#unprotect-a-single-environment +func (s *ProtectedEnvironmentsService) UnprotectEnvironment(pid interface{}, environment string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/protected_environments/%s", PathEscape(project), PathEscape(environment)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/protected_tags.go b/vendor/github.com/xanzy/go-gitlab/protected_tags.go new file mode 100644 index 0000000000..4f8fb4e78b --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/protected_tags.go @@ -0,0 +1,175 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ProtectedTagsService handles communication with the protected tag methods +// of the GitLab API. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html +type ProtectedTagsService struct { + client *Client +} + +// ProtectedTag represents a protected tag. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html +type ProtectedTag struct { + Name string `json:"name"` + CreateAccessLevels []*TagAccessDescription `json:"create_access_levels"` +} + +// TagAccessDescription reperesents the access decription for a protected tag. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html +type TagAccessDescription struct { + UserID int `json:"user_id"` + GroupID int `json:"group_id"` + AccessLevel AccessLevelValue `json:"access_level"` + AccessLevelDescription string `json:"access_level_description"` +} + +// ListProtectedTagsOptions represents the available ListProtectedTags() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html#list-protected-tags +type ListProtectedTagsOptions ListOptions + +// ListProtectedTags returns a list of protected tags from a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html#list-protected-tags +func (s *ProtectedTagsService) ListProtectedTags(pid interface{}, opt *ListProtectedTagsOptions, options ...RequestOptionFunc) ([]*ProtectedTag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_tags", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var pts []*ProtectedTag + resp, err := s.client.Do(req, &pts) + if err != nil { + return nil, resp, err + } + + return pts, resp, err +} + +// GetProtectedTag returns a single protected tag or wildcard protected tag. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html#get-a-single-protected-tag-or-wildcard-protected-tag +func (s *ProtectedTagsService) GetProtectedTag(pid interface{}, tag string, options ...RequestOptionFunc) (*ProtectedTag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_tags/%s", PathEscape(project), PathEscape(tag)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + pt := new(ProtectedTag) + resp, err := s.client.Do(req, pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// ProtectRepositoryTagsOptions represents the available ProtectRepositoryTags() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html#protect-repository-tags +type ProtectRepositoryTagsOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + CreateAccessLevel *AccessLevelValue `url:"create_access_level,omitempty" json:"create_access_level,omitempty"` + AllowedToCreate *[]*TagsPermissionOptions `url:"allowed_to_create,omitempty" json:"allowed_to_create,omitempty"` +} + +// TagsPermissionOptions represents a protected tag permission option. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html#protect-repository-tags +type TagsPermissionOptions struct { + UserID *int `url:"user_id,omitempty" json:"user_id,omitempty"` + GroupID *int `url:"group_id,omitempty" json:"group_id,omitempty"` + AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"` +} + +// ProtectRepositoryTags protects a single repository tag or several project +// repository tags using a wildcard protected tag. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html#protect-repository-tags +func (s *ProtectedTagsService) ProtectRepositoryTags(pid interface{}, opt *ProtectRepositoryTagsOptions, options ...RequestOptionFunc) (*ProtectedTag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/protected_tags", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + pt := new(ProtectedTag) + resp, err := s.client.Do(req, pt) + if err != nil { + return nil, resp, err + } + + return pt, resp, err +} + +// UnprotectRepositoryTags unprotects the given protected tag or wildcard +// protected tag. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/protected_tags.html#unprotect-repository-tags +func (s *ProtectedTagsService) UnprotectRepositoryTags(pid interface{}, tag string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/protected_tags/%s", PathEscape(project), PathEscape(tag)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/releaselinks.go b/vendor/github.com/xanzy/go-gitlab/releaselinks.go new file mode 100644 index 0000000000..d85e493ac0 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/releaselinks.go @@ -0,0 +1,199 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ReleaseLinksService handles communication with the release link methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html +type ReleaseLinksService struct { + client *Client +} + +// ReleaseLink represents a release link. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html +type ReleaseLink struct { + ID int `json:"id"` + Name string `json:"name"` + URL string `json:"url"` + DirectAssetURL string `json:"direct_asset_url"` + External bool `json:"external"` + LinkType LinkTypeValue `json:"link_type"` +} + +// ListReleaseLinksOptions represents ListReleaseLinks() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#list-links-of-a-release +type ListReleaseLinksOptions ListOptions + +// ListReleaseLinks gets assets as links from a Release. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#list-links-of-a-release +func (s *ReleaseLinksService) ListReleaseLinks(pid interface{}, tagName string, opt *ListReleaseLinksOptions, options ...RequestOptionFunc) ([]*ReleaseLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s/assets/links", PathEscape(project), PathEscape(tagName)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var rls []*ReleaseLink + resp, err := s.client.Do(req, &rls) + if err != nil { + return nil, resp, err + } + + return rls, resp, err +} + +// GetReleaseLink returns a link from release assets. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#get-a-release-link +func (s *ReleaseLinksService) GetReleaseLink(pid interface{}, tagName string, link int, options ...RequestOptionFunc) (*ReleaseLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d", + PathEscape(project), + PathEscape(tagName), + link) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + rl := new(ReleaseLink) + resp, err := s.client.Do(req, rl) + if err != nil { + return nil, resp, err + } + + return rl, resp, err +} + +// CreateReleaseLinkOptions represents CreateReleaseLink() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#create-a-release-link +type CreateReleaseLinkOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + URL *string `url:"url,omitempty" json:"url,omitempty"` + FilePath *string `url:"filepath,omitempty" json:"filepath,omitempty"` + LinkType *LinkTypeValue `url:"link_type,omitempty" json:"link_type,omitempty"` +} + +// CreateReleaseLink creates a link. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#create-a-release-link +func (s *ReleaseLinksService) CreateReleaseLink(pid interface{}, tagName string, opt *CreateReleaseLinkOptions, options ...RequestOptionFunc) (*ReleaseLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s/assets/links", PathEscape(project), PathEscape(tagName)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + rl := new(ReleaseLink) + resp, err := s.client.Do(req, rl) + if err != nil { + return nil, resp, err + } + + return rl, resp, err +} + +// UpdateReleaseLinkOptions represents UpdateReleaseLink() options. +// +// You have to specify at least one of Name of URL. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#update-a-release-link +type UpdateReleaseLinkOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + URL *string `url:"url,omitempty" json:"url,omitempty"` + FilePath *string `url:"filepath,omitempty" json:"filepath,omitempty"` + LinkType *LinkTypeValue `url:"link_type,omitempty" json:"link_type,omitempty"` +} + +// UpdateReleaseLink updates an asset link. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#update-a-release-link +func (s *ReleaseLinksService) UpdateReleaseLink(pid interface{}, tagName string, link int, opt *UpdateReleaseLinkOptions, options ...RequestOptionFunc) (*ReleaseLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d", + PathEscape(project), + PathEscape(tagName), + link) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + rl := new(ReleaseLink) + resp, err := s.client.Do(req, rl) + if err != nil { + return nil, resp, err + } + + return rl, resp, err +} + +// DeleteReleaseLink deletes a link from release. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#delete-a-release-link +func (s *ReleaseLinksService) DeleteReleaseLink(pid interface{}, tagName string, link int, options ...RequestOptionFunc) (*ReleaseLink, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d", + PathEscape(project), + PathEscape(tagName), + link, + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, nil, err + } + + rl := new(ReleaseLink) + resp, err := s.client.Do(req, rl) + if err != nil { + return nil, resp, err + } + + return rl, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/releases.go b/vendor/github.com/xanzy/go-gitlab/releases.go new file mode 100644 index 0000000000..ef3efa25db --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/releases.go @@ -0,0 +1,255 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ReleasesService handles communication with the releases methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/releases/index.html +type ReleasesService struct { + client *Client +} + +// Release represents a project release. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#list-releases +type Release struct { + TagName string `json:"tag_name"` + Name string `json:"name"` + Description string `json:"description"` + DescriptionHTML string `json:"description_html"` + CreatedAt *time.Time `json:"created_at"` + ReleasedAt *time.Time `json:"released_at"` + Author struct { + ID int `json:"id"` + Name string `json:"name"` + Username string `json:"username"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"author"` + Commit Commit `json:"commit"` + UpcomingRelease bool `json:"upcoming_release"` + CommitPath string `json:"commit_path"` + TagPath string `json:"tag_path"` + Assets struct { + Count int `json:"count"` + Sources []struct { + Format string `json:"format"` + URL string `json:"url"` + } `json:"sources"` + Links []*ReleaseLink `json:"links"` + } `json:"assets"` + Links struct { + ClosedIssueURL string `json:"closed_issues_url"` + ClosedMergeRequest string `json:"closed_merge_requests_url"` + EditURL string `json:"edit_url"` + MergedMergeRequest string `json:"merged_merge_requests_url"` + OpenedIssues string `json:"opened_issues_url"` + OpenedMergeRequest string `json:"opened_merge_requests_url"` + Self string `json:"self"` + } `json:"_links"` +} + +// ListReleasesOptions represents ListReleases() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#list-releases +type ListReleasesOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + IncludeHTMLDescription *bool `url:"include_html_description,omitempty" json:"include_html_description,omitempty"` +} + +// ListReleases gets a pagenated of releases accessible by the authenticated user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#list-releases +func (s *ReleasesService) ListReleases(pid interface{}, opt *ListReleasesOptions, options ...RequestOptionFunc) ([]*Release, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var rs []*Release + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// GetRelease returns a single release, identified by a tag name. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#get-a-release-by-a-tag-name +func (s *ReleasesService) GetRelease(pid interface{}, tagName string, options ...RequestOptionFunc) (*Release, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s", PathEscape(project), PathEscape(tagName)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + r := new(Release) + resp, err := s.client.Do(req, r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// CreateReleaseOptions represents CreateRelease() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#create-a-release +type CreateReleaseOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + TagName *string `url:"tag_name,omitempty" json:"tag_name,omitempty"` + TagMessage *string `url:"tag_message,omitempty" json:"tag_message,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + Milestones *[]string `url:"milestones,omitempty" json:"milestones,omitempty"` + Assets *ReleaseAssetsOptions `url:"assets,omitempty" json:"assets,omitempty"` + ReleasedAt *time.Time `url:"released_at,omitempty" json:"released_at,omitempty"` +} + +// ReleaseAssetsOptions represents release assets in CreateRelease() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#create-a-release +type ReleaseAssetsOptions struct { + Links []*ReleaseAssetLinkOptions `url:"links,omitempty" json:"links,omitempty"` +} + +// ReleaseAssetLinkOptions represents release asset link in CreateRelease() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#create-a-release +type ReleaseAssetLinkOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + URL *string `url:"url,omitempty" json:"url,omitempty"` + FilePath *string `url:"filepath,omitempty" json:"filepath,omitempty"` + LinkType *LinkTypeValue `url:"link_type,omitempty" json:"link_type,omitempty"` +} + +// CreateRelease creates a release. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#create-a-release +func (s *ReleasesService) CreateRelease(pid interface{}, opts *CreateReleaseOptions, options ...RequestOptionFunc) (*Release, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opts, options) + if err != nil { + return nil, nil, err + } + + r := new(Release) + resp, err := s.client.Do(req, r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// UpdateReleaseOptions represents UpdateRelease() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#update-a-release +type UpdateReleaseOptions struct { + Name *string `url:"name" json:"name"` + Description *string `url:"description" json:"description"` + Milestones *[]string `url:"milestones,omitempty" json:"milestones,omitempty"` + ReleasedAt *time.Time `url:"released_at,omitempty" json:"released_at,omitempty"` +} + +// UpdateRelease updates a release. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#update-a-release +func (s *ReleasesService) UpdateRelease(pid interface{}, tagName string, opts *UpdateReleaseOptions, options ...RequestOptionFunc) (*Release, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s", PathEscape(project), PathEscape(tagName)) + + req, err := s.client.NewRequest(http.MethodPut, u, opts, options) + if err != nil { + return nil, nil, err + } + + r := new(Release) + resp, err := s.client.Do(req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// DeleteRelease deletes a release. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/index.html#delete-a-release +func (s *ReleasesService) DeleteRelease(pid interface{}, tagName string, options ...RequestOptionFunc) (*Release, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/releases/%s", PathEscape(project), PathEscape(tagName)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, nil, err + } + + r := new(Release) + resp, err := s.client.Do(req, r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/repositories.go b/vendor/github.com/xanzy/go-gitlab/repositories.go new file mode 100644 index 0000000000..2dc5d9e946 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/repositories.go @@ -0,0 +1,419 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "io" + "net/http" + "net/url" +) + +// RepositoriesService handles communication with the repositories related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repositories.html +type RepositoriesService struct { + client *Client +} + +// TreeNode represents a GitLab repository file or directory. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repositories.html +type TreeNode struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + Path string `json:"path"` + Mode string `json:"mode"` +} + +func (t TreeNode) String() string { + return Stringify(t) +} + +// ListTreeOptions represents the available ListTree() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#list-repository-tree +type ListTreeOptions struct { + ListOptions + Path *string `url:"path,omitempty" json:"path,omitempty"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + Recursive *bool `url:"recursive,omitempty" json:"recursive,omitempty"` +} + +// ListTree gets a list of repository files and directories in a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#list-repository-tree +func (s *RepositoriesService) ListTree(pid interface{}, opt *ListTreeOptions, options ...RequestOptionFunc) ([]*TreeNode, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/tree", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var t []*TreeNode + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// Blob gets information about blob in repository like size and content. Note +// that blob content is Base64 encoded. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#get-a-blob-from-repository +func (s *RepositoriesService) Blob(pid interface{}, sha string, options ...RequestOptionFunc) ([]byte, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/blobs/%s", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var b bytes.Buffer + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b.Bytes(), resp, err +} + +// RawBlobContent gets the raw file contents for a blob by blob SHA. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#raw-blob-content +func (s *RepositoriesService) RawBlobContent(pid interface{}, sha string, options ...RequestOptionFunc) ([]byte, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/blobs/%s/raw", PathEscape(project), url.PathEscape(sha)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var b bytes.Buffer + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b.Bytes(), resp, err +} + +// ArchiveOptions represents the available Archive() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#get-file-archive +type ArchiveOptions struct { + Format *string `url:"-" json:"-"` + SHA *string `url:"sha,omitempty" json:"sha,omitempty"` +} + +// Archive gets an archive of the repository. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#get-file-archive +func (s *RepositoriesService) Archive(pid interface{}, opt *ArchiveOptions, options ...RequestOptionFunc) ([]byte, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/archive", PathEscape(project)) + + // Set an optional format for the archive. + if opt != nil && opt.Format != nil { + u = fmt.Sprintf("%s.%s", u, *opt.Format) + } + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var b bytes.Buffer + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b.Bytes(), resp, err +} + +// StreamArchive streams an archive of the repository to the provided +// io.Writer. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#get-file-archive +func (s *RepositoriesService) StreamArchive(pid interface{}, w io.Writer, opt *ArchiveOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/repository/archive", PathEscape(project)) + + // Set an optional format for the archive. + if opt != nil && opt.Format != nil { + u = fmt.Sprintf("%s.%s", u, *opt.Format) + } + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, w) +} + +// Compare represents the result of a comparison of branches, tags or commits. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#compare-branches-tags-or-commits +type Compare struct { + Commit *Commit `json:"commit"` + Commits []*Commit `json:"commits"` + Diffs []*Diff `json:"diffs"` + CompareTimeout bool `json:"compare_timeout"` + CompareSameRef bool `json:"compare_same_ref"` +} + +func (c Compare) String() string { + return Stringify(c) +} + +// CompareOptions represents the available Compare() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#compare-branches-tags-or-commits +type CompareOptions struct { + From *string `url:"from,omitempty" json:"from,omitempty"` + To *string `url:"to,omitempty" json:"to,omitempty"` + Straight *bool `url:"straight,omitempty" json:"straight,omitempty"` +} + +// Compare compares branches, tags or commits. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#compare-branches-tags-or-commits +func (s *RepositoriesService) Compare(pid interface{}, opt *CompareOptions, options ...RequestOptionFunc) (*Compare, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/compare", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + c := new(Compare) + resp, err := s.client.Do(req, c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// Contributor represents a GitLap contributor. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repositories.html#contributors +type Contributor struct { + Name string `json:"name"` + Email string `json:"email"` + Commits int `json:"commits"` + Additions int `json:"additions"` + Deletions int `json:"deletions"` +} + +func (c Contributor) String() string { + return Stringify(c) +} + +// ListContributorsOptions represents the available ListContributors() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repositories.html#contributors +type ListContributorsOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// Contributors gets the repository contributors list. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repositories.html#contributors +func (s *RepositoriesService) Contributors(pid interface{}, opt *ListContributorsOptions, options ...RequestOptionFunc) ([]*Contributor, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/contributors", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var c []*Contributor + resp, err := s.client.Do(req, &c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// MergeBaseOptions represents the available MergeBase() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#merge-base +type MergeBaseOptions struct { + Ref *[]string `url:"refs[],omitempty" json:"refs,omitempty"` +} + +// MergeBase gets the common ancestor for 2 refs (commit SHAs, branch +// names or tags). +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#merge-base +func (s *RepositoriesService) MergeBase(pid interface{}, opt *MergeBaseOptions, options ...RequestOptionFunc) (*Commit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/merge_base", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + c := new(Commit) + resp, err := s.client.Do(req, c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} + +// AddChangelogOptions represents the available AddChangelog() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#add-changelog-data-to-a-changelog-file +type AddChangelogOptions struct { + Version *string `url:"version,omitempty" json:"version,omitempty"` + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + ConfigFile *string `url:"config_file,omitempty" json:"config_file,omitempty"` + Date *ISOTime `url:"date,omitempty" json:"date,omitempty"` + File *string `url:"file,omitempty" json:"file,omitempty"` + From *string `url:"from,omitempty" json:"from,omitempty"` + Message *string `url:"message,omitempty" json:"message,omitempty"` + To *string `url:"to,omitempty" json:"to,omitempty"` + Trailer *string `url:"trailer,omitempty" json:"trailer,omitempty"` +} + +// AddChangelog generates changelog data based on commits in a repository. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#add-changelog-data-to-a-changelog-file +func (s *RepositoriesService) AddChangelog(pid interface{}, opt *AddChangelogOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/repository/changelog", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ChangelogData represents the generated changelog data. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#generate-changelog-data +type ChangelogData struct { + Notes string `json:"notes"` +} + +func (c ChangelogData) String() string { + return Stringify(c) +} + +// GenerateChangelogDataOptions represents the available GenerateChangelogData() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#generate-changelog-data +type GenerateChangelogDataOptions struct { + Version *string `url:"version,omitempty" json:"version,omitempty"` + ConfigFile *string `url:"config_file,omitempty" json:"config_file,omitempty"` + Date *ISOTime `url:"date,omitempty" json:"date,omitempty"` + From *string `url:"from,omitempty" json:"from,omitempty"` + To *string `url:"to,omitempty" json:"to,omitempty"` + Trailer *string `url:"trailer,omitempty" json:"trailer,omitempty"` +} + +// GenerateChangelogData generates changelog data based on commits in a +// repository, without committing them to a changelog file. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/repositories.html#generate-changelog-data +func (s *RepositoriesService) GenerateChangelogData(pid interface{}, opt GenerateChangelogDataOptions, options ...RequestOptionFunc) (*ChangelogData, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/changelog", project) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + cd := new(ChangelogData) + resp, err := s.client.Do(req, cd) + if err != nil { + return nil, resp, err + } + + return cd, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/repository_files.go b/vendor/github.com/xanzy/go-gitlab/repository_files.go new file mode 100644 index 0000000000..390b22e755 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/repository_files.go @@ -0,0 +1,382 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "net/http" + "strconv" + "time" +) + +// RepositoryFilesService handles communication with the repository files +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repository_files.html +type RepositoryFilesService struct { + client *Client +} + +// File represents a GitLab repository file. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repository_files.html +type File struct { + FileName string `json:"file_name"` + FilePath string `json:"file_path"` + Size int `json:"size"` + Encoding string `json:"encoding"` + Content string `json:"content"` + ExecuteFilemode bool `json:"execute_filemode"` + Ref string `json:"ref"` + BlobID string `json:"blob_id"` + CommitID string `json:"commit_id"` + SHA256 string `json:"content_sha256"` + LastCommitID string `json:"last_commit_id"` +} + +func (r File) String() string { + return Stringify(r) +} + +// GetFileOptions represents the available GetFile() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-file-from-repository +type GetFileOptions struct { + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` +} + +// GetFile allows you to receive information about a file in repository like +// name, size, content. Note that file content is Base64 encoded. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-file-from-repository +func (s *RepositoryFilesService) GetFile(pid interface{}, fileName string, opt *GetFileOptions, options ...RequestOptionFunc) (*File, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/files/%s", + PathEscape(project), + PathEscape(fileName), + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + f := new(File) + resp, err := s.client.Do(req, f) + if err != nil { + return nil, resp, err + } + + return f, resp, err +} + +// GetFileMetaDataOptions represents the available GetFileMetaData() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-file-from-repository +type GetFileMetaDataOptions struct { + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` +} + +// GetFileMetaData allows you to receive meta information about a file in +// repository like name, size. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-file-from-repository +func (s *RepositoryFilesService) GetFileMetaData(pid interface{}, fileName string, opt *GetFileMetaDataOptions, options ...RequestOptionFunc) (*File, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/files/%s", + PathEscape(project), + PathEscape(fileName), + ) + + req, err := s.client.NewRequest(http.MethodHead, u, opt, options) + if err != nil { + return nil, nil, err + } + + resp, err := s.client.Do(req, nil) + if err != nil { + return nil, resp, err + } + + f := &File{ + BlobID: resp.Header.Get("X-Gitlab-Blob-Id"), + CommitID: resp.Header.Get("X-Gitlab-Commit-Id"), + Encoding: resp.Header.Get("X-Gitlab-Encoding"), + FileName: resp.Header.Get("X-Gitlab-File-Name"), + FilePath: resp.Header.Get("X-Gitlab-File-Path"), + ExecuteFilemode: resp.Header.Get("X-Gitlab-Execute-Filemode") == "true", + Ref: resp.Header.Get("X-Gitlab-Ref"), + SHA256: resp.Header.Get("X-Gitlab-Content-Sha256"), + LastCommitID: resp.Header.Get("X-Gitlab-Last-Commit-Id"), + } + + if sizeString := resp.Header.Get("X-Gitlab-Size"); sizeString != "" { + f.Size, err = strconv.Atoi(sizeString) + if err != nil { + return nil, resp, err + } + } + + return f, resp, err +} + +// FileBlameRange represents one item of blame information. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repository_files.html +type FileBlameRange struct { + Commit struct { + ID string `json:"id"` + ParentIDs []string `json:"parent_ids"` + Message string `json:"message"` + AuthoredDate *time.Time `json:"authored_date"` + AuthorName string `json:"author_name"` + AuthorEmail string `json:"author_email"` + CommittedDate *time.Time `json:"committed_date"` + CommitterName string `json:"committer_name"` + CommitterEmail string `json:"committer_email"` + } `json:"commit"` + Lines []string `json:"lines"` +} + +func (b FileBlameRange) String() string { + return Stringify(b) +} + +// GetFileBlameOptions represents the available GetFileBlame() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-file-blame-from-repository +type GetFileBlameOptions struct { + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` +} + +// GetFileBlame allows you to receive blame information. Each blame range +// contains lines and corresponding commit info. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-file-blame-from-repository +func (s *RepositoryFilesService) GetFileBlame(pid interface{}, file string, opt *GetFileBlameOptions, options ...RequestOptionFunc) ([]*FileBlameRange, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/files/%s/blame", + PathEscape(project), + PathEscape(file), + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var br []*FileBlameRange + resp, err := s.client.Do(req, &br) + if err != nil { + return nil, resp, err + } + + return br, resp, err +} + +// GetRawFileOptions represents the available GetRawFile() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository +type GetRawFileOptions struct { + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` +} + +// GetRawFile allows you to receive the raw file in repository. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository +func (s *RepositoryFilesService) GetRawFile(pid interface{}, fileName string, opt *GetRawFileOptions, options ...RequestOptionFunc) ([]byte, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/files/%s/raw", + PathEscape(project), + PathEscape(fileName), + ) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var f bytes.Buffer + resp, err := s.client.Do(req, &f) + if err != nil { + return nil, resp, err + } + + return f.Bytes(), resp, err +} + +// FileInfo represents file details of a GitLab repository file. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repository_files.html +type FileInfo struct { + FilePath string `json:"file_path"` + Branch string `json:"branch"` +} + +func (r FileInfo) String() string { + return Stringify(r) +} + +// CreateFileOptions represents the available CreateFile() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#create-new-file-in-repository +type CreateFileOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + StartBranch *string `url:"start_branch,omitempty" json:"start_branch,omitempty"` + Encoding *string `url:"encoding,omitempty" json:"encoding,omitempty"` + AuthorEmail *string `url:"author_email,omitempty" json:"author_email,omitempty"` + AuthorName *string `url:"author_name,omitempty" json:"author_name,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"` + ExecuteFilemode *bool `url:"execute_filemode,omitempty" json:"execute_filemode,omitempty"` +} + +// CreateFile creates a new file in a repository. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#create-new-file-in-repository +func (s *RepositoryFilesService) CreateFile(pid interface{}, fileName string, opt *CreateFileOptions, options ...RequestOptionFunc) (*FileInfo, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/files/%s", + PathEscape(project), + PathEscape(fileName), + ) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + f := new(FileInfo) + resp, err := s.client.Do(req, f) + if err != nil { + return nil, resp, err + } + + return f, resp, err +} + +// UpdateFileOptions represents the available UpdateFile() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#update-existing-file-in-repository +type UpdateFileOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + StartBranch *string `url:"start_branch,omitempty" json:"start_branch,omitempty"` + Encoding *string `url:"encoding,omitempty" json:"encoding,omitempty"` + AuthorEmail *string `url:"author_email,omitempty" json:"author_email,omitempty"` + AuthorName *string `url:"author_name,omitempty" json:"author_name,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"` + LastCommitID *string `url:"last_commit_id,omitempty" json:"last_commit_id,omitempty"` + ExecuteFilemode *bool `url:"execute_filemode,omitempty" json:"execute_filemode,omitempty"` +} + +// UpdateFile updates an existing file in a repository +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#update-existing-file-in-repository +func (s *RepositoryFilesService) UpdateFile(pid interface{}, fileName string, opt *UpdateFileOptions, options ...RequestOptionFunc) (*FileInfo, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/files/%s", + PathEscape(project), + PathEscape(fileName), + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + f := new(FileInfo) + resp, err := s.client.Do(req, f) + if err != nil { + return nil, resp, err + } + + return f, resp, err +} + +// DeleteFileOptions represents the available DeleteFile() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#delete-existing-file-in-repository +type DeleteFileOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + StartBranch *string `url:"start_branch,omitempty" json:"start_branch,omitempty"` + AuthorEmail *string `url:"author_email,omitempty" json:"author_email,omitempty"` + AuthorName *string `url:"author_name,omitempty" json:"author_name,omitempty"` + CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"` + LastCommitID *string `url:"last_commit_id,omitempty" json:"last_commit_id,omitempty"` +} + +// DeleteFile deletes an existing file in a repository +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_files.html#delete-existing-file-in-repository +func (s *RepositoryFilesService) DeleteFile(pid interface{}, fileName string, opt *DeleteFileOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/files/%s", + PathEscape(project), + PathEscape(fileName), + ) + + req, err := s.client.NewRequest(http.MethodDelete, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/repository_submodules.go b/vendor/github.com/xanzy/go-gitlab/repository_submodules.go new file mode 100644 index 0000000000..70ac05e3ea --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/repository_submodules.go @@ -0,0 +1,93 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// RepositorySubmodulesService handles communication with the repository +// submodules related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repository_submodules.html +type RepositorySubmodulesService struct { + client *Client +} + +// SubmoduleCommit represents a GitLab submodule commit. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/repository_submodules.html +type SubmoduleCommit struct { + ID string `json:"id"` + ShortID string `json:"short_id"` + Title string `json:"title"` + AuthorName string `json:"author_name"` + AuthorEmail string `json:"author_email"` + CommitterName string `json:"committer_name"` + CommitterEmail string `json:"committer_email"` + CreatedAt *time.Time `json:"created_at"` + Message string `json:"message"` + ParentIDs []string `json:"parent_ids"` + CommittedDate *time.Time `json:"committed_date"` + AuthoredDate *time.Time `json:"authored_date"` + Status *BuildStateValue `json:"status"` +} + +func (r SubmoduleCommit) String() string { + return Stringify(r) +} + +// UpdateSubmoduleOptions represents the available UpdateSubmodule() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_submodules.html#update-existing-submodule-reference-in-repository +type UpdateSubmoduleOptions struct { + Branch *string `url:"branch,omitempty" json:"branch,omitempty"` + CommitSHA *string `url:"commit_sha,omitempty" json:"commit_sha,omitempty"` + CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"` +} + +// UpdateSubmodule updates an existing submodule reference. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/repository_submodules.html#update-existing-submodule-reference-in-repository +func (s *RepositorySubmodulesService) UpdateSubmodule(pid interface{}, submodule string, opt *UpdateSubmoduleOptions, options ...RequestOptionFunc) (*SubmoduleCommit, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf( + "projects/%s/repository/submodules/%s", + PathEscape(project), + PathEscape(submodule), + ) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + sc := new(SubmoduleCommit) + resp, err := s.client.Do(req, sc) + if err != nil { + return nil, resp, err + } + + return sc, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/request_options.go b/vendor/github.com/xanzy/go-gitlab/request_options.go new file mode 100644 index 0000000000..bc01b91803 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/request_options.go @@ -0,0 +1,80 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "context" + + retryablehttp "github.com/hashicorp/go-retryablehttp" +) + +// RequestOptionFunc can be passed to all API requests to customize the API request. +type RequestOptionFunc func(*retryablehttp.Request) error + +// WithContext runs the request with the provided context +func WithContext(ctx context.Context) RequestOptionFunc { + return func(req *retryablehttp.Request) error { + *req = *req.WithContext(ctx) + return nil + } +} + +// WithHeader takes a header name and value and appends it to the request headers. +func WithHeader(name, value string) RequestOptionFunc { + return func(req *retryablehttp.Request) error { + req.Header.Set(name, value) + return nil + } +} + +// WithHeaders takes a map of header name/value pairs and appends them to the +// request headers. +func WithHeaders(headers map[string]string) RequestOptionFunc { + return func(req *retryablehttp.Request) error { + for k, v := range headers { + req.Header.Set(k, v) + } + return nil + } +} + +// WithSudo takes either a username or user ID and sets the SUDO request header. +func WithSudo(uid interface{}) RequestOptionFunc { + return func(req *retryablehttp.Request) error { + user, err := parseID(uid) + if err != nil { + return err + } + req.Header.Set("SUDO", user) + return nil + } +} + +// WithToken takes a token which is then used when making this one request. +func WithToken(authType AuthType, token string) RequestOptionFunc { + return func(req *retryablehttp.Request) error { + switch authType { + case JobToken: + req.Header.Set("JOB-TOKEN", token) + case OAuthToken: + req.Header.Set("Authorization", "Bearer "+token) + case PrivateToken: + req.Header.Set("PRIVATE-TOKEN", token) + } + return nil + } +} diff --git a/vendor/github.com/xanzy/go-gitlab/resource_label_events.go b/vendor/github.com/xanzy/go-gitlab/resource_label_events.go new file mode 100644 index 0000000000..37da156a76 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/resource_label_events.go @@ -0,0 +1,220 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ResourceLabelEventsService handles communication with the event related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/resource_label_events.html +type ResourceLabelEventsService struct { + client *Client +} + +// LabelEvent represents a resource label event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#get-single-issue-label-event +type LabelEvent struct { + ID int `json:"id"` + Action string `json:"action"` + CreatedAt *time.Time `json:"created_at"` + ResourceType string `json:"resource_type"` + ResourceID int `json:"resource_id"` + User struct { + ID int `json:"id"` + Name string `json:"name"` + Username string `json:"username"` + State string `json:"state"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` + } `json:"user"` + Label struct { + ID int `json:"id"` + Name string `json:"name"` + Color string `json:"color"` + TextColor string `json:"text_color"` + Description string `json:"description"` + } `json:"label"` +} + +// ListLabelEventsOptions represents the options for all resource label events +// list methods. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#list-project-issue-label-events +type ListLabelEventsOptions struct { + ListOptions +} + +// ListIssueLabelEvents retrieves resource label events for the +// specified project and issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#list-project-issue-label-events +func (s *ResourceLabelEventsService) ListIssueLabelEvents(pid interface{}, issue int, opt *ListLabelEventsOptions, options ...RequestOptionFunc) ([]*LabelEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/resource_label_events", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ls []*LabelEvent + resp, err := s.client.Do(req, &ls) + if err != nil { + return nil, resp, err + } + + return ls, resp, err +} + +// GetIssueLabelEvent gets a single issue-label-event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#get-single-issue-label-event +func (s *ResourceLabelEventsService) GetIssueLabelEvent(pid interface{}, issue int, event int, options ...RequestOptionFunc) (*LabelEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/resource_label_events/%d", PathEscape(project), issue, event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + l := new(LabelEvent) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// ListGroupEpicLabelEvents retrieves resource label events for the specified +// group and epic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#list-group-epic-label-events +func (s *ResourceLabelEventsService) ListGroupEpicLabelEvents(gid interface{}, epic int, opt *ListLabelEventsOptions, options ...RequestOptionFunc) ([]*LabelEvent, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/resource_label_events", PathEscape(group), epic) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ls []*LabelEvent + resp, err := s.client.Do(req, &ls) + if err != nil { + return nil, resp, err + } + + return ls, resp, err +} + +// GetGroupEpicLabelEvent gets a single group epic label event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#get-single-epic-label-event +func (s *ResourceLabelEventsService) GetGroupEpicLabelEvent(gid interface{}, epic int, event int, options ...RequestOptionFunc) (*LabelEvent, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/epics/%d/resource_label_events/%d", PathEscape(group), epic, event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + l := new(LabelEvent) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} + +// ListMergeRequestsLabelEvents retrieves resource label events for the specified +// project and merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#list-project-merge-request-label-events +func (s *ResourceLabelEventsService) ListMergeRequestsLabelEvents(pid interface{}, request int, opt *ListLabelEventsOptions, options ...RequestOptionFunc) ([]*LabelEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/resource_label_events", PathEscape(project), request) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ls []*LabelEvent + resp, err := s.client.Do(req, &ls) + if err != nil { + return nil, resp, err + } + + return ls, resp, err +} + +// GetMergeRequestLabelEvent gets a single merge request label event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_label_events.html#get-single-merge-request-label-event +func (s *ResourceLabelEventsService) GetMergeRequestLabelEvent(pid interface{}, request int, event int, options ...RequestOptionFunc) (*LabelEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/resource_label_events/%d", PathEscape(project), request, event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + l := new(LabelEvent) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/resource_milestone_events.go b/vendor/github.com/xanzy/go-gitlab/resource_milestone_events.go new file mode 100644 index 0000000000..9c08830410 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/resource_milestone_events.go @@ -0,0 +1,155 @@ +// +// Copyright 2022, Mai Lapyst +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ResourceMilestoneEventsService handles communication with the event related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/resource_milestone_events.html +type ResourceMilestoneEventsService struct { + client *Client +} + +// MilestoneEvent represents a resource milestone event. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/resource_milestone_events.html +type MilestoneEvent struct { + ID int `json:"id"` + User *BasicUser `json:"user"` + CreatedAt *time.Time `json:"created_at"` + ResourceType string `json:"resource_type"` + ResourceID int `json:"resource_id"` + Milestone *Milestone `json:"milestone"` + Action string `json:"action"` +} + +// ListMilestoneEventsOptions represents the options for all resource state events +// list methods. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_milestone_events.html#list-project-issue-milestone-events +type ListMilestoneEventsOptions struct { + ListOptions +} + +// ListIssueMilestoneEvents retrieves resource milestone events for the specified +// project and issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_milestone_events.html#list-project-issue-milestone-events +func (s *ResourceMilestoneEventsService) ListIssueMilestoneEvents(pid interface{}, issue int, opt *ListMilestoneEventsOptions, options ...RequestOptionFunc) ([]*MilestoneEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/resource_milestone_events", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var mes []*MilestoneEvent + resp, err := s.client.Do(req, &mes) + if err != nil { + return nil, resp, err + } + + return mes, resp, err +} + +// GetIssueMilestoneEvent gets a single issue milestone event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_milestone_events.html#get-single-issue-milestone-event +func (s *ResourceMilestoneEventsService) GetIssueMilestoneEvent(pid interface{}, issue int, event int, options ...RequestOptionFunc) (*MilestoneEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/resource_milestone_events/%d", PathEscape(project), issue, event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + me := new(MilestoneEvent) + resp, err := s.client.Do(req, me) + if err != nil { + return nil, resp, err + } + + return me, resp, err +} + +// ListMergeMilestoneEvents retrieves resource milestone events for the specified +// project and merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_milestone_events.html#list-project-merge-request-milestone-events +func (s *ResourceMilestoneEventsService) ListMergeMilestoneEvents(pid interface{}, request int, opt *ListMilestoneEventsOptions, options ...RequestOptionFunc) ([]*MilestoneEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/resource_milestone_events", PathEscape(project), request) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var mes []*MilestoneEvent + resp, err := s.client.Do(req, &mes) + if err != nil { + return nil, resp, err + } + + return mes, resp, err +} + +// GetMergeRequestMilestoneEvent gets a single merge request milestone event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_milestone_events.html#get-single-merge-request-milestone-event +func (s *ResourceMilestoneEventsService) GetMergeRequestMilestoneEvent(pid interface{}, request int, event int, options ...RequestOptionFunc) (*MilestoneEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/resource_milestone_events/%d", PathEscape(project), request, event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + me := new(MilestoneEvent) + resp, err := s.client.Do(req, me) + if err != nil { + return nil, resp, err + } + + return me, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/resource_state_events.go b/vendor/github.com/xanzy/go-gitlab/resource_state_events.go new file mode 100644 index 0000000000..e73ef773e5 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/resource_state_events.go @@ -0,0 +1,154 @@ +// +// Copyright 2021, Matthias Simon +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ResourceStateEventsService handles communication with the event related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/resource_state_events.html +type ResourceStateEventsService struct { + client *Client +} + +// StateEvent represents a resource state event. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/resource_state_events.html +type StateEvent struct { + ID int `json:"id"` + User *BasicUser `json:"user"` + CreatedAt *time.Time `json:"created_at"` + ResourceType string `json:"resource_type"` + ResourceID int `json:"resource_id"` + State EventTypeValue `json:"state"` +} + +// ListStateEventsOptions represents the options for all resource state events +// list methods. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_state_events.html#list-project-issue-state-events +type ListStateEventsOptions struct { + ListOptions +} + +// ListIssueStateEvents retrieves resource state events for the specified +// project and issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_state_events.html#list-project-issue-state-events +func (s *ResourceStateEventsService) ListIssueStateEvents(pid interface{}, issue int, opt *ListStateEventsOptions, options ...RequestOptionFunc) ([]*StateEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/resource_state_events", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ses []*StateEvent + resp, err := s.client.Do(req, &ses) + if err != nil { + return nil, resp, err + } + + return ses, resp, err +} + +// GetIssueStateEvent gets a single issue-state-event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_state_events.html#get-single-issue-state-event +func (s *ResourceStateEventsService) GetIssueStateEvent(pid interface{}, issue int, event int, options ...RequestOptionFunc) (*StateEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/resource_state_events/%d", PathEscape(project), issue, event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + se := new(StateEvent) + resp, err := s.client.Do(req, se) + if err != nil { + return nil, resp, err + } + + return se, resp, err +} + +// ListMergeStateEvents retrieves resource state events for the specified +// project and merge request. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_state_events.html#list-project-merge-request-state-events +func (s *ResourceStateEventsService) ListMergeStateEvents(pid interface{}, request int, opt *ListStateEventsOptions, options ...RequestOptionFunc) ([]*StateEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/resource_state_events", PathEscape(project), request) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ses []*StateEvent + resp, err := s.client.Do(req, &ses) + if err != nil { + return nil, resp, err + } + + return ses, resp, err +} + +// GetMergeRequestStateEvent gets a single merge request state event. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_state_events.html#get-single-merge-request-state-event +func (s *ResourceStateEventsService) GetMergeRequestStateEvent(pid interface{}, request int, event int, options ...RequestOptionFunc) (*StateEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/merge_requests/%d/resource_state_events/%d", PathEscape(project), request, event) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + se := new(StateEvent) + resp, err := s.client.Do(req, se) + if err != nil { + return nil, resp, err + } + + return se, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/resource_weight_events.go b/vendor/github.com/xanzy/go-gitlab/resource_weight_events.go new file mode 100644 index 0000000000..e1a4bf56ad --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/resource_weight_events.go @@ -0,0 +1,80 @@ +// +// Copyright 2021, Matthias Simon +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// ResourceWeightEventsService handles communication with the event related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/resource_weight_events.html +type ResourceWeightEventsService struct { + client *Client +} + +// WeightEvent represents a resource weight event. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/resource_weight_events.html +type WeightEvent struct { + ID int `json:"id"` + User *BasicUser `json:"user"` + CreatedAt *time.Time `json:"created_at"` + ResourceType string `json:"resource_type"` + ResourceID int `json:"resource_id"` + State EventTypeValue `json:"state"` + IssueID int `json:"issue_id"` + Weight int `json:"weight"` +} + +// ListWeightEventsOptions represents the options for all resource weight events +// list methods. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_weight_events.html#list-project-issue-weight-events +type ListWeightEventsOptions struct { + ListOptions +} + +// ListIssueWeightEvents retrieves resource weight events for the specified +// project and issue. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/resource_weight_events.html#list-project-issue-weight-events +func (s *ResourceWeightEventsService) ListIssueWeightEvents(pid interface{}, issue int, opt *ListWeightEventsOptions, options ...RequestOptionFunc) ([]*WeightEvent, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/issues/%d/resource_weight_events", PathEscape(project), issue) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var wes []*WeightEvent + resp, err := s.client.Do(req, &wes) + if err != nil { + return nil, resp, err + } + + return wes, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/runners.go b/vendor/github.com/xanzy/go-gitlab/runners.go new file mode 100644 index 0000000000..bb083d4d27 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/runners.go @@ -0,0 +1,597 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// RunnersService handles communication with the runner related methods of the +// GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/runners.html +type RunnersService struct { + client *Client +} + +// Runner represents a GitLab CI Runner. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/runners.html +type Runner struct { + ID int `json:"id"` + Description string `json:"description"` + Active bool `json:"active"` + Paused bool `json:"paused"` + IsShared bool `json:"is_shared"` + IPAddress string `json:"ip_address"` + RunnerType string `json:"runner_type"` + Name string `json:"name"` + Online bool `json:"online"` + Status string `json:"status"` + Token string `json:"token"` + TokenExpiresAt *time.Time `json:"token_expires_at"` +} + +// RunnerDetails represents the GitLab CI runner details. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/runners.html +type RunnerDetails struct { + Paused bool `json:"paused"` + Architecture string `json:"architecture"` + Description string `json:"description"` + ID int `json:"id"` + IPAddress string `json:"ip_address"` + IsShared bool `json:"is_shared"` + RunnerType string `json:"runner_type"` + ContactedAt *time.Time `json:"contacted_at"` + Name string `json:"name"` + Online bool `json:"online"` + Status string `json:"status"` + Platform string `json:"platform"` + Projects []struct { + ID int `json:"id"` + Name string `json:"name"` + NameWithNamespace string `json:"name_with_namespace"` + Path string `json:"path"` + PathWithNamespace string `json:"path_with_namespace"` + } `json:"projects"` + Token string `json:"token"` + Revision string `json:"revision"` + TagList []string `json:"tag_list"` + RunUntagged bool `json:"run_untagged"` + Version string `json:"version"` + Locked bool `json:"locked"` + AccessLevel string `json:"access_level"` + MaximumTimeout int `json:"maximum_timeout"` + Groups []struct { + ID int `json:"id"` + Name string `json:"name"` + WebURL string `json:"web_url"` + } `json:"groups"` + + // Deprecated: Use Paused instead. (Deprecated in GitLab 14.8) + Active bool `json:"active"` +} + +// ListRunnersOptions represents the available ListRunners() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-owned-runners +type ListRunnersOptions struct { + ListOptions + Type *string `url:"type,omitempty" json:"type,omitempty"` + Status *string `url:"status,omitempty" json:"status,omitempty"` + Paused *bool `url:"paused,omitempty" json:"paused,omitempty"` + TagList *[]string `url:"tag_list,comma,omitempty" json:"tag_list,omitempty"` + + // Deprecated: Use Type or Status instead. + Scope *string `url:"scope,omitempty" json:"scope,omitempty"` +} + +// ListRunners gets a list of runners accessible by the authenticated user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-owned-runners +func (s *RunnersService) ListRunners(opt *ListRunnersOptions, options ...RequestOptionFunc) ([]*Runner, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "runners", opt, options) + if err != nil { + return nil, nil, err + } + + var rs []*Runner + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// ListAllRunners gets a list of all runners in the GitLab instance. Access is +// restricted to users with admin privileges. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-all-runners +func (s *RunnersService) ListAllRunners(opt *ListRunnersOptions, options ...RequestOptionFunc) ([]*Runner, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "runners/all", opt, options) + if err != nil { + return nil, nil, err + } + + var rs []*Runner + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// GetRunnerDetails returns details for given runner. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#get-runners-details +func (s *RunnersService) GetRunnerDetails(rid interface{}, options ...RequestOptionFunc) (*RunnerDetails, *Response, error) { + runner, err := parseID(rid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("runners/%s", runner) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + rs := new(RunnerDetails) + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// UpdateRunnerDetailsOptions represents the available UpdateRunnerDetails() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#update-runners-details +type UpdateRunnerDetailsOptions struct { + Description *string `url:"description,omitempty" json:"description,omitempty"` + Paused *bool `url:"paused,omitempty" json:"paused,omitempty"` + TagList *[]string `url:"tag_list[],omitempty" json:"tag_list,omitempty"` + RunUntagged *bool `url:"run_untagged,omitempty" json:"run_untagged,omitempty"` + Locked *bool `url:"locked,omitempty" json:"locked,omitempty"` + AccessLevel *string `url:"access_level,omitempty" json:"access_level,omitempty"` + MaximumTimeout *int `url:"maximum_timeout,omitempty" json:"maximum_timeout,omitempty"` + + // Deprecated: Use Paused instead. (Deprecated in GitLab 14.8) + Active *bool `url:"active,omitempty" json:"active,omitempty"` +} + +// UpdateRunnerDetails updates details for a given runner. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#update-runners-details +func (s *RunnersService) UpdateRunnerDetails(rid interface{}, opt *UpdateRunnerDetailsOptions, options ...RequestOptionFunc) (*RunnerDetails, *Response, error) { + runner, err := parseID(rid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("runners/%s", runner) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + rs := new(RunnerDetails) + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// RemoveRunner removes a runner. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#delete-a-runner +func (s *RunnersService) RemoveRunner(rid interface{}, options ...RequestOptionFunc) (*Response, error) { + runner, err := parseID(rid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("runners/%s", runner) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListRunnerJobsOptions represents the available ListRunnerJobs() +// options. Status can be one of: running, success, failed, canceled. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-runners-jobs +type ListRunnerJobsOptions struct { + ListOptions + Status *string `url:"status,omitempty" json:"status,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListRunnerJobs gets a list of jobs that are being processed or were processed by specified Runner. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-runners-jobs +func (s *RunnersService) ListRunnerJobs(rid interface{}, opt *ListRunnerJobsOptions, options ...RequestOptionFunc) ([]*Job, *Response, error) { + runner, err := parseID(rid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("runners/%s/jobs", runner) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var rs []*Job + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// ListProjectRunnersOptions represents the available ListProjectRunners() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-projects-runners +type ListProjectRunnersOptions ListRunnersOptions + +// ListProjectRunners gets a list of runners accessible by the authenticated user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-projects-runners +func (s *RunnersService) ListProjectRunners(pid interface{}, opt *ListProjectRunnersOptions, options ...RequestOptionFunc) ([]*Runner, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/runners", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var rs []*Runner + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// EnableProjectRunnerOptions represents the available EnableProjectRunner() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#enable-a-runner-in-project +type EnableProjectRunnerOptions struct { + RunnerID int `json:"runner_id"` +} + +// EnableProjectRunner enables an available specific runner in the project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#enable-a-runner-in-project +func (s *RunnersService) EnableProjectRunner(pid interface{}, opt *EnableProjectRunnerOptions, options ...RequestOptionFunc) (*Runner, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/runners", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + r := new(Runner) + resp, err := s.client.Do(req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// DisableProjectRunner disables a specific runner from project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#disable-a-runner-from-project +func (s *RunnersService) DisableProjectRunner(pid interface{}, runner int, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/runners/%d", PathEscape(project), runner) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListGroupsRunnersOptions represents the available ListGroupsRunners() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-groups-runners +type ListGroupsRunnersOptions struct { + ListOptions + Type *string `url:"type,omitempty" json:"type,omitempty"` + Status *string `url:"status,omitempty" json:"status,omitempty"` + TagList *[]string `url:"tag_list,comma,omitempty" json:"tag_list,omitempty"` +} + +// ListGroupsRunners lists all runners (specific and shared) available in the +// group as well it’s ancestor groups. Shared runners are listed if at least one +// shared runner is defined. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#list-groups-runners +func (s *RunnersService) ListGroupsRunners(gid interface{}, opt *ListGroupsRunnersOptions, options ...RequestOptionFunc) ([]*Runner, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/runners", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var rs []*Runner + resp, err := s.client.Do(req, &rs) + if err != nil { + return nil, resp, err + } + + return rs, resp, err +} + +// RegisterNewRunnerOptions represents the available RegisterNewRunner() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#register-a-new-runner +type RegisterNewRunnerOptions struct { + Token *string `url:"token" json:"token"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Info *RegisterNewRunnerInfoOptions `url:"info,omitempty" json:"info,omitempty"` + Active *bool `url:"active,omitempty" json:"active,omitempty"` + Paused *bool `url:"paused,omitempty" json:"paused,omitempty"` + Locked *bool `url:"locked,omitempty" json:"locked,omitempty"` + RunUntagged *bool `url:"run_untagged,omitempty" json:"run_untagged,omitempty"` + TagList *[]string `url:"tag_list[],omitempty" json:"tag_list,omitempty"` + AccessLevel *string `url:"access_level,omitempty" json:"access_level,omitempty"` + MaximumTimeout *int `url:"maximum_timeout,omitempty" json:"maximum_timeout,omitempty"` + MaintenanceNote *string `url:"maintenance_note,omitempty" json:"maintenance_note,omitempty"` +} + +// RegisterNewRunnerInfoOptions represents the info hashmap parameter in +// RegisterNewRunnerOptions. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#register-a-new-runner +type RegisterNewRunnerInfoOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Version *string `url:"version,omitempty" json:"version,omitempty"` + Revision *string `url:"revision,omitempty" json:"revision,omitempty"` + Platform *string `url:"platform,omitempty" json:"platform,omitempty"` + Architecture *string `url:"architecture,omitempty" json:"architecture,omitempty"` +} + +// RegisterNewRunner registers a new Runner for the instance. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#register-a-new-runner +func (s *RunnersService) RegisterNewRunner(opt *RegisterNewRunnerOptions, options ...RequestOptionFunc) (*Runner, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "runners", opt, options) + if err != nil { + return nil, nil, err + } + + r := new(Runner) + resp, err := s.client.Do(req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// DeleteRegisteredRunnerOptions represents the available +// DeleteRegisteredRunner() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#delete-a-runner-by-authentication-token +type DeleteRegisteredRunnerOptions struct { + Token *string `url:"token" json:"token"` +} + +// DeleteRegisteredRunner deletes a Runner by Token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#delete-a-runner-by-authentication-token +func (s *RunnersService) DeleteRegisteredRunner(opt *DeleteRegisteredRunnerOptions, options ...RequestOptionFunc) (*Response, error) { + req, err := s.client.NewRequest(http.MethodDelete, "runners", opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteRegisteredRunnerByID deletes a runner by ID. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#delete-a-runner-by-id +func (s *RunnersService) DeleteRegisteredRunnerByID(rid int, options ...RequestOptionFunc) (*Response, error) { + req, err := s.client.NewRequest(http.MethodDelete, fmt.Sprintf("runners/%d", rid), nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// VerifyRegisteredRunnerOptions represents the available +// VerifyRegisteredRunner() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#verify-authentication-for-a-registered-runner +type VerifyRegisteredRunnerOptions struct { + Token *string `url:"token" json:"token"` +} + +// VerifyRegisteredRunner registers a new runner for the instance. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#verify-authentication-for-a-registered-runner +func (s *RunnersService) VerifyRegisteredRunner(opt *VerifyRegisteredRunnerOptions, options ...RequestOptionFunc) (*Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "runners/verify", opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +type RunnerRegistrationToken struct { + Token *string `url:"token" json:"token"` + TokenExpiresAt *time.Time `url:"token_expires_at" json:"token_expires_at"` +} + +// ResetInstanceRunnerRegistrationToken resets the instance runner registration +// token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#reset-instances-runner-registration-token +func (s *RunnersService) ResetInstanceRunnerRegistrationToken(options ...RequestOptionFunc) (*RunnerRegistrationToken, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "runners/reset_registration_token", nil, options) + if err != nil { + return nil, nil, err + } + + r := new(RunnerRegistrationToken) + resp, err := s.client.Do(req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// ResetGroupRunnerRegistrationToken resets a group's runner registration token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#reset-groups-runner-registration-token +func (s *RunnersService) ResetGroupRunnerRegistrationToken(gid interface{}, options ...RequestOptionFunc) (*RunnerRegistrationToken, *Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("groups/%s/runners/reset_registration_token", PathEscape(group)) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + r := new(RunnerRegistrationToken) + resp, err := s.client.Do(req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// ResetGroupRunnerRegistrationToken resets a projects's runner registration token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#reset-projects-runner-registration-token +func (s *RunnersService) ResetProjectRunnerRegistrationToken(pid interface{}, options ...RequestOptionFunc) (*RunnerRegistrationToken, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/runners/reset_registration_token", PathEscape(project)) + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + r := new(RunnerRegistrationToken) + resp, err := s.client.Do(req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +type RunnerAuthenticationToken struct { + Token *string `url:"token" json:"token"` + TokenExpiresAt *time.Time `url:"token_expires_at" json:"token_expires_at"` +} + +// ResetRunnerAuthenticationToken resets a runner's authentication token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/runners.html#reset-runners-authentication-token-by-using-the-runner-id +func (s *RunnersService) ResetRunnerAuthenticationToken(rid int, options ...RequestOptionFunc) (*RunnerAuthenticationToken, *Response, error) { + u := fmt.Sprintf("runners/%d/reset_authentication_token", rid) + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + r := new(RunnerAuthenticationToken) + resp, err := s.client.Do(req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/search.go b/vendor/github.com/xanzy/go-gitlab/search.go new file mode 100644 index 0000000000..e75595176d --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/search.go @@ -0,0 +1,358 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// SearchService handles communication with the search related methods of the +// GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html +type SearchService struct { + client *Client +} + +// SearchOptions represents the available options for all search methods. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html +type SearchOptions struct { + ListOptions + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` +} + +type searchOptions struct { + SearchOptions + Scope string `url:"scope" json:"scope"` + Search string `url:"search" json:"search"` +} + +// Projects searches the expression within projects +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-projects +func (s *SearchService) Projects(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Project, *Response, error) { + var ps []*Project + resp, err := s.search("projects", query, &ps, opt, options...) + return ps, resp, err +} + +// ProjectsByGroup searches the expression within projects for +// the specified group +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#group-search-api +func (s *SearchService) ProjectsByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Project, *Response, error) { + var ps []*Project + resp, err := s.searchByGroup(gid, "projects", query, &ps, opt, options...) + return ps, resp, err +} + +// Issues searches the expression within issues +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-issues +func (s *SearchService) Issues(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + var is []*Issue + resp, err := s.search("issues", query, &is, opt, options...) + return is, resp, err +} + +// IssuesByGroup searches the expression within issues for +// the specified group +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-issues-1 +func (s *SearchService) IssuesByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + var is []*Issue + resp, err := s.searchByGroup(gid, "issues", query, &is, opt, options...) + return is, resp, err +} + +// IssuesByProject searches the expression within issues for +// the specified project +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-issues-2 +func (s *SearchService) IssuesByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Issue, *Response, error) { + var is []*Issue + resp, err := s.searchByProject(pid, "issues", query, &is, opt, options...) + return is, resp, err +} + +// MergeRequests searches the expression within merge requests +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-merge_requests +func (s *SearchService) MergeRequests(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + var ms []*MergeRequest + resp, err := s.search("merge_requests", query, &ms, opt, options...) + return ms, resp, err +} + +// MergeRequestsByGroup searches the expression within merge requests for +// the specified group +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-merge_requests-1 +func (s *SearchService) MergeRequestsByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + var ms []*MergeRequest + resp, err := s.searchByGroup(gid, "merge_requests", query, &ms, opt, options...) + return ms, resp, err +} + +// MergeRequestsByProject searches the expression within merge requests for +// the specified project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-merge_requests-2 +func (s *SearchService) MergeRequestsByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*MergeRequest, *Response, error) { + var ms []*MergeRequest + resp, err := s.searchByProject(pid, "merge_requests", query, &ms, opt, options...) + return ms, resp, err +} + +// Milestones searches the expression within milestones +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-milestones +func (s *SearchService) Milestones(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Milestone, *Response, error) { + var ms []*Milestone + resp, err := s.search("milestones", query, &ms, opt, options...) + return ms, resp, err +} + +// MilestonesByGroup searches the expression within milestones for +// the specified group +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-milestones-1 +func (s *SearchService) MilestonesByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Milestone, *Response, error) { + var ms []*Milestone + resp, err := s.searchByGroup(gid, "milestones", query, &ms, opt, options...) + return ms, resp, err +} + +// MilestonesByProject searches the expression within milestones for +// the specified project +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-milestones-2 +func (s *SearchService) MilestonesByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Milestone, *Response, error) { + var ms []*Milestone + resp, err := s.searchByProject(pid, "milestones", query, &ms, opt, options...) + return ms, resp, err +} + +// SnippetTitles searches the expression within snippet titles +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-snippet_titles +func (s *SearchService) SnippetTitles(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Snippet, *Response, error) { + var ss []*Snippet + resp, err := s.search("snippet_titles", query, &ss, opt, options...) + return ss, resp, err +} + +// SnippetBlobs searches the expression within snippet blobs +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-snippet_blobs +func (s *SearchService) SnippetBlobs(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Snippet, *Response, error) { + var ss []*Snippet + resp, err := s.search("snippet_blobs", query, &ss, opt, options...) + return ss, resp, err +} + +// NotesByProject searches the expression within notes for the specified +// project +// +// GitLab API docs: // https://docs.gitlab.com/ee/api/search.html#scope-notes +func (s *SearchService) NotesByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Note, *Response, error) { + var ns []*Note + resp, err := s.searchByProject(pid, "notes", query, &ns, opt, options...) + return ns, resp, err +} + +// WikiBlobs searches the expression within all wiki blobs +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-wiki_blobs +func (s *SearchService) WikiBlobs(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Wiki, *Response, error) { + var ws []*Wiki + resp, err := s.search("wiki_blobs", query, &ws, opt, options...) + return ws, resp, err +} + +// WikiBlobsByGroup searches the expression within wiki blobs for +// specified group +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-wiki_blobs-premium-1 +func (s *SearchService) WikiBlobsByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Wiki, *Response, error) { + var ws []*Wiki + resp, err := s.searchByGroup(gid, "wiki_blobs", query, &ws, opt, options...) + return ws, resp, err +} + +// WikiBlobsByProject searches the expression within wiki blobs for +// the specified project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/search.html#scope-wiki_blobs-premium-2 +func (s *SearchService) WikiBlobsByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Wiki, *Response, error) { + var ws []*Wiki + resp, err := s.searchByProject(pid, "wiki_blobs", query, &ws, opt, options...) + return ws, resp, err +} + +// Commits searches the expression within all commits +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-commits +func (s *SearchService) Commits(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Commit, *Response, error) { + var cs []*Commit + resp, err := s.search("commits", query, &cs, opt, options...) + return cs, resp, err +} + +// CommitsByGroup searches the expression within commits for the specified +// group +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-commits-premium-1 +func (s *SearchService) CommitsByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Commit, *Response, error) { + var cs []*Commit + resp, err := s.searchByGroup(gid, "commits", query, &cs, opt, options...) + return cs, resp, err +} + +// CommitsByProject searches the expression within commits for the +// specified project +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-commits-premium-2 +func (s *SearchService) CommitsByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Commit, *Response, error) { + var cs []*Commit + resp, err := s.searchByProject(pid, "commits", query, &cs, opt, options...) + return cs, resp, err +} + +// Blob represents a single blob. +type Blob struct { + Basename string `json:"basename"` + Data string `json:"data"` + Filename string `json:"filename"` + ID int `json:"id"` + Ref string `json:"ref"` + Startline int `json:"startline"` + ProjectID int `json:"project_id"` +} + +// Blobs searches the expression within all blobs +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-blobs +func (s *SearchService) Blobs(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Blob, *Response, error) { + var bs []*Blob + resp, err := s.search("blobs", query, &bs, opt, options...) + return bs, resp, err +} + +// BlobsByGroup searches the expression within blobs for the specified +// group +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-blobs-premium-1 +func (s *SearchService) BlobsByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Blob, *Response, error) { + var bs []*Blob + resp, err := s.searchByGroup(gid, "blobs", query, &bs, opt, options...) + return bs, resp, err +} + +// BlobsByProject searches the expression within blobs for the specified +// project +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-blobs-premium-2 +func (s *SearchService) BlobsByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*Blob, *Response, error) { + var bs []*Blob + resp, err := s.searchByProject(pid, "blobs", query, &bs, opt, options...) + return bs, resp, err +} + +// Users searches the expression within all users +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-users +func (s *SearchService) Users(query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*User, *Response, error) { + var ret []*User + resp, err := s.search("users", query, &ret, opt, options...) + return ret, resp, err +} + +// UsersByGroup searches the expression within users for the specified +// group +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-users-1 +func (s *SearchService) UsersByGroup(gid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*User, *Response, error) { + var ret []*User + resp, err := s.searchByGroup(gid, "users", query, &ret, opt, options...) + return ret, resp, err +} + +// UsersByProject searches the expression within users for the +// specified project +// +// GitLab API docs: https://docs.gitlab.com/ee/api/search.html#scope-users-2 +func (s *SearchService) UsersByProject(pid interface{}, query string, opt *SearchOptions, options ...RequestOptionFunc) ([]*User, *Response, error) { + var ret []*User + resp, err := s.searchByProject(pid, "users", query, &ret, opt, options...) + return ret, resp, err +} + +func (s *SearchService) search(scope, query string, result interface{}, opt *SearchOptions, options ...RequestOptionFunc) (*Response, error) { + opts := &searchOptions{SearchOptions: *opt, Scope: scope, Search: query} + + req, err := s.client.NewRequest(http.MethodGet, "search", opts, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, result) +} + +func (s *SearchService) searchByGroup(gid interface{}, scope, query string, result interface{}, opt *SearchOptions, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/-/search", PathEscape(group)) + + opts := &searchOptions{SearchOptions: *opt, Scope: scope, Search: query} + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, result) +} + +func (s *SearchService) searchByProject(pid interface{}, scope, query string, result interface{}, opt *SearchOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/-/search", PathEscape(project)) + + opts := &searchOptions{SearchOptions: *opt, Scope: scope, Search: query} + + req, err := s.client.NewRequest(http.MethodGet, u, opts, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, result) +} diff --git a/vendor/github.com/xanzy/go-gitlab/services.go b/vendor/github.com/xanzy/go-gitlab/services.go new file mode 100644 index 0000000000..9b25201994 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/services.go @@ -0,0 +1,1707 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" +) + +// ServicesService handles communication with the services related methods of +// the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/services.html +type ServicesService struct { + client *Client +} + +// Service represents a GitLab service. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/services.html +type Service struct { + ID int `json:"id"` + Title string `json:"title"` + Slug string `json:"slug"` + CreatedAt *time.Time `json:"created_at"` + UpdatedAt *time.Time `json:"updated_at"` + Active bool `json:"active"` + PushEvents bool `json:"push_events"` + IssuesEvents bool `json:"issues_events"` + ConfidentialIssuesEvents bool `json:"confidential_issues_events"` + CommitEvents bool `json:"commit_events"` + MergeRequestsEvents bool `json:"merge_requests_events"` + CommentOnEventEnabled bool `json:"comment_on_event_enabled"` + TagPushEvents bool `json:"tag_push_events"` + NoteEvents bool `json:"note_events"` + ConfidentialNoteEvents bool `json:"confidential_note_events"` + PipelineEvents bool `json:"pipeline_events"` + JobEvents bool `json:"job_events"` + WikiPageEvents bool `json:"wiki_page_events"` + DeploymentEvents bool `json:"deployment_events"` +} + +// ListServices gets a list of all active services. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/services.html#list-all-active-services +func (s *ServicesService) ListServices(pid interface{}, options ...RequestOptionFunc) ([]*Service, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var svcs []*Service + resp, err := s.client.Do(req, &svcs) + if err != nil { + return nil, resp, err + } + + return svcs, resp, err +} + +// CustomIssueTrackerService represents Custom Issue Tracker service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#custom-issue-tracker +type CustomIssueTrackerService struct { + Service + Properties *CustomIssueTrackerServiceProperties `json:"properties"` +} + +// CustomIssueTrackerServiceProperties represents Custom Issue Tracker specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#custom-issue-tracker +type CustomIssueTrackerServiceProperties struct { + ProjectURL string `json:"project_url,omitempty"` + IssuesURL string `json:"issues_url,omitempty"` + NewIssueURL string `json:"new_issue_url,omitempty"` +} + +// GetCustomIssueTrackerService gets Custom Issue Tracker service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-custom-issue-tracker-service-settings +func (s *ServicesService) GetCustomIssueTrackerService(pid interface{}, options ...RequestOptionFunc) (*CustomIssueTrackerService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/custom-issue-tracker", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(CustomIssueTrackerService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetCustomIssueTrackerServiceOptions represents the available SetCustomIssueTrackerService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-custom-issue-tracker-service +type SetCustomIssueTrackerServiceOptions struct { + NewIssueURL *string `url:"new_issue_url,omitempty" json:"new_issue_url,omitempty"` + IssuesURL *string `url:"issues_url,omitempty" json:"issues_url,omitempty"` + ProjectURL *string `url:"project_url,omitempty" json:"project_url,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` +} + +// SetCustomIssueTrackerService sets Custom Issue Tracker service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-custom-issue-tracker-service +func (s *ServicesService) SetCustomIssueTrackerService(pid interface{}, opt *SetCustomIssueTrackerServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/custom-issue-tracker", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteCustomIssueTrackerService deletes Custom Issue Tracker service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-custom-issue-tracker-service +func (s *ServicesService) DeleteCustomIssueTrackerService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/custom-issue-tracker", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DroneCIService represents Drone CI service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#drone-ci +type DroneCIService struct { + Service + Properties *DroneCIServiceProperties `json:"properties"` +} + +// DroneCIServiceProperties represents Drone CI specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#drone-ci +type DroneCIServiceProperties struct { + Token string `json:"token"` + DroneURL string `json:"drone_url"` + EnableSSLVerification bool `json:"enable_ssl_verification"` +} + +// GetDroneCIService gets Drone CI service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-drone-ci-service-settings +func (s *ServicesService) GetDroneCIService(pid interface{}, options ...RequestOptionFunc) (*DroneCIService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/drone-ci", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(DroneCIService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetDroneCIServiceOptions represents the available SetDroneCIService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-drone-ci-service +type SetDroneCIServiceOptions struct { + Token *string `url:"token,omitempty" json:"token,omitempty"` + DroneURL *string `url:"drone_url,omitempty" json:"drone_url,omitempty"` + EnableSSLVerification *bool `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"` +} + +// SetDroneCIService sets Drone CI service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-drone-ci-service +func (s *ServicesService) SetDroneCIService(pid interface{}, opt *SetDroneCIServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/drone-ci", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteDroneCIService deletes Drone CI service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-drone-ci-service +func (s *ServicesService) DeleteDroneCIService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/drone-ci", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// EmailsOnPushService represents Emails on Push service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#emails-on-push +type EmailsOnPushService struct { + Service + Properties *EmailsOnPushServiceProperties `json:"properties"` +} + +// EmailsOnPushServiceProperties represents Emails on Push specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#emails-on-push +type EmailsOnPushServiceProperties struct { + Recipients string `json:"recipients"` + DisableDiffs bool `json:"disable_diffs"` + SendFromCommitterEmail bool `json:"send_from_committer_email"` + PushEvents bool `json:"push_events"` + TagPushEvents bool `json:"tag_push_events"` + BranchesToBeNotified string `json:"branches_to_be_notified"` +} + +// GetEmailsOnPushService gets Emails on Push service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#get-emails-on-push-integration-settings +func (s *ServicesService) GetEmailsOnPushService(pid interface{}, options ...RequestOptionFunc) (*EmailsOnPushService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/integrations/emails-on-push", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(EmailsOnPushService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetEmailsOnPushServiceOptions represents the available SetEmailsOnPushService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#createedit-emails-on-push-integration +type SetEmailsOnPushServiceOptions struct { + Recipients *string `url:"recipients,omitempty" json:"recipients,omitempty"` + DisableDiffs *bool `url:"disable_diffs,omitempty" json:"disable_diffs,omitempty"` + SendFromCommitterEmail *bool `url:"send_from_committer_email,omitempty" json:"send_from_committer_email,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + BranchesToBeNotified *string `url:"branches_to_be_notified,omitempty" json:"branches_to_be_notified,omitempty"` +} + +// SetEmailsOnPushService sets Emails on Push service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#createedit-emails-on-push-integration +func (s *ServicesService) SetEmailsOnPushService(pid interface{}, opt *SetEmailsOnPushServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/integrations/emails-on-push", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteEmailsOnPushService deletes Emails on Push service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#disable-emails-on-push-integration +func (s *ServicesService) DeleteEmailsOnPushService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/integrations/emails-on-push", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ExternalWikiService represents External Wiki service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#external-wiki +type ExternalWikiService struct { + Service + Properties *ExternalWikiServiceProperties `json:"properties"` +} + +// ExternalWikiServiceProperties represents External Wiki specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#external-wiki +type ExternalWikiServiceProperties struct { + ExternalWikiURL string `json:"external_wiki_url"` +} + +// GetExternalWikiService gets External Wiki service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-external-wiki-service-settings +func (s *ServicesService) GetExternalWikiService(pid interface{}, options ...RequestOptionFunc) (*ExternalWikiService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/external-wiki", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(ExternalWikiService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetExternalWikiServiceOptions represents the available SetExternalWikiService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-external-wiki-service +type SetExternalWikiServiceOptions struct { + ExternalWikiURL *string `url:"external_wiki_url,omitempty" json:"external_wiki_url,omitempty"` +} + +// SetExternalWikiService sets External Wiki service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-external-wiki-service +func (s *ServicesService) SetExternalWikiService(pid interface{}, opt *SetExternalWikiServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/external-wiki", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteExternalWikiService deletes External Wiki service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-external-wiki-service +func (s *ServicesService) DeleteExternalWikiService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/external-wiki", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// GithubService represents Github service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#github-premium +type GithubService struct { + Service + Properties *GithubServiceProperties `json:"properties"` +} + +// GithubServiceProperties represents Github specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#github-premium +type GithubServiceProperties struct { + RepositoryURL string `json:"repository_url"` + StaticContext bool `json:"static_context"` +} + +// GetGithubService gets Github service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-github-service-settings +func (s *ServicesService) GetGithubService(pid interface{}, options ...RequestOptionFunc) (*GithubService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/github", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(GithubService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetGithubServiceOptions represents the available SetGithubService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-github-service +type SetGithubServiceOptions struct { + Token *string `url:"token,omitempty" json:"token,omitempty"` + RepositoryURL *string `url:"repository_url,omitempty" json:"repository_url,omitempty"` + StaticContext *bool `url:"static_context,omitempty" json:"static_context,omitempty"` +} + +// SetGithubService sets Github service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-github-service +func (s *ServicesService) SetGithubService(pid interface{}, opt *SetGithubServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/github", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteGithubService deletes Github service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-github-service +func (s *ServicesService) DeleteGithubService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/github", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// SetGitLabCIServiceOptions represents the available SetGitLabCIService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-gitlab-ci-service +type SetGitLabCIServiceOptions struct { + Token *string `url:"token,omitempty" json:"token,omitempty"` + ProjectURL *string `url:"project_url,omitempty" json:"project_url,omitempty"` +} + +// SetGitLabCIService sets GitLab CI service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-gitlab-ci-service +func (s *ServicesService) SetGitLabCIService(pid interface{}, opt *SetGitLabCIServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/gitlab-ci", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteGitLabCIService deletes GitLab CI service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-gitlab-ci-service +func (s *ServicesService) DeleteGitLabCIService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/gitlab-ci", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// SetHipChatServiceOptions represents the available SetHipChatService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-hipchat-service +type SetHipChatServiceOptions struct { + Token *string `url:"token,omitempty" json:"token,omitempty" ` + Room *string `url:"room,omitempty" json:"room,omitempty"` +} + +// SetHipChatService sets HipChat service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-hipchat-service +func (s *ServicesService) SetHipChatService(pid interface{}, opt *SetHipChatServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/hipchat", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteHipChatService deletes HipChat service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-hipchat-service +func (s *ServicesService) DeleteHipChatService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/hipchat", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// JenkinsCIService represents Jenkins CI service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#jenkins-ci +type JenkinsCIService struct { + Service + Properties *JenkinsCIServiceProperties `json:"properties"` +} + +// JenkinsCIServiceProperties represents Jenkins CI specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#jenkins-ci +type JenkinsCIServiceProperties struct { + URL string `json:"jenkins_url"` + ProjectName string `json:"project_name"` + Username string `json:"username"` +} + +// GetJenkinsCIService gets Jenkins CI service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-jenkins-ci-service-settings +func (s *ServicesService) GetJenkinsCIService(pid interface{}, options ...RequestOptionFunc) (*JenkinsCIService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/jenkins", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(JenkinsCIService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetJenkinsCIServiceOptions represents the available SetJenkinsCIService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#jenkins-ci +type SetJenkinsCIServiceOptions struct { + URL *string `url:"jenkins_url,omitempty" json:"jenkins_url,omitempty"` + ProjectName *string `url:"project_name,omitempty" json:"project_name,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + Password *string `url:"password,omitempty" json:"password,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` +} + +// SetJenkinsCIService sets Jenkins service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#create-edit-jenkins-ci-service +func (s *ServicesService) SetJenkinsCIService(pid interface{}, opt *SetJenkinsCIServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/jenkins", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteJenkinsCIService deletes Jenkins CI service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-jira-service +func (s *ServicesService) DeleteJenkinsCIService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/jenkins", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// JiraService represents Jira service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#jira +type JiraService struct { + Service + Properties *JiraServiceProperties `json:"properties"` +} + +// JiraServiceProperties represents Jira specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#jira +type JiraServiceProperties struct { + URL string `json:"url"` + APIURL string `json:"api_url"` + ProjectKey string `json:"project_key" ` + Username string `json:"username" ` + Password string `json:"password" ` + JiraIssueTransitionID string `json:"jira_issue_transition_id"` +} + +// UnmarshalJSON decodes the Jira Service Properties. +// +// This allows support of JiraIssueTransitionID for both type string (>11.9) and float64 (<11.9) +func (p *JiraServiceProperties) UnmarshalJSON(b []byte) error { + type Alias JiraServiceProperties + raw := struct { + *Alias + JiraIssueTransitionID interface{} `json:"jira_issue_transition_id"` + }{ + Alias: (*Alias)(p), + } + + if err := json.Unmarshal(b, &raw); err != nil { + return err + } + + switch id := raw.JiraIssueTransitionID.(type) { + case nil: + // No action needed. + case string: + p.JiraIssueTransitionID = id + case float64: + p.JiraIssueTransitionID = strconv.Itoa(int(id)) + default: + return fmt.Errorf("failed to unmarshal JiraTransitionID of type: %T", id) + } + + return nil +} + +// GetJiraService gets Jira service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-jira-service-settings +func (s *ServicesService) GetJiraService(pid interface{}, options ...RequestOptionFunc) (*JiraService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/jira", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(JiraService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetJiraServiceOptions represents the available SetJiraService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-jira-service +type SetJiraServiceOptions struct { + URL *string `url:"url,omitempty" json:"url,omitempty"` + APIURL *string `url:"api_url,omitempty" json:"api_url,omitempty"` + ProjectKey *string `url:"project_key,omitempty" json:"project_key,omitempty" ` + Username *string `url:"username,omitempty" json:"username,omitempty" ` + Password *string `url:"password,omitempty" json:"password,omitempty" ` + Active *bool `url:"active,omitempty" json:"active,omitempty"` + JiraIssueTransitionID *string `url:"jira_issue_transition_id,omitempty" json:"jira_issue_transition_id,omitempty"` + CommitEvents *bool `url:"commit_events,omitempty" json:"commit_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + CommentOnEventEnabled *bool `url:"comment_on_event_enabled,omitempty" json:"comment_on_event_enabled,omitempty"` +} + +// SetJiraService sets Jira service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-jira-service +func (s *ServicesService) SetJiraService(pid interface{}, opt *SetJiraServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/jira", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteJiraService deletes Jira service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-jira-service +func (s *ServicesService) DeleteJiraService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/jira", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// MattermostService represents Mattermost service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#mattermost-notifications +type MattermostService struct { + Service + Properties *MattermostServiceProperties `json:"properties"` +} + +// MattermostServiceProperties represents Mattermost specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#mattermost-notifications +type MattermostServiceProperties struct { + WebHook string `json:"webhook"` + Username string `json:"username"` + Channel string `json:"channel"` + NotifyOnlyBrokenPipelines BoolValue `json:"notify_only_broken_pipelines"` + BranchesToBeNotified string `json:"branches_to_be_notified"` + ConfidentialIssueChannel string `json:"confidential_issue_channel"` + ConfidentialNoteChannel string `json:"confidential_note_channel"` + IssueChannel string `json:"issue_channel"` + MergeRequestChannel string `json:"merge_request_channel"` + NoteChannel string `json:"note_channel"` + TagPushChannel string `json:"tag_push_channel"` + PipelineChannel string `json:"pipeline_channel"` + PushChannel string `json:"push_channel"` + WikiPageChannel string `json:"wiki_page_channel"` +} + +// GetMattermostService gets Mattermost service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-slack-service-settings +func (s *ServicesService) GetMattermostService(pid interface{}, options ...RequestOptionFunc) (*MattermostService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/mattermost", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(MattermostService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetMattermostServiceOptions represents the available SetMattermostService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-mattermost-notifications-service +type SetMattermostServiceOptions struct { + WebHook *string `url:"webhook,omitempty" json:"webhook,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + Channel *string `url:"channel,omitempty" json:"channel,omitempty"` + NotifyOnlyBrokenPipelines *bool `url:"notify_only_broken_pipelines,omitempty" json:"notify_only_broken_pipelines,omitempty"` + BranchesToBeNotified *string `url:"branches_to_be_notified,omitempty" json:"branches_to_be_notified,omitempty"` + ConfidentialIssueChannel *string `url:"confidential_issue_channel,omitempty" json:"confidential_issue_channel,omitempty"` + ConfidentialIssuesEvents *bool `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"` + ConfidentialNoteChannel *string `json:"confidential_note_channel,omitempty"` + ConfidentialNoteEvents *bool `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"` + IssueChannel *string `url:"issue_channel,omitempty" json:"issue_channel,omitempty"` + IssuesEvents *bool `url:"issues_events,omitempty" json:"issues_events,omitempty"` + MergeRequestChannel *string `url:"merge_request_channel,omitempty" json:"merge_request_channel,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + TagPushChannel *string `url:"tag_push_channel,omitempty" json:"tag_push_channel,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + NoteChannel *string `url:"note_channel,omitempty" json:"note_channel,omitempty"` + NoteEvents *bool `url:"note_events,omitempty" json:"note_events,omitempty"` + PipelineChannel *string `url:"pipeline_channel,omitempty" json:"pipeline_channel,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` + PushChannel *string `url:"push_channel,omitempty" json:"push_channel,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + WikiPageChannel *string `url:"wiki_page_channel,omitempty" json:"wiki_page_channel,omitempty"` + WikiPageEvents *bool `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"` +} + +// SetMattermostService sets Mattermost service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-mattermost-notifications-service +func (s *ServicesService) SetMattermostService(pid interface{}, opt *SetMattermostServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/mattermost", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteMattermostService deletes Mattermost service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-mattermost-notifications-service +func (s *ServicesService) DeleteMattermostService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/mattermost", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// MicrosoftTeamsService represents Microsoft Teams service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#microsoft-teams +type MicrosoftTeamsService struct { + Service + Properties *MicrosoftTeamsServiceProperties `json:"properties"` +} + +// MicrosoftTeamsServiceProperties represents Microsoft Teams specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#microsoft-teams +type MicrosoftTeamsServiceProperties struct { + WebHook string `json:"webhook"` + NotifyOnlyBrokenPipelines BoolValue `json:"notify_only_broken_pipelines"` + BranchesToBeNotified string `json:"branches_to_be_notified"` + IssuesEvents BoolValue `json:"issues_events"` + ConfidentialIssuesEvents BoolValue `json:"confidential_issues_events"` + MergeRequestsEvents BoolValue `json:"merge_requests_events"` + TagPushEvents BoolValue `json:"tag_push_events"` + NoteEvents BoolValue `json:"note_events"` + ConfidentialNoteEvents BoolValue `json:"confidential_note_events"` + PipelineEvents BoolValue `json:"pipeline_events"` + WikiPageEvents BoolValue `json:"wiki_page_events"` +} + +// GetMicrosoftTeamsService gets MicrosoftTeams service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-microsoft-teams-service-settings +func (s *ServicesService) GetMicrosoftTeamsService(pid interface{}, options ...RequestOptionFunc) (*MicrosoftTeamsService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/microsoft-teams", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(MicrosoftTeamsService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetMicrosoftTeamsServiceOptions represents the available SetMicrosoftTeamsService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#create-edit-microsoft-teams-service +type SetMicrosoftTeamsServiceOptions struct { + WebHook *string `url:"webhook,omitempty" json:"webhook,omitempty"` + NotifyOnlyBrokenPipelines *bool `url:"notify_only_broken_pipelines,omitempty" json:"notify_only_broken_pipelines,omitempty"` + BranchesToBeNotified *string `url:"branches_to_be_notified,omitempty" json:"branches_to_be_notified,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + IssuesEvents *bool `url:"issues_events,omitempty" json:"issues_events,omitempty"` + ConfidentialIssuesEvents *bool `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + NoteEvents *bool `url:"note_events,omitempty" json:"note_events,omitempty"` + ConfidentialNoteEvents *bool `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` + WikiPageEvents *bool `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"` +} + +// SetMicrosoftTeamsService sets Microsoft Teams service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#create-edit-microsoft-teams-service +func (s *ServicesService) SetMicrosoftTeamsService(pid interface{}, opt *SetMicrosoftTeamsServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/microsoft-teams", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + return s.client.Do(req, nil) +} + +// DeleteMicrosoftTeamsService deletes Microsoft Teams service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-microsoft-teams-service +func (s *ServicesService) DeleteMicrosoftTeamsService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/microsoft-teams", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// PipelinesEmailService represents Pipelines Email service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#pipeline-emails +type PipelinesEmailService struct { + Service + Properties *PipelinesEmailProperties `json:"properties"` +} + +// PipelinesEmailProperties represents PipelinesEmail specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#pipeline-emails +type PipelinesEmailProperties struct { + Recipients string `json:"recipients"` + NotifyOnlyBrokenPipelines BoolValue `json:"notify_only_broken_pipelines"` + NotifyOnlyDefaultBranch BoolValue `json:"notify_only_default_branch"` + BranchesToBeNotified string `json:"branches_to_be_notified"` +} + +// GetPipelinesEmailService gets Pipelines Email service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-pipeline-emails-service-settings +func (s *ServicesService) GetPipelinesEmailService(pid interface{}, options ...RequestOptionFunc) (*PipelinesEmailService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/pipelines-email", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(PipelinesEmailService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetPipelinesEmailServiceOptions represents the available +// SetPipelinesEmailService() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#pipeline-emails +type SetPipelinesEmailServiceOptions struct { + Recipients *string `url:"recipients,omitempty" json:"recipients,omitempty"` + NotifyOnlyBrokenPipelines *bool `url:"notify_only_broken_pipelines,omitempty" json:"notify_only_broken_pipelines,omitempty"` + NotifyOnlyDefaultBranch *bool `url:"notify_only_default_branch,omitempty" json:"notify_only_default_branch,omitempty"` + AddPusher *bool `url:"add_pusher,omitempty" json:"add_pusher,omitempty"` + BranchesToBeNotified *string `url:"branches_to_be_notified,omitempty" json:"branches_to_be_notified,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` +} + +// SetPipelinesEmailService sets Pipelines Email service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#pipeline-emails +func (s *ServicesService) SetPipelinesEmailService(pid interface{}, opt *SetPipelinesEmailServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/pipelines-email", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeletePipelinesEmailService deletes Pipelines Email service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-pipeline-emails-service +func (s *ServicesService) DeletePipelinesEmailService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/pipelines-email", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// PrometheusService represents Prometheus service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#prometheus +type PrometheusService struct { + Service + Properties *PrometheusServiceProperties `json:"properties"` +} + +// PrometheusServiceProperties represents Prometheus specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#prometheus +type PrometheusServiceProperties struct { + APIURL string `json:"api_url"` + GoogleIAPAudienceClientID string `json:"google_iap_audience_client_id"` + GoogleIAPServiceAccountJSON string `json:"google_iap_service_account_json"` +} + +// GetPrometheusService gets Prometheus service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-prometheus-service-settings +func (s *ServicesService) GetPrometheusService(pid interface{}, options ...RequestOptionFunc) (*PrometheusService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/prometheus", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(PrometheusService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetPrometheusServiceOptions represents the available SetPrometheusService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-prometheus-service +type SetPrometheusServiceOptions struct { + APIURL *string `url:"api_url,omitempty" json:"api_url,omitempty"` + GoogleIAPAudienceClientID *string `url:"google_iap_audience_client_id,omitempty" json:"google_iap_audience_client_id,omitempty"` + GoogleIAPServiceAccountJSON *string `url:"google_iap_service_account_json,omitempty" json:"google_iap_service_account_json,omitempty"` +} + +// SetPrometheusService sets Prometheus service for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-prometheus-service +func (s *ServicesService) SetPrometheusService(pid interface{}, opt *SetPrometheusServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/prometheus", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeletePrometheusService deletes Prometheus service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-prometheus-service +func (s *ServicesService) DeletePrometheusService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/prometheus", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// SlackService represents Slack service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#slack +type SlackService struct { + Service + Properties *SlackServiceProperties `json:"properties"` +} + +// SlackServiceProperties represents Slack specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#slack +type SlackServiceProperties struct { + WebHook string `json:"webhook"` + Username string `json:"username"` + Channel string `json:"channel"` + NotifyOnlyBrokenPipelines BoolValue `json:"notify_only_broken_pipelines"` + NotifyOnlyDefaultBranch BoolValue `json:"notify_only_default_branch"` + BranchesToBeNotified string `json:"branches_to_be_notified"` + ConfidentialIssueChannel string `json:"confidential_issue_channel"` + ConfidentialNoteChannel string `json:"confidential_note_channel"` + DeploymentChannel string `json:"deployment_channel"` + IssueChannel string `json:"issue_channel"` + MergeRequestChannel string `json:"merge_request_channel"` + NoteChannel string `json:"note_channel"` + TagPushChannel string `json:"tag_push_channel"` + PipelineChannel string `json:"pipeline_channel"` + PushChannel string `json:"push_channel"` + WikiPageChannel string `json:"wiki_page_channel"` +} + +// GetSlackService gets Slack service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-slack-service-settings +func (s *ServicesService) GetSlackService(pid interface{}, options ...RequestOptionFunc) (*SlackService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/slack", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(SlackService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetSlackServiceOptions represents the available SetSlackService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-slack-service +type SetSlackServiceOptions struct { + WebHook *string `url:"webhook,omitempty" json:"webhook,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + Channel *string `url:"channel,omitempty" json:"channel,omitempty"` + NotifyOnlyBrokenPipelines *bool `url:"notify_only_broken_pipelines,omitempty" json:"notify_only_broken_pipelines,omitempty"` + NotifyOnlyDefaultBranch *bool `url:"notify_only_default_branch,omitempty" json:"notify_only_default_branch,omitempty"` + BranchesToBeNotified *string `url:"branches_to_be_notified,omitempty" json:"branches_to_be_notified,omitempty"` + ConfidentialIssueChannel *string `url:"confidential_issue_channel,omitempty" json:"confidential_issue_channel,omitempty"` + ConfidentialIssuesEvents *bool `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"` + // TODO: Currently, GitLab ignores this option (not implemented yet?), so + // there is no way to set it. Uncomment when this is fixed. + // See: https://gitlab.com/gitlab-org/gitlab-ce/issues/49730 + // ConfidentialNoteChannel *string `json:"confidential_note_channel,omitempty"` + ConfidentialNoteEvents *bool `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"` + DeploymentChannel *string `url:"deployment_channel,omitempty" json:"deployment_channel,omitempty"` + DeploymentEvents *bool `url:"deployment_events,omitempty" json:"deployment_events,omitempty"` + IssueChannel *string `url:"issue_channel,omitempty" json:"issue_channel,omitempty"` + IssuesEvents *bool `url:"issues_events,omitempty" json:"issues_events,omitempty"` + MergeRequestChannel *string `url:"merge_request_channel,omitempty" json:"merge_request_channel,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + TagPushChannel *string `url:"tag_push_channel,omitempty" json:"tag_push_channel,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + NoteChannel *string `url:"note_channel,omitempty" json:"note_channel,omitempty"` + NoteEvents *bool `url:"note_events,omitempty" json:"note_events,omitempty"` + PipelineChannel *string `url:"pipeline_channel,omitempty" json:"pipeline_channel,omitempty"` + PipelineEvents *bool `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"` + PushChannel *string `url:"push_channel,omitempty" json:"push_channel,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + WikiPageChannel *string `url:"wiki_page_channel,omitempty" json:"wiki_page_channel,omitempty"` + WikiPageEvents *bool `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"` +} + +// SetSlackService sets Slack service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#edit-slack-service +func (s *ServicesService) SetSlackService(pid interface{}, opt *SetSlackServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/slack", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteSlackService deletes Slack service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-slack-service +func (s *ServicesService) DeleteSlackService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/slack", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// SlackSlashCommandsService represents Slack slash commands settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#slack-slash-commands +type SlackSlashCommandsService struct { + Service + Properties *SlackSlashCommandsProperties `json:"properties"` +} + +// SlackSlashCommandsProperties represents Slack slash commands specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#slack-slash-commands +type SlackSlashCommandsProperties struct { + Token string `json:"token"` +} + +// GetSlackSlashCommandsService gets Slack slash commands service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#get-slack-slash-command-integration-settings +func (s *ServicesService) GetSlackSlashCommandsService(pid interface{}, options ...RequestOptionFunc) (*SlackSlashCommandsService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/slack-slash-commands", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(SlackSlashCommandsService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetSlackSlashCommandsServiceOptions represents the available SetSlackSlashCommandsService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-slack-slash-command-service +type SetSlackSlashCommandsServiceOptions struct { + Token *string `url:"token,omitempty" json:"token,omitempty"` +} + +// SetSlackSlashCommandsService sets Slack slash commands service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/13.12/ee/api/services.html#createedit-slack-slash-command-service +func (s *ServicesService) SetSlackSlashCommandsService(pid interface{}, opt *SetSlackSlashCommandsServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/slack-slash-commands", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteSlackSlashCommandsService deletes Slack slash commands service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/13.12/ee/api/services.html#delete-slack-slash-command-service +func (s *ServicesService) DeleteSlackSlashCommandsService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/slack-slash-commands", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// MattermostSlashCommandsService represents Mattermost slash commands settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#mattermost-slash-commands +type MattermostSlashCommandsService struct { + Service + Properties *MattermostSlashCommandsProperties `json:"properties"` +} + +// MattermostSlashCommandsProperties represents Mattermost slash commands specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#mattermost-slash-commands +type MattermostSlashCommandsProperties struct { + Token string `json:"token"` + Username string `json:"username,omitempty"` +} + +// GetMattermostSlashCommandsService gets Slack Mattermost commands service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#get-mattermost-slash-command-integration-settings +func (s *ServicesService) GetMattermostSlashCommandsService(pid interface{}, options ...RequestOptionFunc) (*MattermostSlashCommandsService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/mattermost-slash-commands", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(MattermostSlashCommandsService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetMattermostSlashCommandsServiceOptions represents the available SetSlackSlashCommandsService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#get-mattermost-slash-command-integration-settings +type SetMattermostSlashCommandsServiceOptions struct { + Token *string `url:"token,omitempty" json:"token,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` +} + +// SetMattermostSlashCommandsService sets Mattermost slash commands service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#createedit-mattermost-slash-command-integration +func (s *ServicesService) SetMattermostSlashCommandsService(pid interface{}, opt *SetMattermostSlashCommandsServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/mattermost-slash-commands", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteMattermostSlashCommandsService deletes Mattermost slash commands service for project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/integrations.html#disable-mattermost-slash-command-integration +func (s *ServicesService) DeleteMattermostSlashCommandsService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/mattermost-slash-commands", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// YouTrackService represents YouTrack service settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#youtrack +type YouTrackService struct { + Service + Properties *YouTrackServiceProperties `json:"properties"` +} + +// YouTrackServiceProperties represents YouTrack specific properties. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#youtrack +type YouTrackServiceProperties struct { + IssuesURL string `json:"issues_url"` + ProjectURL string `json:"project_url"` + Description string `json:"description"` + PushEvents bool `json:"push_events"` +} + +// GetYouTrackService gets YouTrack service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#get-youtrack-service-settings +func (s *ServicesService) GetYouTrackService(pid interface{}, options ...RequestOptionFunc) (*YouTrackService, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/services/youtrack", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + svc := new(YouTrackService) + resp, err := s.client.Do(req, svc) + if err != nil { + return nil, resp, err + } + + return svc, resp, err +} + +// SetYouTrackServiceOptions represents the available SetYouTrackService() +// options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-youtrack-service +type SetYouTrackServiceOptions struct { + IssuesURL *string `url:"issues_url,omitempty" json:"issues_url,omitempty"` + ProjectURL *string `url:"project_url,omitempty" json:"project_url,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` +} + +// SetYouTrackService sets YouTrack service for a project +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#createedit-youtrack-service +func (s *ServicesService) SetYouTrackService(pid interface{}, opt *SetYouTrackServiceOptions, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/youtrack", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteYouTrackService deletes YouTrack service settings for a project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/services.html#delete-youtrack-service +func (s *ServicesService) DeleteYouTrackService(pid interface{}, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/services/youtrack", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/settings.go b/vendor/github.com/xanzy/go-gitlab/settings.go new file mode 100644 index 0000000000..deddf4962f --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/settings.go @@ -0,0 +1,777 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "net/http" + "time" +) + +// SettingsService handles communication with the application SettingsService +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/settings.html +type SettingsService struct { + client *Client +} + +// Settings represents the GitLab application settings. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/settings.html +// +// The available parameters have been modeled directly after the code, as the +// documentation seems to be inaccurate. +// +// https://gitlab.com/gitlab-org/gitlab/-/blob/v14.9.3-ee/lib/api/settings.rb +// https://gitlab.com/gitlab-org/gitlab/-/blob/v14.9.3-ee/lib/api/entities/application_setting.rb#L5 +// https://gitlab.com/gitlab-org/gitlab/-/blob/v14.9.3-ee/app/helpers/application_settings_helper.rb#L192 +// https://gitlab.com/gitlab-org/gitlab/-/blob/v14.9.3-ee/ee/lib/ee/api/helpers/settings_helpers.rb#L10 +// https://gitlab.com/gitlab-org/gitlab/-/blob/v14.9.3-ee/ee/app/helpers/ee/application_settings_helper.rb#L20 +type Settings struct { + ID int `json:"id"` + AbuseNotificationEmail string `json:"abuse_notification_email"` + AdminMode bool `json:"admin_mode"` + AfterSignOutPath string `json:"after_sign_out_path"` + AfterSignUpText string `json:"after_sign_up_text"` + AkismetAPIKey string `json:"akismet_api_key"` + AkismetEnabled bool `json:"akismet_enabled"` + AllowGroupOwnersToManageLDAP bool `json:"allow_group_owners_to_manage_ldap"` + AllowLocalRequestsFromSystemHooks bool `json:"allow_local_requests_from_system_hooks"` + AllowLocalRequestsFromWebHooksAndServices bool `json:"allow_local_requests_from_web_hooks_and_services"` + ArchiveBuildsInHumanReadable string `json:"archive_builds_in_human_readable"` + AssetProxyAllowlist []string `json:"asset_proxy_allowlist"` + AssetProxyEnabled bool `json:"asset_proxy_enabled"` + AssetProxyURL string `json:"asset_proxy_url"` + AssetProxySecretKey string `json:"asset_proxy_secret_key"` + AuthorizedKeysEnabled bool `json:"authorized_keys_enabled"` + AutoDevOpsDomain string `json:"auto_devops_domain"` + AutoDevOpsEnabled bool `json:"auto_devops_enabled"` + AutomaticPurchasedStorageAllocation bool `json:"automatic_purchased_storage_allocation"` + CanCreateGroup bool `json:"can_create_group"` + CheckNamespacePlan bool `json:"check_namespace_plan"` + CommitEmailHostname string `json:"commit_email_hostname"` + ContainerExpirationPoliciesEnableHistoricEntries bool `json:"container_expiration_policies_enable_historic_entries"` + ContainerRegistryCleanupTagsServiceMaxListSize int `json:"container_registry_cleanup_tags_service_max_list_size"` + ContainerRegistryDeleteTagsServiceTimeout int `json:"container_registry_delete_tags_service_timeout"` + ContainerRegistryExpirationPoliciesCaching bool `json:"container_registry_expiration_policies_caching"` + ContainerRegistryExpirationPoliciesWorkerCapacity int `json:"container_registry_expiration_policies_worker_capacity"` + ContainerRegistryImportCreatedBefore *time.Time `json:"container_registry_import_created_before"` + ContainerRegistryImportMaxRetries int `json:"container_registry_import_max_retries"` + ContainerRegistryImportMaxStepDuration int `json:"container_registry_import_max_step_duration"` + ContainerRegistryImportMaxTagsCount int `json:"container_registry_import_max_tags_count"` + ContainerRegistryImportStartMaxRetries int `json:"container_registry_import_start_max_retries"` + ContainerRegistryImportTargetPlan string `json:"container_registry_import_target_plan"` + ContainerRegistryTokenExpireDelay int `json:"container_registry_token_expire_delay"` + CreatedAt *time.Time `json:"created_at"` + CustomHTTPCloneURLRoot string `json:"custom_http_clone_url_root"` + DNSRebindingProtectionEnabled bool `json:"dns_rebinding_protection_enabled"` + DSAKeyRestriction int `json:"dsa_key_restriction"` + DeactivateDormantUsers bool `json:"deactivate_dormant_users"` + DefaultArtifactsExpireIn string `json:"default_artifacts_expire_in"` + DefaultBranchName string `json:"default_branch_name"` + DefaultBranchProtection int `json:"default_branch_protection"` + DefaultCiConfigPath string `json:"default_ci_config_path"` + DefaultGroupVisibility VisibilityValue `json:"default_group_visibility"` + DefaultProjectCreation int `json:"default_project_creation"` + DefaultProjectDeletionProtection bool `json:"default_project_deletion_protection"` + DefaultProjectVisibility VisibilityValue `json:"default_project_visibility"` + DefaultProjectsLimit int `json:"default_projects_limit"` + DefaultSnippetVisibility VisibilityValue `json:"default_snippet_visibility"` + DelayedGroupDeletion bool `json:"delayed_group_deletion"` + DelayedProjectDeletion bool `json:"delayed_project_deletion"` + DeleteInactiveProjects bool `json:"delete_inactive_projects"` + DeletionAdjournedPeriod int `json:"deletion_adjourned_period"` + DiffMaxFiles int `json:"diff_max_files"` + DiffMaxLines int `json:"diff_max_lines"` + DiffMaxPatchBytes int `json:"diff_max_patch_bytes"` + DisableFeedToken bool `json:"disable_feed_token"` + DisableOverridingApproversPerMergeRequest bool `json:"disable_overriding_approvers_per_merge_request"` + DisabledOauthSignInSources []string `json:"disabled_oauth_sign_in_sources"` + DomainAllowlist []string `json:"domain_allowlist"` + DomainDenylist []string `json:"domain_denylist"` + DomainDenylistEnabled bool `json:"domain_denylist_enabled"` + ECDSAKeyRestriction int `json:"ecdsa_key_restriction"` + ECDSASKKeyRestriction int `json:"ecdsa_sk_key_restriction"` + EKSAccessKeyID string `json:"eks_access_key_id"` + EKSAccountID string `json:"eks_account_id"` + EKSIntegrationEnabled bool `json:"eks_integration_enabled"` + EKSSecretAccessKey string `json:"eks_secret_access_key"` + Ed25519KeyRestriction int `json:"ed25519_key_restriction"` + Ed25519SKKeyRestriction int `json:"ed25519_sk_key_restriction"` + ElasticsearchAWS bool `json:"elasticsearch_aws"` + ElasticsearchAWSAccessKey string `json:"elasticsearch_aws_access_key"` + ElasticsearchAWSRegion string `json:"elasticsearch_aws_region"` + ElasticsearchAWSSecretAccessKey string `json:"elasticsearch_aws_secret_access_key"` + ElasticsearchAnalyzersKuromojiEnabled bool `json:"elasticsearch_analyzers_kuromoji_enabled"` + ElasticsearchAnalyzersKuromojiSearch bool `json:"elasticsearch_analyzers_kuromoji_search"` + ElasticsearchAnalyzersSmartCNEnabled bool `json:"elasticsearch_analyzers_smartcn_enabled"` + ElasticsearchAnalyzersSmartCNSearch bool `json:"elasticsearch_analyzers_smartcn_search"` + ElasticsearchClientRequestTimeout int `json:"elasticsearch_client_request_timeout"` + ElasticsearchIndexedFieldLengthLimit int `json:"elasticsearch_indexed_field_length_limit"` + ElasticsearchIndexedFileSizeLimitKB int `json:"elasticsearch_indexed_file_size_limit_kb"` + ElasticsearchIndexing bool `json:"elasticsearch_indexing"` + ElasticsearchLimitIndexing bool `json:"elasticsearch_limit_indexing"` + ElasticsearchMaxBulkConcurrency int `json:"elasticsearch_max_bulk_concurrency"` + ElasticsearchMaxBulkSizeMB int `json:"elasticsearch_max_bulk_size_mb"` + ElasticsearchNamespaceIDs []int `json:"elasticsearch_namespace_ids"` + ElasticsearchPassword string `json:"elasticsearch_password"` + ElasticsearchPauseIndexing bool `json:"elasticsearch_pause_indexing"` + ElasticsearchProjectIDs []int `json:"elasticsearch_project_ids"` + ElasticsearchReplicas int `json:"elasticsearch_replicas"` + ElasticsearchSearch bool `json:"elasticsearch_search"` + ElasticsearchShards int `json:"elasticsearch_shards"` + ElasticsearchURL []string `json:"elasticsearch_url"` + ElasticsearchUsername string `json:"elasticsearch_username"` + EmailAdditionalText string `json:"email_additional_text"` + EmailAuthorInBody bool `json:"email_author_in_body"` + EmailRestrictions string `json:"email_restrictions"` + EmailRestrictionsEnabled bool `json:"email_restrictions_enabled"` + EnabledGitAccessProtocol string `json:"enabled_git_access_protocol"` + EnforceNamespaceStorageLimit bool `json:"enforce_namespace_storage_limit"` + EnforcePATExpiration bool `json:"enforce_pat_expiration"` + EnforceSSHKeyExpiration bool `json:"enforce_ssh_key_expiration"` + EnforceTerms bool `json:"enforce_terms"` + ExternalAuthClientCert string `json:"external_auth_client_cert"` + ExternalAuthClientKey string `json:"external_auth_client_key"` + ExternalAuthClientKeyPass string `json:"external_auth_client_key_pass"` + ExternalAuthorizationServiceDefaultLabel string `json:"external_authorization_service_default_label"` + ExternalAuthorizationServiceEnabled bool `json:"external_authorization_service_enabled"` + ExternalAuthorizationServiceTimeout float64 `json:"external_authorization_service_timeout"` + ExternalAuthorizationServiceURL string `json:"external_authorization_service_url"` + ExternalPipelineValidationServiceTimeout int `json:"external_pipeline_validation_service_timeout"` + ExternalPipelineValidationServiceToken string `json:"external_pipeline_validation_service_token"` + ExternalPipelineValidationServiceURL string `json:"external_pipeline_validation_service_url"` + FileTemplateProjectID int `json:"file_template_project_id"` + FirstDayOfWeek int `json:"first_day_of_week"` + FlocEnabled bool `json:"floc_enabled"` + GeoNodeAllowedIPs string `json:"geo_node_allowed_ips"` + GeoStatusTimeout int `json:"geo_status_timeout"` + GitTwoFactorSessionExpiry int `json:"git_two_factor_session_expiry"` + GitalyTimeoutDefault int `json:"gitaly_timeout_default"` + GitalyTimeoutFast int `json:"gitaly_timeout_fast"` + GitalyTimeoutMedium int `json:"gitaly_timeout_medium"` + GitpodEnabled bool `json:"gitpod_enabled"` + GitpodURL string `json:"gitpod_url"` + GitRateLimitUsersAllowlist []string `json:"git_rate_limit_users_allowlist"` + GrafanaEnabled bool `json:"grafana_enabled"` + GrafanaURL string `json:"grafana_url"` + GravatarEnabled bool `json:"gravatar_enabled"` + GroupDownloadExportLimit int `json:"group_download_export_limit"` + GroupExportLimit int `json:"group_export_limit"` + GroupImportLimit int `json:"group_import_limit"` + GroupOwnersCanManageDefaultBranchProtection bool `json:"group_owners_can_manage_default_branch_protection"` + GroupRunnerTokenExpirationInterval int `json:"group_runner_token_expiration_interval"` + HTMLEmailsEnabled bool `json:"html_emails_enabled"` + HashedStorageEnabled bool `json:"hashed_storage_enabled"` + HelpPageDocumentationBaseURL string `json:"help_page_documentation_base_url"` + HelpPageHideCommercialContent bool `json:"help_page_hide_commercial_content"` + HelpPageSupportURL string `json:"help_page_support_url"` + HelpPageText string `json:"help_page_text"` + HelpText string `json:"help_text"` + HideThirdPartyOffers bool `json:"hide_third_party_offers"` + HomePageURL string `json:"home_page_url"` + HousekeepingBitmapsEnabled bool `json:"housekeeping_bitmaps_enabled"` + HousekeepingEnabled bool `json:"housekeeping_enabled"` + HousekeepingFullRepackPeriod int `json:"housekeeping_full_repack_period"` + HousekeepingGcPeriod int `json:"housekeeping_gc_period"` + HousekeepingIncrementalRepackPeriod int `json:"housekeeping_incremental_repack_period"` + ImportSources []string `json:"import_sources"` + InactiveProjectsDeleteAfterMonths int `json:"inactive_projects_delete_after_months"` + InactiveProjectsMinSizeMB int `json:"inactive_projects_min_size_mb"` + InactiveProjectsSendWarningEmailAfterMonths int `json:"inactive_projects_send_warning_email_after_months"` + InProductMarketingEmailsEnabled bool `json:"in_product_marketing_emails_enabled"` + InvisibleCaptchaEnabled bool `json:"invisible_captcha_enabled"` + IssuesCreateLimit int `json:"issues_create_limit"` + KeepLatestArtifact bool `json:"keep_latest_artifact"` + KrokiEnabled bool `json:"kroki_enabled"` + KrokiFormats map[string]bool `json:"kroki_formats"` + KrokiURL string `json:"kroki_url"` + LocalMarkdownVersion int `json:"local_markdown_version"` + LockMembershipsToLDAP bool `json:"lock_memberships_to_ldap"` + LoginRecaptchaProtectionEnabled bool `json:"login_recaptcha_protection_enabled"` + MailgunEventsEnabled bool `json:"mailgun_events_enabled"` + MailgunSigningKey string `json:"mailgun_signing_key"` + MaintenanceMode bool `json:"maintenance_mode"` + MaintenanceModeMessage string `json:"maintenance_mode_message"` + MaxArtifactsSize int `json:"max_artifacts_size"` + MaxAttachmentSize int `json:"max_attachment_size"` + MaxExportSize int `json:"max_export_size"` + MaxImportSize int `json:"max_import_size"` + MaxNumberOfRepositoryDownloads int `json:"max_number_of_repository_downloads"` + MaxNumberOfRepositoryDownloadsWithinTimePeriod int `json:"max_number_of_repository_downloads_within_time_period"` + MaxPagesSize int `json:"max_pages_size"` + MaxPersonalAccessTokenLifetime int `json:"max_personal_access_token_lifetime"` + MaxSSHKeyLifetime int `json:"max_ssh_key_lifetime"` + MaxYAMLDepth int `json:"max_yaml_depth"` + MaxYAMLSizeBytes int `json:"max_yaml_size_bytes"` + MetricsMethodCallThreshold int `json:"metrics_method_call_threshold"` + MinimumPasswordLength int `json:"minimum_password_length"` + MirrorAvailable bool `json:"mirror_available"` + MirrorCapacityThreshold int `json:"mirror_capacity_threshold"` + MirrorMaxCapacity int `json:"mirror_max_capacity"` + MirrorMaxDelay int `json:"mirror_max_delay"` + NPMPackageRequestsForwarding bool `json:"npm_package_requests_forwarding"` + NotesCreateLimit int `json:"notes_create_limit"` + NotifyOnUnknownSignIn bool `json:"notify_on_unknown_sign_in"` + OutboundLocalRequestsAllowlistRaw string `json:"outbound_local_requests_allowlist_raw"` + OutboundLocalRequestsWhitelist []string `json:"outbound_local_requests_whitelist"` + PackageRegistryCleanupPoliciesWorkerCapacity int `json:"package_registry_cleanup_policies_worker_capacity"` + PagesDomainVerificationEnabled bool `json:"pages_domain_verification_enabled"` + PasswordAuthenticationEnabledForGit bool `json:"password_authentication_enabled_for_git"` + PasswordAuthenticationEnabledForWeb bool `json:"password_authentication_enabled_for_web"` + PasswordNumberRequired bool `json:"password_number_required"` + PasswordSymbolRequired bool `json:"password_symbol_required"` + PasswordUppercaseRequired bool `json:"password_uppercase_required"` + PasswordLowercaseRequired bool `json:"password_lowercase_required"` + PerformanceBarAllowedGroupID string `json:"performance_bar_allowed_group_id"` + PerformanceBarAllowedGroupPath string `json:"performance_bar_allowed_group_path"` + PerformanceBarEnabled bool `json:"performance_bar_enabled"` + PersonalAccessTokenPrefix string `json:"personal_access_token_prefix"` + PipelineLimitPerProjectUserSha int `json:"pipeline_limit_per_project_user_sha"` + PlantumlEnabled bool `json:"plantuml_enabled"` + PlantumlURL string `json:"plantuml_url"` + PollingIntervalMultiplier float64 `json:"polling_interval_multiplier,string"` + PreventMergeRequestsAuthorApproval bool `json:"prevent_merge_request_author_approval"` + PreventMergeRequestsCommittersApproval bool `json:"prevent_merge_request_committers_approval"` + ProjectDownloadExportLimit int `json:"project_download_export_limit"` + ProjectExportEnabled bool `json:"project_export_enabled"` + ProjectExportLimit int `json:"project_export_limit"` + ProjectImportLimit int `json:"project_import_limit"` + ProjectRunnerTokenExpirationInterval int `json:"project_runner_token_expiration_interval"` + PrometheusMetricsEnabled bool `json:"prometheus_metrics_enabled"` + ProtectedCIVariables bool `json:"protected_ci_variables"` + PseudonymizerEnabled bool `json:"pseudonymizer_enabled"` + PushEventActivitiesLimit int `json:"push_event_activities_limit"` + PushEventHooksLimit int `json:"push_event_hooks_limit"` + PyPIPackageRequestsForwarding bool `json:"pypi_package_requests_forwarding"` + RSAKeyRestriction int `json:"rsa_key_restriction"` + RateLimitingResponseText string `json:"rate_limiting_response_text"` + RawBlobRequestLimit int `json:"raw_blob_request_limit"` + RecaptchaEnabled bool `json:"recaptcha_enabled"` + RecaptchaPrivateKey string `json:"recaptcha_private_key"` + RecaptchaSiteKey string `json:"recaptcha_site_key"` + ReceiveMaxInputSize int `json:"receive_max_input_size"` + RepositoryChecksEnabled bool `json:"repository_checks_enabled"` + RepositorySizeLimit int `json:"repository_size_limit"` + RepositoryStorages []string `json:"repository_storages"` + RepositoryStoragesWeighted map[string]int `json:"repository_storages_weighted"` + RequireAdminApprovalAfterUserSignup bool `json:"require_admin_approval_after_user_signup"` + RequireTwoFactorAuthentication bool `json:"require_two_factor_authentication"` + RestrictedVisibilityLevels []VisibilityValue `json:"restricted_visibility_levels"` + RunnerTokenExpirationInterval int `json:"runner_token_expiration_interval"` + SearchRateLimit int `json:"search_rate_limit"` + SearchRateLimitUnauthenticated int `json:"search_rate_limit_unauthenticated"` + SecretDetectionRevocationTokenTypesURL string `json:"secret_detection_revocation_token_types_url"` + SecretDetectionTokenRevocationEnabled bool `json:"secret_detection_token_revocation_enabled"` + SecretDetectionTokenRevocationToken string `json:"secret_detection_token_revocation_token"` + SecretDetectionTokenRevocationURL string `json:"secret_detection_token_revocation_url"` + SendUserConfirmationEmail bool `json:"send_user_confirmation_email"` + SentryClientsideDSN string `json:"sentry_clientside_dsn"` + SentryDSN string `json:"sentry_dsn"` + SentryEnabled bool `json:"sentry_enabled"` + SentryEnvironment string `json:"sentry_environment"` + SessionExpireDelay int `json:"session_expire_delay"` + SharedRunnersEnabled bool `json:"shared_runners_enabled"` + SharedRunnersMinutes int `json:"shared_runners_minutes"` + SharedRunnersText string `json:"shared_runners_text"` + SidekiqJobLimiterCompressionThresholdBytes int `json:"sidekiq_job_limiter_compression_threshold_bytes"` + SidekiqJobLimiterLimitBytes int `json:"sidekiq_job_limiter_limit_bytes"` + SidekiqJobLimiterMode string `json:"sidekiq_job_limiter_mode"` + SignInText string `json:"sign_in_text"` + SignupEnabled bool `json:"signup_enabled"` + SlackAppEnabled bool `json:"slack_app_enabled"` + SlackAppID string `json:"slack_app_id"` + SlackAppSecret string `json:"slack_app_secret"` + SlackAppSigningSecret string `json:"slack_app_signing_secret"` + SlackAppVerificationToken string `json:"slack_app_verification_token"` + SnippetSizeLimit int `json:"snippet_size_limit"` + SnowplowAppID string `json:"snowplow_app_id"` + SnowplowCollectorHostname string `json:"snowplow_collector_hostname"` + SnowplowCookieDomain string `json:"snowplow_cookie_domain"` + SnowplowEnabled bool `json:"snowplow_enabled"` + SourcegraphEnabled bool `json:"sourcegraph_enabled"` + SourcegraphPublicOnly bool `json:"sourcegraph_public_only"` + SourcegraphURL string `json:"sourcegraph_url"` + SpamCheckAPIKey string `json:"spam_check_api_key"` + SpamCheckEndpointEnabled bool `json:"spam_check_endpoint_enabled"` + SpamCheckEndpointURL string `json:"spam_check_endpoint_url"` + SuggestPipelineEnabled bool `json:"suggest_pipeline_enabled"` + TerminalMaxSessionTime int `json:"terminal_max_session_time"` + Terms string `json:"terms"` + ThrottleAuthenticatedAPIEnabled bool `json:"throttle_authenticated_api_enabled"` + ThrottleAuthenticatedAPIPeriodInSeconds int `json:"throttle_authenticated_api_period_in_seconds"` + ThrottleAuthenticatedAPIRequestsPerPeriod int `json:"throttle_authenticated_api_requests_per_period"` + ThrottleAuthenticatedDeprecatedAPIEnabled bool `json:"throttle_authenticated_deprecated_api_enabled"` + ThrottleAuthenticatedDeprecatedAPIPeriodInSeconds int `json:"throttle_authenticated_deprecated_api_period_in_seconds"` + ThrottleAuthenticatedDeprecatedAPIRequestsPerPeriod int `json:"throttle_authenticated_deprecated_api_requests_per_period"` + ThrottleAuthenticatedFilesAPIEnabled bool `json:"throttle_authenticated_files_api_enabled"` + ThrottleAuthenticatedFilesAPIPeriodInSeconds int `json:"throttle_authenticated_files_api_period_in_seconds"` + ThrottleAuthenticatedFilesAPIRequestsPerPeriod int `json:"throttle_authenticated_files_api_requests_per_period"` + ThrottleAuthenticatedGitLFSEnabled bool `json:"throttle_authenticated_git_lfs_enabled"` + ThrottleAuthenticatedGitLFSPeriodInSeconds int `json:"throttle_authenticated_git_lfs_period_in_seconds"` + ThrottleAuthenticatedGitLFSRequestsPerPeriod int `json:"throttle_authenticated_git_lfs_requests_per_period"` + ThrottleAuthenticatedPackagesAPIEnabled bool `json:"throttle_authenticated_packages_api_enabled"` + ThrottleAuthenticatedPackagesAPIPeriodInSeconds int `json:"throttle_authenticated_packages_api_period_in_seconds"` + ThrottleAuthenticatedPackagesAPIRequestsPerPeriod int `json:"throttle_authenticated_packages_api_requests_per_period"` + ThrottleAuthenticatedWebEnabled bool `json:"throttle_authenticated_web_enabled"` + ThrottleAuthenticatedWebPeriodInSeconds int `json:"throttle_authenticated_web_period_in_seconds"` + ThrottleAuthenticatedWebRequestsPerPeriod int `json:"throttle_authenticated_web_requests_per_period"` + ThrottleIncidentManagementNotificationEnabled bool `json:"throttle_incident_management_notification_enabled"` + ThrottleIncidentManagementNotificationPerPeriod int `json:"throttle_incident_management_notification_per_period"` + ThrottleIncidentManagementNotificationPeriodInSeconds int `json:"throttle_incident_management_notification_period_in_seconds"` + ThrottleProtectedPathsEnabled bool `json:"throttle_protected_paths_enabled"` + ThrottleProtectedPathsPeriodInSeconds int `json:"throttle_protected_paths_period_in_seconds"` + ThrottleProtectedPathsRequestsPerPeriod int `json:"throttle_protected_paths_requests_per_period"` + ThrottleUnauthenticatedAPIEnabled bool `json:"throttle_unauthenticated_api_enabled"` + ThrottleUnauthenticatedAPIPeriodInSeconds int `json:"throttle_unauthenticated_api_period_in_seconds"` + ThrottleUnauthenticatedAPIRequestsPerPeriod int `json:"throttle_unauthenticated_api_requests_per_period"` + ThrottleUnauthenticatedDeprecatedAPIEnabled bool `json:"throttle_unauthenticated_deprecated_api_enabled"` + ThrottleUnauthenticatedDeprecatedAPIPeriodInSeconds int `json:"throttle_unauthenticated_deprecated_api_period_in_seconds"` + ThrottleUnauthenticatedDeprecatedAPIRequestsPerPeriod int `json:"throttle_unauthenticated_deprecated_api_requests_per_period"` + ThrottleUnauthenticatedFilesAPIEnabled bool `json:"throttle_unauthenticated_files_api_enabled"` + ThrottleUnauthenticatedFilesAPIPeriodInSeconds int `json:"throttle_unauthenticated_files_api_period_in_seconds"` + ThrottleUnauthenticatedFilesAPIRequestsPerPeriod int `json:"throttle_unauthenticated_files_api_requests_per_period"` + ThrottleUnauthenticatedGitLFSEnabled bool `json:"throttle_unauthenticated_git_lfs_enabled"` + ThrottleUnauthenticatedGitLFSPeriodInSeconds int `json:"throttle_unauthenticated_git_lfs_period_in_seconds"` + ThrottleUnauthenticatedGitLFSRequestsPerPeriod int `json:"throttle_unauthenticated_git_lfs_requests_per_period"` + ThrottleUnauthenticatedPackagesAPIEnabled bool `json:"throttle_unauthenticated_packages_api_enabled"` + ThrottleUnauthenticatedPackagesAPIPeriodInSeconds int `json:"throttle_unauthenticated_packages_api_period_in_seconds"` + ThrottleUnauthenticatedPackagesAPIRequestsPerPeriod int `json:"throttle_unauthenticated_packages_api_requests_per_period"` + ThrottleUnauthenticatedWebEnabled bool `json:"throttle_unauthenticated_web_enabled"` + ThrottleUnauthenticatedWebPeriodInSeconds int `json:"throttle_unauthenticated_web_period_in_seconds"` + ThrottleUnauthenticatedWebRequestsPerPeriod int `json:"throttle_unauthenticated_web_requests_per_period"` + TimeTrackingLimitToHours bool `json:"time_tracking_limit_to_hours"` + TwoFactorGracePeriod int `json:"two_factor_grace_period"` + UniqueIPsLimitEnabled bool `json:"unique_ips_limit_enabled"` + UniqueIPsLimitPerUser int `json:"unique_ips_limit_per_user"` + UniqueIPsLimitTimeWindow int `json:"unique_ips_limit_time_window"` + UpdatedAt *time.Time `json:"updated_at"` + UpdatingNameDisabledForUsers bool `json:"updating_name_disabled_for_users"` + UsagePingEnabled bool `json:"usage_ping_enabled"` + UsagePingFeaturesEnabled bool `json:"usage_ping_features_enabled"` + UserDeactivationEmailsEnabled bool `json:"user_deactivation_emails_enabled"` + UserDefaultExternal bool `json:"user_default_external"` + UserDefaultInternalRegex string `json:"user_default_internal_regex"` + UserOauthApplications bool `json:"user_oauth_applications"` + UserShowAddSSHKeyMessage bool `json:"user_show_add_ssh_key_message"` + UsersGetByIDLimit int `json:"users_get_by_id_limit"` + UsersGetByIDLimitAllowlistRaw string `json:"users_get_by_id_limit_allowlist_raw"` + VersionCheckEnabled bool `json:"version_check_enabled"` + WebIDEClientsidePreviewEnabled bool `json:"web_ide_clientside_preview_enabled"` + WhatsNewVariant string `json:"whats_new_variant"` + WikiPageMaxContentBytes int `json:"wiki_page_max_content_bytes"` + + // Deprecated: Use AbuseNotificationEmail instead. + AdminNotificationEmail string `json:"admin_notification_email"` + // Deprecated: Use AllowLocalRequestsFromWebHooksAndServices instead. + AllowLocalRequestsFromHooksAndServices bool `json:"allow_local_requests_from_hooks_and_services"` + // Deprecated: Use AssetProxyAllowlist instead. + AssetProxyWhitelist []string `json:"asset_proxy_whitelist"` + // Deprecated: Use ThrottleUnauthenticatedWebEnabled or ThrottleUnauthenticatedAPIEnabled instead. (Deprecated in GitLab 14.3) + ThrottleUnauthenticatedEnabled bool `json:"throttle_unauthenticated_enabled"` + // Deprecated: Use ThrottleUnauthenticatedWebPeriodInSeconds or ThrottleUnauthenticatedAPIPeriodInSeconds instead. (Deprecated in GitLab 14.3) + ThrottleUnauthenticatedPeriodInSeconds int `json:"throttle_unauthenticated_period_in_seconds"` + // Deprecated: Use ThrottleUnauthenticatedWebRequestsPerPeriod or ThrottleUnauthenticatedAPIRequestsPerPeriod instead. (Deprecated in GitLab 14.3) + ThrottleUnauthenticatedRequestsPerPeriod int `json:"throttle_unauthenticated_requests_per_period"` + // Deprecated: Replaced by SearchRateLimit in GitLab 14.9 (removed in 15.0). + UserEmailLookupLimit int `json:"user_email_lookup_limit"` +} + +func (s Settings) String() string { + return Stringify(s) +} + +// GetSettings gets the current application settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/settings.html#get-current-application-settings +func (s *SettingsService) GetSettings(options ...RequestOptionFunc) (*Settings, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "application/settings", nil, options) + if err != nil { + return nil, nil, err + } + + as := new(Settings) + resp, err := s.client.Do(req, as) + if err != nil { + return nil, resp, err + } + + return as, resp, err +} + +// UpdateSettingsOptions represents the available UpdateSettings() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/settings.html#change-application-settings +type UpdateSettingsOptions struct { + AbuseNotificationEmail *string `url:"abuse_notification_email,omitempty" json:"abuse_notification_email,omitempty"` + AdminMode *bool `url:"admin_mode,omitempty" json:"admin_mode,omitempty"` + AdminNotificationEmail *string `url:"admin_notification_email,omitempty" json:"admin_notification_email,omitempty"` + AfterSignOutPath *string `url:"after_sign_out_path,omitempty" json:"after_sign_out_path,omitempty"` + AfterSignUpText *string `url:"after_sign_up_text,omitempty" json:"after_sign_up_text,omitempty"` + AkismetAPIKey *string `url:"akismet_api_key,omitempty" json:"akismet_api_key,omitempty"` + AkismetEnabled *bool `url:"akismet_enabled,omitempty" json:"akismet_enabled,omitempty"` + AllowGroupOwnersToManageLDAP *bool `url:"allow_group_owners_to_manage_ldap,omitempty" json:"allow_group_owners_to_manage_ldap,omitempty"` + AllowLocalRequestsFromHooksAndServices *bool `url:"allow_local_requests_from_hooks_and_services,omitempty" json:"allow_local_requests_from_hooks_and_services,omitempty"` + AllowLocalRequestsFromSystemHooks *bool `url:"allow_local_requests_from_system_hooks,omitempty" json:"allow_local_requests_from_system_hooks,omitempty"` + AllowLocalRequestsFromWebHooksAndServices *bool `url:"allow_local_requests_from_web_hooks_and_services,omitempty" json:"allow_local_requests_from_web_hooks_and_services,omitempty"` + ArchiveBuildsInHumanReadable *string `url:"archive_builds_in_human_readable,omitempty" json:"archive_builds_in_human_readable,omitempty"` + AssetProxyAllowlist *[]string `url:"asset_proxy_allowlist,omitempty" json:"asset_proxy_allowlist,omitempty"` + AssetProxyEnabled *bool `url:"asset_proxy_enabled,omitempty" json:"asset_proxy_enabled,omitempty"` + AssetProxySecretKey *string `url:"asset_proxy_secret_key,omitempty" json:"asset_proxy_secret_key,omitempty"` + AssetProxyURL *string `url:"asset_proxy_url,omitempty" json:"asset_proxy_url,omitempty"` + AssetProxyWhitelist *[]string `url:"asset_proxy_whitelist,omitempty" json:"asset_proxy_whitelist,omitempty"` + AuthorizedKeysEnabled *bool `url:"authorized_keys_enabled,omitempty" json:"authorized_keys_enabled,omitempty"` + AutoDevOpsDomain *string `url:"auto_devops_domain,omitempty" json:"auto_devops_domain,omitempty"` + AutoDevOpsEnabled *bool `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"` + AutomaticPurchasedStorageAllocation *bool `url:"automatic_purchased_storage_allocation,omitempty" json:"automatic_purchased_storage_allocation,omitempty"` + CanCreateGroup *bool `url:"can_create_group,omitempty" json:"can_create_group,omitempty"` + CheckNamespacePlan *bool `url:"check_namespace_plan,omitempty" json:"check_namespace_plan,omitempty"` + CommitEmailHostname *string `url:"commit_email_hostname,omitempty" json:"commit_email_hostname,omitempty"` + ContainerExpirationPoliciesEnableHistoricEntries *bool `url:"container_expiration_policies_enable_historic_entries,omitempty" json:"container_expiration_policies_enable_historic_entries,omitempty"` + ContainerRegistryCleanupTagsServiceMaxListSize *int `url:"container_registry_cleanup_tags_service_max_list_size,omitempty" json:"container_registry_cleanup_tags_service_max_list_size,omitempty"` + ContainerRegistryDeleteTagsServiceTimeout *int `url:"container_registry_delete_tags_service_timeout,omitempty" json:"container_registry_delete_tags_service_timeout,omitempty"` + ContainerRegistryExpirationPoliciesCaching *bool `url:"container_registry_expiration_policies_caching,omitempty" json:"container_registry_expiration_policies_caching,omitempty"` + ContainerRegistryExpirationPoliciesWorkerCapacity *int `url:"container_registry_expiration_policies_worker_capacity,omitempty" json:"container_registry_expiration_policies_worker_capacity,omitempty"` + ContainerRegistryImportCreatedBefore *time.Time `url:"container_registry_import_created_before,omitempty" json:"container_registry_import_created_before,omitempty"` + ContainerRegistryImportMaxRetries *int `url:"container_registry_import_max_retries,omitempty" json:"container_registry_import_max_retries,omitempty"` + ContainerRegistryImportMaxStepDuration *int `url:"container_registry_import_max_step_duration,omitempty" json:"container_registry_import_max_step_duration,omitempty"` + ContainerRegistryImportMaxTagsCount *int `url:"container_registry_import_max_tags_count,omitempty" json:"container_registry_import_max_tags_count,omitempty"` + ContainerRegistryImportStartMaxRetries *int `url:"container_registry_import_start_max_retries,omitempty" json:"container_registry_import_start_max_retries,omitempty"` + ContainerRegistryImportTargetPlan *string `url:"container_registry_import_target_plan,omitempty" json:"container_registry_import_target_plan,omitempty"` + ContainerRegistryTokenExpireDelay *int `url:"container_registry_token_expire_delay,omitempty" json:"container_registry_token_expire_delay,omitempty"` + CustomHTTPCloneURLRoot *string `url:"custom_http_clone_url_root,omitempty" json:"custom_http_clone_url_root,omitempty"` + DNSRebindingProtectionEnabled *bool `url:"dns_rebinding_protection_enabled,omitempty" json:"dns_rebinding_protection_enabled,omitempty"` + DSAKeyRestriction *int `url:"dsa_key_restriction,omitempty" json:"dsa_key_restriction,omitempty"` + DeactivateDormantUsers *bool `url:"deactivate_dormant_users,omitempty" json:"deactivate_dormant_users,omitempty"` + DefaultArtifactsExpireIn *string `url:"default_artifacts_expire_in,omitempty" json:"default_artifacts_expire_in,omitempty"` + DefaultBranchName *string `url:"default_branch_name,omitempty" json:"default_branch_name,omitempty"` + DefaultBranchProtection *int `url:"default_branch_protection,omitempty" json:"default_branch_protection,omitempty"` + DefaultCiConfigPath *string `url:"default_ci_config_path,omitempty" json:"default_ci_config_path,omitempty"` + DefaultGroupVisibility *VisibilityValue `url:"default_group_visibility,omitempty" json:"default_group_visibility,omitempty"` + DefaultProjectCreation *int `url:"default_project_creation,omitempty" json:"default_project_creation,omitempty"` + DefaultProjectDeletionProtection *bool `url:"default_project_deletion_protection,omitempty" json:"default_project_deletion_protection,omitempty"` + DefaultProjectVisibility *VisibilityValue `url:"default_project_visibility,omitempty" json:"default_project_visibility,omitempty"` + DefaultProjectsLimit *int `url:"default_projects_limit,omitempty" json:"default_projects_limit,omitempty"` + DefaultSnippetVisibility *VisibilityValue `url:"default_snippet_visibility,omitempty" json:"default_snippet_visibility,omitempty"` + DelayedGroupDeletion *bool `url:"delayed_group_deletion,omitempty" json:"delayed_group_deletion,omitempty"` + DelayedProjectDeletion *bool `url:"delayed_project_deletion,omitempty" json:"delayed_project_deletion,omitempty"` + DeleteInactiveProjects *bool `url:"delete_inactive_projects,omitempty" json:"delete_inactive_projects,omitempty"` + DeletionAdjournedPeriod *int `url:"deletion_adjourned_period,omitempty" json:"deletion_adjourned_period,omitempty"` + DiffMaxFiles *int `url:"diff_max_files,omitempty" json:"diff_max_files,omitempty"` + DiffMaxLines *int `url:"diff_max_lines,omitempty" json:"diff_max_lines,omitempty"` + DiffMaxPatchBytes *int `url:"diff_max_patch_bytes,omitempty" json:"diff_max_patch_bytes,omitempty"` + DisableFeedToken *bool `url:"disable_feed_token,omitempty" json:"disable_feed_token,omitempty"` + DisableOverridingApproversPerMergeRequest *bool `url:"disable_overriding_approvers_per_merge_request,omitempty" json:"disable_overriding_approvers_per_merge_request,omitempty"` + DisabledOauthSignInSources *[]string `url:"disabled_oauth_sign_in_sources,omitempty" json:"disabled_oauth_sign_in_sources,omitempty"` + DomainAllowlist *[]string `url:"domain_allowlist,omitempty" json:"domain_allowlist,omitempty"` + DomainDenylist *[]string `url:"domain_denylist,omitempty" json:"domain_denylist,omitempty"` + DomainDenylistEnabled *bool `url:"domain_denylist_enabled,omitempty" json:"domain_denylist_enabled,omitempty"` + ECDSAKeyRestriction *int `url:"ecdsa_key_restriction,omitempty" json:"ecdsa_key_restriction,omitempty"` + ECDSASKKeyRestriction *int `url:"ecdsa_sk_key_restriction,omitempty" json:"ecdsa_sk_key_restriction,omitempty"` + EKSAccessKeyID *string `url:"eks_access_key_id,omitempty" json:"eks_access_key_id,omitempty"` + EKSAccountID *string `url:"eks_account_id,omitempty" json:"eks_account_id,omitempty"` + EKSIntegrationEnabled *bool `url:"eks_integration_enabled,omitempty" json:"eks_integration_enabled,omitempty"` + EKSSecretAccessKey *string `url:"eks_secret_access_key,omitempty" json:"eks_secret_access_key,omitempty"` + Ed25519KeyRestriction *int `url:"ed25519_key_restriction,omitempty" json:"ed25519_key_restriction,omitempty"` + Ed25519SKKeyRestriction *int `url:"ed25519_sk_key_restriction,omitempty" json:"ed25519_sk_key_restriction,omitempty"` + ElasticsearchAWS *bool `url:"elasticsearch_aws,omitempty" json:"elasticsearch_aws,omitempty"` + ElasticsearchAWSAccessKey *string `url:"elasticsearch_aws_access_key,omitempty" json:"elasticsearch_aws_access_key,omitempty"` + ElasticsearchAWSRegion *string `url:"elasticsearch_aws_region,omitempty" json:"elasticsearch_aws_region,omitempty"` + ElasticsearchAWSSecretAccessKey *string `url:"elasticsearch_aws_secret_access_key,omitempty" json:"elasticsearch_aws_secret_access_key,omitempty"` + ElasticsearchAnalyzersKuromojiEnabled *bool `url:"elasticsearch_analyzers_kuromoji_enabled,omitempty" json:"elasticsearch_analyzers_kuromoji_enabled,omitempty"` + ElasticsearchAnalyzersKuromojiSearch *int `url:"elasticsearch_analyzers_kuromoji_search,omitempty" json:"elasticsearch_analyzers_kuromoji_search,omitempty"` + ElasticsearchAnalyzersSmartCNEnabled *bool `url:"elasticsearch_analyzers_smartcn_enabled,omitempty" json:"elasticsearch_analyzers_smartcn_enabled,omitempty"` + ElasticsearchAnalyzersSmartCNSearch *int `url:"elasticsearch_analyzers_smartcn_search,omitempty" json:"elasticsearch_analyzers_smartcn_search,omitempty"` + ElasticsearchClientRequestTimeout *int `url:"elasticsearch_client_request_timeout,omitempty" json:"elasticsearch_client_request_timeout,omitempty"` + ElasticsearchIndexedFieldLengthLimit *int `url:"elasticsearch_indexed_field_length_limit,omitempty" json:"elasticsearch_indexed_field_length_limit,omitempty"` + ElasticsearchIndexedFileSizeLimitKB *int `url:"elasticsearch_indexed_file_size_limit_kb,omitempty" json:"elasticsearch_indexed_file_size_limit_kb,omitempty"` + ElasticsearchIndexing *bool `url:"elasticsearch_indexing,omitempty" json:"elasticsearch_indexing,omitempty"` + ElasticsearchLimitIndexing *bool `url:"elasticsearch_limit_indexing,omitempty" json:"elasticsearch_limit_indexing,omitempty"` + ElasticsearchMaxBulkConcurrency *int `url:"elasticsearch_max_bulk_concurrency,omitempty" json:"elasticsearch_max_bulk_concurrency,omitempty"` + ElasticsearchMaxBulkSizeMB *int `url:"elasticsearch_max_bulk_size_mb,omitempty" json:"elasticsearch_max_bulk_size_mb,omitempty"` + ElasticsearchNamespaceIDs *[]int `url:"elasticsearch_namespace_ids,omitempty" json:"elasticsearch_namespace_ids,omitempty"` + ElasticsearchPassword *string `url:"elasticsearch_password,omitempty" json:"elasticsearch_password,omitempty"` + ElasticsearchPauseIndexing *bool `url:"elasticsearch_pause_indexing,omitempty" json:"elasticsearch_pause_indexing,omitempty"` + ElasticsearchProjectIDs *[]int `url:"elasticsearch_project_ids,omitempty" json:"elasticsearch_project_ids,omitempty"` + ElasticsearchReplicas *int `url:"elasticsearch_replicas,omitempty" json:"elasticsearch_replicas,omitempty"` + ElasticsearchSearch *bool `url:"elasticsearch_search,omitempty" json:"elasticsearch_search,omitempty"` + ElasticsearchShards *int `url:"elasticsearch_shards,omitempty" json:"elasticsearch_shards,omitempty"` + ElasticsearchURL *string `url:"elasticsearch_url,omitempty" json:"elasticsearch_url,omitempty"` + ElasticsearchUsername *string `url:"elasticsearch_username,omitempty" json:"elasticsearch_username,omitempty"` + EmailAdditionalText *string `url:"email_additional_text,omitempty" json:"email_additional_text,omitempty"` + EmailAuthorInBody *bool `url:"email_author_in_body,omitempty" json:"email_author_in_body,omitempty"` + EmailRestrictions *string `url:"email_restrictions,omitempty" json:"email_restrictions,omitempty"` + EmailRestrictionsEnabled *bool `url:"email_restrictions_enabled,omitempty" json:"email_restrictions_enabled,omitempty"` + EnabledGitAccessProtocol *string `url:"enabled_git_access_protocol,omitempty" json:"enabled_git_access_protocol,omitempty"` + EnforceNamespaceStorageLimit *bool `url:"enforce_namespace_storage_limit,omitempty" json:"enforce_namespace_storage_limit,omitempty"` + EnforcePATExpiration *bool `url:"enforce_pat_expiration,omitempty" json:"enforce_pat_expiration,omitempty"` + EnforceSSHKeyExpiration *bool `url:"enforce_ssh_key_expiration,omitempty" json:"enforce_ssh_key_expiration,omitempty"` + EnforceTerms *bool `url:"enforce_terms,omitempty" json:"enforce_terms,omitempty"` + ExternalAuthClientCert *string `url:"external_auth_client_cert,omitempty" json:"external_auth_client_cert,omitempty"` + ExternalAuthClientKey *string `url:"external_auth_client_key,omitempty" json:"external_auth_client_key,omitempty"` + ExternalAuthClientKeyPass *string `url:"external_auth_client_key_pass,omitempty" json:"external_auth_client_key_pass,omitempty"` + ExternalAuthorizationServiceDefaultLabel *string `url:"external_authorization_service_default_label,omitempty" json:"external_authorization_service_default_label,omitempty"` + ExternalAuthorizationServiceEnabled *bool `url:"external_authorization_service_enabled,omitempty" json:"external_authorization_service_enabled,omitempty"` + ExternalAuthorizationServiceTimeout *float64 `url:"external_authorization_service_timeout,omitempty" json:"external_authorization_service_timeout,omitempty"` + ExternalAuthorizationServiceURL *string `url:"external_authorization_service_url,omitempty" json:"external_authorization_service_url,omitempty"` + ExternalPipelineValidationServiceTimeout *int `url:"external_pipeline_validation_service_timeout,omitempty" json:"external_pipeline_validation_service_timeout,omitempty"` + ExternalPipelineValidationServiceToken *string `url:"external_pipeline_validation_service_token,omitempty" json:"external_pipeline_validation_service_token,omitempty"` + ExternalPipelineValidationServiceURL *string `url:"external_pipeline_validation_service_url,omitempty" json:"external_pipeline_validation_service_url,omitempty"` + FileTemplateProjectID *int `url:"file_template_project_id,omitempty" json:"file_template_project_id,omitempty"` + FirstDayOfWeek *int `url:"first_day_of_week,omitempty" json:"first_day_of_week,omitempty"` + FlocEnabled *bool `url:"floc_enabled,omitempty" json:"floc_enabled,omitempty"` + GeoNodeAllowedIPs *string `url:"geo_node_allowed_ips,omitempty" json:"geo_node_allowed_ips,omitempty"` + GeoStatusTimeout *int `url:"geo_status_timeout,omitempty" json:"geo_status_timeout,omitempty"` + GitTwoFactorSessionExpiry *int `url:"git_two_factor_session_expiry,omitempty" json:"git_two_factor_session_expiry,omitempty"` + GitalyTimeoutDefault *int `url:"gitaly_timeout_default,omitempty" json:"gitaly_timeout_default,omitempty"` + GitalyTimeoutFast *int `url:"gitaly_timeout_fast,omitempty" json:"gitaly_timeout_fast,omitempty"` + GitalyTimeoutMedium *int `url:"gitaly_timeout_medium,omitempty" json:"gitaly_timeout_medium,omitempty"` + GitpodEnabled *bool `url:"gitpod_enabled,omitempty" json:"gitpod_enabled,omitempty"` + GitpodURL *string `url:"gitpod_url,omitempty" json:"gitpod_url,omitempty"` + GitRateLimitUsersAllowlist *[]string `url:"git_rate_limit_users_allowlist,omitempty" json:"git_rate_limit_users_allowlist,omitempty"` + GrafanaEnabled *bool `url:"grafana_enabled,omitempty" json:"grafana_enabled,omitempty"` + GrafanaURL *string `url:"grafana_url,omitempty" json:"grafana_url,omitempty"` + GravatarEnabled *bool `url:"gravatar_enabled,omitempty" json:"gravatar_enabled,omitempty"` + GroupDownloadExportLimit *int `url:"group_download_export_limit,omitempty" json:"group_download_export_limit,omitempty"` + GroupExportLimit *int `url:"group_export_limit,omitempty" json:"group_export_limit,omitempty"` + GroupImportLimit *int `url:"group_import_limit,omitempty" json:"group_import_limit,omitempty"` + GroupOwnersCanManageDefaultBranchProtection *bool `url:"group_owners_can_manage_default_branch_protection,omitempty" json:"group_owners_can_manage_default_branch_protection,omitempty"` + GroupRunnerTokenExpirationInterval *int `url:"group_runner_token_expiration_interval,omitempty" json:"group_runner_token_expiration_interval,omitempty"` + HTMLEmailsEnabled *bool `url:"html_emails_enabled,omitempty" json:"html_emails_enabled,omitempty"` + HashedStorageEnabled *bool `url:"hashed_storage_enabled,omitempty" json:"hashed_storage_enabled,omitempty"` + HelpPageDocumentationBaseURL *string `url:"help_page_documentation_base_url,omitempty" json:"help_page_documentation_base_url,omitempty"` + HelpPageHideCommercialContent *bool `url:"help_page_hide_commercial_content,omitempty" json:"help_page_hide_commercial_content,omitempty"` + HelpPageSupportURL *string `url:"help_page_support_url,omitempty" json:"help_page_support_url,omitempty"` + HelpPageText *string `url:"help_page_text,omitempty" json:"help_page_text,omitempty"` + HelpText *string `url:"help_text,omitempty" json:"help_text,omitempty"` + HideThirdPartyOffers *bool `url:"hide_third_party_offers,omitempty" json:"hide_third_party_offers,omitempty"` + HomePageURL *string `url:"home_page_url,omitempty" json:"home_page_url,omitempty"` + HousekeepingBitmapsEnabled *bool `url:"housekeeping_bitmaps_enabled,omitempty" json:"housekeeping_bitmaps_enabled,omitempty"` + HousekeepingEnabled *bool `url:"housekeeping_enabled,omitempty" json:"housekeeping_enabled,omitempty"` + HousekeepingFullRepackPeriod *int `url:"housekeeping_full_repack_period,omitempty" json:"housekeeping_full_repack_period,omitempty"` + HousekeepingGcPeriod *int `url:"housekeeping_gc_period,omitempty" json:"housekeeping_gc_period,omitempty"` + HousekeepingIncrementalRepackPeriod *int `url:"housekeeping_incremental_repack_period,omitempty" json:"housekeeping_incremental_repack_period,omitempty"` + ImportSources *[]string `url:"import_sources,omitempty" json:"import_sources,omitempty"` + InactiveProjectsDeleteAfterMonths *int `url:"inactive_projects_delete_after_months,omitempty" json:"inactive_projects_delete_after_months,omitempty"` + InactiveProjectsMinSizeMB *int `url:"inactive_projects_min_size_mb,omitempty" json:"inactive_projects_min_size_mb,omitempty"` + InactiveProjectsSendWarningEmailAfterMonths *int `url:"inactive_projects_send_warning_email_after_months,omitempty" json:"inactive_projects_send_warning_email_after_months,omitempty"` + InProductMarketingEmailsEnabled *bool `url:"in_product_marketing_emails_enabled,omitempty" json:"in_product_marketing_emails_enabled,omitempty"` + InvisibleCaptchaEnabled *bool `url:"invisible_captcha_enabled,omitempty" json:"invisible_captcha_enabled,omitempty"` + IssuesCreateLimit *int `url:"issues_create_limit,omitempty" json:"issues_create_limit,omitempty"` + KeepLatestArtifact *bool `url:"keep_latest_artifact,omitempty" json:"keep_latest_artifact,omitempty"` + KrokiEnabled *bool `url:"kroki_enabled,omitempty" json:"kroki_enabled,omitempty"` + KrokiFormats *map[string]bool `url:"kroki_formats,omitempty" json:"kroki_formats,omitempty"` + KrokiURL *string `url:"kroki_url,omitempty" json:"kroki_url,omitempty"` + LocalMarkdownVersion *int `url:"local_markdown_version,omitempty" json:"local_markdown_version,omitempty"` + LockMembershipsToLDAP *bool `url:"lock_memberships_to_ldap,omitempty" json:"lock_memberships_to_ldap,omitempty"` + LoginRecaptchaProtectionEnabled *bool `url:"login_recaptcha_protection_enabled,omitempty" json:"login_recaptcha_protection_enabled,omitempty"` + MailgunEventsEnabled *bool `url:"mailgun_events_enabled,omitempty" json:"mailgun_events_enabled,omitempty"` + MailgunSigningKey *string `url:"mailgun_signing_key,omitempty" json:"mailgun_signing_key,omitempty"` + MaintenanceMode *bool `url:"maintenance_mode,omitempty" json:"maintenance_mode,omitempty"` + MaintenanceModeMessage *string `url:"maintenance_mode_message,omitempty" json:"maintenance_mode_message,omitempty"` + MaxArtifactsSize *int `url:"max_artifacts_size,omitempty" json:"max_artifacts_size,omitempty"` + MaxAttachmentSize *int `url:"max_attachment_size,omitempty" json:"max_attachment_size,omitempty"` + MaxExportSize *int `url:"max_export_size,omitempty" json:"max_export_size,omitempty"` + MaxImportSize *int `url:"max_import_size,omitempty" json:"max_import_size,omitempty"` + MaxNumberOfRepositoryDownloads *int `url:"max_number_of_repository_downloads,omitempty" json:"max_number_of_repository_downloads,omitempty"` + MaxNumberOfRepositoryDownloadsWithinTimePeriod *int `url:"max_number_of_repository_downloads_within_time_period,omitempty" json:"max_number_of_repository_downloads_within_time_period,omitempty"` + MaxPagesSize *int `url:"max_pages_size,omitempty" json:"max_pages_size,omitempty"` + MaxPersonalAccessTokenLifetime *int `url:"max_personal_access_token_lifetime,omitempty" json:"max_personal_access_token_lifetime,omitempty"` + MaxSSHKeyLifetime *int `url:"max_ssh_key_lifetime,omitempty" json:"max_ssh_key_lifetime,omitempty"` + MaxYAMLDepth *int `url:"max_yaml_depth,omitempty" json:"max_yaml_depth,omitempty"` + MaxYAMLSizeBytes *int `url:"max_yaml_size_bytes,omitempty" json:"max_yaml_size_bytes,omitempty"` + MetricsMethodCallThreshold *int `url:"metrics_method_call_threshold,omitempty" json:"metrics_method_call_threshold,omitempty"` + MinimumPasswordLength *int `url:"minimum_password_length,omitempty" json:"minimum_password_length,omitempty"` + MirrorAvailable *bool `url:"mirror_available,omitempty" json:"mirror_available,omitempty"` + MirrorCapacityThreshold *int `url:"mirror_capacity_threshold,omitempty" json:"mirror_capacity_threshold,omitempty"` + MirrorMaxCapacity *int `url:"mirror_max_capacity,omitempty" json:"mirror_max_capacity,omitempty"` + MirrorMaxDelay *int `url:"mirror_max_delay,omitempty" json:"mirror_max_delay,omitempty"` + NPMPackageRequestsForwarding *bool `url:"npm_package_requests_forwarding,omitempty" json:"npm_package_requests_forwarding,omitempty"` + NotesCreateLimit *int `url:"notes_create_limit,omitempty" json:"notes_create_limit,omitempty"` + NotifyOnUnknownSignIn *bool `url:"notify_on_unknown_sign_in,omitempty" json:"notify_on_unknown_sign_in,omitempty"` + OutboundLocalRequestsAllowlistRaw *string `url:"outbound_local_requests_allowlist_raw,omitempty" json:"outbound_local_requests_allowlist_raw,omitempty"` + OutboundLocalRequestsWhitelist *[]string `url:"outbound_local_requests_whitelist,omitempty" json:"outbound_local_requests_whitelist,omitempty"` + PackageRegistryCleanupPoliciesWorkerCapacity *int `url:"package_registry_cleanup_policies_worker_capacity,omitempty" json:"package_registry_cleanup_policies_worker_capacity,omitempty"` + PagesDomainVerificationEnabled *bool `url:"pages_domain_verification_enabled,omitempty" json:"pages_domain_verification_enabled,omitempty"` + PasswordAuthenticationEnabledForGit *bool `url:"password_authentication_enabled_for_git,omitempty" json:"password_authentication_enabled_for_git,omitempty"` + PasswordAuthenticationEnabledForWeb *bool `url:"password_authentication_enabled_for_web,omitempty" json:"password_authentication_enabled_for_web,omitempty"` + PasswordNumberRequired *bool `url:"password_number_required,omitempty" json:"password_number_required,omitempty"` + PasswordSymbolRequired *bool `url:"password_symbol_required,omitempty" json:"password_symbol_required,omitempty"` + PasswordUppercaseRequired *bool `url:"password_uppercase_required,omitempty" json:"password_uppercase_required,omitempty"` + PasswordLowercaseRequired *bool `url:"password_lowercase_required,omitempty" json:"password_lowercase_required,omitempty"` + PerformanceBarAllowedGroupID *string `url:"performance_bar_allowed_group_id,omitempty" json:"performance_bar_allowed_group_id,omitempty"` + PerformanceBarAllowedGroupPath *string `url:"performance_bar_allowed_group_path,omitempty" json:"performance_bar_allowed_group_path,omitempty"` + PerformanceBarEnabled *bool `url:"performance_bar_enabled,omitempty" json:"performance_bar_enabled,omitempty"` + PersonalAccessTokenPrefix *string `url:"personal_access_token_prefix,omitempty" json:"personal_access_token_prefix,omitempty"` + PlantumlEnabled *bool `url:"plantuml_enabled,omitempty" json:"plantuml_enabled,omitempty"` + PlantumlURL *string `url:"plantuml_url,omitempty" json:"plantuml_url,omitempty"` + PipelineLimitPerProjectUserSha *int `url:"pipeline_limit_per_project_user_sha,omitempty" json:"pipeline_limit_per_project_user_sha,omitempty"` + PollingIntervalMultiplier *float64 `url:"polling_interval_multiplier,omitempty" json:"polling_interval_multiplier,omitempty"` + PreventMergeRequestsAuthorApproval *bool `url:"prevent_merge_requests_author_approval,omitempty" json:"prevent_merge_requests_author_approval,omitempty"` + PreventMergeRequestsCommittersApproval *bool `url:"prevent_merge_requests_committers_approval,omitempty" json:"prevent_merge_requests_committers_approval,omitempty"` + ProjectDownloadExportLimit *int `url:"project_download_export_limit,omitempty" json:"project_download_export_limit,omitempty"` + ProjectExportEnabled *bool `url:"project_export_enabled,omitempty" json:"project_export_enabled,omitempty"` + ProjectExportLimit *int `url:"project_export_limit,omitempty" json:"project_export_limit,omitempty"` + ProjectImportLimit *int `url:"project_import_limit,omitempty" json:"project_import_limit,omitempty"` + ProjectRunnerTokenExpirationInterval *int `url:"project_runner_token_expiration_interval,omitempty" json:"project_runner_token_expiration_interval,omitempty"` + PrometheusMetricsEnabled *bool `url:"prometheus_metrics_enabled,omitempty" json:"prometheus_metrics_enabled,omitempty"` + ProtectedCIVariables *bool `url:"protected_ci_variables,omitempty" json:"protected_ci_variables,omitempty"` + PseudonymizerEnabled *bool `url:"pseudonymizer_enabled,omitempty" json:"pseudonymizer_enabled,omitempty"` + PushEventActivitiesLimit *int `url:"push_event_activities_limit,omitempty" json:"push_event_activities_limit,omitempty"` + PushEventHooksLimit *int `url:"push_event_hooks_limit,omitempty" json:"push_event_hooks_limit,omitempty"` + PyPIPackageRequestsForwarding *bool `url:"pypi_package_requests_forwarding,omitempty" json:"pypi_package_requests_forwarding,omitempty"` + RSAKeyRestriction *int `url:"rsa_key_restriction,omitempty" json:"rsa_key_restriction,omitempty"` + RateLimitingResponseText *string `url:"rate_limiting_response_text,omitempty" json:"rate_limiting_response_text,omitempty"` + RawBlobRequestLimit *int `url:"raw_blob_request_limit,omitempty" json:"raw_blob_request_limit,omitempty"` + RecaptchaEnabled *bool `url:"recaptcha_enabled,omitempty" json:"recaptcha_enabled,omitempty"` + RecaptchaPrivateKey *string `url:"recaptcha_private_key,omitempty" json:"recaptcha_private_key,omitempty"` + RecaptchaSiteKey *string `url:"recaptcha_site_key,omitempty" json:"recaptcha_site_key,omitempty"` + ReceiveMaxInputSize *int `url:"receive_max_input_size,omitempty" json:"receive_max_input_size,omitempty"` + RepositoryChecksEnabled *bool `url:"repository_checks_enabled,omitempty" json:"repository_checks_enabled,omitempty"` + RepositorySizeLimit *int `url:"repository_size_limit,omitempty" json:"repository_size_limit,omitempty"` + RepositoryStorages *[]string `url:"repository_storages,omitempty" json:"repository_storages,omitempty"` + RepositoryStoragesWeighted *map[string]int `url:"repository_storages_weighted,omitempty" json:"repository_storages_weighted,omitempty"` + RequireAdminApprovalAfterUserSignup *bool `url:"require_admin_approval_after_user_signup,omitempty" json:"require_admin_approval_after_user_signup,omitempty"` + RequireTwoFactorAuthentication *bool `url:"require_two_factor_authentication,omitempty" json:"require_two_factor_authentication,omitempty"` + RestrictedVisibilityLevels *[]VisibilityValue `url:"restricted_visibility_levels,omitempty" json:"restricted_visibility_levels,omitempty"` + RunnerTokenExpirationInterval *int `url:"runner_token_expiration_interval,omitempty" json:"runner_token_expiration_interval,omitempty"` + SearchRateLimit *int `url:"search_rate_limit,omitempty" json:"search_rate_limit,omitempty"` + SearchRateLimitUnauthenticated *int `url:"search_rate_limit_unauthenticated,omitempty" json:"search_rate_limit_unauthenticated,omitempty"` + SecretDetectionRevocationTokenTypesURL *string `url:"secret_detection_revocation_token_types_url,omitempty" json:"secret_detection_revocation_token_types_url,omitempty"` + SecretDetectionTokenRevocationEnabled *bool `url:"secret_detection_token_revocation_enabled,omitempty" json:"secret_detection_token_revocation_enabled,omitempty"` + SecretDetectionTokenRevocationToken *string `url:"secret_detection_token_revocation_token,omitempty" json:"secret_detection_token_revocation_token,omitempty"` + SecretDetectionTokenRevocationURL *string `url:"secret_detection_token_revocation_url,omitempty" json:"secret_detection_token_revocation_url,omitempty"` + SendUserConfirmationEmail *bool `url:"send_user_confirmation_email,omitempty" json:"send_user_confirmation_email,omitempty"` + SentryClientsideDSN *string `url:"sentry_clientside_dsn,omitempty" json:"sentry_clientside_dsn,omitempty"` + SentryDSN *string `url:"sentry_dsn,omitempty" json:"sentry_dsn,omitempty"` + SentryEnabled *string `url:"sentry_enabled,omitempty" json:"sentry_enabled,omitempty"` + SentryEnvironment *string `url:"sentry_environment,omitempty" json:"sentry_environment,omitempty"` + SessionExpireDelay *int `url:"session_expire_delay,omitempty" json:"session_expire_delay,omitempty"` + SharedRunnersEnabled *bool `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"` + SharedRunnersMinutes *int `url:"shared_runners_minutes,omitempty" json:"shared_runners_minutes,omitempty"` + SharedRunnersText *string `url:"shared_runners_text,omitempty" json:"shared_runners_text,omitempty"` + SidekiqJobLimiterCompressionThresholdBytes *int `url:"sidekiq_job_limiter_compression_threshold_bytes,omitempty" json:"sidekiq_job_limiter_compression_threshold_bytes,omitempty"` + SidekiqJobLimiterLimitBytes *int `url:"sidekiq_job_limiter_limit_bytes,omitempty" json:"sidekiq_job_limiter_limit_bytes,omitempty"` + SidekiqJobLimiterMode *string `url:"sidekiq_job_limiter_mode,omitempty" json:"sidekiq_job_limiter_mode,omitempty"` + SignInText *string `url:"sign_in_text,omitempty" json:"sign_in_text,omitempty"` + SignupEnabled *bool `url:"signup_enabled,omitempty" json:"signup_enabled,omitempty"` + SlackAppEnabled *bool `url:"slack_app_enabled,omitempty" json:"slack_app_enabled,omitempty"` + SlackAppID *string `url:"slack_app_id,omitempty" json:"slack_app_id,omitempty"` + SlackAppSecret *string `url:"slack_app_secret,omitempty" json:"slack_app_secret,omitempty"` + SlackAppSigningSecret *string `url:"slack_app_signing_secret,omitempty" json:"slack_app_signing_secret,omitempty"` + SlackAppVerificationToken *string `url:"slack_app_verification_token,omitempty" json:"slack_app_verification_token,omitempty"` + SnippetSizeLimit *int `url:"snippet_size_limit,omitempty" json:"snippet_size_limit,omitempty"` + SnowplowAppID *string `url:"snowplow_app_id,omitempty" json:"snowplow_app_id,omitempty"` + SnowplowCollectorHostname *string `url:"snowplow_collector_hostname,omitempty" json:"snowplow_collector_hostname,omitempty"` + SnowplowCookieDomain *string `url:"snowplow_cookie_domain,omitempty" json:"snowplow_cookie_domain,omitempty"` + SnowplowEnabled *bool `url:"snowplow_enabled,omitempty" json:"snowplow_enabled,omitempty"` + SourcegraphEnabled *bool `url:"sourcegraph_enabled,omitempty" json:"sourcegraph_enabled,omitempty"` + SourcegraphPublicOnly *bool `url:"sourcegraph_public_only,omitempty" json:"sourcegraph_public_only,omitempty"` + SourcegraphURL *string `url:"sourcegraph_url,omitempty" json:"sourcegraph_url,omitempty"` + SpamCheckAPIKey *string `url:"spam_check_api_key,omitempty" json:"spam_check_api_key,omitempty"` + SpamCheckEndpointEnabled *bool `url:"spam_check_endpoint_enabled,omitempty" json:"spam_check_endpoint_enabled,omitempty"` + SpamCheckEndpointURL *string `url:"spam_check_endpoint_url,omitempty" json:"spam_check_endpoint_url,omitempty"` + SuggestPipelineEnabled *bool `url:"suggest_pipeline_enabled,omitempty" json:"suggest_pipeline_enabled,omitempty"` + TerminalMaxSessionTime *int `url:"terminal_max_session_time,omitempty" json:"terminal_max_session_time,omitempty"` + Terms *string `url:"terms,omitempty" json:"terms,omitempty"` + ThrottleAuthenticatedAPIEnabled *bool `url:"throttle_authenticated_api_enabled,omitempty" json:"throttle_authenticated_api_enabled,omitempty"` + ThrottleAuthenticatedAPIPeriodInSeconds *int `url:"throttle_authenticated_api_period_in_seconds,omitempty" json:"throttle_authenticated_api_period_in_seconds,omitempty"` + ThrottleAuthenticatedAPIRequestsPerPeriod *int `url:"throttle_authenticated_api_requests_per_period,omitempty" json:"throttle_authenticated_api_requests_per_period,omitempty"` + ThrottleAuthenticatedDeprecatedAPIEnabled *bool `url:"throttle_authenticated_deprecated_api_enabled,omitempty" json:"throttle_authenticated_deprecated_api_enabled,omitempty"` + ThrottleAuthenticatedDeprecatedAPIPeriodInSeconds *int `url:"throttle_authenticated_deprecated_api_period_in_seconds,omitempty" json:"throttle_authenticated_deprecated_api_period_in_seconds,omitempty"` + ThrottleAuthenticatedDeprecatedAPIRequestsPerPeriod *int `url:"throttle_authenticated_deprecated_api_requests_per_period,omitempty" json:"throttle_authenticated_deprecated_api_requests_per_period,omitempty"` + ThrottleAuthenticatedFilesAPIEnabled *bool `url:"throttle_authenticated_files_api_enabled,omitempty" json:"throttle_authenticated_files_api_enabled,omitempty"` + ThrottleAuthenticatedFilesAPIPeriodInSeconds *int `url:"throttle_authenticated_files_api_period_in_seconds,omitempty" json:"throttle_authenticated_files_api_period_in_seconds,omitempty"` + ThrottleAuthenticatedFilesAPIRequestsPerPeriod *int `url:"throttle_authenticated_files_api_requests_per_period,omitempty" json:"throttle_authenticated_files_api_requests_per_period,omitempty"` + ThrottleAuthenticatedGitLFSEnabled *bool `url:"throttle_authenticated_git_lfs_enabled,omitempty" json:"throttle_authenticated_git_lfs_enabled,omitempty"` + ThrottleAuthenticatedGitLFSPeriodInSeconds *int `url:"throttle_authenticated_git_lfs_period_in_seconds,omitempty" json:"throttle_authenticated_git_lfs_period_in_seconds,omitempty"` + ThrottleAuthenticatedGitLFSRequestsPerPeriod *int `url:"throttle_authenticated_git_lfs_requests_per_period,omitempty" json:"throttle_authenticated_git_lfs_requests_per_period,omitempty"` + ThrottleAuthenticatedPackagesAPIEnabled *bool `url:"throttle_authenticated_packages_api_enabled,omitempty" json:"throttle_authenticated_packages_api_enabled,omitempty"` + ThrottleAuthenticatedPackagesAPIPeriodInSeconds *int `url:"throttle_authenticated_packages_api_period_in_seconds,omitempty" json:"throttle_authenticated_packages_api_period_in_seconds,omitempty"` + ThrottleAuthenticatedPackagesAPIRequestsPerPeriod *int `url:"throttle_authenticated_packages_api_requests_per_period,omitempty" json:"throttle_authenticated_packages_api_requests_per_period,omitempty"` + ThrottleAuthenticatedWebEnabled *bool `url:"throttle_authenticated_web_enabled,omitempty" json:"throttle_authenticated_web_enabled,omitempty"` + ThrottleAuthenticatedWebPeriodInSeconds *int `url:"throttle_authenticated_web_period_in_seconds,omitempty" json:"throttle_authenticated_web_period_in_seconds,omitempty"` + ThrottleAuthenticatedWebRequestsPerPeriod *int `url:"throttle_authenticated_web_requests_per_period,omitempty" json:"throttle_authenticated_web_requests_per_period,omitempty"` + ThrottleIncidentManagementNotificationEnabled *bool `url:"throttle_incident_management_notification_enabled,omitempty" json:"throttle_incident_management_notification_enabled,omitempty"` + ThrottleIncidentManagementNotificationPerPeriod *int `url:"throttle_incident_management_notification_per_period,omitempty" json:"throttle_incident_management_notification_per_period,omitempty"` + ThrottleIncidentManagementNotificationPeriodInSeconds *int `url:"throttle_incident_management_notification_period_in_seconds,omitempty" json:"throttle_incident_management_notification_period_in_seconds,omitempty"` + ThrottleProtectedPathsEnabled *bool `url:"throttle_protected_paths_enabled_enabled,omitempty" json:"throttle_protected_paths_enabled,omitempty"` + ThrottleProtectedPathsPeriodInSeconds *int `url:"throttle_protected_paths_enabled_period_in_seconds,omitempty" json:"throttle_protected_paths_period_in_seconds,omitempty"` + ThrottleProtectedPathsRequestsPerPeriod *int `url:"throttle_protected_paths_enabled_requests_per_period,omitempty" json:"throttle_protected_paths_per_period,omitempty"` + ThrottleUnauthenticatedAPIEnabled *bool `url:"throttle_unauthenticated_api_enabled,omitempty" json:"throttle_unauthenticated_api_enabled,omitempty"` + ThrottleUnauthenticatedAPIPeriodInSeconds *int `url:"throttle_unauthenticated_api_period_in_seconds,omitempty" json:"throttle_unauthenticated_api_period_in_seconds,omitempty"` + ThrottleUnauthenticatedAPIRequestsPerPeriod *int `url:"throttle_unauthenticated_api_requests_per_period,omitempty" json:"throttle_unauthenticated_api_requests_per_period,omitempty"` + ThrottleUnauthenticatedDeprecatedAPIEnabled *bool `url:"throttle_unauthenticated_deprecated_api_enabled,omitempty" json:"throttle_unauthenticated_deprecated_api_enabled,omitempty"` + ThrottleUnauthenticatedDeprecatedAPIPeriodInSeconds *int `url:"throttle_unauthenticated_deprecated_api_period_in_seconds,omitempty" json:"throttle_unauthenticated_deprecated_api_period_in_seconds,omitempty"` + ThrottleUnauthenticatedDeprecatedAPIRequestsPerPeriod *int `url:"throttle_unauthenticated_deprecated_api_requests_per_period,omitempty" json:"throttle_unauthenticated_deprecated_api_requests_per_period,omitempty"` + ThrottleUnauthenticatedEnabled *bool `url:"throttle_unauthenticated_enabled,omitempty" json:"throttle_unauthenticated_enabled,omitempty"` + ThrottleUnauthenticatedFilesAPIEnabled *bool `url:"throttle_unauthenticated_files_api_enabled,omitempty" json:"throttle_unauthenticated_files_api_enabled,omitempty"` + ThrottleUnauthenticatedFilesAPIPeriodInSeconds *int `url:"throttle_unauthenticated_files_api_period_in_seconds,omitempty" json:"throttle_unauthenticated_files_api_period_in_seconds,omitempty"` + ThrottleUnauthenticatedFilesAPIRequestsPerPeriod *int `url:"throttle_unauthenticated_files_api_requests_per_period,omitempty" json:"throttle_unauthenticated_files_api_requests_per_period,omitempty"` + ThrottleUnauthenticatedGitLFSEnabled *bool `url:"throttle_unauthenticated_git_lfs_enabled,omitempty" json:"throttle_unauthenticated_git_lfs_enabled,omitempty"` + ThrottleUnauthenticatedGitLFSPeriodInSeconds *int `url:"throttle_unauthenticated_git_lfs_period_in_seconds,omitempty" json:"throttle_unauthenticated_git_lfs_period_in_seconds,omitempty"` + ThrottleUnauthenticatedGitLFSRequestsPerPeriod *int `url:"throttle_unauthenticated_git_lfs_requests_per_period,omitempty" json:"throttle_unauthenticated_git_lfs_requests_per_period,omitempty"` + ThrottleUnauthenticatedPackagesAPIEnabled *bool `url:"throttle_unauthenticated_packages_api_enabled,omitempty" json:"throttle_unauthenticated_packages_api_enabled,omitempty"` + ThrottleUnauthenticatedPackagesAPIPeriodInSeconds *int `url:"throttle_unauthenticated_packages_api_period_in_seconds,omitempty" json:"throttle_unauthenticated_packages_api_period_in_seconds,omitempty"` + ThrottleUnauthenticatedPackagesAPIRequestsPerPeriod *int `url:"throttle_unauthenticated_packages_api_requests_per_period,omitempty" json:"throttle_unauthenticated_packages_api_requests_per_period,omitempty"` + ThrottleUnauthenticatedPeriodInSeconds *int `url:"throttle_unauthenticated_period_in_seconds,omitempty" json:"throttle_unauthenticated_period_in_seconds,omitempty"` + ThrottleUnauthenticatedRequestsPerPeriod *int `url:"throttle_unauthenticated_requests_per_period,omitempty" json:"throttle_unauthenticated_requests_per_period,omitempty"` + ThrottleUnauthenticatedWebEnabled *bool `url:"throttle_unauthenticated_web_enabled,omitempty" json:"throttle_unauthenticated_web_enabled,omitempty"` + ThrottleUnauthenticatedWebPeriodInSeconds *int `url:"throttle_unauthenticated_web_period_in_seconds,omitempty" json:"throttle_unauthenticated_web_period_in_seconds,omitempty"` + ThrottleUnauthenticatedWebRequestsPerPeriod *int `url:"throttle_unauthenticated_web_requests_per_period,omitempty" json:"throttle_unauthenticated_web_requests_per_period,omitempty"` + TimeTrackingLimitToHours *bool `url:"time_tracking_limit_to_hours,omitempty" json:"time_tracking_limit_to_hours,omitempty"` + TwoFactorGracePeriod *int `url:"two_factor_grace_period,omitempty" json:"two_factor_grace_period,omitempty"` + UniqueIPsLimitEnabled *bool `url:"unique_ips_limit_enabled,omitempty" json:"unique_ips_limit_enabled,omitempty"` + UniqueIPsLimitPerUser *int `url:"unique_ips_limit_per_user,omitempty" json:"unique_ips_limit_per_user,omitempty"` + UniqueIPsLimitTimeWindow *int `url:"unique_ips_limit_time_window,omitempty" json:"unique_ips_limit_time_window,omitempty"` + UpdatingNameDisabledForUsers *bool `url:"updating_name_disabled_for_users,omitempty" json:"updating_name_disabled_for_users,omitempty"` + UsagePingEnabled *bool `url:"usage_ping_enabled,omitempty" json:"usage_ping_enabled,omitempty"` + UsagePingFeaturesEnabled *bool `url:"usage_ping_features_enabled,omitempty" json:"usage_ping_features_enabled,omitempty"` + UserDeactivationEmailsEnabled *bool `url:"user_deactivation_emails_enabled,omitempty" json:"user_deactivation_emails_enabled,omitempty"` + UserDefaultExternal *bool `url:"user_default_external,omitempty" json:"user_default_external,omitempty"` + UserDefaultInternalRegex *string `url:"user_default_internal_regex,omitempty" json:"user_default_internal_regex,omitempty"` + UserEmailLookupLimit *int `url:"user_email_lookup_limit,omitempty" json:"user_email_lookup_limit,omitempty"` + UserOauthApplications *bool `url:"user_oauth_applications,omitempty" json:"user_oauth_applications,omitempty"` + UserShowAddSSHKeyMessage *bool `url:"user_show_add_ssh_key_message,omitempty" json:"user_show_add_ssh_key_message,omitempty"` + UsersGetByIDLimit *int `url:"users_get_by_id_limit,omitempty" json:"users_get_by_id_limit,omitempty"` + UsersGetByIDLimitAllowlistRaw *string `url:"users_get_by_id_limit_allowlist_raw,omitempty" json:"users_get_by_id_limit_allowlist_raw,omitempty"` + VersionCheckEnabled *bool `url:"version_check_enabled,omitempty" json:"version_check_enabled,omitempty"` + WebIDEClientsidePreviewEnabled *bool `url:"web_ide_clientside_preview_enabled,omitempty" json:"web_ide_clientside_preview_enabled,omitempty"` + WhatsNewVariant *string `url:"whats_new_variant,omitempty" json:"whats_new_variant,omitempty"` + WikiPageMaxContentBytes *int `url:"wiki_page_max_content_bytes,omitempty" json:"wiki_page_max_content_bytes,omitempty"` +} + +// UpdateSettings updates the application settings. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/settings.html#change-application-settings +func (s *SettingsService) UpdateSettings(opt *UpdateSettingsOptions, options ...RequestOptionFunc) (*Settings, *Response, error) { + req, err := s.client.NewRequest(http.MethodPut, "application/settings", opt, options) + if err != nil { + return nil, nil, err + } + + as := new(Settings) + resp, err := s.client.Do(req, as) + if err != nil { + return nil, resp, err + } + + return as, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/sidekiq_metrics.go b/vendor/github.com/xanzy/go-gitlab/sidekiq_metrics.go new file mode 100644 index 0000000000..9b111c8c03 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/sidekiq_metrics.go @@ -0,0 +1,157 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "net/http" + "time" +) + +// SidekiqService handles communication with the sidekiq service +// +// GitLab API docs: https://docs.gitlab.com/ee/api/sidekiq_metrics.html +type SidekiqService struct { + client *Client +} + +// QueueMetrics represents the GitLab sidekiq queue metrics. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-the-current-queue-metrics +type QueueMetrics struct { + Queues map[string]struct { + Backlog int `json:"backlog"` + Latency int `json:"latency"` + } `json:"queues"` +} + +// GetQueueMetrics lists information about all the registered queues, +// their backlog and their latency. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-the-current-queue-metrics +func (s *SidekiqService) GetQueueMetrics(options ...RequestOptionFunc) (*QueueMetrics, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "/sidekiq/queue_metrics", nil, options) + if err != nil { + return nil, nil, err + } + + q := new(QueueMetrics) + resp, err := s.client.Do(req, q) + if err != nil { + return nil, resp, err + } + + return q, resp, err +} + +// ProcessMetrics represents the GitLab sidekiq process metrics. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-the-current-process-metrics +type ProcessMetrics struct { + Processes []struct { + Hostname string `json:"hostname"` + Pid int `json:"pid"` + Tag string `json:"tag"` + StartedAt *time.Time `json:"started_at"` + Queues []string `json:"queues"` + Labels []string `json:"labels"` + Concurrency int `json:"concurrency"` + Busy int `json:"busy"` + } `json:"processes"` +} + +// GetProcessMetrics lists information about all the Sidekiq workers registered +// to process your queues. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-the-current-process-metrics +func (s *SidekiqService) GetProcessMetrics(options ...RequestOptionFunc) (*ProcessMetrics, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "/sidekiq/process_metrics", nil, options) + if err != nil { + return nil, nil, err + } + + p := new(ProcessMetrics) + resp, err := s.client.Do(req, p) + if err != nil { + return nil, resp, err + } + + return p, resp, err +} + +// JobStats represents the GitLab sidekiq job stats. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-the-current-job-statistics +type JobStats struct { + Jobs struct { + Processed int `json:"processed"` + Failed int `json:"failed"` + Enqueued int `json:"enqueued"` + } `json:"jobs"` +} + +// GetJobStats list information about the jobs that Sidekiq has performed. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-the-current-job-statistics +func (s *SidekiqService) GetJobStats(options ...RequestOptionFunc) (*JobStats, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "/sidekiq/job_stats", nil, options) + if err != nil { + return nil, nil, err + } + + j := new(JobStats) + resp, err := s.client.Do(req, j) + if err != nil { + return nil, resp, err + } + + return j, resp, err +} + +// CompoundMetrics represents the GitLab sidekiq compounded stats. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-a-compound-response-of-all-the-previously-mentioned-metrics +type CompoundMetrics struct { + QueueMetrics + ProcessMetrics + JobStats +} + +// GetCompoundMetrics lists all the currently available information about Sidekiq. +// Get a compound response of all the previously mentioned metrics +// +// GitLab API docs: https://docs.gitlab.com/ee/api/sidekiq_metrics.html#get-a-compound-response-of-all-the-previously-mentioned-metrics +func (s *SidekiqService) GetCompoundMetrics(options ...RequestOptionFunc) (*CompoundMetrics, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "/sidekiq/compound_metrics", nil, options) + if err != nil { + return nil, nil, err + } + + c := new(CompoundMetrics) + resp, err := s.client.Do(req, c) + if err != nil { + return nil, resp, err + } + + return c, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/snippets.go b/vendor/github.com/xanzy/go-gitlab/snippets.go new file mode 100644 index 0000000000..77ca0943f6 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/snippets.go @@ -0,0 +1,283 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "net/http" + "net/url" + "time" +) + +// SnippetsService handles communication with the snippets +// related methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/snippets.html +type SnippetsService struct { + client *Client +} + +// Snippet represents a GitLab snippet. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/snippets.html +type Snippet struct { + ID int `json:"id"` + Title string `json:"title"` + FileName string `json:"file_name"` + Description string `json:"description"` + Visibility string `json:"visibility"` + Author struct { + ID int `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Name string `json:"name"` + State string `json:"state"` + CreatedAt *time.Time `json:"created_at"` + } `json:"author"` + UpdatedAt *time.Time `json:"updated_at"` + CreatedAt *time.Time `json:"created_at"` + WebURL string `json:"web_url"` + RawURL string `json:"raw_url"` + Files []struct { + Path string `json:"path"` + RawURL string `json:"raw_url"` + } `json:"files"` +} + +func (s Snippet) String() string { + return Stringify(s) +} + +// ListSnippetsOptions represents the available ListSnippets() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#list-all-snippets-for-a-user +type ListSnippetsOptions ListOptions + +// ListSnippets gets a list of snippets. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#list-all-snippets-for-a-user +func (s *SnippetsService) ListSnippets(opt *ListSnippetsOptions, options ...RequestOptionFunc) ([]*Snippet, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "snippets", opt, options) + if err != nil { + return nil, nil, err + } + + var ps []*Snippet + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// GetSnippet gets a single snippet +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#get-a-single-snippet +func (s *SnippetsService) GetSnippet(snippet int, options ...RequestOptionFunc) (*Snippet, *Response, error) { + u := fmt.Sprintf("snippets/%d", snippet) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + ps := new(Snippet) + resp, err := s.client.Do(req, ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// SnippetContent gets a single snippet’s raw contents. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#single-snippet-contents +func (s *SnippetsService) SnippetContent(snippet int, options ...RequestOptionFunc) ([]byte, *Response, error) { + u := fmt.Sprintf("snippets/%d/raw", snippet) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var b bytes.Buffer + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b.Bytes(), resp, err +} + +// SnippetFileContent returns the raw file content as plain text. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#snippet-repository-file-content +func (s *SnippetsService) SnippetFileContent(snippet int, ref, filename string, options ...RequestOptionFunc) ([]byte, *Response, error) { + filepath := url.QueryEscape(filename) + u := fmt.Sprintf("snippets/%d/files/%s/%s/raw", snippet, ref, filepath) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var b bytes.Buffer + resp, err := s.client.Do(req, &b) + if err != nil { + return nil, resp, err + } + + return b.Bytes(), resp, err +} + +// CreateSnippetFileOptions represents the create snippet file options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#create-new-snippet +type CreateSnippetFileOptions struct { + FilePath *string `url:"file_path,omitempty" json:"file_path,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` +} + +// CreateSnippetOptions represents the available CreateSnippet() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#create-new-snippet +type CreateSnippetOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + FileName *string `url:"file_name,omitempty" json:"file_name,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + Files *[]*CreateSnippetFileOptions `url:"files,omitempty" json:"files,omitempty"` +} + +// CreateSnippet creates a new snippet. The user must have permission +// to create new snippets. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#create-new-snippet +func (s *SnippetsService) CreateSnippet(opt *CreateSnippetOptions, options ...RequestOptionFunc) (*Snippet, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "snippets", opt, options) + if err != nil { + return nil, nil, err + } + + ps := new(Snippet) + resp, err := s.client.Do(req, ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// UpdateSnippetFileOptions represents the update snippet file options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#update-snippet +type UpdateSnippetFileOptions struct { + Action *string `url:"action,omitempty" json:"action,omitempty"` + FilePath *string `url:"file_path,omitempty" json:"file_path,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + PreviousPath *string `url:"previous_path,omitempty" json:"previous_path,omitempty"` +} + +// UpdateSnippetOptions represents the available UpdateSnippet() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#update-snippet +type UpdateSnippetOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + FileName *string `url:"file_name,omitempty" json:"file_name,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Content *string `url:"content,omitempty" json:"content,omitempty"` + Visibility *VisibilityValue `url:"visibility,omitempty" json:"visibility,omitempty"` + Files *[]*UpdateSnippetFileOptions `url:"files,omitempty" json:"files,omitempty"` +} + +// UpdateSnippet updates an existing snippet. The user must have +// permission to change an existing snippet. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#update-snippet +func (s *SnippetsService) UpdateSnippet(snippet int, opt *UpdateSnippetOptions, options ...RequestOptionFunc) (*Snippet, *Response, error) { + u := fmt.Sprintf("snippets/%d", snippet) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + ps := new(Snippet) + resp, err := s.client.Do(req, ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} + +// DeleteSnippet deletes an existing snippet. This is an idempotent +// function and deleting a non-existent snippet still returns a 200 OK status +// code. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#delete-snippet +func (s *SnippetsService) DeleteSnippet(snippet int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("snippets/%d", snippet) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ExploreSnippetsOptions represents the available ExploreSnippets() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#list-all-public-snippets +type ExploreSnippetsOptions ListOptions + +// ExploreSnippets gets the list of public snippets. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/snippets.html#list-all-public-snippets +func (s *SnippetsService) ExploreSnippets(opt *ExploreSnippetsOptions, options ...RequestOptionFunc) ([]*Snippet, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "snippets/public", opt, options) + if err != nil { + return nil, nil, err + } + + var ps []*Snippet + resp, err := s.client.Do(req, &ps) + if err != nil { + return nil, resp, err + } + + return ps, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/strings.go b/vendor/github.com/xanzy/go-gitlab/strings.go new file mode 100644 index 0000000000..efbd10ffd5 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/strings.go @@ -0,0 +1,93 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "bytes" + "fmt" + "reflect" +) + +// Stringify attempts to create a reasonable string representation of types in +// the Gitlab library. It does things like resolve pointers to their values +// and omits struct fields with nil values. +func Stringify(message interface{}) string { + var buf bytes.Buffer + v := reflect.ValueOf(message) + stringifyValue(&buf, v) + return buf.String() +} + +// stringifyValue was heavily inspired by the goprotobuf library. +func stringifyValue(buf *bytes.Buffer, val reflect.Value) { + if val.Kind() == reflect.Ptr && val.IsNil() { + buf.WriteString("") + return + } + + v := reflect.Indirect(val) + + switch v.Kind() { + case reflect.String: + fmt.Fprintf(buf, `"%s"`, v) + case reflect.Slice: + buf.WriteByte('[') + for i := 0; i < v.Len(); i++ { + if i > 0 { + buf.WriteByte(' ') + } + + stringifyValue(buf, v.Index(i)) + } + + buf.WriteByte(']') + return + case reflect.Struct: + if v.Type().Name() != "" { + buf.WriteString(v.Type().String()) + } + + buf.WriteByte('{') + + var sep bool + for i := 0; i < v.NumField(); i++ { + fv := v.Field(i) + if fv.Kind() == reflect.Ptr && fv.IsNil() { + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + continue + } + + if sep { + buf.WriteString(", ") + } else { + sep = true + } + + buf.WriteString(v.Type().Field(i).Name) + buf.WriteByte(':') + stringifyValue(buf, fv) + } + + buf.WriteByte('}') + default: + if v.CanInterface() { + fmt.Fprint(buf, v.Interface()) + } + } +} diff --git a/vendor/github.com/xanzy/go-gitlab/system_hooks.go b/vendor/github.com/xanzy/go-gitlab/system_hooks.go new file mode 100644 index 0000000000..d11dceba60 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/system_hooks.go @@ -0,0 +1,176 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// SystemHooksService handles communication with the system hooks related +// methods of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/system_hooks.html +type SystemHooksService struct { + client *Client +} + +// Hook represents a GitLap system hook. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/system_hooks.html +type Hook struct { + ID int `json:"id"` + URL string `json:"url"` + CreatedAt *time.Time `json:"created_at"` + PushEvents bool `json:"push_events"` + TagPushEvents bool `json:"tag_push_events"` + MergeRequestsEvents bool `json:"merge_requests_events"` + RepositoryUpdateEvents bool `json:"repository_update_events"` + EnableSSLVerification bool `json:"enable_ssl_verification"` +} + +func (h Hook) String() string { + return Stringify(h) +} + +// ListHooks gets a list of system hooks. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/system_hooks.html#list-system-hooks +func (s *SystemHooksService) ListHooks(options ...RequestOptionFunc) ([]*Hook, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "hooks", nil, options) + if err != nil { + return nil, nil, err + } + + var h []*Hook + resp, err := s.client.Do(req, &h) + if err != nil { + return nil, resp, err + } + + return h, resp, err +} + +// GetHook get a single system hook. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/system_hooks.html#get-system-hook +func (s *SystemHooksService) GetHook(hook int, options ...RequestOptionFunc) (*Hook, *Response, error) { + u := fmt.Sprintf("hooks/%d", hook) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var h *Hook + resp, err := s.client.Do(req, &h) + if err != nil { + return nil, resp, err + } + + return h, resp, err +} + +// AddHookOptions represents the available AddHook() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/system_hooks.html#add-new-system-hook +type AddHookOptions struct { + URL *string `url:"url,omitempty" json:"url,omitempty"` + Token *string `url:"token,omitempty" json:"token,omitempty"` + PushEvents *bool `url:"push_events,omitempty" json:"push_events,omitempty"` + TagPushEvents *bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` + MergeRequestsEvents *bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` + RepositoryUpdateEvents *bool `url:"repository_update_events,omitempty" json:"repository_update_events,omitempty"` + EnableSSLVerification *bool `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"` +} + +// AddHook adds a new system hook hook. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/system_hooks.html#add-new-system-hook +func (s *SystemHooksService) AddHook(opt *AddHookOptions, options ...RequestOptionFunc) (*Hook, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "hooks", opt, options) + if err != nil { + return nil, nil, err + } + + h := new(Hook) + resp, err := s.client.Do(req, h) + if err != nil { + return nil, resp, err + } + + return h, resp, err +} + +// HookEvent represents an event trigger by a GitLab system hook. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/system_hooks.html +type HookEvent struct { + EventName string `json:"event_name"` + Name string `json:"name"` + Path string `json:"path"` + ProjectID int `json:"project_id"` + OwnerName string `json:"owner_name"` + OwnerEmail string `json:"owner_email"` +} + +func (h HookEvent) String() string { + return Stringify(h) +} + +// TestHook tests a system hook. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/system_hooks.html#test-system-hook +func (s *SystemHooksService) TestHook(hook int, options ...RequestOptionFunc) (*HookEvent, *Response, error) { + u := fmt.Sprintf("hooks/%d", hook) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + h := new(HookEvent) + resp, err := s.client.Do(req, h) + if err != nil { + return nil, resp, err + } + + return h, resp, err +} + +// DeleteHook deletes a system hook. This is an idempotent API function and +// returns 200 OK even if the hook is not available. If the hook is deleted it +// is also returned as JSON. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/system_hooks.html#delete-system-hook +func (s *SystemHooksService) DeleteHook(hook int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("hooks/%d", hook) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/tags.go b/vendor/github.com/xanzy/go-gitlab/tags.go new file mode 100644 index 0000000000..cfb58a8983 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/tags.go @@ -0,0 +1,248 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// TagsService handles communication with the tags related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/tags.html +type TagsService struct { + client *Client +} + +// Tag represents a GitLab tag. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/tags.html +type Tag struct { + Commit *Commit `json:"commit"` + Release *ReleaseNote `json:"release"` + Name string `json:"name"` + Message string `json:"message"` + Protected bool `json:"protected"` + Target string `json:"target"` +} + +// ReleaseNote represents a GitLab version release. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/tags.html +type ReleaseNote struct { + TagName string `json:"tag_name"` + Description string `json:"description"` +} + +func (t Tag) String() string { + return Stringify(t) +} + +// ListTagsOptions represents the available ListTags() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#list-project-repository-tags +type ListTagsOptions struct { + ListOptions + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Search *string `url:"search,omitempty" json:"search,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` +} + +// ListTags gets a list of tags from a project, sorted by name in reverse +// alphabetical order. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#list-project-repository-tags +func (s *TagsService) ListTags(pid interface{}, opt *ListTagsOptions, options ...RequestOptionFunc) ([]*Tag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/tags", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var t []*Tag + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// GetTag a specific repository tag determined by its name. It returns 200 together +// with the tag information if the tag exists. It returns 404 if the tag does not exist. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#get-a-single-repository-tag +func (s *TagsService) GetTag(pid interface{}, tag string, options ...RequestOptionFunc) (*Tag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/tags/%s", PathEscape(project), url.PathEscape(tag)) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var t *Tag + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// CreateTagOptions represents the available CreateTag() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#create-a-new-tag +type CreateTagOptions struct { + TagName *string `url:"tag_name,omitempty" json:"tag_name,omitempty"` + Ref *string `url:"ref,omitempty" json:"ref,omitempty"` + Message *string `url:"message,omitempty" json:"message,omitempty"` + + // Deprecated: Use the Releases API instead. (Deprecated in GitLab 11.7) + ReleaseDescription *string `url:"release_description:omitempty" json:"release_description,omitempty"` +} + +// CreateTag creates a new tag in the repository that points to the supplied ref. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#create-a-new-tag +func (s *TagsService) CreateTag(pid interface{}, opt *CreateTagOptions, options ...RequestOptionFunc) (*Tag, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/tags", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + t := new(Tag) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// DeleteTag deletes a tag of a repository with given name. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#delete-a-tag +func (s *TagsService) DeleteTag(pid interface{}, tag string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/repository/tags/%s", PathEscape(project), url.PathEscape(tag)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// CreateReleaseNoteOptions represents the available CreateReleaseNote() options. +// +// Deprecated: This feature was deprecated in GitLab 11.7. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#create-a-new-release +type CreateReleaseNoteOptions struct { + Description *string `url:"description:omitempty" json:"description,omitempty"` +} + +// CreateReleaseNote Add release notes to the existing git tag. +// If there already exists a release for the given tag, status code 409 is returned. +// +// Deprecated: This feature was deprecated in GitLab 11.7. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#create-a-new-release +func (s *TagsService) CreateReleaseNote(pid interface{}, tag string, opt *CreateReleaseNoteOptions, options ...RequestOptionFunc) (*ReleaseNote, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/tags/%s/release", PathEscape(project), url.PathEscape(tag)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + r := new(ReleaseNote) + resp, err := s.client.Do(req, r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} + +// UpdateReleaseNoteOptions represents the available UpdateReleaseNote() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#update-a-release +type UpdateReleaseNoteOptions struct { + Description *string `url:"description:omitempty" json:"description,omitempty"` +} + +// UpdateReleaseNote Updates the release notes of a given release. +// +// Deprecated: This feature was deprecated in GitLab 11.7. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/tags.html#update-a-release +func (s *TagsService) UpdateReleaseNote(pid interface{}, tag string, opt *UpdateReleaseNoteOptions, options ...RequestOptionFunc) (*ReleaseNote, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/repository/tags/%s/release", PathEscape(project), url.PathEscape(tag)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + r := new(ReleaseNote) + resp, err := s.client.Do(req, r) + if err != nil { + return nil, resp, err + } + + return r, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/time_stats.go b/vendor/github.com/xanzy/go-gitlab/time_stats.go new file mode 100644 index 0000000000..4cf1b10a36 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/time_stats.go @@ -0,0 +1,179 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// timeStatsService handles communication with the time tracking related +// methods of the GitLab API. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +type timeStatsService struct { + client *Client +} + +// TimeStats represents the time estimates and time spent for an issue. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +type TimeStats struct { + HumanTimeEstimate string `json:"human_time_estimate"` + HumanTotalTimeSpent string `json:"human_total_time_spent"` + TimeEstimate int `json:"time_estimate"` + TotalTimeSpent int `json:"total_time_spent"` +} + +func (t TimeStats) String() string { + return Stringify(t) +} + +// SetTimeEstimateOptions represents the available SetTimeEstimate() +// options. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +type SetTimeEstimateOptions struct { + Duration *string `url:"duration,omitempty" json:"duration,omitempty"` +} + +// setTimeEstimate sets the time estimate for a single project issue. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +func (s *timeStatsService) setTimeEstimate(pid interface{}, entity string, issue int, opt *SetTimeEstimateOptions, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/time_estimate", PathEscape(project), entity, issue) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + t := new(TimeStats) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// resetTimeEstimate resets the time estimate for a single project issue. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +func (s *timeStatsService) resetTimeEstimate(pid interface{}, entity string, issue int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/reset_time_estimate", PathEscape(project), entity, issue) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(TimeStats) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// AddSpentTimeOptions represents the available AddSpentTime() options. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +type AddSpentTimeOptions struct { + Duration *string `url:"duration,omitempty" json:"duration,omitempty"` +} + +// addSpentTime adds spent time for a single project issue. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +func (s *timeStatsService) addSpentTime(pid interface{}, entity string, issue int, opt *AddSpentTimeOptions, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/add_spent_time", PathEscape(project), entity, issue) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + t := new(TimeStats) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// resetSpentTime resets the spent time for a single project issue. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +func (s *timeStatsService) resetSpentTime(pid interface{}, entity string, issue int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/reset_spent_time", PathEscape(project), entity, issue) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(TimeStats) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// getTimeSpent gets the spent time for a single project issue. +// +// GitLab docs: https://docs.gitlab.com/ee/workflow/time_tracking.html +func (s *timeStatsService) getTimeSpent(pid interface{}, entity string, issue int, options ...RequestOptionFunc) (*TimeStats, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/%s/%d/time_stats", PathEscape(project), entity, issue) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(TimeStats) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/todos.go b/vendor/github.com/xanzy/go-gitlab/todos.go new file mode 100644 index 0000000000..32d2b0ab16 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/todos.go @@ -0,0 +1,162 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "time" +) + +// TodosService handles communication with the todos related methods of +// the Gitlab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/todos.html +type TodosService struct { + client *Client +} + +// Todo represents a GitLab todo. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/todos.html +type Todo struct { + ID int `json:"id"` + Project *BasicProject `json:"project"` + Author *BasicUser `json:"author"` + ActionName TodoAction `json:"action_name"` + TargetType TodoTargetType `json:"target_type"` + Target *TodoTarget `json:"target"` + TargetURL string `json:"target_url"` + Body string `json:"body"` + State string `json:"state"` + CreatedAt *time.Time `json:"created_at"` +} + +func (t Todo) String() string { + return Stringify(t) +} + +// TodoTarget represents a todo target of type Issue or MergeRequest +type TodoTarget struct { + Assignees []*BasicUser `json:"assignees"` + Assignee *BasicUser `json:"assignee"` + Author *BasicUser `json:"author"` + CreatedAt *time.Time `json:"created_at"` + Description string `json:"description"` + Downvotes int `json:"downvotes"` + ID int `json:"id"` + IID int `json:"iid"` + Labels []string `json:"labels"` + Milestone *Milestone `json:"milestone"` + ProjectID int `json:"project_id"` + State string `json:"state"` + Subscribed bool `json:"subscribed"` + TaskCompletionStatus *TasksCompletionStatus `json:"task_completion_status"` + Title string `json:"title"` + UpdatedAt *time.Time `json:"updated_at"` + Upvotes int `json:"upvotes"` + UserNotesCount int `json:"user_notes_count"` + WebURL string `json:"web_url"` + + // Only available for type Issue + Confidential bool `json:"confidential"` + DueDate string `json:"due_date"` + HasTasks bool `json:"has_tasks"` + Links *IssueLinks `json:"_links"` + MovedToID int `json:"moved_to_id"` + TimeStats *TimeStats `json:"time_stats"` + Weight int `json:"weight"` + + // Only available for type MergeRequest + ApprovalsBeforeMerge int `json:"approvals_before_merge"` + ForceRemoveSourceBranch bool `json:"force_remove_source_branch"` + MergeCommitSHA string `json:"merge_commit_sha"` + MergeWhenPipelineSucceeds bool `json:"merge_when_pipeline_succeeds"` + MergeStatus string `json:"merge_status"` + Reference string `json:"reference"` + Reviewers []*BasicUser `json:"reviewers"` + SHA string `json:"sha"` + ShouldRemoveSourceBranch bool `json:"should_remove_source_branch"` + SourceBranch string `json:"source_branch"` + SourceProjectID int `json:"source_project_id"` + Squash bool `json:"squash"` + TargetBranch string `json:"target_branch"` + TargetProjectID int `json:"target_project_id"` + WorkInProgress bool `json:"work_in_progress"` + + // Only available for type DesignManagement::Design + FileName string `json:"filename"` + ImageURL string `json:"image_url"` +} + +// ListTodosOptions represents the available ListTodos() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/todos.html#get-a-list-of-to-do-items +type ListTodosOptions struct { + ListOptions + Action *TodoAction `url:"action,omitempty" json:"action,omitempty"` + AuthorID *int `url:"author_id,omitempty" json:"author_id,omitempty"` + ProjectID *int `url:"project_id,omitempty" json:"project_id,omitempty"` + State *string `url:"state,omitempty" json:"state,omitempty"` + Type *string `url:"type,omitempty" json:"type,omitempty"` +} + +// ListTodos lists all todos created by authenticated user. +// When no filter is applied, it returns all pending todos for the current user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/todos.html#get-a-list-of-to-do-items +func (s *TodosService) ListTodos(opt *ListTodosOptions, options ...RequestOptionFunc) ([]*Todo, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "todos", opt, options) + if err != nil { + return nil, nil, err + } + + var t []*Todo + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// MarkTodoAsDone marks a single pending todo given by its ID for the current user as done. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/todos.html#mark-a-to-do-item-as-done +func (s *TodosService) MarkTodoAsDone(id int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("todos/%d/mark_as_done", id) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// MarkAllTodosAsDone marks all pending todos for the current user as done. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/todos.html#mark-all-to-do-items-as-done +func (s *TodosService) MarkAllTodosAsDone(options ...RequestOptionFunc) (*Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "todos/mark_as_done", nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/topics.go b/vendor/github.com/xanzy/go-gitlab/topics.go new file mode 100644 index 0000000000..c9d8e5e6ae --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/topics.go @@ -0,0 +1,222 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + + retryablehttp "github.com/hashicorp/go-retryablehttp" +) + +// TopicsService handles communication with the topics related methods +// of the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/topics.html +type TopicsService struct { + client *Client +} + +// Topic represents a GitLab project topic. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/topics.html +type Topic struct { + ID int `json:"id"` + Name string `json:"name"` + Title string `json:"title"` + Description string `json:"description"` + TotalProjectsCount uint64 `json:"total_projects_count"` + AvatarURL string `json:"avatar_url"` +} + +func (t Topic) String() string { + return Stringify(t) +} + +// ListTopicsOptions represents the available ListTopics() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/topics.html#list-topics +type ListTopicsOptions struct { + ListOptions + Search *string `url:"search,omitempty" json:"search,omitempty"` +} + +// ListTopics returns a list of project topics in the GitLab instance ordered +// by number of associated projects. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/topics.html#list-topics +func (s *TopicsService) ListTopics(opt *ListTopicsOptions, options ...RequestOptionFunc) ([]*Topic, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "topics", opt, options) + if err != nil { + return nil, nil, err + } + + var t []*Topic + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// GetTopic gets a project topic by ID. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/topics.html#get-a-topic +func (s *TopicsService) GetTopic(topic int, options ...RequestOptionFunc) (*Topic, *Response, error) { + u := fmt.Sprintf("topics/%d", topic) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(Topic) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// CreateTopicOptions represents the available CreateTopic() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/topics.html#create-a-project-topic +type CreateTopicOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Avatar *TopicAvatar `url:"-" json:"-"` +} + +// TopicAvatar represents a GitLab topic avatar. +type TopicAvatar struct { + Filename string + Image io.Reader +} + +// MarshalJSON implements the json.Marshaler interface. +func (a *TopicAvatar) MarshalJSON() ([]byte, error) { + if a.Filename == "" && a.Image == nil { + return []byte(`""`), nil + } + type alias TopicAvatar + return json.Marshal((*alias)(a)) +} + +// CreateTopic creates a new project topic. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/topics.html#create-a-project-topic +func (s *TopicsService) CreateTopic(opt *CreateTopicOptions, options ...RequestOptionFunc) (*Topic, *Response, error) { + var err error + var req *retryablehttp.Request + + if opt.Avatar == nil { + req, err = s.client.NewRequest(http.MethodPost, "topics", opt, options) + } else { + req, err = s.client.UploadRequest( + http.MethodPost, + "topics", + opt.Avatar.Image, + opt.Avatar.Filename, + UploadAvatar, + opt, + options, + ) + } + if err != nil { + return nil, nil, err + } + + t := new(Topic) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// UpdateTopicOptions represents the available UpdateTopic() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/topics.html#update-a-project-topic +type UpdateTopicOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + Avatar *TopicAvatar `url:"-" json:"avatar,omitempty"` +} + +// UpdateTopic updates a project topic. Only available to administrators. +// +// To remove a topic avatar set the TopicAvatar.Filename to an empty string +// and set TopicAvatar.Image to nil. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/topics.html#update-a-project-topic +func (s *TopicsService) UpdateTopic(topic int, opt *UpdateTopicOptions, options ...RequestOptionFunc) (*Topic, *Response, error) { + u := fmt.Sprintf("topics/%d", topic) + + var err error + var req *retryablehttp.Request + + if opt.Avatar == nil || (opt.Avatar.Filename == "" && opt.Avatar.Image == nil) { + req, err = s.client.NewRequest(http.MethodPut, u, opt, options) + } else { + req, err = s.client.UploadRequest( + http.MethodPut, + u, + opt.Avatar.Image, + opt.Avatar.Filename, + UploadAvatar, + opt, + options, + ) + } + if err != nil { + return nil, nil, err + } + + t := new(Topic) + resp, err := s.client.Do(req, t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// DeleteTopic deletes a project topic. Only available to administrators. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/topics.html#delete-a-project-topic +func (s *TopicsService) DeleteTopic(topic int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("topics/%d", topic) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/github.com/xanzy/go-gitlab/types.go b/vendor/github.com/xanzy/go-gitlab/types.go new file mode 100644 index 0000000000..640f68c754 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/types.go @@ -0,0 +1,822 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "encoding/json" + "errors" + "fmt" + "net/url" + "reflect" + "strconv" + "time" +) + +// AccessControlValue represents an access control value within GitLab, +// used for managing access to certain project features. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html +type AccessControlValue string + +// List of available access control values. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html +const ( + DisabledAccessControl AccessControlValue = "disabled" + EnabledAccessControl AccessControlValue = "enabled" + PrivateAccessControl AccessControlValue = "private" + PublicAccessControl AccessControlValue = "public" +) + +// AccessControl is a helper routine that allocates a new AccessControlValue +// to store v and returns a pointer to it. +func AccessControl(v AccessControlValue) *AccessControlValue { + p := new(AccessControlValue) + *p = v + return p +} + +// AccessLevelValue represents a permission level within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/user/permissions.html +type AccessLevelValue int + +// List of available access levels +// +// GitLab API docs: https://docs.gitlab.com/ee/user/permissions.html +const ( + NoPermissions AccessLevelValue = 0 + MinimalAccessPermissions AccessLevelValue = 5 + GuestPermissions AccessLevelValue = 10 + ReporterPermissions AccessLevelValue = 20 + DeveloperPermissions AccessLevelValue = 30 + MaintainerPermissions AccessLevelValue = 40 + OwnerPermissions AccessLevelValue = 50 + + // Deprecated: Renamed to MaintainerPermissions in GitLab 11.0. + MasterPermissions AccessLevelValue = 40 + // Deprecated: Renamed to OwnerPermissions. + OwnerPermission AccessLevelValue = 50 +) + +// AccessLevel is a helper routine that allocates a new AccessLevelValue +// to store v and returns a pointer to it. +func AccessLevel(v AccessLevelValue) *AccessLevelValue { + p := new(AccessLevelValue) + *p = v + return p +} + +// UserIDValue represents a user ID value within GitLab. +type UserIDValue string + +// List of available user ID values. +const ( + UserIDAny UserIDValue = "Any" + UserIDNone UserIDValue = "None" +) + +// ApproverIDsValue represents an approver ID value within GitLab. +type ApproverIDsValue struct { + value interface{} +} + +// ApproverIDs is a helper routine that creates a new ApproverIDsValue. +func ApproverIDs(v interface{}) *ApproverIDsValue { + switch v.(type) { + case UserIDValue, []int: + return &ApproverIDsValue{value: v} + default: + panic("Unsupported value passed as approver ID") + } +} + +// EncodeValues implements the query.Encoder interface +func (a *ApproverIDsValue) EncodeValues(key string, v *url.Values) error { + switch value := a.value.(type) { + case UserIDValue: + v.Set(key, string(value)) + case []int: + v.Del(key) + v.Del(key + "[]") + for _, id := range value { + v.Add(key+"[]", strconv.Itoa(id)) + } + } + return nil +} + +// MarshalJSON implements the json.Marshaler interface +func (a ApproverIDsValue) MarshalJSON() ([]byte, error) { + return json.Marshal(a.value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (a *ApproverIDsValue) UnmarshalJSON(bytes []byte) error { + return json.Unmarshal(bytes, a.value) +} + +// AssigneeIDValue represents an assignee ID value within GitLab. +type AssigneeIDValue struct { + value interface{} +} + +// AssigneeID is a helper routine that creates a new AssigneeIDValue. +func AssigneeID(v interface{}) *AssigneeIDValue { + switch v.(type) { + case UserIDValue, int: + return &AssigneeIDValue{value: v} + default: + panic("Unsupported value passed as assignee ID") + } +} + +// EncodeValues implements the query.Encoder interface +func (a *AssigneeIDValue) EncodeValues(key string, v *url.Values) error { + switch value := a.value.(type) { + case UserIDValue: + v.Set(key, string(value)) + case int: + v.Set(key, strconv.Itoa(value)) + } + return nil +} + +// MarshalJSON implements the json.Marshaler interface +func (a AssigneeIDValue) MarshalJSON() ([]byte, error) { + return json.Marshal(a.value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (a *AssigneeIDValue) UnmarshalJSON(bytes []byte) error { + return json.Unmarshal(bytes, a.value) +} + +// ReviewerIDValue represents a reviewer ID value within GitLab. +type ReviewerIDValue struct { + value interface{} +} + +// ReviewerID is a helper routine that creates a new ReviewerIDValue. +func ReviewerID(v interface{}) *ReviewerIDValue { + switch v.(type) { + case UserIDValue, int: + return &ReviewerIDValue{value: v} + default: + panic("Unsupported value passed as reviewer ID") + } +} + +// EncodeValues implements the query.Encoder interface +func (a *ReviewerIDValue) EncodeValues(key string, v *url.Values) error { + switch value := a.value.(type) { + case UserIDValue: + v.Set(key, string(value)) + case int: + v.Set(key, strconv.Itoa(value)) + } + return nil +} + +// MarshalJSON implements the json.Marshaler interface +func (a ReviewerIDValue) MarshalJSON() ([]byte, error) { + return json.Marshal(a.value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (a *ReviewerIDValue) UnmarshalJSON(bytes []byte) error { + return json.Unmarshal(bytes, a.value) +} + +// AvailabilityValue represents an availability value within GitLab. +type AvailabilityValue string + +// List of available availability values. +// +// Undocummented, see code at: +// https://gitlab.com/gitlab-org/gitlab-foss/-/blob/master/app/models/user_status.rb#L22 +const ( + NotSet AvailabilityValue = "not_set" + Busy AvailabilityValue = "busy" +) + +// Availability is a helper routine that allocates a new AvailabilityValue +// to store v and returns a pointer to it. +func Availability(v AvailabilityValue) *AvailabilityValue { + p := new(AvailabilityValue) + *p = v + return p +} + +// BuildStateValue represents a GitLab build state. +type BuildStateValue string + +// These constants represent all valid build states. +const ( + Pending BuildStateValue = "pending" + Created BuildStateValue = "created" + Running BuildStateValue = "running" + Success BuildStateValue = "success" + Failed BuildStateValue = "failed" + Canceled BuildStateValue = "canceled" + Skipped BuildStateValue = "skipped" + Manual BuildStateValue = "manual" +) + +// BuildState is a helper routine that allocates a new BuildStateValue +// to store v and returns a pointer to it. +func BuildState(v BuildStateValue) *BuildStateValue { + p := new(BuildStateValue) + *p = v + return p +} + +// DeploymentStatusValue represents a Gitlab deployment status. +type DeploymentStatusValue string + +// These constants represent all valid deployment statuses. +const ( + DeploymentStatusCreated DeploymentStatusValue = "created" + DeploymentStatusRunning DeploymentStatusValue = "running" + DeploymentStatusSuccess DeploymentStatusValue = "success" + DeploymentStatusFailed DeploymentStatusValue = "failed" + DeploymentStatusCanceled DeploymentStatusValue = "canceled" +) + +// DeploymentStatus is a helper routine that allocates a new +// DeploymentStatusValue to store v and returns a pointer to it. +func DeploymentStatus(v DeploymentStatusValue) *DeploymentStatusValue { + p := new(DeploymentStatusValue) + *p = v + return p +} + +// EventTypeValue represents actions type for contribution events +type EventTypeValue string + +// List of available action type +// +// GitLab API docs: https://docs.gitlab.com/ee/user/profile/contributions_calendar.html#user-contribution-events +const ( + CreatedEventType EventTypeValue = "created" + UpdatedEventType EventTypeValue = "updated" + ClosedEventType EventTypeValue = "closed" + ReopenedEventType EventTypeValue = "reopened" + PushedEventType EventTypeValue = "pushed" + CommentedEventType EventTypeValue = "commented" + MergedEventType EventTypeValue = "merged" + JoinedEventType EventTypeValue = "joined" + LeftEventType EventTypeValue = "left" + DestroyedEventType EventTypeValue = "destroyed" + ExpiredEventType EventTypeValue = "expired" +) + +// EventTargetTypeValue represents actions type value for contribution events +type EventTargetTypeValue string + +// List of available action type +// +// GitLab API docs: https://docs.gitlab.com/ee/api/events.html#target-types +const ( + IssueEventTargetType EventTargetTypeValue = "issue" + MilestoneEventTargetType EventTargetTypeValue = "milestone" + MergeRequestEventTargetType EventTargetTypeValue = "merge_request" + NoteEventTargetType EventTargetTypeValue = "note" + ProjectEventTargetType EventTargetTypeValue = "project" + SnippetEventTargetType EventTargetTypeValue = "snippet" + UserEventTargetType EventTargetTypeValue = "user" +) + +// FileActionValue represents the available actions that can be performed on a file. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/commits.html#create-a-commit-with-multiple-files-and-actions +type FileActionValue string + +// The available file actions. +const ( + FileCreate FileActionValue = "create" + FileDelete FileActionValue = "delete" + FileMove FileActionValue = "move" + FileUpdate FileActionValue = "update" + FileChmod FileActionValue = "chmod" +) + +// FileAction is a helper routine that allocates a new FileActionValue value +// to store v and returns a pointer to it. +func FileAction(v FileActionValue) *FileActionValue { + p := new(FileActionValue) + *p = v + return p +} + +// GenericPackageSelectValue represents a generic package select value. +type GenericPackageSelectValue string + +// The available generic package select values. +const ( + SelectPackageFile GenericPackageSelectValue = "package_file" +) + +// GenericPackageSelect is a helper routine that allocates a new +// GenericPackageSelectValue value to store v and returns a pointer to it. +func GenericPackageSelect(v GenericPackageSelectValue) *GenericPackageSelectValue { + p := new(GenericPackageSelectValue) + *p = v + return p +} + +// GenericPackageStatusValue represents a generic package status. +type GenericPackageStatusValue string + +// The available generic package statuses. +const ( + PackageDefault GenericPackageStatusValue = "default" + PackageHidden GenericPackageStatusValue = "hidden" +) + +// GenericPackageStatus is a helper routine that allocates a new +// GenericPackageStatusValue value to store v and returns a pointer to it. +func GenericPackageStatus(v GenericPackageStatusValue) *GenericPackageStatusValue { + p := new(GenericPackageStatusValue) + *p = v + return p +} + +// ISOTime represents an ISO 8601 formatted date +type ISOTime time.Time + +// ISO 8601 date format +const iso8601 = "2006-01-02" + +// MarshalJSON implements the json.Marshaler interface +func (t ISOTime) MarshalJSON() ([]byte, error) { + if reflect.ValueOf(t).IsZero() { + return []byte(`null`), nil + } + + if y := time.Time(t).Year(); y < 0 || y >= 10000 { + // ISO 8901 uses 4 digits for the years + return nil, errors.New("json: ISOTime year outside of range [0,9999]") + } + + b := make([]byte, 0, len(iso8601)+2) + b = append(b, '"') + b = time.Time(t).AppendFormat(b, iso8601) + b = append(b, '"') + + return b, nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (t *ISOTime) UnmarshalJSON(data []byte) error { + // Ignore null, like in the main JSON package + if string(data) == "null" { + return nil + } + + isotime, err := time.Parse(`"`+iso8601+`"`, string(data)) + *t = ISOTime(isotime) + + return err +} + +// EncodeValues implements the query.Encoder interface +func (t *ISOTime) EncodeValues(key string, v *url.Values) error { + if t == nil || (time.Time(*t)).IsZero() { + return nil + } + v.Add(key, t.String()) + return nil +} + +// String implements the Stringer interface +func (t ISOTime) String() string { + return time.Time(t).Format(iso8601) +} + +// LinkTypeValue represents a release link type. +type LinkTypeValue string + +// List of available release link types +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/releases/links.html#create-a-release-link +const ( + ImageLinkType LinkTypeValue = "image" + OtherLinkType LinkTypeValue = "other" + PackageLinkType LinkTypeValue = "package" + RunbookLinkType LinkTypeValue = "runbook" +) + +// LinkType is a helper routine that allocates a new LinkType value +// to store v and returns a pointer to it. +func LinkType(v LinkTypeValue) *LinkTypeValue { + p := new(LinkTypeValue) + *p = v + return p +} + +// LicenseApprovalStatusValue describe the approval statuses of a license. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/managed_licenses.html +type LicenseApprovalStatusValue string + +// List of available license approval statuses. +const ( + LicenseApproved LicenseApprovalStatusValue = "approved" + LicenseBlacklisted LicenseApprovalStatusValue = "blacklisted" + LicenseAllowed LicenseApprovalStatusValue = "allowed" + LicenseDenied LicenseApprovalStatusValue = "denied" +) + +// LicenseApprovalStatus is a helper routine that allocates a new license +// approval status value to store v and returns a pointer to it. +func LicenseApprovalStatus(v LicenseApprovalStatusValue) *LicenseApprovalStatusValue { + p := new(LicenseApprovalStatusValue) + *p = v + return p +} + +// MergeMethodValue represents a project merge type within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#project-merge-method +type MergeMethodValue string + +// List of available merge type +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#project-merge-method +const ( + NoFastForwardMerge MergeMethodValue = "merge" + FastForwardMerge MergeMethodValue = "ff" + RebaseMerge MergeMethodValue = "rebase_merge" +) + +// MergeMethod is a helper routine that allocates a new MergeMethod +// to sotre v and returns a pointer to it. +func MergeMethod(v MergeMethodValue) *MergeMethodValue { + p := new(MergeMethodValue) + *p = v + return p +} + +// NoteTypeValue represents the type of a Note. +type NoteTypeValue string + +// List of available note types. +const ( + DiffNote NoteTypeValue = "DiffNote" + DiscussionNote NoteTypeValue = "DiscussionNote" + GenericNote NoteTypeValue = "Note" + LegacyDiffNote NoteTypeValue = "LegacyDiffNote" +) + +// NoteType is a helper routine that allocates a new NoteTypeValue to +// store v and returns a pointer to it. +func NoteType(v NoteTypeValue) *NoteTypeValue { + p := new(NoteTypeValue) + *p = v + return p +} + +// NotificationLevelValue represents a notification level. +type NotificationLevelValue int + +// String implements the fmt.Stringer interface. +func (l NotificationLevelValue) String() string { + return notificationLevelNames[l] +} + +// MarshalJSON implements the json.Marshaler interface. +func (l NotificationLevelValue) MarshalJSON() ([]byte, error) { + return json.Marshal(l.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *NotificationLevelValue) UnmarshalJSON(data []byte) error { + var raw interface{} + if err := json.Unmarshal(data, &raw); err != nil { + return err + } + + switch raw := raw.(type) { + case float64: + *l = NotificationLevelValue(raw) + case string: + *l = notificationLevelTypes[raw] + case nil: + // No action needed. + default: + return fmt.Errorf("json: cannot unmarshal %T into Go value of type %T", raw, *l) + } + + return nil +} + +// List of valid notification levels. +const ( + DisabledNotificationLevel NotificationLevelValue = iota + ParticipatingNotificationLevel + WatchNotificationLevel + GlobalNotificationLevel + MentionNotificationLevel + CustomNotificationLevel +) + +var notificationLevelNames = [...]string{ + "disabled", + "participating", + "watch", + "global", + "mention", + "custom", +} + +var notificationLevelTypes = map[string]NotificationLevelValue{ + "disabled": DisabledNotificationLevel, + "participating": ParticipatingNotificationLevel, + "watch": WatchNotificationLevel, + "global": GlobalNotificationLevel, + "mention": MentionNotificationLevel, + "custom": CustomNotificationLevel, +} + +// NotificationLevel is a helper routine that allocates a new NotificationLevelValue +// to store v and returns a pointer to it. +func NotificationLevel(v NotificationLevelValue) *NotificationLevelValue { + p := new(NotificationLevelValue) + *p = v + return p +} + +// ProjectCreationLevelValue represents a project creation level within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +type ProjectCreationLevelValue string + +// List of available project creation levels. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +const ( + NoOneProjectCreation ProjectCreationLevelValue = "noone" + MaintainerProjectCreation ProjectCreationLevelValue = "maintainer" + DeveloperProjectCreation ProjectCreationLevelValue = "developer" +) + +// ProjectCreationLevel is a helper routine that allocates a new ProjectCreationLevelValue +// to store v and returns a pointer to it. +func ProjectCreationLevel(v ProjectCreationLevelValue) *ProjectCreationLevelValue { + p := new(ProjectCreationLevelValue) + *p = v + return p +} + +// SharedRunnersSettingValue determines whether shared runners are enabled for a +// group’s subgroups and projects. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#options-for-shared_runners_setting +type SharedRunnersSettingValue string + +// List of available shared runner setting levels. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/groups.html#options-for-shared_runners_setting +const ( + EnabledSharedRunnersSettingValue SharedRunnersSettingValue = "enabled" + DisabledWithOverrideSharedRunnersSettingValue SharedRunnersSettingValue = "disabled_with_override" + DisabledAndUnoverridableSharedRunnersSettingValue SharedRunnersSettingValue = "disabled_and_unoverridable" +) + +// SharedRunnersSetting is a helper routine that allocates a new SharedRunnersSettingValue +// to store v and returns a pointer to it. +func SharedRunnersSetting(v SharedRunnersSettingValue) *SharedRunnersSettingValue { + p := new(SharedRunnersSettingValue) + *p = v + return p +} + +// SubGroupCreationLevelValue represents a sub group creation level within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +type SubGroupCreationLevelValue string + +// List of available sub group creation levels. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +const ( + OwnerSubGroupCreationLevelValue SubGroupCreationLevelValue = "owner" + MaintainerSubGroupCreationLevelValue SubGroupCreationLevelValue = "maintainer" +) + +// SubGroupCreationLevel is a helper routine that allocates a new SubGroupCreationLevelValue +// to store v and returns a pointer to it. +func SubGroupCreationLevel(v SubGroupCreationLevelValue) *SubGroupCreationLevelValue { + p := new(SubGroupCreationLevelValue) + *p = v + return p +} + +// SquashOptionValue represents a squash optional level within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#create-project +type SquashOptionValue string + +// List of available squash options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#create-project +const ( + SquashOptionNever SquashOptionValue = "never" + SquashOptionAlways SquashOptionValue = "always" + SquashOptionDefaultOff SquashOptionValue = "default_off" + SquashOptionDefaultOn SquashOptionValue = "default_on" +) + +// SquashOption is a helper routine that allocates a new SquashOptionValue +// to store s and returns a pointer to it. +func SquashOption(s SquashOptionValue) *SquashOptionValue { + p := new(SquashOptionValue) + *p = s + return p +} + +// TasksCompletionStatus represents tasks of the issue/merge request. +type TasksCompletionStatus struct { + Count int `json:"count"` + CompletedCount int `json:"completed_count"` +} + +// TodoAction represents the available actions that can be performed on a todo. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/todos.html +type TodoAction string + +// The available todo actions. +const ( + TodoAssigned TodoAction = "assigned" + TodoMentioned TodoAction = "mentioned" + TodoBuildFailed TodoAction = "build_failed" + TodoMarked TodoAction = "marked" + TodoApprovalRequired TodoAction = "approval_required" + TodoDirectlyAddressed TodoAction = "directly_addressed" +) + +// TodoTargetType represents the available target that can be linked to a todo. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/todos.html +type TodoTargetType string + +const ( + TodoTargetAlertManagement TodoTargetType = "AlertManagement::Alert" + TodoTargetDesignManagement TodoTargetType = "DesignManagement::Design" + TodoTargetIssue TodoTargetType = "Issue" + TodoTargetMergeRequest TodoTargetType = "MergeRequest" +) + +// UploadType represents the available upload types. +type UploadType string + +// The available upload types. +const ( + UploadAvatar UploadType = "avatar" + UploadFile UploadType = "file" +) + +// VariableTypeValue represents a variable type within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +type VariableTypeValue string + +// List of available variable types. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +const ( + EnvVariableType VariableTypeValue = "env_var" + FileVariableType VariableTypeValue = "file" +) + +// VariableType is a helper routine that allocates a new VariableTypeValue +// to store v and returns a pointer to it. +func VariableType(v VariableTypeValue) *VariableTypeValue { + p := new(VariableTypeValue) + *p = v + return p +} + +// VisibilityValue represents a visibility level within GitLab. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +type VisibilityValue string + +// List of available visibility levels. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/ +const ( + PrivateVisibility VisibilityValue = "private" + InternalVisibility VisibilityValue = "internal" + PublicVisibility VisibilityValue = "public" +) + +// Visibility is a helper routine that allocates a new VisibilityValue +// to store v and returns a pointer to it. +func Visibility(v VisibilityValue) *VisibilityValue { + p := new(VisibilityValue) + *p = v + return p +} + +// WikiFormatValue represents the available wiki formats. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/wikis.html +type WikiFormatValue string + +// The available wiki formats. +const ( + WikiFormatMarkdown WikiFormatValue = "markdown" + WikiFormatRDoc WikiFormatValue = "rdoc" + WikiFormatASCIIDoc WikiFormatValue = "asciidoc" + WikiFormatOrg WikiFormatValue = "org" +) + +// WikiFormat is a helper routine that allocates a new WikiFormatValue +// to store v and returns a pointer to it. +func WikiFormat(v WikiFormatValue) *WikiFormatValue { + p := new(WikiFormatValue) + *p = v + return p +} + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + p := new(bool) + *p = v + return p +} + +// Int is a helper routine that allocates a new int value +// to store v and returns a pointer to it. +func Int(v int) *int { + p := new(int) + *p = v + return p +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + p := new(string) + *p = v + return p +} + +// Time is a helper routine that allocates a new time.Time value +// to store v and returns a pointer to it. +func Time(v time.Time) *time.Time { + p := new(time.Time) + *p = v + return p +} + +// BoolValue is a boolean value with advanced json unmarshaling features. +type BoolValue bool + +// UnmarshalJSON allows 1, 0, "true", and "false" to be considered as boolean values +// Needed for: +// https://gitlab.com/gitlab-org/gitlab-ce/issues/50122 +// https://gitlab.com/gitlab-org/gitlab/-/issues/233941 +// https://github.com/gitlabhq/terraform-provider-gitlab/issues/348 +func (t *BoolValue) UnmarshalJSON(b []byte) error { + switch string(b) { + case `"1"`: + *t = true + return nil + case `"0"`: + *t = false + return nil + case `"true"`: + *t = true + return nil + case `"false"`: + *t = false + return nil + default: + var v bool + err := json.Unmarshal(b, &v) + *t = BoolValue(v) + return err + } +} diff --git a/vendor/github.com/xanzy/go-gitlab/users.go b/vendor/github.com/xanzy/go-gitlab/users.go new file mode 100644 index 0000000000..c189e35531 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/users.go @@ -0,0 +1,1375 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "errors" + "fmt" + "net" + "net/http" + "time" +) + +// List a couple of standard errors. +var ( + ErrUserActivatePrevented = errors.New("Cannot activate a user that is blocked by admin or by LDAP synchronization") + ErrUserApprovePrevented = errors.New("Cannot approve a user that is blocked by admin or by LDAP synchronization") + ErrUserBlockPrevented = errors.New("Cannot block a user that is already blocked by LDAP synchronization") + ErrUserConflict = errors.New("User does not have a pending request") + ErrUserDeactivatePrevented = errors.New("Cannot deactivate a user that is blocked by admin or by LDAP synchronization") + ErrUserDisableTwoFactorPrevented = errors.New("Cannot disable two factor authentication if not authenticated as administrator") + ErrUserNotFound = errors.New("User does not exist") + ErrUserRejectPrevented = errors.New("Cannot reject a user if not authenticated as administrator") + ErrUserTwoFactorNotEnabled = errors.New("Cannot disable two factor authentication if not enabled") + ErrUserUnblockPrevented = errors.New("Cannot unblock a user that is blocked by LDAP synchronization") +) + +// UsersService handles communication with the user related methods of +// the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html +type UsersService struct { + client *Client +} + +// BasicUser included in other service responses (such as merge requests, pipelines, etc). +type BasicUser struct { + ID int `json:"id"` + Username string `json:"username"` + Name string `json:"name"` + State string `json:"state"` + CreatedAt *time.Time `json:"created_at"` + AvatarURL string `json:"avatar_url"` + WebURL string `json:"web_url"` +} + +// User represents a GitLab user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html +type User struct { + ID int `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Name string `json:"name"` + State string `json:"state"` + WebURL string `json:"web_url"` + CreatedAt *time.Time `json:"created_at"` + Bio string `json:"bio"` + Bot bool `json:"bot"` + Location string `json:"location"` + PublicEmail string `json:"public_email"` + Skype string `json:"skype"` + Linkedin string `json:"linkedin"` + Twitter string `json:"twitter"` + WebsiteURL string `json:"website_url"` + Organization string `json:"organization"` + JobTitle string `json:"job_title"` + ExternUID string `json:"extern_uid"` + Provider string `json:"provider"` + ThemeID int `json:"theme_id"` + LastActivityOn *ISOTime `json:"last_activity_on"` + ColorSchemeID int `json:"color_scheme_id"` + IsAdmin bool `json:"is_admin"` + AvatarURL string `json:"avatar_url"` + CanCreateGroup bool `json:"can_create_group"` + CanCreateProject bool `json:"can_create_project"` + ProjectsLimit int `json:"projects_limit"` + CurrentSignInAt *time.Time `json:"current_sign_in_at"` + CurrentSignInIP *net.IP `json:"current_sign_in_ip"` + LastSignInAt *time.Time `json:"last_sign_in_at"` + LastSignInIP *net.IP `json:"last_sign_in_ip"` + ConfirmedAt *time.Time `json:"confirmed_at"` + TwoFactorEnabled bool `json:"two_factor_enabled"` + Note string `json:"note"` + Identities []*UserIdentity `json:"identities"` + External bool `json:"external"` + PrivateProfile bool `json:"private_profile"` + SharedRunnersMinutesLimit int `json:"shared_runners_minutes_limit"` + ExtraSharedRunnersMinutesLimit int `json:"extra_shared_runners_minutes_limit"` + UsingLicenseSeat bool `json:"using_license_seat"` + CustomAttributes []*CustomAttribute `json:"custom_attributes"` + NamespaceID int `json:"namespace_id"` +} + +// UserIdentity represents a user identity. +type UserIdentity struct { + Provider string `json:"provider"` + ExternUID string `json:"extern_uid"` +} + +// ListUsersOptions represents the available ListUsers() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-users +type ListUsersOptions struct { + ListOptions + Active *bool `url:"active,omitempty" json:"active,omitempty"` + Blocked *bool `url:"blocked,omitempty" json:"blocked,omitempty"` + ExcludeInternal *bool `url:"exclude_internal,omitempty" json:"exclude_internal,omitempty"` + ExcludeExternal *bool `url:"exclude_external,omitempty" json:"exclude_external,omitempty"` + + // The options below are only available for admins. + Search *string `url:"search,omitempty" json:"search,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + ExternalUID *string `url:"extern_uid,omitempty" json:"extern_uid,omitempty"` + Provider *string `url:"provider,omitempty" json:"provider,omitempty"` + CreatedBefore *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"` + CreatedAfter *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"` + OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"` + Sort *string `url:"sort,omitempty" json:"sort,omitempty"` + TwoFactor *string `url:"two_factor,omitempty" json:"two_factor,omitempty"` + Admins *bool `url:"admins,omitempty" json:"admins,omitempty"` + External *bool `url:"external,omitempty" json:"external,omitempty"` + WithoutProjects *bool `url:"without_projects,omitempty" json:"without_projects,omitempty"` + WithCustomAttributes *bool `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"` + WithoutProjectBots *bool `url:"without_project_bots,omitempty" json:"without_project_bots,omitempty"` +} + +// ListUsers gets a list of users. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-users +func (s *UsersService) ListUsers(opt *ListUsersOptions, options ...RequestOptionFunc) ([]*User, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "users", opt, options) + if err != nil { + return nil, nil, err + } + + var usr []*User + resp, err := s.client.Do(req, &usr) + if err != nil { + return nil, resp, err + } + + return usr, resp, err +} + +// GetUsersOptions represents the available GetUser() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#single-user +type GetUsersOptions struct { + WithCustomAttributes *bool `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"` +} + +// GetUser gets a single user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#single-user +func (s *UsersService) GetUser(user int, opt GetUsersOptions, options ...RequestOptionFunc) (*User, *Response, error) { + u := fmt.Sprintf("users/%d", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + usr := new(User) + resp, err := s.client.Do(req, usr) + if err != nil { + return nil, resp, err + } + + return usr, resp, err +} + +// CreateUserOptions represents the available CreateUser() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#user-creation +type CreateUserOptions struct { + Email *string `url:"email,omitempty" json:"email,omitempty"` + Password *string `url:"password,omitempty" json:"password,omitempty"` + ResetPassword *bool `url:"reset_password,omitempty" json:"reset_password,omitempty"` + ForceRandomPassword *bool `url:"force_random_password,omitempty" json:"force_random_password,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + Skype *string `url:"skype,omitempty" json:"skype,omitempty"` + Linkedin *string `url:"linkedin,omitempty" json:"linkedin,omitempty"` + Twitter *string `url:"twitter,omitempty" json:"twitter,omitempty"` + WebsiteURL *string `url:"website_url,omitempty" json:"website_url,omitempty"` + Organization *string `url:"organization,omitempty" json:"organization,omitempty"` + JobTitle *string `url:"job_title,omitempty" json:"job_title,omitempty"` + ProjectsLimit *int `url:"projects_limit,omitempty" json:"projects_limit,omitempty"` + ExternUID *string `url:"extern_uid,omitempty" json:"extern_uid,omitempty"` + Provider *string `url:"provider,omitempty" json:"provider,omitempty"` + Bio *string `url:"bio,omitempty" json:"bio,omitempty"` + Location *string `url:"location,omitempty" json:"location,omitempty"` + Admin *bool `url:"admin,omitempty" json:"admin,omitempty"` + CanCreateGroup *bool `url:"can_create_group,omitempty" json:"can_create_group,omitempty"` + SkipConfirmation *bool `url:"skip_confirmation,omitempty" json:"skip_confirmation,omitempty"` + External *bool `url:"external,omitempty" json:"external,omitempty"` + PrivateProfile *bool `url:"private_profile,omitempty" json:"private_profile,omitempty"` + Note *string `url:"note,omitempty" json:"note,omitempty"` + ThemeID *int `url:"theme_id,omitempty" json:"theme_id,omitempty"` +} + +// CreateUser creates a new user. Note only administrators can create new users. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#user-creation +func (s *UsersService) CreateUser(opt *CreateUserOptions, options ...RequestOptionFunc) (*User, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "users", opt, options) + if err != nil { + return nil, nil, err + } + + usr := new(User) + resp, err := s.client.Do(req, usr) + if err != nil { + return nil, resp, err + } + + return usr, resp, err +} + +// ModifyUserOptions represents the available ModifyUser() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#user-modification +type ModifyUserOptions struct { + Email *string `url:"email,omitempty" json:"email,omitempty"` + Password *string `url:"password,omitempty" json:"password,omitempty"` + Username *string `url:"username,omitempty" json:"username,omitempty"` + Name *string `url:"name,omitempty" json:"name,omitempty"` + Skype *string `url:"skype,omitempty" json:"skype,omitempty"` + Linkedin *string `url:"linkedin,omitempty" json:"linkedin,omitempty"` + Twitter *string `url:"twitter,omitempty" json:"twitter,omitempty"` + WebsiteURL *string `url:"website_url,omitempty" json:"website_url,omitempty"` + Organization *string `url:"organization,omitempty" json:"organization,omitempty"` + JobTitle *string `url:"job_title,omitempty" json:"job_title,omitempty"` + ProjectsLimit *int `url:"projects_limit,omitempty" json:"projects_limit,omitempty"` + ExternUID *string `url:"extern_uid,omitempty" json:"extern_uid,omitempty"` + Provider *string `url:"provider,omitempty" json:"provider,omitempty"` + Bio *string `url:"bio,omitempty" json:"bio,omitempty"` + Location *string `url:"location,omitempty" json:"location,omitempty"` + Admin *bool `url:"admin,omitempty" json:"admin,omitempty"` + CanCreateGroup *bool `url:"can_create_group,omitempty" json:"can_create_group,omitempty"` + SkipReconfirmation *bool `url:"skip_reconfirmation,omitempty" json:"skip_reconfirmation,omitempty"` + External *bool `url:"external,omitempty" json:"external,omitempty"` + PrivateProfile *bool `url:"private_profile,omitempty" json:"private_profile,omitempty"` + Note *string `url:"note,omitempty" json:"note,omitempty"` + ThemeID *int `url:"theme_id,omitempty" json:"theme_id,omitempty"` + PublicEmail *string `url:"public_email,omitempty" json:"public_email,omitempty"` + CommitEmail *string `url:"commit_email,omitempty" json:"commit_email,omitempty"` +} + +// ModifyUser modifies an existing user. Only administrators can change attributes +// of a user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#user-modification +func (s *UsersService) ModifyUser(user int, opt *ModifyUserOptions, options ...RequestOptionFunc) (*User, *Response, error) { + u := fmt.Sprintf("users/%d", user) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + usr := new(User) + resp, err := s.client.Do(req, usr) + if err != nil { + return nil, resp, err + } + + return usr, resp, err +} + +// DeleteUser deletes a user. Available only for administrators. This is an +// idempotent function, calling this function for a non-existent user id still +// returns a status code 200 OK. The JSON response differs if the user was +// actually deleted or not. In the former the user is returned and in the +// latter not. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#user-deletion +func (s *UsersService) DeleteUser(user int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("users/%d", user) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// CurrentUser gets currently authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-current-user +func (s *UsersService) CurrentUser(options ...RequestOptionFunc) (*User, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "user", nil, options) + if err != nil { + return nil, nil, err + } + + usr := new(User) + resp, err := s.client.Do(req, usr) + if err != nil { + return nil, resp, err + } + + return usr, resp, err +} + +// UserStatus represents the current status of a user +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#user-status +type UserStatus struct { + Emoji string `json:"emoji"` + Availability AvailabilityValue `json:"availability"` + Message string `json:"message"` + MessageHTML string `json:"message_html"` +} + +// CurrentUserStatus retrieves the user status +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#user-status +func (s *UsersService) CurrentUserStatus(options ...RequestOptionFunc) (*UserStatus, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "user/status", nil, options) + if err != nil { + return nil, nil, err + } + + status := new(UserStatus) + resp, err := s.client.Do(req, status) + if err != nil { + return nil, resp, err + } + + return status, resp, err +} + +// GetUserStatus retrieves a user's status +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#get-the-status-of-a-user +func (s *UsersService) GetUserStatus(user int, options ...RequestOptionFunc) (*UserStatus, *Response, error) { + u := fmt.Sprintf("users/%d/status", user) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + status := new(UserStatus) + resp, err := s.client.Do(req, status) + if err != nil { + return nil, resp, err + } + + return status, resp, err +} + +// UserStatusOptions represents the options required to set the status +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#set-user-status +type UserStatusOptions struct { + Emoji *string `url:"emoji,omitempty" json:"emoji,omitempty"` + Availability *AvailabilityValue `url:"availability,omitempty" json:"availability,omitempty"` + Message *string `url:"message,omitempty" json:"message,omitempty"` +} + +// SetUserStatus sets the user's status +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#set-user-status +func (s *UsersService) SetUserStatus(opt *UserStatusOptions, options ...RequestOptionFunc) (*UserStatus, *Response, error) { + req, err := s.client.NewRequest(http.MethodPut, "user/status", opt, options) + if err != nil { + return nil, nil, err + } + + status := new(UserStatus) + resp, err := s.client.Do(req, status) + if err != nil { + return nil, resp, err + } + + return status, resp, err +} + +// SSHKey represents a SSH key. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-ssh-keys +type SSHKey struct { + ID int `json:"id"` + Title string `json:"title"` + Key string `json:"key"` + CreatedAt *time.Time `json:"created_at"` + ExpiresAt *time.Time `json:"expires_at"` +} + +// ListSSHKeys gets a list of currently authenticated user's SSH keys. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-ssh-keys +func (s *UsersService) ListSSHKeys(options ...RequestOptionFunc) ([]*SSHKey, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "user/keys", nil, options) + if err != nil { + return nil, nil, err + } + + var k []*SSHKey + resp, err := s.client.Do(req, &k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// ListSSHKeysForUserOptions represents the available ListSSHKeysForUser() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#list-ssh-keys-for-user +type ListSSHKeysForUserOptions ListOptions + +// ListSSHKeysForUser gets a list of a specified user's SSH keys. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#list-ssh-keys-for-user +func (s *UsersService) ListSSHKeysForUser(uid interface{}, opt *ListSSHKeysForUserOptions, options ...RequestOptionFunc) ([]*SSHKey, *Response, error) { + user, err := parseID(uid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("users/%s/keys", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var k []*SSHKey + resp, err := s.client.Do(req, &k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// GetSSHKey gets a single key. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#single-ssh-key +func (s *UsersService) GetSSHKey(key int, options ...RequestOptionFunc) (*SSHKey, *Response, error) { + u := fmt.Sprintf("user/keys/%d", key) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + k := new(SSHKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// GetSSHKeyForUser gets a single key for a given user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#single-ssh-key-for-given-user +func (s *UsersService) GetSSHKeyForUser(user int, key int, options ...RequestOptionFunc) (*SSHKey, *Response, error) { + u := fmt.Sprintf("users/%d/keys/%d", user, key) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + k := new(SSHKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// AddSSHKeyOptions represents the available AddSSHKey() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-ssh-key +type AddSSHKeyOptions struct { + Title *string `url:"title,omitempty" json:"title,omitempty"` + Key *string `url:"key,omitempty" json:"key,omitempty"` + ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// AddSSHKey creates a new key owned by the currently authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-ssh-key +func (s *UsersService) AddSSHKey(opt *AddSSHKeyOptions, options ...RequestOptionFunc) (*SSHKey, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "user/keys", opt, options) + if err != nil { + return nil, nil, err + } + + k := new(SSHKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// AddSSHKeyForUser creates new key owned by specified user. Available only for +// admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-ssh-key-for-user +func (s *UsersService) AddSSHKeyForUser(user int, opt *AddSSHKeyOptions, options ...RequestOptionFunc) (*SSHKey, *Response, error) { + u := fmt.Sprintf("users/%d/keys", user) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + k := new(SSHKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// DeleteSSHKey deletes key owned by currently authenticated user. This is an +// idempotent function and calling it on a key that is already deleted or not +// available results in 200 OK. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#delete-ssh-key-for-current-user +func (s *UsersService) DeleteSSHKey(key int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("user/keys/%d", key) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteSSHKeyForUser deletes key owned by a specified user. Available only +// for admin. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#delete-ssh-key-for-given-user +func (s *UsersService) DeleteSSHKeyForUser(user, key int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("users/%d/keys/%d", user, key) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// GPGKey represents a GPG key. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-all-gpg-keys +type GPGKey struct { + ID int `json:"id"` + Key string `json:"key"` + CreatedAt *time.Time `json:"created_at"` +} + +// ListGPGKeys gets a list of currently authenticated user’s GPG keys. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-all-gpg-keys +func (s *UsersService) ListGPGKeys(options ...RequestOptionFunc) ([]*GPGKey, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "user/gpg_keys", nil, options) + if err != nil { + return nil, nil, err + } + + var ks []*GPGKey + resp, err := s.client.Do(req, &ks) + if err != nil { + return nil, resp, err + } + + return ks, resp, err +} + +// GetGPGKey gets a specific GPG key of currently authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#get-a-specific-gpg-key +func (s *UsersService) GetGPGKey(key int, options ...RequestOptionFunc) (*GPGKey, *Response, error) { + u := fmt.Sprintf("user/gpg_keys/%d", key) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + k := new(GPGKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// AddGPGKeyOptions represents the available AddGPGKey() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-a-gpg-key +type AddGPGKeyOptions struct { + Key *string `url:"key,omitempty" json:"key,omitempty"` +} + +// AddGPGKey creates a new GPG key owned by the currently authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-a-gpg-key +func (s *UsersService) AddGPGKey(opt *AddGPGKeyOptions, options ...RequestOptionFunc) (*GPGKey, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "user/gpg_keys", opt, options) + if err != nil { + return nil, nil, err + } + + k := new(GPGKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// DeleteGPGKey deletes a GPG key owned by currently authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#delete-a-gpg-key +func (s *UsersService) DeleteGPGKey(key int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("user/gpg_keys/%d", key) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// ListGPGKeysForUser gets a list of a specified user’s GPG keys. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#list-all-gpg-keys-for-given-user +func (s *UsersService) ListGPGKeysForUser(user int, options ...RequestOptionFunc) ([]*GPGKey, *Response, error) { + u := fmt.Sprintf("users/%d/gpg_keys", user) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var ks []*GPGKey + resp, err := s.client.Do(req, &ks) + if err != nil { + return nil, resp, err + } + + return ks, resp, err +} + +// GetGPGKeyForUser gets a specific GPG key for a given user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#get-a-specific-gpg-key-for-a-given-user +func (s *UsersService) GetGPGKeyForUser(user, key int, options ...RequestOptionFunc) (*GPGKey, *Response, error) { + u := fmt.Sprintf("users/%d/gpg_keys/%d", user, key) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + k := new(GPGKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// AddGPGKeyForUser creates new GPG key owned by the specified user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#add-a-gpg-key-for-a-given-user +func (s *UsersService) AddGPGKeyForUser(user int, opt *AddGPGKeyOptions, options ...RequestOptionFunc) (*GPGKey, *Response, error) { + u := fmt.Sprintf("users/%d/gpg_keys", user) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + k := new(GPGKey) + resp, err := s.client.Do(req, k) + if err != nil { + return nil, resp, err + } + + return k, resp, err +} + +// DeleteGPGKeyForUser deletes a GPG key owned by a specified user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#delete-a-gpg-key-for-a-given-user +func (s *UsersService) DeleteGPGKeyForUser(user, key int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("users/%d/gpg_keys/%d", user, key) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// Email represents an Email. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-emails +type Email struct { + ID int `json:"id"` + Email string `json:"email"` + ConfirmedAt *time.Time `json:"confirmed_at"` +} + +// ListEmails gets a list of currently authenticated user's Emails. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#list-emails +func (s *UsersService) ListEmails(options ...RequestOptionFunc) ([]*Email, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "user/emails", nil, options) + if err != nil { + return nil, nil, err + } + + var e []*Email + resp, err := s.client.Do(req, &e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// ListEmailsForUserOptions represents the available ListEmailsForUser() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#list-emails-for-user +type ListEmailsForUserOptions ListOptions + +// ListEmailsForUser gets a list of a specified user's Emails. Available +// only for admin +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#list-emails-for-user +func (s *UsersService) ListEmailsForUser(user int, opt *ListEmailsForUserOptions, options ...RequestOptionFunc) ([]*Email, *Response, error) { + u := fmt.Sprintf("users/%d/emails", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var e []*Email + resp, err := s.client.Do(req, &e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// GetEmail gets a single email. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#single-email +func (s *UsersService) GetEmail(email int, options ...RequestOptionFunc) (*Email, *Response, error) { + u := fmt.Sprintf("user/emails/%d", email) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + e := new(Email) + resp, err := s.client.Do(req, e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// AddEmailOptions represents the available AddEmail() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-email +type AddEmailOptions struct { + Email *string `url:"email,omitempty" json:"email,omitempty"` + SkipConfirmation *bool `url:"skip_confirmation,omitempty" json:"skip_confirmation,omitempty"` +} + +// AddEmail creates a new email owned by the currently authenticated user. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-email +func (s *UsersService) AddEmail(opt *AddEmailOptions, options ...RequestOptionFunc) (*Email, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "user/emails", opt, options) + if err != nil { + return nil, nil, err + } + + e := new(Email) + resp, err := s.client.Do(req, e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// AddEmailForUser creates new email owned by specified user. Available only for +// admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#add-email-for-user +func (s *UsersService) AddEmailForUser(user int, opt *AddEmailOptions, options ...RequestOptionFunc) (*Email, *Response, error) { + u := fmt.Sprintf("users/%d/emails", user) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + e := new(Email) + resp, err := s.client.Do(req, e) + if err != nil { + return nil, resp, err + } + + return e, resp, err +} + +// DeleteEmail deletes email owned by currently authenticated user. This is an +// idempotent function and calling it on a key that is already deleted or not +// available results in 200 OK. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#delete-email-for-current-user +func (s *UsersService) DeleteEmail(email int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("user/emails/%d", email) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// DeleteEmailForUser deletes email owned by a specified user. Available only +// for admin. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#delete-email-for-given-user +func (s *UsersService) DeleteEmailForUser(user, email int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("users/%d/emails/%d", user, email) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// BlockUser blocks the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#block-user +func (s *UsersService) BlockUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/block", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 201: + return nil + case 403: + return ErrUserBlockPrevented + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// UnblockUser unblocks the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#unblock-user +func (s *UsersService) UnblockUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/unblock", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 201: + return nil + case 403: + return ErrUserUnblockPrevented + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// BanUser bans the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#ban-user +func (s *UsersService) BanUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/ban", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 201: + return nil + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// UnbanUser unbans the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#unban-user +func (s *UsersService) UnbanUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/unban", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 201: + return nil + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// DeactivateUser deactivate the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#deactivate-user +func (s *UsersService) DeactivateUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/deactivate", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 201: + return nil + case 403: + return ErrUserDeactivatePrevented + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// ActivateUser activate the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#activate-user +func (s *UsersService) ActivateUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/activate", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 201: + return nil + case 403: + return ErrUserActivatePrevented + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// ApproveUser approve the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#approve-user +func (s *UsersService) ApproveUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/approve", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 201: + return nil + case 403: + return ErrUserApprovePrevented + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// RejectUser reject the specified user. Available only for admin. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#reject-user +func (s *UsersService) RejectUser(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/reject", user) + + req, err := s.client.NewRequest(http.MethodPost, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 200: + return nil + case 403: + return ErrUserRejectPrevented + case 404: + return ErrUserNotFound + case 409: + return ErrUserConflict + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} + +// ImpersonationToken represents an impersonation token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#get-all-impersonation-tokens-of-a-user +type ImpersonationToken struct { + ID int `json:"id"` + Name string `json:"name"` + Active bool `json:"active"` + Token string `json:"token"` + Scopes []string `json:"scopes"` + Revoked bool `json:"revoked"` + CreatedAt *time.Time `json:"created_at"` + ExpiresAt *ISOTime `json:"expires_at"` +} + +// GetAllImpersonationTokensOptions represents the available +// GetAllImpersonationTokens() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#get-all-impersonation-tokens-of-a-user +type GetAllImpersonationTokensOptions struct { + ListOptions + State *string `url:"state,omitempty" json:"state,omitempty"` +} + +// GetAllImpersonationTokens retrieves all impersonation tokens of a user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#get-all-impersonation-tokens-of-a-user +func (s *UsersService) GetAllImpersonationTokens(user int, opt *GetAllImpersonationTokensOptions, options ...RequestOptionFunc) ([]*ImpersonationToken, *Response, error) { + u := fmt.Sprintf("users/%d/impersonation_tokens", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ts []*ImpersonationToken + resp, err := s.client.Do(req, &ts) + if err != nil { + return nil, resp, err + } + + return ts, resp, err +} + +// GetImpersonationToken retrieves an impersonation token of a user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#get-an-impersonation-token-of-a-user +func (s *UsersService) GetImpersonationToken(user, token int, options ...RequestOptionFunc) (*ImpersonationToken, *Response, error) { + u := fmt.Sprintf("users/%d/impersonation_tokens/%d", user, token) + + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + t := new(ImpersonationToken) + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// CreateImpersonationTokenOptions represents the available +// CreateImpersonationToken() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#create-an-impersonation-token +type CreateImpersonationTokenOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + Scopes *[]string `url:"scopes,omitempty" json:"scopes,omitempty"` + ExpiresAt *time.Time `url:"expires_at,omitempty" json:"expires_at,omitempty"` +} + +// CreateImpersonationToken creates an impersonation token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#create-an-impersonation-token +func (s *UsersService) CreateImpersonationToken(user int, opt *CreateImpersonationTokenOptions, options ...RequestOptionFunc) (*ImpersonationToken, *Response, error) { + u := fmt.Sprintf("users/%d/impersonation_tokens", user) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + t := new(ImpersonationToken) + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// RevokeImpersonationToken revokes an impersonation token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#revoke-an-impersonation-token +func (s *UsersService) RevokeImpersonationToken(user, token int, options ...RequestOptionFunc) (*Response, error) { + u := fmt.Sprintf("users/%d/impersonation_tokens/%d", user, token) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} + +// CreatePersonalAccessTokenOptions represents the available +// CreatePersonalAccessToken() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#create-a-personal-access-token +type CreatePersonalAccessTokenOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"` + Scopes *[]string `url:"scopes,omitempty" json:"scopes,omitempty"` +} + +// CreatePersonalAccessToken creates a personal access token. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#create-a-personal-access-token +func (s *UsersService) CreatePersonalAccessToken(user int, opt *CreatePersonalAccessTokenOptions, options ...RequestOptionFunc) (*PersonalAccessToken, *Response, error) { + u := fmt.Sprintf("users/%d/personal_access_tokens", user) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + t := new(PersonalAccessToken) + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// UserActivity represents an entry in the user/activities response +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#get-user-activities +type UserActivity struct { + Username string `json:"username"` + LastActivityOn *ISOTime `json:"last_activity_on"` +} + +// GetUserActivitiesOptions represents the options for GetUserActivities +// +// GitLap API docs: +// https://docs.gitlab.com/ee/api/users.html#get-user-activities +type GetUserActivitiesOptions struct { + ListOptions + From *ISOTime `url:"from,omitempty" json:"from,omitempty"` +} + +// GetUserActivities retrieves user activities (admin only) +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#get-user-activities +func (s *UsersService) GetUserActivities(opt *GetUserActivitiesOptions, options ...RequestOptionFunc) ([]*UserActivity, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "user/activities", opt, options) + if err != nil { + return nil, nil, err + } + + var t []*UserActivity + resp, err := s.client.Do(req, &t) + if err != nil { + return nil, resp, err + } + + return t, resp, err +} + +// UserMembership represents a membership of the user in a namespace or project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#user-memberships +type UserMembership struct { + SourceID int `json:"source_id"` + SourceName string `json:"source_name"` + SourceType string `json:"source_type"` + AccessLevel AccessLevelValue `json:"access_level"` +} + +// GetUserMembershipOptions represents the options available to query user memberships. +// +// GitLab API docs: +// ohttps://docs.gitlab.com/ee/api/users.html#user-memberships +type GetUserMembershipOptions struct { + ListOptions + Type *string `url:"type,omitempty" json:"type,omitempty"` +} + +// GetUserMemberships retrieves a list of the user's memberships. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#user-memberships +func (s *UsersService) GetUserMemberships(user int, opt *GetUserMembershipOptions, options ...RequestOptionFunc) ([]*UserMembership, *Response, error) { + u := fmt.Sprintf("users/%d/memberships", user) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var m []*UserMembership + resp, err := s.client.Do(req, &m) + if err != nil { + return nil, resp, err + } + + return m, resp, err +} + +// DisableTwoFactor disables two factor authentication for the specified user. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/users.html#disable-two-factor-authentication +func (s *UsersService) DisableTwoFactor(user int, options ...RequestOptionFunc) error { + u := fmt.Sprintf("users/%d/disable_two_factor", user) + + req, err := s.client.NewRequest(http.MethodPatch, u, nil, options) + if err != nil { + return err + } + + resp, err := s.client.Do(req, nil) + if err != nil && resp == nil { + return err + } + + switch resp.StatusCode { + case 204: + return nil + case 400: + return ErrUserTwoFactorNotEnabled + case 403: + return ErrUserDisableTwoFactorPrevented + case 404: + return ErrUserNotFound + default: + return fmt.Errorf("Received unexpected result code: %d", resp.StatusCode) + } +} diff --git a/vendor/github.com/xanzy/go-gitlab/validate.go b/vendor/github.com/xanzy/go-gitlab/validate.go new file mode 100644 index 0000000000..b17ee75a5c --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/validate.go @@ -0,0 +1,147 @@ +// +// Copyright 2021, Sander van Harmelen +// +// 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 gitlab + +import ( + "fmt" + "net/http" +) + +// ValidateService handles communication with the validation related methods of +// the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/lint.html +type ValidateService struct { + client *Client +} + +// LintResult represents the linting results. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/lint.html +type LintResult struct { + Status string `json:"status"` + Errors []string `json:"errors"` + Warnings []string `json:"warnings"` + MergedYaml string `json:"merged_yaml"` +} + +// ProjectLintResult represents the linting results by project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/lint.html#validate-a-projects-ci-configuration +type ProjectLintResult struct { + Valid bool `json:"valid"` + Errors []string `json:"errors"` + Warnings []string `json:"warnings"` + MergedYaml string `json:"merged_yaml"` +} + +// LintOptions represents the available Lint() options. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/lint.html#validate-the-ci-yaml-configuration +type LintOptions struct { + Content string `url:"content,omitempty" json:"content,omitempty"` + IncludeMergedYAML bool `url:"include_merged_yaml,omitempty" json:"include_merged_yaml,omitempty"` + IncludeJobs bool `url:"include_jobs,omitempty" json:"include_jobs,omitempty"` +} + +// Lint validates .gitlab-ci.yml content. +// +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/lint.html#validate-the-ci-yaml-configuration +func (s *ValidateService) Lint(opts *LintOptions, options ...RequestOptionFunc) (*LintResult, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, "ci/lint", &opts, options) + if err != nil { + return nil, nil, err + } + + l := new(LintResult) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, nil +} + +// ProjectNamespaceLintOptions represents the available ProjectNamespaceLint() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/lint.html#validate-a-ci-yaml-configuration-with-a-namespace +type ProjectNamespaceLintOptions struct { + Content *string `url:"content,omitempty" json:"content,omitempty"` + DryRun *bool `url:"dry_run,omitempty" json:"dry_run,omitempty"` +} + +// ProjectNamespaceLint validates .gitlab-ci.yml content by project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/lint.html#validate-a-ci-yaml-configuration-with-a-namespace +func (s *ValidateService) ProjectNamespaceLint(pid interface{}, opt *ProjectNamespaceLintOptions, options ...RequestOptionFunc) (*ProjectLintResult, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/ci/lint", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, &opt, options) + if err != nil { + return nil, nil, err + } + + l := new(ProjectLintResult) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, nil +} + +// ProjectLintOptions represents the available ProjectLint() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/lint.html#validate-a-projects-ci-configuration +type ProjectLintOptions struct { + DryRun *bool `url:"dry_run,omitempty" json:"dry_run,omitempty"` +} + +// ProjectLint validates .gitlab-ci.yml content by project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/lint.html#validate-a-projects-ci-configuration +func (s *ValidateService) ProjectLint(pid interface{}, opt *ProjectLintOptions, options ...RequestOptionFunc) (*ProjectLintResult, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/ci/lint", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, &opt, options) + if err != nil { + return nil, nil, err + } + + l := new(ProjectLintResult) + resp, err := s.client.Do(req, l) + if err != nil { + return nil, resp, err + } + + return l, resp, nil +} diff --git a/vendor/github.com/xanzy/go-gitlab/version.go b/vendor/github.com/xanzy/go-gitlab/version.go new file mode 100644 index 0000000000..e7331d5013 --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/version.go @@ -0,0 +1,58 @@ +// +// Copyright 2021, Andrea Funto' +// +// 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 gitlab + +import "net/http" + +// VersionService handles communication with the GitLab server instance to +// retrieve its version information via the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/version.html +type VersionService struct { + client *Client +} + +// Version represents a GitLab instance version. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/version.html +type Version struct { + Version string `json:"version"` + Revision string `json:"revision"` +} + +func (s Version) String() string { + return Stringify(s) +} + +// GetVersion gets a GitLab server instance version; it is only available to +// authenticated users. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/version.html +func (s *VersionService) GetVersion(options ...RequestOptionFunc) (*Version, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, "version", nil, options) + if err != nil { + return nil, nil, err + } + + v := new(Version) + resp, err := s.client.Do(req, v) + if err != nil { + return nil, resp, err + } + + return v, resp, err +} diff --git a/vendor/github.com/xanzy/go-gitlab/wikis.go b/vendor/github.com/xanzy/go-gitlab/wikis.go new file mode 100644 index 0000000000..73de1afddd --- /dev/null +++ b/vendor/github.com/xanzy/go-gitlab/wikis.go @@ -0,0 +1,204 @@ +// +// Copyright 2021, Stany MARCEL +// +// 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 gitlab + +import ( + "fmt" + "net/http" + "net/url" +) + +// WikisService handles communication with the wikis related methods of +// the Gitlab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/wikis.html +type WikisService struct { + client *Client +} + +// Wiki represents a GitLab wiki. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/wikis.html +type Wiki struct { + Content string `json:"content"` + Encoding string `json:"encoding"` + Format WikiFormatValue `json:"format"` + Slug string `json:"slug"` + Title string `json:"title"` +} + +func (w Wiki) String() string { + return Stringify(w) +} + +// ListWikisOptions represents the available ListWikis options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#list-wiki-pages +type ListWikisOptions struct { + WithContent *bool `url:"with_content,omitempty" json:"with_content,omitempty"` +} + +// ListWikis lists all pages of the wiki of the given project id. +// When with_content is set, it also returns the content of the pages. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#list-wiki-pages +func (s *WikisService) ListWikis(pid interface{}, opt *ListWikisOptions, options ...RequestOptionFunc) ([]*Wiki, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/wikis", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + var ws []*Wiki + resp, err := s.client.Do(req, &ws) + if err != nil { + return nil, resp, err + } + + return ws, resp, err +} + +// GetWikiPageOptions represents options to GetWikiPage +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#get-a-wiki-page +type GetWikiPageOptions struct { + RenderHTML *bool `url:"render_html,omitempty" json:"render_html,omitempty"` + Version *string `url:"version,omitempty" json:"version,omitempty"` +} + +// GetWikiPage gets a wiki page for a given project. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#get-a-wiki-page +func (s *WikisService) GetWikiPage(pid interface{}, slug string, opt *GetWikiPageOptions, options ...RequestOptionFunc) (*Wiki, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/wikis/%s", PathEscape(project), url.PathEscape(slug)) + + req, err := s.client.NewRequest(http.MethodGet, u, opt, options) + if err != nil { + return nil, nil, err + } + + w := new(Wiki) + resp, err := s.client.Do(req, w) + if err != nil { + return nil, resp, err + } + + return w, resp, err +} + +// CreateWikiPageOptions represents options to CreateWikiPage. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#create-a-new-wiki-page +type CreateWikiPageOptions struct { + Content *string `url:"content,omitempty" json:"content,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Format *WikiFormatValue `url:"format,omitempty" json:"format,omitempty"` +} + +// CreateWikiPage creates a new wiki page for the given repository with +// the given title, slug, and content. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#create-a-new-wiki-page +func (s *WikisService) CreateWikiPage(pid interface{}, opt *CreateWikiPageOptions, options ...RequestOptionFunc) (*Wiki, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/wikis", PathEscape(project)) + + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + w := new(Wiki) + resp, err := s.client.Do(req, w) + if err != nil { + return nil, resp, err + } + + return w, resp, err +} + +// EditWikiPageOptions represents options to EditWikiPage. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#edit-an-existing-wiki-page +type EditWikiPageOptions struct { + Content *string `url:"content,omitempty" json:"content,omitempty"` + Title *string `url:"title,omitempty" json:"title,omitempty"` + Format *WikiFormatValue `url:"format,omitempty" json:"format,omitempty"` +} + +// EditWikiPage Updates an existing wiki page. At least one parameter is +// required to update the wiki page. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#edit-an-existing-wiki-page +func (s *WikisService) EditWikiPage(pid interface{}, slug string, opt *EditWikiPageOptions, options ...RequestOptionFunc) (*Wiki, *Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, nil, err + } + u := fmt.Sprintf("projects/%s/wikis/%s", PathEscape(project), url.PathEscape(slug)) + + req, err := s.client.NewRequest(http.MethodPut, u, opt, options) + if err != nil { + return nil, nil, err + } + + w := new(Wiki) + resp, err := s.client.Do(req, w) + if err != nil { + return nil, resp, err + } + + return w, resp, err +} + +// DeleteWikiPage deletes a wiki page with a given slug. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/wikis.html#delete-a-wiki-page +func (s *WikisService) DeleteWikiPage(pid interface{}, slug string, options ...RequestOptionFunc) (*Response, error) { + project, err := parseID(pid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("projects/%s/wikis/%s", PathEscape(project), url.PathEscape(slug)) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/vendor/golang.org/x/crypto/argon2/argon2.go b/vendor/golang.org/x/crypto/argon2/argon2.go new file mode 100644 index 0000000000..29f0a2de45 --- /dev/null +++ b/vendor/golang.org/x/crypto/argon2/argon2.go @@ -0,0 +1,283 @@ +// 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 argon2 implements the key derivation function Argon2. +// Argon2 was selected as the winner of the Password Hashing Competition and can +// be used to derive cryptographic keys from passwords. +// +// For a detailed specification of Argon2 see [1]. +// +// If you aren't sure which function you need, use Argon2id (IDKey) and +// the parameter recommendations for your scenario. +// +// # Argon2i +// +// Argon2i (implemented by Key) is the side-channel resistant version of Argon2. +// It uses data-independent memory access, which is preferred for password +// hashing and password-based key derivation. Argon2i requires more passes over +// memory than Argon2id to protect from trade-off attacks. The recommended +// parameters (taken from [2]) for non-interactive operations are time=3 and to +// use the maximum available memory. +// +// # Argon2id +// +// Argon2id (implemented by IDKey) is a hybrid version of Argon2 combining +// Argon2i and Argon2d. It uses data-independent memory access for the first +// half of the first iteration over the memory and data-dependent memory access +// for the rest. Argon2id is side-channel resistant and provides better brute- +// force cost savings due to time-memory tradeoffs than Argon2i. The recommended +// parameters for non-interactive operations (taken from [2]) are time=1 and to +// use the maximum available memory. +// +// [1] https://github.com/P-H-C/phc-winner-argon2/blob/master/argon2-specs.pdf +// [2] https://tools.ietf.org/html/draft-irtf-cfrg-argon2-03#section-9.3 +package argon2 + +import ( + "encoding/binary" + "sync" + + "golang.org/x/crypto/blake2b" +) + +// The Argon2 version implemented by this package. +const Version = 0x13 + +const ( + argon2d = iota + argon2i + argon2id +) + +// Key derives a key from the password, salt, and cost parameters using Argon2i +// returning a byte slice of length keyLen that can be used as cryptographic +// key. The CPU cost and parallelism degree must be greater than zero. +// +// For example, you can get a derived key for e.g. AES-256 (which needs a +// 32-byte key) by doing: +// +// key := argon2.Key([]byte("some password"), salt, 3, 32*1024, 4, 32) +// +// The draft RFC recommends[2] time=3, and memory=32*1024 is a sensible number. +// If using that amount of memory (32 MB) is not possible in some contexts then +// the time parameter can be increased to compensate. +// +// The time parameter specifies the number of passes over the memory and the +// memory parameter specifies the size of the memory in KiB. For example +// memory=32*1024 sets the memory cost to ~32 MB. The number of threads can be +// adjusted to the number of available CPUs. The cost parameters should be +// increased as memory latency and CPU parallelism increases. Remember to get a +// good random salt. +func Key(password, salt []byte, time, memory uint32, threads uint8, keyLen uint32) []byte { + return deriveKey(argon2i, password, salt, nil, nil, time, memory, threads, keyLen) +} + +// IDKey derives a key from the password, salt, and cost parameters using +// Argon2id returning a byte slice of length keyLen that can be used as +// cryptographic key. The CPU cost and parallelism degree must be greater than +// zero. +// +// For example, you can get a derived key for e.g. AES-256 (which needs a +// 32-byte key) by doing: +// +// key := argon2.IDKey([]byte("some password"), salt, 1, 64*1024, 4, 32) +// +// The draft RFC recommends[2] time=1, and memory=64*1024 is a sensible number. +// If using that amount of memory (64 MB) is not possible in some contexts then +// the time parameter can be increased to compensate. +// +// The time parameter specifies the number of passes over the memory and the +// memory parameter specifies the size of the memory in KiB. For example +// memory=64*1024 sets the memory cost to ~64 MB. The number of threads can be +// adjusted to the numbers of available CPUs. The cost parameters should be +// increased as memory latency and CPU parallelism increases. Remember to get a +// good random salt. +func IDKey(password, salt []byte, time, memory uint32, threads uint8, keyLen uint32) []byte { + return deriveKey(argon2id, password, salt, nil, nil, time, memory, threads, keyLen) +} + +func deriveKey(mode int, password, salt, secret, data []byte, time, memory uint32, threads uint8, keyLen uint32) []byte { + if time < 1 { + panic("argon2: number of rounds too small") + } + if threads < 1 { + panic("argon2: parallelism degree too low") + } + h0 := initHash(password, salt, secret, data, time, memory, uint32(threads), keyLen, mode) + + memory = memory / (syncPoints * uint32(threads)) * (syncPoints * uint32(threads)) + if memory < 2*syncPoints*uint32(threads) { + memory = 2 * syncPoints * uint32(threads) + } + B := initBlocks(&h0, memory, uint32(threads)) + processBlocks(B, time, memory, uint32(threads), mode) + return extractKey(B, memory, uint32(threads), keyLen) +} + +const ( + blockLength = 128 + syncPoints = 4 +) + +type block [blockLength]uint64 + +func initHash(password, salt, key, data []byte, time, memory, threads, keyLen uint32, mode int) [blake2b.Size + 8]byte { + var ( + h0 [blake2b.Size + 8]byte + params [24]byte + tmp [4]byte + ) + + b2, _ := blake2b.New512(nil) + binary.LittleEndian.PutUint32(params[0:4], threads) + binary.LittleEndian.PutUint32(params[4:8], keyLen) + binary.LittleEndian.PutUint32(params[8:12], memory) + binary.LittleEndian.PutUint32(params[12:16], time) + binary.LittleEndian.PutUint32(params[16:20], uint32(Version)) + binary.LittleEndian.PutUint32(params[20:24], uint32(mode)) + b2.Write(params[:]) + binary.LittleEndian.PutUint32(tmp[:], uint32(len(password))) + b2.Write(tmp[:]) + b2.Write(password) + binary.LittleEndian.PutUint32(tmp[:], uint32(len(salt))) + b2.Write(tmp[:]) + b2.Write(salt) + binary.LittleEndian.PutUint32(tmp[:], uint32(len(key))) + b2.Write(tmp[:]) + b2.Write(key) + binary.LittleEndian.PutUint32(tmp[:], uint32(len(data))) + b2.Write(tmp[:]) + b2.Write(data) + b2.Sum(h0[:0]) + return h0 +} + +func initBlocks(h0 *[blake2b.Size + 8]byte, memory, threads uint32) []block { + var block0 [1024]byte + B := make([]block, memory) + for lane := uint32(0); lane < threads; lane++ { + j := lane * (memory / threads) + binary.LittleEndian.PutUint32(h0[blake2b.Size+4:], lane) + + binary.LittleEndian.PutUint32(h0[blake2b.Size:], 0) + blake2bHash(block0[:], h0[:]) + for i := range B[j+0] { + B[j+0][i] = binary.LittleEndian.Uint64(block0[i*8:]) + } + + binary.LittleEndian.PutUint32(h0[blake2b.Size:], 1) + blake2bHash(block0[:], h0[:]) + for i := range B[j+1] { + B[j+1][i] = binary.LittleEndian.Uint64(block0[i*8:]) + } + } + return B +} + +func processBlocks(B []block, time, memory, threads uint32, mode int) { + lanes := memory / threads + segments := lanes / syncPoints + + processSegment := func(n, slice, lane uint32, wg *sync.WaitGroup) { + var addresses, in, zero block + if mode == argon2i || (mode == argon2id && n == 0 && slice < syncPoints/2) { + in[0] = uint64(n) + in[1] = uint64(lane) + in[2] = uint64(slice) + in[3] = uint64(memory) + in[4] = uint64(time) + in[5] = uint64(mode) + } + + index := uint32(0) + if n == 0 && slice == 0 { + index = 2 // we have already generated the first two blocks + if mode == argon2i || mode == argon2id { + in[6]++ + processBlock(&addresses, &in, &zero) + processBlock(&addresses, &addresses, &zero) + } + } + + offset := lane*lanes + slice*segments + index + var random uint64 + for index < segments { + prev := offset - 1 + if index == 0 && slice == 0 { + prev += lanes // last block in lane + } + if mode == argon2i || (mode == argon2id && n == 0 && slice < syncPoints/2) { + if index%blockLength == 0 { + in[6]++ + processBlock(&addresses, &in, &zero) + processBlock(&addresses, &addresses, &zero) + } + random = addresses[index%blockLength] + } else { + random = B[prev][0] + } + newOffset := indexAlpha(random, lanes, segments, threads, n, slice, lane, index) + processBlockXOR(&B[offset], &B[prev], &B[newOffset]) + index, offset = index+1, offset+1 + } + wg.Done() + } + + for n := uint32(0); n < time; n++ { + for slice := uint32(0); slice < syncPoints; slice++ { + var wg sync.WaitGroup + for lane := uint32(0); lane < threads; lane++ { + wg.Add(1) + go processSegment(n, slice, lane, &wg) + } + wg.Wait() + } + } + +} + +func extractKey(B []block, memory, threads, keyLen uint32) []byte { + lanes := memory / threads + for lane := uint32(0); lane < threads-1; lane++ { + for i, v := range B[(lane*lanes)+lanes-1] { + B[memory-1][i] ^= v + } + } + + var block [1024]byte + for i, v := range B[memory-1] { + binary.LittleEndian.PutUint64(block[i*8:], v) + } + key := make([]byte, keyLen) + blake2bHash(key, block[:]) + return key +} + +func indexAlpha(rand uint64, lanes, segments, threads, n, slice, lane, index uint32) uint32 { + refLane := uint32(rand>>32) % threads + if n == 0 && slice == 0 { + refLane = lane + } + m, s := 3*segments, ((slice+1)%syncPoints)*segments + if lane == refLane { + m += index + } + if n == 0 { + m, s = slice*segments, 0 + if slice == 0 || lane == refLane { + m += index + } + } + if index == 0 || lane == refLane { + m-- + } + return phi(rand, uint64(m), uint64(s), refLane, lanes) +} + +func phi(rand, m, s uint64, lane, lanes uint32) uint32 { + p := rand & 0xFFFFFFFF + p = (p * p) >> 32 + p = (p * m) >> 32 + return lane*lanes + uint32((s+m-(p+1))%uint64(lanes)) +} diff --git a/vendor/golang.org/x/crypto/argon2/blake2b.go b/vendor/golang.org/x/crypto/argon2/blake2b.go new file mode 100644 index 0000000000..10f46948dc --- /dev/null +++ b/vendor/golang.org/x/crypto/argon2/blake2b.go @@ -0,0 +1,53 @@ +// 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 argon2 + +import ( + "encoding/binary" + "hash" + + "golang.org/x/crypto/blake2b" +) + +// blake2bHash computes an arbitrary long hash value of in +// and writes the hash to out. +func blake2bHash(out []byte, in []byte) { + var b2 hash.Hash + if n := len(out); n < blake2b.Size { + b2, _ = blake2b.New(n, nil) + } else { + b2, _ = blake2b.New512(nil) + } + + var buffer [blake2b.Size]byte + binary.LittleEndian.PutUint32(buffer[:4], uint32(len(out))) + b2.Write(buffer[:4]) + b2.Write(in) + + if len(out) <= blake2b.Size { + b2.Sum(out[:0]) + return + } + + outLen := len(out) + b2.Sum(buffer[:0]) + b2.Reset() + copy(out, buffer[:32]) + out = out[32:] + for len(out) > blake2b.Size { + b2.Write(buffer[:]) + b2.Sum(buffer[:0]) + copy(out, buffer[:32]) + out = out[32:] + b2.Reset() + } + + if outLen%blake2b.Size > 0 { // outLen > 64 + r := ((outLen + 31) / 32) - 2 // ⌈τ /32⌉-2 + b2, _ = blake2b.New(outLen-32*r, nil) + } + b2.Write(buffer[:]) + b2.Sum(out[:0]) +} diff --git a/vendor/golang.org/x/crypto/argon2/blamka_amd64.go b/vendor/golang.org/x/crypto/argon2/blamka_amd64.go new file mode 100644 index 0000000000..a014ac92aa --- /dev/null +++ b/vendor/golang.org/x/crypto/argon2/blamka_amd64.go @@ -0,0 +1,61 @@ +// 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. + +//go:build amd64 && gc && !purego +// +build amd64,gc,!purego + +package argon2 + +import "golang.org/x/sys/cpu" + +func init() { + useSSE4 = cpu.X86.HasSSE41 +} + +//go:noescape +func mixBlocksSSE2(out, a, b, c *block) + +//go:noescape +func xorBlocksSSE2(out, a, b, c *block) + +//go:noescape +func blamkaSSE4(b *block) + +func processBlockSSE(out, in1, in2 *block, xor bool) { + var t block + mixBlocksSSE2(&t, in1, in2, &t) + if useSSE4 { + blamkaSSE4(&t) + } else { + for i := 0; i < blockLength; i += 16 { + blamkaGeneric( + &t[i+0], &t[i+1], &t[i+2], &t[i+3], + &t[i+4], &t[i+5], &t[i+6], &t[i+7], + &t[i+8], &t[i+9], &t[i+10], &t[i+11], + &t[i+12], &t[i+13], &t[i+14], &t[i+15], + ) + } + for i := 0; i < blockLength/8; i += 2 { + blamkaGeneric( + &t[i], &t[i+1], &t[16+i], &t[16+i+1], + &t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1], + &t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1], + &t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1], + ) + } + } + if xor { + xorBlocksSSE2(out, in1, in2, &t) + } else { + mixBlocksSSE2(out, in1, in2, &t) + } +} + +func processBlock(out, in1, in2 *block) { + processBlockSSE(out, in1, in2, false) +} + +func processBlockXOR(out, in1, in2 *block) { + processBlockSSE(out, in1, in2, true) +} diff --git a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s new file mode 100644 index 0000000000..b2cc051504 --- /dev/null +++ b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s @@ -0,0 +1,244 @@ +// 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. + +//go:build amd64 && gc && !purego +// +build amd64,gc,!purego + +#include "textflag.h" + +DATA ·c40<>+0x00(SB)/8, $0x0201000706050403 +DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·c40<>(SB), (NOPTR+RODATA), $16 + +DATA ·c48<>+0x00(SB)/8, $0x0100070605040302 +DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·c48<>(SB), (NOPTR+RODATA), $16 + +#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \ + MOVO v4, t1; \ + MOVO v5, v4; \ + MOVO t1, v5; \ + MOVO v6, t1; \ + PUNPCKLQDQ v6, t2; \ + PUNPCKHQDQ v7, v6; \ + PUNPCKHQDQ t2, v6; \ + PUNPCKLQDQ v7, t2; \ + MOVO t1, v7; \ + MOVO v2, t1; \ + PUNPCKHQDQ t2, v7; \ + PUNPCKLQDQ v3, t2; \ + PUNPCKHQDQ t2, v2; \ + PUNPCKLQDQ t1, t2; \ + PUNPCKHQDQ t2, v3 + +#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \ + MOVO v4, t1; \ + MOVO v5, v4; \ + MOVO t1, v5; \ + MOVO v2, t1; \ + PUNPCKLQDQ v2, t2; \ + PUNPCKHQDQ v3, v2; \ + PUNPCKHQDQ t2, v2; \ + PUNPCKLQDQ v3, t2; \ + MOVO t1, v3; \ + MOVO v6, t1; \ + PUNPCKHQDQ t2, v3; \ + PUNPCKLQDQ v7, t2; \ + PUNPCKHQDQ t2, v6; \ + PUNPCKLQDQ t1, t2; \ + PUNPCKHQDQ t2, v7 + +#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, t0, c40, c48) \ + MOVO v0, t0; \ + PMULULQ v2, t0; \ + PADDQ v2, v0; \ + PADDQ t0, v0; \ + PADDQ t0, v0; \ + PXOR v0, v6; \ + PSHUFD $0xB1, v6, v6; \ + MOVO v4, t0; \ + PMULULQ v6, t0; \ + PADDQ v6, v4; \ + PADDQ t0, v4; \ + PADDQ t0, v4; \ + PXOR v4, v2; \ + PSHUFB c40, v2; \ + MOVO v0, t0; \ + PMULULQ v2, t0; \ + PADDQ v2, v0; \ + PADDQ t0, v0; \ + PADDQ t0, v0; \ + PXOR v0, v6; \ + PSHUFB c48, v6; \ + MOVO v4, t0; \ + PMULULQ v6, t0; \ + PADDQ v6, v4; \ + PADDQ t0, v4; \ + PADDQ t0, v4; \ + PXOR v4, v2; \ + MOVO v2, t0; \ + PADDQ v2, t0; \ + PSRLQ $63, v2; \ + PXOR t0, v2; \ + MOVO v1, t0; \ + PMULULQ v3, t0; \ + PADDQ v3, v1; \ + PADDQ t0, v1; \ + PADDQ t0, v1; \ + PXOR v1, v7; \ + PSHUFD $0xB1, v7, v7; \ + MOVO v5, t0; \ + PMULULQ v7, t0; \ + PADDQ v7, v5; \ + PADDQ t0, v5; \ + PADDQ t0, v5; \ + PXOR v5, v3; \ + PSHUFB c40, v3; \ + MOVO v1, t0; \ + PMULULQ v3, t0; \ + PADDQ v3, v1; \ + PADDQ t0, v1; \ + PADDQ t0, v1; \ + PXOR v1, v7; \ + PSHUFB c48, v7; \ + MOVO v5, t0; \ + PMULULQ v7, t0; \ + PADDQ v7, v5; \ + PADDQ t0, v5; \ + PADDQ t0, v5; \ + PXOR v5, v3; \ + MOVO v3, t0; \ + PADDQ v3, t0; \ + PSRLQ $63, v3; \ + PXOR t0, v3 + +#define LOAD_MSG_0(block, off) \ + MOVOU 8*(off+0)(block), X0; \ + MOVOU 8*(off+2)(block), X1; \ + MOVOU 8*(off+4)(block), X2; \ + MOVOU 8*(off+6)(block), X3; \ + MOVOU 8*(off+8)(block), X4; \ + MOVOU 8*(off+10)(block), X5; \ + MOVOU 8*(off+12)(block), X6; \ + MOVOU 8*(off+14)(block), X7 + +#define STORE_MSG_0(block, off) \ + MOVOU X0, 8*(off+0)(block); \ + MOVOU X1, 8*(off+2)(block); \ + MOVOU X2, 8*(off+4)(block); \ + MOVOU X3, 8*(off+6)(block); \ + MOVOU X4, 8*(off+8)(block); \ + MOVOU X5, 8*(off+10)(block); \ + MOVOU X6, 8*(off+12)(block); \ + MOVOU X7, 8*(off+14)(block) + +#define LOAD_MSG_1(block, off) \ + MOVOU 8*off+0*8(block), X0; \ + MOVOU 8*off+16*8(block), X1; \ + MOVOU 8*off+32*8(block), X2; \ + MOVOU 8*off+48*8(block), X3; \ + MOVOU 8*off+64*8(block), X4; \ + MOVOU 8*off+80*8(block), X5; \ + MOVOU 8*off+96*8(block), X6; \ + MOVOU 8*off+112*8(block), X7 + +#define STORE_MSG_1(block, off) \ + MOVOU X0, 8*off+0*8(block); \ + MOVOU X1, 8*off+16*8(block); \ + MOVOU X2, 8*off+32*8(block); \ + MOVOU X3, 8*off+48*8(block); \ + MOVOU X4, 8*off+64*8(block); \ + MOVOU X5, 8*off+80*8(block); \ + MOVOU X6, 8*off+96*8(block); \ + MOVOU X7, 8*off+112*8(block) + +#define BLAMKA_ROUND_0(block, off, t0, t1, c40, c48) \ + LOAD_MSG_0(block, off); \ + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ + SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \ + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \ + STORE_MSG_0(block, off) + +#define BLAMKA_ROUND_1(block, off, t0, t1, c40, c48) \ + LOAD_MSG_1(block, off); \ + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ + SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \ + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \ + STORE_MSG_1(block, off) + +// func blamkaSSE4(b *block) +TEXT ·blamkaSSE4(SB), 4, $0-8 + MOVQ b+0(FP), AX + + MOVOU ·c40<>(SB), X10 + MOVOU ·c48<>(SB), X11 + + BLAMKA_ROUND_0(AX, 0, X8, X9, X10, X11) + BLAMKA_ROUND_0(AX, 16, X8, X9, X10, X11) + BLAMKA_ROUND_0(AX, 32, X8, X9, X10, X11) + BLAMKA_ROUND_0(AX, 48, X8, X9, X10, X11) + BLAMKA_ROUND_0(AX, 64, X8, X9, X10, X11) + BLAMKA_ROUND_0(AX, 80, X8, X9, X10, X11) + BLAMKA_ROUND_0(AX, 96, X8, X9, X10, X11) + BLAMKA_ROUND_0(AX, 112, X8, X9, X10, X11) + + BLAMKA_ROUND_1(AX, 0, X8, X9, X10, X11) + BLAMKA_ROUND_1(AX, 2, X8, X9, X10, X11) + BLAMKA_ROUND_1(AX, 4, X8, X9, X10, X11) + BLAMKA_ROUND_1(AX, 6, X8, X9, X10, X11) + BLAMKA_ROUND_1(AX, 8, X8, X9, X10, X11) + BLAMKA_ROUND_1(AX, 10, X8, X9, X10, X11) + BLAMKA_ROUND_1(AX, 12, X8, X9, X10, X11) + BLAMKA_ROUND_1(AX, 14, X8, X9, X10, X11) + RET + +// func mixBlocksSSE2(out, a, b, c *block) +TEXT ·mixBlocksSSE2(SB), 4, $0-32 + MOVQ out+0(FP), DX + MOVQ a+8(FP), AX + MOVQ b+16(FP), BX + MOVQ a+24(FP), CX + MOVQ $128, BP + +loop: + MOVOU 0(AX), X0 + MOVOU 0(BX), X1 + MOVOU 0(CX), X2 + PXOR X1, X0 + PXOR X2, X0 + MOVOU X0, 0(DX) + ADDQ $16, AX + ADDQ $16, BX + ADDQ $16, CX + ADDQ $16, DX + SUBQ $2, BP + JA loop + RET + +// func xorBlocksSSE2(out, a, b, c *block) +TEXT ·xorBlocksSSE2(SB), 4, $0-32 + MOVQ out+0(FP), DX + MOVQ a+8(FP), AX + MOVQ b+16(FP), BX + MOVQ a+24(FP), CX + MOVQ $128, BP + +loop: + MOVOU 0(AX), X0 + MOVOU 0(BX), X1 + MOVOU 0(CX), X2 + MOVOU 0(DX), X3 + PXOR X1, X0 + PXOR X2, X0 + PXOR X3, X0 + MOVOU X0, 0(DX) + ADDQ $16, AX + ADDQ $16, BX + ADDQ $16, CX + ADDQ $16, DX + SUBQ $2, BP + JA loop + RET diff --git a/vendor/golang.org/x/crypto/argon2/blamka_generic.go b/vendor/golang.org/x/crypto/argon2/blamka_generic.go new file mode 100644 index 0000000000..a481b2243f --- /dev/null +++ b/vendor/golang.org/x/crypto/argon2/blamka_generic.go @@ -0,0 +1,163 @@ +// 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 argon2 + +var useSSE4 bool + +func processBlockGeneric(out, in1, in2 *block, xor bool) { + var t block + for i := range t { + t[i] = in1[i] ^ in2[i] + } + for i := 0; i < blockLength; i += 16 { + blamkaGeneric( + &t[i+0], &t[i+1], &t[i+2], &t[i+3], + &t[i+4], &t[i+5], &t[i+6], &t[i+7], + &t[i+8], &t[i+9], &t[i+10], &t[i+11], + &t[i+12], &t[i+13], &t[i+14], &t[i+15], + ) + } + for i := 0; i < blockLength/8; i += 2 { + blamkaGeneric( + &t[i], &t[i+1], &t[16+i], &t[16+i+1], + &t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1], + &t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1], + &t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1], + ) + } + if xor { + for i := range t { + out[i] ^= in1[i] ^ in2[i] ^ t[i] + } + } else { + for i := range t { + out[i] = in1[i] ^ in2[i] ^ t[i] + } + } +} + +func blamkaGeneric(t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15 *uint64) { + v00, v01, v02, v03 := *t00, *t01, *t02, *t03 + v04, v05, v06, v07 := *t04, *t05, *t06, *t07 + v08, v09, v10, v11 := *t08, *t09, *t10, *t11 + v12, v13, v14, v15 := *t12, *t13, *t14, *t15 + + v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04)) + v12 ^= v00 + v12 = v12>>32 | v12<<32 + v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12)) + v04 ^= v08 + v04 = v04>>24 | v04<<40 + + v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04)) + v12 ^= v00 + v12 = v12>>16 | v12<<48 + v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12)) + v04 ^= v08 + v04 = v04>>63 | v04<<1 + + v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05)) + v13 ^= v01 + v13 = v13>>32 | v13<<32 + v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13)) + v05 ^= v09 + v05 = v05>>24 | v05<<40 + + v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05)) + v13 ^= v01 + v13 = v13>>16 | v13<<48 + v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13)) + v05 ^= v09 + v05 = v05>>63 | v05<<1 + + v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06)) + v14 ^= v02 + v14 = v14>>32 | v14<<32 + v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14)) + v06 ^= v10 + v06 = v06>>24 | v06<<40 + + v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06)) + v14 ^= v02 + v14 = v14>>16 | v14<<48 + v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14)) + v06 ^= v10 + v06 = v06>>63 | v06<<1 + + v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07)) + v15 ^= v03 + v15 = v15>>32 | v15<<32 + v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15)) + v07 ^= v11 + v07 = v07>>24 | v07<<40 + + v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07)) + v15 ^= v03 + v15 = v15>>16 | v15<<48 + v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15)) + v07 ^= v11 + v07 = v07>>63 | v07<<1 + + v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05)) + v15 ^= v00 + v15 = v15>>32 | v15<<32 + v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15)) + v05 ^= v10 + v05 = v05>>24 | v05<<40 + + v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05)) + v15 ^= v00 + v15 = v15>>16 | v15<<48 + v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15)) + v05 ^= v10 + v05 = v05>>63 | v05<<1 + + v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06)) + v12 ^= v01 + v12 = v12>>32 | v12<<32 + v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12)) + v06 ^= v11 + v06 = v06>>24 | v06<<40 + + v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06)) + v12 ^= v01 + v12 = v12>>16 | v12<<48 + v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12)) + v06 ^= v11 + v06 = v06>>63 | v06<<1 + + v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07)) + v13 ^= v02 + v13 = v13>>32 | v13<<32 + v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13)) + v07 ^= v08 + v07 = v07>>24 | v07<<40 + + v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07)) + v13 ^= v02 + v13 = v13>>16 | v13<<48 + v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13)) + v07 ^= v08 + v07 = v07>>63 | v07<<1 + + v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04)) + v14 ^= v03 + v14 = v14>>32 | v14<<32 + v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14)) + v04 ^= v09 + v04 = v04>>24 | v04<<40 + + v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04)) + v14 ^= v03 + v14 = v14>>16 | v14<<48 + v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14)) + v04 ^= v09 + v04 = v04>>63 | v04<<1 + + *t00, *t01, *t02, *t03 = v00, v01, v02, v03 + *t04, *t05, *t06, *t07 = v04, v05, v06, v07 + *t08, *t09, *t10, *t11 = v08, v09, v10, v11 + *t12, *t13, *t14, *t15 = v12, v13, v14, v15 +} diff --git a/vendor/golang.org/x/crypto/argon2/blamka_ref.go b/vendor/golang.org/x/crypto/argon2/blamka_ref.go new file mode 100644 index 0000000000..167c59d2d5 --- /dev/null +++ b/vendor/golang.org/x/crypto/argon2/blamka_ref.go @@ -0,0 +1,16 @@ +// 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. + +//go:build !amd64 || purego || !gc +// +build !amd64 purego !gc + +package argon2 + +func processBlock(out, in1, in2 *block) { + processBlockGeneric(out, in1, in2, false) +} + +func processBlockXOR(out, in1, in2 *block) { + processBlockGeneric(out, in1, in2, true) +} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b.go b/vendor/golang.org/x/crypto/blake2b/blake2b.go new file mode 100644 index 0000000000..d2e98d4295 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2b.go @@ -0,0 +1,291 @@ +// 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 blake2b implements the BLAKE2b hash algorithm defined by RFC 7693 +// and the extendable output function (XOF) BLAKE2Xb. +// +// BLAKE2b is optimized for 64-bit platforms—including NEON-enabled ARMs—and +// produces digests of any size between 1 and 64 bytes. +// For a detailed specification of BLAKE2b see https://blake2.net/blake2.pdf +// and for BLAKE2Xb see https://blake2.net/blake2x.pdf +// +// If you aren't sure which function you need, use BLAKE2b (Sum512 or New512). +// If you need a secret-key MAC (message authentication code), use the New512 +// function with a non-nil key. +// +// BLAKE2X is a construction to compute hash values larger than 64 bytes. It +// can produce hash values between 0 and 4 GiB. +package blake2b + +import ( + "encoding/binary" + "errors" + "hash" +) + +const ( + // The blocksize of BLAKE2b in bytes. + BlockSize = 128 + // The hash size of BLAKE2b-512 in bytes. + Size = 64 + // The hash size of BLAKE2b-384 in bytes. + Size384 = 48 + // The hash size of BLAKE2b-256 in bytes. + Size256 = 32 +) + +var ( + useAVX2 bool + useAVX bool + useSSE4 bool +) + +var ( + errKeySize = errors.New("blake2b: invalid key size") + errHashSize = errors.New("blake2b: invalid hash size") +) + +var iv = [8]uint64{ + 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, +} + +// Sum512 returns the BLAKE2b-512 checksum of the data. +func Sum512(data []byte) [Size]byte { + var sum [Size]byte + checkSum(&sum, Size, data) + return sum +} + +// Sum384 returns the BLAKE2b-384 checksum of the data. +func Sum384(data []byte) [Size384]byte { + var sum [Size]byte + var sum384 [Size384]byte + checkSum(&sum, Size384, data) + copy(sum384[:], sum[:Size384]) + return sum384 +} + +// Sum256 returns the BLAKE2b-256 checksum of the data. +func Sum256(data []byte) [Size256]byte { + var sum [Size]byte + var sum256 [Size256]byte + checkSum(&sum, Size256, data) + copy(sum256[:], sum[:Size256]) + return sum256 +} + +// New512 returns a new hash.Hash computing the BLAKE2b-512 checksum. A non-nil +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. +func New512(key []byte) (hash.Hash, error) { return newDigest(Size, key) } + +// New384 returns a new hash.Hash computing the BLAKE2b-384 checksum. A non-nil +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. +func New384(key []byte) (hash.Hash, error) { return newDigest(Size384, key) } + +// New256 returns a new hash.Hash computing the BLAKE2b-256 checksum. A non-nil +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. +func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) } + +// New returns a new hash.Hash computing the BLAKE2b checksum with a custom length. +// A non-nil key turns the hash into a MAC. The key must be between zero and 64 bytes long. +// The hash size can be a value between 1 and 64 but it is highly recommended to use +// values equal or greater than: +// - 32 if BLAKE2b is used as a hash function (The key is zero bytes long). +// - 16 if BLAKE2b is used as a MAC function (The key is at least 16 bytes long). +// When the key is nil, the returned hash.Hash implements BinaryMarshaler +// and BinaryUnmarshaler for state (de)serialization as documented by hash.Hash. +func New(size int, key []byte) (hash.Hash, error) { return newDigest(size, key) } + +func newDigest(hashSize int, key []byte) (*digest, error) { + if hashSize < 1 || hashSize > Size { + return nil, errHashSize + } + if len(key) > Size { + return nil, errKeySize + } + d := &digest{ + size: hashSize, + keyLen: len(key), + } + copy(d.key[:], key) + d.Reset() + return d, nil +} + +func checkSum(sum *[Size]byte, hashSize int, data []byte) { + h := iv + h[0] ^= uint64(hashSize) | (1 << 16) | (1 << 24) + var c [2]uint64 + + if length := len(data); length > BlockSize { + n := length &^ (BlockSize - 1) + if length == n { + n -= BlockSize + } + hashBlocks(&h, &c, 0, data[:n]) + data = data[n:] + } + + var block [BlockSize]byte + offset := copy(block[:], data) + remaining := uint64(BlockSize - offset) + if c[0] < remaining { + c[1]-- + } + c[0] -= remaining + + hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:]) + + for i, v := range h[:(hashSize+7)/8] { + binary.LittleEndian.PutUint64(sum[8*i:], v) + } +} + +type digest struct { + h [8]uint64 + c [2]uint64 + size int + block [BlockSize]byte + offset int + + key [BlockSize]byte + keyLen int +} + +const ( + magic = "b2b" + marshaledSize = len(magic) + 8*8 + 2*8 + 1 + BlockSize + 1 +) + +func (d *digest) MarshalBinary() ([]byte, error) { + if d.keyLen != 0 { + return nil, errors.New("crypto/blake2b: cannot marshal MACs") + } + b := make([]byte, 0, marshaledSize) + b = append(b, magic...) + for i := 0; i < 8; i++ { + b = appendUint64(b, d.h[i]) + } + b = appendUint64(b, d.c[0]) + b = appendUint64(b, d.c[1]) + // Maximum value for size is 64 + b = append(b, byte(d.size)) + b = append(b, d.block[:]...) + b = append(b, byte(d.offset)) + return b, nil +} + +func (d *digest) UnmarshalBinary(b []byte) error { + if len(b) < len(magic) || string(b[:len(magic)]) != magic { + return errors.New("crypto/blake2b: invalid hash state identifier") + } + if len(b) != marshaledSize { + return errors.New("crypto/blake2b: invalid hash state size") + } + b = b[len(magic):] + for i := 0; i < 8; i++ { + b, d.h[i] = consumeUint64(b) + } + b, d.c[0] = consumeUint64(b) + b, d.c[1] = consumeUint64(b) + d.size = int(b[0]) + b = b[1:] + copy(d.block[:], b[:BlockSize]) + b = b[BlockSize:] + d.offset = int(b[0]) + return nil +} + +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Size() int { return d.size } + +func (d *digest) Reset() { + d.h = iv + d.h[0] ^= uint64(d.size) | (uint64(d.keyLen) << 8) | (1 << 16) | (1 << 24) + d.offset, d.c[0], d.c[1] = 0, 0, 0 + if d.keyLen > 0 { + d.block = d.key + d.offset = BlockSize + } +} + +func (d *digest) Write(p []byte) (n int, err error) { + n = len(p) + + if d.offset > 0 { + remaining := BlockSize - d.offset + if n <= remaining { + d.offset += copy(d.block[d.offset:], p) + return + } + copy(d.block[d.offset:], p[:remaining]) + hashBlocks(&d.h, &d.c, 0, d.block[:]) + d.offset = 0 + p = p[remaining:] + } + + if length := len(p); length > BlockSize { + nn := length &^ (BlockSize - 1) + if length == nn { + nn -= BlockSize + } + hashBlocks(&d.h, &d.c, 0, p[:nn]) + p = p[nn:] + } + + if len(p) > 0 { + d.offset += copy(d.block[:], p) + } + + return +} + +func (d *digest) Sum(sum []byte) []byte { + var hash [Size]byte + d.finalize(&hash) + return append(sum, hash[:d.size]...) +} + +func (d *digest) finalize(hash *[Size]byte) { + var block [BlockSize]byte + copy(block[:], d.block[:d.offset]) + remaining := uint64(BlockSize - d.offset) + + c := d.c + if c[0] < remaining { + c[1]-- + } + c[0] -= remaining + + h := d.h + hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:]) + + for i, v := range h { + binary.LittleEndian.PutUint64(hash[8*i:], v) + } +} + +func appendUint64(b []byte, x uint64) []byte { + var a [8]byte + binary.BigEndian.PutUint64(a[:], x) + return append(b, a[:]...) +} + +func appendUint32(b []byte, x uint32) []byte { + var a [4]byte + binary.BigEndian.PutUint32(a[:], x) + return append(b, a[:]...) +} + +func consumeUint64(b []byte) ([]byte, uint64) { + x := binary.BigEndian.Uint64(b) + return b[8:], x +} + +func consumeUint32(b []byte) ([]byte, uint32) { + x := binary.BigEndian.Uint32(b) + return b[4:], x +} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go new file mode 100644 index 0000000000..56bfaaa17d --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go @@ -0,0 +1,38 @@ +// 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. + +//go:build go1.7 && amd64 && gc && !purego +// +build go1.7,amd64,gc,!purego + +package blake2b + +import "golang.org/x/sys/cpu" + +func init() { + useAVX2 = cpu.X86.HasAVX2 + useAVX = cpu.X86.HasAVX + useSSE4 = cpu.X86.HasSSE41 +} + +//go:noescape +func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) + +//go:noescape +func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) + +//go:noescape +func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) + +func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { + switch { + case useAVX2: + hashBlocksAVX2(h, c, flag, blocks) + case useAVX: + hashBlocksAVX(h, c, flag, blocks) + case useSSE4: + hashBlocksSSE4(h, c, flag, blocks) + default: + hashBlocksGeneric(h, c, flag, blocks) + } +} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s new file mode 100644 index 0000000000..4b9daa18d9 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s @@ -0,0 +1,745 @@ +// 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. + +//go:build go1.7 && amd64 && gc && !purego +// +build go1.7,amd64,gc,!purego + +#include "textflag.h" + +DATA ·AVX2_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 +DATA ·AVX2_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b +DATA ·AVX2_iv0<>+0x10(SB)/8, $0x3c6ef372fe94f82b +DATA ·AVX2_iv0<>+0x18(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·AVX2_iv0<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX2_iv1<>+0x00(SB)/8, $0x510e527fade682d1 +DATA ·AVX2_iv1<>+0x08(SB)/8, $0x9b05688c2b3e6c1f +DATA ·AVX2_iv1<>+0x10(SB)/8, $0x1f83d9abfb41bd6b +DATA ·AVX2_iv1<>+0x18(SB)/8, $0x5be0cd19137e2179 +GLOBL ·AVX2_iv1<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX2_c40<>+0x00(SB)/8, $0x0201000706050403 +DATA ·AVX2_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b +DATA ·AVX2_c40<>+0x10(SB)/8, $0x0201000706050403 +DATA ·AVX2_c40<>+0x18(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·AVX2_c40<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX2_c48<>+0x00(SB)/8, $0x0100070605040302 +DATA ·AVX2_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a +DATA ·AVX2_c48<>+0x10(SB)/8, $0x0100070605040302 +DATA ·AVX2_c48<>+0x18(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·AVX2_c48<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 +DATA ·AVX_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b +GLOBL ·AVX_iv0<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b +DATA ·AVX_iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·AVX_iv1<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_iv2<>+0x00(SB)/8, $0x510e527fade682d1 +DATA ·AVX_iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f +GLOBL ·AVX_iv2<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b +DATA ·AVX_iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 +GLOBL ·AVX_iv3<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_c40<>+0x00(SB)/8, $0x0201000706050403 +DATA ·AVX_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·AVX_c40<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_c48<>+0x00(SB)/8, $0x0100070605040302 +DATA ·AVX_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $16 + +#define VPERMQ_0x39_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39 +#define VPERMQ_0x93_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93 +#define VPERMQ_0x4E_Y2_Y2 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e +#define VPERMQ_0x93_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93 +#define VPERMQ_0x39_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39 + +#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \ + VPADDQ m0, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFD $-79, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPSHUFB c40, Y1, Y1; \ + VPADDQ m1, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFB c48, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPADDQ Y1, Y1, t; \ + VPSRLQ $63, Y1, Y1; \ + VPXOR t, Y1, Y1; \ + VPERMQ_0x39_Y1_Y1; \ + VPERMQ_0x4E_Y2_Y2; \ + VPERMQ_0x93_Y3_Y3; \ + VPADDQ m2, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFD $-79, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPSHUFB c40, Y1, Y1; \ + VPADDQ m3, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFB c48, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPADDQ Y1, Y1, t; \ + VPSRLQ $63, Y1, Y1; \ + VPXOR t, Y1, Y1; \ + VPERMQ_0x39_Y3_Y3; \ + VPERMQ_0x4E_Y2_Y2; \ + VPERMQ_0x93_Y1_Y1 + +#define VMOVQ_SI_X11_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x1E +#define VMOVQ_SI_X12_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x26 +#define VMOVQ_SI_X13_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x2E +#define VMOVQ_SI_X14_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x36 +#define VMOVQ_SI_X15_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x3E + +#define VMOVQ_SI_X11(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x5E; BYTE $n +#define VMOVQ_SI_X12(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x66; BYTE $n +#define VMOVQ_SI_X13(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x6E; BYTE $n +#define VMOVQ_SI_X14(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x76; BYTE $n +#define VMOVQ_SI_X15(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x7E; BYTE $n + +#define VPINSRQ_1_SI_X11_0 BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x1E; BYTE $0x01 +#define VPINSRQ_1_SI_X12_0 BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x26; BYTE $0x01 +#define VPINSRQ_1_SI_X13_0 BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x2E; BYTE $0x01 +#define VPINSRQ_1_SI_X14_0 BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x36; BYTE $0x01 +#define VPINSRQ_1_SI_X15_0 BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x3E; BYTE $0x01 + +#define VPINSRQ_1_SI_X11(n) BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x5E; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X12(n) BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x66; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X13(n) BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x6E; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X14(n) BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x76; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X15(n) BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x7E; BYTE $n; BYTE $0x01 + +#define VMOVQ_R8_X15 BYTE $0xC4; BYTE $0x41; BYTE $0xF9; BYTE $0x6E; BYTE $0xF8 +#define VPINSRQ_1_R9_X15 BYTE $0xC4; BYTE $0x43; BYTE $0x81; BYTE $0x22; BYTE $0xF9; BYTE $0x01 + +// load msg: Y12 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y12(i0, i1, i2, i3) \ + VMOVQ_SI_X12(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X12(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y12, Y12 + +// load msg: Y13 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y13(i0, i1, i2, i3) \ + VMOVQ_SI_X13(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X13(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y13, Y13 + +// load msg: Y14 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y14(i0, i1, i2, i3) \ + VMOVQ_SI_X14(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X14(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y14, Y14 + +// load msg: Y15 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y15(i0, i1, i2, i3) \ + VMOVQ_SI_X15(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X15(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() \ + VMOVQ_SI_X12_0; \ + VMOVQ_SI_X11(4*8); \ + VPINSRQ_1_SI_X12(2*8); \ + VPINSRQ_1_SI_X11(6*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(1, 3, 5, 7); \ + LOAD_MSG_AVX2_Y14(8, 10, 12, 14); \ + LOAD_MSG_AVX2_Y15(9, 11, 13, 15) + +#define LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() \ + LOAD_MSG_AVX2_Y12(14, 4, 9, 13); \ + LOAD_MSG_AVX2_Y13(10, 8, 15, 6); \ + VMOVQ_SI_X11(11*8); \ + VPSHUFD $0x4E, 0*8(SI), X14; \ + VPINSRQ_1_SI_X11(5*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + LOAD_MSG_AVX2_Y15(12, 2, 7, 3) + +#define LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() \ + VMOVQ_SI_X11(5*8); \ + VMOVDQU 11*8(SI), X12; \ + VPINSRQ_1_SI_X11(15*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + VMOVQ_SI_X13(8*8); \ + VMOVQ_SI_X11(2*8); \ + VPINSRQ_1_SI_X13_0; \ + VPINSRQ_1_SI_X11(13*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(10, 3, 7, 9); \ + LOAD_MSG_AVX2_Y15(14, 6, 1, 4) + +#define LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() \ + LOAD_MSG_AVX2_Y12(7, 3, 13, 11); \ + LOAD_MSG_AVX2_Y13(9, 1, 12, 14); \ + LOAD_MSG_AVX2_Y14(2, 5, 4, 15); \ + VMOVQ_SI_X15(6*8); \ + VMOVQ_SI_X11_0; \ + VPINSRQ_1_SI_X15(10*8); \ + VPINSRQ_1_SI_X11(8*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() \ + LOAD_MSG_AVX2_Y12(9, 5, 2, 10); \ + VMOVQ_SI_X13_0; \ + VMOVQ_SI_X11(4*8); \ + VPINSRQ_1_SI_X13(7*8); \ + VPINSRQ_1_SI_X11(15*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(14, 11, 6, 3); \ + LOAD_MSG_AVX2_Y15(1, 12, 8, 13) + +#define LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X11_0; \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X11(8*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(12, 10, 11, 3); \ + LOAD_MSG_AVX2_Y14(4, 7, 15, 1); \ + LOAD_MSG_AVX2_Y15(13, 5, 14, 9) + +#define LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() \ + LOAD_MSG_AVX2_Y12(12, 1, 14, 4); \ + LOAD_MSG_AVX2_Y13(5, 15, 13, 10); \ + VMOVQ_SI_X14_0; \ + VPSHUFD $0x4E, 8*8(SI), X11; \ + VPINSRQ_1_SI_X14(6*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + LOAD_MSG_AVX2_Y15(7, 3, 2, 11) + +#define LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() \ + LOAD_MSG_AVX2_Y12(13, 7, 12, 3); \ + LOAD_MSG_AVX2_Y13(11, 14, 1, 9); \ + LOAD_MSG_AVX2_Y14(5, 15, 8, 2); \ + VMOVQ_SI_X15_0; \ + VMOVQ_SI_X11(6*8); \ + VPINSRQ_1_SI_X15(4*8); \ + VPINSRQ_1_SI_X11(10*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() \ + VMOVQ_SI_X12(6*8); \ + VMOVQ_SI_X11(11*8); \ + VPINSRQ_1_SI_X12(14*8); \ + VPINSRQ_1_SI_X11_0; \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(15, 9, 3, 8); \ + VMOVQ_SI_X11(1*8); \ + VMOVDQU 12*8(SI), X14; \ + VPINSRQ_1_SI_X11(10*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + VMOVQ_SI_X15(2*8); \ + VMOVDQU 4*8(SI), X11; \ + VPINSRQ_1_SI_X15(7*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() \ + LOAD_MSG_AVX2_Y12(10, 8, 7, 1); \ + VMOVQ_SI_X13(2*8); \ + VPSHUFD $0x4E, 5*8(SI), X11; \ + VPINSRQ_1_SI_X13(4*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(15, 9, 3, 13); \ + VMOVQ_SI_X15(11*8); \ + VMOVQ_SI_X11(12*8); \ + VPINSRQ_1_SI_X15(14*8); \ + VPINSRQ_1_SI_X11_0; \ + VINSERTI128 $1, X11, Y15, Y15 + +// func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) +TEXT ·hashBlocksAVX2(SB), 4, $320-48 // frame size = 288 + 32 byte alignment + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVQ flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DI + + MOVQ SP, DX + ADDQ $31, DX + ANDQ $~31, DX + + MOVQ CX, 16(DX) + XORQ CX, CX + MOVQ CX, 24(DX) + + VMOVDQU ·AVX2_c40<>(SB), Y4 + VMOVDQU ·AVX2_c48<>(SB), Y5 + + VMOVDQU 0(AX), Y8 + VMOVDQU 32(AX), Y9 + VMOVDQU ·AVX2_iv0<>(SB), Y6 + VMOVDQU ·AVX2_iv1<>(SB), Y7 + + MOVQ 0(BX), R8 + MOVQ 8(BX), R9 + MOVQ R9, 8(DX) + +loop: + ADDQ $128, R8 + MOVQ R8, 0(DX) + CMPQ R8, $128 + JGE noinc + INCQ R9 + MOVQ R9, 8(DX) + +noinc: + VMOVDQA Y8, Y0 + VMOVDQA Y9, Y1 + VMOVDQA Y6, Y2 + VPXOR 0(DX), Y7, Y3 + + LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() + VMOVDQA Y12, 32(DX) + VMOVDQA Y13, 64(DX) + VMOVDQA Y14, 96(DX) + VMOVDQA Y15, 128(DX) + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() + VMOVDQA Y12, 160(DX) + VMOVDQA Y13, 192(DX) + VMOVDQA Y14, 224(DX) + VMOVDQA Y15, 256(DX) + + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + ROUND_AVX2(32(DX), 64(DX), 96(DX), 128(DX), Y10, Y4, Y5) + ROUND_AVX2(160(DX), 192(DX), 224(DX), 256(DX), Y10, Y4, Y5) + + VPXOR Y0, Y8, Y8 + VPXOR Y1, Y9, Y9 + VPXOR Y2, Y8, Y8 + VPXOR Y3, Y9, Y9 + + LEAQ 128(SI), SI + SUBQ $128, DI + JNE loop + + MOVQ R8, 0(BX) + MOVQ R9, 8(BX) + + VMOVDQU Y8, 0(AX) + VMOVDQU Y9, 32(AX) + VZEROUPPER + + RET + +#define VPUNPCKLQDQ_X2_X2_X15 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xFA +#define VPUNPCKLQDQ_X3_X3_X15 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xFB +#define VPUNPCKLQDQ_X7_X7_X15 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xFF +#define VPUNPCKLQDQ_X13_X13_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x11; BYTE $0x6C; BYTE $0xFD +#define VPUNPCKLQDQ_X14_X14_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x09; BYTE $0x6C; BYTE $0xFE + +#define VPUNPCKHQDQ_X15_X2_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD7 +#define VPUNPCKHQDQ_X15_X3_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDF +#define VPUNPCKHQDQ_X15_X6_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF7 +#define VPUNPCKHQDQ_X15_X7_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFF +#define VPUNPCKHQDQ_X15_X3_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD7 +#define VPUNPCKHQDQ_X15_X7_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF7 +#define VPUNPCKHQDQ_X15_X13_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xDF +#define VPUNPCKHQDQ_X15_X13_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xFF + +#define SHUFFLE_AVX() \ + VMOVDQA X6, X13; \ + VMOVDQA X2, X14; \ + VMOVDQA X4, X6; \ + VPUNPCKLQDQ_X13_X13_X15; \ + VMOVDQA X5, X4; \ + VMOVDQA X6, X5; \ + VPUNPCKHQDQ_X15_X7_X6; \ + VPUNPCKLQDQ_X7_X7_X15; \ + VPUNPCKHQDQ_X15_X13_X7; \ + VPUNPCKLQDQ_X3_X3_X15; \ + VPUNPCKHQDQ_X15_X2_X2; \ + VPUNPCKLQDQ_X14_X14_X15; \ + VPUNPCKHQDQ_X15_X3_X3; \ + +#define SHUFFLE_AVX_INV() \ + VMOVDQA X2, X13; \ + VMOVDQA X4, X14; \ + VPUNPCKLQDQ_X2_X2_X15; \ + VMOVDQA X5, X4; \ + VPUNPCKHQDQ_X15_X3_X2; \ + VMOVDQA X14, X5; \ + VPUNPCKLQDQ_X3_X3_X15; \ + VMOVDQA X6, X14; \ + VPUNPCKHQDQ_X15_X13_X3; \ + VPUNPCKLQDQ_X7_X7_X15; \ + VPUNPCKHQDQ_X15_X6_X6; \ + VPUNPCKLQDQ_X14_X14_X15; \ + VPUNPCKHQDQ_X15_X7_X7; \ + +#define HALF_ROUND_AVX(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ + VPADDQ m0, v0, v0; \ + VPADDQ v2, v0, v0; \ + VPADDQ m1, v1, v1; \ + VPADDQ v3, v1, v1; \ + VPXOR v0, v6, v6; \ + VPXOR v1, v7, v7; \ + VPSHUFD $-79, v6, v6; \ + VPSHUFD $-79, v7, v7; \ + VPADDQ v6, v4, v4; \ + VPADDQ v7, v5, v5; \ + VPXOR v4, v2, v2; \ + VPXOR v5, v3, v3; \ + VPSHUFB c40, v2, v2; \ + VPSHUFB c40, v3, v3; \ + VPADDQ m2, v0, v0; \ + VPADDQ v2, v0, v0; \ + VPADDQ m3, v1, v1; \ + VPADDQ v3, v1, v1; \ + VPXOR v0, v6, v6; \ + VPXOR v1, v7, v7; \ + VPSHUFB c48, v6, v6; \ + VPSHUFB c48, v7, v7; \ + VPADDQ v6, v4, v4; \ + VPADDQ v7, v5, v5; \ + VPXOR v4, v2, v2; \ + VPXOR v5, v3, v3; \ + VPADDQ v2, v2, t0; \ + VPSRLQ $63, v2, v2; \ + VPXOR t0, v2, v2; \ + VPADDQ v3, v3, t0; \ + VPSRLQ $63, v3, v3; \ + VPXOR t0, v3, v3 + +// load msg: X12 = (i0, i1), X13 = (i2, i3), X14 = (i4, i5), X15 = (i6, i7) +// i0, i1, i2, i3, i4, i5, i6, i7 must not be 0 +#define LOAD_MSG_AVX(i0, i1, i2, i3, i4, i5, i6, i7) \ + VMOVQ_SI_X12(i0*8); \ + VMOVQ_SI_X13(i2*8); \ + VMOVQ_SI_X14(i4*8); \ + VMOVQ_SI_X15(i6*8); \ + VPINSRQ_1_SI_X12(i1*8); \ + VPINSRQ_1_SI_X13(i3*8); \ + VPINSRQ_1_SI_X14(i5*8); \ + VPINSRQ_1_SI_X15(i7*8) + +// load msg: X12 = (0, 2), X13 = (4, 6), X14 = (1, 3), X15 = (5, 7) +#define LOAD_MSG_AVX_0_2_4_6_1_3_5_7() \ + VMOVQ_SI_X12_0; \ + VMOVQ_SI_X13(4*8); \ + VMOVQ_SI_X14(1*8); \ + VMOVQ_SI_X15(5*8); \ + VPINSRQ_1_SI_X12(2*8); \ + VPINSRQ_1_SI_X13(6*8); \ + VPINSRQ_1_SI_X14(3*8); \ + VPINSRQ_1_SI_X15(7*8) + +// load msg: X12 = (1, 0), X13 = (11, 5), X14 = (12, 2), X15 = (7, 3) +#define LOAD_MSG_AVX_1_0_11_5_12_2_7_3() \ + VPSHUFD $0x4E, 0*8(SI), X12; \ + VMOVQ_SI_X13(11*8); \ + VMOVQ_SI_X14(12*8); \ + VMOVQ_SI_X15(7*8); \ + VPINSRQ_1_SI_X13(5*8); \ + VPINSRQ_1_SI_X14(2*8); \ + VPINSRQ_1_SI_X15(3*8) + +// load msg: X12 = (11, 12), X13 = (5, 15), X14 = (8, 0), X15 = (2, 13) +#define LOAD_MSG_AVX_11_12_5_15_8_0_2_13() \ + VMOVDQU 11*8(SI), X12; \ + VMOVQ_SI_X13(5*8); \ + VMOVQ_SI_X14(8*8); \ + VMOVQ_SI_X15(2*8); \ + VPINSRQ_1_SI_X13(15*8); \ + VPINSRQ_1_SI_X14_0; \ + VPINSRQ_1_SI_X15(13*8) + +// load msg: X12 = (2, 5), X13 = (4, 15), X14 = (6, 10), X15 = (0, 8) +#define LOAD_MSG_AVX_2_5_4_15_6_10_0_8() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X13(4*8); \ + VMOVQ_SI_X14(6*8); \ + VMOVQ_SI_X15_0; \ + VPINSRQ_1_SI_X12(5*8); \ + VPINSRQ_1_SI_X13(15*8); \ + VPINSRQ_1_SI_X14(10*8); \ + VPINSRQ_1_SI_X15(8*8) + +// load msg: X12 = (9, 5), X13 = (2, 10), X14 = (0, 7), X15 = (4, 15) +#define LOAD_MSG_AVX_9_5_2_10_0_7_4_15() \ + VMOVQ_SI_X12(9*8); \ + VMOVQ_SI_X13(2*8); \ + VMOVQ_SI_X14_0; \ + VMOVQ_SI_X15(4*8); \ + VPINSRQ_1_SI_X12(5*8); \ + VPINSRQ_1_SI_X13(10*8); \ + VPINSRQ_1_SI_X14(7*8); \ + VPINSRQ_1_SI_X15(15*8) + +// load msg: X12 = (2, 6), X13 = (0, 8), X14 = (12, 10), X15 = (11, 3) +#define LOAD_MSG_AVX_2_6_0_8_12_10_11_3() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X13_0; \ + VMOVQ_SI_X14(12*8); \ + VMOVQ_SI_X15(11*8); \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X13(8*8); \ + VPINSRQ_1_SI_X14(10*8); \ + VPINSRQ_1_SI_X15(3*8) + +// load msg: X12 = (0, 6), X13 = (9, 8), X14 = (7, 3), X15 = (2, 11) +#define LOAD_MSG_AVX_0_6_9_8_7_3_2_11() \ + MOVQ 0*8(SI), X12; \ + VPSHUFD $0x4E, 8*8(SI), X13; \ + MOVQ 7*8(SI), X14; \ + MOVQ 2*8(SI), X15; \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X14(3*8); \ + VPINSRQ_1_SI_X15(11*8) + +// load msg: X12 = (6, 14), X13 = (11, 0), X14 = (15, 9), X15 = (3, 8) +#define LOAD_MSG_AVX_6_14_11_0_15_9_3_8() \ + MOVQ 6*8(SI), X12; \ + MOVQ 11*8(SI), X13; \ + MOVQ 15*8(SI), X14; \ + MOVQ 3*8(SI), X15; \ + VPINSRQ_1_SI_X12(14*8); \ + VPINSRQ_1_SI_X13_0; \ + VPINSRQ_1_SI_X14(9*8); \ + VPINSRQ_1_SI_X15(8*8) + +// load msg: X12 = (5, 15), X13 = (8, 2), X14 = (0, 4), X15 = (6, 10) +#define LOAD_MSG_AVX_5_15_8_2_0_4_6_10() \ + MOVQ 5*8(SI), X12; \ + MOVQ 8*8(SI), X13; \ + MOVQ 0*8(SI), X14; \ + MOVQ 6*8(SI), X15; \ + VPINSRQ_1_SI_X12(15*8); \ + VPINSRQ_1_SI_X13(2*8); \ + VPINSRQ_1_SI_X14(4*8); \ + VPINSRQ_1_SI_X15(10*8) + +// load msg: X12 = (12, 13), X13 = (1, 10), X14 = (2, 7), X15 = (4, 5) +#define LOAD_MSG_AVX_12_13_1_10_2_7_4_5() \ + VMOVDQU 12*8(SI), X12; \ + MOVQ 1*8(SI), X13; \ + MOVQ 2*8(SI), X14; \ + VPINSRQ_1_SI_X13(10*8); \ + VPINSRQ_1_SI_X14(7*8); \ + VMOVDQU 4*8(SI), X15 + +// load msg: X12 = (15, 9), X13 = (3, 13), X14 = (11, 14), X15 = (12, 0) +#define LOAD_MSG_AVX_15_9_3_13_11_14_12_0() \ + MOVQ 15*8(SI), X12; \ + MOVQ 3*8(SI), X13; \ + MOVQ 11*8(SI), X14; \ + MOVQ 12*8(SI), X15; \ + VPINSRQ_1_SI_X12(9*8); \ + VPINSRQ_1_SI_X13(13*8); \ + VPINSRQ_1_SI_X14(14*8); \ + VPINSRQ_1_SI_X15_0 + +// func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) +TEXT ·hashBlocksAVX(SB), 4, $288-48 // frame size = 272 + 16 byte alignment + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVQ flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DI + + MOVQ SP, R10 + ADDQ $15, R10 + ANDQ $~15, R10 + + VMOVDQU ·AVX_c40<>(SB), X0 + VMOVDQU ·AVX_c48<>(SB), X1 + VMOVDQA X0, X8 + VMOVDQA X1, X9 + + VMOVDQU ·AVX_iv3<>(SB), X0 + VMOVDQA X0, 0(R10) + XORQ CX, 0(R10) // 0(R10) = ·AVX_iv3 ^ (CX || 0) + + VMOVDQU 0(AX), X10 + VMOVDQU 16(AX), X11 + VMOVDQU 32(AX), X2 + VMOVDQU 48(AX), X3 + + MOVQ 0(BX), R8 + MOVQ 8(BX), R9 + +loop: + ADDQ $128, R8 + CMPQ R8, $128 + JGE noinc + INCQ R9 + +noinc: + VMOVQ_R8_X15 + VPINSRQ_1_R9_X15 + + VMOVDQA X10, X0 + VMOVDQA X11, X1 + VMOVDQU ·AVX_iv0<>(SB), X4 + VMOVDQU ·AVX_iv1<>(SB), X5 + VMOVDQU ·AVX_iv2<>(SB), X6 + + VPXOR X15, X6, X6 + VMOVDQA 0(R10), X7 + + LOAD_MSG_AVX_0_2_4_6_1_3_5_7() + VMOVDQA X12, 16(R10) + VMOVDQA X13, 32(R10) + VMOVDQA X14, 48(R10) + VMOVDQA X15, 64(R10) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(8, 10, 12, 14, 9, 11, 13, 15) + VMOVDQA X12, 80(R10) + VMOVDQA X13, 96(R10) + VMOVDQA X14, 112(R10) + VMOVDQA X15, 128(R10) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX(14, 4, 9, 13, 10, 8, 15, 6) + VMOVDQA X12, 144(R10) + VMOVDQA X13, 160(R10) + VMOVDQA X14, 176(R10) + VMOVDQA X15, 192(R10) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_1_0_11_5_12_2_7_3() + VMOVDQA X12, 208(R10) + VMOVDQA X13, 224(R10) + VMOVDQA X14, 240(R10) + VMOVDQA X15, 256(R10) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX_11_12_5_15_8_0_2_13() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(10, 3, 7, 9, 14, 6, 1, 4) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX(7, 3, 13, 11, 9, 1, 12, 14) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_2_5_4_15_6_10_0_8() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX_9_5_2_10_0_7_4_15() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(14, 11, 6, 3, 1, 12, 8, 13) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX_2_6_0_8_12_10_11_3() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(4, 7, 15, 1, 13, 5, 14, 9) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX(12, 1, 14, 4, 5, 15, 13, 10) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_0_6_9_8_7_3_2_11() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX(13, 7, 12, 3, 11, 14, 1, 9) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_5_15_8_2_0_4_6_10() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX_6_14_11_0_15_9_3_8() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_12_13_1_10_2_7_4_5() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + LOAD_MSG_AVX(10, 8, 7, 1, 2, 4, 6, 5) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_15_9_3_13_11_14_12_0() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 16(R10), 32(R10), 48(R10), 64(R10), X15, X8, X9) + SHUFFLE_AVX() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 80(R10), 96(R10), 112(R10), 128(R10), X15, X8, X9) + SHUFFLE_AVX_INV() + + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 144(R10), 160(R10), 176(R10), 192(R10), X15, X8, X9) + SHUFFLE_AVX() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 208(R10), 224(R10), 240(R10), 256(R10), X15, X8, X9) + SHUFFLE_AVX_INV() + + VMOVDQU 32(AX), X14 + VMOVDQU 48(AX), X15 + VPXOR X0, X10, X10 + VPXOR X1, X11, X11 + VPXOR X2, X14, X14 + VPXOR X3, X15, X15 + VPXOR X4, X10, X10 + VPXOR X5, X11, X11 + VPXOR X6, X14, X2 + VPXOR X7, X15, X3 + VMOVDQU X2, 32(AX) + VMOVDQU X3, 48(AX) + + LEAQ 128(SI), SI + SUBQ $128, DI + JNE loop + + VMOVDQU X10, 0(AX) + VMOVDQU X11, 16(AX) + + MOVQ R8, 0(BX) + MOVQ R9, 8(BX) + VZEROUPPER + + RET diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go new file mode 100644 index 0000000000..5fa1b32841 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go @@ -0,0 +1,25 @@ +// 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. + +//go:build !go1.7 && amd64 && gc && !purego +// +build !go1.7,amd64,gc,!purego + +package blake2b + +import "golang.org/x/sys/cpu" + +func init() { + useSSE4 = cpu.X86.HasSSE41 +} + +//go:noescape +func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) + +func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { + if useSSE4 { + hashBlocksSSE4(h, c, flag, blocks) + } else { + hashBlocksGeneric(h, c, flag, blocks) + } +} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s new file mode 100644 index 0000000000..ae75eb9afc --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s @@ -0,0 +1,279 @@ +// 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. + +//go:build amd64 && gc && !purego +// +build amd64,gc,!purego + +#include "textflag.h" + +DATA ·iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 +DATA ·iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b +GLOBL ·iv0<>(SB), (NOPTR+RODATA), $16 + +DATA ·iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b +DATA ·iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·iv1<>(SB), (NOPTR+RODATA), $16 + +DATA ·iv2<>+0x00(SB)/8, $0x510e527fade682d1 +DATA ·iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f +GLOBL ·iv2<>(SB), (NOPTR+RODATA), $16 + +DATA ·iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b +DATA ·iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 +GLOBL ·iv3<>(SB), (NOPTR+RODATA), $16 + +DATA ·c40<>+0x00(SB)/8, $0x0201000706050403 +DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·c40<>(SB), (NOPTR+RODATA), $16 + +DATA ·c48<>+0x00(SB)/8, $0x0100070605040302 +DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·c48<>(SB), (NOPTR+RODATA), $16 + +#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \ + MOVO v4, t1; \ + MOVO v5, v4; \ + MOVO t1, v5; \ + MOVO v6, t1; \ + PUNPCKLQDQ v6, t2; \ + PUNPCKHQDQ v7, v6; \ + PUNPCKHQDQ t2, v6; \ + PUNPCKLQDQ v7, t2; \ + MOVO t1, v7; \ + MOVO v2, t1; \ + PUNPCKHQDQ t2, v7; \ + PUNPCKLQDQ v3, t2; \ + PUNPCKHQDQ t2, v2; \ + PUNPCKLQDQ t1, t2; \ + PUNPCKHQDQ t2, v3 + +#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \ + MOVO v4, t1; \ + MOVO v5, v4; \ + MOVO t1, v5; \ + MOVO v2, t1; \ + PUNPCKLQDQ v2, t2; \ + PUNPCKHQDQ v3, v2; \ + PUNPCKHQDQ t2, v2; \ + PUNPCKLQDQ v3, t2; \ + MOVO t1, v3; \ + MOVO v6, t1; \ + PUNPCKHQDQ t2, v3; \ + PUNPCKLQDQ v7, t2; \ + PUNPCKHQDQ t2, v6; \ + PUNPCKLQDQ t1, t2; \ + PUNPCKHQDQ t2, v7 + +#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ + PADDQ m0, v0; \ + PADDQ m1, v1; \ + PADDQ v2, v0; \ + PADDQ v3, v1; \ + PXOR v0, v6; \ + PXOR v1, v7; \ + PSHUFD $0xB1, v6, v6; \ + PSHUFD $0xB1, v7, v7; \ + PADDQ v6, v4; \ + PADDQ v7, v5; \ + PXOR v4, v2; \ + PXOR v5, v3; \ + PSHUFB c40, v2; \ + PSHUFB c40, v3; \ + PADDQ m2, v0; \ + PADDQ m3, v1; \ + PADDQ v2, v0; \ + PADDQ v3, v1; \ + PXOR v0, v6; \ + PXOR v1, v7; \ + PSHUFB c48, v6; \ + PSHUFB c48, v7; \ + PADDQ v6, v4; \ + PADDQ v7, v5; \ + PXOR v4, v2; \ + PXOR v5, v3; \ + MOVOU v2, t0; \ + PADDQ v2, t0; \ + PSRLQ $63, v2; \ + PXOR t0, v2; \ + MOVOU v3, t0; \ + PADDQ v3, t0; \ + PSRLQ $63, v3; \ + PXOR t0, v3 + +#define LOAD_MSG(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7) \ + MOVQ i0*8(src), m0; \ + PINSRQ $1, i1*8(src), m0; \ + MOVQ i2*8(src), m1; \ + PINSRQ $1, i3*8(src), m1; \ + MOVQ i4*8(src), m2; \ + PINSRQ $1, i5*8(src), m2; \ + MOVQ i6*8(src), m3; \ + PINSRQ $1, i7*8(src), m3 + +// func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) +TEXT ·hashBlocksSSE4(SB), 4, $288-48 // frame size = 272 + 16 byte alignment + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVQ flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DI + + MOVQ SP, R10 + ADDQ $15, R10 + ANDQ $~15, R10 + + MOVOU ·iv3<>(SB), X0 + MOVO X0, 0(R10) + XORQ CX, 0(R10) // 0(R10) = ·iv3 ^ (CX || 0) + + MOVOU ·c40<>(SB), X13 + MOVOU ·c48<>(SB), X14 + + MOVOU 0(AX), X12 + MOVOU 16(AX), X15 + + MOVQ 0(BX), R8 + MOVQ 8(BX), R9 + +loop: + ADDQ $128, R8 + CMPQ R8, $128 + JGE noinc + INCQ R9 + +noinc: + MOVQ R8, X8 + PINSRQ $1, R9, X8 + + MOVO X12, X0 + MOVO X15, X1 + MOVOU 32(AX), X2 + MOVOU 48(AX), X3 + MOVOU ·iv0<>(SB), X4 + MOVOU ·iv1<>(SB), X5 + MOVOU ·iv2<>(SB), X6 + + PXOR X8, X6 + MOVO 0(R10), X7 + + LOAD_MSG(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7) + MOVO X8, 16(R10) + MOVO X9, 32(R10) + MOVO X10, 48(R10) + MOVO X11, 64(R10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 8, 10, 12, 14, 9, 11, 13, 15) + MOVO X8, 80(R10) + MOVO X9, 96(R10) + MOVO X10, 112(R10) + MOVO X11, 128(R10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6) + MOVO X8, 144(R10) + MOVO X9, 160(R10) + MOVO X10, 176(R10) + MOVO X11, 192(R10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 1, 0, 11, 5, 12, 2, 7, 3) + MOVO X8, 208(R10) + MOVO X9, 224(R10) + MOVO X10, 240(R10) + MOVO X11, 256(R10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 10, 3, 7, 9, 14, 6, 1, 4) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 2, 5, 4, 15, 6, 10, 0, 8) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 14, 11, 6, 3, 1, 12, 8, 13) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 4, 7, 15, 1, 13, 5, 14, 9) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 0, 6, 9, 8, 7, 3, 2, 11) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 5, 15, 8, 2, 0, 4, 6, 10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 12, 13, 1, 10, 2, 7, 4, 5) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + LOAD_MSG(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, SI, 15, 9, 3, 13, 11, 14, 12, 0) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 16(R10), 32(R10), 48(R10), 64(R10), X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 80(R10), 96(R10), 112(R10), 128(R10), X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 144(R10), 160(R10), 176(R10), 192(R10), X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 208(R10), 224(R10), 240(R10), 256(R10), X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + MOVOU 32(AX), X10 + MOVOU 48(AX), X11 + PXOR X0, X12 + PXOR X1, X15 + PXOR X2, X10 + PXOR X3, X11 + PXOR X4, X12 + PXOR X5, X15 + PXOR X6, X10 + PXOR X7, X11 + MOVOU X10, 32(AX) + MOVOU X11, 48(AX) + + LEAQ 128(SI), SI + SUBQ $128, DI + JNE loop + + MOVOU X12, 0(AX) + MOVOU X15, 16(AX) + + MOVQ R8, 0(BX) + MOVQ R9, 8(BX) + + RET diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go b/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go new file mode 100644 index 0000000000..3168a8aa3c --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go @@ -0,0 +1,182 @@ +// 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 blake2b + +import ( + "encoding/binary" + "math/bits" +) + +// the precomputed values for BLAKE2b +// there are 12 16-byte arrays - one for each round +// the entries are calculated from the sigma constants. +var precomputed = [12][16]byte{ + {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, + {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, + {11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4}, + {7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8}, + {9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13}, + {2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9}, + {12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11}, + {13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10}, + {6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5}, + {10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0}, + {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, // equal to the first + {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, // equal to the second +} + +func hashBlocksGeneric(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { + var m [16]uint64 + c0, c1 := c[0], c[1] + + for i := 0; i < len(blocks); { + c0 += BlockSize + if c0 < BlockSize { + c1++ + } + + v0, v1, v2, v3, v4, v5, v6, v7 := h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] + v8, v9, v10, v11, v12, v13, v14, v15 := iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7] + v12 ^= c0 + v13 ^= c1 + v14 ^= flag + + for j := range m { + m[j] = binary.LittleEndian.Uint64(blocks[i:]) + i += 8 + } + + for j := range precomputed { + s := &(precomputed[j]) + + v0 += m[s[0]] + v0 += v4 + v12 ^= v0 + v12 = bits.RotateLeft64(v12, -32) + v8 += v12 + v4 ^= v8 + v4 = bits.RotateLeft64(v4, -24) + v1 += m[s[1]] + v1 += v5 + v13 ^= v1 + v13 = bits.RotateLeft64(v13, -32) + v9 += v13 + v5 ^= v9 + v5 = bits.RotateLeft64(v5, -24) + v2 += m[s[2]] + v2 += v6 + v14 ^= v2 + v14 = bits.RotateLeft64(v14, -32) + v10 += v14 + v6 ^= v10 + v6 = bits.RotateLeft64(v6, -24) + v3 += m[s[3]] + v3 += v7 + v15 ^= v3 + v15 = bits.RotateLeft64(v15, -32) + v11 += v15 + v7 ^= v11 + v7 = bits.RotateLeft64(v7, -24) + + v0 += m[s[4]] + v0 += v4 + v12 ^= v0 + v12 = bits.RotateLeft64(v12, -16) + v8 += v12 + v4 ^= v8 + v4 = bits.RotateLeft64(v4, -63) + v1 += m[s[5]] + v1 += v5 + v13 ^= v1 + v13 = bits.RotateLeft64(v13, -16) + v9 += v13 + v5 ^= v9 + v5 = bits.RotateLeft64(v5, -63) + v2 += m[s[6]] + v2 += v6 + v14 ^= v2 + v14 = bits.RotateLeft64(v14, -16) + v10 += v14 + v6 ^= v10 + v6 = bits.RotateLeft64(v6, -63) + v3 += m[s[7]] + v3 += v7 + v15 ^= v3 + v15 = bits.RotateLeft64(v15, -16) + v11 += v15 + v7 ^= v11 + v7 = bits.RotateLeft64(v7, -63) + + v0 += m[s[8]] + v0 += v5 + v15 ^= v0 + v15 = bits.RotateLeft64(v15, -32) + v10 += v15 + v5 ^= v10 + v5 = bits.RotateLeft64(v5, -24) + v1 += m[s[9]] + v1 += v6 + v12 ^= v1 + v12 = bits.RotateLeft64(v12, -32) + v11 += v12 + v6 ^= v11 + v6 = bits.RotateLeft64(v6, -24) + v2 += m[s[10]] + v2 += v7 + v13 ^= v2 + v13 = bits.RotateLeft64(v13, -32) + v8 += v13 + v7 ^= v8 + v7 = bits.RotateLeft64(v7, -24) + v3 += m[s[11]] + v3 += v4 + v14 ^= v3 + v14 = bits.RotateLeft64(v14, -32) + v9 += v14 + v4 ^= v9 + v4 = bits.RotateLeft64(v4, -24) + + v0 += m[s[12]] + v0 += v5 + v15 ^= v0 + v15 = bits.RotateLeft64(v15, -16) + v10 += v15 + v5 ^= v10 + v5 = bits.RotateLeft64(v5, -63) + v1 += m[s[13]] + v1 += v6 + v12 ^= v1 + v12 = bits.RotateLeft64(v12, -16) + v11 += v12 + v6 ^= v11 + v6 = bits.RotateLeft64(v6, -63) + v2 += m[s[14]] + v2 += v7 + v13 ^= v2 + v13 = bits.RotateLeft64(v13, -16) + v8 += v13 + v7 ^= v8 + v7 = bits.RotateLeft64(v7, -63) + v3 += m[s[15]] + v3 += v4 + v14 ^= v3 + v14 = bits.RotateLeft64(v14, -16) + v9 += v14 + v4 ^= v9 + v4 = bits.RotateLeft64(v4, -63) + + } + + h[0] ^= v0 ^ v8 + h[1] ^= v1 ^ v9 + h[2] ^= v2 ^ v10 + h[3] ^= v3 ^ v11 + h[4] ^= v4 ^ v12 + h[5] ^= v5 ^ v13 + h[6] ^= v6 ^ v14 + h[7] ^= v7 ^ v15 + } + c[0], c[1] = c0, c1 +} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go b/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go new file mode 100644 index 0000000000..b0137cdf02 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go @@ -0,0 +1,12 @@ +// 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. + +//go:build !amd64 || purego || !gc +// +build !amd64 purego !gc + +package blake2b + +func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { + hashBlocksGeneric(h, c, flag, blocks) +} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2x.go b/vendor/golang.org/x/crypto/blake2b/blake2x.go new file mode 100644 index 0000000000..52c414db0e --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/blake2x.go @@ -0,0 +1,177 @@ +// 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 blake2b + +import ( + "encoding/binary" + "errors" + "io" +) + +// XOF defines the interface to hash functions that +// support arbitrary-length output. +type XOF interface { + // Write absorbs more data into the hash's state. It panics if called + // after Read. + io.Writer + + // Read reads more output from the hash. It returns io.EOF if the limit + // has been reached. + io.Reader + + // Clone returns a copy of the XOF in its current state. + Clone() XOF + + // Reset resets the XOF to its initial state. + Reset() +} + +// OutputLengthUnknown can be used as the size argument to NewXOF to indicate +// the length of the output is not known in advance. +const OutputLengthUnknown = 0 + +// magicUnknownOutputLength is a magic value for the output size that indicates +// an unknown number of output bytes. +const magicUnknownOutputLength = (1 << 32) - 1 + +// maxOutputLength is the absolute maximum number of bytes to produce when the +// number of output bytes is unknown. +const maxOutputLength = (1 << 32) * 64 + +// NewXOF creates a new variable-output-length hash. The hash either produce a +// known number of bytes (1 <= size < 2**32-1), or an unknown number of bytes +// (size == OutputLengthUnknown). In the latter case, an absolute limit of +// 256GiB applies. +// +// A non-nil key turns the hash into a MAC. The key must between +// zero and 32 bytes long. +func NewXOF(size uint32, key []byte) (XOF, error) { + if len(key) > Size { + return nil, errKeySize + } + if size == magicUnknownOutputLength { + // 2^32-1 indicates an unknown number of bytes and thus isn't a + // valid length. + return nil, errors.New("blake2b: XOF length too large") + } + if size == OutputLengthUnknown { + size = magicUnknownOutputLength + } + x := &xof{ + d: digest{ + size: Size, + keyLen: len(key), + }, + length: size, + } + copy(x.d.key[:], key) + x.Reset() + return x, nil +} + +type xof struct { + d digest + length uint32 + remaining uint64 + cfg, root, block [Size]byte + offset int + nodeOffset uint32 + readMode bool +} + +func (x *xof) Write(p []byte) (n int, err error) { + if x.readMode { + panic("blake2b: write to XOF after read") + } + return x.d.Write(p) +} + +func (x *xof) Clone() XOF { + clone := *x + return &clone +} + +func (x *xof) Reset() { + x.cfg[0] = byte(Size) + binary.LittleEndian.PutUint32(x.cfg[4:], uint32(Size)) // leaf length + binary.LittleEndian.PutUint32(x.cfg[12:], x.length) // XOF length + x.cfg[17] = byte(Size) // inner hash size + + x.d.Reset() + x.d.h[1] ^= uint64(x.length) << 32 + + x.remaining = uint64(x.length) + if x.remaining == magicUnknownOutputLength { + x.remaining = maxOutputLength + } + x.offset, x.nodeOffset = 0, 0 + x.readMode = false +} + +func (x *xof) Read(p []byte) (n int, err error) { + if !x.readMode { + x.d.finalize(&x.root) + x.readMode = true + } + + if x.remaining == 0 { + return 0, io.EOF + } + + n = len(p) + if uint64(n) > x.remaining { + n = int(x.remaining) + p = p[:n] + } + + if x.offset > 0 { + blockRemaining := Size - x.offset + if n < blockRemaining { + x.offset += copy(p, x.block[x.offset:]) + x.remaining -= uint64(n) + return + } + copy(p, x.block[x.offset:]) + p = p[blockRemaining:] + x.offset = 0 + x.remaining -= uint64(blockRemaining) + } + + for len(p) >= Size { + binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset) + x.nodeOffset++ + + x.d.initConfig(&x.cfg) + x.d.Write(x.root[:]) + x.d.finalize(&x.block) + + copy(p, x.block[:]) + p = p[Size:] + x.remaining -= uint64(Size) + } + + if todo := len(p); todo > 0 { + if x.remaining < uint64(Size) { + x.cfg[0] = byte(x.remaining) + } + binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset) + x.nodeOffset++ + + x.d.initConfig(&x.cfg) + x.d.Write(x.root[:]) + x.d.finalize(&x.block) + + x.offset = copy(p, x.block[:todo]) + x.remaining -= uint64(todo) + } + return +} + +func (d *digest) initConfig(cfg *[Size]byte) { + d.offset, d.c[0], d.c[1] = 0, 0, 0 + for i := range d.h { + d.h[i] = iv[i] ^ binary.LittleEndian.Uint64(cfg[i*8:]) + } +} diff --git a/vendor/golang.org/x/crypto/blake2b/register.go b/vendor/golang.org/x/crypto/blake2b/register.go new file mode 100644 index 0000000000..9d8633963c --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/register.go @@ -0,0 +1,33 @@ +// 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. + +//go:build go1.9 +// +build go1.9 + +package blake2b + +import ( + "crypto" + "hash" +) + +func init() { + newHash256 := func() hash.Hash { + h, _ := New256(nil) + return h + } + newHash384 := func() hash.Hash { + h, _ := New384(nil) + return h + } + + newHash512 := func() hash.Hash { + h, _ := New512(nil) + return h + } + + crypto.RegisterHash(crypto.BLAKE2b_256, newHash256) + crypto.RegisterHash(crypto.BLAKE2b_384, newHash384) + crypto.RegisterHash(crypto.BLAKE2b_512, newHash512) +} diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go index bc62161d6e..00f963ea20 100644 --- a/vendor/golang.org/x/crypto/curve25519/curve25519.go +++ b/vendor/golang.org/x/crypto/curve25519/curve25519.go @@ -5,71 +5,18 @@ // Package curve25519 provides an implementation of the X25519 function, which // performs scalar multiplication on the elliptic curve known as Curve25519. // See RFC 7748. +// +// Starting in Go 1.20, this package is a wrapper for the X25519 implementation +// in the crypto/ecdh package. package curve25519 // import "golang.org/x/crypto/curve25519" -import ( - "crypto/subtle" - "errors" - "strconv" - - "golang.org/x/crypto/curve25519/internal/field" -) - // ScalarMult sets dst to the product scalar * point. // // Deprecated: when provided a low-order point, ScalarMult will set dst to all // zeroes, irrespective of the scalar. Instead, use the X25519 function, which // will return an error. func ScalarMult(dst, scalar, point *[32]byte) { - var e [32]byte - - copy(e[:], scalar[:]) - e[0] &= 248 - e[31] &= 127 - e[31] |= 64 - - var x1, x2, z2, x3, z3, tmp0, tmp1 field.Element - x1.SetBytes(point[:]) - x2.One() - x3.Set(&x1) - z3.One() - - swap := 0 - for pos := 254; pos >= 0; pos-- { - b := e[pos/8] >> uint(pos&7) - b &= 1 - swap ^= int(b) - x2.Swap(&x3, swap) - z2.Swap(&z3, swap) - swap = int(b) - - tmp0.Subtract(&x3, &z3) - tmp1.Subtract(&x2, &z2) - x2.Add(&x2, &z2) - z2.Add(&x3, &z3) - z3.Multiply(&tmp0, &x2) - z2.Multiply(&z2, &tmp1) - tmp0.Square(&tmp1) - tmp1.Square(&x2) - x3.Add(&z3, &z2) - z2.Subtract(&z3, &z2) - x2.Multiply(&tmp1, &tmp0) - tmp1.Subtract(&tmp1, &tmp0) - z2.Square(&z2) - - z3.Mult32(&tmp1, 121666) - x3.Square(&x3) - tmp0.Add(&tmp0, &z3) - z3.Multiply(&x1, &z2) - z2.Multiply(&tmp1, &tmp0) - } - - x2.Swap(&x3, swap) - z2.Swap(&z3, swap) - - z2.Invert(&z2) - x2.Multiply(&x2, &z2) - copy(dst[:], x2.Bytes()) + scalarMult(dst, scalar, point) } // ScalarBaseMult sets dst to the product scalar * base where base is the @@ -78,7 +25,7 @@ func ScalarMult(dst, scalar, point *[32]byte) { // It is recommended to use the X25519 function with Basepoint instead, as // copying into fixed size arrays can lead to unexpected bugs. func ScalarBaseMult(dst, scalar *[32]byte) { - ScalarMult(dst, scalar, &basePoint) + scalarBaseMult(dst, scalar) } const ( @@ -91,21 +38,10 @@ const ( // Basepoint is the canonical Curve25519 generator. var Basepoint []byte -var basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +var basePoint = [32]byte{9} func init() { Basepoint = basePoint[:] } -func checkBasepoint() { - if subtle.ConstantTimeCompare(Basepoint, []byte{ - 0x09, 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, - }) != 1 { - panic("curve25519: global Basepoint value was modified") - } -} - // X25519 returns the result of the scalar multiplication (scalar * point), // according to RFC 7748, Section 5. scalar, point and the return value are // slices of 32 bytes. @@ -121,26 +57,3 @@ func X25519(scalar, point []byte) ([]byte, error) { var dst [32]byte return x25519(&dst, scalar, point) } - -func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) { - var in [32]byte - if l := len(scalar); l != 32 { - return nil, errors.New("bad scalar length: " + strconv.Itoa(l) + ", expected 32") - } - if l := len(point); l != 32 { - return nil, errors.New("bad point length: " + strconv.Itoa(l) + ", expected 32") - } - copy(in[:], scalar) - if &point[0] == &Basepoint[0] { - checkBasepoint() - ScalarBaseMult(dst, &in) - } else { - var base, zero [32]byte - copy(base[:], point) - ScalarMult(dst, &in, &base) - if subtle.ConstantTimeCompare(dst[:], zero[:]) == 1 { - return nil, errors.New("bad input point: low order point") - } - } - return dst[:], nil -} diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_compat.go b/vendor/golang.org/x/crypto/curve25519/curve25519_compat.go new file mode 100644 index 0000000000..ba647e8d77 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_compat.go @@ -0,0 +1,105 @@ +// Copyright 2019 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:build !go1.20 + +package curve25519 + +import ( + "crypto/subtle" + "errors" + "strconv" + + "golang.org/x/crypto/curve25519/internal/field" +) + +func scalarMult(dst, scalar, point *[32]byte) { + var e [32]byte + + copy(e[:], scalar[:]) + e[0] &= 248 + e[31] &= 127 + e[31] |= 64 + + var x1, x2, z2, x3, z3, tmp0, tmp1 field.Element + x1.SetBytes(point[:]) + x2.One() + x3.Set(&x1) + z3.One() + + swap := 0 + for pos := 254; pos >= 0; pos-- { + b := e[pos/8] >> uint(pos&7) + b &= 1 + swap ^= int(b) + x2.Swap(&x3, swap) + z2.Swap(&z3, swap) + swap = int(b) + + tmp0.Subtract(&x3, &z3) + tmp1.Subtract(&x2, &z2) + x2.Add(&x2, &z2) + z2.Add(&x3, &z3) + z3.Multiply(&tmp0, &x2) + z2.Multiply(&z2, &tmp1) + tmp0.Square(&tmp1) + tmp1.Square(&x2) + x3.Add(&z3, &z2) + z2.Subtract(&z3, &z2) + x2.Multiply(&tmp1, &tmp0) + tmp1.Subtract(&tmp1, &tmp0) + z2.Square(&z2) + + z3.Mult32(&tmp1, 121666) + x3.Square(&x3) + tmp0.Add(&tmp0, &z3) + z3.Multiply(&x1, &z2) + z2.Multiply(&tmp1, &tmp0) + } + + x2.Swap(&x3, swap) + z2.Swap(&z3, swap) + + z2.Invert(&z2) + x2.Multiply(&x2, &z2) + copy(dst[:], x2.Bytes()) +} + +func scalarBaseMult(dst, scalar *[32]byte) { + checkBasepoint() + scalarMult(dst, scalar, &basePoint) +} + +func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) { + var in [32]byte + if l := len(scalar); l != 32 { + return nil, errors.New("bad scalar length: " + strconv.Itoa(l) + ", expected 32") + } + if l := len(point); l != 32 { + return nil, errors.New("bad point length: " + strconv.Itoa(l) + ", expected 32") + } + copy(in[:], scalar) + if &point[0] == &Basepoint[0] { + scalarBaseMult(dst, &in) + } else { + var base, zero [32]byte + copy(base[:], point) + scalarMult(dst, &in, &base) + if subtle.ConstantTimeCompare(dst[:], zero[:]) == 1 { + return nil, errors.New("bad input point: low order point") + } + } + return dst[:], nil +} + +func checkBasepoint() { + if subtle.ConstantTimeCompare(Basepoint, []byte{ + 0x09, 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, + }) != 1 { + panic("curve25519: global Basepoint value was modified") + } +} diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_go120.go b/vendor/golang.org/x/crypto/curve25519/curve25519_go120.go new file mode 100644 index 0000000000..627df49727 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_go120.go @@ -0,0 +1,46 @@ +// Copyright 2022 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:build go1.20 + +package curve25519 + +import "crypto/ecdh" + +func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) { + curve := ecdh.X25519() + pub, err := curve.NewPublicKey(point) + if err != nil { + return nil, err + } + priv, err := curve.NewPrivateKey(scalar) + if err != nil { + return nil, err + } + out, err := priv.ECDH(pub) + if err != nil { + return nil, err + } + copy(dst[:], out) + return dst[:], nil +} + +func scalarMult(dst, scalar, point *[32]byte) { + if _, err := x25519(dst, scalar[:], point[:]); err != nil { + // The only error condition for x25519 when the inputs are 32 bytes long + // is if the output would have been the all-zero value. + for i := range dst { + dst[i] = 0 + } + } +} + +func scalarBaseMult(dst, scalar *[32]byte) { + curve := ecdh.X25519() + priv, err := curve.NewPrivateKey(scalar[:]) + if err != nil { + panic("curve25519: internal error: scalarBaseMult was not 32 bytes") + } + copy(dst[:], priv.PublicKey().Bytes()) +} diff --git a/vendor/golang.org/x/crypto/hkdf/hkdf.go b/vendor/golang.org/x/crypto/hkdf/hkdf.go new file mode 100644 index 0000000000..dda3f143be --- /dev/null +++ b/vendor/golang.org/x/crypto/hkdf/hkdf.go @@ -0,0 +1,93 @@ +// 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 hkdf implements the HMAC-based Extract-and-Expand Key Derivation +// Function (HKDF) as defined in RFC 5869. +// +// HKDF is a cryptographic key derivation function (KDF) with the goal of +// expanding limited input keying material into one or more cryptographically +// strong secret keys. +package hkdf // import "golang.org/x/crypto/hkdf" + +import ( + "crypto/hmac" + "errors" + "hash" + "io" +) + +// Extract generates a pseudorandom key for use with Expand from an input secret +// and an optional independent salt. +// +// Only use this function if you need to reuse the extracted key with multiple +// Expand invocations and different context values. Most common scenarios, +// including the generation of multiple keys, should use New instead. +func Extract(hash func() hash.Hash, secret, salt []byte) []byte { + if salt == nil { + salt = make([]byte, hash().Size()) + } + extractor := hmac.New(hash, salt) + extractor.Write(secret) + return extractor.Sum(nil) +} + +type hkdf struct { + expander hash.Hash + size int + + info []byte + counter byte + + prev []byte + buf []byte +} + +func (f *hkdf) Read(p []byte) (int, error) { + // Check whether enough data can be generated + need := len(p) + remains := len(f.buf) + int(255-f.counter+1)*f.size + if remains < need { + return 0, errors.New("hkdf: entropy limit reached") + } + // Read any leftover from the buffer + n := copy(p, f.buf) + p = p[n:] + + // Fill the rest of the buffer + for len(p) > 0 { + f.expander.Reset() + f.expander.Write(f.prev) + f.expander.Write(f.info) + f.expander.Write([]byte{f.counter}) + f.prev = f.expander.Sum(f.prev[:0]) + f.counter++ + + // Copy the new batch into p + f.buf = f.prev + n = copy(p, f.buf) + p = p[n:] + } + // Save leftovers for next run + f.buf = f.buf[n:] + + return need, nil +} + +// Expand returns a Reader, from which keys can be read, using the given +// pseudorandom key and optional context info, skipping the extraction step. +// +// The pseudorandomKey should have been generated by Extract, or be a uniformly +// random or pseudorandom cryptographically strong key. See RFC 5869, Section +// 3.3. Most common scenarios will want to use New instead. +func Expand(hash func() hash.Hash, pseudorandomKey, info []byte) io.Reader { + expander := hmac.New(hash, pseudorandomKey) + return &hkdf{expander, expander.Size(), info, 1, nil, nil} +} + +// New returns a Reader, from which keys can be read, using the given hash, +// secret, salt and context info. Salt and info can be nil. +func New(hash func() hash.Hash, secret, salt, info []byte) io.Reader { + prk := Extract(hash, secret, salt) + return Expand(hash, prk, info) +} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/compressed.go b/vendor/golang.org/x/crypto/openpgp/packet/compressed.go index e8f0b5caa7..353f945247 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/compressed.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/compressed.go @@ -60,7 +60,7 @@ func (c *Compressed) parse(r io.Reader) error { return err } -// compressedWriterCloser represents the serialized compression stream +// compressedWriteCloser represents the serialized compression stream // header and the compressor. Its Close() method ensures that both the // compressor and serialized stream header are closed. Its Write() // method writes to the compressor. diff --git a/vendor/golang.org/x/crypto/sha3/doc.go b/vendor/golang.org/x/crypto/sha3/doc.go new file mode 100644 index 0000000000..decd8cf9bf --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/doc.go @@ -0,0 +1,62 @@ +// 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 sha3 implements the SHA-3 fixed-output-length hash functions and +// the SHAKE variable-output-length hash functions defined by FIPS-202. +// +// Both types of hash function use the "sponge" construction and the Keccak +// permutation. For a detailed specification see http://keccak.noekeon.org/ +// +// # Guidance +// +// If you aren't sure what function you need, use SHAKE256 with at least 64 +// bytes of output. The SHAKE instances are faster than the SHA3 instances; +// the latter have to allocate memory to conform to the hash.Hash interface. +// +// If you need a secret-key MAC (message authentication code), prepend the +// secret key to the input, hash with SHAKE256 and read at least 32 bytes of +// output. +// +// # Security strengths +// +// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security +// strength against preimage attacks of x bits. Since they only produce "x" +// bits of output, their collision-resistance is only "x/2" bits. +// +// The SHAKE-256 and -128 functions have a generic security strength of 256 and +// 128 bits against all attacks, provided that at least 2x bits of their output +// is used. Requesting more than 64 or 32 bytes of output, respectively, does +// not increase the collision-resistance of the SHAKE functions. +// +// # The sponge construction +// +// A sponge builds a pseudo-random function from a public pseudo-random +// permutation, by applying the permutation to a state of "rate + capacity" +// bytes, but hiding "capacity" of the bytes. +// +// A sponge starts out with a zero state. To hash an input using a sponge, up +// to "rate" bytes of the input are XORed into the sponge's state. The sponge +// is then "full" and the permutation is applied to "empty" it. This process is +// repeated until all the input has been "absorbed". The input is then padded. +// The digest is "squeezed" from the sponge in the same way, except that output +// is copied out instead of input being XORed in. +// +// A sponge is parameterized by its generic security strength, which is equal +// to half its capacity; capacity + rate is equal to the permutation's width. +// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means +// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. +// +// # Recommendations +// +// The SHAKE functions are recommended for most new uses. They can produce +// output of arbitrary length. SHAKE256, with an output length of at least +// 64 bytes, provides 256-bit security against all attacks. The Keccak team +// recommends it for most applications upgrading from SHA2-512. (NIST chose a +// much stronger, but much slower, sponge instance for SHA3-512.) +// +// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. +// They produce output of the same length, with the same security strengths +// against all attacks. This means, in particular, that SHA3-256 only has +// 128-bit collision resistance, because its output length is 32 bytes. +package sha3 // import "golang.org/x/crypto/sha3" diff --git a/vendor/golang.org/x/crypto/sha3/hashes.go b/vendor/golang.org/x/crypto/sha3/hashes.go new file mode 100644 index 0000000000..0d8043fd2a --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/hashes.go @@ -0,0 +1,97 @@ +// 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 sha3 + +// This file provides functions for creating instances of the SHA-3 +// and SHAKE hash functions, as well as utility functions for hashing +// bytes. + +import ( + "hash" +) + +// New224 creates a new SHA3-224 hash. +// Its generic security strength is 224 bits against preimage attacks, +// and 112 bits against collision attacks. +func New224() hash.Hash { + if h := new224Asm(); h != nil { + return h + } + return &state{rate: 144, outputLen: 28, dsbyte: 0x06} +} + +// New256 creates a new SHA3-256 hash. +// Its generic security strength is 256 bits against preimage attacks, +// and 128 bits against collision attacks. +func New256() hash.Hash { + if h := new256Asm(); h != nil { + return h + } + return &state{rate: 136, outputLen: 32, dsbyte: 0x06} +} + +// New384 creates a new SHA3-384 hash. +// Its generic security strength is 384 bits against preimage attacks, +// and 192 bits against collision attacks. +func New384() hash.Hash { + if h := new384Asm(); h != nil { + return h + } + return &state{rate: 104, outputLen: 48, dsbyte: 0x06} +} + +// New512 creates a new SHA3-512 hash. +// Its generic security strength is 512 bits against preimage attacks, +// and 256 bits against collision attacks. +func New512() hash.Hash { + if h := new512Asm(); h != nil { + return h + } + return &state{rate: 72, outputLen: 64, dsbyte: 0x06} +} + +// NewLegacyKeccak256 creates a new Keccak-256 hash. +// +// Only use this function if you require compatibility with an existing cryptosystem +// that uses non-standard padding. All other users should use New256 instead. +func NewLegacyKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } + +// NewLegacyKeccak512 creates a new Keccak-512 hash. +// +// Only use this function if you require compatibility with an existing cryptosystem +// that uses non-standard padding. All other users should use New512 instead. +func NewLegacyKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} } + +// Sum224 returns the SHA3-224 digest of the data. +func Sum224(data []byte) (digest [28]byte) { + h := New224() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum256 returns the SHA3-256 digest of the data. +func Sum256(data []byte) (digest [32]byte) { + h := New256() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum384 returns the SHA3-384 digest of the data. +func Sum384(data []byte) (digest [48]byte) { + h := New384() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum512 returns the SHA3-512 digest of the data. +func Sum512(data []byte) (digest [64]byte) { + h := New512() + h.Write(data) + h.Sum(digest[:0]) + return +} diff --git a/vendor/golang.org/x/crypto/sha3/hashes_generic.go b/vendor/golang.org/x/crypto/sha3/hashes_generic.go new file mode 100644 index 0000000000..c74fc20fcb --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/hashes_generic.go @@ -0,0 +1,28 @@ +// 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. + +//go:build !gc || purego || !s390x +// +build !gc purego !s390x + +package sha3 + +import ( + "hash" +) + +// new224Asm returns an assembly implementation of SHA3-224 if available, +// otherwise it returns nil. +func new224Asm() hash.Hash { return nil } + +// new256Asm returns an assembly implementation of SHA3-256 if available, +// otherwise it returns nil. +func new256Asm() hash.Hash { return nil } + +// new384Asm returns an assembly implementation of SHA3-384 if available, +// otherwise it returns nil. +func new384Asm() hash.Hash { return nil } + +// new512Asm returns an assembly implementation of SHA3-512 if available, +// otherwise it returns nil. +func new512Asm() hash.Hash { return nil } diff --git a/vendor/golang.org/x/crypto/sha3/keccakf.go b/vendor/golang.org/x/crypto/sha3/keccakf.go new file mode 100644 index 0000000000..e5faa375c0 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/keccakf.go @@ -0,0 +1,415 @@ +// 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. + +//go:build !amd64 || purego || !gc +// +build !amd64 purego !gc + +package sha3 + +import "math/bits" + +// rc stores the round constants for use in the ι step. +var rc = [24]uint64{ + 0x0000000000000001, + 0x0000000000008082, + 0x800000000000808A, + 0x8000000080008000, + 0x000000000000808B, + 0x0000000080000001, + 0x8000000080008081, + 0x8000000000008009, + 0x000000000000008A, + 0x0000000000000088, + 0x0000000080008009, + 0x000000008000000A, + 0x000000008000808B, + 0x800000000000008B, + 0x8000000000008089, + 0x8000000000008003, + 0x8000000000008002, + 0x8000000000000080, + 0x000000000000800A, + 0x800000008000000A, + 0x8000000080008081, + 0x8000000000008080, + 0x0000000080000001, + 0x8000000080008008, +} + +// keccakF1600 applies the Keccak permutation to a 1600b-wide +// state represented as a slice of 25 uint64s. +func keccakF1600(a *[25]uint64) { + // Implementation translated from Keccak-inplace.c + // in the keccak reference code. + var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 + + for i := 0; i < 24; i += 4 { + // Combines the 5 steps in each round into 2 steps. + // Unrolls 4 rounds per loop and spreads some steps across rounds. + + // Round 1 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[6] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[12] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[18] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[24] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] + a[6] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[16] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[22] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[3] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[10] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[1] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[7] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[19] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[20] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[11] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[23] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[4] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[5] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[2] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[8] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[14] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[15] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + // Round 2 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[16] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[7] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[23] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[14] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] + a[16] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[11] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[2] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[18] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[20] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[6] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[22] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[4] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[15] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[1] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[8] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[24] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[10] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[12] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[3] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[19] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[5] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + // Round 3 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[11] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[22] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[8] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[19] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] + a[11] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[1] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[12] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[23] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[15] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[16] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[2] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[24] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[5] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[6] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[3] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[14] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[20] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[7] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[18] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[4] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[10] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + // Round 4 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[1] ^ d1 + bc1 = bits.RotateLeft64(t, 44) + t = a[2] ^ d2 + bc2 = bits.RotateLeft64(t, 43) + t = a[3] ^ d3 + bc3 = bits.RotateLeft64(t, 21) + t = a[4] ^ d4 + bc4 = bits.RotateLeft64(t, 14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] + a[1] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc2 = bits.RotateLeft64(t, 3) + t = a[6] ^ d1 + bc3 = bits.RotateLeft64(t, 45) + t = a[7] ^ d2 + bc4 = bits.RotateLeft64(t, 61) + t = a[8] ^ d3 + bc0 = bits.RotateLeft64(t, 28) + t = a[9] ^ d4 + bc1 = bits.RotateLeft64(t, 20) + a[5] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc4 = bits.RotateLeft64(t, 18) + t = a[11] ^ d1 + bc0 = bits.RotateLeft64(t, 1) + t = a[12] ^ d2 + bc1 = bits.RotateLeft64(t, 6) + t = a[13] ^ d3 + bc2 = bits.RotateLeft64(t, 25) + t = a[14] ^ d4 + bc3 = bits.RotateLeft64(t, 8) + a[10] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc1 = bits.RotateLeft64(t, 36) + t = a[16] ^ d1 + bc2 = bits.RotateLeft64(t, 10) + t = a[17] ^ d2 + bc3 = bits.RotateLeft64(t, 15) + t = a[18] ^ d3 + bc4 = bits.RotateLeft64(t, 56) + t = a[19] ^ d4 + bc0 = bits.RotateLeft64(t, 27) + a[15] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc3 = bits.RotateLeft64(t, 41) + t = a[21] ^ d1 + bc4 = bits.RotateLeft64(t, 2) + t = a[22] ^ d2 + bc0 = bits.RotateLeft64(t, 62) + t = a[23] ^ d3 + bc1 = bits.RotateLeft64(t, 55) + t = a[24] ^ d4 + bc2 = bits.RotateLeft64(t, 39) + a[20] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + } +} diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go new file mode 100644 index 0000000000..248a38241f --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go @@ -0,0 +1,14 @@ +// 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:build amd64 && !purego && gc +// +build amd64,!purego,gc + +package sha3 + +// This function is implemented in keccakf_amd64.s. + +//go:noescape + +func keccakF1600(a *[25]uint64) diff --git a/vendor/github.com/cloudflare/circl/internal/sha3/keccakf_amd64.s b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s similarity index 99% rename from vendor/github.com/cloudflare/circl/internal/sha3/keccakf_amd64.s rename to vendor/golang.org/x/crypto/sha3/keccakf_amd64.s index 8589363a43..4cfa54383b 100644 --- a/vendor/github.com/cloudflare/circl/internal/sha3/keccakf_amd64.s +++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64,!appengine,!gccgo +//go:build amd64 && !purego && gc +// +build amd64,!purego,gc // This code was translated into a form compatible with 6a from the public // domain sources at https://github.com/gvanas/KeccakCodePackage @@ -319,8 +320,8 @@ MOVQ rDi, _si(oState); \ MOVQ rDo, _so(oState) \ -// func KeccakF1600(state *[25]uint64) -TEXT ·KeccakF1600(SB), 0, $200-8 +// func keccakF1600(state *[25]uint64) +TEXT ·keccakF1600(SB), 0, $200-8 MOVQ state+0(FP), rpState // Convert the user state into an internal state diff --git a/vendor/golang.org/x/crypto/sha3/register.go b/vendor/golang.org/x/crypto/sha3/register.go new file mode 100644 index 0000000000..8b4453aac3 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/register.go @@ -0,0 +1,19 @@ +// 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. + +//go:build go1.4 +// +build go1.4 + +package sha3 + +import ( + "crypto" +) + +func init() { + crypto.RegisterHash(crypto.SHA3_224, New224) + crypto.RegisterHash(crypto.SHA3_256, New256) + crypto.RegisterHash(crypto.SHA3_384, New384) + crypto.RegisterHash(crypto.SHA3_512, New512) +} diff --git a/vendor/golang.org/x/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go new file mode 100644 index 0000000000..fa182beb40 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3.go @@ -0,0 +1,193 @@ +// 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 sha3 + +// spongeDirection indicates the direction bytes are flowing through the sponge. +type spongeDirection int + +const ( + // spongeAbsorbing indicates that the sponge is absorbing input. + spongeAbsorbing spongeDirection = iota + // spongeSqueezing indicates that the sponge is being squeezed. + spongeSqueezing +) + +const ( + // maxRate is the maximum size of the internal buffer. SHAKE-256 + // currently needs the largest buffer. + maxRate = 168 +) + +type state struct { + // Generic sponge components. + a [25]uint64 // main state of the hash + buf []byte // points into storage + rate int // the number of bytes of state to use + + // dsbyte contains the "domain separation" bits and the first bit of + // the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the + // SHA-3 and SHAKE functions by appending bitstrings to the message. + // Using a little-endian bit-ordering convention, these are "01" for SHA-3 + // and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the + // padding rule from section 5.1 is applied to pad the message to a multiple + // of the rate, which involves adding a "1" bit, zero or more "0" bits, and + // a final "1" bit. We merge the first "1" bit from the padding into dsbyte, + // giving 00000110b (0x06) and 00011111b (0x1f). + // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf + // "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and + // Extendable-Output Functions (May 2014)" + dsbyte byte + + storage storageBuf + + // Specific to SHA-3 and SHAKE. + outputLen int // the default output size in bytes + state spongeDirection // whether the sponge is absorbing or squeezing +} + +// BlockSize returns the rate of sponge underlying this hash function. +func (d *state) BlockSize() int { return d.rate } + +// Size returns the output size of the hash function in bytes. +func (d *state) Size() int { return d.outputLen } + +// Reset clears the internal state by zeroing the sponge state and +// the byte buffer, and setting Sponge.state to absorbing. +func (d *state) Reset() { + // Zero the permutation's state. + for i := range d.a { + d.a[i] = 0 + } + d.state = spongeAbsorbing + d.buf = d.storage.asBytes()[:0] +} + +func (d *state) clone() *state { + ret := *d + if ret.state == spongeAbsorbing { + ret.buf = ret.storage.asBytes()[:len(ret.buf)] + } else { + ret.buf = ret.storage.asBytes()[d.rate-cap(d.buf) : d.rate] + } + + return &ret +} + +// permute applies the KeccakF-1600 permutation. It handles +// any input-output buffering. +func (d *state) permute() { + switch d.state { + case spongeAbsorbing: + // If we're absorbing, we need to xor the input into the state + // before applying the permutation. + xorIn(d, d.buf) + d.buf = d.storage.asBytes()[:0] + keccakF1600(&d.a) + case spongeSqueezing: + // If we're squeezing, we need to apply the permutation before + // copying more output. + keccakF1600(&d.a) + d.buf = d.storage.asBytes()[:d.rate] + copyOut(d, d.buf) + } +} + +// pads appends the domain separation bits in dsbyte, applies +// the multi-bitrate 10..1 padding rule, and permutes the state. +func (d *state) padAndPermute(dsbyte byte) { + if d.buf == nil { + d.buf = d.storage.asBytes()[:0] + } + // Pad with this instance's domain-separator bits. We know that there's + // at least one byte of space in d.buf because, if it were full, + // permute would have been called to empty it. dsbyte also contains the + // first one bit for the padding. See the comment in the state struct. + d.buf = append(d.buf, dsbyte) + zerosStart := len(d.buf) + d.buf = d.storage.asBytes()[:d.rate] + for i := zerosStart; i < d.rate; i++ { + d.buf[i] = 0 + } + // This adds the final one bit for the padding. Because of the way that + // bits are numbered from the LSB upwards, the final bit is the MSB of + // the last byte. + d.buf[d.rate-1] ^= 0x80 + // Apply the permutation + d.permute() + d.state = spongeSqueezing + d.buf = d.storage.asBytes()[:d.rate] + copyOut(d, d.buf) +} + +// Write absorbs more data into the hash's state. It produces an error +// if more data is written to the ShakeHash after writing +func (d *state) Write(p []byte) (written int, err error) { + if d.state != spongeAbsorbing { + panic("sha3: write to sponge after read") + } + if d.buf == nil { + d.buf = d.storage.asBytes()[:0] + } + written = len(p) + + for len(p) > 0 { + if len(d.buf) == 0 && len(p) >= d.rate { + // The fast path; absorb a full "rate" bytes of input and apply the permutation. + xorIn(d, p[:d.rate]) + p = p[d.rate:] + keccakF1600(&d.a) + } else { + // The slow path; buffer the input until we can fill the sponge, and then xor it in. + todo := d.rate - len(d.buf) + if todo > len(p) { + todo = len(p) + } + d.buf = append(d.buf, p[:todo]...) + p = p[todo:] + + // If the sponge is full, apply the permutation. + if len(d.buf) == d.rate { + d.permute() + } + } + } + + return +} + +// Read squeezes an arbitrary number of bytes from the sponge. +func (d *state) Read(out []byte) (n int, err error) { + // If we're still absorbing, pad and apply the permutation. + if d.state == spongeAbsorbing { + d.padAndPermute(d.dsbyte) + } + + n = len(out) + + // Now, do the squeezing. + for len(out) > 0 { + n := copy(out, d.buf) + d.buf = d.buf[n:] + out = out[n:] + + // Apply the permutation if we've squeezed the sponge dry. + if len(d.buf) == 0 { + d.permute() + } + } + + return +} + +// Sum applies padding to the hash state and then squeezes out the desired +// number of output bytes. +func (d *state) Sum(in []byte) []byte { + // Make a copy of the original hash so that caller can keep writing + // and summing. + dup := d.clone() + hash := make([]byte, dup.outputLen) + dup.Read(hash) + return append(in, hash...) +} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go new file mode 100644 index 0000000000..63a3edb4ce --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go @@ -0,0 +1,287 @@ +// 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. + +//go:build gc && !purego +// +build gc,!purego + +package sha3 + +// This file contains code for using the 'compute intermediate +// message digest' (KIMD) and 'compute last message digest' (KLMD) +// instructions to compute SHA-3 and SHAKE hashes on IBM Z. + +import ( + "hash" + + "golang.org/x/sys/cpu" +) + +// codes represent 7-bit KIMD/KLMD function codes as defined in +// the Principles of Operation. +type code uint64 + +const ( + // function codes for KIMD/KLMD + sha3_224 code = 32 + sha3_256 = 33 + sha3_384 = 34 + sha3_512 = 35 + shake_128 = 36 + shake_256 = 37 + nopad = 0x100 +) + +// kimd is a wrapper for the 'compute intermediate message digest' instruction. +// src must be a multiple of the rate for the given function code. +// +//go:noescape +func kimd(function code, chain *[200]byte, src []byte) + +// klmd is a wrapper for the 'compute last message digest' instruction. +// src padding is handled by the instruction. +// +//go:noescape +func klmd(function code, chain *[200]byte, dst, src []byte) + +type asmState struct { + a [200]byte // 1600 bit state + buf []byte // care must be taken to ensure cap(buf) is a multiple of rate + rate int // equivalent to block size + storage [3072]byte // underlying storage for buf + outputLen int // output length if fixed, 0 if not + function code // KIMD/KLMD function code + state spongeDirection // whether the sponge is absorbing or squeezing +} + +func newAsmState(function code) *asmState { + var s asmState + s.function = function + switch function { + case sha3_224: + s.rate = 144 + s.outputLen = 28 + case sha3_256: + s.rate = 136 + s.outputLen = 32 + case sha3_384: + s.rate = 104 + s.outputLen = 48 + case sha3_512: + s.rate = 72 + s.outputLen = 64 + case shake_128: + s.rate = 168 + case shake_256: + s.rate = 136 + default: + panic("sha3: unrecognized function code") + } + + // limit s.buf size to a multiple of s.rate + s.resetBuf() + return &s +} + +func (s *asmState) clone() *asmState { + c := *s + c.buf = c.storage[:len(s.buf):cap(s.buf)] + return &c +} + +// copyIntoBuf copies b into buf. It will panic if there is not enough space to +// store all of b. +func (s *asmState) copyIntoBuf(b []byte) { + bufLen := len(s.buf) + s.buf = s.buf[:len(s.buf)+len(b)] + copy(s.buf[bufLen:], b) +} + +// resetBuf points buf at storage, sets the length to 0 and sets cap to be a +// multiple of the rate. +func (s *asmState) resetBuf() { + max := (cap(s.storage) / s.rate) * s.rate + s.buf = s.storage[:0:max] +} + +// Write (via the embedded io.Writer interface) adds more data to the running hash. +// It never returns an error. +func (s *asmState) Write(b []byte) (int, error) { + if s.state != spongeAbsorbing { + panic("sha3: write to sponge after read") + } + length := len(b) + for len(b) > 0 { + if len(s.buf) == 0 && len(b) >= cap(s.buf) { + // Hash the data directly and push any remaining bytes + // into the buffer. + remainder := len(b) % s.rate + kimd(s.function, &s.a, b[:len(b)-remainder]) + if remainder != 0 { + s.copyIntoBuf(b[len(b)-remainder:]) + } + return length, nil + } + + if len(s.buf) == cap(s.buf) { + // flush the buffer + kimd(s.function, &s.a, s.buf) + s.buf = s.buf[:0] + } + + // copy as much as we can into the buffer + n := len(b) + if len(b) > cap(s.buf)-len(s.buf) { + n = cap(s.buf) - len(s.buf) + } + s.copyIntoBuf(b[:n]) + b = b[n:] + } + return length, nil +} + +// Read squeezes an arbitrary number of bytes from the sponge. +func (s *asmState) Read(out []byte) (n int, err error) { + n = len(out) + + // need to pad if we were absorbing + if s.state == spongeAbsorbing { + s.state = spongeSqueezing + + // write hash directly into out if possible + if len(out)%s.rate == 0 { + klmd(s.function, &s.a, out, s.buf) // len(out) may be 0 + s.buf = s.buf[:0] + return + } + + // write hash into buffer + max := cap(s.buf) + if max > len(out) { + max = (len(out)/s.rate)*s.rate + s.rate + } + klmd(s.function, &s.a, s.buf[:max], s.buf) + s.buf = s.buf[:max] + } + + for len(out) > 0 { + // flush the buffer + if len(s.buf) != 0 { + c := copy(out, s.buf) + out = out[c:] + s.buf = s.buf[c:] + continue + } + + // write hash directly into out if possible + if len(out)%s.rate == 0 { + klmd(s.function|nopad, &s.a, out, nil) + return + } + + // write hash into buffer + s.resetBuf() + if cap(s.buf) > len(out) { + s.buf = s.buf[:(len(out)/s.rate)*s.rate+s.rate] + } + klmd(s.function|nopad, &s.a, s.buf, nil) + } + return +} + +// Sum appends the current hash to b and returns the resulting slice. +// It does not change the underlying hash state. +func (s *asmState) Sum(b []byte) []byte { + if s.outputLen == 0 { + panic("sha3: cannot call Sum on SHAKE functions") + } + + // Copy the state to preserve the original. + a := s.a + + // Hash the buffer. Note that we don't clear it because we + // aren't updating the state. + klmd(s.function, &a, nil, s.buf) + return append(b, a[:s.outputLen]...) +} + +// Reset resets the Hash to its initial state. +func (s *asmState) Reset() { + for i := range s.a { + s.a[i] = 0 + } + s.resetBuf() + s.state = spongeAbsorbing +} + +// Size returns the number of bytes Sum will return. +func (s *asmState) Size() int { + return s.outputLen +} + +// BlockSize returns the hash's underlying block size. +// The Write method must be able to accept any amount +// of data, but it may operate more efficiently if all writes +// are a multiple of the block size. +func (s *asmState) BlockSize() int { + return s.rate +} + +// Clone returns a copy of the ShakeHash in its current state. +func (s *asmState) Clone() ShakeHash { + return s.clone() +} + +// new224Asm returns an assembly implementation of SHA3-224 if available, +// otherwise it returns nil. +func new224Asm() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_224) + } + return nil +} + +// new256Asm returns an assembly implementation of SHA3-256 if available, +// otherwise it returns nil. +func new256Asm() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_256) + } + return nil +} + +// new384Asm returns an assembly implementation of SHA3-384 if available, +// otherwise it returns nil. +func new384Asm() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_384) + } + return nil +} + +// new512Asm returns an assembly implementation of SHA3-512 if available, +// otherwise it returns nil. +func new512Asm() hash.Hash { + if cpu.S390X.HasSHA3 { + return newAsmState(sha3_512) + } + return nil +} + +// newShake128Asm returns an assembly implementation of SHAKE-128 if available, +// otherwise it returns nil. +func newShake128Asm() ShakeHash { + if cpu.S390X.HasSHA3 { + return newAsmState(shake_128) + } + return nil +} + +// newShake256Asm returns an assembly implementation of SHAKE-256 if available, +// otherwise it returns nil. +func newShake256Asm() ShakeHash { + if cpu.S390X.HasSHA3 { + return newAsmState(shake_256) + } + return nil +} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.s b/vendor/golang.org/x/crypto/sha3/sha3_s390x.s new file mode 100644 index 0000000000..a0e051b045 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.s @@ -0,0 +1,34 @@ +// 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. + +//go:build gc && !purego +// +build gc,!purego + +#include "textflag.h" + +// func kimd(function code, chain *[200]byte, src []byte) +TEXT ·kimd(SB), NOFRAME|NOSPLIT, $0-40 + MOVD function+0(FP), R0 + MOVD chain+8(FP), R1 + LMG src+16(FP), R2, R3 // R2=base, R3=len + +continue: + WORD $0xB93E0002 // KIMD --, R2 + BVS continue // continue if interrupted + MOVD $0, R0 // reset R0 for pre-go1.8 compilers + RET + +// func klmd(function code, chain *[200]byte, dst, src []byte) +TEXT ·klmd(SB), NOFRAME|NOSPLIT, $0-64 + // TODO: SHAKE support + MOVD function+0(FP), R0 + MOVD chain+8(FP), R1 + LMG dst+16(FP), R2, R3 // R2=base, R3=len + LMG src+40(FP), R4, R5 // R4=base, R5=len + +continue: + WORD $0xB93F0024 // KLMD R2, R4 + BVS continue // continue if interrupted + MOVD $0, R0 // reset R0 for pre-go1.8 compilers + RET diff --git a/vendor/golang.org/x/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go new file mode 100644 index 0000000000..d7be2954ab --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/shake.go @@ -0,0 +1,173 @@ +// 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 sha3 + +// This file defines the ShakeHash interface, and provides +// functions for creating SHAKE and cSHAKE instances, as well as utility +// functions for hashing bytes to arbitrary-length output. +// +// +// SHAKE implementation is based on FIPS PUB 202 [1] +// cSHAKE implementations is based on NIST SP 800-185 [2] +// +// [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf +// [2] https://doi.org/10.6028/NIST.SP.800-185 + +import ( + "encoding/binary" + "io" +) + +// ShakeHash defines the interface to hash functions that +// support arbitrary-length output. +type ShakeHash interface { + // Write absorbs more data into the hash's state. It panics if input is + // written to it after output has been read from it. + io.Writer + + // Read reads more output from the hash; reading affects the hash's + // state. (ShakeHash.Read is thus very different from Hash.Sum) + // It never returns an error. + io.Reader + + // Clone returns a copy of the ShakeHash in its current state. + Clone() ShakeHash + + // Reset resets the ShakeHash to its initial state. + Reset() +} + +// cSHAKE specific context +type cshakeState struct { + *state // SHA-3 state context and Read/Write operations + + // initBlock is the cSHAKE specific initialization set of bytes. It is initialized + // by newCShake function and stores concatenation of N followed by S, encoded + // by the method specified in 3.3 of [1]. + // It is stored here in order for Reset() to be able to put context into + // initial state. + initBlock []byte +} + +// Consts for configuring initial SHA-3 state +const ( + dsbyteShake = 0x1f + dsbyteCShake = 0x04 + rate128 = 168 + rate256 = 136 +) + +func bytepad(input []byte, w int) []byte { + // leftEncode always returns max 9 bytes + buf := make([]byte, 0, 9+len(input)+w) + buf = append(buf, leftEncode(uint64(w))...) + buf = append(buf, input...) + padlen := w - (len(buf) % w) + return append(buf, make([]byte, padlen)...) +} + +func leftEncode(value uint64) []byte { + var b [9]byte + binary.BigEndian.PutUint64(b[1:], value) + // Trim all but last leading zero bytes + i := byte(1) + for i < 8 && b[i] == 0 { + i++ + } + // Prepend number of encoded bytes + b[i-1] = 9 - i + return b[i-1:] +} + +func newCShake(N, S []byte, rate int, dsbyte byte) ShakeHash { + c := cshakeState{state: &state{rate: rate, dsbyte: dsbyte}} + + // leftEncode returns max 9 bytes + c.initBlock = make([]byte, 0, 9*2+len(N)+len(S)) + c.initBlock = append(c.initBlock, leftEncode(uint64(len(N)*8))...) + c.initBlock = append(c.initBlock, N...) + c.initBlock = append(c.initBlock, leftEncode(uint64(len(S)*8))...) + c.initBlock = append(c.initBlock, S...) + c.Write(bytepad(c.initBlock, c.rate)) + return &c +} + +// Reset resets the hash to initial state. +func (c *cshakeState) Reset() { + c.state.Reset() + c.Write(bytepad(c.initBlock, c.rate)) +} + +// Clone returns copy of a cSHAKE context within its current state. +func (c *cshakeState) Clone() ShakeHash { + b := make([]byte, len(c.initBlock)) + copy(b, c.initBlock) + return &cshakeState{state: c.clone(), initBlock: b} +} + +// Clone returns copy of SHAKE context within its current state. +func (c *state) Clone() ShakeHash { + return c.clone() +} + +// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. +// Its generic security strength is 128 bits against all attacks if at +// least 32 bytes of its output are used. +func NewShake128() ShakeHash { + if h := newShake128Asm(); h != nil { + return h + } + return &state{rate: rate128, dsbyte: dsbyteShake} +} + +// NewShake256 creates a new SHAKE256 variable-output-length ShakeHash. +// Its generic security strength is 256 bits against all attacks if +// at least 64 bytes of its output are used. +func NewShake256() ShakeHash { + if h := newShake256Asm(); h != nil { + return h + } + return &state{rate: rate256, dsbyte: dsbyteShake} +} + +// NewCShake128 creates a new instance of cSHAKE128 variable-output-length ShakeHash, +// a customizable variant of SHAKE128. +// N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is +// desired. S is a customization byte string used for domain separation - two cSHAKE +// computations on same input with different S yield unrelated outputs. +// When N and S are both empty, this is equivalent to NewShake128. +func NewCShake128(N, S []byte) ShakeHash { + if len(N) == 0 && len(S) == 0 { + return NewShake128() + } + return newCShake(N, S, rate128, dsbyteCShake) +} + +// NewCShake256 creates a new instance of cSHAKE256 variable-output-length ShakeHash, +// a customizable variant of SHAKE256. +// N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is +// desired. S is a customization byte string used for domain separation - two cSHAKE +// computations on same input with different S yield unrelated outputs. +// When N and S are both empty, this is equivalent to NewShake256. +func NewCShake256(N, S []byte) ShakeHash { + if len(N) == 0 && len(S) == 0 { + return NewShake256() + } + return newCShake(N, S, rate256, dsbyteCShake) +} + +// ShakeSum128 writes an arbitrary-length digest of data into hash. +func ShakeSum128(hash, data []byte) { + h := NewShake128() + h.Write(data) + h.Read(hash) +} + +// ShakeSum256 writes an arbitrary-length digest of data into hash. +func ShakeSum256(hash, data []byte) { + h := NewShake256() + h.Write(data) + h.Read(hash) +} diff --git a/vendor/golang.org/x/crypto/sha3/shake_generic.go b/vendor/golang.org/x/crypto/sha3/shake_generic.go new file mode 100644 index 0000000000..5c0710ef98 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/shake_generic.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. + +//go:build !gc || purego || !s390x +// +build !gc purego !s390x + +package sha3 + +// newShake128Asm returns an assembly implementation of SHAKE-128 if available, +// otherwise it returns nil. +func newShake128Asm() ShakeHash { + return nil +} + +// newShake256Asm returns an assembly implementation of SHAKE-256 if available, +// otherwise it returns nil. +func newShake256Asm() ShakeHash { + return nil +} diff --git a/vendor/golang.org/x/crypto/sha3/xor.go b/vendor/golang.org/x/crypto/sha3/xor.go new file mode 100644 index 0000000000..59c8eb9418 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/xor.go @@ -0,0 +1,24 @@ +// 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:build (!amd64 && !386 && !ppc64le) || purego +// +build !amd64,!386,!ppc64le purego + +package sha3 + +// A storageBuf is an aligned array of maxRate bytes. +type storageBuf [maxRate]byte + +func (b *storageBuf) asBytes() *[maxRate]byte { + return (*[maxRate]byte)(b) +} + +var ( + xorIn = xorInGeneric + copyOut = copyOutGeneric + xorInUnaligned = xorInGeneric + copyOutUnaligned = copyOutGeneric +) + +const xorImplementationUnaligned = "generic" diff --git a/vendor/golang.org/x/crypto/sha3/xor_generic.go b/vendor/golang.org/x/crypto/sha3/xor_generic.go new file mode 100644 index 0000000000..8d94771127 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/xor_generic.go @@ -0,0 +1,28 @@ +// 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 sha3 + +import "encoding/binary" + +// xorInGeneric xors the bytes in buf into the state; it +// makes no non-portable assumptions about memory layout +// or alignment. +func xorInGeneric(d *state, buf []byte) { + n := len(buf) / 8 + + for i := 0; i < n; i++ { + a := binary.LittleEndian.Uint64(buf) + d.a[i] ^= a + buf = buf[8:] + } +} + +// copyOutGeneric copies uint64s to a byte buffer. +func copyOutGeneric(d *state, b []byte) { + for i := 0; len(b) >= 8; i++ { + binary.LittleEndian.PutUint64(b, d.a[i]) + b = b[8:] + } +} diff --git a/vendor/golang.org/x/crypto/sha3/xor_unaligned.go b/vendor/golang.org/x/crypto/sha3/xor_unaligned.go new file mode 100644 index 0000000000..1ce606246d --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/xor_unaligned.go @@ -0,0 +1,68 @@ +// 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:build (amd64 || 386 || ppc64le) && !purego +// +build amd64 386 ppc64le +// +build !purego + +package sha3 + +import "unsafe" + +// A storageBuf is an aligned array of maxRate bytes. +type storageBuf [maxRate / 8]uint64 + +func (b *storageBuf) asBytes() *[maxRate]byte { + return (*[maxRate]byte)(unsafe.Pointer(b)) +} + +// xorInUnaligned uses unaligned reads and writes to update d.a to contain d.a +// XOR buf. +func xorInUnaligned(d *state, buf []byte) { + n := len(buf) + bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))[: n/8 : n/8] + if n >= 72 { + d.a[0] ^= bw[0] + d.a[1] ^= bw[1] + d.a[2] ^= bw[2] + d.a[3] ^= bw[3] + d.a[4] ^= bw[4] + d.a[5] ^= bw[5] + d.a[6] ^= bw[6] + d.a[7] ^= bw[7] + d.a[8] ^= bw[8] + } + if n >= 104 { + d.a[9] ^= bw[9] + d.a[10] ^= bw[10] + d.a[11] ^= bw[11] + d.a[12] ^= bw[12] + } + if n >= 136 { + d.a[13] ^= bw[13] + d.a[14] ^= bw[14] + d.a[15] ^= bw[15] + d.a[16] ^= bw[16] + } + if n >= 144 { + d.a[17] ^= bw[17] + } + if n >= 168 { + d.a[18] ^= bw[18] + d.a[19] ^= bw[19] + d.a[20] ^= bw[20] + } +} + +func copyOutUnaligned(d *state, buf []byte) { + ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) + copy(buf, ab[:]) +} + +var ( + xorIn = xorInUnaligned + copyOut = copyOutUnaligned +) + +const xorImplementationUnaligned = "unaligned" diff --git a/vendor/golang.org/x/crypto/ssh/agent/server.go b/vendor/golang.org/x/crypto/ssh/agent/server.go index 6e7a1e02f2..9a769de03d 100644 --- a/vendor/golang.org/x/crypto/ssh/agent/server.go +++ b/vendor/golang.org/x/crypto/ssh/agent/server.go @@ -20,7 +20,7 @@ import ( "golang.org/x/crypto/ssh" ) -// Server wraps an Agent and uses it to implement the agent side of +// server wraps an Agent and uses it to implement the agent side of // the SSH-agent, wire protocol. type server struct { agent Agent diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go index e6a77f26a0..9ba6e10a4a 100644 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -85,7 +85,7 @@ var supportedHostKeyAlgos = []string{ // This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed // because they have reached the end of their useful life. var supportedMACs = []string{ - "hmac-sha2-256-etm@openssh.com", "hmac-sha2-256", "hmac-sha1", "hmac-sha1-96", + "hmac-sha2-512-etm@openssh.com", "hmac-sha2-256-etm@openssh.com", "hmac-sha2-256", "hmac-sha2-512", "hmac-sha1", "hmac-sha1-96", } var supportedCompressions = []string{compressionNone} diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go index 35661a52be..8f345ee924 100644 --- a/vendor/golang.org/x/crypto/ssh/connection.go +++ b/vendor/golang.org/x/crypto/ssh/connection.go @@ -97,7 +97,7 @@ func (c *connection) Close() error { return c.sshConn.conn.Close() } -// sshconn provides net.Conn metadata, but disallows direct reads and +// sshConn provides net.Conn metadata, but disallows direct reads and // writes. type sshConn struct { conn net.Conn diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index 7296980413..dac8ee7244 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -1087,9 +1087,9 @@ func (*PassphraseMissingError) Error() string { return "ssh: this private key is passphrase protected" } -// ParseRawPrivateKey returns a private key from a PEM encoded private key. It -// supports RSA (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys. If the -// private key is encrypted, it will return a PassphraseMissingError. +// ParseRawPrivateKey returns a private key from a PEM encoded private key. It supports +// RSA, DSA, ECDSA, and Ed25519 private keys in PKCS#1, PKCS#8, OpenSSL, and OpenSSH +// formats. If the private key is encrypted, it will return a PassphraseMissingError. func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { block, _ := pem.Decode(pemBytes) if block == nil { diff --git a/vendor/golang.org/x/crypto/ssh/mac.go b/vendor/golang.org/x/crypto/ssh/mac.go index c07a06285e..06a1b27507 100644 --- a/vendor/golang.org/x/crypto/ssh/mac.go +++ b/vendor/golang.org/x/crypto/ssh/mac.go @@ -10,6 +10,7 @@ import ( "crypto/hmac" "crypto/sha1" "crypto/sha256" + "crypto/sha512" "hash" ) @@ -46,9 +47,15 @@ func (t truncatingMAC) Size() int { func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() } var macModes = map[string]*macMode{ + "hmac-sha2-512-etm@openssh.com": {64, true, func(key []byte) hash.Hash { + return hmac.New(sha512.New, key) + }}, "hmac-sha2-256-etm@openssh.com": {32, true, func(key []byte) hash.Hash { return hmac.New(sha256.New, key) }}, + "hmac-sha2-512": {64, false, func(key []byte) hash.Hash { + return hmac.New(sha512.New, key) + }}, "hmac-sha2-256": {32, false, func(key []byte) hash.Hash { return hmac.New(sha256.New, key) }}, diff --git a/vendor/golang.org/x/exp/LICENSE b/vendor/golang.org/x/exp/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/vendor/golang.org/x/exp/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/vendor/golang.org/x/exp/PATENTS b/vendor/golang.org/x/exp/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/vendor/golang.org/x/exp/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go 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 Go, 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 Go. 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 Go or any code incorporated within this +implementation of Go 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 Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/exp/maps/maps.go b/vendor/golang.org/x/exp/maps/maps.go new file mode 100644 index 0000000000..ecc0dabb74 --- /dev/null +++ b/vendor/golang.org/x/exp/maps/maps.go @@ -0,0 +1,94 @@ +// Copyright 2021 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 maps defines various functions useful with maps of any type. +package maps + +// Keys returns the keys of the map m. +// The keys will be in an indeterminate order. +func Keys[M ~map[K]V, K comparable, V any](m M) []K { + r := make([]K, 0, len(m)) + for k := range m { + r = append(r, k) + } + return r +} + +// Values returns the values of the map m. +// The values will be in an indeterminate order. +func Values[M ~map[K]V, K comparable, V any](m M) []V { + r := make([]V, 0, len(m)) + for _, v := range m { + r = append(r, v) + } + return r +} + +// Equal reports whether two maps contain the same key/value pairs. +// Values are compared using ==. +func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool { + if len(m1) != len(m2) { + return false + } + for k, v1 := range m1 { + if v2, ok := m2[k]; !ok || v1 != v2 { + return false + } + } + return true +} + +// EqualFunc is like Equal, but compares values using eq. +// Keys are still compared with ==. +func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool { + if len(m1) != len(m2) { + return false + } + for k, v1 := range m1 { + if v2, ok := m2[k]; !ok || !eq(v1, v2) { + return false + } + } + return true +} + +// Clear removes all entries from m, leaving it empty. +func Clear[M ~map[K]V, K comparable, V any](m M) { + for k := range m { + delete(m, k) + } +} + +// Clone returns a copy of m. This is a shallow clone: +// the new keys and values are set using ordinary assignment. +func Clone[M ~map[K]V, K comparable, V any](m M) M { + // Preserve nil in case it matters. + if m == nil { + return nil + } + r := make(M, len(m)) + for k, v := range m { + r[k] = v + } + return r +} + +// Copy copies all key/value pairs in src adding them to dst. +// When a key in src is already present in dst, +// the value in dst will be overwritten by the value associated +// with the key in src. +func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) { + for k, v := range src { + dst[k] = v + } +} + +// DeleteFunc deletes any key/value pairs from m for which del returns true. +func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) { + for k, v := range m { + if del(k, v) { + delete(m, k) + } + } +} diff --git a/vendor/golang.org/x/mod/semver/semver.go b/vendor/golang.org/x/mod/semver/semver.go index a30a22bf20..9a2dfd33a7 100644 --- a/vendor/golang.org/x/mod/semver/semver.go +++ b/vendor/golang.org/x/mod/semver/semver.go @@ -140,7 +140,7 @@ func Compare(v, w string) int { // Max canonicalizes its arguments and then returns the version string // that compares greater. // -// Deprecated: use Compare instead. In most cases, returning a canonicalized +// Deprecated: use [Compare] instead. In most cases, returning a canonicalized // version is not expected or desired. func Max(v, w string) string { v = Canonical(v) @@ -151,7 +151,7 @@ func Max(v, w string) string { return w } -// ByVersion implements sort.Interface for sorting semantic version strings. +// ByVersion implements [sort.Interface] for sorting semantic version strings. type ByVersion []string func (vs ByVersion) Len() int { return len(vs) } @@ -164,7 +164,7 @@ func (vs ByVersion) Less(i, j int) bool { return vs[i] < vs[j] } -// Sort sorts a list of semantic version strings using ByVersion. +// Sort sorts a list of semantic version strings using [ByVersion]. func Sort(list []string) { sort.Sort(ByVersion(list)) } diff --git a/vendor/golang.org/x/net/html/atom/atom.go b/vendor/golang.org/x/net/html/atom/atom.go new file mode 100644 index 0000000000..cd0a8ac154 --- /dev/null +++ b/vendor/golang.org/x/net/html/atom/atom.go @@ -0,0 +1,78 @@ +// Copyright 2012 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 atom provides integer codes (also known as atoms) for a fixed set of +// frequently occurring HTML strings: tag names and attribute keys such as "p" +// and "id". +// +// Sharing an atom's name between all elements with the same tag can result in +// fewer string allocations when tokenizing and parsing HTML. Integer +// comparisons are also generally faster than string comparisons. +// +// The value of an atom's particular code is not guaranteed to stay the same +// between versions of this package. Neither is any ordering guaranteed: +// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to +// be dense. The only guarantees are that e.g. looking up "div" will yield +// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0. +package atom // import "golang.org/x/net/html/atom" + +// Atom is an integer code for a string. The zero value maps to "". +type Atom uint32 + +// String returns the atom's name. +func (a Atom) String() string { + start := uint32(a >> 8) + n := uint32(a & 0xff) + if start+n > uint32(len(atomText)) { + return "" + } + return atomText[start : start+n] +} + +func (a Atom) string() string { + return atomText[a>>8 : a>>8+a&0xff] +} + +// fnv computes the FNV hash with an arbitrary starting value h. +func fnv(h uint32, s []byte) uint32 { + for i := range s { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +func match(s string, t []byte) bool { + for i, c := range t { + if s[i] != c { + return false + } + } + return true +} + +// Lookup returns the atom whose name is s. It returns zero if there is no +// such atom. The lookup is case sensitive. +func Lookup(s []byte) Atom { + if len(s) == 0 || len(s) > maxAtomLen { + return 0 + } + h := fnv(hash0, s) + if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + return 0 +} + +// String returns a string whose contents are equal to s. In that sense, it is +// equivalent to string(s) but may be more efficient. +func String(s []byte) string { + if a := Lookup(s); a != 0 { + return a.String() + } + return string(s) +} diff --git a/vendor/golang.org/x/net/html/atom/table.go b/vendor/golang.org/x/net/html/atom/table.go new file mode 100644 index 0000000000..2a938864cb --- /dev/null +++ b/vendor/golang.org/x/net/html/atom/table.go @@ -0,0 +1,783 @@ +// Code generated by go generate gen.go; DO NOT EDIT. + +//go:generate go run gen.go + +package atom + +const ( + A Atom = 0x1 + Abbr Atom = 0x4 + Accept Atom = 0x1a06 + AcceptCharset Atom = 0x1a0e + Accesskey Atom = 0x2c09 + Acronym Atom = 0xaa07 + Action Atom = 0x27206 + Address Atom = 0x6f307 + Align Atom = 0xb105 + Allowfullscreen Atom = 0x2080f + Allowpaymentrequest Atom = 0xc113 + Allowusermedia Atom = 0xdd0e + Alt Atom = 0xf303 + Annotation Atom = 0x1c90a + AnnotationXml Atom = 0x1c90e + Applet Atom = 0x31906 + Area Atom = 0x35604 + Article Atom = 0x3fc07 + As Atom = 0x3c02 + Aside Atom = 0x10705 + Async Atom = 0xff05 + Audio Atom = 0x11505 + Autocomplete Atom = 0x2780c + Autofocus Atom = 0x12109 + Autoplay Atom = 0x13c08 + B Atom = 0x101 + Base Atom = 0x3b04 + Basefont Atom = 0x3b08 + Bdi Atom = 0xba03 + Bdo Atom = 0x14b03 + Bgsound Atom = 0x15e07 + Big Atom = 0x17003 + Blink Atom = 0x17305 + Blockquote Atom = 0x1870a + Body Atom = 0x2804 + Br Atom = 0x202 + Button Atom = 0x19106 + Canvas Atom = 0x10306 + Caption Atom = 0x23107 + Center Atom = 0x22006 + Challenge Atom = 0x29b09 + Charset Atom = 0x2107 + Checked Atom = 0x47907 + Cite Atom = 0x19c04 + Class Atom = 0x56405 + Code Atom = 0x5c504 + Col Atom = 0x1ab03 + Colgroup Atom = 0x1ab08 + Color Atom = 0x1bf05 + Cols Atom = 0x1c404 + Colspan Atom = 0x1c407 + Command Atom = 0x1d707 + Content Atom = 0x58b07 + Contenteditable Atom = 0x58b0f + Contextmenu Atom = 0x3800b + Controls Atom = 0x1de08 + Coords Atom = 0x1ea06 + Crossorigin Atom = 0x1fb0b + Data Atom = 0x4a504 + Datalist Atom = 0x4a508 + Datetime Atom = 0x2b808 + Dd Atom = 0x2d702 + Default Atom = 0x10a07 + Defer Atom = 0x5c705 + Del Atom = 0x45203 + Desc Atom = 0x56104 + Details Atom = 0x7207 + Dfn Atom = 0x8703 + Dialog Atom = 0xbb06 + Dir Atom = 0x9303 + Dirname Atom = 0x9307 + Disabled Atom = 0x16408 + Div Atom = 0x16b03 + Dl Atom = 0x5e602 + Download Atom = 0x46308 + Draggable Atom = 0x17a09 + Dropzone Atom = 0x40508 + Dt Atom = 0x64b02 + Em Atom = 0x6e02 + Embed Atom = 0x6e05 + Enctype Atom = 0x28d07 + Face Atom = 0x21e04 + Fieldset Atom = 0x22608 + Figcaption Atom = 0x22e0a + Figure Atom = 0x24806 + Font Atom = 0x3f04 + Footer Atom = 0xf606 + For Atom = 0x25403 + ForeignObject Atom = 0x2540d + Foreignobject Atom = 0x2610d + Form Atom = 0x26e04 + Formaction Atom = 0x26e0a + Formenctype Atom = 0x2890b + Formmethod Atom = 0x2a40a + Formnovalidate Atom = 0x2ae0e + Formtarget Atom = 0x2c00a + Frame Atom = 0x8b05 + Frameset Atom = 0x8b08 + H1 Atom = 0x15c02 + H2 Atom = 0x2de02 + H3 Atom = 0x30d02 + H4 Atom = 0x34502 + H5 Atom = 0x34f02 + H6 Atom = 0x64d02 + Head Atom = 0x33104 + Header Atom = 0x33106 + Headers Atom = 0x33107 + Height Atom = 0x5206 + Hgroup Atom = 0x2ca06 + Hidden Atom = 0x2d506 + High Atom = 0x2db04 + Hr Atom = 0x15702 + Href Atom = 0x2e004 + Hreflang Atom = 0x2e008 + Html Atom = 0x5604 + HttpEquiv Atom = 0x2e80a + I Atom = 0x601 + Icon Atom = 0x58a04 + Id Atom = 0x10902 + Iframe Atom = 0x2fc06 + Image Atom = 0x30205 + Img Atom = 0x30703 + Input Atom = 0x44b05 + Inputmode Atom = 0x44b09 + Ins Atom = 0x20403 + Integrity Atom = 0x23f09 + Is Atom = 0x16502 + Isindex Atom = 0x30f07 + Ismap Atom = 0x31605 + Itemid Atom = 0x38b06 + Itemprop Atom = 0x19d08 + Itemref Atom = 0x3cd07 + Itemscope Atom = 0x67109 + Itemtype Atom = 0x31f08 + Kbd Atom = 0xb903 + Keygen Atom = 0x3206 + Keytype Atom = 0xd607 + Kind Atom = 0x17704 + Label Atom = 0x5905 + Lang Atom = 0x2e404 + Legend Atom = 0x18106 + Li Atom = 0xb202 + Link Atom = 0x17404 + List Atom = 0x4a904 + Listing Atom = 0x4a907 + Loop Atom = 0x5d04 + Low Atom = 0xc303 + Main Atom = 0x1004 + Malignmark Atom = 0xb00a + Manifest Atom = 0x6d708 + Map Atom = 0x31803 + Mark Atom = 0xb604 + Marquee Atom = 0x32707 + Math Atom = 0x32e04 + Max Atom = 0x33d03 + Maxlength Atom = 0x33d09 + Media Atom = 0xe605 + Mediagroup Atom = 0xe60a + Menu Atom = 0x38704 + Menuitem Atom = 0x38708 + Meta Atom = 0x4b804 + Meter Atom = 0x9805 + Method Atom = 0x2a806 + Mglyph Atom = 0x30806 + Mi Atom = 0x34702 + Min Atom = 0x34703 + Minlength Atom = 0x34709 + Mn Atom = 0x2b102 + Mo Atom = 0xa402 + Ms Atom = 0x67402 + Mtext Atom = 0x35105 + Multiple Atom = 0x35f08 + Muted Atom = 0x36705 + Name Atom = 0x9604 + Nav Atom = 0x1303 + Nobr Atom = 0x3704 + Noembed Atom = 0x6c07 + Noframes Atom = 0x8908 + Nomodule Atom = 0xa208 + Nonce Atom = 0x1a605 + Noscript Atom = 0x21608 + Novalidate Atom = 0x2b20a + Object Atom = 0x26806 + Ol Atom = 0x13702 + Onabort Atom = 0x19507 + Onafterprint Atom = 0x2360c + Onautocomplete Atom = 0x2760e + Onautocompleteerror Atom = 0x27613 + Onauxclick Atom = 0x61f0a + Onbeforeprint Atom = 0x69e0d + Onbeforeunload Atom = 0x6e70e + Onblur Atom = 0x56d06 + Oncancel Atom = 0x11908 + Oncanplay Atom = 0x14d09 + Oncanplaythrough Atom = 0x14d10 + Onchange Atom = 0x41b08 + Onclick Atom = 0x2f507 + Onclose Atom = 0x36c07 + Oncontextmenu Atom = 0x37e0d + Oncopy Atom = 0x39106 + Oncuechange Atom = 0x3970b + Oncut Atom = 0x3a205 + Ondblclick Atom = 0x3a70a + Ondrag Atom = 0x3b106 + Ondragend Atom = 0x3b109 + Ondragenter Atom = 0x3ba0b + Ondragexit Atom = 0x3c50a + Ondragleave Atom = 0x3df0b + Ondragover Atom = 0x3ea0a + Ondragstart Atom = 0x3f40b + Ondrop Atom = 0x40306 + Ondurationchange Atom = 0x41310 + Onemptied Atom = 0x40a09 + Onended Atom = 0x42307 + Onerror Atom = 0x42a07 + Onfocus Atom = 0x43107 + Onhashchange Atom = 0x43d0c + Oninput Atom = 0x44907 + Oninvalid Atom = 0x45509 + Onkeydown Atom = 0x45e09 + Onkeypress Atom = 0x46b0a + Onkeyup Atom = 0x48007 + Onlanguagechange Atom = 0x48d10 + Onload Atom = 0x49d06 + Onloadeddata Atom = 0x49d0c + Onloadedmetadata Atom = 0x4b010 + Onloadend Atom = 0x4c609 + Onloadstart Atom = 0x4cf0b + Onmessage Atom = 0x4da09 + Onmessageerror Atom = 0x4da0e + Onmousedown Atom = 0x4e80b + Onmouseenter Atom = 0x4f30c + Onmouseleave Atom = 0x4ff0c + Onmousemove Atom = 0x50b0b + Onmouseout Atom = 0x5160a + Onmouseover Atom = 0x5230b + Onmouseup Atom = 0x52e09 + Onmousewheel Atom = 0x53c0c + Onoffline Atom = 0x54809 + Ononline Atom = 0x55108 + Onpagehide Atom = 0x5590a + Onpageshow Atom = 0x5730a + Onpaste Atom = 0x57f07 + Onpause Atom = 0x59a07 + Onplay Atom = 0x5a406 + Onplaying Atom = 0x5a409 + Onpopstate Atom = 0x5ad0a + Onprogress Atom = 0x5b70a + Onratechange Atom = 0x5cc0c + Onrejectionhandled Atom = 0x5d812 + Onreset Atom = 0x5ea07 + Onresize Atom = 0x5f108 + Onscroll Atom = 0x60008 + Onsecuritypolicyviolation Atom = 0x60819 + Onseeked Atom = 0x62908 + Onseeking Atom = 0x63109 + Onselect Atom = 0x63a08 + Onshow Atom = 0x64406 + Onsort Atom = 0x64f06 + Onstalled Atom = 0x65909 + Onstorage Atom = 0x66209 + Onsubmit Atom = 0x66b08 + Onsuspend Atom = 0x67b09 + Ontimeupdate Atom = 0x400c + Ontoggle Atom = 0x68408 + Onunhandledrejection Atom = 0x68c14 + Onunload Atom = 0x6ab08 + Onvolumechange Atom = 0x6b30e + Onwaiting Atom = 0x6c109 + Onwheel Atom = 0x6ca07 + Open Atom = 0x1a304 + Optgroup Atom = 0x5f08 + Optimum Atom = 0x6d107 + Option Atom = 0x6e306 + Output Atom = 0x51d06 + P Atom = 0xc01 + Param Atom = 0xc05 + Pattern Atom = 0x6607 + Picture Atom = 0x7b07 + Ping Atom = 0xef04 + Placeholder Atom = 0x1310b + Plaintext Atom = 0x1b209 + Playsinline Atom = 0x1400b + Poster Atom = 0x2cf06 + Pre Atom = 0x47003 + Preload Atom = 0x48607 + Progress Atom = 0x5b908 + Prompt Atom = 0x53606 + Public Atom = 0x58606 + Q Atom = 0xcf01 + Radiogroup Atom = 0x30a + Rb Atom = 0x3a02 + Readonly Atom = 0x35708 + Referrerpolicy Atom = 0x3d10e + Rel Atom = 0x48703 + Required Atom = 0x24c08 + Reversed Atom = 0x8008 + Rows Atom = 0x9c04 + Rowspan Atom = 0x9c07 + Rp Atom = 0x23c02 + Rt Atom = 0x19a02 + Rtc Atom = 0x19a03 + Ruby Atom = 0xfb04 + S Atom = 0x2501 + Samp Atom = 0x7804 + Sandbox Atom = 0x12907 + Scope Atom = 0x67505 + Scoped Atom = 0x67506 + Script Atom = 0x21806 + Seamless Atom = 0x37108 + Section Atom = 0x56807 + Select Atom = 0x63c06 + Selected Atom = 0x63c08 + Shape Atom = 0x1e505 + Size Atom = 0x5f504 + Sizes Atom = 0x5f505 + Slot Atom = 0x1ef04 + Small Atom = 0x20605 + Sortable Atom = 0x65108 + Sorted Atom = 0x33706 + Source Atom = 0x37806 + Spacer Atom = 0x43706 + Span Atom = 0x9f04 + Spellcheck Atom = 0x4740a + Src Atom = 0x5c003 + Srcdoc Atom = 0x5c006 + Srclang Atom = 0x5f907 + Srcset Atom = 0x6f906 + Start Atom = 0x3fa05 + Step Atom = 0x58304 + Strike Atom = 0xd206 + Strong Atom = 0x6dd06 + Style Atom = 0x6ff05 + Sub Atom = 0x66d03 + Summary Atom = 0x70407 + Sup Atom = 0x70b03 + Svg Atom = 0x70e03 + System Atom = 0x71106 + Tabindex Atom = 0x4be08 + Table Atom = 0x59505 + Target Atom = 0x2c406 + Tbody Atom = 0x2705 + Td Atom = 0x9202 + Template Atom = 0x71408 + Textarea Atom = 0x35208 + Tfoot Atom = 0xf505 + Th Atom = 0x15602 + Thead Atom = 0x33005 + Time Atom = 0x4204 + Title Atom = 0x11005 + Tr Atom = 0xcc02 + Track Atom = 0x1ba05 + Translate Atom = 0x1f209 + Tt Atom = 0x6802 + Type Atom = 0xd904 + Typemustmatch Atom = 0x2900d + U Atom = 0xb01 + Ul Atom = 0xa702 + Updateviacache Atom = 0x460e + Usemap Atom = 0x59e06 + Value Atom = 0x1505 + Var Atom = 0x16d03 + Video Atom = 0x2f105 + Wbr Atom = 0x57c03 + Width Atom = 0x64905 + Workertype Atom = 0x71c0a + Wrap Atom = 0x72604 + Xmp Atom = 0x12f03 +) + +const hash0 = 0x81cdf10e + +const maxAtomLen = 25 + +var table = [1 << 9]Atom{ + 0x1: 0xe60a, // mediagroup + 0x2: 0x2e404, // lang + 0x4: 0x2c09, // accesskey + 0x5: 0x8b08, // frameset + 0x7: 0x63a08, // onselect + 0x8: 0x71106, // system + 0xa: 0x64905, // width + 0xc: 0x2890b, // formenctype + 0xd: 0x13702, // ol + 0xe: 0x3970b, // oncuechange + 0x10: 0x14b03, // bdo + 0x11: 0x11505, // audio + 0x12: 0x17a09, // draggable + 0x14: 0x2f105, // video + 0x15: 0x2b102, // mn + 0x16: 0x38704, // menu + 0x17: 0x2cf06, // poster + 0x19: 0xf606, // footer + 0x1a: 0x2a806, // method + 0x1b: 0x2b808, // datetime + 0x1c: 0x19507, // onabort + 0x1d: 0x460e, // updateviacache + 0x1e: 0xff05, // async + 0x1f: 0x49d06, // onload + 0x21: 0x11908, // oncancel + 0x22: 0x62908, // onseeked + 0x23: 0x30205, // image + 0x24: 0x5d812, // onrejectionhandled + 0x26: 0x17404, // link + 0x27: 0x51d06, // output + 0x28: 0x33104, // head + 0x29: 0x4ff0c, // onmouseleave + 0x2a: 0x57f07, // onpaste + 0x2b: 0x5a409, // onplaying + 0x2c: 0x1c407, // colspan + 0x2f: 0x1bf05, // color + 0x30: 0x5f504, // size + 0x31: 0x2e80a, // http-equiv + 0x33: 0x601, // i + 0x34: 0x5590a, // onpagehide + 0x35: 0x68c14, // onunhandledrejection + 0x37: 0x42a07, // onerror + 0x3a: 0x3b08, // basefont + 0x3f: 0x1303, // nav + 0x40: 0x17704, // kind + 0x41: 0x35708, // readonly + 0x42: 0x30806, // mglyph + 0x44: 0xb202, // li + 0x46: 0x2d506, // hidden + 0x47: 0x70e03, // svg + 0x48: 0x58304, // step + 0x49: 0x23f09, // integrity + 0x4a: 0x58606, // public + 0x4c: 0x1ab03, // col + 0x4d: 0x1870a, // blockquote + 0x4e: 0x34f02, // h5 + 0x50: 0x5b908, // progress + 0x51: 0x5f505, // sizes + 0x52: 0x34502, // h4 + 0x56: 0x33005, // thead + 0x57: 0xd607, // keytype + 0x58: 0x5b70a, // onprogress + 0x59: 0x44b09, // inputmode + 0x5a: 0x3b109, // ondragend + 0x5d: 0x3a205, // oncut + 0x5e: 0x43706, // spacer + 0x5f: 0x1ab08, // colgroup + 0x62: 0x16502, // is + 0x65: 0x3c02, // as + 0x66: 0x54809, // onoffline + 0x67: 0x33706, // sorted + 0x69: 0x48d10, // onlanguagechange + 0x6c: 0x43d0c, // onhashchange + 0x6d: 0x9604, // name + 0x6e: 0xf505, // tfoot + 0x6f: 0x56104, // desc + 0x70: 0x33d03, // max + 0x72: 0x1ea06, // coords + 0x73: 0x30d02, // h3 + 0x74: 0x6e70e, // onbeforeunload + 0x75: 0x9c04, // rows + 0x76: 0x63c06, // select + 0x77: 0x9805, // meter + 0x78: 0x38b06, // itemid + 0x79: 0x53c0c, // onmousewheel + 0x7a: 0x5c006, // srcdoc + 0x7d: 0x1ba05, // track + 0x7f: 0x31f08, // itemtype + 0x82: 0xa402, // mo + 0x83: 0x41b08, // onchange + 0x84: 0x33107, // headers + 0x85: 0x5cc0c, // onratechange + 0x86: 0x60819, // onsecuritypolicyviolation + 0x88: 0x4a508, // datalist + 0x89: 0x4e80b, // onmousedown + 0x8a: 0x1ef04, // slot + 0x8b: 0x4b010, // onloadedmetadata + 0x8c: 0x1a06, // accept + 0x8d: 0x26806, // object + 0x91: 0x6b30e, // onvolumechange + 0x92: 0x2107, // charset + 0x93: 0x27613, // onautocompleteerror + 0x94: 0xc113, // allowpaymentrequest + 0x95: 0x2804, // body + 0x96: 0x10a07, // default + 0x97: 0x63c08, // selected + 0x98: 0x21e04, // face + 0x99: 0x1e505, // shape + 0x9b: 0x68408, // ontoggle + 0x9e: 0x64b02, // dt + 0x9f: 0xb604, // mark + 0xa1: 0xb01, // u + 0xa4: 0x6ab08, // onunload + 0xa5: 0x5d04, // loop + 0xa6: 0x16408, // disabled + 0xaa: 0x42307, // onended + 0xab: 0xb00a, // malignmark + 0xad: 0x67b09, // onsuspend + 0xae: 0x35105, // mtext + 0xaf: 0x64f06, // onsort + 0xb0: 0x19d08, // itemprop + 0xb3: 0x67109, // itemscope + 0xb4: 0x17305, // blink + 0xb6: 0x3b106, // ondrag + 0xb7: 0xa702, // ul + 0xb8: 0x26e04, // form + 0xb9: 0x12907, // sandbox + 0xba: 0x8b05, // frame + 0xbb: 0x1505, // value + 0xbc: 0x66209, // onstorage + 0xbf: 0xaa07, // acronym + 0xc0: 0x19a02, // rt + 0xc2: 0x202, // br + 0xc3: 0x22608, // fieldset + 0xc4: 0x2900d, // typemustmatch + 0xc5: 0xa208, // nomodule + 0xc6: 0x6c07, // noembed + 0xc7: 0x69e0d, // onbeforeprint + 0xc8: 0x19106, // button + 0xc9: 0x2f507, // onclick + 0xca: 0x70407, // summary + 0xcd: 0xfb04, // ruby + 0xce: 0x56405, // class + 0xcf: 0x3f40b, // ondragstart + 0xd0: 0x23107, // caption + 0xd4: 0xdd0e, // allowusermedia + 0xd5: 0x4cf0b, // onloadstart + 0xd9: 0x16b03, // div + 0xda: 0x4a904, // list + 0xdb: 0x32e04, // math + 0xdc: 0x44b05, // input + 0xdf: 0x3ea0a, // ondragover + 0xe0: 0x2de02, // h2 + 0xe2: 0x1b209, // plaintext + 0xe4: 0x4f30c, // onmouseenter + 0xe7: 0x47907, // checked + 0xe8: 0x47003, // pre + 0xea: 0x35f08, // multiple + 0xeb: 0xba03, // bdi + 0xec: 0x33d09, // maxlength + 0xed: 0xcf01, // q + 0xee: 0x61f0a, // onauxclick + 0xf0: 0x57c03, // wbr + 0xf2: 0x3b04, // base + 0xf3: 0x6e306, // option + 0xf5: 0x41310, // ondurationchange + 0xf7: 0x8908, // noframes + 0xf9: 0x40508, // dropzone + 0xfb: 0x67505, // scope + 0xfc: 0x8008, // reversed + 0xfd: 0x3ba0b, // ondragenter + 0xfe: 0x3fa05, // start + 0xff: 0x12f03, // xmp + 0x100: 0x5f907, // srclang + 0x101: 0x30703, // img + 0x104: 0x101, // b + 0x105: 0x25403, // for + 0x106: 0x10705, // aside + 0x107: 0x44907, // oninput + 0x108: 0x35604, // area + 0x109: 0x2a40a, // formmethod + 0x10a: 0x72604, // wrap + 0x10c: 0x23c02, // rp + 0x10d: 0x46b0a, // onkeypress + 0x10e: 0x6802, // tt + 0x110: 0x34702, // mi + 0x111: 0x36705, // muted + 0x112: 0xf303, // alt + 0x113: 0x5c504, // code + 0x114: 0x6e02, // em + 0x115: 0x3c50a, // ondragexit + 0x117: 0x9f04, // span + 0x119: 0x6d708, // manifest + 0x11a: 0x38708, // menuitem + 0x11b: 0x58b07, // content + 0x11d: 0x6c109, // onwaiting + 0x11f: 0x4c609, // onloadend + 0x121: 0x37e0d, // oncontextmenu + 0x123: 0x56d06, // onblur + 0x124: 0x3fc07, // article + 0x125: 0x9303, // dir + 0x126: 0xef04, // ping + 0x127: 0x24c08, // required + 0x128: 0x45509, // oninvalid + 0x129: 0xb105, // align + 0x12b: 0x58a04, // icon + 0x12c: 0x64d02, // h6 + 0x12d: 0x1c404, // cols + 0x12e: 0x22e0a, // figcaption + 0x12f: 0x45e09, // onkeydown + 0x130: 0x66b08, // onsubmit + 0x131: 0x14d09, // oncanplay + 0x132: 0x70b03, // sup + 0x133: 0xc01, // p + 0x135: 0x40a09, // onemptied + 0x136: 0x39106, // oncopy + 0x137: 0x19c04, // cite + 0x138: 0x3a70a, // ondblclick + 0x13a: 0x50b0b, // onmousemove + 0x13c: 0x66d03, // sub + 0x13d: 0x48703, // rel + 0x13e: 0x5f08, // optgroup + 0x142: 0x9c07, // rowspan + 0x143: 0x37806, // source + 0x144: 0x21608, // noscript + 0x145: 0x1a304, // open + 0x146: 0x20403, // ins + 0x147: 0x2540d, // foreignObject + 0x148: 0x5ad0a, // onpopstate + 0x14a: 0x28d07, // enctype + 0x14b: 0x2760e, // onautocomplete + 0x14c: 0x35208, // textarea + 0x14e: 0x2780c, // autocomplete + 0x14f: 0x15702, // hr + 0x150: 0x1de08, // controls + 0x151: 0x10902, // id + 0x153: 0x2360c, // onafterprint + 0x155: 0x2610d, // foreignobject + 0x156: 0x32707, // marquee + 0x157: 0x59a07, // onpause + 0x158: 0x5e602, // dl + 0x159: 0x5206, // height + 0x15a: 0x34703, // min + 0x15b: 0x9307, // dirname + 0x15c: 0x1f209, // translate + 0x15d: 0x5604, // html + 0x15e: 0x34709, // minlength + 0x15f: 0x48607, // preload + 0x160: 0x71408, // template + 0x161: 0x3df0b, // ondragleave + 0x162: 0x3a02, // rb + 0x164: 0x5c003, // src + 0x165: 0x6dd06, // strong + 0x167: 0x7804, // samp + 0x168: 0x6f307, // address + 0x169: 0x55108, // ononline + 0x16b: 0x1310b, // placeholder + 0x16c: 0x2c406, // target + 0x16d: 0x20605, // small + 0x16e: 0x6ca07, // onwheel + 0x16f: 0x1c90a, // annotation + 0x170: 0x4740a, // spellcheck + 0x171: 0x7207, // details + 0x172: 0x10306, // canvas + 0x173: 0x12109, // autofocus + 0x174: 0xc05, // param + 0x176: 0x46308, // download + 0x177: 0x45203, // del + 0x178: 0x36c07, // onclose + 0x179: 0xb903, // kbd + 0x17a: 0x31906, // applet + 0x17b: 0x2e004, // href + 0x17c: 0x5f108, // onresize + 0x17e: 0x49d0c, // onloadeddata + 0x180: 0xcc02, // tr + 0x181: 0x2c00a, // formtarget + 0x182: 0x11005, // title + 0x183: 0x6ff05, // style + 0x184: 0xd206, // strike + 0x185: 0x59e06, // usemap + 0x186: 0x2fc06, // iframe + 0x187: 0x1004, // main + 0x189: 0x7b07, // picture + 0x18c: 0x31605, // ismap + 0x18e: 0x4a504, // data + 0x18f: 0x5905, // label + 0x191: 0x3d10e, // referrerpolicy + 0x192: 0x15602, // th + 0x194: 0x53606, // prompt + 0x195: 0x56807, // section + 0x197: 0x6d107, // optimum + 0x198: 0x2db04, // high + 0x199: 0x15c02, // h1 + 0x19a: 0x65909, // onstalled + 0x19b: 0x16d03, // var + 0x19c: 0x4204, // time + 0x19e: 0x67402, // ms + 0x19f: 0x33106, // header + 0x1a0: 0x4da09, // onmessage + 0x1a1: 0x1a605, // nonce + 0x1a2: 0x26e0a, // formaction + 0x1a3: 0x22006, // center + 0x1a4: 0x3704, // nobr + 0x1a5: 0x59505, // table + 0x1a6: 0x4a907, // listing + 0x1a7: 0x18106, // legend + 0x1a9: 0x29b09, // challenge + 0x1aa: 0x24806, // figure + 0x1ab: 0xe605, // media + 0x1ae: 0xd904, // type + 0x1af: 0x3f04, // font + 0x1b0: 0x4da0e, // onmessageerror + 0x1b1: 0x37108, // seamless + 0x1b2: 0x8703, // dfn + 0x1b3: 0x5c705, // defer + 0x1b4: 0xc303, // low + 0x1b5: 0x19a03, // rtc + 0x1b6: 0x5230b, // onmouseover + 0x1b7: 0x2b20a, // novalidate + 0x1b8: 0x71c0a, // workertype + 0x1ba: 0x3cd07, // itemref + 0x1bd: 0x1, // a + 0x1be: 0x31803, // map + 0x1bf: 0x400c, // ontimeupdate + 0x1c0: 0x15e07, // bgsound + 0x1c1: 0x3206, // keygen + 0x1c2: 0x2705, // tbody + 0x1c5: 0x64406, // onshow + 0x1c7: 0x2501, // s + 0x1c8: 0x6607, // pattern + 0x1cc: 0x14d10, // oncanplaythrough + 0x1ce: 0x2d702, // dd + 0x1cf: 0x6f906, // srcset + 0x1d0: 0x17003, // big + 0x1d2: 0x65108, // sortable + 0x1d3: 0x48007, // onkeyup + 0x1d5: 0x5a406, // onplay + 0x1d7: 0x4b804, // meta + 0x1d8: 0x40306, // ondrop + 0x1da: 0x60008, // onscroll + 0x1db: 0x1fb0b, // crossorigin + 0x1dc: 0x5730a, // onpageshow + 0x1dd: 0x4, // abbr + 0x1de: 0x9202, // td + 0x1df: 0x58b0f, // contenteditable + 0x1e0: 0x27206, // action + 0x1e1: 0x1400b, // playsinline + 0x1e2: 0x43107, // onfocus + 0x1e3: 0x2e008, // hreflang + 0x1e5: 0x5160a, // onmouseout + 0x1e6: 0x5ea07, // onreset + 0x1e7: 0x13c08, // autoplay + 0x1e8: 0x63109, // onseeking + 0x1ea: 0x67506, // scoped + 0x1ec: 0x30a, // radiogroup + 0x1ee: 0x3800b, // contextmenu + 0x1ef: 0x52e09, // onmouseup + 0x1f1: 0x2ca06, // hgroup + 0x1f2: 0x2080f, // allowfullscreen + 0x1f3: 0x4be08, // tabindex + 0x1f6: 0x30f07, // isindex + 0x1f7: 0x1a0e, // accept-charset + 0x1f8: 0x2ae0e, // formnovalidate + 0x1fb: 0x1c90e, // annotation-xml + 0x1fc: 0x6e05, // embed + 0x1fd: 0x21806, // script + 0x1fe: 0xbb06, // dialog + 0x1ff: 0x1d707, // command +} + +const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb" + + "asefontimeupdateviacacheightmlabelooptgroupatternoembedetail" + + "sampictureversedfnoframesetdirnameterowspanomoduleacronymali" + + "gnmarkbdialogallowpaymentrequestrikeytypeallowusermediagroup" + + "ingaltfooterubyasyncanvasidefaultitleaudioncancelautofocusan" + + "dboxmplaceholderautoplaysinlinebdoncanplaythrough1bgsoundisa" + + "bledivarbigblinkindraggablegendblockquotebuttonabortcitempro" + + "penoncecolgrouplaintextrackcolorcolspannotation-xmlcommandco" + + "ntrolshapecoordslotranslatecrossoriginsmallowfullscreenoscri" + + "ptfacenterfieldsetfigcaptionafterprintegrityfigurequiredfore" + + "ignObjectforeignobjectformactionautocompleteerrorformenctype" + + "mustmatchallengeformmethodformnovalidatetimeformtargethgroup" + + "osterhiddenhigh2hreflanghttp-equivideonclickiframeimageimgly" + + "ph3isindexismappletitemtypemarqueematheadersortedmaxlength4m" + + "inlength5mtextareadonlymultiplemutedoncloseamlessourceoncont" + + "extmenuitemidoncopyoncuechangeoncutondblclickondragendondrag" + + "enterondragexitemreferrerpolicyondragleaveondragoverondragst" + + "articleondropzonemptiedondurationchangeonendedonerroronfocus" + + "paceronhashchangeoninputmodeloninvalidonkeydownloadonkeypres" + + "spellcheckedonkeyupreloadonlanguagechangeonloadeddatalisting" + + "onloadedmetadatabindexonloadendonloadstartonmessageerroronmo" + + "usedownonmouseenteronmouseleaveonmousemoveonmouseoutputonmou" + + "seoveronmouseupromptonmousewheelonofflineononlineonpagehides" + + "classectionbluronpageshowbronpastepublicontenteditableonpaus" + + "emaponplayingonpopstateonprogressrcdocodeferonratechangeonre" + + "jectionhandledonresetonresizesrclangonscrollonsecuritypolicy" + + "violationauxclickonseekedonseekingonselectedonshowidth6onsor" + + "tableonstalledonstorageonsubmitemscopedonsuspendontoggleonun" + + "handledrejectionbeforeprintonunloadonvolumechangeonwaitingon" + + "wheeloptimumanifestrongoptionbeforeunloaddressrcsetstylesumm" + + "arysupsvgsystemplateworkertypewrap" diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go new file mode 100644 index 0000000000..ff7acf2d5b --- /dev/null +++ b/vendor/golang.org/x/net/html/const.go @@ -0,0 +1,111 @@ +// Copyright 2011 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 html + +// Section 12.2.4.2 of the HTML5 specification says "The following elements +// have varying levels of special parsing rules". +// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements +var isSpecialElementMap = map[string]bool{ + "address": true, + "applet": true, + "area": true, + "article": true, + "aside": true, + "base": true, + "basefont": true, + "bgsound": true, + "blockquote": true, + "body": true, + "br": true, + "button": true, + "caption": true, + "center": true, + "col": true, + "colgroup": true, + "dd": true, + "details": true, + "dir": true, + "div": true, + "dl": true, + "dt": true, + "embed": true, + "fieldset": true, + "figcaption": true, + "figure": true, + "footer": true, + "form": true, + "frame": true, + "frameset": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "header": true, + "hgroup": true, + "hr": true, + "html": true, + "iframe": true, + "img": true, + "input": true, + "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility. + "li": true, + "link": true, + "listing": true, + "main": true, + "marquee": true, + "menu": true, + "meta": true, + "nav": true, + "noembed": true, + "noframes": true, + "noscript": true, + "object": true, + "ol": true, + "p": true, + "param": true, + "plaintext": true, + "pre": true, + "script": true, + "section": true, + "select": true, + "source": true, + "style": true, + "summary": true, + "table": true, + "tbody": true, + "td": true, + "template": true, + "textarea": true, + "tfoot": true, + "th": true, + "thead": true, + "title": true, + "tr": true, + "track": true, + "ul": true, + "wbr": true, + "xmp": true, +} + +func isSpecialElement(element *Node) bool { + switch element.Namespace { + case "", "html": + return isSpecialElementMap[element.Data] + case "math": + switch element.Data { + case "mi", "mo", "mn", "ms", "mtext", "annotation-xml": + return true + } + case "svg": + switch element.Data { + case "foreignObject", "desc", "title": + return true + } + } + return false +} diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go new file mode 100644 index 0000000000..2466ae3d9a --- /dev/null +++ b/vendor/golang.org/x/net/html/doc.go @@ -0,0 +1,127 @@ +// Copyright 2010 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 html implements an HTML5-compliant tokenizer and parser. + +Tokenization is done by creating a Tokenizer for an io.Reader r. It is the +caller's responsibility to ensure that r provides UTF-8 encoded HTML. + + z := html.NewTokenizer(r) + +Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), +which parses the next token and returns its type, or an error: + + for { + tt := z.Next() + if tt == html.ErrorToken { + // ... + return ... + } + // Process the current token. + } + +There are two APIs for retrieving the current token. The high-level API is to +call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs +allow optionally calling Raw after Next but before Token, Text, TagName, or +TagAttr. In EBNF notation, the valid call sequence per token is: + + Next {Raw} [ Token | Text | TagName {TagAttr} ] + +Token returns an independent data structure that completely describes a token. +Entities (such as "<") are unescaped, tag names and attribute keys are +lower-cased, and attributes are collected into a []Attribute. For example: + + for { + if z.Next() == html.ErrorToken { + // Returning io.EOF indicates success. + return z.Err() + } + emitToken(z.Token()) + } + +The low-level API performs fewer allocations and copies, but the contents of +the []byte values returned by Text, TagName and TagAttr may change on the next +call to Next. For example, to extract an HTML page's anchor text: + + depth := 0 + for { + tt := z.Next() + switch tt { + case html.ErrorToken: + return z.Err() + case html.TextToken: + if depth > 0 { + // emitBytes should copy the []byte it receives, + // if it doesn't process it immediately. + emitBytes(z.Text()) + } + case html.StartTagToken, html.EndTagToken: + tn, _ := z.TagName() + if len(tn) == 1 && tn[0] == 'a' { + if tt == html.StartTagToken { + depth++ + } else { + depth-- + } + } + } + } + +Parsing is done by calling Parse with an io.Reader, which returns the root of +the parse tree (the document element) as a *Node. It is the caller's +responsibility to ensure that the Reader provides UTF-8 encoded HTML. For +example, to process each anchor node in depth-first order: + + doc, err := html.Parse(r) + if err != nil { + // ... + } + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "a" { + // Do something with n... + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(doc) + +The relevant specifications include: +https://html.spec.whatwg.org/multipage/syntax.html and +https://html.spec.whatwg.org/multipage/syntax.html#tokenization + +# Security Considerations + +Care should be taken when parsing and interpreting HTML, whether full documents +or fragments, within the framework of the HTML specification, especially with +regard to untrusted inputs. + +This package provides both a tokenizer and a parser, which implement the +tokenization, and tokenization and tree construction stages of the WHATWG HTML +parsing specification respectively. While the tokenizer parses and normalizes +individual HTML tokens, only the parser constructs the DOM tree from the +tokenized HTML, as described in the tree construction stage of the +specification, dynamically modifying or extending the docuemnt's DOM tree. + +If your use case requires semantically well-formed HTML documents, as defined by +the WHATWG specification, the parser should be used rather than the tokenizer. + +In security contexts, if trust decisions are being made using the tokenized or +parsed content, the input must be re-serialized (for instance by using Render or +Token.String) in order for those trust decisions to hold, as the process of +tokenization or parsing may alter the content. +*/ +package html // import "golang.org/x/net/html" + +// The tokenization algorithm implemented by this package is not a line-by-line +// transliteration of the relatively verbose state-machine in the WHATWG +// specification. A more direct approach is used instead, where the program +// counter implies the state, such as whether it is tokenizing a tag or a text +// node. Specification compliance is verified by checking expected and actual +// outputs over a test suite rather than aiming for algorithmic fidelity. + +// TODO(nigeltao): Does a DOM API belong in this package or a separate one? +// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go new file mode 100644 index 0000000000..c484e5a94f --- /dev/null +++ b/vendor/golang.org/x/net/html/doctype.go @@ -0,0 +1,156 @@ +// Copyright 2011 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 html + +import ( + "strings" +) + +// parseDoctype parses the data from a DoctypeToken into a name, +// public identifier, and system identifier. It returns a Node whose Type +// is DoctypeNode, whose Data is the name, and which has attributes +// named "system" and "public" for the two identifiers if they were present. +// quirks is whether the document should be parsed in "quirks mode". +func parseDoctype(s string) (n *Node, quirks bool) { + n = &Node{Type: DoctypeNode} + + // Find the name. + space := strings.IndexAny(s, whitespace) + if space == -1 { + space = len(s) + } + n.Data = s[:space] + // The comparison to "html" is case-sensitive. + if n.Data != "html" { + quirks = true + } + n.Data = strings.ToLower(n.Data) + s = strings.TrimLeft(s[space:], whitespace) + + if len(s) < 6 { + // It can't start with "PUBLIC" or "SYSTEM". + // Ignore the rest of the string. + return n, quirks || s != "" + } + + key := strings.ToLower(s[:6]) + s = s[6:] + for key == "public" || key == "system" { + s = strings.TrimLeft(s, whitespace) + if s == "" { + break + } + quote := s[0] + if quote != '"' && quote != '\'' { + break + } + s = s[1:] + q := strings.IndexRune(s, rune(quote)) + var id string + if q == -1 { + id = s + s = "" + } else { + id = s[:q] + s = s[q+1:] + } + n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) + if key == "public" { + key = "system" + } else { + key = "" + } + } + + if key != "" || s != "" { + quirks = true + } else if len(n.Attr) > 0 { + if n.Attr[0].Key == "public" { + public := strings.ToLower(n.Attr[0].Val) + switch public { + case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": + quirks = true + default: + for _, q := range quirkyIDs { + if strings.HasPrefix(public, q) { + quirks = true + break + } + } + } + // The following two public IDs only cause quirks mode if there is no system ID. + if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || + strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { + quirks = true + } + } + if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && + strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { + quirks = true + } + } + + return n, quirks +} + +// quirkyIDs is a list of public doctype identifiers that cause a document +// to be interpreted in quirks mode. The identifiers should be in lower case. +var quirkyIDs = []string{ + "+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//", +} diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go new file mode 100644 index 0000000000..b628880a01 --- /dev/null +++ b/vendor/golang.org/x/net/html/entity.go @@ -0,0 +1,2253 @@ +// Copyright 2010 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 html + +// All entities that do not end with ';' are 6 or fewer bytes long. +const longestEntityWithoutSemicolon = 6 + +// entity is a map from HTML entity names to their values. The semicolon matters: +// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references +// lists both "amp" and "amp;" as two separate entries. +// +// Note that the HTML5 list is larger than the HTML4 list at +// http://www.w3.org/TR/html4/sgml/entities.html +var entity = map[string]rune{ + "AElig;": '\U000000C6', + "AMP;": '\U00000026', + "Aacute;": '\U000000C1', + "Abreve;": '\U00000102', + "Acirc;": '\U000000C2', + "Acy;": '\U00000410', + "Afr;": '\U0001D504', + "Agrave;": '\U000000C0', + "Alpha;": '\U00000391', + "Amacr;": '\U00000100', + "And;": '\U00002A53', + "Aogon;": '\U00000104', + "Aopf;": '\U0001D538', + "ApplyFunction;": '\U00002061', + "Aring;": '\U000000C5', + "Ascr;": '\U0001D49C', + "Assign;": '\U00002254', + "Atilde;": '\U000000C3', + "Auml;": '\U000000C4', + "Backslash;": '\U00002216', + "Barv;": '\U00002AE7', + "Barwed;": '\U00002306', + "Bcy;": '\U00000411', + "Because;": '\U00002235', + "Bernoullis;": '\U0000212C', + "Beta;": '\U00000392', + "Bfr;": '\U0001D505', + "Bopf;": '\U0001D539', + "Breve;": '\U000002D8', + "Bscr;": '\U0000212C', + "Bumpeq;": '\U0000224E', + "CHcy;": '\U00000427', + "COPY;": '\U000000A9', + "Cacute;": '\U00000106', + "Cap;": '\U000022D2', + "CapitalDifferentialD;": '\U00002145', + "Cayleys;": '\U0000212D', + "Ccaron;": '\U0000010C', + "Ccedil;": '\U000000C7', + "Ccirc;": '\U00000108', + "Cconint;": '\U00002230', + "Cdot;": '\U0000010A', + "Cedilla;": '\U000000B8', + "CenterDot;": '\U000000B7', + "Cfr;": '\U0000212D', + "Chi;": '\U000003A7', + "CircleDot;": '\U00002299', + "CircleMinus;": '\U00002296', + "CirclePlus;": '\U00002295', + "CircleTimes;": '\U00002297', + "ClockwiseContourIntegral;": '\U00002232', + "CloseCurlyDoubleQuote;": '\U0000201D', + "CloseCurlyQuote;": '\U00002019', + "Colon;": '\U00002237', + "Colone;": '\U00002A74', + "Congruent;": '\U00002261', + "Conint;": '\U0000222F', + "ContourIntegral;": '\U0000222E', + "Copf;": '\U00002102', + "Coproduct;": '\U00002210', + "CounterClockwiseContourIntegral;": '\U00002233', + "Cross;": '\U00002A2F', + "Cscr;": '\U0001D49E', + "Cup;": '\U000022D3', + "CupCap;": '\U0000224D', + "DD;": '\U00002145', + "DDotrahd;": '\U00002911', + "DJcy;": '\U00000402', + "DScy;": '\U00000405', + "DZcy;": '\U0000040F', + "Dagger;": '\U00002021', + "Darr;": '\U000021A1', + "Dashv;": '\U00002AE4', + "Dcaron;": '\U0000010E', + "Dcy;": '\U00000414', + "Del;": '\U00002207', + "Delta;": '\U00000394', + "Dfr;": '\U0001D507', + "DiacriticalAcute;": '\U000000B4', + "DiacriticalDot;": '\U000002D9', + "DiacriticalDoubleAcute;": '\U000002DD', + "DiacriticalGrave;": '\U00000060', + "DiacriticalTilde;": '\U000002DC', + "Diamond;": '\U000022C4', + "DifferentialD;": '\U00002146', + "Dopf;": '\U0001D53B', + "Dot;": '\U000000A8', + "DotDot;": '\U000020DC', + "DotEqual;": '\U00002250', + "DoubleContourIntegral;": '\U0000222F', + "DoubleDot;": '\U000000A8', + "DoubleDownArrow;": '\U000021D3', + "DoubleLeftArrow;": '\U000021D0', + "DoubleLeftRightArrow;": '\U000021D4', + "DoubleLeftTee;": '\U00002AE4', + "DoubleLongLeftArrow;": '\U000027F8', + "DoubleLongLeftRightArrow;": '\U000027FA', + "DoubleLongRightArrow;": '\U000027F9', + "DoubleRightArrow;": '\U000021D2', + "DoubleRightTee;": '\U000022A8', + "DoubleUpArrow;": '\U000021D1', + "DoubleUpDownArrow;": '\U000021D5', + "DoubleVerticalBar;": '\U00002225', + "DownArrow;": '\U00002193', + "DownArrowBar;": '\U00002913', + "DownArrowUpArrow;": '\U000021F5', + "DownBreve;": '\U00000311', + "DownLeftRightVector;": '\U00002950', + "DownLeftTeeVector;": '\U0000295E', + "DownLeftVector;": '\U000021BD', + "DownLeftVectorBar;": '\U00002956', + "DownRightTeeVector;": '\U0000295F', + "DownRightVector;": '\U000021C1', + "DownRightVectorBar;": '\U00002957', + "DownTee;": '\U000022A4', + "DownTeeArrow;": '\U000021A7', + "Downarrow;": '\U000021D3', + "Dscr;": '\U0001D49F', + "Dstrok;": '\U00000110', + "ENG;": '\U0000014A', + "ETH;": '\U000000D0', + "Eacute;": '\U000000C9', + "Ecaron;": '\U0000011A', + "Ecirc;": '\U000000CA', + "Ecy;": '\U0000042D', + "Edot;": '\U00000116', + "Efr;": '\U0001D508', + "Egrave;": '\U000000C8', + "Element;": '\U00002208', + "Emacr;": '\U00000112', + "EmptySmallSquare;": '\U000025FB', + "EmptyVerySmallSquare;": '\U000025AB', + "Eogon;": '\U00000118', + "Eopf;": '\U0001D53C', + "Epsilon;": '\U00000395', + "Equal;": '\U00002A75', + "EqualTilde;": '\U00002242', + "Equilibrium;": '\U000021CC', + "Escr;": '\U00002130', + "Esim;": '\U00002A73', + "Eta;": '\U00000397', + "Euml;": '\U000000CB', + "Exists;": '\U00002203', + "ExponentialE;": '\U00002147', + "Fcy;": '\U00000424', + "Ffr;": '\U0001D509', + "FilledSmallSquare;": '\U000025FC', + "FilledVerySmallSquare;": '\U000025AA', + "Fopf;": '\U0001D53D', + "ForAll;": '\U00002200', + "Fouriertrf;": '\U00002131', + "Fscr;": '\U00002131', + "GJcy;": '\U00000403', + "GT;": '\U0000003E', + "Gamma;": '\U00000393', + "Gammad;": '\U000003DC', + "Gbreve;": '\U0000011E', + "Gcedil;": '\U00000122', + "Gcirc;": '\U0000011C', + "Gcy;": '\U00000413', + "Gdot;": '\U00000120', + "Gfr;": '\U0001D50A', + "Gg;": '\U000022D9', + "Gopf;": '\U0001D53E', + "GreaterEqual;": '\U00002265', + "GreaterEqualLess;": '\U000022DB', + "GreaterFullEqual;": '\U00002267', + "GreaterGreater;": '\U00002AA2', + "GreaterLess;": '\U00002277', + "GreaterSlantEqual;": '\U00002A7E', + "GreaterTilde;": '\U00002273', + "Gscr;": '\U0001D4A2', + "Gt;": '\U0000226B', + "HARDcy;": '\U0000042A', + "Hacek;": '\U000002C7', + "Hat;": '\U0000005E', + "Hcirc;": '\U00000124', + "Hfr;": '\U0000210C', + "HilbertSpace;": '\U0000210B', + "Hopf;": '\U0000210D', + "HorizontalLine;": '\U00002500', + "Hscr;": '\U0000210B', + "Hstrok;": '\U00000126', + "HumpDownHump;": '\U0000224E', + "HumpEqual;": '\U0000224F', + "IEcy;": '\U00000415', + "IJlig;": '\U00000132', + "IOcy;": '\U00000401', + "Iacute;": '\U000000CD', + "Icirc;": '\U000000CE', + "Icy;": '\U00000418', + "Idot;": '\U00000130', + "Ifr;": '\U00002111', + "Igrave;": '\U000000CC', + "Im;": '\U00002111', + "Imacr;": '\U0000012A', + "ImaginaryI;": '\U00002148', + "Implies;": '\U000021D2', + "Int;": '\U0000222C', + "Integral;": '\U0000222B', + "Intersection;": '\U000022C2', + "InvisibleComma;": '\U00002063', + "InvisibleTimes;": '\U00002062', + "Iogon;": '\U0000012E', + "Iopf;": '\U0001D540', + "Iota;": '\U00000399', + "Iscr;": '\U00002110', + "Itilde;": '\U00000128', + "Iukcy;": '\U00000406', + "Iuml;": '\U000000CF', + "Jcirc;": '\U00000134', + "Jcy;": '\U00000419', + "Jfr;": '\U0001D50D', + "Jopf;": '\U0001D541', + "Jscr;": '\U0001D4A5', + "Jsercy;": '\U00000408', + "Jukcy;": '\U00000404', + "KHcy;": '\U00000425', + "KJcy;": '\U0000040C', + "Kappa;": '\U0000039A', + "Kcedil;": '\U00000136', + "Kcy;": '\U0000041A', + "Kfr;": '\U0001D50E', + "Kopf;": '\U0001D542', + "Kscr;": '\U0001D4A6', + "LJcy;": '\U00000409', + "LT;": '\U0000003C', + "Lacute;": '\U00000139', + "Lambda;": '\U0000039B', + "Lang;": '\U000027EA', + "Laplacetrf;": '\U00002112', + "Larr;": '\U0000219E', + "Lcaron;": '\U0000013D', + "Lcedil;": '\U0000013B', + "Lcy;": '\U0000041B', + "LeftAngleBracket;": '\U000027E8', + "LeftArrow;": '\U00002190', + "LeftArrowBar;": '\U000021E4', + "LeftArrowRightArrow;": '\U000021C6', + "LeftCeiling;": '\U00002308', + "LeftDoubleBracket;": '\U000027E6', + "LeftDownTeeVector;": '\U00002961', + "LeftDownVector;": '\U000021C3', + "LeftDownVectorBar;": '\U00002959', + "LeftFloor;": '\U0000230A', + "LeftRightArrow;": '\U00002194', + "LeftRightVector;": '\U0000294E', + "LeftTee;": '\U000022A3', + "LeftTeeArrow;": '\U000021A4', + "LeftTeeVector;": '\U0000295A', + "LeftTriangle;": '\U000022B2', + "LeftTriangleBar;": '\U000029CF', + "LeftTriangleEqual;": '\U000022B4', + "LeftUpDownVector;": '\U00002951', + "LeftUpTeeVector;": '\U00002960', + "LeftUpVector;": '\U000021BF', + "LeftUpVectorBar;": '\U00002958', + "LeftVector;": '\U000021BC', + "LeftVectorBar;": '\U00002952', + "Leftarrow;": '\U000021D0', + "Leftrightarrow;": '\U000021D4', + "LessEqualGreater;": '\U000022DA', + "LessFullEqual;": '\U00002266', + "LessGreater;": '\U00002276', + "LessLess;": '\U00002AA1', + "LessSlantEqual;": '\U00002A7D', + "LessTilde;": '\U00002272', + "Lfr;": '\U0001D50F', + "Ll;": '\U000022D8', + "Lleftarrow;": '\U000021DA', + "Lmidot;": '\U0000013F', + "LongLeftArrow;": '\U000027F5', + "LongLeftRightArrow;": '\U000027F7', + "LongRightArrow;": '\U000027F6', + "Longleftarrow;": '\U000027F8', + "Longleftrightarrow;": '\U000027FA', + "Longrightarrow;": '\U000027F9', + "Lopf;": '\U0001D543', + "LowerLeftArrow;": '\U00002199', + "LowerRightArrow;": '\U00002198', + "Lscr;": '\U00002112', + "Lsh;": '\U000021B0', + "Lstrok;": '\U00000141', + "Lt;": '\U0000226A', + "Map;": '\U00002905', + "Mcy;": '\U0000041C', + "MediumSpace;": '\U0000205F', + "Mellintrf;": '\U00002133', + "Mfr;": '\U0001D510', + "MinusPlus;": '\U00002213', + "Mopf;": '\U0001D544', + "Mscr;": '\U00002133', + "Mu;": '\U0000039C', + "NJcy;": '\U0000040A', + "Nacute;": '\U00000143', + "Ncaron;": '\U00000147', + "Ncedil;": '\U00000145', + "Ncy;": '\U0000041D', + "NegativeMediumSpace;": '\U0000200B', + "NegativeThickSpace;": '\U0000200B', + "NegativeThinSpace;": '\U0000200B', + "NegativeVeryThinSpace;": '\U0000200B', + "NestedGreaterGreater;": '\U0000226B', + "NestedLessLess;": '\U0000226A', + "NewLine;": '\U0000000A', + "Nfr;": '\U0001D511', + "NoBreak;": '\U00002060', + "NonBreakingSpace;": '\U000000A0', + "Nopf;": '\U00002115', + "Not;": '\U00002AEC', + "NotCongruent;": '\U00002262', + "NotCupCap;": '\U0000226D', + "NotDoubleVerticalBar;": '\U00002226', + "NotElement;": '\U00002209', + "NotEqual;": '\U00002260', + "NotExists;": '\U00002204', + "NotGreater;": '\U0000226F', + "NotGreaterEqual;": '\U00002271', + "NotGreaterLess;": '\U00002279', + "NotGreaterTilde;": '\U00002275', + "NotLeftTriangle;": '\U000022EA', + "NotLeftTriangleEqual;": '\U000022EC', + "NotLess;": '\U0000226E', + "NotLessEqual;": '\U00002270', + "NotLessGreater;": '\U00002278', + "NotLessTilde;": '\U00002274', + "NotPrecedes;": '\U00002280', + "NotPrecedesSlantEqual;": '\U000022E0', + "NotReverseElement;": '\U0000220C', + "NotRightTriangle;": '\U000022EB', + "NotRightTriangleEqual;": '\U000022ED', + "NotSquareSubsetEqual;": '\U000022E2', + "NotSquareSupersetEqual;": '\U000022E3', + "NotSubsetEqual;": '\U00002288', + "NotSucceeds;": '\U00002281', + "NotSucceedsSlantEqual;": '\U000022E1', + "NotSupersetEqual;": '\U00002289', + "NotTilde;": '\U00002241', + "NotTildeEqual;": '\U00002244', + "NotTildeFullEqual;": '\U00002247', + "NotTildeTilde;": '\U00002249', + "NotVerticalBar;": '\U00002224', + "Nscr;": '\U0001D4A9', + "Ntilde;": '\U000000D1', + "Nu;": '\U0000039D', + "OElig;": '\U00000152', + "Oacute;": '\U000000D3', + "Ocirc;": '\U000000D4', + "Ocy;": '\U0000041E', + "Odblac;": '\U00000150', + "Ofr;": '\U0001D512', + "Ograve;": '\U000000D2', + "Omacr;": '\U0000014C', + "Omega;": '\U000003A9', + "Omicron;": '\U0000039F', + "Oopf;": '\U0001D546', + "OpenCurlyDoubleQuote;": '\U0000201C', + "OpenCurlyQuote;": '\U00002018', + "Or;": '\U00002A54', + "Oscr;": '\U0001D4AA', + "Oslash;": '\U000000D8', + "Otilde;": '\U000000D5', + "Otimes;": '\U00002A37', + "Ouml;": '\U000000D6', + "OverBar;": '\U0000203E', + "OverBrace;": '\U000023DE', + "OverBracket;": '\U000023B4', + "OverParenthesis;": '\U000023DC', + "PartialD;": '\U00002202', + "Pcy;": '\U0000041F', + "Pfr;": '\U0001D513', + "Phi;": '\U000003A6', + "Pi;": '\U000003A0', + "PlusMinus;": '\U000000B1', + "Poincareplane;": '\U0000210C', + "Popf;": '\U00002119', + "Pr;": '\U00002ABB', + "Precedes;": '\U0000227A', + "PrecedesEqual;": '\U00002AAF', + "PrecedesSlantEqual;": '\U0000227C', + "PrecedesTilde;": '\U0000227E', + "Prime;": '\U00002033', + "Product;": '\U0000220F', + "Proportion;": '\U00002237', + "Proportional;": '\U0000221D', + "Pscr;": '\U0001D4AB', + "Psi;": '\U000003A8', + "QUOT;": '\U00000022', + "Qfr;": '\U0001D514', + "Qopf;": '\U0000211A', + "Qscr;": '\U0001D4AC', + "RBarr;": '\U00002910', + "REG;": '\U000000AE', + "Racute;": '\U00000154', + "Rang;": '\U000027EB', + "Rarr;": '\U000021A0', + "Rarrtl;": '\U00002916', + "Rcaron;": '\U00000158', + "Rcedil;": '\U00000156', + "Rcy;": '\U00000420', + "Re;": '\U0000211C', + "ReverseElement;": '\U0000220B', + "ReverseEquilibrium;": '\U000021CB', + "ReverseUpEquilibrium;": '\U0000296F', + "Rfr;": '\U0000211C', + "Rho;": '\U000003A1', + "RightAngleBracket;": '\U000027E9', + "RightArrow;": '\U00002192', + "RightArrowBar;": '\U000021E5', + "RightArrowLeftArrow;": '\U000021C4', + "RightCeiling;": '\U00002309', + "RightDoubleBracket;": '\U000027E7', + "RightDownTeeVector;": '\U0000295D', + "RightDownVector;": '\U000021C2', + "RightDownVectorBar;": '\U00002955', + "RightFloor;": '\U0000230B', + "RightTee;": '\U000022A2', + "RightTeeArrow;": '\U000021A6', + "RightTeeVector;": '\U0000295B', + "RightTriangle;": '\U000022B3', + "RightTriangleBar;": '\U000029D0', + "RightTriangleEqual;": '\U000022B5', + "RightUpDownVector;": '\U0000294F', + "RightUpTeeVector;": '\U0000295C', + "RightUpVector;": '\U000021BE', + "RightUpVectorBar;": '\U00002954', + "RightVector;": '\U000021C0', + "RightVectorBar;": '\U00002953', + "Rightarrow;": '\U000021D2', + "Ropf;": '\U0000211D', + "RoundImplies;": '\U00002970', + "Rrightarrow;": '\U000021DB', + "Rscr;": '\U0000211B', + "Rsh;": '\U000021B1', + "RuleDelayed;": '\U000029F4', + "SHCHcy;": '\U00000429', + "SHcy;": '\U00000428', + "SOFTcy;": '\U0000042C', + "Sacute;": '\U0000015A', + "Sc;": '\U00002ABC', + "Scaron;": '\U00000160', + "Scedil;": '\U0000015E', + "Scirc;": '\U0000015C', + "Scy;": '\U00000421', + "Sfr;": '\U0001D516', + "ShortDownArrow;": '\U00002193', + "ShortLeftArrow;": '\U00002190', + "ShortRightArrow;": '\U00002192', + "ShortUpArrow;": '\U00002191', + "Sigma;": '\U000003A3', + "SmallCircle;": '\U00002218', + "Sopf;": '\U0001D54A', + "Sqrt;": '\U0000221A', + "Square;": '\U000025A1', + "SquareIntersection;": '\U00002293', + "SquareSubset;": '\U0000228F', + "SquareSubsetEqual;": '\U00002291', + "SquareSuperset;": '\U00002290', + "SquareSupersetEqual;": '\U00002292', + "SquareUnion;": '\U00002294', + "Sscr;": '\U0001D4AE', + "Star;": '\U000022C6', + "Sub;": '\U000022D0', + "Subset;": '\U000022D0', + "SubsetEqual;": '\U00002286', + "Succeeds;": '\U0000227B', + "SucceedsEqual;": '\U00002AB0', + "SucceedsSlantEqual;": '\U0000227D', + "SucceedsTilde;": '\U0000227F', + "SuchThat;": '\U0000220B', + "Sum;": '\U00002211', + "Sup;": '\U000022D1', + "Superset;": '\U00002283', + "SupersetEqual;": '\U00002287', + "Supset;": '\U000022D1', + "THORN;": '\U000000DE', + "TRADE;": '\U00002122', + "TSHcy;": '\U0000040B', + "TScy;": '\U00000426', + "Tab;": '\U00000009', + "Tau;": '\U000003A4', + "Tcaron;": '\U00000164', + "Tcedil;": '\U00000162', + "Tcy;": '\U00000422', + "Tfr;": '\U0001D517', + "Therefore;": '\U00002234', + "Theta;": '\U00000398', + "ThinSpace;": '\U00002009', + "Tilde;": '\U0000223C', + "TildeEqual;": '\U00002243', + "TildeFullEqual;": '\U00002245', + "TildeTilde;": '\U00002248', + "Topf;": '\U0001D54B', + "TripleDot;": '\U000020DB', + "Tscr;": '\U0001D4AF', + "Tstrok;": '\U00000166', + "Uacute;": '\U000000DA', + "Uarr;": '\U0000219F', + "Uarrocir;": '\U00002949', + "Ubrcy;": '\U0000040E', + "Ubreve;": '\U0000016C', + "Ucirc;": '\U000000DB', + "Ucy;": '\U00000423', + "Udblac;": '\U00000170', + "Ufr;": '\U0001D518', + "Ugrave;": '\U000000D9', + "Umacr;": '\U0000016A', + "UnderBar;": '\U0000005F', + "UnderBrace;": '\U000023DF', + "UnderBracket;": '\U000023B5', + "UnderParenthesis;": '\U000023DD', + "Union;": '\U000022C3', + "UnionPlus;": '\U0000228E', + "Uogon;": '\U00000172', + "Uopf;": '\U0001D54C', + "UpArrow;": '\U00002191', + "UpArrowBar;": '\U00002912', + "UpArrowDownArrow;": '\U000021C5', + "UpDownArrow;": '\U00002195', + "UpEquilibrium;": '\U0000296E', + "UpTee;": '\U000022A5', + "UpTeeArrow;": '\U000021A5', + "Uparrow;": '\U000021D1', + "Updownarrow;": '\U000021D5', + "UpperLeftArrow;": '\U00002196', + "UpperRightArrow;": '\U00002197', + "Upsi;": '\U000003D2', + "Upsilon;": '\U000003A5', + "Uring;": '\U0000016E', + "Uscr;": '\U0001D4B0', + "Utilde;": '\U00000168', + "Uuml;": '\U000000DC', + "VDash;": '\U000022AB', + "Vbar;": '\U00002AEB', + "Vcy;": '\U00000412', + "Vdash;": '\U000022A9', + "Vdashl;": '\U00002AE6', + "Vee;": '\U000022C1', + "Verbar;": '\U00002016', + "Vert;": '\U00002016', + "VerticalBar;": '\U00002223', + "VerticalLine;": '\U0000007C', + "VerticalSeparator;": '\U00002758', + "VerticalTilde;": '\U00002240', + "VeryThinSpace;": '\U0000200A', + "Vfr;": '\U0001D519', + "Vopf;": '\U0001D54D', + "Vscr;": '\U0001D4B1', + "Vvdash;": '\U000022AA', + "Wcirc;": '\U00000174', + "Wedge;": '\U000022C0', + "Wfr;": '\U0001D51A', + "Wopf;": '\U0001D54E', + "Wscr;": '\U0001D4B2', + "Xfr;": '\U0001D51B', + "Xi;": '\U0000039E', + "Xopf;": '\U0001D54F', + "Xscr;": '\U0001D4B3', + "YAcy;": '\U0000042F', + "YIcy;": '\U00000407', + "YUcy;": '\U0000042E', + "Yacute;": '\U000000DD', + "Ycirc;": '\U00000176', + "Ycy;": '\U0000042B', + "Yfr;": '\U0001D51C', + "Yopf;": '\U0001D550', + "Yscr;": '\U0001D4B4', + "Yuml;": '\U00000178', + "ZHcy;": '\U00000416', + "Zacute;": '\U00000179', + "Zcaron;": '\U0000017D', + "Zcy;": '\U00000417', + "Zdot;": '\U0000017B', + "ZeroWidthSpace;": '\U0000200B', + "Zeta;": '\U00000396', + "Zfr;": '\U00002128', + "Zopf;": '\U00002124', + "Zscr;": '\U0001D4B5', + "aacute;": '\U000000E1', + "abreve;": '\U00000103', + "ac;": '\U0000223E', + "acd;": '\U0000223F', + "acirc;": '\U000000E2', + "acute;": '\U000000B4', + "acy;": '\U00000430', + "aelig;": '\U000000E6', + "af;": '\U00002061', + "afr;": '\U0001D51E', + "agrave;": '\U000000E0', + "alefsym;": '\U00002135', + "aleph;": '\U00002135', + "alpha;": '\U000003B1', + "amacr;": '\U00000101', + "amalg;": '\U00002A3F', + "amp;": '\U00000026', + "and;": '\U00002227', + "andand;": '\U00002A55', + "andd;": '\U00002A5C', + "andslope;": '\U00002A58', + "andv;": '\U00002A5A', + "ang;": '\U00002220', + "ange;": '\U000029A4', + "angle;": '\U00002220', + "angmsd;": '\U00002221', + "angmsdaa;": '\U000029A8', + "angmsdab;": '\U000029A9', + "angmsdac;": '\U000029AA', + "angmsdad;": '\U000029AB', + "angmsdae;": '\U000029AC', + "angmsdaf;": '\U000029AD', + "angmsdag;": '\U000029AE', + "angmsdah;": '\U000029AF', + "angrt;": '\U0000221F', + "angrtvb;": '\U000022BE', + "angrtvbd;": '\U0000299D', + "angsph;": '\U00002222', + "angst;": '\U000000C5', + "angzarr;": '\U0000237C', + "aogon;": '\U00000105', + "aopf;": '\U0001D552', + "ap;": '\U00002248', + "apE;": '\U00002A70', + "apacir;": '\U00002A6F', + "ape;": '\U0000224A', + "apid;": '\U0000224B', + "apos;": '\U00000027', + "approx;": '\U00002248', + "approxeq;": '\U0000224A', + "aring;": '\U000000E5', + "ascr;": '\U0001D4B6', + "ast;": '\U0000002A', + "asymp;": '\U00002248', + "asympeq;": '\U0000224D', + "atilde;": '\U000000E3', + "auml;": '\U000000E4', + "awconint;": '\U00002233', + "awint;": '\U00002A11', + "bNot;": '\U00002AED', + "backcong;": '\U0000224C', + "backepsilon;": '\U000003F6', + "backprime;": '\U00002035', + "backsim;": '\U0000223D', + "backsimeq;": '\U000022CD', + "barvee;": '\U000022BD', + "barwed;": '\U00002305', + "barwedge;": '\U00002305', + "bbrk;": '\U000023B5', + "bbrktbrk;": '\U000023B6', + "bcong;": '\U0000224C', + "bcy;": '\U00000431', + "bdquo;": '\U0000201E', + "becaus;": '\U00002235', + "because;": '\U00002235', + "bemptyv;": '\U000029B0', + "bepsi;": '\U000003F6', + "bernou;": '\U0000212C', + "beta;": '\U000003B2', + "beth;": '\U00002136', + "between;": '\U0000226C', + "bfr;": '\U0001D51F', + "bigcap;": '\U000022C2', + "bigcirc;": '\U000025EF', + "bigcup;": '\U000022C3', + "bigodot;": '\U00002A00', + "bigoplus;": '\U00002A01', + "bigotimes;": '\U00002A02', + "bigsqcup;": '\U00002A06', + "bigstar;": '\U00002605', + "bigtriangledown;": '\U000025BD', + "bigtriangleup;": '\U000025B3', + "biguplus;": '\U00002A04', + "bigvee;": '\U000022C1', + "bigwedge;": '\U000022C0', + "bkarow;": '\U0000290D', + "blacklozenge;": '\U000029EB', + "blacksquare;": '\U000025AA', + "blacktriangle;": '\U000025B4', + "blacktriangledown;": '\U000025BE', + "blacktriangleleft;": '\U000025C2', + "blacktriangleright;": '\U000025B8', + "blank;": '\U00002423', + "blk12;": '\U00002592', + "blk14;": '\U00002591', + "blk34;": '\U00002593', + "block;": '\U00002588', + "bnot;": '\U00002310', + "bopf;": '\U0001D553', + "bot;": '\U000022A5', + "bottom;": '\U000022A5', + "bowtie;": '\U000022C8', + "boxDL;": '\U00002557', + "boxDR;": '\U00002554', + "boxDl;": '\U00002556', + "boxDr;": '\U00002553', + "boxH;": '\U00002550', + "boxHD;": '\U00002566', + "boxHU;": '\U00002569', + "boxHd;": '\U00002564', + "boxHu;": '\U00002567', + "boxUL;": '\U0000255D', + "boxUR;": '\U0000255A', + "boxUl;": '\U0000255C', + "boxUr;": '\U00002559', + "boxV;": '\U00002551', + "boxVH;": '\U0000256C', + "boxVL;": '\U00002563', + "boxVR;": '\U00002560', + "boxVh;": '\U0000256B', + "boxVl;": '\U00002562', + "boxVr;": '\U0000255F', + "boxbox;": '\U000029C9', + "boxdL;": '\U00002555', + "boxdR;": '\U00002552', + "boxdl;": '\U00002510', + "boxdr;": '\U0000250C', + "boxh;": '\U00002500', + "boxhD;": '\U00002565', + "boxhU;": '\U00002568', + "boxhd;": '\U0000252C', + "boxhu;": '\U00002534', + "boxminus;": '\U0000229F', + "boxplus;": '\U0000229E', + "boxtimes;": '\U000022A0', + "boxuL;": '\U0000255B', + "boxuR;": '\U00002558', + "boxul;": '\U00002518', + "boxur;": '\U00002514', + "boxv;": '\U00002502', + "boxvH;": '\U0000256A', + "boxvL;": '\U00002561', + "boxvR;": '\U0000255E', + "boxvh;": '\U0000253C', + "boxvl;": '\U00002524', + "boxvr;": '\U0000251C', + "bprime;": '\U00002035', + "breve;": '\U000002D8', + "brvbar;": '\U000000A6', + "bscr;": '\U0001D4B7', + "bsemi;": '\U0000204F', + "bsim;": '\U0000223D', + "bsime;": '\U000022CD', + "bsol;": '\U0000005C', + "bsolb;": '\U000029C5', + "bsolhsub;": '\U000027C8', + "bull;": '\U00002022', + "bullet;": '\U00002022', + "bump;": '\U0000224E', + "bumpE;": '\U00002AAE', + "bumpe;": '\U0000224F', + "bumpeq;": '\U0000224F', + "cacute;": '\U00000107', + "cap;": '\U00002229', + "capand;": '\U00002A44', + "capbrcup;": '\U00002A49', + "capcap;": '\U00002A4B', + "capcup;": '\U00002A47', + "capdot;": '\U00002A40', + "caret;": '\U00002041', + "caron;": '\U000002C7', + "ccaps;": '\U00002A4D', + "ccaron;": '\U0000010D', + "ccedil;": '\U000000E7', + "ccirc;": '\U00000109', + "ccups;": '\U00002A4C', + "ccupssm;": '\U00002A50', + "cdot;": '\U0000010B', + "cedil;": '\U000000B8', + "cemptyv;": '\U000029B2', + "cent;": '\U000000A2', + "centerdot;": '\U000000B7', + "cfr;": '\U0001D520', + "chcy;": '\U00000447', + "check;": '\U00002713', + "checkmark;": '\U00002713', + "chi;": '\U000003C7', + "cir;": '\U000025CB', + "cirE;": '\U000029C3', + "circ;": '\U000002C6', + "circeq;": '\U00002257', + "circlearrowleft;": '\U000021BA', + "circlearrowright;": '\U000021BB', + "circledR;": '\U000000AE', + "circledS;": '\U000024C8', + "circledast;": '\U0000229B', + "circledcirc;": '\U0000229A', + "circleddash;": '\U0000229D', + "cire;": '\U00002257', + "cirfnint;": '\U00002A10', + "cirmid;": '\U00002AEF', + "cirscir;": '\U000029C2', + "clubs;": '\U00002663', + "clubsuit;": '\U00002663', + "colon;": '\U0000003A', + "colone;": '\U00002254', + "coloneq;": '\U00002254', + "comma;": '\U0000002C', + "commat;": '\U00000040', + "comp;": '\U00002201', + "compfn;": '\U00002218', + "complement;": '\U00002201', + "complexes;": '\U00002102', + "cong;": '\U00002245', + "congdot;": '\U00002A6D', + "conint;": '\U0000222E', + "copf;": '\U0001D554', + "coprod;": '\U00002210', + "copy;": '\U000000A9', + "copysr;": '\U00002117', + "crarr;": '\U000021B5', + "cross;": '\U00002717', + "cscr;": '\U0001D4B8', + "csub;": '\U00002ACF', + "csube;": '\U00002AD1', + "csup;": '\U00002AD0', + "csupe;": '\U00002AD2', + "ctdot;": '\U000022EF', + "cudarrl;": '\U00002938', + "cudarrr;": '\U00002935', + "cuepr;": '\U000022DE', + "cuesc;": '\U000022DF', + "cularr;": '\U000021B6', + "cularrp;": '\U0000293D', + "cup;": '\U0000222A', + "cupbrcap;": '\U00002A48', + "cupcap;": '\U00002A46', + "cupcup;": '\U00002A4A', + "cupdot;": '\U0000228D', + "cupor;": '\U00002A45', + "curarr;": '\U000021B7', + "curarrm;": '\U0000293C', + "curlyeqprec;": '\U000022DE', + "curlyeqsucc;": '\U000022DF', + "curlyvee;": '\U000022CE', + "curlywedge;": '\U000022CF', + "curren;": '\U000000A4', + "curvearrowleft;": '\U000021B6', + "curvearrowright;": '\U000021B7', + "cuvee;": '\U000022CE', + "cuwed;": '\U000022CF', + "cwconint;": '\U00002232', + "cwint;": '\U00002231', + "cylcty;": '\U0000232D', + "dArr;": '\U000021D3', + "dHar;": '\U00002965', + "dagger;": '\U00002020', + "daleth;": '\U00002138', + "darr;": '\U00002193', + "dash;": '\U00002010', + "dashv;": '\U000022A3', + "dbkarow;": '\U0000290F', + "dblac;": '\U000002DD', + "dcaron;": '\U0000010F', + "dcy;": '\U00000434', + "dd;": '\U00002146', + "ddagger;": '\U00002021', + "ddarr;": '\U000021CA', + "ddotseq;": '\U00002A77', + "deg;": '\U000000B0', + "delta;": '\U000003B4', + "demptyv;": '\U000029B1', + "dfisht;": '\U0000297F', + "dfr;": '\U0001D521', + "dharl;": '\U000021C3', + "dharr;": '\U000021C2', + "diam;": '\U000022C4', + "diamond;": '\U000022C4', + "diamondsuit;": '\U00002666', + "diams;": '\U00002666', + "die;": '\U000000A8', + "digamma;": '\U000003DD', + "disin;": '\U000022F2', + "div;": '\U000000F7', + "divide;": '\U000000F7', + "divideontimes;": '\U000022C7', + "divonx;": '\U000022C7', + "djcy;": '\U00000452', + "dlcorn;": '\U0000231E', + "dlcrop;": '\U0000230D', + "dollar;": '\U00000024', + "dopf;": '\U0001D555', + "dot;": '\U000002D9', + "doteq;": '\U00002250', + "doteqdot;": '\U00002251', + "dotminus;": '\U00002238', + "dotplus;": '\U00002214', + "dotsquare;": '\U000022A1', + "doublebarwedge;": '\U00002306', + "downarrow;": '\U00002193', + "downdownarrows;": '\U000021CA', + "downharpoonleft;": '\U000021C3', + "downharpoonright;": '\U000021C2', + "drbkarow;": '\U00002910', + "drcorn;": '\U0000231F', + "drcrop;": '\U0000230C', + "dscr;": '\U0001D4B9', + "dscy;": '\U00000455', + "dsol;": '\U000029F6', + "dstrok;": '\U00000111', + "dtdot;": '\U000022F1', + "dtri;": '\U000025BF', + "dtrif;": '\U000025BE', + "duarr;": '\U000021F5', + "duhar;": '\U0000296F', + "dwangle;": '\U000029A6', + "dzcy;": '\U0000045F', + "dzigrarr;": '\U000027FF', + "eDDot;": '\U00002A77', + "eDot;": '\U00002251', + "eacute;": '\U000000E9', + "easter;": '\U00002A6E', + "ecaron;": '\U0000011B', + "ecir;": '\U00002256', + "ecirc;": '\U000000EA', + "ecolon;": '\U00002255', + "ecy;": '\U0000044D', + "edot;": '\U00000117', + "ee;": '\U00002147', + "efDot;": '\U00002252', + "efr;": '\U0001D522', + "eg;": '\U00002A9A', + "egrave;": '\U000000E8', + "egs;": '\U00002A96', + "egsdot;": '\U00002A98', + "el;": '\U00002A99', + "elinters;": '\U000023E7', + "ell;": '\U00002113', + "els;": '\U00002A95', + "elsdot;": '\U00002A97', + "emacr;": '\U00000113', + "empty;": '\U00002205', + "emptyset;": '\U00002205', + "emptyv;": '\U00002205', + "emsp;": '\U00002003', + "emsp13;": '\U00002004', + "emsp14;": '\U00002005', + "eng;": '\U0000014B', + "ensp;": '\U00002002', + "eogon;": '\U00000119', + "eopf;": '\U0001D556', + "epar;": '\U000022D5', + "eparsl;": '\U000029E3', + "eplus;": '\U00002A71', + "epsi;": '\U000003B5', + "epsilon;": '\U000003B5', + "epsiv;": '\U000003F5', + "eqcirc;": '\U00002256', + "eqcolon;": '\U00002255', + "eqsim;": '\U00002242', + "eqslantgtr;": '\U00002A96', + "eqslantless;": '\U00002A95', + "equals;": '\U0000003D', + "equest;": '\U0000225F', + "equiv;": '\U00002261', + "equivDD;": '\U00002A78', + "eqvparsl;": '\U000029E5', + "erDot;": '\U00002253', + "erarr;": '\U00002971', + "escr;": '\U0000212F', + "esdot;": '\U00002250', + "esim;": '\U00002242', + "eta;": '\U000003B7', + "eth;": '\U000000F0', + "euml;": '\U000000EB', + "euro;": '\U000020AC', + "excl;": '\U00000021', + "exist;": '\U00002203', + "expectation;": '\U00002130', + "exponentiale;": '\U00002147', + "fallingdotseq;": '\U00002252', + "fcy;": '\U00000444', + "female;": '\U00002640', + "ffilig;": '\U0000FB03', + "fflig;": '\U0000FB00', + "ffllig;": '\U0000FB04', + "ffr;": '\U0001D523', + "filig;": '\U0000FB01', + "flat;": '\U0000266D', + "fllig;": '\U0000FB02', + "fltns;": '\U000025B1', + "fnof;": '\U00000192', + "fopf;": '\U0001D557', + "forall;": '\U00002200', + "fork;": '\U000022D4', + "forkv;": '\U00002AD9', + "fpartint;": '\U00002A0D', + "frac12;": '\U000000BD', + "frac13;": '\U00002153', + "frac14;": '\U000000BC', + "frac15;": '\U00002155', + "frac16;": '\U00002159', + "frac18;": '\U0000215B', + "frac23;": '\U00002154', + "frac25;": '\U00002156', + "frac34;": '\U000000BE', + "frac35;": '\U00002157', + "frac38;": '\U0000215C', + "frac45;": '\U00002158', + "frac56;": '\U0000215A', + "frac58;": '\U0000215D', + "frac78;": '\U0000215E', + "frasl;": '\U00002044', + "frown;": '\U00002322', + "fscr;": '\U0001D4BB', + "gE;": '\U00002267', + "gEl;": '\U00002A8C', + "gacute;": '\U000001F5', + "gamma;": '\U000003B3', + "gammad;": '\U000003DD', + "gap;": '\U00002A86', + "gbreve;": '\U0000011F', + "gcirc;": '\U0000011D', + "gcy;": '\U00000433', + "gdot;": '\U00000121', + "ge;": '\U00002265', + "gel;": '\U000022DB', + "geq;": '\U00002265', + "geqq;": '\U00002267', + "geqslant;": '\U00002A7E', + "ges;": '\U00002A7E', + "gescc;": '\U00002AA9', + "gesdot;": '\U00002A80', + "gesdoto;": '\U00002A82', + "gesdotol;": '\U00002A84', + "gesles;": '\U00002A94', + "gfr;": '\U0001D524', + "gg;": '\U0000226B', + "ggg;": '\U000022D9', + "gimel;": '\U00002137', + "gjcy;": '\U00000453', + "gl;": '\U00002277', + "glE;": '\U00002A92', + "gla;": '\U00002AA5', + "glj;": '\U00002AA4', + "gnE;": '\U00002269', + "gnap;": '\U00002A8A', + "gnapprox;": '\U00002A8A', + "gne;": '\U00002A88', + "gneq;": '\U00002A88', + "gneqq;": '\U00002269', + "gnsim;": '\U000022E7', + "gopf;": '\U0001D558', + "grave;": '\U00000060', + "gscr;": '\U0000210A', + "gsim;": '\U00002273', + "gsime;": '\U00002A8E', + "gsiml;": '\U00002A90', + "gt;": '\U0000003E', + "gtcc;": '\U00002AA7', + "gtcir;": '\U00002A7A', + "gtdot;": '\U000022D7', + "gtlPar;": '\U00002995', + "gtquest;": '\U00002A7C', + "gtrapprox;": '\U00002A86', + "gtrarr;": '\U00002978', + "gtrdot;": '\U000022D7', + "gtreqless;": '\U000022DB', + "gtreqqless;": '\U00002A8C', + "gtrless;": '\U00002277', + "gtrsim;": '\U00002273', + "hArr;": '\U000021D4', + "hairsp;": '\U0000200A', + "half;": '\U000000BD', + "hamilt;": '\U0000210B', + "hardcy;": '\U0000044A', + "harr;": '\U00002194', + "harrcir;": '\U00002948', + "harrw;": '\U000021AD', + "hbar;": '\U0000210F', + "hcirc;": '\U00000125', + "hearts;": '\U00002665', + "heartsuit;": '\U00002665', + "hellip;": '\U00002026', + "hercon;": '\U000022B9', + "hfr;": '\U0001D525', + "hksearow;": '\U00002925', + "hkswarow;": '\U00002926', + "hoarr;": '\U000021FF', + "homtht;": '\U0000223B', + "hookleftarrow;": '\U000021A9', + "hookrightarrow;": '\U000021AA', + "hopf;": '\U0001D559', + "horbar;": '\U00002015', + "hscr;": '\U0001D4BD', + "hslash;": '\U0000210F', + "hstrok;": '\U00000127', + "hybull;": '\U00002043', + "hyphen;": '\U00002010', + "iacute;": '\U000000ED', + "ic;": '\U00002063', + "icirc;": '\U000000EE', + "icy;": '\U00000438', + "iecy;": '\U00000435', + "iexcl;": '\U000000A1', + "iff;": '\U000021D4', + "ifr;": '\U0001D526', + "igrave;": '\U000000EC', + "ii;": '\U00002148', + "iiiint;": '\U00002A0C', + "iiint;": '\U0000222D', + "iinfin;": '\U000029DC', + "iiota;": '\U00002129', + "ijlig;": '\U00000133', + "imacr;": '\U0000012B', + "image;": '\U00002111', + "imagline;": '\U00002110', + "imagpart;": '\U00002111', + "imath;": '\U00000131', + "imof;": '\U000022B7', + "imped;": '\U000001B5', + "in;": '\U00002208', + "incare;": '\U00002105', + "infin;": '\U0000221E', + "infintie;": '\U000029DD', + "inodot;": '\U00000131', + "int;": '\U0000222B', + "intcal;": '\U000022BA', + "integers;": '\U00002124', + "intercal;": '\U000022BA', + "intlarhk;": '\U00002A17', + "intprod;": '\U00002A3C', + "iocy;": '\U00000451', + "iogon;": '\U0000012F', + "iopf;": '\U0001D55A', + "iota;": '\U000003B9', + "iprod;": '\U00002A3C', + "iquest;": '\U000000BF', + "iscr;": '\U0001D4BE', + "isin;": '\U00002208', + "isinE;": '\U000022F9', + "isindot;": '\U000022F5', + "isins;": '\U000022F4', + "isinsv;": '\U000022F3', + "isinv;": '\U00002208', + "it;": '\U00002062', + "itilde;": '\U00000129', + "iukcy;": '\U00000456', + "iuml;": '\U000000EF', + "jcirc;": '\U00000135', + "jcy;": '\U00000439', + "jfr;": '\U0001D527', + "jmath;": '\U00000237', + "jopf;": '\U0001D55B', + "jscr;": '\U0001D4BF', + "jsercy;": '\U00000458', + "jukcy;": '\U00000454', + "kappa;": '\U000003BA', + "kappav;": '\U000003F0', + "kcedil;": '\U00000137', + "kcy;": '\U0000043A', + "kfr;": '\U0001D528', + "kgreen;": '\U00000138', + "khcy;": '\U00000445', + "kjcy;": '\U0000045C', + "kopf;": '\U0001D55C', + "kscr;": '\U0001D4C0', + "lAarr;": '\U000021DA', + "lArr;": '\U000021D0', + "lAtail;": '\U0000291B', + "lBarr;": '\U0000290E', + "lE;": '\U00002266', + "lEg;": '\U00002A8B', + "lHar;": '\U00002962', + "lacute;": '\U0000013A', + "laemptyv;": '\U000029B4', + "lagran;": '\U00002112', + "lambda;": '\U000003BB', + "lang;": '\U000027E8', + "langd;": '\U00002991', + "langle;": '\U000027E8', + "lap;": '\U00002A85', + "laquo;": '\U000000AB', + "larr;": '\U00002190', + "larrb;": '\U000021E4', + "larrbfs;": '\U0000291F', + "larrfs;": '\U0000291D', + "larrhk;": '\U000021A9', + "larrlp;": '\U000021AB', + "larrpl;": '\U00002939', + "larrsim;": '\U00002973', + "larrtl;": '\U000021A2', + "lat;": '\U00002AAB', + "latail;": '\U00002919', + "late;": '\U00002AAD', + "lbarr;": '\U0000290C', + "lbbrk;": '\U00002772', + "lbrace;": '\U0000007B', + "lbrack;": '\U0000005B', + "lbrke;": '\U0000298B', + "lbrksld;": '\U0000298F', + "lbrkslu;": '\U0000298D', + "lcaron;": '\U0000013E', + "lcedil;": '\U0000013C', + "lceil;": '\U00002308', + "lcub;": '\U0000007B', + "lcy;": '\U0000043B', + "ldca;": '\U00002936', + "ldquo;": '\U0000201C', + "ldquor;": '\U0000201E', + "ldrdhar;": '\U00002967', + "ldrushar;": '\U0000294B', + "ldsh;": '\U000021B2', + "le;": '\U00002264', + "leftarrow;": '\U00002190', + "leftarrowtail;": '\U000021A2', + "leftharpoondown;": '\U000021BD', + "leftharpoonup;": '\U000021BC', + "leftleftarrows;": '\U000021C7', + "leftrightarrow;": '\U00002194', + "leftrightarrows;": '\U000021C6', + "leftrightharpoons;": '\U000021CB', + "leftrightsquigarrow;": '\U000021AD', + "leftthreetimes;": '\U000022CB', + "leg;": '\U000022DA', + "leq;": '\U00002264', + "leqq;": '\U00002266', + "leqslant;": '\U00002A7D', + "les;": '\U00002A7D', + "lescc;": '\U00002AA8', + "lesdot;": '\U00002A7F', + "lesdoto;": '\U00002A81', + "lesdotor;": '\U00002A83', + "lesges;": '\U00002A93', + "lessapprox;": '\U00002A85', + "lessdot;": '\U000022D6', + "lesseqgtr;": '\U000022DA', + "lesseqqgtr;": '\U00002A8B', + "lessgtr;": '\U00002276', + "lesssim;": '\U00002272', + "lfisht;": '\U0000297C', + "lfloor;": '\U0000230A', + "lfr;": '\U0001D529', + "lg;": '\U00002276', + "lgE;": '\U00002A91', + "lhard;": '\U000021BD', + "lharu;": '\U000021BC', + "lharul;": '\U0000296A', + "lhblk;": '\U00002584', + "ljcy;": '\U00000459', + "ll;": '\U0000226A', + "llarr;": '\U000021C7', + "llcorner;": '\U0000231E', + "llhard;": '\U0000296B', + "lltri;": '\U000025FA', + "lmidot;": '\U00000140', + "lmoust;": '\U000023B0', + "lmoustache;": '\U000023B0', + "lnE;": '\U00002268', + "lnap;": '\U00002A89', + "lnapprox;": '\U00002A89', + "lne;": '\U00002A87', + "lneq;": '\U00002A87', + "lneqq;": '\U00002268', + "lnsim;": '\U000022E6', + "loang;": '\U000027EC', + "loarr;": '\U000021FD', + "lobrk;": '\U000027E6', + "longleftarrow;": '\U000027F5', + "longleftrightarrow;": '\U000027F7', + "longmapsto;": '\U000027FC', + "longrightarrow;": '\U000027F6', + "looparrowleft;": '\U000021AB', + "looparrowright;": '\U000021AC', + "lopar;": '\U00002985', + "lopf;": '\U0001D55D', + "loplus;": '\U00002A2D', + "lotimes;": '\U00002A34', + "lowast;": '\U00002217', + "lowbar;": '\U0000005F', + "loz;": '\U000025CA', + "lozenge;": '\U000025CA', + "lozf;": '\U000029EB', + "lpar;": '\U00000028', + "lparlt;": '\U00002993', + "lrarr;": '\U000021C6', + "lrcorner;": '\U0000231F', + "lrhar;": '\U000021CB', + "lrhard;": '\U0000296D', + "lrm;": '\U0000200E', + "lrtri;": '\U000022BF', + "lsaquo;": '\U00002039', + "lscr;": '\U0001D4C1', + "lsh;": '\U000021B0', + "lsim;": '\U00002272', + "lsime;": '\U00002A8D', + "lsimg;": '\U00002A8F', + "lsqb;": '\U0000005B', + "lsquo;": '\U00002018', + "lsquor;": '\U0000201A', + "lstrok;": '\U00000142', + "lt;": '\U0000003C', + "ltcc;": '\U00002AA6', + "ltcir;": '\U00002A79', + "ltdot;": '\U000022D6', + "lthree;": '\U000022CB', + "ltimes;": '\U000022C9', + "ltlarr;": '\U00002976', + "ltquest;": '\U00002A7B', + "ltrPar;": '\U00002996', + "ltri;": '\U000025C3', + "ltrie;": '\U000022B4', + "ltrif;": '\U000025C2', + "lurdshar;": '\U0000294A', + "luruhar;": '\U00002966', + "mDDot;": '\U0000223A', + "macr;": '\U000000AF', + "male;": '\U00002642', + "malt;": '\U00002720', + "maltese;": '\U00002720', + "map;": '\U000021A6', + "mapsto;": '\U000021A6', + "mapstodown;": '\U000021A7', + "mapstoleft;": '\U000021A4', + "mapstoup;": '\U000021A5', + "marker;": '\U000025AE', + "mcomma;": '\U00002A29', + "mcy;": '\U0000043C', + "mdash;": '\U00002014', + "measuredangle;": '\U00002221', + "mfr;": '\U0001D52A', + "mho;": '\U00002127', + "micro;": '\U000000B5', + "mid;": '\U00002223', + "midast;": '\U0000002A', + "midcir;": '\U00002AF0', + "middot;": '\U000000B7', + "minus;": '\U00002212', + "minusb;": '\U0000229F', + "minusd;": '\U00002238', + "minusdu;": '\U00002A2A', + "mlcp;": '\U00002ADB', + "mldr;": '\U00002026', + "mnplus;": '\U00002213', + "models;": '\U000022A7', + "mopf;": '\U0001D55E', + "mp;": '\U00002213', + "mscr;": '\U0001D4C2', + "mstpos;": '\U0000223E', + "mu;": '\U000003BC', + "multimap;": '\U000022B8', + "mumap;": '\U000022B8', + "nLeftarrow;": '\U000021CD', + "nLeftrightarrow;": '\U000021CE', + "nRightarrow;": '\U000021CF', + "nVDash;": '\U000022AF', + "nVdash;": '\U000022AE', + "nabla;": '\U00002207', + "nacute;": '\U00000144', + "nap;": '\U00002249', + "napos;": '\U00000149', + "napprox;": '\U00002249', + "natur;": '\U0000266E', + "natural;": '\U0000266E', + "naturals;": '\U00002115', + "nbsp;": '\U000000A0', + "ncap;": '\U00002A43', + "ncaron;": '\U00000148', + "ncedil;": '\U00000146', + "ncong;": '\U00002247', + "ncup;": '\U00002A42', + "ncy;": '\U0000043D', + "ndash;": '\U00002013', + "ne;": '\U00002260', + "neArr;": '\U000021D7', + "nearhk;": '\U00002924', + "nearr;": '\U00002197', + "nearrow;": '\U00002197', + "nequiv;": '\U00002262', + "nesear;": '\U00002928', + "nexist;": '\U00002204', + "nexists;": '\U00002204', + "nfr;": '\U0001D52B', + "nge;": '\U00002271', + "ngeq;": '\U00002271', + "ngsim;": '\U00002275', + "ngt;": '\U0000226F', + "ngtr;": '\U0000226F', + "nhArr;": '\U000021CE', + "nharr;": '\U000021AE', + "nhpar;": '\U00002AF2', + "ni;": '\U0000220B', + "nis;": '\U000022FC', + "nisd;": '\U000022FA', + "niv;": '\U0000220B', + "njcy;": '\U0000045A', + "nlArr;": '\U000021CD', + "nlarr;": '\U0000219A', + "nldr;": '\U00002025', + "nle;": '\U00002270', + "nleftarrow;": '\U0000219A', + "nleftrightarrow;": '\U000021AE', + "nleq;": '\U00002270', + "nless;": '\U0000226E', + "nlsim;": '\U00002274', + "nlt;": '\U0000226E', + "nltri;": '\U000022EA', + "nltrie;": '\U000022EC', + "nmid;": '\U00002224', + "nopf;": '\U0001D55F', + "not;": '\U000000AC', + "notin;": '\U00002209', + "notinva;": '\U00002209', + "notinvb;": '\U000022F7', + "notinvc;": '\U000022F6', + "notni;": '\U0000220C', + "notniva;": '\U0000220C', + "notnivb;": '\U000022FE', + "notnivc;": '\U000022FD', + "npar;": '\U00002226', + "nparallel;": '\U00002226', + "npolint;": '\U00002A14', + "npr;": '\U00002280', + "nprcue;": '\U000022E0', + "nprec;": '\U00002280', + "nrArr;": '\U000021CF', + "nrarr;": '\U0000219B', + "nrightarrow;": '\U0000219B', + "nrtri;": '\U000022EB', + "nrtrie;": '\U000022ED', + "nsc;": '\U00002281', + "nsccue;": '\U000022E1', + "nscr;": '\U0001D4C3', + "nshortmid;": '\U00002224', + "nshortparallel;": '\U00002226', + "nsim;": '\U00002241', + "nsime;": '\U00002244', + "nsimeq;": '\U00002244', + "nsmid;": '\U00002224', + "nspar;": '\U00002226', + "nsqsube;": '\U000022E2', + "nsqsupe;": '\U000022E3', + "nsub;": '\U00002284', + "nsube;": '\U00002288', + "nsubseteq;": '\U00002288', + "nsucc;": '\U00002281', + "nsup;": '\U00002285', + "nsupe;": '\U00002289', + "nsupseteq;": '\U00002289', + "ntgl;": '\U00002279', + "ntilde;": '\U000000F1', + "ntlg;": '\U00002278', + "ntriangleleft;": '\U000022EA', + "ntrianglelefteq;": '\U000022EC', + "ntriangleright;": '\U000022EB', + "ntrianglerighteq;": '\U000022ED', + "nu;": '\U000003BD', + "num;": '\U00000023', + "numero;": '\U00002116', + "numsp;": '\U00002007', + "nvDash;": '\U000022AD', + "nvHarr;": '\U00002904', + "nvdash;": '\U000022AC', + "nvinfin;": '\U000029DE', + "nvlArr;": '\U00002902', + "nvrArr;": '\U00002903', + "nwArr;": '\U000021D6', + "nwarhk;": '\U00002923', + "nwarr;": '\U00002196', + "nwarrow;": '\U00002196', + "nwnear;": '\U00002927', + "oS;": '\U000024C8', + "oacute;": '\U000000F3', + "oast;": '\U0000229B', + "ocir;": '\U0000229A', + "ocirc;": '\U000000F4', + "ocy;": '\U0000043E', + "odash;": '\U0000229D', + "odblac;": '\U00000151', + "odiv;": '\U00002A38', + "odot;": '\U00002299', + "odsold;": '\U000029BC', + "oelig;": '\U00000153', + "ofcir;": '\U000029BF', + "ofr;": '\U0001D52C', + "ogon;": '\U000002DB', + "ograve;": '\U000000F2', + "ogt;": '\U000029C1', + "ohbar;": '\U000029B5', + "ohm;": '\U000003A9', + "oint;": '\U0000222E', + "olarr;": '\U000021BA', + "olcir;": '\U000029BE', + "olcross;": '\U000029BB', + "oline;": '\U0000203E', + "olt;": '\U000029C0', + "omacr;": '\U0000014D', + "omega;": '\U000003C9', + "omicron;": '\U000003BF', + "omid;": '\U000029B6', + "ominus;": '\U00002296', + "oopf;": '\U0001D560', + "opar;": '\U000029B7', + "operp;": '\U000029B9', + "oplus;": '\U00002295', + "or;": '\U00002228', + "orarr;": '\U000021BB', + "ord;": '\U00002A5D', + "order;": '\U00002134', + "orderof;": '\U00002134', + "ordf;": '\U000000AA', + "ordm;": '\U000000BA', + "origof;": '\U000022B6', + "oror;": '\U00002A56', + "orslope;": '\U00002A57', + "orv;": '\U00002A5B', + "oscr;": '\U00002134', + "oslash;": '\U000000F8', + "osol;": '\U00002298', + "otilde;": '\U000000F5', + "otimes;": '\U00002297', + "otimesas;": '\U00002A36', + "ouml;": '\U000000F6', + "ovbar;": '\U0000233D', + "par;": '\U00002225', + "para;": '\U000000B6', + "parallel;": '\U00002225', + "parsim;": '\U00002AF3', + "parsl;": '\U00002AFD', + "part;": '\U00002202', + "pcy;": '\U0000043F', + "percnt;": '\U00000025', + "period;": '\U0000002E', + "permil;": '\U00002030', + "perp;": '\U000022A5', + "pertenk;": '\U00002031', + "pfr;": '\U0001D52D', + "phi;": '\U000003C6', + "phiv;": '\U000003D5', + "phmmat;": '\U00002133', + "phone;": '\U0000260E', + "pi;": '\U000003C0', + "pitchfork;": '\U000022D4', + "piv;": '\U000003D6', + "planck;": '\U0000210F', + "planckh;": '\U0000210E', + "plankv;": '\U0000210F', + "plus;": '\U0000002B', + "plusacir;": '\U00002A23', + "plusb;": '\U0000229E', + "pluscir;": '\U00002A22', + "plusdo;": '\U00002214', + "plusdu;": '\U00002A25', + "pluse;": '\U00002A72', + "plusmn;": '\U000000B1', + "plussim;": '\U00002A26', + "plustwo;": '\U00002A27', + "pm;": '\U000000B1', + "pointint;": '\U00002A15', + "popf;": '\U0001D561', + "pound;": '\U000000A3', + "pr;": '\U0000227A', + "prE;": '\U00002AB3', + "prap;": '\U00002AB7', + "prcue;": '\U0000227C', + "pre;": '\U00002AAF', + "prec;": '\U0000227A', + "precapprox;": '\U00002AB7', + "preccurlyeq;": '\U0000227C', + "preceq;": '\U00002AAF', + "precnapprox;": '\U00002AB9', + "precneqq;": '\U00002AB5', + "precnsim;": '\U000022E8', + "precsim;": '\U0000227E', + "prime;": '\U00002032', + "primes;": '\U00002119', + "prnE;": '\U00002AB5', + "prnap;": '\U00002AB9', + "prnsim;": '\U000022E8', + "prod;": '\U0000220F', + "profalar;": '\U0000232E', + "profline;": '\U00002312', + "profsurf;": '\U00002313', + "prop;": '\U0000221D', + "propto;": '\U0000221D', + "prsim;": '\U0000227E', + "prurel;": '\U000022B0', + "pscr;": '\U0001D4C5', + "psi;": '\U000003C8', + "puncsp;": '\U00002008', + "qfr;": '\U0001D52E', + "qint;": '\U00002A0C', + "qopf;": '\U0001D562', + "qprime;": '\U00002057', + "qscr;": '\U0001D4C6', + "quaternions;": '\U0000210D', + "quatint;": '\U00002A16', + "quest;": '\U0000003F', + "questeq;": '\U0000225F', + "quot;": '\U00000022', + "rAarr;": '\U000021DB', + "rArr;": '\U000021D2', + "rAtail;": '\U0000291C', + "rBarr;": '\U0000290F', + "rHar;": '\U00002964', + "racute;": '\U00000155', + "radic;": '\U0000221A', + "raemptyv;": '\U000029B3', + "rang;": '\U000027E9', + "rangd;": '\U00002992', + "range;": '\U000029A5', + "rangle;": '\U000027E9', + "raquo;": '\U000000BB', + "rarr;": '\U00002192', + "rarrap;": '\U00002975', + "rarrb;": '\U000021E5', + "rarrbfs;": '\U00002920', + "rarrc;": '\U00002933', + "rarrfs;": '\U0000291E', + "rarrhk;": '\U000021AA', + "rarrlp;": '\U000021AC', + "rarrpl;": '\U00002945', + "rarrsim;": '\U00002974', + "rarrtl;": '\U000021A3', + "rarrw;": '\U0000219D', + "ratail;": '\U0000291A', + "ratio;": '\U00002236', + "rationals;": '\U0000211A', + "rbarr;": '\U0000290D', + "rbbrk;": '\U00002773', + "rbrace;": '\U0000007D', + "rbrack;": '\U0000005D', + "rbrke;": '\U0000298C', + "rbrksld;": '\U0000298E', + "rbrkslu;": '\U00002990', + "rcaron;": '\U00000159', + "rcedil;": '\U00000157', + "rceil;": '\U00002309', + "rcub;": '\U0000007D', + "rcy;": '\U00000440', + "rdca;": '\U00002937', + "rdldhar;": '\U00002969', + "rdquo;": '\U0000201D', + "rdquor;": '\U0000201D', + "rdsh;": '\U000021B3', + "real;": '\U0000211C', + "realine;": '\U0000211B', + "realpart;": '\U0000211C', + "reals;": '\U0000211D', + "rect;": '\U000025AD', + "reg;": '\U000000AE', + "rfisht;": '\U0000297D', + "rfloor;": '\U0000230B', + "rfr;": '\U0001D52F', + "rhard;": '\U000021C1', + "rharu;": '\U000021C0', + "rharul;": '\U0000296C', + "rho;": '\U000003C1', + "rhov;": '\U000003F1', + "rightarrow;": '\U00002192', + "rightarrowtail;": '\U000021A3', + "rightharpoondown;": '\U000021C1', + "rightharpoonup;": '\U000021C0', + "rightleftarrows;": '\U000021C4', + "rightleftharpoons;": '\U000021CC', + "rightrightarrows;": '\U000021C9', + "rightsquigarrow;": '\U0000219D', + "rightthreetimes;": '\U000022CC', + "ring;": '\U000002DA', + "risingdotseq;": '\U00002253', + "rlarr;": '\U000021C4', + "rlhar;": '\U000021CC', + "rlm;": '\U0000200F', + "rmoust;": '\U000023B1', + "rmoustache;": '\U000023B1', + "rnmid;": '\U00002AEE', + "roang;": '\U000027ED', + "roarr;": '\U000021FE', + "robrk;": '\U000027E7', + "ropar;": '\U00002986', + "ropf;": '\U0001D563', + "roplus;": '\U00002A2E', + "rotimes;": '\U00002A35', + "rpar;": '\U00000029', + "rpargt;": '\U00002994', + "rppolint;": '\U00002A12', + "rrarr;": '\U000021C9', + "rsaquo;": '\U0000203A', + "rscr;": '\U0001D4C7', + "rsh;": '\U000021B1', + "rsqb;": '\U0000005D', + "rsquo;": '\U00002019', + "rsquor;": '\U00002019', + "rthree;": '\U000022CC', + "rtimes;": '\U000022CA', + "rtri;": '\U000025B9', + "rtrie;": '\U000022B5', + "rtrif;": '\U000025B8', + "rtriltri;": '\U000029CE', + "ruluhar;": '\U00002968', + "rx;": '\U0000211E', + "sacute;": '\U0000015B', + "sbquo;": '\U0000201A', + "sc;": '\U0000227B', + "scE;": '\U00002AB4', + "scap;": '\U00002AB8', + "scaron;": '\U00000161', + "sccue;": '\U0000227D', + "sce;": '\U00002AB0', + "scedil;": '\U0000015F', + "scirc;": '\U0000015D', + "scnE;": '\U00002AB6', + "scnap;": '\U00002ABA', + "scnsim;": '\U000022E9', + "scpolint;": '\U00002A13', + "scsim;": '\U0000227F', + "scy;": '\U00000441', + "sdot;": '\U000022C5', + "sdotb;": '\U000022A1', + "sdote;": '\U00002A66', + "seArr;": '\U000021D8', + "searhk;": '\U00002925', + "searr;": '\U00002198', + "searrow;": '\U00002198', + "sect;": '\U000000A7', + "semi;": '\U0000003B', + "seswar;": '\U00002929', + "setminus;": '\U00002216', + "setmn;": '\U00002216', + "sext;": '\U00002736', + "sfr;": '\U0001D530', + "sfrown;": '\U00002322', + "sharp;": '\U0000266F', + "shchcy;": '\U00000449', + "shcy;": '\U00000448', + "shortmid;": '\U00002223', + "shortparallel;": '\U00002225', + "shy;": '\U000000AD', + "sigma;": '\U000003C3', + "sigmaf;": '\U000003C2', + "sigmav;": '\U000003C2', + "sim;": '\U0000223C', + "simdot;": '\U00002A6A', + "sime;": '\U00002243', + "simeq;": '\U00002243', + "simg;": '\U00002A9E', + "simgE;": '\U00002AA0', + "siml;": '\U00002A9D', + "simlE;": '\U00002A9F', + "simne;": '\U00002246', + "simplus;": '\U00002A24', + "simrarr;": '\U00002972', + "slarr;": '\U00002190', + "smallsetminus;": '\U00002216', + "smashp;": '\U00002A33', + "smeparsl;": '\U000029E4', + "smid;": '\U00002223', + "smile;": '\U00002323', + "smt;": '\U00002AAA', + "smte;": '\U00002AAC', + "softcy;": '\U0000044C', + "sol;": '\U0000002F', + "solb;": '\U000029C4', + "solbar;": '\U0000233F', + "sopf;": '\U0001D564', + "spades;": '\U00002660', + "spadesuit;": '\U00002660', + "spar;": '\U00002225', + "sqcap;": '\U00002293', + "sqcup;": '\U00002294', + "sqsub;": '\U0000228F', + "sqsube;": '\U00002291', + "sqsubset;": '\U0000228F', + "sqsubseteq;": '\U00002291', + "sqsup;": '\U00002290', + "sqsupe;": '\U00002292', + "sqsupset;": '\U00002290', + "sqsupseteq;": '\U00002292', + "squ;": '\U000025A1', + "square;": '\U000025A1', + "squarf;": '\U000025AA', + "squf;": '\U000025AA', + "srarr;": '\U00002192', + "sscr;": '\U0001D4C8', + "ssetmn;": '\U00002216', + "ssmile;": '\U00002323', + "sstarf;": '\U000022C6', + "star;": '\U00002606', + "starf;": '\U00002605', + "straightepsilon;": '\U000003F5', + "straightphi;": '\U000003D5', + "strns;": '\U000000AF', + "sub;": '\U00002282', + "subE;": '\U00002AC5', + "subdot;": '\U00002ABD', + "sube;": '\U00002286', + "subedot;": '\U00002AC3', + "submult;": '\U00002AC1', + "subnE;": '\U00002ACB', + "subne;": '\U0000228A', + "subplus;": '\U00002ABF', + "subrarr;": '\U00002979', + "subset;": '\U00002282', + "subseteq;": '\U00002286', + "subseteqq;": '\U00002AC5', + "subsetneq;": '\U0000228A', + "subsetneqq;": '\U00002ACB', + "subsim;": '\U00002AC7', + "subsub;": '\U00002AD5', + "subsup;": '\U00002AD3', + "succ;": '\U0000227B', + "succapprox;": '\U00002AB8', + "succcurlyeq;": '\U0000227D', + "succeq;": '\U00002AB0', + "succnapprox;": '\U00002ABA', + "succneqq;": '\U00002AB6', + "succnsim;": '\U000022E9', + "succsim;": '\U0000227F', + "sum;": '\U00002211', + "sung;": '\U0000266A', + "sup;": '\U00002283', + "sup1;": '\U000000B9', + "sup2;": '\U000000B2', + "sup3;": '\U000000B3', + "supE;": '\U00002AC6', + "supdot;": '\U00002ABE', + "supdsub;": '\U00002AD8', + "supe;": '\U00002287', + "supedot;": '\U00002AC4', + "suphsol;": '\U000027C9', + "suphsub;": '\U00002AD7', + "suplarr;": '\U0000297B', + "supmult;": '\U00002AC2', + "supnE;": '\U00002ACC', + "supne;": '\U0000228B', + "supplus;": '\U00002AC0', + "supset;": '\U00002283', + "supseteq;": '\U00002287', + "supseteqq;": '\U00002AC6', + "supsetneq;": '\U0000228B', + "supsetneqq;": '\U00002ACC', + "supsim;": '\U00002AC8', + "supsub;": '\U00002AD4', + "supsup;": '\U00002AD6', + "swArr;": '\U000021D9', + "swarhk;": '\U00002926', + "swarr;": '\U00002199', + "swarrow;": '\U00002199', + "swnwar;": '\U0000292A', + "szlig;": '\U000000DF', + "target;": '\U00002316', + "tau;": '\U000003C4', + "tbrk;": '\U000023B4', + "tcaron;": '\U00000165', + "tcedil;": '\U00000163', + "tcy;": '\U00000442', + "tdot;": '\U000020DB', + "telrec;": '\U00002315', + "tfr;": '\U0001D531', + "there4;": '\U00002234', + "therefore;": '\U00002234', + "theta;": '\U000003B8', + "thetasym;": '\U000003D1', + "thetav;": '\U000003D1', + "thickapprox;": '\U00002248', + "thicksim;": '\U0000223C', + "thinsp;": '\U00002009', + "thkap;": '\U00002248', + "thksim;": '\U0000223C', + "thorn;": '\U000000FE', + "tilde;": '\U000002DC', + "times;": '\U000000D7', + "timesb;": '\U000022A0', + "timesbar;": '\U00002A31', + "timesd;": '\U00002A30', + "tint;": '\U0000222D', + "toea;": '\U00002928', + "top;": '\U000022A4', + "topbot;": '\U00002336', + "topcir;": '\U00002AF1', + "topf;": '\U0001D565', + "topfork;": '\U00002ADA', + "tosa;": '\U00002929', + "tprime;": '\U00002034', + "trade;": '\U00002122', + "triangle;": '\U000025B5', + "triangledown;": '\U000025BF', + "triangleleft;": '\U000025C3', + "trianglelefteq;": '\U000022B4', + "triangleq;": '\U0000225C', + "triangleright;": '\U000025B9', + "trianglerighteq;": '\U000022B5', + "tridot;": '\U000025EC', + "trie;": '\U0000225C', + "triminus;": '\U00002A3A', + "triplus;": '\U00002A39', + "trisb;": '\U000029CD', + "tritime;": '\U00002A3B', + "trpezium;": '\U000023E2', + "tscr;": '\U0001D4C9', + "tscy;": '\U00000446', + "tshcy;": '\U0000045B', + "tstrok;": '\U00000167', + "twixt;": '\U0000226C', + "twoheadleftarrow;": '\U0000219E', + "twoheadrightarrow;": '\U000021A0', + "uArr;": '\U000021D1', + "uHar;": '\U00002963', + "uacute;": '\U000000FA', + "uarr;": '\U00002191', + "ubrcy;": '\U0000045E', + "ubreve;": '\U0000016D', + "ucirc;": '\U000000FB', + "ucy;": '\U00000443', + "udarr;": '\U000021C5', + "udblac;": '\U00000171', + "udhar;": '\U0000296E', + "ufisht;": '\U0000297E', + "ufr;": '\U0001D532', + "ugrave;": '\U000000F9', + "uharl;": '\U000021BF', + "uharr;": '\U000021BE', + "uhblk;": '\U00002580', + "ulcorn;": '\U0000231C', + "ulcorner;": '\U0000231C', + "ulcrop;": '\U0000230F', + "ultri;": '\U000025F8', + "umacr;": '\U0000016B', + "uml;": '\U000000A8', + "uogon;": '\U00000173', + "uopf;": '\U0001D566', + "uparrow;": '\U00002191', + "updownarrow;": '\U00002195', + "upharpoonleft;": '\U000021BF', + "upharpoonright;": '\U000021BE', + "uplus;": '\U0000228E', + "upsi;": '\U000003C5', + "upsih;": '\U000003D2', + "upsilon;": '\U000003C5', + "upuparrows;": '\U000021C8', + "urcorn;": '\U0000231D', + "urcorner;": '\U0000231D', + "urcrop;": '\U0000230E', + "uring;": '\U0000016F', + "urtri;": '\U000025F9', + "uscr;": '\U0001D4CA', + "utdot;": '\U000022F0', + "utilde;": '\U00000169', + "utri;": '\U000025B5', + "utrif;": '\U000025B4', + "uuarr;": '\U000021C8', + "uuml;": '\U000000FC', + "uwangle;": '\U000029A7', + "vArr;": '\U000021D5', + "vBar;": '\U00002AE8', + "vBarv;": '\U00002AE9', + "vDash;": '\U000022A8', + "vangrt;": '\U0000299C', + "varepsilon;": '\U000003F5', + "varkappa;": '\U000003F0', + "varnothing;": '\U00002205', + "varphi;": '\U000003D5', + "varpi;": '\U000003D6', + "varpropto;": '\U0000221D', + "varr;": '\U00002195', + "varrho;": '\U000003F1', + "varsigma;": '\U000003C2', + "vartheta;": '\U000003D1', + "vartriangleleft;": '\U000022B2', + "vartriangleright;": '\U000022B3', + "vcy;": '\U00000432', + "vdash;": '\U000022A2', + "vee;": '\U00002228', + "veebar;": '\U000022BB', + "veeeq;": '\U0000225A', + "vellip;": '\U000022EE', + "verbar;": '\U0000007C', + "vert;": '\U0000007C', + "vfr;": '\U0001D533', + "vltri;": '\U000022B2', + "vopf;": '\U0001D567', + "vprop;": '\U0000221D', + "vrtri;": '\U000022B3', + "vscr;": '\U0001D4CB', + "vzigzag;": '\U0000299A', + "wcirc;": '\U00000175', + "wedbar;": '\U00002A5F', + "wedge;": '\U00002227', + "wedgeq;": '\U00002259', + "weierp;": '\U00002118', + "wfr;": '\U0001D534', + "wopf;": '\U0001D568', + "wp;": '\U00002118', + "wr;": '\U00002240', + "wreath;": '\U00002240', + "wscr;": '\U0001D4CC', + "xcap;": '\U000022C2', + "xcirc;": '\U000025EF', + "xcup;": '\U000022C3', + "xdtri;": '\U000025BD', + "xfr;": '\U0001D535', + "xhArr;": '\U000027FA', + "xharr;": '\U000027F7', + "xi;": '\U000003BE', + "xlArr;": '\U000027F8', + "xlarr;": '\U000027F5', + "xmap;": '\U000027FC', + "xnis;": '\U000022FB', + "xodot;": '\U00002A00', + "xopf;": '\U0001D569', + "xoplus;": '\U00002A01', + "xotime;": '\U00002A02', + "xrArr;": '\U000027F9', + "xrarr;": '\U000027F6', + "xscr;": '\U0001D4CD', + "xsqcup;": '\U00002A06', + "xuplus;": '\U00002A04', + "xutri;": '\U000025B3', + "xvee;": '\U000022C1', + "xwedge;": '\U000022C0', + "yacute;": '\U000000FD', + "yacy;": '\U0000044F', + "ycirc;": '\U00000177', + "ycy;": '\U0000044B', + "yen;": '\U000000A5', + "yfr;": '\U0001D536', + "yicy;": '\U00000457', + "yopf;": '\U0001D56A', + "yscr;": '\U0001D4CE', + "yucy;": '\U0000044E', + "yuml;": '\U000000FF', + "zacute;": '\U0000017A', + "zcaron;": '\U0000017E', + "zcy;": '\U00000437', + "zdot;": '\U0000017C', + "zeetrf;": '\U00002128', + "zeta;": '\U000003B6', + "zfr;": '\U0001D537', + "zhcy;": '\U00000436', + "zigrarr;": '\U000021DD', + "zopf;": '\U0001D56B', + "zscr;": '\U0001D4CF', + "zwj;": '\U0000200D', + "zwnj;": '\U0000200C', + "AElig": '\U000000C6', + "AMP": '\U00000026', + "Aacute": '\U000000C1', + "Acirc": '\U000000C2', + "Agrave": '\U000000C0', + "Aring": '\U000000C5', + "Atilde": '\U000000C3', + "Auml": '\U000000C4', + "COPY": '\U000000A9', + "Ccedil": '\U000000C7', + "ETH": '\U000000D0', + "Eacute": '\U000000C9', + "Ecirc": '\U000000CA', + "Egrave": '\U000000C8', + "Euml": '\U000000CB', + "GT": '\U0000003E', + "Iacute": '\U000000CD', + "Icirc": '\U000000CE', + "Igrave": '\U000000CC', + "Iuml": '\U000000CF', + "LT": '\U0000003C', + "Ntilde": '\U000000D1', + "Oacute": '\U000000D3', + "Ocirc": '\U000000D4', + "Ograve": '\U000000D2', + "Oslash": '\U000000D8', + "Otilde": '\U000000D5', + "Ouml": '\U000000D6', + "QUOT": '\U00000022', + "REG": '\U000000AE', + "THORN": '\U000000DE', + "Uacute": '\U000000DA', + "Ucirc": '\U000000DB', + "Ugrave": '\U000000D9', + "Uuml": '\U000000DC', + "Yacute": '\U000000DD', + "aacute": '\U000000E1', + "acirc": '\U000000E2', + "acute": '\U000000B4', + "aelig": '\U000000E6', + "agrave": '\U000000E0', + "amp": '\U00000026', + "aring": '\U000000E5', + "atilde": '\U000000E3', + "auml": '\U000000E4', + "brvbar": '\U000000A6', + "ccedil": '\U000000E7', + "cedil": '\U000000B8', + "cent": '\U000000A2', + "copy": '\U000000A9', + "curren": '\U000000A4', + "deg": '\U000000B0', + "divide": '\U000000F7', + "eacute": '\U000000E9', + "ecirc": '\U000000EA', + "egrave": '\U000000E8', + "eth": '\U000000F0', + "euml": '\U000000EB', + "frac12": '\U000000BD', + "frac14": '\U000000BC', + "frac34": '\U000000BE', + "gt": '\U0000003E', + "iacute": '\U000000ED', + "icirc": '\U000000EE', + "iexcl": '\U000000A1', + "igrave": '\U000000EC', + "iquest": '\U000000BF', + "iuml": '\U000000EF', + "laquo": '\U000000AB', + "lt": '\U0000003C', + "macr": '\U000000AF', + "micro": '\U000000B5', + "middot": '\U000000B7', + "nbsp": '\U000000A0', + "not": '\U000000AC', + "ntilde": '\U000000F1', + "oacute": '\U000000F3', + "ocirc": '\U000000F4', + "ograve": '\U000000F2', + "ordf": '\U000000AA', + "ordm": '\U000000BA', + "oslash": '\U000000F8', + "otilde": '\U000000F5', + "ouml": '\U000000F6', + "para": '\U000000B6', + "plusmn": '\U000000B1', + "pound": '\U000000A3', + "quot": '\U00000022', + "raquo": '\U000000BB', + "reg": '\U000000AE', + "sect": '\U000000A7', + "shy": '\U000000AD', + "sup1": '\U000000B9', + "sup2": '\U000000B2', + "sup3": '\U000000B3', + "szlig": '\U000000DF', + "thorn": '\U000000FE', + "times": '\U000000D7', + "uacute": '\U000000FA', + "ucirc": '\U000000FB', + "ugrave": '\U000000F9', + "uml": '\U000000A8', + "uuml": '\U000000FC', + "yacute": '\U000000FD', + "yen": '\U000000A5', + "yuml": '\U000000FF', +} + +// HTML entities that are two unicode codepoints. +var entity2 = map[string][2]rune{ + // TODO(nigeltao): Handle replacements that are wider than their names. + // "nLt;": {'\u226A', '\u20D2'}, + // "nGt;": {'\u226B', '\u20D2'}, + "NotEqualTilde;": {'\u2242', '\u0338'}, + "NotGreaterFullEqual;": {'\u2267', '\u0338'}, + "NotGreaterGreater;": {'\u226B', '\u0338'}, + "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, + "NotHumpDownHump;": {'\u224E', '\u0338'}, + "NotHumpEqual;": {'\u224F', '\u0338'}, + "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, + "NotLessLess;": {'\u226A', '\u0338'}, + "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, + "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, + "NotNestedLessLess;": {'\u2AA1', '\u0338'}, + "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, + "NotRightTriangleBar;": {'\u29D0', '\u0338'}, + "NotSquareSubset;": {'\u228F', '\u0338'}, + "NotSquareSuperset;": {'\u2290', '\u0338'}, + "NotSubset;": {'\u2282', '\u20D2'}, + "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, + "NotSucceedsTilde;": {'\u227F', '\u0338'}, + "NotSuperset;": {'\u2283', '\u20D2'}, + "ThickSpace;": {'\u205F', '\u200A'}, + "acE;": {'\u223E', '\u0333'}, + "bne;": {'\u003D', '\u20E5'}, + "bnequiv;": {'\u2261', '\u20E5'}, + "caps;": {'\u2229', '\uFE00'}, + "cups;": {'\u222A', '\uFE00'}, + "fjlig;": {'\u0066', '\u006A'}, + "gesl;": {'\u22DB', '\uFE00'}, + "gvertneqq;": {'\u2269', '\uFE00'}, + "gvnE;": {'\u2269', '\uFE00'}, + "lates;": {'\u2AAD', '\uFE00'}, + "lesg;": {'\u22DA', '\uFE00'}, + "lvertneqq;": {'\u2268', '\uFE00'}, + "lvnE;": {'\u2268', '\uFE00'}, + "nGg;": {'\u22D9', '\u0338'}, + "nGtv;": {'\u226B', '\u0338'}, + "nLl;": {'\u22D8', '\u0338'}, + "nLtv;": {'\u226A', '\u0338'}, + "nang;": {'\u2220', '\u20D2'}, + "napE;": {'\u2A70', '\u0338'}, + "napid;": {'\u224B', '\u0338'}, + "nbump;": {'\u224E', '\u0338'}, + "nbumpe;": {'\u224F', '\u0338'}, + "ncongdot;": {'\u2A6D', '\u0338'}, + "nedot;": {'\u2250', '\u0338'}, + "nesim;": {'\u2242', '\u0338'}, + "ngE;": {'\u2267', '\u0338'}, + "ngeqq;": {'\u2267', '\u0338'}, + "ngeqslant;": {'\u2A7E', '\u0338'}, + "nges;": {'\u2A7E', '\u0338'}, + "nlE;": {'\u2266', '\u0338'}, + "nleqq;": {'\u2266', '\u0338'}, + "nleqslant;": {'\u2A7D', '\u0338'}, + "nles;": {'\u2A7D', '\u0338'}, + "notinE;": {'\u22F9', '\u0338'}, + "notindot;": {'\u22F5', '\u0338'}, + "nparsl;": {'\u2AFD', '\u20E5'}, + "npart;": {'\u2202', '\u0338'}, + "npre;": {'\u2AAF', '\u0338'}, + "npreceq;": {'\u2AAF', '\u0338'}, + "nrarrc;": {'\u2933', '\u0338'}, + "nrarrw;": {'\u219D', '\u0338'}, + "nsce;": {'\u2AB0', '\u0338'}, + "nsubE;": {'\u2AC5', '\u0338'}, + "nsubset;": {'\u2282', '\u20D2'}, + "nsubseteqq;": {'\u2AC5', '\u0338'}, + "nsucceq;": {'\u2AB0', '\u0338'}, + "nsupE;": {'\u2AC6', '\u0338'}, + "nsupset;": {'\u2283', '\u20D2'}, + "nsupseteqq;": {'\u2AC6', '\u0338'}, + "nvap;": {'\u224D', '\u20D2'}, + "nvge;": {'\u2265', '\u20D2'}, + "nvgt;": {'\u003E', '\u20D2'}, + "nvle;": {'\u2264', '\u20D2'}, + "nvlt;": {'\u003C', '\u20D2'}, + "nvltrie;": {'\u22B4', '\u20D2'}, + "nvrtrie;": {'\u22B5', '\u20D2'}, + "nvsim;": {'\u223C', '\u20D2'}, + "race;": {'\u223D', '\u0331'}, + "smtes;": {'\u2AAC', '\uFE00'}, + "sqcaps;": {'\u2293', '\uFE00'}, + "sqcups;": {'\u2294', '\uFE00'}, + "varsubsetneq;": {'\u228A', '\uFE00'}, + "varsubsetneqq;": {'\u2ACB', '\uFE00'}, + "varsupsetneq;": {'\u228B', '\uFE00'}, + "varsupsetneqq;": {'\u2ACC', '\uFE00'}, + "vnsub;": {'\u2282', '\u20D2'}, + "vnsup;": {'\u2283', '\u20D2'}, + "vsubnE;": {'\u2ACB', '\uFE00'}, + "vsubne;": {'\u228A', '\uFE00'}, + "vsupnE;": {'\u2ACC', '\uFE00'}, + "vsupne;": {'\u228B', '\uFE00'}, +} diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go new file mode 100644 index 0000000000..04c6bec210 --- /dev/null +++ b/vendor/golang.org/x/net/html/escape.go @@ -0,0 +1,339 @@ +// Copyright 2010 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 html + +import ( + "bytes" + "strings" + "unicode/utf8" +) + +// These replacements permit compatibility with old numeric entities that +// assumed Windows-1252 encoding. +// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference +var replacementTable = [...]rune{ + '\u20AC', // First entry is what 0x80 should be replaced with. + '\u0081', + '\u201A', + '\u0192', + '\u201E', + '\u2026', + '\u2020', + '\u2021', + '\u02C6', + '\u2030', + '\u0160', + '\u2039', + '\u0152', + '\u008D', + '\u017D', + '\u008F', + '\u0090', + '\u2018', + '\u2019', + '\u201C', + '\u201D', + '\u2022', + '\u2013', + '\u2014', + '\u02DC', + '\u2122', + '\u0161', + '\u203A', + '\u0153', + '\u009D', + '\u017E', + '\u0178', // Last entry is 0x9F. + // 0x00->'\uFFFD' is handled programmatically. + // 0x0D->'\u000D' is a no-op. +} + +// unescapeEntity reads an entity like "<" from b[src:] and writes the +// corresponding "<" to b[dst:], returning the incremented dst and src cursors. +// Precondition: b[src] == '&' && dst <= src. +// attribute should be true if parsing an attribute value. +func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { + // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference + + // i starts at 1 because we already know that s[0] == '&'. + i, s := 1, b[src:] + + if len(s) <= 1 { + b[dst] = b[src] + return dst + 1, src + 1 + } + + if s[i] == '#' { + if len(s) <= 3 { // We need to have at least "&#.". + b[dst] = b[src] + return dst + 1, src + 1 + } + i++ + c := s[i] + hex := false + if c == 'x' || c == 'X' { + hex = true + i++ + } + + x := '\x00' + for i < len(s) { + c = s[i] + i++ + if hex { + if '0' <= c && c <= '9' { + x = 16*x + rune(c) - '0' + continue + } else if 'a' <= c && c <= 'f' { + x = 16*x + rune(c) - 'a' + 10 + continue + } else if 'A' <= c && c <= 'F' { + x = 16*x + rune(c) - 'A' + 10 + continue + } + } else if '0' <= c && c <= '9' { + x = 10*x + rune(c) - '0' + continue + } + if c != ';' { + i-- + } + break + } + + if i <= 3 { // No characters matched. + b[dst] = b[src] + return dst + 1, src + 1 + } + + if 0x80 <= x && x <= 0x9F { + // Replace characters from Windows-1252 with UTF-8 equivalents. + x = replacementTable[x-0x80] + } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { + // Replace invalid characters with the replacement character. + x = '\uFFFD' + } + + return dst + utf8.EncodeRune(b[dst:], x), src + i + } + + // Consume the maximum number of characters possible, with the + // consumed characters matching one of the named references. + + for i < len(s) { + c := s[i] + i++ + // Lower-cased characters are more common in entities, so we check for them first. + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + continue + } + if c != ';' { + i-- + } + break + } + + entityName := string(s[1:i]) + if entityName == "" { + // No-op. + } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { + // No-op. + } else if x := entity[entityName]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + i + } else if x := entity2[entityName]; x[0] != 0 { + dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) + return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i + } else if !attribute { + maxLen := len(entityName) - 1 + if maxLen > longestEntityWithoutSemicolon { + maxLen = longestEntityWithoutSemicolon + } + for j := maxLen; j > 1; j-- { + if x := entity[entityName[:j]]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 + } + } + } + + dst1, src1 = dst+i, src+i + copy(b[dst:dst1], b[src:src1]) + return dst1, src1 +} + +// unescape unescapes b's entities in-place, so that "a<b" becomes "a' byte that, per above, we'd like to avoid escaping unless we have to. +// +// Studying the summary table (and T actions in its '>' column) closely, we +// only need to escape in states 43, 44, 49, 51 and 52. State 43 is at the +// start of the comment data. State 52 is after a '!'. The other three states +// are after a '-'. +// +// Our algorithm is thus to escape every '&' and to escape '>' if and only if: +// - The '>' is after a '!' or '-' (in the unescaped data) or +// - The '>' is at the start of the comment data (after the opening ""); err != nil { + return err + } + return nil + case DoctypeNode: + if _, err := w.WriteString("') + case RawNode: + _, err := w.WriteString(n.Data) + return err + default: + return errors.New("html: unknown node type") + } + + // Render the opening tag. + if err := w.WriteByte('<'); err != nil { + return err + } + if _, err := w.WriteString(n.Data); err != nil { + return err + } + for _, a := range n.Attr { + if err := w.WriteByte(' '); err != nil { + return err + } + if a.Namespace != "" { + if _, err := w.WriteString(a.Namespace); err != nil { + return err + } + if err := w.WriteByte(':'); err != nil { + return err + } + } + if _, err := w.WriteString(a.Key); err != nil { + return err + } + if _, err := w.WriteString(`="`); err != nil { + return err + } + if err := escape(w, a.Val); err != nil { + return err + } + if err := w.WriteByte('"'); err != nil { + return err + } + } + if voidElements[n.Data] { + if n.FirstChild != nil { + return fmt.Errorf("html: void element <%s> has child nodes", n.Data) + } + _, err := w.WriteString("/>") + return err + } + if err := w.WriteByte('>'); err != nil { + return err + } + + // Add initial newline where there is danger of a newline beging ignored. + if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") { + switch n.Data { + case "pre", "listing", "textarea": + if err := w.WriteByte('\n'); err != nil { + return err + } + } + } + + // Render any child nodes. + switch n.Data { + case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": + for c := n.FirstChild; c != nil; c = c.NextSibling { + if c.Type == TextNode { + if _, err := w.WriteString(c.Data); err != nil { + return err + } + } else { + if err := render1(w, c); err != nil { + return err + } + } + } + if n.Data == "plaintext" { + // Don't render anything else. must be the + // last element in the file, with no closing tag. + return plaintextAbort + } + default: + for c := n.FirstChild; c != nil; c = c.NextSibling { + if err := render1(w, c); err != nil { + return err + } + } + } + + // Render the </xxx> closing tag. + if _, err := w.WriteString("</"); err != nil { + return err + } + if _, err := w.WriteString(n.Data); err != nil { + return err + } + return w.WriteByte('>') +} + +// writeQuoted writes s to w surrounded by quotes. Normally it will use double +// quotes, but if s contains a double quote, it will use single quotes. +// It is used for writing the identifiers in a doctype declaration. +// In valid HTML, they can't contain both types of quotes. +func writeQuoted(w writer, s string) error { + var q byte = '"' + if strings.Contains(s, `"`) { + q = '\'' + } + if err := w.WriteByte(q); err != nil { + return err + } + if _, err := w.WriteString(s); err != nil { + return err + } + if err := w.WriteByte(q); err != nil { + return err + } + return nil +} + +// Section 12.1.2, "Elements", gives this list of void elements. Void elements +// are those that can't have any contents. +var voidElements = map[string]bool{ + "area": true, + "base": true, + "br": true, + "col": true, + "embed": true, + "hr": true, + "img": true, + "input": true, + "keygen": true, // "keygen" has been removed from the spec, but are kept here for backwards compatibility. + "link": true, + "meta": true, + "param": true, + "source": true, + "track": true, + "wbr": true, +} diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go new file mode 100644 index 0000000000..de67f938a1 --- /dev/null +++ b/vendor/golang.org/x/net/html/token.go @@ -0,0 +1,1268 @@ +// Copyright 2010 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 html + +import ( + "bytes" + "errors" + "io" + "strconv" + "strings" + + "golang.org/x/net/html/atom" +) + +// A TokenType is the type of a Token. +type TokenType uint32 + +const ( + // ErrorToken means that an error occurred during tokenization. + ErrorToken TokenType = iota + // TextToken means a text node. + TextToken + // A StartTagToken looks like <a>. + StartTagToken + // An EndTagToken looks like </a>. + EndTagToken + // A SelfClosingTagToken tag looks like <br/>. + SelfClosingTagToken + // A CommentToken looks like <!--x-->. + CommentToken + // A DoctypeToken looks like <!DOCTYPE x> + DoctypeToken +) + +// ErrBufferExceeded means that the buffering limit was exceeded. +var ErrBufferExceeded = errors.New("max buffer exceeded") + +// String returns a string representation of the TokenType. +func (t TokenType) String() string { + switch t { + case ErrorToken: + return "Error" + case TextToken: + return "Text" + case StartTagToken: + return "StartTag" + case EndTagToken: + return "EndTag" + case SelfClosingTagToken: + return "SelfClosingTag" + case CommentToken: + return "Comment" + case DoctypeToken: + return "Doctype" + } + return "Invalid(" + strconv.Itoa(int(t)) + ")" +} + +// An Attribute is an attribute namespace-key-value triple. Namespace is +// non-empty for foreign attributes like xlink, Key is alphabetic (and hence +// does not contain escapable characters like '&', '<' or '>'), and Val is +// unescaped (it looks like "a<b" rather than "a&lt;b"). +// +// Namespace is only used by the parser, not the tokenizer. +type Attribute struct { + Namespace, Key, Val string +} + +// A Token consists of a TokenType and some Data (tag name for start and end +// tags, content for text, comments and doctypes). A tag Token may also contain +// a slice of Attributes. Data is unescaped for all Tokens (it looks like "a<b" +// rather than "a&lt;b"). For tag Tokens, DataAtom is the atom for Data, or +// zero if Data is not a known tag name. +type Token struct { + Type TokenType + DataAtom atom.Atom + Data string + Attr []Attribute +} + +// tagString returns a string representation of a tag Token's Data and Attr. +func (t Token) tagString() string { + if len(t.Attr) == 0 { + return t.Data + } + buf := bytes.NewBufferString(t.Data) + for _, a := range t.Attr { + buf.WriteByte(' ') + buf.WriteString(a.Key) + buf.WriteString(`="`) + escape(buf, a.Val) + buf.WriteByte('"') + } + return buf.String() +} + +// String returns a string representation of the Token. +func (t Token) String() string { + switch t.Type { + case ErrorToken: + return "" + case TextToken: + return EscapeString(t.Data) + case StartTagToken: + return "<" + t.tagString() + ">" + case EndTagToken: + return "</" + t.tagString() + ">" + case SelfClosingTagToken: + return "<" + t.tagString() + "/>" + case CommentToken: + return "<!--" + escapeCommentString(t.Data) + "-->" + case DoctypeToken: + return "<!DOCTYPE " + EscapeString(t.Data) + ">" + } + return "Invalid(" + strconv.Itoa(int(t.Type)) + ")" +} + +// span is a range of bytes in a Tokenizer's buffer. The start is inclusive, +// the end is exclusive. +type span struct { + start, end int +} + +// A Tokenizer returns a stream of HTML Tokens. +type Tokenizer struct { + // r is the source of the HTML text. + r io.Reader + // tt is the TokenType of the current token. + tt TokenType + // err is the first error encountered during tokenization. It is possible + // for tt != Error && err != nil to hold: this means that Next returned a + // valid token but the subsequent Next call will return an error token. + // For example, if the HTML text input was just "plain", then the first + // Next call would set z.err to io.EOF but return a TextToken, and all + // subsequent Next calls would return an ErrorToken. + // err is never reset. Once it becomes non-nil, it stays non-nil. + err error + // readErr is the error returned by the io.Reader r. It is separate from + // err because it is valid for an io.Reader to return (n int, err1 error) + // such that n > 0 && err1 != nil, and callers should always process the + // n > 0 bytes before considering the error err1. + readErr error + // buf[raw.start:raw.end] holds the raw bytes of the current token. + // buf[raw.end:] is buffered input that will yield future tokens. + raw span + buf []byte + // maxBuf limits the data buffered in buf. A value of 0 means unlimited. + maxBuf int + // buf[data.start:data.end] holds the raw bytes of the current token's data: + // a text token's text, a tag token's tag name, etc. + data span + // pendingAttr is the attribute key and value currently being tokenized. + // When complete, pendingAttr is pushed onto attr. nAttrReturned is + // incremented on each call to TagAttr. + pendingAttr [2]span + attr [][2]span + nAttrReturned int + // rawTag is the "script" in "</script>" that closes the next token. If + // non-empty, the subsequent call to Next will return a raw or RCDATA text + // token: one that treats "<p>" as text instead of an element. + // rawTag's contents are lower-cased. + rawTag string + // textIsRaw is whether the current text token's data is not escaped. + textIsRaw bool + // convertNUL is whether NUL bytes in the current token's data should + // be converted into \ufffd replacement characters. + convertNUL bool + // allowCDATA is whether CDATA sections are allowed in the current context. + allowCDATA bool +} + +// AllowCDATA sets whether or not the tokenizer recognizes <![CDATA[foo]]> as +// the text "foo". The default value is false, which means to recognize it as +// a bogus comment "<!-- [CDATA[foo]] -->" instead. +// +// Strictly speaking, an HTML5 compliant tokenizer should allow CDATA if and +// only if tokenizing foreign content, such as MathML and SVG. However, +// tracking foreign-contentness is difficult to do purely in the tokenizer, +// as opposed to the parser, due to HTML integration points: an <svg> element +// can contain a <foreignObject> that is foreign-to-SVG but not foreign-to- +// HTML. For strict compliance with the HTML5 tokenization algorithm, it is the +// responsibility of the user of a tokenizer to call AllowCDATA as appropriate. +// In practice, if using the tokenizer without caring whether MathML or SVG +// CDATA is text or comments, such as tokenizing HTML to find all the anchor +// text, it is acceptable to ignore this responsibility. +func (z *Tokenizer) AllowCDATA(allowCDATA bool) { + z.allowCDATA = allowCDATA +} + +// NextIsNotRawText instructs the tokenizer that the next token should not be +// considered as 'raw text'. Some elements, such as script and title elements, +// normally require the next token after the opening tag to be 'raw text' that +// has no child elements. For example, tokenizing "<title>a<b>c</b>d</title>" +// yields a start tag token for "<title>", a text token for "a<b>c</b>d", and +// an end tag token for "</title>". There are no distinct start tag or end tag +// tokens for the "<b>" and "</b>". +// +// This tokenizer implementation will generally look for raw text at the right +// times. Strictly speaking, an HTML5 compliant tokenizer should not look for +// raw text if in foreign content: <title> generally needs raw text, but a +// <title> inside an <svg> does not. Another example is that a <textarea> +// generally needs raw text, but a <textarea> is not allowed as an immediate +// child of a <select>; in normal parsing, a <textarea> implies </select>, but +// one cannot close the implicit element when parsing a <select>'s InnerHTML. +// Similarly to AllowCDATA, tracking the correct moment to override raw-text- +// ness is difficult to do purely in the tokenizer, as opposed to the parser. +// For strict compliance with the HTML5 tokenization algorithm, it is the +// responsibility of the user of a tokenizer to call NextIsNotRawText as +// appropriate. In practice, like AllowCDATA, it is acceptable to ignore this +// responsibility for basic usage. +// +// Note that this 'raw text' concept is different from the one offered by the +// Tokenizer.Raw method. +func (z *Tokenizer) NextIsNotRawText() { + z.rawTag = "" +} + +// Err returns the error associated with the most recent ErrorToken token. +// This is typically io.EOF, meaning the end of tokenization. +func (z *Tokenizer) Err() error { + if z.tt != ErrorToken { + return nil + } + return z.err +} + +// readByte returns the next byte from the input stream, doing a buffered read +// from z.r into z.buf if necessary. z.buf[z.raw.start:z.raw.end] remains a contiguous byte +// slice that holds all the bytes read so far for the current token. +// It sets z.err if the underlying reader returns an error. +// Pre-condition: z.err == nil. +func (z *Tokenizer) readByte() byte { + if z.raw.end >= len(z.buf) { + // Our buffer is exhausted and we have to read from z.r. Check if the + // previous read resulted in an error. + if z.readErr != nil { + z.err = z.readErr + return 0 + } + // We copy z.buf[z.raw.start:z.raw.end] to the beginning of z.buf. If the length + // z.raw.end - z.raw.start is more than half the capacity of z.buf, then we + // allocate a new buffer before the copy. + c := cap(z.buf) + d := z.raw.end - z.raw.start + var buf1 []byte + if 2*d > c { + buf1 = make([]byte, d, 2*c) + } else { + buf1 = z.buf[:d] + } + copy(buf1, z.buf[z.raw.start:z.raw.end]) + if x := z.raw.start; x != 0 { + // Adjust the data/attr spans to refer to the same contents after the copy. + z.data.start -= x + z.data.end -= x + z.pendingAttr[0].start -= x + z.pendingAttr[0].end -= x + z.pendingAttr[1].start -= x + z.pendingAttr[1].end -= x + for i := range z.attr { + z.attr[i][0].start -= x + z.attr[i][0].end -= x + z.attr[i][1].start -= x + z.attr[i][1].end -= x + } + } + z.raw.start, z.raw.end, z.buf = 0, d, buf1[:d] + // Now that we have copied the live bytes to the start of the buffer, + // we read from z.r into the remainder. + var n int + n, z.readErr = readAtLeastOneByte(z.r, buf1[d:cap(buf1)]) + if n == 0 { + z.err = z.readErr + return 0 + } + z.buf = buf1[:d+n] + } + x := z.buf[z.raw.end] + z.raw.end++ + if z.maxBuf > 0 && z.raw.end-z.raw.start >= z.maxBuf { + z.err = ErrBufferExceeded + return 0 + } + return x +} + +// Buffered returns a slice containing data buffered but not yet tokenized. +func (z *Tokenizer) Buffered() []byte { + return z.buf[z.raw.end:] +} + +// readAtLeastOneByte wraps an io.Reader so that reading cannot return (0, nil). +// It returns io.ErrNoProgress if the underlying r.Read method returns (0, nil) +// too many times in succession. +func readAtLeastOneByte(r io.Reader, b []byte) (int, error) { + for i := 0; i < 100; i++ { + if n, err := r.Read(b); n != 0 || err != nil { + return n, err + } + } + return 0, io.ErrNoProgress +} + +// skipWhiteSpace skips past any white space. +func (z *Tokenizer) skipWhiteSpace() { + if z.err != nil { + return + } + for { + c := z.readByte() + if z.err != nil { + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f': + // No-op. + default: + z.raw.end-- + return + } + } +} + +// readRawOrRCDATA reads until the next "</foo>", where "foo" is z.rawTag and +// is typically something like "script" or "textarea". +func (z *Tokenizer) readRawOrRCDATA() { + if z.rawTag == "script" { + z.readScript() + z.textIsRaw = true + z.rawTag = "" + return + } +loop: + for { + c := z.readByte() + if z.err != nil { + break loop + } + if c != '<' { + continue loop + } + c = z.readByte() + if z.err != nil { + break loop + } + if c != '/' { + z.raw.end-- + continue loop + } + if z.readRawEndTag() || z.err != nil { + break loop + } + } + z.data.end = z.raw.end + // A textarea's or title's RCDATA can contain escaped entities. + z.textIsRaw = z.rawTag != "textarea" && z.rawTag != "title" + z.rawTag = "" +} + +// readRawEndTag attempts to read a tag like "</foo>", where "foo" is z.rawTag. +// If it succeeds, it backs up the input position to reconsume the tag and +// returns true. Otherwise it returns false. The opening "</" has already been +// consumed. +func (z *Tokenizer) readRawEndTag() bool { + for i := 0; i < len(z.rawTag); i++ { + c := z.readByte() + if z.err != nil { + return false + } + if c != z.rawTag[i] && c != z.rawTag[i]-('a'-'A') { + z.raw.end-- + return false + } + } + c := z.readByte() + if z.err != nil { + return false + } + switch c { + case ' ', '\n', '\r', '\t', '\f', '/', '>': + // The 3 is 2 for the leading "</" plus 1 for the trailing character c. + z.raw.end -= 3 + len(z.rawTag) + return true + } + z.raw.end-- + return false +} + +// readScript reads until the next </script> tag, following the byzantine +// rules for escaping/hiding the closing tag. +func (z *Tokenizer) readScript() { + defer func() { + z.data.end = z.raw.end + }() + var c byte + +scriptData: + c = z.readByte() + if z.err != nil { + return + } + if c == '<' { + goto scriptDataLessThanSign + } + goto scriptData + +scriptDataLessThanSign: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '/': + goto scriptDataEndTagOpen + case '!': + goto scriptDataEscapeStart + } + z.raw.end-- + goto scriptData + +scriptDataEndTagOpen: + if z.readRawEndTag() || z.err != nil { + return + } + goto scriptData + +scriptDataEscapeStart: + c = z.readByte() + if z.err != nil { + return + } + if c == '-' { + goto scriptDataEscapeStartDash + } + z.raw.end-- + goto scriptData + +scriptDataEscapeStartDash: + c = z.readByte() + if z.err != nil { + return + } + if c == '-' { + goto scriptDataEscapedDashDash + } + z.raw.end-- + goto scriptData + +scriptDataEscaped: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataEscapedDash + case '<': + goto scriptDataEscapedLessThanSign + } + goto scriptDataEscaped + +scriptDataEscapedDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataEscapedDashDash + case '<': + goto scriptDataEscapedLessThanSign + } + goto scriptDataEscaped + +scriptDataEscapedDashDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataEscapedDashDash + case '<': + goto scriptDataEscapedLessThanSign + case '>': + goto scriptData + } + goto scriptDataEscaped + +scriptDataEscapedLessThanSign: + c = z.readByte() + if z.err != nil { + return + } + if c == '/' { + goto scriptDataEscapedEndTagOpen + } + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { + goto scriptDataDoubleEscapeStart + } + z.raw.end-- + goto scriptData + +scriptDataEscapedEndTagOpen: + if z.readRawEndTag() || z.err != nil { + return + } + goto scriptDataEscaped + +scriptDataDoubleEscapeStart: + z.raw.end-- + for i := 0; i < len("script"); i++ { + c = z.readByte() + if z.err != nil { + return + } + if c != "script"[i] && c != "SCRIPT"[i] { + z.raw.end-- + goto scriptDataEscaped + } + } + c = z.readByte() + if z.err != nil { + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f', '/', '>': + goto scriptDataDoubleEscaped + } + z.raw.end-- + goto scriptDataEscaped + +scriptDataDoubleEscaped: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataDoubleEscapedDash + case '<': + goto scriptDataDoubleEscapedLessThanSign + } + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapedDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataDoubleEscapedDashDash + case '<': + goto scriptDataDoubleEscapedLessThanSign + } + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapedDashDash: + c = z.readByte() + if z.err != nil { + return + } + switch c { + case '-': + goto scriptDataDoubleEscapedDashDash + case '<': + goto scriptDataDoubleEscapedLessThanSign + case '>': + goto scriptData + } + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapedLessThanSign: + c = z.readByte() + if z.err != nil { + return + } + if c == '/' { + goto scriptDataDoubleEscapeEnd + } + z.raw.end-- + goto scriptDataDoubleEscaped + +scriptDataDoubleEscapeEnd: + if z.readRawEndTag() { + z.raw.end += len("</script>") + goto scriptDataEscaped + } + if z.err != nil { + return + } + goto scriptDataDoubleEscaped +} + +// readComment reads the next comment token starting with "<!--". The opening +// "<!--" has already been consumed. +func (z *Tokenizer) readComment() { + // When modifying this function, consider manually increasing the + // maxSuffixLen constant in func TestComments, from 6 to e.g. 9 or more. + // That increase should only be temporary, not committed, as it + // exponentially affects the test running time. + + z.data.start = z.raw.end + defer func() { + if z.data.end < z.data.start { + // It's a comment with no data, like <!-->. + z.data.end = z.data.start + } + }() + + var dashCount int + beginning := true + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.calculateAbruptCommentDataEnd() + return + } + switch c { + case '-': + dashCount++ + continue + case '>': + if dashCount >= 2 || beginning { + z.data.end = z.raw.end - len("-->") + return + } + case '!': + if dashCount >= 2 { + c = z.readByte() + if z.err != nil { + z.data.end = z.calculateAbruptCommentDataEnd() + return + } else if c == '>' { + z.data.end = z.raw.end - len("--!>") + return + } else if c == '-' { + dashCount = 1 + beginning = false + continue + } + } + } + dashCount = 0 + beginning = false + } +} + +func (z *Tokenizer) calculateAbruptCommentDataEnd() int { + raw := z.Raw() + const prefixLen = len("<!--") + if len(raw) >= prefixLen { + raw = raw[prefixLen:] + if hasSuffix(raw, "--!") { + return z.raw.end - 3 + } else if hasSuffix(raw, "--") { + return z.raw.end - 2 + } else if hasSuffix(raw, "-") { + return z.raw.end - 1 + } + } + return z.raw.end +} + +func hasSuffix(b []byte, suffix string) bool { + if len(b) < len(suffix) { + return false + } + b = b[len(b)-len(suffix):] + for i := range b { + if b[i] != suffix[i] { + return false + } + } + return true +} + +// readUntilCloseAngle reads until the next ">". +func (z *Tokenizer) readUntilCloseAngle() { + z.data.start = z.raw.end + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return + } + if c == '>' { + z.data.end = z.raw.end - len(">") + return + } + } +} + +// readMarkupDeclaration reads the next token starting with "<!". It might be +// a "<!--comment-->", a "<!DOCTYPE foo>", a "<![CDATA[section]]>" or +// "<!a bogus comment". The opening "<!" has already been consumed. +func (z *Tokenizer) readMarkupDeclaration() TokenType { + z.data.start = z.raw.end + var c [2]byte + for i := 0; i < 2; i++ { + c[i] = z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return CommentToken + } + } + if c[0] == '-' && c[1] == '-' { + z.readComment() + return CommentToken + } + z.raw.end -= 2 + if z.readDoctype() { + return DoctypeToken + } + if z.allowCDATA && z.readCDATA() { + z.convertNUL = true + return TextToken + } + // It's a bogus comment. + z.readUntilCloseAngle() + return CommentToken +} + +// readDoctype attempts to read a doctype declaration and returns true if +// successful. The opening "<!" has already been consumed. +func (z *Tokenizer) readDoctype() bool { + const s = "DOCTYPE" + for i := 0; i < len(s); i++ { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return false + } + if c != s[i] && c != s[i]+('a'-'A') { + // Back up to read the fragment of "DOCTYPE" again. + z.raw.end = z.data.start + return false + } + } + if z.skipWhiteSpace(); z.err != nil { + z.data.start = z.raw.end + z.data.end = z.raw.end + return true + } + z.readUntilCloseAngle() + return true +} + +// readCDATA attempts to read a CDATA section and returns true if +// successful. The opening "<!" has already been consumed. +func (z *Tokenizer) readCDATA() bool { + const s = "[CDATA[" + for i := 0; i < len(s); i++ { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return false + } + if c != s[i] { + // Back up to read the fragment of "[CDATA[" again. + z.raw.end = z.data.start + return false + } + } + z.data.start = z.raw.end + brackets := 0 + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return true + } + switch c { + case ']': + brackets++ + case '>': + if brackets >= 2 { + z.data.end = z.raw.end - len("]]>") + return true + } + brackets = 0 + default: + brackets = 0 + } + } +} + +// startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end] +// case-insensitively matches any element of ss. +func (z *Tokenizer) startTagIn(ss ...string) bool { +loop: + for _, s := range ss { + if z.data.end-z.data.start != len(s) { + continue loop + } + for i := 0; i < len(s); i++ { + c := z.buf[z.data.start+i] + if 'A' <= c && c <= 'Z' { + c += 'a' - 'A' + } + if c != s[i] { + continue loop + } + } + return true + } + return false +} + +// readStartTag reads the next start tag token. The opening "<a" has already +// been consumed, where 'a' means anything in [A-Za-z]. +func (z *Tokenizer) readStartTag() TokenType { + z.readTag(true) + if z.err != nil { + return ErrorToken + } + // Several tags flag the tokenizer's next token as raw. + c, raw := z.buf[z.data.start], false + if 'A' <= c && c <= 'Z' { + c += 'a' - 'A' + } + switch c { + case 'i': + raw = z.startTagIn("iframe") + case 'n': + raw = z.startTagIn("noembed", "noframes", "noscript") + case 'p': + raw = z.startTagIn("plaintext") + case 's': + raw = z.startTagIn("script", "style") + case 't': + raw = z.startTagIn("textarea", "title") + case 'x': + raw = z.startTagIn("xmp") + } + if raw { + z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) + } + // Look for a self-closing token like "<br/>". + if z.err == nil && z.buf[z.raw.end-2] == '/' { + return SelfClosingTagToken + } + return StartTagToken +} + +// readTag reads the next tag token and its attributes. If saveAttr, those +// attributes are saved in z.attr, otherwise z.attr is set to an empty slice. +// The opening "<a" or "</a" has already been consumed, where 'a' means anything +// in [A-Za-z]. +func (z *Tokenizer) readTag(saveAttr bool) { + z.attr = z.attr[:0] + z.nAttrReturned = 0 + // Read the tag name and attribute key/value pairs. + z.readTagName() + if z.skipWhiteSpace(); z.err != nil { + return + } + for { + c := z.readByte() + if z.err != nil || c == '>' { + break + } + z.raw.end-- + z.readTagAttrKey() + z.readTagAttrVal() + // Save pendingAttr if saveAttr and that attribute has a non-empty key. + if saveAttr && z.pendingAttr[0].start != z.pendingAttr[0].end { + z.attr = append(z.attr, z.pendingAttr) + } + if z.skipWhiteSpace(); z.err != nil { + break + } + } +} + +// readTagName sets z.data to the "div" in "<div k=v>". The reader (z.raw.end) +// is positioned such that the first byte of the tag name (the "d" in "<div") +// has already been consumed. +func (z *Tokenizer) readTagName() { + z.data.start = z.raw.end - 1 + for { + c := z.readByte() + if z.err != nil { + z.data.end = z.raw.end + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f': + z.data.end = z.raw.end - 1 + return + case '/', '>': + z.raw.end-- + z.data.end = z.raw.end + return + } + } +} + +// readTagAttrKey sets z.pendingAttr[0] to the "k" in "<div k=v>". +// Precondition: z.err == nil. +func (z *Tokenizer) readTagAttrKey() { + z.pendingAttr[0].start = z.raw.end + for { + c := z.readByte() + if z.err != nil { + z.pendingAttr[0].end = z.raw.end + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f', '/': + z.pendingAttr[0].end = z.raw.end - 1 + return + case '=': + if z.pendingAttr[0].start+1 == z.raw.end { + // WHATWG 13.2.5.32, if we see an equals sign before the attribute name + // begins, we treat it as a character in the attribute name and continue. + continue + } + fallthrough + case '>': + z.raw.end-- + z.pendingAttr[0].end = z.raw.end + return + } + } +} + +// readTagAttrVal sets z.pendingAttr[1] to the "v" in "<div k=v>". +func (z *Tokenizer) readTagAttrVal() { + z.pendingAttr[1].start = z.raw.end + z.pendingAttr[1].end = z.raw.end + if z.skipWhiteSpace(); z.err != nil { + return + } + c := z.readByte() + if z.err != nil { + return + } + if c != '=' { + z.raw.end-- + return + } + if z.skipWhiteSpace(); z.err != nil { + return + } + quote := z.readByte() + if z.err != nil { + return + } + switch quote { + case '>': + z.raw.end-- + return + + case '\'', '"': + z.pendingAttr[1].start = z.raw.end + for { + c := z.readByte() + if z.err != nil { + z.pendingAttr[1].end = z.raw.end + return + } + if c == quote { + z.pendingAttr[1].end = z.raw.end - 1 + return + } + } + + default: + z.pendingAttr[1].start = z.raw.end - 1 + for { + c := z.readByte() + if z.err != nil { + z.pendingAttr[1].end = z.raw.end + return + } + switch c { + case ' ', '\n', '\r', '\t', '\f': + z.pendingAttr[1].end = z.raw.end - 1 + return + case '>': + z.raw.end-- + z.pendingAttr[1].end = z.raw.end + return + } + } + } +} + +// Next scans the next token and returns its type. +func (z *Tokenizer) Next() TokenType { + z.raw.start = z.raw.end + z.data.start = z.raw.end + z.data.end = z.raw.end + if z.err != nil { + z.tt = ErrorToken + return z.tt + } + if z.rawTag != "" { + if z.rawTag == "plaintext" { + // Read everything up to EOF. + for z.err == nil { + z.readByte() + } + z.data.end = z.raw.end + z.textIsRaw = true + } else { + z.readRawOrRCDATA() + } + if z.data.end > z.data.start { + z.tt = TextToken + z.convertNUL = true + return z.tt + } + } + z.textIsRaw = false + z.convertNUL = false + +loop: + for { + c := z.readByte() + if z.err != nil { + break loop + } + if c != '<' { + continue loop + } + + // Check if the '<' we have just read is part of a tag, comment + // or doctype. If not, it's part of the accumulated text token. + c = z.readByte() + if z.err != nil { + break loop + } + var tokenType TokenType + switch { + case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z': + tokenType = StartTagToken + case c == '/': + tokenType = EndTagToken + case c == '!' || c == '?': + // We use CommentToken to mean any of "<!--actual comments-->", + // "<!DOCTYPE declarations>" and "<?xml processing instructions?>". + tokenType = CommentToken + default: + // Reconsume the current character. + z.raw.end-- + continue + } + + // We have a non-text token, but we might have accumulated some text + // before that. If so, we return the text first, and return the non- + // text token on the subsequent call to Next. + if x := z.raw.end - len("<a"); z.raw.start < x { + z.raw.end = x + z.data.end = x + z.tt = TextToken + return z.tt + } + switch tokenType { + case StartTagToken: + z.tt = z.readStartTag() + return z.tt + case EndTagToken: + c = z.readByte() + if z.err != nil { + break loop + } + if c == '>' { + // "</>" does not generate a token at all. Generate an empty comment + // to allow passthrough clients to pick up the data using Raw. + // Reset the tokenizer state and start again. + z.tt = CommentToken + return z.tt + } + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { + z.readTag(false) + if z.err != nil { + z.tt = ErrorToken + } else { + z.tt = EndTagToken + } + return z.tt + } + z.raw.end-- + z.readUntilCloseAngle() + z.tt = CommentToken + return z.tt + case CommentToken: + if c == '!' { + z.tt = z.readMarkupDeclaration() + return z.tt + } + z.raw.end-- + z.readUntilCloseAngle() + z.tt = CommentToken + return z.tt + } + } + if z.raw.start < z.raw.end { + z.data.end = z.raw.end + z.tt = TextToken + return z.tt + } + z.tt = ErrorToken + return z.tt +} + +// Raw returns the unmodified text of the current token. Calling Next, Token, +// Text, TagName or TagAttr may change the contents of the returned slice. +// +// The token stream's raw bytes partition the byte stream (up until an +// ErrorToken). There are no overlaps or gaps between two consecutive token's +// raw bytes. One implication is that the byte offset of the current token is +// the sum of the lengths of all previous tokens' raw bytes. +func (z *Tokenizer) Raw() []byte { + return z.buf[z.raw.start:z.raw.end] +} + +// convertNewlines converts "\r" and "\r\n" in s to "\n". +// The conversion happens in place, but the resulting slice may be shorter. +func convertNewlines(s []byte) []byte { + for i, c := range s { + if c != '\r' { + continue + } + + src := i + 1 + if src >= len(s) || s[src] != '\n' { + s[i] = '\n' + continue + } + + dst := i + for src < len(s) { + if s[src] == '\r' { + if src+1 < len(s) && s[src+1] == '\n' { + src++ + } + s[dst] = '\n' + } else { + s[dst] = s[src] + } + src++ + dst++ + } + return s[:dst] + } + return s +} + +var ( + nul = []byte("\x00") + replacement = []byte("\ufffd") +) + +// Text returns the unescaped text of a text, comment or doctype token. The +// contents of the returned slice may change on the next call to Next. +func (z *Tokenizer) Text() []byte { + switch z.tt { + case TextToken, CommentToken, DoctypeToken: + s := z.buf[z.data.start:z.data.end] + z.data.start = z.raw.end + z.data.end = z.raw.end + s = convertNewlines(s) + if (z.convertNUL || z.tt == CommentToken) && bytes.Contains(s, nul) { + s = bytes.Replace(s, nul, replacement, -1) + } + if !z.textIsRaw { + s = unescape(s, false) + } + return s + } + return nil +} + +// TagName returns the lower-cased name of a tag token (the `img` out of +// `<IMG SRC="foo">`) and whether the tag has attributes. +// The contents of the returned slice may change on the next call to Next. +func (z *Tokenizer) TagName() (name []byte, hasAttr bool) { + if z.data.start < z.data.end { + switch z.tt { + case StartTagToken, EndTagToken, SelfClosingTagToken: + s := z.buf[z.data.start:z.data.end] + z.data.start = z.raw.end + z.data.end = z.raw.end + return lower(s), z.nAttrReturned < len(z.attr) + } + } + return nil, false +} + +// TagAttr returns the lower-cased key and unescaped value of the next unparsed +// attribute for the current tag token and whether there are more attributes. +// The contents of the returned slices may change on the next call to Next. +func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) { + if z.nAttrReturned < len(z.attr) { + switch z.tt { + case StartTagToken, SelfClosingTagToken: + x := z.attr[z.nAttrReturned] + z.nAttrReturned++ + key = z.buf[x[0].start:x[0].end] + val = z.buf[x[1].start:x[1].end] + return lower(key), unescape(convertNewlines(val), true), z.nAttrReturned < len(z.attr) + } + } + return nil, nil, false +} + +// Token returns the current Token. The result's Data and Attr values remain +// valid after subsequent Next calls. +func (z *Tokenizer) Token() Token { + t := Token{Type: z.tt} + switch z.tt { + case TextToken, CommentToken, DoctypeToken: + t.Data = string(z.Text()) + case StartTagToken, SelfClosingTagToken, EndTagToken: + name, moreAttr := z.TagName() + for moreAttr { + var key, val []byte + key, val, moreAttr = z.TagAttr() + t.Attr = append(t.Attr, Attribute{"", atom.String(key), string(val)}) + } + if a := atom.Lookup(name); a != 0 { + t.DataAtom, t.Data = a, a.String() + } else { + t.DataAtom, t.Data = 0, string(name) + } + } + return t +} + +// SetMaxBuf sets a limit on the amount of data buffered during tokenization. +// A value of 0 means unlimited. +func (z *Tokenizer) SetMaxBuf(n int) { + z.maxBuf = n +} + +// NewTokenizer returns a new HTML Tokenizer for the given Reader. +// The input is assumed to be UTF-8 encoded. +func NewTokenizer(r io.Reader) *Tokenizer { + return NewTokenizerFragment(r, "") +} + +// NewTokenizerFragment returns a new HTML Tokenizer for the given Reader, for +// tokenizing an existing element's InnerHTML fragment. contextTag is that +// element's tag, such as "div" or "iframe". +// +// For example, how the InnerHTML "a<b" is tokenized depends on whether it is +// for a <p> tag or a <script> tag. +// +// The input is assumed to be UTF-8 encoded. +func NewTokenizerFragment(r io.Reader, contextTag string) *Tokenizer { + z := &Tokenizer{ + r: r, + buf: make([]byte, 0, 4096), + } + if contextTag != "" { + switch s := strings.ToLower(contextTag); s { + case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "title", "textarea", "xmp": + z.rawTag = s + } + } + return z +} diff --git a/vendor/golang.org/x/net/http2/h2c/h2c.go b/vendor/golang.org/x/net/http2/h2c/h2c.go index a72bbed1bc..2d6bf861b9 100644 --- a/vendor/golang.org/x/net/http2/h2c/h2c.go +++ b/vendor/golang.org/x/net/http2/h2c/h2c.go @@ -44,7 +44,7 @@ func init() { // HTTP/1, but unlikely to occur in practice and (2) Upgrading from HTTP/1 to // h2c - this works by using the HTTP/1 Upgrade header to request an upgrade to // h2c. When either of those situations occur we hijack the HTTP/1 connection, -// convert it to a HTTP/2 connection and pass the net.Conn to http2.ServeConn. +// convert it to an HTTP/2 connection and pass the net.Conn to http2.ServeConn. type h2cHandler struct { Handler http.Handler s *http2.Server diff --git a/vendor/golang.org/x/net/http2/pipe.go b/vendor/golang.org/x/net/http2/pipe.go index c15b8a7719..684d984fd9 100644 --- a/vendor/golang.org/x/net/http2/pipe.go +++ b/vendor/golang.org/x/net/http2/pipe.go @@ -88,13 +88,9 @@ func (p *pipe) Write(d []byte) (n int, err error) { p.c.L = &p.mu } defer p.c.Signal() - if p.err != nil { + if p.err != nil || p.breakErr != nil { return 0, errClosedPipeWrite } - if p.breakErr != nil { - p.unread += len(d) - return len(d), nil // discard when there is no reader - } return p.b.Write(d) } diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 8cb14f3c97..033b6e6db6 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -441,7 +441,7 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { if s.NewWriteScheduler != nil { sc.writeSched = s.NewWriteScheduler() } else { - sc.writeSched = NewPriorityWriteScheduler(nil) + sc.writeSched = newRoundRobinWriteScheduler() } // These start at the RFC-specified defaults. If there is a higher @@ -1822,15 +1822,18 @@ func (sc *serverConn) processData(f *DataFrame) error { } if len(data) > 0 { + st.bodyBytes += int64(len(data)) wrote, err := st.body.Write(data) if err != nil { + // The handler has closed the request body. + // Return the connection-level flow control for the discarded data, + // but not the stream-level flow control. sc.sendWindowUpdate(nil, int(f.Length)-wrote) - return sc.countError("body_write_err", streamError(id, ErrCodeStreamClosed)) + return nil } if wrote != len(data) { panic("internal error: bad Writer") } - st.bodyBytes += int64(len(data)) } // Return any padded flow control now, since we won't @@ -2426,7 +2429,7 @@ type requestBody struct { conn *serverConn closeOnce sync.Once // for use by Close only sawEOF bool // for use by Read only - pipe *pipe // non-nil if we have a HTTP entity message body + pipe *pipe // non-nil if we have an HTTP entity message body needsContinue bool // need to send a 100-continue } @@ -2566,7 +2569,8 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { clen = "" } } - if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) { + _, hasContentLength := rws.snapHeader["Content-Length"] + if !hasContentLength && clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) { clen = strconv.Itoa(len(p)) } _, hasContentType := rws.snapHeader["Content-Type"] @@ -2771,7 +2775,7 @@ func (w *responseWriter) FlushError() error { err = rws.bw.Flush() } else { // The bufio.Writer won't call chunkWriter.Write - // (writeChunk with zero bytes, so we have to do it + // (writeChunk with zero bytes), so we have to do it // ourselves to force the HTTP response header and/or // final DATA frame (with END_STREAM) to be sent. _, err = chunkWriter{rws}.Write(nil) diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 05ba23d3d9..b9632380e7 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -560,10 +560,11 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res traceGotConn(req, cc, reused) res, err := cc.RoundTrip(req) if err != nil && retry <= 6 { + roundTripErr := err if req, err = shouldRetryRequest(req, err); err == nil { // After the first retry, do exponential backoff with 10% jitter. if retry == 0 { - t.vlogf("RoundTrip retrying after failure: %v", err) + t.vlogf("RoundTrip retrying after failure: %v", roundTripErr) continue } backoff := float64(uint(1) << (uint(retry) - 1)) @@ -572,7 +573,7 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res timer := backoffNewTimer(d) select { case <-timer.C: - t.vlogf("RoundTrip retrying after failure: %v", err) + t.vlogf("RoundTrip retrying after failure: %v", roundTripErr) continue case <-req.Context().Done(): timer.Stop() @@ -1265,6 +1266,29 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { return res, nil } + cancelRequest := func(cs *clientStream, err error) error { + cs.cc.mu.Lock() + bodyClosed := cs.reqBodyClosed + cs.cc.mu.Unlock() + // Wait for the request body to be closed. + // + // If nothing closed the body before now, abortStreamLocked + // will have started a goroutine to close it. + // + // Closing the body before returning avoids a race condition + // with net/http checking its readTrackingBody to see if the + // body was read from or closed. See golang/go#60041. + // + // The body is closed in a separate goroutine without the + // connection mutex held, but dropping the mutex before waiting + // will keep us from holding it indefinitely if the body + // close is slow for some reason. + if bodyClosed != nil { + <-bodyClosed + } + return err + } + for { select { case <-cs.respHeaderRecv: @@ -1284,10 +1308,10 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { case <-ctx.Done(): err := ctx.Err() cs.abortStream(err) - return nil, err + return nil, cancelRequest(cs, err) case <-cs.reqCancel: cs.abortStream(errRequestCanceled) - return nil, errRequestCanceled + return nil, cancelRequest(cs, errRequestCanceled) } } } @@ -1844,6 +1868,9 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail if err != nil { return nil, err } + if !httpguts.ValidHostHeader(host) { + return nil, errors.New("http2: invalid Host header") + } var path string if req.Method != "CONNECT" { @@ -1880,7 +1907,7 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail // 8.1.2.3 Request Pseudo-Header Fields // The :path pseudo-header field includes the path and query parts of the // target URI (the path-absolute production and optionally a '?' character - // followed by the query production (see Sections 3.3 and 3.4 of + // followed by the query production, see Sections 3.3 and 3.4 of // [RFC3986]). f(":authority", host) m := req.Method @@ -2555,6 +2582,9 @@ func (b transportResponseBody) Close() error { cs := b.cs cc := cs.cc + cs.bufPipe.BreakWithError(errClosedResponseBody) + cs.abortStream(errClosedResponseBody) + unread := cs.bufPipe.Len() if unread > 0 { cc.mu.Lock() @@ -2573,9 +2603,6 @@ func (b transportResponseBody) Close() error { cc.wmu.Unlock() } - cs.bufPipe.BreakWithError(errClosedResponseBody) - cs.abortStream(errClosedResponseBody) - select { case <-cs.donec: case <-cs.ctx.Done(): diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go index c7cd001739..cc893adc29 100644 --- a/vendor/golang.org/x/net/http2/writesched.go +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -184,7 +184,8 @@ func (wr *FrameWriteRequest) replyToWriter(err error) { // writeQueue is used by implementations of WriteScheduler. type writeQueue struct { - s []FrameWriteRequest + s []FrameWriteRequest + prev, next *writeQueue } func (q *writeQueue) empty() bool { return len(q.s) == 0 } diff --git a/vendor/golang.org/x/net/http2/writesched_roundrobin.go b/vendor/golang.org/x/net/http2/writesched_roundrobin.go new file mode 100644 index 0000000000..54fe86322d --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_roundrobin.go @@ -0,0 +1,119 @@ +// Copyright 2023 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 ( + "fmt" + "math" +) + +type roundRobinWriteScheduler struct { + // control contains control frames (SETTINGS, PING, etc.). + control writeQueue + + // streams maps stream ID to a queue. + streams map[uint32]*writeQueue + + // stream queues are stored in a circular linked list. + // head is the next stream to write, or nil if there are no streams open. + head *writeQueue + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +// newRoundRobinWriteScheduler constructs a new write scheduler. +// The round robin scheduler priorizes control frames +// like SETTINGS and PING over DATA frames. +// When there are no control frames to send, it performs a round-robin +// selection from the ready streams. +func newRoundRobinWriteScheduler() WriteScheduler { + ws := &roundRobinWriteScheduler{ + streams: make(map[uint32]*writeQueue), + } + return ws +} + +func (ws *roundRobinWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + if ws.streams[streamID] != nil { + panic(fmt.Errorf("stream %d already opened", streamID)) + } + q := ws.queuePool.get() + ws.streams[streamID] = q + if ws.head == nil { + ws.head = q + q.next = q + q.prev = q + } else { + // Queues are stored in a ring. + // Insert the new stream before ws.head, putting it at the end of the list. + q.prev = ws.head.prev + q.next = ws.head + q.prev.next = q + q.next.prev = q + } +} + +func (ws *roundRobinWriteScheduler) CloseStream(streamID uint32) { + q := ws.streams[streamID] + if q == nil { + return + } + if q.next == q { + // This was the only open stream. + ws.head = nil + } else { + q.prev.next = q.next + q.next.prev = q.prev + if ws.head == q { + ws.head = q.next + } + } + delete(ws.streams, streamID) + ws.queuePool.put(q) +} + +func (ws *roundRobinWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) {} + +func (ws *roundRobinWriteScheduler) Push(wr FrameWriteRequest) { + if wr.isControl() { + ws.control.push(wr) + return + } + q := ws.streams[wr.StreamID()] + if q == nil { + // This is a closed stream. + // wr should not be a HEADERS or DATA frame. + // We push the request onto the control queue. + if wr.DataSize() > 0 { + panic("add DATA on non-open stream") + } + ws.control.push(wr) + return + } + q.push(wr) +} + +func (ws *roundRobinWriteScheduler) Pop() (FrameWriteRequest, bool) { + // Control and RST_STREAM frames first. + if !ws.control.empty() { + return ws.control.shift(), true + } + if ws.head == nil { + return FrameWriteRequest{}, false + } + q := ws.head + for { + if wr, ok := q.consume(math.MaxInt32); ok { + ws.head = q.next + return wr, true + } + q = q.next + if q == ws.head { + break + } + } + return FrameWriteRequest{}, false +} diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go index aae6aac872..ee1698cefb 100644 --- a/vendor/golang.org/x/net/idna/idna9.0.0.go +++ b/vendor/golang.org/x/net/idna/idna9.0.0.go @@ -121,7 +121,7 @@ func CheckJoiners(enable bool) Option { } } -// StrictDomainName limits the set of permissable ASCII characters to those +// StrictDomainName limits the set of permissible 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, // but is only useful if ValidateLabels is set. diff --git a/vendor/golang.org/x/net/idna/tables13.0.0.go b/vendor/golang.org/x/net/idna/tables13.0.0.go index 390c5e56d2..66701eadfb 100644 --- a/vendor/golang.org/x/net/idna/tables13.0.0.go +++ b/vendor/golang.org/x/net/idna/tables13.0.0.go @@ -1,151 +1,294 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package idna // UnicodeVersion is the Unicode version from which the tables in this package are derived. const UnicodeVersion = "13.0.0" -var mappings string = "" + // Size: 8188 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\x06令和\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点\x04" + - "2点\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œ\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\x03p" + - "pv\x02wc\x02mc\x02md\x02mr\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 mappings string = "" + // Size: 6539 bytes + " ̈a ̄23 ́ ̧1o1⁄41⁄23⁄4i̇l·ʼnsdžⱥⱦhjrwy ̆ ̇ ̊ ̨ ̃ ̋lẍ́ ι; ̈́եւاٴوٴۇٴيٴक" + + "़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼ําໍາຫນຫມགྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" + + "ཱྀྀྒྷྜྷྡྷྦྷྫྷྐྵвдостъѣæbdeǝgikmnȣptuɐɑəɛɜŋɔɯvβγδφχρнɒcɕðfɟɡɥɨɩɪʝɭʟɱɰɲɳ" + + "ɴɵɸʂʃƫʉʊʋʌzʐʑʒθssάέήίόύώἀιἁιἂιἃιἄιἅιἆιἇιἠιἡιἢιἣιἤιἥιἦιἧιὠιὡιὢιὣιὤιὥιὦιὧ" + + "ιὰιαιάιᾶιι ̈͂ὴιηιήιῆι ̓̀ ̓́ ̓͂ΐ ̔̀ ̔́ ̔͂ΰ ̈̀`ὼιωιώιῶι′′′′′‵‵‵‵‵!!???!!?" + + "′′′′0456789+=()rsħnoqsmtmωåאבגדπ1⁄71⁄91⁄101⁄32⁄31⁄52⁄53⁄54⁄51⁄65⁄61⁄83" + + "⁄85⁄87⁄81⁄iiivviviiiixxi0⁄3∫∫∫∫∫∮∮∮∮∮1011121314151617181920(10)(11)(12" + + ")(13)(14)(15)(16)(17)(18)(19)(20)∫∫∫∫==⫝̸ɫɽȿɀ. ゙ ゚よりコト(ᄀ)(ᄂ)(ᄃ)(ᄅ)(ᄆ)(ᄇ)" + + "(ᄉ)(ᄋ)(ᄌ)(ᄎ)(ᄏ)(ᄐ)(ᄑ)(ᄒ)(가)(나)(다)(라)(마)(바)(사)(아)(자)(차)(카)(타)(파)(하)(주)(오전" + + ")(오후)(一)(二)(三)(四)(五)(六)(七)(八)(九)(十)(月)(火)(水)(木)(金)(土)(日)(株)(有)(社)(名)(特)(" + + "財)(祝)(労)(代)(呼)(学)(監)(企)(資)(協)(祭)(休)(自)(至)21222324252627282930313233343" + + "5참고주의3637383940414243444546474849501月2月3月4月5月6月7月8月9月10月11月12月hgev令和アパート" + + "アルファアンペアアールイニングインチウォンエスクードエーカーオンスオームカイリカラットカロリーガロンガンマギガギニーキュリーギルダーキロキロ" + + "グラムキロメートルキロワットグラムグラムトンクルゼイロクローネケースコルナコーポサイクルサンチームシリングセンチセントダースデシドルトンナノ" + + "ノットハイツパーセントパーツバーレルピアストルピクルピコビルファラッドフィートブッシェルフランヘクタールペソペニヒヘルツペンスページベータポ" + + "イントボルトホンポンドホールホーンマイクロマイルマッハマルクマンションミクロンミリミリバールメガメガトンメートルヤードヤールユアンリットルリ" + + "ラルピールーブルレムレントゲンワット0点1点2点3点4点5点6点7点8点9点10点11点12点13点14点15点16点17点18点19点20" + + "点21点22点23点24点daauovpcdmiu平成昭和大正明治株式会社panamakakbmbgbkcalpfnfmgkghzmldlk" + + "lfmnmmmcmkmm2m3m∕sm∕s2rad∕srad∕s2psnsmspvnvmvkvpwnwmwkwbqcccdc∕kgdbgyhah" + + "pinkkktlmlnlxphprsrsvwbv∕ma∕m1日2日3日4日5日6日7日8日9日10日11日12日13日14日15日16日17日1" + + "8日19日20日21日22日23日24日25日26日27日28日29日30日31日ьɦɬʞʇœʍ𤋮𢡊𢡄𣏕𥉉𥳐𧻓fffiflstմնմեմիվնմ" + + "խיִײַעהכלםרתשׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּו" + + "ֹבֿכֿפֿאלٱٻپڀٺٿٹڤڦڄڃچڇڍڌڎڈژڑکگڳڱںڻۀہھےۓڭۇۆۈۋۅۉېىئائەئوئۇئۆئۈئېئىیئجئحئم" + + "ئيبجبحبخبمبىبيتجتحتختمتىتيثجثمثىثيجحجمحجحمخجخحخمسجسحسخسمصحصمضجضحضخضمطحط" + + "مظمعجعمغجغمفجفحفخفمفىفيقحقمقىقيكاكجكحكخكلكمكىكيلجلحلخلملىليمجمحمخمممىمي" + + "نجنحنخنمنىنيهجهمهىهييجيحيخيميىييذٰرٰىٰ ٌّ ٍّ َّ ُّ ِّ ّٰئرئزئنبربزبنترت" + + "زتنثرثزثنمانرنزننيريزينئخئهبهتهصخلهنههٰيهثهسهشمشهـَّـُّـِّطىطيعىعيغىغيس" + + "ىسيشىشيحىحيجىجيخىخيصىصيضىضيشجشحشخشرسرصرضراًتجمتحجتحمتخمتمجتمحتمخجمححميح" + + "مىسحجسجحسجىسمحسمجسممصححصممشحمشجيشمخشممضحىضخمطمحطممطميعجمعممعمىغممغميغمى" + + "فخمقمحقمملحملحيلحىلججلخملمحمحجمحممحيمجحمجممخجمخممجخهمجهممنحمنحىنجمنجىنم" + + "ينمىيممبخيتجيتجىتخيتخىتميتمىجميجحىجمىسخىصحيشحيضحيلجيلمييحييجييميمميقمين" + + "حيعميكمينجحمخيلجمكممجحيحجيمجيفميبحيسخينجيصلےقلےاللهاكبرمحمدصلعمرسولعليه" + + "وسلمصلىصلى الله عليه وسلمجل جلالهریال,:!?_{}[]#&*-<>\\$%@ـًـَـُـِـّـْءآ" + + "أؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهويلآلألإلا\x22'/^|~¢£¬¦¥𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱" + + "𝅘𝅥𝅲𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯ıȷαεζηκλμνξοστυψ∇∂ϝٮڡٯ0,1,2,3,4,5,6,7,8,9,(a)(b)(c" + + ")(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)〔s" + + "〕wzhvsdppvwcmcmdmrdjほかココサ手字双デ二多解天交映無料前後再新初終生販声吹演投捕一三遊左中右指走打禁空合満有月申割営配〔" + + "本〕〔三〕〔二〕〔安〕〔点〕〔打〕〔盗〕〔勝〕〔敗〕得可丽丸乁你侮侻倂偺備僧像㒞免兔兤具㒹內冗冤仌冬况凵刃㓟刻剆剷㔕勇勉勤勺包匆北卉卑博即卽" + + "卿灰及叟叫叱吆咞吸呈周咢哶唐啓啣善喙喫喳嗂圖嘆圗噑噴切壮城埴堍型堲報墬売壷夆夢奢姬娛娧姘婦㛮嬈嬾寃寘寧寳寿将尢㞁屠屮峀岍嵃嵮嵫嵼巡巢㠯巽帨帽" + + "幩㡢㡼庰庳庶廊廾舁弢㣇形彫㣣徚忍志忹悁㤺㤜悔惇慈慌慎慺憎憲憤憯懞懲懶成戛扝抱拔捐挽拼捨掃揤搢揅掩㨮摩摾撝摷㩬敏敬旣書晉㬙暑㬈㫤冒冕最暜肭䏙朗" + + "望朡杞杓㭉柺枅桒梅梎栟椔㮝楂榣槪檨櫛㰘次歔㱎歲殟殺殻汎沿泍汧洖派海流浩浸涅洴港湮㴳滋滇淹潮濆瀹瀞瀛㶖灊災灷炭煅熜爨爵牐犀犕獺王㺬玥㺸瑇瑜瑱璅" + + "瓊㼛甤甾異瘐㿼䀈直眞真睊䀹瞋䁆䂖硎碌磌䃣祖福秫䄯穀穊穏䈂篆築䈧糒䊠糨糣紀絣䌁緇縂繅䌴䍙罺羕翺者聠聰䏕育脃䐋脾媵舄辞䑫芑芋芝劳花芳芽苦若茝荣莭" + + "茣莽菧著荓菊菌菜䔫蓱蓳蔖蕤䕝䕡䕫虐虜虧虩蚩蚈蜎蛢蝹蜨蝫螆蟡蠁䗹衠衣裗裞䘵裺㒻䚾䛇誠諭變豕貫賁贛起跋趼跰軔輸邔郱鄑鄛鈸鋗鋘鉼鏹鐕開䦕閷䧦雃嶲霣" + + "䩮䩶韠䪲頋頩飢䬳餩馧駂駾䯎鬒鱀鳽䳎䳭鵧䳸麻䵖黹黾鼅鼏鼖鼻" + +var mappingIndex = []uint16{ // 1650 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0001, 0x0004, 0x0005, 0x0008, 0x0009, 0x000a, + 0x000d, 0x0010, 0x0011, 0x0012, 0x0017, 0x001c, 0x0021, 0x0024, + 0x0027, 0x002a, 0x002b, 0x002e, 0x0031, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048, + 0x004b, 0x004c, 0x004d, 0x0051, 0x0054, 0x0055, 0x005a, 0x005e, + 0x0062, 0x0066, 0x006a, 0x006e, 0x0074, 0x007a, 0x0080, 0x0086, + 0x008c, 0x0092, 0x0098, 0x009e, 0x00a4, 0x00aa, 0x00b0, 0x00b6, + 0x00bc, 0x00c2, 0x00c8, 0x00ce, 0x00d4, 0x00da, 0x00e0, 0x00e6, + // Entry 40 - 7F + 0x00ec, 0x00f2, 0x00f8, 0x00fe, 0x0104, 0x010a, 0x0110, 0x0116, + 0x011c, 0x0122, 0x0128, 0x012e, 0x0137, 0x013d, 0x0146, 0x014c, + 0x0152, 0x0158, 0x015e, 0x0164, 0x016a, 0x0170, 0x0172, 0x0174, + 0x0176, 0x0178, 0x017a, 0x017c, 0x017e, 0x0180, 0x0181, 0x0182, + 0x0183, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018c, + 0x018d, 0x018e, 0x018f, 0x0191, 0x0193, 0x0195, 0x0197, 0x0199, + 0x019b, 0x019d, 0x019f, 0x01a0, 0x01a2, 0x01a4, 0x01a6, 0x01a8, + 0x01aa, 0x01ac, 0x01ae, 0x01b0, 0x01b1, 0x01b3, 0x01b5, 0x01b6, + // Entry 80 - BF + 0x01b8, 0x01ba, 0x01bc, 0x01be, 0x01c0, 0x01c2, 0x01c4, 0x01c6, + 0x01c8, 0x01ca, 0x01cc, 0x01ce, 0x01d0, 0x01d2, 0x01d4, 0x01d6, + 0x01d8, 0x01da, 0x01dc, 0x01de, 0x01e0, 0x01e2, 0x01e4, 0x01e5, + 0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, 0x01f1, 0x01f3, 0x01f5, + 0x01f7, 0x01f9, 0x01fb, 0x01fd, 0x0202, 0x0207, 0x020c, 0x0211, + 0x0216, 0x021b, 0x0220, 0x0225, 0x022a, 0x022f, 0x0234, 0x0239, + 0x023e, 0x0243, 0x0248, 0x024d, 0x0252, 0x0257, 0x025c, 0x0261, + 0x0266, 0x026b, 0x0270, 0x0275, 0x027a, 0x027e, 0x0282, 0x0287, + // Entry C0 - FF + 0x0289, 0x028e, 0x0293, 0x0297, 0x029b, 0x02a0, 0x02a5, 0x02aa, + 0x02af, 0x02b1, 0x02b6, 0x02bb, 0x02c0, 0x02c2, 0x02c7, 0x02c8, + 0x02cd, 0x02d1, 0x02d5, 0x02da, 0x02e0, 0x02e9, 0x02ef, 0x02f8, + 0x02fa, 0x02fc, 0x02fe, 0x0300, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0319, 0x031b, 0x031d, 0x031e, 0x0320, 0x0322, 0x0324, 0x0326, + 0x0328, 0x032a, 0x032c, 0x032e, 0x0330, 0x0335, 0x033a, 0x0340, + 0x0345, 0x034a, 0x034f, 0x0354, 0x0359, 0x035e, 0x0363, 0x0368, + // Entry 100 - 13F + 0x036d, 0x0372, 0x0377, 0x037c, 0x0380, 0x0382, 0x0384, 0x0386, + 0x038a, 0x038c, 0x038e, 0x0393, 0x0399, 0x03a2, 0x03a8, 0x03b1, + 0x03b3, 0x03b5, 0x03b7, 0x03b9, 0x03bb, 0x03bd, 0x03bf, 0x03c1, + 0x03c3, 0x03c5, 0x03c7, 0x03cb, 0x03cf, 0x03d3, 0x03d7, 0x03db, + 0x03df, 0x03e3, 0x03e7, 0x03eb, 0x03ef, 0x03f3, 0x03ff, 0x0401, + 0x0406, 0x0408, 0x040a, 0x040c, 0x040e, 0x040f, 0x0413, 0x0417, + 0x041d, 0x0423, 0x0428, 0x042d, 0x0432, 0x0437, 0x043c, 0x0441, + 0x0446, 0x044b, 0x0450, 0x0455, 0x045a, 0x045f, 0x0464, 0x0469, + // Entry 140 - 17F + 0x046e, 0x0473, 0x0478, 0x047d, 0x0482, 0x0487, 0x048c, 0x0491, + 0x0496, 0x049b, 0x04a0, 0x04a5, 0x04aa, 0x04af, 0x04b4, 0x04bc, + 0x04c4, 0x04c9, 0x04ce, 0x04d3, 0x04d8, 0x04dd, 0x04e2, 0x04e7, + 0x04ec, 0x04f1, 0x04f6, 0x04fb, 0x0500, 0x0505, 0x050a, 0x050f, + 0x0514, 0x0519, 0x051e, 0x0523, 0x0528, 0x052d, 0x0532, 0x0537, + 0x053c, 0x0541, 0x0546, 0x054b, 0x0550, 0x0555, 0x055a, 0x055f, + 0x0564, 0x0569, 0x056e, 0x0573, 0x0578, 0x057a, 0x057c, 0x057e, + 0x0580, 0x0582, 0x0584, 0x0586, 0x0588, 0x058a, 0x058c, 0x058e, + // Entry 180 - 1BF + 0x0590, 0x0592, 0x0594, 0x0596, 0x059c, 0x05a2, 0x05a4, 0x05a6, + 0x05a8, 0x05aa, 0x05ac, 0x05ae, 0x05b0, 0x05b2, 0x05b4, 0x05b6, + 0x05b8, 0x05ba, 0x05bc, 0x05be, 0x05c0, 0x05c4, 0x05c8, 0x05cc, + 0x05d0, 0x05d4, 0x05d8, 0x05dc, 0x05e0, 0x05e4, 0x05e9, 0x05ee, + 0x05f3, 0x05f5, 0x05f7, 0x05fd, 0x0609, 0x0615, 0x0621, 0x062a, + 0x0636, 0x063f, 0x0648, 0x0657, 0x0663, 0x066c, 0x0675, 0x067e, + 0x068a, 0x0696, 0x069f, 0x06a8, 0x06ae, 0x06b7, 0x06c3, 0x06cf, + 0x06d5, 0x06e4, 0x06f6, 0x0705, 0x070e, 0x071d, 0x072c, 0x0738, + // Entry 1C0 - 1FF + 0x0741, 0x074a, 0x0753, 0x075f, 0x076e, 0x077a, 0x0783, 0x078c, + 0x0795, 0x079b, 0x07a1, 0x07a7, 0x07ad, 0x07b6, 0x07bf, 0x07ce, + 0x07d7, 0x07e3, 0x07f2, 0x07fb, 0x0801, 0x0807, 0x0816, 0x0822, + 0x0831, 0x083a, 0x0849, 0x084f, 0x0858, 0x0861, 0x086a, 0x0873, + 0x087c, 0x0888, 0x0891, 0x0897, 0x08a0, 0x08a9, 0x08b2, 0x08be, + 0x08c7, 0x08d0, 0x08d9, 0x08e8, 0x08f4, 0x08fa, 0x0909, 0x090f, + 0x091b, 0x0927, 0x0930, 0x0939, 0x0942, 0x094e, 0x0954, 0x095d, + 0x0969, 0x096f, 0x097e, 0x0987, 0x098b, 0x098f, 0x0993, 0x0997, + // Entry 200 - 23F + 0x099b, 0x099f, 0x09a3, 0x09a7, 0x09ab, 0x09af, 0x09b4, 0x09b9, + 0x09be, 0x09c3, 0x09c8, 0x09cd, 0x09d2, 0x09d7, 0x09dc, 0x09e1, + 0x09e6, 0x09eb, 0x09f0, 0x09f5, 0x09fa, 0x09fc, 0x09fe, 0x0a00, + 0x0a02, 0x0a04, 0x0a06, 0x0a0c, 0x0a12, 0x0a18, 0x0a1e, 0x0a2a, + 0x0a2c, 0x0a2e, 0x0a30, 0x0a32, 0x0a34, 0x0a36, 0x0a38, 0x0a3c, + 0x0a3e, 0x0a40, 0x0a42, 0x0a44, 0x0a46, 0x0a48, 0x0a4a, 0x0a4c, + 0x0a4e, 0x0a50, 0x0a52, 0x0a54, 0x0a56, 0x0a58, 0x0a5a, 0x0a5f, + 0x0a65, 0x0a6c, 0x0a74, 0x0a76, 0x0a78, 0x0a7a, 0x0a7c, 0x0a7e, + // Entry 240 - 27F + 0x0a80, 0x0a82, 0x0a84, 0x0a86, 0x0a88, 0x0a8a, 0x0a8c, 0x0a8e, + 0x0a90, 0x0a96, 0x0a98, 0x0a9a, 0x0a9c, 0x0a9e, 0x0aa0, 0x0aa2, + 0x0aa4, 0x0aa6, 0x0aa8, 0x0aaa, 0x0aac, 0x0aae, 0x0ab0, 0x0ab2, + 0x0ab4, 0x0ab9, 0x0abe, 0x0ac2, 0x0ac6, 0x0aca, 0x0ace, 0x0ad2, + 0x0ad6, 0x0ada, 0x0ade, 0x0ae2, 0x0ae7, 0x0aec, 0x0af1, 0x0af6, + 0x0afb, 0x0b00, 0x0b05, 0x0b0a, 0x0b0f, 0x0b14, 0x0b19, 0x0b1e, + 0x0b23, 0x0b28, 0x0b2d, 0x0b32, 0x0b37, 0x0b3c, 0x0b41, 0x0b46, + 0x0b4b, 0x0b50, 0x0b52, 0x0b54, 0x0b56, 0x0b58, 0x0b5a, 0x0b5c, + // Entry 280 - 2BF + 0x0b5e, 0x0b62, 0x0b66, 0x0b6a, 0x0b6e, 0x0b72, 0x0b76, 0x0b7a, + 0x0b7c, 0x0b7e, 0x0b80, 0x0b82, 0x0b86, 0x0b8a, 0x0b8e, 0x0b92, + 0x0b96, 0x0b9a, 0x0b9e, 0x0ba0, 0x0ba2, 0x0ba4, 0x0ba6, 0x0ba8, + 0x0baa, 0x0bac, 0x0bb0, 0x0bb4, 0x0bba, 0x0bc0, 0x0bc4, 0x0bc8, + 0x0bcc, 0x0bd0, 0x0bd4, 0x0bd8, 0x0bdc, 0x0be0, 0x0be4, 0x0be8, + 0x0bec, 0x0bf0, 0x0bf4, 0x0bf8, 0x0bfc, 0x0c00, 0x0c04, 0x0c08, + 0x0c0c, 0x0c10, 0x0c14, 0x0c18, 0x0c1c, 0x0c20, 0x0c24, 0x0c28, + 0x0c2c, 0x0c30, 0x0c34, 0x0c36, 0x0c38, 0x0c3a, 0x0c3c, 0x0c3e, + // Entry 2C0 - 2FF + 0x0c40, 0x0c42, 0x0c44, 0x0c46, 0x0c48, 0x0c4a, 0x0c4c, 0x0c4e, + 0x0c50, 0x0c52, 0x0c54, 0x0c56, 0x0c58, 0x0c5a, 0x0c5c, 0x0c5e, + 0x0c60, 0x0c62, 0x0c64, 0x0c66, 0x0c68, 0x0c6a, 0x0c6c, 0x0c6e, + 0x0c70, 0x0c72, 0x0c74, 0x0c76, 0x0c78, 0x0c7a, 0x0c7c, 0x0c7e, + 0x0c80, 0x0c82, 0x0c86, 0x0c8a, 0x0c8e, 0x0c92, 0x0c96, 0x0c9a, + 0x0c9e, 0x0ca2, 0x0ca4, 0x0ca8, 0x0cac, 0x0cb0, 0x0cb4, 0x0cb8, + 0x0cbc, 0x0cc0, 0x0cc4, 0x0cc8, 0x0ccc, 0x0cd0, 0x0cd4, 0x0cd8, + 0x0cdc, 0x0ce0, 0x0ce4, 0x0ce8, 0x0cec, 0x0cf0, 0x0cf4, 0x0cf8, + // Entry 300 - 33F + 0x0cfc, 0x0d00, 0x0d04, 0x0d08, 0x0d0c, 0x0d10, 0x0d14, 0x0d18, + 0x0d1c, 0x0d20, 0x0d24, 0x0d28, 0x0d2c, 0x0d30, 0x0d34, 0x0d38, + 0x0d3c, 0x0d40, 0x0d44, 0x0d48, 0x0d4c, 0x0d50, 0x0d54, 0x0d58, + 0x0d5c, 0x0d60, 0x0d64, 0x0d68, 0x0d6c, 0x0d70, 0x0d74, 0x0d78, + 0x0d7c, 0x0d80, 0x0d84, 0x0d88, 0x0d8c, 0x0d90, 0x0d94, 0x0d98, + 0x0d9c, 0x0da0, 0x0da4, 0x0da8, 0x0dac, 0x0db0, 0x0db4, 0x0db8, + 0x0dbc, 0x0dc0, 0x0dc4, 0x0dc8, 0x0dcc, 0x0dd0, 0x0dd4, 0x0dd8, + 0x0ddc, 0x0de0, 0x0de4, 0x0de8, 0x0dec, 0x0df0, 0x0df4, 0x0df8, + // Entry 340 - 37F + 0x0dfc, 0x0e00, 0x0e04, 0x0e08, 0x0e0c, 0x0e10, 0x0e14, 0x0e18, + 0x0e1d, 0x0e22, 0x0e27, 0x0e2c, 0x0e31, 0x0e36, 0x0e3a, 0x0e3e, + 0x0e42, 0x0e46, 0x0e4a, 0x0e4e, 0x0e52, 0x0e56, 0x0e5a, 0x0e5e, + 0x0e62, 0x0e66, 0x0e6a, 0x0e6e, 0x0e72, 0x0e76, 0x0e7a, 0x0e7e, + 0x0e82, 0x0e86, 0x0e8a, 0x0e8e, 0x0e92, 0x0e96, 0x0e9a, 0x0e9e, + 0x0ea2, 0x0ea6, 0x0eaa, 0x0eae, 0x0eb2, 0x0eb6, 0x0ebc, 0x0ec2, + 0x0ec8, 0x0ecc, 0x0ed0, 0x0ed4, 0x0ed8, 0x0edc, 0x0ee0, 0x0ee4, + 0x0ee8, 0x0eec, 0x0ef0, 0x0ef4, 0x0ef8, 0x0efc, 0x0f00, 0x0f04, + // Entry 380 - 3BF + 0x0f08, 0x0f0c, 0x0f10, 0x0f14, 0x0f18, 0x0f1c, 0x0f20, 0x0f24, + 0x0f28, 0x0f2c, 0x0f30, 0x0f34, 0x0f38, 0x0f3e, 0x0f44, 0x0f4a, + 0x0f50, 0x0f56, 0x0f5c, 0x0f62, 0x0f68, 0x0f6e, 0x0f74, 0x0f7a, + 0x0f80, 0x0f86, 0x0f8c, 0x0f92, 0x0f98, 0x0f9e, 0x0fa4, 0x0faa, + 0x0fb0, 0x0fb6, 0x0fbc, 0x0fc2, 0x0fc8, 0x0fce, 0x0fd4, 0x0fda, + 0x0fe0, 0x0fe6, 0x0fec, 0x0ff2, 0x0ff8, 0x0ffe, 0x1004, 0x100a, + 0x1010, 0x1016, 0x101c, 0x1022, 0x1028, 0x102e, 0x1034, 0x103a, + 0x1040, 0x1046, 0x104c, 0x1052, 0x1058, 0x105e, 0x1064, 0x106a, + // Entry 3C0 - 3FF + 0x1070, 0x1076, 0x107c, 0x1082, 0x1088, 0x108e, 0x1094, 0x109a, + 0x10a0, 0x10a6, 0x10ac, 0x10b2, 0x10b8, 0x10be, 0x10c4, 0x10ca, + 0x10d0, 0x10d6, 0x10dc, 0x10e2, 0x10e8, 0x10ee, 0x10f4, 0x10fa, + 0x1100, 0x1106, 0x110c, 0x1112, 0x1118, 0x111e, 0x1124, 0x112a, + 0x1130, 0x1136, 0x113c, 0x1142, 0x1148, 0x114e, 0x1154, 0x115a, + 0x1160, 0x1166, 0x116c, 0x1172, 0x1178, 0x1180, 0x1188, 0x1190, + 0x1198, 0x11a0, 0x11a8, 0x11b0, 0x11b6, 0x11d7, 0x11e6, 0x11ee, + 0x11ef, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6, + // Entry 400 - 43F + 0x11f7, 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, + 0x11ff, 0x1200, 0x1201, 0x1205, 0x1209, 0x120d, 0x1211, 0x1215, + 0x1219, 0x121b, 0x121d, 0x121f, 0x1221, 0x1223, 0x1225, 0x1227, + 0x1229, 0x122b, 0x122d, 0x122f, 0x1231, 0x1233, 0x1235, 0x1237, + 0x1239, 0x123b, 0x123d, 0x123f, 0x1241, 0x1243, 0x1245, 0x1247, + 0x1249, 0x124b, 0x124d, 0x124f, 0x1251, 0x1253, 0x1255, 0x1257, + 0x1259, 0x125b, 0x125d, 0x125f, 0x1263, 0x1267, 0x126b, 0x126f, + 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1277, 0x1279, + // Entry 440 - 47F + 0x127b, 0x127d, 0x127f, 0x1287, 0x128f, 0x129b, 0x12a7, 0x12b3, + 0x12bf, 0x12cb, 0x12d3, 0x12db, 0x12e7, 0x12f3, 0x12ff, 0x130b, + 0x130d, 0x130f, 0x1311, 0x1313, 0x1315, 0x1317, 0x1319, 0x131b, + 0x131d, 0x131f, 0x1321, 0x1323, 0x1325, 0x1327, 0x1329, 0x132b, + 0x132e, 0x1331, 0x1333, 0x1335, 0x1337, 0x1339, 0x133b, 0x133d, + 0x133f, 0x1341, 0x1343, 0x1345, 0x1347, 0x1349, 0x134b, 0x134d, + 0x1350, 0x1353, 0x1356, 0x1359, 0x135c, 0x135f, 0x1362, 0x1365, + 0x1368, 0x136b, 0x136e, 0x1371, 0x1374, 0x1377, 0x137a, 0x137d, + // Entry 480 - 4BF + 0x1380, 0x1383, 0x1386, 0x1389, 0x138c, 0x138f, 0x1392, 0x1395, + 0x1398, 0x139b, 0x13a2, 0x13a4, 0x13a6, 0x13a8, 0x13ab, 0x13ad, + 0x13af, 0x13b1, 0x13b3, 0x13b5, 0x13bb, 0x13c1, 0x13c4, 0x13c7, + 0x13ca, 0x13cd, 0x13d0, 0x13d3, 0x13d6, 0x13d9, 0x13dc, 0x13df, + 0x13e2, 0x13e5, 0x13e8, 0x13eb, 0x13ee, 0x13f1, 0x13f4, 0x13f7, + 0x13fa, 0x13fd, 0x1400, 0x1403, 0x1406, 0x1409, 0x140c, 0x140f, + 0x1412, 0x1415, 0x1418, 0x141b, 0x141e, 0x1421, 0x1424, 0x1427, + 0x142a, 0x142d, 0x1430, 0x1433, 0x1436, 0x1439, 0x143c, 0x143f, + // Entry 4C0 - 4FF + 0x1442, 0x1445, 0x1448, 0x1451, 0x145a, 0x1463, 0x146c, 0x1475, + 0x147e, 0x1487, 0x1490, 0x1499, 0x149c, 0x149f, 0x14a2, 0x14a5, + 0x14a8, 0x14ab, 0x14ae, 0x14b1, 0x14b4, 0x14b7, 0x14ba, 0x14bd, + 0x14c0, 0x14c3, 0x14c6, 0x14c9, 0x14cc, 0x14cf, 0x14d2, 0x14d5, + 0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4, 0x14e7, 0x14ea, 0x14ed, + 0x14f0, 0x14f3, 0x14f6, 0x14f9, 0x14fc, 0x14ff, 0x1502, 0x1505, + 0x1508, 0x150b, 0x150e, 0x1511, 0x1514, 0x1517, 0x151a, 0x151d, + 0x1520, 0x1523, 0x1526, 0x1529, 0x152c, 0x152f, 0x1532, 0x1535, + // Entry 500 - 53F + 0x1538, 0x153b, 0x153e, 0x1541, 0x1544, 0x1547, 0x154a, 0x154d, + 0x1550, 0x1553, 0x1556, 0x1559, 0x155c, 0x155f, 0x1562, 0x1565, + 0x1568, 0x156b, 0x156e, 0x1571, 0x1574, 0x1577, 0x157a, 0x157d, + 0x1580, 0x1583, 0x1586, 0x1589, 0x158c, 0x158f, 0x1592, 0x1595, + 0x1598, 0x159b, 0x159e, 0x15a1, 0x15a4, 0x15a7, 0x15aa, 0x15ad, + 0x15b0, 0x15b3, 0x15b6, 0x15b9, 0x15bc, 0x15bf, 0x15c2, 0x15c5, + 0x15c8, 0x15cb, 0x15ce, 0x15d1, 0x15d4, 0x15d7, 0x15da, 0x15dd, + 0x15e0, 0x15e3, 0x15e6, 0x15e9, 0x15ec, 0x15ef, 0x15f2, 0x15f5, + // Entry 540 - 57F + 0x15f8, 0x15fb, 0x15fe, 0x1601, 0x1604, 0x1607, 0x160a, 0x160d, + 0x1610, 0x1613, 0x1616, 0x1619, 0x161c, 0x161f, 0x1622, 0x1625, + 0x1628, 0x162b, 0x162e, 0x1631, 0x1634, 0x1637, 0x163a, 0x163d, + 0x1640, 0x1643, 0x1646, 0x1649, 0x164c, 0x164f, 0x1652, 0x1655, + 0x1658, 0x165b, 0x165e, 0x1661, 0x1664, 0x1667, 0x166a, 0x166d, + 0x1670, 0x1673, 0x1676, 0x1679, 0x167c, 0x167f, 0x1682, 0x1685, + 0x1688, 0x168b, 0x168e, 0x1691, 0x1694, 0x1697, 0x169a, 0x169d, + 0x16a0, 0x16a3, 0x16a6, 0x16a9, 0x16ac, 0x16af, 0x16b2, 0x16b5, + // Entry 580 - 5BF + 0x16b8, 0x16bb, 0x16be, 0x16c1, 0x16c4, 0x16c7, 0x16ca, 0x16cd, + 0x16d0, 0x16d3, 0x16d6, 0x16d9, 0x16dc, 0x16df, 0x16e2, 0x16e5, + 0x16e8, 0x16eb, 0x16ee, 0x16f1, 0x16f4, 0x16f7, 0x16fa, 0x16fd, + 0x1700, 0x1703, 0x1706, 0x1709, 0x170c, 0x170f, 0x1712, 0x1715, + 0x1718, 0x171b, 0x171e, 0x1721, 0x1724, 0x1727, 0x172a, 0x172d, + 0x1730, 0x1733, 0x1736, 0x1739, 0x173c, 0x173f, 0x1742, 0x1745, + 0x1748, 0x174b, 0x174e, 0x1751, 0x1754, 0x1757, 0x175a, 0x175d, + 0x1760, 0x1763, 0x1766, 0x1769, 0x176c, 0x176f, 0x1772, 0x1775, + // Entry 5C0 - 5FF + 0x1778, 0x177b, 0x177e, 0x1781, 0x1784, 0x1787, 0x178a, 0x178d, + 0x1790, 0x1793, 0x1796, 0x1799, 0x179c, 0x179f, 0x17a2, 0x17a5, + 0x17a8, 0x17ab, 0x17ae, 0x17b1, 0x17b4, 0x17b7, 0x17ba, 0x17bd, + 0x17c0, 0x17c3, 0x17c6, 0x17c9, 0x17cc, 0x17cf, 0x17d2, 0x17d5, + 0x17d8, 0x17db, 0x17de, 0x17e1, 0x17e4, 0x17e7, 0x17ea, 0x17ed, + 0x17f0, 0x17f3, 0x17f6, 0x17f9, 0x17fc, 0x17ff, 0x1802, 0x1805, + 0x1808, 0x180b, 0x180e, 0x1811, 0x1814, 0x1817, 0x181a, 0x181d, + 0x1820, 0x1823, 0x1826, 0x1829, 0x182c, 0x182f, 0x1832, 0x1835, + // Entry 600 - 63F + 0x1838, 0x183b, 0x183e, 0x1841, 0x1844, 0x1847, 0x184a, 0x184d, + 0x1850, 0x1853, 0x1856, 0x1859, 0x185c, 0x185f, 0x1862, 0x1865, + 0x1868, 0x186b, 0x186e, 0x1871, 0x1874, 0x1877, 0x187a, 0x187d, + 0x1880, 0x1883, 0x1886, 0x1889, 0x188c, 0x188f, 0x1892, 0x1895, + 0x1898, 0x189b, 0x189e, 0x18a1, 0x18a4, 0x18a7, 0x18aa, 0x18ad, + 0x18b0, 0x18b3, 0x18b6, 0x18b9, 0x18bc, 0x18bf, 0x18c2, 0x18c5, + 0x18c8, 0x18cb, 0x18ce, 0x18d1, 0x18d4, 0x18d7, 0x18da, 0x18dd, + 0x18e0, 0x18e3, 0x18e6, 0x18e9, 0x18ec, 0x18ef, 0x18f2, 0x18f5, + // Entry 640 - 67F + 0x18f8, 0x18fb, 0x18fe, 0x1901, 0x1904, 0x1907, 0x190a, 0x190d, + 0x1910, 0x1913, 0x1916, 0x1919, 0x191c, 0x191f, 0x1922, 0x1925, + 0x1928, 0x192b, 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, + 0x1940, 0x1943, 0x1946, 0x1949, 0x194c, 0x194f, 0x1952, 0x1955, + 0x1958, 0x195b, 0x195e, 0x1961, 0x1964, 0x1967, 0x196a, 0x196d, + 0x1970, 0x1973, 0x1976, 0x1979, 0x197c, 0x197f, 0x1982, 0x1985, + 0x1988, 0x198b, +} // Size: 3324 bytes var xorData string = "" + // Size: 4862 bytes "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + @@ -547,7 +690,7 @@ func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { return 0 } -// idnaTrie. Total size: 30288 bytes (29.58 KiB). Checksum: c0cd84404a2f6f19. +// idnaTrie. Total size: 30196 bytes (29.49 KiB). Checksum: e2ae95a945f04016. type idnaTrie struct{} func newIdnaTrie(i int) *idnaTrie { @@ -600,11 +743,11 @@ var idnaValues = [8192]uint16{ 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, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x0012, 0xe9: 0x0018, + 0xea: 0x0019, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x0022, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0029, 0xf3: 0x0031, 0xf4: 0x003a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x0042, 0xf9: 0x0049, 0xfa: 0x0051, 0xfb: 0x0018, + 0xfc: 0x0059, 0xfd: 0x0061, 0xfe: 0x0069, 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, @@ -614,12 +757,12 @@ var idnaValues = [8192]uint16{ 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, + 0x130: 0x0071, 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, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0079, // 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, + 0x140: 0x0079, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x0081, 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, @@ -628,7 +771,7 @@ var idnaValues = [8192]uint16{ 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, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x0089, // 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, @@ -642,8 +785,8 @@ var idnaValues = [8192]uint16{ 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, + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x0091, 0x1c5: 0x0091, + 0x1c6: 0x0091, 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, @@ -663,22 +806,22 @@ var idnaValues = [8192]uint16{ 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, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0099, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x00a1, 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, + 0x258: 0x00d2, 0x259: 0x00da, 0x25a: 0x00e2, 0x25b: 0x00ea, 0x25c: 0x00f2, 0x25d: 0x00fa, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0101, 0x262: 0x0089, 0x263: 0x0109, 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: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0111, 0x285: 0x040d, 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, @@ -687,10 +830,10 @@ var idnaValues = [8192]uint16{ 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, 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, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x011a, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x0122, 0x2bf: 0x043d, // Block 0xb, offset 0x2c0 - 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x003a, 0x2c5: 0x012a, 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, @@ -782,8 +925,8 @@ var idnaValues = [8192]uint16{ 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, - 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, - 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0139, + 0x4b6: 0x0141, 0x4b7: 0x0149, 0x4b8: 0x0151, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, // Block 0x13, offset 0x4c0 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, @@ -826,8 +969,8 @@ var idnaValues = [8192]uint16{ 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008, 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308, 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308, - 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1, - 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, + 0x598: 0x0159, 0x599: 0x0161, 0x59a: 0x0169, 0x59b: 0x0171, 0x59c: 0x0179, 0x59d: 0x0181, + 0x59e: 0x0189, 0x59f: 0x0191, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, @@ -850,8 +993,8 @@ var idnaValues = [8192]uint16{ 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008, 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040, 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008, - 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1, - 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, + 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0199, 0x61d: 0x01a1, + 0x61e: 0x0040, 0x61f: 0x01a9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, 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: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018, @@ -866,16 +1009,16 @@ var idnaValues = [8192]uint16{ 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: 0x0731, 0x674: 0x0040, 0x675: 0x0008, - 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x01b1, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x01b9, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008, // Block 0x1a, offset 0x680 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040, 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308, 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308, 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, - 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040, - 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, + 0x698: 0x0040, 0x699: 0x01c1, 0x69a: 0x01c9, 0x69b: 0x01d1, 0x69c: 0x0008, 0x69d: 0x0040, + 0x69e: 0x01d9, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, 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: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308, @@ -922,7 +1065,7 @@ var idnaValues = [8192]uint16{ 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008, 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x3308, 0x796: 0x3308, 0x797: 0x3008, - 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9, + 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x01e1, 0x79d: 0x01e9, 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308, 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, @@ -998,32 +1141,32 @@ var idnaValues = [8192]uint16{ 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0008, 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, - 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308, + 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x01f9, 0x934: 0x3308, 0x935: 0x3308, 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x3b08, 0x93b: 0x3308, 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040, // Block 0x25, offset 0x940 - 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008, + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0211, 0x944: 0x0008, 0x945: 0x0008, 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, - 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, - 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79, - 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0219, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0221, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0229, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0231, 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: 0x0ae9, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0239, 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040, - 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59, - 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308, + 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0241, 0x974: 0x3308, 0x975: 0x0249, + 0x976: 0x0251, 0x977: 0x0259, 0x978: 0x0261, 0x979: 0x0269, 0x97a: 0x3308, 0x97b: 0x3308, 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008, // Block 0x26, offset 0x980 - 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, + 0x980: 0x3308, 0x981: 0x0271, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308, - 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, - 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11, - 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308, - 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308, - 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, + 0x992: 0x3308, 0x993: 0x0279, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, + 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0281, + 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0289, 0x9a3: 0x3308, + 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0291, 0x9a8: 0x3308, 0x9a9: 0x3308, + 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0299, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308, - 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x02a1, 0x9ba: 0x3308, 0x9bb: 0x3308, 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018, // Block 0x27, offset 0x9c0 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, @@ -1033,34 +1176,34 @@ var idnaValues = [8192]uint16{ 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008, 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008, 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008, - 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008, - 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41, - 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008, - 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269, + 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0019, 0x9ed: 0x02e1, 0x9ee: 0x02e9, 0x9ef: 0x0008, + 0x9f0: 0x02f1, 0x9f1: 0x02f9, 0x9f2: 0x0301, 0x9f3: 0x0309, 0x9f4: 0x00a9, 0x9f5: 0x0311, + 0x9f6: 0x00b1, 0x9f7: 0x0319, 0x9f8: 0x0101, 0x9f9: 0x0321, 0x9fa: 0x0329, 0x9fb: 0x0008, + 0x9fc: 0x0051, 0x9fd: 0x0331, 0x9fe: 0x0339, 0x9ff: 0x00b9, // Block 0x28, offset 0xa00 - 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1, - 0xa06: 0x05b5, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011, - 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041, - 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05cd, 0xa15: 0x05cd, 0xa16: 0x0f99, 0xa17: 0x0fa9, - 0xa18: 0x0fb9, 0xa19: 0x05b5, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05e5, 0xa1d: 0x1099, - 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269, - 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1, - 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, + 0xa00: 0x0341, 0xa01: 0x0349, 0xa02: 0x00c1, 0xa03: 0x0019, 0xa04: 0x0351, 0xa05: 0x0359, + 0xa06: 0x05b5, 0xa07: 0x02e9, 0xa08: 0x02f1, 0xa09: 0x02f9, 0xa0a: 0x0361, 0xa0b: 0x0369, + 0xa0c: 0x0371, 0xa0d: 0x0309, 0xa0e: 0x0008, 0xa0f: 0x0319, 0xa10: 0x0321, 0xa11: 0x0379, + 0xa12: 0x0051, 0xa13: 0x0381, 0xa14: 0x05cd, 0xa15: 0x05cd, 0xa16: 0x0339, 0xa17: 0x0341, + 0xa18: 0x0349, 0xa19: 0x05b5, 0xa1a: 0x0389, 0xa1b: 0x0391, 0xa1c: 0x05e5, 0xa1d: 0x0399, + 0xa1e: 0x03a1, 0xa1f: 0x03a9, 0xa20: 0x03b1, 0xa21: 0x03b9, 0xa22: 0x0311, 0xa23: 0x00b9, + 0xa24: 0x0349, 0xa25: 0x0391, 0xa26: 0x0399, 0xa27: 0x03a1, 0xa28: 0x03c1, 0xa29: 0x03b1, + 0xa2a: 0x03b9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008, - 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, + 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x03c9, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008, // Block 0x29, offset 0xa40 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008, 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008, 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008, 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, - 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169, - 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9, - 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05fd, 0xa68: 0x1239, 0xa69: 0x1251, - 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9, - 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359, - 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x0615, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1, - 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x03d1, 0xa5c: 0x03d9, 0xa5d: 0x03e1, + 0xa5e: 0x03e9, 0xa5f: 0x0371, 0xa60: 0x03f1, 0xa61: 0x03f9, 0xa62: 0x0401, 0xa63: 0x0409, + 0xa64: 0x0411, 0xa65: 0x0419, 0xa66: 0x0421, 0xa67: 0x05fd, 0xa68: 0x0429, 0xa69: 0x0431, + 0xa6a: 0xe17d, 0xa6b: 0x0439, 0xa6c: 0x0441, 0xa6d: 0x0449, 0xa6e: 0x0451, 0xa6f: 0x0459, + 0xa70: 0x0461, 0xa71: 0x0469, 0xa72: 0x0471, 0xa73: 0x0479, 0xa74: 0x0481, 0xa75: 0x0489, + 0xa76: 0x0491, 0xa77: 0x0499, 0xa78: 0x0615, 0xa79: 0x04a1, 0xa7a: 0x04a9, 0xa7b: 0x04b1, + 0xa7c: 0x04b9, 0xa7d: 0x04c1, 0xa7e: 0x04c9, 0xa7f: 0x04d1, // Block 0x2a, offset 0xa80 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, @@ -1079,7 +1222,7 @@ var idnaValues = [8192]uint16{ 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x062d, 0xadb: 0x064d, 0xadc: 0x0008, 0xadd: 0x0008, - 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xade: 0x04d9, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, @@ -1094,33 +1237,33 @@ var idnaValues = [8192]uint16{ 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008, 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045, - 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489, - 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1, - 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040, + 0xb30: 0x0008, 0xb31: 0x04e1, 0xb32: 0x0008, 0xb33: 0x04e9, 0xb34: 0x0008, 0xb35: 0x04f1, + 0xb36: 0x0008, 0xb37: 0x04f9, 0xb38: 0x0008, 0xb39: 0x0501, 0xb3a: 0x0008, 0xb3b: 0x0509, + 0xb3c: 0x0008, 0xb3d: 0x0511, 0xb3e: 0x0040, 0xb3f: 0x0040, // Block 0x2d, offset 0xb40 - 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1, - 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591, - 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1, - 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1, - 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771, - 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891, - 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831, - 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951, - 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040, - 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x0665, 0xb7b: 0x1459, - 0xb7c: 0x19b1, 0xb7d: 0x067e, 0xb7e: 0x1a31, 0xb7f: 0x069e, + 0xb40: 0x0519, 0xb41: 0x0521, 0xb42: 0x0529, 0xb43: 0x0531, 0xb44: 0x0539, 0xb45: 0x0541, + 0xb46: 0x0549, 0xb47: 0x0551, 0xb48: 0x0519, 0xb49: 0x0521, 0xb4a: 0x0529, 0xb4b: 0x0531, + 0xb4c: 0x0539, 0xb4d: 0x0541, 0xb4e: 0x0549, 0xb4f: 0x0551, 0xb50: 0x0559, 0xb51: 0x0561, + 0xb52: 0x0569, 0xb53: 0x0571, 0xb54: 0x0579, 0xb55: 0x0581, 0xb56: 0x0589, 0xb57: 0x0591, + 0xb58: 0x0559, 0xb59: 0x0561, 0xb5a: 0x0569, 0xb5b: 0x0571, 0xb5c: 0x0579, 0xb5d: 0x0581, + 0xb5e: 0x0589, 0xb5f: 0x0591, 0xb60: 0x0599, 0xb61: 0x05a1, 0xb62: 0x05a9, 0xb63: 0x05b1, + 0xb64: 0x05b9, 0xb65: 0x05c1, 0xb66: 0x05c9, 0xb67: 0x05d1, 0xb68: 0x0599, 0xb69: 0x05a1, + 0xb6a: 0x05a9, 0xb6b: 0x05b1, 0xb6c: 0x05b9, 0xb6d: 0x05c1, 0xb6e: 0x05c9, 0xb6f: 0x05d1, + 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x05d9, 0xb73: 0x05e1, 0xb74: 0x05e9, 0xb75: 0x0040, + 0xb76: 0x0008, 0xb77: 0x05f1, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x0665, 0xb7b: 0x04e1, + 0xb7c: 0x05e1, 0xb7d: 0x067e, 0xb7e: 0x05f9, 0xb7f: 0x069e, // Block 0x2e, offset 0xb80 - 0xb80: 0x06be, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040, - 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06dd, 0xb89: 0x1471, 0xb8a: 0x06f5, 0xb8b: 0x1489, - 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008, - 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, - 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x070d, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2, - 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61, + 0xb80: 0x06be, 0xb81: 0x0602, 0xb82: 0x0609, 0xb83: 0x0611, 0xb84: 0x0619, 0xb85: 0x0040, + 0xb86: 0x0008, 0xb87: 0x0621, 0xb88: 0x06dd, 0xb89: 0x04e9, 0xb8a: 0x06f5, 0xb8b: 0x04f1, + 0xb8c: 0x0611, 0xb8d: 0x062a, 0xb8e: 0x0632, 0xb8f: 0x063a, 0xb90: 0x0008, 0xb91: 0x0008, + 0xb92: 0x0008, 0xb93: 0x0641, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, + 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x070d, 0xb9b: 0x04f9, 0xb9c: 0x0040, 0xb9d: 0x064a, + 0xb9e: 0x0652, 0xb9f: 0x065a, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x0661, 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045, - 0xbaa: 0x0725, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa, - 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040, - 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x073d, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9, - 0xbbc: 0x1ce9, 0xbbd: 0x0756, 0xbbe: 0x0776, 0xbbf: 0x0040, + 0xbaa: 0x0725, 0xbab: 0x0509, 0xbac: 0xe04d, 0xbad: 0x066a, 0xbae: 0x012a, 0xbaf: 0x0672, + 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x0679, 0xbb3: 0x0681, 0xbb4: 0x0689, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x0691, 0xbb8: 0x073d, 0xbb9: 0x0501, 0xbba: 0x0515, 0xbbb: 0x0511, + 0xbbc: 0x0681, 0xbbd: 0x0756, 0xbbe: 0x0776, 0xbbf: 0x0040, // Block 0x2f, offset 0xbc0 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a, 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0, @@ -1130,72 +1273,72 @@ var idnaValues = [8192]uint16{ 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040, 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a, - 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018, - 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, - 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x07b6, 0xbff: 0x0018, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0699, 0xbf4: 0x06a1, 0xbf5: 0x0018, + 0xbf6: 0x06a9, 0xbf7: 0x06b1, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x06ba, 0xbfd: 0x0018, 0xbfe: 0x07b6, 0xbff: 0x0018, // Block 0x30, offset 0xc00 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018, - 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018, + 0xc06: 0x0018, 0xc07: 0x06c2, 0xc08: 0x06ca, 0xc09: 0x06d2, 0xc0a: 0x0018, 0xc0b: 0x0018, 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018, - 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x06d9, 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340, 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040, 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340, - 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61, - 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07d5, - 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71, + 0xc30: 0x06e1, 0xc31: 0x0311, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x06e9, 0xc35: 0x06f1, + 0xc36: 0x06f9, 0xc37: 0x0701, 0xc38: 0x0709, 0xc39: 0x0711, 0xc3a: 0x071a, 0xc3b: 0x07d5, + 0xc3c: 0x0722, 0xc3d: 0x072a, 0xc3e: 0x0732, 0xc3f: 0x0329, // Block 0x31, offset 0xc40 - 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61, - 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07ed, - 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09, - 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359, - 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040, + 0xc40: 0x06e1, 0xc41: 0x0049, 0xc42: 0x0029, 0xc43: 0x0031, 0xc44: 0x06e9, 0xc45: 0x06f1, + 0xc46: 0x06f9, 0xc47: 0x0701, 0xc48: 0x0709, 0xc49: 0x0711, 0xc4a: 0x071a, 0xc4b: 0x07ed, + 0xc4c: 0x0722, 0xc4d: 0x072a, 0xc4e: 0x0732, 0xc4f: 0x0040, 0xc50: 0x0019, 0xc51: 0x02f9, + 0xc52: 0x0051, 0xc53: 0x0109, 0xc54: 0x0361, 0xc55: 0x00a9, 0xc56: 0x0319, 0xc57: 0x0101, + 0xc58: 0x0321, 0xc59: 0x0329, 0xc5a: 0x0339, 0xc5b: 0x0089, 0xc5c: 0x0341, 0xc5d: 0x0040, 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018, - 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018, + 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x0739, 0xc69: 0x0018, 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018, 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018, 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018, 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018, // Block 0x32, offset 0xc80 - 0xc80: 0x0806, 0xc81: 0x0826, 0xc82: 0x1159, 0xc83: 0x0845, 0xc84: 0x0018, 0xc85: 0x0866, - 0xc86: 0x0886, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x08a5, 0xc8a: 0x0f31, 0xc8b: 0x0249, - 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41, - 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018, - 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269, - 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08c5, 0xca2: 0x2061, 0xca3: 0x0018, - 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018, - 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09, - 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9, - 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08e5, - 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109, + 0xc80: 0x0806, 0xc81: 0x0826, 0xc82: 0x03d9, 0xc83: 0x0845, 0xc84: 0x0018, 0xc85: 0x0866, + 0xc86: 0x0886, 0xc87: 0x0369, 0xc88: 0x0018, 0xc89: 0x08a5, 0xc8a: 0x0309, 0xc8b: 0x00a9, + 0xc8c: 0x00a9, 0xc8d: 0x00a9, 0xc8e: 0x00a9, 0xc8f: 0x0741, 0xc90: 0x0311, 0xc91: 0x0311, + 0xc92: 0x0101, 0xc93: 0x0101, 0xc94: 0x0018, 0xc95: 0x0329, 0xc96: 0x0749, 0xc97: 0x0018, + 0xc98: 0x0018, 0xc99: 0x0339, 0xc9a: 0x0751, 0xc9b: 0x00b9, 0xc9c: 0x00b9, 0xc9d: 0x00b9, + 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x0759, 0xca1: 0x08c5, 0xca2: 0x0761, 0xca3: 0x0018, + 0xca4: 0x04b1, 0xca5: 0x0018, 0xca6: 0x0769, 0xca7: 0x0018, 0xca8: 0x04b1, 0xca9: 0x0018, + 0xcaa: 0x0319, 0xcab: 0x0771, 0xcac: 0x02e9, 0xcad: 0x03d9, 0xcae: 0x0018, 0xcaf: 0x02f9, + 0xcb0: 0x02f9, 0xcb1: 0x03f1, 0xcb2: 0x0040, 0xcb3: 0x0321, 0xcb4: 0x0051, 0xcb5: 0x0779, + 0xcb6: 0x0781, 0xcb7: 0x0789, 0xcb8: 0x0791, 0xcb9: 0x0311, 0xcba: 0x0018, 0xcbb: 0x08e5, + 0xcbc: 0x0799, 0xcbd: 0x03a1, 0xcbe: 0x03a1, 0xcbf: 0x0799, // Block 0x33, offset 0xcc0 - 0xcc0: 0x0905, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9, - 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018, - 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151, - 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279, - 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399, - 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x091d, 0xce3: 0x2439, - 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x093d, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369, - 0xcea: 0x24a9, 0xceb: 0x095d, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61, - 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x097d, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451, - 0xcf6: 0x099d, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09bd, - 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61, + 0xcc0: 0x0905, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x02f1, + 0xcc6: 0x02f1, 0xcc7: 0x02f9, 0xcc8: 0x0311, 0xcc9: 0x00b1, 0xcca: 0x0018, 0xccb: 0x0018, + 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x07a1, 0xcd1: 0x07a9, + 0xcd2: 0x07b1, 0xcd3: 0x07b9, 0xcd4: 0x07c1, 0xcd5: 0x07c9, 0xcd6: 0x07d1, 0xcd7: 0x07d9, + 0xcd8: 0x07e1, 0xcd9: 0x07e9, 0xcda: 0x07f1, 0xcdb: 0x07f9, 0xcdc: 0x0801, 0xcdd: 0x0809, + 0xcde: 0x0811, 0xcdf: 0x0819, 0xce0: 0x0311, 0xce1: 0x0821, 0xce2: 0x091d, 0xce3: 0x0829, + 0xce4: 0x0391, 0xce5: 0x0831, 0xce6: 0x093d, 0xce7: 0x0839, 0xce8: 0x0841, 0xce9: 0x0109, + 0xcea: 0x0849, 0xceb: 0x095d, 0xcec: 0x0101, 0xced: 0x03d9, 0xcee: 0x02f1, 0xcef: 0x0321, + 0xcf0: 0x0311, 0xcf1: 0x0821, 0xcf2: 0x097d, 0xcf3: 0x0829, 0xcf4: 0x0391, 0xcf5: 0x0831, + 0xcf6: 0x099d, 0xcf7: 0x0839, 0xcf8: 0x0841, 0xcf9: 0x0109, 0xcfa: 0x0849, 0xcfb: 0x09bd, + 0xcfc: 0x0101, 0xcfd: 0x03d9, 0xcfe: 0x02f1, 0xcff: 0x0321, // Block 0x34, offset 0xd00 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018, 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040, 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040, - 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51, - 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601, - 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691, - 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a1e, 0xd35: 0x0a3e, + 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x0049, 0xd21: 0x0029, 0xd22: 0x0031, 0xd23: 0x06e9, + 0xd24: 0x06f1, 0xd25: 0x06f9, 0xd26: 0x0701, 0xd27: 0x0709, 0xd28: 0x0711, 0xd29: 0x0879, + 0xd2a: 0x0881, 0xd2b: 0x0889, 0xd2c: 0x0891, 0xd2d: 0x0899, 0xd2e: 0x08a1, 0xd2f: 0x08a9, + 0xd30: 0x08b1, 0xd31: 0x08b9, 0xd32: 0x08c1, 0xd33: 0x08c9, 0xd34: 0x0a1e, 0xd35: 0x0a3e, 0xd36: 0x0a5e, 0xd37: 0x0a7e, 0xd38: 0x0a9e, 0xd39: 0x0abe, 0xd3a: 0x0ade, 0xd3b: 0x0afe, - 0xd3c: 0x0b1e, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a, + 0xd3c: 0x0b1e, 0xd3d: 0x08d2, 0xd3e: 0x08da, 0xd3f: 0x08e2, // Block 0x35, offset 0xd40 - 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a, - 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, + 0xd40: 0x08ea, 0xd41: 0x08f2, 0xd42: 0x08fa, 0xd43: 0x0902, 0xd44: 0x090a, 0xd45: 0x0912, + 0xd46: 0x091a, 0xd47: 0x0922, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b3e, 0xd5d: 0x0b5e, @@ -1203,17 +1346,17 @@ var idnaValues = [8192]uint16{ 0xd64: 0x0c3e, 0xd65: 0x0c5e, 0xd66: 0x0c7e, 0xd67: 0x0c9e, 0xd68: 0x0cbe, 0xd69: 0x0cde, 0xd6a: 0x0cfe, 0xd6b: 0x0d1e, 0xd6c: 0x0d3e, 0xd6d: 0x0d5e, 0xd6e: 0x0d7e, 0xd6f: 0x0d9e, 0xd70: 0x0dbe, 0xd71: 0x0dde, 0xd72: 0x0dfe, 0xd73: 0x0e1e, 0xd74: 0x0e3e, 0xd75: 0x0e5e, - 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199, - 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259, + 0xd76: 0x0019, 0xd77: 0x02e9, 0xd78: 0x03d9, 0xd79: 0x02f1, 0xd7a: 0x02f9, 0xd7b: 0x03f1, + 0xd7c: 0x0309, 0xd7d: 0x00a9, 0xd7e: 0x0311, 0xd7f: 0x00b1, // Block 0x36, offset 0xd80 - 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99, - 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089, - 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9, - 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249, - 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71, - 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9, - 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1, - 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, + 0xd80: 0x0319, 0xd81: 0x0101, 0xd82: 0x0321, 0xd83: 0x0329, 0xd84: 0x0051, 0xd85: 0x0339, + 0xd86: 0x0751, 0xd87: 0x00b9, 0xd88: 0x0089, 0xd89: 0x0341, 0xd8a: 0x0349, 0xd8b: 0x0391, + 0xd8c: 0x00c1, 0xd8d: 0x0109, 0xd8e: 0x00c9, 0xd8f: 0x04b1, 0xd90: 0x0019, 0xd91: 0x02e9, + 0xd92: 0x03d9, 0xd93: 0x02f1, 0xd94: 0x02f9, 0xd95: 0x03f1, 0xd96: 0x0309, 0xd97: 0x00a9, + 0xd98: 0x0311, 0xd99: 0x00b1, 0xd9a: 0x0319, 0xd9b: 0x0101, 0xd9c: 0x0321, 0xd9d: 0x0329, + 0xd9e: 0x0051, 0xd9f: 0x0339, 0xda0: 0x0751, 0xda1: 0x00b9, 0xda2: 0x0089, 0xda3: 0x0341, + 0xda4: 0x0349, 0xda5: 0x0391, 0xda6: 0x00c1, 0xda7: 0x0109, 0xda8: 0x00c9, 0xda9: 0x04b1, + 0xdaa: 0x06e1, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018, 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, @@ -1223,12 +1366,12 @@ var idnaValues = [8192]uint16{ 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008, 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008, 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008, - 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ed5, - 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, - 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9, - 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, + 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x0941, 0xde3: 0x0ed5, + 0xde4: 0x0949, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, + 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0359, 0xdee: 0x0441, 0xdef: 0x0351, + 0xdf0: 0x03d1, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008, - 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9, + 0xdfc: 0x00b1, 0xdfd: 0x0391, 0xdfe: 0x0951, 0xdff: 0x0959, // Block 0x38, offset 0xe00 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008, 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008, @@ -1254,7 +1397,7 @@ var idnaValues = [8192]uint16{ 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040, 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040, // Block 0x3a, offset 0xe80 - 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, + 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x0961, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018, 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018, 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018, @@ -1290,17 +1433,17 @@ var idnaValues = [8192]uint16{ 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0008, 0xf3c: 0x0008, 0xf3d: 0x0008, 0xf3e: 0x0008, 0xf3f: 0x0008, // Block 0x3d, offset 0xf40 - 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32d5, 0xf45: 0x32f5, + 0xf40: 0x0b82, 0xf41: 0x0b8a, 0xf42: 0x0b92, 0xf43: 0x0b9a, 0xf44: 0x32d5, 0xf45: 0x32f5, 0xf46: 0x3315, 0xf47: 0x3335, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018, - 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x3355, 0xf51: 0x3761, - 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1, - 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881, - 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x3375, 0xf61: 0x3395, 0xf62: 0x33b5, 0xf63: 0x33d5, + 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x3355, 0xf51: 0x0ba1, + 0xf52: 0x0ba9, 0xf53: 0x0bb1, 0xf54: 0x0bb9, 0xf55: 0x0bc1, 0xf56: 0x0bc9, 0xf57: 0x0bd1, + 0xf58: 0x0bd9, 0xf59: 0x0be1, 0xf5a: 0x0be9, 0xf5b: 0x0bf1, 0xf5c: 0x0bf9, 0xf5d: 0x0c01, + 0xf5e: 0x0c09, 0xf5f: 0x0c11, 0xf60: 0x3375, 0xf61: 0x3395, 0xf62: 0x33b5, 0xf63: 0x33d5, 0xf64: 0x33f5, 0xf65: 0x33f5, 0xf66: 0x3415, 0xf67: 0x3435, 0xf68: 0x3455, 0xf69: 0x3475, 0xf6a: 0x3495, 0xf6b: 0x34b5, 0xf6c: 0x34d5, 0xf6d: 0x34f5, 0xf6e: 0x3515, 0xf6f: 0x3535, 0xf70: 0x3555, 0xf71: 0x3575, 0xf72: 0x3595, 0xf73: 0x35b5, 0xf74: 0x35d5, 0xf75: 0x35f5, 0xf76: 0x3615, 0xf77: 0x3635, 0xf78: 0x3655, 0xf79: 0x3675, 0xf7a: 0x3695, 0xf7b: 0x36b5, - 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36d5, 0xf7f: 0x0018, + 0xf7c: 0x0c19, 0xf7d: 0x0c21, 0xf7e: 0x36d5, 0xf7f: 0x0018, // Block 0x3e, offset 0xf80 0xf80: 0x36f5, 0xf81: 0x3715, 0xf82: 0x3735, 0xf83: 0x3755, 0xf84: 0x3775, 0xf85: 0x3795, 0xf86: 0x37b5, 0xf87: 0x37d5, 0xf88: 0x37f5, 0xf89: 0x3815, 0xf8a: 0x3835, 0xf8b: 0x3855, @@ -1310,13 +1453,13 @@ var idnaValues = [8192]uint16{ 0xf9e: 0x3ab5, 0xf9f: 0x3ad5, 0xfa0: 0x3af5, 0xfa1: 0x3b15, 0xfa2: 0x3b35, 0xfa3: 0x3b55, 0xfa4: 0x3b75, 0xfa5: 0x3b95, 0xfa6: 0x1295, 0xfa7: 0x3bb5, 0xfa8: 0x3bd5, 0xfa9: 0x3bf5, 0xfaa: 0x3c15, 0xfab: 0x3c35, 0xfac: 0x3c55, 0xfad: 0x3c75, 0xfae: 0x23b5, 0xfaf: 0x3c95, - 0xfb0: 0x3cb5, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999, - 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29, - 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89, + 0xfb0: 0x3cb5, 0xfb1: 0x0c29, 0xfb2: 0x0c31, 0xfb3: 0x0c39, 0xfb4: 0x0c41, 0xfb5: 0x0c49, + 0xfb6: 0x0c51, 0xfb7: 0x0c59, 0xfb8: 0x0c61, 0xfb9: 0x0c69, 0xfba: 0x0c71, 0xfbb: 0x0c79, + 0xfbc: 0x0c81, 0xfbd: 0x0c89, 0xfbe: 0x0c91, 0xfbf: 0x0c99, // Block 0x3f, offset 0xfc0 - 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69, - 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69, - 0xfcc: 0x3c99, 0xfcd: 0x3cd5, 0xfce: 0x3cb1, 0xfcf: 0x3cf5, 0xfd0: 0x3d15, 0xfd1: 0x3d2d, + 0xfc0: 0x0ca1, 0xfc1: 0x0ca9, 0xfc2: 0x0cb1, 0xfc3: 0x0cb9, 0xfc4: 0x0cc1, 0xfc5: 0x0cc9, + 0xfc6: 0x0cd1, 0xfc7: 0x0cd9, 0xfc8: 0x0ce1, 0xfc9: 0x0ce9, 0xfca: 0x0cf1, 0xfcb: 0x0cf9, + 0xfcc: 0x0d01, 0xfcd: 0x3cd5, 0xfce: 0x0d09, 0xfcf: 0x3cf5, 0xfd0: 0x3d15, 0xfd1: 0x3d2d, 0xfd2: 0x3d45, 0xfd3: 0x3d5d, 0xfd4: 0x3d75, 0xfd5: 0x3d75, 0xfd6: 0x3d5d, 0xfd7: 0x3d8d, 0xfd8: 0x07d5, 0xfd9: 0x3da5, 0xfda: 0x3dbd, 0xfdb: 0x3dd5, 0xfdc: 0x3ded, 0xfdd: 0x3e05, 0xfde: 0x3e1d, 0xfdf: 0x3e35, 0xfe0: 0x3e4d, 0xfe1: 0x3e65, 0xfe2: 0x3e7d, 0xfe3: 0x3e95, @@ -1324,769 +1467,769 @@ var idnaValues = [8192]uint16{ 0xfea: 0x3ef5, 0xfeb: 0x3f0d, 0xfec: 0x3f25, 0xfed: 0x3f3d, 0xfee: 0x3f55, 0xfef: 0x3f55, 0xff0: 0x3f6d, 0xff1: 0x3f6d, 0xff2: 0x3f6d, 0xff3: 0x3f85, 0xff4: 0x3f9d, 0xff5: 0x3fb5, 0xff6: 0x3fcd, 0xff7: 0x3fb5, 0xff8: 0x3fe5, 0xff9: 0x3ffd, 0xffa: 0x3f85, 0xffb: 0x4015, - 0xffc: 0x402d, 0xffd: 0x402d, 0xffe: 0x402d, 0xfff: 0x3cc9, + 0xffc: 0x402d, 0xffd: 0x402d, 0xffe: 0x402d, 0xfff: 0x0d11, // Block 0x40, offset 0x1000 - 0x1000: 0x3d01, 0x1001: 0x3d69, 0x1002: 0x3dd1, 0x1003: 0x3e39, 0x1004: 0x3e89, 0x1005: 0x3ef1, - 0x1006: 0x3f41, 0x1007: 0x3f91, 0x1008: 0x4011, 0x1009: 0x4079, 0x100a: 0x40c9, 0x100b: 0x4119, - 0x100c: 0x4169, 0x100d: 0x41d1, 0x100e: 0x4239, 0x100f: 0x4289, 0x1010: 0x42d9, 0x1011: 0x4311, - 0x1012: 0x4361, 0x1013: 0x43c9, 0x1014: 0x4431, 0x1015: 0x4469, 0x1016: 0x44e9, 0x1017: 0x4581, - 0x1018: 0x4601, 0x1019: 0x4651, 0x101a: 0x46d1, 0x101b: 0x4751, 0x101c: 0x47b9, 0x101d: 0x4809, - 0x101e: 0x4859, 0x101f: 0x48a9, 0x1020: 0x4911, 0x1021: 0x4991, 0x1022: 0x49f9, 0x1023: 0x4a49, - 0x1024: 0x4a99, 0x1025: 0x4ae9, 0x1026: 0x4b21, 0x1027: 0x4b59, 0x1028: 0x4b91, 0x1029: 0x4bc9, - 0x102a: 0x4c19, 0x102b: 0x4c69, 0x102c: 0x4ce9, 0x102d: 0x4d39, 0x102e: 0x4da1, 0x102f: 0x4e21, - 0x1030: 0x4e71, 0x1031: 0x4ea9, 0x1032: 0x4ee1, 0x1033: 0x4f61, 0x1034: 0x4fc9, 0x1035: 0x5049, - 0x1036: 0x5099, 0x1037: 0x5119, 0x1038: 0x5151, 0x1039: 0x51a1, 0x103a: 0x51f1, 0x103b: 0x5241, - 0x103c: 0x5291, 0x103d: 0x52e1, 0x103e: 0x5349, 0x103f: 0x5399, + 0x1000: 0x10f9, 0x1001: 0x1101, 0x1002: 0x40a5, 0x1003: 0x1109, 0x1004: 0x1111, 0x1005: 0x1119, + 0x1006: 0x1121, 0x1007: 0x1129, 0x1008: 0x40c5, 0x1009: 0x1131, 0x100a: 0x1139, 0x100b: 0x1141, + 0x100c: 0x40e5, 0x100d: 0x40e5, 0x100e: 0x1149, 0x100f: 0x1151, 0x1010: 0x1159, 0x1011: 0x4105, + 0x1012: 0x4125, 0x1013: 0x4145, 0x1014: 0x4165, 0x1015: 0x4185, 0x1016: 0x1161, 0x1017: 0x1169, + 0x1018: 0x1171, 0x1019: 0x1179, 0x101a: 0x1181, 0x101b: 0x41a5, 0x101c: 0x1189, 0x101d: 0x1191, + 0x101e: 0x1199, 0x101f: 0x41c5, 0x1020: 0x41e5, 0x1021: 0x11a1, 0x1022: 0x4205, 0x1023: 0x4225, + 0x1024: 0x4245, 0x1025: 0x11a9, 0x1026: 0x4265, 0x1027: 0x11b1, 0x1028: 0x11b9, 0x1029: 0x10f9, + 0x102a: 0x4285, 0x102b: 0x42a5, 0x102c: 0x42c5, 0x102d: 0x42e5, 0x102e: 0x11c1, 0x102f: 0x11c9, + 0x1030: 0x11d1, 0x1031: 0x11d9, 0x1032: 0x4305, 0x1033: 0x11e1, 0x1034: 0x11e9, 0x1035: 0x11f1, + 0x1036: 0x4325, 0x1037: 0x11f9, 0x1038: 0x1201, 0x1039: 0x11f9, 0x103a: 0x1209, 0x103b: 0x1211, + 0x103c: 0x4345, 0x103d: 0x1219, 0x103e: 0x1221, 0x103f: 0x1219, // Block 0x41, offset 0x1040 - 0x1040: 0x53d1, 0x1041: 0x5421, 0x1042: 0x5471, 0x1043: 0x54c1, 0x1044: 0x5529, 0x1045: 0x5579, - 0x1046: 0x55c9, 0x1047: 0x5619, 0x1048: 0x5699, 0x1049: 0x5701, 0x104a: 0x5739, 0x104b: 0x57b9, - 0x104c: 0x57f1, 0x104d: 0x5859, 0x104e: 0x58c1, 0x104f: 0x5911, 0x1050: 0x5961, 0x1051: 0x59b1, - 0x1052: 0x5a19, 0x1053: 0x5a51, 0x1054: 0x5aa1, 0x1055: 0x5b09, 0x1056: 0x5b41, 0x1057: 0x5bc1, - 0x1058: 0x5c11, 0x1059: 0x5c39, 0x105a: 0x5c61, 0x105b: 0x5c89, 0x105c: 0x5cb1, 0x105d: 0x5cd9, - 0x105e: 0x5d01, 0x105f: 0x5d29, 0x1060: 0x5d51, 0x1061: 0x5d79, 0x1062: 0x5da1, 0x1063: 0x5dd1, - 0x1064: 0x5e01, 0x1065: 0x5e31, 0x1066: 0x5e61, 0x1067: 0x5e91, 0x1068: 0x5ec1, 0x1069: 0x5ef1, - 0x106a: 0x5f21, 0x106b: 0x5f51, 0x106c: 0x5f81, 0x106d: 0x5fb1, 0x106e: 0x5fe1, 0x106f: 0x6011, - 0x1070: 0x6041, 0x1071: 0x4045, 0x1072: 0x6071, 0x1073: 0x6089, 0x1074: 0x4065, 0x1075: 0x60a1, - 0x1076: 0x60b9, 0x1077: 0x60d1, 0x1078: 0x4085, 0x1079: 0x4085, 0x107a: 0x60e9, 0x107b: 0x6101, - 0x107c: 0x6139, 0x107d: 0x6171, 0x107e: 0x61a9, 0x107f: 0x61e1, + 0x1040: 0x4365, 0x1041: 0x4385, 0x1042: 0x0040, 0x1043: 0x1229, 0x1044: 0x1231, 0x1045: 0x1239, + 0x1046: 0x1241, 0x1047: 0x0040, 0x1048: 0x1249, 0x1049: 0x1251, 0x104a: 0x1259, 0x104b: 0x1261, + 0x104c: 0x1269, 0x104d: 0x1271, 0x104e: 0x1199, 0x104f: 0x1279, 0x1050: 0x1281, 0x1051: 0x1289, + 0x1052: 0x43a5, 0x1053: 0x1291, 0x1054: 0x1121, 0x1055: 0x43c5, 0x1056: 0x43e5, 0x1057: 0x1299, + 0x1058: 0x0040, 0x1059: 0x4405, 0x105a: 0x12a1, 0x105b: 0x12a9, 0x105c: 0x12b1, 0x105d: 0x12b9, + 0x105e: 0x12c1, 0x105f: 0x12c9, 0x1060: 0x12d1, 0x1061: 0x12d9, 0x1062: 0x12e1, 0x1063: 0x12e9, + 0x1064: 0x12f1, 0x1065: 0x12f9, 0x1066: 0x1301, 0x1067: 0x1309, 0x1068: 0x1311, 0x1069: 0x1319, + 0x106a: 0x1321, 0x106b: 0x1329, 0x106c: 0x1331, 0x106d: 0x1339, 0x106e: 0x1341, 0x106f: 0x1349, + 0x1070: 0x1351, 0x1071: 0x1359, 0x1072: 0x1361, 0x1073: 0x1369, 0x1074: 0x1371, 0x1075: 0x1379, + 0x1076: 0x1381, 0x1077: 0x1389, 0x1078: 0x1391, 0x1079: 0x1399, 0x107a: 0x13a1, 0x107b: 0x13a9, + 0x107c: 0x13b1, 0x107d: 0x13b9, 0x107e: 0x13c1, 0x107f: 0x4425, // Block 0x42, offset 0x1080 - 0x1080: 0x6249, 0x1081: 0x6261, 0x1082: 0x40a5, 0x1083: 0x6279, 0x1084: 0x6291, 0x1085: 0x62a9, - 0x1086: 0x62c1, 0x1087: 0x62d9, 0x1088: 0x40c5, 0x1089: 0x62f1, 0x108a: 0x6319, 0x108b: 0x6331, - 0x108c: 0x40e5, 0x108d: 0x40e5, 0x108e: 0x6349, 0x108f: 0x6361, 0x1090: 0x6379, 0x1091: 0x4105, - 0x1092: 0x4125, 0x1093: 0x4145, 0x1094: 0x4165, 0x1095: 0x4185, 0x1096: 0x6391, 0x1097: 0x63a9, - 0x1098: 0x63c1, 0x1099: 0x63d9, 0x109a: 0x63f1, 0x109b: 0x41a5, 0x109c: 0x6409, 0x109d: 0x6421, - 0x109e: 0x6439, 0x109f: 0x41c5, 0x10a0: 0x41e5, 0x10a1: 0x6451, 0x10a2: 0x4205, 0x10a3: 0x4225, - 0x10a4: 0x4245, 0x10a5: 0x6469, 0x10a6: 0x4265, 0x10a7: 0x6481, 0x10a8: 0x64b1, 0x10a9: 0x6249, - 0x10aa: 0x4285, 0x10ab: 0x42a5, 0x10ac: 0x42c5, 0x10ad: 0x42e5, 0x10ae: 0x64e9, 0x10af: 0x6529, - 0x10b0: 0x6571, 0x10b1: 0x6589, 0x10b2: 0x4305, 0x10b3: 0x65a1, 0x10b4: 0x65b9, 0x10b5: 0x65d1, - 0x10b6: 0x4325, 0x10b7: 0x65e9, 0x10b8: 0x6601, 0x10b9: 0x65e9, 0x10ba: 0x6619, 0x10bb: 0x6631, - 0x10bc: 0x4345, 0x10bd: 0x6649, 0x10be: 0x6661, 0x10bf: 0x6649, + 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: 0x3308, + 0x10b0: 0x3318, 0x10b1: 0x3318, 0x10b2: 0x3318, 0x10b3: 0x0018, 0x10b4: 0x3308, 0x10b5: 0x3308, + 0x10b6: 0x3308, 0x10b7: 0x3308, 0x10b8: 0x3308, 0x10b9: 0x3308, 0x10ba: 0x3308, 0x10bb: 0x3308, + 0x10bc: 0x3308, 0x10bd: 0x3308, 0x10be: 0x0018, 0x10bf: 0x0008, // Block 0x43, offset 0x10c0 - 0x10c0: 0x4365, 0x10c1: 0x4385, 0x10c2: 0x0040, 0x10c3: 0x6679, 0x10c4: 0x6691, 0x10c5: 0x66a9, - 0x10c6: 0x66c1, 0x10c7: 0x0040, 0x10c8: 0x66f9, 0x10c9: 0x6711, 0x10ca: 0x6729, 0x10cb: 0x6741, - 0x10cc: 0x6759, 0x10cd: 0x6771, 0x10ce: 0x6439, 0x10cf: 0x6789, 0x10d0: 0x67a1, 0x10d1: 0x67b9, - 0x10d2: 0x43a5, 0x10d3: 0x67d1, 0x10d4: 0x62c1, 0x10d5: 0x43c5, 0x10d6: 0x43e5, 0x10d7: 0x67e9, - 0x10d8: 0x0040, 0x10d9: 0x4405, 0x10da: 0x6801, 0x10db: 0x6819, 0x10dc: 0x6831, 0x10dd: 0x6849, - 0x10de: 0x6861, 0x10df: 0x6891, 0x10e0: 0x68c1, 0x10e1: 0x68e9, 0x10e2: 0x6911, 0x10e3: 0x6939, - 0x10e4: 0x6961, 0x10e5: 0x6989, 0x10e6: 0x69b1, 0x10e7: 0x69d9, 0x10e8: 0x6a01, 0x10e9: 0x6a29, - 0x10ea: 0x6a59, 0x10eb: 0x6a89, 0x10ec: 0x6ab9, 0x10ed: 0x6ae9, 0x10ee: 0x6b19, 0x10ef: 0x6b49, - 0x10f0: 0x6b79, 0x10f1: 0x6ba9, 0x10f2: 0x6bd9, 0x10f3: 0x6c09, 0x10f4: 0x6c39, 0x10f5: 0x6c69, - 0x10f6: 0x6c99, 0x10f7: 0x6cc9, 0x10f8: 0x6cf9, 0x10f9: 0x6d29, 0x10fa: 0x6d59, 0x10fb: 0x6d89, - 0x10fc: 0x6db9, 0x10fd: 0x6de9, 0x10fe: 0x6e19, 0x10ff: 0x4425, + 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: 0x02d1, 0x10dd: 0x13c9, + 0x10de: 0x3308, 0x10df: 0x3308, 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: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, - 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, - 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, - 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, - 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008, - 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008, + 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: 0x0008, 0x112f: 0x3308, - 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308, - 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308, - 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 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: 0x0ea1, 0x115d: 0x6e49, - 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008, - 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008, - 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008, - 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, - 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008, - 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 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: 0x4445, 0x117e: 0xe00d, 0x117f: 0x0008, // Block 0x46, offset 0x1180 - 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018, - 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018, - 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018, - 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008, - 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, - 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 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: 0x0409, 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: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, - 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11aa: 0x13d1, 0x11ab: 0x0371, 0x11ac: 0x0401, 0x11ad: 0x13d9, 0x11ae: 0x0421, 0x11af: 0x0008, + 0x11b0: 0x13e1, 0x11b1: 0x13e9, 0x11b2: 0x0429, 0x11b3: 0x4465, 0x11b4: 0xe00d, 0x11b5: 0x0008, 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008, 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008, // Block 0x47, offset 0x11c0 - 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, - 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008, - 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, - 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, - 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, - 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, - 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, - 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008, - 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, - 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d, - 0x11fc: 0x0008, 0x11fd: 0x4445, 0x11fe: 0xe00d, 0x11ff: 0x0008, + 0x11c0: 0x650d, 0x11c1: 0x652d, 0x11c2: 0x654d, 0x11c3: 0x656d, 0x11c4: 0x658d, 0x11c5: 0x65ad, + 0x11c6: 0x65cd, 0x11c7: 0x65ed, 0x11c8: 0x660d, 0x11c9: 0x662d, 0x11ca: 0x664d, 0x11cb: 0x666d, + 0x11cc: 0x668d, 0x11cd: 0x66ad, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x66cd, 0x11d1: 0x0008, + 0x11d2: 0x66ed, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x670d, 0x11d6: 0x672d, 0x11d7: 0x674d, + 0x11d8: 0x676d, 0x11d9: 0x678d, 0x11da: 0x67ad, 0x11db: 0x67cd, 0x11dc: 0x67ed, 0x11dd: 0x680d, + 0x11de: 0x682d, 0x11df: 0x0008, 0x11e0: 0x684d, 0x11e1: 0x0008, 0x11e2: 0x686d, 0x11e3: 0x0008, + 0x11e4: 0x0008, 0x11e5: 0x688d, 0x11e6: 0x68ad, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008, + 0x11ea: 0x68cd, 0x11eb: 0x68ed, 0x11ec: 0x690d, 0x11ed: 0x692d, 0x11ee: 0x694d, 0x11ef: 0x696d, + 0x11f0: 0x698d, 0x11f1: 0x69ad, 0x11f2: 0x69cd, 0x11f3: 0x69ed, 0x11f4: 0x6a0d, 0x11f5: 0x6a2d, + 0x11f6: 0x6a4d, 0x11f7: 0x6a6d, 0x11f8: 0x6a8d, 0x11f9: 0x6aad, 0x11fa: 0x6acd, 0x11fb: 0x6aed, + 0x11fc: 0x6b0d, 0x11fd: 0x6b2d, 0x11fe: 0x6b4d, 0x11ff: 0x6b6d, // Block 0x48, offset 0x1200 - 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008, - 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d, - 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008, - 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, - 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008, - 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008, - 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008, - 0x122a: 0x6e61, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e79, 0x122e: 0x1221, 0x122f: 0x0008, - 0x1230: 0x6e91, 0x1231: 0x6ea9, 0x1232: 0x1239, 0x1233: 0x4465, 0x1234: 0xe00d, 0x1235: 0x0008, - 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0xe00d, 0x1239: 0x0008, 0x123a: 0xe00d, 0x123b: 0x0008, - 0x123c: 0xe00d, 0x123d: 0x0008, 0x123e: 0xe00d, 0x123f: 0x0008, + 0x1200: 0x7acd, 0x1201: 0x7aed, 0x1202: 0x7b0d, 0x1203: 0x7b2d, 0x1204: 0x7b4d, 0x1205: 0x7b6d, + 0x1206: 0x7b8d, 0x1207: 0x7bad, 0x1208: 0x7bcd, 0x1209: 0x7bed, 0x120a: 0x7c0d, 0x120b: 0x7c2d, + 0x120c: 0x7c4d, 0x120d: 0x7c6d, 0x120e: 0x7c8d, 0x120f: 0x1409, 0x1210: 0x1411, 0x1211: 0x1419, + 0x1212: 0x7cad, 0x1213: 0x7ccd, 0x1214: 0x7ced, 0x1215: 0x1421, 0x1216: 0x1429, 0x1217: 0x1431, + 0x1218: 0x7d0d, 0x1219: 0x7d2d, 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: 0x650d, 0x1241: 0x652d, 0x1242: 0x654d, 0x1243: 0x656d, 0x1244: 0x658d, 0x1245: 0x65ad, - 0x1246: 0x65cd, 0x1247: 0x65ed, 0x1248: 0x660d, 0x1249: 0x662d, 0x124a: 0x664d, 0x124b: 0x666d, - 0x124c: 0x668d, 0x124d: 0x66ad, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x66cd, 0x1251: 0x0008, - 0x1252: 0x66ed, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x670d, 0x1256: 0x672d, 0x1257: 0x674d, - 0x1258: 0x676d, 0x1259: 0x678d, 0x125a: 0x67ad, 0x125b: 0x67cd, 0x125c: 0x67ed, 0x125d: 0x680d, - 0x125e: 0x682d, 0x125f: 0x0008, 0x1260: 0x684d, 0x1261: 0x0008, 0x1262: 0x686d, 0x1263: 0x0008, - 0x1264: 0x0008, 0x1265: 0x688d, 0x1266: 0x68ad, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, - 0x126a: 0x68cd, 0x126b: 0x68ed, 0x126c: 0x690d, 0x126d: 0x692d, 0x126e: 0x694d, 0x126f: 0x696d, - 0x1270: 0x698d, 0x1271: 0x69ad, 0x1272: 0x69cd, 0x1273: 0x69ed, 0x1274: 0x6a0d, 0x1275: 0x6a2d, - 0x1276: 0x6a4d, 0x1277: 0x6a6d, 0x1278: 0x6a8d, 0x1279: 0x6aad, 0x127a: 0x6acd, 0x127b: 0x6aed, - 0x127c: 0x6b0d, 0x127d: 0x6b2d, 0x127e: 0x6b4d, 0x127f: 0x6b6d, + 0x1240: 0x1439, 0x1241: 0x1441, 0x1242: 0x1449, 0x1243: 0x7d4d, 0x1244: 0x7d6d, 0x1245: 0x1451, + 0x1246: 0x1451, 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: 0x1459, 0x1254: 0x1461, 0x1255: 0x1469, 0x1256: 0x1471, 0x1257: 0x1479, + 0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x1481, + 0x125e: 0x3308, 0x125f: 0x1489, 0x1260: 0x1491, 0x1261: 0x0779, 0x1262: 0x0791, 0x1263: 0x1499, + 0x1264: 0x14a1, 0x1265: 0x14a9, 0x1266: 0x14b1, 0x1267: 0x14b9, 0x1268: 0x14c1, 0x1269: 0x071a, + 0x126a: 0x14c9, 0x126b: 0x14d1, 0x126c: 0x14d9, 0x126d: 0x14e1, 0x126e: 0x14e9, 0x126f: 0x14f1, + 0x1270: 0x14f9, 0x1271: 0x1501, 0x1272: 0x1509, 0x1273: 0x1511, 0x1274: 0x1519, 0x1275: 0x1521, + 0x1276: 0x1529, 0x1277: 0x0040, 0x1278: 0x1531, 0x1279: 0x1539, 0x127a: 0x1541, 0x127b: 0x1549, + 0x127c: 0x1551, 0x127d: 0x0040, 0x127e: 0x1559, 0x127f: 0x0040, // Block 0x4a, offset 0x1280 - 0x1280: 0x7acd, 0x1281: 0x7aed, 0x1282: 0x7b0d, 0x1283: 0x7b2d, 0x1284: 0x7b4d, 0x1285: 0x7b6d, - 0x1286: 0x7b8d, 0x1287: 0x7bad, 0x1288: 0x7bcd, 0x1289: 0x7bed, 0x128a: 0x7c0d, 0x128b: 0x7c2d, - 0x128c: 0x7c4d, 0x128d: 0x7c6d, 0x128e: 0x7c8d, 0x128f: 0x6f19, 0x1290: 0x6f41, 0x1291: 0x6f69, - 0x1292: 0x7cad, 0x1293: 0x7ccd, 0x1294: 0x7ced, 0x1295: 0x6f91, 0x1296: 0x6fb9, 0x1297: 0x6fe1, - 0x1298: 0x7d0d, 0x1299: 0x7d2d, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, - 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, - 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, - 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, - 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, - 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, - 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + 0x1280: 0x1561, 0x1281: 0x1569, 0x1282: 0x0040, 0x1283: 0x1571, 0x1284: 0x1579, 0x1285: 0x0040, + 0x1286: 0x1581, 0x1287: 0x1589, 0x1288: 0x1591, 0x1289: 0x1599, 0x128a: 0x15a1, 0x128b: 0x15a9, + 0x128c: 0x15b1, 0x128d: 0x15b9, 0x128e: 0x15c1, 0x128f: 0x15c9, 0x1290: 0x15d1, 0x1291: 0x15d1, + 0x1292: 0x15d9, 0x1293: 0x15d9, 0x1294: 0x15d9, 0x1295: 0x15d9, 0x1296: 0x15e1, 0x1297: 0x15e1, + 0x1298: 0x15e1, 0x1299: 0x15e1, 0x129a: 0x15e9, 0x129b: 0x15e9, 0x129c: 0x15e9, 0x129d: 0x15e9, + 0x129e: 0x15f1, 0x129f: 0x15f1, 0x12a0: 0x15f1, 0x12a1: 0x15f1, 0x12a2: 0x15f9, 0x12a3: 0x15f9, + 0x12a4: 0x15f9, 0x12a5: 0x15f9, 0x12a6: 0x1601, 0x12a7: 0x1601, 0x12a8: 0x1601, 0x12a9: 0x1601, + 0x12aa: 0x1609, 0x12ab: 0x1609, 0x12ac: 0x1609, 0x12ad: 0x1609, 0x12ae: 0x1611, 0x12af: 0x1611, + 0x12b0: 0x1611, 0x12b1: 0x1611, 0x12b2: 0x1619, 0x12b3: 0x1619, 0x12b4: 0x1619, 0x12b5: 0x1619, + 0x12b6: 0x1621, 0x12b7: 0x1621, 0x12b8: 0x1621, 0x12b9: 0x1621, 0x12ba: 0x1629, 0x12bb: 0x1629, + 0x12bc: 0x1629, 0x12bd: 0x1629, 0x12be: 0x1631, 0x12bf: 0x1631, // Block 0x4b, offset 0x12c0 - 0x12c0: 0x7009, 0x12c1: 0x7021, 0x12c2: 0x7039, 0x12c3: 0x7d4d, 0x12c4: 0x7d6d, 0x12c5: 0x7051, - 0x12c6: 0x7051, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, - 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, - 0x12d2: 0x0040, 0x12d3: 0x7069, 0x12d4: 0x7091, 0x12d5: 0x70b9, 0x12d6: 0x70e1, 0x12d7: 0x7109, - 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x7131, - 0x12de: 0x3308, 0x12df: 0x7159, 0x12e0: 0x7181, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7199, - 0x12e4: 0x71b1, 0x12e5: 0x71c9, 0x12e6: 0x71e1, 0x12e7: 0x71f9, 0x12e8: 0x7211, 0x12e9: 0x1fb2, - 0x12ea: 0x7229, 0x12eb: 0x7251, 0x12ec: 0x7279, 0x12ed: 0x72b1, 0x12ee: 0x72e9, 0x12ef: 0x7311, - 0x12f0: 0x7339, 0x12f1: 0x7361, 0x12f2: 0x7389, 0x12f3: 0x73b1, 0x12f4: 0x73d9, 0x12f5: 0x7401, - 0x12f6: 0x7429, 0x12f7: 0x0040, 0x12f8: 0x7451, 0x12f9: 0x7479, 0x12fa: 0x74a1, 0x12fb: 0x74c9, - 0x12fc: 0x74f1, 0x12fd: 0x0040, 0x12fe: 0x7519, 0x12ff: 0x0040, + 0x12c0: 0x1631, 0x12c1: 0x1631, 0x12c2: 0x1639, 0x12c3: 0x1639, 0x12c4: 0x1641, 0x12c5: 0x1641, + 0x12c6: 0x1649, 0x12c7: 0x1649, 0x12c8: 0x1651, 0x12c9: 0x1651, 0x12ca: 0x1659, 0x12cb: 0x1659, + 0x12cc: 0x1661, 0x12cd: 0x1661, 0x12ce: 0x1669, 0x12cf: 0x1669, 0x12d0: 0x1669, 0x12d1: 0x1669, + 0x12d2: 0x1671, 0x12d3: 0x1671, 0x12d4: 0x1671, 0x12d5: 0x1671, 0x12d6: 0x1679, 0x12d7: 0x1679, + 0x12d8: 0x1679, 0x12d9: 0x1679, 0x12da: 0x1681, 0x12db: 0x1681, 0x12dc: 0x1681, 0x12dd: 0x1681, + 0x12de: 0x1689, 0x12df: 0x1689, 0x12e0: 0x1691, 0x12e1: 0x1691, 0x12e2: 0x1691, 0x12e3: 0x1691, + 0x12e4: 0x1699, 0x12e5: 0x1699, 0x12e6: 0x16a1, 0x12e7: 0x16a1, 0x12e8: 0x16a1, 0x12e9: 0x16a1, + 0x12ea: 0x16a9, 0x12eb: 0x16a9, 0x12ec: 0x16a9, 0x12ed: 0x16a9, 0x12ee: 0x16b1, 0x12ef: 0x16b1, + 0x12f0: 0x16b9, 0x12f1: 0x16b9, 0x12f2: 0x0818, 0x12f3: 0x0818, 0x12f4: 0x0818, 0x12f5: 0x0818, + 0x12f6: 0x0818, 0x12f7: 0x0818, 0x12f8: 0x0818, 0x12f9: 0x0818, 0x12fa: 0x0818, 0x12fb: 0x0818, + 0x12fc: 0x0818, 0x12fd: 0x0818, 0x12fe: 0x0818, 0x12ff: 0x0818, // Block 0x4c, offset 0x1300 - 0x1300: 0x7541, 0x1301: 0x7569, 0x1302: 0x0040, 0x1303: 0x7591, 0x1304: 0x75b9, 0x1305: 0x0040, - 0x1306: 0x75e1, 0x1307: 0x7609, 0x1308: 0x7631, 0x1309: 0x7659, 0x130a: 0x7681, 0x130b: 0x76a9, - 0x130c: 0x76d1, 0x130d: 0x76f9, 0x130e: 0x7721, 0x130f: 0x7749, 0x1310: 0x7771, 0x1311: 0x7771, - 0x1312: 0x7789, 0x1313: 0x7789, 0x1314: 0x7789, 0x1315: 0x7789, 0x1316: 0x77a1, 0x1317: 0x77a1, - 0x1318: 0x77a1, 0x1319: 0x77a1, 0x131a: 0x77b9, 0x131b: 0x77b9, 0x131c: 0x77b9, 0x131d: 0x77b9, - 0x131e: 0x77d1, 0x131f: 0x77d1, 0x1320: 0x77d1, 0x1321: 0x77d1, 0x1322: 0x77e9, 0x1323: 0x77e9, - 0x1324: 0x77e9, 0x1325: 0x77e9, 0x1326: 0x7801, 0x1327: 0x7801, 0x1328: 0x7801, 0x1329: 0x7801, - 0x132a: 0x7819, 0x132b: 0x7819, 0x132c: 0x7819, 0x132d: 0x7819, 0x132e: 0x7831, 0x132f: 0x7831, - 0x1330: 0x7831, 0x1331: 0x7831, 0x1332: 0x7849, 0x1333: 0x7849, 0x1334: 0x7849, 0x1335: 0x7849, - 0x1336: 0x7861, 0x1337: 0x7861, 0x1338: 0x7861, 0x1339: 0x7861, 0x133a: 0x7879, 0x133b: 0x7879, - 0x133c: 0x7879, 0x133d: 0x7879, 0x133e: 0x7891, 0x133f: 0x7891, + 0x1300: 0x0818, 0x1301: 0x0818, 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: 0x16c1, 0x1314: 0x16c1, 0x1315: 0x16c1, 0x1316: 0x16c1, 0x1317: 0x16c9, + 0x1318: 0x16c9, 0x1319: 0x16d1, 0x131a: 0x16d1, 0x131b: 0x16d9, 0x131c: 0x16d9, 0x131d: 0x0149, + 0x131e: 0x16e1, 0x131f: 0x16e1, 0x1320: 0x16e9, 0x1321: 0x16e9, 0x1322: 0x16f1, 0x1323: 0x16f1, + 0x1324: 0x16f9, 0x1325: 0x16f9, 0x1326: 0x16f9, 0x1327: 0x16f9, 0x1328: 0x1701, 0x1329: 0x1701, + 0x132a: 0x1709, 0x132b: 0x1709, 0x132c: 0x1711, 0x132d: 0x1711, 0x132e: 0x1719, 0x132f: 0x1719, + 0x1330: 0x1721, 0x1331: 0x1721, 0x1332: 0x1729, 0x1333: 0x1729, 0x1334: 0x1731, 0x1335: 0x1731, + 0x1336: 0x1739, 0x1337: 0x1739, 0x1338: 0x1739, 0x1339: 0x1741, 0x133a: 0x1741, 0x133b: 0x1741, + 0x133c: 0x1749, 0x133d: 0x1749, 0x133e: 0x1749, 0x133f: 0x1749, // Block 0x4d, offset 0x1340 - 0x1340: 0x7891, 0x1341: 0x7891, 0x1342: 0x78a9, 0x1343: 0x78a9, 0x1344: 0x78c1, 0x1345: 0x78c1, - 0x1346: 0x78d9, 0x1347: 0x78d9, 0x1348: 0x78f1, 0x1349: 0x78f1, 0x134a: 0x7909, 0x134b: 0x7909, - 0x134c: 0x7921, 0x134d: 0x7921, 0x134e: 0x7939, 0x134f: 0x7939, 0x1350: 0x7939, 0x1351: 0x7939, - 0x1352: 0x7951, 0x1353: 0x7951, 0x1354: 0x7951, 0x1355: 0x7951, 0x1356: 0x7969, 0x1357: 0x7969, - 0x1358: 0x7969, 0x1359: 0x7969, 0x135a: 0x7981, 0x135b: 0x7981, 0x135c: 0x7981, 0x135d: 0x7981, - 0x135e: 0x7999, 0x135f: 0x7999, 0x1360: 0x79b1, 0x1361: 0x79b1, 0x1362: 0x79b1, 0x1363: 0x79b1, - 0x1364: 0x79c9, 0x1365: 0x79c9, 0x1366: 0x79e1, 0x1367: 0x79e1, 0x1368: 0x79e1, 0x1369: 0x79e1, - 0x136a: 0x79f9, 0x136b: 0x79f9, 0x136c: 0x79f9, 0x136d: 0x79f9, 0x136e: 0x7a11, 0x136f: 0x7a11, - 0x1370: 0x7a29, 0x1371: 0x7a29, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, - 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, - 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + 0x1340: 0x1949, 0x1341: 0x1951, 0x1342: 0x1959, 0x1343: 0x1961, 0x1344: 0x1969, 0x1345: 0x1971, + 0x1346: 0x1979, 0x1347: 0x1981, 0x1348: 0x1989, 0x1349: 0x1991, 0x134a: 0x1999, 0x134b: 0x19a1, + 0x134c: 0x19a9, 0x134d: 0x19b1, 0x134e: 0x19b9, 0x134f: 0x19c1, 0x1350: 0x19c9, 0x1351: 0x19d1, + 0x1352: 0x19d9, 0x1353: 0x19e1, 0x1354: 0x19e9, 0x1355: 0x19f1, 0x1356: 0x19f9, 0x1357: 0x1a01, + 0x1358: 0x1a09, 0x1359: 0x1a11, 0x135a: 0x1a19, 0x135b: 0x1a21, 0x135c: 0x1a29, 0x135d: 0x1a31, + 0x135e: 0x1a3a, 0x135f: 0x1a42, 0x1360: 0x1a4a, 0x1361: 0x1a52, 0x1362: 0x1a5a, 0x1363: 0x1a62, + 0x1364: 0x1a69, 0x1365: 0x1a71, 0x1366: 0x1761, 0x1367: 0x1a79, 0x1368: 0x1741, 0x1369: 0x1769, + 0x136a: 0x1a81, 0x136b: 0x1a89, 0x136c: 0x1789, 0x136d: 0x1a91, 0x136e: 0x1791, 0x136f: 0x1799, + 0x1370: 0x1a99, 0x1371: 0x1aa1, 0x1372: 0x17b9, 0x1373: 0x1aa9, 0x1374: 0x17c1, 0x1375: 0x17c9, + 0x1376: 0x1ab1, 0x1377: 0x1ab9, 0x1378: 0x17d9, 0x1379: 0x1ac1, 0x137a: 0x17e1, 0x137b: 0x17e9, + 0x137c: 0x18d1, 0x137d: 0x18d9, 0x137e: 0x18f1, 0x137f: 0x18f9, // Block 0x4e, offset 0x1380 - 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, - 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, - 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, - 0x1392: 0x0040, 0x1393: 0x7a41, 0x1394: 0x7a41, 0x1395: 0x7a41, 0x1396: 0x7a41, 0x1397: 0x7a59, - 0x1398: 0x7a59, 0x1399: 0x7a71, 0x139a: 0x7a71, 0x139b: 0x7a89, 0x139c: 0x7a89, 0x139d: 0x0479, - 0x139e: 0x7aa1, 0x139f: 0x7aa1, 0x13a0: 0x7ab9, 0x13a1: 0x7ab9, 0x13a2: 0x7ad1, 0x13a3: 0x7ad1, - 0x13a4: 0x7ae9, 0x13a5: 0x7ae9, 0x13a6: 0x7ae9, 0x13a7: 0x7ae9, 0x13a8: 0x7b01, 0x13a9: 0x7b01, - 0x13aa: 0x7b19, 0x13ab: 0x7b19, 0x13ac: 0x7b41, 0x13ad: 0x7b41, 0x13ae: 0x7b69, 0x13af: 0x7b69, - 0x13b0: 0x7b91, 0x13b1: 0x7b91, 0x13b2: 0x7bb9, 0x13b3: 0x7bb9, 0x13b4: 0x7be1, 0x13b5: 0x7be1, - 0x13b6: 0x7c09, 0x13b7: 0x7c09, 0x13b8: 0x7c09, 0x13b9: 0x7c31, 0x13ba: 0x7c31, 0x13bb: 0x7c31, - 0x13bc: 0x7c59, 0x13bd: 0x7c59, 0x13be: 0x7c59, 0x13bf: 0x7c59, + 0x1380: 0x1901, 0x1381: 0x1921, 0x1382: 0x1929, 0x1383: 0x1931, 0x1384: 0x1939, 0x1385: 0x1959, + 0x1386: 0x1961, 0x1387: 0x1969, 0x1388: 0x1ac9, 0x1389: 0x1989, 0x138a: 0x1ad1, 0x138b: 0x1ad9, + 0x138c: 0x19b9, 0x138d: 0x1ae1, 0x138e: 0x19c1, 0x138f: 0x19c9, 0x1390: 0x1a31, 0x1391: 0x1ae9, + 0x1392: 0x1af1, 0x1393: 0x1a09, 0x1394: 0x1af9, 0x1395: 0x1a11, 0x1396: 0x1a19, 0x1397: 0x1751, + 0x1398: 0x1759, 0x1399: 0x1b01, 0x139a: 0x1761, 0x139b: 0x1b09, 0x139c: 0x1771, 0x139d: 0x1779, + 0x139e: 0x1781, 0x139f: 0x1789, 0x13a0: 0x1b11, 0x13a1: 0x17a1, 0x13a2: 0x17a9, 0x13a3: 0x17b1, + 0x13a4: 0x17b9, 0x13a5: 0x1b19, 0x13a6: 0x17d9, 0x13a7: 0x17f1, 0x13a8: 0x17f9, 0x13a9: 0x1801, + 0x13aa: 0x1809, 0x13ab: 0x1811, 0x13ac: 0x1821, 0x13ad: 0x1829, 0x13ae: 0x1831, 0x13af: 0x1839, + 0x13b0: 0x1841, 0x13b1: 0x1849, 0x13b2: 0x1b21, 0x13b3: 0x1851, 0x13b4: 0x1859, 0x13b5: 0x1861, + 0x13b6: 0x1869, 0x13b7: 0x1871, 0x13b8: 0x1879, 0x13b9: 0x1889, 0x13ba: 0x1891, 0x13bb: 0x1899, + 0x13bc: 0x18a1, 0x13bd: 0x18a9, 0x13be: 0x18b1, 0x13bf: 0x18b9, // Block 0x4f, offset 0x13c0 - 0x13c0: 0x8649, 0x13c1: 0x8671, 0x13c2: 0x8699, 0x13c3: 0x86c1, 0x13c4: 0x86e9, 0x13c5: 0x8711, - 0x13c6: 0x8739, 0x13c7: 0x8761, 0x13c8: 0x8789, 0x13c9: 0x87b1, 0x13ca: 0x87d9, 0x13cb: 0x8801, - 0x13cc: 0x8829, 0x13cd: 0x8851, 0x13ce: 0x8879, 0x13cf: 0x88a1, 0x13d0: 0x88c9, 0x13d1: 0x88f1, - 0x13d2: 0x8919, 0x13d3: 0x8941, 0x13d4: 0x8969, 0x13d5: 0x8991, 0x13d6: 0x89b9, 0x13d7: 0x89e1, - 0x13d8: 0x8a09, 0x13d9: 0x8a31, 0x13da: 0x8a59, 0x13db: 0x8a81, 0x13dc: 0x8aa9, 0x13dd: 0x8ad1, - 0x13de: 0x8afa, 0x13df: 0x8b2a, 0x13e0: 0x8b5a, 0x13e1: 0x8b8a, 0x13e2: 0x8bba, 0x13e3: 0x8bea, - 0x13e4: 0x8c19, 0x13e5: 0x8c41, 0x13e6: 0x7cc1, 0x13e7: 0x8c69, 0x13e8: 0x7c31, 0x13e9: 0x7ce9, - 0x13ea: 0x8c91, 0x13eb: 0x8cb9, 0x13ec: 0x7d89, 0x13ed: 0x8ce1, 0x13ee: 0x7db1, 0x13ef: 0x7dd9, - 0x13f0: 0x8d09, 0x13f1: 0x8d31, 0x13f2: 0x7e79, 0x13f3: 0x8d59, 0x13f4: 0x7ea1, 0x13f5: 0x7ec9, - 0x13f6: 0x8d81, 0x13f7: 0x8da9, 0x13f8: 0x7f19, 0x13f9: 0x8dd1, 0x13fa: 0x7f41, 0x13fb: 0x7f69, - 0x13fc: 0x83f1, 0x13fd: 0x8419, 0x13fe: 0x8491, 0x13ff: 0x84b9, + 0x13c0: 0x18c1, 0x13c1: 0x18c9, 0x13c2: 0x18e1, 0x13c3: 0x18e9, 0x13c4: 0x1909, 0x13c5: 0x1911, + 0x13c6: 0x1919, 0x13c7: 0x1921, 0x13c8: 0x1929, 0x13c9: 0x1941, 0x13ca: 0x1949, 0x13cb: 0x1951, + 0x13cc: 0x1959, 0x13cd: 0x1b29, 0x13ce: 0x1971, 0x13cf: 0x1979, 0x13d0: 0x1981, 0x13d1: 0x1989, + 0x13d2: 0x19a1, 0x13d3: 0x19a9, 0x13d4: 0x19b1, 0x13d5: 0x19b9, 0x13d6: 0x1b31, 0x13d7: 0x19d1, + 0x13d8: 0x19d9, 0x13d9: 0x1b39, 0x13da: 0x19f1, 0x13db: 0x19f9, 0x13dc: 0x1a01, 0x13dd: 0x1a09, + 0x13de: 0x1b41, 0x13df: 0x1761, 0x13e0: 0x1b09, 0x13e1: 0x1789, 0x13e2: 0x1b11, 0x13e3: 0x17b9, + 0x13e4: 0x1b19, 0x13e5: 0x17d9, 0x13e6: 0x1b49, 0x13e7: 0x1841, 0x13e8: 0x1b51, 0x13e9: 0x1b59, + 0x13ea: 0x1b61, 0x13eb: 0x1921, 0x13ec: 0x1929, 0x13ed: 0x1959, 0x13ee: 0x19b9, 0x13ef: 0x1b31, + 0x13f0: 0x1a09, 0x13f1: 0x1b41, 0x13f2: 0x1b69, 0x13f3: 0x1b71, 0x13f4: 0x1b79, 0x13f5: 0x1b81, + 0x13f6: 0x1b89, 0x13f7: 0x1b91, 0x13f8: 0x1b99, 0x13f9: 0x1ba1, 0x13fa: 0x1ba9, 0x13fb: 0x1bb1, + 0x13fc: 0x1bb9, 0x13fd: 0x1bc1, 0x13fe: 0x1bc9, 0x13ff: 0x1bd1, // Block 0x50, offset 0x1400 - 0x1400: 0x84e1, 0x1401: 0x8581, 0x1402: 0x85a9, 0x1403: 0x85d1, 0x1404: 0x85f9, 0x1405: 0x8699, - 0x1406: 0x86c1, 0x1407: 0x86e9, 0x1408: 0x8df9, 0x1409: 0x8789, 0x140a: 0x8e21, 0x140b: 0x8e49, - 0x140c: 0x8879, 0x140d: 0x8e71, 0x140e: 0x88a1, 0x140f: 0x88c9, 0x1410: 0x8ad1, 0x1411: 0x8e99, - 0x1412: 0x8ec1, 0x1413: 0x8a09, 0x1414: 0x8ee9, 0x1415: 0x8a31, 0x1416: 0x8a59, 0x1417: 0x7c71, - 0x1418: 0x7c99, 0x1419: 0x8f11, 0x141a: 0x7cc1, 0x141b: 0x8f39, 0x141c: 0x7d11, 0x141d: 0x7d39, - 0x141e: 0x7d61, 0x141f: 0x7d89, 0x1420: 0x8f61, 0x1421: 0x7e01, 0x1422: 0x7e29, 0x1423: 0x7e51, - 0x1424: 0x7e79, 0x1425: 0x8f89, 0x1426: 0x7f19, 0x1427: 0x7f91, 0x1428: 0x7fb9, 0x1429: 0x7fe1, - 0x142a: 0x8009, 0x142b: 0x8031, 0x142c: 0x8081, 0x142d: 0x80a9, 0x142e: 0x80d1, 0x142f: 0x80f9, - 0x1430: 0x8121, 0x1431: 0x8149, 0x1432: 0x8fb1, 0x1433: 0x8171, 0x1434: 0x8199, 0x1435: 0x81c1, - 0x1436: 0x81e9, 0x1437: 0x8211, 0x1438: 0x8239, 0x1439: 0x8289, 0x143a: 0x82b1, 0x143b: 0x82d9, - 0x143c: 0x8301, 0x143d: 0x8329, 0x143e: 0x8351, 0x143f: 0x8379, + 0x1400: 0x1bd9, 0x1401: 0x1be1, 0x1402: 0x1be9, 0x1403: 0x1bf1, 0x1404: 0x1bf9, 0x1405: 0x1c01, + 0x1406: 0x1c09, 0x1407: 0x1c11, 0x1408: 0x1c19, 0x1409: 0x1c21, 0x140a: 0x1c29, 0x140b: 0x1c31, + 0x140c: 0x1b59, 0x140d: 0x1c39, 0x140e: 0x1c41, 0x140f: 0x1c49, 0x1410: 0x1c51, 0x1411: 0x1b81, + 0x1412: 0x1b89, 0x1413: 0x1b91, 0x1414: 0x1b99, 0x1415: 0x1ba1, 0x1416: 0x1ba9, 0x1417: 0x1bb1, + 0x1418: 0x1bb9, 0x1419: 0x1bc1, 0x141a: 0x1bc9, 0x141b: 0x1bd1, 0x141c: 0x1bd9, 0x141d: 0x1be1, + 0x141e: 0x1be9, 0x141f: 0x1bf1, 0x1420: 0x1bf9, 0x1421: 0x1c01, 0x1422: 0x1c09, 0x1423: 0x1c11, + 0x1424: 0x1c19, 0x1425: 0x1c21, 0x1426: 0x1c29, 0x1427: 0x1c31, 0x1428: 0x1b59, 0x1429: 0x1c39, + 0x142a: 0x1c41, 0x142b: 0x1c49, 0x142c: 0x1c51, 0x142d: 0x1c21, 0x142e: 0x1c29, 0x142f: 0x1c31, + 0x1430: 0x1b59, 0x1431: 0x1b51, 0x1432: 0x1b61, 0x1433: 0x1881, 0x1434: 0x1829, 0x1435: 0x1831, + 0x1436: 0x1839, 0x1437: 0x1c21, 0x1438: 0x1c29, 0x1439: 0x1c31, 0x143a: 0x1881, 0x143b: 0x1889, + 0x143c: 0x1c59, 0x143d: 0x1c59, 0x143e: 0x0018, 0x143f: 0x0018, // Block 0x51, offset 0x1440 - 0x1440: 0x83a1, 0x1441: 0x83c9, 0x1442: 0x8441, 0x1443: 0x8469, 0x1444: 0x8509, 0x1445: 0x8531, - 0x1446: 0x8559, 0x1447: 0x8581, 0x1448: 0x85a9, 0x1449: 0x8621, 0x144a: 0x8649, 0x144b: 0x8671, - 0x144c: 0x8699, 0x144d: 0x8fd9, 0x144e: 0x8711, 0x144f: 0x8739, 0x1450: 0x8761, 0x1451: 0x8789, - 0x1452: 0x8801, 0x1453: 0x8829, 0x1454: 0x8851, 0x1455: 0x8879, 0x1456: 0x9001, 0x1457: 0x88f1, - 0x1458: 0x8919, 0x1459: 0x9029, 0x145a: 0x8991, 0x145b: 0x89b9, 0x145c: 0x89e1, 0x145d: 0x8a09, - 0x145e: 0x9051, 0x145f: 0x7cc1, 0x1460: 0x8f39, 0x1461: 0x7d89, 0x1462: 0x8f61, 0x1463: 0x7e79, - 0x1464: 0x8f89, 0x1465: 0x7f19, 0x1466: 0x9079, 0x1467: 0x8121, 0x1468: 0x90a1, 0x1469: 0x90c9, - 0x146a: 0x90f1, 0x146b: 0x8581, 0x146c: 0x85a9, 0x146d: 0x8699, 0x146e: 0x8879, 0x146f: 0x9001, - 0x1470: 0x8a09, 0x1471: 0x9051, 0x1472: 0x9119, 0x1473: 0x9151, 0x1474: 0x9189, 0x1475: 0x91c1, - 0x1476: 0x91e9, 0x1477: 0x9211, 0x1478: 0x9239, 0x1479: 0x9261, 0x147a: 0x9289, 0x147b: 0x92b1, - 0x147c: 0x92d9, 0x147d: 0x9301, 0x147e: 0x9329, 0x147f: 0x9351, + 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: 0x1c61, 0x1451: 0x1c69, + 0x1452: 0x1c69, 0x1453: 0x1c71, 0x1454: 0x1c79, 0x1455: 0x1c81, 0x1456: 0x1c89, 0x1457: 0x1c91, + 0x1458: 0x1c99, 0x1459: 0x1c99, 0x145a: 0x1ca1, 0x145b: 0x1ca9, 0x145c: 0x1cb1, 0x145d: 0x1cb9, + 0x145e: 0x1cc1, 0x145f: 0x1cc9, 0x1460: 0x1cc9, 0x1461: 0x1cd1, 0x1462: 0x1cd9, 0x1463: 0x1cd9, + 0x1464: 0x1ce1, 0x1465: 0x1ce1, 0x1466: 0x1ce9, 0x1467: 0x1cf1, 0x1468: 0x1cf1, 0x1469: 0x1cf9, + 0x146a: 0x1d01, 0x146b: 0x1d01, 0x146c: 0x1d09, 0x146d: 0x1d09, 0x146e: 0x1d11, 0x146f: 0x1d19, + 0x1470: 0x1d19, 0x1471: 0x1d21, 0x1472: 0x1d21, 0x1473: 0x1d29, 0x1474: 0x1d31, 0x1475: 0x1d39, + 0x1476: 0x1d41, 0x1477: 0x1d41, 0x1478: 0x1d49, 0x1479: 0x1d51, 0x147a: 0x1d59, 0x147b: 0x1d61, + 0x147c: 0x1d69, 0x147d: 0x1d69, 0x147e: 0x1d71, 0x147f: 0x1d79, // Block 0x52, offset 0x1480 - 0x1480: 0x9379, 0x1481: 0x93a1, 0x1482: 0x93c9, 0x1483: 0x93f1, 0x1484: 0x9419, 0x1485: 0x9441, - 0x1486: 0x9469, 0x1487: 0x9491, 0x1488: 0x94b9, 0x1489: 0x94e1, 0x148a: 0x9509, 0x148b: 0x9531, - 0x148c: 0x90c9, 0x148d: 0x9559, 0x148e: 0x9581, 0x148f: 0x95a9, 0x1490: 0x95d1, 0x1491: 0x91c1, - 0x1492: 0x91e9, 0x1493: 0x9211, 0x1494: 0x9239, 0x1495: 0x9261, 0x1496: 0x9289, 0x1497: 0x92b1, - 0x1498: 0x92d9, 0x1499: 0x9301, 0x149a: 0x9329, 0x149b: 0x9351, 0x149c: 0x9379, 0x149d: 0x93a1, - 0x149e: 0x93c9, 0x149f: 0x93f1, 0x14a0: 0x9419, 0x14a1: 0x9441, 0x14a2: 0x9469, 0x14a3: 0x9491, - 0x14a4: 0x94b9, 0x14a5: 0x94e1, 0x14a6: 0x9509, 0x14a7: 0x9531, 0x14a8: 0x90c9, 0x14a9: 0x9559, - 0x14aa: 0x9581, 0x14ab: 0x95a9, 0x14ac: 0x95d1, 0x14ad: 0x94e1, 0x14ae: 0x9509, 0x14af: 0x9531, - 0x14b0: 0x90c9, 0x14b1: 0x90a1, 0x14b2: 0x90f1, 0x14b3: 0x8261, 0x14b4: 0x80a9, 0x14b5: 0x80d1, - 0x14b6: 0x80f9, 0x14b7: 0x94e1, 0x14b8: 0x9509, 0x14b9: 0x9531, 0x14ba: 0x8261, 0x14bb: 0x8289, - 0x14bc: 0x95f9, 0x14bd: 0x95f9, 0x14be: 0x0018, 0x14bf: 0x0018, + 0x1480: 0x1f29, 0x1481: 0x1f31, 0x1482: 0x1f39, 0x1483: 0x1f11, 0x1484: 0x1d39, 0x1485: 0x1ce9, + 0x1486: 0x1f41, 0x1487: 0x1f49, 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: 0x1f51, 0x14b1: 0x1f59, 0x14b2: 0x1f61, 0x14b3: 0x1f69, 0x14b4: 0x1f71, 0x14b5: 0x1f79, + 0x14b6: 0x1f81, 0x14b7: 0x1f89, 0x14b8: 0x1f91, 0x14b9: 0x1f99, 0x14ba: 0x1fa2, 0x14bb: 0x1faa, + 0x14bc: 0x1fb1, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040, // Block 0x53, offset 0x14c0 - 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040, - 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, - 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x9621, 0x14d1: 0x9659, - 0x14d2: 0x9659, 0x14d3: 0x9691, 0x14d4: 0x96c9, 0x14d5: 0x9701, 0x14d6: 0x9739, 0x14d7: 0x9771, - 0x14d8: 0x97a9, 0x14d9: 0x97a9, 0x14da: 0x97e1, 0x14db: 0x9819, 0x14dc: 0x9851, 0x14dd: 0x9889, - 0x14de: 0x98c1, 0x14df: 0x98f9, 0x14e0: 0x98f9, 0x14e1: 0x9931, 0x14e2: 0x9969, 0x14e3: 0x9969, - 0x14e4: 0x99a1, 0x14e5: 0x99a1, 0x14e6: 0x99d9, 0x14e7: 0x9a11, 0x14e8: 0x9a11, 0x14e9: 0x9a49, - 0x14ea: 0x9a81, 0x14eb: 0x9a81, 0x14ec: 0x9ab9, 0x14ed: 0x9ab9, 0x14ee: 0x9af1, 0x14ef: 0x9b29, - 0x14f0: 0x9b29, 0x14f1: 0x9b61, 0x14f2: 0x9b61, 0x14f3: 0x9b99, 0x14f4: 0x9bd1, 0x14f5: 0x9c09, - 0x14f6: 0x9c41, 0x14f7: 0x9c41, 0x14f8: 0x9c79, 0x14f9: 0x9cb1, 0x14fa: 0x9ce9, 0x14fb: 0x9d21, - 0x14fc: 0x9d59, 0x14fd: 0x9d59, 0x14fe: 0x9d91, 0x14ff: 0x9dc9, + 0x14c0: 0x33c0, 0x14c1: 0x33c0, 0x14c2: 0x33c0, 0x14c3: 0x33c0, 0x14c4: 0x33c0, 0x14c5: 0x33c0, + 0x14c6: 0x33c0, 0x14c7: 0x33c0, 0x14c8: 0x33c0, 0x14c9: 0x33c0, 0x14ca: 0x33c0, 0x14cb: 0x33c0, + 0x14cc: 0x33c0, 0x14cd: 0x33c0, 0x14ce: 0x33c0, 0x14cf: 0x33c0, 0x14d0: 0x1fba, 0x14d1: 0x7d8d, + 0x14d2: 0x0040, 0x14d3: 0x1fc2, 0x14d4: 0x0122, 0x14d5: 0x1fca, 0x14d6: 0x1fd2, 0x14d7: 0x7dad, + 0x14d8: 0x7dcd, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040, + 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x3308, 0x14e1: 0x3308, 0x14e2: 0x3308, 0x14e3: 0x3308, + 0x14e4: 0x3308, 0x14e5: 0x3308, 0x14e6: 0x3308, 0x14e7: 0x3308, 0x14e8: 0x3308, 0x14e9: 0x3308, + 0x14ea: 0x3308, 0x14eb: 0x3308, 0x14ec: 0x3308, 0x14ed: 0x3308, 0x14ee: 0x3308, 0x14ef: 0x3308, + 0x14f0: 0x0040, 0x14f1: 0x7ded, 0x14f2: 0x7e0d, 0x14f3: 0x1fda, 0x14f4: 0x1fda, 0x14f5: 0x072a, + 0x14f6: 0x0732, 0x14f7: 0x1fe2, 0x14f8: 0x1fea, 0x14f9: 0x7e2d, 0x14fa: 0x7e4d, 0x14fb: 0x7e6d, + 0x14fc: 0x7e2d, 0x14fd: 0x7e8d, 0x14fe: 0x7ead, 0x14ff: 0x7e8d, // Block 0x54, offset 0x1500 - 0x1500: 0xa999, 0x1501: 0xa9d1, 0x1502: 0xaa09, 0x1503: 0xa8f1, 0x1504: 0x9c09, 0x1505: 0x99d9, - 0x1506: 0xaa41, 0x1507: 0xaa79, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, - 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040, - 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, - 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, - 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, - 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, - 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, - 0x1530: 0xaab1, 0x1531: 0xaae9, 0x1532: 0xab21, 0x1533: 0xab69, 0x1534: 0xabb1, 0x1535: 0xabf9, - 0x1536: 0xac41, 0x1537: 0xac89, 0x1538: 0xacd1, 0x1539: 0xad19, 0x153a: 0xad52, 0x153b: 0xae62, - 0x153c: 0xaee1, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040, + 0x1500: 0x7ecd, 0x1501: 0x7eed, 0x1502: 0x7f0d, 0x1503: 0x7eed, 0x1504: 0x7f2d, 0x1505: 0x0018, + 0x1506: 0x0018, 0x1507: 0x1ff2, 0x1508: 0x1ffa, 0x1509: 0x7f4e, 0x150a: 0x7f6e, 0x150b: 0x7f8e, + 0x150c: 0x7fae, 0x150d: 0x1fda, 0x150e: 0x1fda, 0x150f: 0x1fda, 0x1510: 0x1fba, 0x1511: 0x7fcd, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0122, 0x1515: 0x1fc2, 0x1516: 0x1fd2, 0x1517: 0x1fca, + 0x1518: 0x7fed, 0x1519: 0x072a, 0x151a: 0x0732, 0x151b: 0x1fe2, 0x151c: 0x1fea, 0x151d: 0x7ecd, + 0x151e: 0x7f2d, 0x151f: 0x2002, 0x1520: 0x200a, 0x1521: 0x2012, 0x1522: 0x071a, 0x1523: 0x2019, + 0x1524: 0x2022, 0x1525: 0x202a, 0x1526: 0x0722, 0x1527: 0x0040, 0x1528: 0x2032, 0x1529: 0x203a, + 0x152a: 0x2042, 0x152b: 0x204a, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0x800e, 0x1531: 0x2051, 0x1532: 0x802e, 0x1533: 0x0808, 0x1534: 0x804e, 0x1535: 0x0040, + 0x1536: 0x806e, 0x1537: 0x2059, 0x1538: 0x808e, 0x1539: 0x2061, 0x153a: 0x80ae, 0x153b: 0x2069, + 0x153c: 0x80ce, 0x153d: 0x2071, 0x153e: 0x80ee, 0x153f: 0x2079, // Block 0x55, offset 0x1540 - 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, - 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, - 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaf2a, 0x1551: 0x7d8d, - 0x1552: 0x0040, 0x1553: 0xaf3a, 0x1554: 0x03c2, 0x1555: 0xaf4a, 0x1556: 0xaf5a, 0x1557: 0x7dad, - 0x1558: 0x7dcd, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, - 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, - 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, - 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, - 0x1570: 0x0040, 0x1571: 0x7ded, 0x1572: 0x7e0d, 0x1573: 0xaf6a, 0x1574: 0xaf6a, 0x1575: 0x1fd2, - 0x1576: 0x1fe2, 0x1577: 0xaf7a, 0x1578: 0xaf8a, 0x1579: 0x7e2d, 0x157a: 0x7e4d, 0x157b: 0x7e6d, - 0x157c: 0x7e2d, 0x157d: 0x7e8d, 0x157e: 0x7ead, 0x157f: 0x7e8d, + 0x1540: 0x2081, 0x1541: 0x2089, 0x1542: 0x2089, 0x1543: 0x2091, 0x1544: 0x2091, 0x1545: 0x2099, + 0x1546: 0x2099, 0x1547: 0x20a1, 0x1548: 0x20a1, 0x1549: 0x20a9, 0x154a: 0x20a9, 0x154b: 0x20a9, + 0x154c: 0x20a9, 0x154d: 0x20b1, 0x154e: 0x20b1, 0x154f: 0x20b9, 0x1550: 0x20b9, 0x1551: 0x20b9, + 0x1552: 0x20b9, 0x1553: 0x20c1, 0x1554: 0x20c1, 0x1555: 0x20c9, 0x1556: 0x20c9, 0x1557: 0x20c9, + 0x1558: 0x20c9, 0x1559: 0x20d1, 0x155a: 0x20d1, 0x155b: 0x20d1, 0x155c: 0x20d1, 0x155d: 0x20d9, + 0x155e: 0x20d9, 0x155f: 0x20d9, 0x1560: 0x20d9, 0x1561: 0x20e1, 0x1562: 0x20e1, 0x1563: 0x20e1, + 0x1564: 0x20e1, 0x1565: 0x20e9, 0x1566: 0x20e9, 0x1567: 0x20e9, 0x1568: 0x20e9, 0x1569: 0x20f1, + 0x156a: 0x20f1, 0x156b: 0x20f9, 0x156c: 0x20f9, 0x156d: 0x2101, 0x156e: 0x2101, 0x156f: 0x2109, + 0x1570: 0x2109, 0x1571: 0x2111, 0x1572: 0x2111, 0x1573: 0x2111, 0x1574: 0x2111, 0x1575: 0x2119, + 0x1576: 0x2119, 0x1577: 0x2119, 0x1578: 0x2119, 0x1579: 0x2121, 0x157a: 0x2121, 0x157b: 0x2121, + 0x157c: 0x2121, 0x157d: 0x2129, 0x157e: 0x2129, 0x157f: 0x2129, // Block 0x56, offset 0x1580 - 0x1580: 0x7ecd, 0x1581: 0x7eed, 0x1582: 0x7f0d, 0x1583: 0x7eed, 0x1584: 0x7f2d, 0x1585: 0x0018, - 0x1586: 0x0018, 0x1587: 0xaf9a, 0x1588: 0xafaa, 0x1589: 0x7f4e, 0x158a: 0x7f6e, 0x158b: 0x7f8e, - 0x158c: 0x7fae, 0x158d: 0xaf6a, 0x158e: 0xaf6a, 0x158f: 0xaf6a, 0x1590: 0xaf2a, 0x1591: 0x7fcd, - 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaf3a, 0x1596: 0xaf5a, 0x1597: 0xaf4a, - 0x1598: 0x7fed, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf7a, 0x159c: 0xaf8a, 0x159d: 0x7ecd, - 0x159e: 0x7f2d, 0x159f: 0xafba, 0x15a0: 0xafca, 0x15a1: 0xafda, 0x15a2: 0x1fb2, 0x15a3: 0xafe9, - 0x15a4: 0xaffa, 0x15a5: 0xb00a, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xb01a, 0x15a9: 0xb02a, - 0x15aa: 0xb03a, 0x15ab: 0xb04a, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, - 0x15b0: 0x800e, 0x15b1: 0xb059, 0x15b2: 0x802e, 0x15b3: 0x0808, 0x15b4: 0x804e, 0x15b5: 0x0040, - 0x15b6: 0x806e, 0x15b7: 0xb081, 0x15b8: 0x808e, 0x15b9: 0xb0a9, 0x15ba: 0x80ae, 0x15bb: 0xb0d1, - 0x15bc: 0x80ce, 0x15bd: 0xb0f9, 0x15be: 0x80ee, 0x15bf: 0xb121, + 0x1580: 0x2129, 0x1581: 0x2131, 0x1582: 0x2131, 0x1583: 0x2131, 0x1584: 0x2131, 0x1585: 0x2139, + 0x1586: 0x2139, 0x1587: 0x2139, 0x1588: 0x2139, 0x1589: 0x2141, 0x158a: 0x2141, 0x158b: 0x2141, + 0x158c: 0x2141, 0x158d: 0x2149, 0x158e: 0x2149, 0x158f: 0x2149, 0x1590: 0x2149, 0x1591: 0x2151, + 0x1592: 0x2151, 0x1593: 0x2151, 0x1594: 0x2151, 0x1595: 0x2159, 0x1596: 0x2159, 0x1597: 0x2159, + 0x1598: 0x2159, 0x1599: 0x2161, 0x159a: 0x2161, 0x159b: 0x2161, 0x159c: 0x2161, 0x159d: 0x2169, + 0x159e: 0x2169, 0x159f: 0x2169, 0x15a0: 0x2169, 0x15a1: 0x2171, 0x15a2: 0x2171, 0x15a3: 0x2171, + 0x15a4: 0x2171, 0x15a5: 0x2179, 0x15a6: 0x2179, 0x15a7: 0x2179, 0x15a8: 0x2179, 0x15a9: 0x2181, + 0x15aa: 0x2181, 0x15ab: 0x2181, 0x15ac: 0x2181, 0x15ad: 0x2189, 0x15ae: 0x2189, 0x15af: 0x1701, + 0x15b0: 0x1701, 0x15b1: 0x2191, 0x15b2: 0x2191, 0x15b3: 0x2191, 0x15b4: 0x2191, 0x15b5: 0x2199, + 0x15b6: 0x2199, 0x15b7: 0x21a1, 0x15b8: 0x21a1, 0x15b9: 0x21a9, 0x15ba: 0x21a9, 0x15bb: 0x21b1, + 0x15bc: 0x21b1, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0, // Block 0x57, offset 0x15c0 - 0x15c0: 0xb149, 0x15c1: 0xb161, 0x15c2: 0xb161, 0x15c3: 0xb179, 0x15c4: 0xb179, 0x15c5: 0xb191, - 0x15c6: 0xb191, 0x15c7: 0xb1a9, 0x15c8: 0xb1a9, 0x15c9: 0xb1c1, 0x15ca: 0xb1c1, 0x15cb: 0xb1c1, - 0x15cc: 0xb1c1, 0x15cd: 0xb1d9, 0x15ce: 0xb1d9, 0x15cf: 0xb1f1, 0x15d0: 0xb1f1, 0x15d1: 0xb1f1, - 0x15d2: 0xb1f1, 0x15d3: 0xb209, 0x15d4: 0xb209, 0x15d5: 0xb221, 0x15d6: 0xb221, 0x15d7: 0xb221, - 0x15d8: 0xb221, 0x15d9: 0xb239, 0x15da: 0xb239, 0x15db: 0xb239, 0x15dc: 0xb239, 0x15dd: 0xb251, - 0x15de: 0xb251, 0x15df: 0xb251, 0x15e0: 0xb251, 0x15e1: 0xb269, 0x15e2: 0xb269, 0x15e3: 0xb269, - 0x15e4: 0xb269, 0x15e5: 0xb281, 0x15e6: 0xb281, 0x15e7: 0xb281, 0x15e8: 0xb281, 0x15e9: 0xb299, - 0x15ea: 0xb299, 0x15eb: 0xb2b1, 0x15ec: 0xb2b1, 0x15ed: 0xb2c9, 0x15ee: 0xb2c9, 0x15ef: 0xb2e1, - 0x15f0: 0xb2e1, 0x15f1: 0xb2f9, 0x15f2: 0xb2f9, 0x15f3: 0xb2f9, 0x15f4: 0xb2f9, 0x15f5: 0xb311, - 0x15f6: 0xb311, 0x15f7: 0xb311, 0x15f8: 0xb311, 0x15f9: 0xb329, 0x15fa: 0xb329, 0x15fb: 0xb329, - 0x15fc: 0xb329, 0x15fd: 0xb341, 0x15fe: 0xb341, 0x15ff: 0xb341, + 0x15c0: 0x0040, 0x15c1: 0x1fca, 0x15c2: 0x21ba, 0x15c3: 0x2002, 0x15c4: 0x203a, 0x15c5: 0x2042, + 0x15c6: 0x200a, 0x15c7: 0x21c2, 0x15c8: 0x072a, 0x15c9: 0x0732, 0x15ca: 0x2012, 0x15cb: 0x071a, + 0x15cc: 0x1fba, 0x15cd: 0x2019, 0x15ce: 0x0961, 0x15cf: 0x21ca, 0x15d0: 0x06e1, 0x15d1: 0x0049, + 0x15d2: 0x0029, 0x15d3: 0x0031, 0x15d4: 0x06e9, 0x15d5: 0x06f1, 0x15d6: 0x06f9, 0x15d7: 0x0701, + 0x15d8: 0x0709, 0x15d9: 0x0711, 0x15da: 0x1fc2, 0x15db: 0x0122, 0x15dc: 0x2022, 0x15dd: 0x0722, + 0x15de: 0x202a, 0x15df: 0x1fd2, 0x15e0: 0x204a, 0x15e1: 0x0019, 0x15e2: 0x02e9, 0x15e3: 0x03d9, + 0x15e4: 0x02f1, 0x15e5: 0x02f9, 0x15e6: 0x03f1, 0x15e7: 0x0309, 0x15e8: 0x00a9, 0x15e9: 0x0311, + 0x15ea: 0x00b1, 0x15eb: 0x0319, 0x15ec: 0x0101, 0x15ed: 0x0321, 0x15ee: 0x0329, 0x15ef: 0x0051, + 0x15f0: 0x0339, 0x15f1: 0x0751, 0x15f2: 0x00b9, 0x15f3: 0x0089, 0x15f4: 0x0341, 0x15f5: 0x0349, + 0x15f6: 0x0391, 0x15f7: 0x00c1, 0x15f8: 0x0109, 0x15f9: 0x00c9, 0x15fa: 0x04b1, 0x15fb: 0x1ff2, + 0x15fc: 0x2032, 0x15fd: 0x1ffa, 0x15fe: 0x21d2, 0x15ff: 0x1fda, // Block 0x58, offset 0x1600 - 0x1600: 0xb341, 0x1601: 0xb359, 0x1602: 0xb359, 0x1603: 0xb359, 0x1604: 0xb359, 0x1605: 0xb371, - 0x1606: 0xb371, 0x1607: 0xb371, 0x1608: 0xb371, 0x1609: 0xb389, 0x160a: 0xb389, 0x160b: 0xb389, - 0x160c: 0xb389, 0x160d: 0xb3a1, 0x160e: 0xb3a1, 0x160f: 0xb3a1, 0x1610: 0xb3a1, 0x1611: 0xb3b9, - 0x1612: 0xb3b9, 0x1613: 0xb3b9, 0x1614: 0xb3b9, 0x1615: 0xb3d1, 0x1616: 0xb3d1, 0x1617: 0xb3d1, - 0x1618: 0xb3d1, 0x1619: 0xb3e9, 0x161a: 0xb3e9, 0x161b: 0xb3e9, 0x161c: 0xb3e9, 0x161d: 0xb401, - 0x161e: 0xb401, 0x161f: 0xb401, 0x1620: 0xb401, 0x1621: 0xb419, 0x1622: 0xb419, 0x1623: 0xb419, - 0x1624: 0xb419, 0x1625: 0xb431, 0x1626: 0xb431, 0x1627: 0xb431, 0x1628: 0xb431, 0x1629: 0xb449, - 0x162a: 0xb449, 0x162b: 0xb449, 0x162c: 0xb449, 0x162d: 0xb461, 0x162e: 0xb461, 0x162f: 0x7b01, - 0x1630: 0x7b01, 0x1631: 0xb479, 0x1632: 0xb479, 0x1633: 0xb479, 0x1634: 0xb479, 0x1635: 0xb491, - 0x1636: 0xb491, 0x1637: 0xb4b9, 0x1638: 0xb4b9, 0x1639: 0xb4e1, 0x163a: 0xb4e1, 0x163b: 0xb509, - 0x163c: 0xb509, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + 0x1600: 0x0672, 0x1601: 0x0019, 0x1602: 0x02e9, 0x1603: 0x03d9, 0x1604: 0x02f1, 0x1605: 0x02f9, + 0x1606: 0x03f1, 0x1607: 0x0309, 0x1608: 0x00a9, 0x1609: 0x0311, 0x160a: 0x00b1, 0x160b: 0x0319, + 0x160c: 0x0101, 0x160d: 0x0321, 0x160e: 0x0329, 0x160f: 0x0051, 0x1610: 0x0339, 0x1611: 0x0751, + 0x1612: 0x00b9, 0x1613: 0x0089, 0x1614: 0x0341, 0x1615: 0x0349, 0x1616: 0x0391, 0x1617: 0x00c1, + 0x1618: 0x0109, 0x1619: 0x00c9, 0x161a: 0x04b1, 0x161b: 0x1fe2, 0x161c: 0x21da, 0x161d: 0x1fea, + 0x161e: 0x21e2, 0x161f: 0x810d, 0x1620: 0x812d, 0x1621: 0x0961, 0x1622: 0x814d, 0x1623: 0x814d, + 0x1624: 0x816d, 0x1625: 0x818d, 0x1626: 0x81ad, 0x1627: 0x81cd, 0x1628: 0x81ed, 0x1629: 0x820d, + 0x162a: 0x822d, 0x162b: 0x824d, 0x162c: 0x826d, 0x162d: 0x828d, 0x162e: 0x82ad, 0x162f: 0x82cd, + 0x1630: 0x82ed, 0x1631: 0x830d, 0x1632: 0x832d, 0x1633: 0x834d, 0x1634: 0x836d, 0x1635: 0x838d, + 0x1636: 0x83ad, 0x1637: 0x83cd, 0x1638: 0x83ed, 0x1639: 0x840d, 0x163a: 0x842d, 0x163b: 0x844d, + 0x163c: 0x81ed, 0x163d: 0x846d, 0x163e: 0x848d, 0x163f: 0x824d, // Block 0x59, offset 0x1640 - 0x1640: 0x0040, 0x1641: 0xaf4a, 0x1642: 0xb532, 0x1643: 0xafba, 0x1644: 0xb02a, 0x1645: 0xb03a, - 0x1646: 0xafca, 0x1647: 0xb542, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xafda, 0x164b: 0x1fb2, - 0x164c: 0xaf2a, 0x164d: 0xafe9, 0x164e: 0x29d1, 0x164f: 0xb552, 0x1650: 0x1f41, 0x1651: 0x00c9, - 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81, - 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaf3a, 0x165b: 0x03c2, 0x165c: 0xaffa, 0x165d: 0x1fc2, - 0x165e: 0xb00a, 0x165f: 0xaf5a, 0x1660: 0xb04a, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159, - 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41, - 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9, - 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9, - 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf9a, - 0x167c: 0xb01a, 0x167d: 0xafaa, 0x167e: 0xb562, 0x167f: 0xaf6a, + 0x1640: 0x84ad, 0x1641: 0x84cd, 0x1642: 0x84ed, 0x1643: 0x850d, 0x1644: 0x852d, 0x1645: 0x854d, + 0x1646: 0x856d, 0x1647: 0x858d, 0x1648: 0x850d, 0x1649: 0x85ad, 0x164a: 0x850d, 0x164b: 0x85cd, + 0x164c: 0x85cd, 0x164d: 0x85ed, 0x164e: 0x85ed, 0x164f: 0x860d, 0x1650: 0x854d, 0x1651: 0x862d, + 0x1652: 0x864d, 0x1653: 0x862d, 0x1654: 0x866d, 0x1655: 0x864d, 0x1656: 0x868d, 0x1657: 0x868d, + 0x1658: 0x86ad, 0x1659: 0x86ad, 0x165a: 0x86cd, 0x165b: 0x86cd, 0x165c: 0x864d, 0x165d: 0x814d, + 0x165e: 0x86ed, 0x165f: 0x870d, 0x1660: 0x0040, 0x1661: 0x872d, 0x1662: 0x874d, 0x1663: 0x876d, + 0x1664: 0x878d, 0x1665: 0x876d, 0x1666: 0x87ad, 0x1667: 0x87cd, 0x1668: 0x87ed, 0x1669: 0x87ed, + 0x166a: 0x880d, 0x166b: 0x880d, 0x166c: 0x882d, 0x166d: 0x882d, 0x166e: 0x880d, 0x166f: 0x880d, + 0x1670: 0x884d, 0x1671: 0x886d, 0x1672: 0x888d, 0x1673: 0x88ad, 0x1674: 0x88cd, 0x1675: 0x88ed, + 0x1676: 0x88ed, 0x1677: 0x88ed, 0x1678: 0x890d, 0x1679: 0x890d, 0x167a: 0x890d, 0x167b: 0x890d, + 0x167c: 0x87ed, 0x167d: 0x87ed, 0x167e: 0x87ed, 0x167f: 0x0040, // Block 0x5a, offset 0x1680 - 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09, - 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51, - 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039, - 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279, - 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf7a, 0x169c: 0xb572, 0x169d: 0xaf8a, - 0x169e: 0xb582, 0x169f: 0x810d, 0x16a0: 0x812d, 0x16a1: 0x29d1, 0x16a2: 0x814d, 0x16a3: 0x814d, - 0x16a4: 0x816d, 0x16a5: 0x818d, 0x16a6: 0x81ad, 0x16a7: 0x81cd, 0x16a8: 0x81ed, 0x16a9: 0x820d, - 0x16aa: 0x822d, 0x16ab: 0x824d, 0x16ac: 0x826d, 0x16ad: 0x828d, 0x16ae: 0x82ad, 0x16af: 0x82cd, - 0x16b0: 0x82ed, 0x16b1: 0x830d, 0x16b2: 0x832d, 0x16b3: 0x834d, 0x16b4: 0x836d, 0x16b5: 0x838d, - 0x16b6: 0x83ad, 0x16b7: 0x83cd, 0x16b8: 0x83ed, 0x16b9: 0x840d, 0x16ba: 0x842d, 0x16bb: 0x844d, - 0x16bc: 0x81ed, 0x16bd: 0x846d, 0x16be: 0x848d, 0x16bf: 0x824d, + 0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x874d, 0x1683: 0x872d, 0x1684: 0x892d, 0x1685: 0x872d, + 0x1686: 0x874d, 0x1687: 0x872d, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x894d, 0x168b: 0x874d, + 0x168c: 0x896d, 0x168d: 0x892d, 0x168e: 0x896d, 0x168f: 0x874d, 0x1690: 0x0040, 0x1691: 0x0040, + 0x1692: 0x898d, 0x1693: 0x89ad, 0x1694: 0x88ad, 0x1695: 0x896d, 0x1696: 0x892d, 0x1697: 0x896d, + 0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x89cd, 0x169b: 0x89ed, 0x169c: 0x89cd, 0x169d: 0x0040, + 0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0x21e9, 0x16a1: 0x21f1, 0x16a2: 0x21f9, 0x16a3: 0x8a0e, + 0x16a4: 0x2201, 0x16a5: 0x2209, 0x16a6: 0x8a2d, 0x16a7: 0x0040, 0x16a8: 0x8a4d, 0x16a9: 0x8a6d, + 0x16aa: 0x8a8d, 0x16ab: 0x8a6d, 0x16ac: 0x8aad, 0x16ad: 0x8acd, 0x16ae: 0x8aed, 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: 0x84ad, 0x16c1: 0x84cd, 0x16c2: 0x84ed, 0x16c3: 0x850d, 0x16c4: 0x852d, 0x16c5: 0x854d, - 0x16c6: 0x856d, 0x16c7: 0x858d, 0x16c8: 0x850d, 0x16c9: 0x85ad, 0x16ca: 0x850d, 0x16cb: 0x85cd, - 0x16cc: 0x85cd, 0x16cd: 0x85ed, 0x16ce: 0x85ed, 0x16cf: 0x860d, 0x16d0: 0x854d, 0x16d1: 0x862d, - 0x16d2: 0x864d, 0x16d3: 0x862d, 0x16d4: 0x866d, 0x16d5: 0x864d, 0x16d6: 0x868d, 0x16d7: 0x868d, - 0x16d8: 0x86ad, 0x16d9: 0x86ad, 0x16da: 0x86cd, 0x16db: 0x86cd, 0x16dc: 0x864d, 0x16dd: 0x814d, - 0x16de: 0x86ed, 0x16df: 0x870d, 0x16e0: 0x0040, 0x16e1: 0x872d, 0x16e2: 0x874d, 0x16e3: 0x876d, - 0x16e4: 0x878d, 0x16e5: 0x876d, 0x16e6: 0x87ad, 0x16e7: 0x87cd, 0x16e8: 0x87ed, 0x16e9: 0x87ed, - 0x16ea: 0x880d, 0x16eb: 0x880d, 0x16ec: 0x882d, 0x16ed: 0x882d, 0x16ee: 0x880d, 0x16ef: 0x880d, - 0x16f0: 0x884d, 0x16f1: 0x886d, 0x16f2: 0x888d, 0x16f3: 0x88ad, 0x16f4: 0x88cd, 0x16f5: 0x88ed, - 0x16f6: 0x88ed, 0x16f7: 0x88ed, 0x16f8: 0x890d, 0x16f9: 0x890d, 0x16fa: 0x890d, 0x16fb: 0x890d, - 0x16fc: 0x87ed, 0x16fd: 0x87ed, 0x16fe: 0x87ed, 0x16ff: 0x0040, + 0x16c0: 0x0a08, 0x16c1: 0x0a08, 0x16c2: 0x0a08, 0x16c3: 0x0a08, 0x16c4: 0x0a08, 0x16c5: 0x0c08, + 0x16c6: 0x0808, 0x16c7: 0x0c08, 0x16c8: 0x0818, 0x16c9: 0x0c08, 0x16ca: 0x0c08, 0x16cb: 0x0808, + 0x16cc: 0x0808, 0x16cd: 0x0908, 0x16ce: 0x0c08, 0x16cf: 0x0c08, 0x16d0: 0x0c08, 0x16d1: 0x0c08, + 0x16d2: 0x0c08, 0x16d3: 0x0a08, 0x16d4: 0x0a08, 0x16d5: 0x0a08, 0x16d6: 0x0a08, 0x16d7: 0x0908, + 0x16d8: 0x0a08, 0x16d9: 0x0a08, 0x16da: 0x0a08, 0x16db: 0x0a08, 0x16dc: 0x0a08, 0x16dd: 0x0c08, + 0x16de: 0x0a08, 0x16df: 0x0a08, 0x16e0: 0x0a08, 0x16e1: 0x0c08, 0x16e2: 0x0808, 0x16e3: 0x0808, + 0x16e4: 0x0c08, 0x16e5: 0x3308, 0x16e6: 0x3308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040, + 0x16ea: 0x0040, 0x16eb: 0x0a18, 0x16ec: 0x0a18, 0x16ed: 0x0a18, 0x16ee: 0x0a18, 0x16ef: 0x0c18, + 0x16f0: 0x0818, 0x16f1: 0x0818, 0x16f2: 0x0818, 0x16f3: 0x0818, 0x16f4: 0x0818, 0x16f5: 0x0818, + 0x16f6: 0x0818, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040, + 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040, // Block 0x5c, offset 0x1700 - 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x874d, 0x1703: 0x872d, 0x1704: 0x892d, 0x1705: 0x872d, - 0x1706: 0x874d, 0x1707: 0x872d, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x894d, 0x170b: 0x874d, - 0x170c: 0x896d, 0x170d: 0x892d, 0x170e: 0x896d, 0x170f: 0x874d, 0x1710: 0x0040, 0x1711: 0x0040, - 0x1712: 0x898d, 0x1713: 0x89ad, 0x1714: 0x88ad, 0x1715: 0x896d, 0x1716: 0x892d, 0x1717: 0x896d, - 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x89cd, 0x171b: 0x89ed, 0x171c: 0x89cd, 0x171d: 0x0040, - 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb591, 0x1721: 0xb5a9, 0x1722: 0xb5c1, 0x1723: 0x8a0e, - 0x1724: 0xb5d9, 0x1725: 0xb5f1, 0x1726: 0x8a2d, 0x1727: 0x0040, 0x1728: 0x8a4d, 0x1729: 0x8a6d, - 0x172a: 0x8a8d, 0x172b: 0x8a6d, 0x172c: 0x8aad, 0x172d: 0x8acd, 0x172e: 0x8aed, 0x172f: 0x0040, + 0x1700: 0x0a08, 0x1701: 0x0c08, 0x1702: 0x0a08, 0x1703: 0x0c08, 0x1704: 0x0c08, 0x1705: 0x0c08, + 0x1706: 0x0a08, 0x1707: 0x0a08, 0x1708: 0x0a08, 0x1709: 0x0c08, 0x170a: 0x0a08, 0x170b: 0x0a08, + 0x170c: 0x0c08, 0x170d: 0x0a08, 0x170e: 0x0c08, 0x170f: 0x0c08, 0x1710: 0x0a08, 0x1711: 0x0c08, + 0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040, + 0x1718: 0x0040, 0x1719: 0x0818, 0x171a: 0x0818, 0x171b: 0x0818, 0x171c: 0x0818, 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: 0x0c18, + 0x172a: 0x0c18, 0x172b: 0x0c18, 0x172c: 0x0c18, 0x172d: 0x0a18, 0x172e: 0x0a18, 0x172f: 0x0818, 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, - 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 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: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08, - 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808, - 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08, - 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908, - 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08, - 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808, - 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, - 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18, - 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818, - 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, - 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, + 0x1740: 0x3308, 0x1741: 0x3308, 0x1742: 0x3008, 0x1743: 0x3008, 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: 0x3308, + 0x177c: 0x3308, 0x177d: 0x0008, 0x177e: 0x3008, 0x177f: 0x3008, // Block 0x5e, offset 0x1780 - 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08, - 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08, - 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08, - 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040, - 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040, - 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040, - 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18, - 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818, - 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040, + 0x1780: 0x3308, 0x1781: 0x3008, 0x1782: 0x3008, 0x1783: 0x3008, 0x1784: 0x3008, 0x1785: 0x0040, + 0x1786: 0x0040, 0x1787: 0x3008, 0x1788: 0x3008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x3008, + 0x178c: 0x3008, 0x178d: 0x3808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x3008, + 0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008, + 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x3008, 0x17a3: 0x3008, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x3308, 0x17a7: 0x3308, 0x17a8: 0x3308, 0x17a9: 0x3308, + 0x17aa: 0x3308, 0x17ab: 0x3308, 0x17ac: 0x3308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040, + 0x17b0: 0x3308, 0x17b1: 0x3308, 0x17b2: 0x3308, 0x17b3: 0x3308, 0x17b4: 0x3308, 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: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008, - 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008, - 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040, - 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008, + 0x17c0: 0x0008, 0x17c1: 0x0008, 0x17c2: 0x0008, 0x17c3: 0x0008, 0x17c4: 0x0008, 0x17c5: 0x0008, + 0x17c6: 0x0008, 0x17c7: 0x0040, 0x17c8: 0x0040, 0x17c9: 0x0008, 0x17ca: 0x0040, 0x17cb: 0x0040, + 0x17cc: 0x0008, 0x17cd: 0x0008, 0x17ce: 0x0008, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0008, + 0x17d2: 0x0008, 0x17d3: 0x0008, 0x17d4: 0x0040, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0040, 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008, 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008, - 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040, + 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0008, 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008, - 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008, - 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x3308, - 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008, + 0x17f0: 0x3008, 0x17f1: 0x3008, 0x17f2: 0x3008, 0x17f3: 0x3008, 0x17f4: 0x3008, 0x17f5: 0x3008, + 0x17f6: 0x0040, 0x17f7: 0x3008, 0x17f8: 0x3008, 0x17f9: 0x0040, 0x17fa: 0x0040, 0x17fb: 0x3308, + 0x17fc: 0x3308, 0x17fd: 0x3808, 0x17fe: 0x3b08, 0x17ff: 0x0008, // Block 0x60, offset 0x1800 - 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040, - 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008, - 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040, - 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008, - 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008, - 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008, - 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308, - 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040, - 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040, - 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, - 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + 0x1800: 0x0019, 0x1801: 0x02e9, 0x1802: 0x03d9, 0x1803: 0x02f1, 0x1804: 0x02f9, 0x1805: 0x03f1, + 0x1806: 0x0309, 0x1807: 0x00a9, 0x1808: 0x0311, 0x1809: 0x00b1, 0x180a: 0x0319, 0x180b: 0x0101, + 0x180c: 0x0321, 0x180d: 0x0329, 0x180e: 0x0051, 0x180f: 0x0339, 0x1810: 0x0751, 0x1811: 0x00b9, + 0x1812: 0x0089, 0x1813: 0x0341, 0x1814: 0x0349, 0x1815: 0x0391, 0x1816: 0x00c1, 0x1817: 0x0109, + 0x1818: 0x00c9, 0x1819: 0x04b1, 0x181a: 0x0019, 0x181b: 0x02e9, 0x181c: 0x03d9, 0x181d: 0x02f1, + 0x181e: 0x02f9, 0x181f: 0x03f1, 0x1820: 0x0309, 0x1821: 0x00a9, 0x1822: 0x0311, 0x1823: 0x00b1, + 0x1824: 0x0319, 0x1825: 0x0101, 0x1826: 0x0321, 0x1827: 0x0329, 0x1828: 0x0051, 0x1829: 0x0339, + 0x182a: 0x0751, 0x182b: 0x00b9, 0x182c: 0x0089, 0x182d: 0x0341, 0x182e: 0x0349, 0x182f: 0x0391, + 0x1830: 0x00c1, 0x1831: 0x0109, 0x1832: 0x00c9, 0x1833: 0x04b1, 0x1834: 0x0019, 0x1835: 0x02e9, + 0x1836: 0x03d9, 0x1837: 0x02f1, 0x1838: 0x02f9, 0x1839: 0x03f1, 0x183a: 0x0309, 0x183b: 0x00a9, + 0x183c: 0x0311, 0x183d: 0x00b1, 0x183e: 0x0319, 0x183f: 0x0101, // Block 0x61, offset 0x1840 - 0x1840: 0x0008, 0x1841: 0x0008, 0x1842: 0x0008, 0x1843: 0x0008, 0x1844: 0x0008, 0x1845: 0x0008, - 0x1846: 0x0008, 0x1847: 0x0040, 0x1848: 0x0040, 0x1849: 0x0008, 0x184a: 0x0040, 0x184b: 0x0040, - 0x184c: 0x0008, 0x184d: 0x0008, 0x184e: 0x0008, 0x184f: 0x0008, 0x1850: 0x0008, 0x1851: 0x0008, - 0x1852: 0x0008, 0x1853: 0x0008, 0x1854: 0x0040, 0x1855: 0x0008, 0x1856: 0x0008, 0x1857: 0x0040, - 0x1858: 0x0008, 0x1859: 0x0008, 0x185a: 0x0008, 0x185b: 0x0008, 0x185c: 0x0008, 0x185d: 0x0008, - 0x185e: 0x0008, 0x185f: 0x0008, 0x1860: 0x0008, 0x1861: 0x0008, 0x1862: 0x0008, 0x1863: 0x0008, - 0x1864: 0x0008, 0x1865: 0x0008, 0x1866: 0x0008, 0x1867: 0x0008, 0x1868: 0x0008, 0x1869: 0x0008, - 0x186a: 0x0008, 0x186b: 0x0008, 0x186c: 0x0008, 0x186d: 0x0008, 0x186e: 0x0008, 0x186f: 0x0008, - 0x1870: 0x3008, 0x1871: 0x3008, 0x1872: 0x3008, 0x1873: 0x3008, 0x1874: 0x3008, 0x1875: 0x3008, - 0x1876: 0x0040, 0x1877: 0x3008, 0x1878: 0x3008, 0x1879: 0x0040, 0x187a: 0x0040, 0x187b: 0x3308, - 0x187c: 0x3308, 0x187d: 0x3808, 0x187e: 0x3b08, 0x187f: 0x0008, + 0x1840: 0x0321, 0x1841: 0x0329, 0x1842: 0x0051, 0x1843: 0x0339, 0x1844: 0x0751, 0x1845: 0x00b9, + 0x1846: 0x0089, 0x1847: 0x0341, 0x1848: 0x0349, 0x1849: 0x0391, 0x184a: 0x00c1, 0x184b: 0x0109, + 0x184c: 0x00c9, 0x184d: 0x04b1, 0x184e: 0x0019, 0x184f: 0x02e9, 0x1850: 0x03d9, 0x1851: 0x02f1, + 0x1852: 0x02f9, 0x1853: 0x03f1, 0x1854: 0x0309, 0x1855: 0x0040, 0x1856: 0x0311, 0x1857: 0x00b1, + 0x1858: 0x0319, 0x1859: 0x0101, 0x185a: 0x0321, 0x185b: 0x0329, 0x185c: 0x0051, 0x185d: 0x0339, + 0x185e: 0x0751, 0x185f: 0x00b9, 0x1860: 0x0089, 0x1861: 0x0341, 0x1862: 0x0349, 0x1863: 0x0391, + 0x1864: 0x00c1, 0x1865: 0x0109, 0x1866: 0x00c9, 0x1867: 0x04b1, 0x1868: 0x0019, 0x1869: 0x02e9, + 0x186a: 0x03d9, 0x186b: 0x02f1, 0x186c: 0x02f9, 0x186d: 0x03f1, 0x186e: 0x0309, 0x186f: 0x00a9, + 0x1870: 0x0311, 0x1871: 0x00b1, 0x1872: 0x0319, 0x1873: 0x0101, 0x1874: 0x0321, 0x1875: 0x0329, + 0x1876: 0x0051, 0x1877: 0x0339, 0x1878: 0x0751, 0x1879: 0x00b9, 0x187a: 0x0089, 0x187b: 0x0341, + 0x187c: 0x0349, 0x187d: 0x0391, 0x187e: 0x00c1, 0x187f: 0x0109, // Block 0x62, offset 0x1880 - 0x1880: 0x0039, 0x1881: 0x0ee9, 0x1882: 0x1159, 0x1883: 0x0ef9, 0x1884: 0x0f09, 0x1885: 0x1199, - 0x1886: 0x0f31, 0x1887: 0x0249, 0x1888: 0x0f41, 0x1889: 0x0259, 0x188a: 0x0f51, 0x188b: 0x0359, - 0x188c: 0x0f61, 0x188d: 0x0f71, 0x188e: 0x00d9, 0x188f: 0x0f99, 0x1890: 0x2039, 0x1891: 0x0269, - 0x1892: 0x01d9, 0x1893: 0x0fa9, 0x1894: 0x0fb9, 0x1895: 0x1089, 0x1896: 0x0279, 0x1897: 0x0369, - 0x1898: 0x0289, 0x1899: 0x13d1, 0x189a: 0x0039, 0x189b: 0x0ee9, 0x189c: 0x1159, 0x189d: 0x0ef9, - 0x189e: 0x0f09, 0x189f: 0x1199, 0x18a0: 0x0f31, 0x18a1: 0x0249, 0x18a2: 0x0f41, 0x18a3: 0x0259, - 0x18a4: 0x0f51, 0x18a5: 0x0359, 0x18a6: 0x0f61, 0x18a7: 0x0f71, 0x18a8: 0x00d9, 0x18a9: 0x0f99, - 0x18aa: 0x2039, 0x18ab: 0x0269, 0x18ac: 0x01d9, 0x18ad: 0x0fa9, 0x18ae: 0x0fb9, 0x18af: 0x1089, - 0x18b0: 0x0279, 0x18b1: 0x0369, 0x18b2: 0x0289, 0x18b3: 0x13d1, 0x18b4: 0x0039, 0x18b5: 0x0ee9, - 0x18b6: 0x1159, 0x18b7: 0x0ef9, 0x18b8: 0x0f09, 0x18b9: 0x1199, 0x18ba: 0x0f31, 0x18bb: 0x0249, - 0x18bc: 0x0f41, 0x18bd: 0x0259, 0x18be: 0x0f51, 0x18bf: 0x0359, + 0x1880: 0x00c9, 0x1881: 0x04b1, 0x1882: 0x0019, 0x1883: 0x02e9, 0x1884: 0x03d9, 0x1885: 0x02f1, + 0x1886: 0x02f9, 0x1887: 0x03f1, 0x1888: 0x0309, 0x1889: 0x00a9, 0x188a: 0x0311, 0x188b: 0x00b1, + 0x188c: 0x0319, 0x188d: 0x0101, 0x188e: 0x0321, 0x188f: 0x0329, 0x1890: 0x0051, 0x1891: 0x0339, + 0x1892: 0x0751, 0x1893: 0x00b9, 0x1894: 0x0089, 0x1895: 0x0341, 0x1896: 0x0349, 0x1897: 0x0391, + 0x1898: 0x00c1, 0x1899: 0x0109, 0x189a: 0x00c9, 0x189b: 0x04b1, 0x189c: 0x0019, 0x189d: 0x0040, + 0x189e: 0x03d9, 0x189f: 0x02f1, 0x18a0: 0x0040, 0x18a1: 0x0040, 0x18a2: 0x0309, 0x18a3: 0x0040, + 0x18a4: 0x0040, 0x18a5: 0x00b1, 0x18a6: 0x0319, 0x18a7: 0x0040, 0x18a8: 0x0040, 0x18a9: 0x0329, + 0x18aa: 0x0051, 0x18ab: 0x0339, 0x18ac: 0x0751, 0x18ad: 0x0040, 0x18ae: 0x0089, 0x18af: 0x0341, + 0x18b0: 0x0349, 0x18b1: 0x0391, 0x18b2: 0x00c1, 0x18b3: 0x0109, 0x18b4: 0x00c9, 0x18b5: 0x04b1, + 0x18b6: 0x0019, 0x18b7: 0x02e9, 0x18b8: 0x03d9, 0x18b9: 0x02f1, 0x18ba: 0x0040, 0x18bb: 0x03f1, + 0x18bc: 0x0040, 0x18bd: 0x00a9, 0x18be: 0x0311, 0x18bf: 0x00b1, // Block 0x63, offset 0x18c0 - 0x18c0: 0x0f61, 0x18c1: 0x0f71, 0x18c2: 0x00d9, 0x18c3: 0x0f99, 0x18c4: 0x2039, 0x18c5: 0x0269, - 0x18c6: 0x01d9, 0x18c7: 0x0fa9, 0x18c8: 0x0fb9, 0x18c9: 0x1089, 0x18ca: 0x0279, 0x18cb: 0x0369, - 0x18cc: 0x0289, 0x18cd: 0x13d1, 0x18ce: 0x0039, 0x18cf: 0x0ee9, 0x18d0: 0x1159, 0x18d1: 0x0ef9, - 0x18d2: 0x0f09, 0x18d3: 0x1199, 0x18d4: 0x0f31, 0x18d5: 0x0040, 0x18d6: 0x0f41, 0x18d7: 0x0259, - 0x18d8: 0x0f51, 0x18d9: 0x0359, 0x18da: 0x0f61, 0x18db: 0x0f71, 0x18dc: 0x00d9, 0x18dd: 0x0f99, - 0x18de: 0x2039, 0x18df: 0x0269, 0x18e0: 0x01d9, 0x18e1: 0x0fa9, 0x18e2: 0x0fb9, 0x18e3: 0x1089, - 0x18e4: 0x0279, 0x18e5: 0x0369, 0x18e6: 0x0289, 0x18e7: 0x13d1, 0x18e8: 0x0039, 0x18e9: 0x0ee9, - 0x18ea: 0x1159, 0x18eb: 0x0ef9, 0x18ec: 0x0f09, 0x18ed: 0x1199, 0x18ee: 0x0f31, 0x18ef: 0x0249, - 0x18f0: 0x0f41, 0x18f1: 0x0259, 0x18f2: 0x0f51, 0x18f3: 0x0359, 0x18f4: 0x0f61, 0x18f5: 0x0f71, - 0x18f6: 0x00d9, 0x18f7: 0x0f99, 0x18f8: 0x2039, 0x18f9: 0x0269, 0x18fa: 0x01d9, 0x18fb: 0x0fa9, - 0x18fc: 0x0fb9, 0x18fd: 0x1089, 0x18fe: 0x0279, 0x18ff: 0x0369, + 0x18c0: 0x0319, 0x18c1: 0x0101, 0x18c2: 0x0321, 0x18c3: 0x0329, 0x18c4: 0x0040, 0x18c5: 0x0339, + 0x18c6: 0x0751, 0x18c7: 0x00b9, 0x18c8: 0x0089, 0x18c9: 0x0341, 0x18ca: 0x0349, 0x18cb: 0x0391, + 0x18cc: 0x00c1, 0x18cd: 0x0109, 0x18ce: 0x00c9, 0x18cf: 0x04b1, 0x18d0: 0x0019, 0x18d1: 0x02e9, + 0x18d2: 0x03d9, 0x18d3: 0x02f1, 0x18d4: 0x02f9, 0x18d5: 0x03f1, 0x18d6: 0x0309, 0x18d7: 0x00a9, + 0x18d8: 0x0311, 0x18d9: 0x00b1, 0x18da: 0x0319, 0x18db: 0x0101, 0x18dc: 0x0321, 0x18dd: 0x0329, + 0x18de: 0x0051, 0x18df: 0x0339, 0x18e0: 0x0751, 0x18e1: 0x00b9, 0x18e2: 0x0089, 0x18e3: 0x0341, + 0x18e4: 0x0349, 0x18e5: 0x0391, 0x18e6: 0x00c1, 0x18e7: 0x0109, 0x18e8: 0x00c9, 0x18e9: 0x04b1, + 0x18ea: 0x0019, 0x18eb: 0x02e9, 0x18ec: 0x03d9, 0x18ed: 0x02f1, 0x18ee: 0x02f9, 0x18ef: 0x03f1, + 0x18f0: 0x0309, 0x18f1: 0x00a9, 0x18f2: 0x0311, 0x18f3: 0x00b1, 0x18f4: 0x0319, 0x18f5: 0x0101, + 0x18f6: 0x0321, 0x18f7: 0x0329, 0x18f8: 0x0051, 0x18f9: 0x0339, 0x18fa: 0x0751, 0x18fb: 0x00b9, + 0x18fc: 0x0089, 0x18fd: 0x0341, 0x18fe: 0x0349, 0x18ff: 0x0391, // Block 0x64, offset 0x1900 - 0x1900: 0x0289, 0x1901: 0x13d1, 0x1902: 0x0039, 0x1903: 0x0ee9, 0x1904: 0x1159, 0x1905: 0x0ef9, - 0x1906: 0x0f09, 0x1907: 0x1199, 0x1908: 0x0f31, 0x1909: 0x0249, 0x190a: 0x0f41, 0x190b: 0x0259, - 0x190c: 0x0f51, 0x190d: 0x0359, 0x190e: 0x0f61, 0x190f: 0x0f71, 0x1910: 0x00d9, 0x1911: 0x0f99, - 0x1912: 0x2039, 0x1913: 0x0269, 0x1914: 0x01d9, 0x1915: 0x0fa9, 0x1916: 0x0fb9, 0x1917: 0x1089, - 0x1918: 0x0279, 0x1919: 0x0369, 0x191a: 0x0289, 0x191b: 0x13d1, 0x191c: 0x0039, 0x191d: 0x0040, - 0x191e: 0x1159, 0x191f: 0x0ef9, 0x1920: 0x0040, 0x1921: 0x0040, 0x1922: 0x0f31, 0x1923: 0x0040, - 0x1924: 0x0040, 0x1925: 0x0259, 0x1926: 0x0f51, 0x1927: 0x0040, 0x1928: 0x0040, 0x1929: 0x0f71, - 0x192a: 0x00d9, 0x192b: 0x0f99, 0x192c: 0x2039, 0x192d: 0x0040, 0x192e: 0x01d9, 0x192f: 0x0fa9, - 0x1930: 0x0fb9, 0x1931: 0x1089, 0x1932: 0x0279, 0x1933: 0x0369, 0x1934: 0x0289, 0x1935: 0x13d1, - 0x1936: 0x0039, 0x1937: 0x0ee9, 0x1938: 0x1159, 0x1939: 0x0ef9, 0x193a: 0x0040, 0x193b: 0x1199, - 0x193c: 0x0040, 0x193d: 0x0249, 0x193e: 0x0f41, 0x193f: 0x0259, + 0x1900: 0x00c1, 0x1901: 0x0109, 0x1902: 0x00c9, 0x1903: 0x04b1, 0x1904: 0x0019, 0x1905: 0x02e9, + 0x1906: 0x0040, 0x1907: 0x02f1, 0x1908: 0x02f9, 0x1909: 0x03f1, 0x190a: 0x0309, 0x190b: 0x0040, + 0x190c: 0x0040, 0x190d: 0x00b1, 0x190e: 0x0319, 0x190f: 0x0101, 0x1910: 0x0321, 0x1911: 0x0329, + 0x1912: 0x0051, 0x1913: 0x0339, 0x1914: 0x0751, 0x1915: 0x0040, 0x1916: 0x0089, 0x1917: 0x0341, + 0x1918: 0x0349, 0x1919: 0x0391, 0x191a: 0x00c1, 0x191b: 0x0109, 0x191c: 0x00c9, 0x191d: 0x0040, + 0x191e: 0x0019, 0x191f: 0x02e9, 0x1920: 0x03d9, 0x1921: 0x02f1, 0x1922: 0x02f9, 0x1923: 0x03f1, + 0x1924: 0x0309, 0x1925: 0x00a9, 0x1926: 0x0311, 0x1927: 0x00b1, 0x1928: 0x0319, 0x1929: 0x0101, + 0x192a: 0x0321, 0x192b: 0x0329, 0x192c: 0x0051, 0x192d: 0x0339, 0x192e: 0x0751, 0x192f: 0x00b9, + 0x1930: 0x0089, 0x1931: 0x0341, 0x1932: 0x0349, 0x1933: 0x0391, 0x1934: 0x00c1, 0x1935: 0x0109, + 0x1936: 0x00c9, 0x1937: 0x04b1, 0x1938: 0x0019, 0x1939: 0x02e9, 0x193a: 0x0040, 0x193b: 0x02f1, + 0x193c: 0x02f9, 0x193d: 0x03f1, 0x193e: 0x0309, 0x193f: 0x0040, // Block 0x65, offset 0x1940 - 0x1940: 0x0f51, 0x1941: 0x0359, 0x1942: 0x0f61, 0x1943: 0x0f71, 0x1944: 0x0040, 0x1945: 0x0f99, - 0x1946: 0x2039, 0x1947: 0x0269, 0x1948: 0x01d9, 0x1949: 0x0fa9, 0x194a: 0x0fb9, 0x194b: 0x1089, - 0x194c: 0x0279, 0x194d: 0x0369, 0x194e: 0x0289, 0x194f: 0x13d1, 0x1950: 0x0039, 0x1951: 0x0ee9, - 0x1952: 0x1159, 0x1953: 0x0ef9, 0x1954: 0x0f09, 0x1955: 0x1199, 0x1956: 0x0f31, 0x1957: 0x0249, - 0x1958: 0x0f41, 0x1959: 0x0259, 0x195a: 0x0f51, 0x195b: 0x0359, 0x195c: 0x0f61, 0x195d: 0x0f71, - 0x195e: 0x00d9, 0x195f: 0x0f99, 0x1960: 0x2039, 0x1961: 0x0269, 0x1962: 0x01d9, 0x1963: 0x0fa9, - 0x1964: 0x0fb9, 0x1965: 0x1089, 0x1966: 0x0279, 0x1967: 0x0369, 0x1968: 0x0289, 0x1969: 0x13d1, - 0x196a: 0x0039, 0x196b: 0x0ee9, 0x196c: 0x1159, 0x196d: 0x0ef9, 0x196e: 0x0f09, 0x196f: 0x1199, - 0x1970: 0x0f31, 0x1971: 0x0249, 0x1972: 0x0f41, 0x1973: 0x0259, 0x1974: 0x0f51, 0x1975: 0x0359, - 0x1976: 0x0f61, 0x1977: 0x0f71, 0x1978: 0x00d9, 0x1979: 0x0f99, 0x197a: 0x2039, 0x197b: 0x0269, - 0x197c: 0x01d9, 0x197d: 0x0fa9, 0x197e: 0x0fb9, 0x197f: 0x1089, + 0x1940: 0x0311, 0x1941: 0x00b1, 0x1942: 0x0319, 0x1943: 0x0101, 0x1944: 0x0321, 0x1945: 0x0040, + 0x1946: 0x0051, 0x1947: 0x0040, 0x1948: 0x0040, 0x1949: 0x0040, 0x194a: 0x0089, 0x194b: 0x0341, + 0x194c: 0x0349, 0x194d: 0x0391, 0x194e: 0x00c1, 0x194f: 0x0109, 0x1950: 0x00c9, 0x1951: 0x0040, + 0x1952: 0x0019, 0x1953: 0x02e9, 0x1954: 0x03d9, 0x1955: 0x02f1, 0x1956: 0x02f9, 0x1957: 0x03f1, + 0x1958: 0x0309, 0x1959: 0x00a9, 0x195a: 0x0311, 0x195b: 0x00b1, 0x195c: 0x0319, 0x195d: 0x0101, + 0x195e: 0x0321, 0x195f: 0x0329, 0x1960: 0x0051, 0x1961: 0x0339, 0x1962: 0x0751, 0x1963: 0x00b9, + 0x1964: 0x0089, 0x1965: 0x0341, 0x1966: 0x0349, 0x1967: 0x0391, 0x1968: 0x00c1, 0x1969: 0x0109, + 0x196a: 0x00c9, 0x196b: 0x04b1, 0x196c: 0x0019, 0x196d: 0x02e9, 0x196e: 0x03d9, 0x196f: 0x02f1, + 0x1970: 0x02f9, 0x1971: 0x03f1, 0x1972: 0x0309, 0x1973: 0x00a9, 0x1974: 0x0311, 0x1975: 0x00b1, + 0x1976: 0x0319, 0x1977: 0x0101, 0x1978: 0x0321, 0x1979: 0x0329, 0x197a: 0x0051, 0x197b: 0x0339, + 0x197c: 0x0751, 0x197d: 0x00b9, 0x197e: 0x0089, 0x197f: 0x0341, // Block 0x66, offset 0x1980 - 0x1980: 0x0279, 0x1981: 0x0369, 0x1982: 0x0289, 0x1983: 0x13d1, 0x1984: 0x0039, 0x1985: 0x0ee9, - 0x1986: 0x0040, 0x1987: 0x0ef9, 0x1988: 0x0f09, 0x1989: 0x1199, 0x198a: 0x0f31, 0x198b: 0x0040, - 0x198c: 0x0040, 0x198d: 0x0259, 0x198e: 0x0f51, 0x198f: 0x0359, 0x1990: 0x0f61, 0x1991: 0x0f71, - 0x1992: 0x00d9, 0x1993: 0x0f99, 0x1994: 0x2039, 0x1995: 0x0040, 0x1996: 0x01d9, 0x1997: 0x0fa9, - 0x1998: 0x0fb9, 0x1999: 0x1089, 0x199a: 0x0279, 0x199b: 0x0369, 0x199c: 0x0289, 0x199d: 0x0040, - 0x199e: 0x0039, 0x199f: 0x0ee9, 0x19a0: 0x1159, 0x19a1: 0x0ef9, 0x19a2: 0x0f09, 0x19a3: 0x1199, - 0x19a4: 0x0f31, 0x19a5: 0x0249, 0x19a6: 0x0f41, 0x19a7: 0x0259, 0x19a8: 0x0f51, 0x19a9: 0x0359, - 0x19aa: 0x0f61, 0x19ab: 0x0f71, 0x19ac: 0x00d9, 0x19ad: 0x0f99, 0x19ae: 0x2039, 0x19af: 0x0269, - 0x19b0: 0x01d9, 0x19b1: 0x0fa9, 0x19b2: 0x0fb9, 0x19b3: 0x1089, 0x19b4: 0x0279, 0x19b5: 0x0369, - 0x19b6: 0x0289, 0x19b7: 0x13d1, 0x19b8: 0x0039, 0x19b9: 0x0ee9, 0x19ba: 0x0040, 0x19bb: 0x0ef9, - 0x19bc: 0x0f09, 0x19bd: 0x1199, 0x19be: 0x0f31, 0x19bf: 0x0040, + 0x1980: 0x0349, 0x1981: 0x0391, 0x1982: 0x00c1, 0x1983: 0x0109, 0x1984: 0x00c9, 0x1985: 0x04b1, + 0x1986: 0x0019, 0x1987: 0x02e9, 0x1988: 0x03d9, 0x1989: 0x02f1, 0x198a: 0x02f9, 0x198b: 0x03f1, + 0x198c: 0x0309, 0x198d: 0x00a9, 0x198e: 0x0311, 0x198f: 0x00b1, 0x1990: 0x0319, 0x1991: 0x0101, + 0x1992: 0x0321, 0x1993: 0x0329, 0x1994: 0x0051, 0x1995: 0x0339, 0x1996: 0x0751, 0x1997: 0x00b9, + 0x1998: 0x0089, 0x1999: 0x0341, 0x199a: 0x0349, 0x199b: 0x0391, 0x199c: 0x00c1, 0x199d: 0x0109, + 0x199e: 0x00c9, 0x199f: 0x04b1, 0x19a0: 0x0019, 0x19a1: 0x02e9, 0x19a2: 0x03d9, 0x19a3: 0x02f1, + 0x19a4: 0x02f9, 0x19a5: 0x03f1, 0x19a6: 0x0309, 0x19a7: 0x00a9, 0x19a8: 0x0311, 0x19a9: 0x00b1, + 0x19aa: 0x0319, 0x19ab: 0x0101, 0x19ac: 0x0321, 0x19ad: 0x0329, 0x19ae: 0x0051, 0x19af: 0x0339, + 0x19b0: 0x0751, 0x19b1: 0x00b9, 0x19b2: 0x0089, 0x19b3: 0x0341, 0x19b4: 0x0349, 0x19b5: 0x0391, + 0x19b6: 0x00c1, 0x19b7: 0x0109, 0x19b8: 0x00c9, 0x19b9: 0x04b1, 0x19ba: 0x0019, 0x19bb: 0x02e9, + 0x19bc: 0x03d9, 0x19bd: 0x02f1, 0x19be: 0x02f9, 0x19bf: 0x03f1, // Block 0x67, offset 0x19c0 - 0x19c0: 0x0f41, 0x19c1: 0x0259, 0x19c2: 0x0f51, 0x19c3: 0x0359, 0x19c4: 0x0f61, 0x19c5: 0x0040, - 0x19c6: 0x00d9, 0x19c7: 0x0040, 0x19c8: 0x0040, 0x19c9: 0x0040, 0x19ca: 0x01d9, 0x19cb: 0x0fa9, - 0x19cc: 0x0fb9, 0x19cd: 0x1089, 0x19ce: 0x0279, 0x19cf: 0x0369, 0x19d0: 0x0289, 0x19d1: 0x0040, - 0x19d2: 0x0039, 0x19d3: 0x0ee9, 0x19d4: 0x1159, 0x19d5: 0x0ef9, 0x19d6: 0x0f09, 0x19d7: 0x1199, - 0x19d8: 0x0f31, 0x19d9: 0x0249, 0x19da: 0x0f41, 0x19db: 0x0259, 0x19dc: 0x0f51, 0x19dd: 0x0359, - 0x19de: 0x0f61, 0x19df: 0x0f71, 0x19e0: 0x00d9, 0x19e1: 0x0f99, 0x19e2: 0x2039, 0x19e3: 0x0269, - 0x19e4: 0x01d9, 0x19e5: 0x0fa9, 0x19e6: 0x0fb9, 0x19e7: 0x1089, 0x19e8: 0x0279, 0x19e9: 0x0369, - 0x19ea: 0x0289, 0x19eb: 0x13d1, 0x19ec: 0x0039, 0x19ed: 0x0ee9, 0x19ee: 0x1159, 0x19ef: 0x0ef9, - 0x19f0: 0x0f09, 0x19f1: 0x1199, 0x19f2: 0x0f31, 0x19f3: 0x0249, 0x19f4: 0x0f41, 0x19f5: 0x0259, - 0x19f6: 0x0f51, 0x19f7: 0x0359, 0x19f8: 0x0f61, 0x19f9: 0x0f71, 0x19fa: 0x00d9, 0x19fb: 0x0f99, - 0x19fc: 0x2039, 0x19fd: 0x0269, 0x19fe: 0x01d9, 0x19ff: 0x0fa9, + 0x19c0: 0x0309, 0x19c1: 0x00a9, 0x19c2: 0x0311, 0x19c3: 0x00b1, 0x19c4: 0x0319, 0x19c5: 0x0101, + 0x19c6: 0x0321, 0x19c7: 0x0329, 0x19c8: 0x0051, 0x19c9: 0x0339, 0x19ca: 0x0751, 0x19cb: 0x00b9, + 0x19cc: 0x0089, 0x19cd: 0x0341, 0x19ce: 0x0349, 0x19cf: 0x0391, 0x19d0: 0x00c1, 0x19d1: 0x0109, + 0x19d2: 0x00c9, 0x19d3: 0x04b1, 0x19d4: 0x0019, 0x19d5: 0x02e9, 0x19d6: 0x03d9, 0x19d7: 0x02f1, + 0x19d8: 0x02f9, 0x19d9: 0x03f1, 0x19da: 0x0309, 0x19db: 0x00a9, 0x19dc: 0x0311, 0x19dd: 0x00b1, + 0x19de: 0x0319, 0x19df: 0x0101, 0x19e0: 0x0321, 0x19e1: 0x0329, 0x19e2: 0x0051, 0x19e3: 0x0339, + 0x19e4: 0x0751, 0x19e5: 0x00b9, 0x19e6: 0x0089, 0x19e7: 0x0341, 0x19e8: 0x0349, 0x19e9: 0x0391, + 0x19ea: 0x00c1, 0x19eb: 0x0109, 0x19ec: 0x00c9, 0x19ed: 0x04b1, 0x19ee: 0x0019, 0x19ef: 0x02e9, + 0x19f0: 0x03d9, 0x19f1: 0x02f1, 0x19f2: 0x02f9, 0x19f3: 0x03f1, 0x19f4: 0x0309, 0x19f5: 0x00a9, + 0x19f6: 0x0311, 0x19f7: 0x00b1, 0x19f8: 0x0319, 0x19f9: 0x0101, 0x19fa: 0x0321, 0x19fb: 0x0329, + 0x19fc: 0x0051, 0x19fd: 0x0339, 0x19fe: 0x0751, 0x19ff: 0x00b9, // Block 0x68, offset 0x1a00 - 0x1a00: 0x0fb9, 0x1a01: 0x1089, 0x1a02: 0x0279, 0x1a03: 0x0369, 0x1a04: 0x0289, 0x1a05: 0x13d1, - 0x1a06: 0x0039, 0x1a07: 0x0ee9, 0x1a08: 0x1159, 0x1a09: 0x0ef9, 0x1a0a: 0x0f09, 0x1a0b: 0x1199, - 0x1a0c: 0x0f31, 0x1a0d: 0x0249, 0x1a0e: 0x0f41, 0x1a0f: 0x0259, 0x1a10: 0x0f51, 0x1a11: 0x0359, - 0x1a12: 0x0f61, 0x1a13: 0x0f71, 0x1a14: 0x00d9, 0x1a15: 0x0f99, 0x1a16: 0x2039, 0x1a17: 0x0269, - 0x1a18: 0x01d9, 0x1a19: 0x0fa9, 0x1a1a: 0x0fb9, 0x1a1b: 0x1089, 0x1a1c: 0x0279, 0x1a1d: 0x0369, - 0x1a1e: 0x0289, 0x1a1f: 0x13d1, 0x1a20: 0x0039, 0x1a21: 0x0ee9, 0x1a22: 0x1159, 0x1a23: 0x0ef9, - 0x1a24: 0x0f09, 0x1a25: 0x1199, 0x1a26: 0x0f31, 0x1a27: 0x0249, 0x1a28: 0x0f41, 0x1a29: 0x0259, - 0x1a2a: 0x0f51, 0x1a2b: 0x0359, 0x1a2c: 0x0f61, 0x1a2d: 0x0f71, 0x1a2e: 0x00d9, 0x1a2f: 0x0f99, - 0x1a30: 0x2039, 0x1a31: 0x0269, 0x1a32: 0x01d9, 0x1a33: 0x0fa9, 0x1a34: 0x0fb9, 0x1a35: 0x1089, - 0x1a36: 0x0279, 0x1a37: 0x0369, 0x1a38: 0x0289, 0x1a39: 0x13d1, 0x1a3a: 0x0039, 0x1a3b: 0x0ee9, - 0x1a3c: 0x1159, 0x1a3d: 0x0ef9, 0x1a3e: 0x0f09, 0x1a3f: 0x1199, + 0x1a00: 0x0089, 0x1a01: 0x0341, 0x1a02: 0x0349, 0x1a03: 0x0391, 0x1a04: 0x00c1, 0x1a05: 0x0109, + 0x1a06: 0x00c9, 0x1a07: 0x04b1, 0x1a08: 0x0019, 0x1a09: 0x02e9, 0x1a0a: 0x03d9, 0x1a0b: 0x02f1, + 0x1a0c: 0x02f9, 0x1a0d: 0x03f1, 0x1a0e: 0x0309, 0x1a0f: 0x00a9, 0x1a10: 0x0311, 0x1a11: 0x00b1, + 0x1a12: 0x0319, 0x1a13: 0x0101, 0x1a14: 0x0321, 0x1a15: 0x0329, 0x1a16: 0x0051, 0x1a17: 0x0339, + 0x1a18: 0x0751, 0x1a19: 0x00b9, 0x1a1a: 0x0089, 0x1a1b: 0x0341, 0x1a1c: 0x0349, 0x1a1d: 0x0391, + 0x1a1e: 0x00c1, 0x1a1f: 0x0109, 0x1a20: 0x00c9, 0x1a21: 0x04b1, 0x1a22: 0x0019, 0x1a23: 0x02e9, + 0x1a24: 0x03d9, 0x1a25: 0x02f1, 0x1a26: 0x02f9, 0x1a27: 0x03f1, 0x1a28: 0x0309, 0x1a29: 0x00a9, + 0x1a2a: 0x0311, 0x1a2b: 0x00b1, 0x1a2c: 0x0319, 0x1a2d: 0x0101, 0x1a2e: 0x0321, 0x1a2f: 0x0329, + 0x1a30: 0x0051, 0x1a31: 0x0339, 0x1a32: 0x0751, 0x1a33: 0x00b9, 0x1a34: 0x0089, 0x1a35: 0x0341, + 0x1a36: 0x0349, 0x1a37: 0x0391, 0x1a38: 0x00c1, 0x1a39: 0x0109, 0x1a3a: 0x00c9, 0x1a3b: 0x04b1, + 0x1a3c: 0x0019, 0x1a3d: 0x02e9, 0x1a3e: 0x03d9, 0x1a3f: 0x02f1, // Block 0x69, offset 0x1a40 - 0x1a40: 0x0f31, 0x1a41: 0x0249, 0x1a42: 0x0f41, 0x1a43: 0x0259, 0x1a44: 0x0f51, 0x1a45: 0x0359, - 0x1a46: 0x0f61, 0x1a47: 0x0f71, 0x1a48: 0x00d9, 0x1a49: 0x0f99, 0x1a4a: 0x2039, 0x1a4b: 0x0269, - 0x1a4c: 0x01d9, 0x1a4d: 0x0fa9, 0x1a4e: 0x0fb9, 0x1a4f: 0x1089, 0x1a50: 0x0279, 0x1a51: 0x0369, - 0x1a52: 0x0289, 0x1a53: 0x13d1, 0x1a54: 0x0039, 0x1a55: 0x0ee9, 0x1a56: 0x1159, 0x1a57: 0x0ef9, - 0x1a58: 0x0f09, 0x1a59: 0x1199, 0x1a5a: 0x0f31, 0x1a5b: 0x0249, 0x1a5c: 0x0f41, 0x1a5d: 0x0259, - 0x1a5e: 0x0f51, 0x1a5f: 0x0359, 0x1a60: 0x0f61, 0x1a61: 0x0f71, 0x1a62: 0x00d9, 0x1a63: 0x0f99, - 0x1a64: 0x2039, 0x1a65: 0x0269, 0x1a66: 0x01d9, 0x1a67: 0x0fa9, 0x1a68: 0x0fb9, 0x1a69: 0x1089, - 0x1a6a: 0x0279, 0x1a6b: 0x0369, 0x1a6c: 0x0289, 0x1a6d: 0x13d1, 0x1a6e: 0x0039, 0x1a6f: 0x0ee9, - 0x1a70: 0x1159, 0x1a71: 0x0ef9, 0x1a72: 0x0f09, 0x1a73: 0x1199, 0x1a74: 0x0f31, 0x1a75: 0x0249, - 0x1a76: 0x0f41, 0x1a77: 0x0259, 0x1a78: 0x0f51, 0x1a79: 0x0359, 0x1a7a: 0x0f61, 0x1a7b: 0x0f71, - 0x1a7c: 0x00d9, 0x1a7d: 0x0f99, 0x1a7e: 0x2039, 0x1a7f: 0x0269, + 0x1a40: 0x02f9, 0x1a41: 0x03f1, 0x1a42: 0x0309, 0x1a43: 0x00a9, 0x1a44: 0x0311, 0x1a45: 0x00b1, + 0x1a46: 0x0319, 0x1a47: 0x0101, 0x1a48: 0x0321, 0x1a49: 0x0329, 0x1a4a: 0x0051, 0x1a4b: 0x0339, + 0x1a4c: 0x0751, 0x1a4d: 0x00b9, 0x1a4e: 0x0089, 0x1a4f: 0x0341, 0x1a50: 0x0349, 0x1a51: 0x0391, + 0x1a52: 0x00c1, 0x1a53: 0x0109, 0x1a54: 0x00c9, 0x1a55: 0x04b1, 0x1a56: 0x0019, 0x1a57: 0x02e9, + 0x1a58: 0x03d9, 0x1a59: 0x02f1, 0x1a5a: 0x02f9, 0x1a5b: 0x03f1, 0x1a5c: 0x0309, 0x1a5d: 0x00a9, + 0x1a5e: 0x0311, 0x1a5f: 0x00b1, 0x1a60: 0x0319, 0x1a61: 0x0101, 0x1a62: 0x0321, 0x1a63: 0x0329, + 0x1a64: 0x0051, 0x1a65: 0x0339, 0x1a66: 0x0751, 0x1a67: 0x00b9, 0x1a68: 0x0089, 0x1a69: 0x0341, + 0x1a6a: 0x0349, 0x1a6b: 0x0391, 0x1a6c: 0x00c1, 0x1a6d: 0x0109, 0x1a6e: 0x00c9, 0x1a6f: 0x04b1, + 0x1a70: 0x0019, 0x1a71: 0x02e9, 0x1a72: 0x03d9, 0x1a73: 0x02f1, 0x1a74: 0x02f9, 0x1a75: 0x03f1, + 0x1a76: 0x0309, 0x1a77: 0x00a9, 0x1a78: 0x0311, 0x1a79: 0x00b1, 0x1a7a: 0x0319, 0x1a7b: 0x0101, + 0x1a7c: 0x0321, 0x1a7d: 0x0329, 0x1a7e: 0x0051, 0x1a7f: 0x0339, // Block 0x6a, offset 0x1a80 - 0x1a80: 0x01d9, 0x1a81: 0x0fa9, 0x1a82: 0x0fb9, 0x1a83: 0x1089, 0x1a84: 0x0279, 0x1a85: 0x0369, - 0x1a86: 0x0289, 0x1a87: 0x13d1, 0x1a88: 0x0039, 0x1a89: 0x0ee9, 0x1a8a: 0x1159, 0x1a8b: 0x0ef9, - 0x1a8c: 0x0f09, 0x1a8d: 0x1199, 0x1a8e: 0x0f31, 0x1a8f: 0x0249, 0x1a90: 0x0f41, 0x1a91: 0x0259, - 0x1a92: 0x0f51, 0x1a93: 0x0359, 0x1a94: 0x0f61, 0x1a95: 0x0f71, 0x1a96: 0x00d9, 0x1a97: 0x0f99, - 0x1a98: 0x2039, 0x1a99: 0x0269, 0x1a9a: 0x01d9, 0x1a9b: 0x0fa9, 0x1a9c: 0x0fb9, 0x1a9d: 0x1089, - 0x1a9e: 0x0279, 0x1a9f: 0x0369, 0x1aa0: 0x0289, 0x1aa1: 0x13d1, 0x1aa2: 0x0039, 0x1aa3: 0x0ee9, - 0x1aa4: 0x1159, 0x1aa5: 0x0ef9, 0x1aa6: 0x0f09, 0x1aa7: 0x1199, 0x1aa8: 0x0f31, 0x1aa9: 0x0249, - 0x1aaa: 0x0f41, 0x1aab: 0x0259, 0x1aac: 0x0f51, 0x1aad: 0x0359, 0x1aae: 0x0f61, 0x1aaf: 0x0f71, - 0x1ab0: 0x00d9, 0x1ab1: 0x0f99, 0x1ab2: 0x2039, 0x1ab3: 0x0269, 0x1ab4: 0x01d9, 0x1ab5: 0x0fa9, - 0x1ab6: 0x0fb9, 0x1ab7: 0x1089, 0x1ab8: 0x0279, 0x1ab9: 0x0369, 0x1aba: 0x0289, 0x1abb: 0x13d1, - 0x1abc: 0x0039, 0x1abd: 0x0ee9, 0x1abe: 0x1159, 0x1abf: 0x0ef9, + 0x1a80: 0x0751, 0x1a81: 0x00b9, 0x1a82: 0x0089, 0x1a83: 0x0341, 0x1a84: 0x0349, 0x1a85: 0x0391, + 0x1a86: 0x00c1, 0x1a87: 0x0109, 0x1a88: 0x00c9, 0x1a89: 0x04b1, 0x1a8a: 0x0019, 0x1a8b: 0x02e9, + 0x1a8c: 0x03d9, 0x1a8d: 0x02f1, 0x1a8e: 0x02f9, 0x1a8f: 0x03f1, 0x1a90: 0x0309, 0x1a91: 0x00a9, + 0x1a92: 0x0311, 0x1a93: 0x00b1, 0x1a94: 0x0319, 0x1a95: 0x0101, 0x1a96: 0x0321, 0x1a97: 0x0329, + 0x1a98: 0x0051, 0x1a99: 0x0339, 0x1a9a: 0x0751, 0x1a9b: 0x00b9, 0x1a9c: 0x0089, 0x1a9d: 0x0341, + 0x1a9e: 0x0349, 0x1a9f: 0x0391, 0x1aa0: 0x00c1, 0x1aa1: 0x0109, 0x1aa2: 0x00c9, 0x1aa3: 0x04b1, + 0x1aa4: 0x2279, 0x1aa5: 0x2281, 0x1aa6: 0x0040, 0x1aa7: 0x0040, 0x1aa8: 0x2289, 0x1aa9: 0x0399, + 0x1aaa: 0x03a1, 0x1aab: 0x03a9, 0x1aac: 0x2291, 0x1aad: 0x2299, 0x1aae: 0x22a1, 0x1aaf: 0x04d1, + 0x1ab0: 0x05f9, 0x1ab1: 0x22a9, 0x1ab2: 0x22b1, 0x1ab3: 0x22b9, 0x1ab4: 0x22c1, 0x1ab5: 0x22c9, + 0x1ab6: 0x22d1, 0x1ab7: 0x0799, 0x1ab8: 0x03c1, 0x1ab9: 0x04d1, 0x1aba: 0x22d9, 0x1abb: 0x22e1, + 0x1abc: 0x22e9, 0x1abd: 0x03b1, 0x1abe: 0x03b9, 0x1abf: 0x22f1, // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0x0f09, 0x1ac1: 0x1199, 0x1ac2: 0x0f31, 0x1ac3: 0x0249, 0x1ac4: 0x0f41, 0x1ac5: 0x0259, - 0x1ac6: 0x0f51, 0x1ac7: 0x0359, 0x1ac8: 0x0f61, 0x1ac9: 0x0f71, 0x1aca: 0x00d9, 0x1acb: 0x0f99, - 0x1acc: 0x2039, 0x1acd: 0x0269, 0x1ace: 0x01d9, 0x1acf: 0x0fa9, 0x1ad0: 0x0fb9, 0x1ad1: 0x1089, - 0x1ad2: 0x0279, 0x1ad3: 0x0369, 0x1ad4: 0x0289, 0x1ad5: 0x13d1, 0x1ad6: 0x0039, 0x1ad7: 0x0ee9, - 0x1ad8: 0x1159, 0x1ad9: 0x0ef9, 0x1ada: 0x0f09, 0x1adb: 0x1199, 0x1adc: 0x0f31, 0x1add: 0x0249, - 0x1ade: 0x0f41, 0x1adf: 0x0259, 0x1ae0: 0x0f51, 0x1ae1: 0x0359, 0x1ae2: 0x0f61, 0x1ae3: 0x0f71, - 0x1ae4: 0x00d9, 0x1ae5: 0x0f99, 0x1ae6: 0x2039, 0x1ae7: 0x0269, 0x1ae8: 0x01d9, 0x1ae9: 0x0fa9, - 0x1aea: 0x0fb9, 0x1aeb: 0x1089, 0x1aec: 0x0279, 0x1aed: 0x0369, 0x1aee: 0x0289, 0x1aef: 0x13d1, - 0x1af0: 0x0039, 0x1af1: 0x0ee9, 0x1af2: 0x1159, 0x1af3: 0x0ef9, 0x1af4: 0x0f09, 0x1af5: 0x1199, - 0x1af6: 0x0f31, 0x1af7: 0x0249, 0x1af8: 0x0f41, 0x1af9: 0x0259, 0x1afa: 0x0f51, 0x1afb: 0x0359, - 0x1afc: 0x0f61, 0x1afd: 0x0f71, 0x1afe: 0x00d9, 0x1aff: 0x0f99, + 0x1ac0: 0x0769, 0x1ac1: 0x22f9, 0x1ac2: 0x2289, 0x1ac3: 0x0399, 0x1ac4: 0x03a1, 0x1ac5: 0x03a9, + 0x1ac6: 0x2291, 0x1ac7: 0x2299, 0x1ac8: 0x22a1, 0x1ac9: 0x04d1, 0x1aca: 0x05f9, 0x1acb: 0x22a9, + 0x1acc: 0x22b1, 0x1acd: 0x22b9, 0x1ace: 0x22c1, 0x1acf: 0x22c9, 0x1ad0: 0x22d1, 0x1ad1: 0x0799, + 0x1ad2: 0x03c1, 0x1ad3: 0x22d9, 0x1ad4: 0x22d9, 0x1ad5: 0x22e1, 0x1ad6: 0x22e9, 0x1ad7: 0x03b1, + 0x1ad8: 0x03b9, 0x1ad9: 0x22f1, 0x1ada: 0x0769, 0x1adb: 0x2301, 0x1adc: 0x2291, 0x1add: 0x04d1, + 0x1ade: 0x22a9, 0x1adf: 0x03b1, 0x1ae0: 0x03c1, 0x1ae1: 0x0799, 0x1ae2: 0x2289, 0x1ae3: 0x0399, + 0x1ae4: 0x03a1, 0x1ae5: 0x03a9, 0x1ae6: 0x2291, 0x1ae7: 0x2299, 0x1ae8: 0x22a1, 0x1ae9: 0x04d1, + 0x1aea: 0x05f9, 0x1aeb: 0x22a9, 0x1aec: 0x22b1, 0x1aed: 0x22b9, 0x1aee: 0x22c1, 0x1aef: 0x22c9, + 0x1af0: 0x22d1, 0x1af1: 0x0799, 0x1af2: 0x03c1, 0x1af3: 0x04d1, 0x1af4: 0x22d9, 0x1af5: 0x22e1, + 0x1af6: 0x22e9, 0x1af7: 0x03b1, 0x1af8: 0x03b9, 0x1af9: 0x22f1, 0x1afa: 0x0769, 0x1afb: 0x22f9, + 0x1afc: 0x2289, 0x1afd: 0x0399, 0x1afe: 0x03a1, 0x1aff: 0x03a9, // Block 0x6c, offset 0x1b00 - 0x1b00: 0x2039, 0x1b01: 0x0269, 0x1b02: 0x01d9, 0x1b03: 0x0fa9, 0x1b04: 0x0fb9, 0x1b05: 0x1089, - 0x1b06: 0x0279, 0x1b07: 0x0369, 0x1b08: 0x0289, 0x1b09: 0x13d1, 0x1b0a: 0x0039, 0x1b0b: 0x0ee9, - 0x1b0c: 0x1159, 0x1b0d: 0x0ef9, 0x1b0e: 0x0f09, 0x1b0f: 0x1199, 0x1b10: 0x0f31, 0x1b11: 0x0249, - 0x1b12: 0x0f41, 0x1b13: 0x0259, 0x1b14: 0x0f51, 0x1b15: 0x0359, 0x1b16: 0x0f61, 0x1b17: 0x0f71, - 0x1b18: 0x00d9, 0x1b19: 0x0f99, 0x1b1a: 0x2039, 0x1b1b: 0x0269, 0x1b1c: 0x01d9, 0x1b1d: 0x0fa9, - 0x1b1e: 0x0fb9, 0x1b1f: 0x1089, 0x1b20: 0x0279, 0x1b21: 0x0369, 0x1b22: 0x0289, 0x1b23: 0x13d1, - 0x1b24: 0xbad1, 0x1b25: 0xbae9, 0x1b26: 0x0040, 0x1b27: 0x0040, 0x1b28: 0xbb01, 0x1b29: 0x1099, - 0x1b2a: 0x10b1, 0x1b2b: 0x10c9, 0x1b2c: 0xbb19, 0x1b2d: 0xbb31, 0x1b2e: 0xbb49, 0x1b2f: 0x1429, - 0x1b30: 0x1a31, 0x1b31: 0xbb61, 0x1b32: 0xbb79, 0x1b33: 0xbb91, 0x1b34: 0xbba9, 0x1b35: 0xbbc1, - 0x1b36: 0xbbd9, 0x1b37: 0x2109, 0x1b38: 0x1111, 0x1b39: 0x1429, 0x1b3a: 0xbbf1, 0x1b3b: 0xbc09, - 0x1b3c: 0xbc21, 0x1b3d: 0x10e1, 0x1b3e: 0x10f9, 0x1b3f: 0xbc39, + 0x1b00: 0x2291, 0x1b01: 0x2299, 0x1b02: 0x22a1, 0x1b03: 0x04d1, 0x1b04: 0x05f9, 0x1b05: 0x22a9, + 0x1b06: 0x22b1, 0x1b07: 0x22b9, 0x1b08: 0x22c1, 0x1b09: 0x22c9, 0x1b0a: 0x22d1, 0x1b0b: 0x0799, + 0x1b0c: 0x03c1, 0x1b0d: 0x22d9, 0x1b0e: 0x22d9, 0x1b0f: 0x22e1, 0x1b10: 0x22e9, 0x1b11: 0x03b1, + 0x1b12: 0x03b9, 0x1b13: 0x22f1, 0x1b14: 0x0769, 0x1b15: 0x2301, 0x1b16: 0x2291, 0x1b17: 0x04d1, + 0x1b18: 0x22a9, 0x1b19: 0x03b1, 0x1b1a: 0x03c1, 0x1b1b: 0x0799, 0x1b1c: 0x2289, 0x1b1d: 0x0399, + 0x1b1e: 0x03a1, 0x1b1f: 0x03a9, 0x1b20: 0x2291, 0x1b21: 0x2299, 0x1b22: 0x22a1, 0x1b23: 0x04d1, + 0x1b24: 0x05f9, 0x1b25: 0x22a9, 0x1b26: 0x22b1, 0x1b27: 0x22b9, 0x1b28: 0x22c1, 0x1b29: 0x22c9, + 0x1b2a: 0x22d1, 0x1b2b: 0x0799, 0x1b2c: 0x03c1, 0x1b2d: 0x04d1, 0x1b2e: 0x22d9, 0x1b2f: 0x22e1, + 0x1b30: 0x22e9, 0x1b31: 0x03b1, 0x1b32: 0x03b9, 0x1b33: 0x22f1, 0x1b34: 0x0769, 0x1b35: 0x22f9, + 0x1b36: 0x2289, 0x1b37: 0x0399, 0x1b38: 0x03a1, 0x1b39: 0x03a9, 0x1b3a: 0x2291, 0x1b3b: 0x2299, + 0x1b3c: 0x22a1, 0x1b3d: 0x04d1, 0x1b3e: 0x05f9, 0x1b3f: 0x22a9, // Block 0x6d, offset 0x1b40 - 0x1b40: 0x2079, 0x1b41: 0xbc51, 0x1b42: 0xbb01, 0x1b43: 0x1099, 0x1b44: 0x10b1, 0x1b45: 0x10c9, - 0x1b46: 0xbb19, 0x1b47: 0xbb31, 0x1b48: 0xbb49, 0x1b49: 0x1429, 0x1b4a: 0x1a31, 0x1b4b: 0xbb61, - 0x1b4c: 0xbb79, 0x1b4d: 0xbb91, 0x1b4e: 0xbba9, 0x1b4f: 0xbbc1, 0x1b50: 0xbbd9, 0x1b51: 0x2109, - 0x1b52: 0x1111, 0x1b53: 0xbbf1, 0x1b54: 0xbbf1, 0x1b55: 0xbc09, 0x1b56: 0xbc21, 0x1b57: 0x10e1, - 0x1b58: 0x10f9, 0x1b59: 0xbc39, 0x1b5a: 0x2079, 0x1b5b: 0xbc71, 0x1b5c: 0xbb19, 0x1b5d: 0x1429, - 0x1b5e: 0xbb61, 0x1b5f: 0x10e1, 0x1b60: 0x1111, 0x1b61: 0x2109, 0x1b62: 0xbb01, 0x1b63: 0x1099, - 0x1b64: 0x10b1, 0x1b65: 0x10c9, 0x1b66: 0xbb19, 0x1b67: 0xbb31, 0x1b68: 0xbb49, 0x1b69: 0x1429, - 0x1b6a: 0x1a31, 0x1b6b: 0xbb61, 0x1b6c: 0xbb79, 0x1b6d: 0xbb91, 0x1b6e: 0xbba9, 0x1b6f: 0xbbc1, - 0x1b70: 0xbbd9, 0x1b71: 0x2109, 0x1b72: 0x1111, 0x1b73: 0x1429, 0x1b74: 0xbbf1, 0x1b75: 0xbc09, - 0x1b76: 0xbc21, 0x1b77: 0x10e1, 0x1b78: 0x10f9, 0x1b79: 0xbc39, 0x1b7a: 0x2079, 0x1b7b: 0xbc51, - 0x1b7c: 0xbb01, 0x1b7d: 0x1099, 0x1b7e: 0x10b1, 0x1b7f: 0x10c9, + 0x1b40: 0x22b1, 0x1b41: 0x22b9, 0x1b42: 0x22c1, 0x1b43: 0x22c9, 0x1b44: 0x22d1, 0x1b45: 0x0799, + 0x1b46: 0x03c1, 0x1b47: 0x22d9, 0x1b48: 0x22d9, 0x1b49: 0x22e1, 0x1b4a: 0x22e9, 0x1b4b: 0x03b1, + 0x1b4c: 0x03b9, 0x1b4d: 0x22f1, 0x1b4e: 0x0769, 0x1b4f: 0x2301, 0x1b50: 0x2291, 0x1b51: 0x04d1, + 0x1b52: 0x22a9, 0x1b53: 0x03b1, 0x1b54: 0x03c1, 0x1b55: 0x0799, 0x1b56: 0x2289, 0x1b57: 0x0399, + 0x1b58: 0x03a1, 0x1b59: 0x03a9, 0x1b5a: 0x2291, 0x1b5b: 0x2299, 0x1b5c: 0x22a1, 0x1b5d: 0x04d1, + 0x1b5e: 0x05f9, 0x1b5f: 0x22a9, 0x1b60: 0x22b1, 0x1b61: 0x22b9, 0x1b62: 0x22c1, 0x1b63: 0x22c9, + 0x1b64: 0x22d1, 0x1b65: 0x0799, 0x1b66: 0x03c1, 0x1b67: 0x04d1, 0x1b68: 0x22d9, 0x1b69: 0x22e1, + 0x1b6a: 0x22e9, 0x1b6b: 0x03b1, 0x1b6c: 0x03b9, 0x1b6d: 0x22f1, 0x1b6e: 0x0769, 0x1b6f: 0x22f9, + 0x1b70: 0x2289, 0x1b71: 0x0399, 0x1b72: 0x03a1, 0x1b73: 0x03a9, 0x1b74: 0x2291, 0x1b75: 0x2299, + 0x1b76: 0x22a1, 0x1b77: 0x04d1, 0x1b78: 0x05f9, 0x1b79: 0x22a9, 0x1b7a: 0x22b1, 0x1b7b: 0x22b9, + 0x1b7c: 0x22c1, 0x1b7d: 0x22c9, 0x1b7e: 0x22d1, 0x1b7f: 0x0799, // Block 0x6e, offset 0x1b80 - 0x1b80: 0xbb19, 0x1b81: 0xbb31, 0x1b82: 0xbb49, 0x1b83: 0x1429, 0x1b84: 0x1a31, 0x1b85: 0xbb61, - 0x1b86: 0xbb79, 0x1b87: 0xbb91, 0x1b88: 0xbba9, 0x1b89: 0xbbc1, 0x1b8a: 0xbbd9, 0x1b8b: 0x2109, - 0x1b8c: 0x1111, 0x1b8d: 0xbbf1, 0x1b8e: 0xbbf1, 0x1b8f: 0xbc09, 0x1b90: 0xbc21, 0x1b91: 0x10e1, - 0x1b92: 0x10f9, 0x1b93: 0xbc39, 0x1b94: 0x2079, 0x1b95: 0xbc71, 0x1b96: 0xbb19, 0x1b97: 0x1429, - 0x1b98: 0xbb61, 0x1b99: 0x10e1, 0x1b9a: 0x1111, 0x1b9b: 0x2109, 0x1b9c: 0xbb01, 0x1b9d: 0x1099, - 0x1b9e: 0x10b1, 0x1b9f: 0x10c9, 0x1ba0: 0xbb19, 0x1ba1: 0xbb31, 0x1ba2: 0xbb49, 0x1ba3: 0x1429, - 0x1ba4: 0x1a31, 0x1ba5: 0xbb61, 0x1ba6: 0xbb79, 0x1ba7: 0xbb91, 0x1ba8: 0xbba9, 0x1ba9: 0xbbc1, - 0x1baa: 0xbbd9, 0x1bab: 0x2109, 0x1bac: 0x1111, 0x1bad: 0x1429, 0x1bae: 0xbbf1, 0x1baf: 0xbc09, - 0x1bb0: 0xbc21, 0x1bb1: 0x10e1, 0x1bb2: 0x10f9, 0x1bb3: 0xbc39, 0x1bb4: 0x2079, 0x1bb5: 0xbc51, - 0x1bb6: 0xbb01, 0x1bb7: 0x1099, 0x1bb8: 0x10b1, 0x1bb9: 0x10c9, 0x1bba: 0xbb19, 0x1bbb: 0xbb31, - 0x1bbc: 0xbb49, 0x1bbd: 0x1429, 0x1bbe: 0x1a31, 0x1bbf: 0xbb61, + 0x1b80: 0x03c1, 0x1b81: 0x22d9, 0x1b82: 0x22d9, 0x1b83: 0x22e1, 0x1b84: 0x22e9, 0x1b85: 0x03b1, + 0x1b86: 0x03b9, 0x1b87: 0x22f1, 0x1b88: 0x0769, 0x1b89: 0x2301, 0x1b8a: 0x2291, 0x1b8b: 0x04d1, + 0x1b8c: 0x22a9, 0x1b8d: 0x03b1, 0x1b8e: 0x03c1, 0x1b8f: 0x0799, 0x1b90: 0x2289, 0x1b91: 0x0399, + 0x1b92: 0x03a1, 0x1b93: 0x03a9, 0x1b94: 0x2291, 0x1b95: 0x2299, 0x1b96: 0x22a1, 0x1b97: 0x04d1, + 0x1b98: 0x05f9, 0x1b99: 0x22a9, 0x1b9a: 0x22b1, 0x1b9b: 0x22b9, 0x1b9c: 0x22c1, 0x1b9d: 0x22c9, + 0x1b9e: 0x22d1, 0x1b9f: 0x0799, 0x1ba0: 0x03c1, 0x1ba1: 0x04d1, 0x1ba2: 0x22d9, 0x1ba3: 0x22e1, + 0x1ba4: 0x22e9, 0x1ba5: 0x03b1, 0x1ba6: 0x03b9, 0x1ba7: 0x22f1, 0x1ba8: 0x0769, 0x1ba9: 0x22f9, + 0x1baa: 0x2289, 0x1bab: 0x0399, 0x1bac: 0x03a1, 0x1bad: 0x03a9, 0x1bae: 0x2291, 0x1baf: 0x2299, + 0x1bb0: 0x22a1, 0x1bb1: 0x04d1, 0x1bb2: 0x05f9, 0x1bb3: 0x22a9, 0x1bb4: 0x22b1, 0x1bb5: 0x22b9, + 0x1bb6: 0x22c1, 0x1bb7: 0x22c9, 0x1bb8: 0x22d1, 0x1bb9: 0x0799, 0x1bba: 0x03c1, 0x1bbb: 0x22d9, + 0x1bbc: 0x22d9, 0x1bbd: 0x22e1, 0x1bbe: 0x22e9, 0x1bbf: 0x03b1, // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0xbb79, 0x1bc1: 0xbb91, 0x1bc2: 0xbba9, 0x1bc3: 0xbbc1, 0x1bc4: 0xbbd9, 0x1bc5: 0x2109, - 0x1bc6: 0x1111, 0x1bc7: 0xbbf1, 0x1bc8: 0xbbf1, 0x1bc9: 0xbc09, 0x1bca: 0xbc21, 0x1bcb: 0x10e1, - 0x1bcc: 0x10f9, 0x1bcd: 0xbc39, 0x1bce: 0x2079, 0x1bcf: 0xbc71, 0x1bd0: 0xbb19, 0x1bd1: 0x1429, - 0x1bd2: 0xbb61, 0x1bd3: 0x10e1, 0x1bd4: 0x1111, 0x1bd5: 0x2109, 0x1bd6: 0xbb01, 0x1bd7: 0x1099, - 0x1bd8: 0x10b1, 0x1bd9: 0x10c9, 0x1bda: 0xbb19, 0x1bdb: 0xbb31, 0x1bdc: 0xbb49, 0x1bdd: 0x1429, - 0x1bde: 0x1a31, 0x1bdf: 0xbb61, 0x1be0: 0xbb79, 0x1be1: 0xbb91, 0x1be2: 0xbba9, 0x1be3: 0xbbc1, - 0x1be4: 0xbbd9, 0x1be5: 0x2109, 0x1be6: 0x1111, 0x1be7: 0x1429, 0x1be8: 0xbbf1, 0x1be9: 0xbc09, - 0x1bea: 0xbc21, 0x1beb: 0x10e1, 0x1bec: 0x10f9, 0x1bed: 0xbc39, 0x1bee: 0x2079, 0x1bef: 0xbc51, - 0x1bf0: 0xbb01, 0x1bf1: 0x1099, 0x1bf2: 0x10b1, 0x1bf3: 0x10c9, 0x1bf4: 0xbb19, 0x1bf5: 0xbb31, - 0x1bf6: 0xbb49, 0x1bf7: 0x1429, 0x1bf8: 0x1a31, 0x1bf9: 0xbb61, 0x1bfa: 0xbb79, 0x1bfb: 0xbb91, - 0x1bfc: 0xbba9, 0x1bfd: 0xbbc1, 0x1bfe: 0xbbd9, 0x1bff: 0x2109, + 0x1bc0: 0x03b9, 0x1bc1: 0x22f1, 0x1bc2: 0x0769, 0x1bc3: 0x2301, 0x1bc4: 0x2291, 0x1bc5: 0x04d1, + 0x1bc6: 0x22a9, 0x1bc7: 0x03b1, 0x1bc8: 0x03c1, 0x1bc9: 0x0799, 0x1bca: 0x2309, 0x1bcb: 0x2309, + 0x1bcc: 0x0040, 0x1bcd: 0x0040, 0x1bce: 0x06e1, 0x1bcf: 0x0049, 0x1bd0: 0x0029, 0x1bd1: 0x0031, + 0x1bd2: 0x06e9, 0x1bd3: 0x06f1, 0x1bd4: 0x06f9, 0x1bd5: 0x0701, 0x1bd6: 0x0709, 0x1bd7: 0x0711, + 0x1bd8: 0x06e1, 0x1bd9: 0x0049, 0x1bda: 0x0029, 0x1bdb: 0x0031, 0x1bdc: 0x06e9, 0x1bdd: 0x06f1, + 0x1bde: 0x06f9, 0x1bdf: 0x0701, 0x1be0: 0x0709, 0x1be1: 0x0711, 0x1be2: 0x06e1, 0x1be3: 0x0049, + 0x1be4: 0x0029, 0x1be5: 0x0031, 0x1be6: 0x06e9, 0x1be7: 0x06f1, 0x1be8: 0x06f9, 0x1be9: 0x0701, + 0x1bea: 0x0709, 0x1beb: 0x0711, 0x1bec: 0x06e1, 0x1bed: 0x0049, 0x1bee: 0x0029, 0x1bef: 0x0031, + 0x1bf0: 0x06e9, 0x1bf1: 0x06f1, 0x1bf2: 0x06f9, 0x1bf3: 0x0701, 0x1bf4: 0x0709, 0x1bf5: 0x0711, + 0x1bf6: 0x06e1, 0x1bf7: 0x0049, 0x1bf8: 0x0029, 0x1bf9: 0x0031, 0x1bfa: 0x06e9, 0x1bfb: 0x06f1, + 0x1bfc: 0x06f9, 0x1bfd: 0x0701, 0x1bfe: 0x0709, 0x1bff: 0x0711, // Block 0x70, offset 0x1c00 - 0x1c00: 0x1111, 0x1c01: 0xbbf1, 0x1c02: 0xbbf1, 0x1c03: 0xbc09, 0x1c04: 0xbc21, 0x1c05: 0x10e1, - 0x1c06: 0x10f9, 0x1c07: 0xbc39, 0x1c08: 0x2079, 0x1c09: 0xbc71, 0x1c0a: 0xbb19, 0x1c0b: 0x1429, - 0x1c0c: 0xbb61, 0x1c0d: 0x10e1, 0x1c0e: 0x1111, 0x1c0f: 0x2109, 0x1c10: 0xbb01, 0x1c11: 0x1099, - 0x1c12: 0x10b1, 0x1c13: 0x10c9, 0x1c14: 0xbb19, 0x1c15: 0xbb31, 0x1c16: 0xbb49, 0x1c17: 0x1429, - 0x1c18: 0x1a31, 0x1c19: 0xbb61, 0x1c1a: 0xbb79, 0x1c1b: 0xbb91, 0x1c1c: 0xbba9, 0x1c1d: 0xbbc1, - 0x1c1e: 0xbbd9, 0x1c1f: 0x2109, 0x1c20: 0x1111, 0x1c21: 0x1429, 0x1c22: 0xbbf1, 0x1c23: 0xbc09, - 0x1c24: 0xbc21, 0x1c25: 0x10e1, 0x1c26: 0x10f9, 0x1c27: 0xbc39, 0x1c28: 0x2079, 0x1c29: 0xbc51, - 0x1c2a: 0xbb01, 0x1c2b: 0x1099, 0x1c2c: 0x10b1, 0x1c2d: 0x10c9, 0x1c2e: 0xbb19, 0x1c2f: 0xbb31, - 0x1c30: 0xbb49, 0x1c31: 0x1429, 0x1c32: 0x1a31, 0x1c33: 0xbb61, 0x1c34: 0xbb79, 0x1c35: 0xbb91, - 0x1c36: 0xbba9, 0x1c37: 0xbbc1, 0x1c38: 0xbbd9, 0x1c39: 0x2109, 0x1c3a: 0x1111, 0x1c3b: 0xbbf1, - 0x1c3c: 0xbbf1, 0x1c3d: 0xbc09, 0x1c3e: 0xbc21, 0x1c3f: 0x10e1, + 0x1c00: 0xe115, 0x1c01: 0xe115, 0x1c02: 0xe135, 0x1c03: 0xe135, 0x1c04: 0xe115, 0x1c05: 0xe115, + 0x1c06: 0xe175, 0x1c07: 0xe175, 0x1c08: 0xe115, 0x1c09: 0xe115, 0x1c0a: 0xe135, 0x1c0b: 0xe135, + 0x1c0c: 0xe115, 0x1c0d: 0xe115, 0x1c0e: 0xe1f5, 0x1c0f: 0xe1f5, 0x1c10: 0xe115, 0x1c11: 0xe115, + 0x1c12: 0xe135, 0x1c13: 0xe135, 0x1c14: 0xe115, 0x1c15: 0xe115, 0x1c16: 0xe175, 0x1c17: 0xe175, + 0x1c18: 0xe115, 0x1c19: 0xe115, 0x1c1a: 0xe135, 0x1c1b: 0xe135, 0x1c1c: 0xe115, 0x1c1d: 0xe115, + 0x1c1e: 0x8b3d, 0x1c1f: 0x8b3d, 0x1c20: 0x04b5, 0x1c21: 0x04b5, 0x1c22: 0x0a08, 0x1c23: 0x0a08, + 0x1c24: 0x0a08, 0x1c25: 0x0a08, 0x1c26: 0x0a08, 0x1c27: 0x0a08, 0x1c28: 0x0a08, 0x1c29: 0x0a08, + 0x1c2a: 0x0a08, 0x1c2b: 0x0a08, 0x1c2c: 0x0a08, 0x1c2d: 0x0a08, 0x1c2e: 0x0a08, 0x1c2f: 0x0a08, + 0x1c30: 0x0a08, 0x1c31: 0x0a08, 0x1c32: 0x0a08, 0x1c33: 0x0a08, 0x1c34: 0x0a08, 0x1c35: 0x0a08, + 0x1c36: 0x0a08, 0x1c37: 0x0a08, 0x1c38: 0x0a08, 0x1c39: 0x0a08, 0x1c3a: 0x0a08, 0x1c3b: 0x0a08, + 0x1c3c: 0x0a08, 0x1c3d: 0x0a08, 0x1c3e: 0x0a08, 0x1c3f: 0x0a08, // Block 0x71, offset 0x1c40 - 0x1c40: 0x10f9, 0x1c41: 0xbc39, 0x1c42: 0x2079, 0x1c43: 0xbc71, 0x1c44: 0xbb19, 0x1c45: 0x1429, - 0x1c46: 0xbb61, 0x1c47: 0x10e1, 0x1c48: 0x1111, 0x1c49: 0x2109, 0x1c4a: 0xbc91, 0x1c4b: 0xbc91, - 0x1c4c: 0x0040, 0x1c4d: 0x0040, 0x1c4e: 0x1f41, 0x1c4f: 0x00c9, 0x1c50: 0x0069, 0x1c51: 0x0079, - 0x1c52: 0x1f51, 0x1c53: 0x1f61, 0x1c54: 0x1f71, 0x1c55: 0x1f81, 0x1c56: 0x1f91, 0x1c57: 0x1fa1, - 0x1c58: 0x1f41, 0x1c59: 0x00c9, 0x1c5a: 0x0069, 0x1c5b: 0x0079, 0x1c5c: 0x1f51, 0x1c5d: 0x1f61, - 0x1c5e: 0x1f71, 0x1c5f: 0x1f81, 0x1c60: 0x1f91, 0x1c61: 0x1fa1, 0x1c62: 0x1f41, 0x1c63: 0x00c9, - 0x1c64: 0x0069, 0x1c65: 0x0079, 0x1c66: 0x1f51, 0x1c67: 0x1f61, 0x1c68: 0x1f71, 0x1c69: 0x1f81, - 0x1c6a: 0x1f91, 0x1c6b: 0x1fa1, 0x1c6c: 0x1f41, 0x1c6d: 0x00c9, 0x1c6e: 0x0069, 0x1c6f: 0x0079, - 0x1c70: 0x1f51, 0x1c71: 0x1f61, 0x1c72: 0x1f71, 0x1c73: 0x1f81, 0x1c74: 0x1f91, 0x1c75: 0x1fa1, - 0x1c76: 0x1f41, 0x1c77: 0x00c9, 0x1c78: 0x0069, 0x1c79: 0x0079, 0x1c7a: 0x1f51, 0x1c7b: 0x1f61, - 0x1c7c: 0x1f71, 0x1c7d: 0x1f81, 0x1c7e: 0x1f91, 0x1c7f: 0x1fa1, + 0x1c40: 0x20b1, 0x1c41: 0x20b9, 0x1c42: 0x20d9, 0x1c43: 0x20f1, 0x1c44: 0x0040, 0x1c45: 0x2189, + 0x1c46: 0x2109, 0x1c47: 0x20e1, 0x1c48: 0x2131, 0x1c49: 0x2191, 0x1c4a: 0x2161, 0x1c4b: 0x2169, + 0x1c4c: 0x2171, 0x1c4d: 0x2179, 0x1c4e: 0x2111, 0x1c4f: 0x2141, 0x1c50: 0x2151, 0x1c51: 0x2121, + 0x1c52: 0x2159, 0x1c53: 0x2101, 0x1c54: 0x2119, 0x1c55: 0x20c9, 0x1c56: 0x20d1, 0x1c57: 0x20e9, + 0x1c58: 0x20f9, 0x1c59: 0x2129, 0x1c5a: 0x2139, 0x1c5b: 0x2149, 0x1c5c: 0x2311, 0x1c5d: 0x1689, + 0x1c5e: 0x2319, 0x1c5f: 0x2321, 0x1c60: 0x0040, 0x1c61: 0x20b9, 0x1c62: 0x20d9, 0x1c63: 0x0040, + 0x1c64: 0x2181, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0x20e1, 0x1c68: 0x0040, 0x1c69: 0x2191, + 0x1c6a: 0x2161, 0x1c6b: 0x2169, 0x1c6c: 0x2171, 0x1c6d: 0x2179, 0x1c6e: 0x2111, 0x1c6f: 0x2141, + 0x1c70: 0x2151, 0x1c71: 0x2121, 0x1c72: 0x2159, 0x1c73: 0x0040, 0x1c74: 0x2119, 0x1c75: 0x20c9, + 0x1c76: 0x20d1, 0x1c77: 0x20e9, 0x1c78: 0x0040, 0x1c79: 0x2129, 0x1c7a: 0x0040, 0x1c7b: 0x2149, + 0x1c7c: 0x0040, 0x1c7d: 0x0040, 0x1c7e: 0x0040, 0x1c7f: 0x0040, // Block 0x72, offset 0x1c80 - 0x1c80: 0xe115, 0x1c81: 0xe115, 0x1c82: 0xe135, 0x1c83: 0xe135, 0x1c84: 0xe115, 0x1c85: 0xe115, - 0x1c86: 0xe175, 0x1c87: 0xe175, 0x1c88: 0xe115, 0x1c89: 0xe115, 0x1c8a: 0xe135, 0x1c8b: 0xe135, - 0x1c8c: 0xe115, 0x1c8d: 0xe115, 0x1c8e: 0xe1f5, 0x1c8f: 0xe1f5, 0x1c90: 0xe115, 0x1c91: 0xe115, - 0x1c92: 0xe135, 0x1c93: 0xe135, 0x1c94: 0xe115, 0x1c95: 0xe115, 0x1c96: 0xe175, 0x1c97: 0xe175, - 0x1c98: 0xe115, 0x1c99: 0xe115, 0x1c9a: 0xe135, 0x1c9b: 0xe135, 0x1c9c: 0xe115, 0x1c9d: 0xe115, - 0x1c9e: 0x8b3d, 0x1c9f: 0x8b3d, 0x1ca0: 0x04b5, 0x1ca1: 0x04b5, 0x1ca2: 0x0a08, 0x1ca3: 0x0a08, - 0x1ca4: 0x0a08, 0x1ca5: 0x0a08, 0x1ca6: 0x0a08, 0x1ca7: 0x0a08, 0x1ca8: 0x0a08, 0x1ca9: 0x0a08, - 0x1caa: 0x0a08, 0x1cab: 0x0a08, 0x1cac: 0x0a08, 0x1cad: 0x0a08, 0x1cae: 0x0a08, 0x1caf: 0x0a08, - 0x1cb0: 0x0a08, 0x1cb1: 0x0a08, 0x1cb2: 0x0a08, 0x1cb3: 0x0a08, 0x1cb4: 0x0a08, 0x1cb5: 0x0a08, - 0x1cb6: 0x0a08, 0x1cb7: 0x0a08, 0x1cb8: 0x0a08, 0x1cb9: 0x0a08, 0x1cba: 0x0a08, 0x1cbb: 0x0a08, - 0x1cbc: 0x0a08, 0x1cbd: 0x0a08, 0x1cbe: 0x0a08, 0x1cbf: 0x0a08, + 0x1c80: 0x0040, 0x1c81: 0x0040, 0x1c82: 0x20d9, 0x1c83: 0x0040, 0x1c84: 0x0040, 0x1c85: 0x0040, + 0x1c86: 0x0040, 0x1c87: 0x20e1, 0x1c88: 0x0040, 0x1c89: 0x2191, 0x1c8a: 0x0040, 0x1c8b: 0x2169, + 0x1c8c: 0x0040, 0x1c8d: 0x2179, 0x1c8e: 0x2111, 0x1c8f: 0x2141, 0x1c90: 0x0040, 0x1c91: 0x2121, + 0x1c92: 0x2159, 0x1c93: 0x0040, 0x1c94: 0x2119, 0x1c95: 0x0040, 0x1c96: 0x0040, 0x1c97: 0x20e9, + 0x1c98: 0x0040, 0x1c99: 0x2129, 0x1c9a: 0x0040, 0x1c9b: 0x2149, 0x1c9c: 0x0040, 0x1c9d: 0x1689, + 0x1c9e: 0x0040, 0x1c9f: 0x2321, 0x1ca0: 0x0040, 0x1ca1: 0x20b9, 0x1ca2: 0x20d9, 0x1ca3: 0x0040, + 0x1ca4: 0x2181, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0x20e1, 0x1ca8: 0x2131, 0x1ca9: 0x2191, + 0x1caa: 0x2161, 0x1cab: 0x0040, 0x1cac: 0x2171, 0x1cad: 0x2179, 0x1cae: 0x2111, 0x1caf: 0x2141, + 0x1cb0: 0x2151, 0x1cb1: 0x2121, 0x1cb2: 0x2159, 0x1cb3: 0x0040, 0x1cb4: 0x2119, 0x1cb5: 0x20c9, + 0x1cb6: 0x20d1, 0x1cb7: 0x20e9, 0x1cb8: 0x0040, 0x1cb9: 0x2129, 0x1cba: 0x2139, 0x1cbb: 0x2149, + 0x1cbc: 0x2311, 0x1cbd: 0x0040, 0x1cbe: 0x2319, 0x1cbf: 0x0040, // Block 0x73, offset 0x1cc0 - 0x1cc0: 0xb1d9, 0x1cc1: 0xb1f1, 0x1cc2: 0xb251, 0x1cc3: 0xb299, 0x1cc4: 0x0040, 0x1cc5: 0xb461, - 0x1cc6: 0xb2e1, 0x1cc7: 0xb269, 0x1cc8: 0xb359, 0x1cc9: 0xb479, 0x1cca: 0xb3e9, 0x1ccb: 0xb401, - 0x1ccc: 0xb419, 0x1ccd: 0xb431, 0x1cce: 0xb2f9, 0x1ccf: 0xb389, 0x1cd0: 0xb3b9, 0x1cd1: 0xb329, - 0x1cd2: 0xb3d1, 0x1cd3: 0xb2c9, 0x1cd4: 0xb311, 0x1cd5: 0xb221, 0x1cd6: 0xb239, 0x1cd7: 0xb281, - 0x1cd8: 0xb2b1, 0x1cd9: 0xb341, 0x1cda: 0xb371, 0x1cdb: 0xb3a1, 0x1cdc: 0xbca9, 0x1cdd: 0x7999, - 0x1cde: 0xbcc1, 0x1cdf: 0xbcd9, 0x1ce0: 0x0040, 0x1ce1: 0xb1f1, 0x1ce2: 0xb251, 0x1ce3: 0x0040, - 0x1ce4: 0xb449, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb269, 0x1ce8: 0x0040, 0x1ce9: 0xb479, - 0x1cea: 0xb3e9, 0x1ceb: 0xb401, 0x1cec: 0xb419, 0x1ced: 0xb431, 0x1cee: 0xb2f9, 0x1cef: 0xb389, - 0x1cf0: 0xb3b9, 0x1cf1: 0xb329, 0x1cf2: 0xb3d1, 0x1cf3: 0x0040, 0x1cf4: 0xb311, 0x1cf5: 0xb221, - 0x1cf6: 0xb239, 0x1cf7: 0xb281, 0x1cf8: 0x0040, 0x1cf9: 0xb341, 0x1cfa: 0x0040, 0x1cfb: 0xb3a1, + 0x1cc0: 0x20b1, 0x1cc1: 0x20b9, 0x1cc2: 0x20d9, 0x1cc3: 0x20f1, 0x1cc4: 0x2181, 0x1cc5: 0x2189, + 0x1cc6: 0x2109, 0x1cc7: 0x20e1, 0x1cc8: 0x2131, 0x1cc9: 0x2191, 0x1cca: 0x0040, 0x1ccb: 0x2169, + 0x1ccc: 0x2171, 0x1ccd: 0x2179, 0x1cce: 0x2111, 0x1ccf: 0x2141, 0x1cd0: 0x2151, 0x1cd1: 0x2121, + 0x1cd2: 0x2159, 0x1cd3: 0x2101, 0x1cd4: 0x2119, 0x1cd5: 0x20c9, 0x1cd6: 0x20d1, 0x1cd7: 0x20e9, + 0x1cd8: 0x20f9, 0x1cd9: 0x2129, 0x1cda: 0x2139, 0x1cdb: 0x2149, 0x1cdc: 0x0040, 0x1cdd: 0x0040, + 0x1cde: 0x0040, 0x1cdf: 0x0040, 0x1ce0: 0x0040, 0x1ce1: 0x20b9, 0x1ce2: 0x20d9, 0x1ce3: 0x20f1, + 0x1ce4: 0x0040, 0x1ce5: 0x2189, 0x1ce6: 0x2109, 0x1ce7: 0x20e1, 0x1ce8: 0x2131, 0x1ce9: 0x2191, + 0x1cea: 0x0040, 0x1ceb: 0x2169, 0x1cec: 0x2171, 0x1ced: 0x2179, 0x1cee: 0x2111, 0x1cef: 0x2141, + 0x1cf0: 0x2151, 0x1cf1: 0x2121, 0x1cf2: 0x2159, 0x1cf3: 0x2101, 0x1cf4: 0x2119, 0x1cf5: 0x20c9, + 0x1cf6: 0x20d1, 0x1cf7: 0x20e9, 0x1cf8: 0x20f9, 0x1cf9: 0x2129, 0x1cfa: 0x2139, 0x1cfb: 0x2149, 0x1cfc: 0x0040, 0x1cfd: 0x0040, 0x1cfe: 0x0040, 0x1cff: 0x0040, // Block 0x74, offset 0x1d00 - 0x1d00: 0x0040, 0x1d01: 0x0040, 0x1d02: 0xb251, 0x1d03: 0x0040, 0x1d04: 0x0040, 0x1d05: 0x0040, - 0x1d06: 0x0040, 0x1d07: 0xb269, 0x1d08: 0x0040, 0x1d09: 0xb479, 0x1d0a: 0x0040, 0x1d0b: 0xb401, - 0x1d0c: 0x0040, 0x1d0d: 0xb431, 0x1d0e: 0xb2f9, 0x1d0f: 0xb389, 0x1d10: 0x0040, 0x1d11: 0xb329, - 0x1d12: 0xb3d1, 0x1d13: 0x0040, 0x1d14: 0xb311, 0x1d15: 0x0040, 0x1d16: 0x0040, 0x1d17: 0xb281, - 0x1d18: 0x0040, 0x1d19: 0xb341, 0x1d1a: 0x0040, 0x1d1b: 0xb3a1, 0x1d1c: 0x0040, 0x1d1d: 0x7999, - 0x1d1e: 0x0040, 0x1d1f: 0xbcd9, 0x1d20: 0x0040, 0x1d21: 0xb1f1, 0x1d22: 0xb251, 0x1d23: 0x0040, - 0x1d24: 0xb449, 0x1d25: 0x0040, 0x1d26: 0x0040, 0x1d27: 0xb269, 0x1d28: 0xb359, 0x1d29: 0xb479, - 0x1d2a: 0xb3e9, 0x1d2b: 0x0040, 0x1d2c: 0xb419, 0x1d2d: 0xb431, 0x1d2e: 0xb2f9, 0x1d2f: 0xb389, - 0x1d30: 0xb3b9, 0x1d31: 0xb329, 0x1d32: 0xb3d1, 0x1d33: 0x0040, 0x1d34: 0xb311, 0x1d35: 0xb221, - 0x1d36: 0xb239, 0x1d37: 0xb281, 0x1d38: 0x0040, 0x1d39: 0xb341, 0x1d3a: 0xb371, 0x1d3b: 0xb3a1, - 0x1d3c: 0xbca9, 0x1d3d: 0x0040, 0x1d3e: 0xbcc1, 0x1d3f: 0x0040, + 0x1d00: 0x0040, 0x1d01: 0x232a, 0x1d02: 0x2332, 0x1d03: 0x233a, 0x1d04: 0x2342, 0x1d05: 0x234a, + 0x1d06: 0x2352, 0x1d07: 0x235a, 0x1d08: 0x2362, 0x1d09: 0x236a, 0x1d0a: 0x2372, 0x1d0b: 0x0018, + 0x1d0c: 0x0018, 0x1d0d: 0x0018, 0x1d0e: 0x0018, 0x1d0f: 0x0018, 0x1d10: 0x237a, 0x1d11: 0x2382, + 0x1d12: 0x238a, 0x1d13: 0x2392, 0x1d14: 0x239a, 0x1d15: 0x23a2, 0x1d16: 0x23aa, 0x1d17: 0x23b2, + 0x1d18: 0x23ba, 0x1d19: 0x23c2, 0x1d1a: 0x23ca, 0x1d1b: 0x23d2, 0x1d1c: 0x23da, 0x1d1d: 0x23e2, + 0x1d1e: 0x23ea, 0x1d1f: 0x23f2, 0x1d20: 0x23fa, 0x1d21: 0x2402, 0x1d22: 0x240a, 0x1d23: 0x2412, + 0x1d24: 0x241a, 0x1d25: 0x2422, 0x1d26: 0x242a, 0x1d27: 0x2432, 0x1d28: 0x243a, 0x1d29: 0x2442, + 0x1d2a: 0x2449, 0x1d2b: 0x03d9, 0x1d2c: 0x00b9, 0x1d2d: 0x1239, 0x1d2e: 0x2451, 0x1d2f: 0x0018, + 0x1d30: 0x0019, 0x1d31: 0x02e9, 0x1d32: 0x03d9, 0x1d33: 0x02f1, 0x1d34: 0x02f9, 0x1d35: 0x03f1, + 0x1d36: 0x0309, 0x1d37: 0x00a9, 0x1d38: 0x0311, 0x1d39: 0x00b1, 0x1d3a: 0x0319, 0x1d3b: 0x0101, + 0x1d3c: 0x0321, 0x1d3d: 0x0329, 0x1d3e: 0x0051, 0x1d3f: 0x0339, // Block 0x75, offset 0x1d40 - 0x1d40: 0xb1d9, 0x1d41: 0xb1f1, 0x1d42: 0xb251, 0x1d43: 0xb299, 0x1d44: 0xb449, 0x1d45: 0xb461, - 0x1d46: 0xb2e1, 0x1d47: 0xb269, 0x1d48: 0xb359, 0x1d49: 0xb479, 0x1d4a: 0x0040, 0x1d4b: 0xb401, - 0x1d4c: 0xb419, 0x1d4d: 0xb431, 0x1d4e: 0xb2f9, 0x1d4f: 0xb389, 0x1d50: 0xb3b9, 0x1d51: 0xb329, - 0x1d52: 0xb3d1, 0x1d53: 0xb2c9, 0x1d54: 0xb311, 0x1d55: 0xb221, 0x1d56: 0xb239, 0x1d57: 0xb281, - 0x1d58: 0xb2b1, 0x1d59: 0xb341, 0x1d5a: 0xb371, 0x1d5b: 0xb3a1, 0x1d5c: 0x0040, 0x1d5d: 0x0040, - 0x1d5e: 0x0040, 0x1d5f: 0x0040, 0x1d60: 0x0040, 0x1d61: 0xb1f1, 0x1d62: 0xb251, 0x1d63: 0xb299, - 0x1d64: 0x0040, 0x1d65: 0xb461, 0x1d66: 0xb2e1, 0x1d67: 0xb269, 0x1d68: 0xb359, 0x1d69: 0xb479, - 0x1d6a: 0x0040, 0x1d6b: 0xb401, 0x1d6c: 0xb419, 0x1d6d: 0xb431, 0x1d6e: 0xb2f9, 0x1d6f: 0xb389, - 0x1d70: 0xb3b9, 0x1d71: 0xb329, 0x1d72: 0xb3d1, 0x1d73: 0xb2c9, 0x1d74: 0xb311, 0x1d75: 0xb221, - 0x1d76: 0xb239, 0x1d77: 0xb281, 0x1d78: 0xb2b1, 0x1d79: 0xb341, 0x1d7a: 0xb371, 0x1d7b: 0xb3a1, - 0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040, + 0x1d40: 0x0751, 0x1d41: 0x00b9, 0x1d42: 0x0089, 0x1d43: 0x0341, 0x1d44: 0x0349, 0x1d45: 0x0391, + 0x1d46: 0x00c1, 0x1d47: 0x0109, 0x1d48: 0x00c9, 0x1d49: 0x04b1, 0x1d4a: 0x2459, 0x1d4b: 0x11f9, + 0x1d4c: 0x2461, 0x1d4d: 0x04d9, 0x1d4e: 0x2469, 0x1d4f: 0x2471, 0x1d50: 0x0018, 0x1d51: 0x0018, + 0x1d52: 0x0018, 0x1d53: 0x0018, 0x1d54: 0x0018, 0x1d55: 0x0018, 0x1d56: 0x0018, 0x1d57: 0x0018, + 0x1d58: 0x0018, 0x1d59: 0x0018, 0x1d5a: 0x0018, 0x1d5b: 0x0018, 0x1d5c: 0x0018, 0x1d5d: 0x0018, + 0x1d5e: 0x0018, 0x1d5f: 0x0018, 0x1d60: 0x0018, 0x1d61: 0x0018, 0x1d62: 0x0018, 0x1d63: 0x0018, + 0x1d64: 0x0018, 0x1d65: 0x0018, 0x1d66: 0x0018, 0x1d67: 0x0018, 0x1d68: 0x0018, 0x1d69: 0x0018, + 0x1d6a: 0x2479, 0x1d6b: 0x2481, 0x1d6c: 0x2489, 0x1d6d: 0x0018, 0x1d6e: 0x0018, 0x1d6f: 0x0018, + 0x1d70: 0x0018, 0x1d71: 0x0018, 0x1d72: 0x0018, 0x1d73: 0x0018, 0x1d74: 0x0018, 0x1d75: 0x0018, + 0x1d76: 0x0018, 0x1d77: 0x0018, 0x1d78: 0x0018, 0x1d79: 0x0018, 0x1d7a: 0x0018, 0x1d7b: 0x0018, + 0x1d7c: 0x0018, 0x1d7d: 0x0018, 0x1d7e: 0x0018, 0x1d7f: 0x0018, // Block 0x76, offset 0x1d80 - 0x1d80: 0x0040, 0x1d81: 0xbcf2, 0x1d82: 0xbd0a, 0x1d83: 0xbd22, 0x1d84: 0xbd3a, 0x1d85: 0xbd52, - 0x1d86: 0xbd6a, 0x1d87: 0xbd82, 0x1d88: 0xbd9a, 0x1d89: 0xbdb2, 0x1d8a: 0xbdca, 0x1d8b: 0x0018, - 0x1d8c: 0x0018, 0x1d8d: 0x0018, 0x1d8e: 0x0018, 0x1d8f: 0x0018, 0x1d90: 0xbde2, 0x1d91: 0xbe02, - 0x1d92: 0xbe22, 0x1d93: 0xbe42, 0x1d94: 0xbe62, 0x1d95: 0xbe82, 0x1d96: 0xbea2, 0x1d97: 0xbec2, - 0x1d98: 0xbee2, 0x1d99: 0xbf02, 0x1d9a: 0xbf22, 0x1d9b: 0xbf42, 0x1d9c: 0xbf62, 0x1d9d: 0xbf82, - 0x1d9e: 0xbfa2, 0x1d9f: 0xbfc2, 0x1da0: 0xbfe2, 0x1da1: 0xc002, 0x1da2: 0xc022, 0x1da3: 0xc042, - 0x1da4: 0xc062, 0x1da5: 0xc082, 0x1da6: 0xc0a2, 0x1da7: 0xc0c2, 0x1da8: 0xc0e2, 0x1da9: 0xc102, - 0x1daa: 0xc121, 0x1dab: 0x1159, 0x1dac: 0x0269, 0x1dad: 0x66a9, 0x1dae: 0xc161, 0x1daf: 0x0018, - 0x1db0: 0x0039, 0x1db1: 0x0ee9, 0x1db2: 0x1159, 0x1db3: 0x0ef9, 0x1db4: 0x0f09, 0x1db5: 0x1199, - 0x1db6: 0x0f31, 0x1db7: 0x0249, 0x1db8: 0x0f41, 0x1db9: 0x0259, 0x1dba: 0x0f51, 0x1dbb: 0x0359, - 0x1dbc: 0x0f61, 0x1dbd: 0x0f71, 0x1dbe: 0x00d9, 0x1dbf: 0x0f99, + 0x1d80: 0x2499, 0x1d81: 0x24a1, 0x1d82: 0x24a9, 0x1d83: 0x0040, 0x1d84: 0x0040, 0x1d85: 0x0040, + 0x1d86: 0x0040, 0x1d87: 0x0040, 0x1d88: 0x0040, 0x1d89: 0x0040, 0x1d8a: 0x0040, 0x1d8b: 0x0040, + 0x1d8c: 0x0040, 0x1d8d: 0x0040, 0x1d8e: 0x0040, 0x1d8f: 0x0040, 0x1d90: 0x24b1, 0x1d91: 0x24b9, + 0x1d92: 0x24c1, 0x1d93: 0x24c9, 0x1d94: 0x24d1, 0x1d95: 0x24d9, 0x1d96: 0x24e1, 0x1d97: 0x24e9, + 0x1d98: 0x24f1, 0x1d99: 0x24f9, 0x1d9a: 0x2501, 0x1d9b: 0x2509, 0x1d9c: 0x2511, 0x1d9d: 0x2519, + 0x1d9e: 0x2521, 0x1d9f: 0x2529, 0x1da0: 0x2531, 0x1da1: 0x2539, 0x1da2: 0x2541, 0x1da3: 0x2549, + 0x1da4: 0x2551, 0x1da5: 0x2559, 0x1da6: 0x2561, 0x1da7: 0x2569, 0x1da8: 0x2571, 0x1da9: 0x2579, + 0x1daa: 0x2581, 0x1dab: 0x2589, 0x1dac: 0x2591, 0x1dad: 0x2599, 0x1dae: 0x25a1, 0x1daf: 0x25a9, + 0x1db0: 0x25b1, 0x1db1: 0x25b9, 0x1db2: 0x25c1, 0x1db3: 0x25c9, 0x1db4: 0x25d1, 0x1db5: 0x25d9, + 0x1db6: 0x25e1, 0x1db7: 0x25e9, 0x1db8: 0x25f1, 0x1db9: 0x25f9, 0x1dba: 0x2601, 0x1dbb: 0x2609, + 0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040, // Block 0x77, offset 0x1dc0 - 0x1dc0: 0x2039, 0x1dc1: 0x0269, 0x1dc2: 0x01d9, 0x1dc3: 0x0fa9, 0x1dc4: 0x0fb9, 0x1dc5: 0x1089, - 0x1dc6: 0x0279, 0x1dc7: 0x0369, 0x1dc8: 0x0289, 0x1dc9: 0x13d1, 0x1dca: 0xc179, 0x1dcb: 0x65e9, - 0x1dcc: 0xc191, 0x1dcd: 0x1441, 0x1dce: 0xc1a9, 0x1dcf: 0xc1c9, 0x1dd0: 0x0018, 0x1dd1: 0x0018, - 0x1dd2: 0x0018, 0x1dd3: 0x0018, 0x1dd4: 0x0018, 0x1dd5: 0x0018, 0x1dd6: 0x0018, 0x1dd7: 0x0018, - 0x1dd8: 0x0018, 0x1dd9: 0x0018, 0x1dda: 0x0018, 0x1ddb: 0x0018, 0x1ddc: 0x0018, 0x1ddd: 0x0018, - 0x1dde: 0x0018, 0x1ddf: 0x0018, 0x1de0: 0x0018, 0x1de1: 0x0018, 0x1de2: 0x0018, 0x1de3: 0x0018, - 0x1de4: 0x0018, 0x1de5: 0x0018, 0x1de6: 0x0018, 0x1de7: 0x0018, 0x1de8: 0x0018, 0x1de9: 0x0018, - 0x1dea: 0xc1e1, 0x1deb: 0xc1f9, 0x1dec: 0xc211, 0x1ded: 0x0018, 0x1dee: 0x0018, 0x1def: 0x0018, - 0x1df0: 0x0018, 0x1df1: 0x0018, 0x1df2: 0x0018, 0x1df3: 0x0018, 0x1df4: 0x0018, 0x1df5: 0x0018, - 0x1df6: 0x0018, 0x1df7: 0x0018, 0x1df8: 0x0018, 0x1df9: 0x0018, 0x1dfa: 0x0018, 0x1dfb: 0x0018, - 0x1dfc: 0x0018, 0x1dfd: 0x0018, 0x1dfe: 0x0018, 0x1dff: 0x0018, + 0x1dc0: 0x2669, 0x1dc1: 0x2671, 0x1dc2: 0x2679, 0x1dc3: 0x8b55, 0x1dc4: 0x2681, 0x1dc5: 0x2689, + 0x1dc6: 0x2691, 0x1dc7: 0x2699, 0x1dc8: 0x26a1, 0x1dc9: 0x26a9, 0x1dca: 0x26b1, 0x1dcb: 0x26b9, + 0x1dcc: 0x26c1, 0x1dcd: 0x8b75, 0x1dce: 0x26c9, 0x1dcf: 0x26d1, 0x1dd0: 0x26d9, 0x1dd1: 0x26e1, + 0x1dd2: 0x8b95, 0x1dd3: 0x26e9, 0x1dd4: 0x26f1, 0x1dd5: 0x2521, 0x1dd6: 0x8bb5, 0x1dd7: 0x26f9, + 0x1dd8: 0x2701, 0x1dd9: 0x2709, 0x1dda: 0x2711, 0x1ddb: 0x2719, 0x1ddc: 0x8bd5, 0x1ddd: 0x2721, + 0x1dde: 0x2729, 0x1ddf: 0x2731, 0x1de0: 0x2739, 0x1de1: 0x2741, 0x1de2: 0x25f9, 0x1de3: 0x2749, + 0x1de4: 0x2751, 0x1de5: 0x2759, 0x1de6: 0x2761, 0x1de7: 0x2769, 0x1de8: 0x2771, 0x1de9: 0x2779, + 0x1dea: 0x2781, 0x1deb: 0x2789, 0x1dec: 0x2791, 0x1ded: 0x2799, 0x1dee: 0x27a1, 0x1def: 0x27a9, + 0x1df0: 0x27b1, 0x1df1: 0x27b9, 0x1df2: 0x27b9, 0x1df3: 0x27b9, 0x1df4: 0x8bf5, 0x1df5: 0x27c1, + 0x1df6: 0x27c9, 0x1df7: 0x27d1, 0x1df8: 0x8c15, 0x1df9: 0x27d9, 0x1dfa: 0x27e1, 0x1dfb: 0x27e9, + 0x1dfc: 0x27f1, 0x1dfd: 0x27f9, 0x1dfe: 0x2801, 0x1dff: 0x2809, // Block 0x78, offset 0x1e00 - 0x1e00: 0xc241, 0x1e01: 0xc279, 0x1e02: 0xc2b1, 0x1e03: 0x0040, 0x1e04: 0x0040, 0x1e05: 0x0040, - 0x1e06: 0x0040, 0x1e07: 0x0040, 0x1e08: 0x0040, 0x1e09: 0x0040, 0x1e0a: 0x0040, 0x1e0b: 0x0040, - 0x1e0c: 0x0040, 0x1e0d: 0x0040, 0x1e0e: 0x0040, 0x1e0f: 0x0040, 0x1e10: 0xc2d1, 0x1e11: 0xc2f1, - 0x1e12: 0xc311, 0x1e13: 0xc331, 0x1e14: 0xc351, 0x1e15: 0xc371, 0x1e16: 0xc391, 0x1e17: 0xc3b1, - 0x1e18: 0xc3d1, 0x1e19: 0xc3f1, 0x1e1a: 0xc411, 0x1e1b: 0xc431, 0x1e1c: 0xc451, 0x1e1d: 0xc471, - 0x1e1e: 0xc491, 0x1e1f: 0xc4b1, 0x1e20: 0xc4d1, 0x1e21: 0xc4f1, 0x1e22: 0xc511, 0x1e23: 0xc531, - 0x1e24: 0xc551, 0x1e25: 0xc571, 0x1e26: 0xc591, 0x1e27: 0xc5b1, 0x1e28: 0xc5d1, 0x1e29: 0xc5f1, - 0x1e2a: 0xc611, 0x1e2b: 0xc631, 0x1e2c: 0xc651, 0x1e2d: 0xc671, 0x1e2e: 0xc691, 0x1e2f: 0xc6b1, - 0x1e30: 0xc6d1, 0x1e31: 0xc6f1, 0x1e32: 0xc711, 0x1e33: 0xc731, 0x1e34: 0xc751, 0x1e35: 0xc771, - 0x1e36: 0xc791, 0x1e37: 0xc7b1, 0x1e38: 0xc7d1, 0x1e39: 0xc7f1, 0x1e3a: 0xc811, 0x1e3b: 0xc831, - 0x1e3c: 0x0040, 0x1e3d: 0x0040, 0x1e3e: 0x0040, 0x1e3f: 0x0040, + 0x1e00: 0x2811, 0x1e01: 0x2819, 0x1e02: 0x2821, 0x1e03: 0x2829, 0x1e04: 0x2831, 0x1e05: 0x2839, + 0x1e06: 0x2839, 0x1e07: 0x2841, 0x1e08: 0x2849, 0x1e09: 0x2851, 0x1e0a: 0x2859, 0x1e0b: 0x2861, + 0x1e0c: 0x2869, 0x1e0d: 0x2871, 0x1e0e: 0x2879, 0x1e0f: 0x2881, 0x1e10: 0x2889, 0x1e11: 0x2891, + 0x1e12: 0x2899, 0x1e13: 0x28a1, 0x1e14: 0x28a9, 0x1e15: 0x28b1, 0x1e16: 0x28b9, 0x1e17: 0x28c1, + 0x1e18: 0x28c9, 0x1e19: 0x8c35, 0x1e1a: 0x28d1, 0x1e1b: 0x28d9, 0x1e1c: 0x28e1, 0x1e1d: 0x24d9, + 0x1e1e: 0x28e9, 0x1e1f: 0x28f1, 0x1e20: 0x8c55, 0x1e21: 0x8c75, 0x1e22: 0x28f9, 0x1e23: 0x2901, + 0x1e24: 0x2909, 0x1e25: 0x2911, 0x1e26: 0x2919, 0x1e27: 0x2921, 0x1e28: 0x2040, 0x1e29: 0x2929, + 0x1e2a: 0x2931, 0x1e2b: 0x2931, 0x1e2c: 0x8c95, 0x1e2d: 0x2939, 0x1e2e: 0x2941, 0x1e2f: 0x2949, + 0x1e30: 0x2951, 0x1e31: 0x8cb5, 0x1e32: 0x2959, 0x1e33: 0x2961, 0x1e34: 0x2040, 0x1e35: 0x2969, + 0x1e36: 0x2971, 0x1e37: 0x2979, 0x1e38: 0x2981, 0x1e39: 0x2989, 0x1e3a: 0x2991, 0x1e3b: 0x8cd5, + 0x1e3c: 0x2999, 0x1e3d: 0x8cf5, 0x1e3e: 0x29a1, 0x1e3f: 0x29a9, // Block 0x79, offset 0x1e40 - 0x1e40: 0xcb61, 0x1e41: 0xcb81, 0x1e42: 0xcba1, 0x1e43: 0x8b55, 0x1e44: 0xcbc1, 0x1e45: 0xcbe1, - 0x1e46: 0xcc01, 0x1e47: 0xcc21, 0x1e48: 0xcc41, 0x1e49: 0xcc61, 0x1e4a: 0xcc81, 0x1e4b: 0xcca1, - 0x1e4c: 0xccc1, 0x1e4d: 0x8b75, 0x1e4e: 0xcce1, 0x1e4f: 0xcd01, 0x1e50: 0xcd21, 0x1e51: 0xcd41, - 0x1e52: 0x8b95, 0x1e53: 0xcd61, 0x1e54: 0xcd81, 0x1e55: 0xc491, 0x1e56: 0x8bb5, 0x1e57: 0xcda1, - 0x1e58: 0xcdc1, 0x1e59: 0xcde1, 0x1e5a: 0xce01, 0x1e5b: 0xce21, 0x1e5c: 0x8bd5, 0x1e5d: 0xce41, - 0x1e5e: 0xce61, 0x1e5f: 0xce81, 0x1e60: 0xcea1, 0x1e61: 0xcec1, 0x1e62: 0xc7f1, 0x1e63: 0xcee1, - 0x1e64: 0xcf01, 0x1e65: 0xcf21, 0x1e66: 0xcf41, 0x1e67: 0xcf61, 0x1e68: 0xcf81, 0x1e69: 0xcfa1, - 0x1e6a: 0xcfc1, 0x1e6b: 0xcfe1, 0x1e6c: 0xd001, 0x1e6d: 0xd021, 0x1e6e: 0xd041, 0x1e6f: 0xd061, - 0x1e70: 0xd081, 0x1e71: 0xd0a1, 0x1e72: 0xd0a1, 0x1e73: 0xd0a1, 0x1e74: 0x8bf5, 0x1e75: 0xd0c1, - 0x1e76: 0xd0e1, 0x1e77: 0xd101, 0x1e78: 0x8c15, 0x1e79: 0xd121, 0x1e7a: 0xd141, 0x1e7b: 0xd161, - 0x1e7c: 0xd181, 0x1e7d: 0xd1a1, 0x1e7e: 0xd1c1, 0x1e7f: 0xd1e1, + 0x1e40: 0x29b1, 0x1e41: 0x29b9, 0x1e42: 0x29c1, 0x1e43: 0x29c9, 0x1e44: 0x29d1, 0x1e45: 0x29d9, + 0x1e46: 0x29e1, 0x1e47: 0x29e9, 0x1e48: 0x29f1, 0x1e49: 0x8d15, 0x1e4a: 0x29f9, 0x1e4b: 0x2a01, + 0x1e4c: 0x2a09, 0x1e4d: 0x2a11, 0x1e4e: 0x2a19, 0x1e4f: 0x8d35, 0x1e50: 0x2a21, 0x1e51: 0x8d55, + 0x1e52: 0x8d75, 0x1e53: 0x2a29, 0x1e54: 0x2a31, 0x1e55: 0x2a31, 0x1e56: 0x2a39, 0x1e57: 0x8d95, + 0x1e58: 0x8db5, 0x1e59: 0x2a41, 0x1e5a: 0x2a49, 0x1e5b: 0x2a51, 0x1e5c: 0x2a59, 0x1e5d: 0x2a61, + 0x1e5e: 0x2a69, 0x1e5f: 0x2a71, 0x1e60: 0x2a79, 0x1e61: 0x2a81, 0x1e62: 0x2a89, 0x1e63: 0x2a91, + 0x1e64: 0x8dd5, 0x1e65: 0x2a99, 0x1e66: 0x2aa1, 0x1e67: 0x2aa9, 0x1e68: 0x2ab1, 0x1e69: 0x2aa9, + 0x1e6a: 0x2ab9, 0x1e6b: 0x2ac1, 0x1e6c: 0x2ac9, 0x1e6d: 0x2ad1, 0x1e6e: 0x2ad9, 0x1e6f: 0x2ae1, + 0x1e70: 0x2ae9, 0x1e71: 0x2af1, 0x1e72: 0x2af9, 0x1e73: 0x2b01, 0x1e74: 0x2b09, 0x1e75: 0x2b11, + 0x1e76: 0x2b19, 0x1e77: 0x2b21, 0x1e78: 0x8df5, 0x1e79: 0x2b29, 0x1e7a: 0x2b31, 0x1e7b: 0x2b39, + 0x1e7c: 0x2b41, 0x1e7d: 0x2b49, 0x1e7e: 0x8e15, 0x1e7f: 0x2b51, // Block 0x7a, offset 0x1e80 - 0x1e80: 0xd201, 0x1e81: 0xd221, 0x1e82: 0xd241, 0x1e83: 0xd261, 0x1e84: 0xd281, 0x1e85: 0xd2a1, - 0x1e86: 0xd2a1, 0x1e87: 0xd2c1, 0x1e88: 0xd2e1, 0x1e89: 0xd301, 0x1e8a: 0xd321, 0x1e8b: 0xd341, - 0x1e8c: 0xd361, 0x1e8d: 0xd381, 0x1e8e: 0xd3a1, 0x1e8f: 0xd3c1, 0x1e90: 0xd3e1, 0x1e91: 0xd401, - 0x1e92: 0xd421, 0x1e93: 0xd441, 0x1e94: 0xd461, 0x1e95: 0xd481, 0x1e96: 0xd4a1, 0x1e97: 0xd4c1, - 0x1e98: 0xd4e1, 0x1e99: 0x8c35, 0x1e9a: 0xd501, 0x1e9b: 0xd521, 0x1e9c: 0xd541, 0x1e9d: 0xc371, - 0x1e9e: 0xd561, 0x1e9f: 0xd581, 0x1ea0: 0x8c55, 0x1ea1: 0x8c75, 0x1ea2: 0xd5a1, 0x1ea3: 0xd5c1, - 0x1ea4: 0xd5e1, 0x1ea5: 0xd601, 0x1ea6: 0xd621, 0x1ea7: 0xd641, 0x1ea8: 0x2040, 0x1ea9: 0xd661, - 0x1eaa: 0xd681, 0x1eab: 0xd681, 0x1eac: 0x8c95, 0x1ead: 0xd6a1, 0x1eae: 0xd6c1, 0x1eaf: 0xd6e1, - 0x1eb0: 0xd701, 0x1eb1: 0x8cb5, 0x1eb2: 0xd721, 0x1eb3: 0xd741, 0x1eb4: 0x2040, 0x1eb5: 0xd761, - 0x1eb6: 0xd781, 0x1eb7: 0xd7a1, 0x1eb8: 0xd7c1, 0x1eb9: 0xd7e1, 0x1eba: 0xd801, 0x1ebb: 0x8cd5, - 0x1ebc: 0xd821, 0x1ebd: 0x8cf5, 0x1ebe: 0xd841, 0x1ebf: 0xd861, + 0x1e80: 0x2b59, 0x1e81: 0x2b61, 0x1e82: 0x2b69, 0x1e83: 0x2b71, 0x1e84: 0x2b79, 0x1e85: 0x2b81, + 0x1e86: 0x2b89, 0x1e87: 0x2b91, 0x1e88: 0x2b99, 0x1e89: 0x2ba1, 0x1e8a: 0x8e35, 0x1e8b: 0x2ba9, + 0x1e8c: 0x2bb1, 0x1e8d: 0x2bb9, 0x1e8e: 0x2bc1, 0x1e8f: 0x2bc9, 0x1e90: 0x2bd1, 0x1e91: 0x2bd9, + 0x1e92: 0x2be1, 0x1e93: 0x2be9, 0x1e94: 0x2bf1, 0x1e95: 0x2bf9, 0x1e96: 0x2c01, 0x1e97: 0x2c09, + 0x1e98: 0x2c11, 0x1e99: 0x2c19, 0x1e9a: 0x2c21, 0x1e9b: 0x2c29, 0x1e9c: 0x2c31, 0x1e9d: 0x8e55, + 0x1e9e: 0x2c39, 0x1e9f: 0x2c41, 0x1ea0: 0x2c49, 0x1ea1: 0x2c51, 0x1ea2: 0x2c59, 0x1ea3: 0x8e75, + 0x1ea4: 0x2c61, 0x1ea5: 0x2c69, 0x1ea6: 0x2c71, 0x1ea7: 0x2c79, 0x1ea8: 0x2c81, 0x1ea9: 0x2c89, + 0x1eaa: 0x2c91, 0x1eab: 0x2c99, 0x1eac: 0x7f0d, 0x1ead: 0x2ca1, 0x1eae: 0x2ca9, 0x1eaf: 0x2cb1, + 0x1eb0: 0x8e95, 0x1eb1: 0x2cb9, 0x1eb2: 0x2cc1, 0x1eb3: 0x2cc9, 0x1eb4: 0x2cd1, 0x1eb5: 0x2cd9, + 0x1eb6: 0x2ce1, 0x1eb7: 0x8eb5, 0x1eb8: 0x8ed5, 0x1eb9: 0x8ef5, 0x1eba: 0x2ce9, 0x1ebb: 0x8f15, + 0x1ebc: 0x2cf1, 0x1ebd: 0x2cf9, 0x1ebe: 0x2d01, 0x1ebf: 0x2d09, // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0xd881, 0x1ec1: 0xd8a1, 0x1ec2: 0xd8c1, 0x1ec3: 0xd8e1, 0x1ec4: 0xd901, 0x1ec5: 0xd921, - 0x1ec6: 0xd941, 0x1ec7: 0xd961, 0x1ec8: 0xd981, 0x1ec9: 0x8d15, 0x1eca: 0xd9a1, 0x1ecb: 0xd9c1, - 0x1ecc: 0xd9e1, 0x1ecd: 0xda01, 0x1ece: 0xda21, 0x1ecf: 0x8d35, 0x1ed0: 0xda41, 0x1ed1: 0x8d55, - 0x1ed2: 0x8d75, 0x1ed3: 0xda61, 0x1ed4: 0xda81, 0x1ed5: 0xda81, 0x1ed6: 0xdaa1, 0x1ed7: 0x8d95, - 0x1ed8: 0x8db5, 0x1ed9: 0xdac1, 0x1eda: 0xdae1, 0x1edb: 0xdb01, 0x1edc: 0xdb21, 0x1edd: 0xdb41, - 0x1ede: 0xdb61, 0x1edf: 0xdb81, 0x1ee0: 0xdba1, 0x1ee1: 0xdbc1, 0x1ee2: 0xdbe1, 0x1ee3: 0xdc01, - 0x1ee4: 0x8dd5, 0x1ee5: 0xdc21, 0x1ee6: 0xdc41, 0x1ee7: 0xdc61, 0x1ee8: 0xdc81, 0x1ee9: 0xdc61, - 0x1eea: 0xdca1, 0x1eeb: 0xdcc1, 0x1eec: 0xdce1, 0x1eed: 0xdd01, 0x1eee: 0xdd21, 0x1eef: 0xdd41, - 0x1ef0: 0xdd61, 0x1ef1: 0xdd81, 0x1ef2: 0xdda1, 0x1ef3: 0xddc1, 0x1ef4: 0xdde1, 0x1ef5: 0xde01, - 0x1ef6: 0xde21, 0x1ef7: 0xde41, 0x1ef8: 0x8df5, 0x1ef9: 0xde61, 0x1efa: 0xde81, 0x1efb: 0xdea1, - 0x1efc: 0xdec1, 0x1efd: 0xdee1, 0x1efe: 0x8e15, 0x1eff: 0xdf01, + 0x1ec0: 0x2d11, 0x1ec1: 0x2d19, 0x1ec2: 0x2d21, 0x1ec3: 0x2d29, 0x1ec4: 0x2d31, 0x1ec5: 0x2d39, + 0x1ec6: 0x8f35, 0x1ec7: 0x2d41, 0x1ec8: 0x2d49, 0x1ec9: 0x2d51, 0x1eca: 0x2d59, 0x1ecb: 0x2d61, + 0x1ecc: 0x2d69, 0x1ecd: 0x8f55, 0x1ece: 0x2d71, 0x1ecf: 0x2d79, 0x1ed0: 0x8f75, 0x1ed1: 0x8f95, + 0x1ed2: 0x2d81, 0x1ed3: 0x2d89, 0x1ed4: 0x2d91, 0x1ed5: 0x2d99, 0x1ed6: 0x2da1, 0x1ed7: 0x2da9, + 0x1ed8: 0x2db1, 0x1ed9: 0x2db9, 0x1eda: 0x2dc1, 0x1edb: 0x8fb5, 0x1edc: 0x2dc9, 0x1edd: 0x8fd5, + 0x1ede: 0x2dd1, 0x1edf: 0x2040, 0x1ee0: 0x2dd9, 0x1ee1: 0x2de1, 0x1ee2: 0x2de9, 0x1ee3: 0x8ff5, + 0x1ee4: 0x2df1, 0x1ee5: 0x2df9, 0x1ee6: 0x9015, 0x1ee7: 0x9035, 0x1ee8: 0x2e01, 0x1ee9: 0x2e09, + 0x1eea: 0x2e11, 0x1eeb: 0x2e19, 0x1eec: 0x2e21, 0x1eed: 0x2e21, 0x1eee: 0x2e29, 0x1eef: 0x2e31, + 0x1ef0: 0x2e39, 0x1ef1: 0x2e41, 0x1ef2: 0x2e49, 0x1ef3: 0x2e51, 0x1ef4: 0x2e59, 0x1ef5: 0x9055, + 0x1ef6: 0x2e61, 0x1ef7: 0x9075, 0x1ef8: 0x2e69, 0x1ef9: 0x9095, 0x1efa: 0x2e71, 0x1efb: 0x90b5, + 0x1efc: 0x90d5, 0x1efd: 0x90f5, 0x1efe: 0x2e79, 0x1eff: 0x2e81, // Block 0x7c, offset 0x1f00 - 0x1f00: 0xe601, 0x1f01: 0xe621, 0x1f02: 0xe641, 0x1f03: 0xe661, 0x1f04: 0xe681, 0x1f05: 0xe6a1, - 0x1f06: 0x8f35, 0x1f07: 0xe6c1, 0x1f08: 0xe6e1, 0x1f09: 0xe701, 0x1f0a: 0xe721, 0x1f0b: 0xe741, - 0x1f0c: 0xe761, 0x1f0d: 0x8f55, 0x1f0e: 0xe781, 0x1f0f: 0xe7a1, 0x1f10: 0x8f75, 0x1f11: 0x8f95, - 0x1f12: 0xe7c1, 0x1f13: 0xe7e1, 0x1f14: 0xe801, 0x1f15: 0xe821, 0x1f16: 0xe841, 0x1f17: 0xe861, - 0x1f18: 0xe881, 0x1f19: 0xe8a1, 0x1f1a: 0xe8c1, 0x1f1b: 0x8fb5, 0x1f1c: 0xe8e1, 0x1f1d: 0x8fd5, - 0x1f1e: 0xe901, 0x1f1f: 0x2040, 0x1f20: 0xe921, 0x1f21: 0xe941, 0x1f22: 0xe961, 0x1f23: 0x8ff5, - 0x1f24: 0xe981, 0x1f25: 0xe9a1, 0x1f26: 0x9015, 0x1f27: 0x9035, 0x1f28: 0xe9c1, 0x1f29: 0xe9e1, - 0x1f2a: 0xea01, 0x1f2b: 0xea21, 0x1f2c: 0xea41, 0x1f2d: 0xea41, 0x1f2e: 0xea61, 0x1f2f: 0xea81, - 0x1f30: 0xeaa1, 0x1f31: 0xeac1, 0x1f32: 0xeae1, 0x1f33: 0xeb01, 0x1f34: 0xeb21, 0x1f35: 0x9055, - 0x1f36: 0xeb41, 0x1f37: 0x9075, 0x1f38: 0xeb61, 0x1f39: 0x9095, 0x1f3a: 0xeb81, 0x1f3b: 0x90b5, - 0x1f3c: 0x90d5, 0x1f3d: 0x90f5, 0x1f3e: 0xeba1, 0x1f3f: 0xebc1, + 0x1f00: 0x2e89, 0x1f01: 0x9115, 0x1f02: 0x9135, 0x1f03: 0x9155, 0x1f04: 0x9175, 0x1f05: 0x2e91, + 0x1f06: 0x2e99, 0x1f07: 0x2e99, 0x1f08: 0x2ea1, 0x1f09: 0x2ea9, 0x1f0a: 0x2eb1, 0x1f0b: 0x2eb9, + 0x1f0c: 0x2ec1, 0x1f0d: 0x9195, 0x1f0e: 0x2ec9, 0x1f0f: 0x2ed1, 0x1f10: 0x2ed9, 0x1f11: 0x2ee1, + 0x1f12: 0x91b5, 0x1f13: 0x2ee9, 0x1f14: 0x91d5, 0x1f15: 0x91f5, 0x1f16: 0x2ef1, 0x1f17: 0x2ef9, + 0x1f18: 0x2f01, 0x1f19: 0x2f09, 0x1f1a: 0x2f11, 0x1f1b: 0x2f19, 0x1f1c: 0x9215, 0x1f1d: 0x9235, + 0x1f1e: 0x9255, 0x1f1f: 0x2040, 0x1f20: 0x2f21, 0x1f21: 0x9275, 0x1f22: 0x2f29, 0x1f23: 0x2f31, + 0x1f24: 0x2f39, 0x1f25: 0x9295, 0x1f26: 0x2f41, 0x1f27: 0x2f49, 0x1f28: 0x2f51, 0x1f29: 0x2f59, + 0x1f2a: 0x2f61, 0x1f2b: 0x92b5, 0x1f2c: 0x2f69, 0x1f2d: 0x2f71, 0x1f2e: 0x2f79, 0x1f2f: 0x2f81, + 0x1f30: 0x2f89, 0x1f31: 0x2f91, 0x1f32: 0x92d5, 0x1f33: 0x92f5, 0x1f34: 0x2f99, 0x1f35: 0x9315, + 0x1f36: 0x2fa1, 0x1f37: 0x9335, 0x1f38: 0x2fa9, 0x1f39: 0x2fb1, 0x1f3a: 0x2fb9, 0x1f3b: 0x9355, + 0x1f3c: 0x9375, 0x1f3d: 0x2fc1, 0x1f3e: 0x9395, 0x1f3f: 0x2fc9, // Block 0x7d, offset 0x1f40 - 0x1f40: 0xebe1, 0x1f41: 0x9115, 0x1f42: 0x9135, 0x1f43: 0x9155, 0x1f44: 0x9175, 0x1f45: 0xec01, - 0x1f46: 0xec21, 0x1f47: 0xec21, 0x1f48: 0xec41, 0x1f49: 0xec61, 0x1f4a: 0xec81, 0x1f4b: 0xeca1, - 0x1f4c: 0xecc1, 0x1f4d: 0x9195, 0x1f4e: 0xece1, 0x1f4f: 0xed01, 0x1f50: 0xed21, 0x1f51: 0xed41, - 0x1f52: 0x91b5, 0x1f53: 0xed61, 0x1f54: 0x91d5, 0x1f55: 0x91f5, 0x1f56: 0xed81, 0x1f57: 0xeda1, - 0x1f58: 0xedc1, 0x1f59: 0xede1, 0x1f5a: 0xee01, 0x1f5b: 0xee21, 0x1f5c: 0x9215, 0x1f5d: 0x9235, - 0x1f5e: 0x9255, 0x1f5f: 0x2040, 0x1f60: 0xee41, 0x1f61: 0x9275, 0x1f62: 0xee61, 0x1f63: 0xee81, - 0x1f64: 0xeea1, 0x1f65: 0x9295, 0x1f66: 0xeec1, 0x1f67: 0xeee1, 0x1f68: 0xef01, 0x1f69: 0xef21, - 0x1f6a: 0xef41, 0x1f6b: 0x92b5, 0x1f6c: 0xef61, 0x1f6d: 0xef81, 0x1f6e: 0xefa1, 0x1f6f: 0xefc1, - 0x1f70: 0xefe1, 0x1f71: 0xf001, 0x1f72: 0x92d5, 0x1f73: 0x92f5, 0x1f74: 0xf021, 0x1f75: 0x9315, - 0x1f76: 0xf041, 0x1f77: 0x9335, 0x1f78: 0xf061, 0x1f79: 0xf081, 0x1f7a: 0xf0a1, 0x1f7b: 0x9355, - 0x1f7c: 0x9375, 0x1f7d: 0xf0c1, 0x1f7e: 0x9395, 0x1f7f: 0xf0e1, + 0x1f40: 0x93b5, 0x1f41: 0x2fd1, 0x1f42: 0x2fd9, 0x1f43: 0x2fe1, 0x1f44: 0x2fe9, 0x1f45: 0x2ff1, + 0x1f46: 0x2ff9, 0x1f47: 0x93d5, 0x1f48: 0x93f5, 0x1f49: 0x9415, 0x1f4a: 0x9435, 0x1f4b: 0x2a29, + 0x1f4c: 0x3001, 0x1f4d: 0x3009, 0x1f4e: 0x3011, 0x1f4f: 0x3019, 0x1f50: 0x3021, 0x1f51: 0x3029, + 0x1f52: 0x3031, 0x1f53: 0x3039, 0x1f54: 0x3041, 0x1f55: 0x3049, 0x1f56: 0x3051, 0x1f57: 0x9455, + 0x1f58: 0x3059, 0x1f59: 0x3061, 0x1f5a: 0x3069, 0x1f5b: 0x3071, 0x1f5c: 0x3079, 0x1f5d: 0x3081, + 0x1f5e: 0x3089, 0x1f5f: 0x3091, 0x1f60: 0x3099, 0x1f61: 0x30a1, 0x1f62: 0x30a9, 0x1f63: 0x30b1, + 0x1f64: 0x9475, 0x1f65: 0x9495, 0x1f66: 0x94b5, 0x1f67: 0x30b9, 0x1f68: 0x30c1, 0x1f69: 0x30c9, + 0x1f6a: 0x30d1, 0x1f6b: 0x94d5, 0x1f6c: 0x30d9, 0x1f6d: 0x94f5, 0x1f6e: 0x30e1, 0x1f6f: 0x30e9, + 0x1f70: 0x9515, 0x1f71: 0x9535, 0x1f72: 0x30f1, 0x1f73: 0x30f9, 0x1f74: 0x3101, 0x1f75: 0x3109, + 0x1f76: 0x3111, 0x1f77: 0x3119, 0x1f78: 0x3121, 0x1f79: 0x3129, 0x1f7a: 0x3131, 0x1f7b: 0x3139, + 0x1f7c: 0x3141, 0x1f7d: 0x3149, 0x1f7e: 0x3151, 0x1f7f: 0x2040, // Block 0x7e, offset 0x1f80 - 0x1f80: 0xf721, 0x1f81: 0xf741, 0x1f82: 0xf761, 0x1f83: 0xf781, 0x1f84: 0xf7a1, 0x1f85: 0x9555, - 0x1f86: 0xf7c1, 0x1f87: 0xf7e1, 0x1f88: 0xf801, 0x1f89: 0xf821, 0x1f8a: 0xf841, 0x1f8b: 0x9575, - 0x1f8c: 0x9595, 0x1f8d: 0xf861, 0x1f8e: 0xf881, 0x1f8f: 0xf8a1, 0x1f90: 0xf8c1, 0x1f91: 0xf8e1, - 0x1f92: 0xf901, 0x1f93: 0x95b5, 0x1f94: 0xf921, 0x1f95: 0xf941, 0x1f96: 0xf961, 0x1f97: 0xf981, - 0x1f98: 0x95d5, 0x1f99: 0x95f5, 0x1f9a: 0xf9a1, 0x1f9b: 0xf9c1, 0x1f9c: 0xf9e1, 0x1f9d: 0x9615, - 0x1f9e: 0xfa01, 0x1f9f: 0xfa21, 0x1fa0: 0x684d, 0x1fa1: 0x9635, 0x1fa2: 0xfa41, 0x1fa3: 0xfa61, - 0x1fa4: 0xfa81, 0x1fa5: 0x9655, 0x1fa6: 0xfaa1, 0x1fa7: 0xfac1, 0x1fa8: 0xfae1, 0x1fa9: 0xfb01, - 0x1faa: 0xfb21, 0x1fab: 0xfb41, 0x1fac: 0xfb61, 0x1fad: 0x9675, 0x1fae: 0xfb81, 0x1faf: 0xfba1, - 0x1fb0: 0xfbc1, 0x1fb1: 0x9695, 0x1fb2: 0xfbe1, 0x1fb3: 0xfc01, 0x1fb4: 0xfc21, 0x1fb5: 0xfc41, - 0x1fb6: 0x7b6d, 0x1fb7: 0x96b5, 0x1fb8: 0xfc61, 0x1fb9: 0xfc81, 0x1fba: 0xfca1, 0x1fbb: 0x96d5, - 0x1fbc: 0xfcc1, 0x1fbd: 0x96f5, 0x1fbe: 0xfce1, 0x1fbf: 0xfce1, + 0x1f80: 0x3159, 0x1f81: 0x3161, 0x1f82: 0x3169, 0x1f83: 0x3171, 0x1f84: 0x3179, 0x1f85: 0x9555, + 0x1f86: 0x3181, 0x1f87: 0x3189, 0x1f88: 0x3191, 0x1f89: 0x3199, 0x1f8a: 0x31a1, 0x1f8b: 0x9575, + 0x1f8c: 0x9595, 0x1f8d: 0x31a9, 0x1f8e: 0x31b1, 0x1f8f: 0x31b9, 0x1f90: 0x31c1, 0x1f91: 0x31c9, + 0x1f92: 0x31d1, 0x1f93: 0x95b5, 0x1f94: 0x31d9, 0x1f95: 0x31e1, 0x1f96: 0x31e9, 0x1f97: 0x31f1, + 0x1f98: 0x95d5, 0x1f99: 0x95f5, 0x1f9a: 0x31f9, 0x1f9b: 0x3201, 0x1f9c: 0x3209, 0x1f9d: 0x9615, + 0x1f9e: 0x3211, 0x1f9f: 0x3219, 0x1fa0: 0x684d, 0x1fa1: 0x9635, 0x1fa2: 0x3221, 0x1fa3: 0x3229, + 0x1fa4: 0x3231, 0x1fa5: 0x9655, 0x1fa6: 0x3239, 0x1fa7: 0x3241, 0x1fa8: 0x3249, 0x1fa9: 0x3251, + 0x1faa: 0x3259, 0x1fab: 0x3261, 0x1fac: 0x3269, 0x1fad: 0x9675, 0x1fae: 0x3271, 0x1faf: 0x3279, + 0x1fb0: 0x3281, 0x1fb1: 0x9695, 0x1fb2: 0x3289, 0x1fb3: 0x3291, 0x1fb4: 0x3299, 0x1fb5: 0x32a1, + 0x1fb6: 0x7b6d, 0x1fb7: 0x96b5, 0x1fb8: 0x32a9, 0x1fb9: 0x32b1, 0x1fba: 0x32b9, 0x1fbb: 0x96d5, + 0x1fbc: 0x32c1, 0x1fbd: 0x96f5, 0x1fbe: 0x32c9, 0x1fbf: 0x32c9, // Block 0x7f, offset 0x1fc0 - 0x1fc0: 0xfd01, 0x1fc1: 0x9715, 0x1fc2: 0xfd21, 0x1fc3: 0xfd41, 0x1fc4: 0xfd61, 0x1fc5: 0xfd81, - 0x1fc6: 0xfda1, 0x1fc7: 0xfdc1, 0x1fc8: 0xfde1, 0x1fc9: 0x9735, 0x1fca: 0xfe01, 0x1fcb: 0xfe21, - 0x1fcc: 0xfe41, 0x1fcd: 0xfe61, 0x1fce: 0xfe81, 0x1fcf: 0xfea1, 0x1fd0: 0x9755, 0x1fd1: 0xfec1, - 0x1fd2: 0x9775, 0x1fd3: 0x9795, 0x1fd4: 0x97b5, 0x1fd5: 0xfee1, 0x1fd6: 0xff01, 0x1fd7: 0xff21, - 0x1fd8: 0xff41, 0x1fd9: 0xff61, 0x1fda: 0xff81, 0x1fdb: 0xffa1, 0x1fdc: 0xffc1, 0x1fdd: 0x97d5, + 0x1fc0: 0x32d1, 0x1fc1: 0x9715, 0x1fc2: 0x32d9, 0x1fc3: 0x32e1, 0x1fc4: 0x32e9, 0x1fc5: 0x32f1, + 0x1fc6: 0x32f9, 0x1fc7: 0x3301, 0x1fc8: 0x3309, 0x1fc9: 0x9735, 0x1fca: 0x3311, 0x1fcb: 0x3319, + 0x1fcc: 0x3321, 0x1fcd: 0x3329, 0x1fce: 0x3331, 0x1fcf: 0x3339, 0x1fd0: 0x9755, 0x1fd1: 0x3341, + 0x1fd2: 0x9775, 0x1fd3: 0x9795, 0x1fd4: 0x97b5, 0x1fd5: 0x3349, 0x1fd6: 0x3351, 0x1fd7: 0x3359, + 0x1fd8: 0x3361, 0x1fd9: 0x3369, 0x1fda: 0x3371, 0x1fdb: 0x3379, 0x1fdc: 0x3381, 0x1fdd: 0x97d5, 0x1fde: 0x0040, 0x1fdf: 0x0040, 0x1fe0: 0x0040, 0x1fe1: 0x0040, 0x1fe2: 0x0040, 0x1fe3: 0x0040, 0x1fe4: 0x0040, 0x1fe5: 0x0040, 0x1fe6: 0x0040, 0x1fe7: 0x0040, 0x1fe8: 0x0040, 0x1fe9: 0x0040, 0x1fea: 0x0040, 0x1feb: 0x0040, 0x1fec: 0x0040, 0x1fed: 0x0040, 0x1fee: 0x0040, 0x1fef: 0x0040, @@ -2134,7 +2277,7 @@ var idnaIndex = [2368]uint16{ 0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37, // Block 0x7, offset 0x1c0 0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1, - 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41, + 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0xe3, 0x1cd: 0xe4, 0x1ce: 0x3e, 0x1cf: 0x3f, 0x1d0: 0xa0, 0x1d1: 0xa0, 0x1d2: 0xa0, 0x1d3: 0xa0, 0x1d4: 0xa0, 0x1d5: 0xa0, 0x1d6: 0xa0, 0x1d7: 0xa0, 0x1d8: 0xa0, 0x1d9: 0xa0, 0x1da: 0xa0, 0x1db: 0xa0, 0x1dc: 0xa0, 0x1dd: 0xa0, 0x1de: 0xa0, 0x1df: 0xa0, 0x1e0: 0xa0, 0x1e1: 0xa0, 0x1e2: 0xa0, 0x1e3: 0xa0, 0x1e4: 0xa0, 0x1e5: 0xa0, 0x1e6: 0xa0, 0x1e7: 0xa0, @@ -2167,143 +2310,143 @@ var idnaIndex = [2368]uint16{ 0x2a0: 0xa0, 0x2a1: 0xa0, 0x2a2: 0xa0, 0x2a3: 0xa0, 0x2a4: 0xa0, 0x2a5: 0xa0, 0x2a6: 0xa0, 0x2a7: 0xa0, 0x2a8: 0xa0, 0x2a9: 0xa0, 0x2aa: 0xa0, 0x2ab: 0xa0, 0x2ac: 0xa0, 0x2ad: 0xa0, 0x2ae: 0xa0, 0x2af: 0xa0, 0x2b0: 0xa0, 0x2b1: 0xa0, 0x2b2: 0xa0, 0x2b3: 0xa0, 0x2b4: 0xa0, 0x2b5: 0xa0, 0x2b6: 0xa0, 0x2b7: 0xa0, - 0x2b8: 0xa0, 0x2b9: 0xa0, 0x2ba: 0xa0, 0x2bb: 0xa0, 0x2bc: 0xa0, 0x2bd: 0xa0, 0x2be: 0xa0, 0x2bf: 0xe3, + 0x2b8: 0xa0, 0x2b9: 0xa0, 0x2ba: 0xa0, 0x2bb: 0xa0, 0x2bc: 0xa0, 0x2bd: 0xa0, 0x2be: 0xa0, 0x2bf: 0xe5, // Block 0xb, offset 0x2c0 0x2c0: 0xa0, 0x2c1: 0xa0, 0x2c2: 0xa0, 0x2c3: 0xa0, 0x2c4: 0xa0, 0x2c5: 0xa0, 0x2c6: 0xa0, 0x2c7: 0xa0, 0x2c8: 0xa0, 0x2c9: 0xa0, 0x2ca: 0xa0, 0x2cb: 0xa0, 0x2cc: 0xa0, 0x2cd: 0xa0, 0x2ce: 0xa0, 0x2cf: 0xa0, - 0x2d0: 0xa0, 0x2d1: 0xa0, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0xa0, 0x2d5: 0xa0, 0x2d6: 0xa0, 0x2d7: 0xa0, - 0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8, - 0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0, - 0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8, + 0x2d0: 0xa0, 0x2d1: 0xa0, 0x2d2: 0xe6, 0x2d3: 0xe7, 0x2d4: 0xa0, 0x2d5: 0xa0, 0x2d6: 0xa0, 0x2d7: 0xa0, + 0x2d8: 0xe8, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe9, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xea, + 0x2e0: 0xeb, 0x2e1: 0xec, 0x2e2: 0xed, 0x2e3: 0xee, 0x2e4: 0xef, 0x2e5: 0xf0, 0x2e6: 0xf1, 0x2e7: 0xf2, + 0x2e8: 0xf3, 0x2e9: 0xf4, 0x2ea: 0xf5, 0x2eb: 0xf6, 0x2ec: 0xf7, 0x2ed: 0xf8, 0x2ee: 0xf9, 0x2ef: 0xfa, 0x2f0: 0xa0, 0x2f1: 0xa0, 0x2f2: 0xa0, 0x2f3: 0xa0, 0x2f4: 0xa0, 0x2f5: 0xa0, 0x2f6: 0xa0, 0x2f7: 0xa0, 0x2f8: 0xa0, 0x2f9: 0xa0, 0x2fa: 0xa0, 0x2fb: 0xa0, 0x2fc: 0xa0, 0x2fd: 0xa0, 0x2fe: 0xa0, 0x2ff: 0xa0, // Block 0xc, offset 0x300 0x300: 0xa0, 0x301: 0xa0, 0x302: 0xa0, 0x303: 0xa0, 0x304: 0xa0, 0x305: 0xa0, 0x306: 0xa0, 0x307: 0xa0, 0x308: 0xa0, 0x309: 0xa0, 0x30a: 0xa0, 0x30b: 0xa0, 0x30c: 0xa0, 0x30d: 0xa0, 0x30e: 0xa0, 0x30f: 0xa0, 0x310: 0xa0, 0x311: 0xa0, 0x312: 0xa0, 0x313: 0xa0, 0x314: 0xa0, 0x315: 0xa0, 0x316: 0xa0, 0x317: 0xa0, - 0x318: 0xa0, 0x319: 0xa0, 0x31a: 0xa0, 0x31b: 0xa0, 0x31c: 0xa0, 0x31d: 0xa0, 0x31e: 0xf9, 0x31f: 0xfa, + 0x318: 0xa0, 0x319: 0xa0, 0x31a: 0xa0, 0x31b: 0xa0, 0x31c: 0xa0, 0x31d: 0xa0, 0x31e: 0xfb, 0x31f: 0xfc, // Block 0xd, offset 0x340 - 0x340: 0xfb, 0x341: 0xfb, 0x342: 0xfb, 0x343: 0xfb, 0x344: 0xfb, 0x345: 0xfb, 0x346: 0xfb, 0x347: 0xfb, - 0x348: 0xfb, 0x349: 0xfb, 0x34a: 0xfb, 0x34b: 0xfb, 0x34c: 0xfb, 0x34d: 0xfb, 0x34e: 0xfb, 0x34f: 0xfb, - 0x350: 0xfb, 0x351: 0xfb, 0x352: 0xfb, 0x353: 0xfb, 0x354: 0xfb, 0x355: 0xfb, 0x356: 0xfb, 0x357: 0xfb, - 0x358: 0xfb, 0x359: 0xfb, 0x35a: 0xfb, 0x35b: 0xfb, 0x35c: 0xfb, 0x35d: 0xfb, 0x35e: 0xfb, 0x35f: 0xfb, - 0x360: 0xfb, 0x361: 0xfb, 0x362: 0xfb, 0x363: 0xfb, 0x364: 0xfb, 0x365: 0xfb, 0x366: 0xfb, 0x367: 0xfb, - 0x368: 0xfb, 0x369: 0xfb, 0x36a: 0xfb, 0x36b: 0xfb, 0x36c: 0xfb, 0x36d: 0xfb, 0x36e: 0xfb, 0x36f: 0xfb, - 0x370: 0xfb, 0x371: 0xfb, 0x372: 0xfb, 0x373: 0xfb, 0x374: 0xfb, 0x375: 0xfb, 0x376: 0xfb, 0x377: 0xfb, - 0x378: 0xfb, 0x379: 0xfb, 0x37a: 0xfb, 0x37b: 0xfb, 0x37c: 0xfb, 0x37d: 0xfb, 0x37e: 0xfb, 0x37f: 0xfb, + 0x340: 0xfd, 0x341: 0xfd, 0x342: 0xfd, 0x343: 0xfd, 0x344: 0xfd, 0x345: 0xfd, 0x346: 0xfd, 0x347: 0xfd, + 0x348: 0xfd, 0x349: 0xfd, 0x34a: 0xfd, 0x34b: 0xfd, 0x34c: 0xfd, 0x34d: 0xfd, 0x34e: 0xfd, 0x34f: 0xfd, + 0x350: 0xfd, 0x351: 0xfd, 0x352: 0xfd, 0x353: 0xfd, 0x354: 0xfd, 0x355: 0xfd, 0x356: 0xfd, 0x357: 0xfd, + 0x358: 0xfd, 0x359: 0xfd, 0x35a: 0xfd, 0x35b: 0xfd, 0x35c: 0xfd, 0x35d: 0xfd, 0x35e: 0xfd, 0x35f: 0xfd, + 0x360: 0xfd, 0x361: 0xfd, 0x362: 0xfd, 0x363: 0xfd, 0x364: 0xfd, 0x365: 0xfd, 0x366: 0xfd, 0x367: 0xfd, + 0x368: 0xfd, 0x369: 0xfd, 0x36a: 0xfd, 0x36b: 0xfd, 0x36c: 0xfd, 0x36d: 0xfd, 0x36e: 0xfd, 0x36f: 0xfd, + 0x370: 0xfd, 0x371: 0xfd, 0x372: 0xfd, 0x373: 0xfd, 0x374: 0xfd, 0x375: 0xfd, 0x376: 0xfd, 0x377: 0xfd, + 0x378: 0xfd, 0x379: 0xfd, 0x37a: 0xfd, 0x37b: 0xfd, 0x37c: 0xfd, 0x37d: 0xfd, 0x37e: 0xfd, 0x37f: 0xfd, // Block 0xe, offset 0x380 - 0x380: 0xfb, 0x381: 0xfb, 0x382: 0xfb, 0x383: 0xfb, 0x384: 0xfb, 0x385: 0xfb, 0x386: 0xfb, 0x387: 0xfb, - 0x388: 0xfb, 0x389: 0xfb, 0x38a: 0xfb, 0x38b: 0xfb, 0x38c: 0xfb, 0x38d: 0xfb, 0x38e: 0xfb, 0x38f: 0xfb, - 0x390: 0xfb, 0x391: 0xfb, 0x392: 0xfb, 0x393: 0xfb, 0x394: 0xfb, 0x395: 0xfb, 0x396: 0xfb, 0x397: 0xfb, - 0x398: 0xfb, 0x399: 0xfb, 0x39a: 0xfb, 0x39b: 0xfb, 0x39c: 0xfb, 0x39d: 0xfb, 0x39e: 0xfb, 0x39f: 0xfb, - 0x3a0: 0xfb, 0x3a1: 0xfb, 0x3a2: 0xfb, 0x3a3: 0xfb, 0x3a4: 0xfc, 0x3a5: 0xfd, 0x3a6: 0xfe, 0x3a7: 0xff, - 0x3a8: 0x47, 0x3a9: 0x100, 0x3aa: 0x101, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c, - 0x3b0: 0x102, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x103, 0x3b7: 0x52, - 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a, + 0x380: 0xfd, 0x381: 0xfd, 0x382: 0xfd, 0x383: 0xfd, 0x384: 0xfd, 0x385: 0xfd, 0x386: 0xfd, 0x387: 0xfd, + 0x388: 0xfd, 0x389: 0xfd, 0x38a: 0xfd, 0x38b: 0xfd, 0x38c: 0xfd, 0x38d: 0xfd, 0x38e: 0xfd, 0x38f: 0xfd, + 0x390: 0xfd, 0x391: 0xfd, 0x392: 0xfd, 0x393: 0xfd, 0x394: 0xfd, 0x395: 0xfd, 0x396: 0xfd, 0x397: 0xfd, + 0x398: 0xfd, 0x399: 0xfd, 0x39a: 0xfd, 0x39b: 0xfd, 0x39c: 0xfd, 0x39d: 0xfd, 0x39e: 0xfd, 0x39f: 0xfd, + 0x3a0: 0xfd, 0x3a1: 0xfd, 0x3a2: 0xfd, 0x3a3: 0xfd, 0x3a4: 0xfe, 0x3a5: 0xff, 0x3a6: 0x100, 0x3a7: 0x101, + 0x3a8: 0x45, 0x3a9: 0x102, 0x3aa: 0x103, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a, + 0x3b0: 0x104, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x105, 0x3b7: 0x50, + 0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58, // Block 0xf, offset 0x3c0 - 0x3c0: 0x104, 0x3c1: 0x105, 0x3c2: 0xa0, 0x3c3: 0x106, 0x3c4: 0x107, 0x3c5: 0x9c, 0x3c6: 0x108, 0x3c7: 0x109, - 0x3c8: 0xfb, 0x3c9: 0xfb, 0x3ca: 0x10a, 0x3cb: 0x10b, 0x3cc: 0x10c, 0x3cd: 0x10d, 0x3ce: 0x10e, 0x3cf: 0x10f, - 0x3d0: 0x110, 0x3d1: 0xa0, 0x3d2: 0x111, 0x3d3: 0x112, 0x3d4: 0x113, 0x3d5: 0x114, 0x3d6: 0xfb, 0x3d7: 0xfb, - 0x3d8: 0xa0, 0x3d9: 0xa0, 0x3da: 0xa0, 0x3db: 0xa0, 0x3dc: 0x115, 0x3dd: 0x116, 0x3de: 0xfb, 0x3df: 0xfb, - 0x3e0: 0x117, 0x3e1: 0x118, 0x3e2: 0x119, 0x3e3: 0x11a, 0x3e4: 0x11b, 0x3e5: 0xfb, 0x3e6: 0x11c, 0x3e7: 0x11d, - 0x3e8: 0x11e, 0x3e9: 0x11f, 0x3ea: 0x120, 0x3eb: 0x5b, 0x3ec: 0x121, 0x3ed: 0x122, 0x3ee: 0x5c, 0x3ef: 0xfb, - 0x3f0: 0x123, 0x3f1: 0x124, 0x3f2: 0x125, 0x3f3: 0x126, 0x3f4: 0x127, 0x3f5: 0xfb, 0x3f6: 0xfb, 0x3f7: 0xfb, - 0x3f8: 0xfb, 0x3f9: 0x128, 0x3fa: 0x129, 0x3fb: 0xfb, 0x3fc: 0x12a, 0x3fd: 0x12b, 0x3fe: 0x12c, 0x3ff: 0x12d, + 0x3c0: 0x106, 0x3c1: 0x107, 0x3c2: 0xa0, 0x3c3: 0x108, 0x3c4: 0x109, 0x3c5: 0x9c, 0x3c6: 0x10a, 0x3c7: 0x10b, + 0x3c8: 0xfd, 0x3c9: 0xfd, 0x3ca: 0x10c, 0x3cb: 0x10d, 0x3cc: 0x10e, 0x3cd: 0x10f, 0x3ce: 0x110, 0x3cf: 0x111, + 0x3d0: 0x112, 0x3d1: 0xa0, 0x3d2: 0x113, 0x3d3: 0x114, 0x3d4: 0x115, 0x3d5: 0x116, 0x3d6: 0xfd, 0x3d7: 0xfd, + 0x3d8: 0xa0, 0x3d9: 0xa0, 0x3da: 0xa0, 0x3db: 0xa0, 0x3dc: 0x117, 0x3dd: 0x118, 0x3de: 0xfd, 0x3df: 0xfd, + 0x3e0: 0x119, 0x3e1: 0x11a, 0x3e2: 0x11b, 0x3e3: 0x11c, 0x3e4: 0x11d, 0x3e5: 0xfd, 0x3e6: 0x11e, 0x3e7: 0x11f, + 0x3e8: 0x120, 0x3e9: 0x121, 0x3ea: 0x122, 0x3eb: 0x59, 0x3ec: 0x123, 0x3ed: 0x124, 0x3ee: 0x5a, 0x3ef: 0xfd, + 0x3f0: 0x125, 0x3f1: 0x126, 0x3f2: 0x127, 0x3f3: 0x128, 0x3f4: 0x129, 0x3f5: 0xfd, 0x3f6: 0xfd, 0x3f7: 0xfd, + 0x3f8: 0xfd, 0x3f9: 0x12a, 0x3fa: 0x12b, 0x3fb: 0xfd, 0x3fc: 0x12c, 0x3fd: 0x12d, 0x3fe: 0x12e, 0x3ff: 0x12f, // Block 0x10, offset 0x400 - 0x400: 0x12e, 0x401: 0x12f, 0x402: 0x130, 0x403: 0x131, 0x404: 0x132, 0x405: 0x133, 0x406: 0x134, 0x407: 0x135, - 0x408: 0x136, 0x409: 0xfb, 0x40a: 0x137, 0x40b: 0x138, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xfb, 0x40f: 0xfb, - 0x410: 0x139, 0x411: 0x13a, 0x412: 0x13b, 0x413: 0x13c, 0x414: 0xfb, 0x415: 0xfb, 0x416: 0x13d, 0x417: 0x13e, - 0x418: 0x13f, 0x419: 0x140, 0x41a: 0x141, 0x41b: 0x142, 0x41c: 0x143, 0x41d: 0xfb, 0x41e: 0xfb, 0x41f: 0xfb, - 0x420: 0x144, 0x421: 0xfb, 0x422: 0x145, 0x423: 0x146, 0x424: 0x5f, 0x425: 0x147, 0x426: 0x148, 0x427: 0x149, - 0x428: 0x14a, 0x429: 0x14b, 0x42a: 0x14c, 0x42b: 0x14d, 0x42c: 0xfb, 0x42d: 0xfb, 0x42e: 0xfb, 0x42f: 0xfb, - 0x430: 0x14e, 0x431: 0x14f, 0x432: 0x150, 0x433: 0xfb, 0x434: 0x151, 0x435: 0x152, 0x436: 0x153, 0x437: 0xfb, - 0x438: 0xfb, 0x439: 0xfb, 0x43a: 0xfb, 0x43b: 0x154, 0x43c: 0xfb, 0x43d: 0xfb, 0x43e: 0x155, 0x43f: 0x156, + 0x400: 0x130, 0x401: 0x131, 0x402: 0x132, 0x403: 0x133, 0x404: 0x134, 0x405: 0x135, 0x406: 0x136, 0x407: 0x137, + 0x408: 0x138, 0x409: 0xfd, 0x40a: 0x139, 0x40b: 0x13a, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xfd, 0x40f: 0xfd, + 0x410: 0x13b, 0x411: 0x13c, 0x412: 0x13d, 0x413: 0x13e, 0x414: 0xfd, 0x415: 0xfd, 0x416: 0x13f, 0x417: 0x140, + 0x418: 0x141, 0x419: 0x142, 0x41a: 0x143, 0x41b: 0x144, 0x41c: 0x145, 0x41d: 0xfd, 0x41e: 0xfd, 0x41f: 0xfd, + 0x420: 0x146, 0x421: 0xfd, 0x422: 0x147, 0x423: 0x148, 0x424: 0x5d, 0x425: 0x149, 0x426: 0x14a, 0x427: 0x14b, + 0x428: 0x14c, 0x429: 0x14d, 0x42a: 0x14e, 0x42b: 0x14f, 0x42c: 0xfd, 0x42d: 0xfd, 0x42e: 0xfd, 0x42f: 0xfd, + 0x430: 0x150, 0x431: 0x151, 0x432: 0x152, 0x433: 0xfd, 0x434: 0x153, 0x435: 0x154, 0x436: 0x155, 0x437: 0xfd, + 0x438: 0xfd, 0x439: 0xfd, 0x43a: 0xfd, 0x43b: 0x156, 0x43c: 0xfd, 0x43d: 0xfd, 0x43e: 0x157, 0x43f: 0x158, // Block 0x11, offset 0x440 0x440: 0xa0, 0x441: 0xa0, 0x442: 0xa0, 0x443: 0xa0, 0x444: 0xa0, 0x445: 0xa0, 0x446: 0xa0, 0x447: 0xa0, - 0x448: 0xa0, 0x449: 0xa0, 0x44a: 0xa0, 0x44b: 0xa0, 0x44c: 0xa0, 0x44d: 0xa0, 0x44e: 0x157, 0x44f: 0xfb, - 0x450: 0x9c, 0x451: 0x158, 0x452: 0xa0, 0x453: 0xa0, 0x454: 0xa0, 0x455: 0x159, 0x456: 0xfb, 0x457: 0xfb, - 0x458: 0xfb, 0x459: 0xfb, 0x45a: 0xfb, 0x45b: 0xfb, 0x45c: 0xfb, 0x45d: 0xfb, 0x45e: 0xfb, 0x45f: 0xfb, - 0x460: 0xfb, 0x461: 0xfb, 0x462: 0xfb, 0x463: 0xfb, 0x464: 0xfb, 0x465: 0xfb, 0x466: 0xfb, 0x467: 0xfb, - 0x468: 0xfb, 0x469: 0xfb, 0x46a: 0xfb, 0x46b: 0xfb, 0x46c: 0xfb, 0x46d: 0xfb, 0x46e: 0xfb, 0x46f: 0xfb, - 0x470: 0xfb, 0x471: 0xfb, 0x472: 0xfb, 0x473: 0xfb, 0x474: 0xfb, 0x475: 0xfb, 0x476: 0xfb, 0x477: 0xfb, - 0x478: 0xfb, 0x479: 0xfb, 0x47a: 0xfb, 0x47b: 0xfb, 0x47c: 0xfb, 0x47d: 0xfb, 0x47e: 0xfb, 0x47f: 0xfb, + 0x448: 0xa0, 0x449: 0xa0, 0x44a: 0xa0, 0x44b: 0xa0, 0x44c: 0xa0, 0x44d: 0xa0, 0x44e: 0x159, 0x44f: 0xfd, + 0x450: 0x9c, 0x451: 0x15a, 0x452: 0xa0, 0x453: 0xa0, 0x454: 0xa0, 0x455: 0x15b, 0x456: 0xfd, 0x457: 0xfd, + 0x458: 0xfd, 0x459: 0xfd, 0x45a: 0xfd, 0x45b: 0xfd, 0x45c: 0xfd, 0x45d: 0xfd, 0x45e: 0xfd, 0x45f: 0xfd, + 0x460: 0xfd, 0x461: 0xfd, 0x462: 0xfd, 0x463: 0xfd, 0x464: 0xfd, 0x465: 0xfd, 0x466: 0xfd, 0x467: 0xfd, + 0x468: 0xfd, 0x469: 0xfd, 0x46a: 0xfd, 0x46b: 0xfd, 0x46c: 0xfd, 0x46d: 0xfd, 0x46e: 0xfd, 0x46f: 0xfd, + 0x470: 0xfd, 0x471: 0xfd, 0x472: 0xfd, 0x473: 0xfd, 0x474: 0xfd, 0x475: 0xfd, 0x476: 0xfd, 0x477: 0xfd, + 0x478: 0xfd, 0x479: 0xfd, 0x47a: 0xfd, 0x47b: 0xfd, 0x47c: 0xfd, 0x47d: 0xfd, 0x47e: 0xfd, 0x47f: 0xfd, // Block 0x12, offset 0x480 0x480: 0xa0, 0x481: 0xa0, 0x482: 0xa0, 0x483: 0xa0, 0x484: 0xa0, 0x485: 0xa0, 0x486: 0xa0, 0x487: 0xa0, 0x488: 0xa0, 0x489: 0xa0, 0x48a: 0xa0, 0x48b: 0xa0, 0x48c: 0xa0, 0x48d: 0xa0, 0x48e: 0xa0, 0x48f: 0xa0, - 0x490: 0x15a, 0x491: 0xfb, 0x492: 0xfb, 0x493: 0xfb, 0x494: 0xfb, 0x495: 0xfb, 0x496: 0xfb, 0x497: 0xfb, - 0x498: 0xfb, 0x499: 0xfb, 0x49a: 0xfb, 0x49b: 0xfb, 0x49c: 0xfb, 0x49d: 0xfb, 0x49e: 0xfb, 0x49f: 0xfb, - 0x4a0: 0xfb, 0x4a1: 0xfb, 0x4a2: 0xfb, 0x4a3: 0xfb, 0x4a4: 0xfb, 0x4a5: 0xfb, 0x4a6: 0xfb, 0x4a7: 0xfb, - 0x4a8: 0xfb, 0x4a9: 0xfb, 0x4aa: 0xfb, 0x4ab: 0xfb, 0x4ac: 0xfb, 0x4ad: 0xfb, 0x4ae: 0xfb, 0x4af: 0xfb, - 0x4b0: 0xfb, 0x4b1: 0xfb, 0x4b2: 0xfb, 0x4b3: 0xfb, 0x4b4: 0xfb, 0x4b5: 0xfb, 0x4b6: 0xfb, 0x4b7: 0xfb, - 0x4b8: 0xfb, 0x4b9: 0xfb, 0x4ba: 0xfb, 0x4bb: 0xfb, 0x4bc: 0xfb, 0x4bd: 0xfb, 0x4be: 0xfb, 0x4bf: 0xfb, + 0x490: 0x15c, 0x491: 0xfd, 0x492: 0xfd, 0x493: 0xfd, 0x494: 0xfd, 0x495: 0xfd, 0x496: 0xfd, 0x497: 0xfd, + 0x498: 0xfd, 0x499: 0xfd, 0x49a: 0xfd, 0x49b: 0xfd, 0x49c: 0xfd, 0x49d: 0xfd, 0x49e: 0xfd, 0x49f: 0xfd, + 0x4a0: 0xfd, 0x4a1: 0xfd, 0x4a2: 0xfd, 0x4a3: 0xfd, 0x4a4: 0xfd, 0x4a5: 0xfd, 0x4a6: 0xfd, 0x4a7: 0xfd, + 0x4a8: 0xfd, 0x4a9: 0xfd, 0x4aa: 0xfd, 0x4ab: 0xfd, 0x4ac: 0xfd, 0x4ad: 0xfd, 0x4ae: 0xfd, 0x4af: 0xfd, + 0x4b0: 0xfd, 0x4b1: 0xfd, 0x4b2: 0xfd, 0x4b3: 0xfd, 0x4b4: 0xfd, 0x4b5: 0xfd, 0x4b6: 0xfd, 0x4b7: 0xfd, + 0x4b8: 0xfd, 0x4b9: 0xfd, 0x4ba: 0xfd, 0x4bb: 0xfd, 0x4bc: 0xfd, 0x4bd: 0xfd, 0x4be: 0xfd, 0x4bf: 0xfd, // Block 0x13, offset 0x4c0 - 0x4c0: 0xfb, 0x4c1: 0xfb, 0x4c2: 0xfb, 0x4c3: 0xfb, 0x4c4: 0xfb, 0x4c5: 0xfb, 0x4c6: 0xfb, 0x4c7: 0xfb, - 0x4c8: 0xfb, 0x4c9: 0xfb, 0x4ca: 0xfb, 0x4cb: 0xfb, 0x4cc: 0xfb, 0x4cd: 0xfb, 0x4ce: 0xfb, 0x4cf: 0xfb, + 0x4c0: 0xfd, 0x4c1: 0xfd, 0x4c2: 0xfd, 0x4c3: 0xfd, 0x4c4: 0xfd, 0x4c5: 0xfd, 0x4c6: 0xfd, 0x4c7: 0xfd, + 0x4c8: 0xfd, 0x4c9: 0xfd, 0x4ca: 0xfd, 0x4cb: 0xfd, 0x4cc: 0xfd, 0x4cd: 0xfd, 0x4ce: 0xfd, 0x4cf: 0xfd, 0x4d0: 0xa0, 0x4d1: 0xa0, 0x4d2: 0xa0, 0x4d3: 0xa0, 0x4d4: 0xa0, 0x4d5: 0xa0, 0x4d6: 0xa0, 0x4d7: 0xa0, - 0x4d8: 0xa0, 0x4d9: 0x15b, 0x4da: 0xfb, 0x4db: 0xfb, 0x4dc: 0xfb, 0x4dd: 0xfb, 0x4de: 0xfb, 0x4df: 0xfb, - 0x4e0: 0xfb, 0x4e1: 0xfb, 0x4e2: 0xfb, 0x4e3: 0xfb, 0x4e4: 0xfb, 0x4e5: 0xfb, 0x4e6: 0xfb, 0x4e7: 0xfb, - 0x4e8: 0xfb, 0x4e9: 0xfb, 0x4ea: 0xfb, 0x4eb: 0xfb, 0x4ec: 0xfb, 0x4ed: 0xfb, 0x4ee: 0xfb, 0x4ef: 0xfb, - 0x4f0: 0xfb, 0x4f1: 0xfb, 0x4f2: 0xfb, 0x4f3: 0xfb, 0x4f4: 0xfb, 0x4f5: 0xfb, 0x4f6: 0xfb, 0x4f7: 0xfb, - 0x4f8: 0xfb, 0x4f9: 0xfb, 0x4fa: 0xfb, 0x4fb: 0xfb, 0x4fc: 0xfb, 0x4fd: 0xfb, 0x4fe: 0xfb, 0x4ff: 0xfb, + 0x4d8: 0xa0, 0x4d9: 0x15d, 0x4da: 0xfd, 0x4db: 0xfd, 0x4dc: 0xfd, 0x4dd: 0xfd, 0x4de: 0xfd, 0x4df: 0xfd, + 0x4e0: 0xfd, 0x4e1: 0xfd, 0x4e2: 0xfd, 0x4e3: 0xfd, 0x4e4: 0xfd, 0x4e5: 0xfd, 0x4e6: 0xfd, 0x4e7: 0xfd, + 0x4e8: 0xfd, 0x4e9: 0xfd, 0x4ea: 0xfd, 0x4eb: 0xfd, 0x4ec: 0xfd, 0x4ed: 0xfd, 0x4ee: 0xfd, 0x4ef: 0xfd, + 0x4f0: 0xfd, 0x4f1: 0xfd, 0x4f2: 0xfd, 0x4f3: 0xfd, 0x4f4: 0xfd, 0x4f5: 0xfd, 0x4f6: 0xfd, 0x4f7: 0xfd, + 0x4f8: 0xfd, 0x4f9: 0xfd, 0x4fa: 0xfd, 0x4fb: 0xfd, 0x4fc: 0xfd, 0x4fd: 0xfd, 0x4fe: 0xfd, 0x4ff: 0xfd, // Block 0x14, offset 0x500 - 0x500: 0xfb, 0x501: 0xfb, 0x502: 0xfb, 0x503: 0xfb, 0x504: 0xfb, 0x505: 0xfb, 0x506: 0xfb, 0x507: 0xfb, - 0x508: 0xfb, 0x509: 0xfb, 0x50a: 0xfb, 0x50b: 0xfb, 0x50c: 0xfb, 0x50d: 0xfb, 0x50e: 0xfb, 0x50f: 0xfb, - 0x510: 0xfb, 0x511: 0xfb, 0x512: 0xfb, 0x513: 0xfb, 0x514: 0xfb, 0x515: 0xfb, 0x516: 0xfb, 0x517: 0xfb, - 0x518: 0xfb, 0x519: 0xfb, 0x51a: 0xfb, 0x51b: 0xfb, 0x51c: 0xfb, 0x51d: 0xfb, 0x51e: 0xfb, 0x51f: 0xfb, + 0x500: 0xfd, 0x501: 0xfd, 0x502: 0xfd, 0x503: 0xfd, 0x504: 0xfd, 0x505: 0xfd, 0x506: 0xfd, 0x507: 0xfd, + 0x508: 0xfd, 0x509: 0xfd, 0x50a: 0xfd, 0x50b: 0xfd, 0x50c: 0xfd, 0x50d: 0xfd, 0x50e: 0xfd, 0x50f: 0xfd, + 0x510: 0xfd, 0x511: 0xfd, 0x512: 0xfd, 0x513: 0xfd, 0x514: 0xfd, 0x515: 0xfd, 0x516: 0xfd, 0x517: 0xfd, + 0x518: 0xfd, 0x519: 0xfd, 0x51a: 0xfd, 0x51b: 0xfd, 0x51c: 0xfd, 0x51d: 0xfd, 0x51e: 0xfd, 0x51f: 0xfd, 0x520: 0xa0, 0x521: 0xa0, 0x522: 0xa0, 0x523: 0xa0, 0x524: 0xa0, 0x525: 0xa0, 0x526: 0xa0, 0x527: 0xa0, - 0x528: 0x14d, 0x529: 0x15c, 0x52a: 0xfb, 0x52b: 0x15d, 0x52c: 0x15e, 0x52d: 0x15f, 0x52e: 0x160, 0x52f: 0xfb, - 0x530: 0xfb, 0x531: 0xfb, 0x532: 0xfb, 0x533: 0xfb, 0x534: 0xfb, 0x535: 0xfb, 0x536: 0xfb, 0x537: 0xfb, - 0x538: 0xfb, 0x539: 0x161, 0x53a: 0x162, 0x53b: 0xfb, 0x53c: 0xa0, 0x53d: 0x163, 0x53e: 0x164, 0x53f: 0x165, + 0x528: 0x14f, 0x529: 0x15e, 0x52a: 0xfd, 0x52b: 0x15f, 0x52c: 0x160, 0x52d: 0x161, 0x52e: 0x162, 0x52f: 0xfd, + 0x530: 0xfd, 0x531: 0xfd, 0x532: 0xfd, 0x533: 0xfd, 0x534: 0xfd, 0x535: 0xfd, 0x536: 0xfd, 0x537: 0xfd, + 0x538: 0xfd, 0x539: 0x163, 0x53a: 0x164, 0x53b: 0xfd, 0x53c: 0xa0, 0x53d: 0x165, 0x53e: 0x166, 0x53f: 0x167, // Block 0x15, offset 0x540 0x540: 0xa0, 0x541: 0xa0, 0x542: 0xa0, 0x543: 0xa0, 0x544: 0xa0, 0x545: 0xa0, 0x546: 0xa0, 0x547: 0xa0, 0x548: 0xa0, 0x549: 0xa0, 0x54a: 0xa0, 0x54b: 0xa0, 0x54c: 0xa0, 0x54d: 0xa0, 0x54e: 0xa0, 0x54f: 0xa0, 0x550: 0xa0, 0x551: 0xa0, 0x552: 0xa0, 0x553: 0xa0, 0x554: 0xa0, 0x555: 0xa0, 0x556: 0xa0, 0x557: 0xa0, - 0x558: 0xa0, 0x559: 0xa0, 0x55a: 0xa0, 0x55b: 0xa0, 0x55c: 0xa0, 0x55d: 0xa0, 0x55e: 0xa0, 0x55f: 0x166, + 0x558: 0xa0, 0x559: 0xa0, 0x55a: 0xa0, 0x55b: 0xa0, 0x55c: 0xa0, 0x55d: 0xa0, 0x55e: 0xa0, 0x55f: 0x168, 0x560: 0xa0, 0x561: 0xa0, 0x562: 0xa0, 0x563: 0xa0, 0x564: 0xa0, 0x565: 0xa0, 0x566: 0xa0, 0x567: 0xa0, 0x568: 0xa0, 0x569: 0xa0, 0x56a: 0xa0, 0x56b: 0xa0, 0x56c: 0xa0, 0x56d: 0xa0, 0x56e: 0xa0, 0x56f: 0xa0, - 0x570: 0xa0, 0x571: 0xa0, 0x572: 0xa0, 0x573: 0x167, 0x574: 0x168, 0x575: 0xfb, 0x576: 0xfb, 0x577: 0xfb, - 0x578: 0xfb, 0x579: 0xfb, 0x57a: 0xfb, 0x57b: 0xfb, 0x57c: 0xfb, 0x57d: 0xfb, 0x57e: 0xfb, 0x57f: 0xfb, + 0x570: 0xa0, 0x571: 0xa0, 0x572: 0xa0, 0x573: 0x169, 0x574: 0x16a, 0x575: 0xfd, 0x576: 0xfd, 0x577: 0xfd, + 0x578: 0xfd, 0x579: 0xfd, 0x57a: 0xfd, 0x57b: 0xfd, 0x57c: 0xfd, 0x57d: 0xfd, 0x57e: 0xfd, 0x57f: 0xfd, // Block 0x16, offset 0x580 - 0x580: 0xa0, 0x581: 0xa0, 0x582: 0xa0, 0x583: 0xa0, 0x584: 0x169, 0x585: 0x16a, 0x586: 0xa0, 0x587: 0xa0, - 0x588: 0xa0, 0x589: 0xa0, 0x58a: 0xa0, 0x58b: 0x16b, 0x58c: 0xfb, 0x58d: 0xfb, 0x58e: 0xfb, 0x58f: 0xfb, - 0x590: 0xfb, 0x591: 0xfb, 0x592: 0xfb, 0x593: 0xfb, 0x594: 0xfb, 0x595: 0xfb, 0x596: 0xfb, 0x597: 0xfb, - 0x598: 0xfb, 0x599: 0xfb, 0x59a: 0xfb, 0x59b: 0xfb, 0x59c: 0xfb, 0x59d: 0xfb, 0x59e: 0xfb, 0x59f: 0xfb, - 0x5a0: 0xfb, 0x5a1: 0xfb, 0x5a2: 0xfb, 0x5a3: 0xfb, 0x5a4: 0xfb, 0x5a5: 0xfb, 0x5a6: 0xfb, 0x5a7: 0xfb, - 0x5a8: 0xfb, 0x5a9: 0xfb, 0x5aa: 0xfb, 0x5ab: 0xfb, 0x5ac: 0xfb, 0x5ad: 0xfb, 0x5ae: 0xfb, 0x5af: 0xfb, - 0x5b0: 0xa0, 0x5b1: 0x16c, 0x5b2: 0x16d, 0x5b3: 0xfb, 0x5b4: 0xfb, 0x5b5: 0xfb, 0x5b6: 0xfb, 0x5b7: 0xfb, - 0x5b8: 0xfb, 0x5b9: 0xfb, 0x5ba: 0xfb, 0x5bb: 0xfb, 0x5bc: 0xfb, 0x5bd: 0xfb, 0x5be: 0xfb, 0x5bf: 0xfb, + 0x580: 0xa0, 0x581: 0xa0, 0x582: 0xa0, 0x583: 0xa0, 0x584: 0x16b, 0x585: 0x16c, 0x586: 0xa0, 0x587: 0xa0, + 0x588: 0xa0, 0x589: 0xa0, 0x58a: 0xa0, 0x58b: 0x16d, 0x58c: 0xfd, 0x58d: 0xfd, 0x58e: 0xfd, 0x58f: 0xfd, + 0x590: 0xfd, 0x591: 0xfd, 0x592: 0xfd, 0x593: 0xfd, 0x594: 0xfd, 0x595: 0xfd, 0x596: 0xfd, 0x597: 0xfd, + 0x598: 0xfd, 0x599: 0xfd, 0x59a: 0xfd, 0x59b: 0xfd, 0x59c: 0xfd, 0x59d: 0xfd, 0x59e: 0xfd, 0x59f: 0xfd, + 0x5a0: 0xfd, 0x5a1: 0xfd, 0x5a2: 0xfd, 0x5a3: 0xfd, 0x5a4: 0xfd, 0x5a5: 0xfd, 0x5a6: 0xfd, 0x5a7: 0xfd, + 0x5a8: 0xfd, 0x5a9: 0xfd, 0x5aa: 0xfd, 0x5ab: 0xfd, 0x5ac: 0xfd, 0x5ad: 0xfd, 0x5ae: 0xfd, 0x5af: 0xfd, + 0x5b0: 0xa0, 0x5b1: 0x16e, 0x5b2: 0x16f, 0x5b3: 0xfd, 0x5b4: 0xfd, 0x5b5: 0xfd, 0x5b6: 0xfd, 0x5b7: 0xfd, + 0x5b8: 0xfd, 0x5b9: 0xfd, 0x5ba: 0xfd, 0x5bb: 0xfd, 0x5bc: 0xfd, 0x5bd: 0xfd, 0x5be: 0xfd, 0x5bf: 0xfd, // Block 0x17, offset 0x5c0 - 0x5c0: 0x9c, 0x5c1: 0x9c, 0x5c2: 0x9c, 0x5c3: 0x16e, 0x5c4: 0x16f, 0x5c5: 0x170, 0x5c6: 0x171, 0x5c7: 0x172, - 0x5c8: 0x9c, 0x5c9: 0x173, 0x5ca: 0xfb, 0x5cb: 0x174, 0x5cc: 0x9c, 0x5cd: 0x175, 0x5ce: 0xfb, 0x5cf: 0xfb, - 0x5d0: 0x60, 0x5d1: 0x61, 0x5d2: 0x62, 0x5d3: 0x63, 0x5d4: 0x64, 0x5d5: 0x65, 0x5d6: 0x66, 0x5d7: 0x67, - 0x5d8: 0x68, 0x5d9: 0x69, 0x5da: 0x6a, 0x5db: 0x6b, 0x5dc: 0x6c, 0x5dd: 0x6d, 0x5de: 0x6e, 0x5df: 0x6f, + 0x5c0: 0x9c, 0x5c1: 0x9c, 0x5c2: 0x9c, 0x5c3: 0x170, 0x5c4: 0x171, 0x5c5: 0x172, 0x5c6: 0x173, 0x5c7: 0x174, + 0x5c8: 0x9c, 0x5c9: 0x175, 0x5ca: 0xfd, 0x5cb: 0x176, 0x5cc: 0x9c, 0x5cd: 0x177, 0x5ce: 0xfd, 0x5cf: 0xfd, + 0x5d0: 0x5e, 0x5d1: 0x5f, 0x5d2: 0x60, 0x5d3: 0x61, 0x5d4: 0x62, 0x5d5: 0x63, 0x5d6: 0x64, 0x5d7: 0x65, + 0x5d8: 0x66, 0x5d9: 0x67, 0x5da: 0x68, 0x5db: 0x69, 0x5dc: 0x6a, 0x5dd: 0x6b, 0x5de: 0x6c, 0x5df: 0x6d, 0x5e0: 0x9c, 0x5e1: 0x9c, 0x5e2: 0x9c, 0x5e3: 0x9c, 0x5e4: 0x9c, 0x5e5: 0x9c, 0x5e6: 0x9c, 0x5e7: 0x9c, - 0x5e8: 0x176, 0x5e9: 0x177, 0x5ea: 0x178, 0x5eb: 0xfb, 0x5ec: 0xfb, 0x5ed: 0xfb, 0x5ee: 0xfb, 0x5ef: 0xfb, - 0x5f0: 0xfb, 0x5f1: 0xfb, 0x5f2: 0xfb, 0x5f3: 0xfb, 0x5f4: 0xfb, 0x5f5: 0xfb, 0x5f6: 0xfb, 0x5f7: 0xfb, - 0x5f8: 0xfb, 0x5f9: 0xfb, 0x5fa: 0xfb, 0x5fb: 0xfb, 0x5fc: 0xfb, 0x5fd: 0xfb, 0x5fe: 0xfb, 0x5ff: 0xfb, + 0x5e8: 0x178, 0x5e9: 0x179, 0x5ea: 0x17a, 0x5eb: 0xfd, 0x5ec: 0xfd, 0x5ed: 0xfd, 0x5ee: 0xfd, 0x5ef: 0xfd, + 0x5f0: 0xfd, 0x5f1: 0xfd, 0x5f2: 0xfd, 0x5f3: 0xfd, 0x5f4: 0xfd, 0x5f5: 0xfd, 0x5f6: 0xfd, 0x5f7: 0xfd, + 0x5f8: 0xfd, 0x5f9: 0xfd, 0x5fa: 0xfd, 0x5fb: 0xfd, 0x5fc: 0xfd, 0x5fd: 0xfd, 0x5fe: 0xfd, 0x5ff: 0xfd, // Block 0x18, offset 0x600 - 0x600: 0x179, 0x601: 0xfb, 0x602: 0xfb, 0x603: 0xfb, 0x604: 0x17a, 0x605: 0x17b, 0x606: 0xfb, 0x607: 0xfb, - 0x608: 0xfb, 0x609: 0xfb, 0x60a: 0xfb, 0x60b: 0x17c, 0x60c: 0xfb, 0x60d: 0xfb, 0x60e: 0xfb, 0x60f: 0xfb, - 0x610: 0xfb, 0x611: 0xfb, 0x612: 0xfb, 0x613: 0xfb, 0x614: 0xfb, 0x615: 0xfb, 0x616: 0xfb, 0x617: 0xfb, - 0x618: 0xfb, 0x619: 0xfb, 0x61a: 0xfb, 0x61b: 0xfb, 0x61c: 0xfb, 0x61d: 0xfb, 0x61e: 0xfb, 0x61f: 0xfb, - 0x620: 0x123, 0x621: 0x123, 0x622: 0x123, 0x623: 0x17d, 0x624: 0x70, 0x625: 0x17e, 0x626: 0xfb, 0x627: 0xfb, - 0x628: 0xfb, 0x629: 0xfb, 0x62a: 0xfb, 0x62b: 0xfb, 0x62c: 0xfb, 0x62d: 0xfb, 0x62e: 0xfb, 0x62f: 0xfb, - 0x630: 0xfb, 0x631: 0x17f, 0x632: 0x180, 0x633: 0xfb, 0x634: 0x181, 0x635: 0xfb, 0x636: 0xfb, 0x637: 0xfb, - 0x638: 0x71, 0x639: 0x72, 0x63a: 0x73, 0x63b: 0x182, 0x63c: 0xfb, 0x63d: 0xfb, 0x63e: 0xfb, 0x63f: 0xfb, + 0x600: 0x17b, 0x601: 0xfd, 0x602: 0xfd, 0x603: 0xfd, 0x604: 0x17c, 0x605: 0x17d, 0x606: 0xfd, 0x607: 0xfd, + 0x608: 0xfd, 0x609: 0xfd, 0x60a: 0xfd, 0x60b: 0x17e, 0x60c: 0xfd, 0x60d: 0xfd, 0x60e: 0xfd, 0x60f: 0xfd, + 0x610: 0xfd, 0x611: 0xfd, 0x612: 0xfd, 0x613: 0xfd, 0x614: 0xfd, 0x615: 0xfd, 0x616: 0xfd, 0x617: 0xfd, + 0x618: 0xfd, 0x619: 0xfd, 0x61a: 0xfd, 0x61b: 0xfd, 0x61c: 0xfd, 0x61d: 0xfd, 0x61e: 0xfd, 0x61f: 0xfd, + 0x620: 0x125, 0x621: 0x125, 0x622: 0x125, 0x623: 0x17f, 0x624: 0x6e, 0x625: 0x180, 0x626: 0xfd, 0x627: 0xfd, + 0x628: 0xfd, 0x629: 0xfd, 0x62a: 0xfd, 0x62b: 0xfd, 0x62c: 0xfd, 0x62d: 0xfd, 0x62e: 0xfd, 0x62f: 0xfd, + 0x630: 0xfd, 0x631: 0x181, 0x632: 0x182, 0x633: 0xfd, 0x634: 0x183, 0x635: 0xfd, 0x636: 0xfd, 0x637: 0xfd, + 0x638: 0x6f, 0x639: 0x70, 0x63a: 0x71, 0x63b: 0x184, 0x63c: 0xfd, 0x63d: 0xfd, 0x63e: 0xfd, 0x63f: 0xfd, // Block 0x19, offset 0x640 - 0x640: 0x183, 0x641: 0x9c, 0x642: 0x184, 0x643: 0x185, 0x644: 0x74, 0x645: 0x75, 0x646: 0x186, 0x647: 0x187, - 0x648: 0x76, 0x649: 0x188, 0x64a: 0xfb, 0x64b: 0xfb, 0x64c: 0x9c, 0x64d: 0x9c, 0x64e: 0x9c, 0x64f: 0x9c, + 0x640: 0x185, 0x641: 0x9c, 0x642: 0x186, 0x643: 0x187, 0x644: 0x72, 0x645: 0x73, 0x646: 0x188, 0x647: 0x189, + 0x648: 0x74, 0x649: 0x18a, 0x64a: 0xfd, 0x64b: 0xfd, 0x64c: 0x9c, 0x64d: 0x9c, 0x64e: 0x9c, 0x64f: 0x9c, 0x650: 0x9c, 0x651: 0x9c, 0x652: 0x9c, 0x653: 0x9c, 0x654: 0x9c, 0x655: 0x9c, 0x656: 0x9c, 0x657: 0x9c, - 0x658: 0x9c, 0x659: 0x9c, 0x65a: 0x9c, 0x65b: 0x189, 0x65c: 0x9c, 0x65d: 0x18a, 0x65e: 0x9c, 0x65f: 0x18b, - 0x660: 0x18c, 0x661: 0x18d, 0x662: 0x18e, 0x663: 0xfb, 0x664: 0x9c, 0x665: 0x18f, 0x666: 0x9c, 0x667: 0x190, - 0x668: 0x9c, 0x669: 0x191, 0x66a: 0x192, 0x66b: 0x193, 0x66c: 0x9c, 0x66d: 0x9c, 0x66e: 0x194, 0x66f: 0x195, - 0x670: 0xfb, 0x671: 0xfb, 0x672: 0xfb, 0x673: 0xfb, 0x674: 0xfb, 0x675: 0xfb, 0x676: 0xfb, 0x677: 0xfb, - 0x678: 0xfb, 0x679: 0xfb, 0x67a: 0xfb, 0x67b: 0xfb, 0x67c: 0xfb, 0x67d: 0xfb, 0x67e: 0xfb, 0x67f: 0xfb, + 0x658: 0x9c, 0x659: 0x9c, 0x65a: 0x9c, 0x65b: 0x18b, 0x65c: 0x9c, 0x65d: 0x18c, 0x65e: 0x9c, 0x65f: 0x18d, + 0x660: 0x18e, 0x661: 0x18f, 0x662: 0x190, 0x663: 0xfd, 0x664: 0x9c, 0x665: 0x191, 0x666: 0x9c, 0x667: 0x192, + 0x668: 0x9c, 0x669: 0x193, 0x66a: 0x194, 0x66b: 0x195, 0x66c: 0x9c, 0x66d: 0x9c, 0x66e: 0x196, 0x66f: 0x197, + 0x670: 0xfd, 0x671: 0xfd, 0x672: 0xfd, 0x673: 0xfd, 0x674: 0xfd, 0x675: 0xfd, 0x676: 0xfd, 0x677: 0xfd, + 0x678: 0xfd, 0x679: 0xfd, 0x67a: 0xfd, 0x67b: 0xfd, 0x67c: 0xfd, 0x67d: 0xfd, 0x67e: 0xfd, 0x67f: 0xfd, // Block 0x1a, offset 0x680 0x680: 0xa0, 0x681: 0xa0, 0x682: 0xa0, 0x683: 0xa0, 0x684: 0xa0, 0x685: 0xa0, 0x686: 0xa0, 0x687: 0xa0, 0x688: 0xa0, 0x689: 0xa0, 0x68a: 0xa0, 0x68b: 0xa0, 0x68c: 0xa0, 0x68d: 0xa0, 0x68e: 0xa0, 0x68f: 0xa0, 0x690: 0xa0, 0x691: 0xa0, 0x692: 0xa0, 0x693: 0xa0, 0x694: 0xa0, 0x695: 0xa0, 0x696: 0xa0, 0x697: 0xa0, - 0x698: 0xa0, 0x699: 0xa0, 0x69a: 0xa0, 0x69b: 0x196, 0x69c: 0xa0, 0x69d: 0xa0, 0x69e: 0xa0, 0x69f: 0xa0, + 0x698: 0xa0, 0x699: 0xa0, 0x69a: 0xa0, 0x69b: 0x198, 0x69c: 0xa0, 0x69d: 0xa0, 0x69e: 0xa0, 0x69f: 0xa0, 0x6a0: 0xa0, 0x6a1: 0xa0, 0x6a2: 0xa0, 0x6a3: 0xa0, 0x6a4: 0xa0, 0x6a5: 0xa0, 0x6a6: 0xa0, 0x6a7: 0xa0, 0x6a8: 0xa0, 0x6a9: 0xa0, 0x6aa: 0xa0, 0x6ab: 0xa0, 0x6ac: 0xa0, 0x6ad: 0xa0, 0x6ae: 0xa0, 0x6af: 0xa0, 0x6b0: 0xa0, 0x6b1: 0xa0, 0x6b2: 0xa0, 0x6b3: 0xa0, 0x6b4: 0xa0, 0x6b5: 0xa0, 0x6b6: 0xa0, 0x6b7: 0xa0, @@ -2312,8 +2455,8 @@ var idnaIndex = [2368]uint16{ 0x6c0: 0xa0, 0x6c1: 0xa0, 0x6c2: 0xa0, 0x6c3: 0xa0, 0x6c4: 0xa0, 0x6c5: 0xa0, 0x6c6: 0xa0, 0x6c7: 0xa0, 0x6c8: 0xa0, 0x6c9: 0xa0, 0x6ca: 0xa0, 0x6cb: 0xa0, 0x6cc: 0xa0, 0x6cd: 0xa0, 0x6ce: 0xa0, 0x6cf: 0xa0, 0x6d0: 0xa0, 0x6d1: 0xa0, 0x6d2: 0xa0, 0x6d3: 0xa0, 0x6d4: 0xa0, 0x6d5: 0xa0, 0x6d6: 0xa0, 0x6d7: 0xa0, - 0x6d8: 0xa0, 0x6d9: 0xa0, 0x6da: 0xa0, 0x6db: 0xa0, 0x6dc: 0x197, 0x6dd: 0xa0, 0x6de: 0xa0, 0x6df: 0xa0, - 0x6e0: 0x198, 0x6e1: 0xa0, 0x6e2: 0xa0, 0x6e3: 0xa0, 0x6e4: 0xa0, 0x6e5: 0xa0, 0x6e6: 0xa0, 0x6e7: 0xa0, + 0x6d8: 0xa0, 0x6d9: 0xa0, 0x6da: 0xa0, 0x6db: 0xa0, 0x6dc: 0x199, 0x6dd: 0xa0, 0x6de: 0xa0, 0x6df: 0xa0, + 0x6e0: 0x19a, 0x6e1: 0xa0, 0x6e2: 0xa0, 0x6e3: 0xa0, 0x6e4: 0xa0, 0x6e5: 0xa0, 0x6e6: 0xa0, 0x6e7: 0xa0, 0x6e8: 0xa0, 0x6e9: 0xa0, 0x6ea: 0xa0, 0x6eb: 0xa0, 0x6ec: 0xa0, 0x6ed: 0xa0, 0x6ee: 0xa0, 0x6ef: 0xa0, 0x6f0: 0xa0, 0x6f1: 0xa0, 0x6f2: 0xa0, 0x6f3: 0xa0, 0x6f4: 0xa0, 0x6f5: 0xa0, 0x6f6: 0xa0, 0x6f7: 0xa0, 0x6f8: 0xa0, 0x6f9: 0xa0, 0x6fa: 0xa0, 0x6fb: 0xa0, 0x6fc: 0xa0, 0x6fd: 0xa0, 0x6fe: 0xa0, 0x6ff: 0xa0, @@ -2325,34 +2468,34 @@ var idnaIndex = [2368]uint16{ 0x720: 0xa0, 0x721: 0xa0, 0x722: 0xa0, 0x723: 0xa0, 0x724: 0xa0, 0x725: 0xa0, 0x726: 0xa0, 0x727: 0xa0, 0x728: 0xa0, 0x729: 0xa0, 0x72a: 0xa0, 0x72b: 0xa0, 0x72c: 0xa0, 0x72d: 0xa0, 0x72e: 0xa0, 0x72f: 0xa0, 0x730: 0xa0, 0x731: 0xa0, 0x732: 0xa0, 0x733: 0xa0, 0x734: 0xa0, 0x735: 0xa0, 0x736: 0xa0, 0x737: 0xa0, - 0x738: 0xa0, 0x739: 0xa0, 0x73a: 0x199, 0x73b: 0xa0, 0x73c: 0xa0, 0x73d: 0xa0, 0x73e: 0xa0, 0x73f: 0xa0, + 0x738: 0xa0, 0x739: 0xa0, 0x73a: 0x19b, 0x73b: 0xa0, 0x73c: 0xa0, 0x73d: 0xa0, 0x73e: 0xa0, 0x73f: 0xa0, // Block 0x1d, offset 0x740 0x740: 0xa0, 0x741: 0xa0, 0x742: 0xa0, 0x743: 0xa0, 0x744: 0xa0, 0x745: 0xa0, 0x746: 0xa0, 0x747: 0xa0, 0x748: 0xa0, 0x749: 0xa0, 0x74a: 0xa0, 0x74b: 0xa0, 0x74c: 0xa0, 0x74d: 0xa0, 0x74e: 0xa0, 0x74f: 0xa0, 0x750: 0xa0, 0x751: 0xa0, 0x752: 0xa0, 0x753: 0xa0, 0x754: 0xa0, 0x755: 0xa0, 0x756: 0xa0, 0x757: 0xa0, 0x758: 0xa0, 0x759: 0xa0, 0x75a: 0xa0, 0x75b: 0xa0, 0x75c: 0xa0, 0x75d: 0xa0, 0x75e: 0xa0, 0x75f: 0xa0, 0x760: 0xa0, 0x761: 0xa0, 0x762: 0xa0, 0x763: 0xa0, 0x764: 0xa0, 0x765: 0xa0, 0x766: 0xa0, 0x767: 0xa0, - 0x768: 0xa0, 0x769: 0xa0, 0x76a: 0xa0, 0x76b: 0xa0, 0x76c: 0xa0, 0x76d: 0xa0, 0x76e: 0xa0, 0x76f: 0x19a, - 0x770: 0xfb, 0x771: 0xfb, 0x772: 0xfb, 0x773: 0xfb, 0x774: 0xfb, 0x775: 0xfb, 0x776: 0xfb, 0x777: 0xfb, - 0x778: 0xfb, 0x779: 0xfb, 0x77a: 0xfb, 0x77b: 0xfb, 0x77c: 0xfb, 0x77d: 0xfb, 0x77e: 0xfb, 0x77f: 0xfb, + 0x768: 0xa0, 0x769: 0xa0, 0x76a: 0xa0, 0x76b: 0xa0, 0x76c: 0xa0, 0x76d: 0xa0, 0x76e: 0xa0, 0x76f: 0x19c, + 0x770: 0xfd, 0x771: 0xfd, 0x772: 0xfd, 0x773: 0xfd, 0x774: 0xfd, 0x775: 0xfd, 0x776: 0xfd, 0x777: 0xfd, + 0x778: 0xfd, 0x779: 0xfd, 0x77a: 0xfd, 0x77b: 0xfd, 0x77c: 0xfd, 0x77d: 0xfd, 0x77e: 0xfd, 0x77f: 0xfd, // Block 0x1e, offset 0x780 - 0x780: 0xfb, 0x781: 0xfb, 0x782: 0xfb, 0x783: 0xfb, 0x784: 0xfb, 0x785: 0xfb, 0x786: 0xfb, 0x787: 0xfb, - 0x788: 0xfb, 0x789: 0xfb, 0x78a: 0xfb, 0x78b: 0xfb, 0x78c: 0xfb, 0x78d: 0xfb, 0x78e: 0xfb, 0x78f: 0xfb, - 0x790: 0xfb, 0x791: 0xfb, 0x792: 0xfb, 0x793: 0xfb, 0x794: 0xfb, 0x795: 0xfb, 0x796: 0xfb, 0x797: 0xfb, - 0x798: 0xfb, 0x799: 0xfb, 0x79a: 0xfb, 0x79b: 0xfb, 0x79c: 0xfb, 0x79d: 0xfb, 0x79e: 0xfb, 0x79f: 0xfb, - 0x7a0: 0x77, 0x7a1: 0x78, 0x7a2: 0x79, 0x7a3: 0x19b, 0x7a4: 0x7a, 0x7a5: 0x7b, 0x7a6: 0x19c, 0x7a7: 0x7c, - 0x7a8: 0x7d, 0x7a9: 0xfb, 0x7aa: 0xfb, 0x7ab: 0xfb, 0x7ac: 0xfb, 0x7ad: 0xfb, 0x7ae: 0xfb, 0x7af: 0xfb, - 0x7b0: 0xfb, 0x7b1: 0xfb, 0x7b2: 0xfb, 0x7b3: 0xfb, 0x7b4: 0xfb, 0x7b5: 0xfb, 0x7b6: 0xfb, 0x7b7: 0xfb, - 0x7b8: 0xfb, 0x7b9: 0xfb, 0x7ba: 0xfb, 0x7bb: 0xfb, 0x7bc: 0xfb, 0x7bd: 0xfb, 0x7be: 0xfb, 0x7bf: 0xfb, + 0x780: 0xfd, 0x781: 0xfd, 0x782: 0xfd, 0x783: 0xfd, 0x784: 0xfd, 0x785: 0xfd, 0x786: 0xfd, 0x787: 0xfd, + 0x788: 0xfd, 0x789: 0xfd, 0x78a: 0xfd, 0x78b: 0xfd, 0x78c: 0xfd, 0x78d: 0xfd, 0x78e: 0xfd, 0x78f: 0xfd, + 0x790: 0xfd, 0x791: 0xfd, 0x792: 0xfd, 0x793: 0xfd, 0x794: 0xfd, 0x795: 0xfd, 0x796: 0xfd, 0x797: 0xfd, + 0x798: 0xfd, 0x799: 0xfd, 0x79a: 0xfd, 0x79b: 0xfd, 0x79c: 0xfd, 0x79d: 0xfd, 0x79e: 0xfd, 0x79f: 0xfd, + 0x7a0: 0x75, 0x7a1: 0x76, 0x7a2: 0x77, 0x7a3: 0x78, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x7b, 0x7a7: 0x7c, + 0x7a8: 0x7d, 0x7a9: 0xfd, 0x7aa: 0xfd, 0x7ab: 0xfd, 0x7ac: 0xfd, 0x7ad: 0xfd, 0x7ae: 0xfd, 0x7af: 0xfd, + 0x7b0: 0xfd, 0x7b1: 0xfd, 0x7b2: 0xfd, 0x7b3: 0xfd, 0x7b4: 0xfd, 0x7b5: 0xfd, 0x7b6: 0xfd, 0x7b7: 0xfd, + 0x7b8: 0xfd, 0x7b9: 0xfd, 0x7ba: 0xfd, 0x7bb: 0xfd, 0x7bc: 0xfd, 0x7bd: 0xfd, 0x7be: 0xfd, 0x7bf: 0xfd, // Block 0x1f, offset 0x7c0 0x7c0: 0xa0, 0x7c1: 0xa0, 0x7c2: 0xa0, 0x7c3: 0xa0, 0x7c4: 0xa0, 0x7c5: 0xa0, 0x7c6: 0xa0, 0x7c7: 0xa0, - 0x7c8: 0xa0, 0x7c9: 0xa0, 0x7ca: 0xa0, 0x7cb: 0xa0, 0x7cc: 0xa0, 0x7cd: 0x19d, 0x7ce: 0xfb, 0x7cf: 0xfb, - 0x7d0: 0xfb, 0x7d1: 0xfb, 0x7d2: 0xfb, 0x7d3: 0xfb, 0x7d4: 0xfb, 0x7d5: 0xfb, 0x7d6: 0xfb, 0x7d7: 0xfb, - 0x7d8: 0xfb, 0x7d9: 0xfb, 0x7da: 0xfb, 0x7db: 0xfb, 0x7dc: 0xfb, 0x7dd: 0xfb, 0x7de: 0xfb, 0x7df: 0xfb, - 0x7e0: 0xfb, 0x7e1: 0xfb, 0x7e2: 0xfb, 0x7e3: 0xfb, 0x7e4: 0xfb, 0x7e5: 0xfb, 0x7e6: 0xfb, 0x7e7: 0xfb, - 0x7e8: 0xfb, 0x7e9: 0xfb, 0x7ea: 0xfb, 0x7eb: 0xfb, 0x7ec: 0xfb, 0x7ed: 0xfb, 0x7ee: 0xfb, 0x7ef: 0xfb, - 0x7f0: 0xfb, 0x7f1: 0xfb, 0x7f2: 0xfb, 0x7f3: 0xfb, 0x7f4: 0xfb, 0x7f5: 0xfb, 0x7f6: 0xfb, 0x7f7: 0xfb, - 0x7f8: 0xfb, 0x7f9: 0xfb, 0x7fa: 0xfb, 0x7fb: 0xfb, 0x7fc: 0xfb, 0x7fd: 0xfb, 0x7fe: 0xfb, 0x7ff: 0xfb, + 0x7c8: 0xa0, 0x7c9: 0xa0, 0x7ca: 0xa0, 0x7cb: 0xa0, 0x7cc: 0xa0, 0x7cd: 0x19d, 0x7ce: 0xfd, 0x7cf: 0xfd, + 0x7d0: 0xfd, 0x7d1: 0xfd, 0x7d2: 0xfd, 0x7d3: 0xfd, 0x7d4: 0xfd, 0x7d5: 0xfd, 0x7d6: 0xfd, 0x7d7: 0xfd, + 0x7d8: 0xfd, 0x7d9: 0xfd, 0x7da: 0xfd, 0x7db: 0xfd, 0x7dc: 0xfd, 0x7dd: 0xfd, 0x7de: 0xfd, 0x7df: 0xfd, + 0x7e0: 0xfd, 0x7e1: 0xfd, 0x7e2: 0xfd, 0x7e3: 0xfd, 0x7e4: 0xfd, 0x7e5: 0xfd, 0x7e6: 0xfd, 0x7e7: 0xfd, + 0x7e8: 0xfd, 0x7e9: 0xfd, 0x7ea: 0xfd, 0x7eb: 0xfd, 0x7ec: 0xfd, 0x7ed: 0xfd, 0x7ee: 0xfd, 0x7ef: 0xfd, + 0x7f0: 0xfd, 0x7f1: 0xfd, 0x7f2: 0xfd, 0x7f3: 0xfd, 0x7f4: 0xfd, 0x7f5: 0xfd, 0x7f6: 0xfd, 0x7f7: 0xfd, + 0x7f8: 0xfd, 0x7f9: 0xfd, 0x7fa: 0xfd, 0x7fb: 0xfd, 0x7fc: 0xfd, 0x7fd: 0xfd, 0x7fe: 0xfd, 0x7ff: 0xfd, // Block 0x20, offset 0x800 0x810: 0x0d, 0x811: 0x0e, 0x812: 0x0f, 0x813: 0x10, 0x814: 0x11, 0x815: 0x0b, 0x816: 0x12, 0x817: 0x07, 0x818: 0x13, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x14, 0x81c: 0x0b, 0x81d: 0x15, 0x81e: 0x16, 0x81f: 0x17, @@ -2370,14 +2513,14 @@ var idnaIndex = [2368]uint16{ 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: 0x19e, 0x881: 0x19f, 0x882: 0xfb, 0x883: 0xfb, 0x884: 0x1a0, 0x885: 0x1a0, 0x886: 0x1a0, 0x887: 0x1a1, - 0x888: 0xfb, 0x889: 0xfb, 0x88a: 0xfb, 0x88b: 0xfb, 0x88c: 0xfb, 0x88d: 0xfb, 0x88e: 0xfb, 0x88f: 0xfb, - 0x890: 0xfb, 0x891: 0xfb, 0x892: 0xfb, 0x893: 0xfb, 0x894: 0xfb, 0x895: 0xfb, 0x896: 0xfb, 0x897: 0xfb, - 0x898: 0xfb, 0x899: 0xfb, 0x89a: 0xfb, 0x89b: 0xfb, 0x89c: 0xfb, 0x89d: 0xfb, 0x89e: 0xfb, 0x89f: 0xfb, - 0x8a0: 0xfb, 0x8a1: 0xfb, 0x8a2: 0xfb, 0x8a3: 0xfb, 0x8a4: 0xfb, 0x8a5: 0xfb, 0x8a6: 0xfb, 0x8a7: 0xfb, - 0x8a8: 0xfb, 0x8a9: 0xfb, 0x8aa: 0xfb, 0x8ab: 0xfb, 0x8ac: 0xfb, 0x8ad: 0xfb, 0x8ae: 0xfb, 0x8af: 0xfb, - 0x8b0: 0xfb, 0x8b1: 0xfb, 0x8b2: 0xfb, 0x8b3: 0xfb, 0x8b4: 0xfb, 0x8b5: 0xfb, 0x8b6: 0xfb, 0x8b7: 0xfb, - 0x8b8: 0xfb, 0x8b9: 0xfb, 0x8ba: 0xfb, 0x8bb: 0xfb, 0x8bc: 0xfb, 0x8bd: 0xfb, 0x8be: 0xfb, 0x8bf: 0xfb, + 0x880: 0x19e, 0x881: 0x19f, 0x882: 0xfd, 0x883: 0xfd, 0x884: 0x1a0, 0x885: 0x1a0, 0x886: 0x1a0, 0x887: 0x1a1, + 0x888: 0xfd, 0x889: 0xfd, 0x88a: 0xfd, 0x88b: 0xfd, 0x88c: 0xfd, 0x88d: 0xfd, 0x88e: 0xfd, 0x88f: 0xfd, + 0x890: 0xfd, 0x891: 0xfd, 0x892: 0xfd, 0x893: 0xfd, 0x894: 0xfd, 0x895: 0xfd, 0x896: 0xfd, 0x897: 0xfd, + 0x898: 0xfd, 0x899: 0xfd, 0x89a: 0xfd, 0x89b: 0xfd, 0x89c: 0xfd, 0x89d: 0xfd, 0x89e: 0xfd, 0x89f: 0xfd, + 0x8a0: 0xfd, 0x8a1: 0xfd, 0x8a2: 0xfd, 0x8a3: 0xfd, 0x8a4: 0xfd, 0x8a5: 0xfd, 0x8a6: 0xfd, 0x8a7: 0xfd, + 0x8a8: 0xfd, 0x8a9: 0xfd, 0x8aa: 0xfd, 0x8ab: 0xfd, 0x8ac: 0xfd, 0x8ad: 0xfd, 0x8ae: 0xfd, 0x8af: 0xfd, + 0x8b0: 0xfd, 0x8b1: 0xfd, 0x8b2: 0xfd, 0x8b3: 0xfd, 0x8b4: 0xfd, 0x8b5: 0xfd, 0x8b6: 0xfd, 0x8b7: 0xfd, + 0x8b8: 0xfd, 0x8b9: 0xfd, 0x8ba: 0xfd, 0x8bb: 0xfd, 0x8bc: 0xfd, 0x8bd: 0xfd, 0x8be: 0xfd, 0x8bf: 0xfd, // Block 0x23, offset 0x8c0 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b, 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b, @@ -2393,10 +2536,10 @@ var idnaIndex = [2368]uint16{ } // idnaSparseOffset: 292 entries, 584 bytes -var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x85, 0x8b, 0x94, 0xa4, 0xb2, 0xbd, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x225, 0x22f, 0x23b, 0x247, 0x253, 0x25b, 0x260, 0x26d, 0x27e, 0x282, 0x28d, 0x291, 0x29a, 0x2a2, 0x2a8, 0x2ad, 0x2b0, 0x2b4, 0x2ba, 0x2be, 0x2c2, 0x2c6, 0x2cc, 0x2d4, 0x2db, 0x2e6, 0x2f0, 0x2f4, 0x2f7, 0x2fd, 0x301, 0x303, 0x306, 0x308, 0x30b, 0x315, 0x318, 0x327, 0x32b, 0x330, 0x333, 0x337, 0x33c, 0x341, 0x347, 0x358, 0x368, 0x36e, 0x372, 0x381, 0x386, 0x38e, 0x398, 0x3a3, 0x3ab, 0x3bc, 0x3c5, 0x3d5, 0x3e2, 0x3ee, 0x3f3, 0x400, 0x404, 0x409, 0x40b, 0x40d, 0x411, 0x413, 0x417, 0x420, 0x426, 0x42a, 0x43a, 0x444, 0x449, 0x44c, 0x452, 0x459, 0x45e, 0x462, 0x468, 0x46d, 0x476, 0x47b, 0x481, 0x488, 0x48f, 0x496, 0x49a, 0x49f, 0x4a2, 0x4a7, 0x4b3, 0x4b9, 0x4be, 0x4c5, 0x4cd, 0x4d2, 0x4d6, 0x4e6, 0x4ed, 0x4f1, 0x4f5, 0x4fc, 0x4fe, 0x501, 0x504, 0x508, 0x511, 0x515, 0x51d, 0x525, 0x52d, 0x539, 0x545, 0x54b, 0x554, 0x560, 0x567, 0x570, 0x57b, 0x582, 0x591, 0x59e, 0x5ab, 0x5b4, 0x5b8, 0x5c7, 0x5cf, 0x5da, 0x5e3, 0x5e9, 0x5f1, 0x5fa, 0x605, 0x608, 0x614, 0x61d, 0x620, 0x625, 0x62e, 0x633, 0x640, 0x64b, 0x654, 0x65e, 0x661, 0x66b, 0x674, 0x680, 0x68d, 0x69a, 0x6a8, 0x6af, 0x6b3, 0x6b7, 0x6ba, 0x6bf, 0x6c2, 0x6c7, 0x6ca, 0x6d1, 0x6d8, 0x6dc, 0x6e7, 0x6ea, 0x6ed, 0x6f0, 0x6f6, 0x6fc, 0x705, 0x708, 0x70b, 0x70e, 0x711, 0x718, 0x71b, 0x720, 0x72a, 0x72d, 0x731, 0x740, 0x74c, 0x750, 0x755, 0x759, 0x75e, 0x762, 0x767, 0x770, 0x77b, 0x781, 0x787, 0x78d, 0x793, 0x79c, 0x79f, 0x7a2, 0x7a6, 0x7aa, 0x7ae, 0x7b4, 0x7ba, 0x7bf, 0x7c2, 0x7d2, 0x7d9, 0x7dc, 0x7e1, 0x7e5, 0x7eb, 0x7f2, 0x7f6, 0x7fa, 0x803, 0x80a, 0x80f, 0x813, 0x821, 0x824, 0x827, 0x82b, 0x82f, 0x832, 0x842, 0x853, 0x856, 0x85b, 0x85d, 0x85f} +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x85, 0x8b, 0x94, 0xa4, 0xb2, 0xbd, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x225, 0x22f, 0x23b, 0x247, 0x253, 0x25b, 0x260, 0x26d, 0x27e, 0x282, 0x28d, 0x291, 0x29a, 0x2a2, 0x2a8, 0x2ad, 0x2b0, 0x2b4, 0x2ba, 0x2be, 0x2c2, 0x2c6, 0x2cc, 0x2d4, 0x2db, 0x2e6, 0x2f0, 0x2f4, 0x2f7, 0x2fd, 0x301, 0x303, 0x306, 0x308, 0x30b, 0x315, 0x318, 0x327, 0x32b, 0x32f, 0x331, 0x33a, 0x33d, 0x341, 0x346, 0x34b, 0x351, 0x362, 0x372, 0x378, 0x37c, 0x38b, 0x390, 0x398, 0x3a2, 0x3ad, 0x3b5, 0x3c6, 0x3cf, 0x3df, 0x3ec, 0x3f8, 0x3fd, 0x40a, 0x40e, 0x413, 0x415, 0x417, 0x41b, 0x41d, 0x421, 0x42a, 0x430, 0x434, 0x444, 0x44e, 0x453, 0x456, 0x45c, 0x463, 0x468, 0x46c, 0x472, 0x477, 0x480, 0x485, 0x48b, 0x492, 0x499, 0x4a0, 0x4a4, 0x4a9, 0x4ac, 0x4b1, 0x4bd, 0x4c3, 0x4c8, 0x4cf, 0x4d7, 0x4dc, 0x4e0, 0x4f0, 0x4f7, 0x4fb, 0x4ff, 0x506, 0x508, 0x50b, 0x50e, 0x512, 0x51b, 0x51f, 0x527, 0x52f, 0x537, 0x543, 0x54f, 0x555, 0x55e, 0x56a, 0x571, 0x57a, 0x585, 0x58c, 0x59b, 0x5a8, 0x5b5, 0x5be, 0x5c2, 0x5d1, 0x5d9, 0x5e4, 0x5ed, 0x5f3, 0x5fb, 0x604, 0x60f, 0x612, 0x61e, 0x627, 0x62a, 0x62f, 0x638, 0x63d, 0x64a, 0x655, 0x65e, 0x668, 0x66b, 0x675, 0x67e, 0x68a, 0x697, 0x6a4, 0x6b2, 0x6b9, 0x6bd, 0x6c1, 0x6c4, 0x6c9, 0x6cc, 0x6d1, 0x6d4, 0x6db, 0x6e2, 0x6e6, 0x6f1, 0x6f4, 0x6f7, 0x6fa, 0x700, 0x706, 0x70f, 0x712, 0x715, 0x718, 0x71b, 0x722, 0x725, 0x72a, 0x734, 0x737, 0x73b, 0x74a, 0x756, 0x75a, 0x75f, 0x763, 0x768, 0x76c, 0x771, 0x77a, 0x785, 0x78b, 0x791, 0x797, 0x79d, 0x7a6, 0x7a9, 0x7ac, 0x7b0, 0x7b4, 0x7b8, 0x7be, 0x7c4, 0x7c9, 0x7cc, 0x7dc, 0x7e3, 0x7e6, 0x7eb, 0x7ef, 0x7f5, 0x7fc, 0x800, 0x804, 0x80d, 0x814, 0x819, 0x81d, 0x82b, 0x82e, 0x831, 0x835, 0x839, 0x83c, 0x83f, 0x844, 0x846, 0x848} -// idnaSparseValues: 2146 entries, 8584 bytes -var idnaSparseValues = [2146]valueRange{ +// idnaSparseValues: 2123 entries, 8492 bytes +var idnaSparseValues = [2123]valueRange{ // Block 0x0, offset 0x0 {value: 0x0000, lo: 0x07}, {value: 0xe105, lo: 0x80, hi: 0x96}, @@ -2427,15 +2570,15 @@ var idnaSparseValues = [2146]valueRange{ // Block 0x2, offset 0x19 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x00a9, lo: 0xb0, hi: 0xb0}, {value: 0x037d, lo: 0xb1, hi: 0xb1}, - {value: 0x0259, lo: 0xb2, hi: 0xb2}, - {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x00b1, lo: 0xb2, hi: 0xb2}, + {value: 0x00b9, 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: 0x00c1, lo: 0xb7, hi: 0xb7}, + {value: 0x00c9, lo: 0xb8, hi: 0xb8}, {value: 0x0008, lo: 0xb9, hi: 0xbf}, // Block 0x3, offset 0x25 {value: 0x0000, lo: 0x01}, @@ -2457,7 +2600,7 @@ var idnaSparseValues = [2146]valueRange{ // Block 0x6, offset 0x33 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0131, lo: 0x87, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x88}, {value: 0x0018, lo: 0x89, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8c}, @@ -2643,7 +2786,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x81, hi: 0xb0}, {value: 0x3308, lo: 0xb1, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xb2}, - {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x01f1, lo: 0xb3, hi: 0xb3}, {value: 0x3308, lo: 0xb4, hi: 0xb9}, {value: 0x3b08, lo: 0xba, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbe}, @@ -2666,8 +2809,8 @@ var idnaSparseValues = [2146]valueRange{ {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: 0x0201, lo: 0x9c, hi: 0x9c}, + {value: 0x0209, lo: 0x9d, hi: 0x9d}, {value: 0x0008, lo: 0x9e, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, // Block 0x18, offset 0xf9 @@ -3075,13 +3218,13 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xbe, hi: 0xbf}, // Block 0x44, offset 0x260 {value: 0x0000, lo: 0x0c}, - {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: 0x02a9, lo: 0x80, hi: 0x80}, + {value: 0x02b1, lo: 0x81, hi: 0x81}, + {value: 0x02b9, lo: 0x82, hi: 0x82}, + {value: 0x02c1, lo: 0x83, hi: 0x83}, + {value: 0x02c9, lo: 0x84, hi: 0x85}, + {value: 0x02d1, lo: 0x86, hi: 0x86}, + {value: 0x02d9, lo: 0x87, hi: 0x87}, {value: 0x057d, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, {value: 0x059d, lo: 0x90, hi: 0xba}, @@ -3133,18 +3276,18 @@ var idnaSparseValues = [2146]valueRange{ {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: 0x0851, 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 0x29a {value: 0x0000, lo: 0x07}, {value: 0x0018, lo: 0x80, hi: 0xab}, - {value: 0x24f1, lo: 0xac, hi: 0xac}, - {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0859, lo: 0xac, hi: 0xac}, + {value: 0x0861, lo: 0xad, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xae}, - {value: 0x2579, lo: 0xaf, hi: 0xaf}, - {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0869, lo: 0xaf, hi: 0xaf}, + {value: 0x0871, lo: 0xb0, hi: 0xb0}, {value: 0x0018, lo: 0xb1, hi: 0xbf}, // Block 0x4b, offset 0x2a2 {value: 0x0000, lo: 0x05}, @@ -3166,19 +3309,19 @@ var idnaSparseValues = [2146]valueRange{ // Block 0x4e, offset 0x2b0 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0929, lo: 0x8c, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0xbf}, // Block 0x4f, offset 0x2b4 {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0xb3}, {value: 0x0e7e, lo: 0xb4, hi: 0xb4}, - {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0932, lo: 0xb5, hi: 0xb5}, {value: 0x0e9e, lo: 0xb6, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, // Block 0x50, offset 0x2ba {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x9b}, - {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0939, lo: 0x9c, hi: 0x9c}, {value: 0x0018, lo: 0x9d, hi: 0xbf}, // Block 0x51, offset 0x2be {value: 0x0000, lo: 0x03}, @@ -3277,16 +3420,16 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x98}, {value: 0x3308, lo: 0x99, hi: 0x9a}, - {value: 0x29e2, lo: 0x9b, hi: 0x9b}, - {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x096a, lo: 0x9b, hi: 0x9b}, + {value: 0x0972, lo: 0x9c, hi: 0x9c}, {value: 0x0008, lo: 0x9d, hi: 0x9e}, - {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0979, lo: 0x9f, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa0}, {value: 0x0008, lo: 0xa1, hi: 0xbf}, // Block 0x61, offset 0x315 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbe}, - {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + {value: 0x0981, lo: 0xbf, hi: 0xbf}, // Block 0x62, offset 0x318 {value: 0x0000, lo: 0x0e}, {value: 0x0040, lo: 0x80, hi: 0x84}, @@ -3309,46 +3452,58 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa4, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x64, offset 0x32b - {value: 0x0030, lo: 0x04}, - {value: 0x2aa2, lo: 0x80, hi: 0x9d}, - {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x03}, + {value: 0x098a, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x30a2, lo: 0xa0, hi: 0xbf}, - // Block 0x65, offset 0x330 + {value: 0x0a82, lo: 0xa0, hi: 0xbf}, + // Block 0x65, offset 0x32f + {value: 0x0008, lo: 0x01}, + {value: 0x0d19, lo: 0x80, hi: 0xbf}, + // Block 0x66, offset 0x331 + {value: 0x0008, lo: 0x08}, + {value: 0x0f19, lo: 0x80, hi: 0xb0}, + {value: 0x4045, lo: 0xb1, hi: 0xb1}, + {value: 0x10a1, lo: 0xb2, hi: 0xb3}, + {value: 0x4065, lo: 0xb4, hi: 0xb4}, + {value: 0x10b1, lo: 0xb5, hi: 0xb7}, + {value: 0x4085, lo: 0xb8, hi: 0xb8}, + {value: 0x4085, lo: 0xb9, hi: 0xb9}, + {value: 0x10c9, lo: 0xba, hi: 0xbf}, + // Block 0x67, offset 0x33a {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x66, offset 0x333 + // Block 0x68, offset 0x33d {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x67, offset 0x337 + // Block 0x69, offset 0x341 {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 0x68, offset 0x33c + // Block 0x6a, offset 0x346 {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 0x69, offset 0x341 + // Block 0x6b, offset 0x34b {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x0018, lo: 0xa6, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb1}, {value: 0x0018, lo: 0xb2, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x6a, offset 0x347 + // Block 0x6c, offset 0x351 {value: 0x0000, lo: 0x10}, {value: 0x0040, lo: 0x80, hi: 0x81}, {value: 0xe00d, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0x83}, {value: 0x03f5, lo: 0x84, hi: 0x84}, - {value: 0x1329, lo: 0x85, hi: 0x85}, + {value: 0x0479, lo: 0x85, hi: 0x85}, {value: 0x447d, lo: 0x86, hi: 0x86}, {value: 0xe07d, lo: 0x87, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x88}, @@ -3357,10 +3512,10 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x8b, hi: 0xb4}, {value: 0xe01d, lo: 0xb5, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xb7}, - {value: 0x2009, lo: 0xb8, hi: 0xb8}, - {value: 0x6ec1, lo: 0xb9, hi: 0xb9}, + {value: 0x0741, lo: 0xb8, hi: 0xb8}, + {value: 0x13f1, lo: 0xb9, hi: 0xb9}, {value: 0x0008, lo: 0xba, hi: 0xbf}, - // Block 0x6b, offset 0x358 + // Block 0x6d, offset 0x362 {value: 0x0000, lo: 0x0f}, {value: 0x0008, lo: 0x80, hi: 0x81}, {value: 0x3308, lo: 0x82, hi: 0x82}, @@ -3377,19 +3532,19 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x6c, offset 0x368 + // Block 0x6e, offset 0x372 {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 0x6d, offset 0x36e + // Block 0x6f, offset 0x378 {value: 0x0000, lo: 0x03}, {value: 0x3008, lo: 0x80, hi: 0x81}, {value: 0x0008, lo: 0x82, hi: 0xb3}, {value: 0x3008, lo: 0xb4, hi: 0xbf}, - // Block 0x6e, offset 0x372 + // Block 0x70, offset 0x37c {value: 0x0000, lo: 0x0e}, {value: 0x3008, lo: 0x80, hi: 0x83}, {value: 0x3b08, lo: 0x84, hi: 0x84}, @@ -3405,13 +3560,13 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xbc, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, - // Block 0x6f, offset 0x381 + // Block 0x71, offset 0x38b {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x70, offset 0x386 + // Block 0x72, offset 0x390 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x3308, lo: 0x87, hi: 0x91}, @@ -3420,7 +3575,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x94, hi: 0x9e}, {value: 0x0018, lo: 0x9f, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x71, offset 0x38e + // Block 0x73, offset 0x398 {value: 0x0000, lo: 0x09}, {value: 0x3308, lo: 0x80, hi: 0x82}, {value: 0x3008, lo: 0x83, hi: 0x83}, @@ -3431,7 +3586,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xba, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbf}, - // Block 0x72, offset 0x398 + // Block 0x74, offset 0x3a2 {value: 0x0000, lo: 0x0a}, {value: 0x3808, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x8d}, @@ -3443,7 +3598,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xa5, hi: 0xa5}, {value: 0x0008, lo: 0xa6, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x73, offset 0x3a3 + // Block 0x75, offset 0x3ad {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xa8}, {value: 0x3308, lo: 0xa9, hi: 0xae}, @@ -3452,7 +3607,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb3, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x74, offset 0x3ab + // Block 0x76, offset 0x3b5 {value: 0x0000, lo: 0x10}, {value: 0x0008, lo: 0x80, hi: 0x82}, {value: 0x3308, lo: 0x83, hi: 0x83}, @@ -3470,7 +3625,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbc, hi: 0xbc}, {value: 0x3008, lo: 0xbd, hi: 0xbd}, {value: 0x0008, lo: 0xbe, hi: 0xbf}, - // Block 0x75, offset 0x3bc + // Block 0x77, offset 0x3c6 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb0}, @@ -3480,7 +3635,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb7, hi: 0xb8}, {value: 0x0008, lo: 0xb9, hi: 0xbd}, {value: 0x3308, lo: 0xbe, hi: 0xbf}, - // Block 0x76, offset 0x3c5 + // Block 0x78, offset 0x3cf {value: 0x0000, lo: 0x0f}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x81}, @@ -3497,7 +3652,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb5, hi: 0xb5}, {value: 0x3b08, lo: 0xb6, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x77, offset 0x3d5 + // Block 0x79, offset 0x3df {value: 0x0000, lo: 0x0c}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x86}, @@ -3511,26 +3666,26 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa8, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x78, offset 0x3e2 + // Block 0x7a, offset 0x3ec {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0x9b}, {value: 0x449d, lo: 0x9c, hi: 0x9c}, {value: 0x44b5, lo: 0x9d, hi: 0x9d}, - {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0x0941, lo: 0x9e, hi: 0x9e}, {value: 0xe06d, lo: 0x9f, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa8}, - {value: 0x6ed9, lo: 0xa9, hi: 0xa9}, + {value: 0x13f9, lo: 0xa9, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x44cd, lo: 0xb0, hi: 0xbf}, - // Block 0x79, offset 0x3ee + // Block 0x7b, offset 0x3f8 {value: 0x0000, lo: 0x04}, {value: 0x44ed, lo: 0x80, hi: 0x8f}, {value: 0x450d, lo: 0x90, hi: 0x9f}, {value: 0x452d, lo: 0xa0, hi: 0xaf}, {value: 0x450d, lo: 0xb0, hi: 0xbf}, - // Block 0x7a, offset 0x3f3 + // Block 0x7c, offset 0x3fd {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0xa2}, {value: 0x3008, lo: 0xa3, hi: 0xa4}, @@ -3544,76 +3699,76 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x7b, offset 0x400 + // Block 0x7d, offset 0x40a {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x7c, offset 0x404 + // Block 0x7e, offset 0x40e {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 0x7d, offset 0x409 + // Block 0x7f, offset 0x413 {value: 0x0000, lo: 0x01}, {value: 0x0040, lo: 0x80, hi: 0xbf}, - // Block 0x7e, offset 0x40b + // Block 0x80, offset 0x415 {value: 0x0020, lo: 0x01}, {value: 0x454d, lo: 0x80, hi: 0xbf}, - // Block 0x7f, offset 0x40d + // Block 0x81, offset 0x417 {value: 0x0020, lo: 0x03}, {value: 0x4d4d, lo: 0x80, hi: 0x94}, {value: 0x4b0d, lo: 0x95, hi: 0x95}, {value: 0x4fed, lo: 0x96, hi: 0xbf}, - // Block 0x80, offset 0x411 + // Block 0x82, offset 0x41b {value: 0x0020, lo: 0x01}, {value: 0x552d, lo: 0x80, hi: 0xbf}, - // Block 0x81, offset 0x413 + // Block 0x83, offset 0x41d {value: 0x0020, lo: 0x03}, {value: 0x5d2d, lo: 0x80, hi: 0x84}, {value: 0x568d, lo: 0x85, hi: 0x85}, {value: 0x5dcd, lo: 0x86, hi: 0xbf}, - // Block 0x82, offset 0x417 + // Block 0x84, offset 0x421 {value: 0x0020, lo: 0x08}, {value: 0x6b8d, lo: 0x80, hi: 0x8f}, {value: 0x6d4d, lo: 0x90, hi: 0x90}, {value: 0x6d8d, lo: 0x91, hi: 0xab}, - {value: 0x6ef1, lo: 0xac, hi: 0xac}, + {value: 0x1401, lo: 0xac, hi: 0xac}, {value: 0x70ed, lo: 0xad, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x710d, lo: 0xb0, hi: 0xbf}, - // Block 0x83, offset 0x420 + // Block 0x85, offset 0x42a {value: 0x0020, lo: 0x05}, {value: 0x730d, lo: 0x80, hi: 0xad}, {value: 0x656d, lo: 0xae, hi: 0xae}, {value: 0x78cd, lo: 0xaf, hi: 0xb5}, {value: 0x6f8d, lo: 0xb6, hi: 0xb6}, {value: 0x79ad, lo: 0xb7, hi: 0xbf}, - // Block 0x84, offset 0x426 - {value: 0x0028, lo: 0x03}, - {value: 0x7c71, lo: 0x80, hi: 0x82}, - {value: 0x7c31, lo: 0x83, hi: 0x83}, - {value: 0x7ce9, lo: 0x84, hi: 0xbf}, - // Block 0x85, offset 0x42a - {value: 0x0038, lo: 0x0f}, - {value: 0x9e01, lo: 0x80, hi: 0x83}, - {value: 0x9ea9, lo: 0x84, hi: 0x85}, - {value: 0x9ee1, lo: 0x86, hi: 0x87}, - {value: 0x9f19, lo: 0x88, hi: 0x8f}, + // Block 0x86, offset 0x430 + {value: 0x0008, lo: 0x03}, + {value: 0x1751, lo: 0x80, hi: 0x82}, + {value: 0x1741, lo: 0x83, hi: 0x83}, + {value: 0x1769, lo: 0x84, hi: 0xbf}, + // Block 0x87, offset 0x434 + {value: 0x0008, lo: 0x0f}, + {value: 0x1d81, lo: 0x80, hi: 0x83}, + {value: 0x1d99, lo: 0x84, hi: 0x85}, + {value: 0x1da1, lo: 0x86, hi: 0x87}, + {value: 0x1da9, lo: 0x88, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0xa0d9, lo: 0x92, hi: 0x97}, - {value: 0xa1f1, lo: 0x98, hi: 0x9c}, - {value: 0xa2d1, lo: 0x9d, hi: 0xb3}, - {value: 0x9d91, lo: 0xb4, hi: 0xb4}, - {value: 0x9e01, lo: 0xb5, hi: 0xb5}, - {value: 0xa7d9, lo: 0xb6, hi: 0xbb}, - {value: 0xa8b9, lo: 0xbc, hi: 0xbc}, - {value: 0xa849, lo: 0xbd, hi: 0xbd}, - {value: 0xa929, lo: 0xbe, hi: 0xbf}, - // Block 0x86, offset 0x43a + {value: 0x1de9, lo: 0x92, hi: 0x97}, + {value: 0x1e11, lo: 0x98, hi: 0x9c}, + {value: 0x1e31, lo: 0x9d, hi: 0xb3}, + {value: 0x1d71, lo: 0xb4, hi: 0xb4}, + {value: 0x1d81, lo: 0xb5, hi: 0xb5}, + {value: 0x1ee9, lo: 0xb6, hi: 0xbb}, + {value: 0x1f09, lo: 0xbc, hi: 0xbc}, + {value: 0x1ef9, lo: 0xbd, hi: 0xbd}, + {value: 0x1f19, lo: 0xbe, hi: 0xbf}, + // Block 0x88, offset 0x444 {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8c}, @@ -3624,24 +3779,24 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xbc, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbe}, {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x87, offset 0x444 + // Block 0x89, offset 0x44e {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 0x88, offset 0x449 + // Block 0x8a, offset 0x453 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x89, offset 0x44c + // Block 0x8b, offset 0x456 {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 0x8a, offset 0x452 + // Block 0x8c, offset 0x45c {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x8e}, {value: 0x0040, lo: 0x8f, hi: 0x8f}, @@ -3649,31 +3804,31 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x9d, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa0}, {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0x8b, offset 0x459 + // Block 0x8d, offset 0x463 {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbc}, {value: 0x3308, lo: 0xbd, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x8c, offset 0x45e + // Block 0x8e, offset 0x468 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x9c}, {value: 0x0040, lo: 0x9d, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x8d, offset 0x462 + // Block 0x8f, offset 0x46c {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x9f}, {value: 0x3308, lo: 0xa0, hi: 0xa0}, {value: 0x0018, lo: 0xa1, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x8e, offset 0x468 + // Block 0x90, offset 0x472 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xac}, {value: 0x0008, lo: 0xad, hi: 0xbf}, - // Block 0x8f, offset 0x46d + // Block 0x91, offset 0x477 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x81}, @@ -3683,20 +3838,20 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x90, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x90, offset 0x476 + // Block 0x92, offset 0x480 {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 0x91, offset 0x47b + // Block 0x93, offset 0x485 {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 0x92, offset 0x481 + // Block 0x94, offset 0x48b {value: 0x0000, lo: 0x06}, {value: 0xe145, lo: 0x80, hi: 0x87}, {value: 0xe1c5, lo: 0x88, hi: 0x8f}, @@ -3704,7 +3859,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x8b0d, lo: 0x98, hi: 0x9f}, {value: 0x8b25, lo: 0xa0, hi: 0xa7}, {value: 0x0008, lo: 0xa8, hi: 0xbf}, - // Block 0x93, offset 0x488 + // Block 0x95, offset 0x492 {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, @@ -3712,7 +3867,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xaa, hi: 0xaf}, {value: 0x8b25, lo: 0xb0, hi: 0xb7}, {value: 0x8b0d, lo: 0xb8, hi: 0xbf}, - // Block 0x94, offset 0x48f + // Block 0x96, offset 0x499 {value: 0x0000, lo: 0x06}, {value: 0xe145, lo: 0x80, hi: 0x87}, {value: 0xe1c5, lo: 0x88, hi: 0x8f}, @@ -3720,28 +3875,28 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x94, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x95, offset 0x496 + // Block 0x97, offset 0x4a0 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x96, offset 0x49a + // Block 0x98, offset 0x4a4 {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 0x97, offset 0x49f + // Block 0x99, offset 0x4a9 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x98, offset 0x4a2 + // Block 0x9a, offset 0x4ac {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 0x99, offset 0x4a7 + // Block 0x9b, offset 0x4b1 {value: 0x0000, lo: 0x0b}, {value: 0x0808, lo: 0x80, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x87}, @@ -3754,20 +3909,20 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xbc, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbe}, {value: 0x0808, lo: 0xbf, hi: 0xbf}, - // Block 0x9a, offset 0x4b3 + // Block 0x9c, offset 0x4bd {value: 0x0000, lo: 0x05}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x96}, {value: 0x0818, lo: 0x97, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb6}, {value: 0x0818, lo: 0xb7, hi: 0xbf}, - // Block 0x9b, offset 0x4b9 + // Block 0x9d, offset 0x4c3 {value: 0x0000, lo: 0x04}, {value: 0x0808, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0xa6}, {value: 0x0818, lo: 0xa7, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x9c, offset 0x4be + // Block 0x9e, offset 0x4c8 {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb2}, @@ -3775,7 +3930,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xb4, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xba}, {value: 0x0818, lo: 0xbb, hi: 0xbf}, - // Block 0x9d, offset 0x4c5 + // Block 0x9f, offset 0x4cf {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0818, lo: 0x96, hi: 0x9b}, @@ -3784,18 +3939,18 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xa0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbe}, {value: 0x0818, lo: 0xbf, hi: 0xbf}, - // Block 0x9e, offset 0x4cd + // Block 0xa0, offset 0x4d7 {value: 0x0000, lo: 0x04}, {value: 0x0808, lo: 0x80, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbb}, {value: 0x0818, lo: 0xbc, hi: 0xbd}, {value: 0x0808, lo: 0xbe, hi: 0xbf}, - // Block 0x9f, offset 0x4d2 + // Block 0xa1, offset 0x4dc {value: 0x0000, lo: 0x03}, {value: 0x0818, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x91}, {value: 0x0818, lo: 0x92, hi: 0xbf}, - // Block 0xa0, offset 0x4d6 + // Block 0xa2, offset 0x4e0 {value: 0x0000, lo: 0x0f}, {value: 0x0808, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x83}, @@ -3812,7 +3967,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb8, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xa1, offset 0x4e6 + // Block 0xa3, offset 0x4f0 {value: 0x0000, lo: 0x06}, {value: 0x0818, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, @@ -3820,17 +3975,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x99, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xbc}, {value: 0x0818, lo: 0xbd, hi: 0xbf}, - // Block 0xa2, offset 0x4ed + // Block 0xa4, offset 0x4f7 {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0x9c}, {value: 0x0818, lo: 0x9d, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xa3, offset 0x4f1 + // Block 0xa5, offset 0x4fb {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xb8}, {value: 0x0018, lo: 0xb9, hi: 0xbf}, - // Block 0xa4, offset 0x4f5 + // Block 0xa6, offset 0x4ff {value: 0x0000, lo: 0x06}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x97}, @@ -3838,23 +3993,23 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xa0, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xb7}, {value: 0x0818, lo: 0xb8, hi: 0xbf}, - // Block 0xa5, offset 0x4fc + // Block 0xa7, offset 0x506 {value: 0x0000, lo: 0x01}, {value: 0x0808, lo: 0x80, hi: 0xbf}, - // Block 0xa6, offset 0x4fe + // Block 0xa8, offset 0x508 {value: 0x0000, lo: 0x02}, {value: 0x0808, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0xa7, offset 0x501 + // Block 0xa9, offset 0x50b {value: 0x0000, lo: 0x02}, {value: 0x03dd, lo: 0x80, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xbf}, - // Block 0xa8, offset 0x504 + // Block 0xaa, offset 0x50e {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xb9}, {value: 0x0818, lo: 0xba, hi: 0xbf}, - // Block 0xa9, offset 0x508 + // Block 0xab, offset 0x512 {value: 0x0000, lo: 0x08}, {value: 0x0908, lo: 0x80, hi: 0x80}, {value: 0x0a08, lo: 0x81, hi: 0xa1}, @@ -3864,12 +4019,12 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa8, hi: 0xaf}, {value: 0x0808, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xaa, offset 0x511 + // Block 0xac, offset 0x51b {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0818, lo: 0xa0, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xab, offset 0x515 + // Block 0xad, offset 0x51f {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xaa}, @@ -3878,7 +4033,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0808, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xac, offset 0x51d + // Block 0xae, offset 0x527 {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0x9c}, {value: 0x0818, lo: 0x9d, hi: 0xa6}, @@ -3887,7 +4042,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0a08, lo: 0xb0, hi: 0xb2}, {value: 0x0c08, lo: 0xb3, hi: 0xb3}, {value: 0x0a08, lo: 0xb4, hi: 0xbf}, - // Block 0xad, offset 0x525 + // Block 0xaf, offset 0x52f {value: 0x0000, lo: 0x07}, {value: 0x0a08, lo: 0x80, hi: 0x84}, {value: 0x0808, lo: 0x85, hi: 0x85}, @@ -3896,7 +4051,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0c18, lo: 0x94, hi: 0x94}, {value: 0x0818, lo: 0x95, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xae, offset 0x52d + // Block 0xb0, offset 0x537 {value: 0x0000, lo: 0x0b}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0a08, lo: 0xb0, hi: 0xb0}, @@ -3909,7 +4064,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0a08, lo: 0xbb, hi: 0xbc}, {value: 0x0c08, lo: 0xbd, hi: 0xbd}, {value: 0x0a08, lo: 0xbe, hi: 0xbf}, - // Block 0xaf, offset 0x539 + // Block 0xb1, offset 0x543 {value: 0x0000, lo: 0x0b}, {value: 0x0808, lo: 0x80, hi: 0x80}, {value: 0x0a08, lo: 0x81, hi: 0x81}, @@ -3922,14 +4077,14 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x8c, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xb0, offset 0x545 + // Block 0xb2, offset 0x54f {value: 0x0000, lo: 0x05}, {value: 0x3008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xbf}, - // Block 0xb1, offset 0x54b + // Block 0xb3, offset 0x555 {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x85}, {value: 0x3b08, lo: 0x86, hi: 0x86}, @@ -3939,7 +4094,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa6, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xb2, offset 0x554 + // Block 0xb4, offset 0x55e {value: 0x0000, lo: 0x0b}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, @@ -3952,7 +4107,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xbb, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbd}, {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0xb3, offset 0x560 + // Block 0xb5, offset 0x56a {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x81}, {value: 0x0040, lo: 0x82, hi: 0x8f}, @@ -3960,7 +4115,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa9, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xb4, offset 0x567 + // Block 0xb6, offset 0x571 {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xa6}, @@ -3970,7 +4125,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3b08, lo: 0xb3, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xbf}, - // Block 0xb5, offset 0x570 + // Block 0xb7, offset 0x57a {value: 0x0000, lo: 0x0a}, {value: 0x0018, lo: 0x80, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0x84}, @@ -3982,7 +4137,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xb4, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xb6, offset 0x57b + // Block 0xb8, offset 0x585 {value: 0x0000, lo: 0x06}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, @@ -3990,7 +4145,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb3, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xbe}, {value: 0x3008, lo: 0xbf, hi: 0xbf}, - // Block 0xb7, offset 0x582 + // Block 0xb9, offset 0x58c {value: 0x0000, lo: 0x0e}, {value: 0x3808, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x84}, @@ -4006,7 +4161,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa0, hi: 0xa0}, {value: 0x0018, lo: 0xa1, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xb8, offset 0x591 + // Block 0xba, offset 0x59b {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x91}, {value: 0x0040, lo: 0x92, hi: 0x92}, @@ -4020,7 +4175,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xb8, hi: 0xbd}, {value: 0x3308, lo: 0xbe, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xb9, offset 0x59e + // Block 0xbb, offset 0x5a8 {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, @@ -4034,7 +4189,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xa9, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0xba, offset 0x5ab + // Block 0xbc, offset 0x5b5 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x3308, lo: 0x9f, hi: 0x9f}, @@ -4044,12 +4199,12 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xab, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xbb, offset 0x5b4 + // Block 0xbd, offset 0x5be {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xb4}, {value: 0x3008, lo: 0xb5, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xbf}, - // Block 0xbc, offset 0x5b8 + // Block 0xbe, offset 0x5c2 {value: 0x0000, lo: 0x0e}, {value: 0x3008, lo: 0x80, hi: 0x81}, {value: 0x3b08, lo: 0x82, hi: 0x82}, @@ -4065,7 +4220,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0x9e, hi: 0x9e}, {value: 0x0008, lo: 0x9f, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xbf}, - // Block 0xbd, offset 0x5c7 + // Block 0xbf, offset 0x5d1 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb2}, @@ -4074,7 +4229,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, - // Block 0xbe, offset 0x5cf + // Block 0xc0, offset 0x5d9 {value: 0x0000, lo: 0x0a}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x3008, lo: 0x81, hi: 0x81}, @@ -4086,7 +4241,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xbf, offset 0x5da + // Block 0xc1, offset 0x5e4 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xae}, {value: 0x3008, lo: 0xaf, hi: 0xb1}, @@ -4096,14 +4251,14 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xc0, offset 0x5e3 + // Block 0xc2, offset 0x5ed {value: 0x0000, lo: 0x05}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0x9b}, {value: 0x3308, lo: 0x9c, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0xc1, offset 0x5e9 + // Block 0xc3, offset 0x5f3 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb2}, @@ -4112,7 +4267,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbd, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xc2, offset 0x5f1 + // Block 0xc4, offset 0x5fb {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x83}, @@ -4122,7 +4277,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xc3, offset 0x5fa + // Block 0xc5, offset 0x604 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x3308, lo: 0xab, hi: 0xab}, @@ -4134,11 +4289,11 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb7, hi: 0xb7}, {value: 0x0008, lo: 0xb8, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xc4, offset 0x605 + // Block 0xc6, offset 0x60f {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0xbf}, - // Block 0xc5, offset 0x608 + // Block 0xc7, offset 0x612 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x9a}, {value: 0x0040, lo: 0x9b, hi: 0x9c}, @@ -4151,7 +4306,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0xc6, offset 0x614 + // Block 0xc8, offset 0x61e {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xab}, {value: 0x3008, lo: 0xac, hi: 0xae}, @@ -4161,17 +4316,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x0018, lo: 0xbb, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0xc7, offset 0x61d + // Block 0xc9, offset 0x627 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x049d, lo: 0xa0, hi: 0xbf}, - // Block 0xc8, offset 0x620 + // Block 0xca, offset 0x62a {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 0xc9, offset 0x625 + // Block 0xcb, offset 0x62f {value: 0x0000, lo: 0x08}, {value: 0x3008, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x81}, @@ -4181,13 +4336,13 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x87, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xca, offset 0x62e + // Block 0xcc, offset 0x638 {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xa9}, {value: 0x0008, lo: 0xaa, hi: 0xbf}, - // Block 0xcb, offset 0x633 + // Block 0xcd, offset 0x63d {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x90}, {value: 0x3008, lo: 0x91, hi: 0x93}, @@ -4201,7 +4356,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa3, hi: 0xa3}, {value: 0x3008, lo: 0xa4, hi: 0xa4}, {value: 0x0040, lo: 0xa5, hi: 0xbf}, - // Block 0xcc, offset 0x640 + // Block 0xce, offset 0x64a {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x8a}, @@ -4213,7 +4368,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xba, hi: 0xba}, {value: 0x3308, lo: 0xbb, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0xcd, offset 0x64b + // Block 0xcf, offset 0x655 {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x3b08, lo: 0x87, hi: 0x87}, @@ -4223,7 +4378,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0x97, hi: 0x98}, {value: 0x3308, lo: 0x99, hi: 0x9b}, {value: 0x0008, lo: 0x9c, hi: 0xbf}, - // Block 0xce, offset 0x654 + // Block 0xd0, offset 0x65e {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x3308, lo: 0x8a, hi: 0x96}, @@ -4234,11 +4389,11 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x9d, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0xa2}, {value: 0x0040, lo: 0xa3, hi: 0xbf}, - // Block 0xcf, offset 0x65e + // Block 0xd1, offset 0x668 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xd0, offset 0x661 + // Block 0xd2, offset 0x66b {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, @@ -4249,7 +4404,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb8, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xd1, offset 0x66b + // Block 0xd3, offset 0x675 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x85}, @@ -4259,7 +4414,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xbf}, - // Block 0xd2, offset 0x674 + // Block 0xd4, offset 0x67e {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x91}, @@ -4272,7 +4427,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb4, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xd3, offset 0x680 + // Block 0xd5, offset 0x68a {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, @@ -4286,7 +4441,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, - // Block 0xd4, offset 0x68d + // Block 0xd6, offset 0x697 {value: 0x0000, lo: 0x0c}, {value: 0x3308, lo: 0x80, hi: 0x83}, {value: 0x3b08, lo: 0x84, hi: 0x85}, @@ -4300,7 +4455,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa7, hi: 0xa8}, {value: 0x0040, lo: 0xa9, hi: 0xa9}, {value: 0x0008, lo: 0xaa, hi: 0xbf}, - // Block 0xd5, offset 0x69a + // Block 0xd7, offset 0x6a4 {value: 0x0000, lo: 0x0d}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x3008, lo: 0x8a, hi: 0x8e}, @@ -4315,7 +4470,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x99, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xbf}, - // Block 0xd6, offset 0x6a8 + // Block 0xd8, offset 0x6b2 {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xb2}, @@ -4323,41 +4478,41 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb5, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xd7, offset 0x6af + // Block 0xd9, offset 0x6b9 {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb0}, {value: 0x0040, lo: 0xb1, hi: 0xbf}, - // Block 0xd8, offset 0x6b3 + // Block 0xda, offset 0x6bd {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0xd9, offset 0x6b7 + // Block 0xdb, offset 0x6c1 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xda, offset 0x6ba + // Block 0xdc, offset 0x6c4 {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 0xdb, offset 0x6bf + // Block 0xdd, offset 0x6c9 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0xbf}, - // Block 0xdc, offset 0x6c2 + // Block 0xde, offset 0x6cc {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0340, lo: 0xb0, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xdd, offset 0x6c7 + // Block 0xdf, offset 0x6d1 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0xbf}, - // Block 0xde, offset 0x6ca + // Block 0xe0, offset 0x6d4 {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, @@ -4365,7 +4520,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xaa, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xdf, offset 0x6d1 + // Block 0xe1, offset 0x6db {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xad}, @@ -4373,12 +4528,12 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb0, hi: 0xb4}, {value: 0x0018, lo: 0xb5, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xe0, offset 0x6d8 + // Block 0xe2, offset 0x6e2 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0xe1, offset 0x6dc + // Block 0xe3, offset 0x6e6 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0018, lo: 0x84, hi: 0x85}, @@ -4390,33 +4545,33 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa3, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbf}, - // Block 0xe2, offset 0x6e7 + // Block 0xe4, offset 0x6f1 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0xbf}, - // Block 0xe3, offset 0x6ea + // Block 0xe5, offset 0x6f4 {value: 0x0000, lo: 0x02}, {value: 0xe105, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0xe4, offset 0x6ed + // Block 0xe6, offset 0x6f7 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0x9a}, {value: 0x0040, lo: 0x9b, hi: 0xbf}, - // Block 0xe5, offset 0x6f0 + // Block 0xe7, offset 0x6fa {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8e}, {value: 0x3308, lo: 0x8f, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x90}, {value: 0x3008, lo: 0x91, hi: 0xbf}, - // Block 0xe6, offset 0x6f6 + // Block 0xe8, offset 0x700 {value: 0x0000, lo: 0x05}, {value: 0x3008, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8e}, {value: 0x3308, lo: 0x8f, hi: 0x92}, {value: 0x0008, lo: 0x93, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xe7, offset 0x6fc + // Block 0xe9, offset 0x706 {value: 0x0000, lo: 0x08}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa1}, @@ -4426,23 +4581,23 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa5, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xe8, offset 0x705 + // Block 0xea, offset 0x70f {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0xe9, offset 0x708 + // Block 0xeb, offset 0x712 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0xbf}, - // Block 0xea, offset 0x70b + // Block 0xec, offset 0x715 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0xeb, offset 0x70e + // Block 0xed, offset 0x718 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0xbf}, - // Block 0xec, offset 0x711 + // Block 0xee, offset 0x71b {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x92}, @@ -4450,17 +4605,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa4, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0xed, offset 0x718 + // Block 0xef, offset 0x722 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0xee, offset 0x71b + // Block 0xf0, offset 0x725 {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 0xef, offset 0x720 + // Block 0xf1, offset 0x72a {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, @@ -4471,32 +4626,32 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0x9f, hi: 0x9f}, {value: 0x03c0, lo: 0xa0, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xbf}, - // Block 0xf0, offset 0x72a + // Block 0xf2, offset 0x734 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xf1, offset 0x72d + // Block 0xf3, offset 0x737 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xa8}, {value: 0x0018, lo: 0xa9, hi: 0xbf}, - // Block 0xf2, offset 0x731 + // Block 0xf4, offset 0x73b {value: 0x0000, lo: 0x0e}, {value: 0x0018, lo: 0x80, hi: 0x9d}, - {value: 0xb609, lo: 0x9e, hi: 0x9e}, - {value: 0xb651, lo: 0x9f, hi: 0x9f}, - {value: 0xb699, lo: 0xa0, hi: 0xa0}, - {value: 0xb701, lo: 0xa1, hi: 0xa1}, - {value: 0xb769, lo: 0xa2, hi: 0xa2}, - {value: 0xb7d1, lo: 0xa3, hi: 0xa3}, - {value: 0xb839, lo: 0xa4, hi: 0xa4}, + {value: 0x2211, lo: 0x9e, hi: 0x9e}, + {value: 0x2219, lo: 0x9f, hi: 0x9f}, + {value: 0x2221, lo: 0xa0, hi: 0xa0}, + {value: 0x2229, lo: 0xa1, hi: 0xa1}, + {value: 0x2231, lo: 0xa2, hi: 0xa2}, + {value: 0x2239, lo: 0xa3, hi: 0xa3}, + {value: 0x2241, lo: 0xa4, hi: 0xa4}, {value: 0x3018, lo: 0xa5, hi: 0xa6}, {value: 0x3318, lo: 0xa7, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xac}, {value: 0x3018, lo: 0xad, hi: 0xb2}, {value: 0x0340, lo: 0xb3, hi: 0xba}, {value: 0x3318, lo: 0xbb, hi: 0xbf}, - // Block 0xf3, offset 0x740 + // Block 0xf5, offset 0x74a {value: 0x0000, lo: 0x0b}, {value: 0x3318, lo: 0x80, hi: 0x82}, {value: 0x0018, lo: 0x83, hi: 0x84}, @@ -4504,45 +4659,45 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0x8c, hi: 0xa9}, {value: 0x3318, lo: 0xaa, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xba}, - {value: 0xb8a1, lo: 0xbb, hi: 0xbb}, - {value: 0xb8e9, lo: 0xbc, hi: 0xbc}, - {value: 0xb931, lo: 0xbd, hi: 0xbd}, - {value: 0xb999, lo: 0xbe, hi: 0xbe}, - {value: 0xba01, lo: 0xbf, hi: 0xbf}, - // Block 0xf4, offset 0x74c + {value: 0x2249, lo: 0xbb, hi: 0xbb}, + {value: 0x2251, lo: 0xbc, hi: 0xbc}, + {value: 0x2259, lo: 0xbd, hi: 0xbd}, + {value: 0x2261, lo: 0xbe, hi: 0xbe}, + {value: 0x2269, lo: 0xbf, hi: 0xbf}, + // Block 0xf6, offset 0x756 {value: 0x0000, lo: 0x03}, - {value: 0xba69, lo: 0x80, hi: 0x80}, + {value: 0x2271, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0xa8}, {value: 0x0040, lo: 0xa9, hi: 0xbf}, - // Block 0xf5, offset 0x750 + // Block 0xf7, offset 0x75a {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x81}, {value: 0x3318, lo: 0x82, hi: 0x84}, {value: 0x0018, lo: 0x85, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0xbf}, - // Block 0xf6, offset 0x755 + // Block 0xf8, offset 0x75f {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0xf7, offset 0x759 + // Block 0xf9, offset 0x763 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xf8, offset 0x75e + // Block 0xfa, offset 0x768 {value: 0x0000, lo: 0x03}, {value: 0x3308, lo: 0x80, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xba}, {value: 0x3308, lo: 0xbb, hi: 0xbf}, - // Block 0xf9, offset 0x762 + // Block 0xfb, offset 0x76c {value: 0x0000, lo: 0x04}, {value: 0x3308, lo: 0x80, hi: 0xac}, {value: 0x0018, lo: 0xad, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb5}, {value: 0x0018, lo: 0xb6, hi: 0xbf}, - // Block 0xfa, offset 0x767 + // Block 0xfc, offset 0x771 {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x83}, {value: 0x3308, lo: 0x84, hi: 0x84}, @@ -4552,7 +4707,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa0, hi: 0xa0}, {value: 0x3308, lo: 0xa1, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xfb, offset 0x770 + // Block 0xfd, offset 0x77a {value: 0x0000, lo: 0x0a}, {value: 0x3308, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, @@ -4564,35 +4719,35 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa5, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xbf}, - // Block 0xfc, offset 0x77b + // Block 0xfe, offset 0x785 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb6}, {value: 0x0008, lo: 0xb7, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0xfd, offset 0x781 + // Block 0xff, offset 0x78b {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0x8d}, {value: 0x0008, lo: 0x8e, hi: 0x8e}, {value: 0x0018, lo: 0x8f, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0xbf}, - // Block 0xfe, offset 0x787 + // Block 0x100, offset 0x791 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xab}, {value: 0x3308, lo: 0xac, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0xff, offset 0x78d + // Block 0x101, offset 0x797 {value: 0x0000, lo: 0x05}, {value: 0x0808, lo: 0x80, hi: 0x84}, {value: 0x0040, lo: 0x85, hi: 0x86}, {value: 0x0818, lo: 0x87, hi: 0x8f}, {value: 0x3308, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0x100, offset 0x793 + // Block 0x102, offset 0x79d {value: 0x0000, lo: 0x08}, {value: 0x0a08, lo: 0x80, hi: 0x83}, {value: 0x3308, lo: 0x84, hi: 0x8a}, @@ -4602,71 +4757,71 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x9a, hi: 0x9d}, {value: 0x0818, lo: 0x9e, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0x101, offset 0x79c + // Block 0x103, offset 0x7a6 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0xb0}, {value: 0x0818, lo: 0xb1, hi: 0xbf}, - // Block 0x102, offset 0x79f + // Block 0x104, offset 0x7a9 {value: 0x0000, lo: 0x02}, {value: 0x0818, lo: 0x80, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x103, offset 0x7a2 + // Block 0x105, offset 0x7ac {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0818, lo: 0x81, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x104, offset 0x7a6 + // Block 0x106, offset 0x7b0 {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0x105, offset 0x7aa + // Block 0x107, offset 0x7b4 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x106, offset 0x7ae + // Block 0x108, offset 0x7b8 {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 0x107, offset 0x7b4 + // Block 0x109, offset 0x7be {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 0x108, offset 0x7ba + // Block 0x10a, offset 0x7c4 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x8f}, - {value: 0xc229, lo: 0x90, hi: 0x90}, + {value: 0x2491, lo: 0x90, hi: 0x90}, {value: 0x0018, lo: 0x91, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xbf}, - // Block 0x109, offset 0x7bf + // Block 0x10b, offset 0x7c9 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0xa5}, {value: 0x0018, lo: 0xa6, hi: 0xbf}, - // Block 0x10a, offset 0x7c2 + // Block 0x10c, offset 0x7cc {value: 0x0000, lo: 0x0f}, - {value: 0xc851, lo: 0x80, hi: 0x80}, - {value: 0xc8a1, lo: 0x81, hi: 0x81}, - {value: 0xc8f1, lo: 0x82, hi: 0x82}, - {value: 0xc941, lo: 0x83, hi: 0x83}, - {value: 0xc991, lo: 0x84, hi: 0x84}, - {value: 0xc9e1, lo: 0x85, hi: 0x85}, - {value: 0xca31, lo: 0x86, hi: 0x86}, - {value: 0xca81, lo: 0x87, hi: 0x87}, - {value: 0xcad1, lo: 0x88, hi: 0x88}, + {value: 0x2611, lo: 0x80, hi: 0x80}, + {value: 0x2619, lo: 0x81, hi: 0x81}, + {value: 0x2621, lo: 0x82, hi: 0x82}, + {value: 0x2629, lo: 0x83, hi: 0x83}, + {value: 0x2631, lo: 0x84, hi: 0x84}, + {value: 0x2639, lo: 0x85, hi: 0x85}, + {value: 0x2641, lo: 0x86, hi: 0x86}, + {value: 0x2649, lo: 0x87, hi: 0x87}, + {value: 0x2651, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, - {value: 0xcb21, lo: 0x90, hi: 0x90}, - {value: 0xcb41, lo: 0x91, hi: 0x91}, + {value: 0x2659, lo: 0x90, hi: 0x90}, + {value: 0x2661, lo: 0x91, hi: 0x91}, {value: 0x0040, lo: 0x92, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa5}, {value: 0x0040, lo: 0xa6, hi: 0xbf}, - // Block 0x10b, offset 0x7d2 + // Block 0x10d, offset 0x7dc {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x97}, {value: 0x0040, lo: 0x98, hi: 0x9f}, @@ -4674,29 +4829,29 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x10c, offset 0x7d9 + // Block 0x10e, offset 0x7e3 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0x10d, offset 0x7dc + // Block 0x10f, offset 0x7e6 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x98}, {value: 0x0040, lo: 0x99, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xbf}, - // Block 0x10e, offset 0x7e1 + // Block 0x110, offset 0x7eb {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x10f, offset 0x7e5 + // Block 0x111, offset 0x7ef {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 0x110, offset 0x7eb + // Block 0x112, offset 0x7f5 {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, @@ -4704,17 +4859,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0x111, offset 0x7f2 + // Block 0x113, offset 0x7fc {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xb9}, {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0x112, offset 0x7f6 + // Block 0x114, offset 0x800 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0xbf}, - // Block 0x113, offset 0x7fa + // Block 0x115, offset 0x804 {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x9f}, @@ -4724,7 +4879,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xb5, hi: 0xb7}, {value: 0x0018, lo: 0xb8, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x114, offset 0x803 + // Block 0x116, offset 0x80d {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x8f}, @@ -4732,109 +4887,74 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa9, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x115, offset 0x80a + // Block 0x117, offset 0x814 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x82}, {value: 0x0040, lo: 0x83, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0x116, offset 0x80f + // Block 0x118, offset 0x819 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x92}, {value: 0x0040, lo: 0x93, hi: 0x93}, {value: 0x0018, lo: 0x94, hi: 0xbf}, - // Block 0x117, offset 0x813 + // Block 0x119, offset 0x81d {value: 0x0000, lo: 0x0d}, {value: 0x0018, lo: 0x80, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0xaf}, - {value: 0x1f41, lo: 0xb0, hi: 0xb0}, - {value: 0x00c9, lo: 0xb1, hi: 0xb1}, - {value: 0x0069, lo: 0xb2, hi: 0xb2}, - {value: 0x0079, lo: 0xb3, hi: 0xb3}, - {value: 0x1f51, lo: 0xb4, hi: 0xb4}, - {value: 0x1f61, lo: 0xb5, hi: 0xb5}, - {value: 0x1f71, lo: 0xb6, hi: 0xb6}, - {value: 0x1f81, lo: 0xb7, hi: 0xb7}, - {value: 0x1f91, lo: 0xb8, hi: 0xb8}, - {value: 0x1fa1, lo: 0xb9, hi: 0xb9}, + {value: 0x06e1, lo: 0xb0, hi: 0xb0}, + {value: 0x0049, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb2, hi: 0xb2}, + {value: 0x0031, lo: 0xb3, hi: 0xb3}, + {value: 0x06e9, lo: 0xb4, hi: 0xb4}, + {value: 0x06f1, lo: 0xb5, hi: 0xb5}, + {value: 0x06f9, lo: 0xb6, hi: 0xb6}, + {value: 0x0701, lo: 0xb7, hi: 0xb7}, + {value: 0x0709, lo: 0xb8, hi: 0xb8}, + {value: 0x0711, lo: 0xb9, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x118, offset 0x821 + // Block 0x11a, offset 0x82b {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0x119, offset 0x824 + // Block 0x11b, offset 0x82e {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x11a, offset 0x827 + // Block 0x11c, offset 0x831 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x11b, offset 0x82b + // Block 0x11d, offset 0x835 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x11c, offset 0x82f + // Block 0x11e, offset 0x839 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xa0}, {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0x11d, offset 0x832 - {value: 0x0020, lo: 0x0f}, - {value: 0xdf21, lo: 0x80, hi: 0x89}, - {value: 0x8e35, lo: 0x8a, hi: 0x8a}, - {value: 0xe061, lo: 0x8b, hi: 0x9c}, - {value: 0x8e55, lo: 0x9d, hi: 0x9d}, - {value: 0xe2a1, lo: 0x9e, hi: 0xa2}, - {value: 0x8e75, lo: 0xa3, hi: 0xa3}, - {value: 0xe341, lo: 0xa4, hi: 0xab}, - {value: 0x7f0d, lo: 0xac, hi: 0xac}, - {value: 0xe441, lo: 0xad, hi: 0xaf}, - {value: 0x8e95, lo: 0xb0, hi: 0xb0}, - {value: 0xe4a1, lo: 0xb1, hi: 0xb6}, - {value: 0x8eb5, lo: 0xb7, hi: 0xb9}, - {value: 0xe561, lo: 0xba, hi: 0xba}, - {value: 0x8f15, lo: 0xbb, hi: 0xbb}, - {value: 0xe581, lo: 0xbc, hi: 0xbf}, - // Block 0x11e, offset 0x842 - {value: 0x0020, lo: 0x10}, - {value: 0x93b5, lo: 0x80, hi: 0x80}, - {value: 0xf101, lo: 0x81, hi: 0x86}, - {value: 0x93d5, lo: 0x87, hi: 0x8a}, - {value: 0xda61, lo: 0x8b, hi: 0x8b}, - {value: 0xf1c1, lo: 0x8c, hi: 0x96}, - {value: 0x9455, lo: 0x97, hi: 0x97}, - {value: 0xf321, lo: 0x98, hi: 0xa3}, - {value: 0x9475, lo: 0xa4, hi: 0xa6}, - {value: 0xf4a1, lo: 0xa7, hi: 0xaa}, - {value: 0x94d5, lo: 0xab, hi: 0xab}, - {value: 0xf521, lo: 0xac, hi: 0xac}, - {value: 0x94f5, lo: 0xad, hi: 0xad}, - {value: 0xf541, lo: 0xae, hi: 0xaf}, - {value: 0x9515, lo: 0xb0, hi: 0xb1}, - {value: 0xf581, lo: 0xb2, hi: 0xbe}, - {value: 0x2040, lo: 0xbf, hi: 0xbf}, - // Block 0x11f, offset 0x853 + // Block 0x11f, offset 0x83c {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0xbf}, - // Block 0x120, offset 0x856 + // Block 0x120, offset 0x83f {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 0x121, offset 0x85b + // Block 0x121, offset 0x844 {value: 0x0000, lo: 0x01}, {value: 0x0340, lo: 0x80, hi: 0xbf}, - // Block 0x122, offset 0x85d + // Block 0x122, offset 0x846 {value: 0x0000, lo: 0x01}, {value: 0x33c0, lo: 0x80, hi: 0xbf}, - // Block 0x123, offset 0x85f + // Block 0x123, offset 0x848 {value: 0x0000, lo: 0x02}, {value: 0x33c0, lo: 0x80, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, } -// Total table size 43370 bytes (42KiB); checksum: EBD909C0 +// Total table size 44953 bytes (43KiB); checksum: D51909DD diff --git a/vendor/golang.org/x/net/idna/tables15.0.0.go b/vendor/golang.org/x/net/idna/tables15.0.0.go new file mode 100644 index 0000000000..40033778f0 --- /dev/null +++ b/vendor/golang.org/x/net/idna/tables15.0.0.go @@ -0,0 +1,5145 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +var mappings string = "" + // Size: 6704 bytes + " ̈a ̄23 ́ ̧1o1⁄41⁄23⁄4i̇l·ʼnsdžⱥⱦhjrwy ̆ ̇ ̊ ̨ ̃ ̋lẍ́ ι; ̈́եւاٴوٴۇٴيٴक" + + "़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼ําໍາຫນຫມགྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" + + "ཱྀྀྒྷྜྷྡྷྦྷྫྷྐྵвдостъѣæbdeǝgikmnȣptuɐɑəɛɜŋɔɯvβγδφχρнɒcɕðfɟɡɥɨɩɪʝɭʟɱɰɲɳ" + + "ɴɵɸʂʃƫʉʊʋʌzʐʑʒθssάέήίόύώἀιἁιἂιἃιἄιἅιἆιἇιἠιἡιἢιἣιἤιἥιἦιἧιὠιὡιὢιὣιὤιὥιὦιὧ" + + "ιὰιαιάιᾶιι ̈͂ὴιηιήιῆι ̓̀ ̓́ ̓͂ΐ ̔̀ ̔́ ̔͂ΰ ̈̀`ὼιωιώιῶι′′′′′‵‵‵‵‵!!???!!?" + + "′′′′0456789+=()rsħnoqsmtmωåאבגדπ1⁄71⁄91⁄101⁄32⁄31⁄52⁄53⁄54⁄51⁄65⁄61⁄83" + + "⁄85⁄87⁄81⁄iiivviviiiixxi0⁄3∫∫∫∫∫∮∮∮∮∮1011121314151617181920(10)(11)(12" + + ")(13)(14)(15)(16)(17)(18)(19)(20)∫∫∫∫==⫝̸ɫɽȿɀ. ゙ ゚よりコト(ᄀ)(ᄂ)(ᄃ)(ᄅ)(ᄆ)(ᄇ)" + + "(ᄉ)(ᄋ)(ᄌ)(ᄎ)(ᄏ)(ᄐ)(ᄑ)(ᄒ)(가)(나)(다)(라)(마)(바)(사)(아)(자)(차)(카)(타)(파)(하)(주)(오전" + + ")(오후)(一)(二)(三)(四)(五)(六)(七)(八)(九)(十)(月)(火)(水)(木)(金)(土)(日)(株)(有)(社)(名)(特)(" + + "財)(祝)(労)(代)(呼)(学)(監)(企)(資)(協)(祭)(休)(自)(至)21222324252627282930313233343" + + "5참고주의3637383940414243444546474849501月2月3月4月5月6月7月8月9月10月11月12月hgev令和アパート" + + "アルファアンペアアールイニングインチウォンエスクードエーカーオンスオームカイリカラットカロリーガロンガンマギガギニーキュリーギルダーキロキロ" + + "グラムキロメートルキロワットグラムグラムトンクルゼイロクローネケースコルナコーポサイクルサンチームシリングセンチセントダースデシドルトンナノ" + + "ノットハイツパーセントパーツバーレルピアストルピクルピコビルファラッドフィートブッシェルフランヘクタールペソペニヒヘルツペンスページベータポ" + + "イントボルトホンポンドホールホーンマイクロマイルマッハマルクマンションミクロンミリミリバールメガメガトンメートルヤードヤールユアンリットルリ" + + "ラルピールーブルレムレントゲンワット0点1点2点3点4点5点6点7点8点9点10点11点12点13点14点15点16点17点18点19点20" + + "点21点22点23点24点daauovpcdmiu平成昭和大正明治株式会社panamakakbmbgbkcalpfnfmgkghzmldlk" + + "lfmnmmmcmkmm2m3m∕sm∕s2rad∕srad∕s2psnsmspvnvmvkvpwnwmwkwbqcccdc∕kgdbgyhah" + + "pinkkktlmlnlxphprsrsvwbv∕ma∕m1日2日3日4日5日6日7日8日9日10日11日12日13日14日15日16日17日1" + + "8日19日20日21日22日23日24日25日26日27日28日29日30日31日ьɦɬʞʇœʍ𤋮𢡊𢡄𣏕𥉉𥳐𧻓fffiflstմնմեմիվնմ" + + "խיִײַעהכלםרתשׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּו" + + "ֹבֿכֿפֿאלٱٻپڀٺٿٹڤڦڄڃچڇڍڌڎڈژڑکگڳڱںڻۀہھےۓڭۇۆۈۋۅۉېىئائەئوئۇئۆئۈئېئىیئجئحئم" + + "ئيبجبحبخبمبىبيتجتحتختمتىتيثجثمثىثيجحجمحجحمخجخحخمسجسحسخسمصحصمضجضحضخضمطحط" + + "مظمعجعمغجغمفجفحفخفمفىفيقحقمقىقيكاكجكحكخكلكمكىكيلجلحلخلملىليمجمحمخمممىمي" + + "نجنحنخنمنىنيهجهمهىهييجيحيخيميىييذٰرٰىٰ ٌّ ٍّ َّ ُّ ِّ ّٰئرئزئنبربزبنترت" + + "زتنثرثزثنمانرنزننيريزينئخئهبهتهصخلهنههٰيهثهسهشمشهـَّـُّـِّطىطيعىعيغىغيس" + + "ىسيشىشيحىحيجىجيخىخيصىصيضىضيشجشحشخشرسرصرضراًتجمتحجتحمتخمتمجتمحتمخجمححميح" + + "مىسحجسجحسجىسمحسمجسممصححصممشحمشجيشمخشممضحىضخمطمحطممطميعجمعممعمىغممغميغمى" + + "فخمقمحقمملحملحيلحىلججلخملمحمحجمحممحيمجحمجممخجمخممجخهمجهممنحمنحىنجمنجىنم" + + "ينمىيممبخيتجيتجىتخيتخىتميتمىجميجحىجمىسخىصحيشحيضحيلجيلمييحييجييميمميقمين" + + "حيعميكمينجحمخيلجمكممجحيحجيمجيفميبحيسخينجيصلےقلےاللهاكبرمحمدصلعمرسولعليه" + + "وسلمصلىصلى الله عليه وسلمجل جلالهریال,:!?_{}[]#&*-<>\\$%@ـًـَـُـِـّـْءآ" + + "أؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهويلآلألإلا\x22'/^|~¢£¬¦¥ːˑʙɓʣꭦʥʤɖɗᶑɘɞʩɤɢ" + + "ɠʛʜɧʄʪʫꞎɮʎøɶɷɺɾʀʨʦꭧʧʈⱱʏʡʢʘǀǁǂ𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱𝅘𝅥𝅲𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯ıȷαεζηκ" + + "λμνξοστυψ∇∂ϝабгежзиклмпруфхцчшыэюꚉәіјөүӏґѕџҫꙑұٮڡٯ0,1,2,3,4,5,6,7,8,9,(a" + + ")(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y" + + ")(z)〔s〕wzhvsdppvwcmcmdmrdjほかココサ手字双デ二多解天交映無料前後再新初終生販声吹演投捕一三遊左中右指走打禁空合満有月申" + + "割営配〔本〕〔三〕〔二〕〔安〕〔点〕〔打〕〔盗〕〔勝〕〔敗〕得可丽丸乁你侮侻倂偺備僧像㒞免兔兤具㒹內冗冤仌冬况凵刃㓟刻剆剷㔕勇勉勤勺包匆北卉" + + "卑博即卽卿灰及叟叫叱吆咞吸呈周咢哶唐啓啣善喙喫喳嗂圖嘆圗噑噴切壮城埴堍型堲報墬売壷夆夢奢姬娛娧姘婦㛮嬈嬾寃寘寧寳寿将尢㞁屠屮峀岍嵃嵮嵫嵼巡巢" + + "㠯巽帨帽幩㡢㡼庰庳庶廊廾舁弢㣇形彫㣣徚忍志忹悁㤺㤜悔惇慈慌慎慺憎憲憤憯懞懲懶成戛扝抱拔捐挽拼捨掃揤搢揅掩㨮摩摾撝摷㩬敏敬旣書晉㬙暑㬈㫤冒冕最" + + "暜肭䏙朗望朡杞杓㭉柺枅桒梅梎栟椔㮝楂榣槪檨櫛㰘次歔㱎歲殟殺殻汎沿泍汧洖派海流浩浸涅洴港湮㴳滋滇淹潮濆瀹瀞瀛㶖灊災灷炭煅熜爨爵牐犀犕獺王㺬玥㺸" + + "瑇瑜瑱璅瓊㼛甤甾異瘐㿼䀈直眞真睊䀹瞋䁆䂖硎碌磌䃣祖福秫䄯穀穊穏䈂篆築䈧糒䊠糨糣紀絣䌁緇縂繅䌴䍙罺羕翺者聠聰䏕育脃䐋脾媵舄辞䑫芑芋芝劳花芳芽苦" + + "若茝荣莭茣莽菧著荓菊菌菜䔫蓱蓳蔖蕤䕝䕡䕫虐虜虧虩蚩蚈蜎蛢蝹蜨蝫螆蟡蠁䗹衠衣裗裞䘵裺㒻䚾䛇誠諭變豕貫賁贛起跋趼跰軔輸邔郱鄑鄛鈸鋗鋘鉼鏹鐕開䦕閷" + + "䧦雃嶲霣䩮䩶韠䪲頋頩飢䬳餩馧駂駾䯎鬒鱀鳽䳎䳭鵧䳸麻䵖黹黾鼅鼏鼖鼻" + +var mappingIndex = []uint16{ // 1729 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0001, 0x0004, 0x0005, 0x0008, 0x0009, 0x000a, + 0x000d, 0x0010, 0x0011, 0x0012, 0x0017, 0x001c, 0x0021, 0x0024, + 0x0027, 0x002a, 0x002b, 0x002e, 0x0031, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048, + 0x004b, 0x004c, 0x004d, 0x0051, 0x0054, 0x0055, 0x005a, 0x005e, + 0x0062, 0x0066, 0x006a, 0x006e, 0x0074, 0x007a, 0x0080, 0x0086, + 0x008c, 0x0092, 0x0098, 0x009e, 0x00a4, 0x00aa, 0x00b0, 0x00b6, + 0x00bc, 0x00c2, 0x00c8, 0x00ce, 0x00d4, 0x00da, 0x00e0, 0x00e6, + // Entry 40 - 7F + 0x00ec, 0x00f2, 0x00f8, 0x00fe, 0x0104, 0x010a, 0x0110, 0x0116, + 0x011c, 0x0122, 0x0128, 0x012e, 0x0137, 0x013d, 0x0146, 0x014c, + 0x0152, 0x0158, 0x015e, 0x0164, 0x016a, 0x0170, 0x0172, 0x0174, + 0x0176, 0x0178, 0x017a, 0x017c, 0x017e, 0x0180, 0x0181, 0x0182, + 0x0183, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018c, + 0x018d, 0x018e, 0x018f, 0x0191, 0x0193, 0x0195, 0x0197, 0x0199, + 0x019b, 0x019d, 0x019f, 0x01a0, 0x01a2, 0x01a4, 0x01a6, 0x01a8, + 0x01aa, 0x01ac, 0x01ae, 0x01b0, 0x01b1, 0x01b3, 0x01b5, 0x01b6, + // Entry 80 - BF + 0x01b8, 0x01ba, 0x01bc, 0x01be, 0x01c0, 0x01c2, 0x01c4, 0x01c6, + 0x01c8, 0x01ca, 0x01cc, 0x01ce, 0x01d0, 0x01d2, 0x01d4, 0x01d6, + 0x01d8, 0x01da, 0x01dc, 0x01de, 0x01e0, 0x01e2, 0x01e4, 0x01e5, + 0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, 0x01f1, 0x01f3, 0x01f5, + 0x01f7, 0x01f9, 0x01fb, 0x01fd, 0x0202, 0x0207, 0x020c, 0x0211, + 0x0216, 0x021b, 0x0220, 0x0225, 0x022a, 0x022f, 0x0234, 0x0239, + 0x023e, 0x0243, 0x0248, 0x024d, 0x0252, 0x0257, 0x025c, 0x0261, + 0x0266, 0x026b, 0x0270, 0x0275, 0x027a, 0x027e, 0x0282, 0x0287, + // Entry C0 - FF + 0x0289, 0x028e, 0x0293, 0x0297, 0x029b, 0x02a0, 0x02a5, 0x02aa, + 0x02af, 0x02b1, 0x02b6, 0x02bb, 0x02c0, 0x02c2, 0x02c7, 0x02c8, + 0x02cd, 0x02d1, 0x02d5, 0x02da, 0x02e0, 0x02e9, 0x02ef, 0x02f8, + 0x02fa, 0x02fc, 0x02fe, 0x0300, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0319, 0x031b, 0x031d, 0x031e, 0x0320, 0x0322, 0x0324, 0x0326, + 0x0328, 0x032a, 0x032c, 0x032e, 0x0330, 0x0335, 0x033a, 0x0340, + 0x0345, 0x034a, 0x034f, 0x0354, 0x0359, 0x035e, 0x0363, 0x0368, + // Entry 100 - 13F + 0x036d, 0x0372, 0x0377, 0x037c, 0x0380, 0x0382, 0x0384, 0x0386, + 0x038a, 0x038c, 0x038e, 0x0393, 0x0399, 0x03a2, 0x03a8, 0x03b1, + 0x03b3, 0x03b5, 0x03b7, 0x03b9, 0x03bb, 0x03bd, 0x03bf, 0x03c1, + 0x03c3, 0x03c5, 0x03c7, 0x03cb, 0x03cf, 0x03d3, 0x03d7, 0x03db, + 0x03df, 0x03e3, 0x03e7, 0x03eb, 0x03ef, 0x03f3, 0x03ff, 0x0401, + 0x0406, 0x0408, 0x040a, 0x040c, 0x040e, 0x040f, 0x0413, 0x0417, + 0x041d, 0x0423, 0x0428, 0x042d, 0x0432, 0x0437, 0x043c, 0x0441, + 0x0446, 0x044b, 0x0450, 0x0455, 0x045a, 0x045f, 0x0464, 0x0469, + // Entry 140 - 17F + 0x046e, 0x0473, 0x0478, 0x047d, 0x0482, 0x0487, 0x048c, 0x0491, + 0x0496, 0x049b, 0x04a0, 0x04a5, 0x04aa, 0x04af, 0x04b4, 0x04bc, + 0x04c4, 0x04c9, 0x04ce, 0x04d3, 0x04d8, 0x04dd, 0x04e2, 0x04e7, + 0x04ec, 0x04f1, 0x04f6, 0x04fb, 0x0500, 0x0505, 0x050a, 0x050f, + 0x0514, 0x0519, 0x051e, 0x0523, 0x0528, 0x052d, 0x0532, 0x0537, + 0x053c, 0x0541, 0x0546, 0x054b, 0x0550, 0x0555, 0x055a, 0x055f, + 0x0564, 0x0569, 0x056e, 0x0573, 0x0578, 0x057a, 0x057c, 0x057e, + 0x0580, 0x0582, 0x0584, 0x0586, 0x0588, 0x058a, 0x058c, 0x058e, + // Entry 180 - 1BF + 0x0590, 0x0592, 0x0594, 0x0596, 0x059c, 0x05a2, 0x05a4, 0x05a6, + 0x05a8, 0x05aa, 0x05ac, 0x05ae, 0x05b0, 0x05b2, 0x05b4, 0x05b6, + 0x05b8, 0x05ba, 0x05bc, 0x05be, 0x05c0, 0x05c4, 0x05c8, 0x05cc, + 0x05d0, 0x05d4, 0x05d8, 0x05dc, 0x05e0, 0x05e4, 0x05e9, 0x05ee, + 0x05f3, 0x05f5, 0x05f7, 0x05fd, 0x0609, 0x0615, 0x0621, 0x062a, + 0x0636, 0x063f, 0x0648, 0x0657, 0x0663, 0x066c, 0x0675, 0x067e, + 0x068a, 0x0696, 0x069f, 0x06a8, 0x06ae, 0x06b7, 0x06c3, 0x06cf, + 0x06d5, 0x06e4, 0x06f6, 0x0705, 0x070e, 0x071d, 0x072c, 0x0738, + // Entry 1C0 - 1FF + 0x0741, 0x074a, 0x0753, 0x075f, 0x076e, 0x077a, 0x0783, 0x078c, + 0x0795, 0x079b, 0x07a1, 0x07a7, 0x07ad, 0x07b6, 0x07bf, 0x07ce, + 0x07d7, 0x07e3, 0x07f2, 0x07fb, 0x0801, 0x0807, 0x0816, 0x0822, + 0x0831, 0x083a, 0x0849, 0x084f, 0x0858, 0x0861, 0x086a, 0x0873, + 0x087c, 0x0888, 0x0891, 0x0897, 0x08a0, 0x08a9, 0x08b2, 0x08be, + 0x08c7, 0x08d0, 0x08d9, 0x08e8, 0x08f4, 0x08fa, 0x0909, 0x090f, + 0x091b, 0x0927, 0x0930, 0x0939, 0x0942, 0x094e, 0x0954, 0x095d, + 0x0969, 0x096f, 0x097e, 0x0987, 0x098b, 0x098f, 0x0993, 0x0997, + // Entry 200 - 23F + 0x099b, 0x099f, 0x09a3, 0x09a7, 0x09ab, 0x09af, 0x09b4, 0x09b9, + 0x09be, 0x09c3, 0x09c8, 0x09cd, 0x09d2, 0x09d7, 0x09dc, 0x09e1, + 0x09e6, 0x09eb, 0x09f0, 0x09f5, 0x09fa, 0x09fc, 0x09fe, 0x0a00, + 0x0a02, 0x0a04, 0x0a06, 0x0a0c, 0x0a12, 0x0a18, 0x0a1e, 0x0a2a, + 0x0a2c, 0x0a2e, 0x0a30, 0x0a32, 0x0a34, 0x0a36, 0x0a38, 0x0a3c, + 0x0a3e, 0x0a40, 0x0a42, 0x0a44, 0x0a46, 0x0a48, 0x0a4a, 0x0a4c, + 0x0a4e, 0x0a50, 0x0a52, 0x0a54, 0x0a56, 0x0a58, 0x0a5a, 0x0a5f, + 0x0a65, 0x0a6c, 0x0a74, 0x0a76, 0x0a78, 0x0a7a, 0x0a7c, 0x0a7e, + // Entry 240 - 27F + 0x0a80, 0x0a82, 0x0a84, 0x0a86, 0x0a88, 0x0a8a, 0x0a8c, 0x0a8e, + 0x0a90, 0x0a96, 0x0a98, 0x0a9a, 0x0a9c, 0x0a9e, 0x0aa0, 0x0aa2, + 0x0aa4, 0x0aa6, 0x0aa8, 0x0aaa, 0x0aac, 0x0aae, 0x0ab0, 0x0ab2, + 0x0ab4, 0x0ab9, 0x0abe, 0x0ac2, 0x0ac6, 0x0aca, 0x0ace, 0x0ad2, + 0x0ad6, 0x0ada, 0x0ade, 0x0ae2, 0x0ae7, 0x0aec, 0x0af1, 0x0af6, + 0x0afb, 0x0b00, 0x0b05, 0x0b0a, 0x0b0f, 0x0b14, 0x0b19, 0x0b1e, + 0x0b23, 0x0b28, 0x0b2d, 0x0b32, 0x0b37, 0x0b3c, 0x0b41, 0x0b46, + 0x0b4b, 0x0b50, 0x0b52, 0x0b54, 0x0b56, 0x0b58, 0x0b5a, 0x0b5c, + // Entry 280 - 2BF + 0x0b5e, 0x0b62, 0x0b66, 0x0b6a, 0x0b6e, 0x0b72, 0x0b76, 0x0b7a, + 0x0b7c, 0x0b7e, 0x0b80, 0x0b82, 0x0b86, 0x0b8a, 0x0b8e, 0x0b92, + 0x0b96, 0x0b9a, 0x0b9e, 0x0ba0, 0x0ba2, 0x0ba4, 0x0ba6, 0x0ba8, + 0x0baa, 0x0bac, 0x0bb0, 0x0bb4, 0x0bba, 0x0bc0, 0x0bc4, 0x0bc8, + 0x0bcc, 0x0bd0, 0x0bd4, 0x0bd8, 0x0bdc, 0x0be0, 0x0be4, 0x0be8, + 0x0bec, 0x0bf0, 0x0bf4, 0x0bf8, 0x0bfc, 0x0c00, 0x0c04, 0x0c08, + 0x0c0c, 0x0c10, 0x0c14, 0x0c18, 0x0c1c, 0x0c20, 0x0c24, 0x0c28, + 0x0c2c, 0x0c30, 0x0c34, 0x0c36, 0x0c38, 0x0c3a, 0x0c3c, 0x0c3e, + // Entry 2C0 - 2FF + 0x0c40, 0x0c42, 0x0c44, 0x0c46, 0x0c48, 0x0c4a, 0x0c4c, 0x0c4e, + 0x0c50, 0x0c52, 0x0c54, 0x0c56, 0x0c58, 0x0c5a, 0x0c5c, 0x0c5e, + 0x0c60, 0x0c62, 0x0c64, 0x0c66, 0x0c68, 0x0c6a, 0x0c6c, 0x0c6e, + 0x0c70, 0x0c72, 0x0c74, 0x0c76, 0x0c78, 0x0c7a, 0x0c7c, 0x0c7e, + 0x0c80, 0x0c82, 0x0c86, 0x0c8a, 0x0c8e, 0x0c92, 0x0c96, 0x0c9a, + 0x0c9e, 0x0ca2, 0x0ca4, 0x0ca8, 0x0cac, 0x0cb0, 0x0cb4, 0x0cb8, + 0x0cbc, 0x0cc0, 0x0cc4, 0x0cc8, 0x0ccc, 0x0cd0, 0x0cd4, 0x0cd8, + 0x0cdc, 0x0ce0, 0x0ce4, 0x0ce8, 0x0cec, 0x0cf0, 0x0cf4, 0x0cf8, + // Entry 300 - 33F + 0x0cfc, 0x0d00, 0x0d04, 0x0d08, 0x0d0c, 0x0d10, 0x0d14, 0x0d18, + 0x0d1c, 0x0d20, 0x0d24, 0x0d28, 0x0d2c, 0x0d30, 0x0d34, 0x0d38, + 0x0d3c, 0x0d40, 0x0d44, 0x0d48, 0x0d4c, 0x0d50, 0x0d54, 0x0d58, + 0x0d5c, 0x0d60, 0x0d64, 0x0d68, 0x0d6c, 0x0d70, 0x0d74, 0x0d78, + 0x0d7c, 0x0d80, 0x0d84, 0x0d88, 0x0d8c, 0x0d90, 0x0d94, 0x0d98, + 0x0d9c, 0x0da0, 0x0da4, 0x0da8, 0x0dac, 0x0db0, 0x0db4, 0x0db8, + 0x0dbc, 0x0dc0, 0x0dc4, 0x0dc8, 0x0dcc, 0x0dd0, 0x0dd4, 0x0dd8, + 0x0ddc, 0x0de0, 0x0de4, 0x0de8, 0x0dec, 0x0df0, 0x0df4, 0x0df8, + // Entry 340 - 37F + 0x0dfc, 0x0e00, 0x0e04, 0x0e08, 0x0e0c, 0x0e10, 0x0e14, 0x0e18, + 0x0e1d, 0x0e22, 0x0e27, 0x0e2c, 0x0e31, 0x0e36, 0x0e3a, 0x0e3e, + 0x0e42, 0x0e46, 0x0e4a, 0x0e4e, 0x0e52, 0x0e56, 0x0e5a, 0x0e5e, + 0x0e62, 0x0e66, 0x0e6a, 0x0e6e, 0x0e72, 0x0e76, 0x0e7a, 0x0e7e, + 0x0e82, 0x0e86, 0x0e8a, 0x0e8e, 0x0e92, 0x0e96, 0x0e9a, 0x0e9e, + 0x0ea2, 0x0ea6, 0x0eaa, 0x0eae, 0x0eb2, 0x0eb6, 0x0ebc, 0x0ec2, + 0x0ec8, 0x0ecc, 0x0ed0, 0x0ed4, 0x0ed8, 0x0edc, 0x0ee0, 0x0ee4, + 0x0ee8, 0x0eec, 0x0ef0, 0x0ef4, 0x0ef8, 0x0efc, 0x0f00, 0x0f04, + // Entry 380 - 3BF + 0x0f08, 0x0f0c, 0x0f10, 0x0f14, 0x0f18, 0x0f1c, 0x0f20, 0x0f24, + 0x0f28, 0x0f2c, 0x0f30, 0x0f34, 0x0f38, 0x0f3e, 0x0f44, 0x0f4a, + 0x0f50, 0x0f56, 0x0f5c, 0x0f62, 0x0f68, 0x0f6e, 0x0f74, 0x0f7a, + 0x0f80, 0x0f86, 0x0f8c, 0x0f92, 0x0f98, 0x0f9e, 0x0fa4, 0x0faa, + 0x0fb0, 0x0fb6, 0x0fbc, 0x0fc2, 0x0fc8, 0x0fce, 0x0fd4, 0x0fda, + 0x0fe0, 0x0fe6, 0x0fec, 0x0ff2, 0x0ff8, 0x0ffe, 0x1004, 0x100a, + 0x1010, 0x1016, 0x101c, 0x1022, 0x1028, 0x102e, 0x1034, 0x103a, + 0x1040, 0x1046, 0x104c, 0x1052, 0x1058, 0x105e, 0x1064, 0x106a, + // Entry 3C0 - 3FF + 0x1070, 0x1076, 0x107c, 0x1082, 0x1088, 0x108e, 0x1094, 0x109a, + 0x10a0, 0x10a6, 0x10ac, 0x10b2, 0x10b8, 0x10be, 0x10c4, 0x10ca, + 0x10d0, 0x10d6, 0x10dc, 0x10e2, 0x10e8, 0x10ee, 0x10f4, 0x10fa, + 0x1100, 0x1106, 0x110c, 0x1112, 0x1118, 0x111e, 0x1124, 0x112a, + 0x1130, 0x1136, 0x113c, 0x1142, 0x1148, 0x114e, 0x1154, 0x115a, + 0x1160, 0x1166, 0x116c, 0x1172, 0x1178, 0x1180, 0x1188, 0x1190, + 0x1198, 0x11a0, 0x11a8, 0x11b0, 0x11b6, 0x11d7, 0x11e6, 0x11ee, + 0x11ef, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6, + // Entry 400 - 43F + 0x11f7, 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, + 0x11ff, 0x1200, 0x1201, 0x1205, 0x1209, 0x120d, 0x1211, 0x1215, + 0x1219, 0x121b, 0x121d, 0x121f, 0x1221, 0x1223, 0x1225, 0x1227, + 0x1229, 0x122b, 0x122d, 0x122f, 0x1231, 0x1233, 0x1235, 0x1237, + 0x1239, 0x123b, 0x123d, 0x123f, 0x1241, 0x1243, 0x1245, 0x1247, + 0x1249, 0x124b, 0x124d, 0x124f, 0x1251, 0x1253, 0x1255, 0x1257, + 0x1259, 0x125b, 0x125d, 0x125f, 0x1263, 0x1267, 0x126b, 0x126f, + 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1277, 0x1279, + // Entry 440 - 47F + 0x127b, 0x127d, 0x127f, 0x1281, 0x1283, 0x1285, 0x1287, 0x1289, + 0x128c, 0x128e, 0x1290, 0x1292, 0x1294, 0x1297, 0x1299, 0x129b, + 0x129d, 0x129f, 0x12a1, 0x12a3, 0x12a5, 0x12a7, 0x12a9, 0x12ab, + 0x12ad, 0x12af, 0x12b2, 0x12b4, 0x12b6, 0x12b8, 0x12ba, 0x12bc, + 0x12be, 0x12c0, 0x12c2, 0x12c4, 0x12c6, 0x12c9, 0x12cb, 0x12cd, + 0x12d0, 0x12d2, 0x12d4, 0x12d6, 0x12d8, 0x12da, 0x12dc, 0x12de, + 0x12e6, 0x12ee, 0x12fa, 0x1306, 0x1312, 0x131e, 0x132a, 0x1332, + 0x133a, 0x1346, 0x1352, 0x135e, 0x136a, 0x136c, 0x136e, 0x1370, + // Entry 480 - 4BF + 0x1372, 0x1374, 0x1376, 0x1378, 0x137a, 0x137c, 0x137e, 0x1380, + 0x1382, 0x1384, 0x1386, 0x1388, 0x138a, 0x138d, 0x1390, 0x1392, + 0x1394, 0x1396, 0x1398, 0x139a, 0x139c, 0x139e, 0x13a0, 0x13a2, + 0x13a4, 0x13a6, 0x13a8, 0x13aa, 0x13ac, 0x13ae, 0x13b0, 0x13b2, + 0x13b4, 0x13b6, 0x13b8, 0x13ba, 0x13bc, 0x13bf, 0x13c1, 0x13c3, + 0x13c5, 0x13c7, 0x13c9, 0x13cb, 0x13cd, 0x13cf, 0x13d1, 0x13d3, + 0x13d6, 0x13d8, 0x13da, 0x13dc, 0x13de, 0x13e0, 0x13e2, 0x13e4, + 0x13e6, 0x13e8, 0x13ea, 0x13ec, 0x13ee, 0x13f0, 0x13f2, 0x13f5, + // Entry 4C0 - 4FF + 0x13f8, 0x13fb, 0x13fe, 0x1401, 0x1404, 0x1407, 0x140a, 0x140d, + 0x1410, 0x1413, 0x1416, 0x1419, 0x141c, 0x141f, 0x1422, 0x1425, + 0x1428, 0x142b, 0x142e, 0x1431, 0x1434, 0x1437, 0x143a, 0x143d, + 0x1440, 0x1447, 0x1449, 0x144b, 0x144d, 0x1450, 0x1452, 0x1454, + 0x1456, 0x1458, 0x145a, 0x1460, 0x1466, 0x1469, 0x146c, 0x146f, + 0x1472, 0x1475, 0x1478, 0x147b, 0x147e, 0x1481, 0x1484, 0x1487, + 0x148a, 0x148d, 0x1490, 0x1493, 0x1496, 0x1499, 0x149c, 0x149f, + 0x14a2, 0x14a5, 0x14a8, 0x14ab, 0x14ae, 0x14b1, 0x14b4, 0x14b7, + // Entry 500 - 53F + 0x14ba, 0x14bd, 0x14c0, 0x14c3, 0x14c6, 0x14c9, 0x14cc, 0x14cf, + 0x14d2, 0x14d5, 0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4, 0x14e7, + 0x14ea, 0x14ed, 0x14f6, 0x14ff, 0x1508, 0x1511, 0x151a, 0x1523, + 0x152c, 0x1535, 0x153e, 0x1541, 0x1544, 0x1547, 0x154a, 0x154d, + 0x1550, 0x1553, 0x1556, 0x1559, 0x155c, 0x155f, 0x1562, 0x1565, + 0x1568, 0x156b, 0x156e, 0x1571, 0x1574, 0x1577, 0x157a, 0x157d, + 0x1580, 0x1583, 0x1586, 0x1589, 0x158c, 0x158f, 0x1592, 0x1595, + 0x1598, 0x159b, 0x159e, 0x15a1, 0x15a4, 0x15a7, 0x15aa, 0x15ad, + // Entry 540 - 57F + 0x15b0, 0x15b3, 0x15b6, 0x15b9, 0x15bc, 0x15bf, 0x15c2, 0x15c5, + 0x15c8, 0x15cb, 0x15ce, 0x15d1, 0x15d4, 0x15d7, 0x15da, 0x15dd, + 0x15e0, 0x15e3, 0x15e6, 0x15e9, 0x15ec, 0x15ef, 0x15f2, 0x15f5, + 0x15f8, 0x15fb, 0x15fe, 0x1601, 0x1604, 0x1607, 0x160a, 0x160d, + 0x1610, 0x1613, 0x1616, 0x1619, 0x161c, 0x161f, 0x1622, 0x1625, + 0x1628, 0x162b, 0x162e, 0x1631, 0x1634, 0x1637, 0x163a, 0x163d, + 0x1640, 0x1643, 0x1646, 0x1649, 0x164c, 0x164f, 0x1652, 0x1655, + 0x1658, 0x165b, 0x165e, 0x1661, 0x1664, 0x1667, 0x166a, 0x166d, + // Entry 580 - 5BF + 0x1670, 0x1673, 0x1676, 0x1679, 0x167c, 0x167f, 0x1682, 0x1685, + 0x1688, 0x168b, 0x168e, 0x1691, 0x1694, 0x1697, 0x169a, 0x169d, + 0x16a0, 0x16a3, 0x16a6, 0x16a9, 0x16ac, 0x16af, 0x16b2, 0x16b5, + 0x16b8, 0x16bb, 0x16be, 0x16c1, 0x16c4, 0x16c7, 0x16ca, 0x16cd, + 0x16d0, 0x16d3, 0x16d6, 0x16d9, 0x16dc, 0x16df, 0x16e2, 0x16e5, + 0x16e8, 0x16eb, 0x16ee, 0x16f1, 0x16f4, 0x16f7, 0x16fa, 0x16fd, + 0x1700, 0x1703, 0x1706, 0x1709, 0x170c, 0x170f, 0x1712, 0x1715, + 0x1718, 0x171b, 0x171e, 0x1721, 0x1724, 0x1727, 0x172a, 0x172d, + // Entry 5C0 - 5FF + 0x1730, 0x1733, 0x1736, 0x1739, 0x173c, 0x173f, 0x1742, 0x1745, + 0x1748, 0x174b, 0x174e, 0x1751, 0x1754, 0x1757, 0x175a, 0x175d, + 0x1760, 0x1763, 0x1766, 0x1769, 0x176c, 0x176f, 0x1772, 0x1775, + 0x1778, 0x177b, 0x177e, 0x1781, 0x1784, 0x1787, 0x178a, 0x178d, + 0x1790, 0x1793, 0x1796, 0x1799, 0x179c, 0x179f, 0x17a2, 0x17a5, + 0x17a8, 0x17ab, 0x17ae, 0x17b1, 0x17b4, 0x17b7, 0x17ba, 0x17bd, + 0x17c0, 0x17c3, 0x17c6, 0x17c9, 0x17cc, 0x17cf, 0x17d2, 0x17d5, + 0x17d8, 0x17db, 0x17de, 0x17e1, 0x17e4, 0x17e7, 0x17ea, 0x17ed, + // Entry 600 - 63F + 0x17f0, 0x17f3, 0x17f6, 0x17f9, 0x17fc, 0x17ff, 0x1802, 0x1805, + 0x1808, 0x180b, 0x180e, 0x1811, 0x1814, 0x1817, 0x181a, 0x181d, + 0x1820, 0x1823, 0x1826, 0x1829, 0x182c, 0x182f, 0x1832, 0x1835, + 0x1838, 0x183b, 0x183e, 0x1841, 0x1844, 0x1847, 0x184a, 0x184d, + 0x1850, 0x1853, 0x1856, 0x1859, 0x185c, 0x185f, 0x1862, 0x1865, + 0x1868, 0x186b, 0x186e, 0x1871, 0x1874, 0x1877, 0x187a, 0x187d, + 0x1880, 0x1883, 0x1886, 0x1889, 0x188c, 0x188f, 0x1892, 0x1895, + 0x1898, 0x189b, 0x189e, 0x18a1, 0x18a4, 0x18a7, 0x18aa, 0x18ad, + // Entry 640 - 67F + 0x18b0, 0x18b3, 0x18b6, 0x18b9, 0x18bc, 0x18bf, 0x18c2, 0x18c5, + 0x18c8, 0x18cb, 0x18ce, 0x18d1, 0x18d4, 0x18d7, 0x18da, 0x18dd, + 0x18e0, 0x18e3, 0x18e6, 0x18e9, 0x18ec, 0x18ef, 0x18f2, 0x18f5, + 0x18f8, 0x18fb, 0x18fe, 0x1901, 0x1904, 0x1907, 0x190a, 0x190d, + 0x1910, 0x1913, 0x1916, 0x1919, 0x191c, 0x191f, 0x1922, 0x1925, + 0x1928, 0x192b, 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, + 0x1940, 0x1943, 0x1946, 0x1949, 0x194c, 0x194f, 0x1952, 0x1955, + 0x1958, 0x195b, 0x195e, 0x1961, 0x1964, 0x1967, 0x196a, 0x196d, + // Entry 680 - 6BF + 0x1970, 0x1973, 0x1976, 0x1979, 0x197c, 0x197f, 0x1982, 0x1985, + 0x1988, 0x198b, 0x198e, 0x1991, 0x1994, 0x1997, 0x199a, 0x199d, + 0x19a0, 0x19a3, 0x19a6, 0x19a9, 0x19ac, 0x19af, 0x19b2, 0x19b5, + 0x19b8, 0x19bb, 0x19be, 0x19c1, 0x19c4, 0x19c7, 0x19ca, 0x19cd, + 0x19d0, 0x19d3, 0x19d6, 0x19d9, 0x19dc, 0x19df, 0x19e2, 0x19e5, + 0x19e8, 0x19eb, 0x19ee, 0x19f1, 0x19f4, 0x19f7, 0x19fa, 0x19fd, + 0x1a00, 0x1a03, 0x1a06, 0x1a09, 0x1a0c, 0x1a0f, 0x1a12, 0x1a15, + 0x1a18, 0x1a1b, 0x1a1e, 0x1a21, 0x1a24, 0x1a27, 0x1a2a, 0x1a2d, + // Entry 6C0 - 6FF + 0x1a30, +} // Size: 3482 bytes + +var xorData string = "" + // Size: 4907 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\x021\x00\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" + + "\x044\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 \x03\x0b)\x08\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\x07:+\x03\x07\x07*\x03\x06&\x1c\x03" + + "\x09\x0c\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06" + + "!3\x03\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05" + + "\x03\x07<2\x03\x06\x1c>\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=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" + + "\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" + + "\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\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\x03'\x02\x03)\x02\x03+" + + "\x02\x03/\x02\x03\x19\x02\x03\x1b\x02\x03\x1f\x03\x0d\x22\x18\x03\x0d" + + "\x22\x1a\x03\x0d\x22'\x03\x0d\x22/\x03\x0d\x223\x03\x0d\x22$\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\x06" + + "71\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: 31598 bytes (30.86 KiB). Checksum: d3118eda0d6b5360. +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 < 133: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 133 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 135 blocks, 8640 entries, 17280 bytes +// The third block is the zero block. +var idnaValues = [8640]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: 0x0012, 0xe9: 0x0018, + 0xea: 0x0019, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x0022, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0029, 0xf3: 0x0031, 0xf4: 0x003a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x0042, 0xf9: 0x0049, 0xfa: 0x0051, 0xfb: 0x0018, + 0xfc: 0x0059, 0xfd: 0x0061, 0xfe: 0x0069, 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: 0x0071, 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: 0x0079, + // Block 0x5, offset 0x140 + 0x140: 0x0079, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x0081, 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: 0x0089, + // 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: 0x0091, 0x1c5: 0x0091, + 0x1c6: 0x0091, 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: 0x0099, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x00a1, 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: 0x00d2, 0x259: 0x00da, 0x25a: 0x00e2, 0x25b: 0x00ea, 0x25c: 0x00f2, 0x25d: 0x00fa, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0101, 0x262: 0x0089, 0x263: 0x0109, + 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: 0x3308, 0x283: 0x03f5, 0x284: 0x0111, 0x285: 0x040d, + 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, + 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, + 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, + 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, + 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, + 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, + 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x011a, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x0122, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x003a, 0x2c5: 0x012a, + 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: 0x3308, 0x384: 0x3308, 0x385: 0x3308, + 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 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: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, + 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, + 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, + 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0818, + 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, + 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, + 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, + 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, + 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, + 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, + // Block 0x12, offset 0x480 + 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, + 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, + 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, + 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, + 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, + 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, + 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, + 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0139, + 0x4b6: 0x0141, 0x4b7: 0x0149, 0x4b8: 0x0151, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, + 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, + 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, + 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, + 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, + 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, + 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, + 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, + 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, + 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, + 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, + // Block 0x14, offset 0x500 + 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, + 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, + 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, + 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, + 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, + 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, + 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, + 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, + 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, + 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, + 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, + // Block 0x15, offset 0x540 + 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08, + 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08, + 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08, + 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0c08, 0x557: 0x0c08, + 0x558: 0x0c08, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040, + 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08, + 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08, + 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040, + 0x570: 0x0c08, 0x571: 0x0c08, 0x572: 0x0c08, 0x573: 0x0c08, 0x574: 0x0c08, 0x575: 0x0c08, + 0x576: 0x0c08, 0x577: 0x0c08, 0x578: 0x0c08, 0x579: 0x0c08, 0x57a: 0x0c08, 0x57b: 0x0c08, + 0x57c: 0x0c08, 0x57d: 0x0c08, 0x57e: 0x0c08, 0x57f: 0x0c08, + // Block 0x16, offset 0x580 + 0x580: 0x0c08, 0x581: 0x0c08, 0x582: 0x0c08, 0x583: 0x0808, 0x584: 0x0808, 0x585: 0x0808, + 0x586: 0x0a08, 0x587: 0x0808, 0x588: 0x0818, 0x589: 0x0a08, 0x58a: 0x0a08, 0x58b: 0x0a08, + 0x58c: 0x0a08, 0x58d: 0x0a08, 0x58e: 0x0c08, 0x58f: 0x0040, 0x590: 0x0840, 0x591: 0x0840, + 0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x0040, + 0x598: 0x3308, 0x599: 0x3308, 0x59a: 0x3308, 0x59b: 0x3308, 0x59c: 0x3308, 0x59d: 0x3308, + 0x59e: 0x3308, 0x59f: 0x3308, 0x5a0: 0x0a08, 0x5a1: 0x0a08, 0x5a2: 0x0a08, 0x5a3: 0x0a08, + 0x5a4: 0x0a08, 0x5a5: 0x0a08, 0x5a6: 0x0a08, 0x5a7: 0x0a08, 0x5a8: 0x0a08, 0x5a9: 0x0a08, + 0x5aa: 0x0c08, 0x5ab: 0x0c08, 0x5ac: 0x0c08, 0x5ad: 0x0808, 0x5ae: 0x0c08, 0x5af: 0x0a08, + 0x5b0: 0x0a08, 0x5b1: 0x0c08, 0x5b2: 0x0c08, 0x5b3: 0x0a08, 0x5b4: 0x0a08, 0x5b5: 0x0a08, + 0x5b6: 0x0a08, 0x5b7: 0x0a08, 0x5b8: 0x0a08, 0x5b9: 0x0c08, 0x5ba: 0x0a08, 0x5bb: 0x0a08, + 0x5bc: 0x0a08, 0x5bd: 0x0a08, 0x5be: 0x0a08, 0x5bf: 0x0a08, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3008, 0x5c1: 0x3308, 0x5c2: 0x3308, 0x5c3: 0x3308, 0x5c4: 0x3308, 0x5c5: 0x3308, + 0x5c6: 0x3308, 0x5c7: 0x3308, 0x5c8: 0x3308, 0x5c9: 0x3008, 0x5ca: 0x3008, 0x5cb: 0x3008, + 0x5cc: 0x3008, 0x5cd: 0x3b08, 0x5ce: 0x3008, 0x5cf: 0x3008, 0x5d0: 0x0008, 0x5d1: 0x3308, + 0x5d2: 0x3308, 0x5d3: 0x3308, 0x5d4: 0x3308, 0x5d5: 0x3308, 0x5d6: 0x3308, 0x5d7: 0x3308, + 0x5d8: 0x0159, 0x5d9: 0x0161, 0x5da: 0x0169, 0x5db: 0x0171, 0x5dc: 0x0179, 0x5dd: 0x0181, + 0x5de: 0x0189, 0x5df: 0x0191, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x3308, 0x5e3: 0x3308, + 0x5e4: 0x0018, 0x5e5: 0x0018, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0008, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0018, 0x5f1: 0x0008, 0x5f2: 0x0008, 0x5f3: 0x0008, 0x5f4: 0x0008, 0x5f5: 0x0008, + 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0008, 0x5fb: 0x0008, + 0x5fc: 0x0008, 0x5fd: 0x0008, 0x5fe: 0x0008, 0x5ff: 0x0008, + // Block 0x18, offset 0x600 + 0x600: 0x0008, 0x601: 0x3308, 0x602: 0x3008, 0x603: 0x3008, 0x604: 0x0040, 0x605: 0x0008, + 0x606: 0x0008, 0x607: 0x0008, 0x608: 0x0008, 0x609: 0x0008, 0x60a: 0x0008, 0x60b: 0x0008, + 0x60c: 0x0008, 0x60d: 0x0040, 0x60e: 0x0040, 0x60f: 0x0008, 0x610: 0x0008, 0x611: 0x0040, + 0x612: 0x0040, 0x613: 0x0008, 0x614: 0x0008, 0x615: 0x0008, 0x616: 0x0008, 0x617: 0x0008, + 0x618: 0x0008, 0x619: 0x0008, 0x61a: 0x0008, 0x61b: 0x0008, 0x61c: 0x0008, 0x61d: 0x0008, + 0x61e: 0x0008, 0x61f: 0x0008, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x0008, 0x623: 0x0008, + 0x624: 0x0008, 0x625: 0x0008, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0040, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, 0x631: 0x0040, 0x632: 0x0008, 0x633: 0x0040, 0x634: 0x0040, 0x635: 0x0040, + 0x636: 0x0008, 0x637: 0x0008, 0x638: 0x0008, 0x639: 0x0008, 0x63a: 0x0040, 0x63b: 0x0040, + 0x63c: 0x3308, 0x63d: 0x0008, 0x63e: 0x3008, 0x63f: 0x3008, + // Block 0x19, offset 0x640 + 0x640: 0x3008, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3308, 0x644: 0x3308, 0x645: 0x0040, + 0x646: 0x0040, 0x647: 0x3008, 0x648: 0x3008, 0x649: 0x0040, 0x64a: 0x0040, 0x64b: 0x3008, + 0x64c: 0x3008, 0x64d: 0x3b08, 0x64e: 0x0008, 0x64f: 0x0040, 0x650: 0x0040, 0x651: 0x0040, + 0x652: 0x0040, 0x653: 0x0040, 0x654: 0x0040, 0x655: 0x0040, 0x656: 0x0040, 0x657: 0x3008, + 0x658: 0x0040, 0x659: 0x0040, 0x65a: 0x0040, 0x65b: 0x0040, 0x65c: 0x0199, 0x65d: 0x01a1, + 0x65e: 0x0040, 0x65f: 0x01a9, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x3308, 0x663: 0x3308, + 0x664: 0x0040, 0x665: 0x0040, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0008, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0008, 0x672: 0x0018, 0x673: 0x0018, 0x674: 0x0018, 0x675: 0x0018, + 0x676: 0x0018, 0x677: 0x0018, 0x678: 0x0018, 0x679: 0x0018, 0x67a: 0x0018, 0x67b: 0x0018, + 0x67c: 0x0008, 0x67d: 0x0018, 0x67e: 0x3308, 0x67f: 0x0040, + // Block 0x1a, offset 0x680 + 0x680: 0x0040, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x3008, 0x684: 0x0040, 0x685: 0x0008, + 0x686: 0x0008, 0x687: 0x0008, 0x688: 0x0008, 0x689: 0x0008, 0x68a: 0x0008, 0x68b: 0x0040, + 0x68c: 0x0040, 0x68d: 0x0040, 0x68e: 0x0040, 0x68f: 0x0008, 0x690: 0x0008, 0x691: 0x0040, + 0x692: 0x0040, 0x693: 0x0008, 0x694: 0x0008, 0x695: 0x0008, 0x696: 0x0008, 0x697: 0x0008, + 0x698: 0x0008, 0x699: 0x0008, 0x69a: 0x0008, 0x69b: 0x0008, 0x69c: 0x0008, 0x69d: 0x0008, + 0x69e: 0x0008, 0x69f: 0x0008, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x0008, 0x6a3: 0x0008, + 0x6a4: 0x0008, 0x6a5: 0x0008, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0040, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x0008, 0x6b1: 0x0040, 0x6b2: 0x0008, 0x6b3: 0x01b1, 0x6b4: 0x0040, 0x6b5: 0x0008, + 0x6b6: 0x01b9, 0x6b7: 0x0040, 0x6b8: 0x0008, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x3308, 0x6bd: 0x0040, 0x6be: 0x3008, 0x6bf: 0x3008, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3008, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x0040, 0x6c4: 0x0040, 0x6c5: 0x0040, + 0x6c6: 0x0040, 0x6c7: 0x3308, 0x6c8: 0x3308, 0x6c9: 0x0040, 0x6ca: 0x0040, 0x6cb: 0x3308, + 0x6cc: 0x3308, 0x6cd: 0x3b08, 0x6ce: 0x0040, 0x6cf: 0x0040, 0x6d0: 0x0040, 0x6d1: 0x3308, + 0x6d2: 0x0040, 0x6d3: 0x0040, 0x6d4: 0x0040, 0x6d5: 0x0040, 0x6d6: 0x0040, 0x6d7: 0x0040, + 0x6d8: 0x0040, 0x6d9: 0x01c1, 0x6da: 0x01c9, 0x6db: 0x01d1, 0x6dc: 0x0008, 0x6dd: 0x0040, + 0x6de: 0x01d9, 0x6df: 0x0040, 0x6e0: 0x0040, 0x6e1: 0x0040, 0x6e2: 0x0040, 0x6e3: 0x0040, + 0x6e4: 0x0040, 0x6e5: 0x0040, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0008, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x3308, 0x6f1: 0x3308, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0008, 0x6f5: 0x3308, + 0x6f6: 0x0018, 0x6f7: 0x0040, 0x6f8: 0x0040, 0x6f9: 0x0040, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x0040, 0x6fd: 0x0040, 0x6fe: 0x0040, 0x6ff: 0x0040, + // Block 0x1c, offset 0x700 + 0x700: 0x0040, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3008, 0x704: 0x0040, 0x705: 0x0008, + 0x706: 0x0008, 0x707: 0x0008, 0x708: 0x0008, 0x709: 0x0008, 0x70a: 0x0008, 0x70b: 0x0008, + 0x70c: 0x0008, 0x70d: 0x0008, 0x70e: 0x0040, 0x70f: 0x0008, 0x710: 0x0008, 0x711: 0x0008, + 0x712: 0x0040, 0x713: 0x0008, 0x714: 0x0008, 0x715: 0x0008, 0x716: 0x0008, 0x717: 0x0008, + 0x718: 0x0008, 0x719: 0x0008, 0x71a: 0x0008, 0x71b: 0x0008, 0x71c: 0x0008, 0x71d: 0x0008, + 0x71e: 0x0008, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x0008, 0x723: 0x0008, + 0x724: 0x0008, 0x725: 0x0008, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0040, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0008, 0x731: 0x0040, 0x732: 0x0008, 0x733: 0x0008, 0x734: 0x0040, 0x735: 0x0008, + 0x736: 0x0008, 0x737: 0x0008, 0x738: 0x0008, 0x739: 0x0008, 0x73a: 0x0040, 0x73b: 0x0040, + 0x73c: 0x3308, 0x73d: 0x0008, 0x73e: 0x3008, 0x73f: 0x3008, + // Block 0x1d, offset 0x740 + 0x740: 0x3008, 0x741: 0x3308, 0x742: 0x3308, 0x743: 0x3308, 0x744: 0x3308, 0x745: 0x3308, + 0x746: 0x0040, 0x747: 0x3308, 0x748: 0x3308, 0x749: 0x3008, 0x74a: 0x0040, 0x74b: 0x3008, + 0x74c: 0x3008, 0x74d: 0x3b08, 0x74e: 0x0040, 0x74f: 0x0040, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0040, 0x753: 0x0040, 0x754: 0x0040, 0x755: 0x0040, 0x756: 0x0040, 0x757: 0x0040, + 0x758: 0x0040, 0x759: 0x0040, 0x75a: 0x0040, 0x75b: 0x0040, 0x75c: 0x0040, 0x75d: 0x0040, + 0x75e: 0x0040, 0x75f: 0x0040, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x3308, 0x763: 0x3308, + 0x764: 0x0040, 0x765: 0x0040, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0008, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0018, 0x771: 0x0018, 0x772: 0x0040, 0x773: 0x0040, 0x774: 0x0040, 0x775: 0x0040, + 0x776: 0x0040, 0x777: 0x0040, 0x778: 0x0040, 0x779: 0x0008, 0x77a: 0x3308, 0x77b: 0x3308, + 0x77c: 0x3308, 0x77d: 0x3308, 0x77e: 0x3308, 0x77f: 0x3308, + // Block 0x1e, offset 0x780 + 0x780: 0x0040, 0x781: 0x3308, 0x782: 0x3008, 0x783: 0x3008, 0x784: 0x0040, 0x785: 0x0008, + 0x786: 0x0008, 0x787: 0x0008, 0x788: 0x0008, 0x789: 0x0008, 0x78a: 0x0008, 0x78b: 0x0008, + 0x78c: 0x0008, 0x78d: 0x0040, 0x78e: 0x0040, 0x78f: 0x0008, 0x790: 0x0008, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0008, 0x794: 0x0008, 0x795: 0x0008, 0x796: 0x0008, 0x797: 0x0008, + 0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0008, 0x79c: 0x0008, 0x79d: 0x0008, + 0x79e: 0x0008, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x0008, 0x7a3: 0x0008, + 0x7a4: 0x0008, 0x7a5: 0x0008, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0040, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0008, 0x7b1: 0x0040, 0x7b2: 0x0008, 0x7b3: 0x0008, 0x7b4: 0x0040, 0x7b5: 0x0008, + 0x7b6: 0x0008, 0x7b7: 0x0008, 0x7b8: 0x0008, 0x7b9: 0x0008, 0x7ba: 0x0040, 0x7bb: 0x0040, + 0x7bc: 0x3308, 0x7bd: 0x0008, 0x7be: 0x3008, 0x7bf: 0x3308, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x3008, 0x7c1: 0x3308, 0x7c2: 0x3308, 0x7c3: 0x3308, 0x7c4: 0x3308, 0x7c5: 0x0040, + 0x7c6: 0x0040, 0x7c7: 0x3008, 0x7c8: 0x3008, 0x7c9: 0x0040, 0x7ca: 0x0040, 0x7cb: 0x3008, + 0x7cc: 0x3008, 0x7cd: 0x3b08, 0x7ce: 0x0040, 0x7cf: 0x0040, 0x7d0: 0x0040, 0x7d1: 0x0040, + 0x7d2: 0x0040, 0x7d3: 0x0040, 0x7d4: 0x0040, 0x7d5: 0x3308, 0x7d6: 0x3308, 0x7d7: 0x3008, + 0x7d8: 0x0040, 0x7d9: 0x0040, 0x7da: 0x0040, 0x7db: 0x0040, 0x7dc: 0x01e1, 0x7dd: 0x01e9, + 0x7de: 0x0040, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x3308, 0x7e3: 0x3308, + 0x7e4: 0x0040, 0x7e5: 0x0040, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0008, + 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0018, 0x7f1: 0x0008, 0x7f2: 0x0018, 0x7f3: 0x0018, 0x7f4: 0x0018, 0x7f5: 0x0018, + 0x7f6: 0x0018, 0x7f7: 0x0018, 0x7f8: 0x0040, 0x7f9: 0x0040, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x0040, 0x7ff: 0x0040, + // Block 0x20, offset 0x800 + 0x800: 0x0040, 0x801: 0x0040, 0x802: 0x3308, 0x803: 0x0008, 0x804: 0x0040, 0x805: 0x0008, + 0x806: 0x0008, 0x807: 0x0008, 0x808: 0x0008, 0x809: 0x0008, 0x80a: 0x0008, 0x80b: 0x0040, + 0x80c: 0x0040, 0x80d: 0x0040, 0x80e: 0x0008, 0x80f: 0x0008, 0x810: 0x0008, 0x811: 0x0040, + 0x812: 0x0008, 0x813: 0x0008, 0x814: 0x0008, 0x815: 0x0008, 0x816: 0x0040, 0x817: 0x0040, + 0x818: 0x0040, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0008, 0x81d: 0x0040, + 0x81e: 0x0008, 0x81f: 0x0008, 0x820: 0x0040, 0x821: 0x0040, 0x822: 0x0040, 0x823: 0x0008, + 0x824: 0x0008, 0x825: 0x0040, 0x826: 0x0040, 0x827: 0x0040, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0040, 0x82c: 0x0040, 0x82d: 0x0040, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0008, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0008, 0x834: 0x0008, 0x835: 0x0008, + 0x836: 0x0008, 0x837: 0x0008, 0x838: 0x0008, 0x839: 0x0008, 0x83a: 0x0040, 0x83b: 0x0040, + 0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x3008, 0x83f: 0x3008, + // Block 0x21, offset 0x840 + 0x840: 0x3308, 0x841: 0x3008, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x3008, 0x845: 0x0040, + 0x846: 0x3308, 0x847: 0x3308, 0x848: 0x3308, 0x849: 0x0040, 0x84a: 0x3308, 0x84b: 0x3308, + 0x84c: 0x3308, 0x84d: 0x3b08, 0x84e: 0x0040, 0x84f: 0x0040, 0x850: 0x0040, 0x851: 0x0040, + 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0040, 0x855: 0x3308, 0x856: 0x3308, 0x857: 0x0040, + 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0040, 0x85c: 0x0040, 0x85d: 0x0008, + 0x85e: 0x0040, 0x85f: 0x0040, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x3308, 0x863: 0x3308, + 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: 0x0040, 0x871: 0x0040, 0x872: 0x0040, 0x873: 0x0040, 0x874: 0x0040, 0x875: 0x0040, + 0x876: 0x0040, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0018, 0x87b: 0x0018, + 0x87c: 0x0018, 0x87d: 0x0018, 0x87e: 0x0018, 0x87f: 0x0018, + // Block 0x22, offset 0x880 + 0x880: 0x0008, 0x881: 0x3308, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x0018, 0x885: 0x0008, + 0x886: 0x0008, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0008, 0x88a: 0x0008, 0x88b: 0x0008, + 0x88c: 0x0008, 0x88d: 0x0040, 0x88e: 0x0008, 0x88f: 0x0008, 0x890: 0x0008, 0x891: 0x0040, + 0x892: 0x0008, 0x893: 0x0008, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008, + 0x898: 0x0008, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008, + 0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008, + 0x8a4: 0x0008, 0x8a5: 0x0008, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0040, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0008, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0008, 0x8b4: 0x0040, 0x8b5: 0x0008, + 0x8b6: 0x0008, 0x8b7: 0x0008, 0x8b8: 0x0008, 0x8b9: 0x0008, 0x8ba: 0x0040, 0x8bb: 0x0040, + 0x8bc: 0x3308, 0x8bd: 0x0008, 0x8be: 0x3008, 0x8bf: 0x3308, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x3008, 0x8c1: 0x3008, 0x8c2: 0x3008, 0x8c3: 0x3008, 0x8c4: 0x3008, 0x8c5: 0x0040, + 0x8c6: 0x3308, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008, + 0x8cc: 0x3308, 0x8cd: 0x3b08, 0x8ce: 0x0040, 0x8cf: 0x0040, 0x8d0: 0x0040, 0x8d1: 0x0040, + 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0040, 0x8d5: 0x3008, 0x8d6: 0x3008, 0x8d7: 0x0040, + 0x8d8: 0x0040, 0x8d9: 0x0040, 0x8da: 0x0040, 0x8db: 0x0040, 0x8dc: 0x0040, 0x8dd: 0x0008, + 0x8de: 0x0008, 0x8df: 0x0040, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308, + 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, + 0x8f0: 0x0040, 0x8f1: 0x0008, 0x8f2: 0x0008, 0x8f3: 0x3008, 0x8f4: 0x0040, 0x8f5: 0x0040, + 0x8f6: 0x0040, 0x8f7: 0x0040, 0x8f8: 0x0040, 0x8f9: 0x0040, 0x8fa: 0x0040, 0x8fb: 0x0040, + 0x8fc: 0x0040, 0x8fd: 0x0040, 0x8fe: 0x0040, 0x8ff: 0x0040, + // Block 0x24, offset 0x900 + 0x900: 0x3008, 0x901: 0x3308, 0x902: 0x3308, 0x903: 0x3308, 0x904: 0x3308, 0x905: 0x0040, + 0x906: 0x3008, 0x907: 0x3008, 0x908: 0x3008, 0x909: 0x0040, 0x90a: 0x3008, 0x90b: 0x3008, + 0x90c: 0x3008, 0x90d: 0x3b08, 0x90e: 0x0008, 0x90f: 0x0018, 0x910: 0x0040, 0x911: 0x0040, + 0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x3008, + 0x918: 0x0018, 0x919: 0x0018, 0x91a: 0x0018, 0x91b: 0x0018, 0x91c: 0x0018, 0x91d: 0x0018, + 0x91e: 0x0018, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x3308, 0x923: 0x3308, + 0x924: 0x0040, 0x925: 0x0040, 0x926: 0x0008, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0008, + 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, + 0x930: 0x0018, 0x931: 0x0018, 0x932: 0x0018, 0x933: 0x0018, 0x934: 0x0018, 0x935: 0x0018, + 0x936: 0x0018, 0x937: 0x0018, 0x938: 0x0018, 0x939: 0x0018, 0x93a: 0x0008, 0x93b: 0x0008, + 0x93c: 0x0008, 0x93d: 0x0008, 0x93e: 0x0008, 0x93f: 0x0008, + // Block 0x25, offset 0x940 + 0x940: 0x0040, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0040, 0x944: 0x0008, 0x945: 0x0040, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0040, + 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: 0x0040, 0x965: 0x0008, 0x966: 0x0040, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0008, 0x96e: 0x0008, 0x96f: 0x0008, + 0x970: 0x0008, 0x971: 0x3308, 0x972: 0x0008, 0x973: 0x01f9, 0x974: 0x3308, 0x975: 0x3308, + 0x976: 0x3308, 0x977: 0x3308, 0x978: 0x3308, 0x979: 0x3308, 0x97a: 0x3b08, 0x97b: 0x3308, + 0x97c: 0x3308, 0x97d: 0x0008, 0x97e: 0x0040, 0x97f: 0x0040, + // Block 0x26, offset 0x980 + 0x980: 0x0008, 0x981: 0x0008, 0x982: 0x0008, 0x983: 0x0211, 0x984: 0x0008, 0x985: 0x0008, + 0x986: 0x0008, 0x987: 0x0008, 0x988: 0x0040, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, + 0x98c: 0x0008, 0x98d: 0x0219, 0x98e: 0x0008, 0x98f: 0x0008, 0x990: 0x0008, 0x991: 0x0008, + 0x992: 0x0221, 0x993: 0x0008, 0x994: 0x0008, 0x995: 0x0008, 0x996: 0x0008, 0x997: 0x0229, + 0x998: 0x0008, 0x999: 0x0008, 0x99a: 0x0008, 0x99b: 0x0008, 0x99c: 0x0231, 0x99d: 0x0008, + 0x99e: 0x0008, 0x99f: 0x0008, 0x9a0: 0x0008, 0x9a1: 0x0008, 0x9a2: 0x0008, 0x9a3: 0x0008, + 0x9a4: 0x0008, 0x9a5: 0x0008, 0x9a6: 0x0008, 0x9a7: 0x0008, 0x9a8: 0x0008, 0x9a9: 0x0239, + 0x9aa: 0x0008, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0040, 0x9ae: 0x0040, 0x9af: 0x0040, + 0x9b0: 0x0040, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x0241, 0x9b4: 0x3308, 0x9b5: 0x0249, + 0x9b6: 0x0251, 0x9b7: 0x0259, 0x9b8: 0x0261, 0x9b9: 0x0269, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9bc: 0x3308, 0x9bd: 0x3308, 0x9be: 0x3308, 0x9bf: 0x3008, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x3308, 0x9c1: 0x0271, 0x9c2: 0x3308, 0x9c3: 0x3308, 0x9c4: 0x3b08, 0x9c5: 0x0018, + 0x9c6: 0x3308, 0x9c7: 0x3308, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x3308, 0x9ce: 0x3308, 0x9cf: 0x3308, 0x9d0: 0x3308, 0x9d1: 0x3308, + 0x9d2: 0x3308, 0x9d3: 0x0279, 0x9d4: 0x3308, 0x9d5: 0x3308, 0x9d6: 0x3308, 0x9d7: 0x3308, + 0x9d8: 0x0040, 0x9d9: 0x3308, 0x9da: 0x3308, 0x9db: 0x3308, 0x9dc: 0x3308, 0x9dd: 0x0281, + 0x9de: 0x3308, 0x9df: 0x3308, 0x9e0: 0x3308, 0x9e1: 0x3308, 0x9e2: 0x0289, 0x9e3: 0x3308, + 0x9e4: 0x3308, 0x9e5: 0x3308, 0x9e6: 0x3308, 0x9e7: 0x0291, 0x9e8: 0x3308, 0x9e9: 0x3308, + 0x9ea: 0x3308, 0x9eb: 0x3308, 0x9ec: 0x0299, 0x9ed: 0x3308, 0x9ee: 0x3308, 0x9ef: 0x3308, + 0x9f0: 0x3308, 0x9f1: 0x3308, 0x9f2: 0x3308, 0x9f3: 0x3308, 0x9f4: 0x3308, 0x9f5: 0x3308, + 0x9f6: 0x3308, 0x9f7: 0x3308, 0x9f8: 0x3308, 0x9f9: 0x02a1, 0x9fa: 0x3308, 0x9fb: 0x3308, + 0x9fc: 0x3308, 0x9fd: 0x0040, 0x9fe: 0x0018, 0x9ff: 0x0018, + // Block 0x28, offset 0xa00 + 0xa00: 0x0008, 0xa01: 0x0008, 0xa02: 0x0008, 0xa03: 0x0008, 0xa04: 0x0008, 0xa05: 0x0008, + 0xa06: 0x0008, 0xa07: 0x0008, 0xa08: 0x0008, 0xa09: 0x0008, 0xa0a: 0x0008, 0xa0b: 0x0008, + 0xa0c: 0x0008, 0xa0d: 0x0008, 0xa0e: 0x0008, 0xa0f: 0x0008, 0xa10: 0x0008, 0xa11: 0x0008, + 0xa12: 0x0008, 0xa13: 0x0008, 0xa14: 0x0008, 0xa15: 0x0008, 0xa16: 0x0008, 0xa17: 0x0008, + 0xa18: 0x0008, 0xa19: 0x0008, 0xa1a: 0x0008, 0xa1b: 0x0008, 0xa1c: 0x0008, 0xa1d: 0x0008, + 0xa1e: 0x0008, 0xa1f: 0x0008, 0xa20: 0x0008, 0xa21: 0x0008, 0xa22: 0x0008, 0xa23: 0x0008, + 0xa24: 0x0008, 0xa25: 0x0008, 0xa26: 0x0008, 0xa27: 0x0008, 0xa28: 0x0008, 0xa29: 0x0008, + 0xa2a: 0x0008, 0xa2b: 0x0008, 0xa2c: 0x0019, 0xa2d: 0x02e1, 0xa2e: 0x02e9, 0xa2f: 0x0008, + 0xa30: 0x02f1, 0xa31: 0x02f9, 0xa32: 0x0301, 0xa33: 0x0309, 0xa34: 0x00a9, 0xa35: 0x0311, + 0xa36: 0x00b1, 0xa37: 0x0319, 0xa38: 0x0101, 0xa39: 0x0321, 0xa3a: 0x0329, 0xa3b: 0x0008, + 0xa3c: 0x0051, 0xa3d: 0x0331, 0xa3e: 0x0339, 0xa3f: 0x00b9, + // Block 0x29, offset 0xa40 + 0xa40: 0x0341, 0xa41: 0x0349, 0xa42: 0x00c1, 0xa43: 0x0019, 0xa44: 0x0351, 0xa45: 0x0359, + 0xa46: 0x05b5, 0xa47: 0x02e9, 0xa48: 0x02f1, 0xa49: 0x02f9, 0xa4a: 0x0361, 0xa4b: 0x0369, + 0xa4c: 0x0371, 0xa4d: 0x0309, 0xa4e: 0x0008, 0xa4f: 0x0319, 0xa50: 0x0321, 0xa51: 0x0379, + 0xa52: 0x0051, 0xa53: 0x0381, 0xa54: 0x05cd, 0xa55: 0x05cd, 0xa56: 0x0339, 0xa57: 0x0341, + 0xa58: 0x0349, 0xa59: 0x05b5, 0xa5a: 0x0389, 0xa5b: 0x0391, 0xa5c: 0x05e5, 0xa5d: 0x0399, + 0xa5e: 0x03a1, 0xa5f: 0x03a9, 0xa60: 0x03b1, 0xa61: 0x03b9, 0xa62: 0x0311, 0xa63: 0x00b9, + 0xa64: 0x0349, 0xa65: 0x0391, 0xa66: 0x0399, 0xa67: 0x03a1, 0xa68: 0x03c1, 0xa69: 0x03b1, + 0xa6a: 0x03b9, 0xa6b: 0x0008, 0xa6c: 0x0008, 0xa6d: 0x0008, 0xa6e: 0x0008, 0xa6f: 0x0008, + 0xa70: 0x0008, 0xa71: 0x0008, 0xa72: 0x0008, 0xa73: 0x0008, 0xa74: 0x0008, 0xa75: 0x0008, + 0xa76: 0x0008, 0xa77: 0x0008, 0xa78: 0x03c9, 0xa79: 0x0008, 0xa7a: 0x0008, 0xa7b: 0x0008, + 0xa7c: 0x0008, 0xa7d: 0x0008, 0xa7e: 0x0008, 0xa7f: 0x0008, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008, + 0xa86: 0x0008, 0xa87: 0x0008, 0xa88: 0x0008, 0xa89: 0x0008, 0xa8a: 0x0008, 0xa8b: 0x0008, + 0xa8c: 0x0008, 0xa8d: 0x0008, 0xa8e: 0x0008, 0xa8f: 0x0008, 0xa90: 0x0008, 0xa91: 0x0008, + 0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008, + 0xa98: 0x0008, 0xa99: 0x0008, 0xa9a: 0x0008, 0xa9b: 0x03d1, 0xa9c: 0x03d9, 0xa9d: 0x03e1, + 0xa9e: 0x03e9, 0xa9f: 0x0371, 0xaa0: 0x03f1, 0xaa1: 0x03f9, 0xaa2: 0x0401, 0xaa3: 0x0409, + 0xaa4: 0x0411, 0xaa5: 0x0419, 0xaa6: 0x0421, 0xaa7: 0x05fd, 0xaa8: 0x0429, 0xaa9: 0x0431, + 0xaaa: 0xe17d, 0xaab: 0x0439, 0xaac: 0x0441, 0xaad: 0x0449, 0xaae: 0x0451, 0xaaf: 0x0459, + 0xab0: 0x0461, 0xab1: 0x0469, 0xab2: 0x0471, 0xab3: 0x0479, 0xab4: 0x0481, 0xab5: 0x0489, + 0xab6: 0x0491, 0xab7: 0x0499, 0xab8: 0x0615, 0xab9: 0x04a1, 0xaba: 0x04a9, 0xabb: 0x04b1, + 0xabc: 0x04b9, 0xabd: 0x04c1, 0xabe: 0x04c9, 0xabf: 0x04d1, + // Block 0x2b, offset 0xac0 + 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008, + 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008, + 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, + 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0xe00d, 0xad7: 0x0008, + 0xad8: 0xe00d, 0xad9: 0x0008, 0xada: 0xe00d, 0xadb: 0x0008, 0xadc: 0xe00d, 0xadd: 0x0008, + 0xade: 0xe00d, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, + 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, + 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, + 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008, + 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008, + // Block 0x2c, offset 0xb00 + 0xb00: 0xe00d, 0xb01: 0x0008, 0xb02: 0xe00d, 0xb03: 0x0008, 0xb04: 0xe00d, 0xb05: 0x0008, + 0xb06: 0xe00d, 0xb07: 0x0008, 0xb08: 0xe00d, 0xb09: 0x0008, 0xb0a: 0xe00d, 0xb0b: 0x0008, + 0xb0c: 0xe00d, 0xb0d: 0x0008, 0xb0e: 0xe00d, 0xb0f: 0x0008, 0xb10: 0xe00d, 0xb11: 0x0008, + 0xb12: 0xe00d, 0xb13: 0x0008, 0xb14: 0xe00d, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0x0008, 0xb19: 0x0008, 0xb1a: 0x062d, 0xb1b: 0x064d, 0xb1c: 0x0008, 0xb1d: 0x0008, + 0xb1e: 0x04d9, 0xb1f: 0x0008, 0xb20: 0xe00d, 0xb21: 0x0008, 0xb22: 0xe00d, 0xb23: 0x0008, + 0xb24: 0xe00d, 0xb25: 0x0008, 0xb26: 0xe00d, 0xb27: 0x0008, 0xb28: 0xe00d, 0xb29: 0x0008, + 0xb2a: 0xe00d, 0xb2b: 0x0008, 0xb2c: 0xe00d, 0xb2d: 0x0008, 0xb2e: 0xe00d, 0xb2f: 0x0008, + 0xb30: 0xe00d, 0xb31: 0x0008, 0xb32: 0xe00d, 0xb33: 0x0008, 0xb34: 0xe00d, 0xb35: 0x0008, + 0xb36: 0xe00d, 0xb37: 0x0008, 0xb38: 0xe00d, 0xb39: 0x0008, 0xb3a: 0xe00d, 0xb3b: 0x0008, + 0xb3c: 0xe00d, 0xb3d: 0x0008, 0xb3e: 0xe00d, 0xb3f: 0x0008, + // Block 0x2d, offset 0xb40 + 0xb40: 0x0008, 0xb41: 0x0008, 0xb42: 0x0008, 0xb43: 0x0008, 0xb44: 0x0008, 0xb45: 0x0008, + 0xb46: 0x0040, 0xb47: 0x0040, 0xb48: 0xe045, 0xb49: 0xe045, 0xb4a: 0xe045, 0xb4b: 0xe045, + 0xb4c: 0xe045, 0xb4d: 0xe045, 0xb4e: 0x0040, 0xb4f: 0x0040, 0xb50: 0x0008, 0xb51: 0x0008, + 0xb52: 0x0008, 0xb53: 0x0008, 0xb54: 0x0008, 0xb55: 0x0008, 0xb56: 0x0008, 0xb57: 0x0008, + 0xb58: 0x0040, 0xb59: 0xe045, 0xb5a: 0x0040, 0xb5b: 0xe045, 0xb5c: 0x0040, 0xb5d: 0xe045, + 0xb5e: 0x0040, 0xb5f: 0xe045, 0xb60: 0x0008, 0xb61: 0x0008, 0xb62: 0x0008, 0xb63: 0x0008, + 0xb64: 0x0008, 0xb65: 0x0008, 0xb66: 0x0008, 0xb67: 0x0008, 0xb68: 0xe045, 0xb69: 0xe045, + 0xb6a: 0xe045, 0xb6b: 0xe045, 0xb6c: 0xe045, 0xb6d: 0xe045, 0xb6e: 0xe045, 0xb6f: 0xe045, + 0xb70: 0x0008, 0xb71: 0x04e1, 0xb72: 0x0008, 0xb73: 0x04e9, 0xb74: 0x0008, 0xb75: 0x04f1, + 0xb76: 0x0008, 0xb77: 0x04f9, 0xb78: 0x0008, 0xb79: 0x0501, 0xb7a: 0x0008, 0xb7b: 0x0509, + 0xb7c: 0x0008, 0xb7d: 0x0511, 0xb7e: 0x0040, 0xb7f: 0x0040, + // Block 0x2e, offset 0xb80 + 0xb80: 0x0519, 0xb81: 0x0521, 0xb82: 0x0529, 0xb83: 0x0531, 0xb84: 0x0539, 0xb85: 0x0541, + 0xb86: 0x0549, 0xb87: 0x0551, 0xb88: 0x0519, 0xb89: 0x0521, 0xb8a: 0x0529, 0xb8b: 0x0531, + 0xb8c: 0x0539, 0xb8d: 0x0541, 0xb8e: 0x0549, 0xb8f: 0x0551, 0xb90: 0x0559, 0xb91: 0x0561, + 0xb92: 0x0569, 0xb93: 0x0571, 0xb94: 0x0579, 0xb95: 0x0581, 0xb96: 0x0589, 0xb97: 0x0591, + 0xb98: 0x0559, 0xb99: 0x0561, 0xb9a: 0x0569, 0xb9b: 0x0571, 0xb9c: 0x0579, 0xb9d: 0x0581, + 0xb9e: 0x0589, 0xb9f: 0x0591, 0xba0: 0x0599, 0xba1: 0x05a1, 0xba2: 0x05a9, 0xba3: 0x05b1, + 0xba4: 0x05b9, 0xba5: 0x05c1, 0xba6: 0x05c9, 0xba7: 0x05d1, 0xba8: 0x0599, 0xba9: 0x05a1, + 0xbaa: 0x05a9, 0xbab: 0x05b1, 0xbac: 0x05b9, 0xbad: 0x05c1, 0xbae: 0x05c9, 0xbaf: 0x05d1, + 0xbb0: 0x0008, 0xbb1: 0x0008, 0xbb2: 0x05d9, 0xbb3: 0x05e1, 0xbb4: 0x05e9, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x05f1, 0xbb8: 0xe045, 0xbb9: 0xe045, 0xbba: 0x0665, 0xbbb: 0x04e1, + 0xbbc: 0x05e1, 0xbbd: 0x067e, 0xbbe: 0x05f9, 0xbbf: 0x069e, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x06be, 0xbc1: 0x0602, 0xbc2: 0x0609, 0xbc3: 0x0611, 0xbc4: 0x0619, 0xbc5: 0x0040, + 0xbc6: 0x0008, 0xbc7: 0x0621, 0xbc8: 0x06dd, 0xbc9: 0x04e9, 0xbca: 0x06f5, 0xbcb: 0x04f1, + 0xbcc: 0x0611, 0xbcd: 0x062a, 0xbce: 0x0632, 0xbcf: 0x063a, 0xbd0: 0x0008, 0xbd1: 0x0008, + 0xbd2: 0x0008, 0xbd3: 0x0641, 0xbd4: 0x0040, 0xbd5: 0x0040, 0xbd6: 0x0008, 0xbd7: 0x0008, + 0xbd8: 0xe045, 0xbd9: 0xe045, 0xbda: 0x070d, 0xbdb: 0x04f9, 0xbdc: 0x0040, 0xbdd: 0x064a, + 0xbde: 0x0652, 0xbdf: 0x065a, 0xbe0: 0x0008, 0xbe1: 0x0008, 0xbe2: 0x0008, 0xbe3: 0x0661, + 0xbe4: 0x0008, 0xbe5: 0x0008, 0xbe6: 0x0008, 0xbe7: 0x0008, 0xbe8: 0xe045, 0xbe9: 0xe045, + 0xbea: 0x0725, 0xbeb: 0x0509, 0xbec: 0xe04d, 0xbed: 0x066a, 0xbee: 0x012a, 0xbef: 0x0672, + 0xbf0: 0x0040, 0xbf1: 0x0040, 0xbf2: 0x0679, 0xbf3: 0x0681, 0xbf4: 0x0689, 0xbf5: 0x0040, + 0xbf6: 0x0008, 0xbf7: 0x0691, 0xbf8: 0x073d, 0xbf9: 0x0501, 0xbfa: 0x0515, 0xbfb: 0x0511, + 0xbfc: 0x0681, 0xbfd: 0x0756, 0xbfe: 0x0776, 0xbff: 0x0040, + // Block 0x30, offset 0xc00 + 0xc00: 0x000a, 0xc01: 0x000a, 0xc02: 0x000a, 0xc03: 0x000a, 0xc04: 0x000a, 0xc05: 0x000a, + 0xc06: 0x000a, 0xc07: 0x000a, 0xc08: 0x000a, 0xc09: 0x000a, 0xc0a: 0x000a, 0xc0b: 0x03c0, + 0xc0c: 0x0003, 0xc0d: 0x0003, 0xc0e: 0x0340, 0xc0f: 0x0b40, 0xc10: 0x0018, 0xc11: 0xe00d, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x0796, + 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, + 0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x0018, 0xc21: 0x0018, 0xc22: 0x0018, 0xc23: 0x0018, + 0xc24: 0x0040, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0018, 0xc28: 0x0040, 0xc29: 0x0040, + 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x000a, + 0xc30: 0x0018, 0xc31: 0x0018, 0xc32: 0x0018, 0xc33: 0x0699, 0xc34: 0x06a1, 0xc35: 0x0018, + 0xc36: 0x06a9, 0xc37: 0x06b1, 0xc38: 0x0018, 0xc39: 0x0018, 0xc3a: 0x0018, 0xc3b: 0x0018, + 0xc3c: 0x06ba, 0xc3d: 0x0018, 0xc3e: 0x07b6, 0xc3f: 0x0018, + // Block 0x31, offset 0xc40 + 0xc40: 0x0018, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0018, + 0xc46: 0x0018, 0xc47: 0x06c2, 0xc48: 0x06ca, 0xc49: 0x06d2, 0xc4a: 0x0018, 0xc4b: 0x0018, + 0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0018, 0xc4f: 0x0018, 0xc50: 0x0018, 0xc51: 0x0018, + 0xc52: 0x0018, 0xc53: 0x0018, 0xc54: 0x0018, 0xc55: 0x0018, 0xc56: 0x0018, 0xc57: 0x06d9, + 0xc58: 0x0018, 0xc59: 0x0018, 0xc5a: 0x0018, 0xc5b: 0x0018, 0xc5c: 0x0018, 0xc5d: 0x0018, + 0xc5e: 0x0018, 0xc5f: 0x000a, 0xc60: 0x03c0, 0xc61: 0x0340, 0xc62: 0x0340, 0xc63: 0x0340, + 0xc64: 0x03c0, 0xc65: 0x0040, 0xc66: 0x0040, 0xc67: 0x0040, 0xc68: 0x0040, 0xc69: 0x0040, + 0xc6a: 0x0340, 0xc6b: 0x0340, 0xc6c: 0x0340, 0xc6d: 0x0340, 0xc6e: 0x0340, 0xc6f: 0x0340, + 0xc70: 0x06e1, 0xc71: 0x0311, 0xc72: 0x0040, 0xc73: 0x0040, 0xc74: 0x06e9, 0xc75: 0x06f1, + 0xc76: 0x06f9, 0xc77: 0x0701, 0xc78: 0x0709, 0xc79: 0x0711, 0xc7a: 0x071a, 0xc7b: 0x07d5, + 0xc7c: 0x0722, 0xc7d: 0x072a, 0xc7e: 0x0732, 0xc7f: 0x0329, + // Block 0x32, offset 0xc80 + 0xc80: 0x06e1, 0xc81: 0x0049, 0xc82: 0x0029, 0xc83: 0x0031, 0xc84: 0x06e9, 0xc85: 0x06f1, + 0xc86: 0x06f9, 0xc87: 0x0701, 0xc88: 0x0709, 0xc89: 0x0711, 0xc8a: 0x071a, 0xc8b: 0x07ed, + 0xc8c: 0x0722, 0xc8d: 0x072a, 0xc8e: 0x0732, 0xc8f: 0x0040, 0xc90: 0x0019, 0xc91: 0x02f9, + 0xc92: 0x0051, 0xc93: 0x0109, 0xc94: 0x0361, 0xc95: 0x00a9, 0xc96: 0x0319, 0xc97: 0x0101, + 0xc98: 0x0321, 0xc99: 0x0329, 0xc9a: 0x0339, 0xc9b: 0x0089, 0xc9c: 0x0341, 0xc9d: 0x0040, + 0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x0018, 0xca1: 0x0018, 0xca2: 0x0018, 0xca3: 0x0018, + 0xca4: 0x0018, 0xca5: 0x0018, 0xca6: 0x0018, 0xca7: 0x0018, 0xca8: 0x0739, 0xca9: 0x0018, + 0xcaa: 0x0018, 0xcab: 0x0018, 0xcac: 0x0018, 0xcad: 0x0018, 0xcae: 0x0018, 0xcaf: 0x0018, + 0xcb0: 0x0018, 0xcb1: 0x0018, 0xcb2: 0x0018, 0xcb3: 0x0018, 0xcb4: 0x0018, 0xcb5: 0x0018, + 0xcb6: 0x0018, 0xcb7: 0x0018, 0xcb8: 0x0018, 0xcb9: 0x0018, 0xcba: 0x0018, 0xcbb: 0x0018, + 0xcbc: 0x0018, 0xcbd: 0x0018, 0xcbe: 0x0018, 0xcbf: 0x0018, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x0806, 0xcc1: 0x0826, 0xcc2: 0x03d9, 0xcc3: 0x0845, 0xcc4: 0x0018, 0xcc5: 0x0866, + 0xcc6: 0x0886, 0xcc7: 0x0369, 0xcc8: 0x0018, 0xcc9: 0x08a5, 0xcca: 0x0309, 0xccb: 0x00a9, + 0xccc: 0x00a9, 0xccd: 0x00a9, 0xcce: 0x00a9, 0xccf: 0x0741, 0xcd0: 0x0311, 0xcd1: 0x0311, + 0xcd2: 0x0101, 0xcd3: 0x0101, 0xcd4: 0x0018, 0xcd5: 0x0329, 0xcd6: 0x0749, 0xcd7: 0x0018, + 0xcd8: 0x0018, 0xcd9: 0x0339, 0xcda: 0x0751, 0xcdb: 0x00b9, 0xcdc: 0x00b9, 0xcdd: 0x00b9, + 0xcde: 0x0018, 0xcdf: 0x0018, 0xce0: 0x0759, 0xce1: 0x08c5, 0xce2: 0x0761, 0xce3: 0x0018, + 0xce4: 0x04b1, 0xce5: 0x0018, 0xce6: 0x0769, 0xce7: 0x0018, 0xce8: 0x04b1, 0xce9: 0x0018, + 0xcea: 0x0319, 0xceb: 0x0771, 0xcec: 0x02e9, 0xced: 0x03d9, 0xcee: 0x0018, 0xcef: 0x02f9, + 0xcf0: 0x02f9, 0xcf1: 0x03f1, 0xcf2: 0x0040, 0xcf3: 0x0321, 0xcf4: 0x0051, 0xcf5: 0x0779, + 0xcf6: 0x0781, 0xcf7: 0x0789, 0xcf8: 0x0791, 0xcf9: 0x0311, 0xcfa: 0x0018, 0xcfb: 0x08e5, + 0xcfc: 0x0799, 0xcfd: 0x03a1, 0xcfe: 0x03a1, 0xcff: 0x0799, + // Block 0x34, offset 0xd00 + 0xd00: 0x0905, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x02f1, + 0xd06: 0x02f1, 0xd07: 0x02f9, 0xd08: 0x0311, 0xd09: 0x00b1, 0xd0a: 0x0018, 0xd0b: 0x0018, + 0xd0c: 0x0018, 0xd0d: 0x0018, 0xd0e: 0x0008, 0xd0f: 0x0018, 0xd10: 0x07a1, 0xd11: 0x07a9, + 0xd12: 0x07b1, 0xd13: 0x07b9, 0xd14: 0x07c1, 0xd15: 0x07c9, 0xd16: 0x07d1, 0xd17: 0x07d9, + 0xd18: 0x07e1, 0xd19: 0x07e9, 0xd1a: 0x07f1, 0xd1b: 0x07f9, 0xd1c: 0x0801, 0xd1d: 0x0809, + 0xd1e: 0x0811, 0xd1f: 0x0819, 0xd20: 0x0311, 0xd21: 0x0821, 0xd22: 0x091d, 0xd23: 0x0829, + 0xd24: 0x0391, 0xd25: 0x0831, 0xd26: 0x093d, 0xd27: 0x0839, 0xd28: 0x0841, 0xd29: 0x0109, + 0xd2a: 0x0849, 0xd2b: 0x095d, 0xd2c: 0x0101, 0xd2d: 0x03d9, 0xd2e: 0x02f1, 0xd2f: 0x0321, + 0xd30: 0x0311, 0xd31: 0x0821, 0xd32: 0x097d, 0xd33: 0x0829, 0xd34: 0x0391, 0xd35: 0x0831, + 0xd36: 0x099d, 0xd37: 0x0839, 0xd38: 0x0841, 0xd39: 0x0109, 0xd3a: 0x0849, 0xd3b: 0x09bd, + 0xd3c: 0x0101, 0xd3d: 0x03d9, 0xd3e: 0x02f1, 0xd3f: 0x0321, + // Block 0x35, offset 0xd40 + 0xd40: 0x0018, 0xd41: 0x0018, 0xd42: 0x0018, 0xd43: 0x0018, 0xd44: 0x0018, 0xd45: 0x0018, + 0xd46: 0x0018, 0xd47: 0x0018, 0xd48: 0x0018, 0xd49: 0x0018, 0xd4a: 0x0018, 0xd4b: 0x0040, + 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, + 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, + 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0040, 0xd5d: 0x0040, + 0xd5e: 0x0040, 0xd5f: 0x0040, 0xd60: 0x0049, 0xd61: 0x0029, 0xd62: 0x0031, 0xd63: 0x06e9, + 0xd64: 0x06f1, 0xd65: 0x06f9, 0xd66: 0x0701, 0xd67: 0x0709, 0xd68: 0x0711, 0xd69: 0x0879, + 0xd6a: 0x0881, 0xd6b: 0x0889, 0xd6c: 0x0891, 0xd6d: 0x0899, 0xd6e: 0x08a1, 0xd6f: 0x08a9, + 0xd70: 0x08b1, 0xd71: 0x08b9, 0xd72: 0x08c1, 0xd73: 0x08c9, 0xd74: 0x0a1e, 0xd75: 0x0a3e, + 0xd76: 0x0a5e, 0xd77: 0x0a7e, 0xd78: 0x0a9e, 0xd79: 0x0abe, 0xd7a: 0x0ade, 0xd7b: 0x0afe, + 0xd7c: 0x0b1e, 0xd7d: 0x08d2, 0xd7e: 0x08da, 0xd7f: 0x08e2, + // Block 0x36, offset 0xd80 + 0xd80: 0x08ea, 0xd81: 0x08f2, 0xd82: 0x08fa, 0xd83: 0x0902, 0xd84: 0x090a, 0xd85: 0x0912, + 0xd86: 0x091a, 0xd87: 0x0922, 0xd88: 0x0040, 0xd89: 0x0040, 0xd8a: 0x0040, 0xd8b: 0x0040, + 0xd8c: 0x0040, 0xd8d: 0x0040, 0xd8e: 0x0040, 0xd8f: 0x0040, 0xd90: 0x0040, 0xd91: 0x0040, + 0xd92: 0x0040, 0xd93: 0x0040, 0xd94: 0x0040, 0xd95: 0x0040, 0xd96: 0x0040, 0xd97: 0x0040, + 0xd98: 0x0040, 0xd99: 0x0040, 0xd9a: 0x0040, 0xd9b: 0x0040, 0xd9c: 0x0b3e, 0xd9d: 0x0b5e, + 0xd9e: 0x0b7e, 0xd9f: 0x0b9e, 0xda0: 0x0bbe, 0xda1: 0x0bde, 0xda2: 0x0bfe, 0xda3: 0x0c1e, + 0xda4: 0x0c3e, 0xda5: 0x0c5e, 0xda6: 0x0c7e, 0xda7: 0x0c9e, 0xda8: 0x0cbe, 0xda9: 0x0cde, + 0xdaa: 0x0cfe, 0xdab: 0x0d1e, 0xdac: 0x0d3e, 0xdad: 0x0d5e, 0xdae: 0x0d7e, 0xdaf: 0x0d9e, + 0xdb0: 0x0dbe, 0xdb1: 0x0dde, 0xdb2: 0x0dfe, 0xdb3: 0x0e1e, 0xdb4: 0x0e3e, 0xdb5: 0x0e5e, + 0xdb6: 0x0019, 0xdb7: 0x02e9, 0xdb8: 0x03d9, 0xdb9: 0x02f1, 0xdba: 0x02f9, 0xdbb: 0x03f1, + 0xdbc: 0x0309, 0xdbd: 0x00a9, 0xdbe: 0x0311, 0xdbf: 0x00b1, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0319, 0xdc1: 0x0101, 0xdc2: 0x0321, 0xdc3: 0x0329, 0xdc4: 0x0051, 0xdc5: 0x0339, + 0xdc6: 0x0751, 0xdc7: 0x00b9, 0xdc8: 0x0089, 0xdc9: 0x0341, 0xdca: 0x0349, 0xdcb: 0x0391, + 0xdcc: 0x00c1, 0xdcd: 0x0109, 0xdce: 0x00c9, 0xdcf: 0x04b1, 0xdd0: 0x0019, 0xdd1: 0x02e9, + 0xdd2: 0x03d9, 0xdd3: 0x02f1, 0xdd4: 0x02f9, 0xdd5: 0x03f1, 0xdd6: 0x0309, 0xdd7: 0x00a9, + 0xdd8: 0x0311, 0xdd9: 0x00b1, 0xdda: 0x0319, 0xddb: 0x0101, 0xddc: 0x0321, 0xddd: 0x0329, + 0xdde: 0x0051, 0xddf: 0x0339, 0xde0: 0x0751, 0xde1: 0x00b9, 0xde2: 0x0089, 0xde3: 0x0341, + 0xde4: 0x0349, 0xde5: 0x0391, 0xde6: 0x00c1, 0xde7: 0x0109, 0xde8: 0x00c9, 0xde9: 0x04b1, + 0xdea: 0x06e1, 0xdeb: 0x0018, 0xdec: 0x0018, 0xded: 0x0018, 0xdee: 0x0018, 0xdef: 0x0018, + 0xdf0: 0x0018, 0xdf1: 0x0018, 0xdf2: 0x0018, 0xdf3: 0x0018, 0xdf4: 0x0018, 0xdf5: 0x0018, + 0xdf6: 0x0018, 0xdf7: 0x0018, 0xdf8: 0x0018, 0xdf9: 0x0018, 0xdfa: 0x0018, 0xdfb: 0x0018, + 0xdfc: 0x0018, 0xdfd: 0x0018, 0xdfe: 0x0018, 0xdff: 0x0018, + // Block 0x38, offset 0xe00 + 0xe00: 0x0008, 0xe01: 0x0008, 0xe02: 0x0008, 0xe03: 0x0008, 0xe04: 0x0008, 0xe05: 0x0008, + 0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0008, 0xe09: 0x0008, 0xe0a: 0x0008, 0xe0b: 0x0008, + 0xe0c: 0x0008, 0xe0d: 0x0008, 0xe0e: 0x0008, 0xe0f: 0x0008, 0xe10: 0x0008, 0xe11: 0x0008, + 0xe12: 0x0008, 0xe13: 0x0008, 0xe14: 0x0008, 0xe15: 0x0008, 0xe16: 0x0008, 0xe17: 0x0008, + 0xe18: 0x0008, 0xe19: 0x0008, 0xe1a: 0x0008, 0xe1b: 0x0008, 0xe1c: 0x0008, 0xe1d: 0x0008, + 0xe1e: 0x0008, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0x0941, 0xe23: 0x0ed5, + 0xe24: 0x0949, 0xe25: 0x0008, 0xe26: 0x0008, 0xe27: 0xe07d, 0xe28: 0x0008, 0xe29: 0xe01d, + 0xe2a: 0x0008, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0x0359, 0xe2e: 0x0441, 0xe2f: 0x0351, + 0xe30: 0x03d1, 0xe31: 0x0008, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0008, 0xe35: 0xe01d, + 0xe36: 0x0008, 0xe37: 0x0008, 0xe38: 0x0008, 0xe39: 0x0008, 0xe3a: 0x0008, 0xe3b: 0x0008, + 0xe3c: 0x00b1, 0xe3d: 0x0391, 0xe3e: 0x0951, 0xe3f: 0x0959, + // Block 0x39, offset 0xe40 + 0xe40: 0xe00d, 0xe41: 0x0008, 0xe42: 0xe00d, 0xe43: 0x0008, 0xe44: 0xe00d, 0xe45: 0x0008, + 0xe46: 0xe00d, 0xe47: 0x0008, 0xe48: 0xe00d, 0xe49: 0x0008, 0xe4a: 0xe00d, 0xe4b: 0x0008, + 0xe4c: 0xe00d, 0xe4d: 0x0008, 0xe4e: 0xe00d, 0xe4f: 0x0008, 0xe50: 0xe00d, 0xe51: 0x0008, + 0xe52: 0xe00d, 0xe53: 0x0008, 0xe54: 0xe00d, 0xe55: 0x0008, 0xe56: 0xe00d, 0xe57: 0x0008, + 0xe58: 0xe00d, 0xe59: 0x0008, 0xe5a: 0xe00d, 0xe5b: 0x0008, 0xe5c: 0xe00d, 0xe5d: 0x0008, + 0xe5e: 0xe00d, 0xe5f: 0x0008, 0xe60: 0xe00d, 0xe61: 0x0008, 0xe62: 0xe00d, 0xe63: 0x0008, + 0xe64: 0x0008, 0xe65: 0x0018, 0xe66: 0x0018, 0xe67: 0x0018, 0xe68: 0x0018, 0xe69: 0x0018, + 0xe6a: 0x0018, 0xe6b: 0xe03d, 0xe6c: 0x0008, 0xe6d: 0xe01d, 0xe6e: 0x0008, 0xe6f: 0x3308, + 0xe70: 0x3308, 0xe71: 0x3308, 0xe72: 0xe00d, 0xe73: 0x0008, 0xe74: 0x0040, 0xe75: 0x0040, + 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0018, 0xe7a: 0x0018, 0xe7b: 0x0018, + 0xe7c: 0x0018, 0xe7d: 0x0018, 0xe7e: 0x0018, 0xe7f: 0x0018, + // Block 0x3a, offset 0xe80 + 0xe80: 0x2715, 0xe81: 0x2735, 0xe82: 0x2755, 0xe83: 0x2775, 0xe84: 0x2795, 0xe85: 0x27b5, + 0xe86: 0x27d5, 0xe87: 0x27f5, 0xe88: 0x2815, 0xe89: 0x2835, 0xe8a: 0x2855, 0xe8b: 0x2875, + 0xe8c: 0x2895, 0xe8d: 0x28b5, 0xe8e: 0x28d5, 0xe8f: 0x28f5, 0xe90: 0x2915, 0xe91: 0x2935, + 0xe92: 0x2955, 0xe93: 0x2975, 0xe94: 0x2995, 0xe95: 0x29b5, 0xe96: 0x0040, 0xe97: 0x0040, + 0xe98: 0x0040, 0xe99: 0x0040, 0xe9a: 0x0040, 0xe9b: 0x0040, 0xe9c: 0x0040, 0xe9d: 0x0040, + 0xe9e: 0x0040, 0xe9f: 0x0040, 0xea0: 0x0040, 0xea1: 0x0040, 0xea2: 0x0040, 0xea3: 0x0040, + 0xea4: 0x0040, 0xea5: 0x0040, 0xea6: 0x0040, 0xea7: 0x0040, 0xea8: 0x0040, 0xea9: 0x0040, + 0xeaa: 0x0040, 0xeab: 0x0040, 0xeac: 0x0040, 0xead: 0x0040, 0xeae: 0x0040, 0xeaf: 0x0040, + 0xeb0: 0x0040, 0xeb1: 0x0040, 0xeb2: 0x0040, 0xeb3: 0x0040, 0xeb4: 0x0040, 0xeb5: 0x0040, + 0xeb6: 0x0040, 0xeb7: 0x0040, 0xeb8: 0x0040, 0xeb9: 0x0040, 0xeba: 0x0040, 0xebb: 0x0040, + 0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040, + // Block 0x3b, offset 0xec0 + 0xec0: 0x000a, 0xec1: 0x0018, 0xec2: 0x0961, 0xec3: 0x0018, 0xec4: 0x0018, 0xec5: 0x0008, + 0xec6: 0x0008, 0xec7: 0x0008, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018, + 0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x0018, 0xed1: 0x0018, + 0xed2: 0x0018, 0xed3: 0x0018, 0xed4: 0x0018, 0xed5: 0x0018, 0xed6: 0x0018, 0xed7: 0x0018, + 0xed8: 0x0018, 0xed9: 0x0018, 0xeda: 0x0018, 0xedb: 0x0018, 0xedc: 0x0018, 0xedd: 0x0018, + 0xede: 0x0018, 0xedf: 0x0018, 0xee0: 0x0018, 0xee1: 0x0018, 0xee2: 0x0018, 0xee3: 0x0018, + 0xee4: 0x0018, 0xee5: 0x0018, 0xee6: 0x0018, 0xee7: 0x0018, 0xee8: 0x0018, 0xee9: 0x0018, + 0xeea: 0x3308, 0xeeb: 0x3308, 0xeec: 0x3308, 0xeed: 0x3308, 0xeee: 0x3018, 0xeef: 0x3018, + 0xef0: 0x0018, 0xef1: 0x0018, 0xef2: 0x0018, 0xef3: 0x0018, 0xef4: 0x0018, 0xef5: 0x0018, + 0xef6: 0xe125, 0xef7: 0x0018, 0xef8: 0x29d5, 0xef9: 0x29f5, 0xefa: 0x2a15, 0xefb: 0x0018, + 0xefc: 0x0008, 0xefd: 0x0018, 0xefe: 0x0018, 0xeff: 0x0018, + // Block 0x3c, offset 0xf00 + 0xf00: 0x2b55, 0xf01: 0x2b75, 0xf02: 0x2b95, 0xf03: 0x2bb5, 0xf04: 0x2bd5, 0xf05: 0x2bf5, + 0xf06: 0x2bf5, 0xf07: 0x2bf5, 0xf08: 0x2c15, 0xf09: 0x2c15, 0xf0a: 0x2c15, 0xf0b: 0x2c15, + 0xf0c: 0x2c35, 0xf0d: 0x2c35, 0xf0e: 0x2c35, 0xf0f: 0x2c55, 0xf10: 0x2c75, 0xf11: 0x2c75, + 0xf12: 0x2a95, 0xf13: 0x2a95, 0xf14: 0x2c75, 0xf15: 0x2c75, 0xf16: 0x2c95, 0xf17: 0x2c95, + 0xf18: 0x2c75, 0xf19: 0x2c75, 0xf1a: 0x2a95, 0xf1b: 0x2a95, 0xf1c: 0x2c75, 0xf1d: 0x2c75, + 0xf1e: 0x2c55, 0xf1f: 0x2c55, 0xf20: 0x2cb5, 0xf21: 0x2cb5, 0xf22: 0x2cd5, 0xf23: 0x2cd5, + 0xf24: 0x0040, 0xf25: 0x2cf5, 0xf26: 0x2d15, 0xf27: 0x2d35, 0xf28: 0x2d35, 0xf29: 0x2d55, + 0xf2a: 0x2d75, 0xf2b: 0x2d95, 0xf2c: 0x2db5, 0xf2d: 0x2dd5, 0xf2e: 0x2df5, 0xf2f: 0x2e15, + 0xf30: 0x2e35, 0xf31: 0x2e55, 0xf32: 0x2e55, 0xf33: 0x2e75, 0xf34: 0x2e95, 0xf35: 0x2e95, + 0xf36: 0x2eb5, 0xf37: 0x2ed5, 0xf38: 0x2e75, 0xf39: 0x2ef5, 0xf3a: 0x2f15, 0xf3b: 0x2ef5, + 0xf3c: 0x2e75, 0xf3d: 0x2f35, 0xf3e: 0x2f55, 0xf3f: 0x2f75, + // Block 0x3d, offset 0xf40 + 0xf40: 0x2f95, 0xf41: 0x2fb5, 0xf42: 0x2d15, 0xf43: 0x2cf5, 0xf44: 0x2fd5, 0xf45: 0x2ff5, + 0xf46: 0x3015, 0xf47: 0x3035, 0xf48: 0x3055, 0xf49: 0x3075, 0xf4a: 0x3095, 0xf4b: 0x30b5, + 0xf4c: 0x30d5, 0xf4d: 0x30f5, 0xf4e: 0x3115, 0xf4f: 0x0040, 0xf50: 0x0018, 0xf51: 0x0018, + 0xf52: 0x3135, 0xf53: 0x3155, 0xf54: 0x3175, 0xf55: 0x3195, 0xf56: 0x31b5, 0xf57: 0x31d5, + 0xf58: 0x31f5, 0xf59: 0x3215, 0xf5a: 0x3235, 0xf5b: 0x3255, 0xf5c: 0x3175, 0xf5d: 0x3275, + 0xf5e: 0x3295, 0xf5f: 0x32b5, 0xf60: 0x0008, 0xf61: 0x0008, 0xf62: 0x0008, 0xf63: 0x0008, + 0xf64: 0x0008, 0xf65: 0x0008, 0xf66: 0x0008, 0xf67: 0x0008, 0xf68: 0x0008, 0xf69: 0x0008, + 0xf6a: 0x0008, 0xf6b: 0x0008, 0xf6c: 0x0008, 0xf6d: 0x0008, 0xf6e: 0x0008, 0xf6f: 0x0008, + 0xf70: 0x0008, 0xf71: 0x0008, 0xf72: 0x0008, 0xf73: 0x0008, 0xf74: 0x0008, 0xf75: 0x0008, + 0xf76: 0x0008, 0xf77: 0x0008, 0xf78: 0x0008, 0xf79: 0x0008, 0xf7a: 0x0008, 0xf7b: 0x0008, + 0xf7c: 0x0008, 0xf7d: 0x0008, 0xf7e: 0x0008, 0xf7f: 0x0008, + // Block 0x3e, offset 0xf80 + 0xf80: 0x0b82, 0xf81: 0x0b8a, 0xf82: 0x0b92, 0xf83: 0x0b9a, 0xf84: 0x32d5, 0xf85: 0x32f5, + 0xf86: 0x3315, 0xf87: 0x3335, 0xf88: 0x0018, 0xf89: 0x0018, 0xf8a: 0x0018, 0xf8b: 0x0018, + 0xf8c: 0x0018, 0xf8d: 0x0018, 0xf8e: 0x0018, 0xf8f: 0x0018, 0xf90: 0x3355, 0xf91: 0x0ba1, + 0xf92: 0x0ba9, 0xf93: 0x0bb1, 0xf94: 0x0bb9, 0xf95: 0x0bc1, 0xf96: 0x0bc9, 0xf97: 0x0bd1, + 0xf98: 0x0bd9, 0xf99: 0x0be1, 0xf9a: 0x0be9, 0xf9b: 0x0bf1, 0xf9c: 0x0bf9, 0xf9d: 0x0c01, + 0xf9e: 0x0c09, 0xf9f: 0x0c11, 0xfa0: 0x3375, 0xfa1: 0x3395, 0xfa2: 0x33b5, 0xfa3: 0x33d5, + 0xfa4: 0x33f5, 0xfa5: 0x33f5, 0xfa6: 0x3415, 0xfa7: 0x3435, 0xfa8: 0x3455, 0xfa9: 0x3475, + 0xfaa: 0x3495, 0xfab: 0x34b5, 0xfac: 0x34d5, 0xfad: 0x34f5, 0xfae: 0x3515, 0xfaf: 0x3535, + 0xfb0: 0x3555, 0xfb1: 0x3575, 0xfb2: 0x3595, 0xfb3: 0x35b5, 0xfb4: 0x35d5, 0xfb5: 0x35f5, + 0xfb6: 0x3615, 0xfb7: 0x3635, 0xfb8: 0x3655, 0xfb9: 0x3675, 0xfba: 0x3695, 0xfbb: 0x36b5, + 0xfbc: 0x0c19, 0xfbd: 0x0c21, 0xfbe: 0x36d5, 0xfbf: 0x0018, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x36f5, 0xfc1: 0x3715, 0xfc2: 0x3735, 0xfc3: 0x3755, 0xfc4: 0x3775, 0xfc5: 0x3795, + 0xfc6: 0x37b5, 0xfc7: 0x37d5, 0xfc8: 0x37f5, 0xfc9: 0x3815, 0xfca: 0x3835, 0xfcb: 0x3855, + 0xfcc: 0x3875, 0xfcd: 0x3895, 0xfce: 0x38b5, 0xfcf: 0x38d5, 0xfd0: 0x38f5, 0xfd1: 0x3915, + 0xfd2: 0x3935, 0xfd3: 0x3955, 0xfd4: 0x3975, 0xfd5: 0x3995, 0xfd6: 0x39b5, 0xfd7: 0x39d5, + 0xfd8: 0x39f5, 0xfd9: 0x3a15, 0xfda: 0x3a35, 0xfdb: 0x3a55, 0xfdc: 0x3a75, 0xfdd: 0x3a95, + 0xfde: 0x3ab5, 0xfdf: 0x3ad5, 0xfe0: 0x3af5, 0xfe1: 0x3b15, 0xfe2: 0x3b35, 0xfe3: 0x3b55, + 0xfe4: 0x3b75, 0xfe5: 0x3b95, 0xfe6: 0x1295, 0xfe7: 0x3bb5, 0xfe8: 0x3bd5, 0xfe9: 0x3bf5, + 0xfea: 0x3c15, 0xfeb: 0x3c35, 0xfec: 0x3c55, 0xfed: 0x3c75, 0xfee: 0x23b5, 0xfef: 0x3c95, + 0xff0: 0x3cb5, 0xff1: 0x0c29, 0xff2: 0x0c31, 0xff3: 0x0c39, 0xff4: 0x0c41, 0xff5: 0x0c49, + 0xff6: 0x0c51, 0xff7: 0x0c59, 0xff8: 0x0c61, 0xff9: 0x0c69, 0xffa: 0x0c71, 0xffb: 0x0c79, + 0xffc: 0x0c81, 0xffd: 0x0c89, 0xffe: 0x0c91, 0xfff: 0x0c99, + // Block 0x40, offset 0x1000 + 0x1000: 0x0ca1, 0x1001: 0x0ca9, 0x1002: 0x0cb1, 0x1003: 0x0cb9, 0x1004: 0x0cc1, 0x1005: 0x0cc9, + 0x1006: 0x0cd1, 0x1007: 0x0cd9, 0x1008: 0x0ce1, 0x1009: 0x0ce9, 0x100a: 0x0cf1, 0x100b: 0x0cf9, + 0x100c: 0x0d01, 0x100d: 0x3cd5, 0x100e: 0x0d09, 0x100f: 0x3cf5, 0x1010: 0x3d15, 0x1011: 0x3d2d, + 0x1012: 0x3d45, 0x1013: 0x3d5d, 0x1014: 0x3d75, 0x1015: 0x3d75, 0x1016: 0x3d5d, 0x1017: 0x3d8d, + 0x1018: 0x07d5, 0x1019: 0x3da5, 0x101a: 0x3dbd, 0x101b: 0x3dd5, 0x101c: 0x3ded, 0x101d: 0x3e05, + 0x101e: 0x3e1d, 0x101f: 0x3e35, 0x1020: 0x3e4d, 0x1021: 0x3e65, 0x1022: 0x3e7d, 0x1023: 0x3e95, + 0x1024: 0x3ead, 0x1025: 0x3ead, 0x1026: 0x3ec5, 0x1027: 0x3ec5, 0x1028: 0x3edd, 0x1029: 0x3edd, + 0x102a: 0x3ef5, 0x102b: 0x3f0d, 0x102c: 0x3f25, 0x102d: 0x3f3d, 0x102e: 0x3f55, 0x102f: 0x3f55, + 0x1030: 0x3f6d, 0x1031: 0x3f6d, 0x1032: 0x3f6d, 0x1033: 0x3f85, 0x1034: 0x3f9d, 0x1035: 0x3fb5, + 0x1036: 0x3fcd, 0x1037: 0x3fb5, 0x1038: 0x3fe5, 0x1039: 0x3ffd, 0x103a: 0x3f85, 0x103b: 0x4015, + 0x103c: 0x402d, 0x103d: 0x402d, 0x103e: 0x402d, 0x103f: 0x0d11, + // Block 0x41, offset 0x1040 + 0x1040: 0x10f9, 0x1041: 0x1101, 0x1042: 0x40a5, 0x1043: 0x1109, 0x1044: 0x1111, 0x1045: 0x1119, + 0x1046: 0x1121, 0x1047: 0x1129, 0x1048: 0x40c5, 0x1049: 0x1131, 0x104a: 0x1139, 0x104b: 0x1141, + 0x104c: 0x40e5, 0x104d: 0x40e5, 0x104e: 0x1149, 0x104f: 0x1151, 0x1050: 0x1159, 0x1051: 0x4105, + 0x1052: 0x4125, 0x1053: 0x4145, 0x1054: 0x4165, 0x1055: 0x4185, 0x1056: 0x1161, 0x1057: 0x1169, + 0x1058: 0x1171, 0x1059: 0x1179, 0x105a: 0x1181, 0x105b: 0x41a5, 0x105c: 0x1189, 0x105d: 0x1191, + 0x105e: 0x1199, 0x105f: 0x41c5, 0x1060: 0x41e5, 0x1061: 0x11a1, 0x1062: 0x4205, 0x1063: 0x4225, + 0x1064: 0x4245, 0x1065: 0x11a9, 0x1066: 0x4265, 0x1067: 0x11b1, 0x1068: 0x11b9, 0x1069: 0x10f9, + 0x106a: 0x4285, 0x106b: 0x42a5, 0x106c: 0x42c5, 0x106d: 0x42e5, 0x106e: 0x11c1, 0x106f: 0x11c9, + 0x1070: 0x11d1, 0x1071: 0x11d9, 0x1072: 0x4305, 0x1073: 0x11e1, 0x1074: 0x11e9, 0x1075: 0x11f1, + 0x1076: 0x4325, 0x1077: 0x11f9, 0x1078: 0x1201, 0x1079: 0x11f9, 0x107a: 0x1209, 0x107b: 0x1211, + 0x107c: 0x4345, 0x107d: 0x1219, 0x107e: 0x1221, 0x107f: 0x1219, + // Block 0x42, offset 0x1080 + 0x1080: 0x4365, 0x1081: 0x4385, 0x1082: 0x0040, 0x1083: 0x1229, 0x1084: 0x1231, 0x1085: 0x1239, + 0x1086: 0x1241, 0x1087: 0x0040, 0x1088: 0x1249, 0x1089: 0x1251, 0x108a: 0x1259, 0x108b: 0x1261, + 0x108c: 0x1269, 0x108d: 0x1271, 0x108e: 0x1199, 0x108f: 0x1279, 0x1090: 0x1281, 0x1091: 0x1289, + 0x1092: 0x43a5, 0x1093: 0x1291, 0x1094: 0x1121, 0x1095: 0x43c5, 0x1096: 0x43e5, 0x1097: 0x1299, + 0x1098: 0x0040, 0x1099: 0x4405, 0x109a: 0x12a1, 0x109b: 0x12a9, 0x109c: 0x12b1, 0x109d: 0x12b9, + 0x109e: 0x12c1, 0x109f: 0x12c9, 0x10a0: 0x12d1, 0x10a1: 0x12d9, 0x10a2: 0x12e1, 0x10a3: 0x12e9, + 0x10a4: 0x12f1, 0x10a5: 0x12f9, 0x10a6: 0x1301, 0x10a7: 0x1309, 0x10a8: 0x1311, 0x10a9: 0x1319, + 0x10aa: 0x1321, 0x10ab: 0x1329, 0x10ac: 0x1331, 0x10ad: 0x1339, 0x10ae: 0x1341, 0x10af: 0x1349, + 0x10b0: 0x1351, 0x10b1: 0x1359, 0x10b2: 0x1361, 0x10b3: 0x1369, 0x10b4: 0x1371, 0x10b5: 0x1379, + 0x10b6: 0x1381, 0x10b7: 0x1389, 0x10b8: 0x1391, 0x10b9: 0x1399, 0x10ba: 0x13a1, 0x10bb: 0x13a9, + 0x10bc: 0x13b1, 0x10bd: 0x13b9, 0x10be: 0x13c1, 0x10bf: 0x4425, + // 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: 0xe00d, 0x10dd: 0x0008, + 0x10de: 0xe00d, 0x10df: 0x0008, 0x10e0: 0xe00d, 0x10e1: 0x0008, 0x10e2: 0xe00d, 0x10e3: 0x0008, + 0x10e4: 0xe00d, 0x10e5: 0x0008, 0x10e6: 0xe00d, 0x10e7: 0x0008, 0x10e8: 0xe00d, 0x10e9: 0x0008, + 0x10ea: 0xe00d, 0x10eb: 0x0008, 0x10ec: 0xe00d, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x3308, + 0x10f0: 0x3318, 0x10f1: 0x3318, 0x10f2: 0x3318, 0x10f3: 0x0018, 0x10f4: 0x3308, 0x10f5: 0x3308, + 0x10f6: 0x3308, 0x10f7: 0x3308, 0x10f8: 0x3308, 0x10f9: 0x3308, 0x10fa: 0x3308, 0x10fb: 0x3308, + 0x10fc: 0x3308, 0x10fd: 0x3308, 0x10fe: 0x0018, 0x10ff: 0x0008, + // Block 0x44, offset 0x1100 + 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, + 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, + 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, + 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, + 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0x02d1, 0x111d: 0x13c9, + 0x111e: 0x3308, 0x111f: 0x3308, 0x1120: 0x0008, 0x1121: 0x0008, 0x1122: 0x0008, 0x1123: 0x0008, + 0x1124: 0x0008, 0x1125: 0x0008, 0x1126: 0x0008, 0x1127: 0x0008, 0x1128: 0x0008, 0x1129: 0x0008, + 0x112a: 0x0008, 0x112b: 0x0008, 0x112c: 0x0008, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x0008, + 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0x0008, 0x1133: 0x0008, 0x1134: 0x0008, 0x1135: 0x0008, + 0x1136: 0x0008, 0x1137: 0x0008, 0x1138: 0x0008, 0x1139: 0x0008, 0x113a: 0x0008, 0x113b: 0x0008, + 0x113c: 0x0008, 0x113d: 0x0008, 0x113e: 0x0008, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0x0018, 0x1141: 0x0018, 0x1142: 0x0018, 0x1143: 0x0018, 0x1144: 0x0018, 0x1145: 0x0018, + 0x1146: 0x0018, 0x1147: 0x0018, 0x1148: 0x0018, 0x1149: 0x0018, 0x114a: 0x0018, 0x114b: 0x0018, + 0x114c: 0x0018, 0x114d: 0x0018, 0x114e: 0x0018, 0x114f: 0x0018, 0x1150: 0x0018, 0x1151: 0x0018, + 0x1152: 0x0018, 0x1153: 0x0018, 0x1154: 0x0018, 0x1155: 0x0018, 0x1156: 0x0018, 0x1157: 0x0008, + 0x1158: 0x0008, 0x1159: 0x0008, 0x115a: 0x0008, 0x115b: 0x0008, 0x115c: 0x0008, 0x115d: 0x0008, + 0x115e: 0x0008, 0x115f: 0x0008, 0x1160: 0x0018, 0x1161: 0x0018, 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: 0x0008, 0x1171: 0x0008, 0x1172: 0xe00d, 0x1173: 0x0008, 0x1174: 0xe00d, 0x1175: 0x0008, + 0x1176: 0xe00d, 0x1177: 0x0008, 0x1178: 0xe00d, 0x1179: 0x0008, 0x117a: 0xe00d, 0x117b: 0x0008, + 0x117c: 0xe00d, 0x117d: 0x0008, 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: 0xe00d, 0x1189: 0x0008, 0x118a: 0xe00d, 0x118b: 0x0008, + 0x118c: 0xe00d, 0x118d: 0x0008, 0x118e: 0xe00d, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, + 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0xe00d, 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: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, + 0x11b0: 0xe0fd, 0x11b1: 0x0008, 0x11b2: 0x0008, 0x11b3: 0x0008, 0x11b4: 0x0008, 0x11b5: 0x0008, + 0x11b6: 0x0008, 0x11b7: 0x0008, 0x11b8: 0x0008, 0x11b9: 0xe01d, 0x11ba: 0x0008, 0x11bb: 0xe03d, + 0x11bc: 0x0008, 0x11bd: 0x4445, 0x11be: 0xe00d, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, + 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0x0008, 0x11c9: 0x0018, 0x11ca: 0x0018, 0x11cb: 0xe03d, + 0x11cc: 0x0008, 0x11cd: 0x0409, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, + 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, + 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, + 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, + 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, + 0x11ea: 0x13d1, 0x11eb: 0x0371, 0x11ec: 0x0401, 0x11ed: 0x13d9, 0x11ee: 0x0421, 0x11ef: 0x0008, + 0x11f0: 0x13e1, 0x11f1: 0x13e9, 0x11f2: 0x0429, 0x11f3: 0x4465, 0x11f4: 0xe00d, 0x11f5: 0x0008, + 0x11f6: 0xe00d, 0x11f7: 0x0008, 0x11f8: 0xe00d, 0x11f9: 0x0008, 0x11fa: 0xe00d, 0x11fb: 0x0008, + 0x11fc: 0xe00d, 0x11fd: 0x0008, 0x11fe: 0xe00d, 0x11ff: 0x0008, + // Block 0x48, offset 0x1200 + 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0x03f5, 0x1205: 0x0479, + 0x1206: 0x447d, 0x1207: 0xe07d, 0x1208: 0x0008, 0x1209: 0xe01d, 0x120a: 0x0008, 0x120b: 0x0040, + 0x120c: 0x0040, 0x120d: 0x0040, 0x120e: 0x0040, 0x120f: 0x0040, 0x1210: 0xe00d, 0x1211: 0x0008, + 0x1212: 0x0040, 0x1213: 0x0008, 0x1214: 0x0040, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, + 0x1218: 0xe00d, 0x1219: 0x0008, 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: 0x03d9, 0x1233: 0x03f1, 0x1234: 0x0751, 0x1235: 0xe01d, + 0x1236: 0x0008, 0x1237: 0x0008, 0x1238: 0x0741, 0x1239: 0x13f1, 0x123a: 0x0008, 0x123b: 0x0008, + 0x123c: 0x0008, 0x123d: 0x0008, 0x123e: 0x0008, 0x123f: 0x0008, + // Block 0x49, offset 0x1240 + 0x1240: 0x650d, 0x1241: 0x652d, 0x1242: 0x654d, 0x1243: 0x656d, 0x1244: 0x658d, 0x1245: 0x65ad, + 0x1246: 0x65cd, 0x1247: 0x65ed, 0x1248: 0x660d, 0x1249: 0x662d, 0x124a: 0x664d, 0x124b: 0x666d, + 0x124c: 0x668d, 0x124d: 0x66ad, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x66cd, 0x1251: 0x0008, + 0x1252: 0x66ed, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x670d, 0x1256: 0x672d, 0x1257: 0x674d, + 0x1258: 0x676d, 0x1259: 0x678d, 0x125a: 0x67ad, 0x125b: 0x67cd, 0x125c: 0x67ed, 0x125d: 0x680d, + 0x125e: 0x682d, 0x125f: 0x0008, 0x1260: 0x684d, 0x1261: 0x0008, 0x1262: 0x686d, 0x1263: 0x0008, + 0x1264: 0x0008, 0x1265: 0x688d, 0x1266: 0x68ad, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, + 0x126a: 0x68cd, 0x126b: 0x68ed, 0x126c: 0x690d, 0x126d: 0x692d, 0x126e: 0x694d, 0x126f: 0x696d, + 0x1270: 0x698d, 0x1271: 0x69ad, 0x1272: 0x69cd, 0x1273: 0x69ed, 0x1274: 0x6a0d, 0x1275: 0x6a2d, + 0x1276: 0x6a4d, 0x1277: 0x6a6d, 0x1278: 0x6a8d, 0x1279: 0x6aad, 0x127a: 0x6acd, 0x127b: 0x6aed, + 0x127c: 0x6b0d, 0x127d: 0x6b2d, 0x127e: 0x6b4d, 0x127f: 0x6b6d, + // Block 0x4a, offset 0x1280 + 0x1280: 0x7acd, 0x1281: 0x7aed, 0x1282: 0x7b0d, 0x1283: 0x7b2d, 0x1284: 0x7b4d, 0x1285: 0x7b6d, + 0x1286: 0x7b8d, 0x1287: 0x7bad, 0x1288: 0x7bcd, 0x1289: 0x7bed, 0x128a: 0x7c0d, 0x128b: 0x7c2d, + 0x128c: 0x7c4d, 0x128d: 0x7c6d, 0x128e: 0x7c8d, 0x128f: 0x1409, 0x1290: 0x1411, 0x1291: 0x1419, + 0x1292: 0x7cad, 0x1293: 0x7ccd, 0x1294: 0x7ced, 0x1295: 0x1421, 0x1296: 0x1429, 0x1297: 0x1431, + 0x1298: 0x7d0d, 0x1299: 0x7d2d, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, + 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, + 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, + 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, + 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, + 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, + 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x1439, 0x12c1: 0x1441, 0x12c2: 0x1449, 0x12c3: 0x7d4d, 0x12c4: 0x7d6d, 0x12c5: 0x1451, + 0x12c6: 0x1451, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, + 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, + 0x12d2: 0x0040, 0x12d3: 0x1459, 0x12d4: 0x1461, 0x12d5: 0x1469, 0x12d6: 0x1471, 0x12d7: 0x1479, + 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x1481, + 0x12de: 0x3308, 0x12df: 0x1489, 0x12e0: 0x1491, 0x12e1: 0x0779, 0x12e2: 0x0791, 0x12e3: 0x1499, + 0x12e4: 0x14a1, 0x12e5: 0x14a9, 0x12e6: 0x14b1, 0x12e7: 0x14b9, 0x12e8: 0x14c1, 0x12e9: 0x071a, + 0x12ea: 0x14c9, 0x12eb: 0x14d1, 0x12ec: 0x14d9, 0x12ed: 0x14e1, 0x12ee: 0x14e9, 0x12ef: 0x14f1, + 0x12f0: 0x14f9, 0x12f1: 0x1501, 0x12f2: 0x1509, 0x12f3: 0x1511, 0x12f4: 0x1519, 0x12f5: 0x1521, + 0x12f6: 0x1529, 0x12f7: 0x0040, 0x12f8: 0x1531, 0x12f9: 0x1539, 0x12fa: 0x1541, 0x12fb: 0x1549, + 0x12fc: 0x1551, 0x12fd: 0x0040, 0x12fe: 0x1559, 0x12ff: 0x0040, + // Block 0x4c, offset 0x1300 + 0x1300: 0x1561, 0x1301: 0x1569, 0x1302: 0x0040, 0x1303: 0x1571, 0x1304: 0x1579, 0x1305: 0x0040, + 0x1306: 0x1581, 0x1307: 0x1589, 0x1308: 0x1591, 0x1309: 0x1599, 0x130a: 0x15a1, 0x130b: 0x15a9, + 0x130c: 0x15b1, 0x130d: 0x15b9, 0x130e: 0x15c1, 0x130f: 0x15c9, 0x1310: 0x15d1, 0x1311: 0x15d1, + 0x1312: 0x15d9, 0x1313: 0x15d9, 0x1314: 0x15d9, 0x1315: 0x15d9, 0x1316: 0x15e1, 0x1317: 0x15e1, + 0x1318: 0x15e1, 0x1319: 0x15e1, 0x131a: 0x15e9, 0x131b: 0x15e9, 0x131c: 0x15e9, 0x131d: 0x15e9, + 0x131e: 0x15f1, 0x131f: 0x15f1, 0x1320: 0x15f1, 0x1321: 0x15f1, 0x1322: 0x15f9, 0x1323: 0x15f9, + 0x1324: 0x15f9, 0x1325: 0x15f9, 0x1326: 0x1601, 0x1327: 0x1601, 0x1328: 0x1601, 0x1329: 0x1601, + 0x132a: 0x1609, 0x132b: 0x1609, 0x132c: 0x1609, 0x132d: 0x1609, 0x132e: 0x1611, 0x132f: 0x1611, + 0x1330: 0x1611, 0x1331: 0x1611, 0x1332: 0x1619, 0x1333: 0x1619, 0x1334: 0x1619, 0x1335: 0x1619, + 0x1336: 0x1621, 0x1337: 0x1621, 0x1338: 0x1621, 0x1339: 0x1621, 0x133a: 0x1629, 0x133b: 0x1629, + 0x133c: 0x1629, 0x133d: 0x1629, 0x133e: 0x1631, 0x133f: 0x1631, + // Block 0x4d, offset 0x1340 + 0x1340: 0x1631, 0x1341: 0x1631, 0x1342: 0x1639, 0x1343: 0x1639, 0x1344: 0x1641, 0x1345: 0x1641, + 0x1346: 0x1649, 0x1347: 0x1649, 0x1348: 0x1651, 0x1349: 0x1651, 0x134a: 0x1659, 0x134b: 0x1659, + 0x134c: 0x1661, 0x134d: 0x1661, 0x134e: 0x1669, 0x134f: 0x1669, 0x1350: 0x1669, 0x1351: 0x1669, + 0x1352: 0x1671, 0x1353: 0x1671, 0x1354: 0x1671, 0x1355: 0x1671, 0x1356: 0x1679, 0x1357: 0x1679, + 0x1358: 0x1679, 0x1359: 0x1679, 0x135a: 0x1681, 0x135b: 0x1681, 0x135c: 0x1681, 0x135d: 0x1681, + 0x135e: 0x1689, 0x135f: 0x1689, 0x1360: 0x1691, 0x1361: 0x1691, 0x1362: 0x1691, 0x1363: 0x1691, + 0x1364: 0x1699, 0x1365: 0x1699, 0x1366: 0x16a1, 0x1367: 0x16a1, 0x1368: 0x16a1, 0x1369: 0x16a1, + 0x136a: 0x16a9, 0x136b: 0x16a9, 0x136c: 0x16a9, 0x136d: 0x16a9, 0x136e: 0x16b1, 0x136f: 0x16b1, + 0x1370: 0x16b9, 0x1371: 0x16b9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, + 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, + 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0818, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, + 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, + 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, + 0x1392: 0x0040, 0x1393: 0x16c1, 0x1394: 0x16c1, 0x1395: 0x16c1, 0x1396: 0x16c1, 0x1397: 0x16c9, + 0x1398: 0x16c9, 0x1399: 0x16d1, 0x139a: 0x16d1, 0x139b: 0x16d9, 0x139c: 0x16d9, 0x139d: 0x0149, + 0x139e: 0x16e1, 0x139f: 0x16e1, 0x13a0: 0x16e9, 0x13a1: 0x16e9, 0x13a2: 0x16f1, 0x13a3: 0x16f1, + 0x13a4: 0x16f9, 0x13a5: 0x16f9, 0x13a6: 0x16f9, 0x13a7: 0x16f9, 0x13a8: 0x1701, 0x13a9: 0x1701, + 0x13aa: 0x1709, 0x13ab: 0x1709, 0x13ac: 0x1711, 0x13ad: 0x1711, 0x13ae: 0x1719, 0x13af: 0x1719, + 0x13b0: 0x1721, 0x13b1: 0x1721, 0x13b2: 0x1729, 0x13b3: 0x1729, 0x13b4: 0x1731, 0x13b5: 0x1731, + 0x13b6: 0x1739, 0x13b7: 0x1739, 0x13b8: 0x1739, 0x13b9: 0x1741, 0x13ba: 0x1741, 0x13bb: 0x1741, + 0x13bc: 0x1749, 0x13bd: 0x1749, 0x13be: 0x1749, 0x13bf: 0x1749, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x1949, 0x13c1: 0x1951, 0x13c2: 0x1959, 0x13c3: 0x1961, 0x13c4: 0x1969, 0x13c5: 0x1971, + 0x13c6: 0x1979, 0x13c7: 0x1981, 0x13c8: 0x1989, 0x13c9: 0x1991, 0x13ca: 0x1999, 0x13cb: 0x19a1, + 0x13cc: 0x19a9, 0x13cd: 0x19b1, 0x13ce: 0x19b9, 0x13cf: 0x19c1, 0x13d0: 0x19c9, 0x13d1: 0x19d1, + 0x13d2: 0x19d9, 0x13d3: 0x19e1, 0x13d4: 0x19e9, 0x13d5: 0x19f1, 0x13d6: 0x19f9, 0x13d7: 0x1a01, + 0x13d8: 0x1a09, 0x13d9: 0x1a11, 0x13da: 0x1a19, 0x13db: 0x1a21, 0x13dc: 0x1a29, 0x13dd: 0x1a31, + 0x13de: 0x1a3a, 0x13df: 0x1a42, 0x13e0: 0x1a4a, 0x13e1: 0x1a52, 0x13e2: 0x1a5a, 0x13e3: 0x1a62, + 0x13e4: 0x1a69, 0x13e5: 0x1a71, 0x13e6: 0x1761, 0x13e7: 0x1a79, 0x13e8: 0x1741, 0x13e9: 0x1769, + 0x13ea: 0x1a81, 0x13eb: 0x1a89, 0x13ec: 0x1789, 0x13ed: 0x1a91, 0x13ee: 0x1791, 0x13ef: 0x1799, + 0x13f0: 0x1a99, 0x13f1: 0x1aa1, 0x13f2: 0x17b9, 0x13f3: 0x1aa9, 0x13f4: 0x17c1, 0x13f5: 0x17c9, + 0x13f6: 0x1ab1, 0x13f7: 0x1ab9, 0x13f8: 0x17d9, 0x13f9: 0x1ac1, 0x13fa: 0x17e1, 0x13fb: 0x17e9, + 0x13fc: 0x18d1, 0x13fd: 0x18d9, 0x13fe: 0x18f1, 0x13ff: 0x18f9, + // Block 0x50, offset 0x1400 + 0x1400: 0x1901, 0x1401: 0x1921, 0x1402: 0x1929, 0x1403: 0x1931, 0x1404: 0x1939, 0x1405: 0x1959, + 0x1406: 0x1961, 0x1407: 0x1969, 0x1408: 0x1ac9, 0x1409: 0x1989, 0x140a: 0x1ad1, 0x140b: 0x1ad9, + 0x140c: 0x19b9, 0x140d: 0x1ae1, 0x140e: 0x19c1, 0x140f: 0x19c9, 0x1410: 0x1a31, 0x1411: 0x1ae9, + 0x1412: 0x1af1, 0x1413: 0x1a09, 0x1414: 0x1af9, 0x1415: 0x1a11, 0x1416: 0x1a19, 0x1417: 0x1751, + 0x1418: 0x1759, 0x1419: 0x1b01, 0x141a: 0x1761, 0x141b: 0x1b09, 0x141c: 0x1771, 0x141d: 0x1779, + 0x141e: 0x1781, 0x141f: 0x1789, 0x1420: 0x1b11, 0x1421: 0x17a1, 0x1422: 0x17a9, 0x1423: 0x17b1, + 0x1424: 0x17b9, 0x1425: 0x1b19, 0x1426: 0x17d9, 0x1427: 0x17f1, 0x1428: 0x17f9, 0x1429: 0x1801, + 0x142a: 0x1809, 0x142b: 0x1811, 0x142c: 0x1821, 0x142d: 0x1829, 0x142e: 0x1831, 0x142f: 0x1839, + 0x1430: 0x1841, 0x1431: 0x1849, 0x1432: 0x1b21, 0x1433: 0x1851, 0x1434: 0x1859, 0x1435: 0x1861, + 0x1436: 0x1869, 0x1437: 0x1871, 0x1438: 0x1879, 0x1439: 0x1889, 0x143a: 0x1891, 0x143b: 0x1899, + 0x143c: 0x18a1, 0x143d: 0x18a9, 0x143e: 0x18b1, 0x143f: 0x18b9, + // Block 0x51, offset 0x1440 + 0x1440: 0x18c1, 0x1441: 0x18c9, 0x1442: 0x18e1, 0x1443: 0x18e9, 0x1444: 0x1909, 0x1445: 0x1911, + 0x1446: 0x1919, 0x1447: 0x1921, 0x1448: 0x1929, 0x1449: 0x1941, 0x144a: 0x1949, 0x144b: 0x1951, + 0x144c: 0x1959, 0x144d: 0x1b29, 0x144e: 0x1971, 0x144f: 0x1979, 0x1450: 0x1981, 0x1451: 0x1989, + 0x1452: 0x19a1, 0x1453: 0x19a9, 0x1454: 0x19b1, 0x1455: 0x19b9, 0x1456: 0x1b31, 0x1457: 0x19d1, + 0x1458: 0x19d9, 0x1459: 0x1b39, 0x145a: 0x19f1, 0x145b: 0x19f9, 0x145c: 0x1a01, 0x145d: 0x1a09, + 0x145e: 0x1b41, 0x145f: 0x1761, 0x1460: 0x1b09, 0x1461: 0x1789, 0x1462: 0x1b11, 0x1463: 0x17b9, + 0x1464: 0x1b19, 0x1465: 0x17d9, 0x1466: 0x1b49, 0x1467: 0x1841, 0x1468: 0x1b51, 0x1469: 0x1b59, + 0x146a: 0x1b61, 0x146b: 0x1921, 0x146c: 0x1929, 0x146d: 0x1959, 0x146e: 0x19b9, 0x146f: 0x1b31, + 0x1470: 0x1a09, 0x1471: 0x1b41, 0x1472: 0x1b69, 0x1473: 0x1b71, 0x1474: 0x1b79, 0x1475: 0x1b81, + 0x1476: 0x1b89, 0x1477: 0x1b91, 0x1478: 0x1b99, 0x1479: 0x1ba1, 0x147a: 0x1ba9, 0x147b: 0x1bb1, + 0x147c: 0x1bb9, 0x147d: 0x1bc1, 0x147e: 0x1bc9, 0x147f: 0x1bd1, + // Block 0x52, offset 0x1480 + 0x1480: 0x1bd9, 0x1481: 0x1be1, 0x1482: 0x1be9, 0x1483: 0x1bf1, 0x1484: 0x1bf9, 0x1485: 0x1c01, + 0x1486: 0x1c09, 0x1487: 0x1c11, 0x1488: 0x1c19, 0x1489: 0x1c21, 0x148a: 0x1c29, 0x148b: 0x1c31, + 0x148c: 0x1b59, 0x148d: 0x1c39, 0x148e: 0x1c41, 0x148f: 0x1c49, 0x1490: 0x1c51, 0x1491: 0x1b81, + 0x1492: 0x1b89, 0x1493: 0x1b91, 0x1494: 0x1b99, 0x1495: 0x1ba1, 0x1496: 0x1ba9, 0x1497: 0x1bb1, + 0x1498: 0x1bb9, 0x1499: 0x1bc1, 0x149a: 0x1bc9, 0x149b: 0x1bd1, 0x149c: 0x1bd9, 0x149d: 0x1be1, + 0x149e: 0x1be9, 0x149f: 0x1bf1, 0x14a0: 0x1bf9, 0x14a1: 0x1c01, 0x14a2: 0x1c09, 0x14a3: 0x1c11, + 0x14a4: 0x1c19, 0x14a5: 0x1c21, 0x14a6: 0x1c29, 0x14a7: 0x1c31, 0x14a8: 0x1b59, 0x14a9: 0x1c39, + 0x14aa: 0x1c41, 0x14ab: 0x1c49, 0x14ac: 0x1c51, 0x14ad: 0x1c21, 0x14ae: 0x1c29, 0x14af: 0x1c31, + 0x14b0: 0x1b59, 0x14b1: 0x1b51, 0x14b2: 0x1b61, 0x14b3: 0x1881, 0x14b4: 0x1829, 0x14b5: 0x1831, + 0x14b6: 0x1839, 0x14b7: 0x1c21, 0x14b8: 0x1c29, 0x14b9: 0x1c31, 0x14ba: 0x1881, 0x14bb: 0x1889, + 0x14bc: 0x1c59, 0x14bd: 0x1c59, 0x14be: 0x0018, 0x14bf: 0x0018, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0018, 0x14c1: 0x0018, 0x14c2: 0x0018, 0x14c3: 0x0018, 0x14c4: 0x0018, 0x14c5: 0x0018, + 0x14c6: 0x0018, 0x14c7: 0x0018, 0x14c8: 0x0018, 0x14c9: 0x0018, 0x14ca: 0x0018, 0x14cb: 0x0018, + 0x14cc: 0x0018, 0x14cd: 0x0018, 0x14ce: 0x0018, 0x14cf: 0x0018, 0x14d0: 0x1c61, 0x14d1: 0x1c69, + 0x14d2: 0x1c69, 0x14d3: 0x1c71, 0x14d4: 0x1c79, 0x14d5: 0x1c81, 0x14d6: 0x1c89, 0x14d7: 0x1c91, + 0x14d8: 0x1c99, 0x14d9: 0x1c99, 0x14da: 0x1ca1, 0x14db: 0x1ca9, 0x14dc: 0x1cb1, 0x14dd: 0x1cb9, + 0x14de: 0x1cc1, 0x14df: 0x1cc9, 0x14e0: 0x1cc9, 0x14e1: 0x1cd1, 0x14e2: 0x1cd9, 0x14e3: 0x1cd9, + 0x14e4: 0x1ce1, 0x14e5: 0x1ce1, 0x14e6: 0x1ce9, 0x14e7: 0x1cf1, 0x14e8: 0x1cf1, 0x14e9: 0x1cf9, + 0x14ea: 0x1d01, 0x14eb: 0x1d01, 0x14ec: 0x1d09, 0x14ed: 0x1d09, 0x14ee: 0x1d11, 0x14ef: 0x1d19, + 0x14f0: 0x1d19, 0x14f1: 0x1d21, 0x14f2: 0x1d21, 0x14f3: 0x1d29, 0x14f4: 0x1d31, 0x14f5: 0x1d39, + 0x14f6: 0x1d41, 0x14f7: 0x1d41, 0x14f8: 0x1d49, 0x14f9: 0x1d51, 0x14fa: 0x1d59, 0x14fb: 0x1d61, + 0x14fc: 0x1d69, 0x14fd: 0x1d69, 0x14fe: 0x1d71, 0x14ff: 0x1d79, + // Block 0x54, offset 0x1500 + 0x1500: 0x1f29, 0x1501: 0x1f31, 0x1502: 0x1f39, 0x1503: 0x1f11, 0x1504: 0x1d39, 0x1505: 0x1ce9, + 0x1506: 0x1f41, 0x1507: 0x1f49, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, + 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0018, 0x1510: 0x0040, 0x1511: 0x0040, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, + 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, + 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, + 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, + 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0x1f51, 0x1531: 0x1f59, 0x1532: 0x1f61, 0x1533: 0x1f69, 0x1534: 0x1f71, 0x1535: 0x1f79, + 0x1536: 0x1f81, 0x1537: 0x1f89, 0x1538: 0x1f91, 0x1539: 0x1f99, 0x153a: 0x1fa2, 0x153b: 0x1faa, + 0x153c: 0x1fb1, 0x153d: 0x0018, 0x153e: 0x0018, 0x153f: 0x0018, + // Block 0x55, offset 0x1540 + 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, + 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, + 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0x1fba, 0x1551: 0x7d8d, + 0x1552: 0x0040, 0x1553: 0x1fc2, 0x1554: 0x0122, 0x1555: 0x1fca, 0x1556: 0x1fd2, 0x1557: 0x7dad, + 0x1558: 0x7dcd, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, + 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, + 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, + 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, + 0x1570: 0x0040, 0x1571: 0x7ded, 0x1572: 0x7e0d, 0x1573: 0x1fda, 0x1574: 0x1fda, 0x1575: 0x072a, + 0x1576: 0x0732, 0x1577: 0x1fe2, 0x1578: 0x1fea, 0x1579: 0x7e2d, 0x157a: 0x7e4d, 0x157b: 0x7e6d, + 0x157c: 0x7e2d, 0x157d: 0x7e8d, 0x157e: 0x7ead, 0x157f: 0x7e8d, + // Block 0x56, offset 0x1580 + 0x1580: 0x7ecd, 0x1581: 0x7eed, 0x1582: 0x7f0d, 0x1583: 0x7eed, 0x1584: 0x7f2d, 0x1585: 0x0018, + 0x1586: 0x0018, 0x1587: 0x1ff2, 0x1588: 0x1ffa, 0x1589: 0x7f4e, 0x158a: 0x7f6e, 0x158b: 0x7f8e, + 0x158c: 0x7fae, 0x158d: 0x1fda, 0x158e: 0x1fda, 0x158f: 0x1fda, 0x1590: 0x1fba, 0x1591: 0x7fcd, + 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x0122, 0x1595: 0x1fc2, 0x1596: 0x1fd2, 0x1597: 0x1fca, + 0x1598: 0x7fed, 0x1599: 0x072a, 0x159a: 0x0732, 0x159b: 0x1fe2, 0x159c: 0x1fea, 0x159d: 0x7ecd, + 0x159e: 0x7f2d, 0x159f: 0x2002, 0x15a0: 0x200a, 0x15a1: 0x2012, 0x15a2: 0x071a, 0x15a3: 0x2019, + 0x15a4: 0x2022, 0x15a5: 0x202a, 0x15a6: 0x0722, 0x15a7: 0x0040, 0x15a8: 0x2032, 0x15a9: 0x203a, + 0x15aa: 0x2042, 0x15ab: 0x204a, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, + 0x15b0: 0x800e, 0x15b1: 0x2051, 0x15b2: 0x802e, 0x15b3: 0x0808, 0x15b4: 0x804e, 0x15b5: 0x0040, + 0x15b6: 0x806e, 0x15b7: 0x2059, 0x15b8: 0x808e, 0x15b9: 0x2061, 0x15ba: 0x80ae, 0x15bb: 0x2069, + 0x15bc: 0x80ce, 0x15bd: 0x2071, 0x15be: 0x80ee, 0x15bf: 0x2079, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x2081, 0x15c1: 0x2089, 0x15c2: 0x2089, 0x15c3: 0x2091, 0x15c4: 0x2091, 0x15c5: 0x2099, + 0x15c6: 0x2099, 0x15c7: 0x20a1, 0x15c8: 0x20a1, 0x15c9: 0x20a9, 0x15ca: 0x20a9, 0x15cb: 0x20a9, + 0x15cc: 0x20a9, 0x15cd: 0x20b1, 0x15ce: 0x20b1, 0x15cf: 0x20b9, 0x15d0: 0x20b9, 0x15d1: 0x20b9, + 0x15d2: 0x20b9, 0x15d3: 0x20c1, 0x15d4: 0x20c1, 0x15d5: 0x20c9, 0x15d6: 0x20c9, 0x15d7: 0x20c9, + 0x15d8: 0x20c9, 0x15d9: 0x20d1, 0x15da: 0x20d1, 0x15db: 0x20d1, 0x15dc: 0x20d1, 0x15dd: 0x20d9, + 0x15de: 0x20d9, 0x15df: 0x20d9, 0x15e0: 0x20d9, 0x15e1: 0x20e1, 0x15e2: 0x20e1, 0x15e3: 0x20e1, + 0x15e4: 0x20e1, 0x15e5: 0x20e9, 0x15e6: 0x20e9, 0x15e7: 0x20e9, 0x15e8: 0x20e9, 0x15e9: 0x20f1, + 0x15ea: 0x20f1, 0x15eb: 0x20f9, 0x15ec: 0x20f9, 0x15ed: 0x2101, 0x15ee: 0x2101, 0x15ef: 0x2109, + 0x15f0: 0x2109, 0x15f1: 0x2111, 0x15f2: 0x2111, 0x15f3: 0x2111, 0x15f4: 0x2111, 0x15f5: 0x2119, + 0x15f6: 0x2119, 0x15f7: 0x2119, 0x15f8: 0x2119, 0x15f9: 0x2121, 0x15fa: 0x2121, 0x15fb: 0x2121, + 0x15fc: 0x2121, 0x15fd: 0x2129, 0x15fe: 0x2129, 0x15ff: 0x2129, + // Block 0x58, offset 0x1600 + 0x1600: 0x2129, 0x1601: 0x2131, 0x1602: 0x2131, 0x1603: 0x2131, 0x1604: 0x2131, 0x1605: 0x2139, + 0x1606: 0x2139, 0x1607: 0x2139, 0x1608: 0x2139, 0x1609: 0x2141, 0x160a: 0x2141, 0x160b: 0x2141, + 0x160c: 0x2141, 0x160d: 0x2149, 0x160e: 0x2149, 0x160f: 0x2149, 0x1610: 0x2149, 0x1611: 0x2151, + 0x1612: 0x2151, 0x1613: 0x2151, 0x1614: 0x2151, 0x1615: 0x2159, 0x1616: 0x2159, 0x1617: 0x2159, + 0x1618: 0x2159, 0x1619: 0x2161, 0x161a: 0x2161, 0x161b: 0x2161, 0x161c: 0x2161, 0x161d: 0x2169, + 0x161e: 0x2169, 0x161f: 0x2169, 0x1620: 0x2169, 0x1621: 0x2171, 0x1622: 0x2171, 0x1623: 0x2171, + 0x1624: 0x2171, 0x1625: 0x2179, 0x1626: 0x2179, 0x1627: 0x2179, 0x1628: 0x2179, 0x1629: 0x2181, + 0x162a: 0x2181, 0x162b: 0x2181, 0x162c: 0x2181, 0x162d: 0x2189, 0x162e: 0x2189, 0x162f: 0x1701, + 0x1630: 0x1701, 0x1631: 0x2191, 0x1632: 0x2191, 0x1633: 0x2191, 0x1634: 0x2191, 0x1635: 0x2199, + 0x1636: 0x2199, 0x1637: 0x21a1, 0x1638: 0x21a1, 0x1639: 0x21a9, 0x163a: 0x21a9, 0x163b: 0x21b1, + 0x163c: 0x21b1, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x0040, 0x1641: 0x1fca, 0x1642: 0x21ba, 0x1643: 0x2002, 0x1644: 0x203a, 0x1645: 0x2042, + 0x1646: 0x200a, 0x1647: 0x21c2, 0x1648: 0x072a, 0x1649: 0x0732, 0x164a: 0x2012, 0x164b: 0x071a, + 0x164c: 0x1fba, 0x164d: 0x2019, 0x164e: 0x0961, 0x164f: 0x21ca, 0x1650: 0x06e1, 0x1651: 0x0049, + 0x1652: 0x0029, 0x1653: 0x0031, 0x1654: 0x06e9, 0x1655: 0x06f1, 0x1656: 0x06f9, 0x1657: 0x0701, + 0x1658: 0x0709, 0x1659: 0x0711, 0x165a: 0x1fc2, 0x165b: 0x0122, 0x165c: 0x2022, 0x165d: 0x0722, + 0x165e: 0x202a, 0x165f: 0x1fd2, 0x1660: 0x204a, 0x1661: 0x0019, 0x1662: 0x02e9, 0x1663: 0x03d9, + 0x1664: 0x02f1, 0x1665: 0x02f9, 0x1666: 0x03f1, 0x1667: 0x0309, 0x1668: 0x00a9, 0x1669: 0x0311, + 0x166a: 0x00b1, 0x166b: 0x0319, 0x166c: 0x0101, 0x166d: 0x0321, 0x166e: 0x0329, 0x166f: 0x0051, + 0x1670: 0x0339, 0x1671: 0x0751, 0x1672: 0x00b9, 0x1673: 0x0089, 0x1674: 0x0341, 0x1675: 0x0349, + 0x1676: 0x0391, 0x1677: 0x00c1, 0x1678: 0x0109, 0x1679: 0x00c9, 0x167a: 0x04b1, 0x167b: 0x1ff2, + 0x167c: 0x2032, 0x167d: 0x1ffa, 0x167e: 0x21d2, 0x167f: 0x1fda, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0672, 0x1681: 0x0019, 0x1682: 0x02e9, 0x1683: 0x03d9, 0x1684: 0x02f1, 0x1685: 0x02f9, + 0x1686: 0x03f1, 0x1687: 0x0309, 0x1688: 0x00a9, 0x1689: 0x0311, 0x168a: 0x00b1, 0x168b: 0x0319, + 0x168c: 0x0101, 0x168d: 0x0321, 0x168e: 0x0329, 0x168f: 0x0051, 0x1690: 0x0339, 0x1691: 0x0751, + 0x1692: 0x00b9, 0x1693: 0x0089, 0x1694: 0x0341, 0x1695: 0x0349, 0x1696: 0x0391, 0x1697: 0x00c1, + 0x1698: 0x0109, 0x1699: 0x00c9, 0x169a: 0x04b1, 0x169b: 0x1fe2, 0x169c: 0x21da, 0x169d: 0x1fea, + 0x169e: 0x21e2, 0x169f: 0x810d, 0x16a0: 0x812d, 0x16a1: 0x0961, 0x16a2: 0x814d, 0x16a3: 0x814d, + 0x16a4: 0x816d, 0x16a5: 0x818d, 0x16a6: 0x81ad, 0x16a7: 0x81cd, 0x16a8: 0x81ed, 0x16a9: 0x820d, + 0x16aa: 0x822d, 0x16ab: 0x824d, 0x16ac: 0x826d, 0x16ad: 0x828d, 0x16ae: 0x82ad, 0x16af: 0x82cd, + 0x16b0: 0x82ed, 0x16b1: 0x830d, 0x16b2: 0x832d, 0x16b3: 0x834d, 0x16b4: 0x836d, 0x16b5: 0x838d, + 0x16b6: 0x83ad, 0x16b7: 0x83cd, 0x16b8: 0x83ed, 0x16b9: 0x840d, 0x16ba: 0x842d, 0x16bb: 0x844d, + 0x16bc: 0x81ed, 0x16bd: 0x846d, 0x16be: 0x848d, 0x16bf: 0x824d, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x84ad, 0x16c1: 0x84cd, 0x16c2: 0x84ed, 0x16c3: 0x850d, 0x16c4: 0x852d, 0x16c5: 0x854d, + 0x16c6: 0x856d, 0x16c7: 0x858d, 0x16c8: 0x850d, 0x16c9: 0x85ad, 0x16ca: 0x850d, 0x16cb: 0x85cd, + 0x16cc: 0x85cd, 0x16cd: 0x85ed, 0x16ce: 0x85ed, 0x16cf: 0x860d, 0x16d0: 0x854d, 0x16d1: 0x862d, + 0x16d2: 0x864d, 0x16d3: 0x862d, 0x16d4: 0x866d, 0x16d5: 0x864d, 0x16d6: 0x868d, 0x16d7: 0x868d, + 0x16d8: 0x86ad, 0x16d9: 0x86ad, 0x16da: 0x86cd, 0x16db: 0x86cd, 0x16dc: 0x864d, 0x16dd: 0x814d, + 0x16de: 0x86ed, 0x16df: 0x870d, 0x16e0: 0x0040, 0x16e1: 0x872d, 0x16e2: 0x874d, 0x16e3: 0x876d, + 0x16e4: 0x878d, 0x16e5: 0x876d, 0x16e6: 0x87ad, 0x16e7: 0x87cd, 0x16e8: 0x87ed, 0x16e9: 0x87ed, + 0x16ea: 0x880d, 0x16eb: 0x880d, 0x16ec: 0x882d, 0x16ed: 0x882d, 0x16ee: 0x880d, 0x16ef: 0x880d, + 0x16f0: 0x884d, 0x16f1: 0x886d, 0x16f2: 0x888d, 0x16f3: 0x88ad, 0x16f4: 0x88cd, 0x16f5: 0x88ed, + 0x16f6: 0x88ed, 0x16f7: 0x88ed, 0x16f8: 0x890d, 0x16f9: 0x890d, 0x16fa: 0x890d, 0x16fb: 0x890d, + 0x16fc: 0x87ed, 0x16fd: 0x87ed, 0x16fe: 0x87ed, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x874d, 0x1703: 0x872d, 0x1704: 0x892d, 0x1705: 0x872d, + 0x1706: 0x874d, 0x1707: 0x872d, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x894d, 0x170b: 0x874d, + 0x170c: 0x896d, 0x170d: 0x892d, 0x170e: 0x896d, 0x170f: 0x874d, 0x1710: 0x0040, 0x1711: 0x0040, + 0x1712: 0x898d, 0x1713: 0x89ad, 0x1714: 0x88ad, 0x1715: 0x896d, 0x1716: 0x892d, 0x1717: 0x896d, + 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x89cd, 0x171b: 0x89ed, 0x171c: 0x89cd, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x21e9, 0x1721: 0x21f1, 0x1722: 0x21f9, 0x1723: 0x8a0e, + 0x1724: 0x2201, 0x1725: 0x2209, 0x1726: 0x8a2d, 0x1727: 0x0040, 0x1728: 0x8a4d, 0x1729: 0x8a6d, + 0x172a: 0x8a8d, 0x172b: 0x8a6d, 0x172c: 0x8aad, 0x172d: 0x8acd, 0x172e: 0x8aed, 0x172f: 0x0040, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0008, 0x1741: 0x0008, 0x1742: 0x0008, 0x1743: 0x0008, 0x1744: 0x0008, 0x1745: 0x0008, + 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008, + 0x174c: 0x0008, 0x174d: 0x0008, 0x174e: 0x0008, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0008, + 0x1752: 0x0008, 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: 0x0040, 0x1765: 0x0040, 0x1766: 0x0040, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, + 0x176a: 0x0040, 0x176b: 0x0040, 0x176c: 0x0040, 0x176d: 0x0040, 0x176e: 0x0040, 0x176f: 0x0018, + 0x1770: 0x8b3d, 0x1771: 0x8b55, 0x1772: 0x8b6d, 0x1773: 0x8b55, 0x1774: 0x8b85, 0x1775: 0x8b55, + 0x1776: 0x8b6d, 0x1777: 0x8b55, 0x1778: 0x8b3d, 0x1779: 0x8b9d, 0x177a: 0x8bb5, 0x177b: 0x0040, + 0x177c: 0x8bcd, 0x177d: 0x8b9d, 0x177e: 0x8bb5, 0x177f: 0x8b9d, + // Block 0x5e, offset 0x1780 + 0x1780: 0xe13d, 0x1781: 0xe14d, 0x1782: 0xe15d, 0x1783: 0xe14d, 0x1784: 0xe17d, 0x1785: 0xe14d, + 0x1786: 0xe15d, 0x1787: 0xe14d, 0x1788: 0xe13d, 0x1789: 0xe1cd, 0x178a: 0xe1dd, 0x178b: 0x0040, + 0x178c: 0xe1fd, 0x178d: 0xe1cd, 0x178e: 0xe1dd, 0x178f: 0xe1cd, 0x1790: 0xe13d, 0x1791: 0xe14d, + 0x1792: 0xe15d, 0x1793: 0x0040, 0x1794: 0xe17d, 0x1795: 0xe14d, 0x1796: 0x0040, 0x1797: 0x0008, + 0x1798: 0x0008, 0x1799: 0x0008, 0x179a: 0x0008, 0x179b: 0x0008, 0x179c: 0x0008, 0x179d: 0x0008, + 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x0040, 0x17a3: 0x0008, + 0x17a4: 0x0008, 0x17a5: 0x0008, 0x17a6: 0x0008, 0x17a7: 0x0008, 0x17a8: 0x0008, 0x17a9: 0x0008, + 0x17aa: 0x0008, 0x17ab: 0x0008, 0x17ac: 0x0008, 0x17ad: 0x0008, 0x17ae: 0x0008, 0x17af: 0x0008, + 0x17b0: 0x0008, 0x17b1: 0x0008, 0x17b2: 0x0040, 0x17b3: 0x0008, 0x17b4: 0x0008, 0x17b5: 0x0008, + 0x17b6: 0x0008, 0x17b7: 0x0008, 0x17b8: 0x0008, 0x17b9: 0x0008, 0x17ba: 0x0040, 0x17bb: 0x0008, + 0x17bc: 0x0008, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x0008, 0x17c1: 0x2211, 0x17c2: 0x2219, 0x17c3: 0x02e1, 0x17c4: 0x2221, 0x17c5: 0x2229, + 0x17c6: 0x0040, 0x17c7: 0x2231, 0x17c8: 0x2239, 0x17c9: 0x2241, 0x17ca: 0x2249, 0x17cb: 0x2251, + 0x17cc: 0x2259, 0x17cd: 0x2261, 0x17ce: 0x2269, 0x17cf: 0x2271, 0x17d0: 0x2279, 0x17d1: 0x2281, + 0x17d2: 0x2289, 0x17d3: 0x2291, 0x17d4: 0x2299, 0x17d5: 0x0741, 0x17d6: 0x22a1, 0x17d7: 0x22a9, + 0x17d8: 0x22b1, 0x17d9: 0x22b9, 0x17da: 0x22c1, 0x17db: 0x13d9, 0x17dc: 0x8be5, 0x17dd: 0x22c9, + 0x17de: 0x22d1, 0x17df: 0x8c05, 0x17e0: 0x22d9, 0x17e1: 0x8c25, 0x17e2: 0x22e1, 0x17e3: 0x22e9, + 0x17e4: 0x22f1, 0x17e5: 0x0751, 0x17e6: 0x22f9, 0x17e7: 0x8c45, 0x17e8: 0x0949, 0x17e9: 0x2301, + 0x17ea: 0x2309, 0x17eb: 0x2311, 0x17ec: 0x2319, 0x17ed: 0x2321, 0x17ee: 0x2329, 0x17ef: 0x2331, + 0x17f0: 0x2339, 0x17f1: 0x0040, 0x17f2: 0x2341, 0x17f3: 0x2349, 0x17f4: 0x2351, 0x17f5: 0x2359, + 0x17f6: 0x2361, 0x17f7: 0x2369, 0x17f8: 0x2371, 0x17f9: 0x8c65, 0x17fa: 0x8c85, 0x17fb: 0x0040, + 0x17fc: 0x0040, 0x17fd: 0x0040, 0x17fe: 0x0040, 0x17ff: 0x0040, + // Block 0x60, offset 0x1800 + 0x1800: 0x0a08, 0x1801: 0x0a08, 0x1802: 0x0a08, 0x1803: 0x0a08, 0x1804: 0x0a08, 0x1805: 0x0c08, + 0x1806: 0x0808, 0x1807: 0x0c08, 0x1808: 0x0818, 0x1809: 0x0c08, 0x180a: 0x0c08, 0x180b: 0x0808, + 0x180c: 0x0808, 0x180d: 0x0908, 0x180e: 0x0c08, 0x180f: 0x0c08, 0x1810: 0x0c08, 0x1811: 0x0c08, + 0x1812: 0x0c08, 0x1813: 0x0a08, 0x1814: 0x0a08, 0x1815: 0x0a08, 0x1816: 0x0a08, 0x1817: 0x0908, + 0x1818: 0x0a08, 0x1819: 0x0a08, 0x181a: 0x0a08, 0x181b: 0x0a08, 0x181c: 0x0a08, 0x181d: 0x0c08, + 0x181e: 0x0a08, 0x181f: 0x0a08, 0x1820: 0x0a08, 0x1821: 0x0c08, 0x1822: 0x0808, 0x1823: 0x0808, + 0x1824: 0x0c08, 0x1825: 0x3308, 0x1826: 0x3308, 0x1827: 0x0040, 0x1828: 0x0040, 0x1829: 0x0040, + 0x182a: 0x0040, 0x182b: 0x0a18, 0x182c: 0x0a18, 0x182d: 0x0a18, 0x182e: 0x0a18, 0x182f: 0x0c18, + 0x1830: 0x0818, 0x1831: 0x0818, 0x1832: 0x0818, 0x1833: 0x0818, 0x1834: 0x0818, 0x1835: 0x0818, + 0x1836: 0x0818, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, + 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + // Block 0x61, offset 0x1840 + 0x1840: 0x0a08, 0x1841: 0x0c08, 0x1842: 0x0a08, 0x1843: 0x0c08, 0x1844: 0x0c08, 0x1845: 0x0c08, + 0x1846: 0x0a08, 0x1847: 0x0a08, 0x1848: 0x0a08, 0x1849: 0x0c08, 0x184a: 0x0a08, 0x184b: 0x0a08, + 0x184c: 0x0c08, 0x184d: 0x0a08, 0x184e: 0x0c08, 0x184f: 0x0c08, 0x1850: 0x0a08, 0x1851: 0x0c08, + 0x1852: 0x0040, 0x1853: 0x0040, 0x1854: 0x0040, 0x1855: 0x0040, 0x1856: 0x0040, 0x1857: 0x0040, + 0x1858: 0x0040, 0x1859: 0x0818, 0x185a: 0x0818, 0x185b: 0x0818, 0x185c: 0x0818, 0x185d: 0x0040, + 0x185e: 0x0040, 0x185f: 0x0040, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0040, 0x1863: 0x0040, + 0x1864: 0x0040, 0x1865: 0x0040, 0x1866: 0x0040, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0c18, + 0x186a: 0x0c18, 0x186b: 0x0c18, 0x186c: 0x0c18, 0x186d: 0x0a18, 0x186e: 0x0a18, 0x186f: 0x0818, + 0x1870: 0x0040, 0x1871: 0x0040, 0x1872: 0x0040, 0x1873: 0x0040, 0x1874: 0x0040, 0x1875: 0x0040, + 0x1876: 0x0040, 0x1877: 0x0040, 0x1878: 0x0040, 0x1879: 0x0040, 0x187a: 0x0040, 0x187b: 0x0040, + 0x187c: 0x0040, 0x187d: 0x0040, 0x187e: 0x0040, 0x187f: 0x0040, + // Block 0x62, offset 0x1880 + 0x1880: 0x3308, 0x1881: 0x3308, 0x1882: 0x3008, 0x1883: 0x3008, 0x1884: 0x0040, 0x1885: 0x0008, + 0x1886: 0x0008, 0x1887: 0x0008, 0x1888: 0x0008, 0x1889: 0x0008, 0x188a: 0x0008, 0x188b: 0x0008, + 0x188c: 0x0008, 0x188d: 0x0040, 0x188e: 0x0040, 0x188f: 0x0008, 0x1890: 0x0008, 0x1891: 0x0040, + 0x1892: 0x0040, 0x1893: 0x0008, 0x1894: 0x0008, 0x1895: 0x0008, 0x1896: 0x0008, 0x1897: 0x0008, + 0x1898: 0x0008, 0x1899: 0x0008, 0x189a: 0x0008, 0x189b: 0x0008, 0x189c: 0x0008, 0x189d: 0x0008, + 0x189e: 0x0008, 0x189f: 0x0008, 0x18a0: 0x0008, 0x18a1: 0x0008, 0x18a2: 0x0008, 0x18a3: 0x0008, + 0x18a4: 0x0008, 0x18a5: 0x0008, 0x18a6: 0x0008, 0x18a7: 0x0008, 0x18a8: 0x0008, 0x18a9: 0x0040, + 0x18aa: 0x0008, 0x18ab: 0x0008, 0x18ac: 0x0008, 0x18ad: 0x0008, 0x18ae: 0x0008, 0x18af: 0x0008, + 0x18b0: 0x0008, 0x18b1: 0x0040, 0x18b2: 0x0008, 0x18b3: 0x0008, 0x18b4: 0x0040, 0x18b5: 0x0008, + 0x18b6: 0x0008, 0x18b7: 0x0008, 0x18b8: 0x0008, 0x18b9: 0x0008, 0x18ba: 0x0040, 0x18bb: 0x3308, + 0x18bc: 0x3308, 0x18bd: 0x0008, 0x18be: 0x3008, 0x18bf: 0x3008, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x3308, 0x18c1: 0x3008, 0x18c2: 0x3008, 0x18c3: 0x3008, 0x18c4: 0x3008, 0x18c5: 0x0040, + 0x18c6: 0x0040, 0x18c7: 0x3008, 0x18c8: 0x3008, 0x18c9: 0x0040, 0x18ca: 0x0040, 0x18cb: 0x3008, + 0x18cc: 0x3008, 0x18cd: 0x3808, 0x18ce: 0x0040, 0x18cf: 0x0040, 0x18d0: 0x0008, 0x18d1: 0x0040, + 0x18d2: 0x0040, 0x18d3: 0x0040, 0x18d4: 0x0040, 0x18d5: 0x0040, 0x18d6: 0x0040, 0x18d7: 0x3008, + 0x18d8: 0x0040, 0x18d9: 0x0040, 0x18da: 0x0040, 0x18db: 0x0040, 0x18dc: 0x0040, 0x18dd: 0x0008, + 0x18de: 0x0008, 0x18df: 0x0008, 0x18e0: 0x0008, 0x18e1: 0x0008, 0x18e2: 0x3008, 0x18e3: 0x3008, + 0x18e4: 0x0040, 0x18e5: 0x0040, 0x18e6: 0x3308, 0x18e7: 0x3308, 0x18e8: 0x3308, 0x18e9: 0x3308, + 0x18ea: 0x3308, 0x18eb: 0x3308, 0x18ec: 0x3308, 0x18ed: 0x0040, 0x18ee: 0x0040, 0x18ef: 0x0040, + 0x18f0: 0x3308, 0x18f1: 0x3308, 0x18f2: 0x3308, 0x18f3: 0x3308, 0x18f4: 0x3308, 0x18f5: 0x0040, + 0x18f6: 0x0040, 0x18f7: 0x0040, 0x18f8: 0x0040, 0x18f9: 0x0040, 0x18fa: 0x0040, 0x18fb: 0x0040, + 0x18fc: 0x0040, 0x18fd: 0x0040, 0x18fe: 0x0040, 0x18ff: 0x0040, + // Block 0x64, offset 0x1900 + 0x1900: 0x0008, 0x1901: 0x0008, 0x1902: 0x0008, 0x1903: 0x0008, 0x1904: 0x0008, 0x1905: 0x0008, + 0x1906: 0x0008, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0008, 0x190a: 0x0040, 0x190b: 0x0040, + 0x190c: 0x0008, 0x190d: 0x0008, 0x190e: 0x0008, 0x190f: 0x0008, 0x1910: 0x0008, 0x1911: 0x0008, + 0x1912: 0x0008, 0x1913: 0x0008, 0x1914: 0x0040, 0x1915: 0x0008, 0x1916: 0x0008, 0x1917: 0x0040, + 0x1918: 0x0008, 0x1919: 0x0008, 0x191a: 0x0008, 0x191b: 0x0008, 0x191c: 0x0008, 0x191d: 0x0008, + 0x191e: 0x0008, 0x191f: 0x0008, 0x1920: 0x0008, 0x1921: 0x0008, 0x1922: 0x0008, 0x1923: 0x0008, + 0x1924: 0x0008, 0x1925: 0x0008, 0x1926: 0x0008, 0x1927: 0x0008, 0x1928: 0x0008, 0x1929: 0x0008, + 0x192a: 0x0008, 0x192b: 0x0008, 0x192c: 0x0008, 0x192d: 0x0008, 0x192e: 0x0008, 0x192f: 0x0008, + 0x1930: 0x3008, 0x1931: 0x3008, 0x1932: 0x3008, 0x1933: 0x3008, 0x1934: 0x3008, 0x1935: 0x3008, + 0x1936: 0x0040, 0x1937: 0x3008, 0x1938: 0x3008, 0x1939: 0x0040, 0x193a: 0x0040, 0x193b: 0x3308, + 0x193c: 0x3308, 0x193d: 0x3808, 0x193e: 0x3b08, 0x193f: 0x0008, + // Block 0x65, offset 0x1940 + 0x1940: 0x0019, 0x1941: 0x02e9, 0x1942: 0x03d9, 0x1943: 0x02f1, 0x1944: 0x02f9, 0x1945: 0x03f1, + 0x1946: 0x0309, 0x1947: 0x00a9, 0x1948: 0x0311, 0x1949: 0x00b1, 0x194a: 0x0319, 0x194b: 0x0101, + 0x194c: 0x0321, 0x194d: 0x0329, 0x194e: 0x0051, 0x194f: 0x0339, 0x1950: 0x0751, 0x1951: 0x00b9, + 0x1952: 0x0089, 0x1953: 0x0341, 0x1954: 0x0349, 0x1955: 0x0391, 0x1956: 0x00c1, 0x1957: 0x0109, + 0x1958: 0x00c9, 0x1959: 0x04b1, 0x195a: 0x0019, 0x195b: 0x02e9, 0x195c: 0x03d9, 0x195d: 0x02f1, + 0x195e: 0x02f9, 0x195f: 0x03f1, 0x1960: 0x0309, 0x1961: 0x00a9, 0x1962: 0x0311, 0x1963: 0x00b1, + 0x1964: 0x0319, 0x1965: 0x0101, 0x1966: 0x0321, 0x1967: 0x0329, 0x1968: 0x0051, 0x1969: 0x0339, + 0x196a: 0x0751, 0x196b: 0x00b9, 0x196c: 0x0089, 0x196d: 0x0341, 0x196e: 0x0349, 0x196f: 0x0391, + 0x1970: 0x00c1, 0x1971: 0x0109, 0x1972: 0x00c9, 0x1973: 0x04b1, 0x1974: 0x0019, 0x1975: 0x02e9, + 0x1976: 0x03d9, 0x1977: 0x02f1, 0x1978: 0x02f9, 0x1979: 0x03f1, 0x197a: 0x0309, 0x197b: 0x00a9, + 0x197c: 0x0311, 0x197d: 0x00b1, 0x197e: 0x0319, 0x197f: 0x0101, + // Block 0x66, offset 0x1980 + 0x1980: 0x0321, 0x1981: 0x0329, 0x1982: 0x0051, 0x1983: 0x0339, 0x1984: 0x0751, 0x1985: 0x00b9, + 0x1986: 0x0089, 0x1987: 0x0341, 0x1988: 0x0349, 0x1989: 0x0391, 0x198a: 0x00c1, 0x198b: 0x0109, + 0x198c: 0x00c9, 0x198d: 0x04b1, 0x198e: 0x0019, 0x198f: 0x02e9, 0x1990: 0x03d9, 0x1991: 0x02f1, + 0x1992: 0x02f9, 0x1993: 0x03f1, 0x1994: 0x0309, 0x1995: 0x0040, 0x1996: 0x0311, 0x1997: 0x00b1, + 0x1998: 0x0319, 0x1999: 0x0101, 0x199a: 0x0321, 0x199b: 0x0329, 0x199c: 0x0051, 0x199d: 0x0339, + 0x199e: 0x0751, 0x199f: 0x00b9, 0x19a0: 0x0089, 0x19a1: 0x0341, 0x19a2: 0x0349, 0x19a3: 0x0391, + 0x19a4: 0x00c1, 0x19a5: 0x0109, 0x19a6: 0x00c9, 0x19a7: 0x04b1, 0x19a8: 0x0019, 0x19a9: 0x02e9, + 0x19aa: 0x03d9, 0x19ab: 0x02f1, 0x19ac: 0x02f9, 0x19ad: 0x03f1, 0x19ae: 0x0309, 0x19af: 0x00a9, + 0x19b0: 0x0311, 0x19b1: 0x00b1, 0x19b2: 0x0319, 0x19b3: 0x0101, 0x19b4: 0x0321, 0x19b5: 0x0329, + 0x19b6: 0x0051, 0x19b7: 0x0339, 0x19b8: 0x0751, 0x19b9: 0x00b9, 0x19ba: 0x0089, 0x19bb: 0x0341, + 0x19bc: 0x0349, 0x19bd: 0x0391, 0x19be: 0x00c1, 0x19bf: 0x0109, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x00c9, 0x19c1: 0x04b1, 0x19c2: 0x0019, 0x19c3: 0x02e9, 0x19c4: 0x03d9, 0x19c5: 0x02f1, + 0x19c6: 0x02f9, 0x19c7: 0x03f1, 0x19c8: 0x0309, 0x19c9: 0x00a9, 0x19ca: 0x0311, 0x19cb: 0x00b1, + 0x19cc: 0x0319, 0x19cd: 0x0101, 0x19ce: 0x0321, 0x19cf: 0x0329, 0x19d0: 0x0051, 0x19d1: 0x0339, + 0x19d2: 0x0751, 0x19d3: 0x00b9, 0x19d4: 0x0089, 0x19d5: 0x0341, 0x19d6: 0x0349, 0x19d7: 0x0391, + 0x19d8: 0x00c1, 0x19d9: 0x0109, 0x19da: 0x00c9, 0x19db: 0x04b1, 0x19dc: 0x0019, 0x19dd: 0x0040, + 0x19de: 0x03d9, 0x19df: 0x02f1, 0x19e0: 0x0040, 0x19e1: 0x0040, 0x19e2: 0x0309, 0x19e3: 0x0040, + 0x19e4: 0x0040, 0x19e5: 0x00b1, 0x19e6: 0x0319, 0x19e7: 0x0040, 0x19e8: 0x0040, 0x19e9: 0x0329, + 0x19ea: 0x0051, 0x19eb: 0x0339, 0x19ec: 0x0751, 0x19ed: 0x0040, 0x19ee: 0x0089, 0x19ef: 0x0341, + 0x19f0: 0x0349, 0x19f1: 0x0391, 0x19f2: 0x00c1, 0x19f3: 0x0109, 0x19f4: 0x00c9, 0x19f5: 0x04b1, + 0x19f6: 0x0019, 0x19f7: 0x02e9, 0x19f8: 0x03d9, 0x19f9: 0x02f1, 0x19fa: 0x0040, 0x19fb: 0x03f1, + 0x19fc: 0x0040, 0x19fd: 0x00a9, 0x19fe: 0x0311, 0x19ff: 0x00b1, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0319, 0x1a01: 0x0101, 0x1a02: 0x0321, 0x1a03: 0x0329, 0x1a04: 0x0040, 0x1a05: 0x0339, + 0x1a06: 0x0751, 0x1a07: 0x00b9, 0x1a08: 0x0089, 0x1a09: 0x0341, 0x1a0a: 0x0349, 0x1a0b: 0x0391, + 0x1a0c: 0x00c1, 0x1a0d: 0x0109, 0x1a0e: 0x00c9, 0x1a0f: 0x04b1, 0x1a10: 0x0019, 0x1a11: 0x02e9, + 0x1a12: 0x03d9, 0x1a13: 0x02f1, 0x1a14: 0x02f9, 0x1a15: 0x03f1, 0x1a16: 0x0309, 0x1a17: 0x00a9, + 0x1a18: 0x0311, 0x1a19: 0x00b1, 0x1a1a: 0x0319, 0x1a1b: 0x0101, 0x1a1c: 0x0321, 0x1a1d: 0x0329, + 0x1a1e: 0x0051, 0x1a1f: 0x0339, 0x1a20: 0x0751, 0x1a21: 0x00b9, 0x1a22: 0x0089, 0x1a23: 0x0341, + 0x1a24: 0x0349, 0x1a25: 0x0391, 0x1a26: 0x00c1, 0x1a27: 0x0109, 0x1a28: 0x00c9, 0x1a29: 0x04b1, + 0x1a2a: 0x0019, 0x1a2b: 0x02e9, 0x1a2c: 0x03d9, 0x1a2d: 0x02f1, 0x1a2e: 0x02f9, 0x1a2f: 0x03f1, + 0x1a30: 0x0309, 0x1a31: 0x00a9, 0x1a32: 0x0311, 0x1a33: 0x00b1, 0x1a34: 0x0319, 0x1a35: 0x0101, + 0x1a36: 0x0321, 0x1a37: 0x0329, 0x1a38: 0x0051, 0x1a39: 0x0339, 0x1a3a: 0x0751, 0x1a3b: 0x00b9, + 0x1a3c: 0x0089, 0x1a3d: 0x0341, 0x1a3e: 0x0349, 0x1a3f: 0x0391, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x00c1, 0x1a41: 0x0109, 0x1a42: 0x00c9, 0x1a43: 0x04b1, 0x1a44: 0x0019, 0x1a45: 0x02e9, + 0x1a46: 0x0040, 0x1a47: 0x02f1, 0x1a48: 0x02f9, 0x1a49: 0x03f1, 0x1a4a: 0x0309, 0x1a4b: 0x0040, + 0x1a4c: 0x0040, 0x1a4d: 0x00b1, 0x1a4e: 0x0319, 0x1a4f: 0x0101, 0x1a50: 0x0321, 0x1a51: 0x0329, + 0x1a52: 0x0051, 0x1a53: 0x0339, 0x1a54: 0x0751, 0x1a55: 0x0040, 0x1a56: 0x0089, 0x1a57: 0x0341, + 0x1a58: 0x0349, 0x1a59: 0x0391, 0x1a5a: 0x00c1, 0x1a5b: 0x0109, 0x1a5c: 0x00c9, 0x1a5d: 0x0040, + 0x1a5e: 0x0019, 0x1a5f: 0x02e9, 0x1a60: 0x03d9, 0x1a61: 0x02f1, 0x1a62: 0x02f9, 0x1a63: 0x03f1, + 0x1a64: 0x0309, 0x1a65: 0x00a9, 0x1a66: 0x0311, 0x1a67: 0x00b1, 0x1a68: 0x0319, 0x1a69: 0x0101, + 0x1a6a: 0x0321, 0x1a6b: 0x0329, 0x1a6c: 0x0051, 0x1a6d: 0x0339, 0x1a6e: 0x0751, 0x1a6f: 0x00b9, + 0x1a70: 0x0089, 0x1a71: 0x0341, 0x1a72: 0x0349, 0x1a73: 0x0391, 0x1a74: 0x00c1, 0x1a75: 0x0109, + 0x1a76: 0x00c9, 0x1a77: 0x04b1, 0x1a78: 0x0019, 0x1a79: 0x02e9, 0x1a7a: 0x0040, 0x1a7b: 0x02f1, + 0x1a7c: 0x02f9, 0x1a7d: 0x03f1, 0x1a7e: 0x0309, 0x1a7f: 0x0040, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0311, 0x1a81: 0x00b1, 0x1a82: 0x0319, 0x1a83: 0x0101, 0x1a84: 0x0321, 0x1a85: 0x0040, + 0x1a86: 0x0051, 0x1a87: 0x0040, 0x1a88: 0x0040, 0x1a89: 0x0040, 0x1a8a: 0x0089, 0x1a8b: 0x0341, + 0x1a8c: 0x0349, 0x1a8d: 0x0391, 0x1a8e: 0x00c1, 0x1a8f: 0x0109, 0x1a90: 0x00c9, 0x1a91: 0x0040, + 0x1a92: 0x0019, 0x1a93: 0x02e9, 0x1a94: 0x03d9, 0x1a95: 0x02f1, 0x1a96: 0x02f9, 0x1a97: 0x03f1, + 0x1a98: 0x0309, 0x1a99: 0x00a9, 0x1a9a: 0x0311, 0x1a9b: 0x00b1, 0x1a9c: 0x0319, 0x1a9d: 0x0101, + 0x1a9e: 0x0321, 0x1a9f: 0x0329, 0x1aa0: 0x0051, 0x1aa1: 0x0339, 0x1aa2: 0x0751, 0x1aa3: 0x00b9, + 0x1aa4: 0x0089, 0x1aa5: 0x0341, 0x1aa6: 0x0349, 0x1aa7: 0x0391, 0x1aa8: 0x00c1, 0x1aa9: 0x0109, + 0x1aaa: 0x00c9, 0x1aab: 0x04b1, 0x1aac: 0x0019, 0x1aad: 0x02e9, 0x1aae: 0x03d9, 0x1aaf: 0x02f1, + 0x1ab0: 0x02f9, 0x1ab1: 0x03f1, 0x1ab2: 0x0309, 0x1ab3: 0x00a9, 0x1ab4: 0x0311, 0x1ab5: 0x00b1, + 0x1ab6: 0x0319, 0x1ab7: 0x0101, 0x1ab8: 0x0321, 0x1ab9: 0x0329, 0x1aba: 0x0051, 0x1abb: 0x0339, + 0x1abc: 0x0751, 0x1abd: 0x00b9, 0x1abe: 0x0089, 0x1abf: 0x0341, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x0349, 0x1ac1: 0x0391, 0x1ac2: 0x00c1, 0x1ac3: 0x0109, 0x1ac4: 0x00c9, 0x1ac5: 0x04b1, + 0x1ac6: 0x0019, 0x1ac7: 0x02e9, 0x1ac8: 0x03d9, 0x1ac9: 0x02f1, 0x1aca: 0x02f9, 0x1acb: 0x03f1, + 0x1acc: 0x0309, 0x1acd: 0x00a9, 0x1ace: 0x0311, 0x1acf: 0x00b1, 0x1ad0: 0x0319, 0x1ad1: 0x0101, + 0x1ad2: 0x0321, 0x1ad3: 0x0329, 0x1ad4: 0x0051, 0x1ad5: 0x0339, 0x1ad6: 0x0751, 0x1ad7: 0x00b9, + 0x1ad8: 0x0089, 0x1ad9: 0x0341, 0x1ada: 0x0349, 0x1adb: 0x0391, 0x1adc: 0x00c1, 0x1add: 0x0109, + 0x1ade: 0x00c9, 0x1adf: 0x04b1, 0x1ae0: 0x0019, 0x1ae1: 0x02e9, 0x1ae2: 0x03d9, 0x1ae3: 0x02f1, + 0x1ae4: 0x02f9, 0x1ae5: 0x03f1, 0x1ae6: 0x0309, 0x1ae7: 0x00a9, 0x1ae8: 0x0311, 0x1ae9: 0x00b1, + 0x1aea: 0x0319, 0x1aeb: 0x0101, 0x1aec: 0x0321, 0x1aed: 0x0329, 0x1aee: 0x0051, 0x1aef: 0x0339, + 0x1af0: 0x0751, 0x1af1: 0x00b9, 0x1af2: 0x0089, 0x1af3: 0x0341, 0x1af4: 0x0349, 0x1af5: 0x0391, + 0x1af6: 0x00c1, 0x1af7: 0x0109, 0x1af8: 0x00c9, 0x1af9: 0x04b1, 0x1afa: 0x0019, 0x1afb: 0x02e9, + 0x1afc: 0x03d9, 0x1afd: 0x02f1, 0x1afe: 0x02f9, 0x1aff: 0x03f1, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x0309, 0x1b01: 0x00a9, 0x1b02: 0x0311, 0x1b03: 0x00b1, 0x1b04: 0x0319, 0x1b05: 0x0101, + 0x1b06: 0x0321, 0x1b07: 0x0329, 0x1b08: 0x0051, 0x1b09: 0x0339, 0x1b0a: 0x0751, 0x1b0b: 0x00b9, + 0x1b0c: 0x0089, 0x1b0d: 0x0341, 0x1b0e: 0x0349, 0x1b0f: 0x0391, 0x1b10: 0x00c1, 0x1b11: 0x0109, + 0x1b12: 0x00c9, 0x1b13: 0x04b1, 0x1b14: 0x0019, 0x1b15: 0x02e9, 0x1b16: 0x03d9, 0x1b17: 0x02f1, + 0x1b18: 0x02f9, 0x1b19: 0x03f1, 0x1b1a: 0x0309, 0x1b1b: 0x00a9, 0x1b1c: 0x0311, 0x1b1d: 0x00b1, + 0x1b1e: 0x0319, 0x1b1f: 0x0101, 0x1b20: 0x0321, 0x1b21: 0x0329, 0x1b22: 0x0051, 0x1b23: 0x0339, + 0x1b24: 0x0751, 0x1b25: 0x00b9, 0x1b26: 0x0089, 0x1b27: 0x0341, 0x1b28: 0x0349, 0x1b29: 0x0391, + 0x1b2a: 0x00c1, 0x1b2b: 0x0109, 0x1b2c: 0x00c9, 0x1b2d: 0x04b1, 0x1b2e: 0x0019, 0x1b2f: 0x02e9, + 0x1b30: 0x03d9, 0x1b31: 0x02f1, 0x1b32: 0x02f9, 0x1b33: 0x03f1, 0x1b34: 0x0309, 0x1b35: 0x00a9, + 0x1b36: 0x0311, 0x1b37: 0x00b1, 0x1b38: 0x0319, 0x1b39: 0x0101, 0x1b3a: 0x0321, 0x1b3b: 0x0329, + 0x1b3c: 0x0051, 0x1b3d: 0x0339, 0x1b3e: 0x0751, 0x1b3f: 0x00b9, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x0089, 0x1b41: 0x0341, 0x1b42: 0x0349, 0x1b43: 0x0391, 0x1b44: 0x00c1, 0x1b45: 0x0109, + 0x1b46: 0x00c9, 0x1b47: 0x04b1, 0x1b48: 0x0019, 0x1b49: 0x02e9, 0x1b4a: 0x03d9, 0x1b4b: 0x02f1, + 0x1b4c: 0x02f9, 0x1b4d: 0x03f1, 0x1b4e: 0x0309, 0x1b4f: 0x00a9, 0x1b50: 0x0311, 0x1b51: 0x00b1, + 0x1b52: 0x0319, 0x1b53: 0x0101, 0x1b54: 0x0321, 0x1b55: 0x0329, 0x1b56: 0x0051, 0x1b57: 0x0339, + 0x1b58: 0x0751, 0x1b59: 0x00b9, 0x1b5a: 0x0089, 0x1b5b: 0x0341, 0x1b5c: 0x0349, 0x1b5d: 0x0391, + 0x1b5e: 0x00c1, 0x1b5f: 0x0109, 0x1b60: 0x00c9, 0x1b61: 0x04b1, 0x1b62: 0x0019, 0x1b63: 0x02e9, + 0x1b64: 0x03d9, 0x1b65: 0x02f1, 0x1b66: 0x02f9, 0x1b67: 0x03f1, 0x1b68: 0x0309, 0x1b69: 0x00a9, + 0x1b6a: 0x0311, 0x1b6b: 0x00b1, 0x1b6c: 0x0319, 0x1b6d: 0x0101, 0x1b6e: 0x0321, 0x1b6f: 0x0329, + 0x1b70: 0x0051, 0x1b71: 0x0339, 0x1b72: 0x0751, 0x1b73: 0x00b9, 0x1b74: 0x0089, 0x1b75: 0x0341, + 0x1b76: 0x0349, 0x1b77: 0x0391, 0x1b78: 0x00c1, 0x1b79: 0x0109, 0x1b7a: 0x00c9, 0x1b7b: 0x04b1, + 0x1b7c: 0x0019, 0x1b7d: 0x02e9, 0x1b7e: 0x03d9, 0x1b7f: 0x02f1, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x02f9, 0x1b81: 0x03f1, 0x1b82: 0x0309, 0x1b83: 0x00a9, 0x1b84: 0x0311, 0x1b85: 0x00b1, + 0x1b86: 0x0319, 0x1b87: 0x0101, 0x1b88: 0x0321, 0x1b89: 0x0329, 0x1b8a: 0x0051, 0x1b8b: 0x0339, + 0x1b8c: 0x0751, 0x1b8d: 0x00b9, 0x1b8e: 0x0089, 0x1b8f: 0x0341, 0x1b90: 0x0349, 0x1b91: 0x0391, + 0x1b92: 0x00c1, 0x1b93: 0x0109, 0x1b94: 0x00c9, 0x1b95: 0x04b1, 0x1b96: 0x0019, 0x1b97: 0x02e9, + 0x1b98: 0x03d9, 0x1b99: 0x02f1, 0x1b9a: 0x02f9, 0x1b9b: 0x03f1, 0x1b9c: 0x0309, 0x1b9d: 0x00a9, + 0x1b9e: 0x0311, 0x1b9f: 0x00b1, 0x1ba0: 0x0319, 0x1ba1: 0x0101, 0x1ba2: 0x0321, 0x1ba3: 0x0329, + 0x1ba4: 0x0051, 0x1ba5: 0x0339, 0x1ba6: 0x0751, 0x1ba7: 0x00b9, 0x1ba8: 0x0089, 0x1ba9: 0x0341, + 0x1baa: 0x0349, 0x1bab: 0x0391, 0x1bac: 0x00c1, 0x1bad: 0x0109, 0x1bae: 0x00c9, 0x1baf: 0x04b1, + 0x1bb0: 0x0019, 0x1bb1: 0x02e9, 0x1bb2: 0x03d9, 0x1bb3: 0x02f1, 0x1bb4: 0x02f9, 0x1bb5: 0x03f1, + 0x1bb6: 0x0309, 0x1bb7: 0x00a9, 0x1bb8: 0x0311, 0x1bb9: 0x00b1, 0x1bba: 0x0319, 0x1bbb: 0x0101, + 0x1bbc: 0x0321, 0x1bbd: 0x0329, 0x1bbe: 0x0051, 0x1bbf: 0x0339, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0751, 0x1bc1: 0x00b9, 0x1bc2: 0x0089, 0x1bc3: 0x0341, 0x1bc4: 0x0349, 0x1bc5: 0x0391, + 0x1bc6: 0x00c1, 0x1bc7: 0x0109, 0x1bc8: 0x00c9, 0x1bc9: 0x04b1, 0x1bca: 0x0019, 0x1bcb: 0x02e9, + 0x1bcc: 0x03d9, 0x1bcd: 0x02f1, 0x1bce: 0x02f9, 0x1bcf: 0x03f1, 0x1bd0: 0x0309, 0x1bd1: 0x00a9, + 0x1bd2: 0x0311, 0x1bd3: 0x00b1, 0x1bd4: 0x0319, 0x1bd5: 0x0101, 0x1bd6: 0x0321, 0x1bd7: 0x0329, + 0x1bd8: 0x0051, 0x1bd9: 0x0339, 0x1bda: 0x0751, 0x1bdb: 0x00b9, 0x1bdc: 0x0089, 0x1bdd: 0x0341, + 0x1bde: 0x0349, 0x1bdf: 0x0391, 0x1be0: 0x00c1, 0x1be1: 0x0109, 0x1be2: 0x00c9, 0x1be3: 0x04b1, + 0x1be4: 0x23e1, 0x1be5: 0x23e9, 0x1be6: 0x0040, 0x1be7: 0x0040, 0x1be8: 0x23f1, 0x1be9: 0x0399, + 0x1bea: 0x03a1, 0x1beb: 0x03a9, 0x1bec: 0x23f9, 0x1bed: 0x2401, 0x1bee: 0x2409, 0x1bef: 0x04d1, + 0x1bf0: 0x05f9, 0x1bf1: 0x2411, 0x1bf2: 0x2419, 0x1bf3: 0x2421, 0x1bf4: 0x2429, 0x1bf5: 0x2431, + 0x1bf6: 0x2439, 0x1bf7: 0x0799, 0x1bf8: 0x03c1, 0x1bf9: 0x04d1, 0x1bfa: 0x2441, 0x1bfb: 0x2449, + 0x1bfc: 0x2451, 0x1bfd: 0x03b1, 0x1bfe: 0x03b9, 0x1bff: 0x2459, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x0769, 0x1c01: 0x2461, 0x1c02: 0x23f1, 0x1c03: 0x0399, 0x1c04: 0x03a1, 0x1c05: 0x03a9, + 0x1c06: 0x23f9, 0x1c07: 0x2401, 0x1c08: 0x2409, 0x1c09: 0x04d1, 0x1c0a: 0x05f9, 0x1c0b: 0x2411, + 0x1c0c: 0x2419, 0x1c0d: 0x2421, 0x1c0e: 0x2429, 0x1c0f: 0x2431, 0x1c10: 0x2439, 0x1c11: 0x0799, + 0x1c12: 0x03c1, 0x1c13: 0x2441, 0x1c14: 0x2441, 0x1c15: 0x2449, 0x1c16: 0x2451, 0x1c17: 0x03b1, + 0x1c18: 0x03b9, 0x1c19: 0x2459, 0x1c1a: 0x0769, 0x1c1b: 0x2469, 0x1c1c: 0x23f9, 0x1c1d: 0x04d1, + 0x1c1e: 0x2411, 0x1c1f: 0x03b1, 0x1c20: 0x03c1, 0x1c21: 0x0799, 0x1c22: 0x23f1, 0x1c23: 0x0399, + 0x1c24: 0x03a1, 0x1c25: 0x03a9, 0x1c26: 0x23f9, 0x1c27: 0x2401, 0x1c28: 0x2409, 0x1c29: 0x04d1, + 0x1c2a: 0x05f9, 0x1c2b: 0x2411, 0x1c2c: 0x2419, 0x1c2d: 0x2421, 0x1c2e: 0x2429, 0x1c2f: 0x2431, + 0x1c30: 0x2439, 0x1c31: 0x0799, 0x1c32: 0x03c1, 0x1c33: 0x04d1, 0x1c34: 0x2441, 0x1c35: 0x2449, + 0x1c36: 0x2451, 0x1c37: 0x03b1, 0x1c38: 0x03b9, 0x1c39: 0x2459, 0x1c3a: 0x0769, 0x1c3b: 0x2461, + 0x1c3c: 0x23f1, 0x1c3d: 0x0399, 0x1c3e: 0x03a1, 0x1c3f: 0x03a9, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x23f9, 0x1c41: 0x2401, 0x1c42: 0x2409, 0x1c43: 0x04d1, 0x1c44: 0x05f9, 0x1c45: 0x2411, + 0x1c46: 0x2419, 0x1c47: 0x2421, 0x1c48: 0x2429, 0x1c49: 0x2431, 0x1c4a: 0x2439, 0x1c4b: 0x0799, + 0x1c4c: 0x03c1, 0x1c4d: 0x2441, 0x1c4e: 0x2441, 0x1c4f: 0x2449, 0x1c50: 0x2451, 0x1c51: 0x03b1, + 0x1c52: 0x03b9, 0x1c53: 0x2459, 0x1c54: 0x0769, 0x1c55: 0x2469, 0x1c56: 0x23f9, 0x1c57: 0x04d1, + 0x1c58: 0x2411, 0x1c59: 0x03b1, 0x1c5a: 0x03c1, 0x1c5b: 0x0799, 0x1c5c: 0x23f1, 0x1c5d: 0x0399, + 0x1c5e: 0x03a1, 0x1c5f: 0x03a9, 0x1c60: 0x23f9, 0x1c61: 0x2401, 0x1c62: 0x2409, 0x1c63: 0x04d1, + 0x1c64: 0x05f9, 0x1c65: 0x2411, 0x1c66: 0x2419, 0x1c67: 0x2421, 0x1c68: 0x2429, 0x1c69: 0x2431, + 0x1c6a: 0x2439, 0x1c6b: 0x0799, 0x1c6c: 0x03c1, 0x1c6d: 0x04d1, 0x1c6e: 0x2441, 0x1c6f: 0x2449, + 0x1c70: 0x2451, 0x1c71: 0x03b1, 0x1c72: 0x03b9, 0x1c73: 0x2459, 0x1c74: 0x0769, 0x1c75: 0x2461, + 0x1c76: 0x23f1, 0x1c77: 0x0399, 0x1c78: 0x03a1, 0x1c79: 0x03a9, 0x1c7a: 0x23f9, 0x1c7b: 0x2401, + 0x1c7c: 0x2409, 0x1c7d: 0x04d1, 0x1c7e: 0x05f9, 0x1c7f: 0x2411, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x2419, 0x1c81: 0x2421, 0x1c82: 0x2429, 0x1c83: 0x2431, 0x1c84: 0x2439, 0x1c85: 0x0799, + 0x1c86: 0x03c1, 0x1c87: 0x2441, 0x1c88: 0x2441, 0x1c89: 0x2449, 0x1c8a: 0x2451, 0x1c8b: 0x03b1, + 0x1c8c: 0x03b9, 0x1c8d: 0x2459, 0x1c8e: 0x0769, 0x1c8f: 0x2469, 0x1c90: 0x23f9, 0x1c91: 0x04d1, + 0x1c92: 0x2411, 0x1c93: 0x03b1, 0x1c94: 0x03c1, 0x1c95: 0x0799, 0x1c96: 0x23f1, 0x1c97: 0x0399, + 0x1c98: 0x03a1, 0x1c99: 0x03a9, 0x1c9a: 0x23f9, 0x1c9b: 0x2401, 0x1c9c: 0x2409, 0x1c9d: 0x04d1, + 0x1c9e: 0x05f9, 0x1c9f: 0x2411, 0x1ca0: 0x2419, 0x1ca1: 0x2421, 0x1ca2: 0x2429, 0x1ca3: 0x2431, + 0x1ca4: 0x2439, 0x1ca5: 0x0799, 0x1ca6: 0x03c1, 0x1ca7: 0x04d1, 0x1ca8: 0x2441, 0x1ca9: 0x2449, + 0x1caa: 0x2451, 0x1cab: 0x03b1, 0x1cac: 0x03b9, 0x1cad: 0x2459, 0x1cae: 0x0769, 0x1caf: 0x2461, + 0x1cb0: 0x23f1, 0x1cb1: 0x0399, 0x1cb2: 0x03a1, 0x1cb3: 0x03a9, 0x1cb4: 0x23f9, 0x1cb5: 0x2401, + 0x1cb6: 0x2409, 0x1cb7: 0x04d1, 0x1cb8: 0x05f9, 0x1cb9: 0x2411, 0x1cba: 0x2419, 0x1cbb: 0x2421, + 0x1cbc: 0x2429, 0x1cbd: 0x2431, 0x1cbe: 0x2439, 0x1cbf: 0x0799, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x03c1, 0x1cc1: 0x2441, 0x1cc2: 0x2441, 0x1cc3: 0x2449, 0x1cc4: 0x2451, 0x1cc5: 0x03b1, + 0x1cc6: 0x03b9, 0x1cc7: 0x2459, 0x1cc8: 0x0769, 0x1cc9: 0x2469, 0x1cca: 0x23f9, 0x1ccb: 0x04d1, + 0x1ccc: 0x2411, 0x1ccd: 0x03b1, 0x1cce: 0x03c1, 0x1ccf: 0x0799, 0x1cd0: 0x23f1, 0x1cd1: 0x0399, + 0x1cd2: 0x03a1, 0x1cd3: 0x03a9, 0x1cd4: 0x23f9, 0x1cd5: 0x2401, 0x1cd6: 0x2409, 0x1cd7: 0x04d1, + 0x1cd8: 0x05f9, 0x1cd9: 0x2411, 0x1cda: 0x2419, 0x1cdb: 0x2421, 0x1cdc: 0x2429, 0x1cdd: 0x2431, + 0x1cde: 0x2439, 0x1cdf: 0x0799, 0x1ce0: 0x03c1, 0x1ce1: 0x04d1, 0x1ce2: 0x2441, 0x1ce3: 0x2449, + 0x1ce4: 0x2451, 0x1ce5: 0x03b1, 0x1ce6: 0x03b9, 0x1ce7: 0x2459, 0x1ce8: 0x0769, 0x1ce9: 0x2461, + 0x1cea: 0x23f1, 0x1ceb: 0x0399, 0x1cec: 0x03a1, 0x1ced: 0x03a9, 0x1cee: 0x23f9, 0x1cef: 0x2401, + 0x1cf0: 0x2409, 0x1cf1: 0x04d1, 0x1cf2: 0x05f9, 0x1cf3: 0x2411, 0x1cf4: 0x2419, 0x1cf5: 0x2421, + 0x1cf6: 0x2429, 0x1cf7: 0x2431, 0x1cf8: 0x2439, 0x1cf9: 0x0799, 0x1cfa: 0x03c1, 0x1cfb: 0x2441, + 0x1cfc: 0x2441, 0x1cfd: 0x2449, 0x1cfe: 0x2451, 0x1cff: 0x03b1, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x03b9, 0x1d01: 0x2459, 0x1d02: 0x0769, 0x1d03: 0x2469, 0x1d04: 0x23f9, 0x1d05: 0x04d1, + 0x1d06: 0x2411, 0x1d07: 0x03b1, 0x1d08: 0x03c1, 0x1d09: 0x0799, 0x1d0a: 0x2471, 0x1d0b: 0x2471, + 0x1d0c: 0x0040, 0x1d0d: 0x0040, 0x1d0e: 0x06e1, 0x1d0f: 0x0049, 0x1d10: 0x0029, 0x1d11: 0x0031, + 0x1d12: 0x06e9, 0x1d13: 0x06f1, 0x1d14: 0x06f9, 0x1d15: 0x0701, 0x1d16: 0x0709, 0x1d17: 0x0711, + 0x1d18: 0x06e1, 0x1d19: 0x0049, 0x1d1a: 0x0029, 0x1d1b: 0x0031, 0x1d1c: 0x06e9, 0x1d1d: 0x06f1, + 0x1d1e: 0x06f9, 0x1d1f: 0x0701, 0x1d20: 0x0709, 0x1d21: 0x0711, 0x1d22: 0x06e1, 0x1d23: 0x0049, + 0x1d24: 0x0029, 0x1d25: 0x0031, 0x1d26: 0x06e9, 0x1d27: 0x06f1, 0x1d28: 0x06f9, 0x1d29: 0x0701, + 0x1d2a: 0x0709, 0x1d2b: 0x0711, 0x1d2c: 0x06e1, 0x1d2d: 0x0049, 0x1d2e: 0x0029, 0x1d2f: 0x0031, + 0x1d30: 0x06e9, 0x1d31: 0x06f1, 0x1d32: 0x06f9, 0x1d33: 0x0701, 0x1d34: 0x0709, 0x1d35: 0x0711, + 0x1d36: 0x06e1, 0x1d37: 0x0049, 0x1d38: 0x0029, 0x1d39: 0x0031, 0x1d3a: 0x06e9, 0x1d3b: 0x06f1, + 0x1d3c: 0x06f9, 0x1d3d: 0x0701, 0x1d3e: 0x0709, 0x1d3f: 0x0711, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x3308, 0x1d41: 0x3308, 0x1d42: 0x3308, 0x1d43: 0x3308, 0x1d44: 0x3308, 0x1d45: 0x3308, + 0x1d46: 0x3308, 0x1d47: 0x0040, 0x1d48: 0x3308, 0x1d49: 0x3308, 0x1d4a: 0x3308, 0x1d4b: 0x3308, + 0x1d4c: 0x3308, 0x1d4d: 0x3308, 0x1d4e: 0x3308, 0x1d4f: 0x3308, 0x1d50: 0x3308, 0x1d51: 0x3308, + 0x1d52: 0x3308, 0x1d53: 0x3308, 0x1d54: 0x3308, 0x1d55: 0x3308, 0x1d56: 0x3308, 0x1d57: 0x3308, + 0x1d58: 0x3308, 0x1d59: 0x0040, 0x1d5a: 0x0040, 0x1d5b: 0x3308, 0x1d5c: 0x3308, 0x1d5d: 0x3308, + 0x1d5e: 0x3308, 0x1d5f: 0x3308, 0x1d60: 0x3308, 0x1d61: 0x3308, 0x1d62: 0x0040, 0x1d63: 0x3308, + 0x1d64: 0x3308, 0x1d65: 0x0040, 0x1d66: 0x3308, 0x1d67: 0x3308, 0x1d68: 0x3308, 0x1d69: 0x3308, + 0x1d6a: 0x3308, 0x1d6b: 0x0040, 0x1d6c: 0x0040, 0x1d6d: 0x0040, 0x1d6e: 0x0040, 0x1d6f: 0x0040, + 0x1d70: 0x2479, 0x1d71: 0x2481, 0x1d72: 0x02a9, 0x1d73: 0x2489, 0x1d74: 0x02b1, 0x1d75: 0x2491, + 0x1d76: 0x2499, 0x1d77: 0x24a1, 0x1d78: 0x24a9, 0x1d79: 0x24b1, 0x1d7a: 0x24b9, 0x1d7b: 0x24c1, + 0x1d7c: 0x02b9, 0x1d7d: 0x24c9, 0x1d7e: 0x24d1, 0x1d7f: 0x02c1, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x02c9, 0x1d81: 0x24d9, 0x1d82: 0x24e1, 0x1d83: 0x24e9, 0x1d84: 0x24f1, 0x1d85: 0x24f9, + 0x1d86: 0x2501, 0x1d87: 0x2509, 0x1d88: 0x2511, 0x1d89: 0x2519, 0x1d8a: 0x2521, 0x1d8b: 0x2529, + 0x1d8c: 0x2531, 0x1d8d: 0x2539, 0x1d8e: 0x2541, 0x1d8f: 0x2549, 0x1d90: 0x2551, 0x1d91: 0x2479, + 0x1d92: 0x2481, 0x1d93: 0x02a9, 0x1d94: 0x2489, 0x1d95: 0x02b1, 0x1d96: 0x2491, 0x1d97: 0x2499, + 0x1d98: 0x24a1, 0x1d99: 0x24a9, 0x1d9a: 0x24b1, 0x1d9b: 0x24b9, 0x1d9c: 0x02b9, 0x1d9d: 0x24c9, + 0x1d9e: 0x02c1, 0x1d9f: 0x24d9, 0x1da0: 0x24e1, 0x1da1: 0x24e9, 0x1da2: 0x24f1, 0x1da3: 0x24f9, + 0x1da4: 0x2501, 0x1da5: 0x02d1, 0x1da6: 0x2509, 0x1da7: 0x2559, 0x1da8: 0x2531, 0x1da9: 0x2561, + 0x1daa: 0x2569, 0x1dab: 0x2571, 0x1dac: 0x2579, 0x1dad: 0x2581, 0x1dae: 0x0040, 0x1daf: 0x0040, + 0x1db0: 0x0040, 0x1db1: 0x0040, 0x1db2: 0x0040, 0x1db3: 0x0040, 0x1db4: 0x0040, 0x1db5: 0x0040, + 0x1db6: 0x0040, 0x1db7: 0x0040, 0x1db8: 0x0040, 0x1db9: 0x0040, 0x1dba: 0x0040, 0x1dbb: 0x0040, + 0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xe115, 0x1dc1: 0xe115, 0x1dc2: 0xe135, 0x1dc3: 0xe135, 0x1dc4: 0xe115, 0x1dc5: 0xe115, + 0x1dc6: 0xe175, 0x1dc7: 0xe175, 0x1dc8: 0xe115, 0x1dc9: 0xe115, 0x1dca: 0xe135, 0x1dcb: 0xe135, + 0x1dcc: 0xe115, 0x1dcd: 0xe115, 0x1dce: 0xe1f5, 0x1dcf: 0xe1f5, 0x1dd0: 0xe115, 0x1dd1: 0xe115, + 0x1dd2: 0xe135, 0x1dd3: 0xe135, 0x1dd4: 0xe115, 0x1dd5: 0xe115, 0x1dd6: 0xe175, 0x1dd7: 0xe175, + 0x1dd8: 0xe115, 0x1dd9: 0xe115, 0x1dda: 0xe135, 0x1ddb: 0xe135, 0x1ddc: 0xe115, 0x1ddd: 0xe115, + 0x1dde: 0x8ca5, 0x1ddf: 0x8ca5, 0x1de0: 0x04b5, 0x1de1: 0x04b5, 0x1de2: 0x0a08, 0x1de3: 0x0a08, + 0x1de4: 0x0a08, 0x1de5: 0x0a08, 0x1de6: 0x0a08, 0x1de7: 0x0a08, 0x1de8: 0x0a08, 0x1de9: 0x0a08, + 0x1dea: 0x0a08, 0x1deb: 0x0a08, 0x1dec: 0x0a08, 0x1ded: 0x0a08, 0x1dee: 0x0a08, 0x1def: 0x0a08, + 0x1df0: 0x0a08, 0x1df1: 0x0a08, 0x1df2: 0x0a08, 0x1df3: 0x0a08, 0x1df4: 0x0a08, 0x1df5: 0x0a08, + 0x1df6: 0x0a08, 0x1df7: 0x0a08, 0x1df8: 0x0a08, 0x1df9: 0x0a08, 0x1dfa: 0x0a08, 0x1dfb: 0x0a08, + 0x1dfc: 0x0a08, 0x1dfd: 0x0a08, 0x1dfe: 0x0a08, 0x1dff: 0x0a08, + // Block 0x78, offset 0x1e00 + 0x1e00: 0x20b1, 0x1e01: 0x20b9, 0x1e02: 0x20d9, 0x1e03: 0x20f1, 0x1e04: 0x0040, 0x1e05: 0x2189, + 0x1e06: 0x2109, 0x1e07: 0x20e1, 0x1e08: 0x2131, 0x1e09: 0x2191, 0x1e0a: 0x2161, 0x1e0b: 0x2169, + 0x1e0c: 0x2171, 0x1e0d: 0x2179, 0x1e0e: 0x2111, 0x1e0f: 0x2141, 0x1e10: 0x2151, 0x1e11: 0x2121, + 0x1e12: 0x2159, 0x1e13: 0x2101, 0x1e14: 0x2119, 0x1e15: 0x20c9, 0x1e16: 0x20d1, 0x1e17: 0x20e9, + 0x1e18: 0x20f9, 0x1e19: 0x2129, 0x1e1a: 0x2139, 0x1e1b: 0x2149, 0x1e1c: 0x2589, 0x1e1d: 0x1689, + 0x1e1e: 0x2591, 0x1e1f: 0x2599, 0x1e20: 0x0040, 0x1e21: 0x20b9, 0x1e22: 0x20d9, 0x1e23: 0x0040, + 0x1e24: 0x2181, 0x1e25: 0x0040, 0x1e26: 0x0040, 0x1e27: 0x20e1, 0x1e28: 0x0040, 0x1e29: 0x2191, + 0x1e2a: 0x2161, 0x1e2b: 0x2169, 0x1e2c: 0x2171, 0x1e2d: 0x2179, 0x1e2e: 0x2111, 0x1e2f: 0x2141, + 0x1e30: 0x2151, 0x1e31: 0x2121, 0x1e32: 0x2159, 0x1e33: 0x0040, 0x1e34: 0x2119, 0x1e35: 0x20c9, + 0x1e36: 0x20d1, 0x1e37: 0x20e9, 0x1e38: 0x0040, 0x1e39: 0x2129, 0x1e3a: 0x0040, 0x1e3b: 0x2149, + 0x1e3c: 0x0040, 0x1e3d: 0x0040, 0x1e3e: 0x0040, 0x1e3f: 0x0040, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x0040, 0x1e41: 0x0040, 0x1e42: 0x20d9, 0x1e43: 0x0040, 0x1e44: 0x0040, 0x1e45: 0x0040, + 0x1e46: 0x0040, 0x1e47: 0x20e1, 0x1e48: 0x0040, 0x1e49: 0x2191, 0x1e4a: 0x0040, 0x1e4b: 0x2169, + 0x1e4c: 0x0040, 0x1e4d: 0x2179, 0x1e4e: 0x2111, 0x1e4f: 0x2141, 0x1e50: 0x0040, 0x1e51: 0x2121, + 0x1e52: 0x2159, 0x1e53: 0x0040, 0x1e54: 0x2119, 0x1e55: 0x0040, 0x1e56: 0x0040, 0x1e57: 0x20e9, + 0x1e58: 0x0040, 0x1e59: 0x2129, 0x1e5a: 0x0040, 0x1e5b: 0x2149, 0x1e5c: 0x0040, 0x1e5d: 0x1689, + 0x1e5e: 0x0040, 0x1e5f: 0x2599, 0x1e60: 0x0040, 0x1e61: 0x20b9, 0x1e62: 0x20d9, 0x1e63: 0x0040, + 0x1e64: 0x2181, 0x1e65: 0x0040, 0x1e66: 0x0040, 0x1e67: 0x20e1, 0x1e68: 0x2131, 0x1e69: 0x2191, + 0x1e6a: 0x2161, 0x1e6b: 0x0040, 0x1e6c: 0x2171, 0x1e6d: 0x2179, 0x1e6e: 0x2111, 0x1e6f: 0x2141, + 0x1e70: 0x2151, 0x1e71: 0x2121, 0x1e72: 0x2159, 0x1e73: 0x0040, 0x1e74: 0x2119, 0x1e75: 0x20c9, + 0x1e76: 0x20d1, 0x1e77: 0x20e9, 0x1e78: 0x0040, 0x1e79: 0x2129, 0x1e7a: 0x2139, 0x1e7b: 0x2149, + 0x1e7c: 0x2589, 0x1e7d: 0x0040, 0x1e7e: 0x2591, 0x1e7f: 0x0040, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x20b1, 0x1e81: 0x20b9, 0x1e82: 0x20d9, 0x1e83: 0x20f1, 0x1e84: 0x2181, 0x1e85: 0x2189, + 0x1e86: 0x2109, 0x1e87: 0x20e1, 0x1e88: 0x2131, 0x1e89: 0x2191, 0x1e8a: 0x0040, 0x1e8b: 0x2169, + 0x1e8c: 0x2171, 0x1e8d: 0x2179, 0x1e8e: 0x2111, 0x1e8f: 0x2141, 0x1e90: 0x2151, 0x1e91: 0x2121, + 0x1e92: 0x2159, 0x1e93: 0x2101, 0x1e94: 0x2119, 0x1e95: 0x20c9, 0x1e96: 0x20d1, 0x1e97: 0x20e9, + 0x1e98: 0x20f9, 0x1e99: 0x2129, 0x1e9a: 0x2139, 0x1e9b: 0x2149, 0x1e9c: 0x0040, 0x1e9d: 0x0040, + 0x1e9e: 0x0040, 0x1e9f: 0x0040, 0x1ea0: 0x0040, 0x1ea1: 0x20b9, 0x1ea2: 0x20d9, 0x1ea3: 0x20f1, + 0x1ea4: 0x0040, 0x1ea5: 0x2189, 0x1ea6: 0x2109, 0x1ea7: 0x20e1, 0x1ea8: 0x2131, 0x1ea9: 0x2191, + 0x1eaa: 0x0040, 0x1eab: 0x2169, 0x1eac: 0x2171, 0x1ead: 0x2179, 0x1eae: 0x2111, 0x1eaf: 0x2141, + 0x1eb0: 0x2151, 0x1eb1: 0x2121, 0x1eb2: 0x2159, 0x1eb3: 0x2101, 0x1eb4: 0x2119, 0x1eb5: 0x20c9, + 0x1eb6: 0x20d1, 0x1eb7: 0x20e9, 0x1eb8: 0x20f9, 0x1eb9: 0x2129, 0x1eba: 0x2139, 0x1ebb: 0x2149, + 0x1ebc: 0x0040, 0x1ebd: 0x0040, 0x1ebe: 0x0040, 0x1ebf: 0x0040, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x0040, 0x1ec1: 0x25a2, 0x1ec2: 0x25aa, 0x1ec3: 0x25b2, 0x1ec4: 0x25ba, 0x1ec5: 0x25c2, + 0x1ec6: 0x25ca, 0x1ec7: 0x25d2, 0x1ec8: 0x25da, 0x1ec9: 0x25e2, 0x1eca: 0x25ea, 0x1ecb: 0x0018, + 0x1ecc: 0x0018, 0x1ecd: 0x0018, 0x1ece: 0x0018, 0x1ecf: 0x0018, 0x1ed0: 0x25f2, 0x1ed1: 0x25fa, + 0x1ed2: 0x2602, 0x1ed3: 0x260a, 0x1ed4: 0x2612, 0x1ed5: 0x261a, 0x1ed6: 0x2622, 0x1ed7: 0x262a, + 0x1ed8: 0x2632, 0x1ed9: 0x263a, 0x1eda: 0x2642, 0x1edb: 0x264a, 0x1edc: 0x2652, 0x1edd: 0x265a, + 0x1ede: 0x2662, 0x1edf: 0x266a, 0x1ee0: 0x2672, 0x1ee1: 0x267a, 0x1ee2: 0x2682, 0x1ee3: 0x268a, + 0x1ee4: 0x2692, 0x1ee5: 0x269a, 0x1ee6: 0x26a2, 0x1ee7: 0x26aa, 0x1ee8: 0x26b2, 0x1ee9: 0x26ba, + 0x1eea: 0x26c1, 0x1eeb: 0x03d9, 0x1eec: 0x00b9, 0x1eed: 0x1239, 0x1eee: 0x26c9, 0x1eef: 0x0018, + 0x1ef0: 0x0019, 0x1ef1: 0x02e9, 0x1ef2: 0x03d9, 0x1ef3: 0x02f1, 0x1ef4: 0x02f9, 0x1ef5: 0x03f1, + 0x1ef6: 0x0309, 0x1ef7: 0x00a9, 0x1ef8: 0x0311, 0x1ef9: 0x00b1, 0x1efa: 0x0319, 0x1efb: 0x0101, + 0x1efc: 0x0321, 0x1efd: 0x0329, 0x1efe: 0x0051, 0x1eff: 0x0339, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0x0751, 0x1f01: 0x00b9, 0x1f02: 0x0089, 0x1f03: 0x0341, 0x1f04: 0x0349, 0x1f05: 0x0391, + 0x1f06: 0x00c1, 0x1f07: 0x0109, 0x1f08: 0x00c9, 0x1f09: 0x04b1, 0x1f0a: 0x26d1, 0x1f0b: 0x11f9, + 0x1f0c: 0x26d9, 0x1f0d: 0x04d9, 0x1f0e: 0x26e1, 0x1f0f: 0x26e9, 0x1f10: 0x0018, 0x1f11: 0x0018, + 0x1f12: 0x0018, 0x1f13: 0x0018, 0x1f14: 0x0018, 0x1f15: 0x0018, 0x1f16: 0x0018, 0x1f17: 0x0018, + 0x1f18: 0x0018, 0x1f19: 0x0018, 0x1f1a: 0x0018, 0x1f1b: 0x0018, 0x1f1c: 0x0018, 0x1f1d: 0x0018, + 0x1f1e: 0x0018, 0x1f1f: 0x0018, 0x1f20: 0x0018, 0x1f21: 0x0018, 0x1f22: 0x0018, 0x1f23: 0x0018, + 0x1f24: 0x0018, 0x1f25: 0x0018, 0x1f26: 0x0018, 0x1f27: 0x0018, 0x1f28: 0x0018, 0x1f29: 0x0018, + 0x1f2a: 0x26f1, 0x1f2b: 0x26f9, 0x1f2c: 0x2701, 0x1f2d: 0x0018, 0x1f2e: 0x0018, 0x1f2f: 0x0018, + 0x1f30: 0x0018, 0x1f31: 0x0018, 0x1f32: 0x0018, 0x1f33: 0x0018, 0x1f34: 0x0018, 0x1f35: 0x0018, + 0x1f36: 0x0018, 0x1f37: 0x0018, 0x1f38: 0x0018, 0x1f39: 0x0018, 0x1f3a: 0x0018, 0x1f3b: 0x0018, + 0x1f3c: 0x0018, 0x1f3d: 0x0018, 0x1f3e: 0x0018, 0x1f3f: 0x0018, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0x2711, 0x1f41: 0x2719, 0x1f42: 0x2721, 0x1f43: 0x0040, 0x1f44: 0x0040, 0x1f45: 0x0040, + 0x1f46: 0x0040, 0x1f47: 0x0040, 0x1f48: 0x0040, 0x1f49: 0x0040, 0x1f4a: 0x0040, 0x1f4b: 0x0040, + 0x1f4c: 0x0040, 0x1f4d: 0x0040, 0x1f4e: 0x0040, 0x1f4f: 0x0040, 0x1f50: 0x2729, 0x1f51: 0x2731, + 0x1f52: 0x2739, 0x1f53: 0x2741, 0x1f54: 0x2749, 0x1f55: 0x2751, 0x1f56: 0x2759, 0x1f57: 0x2761, + 0x1f58: 0x2769, 0x1f59: 0x2771, 0x1f5a: 0x2779, 0x1f5b: 0x2781, 0x1f5c: 0x2789, 0x1f5d: 0x2791, + 0x1f5e: 0x2799, 0x1f5f: 0x27a1, 0x1f60: 0x27a9, 0x1f61: 0x27b1, 0x1f62: 0x27b9, 0x1f63: 0x27c1, + 0x1f64: 0x27c9, 0x1f65: 0x27d1, 0x1f66: 0x27d9, 0x1f67: 0x27e1, 0x1f68: 0x27e9, 0x1f69: 0x27f1, + 0x1f6a: 0x27f9, 0x1f6b: 0x2801, 0x1f6c: 0x2809, 0x1f6d: 0x2811, 0x1f6e: 0x2819, 0x1f6f: 0x2821, + 0x1f70: 0x2829, 0x1f71: 0x2831, 0x1f72: 0x2839, 0x1f73: 0x2841, 0x1f74: 0x2849, 0x1f75: 0x2851, + 0x1f76: 0x2859, 0x1f77: 0x2861, 0x1f78: 0x2869, 0x1f79: 0x2871, 0x1f7a: 0x2879, 0x1f7b: 0x2881, + 0x1f7c: 0x0040, 0x1f7d: 0x0040, 0x1f7e: 0x0040, 0x1f7f: 0x0040, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x28e1, 0x1f81: 0x28e9, 0x1f82: 0x28f1, 0x1f83: 0x8cbd, 0x1f84: 0x28f9, 0x1f85: 0x2901, + 0x1f86: 0x2909, 0x1f87: 0x2911, 0x1f88: 0x2919, 0x1f89: 0x2921, 0x1f8a: 0x2929, 0x1f8b: 0x2931, + 0x1f8c: 0x2939, 0x1f8d: 0x8cdd, 0x1f8e: 0x2941, 0x1f8f: 0x2949, 0x1f90: 0x2951, 0x1f91: 0x2959, + 0x1f92: 0x8cfd, 0x1f93: 0x2961, 0x1f94: 0x2969, 0x1f95: 0x2799, 0x1f96: 0x8d1d, 0x1f97: 0x2971, + 0x1f98: 0x2979, 0x1f99: 0x2981, 0x1f9a: 0x2989, 0x1f9b: 0x2991, 0x1f9c: 0x8d3d, 0x1f9d: 0x2999, + 0x1f9e: 0x29a1, 0x1f9f: 0x29a9, 0x1fa0: 0x29b1, 0x1fa1: 0x29b9, 0x1fa2: 0x2871, 0x1fa3: 0x29c1, + 0x1fa4: 0x29c9, 0x1fa5: 0x29d1, 0x1fa6: 0x29d9, 0x1fa7: 0x29e1, 0x1fa8: 0x29e9, 0x1fa9: 0x29f1, + 0x1faa: 0x29f9, 0x1fab: 0x2a01, 0x1fac: 0x2a09, 0x1fad: 0x2a11, 0x1fae: 0x2a19, 0x1faf: 0x2a21, + 0x1fb0: 0x2a29, 0x1fb1: 0x2a31, 0x1fb2: 0x2a31, 0x1fb3: 0x2a31, 0x1fb4: 0x8d5d, 0x1fb5: 0x2a39, + 0x1fb6: 0x2a41, 0x1fb7: 0x2a49, 0x1fb8: 0x8d7d, 0x1fb9: 0x2a51, 0x1fba: 0x2a59, 0x1fbb: 0x2a61, + 0x1fbc: 0x2a69, 0x1fbd: 0x2a71, 0x1fbe: 0x2a79, 0x1fbf: 0x2a81, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x2a89, 0x1fc1: 0x2a91, 0x1fc2: 0x2a99, 0x1fc3: 0x2aa1, 0x1fc4: 0x2aa9, 0x1fc5: 0x2ab1, + 0x1fc6: 0x2ab1, 0x1fc7: 0x2ab9, 0x1fc8: 0x2ac1, 0x1fc9: 0x2ac9, 0x1fca: 0x2ad1, 0x1fcb: 0x2ad9, + 0x1fcc: 0x2ae1, 0x1fcd: 0x2ae9, 0x1fce: 0x2af1, 0x1fcf: 0x2af9, 0x1fd0: 0x2b01, 0x1fd1: 0x2b09, + 0x1fd2: 0x2b11, 0x1fd3: 0x2b19, 0x1fd4: 0x2b21, 0x1fd5: 0x2b29, 0x1fd6: 0x2b31, 0x1fd7: 0x2b39, + 0x1fd8: 0x2b41, 0x1fd9: 0x8d9d, 0x1fda: 0x2b49, 0x1fdb: 0x2b51, 0x1fdc: 0x2b59, 0x1fdd: 0x2751, + 0x1fde: 0x2b61, 0x1fdf: 0x2b69, 0x1fe0: 0x8dbd, 0x1fe1: 0x8ddd, 0x1fe2: 0x2b71, 0x1fe3: 0x2b79, + 0x1fe4: 0x2b81, 0x1fe5: 0x2b89, 0x1fe6: 0x2b91, 0x1fe7: 0x2b99, 0x1fe8: 0x2040, 0x1fe9: 0x2ba1, + 0x1fea: 0x2ba9, 0x1feb: 0x2ba9, 0x1fec: 0x8dfd, 0x1fed: 0x2bb1, 0x1fee: 0x2bb9, 0x1fef: 0x2bc1, + 0x1ff0: 0x2bc9, 0x1ff1: 0x8e1d, 0x1ff2: 0x2bd1, 0x1ff3: 0x2bd9, 0x1ff4: 0x2040, 0x1ff5: 0x2be1, + 0x1ff6: 0x2be9, 0x1ff7: 0x2bf1, 0x1ff8: 0x2bf9, 0x1ff9: 0x2c01, 0x1ffa: 0x2c09, 0x1ffb: 0x8e3d, + 0x1ffc: 0x2c11, 0x1ffd: 0x8e5d, 0x1ffe: 0x2c19, 0x1fff: 0x2c21, + // Block 0x80, offset 0x2000 + 0x2000: 0x2c29, 0x2001: 0x2c31, 0x2002: 0x2c39, 0x2003: 0x2c41, 0x2004: 0x2c49, 0x2005: 0x2c51, + 0x2006: 0x2c59, 0x2007: 0x2c61, 0x2008: 0x2c69, 0x2009: 0x8e7d, 0x200a: 0x2c71, 0x200b: 0x2c79, + 0x200c: 0x2c81, 0x200d: 0x2c89, 0x200e: 0x2c91, 0x200f: 0x8e9d, 0x2010: 0x2c99, 0x2011: 0x8ebd, + 0x2012: 0x8edd, 0x2013: 0x2ca1, 0x2014: 0x2ca9, 0x2015: 0x2ca9, 0x2016: 0x2cb1, 0x2017: 0x8efd, + 0x2018: 0x8f1d, 0x2019: 0x2cb9, 0x201a: 0x2cc1, 0x201b: 0x2cc9, 0x201c: 0x2cd1, 0x201d: 0x2cd9, + 0x201e: 0x2ce1, 0x201f: 0x2ce9, 0x2020: 0x2cf1, 0x2021: 0x2cf9, 0x2022: 0x2d01, 0x2023: 0x2d09, + 0x2024: 0x8f3d, 0x2025: 0x2d11, 0x2026: 0x2d19, 0x2027: 0x2d21, 0x2028: 0x2d29, 0x2029: 0x2d21, + 0x202a: 0x2d31, 0x202b: 0x2d39, 0x202c: 0x2d41, 0x202d: 0x2d49, 0x202e: 0x2d51, 0x202f: 0x2d59, + 0x2030: 0x2d61, 0x2031: 0x2d69, 0x2032: 0x2d71, 0x2033: 0x2d79, 0x2034: 0x2d81, 0x2035: 0x2d89, + 0x2036: 0x2d91, 0x2037: 0x2d99, 0x2038: 0x8f5d, 0x2039: 0x2da1, 0x203a: 0x2da9, 0x203b: 0x2db1, + 0x203c: 0x2db9, 0x203d: 0x2dc1, 0x203e: 0x8f7d, 0x203f: 0x2dc9, + // Block 0x81, offset 0x2040 + 0x2040: 0x2dd1, 0x2041: 0x2dd9, 0x2042: 0x2de1, 0x2043: 0x2de9, 0x2044: 0x2df1, 0x2045: 0x2df9, + 0x2046: 0x2e01, 0x2047: 0x2e09, 0x2048: 0x2e11, 0x2049: 0x2e19, 0x204a: 0x8f9d, 0x204b: 0x2e21, + 0x204c: 0x2e29, 0x204d: 0x2e31, 0x204e: 0x2e39, 0x204f: 0x2e41, 0x2050: 0x2e49, 0x2051: 0x2e51, + 0x2052: 0x2e59, 0x2053: 0x2e61, 0x2054: 0x2e69, 0x2055: 0x2e71, 0x2056: 0x2e79, 0x2057: 0x2e81, + 0x2058: 0x2e89, 0x2059: 0x2e91, 0x205a: 0x2e99, 0x205b: 0x2ea1, 0x205c: 0x2ea9, 0x205d: 0x8fbd, + 0x205e: 0x2eb1, 0x205f: 0x2eb9, 0x2060: 0x2ec1, 0x2061: 0x2ec9, 0x2062: 0x2ed1, 0x2063: 0x8fdd, + 0x2064: 0x2ed9, 0x2065: 0x2ee1, 0x2066: 0x2ee9, 0x2067: 0x2ef1, 0x2068: 0x2ef9, 0x2069: 0x2f01, + 0x206a: 0x2f09, 0x206b: 0x2f11, 0x206c: 0x7f0d, 0x206d: 0x2f19, 0x206e: 0x2f21, 0x206f: 0x2f29, + 0x2070: 0x8ffd, 0x2071: 0x2f31, 0x2072: 0x2f39, 0x2073: 0x2f41, 0x2074: 0x2f49, 0x2075: 0x2f51, + 0x2076: 0x2f59, 0x2077: 0x901d, 0x2078: 0x903d, 0x2079: 0x905d, 0x207a: 0x2f61, 0x207b: 0x907d, + 0x207c: 0x2f69, 0x207d: 0x2f71, 0x207e: 0x2f79, 0x207f: 0x2f81, + // Block 0x82, offset 0x2080 + 0x2080: 0x2f89, 0x2081: 0x2f91, 0x2082: 0x2f99, 0x2083: 0x2fa1, 0x2084: 0x2fa9, 0x2085: 0x2fb1, + 0x2086: 0x909d, 0x2087: 0x2fb9, 0x2088: 0x2fc1, 0x2089: 0x2fc9, 0x208a: 0x2fd1, 0x208b: 0x2fd9, + 0x208c: 0x2fe1, 0x208d: 0x90bd, 0x208e: 0x2fe9, 0x208f: 0x2ff1, 0x2090: 0x90dd, 0x2091: 0x90fd, + 0x2092: 0x2ff9, 0x2093: 0x3001, 0x2094: 0x3009, 0x2095: 0x3011, 0x2096: 0x3019, 0x2097: 0x3021, + 0x2098: 0x3029, 0x2099: 0x3031, 0x209a: 0x3039, 0x209b: 0x911d, 0x209c: 0x3041, 0x209d: 0x913d, + 0x209e: 0x3049, 0x209f: 0x2040, 0x20a0: 0x3051, 0x20a1: 0x3059, 0x20a2: 0x3061, 0x20a3: 0x915d, + 0x20a4: 0x3069, 0x20a5: 0x3071, 0x20a6: 0x917d, 0x20a7: 0x919d, 0x20a8: 0x3079, 0x20a9: 0x3081, + 0x20aa: 0x3089, 0x20ab: 0x3091, 0x20ac: 0x3099, 0x20ad: 0x3099, 0x20ae: 0x30a1, 0x20af: 0x30a9, + 0x20b0: 0x30b1, 0x20b1: 0x30b9, 0x20b2: 0x30c1, 0x20b3: 0x30c9, 0x20b4: 0x30d1, 0x20b5: 0x91bd, + 0x20b6: 0x30d9, 0x20b7: 0x91dd, 0x20b8: 0x30e1, 0x20b9: 0x91fd, 0x20ba: 0x30e9, 0x20bb: 0x921d, + 0x20bc: 0x923d, 0x20bd: 0x925d, 0x20be: 0x30f1, 0x20bf: 0x30f9, + // Block 0x83, offset 0x20c0 + 0x20c0: 0x3101, 0x20c1: 0x927d, 0x20c2: 0x929d, 0x20c3: 0x92bd, 0x20c4: 0x92dd, 0x20c5: 0x3109, + 0x20c6: 0x3111, 0x20c7: 0x3111, 0x20c8: 0x3119, 0x20c9: 0x3121, 0x20ca: 0x3129, 0x20cb: 0x3131, + 0x20cc: 0x3139, 0x20cd: 0x92fd, 0x20ce: 0x3141, 0x20cf: 0x3149, 0x20d0: 0x3151, 0x20d1: 0x3159, + 0x20d2: 0x931d, 0x20d3: 0x3161, 0x20d4: 0x933d, 0x20d5: 0x935d, 0x20d6: 0x3169, 0x20d7: 0x3171, + 0x20d8: 0x3179, 0x20d9: 0x3181, 0x20da: 0x3189, 0x20db: 0x3191, 0x20dc: 0x937d, 0x20dd: 0x939d, + 0x20de: 0x93bd, 0x20df: 0x2040, 0x20e0: 0x3199, 0x20e1: 0x93dd, 0x20e2: 0x31a1, 0x20e3: 0x31a9, + 0x20e4: 0x31b1, 0x20e5: 0x93fd, 0x20e6: 0x31b9, 0x20e7: 0x31c1, 0x20e8: 0x31c9, 0x20e9: 0x31d1, + 0x20ea: 0x31d9, 0x20eb: 0x941d, 0x20ec: 0x31e1, 0x20ed: 0x31e9, 0x20ee: 0x31f1, 0x20ef: 0x31f9, + 0x20f0: 0x3201, 0x20f1: 0x3209, 0x20f2: 0x943d, 0x20f3: 0x945d, 0x20f4: 0x3211, 0x20f5: 0x947d, + 0x20f6: 0x3219, 0x20f7: 0x949d, 0x20f8: 0x3221, 0x20f9: 0x3229, 0x20fa: 0x3231, 0x20fb: 0x94bd, + 0x20fc: 0x94dd, 0x20fd: 0x3239, 0x20fe: 0x94fd, 0x20ff: 0x3241, + // Block 0x84, offset 0x2100 + 0x2100: 0x951d, 0x2101: 0x3249, 0x2102: 0x3251, 0x2103: 0x3259, 0x2104: 0x3261, 0x2105: 0x3269, + 0x2106: 0x3271, 0x2107: 0x953d, 0x2108: 0x955d, 0x2109: 0x957d, 0x210a: 0x959d, 0x210b: 0x2ca1, + 0x210c: 0x3279, 0x210d: 0x3281, 0x210e: 0x3289, 0x210f: 0x3291, 0x2110: 0x3299, 0x2111: 0x32a1, + 0x2112: 0x32a9, 0x2113: 0x32b1, 0x2114: 0x32b9, 0x2115: 0x32c1, 0x2116: 0x32c9, 0x2117: 0x95bd, + 0x2118: 0x32d1, 0x2119: 0x32d9, 0x211a: 0x32e1, 0x211b: 0x32e9, 0x211c: 0x32f1, 0x211d: 0x32f9, + 0x211e: 0x3301, 0x211f: 0x3309, 0x2120: 0x3311, 0x2121: 0x3319, 0x2122: 0x3321, 0x2123: 0x3329, + 0x2124: 0x95dd, 0x2125: 0x95fd, 0x2126: 0x961d, 0x2127: 0x3331, 0x2128: 0x3339, 0x2129: 0x3341, + 0x212a: 0x3349, 0x212b: 0x963d, 0x212c: 0x3351, 0x212d: 0x965d, 0x212e: 0x3359, 0x212f: 0x3361, + 0x2130: 0x967d, 0x2131: 0x969d, 0x2132: 0x3369, 0x2133: 0x3371, 0x2134: 0x3379, 0x2135: 0x3381, + 0x2136: 0x3389, 0x2137: 0x3391, 0x2138: 0x3399, 0x2139: 0x33a1, 0x213a: 0x33a9, 0x213b: 0x33b1, + 0x213c: 0x33b9, 0x213d: 0x33c1, 0x213e: 0x33c9, 0x213f: 0x2040, + // Block 0x85, offset 0x2140 + 0x2140: 0x33d1, 0x2141: 0x33d9, 0x2142: 0x33e1, 0x2143: 0x33e9, 0x2144: 0x33f1, 0x2145: 0x96bd, + 0x2146: 0x33f9, 0x2147: 0x3401, 0x2148: 0x3409, 0x2149: 0x3411, 0x214a: 0x3419, 0x214b: 0x96dd, + 0x214c: 0x96fd, 0x214d: 0x3421, 0x214e: 0x3429, 0x214f: 0x3431, 0x2150: 0x3439, 0x2151: 0x3441, + 0x2152: 0x3449, 0x2153: 0x971d, 0x2154: 0x3451, 0x2155: 0x3459, 0x2156: 0x3461, 0x2157: 0x3469, + 0x2158: 0x973d, 0x2159: 0x975d, 0x215a: 0x3471, 0x215b: 0x3479, 0x215c: 0x3481, 0x215d: 0x977d, + 0x215e: 0x3489, 0x215f: 0x3491, 0x2160: 0x684d, 0x2161: 0x979d, 0x2162: 0x3499, 0x2163: 0x34a1, + 0x2164: 0x34a9, 0x2165: 0x97bd, 0x2166: 0x34b1, 0x2167: 0x34b9, 0x2168: 0x34c1, 0x2169: 0x34c9, + 0x216a: 0x34d1, 0x216b: 0x34d9, 0x216c: 0x34e1, 0x216d: 0x97dd, 0x216e: 0x34e9, 0x216f: 0x34f1, + 0x2170: 0x34f9, 0x2171: 0x97fd, 0x2172: 0x3501, 0x2173: 0x3509, 0x2174: 0x3511, 0x2175: 0x3519, + 0x2176: 0x7b6d, 0x2177: 0x981d, 0x2178: 0x3521, 0x2179: 0x3529, 0x217a: 0x3531, 0x217b: 0x983d, + 0x217c: 0x3539, 0x217d: 0x985d, 0x217e: 0x3541, 0x217f: 0x3541, + // Block 0x86, offset 0x2180 + 0x2180: 0x3549, 0x2181: 0x987d, 0x2182: 0x3551, 0x2183: 0x3559, 0x2184: 0x3561, 0x2185: 0x3569, + 0x2186: 0x3571, 0x2187: 0x3579, 0x2188: 0x3581, 0x2189: 0x989d, 0x218a: 0x3589, 0x218b: 0x3591, + 0x218c: 0x3599, 0x218d: 0x35a1, 0x218e: 0x35a9, 0x218f: 0x35b1, 0x2190: 0x98bd, 0x2191: 0x35b9, + 0x2192: 0x98dd, 0x2193: 0x98fd, 0x2194: 0x991d, 0x2195: 0x35c1, 0x2196: 0x35c9, 0x2197: 0x35d1, + 0x2198: 0x35d9, 0x2199: 0x35e1, 0x219a: 0x35e9, 0x219b: 0x35f1, 0x219c: 0x35f9, 0x219d: 0x993d, + 0x219e: 0x0040, 0x219f: 0x0040, 0x21a0: 0x0040, 0x21a1: 0x0040, 0x21a2: 0x0040, 0x21a3: 0x0040, + 0x21a4: 0x0040, 0x21a5: 0x0040, 0x21a6: 0x0040, 0x21a7: 0x0040, 0x21a8: 0x0040, 0x21a9: 0x0040, + 0x21aa: 0x0040, 0x21ab: 0x0040, 0x21ac: 0x0040, 0x21ad: 0x0040, 0x21ae: 0x0040, 0x21af: 0x0040, + 0x21b0: 0x0040, 0x21b1: 0x0040, 0x21b2: 0x0040, 0x21b3: 0x0040, 0x21b4: 0x0040, 0x21b5: 0x0040, + 0x21b6: 0x0040, 0x21b7: 0x0040, 0x21b8: 0x0040, 0x21b9: 0x0040, 0x21ba: 0x0040, 0x21bb: 0x0040, + 0x21bc: 0x0040, 0x21bd: 0x0040, 0x21be: 0x0040, 0x21bf: 0x0040, +} + +// idnaIndex: 39 blocks, 2496 entries, 4992 bytes +// Block 0 is the zero block. +var idnaIndex = [2496]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x85, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x86, 0xca: 0x87, 0xcb: 0x07, 0xcc: 0x88, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x89, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x8a, 0xd6: 0x8b, 0xd7: 0x8c, + 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x8d, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x8e, 0xde: 0x8f, 0xdf: 0x90, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x07, 0xea: 0x08, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x09, 0xee: 0x0a, 0xef: 0x0b, + 0xf0: 0x20, 0xf1: 0x21, 0xf2: 0x21, 0xf3: 0x23, 0xf4: 0x24, + // Block 0x4, offset 0x100 + 0x120: 0x91, 0x121: 0x13, 0x122: 0x14, 0x123: 0x92, 0x124: 0x93, 0x125: 0x15, 0x126: 0x16, 0x127: 0x17, + 0x128: 0x18, 0x129: 0x19, 0x12a: 0x1a, 0x12b: 0x1b, 0x12c: 0x1c, 0x12d: 0x1d, 0x12e: 0x1e, 0x12f: 0x94, + 0x130: 0x95, 0x131: 0x1f, 0x132: 0x20, 0x133: 0x21, 0x134: 0x96, 0x135: 0x22, 0x136: 0x97, 0x137: 0x98, + 0x138: 0x99, 0x139: 0x9a, 0x13a: 0x23, 0x13b: 0x9b, 0x13c: 0x9c, 0x13d: 0x24, 0x13e: 0x25, 0x13f: 0x9d, + // Block 0x5, offset 0x140 + 0x140: 0x9e, 0x141: 0x9f, 0x142: 0xa0, 0x143: 0xa1, 0x144: 0xa2, 0x145: 0xa3, 0x146: 0xa4, 0x147: 0xa5, + 0x148: 0xa6, 0x149: 0xa7, 0x14a: 0xa8, 0x14b: 0xa9, 0x14c: 0xaa, 0x14d: 0xab, 0x14e: 0xac, 0x14f: 0xad, + 0x150: 0xae, 0x151: 0xa6, 0x152: 0xa6, 0x153: 0xa6, 0x154: 0xa6, 0x155: 0xa6, 0x156: 0xa6, 0x157: 0xa6, + 0x158: 0xa6, 0x159: 0xaf, 0x15a: 0xb0, 0x15b: 0xb1, 0x15c: 0xb2, 0x15d: 0xb3, 0x15e: 0xb4, 0x15f: 0xb5, + 0x160: 0xb6, 0x161: 0xb7, 0x162: 0xb8, 0x163: 0xb9, 0x164: 0xba, 0x165: 0xbb, 0x166: 0xbc, 0x167: 0xbd, + 0x168: 0xbe, 0x169: 0xbf, 0x16a: 0xc0, 0x16b: 0xc1, 0x16c: 0xc2, 0x16d: 0xc3, 0x16e: 0xc4, 0x16f: 0xc5, + 0x170: 0xc6, 0x171: 0xc7, 0x172: 0xc8, 0x173: 0xc9, 0x174: 0x26, 0x175: 0x27, 0x176: 0x28, 0x177: 0x88, + 0x178: 0x29, 0x179: 0x29, 0x17a: 0x2a, 0x17b: 0x29, 0x17c: 0xca, 0x17d: 0x2b, 0x17e: 0x2c, 0x17f: 0x2d, + // Block 0x6, offset 0x180 + 0x180: 0x2e, 0x181: 0x2f, 0x182: 0x30, 0x183: 0xcb, 0x184: 0x31, 0x185: 0x32, 0x186: 0xcc, 0x187: 0xa2, + 0x188: 0xcd, 0x189: 0xce, 0x18a: 0xa2, 0x18b: 0xa2, 0x18c: 0xcf, 0x18d: 0xa2, 0x18e: 0xa2, 0x18f: 0xa2, + 0x190: 0xd0, 0x191: 0x33, 0x192: 0x34, 0x193: 0x35, 0x194: 0xa2, 0x195: 0xa2, 0x196: 0xa2, 0x197: 0xa2, + 0x198: 0xa2, 0x199: 0xa2, 0x19a: 0xa2, 0x19b: 0xa2, 0x19c: 0xa2, 0x19d: 0xa2, 0x19e: 0xa2, 0x19f: 0xa2, + 0x1a0: 0xa2, 0x1a1: 0xa2, 0x1a2: 0xa2, 0x1a3: 0xa2, 0x1a4: 0xa2, 0x1a5: 0xa2, 0x1a6: 0xa2, 0x1a7: 0xa2, + 0x1a8: 0xd1, 0x1a9: 0xd2, 0x1aa: 0xa2, 0x1ab: 0xd3, 0x1ac: 0xa2, 0x1ad: 0xd4, 0x1ae: 0xd5, 0x1af: 0xa2, + 0x1b0: 0xd6, 0x1b1: 0x36, 0x1b2: 0x29, 0x1b3: 0x37, 0x1b4: 0xd7, 0x1b5: 0xd8, 0x1b6: 0xd9, 0x1b7: 0xda, + 0x1b8: 0xdb, 0x1b9: 0xdc, 0x1ba: 0xdd, 0x1bb: 0xde, 0x1bc: 0xdf, 0x1bd: 0xe0, 0x1be: 0xe1, 0x1bf: 0x38, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x39, 0x1c1: 0xe2, 0x1c2: 0xe3, 0x1c3: 0xe4, 0x1c4: 0xe5, 0x1c5: 0x3a, 0x1c6: 0x3b, 0x1c7: 0xe6, + 0x1c8: 0xe7, 0x1c9: 0x3c, 0x1ca: 0x3d, 0x1cb: 0x3e, 0x1cc: 0xe8, 0x1cd: 0xe9, 0x1ce: 0x3f, 0x1cf: 0x40, + 0x1d0: 0xa6, 0x1d1: 0xa6, 0x1d2: 0xa6, 0x1d3: 0xa6, 0x1d4: 0xa6, 0x1d5: 0xa6, 0x1d6: 0xa6, 0x1d7: 0xa6, + 0x1d8: 0xa6, 0x1d9: 0xa6, 0x1da: 0xa6, 0x1db: 0xa6, 0x1dc: 0xa6, 0x1dd: 0xa6, 0x1de: 0xa6, 0x1df: 0xa6, + 0x1e0: 0xa6, 0x1e1: 0xa6, 0x1e2: 0xa6, 0x1e3: 0xa6, 0x1e4: 0xa6, 0x1e5: 0xa6, 0x1e6: 0xa6, 0x1e7: 0xa6, + 0x1e8: 0xa6, 0x1e9: 0xa6, 0x1ea: 0xa6, 0x1eb: 0xa6, 0x1ec: 0xa6, 0x1ed: 0xa6, 0x1ee: 0xa6, 0x1ef: 0xa6, + 0x1f0: 0xa6, 0x1f1: 0xa6, 0x1f2: 0xa6, 0x1f3: 0xa6, 0x1f4: 0xa6, 0x1f5: 0xa6, 0x1f6: 0xa6, 0x1f7: 0xa6, + 0x1f8: 0xa6, 0x1f9: 0xa6, 0x1fa: 0xa6, 0x1fb: 0xa6, 0x1fc: 0xa6, 0x1fd: 0xa6, 0x1fe: 0xa6, 0x1ff: 0xa6, + // Block 0x8, offset 0x200 + 0x200: 0xa6, 0x201: 0xa6, 0x202: 0xa6, 0x203: 0xa6, 0x204: 0xa6, 0x205: 0xa6, 0x206: 0xa6, 0x207: 0xa6, + 0x208: 0xa6, 0x209: 0xa6, 0x20a: 0xa6, 0x20b: 0xa6, 0x20c: 0xa6, 0x20d: 0xa6, 0x20e: 0xa6, 0x20f: 0xa6, + 0x210: 0xa6, 0x211: 0xa6, 0x212: 0xa6, 0x213: 0xa6, 0x214: 0xa6, 0x215: 0xa6, 0x216: 0xa6, 0x217: 0xa6, + 0x218: 0xa6, 0x219: 0xa6, 0x21a: 0xa6, 0x21b: 0xa6, 0x21c: 0xa6, 0x21d: 0xa6, 0x21e: 0xa6, 0x21f: 0xa6, + 0x220: 0xa6, 0x221: 0xa6, 0x222: 0xa6, 0x223: 0xa6, 0x224: 0xa6, 0x225: 0xa6, 0x226: 0xa6, 0x227: 0xa6, + 0x228: 0xa6, 0x229: 0xa6, 0x22a: 0xa6, 0x22b: 0xa6, 0x22c: 0xa6, 0x22d: 0xa6, 0x22e: 0xa6, 0x22f: 0xa6, + 0x230: 0xa6, 0x231: 0xa6, 0x232: 0xa6, 0x233: 0xa6, 0x234: 0xa6, 0x235: 0xa6, 0x236: 0xa6, 0x237: 0xa2, + 0x238: 0xa6, 0x239: 0xa6, 0x23a: 0xa6, 0x23b: 0xa6, 0x23c: 0xa6, 0x23d: 0xa6, 0x23e: 0xa6, 0x23f: 0xa6, + // Block 0x9, offset 0x240 + 0x240: 0xa6, 0x241: 0xa6, 0x242: 0xa6, 0x243: 0xa6, 0x244: 0xa6, 0x245: 0xa6, 0x246: 0xa6, 0x247: 0xa6, + 0x248: 0xa6, 0x249: 0xa6, 0x24a: 0xa6, 0x24b: 0xa6, 0x24c: 0xa6, 0x24d: 0xa6, 0x24e: 0xa6, 0x24f: 0xa6, + 0x250: 0xa6, 0x251: 0xa6, 0x252: 0xa6, 0x253: 0xa6, 0x254: 0xa6, 0x255: 0xa6, 0x256: 0xa6, 0x257: 0xa6, + 0x258: 0xa6, 0x259: 0xa6, 0x25a: 0xa6, 0x25b: 0xa6, 0x25c: 0xa6, 0x25d: 0xa6, 0x25e: 0xa6, 0x25f: 0xa6, + 0x260: 0xa6, 0x261: 0xa6, 0x262: 0xa6, 0x263: 0xa6, 0x264: 0xa6, 0x265: 0xa6, 0x266: 0xa6, 0x267: 0xa6, + 0x268: 0xa6, 0x269: 0xa6, 0x26a: 0xa6, 0x26b: 0xa6, 0x26c: 0xa6, 0x26d: 0xa6, 0x26e: 0xa6, 0x26f: 0xa6, + 0x270: 0xa6, 0x271: 0xa6, 0x272: 0xa6, 0x273: 0xa6, 0x274: 0xa6, 0x275: 0xa6, 0x276: 0xa6, 0x277: 0xa6, + 0x278: 0xa6, 0x279: 0xa6, 0x27a: 0xa6, 0x27b: 0xa6, 0x27c: 0xa6, 0x27d: 0xa6, 0x27e: 0xa6, 0x27f: 0xa6, + // Block 0xa, offset 0x280 + 0x280: 0xa6, 0x281: 0xa6, 0x282: 0xa6, 0x283: 0xa6, 0x284: 0xa6, 0x285: 0xa6, 0x286: 0xa6, 0x287: 0xa6, + 0x288: 0xa6, 0x289: 0xa6, 0x28a: 0xa6, 0x28b: 0xa6, 0x28c: 0xa6, 0x28d: 0xa6, 0x28e: 0xa6, 0x28f: 0xa6, + 0x290: 0xa6, 0x291: 0xa6, 0x292: 0xea, 0x293: 0xeb, 0x294: 0xa6, 0x295: 0xa6, 0x296: 0xa6, 0x297: 0xa6, + 0x298: 0xec, 0x299: 0x41, 0x29a: 0x42, 0x29b: 0xed, 0x29c: 0x43, 0x29d: 0x44, 0x29e: 0x45, 0x29f: 0x46, + 0x2a0: 0xee, 0x2a1: 0xef, 0x2a2: 0xf0, 0x2a3: 0xf1, 0x2a4: 0xf2, 0x2a5: 0xf3, 0x2a6: 0xf4, 0x2a7: 0xf5, + 0x2a8: 0xf6, 0x2a9: 0xf7, 0x2aa: 0xf8, 0x2ab: 0xf9, 0x2ac: 0xfa, 0x2ad: 0xfb, 0x2ae: 0xfc, 0x2af: 0xfd, + 0x2b0: 0xa6, 0x2b1: 0xa6, 0x2b2: 0xa6, 0x2b3: 0xa6, 0x2b4: 0xa6, 0x2b5: 0xa6, 0x2b6: 0xa6, 0x2b7: 0xa6, + 0x2b8: 0xa6, 0x2b9: 0xa6, 0x2ba: 0xa6, 0x2bb: 0xa6, 0x2bc: 0xa6, 0x2bd: 0xa6, 0x2be: 0xa6, 0x2bf: 0xa6, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xa6, 0x2c1: 0xa6, 0x2c2: 0xa6, 0x2c3: 0xa6, 0x2c4: 0xa6, 0x2c5: 0xa6, 0x2c6: 0xa6, 0x2c7: 0xa6, + 0x2c8: 0xa6, 0x2c9: 0xa6, 0x2ca: 0xa6, 0x2cb: 0xa6, 0x2cc: 0xa6, 0x2cd: 0xa6, 0x2ce: 0xa6, 0x2cf: 0xa6, + 0x2d0: 0xa6, 0x2d1: 0xa6, 0x2d2: 0xa6, 0x2d3: 0xa6, 0x2d4: 0xa6, 0x2d5: 0xa6, 0x2d6: 0xa6, 0x2d7: 0xa6, + 0x2d8: 0xa6, 0x2d9: 0xa6, 0x2da: 0xa6, 0x2db: 0xa6, 0x2dc: 0xa6, 0x2dd: 0xa6, 0x2de: 0xfe, 0x2df: 0xff, + // Block 0xc, offset 0x300 + 0x300: 0x100, 0x301: 0x100, 0x302: 0x100, 0x303: 0x100, 0x304: 0x100, 0x305: 0x100, 0x306: 0x100, 0x307: 0x100, + 0x308: 0x100, 0x309: 0x100, 0x30a: 0x100, 0x30b: 0x100, 0x30c: 0x100, 0x30d: 0x100, 0x30e: 0x100, 0x30f: 0x100, + 0x310: 0x100, 0x311: 0x100, 0x312: 0x100, 0x313: 0x100, 0x314: 0x100, 0x315: 0x100, 0x316: 0x100, 0x317: 0x100, + 0x318: 0x100, 0x319: 0x100, 0x31a: 0x100, 0x31b: 0x100, 0x31c: 0x100, 0x31d: 0x100, 0x31e: 0x100, 0x31f: 0x100, + 0x320: 0x100, 0x321: 0x100, 0x322: 0x100, 0x323: 0x100, 0x324: 0x100, 0x325: 0x100, 0x326: 0x100, 0x327: 0x100, + 0x328: 0x100, 0x329: 0x100, 0x32a: 0x100, 0x32b: 0x100, 0x32c: 0x100, 0x32d: 0x100, 0x32e: 0x100, 0x32f: 0x100, + 0x330: 0x100, 0x331: 0x100, 0x332: 0x100, 0x333: 0x100, 0x334: 0x100, 0x335: 0x100, 0x336: 0x100, 0x337: 0x100, + 0x338: 0x100, 0x339: 0x100, 0x33a: 0x100, 0x33b: 0x100, 0x33c: 0x100, 0x33d: 0x100, 0x33e: 0x100, 0x33f: 0x100, + // Block 0xd, offset 0x340 + 0x340: 0x100, 0x341: 0x100, 0x342: 0x100, 0x343: 0x100, 0x344: 0x100, 0x345: 0x100, 0x346: 0x100, 0x347: 0x100, + 0x348: 0x100, 0x349: 0x100, 0x34a: 0x100, 0x34b: 0x100, 0x34c: 0x100, 0x34d: 0x100, 0x34e: 0x100, 0x34f: 0x100, + 0x350: 0x100, 0x351: 0x100, 0x352: 0x100, 0x353: 0x100, 0x354: 0x100, 0x355: 0x100, 0x356: 0x100, 0x357: 0x100, + 0x358: 0x100, 0x359: 0x100, 0x35a: 0x100, 0x35b: 0x100, 0x35c: 0x100, 0x35d: 0x100, 0x35e: 0x100, 0x35f: 0x100, + 0x360: 0x100, 0x361: 0x100, 0x362: 0x100, 0x363: 0x100, 0x364: 0x101, 0x365: 0x102, 0x366: 0x103, 0x367: 0x104, + 0x368: 0x47, 0x369: 0x105, 0x36a: 0x106, 0x36b: 0x48, 0x36c: 0x49, 0x36d: 0x4a, 0x36e: 0x4b, 0x36f: 0x4c, + 0x370: 0x107, 0x371: 0x4d, 0x372: 0x4e, 0x373: 0x4f, 0x374: 0x50, 0x375: 0x51, 0x376: 0x108, 0x377: 0x52, + 0x378: 0x53, 0x379: 0x54, 0x37a: 0x55, 0x37b: 0x56, 0x37c: 0x57, 0x37d: 0x58, 0x37e: 0x59, 0x37f: 0x5a, + // Block 0xe, offset 0x380 + 0x380: 0x109, 0x381: 0x10a, 0x382: 0xa6, 0x383: 0x10b, 0x384: 0x10c, 0x385: 0xa2, 0x386: 0x10d, 0x387: 0x10e, + 0x388: 0x100, 0x389: 0x100, 0x38a: 0x10f, 0x38b: 0x110, 0x38c: 0x111, 0x38d: 0x112, 0x38e: 0x113, 0x38f: 0x114, + 0x390: 0x115, 0x391: 0xa6, 0x392: 0x116, 0x393: 0x117, 0x394: 0x118, 0x395: 0x5b, 0x396: 0x5c, 0x397: 0x100, + 0x398: 0xa6, 0x399: 0xa6, 0x39a: 0xa6, 0x39b: 0xa6, 0x39c: 0x119, 0x39d: 0x11a, 0x39e: 0x5d, 0x39f: 0x100, + 0x3a0: 0x11b, 0x3a1: 0x11c, 0x3a2: 0x11d, 0x3a3: 0x11e, 0x3a4: 0x11f, 0x3a5: 0x100, 0x3a6: 0x120, 0x3a7: 0x121, + 0x3a8: 0x122, 0x3a9: 0x123, 0x3aa: 0x124, 0x3ab: 0x5e, 0x3ac: 0x125, 0x3ad: 0x126, 0x3ae: 0x5f, 0x3af: 0x100, + 0x3b0: 0x127, 0x3b1: 0x128, 0x3b2: 0x129, 0x3b3: 0x12a, 0x3b4: 0x12b, 0x3b5: 0x100, 0x3b6: 0x100, 0x3b7: 0x100, + 0x3b8: 0x100, 0x3b9: 0x12c, 0x3ba: 0x12d, 0x3bb: 0x12e, 0x3bc: 0x12f, 0x3bd: 0x130, 0x3be: 0x131, 0x3bf: 0x132, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x133, 0x3c1: 0x134, 0x3c2: 0x135, 0x3c3: 0x136, 0x3c4: 0x137, 0x3c5: 0x138, 0x3c6: 0x139, 0x3c7: 0x13a, + 0x3c8: 0x13b, 0x3c9: 0x13c, 0x3ca: 0x13d, 0x3cb: 0x13e, 0x3cc: 0x60, 0x3cd: 0x61, 0x3ce: 0x100, 0x3cf: 0x100, + 0x3d0: 0x13f, 0x3d1: 0x140, 0x3d2: 0x141, 0x3d3: 0x142, 0x3d4: 0x100, 0x3d5: 0x100, 0x3d6: 0x143, 0x3d7: 0x144, + 0x3d8: 0x145, 0x3d9: 0x146, 0x3da: 0x147, 0x3db: 0x148, 0x3dc: 0x149, 0x3dd: 0x14a, 0x3de: 0x100, 0x3df: 0x100, + 0x3e0: 0x14b, 0x3e1: 0x100, 0x3e2: 0x14c, 0x3e3: 0x14d, 0x3e4: 0x62, 0x3e5: 0x14e, 0x3e6: 0x14f, 0x3e7: 0x150, + 0x3e8: 0x151, 0x3e9: 0x152, 0x3ea: 0x153, 0x3eb: 0x154, 0x3ec: 0x155, 0x3ed: 0x100, 0x3ee: 0x100, 0x3ef: 0x100, + 0x3f0: 0x156, 0x3f1: 0x157, 0x3f2: 0x158, 0x3f3: 0x100, 0x3f4: 0x159, 0x3f5: 0x15a, 0x3f6: 0x15b, 0x3f7: 0x100, + 0x3f8: 0x100, 0x3f9: 0x100, 0x3fa: 0x100, 0x3fb: 0x15c, 0x3fc: 0x15d, 0x3fd: 0x15e, 0x3fe: 0x15f, 0x3ff: 0x160, + // Block 0x10, offset 0x400 + 0x400: 0xa6, 0x401: 0xa6, 0x402: 0xa6, 0x403: 0xa6, 0x404: 0xa6, 0x405: 0xa6, 0x406: 0xa6, 0x407: 0xa6, + 0x408: 0xa6, 0x409: 0xa6, 0x40a: 0xa6, 0x40b: 0xa6, 0x40c: 0xa6, 0x40d: 0xa6, 0x40e: 0x161, 0x40f: 0x100, + 0x410: 0xa2, 0x411: 0x162, 0x412: 0xa6, 0x413: 0xa6, 0x414: 0xa6, 0x415: 0x163, 0x416: 0x100, 0x417: 0x100, + 0x418: 0x100, 0x419: 0x100, 0x41a: 0x100, 0x41b: 0x100, 0x41c: 0x100, 0x41d: 0x100, 0x41e: 0x100, 0x41f: 0x100, + 0x420: 0x100, 0x421: 0x100, 0x422: 0x100, 0x423: 0x100, 0x424: 0x100, 0x425: 0x100, 0x426: 0x100, 0x427: 0x100, + 0x428: 0x100, 0x429: 0x100, 0x42a: 0x100, 0x42b: 0x100, 0x42c: 0x100, 0x42d: 0x100, 0x42e: 0x100, 0x42f: 0x100, + 0x430: 0x100, 0x431: 0x100, 0x432: 0x100, 0x433: 0x100, 0x434: 0x100, 0x435: 0x100, 0x436: 0x100, 0x437: 0x100, + 0x438: 0x100, 0x439: 0x100, 0x43a: 0x100, 0x43b: 0x100, 0x43c: 0x100, 0x43d: 0x100, 0x43e: 0x164, 0x43f: 0x165, + // Block 0x11, offset 0x440 + 0x440: 0xa6, 0x441: 0xa6, 0x442: 0xa6, 0x443: 0xa6, 0x444: 0xa6, 0x445: 0xa6, 0x446: 0xa6, 0x447: 0xa6, + 0x448: 0xa6, 0x449: 0xa6, 0x44a: 0xa6, 0x44b: 0xa6, 0x44c: 0xa6, 0x44d: 0xa6, 0x44e: 0xa6, 0x44f: 0xa6, + 0x450: 0x166, 0x451: 0x167, 0x452: 0x100, 0x453: 0x100, 0x454: 0x100, 0x455: 0x100, 0x456: 0x100, 0x457: 0x100, + 0x458: 0x100, 0x459: 0x100, 0x45a: 0x100, 0x45b: 0x100, 0x45c: 0x100, 0x45d: 0x100, 0x45e: 0x100, 0x45f: 0x100, + 0x460: 0x100, 0x461: 0x100, 0x462: 0x100, 0x463: 0x100, 0x464: 0x100, 0x465: 0x100, 0x466: 0x100, 0x467: 0x100, + 0x468: 0x100, 0x469: 0x100, 0x46a: 0x100, 0x46b: 0x100, 0x46c: 0x100, 0x46d: 0x100, 0x46e: 0x100, 0x46f: 0x100, + 0x470: 0x100, 0x471: 0x100, 0x472: 0x100, 0x473: 0x100, 0x474: 0x100, 0x475: 0x100, 0x476: 0x100, 0x477: 0x100, + 0x478: 0x100, 0x479: 0x100, 0x47a: 0x100, 0x47b: 0x100, 0x47c: 0x100, 0x47d: 0x100, 0x47e: 0x100, 0x47f: 0x100, + // Block 0x12, offset 0x480 + 0x480: 0x100, 0x481: 0x100, 0x482: 0x100, 0x483: 0x100, 0x484: 0x100, 0x485: 0x100, 0x486: 0x100, 0x487: 0x100, + 0x488: 0x100, 0x489: 0x100, 0x48a: 0x100, 0x48b: 0x100, 0x48c: 0x100, 0x48d: 0x100, 0x48e: 0x100, 0x48f: 0x100, + 0x490: 0xa6, 0x491: 0xa6, 0x492: 0xa6, 0x493: 0xa6, 0x494: 0xa6, 0x495: 0xa6, 0x496: 0xa6, 0x497: 0xa6, + 0x498: 0xa6, 0x499: 0x14a, 0x49a: 0x100, 0x49b: 0x100, 0x49c: 0x100, 0x49d: 0x100, 0x49e: 0x100, 0x49f: 0x100, + 0x4a0: 0x100, 0x4a1: 0x100, 0x4a2: 0x100, 0x4a3: 0x100, 0x4a4: 0x100, 0x4a5: 0x100, 0x4a6: 0x100, 0x4a7: 0x100, + 0x4a8: 0x100, 0x4a9: 0x100, 0x4aa: 0x100, 0x4ab: 0x100, 0x4ac: 0x100, 0x4ad: 0x100, 0x4ae: 0x100, 0x4af: 0x100, + 0x4b0: 0x100, 0x4b1: 0x100, 0x4b2: 0x100, 0x4b3: 0x100, 0x4b4: 0x100, 0x4b5: 0x100, 0x4b6: 0x100, 0x4b7: 0x100, + 0x4b8: 0x100, 0x4b9: 0x100, 0x4ba: 0x100, 0x4bb: 0x100, 0x4bc: 0x100, 0x4bd: 0x100, 0x4be: 0x100, 0x4bf: 0x100, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x100, 0x4c1: 0x100, 0x4c2: 0x100, 0x4c3: 0x100, 0x4c4: 0x100, 0x4c5: 0x100, 0x4c6: 0x100, 0x4c7: 0x100, + 0x4c8: 0x100, 0x4c9: 0x100, 0x4ca: 0x100, 0x4cb: 0x100, 0x4cc: 0x100, 0x4cd: 0x100, 0x4ce: 0x100, 0x4cf: 0x100, + 0x4d0: 0x100, 0x4d1: 0x100, 0x4d2: 0x100, 0x4d3: 0x100, 0x4d4: 0x100, 0x4d5: 0x100, 0x4d6: 0x100, 0x4d7: 0x100, + 0x4d8: 0x100, 0x4d9: 0x100, 0x4da: 0x100, 0x4db: 0x100, 0x4dc: 0x100, 0x4dd: 0x100, 0x4de: 0x100, 0x4df: 0x100, + 0x4e0: 0xa6, 0x4e1: 0xa6, 0x4e2: 0xa6, 0x4e3: 0xa6, 0x4e4: 0xa6, 0x4e5: 0xa6, 0x4e6: 0xa6, 0x4e7: 0xa6, + 0x4e8: 0x154, 0x4e9: 0x168, 0x4ea: 0x169, 0x4eb: 0x16a, 0x4ec: 0x16b, 0x4ed: 0x16c, 0x4ee: 0x16d, 0x4ef: 0x100, + 0x4f0: 0x100, 0x4f1: 0x100, 0x4f2: 0x100, 0x4f3: 0x100, 0x4f4: 0x100, 0x4f5: 0x100, 0x4f6: 0x100, 0x4f7: 0x100, + 0x4f8: 0x100, 0x4f9: 0x16e, 0x4fa: 0x16f, 0x4fb: 0x100, 0x4fc: 0xa6, 0x4fd: 0x170, 0x4fe: 0x171, 0x4ff: 0x172, + // Block 0x14, offset 0x500 + 0x500: 0xa6, 0x501: 0xa6, 0x502: 0xa6, 0x503: 0xa6, 0x504: 0xa6, 0x505: 0xa6, 0x506: 0xa6, 0x507: 0xa6, + 0x508: 0xa6, 0x509: 0xa6, 0x50a: 0xa6, 0x50b: 0xa6, 0x50c: 0xa6, 0x50d: 0xa6, 0x50e: 0xa6, 0x50f: 0xa6, + 0x510: 0xa6, 0x511: 0xa6, 0x512: 0xa6, 0x513: 0xa6, 0x514: 0xa6, 0x515: 0xa6, 0x516: 0xa6, 0x517: 0xa6, + 0x518: 0xa6, 0x519: 0xa6, 0x51a: 0xa6, 0x51b: 0xa6, 0x51c: 0xa6, 0x51d: 0xa6, 0x51e: 0xa6, 0x51f: 0x173, + 0x520: 0xa6, 0x521: 0xa6, 0x522: 0xa6, 0x523: 0xa6, 0x524: 0xa6, 0x525: 0xa6, 0x526: 0xa6, 0x527: 0xa6, + 0x528: 0xa6, 0x529: 0xa6, 0x52a: 0xa6, 0x52b: 0xa6, 0x52c: 0xa6, 0x52d: 0xa6, 0x52e: 0xa6, 0x52f: 0xa6, + 0x530: 0xa6, 0x531: 0xa6, 0x532: 0xa6, 0x533: 0x174, 0x534: 0x175, 0x535: 0x100, 0x536: 0x100, 0x537: 0x100, + 0x538: 0x100, 0x539: 0x100, 0x53a: 0x100, 0x53b: 0x100, 0x53c: 0x100, 0x53d: 0x100, 0x53e: 0x100, 0x53f: 0x100, + // Block 0x15, offset 0x540 + 0x540: 0x100, 0x541: 0x100, 0x542: 0x100, 0x543: 0x100, 0x544: 0x100, 0x545: 0x100, 0x546: 0x100, 0x547: 0x100, + 0x548: 0x100, 0x549: 0x100, 0x54a: 0x100, 0x54b: 0x100, 0x54c: 0x100, 0x54d: 0x100, 0x54e: 0x100, 0x54f: 0x100, + 0x550: 0x100, 0x551: 0x100, 0x552: 0x100, 0x553: 0x100, 0x554: 0x100, 0x555: 0x100, 0x556: 0x100, 0x557: 0x100, + 0x558: 0x100, 0x559: 0x100, 0x55a: 0x100, 0x55b: 0x100, 0x55c: 0x100, 0x55d: 0x100, 0x55e: 0x100, 0x55f: 0x100, + 0x560: 0x100, 0x561: 0x100, 0x562: 0x100, 0x563: 0x100, 0x564: 0x100, 0x565: 0x100, 0x566: 0x100, 0x567: 0x100, + 0x568: 0x100, 0x569: 0x100, 0x56a: 0x100, 0x56b: 0x100, 0x56c: 0x100, 0x56d: 0x100, 0x56e: 0x100, 0x56f: 0x100, + 0x570: 0x100, 0x571: 0x100, 0x572: 0x100, 0x573: 0x100, 0x574: 0x100, 0x575: 0x100, 0x576: 0x100, 0x577: 0x100, + 0x578: 0x100, 0x579: 0x100, 0x57a: 0x100, 0x57b: 0x100, 0x57c: 0x100, 0x57d: 0x100, 0x57e: 0x100, 0x57f: 0x176, + // Block 0x16, offset 0x580 + 0x580: 0xa6, 0x581: 0xa6, 0x582: 0xa6, 0x583: 0xa6, 0x584: 0x177, 0x585: 0x178, 0x586: 0xa6, 0x587: 0xa6, + 0x588: 0xa6, 0x589: 0xa6, 0x58a: 0xa6, 0x58b: 0x179, 0x58c: 0x100, 0x58d: 0x100, 0x58e: 0x100, 0x58f: 0x100, + 0x590: 0x100, 0x591: 0x100, 0x592: 0x100, 0x593: 0x100, 0x594: 0x100, 0x595: 0x100, 0x596: 0x100, 0x597: 0x100, + 0x598: 0x100, 0x599: 0x100, 0x59a: 0x100, 0x59b: 0x100, 0x59c: 0x100, 0x59d: 0x100, 0x59e: 0x100, 0x59f: 0x100, + 0x5a0: 0x100, 0x5a1: 0x100, 0x5a2: 0x100, 0x5a3: 0x100, 0x5a4: 0x100, 0x5a5: 0x100, 0x5a6: 0x100, 0x5a7: 0x100, + 0x5a8: 0x100, 0x5a9: 0x100, 0x5aa: 0x100, 0x5ab: 0x100, 0x5ac: 0x100, 0x5ad: 0x100, 0x5ae: 0x100, 0x5af: 0x100, + 0x5b0: 0xa6, 0x5b1: 0x17a, 0x5b2: 0x17b, 0x5b3: 0x100, 0x5b4: 0x100, 0x5b5: 0x100, 0x5b6: 0x100, 0x5b7: 0x100, + 0x5b8: 0x100, 0x5b9: 0x100, 0x5ba: 0x100, 0x5bb: 0x100, 0x5bc: 0x100, 0x5bd: 0x100, 0x5be: 0x100, 0x5bf: 0x100, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x100, 0x5c1: 0x100, 0x5c2: 0x100, 0x5c3: 0x100, 0x5c4: 0x100, 0x5c5: 0x100, 0x5c6: 0x100, 0x5c7: 0x100, + 0x5c8: 0x100, 0x5c9: 0x100, 0x5ca: 0x100, 0x5cb: 0x100, 0x5cc: 0x100, 0x5cd: 0x100, 0x5ce: 0x100, 0x5cf: 0x100, + 0x5d0: 0x100, 0x5d1: 0x100, 0x5d2: 0x100, 0x5d3: 0x100, 0x5d4: 0x100, 0x5d5: 0x100, 0x5d6: 0x100, 0x5d7: 0x100, + 0x5d8: 0x100, 0x5d9: 0x100, 0x5da: 0x100, 0x5db: 0x100, 0x5dc: 0x100, 0x5dd: 0x100, 0x5de: 0x100, 0x5df: 0x100, + 0x5e0: 0x100, 0x5e1: 0x100, 0x5e2: 0x100, 0x5e3: 0x100, 0x5e4: 0x100, 0x5e5: 0x100, 0x5e6: 0x100, 0x5e7: 0x100, + 0x5e8: 0x100, 0x5e9: 0x100, 0x5ea: 0x100, 0x5eb: 0x100, 0x5ec: 0x100, 0x5ed: 0x100, 0x5ee: 0x100, 0x5ef: 0x100, + 0x5f0: 0x100, 0x5f1: 0x100, 0x5f2: 0x100, 0x5f3: 0x100, 0x5f4: 0x100, 0x5f5: 0x100, 0x5f6: 0x100, 0x5f7: 0x100, + 0x5f8: 0x100, 0x5f9: 0x100, 0x5fa: 0x100, 0x5fb: 0x100, 0x5fc: 0x17c, 0x5fd: 0x17d, 0x5fe: 0xa2, 0x5ff: 0x17e, + // Block 0x18, offset 0x600 + 0x600: 0xa2, 0x601: 0xa2, 0x602: 0xa2, 0x603: 0x17f, 0x604: 0x180, 0x605: 0x181, 0x606: 0x182, 0x607: 0x183, + 0x608: 0xa2, 0x609: 0x184, 0x60a: 0x100, 0x60b: 0x185, 0x60c: 0xa2, 0x60d: 0x186, 0x60e: 0x100, 0x60f: 0x100, + 0x610: 0x63, 0x611: 0x64, 0x612: 0x65, 0x613: 0x66, 0x614: 0x67, 0x615: 0x68, 0x616: 0x69, 0x617: 0x6a, + 0x618: 0x6b, 0x619: 0x6c, 0x61a: 0x6d, 0x61b: 0x6e, 0x61c: 0x6f, 0x61d: 0x70, 0x61e: 0x71, 0x61f: 0x72, + 0x620: 0xa2, 0x621: 0xa2, 0x622: 0xa2, 0x623: 0xa2, 0x624: 0xa2, 0x625: 0xa2, 0x626: 0xa2, 0x627: 0xa2, + 0x628: 0x187, 0x629: 0x188, 0x62a: 0x189, 0x62b: 0x100, 0x62c: 0x100, 0x62d: 0x100, 0x62e: 0x100, 0x62f: 0x100, + 0x630: 0x100, 0x631: 0x100, 0x632: 0x100, 0x633: 0x100, 0x634: 0x100, 0x635: 0x100, 0x636: 0x100, 0x637: 0x100, + 0x638: 0x100, 0x639: 0x100, 0x63a: 0x100, 0x63b: 0x100, 0x63c: 0x18a, 0x63d: 0x100, 0x63e: 0x100, 0x63f: 0x100, + // Block 0x19, offset 0x640 + 0x640: 0x73, 0x641: 0x74, 0x642: 0x18b, 0x643: 0x100, 0x644: 0x18c, 0x645: 0x18d, 0x646: 0x100, 0x647: 0x100, + 0x648: 0x100, 0x649: 0x100, 0x64a: 0x18e, 0x64b: 0x18f, 0x64c: 0x100, 0x64d: 0x100, 0x64e: 0x100, 0x64f: 0x100, + 0x650: 0x100, 0x651: 0x100, 0x652: 0x100, 0x653: 0x190, 0x654: 0x100, 0x655: 0x100, 0x656: 0x100, 0x657: 0x100, + 0x658: 0x100, 0x659: 0x100, 0x65a: 0x100, 0x65b: 0x100, 0x65c: 0x100, 0x65d: 0x100, 0x65e: 0x100, 0x65f: 0x191, + 0x660: 0x127, 0x661: 0x127, 0x662: 0x127, 0x663: 0x192, 0x664: 0x75, 0x665: 0x193, 0x666: 0x100, 0x667: 0x100, + 0x668: 0x100, 0x669: 0x100, 0x66a: 0x100, 0x66b: 0x100, 0x66c: 0x100, 0x66d: 0x100, 0x66e: 0x100, 0x66f: 0x100, + 0x670: 0x100, 0x671: 0x194, 0x672: 0x195, 0x673: 0x100, 0x674: 0x196, 0x675: 0x100, 0x676: 0x100, 0x677: 0x100, + 0x678: 0x76, 0x679: 0x77, 0x67a: 0x78, 0x67b: 0x197, 0x67c: 0x100, 0x67d: 0x100, 0x67e: 0x100, 0x67f: 0x100, + // Block 0x1a, offset 0x680 + 0x680: 0x198, 0x681: 0xa2, 0x682: 0x199, 0x683: 0x19a, 0x684: 0x79, 0x685: 0x7a, 0x686: 0x19b, 0x687: 0x19c, + 0x688: 0x7b, 0x689: 0x19d, 0x68a: 0x100, 0x68b: 0x100, 0x68c: 0xa2, 0x68d: 0xa2, 0x68e: 0xa2, 0x68f: 0xa2, + 0x690: 0xa2, 0x691: 0xa2, 0x692: 0xa2, 0x693: 0xa2, 0x694: 0xa2, 0x695: 0xa2, 0x696: 0xa2, 0x697: 0xa2, + 0x698: 0xa2, 0x699: 0xa2, 0x69a: 0xa2, 0x69b: 0x19e, 0x69c: 0xa2, 0x69d: 0x19f, 0x69e: 0xa2, 0x69f: 0x1a0, + 0x6a0: 0x1a1, 0x6a1: 0x1a2, 0x6a2: 0x1a3, 0x6a3: 0x100, 0x6a4: 0xa2, 0x6a5: 0xa2, 0x6a6: 0xa2, 0x6a7: 0xa2, + 0x6a8: 0xa2, 0x6a9: 0x1a4, 0x6aa: 0x1a5, 0x6ab: 0x1a6, 0x6ac: 0xa2, 0x6ad: 0xa2, 0x6ae: 0x1a7, 0x6af: 0x1a8, + 0x6b0: 0x100, 0x6b1: 0x100, 0x6b2: 0x100, 0x6b3: 0x100, 0x6b4: 0x100, 0x6b5: 0x100, 0x6b6: 0x100, 0x6b7: 0x100, + 0x6b8: 0x100, 0x6b9: 0x100, 0x6ba: 0x100, 0x6bb: 0x100, 0x6bc: 0x100, 0x6bd: 0x100, 0x6be: 0x100, 0x6bf: 0x100, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0xa6, 0x6c1: 0xa6, 0x6c2: 0xa6, 0x6c3: 0xa6, 0x6c4: 0xa6, 0x6c5: 0xa6, 0x6c6: 0xa6, 0x6c7: 0xa6, + 0x6c8: 0xa6, 0x6c9: 0xa6, 0x6ca: 0xa6, 0x6cb: 0xa6, 0x6cc: 0xa6, 0x6cd: 0xa6, 0x6ce: 0xa6, 0x6cf: 0xa6, + 0x6d0: 0xa6, 0x6d1: 0xa6, 0x6d2: 0xa6, 0x6d3: 0xa6, 0x6d4: 0xa6, 0x6d5: 0xa6, 0x6d6: 0xa6, 0x6d7: 0xa6, + 0x6d8: 0xa6, 0x6d9: 0xa6, 0x6da: 0xa6, 0x6db: 0x1a9, 0x6dc: 0xa6, 0x6dd: 0xa6, 0x6de: 0xa6, 0x6df: 0xa6, + 0x6e0: 0xa6, 0x6e1: 0xa6, 0x6e2: 0xa6, 0x6e3: 0xa6, 0x6e4: 0xa6, 0x6e5: 0xa6, 0x6e6: 0xa6, 0x6e7: 0xa6, + 0x6e8: 0xa6, 0x6e9: 0xa6, 0x6ea: 0xa6, 0x6eb: 0xa6, 0x6ec: 0xa6, 0x6ed: 0xa6, 0x6ee: 0xa6, 0x6ef: 0xa6, + 0x6f0: 0xa6, 0x6f1: 0xa6, 0x6f2: 0xa6, 0x6f3: 0xa6, 0x6f4: 0xa6, 0x6f5: 0xa6, 0x6f6: 0xa6, 0x6f7: 0xa6, + 0x6f8: 0xa6, 0x6f9: 0xa6, 0x6fa: 0xa6, 0x6fb: 0xa6, 0x6fc: 0xa6, 0x6fd: 0xa6, 0x6fe: 0xa6, 0x6ff: 0xa6, + // Block 0x1c, offset 0x700 + 0x700: 0xa6, 0x701: 0xa6, 0x702: 0xa6, 0x703: 0xa6, 0x704: 0xa6, 0x705: 0xa6, 0x706: 0xa6, 0x707: 0xa6, + 0x708: 0xa6, 0x709: 0xa6, 0x70a: 0xa6, 0x70b: 0xa6, 0x70c: 0xa6, 0x70d: 0xa6, 0x70e: 0xa6, 0x70f: 0xa6, + 0x710: 0xa6, 0x711: 0xa6, 0x712: 0xa6, 0x713: 0xa6, 0x714: 0xa6, 0x715: 0xa6, 0x716: 0xa6, 0x717: 0xa6, + 0x718: 0xa6, 0x719: 0xa6, 0x71a: 0xa6, 0x71b: 0xa6, 0x71c: 0x1aa, 0x71d: 0xa6, 0x71e: 0xa6, 0x71f: 0xa6, + 0x720: 0x1ab, 0x721: 0xa6, 0x722: 0xa6, 0x723: 0xa6, 0x724: 0xa6, 0x725: 0xa6, 0x726: 0xa6, 0x727: 0xa6, + 0x728: 0xa6, 0x729: 0xa6, 0x72a: 0xa6, 0x72b: 0xa6, 0x72c: 0xa6, 0x72d: 0xa6, 0x72e: 0xa6, 0x72f: 0xa6, + 0x730: 0xa6, 0x731: 0xa6, 0x732: 0xa6, 0x733: 0xa6, 0x734: 0xa6, 0x735: 0xa6, 0x736: 0xa6, 0x737: 0xa6, + 0x738: 0xa6, 0x739: 0xa6, 0x73a: 0xa6, 0x73b: 0xa6, 0x73c: 0xa6, 0x73d: 0xa6, 0x73e: 0xa6, 0x73f: 0xa6, + // Block 0x1d, offset 0x740 + 0x740: 0xa6, 0x741: 0xa6, 0x742: 0xa6, 0x743: 0xa6, 0x744: 0xa6, 0x745: 0xa6, 0x746: 0xa6, 0x747: 0xa6, + 0x748: 0xa6, 0x749: 0xa6, 0x74a: 0xa6, 0x74b: 0xa6, 0x74c: 0xa6, 0x74d: 0xa6, 0x74e: 0xa6, 0x74f: 0xa6, + 0x750: 0xa6, 0x751: 0xa6, 0x752: 0xa6, 0x753: 0xa6, 0x754: 0xa6, 0x755: 0xa6, 0x756: 0xa6, 0x757: 0xa6, + 0x758: 0xa6, 0x759: 0xa6, 0x75a: 0xa6, 0x75b: 0xa6, 0x75c: 0xa6, 0x75d: 0xa6, 0x75e: 0xa6, 0x75f: 0xa6, + 0x760: 0xa6, 0x761: 0xa6, 0x762: 0xa6, 0x763: 0xa6, 0x764: 0xa6, 0x765: 0xa6, 0x766: 0xa6, 0x767: 0xa6, + 0x768: 0xa6, 0x769: 0xa6, 0x76a: 0xa6, 0x76b: 0xa6, 0x76c: 0xa6, 0x76d: 0xa6, 0x76e: 0xa6, 0x76f: 0xa6, + 0x770: 0xa6, 0x771: 0xa6, 0x772: 0xa6, 0x773: 0xa6, 0x774: 0xa6, 0x775: 0xa6, 0x776: 0xa6, 0x777: 0xa6, + 0x778: 0xa6, 0x779: 0xa6, 0x77a: 0x1ac, 0x77b: 0xa6, 0x77c: 0xa6, 0x77d: 0xa6, 0x77e: 0xa6, 0x77f: 0xa6, + // Block 0x1e, offset 0x780 + 0x780: 0xa6, 0x781: 0xa6, 0x782: 0xa6, 0x783: 0xa6, 0x784: 0xa6, 0x785: 0xa6, 0x786: 0xa6, 0x787: 0xa6, + 0x788: 0xa6, 0x789: 0xa6, 0x78a: 0xa6, 0x78b: 0xa6, 0x78c: 0xa6, 0x78d: 0xa6, 0x78e: 0xa6, 0x78f: 0xa6, + 0x790: 0xa6, 0x791: 0xa6, 0x792: 0xa6, 0x793: 0xa6, 0x794: 0xa6, 0x795: 0xa6, 0x796: 0xa6, 0x797: 0xa6, + 0x798: 0xa6, 0x799: 0xa6, 0x79a: 0xa6, 0x79b: 0xa6, 0x79c: 0xa6, 0x79d: 0xa6, 0x79e: 0xa6, 0x79f: 0xa6, + 0x7a0: 0xa6, 0x7a1: 0xa6, 0x7a2: 0xa6, 0x7a3: 0xa6, 0x7a4: 0xa6, 0x7a5: 0xa6, 0x7a6: 0xa6, 0x7a7: 0xa6, + 0x7a8: 0xa6, 0x7a9: 0xa6, 0x7aa: 0xa6, 0x7ab: 0xa6, 0x7ac: 0xa6, 0x7ad: 0xa6, 0x7ae: 0xa6, 0x7af: 0x1ad, + 0x7b0: 0x100, 0x7b1: 0x100, 0x7b2: 0x100, 0x7b3: 0x100, 0x7b4: 0x100, 0x7b5: 0x100, 0x7b6: 0x100, 0x7b7: 0x100, + 0x7b8: 0x100, 0x7b9: 0x100, 0x7ba: 0x100, 0x7bb: 0x100, 0x7bc: 0x100, 0x7bd: 0x100, 0x7be: 0x100, 0x7bf: 0x100, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x100, 0x7c1: 0x100, 0x7c2: 0x100, 0x7c3: 0x100, 0x7c4: 0x100, 0x7c5: 0x100, 0x7c6: 0x100, 0x7c7: 0x100, + 0x7c8: 0x100, 0x7c9: 0x100, 0x7ca: 0x100, 0x7cb: 0x100, 0x7cc: 0x100, 0x7cd: 0x100, 0x7ce: 0x100, 0x7cf: 0x100, + 0x7d0: 0x100, 0x7d1: 0x100, 0x7d2: 0x100, 0x7d3: 0x100, 0x7d4: 0x100, 0x7d5: 0x100, 0x7d6: 0x100, 0x7d7: 0x100, + 0x7d8: 0x100, 0x7d9: 0x100, 0x7da: 0x100, 0x7db: 0x100, 0x7dc: 0x100, 0x7dd: 0x100, 0x7de: 0x100, 0x7df: 0x100, + 0x7e0: 0x7c, 0x7e1: 0x7d, 0x7e2: 0x7e, 0x7e3: 0x7f, 0x7e4: 0x80, 0x7e5: 0x81, 0x7e6: 0x82, 0x7e7: 0x83, + 0x7e8: 0x84, 0x7e9: 0x100, 0x7ea: 0x100, 0x7eb: 0x100, 0x7ec: 0x100, 0x7ed: 0x100, 0x7ee: 0x100, 0x7ef: 0x100, + 0x7f0: 0x100, 0x7f1: 0x100, 0x7f2: 0x100, 0x7f3: 0x100, 0x7f4: 0x100, 0x7f5: 0x100, 0x7f6: 0x100, 0x7f7: 0x100, + 0x7f8: 0x100, 0x7f9: 0x100, 0x7fa: 0x100, 0x7fb: 0x100, 0x7fc: 0x100, 0x7fd: 0x100, 0x7fe: 0x100, 0x7ff: 0x100, + // Block 0x20, offset 0x800 + 0x800: 0xa6, 0x801: 0xa6, 0x802: 0xa6, 0x803: 0xa6, 0x804: 0xa6, 0x805: 0xa6, 0x806: 0xa6, 0x807: 0xa6, + 0x808: 0xa6, 0x809: 0xa6, 0x80a: 0xa6, 0x80b: 0xa6, 0x80c: 0xa6, 0x80d: 0x1ae, 0x80e: 0xa6, 0x80f: 0xa6, + 0x810: 0xa6, 0x811: 0xa6, 0x812: 0xa6, 0x813: 0xa6, 0x814: 0xa6, 0x815: 0xa6, 0x816: 0xa6, 0x817: 0xa6, + 0x818: 0xa6, 0x819: 0xa6, 0x81a: 0xa6, 0x81b: 0xa6, 0x81c: 0xa6, 0x81d: 0xa6, 0x81e: 0xa6, 0x81f: 0xa6, + 0x820: 0xa6, 0x821: 0xa6, 0x822: 0xa6, 0x823: 0xa6, 0x824: 0xa6, 0x825: 0xa6, 0x826: 0xa6, 0x827: 0xa6, + 0x828: 0xa6, 0x829: 0xa6, 0x82a: 0xa6, 0x82b: 0xa6, 0x82c: 0xa6, 0x82d: 0xa6, 0x82e: 0xa6, 0x82f: 0xa6, + 0x830: 0xa6, 0x831: 0xa6, 0x832: 0xa6, 0x833: 0xa6, 0x834: 0xa6, 0x835: 0xa6, 0x836: 0xa6, 0x837: 0xa6, + 0x838: 0xa6, 0x839: 0xa6, 0x83a: 0xa6, 0x83b: 0xa6, 0x83c: 0xa6, 0x83d: 0xa6, 0x83e: 0xa6, 0x83f: 0xa6, + // Block 0x21, offset 0x840 + 0x840: 0xa6, 0x841: 0xa6, 0x842: 0xa6, 0x843: 0xa6, 0x844: 0xa6, 0x845: 0xa6, 0x846: 0xa6, 0x847: 0xa6, + 0x848: 0xa6, 0x849: 0xa6, 0x84a: 0xa6, 0x84b: 0xa6, 0x84c: 0xa6, 0x84d: 0xa6, 0x84e: 0x1af, 0x84f: 0x100, + 0x850: 0x100, 0x851: 0x100, 0x852: 0x100, 0x853: 0x100, 0x854: 0x100, 0x855: 0x100, 0x856: 0x100, 0x857: 0x100, + 0x858: 0x100, 0x859: 0x100, 0x85a: 0x100, 0x85b: 0x100, 0x85c: 0x100, 0x85d: 0x100, 0x85e: 0x100, 0x85f: 0x100, + 0x860: 0x100, 0x861: 0x100, 0x862: 0x100, 0x863: 0x100, 0x864: 0x100, 0x865: 0x100, 0x866: 0x100, 0x867: 0x100, + 0x868: 0x100, 0x869: 0x100, 0x86a: 0x100, 0x86b: 0x100, 0x86c: 0x100, 0x86d: 0x100, 0x86e: 0x100, 0x86f: 0x100, + 0x870: 0x100, 0x871: 0x100, 0x872: 0x100, 0x873: 0x100, 0x874: 0x100, 0x875: 0x100, 0x876: 0x100, 0x877: 0x100, + 0x878: 0x100, 0x879: 0x100, 0x87a: 0x100, 0x87b: 0x100, 0x87c: 0x100, 0x87d: 0x100, 0x87e: 0x100, 0x87f: 0x100, + // Block 0x22, offset 0x880 + 0x890: 0x0c, 0x891: 0x0d, 0x892: 0x0e, 0x893: 0x0f, 0x894: 0x10, 0x895: 0x0a, 0x896: 0x11, 0x897: 0x07, + 0x898: 0x12, 0x899: 0x0a, 0x89a: 0x13, 0x89b: 0x14, 0x89c: 0x15, 0x89d: 0x16, 0x89e: 0x17, 0x89f: 0x18, + 0x8a0: 0x07, 0x8a1: 0x07, 0x8a2: 0x07, 0x8a3: 0x07, 0x8a4: 0x07, 0x8a5: 0x07, 0x8a6: 0x07, 0x8a7: 0x07, + 0x8a8: 0x07, 0x8a9: 0x07, 0x8aa: 0x19, 0x8ab: 0x1a, 0x8ac: 0x1b, 0x8ad: 0x07, 0x8ae: 0x1c, 0x8af: 0x1d, + 0x8b0: 0x07, 0x8b1: 0x1e, 0x8b2: 0x1f, 0x8b3: 0x0a, 0x8b4: 0x0a, 0x8b5: 0x0a, 0x8b6: 0x0a, 0x8b7: 0x0a, + 0x8b8: 0x0a, 0x8b9: 0x0a, 0x8ba: 0x0a, 0x8bb: 0x0a, 0x8bc: 0x0a, 0x8bd: 0x0a, 0x8be: 0x0a, 0x8bf: 0x0a, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0a, 0x8c1: 0x0a, 0x8c2: 0x0a, 0x8c3: 0x0a, 0x8c4: 0x0a, 0x8c5: 0x0a, 0x8c6: 0x0a, 0x8c7: 0x0a, + 0x8c8: 0x0a, 0x8c9: 0x0a, 0x8ca: 0x0a, 0x8cb: 0x0a, 0x8cc: 0x0a, 0x8cd: 0x0a, 0x8ce: 0x0a, 0x8cf: 0x0a, + 0x8d0: 0x0a, 0x8d1: 0x0a, 0x8d2: 0x0a, 0x8d3: 0x0a, 0x8d4: 0x0a, 0x8d5: 0x0a, 0x8d6: 0x0a, 0x8d7: 0x0a, + 0x8d8: 0x0a, 0x8d9: 0x0a, 0x8da: 0x0a, 0x8db: 0x0a, 0x8dc: 0x0a, 0x8dd: 0x0a, 0x8de: 0x0a, 0x8df: 0x0a, + 0x8e0: 0x0a, 0x8e1: 0x0a, 0x8e2: 0x0a, 0x8e3: 0x0a, 0x8e4: 0x0a, 0x8e5: 0x0a, 0x8e6: 0x0a, 0x8e7: 0x0a, + 0x8e8: 0x0a, 0x8e9: 0x0a, 0x8ea: 0x0a, 0x8eb: 0x0a, 0x8ec: 0x0a, 0x8ed: 0x0a, 0x8ee: 0x0a, 0x8ef: 0x0a, + 0x8f0: 0x0a, 0x8f1: 0x0a, 0x8f2: 0x0a, 0x8f3: 0x0a, 0x8f4: 0x0a, 0x8f5: 0x0a, 0x8f6: 0x0a, 0x8f7: 0x0a, + 0x8f8: 0x0a, 0x8f9: 0x0a, 0x8fa: 0x0a, 0x8fb: 0x0a, 0x8fc: 0x0a, 0x8fd: 0x0a, 0x8fe: 0x0a, 0x8ff: 0x0a, + // Block 0x24, offset 0x900 + 0x900: 0x1b0, 0x901: 0x1b1, 0x902: 0x100, 0x903: 0x100, 0x904: 0x1b2, 0x905: 0x1b2, 0x906: 0x1b2, 0x907: 0x1b3, + 0x908: 0x100, 0x909: 0x100, 0x90a: 0x100, 0x90b: 0x100, 0x90c: 0x100, 0x90d: 0x100, 0x90e: 0x100, 0x90f: 0x100, + 0x910: 0x100, 0x911: 0x100, 0x912: 0x100, 0x913: 0x100, 0x914: 0x100, 0x915: 0x100, 0x916: 0x100, 0x917: 0x100, + 0x918: 0x100, 0x919: 0x100, 0x91a: 0x100, 0x91b: 0x100, 0x91c: 0x100, 0x91d: 0x100, 0x91e: 0x100, 0x91f: 0x100, + 0x920: 0x100, 0x921: 0x100, 0x922: 0x100, 0x923: 0x100, 0x924: 0x100, 0x925: 0x100, 0x926: 0x100, 0x927: 0x100, + 0x928: 0x100, 0x929: 0x100, 0x92a: 0x100, 0x92b: 0x100, 0x92c: 0x100, 0x92d: 0x100, 0x92e: 0x100, 0x92f: 0x100, + 0x930: 0x100, 0x931: 0x100, 0x932: 0x100, 0x933: 0x100, 0x934: 0x100, 0x935: 0x100, 0x936: 0x100, 0x937: 0x100, + 0x938: 0x100, 0x939: 0x100, 0x93a: 0x100, 0x93b: 0x100, 0x93c: 0x100, 0x93d: 0x100, 0x93e: 0x100, 0x93f: 0x100, + // Block 0x25, offset 0x940 + 0x940: 0x0a, 0x941: 0x0a, 0x942: 0x0a, 0x943: 0x0a, 0x944: 0x0a, 0x945: 0x0a, 0x946: 0x0a, 0x947: 0x0a, + 0x948: 0x0a, 0x949: 0x0a, 0x94a: 0x0a, 0x94b: 0x0a, 0x94c: 0x0a, 0x94d: 0x0a, 0x94e: 0x0a, 0x94f: 0x0a, + 0x950: 0x0a, 0x951: 0x0a, 0x952: 0x0a, 0x953: 0x0a, 0x954: 0x0a, 0x955: 0x0a, 0x956: 0x0a, 0x957: 0x0a, + 0x958: 0x0a, 0x959: 0x0a, 0x95a: 0x0a, 0x95b: 0x0a, 0x95c: 0x0a, 0x95d: 0x0a, 0x95e: 0x0a, 0x95f: 0x0a, + 0x960: 0x22, 0x961: 0x0a, 0x962: 0x0a, 0x963: 0x0a, 0x964: 0x0a, 0x965: 0x0a, 0x966: 0x0a, 0x967: 0x0a, + 0x968: 0x0a, 0x969: 0x0a, 0x96a: 0x0a, 0x96b: 0x0a, 0x96c: 0x0a, 0x96d: 0x0a, 0x96e: 0x0a, 0x96f: 0x0a, + 0x970: 0x0a, 0x971: 0x0a, 0x972: 0x0a, 0x973: 0x0a, 0x974: 0x0a, 0x975: 0x0a, 0x976: 0x0a, 0x977: 0x0a, + 0x978: 0x0a, 0x979: 0x0a, 0x97a: 0x0a, 0x97b: 0x0a, 0x97c: 0x0a, 0x97d: 0x0a, 0x97e: 0x0a, 0x97f: 0x0a, + // Block 0x26, offset 0x980 + 0x980: 0x0a, 0x981: 0x0a, 0x982: 0x0a, 0x983: 0x0a, 0x984: 0x0a, 0x985: 0x0a, 0x986: 0x0a, 0x987: 0x0a, + 0x988: 0x0a, 0x989: 0x0a, 0x98a: 0x0a, 0x98b: 0x0a, 0x98c: 0x0a, 0x98d: 0x0a, 0x98e: 0x0a, 0x98f: 0x0a, +} + +// idnaSparseOffset: 303 entries, 606 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x7e, 0x87, 0x97, 0xa6, 0xb1, 0xbe, 0xcf, 0xd9, 0xe0, 0xed, 0xfe, 0x105, 0x110, 0x11f, 0x12d, 0x137, 0x139, 0x13e, 0x141, 0x144, 0x146, 0x152, 0x15d, 0x165, 0x16b, 0x171, 0x176, 0x17b, 0x17e, 0x182, 0x188, 0x18d, 0x198, 0x1a2, 0x1a8, 0x1b9, 0x1c4, 0x1c7, 0x1cf, 0x1d2, 0x1df, 0x1e7, 0x1eb, 0x1f2, 0x1fa, 0x20a, 0x216, 0x219, 0x223, 0x22f, 0x23b, 0x247, 0x24f, 0x254, 0x261, 0x272, 0x27d, 0x282, 0x28b, 0x293, 0x299, 0x29e, 0x2a1, 0x2a5, 0x2ab, 0x2af, 0x2b3, 0x2b7, 0x2bc, 0x2c4, 0x2cb, 0x2d6, 0x2e0, 0x2e4, 0x2e7, 0x2ed, 0x2f1, 0x2f3, 0x2f6, 0x2f8, 0x2fb, 0x305, 0x308, 0x317, 0x31b, 0x31f, 0x321, 0x32a, 0x32e, 0x333, 0x338, 0x33e, 0x34e, 0x354, 0x358, 0x367, 0x36c, 0x374, 0x37e, 0x389, 0x391, 0x3a2, 0x3ab, 0x3bb, 0x3c8, 0x3d4, 0x3d9, 0x3e6, 0x3ea, 0x3ef, 0x3f1, 0x3f3, 0x3f7, 0x3f9, 0x3fd, 0x406, 0x40c, 0x410, 0x420, 0x42a, 0x42f, 0x432, 0x438, 0x43f, 0x444, 0x448, 0x44e, 0x453, 0x45c, 0x461, 0x467, 0x46e, 0x475, 0x47c, 0x480, 0x483, 0x488, 0x494, 0x49a, 0x49f, 0x4a6, 0x4ae, 0x4b3, 0x4b7, 0x4c7, 0x4ce, 0x4d2, 0x4d6, 0x4dd, 0x4df, 0x4e2, 0x4e5, 0x4e9, 0x4f2, 0x4f6, 0x4fe, 0x501, 0x509, 0x514, 0x523, 0x52f, 0x535, 0x542, 0x54e, 0x556, 0x55f, 0x56a, 0x571, 0x580, 0x58d, 0x591, 0x59e, 0x5a7, 0x5ab, 0x5ba, 0x5c2, 0x5cd, 0x5d6, 0x5dc, 0x5e4, 0x5ed, 0x5f9, 0x5fc, 0x608, 0x60b, 0x614, 0x617, 0x61c, 0x625, 0x62a, 0x637, 0x642, 0x64b, 0x656, 0x659, 0x65c, 0x666, 0x66f, 0x67b, 0x688, 0x695, 0x6a3, 0x6aa, 0x6b5, 0x6bc, 0x6c0, 0x6c4, 0x6c7, 0x6cc, 0x6cf, 0x6d2, 0x6d6, 0x6d9, 0x6de, 0x6e5, 0x6e8, 0x6f0, 0x6f4, 0x6ff, 0x702, 0x705, 0x708, 0x70e, 0x714, 0x71d, 0x720, 0x723, 0x726, 0x72e, 0x733, 0x73c, 0x73f, 0x744, 0x74e, 0x752, 0x756, 0x759, 0x75c, 0x760, 0x76f, 0x77b, 0x77f, 0x784, 0x789, 0x78e, 0x792, 0x797, 0x7a0, 0x7a5, 0x7a9, 0x7af, 0x7b5, 0x7ba, 0x7c0, 0x7c6, 0x7d0, 0x7d6, 0x7df, 0x7e2, 0x7e5, 0x7e9, 0x7ed, 0x7f1, 0x7f7, 0x7fd, 0x802, 0x805, 0x815, 0x81c, 0x820, 0x827, 0x82b, 0x831, 0x838, 0x83f, 0x845, 0x84e, 0x852, 0x860, 0x863, 0x866, 0x86a, 0x86e, 0x871, 0x875, 0x878, 0x87d, 0x87f, 0x881} + +// idnaSparseValues: 2180 entries, 8720 bytes +var idnaSparseValues = [2180]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: 0x00a9, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x00b1, lo: 0xb2, hi: 0xb2}, + {value: 0x00b9, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x00c1, lo: 0xb7, hi: 0xb7}, + {value: 0x00c9, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x3308, 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: 0x06}, + {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: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x6, offset 0x33 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0131, lo: 0x87, hi: 0x87}, + {value: 0x0008, 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: 0x3308, lo: 0x91, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3e + {value: 0x0000, lo: 0x0b}, + {value: 0x0818, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x82}, + {value: 0x0818, lo: 0x83, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xae}, + {value: 0x0808, lo: 0xaf, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4a + {value: 0x0000, lo: 0x03}, + {value: 0x0a08, lo: 0x80, hi: 0x87}, + {value: 0x0c08, lo: 0x88, hi: 0x99}, + {value: 0x0a08, lo: 0x9a, hi: 0xbf}, + // Block 0x9, offset 0x4e + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0c08, lo: 0x8d, hi: 0x8d}, + {value: 0x0a08, lo: 0x8e, hi: 0x98}, + {value: 0x0c08, lo: 0x99, hi: 0x9b}, + {value: 0x0a08, lo: 0x9c, hi: 0xaa}, + {value: 0x0c08, lo: 0xab, hi: 0xac}, + {value: 0x0a08, lo: 0xad, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb4}, + {value: 0x0a08, lo: 0xb5, hi: 0xb7}, + {value: 0x0c08, lo: 0xb8, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbf}, + // Block 0xa, offset 0x5d + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xb, offset 0x62 + {value: 0x0000, lo: 0x09}, + {value: 0x0808, lo: 0x80, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbf}, + // Block 0xc, offset 0x6c + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x99}, + {value: 0x0808, lo: 0x9a, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa3}, + {value: 0x0808, lo: 0xa4, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa7}, + {value: 0x0808, lo: 0xa8, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0818, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd, offset 0x78 + {value: 0x0000, lo: 0x05}, + {value: 0x0a08, lo: 0x80, hi: 0x88}, + {value: 0x0808, lo: 0x89, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0xa1}, + {value: 0x0840, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xbf}, + // Block 0xe, offset 0x7e + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0xf, offset 0x87 + {value: 0x0000, lo: 0x0f}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x3008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8c}, + {value: 0x3b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x3008, 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 0x10, offset 0x97 + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x83}, + {value: 0x3308, 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: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x11, offset 0xa6 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0008, lo: 0x84, 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: 0x3b08, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb1 + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, 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 0x13, offset 0xbe + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x3b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x3008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x14, offset 0xcf + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x01f1, lo: 0xb3, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb9}, + {value: 0x3b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x15, offset 0xd9 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, 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 0x16, offset 0xe0 + {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: 0x3308, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0201, lo: 0x9c, hi: 0x9c}, + {value: 0x0209, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x17, offset 0xed + {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: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x18, offset 0xfe + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x3308, 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 0x19, offset 0x105 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1a, offset 0x110 + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x3008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1b, offset 0x11f + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x8c}, + {value: 0x3308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x3008, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1c, offset 0x12d + {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 0x1d, offset 0x137 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x1e, offset 0x139 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x2018, lo: 0xa1, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x1f, offset 0x13e + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa7}, + {value: 0x2018, lo: 0xa8, hi: 0xbf}, + // Block 0x20, offset 0x141 + {value: 0x0000, lo: 0x02}, + {value: 0x2018, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0xbf}, + // Block 0x21, offset 0x144 + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x22, offset 0x146 + {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 0x23, offset 0x152 + {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 0x24, offset 0x15d + {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 0x25, offset 0x165 + {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 0x26, offset 0x16b + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x27, offset 0x171 + {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 0x28, offset 0x176 + {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 0x29, offset 0x17b + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2a, offset 0x17e + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2b, offset 0x182 + {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 0x2c, offset 0x188 + {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 0x2d, offset 0x18d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x3b08, lo: 0x94, hi: 0x94}, + {value: 0x3808, lo: 0x95, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3808, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2e, offset 0x198 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, 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: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x2f, offset 0x1a2 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x3340, lo: 0xb4, hi: 0xb5}, + {value: 0x3008, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x30, offset 0x1a8 + {value: 0x0000, lo: 0x10}, + {value: 0x3008, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x91}, + {value: 0x3b08, lo: 0x92, hi: 0x92}, + {value: 0x3308, 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: 0x3308, 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 0x31, offset 0x1b9 + {value: 0x0000, lo: 0x0a}, + {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: 0x33c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x33c0, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x32, offset 0x1c4 + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x33, offset 0x1c7 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x34, offset 0x1cf + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x35, offset 0x1d2 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x36, offset 0x1df + {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 0x37, offset 0x1e7 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x38, offset 0x1eb + {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 0x39, offset 0x1f2 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x3308, lo: 0x97, hi: 0x98}, + {value: 0x3008, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3a, offset 0x1fa + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x3008, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xac}, + {value: 0x3008, lo: 0xad, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3b, offset 0x20a + {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: 0x3308, lo: 0xb0, hi: 0xbd}, + {value: 0x3318, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x216 + {value: 0x0000, lo: 0x02}, + {value: 0x3308, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0xbf}, + // Block 0x3d, offset 0x219 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x3e, offset 0x223 + {value: 0x0000, lo: 0x0b}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x3808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3f, offset 0x22f + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3808, lo: 0xaa, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x40, offset 0x23b + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3008, lo: 0xaa, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x41, offset 0x247 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x42, offset 0x24f + {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 0x43, offset 0x254 + {value: 0x0000, lo: 0x0c}, + {value: 0x02a9, lo: 0x80, hi: 0x80}, + {value: 0x02b1, lo: 0x81, hi: 0x81}, + {value: 0x02b9, lo: 0x82, hi: 0x82}, + {value: 0x02c1, lo: 0x83, hi: 0x83}, + {value: 0x02c9, lo: 0x84, hi: 0x85}, + {value: 0x02d1, lo: 0x86, hi: 0x86}, + {value: 0x02d9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x059d, lo: 0x90, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x059d, lo: 0xbd, hi: 0xbf}, + // Block 0x44, offset 0x261 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x45, offset 0x272 + {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 0x46, offset 0x27d + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x8f}, + {value: 0x3318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x47, offset 0x282 + {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: 0x0851, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x48, offset 0x28b + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0859, lo: 0xac, hi: 0xac}, + {value: 0x0861, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x0869, lo: 0xaf, hi: 0xaf}, + {value: 0x0871, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x293 + {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 0x4a, offset 0x299 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09dd, lo: 0xa9, hi: 0xa9}, + {value: 0x09fd, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4b, offset 0x29e + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4c, offset 0x2a1 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0929, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x4d, offset 0x2a5 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e7e, lo: 0xb4, hi: 0xb4}, + {value: 0x0932, lo: 0xb5, hi: 0xb5}, + {value: 0x0e9e, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x4e, offset 0x2ab + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x0939, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x4f, offset 0x2af + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x50, offset 0x2b3 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0xbf}, + // Block 0x51, offset 0x2b7 + {value: 0x0000, lo: 0x04}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ebd, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x52, offset 0x2bc + {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 0x53, offset 0x2c4 + {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: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x54, offset 0x2cb + {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 0x55, offset 0x2d6 + {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: 0x3308, lo: 0xa0, hi: 0xbf}, + // Block 0x56, offset 0x2e0 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x57, offset 0x2e4 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x58, offset 0x2e7 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0ef5, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x59, offset 0x2ed + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0f15, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5a, offset 0x2f1 + {value: 0x0020, lo: 0x01}, + {value: 0x0f35, lo: 0x80, hi: 0xbf}, + // Block 0x5b, offset 0x2f3 + {value: 0x0020, lo: 0x02}, + {value: 0x1735, lo: 0x80, hi: 0x8f}, + {value: 0x1915, lo: 0x90, hi: 0xbf}, + // Block 0x5c, offset 0x2f6 + {value: 0x0020, lo: 0x01}, + {value: 0x1f15, lo: 0x80, hi: 0xbf}, + // Block 0x5d, offset 0x2f8 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x5e, offset 0x2fb + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9a}, + {value: 0x096a, lo: 0x9b, hi: 0x9b}, + {value: 0x0972, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x0979, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x5f, offset 0x305 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x0981, lo: 0xbf, hi: 0xbf}, + // Block 0x60, offset 0x308 + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb0}, + {value: 0x2a35, lo: 0xb1, hi: 0xb1}, + {value: 0x2a55, lo: 0xb2, hi: 0xb2}, + {value: 0x2a75, lo: 0xb3, hi: 0xb3}, + {value: 0x2a95, lo: 0xb4, hi: 0xb4}, + {value: 0x2a75, lo: 0xb5, hi: 0xb5}, + {value: 0x2ab5, lo: 0xb6, hi: 0xb6}, + {value: 0x2ad5, lo: 0xb7, hi: 0xb7}, + {value: 0x2af5, lo: 0xb8, hi: 0xb9}, + {value: 0x2b15, lo: 0xba, hi: 0xbb}, + {value: 0x2b35, lo: 0xbc, hi: 0xbd}, + {value: 0x2b15, lo: 0xbe, hi: 0xbf}, + // Block 0x61, offset 0x317 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x62, offset 0x31b + {value: 0x0008, lo: 0x03}, + {value: 0x098a, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0a82, lo: 0xa0, hi: 0xbf}, + // Block 0x63, offset 0x31f + {value: 0x0008, lo: 0x01}, + {value: 0x0d19, lo: 0x80, hi: 0xbf}, + // Block 0x64, offset 0x321 + {value: 0x0008, lo: 0x08}, + {value: 0x0f19, lo: 0x80, hi: 0xb0}, + {value: 0x4045, lo: 0xb1, hi: 0xb1}, + {value: 0x10a1, lo: 0xb2, hi: 0xb3}, + {value: 0x4065, lo: 0xb4, hi: 0xb4}, + {value: 0x10b1, lo: 0xb5, hi: 0xb7}, + {value: 0x4085, lo: 0xb8, hi: 0xb8}, + {value: 0x4085, lo: 0xb9, hi: 0xb9}, + {value: 0x10c9, lo: 0xba, hi: 0xbf}, + // Block 0x65, offset 0x32a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x66, offset 0x32e + {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 0x67, offset 0x333 + {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 0x68, offset 0x338 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x69, offset 0x33e + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x3308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x3b08, lo: 0xac, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6a, offset 0x34e + {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 0x6b, offset 0x354 + {value: 0x0000, lo: 0x03}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xbf}, + // Block 0x6c, offset 0x358 + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x84}, + {value: 0x3308, 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: 0x3308, 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: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x6d, offset 0x367 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x6e, offset 0x36c + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x91}, + {value: 0x3008, lo: 0x92, hi: 0x92}, + {value: 0x3808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x6f, offset 0x374 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb9}, + {value: 0x3008, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x70, offset 0x37e + {value: 0x0000, lo: 0x0a}, + {value: 0x3808, 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: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x71, offset 0x389 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x72, offset 0x391 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8c}, + {value: 0x3008, 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: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x73, offset 0x3a2 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x74, offset 0x3ab + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, 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: 0x3008, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x75, offset 0x3bb + {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 0x76, offset 0x3c8 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x449d, lo: 0x9c, hi: 0x9c}, + {value: 0x44b5, lo: 0x9d, hi: 0x9d}, + {value: 0x0941, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa8}, + {value: 0x13f9, lo: 0xa9, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x44cd, lo: 0xb0, hi: 0xbf}, + // Block 0x77, offset 0x3d4 + {value: 0x0000, lo: 0x04}, + {value: 0x44ed, lo: 0x80, hi: 0x8f}, + {value: 0x450d, lo: 0x90, hi: 0x9f}, + {value: 0x452d, lo: 0xa0, hi: 0xaf}, + {value: 0x450d, lo: 0xb0, hi: 0xbf}, + // Block 0x78, offset 0x3d9 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x79, offset 0x3e6 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3ea + {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 0x7b, offset 0x3ef + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x7c, offset 0x3f1 + {value: 0x0020, lo: 0x01}, + {value: 0x454d, lo: 0x80, hi: 0xbf}, + // Block 0x7d, offset 0x3f3 + {value: 0x0020, lo: 0x03}, + {value: 0x4d4d, lo: 0x80, hi: 0x94}, + {value: 0x4b0d, lo: 0x95, hi: 0x95}, + {value: 0x4fed, lo: 0x96, hi: 0xbf}, + // Block 0x7e, offset 0x3f7 + {value: 0x0020, lo: 0x01}, + {value: 0x552d, lo: 0x80, hi: 0xbf}, + // Block 0x7f, offset 0x3f9 + {value: 0x0020, lo: 0x03}, + {value: 0x5d2d, lo: 0x80, hi: 0x84}, + {value: 0x568d, lo: 0x85, hi: 0x85}, + {value: 0x5dcd, lo: 0x86, hi: 0xbf}, + // Block 0x80, offset 0x3fd + {value: 0x0020, lo: 0x08}, + {value: 0x6b8d, lo: 0x80, hi: 0x8f}, + {value: 0x6d4d, lo: 0x90, hi: 0x90}, + {value: 0x6d8d, lo: 0x91, hi: 0xab}, + {value: 0x1401, lo: 0xac, hi: 0xac}, + {value: 0x70ed, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x710d, lo: 0xb0, hi: 0xbf}, + // Block 0x81, offset 0x406 + {value: 0x0020, lo: 0x05}, + {value: 0x730d, lo: 0x80, hi: 0xad}, + {value: 0x656d, lo: 0xae, hi: 0xae}, + {value: 0x78cd, lo: 0xaf, hi: 0xb5}, + {value: 0x6f8d, lo: 0xb6, hi: 0xb6}, + {value: 0x79ad, lo: 0xb7, hi: 0xbf}, + // Block 0x82, offset 0x40c + {value: 0x0008, lo: 0x03}, + {value: 0x1751, lo: 0x80, hi: 0x82}, + {value: 0x1741, lo: 0x83, hi: 0x83}, + {value: 0x1769, lo: 0x84, hi: 0xbf}, + // Block 0x83, offset 0x410 + {value: 0x0008, lo: 0x0f}, + {value: 0x1d81, lo: 0x80, hi: 0x83}, + {value: 0x1d99, lo: 0x84, hi: 0x85}, + {value: 0x1da1, lo: 0x86, hi: 0x87}, + {value: 0x1da9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x1de9, lo: 0x92, hi: 0x97}, + {value: 0x1e11, lo: 0x98, hi: 0x9c}, + {value: 0x1e31, lo: 0x9d, hi: 0xb3}, + {value: 0x1d71, lo: 0xb4, hi: 0xb4}, + {value: 0x1d81, lo: 0xb5, hi: 0xb5}, + {value: 0x1ee9, lo: 0xb6, hi: 0xbb}, + {value: 0x1f09, lo: 0xbc, hi: 0xbc}, + {value: 0x1ef9, lo: 0xbd, hi: 0xbd}, + {value: 0x1f19, lo: 0xbe, hi: 0xbf}, + // Block 0x84, offset 0x420 + {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 0x85, offset 0x42a + {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 0x86, offset 0x42f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x87, offset 0x432 + {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 0x88, offset 0x438 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x89, offset 0x43f + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8a, offset 0x444 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8b, offset 0x448 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8c, offset 0x44e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xbf}, + // Block 0x8d, offset 0x453 + {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: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x8e, offset 0x45c + {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 0x8f, offset 0x461 + {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 0x90, offset 0x467 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8b0d, lo: 0x98, hi: 0x9f}, + {value: 0x8b25, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x91, offset 0x46e + {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: 0x8b25, lo: 0xb0, hi: 0xb7}, + {value: 0x8b0d, lo: 0xb8, hi: 0xbf}, + // Block 0x92, offset 0x475 + {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 0x93, offset 0x47c + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x94, offset 0x480 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x95, offset 0x483 + {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 0x96, offset 0x488 + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0808, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0808, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0808, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0808, lo: 0xbf, hi: 0xbf}, + // Block 0x97, offset 0x494 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0818, lo: 0x97, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0818, lo: 0xb7, hi: 0xbf}, + // Block 0x98, offset 0x49a + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0818, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x99, offset 0x49f + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0818, lo: 0xbb, hi: 0xbf}, + // Block 0x9a, offset 0x4a6 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0818, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0818, lo: 0xbf, hi: 0xbf}, + // Block 0x9b, offset 0x4ae + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0818, lo: 0xbc, hi: 0xbd}, + {value: 0x0808, lo: 0xbe, hi: 0xbf}, + // Block 0x9c, offset 0x4b3 + {value: 0x0000, lo: 0x03}, + {value: 0x0818, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0818, lo: 0x92, hi: 0xbf}, + // Block 0x9d, offset 0x4b7 + {value: 0x0000, lo: 0x0f}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0808, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0808, lo: 0x99, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x9e, offset 0x4c7 + {value: 0x0000, lo: 0x06}, + {value: 0x0818, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0818, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xbc}, + {value: 0x0818, lo: 0xbd, hi: 0xbf}, + // Block 0x9f, offset 0x4ce + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa0, offset 0x4d2 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa1, offset 0x4d6 + {value: 0x0000, lo: 0x06}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0818, lo: 0x98, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0818, lo: 0xb8, hi: 0xbf}, + // Block 0xa2, offset 0x4dd + {value: 0x0000, lo: 0x01}, + {value: 0x0808, lo: 0x80, hi: 0xbf}, + // Block 0xa3, offset 0x4df + {value: 0x0000, lo: 0x02}, + {value: 0x0808, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa4, offset 0x4e2 + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa5, offset 0x4e5 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xbf}, + // Block 0xa6, offset 0x4e9 + {value: 0x0000, lo: 0x08}, + {value: 0x0908, lo: 0x80, hi: 0x80}, + {value: 0x0a08, lo: 0x81, hi: 0xa1}, + {value: 0x0c08, lo: 0xa2, hi: 0xa2}, + {value: 0x0a08, lo: 0xa3, hi: 0xa3}, + {value: 0x3308, lo: 0xa4, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xa7, offset 0x4f2 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0818, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xa8, offset 0x4f6 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xac}, + {value: 0x0818, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xa9, offset 0x4fe + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbf}, + // Block 0xaa, offset 0x501 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0xa6}, + {value: 0x0808, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb3}, + {value: 0x0a08, lo: 0xb4, hi: 0xbf}, + // Block 0xab, offset 0x509 + {value: 0x0000, lo: 0x0a}, + {value: 0x0a08, lo: 0x80, hi: 0x84}, + {value: 0x0808, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x90}, + {value: 0x0a18, lo: 0x91, hi: 0x93}, + {value: 0x0c18, lo: 0x94, hi: 0x94}, + {value: 0x0818, lo: 0x95, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb3}, + {value: 0x0c08, lo: 0xb4, hi: 0xb5}, + {value: 0x0a08, lo: 0xb6, hi: 0xbf}, + // Block 0xac, offset 0x514 + {value: 0x0000, lo: 0x0e}, + {value: 0x0a08, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb3}, + {value: 0x0c08, lo: 0xb4, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb7}, + {value: 0x0a08, lo: 0xb8, hi: 0xb8}, + {value: 0x0c08, lo: 0xb9, hi: 0xba}, + {value: 0x0a08, lo: 0xbb, hi: 0xbc}, + {value: 0x0c08, lo: 0xbd, hi: 0xbd}, + {value: 0x0a08, lo: 0xbe, hi: 0xbf}, + // Block 0xad, offset 0x523 + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x0a08, lo: 0x81, hi: 0x81}, + {value: 0x0c08, lo: 0x82, hi: 0x83}, + {value: 0x0a08, lo: 0x84, hi: 0x84}, + {value: 0x0818, lo: 0x85, hi: 0x88}, + {value: 0x0c18, lo: 0x89, hi: 0x89}, + {value: 0x0a18, lo: 0x8a, hi: 0x8a}, + {value: 0x0918, lo: 0x8b, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xae, offset 0x52f + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xaf, offset 0x535 + {value: 0x0000, lo: 0x0c}, + {value: 0x3308, lo: 0x80, hi: 0x85}, + {value: 0x3b08, 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: 0x3b08, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xb0, offset 0x542 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xb1, offset 0x54e + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, 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 0xb2, offset 0x556 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb2}, + {value: 0x3b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xb3, offset 0x55f + {value: 0x0000, lo: 0x0a}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb4, offset 0x56a + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xbe}, + {value: 0x3008, lo: 0xbf, hi: 0xbf}, + // Block 0xb5, offset 0x571 + {value: 0x0000, lo: 0x0e}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x3008, lo: 0x8e, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, 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 0xb6, offset 0x580 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3808, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xb7, offset 0x58d + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0xbf}, + // Block 0xb8, offset 0x591 + {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 0xb9, offset 0x59e + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x3308, lo: 0x9f, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa9}, + {value: 0x3b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xba, offset 0x5a7 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xbb, offset 0x5ab + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xbc, offset 0x5ba + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xbd, offset 0x5c2 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, 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 0xbe, offset 0x5cd + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbf, offset 0x5d6 + {value: 0x0000, lo: 0x05}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x3308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xc0, offset 0x5dc + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xc1, offset 0x5e4 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, 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 0xc2, offset 0x5ed + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb5}, + {value: 0x3808, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xc3, offset 0x5f9 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xc4, offset 0x5fc + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc5, offset 0x608 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xc6, offset 0x60b + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xc7, offset 0x614 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc8, offset 0x617 + {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 0xc9, offset 0x61c + {value: 0x0000, lo: 0x08}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xca, offset 0x625 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xbf}, + // Block 0xcb, offset 0x62a + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x99}, + {value: 0x3308, lo: 0x9a, hi: 0x9b}, + {value: 0x3008, lo: 0x9c, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x0018, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xbf}, + // Block 0xcc, offset 0x637 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xcd, offset 0x642 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x3b08, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0xbf}, + // Block 0xce, offset 0x64b + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x98}, + {value: 0x3b08, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xcf, offset 0x656 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xd0, offset 0x659 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xd1, offset 0x65c + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xd2, offset 0x666 + {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 0xd3, offset 0x66f + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xa9}, + {value: 0x3308, lo: 0xaa, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xd4, offset 0x67b + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xd5, offset 0x688 + {value: 0x0000, lo: 0x0c}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xbf}, + // Block 0xd6, offset 0x695 + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x3008, lo: 0x93, hi: 0x94}, + {value: 0x3308, lo: 0x95, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x96}, + {value: 0x3b08, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xbf}, + // Block 0xd7, offset 0x6a3 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xd8, offset 0x6aa + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0xd9, offset 0x6b5 + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3808, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xda, offset 0x6bc + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0xdb, offset 0x6c0 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xdc, offset 0x6c4 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xdd, offset 0x6c7 + {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 0xde, offset 0x6cc + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xdf, offset 0x6cf + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbf}, + // Block 0xe0, offset 0x6d2 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xe1, offset 0x6d6 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0340, lo: 0xb0, hi: 0xbf}, + // Block 0xe2, offset 0x6d9 + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0xe3, offset 0x6de + {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: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xe4, offset 0x6e5 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xe5, offset 0x6e8 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xe6, offset 0x6f0 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xe7, offset 0x6f4 + {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 0xe8, offset 0x6ff + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xe9, offset 0x702 + {value: 0x0000, lo: 0x02}, + {value: 0xe105, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0xea, offset 0x705 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0xeb, offset 0x708 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0xbf}, + // Block 0xec, offset 0x70e + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xed, offset 0x714 + {value: 0x0000, lo: 0x08}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa1}, + {value: 0x0018, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xa3}, + {value: 0x3308, lo: 0xa4, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xee, offset 0x71d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xef, offset 0x720 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0xf0, offset 0x723 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xf1, offset 0x726 + {value: 0x0000, lo: 0x07}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xf2, offset 0x72e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xf3, offset 0x733 + {value: 0x0000, lo: 0x08}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0x94}, + {value: 0x0008, lo: 0x95, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xa3}, + {value: 0x0008, lo: 0xa4, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xf4, offset 0x73c + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xf5, offset 0x73f + {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 0xf6, offset 0x744 + {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: 0x3308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xf7, offset 0x74e + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbf}, + // Block 0xf8, offset 0x752 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0xf9, offset 0x756 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xfa, offset 0x759 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xfb, offset 0x75c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xfc, offset 0x760 + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0x2379, lo: 0x9e, hi: 0x9e}, + {value: 0x2381, lo: 0x9f, hi: 0x9f}, + {value: 0x2389, lo: 0xa0, hi: 0xa0}, + {value: 0x2391, lo: 0xa1, hi: 0xa1}, + {value: 0x2399, lo: 0xa2, hi: 0xa2}, + {value: 0x23a1, lo: 0xa3, hi: 0xa3}, + {value: 0x23a9, lo: 0xa4, hi: 0xa4}, + {value: 0x3018, lo: 0xa5, hi: 0xa6}, + {value: 0x3318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x3018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x3318, lo: 0xbb, hi: 0xbf}, + // Block 0xfd, offset 0x76f + {value: 0x0000, lo: 0x0b}, + {value: 0x3318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x3318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x3318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0x23b1, lo: 0xbb, hi: 0xbb}, + {value: 0x23b9, lo: 0xbc, hi: 0xbc}, + {value: 0x23c1, lo: 0xbd, hi: 0xbd}, + {value: 0x23c9, lo: 0xbe, hi: 0xbe}, + {value: 0x23d1, lo: 0xbf, hi: 0xbf}, + // Block 0xfe, offset 0x77b + {value: 0x0000, lo: 0x03}, + {value: 0x23d9, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xff, offset 0x77f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0x100, offset 0x784 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x101, offset 0x789 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x102, offset 0x78e + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0x103, offset 0x792 + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x104, offset 0x797 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x3308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x105, offset 0x7a0 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0x106, offset 0x7a5 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0x107, offset 0x7a9 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x108, offset 0x7af + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0x109, offset 0x7b5 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x3308, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0x10a, offset 0x7ba + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x10b, offset 0x7c0 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x10c, offset 0x7c6 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x10d, offset 0x7d0 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0818, lo: 0x87, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0x10e, offset 0x7d6 + {value: 0x0000, lo: 0x08}, + {value: 0x0a08, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x8a}, + {value: 0x0b08, lo: 0x8b, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x10f, offset 0x7df + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xb0}, + {value: 0x0818, lo: 0xb1, hi: 0xbf}, + // Block 0x110, offset 0x7e2 + {value: 0x0000, lo: 0x02}, + {value: 0x0818, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x111, offset 0x7e5 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0818, lo: 0x81, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x112, offset 0x7e9 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0x113, offset 0x7ed + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x114, offset 0x7f1 + {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 0x115, offset 0x7f7 + {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 0x116, offset 0x7fd + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0x2709, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0x117, offset 0x802 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0x118, offset 0x805 + {value: 0x0000, lo: 0x0f}, + {value: 0x2889, lo: 0x80, hi: 0x80}, + {value: 0x2891, lo: 0x81, hi: 0x81}, + {value: 0x2899, lo: 0x82, hi: 0x82}, + {value: 0x28a1, lo: 0x83, hi: 0x83}, + {value: 0x28a9, lo: 0x84, hi: 0x84}, + {value: 0x28b1, lo: 0x85, hi: 0x85}, + {value: 0x28b9, lo: 0x86, hi: 0x86}, + {value: 0x28c1, lo: 0x87, hi: 0x87}, + {value: 0x28c9, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x28d1, lo: 0x90, hi: 0x90}, + {value: 0x28d9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xbf}, + // Block 0x119, offset 0x815 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x11a, offset 0x81c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x11b, offset 0x820 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x11c, offset 0x827 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x11d, offset 0x82b + {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 0x11e, offset 0x831 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0x11f, offset 0x838 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x120, offset 0x83f + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x121, offset 0x845 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x122, offset 0x84e + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0xbf}, + // Block 0x123, offset 0x852 + {value: 0x0000, lo: 0x0d}, + {value: 0x0018, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0xaf}, + {value: 0x06e1, lo: 0xb0, hi: 0xb0}, + {value: 0x0049, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb2, hi: 0xb2}, + {value: 0x0031, lo: 0xb3, hi: 0xb3}, + {value: 0x06e9, lo: 0xb4, hi: 0xb4}, + {value: 0x06f1, lo: 0xb5, hi: 0xb5}, + {value: 0x06f9, lo: 0xb6, hi: 0xb6}, + {value: 0x0701, lo: 0xb7, hi: 0xb7}, + {value: 0x0709, lo: 0xb8, hi: 0xb8}, + {value: 0x0711, lo: 0xb9, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x124, offset 0x860 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x125, offset 0x863 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x126, offset 0x866 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x127, offset 0x86a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x128, offset 0x86e + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x129, offset 0x871 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbf}, + // Block 0x12a, offset 0x875 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x12b, offset 0x878 + {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 0x12c, offset 0x87d + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0x12d, offset 0x87f + {value: 0x0000, lo: 0x01}, + {value: 0x33c0, lo: 0x80, hi: 0xbf}, + // Block 0x12e, offset 0x881 + {value: 0x0000, lo: 0x02}, + {value: 0x33c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 46723 bytes (45KiB); checksum: 4CF3143A diff --git a/vendor/golang.org/x/net/idna/trie.go b/vendor/golang.org/x/net/idna/trie.go index c4ef847e7a..4212741728 100644 --- a/vendor/golang.org/x/net/idna/trie.go +++ b/vendor/golang.org/x/net/idna/trie.go @@ -6,27 +6,6 @@ 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 { diff --git a/vendor/golang.org/x/net/idna/trie12.0.0.go b/vendor/golang.org/x/net/idna/trie12.0.0.go new file mode 100644 index 0000000000..bb63f904b3 --- /dev/null +++ b/vendor/golang.org/x/net/idna/trie12.0.0.go @@ -0,0 +1,31 @@ +// 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. + +//go:build !go1.16 +// +build !go1.16 + +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 +} diff --git a/vendor/golang.org/x/net/idna/trie13.0.0.go b/vendor/golang.org/x/net/idna/trie13.0.0.go new file mode 100644 index 0000000000..7d68a8dc13 --- /dev/null +++ b/vendor/golang.org/x/net/idna/trie13.0.0.go @@ -0,0 +1,31 @@ +// 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. + +//go:build go1.16 +// +build go1.16 + +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 { + p := index + return append(b, mappings[mappingIndex[p]:mappingIndex[p+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 +} diff --git a/vendor/golang.org/x/net/internal/socks/socks.go b/vendor/golang.org/x/net/internal/socks/socks.go index 97db2340ec..84fcc32b63 100644 --- a/vendor/golang.org/x/net/internal/socks/socks.go +++ b/vendor/golang.org/x/net/internal/socks/socks.go @@ -289,7 +289,7 @@ func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, case AuthMethodNotRequired: return nil case AuthMethodUsernamePassword: - if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) == 0 || len(up.Password) > 255 { + if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) > 255 { return errors.New("invalid username/password") } b := []byte{authUsernamePasswordVersion} diff --git a/vendor/golang.org/x/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md index 1473e1296d..781770c204 100644 --- a/vendor/golang.org/x/oauth2/README.md +++ b/vendor/golang.org/x/oauth2/README.md @@ -19,7 +19,7 @@ See pkg.go.dev for further documentation and examples. * [pkg.go.dev/golang.org/x/oauth2](https://pkg.go.dev/golang.org/x/oauth2) * [pkg.go.dev/golang.org/x/oauth2/google](https://pkg.go.dev/golang.org/x/oauth2/google) -## Policy for new packages +## Policy for new endpoints We no longer accept new provider-specific packages in this repo if all they do is add a single endpoint variable. If you just want to add a @@ -29,8 +29,12 @@ package. ## Report Issues / Send Patches -This repository uses Gerrit for code changes. To learn how to submit changes to -this repository, see https://golang.org/doc/contribute.html. - The main issue tracker for the oauth2 repository is located at https://github.com/golang/oauth2/issues. + +This repository uses Gerrit for code changes. To learn how to submit changes to +this repository, see https://golang.org/doc/contribute.html. In particular: + +* Excluding trivial changes, all contributions should be connected to an existing issue. +* API changes must go through the [change proposal process](https://go.dev/s/proposal-process) before they can be accepted. +* The code owners are listed at [dev.golang.org/owners](https://dev.golang.org/owners#:~:text=x/oauth2). diff --git a/vendor/golang.org/x/oauth2/google/default.go b/vendor/golang.org/x/oauth2/google/default.go index 7ed02cd414..2cf71f0f93 100644 --- a/vendor/golang.org/x/oauth2/google/default.go +++ b/vendor/golang.org/x/oauth2/google/default.go @@ -8,17 +8,19 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "net/http" "os" "path/filepath" "runtime" + "time" "cloud.google.com/go/compute/metadata" "golang.org/x/oauth2" "golang.org/x/oauth2/authhandler" ) +const adcSetupURL = "https://cloud.google.com/docs/authentication/external/set-up-adc" + // Credentials holds Google credentials, including "Application Default Credentials". // For more details, see: // https://developers.google.com/accounts/docs/application-default-credentials @@ -62,6 +64,18 @@ type CredentialsParams struct { // PKCE is used to support PKCE flow. Optional for 3LO flow. PKCE *authhandler.PKCEParams + + // The OAuth2 TokenURL default override. This value overrides the default TokenURL, + // unless explicitly specified by the credentials config file. Optional. + TokenURL string + + // EarlyTokenRefresh is the amount of time before a token expires that a new + // token will be preemptively fetched. If unset the default value is 10 + // seconds. + // + // Note: This option is currently only respected when using credentials + // fetched from the GCE metadata server. + EarlyTokenRefresh time.Duration } func (params CredentialsParams) deepCopy() CredentialsParams { @@ -127,17 +141,15 @@ func FindDefaultCredentialsWithParams(ctx context.Context, params CredentialsPar // Second, try a well-known file. filename := wellKnownFile() - if creds, err := readCredentialsFile(ctx, filename, params); err == nil { - return creds, nil - } else if !os.IsNotExist(err) { - return nil, fmt.Errorf("google: error getting credentials using well-known file (%v): %v", filename, err) + if b, err := os.ReadFile(filename); err == nil { + return CredentialsFromJSONWithParams(ctx, b, params) } // Third, if we're on a Google App Engine standard first generation runtime (<= Go 1.9) // use those credentials. App Engine standard second generation runtimes (>= Go 1.11) // and App Engine flexible use ComputeTokenSource and the metadata server. if appengineTokenFunc != nil { - return &DefaultCredentials{ + return &Credentials{ ProjectID: appengineAppIDFunc(ctx), TokenSource: AppEngineTokenSource(ctx, params.Scopes...), }, nil @@ -147,15 +159,14 @@ func FindDefaultCredentialsWithParams(ctx context.Context, params CredentialsPar // or App Engine flexible, use the metadata server. if metadata.OnGCE() { id, _ := metadata.ProjectID() - return &DefaultCredentials{ + return &Credentials{ ProjectID: id, - TokenSource: ComputeTokenSource("", params.Scopes...), + TokenSource: computeTokenSource("", params.EarlyTokenRefresh, params.Scopes...), }, nil } // None are found; return helpful error. - const url = "https://developers.google.com/accounts/docs/application-default-credentials" - return nil, fmt.Errorf("google: could not find default credentials. See %v for more information.", url) + return nil, fmt.Errorf("google: could not find default credentials. See %v for more information", adcSetupURL) } // FindDefaultCredentials invokes FindDefaultCredentialsWithParams with the specified scopes. @@ -194,7 +205,7 @@ func CredentialsFromJSONWithParams(ctx context.Context, jsonData []byte, params return nil, err } ts = newErrWrappingTokenSource(ts) - return &DefaultCredentials{ + return &Credentials{ ProjectID: f.ProjectID, TokenSource: ts, JSON: jsonData, @@ -216,8 +227,8 @@ func wellKnownFile() string { return filepath.Join(guessUnixHomeDir(), ".config", "gcloud", f) } -func readCredentialsFile(ctx context.Context, filename string, params CredentialsParams) (*DefaultCredentials, error) { - b, err := ioutil.ReadFile(filename) +func readCredentialsFile(ctx context.Context, filename string, params CredentialsParams) (*Credentials, error) { + b, err := os.ReadFile(filename) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/oauth2/google/doc.go b/vendor/golang.org/x/oauth2/google/doc.go index b3e7bc85ce..ca717634a3 100644 --- a/vendor/golang.org/x/oauth2/google/doc.go +++ b/vendor/golang.org/x/oauth2/google/doc.go @@ -26,7 +26,7 @@ // // Using workload identity federation, your application can access Google Cloud // resources from Amazon Web Services (AWS), Microsoft Azure or any identity -// provider that supports OpenID Connect (OIDC). +// provider that supports OpenID Connect (OIDC) or SAML 2.0. // Traditionally, applications running outside Google Cloud have used service // account keys to access Google Cloud resources. Using identity federation, // you can allow your workload to impersonate a service account. @@ -36,26 +36,75 @@ // Follow the detailed instructions on how to configure Workload Identity Federation // in various platforms: // -// Amazon Web Services (AWS): https://cloud.google.com/iam/docs/access-resources-aws -// Microsoft Azure: https://cloud.google.com/iam/docs/access-resources-azure -// OIDC identity provider: https://cloud.google.com/iam/docs/access-resources-oidc +// Amazon Web Services (AWS): https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#aws +// Microsoft Azure: https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#azure +// OIDC identity provider: https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#oidc +// SAML 2.0 identity provider: https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#saml // // For OIDC and SAML providers, the library can retrieve tokens in three ways: // from a local file location (file-sourced credentials), from a server // (URL-sourced credentials), or from a local executable (executable-sourced // credentials). // For file-sourced credentials, a background process needs to be continuously -// refreshing the file location with a new OIDC token prior to expiration. +// refreshing the file location with a new OIDC/SAML token prior to expiration. // For tokens with one hour lifetimes, the token needs to be updated in the file // every hour. The token can be stored directly as plain text or in JSON format. // For URL-sourced credentials, a local server needs to host a GET endpoint to -// return the OIDC token. The response can be in plain text or JSON. +// return the OIDC/SAML token. The response can be in plain text or JSON. // Additional required request headers can also be specified. // For executable-sourced credentials, an application needs to be available to -// output the OIDC token and other information in a JSON format. +// output the OIDC/SAML token and other information in a JSON format. // For more information on how these work (and how to implement // executable-sourced credentials), please check out: -// https://cloud.google.com/iam/docs/using-workload-identity-federation#oidc +// https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#create_a_credential_configuration +// +// Note that this library does not perform any validation on the token_url, token_info_url, +// or service_account_impersonation_url fields of the credential configuration. +// It is not recommended to use a credential configuration that you did not generate with +// the gcloud CLI unless you verify that the URL fields point to a googleapis.com domain. +// +// # Workforce Identity Federation +// +// Workforce identity federation lets you use an external identity provider (IdP) to +// authenticate and authorize a workforce—a group of users, such as employees, partners, +// and contractors—using IAM, so that the users can access Google Cloud services. +// Workforce identity federation extends Google Cloud's identity capabilities to support +// syncless, attribute-based single sign on. +// +// With workforce identity federation, your workforce can access Google Cloud resources +// using an external identity provider (IdP) that supports OpenID Connect (OIDC) or +// SAML 2.0 such as Azure Active Directory (Azure AD), Active Directory Federation +// Services (AD FS), Okta, and others. +// +// Follow the detailed instructions on how to configure Workload Identity Federation +// in various platforms: +// +// Azure AD: https://cloud.google.com/iam/docs/workforce-sign-in-azure-ad +// Okta: https://cloud.google.com/iam/docs/workforce-sign-in-okta +// OIDC identity provider: https://cloud.google.com/iam/docs/configuring-workforce-identity-federation#oidc +// SAML 2.0 identity provider: https://cloud.google.com/iam/docs/configuring-workforce-identity-federation#saml +// +// For workforce identity federation, the library can retrieve tokens in three ways: +// from a local file location (file-sourced credentials), from a server +// (URL-sourced credentials), or from a local executable (executable-sourced +// credentials). +// For file-sourced credentials, a background process needs to be continuously +// refreshing the file location with a new OIDC/SAML token prior to expiration. +// For tokens with one hour lifetimes, the token needs to be updated in the file +// every hour. The token can be stored directly as plain text or in JSON format. +// For URL-sourced credentials, a local server needs to host a GET endpoint to +// return the OIDC/SAML token. The response can be in plain text or JSON. +// Additional required request headers can also be specified. +// For executable-sourced credentials, an application needs to be available to +// output the OIDC/SAML token and other information in a JSON format. +// For more information on how these work (and how to implement +// executable-sourced credentials), please check out: +// https://cloud.google.com/iam/docs/workforce-obtaining-short-lived-credentials#generate_a_configuration_file_for_non-interactive_sign-in +// +// Note that this library does not perform any validation on the token_url, token_info_url, +// or service_account_impersonation_url fields of the credential configuration. +// It is not recommended to use a credential configuration that you did not generate with +// the gcloud CLI unless you verify that the URL fields point to a googleapis.com domain. // // # Credentials // diff --git a/vendor/golang.org/x/oauth2/google/google.go b/vendor/golang.org/x/oauth2/google/google.go index 8df0c493ee..cc1223889e 100644 --- a/vendor/golang.org/x/oauth2/google/google.go +++ b/vendor/golang.org/x/oauth2/google/google.go @@ -26,6 +26,9 @@ var Endpoint = oauth2.Endpoint{ AuthStyle: oauth2.AuthStyleInParams, } +// MTLSTokenURL is Google's OAuth 2.0 default mTLS endpoint. +const MTLSTokenURL = "https://oauth2.mtls.googleapis.com/token" + // JWTTokenURL is Google's OAuth 2.0 token URL to use with the JWT flow. const JWTTokenURL = "https://oauth2.googleapis.com/token" @@ -172,7 +175,11 @@ func (f *credentialsFile) tokenSource(ctx context.Context, params CredentialsPar cfg.Endpoint.AuthURL = Endpoint.AuthURL } if cfg.Endpoint.TokenURL == "" { - cfg.Endpoint.TokenURL = Endpoint.TokenURL + if params.TokenURL != "" { + cfg.Endpoint.TokenURL = params.TokenURL + } else { + cfg.Endpoint.TokenURL = Endpoint.TokenURL + } } tok := &oauth2.Token{RefreshToken: f.RefreshToken} return cfg.TokenSource(ctx, tok), nil @@ -224,7 +231,11 @@ func (f *credentialsFile) tokenSource(ctx context.Context, params CredentialsPar // Further information about retrieving access tokens from the GCE metadata // server can be found at https://cloud.google.com/compute/docs/authentication. func ComputeTokenSource(account string, scope ...string) oauth2.TokenSource { - return oauth2.ReuseTokenSource(nil, computeSource{account: account, scopes: scope}) + return computeTokenSource(account, 0, scope...) +} + +func computeTokenSource(account string, earlyExpiry time.Duration, scope ...string) oauth2.TokenSource { + return oauth2.ReuseTokenSourceWithExpiry(nil, computeSource{account: account, scopes: scope}, earlyExpiry) } type computeSource struct { diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go index 3eab8df7ce..dcd252a61c 100644 --- a/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go @@ -67,22 +67,6 @@ type Config struct { // that include all elements in a given list, in that order. var ( - validTokenURLPatterns = []*regexp.Regexp{ - // The complicated part in the middle matches any number of characters that - // aren't period, spaces, or slashes. - regexp.MustCompile(`(?i)^[^\.\s\/\\]+\.sts\.googleapis\.com$`), - regexp.MustCompile(`(?i)^sts\.googleapis\.com$`), - regexp.MustCompile(`(?i)^sts\.[^\.\s\/\\]+\.googleapis\.com$`), - regexp.MustCompile(`(?i)^[^\.\s\/\\]+-sts\.googleapis\.com$`), - regexp.MustCompile(`(?i)^sts-[^\.\s\/\\]+\.p\.googleapis\.com$`), - } - validImpersonateURLPatterns = []*regexp.Regexp{ - regexp.MustCompile(`^[^\.\s\/\\]+\.iamcredentials\.googleapis\.com$`), - regexp.MustCompile(`^iamcredentials\.googleapis\.com$`), - regexp.MustCompile(`^iamcredentials\.[^\.\s\/\\]+\.googleapis\.com$`), - regexp.MustCompile(`^[^\.\s\/\\]+-iamcredentials\.googleapis\.com$`), - regexp.MustCompile(`^iamcredentials-[^\.\s\/\\]+\.p\.googleapis\.com$`), - } validWorkforceAudiencePattern *regexp.Regexp = regexp.MustCompile(`//iam\.googleapis\.com/locations/[^/]+/workforcePools/`) ) @@ -110,25 +94,13 @@ func validateWorkforceAudience(input string) bool { // TokenSource Returns an external account TokenSource struct. This is to be called by package google to construct a google.Credentials. func (c *Config) TokenSource(ctx context.Context) (oauth2.TokenSource, error) { - return c.tokenSource(ctx, validTokenURLPatterns, validImpersonateURLPatterns, "https") + return c.tokenSource(ctx, "https") } // tokenSource is a private function that's directly called by some of the tests, // because the unit test URLs are mocked, and would otherwise fail the // validity check. -func (c *Config) tokenSource(ctx context.Context, tokenURLValidPats []*regexp.Regexp, impersonateURLValidPats []*regexp.Regexp, scheme string) (oauth2.TokenSource, error) { - valid := validateURL(c.TokenURL, tokenURLValidPats, scheme) - if !valid { - return nil, fmt.Errorf("oauth2/google: invalid TokenURL provided while constructing tokenSource") - } - - if c.ServiceAccountImpersonationURL != "" { - valid := validateURL(c.ServiceAccountImpersonationURL, impersonateURLValidPats, scheme) - if !valid { - return nil, fmt.Errorf("oauth2/google: invalid ServiceAccountImpersonationURL provided while constructing tokenSource") - } - } - +func (c *Config) tokenSource(ctx context.Context, scheme string) (oauth2.TokenSource, error) { if c.WorkforcePoolUserProject != "" { valid := validateWorkforceAudience(c.Audience) if !valid { diff --git a/vendor/golang.org/x/oauth2/internal/oauth2.go b/vendor/golang.org/x/oauth2/internal/oauth2.go index c0ab196cf4..14989beaf4 100644 --- a/vendor/golang.org/x/oauth2/internal/oauth2.go +++ b/vendor/golang.org/x/oauth2/internal/oauth2.go @@ -14,7 +14,7 @@ import ( // ParseKey converts the binary contents of a private key file // to an *rsa.PrivateKey. It detects whether the private key is in a -// PEM container or not. If so, it extracts the the private key +// PEM container or not. If so, it extracts the private key // from PEM container before conversion. It only supports PEM // containers with no passphrase. func ParseKey(key []byte) (*rsa.PrivateKey, error) { diff --git a/vendor/golang.org/x/oauth2/internal/token.go b/vendor/golang.org/x/oauth2/internal/token.go index b4723fcace..58901bda53 100644 --- a/vendor/golang.org/x/oauth2/internal/token.go +++ b/vendor/golang.org/x/oauth2/internal/token.go @@ -55,12 +55,18 @@ type Token struct { } // tokenJSON is the struct representing the HTTP response from OAuth2 -// providers returning a token in JSON form. +// providers returning a token or error in JSON form. +// https://datatracker.ietf.org/doc/html/rfc6749#section-5.1 type tokenJSON struct { AccessToken string `json:"access_token"` TokenType string `json:"token_type"` RefreshToken string `json:"refresh_token"` ExpiresIn expirationTime `json:"expires_in"` // at least PayPal returns string, while most return number + // error fields + // https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 + ErrorCode string `json:"error"` + ErrorDescription string `json:"error_description"` + ErrorURI string `json:"error_uri"` } func (e *tokenJSON) expiry() (t time.Time) { @@ -236,21 +242,29 @@ func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) { if err != nil { return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) } - if code := r.StatusCode; code < 200 || code > 299 { - return nil, &RetrieveError{ - Response: r, - Body: body, - } + + failureStatus := r.StatusCode < 200 || r.StatusCode > 299 + retrieveError := &RetrieveError{ + Response: r, + Body: body, + // attempt to populate error detail below } var token *Token content, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type")) switch content { case "application/x-www-form-urlencoded", "text/plain": + // some endpoints return a query string vals, err := url.ParseQuery(string(body)) if err != nil { - return nil, err + if failureStatus { + return nil, retrieveError + } + return nil, fmt.Errorf("oauth2: cannot parse response: %v", err) } + retrieveError.ErrorCode = vals.Get("error") + retrieveError.ErrorDescription = vals.Get("error_description") + retrieveError.ErrorURI = vals.Get("error_uri") token = &Token{ AccessToken: vals.Get("access_token"), TokenType: vals.Get("token_type"), @@ -265,8 +279,14 @@ func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) { default: var tj tokenJSON if err = json.Unmarshal(body, &tj); err != nil { - return nil, err + if failureStatus { + return nil, retrieveError + } + return nil, fmt.Errorf("oauth2: cannot parse json: %v", err) } + retrieveError.ErrorCode = tj.ErrorCode + retrieveError.ErrorDescription = tj.ErrorDescription + retrieveError.ErrorURI = tj.ErrorURI token = &Token{ AccessToken: tj.AccessToken, TokenType: tj.TokenType, @@ -276,17 +296,37 @@ func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) { } json.Unmarshal(body, &token.Raw) // no error checks for optional fields } + // according to spec, servers should respond status 400 in error case + // https://www.rfc-editor.org/rfc/rfc6749#section-5.2 + // but some unorthodox servers respond 200 in error case + if failureStatus || retrieveError.ErrorCode != "" { + return nil, retrieveError + } if token.AccessToken == "" { return nil, errors.New("oauth2: server response missing access_token") } return token, nil } +// mirrors oauth2.RetrieveError type RetrieveError struct { - Response *http.Response - Body []byte + Response *http.Response + Body []byte + ErrorCode string + ErrorDescription string + ErrorURI string } func (r *RetrieveError) Error() string { + if r.ErrorCode != "" { + s := fmt.Sprintf("oauth2: %q", r.ErrorCode) + if r.ErrorDescription != "" { + s += fmt.Sprintf(" %q", r.ErrorDescription) + } + if r.ErrorURI != "" { + s += fmt.Sprintf(" %q", r.ErrorURI) + } + return s + } return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) } diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go index 291df5c833..9085fabe34 100644 --- a/vendor/golang.org/x/oauth2/oauth2.go +++ b/vendor/golang.org/x/oauth2/oauth2.go @@ -16,6 +16,7 @@ import ( "net/url" "strings" "sync" + "time" "golang.org/x/oauth2/internal" ) @@ -140,7 +141,7 @@ func SetAuthURLParam(key, value string) AuthCodeOption { // // State is a token to protect the user from CSRF attacks. You must // always provide a non-empty string and validate that it matches the -// the state query parameter on your redirect callback. +// state query parameter on your redirect callback. // See http://tools.ietf.org/html/rfc6749#section-10.12 for more info. // // Opts may include AccessTypeOnline or AccessTypeOffline, as well @@ -290,6 +291,8 @@ type reuseTokenSource struct { mu sync.Mutex // guards t t *Token + + expiryDelta time.Duration } // Token returns the current token if it's still valid, else will @@ -305,6 +308,7 @@ func (s *reuseTokenSource) Token() (*Token, error) { if err != nil { return nil, err } + t.expiryDelta = s.expiryDelta s.t = t return t, nil } @@ -379,3 +383,30 @@ func ReuseTokenSource(t *Token, src TokenSource) TokenSource { new: src, } } + +// ReuseTokenSource returns a TokenSource that acts in the same manner as the +// TokenSource returned by ReuseTokenSource, except the expiry buffer is +// configurable. The expiration time of a token is calculated as +// t.Expiry.Add(-earlyExpiry). +func ReuseTokenSourceWithExpiry(t *Token, src TokenSource, earlyExpiry time.Duration) TokenSource { + // Don't wrap a reuseTokenSource in itself. That would work, + // but cause an unnecessary number of mutex operations. + // Just build the equivalent one. + if rt, ok := src.(*reuseTokenSource); ok { + if t == nil { + // Just use it directly, but set the expiryDelta to earlyExpiry, + // so the behavior matches what the user expects. + rt.expiryDelta = earlyExpiry + return rt + } + src = rt.new + } + if t != nil { + t.expiryDelta = earlyExpiry + } + return &reuseTokenSource{ + t: t, + new: src, + expiryDelta: earlyExpiry, + } +} diff --git a/vendor/golang.org/x/oauth2/token.go b/vendor/golang.org/x/oauth2/token.go index 822720341a..5ffce9764b 100644 --- a/vendor/golang.org/x/oauth2/token.go +++ b/vendor/golang.org/x/oauth2/token.go @@ -16,10 +16,10 @@ import ( "golang.org/x/oauth2/internal" ) -// expiryDelta determines how earlier a token should be considered +// defaultExpiryDelta determines how earlier a token should be considered // expired than its actual expiration time. It is used to avoid late // expirations due to client-server time mismatches. -const expiryDelta = 10 * time.Second +const defaultExpiryDelta = 10 * time.Second // Token represents the credentials used to authorize // the requests to access protected resources on the OAuth 2.0 @@ -52,6 +52,11 @@ type Token struct { // raw optionally contains extra metadata from the server // when updating a token. raw interface{} + + // expiryDelta is used to calculate when a token is considered + // expired, by subtracting from Expiry. If zero, defaultExpiryDelta + // is used. + expiryDelta time.Duration } // Type returns t.TokenType if non-empty, else "Bearer". @@ -127,6 +132,11 @@ func (t *Token) expired() bool { if t.Expiry.IsZero() { return false } + + expiryDelta := defaultExpiryDelta + if t.expiryDelta != 0 { + expiryDelta = t.expiryDelta + } return t.Expiry.Round(0).Add(-expiryDelta).Before(timeNow()) } @@ -165,14 +175,31 @@ func retrieveToken(ctx context.Context, c *Config, v url.Values) (*Token, error) } // RetrieveError is the error returned when the token endpoint returns a -// non-2XX HTTP status code. +// non-2XX HTTP status code or populates RFC 6749's 'error' parameter. +// https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 type RetrieveError struct { Response *http.Response // Body is the body that was consumed by reading Response.Body. // It may be truncated. Body []byte + // ErrorCode is RFC 6749's 'error' parameter. + ErrorCode string + // ErrorDescription is RFC 6749's 'error_description' parameter. + ErrorDescription string + // ErrorURI is RFC 6749's 'error_uri' parameter. + ErrorURI string } func (r *RetrieveError) Error() string { + if r.ErrorCode != "" { + s := fmt.Sprintf("oauth2: %q", r.ErrorCode) + if r.ErrorDescription != "" { + s += fmt.Sprintf(" %q", r.ErrorDescription) + } + if r.ErrorURI != "" { + s += fmt.Sprintf(" %q", r.ErrorURI) + } + return s + } return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) } diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go index cbee7a4e23..b18efb743f 100644 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ b/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -20,7 +20,7 @@ type token struct{} // A zero Group is valid, has no limit on the number of active goroutines, // and does not cancel on error. type Group struct { - cancel func() + cancel func(error) wg sync.WaitGroup @@ -43,7 +43,7 @@ func (g *Group) done() { // returns a non-nil error or the first time Wait returns, whichever occurs // first. func WithContext(ctx context.Context) (*Group, context.Context) { - ctx, cancel := context.WithCancel(ctx) + ctx, cancel := withCancelCause(ctx) return &Group{cancel: cancel}, ctx } @@ -52,7 +52,7 @@ func WithContext(ctx context.Context) (*Group, context.Context) { func (g *Group) Wait() error { g.wg.Wait() if g.cancel != nil { - g.cancel() + g.cancel(g.err) } return g.err } @@ -76,7 +76,7 @@ func (g *Group) Go(f func() error) { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } @@ -105,7 +105,7 @@ func (g *Group) TryGo(f func() error) bool { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } diff --git a/vendor/golang.org/x/sync/errgroup/go120.go b/vendor/golang.org/x/sync/errgroup/go120.go new file mode 100644 index 0000000000..7d419d3760 --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/go120.go @@ -0,0 +1,14 @@ +// Copyright 2023 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:build go1.20 +// +build go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + return context.WithCancelCause(parent) +} diff --git a/vendor/golang.org/x/sync/errgroup/pre_go120.go b/vendor/golang.org/x/sync/errgroup/pre_go120.go new file mode 100644 index 0000000000..1795c18ace --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/pre_go120.go @@ -0,0 +1,15 @@ +// Copyright 2023 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:build !go1.20 +// +build !go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + ctx, cancel := context.WithCancel(parent) + return ctx, func(error) { cancel() } +} diff --git a/vendor/golang.org/x/sys/cpu/endian_little.go b/vendor/golang.org/x/sys/cpu/endian_little.go index fe545966b6..55db853efb 100644 --- a/vendor/golang.org/x/sys/cpu/endian_little.go +++ b/vendor/golang.org/x/sys/cpu/endian_little.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh -// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh +//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh || wasm +// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh wasm package cpu diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go deleted file mode 100644 index 7ce8dd406f..0000000000 --- a/vendor/golang.org/x/sys/unix/ioctl.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2018 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:build aix || darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris - -package unix - -import ( - "unsafe" -) - -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. - -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -// IoctlSetPointerInt performs an ioctl operation which sets an -// integer value on fd, using the specified request number. The ioctl -// argument is called with a pointer to the integer value, rather than -// passing the integer value directly. -func IoctlSetPointerInt(fd int, req uint, value int) error { - v := int32(value) - return ioctlPtr(fd, req, unsafe.Pointer(&v)) -} - -// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. -// -// To change fd's window size, the req argument should be TIOCSWINSZ. -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { - // TODO: if we get the chance, remove the req parameter and - // hardcode TIOCSWINSZ. - return ioctlPtr(fd, req, unsafe.Pointer(value)) -} - -// IoctlSetTermios performs an ioctl on fd with a *Termios. -// -// The req value will usually be TCSETA or TIOCSETA. -func IoctlSetTermios(fd int, req uint, value *Termios) error { - // TODO: if we get the chance, remove the req parameter. - return ioctlPtr(fd, req, unsafe.Pointer(value)) -} - -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -// -// A few ioctl requests use the return value as an output parameter; -// for those, IoctlRetInt should be used instead of this function. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctlPtr(fd, req, unsafe.Pointer(&value)) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctlPtr(fd, req, unsafe.Pointer(&value)) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctlPtr(fd, req, unsafe.Pointer(&value)) - return &value, err -} diff --git a/vendor/golang.org/x/sys/unix/ioctl_signed.go b/vendor/golang.org/x/sys/unix/ioctl_signed.go new file mode 100644 index 0000000000..7def9580e6 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ioctl_signed.go @@ -0,0 +1,70 @@ +// Copyright 2018 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:build aix || solaris +// +build aix solaris + +package unix + +import ( + "unsafe" +) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req int, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +// IoctlSetPointerInt performs an ioctl operation which sets an +// integer value on fd, using the specified request number. The ioctl +// argument is called with a pointer to the integer value, rather than +// passing the integer value directly. +func IoctlSetPointerInt(fd int, req int, value int) error { + v := int32(value) + return ioctlPtr(fd, req, unsafe.Pointer(&v)) +} + +// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. +// +// To change fd's window size, the req argument should be TIOCSWINSZ. +func IoctlSetWinsize(fd int, req int, value *Winsize) error { + // TODO: if we get the chance, remove the req parameter and + // hardcode TIOCSWINSZ. + return ioctlPtr(fd, req, unsafe.Pointer(value)) +} + +// IoctlSetTermios performs an ioctl on fd with a *Termios. +// +// The req value will usually be TCSETA or TIOCSETA. +func IoctlSetTermios(fd int, req int, value *Termios) error { + // TODO: if we get the chance, remove the req parameter. + return ioctlPtr(fd, req, unsafe.Pointer(value)) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +// +// A few ioctl requests use the return value as an output parameter; +// for those, IoctlRetInt should be used instead of this function. +func IoctlGetInt(fd int, req int) (int, error) { + var value int + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return value, err +} + +func IoctlGetWinsize(fd int, req int) (*Winsize, error) { + var value Winsize + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return &value, err +} + +func IoctlGetTermios(fd int, req int) (*Termios, error) { + var value Termios + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return &value, err +} diff --git a/vendor/golang.org/x/sys/unix/ioctl_unsigned.go b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go new file mode 100644 index 0000000000..649913d1ea --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go @@ -0,0 +1,70 @@ +// Copyright 2018 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:build darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd +// +build darwin dragonfly freebsd hurd linux netbsd openbsd + +package unix + +import ( + "unsafe" +) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +// IoctlSetPointerInt performs an ioctl operation which sets an +// integer value on fd, using the specified request number. The ioctl +// argument is called with a pointer to the integer value, rather than +// passing the integer value directly. +func IoctlSetPointerInt(fd int, req uint, value int) error { + v := int32(value) + return ioctlPtr(fd, req, unsafe.Pointer(&v)) +} + +// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. +// +// To change fd's window size, the req argument should be TIOCSWINSZ. +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + // TODO: if we get the chance, remove the req parameter and + // hardcode TIOCSWINSZ. + return ioctlPtr(fd, req, unsafe.Pointer(value)) +} + +// IoctlSetTermios performs an ioctl on fd with a *Termios. +// +// The req value will usually be TCSETA or TIOCSETA. +func IoctlSetTermios(fd int, req uint, value *Termios) error { + // TODO: if we get the chance, remove the req parameter. + return ioctlPtr(fd, req, unsafe.Pointer(value)) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +// +// A few ioctl requests use the return value as an output parameter; +// for those, IoctlRetInt should be used instead of this function. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return &value, err +} diff --git a/vendor/golang.org/x/sys/unix/ioctl_zos.go b/vendor/golang.org/x/sys/unix/ioctl_zos.go index 6532f09af2..cdc21bf76d 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_zos.go +++ b/vendor/golang.org/x/sys/unix/ioctl_zos.go @@ -17,14 +17,14 @@ import ( // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { +func IoctlSetInt(fd int, req int, value int) error { return ioctl(fd, req, uintptr(value)) } // IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. // // To change fd's window size, the req argument should be TIOCSWINSZ. -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func IoctlSetWinsize(fd int, req int, value *Winsize) error { // TODO: if we get the chance, remove the req parameter and // hardcode TIOCSWINSZ. return ioctlPtr(fd, req, unsafe.Pointer(value)) @@ -33,7 +33,7 @@ func IoctlSetWinsize(fd int, req uint, value *Winsize) error { // IoctlSetTermios performs an ioctl on fd with a *Termios. // // The req value is expected to be TCSETS, TCSETSW, or TCSETSF -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func IoctlSetTermios(fd int, req int, value *Termios) error { if (req != TCSETS) && (req != TCSETSW) && (req != TCSETSF) { return ENOSYS } @@ -47,13 +47,13 @@ func IoctlSetTermios(fd int, req uint, value *Termios) error { // // A few ioctl requests use the return value as an output parameter; // for those, IoctlRetInt should be used instead of this function. -func IoctlGetInt(fd int, req uint) (int, error) { +func IoctlGetInt(fd int, req int) (int, error) { var value int err := ioctlPtr(fd, req, unsafe.Pointer(&value)) return value, err } -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { +func IoctlGetWinsize(fd int, req int) (*Winsize, error) { var value Winsize err := ioctlPtr(fd, req, unsafe.Pointer(&value)) return &value, err @@ -62,7 +62,7 @@ func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { // IoctlGetTermios performs an ioctl on fd with a *Termios. // // The req value is expected to be TCGETS -func IoctlGetTermios(fd int, req uint) (*Termios, error) { +func IoctlGetTermios(fd int, req int) (*Termios, error) { var value Termios if req != TCGETS { return &value, ENOSYS diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index 8e3947c368..e6f31d374d 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -50,7 +50,7 @@ if [[ "$GOOS" = "linux" ]]; then # Use the Docker-based build system # Files generated through docker (use $cmd so you can Ctl-C the build or run) $cmd docker build --tag generate:$GOOS $GOOS - $cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && /bin/pwd):/build generate:$GOOS + $cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS exit fi diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 7456d9ddde..0c4d14929a 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -66,6 +66,7 @@ includes_Darwin=' #include <sys/ptrace.h> #include <sys/select.h> #include <sys/socket.h> +#include <sys/stat.h> #include <sys/un.h> #include <sys/sockio.h> #include <sys/sys_domain.h> @@ -203,6 +204,7 @@ struct ltchars { #include <sys/timerfd.h> #include <sys/uio.h> #include <sys/xattr.h> +#include <netinet/udp.h> #include <linux/audit.h> #include <linux/bpf.h> #include <linux/can.h> @@ -517,10 +519,11 @@ ccflags="$@" $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || $2 ~ /^NFC_.*_(MAX)?SIZE$/ || $2 ~ /^RAW_PAYLOAD_/ || + $2 ~ /^[US]F_/ || $2 ~ /^TP_STATUS_/ || $2 ~ /^FALLOC_/ || $2 ~ /^ICMPV?6?_(FILTER|SEC)/ || @@ -738,7 +741,8 @@ main(void) e = errors[i].num; if(i > 0 && errors[i-1].num == e) continue; - strcpy(buf, strerror(e)); + strncpy(buf, strerror(e), sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; // lowercase first letter: Bad -> bad, but STREAM -> STREAM. if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) buf[0] += a - A; @@ -757,7 +761,8 @@ main(void) e = signals[i].num; if(i > 0 && signals[i-1].num == e) continue; - strcpy(buf, strsignal(e)); + strncpy(buf, strsignal(e), sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; // lowercase first letter: Bad -> bad, but STREAM -> STREAM. if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) buf[0] += a - A; diff --git a/vendor/golang.org/x/sys/unix/mremap.go b/vendor/golang.org/x/sys/unix/mremap.go new file mode 100644 index 0000000000..86213c05d6 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mremap.go @@ -0,0 +1,40 @@ +// Copyright 2023 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:build linux +// +build linux + +package unix + +import "unsafe" + +type mremapMmapper struct { + mmapper + mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) +} + +func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&MREMAP_FIXED != 0 { + return nil, EINVAL + } + + pOld := &oldData[cap(oldData)-1] + m.Lock() + defer m.Unlock() + bOld := m.active[pOld] + if bOld == nil || &bOld[0] != &oldData[0] { + return nil, EINVAL + } + newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0) + if errno != nil { + return nil, errno + } + bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength) + pNew := &bNew[cap(bNew)-1] + if flags&MREMAP_DONTUNMAP == 0 { + delete(m.active, pOld) + } + m.active[pNew] = bNew + return bNew, nil +} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index d9f5544ccf..c406ae00f4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -408,8 +408,8 @@ func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 } func (w WaitStatus) TrapCause() int { return -1 } -//sys ioctl(fd int, req uint, arg uintptr) (err error) -//sys ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = ioctl +//sys ioctl(fd int, req int, arg uintptr) (err error) +//sys ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = ioctl // fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX // There is no way to create a custom fcntl and to keep //sys fcntl easily, diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go index e92a0be163..f2871fa953 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go @@ -8,7 +8,6 @@ package unix //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = getrlimit64 -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) = setrlimit64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek64 //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go index 16eed17098..75718ec0f1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go @@ -8,7 +8,6 @@ package unix //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) = mmap64 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 7064d6ebab..206921504c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -613,6 +613,7 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) //sys Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) @@ -622,7 +623,6 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys Setprivexec(flag int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) @@ -676,7 +676,6 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { // Kqueue_from_portset_np // Kqueue_portset // Getattrlist -// Setattrlist // Getdirentriesattr // Searchfs // Delete diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 221efc26bc..d4ce988e72 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -326,7 +326,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 5bdde03e4a..afb10106f6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -433,7 +433,6 @@ func Dup3(oldfd, newfd, flags int) error { //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 9735331530..39de5f1430 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -1699,12 +1699,23 @@ func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) { return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data) } +// elfNT_PRSTATUS is a copy of the debug/elf.NT_PRSTATUS constant so +// x/sys/unix doesn't need to depend on debug/elf and thus +// compress/zlib, debug/dwarf, and other packages. +const elfNT_PRSTATUS = 1 + func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { - return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout)) + var iov Iovec + iov.Base = (*byte)(unsafe.Pointer(regsout)) + iov.SetLen(int(unsafe.Sizeof(*regsout))) + return ptracePtr(PTRACE_GETREGSET, pid, uintptr(elfNT_PRSTATUS), unsafe.Pointer(&iov)) } func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) { - return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs)) + var iov Iovec + iov.Base = (*byte)(unsafe.Pointer(regs)) + iov.SetLen(int(unsafe.Sizeof(*regs))) + return ptracePtr(PTRACE_SETREGSET, pid, uintptr(elfNT_PRSTATUS), unsafe.Pointer(&iov)) } func PtraceSetOptions(pid int, options int) (err error) { @@ -1873,7 +1884,6 @@ func Getpgrp() (pid int) { //sys OpenTree(dfd int, fileName string, flags uint) (r int, err error) //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT -//sysnb Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 //sys read(fd int, p []byte) (n int, err error) @@ -1887,6 +1897,15 @@ func Getpgrp() (pid int) { //sysnb Settimeofday(tv *Timeval) (err error) //sys Setns(fd int, nstype int) (err error) +//go:linkname syscall_prlimit syscall.prlimit +func syscall_prlimit(pid, resource int, newlimit, old *syscall.Rlimit) error + +func Prlimit(pid, resource int, newlimit, old *Rlimit) error { + // Just call the syscall version, because as of Go 1.21 + // it will affect starting a new process. + return syscall_prlimit(pid, resource, (*syscall.Rlimit)(newlimit), (*syscall.Rlimit)(old)) +} + // PrctlRetInt performs a prctl operation specified by option and further // optional arguments arg2 through arg5 depending on option. It returns a // non-negative integer that is returned by the prctl syscall. @@ -2105,11 +2124,15 @@ func writevRacedetect(iovecs []Iovec, n int) { // mmap varies by architecture; see syscall_linux_*.go. //sys munmap(addr uintptr, length uintptr) (err error) +//sys mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, +var mapper = &mremapMmapper{ + mmapper: mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, + }, + mremap: mremap, } func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { @@ -2120,6 +2143,10 @@ func Munmap(b []byte) (err error) { return mapper.Munmap(b) } +func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + return mapper.Mremap(oldData, newLength, flags) +} + //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) @@ -2412,6 +2439,21 @@ func PthreadSigmask(how int, set, oldset *Sigset_t) error { return rtSigprocmask(how, set, oldset, _C__NSIG/8) } +//sysnb getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) +//sysnb getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) + +func Getresuid() (ruid, euid, suid int) { + var r, e, s _C_int + getresuid(&r, &e, &s) + return int(r), int(e), int(s) +} + +func Getresgid() (rgid, egid, sgid int) { + var r, e, s _C_int + getresgid(&r, &e, &s) + return int(r), int(e), int(s) +} + /* * Unimplemented */ @@ -2453,7 +2495,6 @@ func PthreadSigmask(how int, set, oldset *Sigset_t) error { // MqTimedreceive // MqTimedsend // MqUnlink -// Mremap // Msgctl // Msgget // Msgrcv diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index ff5b5899d6..c7d9945ea1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -97,33 +97,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { newoffset, errno := seek(fd, offset, whence) if errno != 0 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 9b27035329..5b21fcfd75 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -46,7 +46,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 856ad1d635..da2986415a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -171,33 +171,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 6422704bc5..a81f5742b8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -39,7 +39,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) @@ -143,15 +142,6 @@ func Getrlimit(resource int, rlim *Rlimit) error { return getrlimit(resource, rlim) } -// Setrlimit prefers the prlimit64 system call. See issue 38604. -func Setrlimit(resource int, rlim *Rlimit) error { - err := Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - return setrlimit(resource, rlim) -} - func (r *PtraceRegs) PC() uint64 { return r.Pc } func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 59dab510e9..69d2d7c3db 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -126,11 +126,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - return -} - func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) { if tv == nil { return utimensat(dirfd, path, nil, 0) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index bfef09a39e..76d564095e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -37,7 +37,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Statfs(path string, buf *Statfs_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index ab30250966..aae7f0ffd3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -151,33 +151,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func (r *PtraceRegs) PC() uint64 { return r.Epc } func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index eac1cf1acc..66eff19a32 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -159,33 +159,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func (r *PtraceRegs) PC() uint32 { return r.Nip } func (r *PtraceRegs) SetPC(pc uint32) { r.Nip = pc } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 4df56616b8..806aa2574d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -34,7 +34,6 @@ package unix //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 5f4243dea2..35851ef70b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -38,7 +38,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index d0a7d40668..2f89e8f5de 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -34,7 +34,6 @@ import ( //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, buf *Statfs_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index f5c793be26..7ca064ae76 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -31,7 +31,6 @@ package unix //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index e66865dccb..018d7d4782 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -340,7 +340,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) @@ -501,7 +500,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { // compat_43_osendmsg // compat_43_osethostid // compat_43_osethostname -// compat_43_osetrlimit // compat_43_osigblock // compat_43_osigsetmask // compat_43_osigstack diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 5e9de23ae3..c5f166a115 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -151,6 +151,21 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { return } +//sysnb getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) +//sysnb getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) + +func Getresuid() (ruid, euid, suid int) { + var r, e, s _C_int + getresuid(&r, &e, &s) + return int(r), int(e), int(s) +} + +func Getresgid() (rgid, egid, sgid int) { + var r, e, s _C_int + getresgid(&r, &e, &s) + return int(r), int(e), int(s) +} + //sys ioctl(fd int, req uint, arg uintptr) (err error) //sys ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL @@ -294,7 +309,6 @@ func Uname(uname *Utsname) error { //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setrtable(rtable int) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) @@ -339,8 +353,6 @@ func Uname(uname *Utsname) error { // getgid // getitimer // getlogin -// getresgid -// getresuid // getthrid // ktrace // lfs_bmapv diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index d3444b64d6..b600a289d3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -545,24 +545,24 @@ func Minor(dev uint64) uint32 { * Expose the ioctl function */ -//sys ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) = libc.ioctl -//sys ioctlPtrRet(fd int, req uint, arg unsafe.Pointer) (ret int, err error) = libc.ioctl +//sys ioctlRet(fd int, req int, arg uintptr) (ret int, err error) = libc.ioctl +//sys ioctlPtrRet(fd int, req int, arg unsafe.Pointer) (ret int, err error) = libc.ioctl -func ioctl(fd int, req uint, arg uintptr) (err error) { +func ioctl(fd int, req int, arg uintptr) (err error) { _, err = ioctlRet(fd, req, arg) return err } -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { _, err = ioctlPtrRet(fd, req, arg) return err } -func IoctlSetTermio(fd int, req uint, value *Termio) error { +func IoctlSetTermio(fd int, req int, value *Termio) error { return ioctlPtr(fd, req, unsafe.Pointer(value)) } -func IoctlGetTermio(fd int, req uint) (*Termio, error) { +func IoctlGetTermio(fd int, req int) (*Termio, error) { var value Termio err := ioctlPtr(fd, req, unsafe.Pointer(&value)) return &value, err @@ -665,7 +665,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Setuid(uid int) (err error) //sys Shutdown(s int, how int) (err error) = libsocket.shutdown @@ -1080,11 +1079,11 @@ func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags return retCl, retData, flags, nil } -func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) { +func IoctlSetIntRetInt(fd int, req int, arg int) (int, error) { return ioctlRet(fd, req, uintptr(arg)) } -func IoctlSetString(fd int, req uint, val string) error { +func IoctlSetString(fd int, req int, val string) error { bs := make([]byte, len(val)+1) copy(bs[:len(bs)-1], val) err := ioctlPtr(fd, req, unsafe.Pointer(&bs[0])) @@ -1120,7 +1119,7 @@ func (l *Lifreq) GetLifruUint() uint { return *(*uint)(unsafe.Pointer(&l.Lifru[0])) } -func IoctlLifreq(fd int, req uint, l *Lifreq) error { +func IoctlLifreq(fd int, req int, l *Lifreq) error { return ioctlPtr(fd, req, unsafe.Pointer(l)) } @@ -1131,6 +1130,6 @@ func (s *Strioctl) SetInt(i int) { s.Dp = (*int8)(unsafe.Pointer(&i)) } -func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) { +func IoctlSetStrioctlRetInt(fd int, req int, s *Strioctl) (int, error) { return ioctlPtrRet(fd, req, unsafe.Pointer(s)) } diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 00f0aa3758..8e48c29ec3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -587,3 +587,10 @@ func emptyIovecs(iov []Iovec) bool { } return true } + +// Setrlimit sets a resource limit. +func Setrlimit(resource int, rlim *Rlimit) error { + // Just call the syscall version, because as of Go 1.21 + // it will affect starting a new process. + return syscall.Setrlimit(resource, (*syscall.Rlimit)(rlim)) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index b295497ae4..d3d49ec3ed 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -212,8 +212,8 @@ func (cmsg *Cmsghdr) SetLen(length int) { //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___SENDMSG_A //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) = SYS_MMAP //sys munmap(addr uintptr, length uintptr) (err error) = SYS_MUNMAP -//sys ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL -//sys ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL +//sys ioctl(fd int, req int, arg uintptr) (err error) = SYS_IOCTL +//sys ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = SYS_IOCTL //sys Access(path string, mode uint32) (err error) = SYS___ACCESS_A //sys Chdir(path string) (err error) = SYS___CHDIR_A diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index 476a1c7e77..1430076271 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -1270,6 +1270,16 @@ const ( SEEK_END = 0x2 SEEK_HOLE = 0x3 SEEK_SET = 0x0 + SF_APPEND = 0x40000 + SF_ARCHIVED = 0x10000 + SF_DATALESS = 0x40000000 + SF_FIRMLINK = 0x800000 + SF_IMMUTABLE = 0x20000 + SF_NOUNLINK = 0x100000 + SF_RESTRICTED = 0x80000 + SF_SETTABLE = 0x3fff0000 + SF_SUPPORTED = 0x9f0000 + SF_SYNTHETIC = 0xc0000000 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1543,6 +1553,15 @@ const ( TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 + UF_APPEND = 0x4 + UF_COMPRESSED = 0x20 + UF_DATAVAULT = 0x80 + UF_HIDDEN = 0x8000 + UF_IMMUTABLE = 0x2 + UF_NODUMP = 0x1 + UF_OPAQUE = 0x8 + UF_SETTABLE = 0xffff + UF_TRACKED = 0x40 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index e36f5178d6..ab044a7427 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -1270,6 +1270,16 @@ const ( SEEK_END = 0x2 SEEK_HOLE = 0x3 SEEK_SET = 0x0 + SF_APPEND = 0x40000 + SF_ARCHIVED = 0x10000 + SF_DATALESS = 0x40000000 + SF_FIRMLINK = 0x800000 + SF_IMMUTABLE = 0x20000 + SF_NOUNLINK = 0x100000 + SF_RESTRICTED = 0x80000 + SF_SETTABLE = 0x3fff0000 + SF_SUPPORTED = 0x9f0000 + SF_SYNTHETIC = 0xc0000000 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1543,6 +1553,15 @@ const ( TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 + UF_APPEND = 0x4 + UF_COMPRESSED = 0x20 + UF_DATAVAULT = 0x80 + UF_HIDDEN = 0x8000 + UF_IMMUTABLE = 0x2 + UF_NODUMP = 0x1 + UF_OPAQUE = 0x8 + UF_SETTABLE = 0xffff + UF_TRACKED = 0x40 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 398c37e52d..3784f402e5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -493,6 +493,7 @@ const ( BPF_F_TEST_RUN_ON_CPU = 0x1 BPF_F_TEST_STATE_FREQ = 0x8 BPF_F_TEST_XDP_LIVE_FRAMES = 0x2 + BPF_F_XDP_DEV_BOUND_ONLY = 0x40 BPF_F_XDP_HAS_FRAGS = 0x20 BPF_H = 0x8 BPF_IMM = 0x0 @@ -826,9 +827,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2022-07-28)" + DM_VERSION_EXTRA = "-ioctl (2023-03-01)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2f + DM_VERSION_MINOR = 0x30 DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -1197,6 +1198,7 @@ const ( FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_FS_ERROR = 0x8000 + FAN_INFO = 0x20 FAN_MARK_ADD = 0x1 FAN_MARK_DONT_FOLLOW = 0x4 FAN_MARK_EVICTABLE = 0x200 @@ -1233,6 +1235,8 @@ const ( FAN_REPORT_PIDFD = 0x80 FAN_REPORT_TARGET_FID = 0x1000 FAN_REPORT_TID = 0x100 + FAN_RESPONSE_INFO_AUDIT_RULE = 0x1 + FAN_RESPONSE_INFO_NONE = 0x0 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 @@ -1860,6 +1864,7 @@ const ( MEMWRITEOOB64 = 0xc0184d15 MFD_ALLOW_SEALING = 0x2 MFD_CLOEXEC = 0x1 + MFD_EXEC = 0x10 MFD_HUGETLB = 0x4 MFD_HUGE_16GB = 0x88000000 MFD_HUGE_16MB = 0x60000000 @@ -1875,6 +1880,7 @@ const ( MFD_HUGE_8MB = 0x5c000000 MFD_HUGE_MASK = 0x3f MFD_HUGE_SHIFT = 0x1a + MFD_NOEXEC_SEAL = 0x8 MINIX2_SUPER_MAGIC = 0x2468 MINIX2_SUPER_MAGIC2 = 0x2478 MINIX3_SUPER_MAGIC = 0x4d5a @@ -1898,6 +1904,9 @@ const ( MOUNT_ATTR_SIZE_VER0 = 0x20 MOUNT_ATTR_STRICTATIME = 0x20 MOUNT_ATTR__ATIME = 0x70 + MREMAP_DONTUNMAP = 0x4 + MREMAP_FIXED = 0x2 + MREMAP_MAYMOVE = 0x1 MSDOS_SUPER_MAGIC = 0x4d44 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 @@ -2204,6 +2213,7 @@ const ( PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf + PACKET_VNET_HDR_SZ = 0x18 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 @@ -2221,6 +2231,7 @@ const ( PERF_ATTR_SIZE_VER5 = 0x70 PERF_ATTR_SIZE_VER6 = 0x78 PERF_ATTR_SIZE_VER7 = 0x80 + PERF_ATTR_SIZE_VER8 = 0x88 PERF_AUX_FLAG_COLLISION = 0x8 PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT = 0x0 PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW = 0x100 @@ -2361,6 +2372,7 @@ const ( PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 + PR_GET_AUXV = 0x41555856 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 @@ -2369,6 +2381,8 @@ const ( PR_GET_FP_MODE = 0x2e PR_GET_IO_FLUSHER = 0x3a PR_GET_KEEPCAPS = 0x7 + PR_GET_MDWE = 0x42 + PR_GET_MEMORY_MERGE = 0x44 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 @@ -2389,6 +2403,7 @@ const ( PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 + PR_MDWE_REFUSE_EXEC_GAIN = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_MTE_TAG_MASK = 0x7fff8 @@ -2423,6 +2438,8 @@ const ( PR_SET_FP_MODE = 0x2d PR_SET_IO_FLUSHER = 0x39 PR_SET_KEEPCAPS = 0x8 + PR_SET_MDWE = 0x41 + PR_SET_MEMORY_MERGE = 0x43 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 @@ -2506,6 +2523,7 @@ const ( PTRACE_GETSIGMASK = 0x420a PTRACE_GET_RSEQ_CONFIGURATION = 0x420f PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG = 0x4211 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -2536,6 +2554,7 @@ const ( PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG = 0x4210 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_SYSCALL_INFO_ENTRY = 0x1 @@ -2967,6 +2986,7 @@ const ( SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_TLS = 0x11a + SOL_UDP = 0x11 SOL_X25 = 0x106 SOL_XDP = 0x11b SOMAXCONN = 0x1000 @@ -3071,7 +3091,7 @@ const ( TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0xd + TASKSTATS_VERSION = 0xe TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 @@ -3237,6 +3257,7 @@ const ( TP_STATUS_COPY = 0x2 TP_STATUS_CSUMNOTREADY = 0x8 TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_GSO_TCP = 0x100 TP_STATUS_KERNEL = 0x0 TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 @@ -3251,6 +3272,19 @@ const ( TRACEFS_MAGIC = 0x74726163 TS_COMM_LEN = 0x20 UDF_SUPER_MAGIC = 0x15013346 + UDP_CORK = 0x1 + UDP_ENCAP = 0x64 + UDP_ENCAP_ESPINUDP = 0x2 + UDP_ENCAP_ESPINUDP_NON_IKE = 0x1 + UDP_ENCAP_GTP0 = 0x4 + UDP_ENCAP_GTP1U = 0x5 + UDP_ENCAP_L2TPINUDP = 0x3 + UDP_GRO = 0x68 + UDP_NO_CHECK6_RX = 0x66 + UDP_NO_CHECK6_TX = 0x65 + UDP_SEGMENT = 0x67 + UDP_V4_FLOW = 0x2 + UDP_V6_FLOW = 0x6 UMOUNT_NOFOLLOW = 0x8 USBDEVICE_SUPER_MAGIC = 0x9fa2 UTIME_NOW = 0x3fffffff diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 9d5352c3e4..12a9a1389e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -443,6 +443,7 @@ const ( TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 + TPIDR2_MAGIC = 0x54504902 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETDEVNETNS = 0x54e3 @@ -515,6 +516,7 @@ const ( XCASE = 0x4 XTABS = 0x1800 ZA_MAGIC = 0x54366345 + ZT_MAGIC = 0x5a544e01 _HIDIOCGRAWNAME = 0x80804804 _HIDIOCGRAWPHYS = 0x80404805 _HIDIOCGRAWUNIQ = 0x80404808 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index f619252691..48984202c6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -329,6 +329,54 @@ const ( SCM_WIFI_STATUS = 0x25 SFD_CLOEXEC = 0x400000 SFD_NONBLOCK = 0x4000 + SF_FP = 0x38 + SF_I0 = 0x20 + SF_I1 = 0x24 + SF_I2 = 0x28 + SF_I3 = 0x2c + SF_I4 = 0x30 + SF_I5 = 0x34 + SF_L0 = 0x0 + SF_L1 = 0x4 + SF_L2 = 0x8 + SF_L3 = 0xc + SF_L4 = 0x10 + SF_L5 = 0x14 + SF_L6 = 0x18 + SF_L7 = 0x1c + SF_PC = 0x3c + SF_RETP = 0x40 + SF_V9_FP = 0x70 + SF_V9_I0 = 0x40 + SF_V9_I1 = 0x48 + SF_V9_I2 = 0x50 + SF_V9_I3 = 0x58 + SF_V9_I4 = 0x60 + SF_V9_I5 = 0x68 + SF_V9_L0 = 0x0 + SF_V9_L1 = 0x8 + SF_V9_L2 = 0x10 + SF_V9_L3 = 0x18 + SF_V9_L4 = 0x20 + SF_V9_L5 = 0x28 + SF_V9_L6 = 0x30 + SF_V9_L7 = 0x38 + SF_V9_PC = 0x78 + SF_V9_RETP = 0x80 + SF_V9_XARG0 = 0x88 + SF_V9_XARG1 = 0x90 + SF_V9_XARG2 = 0x98 + SF_V9_XARG3 = 0xa0 + SF_V9_XARG4 = 0xa8 + SF_V9_XARG5 = 0xb0 + SF_V9_XXARG = 0xb8 + SF_XARG0 = 0x44 + SF_XARG1 = 0x48 + SF_XARG2 = 0x4c + SF_XARG3 = 0x50 + SF_XARG4 = 0x54 + SF_XARG5 = 0x58 + SF_XXARG = 0x5c SIOCATMARK = 0x8905 SIOCGPGRP = 0x8904 SIOCGSTAMPNS_NEW = 0x40108907 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index ef9dcd1bef..9a257219d7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -124,7 +124,6 @@ int utime(uintptr_t, uintptr_t); unsigned long long getsystemcfg(int); int umount(uintptr_t); int getrlimit64(int, uintptr_t); -int setrlimit64(int, uintptr_t); long long lseek64(int, long long, int); uintptr_t mmap(uintptr_t, uintptr_t, int, int, int, long long); @@ -213,7 +212,7 @@ func wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctl(fd int, req uint, arg uintptr) (err error) { +func ioctl(fd int, req int, arg uintptr) (err error) { r0, er := C.ioctl(C.int(fd), C.int(req), C.uintptr_t(arg)) if r0 == -1 && er != nil { err = er @@ -223,7 +222,7 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { r0, er := C.ioctl(C.int(fd), C.int(req), C.uintptr_t(uintptr(arg))) if r0 == -1 && er != nil { err = er @@ -1464,16 +1463,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - r0, er := C.setrlimit64(C.int(resource), C.uintptr_t(uintptr(unsafe.Pointer(rlim)))) - if r0 == -1 && er != nil { - err = er - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, er := C.lseek64(C.int(fd), C.longlong(offset), C.int(whence)) off = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index f86a945923..6de80c20cf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -93,8 +93,8 @@ func wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctl(fd int, req uint, arg uintptr) (err error) { - _, e1 := callioctl(fd, int(req), arg) +func ioctl(fd int, req int, arg uintptr) (err error) { + _, e1 := callioctl(fd, req, arg) if e1 != 0 { err = errnoErr(e1) } @@ -103,8 +103,8 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { - _, e1 := callioctl_ptr(fd, int(req), arg) +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { + _, e1 := callioctl_ptr(fd, req, arg) if e1 != 0 { err = errnoErr(e1) } @@ -1422,16 +1422,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, e1 := callsetrlimit(resource, uintptr(unsafe.Pointer(rlim))) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, e1 := calllseek(fd, offset, whence) off = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index d32a84cae2..c4d50ae500 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -124,7 +124,6 @@ import ( //go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o" //go:cgo_import_dynamic libc_umount umount "libc.a/shr_64.o" //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.a/shr_64.o" -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.a/shr_64.o" //go:cgo_import_dynamic libc_lseek lseek "libc.a/shr_64.o" //go:cgo_import_dynamic libc_mmap64 mmap64 "libc.a/shr_64.o" @@ -242,7 +241,6 @@ import ( //go:linkname libc_getsystemcfg libc_getsystemcfg //go:linkname libc_umount libc_umount //go:linkname libc_getrlimit libc_getrlimit -//go:linkname libc_setrlimit libc_setrlimit //go:linkname libc_lseek libc_lseek //go:linkname libc_mmap64 libc_mmap64 @@ -363,7 +361,6 @@ var ( libc_getsystemcfg, libc_umount, libc_getrlimit, - libc_setrlimit, libc_lseek, libc_mmap64 syscallFunc ) @@ -1179,13 +1176,6 @@ func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { - r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setrlimit)), 2, uintptr(resource), rlim, 0, 0, 0, 0) - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) { r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_lseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) return diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index d7d8baf819..6903d3b09e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -123,7 +123,6 @@ int utime(uintptr_t, uintptr_t); unsigned long long getsystemcfg(int); int umount(uintptr_t); int getrlimit(int, uintptr_t); -int setrlimit(int, uintptr_t); long long lseek(int, long long, int); uintptr_t mmap64(uintptr_t, uintptr_t, int, int, int, long long); @@ -131,6 +130,7 @@ uintptr_t mmap64(uintptr_t, uintptr_t, int, int, int, long long); import "C" import ( "syscall" + "unsafe" ) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1055,14 +1055,6 @@ func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { - r1 = uintptr(C.setrlimit(C.int(resource), C.uintptr_t(rlim))) - e1 = syscall.GetErrno() - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) { r1 = uintptr(C.lseek(C.int(fd), C.longlong(offset), C.int(whence))) e1 = syscall.GetErrno() diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index a29ffdd566..4037ccf7a9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -1992,6 +1992,31 @@ var libc_select_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(attrBuf) > 0 { + _p1 = unsafe.Pointer(&attrBuf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(attrlist)), uintptr(_p1), uintptr(len(attrBuf)), uintptr(options), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_setattrlist_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setegid(egid int) (err error) { _, _, e1 := syscall_syscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { @@ -2123,20 +2148,6 @@ var libc_setreuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 95fe4c0eb9..4baaed0bc1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -705,6 +705,11 @@ TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) +TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setattrlist(SB) +GLOBL ·libc_setattrlist_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB) + TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) @@ -759,12 +764,6 @@ TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) - -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 2fd4590bb7..51d6f3fb25 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -1992,6 +1992,31 @@ var libc_select_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(attrBuf) > 0 { + _p1 = unsafe.Pointer(&attrBuf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(attrlist)), uintptr(_p1), uintptr(len(attrBuf)), uintptr(options), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_setattrlist_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setegid(egid int) (err error) { _, _, e1 := syscall_syscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { @@ -2123,20 +2148,6 @@ var libc_setreuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index efa5b4c987..c3b82c0379 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -705,6 +705,11 @@ TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) +TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setattrlist(SB) +GLOBL ·libc_setattrlist_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB) + TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) @@ -759,12 +764,6 @@ TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) - -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 3b85134707..0eabac7ade 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1410,16 +1410,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index 1129065624..ee313eb007 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 55f5abfe59..4c986e448e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index d39651c2b5..555216944a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index ddb7408680..67a226fbf5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go index 09a53a616c..f0b9ddaaa2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 430cb24de7..7ceec233fb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1346,16 +1346,6 @@ func PivotRoot(newroot string, putold string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { - _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { @@ -1878,6 +1868,17 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldaddr), uintptr(oldlength), uintptr(newlength), uintptr(flags), uintptr(newaddr), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { @@ -2182,3 +2183,17 @@ func rtSigprocmask(how int, set *Sigset_t, oldset *Sigset_t, sigsetsize uintptr) } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + RawSyscallNoError(SYS_GETRESUID, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + RawSyscallNoError(SYS_GETRESGID, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index c81b0ad477..07b549cc25 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -411,16 +411,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 2206bce7f4..5f481bf83f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -334,16 +334,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index edf6b39f16..824cd52c7f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -578,16 +578,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func armSyncFileRange(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_ARM_SYNC_FILE_RANGE, uintptr(fd), uintptr(flags), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 190609f214..e77aecfe98 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -289,16 +289,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 5f984cbb1c..961a3afb7b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -644,16 +644,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Alarm(seconds uint) (remaining uint, err error) { r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) remaining = uint(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 46fc380a40..ed05005e91 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -278,16 +278,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index cbd0d4dadb..d365b718f3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -278,16 +278,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 0c13d15f07..c3f1b8bbde 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -644,16 +644,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Alarm(seconds uint) (remaining uint, err error) { r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) remaining = uint(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go index e01432aed5..a6574cf98b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go @@ -624,16 +624,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func syncFileRange2(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 13c7ee7baf..f40990264f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -349,16 +349,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 02d0c0fd61..9dfcc29974 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -349,16 +349,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 9fee3b1d23..0b29239583 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -269,16 +269,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 647bbfecd6..6cde32237d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -319,16 +319,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index ada057f891..5253d65bf1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -329,16 +329,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 8e1d9c8f66..cdb2af5ae0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 21c6950400..9d25f76b0b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 298168f90a..d3f8035169 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 68b8bd492f..887188a529 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 0b0f910e1a..9ab9abf721 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -519,6 +519,28 @@ var libc_getcwd_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +var libc_getresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresuid getresuid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} + +var libc_getresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresgid getresgid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -1894,20 +1916,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s index 087444250c..3dcacd30d7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -158,6 +158,16 @@ TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $4 DATA ·libc_getcwd_trampoline_addr(SB)/4, $libc_getcwd_trampoline<>(SB) +TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresuid(SB) +GLOBL ·libc_getresuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getresuid_trampoline_addr(SB)/4, $libc_getresuid_trampoline<>(SB) + +TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresgid(SB) +GLOBL ·libc_getresgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getresgid_trampoline_addr(SB)/4, $libc_getresgid_trampoline<>(SB) + TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $4 @@ -573,11 +583,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $4 DATA ·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $4 -DATA ·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 48ff5de75b..915761eab7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -519,6 +519,28 @@ var libc_getcwd_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +var libc_getresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresuid getresuid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} + +var libc_getresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresgid getresgid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -527,6 +549,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -535,10 +563,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -1894,20 +1918,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s index 5782cd1084..2763620b01 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -158,6 +158,16 @@ TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) +TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresuid(SB) +GLOBL ·libc_getresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB) + +TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresgid(SB) +GLOBL ·libc_getresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB) + TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 @@ -573,11 +583,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 2452a641da..8e87fdf153 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -519,6 +519,28 @@ var libc_getcwd_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +var libc_getresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresuid getresuid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} + +var libc_getresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresgid getresgid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -1894,20 +1916,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s index cf310420c9..c922314048 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s @@ -158,6 +158,16 @@ TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $4 DATA ·libc_getcwd_trampoline_addr(SB)/4, $libc_getcwd_trampoline<>(SB) +TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresuid(SB) +GLOBL ·libc_getresuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getresuid_trampoline_addr(SB)/4, $libc_getresuid_trampoline<>(SB) + +TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresgid(SB) +GLOBL ·libc_getresgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getresgid_trampoline_addr(SB)/4, $libc_getresgid_trampoline<>(SB) + TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $4 @@ -573,11 +583,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $4 DATA ·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $4 -DATA ·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 5e35600a60..12a7a2160e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -519,6 +519,28 @@ var libc_getcwd_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +var libc_getresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresuid getresuid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} + +var libc_getresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresgid getresgid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -1894,20 +1916,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s index 484bb42e0a..a6bc32c922 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -158,6 +158,16 @@ TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) +TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresuid(SB) +GLOBL ·libc_getresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB) + +TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresgid(SB) +GLOBL ·libc_getresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB) + TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 @@ -573,11 +583,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index b04cef1a19..b19e8aa031 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -519,6 +519,28 @@ var libc_getcwd_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +var libc_getresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresuid getresuid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} + +var libc_getresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresgid getresgid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -1894,20 +1916,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s index 55af27263a..b4e7bceabf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s @@ -158,6 +158,16 @@ TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) +TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresuid(SB) +GLOBL ·libc_getresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB) + +TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresgid(SB) +GLOBL ·libc_getresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB) + TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 @@ -573,11 +583,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index 47a07ee0c2..fb99594c93 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go @@ -519,6 +519,28 @@ var libc_getcwd_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +var libc_getresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresuid getresuid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} + +var libc_getresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresgid getresgid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -1894,20 +1916,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s index 4028255b0d..ca3f766009 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s @@ -189,6 +189,18 @@ TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) +TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_getresuid(SB) + RET +GLOBL ·libc_getresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB) + +TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_getresgid(SB) + RET +GLOBL ·libc_getresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB) + TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 CALL libc_ioctl(SB) RET @@ -687,12 +699,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - CALL libc_setrlimit(SB) - RET -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 CALL libc_setrtable(SB) RET diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index 573378fdb9..32cbbbc52b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go @@ -519,6 +519,28 @@ var libc_getcwd_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) { + syscall_rawSyscall(libc_getresuid_trampoline_addr, uintptr(unsafe.Pointer(ruid)), uintptr(unsafe.Pointer(euid)), uintptr(unsafe.Pointer(suid))) + return +} + +var libc_getresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresuid getresuid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { + syscall_rawSyscall(libc_getresgid_trampoline_addr, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) + return +} + +var libc_getresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getresgid getresgid "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -1894,20 +1916,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s index e1fbd4dfa8..477a7d5b21 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s @@ -158,6 +158,16 @@ TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) +TEXT libc_getresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresuid(SB) +GLOBL ·libc_getresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresuid_trampoline_addr(SB)/8, $libc_getresuid_trampoline<>(SB) + +TEXT libc_getresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getresgid(SB) +GLOBL ·libc_getresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getresgid_trampoline_addr(SB)/8, $libc_getresgid_trampoline<>(SB) + TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 @@ -573,11 +583,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 4873a1e5d3..609d1c598a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -110,7 +110,6 @@ import ( //go:cgo_import_dynamic libc_setpriority setpriority "libc.so" //go:cgo_import_dynamic libc_setregid setregid "libc.so" //go:cgo_import_dynamic libc_setreuid setreuid "libc.so" -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" //go:cgo_import_dynamic libc_setsid setsid "libc.so" //go:cgo_import_dynamic libc_setuid setuid "libc.so" //go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" @@ -250,7 +249,6 @@ import ( //go:linkname procSetpriority libc_setpriority //go:linkname procSetregid libc_setregid //go:linkname procSetreuid libc_setreuid -//go:linkname procSetrlimit libc_setrlimit //go:linkname procSetsid libc_setsid //go:linkname procSetuid libc_setuid //go:linkname procshutdown libc_shutdown @@ -391,7 +389,6 @@ var ( procSetpriority, procSetregid, procSetreuid, - procSetrlimit, procSetsid, procSetuid, procshutdown, @@ -646,7 +643,7 @@ func __minor(version int, dev uint64) (val uint) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) { +func ioctlRet(fd int, req int, arg uintptr) (ret int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) ret = int(r0) if e1 != 0 { @@ -657,7 +654,7 @@ func ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtrRet(fd int, req uint, arg unsafe.Pointer) (ret int, err error) { +func ioctlPtrRet(fd int, req int, arg unsafe.Pointer) (ret int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) ret = int(r0) if e1 != 0 { @@ -1650,16 +1647,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) - if e1 != 0 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go index 07bfe2ef9a..c31681743c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go @@ -257,7 +257,7 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctl(fd int, req uint, arg uintptr) (err error) { +func ioctl(fd int, req int, arg uintptr) (err error) { _, _, e1 := syscall_syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) @@ -267,7 +267,7 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 7ea465204b..e6ed7d637d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -372,6 +372,7 @@ const ( SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index e2a64f0991..690cefc3d0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -151,6 +151,16 @@ type Dirent struct { _ [3]byte } +type Attrlist struct { + Bitmapcount uint16 + Reserved uint16 + Commonattr uint32 + Volattr uint32 + Dirattr uint32 + Fileattr uint32 + Forkattr uint32 +} + const ( PathMax = 0x400 ) @@ -610,6 +620,7 @@ const ( AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 + AT_EACCESS = 0x10 ) type PollFd struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index 34aa775219..5bffc10eac 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -151,6 +151,16 @@ type Dirent struct { _ [3]byte } +type Attrlist struct { + Bitmapcount uint16 + Reserved uint16 + Commonattr uint32 + Volattr uint32 + Dirattr uint32 + Fileattr uint32 + Forkattr uint32 +} + const ( PathMax = 0x400 ) @@ -610,6 +620,7 @@ const ( AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 + AT_EACCESS = 0x10 ) type PollFd struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index ca84727cfe..02e2462c8f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -1538,6 +1538,10 @@ const ( IFLA_GRO_MAX_SIZE = 0x3a IFLA_TSO_MAX_SIZE = 0x3b IFLA_TSO_MAX_SEGS = 0x3c + IFLA_ALLMULTI = 0x3d + IFLA_DEVLINK_PORT = 0x3e + IFLA_GSO_IPV4_MAX_SIZE = 0x3f + IFLA_GRO_IPV4_MAX_SIZE = 0x40 IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 IFLA_PROTO_DOWN_REASON_MASK = 0x1 IFLA_PROTO_DOWN_REASON_VALUE = 0x2 @@ -1968,7 +1972,7 @@ const ( NFT_MSG_GETFLOWTABLE = 0x17 NFT_MSG_DELFLOWTABLE = 0x18 NFT_MSG_GETRULE_RESET = 0x19 - NFT_MSG_MAX = 0x1a + NFT_MSG_MAX = 0x21 NFTA_LIST_UNSPEC = 0x0 NFTA_LIST_ELEM = 0x1 NFTA_HOOK_UNSPEC = 0x0 @@ -2555,6 +2559,11 @@ const ( BPF_REG_8 = 0x8 BPF_REG_9 = 0x9 BPF_REG_10 = 0xa + BPF_CGROUP_ITER_ORDER_UNSPEC = 0x0 + BPF_CGROUP_ITER_SELF_ONLY = 0x1 + BPF_CGROUP_ITER_DESCENDANTS_PRE = 0x2 + BPF_CGROUP_ITER_DESCENDANTS_POST = 0x3 + BPF_CGROUP_ITER_ANCESTORS_UP = 0x4 BPF_MAP_CREATE = 0x0 BPF_MAP_LOOKUP_ELEM = 0x1 BPF_MAP_UPDATE_ELEM = 0x2 @@ -2566,6 +2575,7 @@ const ( BPF_PROG_ATTACH = 0x8 BPF_PROG_DETACH = 0x9 BPF_PROG_TEST_RUN = 0xa + BPF_PROG_RUN = 0xa BPF_PROG_GET_NEXT_ID = 0xb BPF_MAP_GET_NEXT_ID = 0xc BPF_PROG_GET_FD_BY_ID = 0xd @@ -2610,6 +2620,7 @@ const ( BPF_MAP_TYPE_CPUMAP = 0x10 BPF_MAP_TYPE_XSKMAP = 0x11 BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED = 0x13 BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 @@ -2620,6 +2631,10 @@ const ( BPF_MAP_TYPE_STRUCT_OPS = 0x1a BPF_MAP_TYPE_RINGBUF = 0x1b BPF_MAP_TYPE_INODE_STORAGE = 0x1c + BPF_MAP_TYPE_TASK_STORAGE = 0x1d + BPF_MAP_TYPE_BLOOM_FILTER = 0x1e + BPF_MAP_TYPE_USER_RINGBUF = 0x1f + BPF_MAP_TYPE_CGRP_STORAGE = 0x20 BPF_PROG_TYPE_UNSPEC = 0x0 BPF_PROG_TYPE_SOCKET_FILTER = 0x1 BPF_PROG_TYPE_KPROBE = 0x2 @@ -2651,6 +2666,7 @@ const ( BPF_PROG_TYPE_EXT = 0x1c BPF_PROG_TYPE_LSM = 0x1d BPF_PROG_TYPE_SK_LOOKUP = 0x1e + BPF_PROG_TYPE_SYSCALL = 0x1f BPF_CGROUP_INET_INGRESS = 0x0 BPF_CGROUP_INET_EGRESS = 0x1 BPF_CGROUP_INET_SOCK_CREATE = 0x2 @@ -2689,6 +2705,12 @@ const ( BPF_XDP_CPUMAP = 0x23 BPF_SK_LOOKUP = 0x24 BPF_XDP = 0x25 + BPF_SK_SKB_VERDICT = 0x26 + BPF_SK_REUSEPORT_SELECT = 0x27 + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 0x28 + BPF_PERF_EVENT = 0x29 + BPF_TRACE_KPROBE_MULTI = 0x2a + BPF_LSM_CGROUP = 0x2b BPF_LINK_TYPE_UNSPEC = 0x0 BPF_LINK_TYPE_RAW_TRACEPOINT = 0x1 BPF_LINK_TYPE_TRACING = 0x2 @@ -2696,6 +2718,9 @@ const ( BPF_LINK_TYPE_ITER = 0x4 BPF_LINK_TYPE_NETNS = 0x5 BPF_LINK_TYPE_XDP = 0x6 + BPF_LINK_TYPE_PERF_EVENT = 0x7 + BPF_LINK_TYPE_KPROBE_MULTI = 0x8 + BPF_LINK_TYPE_STRUCT_OPS = 0x9 BPF_ANY = 0x0 BPF_NOEXIST = 0x1 BPF_EXIST = 0x2 @@ -2733,6 +2758,7 @@ const ( BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_DONT_FRAGMENT = 0x4 BPF_F_SEQ_NUMBER = 0x8 + BPF_F_TUNINFO_FLAGS = 0x10 BPF_F_INDEX_MASK = 0xffffffff BPF_F_CURRENT_CPU = 0xffffffff BPF_F_CTXLEN_MASK = 0xfffff00000000 @@ -2747,6 +2773,7 @@ const ( BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 BPF_F_ADJ_ROOM_NO_CSUM_RESET = 0x20 + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 0x40 BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_F_SYSCTL_BASE_NAME = 0x1 @@ -2771,10 +2798,16 @@ const ( BPF_LWT_ENCAP_SEG6 = 0x0 BPF_LWT_ENCAP_SEG6_INLINE = 0x1 BPF_LWT_ENCAP_IP = 0x2 + BPF_F_BPRM_SECUREEXEC = 0x1 + BPF_F_BROADCAST = 0x8 + BPF_F_EXCLUDE_INGRESS = 0x10 + BPF_SKB_TSTAMP_UNSPEC = 0x0 + BPF_SKB_TSTAMP_DELIVERY_MONO = 0x1 BPF_OK = 0x0 BPF_DROP = 0x2 BPF_REDIRECT = 0x7 BPF_LWT_REROUTE = 0x80 + BPF_FLOW_DISSECTOR_CONTINUE = 0x81 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 @@ -2838,6 +2871,10 @@ const ( BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_MTU_CHK_SEGS = 0x1 + BPF_MTU_CHK_RET_SUCCESS = 0x0 + BPF_MTU_CHK_RET_FRAG_NEEDED = 0x1 + BPF_MTU_CHK_RET_SEGS_TOOBIG = 0x2 BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 BPF_FD_TYPE_TRACEPOINT = 0x1 BPF_FD_TYPE_KPROBE = 0x2 @@ -2847,6 +2884,19 @@ const ( BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_CORE_FIELD_BYTE_OFFSET = 0x0 + BPF_CORE_FIELD_BYTE_SIZE = 0x1 + BPF_CORE_FIELD_EXISTS = 0x2 + BPF_CORE_FIELD_SIGNED = 0x3 + BPF_CORE_FIELD_LSHIFT_U64 = 0x4 + BPF_CORE_FIELD_RSHIFT_U64 = 0x5 + BPF_CORE_TYPE_ID_LOCAL = 0x6 + BPF_CORE_TYPE_ID_TARGET = 0x7 + BPF_CORE_TYPE_EXISTS = 0x8 + BPF_CORE_TYPE_SIZE = 0x9 + BPF_CORE_ENUMVAL_EXISTS = 0xa + BPF_CORE_ENUMVAL_VALUE = 0xb + BPF_CORE_TYPE_MATCHES = 0xc ) const ( @@ -3605,7 +3655,7 @@ const ( ETHTOOL_MSG_PSE_GET = 0x24 ETHTOOL_MSG_PSE_SET = 0x25 ETHTOOL_MSG_RSS_GET = 0x26 - ETHTOOL_MSG_USER_MAX = 0x26 + ETHTOOL_MSG_USER_MAX = 0x2b ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3645,7 +3695,7 @@ const ( ETHTOOL_MSG_MODULE_NTF = 0x24 ETHTOOL_MSG_PSE_GET_REPLY = 0x25 ETHTOOL_MSG_RSS_GET_REPLY = 0x26 - ETHTOOL_MSG_KERNEL_MAX = 0x26 + ETHTOOL_MSG_KERNEL_MAX = 0x2b ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 @@ -3749,7 +3799,7 @@ const ( ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 0xb ETHTOOL_A_RINGS_CQE_SIZE = 0xc ETHTOOL_A_RINGS_TX_PUSH = 0xd - ETHTOOL_A_RINGS_MAX = 0xd + ETHTOOL_A_RINGS_MAX = 0x10 ETHTOOL_A_CHANNELS_UNSPEC = 0x0 ETHTOOL_A_CHANNELS_HEADER = 0x1 ETHTOOL_A_CHANNELS_RX_MAX = 0x2 @@ -3787,14 +3837,14 @@ const ( ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 0x18 ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 0x19 - ETHTOOL_A_COALESCE_MAX = 0x19 + ETHTOOL_A_COALESCE_MAX = 0x1c ETHTOOL_A_PAUSE_UNSPEC = 0x0 ETHTOOL_A_PAUSE_HEADER = 0x1 ETHTOOL_A_PAUSE_AUTONEG = 0x2 ETHTOOL_A_PAUSE_RX = 0x3 ETHTOOL_A_PAUSE_TX = 0x4 ETHTOOL_A_PAUSE_STATS = 0x5 - ETHTOOL_A_PAUSE_MAX = 0x5 + ETHTOOL_A_PAUSE_MAX = 0x6 ETHTOOL_A_PAUSE_STAT_UNSPEC = 0x0 ETHTOOL_A_PAUSE_STAT_PAD = 0x1 ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 0x2 @@ -4444,7 +4494,7 @@ const ( NL80211_ATTR_MAC_HINT = 0xc8 NL80211_ATTR_MAC_MASK = 0xd7 NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca - NL80211_ATTR_MAX = 0x141 + NL80211_ATTR_MAX = 0x145 NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 NL80211_ATTR_MAX_CSA_COUNTERS = 0xce NL80211_ATTR_MAX_MATCH_SETS = 0x85 @@ -4673,7 +4723,7 @@ const ( NL80211_BAND_ATTR_HT_CAPA = 0x4 NL80211_BAND_ATTR_HT_MCS_SET = 0x3 NL80211_BAND_ATTR_IFTYPE_DATA = 0x9 - NL80211_BAND_ATTR_MAX = 0xb + NL80211_BAND_ATTR_MAX = 0xd NL80211_BAND_ATTR_RATES = 0x2 NL80211_BAND_ATTR_VHT_CAPA = 0x8 NL80211_BAND_ATTR_VHT_MCS_SET = 0x7 @@ -4814,7 +4864,7 @@ const ( NL80211_CMD_LEAVE_IBSS = 0x2c NL80211_CMD_LEAVE_MESH = 0x45 NL80211_CMD_LEAVE_OCB = 0x6d - NL80211_CMD_MAX = 0x98 + NL80211_CMD_MAX = 0x99 NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29 NL80211_CMD_MODIFY_LINK_STA = 0x97 NL80211_CMD_NAN_MATCH = 0x78 @@ -5795,6 +5845,8 @@ const ( TUN_F_TSO6 = 0x4 TUN_F_TSO_ECN = 0x8 TUN_F_UFO = 0x10 + TUN_F_USO4 = 0x20 + TUN_F_USO6 = 0x40 ) const ( @@ -5804,9 +5856,10 @@ const ( ) const ( - VIRTIO_NET_HDR_GSO_NONE = 0x0 - VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 - VIRTIO_NET_HDR_GSO_UDP = 0x3 - VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 - VIRTIO_NET_HDR_GSO_ECN = 0x80 + VIRTIO_NET_HDR_GSO_NONE = 0x0 + VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 + VIRTIO_NET_HDR_GSO_UDP = 0x3 + VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 + VIRTIO_NET_HDR_GSO_UDP_L4 = 0x5 + VIRTIO_NET_HDR_GSO_ECN = 0x80 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 4ecc1495cd..6d8acbcc57 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -337,6 +337,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 34fddff964..59293c6884 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -350,6 +350,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 3b14a6031f..40cfa38c29 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -328,6 +328,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 0517651ab3..055bc4216d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -329,6 +329,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go index 3b0c518134..f28affbc60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go @@ -330,6 +330,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index fccdf4dd0f..9d71e7ccd8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 500de8fc07..fd5ccd332a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index d0434cd2c6..7704de77a2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 84206ba534..df00b87571 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index ab078cf1f5..0942840db6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -340,6 +340,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 42eb2c4cef..0348743950 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 31304a4e8b..bad0670475 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index c311f9612d..9ea54b7b86 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -357,6 +357,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index bba3cefac1..aa268d025c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -352,6 +352,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index ad8a013804..444045b6c5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -334,6 +334,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/golang.org/x/sys/windows/env_windows.go index 92ac05ff4e..b8ad192506 100644 --- a/vendor/golang.org/x/sys/windows/env_windows.go +++ b/vendor/golang.org/x/sys/windows/env_windows.go @@ -37,14 +37,14 @@ func (token Token) Environ(inheritExisting bool) (env []string, err error) { return nil, err } defer DestroyEnvironmentBlock(block) - blockp := uintptr(unsafe.Pointer(block)) + blockp := unsafe.Pointer(block) for { - entry := UTF16PtrToString((*uint16)(unsafe.Pointer(blockp))) + entry := UTF16PtrToString((*uint16)(blockp)) if len(entry) == 0 { break } env = append(env, entry) - blockp += 2 * (uintptr(len(entry)) + 1) + blockp = unsafe.Add(blockp, 2*(len(entry)+1)) } return env, nil } diff --git a/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/golang.org/x/sys/windows/exec_windows.go index 75980fd44a..a52e0331d8 100644 --- a/vendor/golang.org/x/sys/windows/exec_windows.go +++ b/vendor/golang.org/x/sys/windows/exec_windows.go @@ -95,12 +95,17 @@ func ComposeCommandLine(args []string) string { // DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv, // as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that // command lines are passed around. +// DecomposeCommandLine returns error if commandLine contains NUL. func DecomposeCommandLine(commandLine string) ([]string, error) { if len(commandLine) == 0 { return []string{}, nil } + utf16CommandLine, err := UTF16FromString(commandLine) + if err != nil { + return nil, errorspkg.New("string with NUL passed to DecomposeCommandLine") + } var argc int32 - argv, err := CommandLineToArgv(StringToUTF16Ptr(commandLine), &argc) + argv, err := CommandLineToArgv(&utf16CommandLine[0], &argc) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index f8deca8397..c44a1b9636 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -141,6 +141,12 @@ const ( SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1 ) +type ENUM_SERVICE_STATUS struct { + ServiceName *uint16 + DisplayName *uint16 + ServiceStatus SERVICE_STATUS +} + type SERVICE_STATUS struct { ServiceType uint32 CurrentState uint32 @@ -212,6 +218,10 @@ type SERVICE_FAILURE_ACTIONS struct { Actions *SC_ACTION } +type SERVICE_FAILURE_ACTIONS_FLAG struct { + FailureActionsOnNonCrashFailures int32 +} + type SC_ACTION struct { Type uint32 Delay uint32 @@ -245,3 +255,4 @@ type QUERY_SERVICE_LOCK_STATUS struct { //sys UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications? //sys RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW //sys QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation? +//sys EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) = advapi32.EnumDependentServicesW diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 3723b2c224..9645900754 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -405,7 +405,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys VerQueryValue(block unsafe.Pointer, subBlock string, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) = version.VerQueryValueW // Process Status API (PSAPI) -//sys EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses +//sys enumProcesses(processIds *uint32, nSize uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses //sys EnumProcessModules(process Handle, module *Handle, cb uint32, cbNeeded *uint32) (err error) = psapi.EnumProcessModules //sys EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *uint32, filterFlag uint32) (err error) = psapi.EnumProcessModulesEx //sys GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation @@ -1354,6 +1354,17 @@ func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { return syscall.EWINDOWS } +func EnumProcesses(processIds []uint32, bytesReturned *uint32) error { + // EnumProcesses syscall expects the size parameter to be in bytes, but the code generated with mksyscall uses + // the length of the processIds slice instead. Hence, this wrapper function is added to fix the discrepancy. + var p *uint32 + if len(processIds) > 0 { + p = &processIds[0] + } + size := uint32(len(processIds) * 4) + return enumProcesses(p, size, bytesReturned) +} + func Getpid() (pid int) { return int(GetCurrentProcessId()) } func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 857acf1032..88e62a6385 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -2220,19 +2220,23 @@ type JOBOBJECT_BASIC_UI_RESTRICTIONS struct { } const ( - // JobObjectInformationClass + // JobObjectInformationClass for QueryInformationJobObject and SetInformationJobObject JobObjectAssociateCompletionPortInformation = 7 + JobObjectBasicAccountingInformation = 1 + JobObjectBasicAndIoAccountingInformation = 8 JobObjectBasicLimitInformation = 2 + JobObjectBasicProcessIdList = 3 JobObjectBasicUIRestrictions = 4 JobObjectCpuRateControlInformation = 15 JobObjectEndOfJobTimeInformation = 6 JobObjectExtendedLimitInformation = 9 JobObjectGroupInformation = 11 JobObjectGroupInformationEx = 14 - JobObjectLimitViolationInformation2 = 35 + JobObjectLimitViolationInformation = 13 + JobObjectLimitViolationInformation2 = 34 JobObjectNetRateControlInformation = 32 JobObjectNotificationLimitInformation = 12 - JobObjectNotificationLimitInformation2 = 34 + JobObjectNotificationLimitInformation2 = 33 JobObjectSecurityLimitInformation = 5 ) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 6d2a268534..566dd3e315 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -86,6 +86,7 @@ var ( procDeleteService = modadvapi32.NewProc("DeleteService") procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx") + procEnumDependentServicesW = modadvapi32.NewProc("EnumDependentServicesW") procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") procEqualSid = modadvapi32.NewProc("EqualSid") procFreeSid = modadvapi32.NewProc("FreeSid") @@ -734,6 +735,14 @@ func DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes return } +func EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procEnumDependentServicesW.Addr(), 6, uintptr(service), uintptr(activityState), uintptr(unsafe.Pointer(services)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) { r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0) if r1 == 0 { @@ -3507,12 +3516,8 @@ func EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *u return } -func EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) { - var _p0 *uint32 - if len(processIds) > 0 { - _p0 = &processIds[0] - } - r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(processIds)), uintptr(unsafe.Pointer(bytesReturned))) +func enumProcesses(processIds *uint32, nSize uint32, bytesReturned *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(processIds)), uintptr(nSize), uintptr(unsafe.Pointer(bytesReturned))) if r1 == 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/term/term_unix.go b/vendor/golang.org/x/term/term_unix.go index a4e31ab1b2..62c2b3f41f 100644 --- a/vendor/golang.org/x/term/term_unix.go +++ b/vendor/golang.org/x/term/term_unix.go @@ -60,7 +60,7 @@ func restore(fd int, state *State) error { func getSize(fd int) (width, height int, err error) { ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) if err != nil { - return -1, -1, err + return 0, 0, err } return int(ws.Col), int(ws.Row), nil } diff --git a/vendor/golang.org/x/text/cases/tables13.0.0.go b/vendor/golang.org/x/text/cases/tables13.0.0.go index cd874775b3..68d2981d18 100644 --- a/vendor/golang.org/x/text/cases/tables13.0.0.go +++ b/vendor/golang.org/x/text/cases/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package cases diff --git a/vendor/golang.org/x/text/cases/tables15.0.0.go b/vendor/golang.org/x/text/cases/tables15.0.0.go new file mode 100644 index 0000000000..e431b99537 --- /dev/null +++ b/vendor/golang.org/x/text/cases/tables15.0.0.go @@ -0,0 +1,2528 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package cases + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +var xorData string = "" + // Size: 213 bytes + "\x00\x06\x07\x00\x01?\x00\x0f\x03\x00\x0f\x12\x00\x0f\x1f\x00\x0f\x1d" + + "\x00\x01\x13\x00\x0f\x16\x00\x0f\x0b\x00\x0f3\x00\x0f7\x00\x01#\x00\x0f?" + + "\x00\x0e'\x00\x0f/\x00\x0e>\x00\x0f*\x00\x0c&\x00\x0c*\x00\x0c;\x00\x0c9" + + "\x00\x0c%\x00\x01\x08\x00\x03\x0d\x00\x03\x09\x00\x02\x06\x00\x02\x02" + + "\x00\x02\x0c\x00\x01\x00\x00\x01\x03\x00\x01\x01\x00\x01 \x00\x01\x0c" + + "\x00\x01\x10\x00\x03\x10\x00\x036 \x00\x037 \x00\x0b#\x10\x00\x0b 0\x00" + + "\x0b!\x10\x00\x0b!0\x001\x00\x00\x0b(\x04\x00\x03\x04\x1e\x00\x0b)\x08" + + "\x00\x03\x0a\x00\x02:\x00\x02>\x00\x02,\x00\x02\x00\x00\x02\x10\x00\x01<" + + "\x00\x01&\x00\x01*\x00\x01.\x00\x010\x003 \x00\x01\x18\x00\x01(\x00\x03'" + + "\x00\x03)\x00\x03+\x00\x03/\x00\x03\x19\x00\x03\x1b\x00\x03\x1f\x00\x01" + + "\x1e\x00\x01\x22" + +var exceptions string = "" + // Size: 2450 bytes + "\x00\x12\x12μΜΜ\x12\x12ssSSSs\x13\x18i̇i̇\x10\x09II\x13\x1bʼnʼNʼN\x11" + + "\x09sSS\x12\x12dždžDž\x12\x12dždžDŽ\x10\x12DŽDž\x12\x12ljljLj\x12\x12ljljLJ\x10\x12LJLj" + + "\x12\x12njnjNj\x12\x12njnjNJ\x10\x12NJNj\x13\x1bǰJ̌J̌\x12\x12dzdzDz\x12\x12dzdzDZ\x10" + + "\x12DZDz\x13\x18ⱥⱥ\x13\x18ⱦⱦ\x10\x1bⱾⱾ\x10\x1bⱿⱿ\x10\x1bⱯⱯ\x10\x1bⱭⱭ\x10" + + "\x1bⱰⱰ\x10\x1bꞫꞫ\x10\x1bꞬꞬ\x10\x1bꞍꞍ\x10\x1bꞪꞪ\x10\x1bꞮꞮ\x10\x1bⱢⱢ\x10" + + "\x1bꞭꞭ\x10\x1bⱮⱮ\x10\x1bⱤⱤ\x10\x1bꟅꟅ\x10\x1bꞱꞱ\x10\x1bꞲꞲ\x10\x1bꞰꞰ2\x12ι" + + "ΙΙ\x166ΐΪ́Ϊ́\x166ΰΫ́Ϋ́\x12\x12σΣΣ\x12\x12βΒΒ\x12\x12θΘΘ\x12\x12" + + "φΦΦ\x12\x12πΠΠ\x12\x12κΚΚ\x12\x12ρΡΡ\x12\x12εΕΕ\x14$եւԵՒԵւ\x10\x1bᲐა" + + "\x10\x1bᲑბ\x10\x1bᲒგ\x10\x1bᲓდ\x10\x1bᲔე\x10\x1bᲕვ\x10\x1bᲖზ\x10\x1bᲗთ" + + "\x10\x1bᲘი\x10\x1bᲙკ\x10\x1bᲚლ\x10\x1bᲛმ\x10\x1bᲜნ\x10\x1bᲝო\x10\x1bᲞპ" + + "\x10\x1bᲟჟ\x10\x1bᲠრ\x10\x1bᲡს\x10\x1bᲢტ\x10\x1bᲣუ\x10\x1bᲤფ\x10\x1bᲥქ" + + "\x10\x1bᲦღ\x10\x1bᲧყ\x10\x1bᲨშ\x10\x1bᲩჩ\x10\x1bᲪც\x10\x1bᲫძ\x10\x1bᲬწ" + + "\x10\x1bᲭჭ\x10\x1bᲮხ\x10\x1bᲯჯ\x10\x1bᲰჰ\x10\x1bᲱჱ\x10\x1bᲲჲ\x10\x1bᲳჳ" + + "\x10\x1bᲴჴ\x10\x1bᲵჵ\x10\x1bᲶჶ\x10\x1bᲷჷ\x10\x1bᲸჸ\x10\x1bᲹჹ\x10\x1bᲺჺ" + + "\x10\x1bᲽჽ\x10\x1bᲾჾ\x10\x1bᲿჿ\x12\x12вВВ\x12\x12дДД\x12\x12оОО\x12\x12с" + + "СС\x12\x12тТТ\x12\x12тТТ\x12\x12ъЪЪ\x12\x12ѣѢѢ\x13\x1bꙋꙊꙊ\x13\x1bẖH̱H̱" + + "\x13\x1bẗT̈T̈\x13\x1bẘW̊W̊\x13\x1bẙY̊Y̊\x13\x1baʾAʾAʾ\x13\x1bṡṠṠ\x12" + + "\x10ssß\x14$ὐΥ̓Υ̓\x166ὒΥ̓̀Υ̓̀\x166ὔΥ̓́Υ̓́\x166ὖΥ̓͂Υ̓͂\x15+ἀιἈΙᾈ" + + "\x15+ἁιἉΙᾉ\x15+ἂιἊΙᾊ\x15+ἃιἋΙᾋ\x15+ἄιἌΙᾌ\x15+ἅιἍΙᾍ\x15+ἆιἎΙᾎ\x15+ἇιἏΙᾏ" + + "\x15\x1dἀιᾀἈΙ\x15\x1dἁιᾁἉΙ\x15\x1dἂιᾂἊΙ\x15\x1dἃιᾃἋΙ\x15\x1dἄιᾄἌΙ\x15" + + "\x1dἅιᾅἍΙ\x15\x1dἆιᾆἎΙ\x15\x1dἇιᾇἏΙ\x15+ἠιἨΙᾘ\x15+ἡιἩΙᾙ\x15+ἢιἪΙᾚ\x15+ἣι" + + "ἫΙᾛ\x15+ἤιἬΙᾜ\x15+ἥιἭΙᾝ\x15+ἦιἮΙᾞ\x15+ἧιἯΙᾟ\x15\x1dἠιᾐἨΙ\x15\x1dἡιᾑἩΙ" + + "\x15\x1dἢιᾒἪΙ\x15\x1dἣιᾓἫΙ\x15\x1dἤιᾔἬΙ\x15\x1dἥιᾕἭΙ\x15\x1dἦιᾖἮΙ\x15" + + "\x1dἧιᾗἯΙ\x15+ὠιὨΙᾨ\x15+ὡιὩΙᾩ\x15+ὢιὪΙᾪ\x15+ὣιὫΙᾫ\x15+ὤιὬΙᾬ\x15+ὥιὭΙᾭ" + + "\x15+ὦιὮΙᾮ\x15+ὧιὯΙᾯ\x15\x1dὠιᾠὨΙ\x15\x1dὡιᾡὩΙ\x15\x1dὢιᾢὪΙ\x15\x1dὣιᾣὫΙ" + + "\x15\x1dὤιᾤὬΙ\x15\x1dὥιᾥὭΙ\x15\x1dὦιᾦὮΙ\x15\x1dὧιᾧὯΙ\x15-ὰιᾺΙᾺͅ\x14#αιΑΙ" + + "ᾼ\x14$άιΆΙΆͅ\x14$ᾶΑ͂Α͂\x166ᾶιΑ͂Ιᾼ͂\x14\x1cαιᾳΑΙ\x12\x12ιΙΙ\x15-ὴιῊΙ" + + "Ὴͅ\x14#ηιΗΙῌ\x14$ήιΉΙΉͅ\x14$ῆΗ͂Η͂\x166ῆιΗ͂Ιῌ͂\x14\x1cηιῃΗΙ\x166ῒΙ" + + "̈̀Ϊ̀\x166ΐΪ́Ϊ́\x14$ῖΙ͂Ι͂\x166ῗΪ͂Ϊ͂\x166ῢΫ̀Ϋ̀\x166ΰΫ́Ϋ" + + "́\x14$ῤΡ̓Ρ̓\x14$ῦΥ͂Υ͂\x166ῧΫ͂Ϋ͂\x15-ὼιῺΙῺͅ\x14#ωιΩΙῼ\x14$ώιΏΙΏͅ" + + "\x14$ῶΩ͂Ω͂\x166ῶιΩ͂Ιῼ͂\x14\x1cωιῳΩΙ\x12\x10ωω\x11\x08kk\x12\x10åå\x12" + + "\x10ɫɫ\x12\x10ɽɽ\x10\x12ȺȺ\x10\x12ȾȾ\x12\x10ɑɑ\x12\x10ɱɱ\x12\x10ɐɐ\x12" + + "\x10ɒɒ\x12\x10ȿȿ\x12\x10ɀɀ\x12\x10ɥɥ\x12\x10ɦɦ\x12\x10ɜɜ\x12\x10ɡɡ\x12" + + "\x10ɬɬ\x12\x10ɪɪ\x12\x10ʞʞ\x12\x10ʇʇ\x12\x10ʝʝ\x12\x10ʂʂ\x12\x12ffFFFf" + + "\x12\x12fiFIFi\x12\x12flFLFl\x13\x1bffiFFIFfi\x13\x1bfflFFLFfl\x12\x12st" + + "STSt\x12\x12stSTSt\x14$մնՄՆՄն\x14$մեՄԵՄե\x14$միՄԻՄի\x14$վնՎՆՎն\x14$մխՄԽՄ" + + "խ" + +// 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 *caseTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[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 := caseIndex[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 := caseIndex[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 = caseIndex[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 := caseIndex[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 = caseIndex[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 = caseIndex[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 *caseTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[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 *caseTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[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 := caseIndex[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 := caseIndex[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 = caseIndex[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 := caseIndex[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 = caseIndex[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 = caseIndex[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 *caseTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// caseTrie. Total size: 13398 bytes (13.08 KiB). Checksum: 544af6e6b1b70931. +type caseTrie struct{} + +func newCaseTrie(i int) *caseTrie { + return &caseTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *caseTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 22: + return uint16(caseValues[n<<6+uint32(b)]) + default: + n -= 22 + return uint16(sparse.lookup(n, b)) + } +} + +// caseValues: 24 blocks, 1536 entries, 3072 bytes +// The third block is the zero block. +var caseValues = [1536]uint16{ + // Block 0x0, offset 0x0 + 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: 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, + 0x4c: 0x2013, 0x4d: 0x2013, 0x4e: 0x2013, 0x4f: 0x2013, 0x50: 0x2013, 0x51: 0x2013, + 0x52: 0x2013, 0x53: 0x2013, 0x54: 0x2013, 0x55: 0x2013, 0x56: 0x2013, 0x57: 0x2013, + 0x58: 0x2013, 0x59: 0x2013, 0x5a: 0x2013, + 0x5e: 0x0004, 0x5f: 0x0010, 0x60: 0x0004, 0x61: 0x2012, 0x62: 0x2012, 0x63: 0x2012, + 0x64: 0x2012, 0x65: 0x2012, 0x66: 0x2012, 0x67: 0x2012, 0x68: 0x2012, 0x69: 0x2012, + 0x6a: 0x2012, 0x6b: 0x2012, 0x6c: 0x2012, 0x6d: 0x2012, 0x6e: 0x2012, 0x6f: 0x2012, + 0x70: 0x2012, 0x71: 0x2012, 0x72: 0x2012, 0x73: 0x2012, 0x74: 0x2012, 0x75: 0x2012, + 0x76: 0x2012, 0x77: 0x2012, 0x78: 0x2012, 0x79: 0x2012, 0x7a: 0x2012, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0852, 0xc1: 0x0b53, 0xc2: 0x0113, 0xc3: 0x0112, 0xc4: 0x0113, 0xc5: 0x0112, + 0xc6: 0x0b53, 0xc7: 0x0f13, 0xc8: 0x0f12, 0xc9: 0x0e53, 0xca: 0x1153, 0xcb: 0x0713, + 0xcc: 0x0712, 0xcd: 0x0012, 0xce: 0x1453, 0xcf: 0x1753, 0xd0: 0x1a53, 0xd1: 0x0313, + 0xd2: 0x0312, 0xd3: 0x1d53, 0xd4: 0x2053, 0xd5: 0x2352, 0xd6: 0x2653, 0xd7: 0x2653, + 0xd8: 0x0113, 0xd9: 0x0112, 0xda: 0x2952, 0xdb: 0x0012, 0xdc: 0x1d53, 0xdd: 0x2c53, + 0xde: 0x2f52, 0xdf: 0x3253, 0xe0: 0x0113, 0xe1: 0x0112, 0xe2: 0x0113, 0xe3: 0x0112, + 0xe4: 0x0113, 0xe5: 0x0112, 0xe6: 0x3553, 0xe7: 0x0f13, 0xe8: 0x0f12, 0xe9: 0x3853, + 0xea: 0x0012, 0xeb: 0x0012, 0xec: 0x0113, 0xed: 0x0112, 0xee: 0x3553, 0xef: 0x1f13, + 0xf0: 0x1f12, 0xf1: 0x3b53, 0xf2: 0x3e53, 0xf3: 0x0713, 0xf4: 0x0712, 0xf5: 0x0313, + 0xf6: 0x0312, 0xf7: 0x4153, 0xf8: 0x0113, 0xf9: 0x0112, 0xfa: 0x0012, 0xfb: 0x0010, + 0xfc: 0x0113, 0xfd: 0x0112, 0xfe: 0x0012, 0xff: 0x4452, + // Block 0x4, offset 0x100 + 0x100: 0x0010, 0x101: 0x0010, 0x102: 0x0010, 0x103: 0x0010, 0x104: 0x02db, 0x105: 0x0359, + 0x106: 0x03da, 0x107: 0x043b, 0x108: 0x04b9, 0x109: 0x053a, 0x10a: 0x059b, 0x10b: 0x0619, + 0x10c: 0x069a, 0x10d: 0x0313, 0x10e: 0x0312, 0x10f: 0x1f13, 0x110: 0x1f12, 0x111: 0x0313, + 0x112: 0x0312, 0x113: 0x0713, 0x114: 0x0712, 0x115: 0x0313, 0x116: 0x0312, 0x117: 0x0f13, + 0x118: 0x0f12, 0x119: 0x0313, 0x11a: 0x0312, 0x11b: 0x0713, 0x11c: 0x0712, 0x11d: 0x1452, + 0x11e: 0x0113, 0x11f: 0x0112, 0x120: 0x0113, 0x121: 0x0112, 0x122: 0x0113, 0x123: 0x0112, + 0x124: 0x0113, 0x125: 0x0112, 0x126: 0x0113, 0x127: 0x0112, 0x128: 0x0113, 0x129: 0x0112, + 0x12a: 0x0113, 0x12b: 0x0112, 0x12c: 0x0113, 0x12d: 0x0112, 0x12e: 0x0113, 0x12f: 0x0112, + 0x130: 0x06fa, 0x131: 0x07ab, 0x132: 0x0829, 0x133: 0x08aa, 0x134: 0x0113, 0x135: 0x0112, + 0x136: 0x2353, 0x137: 0x4453, 0x138: 0x0113, 0x139: 0x0112, 0x13a: 0x0113, 0x13b: 0x0112, + 0x13c: 0x0113, 0x13d: 0x0112, 0x13e: 0x0113, 0x13f: 0x0112, + // Block 0x5, offset 0x140 + 0x140: 0x0a8a, 0x141: 0x0313, 0x142: 0x0312, 0x143: 0x0853, 0x144: 0x4753, 0x145: 0x4a53, + 0x146: 0x0113, 0x147: 0x0112, 0x148: 0x0113, 0x149: 0x0112, 0x14a: 0x0113, 0x14b: 0x0112, + 0x14c: 0x0113, 0x14d: 0x0112, 0x14e: 0x0113, 0x14f: 0x0112, 0x150: 0x0b0a, 0x151: 0x0b8a, + 0x152: 0x0c0a, 0x153: 0x0b52, 0x154: 0x0b52, 0x155: 0x0012, 0x156: 0x0e52, 0x157: 0x1152, + 0x158: 0x0012, 0x159: 0x1752, 0x15a: 0x0012, 0x15b: 0x1a52, 0x15c: 0x0c8a, 0x15d: 0x0012, + 0x15e: 0x0012, 0x15f: 0x0012, 0x160: 0x1d52, 0x161: 0x0d0a, 0x162: 0x0012, 0x163: 0x2052, + 0x164: 0x0012, 0x165: 0x0d8a, 0x166: 0x0e0a, 0x167: 0x0012, 0x168: 0x2652, 0x169: 0x2652, + 0x16a: 0x0e8a, 0x16b: 0x0f0a, 0x16c: 0x0f8a, 0x16d: 0x0012, 0x16e: 0x0012, 0x16f: 0x1d52, + 0x170: 0x0012, 0x171: 0x100a, 0x172: 0x2c52, 0x173: 0x0012, 0x174: 0x0012, 0x175: 0x3252, + 0x176: 0x0012, 0x177: 0x0012, 0x178: 0x0012, 0x179: 0x0012, 0x17a: 0x0012, 0x17b: 0x0012, + 0x17c: 0x0012, 0x17d: 0x108a, 0x17e: 0x0012, 0x17f: 0x0012, + // Block 0x6, offset 0x180 + 0x180: 0x3552, 0x181: 0x0012, 0x182: 0x110a, 0x183: 0x3852, 0x184: 0x0012, 0x185: 0x0012, + 0x186: 0x0012, 0x187: 0x118a, 0x188: 0x3552, 0x189: 0x4752, 0x18a: 0x3b52, 0x18b: 0x3e52, + 0x18c: 0x4a52, 0x18d: 0x0012, 0x18e: 0x0012, 0x18f: 0x0012, 0x190: 0x0012, 0x191: 0x0012, + 0x192: 0x4152, 0x193: 0x0012, 0x194: 0x0010, 0x195: 0x0012, 0x196: 0x0012, 0x197: 0x0012, + 0x198: 0x0012, 0x199: 0x0012, 0x19a: 0x0012, 0x19b: 0x0012, 0x19c: 0x0012, 0x19d: 0x120a, + 0x19e: 0x128a, 0x19f: 0x0012, 0x1a0: 0x0012, 0x1a1: 0x0012, 0x1a2: 0x0012, 0x1a3: 0x0012, + 0x1a4: 0x0012, 0x1a5: 0x0012, 0x1a6: 0x0012, 0x1a7: 0x0012, 0x1a8: 0x0012, 0x1a9: 0x0012, + 0x1aa: 0x0012, 0x1ab: 0x0012, 0x1ac: 0x0012, 0x1ad: 0x0012, 0x1ae: 0x0012, 0x1af: 0x0012, + 0x1b0: 0x0015, 0x1b1: 0x0015, 0x1b2: 0x0015, 0x1b3: 0x0015, 0x1b4: 0x0015, 0x1b5: 0x0015, + 0x1b6: 0x0015, 0x1b7: 0x0015, 0x1b8: 0x0015, 0x1b9: 0x0014, 0x1ba: 0x0014, 0x1bb: 0x0014, + 0x1bc: 0x0014, 0x1bd: 0x0014, 0x1be: 0x0014, 0x1bf: 0x0014, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0024, 0x1c1: 0x0024, 0x1c2: 0x0024, 0x1c3: 0x0024, 0x1c4: 0x0024, 0x1c5: 0x130d, + 0x1c6: 0x0024, 0x1c7: 0x0034, 0x1c8: 0x0034, 0x1c9: 0x0034, 0x1ca: 0x0024, 0x1cb: 0x0024, + 0x1cc: 0x0024, 0x1cd: 0x0034, 0x1ce: 0x0034, 0x1cf: 0x0014, 0x1d0: 0x0024, 0x1d1: 0x0024, + 0x1d2: 0x0024, 0x1d3: 0x0034, 0x1d4: 0x0034, 0x1d5: 0x0034, 0x1d6: 0x0034, 0x1d7: 0x0024, + 0x1d8: 0x0034, 0x1d9: 0x0034, 0x1da: 0x0034, 0x1db: 0x0024, 0x1dc: 0x0034, 0x1dd: 0x0034, + 0x1de: 0x0034, 0x1df: 0x0034, 0x1e0: 0x0034, 0x1e1: 0x0034, 0x1e2: 0x0034, 0x1e3: 0x0024, + 0x1e4: 0x0024, 0x1e5: 0x0024, 0x1e6: 0x0024, 0x1e7: 0x0024, 0x1e8: 0x0024, 0x1e9: 0x0024, + 0x1ea: 0x0024, 0x1eb: 0x0024, 0x1ec: 0x0024, 0x1ed: 0x0024, 0x1ee: 0x0024, 0x1ef: 0x0024, + 0x1f0: 0x0113, 0x1f1: 0x0112, 0x1f2: 0x0113, 0x1f3: 0x0112, 0x1f4: 0x0014, 0x1f5: 0x0004, + 0x1f6: 0x0113, 0x1f7: 0x0112, 0x1fa: 0x0015, 0x1fb: 0x4d52, + 0x1fc: 0x5052, 0x1fd: 0x5052, 0x1ff: 0x5353, + // Block 0x8, offset 0x200 + 0x204: 0x0004, 0x205: 0x0004, + 0x206: 0x2a13, 0x207: 0x0054, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513, + 0x20c: 0x5653, 0x20e: 0x5953, 0x20f: 0x5c53, 0x210: 0x138a, 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, + 0x21e: 0x2013, 0x21f: 0x2013, 0x220: 0x5f53, 0x221: 0x5f53, 0x223: 0x5f53, + 0x224: 0x5f53, 0x225: 0x5f53, 0x226: 0x5f53, 0x227: 0x5f53, 0x228: 0x5f53, 0x229: 0x5f53, + 0x22a: 0x5f53, 0x22b: 0x5f53, 0x22c: 0x2a12, 0x22d: 0x2512, 0x22e: 0x2712, 0x22f: 0x2512, + 0x230: 0x14ca, 0x231: 0x2012, 0x232: 0x2012, 0x233: 0x2012, 0x234: 0x2012, 0x235: 0x2012, + 0x236: 0x2012, 0x237: 0x2012, 0x238: 0x2012, 0x239: 0x2012, 0x23a: 0x2012, 0x23b: 0x2012, + 0x23c: 0x2012, 0x23d: 0x2012, 0x23e: 0x2012, 0x23f: 0x2012, + // Block 0x9, offset 0x240 + 0x240: 0x5f52, 0x241: 0x5f52, 0x242: 0x160a, 0x243: 0x5f52, 0x244: 0x5f52, 0x245: 0x5f52, + 0x246: 0x5f52, 0x247: 0x5f52, 0x248: 0x5f52, 0x249: 0x5f52, 0x24a: 0x5f52, 0x24b: 0x5f52, + 0x24c: 0x5652, 0x24d: 0x5952, 0x24e: 0x5c52, 0x24f: 0x1813, 0x250: 0x168a, 0x251: 0x170a, + 0x252: 0x0013, 0x253: 0x0013, 0x254: 0x0013, 0x255: 0x178a, 0x256: 0x180a, 0x257: 0x1812, + 0x258: 0x0113, 0x259: 0x0112, 0x25a: 0x0113, 0x25b: 0x0112, 0x25c: 0x0113, 0x25d: 0x0112, + 0x25e: 0x0113, 0x25f: 0x0112, 0x260: 0x0113, 0x261: 0x0112, 0x262: 0x0113, 0x263: 0x0112, + 0x264: 0x0113, 0x265: 0x0112, 0x266: 0x0113, 0x267: 0x0112, 0x268: 0x0113, 0x269: 0x0112, + 0x26a: 0x0113, 0x26b: 0x0112, 0x26c: 0x0113, 0x26d: 0x0112, 0x26e: 0x0113, 0x26f: 0x0112, + 0x270: 0x188a, 0x271: 0x190a, 0x272: 0x0b12, 0x273: 0x5352, 0x274: 0x6253, 0x275: 0x198a, + 0x277: 0x0f13, 0x278: 0x0f12, 0x279: 0x0b13, 0x27a: 0x0113, 0x27b: 0x0112, + 0x27c: 0x0012, 0x27d: 0x4d53, 0x27e: 0x5053, 0x27f: 0x5053, + // Block 0xa, offset 0x280 + 0x280: 0x6852, 0x281: 0x6852, 0x282: 0x6852, 0x283: 0x6852, 0x284: 0x6852, 0x285: 0x6852, + 0x286: 0x6852, 0x287: 0x1a0a, 0x288: 0x0012, 0x28a: 0x0010, + 0x291: 0x0034, + 0x292: 0x0024, 0x293: 0x0024, 0x294: 0x0024, 0x295: 0x0024, 0x296: 0x0034, 0x297: 0x0024, + 0x298: 0x0024, 0x299: 0x0024, 0x29a: 0x0034, 0x29b: 0x0034, 0x29c: 0x0024, 0x29d: 0x0024, + 0x29e: 0x0024, 0x29f: 0x0024, 0x2a0: 0x0024, 0x2a1: 0x0024, 0x2a2: 0x0034, 0x2a3: 0x0034, + 0x2a4: 0x0034, 0x2a5: 0x0034, 0x2a6: 0x0034, 0x2a7: 0x0034, 0x2a8: 0x0024, 0x2a9: 0x0024, + 0x2aa: 0x0034, 0x2ab: 0x0024, 0x2ac: 0x0024, 0x2ad: 0x0034, 0x2ae: 0x0034, 0x2af: 0x0024, + 0x2b0: 0x0034, 0x2b1: 0x0034, 0x2b2: 0x0034, 0x2b3: 0x0034, 0x2b4: 0x0034, 0x2b5: 0x0034, + 0x2b6: 0x0034, 0x2b7: 0x0034, 0x2b8: 0x0034, 0x2b9: 0x0034, 0x2ba: 0x0034, 0x2bb: 0x0034, + 0x2bc: 0x0034, 0x2bd: 0x0034, 0x2bf: 0x0034, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0010, 0x2c1: 0x0010, 0x2c2: 0x0010, 0x2c3: 0x0010, 0x2c4: 0x0010, 0x2c5: 0x0010, + 0x2c6: 0x0010, 0x2c7: 0x0010, 0x2c8: 0x0010, 0x2c9: 0x0014, 0x2ca: 0x0024, 0x2cb: 0x0024, + 0x2cc: 0x0024, 0x2cd: 0x0024, 0x2ce: 0x0024, 0x2cf: 0x0034, 0x2d0: 0x0034, 0x2d1: 0x0034, + 0x2d2: 0x0034, 0x2d3: 0x0034, 0x2d4: 0x0024, 0x2d5: 0x0024, 0x2d6: 0x0024, 0x2d7: 0x0024, + 0x2d8: 0x0024, 0x2d9: 0x0024, 0x2da: 0x0024, 0x2db: 0x0024, 0x2dc: 0x0024, 0x2dd: 0x0024, + 0x2de: 0x0024, 0x2df: 0x0024, 0x2e0: 0x0024, 0x2e1: 0x0024, 0x2e2: 0x0014, 0x2e3: 0x0034, + 0x2e4: 0x0024, 0x2e5: 0x0024, 0x2e6: 0x0034, 0x2e7: 0x0024, 0x2e8: 0x0024, 0x2e9: 0x0034, + 0x2ea: 0x0024, 0x2eb: 0x0024, 0x2ec: 0x0024, 0x2ed: 0x0034, 0x2ee: 0x0034, 0x2ef: 0x0034, + 0x2f0: 0x0034, 0x2f1: 0x0034, 0x2f2: 0x0034, 0x2f3: 0x0024, 0x2f4: 0x0024, 0x2f5: 0x0024, + 0x2f6: 0x0034, 0x2f7: 0x0024, 0x2f8: 0x0024, 0x2f9: 0x0034, 0x2fa: 0x0034, 0x2fb: 0x0024, + 0x2fc: 0x0024, 0x2fd: 0x0024, 0x2fe: 0x0024, 0x2ff: 0x0024, + // Block 0xc, offset 0x300 + 0x300: 0x7053, 0x301: 0x7053, 0x302: 0x7053, 0x303: 0x7053, 0x304: 0x7053, 0x305: 0x7053, + 0x307: 0x7053, + 0x30d: 0x7053, 0x310: 0x1aea, 0x311: 0x1b6a, + 0x312: 0x1bea, 0x313: 0x1c6a, 0x314: 0x1cea, 0x315: 0x1d6a, 0x316: 0x1dea, 0x317: 0x1e6a, + 0x318: 0x1eea, 0x319: 0x1f6a, 0x31a: 0x1fea, 0x31b: 0x206a, 0x31c: 0x20ea, 0x31d: 0x216a, + 0x31e: 0x21ea, 0x31f: 0x226a, 0x320: 0x22ea, 0x321: 0x236a, 0x322: 0x23ea, 0x323: 0x246a, + 0x324: 0x24ea, 0x325: 0x256a, 0x326: 0x25ea, 0x327: 0x266a, 0x328: 0x26ea, 0x329: 0x276a, + 0x32a: 0x27ea, 0x32b: 0x286a, 0x32c: 0x28ea, 0x32d: 0x296a, 0x32e: 0x29ea, 0x32f: 0x2a6a, + 0x330: 0x2aea, 0x331: 0x2b6a, 0x332: 0x2bea, 0x333: 0x2c6a, 0x334: 0x2cea, 0x335: 0x2d6a, + 0x336: 0x2dea, 0x337: 0x2e6a, 0x338: 0x2eea, 0x339: 0x2f6a, 0x33a: 0x2fea, + 0x33c: 0x0015, 0x33d: 0x306a, 0x33e: 0x30ea, 0x33f: 0x316a, + // Block 0xd, offset 0x340 + 0x340: 0x0812, 0x341: 0x0812, 0x342: 0x0812, 0x343: 0x0812, 0x344: 0x0812, 0x345: 0x0812, + 0x348: 0x0813, 0x349: 0x0813, 0x34a: 0x0813, 0x34b: 0x0813, + 0x34c: 0x0813, 0x34d: 0x0813, 0x350: 0x3b1a, 0x351: 0x0812, + 0x352: 0x3bfa, 0x353: 0x0812, 0x354: 0x3d3a, 0x355: 0x0812, 0x356: 0x3e7a, 0x357: 0x0812, + 0x359: 0x0813, 0x35b: 0x0813, 0x35d: 0x0813, + 0x35f: 0x0813, 0x360: 0x0812, 0x361: 0x0812, 0x362: 0x0812, 0x363: 0x0812, + 0x364: 0x0812, 0x365: 0x0812, 0x366: 0x0812, 0x367: 0x0812, 0x368: 0x0813, 0x369: 0x0813, + 0x36a: 0x0813, 0x36b: 0x0813, 0x36c: 0x0813, 0x36d: 0x0813, 0x36e: 0x0813, 0x36f: 0x0813, + 0x370: 0x9252, 0x371: 0x9252, 0x372: 0x9552, 0x373: 0x9552, 0x374: 0x9852, 0x375: 0x9852, + 0x376: 0x9b52, 0x377: 0x9b52, 0x378: 0x9e52, 0x379: 0x9e52, 0x37a: 0xa152, 0x37b: 0xa152, + 0x37c: 0x4d52, 0x37d: 0x4d52, + // Block 0xe, offset 0x380 + 0x380: 0x3fba, 0x381: 0x40aa, 0x382: 0x419a, 0x383: 0x428a, 0x384: 0x437a, 0x385: 0x446a, + 0x386: 0x455a, 0x387: 0x464a, 0x388: 0x4739, 0x389: 0x4829, 0x38a: 0x4919, 0x38b: 0x4a09, + 0x38c: 0x4af9, 0x38d: 0x4be9, 0x38e: 0x4cd9, 0x38f: 0x4dc9, 0x390: 0x4eba, 0x391: 0x4faa, + 0x392: 0x509a, 0x393: 0x518a, 0x394: 0x527a, 0x395: 0x536a, 0x396: 0x545a, 0x397: 0x554a, + 0x398: 0x5639, 0x399: 0x5729, 0x39a: 0x5819, 0x39b: 0x5909, 0x39c: 0x59f9, 0x39d: 0x5ae9, + 0x39e: 0x5bd9, 0x39f: 0x5cc9, 0x3a0: 0x5dba, 0x3a1: 0x5eaa, 0x3a2: 0x5f9a, 0x3a3: 0x608a, + 0x3a4: 0x617a, 0x3a5: 0x626a, 0x3a6: 0x635a, 0x3a7: 0x644a, 0x3a8: 0x6539, 0x3a9: 0x6629, + 0x3aa: 0x6719, 0x3ab: 0x6809, 0x3ac: 0x68f9, 0x3ad: 0x69e9, 0x3ae: 0x6ad9, 0x3af: 0x6bc9, + 0x3b0: 0x0812, 0x3b1: 0x0812, 0x3b2: 0x6cba, 0x3b3: 0x6dca, 0x3b4: 0x6e9a, + 0x3b6: 0x6f7a, 0x3b7: 0x705a, 0x3b8: 0x0813, 0x3b9: 0x0813, 0x3ba: 0x9253, 0x3bb: 0x9253, + 0x3bc: 0x7199, 0x3bd: 0x0004, 0x3be: 0x726a, 0x3bf: 0x0004, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0004, 0x3c1: 0x0004, 0x3c2: 0x72ea, 0x3c3: 0x73fa, 0x3c4: 0x74ca, + 0x3c6: 0x75aa, 0x3c7: 0x768a, 0x3c8: 0x9553, 0x3c9: 0x9553, 0x3ca: 0x9853, 0x3cb: 0x9853, + 0x3cc: 0x77c9, 0x3cd: 0x0004, 0x3ce: 0x0004, 0x3cf: 0x0004, 0x3d0: 0x0812, 0x3d1: 0x0812, + 0x3d2: 0x789a, 0x3d3: 0x79da, 0x3d6: 0x7b1a, 0x3d7: 0x7bfa, + 0x3d8: 0x0813, 0x3d9: 0x0813, 0x3da: 0x9b53, 0x3db: 0x9b53, 0x3dd: 0x0004, + 0x3de: 0x0004, 0x3df: 0x0004, 0x3e0: 0x0812, 0x3e1: 0x0812, 0x3e2: 0x7d3a, 0x3e3: 0x7e7a, + 0x3e4: 0x7fba, 0x3e5: 0x0912, 0x3e6: 0x809a, 0x3e7: 0x817a, 0x3e8: 0x0813, 0x3e9: 0x0813, + 0x3ea: 0xa153, 0x3eb: 0xa153, 0x3ec: 0x0913, 0x3ed: 0x0004, 0x3ee: 0x0004, 0x3ef: 0x0004, + 0x3f2: 0x82ba, 0x3f3: 0x83ca, 0x3f4: 0x849a, + 0x3f6: 0x857a, 0x3f7: 0x865a, 0x3f8: 0x9e53, 0x3f9: 0x9e53, 0x3fa: 0x4d53, 0x3fb: 0x4d53, + 0x3fc: 0x8799, 0x3fd: 0x0004, 0x3fe: 0x0004, + // Block 0x10, offset 0x400 + 0x402: 0x0013, + 0x407: 0x0013, 0x40a: 0x0012, 0x40b: 0x0013, + 0x40c: 0x0013, 0x40d: 0x0013, 0x40e: 0x0012, 0x40f: 0x0012, 0x410: 0x0013, 0x411: 0x0013, + 0x412: 0x0013, 0x413: 0x0012, 0x415: 0x0013, + 0x419: 0x0013, 0x41a: 0x0013, 0x41b: 0x0013, 0x41c: 0x0013, 0x41d: 0x0013, + 0x424: 0x0013, 0x426: 0x886b, 0x428: 0x0013, + 0x42a: 0x88cb, 0x42b: 0x890b, 0x42c: 0x0013, 0x42d: 0x0013, 0x42f: 0x0012, + 0x430: 0x0013, 0x431: 0x0013, 0x432: 0xa453, 0x433: 0x0013, 0x434: 0x0012, 0x435: 0x0010, + 0x436: 0x0010, 0x437: 0x0010, 0x438: 0x0010, 0x439: 0x0012, + 0x43c: 0x0012, 0x43d: 0x0012, 0x43e: 0x0013, 0x43f: 0x0013, + // Block 0x11, offset 0x440 + 0x440: 0x1a13, 0x441: 0x1a13, 0x442: 0x1e13, 0x443: 0x1e13, 0x444: 0x1a13, 0x445: 0x1a13, + 0x446: 0x2613, 0x447: 0x2613, 0x448: 0x2a13, 0x449: 0x2a13, 0x44a: 0x2e13, 0x44b: 0x2e13, + 0x44c: 0x2a13, 0x44d: 0x2a13, 0x44e: 0x2613, 0x44f: 0x2613, 0x450: 0xa752, 0x451: 0xa752, + 0x452: 0xaa52, 0x453: 0xaa52, 0x454: 0xad52, 0x455: 0xad52, 0x456: 0xaa52, 0x457: 0xaa52, + 0x458: 0xa752, 0x459: 0xa752, 0x45a: 0x1a12, 0x45b: 0x1a12, 0x45c: 0x1e12, 0x45d: 0x1e12, + 0x45e: 0x1a12, 0x45f: 0x1a12, 0x460: 0x2612, 0x461: 0x2612, 0x462: 0x2a12, 0x463: 0x2a12, + 0x464: 0x2e12, 0x465: 0x2e12, 0x466: 0x2a12, 0x467: 0x2a12, 0x468: 0x2612, 0x469: 0x2612, + // Block 0x12, offset 0x480 + 0x480: 0x6552, 0x481: 0x6552, 0x482: 0x6552, 0x483: 0x6552, 0x484: 0x6552, 0x485: 0x6552, + 0x486: 0x6552, 0x487: 0x6552, 0x488: 0x6552, 0x489: 0x6552, 0x48a: 0x6552, 0x48b: 0x6552, + 0x48c: 0x6552, 0x48d: 0x6552, 0x48e: 0x6552, 0x48f: 0x6552, 0x490: 0xb052, 0x491: 0xb052, + 0x492: 0xb052, 0x493: 0xb052, 0x494: 0xb052, 0x495: 0xb052, 0x496: 0xb052, 0x497: 0xb052, + 0x498: 0xb052, 0x499: 0xb052, 0x49a: 0xb052, 0x49b: 0xb052, 0x49c: 0xb052, 0x49d: 0xb052, + 0x49e: 0xb052, 0x49f: 0xb052, 0x4a0: 0x0113, 0x4a1: 0x0112, 0x4a2: 0x896b, 0x4a3: 0x8b53, + 0x4a4: 0x89cb, 0x4a5: 0x8a2a, 0x4a6: 0x8a8a, 0x4a7: 0x0f13, 0x4a8: 0x0f12, 0x4a9: 0x0313, + 0x4aa: 0x0312, 0x4ab: 0x0713, 0x4ac: 0x0712, 0x4ad: 0x8aeb, 0x4ae: 0x8b4b, 0x4af: 0x8bab, + 0x4b0: 0x8c0b, 0x4b1: 0x0012, 0x4b2: 0x0113, 0x4b3: 0x0112, 0x4b4: 0x0012, 0x4b5: 0x0313, + 0x4b6: 0x0312, 0x4b7: 0x0012, 0x4b8: 0x0012, 0x4b9: 0x0012, 0x4ba: 0x0012, 0x4bb: 0x0012, + 0x4bc: 0x0015, 0x4bd: 0x0015, 0x4be: 0x8c6b, 0x4bf: 0x8ccb, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0113, 0x4c1: 0x0112, 0x4c2: 0x0113, 0x4c3: 0x0112, 0x4c4: 0x0113, 0x4c5: 0x0112, + 0x4c6: 0x0113, 0x4c7: 0x0112, 0x4c8: 0x0014, 0x4c9: 0x0014, 0x4ca: 0x0014, 0x4cb: 0x0713, + 0x4cc: 0x0712, 0x4cd: 0x8d2b, 0x4ce: 0x0012, 0x4cf: 0x0010, 0x4d0: 0x0113, 0x4d1: 0x0112, + 0x4d2: 0x0113, 0x4d3: 0x0112, 0x4d4: 0x6552, 0x4d5: 0x0012, 0x4d6: 0x0113, 0x4d7: 0x0112, + 0x4d8: 0x0113, 0x4d9: 0x0112, 0x4da: 0x0113, 0x4db: 0x0112, 0x4dc: 0x0113, 0x4dd: 0x0112, + 0x4de: 0x0113, 0x4df: 0x0112, 0x4e0: 0x0113, 0x4e1: 0x0112, 0x4e2: 0x0113, 0x4e3: 0x0112, + 0x4e4: 0x0113, 0x4e5: 0x0112, 0x4e6: 0x0113, 0x4e7: 0x0112, 0x4e8: 0x0113, 0x4e9: 0x0112, + 0x4ea: 0x8d8b, 0x4eb: 0x8deb, 0x4ec: 0x8e4b, 0x4ed: 0x8eab, 0x4ee: 0x8f0b, 0x4ef: 0x0012, + 0x4f0: 0x8f6b, 0x4f1: 0x8fcb, 0x4f2: 0x902b, 0x4f3: 0xb353, 0x4f4: 0x0113, 0x4f5: 0x0112, + 0x4f6: 0x0113, 0x4f7: 0x0112, 0x4f8: 0x0113, 0x4f9: 0x0112, 0x4fa: 0x0113, 0x4fb: 0x0112, + 0x4fc: 0x0113, 0x4fd: 0x0112, 0x4fe: 0x0113, 0x4ff: 0x0112, + // Block 0x14, offset 0x500 + 0x500: 0x90ea, 0x501: 0x916a, 0x502: 0x91ea, 0x503: 0x926a, 0x504: 0x931a, 0x505: 0x93ca, + 0x506: 0x944a, + 0x513: 0x94ca, 0x514: 0x95aa, 0x515: 0x968a, 0x516: 0x976a, 0x517: 0x984a, + 0x51d: 0x0010, + 0x51e: 0x0034, 0x51f: 0x0010, 0x520: 0x0010, 0x521: 0x0010, 0x522: 0x0010, 0x523: 0x0010, + 0x524: 0x0010, 0x525: 0x0010, 0x526: 0x0010, 0x527: 0x0010, 0x528: 0x0010, + 0x52a: 0x0010, 0x52b: 0x0010, 0x52c: 0x0010, 0x52d: 0x0010, 0x52e: 0x0010, 0x52f: 0x0010, + 0x530: 0x0010, 0x531: 0x0010, 0x532: 0x0010, 0x533: 0x0010, 0x534: 0x0010, 0x535: 0x0010, + 0x536: 0x0010, 0x538: 0x0010, 0x539: 0x0010, 0x53a: 0x0010, 0x53b: 0x0010, + 0x53c: 0x0010, 0x53e: 0x0010, + // Block 0x15, offset 0x540 + 0x540: 0x2713, 0x541: 0x2913, 0x542: 0x2b13, 0x543: 0x2913, 0x544: 0x2f13, 0x545: 0x2913, + 0x546: 0x2b13, 0x547: 0x2913, 0x548: 0x2713, 0x549: 0x3913, 0x54a: 0x3b13, + 0x54c: 0x3f13, 0x54d: 0x3913, 0x54e: 0x3b13, 0x54f: 0x3913, 0x550: 0x2713, 0x551: 0x2913, + 0x552: 0x2b13, 0x554: 0x2f13, 0x555: 0x2913, 0x557: 0xbc52, + 0x558: 0xbf52, 0x559: 0xc252, 0x55a: 0xbf52, 0x55b: 0xc552, 0x55c: 0xbf52, 0x55d: 0xc252, + 0x55e: 0xbf52, 0x55f: 0xbc52, 0x560: 0xc852, 0x561: 0xcb52, 0x563: 0xce52, + 0x564: 0xc852, 0x565: 0xcb52, 0x566: 0xc852, 0x567: 0x2712, 0x568: 0x2912, 0x569: 0x2b12, + 0x56a: 0x2912, 0x56b: 0x2f12, 0x56c: 0x2912, 0x56d: 0x2b12, 0x56e: 0x2912, 0x56f: 0x2712, + 0x570: 0x3912, 0x571: 0x3b12, 0x573: 0x3f12, 0x574: 0x3912, 0x575: 0x3b12, + 0x576: 0x3912, 0x577: 0x2712, 0x578: 0x2912, 0x579: 0x2b12, 0x57b: 0x2f12, + 0x57c: 0x2912, + // Block 0x16, offset 0x580 + 0x580: 0x2213, 0x581: 0x2213, 0x582: 0x2613, 0x583: 0x2613, 0x584: 0x2213, 0x585: 0x2213, + 0x586: 0x2e13, 0x587: 0x2e13, 0x588: 0x2213, 0x589: 0x2213, 0x58a: 0x2613, 0x58b: 0x2613, + 0x58c: 0x2213, 0x58d: 0x2213, 0x58e: 0x3e13, 0x58f: 0x3e13, 0x590: 0x2213, 0x591: 0x2213, + 0x592: 0x2613, 0x593: 0x2613, 0x594: 0x2213, 0x595: 0x2213, 0x596: 0x2e13, 0x597: 0x2e13, + 0x598: 0x2213, 0x599: 0x2213, 0x59a: 0x2613, 0x59b: 0x2613, 0x59c: 0x2213, 0x59d: 0x2213, + 0x59e: 0xd153, 0x59f: 0xd153, 0x5a0: 0xd453, 0x5a1: 0xd453, 0x5a2: 0x2212, 0x5a3: 0x2212, + 0x5a4: 0x2612, 0x5a5: 0x2612, 0x5a6: 0x2212, 0x5a7: 0x2212, 0x5a8: 0x2e12, 0x5a9: 0x2e12, + 0x5aa: 0x2212, 0x5ab: 0x2212, 0x5ac: 0x2612, 0x5ad: 0x2612, 0x5ae: 0x2212, 0x5af: 0x2212, + 0x5b0: 0x3e12, 0x5b1: 0x3e12, 0x5b2: 0x2212, 0x5b3: 0x2212, 0x5b4: 0x2612, 0x5b5: 0x2612, + 0x5b6: 0x2212, 0x5b7: 0x2212, 0x5b8: 0x2e12, 0x5b9: 0x2e12, 0x5ba: 0x2212, 0x5bb: 0x2212, + 0x5bc: 0x2612, 0x5bd: 0x2612, 0x5be: 0x2212, 0x5bf: 0x2212, + // Block 0x17, offset 0x5c0 + 0x5c2: 0x0010, + 0x5c7: 0x0010, 0x5c9: 0x0010, 0x5cb: 0x0010, + 0x5cd: 0x0010, 0x5ce: 0x0010, 0x5cf: 0x0010, 0x5d1: 0x0010, + 0x5d2: 0x0010, 0x5d4: 0x0010, 0x5d7: 0x0010, + 0x5d9: 0x0010, 0x5db: 0x0010, 0x5dd: 0x0010, + 0x5df: 0x0010, 0x5e1: 0x0010, 0x5e2: 0x0010, + 0x5e4: 0x0010, 0x5e7: 0x0010, 0x5e8: 0x0010, 0x5e9: 0x0010, + 0x5ea: 0x0010, 0x5ec: 0x0010, 0x5ed: 0x0010, 0x5ee: 0x0010, 0x5ef: 0x0010, + 0x5f0: 0x0010, 0x5f1: 0x0010, 0x5f2: 0x0010, 0x5f4: 0x0010, 0x5f5: 0x0010, + 0x5f6: 0x0010, 0x5f7: 0x0010, 0x5f9: 0x0010, 0x5fa: 0x0010, 0x5fb: 0x0010, + 0x5fc: 0x0010, 0x5fe: 0x0010, +} + +// caseIndex: 27 blocks, 1728 entries, 3456 bytes +// Block 0 is the zero block. +var caseIndex = [1728]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x16, 0xc3: 0x17, 0xc4: 0x18, 0xc5: 0x19, 0xc6: 0x01, 0xc7: 0x02, + 0xc8: 0x1a, 0xc9: 0x03, 0xca: 0x04, 0xcb: 0x1b, 0xcc: 0x1c, 0xcd: 0x05, 0xce: 0x06, 0xcf: 0x07, + 0xd0: 0x1d, 0xd1: 0x1e, 0xd2: 0x1f, 0xd3: 0x20, 0xd4: 0x21, 0xd5: 0x22, 0xd6: 0x08, 0xd7: 0x23, + 0xd8: 0x24, 0xd9: 0x25, 0xda: 0x26, 0xdb: 0x27, 0xdc: 0x28, 0xdd: 0x29, 0xde: 0x2a, 0xdf: 0x2b, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x08, 0xef: 0x09, + 0xf0: 0x16, 0xf3: 0x18, + // Block 0x4, offset 0x100 + 0x120: 0x2c, 0x121: 0x2d, 0x122: 0x2e, 0x123: 0x09, 0x124: 0x2f, 0x125: 0x30, 0x126: 0x31, 0x127: 0x32, + 0x128: 0x33, 0x129: 0x34, 0x12a: 0x35, 0x12b: 0x36, 0x12c: 0x37, 0x12d: 0x38, 0x12e: 0x39, 0x12f: 0x3a, + 0x130: 0x3b, 0x131: 0x3c, 0x132: 0x3d, 0x133: 0x3e, 0x134: 0x3f, 0x135: 0x40, 0x136: 0x41, 0x137: 0x42, + 0x138: 0x43, 0x139: 0x44, 0x13a: 0x45, 0x13b: 0x46, 0x13c: 0x47, 0x13d: 0x48, 0x13e: 0x49, 0x13f: 0x4a, + // Block 0x5, offset 0x140 + 0x140: 0x4b, 0x141: 0x4c, 0x142: 0x4d, 0x143: 0x0a, 0x144: 0x26, 0x145: 0x26, 0x146: 0x26, 0x147: 0x26, + 0x148: 0x26, 0x149: 0x4e, 0x14a: 0x4f, 0x14b: 0x50, 0x14c: 0x51, 0x14d: 0x52, 0x14e: 0x53, 0x14f: 0x54, + 0x150: 0x55, 0x151: 0x26, 0x152: 0x26, 0x153: 0x26, 0x154: 0x26, 0x155: 0x26, 0x156: 0x26, 0x157: 0x26, + 0x158: 0x26, 0x159: 0x56, 0x15a: 0x57, 0x15b: 0x58, 0x15c: 0x59, 0x15d: 0x5a, 0x15e: 0x5b, 0x15f: 0x5c, + 0x160: 0x5d, 0x161: 0x5e, 0x162: 0x5f, 0x163: 0x60, 0x164: 0x61, 0x165: 0x62, 0x167: 0x63, + 0x168: 0x64, 0x169: 0x65, 0x16a: 0x66, 0x16b: 0x67, 0x16c: 0x68, 0x16d: 0x69, 0x16e: 0x6a, 0x16f: 0x6b, + 0x170: 0x6c, 0x171: 0x6d, 0x172: 0x6e, 0x173: 0x6f, 0x174: 0x70, 0x175: 0x71, 0x176: 0x72, 0x177: 0x73, + 0x178: 0x74, 0x179: 0x74, 0x17a: 0x75, 0x17b: 0x74, 0x17c: 0x76, 0x17d: 0x0b, 0x17e: 0x0c, 0x17f: 0x0d, + // Block 0x6, offset 0x180 + 0x180: 0x77, 0x181: 0x78, 0x182: 0x79, 0x183: 0x7a, 0x184: 0x0e, 0x185: 0x7b, 0x186: 0x7c, + 0x192: 0x7d, 0x193: 0x0f, + 0x1b0: 0x7e, 0x1b1: 0x10, 0x1b2: 0x74, 0x1b3: 0x7f, 0x1b4: 0x80, 0x1b5: 0x81, 0x1b6: 0x82, 0x1b7: 0x83, + 0x1b8: 0x84, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x85, 0x1c2: 0x86, 0x1c3: 0x87, 0x1c4: 0x88, 0x1c5: 0x26, 0x1c6: 0x89, + // Block 0x8, offset 0x200 + 0x200: 0x8a, 0x201: 0x26, 0x202: 0x26, 0x203: 0x26, 0x204: 0x26, 0x205: 0x26, 0x206: 0x26, 0x207: 0x26, + 0x208: 0x26, 0x209: 0x26, 0x20a: 0x26, 0x20b: 0x26, 0x20c: 0x26, 0x20d: 0x26, 0x20e: 0x26, 0x20f: 0x26, + 0x210: 0x26, 0x211: 0x26, 0x212: 0x8b, 0x213: 0x8c, 0x214: 0x26, 0x215: 0x26, 0x216: 0x26, 0x217: 0x26, + 0x218: 0x8d, 0x219: 0x8e, 0x21a: 0x8f, 0x21b: 0x90, 0x21c: 0x91, 0x21d: 0x92, 0x21e: 0x11, 0x21f: 0x93, + 0x220: 0x94, 0x221: 0x95, 0x222: 0x26, 0x223: 0x96, 0x224: 0x97, 0x225: 0x98, 0x226: 0x99, 0x227: 0x9a, + 0x228: 0x9b, 0x229: 0x9c, 0x22a: 0x9d, 0x22b: 0x9e, 0x22c: 0x9f, 0x22d: 0xa0, 0x22e: 0xa1, 0x22f: 0xa2, + 0x230: 0x26, 0x231: 0x26, 0x232: 0x26, 0x233: 0x26, 0x234: 0x26, 0x235: 0x26, 0x236: 0x26, 0x237: 0x26, + 0x238: 0x26, 0x239: 0x26, 0x23a: 0x26, 0x23b: 0x26, 0x23c: 0x26, 0x23d: 0x26, 0x23e: 0x26, 0x23f: 0x26, + // Block 0x9, offset 0x240 + 0x240: 0x26, 0x241: 0x26, 0x242: 0x26, 0x243: 0x26, 0x244: 0x26, 0x245: 0x26, 0x246: 0x26, 0x247: 0x26, + 0x248: 0x26, 0x249: 0x26, 0x24a: 0x26, 0x24b: 0x26, 0x24c: 0x26, 0x24d: 0x26, 0x24e: 0x26, 0x24f: 0x26, + 0x250: 0x26, 0x251: 0x26, 0x252: 0x26, 0x253: 0x26, 0x254: 0x26, 0x255: 0x26, 0x256: 0x26, 0x257: 0x26, + 0x258: 0x26, 0x259: 0x26, 0x25a: 0x26, 0x25b: 0x26, 0x25c: 0x26, 0x25d: 0x26, 0x25e: 0x26, 0x25f: 0x26, + 0x260: 0x26, 0x261: 0x26, 0x262: 0x26, 0x263: 0x26, 0x264: 0x26, 0x265: 0x26, 0x266: 0x26, 0x267: 0x26, + 0x268: 0x26, 0x269: 0x26, 0x26a: 0x26, 0x26b: 0x26, 0x26c: 0x26, 0x26d: 0x26, 0x26e: 0x26, 0x26f: 0x26, + 0x270: 0x26, 0x271: 0x26, 0x272: 0x26, 0x273: 0x26, 0x274: 0x26, 0x275: 0x26, 0x276: 0x26, 0x277: 0x26, + 0x278: 0x26, 0x279: 0x26, 0x27a: 0x26, 0x27b: 0x26, 0x27c: 0x26, 0x27d: 0x26, 0x27e: 0x26, 0x27f: 0x26, + // Block 0xa, offset 0x280 + 0x280: 0x26, 0x281: 0x26, 0x282: 0x26, 0x283: 0x26, 0x284: 0x26, 0x285: 0x26, 0x286: 0x26, 0x287: 0x26, + 0x288: 0x26, 0x289: 0x26, 0x28a: 0x26, 0x28b: 0x26, 0x28c: 0x26, 0x28d: 0x26, 0x28e: 0x26, 0x28f: 0x26, + 0x290: 0x26, 0x291: 0x26, 0x292: 0x26, 0x293: 0x26, 0x294: 0x26, 0x295: 0x26, 0x296: 0x26, 0x297: 0x26, + 0x298: 0x26, 0x299: 0x26, 0x29a: 0x26, 0x29b: 0x26, 0x29c: 0x26, 0x29d: 0x26, 0x29e: 0xa3, 0x29f: 0xa4, + // Block 0xb, offset 0x2c0 + 0x2ec: 0x12, 0x2ed: 0xa5, 0x2ee: 0xa6, 0x2ef: 0xa7, + 0x2f0: 0x26, 0x2f1: 0x26, 0x2f2: 0x26, 0x2f3: 0x26, 0x2f4: 0xa8, 0x2f5: 0xa9, 0x2f6: 0xaa, 0x2f7: 0xab, + 0x2f8: 0xac, 0x2f9: 0xad, 0x2fa: 0x26, 0x2fb: 0xae, 0x2fc: 0xaf, 0x2fd: 0xb0, 0x2fe: 0xb1, 0x2ff: 0xb2, + // Block 0xc, offset 0x300 + 0x300: 0xb3, 0x301: 0xb4, 0x302: 0x26, 0x303: 0xb5, 0x305: 0xb6, 0x307: 0xb7, + 0x30a: 0xb8, 0x30b: 0xb9, 0x30c: 0xba, 0x30d: 0xbb, 0x30e: 0xbc, 0x30f: 0xbd, + 0x310: 0xbe, 0x311: 0xbf, 0x312: 0xc0, 0x313: 0xc1, 0x314: 0xc2, 0x315: 0xc3, 0x316: 0x13, + 0x318: 0x26, 0x319: 0x26, 0x31a: 0x26, 0x31b: 0x26, 0x31c: 0xc4, 0x31d: 0xc5, 0x31e: 0xc6, + 0x320: 0xc7, 0x321: 0xc8, 0x322: 0xc9, 0x323: 0xca, 0x324: 0xcb, 0x326: 0xcc, + 0x328: 0xcd, 0x329: 0xce, 0x32a: 0xcf, 0x32b: 0xd0, 0x32c: 0x60, 0x32d: 0xd1, 0x32e: 0xd2, + 0x330: 0x26, 0x331: 0xd3, 0x332: 0xd4, 0x333: 0xd5, 0x334: 0xd6, + 0x33a: 0xd7, 0x33b: 0xd8, 0x33c: 0xd9, 0x33d: 0xda, 0x33e: 0xdb, 0x33f: 0xdc, + // Block 0xd, offset 0x340 + 0x340: 0xdd, 0x341: 0xde, 0x342: 0xdf, 0x343: 0xe0, 0x344: 0xe1, 0x345: 0xe2, 0x346: 0xe3, 0x347: 0xe4, + 0x348: 0xe5, 0x349: 0xe6, 0x34a: 0xe7, 0x34b: 0xe8, 0x34c: 0xe9, 0x34d: 0xea, + 0x350: 0xeb, 0x351: 0xec, 0x352: 0xed, 0x353: 0xee, 0x356: 0xef, 0x357: 0xf0, + 0x358: 0xf1, 0x359: 0xf2, 0x35a: 0xf3, 0x35b: 0xf4, 0x35c: 0xf5, + 0x360: 0xf6, 0x362: 0xf7, 0x363: 0xf8, 0x364: 0xf9, 0x365: 0xfa, 0x366: 0xfb, 0x367: 0xfc, + 0x368: 0xfd, 0x369: 0xfe, 0x36a: 0xff, 0x36b: 0x100, + 0x370: 0x101, 0x371: 0x102, 0x372: 0x103, 0x374: 0x104, 0x375: 0x105, 0x376: 0x106, + 0x37b: 0x107, 0x37c: 0x108, 0x37d: 0x109, 0x37e: 0x10a, + // Block 0xe, offset 0x380 + 0x380: 0x26, 0x381: 0x26, 0x382: 0x26, 0x383: 0x26, 0x384: 0x26, 0x385: 0x26, 0x386: 0x26, 0x387: 0x26, + 0x388: 0x26, 0x389: 0x26, 0x38a: 0x26, 0x38b: 0x26, 0x38c: 0x26, 0x38d: 0x26, 0x38e: 0x10b, + 0x390: 0x26, 0x391: 0x10c, 0x392: 0x26, 0x393: 0x26, 0x394: 0x26, 0x395: 0x10d, + 0x3be: 0xa9, 0x3bf: 0x10e, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x26, 0x3c1: 0x26, 0x3c2: 0x26, 0x3c3: 0x26, 0x3c4: 0x26, 0x3c5: 0x26, 0x3c6: 0x26, 0x3c7: 0x26, + 0x3c8: 0x26, 0x3c9: 0x26, 0x3ca: 0x26, 0x3cb: 0x26, 0x3cc: 0x26, 0x3cd: 0x26, 0x3ce: 0x26, 0x3cf: 0x26, + 0x3d0: 0x10f, 0x3d1: 0x110, + // Block 0x10, offset 0x400 + 0x410: 0x26, 0x411: 0x26, 0x412: 0x26, 0x413: 0x26, 0x414: 0x26, 0x415: 0x26, 0x416: 0x26, 0x417: 0x26, + 0x418: 0x26, 0x419: 0x111, + // Block 0x11, offset 0x440 + 0x460: 0x26, 0x461: 0x26, 0x462: 0x26, 0x463: 0x26, 0x464: 0x26, 0x465: 0x26, 0x466: 0x26, 0x467: 0x26, + 0x468: 0x100, 0x469: 0x112, 0x46a: 0x113, 0x46b: 0x114, 0x46c: 0x115, 0x46d: 0x116, 0x46e: 0x117, + 0x479: 0x118, 0x47c: 0x26, 0x47d: 0x119, 0x47e: 0x11a, 0x47f: 0x11b, + // Block 0x12, offset 0x480 + 0x4bf: 0x11c, + // Block 0x13, offset 0x4c0 + 0x4f0: 0x26, 0x4f1: 0x11d, 0x4f2: 0x11e, + // Block 0x14, offset 0x500 + 0x53c: 0x11f, 0x53d: 0x120, + // Block 0x15, offset 0x540 + 0x545: 0x121, 0x546: 0x122, + 0x549: 0x123, + 0x550: 0x124, 0x551: 0x125, 0x552: 0x126, 0x553: 0x127, 0x554: 0x128, 0x555: 0x129, 0x556: 0x12a, 0x557: 0x12b, + 0x558: 0x12c, 0x559: 0x12d, 0x55a: 0x12e, 0x55b: 0x12f, 0x55c: 0x130, 0x55d: 0x131, 0x55e: 0x132, 0x55f: 0x133, + 0x568: 0x134, 0x569: 0x135, 0x56a: 0x136, + 0x57c: 0x137, + // Block 0x16, offset 0x580 + 0x580: 0x138, 0x581: 0x139, 0x582: 0x13a, 0x584: 0x13b, 0x585: 0x13c, + 0x58a: 0x13d, 0x58b: 0x13e, + 0x593: 0x13f, + 0x59f: 0x140, + 0x5a0: 0x26, 0x5a1: 0x26, 0x5a2: 0x26, 0x5a3: 0x141, 0x5a4: 0x14, 0x5a5: 0x142, + 0x5b8: 0x143, 0x5b9: 0x15, 0x5ba: 0x144, + // Block 0x17, offset 0x5c0 + 0x5c4: 0x145, 0x5c5: 0x146, 0x5c6: 0x147, + 0x5cf: 0x148, + 0x5ef: 0x149, + // Block 0x18, offset 0x600 + 0x610: 0x0a, 0x611: 0x0b, 0x612: 0x0c, 0x613: 0x0d, 0x614: 0x0e, 0x616: 0x0f, + 0x61a: 0x10, 0x61b: 0x11, 0x61c: 0x12, 0x61d: 0x13, 0x61e: 0x14, 0x61f: 0x15, + // Block 0x19, offset 0x640 + 0x640: 0x14a, 0x641: 0x14b, 0x644: 0x14b, 0x645: 0x14b, 0x646: 0x14b, 0x647: 0x14c, + // Block 0x1a, offset 0x680 + 0x6a0: 0x17, +} + +// sparseOffsets: 312 entries, 624 bytes +var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x34, 0x37, 0x3b, 0x3e, 0x42, 0x4c, 0x4e, 0x57, 0x5e, 0x63, 0x71, 0x72, 0x80, 0x8f, 0x99, 0x9c, 0xa3, 0xab, 0xaf, 0xb7, 0xbd, 0xcb, 0xd6, 0xe3, 0xee, 0xfa, 0x104, 0x110, 0x11b, 0x127, 0x133, 0x13b, 0x145, 0x150, 0x15b, 0x167, 0x16d, 0x178, 0x17e, 0x186, 0x189, 0x18e, 0x192, 0x196, 0x19d, 0x1a6, 0x1ae, 0x1af, 0x1b8, 0x1bf, 0x1c7, 0x1cd, 0x1d2, 0x1d6, 0x1d9, 0x1db, 0x1de, 0x1e3, 0x1e4, 0x1e6, 0x1e8, 0x1ea, 0x1f1, 0x1f6, 0x1fa, 0x203, 0x206, 0x209, 0x20f, 0x210, 0x21b, 0x21c, 0x21d, 0x222, 0x22f, 0x238, 0x23e, 0x246, 0x24f, 0x258, 0x261, 0x266, 0x269, 0x274, 0x282, 0x284, 0x28b, 0x28f, 0x29b, 0x29c, 0x2a7, 0x2af, 0x2b7, 0x2bd, 0x2be, 0x2cc, 0x2d1, 0x2d4, 0x2d9, 0x2dd, 0x2e3, 0x2e8, 0x2eb, 0x2f0, 0x2f5, 0x2f6, 0x2fc, 0x2fe, 0x2ff, 0x301, 0x303, 0x306, 0x307, 0x309, 0x30c, 0x312, 0x316, 0x318, 0x31d, 0x324, 0x334, 0x33e, 0x33f, 0x348, 0x34c, 0x351, 0x359, 0x35f, 0x365, 0x36f, 0x374, 0x37d, 0x383, 0x38c, 0x390, 0x398, 0x39a, 0x39c, 0x39f, 0x3a1, 0x3a3, 0x3a4, 0x3a5, 0x3a7, 0x3a9, 0x3af, 0x3b4, 0x3b6, 0x3bd, 0x3c0, 0x3c2, 0x3c8, 0x3cd, 0x3cf, 0x3d0, 0x3d1, 0x3d2, 0x3d4, 0x3d6, 0x3d8, 0x3db, 0x3dd, 0x3e0, 0x3e8, 0x3eb, 0x3ef, 0x3f7, 0x3f9, 0x409, 0x40a, 0x40c, 0x411, 0x417, 0x419, 0x41a, 0x41c, 0x41e, 0x420, 0x42d, 0x42e, 0x42f, 0x433, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43c, 0x43f, 0x440, 0x443, 0x44a, 0x450, 0x452, 0x456, 0x45e, 0x464, 0x468, 0x46f, 0x473, 0x477, 0x480, 0x48a, 0x48c, 0x492, 0x498, 0x4a2, 0x4ac, 0x4ae, 0x4b7, 0x4bd, 0x4c3, 0x4c9, 0x4cc, 0x4d2, 0x4d5, 0x4de, 0x4df, 0x4e6, 0x4ea, 0x4eb, 0x4ee, 0x4f8, 0x4fb, 0x4fd, 0x504, 0x50c, 0x512, 0x519, 0x51a, 0x520, 0x523, 0x52b, 0x532, 0x53c, 0x544, 0x547, 0x54c, 0x550, 0x551, 0x552, 0x553, 0x554, 0x555, 0x557, 0x55a, 0x55b, 0x55e, 0x55f, 0x562, 0x564, 0x568, 0x569, 0x56b, 0x56e, 0x570, 0x573, 0x576, 0x578, 0x57d, 0x57f, 0x580, 0x585, 0x589, 0x58a, 0x58d, 0x591, 0x59c, 0x5a0, 0x5a8, 0x5ad, 0x5b1, 0x5b4, 0x5b8, 0x5bb, 0x5be, 0x5c3, 0x5c7, 0x5cb, 0x5cf, 0x5d3, 0x5d5, 0x5d7, 0x5da, 0x5de, 0x5e4, 0x5e5, 0x5e6, 0x5e9, 0x5eb, 0x5ed, 0x5f0, 0x5f5, 0x5f9, 0x5fb, 0x601, 0x60a, 0x60f, 0x610, 0x613, 0x614, 0x615, 0x616, 0x618, 0x619, 0x61a} + +// sparseValues: 1562 entries, 6248 bytes +var sparseValues = [1562]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0004, lo: 0xa8, hi: 0xa8}, + {value: 0x0012, lo: 0xaa, hi: 0xaa}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0004, lo: 0xaf, hi: 0xaf}, + {value: 0x0004, lo: 0xb4, hi: 0xb4}, + {value: 0x001a, lo: 0xb5, hi: 0xb5}, + {value: 0x0054, lo: 0xb7, hi: 0xb7}, + {value: 0x0004, lo: 0xb8, hi: 0xb8}, + {value: 0x0012, lo: 0xba, hi: 0xba}, + // Block 0x1, offset 0x9 + {value: 0x2013, lo: 0x80, hi: 0x96}, + {value: 0x2013, lo: 0x98, hi: 0x9e}, + {value: 0x009a, lo: 0x9f, hi: 0x9f}, + {value: 0x2012, lo: 0xa0, hi: 0xb6}, + {value: 0x2012, lo: 0xb8, hi: 0xbe}, + {value: 0x0252, lo: 0xbf, hi: 0xbf}, + // Block 0x2, offset 0xf + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x011b, lo: 0xb0, hi: 0xb0}, + {value: 0x019a, lo: 0xb1, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xb7}, + {value: 0x0012, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x0553, lo: 0xbf, hi: 0xbf}, + // Block 0x3, offset 0x18 + {value: 0x0552, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x01da, lo: 0x89, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xb7}, + {value: 0x0253, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x028a, lo: 0xbf, hi: 0xbf}, + // Block 0x4, offset 0x24 + {value: 0x0117, lo: 0x80, hi: 0x9f}, + {value: 0x2f53, lo: 0xa0, hi: 0xa0}, + {value: 0x0012, lo: 0xa1, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xb3}, + {value: 0x0012, lo: 0xb4, hi: 0xb9}, + {value: 0x090b, lo: 0xba, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x2953, lo: 0xbd, hi: 0xbd}, + {value: 0x098b, lo: 0xbe, hi: 0xbe}, + {value: 0x0a0a, lo: 0xbf, hi: 0xbf}, + // Block 0x5, offset 0x2e + {value: 0x0015, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x97}, + {value: 0x0004, lo: 0x98, hi: 0x9d}, + {value: 0x0014, lo: 0x9e, hi: 0x9f}, + {value: 0x0015, lo: 0xa0, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0024, lo: 0x80, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbf}, + // Block 0x7, offset 0x37 + {value: 0x6553, lo: 0x80, hi: 0x8f}, + {value: 0x2013, lo: 0x90, hi: 0x9f}, + {value: 0x5f53, lo: 0xa0, hi: 0xaf}, + {value: 0x2012, lo: 0xb0, hi: 0xbf}, + // Block 0x8, offset 0x3b + {value: 0x5f52, lo: 0x80, hi: 0x8f}, + {value: 0x6552, lo: 0x90, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x9, offset 0x3e + {value: 0x0117, lo: 0x80, hi: 0x81}, + {value: 0x0024, lo: 0x83, hi: 0x87}, + {value: 0x0014, lo: 0x88, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xbf}, + // Block 0xa, offset 0x42 + {value: 0x0f13, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x0316, lo: 0x89, hi: 0x8a}, + {value: 0x0716, lo: 0x8b, hi: 0x8c}, + {value: 0x0316, lo: 0x8d, hi: 0x8e}, + {value: 0x0f12, lo: 0x8f, hi: 0x8f}, + {value: 0x0117, lo: 0x90, hi: 0xbf}, + // Block 0xb, offset 0x4c + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x6553, lo: 0xb1, hi: 0xbf}, + // Block 0xc, offset 0x4e + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6853, lo: 0x90, hi: 0x96}, + {value: 0x0014, lo: 0x99, hi: 0x99}, + {value: 0x0010, lo: 0x9a, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0054, lo: 0x9f, hi: 0x9f}, + {value: 0x0012, lo: 0xa0, hi: 0xa0}, + {value: 0x6552, lo: 0xa1, hi: 0xaf}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0xd, offset 0x57 + {value: 0x0034, lo: 0x81, hi: 0x82}, + {value: 0x0024, lo: 0x84, hi: 0x84}, + {value: 0x0034, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0xaa}, + {value: 0x0010, lo: 0xaf, hi: 0xb3}, + {value: 0x0054, lo: 0xb4, hi: 0xb4}, + // Block 0xe, offset 0x5e + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0024, lo: 0x90, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0014, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xf, offset 0x63 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x8a}, + {value: 0x0034, lo: 0x8b, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9c}, + {value: 0x0024, lo: 0x9d, hi: 0x9e}, + {value: 0x0034, lo: 0x9f, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x10, offset 0x71 + {value: 0x0010, lo: 0x80, hi: 0xbf}, + // Block 0x11, offset 0x72 + {value: 0x0010, lo: 0x80, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x0024, lo: 0x9f, hi: 0xa2}, + {value: 0x0034, lo: 0xa3, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa8}, + {value: 0x0034, lo: 0xaa, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbc}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x12, offset 0x80 + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0034, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x92, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + {value: 0x0034, lo: 0xb1, hi: 0xb1}, + {value: 0x0024, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbd}, + {value: 0x0034, lo: 0xbe, hi: 0xbe}, + {value: 0x0024, lo: 0xbf, hi: 0xbf}, + // Block 0x13, offset 0x8f + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0024, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x88}, + {value: 0x0024, lo: 0x89, hi: 0x8a}, + {value: 0x0010, lo: 0x8d, hi: 0xbf}, + // Block 0x14, offset 0x99 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0014, lo: 0xa6, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x15, offset 0x9c + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xb1}, + {value: 0x0034, lo: 0xb2, hi: 0xb2}, + {value: 0x0024, lo: 0xb3, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + // Block 0x16, offset 0xa3 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x99}, + {value: 0x0014, lo: 0x9a, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0xa3}, + {value: 0x0014, lo: 0xa4, hi: 0xa4}, + {value: 0x0024, lo: 0xa5, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xad}, + // Block 0x17, offset 0xab + {value: 0x0010, lo: 0x80, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x9b}, + {value: 0x0010, lo: 0xa0, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x18, offset 0xaf + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0004, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x8e}, + {value: 0x0014, lo: 0x90, hi: 0x91}, + {value: 0x0024, lo: 0x98, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x9b}, + {value: 0x0024, lo: 0x9c, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x19, offset 0xb7 + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1a, offset 0xbd + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x98, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xbf}, + // Block 0x1b, offset 0xcb + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb6, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1c, offset 0xd6 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xb1}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + {value: 0x0024, lo: 0xbe, hi: 0xbe}, + // Block 0x1d, offset 0xe3 + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + {value: 0x0010, lo: 0xb8, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x1e, offset 0xee + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x99, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0x1f, offset 0xfa + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x20, offset 0x104 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x85}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xbf}, + // Block 0x21, offset 0x110 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x22, offset 0x11b + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x23, offset 0x127 + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0010, lo: 0xa8, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x24, offset 0x133 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x25, offset 0x13b + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x83}, + {value: 0x0014, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbf}, + // Block 0x26, offset 0x145 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x88}, + {value: 0x0014, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9a}, + {value: 0x0010, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x27, offset 0x150 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x28, offset 0x15b + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x9d, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb3}, + // Block 0x29, offset 0x167 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x2a, offset 0x16d + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x94, hi: 0x97}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xba, hi: 0xbf}, + // Block 0x2b, offset 0x178 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x96}, + {value: 0x0010, lo: 0x9a, hi: 0xb1}, + {value: 0x0010, lo: 0xb3, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x2c, offset 0x17e + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x94}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9f}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + // Block 0x2d, offset 0x186 + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xba}, + // Block 0x2e, offset 0x189 + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x2f, offset 0x18e + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xba}, + {value: 0x0014, lo: 0xbb, hi: 0xbc}, + // Block 0x30, offset 0x192 + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x31, offset 0x196 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0034, lo: 0x98, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0034, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x32, offset 0x19d + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0x89, hi: 0xac}, + {value: 0x0034, lo: 0xb1, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xba, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x33, offset 0x1a6 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0024, lo: 0x82, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x86, hi: 0x87}, + {value: 0x0010, lo: 0x88, hi: 0x8c}, + {value: 0x0014, lo: 0x8d, hi: 0x97}, + {value: 0x0014, lo: 0x99, hi: 0xbc}, + // Block 0x34, offset 0x1ae + {value: 0x0034, lo: 0x86, hi: 0x86}, + // Block 0x35, offset 0x1af + {value: 0x0010, lo: 0xab, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbc}, + {value: 0x0014, lo: 0xbd, hi: 0xbe}, + // Block 0x36, offset 0x1b8 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x96, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x99}, + {value: 0x0014, lo: 0x9e, hi: 0xa0}, + {value: 0x0010, lo: 0xa2, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xad}, + {value: 0x0014, lo: 0xb1, hi: 0xb4}, + // Block 0x37, offset 0x1bf + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x6c53, lo: 0xa0, hi: 0xbf}, + // Block 0x38, offset 0x1c7 + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x9a, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x39, offset 0x1cd + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb5}, + {value: 0x0010, lo: 0xb8, hi: 0xbe}, + // Block 0x3a, offset 0x1d2 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x82, hi: 0x85}, + {value: 0x0010, lo: 0x88, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3b, offset 0x1d6 + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3c, offset 0x1d9 + {value: 0x0010, lo: 0x80, hi: 0x9a}, + {value: 0x0024, lo: 0x9d, hi: 0x9f}, + // Block 0x3d, offset 0x1db + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x7453, lo: 0xa0, hi: 0xaf}, + {value: 0x7853, lo: 0xb0, hi: 0xbf}, + // Block 0x3e, offset 0x1de + {value: 0x7c53, lo: 0x80, hi: 0x8f}, + {value: 0x8053, lo: 0x90, hi: 0x9f}, + {value: 0x7c53, lo: 0xa0, hi: 0xaf}, + {value: 0x0813, lo: 0xb0, hi: 0xb5}, + {value: 0x0892, lo: 0xb8, hi: 0xbd}, + // Block 0x3f, offset 0x1e3 + {value: 0x0010, lo: 0x81, hi: 0xbf}, + // Block 0x40, offset 0x1e4 + {value: 0x0010, lo: 0x80, hi: 0xac}, + {value: 0x0010, lo: 0xaf, hi: 0xbf}, + // Block 0x41, offset 0x1e6 + {value: 0x0010, lo: 0x81, hi: 0x9a}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x42, offset 0x1e8 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb8}, + // Block 0x43, offset 0x1ea + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0034, lo: 0x94, hi: 0x94}, + {value: 0x0030, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x9f, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + {value: 0x0030, lo: 0xb4, hi: 0xb4}, + // Block 0x44, offset 0x1f1 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0010, lo: 0xa0, hi: 0xac}, + {value: 0x0010, lo: 0xae, hi: 0xb0}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + // Block 0x45, offset 0x1f6 + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x46, offset 0x1fa + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x89, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0014, lo: 0x93, hi: 0x93}, + {value: 0x0004, lo: 0x97, hi: 0x97}, + {value: 0x0024, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0x47, offset 0x203 + {value: 0x0014, lo: 0x8b, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x48, offset 0x206 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb8}, + // Block 0x49, offset 0x209 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x4a, offset 0x20f + {value: 0x0010, lo: 0x80, hi: 0xb5}, + // Block 0x4b, offset 0x210 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0014, lo: 0xa0, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb3, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbb}, + // Block 0x4c, offset 0x21b + {value: 0x0010, lo: 0x86, hi: 0x8f}, + // Block 0x4d, offset 0x21c + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x4e, offset 0x21d + {value: 0x0010, lo: 0x80, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0014, lo: 0x9b, hi: 0x9b}, + // Block 0x4f, offset 0x222 + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x9e}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xac}, + {value: 0x0010, lo: 0xad, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xbc}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x50, offset 0x22f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xa7, hi: 0xa7}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + {value: 0x0034, lo: 0xb5, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbc}, + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x51, offset 0x238 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0024, lo: 0x81, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x84}, + {value: 0x0024, lo: 0x85, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0024, lo: 0x8b, hi: 0x8e}, + // Block 0x52, offset 0x23e + {value: 0x0014, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x53, offset 0x246 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0030, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xab, hi: 0xab}, + {value: 0x0034, lo: 0xac, hi: 0xac}, + {value: 0x0024, lo: 0xad, hi: 0xb3}, + // Block 0x54, offset 0x24f + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0030, lo: 0xaa, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbf}, + // Block 0x55, offset 0x258 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0030, lo: 0xb2, hi: 0xb3}, + // Block 0x56, offset 0x261 + {value: 0x0010, lo: 0x80, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + // Block 0x57, offset 0x266 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8d, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x58, offset 0x269 + {value: 0x31ea, lo: 0x80, hi: 0x80}, + {value: 0x326a, lo: 0x81, hi: 0x81}, + {value: 0x32ea, lo: 0x82, hi: 0x82}, + {value: 0x336a, lo: 0x83, hi: 0x83}, + {value: 0x33ea, lo: 0x84, hi: 0x84}, + {value: 0x346a, lo: 0x85, hi: 0x85}, + {value: 0x34ea, lo: 0x86, hi: 0x86}, + {value: 0x356a, lo: 0x87, hi: 0x87}, + {value: 0x35ea, lo: 0x88, hi: 0x88}, + {value: 0x8353, lo: 0x90, hi: 0xba}, + {value: 0x8353, lo: 0xbd, hi: 0xbf}, + // Block 0x59, offset 0x274 + {value: 0x0024, lo: 0x90, hi: 0x92}, + {value: 0x0034, lo: 0x94, hi: 0x99}, + {value: 0x0024, lo: 0x9a, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9f}, + {value: 0x0024, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0034, lo: 0xa2, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xb3}, + {value: 0x0024, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb7}, + {value: 0x0024, lo: 0xb8, hi: 0xb9}, + {value: 0x0010, lo: 0xba, hi: 0xba}, + // Block 0x5a, offset 0x282 + {value: 0x0012, lo: 0x80, hi: 0xab}, + {value: 0x0015, lo: 0xac, hi: 0xbf}, + // Block 0x5b, offset 0x284 + {value: 0x0015, lo: 0x80, hi: 0xaa}, + {value: 0x0012, lo: 0xab, hi: 0xb7}, + {value: 0x0015, lo: 0xb8, hi: 0xb8}, + {value: 0x8752, lo: 0xb9, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xbc}, + {value: 0x8b52, lo: 0xbd, hi: 0xbd}, + {value: 0x0012, lo: 0xbe, hi: 0xbf}, + // Block 0x5c, offset 0x28b + {value: 0x0012, lo: 0x80, hi: 0x8d}, + {value: 0x8f52, lo: 0x8e, hi: 0x8e}, + {value: 0x0012, lo: 0x8f, hi: 0x9a}, + {value: 0x0015, lo: 0x9b, hi: 0xbf}, + // Block 0x5d, offset 0x28f + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0024, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbb}, + {value: 0x0034, lo: 0xbc, hi: 0xbd}, + {value: 0x0024, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x5e, offset 0x29b + {value: 0x0117, lo: 0x80, hi: 0xbf}, + // Block 0x5f, offset 0x29c + {value: 0x0117, lo: 0x80, hi: 0x95}, + {value: 0x369a, lo: 0x96, hi: 0x96}, + {value: 0x374a, lo: 0x97, hi: 0x97}, + {value: 0x37fa, lo: 0x98, hi: 0x98}, + {value: 0x38aa, lo: 0x99, hi: 0x99}, + {value: 0x395a, lo: 0x9a, hi: 0x9a}, + {value: 0x3a0a, lo: 0x9b, hi: 0x9b}, + {value: 0x0012, lo: 0x9c, hi: 0x9d}, + {value: 0x3abb, lo: 0x9e, hi: 0x9e}, + {value: 0x0012, lo: 0x9f, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x60, offset 0x2a7 + {value: 0x0812, lo: 0x80, hi: 0x87}, + {value: 0x0813, lo: 0x88, hi: 0x8f}, + {value: 0x0812, lo: 0x90, hi: 0x95}, + {value: 0x0813, lo: 0x98, hi: 0x9d}, + {value: 0x0812, lo: 0xa0, hi: 0xa7}, + {value: 0x0813, lo: 0xa8, hi: 0xaf}, + {value: 0x0812, lo: 0xb0, hi: 0xb7}, + {value: 0x0813, lo: 0xb8, hi: 0xbf}, + // Block 0x61, offset 0x2af + {value: 0x0004, lo: 0x8b, hi: 0x8b}, + {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 0x62, offset 0x2b7 + {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 0x63, offset 0x2bd + {value: 0x0015, lo: 0x90, hi: 0x9c}, + // Block 0x64, offset 0x2be + {value: 0x0024, lo: 0x90, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x93}, + {value: 0x0024, lo: 0x94, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0xa0}, + {value: 0x0024, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa4}, + {value: 0x0034, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa7}, + {value: 0x0034, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xa9}, + {value: 0x0034, lo: 0xaa, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + // Block 0x65, offset 0x2cc + {value: 0x0016, lo: 0x85, hi: 0x86}, + {value: 0x0012, lo: 0x87, hi: 0x89}, + {value: 0xa452, lo: 0x8e, hi: 0x8e}, + {value: 0x1013, lo: 0xa0, hi: 0xaf}, + {value: 0x1012, lo: 0xb0, hi: 0xbf}, + // Block 0x66, offset 0x2d1 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x88}, + // Block 0x67, offset 0x2d4 + {value: 0xa753, lo: 0xb6, hi: 0xb7}, + {value: 0xaa53, lo: 0xb8, hi: 0xb9}, + {value: 0xad53, lo: 0xba, hi: 0xbb}, + {value: 0xaa53, lo: 0xbc, hi: 0xbd}, + {value: 0xa753, lo: 0xbe, hi: 0xbf}, + // Block 0x68, offset 0x2d9 + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6553, lo: 0x90, hi: 0x9f}, + {value: 0xb053, lo: 0xa0, hi: 0xaf}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0x69, offset 0x2dd + {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 0x6a, offset 0x2e3 + {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 0x6b, offset 0x2e8 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x6c, offset 0x2eb + {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 0x6d, offset 0x2f0 + {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 0x6e, offset 0x2f5 + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + // Block 0x6f, offset 0x2f6 + {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 0x70, offset 0x2fc + {value: 0x0034, lo: 0x99, hi: 0x9a}, + {value: 0x0004, lo: 0x9b, hi: 0x9e}, + // Block 0x71, offset 0x2fe + {value: 0x0004, lo: 0xbc, hi: 0xbe}, + // Block 0x72, offset 0x2ff + {value: 0x0010, lo: 0x85, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x73, offset 0x301 + {value: 0x0010, lo: 0x80, hi: 0x8e}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x74, offset 0x303 + {value: 0x0010, lo: 0x80, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x96, hi: 0xbf}, + // Block 0x75, offset 0x306 + {value: 0x0010, lo: 0x80, hi: 0x8c}, + // Block 0x76, offset 0x307 + {value: 0x0010, lo: 0x90, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x77, offset 0x309 + {value: 0x0010, lo: 0x80, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0xab}, + // Block 0x78, offset 0x30c + {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 0x79, offset 0x312 + {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 0x7a, offset 0x316 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb1}, + // Block 0x7b, offset 0x318 + {value: 0x0004, lo: 0x80, hi: 0x87}, + {value: 0x0014, lo: 0x88, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xaf}, + {value: 0x0012, lo: 0xb0, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xbf}, + // Block 0x7c, offset 0x31d + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x0015, lo: 0xb0, hi: 0xb0}, + {value: 0x0012, lo: 0xb1, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x8753, lo: 0xbd, hi: 0xbd}, + {value: 0x0117, lo: 0xbe, hi: 0xbf}, + // Block 0x7d, offset 0x324 + {value: 0x0117, lo: 0x80, hi: 0x83}, + {value: 0x6553, lo: 0x84, hi: 0x84}, + {value: 0x908b, lo: 0x85, hi: 0x85}, + {value: 0x8f53, lo: 0x86, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x0316, lo: 0x89, hi: 0x8a}, + {value: 0x0117, lo: 0x90, hi: 0x91}, + {value: 0x0012, lo: 0x93, hi: 0x93}, + {value: 0x0012, lo: 0x95, hi: 0x95}, + {value: 0x0117, lo: 0x96, hi: 0x99}, + {value: 0x0015, lo: 0xb2, hi: 0xb4}, + {value: 0x0316, lo: 0xb5, hi: 0xb6}, + {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 0x7e, offset 0x334 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8b}, + {value: 0x0010, lo: 0x8c, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0034, lo: 0xac, hi: 0xac}, + // Block 0x7f, offset 0x33e + {value: 0x0010, lo: 0x80, hi: 0xb3}, + // Block 0x80, offset 0x33f + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x85}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xa0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb7}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x81, offset 0x348 + {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 0x82, offset 0x34c + {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 0x83, offset 0x351 + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb9}, + {value: 0x0010, lo: 0xba, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x84, offset 0x359 + {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 0x85, offset 0x35f + {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 0x86, offset 0x365 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x87, offset 0x36f + {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 0x88, offset 0x374 + {value: 0x0024, lo: 0x81, hi: 0x81}, + {value: 0x0004, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + // Block 0x89, offset 0x37d + {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 0x8a, offset 0x383 + {value: 0x0012, lo: 0x80, hi: 0x92}, + {value: 0xb352, lo: 0x93, hi: 0x93}, + {value: 0x0012, lo: 0x94, hi: 0x9a}, + {value: 0x0014, lo: 0x9b, hi: 0x9b}, + {value: 0x0015, lo: 0x9c, hi: 0x9f}, + {value: 0x0012, lo: 0xa0, hi: 0xa8}, + {value: 0x0015, lo: 0xa9, hi: 0xa9}, + {value: 0x0004, lo: 0xaa, hi: 0xab}, + {value: 0x74d2, lo: 0xb0, hi: 0xbf}, + // Block 0x8b, offset 0x38c + {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 0x8c, offset 0x390 + {value: 0x0010, lo: 0x80, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xaa}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x8d, offset 0x398 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x8e, offset 0x39a + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x8b, hi: 0xbb}, + // Block 0x8f, offset 0x39c + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0xbf}, + // Block 0x90, offset 0x39f + {value: 0x0010, lo: 0x80, hi: 0xb1}, + {value: 0x0004, lo: 0xb2, hi: 0xbf}, + // Block 0x91, offset 0x3a1 + {value: 0x0004, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x93, hi: 0xbf}, + // Block 0x92, offset 0x3a3 + {value: 0x0010, lo: 0x80, hi: 0xbd}, + // Block 0x93, offset 0x3a4 + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0x94, offset 0x3a5 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x0010, lo: 0x92, hi: 0xbf}, + // Block 0x95, offset 0x3a7 + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0xb0, hi: 0xbb}, + // Block 0x96, offset 0x3a9 + {value: 0x0014, lo: 0x80, hi: 0x8f}, + {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 0x97, offset 0x3af + {value: 0x0010, lo: 0x8d, hi: 0x8f}, + {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 0x98, offset 0x3b4 + {value: 0x0010, lo: 0x80, hi: 0xbc}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x3b6 + {value: 0x0054, lo: 0x87, hi: 0x87}, + {value: 0x0054, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {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 0x9a, offset 0x3bd + {value: 0x0004, lo: 0x80, hi: 0x80}, + {value: 0x5f52, lo: 0x81, hi: 0x9a}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + // Block 0x9b, offset 0x3c0 + {value: 0x0014, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbe}, + // Block 0x9c, offset 0x3c2 + {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 0x9d, offset 0x3c8 + {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 0x9e, offset 0x3cd + {value: 0x0010, lo: 0x80, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x9d}, + // Block 0x9f, offset 0x3cf + {value: 0x0010, lo: 0x80, hi: 0xba}, + // Block 0xa0, offset 0x3d0 + {value: 0x0010, lo: 0x80, hi: 0xb4}, + // Block 0xa1, offset 0x3d1 + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + // Block 0xa2, offset 0x3d2 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa3, offset 0x3d4 + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + // Block 0xa4, offset 0x3d6 + {value: 0x0010, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xad, hi: 0xbf}, + // Block 0xa5, offset 0x3d8 + {value: 0x0010, lo: 0x80, hi: 0x8a}, + {value: 0x0010, lo: 0x90, hi: 0xb5}, + {value: 0x0024, lo: 0xb6, hi: 0xba}, + // Block 0xa6, offset 0x3db + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa7, offset 0x3dd + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x91, hi: 0x95}, + // Block 0xa8, offset 0x3e0 + {value: 0x2813, lo: 0x80, hi: 0x87}, + {value: 0x3813, lo: 0x88, hi: 0x8f}, + {value: 0x2813, lo: 0x90, hi: 0x97}, + {value: 0xb653, lo: 0x98, hi: 0x9f}, + {value: 0xb953, lo: 0xa0, hi: 0xa7}, + {value: 0x2812, lo: 0xa8, hi: 0xaf}, + {value: 0x3812, lo: 0xb0, hi: 0xb7}, + {value: 0x2812, lo: 0xb8, hi: 0xbf}, + // Block 0xa9, offset 0x3e8 + {value: 0xb652, lo: 0x80, hi: 0x87}, + {value: 0xb952, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0xaa, offset 0x3eb + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0xb953, lo: 0xb0, hi: 0xb7}, + {value: 0xb653, lo: 0xb8, hi: 0xbf}, + // Block 0xab, offset 0x3ef + {value: 0x2813, lo: 0x80, hi: 0x87}, + {value: 0x3813, lo: 0x88, hi: 0x8f}, + {value: 0x2813, lo: 0x90, hi: 0x93}, + {value: 0xb952, lo: 0x98, hi: 0x9f}, + {value: 0xb652, lo: 0xa0, hi: 0xa7}, + {value: 0x2812, lo: 0xa8, hi: 0xaf}, + {value: 0x3812, lo: 0xb0, hi: 0xb7}, + {value: 0x2812, lo: 0xb8, hi: 0xbb}, + // Block 0xac, offset 0x3f7 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xad, offset 0x3f9 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0xbc53, lo: 0xb0, hi: 0xb0}, + {value: 0xbf53, lo: 0xb1, hi: 0xb1}, + {value: 0xc253, lo: 0xb2, hi: 0xb2}, + {value: 0xbf53, lo: 0xb3, hi: 0xb3}, + {value: 0xc553, lo: 0xb4, hi: 0xb4}, + {value: 0xbf53, lo: 0xb5, hi: 0xb5}, + {value: 0xc253, lo: 0xb6, hi: 0xb6}, + {value: 0xbf53, lo: 0xb7, hi: 0xb7}, + {value: 0xbc53, lo: 0xb8, hi: 0xb8}, + {value: 0xc853, lo: 0xb9, hi: 0xb9}, + {value: 0xcb53, lo: 0xba, hi: 0xba}, + {value: 0xce53, lo: 0xbc, hi: 0xbc}, + {value: 0xc853, lo: 0xbd, hi: 0xbd}, + {value: 0xcb53, lo: 0xbe, hi: 0xbe}, + {value: 0xc853, lo: 0xbf, hi: 0xbf}, + // Block 0xae, offset 0x409 + {value: 0x0010, lo: 0x80, hi: 0xb6}, + // Block 0xaf, offset 0x40a + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xa7}, + // Block 0xb0, offset 0x40c + {value: 0x0015, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0015, lo: 0x83, hi: 0x85}, + {value: 0x0015, lo: 0x87, hi: 0xb0}, + {value: 0x0015, lo: 0xb2, hi: 0xba}, + // Block 0xb1, offset 0x411 + {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 0xb2, offset 0x417 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb6}, + // Block 0xb3, offset 0x419 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + // Block 0xb4, offset 0x41a + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + // Block 0xb5, offset 0x41c + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb9}, + // Block 0xb6, offset 0x41e + {value: 0x0010, lo: 0x80, hi: 0xb7}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0xb7, offset 0x420 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x83}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x8e, hi: 0x8e}, + {value: 0x0024, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x99, hi: 0xb5}, + {value: 0x0024, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xb8, offset 0x42d + {value: 0x0010, lo: 0xa0, hi: 0xbc}, + // Block 0xb9, offset 0x42e + {value: 0x0010, lo: 0x80, hi: 0x9c}, + // Block 0xba, offset 0x42f + {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 0xbb, offset 0x433 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + // Block 0xbc, offset 0x435 + {value: 0x0010, lo: 0x80, hi: 0x91}, + // Block 0xbd, offset 0x436 + {value: 0x0010, lo: 0x80, hi: 0x88}, + // Block 0xbe, offset 0x437 + {value: 0x5653, lo: 0x80, hi: 0xb2}, + // Block 0xbf, offset 0x438 + {value: 0x5652, lo: 0x80, hi: 0xb2}, + // Block 0xc0, offset 0x439 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xc1, offset 0x43c + {value: 0x0010, lo: 0x80, hi: 0xa9}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0010, lo: 0xb0, hi: 0xb1}, + // Block 0xc2, offset 0x43f + {value: 0x0034, lo: 0xbd, hi: 0xbf}, + // Block 0xc3, offset 0x440 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc4, offset 0x443 + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x87}, + {value: 0x0024, lo: 0x88, hi: 0x8a}, + {value: 0x0034, lo: 0x8b, hi: 0x8b}, + {value: 0x0024, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x90}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc5, offset 0x44a + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0024, lo: 0x82, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x83}, + {value: 0x0024, lo: 0x84, hi: 0x84}, + {value: 0x0034, lo: 0x85, hi: 0x85}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc6, offset 0x450 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0010, lo: 0xa0, hi: 0xb6}, + // Block 0xc7, offset 0x452 + {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 0xc8, offset 0x456 + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xc9, offset 0x45e + {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 0xca, offset 0x464 + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xa8}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xcb, offset 0x468 + {value: 0x0024, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb6, hi: 0xbf}, + // Block 0xcc, offset 0x46f + {value: 0x0010, lo: 0x84, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + // Block 0xcd, offset 0x473 + {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 0xce, offset 0x477 + {value: 0x0030, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0014, lo: 0x89, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + // Block 0xcf, offset 0x480 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb4}, + {value: 0x0030, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xb7}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xd0, offset 0x48a + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + // Block 0xd1, offset 0x48c + {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 0xd2, offset 0x492 + {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 0xd3, offset 0x498 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0xd4, offset 0x4a2 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0030, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9d, hi: 0xa3}, + {value: 0x0024, lo: 0xa6, hi: 0xac}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + // Block 0xd5, offset 0x4ac + {value: 0x0010, lo: 0x80, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbf}, + // Block 0xd6, offset 0x4ae + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8a}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + // Block 0xd7, offset 0x4b7 + {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 0xd8, offset 0x4bd + {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 0xd9, offset 0x4c3 + {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 0xda, offset 0x4c9 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x98, hi: 0x9b}, + {value: 0x0014, lo: 0x9c, hi: 0x9d}, + // Block 0xdb, offset 0x4cc + {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 0xdc, offset 0x4d2 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xdd, offset 0x4d5 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0014, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb5}, + {value: 0x0030, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + // Block 0xde, offset 0x4de + {value: 0x0010, lo: 0x80, hi: 0x89}, + // Block 0xdf, offset 0x4df + {value: 0x0014, lo: 0x9d, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xe0, offset 0x4e6 + {value: 0x0010, lo: 0x80, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + // Block 0xe1, offset 0x4ea + {value: 0x5f53, lo: 0xa0, hi: 0xbf}, + // Block 0xe2, offset 0x4eb + {value: 0x5f52, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xe3, offset 0x4ee + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x89, hi: 0x89}, + {value: 0x0010, lo: 0x8c, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0xb5}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0014, lo: 0xbb, hi: 0xbc}, + {value: 0x0030, lo: 0xbd, hi: 0xbd}, + {value: 0x0034, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xe4, offset 0x4f8 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xe5, offset 0x4fb + {value: 0x0010, lo: 0xa0, hi: 0xa7}, + {value: 0x0010, lo: 0xaa, hi: 0xbf}, + // Block 0xe6, offset 0x4fd + {value: 0x0010, lo: 0x80, hi: 0x93}, + {value: 0x0014, lo: 0x94, hi: 0x97}, + {value: 0x0014, lo: 0x9a, hi: 0x9b}, + {value: 0x0010, lo: 0x9c, hi: 0x9f}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + // Block 0xe7, offset 0x504 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x8a}, + {value: 0x0010, lo: 0x8b, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb8}, + {value: 0x0010, lo: 0xb9, hi: 0xba}, + {value: 0x0014, lo: 0xbb, hi: 0xbe}, + // Block 0xe8, offset 0x50c + {value: 0x0034, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0014, lo: 0x91, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x98}, + {value: 0x0014, lo: 0x99, hi: 0x9b}, + {value: 0x0010, lo: 0x9c, hi: 0xbf}, + // Block 0xe9, offset 0x512 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0014, lo: 0x8a, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x99}, + {value: 0x0010, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xea, offset 0x519 + {value: 0x0010, lo: 0x80, hi: 0xb8}, + // Block 0xeb, offset 0x51a + {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 0xec, offset 0x520 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xb2, hi: 0xbf}, + // Block 0xed, offset 0x523 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x0014, lo: 0x92, hi: 0xa7}, + {value: 0x0010, lo: 0xa9, hi: 0xa9}, + {value: 0x0014, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb6}, + // Block 0xee, offset 0x52b + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0xb0}, + {value: 0x0014, lo: 0xb1, hi: 0xb6}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0xef, offset 0x532 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x85}, + {value: 0x0010, lo: 0x86, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xa5}, + {value: 0x0010, lo: 0xa7, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xbf}, + // Block 0xf0, offset 0x53c + {value: 0x0010, lo: 0x80, hi: 0x8e}, + {value: 0x0014, lo: 0x90, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x96, hi: 0x96}, + {value: 0x0034, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0xf1, offset 0x544 + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + // Block 0xf2, offset 0x547 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xba}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0xf3, offset 0x54c + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0030, lo: 0x81, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xf4, offset 0x550 + {value: 0x0010, lo: 0xb0, hi: 0xb0}, + // Block 0xf5, offset 0x551 + {value: 0x0010, lo: 0x80, hi: 0x99}, + // Block 0xf6, offset 0x552 + {value: 0x0010, lo: 0x80, hi: 0xae}, + // Block 0xf7, offset 0x553 + {value: 0x0010, lo: 0x80, hi: 0x83}, + // Block 0xf8, offset 0x554 + {value: 0x0010, lo: 0x80, hi: 0xb0}, + // Block 0xf9, offset 0x555 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xbf}, + // Block 0xfa, offset 0x557 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x95}, + // Block 0xfb, offset 0x55a + {value: 0x0010, lo: 0x80, hi: 0x86}, + // Block 0xfc, offset 0x55b + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xfd, offset 0x55e + {value: 0x0010, lo: 0x80, hi: 0xbe}, + // Block 0xfe, offset 0x55f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x90, hi: 0xad}, + {value: 0x0034, lo: 0xb0, hi: 0xb4}, + // Block 0xff, offset 0x562 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb6}, + // Block 0x100, offset 0x564 + {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 0x101, offset 0x568 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + // Block 0x102, offset 0x569 + {value: 0x2013, lo: 0x80, hi: 0x9f}, + {value: 0x2012, lo: 0xa0, hi: 0xbf}, + // Block 0x103, offset 0x56b + {value: 0x0010, lo: 0x80, hi: 0x8a}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0x104, offset 0x56e + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0014, lo: 0x8f, hi: 0x9f}, + // Block 0x105, offset 0x570 + {value: 0x0014, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa3, hi: 0xa4}, + {value: 0x0030, lo: 0xb0, hi: 0xb1}, + // Block 0x106, offset 0x573 + {value: 0x0004, lo: 0xb0, hi: 0xb3}, + {value: 0x0004, lo: 0xb5, hi: 0xbb}, + {value: 0x0004, lo: 0xbd, hi: 0xbe}, + // Block 0x107, offset 0x576 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbc}, + // Block 0x108, offset 0x578 + {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 0x109, offset 0x57d + {value: 0x0014, lo: 0x80, hi: 0xad}, + {value: 0x0014, lo: 0xb0, hi: 0xbf}, + // Block 0x10a, offset 0x57f + {value: 0x0014, lo: 0x80, hi: 0x86}, + // Block 0x10b, offset 0x580 + {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 0x10c, offset 0x585 + {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 0x10d, offset 0x589 + {value: 0x0024, lo: 0x82, hi: 0x84}, + // Block 0x10e, offset 0x58a + {value: 0x0013, lo: 0x80, hi: 0x99}, + {value: 0x0012, lo: 0x9a, hi: 0xb3}, + {value: 0x0013, lo: 0xb4, hi: 0xbf}, + // Block 0x10f, offset 0x58d + {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 0x110, offset 0x591 + {value: 0x0013, lo: 0x80, hi: 0x81}, + {value: 0x0012, lo: 0x82, hi: 0x9b}, + {value: 0x0013, lo: 0x9c, hi: 0x9c}, + {value: 0x0013, lo: 0x9e, hi: 0x9f}, + {value: 0x0013, lo: 0xa2, hi: 0xa2}, + {value: 0x0013, lo: 0xa5, hi: 0xa6}, + {value: 0x0013, lo: 0xa9, hi: 0xac}, + {value: 0x0013, lo: 0xae, hi: 0xb5}, + {value: 0x0012, lo: 0xb6, hi: 0xb9}, + {value: 0x0012, lo: 0xbb, hi: 0xbb}, + {value: 0x0012, lo: 0xbd, hi: 0xbf}, + // Block 0x111, offset 0x59c + {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 0x112, offset 0x5a0 + {value: 0x0012, lo: 0x80, hi: 0x83}, + {value: 0x0013, lo: 0x84, hi: 0x85}, + {value: 0x0013, lo: 0x87, hi: 0x8a}, + {value: 0x0013, lo: 0x8d, hi: 0x94}, + {value: 0x0013, lo: 0x96, hi: 0x9c}, + {value: 0x0012, lo: 0x9e, hi: 0xb7}, + {value: 0x0013, lo: 0xb8, hi: 0xb9}, + {value: 0x0013, lo: 0xbb, hi: 0xbe}, + // Block 0x113, offset 0x5a8 + {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 0x114, offset 0x5ad + {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 0x115, offset 0x5b1 + {value: 0x0012, lo: 0x80, hi: 0x93}, + {value: 0x0013, lo: 0x94, hi: 0xad}, + {value: 0x0012, lo: 0xae, hi: 0xbf}, + // Block 0x116, offset 0x5b4 + {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 0x117, offset 0x5b8 + {value: 0x0013, lo: 0x80, hi: 0x95}, + {value: 0x0012, lo: 0x96, hi: 0xaf}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x118, offset 0x5bb + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0012, lo: 0x8a, hi: 0xa5}, + {value: 0x0013, lo: 0xa8, hi: 0xbf}, + // Block 0x119, offset 0x5be + {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 0x11a, offset 0x5c3 + {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 0x11b, offset 0x5c7 + {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 0x11c, offset 0x5cb + {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 0x11d, offset 0x5cf + {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 0x11e, offset 0x5d3 + {value: 0x0014, lo: 0x80, hi: 0xb6}, + {value: 0x0014, lo: 0xbb, hi: 0xbf}, + // Block 0x11f, offset 0x5d5 + {value: 0x0014, lo: 0x80, hi: 0xac}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0x120, offset 0x5d7 + {value: 0x0014, lo: 0x84, hi: 0x84}, + {value: 0x0014, lo: 0x9b, hi: 0x9f}, + {value: 0x0014, lo: 0xa1, hi: 0xaf}, + // Block 0x121, offset 0x5da + {value: 0x0012, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8a, hi: 0x8a}, + {value: 0x0012, lo: 0x8b, hi: 0x9e}, + {value: 0x0012, lo: 0xa5, hi: 0xaa}, + // Block 0x122, offset 0x5de + {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}, + {value: 0x0015, lo: 0xb0, hi: 0xbf}, + // Block 0x123, offset 0x5e4 + {value: 0x0015, lo: 0x80, hi: 0xad}, + // Block 0x124, offset 0x5e5 + {value: 0x0024, lo: 0x8f, hi: 0x8f}, + // Block 0x125, offset 0x5e6 + {value: 0x0010, lo: 0x80, hi: 0xac}, + {value: 0x0024, lo: 0xb0, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xbd}, + // Block 0x126, offset 0x5e9 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + // Block 0x127, offset 0x5eb + {value: 0x0010, lo: 0x90, hi: 0xad}, + {value: 0x0024, lo: 0xae, hi: 0xae}, + // Block 0x128, offset 0x5ed + {value: 0x0010, lo: 0x80, hi: 0xab}, + {value: 0x0024, lo: 0xac, hi: 0xaf}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x129, offset 0x5f0 + {value: 0x0010, lo: 0x90, hi: 0xaa}, + {value: 0x0014, lo: 0xab, hi: 0xab}, + {value: 0x0034, lo: 0xac, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xaf}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x12a, offset 0x5f5 + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xab}, + {value: 0x0010, lo: 0xad, hi: 0xae}, + {value: 0x0010, lo: 0xb0, hi: 0xbe}, + // Block 0x12b, offset 0x5f9 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0034, lo: 0x90, hi: 0x96}, + // Block 0x12c, offset 0x5fb + {value: 0xd152, lo: 0x80, hi: 0x81}, + {value: 0xd452, lo: 0x82, hi: 0x83}, + {value: 0x0024, lo: 0x84, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8b}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x12d, offset 0x601 + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x9f}, + {value: 0x0010, lo: 0xa1, hi: 0xa2}, + {value: 0x0010, lo: 0xa4, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0010, lo: 0xa9, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb7}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + // Block 0x12e, offset 0x60a + {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 0x12f, offset 0x60f + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x130, offset 0x610 + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0013, lo: 0x90, hi: 0xa9}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x131, offset 0x613 + {value: 0x0013, lo: 0x80, hi: 0x89}, + // Block 0x132, offset 0x614 + {value: 0x0014, lo: 0xbb, hi: 0xbf}, + // Block 0x133, offset 0x615 + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x134, offset 0x616 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0014, lo: 0xa0, hi: 0xbf}, + // Block 0x135, offset 0x618 + {value: 0x0014, lo: 0x80, hi: 0xbf}, + // Block 0x136, offset 0x619 + {value: 0x0014, lo: 0x80, hi: 0xaf}, +} + +// Total table size 16093 bytes (15KiB); checksum: EE91C452 diff --git a/vendor/golang.org/x/text/internal/language/compact/tables.go b/vendor/golang.org/x/text/internal/language/compact/tables.go index 32af9de599..a09ed198a5 100644 --- a/vendor/golang.org/x/text/internal/language/compact/tables.go +++ b/vendor/golang.org/x/text/internal/language/compact/tables.go @@ -790,226 +790,226 @@ const ( var coreTags = []language.CompactCoreInfo{ // 773 elements // Entry 0 - 1F - 0x00000000, 0x01600000, 0x016000d2, 0x01600161, - 0x01c00000, 0x01c00052, 0x02100000, 0x02100080, - 0x02700000, 0x0270006f, 0x03a00000, 0x03a00001, - 0x03a00023, 0x03a00039, 0x03a00062, 0x03a00067, - 0x03a0006b, 0x03a0006c, 0x03a0006d, 0x03a00097, - 0x03a0009b, 0x03a000a1, 0x03a000a8, 0x03a000ac, - 0x03a000b0, 0x03a000b9, 0x03a000ba, 0x03a000c9, - 0x03a000e1, 0x03a000ed, 0x03a000f3, 0x03a00108, + 0x00000000, 0x01600000, 0x016000d3, 0x01600162, + 0x01c00000, 0x01c00052, 0x02100000, 0x02100081, + 0x02700000, 0x02700070, 0x03a00000, 0x03a00001, + 0x03a00023, 0x03a00039, 0x03a00063, 0x03a00068, + 0x03a0006c, 0x03a0006d, 0x03a0006e, 0x03a00098, + 0x03a0009c, 0x03a000a2, 0x03a000a9, 0x03a000ad, + 0x03a000b1, 0x03a000ba, 0x03a000bb, 0x03a000ca, + 0x03a000e2, 0x03a000ee, 0x03a000f4, 0x03a00109, // Entry 20 - 3F - 0x03a0010b, 0x03a00115, 0x03a00117, 0x03a0011c, - 0x03a00120, 0x03a00128, 0x03a0015e, 0x04000000, - 0x04300000, 0x04300099, 0x04400000, 0x0440012f, - 0x04800000, 0x0480006e, 0x05800000, 0x05820000, - 0x05820032, 0x0585a000, 0x0585a032, 0x05e00000, + 0x03a0010c, 0x03a00116, 0x03a00118, 0x03a0011d, + 0x03a00121, 0x03a00129, 0x03a0015f, 0x04000000, + 0x04300000, 0x0430009a, 0x04400000, 0x04400130, + 0x04800000, 0x0480006f, 0x05800000, 0x05820000, + 0x05820032, 0x0585b000, 0x0585b032, 0x05e00000, 0x05e00052, 0x07100000, 0x07100047, 0x07500000, - 0x07500162, 0x07900000, 0x0790012f, 0x07e00000, - 0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c3, + 0x07500163, 0x07900000, 0x07900130, 0x07e00000, + 0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c4, // Entry 40 - 5F - 0x0a500000, 0x0a500035, 0x0a500099, 0x0a900000, - 0x0a900053, 0x0a900099, 0x0b200000, 0x0b200078, - 0x0b500000, 0x0b500099, 0x0b700000, 0x0b720000, - 0x0b720033, 0x0b75a000, 0x0b75a033, 0x0d700000, - 0x0d700022, 0x0d70006e, 0x0d700078, 0x0d70009e, - 0x0db00000, 0x0db00035, 0x0db00099, 0x0dc00000, - 0x0dc00106, 0x0df00000, 0x0df00131, 0x0e500000, - 0x0e500135, 0x0e900000, 0x0e90009b, 0x0e90009c, + 0x0a500000, 0x0a500035, 0x0a50009a, 0x0a900000, + 0x0a900053, 0x0a90009a, 0x0b200000, 0x0b200079, + 0x0b500000, 0x0b50009a, 0x0b700000, 0x0b720000, + 0x0b720033, 0x0b75b000, 0x0b75b033, 0x0d700000, + 0x0d700022, 0x0d70006f, 0x0d700079, 0x0d70009f, + 0x0db00000, 0x0db00035, 0x0db0009a, 0x0dc00000, + 0x0dc00107, 0x0df00000, 0x0df00132, 0x0e500000, + 0x0e500136, 0x0e900000, 0x0e90009c, 0x0e90009d, // Entry 60 - 7F - 0x0fa00000, 0x0fa0005e, 0x0fe00000, 0x0fe00106, - 0x10000000, 0x1000007b, 0x10100000, 0x10100063, - 0x10100082, 0x10800000, 0x108000a4, 0x10d00000, - 0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00060, - 0x10d0009e, 0x10d000b2, 0x10d000b7, 0x11700000, - 0x117000d4, 0x11f00000, 0x11f00060, 0x12400000, - 0x12400052, 0x12800000, 0x12b00000, 0x12b00114, - 0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a4, + 0x0fa00000, 0x0fa0005f, 0x0fe00000, 0x0fe00107, + 0x10000000, 0x1000007c, 0x10100000, 0x10100064, + 0x10100083, 0x10800000, 0x108000a5, 0x10d00000, + 0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00061, + 0x10d0009f, 0x10d000b3, 0x10d000b8, 0x11700000, + 0x117000d5, 0x11f00000, 0x11f00061, 0x12400000, + 0x12400052, 0x12800000, 0x12b00000, 0x12b00115, + 0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a5, // Entry 80 - 9F - 0x13000000, 0x13000080, 0x13000122, 0x13600000, - 0x1360005d, 0x13600087, 0x13900000, 0x13900001, + 0x13000000, 0x13000081, 0x13000123, 0x13600000, + 0x1360005e, 0x13600088, 0x13900000, 0x13900001, 0x1390001a, 0x13900025, 0x13900026, 0x1390002d, 0x1390002e, 0x1390002f, 0x13900034, 0x13900036, 0x1390003a, 0x1390003d, 0x13900042, 0x13900046, 0x13900048, 0x13900049, 0x1390004a, 0x1390004e, - 0x13900050, 0x13900052, 0x1390005c, 0x1390005d, - 0x13900060, 0x13900061, 0x13900063, 0x13900064, + 0x13900050, 0x13900052, 0x1390005d, 0x1390005e, + 0x13900061, 0x13900062, 0x13900064, 0x13900065, // Entry A0 - BF - 0x1390006d, 0x13900072, 0x13900073, 0x13900074, - 0x13900075, 0x1390007b, 0x1390007c, 0x1390007f, - 0x13900080, 0x13900081, 0x13900083, 0x1390008a, - 0x1390008c, 0x1390008d, 0x13900096, 0x13900097, - 0x13900098, 0x13900099, 0x1390009a, 0x1390009f, - 0x139000a0, 0x139000a4, 0x139000a7, 0x139000a9, - 0x139000ad, 0x139000b1, 0x139000b4, 0x139000b5, - 0x139000bf, 0x139000c0, 0x139000c6, 0x139000c7, + 0x1390006e, 0x13900073, 0x13900074, 0x13900075, + 0x13900076, 0x1390007c, 0x1390007d, 0x13900080, + 0x13900081, 0x13900082, 0x13900084, 0x1390008b, + 0x1390008d, 0x1390008e, 0x13900097, 0x13900098, + 0x13900099, 0x1390009a, 0x1390009b, 0x139000a0, + 0x139000a1, 0x139000a5, 0x139000a8, 0x139000aa, + 0x139000ae, 0x139000b2, 0x139000b5, 0x139000b6, + 0x139000c0, 0x139000c1, 0x139000c7, 0x139000c8, // Entry C0 - DF - 0x139000ca, 0x139000cb, 0x139000cc, 0x139000ce, - 0x139000d0, 0x139000d2, 0x139000d5, 0x139000d6, - 0x139000d9, 0x139000dd, 0x139000df, 0x139000e0, - 0x139000e6, 0x139000e7, 0x139000e8, 0x139000eb, - 0x139000ec, 0x139000f0, 0x13900107, 0x13900109, - 0x1390010a, 0x1390010b, 0x1390010c, 0x1390010d, - 0x1390010e, 0x1390010f, 0x13900112, 0x13900117, - 0x1390011b, 0x1390011d, 0x1390011f, 0x13900125, + 0x139000cb, 0x139000cc, 0x139000cd, 0x139000cf, + 0x139000d1, 0x139000d3, 0x139000d6, 0x139000d7, + 0x139000da, 0x139000de, 0x139000e0, 0x139000e1, + 0x139000e7, 0x139000e8, 0x139000e9, 0x139000ec, + 0x139000ed, 0x139000f1, 0x13900108, 0x1390010a, + 0x1390010b, 0x1390010c, 0x1390010d, 0x1390010e, + 0x1390010f, 0x13900110, 0x13900113, 0x13900118, + 0x1390011c, 0x1390011e, 0x13900120, 0x13900126, // Entry E0 - FF - 0x13900129, 0x1390012c, 0x1390012d, 0x1390012f, - 0x13900131, 0x13900133, 0x13900135, 0x13900139, - 0x1390013c, 0x1390013d, 0x1390013f, 0x13900142, - 0x13900161, 0x13900162, 0x13900164, 0x13c00000, + 0x1390012a, 0x1390012d, 0x1390012e, 0x13900130, + 0x13900132, 0x13900134, 0x13900136, 0x1390013a, + 0x1390013d, 0x1390013e, 0x13900140, 0x13900143, + 0x13900162, 0x13900163, 0x13900165, 0x13c00000, 0x13c00001, 0x13e00000, 0x13e0001f, 0x13e0002c, 0x13e0003f, 0x13e00041, 0x13e00048, 0x13e00051, - 0x13e00054, 0x13e00056, 0x13e00059, 0x13e00065, - 0x13e00068, 0x13e00069, 0x13e0006e, 0x13e00086, + 0x13e00054, 0x13e00057, 0x13e0005a, 0x13e00066, + 0x13e00069, 0x13e0006a, 0x13e0006f, 0x13e00087, // Entry 100 - 11F - 0x13e00089, 0x13e0008f, 0x13e00094, 0x13e000cf, - 0x13e000d8, 0x13e000e2, 0x13e000e4, 0x13e000e7, - 0x13e000ec, 0x13e000f1, 0x13e0011a, 0x13e00135, - 0x13e00136, 0x13e0013b, 0x14000000, 0x1400006a, - 0x14500000, 0x1450006e, 0x14600000, 0x14600052, - 0x14800000, 0x14800024, 0x1480009c, 0x14e00000, - 0x14e00052, 0x14e00084, 0x14e000c9, 0x14e00114, - 0x15100000, 0x15100072, 0x15300000, 0x153000e7, + 0x13e0008a, 0x13e00090, 0x13e00095, 0x13e000d0, + 0x13e000d9, 0x13e000e3, 0x13e000e5, 0x13e000e8, + 0x13e000ed, 0x13e000f2, 0x13e0011b, 0x13e00136, + 0x13e00137, 0x13e0013c, 0x14000000, 0x1400006b, + 0x14500000, 0x1450006f, 0x14600000, 0x14600052, + 0x14800000, 0x14800024, 0x1480009d, 0x14e00000, + 0x14e00052, 0x14e00085, 0x14e000ca, 0x14e00115, + 0x15100000, 0x15100073, 0x15300000, 0x153000e8, // Entry 120 - 13F - 0x15800000, 0x15800063, 0x15800076, 0x15e00000, + 0x15800000, 0x15800064, 0x15800077, 0x15e00000, 0x15e00036, 0x15e00037, 0x15e0003a, 0x15e0003b, 0x15e0003c, 0x15e00049, 0x15e0004b, 0x15e0004c, 0x15e0004d, 0x15e0004e, 0x15e0004f, 0x15e00052, - 0x15e00062, 0x15e00067, 0x15e00078, 0x15e0007a, - 0x15e0007e, 0x15e00084, 0x15e00085, 0x15e00086, - 0x15e00091, 0x15e000a8, 0x15e000b7, 0x15e000ba, - 0x15e000bb, 0x15e000be, 0x15e000bf, 0x15e000c3, + 0x15e00063, 0x15e00068, 0x15e00079, 0x15e0007b, + 0x15e0007f, 0x15e00085, 0x15e00086, 0x15e00087, + 0x15e00092, 0x15e000a9, 0x15e000b8, 0x15e000bb, + 0x15e000bc, 0x15e000bf, 0x15e000c0, 0x15e000c4, // Entry 140 - 15F - 0x15e000c8, 0x15e000c9, 0x15e000cc, 0x15e000d3, - 0x15e000d4, 0x15e000e5, 0x15e000ea, 0x15e00102, - 0x15e00107, 0x15e0010a, 0x15e00114, 0x15e0011c, - 0x15e00120, 0x15e00122, 0x15e00128, 0x15e0013f, - 0x15e00140, 0x15e0015f, 0x16900000, 0x1690009e, - 0x16d00000, 0x16d000d9, 0x16e00000, 0x16e00096, - 0x17e00000, 0x17e0007b, 0x19000000, 0x1900006e, - 0x1a300000, 0x1a30004e, 0x1a300078, 0x1a3000b2, + 0x15e000c9, 0x15e000ca, 0x15e000cd, 0x15e000d4, + 0x15e000d5, 0x15e000e6, 0x15e000eb, 0x15e00103, + 0x15e00108, 0x15e0010b, 0x15e00115, 0x15e0011d, + 0x15e00121, 0x15e00123, 0x15e00129, 0x15e00140, + 0x15e00141, 0x15e00160, 0x16900000, 0x1690009f, + 0x16d00000, 0x16d000da, 0x16e00000, 0x16e00097, + 0x17e00000, 0x17e0007c, 0x19000000, 0x1900006f, + 0x1a300000, 0x1a30004e, 0x1a300079, 0x1a3000b3, // Entry 160 - 17F - 0x1a400000, 0x1a400099, 0x1a900000, 0x1ab00000, - 0x1ab000a4, 0x1ac00000, 0x1ac00098, 0x1b400000, - 0x1b400080, 0x1b4000d4, 0x1b4000d6, 0x1b800000, - 0x1b800135, 0x1bc00000, 0x1bc00097, 0x1be00000, - 0x1be00099, 0x1d100000, 0x1d100033, 0x1d100090, - 0x1d200000, 0x1d200060, 0x1d500000, 0x1d500092, - 0x1d700000, 0x1d700028, 0x1e100000, 0x1e100095, - 0x1e700000, 0x1e7000d6, 0x1ea00000, 0x1ea00053, + 0x1a400000, 0x1a40009a, 0x1a900000, 0x1ab00000, + 0x1ab000a5, 0x1ac00000, 0x1ac00099, 0x1b400000, + 0x1b400081, 0x1b4000d5, 0x1b4000d7, 0x1b800000, + 0x1b800136, 0x1bc00000, 0x1bc00098, 0x1be00000, + 0x1be0009a, 0x1d100000, 0x1d100033, 0x1d100091, + 0x1d200000, 0x1d200061, 0x1d500000, 0x1d500093, + 0x1d700000, 0x1d700028, 0x1e100000, 0x1e100096, + 0x1e700000, 0x1e7000d7, 0x1ea00000, 0x1ea00053, // Entry 180 - 19F - 0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009d, - 0x1f900000, 0x1f90004e, 0x1f90009e, 0x1f900113, - 0x1f900138, 0x1fa00000, 0x1fb00000, 0x20000000, - 0x200000a2, 0x20300000, 0x20700000, 0x20700052, - 0x20800000, 0x20a00000, 0x20a0012f, 0x20e00000, - 0x20f00000, 0x21000000, 0x2100007d, 0x21200000, - 0x21200067, 0x21600000, 0x21700000, 0x217000a4, - 0x21f00000, 0x22300000, 0x2230012f, 0x22700000, + 0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009e, + 0x1f900000, 0x1f90004e, 0x1f90009f, 0x1f900114, + 0x1f900139, 0x1fa00000, 0x1fb00000, 0x20000000, + 0x200000a3, 0x20300000, 0x20700000, 0x20700052, + 0x20800000, 0x20a00000, 0x20a00130, 0x20e00000, + 0x20f00000, 0x21000000, 0x2100007e, 0x21200000, + 0x21200068, 0x21600000, 0x21700000, 0x217000a5, + 0x21f00000, 0x22300000, 0x22300130, 0x22700000, // Entry 1A0 - 1BF - 0x2270005a, 0x23400000, 0x234000c3, 0x23900000, - 0x239000a4, 0x24200000, 0x242000ae, 0x24400000, - 0x24400052, 0x24500000, 0x24500082, 0x24600000, - 0x246000a4, 0x24a00000, 0x24a000a6, 0x25100000, - 0x25100099, 0x25400000, 0x254000aa, 0x254000ab, - 0x25600000, 0x25600099, 0x26a00000, 0x26a00099, - 0x26b00000, 0x26b0012f, 0x26d00000, 0x26d00052, - 0x26e00000, 0x26e00060, 0x27400000, 0x28100000, + 0x2270005b, 0x23400000, 0x234000c4, 0x23900000, + 0x239000a5, 0x24200000, 0x242000af, 0x24400000, + 0x24400052, 0x24500000, 0x24500083, 0x24600000, + 0x246000a5, 0x24a00000, 0x24a000a7, 0x25100000, + 0x2510009a, 0x25400000, 0x254000ab, 0x254000ac, + 0x25600000, 0x2560009a, 0x26a00000, 0x26a0009a, + 0x26b00000, 0x26b00130, 0x26d00000, 0x26d00052, + 0x26e00000, 0x26e00061, 0x27400000, 0x28100000, // Entry 1C0 - 1DF - 0x2810007b, 0x28a00000, 0x28a000a5, 0x29100000, - 0x2910012f, 0x29500000, 0x295000b7, 0x2a300000, - 0x2a300131, 0x2af00000, 0x2af00135, 0x2b500000, + 0x2810007c, 0x28a00000, 0x28a000a6, 0x29100000, + 0x29100130, 0x29500000, 0x295000b8, 0x2a300000, + 0x2a300132, 0x2af00000, 0x2af00136, 0x2b500000, 0x2b50002a, 0x2b50004b, 0x2b50004c, 0x2b50004d, - 0x2b800000, 0x2b8000af, 0x2bf00000, 0x2bf0009b, - 0x2bf0009c, 0x2c000000, 0x2c0000b6, 0x2c200000, - 0x2c20004b, 0x2c400000, 0x2c4000a4, 0x2c500000, - 0x2c5000a4, 0x2c700000, 0x2c7000b8, 0x2d100000, + 0x2b800000, 0x2b8000b0, 0x2bf00000, 0x2bf0009c, + 0x2bf0009d, 0x2c000000, 0x2c0000b7, 0x2c200000, + 0x2c20004b, 0x2c400000, 0x2c4000a5, 0x2c500000, + 0x2c5000a5, 0x2c700000, 0x2c7000b9, 0x2d100000, // Entry 1E0 - 1FF - 0x2d1000a4, 0x2d10012f, 0x2e900000, 0x2e9000a4, - 0x2ed00000, 0x2ed000cc, 0x2f100000, 0x2f1000bf, - 0x2f200000, 0x2f2000d1, 0x2f400000, 0x2f400052, - 0x2ff00000, 0x2ff000c2, 0x30400000, 0x30400099, - 0x30b00000, 0x30b000c5, 0x31000000, 0x31b00000, - 0x31b00099, 0x31f00000, 0x31f0003e, 0x31f000d0, - 0x31f0010d, 0x32000000, 0x320000cb, 0x32500000, - 0x32500052, 0x33100000, 0x331000c4, 0x33a00000, + 0x2d1000a5, 0x2d100130, 0x2e900000, 0x2e9000a5, + 0x2ed00000, 0x2ed000cd, 0x2f100000, 0x2f1000c0, + 0x2f200000, 0x2f2000d2, 0x2f400000, 0x2f400052, + 0x2ff00000, 0x2ff000c3, 0x30400000, 0x3040009a, + 0x30b00000, 0x30b000c6, 0x31000000, 0x31b00000, + 0x31b0009a, 0x31f00000, 0x31f0003e, 0x31f000d1, + 0x31f0010e, 0x32000000, 0x320000cc, 0x32500000, + 0x32500052, 0x33100000, 0x331000c5, 0x33a00000, // Entry 200 - 21F - 0x33a0009c, 0x34100000, 0x34500000, 0x345000d2, - 0x34700000, 0x347000da, 0x34700110, 0x34e00000, - 0x34e00164, 0x35000000, 0x35000060, 0x350000d9, - 0x35100000, 0x35100099, 0x351000db, 0x36700000, - 0x36700030, 0x36700036, 0x36700040, 0x3670005b, - 0x367000d9, 0x36700116, 0x3670011b, 0x36800000, - 0x36800052, 0x36a00000, 0x36a000da, 0x36c00000, + 0x33a0009d, 0x34100000, 0x34500000, 0x345000d3, + 0x34700000, 0x347000db, 0x34700111, 0x34e00000, + 0x34e00165, 0x35000000, 0x35000061, 0x350000da, + 0x35100000, 0x3510009a, 0x351000dc, 0x36700000, + 0x36700030, 0x36700036, 0x36700040, 0x3670005c, + 0x367000da, 0x36700117, 0x3670011c, 0x36800000, + 0x36800052, 0x36a00000, 0x36a000db, 0x36c00000, 0x36c00052, 0x36f00000, 0x37500000, 0x37600000, // Entry 220 - 23F - 0x37a00000, 0x38000000, 0x38000117, 0x38700000, - 0x38900000, 0x38900131, 0x39000000, 0x3900006f, - 0x390000a4, 0x39500000, 0x39500099, 0x39800000, - 0x3980007d, 0x39800106, 0x39d00000, 0x39d05000, - 0x39d050e8, 0x39d36000, 0x39d36099, 0x3a100000, - 0x3b300000, 0x3b3000e9, 0x3bd00000, 0x3bd00001, + 0x37a00000, 0x38000000, 0x38000118, 0x38700000, + 0x38900000, 0x38900132, 0x39000000, 0x39000070, + 0x390000a5, 0x39500000, 0x3950009a, 0x39800000, + 0x3980007e, 0x39800107, 0x39d00000, 0x39d05000, + 0x39d050e9, 0x39d36000, 0x39d3609a, 0x3a100000, + 0x3b300000, 0x3b3000ea, 0x3bd00000, 0x3bd00001, 0x3be00000, 0x3be00024, 0x3c000000, 0x3c00002a, - 0x3c000041, 0x3c00004e, 0x3c00005a, 0x3c000086, + 0x3c000041, 0x3c00004e, 0x3c00005b, 0x3c000087, // Entry 240 - 25F - 0x3c00008b, 0x3c0000b7, 0x3c0000c6, 0x3c0000d1, - 0x3c0000ee, 0x3c000118, 0x3c000126, 0x3c400000, - 0x3c40003f, 0x3c400069, 0x3c4000e4, 0x3d400000, + 0x3c00008c, 0x3c0000b8, 0x3c0000c7, 0x3c0000d2, + 0x3c0000ef, 0x3c000119, 0x3c000127, 0x3c400000, + 0x3c40003f, 0x3c40006a, 0x3c4000e5, 0x3d400000, 0x3d40004e, 0x3d900000, 0x3d90003a, 0x3dc00000, - 0x3dc000bc, 0x3dc00104, 0x3de00000, 0x3de0012f, - 0x3e200000, 0x3e200047, 0x3e2000a5, 0x3e2000ae, - 0x3e2000bc, 0x3e200106, 0x3e200130, 0x3e500000, - 0x3e500107, 0x3e600000, 0x3e60012f, 0x3eb00000, + 0x3dc000bd, 0x3dc00105, 0x3de00000, 0x3de00130, + 0x3e200000, 0x3e200047, 0x3e2000a6, 0x3e2000af, + 0x3e2000bd, 0x3e200107, 0x3e200131, 0x3e500000, + 0x3e500108, 0x3e600000, 0x3e600130, 0x3eb00000, // Entry 260 - 27F - 0x3eb00106, 0x3ec00000, 0x3ec000a4, 0x3f300000, - 0x3f30012f, 0x3fa00000, 0x3fa000e8, 0x3fc00000, - 0x3fd00000, 0x3fd00072, 0x3fd000da, 0x3fd0010c, - 0x3ff00000, 0x3ff000d1, 0x40100000, 0x401000c3, + 0x3eb00107, 0x3ec00000, 0x3ec000a5, 0x3f300000, + 0x3f300130, 0x3fa00000, 0x3fa000e9, 0x3fc00000, + 0x3fd00000, 0x3fd00073, 0x3fd000db, 0x3fd0010d, + 0x3ff00000, 0x3ff000d2, 0x40100000, 0x401000c4, 0x40200000, 0x4020004c, 0x40700000, 0x40800000, - 0x4085a000, 0x4085a0ba, 0x408e8000, 0x408e80ba, - 0x40c00000, 0x40c000b3, 0x41200000, 0x41200111, - 0x41600000, 0x4160010f, 0x41c00000, 0x41d00000, + 0x4085b000, 0x4085b0bb, 0x408eb000, 0x408eb0bb, + 0x40c00000, 0x40c000b4, 0x41200000, 0x41200112, + 0x41600000, 0x41600110, 0x41c00000, 0x41d00000, // Entry 280 - 29F - 0x41e00000, 0x41f00000, 0x41f00072, 0x42200000, - 0x42300000, 0x42300164, 0x42900000, 0x42900062, - 0x4290006f, 0x429000a4, 0x42900115, 0x43100000, - 0x43100027, 0x431000c2, 0x4310014d, 0x43200000, - 0x43220000, 0x43220033, 0x432200bd, 0x43220105, - 0x4322014d, 0x4325a000, 0x4325a033, 0x4325a0bd, - 0x4325a105, 0x4325a14d, 0x43700000, 0x43a00000, - 0x43b00000, 0x44400000, 0x44400031, 0x44400072, + 0x41e00000, 0x41f00000, 0x41f00073, 0x42200000, + 0x42300000, 0x42300165, 0x42900000, 0x42900063, + 0x42900070, 0x429000a5, 0x42900116, 0x43100000, + 0x43100027, 0x431000c3, 0x4310014e, 0x43200000, + 0x43220000, 0x43220033, 0x432200be, 0x43220106, + 0x4322014e, 0x4325b000, 0x4325b033, 0x4325b0be, + 0x4325b106, 0x4325b14e, 0x43700000, 0x43a00000, + 0x43b00000, 0x44400000, 0x44400031, 0x44400073, // Entry 2A0 - 2BF - 0x4440010c, 0x44500000, 0x4450004b, 0x445000a4, - 0x4450012f, 0x44500131, 0x44e00000, 0x45000000, - 0x45000099, 0x450000b3, 0x450000d0, 0x4500010d, - 0x46100000, 0x46100099, 0x46400000, 0x464000a4, - 0x46400131, 0x46700000, 0x46700124, 0x46b00000, - 0x46b00123, 0x46f00000, 0x46f0006d, 0x46f0006f, - 0x47100000, 0x47600000, 0x47600127, 0x47a00000, - 0x48000000, 0x48200000, 0x48200129, 0x48a00000, + 0x4440010d, 0x44500000, 0x4450004b, 0x445000a5, + 0x44500130, 0x44500132, 0x44e00000, 0x45000000, + 0x4500009a, 0x450000b4, 0x450000d1, 0x4500010e, + 0x46100000, 0x4610009a, 0x46400000, 0x464000a5, + 0x46400132, 0x46700000, 0x46700125, 0x46b00000, + 0x46b00124, 0x46f00000, 0x46f0006e, 0x46f00070, + 0x47100000, 0x47600000, 0x47600128, 0x47a00000, + 0x48000000, 0x48200000, 0x4820012a, 0x48a00000, // Entry 2C0 - 2DF - 0x48a0005d, 0x48a0012b, 0x48e00000, 0x49400000, - 0x49400106, 0x4a400000, 0x4a4000d4, 0x4a900000, - 0x4a9000ba, 0x4ac00000, 0x4ac00053, 0x4ae00000, - 0x4ae00130, 0x4b400000, 0x4b400099, 0x4b4000e8, + 0x48a0005e, 0x48a0012c, 0x48e00000, 0x49400000, + 0x49400107, 0x4a400000, 0x4a4000d5, 0x4a900000, + 0x4a9000bb, 0x4ac00000, 0x4ac00053, 0x4ae00000, + 0x4ae00131, 0x4b400000, 0x4b40009a, 0x4b4000e9, 0x4bc00000, 0x4bc05000, 0x4bc05024, 0x4bc20000, - 0x4bc20137, 0x4bc5a000, 0x4bc5a137, 0x4be00000, - 0x4be5a000, 0x4be5a0b4, 0x4bef1000, 0x4bef10b4, - 0x4c000000, 0x4c300000, 0x4c30013e, 0x4c900000, + 0x4bc20138, 0x4bc5b000, 0x4bc5b138, 0x4be00000, + 0x4be5b000, 0x4be5b0b5, 0x4bef4000, 0x4bef40b5, + 0x4c000000, 0x4c300000, 0x4c30013f, 0x4c900000, // Entry 2E0 - 2FF - 0x4c900001, 0x4cc00000, 0x4cc0012f, 0x4ce00000, - 0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500114, - 0x4f200000, 0x4fb00000, 0x4fb00131, 0x50900000, + 0x4c900001, 0x4cc00000, 0x4cc00130, 0x4ce00000, + 0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500115, + 0x4f200000, 0x4fb00000, 0x4fb00132, 0x50900000, 0x50900052, 0x51200000, 0x51200001, 0x51800000, - 0x5180003b, 0x518000d6, 0x51f00000, 0x51f3b000, - 0x51f3b053, 0x51f3c000, 0x51f3c08d, 0x52800000, - 0x528000ba, 0x52900000, 0x5293b000, 0x5293b053, - 0x5293b08d, 0x5293b0c6, 0x5293b10d, 0x5293c000, + 0x5180003b, 0x518000d7, 0x51f00000, 0x51f3b000, + 0x51f3b053, 0x51f3c000, 0x51f3c08e, 0x52800000, + 0x528000bb, 0x52900000, 0x5293b000, 0x5293b053, + 0x5293b08e, 0x5293b0c7, 0x5293b10e, 0x5293c000, // Entry 300 - 31F - 0x5293c08d, 0x5293c0c6, 0x5293c12e, 0x52f00000, - 0x52f00161, + 0x5293c08e, 0x5293c0c7, 0x5293c12f, 0x52f00000, + 0x52f00162, } // Size: 3116 bytes const specialTagsStr string = "ca-ES-valencia en-US-u-va-posix" -// Total table size 3147 bytes (3KiB); checksum: 6772C83C +// Total table size 3147 bytes (3KiB); checksum: 5A8FFFA5 diff --git a/vendor/golang.org/x/text/internal/language/tables.go b/vendor/golang.org/x/text/internal/language/tables.go index fb6b58378b..14167e74e4 100644 --- a/vendor/golang.org/x/text/internal/language/tables.go +++ b/vendor/golang.org/x/text/internal/language/tables.go @@ -7,11 +7,11 @@ import "golang.org/x/text/internal/tag" // CLDRVersion is the CLDR version from which the tables in this package are derived. const CLDRVersion = "32" -const NumLanguages = 8752 +const NumLanguages = 8798 -const NumScripts = 258 +const NumScripts = 261 -const NumRegions = 357 +const NumRegions = 358 type FromTo struct { From uint16 @@ -263,7 +263,7 @@ var langNoIndex = [2197]uint8{ 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, + 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x72, 0xe9, 0xbf, 0xfd, 0xbf, 0xbf, 0xf7, 0xfd, 0x77, 0x0f, 0xff, 0xef, 0x6f, 0xff, 0xfb, 0xdf, 0xe2, 0xc9, 0xf8, 0x7f, 0x7e, 0x4d, 0xbc, 0x0a, 0x6a, @@ -278,7 +278,7 @@ var langNoIndex = [2197]uint8{ 0xa8, 0xff, 0x1f, 0x67, 0x7d, 0xeb, 0xef, 0xce, 0xff, 0xff, 0x9f, 0xff, 0xb7, 0xef, 0xfe, 0xcf, // Entry 80 - BF - 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x6f, 0xff, 0xff, + 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x7f, 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, @@ -289,11 +289,11 @@ var langNoIndex = [2197]uint8{ // Entry C0 - FF 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96, 0x1b, 0x14, 0x08, 0xf3, 0x2b, 0xe7, 0x17, 0x56, - 0x05, 0x7d, 0x0e, 0x1c, 0x37, 0x7b, 0xf3, 0xef, + 0x05, 0x7d, 0x0e, 0x1c, 0x37, 0x7f, 0xf3, 0xef, 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10, 0xbc, 0x85, 0xaf, 0xdf, 0xff, 0xff, 0x7b, 0x35, 0x3e, 0xc7, 0xc7, 0xdf, 0xff, 0x01, 0x81, 0x00, - 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xb0, 0x05, 0x80, 0x00, 0x20, 0x00, 0x00, 0x03, 0x40, 0x00, 0x40, 0x92, 0x21, 0x50, 0xb1, 0x5d, // Entry 100 - 13F 0xfd, 0xdc, 0xbe, 0x5e, 0x00, 0x00, 0x02, 0x64, @@ -303,20 +303,20 @@ var langNoIndex = [2197]uint8{ 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc7, 0x67, 0x5f, 0x56, 0x99, 0x5e, 0xb5, 0x6c, 0xaf, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x37, 0xda, 0x56, - 0x90, 0x69, 0x01, 0x2c, 0x96, 0x69, 0x20, 0xfb, + 0x90, 0x6d, 0x01, 0x2e, 0x96, 0x69, 0x20, 0xfb, // Entry 140 - 17F 0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x16, - 0x03, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x06, + 0x03, 0x00, 0x00, 0xb0, 0x14, 0x23, 0x50, 0x06, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x10, 0x11, 0x09, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x05, 0x08, 0x00, 0x00, 0x05, 0x00, 0x80, 0x28, 0x04, 0x00, 0x00, 0x40, 0xd5, 0x2d, 0x00, 0x64, 0x35, 0x24, 0x52, 0xf4, 0xd5, 0xbf, 0x62, 0xc9, 0x03, // Entry 180 - 1BF 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x13, 0x39, 0x01, 0xdd, 0x57, 0x98, - 0x21, 0x18, 0x81, 0x00, 0x00, 0x01, 0x40, 0x82, + 0x21, 0x18, 0x81, 0x08, 0x00, 0x01, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0x80, 0xea, 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, @@ -337,7 +337,7 @@ var langNoIndex = [2197]uint8{ 0xa4, 0x45, 0x25, 0x9b, 0x02, 0xdf, 0xe1, 0xdf, 0x03, 0x44, 0x08, 0x90, 0x01, 0x04, 0x81, 0xe3, 0x92, 0x54, 0xdb, 0x28, 0xd3, 0x5f, 0xfe, 0x6d, - 0x79, 0xed, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, + 0x79, 0xed, 0x1c, 0x7f, 0x04, 0x08, 0x00, 0x01, 0x21, 0x12, 0x64, 0x5f, 0xdd, 0x0e, 0x85, 0x4f, 0x40, 0x40, 0x00, 0x04, 0xf1, 0xfd, 0x3d, 0x54, // Entry 240 - 27F @@ -359,13 +359,13 @@ var langNoIndex = [2197]uint8{ 0x03, 0x00, 0x00, 0x00, 0x8c, 0x50, 0x40, 0x04, 0x84, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, // Entry 2C0 - 2FF - 0x02, 0x50, 0x80, 0x11, 0x00, 0x91, 0x6c, 0xe2, - 0x50, 0x27, 0x1d, 0x11, 0x29, 0x06, 0x59, 0xe9, + 0x02, 0x50, 0x80, 0x11, 0x00, 0x99, 0x6c, 0xe2, + 0x50, 0x27, 0x1d, 0x11, 0x29, 0x0e, 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, 0x04, 0x00, 0x01, - 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x08, + 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x40, 0x08, 0xd8, 0xeb, 0xf6, 0x39, 0xc4, 0x8d, 0x12, 0x00, // Entry 300 - 33F 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa0, @@ -392,14 +392,14 @@ var langNoIndex = [2197]uint8{ 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, + 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x7d, 0x1f, 0x06, 0xe6, 0x72, 0x60, 0xd1, 0x3c, 0x7f, 0x44, // Entry 3C0 - 3FF 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, 0xdb, 0xf9, 0x2e, 0x11, - 0x86, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x40, 0x01, + 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x20, + 0x40, 0x54, 0x9f, 0x8a, 0xdf, 0xf9, 0x6e, 0x11, + 0x86, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x40, 0x03, 0x05, 0xd1, 0x50, 0x5c, 0x00, 0x40, 0x00, 0x10, 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2, 0xb9, 0xfd, 0xfc, 0xba, 0xfe, 0xef, 0xc7, 0xbe, @@ -424,12 +424,12 @@ var langNoIndex = [2197]uint8{ // Entry 480 - 4BF 0x93, 0x50, 0x5d, 0xaf, 0xa6, 0xff, 0x99, 0xfb, 0x63, 0x1d, 0x53, 0xff, 0xef, 0xb7, 0x35, 0x20, - 0x14, 0x00, 0x55, 0x51, 0x82, 0x65, 0xf5, 0x41, - 0xe2, 0xff, 0xfc, 0xdf, 0x02, 0x05, 0xc5, 0x05, + 0x14, 0x00, 0x55, 0x51, 0xc2, 0x65, 0xf5, 0x41, + 0xe2, 0xff, 0xfc, 0xdf, 0x02, 0x85, 0xc5, 0x05, 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x05, 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x05, 0x04, 0x01, 0x00, 0x00, - 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xf1, + 0x06, 0x11, 0x20, 0x00, 0x18, 0x01, 0x92, 0xf1, // Entry 4C0 - 4FF 0xfd, 0x47, 0x69, 0x06, 0x95, 0x06, 0x57, 0xed, 0xfb, 0x4d, 0x1c, 0x6b, 0x83, 0x04, 0x62, 0x40, @@ -441,7 +441,7 @@ var langNoIndex = [2197]uint8{ 0xbe, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41, // Entry 500 - 53F 0x30, 0xff, 0x79, 0x72, 0x04, 0x00, 0x00, 0x49, - 0x2d, 0x14, 0x27, 0x57, 0xed, 0xf1, 0x3f, 0xe7, + 0x2d, 0x14, 0x27, 0x5f, 0xed, 0xf1, 0x3f, 0xe7, 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xf8, 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xe7, 0xf7, 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7e, 0x10, @@ -449,7 +449,7 @@ var langNoIndex = [2197]uint8{ 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, + 0x00, 0x00, 0x01, 0x43, 0x19, 0x24, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -464,13 +464,13 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x00, 0xf0, 0xce, 0xfb, 0xbf, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x15, 0xa3, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x00, 0x81, + 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x20, 0x81, 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40, // Entry 5C0 - 5FF - 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x3e, 0x02, + 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0xbe, 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, + 0x3d, 0x40, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, 0x31, 0x00, 0x00, 0x00, 0x01, 0x18, 0x02, 0x20, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x1f, 0xdf, 0xd2, 0xb9, 0xff, 0xfd, 0x3f, @@ -491,20 +491,20 @@ var langNoIndex = [2197]uint8{ 0x02, 0xfb, 0xa3, 0xef, 0xf3, 0xd6, 0xf2, 0xff, 0xb9, 0xda, 0x7d, 0xd0, 0x3e, 0x15, 0x7b, 0xb4, 0xf5, 0x3e, 0xff, 0xff, 0xf1, 0xf7, 0xff, 0xe7, - 0x5f, 0xff, 0xff, 0x9e, 0xdb, 0xf6, 0xd7, 0xb9, + 0x5f, 0xff, 0xff, 0x9e, 0xdf, 0xf6, 0xd7, 0xb9, 0xef, 0x27, 0x80, 0xbb, 0xc5, 0xff, 0xff, 0xe3, // Entry 680 - 6BF 0x97, 0x9d, 0xbf, 0x9f, 0xf7, 0xc7, 0xfd, 0x37, - 0xce, 0x7f, 0x04, 0x1d, 0x73, 0x7f, 0xf8, 0xda, + 0xce, 0x7f, 0x44, 0x1d, 0x73, 0x7f, 0xf8, 0xda, 0x5d, 0xce, 0x7d, 0x06, 0xb9, 0xea, 0x79, 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, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x09, 0x06, 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x10, 0xdc, 0x58, 0xd7, 0x0d, 0x0f, // Entry 6C0 - 6FF - 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd5, 0x42, 0x08, - 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, + 0x54, 0x4d, 0xf1, 0x16, 0x44, 0xd5, 0x42, 0x08, + 0x40, 0x02, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0xdc, 0xfb, 0xcb, 0x0e, 0x58, 0x48, 0x41, 0x24, 0x20, 0x04, 0x00, 0x30, 0x12, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -513,7 +513,7 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00, // Entry 700 - 73F 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x80, 0x86, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x86, 0xc2, 0x00, 0x00, 0x01, 0x00, 0x01, 0xff, 0x18, 0x02, 0x00, 0x02, 0xf0, 0xfd, 0x79, 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, @@ -522,7 +522,7 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 740 - 77F 0x00, 0x00, 0x00, 0xef, 0xd5, 0xfd, 0xcf, 0x7e, - 0xb0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x44, + 0xb0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x46, 0xcd, 0xf9, 0x5c, 0x00, 0x01, 0x00, 0x30, 0x04, 0x04, 0x55, 0x00, 0x01, 0x04, 0xf4, 0x3f, 0x4a, 0x01, 0x00, 0x00, 0xb0, 0x80, 0x20, 0x55, 0x75, @@ -530,12 +530,12 @@ var langNoIndex = [2197]uint8{ 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, 0x8a, 0x01, + 0x83, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, 0x00, 0x00, 0x20, 0x00, 0x24, 0x44, 0x00, 0x00, - 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0, + 0x10, 0x03, 0x31, 0x02, 0x01, 0x00, 0x00, 0xf0, 0xf5, 0xff, 0xd5, 0x97, 0xbc, 0x70, 0xd6, 0x78, - 0x78, 0x15, 0x50, 0x01, 0xa4, 0x84, 0xa9, 0x41, - 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00, + 0x78, 0x15, 0x50, 0x05, 0xa4, 0x84, 0xa9, 0x41, + 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x40, 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02, 0xff, 0xef, 0xff, 0x4b, 0x85, 0x53, 0xf4, 0xed, // Entry 7C0 - 7FF @@ -545,11 +545,11 @@ var langNoIndex = [2197]uint8{ 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x4d, 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80, 0x10, 0x20, 0x24, 0x00, 0xff, 0x2f, 0xd3, 0x60, - 0xfe, 0x01, 0x02, 0x88, 0x0a, 0x40, 0x16, 0x01, + 0xfe, 0x01, 0x02, 0x88, 0x2a, 0x40, 0x16, 0x01, 0x01, 0x15, 0x2b, 0x3c, 0x01, 0x00, 0x00, 0x10, // Entry 800 - 83F 0x90, 0x49, 0x41, 0x02, 0x02, 0x01, 0xe1, 0xbf, - 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0xd1, + 0xbf, 0x03, 0x00, 0x00, 0x10, 0xdc, 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, @@ -557,11 +557,11 @@ var langNoIndex = [2197]uint8{ 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10, 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00, // Entry 840 - 87F - 0xf0, 0xfb, 0xfd, 0x7f, 0x05, 0x00, 0x16, 0x81, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, + 0xf0, 0xfb, 0xfd, 0x7f, 0x05, 0x00, 0x16, 0x89, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28, 0x84, 0x00, 0x21, 0xc0, 0x23, 0x24, 0x00, 0x00, - 0x00, 0xcb, 0xe4, 0x3a, 0x46, 0x88, 0x14, 0xf1, + 0x00, 0xcb, 0xe4, 0x3a, 0x46, 0x88, 0x54, 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, @@ -583,8 +583,8 @@ var altLangIndex = [6]uint16{ } // AliasMap maps langIDs to their suggested replacements. -// Size: 716 bytes, 179 elements -var AliasMap = [179]FromTo{ +// Size: 772 bytes, 193 elements +var AliasMap = [193]FromTo{ 0: {From: 0x82, To: 0x88}, 1: {From: 0x187, To: 0x1ae}, 2: {From: 0x1f3, To: 0x1e1}, @@ -599,223 +599,239 @@ var AliasMap = [179]FromTo{ 11: {From: 0x4a2, To: 0x21}, 12: {From: 0x53e, To: 0x544}, 13: {From: 0x58f, To: 0x12d}, - 14: {From: 0x630, To: 0x1eb1}, - 15: {From: 0x651, To: 0x431}, - 16: {From: 0x662, To: 0x431}, - 17: {From: 0x6ed, To: 0x3a}, - 18: {From: 0x6f8, To: 0x1d7}, - 19: {From: 0x709, To: 0x3625}, - 20: {From: 0x73e, To: 0x21a1}, - 21: {From: 0x7b3, To: 0x56}, - 22: {From: 0x7b9, To: 0x299b}, - 23: {From: 0x7c5, To: 0x58}, - 24: {From: 0x7e6, To: 0x145}, - 25: {From: 0x80c, To: 0x5a}, - 26: {From: 0x815, To: 0x8d}, - 27: {From: 0x87e, To: 0x810}, - 28: {From: 0x8a8, To: 0x8b7}, - 29: {From: 0x8c3, To: 0xee3}, - 30: {From: 0x8fa, To: 0x1dc}, - 31: {From: 0x9ef, To: 0x331}, - 32: {From: 0xa36, To: 0x2c5}, - 33: {From: 0xa3d, To: 0xbf}, - 34: {From: 0xabe, To: 0x3322}, - 35: {From: 0xb38, To: 0x529}, - 36: {From: 0xb75, To: 0x265a}, - 37: {From: 0xb7e, To: 0xbc3}, - 38: {From: 0xb9b, To: 0x44e}, - 39: {From: 0xbbc, To: 0x4229}, - 40: {From: 0xbbf, To: 0x529}, - 41: {From: 0xbfe, To: 0x2da7}, - 42: {From: 0xc2e, To: 0x3181}, - 43: {From: 0xcb9, To: 0xf3}, - 44: {From: 0xd08, To: 0xfa}, - 45: {From: 0xdc8, To: 0x11a}, - 46: {From: 0xdd7, To: 0x32d}, - 47: {From: 0xdf8, To: 0xdfb}, - 48: {From: 0xdfe, To: 0x531}, - 49: {From: 0xe01, To: 0xdf3}, - 50: {From: 0xedf, To: 0x205a}, - 51: {From: 0xee9, To: 0x222e}, - 52: {From: 0xeee, To: 0x2e9a}, - 53: {From: 0xf39, To: 0x367}, - 54: {From: 0x10d0, To: 0x140}, - 55: {From: 0x1104, To: 0x2d0}, - 56: {From: 0x11a0, To: 0x1ec}, - 57: {From: 0x1279, To: 0x21}, - 58: {From: 0x1424, To: 0x15e}, - 59: {From: 0x1470, To: 0x14e}, - 60: {From: 0x151f, To: 0xd9b}, - 61: {From: 0x1523, To: 0x390}, - 62: {From: 0x1532, To: 0x19f}, - 63: {From: 0x1580, To: 0x210}, - 64: {From: 0x1583, To: 0x10d}, - 65: {From: 0x15a3, To: 0x3caf}, - 66: {From: 0x1630, To: 0x222e}, - 67: {From: 0x166a, To: 0x19b}, - 68: {From: 0x16c8, To: 0x136}, - 69: {From: 0x1700, To: 0x29f8}, - 70: {From: 0x1718, To: 0x194}, - 71: {From: 0x1727, To: 0xf3f}, - 72: {From: 0x177a, To: 0x178}, - 73: {From: 0x1809, To: 0x17b6}, - 74: {From: 0x1816, To: 0x18f3}, - 75: {From: 0x188a, To: 0x436}, - 76: {From: 0x1979, To: 0x1d01}, - 77: {From: 0x1a74, To: 0x2bb0}, - 78: {From: 0x1a8a, To: 0x1f8}, - 79: {From: 0x1b5a, To: 0x1fa}, - 80: {From: 0x1b86, To: 0x1515}, - 81: {From: 0x1d64, To: 0x2c9b}, - 82: {From: 0x2038, To: 0x37b1}, - 83: {From: 0x203d, To: 0x20dd}, - 84: {From: 0x205a, To: 0x30b}, - 85: {From: 0x20e3, To: 0x274}, - 86: {From: 0x20ee, To: 0x263}, - 87: {From: 0x20f2, To: 0x22d}, - 88: {From: 0x20f9, To: 0x256}, - 89: {From: 0x210f, To: 0x21eb}, - 90: {From: 0x2135, To: 0x27d}, - 91: {From: 0x2160, To: 0x913}, - 92: {From: 0x2199, To: 0x121}, - 93: {From: 0x21ce, To: 0x1561}, - 94: {From: 0x21e6, To: 0x504}, - 95: {From: 0x21f4, To: 0x49f}, - 96: {From: 0x21fb, To: 0x269}, - 97: {From: 0x222d, To: 0x121}, - 98: {From: 0x2237, To: 0x121}, - 99: {From: 0x2262, To: 0x92a}, - 100: {From: 0x2316, To: 0x3226}, - 101: {From: 0x236a, To: 0x2835}, - 102: {From: 0x2382, To: 0x3365}, - 103: {From: 0x2472, To: 0x2c7}, - 104: {From: 0x24e4, To: 0x2ff}, - 105: {From: 0x24f0, To: 0x2fa}, - 106: {From: 0x24fa, To: 0x31f}, - 107: {From: 0x2550, To: 0xb5b}, - 108: {From: 0x25a9, To: 0xe2}, - 109: {From: 0x263e, To: 0x2d0}, - 110: {From: 0x26c9, To: 0x26b4}, - 111: {From: 0x26f9, To: 0x3c8}, - 112: {From: 0x2727, To: 0x3caf}, - 113: {From: 0x2755, To: 0x6a4}, - 114: {From: 0x2765, To: 0x26b4}, - 115: {From: 0x2789, To: 0x4358}, - 116: {From: 0x27c9, To: 0x2001}, - 117: {From: 0x28ea, To: 0x27b1}, - 118: {From: 0x28ef, To: 0x2837}, - 119: {From: 0x2914, To: 0x351}, - 120: {From: 0x2986, To: 0x2da7}, - 121: {From: 0x29f0, To: 0x96b}, - 122: {From: 0x2b1a, To: 0x38d}, - 123: {From: 0x2bfc, To: 0x395}, - 124: {From: 0x2c3f, To: 0x3caf}, - 125: {From: 0x2ce1, To: 0x2201}, - 126: {From: 0x2cfc, To: 0x3be}, - 127: {From: 0x2d13, To: 0x597}, - 128: {From: 0x2d47, To: 0x148}, - 129: {From: 0x2d48, To: 0x148}, - 130: {From: 0x2dff, To: 0x2f1}, - 131: {From: 0x2e08, To: 0x19cc}, - 132: {From: 0x2e1a, To: 0x2d95}, - 133: {From: 0x2e21, To: 0x292}, - 134: {From: 0x2e54, To: 0x7d}, - 135: {From: 0x2e65, To: 0x2282}, - 136: {From: 0x2ea0, To: 0x2e9b}, - 137: {From: 0x2eef, To: 0x2ed7}, - 138: {From: 0x3193, To: 0x3c4}, - 139: {From: 0x3366, To: 0x338e}, - 140: {From: 0x342a, To: 0x3dc}, - 141: {From: 0x34ee, To: 0x18d0}, - 142: {From: 0x35c8, To: 0x2c9b}, - 143: {From: 0x35e6, To: 0x412}, - 144: {From: 0x3658, To: 0x246}, - 145: {From: 0x3676, To: 0x3f4}, - 146: {From: 0x36fd, To: 0x445}, - 147: {From: 0x37c0, To: 0x121}, - 148: {From: 0x3816, To: 0x38f2}, - 149: {From: 0x382a, To: 0x2b48}, - 150: {From: 0x382b, To: 0x2c9b}, - 151: {From: 0x382f, To: 0xa9}, - 152: {From: 0x3832, To: 0x3228}, - 153: {From: 0x386c, To: 0x39a6}, - 154: {From: 0x3892, To: 0x3fc0}, - 155: {From: 0x38a5, To: 0x39d7}, - 156: {From: 0x38b4, To: 0x1fa4}, - 157: {From: 0x38b5, To: 0x2e9a}, - 158: {From: 0x395c, To: 0x47e}, - 159: {From: 0x3b4e, To: 0xd91}, - 160: {From: 0x3b78, To: 0x137}, - 161: {From: 0x3c99, To: 0x4bc}, - 162: {From: 0x3fbd, To: 0x100}, - 163: {From: 0x4208, To: 0xa91}, - 164: {From: 0x42be, To: 0x573}, - 165: {From: 0x42f9, To: 0x3f60}, - 166: {From: 0x4378, To: 0x25a}, - 167: {From: 0x43b8, To: 0xe6c}, - 168: {From: 0x43cd, To: 0x10f}, - 169: {From: 0x44af, To: 0x3322}, - 170: {From: 0x44e3, To: 0x512}, - 171: {From: 0x45ca, To: 0x2409}, - 172: {From: 0x45dd, To: 0x26dc}, - 173: {From: 0x4610, To: 0x48ae}, - 174: {From: 0x46ae, To: 0x46a0}, - 175: {From: 0x473e, To: 0x4745}, - 176: {From: 0x4817, To: 0x3503}, - 177: {From: 0x4916, To: 0x31f}, - 178: {From: 0x49a7, To: 0x523}, + 14: {From: 0x62b, To: 0x34}, + 15: {From: 0x62f, To: 0x14}, + 16: {From: 0x630, To: 0x1eb1}, + 17: {From: 0x651, To: 0x431}, + 18: {From: 0x662, To: 0x431}, + 19: {From: 0x6ed, To: 0x3a}, + 20: {From: 0x6f8, To: 0x1d7}, + 21: {From: 0x709, To: 0x3625}, + 22: {From: 0x73e, To: 0x21a1}, + 23: {From: 0x7b3, To: 0x56}, + 24: {From: 0x7b9, To: 0x299b}, + 25: {From: 0x7c5, To: 0x58}, + 26: {From: 0x7e6, To: 0x145}, + 27: {From: 0x80c, To: 0x5a}, + 28: {From: 0x815, To: 0x8d}, + 29: {From: 0x87e, To: 0x810}, + 30: {From: 0x8a8, To: 0x8b7}, + 31: {From: 0x8c3, To: 0xee3}, + 32: {From: 0x8fa, To: 0x1dc}, + 33: {From: 0x9ef, To: 0x331}, + 34: {From: 0xa36, To: 0x2c5}, + 35: {From: 0xa3d, To: 0xbf}, + 36: {From: 0xabe, To: 0x3322}, + 37: {From: 0xb38, To: 0x529}, + 38: {From: 0xb75, To: 0x265a}, + 39: {From: 0xb7e, To: 0xbc3}, + 40: {From: 0xb9b, To: 0x44e}, + 41: {From: 0xbbc, To: 0x4229}, + 42: {From: 0xbbf, To: 0x529}, + 43: {From: 0xbfe, To: 0x2da7}, + 44: {From: 0xc2e, To: 0x3181}, + 45: {From: 0xcb9, To: 0xf3}, + 46: {From: 0xd08, To: 0xfa}, + 47: {From: 0xdc8, To: 0x11a}, + 48: {From: 0xdd7, To: 0x32d}, + 49: {From: 0xdf8, To: 0xdfb}, + 50: {From: 0xdfe, To: 0x531}, + 51: {From: 0xe01, To: 0xdf3}, + 52: {From: 0xedf, To: 0x205a}, + 53: {From: 0xee9, To: 0x222e}, + 54: {From: 0xeee, To: 0x2e9a}, + 55: {From: 0xf39, To: 0x367}, + 56: {From: 0x10d0, To: 0x140}, + 57: {From: 0x1104, To: 0x2d0}, + 58: {From: 0x11a0, To: 0x1ec}, + 59: {From: 0x1279, To: 0x21}, + 60: {From: 0x1424, To: 0x15e}, + 61: {From: 0x1470, To: 0x14e}, + 62: {From: 0x151f, To: 0xd9b}, + 63: {From: 0x1523, To: 0x390}, + 64: {From: 0x1532, To: 0x19f}, + 65: {From: 0x1580, To: 0x210}, + 66: {From: 0x1583, To: 0x10d}, + 67: {From: 0x15a3, To: 0x3caf}, + 68: {From: 0x1630, To: 0x222e}, + 69: {From: 0x166a, To: 0x19b}, + 70: {From: 0x16c8, To: 0x136}, + 71: {From: 0x1700, To: 0x29f8}, + 72: {From: 0x1718, To: 0x194}, + 73: {From: 0x1727, To: 0xf3f}, + 74: {From: 0x177a, To: 0x178}, + 75: {From: 0x1809, To: 0x17b6}, + 76: {From: 0x1816, To: 0x18f3}, + 77: {From: 0x188a, To: 0x436}, + 78: {From: 0x1979, To: 0x1d01}, + 79: {From: 0x1a74, To: 0x2bb0}, + 80: {From: 0x1a8a, To: 0x1f8}, + 81: {From: 0x1b5a, To: 0x1fa}, + 82: {From: 0x1b86, To: 0x1515}, + 83: {From: 0x1d64, To: 0x2c9b}, + 84: {From: 0x2038, To: 0x37b1}, + 85: {From: 0x203d, To: 0x20dd}, + 86: {From: 0x2042, To: 0x2e00}, + 87: {From: 0x205a, To: 0x30b}, + 88: {From: 0x20e3, To: 0x274}, + 89: {From: 0x20ee, To: 0x263}, + 90: {From: 0x20f2, To: 0x22d}, + 91: {From: 0x20f9, To: 0x256}, + 92: {From: 0x210f, To: 0x21eb}, + 93: {From: 0x2135, To: 0x27d}, + 94: {From: 0x2160, To: 0x913}, + 95: {From: 0x2199, To: 0x121}, + 96: {From: 0x21ce, To: 0x1561}, + 97: {From: 0x21e6, To: 0x504}, + 98: {From: 0x21f4, To: 0x49f}, + 99: {From: 0x21fb, To: 0x269}, + 100: {From: 0x222d, To: 0x121}, + 101: {From: 0x2237, To: 0x121}, + 102: {From: 0x2248, To: 0x217d}, + 103: {From: 0x2262, To: 0x92a}, + 104: {From: 0x2316, To: 0x3226}, + 105: {From: 0x236a, To: 0x2835}, + 106: {From: 0x2382, To: 0x3365}, + 107: {From: 0x2472, To: 0x2c7}, + 108: {From: 0x24e4, To: 0x2ff}, + 109: {From: 0x24f0, To: 0x2fa}, + 110: {From: 0x24fa, To: 0x31f}, + 111: {From: 0x2550, To: 0xb5b}, + 112: {From: 0x25a9, To: 0xe2}, + 113: {From: 0x263e, To: 0x2d0}, + 114: {From: 0x26c9, To: 0x26b4}, + 115: {From: 0x26f9, To: 0x3c8}, + 116: {From: 0x2727, To: 0x3caf}, + 117: {From: 0x2755, To: 0x6a4}, + 118: {From: 0x2765, To: 0x26b4}, + 119: {From: 0x2789, To: 0x4358}, + 120: {From: 0x27c9, To: 0x2001}, + 121: {From: 0x28ea, To: 0x27b1}, + 122: {From: 0x28ef, To: 0x2837}, + 123: {From: 0x28fe, To: 0xaa5}, + 124: {From: 0x2914, To: 0x351}, + 125: {From: 0x2986, To: 0x2da7}, + 126: {From: 0x29f0, To: 0x96b}, + 127: {From: 0x2b1a, To: 0x38d}, + 128: {From: 0x2bfc, To: 0x395}, + 129: {From: 0x2c3f, To: 0x3caf}, + 130: {From: 0x2ce1, To: 0x2201}, + 131: {From: 0x2cfc, To: 0x3be}, + 132: {From: 0x2d13, To: 0x597}, + 133: {From: 0x2d47, To: 0x148}, + 134: {From: 0x2d48, To: 0x148}, + 135: {From: 0x2dff, To: 0x2f1}, + 136: {From: 0x2e08, To: 0x19cc}, + 137: {From: 0x2e10, To: 0xc45}, + 138: {From: 0x2e1a, To: 0x2d95}, + 139: {From: 0x2e21, To: 0x292}, + 140: {From: 0x2e54, To: 0x7d}, + 141: {From: 0x2e65, To: 0x2282}, + 142: {From: 0x2e97, To: 0x1a4}, + 143: {From: 0x2ea0, To: 0x2e9b}, + 144: {From: 0x2eef, To: 0x2ed7}, + 145: {From: 0x3193, To: 0x3c4}, + 146: {From: 0x3366, To: 0x338e}, + 147: {From: 0x342a, To: 0x3dc}, + 148: {From: 0x34ee, To: 0x18d0}, + 149: {From: 0x35c8, To: 0x2c9b}, + 150: {From: 0x35e6, To: 0x412}, + 151: {From: 0x35f5, To: 0x24b}, + 152: {From: 0x360d, To: 0x1dc}, + 153: {From: 0x3658, To: 0x246}, + 154: {From: 0x3676, To: 0x3f4}, + 155: {From: 0x36fd, To: 0x445}, + 156: {From: 0x3747, To: 0x3b42}, + 157: {From: 0x37c0, To: 0x121}, + 158: {From: 0x3816, To: 0x38f2}, + 159: {From: 0x382a, To: 0x2b48}, + 160: {From: 0x382b, To: 0x2c9b}, + 161: {From: 0x382f, To: 0xa9}, + 162: {From: 0x3832, To: 0x3228}, + 163: {From: 0x386c, To: 0x39a6}, + 164: {From: 0x3892, To: 0x3fc0}, + 165: {From: 0x38a0, To: 0x45f}, + 166: {From: 0x38a5, To: 0x39d7}, + 167: {From: 0x38b4, To: 0x1fa4}, + 168: {From: 0x38b5, To: 0x2e9a}, + 169: {From: 0x38fa, To: 0x38f1}, + 170: {From: 0x395c, To: 0x47e}, + 171: {From: 0x3b4e, To: 0xd91}, + 172: {From: 0x3b78, To: 0x137}, + 173: {From: 0x3c99, To: 0x4bc}, + 174: {From: 0x3fbd, To: 0x100}, + 175: {From: 0x4208, To: 0xa91}, + 176: {From: 0x42be, To: 0x573}, + 177: {From: 0x42f9, To: 0x3f60}, + 178: {From: 0x4378, To: 0x25a}, + 179: {From: 0x43b8, To: 0xe6c}, + 180: {From: 0x43cd, To: 0x10f}, + 181: {From: 0x43d4, To: 0x4848}, + 182: {From: 0x44af, To: 0x3322}, + 183: {From: 0x44e3, To: 0x512}, + 184: {From: 0x45ca, To: 0x2409}, + 185: {From: 0x45dd, To: 0x26dc}, + 186: {From: 0x4610, To: 0x48ae}, + 187: {From: 0x46ae, To: 0x46a0}, + 188: {From: 0x473e, To: 0x4745}, + 189: {From: 0x4817, To: 0x3503}, + 190: {From: 0x483b, To: 0x208b}, + 191: {From: 0x4916, To: 0x31f}, + 192: {From: 0x49a7, To: 0x523}, } -// Size: 179 bytes, 179 elements -var AliasTypes = [179]AliasType{ +// Size: 193 bytes, 193 elements +var AliasTypes = [193]AliasType{ // Entry 0 - 3F - 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, - 1, 1, 2, 0, 0, 1, 0, 1, 2, 1, 1, 0, 0, 0, 0, 2, - 1, 1, 0, 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, - 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, + 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 0, 0, + 1, 2, 1, 1, 2, 0, 0, 1, 0, 1, 2, 1, 1, 0, 0, 0, + 0, 2, 1, 1, 0, 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, + 1, 1, 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, // Entry 40 - 7F - 2, 0, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 0, 0, 2, 1, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, 1, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, + 1, 2, 2, 0, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 0, 0, + 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, + 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, // Entry 80 - BF - 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 0, 2, - 1, 1, 1, 0, 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, - 0, 1, 1, + 1, 0, 0, 1, 0, 2, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 2, 0, 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 0, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + // Entry C0 - FF + 1, } const ( - _Latn = 90 + _Latn = 91 _Hani = 57 _Hans = 59 _Hant = 60 - _Qaaa = 147 - _Qaai = 155 - _Qabx = 196 - _Zinh = 252 - _Zyyy = 257 - _Zzzz = 258 + _Qaaa = 149 + _Qaai = 157 + _Qabx = 198 + _Zinh = 255 + _Zyyy = 260 + _Zzzz = 261 ) // 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. -const script tag.Index = "" + // Size: 1040 bytes +const script tag.Index = "" + // Size: 1052 bytes "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" + "BrahBraiBugiBuhdCakmCansCariChamCherChrsCirtCoptCpmnCprtCyrlCyrsDevaDiak" + "DogrDsrtDuplEgydEgyhEgypElbaElymEthiGeokGeorGlagGongGonmGothGranGrekGujr" + "GuruHanbHangHaniHanoHansHantHatrHebrHiraHluwHmngHmnpHrktHungIndsItalJamo" + - "JavaJpanJurcKaliKanaKharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatfLatg" + - "LatnLekeLepcLimbLinaLinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedfMend" + - "MercMeroMlymModiMongMoonMrooMteiMultMymrNandNarbNbatNewaNkdbNkgbNkooNshu" + - "OgamOlckOrkhOryaOsgeOsmaOugrPalmPaucPcunPelmPermPhagPhliPhlpPhlvPhnxPiqd" + - "PlrdPrtiPsinQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaamQaanQaao" + - "QaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabeQabfQabg" + - "QabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabwQabxRanj" + - "RjngRohgRoroRunrSamrSaraSarbSaurSgnwShawShrdShuiSiddSindSinhSogdSogoSora" + - "SoyoSundSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglg" + - "ThaaThaiTibtTirhTnsaTotoUgarVaiiVispVithWaraWchoWoleXpeoXsuxYeziYiiiZanb" + - "ZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff\xff" + "JavaJpanJurcKaliKanaKawiKharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatf" + + "LatgLatnLekeLepcLimbLinaLinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedf" + + "MendMercMeroMlymModiMongMoonMrooMteiMultMymrNagmNandNarbNbatNewaNkdbNkgb" + + "NkooNshuOgamOlckOrkhOryaOsgeOsmaOugrPalmPaucPcunPelmPermPhagPhliPhlpPhlv" + + "PhnxPiqdPlrdPrtiPsinQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaam" + + "QaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabe" + + "QabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabw" + + "QabxRanjRjngRohgRoroRunrSamrSaraSarbSaurSgnwShawShrdShuiSiddSindSinhSogd" + + "SogoSoraSoyoSundSunuSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTelu" + + "TengTfngTglgThaaThaiTibtTirhTnsaTotoUgarVaiiVispVithWaraWchoWoleXpeoXsux" + + "YeziYiiiZanbZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff\xff" // 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. @@ -824,7 +840,7 @@ var suppressScript = [1330]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -833,7 +849,7 @@ var suppressScript = [1330]uint8{ // Entry 40 - 7F 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 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, @@ -846,53 +862,53 @@ var suppressScript = [1330]uint8{ 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, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry C0 - FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 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, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 100 - 13F - 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xea, 0x00, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, + 0xed, 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x5a, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x5b, 0x00, // Entry 140 - 17F - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 180 - 1BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x35, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x22, 0x00, // Entry 1C0 - 1FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x5a, 0x00, 0x5a, 0x5a, 0x00, 0x08, + 0x00, 0x5b, 0x5b, 0x00, 0x5b, 0x5b, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x5a, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x5b, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, // Entry 200 - 23F 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -903,9 +919,9 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 240 - 27F - 0x00, 0x00, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x53, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x53, 0x00, 0x00, 0x54, 0x00, 0x22, 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, @@ -913,93 +929,93 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 280 - 2BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 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, 0x5a, 0x00, 0x00, - 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 2C0 - 2FF - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 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, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, // Entry 300 - 33F - 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x5a, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x5b, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, // Entry 340 - 37F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x5a, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x5a, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x5b, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x5b, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 380 - 3BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, // Entry 3C0 - 3FF - 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x5b, 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 - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, // Entry 440 - 47F - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xe6, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0x2c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0xe9, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x2c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, // Entry 480 - 4BF - 0x5a, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x5b, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 4C0 - 4FF - 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x5b, 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, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 500 - 53F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1007,7 +1023,7 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x3e, 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, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, } @@ -1016,16 +1032,16 @@ const ( _419 = 31 _BR = 65 _CA = 73 - _ES = 110 - _GB = 123 - _MD = 188 - _PT = 238 - _UK = 306 - _US = 309 - _ZZ = 357 - _XA = 323 - _XC = 325 - _XK = 333 + _ES = 111 + _GB = 124 + _MD = 189 + _PT = 239 + _UK = 307 + _US = 310 + _ZZ = 358 + _XA = 324 + _XC = 326 + _XK = 334 ) // isoRegionOffset needs to be added to the index of regionISO to obtain the regionID @@ -1034,8 +1050,8 @@ const ( const isoRegionOffset = 32 // regionTypes defines the status of a region for various standards. -// Size: 358 bytes, 358 elements -var regionTypes = [358]uint8{ +// Size: 359 bytes, 359 elements +var regionTypes = [359]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1048,45 +1064,45 @@ var regionTypes = [358]uint8{ // Entry 40 - 7F 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, - 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, - 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, - 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 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, // Entry 80 - BF 0x06, 0x06, 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, // Entry C0 - FF - 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, 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, + 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, 0x05, 0x05, 0x05, 0x05, 0x05, // Entry 100 - 13F - 0x05, 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x05, 0x05, 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, 0x04, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, // Entry 140 - 17F - 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 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, 0x04, 0x06, 0x06, - 0x04, 0x06, 0x06, 0x04, 0x06, 0x05, + 0x05, 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. @@ -1094,27 +1110,27 @@ var regionTypes = [358]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. -const regionISO tag.Index = "" + // Size: 1308 bytes +const regionISO tag.Index = "" + // Size: 1312 bytes "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" + "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" + "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" + - "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" + - "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" + "CQ CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADO" + + "OMDYHYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSM" + + "FOROFQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQ" + + "NQGRRCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERL" + + "ILSRIMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM" + + "\x00\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSO" + + "LTTULUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNP" + + "MQTQMRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLD" + + "NOORNPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM" + + "\x00\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSS" + + "QTTTQU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLB" + + "SCYCSDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXM" + + "SYYRSZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTT" + + "TOTVUVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVN" + + "NMVUUTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXN" + + "NNXOOOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUG" + + "ZAAFZMMBZRARZWWEZZZZ\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. @@ -1124,38 +1140,38 @@ const altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" // of the 3-letter ISO codes in altRegionISO3. // Size: 22 bytes, 11 elements var altRegionIDs = [11]uint16{ - 0x0057, 0x0070, 0x0088, 0x00a8, 0x00aa, 0x00ad, 0x00ea, 0x0105, - 0x0121, 0x015f, 0x00dc, + 0x0058, 0x0071, 0x0089, 0x00a9, 0x00ab, 0x00ae, 0x00eb, 0x0106, + 0x0122, 0x0160, 0x00dd, } // Size: 80 bytes, 20 elements var regionOldMap = [20]FromTo{ - 0: {From: 0x44, To: 0xc4}, - 1: {From: 0x58, To: 0xa7}, - 2: {From: 0x5f, To: 0x60}, - 3: {From: 0x66, To: 0x3b}, - 4: {From: 0x79, To: 0x78}, - 5: {From: 0x93, To: 0x37}, - 6: {From: 0xa3, To: 0x133}, - 7: {From: 0xc1, To: 0x133}, - 8: {From: 0xd7, To: 0x13f}, - 9: {From: 0xdc, To: 0x2b}, - 10: {From: 0xef, To: 0x133}, - 11: {From: 0xf2, To: 0xe2}, - 12: {From: 0xfc, To: 0x70}, - 13: {From: 0x103, To: 0x164}, - 14: {From: 0x12a, To: 0x126}, - 15: {From: 0x132, To: 0x7b}, - 16: {From: 0x13a, To: 0x13e}, - 17: {From: 0x141, To: 0x133}, - 18: {From: 0x15d, To: 0x15e}, - 19: {From: 0x163, To: 0x4b}, + 0: {From: 0x44, To: 0xc5}, + 1: {From: 0x59, To: 0xa8}, + 2: {From: 0x60, To: 0x61}, + 3: {From: 0x67, To: 0x3b}, + 4: {From: 0x7a, To: 0x79}, + 5: {From: 0x94, To: 0x37}, + 6: {From: 0xa4, To: 0x134}, + 7: {From: 0xc2, To: 0x134}, + 8: {From: 0xd8, To: 0x140}, + 9: {From: 0xdd, To: 0x2b}, + 10: {From: 0xf0, To: 0x134}, + 11: {From: 0xf3, To: 0xe3}, + 12: {From: 0xfd, To: 0x71}, + 13: {From: 0x104, To: 0x165}, + 14: {From: 0x12b, To: 0x127}, + 15: {From: 0x133, To: 0x7c}, + 16: {From: 0x13b, To: 0x13f}, + 17: {From: 0x142, To: 0x134}, + 18: {From: 0x15e, To: 0x15f}, + 19: {From: 0x164, To: 0x4b}, } // m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are // codes indicating collections of regions. -// Size: 716 bytes, 358 elements -var m49 = [358]int16{ +// Size: 718 bytes, 359 elements +var m49 = [359]int16{ // Entry 0 - 3F 0, 1, 2, 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 21, 29, 30, @@ -1168,45 +1184,45 @@ var m49 = [358]int16{ // Entry 40 - 7F 535, 76, 44, 64, 104, 74, 72, 112, 84, 124, 166, 180, 140, 178, 756, 384, - 184, 152, 120, 156, 170, 0, 188, 891, - 296, 192, 132, 531, 162, 196, 203, 278, - 276, 0, 262, 208, 212, 214, 204, 12, - 0, 218, 233, 818, 732, 232, 724, 231, - 967, 0, 246, 242, 238, 583, 234, 0, - 250, 249, 266, 826, 308, 268, 254, 831, + 184, 152, 120, 156, 170, 0, 0, 188, + 891, 296, 192, 132, 531, 162, 196, 203, + 278, 276, 0, 262, 208, 212, 214, 204, + 12, 0, 218, 233, 818, 732, 232, 724, + 231, 967, 0, 246, 242, 238, 583, 234, + 0, 250, 249, 266, 826, 308, 268, 254, // Entry 80 - BF - 288, 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, + 831, 288, 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, // Entry C0 - FF - 584, 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, + 450, 584, 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, // Entry 100 - 13F - 971, 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, + 970, 971, 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, // Entry 140 - 17F - 876, 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, + 548, 876, 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 @@ -1227,65 +1243,65 @@ var m49Index = [9]int16{ var fromM49 = [333]uint16{ // Entry 0 - 3F 0x0201, 0x0402, 0x0603, 0x0824, 0x0a04, 0x1027, 0x1205, 0x142b, - 0x1606, 0x1867, 0x1a07, 0x1c08, 0x1e09, 0x202d, 0x220a, 0x240b, + 0x1606, 0x1868, 0x1a07, 0x1c08, 0x1e09, 0x202d, 0x220a, 0x240b, 0x260c, 0x2822, 0x2a0d, 0x302a, 0x3825, 0x3a0e, 0x3c0f, 0x3e32, 0x402c, 0x4410, 0x4611, 0x482f, 0x4e12, 0x502e, 0x5842, 0x6039, 0x6435, 0x6628, 0x6834, 0x6a13, 0x6c14, 0x7036, 0x7215, 0x783d, 0x7a16, 0x8043, 0x883f, 0x8c33, 0x9046, 0x9445, 0x9841, 0xa848, - 0xac9a, 0xb509, 0xb93c, 0xc03e, 0xc838, 0xd0c4, 0xd83a, 0xe047, - 0xe8a6, 0xf052, 0xf849, 0x085a, 0x10ad, 0x184c, 0x1c17, 0x1e18, + 0xac9b, 0xb50a, 0xb93d, 0xc03e, 0xc838, 0xd0c5, 0xd83a, 0xe047, + 0xe8a7, 0xf052, 0xf849, 0x085b, 0x10ae, 0x184c, 0x1c17, 0x1e18, // Entry 40 - 7F - 0x20b3, 0x2219, 0x2920, 0x2c1a, 0x2e1b, 0x3051, 0x341c, 0x361d, - 0x3853, 0x3d2e, 0x445c, 0x4c4a, 0x5454, 0x5ca8, 0x5f5f, 0x644d, - 0x684b, 0x7050, 0x7856, 0x7e90, 0x8059, 0x885d, 0x941e, 0x965e, - 0x983b, 0xa063, 0xa864, 0xac65, 0xb469, 0xbd1a, 0xc486, 0xcc6f, - 0xce6f, 0xd06d, 0xd26a, 0xd476, 0xdc74, 0xde88, 0xe473, 0xec72, - 0xf031, 0xf279, 0xf478, 0xfc7e, 0x04e5, 0x0921, 0x0c62, 0x147a, - 0x187d, 0x1c83, 0x26ed, 0x2860, 0x2c5f, 0x3060, 0x4080, 0x4881, - 0x50a7, 0x5887, 0x6082, 0x687c, 0x7085, 0x788a, 0x8089, 0x8884, + 0x20b4, 0x2219, 0x2921, 0x2c1a, 0x2e1b, 0x3051, 0x341c, 0x361d, + 0x3853, 0x3d2f, 0x445d, 0x4c4a, 0x5454, 0x5ca9, 0x5f60, 0x644d, + 0x684b, 0x7050, 0x7857, 0x7e91, 0x805a, 0x885e, 0x941e, 0x965f, + 0x983b, 0xa064, 0xa865, 0xac66, 0xb46a, 0xbd1b, 0xc487, 0xcc70, + 0xce70, 0xd06e, 0xd26b, 0xd477, 0xdc75, 0xde89, 0xe474, 0xec73, + 0xf031, 0xf27a, 0xf479, 0xfc7f, 0x04e6, 0x0922, 0x0c63, 0x147b, + 0x187e, 0x1c84, 0x26ee, 0x2861, 0x2c60, 0x3061, 0x4081, 0x4882, + 0x50a8, 0x5888, 0x6083, 0x687d, 0x7086, 0x788b, 0x808a, 0x8885, // Entry 80 - BF - 0x908c, 0x9891, 0x9c8e, 0xa138, 0xa88f, 0xb08d, 0xb892, 0xc09d, - 0xc899, 0xd095, 0xd89c, 0xe09b, 0xe896, 0xf097, 0xf89e, 0x004f, - 0x08a0, 0x10a2, 0x1cae, 0x20a1, 0x28a4, 0x30aa, 0x34ab, 0x3cac, - 0x42a5, 0x44af, 0x461f, 0x4cb0, 0x54b5, 0x58b8, 0x5cb4, 0x64b9, - 0x6cb2, 0x70b6, 0x74b7, 0x7cc6, 0x84bf, 0x8cce, 0x94d0, 0x9ccd, - 0xa4c3, 0xaccb, 0xb4c8, 0xbcc9, 0xc0cc, 0xc8cf, 0xd8bb, 0xe0c5, - 0xe4bc, 0xe6bd, 0xe8ca, 0xf0ba, 0xf8d1, 0x00e1, 0x08d2, 0x10dd, - 0x18db, 0x20d9, 0x2429, 0x265b, 0x2a30, 0x2d1b, 0x2e40, 0x30de, + 0x908d, 0x9892, 0x9c8f, 0xa139, 0xa890, 0xb08e, 0xb893, 0xc09e, + 0xc89a, 0xd096, 0xd89d, 0xe09c, 0xe897, 0xf098, 0xf89f, 0x004f, + 0x08a1, 0x10a3, 0x1caf, 0x20a2, 0x28a5, 0x30ab, 0x34ac, 0x3cad, + 0x42a6, 0x44b0, 0x461f, 0x4cb1, 0x54b6, 0x58b9, 0x5cb5, 0x64ba, + 0x6cb3, 0x70b7, 0x74b8, 0x7cc7, 0x84c0, 0x8ccf, 0x94d1, 0x9cce, + 0xa4c4, 0xaccc, 0xb4c9, 0xbcca, 0xc0cd, 0xc8d0, 0xd8bc, 0xe0c6, + 0xe4bd, 0xe6be, 0xe8cb, 0xf0bb, 0xf8d2, 0x00e2, 0x08d3, 0x10de, + 0x18dc, 0x20da, 0x2429, 0x265c, 0x2a30, 0x2d1c, 0x2e40, 0x30df, // Entry C0 - FF - 0x38d3, 0x493f, 0x54e0, 0x5cd8, 0x64d4, 0x6cd6, 0x74df, 0x7cd5, - 0x84da, 0x88c7, 0x8b33, 0x8e75, 0x90c0, 0x92f0, 0x94e8, 0x9ee2, - 0xace6, 0xb0f1, 0xb8e4, 0xc0e7, 0xc8eb, 0xd0e9, 0xd8ee, 0xe08b, - 0xe526, 0xecec, 0xf4f3, 0xfd02, 0x0504, 0x0706, 0x0d07, 0x183c, - 0x1d0e, 0x26a9, 0x2826, 0x2cb1, 0x2ebe, 0x34ea, 0x3d39, 0x4513, - 0x4d18, 0x5508, 0x5d14, 0x6105, 0x650a, 0x6d12, 0x7d0d, 0x7f11, - 0x813e, 0x830f, 0x8515, 0x8d61, 0x9964, 0xa15d, 0xa86e, 0xb117, - 0xb30b, 0xb86c, 0xc10b, 0xc916, 0xd110, 0xd91d, 0xe10c, 0xe84e, + 0x38d4, 0x4940, 0x54e1, 0x5cd9, 0x64d5, 0x6cd7, 0x74e0, 0x7cd6, + 0x84db, 0x88c8, 0x8b34, 0x8e76, 0x90c1, 0x92f1, 0x94e9, 0x9ee3, + 0xace7, 0xb0f2, 0xb8e5, 0xc0e8, 0xc8ec, 0xd0ea, 0xd8ef, 0xe08c, + 0xe527, 0xeced, 0xf4f4, 0xfd03, 0x0505, 0x0707, 0x0d08, 0x183c, + 0x1d0f, 0x26aa, 0x2826, 0x2cb2, 0x2ebf, 0x34eb, 0x3d3a, 0x4514, + 0x4d19, 0x5509, 0x5d15, 0x6106, 0x650b, 0x6d13, 0x7d0e, 0x7f12, + 0x813f, 0x8310, 0x8516, 0x8d62, 0x9965, 0xa15e, 0xa86f, 0xb118, + 0xb30c, 0xb86d, 0xc10c, 0xc917, 0xd111, 0xd91e, 0xe10d, 0xe84e, // Entry 100 - 13F - 0xf11c, 0xf524, 0xf923, 0x0122, 0x0925, 0x1129, 0x192c, 0x2023, - 0x2928, 0x312b, 0x3727, 0x391f, 0x3d2d, 0x4131, 0x4930, 0x4ec2, - 0x5519, 0x646b, 0x747b, 0x7e7f, 0x809f, 0x8298, 0x852f, 0x9135, - 0xa53d, 0xac37, 0xb536, 0xb937, 0xbd3b, 0xd940, 0xe542, 0xed5e, - 0xef5e, 0xf657, 0xfd62, 0x7c20, 0x7ef4, 0x80f5, 0x82f6, 0x84f7, - 0x86f8, 0x88f9, 0x8afa, 0x8cfb, 0x8e70, 0x90fd, 0x92fe, 0x94ff, - 0x9700, 0x9901, 0x9b43, 0x9d44, 0x9f45, 0xa146, 0xa347, 0xa548, - 0xa749, 0xa94a, 0xab4b, 0xad4c, 0xaf4d, 0xb14e, 0xb34f, 0xb550, + 0xf11d, 0xf525, 0xf924, 0x0123, 0x0926, 0x112a, 0x192d, 0x2023, + 0x2929, 0x312c, 0x3728, 0x3920, 0x3d2e, 0x4132, 0x4931, 0x4ec3, + 0x551a, 0x646c, 0x747c, 0x7e80, 0x80a0, 0x8299, 0x8530, 0x9136, + 0xa53e, 0xac37, 0xb537, 0xb938, 0xbd3c, 0xd941, 0xe543, 0xed5f, + 0xef5f, 0xf658, 0xfd63, 0x7c20, 0x7ef5, 0x80f6, 0x82f7, 0x84f8, + 0x86f9, 0x88fa, 0x8afb, 0x8cfc, 0x8e71, 0x90fe, 0x92ff, 0x9500, + 0x9701, 0x9902, 0x9b44, 0x9d45, 0x9f46, 0xa147, 0xa348, 0xa549, + 0xa74a, 0xa94b, 0xab4c, 0xad4d, 0xaf4e, 0xb14f, 0xb350, 0xb551, // Entry 140 - 17F - 0xb751, 0xb952, 0xbb53, 0xbd54, 0xbf55, 0xc156, 0xc357, 0xc558, - 0xc759, 0xc95a, 0xcb5b, 0xcd5c, 0xcf65, + 0xb752, 0xb953, 0xbb54, 0xbd55, 0xbf56, 0xc157, 0xc358, 0xc559, + 0xc75a, 0xc95b, 0xcb5c, 0xcd5d, 0xcf66, } -// Size: 2014 bytes +// Size: 2128 bytes var variantIndex = map[string]uint8{ "1606nict": 0x0, "1694acad": 0x1, "1901": 0x2, "1959acad": 0x3, - "1994": 0x61, + "1994": 0x67, "1996": 0x4, "abl1943": 0x5, "akuapem": 0x6, - "alalc97": 0x63, + "alalc97": 0x69, "aluku": 0x7, "ao1990": 0x8, "aranes": 0x9, @@ -1299,94 +1315,100 @@ var variantIndex = map[string]uint8{ "barla": 0x11, "basiceng": 0x12, "bauddha": 0x13, - "biscayan": 0x14, - "biske": 0x5c, - "bohoric": 0x15, - "boont": 0x16, - "bornholm": 0x17, - "cisaup": 0x18, - "colb1945": 0x19, - "cornu": 0x1a, - "creiss": 0x1b, - "dajnko": 0x1c, - "ekavsk": 0x1d, - "emodeng": 0x1e, - "fonipa": 0x64, - "fonkirsh": 0x65, - "fonnapa": 0x66, - "fonupa": 0x67, - "fonxsamp": 0x68, - "gascon": 0x1f, - "grclass": 0x20, - "grital": 0x21, - "grmistr": 0x22, - "hepburn": 0x23, - "heploc": 0x62, - "hognorsk": 0x24, - "hsistemo": 0x25, - "ijekavsk": 0x26, - "itihasa": 0x27, - "ivanchov": 0x28, - "jauer": 0x29, - "jyutping": 0x2a, - "kkcor": 0x2b, - "kociewie": 0x2c, - "kscor": 0x2d, - "laukika": 0x2e, - "lemosin": 0x2f, - "lengadoc": 0x30, - "lipaw": 0x5d, - "luna1918": 0x31, - "metelko": 0x32, - "monoton": 0x33, - "ndyuka": 0x34, - "nedis": 0x35, - "newfound": 0x36, - "nicard": 0x37, - "njiva": 0x5e, - "nulik": 0x38, - "osojs": 0x5f, - "oxendict": 0x39, - "pahawh2": 0x3a, - "pahawh3": 0x3b, - "pahawh4": 0x3c, - "pamaka": 0x3d, - "peano": 0x3e, - "petr1708": 0x3f, - "pinyin": 0x40, - "polyton": 0x41, - "provenc": 0x42, - "puter": 0x43, - "rigik": 0x44, - "rozaj": 0x45, - "rumgr": 0x46, - "scotland": 0x47, - "scouse": 0x48, - "simple": 0x69, - "solba": 0x60, - "sotav": 0x49, - "spanglis": 0x4a, - "surmiran": 0x4b, - "sursilv": 0x4c, - "sutsilv": 0x4d, - "tarask": 0x4e, - "tongyong": 0x4f, - "tunumiit": 0x50, - "uccor": 0x51, - "ucrcor": 0x52, - "ulster": 0x53, - "unifon": 0x54, - "vaidika": 0x55, - "valencia": 0x56, - "vallader": 0x57, - "vecdruka": 0x58, - "vivaraup": 0x59, - "wadegile": 0x5a, - "xsistemo": 0x5b, + "bciav": 0x14, + "bcizbl": 0x15, + "biscayan": 0x16, + "biske": 0x62, + "bohoric": 0x17, + "boont": 0x18, + "bornholm": 0x19, + "cisaup": 0x1a, + "colb1945": 0x1b, + "cornu": 0x1c, + "creiss": 0x1d, + "dajnko": 0x1e, + "ekavsk": 0x1f, + "emodeng": 0x20, + "fonipa": 0x6a, + "fonkirsh": 0x6b, + "fonnapa": 0x6c, + "fonupa": 0x6d, + "fonxsamp": 0x6e, + "gallo": 0x21, + "gascon": 0x22, + "grclass": 0x23, + "grital": 0x24, + "grmistr": 0x25, + "hepburn": 0x26, + "heploc": 0x68, + "hognorsk": 0x27, + "hsistemo": 0x28, + "ijekavsk": 0x29, + "itihasa": 0x2a, + "ivanchov": 0x2b, + "jauer": 0x2c, + "jyutping": 0x2d, + "kkcor": 0x2e, + "kociewie": 0x2f, + "kscor": 0x30, + "laukika": 0x31, + "lemosin": 0x32, + "lengadoc": 0x33, + "lipaw": 0x63, + "ltg1929": 0x34, + "ltg2007": 0x35, + "luna1918": 0x36, + "metelko": 0x37, + "monoton": 0x38, + "ndyuka": 0x39, + "nedis": 0x3a, + "newfound": 0x3b, + "nicard": 0x3c, + "njiva": 0x64, + "nulik": 0x3d, + "osojs": 0x65, + "oxendict": 0x3e, + "pahawh2": 0x3f, + "pahawh3": 0x40, + "pahawh4": 0x41, + "pamaka": 0x42, + "peano": 0x43, + "petr1708": 0x44, + "pinyin": 0x45, + "polyton": 0x46, + "provenc": 0x47, + "puter": 0x48, + "rigik": 0x49, + "rozaj": 0x4a, + "rumgr": 0x4b, + "scotland": 0x4c, + "scouse": 0x4d, + "simple": 0x6f, + "solba": 0x66, + "sotav": 0x4e, + "spanglis": 0x4f, + "surmiran": 0x50, + "sursilv": 0x51, + "sutsilv": 0x52, + "synnejyl": 0x53, + "tarask": 0x54, + "tongyong": 0x55, + "tunumiit": 0x56, + "uccor": 0x57, + "ucrcor": 0x58, + "ulster": 0x59, + "unifon": 0x5a, + "vaidika": 0x5b, + "valencia": 0x5c, + "vallader": 0x5d, + "vecdruka": 0x5e, + "vivaraup": 0x5f, + "wadegile": 0x60, + "xsistemo": 0x61, } // variantNumSpecialized is the number of specialized variants in variants. -const variantNumSpecialized = 99 +const variantNumSpecialized = 105 // nRegionGroups is the number of region groups. const nRegionGroups = 33 @@ -1398,151 +1420,151 @@ type likelyLangRegion struct { // likelyScript is a lookup table, indexed by scriptID, for the most likely // languages and regions given a script. -// Size: 1040 bytes, 260 elements -var likelyScript = [260]likelyLangRegion{ - 1: {lang: 0x14e, region: 0x84}, - 3: {lang: 0x2a2, region: 0x106}, - 4: {lang: 0x1f, region: 0x99}, - 5: {lang: 0x3a, region: 0x6b}, - 7: {lang: 0x3b, region: 0x9c}, +// Size: 1052 bytes, 263 elements +var likelyScript = [263]likelyLangRegion{ + 1: {lang: 0x14e, region: 0x85}, + 3: {lang: 0x2a2, region: 0x107}, + 4: {lang: 0x1f, region: 0x9a}, + 5: {lang: 0x3a, region: 0x6c}, + 7: {lang: 0x3b, region: 0x9d}, 8: {lang: 0x1d7, region: 0x28}, - 9: {lang: 0x13, region: 0x9c}, - 10: {lang: 0x5b, region: 0x95}, + 9: {lang: 0x13, region: 0x9d}, + 10: {lang: 0x5b, region: 0x96}, 11: {lang: 0x60, region: 0x52}, - 12: {lang: 0xb9, region: 0xb4}, - 13: {lang: 0x63, region: 0x95}, + 12: {lang: 0xb9, region: 0xb5}, + 13: {lang: 0x63, region: 0x96}, 14: {lang: 0xa5, region: 0x35}, - 15: {lang: 0x3e9, region: 0x99}, - 17: {lang: 0x529, region: 0x12e}, - 18: {lang: 0x3b1, region: 0x99}, - 19: {lang: 0x15e, region: 0x78}, - 20: {lang: 0xc2, region: 0x95}, - 21: {lang: 0x9d, region: 0xe7}, + 15: {lang: 0x3e9, region: 0x9a}, + 17: {lang: 0x529, region: 0x12f}, + 18: {lang: 0x3b1, region: 0x9a}, + 19: {lang: 0x15e, region: 0x79}, + 20: {lang: 0xc2, region: 0x96}, + 21: {lang: 0x9d, region: 0xe8}, 22: {lang: 0xdb, region: 0x35}, 23: {lang: 0xf3, region: 0x49}, - 24: {lang: 0x4f0, region: 0x12b}, - 25: {lang: 0xe7, region: 0x13e}, - 26: {lang: 0xe5, region: 0x135}, - 29: {lang: 0xf1, region: 0x6b}, - 31: {lang: 0x1a0, region: 0x5d}, - 32: {lang: 0x3e2, region: 0x106}, - 34: {lang: 0x1be, region: 0x99}, - 38: {lang: 0x15e, region: 0x78}, - 41: {lang: 0x133, region: 0x6b}, + 24: {lang: 0x4f0, region: 0x12c}, + 25: {lang: 0xe7, region: 0x13f}, + 26: {lang: 0xe5, region: 0x136}, + 29: {lang: 0xf1, region: 0x6c}, + 31: {lang: 0x1a0, region: 0x5e}, + 32: {lang: 0x3e2, region: 0x107}, + 34: {lang: 0x1be, region: 0x9a}, + 38: {lang: 0x15e, region: 0x79}, + 41: {lang: 0x133, region: 0x6c}, 42: {lang: 0x431, region: 0x27}, - 44: {lang: 0x27, region: 0x6f}, - 46: {lang: 0x210, region: 0x7d}, + 44: {lang: 0x27, region: 0x70}, + 46: {lang: 0x210, region: 0x7e}, 47: {lang: 0xfe, region: 0x38}, - 49: {lang: 0x19b, region: 0x99}, - 50: {lang: 0x19e, region: 0x130}, - 51: {lang: 0x3e9, region: 0x99}, - 52: {lang: 0x136, region: 0x87}, - 53: {lang: 0x1a4, region: 0x99}, - 54: {lang: 0x39d, region: 0x99}, - 55: {lang: 0x529, region: 0x12e}, - 56: {lang: 0x254, region: 0xab}, + 49: {lang: 0x19b, region: 0x9a}, + 50: {lang: 0x19e, region: 0x131}, + 51: {lang: 0x3e9, region: 0x9a}, + 52: {lang: 0x136, region: 0x88}, + 53: {lang: 0x1a4, region: 0x9a}, + 54: {lang: 0x39d, region: 0x9a}, + 55: {lang: 0x529, region: 0x12f}, + 56: {lang: 0x254, region: 0xac}, 57: {lang: 0x529, region: 0x53}, - 58: {lang: 0x1cb, region: 0xe7}, + 58: {lang: 0x1cb, region: 0xe8}, 59: {lang: 0x529, region: 0x53}, - 60: {lang: 0x529, region: 0x12e}, - 61: {lang: 0x2fd, region: 0x9b}, - 62: {lang: 0x1bc, region: 0x97}, - 63: {lang: 0x200, region: 0xa2}, - 64: {lang: 0x1c5, region: 0x12b}, - 65: {lang: 0x1ca, region: 0xaf}, - 68: {lang: 0x1d5, region: 0x92}, - 70: {lang: 0x142, region: 0x9e}, - 71: {lang: 0x254, region: 0xab}, - 72: {lang: 0x20e, region: 0x95}, - 73: {lang: 0x200, region: 0xa2}, - 75: {lang: 0x135, region: 0xc4}, - 76: {lang: 0x200, region: 0xa2}, - 77: {lang: 0x3bb, region: 0xe8}, - 78: {lang: 0x24a, region: 0xa6}, - 79: {lang: 0x3fa, region: 0x99}, - 82: {lang: 0x251, region: 0x99}, - 83: {lang: 0x254, region: 0xab}, - 85: {lang: 0x88, region: 0x99}, - 86: {lang: 0x370, region: 0x123}, - 87: {lang: 0x2b8, region: 0xaf}, - 92: {lang: 0x29f, region: 0x99}, - 93: {lang: 0x2a8, region: 0x99}, - 94: {lang: 0x28f, region: 0x87}, - 95: {lang: 0x1a0, region: 0x87}, - 96: {lang: 0x2ac, region: 0x53}, - 98: {lang: 0x4f4, region: 0x12b}, - 99: {lang: 0x4f5, region: 0x12b}, - 100: {lang: 0x1be, region: 0x99}, - 102: {lang: 0x337, region: 0x9c}, - 103: {lang: 0x4f7, region: 0x53}, - 104: {lang: 0xa9, region: 0x53}, - 107: {lang: 0x2e8, region: 0x112}, - 108: {lang: 0x4f8, region: 0x10b}, - 109: {lang: 0x4f8, region: 0x10b}, - 110: {lang: 0x304, region: 0x99}, - 111: {lang: 0x31b, region: 0x99}, - 112: {lang: 0x30b, region: 0x53}, - 114: {lang: 0x31e, region: 0x35}, - 115: {lang: 0x30e, region: 0x99}, - 116: {lang: 0x414, region: 0xe8}, - 117: {lang: 0x331, region: 0xc4}, - 119: {lang: 0x4f9, region: 0x108}, - 120: {lang: 0x3b, region: 0xa1}, - 121: {lang: 0x353, region: 0xdb}, - 124: {lang: 0x2d0, region: 0x84}, - 125: {lang: 0x52a, region: 0x53}, - 126: {lang: 0x403, region: 0x96}, - 127: {lang: 0x3ee, region: 0x99}, - 128: {lang: 0x39b, region: 0xc5}, - 129: {lang: 0x395, region: 0x99}, - 130: {lang: 0x399, region: 0x135}, - 131: {lang: 0x429, region: 0x115}, - 133: {lang: 0x3b, region: 0x11c}, - 134: {lang: 0xfd, region: 0xc4}, - 137: {lang: 0x27d, region: 0x106}, - 138: {lang: 0x2c9, region: 0x53}, - 139: {lang: 0x39f, region: 0x9c}, - 140: {lang: 0x39f, region: 0x53}, - 142: {lang: 0x3ad, region: 0xb0}, - 144: {lang: 0x1c6, region: 0x53}, - 145: {lang: 0x4fd, region: 0x9c}, - 198: {lang: 0x3cb, region: 0x95}, - 201: {lang: 0x372, region: 0x10c}, - 202: {lang: 0x420, region: 0x97}, - 204: {lang: 0x4ff, region: 0x15e}, - 205: {lang: 0x3f0, region: 0x99}, - 206: {lang: 0x45, region: 0x135}, - 207: {lang: 0x139, region: 0x7b}, - 208: {lang: 0x3e9, region: 0x99}, - 210: {lang: 0x3e9, region: 0x99}, - 211: {lang: 0x3fa, region: 0x99}, - 212: {lang: 0x40c, region: 0xb3}, - 215: {lang: 0x433, region: 0x99}, - 216: {lang: 0xef, region: 0xc5}, - 217: {lang: 0x43e, region: 0x95}, - 218: {lang: 0x44d, region: 0x35}, - 219: {lang: 0x44e, region: 0x9b}, - 223: {lang: 0x45a, region: 0xe7}, - 224: {lang: 0x11a, region: 0x99}, - 225: {lang: 0x45e, region: 0x53}, - 226: {lang: 0x232, region: 0x53}, - 227: {lang: 0x450, region: 0x99}, - 228: {lang: 0x4a5, region: 0x53}, - 229: {lang: 0x9f, region: 0x13e}, - 230: {lang: 0x461, region: 0x99}, - 232: {lang: 0x528, region: 0xba}, - 233: {lang: 0x153, region: 0xe7}, - 234: {lang: 0x128, region: 0xcd}, - 235: {lang: 0x46b, region: 0x123}, - 236: {lang: 0xa9, region: 0x53}, - 237: {lang: 0x2ce, region: 0x99}, - 240: {lang: 0x4ad, region: 0x11c}, - 241: {lang: 0x4be, region: 0xb4}, - 244: {lang: 0x1ce, region: 0x99}, - 247: {lang: 0x3a9, region: 0x9c}, - 248: {lang: 0x22, region: 0x9b}, - 250: {lang: 0x1ea, region: 0x53}, - 251: {lang: 0xef, region: 0xc5}, + 60: {lang: 0x529, region: 0x12f}, + 61: {lang: 0x2fd, region: 0x9c}, + 62: {lang: 0x1bc, region: 0x98}, + 63: {lang: 0x200, region: 0xa3}, + 64: {lang: 0x1c5, region: 0x12c}, + 65: {lang: 0x1ca, region: 0xb0}, + 68: {lang: 0x1d5, region: 0x93}, + 70: {lang: 0x142, region: 0x9f}, + 71: {lang: 0x254, region: 0xac}, + 72: {lang: 0x20e, region: 0x96}, + 73: {lang: 0x200, region: 0xa3}, + 75: {lang: 0x135, region: 0xc5}, + 76: {lang: 0x200, region: 0xa3}, + 78: {lang: 0x3bb, region: 0xe9}, + 79: {lang: 0x24a, region: 0xa7}, + 80: {lang: 0x3fa, region: 0x9a}, + 83: {lang: 0x251, region: 0x9a}, + 84: {lang: 0x254, region: 0xac}, + 86: {lang: 0x88, region: 0x9a}, + 87: {lang: 0x370, region: 0x124}, + 88: {lang: 0x2b8, region: 0xb0}, + 93: {lang: 0x29f, region: 0x9a}, + 94: {lang: 0x2a8, region: 0x9a}, + 95: {lang: 0x28f, region: 0x88}, + 96: {lang: 0x1a0, region: 0x88}, + 97: {lang: 0x2ac, region: 0x53}, + 99: {lang: 0x4f4, region: 0x12c}, + 100: {lang: 0x4f5, region: 0x12c}, + 101: {lang: 0x1be, region: 0x9a}, + 103: {lang: 0x337, region: 0x9d}, + 104: {lang: 0x4f7, region: 0x53}, + 105: {lang: 0xa9, region: 0x53}, + 108: {lang: 0x2e8, region: 0x113}, + 109: {lang: 0x4f8, region: 0x10c}, + 110: {lang: 0x4f8, region: 0x10c}, + 111: {lang: 0x304, region: 0x9a}, + 112: {lang: 0x31b, region: 0x9a}, + 113: {lang: 0x30b, region: 0x53}, + 115: {lang: 0x31e, region: 0x35}, + 116: {lang: 0x30e, region: 0x9a}, + 117: {lang: 0x414, region: 0xe9}, + 118: {lang: 0x331, region: 0xc5}, + 121: {lang: 0x4f9, region: 0x109}, + 122: {lang: 0x3b, region: 0xa2}, + 123: {lang: 0x353, region: 0xdc}, + 126: {lang: 0x2d0, region: 0x85}, + 127: {lang: 0x52a, region: 0x53}, + 128: {lang: 0x403, region: 0x97}, + 129: {lang: 0x3ee, region: 0x9a}, + 130: {lang: 0x39b, region: 0xc6}, + 131: {lang: 0x395, region: 0x9a}, + 132: {lang: 0x399, region: 0x136}, + 133: {lang: 0x429, region: 0x116}, + 135: {lang: 0x3b, region: 0x11d}, + 136: {lang: 0xfd, region: 0xc5}, + 139: {lang: 0x27d, region: 0x107}, + 140: {lang: 0x2c9, region: 0x53}, + 141: {lang: 0x39f, region: 0x9d}, + 142: {lang: 0x39f, region: 0x53}, + 144: {lang: 0x3ad, region: 0xb1}, + 146: {lang: 0x1c6, region: 0x53}, + 147: {lang: 0x4fd, region: 0x9d}, + 200: {lang: 0x3cb, region: 0x96}, + 203: {lang: 0x372, region: 0x10d}, + 204: {lang: 0x420, region: 0x98}, + 206: {lang: 0x4ff, region: 0x15f}, + 207: {lang: 0x3f0, region: 0x9a}, + 208: {lang: 0x45, region: 0x136}, + 209: {lang: 0x139, region: 0x7c}, + 210: {lang: 0x3e9, region: 0x9a}, + 212: {lang: 0x3e9, region: 0x9a}, + 213: {lang: 0x3fa, region: 0x9a}, + 214: {lang: 0x40c, region: 0xb4}, + 217: {lang: 0x433, region: 0x9a}, + 218: {lang: 0xef, region: 0xc6}, + 219: {lang: 0x43e, region: 0x96}, + 221: {lang: 0x44d, region: 0x35}, + 222: {lang: 0x44e, region: 0x9c}, + 226: {lang: 0x45a, region: 0xe8}, + 227: {lang: 0x11a, region: 0x9a}, + 228: {lang: 0x45e, region: 0x53}, + 229: {lang: 0x232, region: 0x53}, + 230: {lang: 0x450, region: 0x9a}, + 231: {lang: 0x4a5, region: 0x53}, + 232: {lang: 0x9f, region: 0x13f}, + 233: {lang: 0x461, region: 0x9a}, + 235: {lang: 0x528, region: 0xbb}, + 236: {lang: 0x153, region: 0xe8}, + 237: {lang: 0x128, region: 0xce}, + 238: {lang: 0x46b, region: 0x124}, + 239: {lang: 0xa9, region: 0x53}, + 240: {lang: 0x2ce, region: 0x9a}, + 243: {lang: 0x4ad, region: 0x11d}, + 244: {lang: 0x4be, region: 0xb5}, + 247: {lang: 0x1ce, region: 0x9a}, + 250: {lang: 0x3a9, region: 0x9d}, + 251: {lang: 0x22, region: 0x9c}, + 253: {lang: 0x1ea, region: 0x53}, + 254: {lang: 0xef, region: 0xc6}, } type likelyScriptRegion struct { @@ -1557,1423 +1579,1423 @@ type likelyScriptRegion struct { // of the list in likelyLangList. // Size: 7980 bytes, 1330 elements var likelyLang = [1330]likelyScriptRegion{ - 0: {region: 0x135, script: 0x5a, flags: 0x0}, - 1: {region: 0x6f, script: 0x5a, flags: 0x0}, - 2: {region: 0x165, script: 0x5a, flags: 0x0}, - 3: {region: 0x165, script: 0x5a, flags: 0x0}, - 4: {region: 0x165, script: 0x5a, flags: 0x0}, - 5: {region: 0x7d, script: 0x20, flags: 0x0}, - 6: {region: 0x165, script: 0x5a, flags: 0x0}, - 7: {region: 0x165, script: 0x20, flags: 0x0}, - 8: {region: 0x80, script: 0x5a, flags: 0x0}, - 9: {region: 0x165, script: 0x5a, flags: 0x0}, - 10: {region: 0x165, script: 0x5a, flags: 0x0}, - 11: {region: 0x165, script: 0x5a, flags: 0x0}, - 12: {region: 0x95, script: 0x5a, flags: 0x0}, - 13: {region: 0x131, script: 0x5a, flags: 0x0}, - 14: {region: 0x80, script: 0x5a, flags: 0x0}, - 15: {region: 0x165, script: 0x5a, flags: 0x0}, - 16: {region: 0x165, script: 0x5a, flags: 0x0}, - 17: {region: 0x106, script: 0x20, flags: 0x0}, - 18: {region: 0x165, script: 0x5a, flags: 0x0}, - 19: {region: 0x9c, script: 0x9, flags: 0x0}, - 20: {region: 0x128, script: 0x5, flags: 0x0}, - 21: {region: 0x165, script: 0x5a, flags: 0x0}, - 22: {region: 0x161, script: 0x5a, flags: 0x0}, - 23: {region: 0x165, script: 0x5a, flags: 0x0}, - 24: {region: 0x165, script: 0x5a, flags: 0x0}, - 25: {region: 0x165, script: 0x5a, flags: 0x0}, - 26: {region: 0x165, script: 0x5a, flags: 0x0}, - 27: {region: 0x165, script: 0x5a, flags: 0x0}, - 28: {region: 0x52, script: 0x5a, flags: 0x0}, - 29: {region: 0x165, script: 0x5a, flags: 0x0}, - 30: {region: 0x165, script: 0x5a, flags: 0x0}, - 31: {region: 0x99, script: 0x4, flags: 0x0}, - 32: {region: 0x165, script: 0x5a, flags: 0x0}, - 33: {region: 0x80, script: 0x5a, flags: 0x0}, - 34: {region: 0x9b, script: 0xf8, flags: 0x0}, - 35: {region: 0x165, script: 0x5a, flags: 0x0}, - 36: {region: 0x165, script: 0x5a, flags: 0x0}, - 37: {region: 0x14d, script: 0x5a, flags: 0x0}, - 38: {region: 0x106, script: 0x20, flags: 0x0}, - 39: {region: 0x6f, script: 0x2c, flags: 0x0}, - 40: {region: 0x165, script: 0x5a, flags: 0x0}, - 41: {region: 0x165, script: 0x5a, flags: 0x0}, - 42: {region: 0xd6, script: 0x5a, flags: 0x0}, - 43: {region: 0x165, script: 0x5a, flags: 0x0}, - 45: {region: 0x165, script: 0x5a, flags: 0x0}, - 46: {region: 0x165, script: 0x5a, flags: 0x0}, - 47: {region: 0x165, script: 0x5a, flags: 0x0}, - 48: {region: 0x165, script: 0x5a, flags: 0x0}, - 49: {region: 0x165, script: 0x5a, flags: 0x0}, - 50: {region: 0x165, script: 0x5a, flags: 0x0}, - 51: {region: 0x95, script: 0x5a, flags: 0x0}, - 52: {region: 0x165, script: 0x5, flags: 0x0}, - 53: {region: 0x122, script: 0x5, flags: 0x0}, - 54: {region: 0x165, script: 0x5a, flags: 0x0}, - 55: {region: 0x165, script: 0x5a, flags: 0x0}, - 56: {region: 0x165, script: 0x5a, flags: 0x0}, - 57: {region: 0x165, script: 0x5a, flags: 0x0}, - 58: {region: 0x6b, script: 0x5, flags: 0x0}, + 0: {region: 0x136, script: 0x5b, flags: 0x0}, + 1: {region: 0x70, script: 0x5b, flags: 0x0}, + 2: {region: 0x166, script: 0x5b, flags: 0x0}, + 3: {region: 0x166, script: 0x5b, flags: 0x0}, + 4: {region: 0x166, script: 0x5b, flags: 0x0}, + 5: {region: 0x7e, script: 0x20, flags: 0x0}, + 6: {region: 0x166, script: 0x5b, flags: 0x0}, + 7: {region: 0x166, script: 0x20, flags: 0x0}, + 8: {region: 0x81, script: 0x5b, flags: 0x0}, + 9: {region: 0x166, script: 0x5b, flags: 0x0}, + 10: {region: 0x166, script: 0x5b, flags: 0x0}, + 11: {region: 0x166, script: 0x5b, flags: 0x0}, + 12: {region: 0x96, script: 0x5b, flags: 0x0}, + 13: {region: 0x132, script: 0x5b, flags: 0x0}, + 14: {region: 0x81, script: 0x5b, flags: 0x0}, + 15: {region: 0x166, script: 0x5b, flags: 0x0}, + 16: {region: 0x166, script: 0x5b, flags: 0x0}, + 17: {region: 0x107, script: 0x20, flags: 0x0}, + 18: {region: 0x166, script: 0x5b, flags: 0x0}, + 19: {region: 0x9d, script: 0x9, flags: 0x0}, + 20: {region: 0x129, script: 0x5, flags: 0x0}, + 21: {region: 0x166, script: 0x5b, flags: 0x0}, + 22: {region: 0x162, script: 0x5b, flags: 0x0}, + 23: {region: 0x166, script: 0x5b, flags: 0x0}, + 24: {region: 0x166, script: 0x5b, flags: 0x0}, + 25: {region: 0x166, script: 0x5b, flags: 0x0}, + 26: {region: 0x166, script: 0x5b, flags: 0x0}, + 27: {region: 0x166, script: 0x5b, flags: 0x0}, + 28: {region: 0x52, script: 0x5b, flags: 0x0}, + 29: {region: 0x166, script: 0x5b, flags: 0x0}, + 30: {region: 0x166, script: 0x5b, flags: 0x0}, + 31: {region: 0x9a, script: 0x4, flags: 0x0}, + 32: {region: 0x166, script: 0x5b, flags: 0x0}, + 33: {region: 0x81, script: 0x5b, flags: 0x0}, + 34: {region: 0x9c, script: 0xfb, flags: 0x0}, + 35: {region: 0x166, script: 0x5b, flags: 0x0}, + 36: {region: 0x166, script: 0x5b, flags: 0x0}, + 37: {region: 0x14e, script: 0x5b, flags: 0x0}, + 38: {region: 0x107, script: 0x20, flags: 0x0}, + 39: {region: 0x70, script: 0x2c, flags: 0x0}, + 40: {region: 0x166, script: 0x5b, flags: 0x0}, + 41: {region: 0x166, script: 0x5b, flags: 0x0}, + 42: {region: 0xd7, script: 0x5b, flags: 0x0}, + 43: {region: 0x166, script: 0x5b, flags: 0x0}, + 45: {region: 0x166, script: 0x5b, flags: 0x0}, + 46: {region: 0x166, script: 0x5b, flags: 0x0}, + 47: {region: 0x166, script: 0x5b, flags: 0x0}, + 48: {region: 0x166, script: 0x5b, flags: 0x0}, + 49: {region: 0x166, script: 0x5b, flags: 0x0}, + 50: {region: 0x166, script: 0x5b, flags: 0x0}, + 51: {region: 0x96, script: 0x5b, flags: 0x0}, + 52: {region: 0x166, script: 0x5, flags: 0x0}, + 53: {region: 0x123, script: 0x5, flags: 0x0}, + 54: {region: 0x166, script: 0x5b, flags: 0x0}, + 55: {region: 0x166, script: 0x5b, flags: 0x0}, + 56: {region: 0x166, script: 0x5b, flags: 0x0}, + 57: {region: 0x166, script: 0x5b, flags: 0x0}, + 58: {region: 0x6c, script: 0x5, flags: 0x0}, 59: {region: 0x0, script: 0x3, flags: 0x1}, - 60: {region: 0x165, script: 0x5a, flags: 0x0}, - 61: {region: 0x51, script: 0x5a, flags: 0x0}, - 62: {region: 0x3f, script: 0x5a, flags: 0x0}, - 63: {region: 0x67, script: 0x5, flags: 0x0}, - 65: {region: 0xba, script: 0x5, flags: 0x0}, - 66: {region: 0x6b, script: 0x5, flags: 0x0}, - 67: {region: 0x99, script: 0xe, flags: 0x0}, - 68: {region: 0x12f, script: 0x5a, flags: 0x0}, - 69: {region: 0x135, script: 0xce, flags: 0x0}, - 70: {region: 0x165, script: 0x5a, flags: 0x0}, - 71: {region: 0x165, script: 0x5a, flags: 0x0}, - 72: {region: 0x6e, script: 0x5a, flags: 0x0}, - 73: {region: 0x165, script: 0x5a, flags: 0x0}, - 74: {region: 0x165, script: 0x5a, flags: 0x0}, - 75: {region: 0x49, script: 0x5a, flags: 0x0}, - 76: {region: 0x165, script: 0x5a, flags: 0x0}, - 77: {region: 0x106, script: 0x20, flags: 0x0}, - 78: {region: 0x165, script: 0x5, flags: 0x0}, - 79: {region: 0x165, script: 0x5a, flags: 0x0}, - 80: {region: 0x165, script: 0x5a, flags: 0x0}, - 81: {region: 0x165, script: 0x5a, flags: 0x0}, - 82: {region: 0x99, script: 0x22, flags: 0x0}, - 83: {region: 0x165, script: 0x5a, flags: 0x0}, - 84: {region: 0x165, script: 0x5a, flags: 0x0}, - 85: {region: 0x165, script: 0x5a, flags: 0x0}, - 86: {region: 0x3f, script: 0x5a, flags: 0x0}, - 87: {region: 0x165, script: 0x5a, flags: 0x0}, + 60: {region: 0x166, script: 0x5b, flags: 0x0}, + 61: {region: 0x51, script: 0x5b, flags: 0x0}, + 62: {region: 0x3f, script: 0x5b, flags: 0x0}, + 63: {region: 0x68, script: 0x5, flags: 0x0}, + 65: {region: 0xbb, script: 0x5, flags: 0x0}, + 66: {region: 0x6c, script: 0x5, flags: 0x0}, + 67: {region: 0x9a, script: 0xe, flags: 0x0}, + 68: {region: 0x130, script: 0x5b, flags: 0x0}, + 69: {region: 0x136, script: 0xd0, flags: 0x0}, + 70: {region: 0x166, script: 0x5b, flags: 0x0}, + 71: {region: 0x166, script: 0x5b, flags: 0x0}, + 72: {region: 0x6f, script: 0x5b, flags: 0x0}, + 73: {region: 0x166, script: 0x5b, flags: 0x0}, + 74: {region: 0x166, script: 0x5b, flags: 0x0}, + 75: {region: 0x49, script: 0x5b, flags: 0x0}, + 76: {region: 0x166, script: 0x5b, flags: 0x0}, + 77: {region: 0x107, script: 0x20, flags: 0x0}, + 78: {region: 0x166, script: 0x5, flags: 0x0}, + 79: {region: 0x166, script: 0x5b, flags: 0x0}, + 80: {region: 0x166, script: 0x5b, flags: 0x0}, + 81: {region: 0x166, script: 0x5b, flags: 0x0}, + 82: {region: 0x9a, script: 0x22, flags: 0x0}, + 83: {region: 0x166, script: 0x5b, flags: 0x0}, + 84: {region: 0x166, script: 0x5b, flags: 0x0}, + 85: {region: 0x166, script: 0x5b, flags: 0x0}, + 86: {region: 0x3f, script: 0x5b, flags: 0x0}, + 87: {region: 0x166, script: 0x5b, flags: 0x0}, 88: {region: 0x3, script: 0x5, flags: 0x1}, - 89: {region: 0x106, script: 0x20, flags: 0x0}, - 90: {region: 0xe8, script: 0x5, flags: 0x0}, - 91: {region: 0x95, script: 0x5a, flags: 0x0}, - 92: {region: 0xdb, script: 0x22, flags: 0x0}, - 93: {region: 0x2e, script: 0x5a, flags: 0x0}, - 94: {region: 0x52, script: 0x5a, flags: 0x0}, - 95: {region: 0x165, script: 0x5a, flags: 0x0}, + 89: {region: 0x107, script: 0x20, flags: 0x0}, + 90: {region: 0xe9, script: 0x5, flags: 0x0}, + 91: {region: 0x96, script: 0x5b, flags: 0x0}, + 92: {region: 0xdc, script: 0x22, flags: 0x0}, + 93: {region: 0x2e, script: 0x5b, flags: 0x0}, + 94: {region: 0x52, script: 0x5b, flags: 0x0}, + 95: {region: 0x166, script: 0x5b, flags: 0x0}, 96: {region: 0x52, script: 0xb, flags: 0x0}, - 97: {region: 0x165, script: 0x5a, flags: 0x0}, - 98: {region: 0x165, script: 0x5a, flags: 0x0}, - 99: {region: 0x95, script: 0x5a, flags: 0x0}, - 100: {region: 0x165, script: 0x5a, flags: 0x0}, - 101: {region: 0x52, script: 0x5a, flags: 0x0}, - 102: {region: 0x165, script: 0x5a, flags: 0x0}, - 103: {region: 0x165, script: 0x5a, flags: 0x0}, - 104: {region: 0x165, script: 0x5a, flags: 0x0}, - 105: {region: 0x165, script: 0x5a, flags: 0x0}, - 106: {region: 0x4f, script: 0x5a, flags: 0x0}, - 107: {region: 0x165, script: 0x5a, flags: 0x0}, - 108: {region: 0x165, script: 0x5a, flags: 0x0}, - 109: {region: 0x165, script: 0x5a, flags: 0x0}, - 110: {region: 0x165, script: 0x2c, flags: 0x0}, - 111: {region: 0x165, script: 0x5a, flags: 0x0}, - 112: {region: 0x165, script: 0x5a, flags: 0x0}, + 97: {region: 0x166, script: 0x5b, flags: 0x0}, + 98: {region: 0x166, script: 0x5b, flags: 0x0}, + 99: {region: 0x96, script: 0x5b, flags: 0x0}, + 100: {region: 0x166, script: 0x5b, flags: 0x0}, + 101: {region: 0x52, script: 0x5b, flags: 0x0}, + 102: {region: 0x166, script: 0x5b, flags: 0x0}, + 103: {region: 0x166, script: 0x5b, flags: 0x0}, + 104: {region: 0x166, script: 0x5b, flags: 0x0}, + 105: {region: 0x166, script: 0x5b, flags: 0x0}, + 106: {region: 0x4f, script: 0x5b, flags: 0x0}, + 107: {region: 0x166, script: 0x5b, flags: 0x0}, + 108: {region: 0x166, script: 0x5b, flags: 0x0}, + 109: {region: 0x166, script: 0x5b, flags: 0x0}, + 110: {region: 0x166, script: 0x2c, flags: 0x0}, + 111: {region: 0x166, script: 0x5b, flags: 0x0}, + 112: {region: 0x166, script: 0x5b, flags: 0x0}, 113: {region: 0x47, script: 0x20, flags: 0x0}, - 114: {region: 0x165, script: 0x5a, flags: 0x0}, - 115: {region: 0x165, script: 0x5a, flags: 0x0}, - 116: {region: 0x10b, script: 0x5, flags: 0x0}, - 117: {region: 0x162, script: 0x5a, flags: 0x0}, - 118: {region: 0x165, script: 0x5a, flags: 0x0}, - 119: {region: 0x95, script: 0x5a, flags: 0x0}, - 120: {region: 0x165, script: 0x5a, flags: 0x0}, - 121: {region: 0x12f, script: 0x5a, flags: 0x0}, - 122: {region: 0x52, script: 0x5a, flags: 0x0}, - 123: {region: 0x99, script: 0xe3, flags: 0x0}, - 124: {region: 0xe8, script: 0x5, flags: 0x0}, - 125: {region: 0x99, script: 0x22, flags: 0x0}, + 114: {region: 0x166, script: 0x5b, flags: 0x0}, + 115: {region: 0x166, script: 0x5b, flags: 0x0}, + 116: {region: 0x10c, script: 0x5, flags: 0x0}, + 117: {region: 0x163, script: 0x5b, flags: 0x0}, + 118: {region: 0x166, script: 0x5b, flags: 0x0}, + 119: {region: 0x96, script: 0x5b, flags: 0x0}, + 120: {region: 0x166, script: 0x5b, flags: 0x0}, + 121: {region: 0x130, script: 0x5b, flags: 0x0}, + 122: {region: 0x52, script: 0x5b, flags: 0x0}, + 123: {region: 0x9a, script: 0xe6, flags: 0x0}, + 124: {region: 0xe9, script: 0x5, flags: 0x0}, + 125: {region: 0x9a, script: 0x22, flags: 0x0}, 126: {region: 0x38, script: 0x20, flags: 0x0}, - 127: {region: 0x99, script: 0x22, flags: 0x0}, - 128: {region: 0xe8, script: 0x5, flags: 0x0}, - 129: {region: 0x12b, script: 0x34, flags: 0x0}, - 131: {region: 0x99, script: 0x22, flags: 0x0}, - 132: {region: 0x165, script: 0x5a, flags: 0x0}, - 133: {region: 0x99, script: 0x22, flags: 0x0}, - 134: {region: 0xe7, script: 0x5a, flags: 0x0}, - 135: {region: 0x165, script: 0x5a, flags: 0x0}, - 136: {region: 0x99, script: 0x22, flags: 0x0}, - 137: {region: 0x165, script: 0x5a, flags: 0x0}, - 138: {region: 0x13f, script: 0x5a, flags: 0x0}, - 139: {region: 0x165, script: 0x5a, flags: 0x0}, - 140: {region: 0x165, script: 0x5a, flags: 0x0}, - 141: {region: 0xe7, script: 0x5a, flags: 0x0}, - 142: {region: 0x165, script: 0x5a, flags: 0x0}, - 143: {region: 0xd6, script: 0x5a, flags: 0x0}, - 144: {region: 0x165, script: 0x5a, flags: 0x0}, - 145: {region: 0x165, script: 0x5a, flags: 0x0}, - 146: {region: 0x165, script: 0x5a, flags: 0x0}, - 147: {region: 0x165, script: 0x2c, flags: 0x0}, - 148: {region: 0x99, script: 0x22, flags: 0x0}, - 149: {region: 0x95, script: 0x5a, flags: 0x0}, - 150: {region: 0x165, script: 0x5a, flags: 0x0}, - 151: {region: 0x165, script: 0x5a, flags: 0x0}, - 152: {region: 0x114, script: 0x5a, flags: 0x0}, - 153: {region: 0x165, script: 0x5a, flags: 0x0}, - 154: {region: 0x165, script: 0x5a, flags: 0x0}, - 155: {region: 0x52, script: 0x5a, flags: 0x0}, - 156: {region: 0x165, script: 0x5a, flags: 0x0}, - 157: {region: 0xe7, script: 0x5a, flags: 0x0}, - 158: {region: 0x165, script: 0x5a, flags: 0x0}, - 159: {region: 0x13e, script: 0xe5, flags: 0x0}, - 160: {region: 0xc3, script: 0x5a, flags: 0x0}, - 161: {region: 0x165, script: 0x5a, flags: 0x0}, - 162: {region: 0x165, script: 0x5a, flags: 0x0}, - 163: {region: 0xc3, script: 0x5a, flags: 0x0}, - 164: {region: 0x165, script: 0x5a, flags: 0x0}, + 127: {region: 0x9a, script: 0x22, flags: 0x0}, + 128: {region: 0xe9, script: 0x5, flags: 0x0}, + 129: {region: 0x12c, script: 0x34, flags: 0x0}, + 131: {region: 0x9a, script: 0x22, flags: 0x0}, + 132: {region: 0x166, script: 0x5b, flags: 0x0}, + 133: {region: 0x9a, script: 0x22, flags: 0x0}, + 134: {region: 0xe8, script: 0x5b, flags: 0x0}, + 135: {region: 0x166, script: 0x5b, flags: 0x0}, + 136: {region: 0x9a, script: 0x22, flags: 0x0}, + 137: {region: 0x166, script: 0x5b, flags: 0x0}, + 138: {region: 0x140, script: 0x5b, flags: 0x0}, + 139: {region: 0x166, script: 0x5b, flags: 0x0}, + 140: {region: 0x166, script: 0x5b, flags: 0x0}, + 141: {region: 0xe8, script: 0x5b, flags: 0x0}, + 142: {region: 0x166, script: 0x5b, flags: 0x0}, + 143: {region: 0xd7, script: 0x5b, flags: 0x0}, + 144: {region: 0x166, script: 0x5b, flags: 0x0}, + 145: {region: 0x166, script: 0x5b, flags: 0x0}, + 146: {region: 0x166, script: 0x5b, flags: 0x0}, + 147: {region: 0x166, script: 0x2c, flags: 0x0}, + 148: {region: 0x9a, script: 0x22, flags: 0x0}, + 149: {region: 0x96, script: 0x5b, flags: 0x0}, + 150: {region: 0x166, script: 0x5b, flags: 0x0}, + 151: {region: 0x166, script: 0x5b, flags: 0x0}, + 152: {region: 0x115, script: 0x5b, flags: 0x0}, + 153: {region: 0x166, script: 0x5b, flags: 0x0}, + 154: {region: 0x166, script: 0x5b, flags: 0x0}, + 155: {region: 0x52, script: 0x5b, flags: 0x0}, + 156: {region: 0x166, script: 0x5b, flags: 0x0}, + 157: {region: 0xe8, script: 0x5b, flags: 0x0}, + 158: {region: 0x166, script: 0x5b, flags: 0x0}, + 159: {region: 0x13f, script: 0xe8, flags: 0x0}, + 160: {region: 0xc4, script: 0x5b, flags: 0x0}, + 161: {region: 0x166, script: 0x5b, flags: 0x0}, + 162: {region: 0x166, script: 0x5b, flags: 0x0}, + 163: {region: 0xc4, script: 0x5b, flags: 0x0}, + 164: {region: 0x166, script: 0x5b, flags: 0x0}, 165: {region: 0x35, script: 0xe, flags: 0x0}, - 166: {region: 0x165, script: 0x5a, flags: 0x0}, - 167: {region: 0x165, script: 0x5a, flags: 0x0}, - 168: {region: 0x165, script: 0x5a, flags: 0x0}, - 169: {region: 0x53, script: 0xec, flags: 0x0}, - 170: {region: 0x165, script: 0x5a, flags: 0x0}, - 171: {region: 0x165, script: 0x5a, flags: 0x0}, - 172: {region: 0x165, script: 0x5a, flags: 0x0}, - 173: {region: 0x99, script: 0xe, flags: 0x0}, - 174: {region: 0x165, script: 0x5a, flags: 0x0}, - 175: {region: 0x9c, script: 0x5, flags: 0x0}, - 176: {region: 0x165, script: 0x5a, flags: 0x0}, - 177: {region: 0x4f, script: 0x5a, flags: 0x0}, - 178: {region: 0x78, script: 0x5a, flags: 0x0}, - 179: {region: 0x99, script: 0x22, flags: 0x0}, - 180: {region: 0xe8, script: 0x5, flags: 0x0}, - 181: {region: 0x99, script: 0x22, flags: 0x0}, - 182: {region: 0x165, script: 0x5a, flags: 0x0}, - 183: {region: 0x33, script: 0x5a, flags: 0x0}, - 184: {region: 0x165, script: 0x5a, flags: 0x0}, - 185: {region: 0xb4, script: 0xc, flags: 0x0}, - 186: {region: 0x52, script: 0x5a, flags: 0x0}, - 187: {region: 0x165, script: 0x2c, flags: 0x0}, - 188: {region: 0xe7, script: 0x5a, flags: 0x0}, - 189: {region: 0x165, script: 0x5a, flags: 0x0}, - 190: {region: 0xe8, script: 0x22, flags: 0x0}, - 191: {region: 0x106, script: 0x20, flags: 0x0}, - 192: {region: 0x15f, script: 0x5a, flags: 0x0}, - 193: {region: 0x165, script: 0x5a, flags: 0x0}, - 194: {region: 0x95, script: 0x5a, flags: 0x0}, - 195: {region: 0x165, script: 0x5a, flags: 0x0}, - 196: {region: 0x52, script: 0x5a, flags: 0x0}, - 197: {region: 0x165, script: 0x5a, flags: 0x0}, - 198: {region: 0x165, script: 0x5a, flags: 0x0}, - 199: {region: 0x165, script: 0x5a, flags: 0x0}, - 200: {region: 0x86, script: 0x5a, flags: 0x0}, - 201: {region: 0x165, script: 0x5a, flags: 0x0}, - 202: {region: 0x165, script: 0x5a, flags: 0x0}, - 203: {region: 0x165, script: 0x5a, flags: 0x0}, - 204: {region: 0x165, script: 0x5a, flags: 0x0}, - 205: {region: 0x6d, script: 0x2c, flags: 0x0}, - 206: {region: 0x165, script: 0x5a, flags: 0x0}, - 207: {region: 0x165, script: 0x5a, flags: 0x0}, - 208: {region: 0x52, script: 0x5a, flags: 0x0}, - 209: {region: 0x165, script: 0x5a, flags: 0x0}, - 210: {region: 0x165, script: 0x5a, flags: 0x0}, - 211: {region: 0xc3, script: 0x5a, flags: 0x0}, - 212: {region: 0x165, script: 0x5a, flags: 0x0}, - 213: {region: 0x165, script: 0x5a, flags: 0x0}, - 214: {region: 0x165, script: 0x5a, flags: 0x0}, - 215: {region: 0x6e, script: 0x5a, flags: 0x0}, - 216: {region: 0x165, script: 0x5a, flags: 0x0}, - 217: {region: 0x165, script: 0x5a, flags: 0x0}, - 218: {region: 0xd6, script: 0x5a, flags: 0x0}, + 166: {region: 0x166, script: 0x5b, flags: 0x0}, + 167: {region: 0x166, script: 0x5b, flags: 0x0}, + 168: {region: 0x166, script: 0x5b, flags: 0x0}, + 169: {region: 0x53, script: 0xef, flags: 0x0}, + 170: {region: 0x166, script: 0x5b, flags: 0x0}, + 171: {region: 0x166, script: 0x5b, flags: 0x0}, + 172: {region: 0x166, script: 0x5b, flags: 0x0}, + 173: {region: 0x9a, script: 0xe, flags: 0x0}, + 174: {region: 0x166, script: 0x5b, flags: 0x0}, + 175: {region: 0x9d, script: 0x5, flags: 0x0}, + 176: {region: 0x166, script: 0x5b, flags: 0x0}, + 177: {region: 0x4f, script: 0x5b, flags: 0x0}, + 178: {region: 0x79, script: 0x5b, flags: 0x0}, + 179: {region: 0x9a, script: 0x22, flags: 0x0}, + 180: {region: 0xe9, script: 0x5, flags: 0x0}, + 181: {region: 0x9a, script: 0x22, flags: 0x0}, + 182: {region: 0x166, script: 0x5b, flags: 0x0}, + 183: {region: 0x33, script: 0x5b, flags: 0x0}, + 184: {region: 0x166, script: 0x5b, flags: 0x0}, + 185: {region: 0xb5, script: 0xc, flags: 0x0}, + 186: {region: 0x52, script: 0x5b, flags: 0x0}, + 187: {region: 0x166, script: 0x2c, flags: 0x0}, + 188: {region: 0xe8, script: 0x5b, flags: 0x0}, + 189: {region: 0x166, script: 0x5b, flags: 0x0}, + 190: {region: 0xe9, script: 0x22, flags: 0x0}, + 191: {region: 0x107, script: 0x20, flags: 0x0}, + 192: {region: 0x160, script: 0x5b, flags: 0x0}, + 193: {region: 0x166, script: 0x5b, flags: 0x0}, + 194: {region: 0x96, script: 0x5b, flags: 0x0}, + 195: {region: 0x166, script: 0x5b, flags: 0x0}, + 196: {region: 0x52, script: 0x5b, flags: 0x0}, + 197: {region: 0x166, script: 0x5b, flags: 0x0}, + 198: {region: 0x166, script: 0x5b, flags: 0x0}, + 199: {region: 0x166, script: 0x5b, flags: 0x0}, + 200: {region: 0x87, script: 0x5b, flags: 0x0}, + 201: {region: 0x166, script: 0x5b, flags: 0x0}, + 202: {region: 0x166, script: 0x5b, flags: 0x0}, + 203: {region: 0x166, script: 0x5b, flags: 0x0}, + 204: {region: 0x166, script: 0x5b, flags: 0x0}, + 205: {region: 0x6e, script: 0x2c, flags: 0x0}, + 206: {region: 0x166, script: 0x5b, flags: 0x0}, + 207: {region: 0x166, script: 0x5b, flags: 0x0}, + 208: {region: 0x52, script: 0x5b, flags: 0x0}, + 209: {region: 0x166, script: 0x5b, flags: 0x0}, + 210: {region: 0x166, script: 0x5b, flags: 0x0}, + 211: {region: 0xc4, script: 0x5b, flags: 0x0}, + 212: {region: 0x166, script: 0x5b, flags: 0x0}, + 213: {region: 0x166, script: 0x5b, flags: 0x0}, + 214: {region: 0x166, script: 0x5b, flags: 0x0}, + 215: {region: 0x6f, script: 0x5b, flags: 0x0}, + 216: {region: 0x166, script: 0x5b, flags: 0x0}, + 217: {region: 0x166, script: 0x5b, flags: 0x0}, + 218: {region: 0xd7, script: 0x5b, flags: 0x0}, 219: {region: 0x35, script: 0x16, flags: 0x0}, - 220: {region: 0x106, script: 0x20, flags: 0x0}, - 221: {region: 0xe7, script: 0x5a, flags: 0x0}, - 222: {region: 0x165, script: 0x5a, flags: 0x0}, - 223: {region: 0x131, script: 0x5a, flags: 0x0}, - 224: {region: 0x8a, script: 0x5a, flags: 0x0}, - 225: {region: 0x75, script: 0x5a, flags: 0x0}, - 226: {region: 0x106, script: 0x20, flags: 0x0}, - 227: {region: 0x135, script: 0x5a, flags: 0x0}, - 228: {region: 0x49, script: 0x5a, flags: 0x0}, - 229: {region: 0x135, script: 0x1a, flags: 0x0}, - 230: {region: 0xa6, script: 0x5, flags: 0x0}, - 231: {region: 0x13e, script: 0x19, flags: 0x0}, - 232: {region: 0x165, script: 0x5a, flags: 0x0}, - 233: {region: 0x9b, script: 0x5, flags: 0x0}, - 234: {region: 0x165, script: 0x5a, flags: 0x0}, - 235: {region: 0x165, script: 0x5a, flags: 0x0}, - 236: {region: 0x165, script: 0x5a, flags: 0x0}, - 237: {region: 0x165, script: 0x5a, flags: 0x0}, - 238: {region: 0x165, script: 0x5a, flags: 0x0}, - 239: {region: 0xc5, script: 0xd8, flags: 0x0}, - 240: {region: 0x78, script: 0x5a, flags: 0x0}, - 241: {region: 0x6b, script: 0x1d, flags: 0x0}, - 242: {region: 0xe7, script: 0x5a, flags: 0x0}, + 220: {region: 0x107, script: 0x20, flags: 0x0}, + 221: {region: 0xe8, script: 0x5b, flags: 0x0}, + 222: {region: 0x166, script: 0x5b, flags: 0x0}, + 223: {region: 0x132, script: 0x5b, flags: 0x0}, + 224: {region: 0x8b, script: 0x5b, flags: 0x0}, + 225: {region: 0x76, script: 0x5b, flags: 0x0}, + 226: {region: 0x107, script: 0x20, flags: 0x0}, + 227: {region: 0x136, script: 0x5b, flags: 0x0}, + 228: {region: 0x49, script: 0x5b, flags: 0x0}, + 229: {region: 0x136, script: 0x1a, flags: 0x0}, + 230: {region: 0xa7, script: 0x5, flags: 0x0}, + 231: {region: 0x13f, script: 0x19, flags: 0x0}, + 232: {region: 0x166, script: 0x5b, flags: 0x0}, + 233: {region: 0x9c, script: 0x5, flags: 0x0}, + 234: {region: 0x166, script: 0x5b, flags: 0x0}, + 235: {region: 0x166, script: 0x5b, flags: 0x0}, + 236: {region: 0x166, script: 0x5b, flags: 0x0}, + 237: {region: 0x166, script: 0x5b, flags: 0x0}, + 238: {region: 0x166, script: 0x5b, flags: 0x0}, + 239: {region: 0xc6, script: 0xda, flags: 0x0}, + 240: {region: 0x79, script: 0x5b, flags: 0x0}, + 241: {region: 0x6c, script: 0x1d, flags: 0x0}, + 242: {region: 0xe8, script: 0x5b, flags: 0x0}, 243: {region: 0x49, script: 0x17, flags: 0x0}, - 244: {region: 0x130, script: 0x20, flags: 0x0}, + 244: {region: 0x131, script: 0x20, flags: 0x0}, 245: {region: 0x49, script: 0x17, flags: 0x0}, 246: {region: 0x49, script: 0x17, flags: 0x0}, 247: {region: 0x49, script: 0x17, flags: 0x0}, 248: {region: 0x49, script: 0x17, flags: 0x0}, - 249: {region: 0x10a, script: 0x5a, flags: 0x0}, - 250: {region: 0x5e, script: 0x5a, flags: 0x0}, - 251: {region: 0xe9, script: 0x5a, flags: 0x0}, + 249: {region: 0x10b, script: 0x5b, flags: 0x0}, + 250: {region: 0x5f, script: 0x5b, flags: 0x0}, + 251: {region: 0xea, script: 0x5b, flags: 0x0}, 252: {region: 0x49, script: 0x17, flags: 0x0}, - 253: {region: 0xc4, script: 0x86, flags: 0x0}, + 253: {region: 0xc5, script: 0x88, flags: 0x0}, 254: {region: 0x8, script: 0x2, flags: 0x1}, - 255: {region: 0x106, script: 0x20, flags: 0x0}, - 256: {region: 0x7b, script: 0x5a, flags: 0x0}, - 257: {region: 0x63, script: 0x5a, flags: 0x0}, - 258: {region: 0x165, script: 0x5a, flags: 0x0}, - 259: {region: 0x165, script: 0x5a, flags: 0x0}, - 260: {region: 0x165, script: 0x5a, flags: 0x0}, - 261: {region: 0x165, script: 0x5a, flags: 0x0}, - 262: {region: 0x135, script: 0x5a, flags: 0x0}, - 263: {region: 0x106, script: 0x20, flags: 0x0}, - 264: {region: 0xa4, script: 0x5a, flags: 0x0}, - 265: {region: 0x165, script: 0x5a, flags: 0x0}, - 266: {region: 0x165, script: 0x5a, flags: 0x0}, - 267: {region: 0x99, script: 0x5, flags: 0x0}, - 268: {region: 0x165, script: 0x5a, flags: 0x0}, - 269: {region: 0x60, script: 0x5a, flags: 0x0}, - 270: {region: 0x165, script: 0x5a, flags: 0x0}, - 271: {region: 0x49, script: 0x5a, flags: 0x0}, - 272: {region: 0x165, script: 0x5a, flags: 0x0}, - 273: {region: 0x165, script: 0x5a, flags: 0x0}, - 274: {region: 0x165, script: 0x5a, flags: 0x0}, - 275: {region: 0x165, script: 0x5, flags: 0x0}, - 276: {region: 0x49, script: 0x5a, flags: 0x0}, - 277: {region: 0x165, script: 0x5a, flags: 0x0}, - 278: {region: 0x165, script: 0x5a, flags: 0x0}, - 279: {region: 0xd4, script: 0x5a, flags: 0x0}, - 280: {region: 0x4f, script: 0x5a, flags: 0x0}, - 281: {region: 0x165, script: 0x5a, flags: 0x0}, - 282: {region: 0x99, script: 0x5, flags: 0x0}, - 283: {region: 0x165, script: 0x5a, flags: 0x0}, - 284: {region: 0x165, script: 0x5a, flags: 0x0}, - 285: {region: 0x165, script: 0x5a, flags: 0x0}, - 286: {region: 0x165, script: 0x2c, flags: 0x0}, - 287: {region: 0x60, script: 0x5a, flags: 0x0}, - 288: {region: 0xc3, script: 0x5a, flags: 0x0}, - 289: {region: 0xd0, script: 0x5a, flags: 0x0}, - 290: {region: 0x165, script: 0x5a, flags: 0x0}, - 291: {region: 0xdb, script: 0x22, flags: 0x0}, - 292: {region: 0x52, script: 0x5a, flags: 0x0}, - 293: {region: 0x165, script: 0x5a, flags: 0x0}, - 294: {region: 0x165, script: 0x5a, flags: 0x0}, - 295: {region: 0x165, script: 0x5a, flags: 0x0}, - 296: {region: 0xcd, script: 0xea, flags: 0x0}, - 297: {region: 0x165, script: 0x5a, flags: 0x0}, - 298: {region: 0x165, script: 0x5a, flags: 0x0}, - 299: {region: 0x114, script: 0x5a, flags: 0x0}, - 300: {region: 0x37, script: 0x5a, flags: 0x0}, - 301: {region: 0x43, script: 0xec, flags: 0x0}, - 302: {region: 0x165, script: 0x5a, flags: 0x0}, - 303: {region: 0xa4, script: 0x5a, flags: 0x0}, - 304: {region: 0x80, script: 0x5a, flags: 0x0}, - 305: {region: 0xd6, script: 0x5a, flags: 0x0}, - 306: {region: 0x9e, script: 0x5a, flags: 0x0}, - 307: {region: 0x6b, script: 0x29, flags: 0x0}, - 308: {region: 0x165, script: 0x5a, flags: 0x0}, - 309: {region: 0xc4, script: 0x4b, flags: 0x0}, - 310: {region: 0x87, script: 0x34, flags: 0x0}, - 311: {region: 0x165, script: 0x5a, flags: 0x0}, - 312: {region: 0x165, script: 0x5a, flags: 0x0}, + 255: {region: 0x107, script: 0x20, flags: 0x0}, + 256: {region: 0x7c, script: 0x5b, flags: 0x0}, + 257: {region: 0x64, script: 0x5b, flags: 0x0}, + 258: {region: 0x166, script: 0x5b, flags: 0x0}, + 259: {region: 0x166, script: 0x5b, flags: 0x0}, + 260: {region: 0x166, script: 0x5b, flags: 0x0}, + 261: {region: 0x166, script: 0x5b, flags: 0x0}, + 262: {region: 0x136, script: 0x5b, flags: 0x0}, + 263: {region: 0x107, script: 0x20, flags: 0x0}, + 264: {region: 0xa5, script: 0x5b, flags: 0x0}, + 265: {region: 0x166, script: 0x5b, flags: 0x0}, + 266: {region: 0x166, script: 0x5b, flags: 0x0}, + 267: {region: 0x9a, script: 0x5, flags: 0x0}, + 268: {region: 0x166, script: 0x5b, flags: 0x0}, + 269: {region: 0x61, script: 0x5b, flags: 0x0}, + 270: {region: 0x166, script: 0x5b, flags: 0x0}, + 271: {region: 0x49, script: 0x5b, flags: 0x0}, + 272: {region: 0x166, script: 0x5b, flags: 0x0}, + 273: {region: 0x166, script: 0x5b, flags: 0x0}, + 274: {region: 0x166, script: 0x5b, flags: 0x0}, + 275: {region: 0x166, script: 0x5, flags: 0x0}, + 276: {region: 0x49, script: 0x5b, flags: 0x0}, + 277: {region: 0x166, script: 0x5b, flags: 0x0}, + 278: {region: 0x166, script: 0x5b, flags: 0x0}, + 279: {region: 0xd5, script: 0x5b, flags: 0x0}, + 280: {region: 0x4f, script: 0x5b, flags: 0x0}, + 281: {region: 0x166, script: 0x5b, flags: 0x0}, + 282: {region: 0x9a, script: 0x5, flags: 0x0}, + 283: {region: 0x166, script: 0x5b, flags: 0x0}, + 284: {region: 0x166, script: 0x5b, flags: 0x0}, + 285: {region: 0x166, script: 0x5b, flags: 0x0}, + 286: {region: 0x166, script: 0x2c, flags: 0x0}, + 287: {region: 0x61, script: 0x5b, flags: 0x0}, + 288: {region: 0xc4, script: 0x5b, flags: 0x0}, + 289: {region: 0xd1, script: 0x5b, flags: 0x0}, + 290: {region: 0x166, script: 0x5b, flags: 0x0}, + 291: {region: 0xdc, script: 0x22, flags: 0x0}, + 292: {region: 0x52, script: 0x5b, flags: 0x0}, + 293: {region: 0x166, script: 0x5b, flags: 0x0}, + 294: {region: 0x166, script: 0x5b, flags: 0x0}, + 295: {region: 0x166, script: 0x5b, flags: 0x0}, + 296: {region: 0xce, script: 0xed, flags: 0x0}, + 297: {region: 0x166, script: 0x5b, flags: 0x0}, + 298: {region: 0x166, script: 0x5b, flags: 0x0}, + 299: {region: 0x115, script: 0x5b, flags: 0x0}, + 300: {region: 0x37, script: 0x5b, flags: 0x0}, + 301: {region: 0x43, script: 0xef, flags: 0x0}, + 302: {region: 0x166, script: 0x5b, flags: 0x0}, + 303: {region: 0xa5, script: 0x5b, flags: 0x0}, + 304: {region: 0x81, script: 0x5b, flags: 0x0}, + 305: {region: 0xd7, script: 0x5b, flags: 0x0}, + 306: {region: 0x9f, script: 0x5b, flags: 0x0}, + 307: {region: 0x6c, script: 0x29, flags: 0x0}, + 308: {region: 0x166, script: 0x5b, flags: 0x0}, + 309: {region: 0xc5, script: 0x4b, flags: 0x0}, + 310: {region: 0x88, script: 0x34, flags: 0x0}, + 311: {region: 0x166, script: 0x5b, flags: 0x0}, + 312: {region: 0x166, script: 0x5b, flags: 0x0}, 313: {region: 0xa, script: 0x2, flags: 0x1}, - 314: {region: 0x165, script: 0x5a, flags: 0x0}, - 315: {region: 0x165, script: 0x5a, flags: 0x0}, - 316: {region: 0x1, script: 0x5a, flags: 0x0}, - 317: {region: 0x165, script: 0x5a, flags: 0x0}, - 318: {region: 0x6e, script: 0x5a, flags: 0x0}, - 319: {region: 0x135, script: 0x5a, flags: 0x0}, - 320: {region: 0x6a, script: 0x5a, flags: 0x0}, - 321: {region: 0x165, script: 0x5a, flags: 0x0}, - 322: {region: 0x9e, script: 0x46, flags: 0x0}, - 323: {region: 0x165, script: 0x5a, flags: 0x0}, - 324: {region: 0x165, script: 0x5a, flags: 0x0}, - 325: {region: 0x6e, script: 0x5a, flags: 0x0}, - 326: {region: 0x52, script: 0x5a, flags: 0x0}, - 327: {region: 0x6e, script: 0x5a, flags: 0x0}, - 328: {region: 0x9c, script: 0x5, flags: 0x0}, - 329: {region: 0x165, script: 0x5a, flags: 0x0}, - 330: {region: 0x165, script: 0x5a, flags: 0x0}, - 331: {region: 0x165, script: 0x5a, flags: 0x0}, - 332: {region: 0x165, script: 0x5a, flags: 0x0}, - 333: {region: 0x86, script: 0x5a, flags: 0x0}, + 314: {region: 0x166, script: 0x5b, flags: 0x0}, + 315: {region: 0x166, script: 0x5b, flags: 0x0}, + 316: {region: 0x1, script: 0x5b, flags: 0x0}, + 317: {region: 0x166, script: 0x5b, flags: 0x0}, + 318: {region: 0x6f, script: 0x5b, flags: 0x0}, + 319: {region: 0x136, script: 0x5b, flags: 0x0}, + 320: {region: 0x6b, script: 0x5b, flags: 0x0}, + 321: {region: 0x166, script: 0x5b, flags: 0x0}, + 322: {region: 0x9f, script: 0x46, flags: 0x0}, + 323: {region: 0x166, script: 0x5b, flags: 0x0}, + 324: {region: 0x166, script: 0x5b, flags: 0x0}, + 325: {region: 0x6f, script: 0x5b, flags: 0x0}, + 326: {region: 0x52, script: 0x5b, flags: 0x0}, + 327: {region: 0x6f, script: 0x5b, flags: 0x0}, + 328: {region: 0x9d, script: 0x5, flags: 0x0}, + 329: {region: 0x166, script: 0x5b, flags: 0x0}, + 330: {region: 0x166, script: 0x5b, flags: 0x0}, + 331: {region: 0x166, script: 0x5b, flags: 0x0}, + 332: {region: 0x166, script: 0x5b, flags: 0x0}, + 333: {region: 0x87, script: 0x5b, flags: 0x0}, 334: {region: 0xc, script: 0x2, flags: 0x1}, - 335: {region: 0x165, script: 0x5a, flags: 0x0}, - 336: {region: 0xc3, script: 0x5a, flags: 0x0}, - 337: {region: 0x72, script: 0x5a, flags: 0x0}, - 338: {region: 0x10b, script: 0x5, flags: 0x0}, - 339: {region: 0xe7, script: 0x5a, flags: 0x0}, - 340: {region: 0x10c, script: 0x5a, flags: 0x0}, - 341: {region: 0x73, script: 0x5a, flags: 0x0}, - 342: {region: 0x165, script: 0x5a, flags: 0x0}, - 343: {region: 0x165, script: 0x5a, flags: 0x0}, - 344: {region: 0x76, script: 0x5a, flags: 0x0}, - 345: {region: 0x165, script: 0x5a, flags: 0x0}, - 346: {region: 0x3b, script: 0x5a, flags: 0x0}, - 347: {region: 0x165, script: 0x5a, flags: 0x0}, - 348: {region: 0x165, script: 0x5a, flags: 0x0}, - 349: {region: 0x165, script: 0x5a, flags: 0x0}, - 350: {region: 0x78, script: 0x5a, flags: 0x0}, - 351: {region: 0x135, script: 0x5a, flags: 0x0}, - 352: {region: 0x78, script: 0x5a, flags: 0x0}, - 353: {region: 0x60, script: 0x5a, flags: 0x0}, - 354: {region: 0x60, script: 0x5a, flags: 0x0}, + 335: {region: 0x166, script: 0x5b, flags: 0x0}, + 336: {region: 0xc4, script: 0x5b, flags: 0x0}, + 337: {region: 0x73, script: 0x5b, flags: 0x0}, + 338: {region: 0x10c, script: 0x5, flags: 0x0}, + 339: {region: 0xe8, script: 0x5b, flags: 0x0}, + 340: {region: 0x10d, script: 0x5b, flags: 0x0}, + 341: {region: 0x74, script: 0x5b, flags: 0x0}, + 342: {region: 0x166, script: 0x5b, flags: 0x0}, + 343: {region: 0x166, script: 0x5b, flags: 0x0}, + 344: {region: 0x77, script: 0x5b, flags: 0x0}, + 345: {region: 0x166, script: 0x5b, flags: 0x0}, + 346: {region: 0x3b, script: 0x5b, flags: 0x0}, + 347: {region: 0x166, script: 0x5b, flags: 0x0}, + 348: {region: 0x166, script: 0x5b, flags: 0x0}, + 349: {region: 0x166, script: 0x5b, flags: 0x0}, + 350: {region: 0x79, script: 0x5b, flags: 0x0}, + 351: {region: 0x136, script: 0x5b, flags: 0x0}, + 352: {region: 0x79, script: 0x5b, flags: 0x0}, + 353: {region: 0x61, script: 0x5b, flags: 0x0}, + 354: {region: 0x61, script: 0x5b, flags: 0x0}, 355: {region: 0x52, script: 0x5, flags: 0x0}, - 356: {region: 0x140, script: 0x5a, flags: 0x0}, - 357: {region: 0x165, script: 0x5a, flags: 0x0}, - 358: {region: 0x84, script: 0x5a, flags: 0x0}, - 359: {region: 0x165, script: 0x5a, flags: 0x0}, - 360: {region: 0xd4, script: 0x5a, flags: 0x0}, - 361: {region: 0x9e, script: 0x5a, flags: 0x0}, - 362: {region: 0xd6, script: 0x5a, flags: 0x0}, - 363: {region: 0x165, script: 0x5a, flags: 0x0}, - 364: {region: 0x10b, script: 0x5a, flags: 0x0}, - 365: {region: 0xd9, script: 0x5a, flags: 0x0}, - 366: {region: 0x96, script: 0x5a, flags: 0x0}, - 367: {region: 0x80, script: 0x5a, flags: 0x0}, - 368: {region: 0x165, script: 0x5a, flags: 0x0}, - 369: {region: 0xbc, script: 0x5a, flags: 0x0}, - 370: {region: 0x165, script: 0x5a, flags: 0x0}, - 371: {region: 0x165, script: 0x5a, flags: 0x0}, - 372: {region: 0x165, script: 0x5a, flags: 0x0}, + 356: {region: 0x141, script: 0x5b, flags: 0x0}, + 357: {region: 0x166, script: 0x5b, flags: 0x0}, + 358: {region: 0x85, script: 0x5b, flags: 0x0}, + 359: {region: 0x166, script: 0x5b, flags: 0x0}, + 360: {region: 0xd5, script: 0x5b, flags: 0x0}, + 361: {region: 0x9f, script: 0x5b, flags: 0x0}, + 362: {region: 0xd7, script: 0x5b, flags: 0x0}, + 363: {region: 0x166, script: 0x5b, flags: 0x0}, + 364: {region: 0x10c, script: 0x5b, flags: 0x0}, + 365: {region: 0xda, script: 0x5b, flags: 0x0}, + 366: {region: 0x97, script: 0x5b, flags: 0x0}, + 367: {region: 0x81, script: 0x5b, flags: 0x0}, + 368: {region: 0x166, script: 0x5b, flags: 0x0}, + 369: {region: 0xbd, script: 0x5b, flags: 0x0}, + 370: {region: 0x166, script: 0x5b, flags: 0x0}, + 371: {region: 0x166, script: 0x5b, flags: 0x0}, + 372: {region: 0x166, script: 0x5b, flags: 0x0}, 373: {region: 0x53, script: 0x3b, flags: 0x0}, - 374: {region: 0x165, script: 0x5a, flags: 0x0}, - 375: {region: 0x95, script: 0x5a, flags: 0x0}, - 376: {region: 0x165, script: 0x5a, flags: 0x0}, - 377: {region: 0x165, script: 0x5a, flags: 0x0}, - 378: {region: 0x99, script: 0x22, flags: 0x0}, - 379: {region: 0x165, script: 0x5a, flags: 0x0}, - 380: {region: 0x9c, script: 0x5, flags: 0x0}, - 381: {region: 0x7e, script: 0x5a, flags: 0x0}, - 382: {region: 0x7b, script: 0x5a, flags: 0x0}, - 383: {region: 0x165, script: 0x5a, flags: 0x0}, - 384: {region: 0x165, script: 0x5a, flags: 0x0}, - 385: {region: 0x165, script: 0x5a, flags: 0x0}, - 386: {region: 0x165, script: 0x5a, flags: 0x0}, - 387: {region: 0x165, script: 0x5a, flags: 0x0}, - 388: {region: 0x165, script: 0x5a, flags: 0x0}, - 389: {region: 0x6f, script: 0x2c, flags: 0x0}, - 390: {region: 0x165, script: 0x5a, flags: 0x0}, - 391: {region: 0xdb, script: 0x22, flags: 0x0}, - 392: {region: 0x165, script: 0x5a, flags: 0x0}, - 393: {region: 0xa7, script: 0x5a, flags: 0x0}, - 394: {region: 0x165, script: 0x5a, flags: 0x0}, - 395: {region: 0xe8, script: 0x5, flags: 0x0}, - 396: {region: 0x165, script: 0x5a, flags: 0x0}, - 397: {region: 0xe8, script: 0x5, flags: 0x0}, - 398: {region: 0x165, script: 0x5a, flags: 0x0}, - 399: {region: 0x165, script: 0x5a, flags: 0x0}, - 400: {region: 0x6e, script: 0x5a, flags: 0x0}, - 401: {region: 0x9c, script: 0x5, flags: 0x0}, - 402: {region: 0x165, script: 0x5a, flags: 0x0}, - 403: {region: 0x165, script: 0x2c, flags: 0x0}, - 404: {region: 0xf1, script: 0x5a, flags: 0x0}, - 405: {region: 0x165, script: 0x5a, flags: 0x0}, - 406: {region: 0x165, script: 0x5a, flags: 0x0}, - 407: {region: 0x165, script: 0x5a, flags: 0x0}, - 408: {region: 0x165, script: 0x2c, flags: 0x0}, - 409: {region: 0x165, script: 0x5a, flags: 0x0}, - 410: {region: 0x99, script: 0x22, flags: 0x0}, - 411: {region: 0x99, script: 0xe6, flags: 0x0}, - 412: {region: 0x95, script: 0x5a, flags: 0x0}, - 413: {region: 0xd9, script: 0x5a, flags: 0x0}, - 414: {region: 0x130, script: 0x32, flags: 0x0}, - 415: {region: 0x165, script: 0x5a, flags: 0x0}, + 374: {region: 0x166, script: 0x5b, flags: 0x0}, + 375: {region: 0x96, script: 0x5b, flags: 0x0}, + 376: {region: 0x166, script: 0x5b, flags: 0x0}, + 377: {region: 0x166, script: 0x5b, flags: 0x0}, + 378: {region: 0x9a, script: 0x22, flags: 0x0}, + 379: {region: 0x166, script: 0x5b, flags: 0x0}, + 380: {region: 0x9d, script: 0x5, flags: 0x0}, + 381: {region: 0x7f, script: 0x5b, flags: 0x0}, + 382: {region: 0x7c, script: 0x5b, flags: 0x0}, + 383: {region: 0x166, script: 0x5b, flags: 0x0}, + 384: {region: 0x166, script: 0x5b, flags: 0x0}, + 385: {region: 0x166, script: 0x5b, flags: 0x0}, + 386: {region: 0x166, script: 0x5b, flags: 0x0}, + 387: {region: 0x166, script: 0x5b, flags: 0x0}, + 388: {region: 0x166, script: 0x5b, flags: 0x0}, + 389: {region: 0x70, script: 0x2c, flags: 0x0}, + 390: {region: 0x166, script: 0x5b, flags: 0x0}, + 391: {region: 0xdc, script: 0x22, flags: 0x0}, + 392: {region: 0x166, script: 0x5b, flags: 0x0}, + 393: {region: 0xa8, script: 0x5b, flags: 0x0}, + 394: {region: 0x166, script: 0x5b, flags: 0x0}, + 395: {region: 0xe9, script: 0x5, flags: 0x0}, + 396: {region: 0x166, script: 0x5b, flags: 0x0}, + 397: {region: 0xe9, script: 0x5, flags: 0x0}, + 398: {region: 0x166, script: 0x5b, flags: 0x0}, + 399: {region: 0x166, script: 0x5b, flags: 0x0}, + 400: {region: 0x6f, script: 0x5b, flags: 0x0}, + 401: {region: 0x9d, script: 0x5, flags: 0x0}, + 402: {region: 0x166, script: 0x5b, flags: 0x0}, + 403: {region: 0x166, script: 0x2c, flags: 0x0}, + 404: {region: 0xf2, script: 0x5b, flags: 0x0}, + 405: {region: 0x166, script: 0x5b, flags: 0x0}, + 406: {region: 0x166, script: 0x5b, flags: 0x0}, + 407: {region: 0x166, script: 0x5b, flags: 0x0}, + 408: {region: 0x166, script: 0x2c, flags: 0x0}, + 409: {region: 0x166, script: 0x5b, flags: 0x0}, + 410: {region: 0x9a, script: 0x22, flags: 0x0}, + 411: {region: 0x9a, script: 0xe9, flags: 0x0}, + 412: {region: 0x96, script: 0x5b, flags: 0x0}, + 413: {region: 0xda, script: 0x5b, flags: 0x0}, + 414: {region: 0x131, script: 0x32, flags: 0x0}, + 415: {region: 0x166, script: 0x5b, flags: 0x0}, 416: {region: 0xe, script: 0x2, flags: 0x1}, - 417: {region: 0x99, script: 0xe, flags: 0x0}, - 418: {region: 0x165, script: 0x5a, flags: 0x0}, - 419: {region: 0x4e, script: 0x5a, flags: 0x0}, - 420: {region: 0x99, script: 0x35, flags: 0x0}, - 421: {region: 0x41, script: 0x5a, flags: 0x0}, - 422: {region: 0x54, script: 0x5a, flags: 0x0}, - 423: {region: 0x165, script: 0x5a, flags: 0x0}, - 424: {region: 0x80, script: 0x5a, flags: 0x0}, - 425: {region: 0x165, script: 0x5a, flags: 0x0}, - 426: {region: 0x165, script: 0x5a, flags: 0x0}, - 427: {region: 0xa4, script: 0x5a, flags: 0x0}, - 428: {region: 0x98, script: 0x5a, flags: 0x0}, - 429: {region: 0x165, script: 0x5a, flags: 0x0}, - 430: {region: 0xdb, script: 0x22, flags: 0x0}, - 431: {region: 0x165, script: 0x5a, flags: 0x0}, - 432: {region: 0x165, script: 0x5, flags: 0x0}, - 433: {region: 0x49, script: 0x5a, flags: 0x0}, - 434: {region: 0x165, script: 0x5, flags: 0x0}, - 435: {region: 0x165, script: 0x5a, flags: 0x0}, + 417: {region: 0x9a, script: 0xe, flags: 0x0}, + 418: {region: 0x166, script: 0x5b, flags: 0x0}, + 419: {region: 0x4e, script: 0x5b, flags: 0x0}, + 420: {region: 0x9a, script: 0x35, flags: 0x0}, + 421: {region: 0x41, script: 0x5b, flags: 0x0}, + 422: {region: 0x54, script: 0x5b, flags: 0x0}, + 423: {region: 0x166, script: 0x5b, flags: 0x0}, + 424: {region: 0x81, script: 0x5b, flags: 0x0}, + 425: {region: 0x166, script: 0x5b, flags: 0x0}, + 426: {region: 0x166, script: 0x5b, flags: 0x0}, + 427: {region: 0xa5, script: 0x5b, flags: 0x0}, + 428: {region: 0x99, script: 0x5b, flags: 0x0}, + 429: {region: 0x166, script: 0x5b, flags: 0x0}, + 430: {region: 0xdc, script: 0x22, flags: 0x0}, + 431: {region: 0x166, script: 0x5b, flags: 0x0}, + 432: {region: 0x166, script: 0x5, flags: 0x0}, + 433: {region: 0x49, script: 0x5b, flags: 0x0}, + 434: {region: 0x166, script: 0x5, flags: 0x0}, + 435: {region: 0x166, script: 0x5b, flags: 0x0}, 436: {region: 0x10, script: 0x3, flags: 0x1}, - 437: {region: 0x165, script: 0x5a, flags: 0x0}, + 437: {region: 0x166, script: 0x5b, flags: 0x0}, 438: {region: 0x53, script: 0x3b, flags: 0x0}, - 439: {region: 0x165, script: 0x5a, flags: 0x0}, - 440: {region: 0x135, script: 0x5a, flags: 0x0}, + 439: {region: 0x166, script: 0x5b, flags: 0x0}, + 440: {region: 0x136, script: 0x5b, flags: 0x0}, 441: {region: 0x24, script: 0x5, flags: 0x0}, - 442: {region: 0x165, script: 0x5a, flags: 0x0}, - 443: {region: 0x165, script: 0x2c, flags: 0x0}, - 444: {region: 0x97, script: 0x3e, flags: 0x0}, - 445: {region: 0x165, script: 0x5a, flags: 0x0}, - 446: {region: 0x99, script: 0x22, flags: 0x0}, - 447: {region: 0x165, script: 0x5a, flags: 0x0}, - 448: {region: 0x73, script: 0x5a, flags: 0x0}, - 449: {region: 0x165, script: 0x5a, flags: 0x0}, - 450: {region: 0x165, script: 0x5a, flags: 0x0}, - 451: {region: 0xe7, script: 0x5a, flags: 0x0}, - 452: {region: 0x165, script: 0x5a, flags: 0x0}, - 453: {region: 0x12b, script: 0x40, flags: 0x0}, - 454: {region: 0x53, script: 0x90, flags: 0x0}, - 455: {region: 0x165, script: 0x5a, flags: 0x0}, - 456: {region: 0xe8, script: 0x5, flags: 0x0}, - 457: {region: 0x99, script: 0x22, flags: 0x0}, - 458: {region: 0xaf, script: 0x41, flags: 0x0}, - 459: {region: 0xe7, script: 0x5a, flags: 0x0}, - 460: {region: 0xe8, script: 0x5, flags: 0x0}, - 461: {region: 0xe6, script: 0x5a, flags: 0x0}, - 462: {region: 0x99, script: 0x22, flags: 0x0}, - 463: {region: 0x99, script: 0x22, flags: 0x0}, - 464: {region: 0x165, script: 0x5a, flags: 0x0}, - 465: {region: 0x90, script: 0x5a, flags: 0x0}, - 466: {region: 0x60, script: 0x5a, flags: 0x0}, + 442: {region: 0x166, script: 0x5b, flags: 0x0}, + 443: {region: 0x166, script: 0x2c, flags: 0x0}, + 444: {region: 0x98, script: 0x3e, flags: 0x0}, + 445: {region: 0x166, script: 0x5b, flags: 0x0}, + 446: {region: 0x9a, script: 0x22, flags: 0x0}, + 447: {region: 0x166, script: 0x5b, flags: 0x0}, + 448: {region: 0x74, script: 0x5b, flags: 0x0}, + 449: {region: 0x166, script: 0x5b, flags: 0x0}, + 450: {region: 0x166, script: 0x5b, flags: 0x0}, + 451: {region: 0xe8, script: 0x5b, flags: 0x0}, + 452: {region: 0x166, script: 0x5b, flags: 0x0}, + 453: {region: 0x12c, script: 0x40, flags: 0x0}, + 454: {region: 0x53, script: 0x92, flags: 0x0}, + 455: {region: 0x166, script: 0x5b, flags: 0x0}, + 456: {region: 0xe9, script: 0x5, flags: 0x0}, + 457: {region: 0x9a, script: 0x22, flags: 0x0}, + 458: {region: 0xb0, script: 0x41, flags: 0x0}, + 459: {region: 0xe8, script: 0x5b, flags: 0x0}, + 460: {region: 0xe9, script: 0x5, flags: 0x0}, + 461: {region: 0xe7, script: 0x5b, flags: 0x0}, + 462: {region: 0x9a, script: 0x22, flags: 0x0}, + 463: {region: 0x9a, script: 0x22, flags: 0x0}, + 464: {region: 0x166, script: 0x5b, flags: 0x0}, + 465: {region: 0x91, script: 0x5b, flags: 0x0}, + 466: {region: 0x61, script: 0x5b, flags: 0x0}, 467: {region: 0x53, script: 0x3b, flags: 0x0}, - 468: {region: 0x91, script: 0x5a, flags: 0x0}, - 469: {region: 0x92, script: 0x5a, flags: 0x0}, - 470: {region: 0x165, script: 0x5a, flags: 0x0}, + 468: {region: 0x92, script: 0x5b, flags: 0x0}, + 469: {region: 0x93, script: 0x5b, flags: 0x0}, + 470: {region: 0x166, script: 0x5b, flags: 0x0}, 471: {region: 0x28, script: 0x8, flags: 0x0}, - 472: {region: 0xd2, script: 0x5a, flags: 0x0}, - 473: {region: 0x78, script: 0x5a, flags: 0x0}, - 474: {region: 0x165, script: 0x5a, flags: 0x0}, - 475: {region: 0x165, script: 0x5a, flags: 0x0}, - 476: {region: 0xd0, script: 0x5a, flags: 0x0}, - 477: {region: 0xd6, script: 0x5a, flags: 0x0}, - 478: {region: 0x165, script: 0x5a, flags: 0x0}, - 479: {region: 0x165, script: 0x5a, flags: 0x0}, - 480: {region: 0x165, script: 0x5a, flags: 0x0}, - 481: {region: 0x95, script: 0x5a, flags: 0x0}, - 482: {region: 0x165, script: 0x5a, flags: 0x0}, - 483: {region: 0x165, script: 0x5a, flags: 0x0}, - 484: {region: 0x165, script: 0x5a, flags: 0x0}, - 486: {region: 0x122, script: 0x5a, flags: 0x0}, - 487: {region: 0xd6, script: 0x5a, flags: 0x0}, - 488: {region: 0x165, script: 0x5a, flags: 0x0}, - 489: {region: 0x165, script: 0x5a, flags: 0x0}, - 490: {region: 0x53, script: 0xfa, flags: 0x0}, - 491: {region: 0x165, script: 0x5a, flags: 0x0}, - 492: {region: 0x135, script: 0x5a, flags: 0x0}, - 493: {region: 0x165, script: 0x5a, flags: 0x0}, - 494: {region: 0x49, script: 0x5a, flags: 0x0}, - 495: {region: 0x165, script: 0x5a, flags: 0x0}, - 496: {region: 0x165, script: 0x5a, flags: 0x0}, - 497: {region: 0xe7, script: 0x5a, flags: 0x0}, - 498: {region: 0x165, script: 0x5a, flags: 0x0}, - 499: {region: 0x95, script: 0x5a, flags: 0x0}, - 500: {region: 0x106, script: 0x20, flags: 0x0}, - 501: {region: 0x1, script: 0x5a, flags: 0x0}, - 502: {region: 0x165, script: 0x5a, flags: 0x0}, - 503: {region: 0x165, script: 0x5a, flags: 0x0}, - 504: {region: 0x9d, script: 0x5a, flags: 0x0}, - 505: {region: 0x9e, script: 0x5a, flags: 0x0}, + 472: {region: 0xd3, script: 0x5b, flags: 0x0}, + 473: {region: 0x79, script: 0x5b, flags: 0x0}, + 474: {region: 0x166, script: 0x5b, flags: 0x0}, + 475: {region: 0x166, script: 0x5b, flags: 0x0}, + 476: {region: 0xd1, script: 0x5b, flags: 0x0}, + 477: {region: 0xd7, script: 0x5b, flags: 0x0}, + 478: {region: 0x166, script: 0x5b, flags: 0x0}, + 479: {region: 0x166, script: 0x5b, flags: 0x0}, + 480: {region: 0x166, script: 0x5b, flags: 0x0}, + 481: {region: 0x96, script: 0x5b, flags: 0x0}, + 482: {region: 0x166, script: 0x5b, flags: 0x0}, + 483: {region: 0x166, script: 0x5b, flags: 0x0}, + 484: {region: 0x166, script: 0x5b, flags: 0x0}, + 486: {region: 0x123, script: 0x5b, flags: 0x0}, + 487: {region: 0xd7, script: 0x5b, flags: 0x0}, + 488: {region: 0x166, script: 0x5b, flags: 0x0}, + 489: {region: 0x166, script: 0x5b, flags: 0x0}, + 490: {region: 0x53, script: 0xfd, flags: 0x0}, + 491: {region: 0x166, script: 0x5b, flags: 0x0}, + 492: {region: 0x136, script: 0x5b, flags: 0x0}, + 493: {region: 0x166, script: 0x5b, flags: 0x0}, + 494: {region: 0x49, script: 0x5b, flags: 0x0}, + 495: {region: 0x166, script: 0x5b, flags: 0x0}, + 496: {region: 0x166, script: 0x5b, flags: 0x0}, + 497: {region: 0xe8, script: 0x5b, flags: 0x0}, + 498: {region: 0x166, script: 0x5b, flags: 0x0}, + 499: {region: 0x96, script: 0x5b, flags: 0x0}, + 500: {region: 0x107, script: 0x20, flags: 0x0}, + 501: {region: 0x1, script: 0x5b, flags: 0x0}, + 502: {region: 0x166, script: 0x5b, flags: 0x0}, + 503: {region: 0x166, script: 0x5b, flags: 0x0}, + 504: {region: 0x9e, script: 0x5b, flags: 0x0}, + 505: {region: 0x9f, script: 0x5b, flags: 0x0}, 506: {region: 0x49, script: 0x17, flags: 0x0}, - 507: {region: 0x97, script: 0x3e, flags: 0x0}, - 508: {region: 0x165, script: 0x5a, flags: 0x0}, - 509: {region: 0x165, script: 0x5a, flags: 0x0}, - 510: {region: 0x106, script: 0x5a, flags: 0x0}, - 511: {region: 0x165, script: 0x5a, flags: 0x0}, - 512: {region: 0xa2, script: 0x49, flags: 0x0}, - 513: {region: 0x165, script: 0x5a, flags: 0x0}, - 514: {region: 0xa0, script: 0x5a, flags: 0x0}, - 515: {region: 0x1, script: 0x5a, flags: 0x0}, - 516: {region: 0x165, script: 0x5a, flags: 0x0}, - 517: {region: 0x165, script: 0x5a, flags: 0x0}, - 518: {region: 0x165, script: 0x5a, flags: 0x0}, - 519: {region: 0x52, script: 0x5a, flags: 0x0}, - 520: {region: 0x130, script: 0x3e, flags: 0x0}, - 521: {region: 0x165, script: 0x5a, flags: 0x0}, - 522: {region: 0x12f, script: 0x5a, flags: 0x0}, - 523: {region: 0xdb, script: 0x22, flags: 0x0}, - 524: {region: 0x165, script: 0x5a, flags: 0x0}, - 525: {region: 0x63, script: 0x5a, flags: 0x0}, - 526: {region: 0x95, script: 0x5a, flags: 0x0}, - 527: {region: 0x95, script: 0x5a, flags: 0x0}, - 528: {region: 0x7d, script: 0x2e, flags: 0x0}, - 529: {region: 0x137, script: 0x20, flags: 0x0}, - 530: {region: 0x67, script: 0x5a, flags: 0x0}, - 531: {region: 0xc4, script: 0x5a, flags: 0x0}, - 532: {region: 0x165, script: 0x5a, flags: 0x0}, - 533: {region: 0x165, script: 0x5a, flags: 0x0}, - 534: {region: 0xd6, script: 0x5a, flags: 0x0}, - 535: {region: 0xa4, script: 0x5a, flags: 0x0}, - 536: {region: 0xc3, script: 0x5a, flags: 0x0}, - 537: {region: 0x106, script: 0x20, flags: 0x0}, - 538: {region: 0x165, script: 0x5a, flags: 0x0}, - 539: {region: 0x165, script: 0x5a, flags: 0x0}, - 540: {region: 0x165, script: 0x5a, flags: 0x0}, - 541: {region: 0x165, script: 0x5a, flags: 0x0}, - 542: {region: 0xd4, script: 0x5, flags: 0x0}, - 543: {region: 0xd6, script: 0x5a, flags: 0x0}, - 544: {region: 0x164, script: 0x5a, flags: 0x0}, - 545: {region: 0x165, script: 0x5a, flags: 0x0}, - 546: {region: 0x165, script: 0x5a, flags: 0x0}, - 547: {region: 0x12f, script: 0x5a, flags: 0x0}, - 548: {region: 0x122, script: 0x5, flags: 0x0}, - 549: {region: 0x165, script: 0x5a, flags: 0x0}, - 550: {region: 0x123, script: 0xeb, flags: 0x0}, - 551: {region: 0x5a, script: 0x5a, flags: 0x0}, - 552: {region: 0x52, script: 0x5a, flags: 0x0}, - 553: {region: 0x165, script: 0x5a, flags: 0x0}, - 554: {region: 0x4f, script: 0x5a, flags: 0x0}, - 555: {region: 0x99, script: 0x22, flags: 0x0}, - 556: {region: 0x99, script: 0x22, flags: 0x0}, - 557: {region: 0x4b, script: 0x5a, flags: 0x0}, - 558: {region: 0x95, script: 0x5a, flags: 0x0}, - 559: {region: 0x165, script: 0x5a, flags: 0x0}, - 560: {region: 0x41, script: 0x5a, flags: 0x0}, - 561: {region: 0x99, script: 0x5a, flags: 0x0}, - 562: {region: 0x53, script: 0xe2, flags: 0x0}, - 563: {region: 0x99, script: 0x22, flags: 0x0}, - 564: {region: 0xc3, script: 0x5a, flags: 0x0}, - 565: {region: 0x165, script: 0x5a, flags: 0x0}, - 566: {region: 0x99, script: 0x75, flags: 0x0}, - 567: {region: 0xe8, script: 0x5, flags: 0x0}, - 568: {region: 0x165, script: 0x5a, flags: 0x0}, - 569: {region: 0xa4, script: 0x5a, flags: 0x0}, - 570: {region: 0x165, script: 0x5a, flags: 0x0}, - 571: {region: 0x12b, script: 0x5a, flags: 0x0}, - 572: {region: 0x165, script: 0x5a, flags: 0x0}, - 573: {region: 0xd2, script: 0x5a, flags: 0x0}, - 574: {region: 0x165, script: 0x5a, flags: 0x0}, - 575: {region: 0xaf, script: 0x57, flags: 0x0}, - 576: {region: 0x165, script: 0x5a, flags: 0x0}, - 577: {region: 0x165, script: 0x5a, flags: 0x0}, + 507: {region: 0x98, script: 0x3e, flags: 0x0}, + 508: {region: 0x166, script: 0x5b, flags: 0x0}, + 509: {region: 0x166, script: 0x5b, flags: 0x0}, + 510: {region: 0x107, script: 0x5b, flags: 0x0}, + 511: {region: 0x166, script: 0x5b, flags: 0x0}, + 512: {region: 0xa3, script: 0x49, flags: 0x0}, + 513: {region: 0x166, script: 0x5b, flags: 0x0}, + 514: {region: 0xa1, script: 0x5b, flags: 0x0}, + 515: {region: 0x1, script: 0x5b, flags: 0x0}, + 516: {region: 0x166, script: 0x5b, flags: 0x0}, + 517: {region: 0x166, script: 0x5b, flags: 0x0}, + 518: {region: 0x166, script: 0x5b, flags: 0x0}, + 519: {region: 0x52, script: 0x5b, flags: 0x0}, + 520: {region: 0x131, script: 0x3e, flags: 0x0}, + 521: {region: 0x166, script: 0x5b, flags: 0x0}, + 522: {region: 0x130, script: 0x5b, flags: 0x0}, + 523: {region: 0xdc, script: 0x22, flags: 0x0}, + 524: {region: 0x166, script: 0x5b, flags: 0x0}, + 525: {region: 0x64, script: 0x5b, flags: 0x0}, + 526: {region: 0x96, script: 0x5b, flags: 0x0}, + 527: {region: 0x96, script: 0x5b, flags: 0x0}, + 528: {region: 0x7e, script: 0x2e, flags: 0x0}, + 529: {region: 0x138, script: 0x20, flags: 0x0}, + 530: {region: 0x68, script: 0x5b, flags: 0x0}, + 531: {region: 0xc5, script: 0x5b, flags: 0x0}, + 532: {region: 0x166, script: 0x5b, flags: 0x0}, + 533: {region: 0x166, script: 0x5b, flags: 0x0}, + 534: {region: 0xd7, script: 0x5b, flags: 0x0}, + 535: {region: 0xa5, script: 0x5b, flags: 0x0}, + 536: {region: 0xc4, script: 0x5b, flags: 0x0}, + 537: {region: 0x107, script: 0x20, flags: 0x0}, + 538: {region: 0x166, script: 0x5b, flags: 0x0}, + 539: {region: 0x166, script: 0x5b, flags: 0x0}, + 540: {region: 0x166, script: 0x5b, flags: 0x0}, + 541: {region: 0x166, script: 0x5b, flags: 0x0}, + 542: {region: 0xd5, script: 0x5, flags: 0x0}, + 543: {region: 0xd7, script: 0x5b, flags: 0x0}, + 544: {region: 0x165, script: 0x5b, flags: 0x0}, + 545: {region: 0x166, script: 0x5b, flags: 0x0}, + 546: {region: 0x166, script: 0x5b, flags: 0x0}, + 547: {region: 0x130, script: 0x5b, flags: 0x0}, + 548: {region: 0x123, script: 0x5, flags: 0x0}, + 549: {region: 0x166, script: 0x5b, flags: 0x0}, + 550: {region: 0x124, script: 0xee, flags: 0x0}, + 551: {region: 0x5b, script: 0x5b, flags: 0x0}, + 552: {region: 0x52, script: 0x5b, flags: 0x0}, + 553: {region: 0x166, script: 0x5b, flags: 0x0}, + 554: {region: 0x4f, script: 0x5b, flags: 0x0}, + 555: {region: 0x9a, script: 0x22, flags: 0x0}, + 556: {region: 0x9a, script: 0x22, flags: 0x0}, + 557: {region: 0x4b, script: 0x5b, flags: 0x0}, + 558: {region: 0x96, script: 0x5b, flags: 0x0}, + 559: {region: 0x166, script: 0x5b, flags: 0x0}, + 560: {region: 0x41, script: 0x5b, flags: 0x0}, + 561: {region: 0x9a, script: 0x5b, flags: 0x0}, + 562: {region: 0x53, script: 0xe5, flags: 0x0}, + 563: {region: 0x9a, script: 0x22, flags: 0x0}, + 564: {region: 0xc4, script: 0x5b, flags: 0x0}, + 565: {region: 0x166, script: 0x5b, flags: 0x0}, + 566: {region: 0x9a, script: 0x76, flags: 0x0}, + 567: {region: 0xe9, script: 0x5, flags: 0x0}, + 568: {region: 0x166, script: 0x5b, flags: 0x0}, + 569: {region: 0xa5, script: 0x5b, flags: 0x0}, + 570: {region: 0x166, script: 0x5b, flags: 0x0}, + 571: {region: 0x12c, script: 0x5b, flags: 0x0}, + 572: {region: 0x166, script: 0x5b, flags: 0x0}, + 573: {region: 0xd3, script: 0x5b, flags: 0x0}, + 574: {region: 0x166, script: 0x5b, flags: 0x0}, + 575: {region: 0xb0, script: 0x58, flags: 0x0}, + 576: {region: 0x166, script: 0x5b, flags: 0x0}, + 577: {region: 0x166, script: 0x5b, flags: 0x0}, 578: {region: 0x13, script: 0x6, flags: 0x1}, - 579: {region: 0x165, script: 0x5a, flags: 0x0}, - 580: {region: 0x52, script: 0x5a, flags: 0x0}, - 581: {region: 0x82, script: 0x5a, flags: 0x0}, - 582: {region: 0xa4, script: 0x5a, flags: 0x0}, - 583: {region: 0x165, script: 0x5a, flags: 0x0}, - 584: {region: 0x165, script: 0x5a, flags: 0x0}, - 585: {region: 0x165, script: 0x5a, flags: 0x0}, - 586: {region: 0xa6, script: 0x4e, flags: 0x0}, - 587: {region: 0x2a, script: 0x5a, flags: 0x0}, - 588: {region: 0x165, script: 0x5a, flags: 0x0}, - 589: {region: 0x165, script: 0x5a, flags: 0x0}, - 590: {region: 0x165, script: 0x5a, flags: 0x0}, - 591: {region: 0x165, script: 0x5a, flags: 0x0}, - 592: {region: 0x165, script: 0x5a, flags: 0x0}, - 593: {region: 0x99, script: 0x52, flags: 0x0}, - 594: {region: 0x8b, script: 0x5a, flags: 0x0}, - 595: {region: 0x165, script: 0x5a, flags: 0x0}, - 596: {region: 0xab, script: 0x53, flags: 0x0}, - 597: {region: 0x106, script: 0x20, flags: 0x0}, - 598: {region: 0x99, script: 0x22, flags: 0x0}, - 599: {region: 0x165, script: 0x5a, flags: 0x0}, - 600: {region: 0x75, script: 0x5a, flags: 0x0}, - 601: {region: 0x165, script: 0x5a, flags: 0x0}, - 602: {region: 0xb4, script: 0x5a, flags: 0x0}, - 603: {region: 0x165, script: 0x5a, flags: 0x0}, - 604: {region: 0x165, script: 0x5a, flags: 0x0}, - 605: {region: 0x165, script: 0x5a, flags: 0x0}, - 606: {region: 0x165, script: 0x5a, flags: 0x0}, - 607: {region: 0x165, script: 0x5a, flags: 0x0}, - 608: {region: 0x165, script: 0x5a, flags: 0x0}, - 609: {region: 0x165, script: 0x5a, flags: 0x0}, - 610: {region: 0x165, script: 0x2c, flags: 0x0}, - 611: {region: 0x165, script: 0x5a, flags: 0x0}, - 612: {region: 0x106, script: 0x20, flags: 0x0}, - 613: {region: 0x112, script: 0x5a, flags: 0x0}, - 614: {region: 0xe7, script: 0x5a, flags: 0x0}, - 615: {region: 0x106, script: 0x5a, flags: 0x0}, - 616: {region: 0x165, script: 0x5a, flags: 0x0}, - 617: {region: 0x99, script: 0x22, flags: 0x0}, - 618: {region: 0x99, script: 0x5, flags: 0x0}, - 619: {region: 0x12f, script: 0x5a, flags: 0x0}, - 620: {region: 0x165, script: 0x5a, flags: 0x0}, - 621: {region: 0x52, script: 0x5a, flags: 0x0}, - 622: {region: 0x60, script: 0x5a, flags: 0x0}, - 623: {region: 0x165, script: 0x5a, flags: 0x0}, - 624: {region: 0x165, script: 0x5a, flags: 0x0}, - 625: {region: 0x165, script: 0x2c, flags: 0x0}, - 626: {region: 0x165, script: 0x5a, flags: 0x0}, - 627: {region: 0x165, script: 0x5a, flags: 0x0}, + 579: {region: 0x166, script: 0x5b, flags: 0x0}, + 580: {region: 0x52, script: 0x5b, flags: 0x0}, + 581: {region: 0x83, script: 0x5b, flags: 0x0}, + 582: {region: 0xa5, script: 0x5b, flags: 0x0}, + 583: {region: 0x166, script: 0x5b, flags: 0x0}, + 584: {region: 0x166, script: 0x5b, flags: 0x0}, + 585: {region: 0x166, script: 0x5b, flags: 0x0}, + 586: {region: 0xa7, script: 0x4f, flags: 0x0}, + 587: {region: 0x2a, script: 0x5b, flags: 0x0}, + 588: {region: 0x166, script: 0x5b, flags: 0x0}, + 589: {region: 0x166, script: 0x5b, flags: 0x0}, + 590: {region: 0x166, script: 0x5b, flags: 0x0}, + 591: {region: 0x166, script: 0x5b, flags: 0x0}, + 592: {region: 0x166, script: 0x5b, flags: 0x0}, + 593: {region: 0x9a, script: 0x53, flags: 0x0}, + 594: {region: 0x8c, script: 0x5b, flags: 0x0}, + 595: {region: 0x166, script: 0x5b, flags: 0x0}, + 596: {region: 0xac, script: 0x54, flags: 0x0}, + 597: {region: 0x107, script: 0x20, flags: 0x0}, + 598: {region: 0x9a, script: 0x22, flags: 0x0}, + 599: {region: 0x166, script: 0x5b, flags: 0x0}, + 600: {region: 0x76, script: 0x5b, flags: 0x0}, + 601: {region: 0x166, script: 0x5b, flags: 0x0}, + 602: {region: 0xb5, script: 0x5b, flags: 0x0}, + 603: {region: 0x166, script: 0x5b, flags: 0x0}, + 604: {region: 0x166, script: 0x5b, flags: 0x0}, + 605: {region: 0x166, script: 0x5b, flags: 0x0}, + 606: {region: 0x166, script: 0x5b, flags: 0x0}, + 607: {region: 0x166, script: 0x5b, flags: 0x0}, + 608: {region: 0x166, script: 0x5b, flags: 0x0}, + 609: {region: 0x166, script: 0x5b, flags: 0x0}, + 610: {region: 0x166, script: 0x2c, flags: 0x0}, + 611: {region: 0x166, script: 0x5b, flags: 0x0}, + 612: {region: 0x107, script: 0x20, flags: 0x0}, + 613: {region: 0x113, script: 0x5b, flags: 0x0}, + 614: {region: 0xe8, script: 0x5b, flags: 0x0}, + 615: {region: 0x107, script: 0x5b, flags: 0x0}, + 616: {region: 0x166, script: 0x5b, flags: 0x0}, + 617: {region: 0x9a, script: 0x22, flags: 0x0}, + 618: {region: 0x9a, script: 0x5, flags: 0x0}, + 619: {region: 0x130, script: 0x5b, flags: 0x0}, + 620: {region: 0x166, script: 0x5b, flags: 0x0}, + 621: {region: 0x52, script: 0x5b, flags: 0x0}, + 622: {region: 0x61, script: 0x5b, flags: 0x0}, + 623: {region: 0x166, script: 0x5b, flags: 0x0}, + 624: {region: 0x166, script: 0x5b, flags: 0x0}, + 625: {region: 0x166, script: 0x2c, flags: 0x0}, + 626: {region: 0x166, script: 0x5b, flags: 0x0}, + 627: {region: 0x166, script: 0x5b, flags: 0x0}, 628: {region: 0x19, script: 0x3, flags: 0x1}, - 629: {region: 0x165, script: 0x5a, flags: 0x0}, - 630: {region: 0x165, script: 0x5a, flags: 0x0}, - 631: {region: 0x165, script: 0x5a, flags: 0x0}, - 632: {region: 0x165, script: 0x5a, flags: 0x0}, - 633: {region: 0x106, script: 0x20, flags: 0x0}, - 634: {region: 0x165, script: 0x5a, flags: 0x0}, - 635: {region: 0x165, script: 0x5a, flags: 0x0}, - 636: {region: 0x165, script: 0x5a, flags: 0x0}, - 637: {region: 0x106, script: 0x20, flags: 0x0}, - 638: {region: 0x165, script: 0x5a, flags: 0x0}, - 639: {region: 0x95, script: 0x5a, flags: 0x0}, - 640: {region: 0xe8, script: 0x5, flags: 0x0}, - 641: {region: 0x7b, script: 0x5a, flags: 0x0}, - 642: {region: 0x165, script: 0x5a, flags: 0x0}, - 643: {region: 0x165, script: 0x5a, flags: 0x0}, - 644: {region: 0x165, script: 0x5a, flags: 0x0}, - 645: {region: 0x165, script: 0x2c, flags: 0x0}, - 646: {region: 0x123, script: 0xeb, flags: 0x0}, - 647: {region: 0xe8, script: 0x5, flags: 0x0}, - 648: {region: 0x165, script: 0x5a, flags: 0x0}, - 649: {region: 0x165, script: 0x5a, flags: 0x0}, + 629: {region: 0x166, script: 0x5b, flags: 0x0}, + 630: {region: 0x166, script: 0x5b, flags: 0x0}, + 631: {region: 0x166, script: 0x5b, flags: 0x0}, + 632: {region: 0x166, script: 0x5b, flags: 0x0}, + 633: {region: 0x107, script: 0x20, flags: 0x0}, + 634: {region: 0x166, script: 0x5b, flags: 0x0}, + 635: {region: 0x166, script: 0x5b, flags: 0x0}, + 636: {region: 0x166, script: 0x5b, flags: 0x0}, + 637: {region: 0x107, script: 0x20, flags: 0x0}, + 638: {region: 0x166, script: 0x5b, flags: 0x0}, + 639: {region: 0x96, script: 0x5b, flags: 0x0}, + 640: {region: 0xe9, script: 0x5, flags: 0x0}, + 641: {region: 0x7c, script: 0x5b, flags: 0x0}, + 642: {region: 0x166, script: 0x5b, flags: 0x0}, + 643: {region: 0x166, script: 0x5b, flags: 0x0}, + 644: {region: 0x166, script: 0x5b, flags: 0x0}, + 645: {region: 0x166, script: 0x2c, flags: 0x0}, + 646: {region: 0x124, script: 0xee, flags: 0x0}, + 647: {region: 0xe9, script: 0x5, flags: 0x0}, + 648: {region: 0x166, script: 0x5b, flags: 0x0}, + 649: {region: 0x166, script: 0x5b, flags: 0x0}, 650: {region: 0x1c, script: 0x5, flags: 0x1}, - 651: {region: 0x165, script: 0x5a, flags: 0x0}, - 652: {region: 0x165, script: 0x5a, flags: 0x0}, - 653: {region: 0x165, script: 0x5a, flags: 0x0}, - 654: {region: 0x138, script: 0x5a, flags: 0x0}, - 655: {region: 0x87, script: 0x5e, flags: 0x0}, - 656: {region: 0x97, script: 0x3e, flags: 0x0}, - 657: {region: 0x12f, script: 0x5a, flags: 0x0}, - 658: {region: 0xe8, script: 0x5, flags: 0x0}, - 659: {region: 0x131, script: 0x5a, flags: 0x0}, - 660: {region: 0x165, script: 0x5a, flags: 0x0}, - 661: {region: 0xb7, script: 0x5a, flags: 0x0}, - 662: {region: 0x106, script: 0x20, flags: 0x0}, - 663: {region: 0x165, script: 0x5a, flags: 0x0}, - 664: {region: 0x95, script: 0x5a, flags: 0x0}, - 665: {region: 0x165, script: 0x5a, flags: 0x0}, - 666: {region: 0x53, script: 0xeb, flags: 0x0}, - 667: {region: 0x165, script: 0x5a, flags: 0x0}, - 668: {region: 0x165, script: 0x5a, flags: 0x0}, - 669: {region: 0x165, script: 0x5a, flags: 0x0}, - 670: {region: 0x165, script: 0x5a, flags: 0x0}, - 671: {region: 0x99, script: 0x5c, flags: 0x0}, - 672: {region: 0x165, script: 0x5a, flags: 0x0}, - 673: {region: 0x165, script: 0x5a, flags: 0x0}, - 674: {region: 0x106, script: 0x20, flags: 0x0}, - 675: {region: 0x131, script: 0x5a, flags: 0x0}, - 676: {region: 0x165, script: 0x5a, flags: 0x0}, - 677: {region: 0xd9, script: 0x5a, flags: 0x0}, - 678: {region: 0x165, script: 0x5a, flags: 0x0}, - 679: {region: 0x165, script: 0x5a, flags: 0x0}, + 651: {region: 0x166, script: 0x5b, flags: 0x0}, + 652: {region: 0x166, script: 0x5b, flags: 0x0}, + 653: {region: 0x166, script: 0x5b, flags: 0x0}, + 654: {region: 0x139, script: 0x5b, flags: 0x0}, + 655: {region: 0x88, script: 0x5f, flags: 0x0}, + 656: {region: 0x98, script: 0x3e, flags: 0x0}, + 657: {region: 0x130, script: 0x5b, flags: 0x0}, + 658: {region: 0xe9, script: 0x5, flags: 0x0}, + 659: {region: 0x132, script: 0x5b, flags: 0x0}, + 660: {region: 0x166, script: 0x5b, flags: 0x0}, + 661: {region: 0xb8, script: 0x5b, flags: 0x0}, + 662: {region: 0x107, script: 0x20, flags: 0x0}, + 663: {region: 0x166, script: 0x5b, flags: 0x0}, + 664: {region: 0x96, script: 0x5b, flags: 0x0}, + 665: {region: 0x166, script: 0x5b, flags: 0x0}, + 666: {region: 0x53, script: 0xee, flags: 0x0}, + 667: {region: 0x166, script: 0x5b, flags: 0x0}, + 668: {region: 0x166, script: 0x5b, flags: 0x0}, + 669: {region: 0x166, script: 0x5b, flags: 0x0}, + 670: {region: 0x166, script: 0x5b, flags: 0x0}, + 671: {region: 0x9a, script: 0x5d, flags: 0x0}, + 672: {region: 0x166, script: 0x5b, flags: 0x0}, + 673: {region: 0x166, script: 0x5b, flags: 0x0}, + 674: {region: 0x107, script: 0x20, flags: 0x0}, + 675: {region: 0x132, script: 0x5b, flags: 0x0}, + 676: {region: 0x166, script: 0x5b, flags: 0x0}, + 677: {region: 0xda, script: 0x5b, flags: 0x0}, + 678: {region: 0x166, script: 0x5b, flags: 0x0}, + 679: {region: 0x166, script: 0x5b, flags: 0x0}, 680: {region: 0x21, script: 0x2, flags: 0x1}, - 681: {region: 0x165, script: 0x5a, flags: 0x0}, - 682: {region: 0x165, script: 0x5a, flags: 0x0}, - 683: {region: 0x9e, script: 0x5a, flags: 0x0}, - 684: {region: 0x53, script: 0x60, flags: 0x0}, - 685: {region: 0x95, script: 0x5a, flags: 0x0}, - 686: {region: 0x9c, script: 0x5, flags: 0x0}, - 687: {region: 0x135, script: 0x5a, flags: 0x0}, - 688: {region: 0x165, script: 0x5a, flags: 0x0}, - 689: {region: 0x165, script: 0x5a, flags: 0x0}, - 690: {region: 0x99, script: 0xe6, flags: 0x0}, - 691: {region: 0x9e, script: 0x5a, flags: 0x0}, - 692: {region: 0x165, script: 0x5a, flags: 0x0}, - 693: {region: 0x4b, script: 0x5a, flags: 0x0}, - 694: {region: 0x165, script: 0x5a, flags: 0x0}, - 695: {region: 0x165, script: 0x5a, flags: 0x0}, - 696: {region: 0xaf, script: 0x57, flags: 0x0}, - 697: {region: 0x165, script: 0x5a, flags: 0x0}, - 698: {region: 0x165, script: 0x5a, flags: 0x0}, - 699: {region: 0x4b, script: 0x5a, flags: 0x0}, - 700: {region: 0x165, script: 0x5a, flags: 0x0}, - 701: {region: 0x165, script: 0x5a, flags: 0x0}, - 702: {region: 0x162, script: 0x5a, flags: 0x0}, - 703: {region: 0x9c, script: 0x5, flags: 0x0}, - 704: {region: 0xb6, script: 0x5a, flags: 0x0}, - 705: {region: 0xb8, script: 0x5a, flags: 0x0}, - 706: {region: 0x4b, script: 0x5a, flags: 0x0}, - 707: {region: 0x4b, script: 0x5a, flags: 0x0}, - 708: {region: 0xa4, script: 0x5a, flags: 0x0}, - 709: {region: 0xa4, script: 0x5a, flags: 0x0}, - 710: {region: 0x9c, script: 0x5, flags: 0x0}, - 711: {region: 0xb8, script: 0x5a, flags: 0x0}, - 712: {region: 0x123, script: 0xeb, flags: 0x0}, + 681: {region: 0x166, script: 0x5b, flags: 0x0}, + 682: {region: 0x166, script: 0x5b, flags: 0x0}, + 683: {region: 0x9f, script: 0x5b, flags: 0x0}, + 684: {region: 0x53, script: 0x61, flags: 0x0}, + 685: {region: 0x96, script: 0x5b, flags: 0x0}, + 686: {region: 0x9d, script: 0x5, flags: 0x0}, + 687: {region: 0x136, script: 0x5b, flags: 0x0}, + 688: {region: 0x166, script: 0x5b, flags: 0x0}, + 689: {region: 0x166, script: 0x5b, flags: 0x0}, + 690: {region: 0x9a, script: 0xe9, flags: 0x0}, + 691: {region: 0x9f, script: 0x5b, flags: 0x0}, + 692: {region: 0x166, script: 0x5b, flags: 0x0}, + 693: {region: 0x4b, script: 0x5b, flags: 0x0}, + 694: {region: 0x166, script: 0x5b, flags: 0x0}, + 695: {region: 0x166, script: 0x5b, flags: 0x0}, + 696: {region: 0xb0, script: 0x58, flags: 0x0}, + 697: {region: 0x166, script: 0x5b, flags: 0x0}, + 698: {region: 0x166, script: 0x5b, flags: 0x0}, + 699: {region: 0x4b, script: 0x5b, flags: 0x0}, + 700: {region: 0x166, script: 0x5b, flags: 0x0}, + 701: {region: 0x166, script: 0x5b, flags: 0x0}, + 702: {region: 0x163, script: 0x5b, flags: 0x0}, + 703: {region: 0x9d, script: 0x5, flags: 0x0}, + 704: {region: 0xb7, script: 0x5b, flags: 0x0}, + 705: {region: 0xb9, script: 0x5b, flags: 0x0}, + 706: {region: 0x4b, script: 0x5b, flags: 0x0}, + 707: {region: 0x4b, script: 0x5b, flags: 0x0}, + 708: {region: 0xa5, script: 0x5b, flags: 0x0}, + 709: {region: 0xa5, script: 0x5b, flags: 0x0}, + 710: {region: 0x9d, script: 0x5, flags: 0x0}, + 711: {region: 0xb9, script: 0x5b, flags: 0x0}, + 712: {region: 0x124, script: 0xee, flags: 0x0}, 713: {region: 0x53, script: 0x3b, flags: 0x0}, - 714: {region: 0x12b, script: 0x5a, flags: 0x0}, - 715: {region: 0x95, script: 0x5a, flags: 0x0}, - 716: {region: 0x52, script: 0x5a, flags: 0x0}, - 717: {region: 0x99, script: 0x22, flags: 0x0}, - 718: {region: 0x99, script: 0x22, flags: 0x0}, - 719: {region: 0x95, script: 0x5a, flags: 0x0}, + 714: {region: 0x12c, script: 0x5b, flags: 0x0}, + 715: {region: 0x96, script: 0x5b, flags: 0x0}, + 716: {region: 0x52, script: 0x5b, flags: 0x0}, + 717: {region: 0x9a, script: 0x22, flags: 0x0}, + 718: {region: 0x9a, script: 0x22, flags: 0x0}, + 719: {region: 0x96, script: 0x5b, flags: 0x0}, 720: {region: 0x23, script: 0x3, flags: 0x1}, - 721: {region: 0xa4, script: 0x5a, flags: 0x0}, - 722: {region: 0x165, script: 0x5a, flags: 0x0}, - 723: {region: 0xcf, script: 0x5a, flags: 0x0}, - 724: {region: 0x165, script: 0x5a, flags: 0x0}, - 725: {region: 0x165, script: 0x5a, flags: 0x0}, - 726: {region: 0x165, script: 0x5a, flags: 0x0}, - 727: {region: 0x165, script: 0x5a, flags: 0x0}, - 728: {region: 0x165, script: 0x5a, flags: 0x0}, - 729: {region: 0x165, script: 0x5a, flags: 0x0}, - 730: {region: 0x165, script: 0x5a, flags: 0x0}, - 731: {region: 0x165, script: 0x5a, flags: 0x0}, - 732: {region: 0x165, script: 0x5a, flags: 0x0}, - 733: {region: 0x165, script: 0x5a, flags: 0x0}, - 734: {region: 0x165, script: 0x5a, flags: 0x0}, - 735: {region: 0x165, script: 0x5, flags: 0x0}, - 736: {region: 0x106, script: 0x20, flags: 0x0}, - 737: {region: 0xe7, script: 0x5a, flags: 0x0}, - 738: {region: 0x165, script: 0x5a, flags: 0x0}, - 739: {region: 0x95, script: 0x5a, flags: 0x0}, - 740: {region: 0x165, script: 0x2c, flags: 0x0}, - 741: {region: 0x165, script: 0x5a, flags: 0x0}, - 742: {region: 0x165, script: 0x5a, flags: 0x0}, - 743: {region: 0x165, script: 0x5a, flags: 0x0}, - 744: {region: 0x112, script: 0x5a, flags: 0x0}, - 745: {region: 0xa4, script: 0x5a, flags: 0x0}, - 746: {region: 0x165, script: 0x5a, flags: 0x0}, - 747: {region: 0x165, script: 0x5a, flags: 0x0}, - 748: {region: 0x123, script: 0x5, flags: 0x0}, - 749: {region: 0xcc, script: 0x5a, flags: 0x0}, - 750: {region: 0x165, script: 0x5a, flags: 0x0}, - 751: {region: 0x165, script: 0x5a, flags: 0x0}, - 752: {region: 0x165, script: 0x5a, flags: 0x0}, - 753: {region: 0xbf, script: 0x5a, flags: 0x0}, - 754: {region: 0xd1, script: 0x5a, flags: 0x0}, - 755: {region: 0x165, script: 0x5a, flags: 0x0}, - 756: {region: 0x52, script: 0x5a, flags: 0x0}, - 757: {region: 0xdb, script: 0x22, flags: 0x0}, - 758: {region: 0x12f, script: 0x5a, flags: 0x0}, - 759: {region: 0xc0, script: 0x5a, flags: 0x0}, - 760: {region: 0x165, script: 0x5a, flags: 0x0}, - 761: {region: 0x165, script: 0x5a, flags: 0x0}, - 762: {region: 0xe0, script: 0x5a, flags: 0x0}, - 763: {region: 0x165, script: 0x5a, flags: 0x0}, - 764: {region: 0x95, script: 0x5a, flags: 0x0}, - 765: {region: 0x9b, script: 0x3d, flags: 0x0}, - 766: {region: 0x165, script: 0x5a, flags: 0x0}, - 767: {region: 0xc2, script: 0x20, flags: 0x0}, - 768: {region: 0x165, script: 0x5, flags: 0x0}, - 769: {region: 0x165, script: 0x5a, flags: 0x0}, - 770: {region: 0x165, script: 0x5a, flags: 0x0}, - 771: {region: 0x165, script: 0x5a, flags: 0x0}, - 772: {region: 0x99, script: 0x6e, flags: 0x0}, - 773: {region: 0x165, script: 0x5a, flags: 0x0}, - 774: {region: 0x165, script: 0x5a, flags: 0x0}, - 775: {region: 0x10b, script: 0x5a, flags: 0x0}, - 776: {region: 0x165, script: 0x5a, flags: 0x0}, - 777: {region: 0x165, script: 0x5a, flags: 0x0}, - 778: {region: 0x165, script: 0x5a, flags: 0x0}, + 721: {region: 0xa5, script: 0x5b, flags: 0x0}, + 722: {region: 0x166, script: 0x5b, flags: 0x0}, + 723: {region: 0xd0, script: 0x5b, flags: 0x0}, + 724: {region: 0x166, script: 0x5b, flags: 0x0}, + 725: {region: 0x166, script: 0x5b, flags: 0x0}, + 726: {region: 0x166, script: 0x5b, flags: 0x0}, + 727: {region: 0x166, script: 0x5b, flags: 0x0}, + 728: {region: 0x166, script: 0x5b, flags: 0x0}, + 729: {region: 0x166, script: 0x5b, flags: 0x0}, + 730: {region: 0x166, script: 0x5b, flags: 0x0}, + 731: {region: 0x166, script: 0x5b, flags: 0x0}, + 732: {region: 0x166, script: 0x5b, flags: 0x0}, + 733: {region: 0x166, script: 0x5b, flags: 0x0}, + 734: {region: 0x166, script: 0x5b, flags: 0x0}, + 735: {region: 0x166, script: 0x5, flags: 0x0}, + 736: {region: 0x107, script: 0x20, flags: 0x0}, + 737: {region: 0xe8, script: 0x5b, flags: 0x0}, + 738: {region: 0x166, script: 0x5b, flags: 0x0}, + 739: {region: 0x96, script: 0x5b, flags: 0x0}, + 740: {region: 0x166, script: 0x2c, flags: 0x0}, + 741: {region: 0x166, script: 0x5b, flags: 0x0}, + 742: {region: 0x166, script: 0x5b, flags: 0x0}, + 743: {region: 0x166, script: 0x5b, flags: 0x0}, + 744: {region: 0x113, script: 0x5b, flags: 0x0}, + 745: {region: 0xa5, script: 0x5b, flags: 0x0}, + 746: {region: 0x166, script: 0x5b, flags: 0x0}, + 747: {region: 0x166, script: 0x5b, flags: 0x0}, + 748: {region: 0x124, script: 0x5, flags: 0x0}, + 749: {region: 0xcd, script: 0x5b, flags: 0x0}, + 750: {region: 0x166, script: 0x5b, flags: 0x0}, + 751: {region: 0x166, script: 0x5b, flags: 0x0}, + 752: {region: 0x166, script: 0x5b, flags: 0x0}, + 753: {region: 0xc0, script: 0x5b, flags: 0x0}, + 754: {region: 0xd2, script: 0x5b, flags: 0x0}, + 755: {region: 0x166, script: 0x5b, flags: 0x0}, + 756: {region: 0x52, script: 0x5b, flags: 0x0}, + 757: {region: 0xdc, script: 0x22, flags: 0x0}, + 758: {region: 0x130, script: 0x5b, flags: 0x0}, + 759: {region: 0xc1, script: 0x5b, flags: 0x0}, + 760: {region: 0x166, script: 0x5b, flags: 0x0}, + 761: {region: 0x166, script: 0x5b, flags: 0x0}, + 762: {region: 0xe1, script: 0x5b, flags: 0x0}, + 763: {region: 0x166, script: 0x5b, flags: 0x0}, + 764: {region: 0x96, script: 0x5b, flags: 0x0}, + 765: {region: 0x9c, script: 0x3d, flags: 0x0}, + 766: {region: 0x166, script: 0x5b, flags: 0x0}, + 767: {region: 0xc3, script: 0x20, flags: 0x0}, + 768: {region: 0x166, script: 0x5, flags: 0x0}, + 769: {region: 0x166, script: 0x5b, flags: 0x0}, + 770: {region: 0x166, script: 0x5b, flags: 0x0}, + 771: {region: 0x166, script: 0x5b, flags: 0x0}, + 772: {region: 0x9a, script: 0x6f, flags: 0x0}, + 773: {region: 0x166, script: 0x5b, flags: 0x0}, + 774: {region: 0x166, script: 0x5b, flags: 0x0}, + 775: {region: 0x10c, script: 0x5b, flags: 0x0}, + 776: {region: 0x166, script: 0x5b, flags: 0x0}, + 777: {region: 0x166, script: 0x5b, flags: 0x0}, + 778: {region: 0x166, script: 0x5b, flags: 0x0}, 779: {region: 0x26, script: 0x3, flags: 0x1}, - 780: {region: 0x165, script: 0x5a, flags: 0x0}, - 781: {region: 0x165, script: 0x5a, flags: 0x0}, - 782: {region: 0x99, script: 0xe, flags: 0x0}, - 783: {region: 0xc4, script: 0x75, flags: 0x0}, - 785: {region: 0x165, script: 0x5a, flags: 0x0}, - 786: {region: 0x49, script: 0x5a, flags: 0x0}, - 787: {region: 0x49, script: 0x5a, flags: 0x0}, - 788: {region: 0x37, script: 0x5a, flags: 0x0}, - 789: {region: 0x165, script: 0x5a, flags: 0x0}, - 790: {region: 0x165, script: 0x5a, flags: 0x0}, - 791: {region: 0x165, script: 0x5a, flags: 0x0}, - 792: {region: 0x165, script: 0x5a, flags: 0x0}, - 793: {region: 0x165, script: 0x5a, flags: 0x0}, - 794: {region: 0x165, script: 0x5a, flags: 0x0}, - 795: {region: 0x99, script: 0x22, flags: 0x0}, - 796: {region: 0xdb, script: 0x22, flags: 0x0}, - 797: {region: 0x106, script: 0x20, flags: 0x0}, - 798: {region: 0x35, script: 0x72, flags: 0x0}, + 780: {region: 0x166, script: 0x5b, flags: 0x0}, + 781: {region: 0x166, script: 0x5b, flags: 0x0}, + 782: {region: 0x9a, script: 0xe, flags: 0x0}, + 783: {region: 0xc5, script: 0x76, flags: 0x0}, + 785: {region: 0x166, script: 0x5b, flags: 0x0}, + 786: {region: 0x49, script: 0x5b, flags: 0x0}, + 787: {region: 0x49, script: 0x5b, flags: 0x0}, + 788: {region: 0x37, script: 0x5b, flags: 0x0}, + 789: {region: 0x166, script: 0x5b, flags: 0x0}, + 790: {region: 0x166, script: 0x5b, flags: 0x0}, + 791: {region: 0x166, script: 0x5b, flags: 0x0}, + 792: {region: 0x166, script: 0x5b, flags: 0x0}, + 793: {region: 0x166, script: 0x5b, flags: 0x0}, + 794: {region: 0x166, script: 0x5b, flags: 0x0}, + 795: {region: 0x9a, script: 0x22, flags: 0x0}, + 796: {region: 0xdc, script: 0x22, flags: 0x0}, + 797: {region: 0x107, script: 0x20, flags: 0x0}, + 798: {region: 0x35, script: 0x73, flags: 0x0}, 799: {region: 0x29, script: 0x3, flags: 0x1}, - 800: {region: 0xcb, script: 0x5a, flags: 0x0}, - 801: {region: 0x165, script: 0x5a, flags: 0x0}, - 802: {region: 0x165, script: 0x5a, flags: 0x0}, - 803: {region: 0x165, script: 0x5a, flags: 0x0}, - 804: {region: 0x99, script: 0x22, flags: 0x0}, - 805: {region: 0x52, script: 0x5a, flags: 0x0}, - 807: {region: 0x165, script: 0x5a, flags: 0x0}, - 808: {region: 0x135, script: 0x5a, flags: 0x0}, - 809: {region: 0x165, script: 0x5a, flags: 0x0}, - 810: {region: 0x165, script: 0x5a, flags: 0x0}, - 811: {region: 0xe8, script: 0x5, flags: 0x0}, - 812: {region: 0xc3, script: 0x5a, flags: 0x0}, - 813: {region: 0x99, script: 0x22, flags: 0x0}, - 814: {region: 0x95, script: 0x5a, flags: 0x0}, - 815: {region: 0x164, script: 0x5a, flags: 0x0}, - 816: {region: 0x165, script: 0x5a, flags: 0x0}, - 817: {region: 0xc4, script: 0x75, flags: 0x0}, - 818: {region: 0x165, script: 0x5a, flags: 0x0}, - 819: {region: 0x165, script: 0x2c, flags: 0x0}, - 820: {region: 0x106, script: 0x20, flags: 0x0}, - 821: {region: 0x165, script: 0x5a, flags: 0x0}, - 822: {region: 0x131, script: 0x5a, flags: 0x0}, - 823: {region: 0x9c, script: 0x66, flags: 0x0}, - 824: {region: 0x165, script: 0x5a, flags: 0x0}, - 825: {region: 0x165, script: 0x5a, flags: 0x0}, - 826: {region: 0x9c, script: 0x5, flags: 0x0}, - 827: {region: 0x165, script: 0x5a, flags: 0x0}, - 828: {region: 0x165, script: 0x5a, flags: 0x0}, - 829: {region: 0x165, script: 0x5a, flags: 0x0}, - 830: {region: 0xdd, script: 0x5a, flags: 0x0}, - 831: {region: 0x165, script: 0x5a, flags: 0x0}, - 832: {region: 0x165, script: 0x5a, flags: 0x0}, - 834: {region: 0x165, script: 0x5a, flags: 0x0}, + 800: {region: 0xcc, script: 0x5b, flags: 0x0}, + 801: {region: 0x166, script: 0x5b, flags: 0x0}, + 802: {region: 0x166, script: 0x5b, flags: 0x0}, + 803: {region: 0x166, script: 0x5b, flags: 0x0}, + 804: {region: 0x9a, script: 0x22, flags: 0x0}, + 805: {region: 0x52, script: 0x5b, flags: 0x0}, + 807: {region: 0x166, script: 0x5b, flags: 0x0}, + 808: {region: 0x136, script: 0x5b, flags: 0x0}, + 809: {region: 0x166, script: 0x5b, flags: 0x0}, + 810: {region: 0x166, script: 0x5b, flags: 0x0}, + 811: {region: 0xe9, script: 0x5, flags: 0x0}, + 812: {region: 0xc4, script: 0x5b, flags: 0x0}, + 813: {region: 0x9a, script: 0x22, flags: 0x0}, + 814: {region: 0x96, script: 0x5b, flags: 0x0}, + 815: {region: 0x165, script: 0x5b, flags: 0x0}, + 816: {region: 0x166, script: 0x5b, flags: 0x0}, + 817: {region: 0xc5, script: 0x76, flags: 0x0}, + 818: {region: 0x166, script: 0x5b, flags: 0x0}, + 819: {region: 0x166, script: 0x2c, flags: 0x0}, + 820: {region: 0x107, script: 0x20, flags: 0x0}, + 821: {region: 0x166, script: 0x5b, flags: 0x0}, + 822: {region: 0x132, script: 0x5b, flags: 0x0}, + 823: {region: 0x9d, script: 0x67, flags: 0x0}, + 824: {region: 0x166, script: 0x5b, flags: 0x0}, + 825: {region: 0x166, script: 0x5b, flags: 0x0}, + 826: {region: 0x9d, script: 0x5, flags: 0x0}, + 827: {region: 0x166, script: 0x5b, flags: 0x0}, + 828: {region: 0x166, script: 0x5b, flags: 0x0}, + 829: {region: 0x166, script: 0x5b, flags: 0x0}, + 830: {region: 0xde, script: 0x5b, flags: 0x0}, + 831: {region: 0x166, script: 0x5b, flags: 0x0}, + 832: {region: 0x166, script: 0x5b, flags: 0x0}, + 834: {region: 0x166, script: 0x5b, flags: 0x0}, 835: {region: 0x53, script: 0x3b, flags: 0x0}, - 836: {region: 0x9e, script: 0x5a, flags: 0x0}, - 837: {region: 0xd2, script: 0x5a, flags: 0x0}, - 838: {region: 0x165, script: 0x5a, flags: 0x0}, - 839: {region: 0xda, script: 0x5a, flags: 0x0}, - 840: {region: 0x165, script: 0x5a, flags: 0x0}, - 841: {region: 0x165, script: 0x5a, flags: 0x0}, - 842: {region: 0x165, script: 0x5a, flags: 0x0}, - 843: {region: 0xcf, script: 0x5a, flags: 0x0}, - 844: {region: 0x165, script: 0x5a, flags: 0x0}, - 845: {region: 0x165, script: 0x5a, flags: 0x0}, - 846: {region: 0x164, script: 0x5a, flags: 0x0}, - 847: {region: 0xd1, script: 0x5a, flags: 0x0}, - 848: {region: 0x60, script: 0x5a, flags: 0x0}, - 849: {region: 0xdb, script: 0x22, flags: 0x0}, - 850: {region: 0x165, script: 0x5a, flags: 0x0}, - 851: {region: 0xdb, script: 0x22, flags: 0x0}, - 852: {region: 0x165, script: 0x5a, flags: 0x0}, - 853: {region: 0x165, script: 0x5a, flags: 0x0}, - 854: {region: 0xd2, script: 0x5a, flags: 0x0}, - 855: {region: 0x165, script: 0x5a, flags: 0x0}, - 856: {region: 0x165, script: 0x5a, flags: 0x0}, - 857: {region: 0xd1, script: 0x5a, flags: 0x0}, - 858: {region: 0x165, script: 0x5a, flags: 0x0}, - 859: {region: 0xcf, script: 0x5a, flags: 0x0}, - 860: {region: 0xcf, script: 0x5a, flags: 0x0}, - 861: {region: 0x165, script: 0x5a, flags: 0x0}, - 862: {region: 0x165, script: 0x5a, flags: 0x0}, - 863: {region: 0x95, script: 0x5a, flags: 0x0}, - 864: {region: 0x165, script: 0x5a, flags: 0x0}, - 865: {region: 0xdf, script: 0x5a, flags: 0x0}, - 866: {region: 0x165, script: 0x5a, flags: 0x0}, - 867: {region: 0x165, script: 0x5a, flags: 0x0}, - 868: {region: 0x99, script: 0x5a, flags: 0x0}, - 869: {region: 0x165, script: 0x5a, flags: 0x0}, - 870: {region: 0x165, script: 0x5a, flags: 0x0}, - 871: {region: 0xd9, script: 0x5a, flags: 0x0}, - 872: {region: 0x52, script: 0x5a, flags: 0x0}, - 873: {region: 0x165, script: 0x5a, flags: 0x0}, - 874: {region: 0xda, script: 0x5a, flags: 0x0}, - 875: {region: 0x165, script: 0x5a, flags: 0x0}, - 876: {region: 0x52, script: 0x5a, flags: 0x0}, - 877: {region: 0x165, script: 0x5a, flags: 0x0}, - 878: {region: 0x165, script: 0x5a, flags: 0x0}, - 879: {region: 0xda, script: 0x5a, flags: 0x0}, - 880: {region: 0x123, script: 0x56, flags: 0x0}, - 881: {region: 0x99, script: 0x22, flags: 0x0}, - 882: {region: 0x10c, script: 0xc9, flags: 0x0}, - 883: {region: 0x165, script: 0x5a, flags: 0x0}, - 884: {region: 0x165, script: 0x5a, flags: 0x0}, - 885: {region: 0x84, script: 0x7c, flags: 0x0}, - 886: {region: 0x161, script: 0x5a, flags: 0x0}, - 887: {region: 0x165, script: 0x5a, flags: 0x0}, + 836: {region: 0x9f, script: 0x5b, flags: 0x0}, + 837: {region: 0xd3, script: 0x5b, flags: 0x0}, + 838: {region: 0x166, script: 0x5b, flags: 0x0}, + 839: {region: 0xdb, script: 0x5b, flags: 0x0}, + 840: {region: 0x166, script: 0x5b, flags: 0x0}, + 841: {region: 0x166, script: 0x5b, flags: 0x0}, + 842: {region: 0x166, script: 0x5b, flags: 0x0}, + 843: {region: 0xd0, script: 0x5b, flags: 0x0}, + 844: {region: 0x166, script: 0x5b, flags: 0x0}, + 845: {region: 0x166, script: 0x5b, flags: 0x0}, + 846: {region: 0x165, script: 0x5b, flags: 0x0}, + 847: {region: 0xd2, script: 0x5b, flags: 0x0}, + 848: {region: 0x61, script: 0x5b, flags: 0x0}, + 849: {region: 0xdc, script: 0x22, flags: 0x0}, + 850: {region: 0x166, script: 0x5b, flags: 0x0}, + 851: {region: 0xdc, script: 0x22, flags: 0x0}, + 852: {region: 0x166, script: 0x5b, flags: 0x0}, + 853: {region: 0x166, script: 0x5b, flags: 0x0}, + 854: {region: 0xd3, script: 0x5b, flags: 0x0}, + 855: {region: 0x166, script: 0x5b, flags: 0x0}, + 856: {region: 0x166, script: 0x5b, flags: 0x0}, + 857: {region: 0xd2, script: 0x5b, flags: 0x0}, + 858: {region: 0x166, script: 0x5b, flags: 0x0}, + 859: {region: 0xd0, script: 0x5b, flags: 0x0}, + 860: {region: 0xd0, script: 0x5b, flags: 0x0}, + 861: {region: 0x166, script: 0x5b, flags: 0x0}, + 862: {region: 0x166, script: 0x5b, flags: 0x0}, + 863: {region: 0x96, script: 0x5b, flags: 0x0}, + 864: {region: 0x166, script: 0x5b, flags: 0x0}, + 865: {region: 0xe0, script: 0x5b, flags: 0x0}, + 866: {region: 0x166, script: 0x5b, flags: 0x0}, + 867: {region: 0x166, script: 0x5b, flags: 0x0}, + 868: {region: 0x9a, script: 0x5b, flags: 0x0}, + 869: {region: 0x166, script: 0x5b, flags: 0x0}, + 870: {region: 0x166, script: 0x5b, flags: 0x0}, + 871: {region: 0xda, script: 0x5b, flags: 0x0}, + 872: {region: 0x52, script: 0x5b, flags: 0x0}, + 873: {region: 0x166, script: 0x5b, flags: 0x0}, + 874: {region: 0xdb, script: 0x5b, flags: 0x0}, + 875: {region: 0x166, script: 0x5b, flags: 0x0}, + 876: {region: 0x52, script: 0x5b, flags: 0x0}, + 877: {region: 0x166, script: 0x5b, flags: 0x0}, + 878: {region: 0x166, script: 0x5b, flags: 0x0}, + 879: {region: 0xdb, script: 0x5b, flags: 0x0}, + 880: {region: 0x124, script: 0x57, flags: 0x0}, + 881: {region: 0x9a, script: 0x22, flags: 0x0}, + 882: {region: 0x10d, script: 0xcb, flags: 0x0}, + 883: {region: 0x166, script: 0x5b, flags: 0x0}, + 884: {region: 0x166, script: 0x5b, flags: 0x0}, + 885: {region: 0x85, script: 0x7e, flags: 0x0}, + 886: {region: 0x162, script: 0x5b, flags: 0x0}, + 887: {region: 0x166, script: 0x5b, flags: 0x0}, 888: {region: 0x49, script: 0x17, flags: 0x0}, - 889: {region: 0x165, script: 0x5a, flags: 0x0}, - 890: {region: 0x161, script: 0x5a, flags: 0x0}, - 891: {region: 0x165, script: 0x5a, flags: 0x0}, - 892: {region: 0x165, script: 0x5a, flags: 0x0}, - 893: {region: 0x165, script: 0x5a, flags: 0x0}, - 894: {region: 0x165, script: 0x5a, flags: 0x0}, - 895: {region: 0x165, script: 0x5a, flags: 0x0}, - 896: {region: 0x117, script: 0x5a, flags: 0x0}, - 897: {region: 0x165, script: 0x5a, flags: 0x0}, - 898: {region: 0x165, script: 0x5a, flags: 0x0}, - 899: {region: 0x135, script: 0x5a, flags: 0x0}, - 900: {region: 0x165, script: 0x5a, flags: 0x0}, - 901: {region: 0x53, script: 0x5a, flags: 0x0}, - 902: {region: 0x165, script: 0x5a, flags: 0x0}, - 903: {region: 0xce, script: 0x5a, flags: 0x0}, - 904: {region: 0x12f, script: 0x5a, flags: 0x0}, - 905: {region: 0x131, script: 0x5a, flags: 0x0}, - 906: {region: 0x80, script: 0x5a, flags: 0x0}, - 907: {region: 0x78, script: 0x5a, flags: 0x0}, - 908: {region: 0x165, script: 0x5a, flags: 0x0}, - 910: {region: 0x165, script: 0x5a, flags: 0x0}, - 911: {region: 0x165, script: 0x5a, flags: 0x0}, - 912: {region: 0x6f, script: 0x5a, flags: 0x0}, - 913: {region: 0x165, script: 0x5a, flags: 0x0}, - 914: {region: 0x165, script: 0x5a, flags: 0x0}, - 915: {region: 0x165, script: 0x5a, flags: 0x0}, - 916: {region: 0x165, script: 0x5a, flags: 0x0}, - 917: {region: 0x99, script: 0x81, flags: 0x0}, - 918: {region: 0x165, script: 0x5a, flags: 0x0}, - 919: {region: 0x165, script: 0x5, flags: 0x0}, - 920: {region: 0x7d, script: 0x20, flags: 0x0}, - 921: {region: 0x135, script: 0x82, flags: 0x0}, - 922: {region: 0x165, script: 0x5, flags: 0x0}, - 923: {region: 0xc5, script: 0x80, flags: 0x0}, - 924: {region: 0x165, script: 0x5a, flags: 0x0}, + 889: {region: 0x166, script: 0x5b, flags: 0x0}, + 890: {region: 0x162, script: 0x5b, flags: 0x0}, + 891: {region: 0x166, script: 0x5b, flags: 0x0}, + 892: {region: 0x166, script: 0x5b, flags: 0x0}, + 893: {region: 0x166, script: 0x5b, flags: 0x0}, + 894: {region: 0x166, script: 0x5b, flags: 0x0}, + 895: {region: 0x166, script: 0x5b, flags: 0x0}, + 896: {region: 0x118, script: 0x5b, flags: 0x0}, + 897: {region: 0x166, script: 0x5b, flags: 0x0}, + 898: {region: 0x166, script: 0x5b, flags: 0x0}, + 899: {region: 0x136, script: 0x5b, flags: 0x0}, + 900: {region: 0x166, script: 0x5b, flags: 0x0}, + 901: {region: 0x53, script: 0x5b, flags: 0x0}, + 902: {region: 0x166, script: 0x5b, flags: 0x0}, + 903: {region: 0xcf, script: 0x5b, flags: 0x0}, + 904: {region: 0x130, script: 0x5b, flags: 0x0}, + 905: {region: 0x132, script: 0x5b, flags: 0x0}, + 906: {region: 0x81, script: 0x5b, flags: 0x0}, + 907: {region: 0x79, script: 0x5b, flags: 0x0}, + 908: {region: 0x166, script: 0x5b, flags: 0x0}, + 910: {region: 0x166, script: 0x5b, flags: 0x0}, + 911: {region: 0x166, script: 0x5b, flags: 0x0}, + 912: {region: 0x70, script: 0x5b, flags: 0x0}, + 913: {region: 0x166, script: 0x5b, flags: 0x0}, + 914: {region: 0x166, script: 0x5b, flags: 0x0}, + 915: {region: 0x166, script: 0x5b, flags: 0x0}, + 916: {region: 0x166, script: 0x5b, flags: 0x0}, + 917: {region: 0x9a, script: 0x83, flags: 0x0}, + 918: {region: 0x166, script: 0x5b, flags: 0x0}, + 919: {region: 0x166, script: 0x5, flags: 0x0}, + 920: {region: 0x7e, script: 0x20, flags: 0x0}, + 921: {region: 0x136, script: 0x84, flags: 0x0}, + 922: {region: 0x166, script: 0x5, flags: 0x0}, + 923: {region: 0xc6, script: 0x82, flags: 0x0}, + 924: {region: 0x166, script: 0x5b, flags: 0x0}, 925: {region: 0x2c, script: 0x3, flags: 0x1}, - 926: {region: 0xe7, script: 0x5a, flags: 0x0}, + 926: {region: 0xe8, script: 0x5b, flags: 0x0}, 927: {region: 0x2f, script: 0x2, flags: 0x1}, - 928: {region: 0xe7, script: 0x5a, flags: 0x0}, - 929: {region: 0x30, script: 0x5a, flags: 0x0}, - 930: {region: 0xf0, script: 0x5a, flags: 0x0}, - 931: {region: 0x165, script: 0x5a, flags: 0x0}, - 932: {region: 0x78, script: 0x5a, flags: 0x0}, - 933: {region: 0xd6, script: 0x5a, flags: 0x0}, - 934: {region: 0x135, script: 0x5a, flags: 0x0}, - 935: {region: 0x49, script: 0x5a, flags: 0x0}, - 936: {region: 0x165, script: 0x5a, flags: 0x0}, - 937: {region: 0x9c, script: 0xf7, flags: 0x0}, - 938: {region: 0x165, script: 0x5a, flags: 0x0}, - 939: {region: 0x60, script: 0x5a, flags: 0x0}, - 940: {region: 0x165, script: 0x5, flags: 0x0}, - 941: {region: 0xb0, script: 0x8e, flags: 0x0}, - 943: {region: 0x165, script: 0x5a, flags: 0x0}, - 944: {region: 0x165, script: 0x5a, flags: 0x0}, - 945: {region: 0x99, script: 0x12, flags: 0x0}, - 946: {region: 0xa4, script: 0x5a, flags: 0x0}, - 947: {region: 0xe9, script: 0x5a, flags: 0x0}, - 948: {region: 0x165, script: 0x5a, flags: 0x0}, - 949: {region: 0x9e, script: 0x5a, flags: 0x0}, - 950: {region: 0x165, script: 0x5a, flags: 0x0}, - 951: {region: 0x165, script: 0x5a, flags: 0x0}, - 952: {region: 0x87, script: 0x34, flags: 0x0}, - 953: {region: 0x75, script: 0x5a, flags: 0x0}, - 954: {region: 0x165, script: 0x5a, flags: 0x0}, - 955: {region: 0xe8, script: 0x4d, flags: 0x0}, - 956: {region: 0x9c, script: 0x5, flags: 0x0}, - 957: {region: 0x1, script: 0x5a, flags: 0x0}, + 928: {region: 0xe8, script: 0x5b, flags: 0x0}, + 929: {region: 0x30, script: 0x5b, flags: 0x0}, + 930: {region: 0xf1, script: 0x5b, flags: 0x0}, + 931: {region: 0x166, script: 0x5b, flags: 0x0}, + 932: {region: 0x79, script: 0x5b, flags: 0x0}, + 933: {region: 0xd7, script: 0x5b, flags: 0x0}, + 934: {region: 0x136, script: 0x5b, flags: 0x0}, + 935: {region: 0x49, script: 0x5b, flags: 0x0}, + 936: {region: 0x166, script: 0x5b, flags: 0x0}, + 937: {region: 0x9d, script: 0xfa, flags: 0x0}, + 938: {region: 0x166, script: 0x5b, flags: 0x0}, + 939: {region: 0x61, script: 0x5b, flags: 0x0}, + 940: {region: 0x166, script: 0x5, flags: 0x0}, + 941: {region: 0xb1, script: 0x90, flags: 0x0}, + 943: {region: 0x166, script: 0x5b, flags: 0x0}, + 944: {region: 0x166, script: 0x5b, flags: 0x0}, + 945: {region: 0x9a, script: 0x12, flags: 0x0}, + 946: {region: 0xa5, script: 0x5b, flags: 0x0}, + 947: {region: 0xea, script: 0x5b, flags: 0x0}, + 948: {region: 0x166, script: 0x5b, flags: 0x0}, + 949: {region: 0x9f, script: 0x5b, flags: 0x0}, + 950: {region: 0x166, script: 0x5b, flags: 0x0}, + 951: {region: 0x166, script: 0x5b, flags: 0x0}, + 952: {region: 0x88, script: 0x34, flags: 0x0}, + 953: {region: 0x76, script: 0x5b, flags: 0x0}, + 954: {region: 0x166, script: 0x5b, flags: 0x0}, + 955: {region: 0xe9, script: 0x4e, flags: 0x0}, + 956: {region: 0x9d, script: 0x5, flags: 0x0}, + 957: {region: 0x1, script: 0x5b, flags: 0x0}, 958: {region: 0x24, script: 0x5, flags: 0x0}, - 959: {region: 0x165, script: 0x5a, flags: 0x0}, - 960: {region: 0x41, script: 0x5a, flags: 0x0}, - 961: {region: 0x165, script: 0x5a, flags: 0x0}, - 962: {region: 0x7a, script: 0x5a, flags: 0x0}, - 963: {region: 0x165, script: 0x5a, flags: 0x0}, - 964: {region: 0xe4, script: 0x5a, flags: 0x0}, - 965: {region: 0x89, script: 0x5a, flags: 0x0}, - 966: {region: 0x69, script: 0x5a, flags: 0x0}, - 967: {region: 0x165, script: 0x5a, flags: 0x0}, - 968: {region: 0x99, script: 0x22, flags: 0x0}, - 969: {region: 0x165, script: 0x5a, flags: 0x0}, - 970: {region: 0x102, script: 0x5a, flags: 0x0}, - 971: {region: 0x95, script: 0x5a, flags: 0x0}, - 972: {region: 0x165, script: 0x5a, flags: 0x0}, - 973: {region: 0x165, script: 0x5a, flags: 0x0}, - 974: {region: 0x9e, script: 0x5a, flags: 0x0}, - 975: {region: 0x165, script: 0x5, flags: 0x0}, - 976: {region: 0x99, script: 0x5a, flags: 0x0}, + 959: {region: 0x166, script: 0x5b, flags: 0x0}, + 960: {region: 0x41, script: 0x5b, flags: 0x0}, + 961: {region: 0x166, script: 0x5b, flags: 0x0}, + 962: {region: 0x7b, script: 0x5b, flags: 0x0}, + 963: {region: 0x166, script: 0x5b, flags: 0x0}, + 964: {region: 0xe5, script: 0x5b, flags: 0x0}, + 965: {region: 0x8a, script: 0x5b, flags: 0x0}, + 966: {region: 0x6a, script: 0x5b, flags: 0x0}, + 967: {region: 0x166, script: 0x5b, flags: 0x0}, + 968: {region: 0x9a, script: 0x22, flags: 0x0}, + 969: {region: 0x166, script: 0x5b, flags: 0x0}, + 970: {region: 0x103, script: 0x5b, flags: 0x0}, + 971: {region: 0x96, script: 0x5b, flags: 0x0}, + 972: {region: 0x166, script: 0x5b, flags: 0x0}, + 973: {region: 0x166, script: 0x5b, flags: 0x0}, + 974: {region: 0x9f, script: 0x5b, flags: 0x0}, + 975: {region: 0x166, script: 0x5, flags: 0x0}, + 976: {region: 0x9a, script: 0x5b, flags: 0x0}, 977: {region: 0x31, script: 0x2, flags: 0x1}, - 978: {region: 0xdb, script: 0x22, flags: 0x0}, + 978: {region: 0xdc, script: 0x22, flags: 0x0}, 979: {region: 0x35, script: 0xe, flags: 0x0}, - 980: {region: 0x4e, script: 0x5a, flags: 0x0}, - 981: {region: 0x72, script: 0x5a, flags: 0x0}, - 982: {region: 0x4e, script: 0x5a, flags: 0x0}, - 983: {region: 0x9c, script: 0x5, flags: 0x0}, - 984: {region: 0x10c, script: 0x5a, flags: 0x0}, - 985: {region: 0x3a, script: 0x5a, flags: 0x0}, - 986: {region: 0x165, script: 0x5a, flags: 0x0}, - 987: {region: 0xd1, script: 0x5a, flags: 0x0}, - 988: {region: 0x104, script: 0x5a, flags: 0x0}, - 989: {region: 0x95, script: 0x5a, flags: 0x0}, - 990: {region: 0x12f, script: 0x5a, flags: 0x0}, - 991: {region: 0x165, script: 0x5a, flags: 0x0}, - 992: {region: 0x165, script: 0x5a, flags: 0x0}, - 993: {region: 0x73, script: 0x5a, flags: 0x0}, - 994: {region: 0x106, script: 0x20, flags: 0x0}, - 995: {region: 0x130, script: 0x20, flags: 0x0}, - 996: {region: 0x109, script: 0x5a, flags: 0x0}, - 997: {region: 0x107, script: 0x5a, flags: 0x0}, - 998: {region: 0x12f, script: 0x5a, flags: 0x0}, - 999: {region: 0x165, script: 0x5a, flags: 0x0}, - 1000: {region: 0xa2, script: 0x4c, flags: 0x0}, - 1001: {region: 0x99, script: 0x22, flags: 0x0}, - 1002: {region: 0x80, script: 0x5a, flags: 0x0}, - 1003: {region: 0x106, script: 0x20, flags: 0x0}, - 1004: {region: 0xa4, script: 0x5a, flags: 0x0}, - 1005: {region: 0x95, script: 0x5a, flags: 0x0}, - 1006: {region: 0x99, script: 0x5a, flags: 0x0}, - 1007: {region: 0x114, script: 0x5a, flags: 0x0}, - 1008: {region: 0x99, script: 0xcd, flags: 0x0}, - 1009: {region: 0x165, script: 0x5a, flags: 0x0}, - 1010: {region: 0x165, script: 0x5a, flags: 0x0}, - 1011: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1012: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1013: {region: 0x99, script: 0x22, flags: 0x0}, - 1014: {region: 0x165, script: 0x5, flags: 0x0}, - 1015: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1016: {region: 0x7b, script: 0x5a, flags: 0x0}, - 1017: {region: 0x49, script: 0x5a, flags: 0x0}, + 980: {region: 0x4e, script: 0x5b, flags: 0x0}, + 981: {region: 0x73, script: 0x5b, flags: 0x0}, + 982: {region: 0x4e, script: 0x5b, flags: 0x0}, + 983: {region: 0x9d, script: 0x5, flags: 0x0}, + 984: {region: 0x10d, script: 0x5b, flags: 0x0}, + 985: {region: 0x3a, script: 0x5b, flags: 0x0}, + 986: {region: 0x166, script: 0x5b, flags: 0x0}, + 987: {region: 0xd2, script: 0x5b, flags: 0x0}, + 988: {region: 0x105, script: 0x5b, flags: 0x0}, + 989: {region: 0x96, script: 0x5b, flags: 0x0}, + 990: {region: 0x130, script: 0x5b, flags: 0x0}, + 991: {region: 0x166, script: 0x5b, flags: 0x0}, + 992: {region: 0x166, script: 0x5b, flags: 0x0}, + 993: {region: 0x74, script: 0x5b, flags: 0x0}, + 994: {region: 0x107, script: 0x20, flags: 0x0}, + 995: {region: 0x131, script: 0x20, flags: 0x0}, + 996: {region: 0x10a, script: 0x5b, flags: 0x0}, + 997: {region: 0x108, script: 0x5b, flags: 0x0}, + 998: {region: 0x130, script: 0x5b, flags: 0x0}, + 999: {region: 0x166, script: 0x5b, flags: 0x0}, + 1000: {region: 0xa3, script: 0x4c, flags: 0x0}, + 1001: {region: 0x9a, script: 0x22, flags: 0x0}, + 1002: {region: 0x81, script: 0x5b, flags: 0x0}, + 1003: {region: 0x107, script: 0x20, flags: 0x0}, + 1004: {region: 0xa5, script: 0x5b, flags: 0x0}, + 1005: {region: 0x96, script: 0x5b, flags: 0x0}, + 1006: {region: 0x9a, script: 0x5b, flags: 0x0}, + 1007: {region: 0x115, script: 0x5b, flags: 0x0}, + 1008: {region: 0x9a, script: 0xcf, flags: 0x0}, + 1009: {region: 0x166, script: 0x5b, flags: 0x0}, + 1010: {region: 0x166, script: 0x5b, flags: 0x0}, + 1011: {region: 0x130, script: 0x5b, flags: 0x0}, + 1012: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1013: {region: 0x9a, script: 0x22, flags: 0x0}, + 1014: {region: 0x166, script: 0x5, flags: 0x0}, + 1015: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1016: {region: 0x7c, script: 0x5b, flags: 0x0}, + 1017: {region: 0x49, script: 0x5b, flags: 0x0}, 1018: {region: 0x33, script: 0x4, flags: 0x1}, - 1019: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1020: {region: 0x9c, script: 0x5, flags: 0x0}, - 1021: {region: 0xda, script: 0x5a, flags: 0x0}, - 1022: {region: 0x4f, script: 0x5a, flags: 0x0}, - 1023: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1024: {region: 0xcf, script: 0x5a, flags: 0x0}, - 1025: {region: 0xc3, script: 0x5a, flags: 0x0}, - 1026: {region: 0x4c, script: 0x5a, flags: 0x0}, - 1027: {region: 0x96, script: 0x7e, flags: 0x0}, - 1028: {region: 0xb6, script: 0x5a, flags: 0x0}, - 1029: {region: 0x165, script: 0x2c, flags: 0x0}, - 1030: {region: 0x165, script: 0x5a, flags: 0x0}, - 1032: {region: 0xba, script: 0xe8, flags: 0x0}, - 1033: {region: 0x165, script: 0x5a, flags: 0x0}, - 1034: {region: 0xc4, script: 0x75, flags: 0x0}, - 1035: {region: 0x165, script: 0x5, flags: 0x0}, - 1036: {region: 0xb3, script: 0xd4, flags: 0x0}, - 1037: {region: 0x6f, script: 0x5a, flags: 0x0}, - 1038: {region: 0x165, script: 0x5a, flags: 0x0}, - 1039: {region: 0x165, script: 0x5a, flags: 0x0}, - 1040: {region: 0x165, script: 0x5a, flags: 0x0}, - 1041: {region: 0x165, script: 0x5a, flags: 0x0}, - 1042: {region: 0x111, script: 0x5a, flags: 0x0}, - 1043: {region: 0x165, script: 0x5a, flags: 0x0}, - 1044: {region: 0xe8, script: 0x5, flags: 0x0}, - 1045: {region: 0x165, script: 0x5a, flags: 0x0}, - 1046: {region: 0x10f, script: 0x5a, flags: 0x0}, - 1047: {region: 0x165, script: 0x5a, flags: 0x0}, - 1048: {region: 0xe9, script: 0x5a, flags: 0x0}, - 1049: {region: 0x165, script: 0x5a, flags: 0x0}, - 1050: {region: 0x95, script: 0x5a, flags: 0x0}, - 1051: {region: 0x142, script: 0x5a, flags: 0x0}, - 1052: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1054: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1055: {region: 0x72, script: 0x5a, flags: 0x0}, - 1056: {region: 0x97, script: 0xca, flags: 0x0}, - 1057: {region: 0x165, script: 0x5a, flags: 0x0}, - 1058: {region: 0x72, script: 0x5a, flags: 0x0}, - 1059: {region: 0x164, script: 0x5a, flags: 0x0}, - 1060: {region: 0x165, script: 0x5a, flags: 0x0}, - 1061: {region: 0xc3, script: 0x5a, flags: 0x0}, - 1062: {region: 0x165, script: 0x5a, flags: 0x0}, - 1063: {region: 0x165, script: 0x5a, flags: 0x0}, - 1064: {region: 0x165, script: 0x5a, flags: 0x0}, - 1065: {region: 0x115, script: 0x5a, flags: 0x0}, - 1066: {region: 0x165, script: 0x5a, flags: 0x0}, - 1067: {region: 0x165, script: 0x5a, flags: 0x0}, - 1068: {region: 0x123, script: 0xeb, flags: 0x0}, - 1069: {region: 0x165, script: 0x5a, flags: 0x0}, - 1070: {region: 0x165, script: 0x5a, flags: 0x0}, - 1071: {region: 0x165, script: 0x5a, flags: 0x0}, - 1072: {region: 0x165, script: 0x5a, flags: 0x0}, - 1073: {region: 0x27, script: 0x5a, flags: 0x0}, + 1019: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1020: {region: 0x9d, script: 0x5, flags: 0x0}, + 1021: {region: 0xdb, script: 0x5b, flags: 0x0}, + 1022: {region: 0x4f, script: 0x5b, flags: 0x0}, + 1023: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1024: {region: 0xd0, script: 0x5b, flags: 0x0}, + 1025: {region: 0xc4, script: 0x5b, flags: 0x0}, + 1026: {region: 0x4c, script: 0x5b, flags: 0x0}, + 1027: {region: 0x97, script: 0x80, flags: 0x0}, + 1028: {region: 0xb7, script: 0x5b, flags: 0x0}, + 1029: {region: 0x166, script: 0x2c, flags: 0x0}, + 1030: {region: 0x166, script: 0x5b, flags: 0x0}, + 1032: {region: 0xbb, script: 0xeb, flags: 0x0}, + 1033: {region: 0x166, script: 0x5b, flags: 0x0}, + 1034: {region: 0xc5, script: 0x76, flags: 0x0}, + 1035: {region: 0x166, script: 0x5, flags: 0x0}, + 1036: {region: 0xb4, script: 0xd6, flags: 0x0}, + 1037: {region: 0x70, script: 0x5b, flags: 0x0}, + 1038: {region: 0x166, script: 0x5b, flags: 0x0}, + 1039: {region: 0x166, script: 0x5b, flags: 0x0}, + 1040: {region: 0x166, script: 0x5b, flags: 0x0}, + 1041: {region: 0x166, script: 0x5b, flags: 0x0}, + 1042: {region: 0x112, script: 0x5b, flags: 0x0}, + 1043: {region: 0x166, script: 0x5b, flags: 0x0}, + 1044: {region: 0xe9, script: 0x5, flags: 0x0}, + 1045: {region: 0x166, script: 0x5b, flags: 0x0}, + 1046: {region: 0x110, script: 0x5b, flags: 0x0}, + 1047: {region: 0x166, script: 0x5b, flags: 0x0}, + 1048: {region: 0xea, script: 0x5b, flags: 0x0}, + 1049: {region: 0x166, script: 0x5b, flags: 0x0}, + 1050: {region: 0x96, script: 0x5b, flags: 0x0}, + 1051: {region: 0x143, script: 0x5b, flags: 0x0}, + 1052: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1054: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1055: {region: 0x73, script: 0x5b, flags: 0x0}, + 1056: {region: 0x98, script: 0xcc, flags: 0x0}, + 1057: {region: 0x166, script: 0x5b, flags: 0x0}, + 1058: {region: 0x73, script: 0x5b, flags: 0x0}, + 1059: {region: 0x165, script: 0x5b, flags: 0x0}, + 1060: {region: 0x166, script: 0x5b, flags: 0x0}, + 1061: {region: 0xc4, script: 0x5b, flags: 0x0}, + 1062: {region: 0x166, script: 0x5b, flags: 0x0}, + 1063: {region: 0x166, script: 0x5b, flags: 0x0}, + 1064: {region: 0x166, script: 0x5b, flags: 0x0}, + 1065: {region: 0x116, script: 0x5b, flags: 0x0}, + 1066: {region: 0x166, script: 0x5b, flags: 0x0}, + 1067: {region: 0x166, script: 0x5b, flags: 0x0}, + 1068: {region: 0x124, script: 0xee, flags: 0x0}, + 1069: {region: 0x166, script: 0x5b, flags: 0x0}, + 1070: {region: 0x166, script: 0x5b, flags: 0x0}, + 1071: {region: 0x166, script: 0x5b, flags: 0x0}, + 1072: {region: 0x166, script: 0x5b, flags: 0x0}, + 1073: {region: 0x27, script: 0x5b, flags: 0x0}, 1074: {region: 0x37, script: 0x5, flags: 0x1}, - 1075: {region: 0x99, script: 0xd7, flags: 0x0}, - 1076: {region: 0x116, script: 0x5a, flags: 0x0}, - 1077: {region: 0x114, script: 0x5a, flags: 0x0}, - 1078: {region: 0x99, script: 0x22, flags: 0x0}, - 1079: {region: 0x161, script: 0x5a, flags: 0x0}, - 1080: {region: 0x165, script: 0x5a, flags: 0x0}, - 1081: {region: 0x165, script: 0x5a, flags: 0x0}, - 1082: {region: 0x6d, script: 0x5a, flags: 0x0}, - 1083: {region: 0x161, script: 0x5a, flags: 0x0}, - 1084: {region: 0x165, script: 0x5a, flags: 0x0}, - 1085: {region: 0x60, script: 0x5a, flags: 0x0}, - 1086: {region: 0x95, script: 0x5a, flags: 0x0}, - 1087: {region: 0x165, script: 0x5a, flags: 0x0}, - 1088: {region: 0x165, script: 0x5a, flags: 0x0}, - 1089: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1090: {region: 0x165, script: 0x5a, flags: 0x0}, - 1091: {region: 0x84, script: 0x5a, flags: 0x0}, - 1092: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1093: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1094: {region: 0x15f, script: 0x5, flags: 0x0}, - 1095: {region: 0x4b, script: 0x5a, flags: 0x0}, - 1096: {region: 0x60, script: 0x5a, flags: 0x0}, - 1097: {region: 0x165, script: 0x5a, flags: 0x0}, - 1098: {region: 0x99, script: 0x22, flags: 0x0}, - 1099: {region: 0x95, script: 0x5a, flags: 0x0}, - 1100: {region: 0x165, script: 0x5a, flags: 0x0}, + 1075: {region: 0x9a, script: 0xd9, flags: 0x0}, + 1076: {region: 0x117, script: 0x5b, flags: 0x0}, + 1077: {region: 0x115, script: 0x5b, flags: 0x0}, + 1078: {region: 0x9a, script: 0x22, flags: 0x0}, + 1079: {region: 0x162, script: 0x5b, flags: 0x0}, + 1080: {region: 0x166, script: 0x5b, flags: 0x0}, + 1081: {region: 0x166, script: 0x5b, flags: 0x0}, + 1082: {region: 0x6e, script: 0x5b, flags: 0x0}, + 1083: {region: 0x162, script: 0x5b, flags: 0x0}, + 1084: {region: 0x166, script: 0x5b, flags: 0x0}, + 1085: {region: 0x61, script: 0x5b, flags: 0x0}, + 1086: {region: 0x96, script: 0x5b, flags: 0x0}, + 1087: {region: 0x166, script: 0x5b, flags: 0x0}, + 1088: {region: 0x166, script: 0x5b, flags: 0x0}, + 1089: {region: 0x130, script: 0x5b, flags: 0x0}, + 1090: {region: 0x166, script: 0x5b, flags: 0x0}, + 1091: {region: 0x85, script: 0x5b, flags: 0x0}, + 1092: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1093: {region: 0x130, script: 0x5b, flags: 0x0}, + 1094: {region: 0x160, script: 0x5, flags: 0x0}, + 1095: {region: 0x4b, script: 0x5b, flags: 0x0}, + 1096: {region: 0x61, script: 0x5b, flags: 0x0}, + 1097: {region: 0x166, script: 0x5b, flags: 0x0}, + 1098: {region: 0x9a, script: 0x22, flags: 0x0}, + 1099: {region: 0x96, script: 0x5b, flags: 0x0}, + 1100: {region: 0x166, script: 0x5b, flags: 0x0}, 1101: {region: 0x35, script: 0xe, flags: 0x0}, - 1102: {region: 0x9b, script: 0xdb, flags: 0x0}, - 1103: {region: 0xe9, script: 0x5a, flags: 0x0}, - 1104: {region: 0x99, script: 0xe3, flags: 0x0}, - 1105: {region: 0xdb, script: 0x22, flags: 0x0}, - 1106: {region: 0x165, script: 0x5a, flags: 0x0}, - 1107: {region: 0x165, script: 0x5a, flags: 0x0}, - 1108: {region: 0x165, script: 0x5a, flags: 0x0}, - 1109: {region: 0x165, script: 0x5a, flags: 0x0}, - 1110: {region: 0x165, script: 0x5a, flags: 0x0}, - 1111: {region: 0x165, script: 0x5a, flags: 0x0}, - 1112: {region: 0x165, script: 0x5a, flags: 0x0}, - 1113: {region: 0x165, script: 0x5a, flags: 0x0}, - 1114: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1115: {region: 0x165, script: 0x5a, flags: 0x0}, - 1116: {region: 0x165, script: 0x5a, flags: 0x0}, - 1117: {region: 0x99, script: 0x52, flags: 0x0}, - 1118: {region: 0x53, script: 0xe1, flags: 0x0}, - 1119: {region: 0xdb, script: 0x22, flags: 0x0}, - 1120: {region: 0xdb, script: 0x22, flags: 0x0}, - 1121: {region: 0x99, script: 0xe6, flags: 0x0}, - 1122: {region: 0x165, script: 0x5a, flags: 0x0}, - 1123: {region: 0x112, script: 0x5a, flags: 0x0}, - 1124: {region: 0x131, script: 0x5a, flags: 0x0}, - 1125: {region: 0x126, script: 0x5a, flags: 0x0}, - 1126: {region: 0x165, script: 0x5a, flags: 0x0}, + 1102: {region: 0x9c, script: 0xde, flags: 0x0}, + 1103: {region: 0xea, script: 0x5b, flags: 0x0}, + 1104: {region: 0x9a, script: 0xe6, flags: 0x0}, + 1105: {region: 0xdc, script: 0x22, flags: 0x0}, + 1106: {region: 0x166, script: 0x5b, flags: 0x0}, + 1107: {region: 0x166, script: 0x5b, flags: 0x0}, + 1108: {region: 0x166, script: 0x5b, flags: 0x0}, + 1109: {region: 0x166, script: 0x5b, flags: 0x0}, + 1110: {region: 0x166, script: 0x5b, flags: 0x0}, + 1111: {region: 0x166, script: 0x5b, flags: 0x0}, + 1112: {region: 0x166, script: 0x5b, flags: 0x0}, + 1113: {region: 0x166, script: 0x5b, flags: 0x0}, + 1114: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1115: {region: 0x166, script: 0x5b, flags: 0x0}, + 1116: {region: 0x166, script: 0x5b, flags: 0x0}, + 1117: {region: 0x9a, script: 0x53, flags: 0x0}, + 1118: {region: 0x53, script: 0xe4, flags: 0x0}, + 1119: {region: 0xdc, script: 0x22, flags: 0x0}, + 1120: {region: 0xdc, script: 0x22, flags: 0x0}, + 1121: {region: 0x9a, script: 0xe9, flags: 0x0}, + 1122: {region: 0x166, script: 0x5b, flags: 0x0}, + 1123: {region: 0x113, script: 0x5b, flags: 0x0}, + 1124: {region: 0x132, script: 0x5b, flags: 0x0}, + 1125: {region: 0x127, script: 0x5b, flags: 0x0}, + 1126: {region: 0x166, script: 0x5b, flags: 0x0}, 1127: {region: 0x3c, script: 0x3, flags: 0x1}, - 1128: {region: 0x165, script: 0x5a, flags: 0x0}, - 1129: {region: 0x165, script: 0x5a, flags: 0x0}, - 1130: {region: 0x165, script: 0x5a, flags: 0x0}, - 1131: {region: 0x123, script: 0xeb, flags: 0x0}, - 1132: {region: 0xdb, script: 0x22, flags: 0x0}, - 1133: {region: 0xdb, script: 0x22, flags: 0x0}, - 1134: {region: 0xdb, script: 0x22, flags: 0x0}, - 1135: {region: 0x6f, script: 0x2c, flags: 0x0}, - 1136: {region: 0x165, script: 0x5a, flags: 0x0}, - 1137: {region: 0x6d, script: 0x2c, flags: 0x0}, - 1138: {region: 0x165, script: 0x5a, flags: 0x0}, - 1139: {region: 0x165, script: 0x5a, flags: 0x0}, - 1140: {region: 0x165, script: 0x5a, flags: 0x0}, - 1141: {region: 0xd6, script: 0x5a, flags: 0x0}, - 1142: {region: 0x127, script: 0x5a, flags: 0x0}, - 1143: {region: 0x125, script: 0x5a, flags: 0x0}, - 1144: {region: 0x32, script: 0x5a, flags: 0x0}, - 1145: {region: 0xdb, script: 0x22, flags: 0x0}, - 1146: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1147: {region: 0x165, script: 0x5a, flags: 0x0}, - 1148: {region: 0x165, script: 0x5a, flags: 0x0}, - 1149: {region: 0x32, script: 0x5a, flags: 0x0}, - 1150: {region: 0xd4, script: 0x5a, flags: 0x0}, - 1151: {region: 0x165, script: 0x5a, flags: 0x0}, - 1152: {region: 0x161, script: 0x5a, flags: 0x0}, - 1153: {region: 0x165, script: 0x5a, flags: 0x0}, - 1154: {region: 0x129, script: 0x5a, flags: 0x0}, - 1155: {region: 0x165, script: 0x5a, flags: 0x0}, - 1156: {region: 0xce, script: 0x5a, flags: 0x0}, - 1157: {region: 0x165, script: 0x5a, flags: 0x0}, - 1158: {region: 0xe6, script: 0x5a, flags: 0x0}, - 1159: {region: 0x165, script: 0x5a, flags: 0x0}, - 1160: {region: 0x165, script: 0x5a, flags: 0x0}, - 1161: {region: 0x165, script: 0x5a, flags: 0x0}, - 1162: {region: 0x12b, script: 0x5a, flags: 0x0}, - 1163: {region: 0x12b, script: 0x5a, flags: 0x0}, - 1164: {region: 0x12e, script: 0x5a, flags: 0x0}, - 1165: {region: 0x165, script: 0x5, flags: 0x0}, - 1166: {region: 0x161, script: 0x5a, flags: 0x0}, - 1167: {region: 0x87, script: 0x34, flags: 0x0}, - 1168: {region: 0xdb, script: 0x22, flags: 0x0}, - 1169: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1170: {region: 0x43, script: 0xec, flags: 0x0}, - 1171: {region: 0x165, script: 0x5a, flags: 0x0}, - 1172: {region: 0x106, script: 0x20, flags: 0x0}, - 1173: {region: 0x165, script: 0x5a, flags: 0x0}, - 1174: {region: 0x165, script: 0x5a, flags: 0x0}, - 1175: {region: 0x131, script: 0x5a, flags: 0x0}, - 1176: {region: 0x165, script: 0x5a, flags: 0x0}, - 1177: {region: 0x123, script: 0xeb, flags: 0x0}, - 1178: {region: 0x32, script: 0x5a, flags: 0x0}, - 1179: {region: 0x165, script: 0x5a, flags: 0x0}, - 1180: {region: 0x165, script: 0x5a, flags: 0x0}, - 1181: {region: 0xce, script: 0x5a, flags: 0x0}, - 1182: {region: 0x165, script: 0x5a, flags: 0x0}, - 1183: {region: 0x165, script: 0x5a, flags: 0x0}, - 1184: {region: 0x12d, script: 0x5a, flags: 0x0}, - 1185: {region: 0x165, script: 0x5a, flags: 0x0}, - 1187: {region: 0x165, script: 0x5a, flags: 0x0}, - 1188: {region: 0xd4, script: 0x5a, flags: 0x0}, - 1189: {region: 0x53, script: 0xe4, flags: 0x0}, - 1190: {region: 0xe5, script: 0x5a, flags: 0x0}, - 1191: {region: 0x165, script: 0x5a, flags: 0x0}, - 1192: {region: 0x106, script: 0x20, flags: 0x0}, - 1193: {region: 0xba, script: 0x5a, flags: 0x0}, - 1194: {region: 0x165, script: 0x5a, flags: 0x0}, - 1195: {region: 0x106, script: 0x20, flags: 0x0}, + 1128: {region: 0x166, script: 0x5b, flags: 0x0}, + 1129: {region: 0x166, script: 0x5b, flags: 0x0}, + 1130: {region: 0x166, script: 0x5b, flags: 0x0}, + 1131: {region: 0x124, script: 0xee, flags: 0x0}, + 1132: {region: 0xdc, script: 0x22, flags: 0x0}, + 1133: {region: 0xdc, script: 0x22, flags: 0x0}, + 1134: {region: 0xdc, script: 0x22, flags: 0x0}, + 1135: {region: 0x70, script: 0x2c, flags: 0x0}, + 1136: {region: 0x166, script: 0x5b, flags: 0x0}, + 1137: {region: 0x6e, script: 0x2c, flags: 0x0}, + 1138: {region: 0x166, script: 0x5b, flags: 0x0}, + 1139: {region: 0x166, script: 0x5b, flags: 0x0}, + 1140: {region: 0x166, script: 0x5b, flags: 0x0}, + 1141: {region: 0xd7, script: 0x5b, flags: 0x0}, + 1142: {region: 0x128, script: 0x5b, flags: 0x0}, + 1143: {region: 0x126, script: 0x5b, flags: 0x0}, + 1144: {region: 0x32, script: 0x5b, flags: 0x0}, + 1145: {region: 0xdc, script: 0x22, flags: 0x0}, + 1146: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1147: {region: 0x166, script: 0x5b, flags: 0x0}, + 1148: {region: 0x166, script: 0x5b, flags: 0x0}, + 1149: {region: 0x32, script: 0x5b, flags: 0x0}, + 1150: {region: 0xd5, script: 0x5b, flags: 0x0}, + 1151: {region: 0x166, script: 0x5b, flags: 0x0}, + 1152: {region: 0x162, script: 0x5b, flags: 0x0}, + 1153: {region: 0x166, script: 0x5b, flags: 0x0}, + 1154: {region: 0x12a, script: 0x5b, flags: 0x0}, + 1155: {region: 0x166, script: 0x5b, flags: 0x0}, + 1156: {region: 0xcf, script: 0x5b, flags: 0x0}, + 1157: {region: 0x166, script: 0x5b, flags: 0x0}, + 1158: {region: 0xe7, script: 0x5b, flags: 0x0}, + 1159: {region: 0x166, script: 0x5b, flags: 0x0}, + 1160: {region: 0x166, script: 0x5b, flags: 0x0}, + 1161: {region: 0x166, script: 0x5b, flags: 0x0}, + 1162: {region: 0x12c, script: 0x5b, flags: 0x0}, + 1163: {region: 0x12c, script: 0x5b, flags: 0x0}, + 1164: {region: 0x12f, script: 0x5b, flags: 0x0}, + 1165: {region: 0x166, script: 0x5, flags: 0x0}, + 1166: {region: 0x162, script: 0x5b, flags: 0x0}, + 1167: {region: 0x88, script: 0x34, flags: 0x0}, + 1168: {region: 0xdc, script: 0x22, flags: 0x0}, + 1169: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1170: {region: 0x43, script: 0xef, flags: 0x0}, + 1171: {region: 0x166, script: 0x5b, flags: 0x0}, + 1172: {region: 0x107, script: 0x20, flags: 0x0}, + 1173: {region: 0x166, script: 0x5b, flags: 0x0}, + 1174: {region: 0x166, script: 0x5b, flags: 0x0}, + 1175: {region: 0x132, script: 0x5b, flags: 0x0}, + 1176: {region: 0x166, script: 0x5b, flags: 0x0}, + 1177: {region: 0x124, script: 0xee, flags: 0x0}, + 1178: {region: 0x32, script: 0x5b, flags: 0x0}, + 1179: {region: 0x166, script: 0x5b, flags: 0x0}, + 1180: {region: 0x166, script: 0x5b, flags: 0x0}, + 1181: {region: 0xcf, script: 0x5b, flags: 0x0}, + 1182: {region: 0x166, script: 0x5b, flags: 0x0}, + 1183: {region: 0x166, script: 0x5b, flags: 0x0}, + 1184: {region: 0x12e, script: 0x5b, flags: 0x0}, + 1185: {region: 0x166, script: 0x5b, flags: 0x0}, + 1187: {region: 0x166, script: 0x5b, flags: 0x0}, + 1188: {region: 0xd5, script: 0x5b, flags: 0x0}, + 1189: {region: 0x53, script: 0xe7, flags: 0x0}, + 1190: {region: 0xe6, script: 0x5b, flags: 0x0}, + 1191: {region: 0x166, script: 0x5b, flags: 0x0}, + 1192: {region: 0x107, script: 0x20, flags: 0x0}, + 1193: {region: 0xbb, script: 0x5b, flags: 0x0}, + 1194: {region: 0x166, script: 0x5b, flags: 0x0}, + 1195: {region: 0x107, script: 0x20, flags: 0x0}, 1196: {region: 0x3f, script: 0x4, flags: 0x1}, - 1197: {region: 0x11c, script: 0xf0, flags: 0x0}, - 1198: {region: 0x130, script: 0x20, flags: 0x0}, - 1199: {region: 0x75, script: 0x5a, flags: 0x0}, - 1200: {region: 0x2a, script: 0x5a, flags: 0x0}, + 1197: {region: 0x11d, script: 0xf3, flags: 0x0}, + 1198: {region: 0x131, script: 0x20, flags: 0x0}, + 1199: {region: 0x76, script: 0x5b, flags: 0x0}, + 1200: {region: 0x2a, script: 0x5b, flags: 0x0}, 1202: {region: 0x43, script: 0x3, flags: 0x1}, - 1203: {region: 0x99, script: 0xe, flags: 0x0}, - 1204: {region: 0xe8, script: 0x5, flags: 0x0}, - 1205: {region: 0x165, script: 0x5a, flags: 0x0}, - 1206: {region: 0x165, script: 0x5a, flags: 0x0}, - 1207: {region: 0x165, script: 0x5a, flags: 0x0}, - 1208: {region: 0x165, script: 0x5a, flags: 0x0}, - 1209: {region: 0x165, script: 0x5a, flags: 0x0}, - 1210: {region: 0x165, script: 0x5a, flags: 0x0}, - 1211: {region: 0x165, script: 0x5a, flags: 0x0}, + 1203: {region: 0x9a, script: 0xe, flags: 0x0}, + 1204: {region: 0xe9, script: 0x5, flags: 0x0}, + 1205: {region: 0x166, script: 0x5b, flags: 0x0}, + 1206: {region: 0x166, script: 0x5b, flags: 0x0}, + 1207: {region: 0x166, script: 0x5b, flags: 0x0}, + 1208: {region: 0x166, script: 0x5b, flags: 0x0}, + 1209: {region: 0x166, script: 0x5b, flags: 0x0}, + 1210: {region: 0x166, script: 0x5b, flags: 0x0}, + 1211: {region: 0x166, script: 0x5b, flags: 0x0}, 1212: {region: 0x46, script: 0x4, flags: 0x1}, - 1213: {region: 0x165, script: 0x5a, flags: 0x0}, - 1214: {region: 0xb4, script: 0xf1, flags: 0x0}, - 1215: {region: 0x165, script: 0x5a, flags: 0x0}, - 1216: {region: 0x161, script: 0x5a, flags: 0x0}, - 1217: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1218: {region: 0x106, script: 0x5a, flags: 0x0}, - 1219: {region: 0x13e, script: 0x5a, flags: 0x0}, - 1220: {region: 0x11b, script: 0x5a, flags: 0x0}, - 1221: {region: 0x165, script: 0x5a, flags: 0x0}, - 1222: {region: 0x36, script: 0x5a, flags: 0x0}, - 1223: {region: 0x60, script: 0x5a, flags: 0x0}, - 1224: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1225: {region: 0x1, script: 0x5a, flags: 0x0}, - 1226: {region: 0x106, script: 0x5a, flags: 0x0}, - 1227: {region: 0x6a, script: 0x5a, flags: 0x0}, - 1228: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1229: {region: 0x165, script: 0x5a, flags: 0x0}, - 1230: {region: 0x36, script: 0x5a, flags: 0x0}, - 1231: {region: 0x4e, script: 0x5a, flags: 0x0}, - 1232: {region: 0x165, script: 0x5a, flags: 0x0}, - 1233: {region: 0x6f, script: 0x2c, flags: 0x0}, - 1234: {region: 0x165, script: 0x5a, flags: 0x0}, - 1235: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1236: {region: 0x2f, script: 0x5a, flags: 0x0}, - 1237: {region: 0x99, script: 0xe6, flags: 0x0}, - 1238: {region: 0x99, script: 0x22, flags: 0x0}, - 1239: {region: 0x165, script: 0x5a, flags: 0x0}, - 1240: {region: 0x165, script: 0x5a, flags: 0x0}, - 1241: {region: 0x165, script: 0x5a, flags: 0x0}, - 1242: {region: 0x165, script: 0x5a, flags: 0x0}, - 1243: {region: 0x165, script: 0x5a, flags: 0x0}, - 1244: {region: 0x165, script: 0x5a, flags: 0x0}, - 1245: {region: 0x165, script: 0x5a, flags: 0x0}, - 1246: {region: 0x165, script: 0x5a, flags: 0x0}, - 1247: {region: 0x165, script: 0x5a, flags: 0x0}, - 1248: {region: 0x140, script: 0x5a, flags: 0x0}, - 1249: {region: 0x165, script: 0x5a, flags: 0x0}, - 1250: {region: 0x165, script: 0x5a, flags: 0x0}, - 1251: {region: 0xa8, script: 0x5, flags: 0x0}, - 1252: {region: 0x165, script: 0x5a, flags: 0x0}, - 1253: {region: 0x114, script: 0x5a, flags: 0x0}, - 1254: {region: 0x165, script: 0x5a, flags: 0x0}, - 1255: {region: 0x165, script: 0x5a, flags: 0x0}, - 1256: {region: 0x165, script: 0x5a, flags: 0x0}, - 1257: {region: 0x165, script: 0x5a, flags: 0x0}, - 1258: {region: 0x99, script: 0x22, flags: 0x0}, + 1213: {region: 0x166, script: 0x5b, flags: 0x0}, + 1214: {region: 0xb5, script: 0xf4, flags: 0x0}, + 1215: {region: 0x166, script: 0x5b, flags: 0x0}, + 1216: {region: 0x162, script: 0x5b, flags: 0x0}, + 1217: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1218: {region: 0x107, script: 0x5b, flags: 0x0}, + 1219: {region: 0x13f, script: 0x5b, flags: 0x0}, + 1220: {region: 0x11c, script: 0x5b, flags: 0x0}, + 1221: {region: 0x166, script: 0x5b, flags: 0x0}, + 1222: {region: 0x36, script: 0x5b, flags: 0x0}, + 1223: {region: 0x61, script: 0x5b, flags: 0x0}, + 1224: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1225: {region: 0x1, script: 0x5b, flags: 0x0}, + 1226: {region: 0x107, script: 0x5b, flags: 0x0}, + 1227: {region: 0x6b, script: 0x5b, flags: 0x0}, + 1228: {region: 0x130, script: 0x5b, flags: 0x0}, + 1229: {region: 0x166, script: 0x5b, flags: 0x0}, + 1230: {region: 0x36, script: 0x5b, flags: 0x0}, + 1231: {region: 0x4e, script: 0x5b, flags: 0x0}, + 1232: {region: 0x166, script: 0x5b, flags: 0x0}, + 1233: {region: 0x70, script: 0x2c, flags: 0x0}, + 1234: {region: 0x166, script: 0x5b, flags: 0x0}, + 1235: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1236: {region: 0x2f, script: 0x5b, flags: 0x0}, + 1237: {region: 0x9a, script: 0xe9, flags: 0x0}, + 1238: {region: 0x9a, script: 0x22, flags: 0x0}, + 1239: {region: 0x166, script: 0x5b, flags: 0x0}, + 1240: {region: 0x166, script: 0x5b, flags: 0x0}, + 1241: {region: 0x166, script: 0x5b, flags: 0x0}, + 1242: {region: 0x166, script: 0x5b, flags: 0x0}, + 1243: {region: 0x166, script: 0x5b, flags: 0x0}, + 1244: {region: 0x166, script: 0x5b, flags: 0x0}, + 1245: {region: 0x166, script: 0x5b, flags: 0x0}, + 1246: {region: 0x166, script: 0x5b, flags: 0x0}, + 1247: {region: 0x166, script: 0x5b, flags: 0x0}, + 1248: {region: 0x141, script: 0x5b, flags: 0x0}, + 1249: {region: 0x166, script: 0x5b, flags: 0x0}, + 1250: {region: 0x166, script: 0x5b, flags: 0x0}, + 1251: {region: 0xa9, script: 0x5, flags: 0x0}, + 1252: {region: 0x166, script: 0x5b, flags: 0x0}, + 1253: {region: 0x115, script: 0x5b, flags: 0x0}, + 1254: {region: 0x166, script: 0x5b, flags: 0x0}, + 1255: {region: 0x166, script: 0x5b, flags: 0x0}, + 1256: {region: 0x166, script: 0x5b, flags: 0x0}, + 1257: {region: 0x166, script: 0x5b, flags: 0x0}, + 1258: {region: 0x9a, script: 0x22, flags: 0x0}, 1259: {region: 0x53, script: 0x3b, flags: 0x0}, - 1260: {region: 0x165, script: 0x5a, flags: 0x0}, - 1261: {region: 0x165, script: 0x5a, flags: 0x0}, - 1262: {region: 0x41, script: 0x5a, flags: 0x0}, - 1263: {region: 0x165, script: 0x5a, flags: 0x0}, - 1264: {region: 0x12b, script: 0x18, flags: 0x0}, - 1265: {region: 0x165, script: 0x5a, flags: 0x0}, - 1266: {region: 0x161, script: 0x5a, flags: 0x0}, - 1267: {region: 0x165, script: 0x5a, flags: 0x0}, - 1268: {region: 0x12b, script: 0x62, flags: 0x0}, - 1269: {region: 0x12b, script: 0x63, flags: 0x0}, - 1270: {region: 0x7d, script: 0x2e, flags: 0x0}, - 1271: {region: 0x53, script: 0x67, flags: 0x0}, - 1272: {region: 0x10b, script: 0x6c, flags: 0x0}, - 1273: {region: 0x108, script: 0x77, flags: 0x0}, - 1274: {region: 0x99, script: 0x22, flags: 0x0}, - 1275: {region: 0x131, script: 0x5a, flags: 0x0}, - 1276: {region: 0x165, script: 0x5a, flags: 0x0}, - 1277: {region: 0x9c, script: 0x91, flags: 0x0}, - 1278: {region: 0x165, script: 0x5a, flags: 0x0}, - 1279: {region: 0x15e, script: 0xcc, flags: 0x0}, - 1280: {region: 0x165, script: 0x5a, flags: 0x0}, - 1281: {region: 0x165, script: 0x5a, flags: 0x0}, - 1282: {region: 0xdb, script: 0x22, flags: 0x0}, - 1283: {region: 0x165, script: 0x5a, flags: 0x0}, - 1284: {region: 0x165, script: 0x5a, flags: 0x0}, - 1285: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1286: {region: 0x75, script: 0x5a, flags: 0x0}, - 1287: {region: 0x165, script: 0x5a, flags: 0x0}, - 1288: {region: 0x165, script: 0x5a, flags: 0x0}, - 1289: {region: 0x52, script: 0x5a, flags: 0x0}, - 1290: {region: 0x165, script: 0x5a, flags: 0x0}, - 1291: {region: 0x165, script: 0x5a, flags: 0x0}, - 1292: {region: 0x165, script: 0x5a, flags: 0x0}, - 1293: {region: 0x52, script: 0x5a, flags: 0x0}, - 1294: {region: 0x165, script: 0x5a, flags: 0x0}, - 1295: {region: 0x165, script: 0x5a, flags: 0x0}, - 1296: {region: 0x165, script: 0x5a, flags: 0x0}, - 1297: {region: 0x165, script: 0x5a, flags: 0x0}, + 1260: {region: 0x166, script: 0x5b, flags: 0x0}, + 1261: {region: 0x166, script: 0x5b, flags: 0x0}, + 1262: {region: 0x41, script: 0x5b, flags: 0x0}, + 1263: {region: 0x166, script: 0x5b, flags: 0x0}, + 1264: {region: 0x12c, script: 0x18, flags: 0x0}, + 1265: {region: 0x166, script: 0x5b, flags: 0x0}, + 1266: {region: 0x162, script: 0x5b, flags: 0x0}, + 1267: {region: 0x166, script: 0x5b, flags: 0x0}, + 1268: {region: 0x12c, script: 0x63, flags: 0x0}, + 1269: {region: 0x12c, script: 0x64, flags: 0x0}, + 1270: {region: 0x7e, script: 0x2e, flags: 0x0}, + 1271: {region: 0x53, script: 0x68, flags: 0x0}, + 1272: {region: 0x10c, script: 0x6d, flags: 0x0}, + 1273: {region: 0x109, script: 0x79, flags: 0x0}, + 1274: {region: 0x9a, script: 0x22, flags: 0x0}, + 1275: {region: 0x132, script: 0x5b, flags: 0x0}, + 1276: {region: 0x166, script: 0x5b, flags: 0x0}, + 1277: {region: 0x9d, script: 0x93, flags: 0x0}, + 1278: {region: 0x166, script: 0x5b, flags: 0x0}, + 1279: {region: 0x15f, script: 0xce, flags: 0x0}, + 1280: {region: 0x166, script: 0x5b, flags: 0x0}, + 1281: {region: 0x166, script: 0x5b, flags: 0x0}, + 1282: {region: 0xdc, script: 0x22, flags: 0x0}, + 1283: {region: 0x166, script: 0x5b, flags: 0x0}, + 1284: {region: 0x166, script: 0x5b, flags: 0x0}, + 1285: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1286: {region: 0x76, script: 0x5b, flags: 0x0}, + 1287: {region: 0x166, script: 0x5b, flags: 0x0}, + 1288: {region: 0x166, script: 0x5b, flags: 0x0}, + 1289: {region: 0x52, script: 0x5b, flags: 0x0}, + 1290: {region: 0x166, script: 0x5b, flags: 0x0}, + 1291: {region: 0x166, script: 0x5b, flags: 0x0}, + 1292: {region: 0x166, script: 0x5b, flags: 0x0}, + 1293: {region: 0x52, script: 0x5b, flags: 0x0}, + 1294: {region: 0x166, script: 0x5b, flags: 0x0}, + 1295: {region: 0x166, script: 0x5b, flags: 0x0}, + 1296: {region: 0x166, script: 0x5b, flags: 0x0}, + 1297: {region: 0x166, script: 0x5b, flags: 0x0}, 1298: {region: 0x1, script: 0x3e, flags: 0x0}, - 1299: {region: 0x165, script: 0x5a, flags: 0x0}, - 1300: {region: 0x165, script: 0x5a, flags: 0x0}, - 1301: {region: 0x165, script: 0x5a, flags: 0x0}, - 1302: {region: 0x165, script: 0x5a, flags: 0x0}, - 1303: {region: 0x165, script: 0x5a, flags: 0x0}, - 1304: {region: 0xd6, script: 0x5a, flags: 0x0}, - 1305: {region: 0x165, script: 0x5a, flags: 0x0}, - 1306: {region: 0x165, script: 0x5a, flags: 0x0}, - 1307: {region: 0x165, script: 0x5a, flags: 0x0}, - 1308: {region: 0x41, script: 0x5a, flags: 0x0}, - 1309: {region: 0x165, script: 0x5a, flags: 0x0}, - 1310: {region: 0xcf, script: 0x5a, flags: 0x0}, + 1299: {region: 0x166, script: 0x5b, flags: 0x0}, + 1300: {region: 0x166, script: 0x5b, flags: 0x0}, + 1301: {region: 0x166, script: 0x5b, flags: 0x0}, + 1302: {region: 0x166, script: 0x5b, flags: 0x0}, + 1303: {region: 0x166, script: 0x5b, flags: 0x0}, + 1304: {region: 0xd7, script: 0x5b, flags: 0x0}, + 1305: {region: 0x166, script: 0x5b, flags: 0x0}, + 1306: {region: 0x166, script: 0x5b, flags: 0x0}, + 1307: {region: 0x166, script: 0x5b, flags: 0x0}, + 1308: {region: 0x41, script: 0x5b, flags: 0x0}, + 1309: {region: 0x166, script: 0x5b, flags: 0x0}, + 1310: {region: 0xd0, script: 0x5b, flags: 0x0}, 1311: {region: 0x4a, script: 0x3, flags: 0x1}, - 1312: {region: 0x165, script: 0x5a, flags: 0x0}, - 1313: {region: 0x165, script: 0x5a, flags: 0x0}, - 1314: {region: 0x165, script: 0x5a, flags: 0x0}, - 1315: {region: 0x53, script: 0x5a, flags: 0x0}, - 1316: {region: 0x10b, script: 0x5a, flags: 0x0}, - 1318: {region: 0xa8, script: 0x5, flags: 0x0}, - 1319: {region: 0xd9, script: 0x5a, flags: 0x0}, - 1320: {region: 0xba, script: 0xe8, flags: 0x0}, + 1312: {region: 0x166, script: 0x5b, flags: 0x0}, + 1313: {region: 0x166, script: 0x5b, flags: 0x0}, + 1314: {region: 0x166, script: 0x5b, flags: 0x0}, + 1315: {region: 0x53, script: 0x5b, flags: 0x0}, + 1316: {region: 0x10c, script: 0x5b, flags: 0x0}, + 1318: {region: 0xa9, script: 0x5, flags: 0x0}, + 1319: {region: 0xda, script: 0x5b, flags: 0x0}, + 1320: {region: 0xbb, script: 0xeb, flags: 0x0}, 1321: {region: 0x4d, script: 0x14, flags: 0x1}, - 1322: {region: 0x53, script: 0x7d, flags: 0x0}, - 1323: {region: 0x165, script: 0x5a, flags: 0x0}, - 1324: {region: 0x122, script: 0x5a, flags: 0x0}, - 1325: {region: 0xd0, script: 0x5a, flags: 0x0}, - 1326: {region: 0x165, script: 0x5a, flags: 0x0}, - 1327: {region: 0x161, script: 0x5a, flags: 0x0}, - 1329: {region: 0x12b, script: 0x5a, flags: 0x0}, + 1322: {region: 0x53, script: 0x7f, flags: 0x0}, + 1323: {region: 0x166, script: 0x5b, flags: 0x0}, + 1324: {region: 0x123, script: 0x5b, flags: 0x0}, + 1325: {region: 0xd1, script: 0x5b, flags: 0x0}, + 1326: {region: 0x166, script: 0x5b, flags: 0x0}, + 1327: {region: 0x162, script: 0x5b, flags: 0x0}, + 1329: {region: 0x12c, script: 0x5b, flags: 0x0}, } // likelyLangList holds lists info associated with likelyLang. // Size: 582 bytes, 97 elements var likelyLangList = [97]likelyScriptRegion{ - 0: {region: 0x9c, script: 0x7, flags: 0x0}, - 1: {region: 0xa1, script: 0x78, flags: 0x2}, - 2: {region: 0x11c, script: 0x85, flags: 0x2}, - 3: {region: 0x32, script: 0x5a, flags: 0x0}, - 4: {region: 0x9b, script: 0x5, flags: 0x4}, - 5: {region: 0x9c, script: 0x5, flags: 0x4}, - 6: {region: 0x106, script: 0x20, flags: 0x4}, - 7: {region: 0x9c, script: 0x5, flags: 0x2}, - 8: {region: 0x106, script: 0x20, flags: 0x0}, + 0: {region: 0x9d, script: 0x7, flags: 0x0}, + 1: {region: 0xa2, script: 0x7a, flags: 0x2}, + 2: {region: 0x11d, script: 0x87, flags: 0x2}, + 3: {region: 0x32, script: 0x5b, flags: 0x0}, + 4: {region: 0x9c, script: 0x5, flags: 0x4}, + 5: {region: 0x9d, script: 0x5, flags: 0x4}, + 6: {region: 0x107, script: 0x20, flags: 0x4}, + 7: {region: 0x9d, script: 0x5, flags: 0x2}, + 8: {region: 0x107, script: 0x20, flags: 0x0}, 9: {region: 0x38, script: 0x2f, flags: 0x2}, - 10: {region: 0x135, script: 0x5a, flags: 0x0}, - 11: {region: 0x7b, script: 0xcf, flags: 0x2}, - 12: {region: 0x114, script: 0x5a, flags: 0x0}, - 13: {region: 0x84, script: 0x1, flags: 0x2}, - 14: {region: 0x5d, script: 0x1f, flags: 0x0}, - 15: {region: 0x87, script: 0x5f, flags: 0x2}, - 16: {region: 0xd6, script: 0x5a, flags: 0x0}, + 10: {region: 0x136, script: 0x5b, flags: 0x0}, + 11: {region: 0x7c, script: 0xd1, flags: 0x2}, + 12: {region: 0x115, script: 0x5b, flags: 0x0}, + 13: {region: 0x85, script: 0x1, flags: 0x2}, + 14: {region: 0x5e, script: 0x1f, flags: 0x0}, + 15: {region: 0x88, script: 0x60, flags: 0x2}, + 16: {region: 0xd7, script: 0x5b, flags: 0x0}, 17: {region: 0x52, script: 0x5, flags: 0x4}, - 18: {region: 0x10b, script: 0x5, flags: 0x4}, - 19: {region: 0xae, script: 0x20, flags: 0x0}, + 18: {region: 0x10c, script: 0x5, flags: 0x4}, + 19: {region: 0xaf, script: 0x20, flags: 0x0}, 20: {region: 0x24, script: 0x5, flags: 0x4}, 21: {region: 0x53, script: 0x5, flags: 0x4}, - 22: {region: 0x9c, script: 0x5, flags: 0x4}, - 23: {region: 0xc5, script: 0x5, flags: 0x4}, + 22: {region: 0x9d, script: 0x5, flags: 0x4}, + 23: {region: 0xc6, script: 0x5, flags: 0x4}, 24: {region: 0x53, script: 0x5, flags: 0x2}, - 25: {region: 0x12b, script: 0x5a, flags: 0x0}, - 26: {region: 0xb0, script: 0x5, flags: 0x4}, - 27: {region: 0x9b, script: 0x5, flags: 0x2}, - 28: {region: 0xa5, script: 0x20, flags: 0x0}, + 25: {region: 0x12c, script: 0x5b, flags: 0x0}, + 26: {region: 0xb1, script: 0x5, flags: 0x4}, + 27: {region: 0x9c, script: 0x5, flags: 0x2}, + 28: {region: 0xa6, script: 0x20, flags: 0x0}, 29: {region: 0x53, script: 0x5, flags: 0x4}, - 30: {region: 0x12b, script: 0x5a, flags: 0x4}, + 30: {region: 0x12c, script: 0x5b, flags: 0x4}, 31: {region: 0x53, script: 0x5, flags: 0x2}, - 32: {region: 0x12b, script: 0x5a, flags: 0x2}, - 33: {region: 0xdb, script: 0x22, flags: 0x0}, - 34: {region: 0x99, script: 0x5d, flags: 0x2}, - 35: {region: 0x83, script: 0x5a, flags: 0x0}, - 36: {region: 0x84, script: 0x7c, flags: 0x4}, - 37: {region: 0x84, script: 0x7c, flags: 0x2}, - 38: {region: 0xc5, script: 0x20, flags: 0x0}, - 39: {region: 0x53, script: 0x70, flags: 0x4}, - 40: {region: 0x53, script: 0x70, flags: 0x2}, - 41: {region: 0xd0, script: 0x5a, flags: 0x0}, + 32: {region: 0x12c, script: 0x5b, flags: 0x2}, + 33: {region: 0xdc, script: 0x22, flags: 0x0}, + 34: {region: 0x9a, script: 0x5e, flags: 0x2}, + 35: {region: 0x84, script: 0x5b, flags: 0x0}, + 36: {region: 0x85, script: 0x7e, flags: 0x4}, + 37: {region: 0x85, script: 0x7e, flags: 0x2}, + 38: {region: 0xc6, script: 0x20, flags: 0x0}, + 39: {region: 0x53, script: 0x71, flags: 0x4}, + 40: {region: 0x53, script: 0x71, flags: 0x2}, + 41: {region: 0xd1, script: 0x5b, flags: 0x0}, 42: {region: 0x4a, script: 0x5, flags: 0x4}, - 43: {region: 0x95, script: 0x5, flags: 0x4}, - 44: {region: 0x99, script: 0x36, flags: 0x0}, - 45: {region: 0xe8, script: 0x5, flags: 0x4}, - 46: {region: 0xe8, script: 0x5, flags: 0x2}, - 47: {region: 0x9c, script: 0x8b, flags: 0x0}, - 48: {region: 0x53, script: 0x8c, flags: 0x2}, - 49: {region: 0xba, script: 0xe8, flags: 0x0}, - 50: {region: 0xd9, script: 0x5a, flags: 0x4}, - 51: {region: 0xe8, script: 0x5, flags: 0x0}, - 52: {region: 0x99, script: 0x22, flags: 0x2}, - 53: {region: 0x99, script: 0x4f, flags: 0x2}, - 54: {region: 0x99, script: 0xd3, flags: 0x2}, - 55: {region: 0x105, script: 0x20, flags: 0x0}, - 56: {region: 0xbd, script: 0x5a, flags: 0x4}, - 57: {region: 0x104, script: 0x5a, flags: 0x4}, - 58: {region: 0x106, script: 0x5a, flags: 0x4}, - 59: {region: 0x12b, script: 0x5a, flags: 0x4}, - 60: {region: 0x124, script: 0x20, flags: 0x0}, - 61: {region: 0xe8, script: 0x5, flags: 0x4}, - 62: {region: 0xe8, script: 0x5, flags: 0x2}, + 43: {region: 0x96, script: 0x5, flags: 0x4}, + 44: {region: 0x9a, script: 0x36, flags: 0x0}, + 45: {region: 0xe9, script: 0x5, flags: 0x4}, + 46: {region: 0xe9, script: 0x5, flags: 0x2}, + 47: {region: 0x9d, script: 0x8d, flags: 0x0}, + 48: {region: 0x53, script: 0x8e, flags: 0x2}, + 49: {region: 0xbb, script: 0xeb, flags: 0x0}, + 50: {region: 0xda, script: 0x5b, flags: 0x4}, + 51: {region: 0xe9, script: 0x5, flags: 0x0}, + 52: {region: 0x9a, script: 0x22, flags: 0x2}, + 53: {region: 0x9a, script: 0x50, flags: 0x2}, + 54: {region: 0x9a, script: 0xd5, flags: 0x2}, + 55: {region: 0x106, script: 0x20, flags: 0x0}, + 56: {region: 0xbe, script: 0x5b, flags: 0x4}, + 57: {region: 0x105, script: 0x5b, flags: 0x4}, + 58: {region: 0x107, script: 0x5b, flags: 0x4}, + 59: {region: 0x12c, script: 0x5b, flags: 0x4}, + 60: {region: 0x125, script: 0x20, flags: 0x0}, + 61: {region: 0xe9, script: 0x5, flags: 0x4}, + 62: {region: 0xe9, script: 0x5, flags: 0x2}, 63: {region: 0x53, script: 0x5, flags: 0x0}, - 64: {region: 0xae, script: 0x20, flags: 0x4}, - 65: {region: 0xc5, script: 0x20, flags: 0x4}, - 66: {region: 0xae, script: 0x20, flags: 0x2}, - 67: {region: 0x99, script: 0xe, flags: 0x0}, - 68: {region: 0xdb, script: 0x22, flags: 0x4}, - 69: {region: 0xdb, script: 0x22, flags: 0x2}, - 70: {region: 0x137, script: 0x5a, flags: 0x0}, + 64: {region: 0xaf, script: 0x20, flags: 0x4}, + 65: {region: 0xc6, script: 0x20, flags: 0x4}, + 66: {region: 0xaf, script: 0x20, flags: 0x2}, + 67: {region: 0x9a, script: 0xe, flags: 0x0}, + 68: {region: 0xdc, script: 0x22, flags: 0x4}, + 69: {region: 0xdc, script: 0x22, flags: 0x2}, + 70: {region: 0x138, script: 0x5b, flags: 0x0}, 71: {region: 0x24, script: 0x5, flags: 0x4}, 72: {region: 0x53, script: 0x20, flags: 0x4}, 73: {region: 0x24, script: 0x5, flags: 0x2}, - 74: {region: 0x8d, script: 0x3c, flags: 0x0}, + 74: {region: 0x8e, script: 0x3c, flags: 0x0}, 75: {region: 0x53, script: 0x3b, flags: 0x4}, 76: {region: 0x53, script: 0x3b, flags: 0x2}, 77: {region: 0x53, script: 0x3b, flags: 0x0}, 78: {region: 0x2f, script: 0x3c, flags: 0x4}, 79: {region: 0x3e, script: 0x3c, flags: 0x4}, - 80: {region: 0x7b, script: 0x3c, flags: 0x4}, - 81: {region: 0x7e, script: 0x3c, flags: 0x4}, - 82: {region: 0x8d, script: 0x3c, flags: 0x4}, - 83: {region: 0x95, script: 0x3c, flags: 0x4}, - 84: {region: 0xc6, script: 0x3c, flags: 0x4}, - 85: {region: 0xd0, script: 0x3c, flags: 0x4}, - 86: {region: 0xe2, script: 0x3c, flags: 0x4}, - 87: {region: 0xe5, script: 0x3c, flags: 0x4}, - 88: {region: 0xe7, script: 0x3c, flags: 0x4}, - 89: {region: 0x116, script: 0x3c, flags: 0x4}, - 90: {region: 0x123, script: 0x3c, flags: 0x4}, - 91: {region: 0x12e, script: 0x3c, flags: 0x4}, - 92: {region: 0x135, script: 0x3c, flags: 0x4}, - 93: {region: 0x13e, script: 0x3c, flags: 0x4}, - 94: {region: 0x12e, script: 0x11, flags: 0x2}, - 95: {region: 0x12e, script: 0x37, flags: 0x2}, - 96: {region: 0x12e, script: 0x3c, flags: 0x2}, + 80: {region: 0x7c, script: 0x3c, flags: 0x4}, + 81: {region: 0x7f, script: 0x3c, flags: 0x4}, + 82: {region: 0x8e, script: 0x3c, flags: 0x4}, + 83: {region: 0x96, script: 0x3c, flags: 0x4}, + 84: {region: 0xc7, script: 0x3c, flags: 0x4}, + 85: {region: 0xd1, script: 0x3c, flags: 0x4}, + 86: {region: 0xe3, script: 0x3c, flags: 0x4}, + 87: {region: 0xe6, script: 0x3c, flags: 0x4}, + 88: {region: 0xe8, script: 0x3c, flags: 0x4}, + 89: {region: 0x117, script: 0x3c, flags: 0x4}, + 90: {region: 0x124, script: 0x3c, flags: 0x4}, + 91: {region: 0x12f, script: 0x3c, flags: 0x4}, + 92: {region: 0x136, script: 0x3c, flags: 0x4}, + 93: {region: 0x13f, script: 0x3c, flags: 0x4}, + 94: {region: 0x12f, script: 0x11, flags: 0x2}, + 95: {region: 0x12f, script: 0x37, flags: 0x2}, + 96: {region: 0x12f, script: 0x3c, flags: 0x2}, } type likelyLangScript struct { @@ -2987,306 +3009,306 @@ 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: 2148 bytes, 358 elements -var likelyRegion = [358]likelyLangScript{ - 34: {lang: 0xd7, script: 0x5a, flags: 0x0}, +// Size: 2154 bytes, 359 elements +var likelyRegion = [359]likelyLangScript{ + 34: {lang: 0xd7, script: 0x5b, flags: 0x0}, 35: {lang: 0x3a, script: 0x5, flags: 0x0}, 36: {lang: 0x0, script: 0x2, flags: 0x1}, 39: {lang: 0x2, script: 0x2, flags: 0x1}, 40: {lang: 0x4, script: 0x2, flags: 0x1}, - 42: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 43: {lang: 0x0, script: 0x5a, flags: 0x0}, - 44: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 45: {lang: 0x41b, script: 0x5a, flags: 0x0}, - 46: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 48: {lang: 0x367, script: 0x5a, flags: 0x0}, - 49: {lang: 0x444, script: 0x5a, flags: 0x0}, - 50: {lang: 0x58, script: 0x5a, flags: 0x0}, + 42: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 43: {lang: 0x0, script: 0x5b, flags: 0x0}, + 44: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 45: {lang: 0x41b, script: 0x5b, flags: 0x0}, + 46: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 48: {lang: 0x367, script: 0x5b, flags: 0x0}, + 49: {lang: 0x444, script: 0x5b, flags: 0x0}, + 50: {lang: 0x58, script: 0x5b, flags: 0x0}, 51: {lang: 0x6, script: 0x2, flags: 0x1}, 53: {lang: 0xa5, script: 0xe, flags: 0x0}, - 54: {lang: 0x367, script: 0x5a, flags: 0x0}, - 55: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 54: {lang: 0x367, script: 0x5b, flags: 0x0}, + 55: {lang: 0x15e, script: 0x5b, flags: 0x0}, 56: {lang: 0x7e, script: 0x20, flags: 0x0}, 57: {lang: 0x3a, script: 0x5, flags: 0x0}, - 58: {lang: 0x3d9, script: 0x5a, flags: 0x0}, - 59: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 60: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 62: {lang: 0x31f, script: 0x5a, flags: 0x0}, - 63: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 64: {lang: 0x3a1, script: 0x5a, flags: 0x0}, - 65: {lang: 0x3c0, script: 0x5a, flags: 0x0}, + 58: {lang: 0x3d9, script: 0x5b, flags: 0x0}, + 59: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 60: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 62: {lang: 0x31f, script: 0x5b, flags: 0x0}, + 63: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 64: {lang: 0x3a1, script: 0x5b, flags: 0x0}, + 65: {lang: 0x3c0, script: 0x5b, flags: 0x0}, 67: {lang: 0x8, script: 0x2, flags: 0x1}, - 69: {lang: 0x0, script: 0x5a, flags: 0x0}, + 69: {lang: 0x0, script: 0x5b, flags: 0x0}, 71: {lang: 0x71, script: 0x20, flags: 0x0}, 73: {lang: 0x512, script: 0x3e, flags: 0x2}, 74: {lang: 0x31f, script: 0x5, flags: 0x2}, - 75: {lang: 0x445, script: 0x5a, flags: 0x0}, - 76: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 77: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 78: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 79: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 81: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 82: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 75: {lang: 0x445, script: 0x5b, flags: 0x0}, + 76: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 77: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 78: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 79: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 81: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 82: {lang: 0x15e, script: 0x5b, flags: 0x0}, 83: {lang: 0xa, script: 0x4, flags: 0x1}, - 84: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 85: {lang: 0x0, script: 0x5a, flags: 0x0}, - 86: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 89: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 90: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 91: {lang: 0x3a1, script: 0x5a, flags: 0x0}, - 93: {lang: 0xe, script: 0x2, flags: 0x1}, - 94: {lang: 0xfa, script: 0x5a, flags: 0x0}, - 96: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 98: {lang: 0x1, script: 0x5a, flags: 0x0}, - 99: {lang: 0x101, script: 0x5a, flags: 0x0}, - 101: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 103: {lang: 0x10, script: 0x2, flags: 0x1}, - 104: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 105: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 106: {lang: 0x140, script: 0x5a, flags: 0x0}, - 107: {lang: 0x3a, script: 0x5, flags: 0x0}, + 84: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 85: {lang: 0x0, script: 0x5b, flags: 0x0}, + 87: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 90: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 91: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 92: {lang: 0x3a1, script: 0x5b, flags: 0x0}, + 94: {lang: 0xe, script: 0x2, flags: 0x1}, + 95: {lang: 0xfa, script: 0x5b, flags: 0x0}, + 97: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 99: {lang: 0x1, script: 0x5b, flags: 0x0}, + 100: {lang: 0x101, script: 0x5b, flags: 0x0}, + 102: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 104: {lang: 0x10, script: 0x2, flags: 0x1}, + 105: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 106: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 107: {lang: 0x140, script: 0x5b, flags: 0x0}, 108: {lang: 0x3a, script: 0x5, flags: 0x0}, - 109: {lang: 0x46f, script: 0x2c, flags: 0x0}, - 110: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 111: {lang: 0x12, script: 0x2, flags: 0x1}, - 113: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 114: {lang: 0x151, script: 0x5a, flags: 0x0}, - 115: {lang: 0x1c0, script: 0x22, flags: 0x2}, - 118: {lang: 0x158, script: 0x5a, flags: 0x0}, - 120: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 122: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 123: {lang: 0x14, script: 0x2, flags: 0x1}, - 125: {lang: 0x16, script: 0x3, flags: 0x1}, - 126: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 128: {lang: 0x21, script: 0x5a, flags: 0x0}, - 130: {lang: 0x245, script: 0x5a, flags: 0x0}, - 132: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 133: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 134: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 135: {lang: 0x19, script: 0x2, flags: 0x1}, - 136: {lang: 0x0, script: 0x5a, flags: 0x0}, - 137: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 139: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 141: {lang: 0x529, script: 0x3c, flags: 0x0}, - 142: {lang: 0x0, script: 0x5a, flags: 0x0}, - 143: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 144: {lang: 0x1d1, script: 0x5a, flags: 0x0}, - 145: {lang: 0x1d4, script: 0x5a, flags: 0x0}, - 146: {lang: 0x1d5, script: 0x5a, flags: 0x0}, - 148: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 149: {lang: 0x1b, script: 0x2, flags: 0x1}, - 151: {lang: 0x1bc, script: 0x3e, flags: 0x0}, - 153: {lang: 0x1d, script: 0x3, flags: 0x1}, - 155: {lang: 0x3a, script: 0x5, flags: 0x0}, - 156: {lang: 0x20, script: 0x2, flags: 0x1}, - 157: {lang: 0x1f8, script: 0x5a, flags: 0x0}, - 158: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 161: {lang: 0x3a, script: 0x5, flags: 0x0}, - 162: {lang: 0x200, script: 0x49, flags: 0x0}, - 164: {lang: 0x445, script: 0x5a, flags: 0x0}, - 165: {lang: 0x28a, script: 0x20, flags: 0x0}, - 166: {lang: 0x22, script: 0x3, flags: 0x1}, - 168: {lang: 0x25, script: 0x2, flags: 0x1}, - 170: {lang: 0x254, script: 0x53, flags: 0x0}, - 171: {lang: 0x254, script: 0x53, flags: 0x0}, - 172: {lang: 0x3a, script: 0x5, flags: 0x0}, - 174: {lang: 0x3e2, script: 0x20, flags: 0x0}, - 175: {lang: 0x27, script: 0x2, flags: 0x1}, - 176: {lang: 0x3a, script: 0x5, flags: 0x0}, - 178: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 179: {lang: 0x40c, script: 0xd4, flags: 0x0}, - 181: {lang: 0x43b, script: 0x5a, flags: 0x0}, - 182: {lang: 0x2c0, script: 0x5a, flags: 0x0}, - 183: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 184: {lang: 0x2c7, script: 0x5a, flags: 0x0}, - 185: {lang: 0x3a, script: 0x5, flags: 0x0}, - 186: {lang: 0x29, script: 0x2, flags: 0x1}, - 187: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 188: {lang: 0x2b, script: 0x2, flags: 0x1}, - 189: {lang: 0x432, script: 0x5a, flags: 0x0}, - 190: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 191: {lang: 0x2f1, script: 0x5a, flags: 0x0}, - 194: {lang: 0x2d, script: 0x2, flags: 0x1}, - 195: {lang: 0xa0, script: 0x5a, flags: 0x0}, - 196: {lang: 0x2f, script: 0x2, flags: 0x1}, - 197: {lang: 0x31, script: 0x2, flags: 0x1}, - 198: {lang: 0x33, script: 0x2, flags: 0x1}, - 200: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 201: {lang: 0x35, script: 0x2, flags: 0x1}, - 203: {lang: 0x320, script: 0x5a, flags: 0x0}, - 204: {lang: 0x37, script: 0x3, flags: 0x1}, - 205: {lang: 0x128, script: 0xea, flags: 0x0}, - 207: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 208: {lang: 0x31f, script: 0x5a, flags: 0x0}, - 209: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 210: {lang: 0x16, script: 0x5a, flags: 0x0}, - 211: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 212: {lang: 0x1b4, script: 0x5a, flags: 0x0}, - 214: {lang: 0x1b4, script: 0x5, flags: 0x2}, - 216: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 217: {lang: 0x367, script: 0x5a, flags: 0x0}, - 218: {lang: 0x347, script: 0x5a, flags: 0x0}, - 219: {lang: 0x351, script: 0x22, flags: 0x0}, - 225: {lang: 0x3a, script: 0x5, flags: 0x0}, - 226: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 228: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 229: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 230: {lang: 0x486, script: 0x5a, flags: 0x0}, - 231: {lang: 0x153, script: 0x5a, flags: 0x0}, - 232: {lang: 0x3a, script: 0x3, flags: 0x1}, - 233: {lang: 0x3b3, script: 0x5a, flags: 0x0}, - 234: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 236: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 237: {lang: 0x3a, script: 0x5, flags: 0x0}, - 238: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 240: {lang: 0x3a2, script: 0x5a, flags: 0x0}, - 241: {lang: 0x194, script: 0x5a, flags: 0x0}, - 243: {lang: 0x3a, script: 0x5, flags: 0x0}, - 258: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 260: {lang: 0x3d, script: 0x2, flags: 0x1}, - 261: {lang: 0x432, script: 0x20, flags: 0x0}, - 262: {lang: 0x3f, script: 0x2, flags: 0x1}, - 263: {lang: 0x3e5, script: 0x5a, flags: 0x0}, - 264: {lang: 0x3a, script: 0x5, flags: 0x0}, - 266: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 267: {lang: 0x3a, script: 0x5, flags: 0x0}, - 268: {lang: 0x41, script: 0x2, flags: 0x1}, - 271: {lang: 0x416, script: 0x5a, flags: 0x0}, - 272: {lang: 0x347, script: 0x5a, flags: 0x0}, - 273: {lang: 0x43, script: 0x2, flags: 0x1}, - 275: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 276: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 277: {lang: 0x429, script: 0x5a, flags: 0x0}, - 278: {lang: 0x367, script: 0x5a, flags: 0x0}, - 280: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 282: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 284: {lang: 0x45, script: 0x2, flags: 0x1}, - 288: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 289: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 290: {lang: 0x47, script: 0x2, flags: 0x1}, - 291: {lang: 0x49, script: 0x3, flags: 0x1}, - 292: {lang: 0x4c, script: 0x2, flags: 0x1}, - 293: {lang: 0x477, script: 0x5a, flags: 0x0}, - 294: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 295: {lang: 0x476, script: 0x5a, flags: 0x0}, - 296: {lang: 0x4e, script: 0x2, flags: 0x1}, - 297: {lang: 0x482, script: 0x5a, flags: 0x0}, - 299: {lang: 0x50, script: 0x4, flags: 0x1}, - 301: {lang: 0x4a0, script: 0x5a, flags: 0x0}, - 302: {lang: 0x54, script: 0x2, flags: 0x1}, - 303: {lang: 0x445, script: 0x5a, flags: 0x0}, - 304: {lang: 0x56, script: 0x3, flags: 0x1}, - 305: {lang: 0x445, script: 0x5a, flags: 0x0}, - 309: {lang: 0x512, script: 0x3e, flags: 0x2}, - 310: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 311: {lang: 0x4bc, script: 0x5a, flags: 0x0}, - 312: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 315: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 318: {lang: 0x4c3, script: 0x5a, flags: 0x0}, - 319: {lang: 0x8a, script: 0x5a, flags: 0x0}, - 320: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 322: {lang: 0x41b, script: 0x5a, flags: 0x0}, - 333: {lang: 0x59, script: 0x2, flags: 0x1}, - 350: {lang: 0x3a, script: 0x5, flags: 0x0}, - 351: {lang: 0x5b, script: 0x2, flags: 0x1}, - 356: {lang: 0x423, script: 0x5a, flags: 0x0}, + 109: {lang: 0x3a, script: 0x5, flags: 0x0}, + 110: {lang: 0x46f, script: 0x2c, flags: 0x0}, + 111: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 112: {lang: 0x12, script: 0x2, flags: 0x1}, + 114: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 115: {lang: 0x151, script: 0x5b, flags: 0x0}, + 116: {lang: 0x1c0, script: 0x22, flags: 0x2}, + 119: {lang: 0x158, script: 0x5b, flags: 0x0}, + 121: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 123: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 124: {lang: 0x14, script: 0x2, flags: 0x1}, + 126: {lang: 0x16, script: 0x3, flags: 0x1}, + 127: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 129: {lang: 0x21, script: 0x5b, flags: 0x0}, + 131: {lang: 0x245, script: 0x5b, flags: 0x0}, + 133: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 134: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 135: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 136: {lang: 0x19, script: 0x2, flags: 0x1}, + 137: {lang: 0x0, script: 0x5b, flags: 0x0}, + 138: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 140: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 142: {lang: 0x529, script: 0x3c, flags: 0x0}, + 143: {lang: 0x0, script: 0x5b, flags: 0x0}, + 144: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 145: {lang: 0x1d1, script: 0x5b, flags: 0x0}, + 146: {lang: 0x1d4, script: 0x5b, flags: 0x0}, + 147: {lang: 0x1d5, script: 0x5b, flags: 0x0}, + 149: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 150: {lang: 0x1b, script: 0x2, flags: 0x1}, + 152: {lang: 0x1bc, script: 0x3e, flags: 0x0}, + 154: {lang: 0x1d, script: 0x3, flags: 0x1}, + 156: {lang: 0x3a, script: 0x5, flags: 0x0}, + 157: {lang: 0x20, script: 0x2, flags: 0x1}, + 158: {lang: 0x1f8, script: 0x5b, flags: 0x0}, + 159: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 162: {lang: 0x3a, script: 0x5, flags: 0x0}, + 163: {lang: 0x200, script: 0x49, flags: 0x0}, + 165: {lang: 0x445, script: 0x5b, flags: 0x0}, + 166: {lang: 0x28a, script: 0x20, flags: 0x0}, + 167: {lang: 0x22, script: 0x3, flags: 0x1}, + 169: {lang: 0x25, script: 0x2, flags: 0x1}, + 171: {lang: 0x254, script: 0x54, flags: 0x0}, + 172: {lang: 0x254, script: 0x54, flags: 0x0}, + 173: {lang: 0x3a, script: 0x5, flags: 0x0}, + 175: {lang: 0x3e2, script: 0x20, flags: 0x0}, + 176: {lang: 0x27, script: 0x2, flags: 0x1}, + 177: {lang: 0x3a, script: 0x5, flags: 0x0}, + 179: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 180: {lang: 0x40c, script: 0xd6, flags: 0x0}, + 182: {lang: 0x43b, script: 0x5b, flags: 0x0}, + 183: {lang: 0x2c0, script: 0x5b, flags: 0x0}, + 184: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 185: {lang: 0x2c7, script: 0x5b, flags: 0x0}, + 186: {lang: 0x3a, script: 0x5, flags: 0x0}, + 187: {lang: 0x29, script: 0x2, flags: 0x1}, + 188: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 189: {lang: 0x2b, script: 0x2, flags: 0x1}, + 190: {lang: 0x432, script: 0x5b, flags: 0x0}, + 191: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 192: {lang: 0x2f1, script: 0x5b, flags: 0x0}, + 195: {lang: 0x2d, script: 0x2, flags: 0x1}, + 196: {lang: 0xa0, script: 0x5b, flags: 0x0}, + 197: {lang: 0x2f, script: 0x2, flags: 0x1}, + 198: {lang: 0x31, script: 0x2, flags: 0x1}, + 199: {lang: 0x33, script: 0x2, flags: 0x1}, + 201: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 202: {lang: 0x35, script: 0x2, flags: 0x1}, + 204: {lang: 0x320, script: 0x5b, flags: 0x0}, + 205: {lang: 0x37, script: 0x3, flags: 0x1}, + 206: {lang: 0x128, script: 0xed, flags: 0x0}, + 208: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 209: {lang: 0x31f, script: 0x5b, flags: 0x0}, + 210: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 211: {lang: 0x16, script: 0x5b, flags: 0x0}, + 212: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 213: {lang: 0x1b4, script: 0x5b, flags: 0x0}, + 215: {lang: 0x1b4, script: 0x5, flags: 0x2}, + 217: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 218: {lang: 0x367, script: 0x5b, flags: 0x0}, + 219: {lang: 0x347, script: 0x5b, flags: 0x0}, + 220: {lang: 0x351, script: 0x22, flags: 0x0}, + 226: {lang: 0x3a, script: 0x5, flags: 0x0}, + 227: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 229: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 230: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 231: {lang: 0x486, script: 0x5b, flags: 0x0}, + 232: {lang: 0x153, script: 0x5b, flags: 0x0}, + 233: {lang: 0x3a, script: 0x3, flags: 0x1}, + 234: {lang: 0x3b3, script: 0x5b, flags: 0x0}, + 235: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 237: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 238: {lang: 0x3a, script: 0x5, flags: 0x0}, + 239: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 241: {lang: 0x3a2, script: 0x5b, flags: 0x0}, + 242: {lang: 0x194, script: 0x5b, flags: 0x0}, + 244: {lang: 0x3a, script: 0x5, flags: 0x0}, + 259: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 261: {lang: 0x3d, script: 0x2, flags: 0x1}, + 262: {lang: 0x432, script: 0x20, flags: 0x0}, + 263: {lang: 0x3f, script: 0x2, flags: 0x1}, + 264: {lang: 0x3e5, script: 0x5b, flags: 0x0}, + 265: {lang: 0x3a, script: 0x5, flags: 0x0}, + 267: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 268: {lang: 0x3a, script: 0x5, flags: 0x0}, + 269: {lang: 0x41, script: 0x2, flags: 0x1}, + 272: {lang: 0x416, script: 0x5b, flags: 0x0}, + 273: {lang: 0x347, script: 0x5b, flags: 0x0}, + 274: {lang: 0x43, script: 0x2, flags: 0x1}, + 276: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 277: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 278: {lang: 0x429, script: 0x5b, flags: 0x0}, + 279: {lang: 0x367, script: 0x5b, flags: 0x0}, + 281: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 283: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 285: {lang: 0x45, script: 0x2, flags: 0x1}, + 289: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 290: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 291: {lang: 0x47, script: 0x2, flags: 0x1}, + 292: {lang: 0x49, script: 0x3, flags: 0x1}, + 293: {lang: 0x4c, script: 0x2, flags: 0x1}, + 294: {lang: 0x477, script: 0x5b, flags: 0x0}, + 295: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 296: {lang: 0x476, script: 0x5b, flags: 0x0}, + 297: {lang: 0x4e, script: 0x2, flags: 0x1}, + 298: {lang: 0x482, script: 0x5b, flags: 0x0}, + 300: {lang: 0x50, script: 0x4, flags: 0x1}, + 302: {lang: 0x4a0, script: 0x5b, flags: 0x0}, + 303: {lang: 0x54, script: 0x2, flags: 0x1}, + 304: {lang: 0x445, script: 0x5b, flags: 0x0}, + 305: {lang: 0x56, script: 0x3, flags: 0x1}, + 306: {lang: 0x445, script: 0x5b, flags: 0x0}, + 310: {lang: 0x512, script: 0x3e, flags: 0x2}, + 311: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 312: {lang: 0x4bc, script: 0x5b, flags: 0x0}, + 313: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 316: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 319: {lang: 0x4c3, script: 0x5b, flags: 0x0}, + 320: {lang: 0x8a, script: 0x5b, flags: 0x0}, + 321: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 323: {lang: 0x41b, script: 0x5b, flags: 0x0}, + 334: {lang: 0x59, script: 0x2, flags: 0x1}, + 351: {lang: 0x3a, script: 0x5, flags: 0x0}, + 352: {lang: 0x5b, script: 0x2, flags: 0x1}, + 357: {lang: 0x423, script: 0x5b, flags: 0x0}, } // likelyRegionList holds lists info associated with likelyRegion. // Size: 558 bytes, 93 elements var likelyRegionList = [93]likelyLangScript{ 0: {lang: 0x148, script: 0x5, flags: 0x0}, - 1: {lang: 0x476, script: 0x5a, flags: 0x0}, - 2: {lang: 0x431, script: 0x5a, flags: 0x0}, + 1: {lang: 0x476, script: 0x5b, flags: 0x0}, + 2: {lang: 0x431, script: 0x5b, flags: 0x0}, 3: {lang: 0x2ff, script: 0x20, flags: 0x0}, 4: {lang: 0x1d7, script: 0x8, flags: 0x0}, - 5: {lang: 0x274, script: 0x5a, flags: 0x0}, - 6: {lang: 0xb7, script: 0x5a, flags: 0x0}, + 5: {lang: 0x274, script: 0x5b, flags: 0x0}, + 6: {lang: 0xb7, script: 0x5b, flags: 0x0}, 7: {lang: 0x432, script: 0x20, flags: 0x0}, - 8: {lang: 0x12d, script: 0xec, flags: 0x0}, + 8: {lang: 0x12d, script: 0xef, flags: 0x0}, 9: {lang: 0x351, script: 0x22, flags: 0x0}, 10: {lang: 0x529, script: 0x3b, flags: 0x0}, 11: {lang: 0x4ac, script: 0x5, flags: 0x0}, - 12: {lang: 0x523, script: 0x5a, flags: 0x0}, - 13: {lang: 0x29a, script: 0xeb, flags: 0x0}, + 12: {lang: 0x523, script: 0x5b, flags: 0x0}, + 13: {lang: 0x29a, script: 0xee, flags: 0x0}, 14: {lang: 0x136, script: 0x34, flags: 0x0}, - 15: {lang: 0x48a, script: 0x5a, flags: 0x0}, + 15: {lang: 0x48a, script: 0x5b, flags: 0x0}, 16: {lang: 0x3a, script: 0x5, flags: 0x0}, - 17: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 17: {lang: 0x15e, script: 0x5b, flags: 0x0}, 18: {lang: 0x27, script: 0x2c, flags: 0x0}, - 19: {lang: 0x139, script: 0x5a, flags: 0x0}, + 19: {lang: 0x139, script: 0x5b, flags: 0x0}, 20: {lang: 0x26a, script: 0x5, flags: 0x2}, 21: {lang: 0x512, script: 0x3e, flags: 0x2}, 22: {lang: 0x210, script: 0x2e, flags: 0x0}, 23: {lang: 0x5, script: 0x20, flags: 0x0}, - 24: {lang: 0x274, script: 0x5a, flags: 0x0}, + 24: {lang: 0x274, script: 0x5b, flags: 0x0}, 25: {lang: 0x136, script: 0x34, flags: 0x0}, 26: {lang: 0x2ff, script: 0x20, flags: 0x0}, - 27: {lang: 0x1e1, script: 0x5a, flags: 0x0}, + 27: {lang: 0x1e1, script: 0x5b, flags: 0x0}, 28: {lang: 0x31f, script: 0x5, flags: 0x0}, 29: {lang: 0x1be, script: 0x22, flags: 0x0}, 30: {lang: 0x4b4, script: 0x5, flags: 0x0}, - 31: {lang: 0x236, script: 0x75, flags: 0x0}, + 31: {lang: 0x236, script: 0x76, flags: 0x0}, 32: {lang: 0x148, script: 0x5, flags: 0x0}, - 33: {lang: 0x476, script: 0x5a, flags: 0x0}, - 34: {lang: 0x24a, script: 0x4e, flags: 0x0}, + 33: {lang: 0x476, script: 0x5b, flags: 0x0}, + 34: {lang: 0x24a, script: 0x4f, flags: 0x0}, 35: {lang: 0xe6, script: 0x5, flags: 0x0}, - 36: {lang: 0x226, script: 0xeb, flags: 0x0}, + 36: {lang: 0x226, script: 0xee, flags: 0x0}, 37: {lang: 0x3a, script: 0x5, flags: 0x0}, - 38: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 39: {lang: 0x2b8, script: 0x57, flags: 0x0}, - 40: {lang: 0x226, script: 0xeb, flags: 0x0}, + 38: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 39: {lang: 0x2b8, script: 0x58, flags: 0x0}, + 40: {lang: 0x226, script: 0xee, flags: 0x0}, 41: {lang: 0x3a, script: 0x5, flags: 0x0}, - 42: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 43: {lang: 0x3dc, script: 0x5a, flags: 0x0}, + 42: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 43: {lang: 0x3dc, script: 0x5b, flags: 0x0}, 44: {lang: 0x4ae, script: 0x20, flags: 0x0}, 45: {lang: 0x2ff, script: 0x20, flags: 0x0}, - 46: {lang: 0x431, script: 0x5a, flags: 0x0}, - 47: {lang: 0x331, script: 0x75, flags: 0x0}, - 48: {lang: 0x213, script: 0x5a, flags: 0x0}, + 46: {lang: 0x431, script: 0x5b, flags: 0x0}, + 47: {lang: 0x331, script: 0x76, flags: 0x0}, + 48: {lang: 0x213, script: 0x5b, flags: 0x0}, 49: {lang: 0x30b, script: 0x20, flags: 0x0}, 50: {lang: 0x242, script: 0x5, flags: 0x0}, 51: {lang: 0x529, script: 0x3c, flags: 0x0}, - 52: {lang: 0x3c0, script: 0x5a, flags: 0x0}, + 52: {lang: 0x3c0, script: 0x5b, flags: 0x0}, 53: {lang: 0x3a, script: 0x5, flags: 0x0}, - 54: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 55: {lang: 0x2ed, script: 0x5a, flags: 0x0}, + 54: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 55: {lang: 0x2ed, script: 0x5b, flags: 0x0}, 56: {lang: 0x4b4, script: 0x5, flags: 0x0}, 57: {lang: 0x88, script: 0x22, flags: 0x0}, 58: {lang: 0x4b4, script: 0x5, flags: 0x0}, 59: {lang: 0x4b4, script: 0x5, flags: 0x0}, 60: {lang: 0xbe, script: 0x22, flags: 0x0}, - 61: {lang: 0x3dc, script: 0x5a, flags: 0x0}, + 61: {lang: 0x3dc, script: 0x5b, flags: 0x0}, 62: {lang: 0x7e, script: 0x20, flags: 0x0}, 63: {lang: 0x3e2, script: 0x20, flags: 0x0}, - 64: {lang: 0x267, script: 0x5a, flags: 0x0}, - 65: {lang: 0x444, script: 0x5a, flags: 0x0}, + 64: {lang: 0x267, script: 0x5b, flags: 0x0}, + 65: {lang: 0x444, script: 0x5b, flags: 0x0}, 66: {lang: 0x512, script: 0x3e, flags: 0x0}, - 67: {lang: 0x412, script: 0x5a, flags: 0x0}, + 67: {lang: 0x412, script: 0x5b, flags: 0x0}, 68: {lang: 0x4ae, script: 0x20, flags: 0x0}, 69: {lang: 0x3a, script: 0x5, flags: 0x0}, - 70: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 71: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 70: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 71: {lang: 0x15e, script: 0x5b, flags: 0x0}, 72: {lang: 0x35, script: 0x5, flags: 0x0}, - 73: {lang: 0x46b, script: 0xeb, flags: 0x0}, + 73: {lang: 0x46b, script: 0xee, flags: 0x0}, 74: {lang: 0x2ec, script: 0x5, flags: 0x0}, - 75: {lang: 0x30f, script: 0x75, flags: 0x0}, + 75: {lang: 0x30f, script: 0x76, flags: 0x0}, 76: {lang: 0x467, script: 0x20, flags: 0x0}, 77: {lang: 0x148, script: 0x5, flags: 0x0}, 78: {lang: 0x3a, script: 0x5, flags: 0x0}, - 79: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 80: {lang: 0x48a, script: 0x5a, flags: 0x0}, + 79: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 80: {lang: 0x48a, script: 0x5b, flags: 0x0}, 81: {lang: 0x58, script: 0x5, flags: 0x0}, 82: {lang: 0x219, script: 0x20, flags: 0x0}, 83: {lang: 0x81, script: 0x34, flags: 0x0}, 84: {lang: 0x529, script: 0x3c, flags: 0x0}, - 85: {lang: 0x48c, script: 0x5a, flags: 0x0}, + 85: {lang: 0x48c, script: 0x5b, flags: 0x0}, 86: {lang: 0x4ae, script: 0x20, flags: 0x0}, 87: {lang: 0x512, script: 0x3e, flags: 0x0}, - 88: {lang: 0x3b3, script: 0x5a, flags: 0x0}, - 89: {lang: 0x431, script: 0x5a, flags: 0x0}, + 88: {lang: 0x3b3, script: 0x5b, flags: 0x0}, + 89: {lang: 0x431, script: 0x5b, flags: 0x0}, 90: {lang: 0x432, script: 0x20, flags: 0x0}, - 91: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 91: {lang: 0x15e, script: 0x5b, flags: 0x0}, 92: {lang: 0x446, script: 0x5, flags: 0x0}, } @@ -3298,38 +3320,38 @@ type likelyTag struct { // Size: 198 bytes, 33 elements var likelyRegionGroup = [33]likelyTag{ - 1: {lang: 0x139, region: 0xd6, script: 0x5a}, - 2: {lang: 0x139, region: 0x135, script: 0x5a}, - 3: {lang: 0x3c0, region: 0x41, script: 0x5a}, - 4: {lang: 0x139, region: 0x2f, script: 0x5a}, - 5: {lang: 0x139, region: 0xd6, script: 0x5a}, - 6: {lang: 0x13e, region: 0xcf, script: 0x5a}, - 7: {lang: 0x445, region: 0x12f, script: 0x5a}, - 8: {lang: 0x3a, region: 0x6b, script: 0x5}, - 9: {lang: 0x445, region: 0x4b, script: 0x5a}, - 10: {lang: 0x139, region: 0x161, script: 0x5a}, - 11: {lang: 0x139, region: 0x135, script: 0x5a}, - 12: {lang: 0x139, region: 0x135, script: 0x5a}, - 13: {lang: 0x13e, region: 0x59, script: 0x5a}, + 1: {lang: 0x139, region: 0xd7, script: 0x5b}, + 2: {lang: 0x139, region: 0x136, script: 0x5b}, + 3: {lang: 0x3c0, region: 0x41, script: 0x5b}, + 4: {lang: 0x139, region: 0x2f, script: 0x5b}, + 5: {lang: 0x139, region: 0xd7, script: 0x5b}, + 6: {lang: 0x13e, region: 0xd0, script: 0x5b}, + 7: {lang: 0x445, region: 0x130, script: 0x5b}, + 8: {lang: 0x3a, region: 0x6c, script: 0x5}, + 9: {lang: 0x445, region: 0x4b, script: 0x5b}, + 10: {lang: 0x139, region: 0x162, script: 0x5b}, + 11: {lang: 0x139, region: 0x136, script: 0x5b}, + 12: {lang: 0x139, region: 0x136, script: 0x5b}, + 13: {lang: 0x13e, region: 0x5a, script: 0x5b}, 14: {lang: 0x529, region: 0x53, script: 0x3b}, - 15: {lang: 0x1be, region: 0x99, script: 0x22}, - 16: {lang: 0x1e1, region: 0x95, script: 0x5a}, - 17: {lang: 0x1f9, region: 0x9e, script: 0x5a}, - 18: {lang: 0x139, region: 0x2f, script: 0x5a}, - 19: {lang: 0x139, region: 0xe6, script: 0x5a}, - 20: {lang: 0x139, region: 0x8a, script: 0x5a}, - 21: {lang: 0x41b, region: 0x142, script: 0x5a}, + 15: {lang: 0x1be, region: 0x9a, script: 0x22}, + 16: {lang: 0x1e1, region: 0x96, script: 0x5b}, + 17: {lang: 0x1f9, region: 0x9f, script: 0x5b}, + 18: {lang: 0x139, region: 0x2f, script: 0x5b}, + 19: {lang: 0x139, region: 0xe7, script: 0x5b}, + 20: {lang: 0x139, region: 0x8b, script: 0x5b}, + 21: {lang: 0x41b, region: 0x143, script: 0x5b}, 22: {lang: 0x529, region: 0x53, script: 0x3b}, - 23: {lang: 0x4bc, region: 0x137, script: 0x5a}, - 24: {lang: 0x3a, region: 0x108, script: 0x5}, - 25: {lang: 0x3e2, region: 0x106, script: 0x20}, - 26: {lang: 0x3e2, region: 0x106, script: 0x20}, - 27: {lang: 0x139, region: 0x7b, script: 0x5a}, - 28: {lang: 0x10d, region: 0x60, script: 0x5a}, - 29: {lang: 0x139, region: 0xd6, script: 0x5a}, - 30: {lang: 0x13e, region: 0x1f, script: 0x5a}, - 31: {lang: 0x139, region: 0x9a, script: 0x5a}, - 32: {lang: 0x139, region: 0x7b, script: 0x5a}, + 23: {lang: 0x4bc, region: 0x138, script: 0x5b}, + 24: {lang: 0x3a, region: 0x109, script: 0x5}, + 25: {lang: 0x3e2, region: 0x107, script: 0x20}, + 26: {lang: 0x3e2, region: 0x107, script: 0x20}, + 27: {lang: 0x139, region: 0x7c, script: 0x5b}, + 28: {lang: 0x10d, region: 0x61, script: 0x5b}, + 29: {lang: 0x139, region: 0xd7, script: 0x5b}, + 30: {lang: 0x13e, region: 0x1f, script: 0x5b}, + 31: {lang: 0x139, region: 0x9b, script: 0x5b}, + 32: {lang: 0x139, region: 0x7c, script: 0x5b}, } // Size: 264 bytes, 33 elements @@ -3350,8 +3372,8 @@ var regionContainment = [33]uint64{ // 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: 358 bytes, 358 elements -var regionInclusion = [358]uint8{ +// Size: 359 bytes, 359 elements +var regionInclusion = [359]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, @@ -3364,45 +3386,45 @@ var regionInclusion = [358]uint8{ // Entry 40 - 7F 0x26, 0x28, 0x26, 0x25, 0x31, 0x22, 0x32, 0x33, 0x34, 0x30, 0x22, 0x27, 0x27, 0x27, 0x35, 0x2d, - 0x29, 0x28, 0x27, 0x36, 0x28, 0x22, 0x34, 0x23, - 0x21, 0x26, 0x2d, 0x26, 0x22, 0x37, 0x2e, 0x35, - 0x2a, 0x22, 0x2f, 0x38, 0x26, 0x26, 0x21, 0x39, - 0x39, 0x28, 0x38, 0x39, 0x39, 0x2f, 0x3a, 0x2f, - 0x20, 0x21, 0x38, 0x3b, 0x28, 0x3c, 0x2c, 0x21, - 0x2a, 0x35, 0x27, 0x38, 0x26, 0x24, 0x28, 0x2c, + 0x29, 0x28, 0x27, 0x36, 0x28, 0x22, 0x21, 0x34, + 0x23, 0x21, 0x26, 0x2d, 0x26, 0x22, 0x37, 0x2e, + 0x35, 0x2a, 0x22, 0x2f, 0x38, 0x26, 0x26, 0x21, + 0x39, 0x39, 0x28, 0x38, 0x39, 0x39, 0x2f, 0x3a, + 0x2f, 0x20, 0x21, 0x38, 0x3b, 0x28, 0x3c, 0x2c, + 0x21, 0x2a, 0x35, 0x27, 0x38, 0x26, 0x24, 0x28, // Entry 80 - BF - 0x2d, 0x23, 0x30, 0x2d, 0x2d, 0x26, 0x27, 0x3a, - 0x22, 0x34, 0x3c, 0x2d, 0x28, 0x36, 0x22, 0x34, - 0x3a, 0x26, 0x2e, 0x21, 0x39, 0x31, 0x38, 0x24, - 0x2c, 0x25, 0x22, 0x24, 0x25, 0x2c, 0x3a, 0x2c, - 0x26, 0x24, 0x36, 0x21, 0x2f, 0x3d, 0x31, 0x3c, - 0x2f, 0x26, 0x36, 0x36, 0x24, 0x26, 0x3d, 0x31, - 0x24, 0x26, 0x35, 0x25, 0x2d, 0x32, 0x38, 0x2a, - 0x38, 0x39, 0x39, 0x35, 0x33, 0x23, 0x26, 0x2f, + 0x2c, 0x2d, 0x23, 0x30, 0x2d, 0x2d, 0x26, 0x27, + 0x3a, 0x22, 0x34, 0x3c, 0x2d, 0x28, 0x36, 0x22, + 0x34, 0x3a, 0x26, 0x2e, 0x21, 0x39, 0x31, 0x38, + 0x24, 0x2c, 0x25, 0x22, 0x24, 0x25, 0x2c, 0x3a, + 0x2c, 0x26, 0x24, 0x36, 0x21, 0x2f, 0x3d, 0x31, + 0x3c, 0x2f, 0x26, 0x36, 0x36, 0x24, 0x26, 0x3d, + 0x31, 0x24, 0x26, 0x35, 0x25, 0x2d, 0x32, 0x38, + 0x2a, 0x38, 0x39, 0x39, 0x35, 0x33, 0x23, 0x26, // Entry C0 - FF - 0x3c, 0x21, 0x23, 0x2d, 0x31, 0x36, 0x36, 0x3c, - 0x26, 0x2d, 0x26, 0x3a, 0x2f, 0x25, 0x2f, 0x34, - 0x31, 0x2f, 0x32, 0x3b, 0x2d, 0x2b, 0x2d, 0x21, - 0x34, 0x2a, 0x2c, 0x25, 0x21, 0x3c, 0x24, 0x29, - 0x2b, 0x24, 0x34, 0x21, 0x28, 0x29, 0x3b, 0x31, - 0x25, 0x2e, 0x30, 0x29, 0x26, 0x24, 0x3a, 0x21, - 0x3c, 0x28, 0x21, 0x24, 0x21, 0x21, 0x1f, 0x21, + 0x2f, 0x3c, 0x21, 0x23, 0x2d, 0x31, 0x36, 0x36, + 0x3c, 0x26, 0x2d, 0x26, 0x3a, 0x2f, 0x25, 0x2f, + 0x34, 0x31, 0x2f, 0x32, 0x3b, 0x2d, 0x2b, 0x2d, + 0x21, 0x34, 0x2a, 0x2c, 0x25, 0x21, 0x3c, 0x24, + 0x29, 0x2b, 0x24, 0x34, 0x21, 0x28, 0x29, 0x3b, + 0x31, 0x25, 0x2e, 0x30, 0x29, 0x26, 0x24, 0x3a, + 0x21, 0x3c, 0x28, 0x21, 0x24, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, // Entry 100 - 13F - 0x21, 0x21, 0x2f, 0x21, 0x2e, 0x23, 0x33, 0x2f, - 0x24, 0x3b, 0x2f, 0x39, 0x38, 0x31, 0x2d, 0x3a, - 0x2c, 0x2e, 0x2d, 0x23, 0x2d, 0x2f, 0x28, 0x2f, - 0x27, 0x33, 0x34, 0x26, 0x24, 0x32, 0x22, 0x26, - 0x27, 0x22, 0x2d, 0x31, 0x3d, 0x29, 0x31, 0x3d, - 0x39, 0x29, 0x31, 0x24, 0x26, 0x29, 0x36, 0x2f, - 0x33, 0x2f, 0x21, 0x22, 0x21, 0x30, 0x28, 0x3d, - 0x23, 0x26, 0x21, 0x28, 0x26, 0x26, 0x31, 0x3b, + 0x21, 0x21, 0x21, 0x2f, 0x21, 0x2e, 0x23, 0x33, + 0x2f, 0x24, 0x3b, 0x2f, 0x39, 0x38, 0x31, 0x2d, + 0x3a, 0x2c, 0x2e, 0x2d, 0x23, 0x2d, 0x2f, 0x28, + 0x2f, 0x27, 0x33, 0x34, 0x26, 0x24, 0x32, 0x22, + 0x26, 0x27, 0x22, 0x2d, 0x31, 0x3d, 0x29, 0x31, + 0x3d, 0x39, 0x29, 0x31, 0x24, 0x26, 0x29, 0x36, + 0x2f, 0x33, 0x2f, 0x21, 0x22, 0x21, 0x30, 0x28, + 0x3d, 0x23, 0x26, 0x21, 0x28, 0x26, 0x26, 0x31, // Entry 140 - 17F - 0x29, 0x21, 0x29, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x21, 0x21, + 0x3b, 0x29, 0x21, 0x29, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, 0x2f, - 0x23, 0x32, 0x2f, 0x27, 0x2f, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, + 0x2f, 0x23, 0x32, 0x2f, 0x27, 0x2f, 0x21, } // regionInclusionBits is an array of bit vectors where every vector represents @@ -3462,11 +3484,11 @@ type parentRel struct { // Size: 414 bytes, 5 elements var parents = [5]parentRel{ - 0: {lang: 0x139, script: 0x0, maxScript: 0x5a, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5c, 0x5d, 0x61, 0x64, 0x6d, 0x73, 0x74, 0x75, 0x7b, 0x7c, 0x7f, 0x80, 0x81, 0x83, 0x8c, 0x8d, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9f, 0xa0, 0xa4, 0xa7, 0xa9, 0xad, 0xb1, 0xb4, 0xb5, 0xbf, 0xc6, 0xca, 0xcb, 0xcc, 0xce, 0xd0, 0xd2, 0xd5, 0xd6, 0xdd, 0xdf, 0xe0, 0xe6, 0xe7, 0xe8, 0xeb, 0xf0, 0x107, 0x109, 0x10a, 0x10b, 0x10d, 0x10e, 0x112, 0x117, 0x11b, 0x11d, 0x11f, 0x125, 0x129, 0x12c, 0x12d, 0x12f, 0x131, 0x139, 0x13c, 0x13f, 0x142, 0x161, 0x162, 0x164}}, - 1: {lang: 0x139, script: 0x0, maxScript: 0x5a, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x60, 0x63, 0x72, 0xd9, 0x10c, 0x10f}}, - 2: {lang: 0x13e, script: 0x0, maxScript: 0x5a, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x56, 0x59, 0x65, 0x69, 0x89, 0x8f, 0xcf, 0xd8, 0xe2, 0xe4, 0xec, 0xf1, 0x11a, 0x135, 0x136, 0x13b}}, - 3: {lang: 0x3c0, script: 0x0, maxScript: 0x5a, toRegion: 0xee, fromRegion: []uint16{0x2a, 0x4e, 0x5a, 0x86, 0x8b, 0xb7, 0xc6, 0xd1, 0x118, 0x126}}, - 4: {lang: 0x529, script: 0x3c, maxScript: 0x3c, toRegion: 0x8d, fromRegion: []uint16{0xc6}}, + 0: {lang: 0x139, script: 0x0, maxScript: 0x5b, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5d, 0x5e, 0x62, 0x65, 0x6e, 0x74, 0x75, 0x76, 0x7c, 0x7d, 0x80, 0x81, 0x82, 0x84, 0x8d, 0x8e, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0xa0, 0xa1, 0xa5, 0xa8, 0xaa, 0xae, 0xb2, 0xb5, 0xb6, 0xc0, 0xc7, 0xcb, 0xcc, 0xcd, 0xcf, 0xd1, 0xd3, 0xd6, 0xd7, 0xde, 0xe0, 0xe1, 0xe7, 0xe8, 0xe9, 0xec, 0xf1, 0x108, 0x10a, 0x10b, 0x10c, 0x10e, 0x10f, 0x113, 0x118, 0x11c, 0x11e, 0x120, 0x126, 0x12a, 0x12d, 0x12e, 0x130, 0x132, 0x13a, 0x13d, 0x140, 0x143, 0x162, 0x163, 0x165}}, + 1: {lang: 0x139, script: 0x0, maxScript: 0x5b, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x61, 0x64, 0x73, 0xda, 0x10d, 0x110}}, + 2: {lang: 0x13e, script: 0x0, maxScript: 0x5b, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x57, 0x5a, 0x66, 0x6a, 0x8a, 0x90, 0xd0, 0xd9, 0xe3, 0xe5, 0xed, 0xf2, 0x11b, 0x136, 0x137, 0x13c}}, + 3: {lang: 0x3c0, script: 0x0, maxScript: 0x5b, toRegion: 0xef, fromRegion: []uint16{0x2a, 0x4e, 0x5b, 0x87, 0x8c, 0xb8, 0xc7, 0xd2, 0x119, 0x127}}, + 4: {lang: 0x529, script: 0x3c, maxScript: 0x3c, toRegion: 0x8e, fromRegion: []uint16{0xc7}}, } -// Total table size 30244 bytes (29KiB); checksum: B6B15F30 +// Total table size 30466 bytes (29KiB); checksum: 7544152B diff --git a/vendor/golang.org/x/text/language/tables.go b/vendor/golang.org/x/text/language/tables.go index 34a732b699..a6573dcb21 100644 --- a/vendor/golang.org/x/text/language/tables.go +++ b/vendor/golang.org/x/text/language/tables.go @@ -23,31 +23,31 @@ const ( _419 = 31 _BR = 65 _CA = 73 - _ES = 110 - _GB = 123 - _MD = 188 - _PT = 238 - _UK = 306 - _US = 309 - _ZZ = 357 - _XA = 323 - _XC = 325 - _XK = 333 + _ES = 111 + _GB = 124 + _MD = 189 + _PT = 239 + _UK = 307 + _US = 310 + _ZZ = 358 + _XA = 324 + _XC = 326 + _XK = 334 ) const ( - _Latn = 90 + _Latn = 91 _Hani = 57 _Hans = 59 _Hant = 60 - _Qaaa = 147 - _Qaai = 155 - _Qabx = 196 - _Zinh = 252 - _Zyyy = 257 - _Zzzz = 258 + _Qaaa = 149 + _Qaai = 157 + _Qabx = 198 + _Zinh = 255 + _Zyyy = 260 + _Zzzz = 261 ) -var regionToGroups = []uint8{ // 358 elements +var regionToGroups = []uint8{ // 359 elements // Entry 0 - 3F 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, @@ -60,51 +60,51 @@ var regionToGroups = []uint8{ // 358 elements // Entry 40 - 7F 0x04, 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, 0x04, 0x00, 0x00, 0x04, 0x00, 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, // Entry 80 - BF - 0x00, 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, 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, - 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, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, // Entry C0 - FF - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, - 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x01, 0x04, 0x08, 0x04, 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, 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, // Entry 100 - 13F 0x00, 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, 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, // 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, 0x00, -} // Size: 382 bytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} // Size: 383 bytes var paradigmLocales = [][3]uint16{ // 3 elements - 0: [3]uint16{0x139, 0x0, 0x7b}, + 0: [3]uint16{0x139, 0x0, 0x7c}, 1: [3]uint16{0x13e, 0x0, 0x1f}, - 2: [3]uint16{0x3c0, 0x41, 0xee}, + 2: [3]uint16{0x3c0, 0x41, 0xef}, } // Size: 42 bytes type mutualIntelligibility struct { @@ -249,30 +249,30 @@ var matchLang = []mutualIntelligibility{ // 113 elements // matchScript holds pairs of scriptIDs where readers of one script // can typically also read the other. Each is associated with a confidence. var matchScript = []scriptIntelligibility{ // 26 elements - 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5a, haveScript: 0x20, distance: 0x5}, - 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5a, distance: 0x5}, - 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5a, distance: 0xa}, + 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5b, haveScript: 0x20, distance: 0x5}, + 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5b, distance: 0x5}, + 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5b, distance: 0xa}, 4: {wantLang: 0x1d7, haveLang: 0x3e2, wantScript: 0x8, haveScript: 0x20, distance: 0xa}, - 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5a, distance: 0xa}, - 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4e, haveScript: 0x5a, distance: 0xa}, - 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x52, haveScript: 0x5a, distance: 0xa}, - 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x57, haveScript: 0x5a, distance: 0xa}, - 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6e, haveScript: 0x5a, distance: 0xa}, - 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x75, haveScript: 0x5a, distance: 0xa}, - 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5a, distance: 0xa}, - 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x81, haveScript: 0x5a, distance: 0xa}, - 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5a, distance: 0xa}, - 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd4, haveScript: 0x5a, distance: 0xa}, - 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe3, haveScript: 0x5a, distance: 0xa}, - 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5a, distance: 0xa}, - 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5a, distance: 0xa}, - 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5a, distance: 0xa}, + 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5b, distance: 0xa}, + 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4f, haveScript: 0x5b, distance: 0xa}, + 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x53, haveScript: 0x5b, distance: 0xa}, + 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x58, haveScript: 0x5b, distance: 0xa}, + 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6f, haveScript: 0x5b, distance: 0xa}, + 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x76, haveScript: 0x5b, distance: 0xa}, + 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5b, distance: 0xa}, + 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x83, haveScript: 0x5b, distance: 0xa}, + 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5b, distance: 0xa}, + 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd6, haveScript: 0x5b, distance: 0xa}, + 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5b, distance: 0xa}, + 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe9, haveScript: 0x5b, distance: 0xa}, + 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5b, distance: 0xa}, + 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5b, distance: 0xa}, 24: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3b, haveScript: 0x3c, distance: 0xf}, 25: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3c, haveScript: 0x3b, distance: 0x13}, } // Size: 232 bytes @@ -295,4 +295,4 @@ var matchRegion = []regionIntelligibility{ // 15 elements 14: {lang: 0x529, script: 0x3c, group: 0x80, distance: 0x5}, } // Size: 114 bytes -// Total table size 1472 bytes (1KiB); checksum: F86C669 +// Total table size 1473 bytes (1KiB); checksum: 7BB90B5C diff --git a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go index f248effae1..ffadb7bebd 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go new file mode 100644 index 0000000000..92cce5802c --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go @@ -0,0 +1,2043 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// 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 *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[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 := bidiIndex[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 := bidiIndex[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 = bidiIndex[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 := bidiIndex[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 = bidiIndex[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 = bidiIndex[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 *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[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 *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[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 := bidiIndex[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 := bidiIndex[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 = bidiIndex[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 := bidiIndex[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 = bidiIndex[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 = bidiIndex[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 *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 19904 bytes (19.44 KiB). Checksum: b1f201ed2debb6c8. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 259 blocks, 16576 entries, 16576 bytes +// The third block is the zero block. +var bidiValues = [16576]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, + 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, + 0x5ea: 0x000d, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, + 0x5f0: 0x000d, 0x5f1: 0x000d, 0x5f2: 0x000d, 0x5f3: 0x000d, 0x5f4: 0x000d, 0x5f5: 0x000d, + 0x5f6: 0x000d, 0x5f7: 0x000d, 0x5f8: 0x000d, 0x5f9: 0x000d, 0x5fa: 0x000d, 0x5fb: 0x000d, + 0x5fc: 0x000d, 0x5fd: 0x000d, 0x5fe: 0x000d, 0x5ff: 0x000d, + // Block 0x18, offset 0x600 + 0x600: 0x000d, 0x601: 0x000d, 0x602: 0x000d, 0x603: 0x000d, 0x604: 0x000d, 0x605: 0x000d, + 0x606: 0x000d, 0x607: 0x000d, 0x608: 0x000d, 0x609: 0x000d, 0x60a: 0x000d, 0x60b: 0x000d, + 0x60c: 0x000d, 0x60d: 0x000d, 0x60e: 0x000d, 0x60f: 0x0001, 0x610: 0x0005, 0x611: 0x0005, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x000c, 0x619: 0x000c, 0x61a: 0x000c, 0x61b: 0x000c, 0x61c: 0x000c, 0x61d: 0x000c, + 0x61e: 0x000c, 0x61f: 0x000c, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000c, 0x64b: 0x000c, + 0x64c: 0x000c, 0x64d: 0x000c, 0x64e: 0x000c, 0x64f: 0x000c, 0x650: 0x000c, 0x651: 0x000c, + 0x652: 0x000c, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + 0x77e: 0x000c, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + 0x83a: 0x000c, 0x83b: 0x000c, + 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x895: 0x000c, 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, 0x944: 0x000c, + 0x97c: 0x000c, 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa00: 0x000c, 0xa01: 0x000c, + 0xa3b: 0x000c, + 0xa3c: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa81: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaca: 0x000c, + 0xad2: 0x000c, 0xad3: 0x000c, 0xad4: 0x000c, 0xad6: 0x000c, + // Block 0x2c, offset 0xb00 + 0xb31: 0x000c, 0xb34: 0x000c, 0xb35: 0x000c, + 0xb36: 0x000c, 0xb37: 0x000c, 0xb38: 0x000c, 0xb39: 0x000c, 0xb3a: 0x000c, + 0xb3f: 0x0004, + // Block 0x2d, offset 0xb40 + 0xb47: 0x000c, 0xb48: 0x000c, 0xb49: 0x000c, 0xb4a: 0x000c, 0xb4b: 0x000c, + 0xb4c: 0x000c, 0xb4d: 0x000c, 0xb4e: 0x000c, + // Block 0x2e, offset 0xb80 + 0xbb1: 0x000c, 0xbb4: 0x000c, 0xbb5: 0x000c, + 0xbb6: 0x000c, 0xbb7: 0x000c, 0xbb8: 0x000c, 0xbb9: 0x000c, 0xbba: 0x000c, 0xbbb: 0x000c, + 0xbbc: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbc8: 0x000c, 0xbc9: 0x000c, 0xbca: 0x000c, 0xbcb: 0x000c, + 0xbcc: 0x000c, 0xbcd: 0x000c, 0xbce: 0x000c, + // Block 0x30, offset 0xc00 + 0xc18: 0x000c, 0xc19: 0x000c, + 0xc35: 0x000c, + 0xc37: 0x000c, 0xc39: 0x000c, 0xc3a: 0x003a, 0xc3b: 0x002a, + 0xc3c: 0x003a, 0xc3d: 0x002a, + // Block 0x31, offset 0xc40 + 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, 0xc7d: 0x000c, 0xc7e: 0x000c, + // Block 0x32, offset 0xc80 + 0xc80: 0x000c, 0xc81: 0x000c, 0xc82: 0x000c, 0xc83: 0x000c, 0xc84: 0x000c, + 0xc86: 0x000c, 0xc87: 0x000c, + 0xc8d: 0x000c, 0xc8e: 0x000c, 0xc8f: 0x000c, 0xc90: 0x000c, 0xc91: 0x000c, + 0xc92: 0x000c, 0xc93: 0x000c, 0xc94: 0x000c, 0xc95: 0x000c, 0xc96: 0x000c, 0xc97: 0x000c, + 0xc99: 0x000c, 0xc9a: 0x000c, 0xc9b: 0x000c, 0xc9c: 0x000c, 0xc9d: 0x000c, + 0xc9e: 0x000c, 0xc9f: 0x000c, 0xca0: 0x000c, 0xca1: 0x000c, 0xca2: 0x000c, 0xca3: 0x000c, + 0xca4: 0x000c, 0xca5: 0x000c, 0xca6: 0x000c, 0xca7: 0x000c, 0xca8: 0x000c, 0xca9: 0x000c, + 0xcaa: 0x000c, 0xcab: 0x000c, 0xcac: 0x000c, 0xcad: 0x000c, 0xcae: 0x000c, 0xcaf: 0x000c, + 0xcb0: 0x000c, 0xcb1: 0x000c, 0xcb2: 0x000c, 0xcb3: 0x000c, 0xcb4: 0x000c, 0xcb5: 0x000c, + 0xcb6: 0x000c, 0xcb7: 0x000c, 0xcb8: 0x000c, 0xcb9: 0x000c, 0xcba: 0x000c, 0xcbb: 0x000c, + 0xcbc: 0x000c, + // Block 0x33, offset 0xcc0 + 0xcc6: 0x000c, + // Block 0x34, offset 0xd00 + 0xd2d: 0x000c, 0xd2e: 0x000c, 0xd2f: 0x000c, + 0xd30: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, 0xd35: 0x000c, + 0xd36: 0x000c, 0xd37: 0x000c, 0xd39: 0x000c, 0xd3a: 0x000c, + 0xd3d: 0x000c, 0xd3e: 0x000c, + // Block 0x35, offset 0xd40 + 0xd58: 0x000c, 0xd59: 0x000c, + 0xd5e: 0x000c, 0xd5f: 0x000c, 0xd60: 0x000c, + 0xd71: 0x000c, 0xd72: 0x000c, 0xd73: 0x000c, 0xd74: 0x000c, + // Block 0x36, offset 0xd80 + 0xd82: 0x000c, 0xd85: 0x000c, + 0xd86: 0x000c, + 0xd8d: 0x000c, + 0xd9d: 0x000c, + // Block 0x37, offset 0xdc0 + 0xddd: 0x000c, + 0xdde: 0x000c, 0xddf: 0x000c, + // Block 0x38, offset 0xe00 + 0xe10: 0x000a, 0xe11: 0x000a, + 0xe12: 0x000a, 0xe13: 0x000a, 0xe14: 0x000a, 0xe15: 0x000a, 0xe16: 0x000a, 0xe17: 0x000a, + 0xe18: 0x000a, 0xe19: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x000a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x0009, + 0xe9b: 0x007a, 0xe9c: 0x006a, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, 0xed4: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf12: 0x000c, 0xf13: 0x000c, + 0xf32: 0x000c, 0xf33: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf74: 0x000c, 0xf75: 0x000c, + 0xf77: 0x000c, 0xf78: 0x000c, 0xf79: 0x000c, 0xf7a: 0x000c, 0xf7b: 0x000c, + 0xf7c: 0x000c, 0xf7d: 0x000c, + // Block 0x3e, offset 0xf80 + 0xf86: 0x000c, 0xf89: 0x000c, 0xf8a: 0x000c, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000c, 0xf8f: 0x000c, 0xf90: 0x000c, 0xf91: 0x000c, + 0xf92: 0x000c, 0xf93: 0x000c, + 0xf9b: 0x0004, 0xf9d: 0x000c, + 0xfb0: 0x000a, 0xfb1: 0x000a, 0xfb2: 0x000a, 0xfb3: 0x000a, 0xfb4: 0x000a, 0xfb5: 0x000a, + 0xfb6: 0x000a, 0xfb7: 0x000a, 0xfb8: 0x000a, 0xfb9: 0x000a, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x000a, 0xfc1: 0x000a, 0xfc2: 0x000a, 0xfc3: 0x000a, 0xfc4: 0x000a, 0xfc5: 0x000a, + 0xfc6: 0x000a, 0xfc7: 0x000a, 0xfc8: 0x000a, 0xfc9: 0x000a, 0xfca: 0x000a, 0xfcb: 0x000c, + 0xfcc: 0x000c, 0xfcd: 0x000c, 0xfce: 0x000b, 0xfcf: 0x000c, + // Block 0x40, offset 0x1000 + 0x1005: 0x000c, + 0x1006: 0x000c, + 0x1029: 0x000c, + // Block 0x41, offset 0x1040 + 0x1060: 0x000c, 0x1061: 0x000c, 0x1062: 0x000c, + 0x1067: 0x000c, 0x1068: 0x000c, + 0x1072: 0x000c, + 0x1079: 0x000c, 0x107a: 0x000c, 0x107b: 0x000c, + // Block 0x42, offset 0x1080 + 0x1080: 0x000a, 0x1084: 0x000a, 0x1085: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10de: 0x000a, 0x10df: 0x000a, 0x10e0: 0x000a, 0x10e1: 0x000a, 0x10e2: 0x000a, 0x10e3: 0x000a, + 0x10e4: 0x000a, 0x10e5: 0x000a, 0x10e6: 0x000a, 0x10e7: 0x000a, 0x10e8: 0x000a, 0x10e9: 0x000a, + 0x10ea: 0x000a, 0x10eb: 0x000a, 0x10ec: 0x000a, 0x10ed: 0x000a, 0x10ee: 0x000a, 0x10ef: 0x000a, + 0x10f0: 0x000a, 0x10f1: 0x000a, 0x10f2: 0x000a, 0x10f3: 0x000a, 0x10f4: 0x000a, 0x10f5: 0x000a, + 0x10f6: 0x000a, 0x10f7: 0x000a, 0x10f8: 0x000a, 0x10f9: 0x000a, 0x10fa: 0x000a, 0x10fb: 0x000a, + 0x10fc: 0x000a, 0x10fd: 0x000a, 0x10fe: 0x000a, 0x10ff: 0x000a, + // Block 0x44, offset 0x1100 + 0x1117: 0x000c, + 0x1118: 0x000c, 0x111b: 0x000c, + // Block 0x45, offset 0x1140 + 0x1156: 0x000c, + 0x1158: 0x000c, 0x1159: 0x000c, 0x115a: 0x000c, 0x115b: 0x000c, 0x115c: 0x000c, 0x115d: 0x000c, + 0x115e: 0x000c, 0x1160: 0x000c, 0x1162: 0x000c, + 0x1165: 0x000c, 0x1166: 0x000c, 0x1167: 0x000c, 0x1168: 0x000c, 0x1169: 0x000c, + 0x116a: 0x000c, 0x116b: 0x000c, 0x116c: 0x000c, + 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117f: 0x000c, + // Block 0x46, offset 0x1180 + 0x11b0: 0x000c, 0x11b1: 0x000c, 0x11b2: 0x000c, 0x11b3: 0x000c, 0x11b4: 0x000c, 0x11b5: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, 0x11bb: 0x000c, + 0x11bc: 0x000c, 0x11bd: 0x000c, 0x11be: 0x000c, 0x11bf: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x000c, 0x11c1: 0x000c, 0x11c2: 0x000c, 0x11c3: 0x000c, 0x11c4: 0x000c, 0x11c5: 0x000c, + 0x11c6: 0x000c, 0x11c7: 0x000c, 0x11c8: 0x000c, 0x11c9: 0x000c, 0x11ca: 0x000c, 0x11cb: 0x000c, + 0x11cc: 0x000c, 0x11cd: 0x000c, 0x11ce: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, 0x1202: 0x000c, 0x1203: 0x000c, + 0x1234: 0x000c, + 0x1236: 0x000c, 0x1237: 0x000c, 0x1238: 0x000c, 0x1239: 0x000c, 0x123a: 0x000c, + 0x123c: 0x000c, + // Block 0x49, offset 0x1240 + 0x1242: 0x000c, + 0x126b: 0x000c, 0x126c: 0x000c, 0x126d: 0x000c, 0x126e: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, 0x1272: 0x000c, 0x1273: 0x000c, + // Block 0x4a, offset 0x1280 + 0x1280: 0x000c, 0x1281: 0x000c, + 0x12a2: 0x000c, 0x12a3: 0x000c, + 0x12a4: 0x000c, 0x12a5: 0x000c, 0x12a8: 0x000c, 0x12a9: 0x000c, + 0x12ab: 0x000c, 0x12ac: 0x000c, 0x12ad: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12e6: 0x000c, 0x12e8: 0x000c, 0x12e9: 0x000c, + 0x12ed: 0x000c, 0x12ef: 0x000c, + 0x12f0: 0x000c, 0x12f1: 0x000c, + // Block 0x4c, offset 0x1300 + 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, + 0x1336: 0x000c, 0x1337: 0x000c, + // Block 0x4d, offset 0x1340 + 0x1350: 0x000c, 0x1351: 0x000c, + 0x1352: 0x000c, 0x1354: 0x000c, 0x1355: 0x000c, 0x1356: 0x000c, 0x1357: 0x000c, + 0x1358: 0x000c, 0x1359: 0x000c, 0x135a: 0x000c, 0x135b: 0x000c, 0x135c: 0x000c, 0x135d: 0x000c, + 0x135e: 0x000c, 0x135f: 0x000c, 0x1360: 0x000c, 0x1362: 0x000c, 0x1363: 0x000c, + 0x1364: 0x000c, 0x1365: 0x000c, 0x1366: 0x000c, 0x1367: 0x000c, 0x1368: 0x000c, + 0x136d: 0x000c, + 0x1374: 0x000c, + 0x1378: 0x000c, 0x1379: 0x000c, + // Block 0x4e, offset 0x1380 + 0x13bd: 0x000a, 0x13bf: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x000a, 0x13c1: 0x000a, + 0x13cd: 0x000a, 0x13ce: 0x000a, 0x13cf: 0x000a, + 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, + 0x13ed: 0x000a, 0x13ee: 0x000a, 0x13ef: 0x000a, + 0x13fd: 0x000a, 0x13fe: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x0009, 0x1401: 0x0009, 0x1402: 0x0009, 0x1403: 0x0009, 0x1404: 0x0009, 0x1405: 0x0009, + 0x1406: 0x0009, 0x1407: 0x0009, 0x1408: 0x0009, 0x1409: 0x0009, 0x140a: 0x0009, 0x140b: 0x000b, + 0x140c: 0x000b, 0x140d: 0x000b, 0x140f: 0x0001, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x000a, 0x1420: 0x000a, 0x1421: 0x000a, 0x1422: 0x000a, 0x1423: 0x000a, + 0x1424: 0x000a, 0x1425: 0x000a, 0x1426: 0x000a, 0x1427: 0x000a, 0x1428: 0x0009, 0x1429: 0x0007, + 0x142a: 0x000e, 0x142b: 0x000e, 0x142c: 0x000e, 0x142d: 0x000e, 0x142e: 0x000e, 0x142f: 0x0006, + 0x1430: 0x0004, 0x1431: 0x0004, 0x1432: 0x0004, 0x1433: 0x0004, 0x1434: 0x0004, 0x1435: 0x000a, + 0x1436: 0x000a, 0x1437: 0x000a, 0x1438: 0x000a, 0x1439: 0x000a, 0x143a: 0x000a, 0x143b: 0x000a, + 0x143c: 0x000a, 0x143d: 0x000a, 0x143e: 0x000a, 0x143f: 0x000a, + // Block 0x51, offset 0x1440 + 0x1440: 0x000a, 0x1441: 0x000a, 0x1442: 0x000a, 0x1443: 0x000a, 0x1444: 0x0006, 0x1445: 0x009a, + 0x1446: 0x008a, 0x1447: 0x000a, 0x1448: 0x000a, 0x1449: 0x000a, 0x144a: 0x000a, 0x144b: 0x000a, + 0x144c: 0x000a, 0x144d: 0x000a, 0x144e: 0x000a, 0x144f: 0x000a, 0x1450: 0x000a, 0x1451: 0x000a, + 0x1452: 0x000a, 0x1453: 0x000a, 0x1454: 0x000a, 0x1455: 0x000a, 0x1456: 0x000a, 0x1457: 0x000a, + 0x1458: 0x000a, 0x1459: 0x000a, 0x145a: 0x000a, 0x145b: 0x000a, 0x145c: 0x000a, 0x145d: 0x000a, + 0x145e: 0x000a, 0x145f: 0x0009, 0x1460: 0x000b, 0x1461: 0x000b, 0x1462: 0x000b, 0x1463: 0x000b, + 0x1464: 0x000b, 0x1465: 0x000b, 0x1466: 0x000e, 0x1467: 0x000e, 0x1468: 0x000e, 0x1469: 0x000e, + 0x146a: 0x000b, 0x146b: 0x000b, 0x146c: 0x000b, 0x146d: 0x000b, 0x146e: 0x000b, 0x146f: 0x000b, + 0x1470: 0x0002, 0x1474: 0x0002, 0x1475: 0x0002, + 0x1476: 0x0002, 0x1477: 0x0002, 0x1478: 0x0002, 0x1479: 0x0002, 0x147a: 0x0003, 0x147b: 0x0003, + 0x147c: 0x000a, 0x147d: 0x009a, 0x147e: 0x008a, + // Block 0x52, offset 0x1480 + 0x1480: 0x0002, 0x1481: 0x0002, 0x1482: 0x0002, 0x1483: 0x0002, 0x1484: 0x0002, 0x1485: 0x0002, + 0x1486: 0x0002, 0x1487: 0x0002, 0x1488: 0x0002, 0x1489: 0x0002, 0x148a: 0x0003, 0x148b: 0x0003, + 0x148c: 0x000a, 0x148d: 0x009a, 0x148e: 0x008a, + 0x14a0: 0x0004, 0x14a1: 0x0004, 0x14a2: 0x0004, 0x14a3: 0x0004, + 0x14a4: 0x0004, 0x14a5: 0x0004, 0x14a6: 0x0004, 0x14a7: 0x0004, 0x14a8: 0x0004, 0x14a9: 0x0004, + 0x14aa: 0x0004, 0x14ab: 0x0004, 0x14ac: 0x0004, 0x14ad: 0x0004, 0x14ae: 0x0004, 0x14af: 0x0004, + 0x14b0: 0x0004, 0x14b1: 0x0004, 0x14b2: 0x0004, 0x14b3: 0x0004, 0x14b4: 0x0004, 0x14b5: 0x0004, + 0x14b6: 0x0004, 0x14b7: 0x0004, 0x14b8: 0x0004, 0x14b9: 0x0004, 0x14ba: 0x0004, 0x14bb: 0x0004, + 0x14bc: 0x0004, 0x14bd: 0x0004, 0x14be: 0x0004, 0x14bf: 0x0004, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0004, 0x14c1: 0x0004, 0x14c2: 0x0004, 0x14c3: 0x0004, 0x14c4: 0x0004, 0x14c5: 0x0004, + 0x14c6: 0x0004, 0x14c7: 0x0004, 0x14c8: 0x0004, 0x14c9: 0x0004, 0x14ca: 0x0004, 0x14cb: 0x0004, + 0x14cc: 0x0004, 0x14cd: 0x0004, 0x14ce: 0x0004, 0x14cf: 0x0004, 0x14d0: 0x000c, 0x14d1: 0x000c, + 0x14d2: 0x000c, 0x14d3: 0x000c, 0x14d4: 0x000c, 0x14d5: 0x000c, 0x14d6: 0x000c, 0x14d7: 0x000c, + 0x14d8: 0x000c, 0x14d9: 0x000c, 0x14da: 0x000c, 0x14db: 0x000c, 0x14dc: 0x000c, 0x14dd: 0x000c, + 0x14de: 0x000c, 0x14df: 0x000c, 0x14e0: 0x000c, 0x14e1: 0x000c, 0x14e2: 0x000c, 0x14e3: 0x000c, + 0x14e4: 0x000c, 0x14e5: 0x000c, 0x14e6: 0x000c, 0x14e7: 0x000c, 0x14e8: 0x000c, 0x14e9: 0x000c, + 0x14ea: 0x000c, 0x14eb: 0x000c, 0x14ec: 0x000c, 0x14ed: 0x000c, 0x14ee: 0x000c, 0x14ef: 0x000c, + 0x14f0: 0x000c, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, 0x1505: 0x000a, + 0x1506: 0x000a, 0x1508: 0x000a, 0x1509: 0x000a, + 0x1514: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, 0x1520: 0x000a, 0x1521: 0x000a, 0x1522: 0x000a, 0x1523: 0x000a, + 0x1525: 0x000a, 0x1527: 0x000a, 0x1529: 0x000a, + 0x152e: 0x0004, + 0x153a: 0x000a, 0x153b: 0x000a, + // Block 0x55, offset 0x1540 + 0x1540: 0x000a, 0x1541: 0x000a, 0x1542: 0x000a, 0x1543: 0x000a, 0x1544: 0x000a, + 0x154a: 0x000a, 0x154b: 0x000a, + 0x154c: 0x000a, 0x154d: 0x000a, 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x000a, 0x15d3: 0x000a, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x000a, 0x1609: 0x000a, 0x160a: 0x000a, 0x160b: 0x000a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x0003, 0x1613: 0x0004, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x000a, + 0x162a: 0x000a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + 0x1636: 0x000a, 0x1637: 0x000a, 0x1638: 0x000a, 0x1639: 0x000a, 0x163a: 0x000a, 0x163b: 0x000a, + 0x163c: 0x000a, 0x163d: 0x000a, 0x163e: 0x000a, 0x163f: 0x000a, + // Block 0x59, offset 0x1640 + 0x1640: 0x000a, 0x1641: 0x000a, 0x1642: 0x000a, 0x1643: 0x000a, 0x1644: 0x000a, 0x1645: 0x000a, + 0x1646: 0x000a, 0x1647: 0x000a, 0x1648: 0x003a, 0x1649: 0x002a, 0x164a: 0x003a, 0x164b: 0x002a, + 0x164c: 0x000a, 0x164d: 0x000a, 0x164e: 0x000a, 0x164f: 0x000a, 0x1650: 0x000a, 0x1651: 0x000a, + 0x1652: 0x000a, 0x1653: 0x000a, 0x1654: 0x000a, 0x1655: 0x000a, 0x1656: 0x000a, 0x1657: 0x000a, + 0x1658: 0x000a, 0x1659: 0x000a, 0x165a: 0x000a, 0x165b: 0x000a, 0x165c: 0x000a, 0x165d: 0x000a, + 0x165e: 0x000a, 0x165f: 0x000a, 0x1660: 0x000a, 0x1661: 0x000a, 0x1662: 0x000a, 0x1663: 0x000a, + 0x1664: 0x000a, 0x1665: 0x000a, 0x1666: 0x000a, 0x1667: 0x000a, 0x1668: 0x000a, 0x1669: 0x009a, + 0x166a: 0x008a, 0x166b: 0x000a, 0x166c: 0x000a, 0x166d: 0x000a, 0x166e: 0x000a, 0x166f: 0x000a, + 0x1670: 0x000a, 0x1671: 0x000a, 0x1672: 0x000a, 0x1673: 0x000a, 0x1674: 0x000a, 0x1675: 0x000a, + // Block 0x5a, offset 0x1680 + 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, + 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, + 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, + 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, + 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, 0x16ff: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, + 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, + 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, + 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, + 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, + 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, + 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, + 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, + 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, + 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, + 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, + // Block 0x5e, offset 0x1780 + 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, + 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, + 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, + 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, + 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, + // Block 0x5f, offset 0x17c0 + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, + 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, + 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, + 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, + 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, + 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, + 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, + 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, + 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, + 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, + 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, + 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1997: 0x000a, + 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, + 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, + 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, + 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a, + 0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a, + 0x19ea: 0x000a, 0x19ef: 0x000c, + 0x19f0: 0x000c, 0x19f1: 0x000c, + 0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a, + 0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a3f: 0x000c, + // Block 0x69, offset 0x1a40 + 0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c, + 0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c, + 0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c, + 0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c, + 0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c, + 0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, + 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, + 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a, + 0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a, + 0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a, + 0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a, + 0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a, + 0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a, + 0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a, + 0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a, + 0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, + 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x009a, 0x1ad6: 0x008a, 0x1ad7: 0x00ba, + 0x1ad8: 0x00aa, 0x1ad9: 0x009a, 0x1ada: 0x008a, 0x1adb: 0x007a, 0x1adc: 0x006a, 0x1add: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, + 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, + 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, + 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, + 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, + 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, + 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, + 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, + 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a, + 0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a, + 0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a, + 0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, + 0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a, + 0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a, + 0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a, + 0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a, + 0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c, + 0x1bf0: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, + 0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a, + 0x1c20: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c7b: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a, + 0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a, + 0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a, + 0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a, + 0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a, + 0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cdd: 0x000a, + 0x1cde: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d10: 0x000a, 0x1d11: 0x000a, + 0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a, + 0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a, + 0x1d1e: 0x000a, 0x1d1f: 0x000a, + 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a, + 0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e1e: 0x000a, 0x1e1f: 0x000a, + 0x1e3f: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e50: 0x000a, 0x1e51: 0x000a, + 0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a, + 0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a, + 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a, + 0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a, + 0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a, + 0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a, + 0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a, + 0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a, + 0x1e86: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f2f: 0x000c, + 0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c, + 0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c, + 0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f5e: 0x000c, 0x1f5f: 0x000c, + // Block 0x7e, offset 0x1f80 + 0x1fb0: 0x000c, 0x1fb1: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a, + 0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a, + 0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a, + 0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a, + 0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a, + 0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a, + // Block 0x80, offset 0x2000 + 0x2008: 0x000a, + // Block 0x81, offset 0x2040 + 0x2042: 0x000c, + 0x2046: 0x000c, 0x204b: 0x000c, + 0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a, + 0x206a: 0x000a, 0x206b: 0x000a, 0x206c: 0x000c, + 0x2078: 0x0004, 0x2079: 0x0004, + // Block 0x82, offset 0x2080 + 0x20b4: 0x000a, 0x20b5: 0x000a, + 0x20b6: 0x000a, 0x20b7: 0x000a, + // Block 0x83, offset 0x20c0 + 0x20c4: 0x000c, 0x20c5: 0x000c, + 0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c, + 0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, + 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c, + 0x20f0: 0x000c, 0x20f1: 0x000c, + 0x20ff: 0x000c, + // Block 0x84, offset 0x2100 + 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, + // Block 0x85, offset 0x2140 + 0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c, + 0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c, + // Block 0x86, offset 0x2180 + 0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c, + 0x21b3: 0x000c, + 0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c, + 0x21bc: 0x000c, 0x21bd: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21e5: 0x000c, + // Block 0x88, offset 0x2200 + 0x2229: 0x000c, + 0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c, + 0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c, + 0x2236: 0x000c, + // Block 0x89, offset 0x2240 + 0x2243: 0x000c, + 0x224c: 0x000c, + 0x227c: 0x000c, + // Block 0x8a, offset 0x2280 + 0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c, + 0x22b7: 0x000c, 0x22b8: 0x000c, + 0x22be: 0x000c, 0x22bf: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22c1: 0x000c, + 0x22ec: 0x000c, 0x22ed: 0x000c, + 0x22f6: 0x000c, + // Block 0x8c, offset 0x2300 + 0x232a: 0x000a, 0x232b: 0x000a, + // Block 0x8d, offset 0x2340 + 0x2365: 0x000c, 0x2368: 0x000c, + 0x236d: 0x000c, + // Block 0x8e, offset 0x2380 + 0x239d: 0x0001, + 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, + 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, + 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, + 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, + 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, + 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, + 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, + 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, + 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, + 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, + 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, + 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, + 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, + // Block 0x91, offset 0x2440 + 0x2440: 0x000a, 0x2441: 0x000a, 0x2442: 0x000a, 0x2443: 0x000a, 0x2444: 0x000a, 0x2445: 0x000a, + 0x2446: 0x000a, 0x2447: 0x000a, 0x2448: 0x000a, 0x2449: 0x000a, 0x244a: 0x000a, 0x244b: 0x000a, + 0x244c: 0x000a, 0x244d: 0x000a, 0x244e: 0x000a, 0x244f: 0x000a, 0x2450: 0x000d, 0x2451: 0x000d, + 0x2452: 0x000d, 0x2453: 0x000d, 0x2454: 0x000d, 0x2455: 0x000d, 0x2456: 0x000d, 0x2457: 0x000d, + 0x2458: 0x000d, 0x2459: 0x000d, 0x245a: 0x000d, 0x245b: 0x000d, 0x245c: 0x000d, 0x245d: 0x000d, + 0x245e: 0x000d, 0x245f: 0x000d, 0x2460: 0x000d, 0x2461: 0x000d, 0x2462: 0x000d, 0x2463: 0x000d, + 0x2464: 0x000d, 0x2465: 0x000d, 0x2466: 0x000d, 0x2467: 0x000d, 0x2468: 0x000d, 0x2469: 0x000d, + 0x246a: 0x000d, 0x246b: 0x000d, 0x246c: 0x000d, 0x246d: 0x000d, 0x246e: 0x000d, 0x246f: 0x000d, + 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, + 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, + 0x247c: 0x000d, 0x247d: 0x000d, 0x247e: 0x000d, 0x247f: 0x000d, + // Block 0x92, offset 0x2480 + 0x2480: 0x000d, 0x2481: 0x000d, 0x2482: 0x000d, 0x2483: 0x000d, 0x2484: 0x000d, 0x2485: 0x000d, + 0x2486: 0x000d, 0x2487: 0x000d, 0x2488: 0x000d, 0x2489: 0x000d, 0x248a: 0x000d, 0x248b: 0x000d, + 0x248c: 0x000d, 0x248d: 0x000d, 0x248e: 0x000d, 0x248f: 0x000a, 0x2490: 0x000b, 0x2491: 0x000b, + 0x2492: 0x000b, 0x2493: 0x000b, 0x2494: 0x000b, 0x2495: 0x000b, 0x2496: 0x000b, 0x2497: 0x000b, + 0x2498: 0x000b, 0x2499: 0x000b, 0x249a: 0x000b, 0x249b: 0x000b, 0x249c: 0x000b, 0x249d: 0x000b, + 0x249e: 0x000b, 0x249f: 0x000b, 0x24a0: 0x000b, 0x24a1: 0x000b, 0x24a2: 0x000b, 0x24a3: 0x000b, + 0x24a4: 0x000b, 0x24a5: 0x000b, 0x24a6: 0x000b, 0x24a7: 0x000b, 0x24a8: 0x000b, 0x24a9: 0x000b, + 0x24aa: 0x000b, 0x24ab: 0x000b, 0x24ac: 0x000b, 0x24ad: 0x000b, 0x24ae: 0x000b, 0x24af: 0x000b, + 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, + 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, + 0x24bc: 0x000d, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000c, 0x24c1: 0x000c, 0x24c2: 0x000c, 0x24c3: 0x000c, 0x24c4: 0x000c, 0x24c5: 0x000c, + 0x24c6: 0x000c, 0x24c7: 0x000c, 0x24c8: 0x000c, 0x24c9: 0x000c, 0x24ca: 0x000c, 0x24cb: 0x000c, + 0x24cc: 0x000c, 0x24cd: 0x000c, 0x24ce: 0x000c, 0x24cf: 0x000c, 0x24d0: 0x000a, 0x24d1: 0x000a, + 0x24d2: 0x000a, 0x24d3: 0x000a, 0x24d4: 0x000a, 0x24d5: 0x000a, 0x24d6: 0x000a, 0x24d7: 0x000a, + 0x24d8: 0x000a, 0x24d9: 0x000a, + 0x24e0: 0x000c, 0x24e1: 0x000c, 0x24e2: 0x000c, 0x24e3: 0x000c, + 0x24e4: 0x000c, 0x24e5: 0x000c, 0x24e6: 0x000c, 0x24e7: 0x000c, 0x24e8: 0x000c, 0x24e9: 0x000c, + 0x24ea: 0x000c, 0x24eb: 0x000c, 0x24ec: 0x000c, 0x24ed: 0x000c, 0x24ee: 0x000c, 0x24ef: 0x000c, + 0x24f0: 0x000a, 0x24f1: 0x000a, 0x24f2: 0x000a, 0x24f3: 0x000a, 0x24f4: 0x000a, 0x24f5: 0x000a, + 0x24f6: 0x000a, 0x24f7: 0x000a, 0x24f8: 0x000a, 0x24f9: 0x000a, 0x24fa: 0x000a, 0x24fb: 0x000a, + 0x24fc: 0x000a, 0x24fd: 0x000a, 0x24fe: 0x000a, 0x24ff: 0x000a, + // Block 0x94, offset 0x2500 + 0x2500: 0x000a, 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x000a, 0x2504: 0x000a, 0x2505: 0x000a, + 0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x000a, 0x2509: 0x000a, 0x250a: 0x000a, 0x250b: 0x000a, + 0x250c: 0x000a, 0x250d: 0x000a, 0x250e: 0x000a, 0x250f: 0x000a, 0x2510: 0x0006, 0x2511: 0x000a, + 0x2512: 0x0006, 0x2514: 0x000a, 0x2515: 0x0006, 0x2516: 0x000a, 0x2517: 0x000a, + 0x2518: 0x000a, 0x2519: 0x009a, 0x251a: 0x008a, 0x251b: 0x007a, 0x251c: 0x006a, 0x251d: 0x009a, + 0x251e: 0x008a, 0x251f: 0x0004, 0x2520: 0x000a, 0x2521: 0x000a, 0x2522: 0x0003, 0x2523: 0x0003, + 0x2524: 0x000a, 0x2525: 0x000a, 0x2526: 0x000a, 0x2528: 0x000a, 0x2529: 0x0004, + 0x252a: 0x0004, 0x252b: 0x000a, + 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, + 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, + 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000d, + // Block 0x95, offset 0x2540 + 0x2540: 0x000d, 0x2541: 0x000d, 0x2542: 0x000d, 0x2543: 0x000d, 0x2544: 0x000d, 0x2545: 0x000d, + 0x2546: 0x000d, 0x2547: 0x000d, 0x2548: 0x000d, 0x2549: 0x000d, 0x254a: 0x000d, 0x254b: 0x000d, + 0x254c: 0x000d, 0x254d: 0x000d, 0x254e: 0x000d, 0x254f: 0x000d, 0x2550: 0x000d, 0x2551: 0x000d, + 0x2552: 0x000d, 0x2553: 0x000d, 0x2554: 0x000d, 0x2555: 0x000d, 0x2556: 0x000d, 0x2557: 0x000d, + 0x2558: 0x000d, 0x2559: 0x000d, 0x255a: 0x000d, 0x255b: 0x000d, 0x255c: 0x000d, 0x255d: 0x000d, + 0x255e: 0x000d, 0x255f: 0x000d, 0x2560: 0x000d, 0x2561: 0x000d, 0x2562: 0x000d, 0x2563: 0x000d, + 0x2564: 0x000d, 0x2565: 0x000d, 0x2566: 0x000d, 0x2567: 0x000d, 0x2568: 0x000d, 0x2569: 0x000d, + 0x256a: 0x000d, 0x256b: 0x000d, 0x256c: 0x000d, 0x256d: 0x000d, 0x256e: 0x000d, 0x256f: 0x000d, + 0x2570: 0x000d, 0x2571: 0x000d, 0x2572: 0x000d, 0x2573: 0x000d, 0x2574: 0x000d, 0x2575: 0x000d, + 0x2576: 0x000d, 0x2577: 0x000d, 0x2578: 0x000d, 0x2579: 0x000d, 0x257a: 0x000d, 0x257b: 0x000d, + 0x257c: 0x000d, 0x257d: 0x000d, 0x257e: 0x000d, 0x257f: 0x000b, + // Block 0x96, offset 0x2580 + 0x2581: 0x000a, 0x2582: 0x000a, 0x2583: 0x0004, 0x2584: 0x0004, 0x2585: 0x0004, + 0x2586: 0x000a, 0x2587: 0x000a, 0x2588: 0x003a, 0x2589: 0x002a, 0x258a: 0x000a, 0x258b: 0x0003, + 0x258c: 0x0006, 0x258d: 0x0003, 0x258e: 0x0006, 0x258f: 0x0006, 0x2590: 0x0002, 0x2591: 0x0002, + 0x2592: 0x0002, 0x2593: 0x0002, 0x2594: 0x0002, 0x2595: 0x0002, 0x2596: 0x0002, 0x2597: 0x0002, + 0x2598: 0x0002, 0x2599: 0x0002, 0x259a: 0x0006, 0x259b: 0x000a, 0x259c: 0x000a, 0x259d: 0x000a, + 0x259e: 0x000a, 0x259f: 0x000a, 0x25a0: 0x000a, + 0x25bb: 0x005a, + 0x25bc: 0x000a, 0x25bd: 0x004a, 0x25be: 0x000a, 0x25bf: 0x000a, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x000a, + 0x25db: 0x005a, 0x25dc: 0x000a, 0x25dd: 0x004a, + 0x25de: 0x000a, 0x25df: 0x00fa, 0x25e0: 0x00ea, 0x25e1: 0x000a, 0x25e2: 0x003a, 0x25e3: 0x002a, + 0x25e4: 0x000a, 0x25e5: 0x000a, + // Block 0x98, offset 0x2600 + 0x2620: 0x0004, 0x2621: 0x0004, 0x2622: 0x000a, 0x2623: 0x000a, + 0x2624: 0x000a, 0x2625: 0x0004, 0x2626: 0x0004, 0x2628: 0x000a, 0x2629: 0x000a, + 0x262a: 0x000a, 0x262b: 0x000a, 0x262c: 0x000a, 0x262d: 0x000a, 0x262e: 0x000a, + 0x2630: 0x000b, 0x2631: 0x000b, 0x2632: 0x000b, 0x2633: 0x000b, 0x2634: 0x000b, 0x2635: 0x000b, + 0x2636: 0x000b, 0x2637: 0x000b, 0x2638: 0x000b, 0x2639: 0x000a, 0x263a: 0x000a, 0x263b: 0x000a, + 0x263c: 0x000a, 0x263d: 0x000a, 0x263e: 0x000b, 0x263f: 0x000b, + // Block 0x99, offset 0x2640 + 0x2641: 0x000a, + // Block 0x9a, offset 0x2680 + 0x2680: 0x000a, 0x2681: 0x000a, 0x2682: 0x000a, 0x2683: 0x000a, 0x2684: 0x000a, 0x2685: 0x000a, + 0x2686: 0x000a, 0x2687: 0x000a, 0x2688: 0x000a, 0x2689: 0x000a, 0x268a: 0x000a, 0x268b: 0x000a, + 0x268c: 0x000a, 0x2690: 0x000a, 0x2691: 0x000a, + 0x2692: 0x000a, 0x2693: 0x000a, 0x2694: 0x000a, 0x2695: 0x000a, 0x2696: 0x000a, 0x2697: 0x000a, + 0x2698: 0x000a, 0x2699: 0x000a, 0x269a: 0x000a, 0x269b: 0x000a, 0x269c: 0x000a, + 0x26a0: 0x000a, + // Block 0x9b, offset 0x26c0 + 0x26fd: 0x000c, + // Block 0x9c, offset 0x2700 + 0x2720: 0x000c, 0x2721: 0x0002, 0x2722: 0x0002, 0x2723: 0x0002, + 0x2724: 0x0002, 0x2725: 0x0002, 0x2726: 0x0002, 0x2727: 0x0002, 0x2728: 0x0002, 0x2729: 0x0002, + 0x272a: 0x0002, 0x272b: 0x0002, 0x272c: 0x0002, 0x272d: 0x0002, 0x272e: 0x0002, 0x272f: 0x0002, + 0x2730: 0x0002, 0x2731: 0x0002, 0x2732: 0x0002, 0x2733: 0x0002, 0x2734: 0x0002, 0x2735: 0x0002, + 0x2736: 0x0002, 0x2737: 0x0002, 0x2738: 0x0002, 0x2739: 0x0002, 0x273a: 0x0002, 0x273b: 0x0002, + // Block 0x9d, offset 0x2740 + 0x2776: 0x000c, 0x2777: 0x000c, 0x2778: 0x000c, 0x2779: 0x000c, 0x277a: 0x000c, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x000a, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x000c, 0x2802: 0x000c, 0x2803: 0x000c, 0x2804: 0x0001, 0x2805: 0x000c, + 0x2806: 0x000c, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x000c, 0x280d: 0x000c, 0x280e: 0x000c, 0x280f: 0x000c, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x000c, 0x2839: 0x000c, 0x283a: 0x000c, 0x283b: 0x0001, + 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x000c, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, + 0x2864: 0x0001, 0x2865: 0x000c, 0x2866: 0x000c, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, + 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, + 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, + 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x0001, 0x287a: 0x0001, 0x287b: 0x0001, + 0x287c: 0x0001, 0x287d: 0x0001, 0x287e: 0x0001, 0x287f: 0x0001, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0001, 0x28a1: 0x0001, 0x28a2: 0x0001, 0x28a3: 0x0001, + 0x28a4: 0x0001, 0x28a5: 0x0001, 0x28a6: 0x0001, 0x28a7: 0x0001, 0x28a8: 0x0001, 0x28a9: 0x0001, + 0x28aa: 0x0001, 0x28ab: 0x0001, 0x28ac: 0x0001, 0x28ad: 0x0001, 0x28ae: 0x0001, 0x28af: 0x0001, + 0x28b0: 0x0001, 0x28b1: 0x0001, 0x28b2: 0x0001, 0x28b3: 0x0001, 0x28b4: 0x0001, 0x28b5: 0x0001, + 0x28b6: 0x0001, 0x28b7: 0x0001, 0x28b8: 0x0001, 0x28b9: 0x000a, 0x28ba: 0x000a, 0x28bb: 0x000a, + 0x28bc: 0x000a, 0x28bd: 0x000a, 0x28be: 0x000a, 0x28bf: 0x000a, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x000d, 0x28c1: 0x000d, 0x28c2: 0x000d, 0x28c3: 0x000d, 0x28c4: 0x000d, 0x28c5: 0x000d, + 0x28c6: 0x000d, 0x28c7: 0x000d, 0x28c8: 0x000d, 0x28c9: 0x000d, 0x28ca: 0x000d, 0x28cb: 0x000d, + 0x28cc: 0x000d, 0x28cd: 0x000d, 0x28ce: 0x000d, 0x28cf: 0x000d, 0x28d0: 0x000d, 0x28d1: 0x000d, + 0x28d2: 0x000d, 0x28d3: 0x000d, 0x28d4: 0x000d, 0x28d5: 0x000d, 0x28d6: 0x000d, 0x28d7: 0x000d, + 0x28d8: 0x000d, 0x28d9: 0x000d, 0x28da: 0x000d, 0x28db: 0x000d, 0x28dc: 0x000d, 0x28dd: 0x000d, + 0x28de: 0x000d, 0x28df: 0x000d, 0x28e0: 0x000d, 0x28e1: 0x000d, 0x28e2: 0x000d, 0x28e3: 0x000d, + 0x28e4: 0x000c, 0x28e5: 0x000c, 0x28e6: 0x000c, 0x28e7: 0x000c, 0x28e8: 0x0001, 0x28e9: 0x0001, + 0x28ea: 0x0001, 0x28eb: 0x0001, 0x28ec: 0x0001, 0x28ed: 0x0001, 0x28ee: 0x0001, 0x28ef: 0x0001, + 0x28f0: 0x0005, 0x28f1: 0x0005, 0x28f2: 0x0005, 0x28f3: 0x0005, 0x28f4: 0x0005, 0x28f5: 0x0005, + 0x28f6: 0x0005, 0x28f7: 0x0005, 0x28f8: 0x0005, 0x28f9: 0x0005, 0x28fa: 0x0001, 0x28fb: 0x0001, + 0x28fc: 0x0001, 0x28fd: 0x0001, 0x28fe: 0x0001, 0x28ff: 0x0001, + // Block 0xa4, offset 0x2900 + 0x2900: 0x0001, 0x2901: 0x0001, 0x2902: 0x0001, 0x2903: 0x0001, 0x2904: 0x0001, 0x2905: 0x0001, + 0x2906: 0x0001, 0x2907: 0x0001, 0x2908: 0x0001, 0x2909: 0x0001, 0x290a: 0x0001, 0x290b: 0x0001, + 0x290c: 0x0001, 0x290d: 0x0001, 0x290e: 0x0001, 0x290f: 0x0001, 0x2910: 0x0001, 0x2911: 0x0001, + 0x2912: 0x0001, 0x2913: 0x0001, 0x2914: 0x0001, 0x2915: 0x0001, 0x2916: 0x0001, 0x2917: 0x0001, + 0x2918: 0x0001, 0x2919: 0x0001, 0x291a: 0x0001, 0x291b: 0x0001, 0x291c: 0x0001, 0x291d: 0x0001, + 0x291e: 0x0001, 0x291f: 0x0001, 0x2920: 0x0005, 0x2921: 0x0005, 0x2922: 0x0005, 0x2923: 0x0005, + 0x2924: 0x0005, 0x2925: 0x0005, 0x2926: 0x0005, 0x2927: 0x0005, 0x2928: 0x0005, 0x2929: 0x0005, + 0x292a: 0x0005, 0x292b: 0x0005, 0x292c: 0x0005, 0x292d: 0x0005, 0x292e: 0x0005, 0x292f: 0x0005, + 0x2930: 0x0005, 0x2931: 0x0005, 0x2932: 0x0005, 0x2933: 0x0005, 0x2934: 0x0005, 0x2935: 0x0005, + 0x2936: 0x0005, 0x2937: 0x0005, 0x2938: 0x0005, 0x2939: 0x0005, 0x293a: 0x0005, 0x293b: 0x0005, + 0x293c: 0x0005, 0x293d: 0x0005, 0x293e: 0x0005, 0x293f: 0x0001, + // Block 0xa5, offset 0x2940 + 0x2940: 0x0001, 0x2941: 0x0001, 0x2942: 0x0001, 0x2943: 0x0001, 0x2944: 0x0001, 0x2945: 0x0001, + 0x2946: 0x0001, 0x2947: 0x0001, 0x2948: 0x0001, 0x2949: 0x0001, 0x294a: 0x0001, 0x294b: 0x0001, + 0x294c: 0x0001, 0x294d: 0x0001, 0x294e: 0x0001, 0x294f: 0x0001, 0x2950: 0x0001, 0x2951: 0x0001, + 0x2952: 0x0001, 0x2953: 0x0001, 0x2954: 0x0001, 0x2955: 0x0001, 0x2956: 0x0001, 0x2957: 0x0001, + 0x2958: 0x0001, 0x2959: 0x0001, 0x295a: 0x0001, 0x295b: 0x0001, 0x295c: 0x0001, 0x295d: 0x0001, + 0x295e: 0x0001, 0x295f: 0x0001, 0x2960: 0x0001, 0x2961: 0x0001, 0x2962: 0x0001, 0x2963: 0x0001, + 0x2964: 0x0001, 0x2965: 0x0001, 0x2966: 0x0001, 0x2967: 0x0001, 0x2968: 0x0001, 0x2969: 0x0001, + 0x296a: 0x0001, 0x296b: 0x000c, 0x296c: 0x000c, 0x296d: 0x0001, 0x296e: 0x0001, 0x296f: 0x0001, + 0x2970: 0x0001, 0x2971: 0x0001, 0x2972: 0x0001, 0x2973: 0x0001, 0x2974: 0x0001, 0x2975: 0x0001, + 0x2976: 0x0001, 0x2977: 0x0001, 0x2978: 0x0001, 0x2979: 0x0001, 0x297a: 0x0001, 0x297b: 0x0001, + 0x297c: 0x0001, 0x297d: 0x0001, 0x297e: 0x0001, 0x297f: 0x0001, + // Block 0xa6, offset 0x2980 + 0x2980: 0x0001, 0x2981: 0x0001, 0x2982: 0x0001, 0x2983: 0x0001, 0x2984: 0x0001, 0x2985: 0x0001, + 0x2986: 0x0001, 0x2987: 0x0001, 0x2988: 0x0001, 0x2989: 0x0001, 0x298a: 0x0001, 0x298b: 0x0001, + 0x298c: 0x0001, 0x298d: 0x0001, 0x298e: 0x0001, 0x298f: 0x0001, 0x2990: 0x0001, 0x2991: 0x0001, + 0x2992: 0x0001, 0x2993: 0x0001, 0x2994: 0x0001, 0x2995: 0x0001, 0x2996: 0x0001, 0x2997: 0x0001, + 0x2998: 0x0001, 0x2999: 0x0001, 0x299a: 0x0001, 0x299b: 0x0001, 0x299c: 0x0001, 0x299d: 0x0001, + 0x299e: 0x0001, 0x299f: 0x0001, 0x29a0: 0x0001, 0x29a1: 0x0001, 0x29a2: 0x0001, 0x29a3: 0x0001, + 0x29a4: 0x0001, 0x29a5: 0x0001, 0x29a6: 0x0001, 0x29a7: 0x0001, 0x29a8: 0x0001, 0x29a9: 0x0001, + 0x29aa: 0x0001, 0x29ab: 0x0001, 0x29ac: 0x0001, 0x29ad: 0x0001, 0x29ae: 0x0001, 0x29af: 0x0001, + 0x29b0: 0x0001, 0x29b1: 0x0001, 0x29b2: 0x0001, 0x29b3: 0x0001, 0x29b4: 0x0001, 0x29b5: 0x0001, + 0x29b6: 0x0001, 0x29b7: 0x0001, 0x29b8: 0x0001, 0x29b9: 0x0001, 0x29ba: 0x0001, 0x29bb: 0x0001, + 0x29bc: 0x0001, 0x29bd: 0x000c, 0x29be: 0x000c, 0x29bf: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x0001, 0x29c1: 0x0001, 0x29c2: 0x0001, 0x29c3: 0x0001, 0x29c4: 0x0001, 0x29c5: 0x0001, + 0x29c6: 0x0001, 0x29c7: 0x0001, 0x29c8: 0x0001, 0x29c9: 0x0001, 0x29ca: 0x0001, 0x29cb: 0x0001, + 0x29cc: 0x0001, 0x29cd: 0x0001, 0x29ce: 0x0001, 0x29cf: 0x0001, 0x29d0: 0x0001, 0x29d1: 0x0001, + 0x29d2: 0x0001, 0x29d3: 0x0001, 0x29d4: 0x0001, 0x29d5: 0x0001, 0x29d6: 0x0001, 0x29d7: 0x0001, + 0x29d8: 0x0001, 0x29d9: 0x0001, 0x29da: 0x0001, 0x29db: 0x0001, 0x29dc: 0x0001, 0x29dd: 0x0001, + 0x29de: 0x0001, 0x29df: 0x0001, 0x29e0: 0x0001, 0x29e1: 0x0001, 0x29e2: 0x0001, 0x29e3: 0x0001, + 0x29e4: 0x0001, 0x29e5: 0x0001, 0x29e6: 0x0001, 0x29e7: 0x0001, 0x29e8: 0x0001, 0x29e9: 0x0001, + 0x29ea: 0x0001, 0x29eb: 0x0001, 0x29ec: 0x0001, 0x29ed: 0x0001, 0x29ee: 0x0001, 0x29ef: 0x0001, + 0x29f0: 0x000d, 0x29f1: 0x000d, 0x29f2: 0x000d, 0x29f3: 0x000d, 0x29f4: 0x000d, 0x29f5: 0x000d, + 0x29f6: 0x000d, 0x29f7: 0x000d, 0x29f8: 0x000d, 0x29f9: 0x000d, 0x29fa: 0x000d, 0x29fb: 0x000d, + 0x29fc: 0x000d, 0x29fd: 0x000d, 0x29fe: 0x000d, 0x29ff: 0x000d, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x000d, 0x2a01: 0x000d, 0x2a02: 0x000d, 0x2a03: 0x000d, 0x2a04: 0x000d, 0x2a05: 0x000d, + 0x2a06: 0x000c, 0x2a07: 0x000c, 0x2a08: 0x000c, 0x2a09: 0x000c, 0x2a0a: 0x000c, 0x2a0b: 0x000c, + 0x2a0c: 0x000c, 0x2a0d: 0x000c, 0x2a0e: 0x000c, 0x2a0f: 0x000c, 0x2a10: 0x000c, 0x2a11: 0x000d, + 0x2a12: 0x000d, 0x2a13: 0x000d, 0x2a14: 0x000d, 0x2a15: 0x000d, 0x2a16: 0x000d, 0x2a17: 0x000d, + 0x2a18: 0x000d, 0x2a19: 0x000d, 0x2a1a: 0x0001, 0x2a1b: 0x0001, 0x2a1c: 0x0001, 0x2a1d: 0x0001, + 0x2a1e: 0x0001, 0x2a1f: 0x0001, 0x2a20: 0x0001, 0x2a21: 0x0001, 0x2a22: 0x0001, 0x2a23: 0x0001, + 0x2a24: 0x0001, 0x2a25: 0x0001, 0x2a26: 0x0001, 0x2a27: 0x0001, 0x2a28: 0x0001, 0x2a29: 0x0001, + 0x2a2a: 0x0001, 0x2a2b: 0x0001, 0x2a2c: 0x0001, 0x2a2d: 0x0001, 0x2a2e: 0x0001, 0x2a2f: 0x0001, + 0x2a30: 0x0001, 0x2a31: 0x0001, 0x2a32: 0x0001, 0x2a33: 0x0001, 0x2a34: 0x0001, 0x2a35: 0x0001, + 0x2a36: 0x0001, 0x2a37: 0x0001, 0x2a38: 0x0001, 0x2a39: 0x0001, 0x2a3a: 0x0001, 0x2a3b: 0x0001, + 0x2a3c: 0x0001, 0x2a3d: 0x0001, 0x2a3e: 0x0001, 0x2a3f: 0x0001, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x0001, 0x2a41: 0x0001, 0x2a42: 0x000c, 0x2a43: 0x000c, 0x2a44: 0x000c, 0x2a45: 0x000c, + 0x2a46: 0x0001, 0x2a47: 0x0001, 0x2a48: 0x0001, 0x2a49: 0x0001, 0x2a4a: 0x0001, 0x2a4b: 0x0001, + 0x2a4c: 0x0001, 0x2a4d: 0x0001, 0x2a4e: 0x0001, 0x2a4f: 0x0001, 0x2a50: 0x0001, 0x2a51: 0x0001, + 0x2a52: 0x0001, 0x2a53: 0x0001, 0x2a54: 0x0001, 0x2a55: 0x0001, 0x2a56: 0x0001, 0x2a57: 0x0001, + 0x2a58: 0x0001, 0x2a59: 0x0001, 0x2a5a: 0x0001, 0x2a5b: 0x0001, 0x2a5c: 0x0001, 0x2a5d: 0x0001, + 0x2a5e: 0x0001, 0x2a5f: 0x0001, 0x2a60: 0x0001, 0x2a61: 0x0001, 0x2a62: 0x0001, 0x2a63: 0x0001, + 0x2a64: 0x0001, 0x2a65: 0x0001, 0x2a66: 0x0001, 0x2a67: 0x0001, 0x2a68: 0x0001, 0x2a69: 0x0001, + 0x2a6a: 0x0001, 0x2a6b: 0x0001, 0x2a6c: 0x0001, 0x2a6d: 0x0001, 0x2a6e: 0x0001, 0x2a6f: 0x0001, + 0x2a70: 0x0001, 0x2a71: 0x0001, 0x2a72: 0x0001, 0x2a73: 0x0001, 0x2a74: 0x0001, 0x2a75: 0x0001, + 0x2a76: 0x0001, 0x2a77: 0x0001, 0x2a78: 0x0001, 0x2a79: 0x0001, 0x2a7a: 0x0001, 0x2a7b: 0x0001, + 0x2a7c: 0x0001, 0x2a7d: 0x0001, 0x2a7e: 0x0001, 0x2a7f: 0x0001, + // Block 0xaa, offset 0x2a80 + 0x2a81: 0x000c, + 0x2ab8: 0x000c, 0x2ab9: 0x000c, 0x2aba: 0x000c, 0x2abb: 0x000c, + 0x2abc: 0x000c, 0x2abd: 0x000c, 0x2abe: 0x000c, 0x2abf: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x000c, 0x2ac1: 0x000c, 0x2ac2: 0x000c, 0x2ac3: 0x000c, 0x2ac4: 0x000c, 0x2ac5: 0x000c, + 0x2ac6: 0x000c, + 0x2ad2: 0x000a, 0x2ad3: 0x000a, 0x2ad4: 0x000a, 0x2ad5: 0x000a, 0x2ad6: 0x000a, 0x2ad7: 0x000a, + 0x2ad8: 0x000a, 0x2ad9: 0x000a, 0x2ada: 0x000a, 0x2adb: 0x000a, 0x2adc: 0x000a, 0x2add: 0x000a, + 0x2ade: 0x000a, 0x2adf: 0x000a, 0x2ae0: 0x000a, 0x2ae1: 0x000a, 0x2ae2: 0x000a, 0x2ae3: 0x000a, + 0x2ae4: 0x000a, 0x2ae5: 0x000a, + 0x2af0: 0x000c, 0x2af3: 0x000c, 0x2af4: 0x000c, + 0x2aff: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x000c, 0x2b01: 0x000c, + 0x2b33: 0x000c, 0x2b34: 0x000c, 0x2b35: 0x000c, + 0x2b36: 0x000c, 0x2b39: 0x000c, 0x2b3a: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x000c, 0x2b41: 0x000c, 0x2b42: 0x000c, + 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6d: 0x000c, 0x2b6e: 0x000c, 0x2b6f: 0x000c, + 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2bb3: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x000c, 0x2bc1: 0x000c, + 0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bf9: 0x000c, 0x2bfa: 0x000c, 0x2bfb: 0x000c, + 0x2bfc: 0x000c, 0x2bfd: 0x000c, 0x2bfe: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c09: 0x000c, 0x2c0a: 0x000c, 0x2c0b: 0x000c, + 0x2c0c: 0x000c, 0x2c0f: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c6f: 0x000c, + 0x2c70: 0x000c, 0x2c71: 0x000c, 0x2c74: 0x000c, + 0x2c76: 0x000c, 0x2c77: 0x000c, + 0x2c7e: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2c9f: 0x000c, 0x2ca3: 0x000c, + 0x2ca4: 0x000c, 0x2ca5: 0x000c, 0x2ca6: 0x000c, 0x2ca7: 0x000c, 0x2ca8: 0x000c, 0x2ca9: 0x000c, + 0x2caa: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x000c, + 0x2ce6: 0x000c, 0x2ce7: 0x000c, 0x2ce8: 0x000c, 0x2ce9: 0x000c, + 0x2cea: 0x000c, 0x2ceb: 0x000c, 0x2cec: 0x000c, + 0x2cf0: 0x000c, 0x2cf1: 0x000c, 0x2cf2: 0x000c, 0x2cf3: 0x000c, 0x2cf4: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, 0x2d3b: 0x000c, + 0x2d3c: 0x000c, 0x2d3d: 0x000c, 0x2d3e: 0x000c, 0x2d3f: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d42: 0x000c, 0x2d43: 0x000c, 0x2d44: 0x000c, + 0x2d46: 0x000c, + 0x2d5e: 0x000c, + // Block 0xb6, offset 0x2d80 + 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, + 0x2db6: 0x000c, 0x2db7: 0x000c, 0x2db8: 0x000c, 0x2dba: 0x000c, + 0x2dbf: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, + 0x2e3c: 0x000c, 0x2e3d: 0x000c, 0x2e3f: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x000c, + 0x2e5c: 0x000c, 0x2e5d: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, + 0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, + 0x2ebd: 0x000c, 0x2ebf: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x000c, + 0x2ee0: 0x000a, 0x2ee1: 0x000a, 0x2ee2: 0x000a, 0x2ee3: 0x000a, + 0x2ee4: 0x000a, 0x2ee5: 0x000a, 0x2ee6: 0x000a, 0x2ee7: 0x000a, 0x2ee8: 0x000a, 0x2ee9: 0x000a, + 0x2eea: 0x000a, 0x2eeb: 0x000a, 0x2eec: 0x000a, + // Block 0xbc, offset 0x2f00 + 0x2f2b: 0x000c, 0x2f2d: 0x000c, + 0x2f30: 0x000c, 0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c, + 0x2f37: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f5d: 0x000c, + 0x2f5e: 0x000c, 0x2f5f: 0x000c, 0x2f62: 0x000c, 0x2f63: 0x000c, + 0x2f64: 0x000c, 0x2f65: 0x000c, 0x2f67: 0x000c, 0x2f68: 0x000c, 0x2f69: 0x000c, + 0x2f6a: 0x000c, 0x2f6b: 0x000c, + // Block 0xbe, offset 0x2f80 + 0x2faf: 0x000c, + 0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c, 0x2fb5: 0x000c, + 0x2fb6: 0x000c, 0x2fb7: 0x000c, 0x2fb9: 0x000c, 0x2fba: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2ffb: 0x000c, + 0x2ffc: 0x000c, 0x2ffe: 0x000c, + // Block 0xc0, offset 0x3000 + 0x3003: 0x000c, + // Block 0xc1, offset 0x3040 + 0x3054: 0x000c, 0x3055: 0x000c, 0x3056: 0x000c, 0x3057: 0x000c, + 0x305a: 0x000c, 0x305b: 0x000c, + 0x3060: 0x000c, + // Block 0xc2, offset 0x3080 + 0x3081: 0x000c, 0x3082: 0x000c, 0x3083: 0x000c, 0x3084: 0x000c, 0x3085: 0x000c, + 0x3086: 0x000c, 0x3089: 0x000c, 0x308a: 0x000c, + 0x30b3: 0x000c, 0x30b4: 0x000c, 0x30b5: 0x000c, + 0x30b6: 0x000c, 0x30b7: 0x000c, 0x30b8: 0x000c, 0x30bb: 0x000c, + 0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, + // Block 0xc3, offset 0x30c0 + 0x30c7: 0x000c, + 0x30d1: 0x000c, + 0x30d2: 0x000c, 0x30d3: 0x000c, 0x30d4: 0x000c, 0x30d5: 0x000c, 0x30d6: 0x000c, + 0x30d9: 0x000c, 0x30da: 0x000c, 0x30db: 0x000c, + // Block 0xc4, offset 0x3100 + 0x310a: 0x000c, 0x310b: 0x000c, + 0x310c: 0x000c, 0x310d: 0x000c, 0x310e: 0x000c, 0x310f: 0x000c, 0x3110: 0x000c, 0x3111: 0x000c, + 0x3112: 0x000c, 0x3113: 0x000c, 0x3114: 0x000c, 0x3115: 0x000c, 0x3116: 0x000c, + 0x3118: 0x000c, 0x3119: 0x000c, + // Block 0xc5, offset 0x3140 + 0x3170: 0x000c, 0x3171: 0x000c, 0x3172: 0x000c, 0x3173: 0x000c, 0x3174: 0x000c, 0x3175: 0x000c, + 0x3176: 0x000c, 0x3178: 0x000c, 0x3179: 0x000c, 0x317a: 0x000c, 0x317b: 0x000c, + 0x317c: 0x000c, 0x317d: 0x000c, + // Block 0xc6, offset 0x3180 + 0x3192: 0x000c, 0x3193: 0x000c, 0x3194: 0x000c, 0x3195: 0x000c, 0x3196: 0x000c, 0x3197: 0x000c, + 0x3198: 0x000c, 0x3199: 0x000c, 0x319a: 0x000c, 0x319b: 0x000c, 0x319c: 0x000c, 0x319d: 0x000c, + 0x319e: 0x000c, 0x319f: 0x000c, 0x31a0: 0x000c, 0x31a1: 0x000c, 0x31a2: 0x000c, 0x31a3: 0x000c, + 0x31a4: 0x000c, 0x31a5: 0x000c, 0x31a6: 0x000c, 0x31a7: 0x000c, + 0x31aa: 0x000c, 0x31ab: 0x000c, 0x31ac: 0x000c, 0x31ad: 0x000c, 0x31ae: 0x000c, 0x31af: 0x000c, + 0x31b0: 0x000c, 0x31b2: 0x000c, 0x31b3: 0x000c, 0x31b5: 0x000c, + 0x31b6: 0x000c, + // Block 0xc7, offset 0x31c0 + 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, + 0x31f6: 0x000c, 0x31fa: 0x000c, + 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31ff: 0x000c, + // Block 0xc8, offset 0x3200 + 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, + 0x3207: 0x000c, + // Block 0xc9, offset 0x3240 + 0x3250: 0x000c, 0x3251: 0x000c, + 0x3255: 0x000c, 0x3257: 0x000c, + // Block 0xca, offset 0x3280 + 0x32b3: 0x000c, 0x32b4: 0x000c, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x000c, 0x32c1: 0x000c, + 0x32f6: 0x000c, 0x32f7: 0x000c, 0x32f8: 0x000c, 0x32f9: 0x000c, 0x32fa: 0x000c, + // Block 0xcc, offset 0x3300 + 0x3300: 0x000c, 0x3302: 0x000c, + // Block 0xcd, offset 0x3340 + 0x3355: 0x000a, 0x3356: 0x000a, 0x3357: 0x000a, + 0x3358: 0x000a, 0x3359: 0x000a, 0x335a: 0x000a, 0x335b: 0x000a, 0x335c: 0x000a, 0x335d: 0x0004, + 0x335e: 0x0004, 0x335f: 0x0004, 0x3360: 0x0004, 0x3361: 0x000a, 0x3362: 0x000a, 0x3363: 0x000a, + 0x3364: 0x000a, 0x3365: 0x000a, 0x3366: 0x000a, 0x3367: 0x000a, 0x3368: 0x000a, 0x3369: 0x000a, + 0x336a: 0x000a, 0x336b: 0x000a, 0x336c: 0x000a, 0x336d: 0x000a, 0x336e: 0x000a, 0x336f: 0x000a, + 0x3370: 0x000a, 0x3371: 0x000a, + // Block 0xce, offset 0x3380 + 0x3380: 0x000c, + 0x3387: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c, + 0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c, + 0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, + // Block 0xcf, offset 0x33c0 + 0x33f0: 0x000c, 0x33f1: 0x000c, 0x33f2: 0x000c, 0x33f3: 0x000c, 0x33f4: 0x000c, + // Block 0xd0, offset 0x3400 + 0x3430: 0x000c, 0x3431: 0x000c, 0x3432: 0x000c, 0x3433: 0x000c, 0x3434: 0x000c, 0x3435: 0x000c, + 0x3436: 0x000c, + // Block 0xd1, offset 0x3440 + 0x344f: 0x000c, + // Block 0xd2, offset 0x3480 + 0x348f: 0x000c, 0x3490: 0x000c, 0x3491: 0x000c, + 0x3492: 0x000c, + // Block 0xd3, offset 0x34c0 + 0x34e2: 0x000a, + 0x34e4: 0x000c, + // Block 0xd4, offset 0x3500 + 0x351d: 0x000c, + 0x351e: 0x000c, 0x3520: 0x000b, 0x3521: 0x000b, 0x3522: 0x000b, 0x3523: 0x000b, + // Block 0xd5, offset 0x3540 + 0x3540: 0x000c, 0x3541: 0x000c, 0x3542: 0x000c, 0x3543: 0x000c, 0x3544: 0x000c, 0x3545: 0x000c, + 0x3546: 0x000c, 0x3547: 0x000c, 0x3548: 0x000c, 0x3549: 0x000c, 0x354a: 0x000c, 0x354b: 0x000c, + 0x354c: 0x000c, 0x354d: 0x000c, 0x354e: 0x000c, 0x354f: 0x000c, 0x3550: 0x000c, 0x3551: 0x000c, + 0x3552: 0x000c, 0x3553: 0x000c, 0x3554: 0x000c, 0x3555: 0x000c, 0x3556: 0x000c, 0x3557: 0x000c, + 0x3558: 0x000c, 0x3559: 0x000c, 0x355a: 0x000c, 0x355b: 0x000c, 0x355c: 0x000c, 0x355d: 0x000c, + 0x355e: 0x000c, 0x355f: 0x000c, 0x3560: 0x000c, 0x3561: 0x000c, 0x3562: 0x000c, 0x3563: 0x000c, + 0x3564: 0x000c, 0x3565: 0x000c, 0x3566: 0x000c, 0x3567: 0x000c, 0x3568: 0x000c, 0x3569: 0x000c, + 0x356a: 0x000c, 0x356b: 0x000c, 0x356c: 0x000c, 0x356d: 0x000c, + 0x3570: 0x000c, 0x3571: 0x000c, 0x3572: 0x000c, 0x3573: 0x000c, 0x3574: 0x000c, 0x3575: 0x000c, + 0x3576: 0x000c, 0x3577: 0x000c, 0x3578: 0x000c, 0x3579: 0x000c, 0x357a: 0x000c, 0x357b: 0x000c, + 0x357c: 0x000c, 0x357d: 0x000c, 0x357e: 0x000c, 0x357f: 0x000c, + // Block 0xd6, offset 0x3580 + 0x3580: 0x000c, 0x3581: 0x000c, 0x3582: 0x000c, 0x3583: 0x000c, 0x3584: 0x000c, 0x3585: 0x000c, + 0x3586: 0x000c, + // Block 0xd7, offset 0x35c0 + 0x35e7: 0x000c, 0x35e8: 0x000c, 0x35e9: 0x000c, + 0x35f3: 0x000b, 0x35f4: 0x000b, 0x35f5: 0x000b, + 0x35f6: 0x000b, 0x35f7: 0x000b, 0x35f8: 0x000b, 0x35f9: 0x000b, 0x35fa: 0x000b, 0x35fb: 0x000c, + 0x35fc: 0x000c, 0x35fd: 0x000c, 0x35fe: 0x000c, 0x35ff: 0x000c, + // Block 0xd8, offset 0x3600 + 0x3600: 0x000c, 0x3601: 0x000c, 0x3602: 0x000c, 0x3605: 0x000c, + 0x3606: 0x000c, 0x3607: 0x000c, 0x3608: 0x000c, 0x3609: 0x000c, 0x360a: 0x000c, 0x360b: 0x000c, + 0x362a: 0x000c, 0x362b: 0x000c, 0x362c: 0x000c, 0x362d: 0x000c, + // Block 0xd9, offset 0x3640 + 0x3669: 0x000a, + 0x366a: 0x000a, + // Block 0xda, offset 0x3680 + 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000c, 0x3683: 0x000c, 0x3684: 0x000c, 0x3685: 0x000a, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a, + 0x36c6: 0x000a, 0x36c7: 0x000a, 0x36c8: 0x000a, 0x36c9: 0x000a, 0x36ca: 0x000a, 0x36cb: 0x000a, + 0x36cc: 0x000a, 0x36cd: 0x000a, 0x36ce: 0x000a, 0x36cf: 0x000a, 0x36d0: 0x000a, 0x36d1: 0x000a, + 0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, + // Block 0xdc, offset 0x3700 + 0x371b: 0x000a, + // Block 0xdd, offset 0x3740 + 0x3755: 0x000a, + // Block 0xde, offset 0x3780 + 0x378f: 0x000a, + // Block 0xdf, offset 0x37c0 + 0x37c9: 0x000a, + // Block 0xe0, offset 0x3800 + 0x3803: 0x000a, + 0x380e: 0x0002, 0x380f: 0x0002, 0x3810: 0x0002, 0x3811: 0x0002, + 0x3812: 0x0002, 0x3813: 0x0002, 0x3814: 0x0002, 0x3815: 0x0002, 0x3816: 0x0002, 0x3817: 0x0002, + 0x3818: 0x0002, 0x3819: 0x0002, 0x381a: 0x0002, 0x381b: 0x0002, 0x381c: 0x0002, 0x381d: 0x0002, + 0x381e: 0x0002, 0x381f: 0x0002, 0x3820: 0x0002, 0x3821: 0x0002, 0x3822: 0x0002, 0x3823: 0x0002, + 0x3824: 0x0002, 0x3825: 0x0002, 0x3826: 0x0002, 0x3827: 0x0002, 0x3828: 0x0002, 0x3829: 0x0002, + 0x382a: 0x0002, 0x382b: 0x0002, 0x382c: 0x0002, 0x382d: 0x0002, 0x382e: 0x0002, 0x382f: 0x0002, + 0x3830: 0x0002, 0x3831: 0x0002, 0x3832: 0x0002, 0x3833: 0x0002, 0x3834: 0x0002, 0x3835: 0x0002, + 0x3836: 0x0002, 0x3837: 0x0002, 0x3838: 0x0002, 0x3839: 0x0002, 0x383a: 0x0002, 0x383b: 0x0002, + 0x383c: 0x0002, 0x383d: 0x0002, 0x383e: 0x0002, 0x383f: 0x0002, + // Block 0xe1, offset 0x3840 + 0x3840: 0x000c, 0x3841: 0x000c, 0x3842: 0x000c, 0x3843: 0x000c, 0x3844: 0x000c, 0x3845: 0x000c, + 0x3846: 0x000c, 0x3847: 0x000c, 0x3848: 0x000c, 0x3849: 0x000c, 0x384a: 0x000c, 0x384b: 0x000c, + 0x384c: 0x000c, 0x384d: 0x000c, 0x384e: 0x000c, 0x384f: 0x000c, 0x3850: 0x000c, 0x3851: 0x000c, + 0x3852: 0x000c, 0x3853: 0x000c, 0x3854: 0x000c, 0x3855: 0x000c, 0x3856: 0x000c, 0x3857: 0x000c, + 0x3858: 0x000c, 0x3859: 0x000c, 0x385a: 0x000c, 0x385b: 0x000c, 0x385c: 0x000c, 0x385d: 0x000c, + 0x385e: 0x000c, 0x385f: 0x000c, 0x3860: 0x000c, 0x3861: 0x000c, 0x3862: 0x000c, 0x3863: 0x000c, + 0x3864: 0x000c, 0x3865: 0x000c, 0x3866: 0x000c, 0x3867: 0x000c, 0x3868: 0x000c, 0x3869: 0x000c, + 0x386a: 0x000c, 0x386b: 0x000c, 0x386c: 0x000c, 0x386d: 0x000c, 0x386e: 0x000c, 0x386f: 0x000c, + 0x3870: 0x000c, 0x3871: 0x000c, 0x3872: 0x000c, 0x3873: 0x000c, 0x3874: 0x000c, 0x3875: 0x000c, + 0x3876: 0x000c, 0x387b: 0x000c, + 0x387c: 0x000c, 0x387d: 0x000c, 0x387e: 0x000c, 0x387f: 0x000c, + // Block 0xe2, offset 0x3880 + 0x3880: 0x000c, 0x3881: 0x000c, 0x3882: 0x000c, 0x3883: 0x000c, 0x3884: 0x000c, 0x3885: 0x000c, + 0x3886: 0x000c, 0x3887: 0x000c, 0x3888: 0x000c, 0x3889: 0x000c, 0x388a: 0x000c, 0x388b: 0x000c, + 0x388c: 0x000c, 0x388d: 0x000c, 0x388e: 0x000c, 0x388f: 0x000c, 0x3890: 0x000c, 0x3891: 0x000c, + 0x3892: 0x000c, 0x3893: 0x000c, 0x3894: 0x000c, 0x3895: 0x000c, 0x3896: 0x000c, 0x3897: 0x000c, + 0x3898: 0x000c, 0x3899: 0x000c, 0x389a: 0x000c, 0x389b: 0x000c, 0x389c: 0x000c, 0x389d: 0x000c, + 0x389e: 0x000c, 0x389f: 0x000c, 0x38a0: 0x000c, 0x38a1: 0x000c, 0x38a2: 0x000c, 0x38a3: 0x000c, + 0x38a4: 0x000c, 0x38a5: 0x000c, 0x38a6: 0x000c, 0x38a7: 0x000c, 0x38a8: 0x000c, 0x38a9: 0x000c, + 0x38aa: 0x000c, 0x38ab: 0x000c, 0x38ac: 0x000c, + 0x38b5: 0x000c, + // Block 0xe3, offset 0x38c0 + 0x38c4: 0x000c, + 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c, + 0x38de: 0x000c, 0x38df: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c, + 0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c, + 0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c, + // Block 0xe4, offset 0x3900 + 0x3900: 0x000c, 0x3901: 0x000c, 0x3902: 0x000c, 0x3903: 0x000c, 0x3904: 0x000c, 0x3905: 0x000c, + 0x3906: 0x000c, 0x3908: 0x000c, 0x3909: 0x000c, 0x390a: 0x000c, 0x390b: 0x000c, + 0x390c: 0x000c, 0x390d: 0x000c, 0x390e: 0x000c, 0x390f: 0x000c, 0x3910: 0x000c, 0x3911: 0x000c, + 0x3912: 0x000c, 0x3913: 0x000c, 0x3914: 0x000c, 0x3915: 0x000c, 0x3916: 0x000c, 0x3917: 0x000c, + 0x3918: 0x000c, 0x391b: 0x000c, 0x391c: 0x000c, 0x391d: 0x000c, + 0x391e: 0x000c, 0x391f: 0x000c, 0x3920: 0x000c, 0x3921: 0x000c, 0x3923: 0x000c, + 0x3924: 0x000c, 0x3926: 0x000c, 0x3927: 0x000c, 0x3928: 0x000c, 0x3929: 0x000c, + 0x392a: 0x000c, + // Block 0xe5, offset 0x3940 + 0x396e: 0x000c, + // Block 0xe6, offset 0x3980 + 0x39ac: 0x000c, 0x39ad: 0x000c, 0x39ae: 0x000c, 0x39af: 0x000c, + 0x39bf: 0x0004, + // Block 0xe7, offset 0x39c0 + 0x39ec: 0x000c, 0x39ed: 0x000c, 0x39ee: 0x000c, 0x39ef: 0x000c, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x0001, 0x3a01: 0x0001, 0x3a02: 0x0001, 0x3a03: 0x0001, 0x3a04: 0x0001, 0x3a05: 0x0001, + 0x3a06: 0x0001, 0x3a07: 0x0001, 0x3a08: 0x0001, 0x3a09: 0x0001, 0x3a0a: 0x0001, 0x3a0b: 0x0001, + 0x3a0c: 0x0001, 0x3a0d: 0x0001, 0x3a0e: 0x0001, 0x3a0f: 0x0001, 0x3a10: 0x000c, 0x3a11: 0x000c, + 0x3a12: 0x000c, 0x3a13: 0x000c, 0x3a14: 0x000c, 0x3a15: 0x000c, 0x3a16: 0x000c, 0x3a17: 0x0001, + 0x3a18: 0x0001, 0x3a19: 0x0001, 0x3a1a: 0x0001, 0x3a1b: 0x0001, 0x3a1c: 0x0001, 0x3a1d: 0x0001, + 0x3a1e: 0x0001, 0x3a1f: 0x0001, 0x3a20: 0x0001, 0x3a21: 0x0001, 0x3a22: 0x0001, 0x3a23: 0x0001, + 0x3a24: 0x0001, 0x3a25: 0x0001, 0x3a26: 0x0001, 0x3a27: 0x0001, 0x3a28: 0x0001, 0x3a29: 0x0001, + 0x3a2a: 0x0001, 0x3a2b: 0x0001, 0x3a2c: 0x0001, 0x3a2d: 0x0001, 0x3a2e: 0x0001, 0x3a2f: 0x0001, + 0x3a30: 0x0001, 0x3a31: 0x0001, 0x3a32: 0x0001, 0x3a33: 0x0001, 0x3a34: 0x0001, 0x3a35: 0x0001, + 0x3a36: 0x0001, 0x3a37: 0x0001, 0x3a38: 0x0001, 0x3a39: 0x0001, 0x3a3a: 0x0001, 0x3a3b: 0x0001, + 0x3a3c: 0x0001, 0x3a3d: 0x0001, 0x3a3e: 0x0001, 0x3a3f: 0x0001, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0001, 0x3a41: 0x0001, 0x3a42: 0x0001, 0x3a43: 0x0001, 0x3a44: 0x000c, 0x3a45: 0x000c, + 0x3a46: 0x000c, 0x3a47: 0x000c, 0x3a48: 0x000c, 0x3a49: 0x000c, 0x3a4a: 0x000c, 0x3a4b: 0x0001, + 0x3a4c: 0x0001, 0x3a4d: 0x0001, 0x3a4e: 0x0001, 0x3a4f: 0x0001, 0x3a50: 0x0001, 0x3a51: 0x0001, + 0x3a52: 0x0001, 0x3a53: 0x0001, 0x3a54: 0x0001, 0x3a55: 0x0001, 0x3a56: 0x0001, 0x3a57: 0x0001, + 0x3a58: 0x0001, 0x3a59: 0x0001, 0x3a5a: 0x0001, 0x3a5b: 0x0001, 0x3a5c: 0x0001, 0x3a5d: 0x0001, + 0x3a5e: 0x0001, 0x3a5f: 0x0001, 0x3a60: 0x0001, 0x3a61: 0x0001, 0x3a62: 0x0001, 0x3a63: 0x0001, + 0x3a64: 0x0001, 0x3a65: 0x0001, 0x3a66: 0x0001, 0x3a67: 0x0001, 0x3a68: 0x0001, 0x3a69: 0x0001, + 0x3a6a: 0x0001, 0x3a6b: 0x0001, 0x3a6c: 0x0001, 0x3a6d: 0x0001, 0x3a6e: 0x0001, 0x3a6f: 0x0001, + 0x3a70: 0x0001, 0x3a71: 0x0001, 0x3a72: 0x0001, 0x3a73: 0x0001, 0x3a74: 0x0001, 0x3a75: 0x0001, + 0x3a76: 0x0001, 0x3a77: 0x0001, 0x3a78: 0x0001, 0x3a79: 0x0001, 0x3a7a: 0x0001, 0x3a7b: 0x0001, + 0x3a7c: 0x0001, 0x3a7d: 0x0001, 0x3a7e: 0x0001, 0x3a7f: 0x0001, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x0001, 0x3a81: 0x0001, 0x3a82: 0x0001, 0x3a83: 0x0001, 0x3a84: 0x0001, 0x3a85: 0x0001, + 0x3a86: 0x0001, 0x3a87: 0x0001, 0x3a88: 0x0001, 0x3a89: 0x0001, 0x3a8a: 0x0001, 0x3a8b: 0x0001, + 0x3a8c: 0x0001, 0x3a8d: 0x0001, 0x3a8e: 0x0001, 0x3a8f: 0x0001, 0x3a90: 0x0001, 0x3a91: 0x0001, + 0x3a92: 0x0001, 0x3a93: 0x0001, 0x3a94: 0x0001, 0x3a95: 0x0001, 0x3a96: 0x0001, 0x3a97: 0x0001, + 0x3a98: 0x0001, 0x3a99: 0x0001, 0x3a9a: 0x0001, 0x3a9b: 0x0001, 0x3a9c: 0x0001, 0x3a9d: 0x0001, + 0x3a9e: 0x0001, 0x3a9f: 0x0001, 0x3aa0: 0x0001, 0x3aa1: 0x0001, 0x3aa2: 0x0001, 0x3aa3: 0x0001, + 0x3aa4: 0x0001, 0x3aa5: 0x0001, 0x3aa6: 0x0001, 0x3aa7: 0x0001, 0x3aa8: 0x0001, 0x3aa9: 0x0001, + 0x3aaa: 0x0001, 0x3aab: 0x0001, 0x3aac: 0x0001, 0x3aad: 0x0001, 0x3aae: 0x0001, 0x3aaf: 0x0001, + 0x3ab0: 0x0001, 0x3ab1: 0x000d, 0x3ab2: 0x000d, 0x3ab3: 0x000d, 0x3ab4: 0x000d, 0x3ab5: 0x000d, + 0x3ab6: 0x000d, 0x3ab7: 0x000d, 0x3ab8: 0x000d, 0x3ab9: 0x000d, 0x3aba: 0x000d, 0x3abb: 0x000d, + 0x3abc: 0x000d, 0x3abd: 0x000d, 0x3abe: 0x000d, 0x3abf: 0x000d, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x000d, 0x3ac1: 0x000d, 0x3ac2: 0x000d, 0x3ac3: 0x000d, 0x3ac4: 0x000d, 0x3ac5: 0x000d, + 0x3ac6: 0x000d, 0x3ac7: 0x000d, 0x3ac8: 0x000d, 0x3ac9: 0x000d, 0x3aca: 0x000d, 0x3acb: 0x000d, + 0x3acc: 0x000d, 0x3acd: 0x000d, 0x3ace: 0x000d, 0x3acf: 0x000d, 0x3ad0: 0x000d, 0x3ad1: 0x000d, + 0x3ad2: 0x000d, 0x3ad3: 0x000d, 0x3ad4: 0x000d, 0x3ad5: 0x000d, 0x3ad6: 0x000d, 0x3ad7: 0x000d, + 0x3ad8: 0x000d, 0x3ad9: 0x000d, 0x3ada: 0x000d, 0x3adb: 0x000d, 0x3adc: 0x000d, 0x3add: 0x000d, + 0x3ade: 0x000d, 0x3adf: 0x000d, 0x3ae0: 0x000d, 0x3ae1: 0x000d, 0x3ae2: 0x000d, 0x3ae3: 0x000d, + 0x3ae4: 0x000d, 0x3ae5: 0x000d, 0x3ae6: 0x000d, 0x3ae7: 0x000d, 0x3ae8: 0x000d, 0x3ae9: 0x000d, + 0x3aea: 0x000d, 0x3aeb: 0x000d, 0x3aec: 0x000d, 0x3aed: 0x000d, 0x3aee: 0x000d, 0x3aef: 0x000d, + 0x3af0: 0x000d, 0x3af1: 0x000d, 0x3af2: 0x000d, 0x3af3: 0x000d, 0x3af4: 0x000d, 0x3af5: 0x0001, + 0x3af6: 0x0001, 0x3af7: 0x0001, 0x3af8: 0x0001, 0x3af9: 0x0001, 0x3afa: 0x0001, 0x3afb: 0x0001, + 0x3afc: 0x0001, 0x3afd: 0x0001, 0x3afe: 0x0001, 0x3aff: 0x0001, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x0001, 0x3b01: 0x000d, 0x3b02: 0x000d, 0x3b03: 0x000d, 0x3b04: 0x000d, 0x3b05: 0x000d, + 0x3b06: 0x000d, 0x3b07: 0x000d, 0x3b08: 0x000d, 0x3b09: 0x000d, 0x3b0a: 0x000d, 0x3b0b: 0x000d, + 0x3b0c: 0x000d, 0x3b0d: 0x000d, 0x3b0e: 0x000d, 0x3b0f: 0x000d, 0x3b10: 0x000d, 0x3b11: 0x000d, + 0x3b12: 0x000d, 0x3b13: 0x000d, 0x3b14: 0x000d, 0x3b15: 0x000d, 0x3b16: 0x000d, 0x3b17: 0x000d, + 0x3b18: 0x000d, 0x3b19: 0x000d, 0x3b1a: 0x000d, 0x3b1b: 0x000d, 0x3b1c: 0x000d, 0x3b1d: 0x000d, + 0x3b1e: 0x000d, 0x3b1f: 0x000d, 0x3b20: 0x000d, 0x3b21: 0x000d, 0x3b22: 0x000d, 0x3b23: 0x000d, + 0x3b24: 0x000d, 0x3b25: 0x000d, 0x3b26: 0x000d, 0x3b27: 0x000d, 0x3b28: 0x000d, 0x3b29: 0x000d, + 0x3b2a: 0x000d, 0x3b2b: 0x000d, 0x3b2c: 0x000d, 0x3b2d: 0x000d, 0x3b2e: 0x000d, 0x3b2f: 0x000d, + 0x3b30: 0x000d, 0x3b31: 0x000d, 0x3b32: 0x000d, 0x3b33: 0x000d, 0x3b34: 0x000d, 0x3b35: 0x000d, + 0x3b36: 0x000d, 0x3b37: 0x000d, 0x3b38: 0x000d, 0x3b39: 0x000d, 0x3b3a: 0x000d, 0x3b3b: 0x000d, + 0x3b3c: 0x000d, 0x3b3d: 0x000d, 0x3b3e: 0x0001, 0x3b3f: 0x0001, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x000d, 0x3b41: 0x000d, 0x3b42: 0x000d, 0x3b43: 0x000d, 0x3b44: 0x000d, 0x3b45: 0x000d, + 0x3b46: 0x000d, 0x3b47: 0x000d, 0x3b48: 0x000d, 0x3b49: 0x000d, 0x3b4a: 0x000d, 0x3b4b: 0x000d, + 0x3b4c: 0x000d, 0x3b4d: 0x000d, 0x3b4e: 0x000d, 0x3b4f: 0x000d, 0x3b50: 0x000d, 0x3b51: 0x000d, + 0x3b52: 0x000d, 0x3b53: 0x000d, 0x3b54: 0x000d, 0x3b55: 0x000d, 0x3b56: 0x000d, 0x3b57: 0x000d, + 0x3b58: 0x000d, 0x3b59: 0x000d, 0x3b5a: 0x000d, 0x3b5b: 0x000d, 0x3b5c: 0x000d, 0x3b5d: 0x000d, + 0x3b5e: 0x000d, 0x3b5f: 0x000d, 0x3b60: 0x000d, 0x3b61: 0x000d, 0x3b62: 0x000d, 0x3b63: 0x000d, + 0x3b64: 0x000d, 0x3b65: 0x000d, 0x3b66: 0x000d, 0x3b67: 0x000d, 0x3b68: 0x000d, 0x3b69: 0x000d, + 0x3b6a: 0x000d, 0x3b6b: 0x000d, 0x3b6c: 0x000d, 0x3b6d: 0x000d, 0x3b6e: 0x000d, 0x3b6f: 0x000d, + 0x3b70: 0x000a, 0x3b71: 0x000a, 0x3b72: 0x000d, 0x3b73: 0x000d, 0x3b74: 0x000d, 0x3b75: 0x000d, + 0x3b76: 0x000d, 0x3b77: 0x000d, 0x3b78: 0x000d, 0x3b79: 0x000d, 0x3b7a: 0x000d, 0x3b7b: 0x000d, + 0x3b7c: 0x000d, 0x3b7d: 0x000d, 0x3b7e: 0x000d, 0x3b7f: 0x000d, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x000a, 0x3b81: 0x000a, 0x3b82: 0x000a, 0x3b83: 0x000a, 0x3b84: 0x000a, 0x3b85: 0x000a, + 0x3b86: 0x000a, 0x3b87: 0x000a, 0x3b88: 0x000a, 0x3b89: 0x000a, 0x3b8a: 0x000a, 0x3b8b: 0x000a, + 0x3b8c: 0x000a, 0x3b8d: 0x000a, 0x3b8e: 0x000a, 0x3b8f: 0x000a, 0x3b90: 0x000a, 0x3b91: 0x000a, + 0x3b92: 0x000a, 0x3b93: 0x000a, 0x3b94: 0x000a, 0x3b95: 0x000a, 0x3b96: 0x000a, 0x3b97: 0x000a, + 0x3b98: 0x000a, 0x3b99: 0x000a, 0x3b9a: 0x000a, 0x3b9b: 0x000a, 0x3b9c: 0x000a, 0x3b9d: 0x000a, + 0x3b9e: 0x000a, 0x3b9f: 0x000a, 0x3ba0: 0x000a, 0x3ba1: 0x000a, 0x3ba2: 0x000a, 0x3ba3: 0x000a, + 0x3ba4: 0x000a, 0x3ba5: 0x000a, 0x3ba6: 0x000a, 0x3ba7: 0x000a, 0x3ba8: 0x000a, 0x3ba9: 0x000a, + 0x3baa: 0x000a, 0x3bab: 0x000a, + 0x3bb0: 0x000a, 0x3bb1: 0x000a, 0x3bb2: 0x000a, 0x3bb3: 0x000a, 0x3bb4: 0x000a, 0x3bb5: 0x000a, + 0x3bb6: 0x000a, 0x3bb7: 0x000a, 0x3bb8: 0x000a, 0x3bb9: 0x000a, 0x3bba: 0x000a, 0x3bbb: 0x000a, + 0x3bbc: 0x000a, 0x3bbd: 0x000a, 0x3bbe: 0x000a, 0x3bbf: 0x000a, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x000a, 0x3bc1: 0x000a, 0x3bc2: 0x000a, 0x3bc3: 0x000a, 0x3bc4: 0x000a, 0x3bc5: 0x000a, + 0x3bc6: 0x000a, 0x3bc7: 0x000a, 0x3bc8: 0x000a, 0x3bc9: 0x000a, 0x3bca: 0x000a, 0x3bcb: 0x000a, + 0x3bcc: 0x000a, 0x3bcd: 0x000a, 0x3bce: 0x000a, 0x3bcf: 0x000a, 0x3bd0: 0x000a, 0x3bd1: 0x000a, + 0x3bd2: 0x000a, 0x3bd3: 0x000a, + 0x3be0: 0x000a, 0x3be1: 0x000a, 0x3be2: 0x000a, 0x3be3: 0x000a, + 0x3be4: 0x000a, 0x3be5: 0x000a, 0x3be6: 0x000a, 0x3be7: 0x000a, 0x3be8: 0x000a, 0x3be9: 0x000a, + 0x3bea: 0x000a, 0x3beb: 0x000a, 0x3bec: 0x000a, 0x3bed: 0x000a, 0x3bee: 0x000a, + 0x3bf1: 0x000a, 0x3bf2: 0x000a, 0x3bf3: 0x000a, 0x3bf4: 0x000a, 0x3bf5: 0x000a, + 0x3bf6: 0x000a, 0x3bf7: 0x000a, 0x3bf8: 0x000a, 0x3bf9: 0x000a, 0x3bfa: 0x000a, 0x3bfb: 0x000a, + 0x3bfc: 0x000a, 0x3bfd: 0x000a, 0x3bfe: 0x000a, 0x3bff: 0x000a, + // Block 0xf0, offset 0x3c00 + 0x3c01: 0x000a, 0x3c02: 0x000a, 0x3c03: 0x000a, 0x3c04: 0x000a, 0x3c05: 0x000a, + 0x3c06: 0x000a, 0x3c07: 0x000a, 0x3c08: 0x000a, 0x3c09: 0x000a, 0x3c0a: 0x000a, 0x3c0b: 0x000a, + 0x3c0c: 0x000a, 0x3c0d: 0x000a, 0x3c0e: 0x000a, 0x3c0f: 0x000a, 0x3c11: 0x000a, + 0x3c12: 0x000a, 0x3c13: 0x000a, 0x3c14: 0x000a, 0x3c15: 0x000a, 0x3c16: 0x000a, 0x3c17: 0x000a, + 0x3c18: 0x000a, 0x3c19: 0x000a, 0x3c1a: 0x000a, 0x3c1b: 0x000a, 0x3c1c: 0x000a, 0x3c1d: 0x000a, + 0x3c1e: 0x000a, 0x3c1f: 0x000a, 0x3c20: 0x000a, 0x3c21: 0x000a, 0x3c22: 0x000a, 0x3c23: 0x000a, + 0x3c24: 0x000a, 0x3c25: 0x000a, 0x3c26: 0x000a, 0x3c27: 0x000a, 0x3c28: 0x000a, 0x3c29: 0x000a, + 0x3c2a: 0x000a, 0x3c2b: 0x000a, 0x3c2c: 0x000a, 0x3c2d: 0x000a, 0x3c2e: 0x000a, 0x3c2f: 0x000a, + 0x3c30: 0x000a, 0x3c31: 0x000a, 0x3c32: 0x000a, 0x3c33: 0x000a, 0x3c34: 0x000a, 0x3c35: 0x000a, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x0002, 0x3c41: 0x0002, 0x3c42: 0x0002, 0x3c43: 0x0002, 0x3c44: 0x0002, 0x3c45: 0x0002, + 0x3c46: 0x0002, 0x3c47: 0x0002, 0x3c48: 0x0002, 0x3c49: 0x0002, 0x3c4a: 0x0002, 0x3c4b: 0x000a, + 0x3c4c: 0x000a, 0x3c4d: 0x000a, 0x3c4e: 0x000a, 0x3c4f: 0x000a, + 0x3c6f: 0x000a, + // Block 0xf2, offset 0x3c80 + 0x3caa: 0x000a, 0x3cab: 0x000a, 0x3cac: 0x000a, 0x3cad: 0x000a, 0x3cae: 0x000a, 0x3caf: 0x000a, + // Block 0xf3, offset 0x3cc0 + 0x3ced: 0x000a, + // Block 0xf4, offset 0x3d00 + 0x3d20: 0x000a, 0x3d21: 0x000a, 0x3d22: 0x000a, 0x3d23: 0x000a, + 0x3d24: 0x000a, 0x3d25: 0x000a, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x000a, 0x3d41: 0x000a, 0x3d42: 0x000a, 0x3d43: 0x000a, 0x3d44: 0x000a, 0x3d45: 0x000a, + 0x3d46: 0x000a, 0x3d47: 0x000a, 0x3d48: 0x000a, 0x3d49: 0x000a, 0x3d4a: 0x000a, 0x3d4b: 0x000a, + 0x3d4c: 0x000a, 0x3d4d: 0x000a, 0x3d4e: 0x000a, 0x3d4f: 0x000a, 0x3d50: 0x000a, 0x3d51: 0x000a, + 0x3d52: 0x000a, 0x3d53: 0x000a, 0x3d54: 0x000a, 0x3d55: 0x000a, 0x3d56: 0x000a, 0x3d57: 0x000a, + 0x3d5c: 0x000a, 0x3d5d: 0x000a, + 0x3d5e: 0x000a, 0x3d5f: 0x000a, 0x3d60: 0x000a, 0x3d61: 0x000a, 0x3d62: 0x000a, 0x3d63: 0x000a, + 0x3d64: 0x000a, 0x3d65: 0x000a, 0x3d66: 0x000a, 0x3d67: 0x000a, 0x3d68: 0x000a, 0x3d69: 0x000a, + 0x3d6a: 0x000a, 0x3d6b: 0x000a, 0x3d6c: 0x000a, + 0x3d70: 0x000a, 0x3d71: 0x000a, 0x3d72: 0x000a, 0x3d73: 0x000a, 0x3d74: 0x000a, 0x3d75: 0x000a, + 0x3d76: 0x000a, 0x3d77: 0x000a, 0x3d78: 0x000a, 0x3d79: 0x000a, 0x3d7a: 0x000a, 0x3d7b: 0x000a, + 0x3d7c: 0x000a, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x000a, 0x3d81: 0x000a, 0x3d82: 0x000a, 0x3d83: 0x000a, 0x3d84: 0x000a, 0x3d85: 0x000a, + 0x3d86: 0x000a, 0x3d87: 0x000a, 0x3d88: 0x000a, 0x3d89: 0x000a, 0x3d8a: 0x000a, 0x3d8b: 0x000a, + 0x3d8c: 0x000a, 0x3d8d: 0x000a, 0x3d8e: 0x000a, 0x3d8f: 0x000a, 0x3d90: 0x000a, 0x3d91: 0x000a, + 0x3d92: 0x000a, 0x3d93: 0x000a, 0x3d94: 0x000a, 0x3d95: 0x000a, 0x3d96: 0x000a, 0x3d97: 0x000a, + 0x3d98: 0x000a, 0x3d99: 0x000a, 0x3d9a: 0x000a, 0x3d9b: 0x000a, 0x3d9c: 0x000a, 0x3d9d: 0x000a, + 0x3d9e: 0x000a, 0x3d9f: 0x000a, 0x3da0: 0x000a, 0x3da1: 0x000a, 0x3da2: 0x000a, 0x3da3: 0x000a, + 0x3da4: 0x000a, 0x3da5: 0x000a, 0x3da6: 0x000a, 0x3da7: 0x000a, 0x3da8: 0x000a, 0x3da9: 0x000a, + 0x3daa: 0x000a, 0x3dab: 0x000a, 0x3dac: 0x000a, 0x3dad: 0x000a, 0x3dae: 0x000a, 0x3daf: 0x000a, + 0x3db0: 0x000a, 0x3db1: 0x000a, 0x3db2: 0x000a, 0x3db3: 0x000a, 0x3db4: 0x000a, 0x3db5: 0x000a, + 0x3db6: 0x000a, 0x3dbb: 0x000a, + 0x3dbc: 0x000a, 0x3dbd: 0x000a, 0x3dbe: 0x000a, 0x3dbf: 0x000a, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x000a, 0x3dc1: 0x000a, 0x3dc2: 0x000a, 0x3dc3: 0x000a, 0x3dc4: 0x000a, 0x3dc5: 0x000a, + 0x3dc6: 0x000a, 0x3dc7: 0x000a, 0x3dc8: 0x000a, 0x3dc9: 0x000a, 0x3dca: 0x000a, 0x3dcb: 0x000a, + 0x3dcc: 0x000a, 0x3dcd: 0x000a, 0x3dce: 0x000a, 0x3dcf: 0x000a, 0x3dd0: 0x000a, 0x3dd1: 0x000a, + 0x3dd2: 0x000a, 0x3dd3: 0x000a, 0x3dd4: 0x000a, 0x3dd5: 0x000a, 0x3dd6: 0x000a, 0x3dd7: 0x000a, + 0x3dd8: 0x000a, 0x3dd9: 0x000a, + 0x3de0: 0x000a, 0x3de1: 0x000a, 0x3de2: 0x000a, 0x3de3: 0x000a, + 0x3de4: 0x000a, 0x3de5: 0x000a, 0x3de6: 0x000a, 0x3de7: 0x000a, 0x3de8: 0x000a, 0x3de9: 0x000a, + 0x3dea: 0x000a, 0x3deb: 0x000a, + 0x3df0: 0x000a, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x000a, 0x3e01: 0x000a, 0x3e02: 0x000a, 0x3e03: 0x000a, 0x3e04: 0x000a, 0x3e05: 0x000a, + 0x3e06: 0x000a, 0x3e07: 0x000a, 0x3e08: 0x000a, 0x3e09: 0x000a, 0x3e0a: 0x000a, 0x3e0b: 0x000a, + 0x3e10: 0x000a, 0x3e11: 0x000a, + 0x3e12: 0x000a, 0x3e13: 0x000a, 0x3e14: 0x000a, 0x3e15: 0x000a, 0x3e16: 0x000a, 0x3e17: 0x000a, + 0x3e18: 0x000a, 0x3e19: 0x000a, 0x3e1a: 0x000a, 0x3e1b: 0x000a, 0x3e1c: 0x000a, 0x3e1d: 0x000a, + 0x3e1e: 0x000a, 0x3e1f: 0x000a, 0x3e20: 0x000a, 0x3e21: 0x000a, 0x3e22: 0x000a, 0x3e23: 0x000a, + 0x3e24: 0x000a, 0x3e25: 0x000a, 0x3e26: 0x000a, 0x3e27: 0x000a, 0x3e28: 0x000a, 0x3e29: 0x000a, + 0x3e2a: 0x000a, 0x3e2b: 0x000a, 0x3e2c: 0x000a, 0x3e2d: 0x000a, 0x3e2e: 0x000a, 0x3e2f: 0x000a, + 0x3e30: 0x000a, 0x3e31: 0x000a, 0x3e32: 0x000a, 0x3e33: 0x000a, 0x3e34: 0x000a, 0x3e35: 0x000a, + 0x3e36: 0x000a, 0x3e37: 0x000a, 0x3e38: 0x000a, 0x3e39: 0x000a, 0x3e3a: 0x000a, 0x3e3b: 0x000a, + 0x3e3c: 0x000a, 0x3e3d: 0x000a, 0x3e3e: 0x000a, 0x3e3f: 0x000a, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x000a, 0x3e41: 0x000a, 0x3e42: 0x000a, 0x3e43: 0x000a, 0x3e44: 0x000a, 0x3e45: 0x000a, + 0x3e46: 0x000a, 0x3e47: 0x000a, + 0x3e50: 0x000a, 0x3e51: 0x000a, + 0x3e52: 0x000a, 0x3e53: 0x000a, 0x3e54: 0x000a, 0x3e55: 0x000a, 0x3e56: 0x000a, 0x3e57: 0x000a, + 0x3e58: 0x000a, 0x3e59: 0x000a, + 0x3e60: 0x000a, 0x3e61: 0x000a, 0x3e62: 0x000a, 0x3e63: 0x000a, + 0x3e64: 0x000a, 0x3e65: 0x000a, 0x3e66: 0x000a, 0x3e67: 0x000a, 0x3e68: 0x000a, 0x3e69: 0x000a, + 0x3e6a: 0x000a, 0x3e6b: 0x000a, 0x3e6c: 0x000a, 0x3e6d: 0x000a, 0x3e6e: 0x000a, 0x3e6f: 0x000a, + 0x3e70: 0x000a, 0x3e71: 0x000a, 0x3e72: 0x000a, 0x3e73: 0x000a, 0x3e74: 0x000a, 0x3e75: 0x000a, + 0x3e76: 0x000a, 0x3e77: 0x000a, 0x3e78: 0x000a, 0x3e79: 0x000a, 0x3e7a: 0x000a, 0x3e7b: 0x000a, + 0x3e7c: 0x000a, 0x3e7d: 0x000a, 0x3e7e: 0x000a, 0x3e7f: 0x000a, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x000a, 0x3e81: 0x000a, 0x3e82: 0x000a, 0x3e83: 0x000a, 0x3e84: 0x000a, 0x3e85: 0x000a, + 0x3e86: 0x000a, 0x3e87: 0x000a, + 0x3e90: 0x000a, 0x3e91: 0x000a, + 0x3e92: 0x000a, 0x3e93: 0x000a, 0x3e94: 0x000a, 0x3e95: 0x000a, 0x3e96: 0x000a, 0x3e97: 0x000a, + 0x3e98: 0x000a, 0x3e99: 0x000a, 0x3e9a: 0x000a, 0x3e9b: 0x000a, 0x3e9c: 0x000a, 0x3e9d: 0x000a, + 0x3e9e: 0x000a, 0x3e9f: 0x000a, 0x3ea0: 0x000a, 0x3ea1: 0x000a, 0x3ea2: 0x000a, 0x3ea3: 0x000a, + 0x3ea4: 0x000a, 0x3ea5: 0x000a, 0x3ea6: 0x000a, 0x3ea7: 0x000a, 0x3ea8: 0x000a, 0x3ea9: 0x000a, + 0x3eaa: 0x000a, 0x3eab: 0x000a, 0x3eac: 0x000a, 0x3ead: 0x000a, + 0x3eb0: 0x000a, 0x3eb1: 0x000a, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x000a, 0x3ec1: 0x000a, 0x3ec2: 0x000a, 0x3ec3: 0x000a, 0x3ec4: 0x000a, 0x3ec5: 0x000a, + 0x3ec6: 0x000a, 0x3ec7: 0x000a, 0x3ec8: 0x000a, 0x3ec9: 0x000a, 0x3eca: 0x000a, 0x3ecb: 0x000a, + 0x3ecc: 0x000a, 0x3ecd: 0x000a, 0x3ece: 0x000a, 0x3ecf: 0x000a, 0x3ed0: 0x000a, 0x3ed1: 0x000a, + 0x3ed2: 0x000a, 0x3ed3: 0x000a, + 0x3ee0: 0x000a, 0x3ee1: 0x000a, 0x3ee2: 0x000a, 0x3ee3: 0x000a, + 0x3ee4: 0x000a, 0x3ee5: 0x000a, 0x3ee6: 0x000a, 0x3ee7: 0x000a, 0x3ee8: 0x000a, 0x3ee9: 0x000a, + 0x3eea: 0x000a, 0x3eeb: 0x000a, 0x3eec: 0x000a, 0x3eed: 0x000a, + 0x3ef0: 0x000a, 0x3ef1: 0x000a, 0x3ef2: 0x000a, 0x3ef3: 0x000a, 0x3ef4: 0x000a, 0x3ef5: 0x000a, + 0x3ef6: 0x000a, 0x3ef7: 0x000a, 0x3ef8: 0x000a, 0x3ef9: 0x000a, 0x3efa: 0x000a, 0x3efb: 0x000a, + 0x3efc: 0x000a, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x000a, 0x3f01: 0x000a, 0x3f02: 0x000a, 0x3f03: 0x000a, 0x3f04: 0x000a, 0x3f05: 0x000a, + 0x3f06: 0x000a, 0x3f07: 0x000a, 0x3f08: 0x000a, + 0x3f10: 0x000a, 0x3f11: 0x000a, + 0x3f12: 0x000a, 0x3f13: 0x000a, 0x3f14: 0x000a, 0x3f15: 0x000a, 0x3f16: 0x000a, 0x3f17: 0x000a, + 0x3f18: 0x000a, 0x3f19: 0x000a, 0x3f1a: 0x000a, 0x3f1b: 0x000a, 0x3f1c: 0x000a, 0x3f1d: 0x000a, + 0x3f1e: 0x000a, 0x3f1f: 0x000a, 0x3f20: 0x000a, 0x3f21: 0x000a, 0x3f22: 0x000a, 0x3f23: 0x000a, + 0x3f24: 0x000a, 0x3f25: 0x000a, 0x3f26: 0x000a, 0x3f27: 0x000a, 0x3f28: 0x000a, 0x3f29: 0x000a, + 0x3f2a: 0x000a, 0x3f2b: 0x000a, 0x3f2c: 0x000a, 0x3f2d: 0x000a, 0x3f2e: 0x000a, 0x3f2f: 0x000a, + 0x3f30: 0x000a, 0x3f31: 0x000a, 0x3f32: 0x000a, 0x3f33: 0x000a, 0x3f34: 0x000a, 0x3f35: 0x000a, + 0x3f36: 0x000a, 0x3f37: 0x000a, 0x3f38: 0x000a, 0x3f39: 0x000a, 0x3f3a: 0x000a, 0x3f3b: 0x000a, + 0x3f3c: 0x000a, 0x3f3d: 0x000a, 0x3f3f: 0x000a, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x000a, 0x3f41: 0x000a, 0x3f42: 0x000a, 0x3f43: 0x000a, 0x3f44: 0x000a, 0x3f45: 0x000a, + 0x3f4e: 0x000a, 0x3f4f: 0x000a, 0x3f50: 0x000a, 0x3f51: 0x000a, + 0x3f52: 0x000a, 0x3f53: 0x000a, 0x3f54: 0x000a, 0x3f55: 0x000a, 0x3f56: 0x000a, 0x3f57: 0x000a, + 0x3f58: 0x000a, 0x3f59: 0x000a, 0x3f5a: 0x000a, 0x3f5b: 0x000a, + 0x3f60: 0x000a, 0x3f61: 0x000a, 0x3f62: 0x000a, 0x3f63: 0x000a, + 0x3f64: 0x000a, 0x3f65: 0x000a, 0x3f66: 0x000a, 0x3f67: 0x000a, 0x3f68: 0x000a, + 0x3f70: 0x000a, 0x3f71: 0x000a, 0x3f72: 0x000a, 0x3f73: 0x000a, 0x3f74: 0x000a, 0x3f75: 0x000a, + 0x3f76: 0x000a, 0x3f77: 0x000a, 0x3f78: 0x000a, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x000a, 0x3f81: 0x000a, 0x3f82: 0x000a, 0x3f83: 0x000a, 0x3f84: 0x000a, 0x3f85: 0x000a, + 0x3f86: 0x000a, 0x3f87: 0x000a, 0x3f88: 0x000a, 0x3f89: 0x000a, 0x3f8a: 0x000a, 0x3f8b: 0x000a, + 0x3f8c: 0x000a, 0x3f8d: 0x000a, 0x3f8e: 0x000a, 0x3f8f: 0x000a, 0x3f90: 0x000a, 0x3f91: 0x000a, + 0x3f92: 0x000a, 0x3f94: 0x000a, 0x3f95: 0x000a, 0x3f96: 0x000a, 0x3f97: 0x000a, + 0x3f98: 0x000a, 0x3f99: 0x000a, 0x3f9a: 0x000a, 0x3f9b: 0x000a, 0x3f9c: 0x000a, 0x3f9d: 0x000a, + 0x3f9e: 0x000a, 0x3f9f: 0x000a, 0x3fa0: 0x000a, 0x3fa1: 0x000a, 0x3fa2: 0x000a, 0x3fa3: 0x000a, + 0x3fa4: 0x000a, 0x3fa5: 0x000a, 0x3fa6: 0x000a, 0x3fa7: 0x000a, 0x3fa8: 0x000a, 0x3fa9: 0x000a, + 0x3faa: 0x000a, 0x3fab: 0x000a, 0x3fac: 0x000a, 0x3fad: 0x000a, 0x3fae: 0x000a, 0x3faf: 0x000a, + 0x3fb0: 0x000a, 0x3fb1: 0x000a, 0x3fb2: 0x000a, 0x3fb3: 0x000a, 0x3fb4: 0x000a, 0x3fb5: 0x000a, + 0x3fb6: 0x000a, 0x3fb7: 0x000a, 0x3fb8: 0x000a, 0x3fb9: 0x000a, 0x3fba: 0x000a, 0x3fbb: 0x000a, + 0x3fbc: 0x000a, 0x3fbd: 0x000a, 0x3fbe: 0x000a, 0x3fbf: 0x000a, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x000a, 0x3fc1: 0x000a, 0x3fc2: 0x000a, 0x3fc3: 0x000a, 0x3fc4: 0x000a, 0x3fc5: 0x000a, + 0x3fc6: 0x000a, 0x3fc7: 0x000a, 0x3fc8: 0x000a, 0x3fc9: 0x000a, 0x3fca: 0x000a, + 0x3ff0: 0x0002, 0x3ff1: 0x0002, 0x3ff2: 0x0002, 0x3ff3: 0x0002, 0x3ff4: 0x0002, 0x3ff5: 0x0002, + 0x3ff6: 0x0002, 0x3ff7: 0x0002, 0x3ff8: 0x0002, 0x3ff9: 0x0002, + // Block 0x100, offset 0x4000 + 0x403e: 0x000b, 0x403f: 0x000b, + // Block 0x101, offset 0x4040 + 0x4040: 0x000b, 0x4041: 0x000b, 0x4042: 0x000b, 0x4043: 0x000b, 0x4044: 0x000b, 0x4045: 0x000b, + 0x4046: 0x000b, 0x4047: 0x000b, 0x4048: 0x000b, 0x4049: 0x000b, 0x404a: 0x000b, 0x404b: 0x000b, + 0x404c: 0x000b, 0x404d: 0x000b, 0x404e: 0x000b, 0x404f: 0x000b, 0x4050: 0x000b, 0x4051: 0x000b, + 0x4052: 0x000b, 0x4053: 0x000b, 0x4054: 0x000b, 0x4055: 0x000b, 0x4056: 0x000b, 0x4057: 0x000b, + 0x4058: 0x000b, 0x4059: 0x000b, 0x405a: 0x000b, 0x405b: 0x000b, 0x405c: 0x000b, 0x405d: 0x000b, + 0x405e: 0x000b, 0x405f: 0x000b, 0x4060: 0x000b, 0x4061: 0x000b, 0x4062: 0x000b, 0x4063: 0x000b, + 0x4064: 0x000b, 0x4065: 0x000b, 0x4066: 0x000b, 0x4067: 0x000b, 0x4068: 0x000b, 0x4069: 0x000b, + 0x406a: 0x000b, 0x406b: 0x000b, 0x406c: 0x000b, 0x406d: 0x000b, 0x406e: 0x000b, 0x406f: 0x000b, + 0x4070: 0x000b, 0x4071: 0x000b, 0x4072: 0x000b, 0x4073: 0x000b, 0x4074: 0x000b, 0x4075: 0x000b, + 0x4076: 0x000b, 0x4077: 0x000b, 0x4078: 0x000b, 0x4079: 0x000b, 0x407a: 0x000b, 0x407b: 0x000b, + 0x407c: 0x000b, 0x407d: 0x000b, 0x407e: 0x000b, 0x407f: 0x000b, + // Block 0x102, offset 0x4080 + 0x4080: 0x000c, 0x4081: 0x000c, 0x4082: 0x000c, 0x4083: 0x000c, 0x4084: 0x000c, 0x4085: 0x000c, + 0x4086: 0x000c, 0x4087: 0x000c, 0x4088: 0x000c, 0x4089: 0x000c, 0x408a: 0x000c, 0x408b: 0x000c, + 0x408c: 0x000c, 0x408d: 0x000c, 0x408e: 0x000c, 0x408f: 0x000c, 0x4090: 0x000c, 0x4091: 0x000c, + 0x4092: 0x000c, 0x4093: 0x000c, 0x4094: 0x000c, 0x4095: 0x000c, 0x4096: 0x000c, 0x4097: 0x000c, + 0x4098: 0x000c, 0x4099: 0x000c, 0x409a: 0x000c, 0x409b: 0x000c, 0x409c: 0x000c, 0x409d: 0x000c, + 0x409e: 0x000c, 0x409f: 0x000c, 0x40a0: 0x000c, 0x40a1: 0x000c, 0x40a2: 0x000c, 0x40a3: 0x000c, + 0x40a4: 0x000c, 0x40a5: 0x000c, 0x40a6: 0x000c, 0x40a7: 0x000c, 0x40a8: 0x000c, 0x40a9: 0x000c, + 0x40aa: 0x000c, 0x40ab: 0x000c, 0x40ac: 0x000c, 0x40ad: 0x000c, 0x40ae: 0x000c, 0x40af: 0x000c, + 0x40b0: 0x000b, 0x40b1: 0x000b, 0x40b2: 0x000b, 0x40b3: 0x000b, 0x40b4: 0x000b, 0x40b5: 0x000b, + 0x40b6: 0x000b, 0x40b7: 0x000b, 0x40b8: 0x000b, 0x40b9: 0x000b, 0x40ba: 0x000b, 0x40bb: 0x000b, + 0x40bc: 0x000b, 0x40bd: 0x000b, 0x40be: 0x000b, 0x40bf: 0x000b, +} + +// bidiIndex: 26 blocks, 1664 entries, 3328 bytes +// Block 0 is the zero block. +var bidiIndex = [1664]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x13, 0xf1: 0x14, 0xf2: 0x14, 0xf3: 0x16, 0xf4: 0x17, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x136: 0x28, 0x137: 0x29, + 0x138: 0x2a, 0x139: 0x2b, 0x13a: 0x2c, 0x13b: 0x2d, 0x13c: 0x2e, 0x13d: 0x2f, 0x13e: 0x30, 0x13f: 0x31, + // Block 0x5, offset 0x140 + 0x140: 0x32, 0x141: 0x33, 0x142: 0x34, + 0x14d: 0x35, 0x14e: 0x36, + 0x150: 0x37, + 0x15a: 0x38, 0x15c: 0x39, 0x15d: 0x3a, 0x15e: 0x3b, 0x15f: 0x3c, + 0x160: 0x3d, 0x162: 0x3e, 0x164: 0x3f, 0x165: 0x40, 0x167: 0x41, + 0x168: 0x42, 0x169: 0x43, 0x16a: 0x44, 0x16b: 0x45, 0x16c: 0x46, 0x16d: 0x47, 0x16e: 0x48, 0x16f: 0x49, + 0x170: 0x4a, 0x173: 0x4b, 0x177: 0x05, + 0x17e: 0x4c, 0x17f: 0x4d, + // Block 0x6, offset 0x180 + 0x180: 0x4e, 0x181: 0x4f, 0x182: 0x50, 0x183: 0x51, 0x184: 0x52, 0x185: 0x53, 0x186: 0x54, 0x187: 0x55, + 0x188: 0x56, 0x189: 0x55, 0x18a: 0x55, 0x18b: 0x55, 0x18c: 0x57, 0x18d: 0x58, 0x18e: 0x59, 0x18f: 0x55, + 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x55, 0x195: 0x55, 0x196: 0x55, 0x197: 0x55, + 0x198: 0x55, 0x199: 0x55, 0x19a: 0x5e, 0x19b: 0x55, 0x19c: 0x55, 0x19d: 0x5f, 0x19e: 0x55, 0x19f: 0x60, + 0x1a4: 0x55, 0x1a5: 0x55, 0x1a6: 0x61, 0x1a7: 0x62, + 0x1a8: 0x55, 0x1a9: 0x55, 0x1aa: 0x55, 0x1ab: 0x55, 0x1ac: 0x55, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x55, + 0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67, + 0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x55, 0x1bd: 0x55, 0x1be: 0x55, 0x1bf: 0x6c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70, + 0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76, + // Block 0x8, offset 0x200 + 0x237: 0x55, + // Block 0x9, offset 0x240 + 0x252: 0x77, 0x253: 0x78, + 0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e, + 0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85, + 0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26d: 0x8a, 0x26f: 0x8b, + // Block 0xa, offset 0x280 + 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x8f, 0x2b6: 0x0e, 0x2b7: 0x90, + 0x2b8: 0x91, 0x2b9: 0x92, 0x2ba: 0x0e, 0x2bb: 0x93, 0x2bc: 0x94, 0x2bd: 0x95, 0x2bf: 0x96, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x97, 0x2c5: 0x55, 0x2c6: 0x98, 0x2c7: 0x99, + 0x2cb: 0x9a, 0x2cd: 0x9b, + 0x2e0: 0x9c, 0x2e1: 0x9c, 0x2e2: 0x9c, 0x2e3: 0x9c, 0x2e4: 0x9d, 0x2e5: 0x9c, 0x2e6: 0x9c, 0x2e7: 0x9c, + 0x2e8: 0x9e, 0x2e9: 0x9c, 0x2ea: 0x9c, 0x2eb: 0x9f, 0x2ec: 0xa0, 0x2ed: 0x9c, 0x2ee: 0x9c, 0x2ef: 0x9c, + 0x2f0: 0x9c, 0x2f1: 0x9c, 0x2f2: 0x9c, 0x2f3: 0x9c, 0x2f4: 0xa1, 0x2f5: 0x9c, 0x2f6: 0x9c, 0x2f7: 0x9c, + 0x2f8: 0x9c, 0x2f9: 0xa2, 0x2fa: 0xa3, 0x2fb: 0xa4, 0x2fc: 0xa5, 0x2fd: 0xa6, 0x2fe: 0xa7, 0x2ff: 0x9c, + // Block 0xc, offset 0x300 + 0x300: 0xa8, 0x301: 0xa9, 0x302: 0xaa, 0x303: 0x21, 0x304: 0xab, 0x305: 0xac, 0x306: 0xad, 0x307: 0xae, + 0x308: 0xaf, 0x309: 0x28, 0x30b: 0xb0, 0x30c: 0x26, 0x30d: 0xb1, + 0x310: 0xb2, 0x311: 0xb3, 0x312: 0xb4, 0x313: 0xb5, 0x316: 0xb6, 0x317: 0xb7, + 0x318: 0xb8, 0x319: 0xb9, 0x31a: 0xba, 0x31c: 0xbb, + 0x320: 0xbc, 0x324: 0xbd, 0x325: 0xbe, 0x327: 0xbf, + 0x328: 0xc0, 0x329: 0xc1, 0x32a: 0xc2, + 0x330: 0xc3, 0x332: 0xc4, 0x334: 0xc5, 0x335: 0xc6, 0x336: 0xc7, + 0x33b: 0xc8, 0x33c: 0xc9, 0x33d: 0xca, 0x33f: 0xcb, + // Block 0xd, offset 0x340 + 0x351: 0xcc, + // Block 0xe, offset 0x380 + 0x3ab: 0xcd, 0x3ac: 0xce, + 0x3bd: 0xcf, 0x3be: 0xd0, 0x3bf: 0xd1, + // Block 0xf, offset 0x3c0 + 0x3f2: 0xd2, + // Block 0x10, offset 0x400 + 0x43c: 0xd3, 0x43d: 0xd4, + // Block 0x11, offset 0x440 + 0x445: 0xd5, 0x446: 0xd6, 0x447: 0xd7, + 0x448: 0x55, 0x449: 0xd8, 0x44c: 0x55, 0x44d: 0xd9, + 0x45b: 0xda, 0x45c: 0xdb, 0x45d: 0xdc, 0x45e: 0xdd, 0x45f: 0xde, + 0x468: 0xdf, 0x469: 0xe0, 0x46a: 0xe1, + // Block 0x12, offset 0x480 + 0x480: 0xe2, 0x482: 0xcf, 0x484: 0xce, + 0x48a: 0xe3, 0x48b: 0xe4, + 0x493: 0xe5, + 0x4a0: 0x9c, 0x4a1: 0x9c, 0x4a2: 0x9c, 0x4a3: 0xe6, 0x4a4: 0x9c, 0x4a5: 0xe7, 0x4a6: 0x9c, 0x4a7: 0x9c, + 0x4a8: 0x9c, 0x4a9: 0x9c, 0x4aa: 0x9c, 0x4ab: 0x9c, 0x4ac: 0x9c, 0x4ad: 0x9c, 0x4ae: 0x9c, 0x4af: 0x9c, + 0x4b0: 0x9c, 0x4b1: 0xe8, 0x4b2: 0xe9, 0x4b3: 0x9c, 0x4b4: 0xea, 0x4b5: 0x9c, 0x4b6: 0x9c, 0x4b7: 0x9c, + 0x4b8: 0x0e, 0x4b9: 0x0e, 0x4ba: 0x0e, 0x4bb: 0xeb, 0x4bc: 0x9c, 0x4bd: 0x9c, 0x4be: 0x9c, 0x4bf: 0x9c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xec, 0x4c1: 0x55, 0x4c2: 0xed, 0x4c3: 0xee, 0x4c4: 0xef, 0x4c5: 0xf0, 0x4c6: 0xf1, + 0x4c9: 0xf2, 0x4cc: 0x55, 0x4cd: 0x55, 0x4ce: 0x55, 0x4cf: 0x55, + 0x4d0: 0x55, 0x4d1: 0x55, 0x4d2: 0x55, 0x4d3: 0x55, 0x4d4: 0x55, 0x4d5: 0x55, 0x4d6: 0x55, 0x4d7: 0x55, + 0x4d8: 0x55, 0x4d9: 0x55, 0x4da: 0x55, 0x4db: 0xf3, 0x4dc: 0x55, 0x4dd: 0xf4, 0x4de: 0x55, 0x4df: 0xf5, + 0x4e0: 0xf6, 0x4e1: 0xf7, 0x4e2: 0xf8, 0x4e4: 0x55, 0x4e5: 0x55, 0x4e6: 0x55, 0x4e7: 0x55, + 0x4e8: 0x55, 0x4e9: 0xf9, 0x4ea: 0xfa, 0x4eb: 0xfb, 0x4ec: 0x55, 0x4ed: 0x55, 0x4ee: 0xfc, 0x4ef: 0xfd, + 0x4ff: 0xfe, + // Block 0x14, offset 0x500 + 0x53f: 0xfe, + // Block 0x15, offset 0x540 + 0x550: 0x09, 0x551: 0x0a, 0x553: 0x0b, 0x556: 0x0c, + 0x55b: 0x0d, 0x55c: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, + 0x57f: 0x12, + // Block 0x16, offset 0x580 + 0x58f: 0x12, + 0x59f: 0x12, + 0x5af: 0x12, + 0x5bf: 0x12, + // Block 0x17, offset 0x5c0 + 0x5c0: 0xff, 0x5c1: 0xff, 0x5c2: 0xff, 0x5c3: 0xff, 0x5c4: 0x05, 0x5c5: 0x05, 0x5c6: 0x05, 0x5c7: 0x100, + 0x5c8: 0xff, 0x5c9: 0xff, 0x5ca: 0xff, 0x5cb: 0xff, 0x5cc: 0xff, 0x5cd: 0xff, 0x5ce: 0xff, 0x5cf: 0xff, + 0x5d0: 0xff, 0x5d1: 0xff, 0x5d2: 0xff, 0x5d3: 0xff, 0x5d4: 0xff, 0x5d5: 0xff, 0x5d6: 0xff, 0x5d7: 0xff, + 0x5d8: 0xff, 0x5d9: 0xff, 0x5da: 0xff, 0x5db: 0xff, 0x5dc: 0xff, 0x5dd: 0xff, 0x5de: 0xff, 0x5df: 0xff, + 0x5e0: 0xff, 0x5e1: 0xff, 0x5e2: 0xff, 0x5e3: 0xff, 0x5e4: 0xff, 0x5e5: 0xff, 0x5e6: 0xff, 0x5e7: 0xff, + 0x5e8: 0xff, 0x5e9: 0xff, 0x5ea: 0xff, 0x5eb: 0xff, 0x5ec: 0xff, 0x5ed: 0xff, 0x5ee: 0xff, 0x5ef: 0xff, + 0x5f0: 0xff, 0x5f1: 0xff, 0x5f2: 0xff, 0x5f3: 0xff, 0x5f4: 0xff, 0x5f5: 0xff, 0x5f6: 0xff, 0x5f7: 0xff, + 0x5f8: 0xff, 0x5f9: 0xff, 0x5fa: 0xff, 0x5fb: 0xff, 0x5fc: 0xff, 0x5fd: 0xff, 0x5fe: 0xff, 0x5ff: 0xff, + // Block 0x18, offset 0x600 + 0x60f: 0x12, + 0x61f: 0x12, + 0x620: 0x15, + 0x62f: 0x12, + 0x63f: 0x12, + // Block 0x19, offset 0x640 + 0x64f: 0x12, +} + +// Total table size 19960 bytes (19KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go index 9115ef257e..f65785e8ac 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go new file mode 100644 index 0000000000..e1858b879d --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go @@ -0,0 +1,7908 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package norm + +import "sync" + +const ( + // Version is the Unicode edition from which the tables are derived. + Version = "15.0.0" + + // MaxTransformChunkSize indicates the maximum number of bytes that Transform + // may need to write atomically for any Form. Making a destination buffer at + // least this size ensures that Transform can always make progress and that + // the user does not need to grow the buffer on an ErrShortDst. + MaxTransformChunkSize = 35 + maxNonStarters*4 +) + +var ccc = [56]uint8{ + 0, 1, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 84, 91, 103, 107, 118, 122, 129, + 130, 132, 202, 214, 216, 218, 220, 222, + 224, 226, 228, 230, 232, 233, 234, 240, +} + +const ( + firstMulti = 0x199A + firstCCC = 0x2DD5 + endMulti = 0x30A1 + firstLeadingCCC = 0x4AEF + firstCCCZeroExcept = 0x4BB9 + firstStarterWithNLead = 0x4BE0 + lastDecomp = 0x4BE2 + maxDecomp = 0x8000 +) + +// decomps: 19426 bytes +var decomps = [...]byte{ + // Bytes 0 - 3f + 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, + 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, + 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, + 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, + 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, + 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, + 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, + 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, + // Bytes 40 - 7f + 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, + 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, + 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, + 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, + 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, + 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, + 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, + // Bytes 80 - bf + 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, + 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, + 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, + 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, + 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, + 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, + 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, + 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, + // Bytes c0 - ff + 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, + 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, + 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xA6, 0x42, + 0xC3, 0xB0, 0x42, 0xC3, 0xB8, 0x42, 0xC4, 0xA6, + 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, 0x42, 0xC5, + 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, 0x8E, 0x42, + 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, 0xC7, 0x80, + 0x42, 0xC7, 0x81, 0x42, 0xC7, 0x82, 0x42, 0xC8, + // Bytes 100 - 13f + 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, 0x42, + 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, 0x93, + 0x42, 0xC9, 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, + 0x96, 0x42, 0xC9, 0x97, 0x42, 0xC9, 0x98, 0x42, + 0xC9, 0x99, 0x42, 0xC9, 0x9B, 0x42, 0xC9, 0x9C, + 0x42, 0xC9, 0x9E, 0x42, 0xC9, 0x9F, 0x42, 0xC9, + 0xA0, 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA2, 0x42, + 0xC9, 0xA3, 0x42, 0xC9, 0xA4, 0x42, 0xC9, 0xA5, + // Bytes 140 - 17f + 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA7, 0x42, 0xC9, + 0xA8, 0x42, 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, + 0xC9, 0xAB, 0x42, 0xC9, 0xAC, 0x42, 0xC9, 0xAD, + 0x42, 0xC9, 0xAE, 0x42, 0xC9, 0xAF, 0x42, 0xC9, + 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, + 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, + 0x42, 0xC9, 0xB6, 0x42, 0xC9, 0xB7, 0x42, 0xC9, + 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBA, 0x42, + // Bytes 180 - 1bf + 0xC9, 0xBB, 0x42, 0xC9, 0xBD, 0x42, 0xC9, 0xBE, + 0x42, 0xCA, 0x80, 0x42, 0xCA, 0x81, 0x42, 0xCA, + 0x82, 0x42, 0xCA, 0x83, 0x42, 0xCA, 0x84, 0x42, + 0xCA, 0x88, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, + 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, + 0x8D, 0x42, 0xCA, 0x8E, 0x42, 0xCA, 0x8F, 0x42, + 0xCA, 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, + 0x42, 0xCA, 0x95, 0x42, 0xCA, 0x98, 0x42, 0xCA, + // Bytes 1c0 - 1ff + 0x99, 0x42, 0xCA, 0x9B, 0x42, 0xCA, 0x9C, 0x42, + 0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xA1, + 0x42, 0xCA, 0xA2, 0x42, 0xCA, 0xA3, 0x42, 0xCA, + 0xA4, 0x42, 0xCA, 0xA5, 0x42, 0xCA, 0xA6, 0x42, + 0xCA, 0xA7, 0x42, 0xCA, 0xA8, 0x42, 0xCA, 0xA9, + 0x42, 0xCA, 0xAA, 0x42, 0xCA, 0xAB, 0x42, 0xCA, + 0xB9, 0x42, 0xCB, 0x90, 0x42, 0xCB, 0x91, 0x42, + 0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, 0x93, + // Bytes 200 - 23f + 0x42, 0xCE, 0x94, 0x42, 0xCE, 0x95, 0x42, 0xCE, + 0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, 0x42, + 0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, 0x9B, + 0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, 0xCE, + 0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, 0x42, + 0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, 0xA4, + 0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, 0xCE, + 0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, 0x42, + // Bytes 240 - 27f + 0xCE, 0xB1, 0x42, 0xCE, 0xB2, 0x42, 0xCE, 0xB3, + 0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, 0xCE, + 0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, 0x42, + 0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, 0xBB, + 0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, 0xCE, + 0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, 0x42, + 0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, 0x83, + 0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, 0xCF, + // Bytes 280 - 2bf + 0x86, 0x42, 0xCF, 0x87, 0x42, 0xCF, 0x88, 0x42, + 0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, 0x9D, + 0x42, 0xD0, 0xB0, 0x42, 0xD0, 0xB1, 0x42, 0xD0, + 0xB2, 0x42, 0xD0, 0xB3, 0x42, 0xD0, 0xB4, 0x42, + 0xD0, 0xB5, 0x42, 0xD0, 0xB6, 0x42, 0xD0, 0xB7, + 0x42, 0xD0, 0xB8, 0x42, 0xD0, 0xBA, 0x42, 0xD0, + 0xBB, 0x42, 0xD0, 0xBC, 0x42, 0xD0, 0xBD, 0x42, + 0xD0, 0xBE, 0x42, 0xD0, 0xBF, 0x42, 0xD1, 0x80, + // Bytes 2c0 - 2ff + 0x42, 0xD1, 0x81, 0x42, 0xD1, 0x82, 0x42, 0xD1, + 0x83, 0x42, 0xD1, 0x84, 0x42, 0xD1, 0x85, 0x42, + 0xD1, 0x86, 0x42, 0xD1, 0x87, 0x42, 0xD1, 0x88, + 0x42, 0xD1, 0x8A, 0x42, 0xD1, 0x8B, 0x42, 0xD1, + 0x8C, 0x42, 0xD1, 0x8D, 0x42, 0xD1, 0x8E, 0x42, + 0xD1, 0x95, 0x42, 0xD1, 0x96, 0x42, 0xD1, 0x98, + 0x42, 0xD1, 0x9F, 0x42, 0xD2, 0x91, 0x42, 0xD2, + 0xAB, 0x42, 0xD2, 0xAF, 0x42, 0xD2, 0xB1, 0x42, + // Bytes 300 - 33f + 0xD3, 0x8F, 0x42, 0xD3, 0x99, 0x42, 0xD3, 0xA9, + 0x42, 0xD7, 0x90, 0x42, 0xD7, 0x91, 0x42, 0xD7, + 0x92, 0x42, 0xD7, 0x93, 0x42, 0xD7, 0x94, 0x42, + 0xD7, 0x9B, 0x42, 0xD7, 0x9C, 0x42, 0xD7, 0x9D, + 0x42, 0xD7, 0xA2, 0x42, 0xD7, 0xA8, 0x42, 0xD7, + 0xAA, 0x42, 0xD8, 0xA1, 0x42, 0xD8, 0xA7, 0x42, + 0xD8, 0xA8, 0x42, 0xD8, 0xA9, 0x42, 0xD8, 0xAA, + 0x42, 0xD8, 0xAB, 0x42, 0xD8, 0xAC, 0x42, 0xD8, + // Bytes 340 - 37f + 0xAD, 0x42, 0xD8, 0xAE, 0x42, 0xD8, 0xAF, 0x42, + 0xD8, 0xB0, 0x42, 0xD8, 0xB1, 0x42, 0xD8, 0xB2, + 0x42, 0xD8, 0xB3, 0x42, 0xD8, 0xB4, 0x42, 0xD8, + 0xB5, 0x42, 0xD8, 0xB6, 0x42, 0xD8, 0xB7, 0x42, + 0xD8, 0xB8, 0x42, 0xD8, 0xB9, 0x42, 0xD8, 0xBA, + 0x42, 0xD9, 0x81, 0x42, 0xD9, 0x82, 0x42, 0xD9, + 0x83, 0x42, 0xD9, 0x84, 0x42, 0xD9, 0x85, 0x42, + 0xD9, 0x86, 0x42, 0xD9, 0x87, 0x42, 0xD9, 0x88, + // Bytes 380 - 3bf + 0x42, 0xD9, 0x89, 0x42, 0xD9, 0x8A, 0x42, 0xD9, + 0xAE, 0x42, 0xD9, 0xAF, 0x42, 0xD9, 0xB1, 0x42, + 0xD9, 0xB9, 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB, + 0x42, 0xD9, 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA, + 0x80, 0x42, 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42, + 0xDA, 0x86, 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88, + 0x42, 0xDA, 0x8C, 0x42, 0xDA, 0x8D, 0x42, 0xDA, + 0x8E, 0x42, 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42, + // Bytes 3c0 - 3ff + 0xDA, 0xA1, 0x42, 0xDA, 0xA4, 0x42, 0xDA, 0xA6, + 0x42, 0xDA, 0xA9, 0x42, 0xDA, 0xAD, 0x42, 0xDA, + 0xAF, 0x42, 0xDA, 0xB1, 0x42, 0xDA, 0xB3, 0x42, + 0xDA, 0xBA, 0x42, 0xDA, 0xBB, 0x42, 0xDA, 0xBE, + 0x42, 0xDB, 0x81, 0x42, 0xDB, 0x85, 0x42, 0xDB, + 0x86, 0x42, 0xDB, 0x87, 0x42, 0xDB, 0x88, 0x42, + 0xDB, 0x89, 0x42, 0xDB, 0x8B, 0x42, 0xDB, 0x8C, + 0x42, 0xDB, 0x90, 0x42, 0xDB, 0x92, 0x43, 0xE0, + // Bytes 400 - 43f + 0xBC, 0x8B, 0x43, 0xE1, 0x83, 0x9C, 0x43, 0xE1, + 0x84, 0x80, 0x43, 0xE1, 0x84, 0x81, 0x43, 0xE1, + 0x84, 0x82, 0x43, 0xE1, 0x84, 0x83, 0x43, 0xE1, + 0x84, 0x84, 0x43, 0xE1, 0x84, 0x85, 0x43, 0xE1, + 0x84, 0x86, 0x43, 0xE1, 0x84, 0x87, 0x43, 0xE1, + 0x84, 0x88, 0x43, 0xE1, 0x84, 0x89, 0x43, 0xE1, + 0x84, 0x8A, 0x43, 0xE1, 0x84, 0x8B, 0x43, 0xE1, + 0x84, 0x8C, 0x43, 0xE1, 0x84, 0x8D, 0x43, 0xE1, + // Bytes 440 - 47f + 0x84, 0x8E, 0x43, 0xE1, 0x84, 0x8F, 0x43, 0xE1, + 0x84, 0x90, 0x43, 0xE1, 0x84, 0x91, 0x43, 0xE1, + 0x84, 0x92, 0x43, 0xE1, 0x84, 0x94, 0x43, 0xE1, + 0x84, 0x95, 0x43, 0xE1, 0x84, 0x9A, 0x43, 0xE1, + 0x84, 0x9C, 0x43, 0xE1, 0x84, 0x9D, 0x43, 0xE1, + 0x84, 0x9E, 0x43, 0xE1, 0x84, 0xA0, 0x43, 0xE1, + 0x84, 0xA1, 0x43, 0xE1, 0x84, 0xA2, 0x43, 0xE1, + 0x84, 0xA3, 0x43, 0xE1, 0x84, 0xA7, 0x43, 0xE1, + // Bytes 480 - 4bf + 0x84, 0xA9, 0x43, 0xE1, 0x84, 0xAB, 0x43, 0xE1, + 0x84, 0xAC, 0x43, 0xE1, 0x84, 0xAD, 0x43, 0xE1, + 0x84, 0xAE, 0x43, 0xE1, 0x84, 0xAF, 0x43, 0xE1, + 0x84, 0xB2, 0x43, 0xE1, 0x84, 0xB6, 0x43, 0xE1, + 0x85, 0x80, 0x43, 0xE1, 0x85, 0x87, 0x43, 0xE1, + 0x85, 0x8C, 0x43, 0xE1, 0x85, 0x97, 0x43, 0xE1, + 0x85, 0x98, 0x43, 0xE1, 0x85, 0x99, 0x43, 0xE1, + 0x85, 0xA0, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1, + // Bytes 4c0 - 4ff + 0x86, 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1, + 0x86, 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1, + 0x86, 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1, + 0x86, 0xA1, 0x43, 0xE1, 0x87, 0x87, 0x43, 0xE1, + 0x87, 0x88, 0x43, 0xE1, 0x87, 0x8C, 0x43, 0xE1, + 0x87, 0x8E, 0x43, 0xE1, 0x87, 0x93, 0x43, 0xE1, + 0x87, 0x97, 0x43, 0xE1, 0x87, 0x99, 0x43, 0xE1, + 0x87, 0x9D, 0x43, 0xE1, 0x87, 0x9F, 0x43, 0xE1, + // Bytes 500 - 53f + 0x87, 0xB1, 0x43, 0xE1, 0x87, 0xB2, 0x43, 0xE1, + 0xB4, 0x82, 0x43, 0xE1, 0xB4, 0x96, 0x43, 0xE1, + 0xB4, 0x97, 0x43, 0xE1, 0xB4, 0x9C, 0x43, 0xE1, + 0xB4, 0x9D, 0x43, 0xE1, 0xB4, 0xA5, 0x43, 0xE1, + 0xB5, 0xBB, 0x43, 0xE1, 0xB6, 0x85, 0x43, 0xE1, + 0xB6, 0x91, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2, + 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, 0xE2, + 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2, + // Bytes 540 - 57f + 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2, + 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2, + 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2, + 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2, + 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2, + 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2, + 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, 0xE2, + 0xB1, 0xB1, 0x43, 0xE2, 0xB5, 0xA1, 0x43, 0xE3, + // Bytes 580 - 5bf + 0x80, 0x81, 0x43, 0xE3, 0x80, 0x82, 0x43, 0xE3, + 0x80, 0x88, 0x43, 0xE3, 0x80, 0x89, 0x43, 0xE3, + 0x80, 0x8A, 0x43, 0xE3, 0x80, 0x8B, 0x43, 0xE3, + 0x80, 0x8C, 0x43, 0xE3, 0x80, 0x8D, 0x43, 0xE3, + 0x80, 0x8E, 0x43, 0xE3, 0x80, 0x8F, 0x43, 0xE3, + 0x80, 0x90, 0x43, 0xE3, 0x80, 0x91, 0x43, 0xE3, + 0x80, 0x92, 0x43, 0xE3, 0x80, 0x94, 0x43, 0xE3, + 0x80, 0x95, 0x43, 0xE3, 0x80, 0x96, 0x43, 0xE3, + // Bytes 5c0 - 5ff + 0x80, 0x97, 0x43, 0xE3, 0x82, 0xA1, 0x43, 0xE3, + 0x82, 0xA2, 0x43, 0xE3, 0x82, 0xA3, 0x43, 0xE3, + 0x82, 0xA4, 0x43, 0xE3, 0x82, 0xA5, 0x43, 0xE3, + 0x82, 0xA6, 0x43, 0xE3, 0x82, 0xA7, 0x43, 0xE3, + 0x82, 0xA8, 0x43, 0xE3, 0x82, 0xA9, 0x43, 0xE3, + 0x82, 0xAA, 0x43, 0xE3, 0x82, 0xAB, 0x43, 0xE3, + 0x82, 0xAD, 0x43, 0xE3, 0x82, 0xAF, 0x43, 0xE3, + 0x82, 0xB1, 0x43, 0xE3, 0x82, 0xB3, 0x43, 0xE3, + // Bytes 600 - 63f + 0x82, 0xB5, 0x43, 0xE3, 0x82, 0xB7, 0x43, 0xE3, + 0x82, 0xB9, 0x43, 0xE3, 0x82, 0xBB, 0x43, 0xE3, + 0x82, 0xBD, 0x43, 0xE3, 0x82, 0xBF, 0x43, 0xE3, + 0x83, 0x81, 0x43, 0xE3, 0x83, 0x83, 0x43, 0xE3, + 0x83, 0x84, 0x43, 0xE3, 0x83, 0x86, 0x43, 0xE3, + 0x83, 0x88, 0x43, 0xE3, 0x83, 0x8A, 0x43, 0xE3, + 0x83, 0x8B, 0x43, 0xE3, 0x83, 0x8C, 0x43, 0xE3, + 0x83, 0x8D, 0x43, 0xE3, 0x83, 0x8E, 0x43, 0xE3, + // Bytes 640 - 67f + 0x83, 0x8F, 0x43, 0xE3, 0x83, 0x92, 0x43, 0xE3, + 0x83, 0x95, 0x43, 0xE3, 0x83, 0x98, 0x43, 0xE3, + 0x83, 0x9B, 0x43, 0xE3, 0x83, 0x9E, 0x43, 0xE3, + 0x83, 0x9F, 0x43, 0xE3, 0x83, 0xA0, 0x43, 0xE3, + 0x83, 0xA1, 0x43, 0xE3, 0x83, 0xA2, 0x43, 0xE3, + 0x83, 0xA3, 0x43, 0xE3, 0x83, 0xA4, 0x43, 0xE3, + 0x83, 0xA5, 0x43, 0xE3, 0x83, 0xA6, 0x43, 0xE3, + 0x83, 0xA7, 0x43, 0xE3, 0x83, 0xA8, 0x43, 0xE3, + // Bytes 680 - 6bf + 0x83, 0xA9, 0x43, 0xE3, 0x83, 0xAA, 0x43, 0xE3, + 0x83, 0xAB, 0x43, 0xE3, 0x83, 0xAC, 0x43, 0xE3, + 0x83, 0xAD, 0x43, 0xE3, 0x83, 0xAF, 0x43, 0xE3, + 0x83, 0xB0, 0x43, 0xE3, 0x83, 0xB1, 0x43, 0xE3, + 0x83, 0xB2, 0x43, 0xE3, 0x83, 0xB3, 0x43, 0xE3, + 0x83, 0xBB, 0x43, 0xE3, 0x83, 0xBC, 0x43, 0xE3, + 0x92, 0x9E, 0x43, 0xE3, 0x92, 0xB9, 0x43, 0xE3, + 0x92, 0xBB, 0x43, 0xE3, 0x93, 0x9F, 0x43, 0xE3, + // Bytes 6c0 - 6ff + 0x94, 0x95, 0x43, 0xE3, 0x9B, 0xAE, 0x43, 0xE3, + 0x9B, 0xBC, 0x43, 0xE3, 0x9E, 0x81, 0x43, 0xE3, + 0xA0, 0xAF, 0x43, 0xE3, 0xA1, 0xA2, 0x43, 0xE3, + 0xA1, 0xBC, 0x43, 0xE3, 0xA3, 0x87, 0x43, 0xE3, + 0xA3, 0xA3, 0x43, 0xE3, 0xA4, 0x9C, 0x43, 0xE3, + 0xA4, 0xBA, 0x43, 0xE3, 0xA8, 0xAE, 0x43, 0xE3, + 0xA9, 0xAC, 0x43, 0xE3, 0xAB, 0xA4, 0x43, 0xE3, + 0xAC, 0x88, 0x43, 0xE3, 0xAC, 0x99, 0x43, 0xE3, + // Bytes 700 - 73f + 0xAD, 0x89, 0x43, 0xE3, 0xAE, 0x9D, 0x43, 0xE3, + 0xB0, 0x98, 0x43, 0xE3, 0xB1, 0x8E, 0x43, 0xE3, + 0xB4, 0xB3, 0x43, 0xE3, 0xB6, 0x96, 0x43, 0xE3, + 0xBA, 0xAC, 0x43, 0xE3, 0xBA, 0xB8, 0x43, 0xE3, + 0xBC, 0x9B, 0x43, 0xE3, 0xBF, 0xBC, 0x43, 0xE4, + 0x80, 0x88, 0x43, 0xE4, 0x80, 0x98, 0x43, 0xE4, + 0x80, 0xB9, 0x43, 0xE4, 0x81, 0x86, 0x43, 0xE4, + 0x82, 0x96, 0x43, 0xE4, 0x83, 0xA3, 0x43, 0xE4, + // Bytes 740 - 77f + 0x84, 0xAF, 0x43, 0xE4, 0x88, 0x82, 0x43, 0xE4, + 0x88, 0xA7, 0x43, 0xE4, 0x8A, 0xA0, 0x43, 0xE4, + 0x8C, 0x81, 0x43, 0xE4, 0x8C, 0xB4, 0x43, 0xE4, + 0x8D, 0x99, 0x43, 0xE4, 0x8F, 0x95, 0x43, 0xE4, + 0x8F, 0x99, 0x43, 0xE4, 0x90, 0x8B, 0x43, 0xE4, + 0x91, 0xAB, 0x43, 0xE4, 0x94, 0xAB, 0x43, 0xE4, + 0x95, 0x9D, 0x43, 0xE4, 0x95, 0xA1, 0x43, 0xE4, + 0x95, 0xAB, 0x43, 0xE4, 0x97, 0x97, 0x43, 0xE4, + // Bytes 780 - 7bf + 0x97, 0xB9, 0x43, 0xE4, 0x98, 0xB5, 0x43, 0xE4, + 0x9A, 0xBE, 0x43, 0xE4, 0x9B, 0x87, 0x43, 0xE4, + 0xA6, 0x95, 0x43, 0xE4, 0xA7, 0xA6, 0x43, 0xE4, + 0xA9, 0xAE, 0x43, 0xE4, 0xA9, 0xB6, 0x43, 0xE4, + 0xAA, 0xB2, 0x43, 0xE4, 0xAC, 0xB3, 0x43, 0xE4, + 0xAF, 0x8E, 0x43, 0xE4, 0xB3, 0x8E, 0x43, 0xE4, + 0xB3, 0xAD, 0x43, 0xE4, 0xB3, 0xB8, 0x43, 0xE4, + 0xB5, 0x96, 0x43, 0xE4, 0xB8, 0x80, 0x43, 0xE4, + // Bytes 7c0 - 7ff + 0xB8, 0x81, 0x43, 0xE4, 0xB8, 0x83, 0x43, 0xE4, + 0xB8, 0x89, 0x43, 0xE4, 0xB8, 0x8A, 0x43, 0xE4, + 0xB8, 0x8B, 0x43, 0xE4, 0xB8, 0x8D, 0x43, 0xE4, + 0xB8, 0x99, 0x43, 0xE4, 0xB8, 0xA6, 0x43, 0xE4, + 0xB8, 0xA8, 0x43, 0xE4, 0xB8, 0xAD, 0x43, 0xE4, + 0xB8, 0xB2, 0x43, 0xE4, 0xB8, 0xB6, 0x43, 0xE4, + 0xB8, 0xB8, 0x43, 0xE4, 0xB8, 0xB9, 0x43, 0xE4, + 0xB8, 0xBD, 0x43, 0xE4, 0xB8, 0xBF, 0x43, 0xE4, + // Bytes 800 - 83f + 0xB9, 0x81, 0x43, 0xE4, 0xB9, 0x99, 0x43, 0xE4, + 0xB9, 0x9D, 0x43, 0xE4, 0xBA, 0x82, 0x43, 0xE4, + 0xBA, 0x85, 0x43, 0xE4, 0xBA, 0x86, 0x43, 0xE4, + 0xBA, 0x8C, 0x43, 0xE4, 0xBA, 0x94, 0x43, 0xE4, + 0xBA, 0xA0, 0x43, 0xE4, 0xBA, 0xA4, 0x43, 0xE4, + 0xBA, 0xAE, 0x43, 0xE4, 0xBA, 0xBA, 0x43, 0xE4, + 0xBB, 0x80, 0x43, 0xE4, 0xBB, 0x8C, 0x43, 0xE4, + 0xBB, 0xA4, 0x43, 0xE4, 0xBC, 0x81, 0x43, 0xE4, + // Bytes 840 - 87f + 0xBC, 0x91, 0x43, 0xE4, 0xBD, 0xA0, 0x43, 0xE4, + 0xBE, 0x80, 0x43, 0xE4, 0xBE, 0x86, 0x43, 0xE4, + 0xBE, 0x8B, 0x43, 0xE4, 0xBE, 0xAE, 0x43, 0xE4, + 0xBE, 0xBB, 0x43, 0xE4, 0xBE, 0xBF, 0x43, 0xE5, + 0x80, 0x82, 0x43, 0xE5, 0x80, 0xAB, 0x43, 0xE5, + 0x81, 0xBA, 0x43, 0xE5, 0x82, 0x99, 0x43, 0xE5, + 0x83, 0x8F, 0x43, 0xE5, 0x83, 0x9A, 0x43, 0xE5, + 0x83, 0xA7, 0x43, 0xE5, 0x84, 0xAA, 0x43, 0xE5, + // Bytes 880 - 8bf + 0x84, 0xBF, 0x43, 0xE5, 0x85, 0x80, 0x43, 0xE5, + 0x85, 0x85, 0x43, 0xE5, 0x85, 0x8D, 0x43, 0xE5, + 0x85, 0x94, 0x43, 0xE5, 0x85, 0xA4, 0x43, 0xE5, + 0x85, 0xA5, 0x43, 0xE5, 0x85, 0xA7, 0x43, 0xE5, + 0x85, 0xA8, 0x43, 0xE5, 0x85, 0xA9, 0x43, 0xE5, + 0x85, 0xAB, 0x43, 0xE5, 0x85, 0xAD, 0x43, 0xE5, + 0x85, 0xB7, 0x43, 0xE5, 0x86, 0x80, 0x43, 0xE5, + 0x86, 0x82, 0x43, 0xE5, 0x86, 0x8D, 0x43, 0xE5, + // Bytes 8c0 - 8ff + 0x86, 0x92, 0x43, 0xE5, 0x86, 0x95, 0x43, 0xE5, + 0x86, 0x96, 0x43, 0xE5, 0x86, 0x97, 0x43, 0xE5, + 0x86, 0x99, 0x43, 0xE5, 0x86, 0xA4, 0x43, 0xE5, + 0x86, 0xAB, 0x43, 0xE5, 0x86, 0xAC, 0x43, 0xE5, + 0x86, 0xB5, 0x43, 0xE5, 0x86, 0xB7, 0x43, 0xE5, + 0x87, 0x89, 0x43, 0xE5, 0x87, 0x8C, 0x43, 0xE5, + 0x87, 0x9C, 0x43, 0xE5, 0x87, 0x9E, 0x43, 0xE5, + 0x87, 0xA0, 0x43, 0xE5, 0x87, 0xB5, 0x43, 0xE5, + // Bytes 900 - 93f + 0x88, 0x80, 0x43, 0xE5, 0x88, 0x83, 0x43, 0xE5, + 0x88, 0x87, 0x43, 0xE5, 0x88, 0x97, 0x43, 0xE5, + 0x88, 0x9D, 0x43, 0xE5, 0x88, 0xA9, 0x43, 0xE5, + 0x88, 0xBA, 0x43, 0xE5, 0x88, 0xBB, 0x43, 0xE5, + 0x89, 0x86, 0x43, 0xE5, 0x89, 0x8D, 0x43, 0xE5, + 0x89, 0xB2, 0x43, 0xE5, 0x89, 0xB7, 0x43, 0xE5, + 0x8A, 0x89, 0x43, 0xE5, 0x8A, 0x9B, 0x43, 0xE5, + 0x8A, 0xA3, 0x43, 0xE5, 0x8A, 0xB3, 0x43, 0xE5, + // Bytes 940 - 97f + 0x8A, 0xB4, 0x43, 0xE5, 0x8B, 0x87, 0x43, 0xE5, + 0x8B, 0x89, 0x43, 0xE5, 0x8B, 0x92, 0x43, 0xE5, + 0x8B, 0x9E, 0x43, 0xE5, 0x8B, 0xA4, 0x43, 0xE5, + 0x8B, 0xB5, 0x43, 0xE5, 0x8B, 0xB9, 0x43, 0xE5, + 0x8B, 0xBA, 0x43, 0xE5, 0x8C, 0x85, 0x43, 0xE5, + 0x8C, 0x86, 0x43, 0xE5, 0x8C, 0x95, 0x43, 0xE5, + 0x8C, 0x97, 0x43, 0xE5, 0x8C, 0x9A, 0x43, 0xE5, + 0x8C, 0xB8, 0x43, 0xE5, 0x8C, 0xBB, 0x43, 0xE5, + // Bytes 980 - 9bf + 0x8C, 0xBF, 0x43, 0xE5, 0x8D, 0x81, 0x43, 0xE5, + 0x8D, 0x84, 0x43, 0xE5, 0x8D, 0x85, 0x43, 0xE5, + 0x8D, 0x89, 0x43, 0xE5, 0x8D, 0x91, 0x43, 0xE5, + 0x8D, 0x94, 0x43, 0xE5, 0x8D, 0x9A, 0x43, 0xE5, + 0x8D, 0x9C, 0x43, 0xE5, 0x8D, 0xA9, 0x43, 0xE5, + 0x8D, 0xB0, 0x43, 0xE5, 0x8D, 0xB3, 0x43, 0xE5, + 0x8D, 0xB5, 0x43, 0xE5, 0x8D, 0xBD, 0x43, 0xE5, + 0x8D, 0xBF, 0x43, 0xE5, 0x8E, 0x82, 0x43, 0xE5, + // Bytes 9c0 - 9ff + 0x8E, 0xB6, 0x43, 0xE5, 0x8F, 0x83, 0x43, 0xE5, + 0x8F, 0x88, 0x43, 0xE5, 0x8F, 0x8A, 0x43, 0xE5, + 0x8F, 0x8C, 0x43, 0xE5, 0x8F, 0x9F, 0x43, 0xE5, + 0x8F, 0xA3, 0x43, 0xE5, 0x8F, 0xA5, 0x43, 0xE5, + 0x8F, 0xAB, 0x43, 0xE5, 0x8F, 0xAF, 0x43, 0xE5, + 0x8F, 0xB1, 0x43, 0xE5, 0x8F, 0xB3, 0x43, 0xE5, + 0x90, 0x86, 0x43, 0xE5, 0x90, 0x88, 0x43, 0xE5, + 0x90, 0x8D, 0x43, 0xE5, 0x90, 0x8F, 0x43, 0xE5, + // Bytes a00 - a3f + 0x90, 0x9D, 0x43, 0xE5, 0x90, 0xB8, 0x43, 0xE5, + 0x90, 0xB9, 0x43, 0xE5, 0x91, 0x82, 0x43, 0xE5, + 0x91, 0x88, 0x43, 0xE5, 0x91, 0xA8, 0x43, 0xE5, + 0x92, 0x9E, 0x43, 0xE5, 0x92, 0xA2, 0x43, 0xE5, + 0x92, 0xBD, 0x43, 0xE5, 0x93, 0xB6, 0x43, 0xE5, + 0x94, 0x90, 0x43, 0xE5, 0x95, 0x8F, 0x43, 0xE5, + 0x95, 0x93, 0x43, 0xE5, 0x95, 0x95, 0x43, 0xE5, + 0x95, 0xA3, 0x43, 0xE5, 0x96, 0x84, 0x43, 0xE5, + // Bytes a40 - a7f + 0x96, 0x87, 0x43, 0xE5, 0x96, 0x99, 0x43, 0xE5, + 0x96, 0x9D, 0x43, 0xE5, 0x96, 0xAB, 0x43, 0xE5, + 0x96, 0xB3, 0x43, 0xE5, 0x96, 0xB6, 0x43, 0xE5, + 0x97, 0x80, 0x43, 0xE5, 0x97, 0x82, 0x43, 0xE5, + 0x97, 0xA2, 0x43, 0xE5, 0x98, 0x86, 0x43, 0xE5, + 0x99, 0x91, 0x43, 0xE5, 0x99, 0xA8, 0x43, 0xE5, + 0x99, 0xB4, 0x43, 0xE5, 0x9B, 0x97, 0x43, 0xE5, + 0x9B, 0x9B, 0x43, 0xE5, 0x9B, 0xB9, 0x43, 0xE5, + // Bytes a80 - abf + 0x9C, 0x96, 0x43, 0xE5, 0x9C, 0x97, 0x43, 0xE5, + 0x9C, 0x9F, 0x43, 0xE5, 0x9C, 0xB0, 0x43, 0xE5, + 0x9E, 0x8B, 0x43, 0xE5, 0x9F, 0x8E, 0x43, 0xE5, + 0x9F, 0xB4, 0x43, 0xE5, 0xA0, 0x8D, 0x43, 0xE5, + 0xA0, 0xB1, 0x43, 0xE5, 0xA0, 0xB2, 0x43, 0xE5, + 0xA1, 0x80, 0x43, 0xE5, 0xA1, 0x9A, 0x43, 0xE5, + 0xA1, 0x9E, 0x43, 0xE5, 0xA2, 0xA8, 0x43, 0xE5, + 0xA2, 0xAC, 0x43, 0xE5, 0xA2, 0xB3, 0x43, 0xE5, + // Bytes ac0 - aff + 0xA3, 0x98, 0x43, 0xE5, 0xA3, 0x9F, 0x43, 0xE5, + 0xA3, 0xAB, 0x43, 0xE5, 0xA3, 0xAE, 0x43, 0xE5, + 0xA3, 0xB0, 0x43, 0xE5, 0xA3, 0xB2, 0x43, 0xE5, + 0xA3, 0xB7, 0x43, 0xE5, 0xA4, 0x82, 0x43, 0xE5, + 0xA4, 0x86, 0x43, 0xE5, 0xA4, 0x8A, 0x43, 0xE5, + 0xA4, 0x95, 0x43, 0xE5, 0xA4, 0x9A, 0x43, 0xE5, + 0xA4, 0x9C, 0x43, 0xE5, 0xA4, 0xA2, 0x43, 0xE5, + 0xA4, 0xA7, 0x43, 0xE5, 0xA4, 0xA9, 0x43, 0xE5, + // Bytes b00 - b3f + 0xA5, 0x84, 0x43, 0xE5, 0xA5, 0x88, 0x43, 0xE5, + 0xA5, 0x91, 0x43, 0xE5, 0xA5, 0x94, 0x43, 0xE5, + 0xA5, 0xA2, 0x43, 0xE5, 0xA5, 0xB3, 0x43, 0xE5, + 0xA7, 0x98, 0x43, 0xE5, 0xA7, 0xAC, 0x43, 0xE5, + 0xA8, 0x9B, 0x43, 0xE5, 0xA8, 0xA7, 0x43, 0xE5, + 0xA9, 0xA2, 0x43, 0xE5, 0xA9, 0xA6, 0x43, 0xE5, + 0xAA, 0xB5, 0x43, 0xE5, 0xAC, 0x88, 0x43, 0xE5, + 0xAC, 0xA8, 0x43, 0xE5, 0xAC, 0xBE, 0x43, 0xE5, + // Bytes b40 - b7f + 0xAD, 0x90, 0x43, 0xE5, 0xAD, 0x97, 0x43, 0xE5, + 0xAD, 0xA6, 0x43, 0xE5, 0xAE, 0x80, 0x43, 0xE5, + 0xAE, 0x85, 0x43, 0xE5, 0xAE, 0x97, 0x43, 0xE5, + 0xAF, 0x83, 0x43, 0xE5, 0xAF, 0x98, 0x43, 0xE5, + 0xAF, 0xA7, 0x43, 0xE5, 0xAF, 0xAE, 0x43, 0xE5, + 0xAF, 0xB3, 0x43, 0xE5, 0xAF, 0xB8, 0x43, 0xE5, + 0xAF, 0xBF, 0x43, 0xE5, 0xB0, 0x86, 0x43, 0xE5, + 0xB0, 0x8F, 0x43, 0xE5, 0xB0, 0xA2, 0x43, 0xE5, + // Bytes b80 - bbf + 0xB0, 0xB8, 0x43, 0xE5, 0xB0, 0xBF, 0x43, 0xE5, + 0xB1, 0xA0, 0x43, 0xE5, 0xB1, 0xA2, 0x43, 0xE5, + 0xB1, 0xA4, 0x43, 0xE5, 0xB1, 0xA5, 0x43, 0xE5, + 0xB1, 0xAE, 0x43, 0xE5, 0xB1, 0xB1, 0x43, 0xE5, + 0xB2, 0x8D, 0x43, 0xE5, 0xB3, 0x80, 0x43, 0xE5, + 0xB4, 0x99, 0x43, 0xE5, 0xB5, 0x83, 0x43, 0xE5, + 0xB5, 0x90, 0x43, 0xE5, 0xB5, 0xAB, 0x43, 0xE5, + 0xB5, 0xAE, 0x43, 0xE5, 0xB5, 0xBC, 0x43, 0xE5, + // Bytes bc0 - bff + 0xB6, 0xB2, 0x43, 0xE5, 0xB6, 0xBA, 0x43, 0xE5, + 0xB7, 0x9B, 0x43, 0xE5, 0xB7, 0xA1, 0x43, 0xE5, + 0xB7, 0xA2, 0x43, 0xE5, 0xB7, 0xA5, 0x43, 0xE5, + 0xB7, 0xA6, 0x43, 0xE5, 0xB7, 0xB1, 0x43, 0xE5, + 0xB7, 0xBD, 0x43, 0xE5, 0xB7, 0xBE, 0x43, 0xE5, + 0xB8, 0xA8, 0x43, 0xE5, 0xB8, 0xBD, 0x43, 0xE5, + 0xB9, 0xA9, 0x43, 0xE5, 0xB9, 0xB2, 0x43, 0xE5, + 0xB9, 0xB4, 0x43, 0xE5, 0xB9, 0xBA, 0x43, 0xE5, + // Bytes c00 - c3f + 0xB9, 0xBC, 0x43, 0xE5, 0xB9, 0xBF, 0x43, 0xE5, + 0xBA, 0xA6, 0x43, 0xE5, 0xBA, 0xB0, 0x43, 0xE5, + 0xBA, 0xB3, 0x43, 0xE5, 0xBA, 0xB6, 0x43, 0xE5, + 0xBB, 0x89, 0x43, 0xE5, 0xBB, 0x8A, 0x43, 0xE5, + 0xBB, 0x92, 0x43, 0xE5, 0xBB, 0x93, 0x43, 0xE5, + 0xBB, 0x99, 0x43, 0xE5, 0xBB, 0xAC, 0x43, 0xE5, + 0xBB, 0xB4, 0x43, 0xE5, 0xBB, 0xBE, 0x43, 0xE5, + 0xBC, 0x84, 0x43, 0xE5, 0xBC, 0x8B, 0x43, 0xE5, + // Bytes c40 - c7f + 0xBC, 0x93, 0x43, 0xE5, 0xBC, 0xA2, 0x43, 0xE5, + 0xBD, 0x90, 0x43, 0xE5, 0xBD, 0x93, 0x43, 0xE5, + 0xBD, 0xA1, 0x43, 0xE5, 0xBD, 0xA2, 0x43, 0xE5, + 0xBD, 0xA9, 0x43, 0xE5, 0xBD, 0xAB, 0x43, 0xE5, + 0xBD, 0xB3, 0x43, 0xE5, 0xBE, 0x8B, 0x43, 0xE5, + 0xBE, 0x8C, 0x43, 0xE5, 0xBE, 0x97, 0x43, 0xE5, + 0xBE, 0x9A, 0x43, 0xE5, 0xBE, 0xA9, 0x43, 0xE5, + 0xBE, 0xAD, 0x43, 0xE5, 0xBF, 0x83, 0x43, 0xE5, + // Bytes c80 - cbf + 0xBF, 0x8D, 0x43, 0xE5, 0xBF, 0x97, 0x43, 0xE5, + 0xBF, 0xB5, 0x43, 0xE5, 0xBF, 0xB9, 0x43, 0xE6, + 0x80, 0x92, 0x43, 0xE6, 0x80, 0x9C, 0x43, 0xE6, + 0x81, 0xB5, 0x43, 0xE6, 0x82, 0x81, 0x43, 0xE6, + 0x82, 0x94, 0x43, 0xE6, 0x83, 0x87, 0x43, 0xE6, + 0x83, 0x98, 0x43, 0xE6, 0x83, 0xA1, 0x43, 0xE6, + 0x84, 0x88, 0x43, 0xE6, 0x85, 0x84, 0x43, 0xE6, + 0x85, 0x88, 0x43, 0xE6, 0x85, 0x8C, 0x43, 0xE6, + // Bytes cc0 - cff + 0x85, 0x8E, 0x43, 0xE6, 0x85, 0xA0, 0x43, 0xE6, + 0x85, 0xA8, 0x43, 0xE6, 0x85, 0xBA, 0x43, 0xE6, + 0x86, 0x8E, 0x43, 0xE6, 0x86, 0x90, 0x43, 0xE6, + 0x86, 0xA4, 0x43, 0xE6, 0x86, 0xAF, 0x43, 0xE6, + 0x86, 0xB2, 0x43, 0xE6, 0x87, 0x9E, 0x43, 0xE6, + 0x87, 0xB2, 0x43, 0xE6, 0x87, 0xB6, 0x43, 0xE6, + 0x88, 0x80, 0x43, 0xE6, 0x88, 0x88, 0x43, 0xE6, + 0x88, 0x90, 0x43, 0xE6, 0x88, 0x9B, 0x43, 0xE6, + // Bytes d00 - d3f + 0x88, 0xAE, 0x43, 0xE6, 0x88, 0xB4, 0x43, 0xE6, + 0x88, 0xB6, 0x43, 0xE6, 0x89, 0x8B, 0x43, 0xE6, + 0x89, 0x93, 0x43, 0xE6, 0x89, 0x9D, 0x43, 0xE6, + 0x8A, 0x95, 0x43, 0xE6, 0x8A, 0xB1, 0x43, 0xE6, + 0x8B, 0x89, 0x43, 0xE6, 0x8B, 0x8F, 0x43, 0xE6, + 0x8B, 0x93, 0x43, 0xE6, 0x8B, 0x94, 0x43, 0xE6, + 0x8B, 0xBC, 0x43, 0xE6, 0x8B, 0xBE, 0x43, 0xE6, + 0x8C, 0x87, 0x43, 0xE6, 0x8C, 0xBD, 0x43, 0xE6, + // Bytes d40 - d7f + 0x8D, 0x90, 0x43, 0xE6, 0x8D, 0x95, 0x43, 0xE6, + 0x8D, 0xA8, 0x43, 0xE6, 0x8D, 0xBB, 0x43, 0xE6, + 0x8E, 0x83, 0x43, 0xE6, 0x8E, 0xA0, 0x43, 0xE6, + 0x8E, 0xA9, 0x43, 0xE6, 0x8F, 0x84, 0x43, 0xE6, + 0x8F, 0x85, 0x43, 0xE6, 0x8F, 0xA4, 0x43, 0xE6, + 0x90, 0x9C, 0x43, 0xE6, 0x90, 0xA2, 0x43, 0xE6, + 0x91, 0x92, 0x43, 0xE6, 0x91, 0xA9, 0x43, 0xE6, + 0x91, 0xB7, 0x43, 0xE6, 0x91, 0xBE, 0x43, 0xE6, + // Bytes d80 - dbf + 0x92, 0x9A, 0x43, 0xE6, 0x92, 0x9D, 0x43, 0xE6, + 0x93, 0x84, 0x43, 0xE6, 0x94, 0xAF, 0x43, 0xE6, + 0x94, 0xB4, 0x43, 0xE6, 0x95, 0x8F, 0x43, 0xE6, + 0x95, 0x96, 0x43, 0xE6, 0x95, 0xAC, 0x43, 0xE6, + 0x95, 0xB8, 0x43, 0xE6, 0x96, 0x87, 0x43, 0xE6, + 0x96, 0x97, 0x43, 0xE6, 0x96, 0x99, 0x43, 0xE6, + 0x96, 0xA4, 0x43, 0xE6, 0x96, 0xB0, 0x43, 0xE6, + 0x96, 0xB9, 0x43, 0xE6, 0x97, 0x85, 0x43, 0xE6, + // Bytes dc0 - dff + 0x97, 0xA0, 0x43, 0xE6, 0x97, 0xA2, 0x43, 0xE6, + 0x97, 0xA3, 0x43, 0xE6, 0x97, 0xA5, 0x43, 0xE6, + 0x98, 0x93, 0x43, 0xE6, 0x98, 0xA0, 0x43, 0xE6, + 0x99, 0x89, 0x43, 0xE6, 0x99, 0xB4, 0x43, 0xE6, + 0x9A, 0x88, 0x43, 0xE6, 0x9A, 0x91, 0x43, 0xE6, + 0x9A, 0x9C, 0x43, 0xE6, 0x9A, 0xB4, 0x43, 0xE6, + 0x9B, 0x86, 0x43, 0xE6, 0x9B, 0xB0, 0x43, 0xE6, + 0x9B, 0xB4, 0x43, 0xE6, 0x9B, 0xB8, 0x43, 0xE6, + // Bytes e00 - e3f + 0x9C, 0x80, 0x43, 0xE6, 0x9C, 0x88, 0x43, 0xE6, + 0x9C, 0x89, 0x43, 0xE6, 0x9C, 0x97, 0x43, 0xE6, + 0x9C, 0x9B, 0x43, 0xE6, 0x9C, 0xA1, 0x43, 0xE6, + 0x9C, 0xA8, 0x43, 0xE6, 0x9D, 0x8E, 0x43, 0xE6, + 0x9D, 0x93, 0x43, 0xE6, 0x9D, 0x96, 0x43, 0xE6, + 0x9D, 0x9E, 0x43, 0xE6, 0x9D, 0xBB, 0x43, 0xE6, + 0x9E, 0x85, 0x43, 0xE6, 0x9E, 0x97, 0x43, 0xE6, + 0x9F, 0xB3, 0x43, 0xE6, 0x9F, 0xBA, 0x43, 0xE6, + // Bytes e40 - e7f + 0xA0, 0x97, 0x43, 0xE6, 0xA0, 0x9F, 0x43, 0xE6, + 0xA0, 0xAA, 0x43, 0xE6, 0xA1, 0x92, 0x43, 0xE6, + 0xA2, 0x81, 0x43, 0xE6, 0xA2, 0x85, 0x43, 0xE6, + 0xA2, 0x8E, 0x43, 0xE6, 0xA2, 0xA8, 0x43, 0xE6, + 0xA4, 0x94, 0x43, 0xE6, 0xA5, 0x82, 0x43, 0xE6, + 0xA6, 0xA3, 0x43, 0xE6, 0xA7, 0xAA, 0x43, 0xE6, + 0xA8, 0x82, 0x43, 0xE6, 0xA8, 0x93, 0x43, 0xE6, + 0xAA, 0xA8, 0x43, 0xE6, 0xAB, 0x93, 0x43, 0xE6, + // Bytes e80 - ebf + 0xAB, 0x9B, 0x43, 0xE6, 0xAC, 0x84, 0x43, 0xE6, + 0xAC, 0xA0, 0x43, 0xE6, 0xAC, 0xA1, 0x43, 0xE6, + 0xAD, 0x94, 0x43, 0xE6, 0xAD, 0xA2, 0x43, 0xE6, + 0xAD, 0xA3, 0x43, 0xE6, 0xAD, 0xB2, 0x43, 0xE6, + 0xAD, 0xB7, 0x43, 0xE6, 0xAD, 0xB9, 0x43, 0xE6, + 0xAE, 0x9F, 0x43, 0xE6, 0xAE, 0xAE, 0x43, 0xE6, + 0xAE, 0xB3, 0x43, 0xE6, 0xAE, 0xBA, 0x43, 0xE6, + 0xAE, 0xBB, 0x43, 0xE6, 0xAF, 0x8B, 0x43, 0xE6, + // Bytes ec0 - eff + 0xAF, 0x8D, 0x43, 0xE6, 0xAF, 0x94, 0x43, 0xE6, + 0xAF, 0x9B, 0x43, 0xE6, 0xB0, 0x8F, 0x43, 0xE6, + 0xB0, 0x94, 0x43, 0xE6, 0xB0, 0xB4, 0x43, 0xE6, + 0xB1, 0x8E, 0x43, 0xE6, 0xB1, 0xA7, 0x43, 0xE6, + 0xB2, 0x88, 0x43, 0xE6, 0xB2, 0xBF, 0x43, 0xE6, + 0xB3, 0x8C, 0x43, 0xE6, 0xB3, 0x8D, 0x43, 0xE6, + 0xB3, 0xA5, 0x43, 0xE6, 0xB3, 0xA8, 0x43, 0xE6, + 0xB4, 0x96, 0x43, 0xE6, 0xB4, 0x9B, 0x43, 0xE6, + // Bytes f00 - f3f + 0xB4, 0x9E, 0x43, 0xE6, 0xB4, 0xB4, 0x43, 0xE6, + 0xB4, 0xBE, 0x43, 0xE6, 0xB5, 0x81, 0x43, 0xE6, + 0xB5, 0xA9, 0x43, 0xE6, 0xB5, 0xAA, 0x43, 0xE6, + 0xB5, 0xB7, 0x43, 0xE6, 0xB5, 0xB8, 0x43, 0xE6, + 0xB6, 0x85, 0x43, 0xE6, 0xB7, 0x8B, 0x43, 0xE6, + 0xB7, 0x9A, 0x43, 0xE6, 0xB7, 0xAA, 0x43, 0xE6, + 0xB7, 0xB9, 0x43, 0xE6, 0xB8, 0x9A, 0x43, 0xE6, + 0xB8, 0xAF, 0x43, 0xE6, 0xB9, 0xAE, 0x43, 0xE6, + // Bytes f40 - f7f + 0xBA, 0x80, 0x43, 0xE6, 0xBA, 0x9C, 0x43, 0xE6, + 0xBA, 0xBA, 0x43, 0xE6, 0xBB, 0x87, 0x43, 0xE6, + 0xBB, 0x8B, 0x43, 0xE6, 0xBB, 0x91, 0x43, 0xE6, + 0xBB, 0x9B, 0x43, 0xE6, 0xBC, 0x8F, 0x43, 0xE6, + 0xBC, 0x94, 0x43, 0xE6, 0xBC, 0xA2, 0x43, 0xE6, + 0xBC, 0xA3, 0x43, 0xE6, 0xBD, 0xAE, 0x43, 0xE6, + 0xBF, 0x86, 0x43, 0xE6, 0xBF, 0xAB, 0x43, 0xE6, + 0xBF, 0xBE, 0x43, 0xE7, 0x80, 0x9B, 0x43, 0xE7, + // Bytes f80 - fbf + 0x80, 0x9E, 0x43, 0xE7, 0x80, 0xB9, 0x43, 0xE7, + 0x81, 0x8A, 0x43, 0xE7, 0x81, 0xAB, 0x43, 0xE7, + 0x81, 0xB0, 0x43, 0xE7, 0x81, 0xB7, 0x43, 0xE7, + 0x81, 0xBD, 0x43, 0xE7, 0x82, 0x99, 0x43, 0xE7, + 0x82, 0xAD, 0x43, 0xE7, 0x83, 0x88, 0x43, 0xE7, + 0x83, 0x99, 0x43, 0xE7, 0x84, 0xA1, 0x43, 0xE7, + 0x85, 0x85, 0x43, 0xE7, 0x85, 0x89, 0x43, 0xE7, + 0x85, 0xAE, 0x43, 0xE7, 0x86, 0x9C, 0x43, 0xE7, + // Bytes fc0 - fff + 0x87, 0x8E, 0x43, 0xE7, 0x87, 0x90, 0x43, 0xE7, + 0x88, 0x90, 0x43, 0xE7, 0x88, 0x9B, 0x43, 0xE7, + 0x88, 0xA8, 0x43, 0xE7, 0x88, 0xAA, 0x43, 0xE7, + 0x88, 0xAB, 0x43, 0xE7, 0x88, 0xB5, 0x43, 0xE7, + 0x88, 0xB6, 0x43, 0xE7, 0x88, 0xBB, 0x43, 0xE7, + 0x88, 0xBF, 0x43, 0xE7, 0x89, 0x87, 0x43, 0xE7, + 0x89, 0x90, 0x43, 0xE7, 0x89, 0x99, 0x43, 0xE7, + 0x89, 0x9B, 0x43, 0xE7, 0x89, 0xA2, 0x43, 0xE7, + // Bytes 1000 - 103f + 0x89, 0xB9, 0x43, 0xE7, 0x8A, 0x80, 0x43, 0xE7, + 0x8A, 0x95, 0x43, 0xE7, 0x8A, 0xAC, 0x43, 0xE7, + 0x8A, 0xAF, 0x43, 0xE7, 0x8B, 0x80, 0x43, 0xE7, + 0x8B, 0xBC, 0x43, 0xE7, 0x8C, 0xAA, 0x43, 0xE7, + 0x8D, 0xB5, 0x43, 0xE7, 0x8D, 0xBA, 0x43, 0xE7, + 0x8E, 0x84, 0x43, 0xE7, 0x8E, 0x87, 0x43, 0xE7, + 0x8E, 0x89, 0x43, 0xE7, 0x8E, 0x8B, 0x43, 0xE7, + 0x8E, 0xA5, 0x43, 0xE7, 0x8E, 0xB2, 0x43, 0xE7, + // Bytes 1040 - 107f + 0x8F, 0x9E, 0x43, 0xE7, 0x90, 0x86, 0x43, 0xE7, + 0x90, 0x89, 0x43, 0xE7, 0x90, 0xA2, 0x43, 0xE7, + 0x91, 0x87, 0x43, 0xE7, 0x91, 0x9C, 0x43, 0xE7, + 0x91, 0xA9, 0x43, 0xE7, 0x91, 0xB1, 0x43, 0xE7, + 0x92, 0x85, 0x43, 0xE7, 0x92, 0x89, 0x43, 0xE7, + 0x92, 0x98, 0x43, 0xE7, 0x93, 0x8A, 0x43, 0xE7, + 0x93, 0x9C, 0x43, 0xE7, 0x93, 0xA6, 0x43, 0xE7, + 0x94, 0x86, 0x43, 0xE7, 0x94, 0x98, 0x43, 0xE7, + // Bytes 1080 - 10bf + 0x94, 0x9F, 0x43, 0xE7, 0x94, 0xA4, 0x43, 0xE7, + 0x94, 0xA8, 0x43, 0xE7, 0x94, 0xB0, 0x43, 0xE7, + 0x94, 0xB2, 0x43, 0xE7, 0x94, 0xB3, 0x43, 0xE7, + 0x94, 0xB7, 0x43, 0xE7, 0x94, 0xBB, 0x43, 0xE7, + 0x94, 0xBE, 0x43, 0xE7, 0x95, 0x99, 0x43, 0xE7, + 0x95, 0xA5, 0x43, 0xE7, 0x95, 0xB0, 0x43, 0xE7, + 0x96, 0x8B, 0x43, 0xE7, 0x96, 0x92, 0x43, 0xE7, + 0x97, 0xA2, 0x43, 0xE7, 0x98, 0x90, 0x43, 0xE7, + // Bytes 10c0 - 10ff + 0x98, 0x9D, 0x43, 0xE7, 0x98, 0x9F, 0x43, 0xE7, + 0x99, 0x82, 0x43, 0xE7, 0x99, 0xA9, 0x43, 0xE7, + 0x99, 0xB6, 0x43, 0xE7, 0x99, 0xBD, 0x43, 0xE7, + 0x9A, 0xAE, 0x43, 0xE7, 0x9A, 0xBF, 0x43, 0xE7, + 0x9B, 0x8A, 0x43, 0xE7, 0x9B, 0x9B, 0x43, 0xE7, + 0x9B, 0xA3, 0x43, 0xE7, 0x9B, 0xA7, 0x43, 0xE7, + 0x9B, 0xAE, 0x43, 0xE7, 0x9B, 0xB4, 0x43, 0xE7, + 0x9C, 0x81, 0x43, 0xE7, 0x9C, 0x9E, 0x43, 0xE7, + // Bytes 1100 - 113f + 0x9C, 0x9F, 0x43, 0xE7, 0x9D, 0x80, 0x43, 0xE7, + 0x9D, 0x8A, 0x43, 0xE7, 0x9E, 0x8B, 0x43, 0xE7, + 0x9E, 0xA7, 0x43, 0xE7, 0x9F, 0x9B, 0x43, 0xE7, + 0x9F, 0xA2, 0x43, 0xE7, 0x9F, 0xB3, 0x43, 0xE7, + 0xA1, 0x8E, 0x43, 0xE7, 0xA1, 0xAB, 0x43, 0xE7, + 0xA2, 0x8C, 0x43, 0xE7, 0xA2, 0x91, 0x43, 0xE7, + 0xA3, 0x8A, 0x43, 0xE7, 0xA3, 0x8C, 0x43, 0xE7, + 0xA3, 0xBB, 0x43, 0xE7, 0xA4, 0xAA, 0x43, 0xE7, + // Bytes 1140 - 117f + 0xA4, 0xBA, 0x43, 0xE7, 0xA4, 0xBC, 0x43, 0xE7, + 0xA4, 0xBE, 0x43, 0xE7, 0xA5, 0x88, 0x43, 0xE7, + 0xA5, 0x89, 0x43, 0xE7, 0xA5, 0x90, 0x43, 0xE7, + 0xA5, 0x96, 0x43, 0xE7, 0xA5, 0x9D, 0x43, 0xE7, + 0xA5, 0x9E, 0x43, 0xE7, 0xA5, 0xA5, 0x43, 0xE7, + 0xA5, 0xBF, 0x43, 0xE7, 0xA6, 0x81, 0x43, 0xE7, + 0xA6, 0x8D, 0x43, 0xE7, 0xA6, 0x8E, 0x43, 0xE7, + 0xA6, 0x8F, 0x43, 0xE7, 0xA6, 0xAE, 0x43, 0xE7, + // Bytes 1180 - 11bf + 0xA6, 0xB8, 0x43, 0xE7, 0xA6, 0xBE, 0x43, 0xE7, + 0xA7, 0x8A, 0x43, 0xE7, 0xA7, 0x98, 0x43, 0xE7, + 0xA7, 0xAB, 0x43, 0xE7, 0xA8, 0x9C, 0x43, 0xE7, + 0xA9, 0x80, 0x43, 0xE7, 0xA9, 0x8A, 0x43, 0xE7, + 0xA9, 0x8F, 0x43, 0xE7, 0xA9, 0xB4, 0x43, 0xE7, + 0xA9, 0xBA, 0x43, 0xE7, 0xAA, 0x81, 0x43, 0xE7, + 0xAA, 0xB1, 0x43, 0xE7, 0xAB, 0x8B, 0x43, 0xE7, + 0xAB, 0xAE, 0x43, 0xE7, 0xAB, 0xB9, 0x43, 0xE7, + // Bytes 11c0 - 11ff + 0xAC, 0xA0, 0x43, 0xE7, 0xAE, 0x8F, 0x43, 0xE7, + 0xAF, 0x80, 0x43, 0xE7, 0xAF, 0x86, 0x43, 0xE7, + 0xAF, 0x89, 0x43, 0xE7, 0xB0, 0xBE, 0x43, 0xE7, + 0xB1, 0xA0, 0x43, 0xE7, 0xB1, 0xB3, 0x43, 0xE7, + 0xB1, 0xBB, 0x43, 0xE7, 0xB2, 0x92, 0x43, 0xE7, + 0xB2, 0xBE, 0x43, 0xE7, 0xB3, 0x92, 0x43, 0xE7, + 0xB3, 0x96, 0x43, 0xE7, 0xB3, 0xA3, 0x43, 0xE7, + 0xB3, 0xA7, 0x43, 0xE7, 0xB3, 0xA8, 0x43, 0xE7, + // Bytes 1200 - 123f + 0xB3, 0xB8, 0x43, 0xE7, 0xB4, 0x80, 0x43, 0xE7, + 0xB4, 0x90, 0x43, 0xE7, 0xB4, 0xA2, 0x43, 0xE7, + 0xB4, 0xAF, 0x43, 0xE7, 0xB5, 0x82, 0x43, 0xE7, + 0xB5, 0x9B, 0x43, 0xE7, 0xB5, 0xA3, 0x43, 0xE7, + 0xB6, 0xA0, 0x43, 0xE7, 0xB6, 0xBE, 0x43, 0xE7, + 0xB7, 0x87, 0x43, 0xE7, 0xB7, 0xB4, 0x43, 0xE7, + 0xB8, 0x82, 0x43, 0xE7, 0xB8, 0x89, 0x43, 0xE7, + 0xB8, 0xB7, 0x43, 0xE7, 0xB9, 0x81, 0x43, 0xE7, + // Bytes 1240 - 127f + 0xB9, 0x85, 0x43, 0xE7, 0xBC, 0xB6, 0x43, 0xE7, + 0xBC, 0xBE, 0x43, 0xE7, 0xBD, 0x91, 0x43, 0xE7, + 0xBD, 0xB2, 0x43, 0xE7, 0xBD, 0xB9, 0x43, 0xE7, + 0xBD, 0xBA, 0x43, 0xE7, 0xBE, 0x85, 0x43, 0xE7, + 0xBE, 0x8A, 0x43, 0xE7, 0xBE, 0x95, 0x43, 0xE7, + 0xBE, 0x9A, 0x43, 0xE7, 0xBE, 0xBD, 0x43, 0xE7, + 0xBF, 0xBA, 0x43, 0xE8, 0x80, 0x81, 0x43, 0xE8, + 0x80, 0x85, 0x43, 0xE8, 0x80, 0x8C, 0x43, 0xE8, + // Bytes 1280 - 12bf + 0x80, 0x92, 0x43, 0xE8, 0x80, 0xB3, 0x43, 0xE8, + 0x81, 0x86, 0x43, 0xE8, 0x81, 0xA0, 0x43, 0xE8, + 0x81, 0xAF, 0x43, 0xE8, 0x81, 0xB0, 0x43, 0xE8, + 0x81, 0xBE, 0x43, 0xE8, 0x81, 0xBF, 0x43, 0xE8, + 0x82, 0x89, 0x43, 0xE8, 0x82, 0x8B, 0x43, 0xE8, + 0x82, 0xAD, 0x43, 0xE8, 0x82, 0xB2, 0x43, 0xE8, + 0x84, 0x83, 0x43, 0xE8, 0x84, 0xBE, 0x43, 0xE8, + 0x87, 0x98, 0x43, 0xE8, 0x87, 0xA3, 0x43, 0xE8, + // Bytes 12c0 - 12ff + 0x87, 0xA8, 0x43, 0xE8, 0x87, 0xAA, 0x43, 0xE8, + 0x87, 0xAD, 0x43, 0xE8, 0x87, 0xB3, 0x43, 0xE8, + 0x87, 0xBC, 0x43, 0xE8, 0x88, 0x81, 0x43, 0xE8, + 0x88, 0x84, 0x43, 0xE8, 0x88, 0x8C, 0x43, 0xE8, + 0x88, 0x98, 0x43, 0xE8, 0x88, 0x9B, 0x43, 0xE8, + 0x88, 0x9F, 0x43, 0xE8, 0x89, 0xAE, 0x43, 0xE8, + 0x89, 0xAF, 0x43, 0xE8, 0x89, 0xB2, 0x43, 0xE8, + 0x89, 0xB8, 0x43, 0xE8, 0x89, 0xB9, 0x43, 0xE8, + // Bytes 1300 - 133f + 0x8A, 0x8B, 0x43, 0xE8, 0x8A, 0x91, 0x43, 0xE8, + 0x8A, 0x9D, 0x43, 0xE8, 0x8A, 0xB1, 0x43, 0xE8, + 0x8A, 0xB3, 0x43, 0xE8, 0x8A, 0xBD, 0x43, 0xE8, + 0x8B, 0xA5, 0x43, 0xE8, 0x8B, 0xA6, 0x43, 0xE8, + 0x8C, 0x9D, 0x43, 0xE8, 0x8C, 0xA3, 0x43, 0xE8, + 0x8C, 0xB6, 0x43, 0xE8, 0x8D, 0x92, 0x43, 0xE8, + 0x8D, 0x93, 0x43, 0xE8, 0x8D, 0xA3, 0x43, 0xE8, + 0x8E, 0xAD, 0x43, 0xE8, 0x8E, 0xBD, 0x43, 0xE8, + // Bytes 1340 - 137f + 0x8F, 0x89, 0x43, 0xE8, 0x8F, 0x8A, 0x43, 0xE8, + 0x8F, 0x8C, 0x43, 0xE8, 0x8F, 0x9C, 0x43, 0xE8, + 0x8F, 0xA7, 0x43, 0xE8, 0x8F, 0xAF, 0x43, 0xE8, + 0x8F, 0xB1, 0x43, 0xE8, 0x90, 0xBD, 0x43, 0xE8, + 0x91, 0x89, 0x43, 0xE8, 0x91, 0x97, 0x43, 0xE8, + 0x93, 0xAE, 0x43, 0xE8, 0x93, 0xB1, 0x43, 0xE8, + 0x93, 0xB3, 0x43, 0xE8, 0x93, 0xBC, 0x43, 0xE8, + 0x94, 0x96, 0x43, 0xE8, 0x95, 0xA4, 0x43, 0xE8, + // Bytes 1380 - 13bf + 0x97, 0x8D, 0x43, 0xE8, 0x97, 0xBA, 0x43, 0xE8, + 0x98, 0x86, 0x43, 0xE8, 0x98, 0x92, 0x43, 0xE8, + 0x98, 0xAD, 0x43, 0xE8, 0x98, 0xBF, 0x43, 0xE8, + 0x99, 0x8D, 0x43, 0xE8, 0x99, 0x90, 0x43, 0xE8, + 0x99, 0x9C, 0x43, 0xE8, 0x99, 0xA7, 0x43, 0xE8, + 0x99, 0xA9, 0x43, 0xE8, 0x99, 0xAB, 0x43, 0xE8, + 0x9A, 0x88, 0x43, 0xE8, 0x9A, 0xA9, 0x43, 0xE8, + 0x9B, 0xA2, 0x43, 0xE8, 0x9C, 0x8E, 0x43, 0xE8, + // Bytes 13c0 - 13ff + 0x9C, 0xA8, 0x43, 0xE8, 0x9D, 0xAB, 0x43, 0xE8, + 0x9D, 0xB9, 0x43, 0xE8, 0x9E, 0x86, 0x43, 0xE8, + 0x9E, 0xBA, 0x43, 0xE8, 0x9F, 0xA1, 0x43, 0xE8, + 0xA0, 0x81, 0x43, 0xE8, 0xA0, 0x9F, 0x43, 0xE8, + 0xA1, 0x80, 0x43, 0xE8, 0xA1, 0x8C, 0x43, 0xE8, + 0xA1, 0xA0, 0x43, 0xE8, 0xA1, 0xA3, 0x43, 0xE8, + 0xA3, 0x82, 0x43, 0xE8, 0xA3, 0x8F, 0x43, 0xE8, + 0xA3, 0x97, 0x43, 0xE8, 0xA3, 0x9E, 0x43, 0xE8, + // Bytes 1400 - 143f + 0xA3, 0xA1, 0x43, 0xE8, 0xA3, 0xB8, 0x43, 0xE8, + 0xA3, 0xBA, 0x43, 0xE8, 0xA4, 0x90, 0x43, 0xE8, + 0xA5, 0x81, 0x43, 0xE8, 0xA5, 0xA4, 0x43, 0xE8, + 0xA5, 0xBE, 0x43, 0xE8, 0xA6, 0x86, 0x43, 0xE8, + 0xA6, 0x8B, 0x43, 0xE8, 0xA6, 0x96, 0x43, 0xE8, + 0xA7, 0x92, 0x43, 0xE8, 0xA7, 0xA3, 0x43, 0xE8, + 0xA8, 0x80, 0x43, 0xE8, 0xAA, 0xA0, 0x43, 0xE8, + 0xAA, 0xAA, 0x43, 0xE8, 0xAA, 0xBF, 0x43, 0xE8, + // Bytes 1440 - 147f + 0xAB, 0x8B, 0x43, 0xE8, 0xAB, 0x92, 0x43, 0xE8, + 0xAB, 0x96, 0x43, 0xE8, 0xAB, 0xAD, 0x43, 0xE8, + 0xAB, 0xB8, 0x43, 0xE8, 0xAB, 0xBE, 0x43, 0xE8, + 0xAC, 0x81, 0x43, 0xE8, 0xAC, 0xB9, 0x43, 0xE8, + 0xAD, 0x98, 0x43, 0xE8, 0xAE, 0x80, 0x43, 0xE8, + 0xAE, 0x8A, 0x43, 0xE8, 0xB0, 0xB7, 0x43, 0xE8, + 0xB1, 0x86, 0x43, 0xE8, 0xB1, 0x88, 0x43, 0xE8, + 0xB1, 0x95, 0x43, 0xE8, 0xB1, 0xB8, 0x43, 0xE8, + // Bytes 1480 - 14bf + 0xB2, 0x9D, 0x43, 0xE8, 0xB2, 0xA1, 0x43, 0xE8, + 0xB2, 0xA9, 0x43, 0xE8, 0xB2, 0xAB, 0x43, 0xE8, + 0xB3, 0x81, 0x43, 0xE8, 0xB3, 0x82, 0x43, 0xE8, + 0xB3, 0x87, 0x43, 0xE8, 0xB3, 0x88, 0x43, 0xE8, + 0xB3, 0x93, 0x43, 0xE8, 0xB4, 0x88, 0x43, 0xE8, + 0xB4, 0x9B, 0x43, 0xE8, 0xB5, 0xA4, 0x43, 0xE8, + 0xB5, 0xB0, 0x43, 0xE8, 0xB5, 0xB7, 0x43, 0xE8, + 0xB6, 0xB3, 0x43, 0xE8, 0xB6, 0xBC, 0x43, 0xE8, + // Bytes 14c0 - 14ff + 0xB7, 0x8B, 0x43, 0xE8, 0xB7, 0xAF, 0x43, 0xE8, + 0xB7, 0xB0, 0x43, 0xE8, 0xBA, 0xAB, 0x43, 0xE8, + 0xBB, 0x8A, 0x43, 0xE8, 0xBB, 0x94, 0x43, 0xE8, + 0xBC, 0xA6, 0x43, 0xE8, 0xBC, 0xAA, 0x43, 0xE8, + 0xBC, 0xB8, 0x43, 0xE8, 0xBC, 0xBB, 0x43, 0xE8, + 0xBD, 0xA2, 0x43, 0xE8, 0xBE, 0x9B, 0x43, 0xE8, + 0xBE, 0x9E, 0x43, 0xE8, 0xBE, 0xB0, 0x43, 0xE8, + 0xBE, 0xB5, 0x43, 0xE8, 0xBE, 0xB6, 0x43, 0xE9, + // Bytes 1500 - 153f + 0x80, 0xA3, 0x43, 0xE9, 0x80, 0xB8, 0x43, 0xE9, + 0x81, 0x8A, 0x43, 0xE9, 0x81, 0xA9, 0x43, 0xE9, + 0x81, 0xB2, 0x43, 0xE9, 0x81, 0xBC, 0x43, 0xE9, + 0x82, 0x8F, 0x43, 0xE9, 0x82, 0x91, 0x43, 0xE9, + 0x82, 0x94, 0x43, 0xE9, 0x83, 0x8E, 0x43, 0xE9, + 0x83, 0x9E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9, + 0x83, 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9, + 0x84, 0x9B, 0x43, 0xE9, 0x85, 0x89, 0x43, 0xE9, + // Bytes 1540 - 157f + 0x85, 0x8D, 0x43, 0xE9, 0x85, 0xAA, 0x43, 0xE9, + 0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, 0xE9, + 0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, 0xE9, + 0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, 0xE9, + 0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, 0xE9, + 0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, 0xE9, + 0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, 0xE9, + 0x8C, 0x84, 0x43, 0xE9, 0x8D, 0x8A, 0x43, 0xE9, + // Bytes 1580 - 15bf + 0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, 0xE9, + 0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, 0xE9, + 0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, 0xE9, + 0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, 0xE9, + 0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, 0xE9, + 0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, 0xE9, + 0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, 0xE9, + 0x9A, 0x86, 0x43, 0xE9, 0x9A, 0xA3, 0x43, 0xE9, + // Bytes 15c0 - 15ff + 0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, 0xE9, + 0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9, + 0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9, + 0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9, + 0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9, + 0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9, + 0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9, + 0x9D, 0x96, 0x43, 0xE9, 0x9D, 0x9E, 0x43, 0xE9, + // Bytes 1600 - 163f + 0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9, + 0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9, + 0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9, + 0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9, + 0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9, + 0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9, + 0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9, + 0xA1, 0x9E, 0x43, 0xE9, 0xA2, 0xA8, 0x43, 0xE9, + // Bytes 1640 - 167f + 0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9, + 0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9, + 0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9, + 0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9, + 0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9, + 0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9, + 0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9, + 0xA9, 0xAA, 0x43, 0xE9, 0xAA, 0xA8, 0x43, 0xE9, + // Bytes 1680 - 16bf + 0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9, + 0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9, + 0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9, + 0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9, + 0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9, + 0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9, + 0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9, + 0xB6, 0xB4, 0x43, 0xE9, 0xB7, 0xBA, 0x43, 0xE9, + // Bytes 16c0 - 16ff + 0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9, + 0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9, + 0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9, + 0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9, + 0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9, + 0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9, + 0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9, + 0xBC, 0x85, 0x43, 0xE9, 0xBC, 0x8E, 0x43, 0xE9, + // Bytes 1700 - 173f + 0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9, + 0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9, + 0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9, + 0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9, + 0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9, + 0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9, + 0xBE, 0xA0, 0x43, 0xEA, 0x99, 0x91, 0x43, 0xEA, + 0x9A, 0x89, 0x43, 0xEA, 0x9C, 0xA7, 0x43, 0xEA, + // Bytes 1740 - 177f + 0x9D, 0xAF, 0x43, 0xEA, 0x9E, 0x8E, 0x43, 0xEA, + 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x43, 0xEA, + 0xAD, 0xA6, 0x43, 0xEA, 0xAD, 0xA7, 0x44, 0xF0, + 0x9D, 0xBC, 0x84, 0x44, 0xF0, 0x9D, 0xBC, 0x85, + 0x44, 0xF0, 0x9D, 0xBC, 0x86, 0x44, 0xF0, 0x9D, + 0xBC, 0x88, 0x44, 0xF0, 0x9D, 0xBC, 0x8A, 0x44, + 0xF0, 0x9D, 0xBC, 0x9E, 0x44, 0xF0, 0xA0, 0x84, + 0xA2, 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0, + // Bytes 1780 - 17bf + 0xA0, 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B, + 0x44, 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0, + 0xA0, 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44, + 0xF0, 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD, + 0xA3, 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0, + 0xA1, 0x9A, 0xA8, 0x44, 0xF0, 0xA1, 0x9B, 0xAA, + 0x44, 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1, + 0xAC, 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44, + // Bytes 17c0 - 17ff + 0xF0, 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7, + 0xA6, 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0, + 0xA2, 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1, + 0x44, 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2, + 0xA1, 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44, + 0xF0, 0xA2, 0xAC, 0x8C, 0x44, 0xF0, 0xA2, 0xAF, + 0xB1, 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0, + 0xA3, 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F, + // Bytes 1800 - 183f + 0x44, 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3, + 0x8E, 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44, + 0xF0, 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91, + 0xAD, 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0, + 0xA3, 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D, + 0x44, 0xF0, 0xA3, 0xAB, 0xBA, 0x44, 0xF0, 0xA3, + 0xB2, 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44, + 0xF0, 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD, + // Bytes 1840 - 187f + 0x9E, 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0, + 0xA4, 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE, + 0x44, 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4, + 0x98, 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44, + 0xF0, 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0, + 0xB6, 0x44, 0xF0, 0xA4, 0xB2, 0x92, 0x44, 0xF0, + 0xA4, 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8, + 0x44, 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5, + // Bytes 1880 - 18bf + 0x83, 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44, + 0xF0, 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84, + 0xB3, 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0, + 0xA5, 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6, + 0x44, 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5, + 0x9B, 0x85, 0x44, 0xF0, 0xA5, 0xA5, 0xBC, 0x44, + 0xF0, 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE, + 0xAB, 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0, + // Bytes 18c0 - 18ff + 0xA5, 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86, + 0x44, 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6, + 0x88, 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44, + 0xF0, 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C, + 0xBE, 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0, + 0xA6, 0x94, 0xA3, 0x44, 0xF0, 0xA6, 0x96, 0xA8, + 0x44, 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6, + 0x9E, 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44, + // Bytes 1900 - 193f + 0xF0, 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3, + 0x95, 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0, + 0xA6, 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1, + 0x44, 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7, + 0x8F, 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44, + 0xF0, 0xA7, 0xA2, 0xAE, 0x44, 0xF0, 0xA7, 0xA5, + 0xA6, 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0, + 0xA7, 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF, + // Bytes 1940 - 197f + 0x44, 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8, + 0x97, 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44, + 0xF0, 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5, + 0xB7, 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0, + 0xA9, 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A, + 0x44, 0xF0, 0xA9, 0x90, 0x8A, 0x44, 0xF0, 0xA9, + 0x92, 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44, + 0xF0, 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83, + // Bytes 1980 - 19bf + 0x8E, 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0, + 0xAA, 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91, + 0x44, 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA, + 0x98, 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F, + 0x42, 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30, + 0x2E, 0x42, 0x31, 0x2C, 0x42, 0x31, 0x2E, 0x42, + 0x31, 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32, + 0x42, 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31, + // Bytes 19c0 - 19ff + 0x35, 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42, + 0x31, 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C, + 0x42, 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32, + 0x31, 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42, + 0x32, 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36, + 0x42, 0x32, 0x37, 0x42, 0x32, 0x38, 0x42, 0x32, + 0x39, 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42, + 0x33, 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32, + // Bytes 1a00 - 1a3f + 0x42, 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33, + 0x35, 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42, + 0x33, 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C, + 0x42, 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34, + 0x31, 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42, + 0x34, 0x34, 0x42, 0x34, 0x35, 0x42, 0x34, 0x36, + 0x42, 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34, + 0x39, 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42, + // Bytes 1a40 - 1a7f + 0x35, 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E, + 0x42, 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38, + 0x2C, 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42, + 0x39, 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21, + 0x42, 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42, + 0x71, 0x42, 0x43, 0x44, 0x42, 0x44, 0x4A, 0x42, + 0x44, 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42, + 0x42, 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48, + // Bytes 1a80 - 1abf + 0x56, 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42, + 0x49, 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55, + 0x42, 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B, + 0x42, 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42, + 0x4C, 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42, + 0x42, 0x4D, 0x43, 0x42, 0x4D, 0x44, 0x42, 0x4D, + 0x52, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, + 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, + // Bytes 1ac0 - 1aff + 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, + 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, + 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, + 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, + 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, + 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, + 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, + 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, + // Bytes 1b00 - 1b3f + 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, + 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, + 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, + 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, + 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, + 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, + 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, + 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, + // Bytes 1b40 - 1b7f + 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, + 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, + 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, + 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, + 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, + 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, + 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, + 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, + // Bytes 1b80 - 1bbf + 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, + 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, + 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, + 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, + 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, + 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, + 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, + 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, + // Bytes 1bc0 - 1bff + 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, + 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, + 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, + 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, + 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, + 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, + 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, + 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, + // Bytes 1c00 - 1c3f + 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, + 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, + 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, + 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, + 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, + 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, + 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, + 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, + // Bytes 1c40 - 1c7f + 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, + 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, + 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, + 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, + 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, + 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, + 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, + 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, + // Bytes 1c80 - 1cbf + 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, + 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, + 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, + 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, + 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, + 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, + 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, + 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, + // Bytes 1cc0 - 1cff + 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, + 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, + 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, + 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, + 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, + 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, + 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, + 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, + // Bytes 1d00 - 1d3f + 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, + 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, + 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, + 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, + 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, + 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, + 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, + 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, + // Bytes 1d40 - 1d7f + 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, + 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, + 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, + 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, + 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, + 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, + 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, + 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, + // Bytes 1d80 - 1dbf + 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, + 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, + 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, + 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, + 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, + 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, + 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, + 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, + // Bytes 1dc0 - 1dff + 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, + 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, + 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, + 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, + 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, + 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, + 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, + 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, + // Bytes 1e00 - 1e3f + 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, + 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, + 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, + 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, + 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, + 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, + 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, + 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, + // Bytes 1e40 - 1e7f + 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, + 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, + 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, + 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, + 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, + 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, + 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, + 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, + // Bytes 1e80 - 1ebf + 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, + 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, + 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, + 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, + 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, + 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, + 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, + 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, + // Bytes 1ec0 - 1eff + 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, + 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, + 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, + 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, + 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, + 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, + 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, + 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, + // Bytes 1f00 - 1f3f + 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, + 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, + 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, + 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, + 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, + 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, + 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, + 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, + // Bytes 1f40 - 1f7f + 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, + 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, + 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, + 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, + 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, + 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, + 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, + 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, + // Bytes 1f80 - 1fbf + 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, + 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, + 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, + 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, + 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, + 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, + 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, + 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, + // Bytes 1fc0 - 1fff + 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, + 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, + 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, + 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, + 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, + 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, + 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, + 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, + // Bytes 2000 - 203f + 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, + 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, + 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, + 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, + 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, + 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, + 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, + 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, + // Bytes 2040 - 207f + 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, + 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, + 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, + 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, + 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, + 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, + 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, + 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, + // Bytes 2080 - 20bf + 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, + 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, + 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, + 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, + 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, + 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, + 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, + 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, + // Bytes 20c0 - 20ff + 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, + 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, + 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, + 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, + 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, + 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, + 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, + 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, + // Bytes 2100 - 213f + 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, + 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, + 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, + 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, + 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, + 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, + 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, + 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, + // Bytes 2140 - 217f + 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, + 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, + 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, + 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, + 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, + 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, + 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, + 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, + // Bytes 2180 - 21bf + 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, + 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, + // Bytes 21c0 - 21ff + 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, + 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, + 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, + 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, + 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, + 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, + // Bytes 2200 - 223f + 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, + 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, + 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, + 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, + 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, + 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, + 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, + 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, + // Bytes 2240 - 227f + 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, + 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, + 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, + 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, + 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, + 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, + 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, + 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, + // Bytes 2280 - 22bf + 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, + 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, + 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, + 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, + 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, + 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, + 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, + // Bytes 22c0 - 22ff + 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, + 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, + 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, + // Bytes 2300 - 233f + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, + // Bytes 2340 - 237f + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, + 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, + // Bytes 2380 - 23bf + 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, + 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, + // Bytes 23c0 - 23ff + 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, + 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, + 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, + 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, + 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, + // Bytes 2400 - 243f + 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, + 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, + 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, + 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, + 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, + 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, + // Bytes 2440 - 247f + 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, + 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, + 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, + 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, + 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, + // Bytes 2480 - 24bf + 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, + 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, + 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, + 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + // Bytes 24c0 - 24ff + 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, + 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, + 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, + 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, + 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, + // Bytes 2500 - 253f + 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, + 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, + 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, + 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, + 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, + 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, + 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, + // Bytes 2540 - 257f + 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, + 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, + 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, + 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, + // Bytes 2580 - 25bf + 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, + 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, + 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, + // Bytes 25c0 - 25ff + 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, + 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, + 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, + 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, + 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, + // Bytes 2600 - 263f + 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, + 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, + 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, + 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, + 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, + 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, + // Bytes 2640 - 267f + 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, + 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, + 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, + 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, + 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, + 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, + // Bytes 2680 - 26bf + 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, + 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, + 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + // Bytes 26c0 - 26ff + 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, + 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, + 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, + 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, + // Bytes 2700 - 273f + 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, + // Bytes 2740 - 277f + 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, + 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, + 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, + 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, + 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, + 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, + // Bytes 2780 - 27bf + 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, + 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, + 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, + 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, + 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, + 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, + 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, + // Bytes 27c0 - 27ff + 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, + 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, + 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, + 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, + 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, + // Bytes 2800 - 283f + 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, + 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, + 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, + 0x83, 0xA0, 0x46, 0xE4, 0xBB, 0xA4, 0xE5, 0x92, + 0x8C, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, + 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x46, + // Bytes 2840 - 287f + 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, 0xE6, + 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, 0x61, + 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, 0x80, + 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, 0xE1, + 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + // Bytes 2880 - 28bf + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x89, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, + // Bytes 28c0 - 28ff + 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x92, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, 0x64, + 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, 0xA7, + 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, 0xD8, + 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x48, + // Bytes 2900 - 293f + 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, + 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, + 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, + 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, + 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, 0xAD, + 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x49, + // Bytes 2940 - 297f + 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, 0x80, + 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, 0x80, + 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, 0x9D, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, + // Bytes 2980 - 29bf + 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, 0xAC, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, + 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + // Bytes 29c0 - 29ff + 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, 0xE3, + 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x82, + 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x49, + 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, 0xE3, + 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, + // Bytes 2a00 - 2a3f + 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x49, + 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, 0xE3, + 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, + 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, + // Bytes 2a40 - 2a7f + 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x49, + 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, 0xE3, + 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, + 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, + // Bytes 2a80 - 2abf + 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, 0x83, + 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x49, + 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, 0xE3, + // Bytes 2ac0 - 2aff + 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, + 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, 0x88, + 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x4C, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, 0xA8, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, 0x83, + 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + // Bytes 2b00 - 2b3f + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, 0xE3, + 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x83, + // Bytes 2b40 - 2b7f + 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, 0xE3, + // Bytes 2b80 - 2bbf + 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, + 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x4C, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, 0x98, + // Bytes 2bc0 - 2bff + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, 0xE3, + 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, + 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + // Bytes 2c00 - 2c3f + 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0x4C, + 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, + 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, + 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, 0x84, + 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, + // Bytes 2c40 - 2c7f + 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, + // Bytes 2c80 - 2cbf + 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, + 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xA7, + // Bytes 2cc0 - 2cff + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, 0x8B, + 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, + 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, + // Bytes 2d00 - 2d3f + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, + // Bytes 2d40 - 2d7f + 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, + 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, + 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x52, + 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, + 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82, + // Bytes 2d80 - 2dbf + 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, + 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, + 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, + 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, 0x84, + 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, + // Bytes 2dc0 - 2dff + 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, + 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, 0xAE, + // Bytes 2e00 - 2e3f + 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xB2, + 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, 0xB5, + 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB5, + // Bytes 2e40 - 2e7f + 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, 0xB5, + 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB7, + 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, 0x80, + 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, 0xAC, + 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + // Bytes 2e80 - 2ebf + 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAD, + 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, 0x91, + 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, + // Bytes 2ec0 - 2eff + 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, 0xA7, + 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, + 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, + 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, 0x91, + 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, 0x08, + 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBA, + 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, + 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB8, + // Bytes 2f00 - 2f3f + 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, 0x91, + 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, + 0xF0, 0x91, 0xA4, 0xB5, 0xF0, 0x91, 0xA4, 0xB0, + 0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, + 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x16, 0x44, + 0x44, 0x5A, 0xCC, 0x8C, 0xCD, 0x44, 0x44, 0x7A, + 0xCC, 0x8C, 0xCD, 0x44, 0x64, 0x7A, 0xCC, 0x8C, + // Bytes 2f40 - 2f7f + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, + // Bytes 2f80 - 2fbf + 0x01, 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, + 0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, + // Bytes 2fc0 - 2fff + 0x01, 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, + 0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, + 0xE3, 0x82, 0x99, 0x11, 0x4C, 0xE1, 0x84, 0x8C, + 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, + 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x11, + 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, + // Bytes 3000 - 303f + 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x11, 0x4C, 0xE3, + 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE1, 0x84, 0x8E, + 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, + 0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE3, + 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, + // Bytes 3040 - 307f + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x11, + 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0x11, 0x52, 0xE3, 0x83, + // Bytes 3080 - 30bf + 0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, + 0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, + 0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, + 0x03, 0x41, 0xCC, 0x80, 0xCD, 0x03, 0x41, 0xCC, + 0x81, 0xCD, 0x03, 0x41, 0xCC, 0x83, 0xCD, 0x03, + // Bytes 30c0 - 30ff + 0x41, 0xCC, 0x84, 0xCD, 0x03, 0x41, 0xCC, 0x89, + 0xCD, 0x03, 0x41, 0xCC, 0x8C, 0xCD, 0x03, 0x41, + 0xCC, 0x8F, 0xCD, 0x03, 0x41, 0xCC, 0x91, 0xCD, + 0x03, 0x41, 0xCC, 0xA5, 0xB9, 0x03, 0x41, 0xCC, + 0xA8, 0xA9, 0x03, 0x42, 0xCC, 0x87, 0xCD, 0x03, + 0x42, 0xCC, 0xA3, 0xB9, 0x03, 0x42, 0xCC, 0xB1, + 0xB9, 0x03, 0x43, 0xCC, 0x81, 0xCD, 0x03, 0x43, + 0xCC, 0x82, 0xCD, 0x03, 0x43, 0xCC, 0x87, 0xCD, + // Bytes 3100 - 313f + 0x03, 0x43, 0xCC, 0x8C, 0xCD, 0x03, 0x44, 0xCC, + 0x87, 0xCD, 0x03, 0x44, 0xCC, 0x8C, 0xCD, 0x03, + 0x44, 0xCC, 0xA3, 0xB9, 0x03, 0x44, 0xCC, 0xA7, + 0xA9, 0x03, 0x44, 0xCC, 0xAD, 0xB9, 0x03, 0x44, + 0xCC, 0xB1, 0xB9, 0x03, 0x45, 0xCC, 0x80, 0xCD, + 0x03, 0x45, 0xCC, 0x81, 0xCD, 0x03, 0x45, 0xCC, + 0x83, 0xCD, 0x03, 0x45, 0xCC, 0x86, 0xCD, 0x03, + 0x45, 0xCC, 0x87, 0xCD, 0x03, 0x45, 0xCC, 0x88, + // Bytes 3140 - 317f + 0xCD, 0x03, 0x45, 0xCC, 0x89, 0xCD, 0x03, 0x45, + 0xCC, 0x8C, 0xCD, 0x03, 0x45, 0xCC, 0x8F, 0xCD, + 0x03, 0x45, 0xCC, 0x91, 0xCD, 0x03, 0x45, 0xCC, + 0xA8, 0xA9, 0x03, 0x45, 0xCC, 0xAD, 0xB9, 0x03, + 0x45, 0xCC, 0xB0, 0xB9, 0x03, 0x46, 0xCC, 0x87, + 0xCD, 0x03, 0x47, 0xCC, 0x81, 0xCD, 0x03, 0x47, + 0xCC, 0x82, 0xCD, 0x03, 0x47, 0xCC, 0x84, 0xCD, + 0x03, 0x47, 0xCC, 0x86, 0xCD, 0x03, 0x47, 0xCC, + // Bytes 3180 - 31bf + 0x87, 0xCD, 0x03, 0x47, 0xCC, 0x8C, 0xCD, 0x03, + 0x47, 0xCC, 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0x82, + 0xCD, 0x03, 0x48, 0xCC, 0x87, 0xCD, 0x03, 0x48, + 0xCC, 0x88, 0xCD, 0x03, 0x48, 0xCC, 0x8C, 0xCD, + 0x03, 0x48, 0xCC, 0xA3, 0xB9, 0x03, 0x48, 0xCC, + 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0xAE, 0xB9, 0x03, + 0x49, 0xCC, 0x80, 0xCD, 0x03, 0x49, 0xCC, 0x81, + 0xCD, 0x03, 0x49, 0xCC, 0x82, 0xCD, 0x03, 0x49, + // Bytes 31c0 - 31ff + 0xCC, 0x83, 0xCD, 0x03, 0x49, 0xCC, 0x84, 0xCD, + 0x03, 0x49, 0xCC, 0x86, 0xCD, 0x03, 0x49, 0xCC, + 0x87, 0xCD, 0x03, 0x49, 0xCC, 0x89, 0xCD, 0x03, + 0x49, 0xCC, 0x8C, 0xCD, 0x03, 0x49, 0xCC, 0x8F, + 0xCD, 0x03, 0x49, 0xCC, 0x91, 0xCD, 0x03, 0x49, + 0xCC, 0xA3, 0xB9, 0x03, 0x49, 0xCC, 0xA8, 0xA9, + 0x03, 0x49, 0xCC, 0xB0, 0xB9, 0x03, 0x4A, 0xCC, + 0x82, 0xCD, 0x03, 0x4B, 0xCC, 0x81, 0xCD, 0x03, + // Bytes 3200 - 323f + 0x4B, 0xCC, 0x8C, 0xCD, 0x03, 0x4B, 0xCC, 0xA3, + 0xB9, 0x03, 0x4B, 0xCC, 0xA7, 0xA9, 0x03, 0x4B, + 0xCC, 0xB1, 0xB9, 0x03, 0x4C, 0xCC, 0x81, 0xCD, + 0x03, 0x4C, 0xCC, 0x8C, 0xCD, 0x03, 0x4C, 0xCC, + 0xA7, 0xA9, 0x03, 0x4C, 0xCC, 0xAD, 0xB9, 0x03, + 0x4C, 0xCC, 0xB1, 0xB9, 0x03, 0x4D, 0xCC, 0x81, + 0xCD, 0x03, 0x4D, 0xCC, 0x87, 0xCD, 0x03, 0x4D, + 0xCC, 0xA3, 0xB9, 0x03, 0x4E, 0xCC, 0x80, 0xCD, + // Bytes 3240 - 327f + 0x03, 0x4E, 0xCC, 0x81, 0xCD, 0x03, 0x4E, 0xCC, + 0x83, 0xCD, 0x03, 0x4E, 0xCC, 0x87, 0xCD, 0x03, + 0x4E, 0xCC, 0x8C, 0xCD, 0x03, 0x4E, 0xCC, 0xA3, + 0xB9, 0x03, 0x4E, 0xCC, 0xA7, 0xA9, 0x03, 0x4E, + 0xCC, 0xAD, 0xB9, 0x03, 0x4E, 0xCC, 0xB1, 0xB9, + 0x03, 0x4F, 0xCC, 0x80, 0xCD, 0x03, 0x4F, 0xCC, + 0x81, 0xCD, 0x03, 0x4F, 0xCC, 0x86, 0xCD, 0x03, + 0x4F, 0xCC, 0x89, 0xCD, 0x03, 0x4F, 0xCC, 0x8B, + // Bytes 3280 - 32bf + 0xCD, 0x03, 0x4F, 0xCC, 0x8C, 0xCD, 0x03, 0x4F, + 0xCC, 0x8F, 0xCD, 0x03, 0x4F, 0xCC, 0x91, 0xCD, + 0x03, 0x50, 0xCC, 0x81, 0xCD, 0x03, 0x50, 0xCC, + 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x81, 0xCD, 0x03, + 0x52, 0xCC, 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x8C, + 0xCD, 0x03, 0x52, 0xCC, 0x8F, 0xCD, 0x03, 0x52, + 0xCC, 0x91, 0xCD, 0x03, 0x52, 0xCC, 0xA7, 0xA9, + 0x03, 0x52, 0xCC, 0xB1, 0xB9, 0x03, 0x53, 0xCC, + // Bytes 32c0 - 32ff + 0x82, 0xCD, 0x03, 0x53, 0xCC, 0x87, 0xCD, 0x03, + 0x53, 0xCC, 0xA6, 0xB9, 0x03, 0x53, 0xCC, 0xA7, + 0xA9, 0x03, 0x54, 0xCC, 0x87, 0xCD, 0x03, 0x54, + 0xCC, 0x8C, 0xCD, 0x03, 0x54, 0xCC, 0xA3, 0xB9, + 0x03, 0x54, 0xCC, 0xA6, 0xB9, 0x03, 0x54, 0xCC, + 0xA7, 0xA9, 0x03, 0x54, 0xCC, 0xAD, 0xB9, 0x03, + 0x54, 0xCC, 0xB1, 0xB9, 0x03, 0x55, 0xCC, 0x80, + 0xCD, 0x03, 0x55, 0xCC, 0x81, 0xCD, 0x03, 0x55, + // Bytes 3300 - 333f + 0xCC, 0x82, 0xCD, 0x03, 0x55, 0xCC, 0x86, 0xCD, + 0x03, 0x55, 0xCC, 0x89, 0xCD, 0x03, 0x55, 0xCC, + 0x8A, 0xCD, 0x03, 0x55, 0xCC, 0x8B, 0xCD, 0x03, + 0x55, 0xCC, 0x8C, 0xCD, 0x03, 0x55, 0xCC, 0x8F, + 0xCD, 0x03, 0x55, 0xCC, 0x91, 0xCD, 0x03, 0x55, + 0xCC, 0xA3, 0xB9, 0x03, 0x55, 0xCC, 0xA4, 0xB9, + 0x03, 0x55, 0xCC, 0xA8, 0xA9, 0x03, 0x55, 0xCC, + 0xAD, 0xB9, 0x03, 0x55, 0xCC, 0xB0, 0xB9, 0x03, + // Bytes 3340 - 337f + 0x56, 0xCC, 0x83, 0xCD, 0x03, 0x56, 0xCC, 0xA3, + 0xB9, 0x03, 0x57, 0xCC, 0x80, 0xCD, 0x03, 0x57, + 0xCC, 0x81, 0xCD, 0x03, 0x57, 0xCC, 0x82, 0xCD, + 0x03, 0x57, 0xCC, 0x87, 0xCD, 0x03, 0x57, 0xCC, + 0x88, 0xCD, 0x03, 0x57, 0xCC, 0xA3, 0xB9, 0x03, + 0x58, 0xCC, 0x87, 0xCD, 0x03, 0x58, 0xCC, 0x88, + 0xCD, 0x03, 0x59, 0xCC, 0x80, 0xCD, 0x03, 0x59, + 0xCC, 0x81, 0xCD, 0x03, 0x59, 0xCC, 0x82, 0xCD, + // Bytes 3380 - 33bf + 0x03, 0x59, 0xCC, 0x83, 0xCD, 0x03, 0x59, 0xCC, + 0x84, 0xCD, 0x03, 0x59, 0xCC, 0x87, 0xCD, 0x03, + 0x59, 0xCC, 0x88, 0xCD, 0x03, 0x59, 0xCC, 0x89, + 0xCD, 0x03, 0x59, 0xCC, 0xA3, 0xB9, 0x03, 0x5A, + 0xCC, 0x81, 0xCD, 0x03, 0x5A, 0xCC, 0x82, 0xCD, + 0x03, 0x5A, 0xCC, 0x87, 0xCD, 0x03, 0x5A, 0xCC, + 0x8C, 0xCD, 0x03, 0x5A, 0xCC, 0xA3, 0xB9, 0x03, + 0x5A, 0xCC, 0xB1, 0xB9, 0x03, 0x61, 0xCC, 0x80, + // Bytes 33c0 - 33ff + 0xCD, 0x03, 0x61, 0xCC, 0x81, 0xCD, 0x03, 0x61, + 0xCC, 0x83, 0xCD, 0x03, 0x61, 0xCC, 0x84, 0xCD, + 0x03, 0x61, 0xCC, 0x89, 0xCD, 0x03, 0x61, 0xCC, + 0x8C, 0xCD, 0x03, 0x61, 0xCC, 0x8F, 0xCD, 0x03, + 0x61, 0xCC, 0x91, 0xCD, 0x03, 0x61, 0xCC, 0xA5, + 0xB9, 0x03, 0x61, 0xCC, 0xA8, 0xA9, 0x03, 0x62, + 0xCC, 0x87, 0xCD, 0x03, 0x62, 0xCC, 0xA3, 0xB9, + 0x03, 0x62, 0xCC, 0xB1, 0xB9, 0x03, 0x63, 0xCC, + // Bytes 3400 - 343f + 0x81, 0xCD, 0x03, 0x63, 0xCC, 0x82, 0xCD, 0x03, + 0x63, 0xCC, 0x87, 0xCD, 0x03, 0x63, 0xCC, 0x8C, + 0xCD, 0x03, 0x64, 0xCC, 0x87, 0xCD, 0x03, 0x64, + 0xCC, 0x8C, 0xCD, 0x03, 0x64, 0xCC, 0xA3, 0xB9, + 0x03, 0x64, 0xCC, 0xA7, 0xA9, 0x03, 0x64, 0xCC, + 0xAD, 0xB9, 0x03, 0x64, 0xCC, 0xB1, 0xB9, 0x03, + 0x65, 0xCC, 0x80, 0xCD, 0x03, 0x65, 0xCC, 0x81, + 0xCD, 0x03, 0x65, 0xCC, 0x83, 0xCD, 0x03, 0x65, + // Bytes 3440 - 347f + 0xCC, 0x86, 0xCD, 0x03, 0x65, 0xCC, 0x87, 0xCD, + 0x03, 0x65, 0xCC, 0x88, 0xCD, 0x03, 0x65, 0xCC, + 0x89, 0xCD, 0x03, 0x65, 0xCC, 0x8C, 0xCD, 0x03, + 0x65, 0xCC, 0x8F, 0xCD, 0x03, 0x65, 0xCC, 0x91, + 0xCD, 0x03, 0x65, 0xCC, 0xA8, 0xA9, 0x03, 0x65, + 0xCC, 0xAD, 0xB9, 0x03, 0x65, 0xCC, 0xB0, 0xB9, + 0x03, 0x66, 0xCC, 0x87, 0xCD, 0x03, 0x67, 0xCC, + 0x81, 0xCD, 0x03, 0x67, 0xCC, 0x82, 0xCD, 0x03, + // Bytes 3480 - 34bf + 0x67, 0xCC, 0x84, 0xCD, 0x03, 0x67, 0xCC, 0x86, + 0xCD, 0x03, 0x67, 0xCC, 0x87, 0xCD, 0x03, 0x67, + 0xCC, 0x8C, 0xCD, 0x03, 0x67, 0xCC, 0xA7, 0xA9, + 0x03, 0x68, 0xCC, 0x82, 0xCD, 0x03, 0x68, 0xCC, + 0x87, 0xCD, 0x03, 0x68, 0xCC, 0x88, 0xCD, 0x03, + 0x68, 0xCC, 0x8C, 0xCD, 0x03, 0x68, 0xCC, 0xA3, + 0xB9, 0x03, 0x68, 0xCC, 0xA7, 0xA9, 0x03, 0x68, + 0xCC, 0xAE, 0xB9, 0x03, 0x68, 0xCC, 0xB1, 0xB9, + // Bytes 34c0 - 34ff + 0x03, 0x69, 0xCC, 0x80, 0xCD, 0x03, 0x69, 0xCC, + 0x81, 0xCD, 0x03, 0x69, 0xCC, 0x82, 0xCD, 0x03, + 0x69, 0xCC, 0x83, 0xCD, 0x03, 0x69, 0xCC, 0x84, + 0xCD, 0x03, 0x69, 0xCC, 0x86, 0xCD, 0x03, 0x69, + 0xCC, 0x89, 0xCD, 0x03, 0x69, 0xCC, 0x8C, 0xCD, + 0x03, 0x69, 0xCC, 0x8F, 0xCD, 0x03, 0x69, 0xCC, + 0x91, 0xCD, 0x03, 0x69, 0xCC, 0xA3, 0xB9, 0x03, + 0x69, 0xCC, 0xA8, 0xA9, 0x03, 0x69, 0xCC, 0xB0, + // Bytes 3500 - 353f + 0xB9, 0x03, 0x6A, 0xCC, 0x82, 0xCD, 0x03, 0x6A, + 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, 0x81, 0xCD, + 0x03, 0x6B, 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, + 0xA3, 0xB9, 0x03, 0x6B, 0xCC, 0xA7, 0xA9, 0x03, + 0x6B, 0xCC, 0xB1, 0xB9, 0x03, 0x6C, 0xCC, 0x81, + 0xCD, 0x03, 0x6C, 0xCC, 0x8C, 0xCD, 0x03, 0x6C, + 0xCC, 0xA7, 0xA9, 0x03, 0x6C, 0xCC, 0xAD, 0xB9, + 0x03, 0x6C, 0xCC, 0xB1, 0xB9, 0x03, 0x6D, 0xCC, + // Bytes 3540 - 357f + 0x81, 0xCD, 0x03, 0x6D, 0xCC, 0x87, 0xCD, 0x03, + 0x6D, 0xCC, 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0x80, + 0xCD, 0x03, 0x6E, 0xCC, 0x81, 0xCD, 0x03, 0x6E, + 0xCC, 0x83, 0xCD, 0x03, 0x6E, 0xCC, 0x87, 0xCD, + 0x03, 0x6E, 0xCC, 0x8C, 0xCD, 0x03, 0x6E, 0xCC, + 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0xA7, 0xA9, 0x03, + 0x6E, 0xCC, 0xAD, 0xB9, 0x03, 0x6E, 0xCC, 0xB1, + 0xB9, 0x03, 0x6F, 0xCC, 0x80, 0xCD, 0x03, 0x6F, + // Bytes 3580 - 35bf + 0xCC, 0x81, 0xCD, 0x03, 0x6F, 0xCC, 0x86, 0xCD, + 0x03, 0x6F, 0xCC, 0x89, 0xCD, 0x03, 0x6F, 0xCC, + 0x8B, 0xCD, 0x03, 0x6F, 0xCC, 0x8C, 0xCD, 0x03, + 0x6F, 0xCC, 0x8F, 0xCD, 0x03, 0x6F, 0xCC, 0x91, + 0xCD, 0x03, 0x70, 0xCC, 0x81, 0xCD, 0x03, 0x70, + 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, 0x81, 0xCD, + 0x03, 0x72, 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, + 0x8C, 0xCD, 0x03, 0x72, 0xCC, 0x8F, 0xCD, 0x03, + // Bytes 35c0 - 35ff + 0x72, 0xCC, 0x91, 0xCD, 0x03, 0x72, 0xCC, 0xA7, + 0xA9, 0x03, 0x72, 0xCC, 0xB1, 0xB9, 0x03, 0x73, + 0xCC, 0x82, 0xCD, 0x03, 0x73, 0xCC, 0x87, 0xCD, + 0x03, 0x73, 0xCC, 0xA6, 0xB9, 0x03, 0x73, 0xCC, + 0xA7, 0xA9, 0x03, 0x74, 0xCC, 0x87, 0xCD, 0x03, + 0x74, 0xCC, 0x88, 0xCD, 0x03, 0x74, 0xCC, 0x8C, + 0xCD, 0x03, 0x74, 0xCC, 0xA3, 0xB9, 0x03, 0x74, + 0xCC, 0xA6, 0xB9, 0x03, 0x74, 0xCC, 0xA7, 0xA9, + // Bytes 3600 - 363f + 0x03, 0x74, 0xCC, 0xAD, 0xB9, 0x03, 0x74, 0xCC, + 0xB1, 0xB9, 0x03, 0x75, 0xCC, 0x80, 0xCD, 0x03, + 0x75, 0xCC, 0x81, 0xCD, 0x03, 0x75, 0xCC, 0x82, + 0xCD, 0x03, 0x75, 0xCC, 0x86, 0xCD, 0x03, 0x75, + 0xCC, 0x89, 0xCD, 0x03, 0x75, 0xCC, 0x8A, 0xCD, + 0x03, 0x75, 0xCC, 0x8B, 0xCD, 0x03, 0x75, 0xCC, + 0x8C, 0xCD, 0x03, 0x75, 0xCC, 0x8F, 0xCD, 0x03, + 0x75, 0xCC, 0x91, 0xCD, 0x03, 0x75, 0xCC, 0xA3, + // Bytes 3640 - 367f + 0xB9, 0x03, 0x75, 0xCC, 0xA4, 0xB9, 0x03, 0x75, + 0xCC, 0xA8, 0xA9, 0x03, 0x75, 0xCC, 0xAD, 0xB9, + 0x03, 0x75, 0xCC, 0xB0, 0xB9, 0x03, 0x76, 0xCC, + 0x83, 0xCD, 0x03, 0x76, 0xCC, 0xA3, 0xB9, 0x03, + 0x77, 0xCC, 0x80, 0xCD, 0x03, 0x77, 0xCC, 0x81, + 0xCD, 0x03, 0x77, 0xCC, 0x82, 0xCD, 0x03, 0x77, + 0xCC, 0x87, 0xCD, 0x03, 0x77, 0xCC, 0x88, 0xCD, + 0x03, 0x77, 0xCC, 0x8A, 0xCD, 0x03, 0x77, 0xCC, + // Bytes 3680 - 36bf + 0xA3, 0xB9, 0x03, 0x78, 0xCC, 0x87, 0xCD, 0x03, + 0x78, 0xCC, 0x88, 0xCD, 0x03, 0x79, 0xCC, 0x80, + 0xCD, 0x03, 0x79, 0xCC, 0x81, 0xCD, 0x03, 0x79, + 0xCC, 0x82, 0xCD, 0x03, 0x79, 0xCC, 0x83, 0xCD, + 0x03, 0x79, 0xCC, 0x84, 0xCD, 0x03, 0x79, 0xCC, + 0x87, 0xCD, 0x03, 0x79, 0xCC, 0x88, 0xCD, 0x03, + 0x79, 0xCC, 0x89, 0xCD, 0x03, 0x79, 0xCC, 0x8A, + 0xCD, 0x03, 0x79, 0xCC, 0xA3, 0xB9, 0x03, 0x7A, + // Bytes 36c0 - 36ff + 0xCC, 0x81, 0xCD, 0x03, 0x7A, 0xCC, 0x82, 0xCD, + 0x03, 0x7A, 0xCC, 0x87, 0xCD, 0x03, 0x7A, 0xCC, + 0x8C, 0xCD, 0x03, 0x7A, 0xCC, 0xA3, 0xB9, 0x03, + 0x7A, 0xCC, 0xB1, 0xB9, 0x04, 0xC2, 0xA8, 0xCC, + 0x80, 0xCE, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, + 0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCE, 0x04, 0xC3, + 0x86, 0xCC, 0x81, 0xCD, 0x04, 0xC3, 0x86, 0xCC, + 0x84, 0xCD, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xCD, + // Bytes 3700 - 373f + 0x04, 0xC3, 0xA6, 0xCC, 0x81, 0xCD, 0x04, 0xC3, + 0xA6, 0xCC, 0x84, 0xCD, 0x04, 0xC3, 0xB8, 0xCC, + 0x81, 0xCD, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xCD, + 0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xCD, 0x04, 0xCA, + 0x92, 0xCC, 0x8C, 0xCD, 0x04, 0xCE, 0x91, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0x91, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0x91, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0x91, 0xCD, + // Bytes 3740 - 377f + 0x85, 0xDD, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0x95, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0x97, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x97, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xDD, + 0x04, 0xCE, 0x99, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0x99, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0x99, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + // Bytes 3780 - 37bf + 0x9F, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x9F, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0xA5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + 0xA9, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0xA9, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xDD, + // Bytes 37c0 - 37ff + 0x04, 0xCE, 0xB1, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB1, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB1, 0xCD, + 0x85, 0xDD, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0xB7, 0xCD, 0x85, 0xDD, 0x04, 0xCE, 0xB9, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB9, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB9, 0xCD, + // Bytes 3800 - 383f + 0x82, 0xCD, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x81, 0xCC, 0x93, 0xCD, 0x04, 0xCF, 0x81, 0xCC, + 0x94, 0xCD, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xCD, + 0x04, 0xCF, 0x85, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x85, 0xCC, 0x84, 0xCD, 0x04, 0xCF, 0x85, 0xCC, + 0x86, 0xCD, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xCD, + 0x04, 0xCF, 0x89, 0xCD, 0x85, 0xDD, 0x04, 0xCF, + // Bytes 3840 - 387f + 0x92, 0xCC, 0x81, 0xCD, 0x04, 0xCF, 0x92, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0x90, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x90, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x93, 0xCC, + 0x81, 0xCD, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0x95, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x95, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x96, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xCD, + // Bytes 3880 - 38bf + 0x04, 0xD0, 0x97, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x98, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0x98, 0xCC, + 0x84, 0xCD, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xCD, + 0x04, 0xD0, 0x98, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x9A, 0xCC, 0x81, 0xCD, 0x04, 0xD0, 0x9E, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xCD, + 0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0xA3, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, + // Bytes 38c0 - 38ff + 0x8B, 0xCD, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0xAD, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xCD, 0x04, 0xD0, + 0xB5, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + // Bytes 3900 - 393f + 0xB6, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB7, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xCD, 0x04, 0xD0, + 0xB8, 0xCC, 0x86, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xCD, + 0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0x83, 0xCC, 0x84, 0xCD, 0x04, 0xD1, 0x83, 0xCC, + 0x86, 0xCD, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xCD, + // Bytes 3940 - 397f + 0x04, 0xD1, 0x83, 0xCC, 0x8B, 0xCD, 0x04, 0xD1, + 0x87, 0xCC, 0x88, 0xCD, 0x04, 0xD1, 0x8B, 0xCC, + 0x88, 0xCD, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xCD, + 0x04, 0xD1, 0x96, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0xB4, 0xCC, 0x8F, 0xCD, 0x04, 0xD1, 0xB5, 0xCC, + 0x8F, 0xCD, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xCD, + 0x04, 0xD3, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xD3, + 0xA8, 0xCC, 0x88, 0xCD, 0x04, 0xD3, 0xA9, 0xCC, + // Bytes 3980 - 39bf + 0x88, 0xCD, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xCD, + 0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xCD, 0x04, 0xD8, + 0xA7, 0xD9, 0x95, 0xB9, 0x04, 0xD9, 0x88, 0xD9, + 0x94, 0xCD, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xCD, + 0x04, 0xDB, 0x81, 0xD9, 0x94, 0xCD, 0x04, 0xDB, + 0x92, 0xD9, 0x94, 0xCD, 0x04, 0xDB, 0x95, 0xD9, + 0x94, 0xCD, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + // Bytes 39c0 - 39ff + 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x41, + 0xCC, 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x41, 0xCC, + 0x86, 0xCC, 0x81, 0xCE, 0x05, 0x41, 0xCC, 0x86, + 0xCC, 0x83, 0xCE, 0x05, 0x41, 0xCC, 0x86, 0xCC, + 0x89, 0xCE, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, + 0xCE, 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCE, + 0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, + // Bytes 3a00 - 3a3f + 0x41, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x41, + 0xCC, 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x43, 0xCC, + 0xA7, 0xCC, 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, + 0xCC, 0x80, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, + 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, + 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCE, + 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, + 0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x45, + // Bytes 3a40 - 3a7f + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x45, 0xCC, + 0xA7, 0xCC, 0x86, 0xCE, 0x05, 0x49, 0xCC, 0x88, + 0xCC, 0x81, 0xCE, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, + 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x4F, + 0xCC, 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + // Bytes 3a80 - 3abf + 0x83, 0xCC, 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x83, + 0xCC, 0x88, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, + 0x80, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, + 0xCE, 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + 0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x4F, + 0xCC, 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + 0x9B, 0xCC, 0x83, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, + // Bytes 3ac0 - 3aff + 0xCC, 0x89, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, + 0xA3, 0xBA, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, + 0xCE, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, + 0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, + 0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x53, + 0xCC, 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x53, 0xCC, + 0xA3, 0xCC, 0x87, 0xCE, 0x05, 0x55, 0xCC, 0x83, + 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x84, 0xCC, + // Bytes 3b00 - 3b3f + 0x88, 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCE, + 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x55, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x55, 0xCC, + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, + // Bytes 3b40 - 3b7f + 0xBA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x61, + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x61, 0xCC, + 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x61, 0xCC, 0x86, + 0xCC, 0x81, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, + 0x83, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, + 0xCE, 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + // Bytes 3b80 - 3bbf + 0x05, 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, 0x61, + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x61, 0xCC, + 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x63, 0xCC, 0xA7, + 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, + 0x80, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, + 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCE, + 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, + // Bytes 3bc0 - 3bff + 0x65, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, 0x65, + 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, + 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x65, 0xCC, 0xA7, + 0xCC, 0x86, 0xCE, 0x05, 0x69, 0xCC, 0x88, 0xCC, + 0x81, 0xCE, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, + 0xCE, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x6F, + // Bytes 3c00 - 3c3f + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x6F, 0xCC, + 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x83, + 0xCC, 0x84, 0xCE, 0x05, 0x6F, 0xCC, 0x83, 0xCC, + 0x88, 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, + 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCE, + 0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, 0x05, + 0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x6F, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x6F, 0xCC, + // Bytes 3c40 - 3c7f + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, + 0xBA, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, + 0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, 0x05, + 0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, 0x73, + 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, + 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, 0xA3, + // Bytes 3c80 - 3cbf + 0xCC, 0x87, 0xCE, 0x05, 0x75, 0xCC, 0x83, 0xCC, + 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, + 0xCE, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCE, + 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x05, + 0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x75, + 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x75, 0xCC, + 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x75, 0xCC, 0x9B, + 0xCC, 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, + // Bytes 3cc0 - 3cff + 0x83, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, + 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xBA, + 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCE, 0x05, + 0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCE, 0x05, 0xE1, + 0xBE, 0xBF, 0xCD, 0x82, 0xCE, 0x05, 0xE1, 0xBF, + 0xBE, 0xCC, 0x80, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, + 0xCC, 0x81, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, + 0x82, 0xCE, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, + // Bytes 3d00 - 3d3f + 0x05, 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, + 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, + // Bytes 3d40 - 3d7f + 0x05, 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + // Bytes 3d80 - 3dbf + 0xE2, 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + // Bytes 3dc0 - 3dff + 0x8A, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + // Bytes 3e00 - 3e3f + 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, + 0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, + // Bytes 3e40 - 3e7f + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3e80 - 3ebf + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, + // Bytes 3ec0 - 3eff + 0xCE, 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, + // Bytes 3f00 - 3f3f + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 3f40 - 3f7f + 0xDE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3f80 - 3fbf + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, + // Bytes 3fc0 - 3fff + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, + // Bytes 4000 - 403f + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, + 0x89, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, + // Bytes 4040 - 407f + 0x15, 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, + // Bytes 4080 - 40bf + 0x11, 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, + // Bytes 40c0 - 40ff + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, + // Bytes 4100 - 413f + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4140 - 417f + 0x11, 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, + // Bytes 4180 - 41bf + 0x11, 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + // Bytes 41c0 - 41ff + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4200 - 423f + 0x11, 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 4240 - 427f + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + // Bytes 4280 - 42bf + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, + // Bytes 42c0 - 42ff + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 4300 - 433f + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + // Bytes 4340 - 437f + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, + // Bytes 4380 - 43bf + 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, 0x82, 0x9B, + 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, + 0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x42, + 0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xCD, + 0x43, 0x20, 0xCC, 0x83, 0xCD, 0x43, 0x20, 0xCC, + 0x84, 0xCD, 0x43, 0x20, 0xCC, 0x85, 0xCD, 0x43, + 0x20, 0xCC, 0x86, 0xCD, 0x43, 0x20, 0xCC, 0x87, + 0xCD, 0x43, 0x20, 0xCC, 0x88, 0xCD, 0x43, 0x20, + // Bytes 43c0 - 43ff + 0xCC, 0x8A, 0xCD, 0x43, 0x20, 0xCC, 0x8B, 0xCD, + 0x43, 0x20, 0xCC, 0x93, 0xCD, 0x43, 0x20, 0xCC, + 0x94, 0xCD, 0x43, 0x20, 0xCC, 0xA7, 0xA9, 0x43, + 0x20, 0xCC, 0xA8, 0xA9, 0x43, 0x20, 0xCC, 0xB3, + 0xB9, 0x43, 0x20, 0xCD, 0x82, 0xCD, 0x43, 0x20, + 0xCD, 0x85, 0xDD, 0x43, 0x20, 0xD9, 0x8B, 0x5D, + 0x43, 0x20, 0xD9, 0x8C, 0x61, 0x43, 0x20, 0xD9, + 0x8D, 0x65, 0x43, 0x20, 0xD9, 0x8E, 0x69, 0x43, + // Bytes 4400 - 443f + 0x20, 0xD9, 0x8F, 0x6D, 0x43, 0x20, 0xD9, 0x90, + 0x71, 0x43, 0x20, 0xD9, 0x91, 0x75, 0x43, 0x20, + 0xD9, 0x92, 0x79, 0x43, 0x41, 0xCC, 0x8A, 0xCD, + 0x43, 0x73, 0xCC, 0x87, 0xCD, 0x44, 0x20, 0xE3, + 0x82, 0x99, 0x11, 0x44, 0x20, 0xE3, 0x82, 0x9A, + 0x11, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, 0x44, + 0xCE, 0x91, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x95, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x97, 0xCC, 0x81, + // Bytes 4440 - 447f + 0xCD, 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0x9F, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, 0xCC, 0x88, + 0xCD, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB7, 0xCC, 0x81, + 0xCD, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x85, + // Bytes 4480 - 44bf + 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x89, 0xCC, 0x81, + 0xCD, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x35, 0x44, + 0xD7, 0x90, 0xD6, 0xB8, 0x39, 0x44, 0xD7, 0x90, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x92, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x93, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x94, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x3D, 0x44, + // Bytes 44c0 - 44ff + 0xD7, 0x95, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x96, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x98, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x29, 0x44, + 0xD7, 0x99, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9A, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x9C, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9E, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, + // Bytes 4500 - 453f + 0x45, 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA3, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, + 0x4D, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA7, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA8, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x51, 0x44, + 0xD7, 0xA9, 0xD7, 0x82, 0x55, 0x44, 0xD7, 0xAA, + // Bytes 4540 - 457f + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, + 0x35, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x5D, 0x44, + 0xD8, 0xA7, 0xD9, 0x93, 0xCD, 0x44, 0xD8, 0xA7, + 0xD9, 0x94, 0xCD, 0x44, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x7D, 0x44, + 0xD8, 0xB1, 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x80, + 0xD9, 0x8B, 0x5D, 0x44, 0xD9, 0x80, 0xD9, 0x8E, + 0x69, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x6D, 0x44, + // Bytes 4580 - 45bf + 0xD9, 0x80, 0xD9, 0x90, 0x71, 0x44, 0xD9, 0x80, + 0xD9, 0x91, 0x75, 0x44, 0xD9, 0x80, 0xD9, 0x92, + 0x79, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x7D, 0x44, + 0xD9, 0x88, 0xD9, 0x94, 0xCD, 0x44, 0xD9, 0x89, + 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x8A, 0xD9, 0x94, + 0xCD, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xCD, 0x44, + 0xDB, 0x95, 0xD9, 0x94, 0xCD, 0x45, 0x20, 0xCC, + 0x88, 0xCC, 0x80, 0xCE, 0x45, 0x20, 0xCC, 0x88, + // Bytes 45c0 - 45ff + 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, 0x88, 0xCD, + 0x82, 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCE, + 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x45, + 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x45, 0x20, + 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, + 0x94, 0xCD, 0x82, 0xCE, 0x45, 0x20, 0xD9, 0x8C, + 0xD9, 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8D, 0xD9, + // Bytes 4600 - 463f + 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, + 0x76, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x76, + 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x45, + 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7E, 0x45, 0xE2, + 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xCF, 0x85, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xD7, 0xA9, + 0xD6, 0xBC, 0xD7, 0x81, 0x52, 0x46, 0xD7, 0xA9, + // Bytes 4640 - 467f + 0xD6, 0xBC, 0xD7, 0x82, 0x56, 0x46, 0xD9, 0x80, + 0xD9, 0x8E, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x8F, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x46, 0xE0, 0xA4, + 0x95, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x96, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x97, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x9C, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + // Bytes 4680 - 46bf + 0xA1, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xA2, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAB, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAF, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA1, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA2, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xAF, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x96, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + // Bytes 46c0 - 46ff + 0x97, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x9C, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xAB, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB2, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB8, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA1, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA2, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE0, 0xBE, + // Bytes 4700 - 473f + 0xB3, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE3, 0x83, + 0x86, 0xE3, 0x82, 0x99, 0x11, 0x48, 0xF0, 0x9D, + 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x48, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xBA, + 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x49, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, + // Bytes 4740 - 477f + 0x49, 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, + 0xBE, 0x80, 0xA2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, + 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xB0, 0xB2, 0x4C, 0xF0, 0x9D, + 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + // Bytes 4780 - 47bf + 0x85, 0xB1, 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, + 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xB2, 0x4C, + 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, 0xF0, 0x9D, + 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + 0x85, 0xAE, 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, + // Bytes 47c0 - 47ff + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, + 0xB2, 0x83, 0x41, 0xCC, 0x82, 0xCD, 0x83, 0x41, + 0xCC, 0x86, 0xCD, 0x83, 0x41, 0xCC, 0x87, 0xCD, + 0x83, 0x41, 0xCC, 0x88, 0xCD, 0x83, 0x41, 0xCC, + 0x8A, 0xCD, 0x83, 0x41, 0xCC, 0xA3, 0xB9, 0x83, + 0x43, 0xCC, 0xA7, 0xA9, 0x83, 0x45, 0xCC, 0x82, + 0xCD, 0x83, 0x45, 0xCC, 0x84, 0xCD, 0x83, 0x45, + 0xCC, 0xA3, 0xB9, 0x83, 0x45, 0xCC, 0xA7, 0xA9, + // Bytes 4800 - 483f + 0x83, 0x49, 0xCC, 0x88, 0xCD, 0x83, 0x4C, 0xCC, + 0xA3, 0xB9, 0x83, 0x4F, 0xCC, 0x82, 0xCD, 0x83, + 0x4F, 0xCC, 0x83, 0xCD, 0x83, 0x4F, 0xCC, 0x84, + 0xCD, 0x83, 0x4F, 0xCC, 0x87, 0xCD, 0x83, 0x4F, + 0xCC, 0x88, 0xCD, 0x83, 0x4F, 0xCC, 0x9B, 0xB1, + 0x83, 0x4F, 0xCC, 0xA3, 0xB9, 0x83, 0x4F, 0xCC, + 0xA8, 0xA9, 0x83, 0x52, 0xCC, 0xA3, 0xB9, 0x83, + 0x53, 0xCC, 0x81, 0xCD, 0x83, 0x53, 0xCC, 0x8C, + // Bytes 4840 - 487f + 0xCD, 0x83, 0x53, 0xCC, 0xA3, 0xB9, 0x83, 0x55, + 0xCC, 0x83, 0xCD, 0x83, 0x55, 0xCC, 0x84, 0xCD, + 0x83, 0x55, 0xCC, 0x88, 0xCD, 0x83, 0x55, 0xCC, + 0x9B, 0xB1, 0x83, 0x61, 0xCC, 0x82, 0xCD, 0x83, + 0x61, 0xCC, 0x86, 0xCD, 0x83, 0x61, 0xCC, 0x87, + 0xCD, 0x83, 0x61, 0xCC, 0x88, 0xCD, 0x83, 0x61, + 0xCC, 0x8A, 0xCD, 0x83, 0x61, 0xCC, 0xA3, 0xB9, + 0x83, 0x63, 0xCC, 0xA7, 0xA9, 0x83, 0x65, 0xCC, + // Bytes 4880 - 48bf + 0x82, 0xCD, 0x83, 0x65, 0xCC, 0x84, 0xCD, 0x83, + 0x65, 0xCC, 0xA3, 0xB9, 0x83, 0x65, 0xCC, 0xA7, + 0xA9, 0x83, 0x69, 0xCC, 0x88, 0xCD, 0x83, 0x6C, + 0xCC, 0xA3, 0xB9, 0x83, 0x6F, 0xCC, 0x82, 0xCD, + 0x83, 0x6F, 0xCC, 0x83, 0xCD, 0x83, 0x6F, 0xCC, + 0x84, 0xCD, 0x83, 0x6F, 0xCC, 0x87, 0xCD, 0x83, + 0x6F, 0xCC, 0x88, 0xCD, 0x83, 0x6F, 0xCC, 0x9B, + 0xB1, 0x83, 0x6F, 0xCC, 0xA3, 0xB9, 0x83, 0x6F, + // Bytes 48c0 - 48ff + 0xCC, 0xA8, 0xA9, 0x83, 0x72, 0xCC, 0xA3, 0xB9, + 0x83, 0x73, 0xCC, 0x81, 0xCD, 0x83, 0x73, 0xCC, + 0x8C, 0xCD, 0x83, 0x73, 0xCC, 0xA3, 0xB9, 0x83, + 0x75, 0xCC, 0x83, 0xCD, 0x83, 0x75, 0xCC, 0x84, + 0xCD, 0x83, 0x75, 0xCC, 0x88, 0xCD, 0x83, 0x75, + 0xCC, 0x9B, 0xB1, 0x84, 0xCE, 0x91, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x95, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x95, + // Bytes 4900 - 493f + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x99, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xA9, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x84, + // Bytes 4940 - 497f + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x84, 0xCE, 0xB1, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x84, + 0xCE, 0xB5, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB5, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x80, + 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x84, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB7, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCD, 0x82, + // Bytes 4980 - 49bf + 0xCD, 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x84, + 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB9, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xCD, 0x84, + 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x84, 0xCF, 0x85, + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x85, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x84, + 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x84, 0xCF, 0x89, + // Bytes 49c0 - 49ff + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4a00 - 4a3f + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + // Bytes 4a40 - 4a7f + 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + // Bytes 4a80 - 4abf + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4ac0 - 4aff + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x42, + 0xCC, 0x80, 0xCD, 0x33, 0x42, 0xCC, 0x81, 0xCD, + 0x33, 0x42, 0xCC, 0x93, 0xCD, 0x33, 0x43, 0xE1, + // Bytes 4b00 - 4b3f + 0x85, 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, + // Bytes 4b40 - 4b7f + 0x43, 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, + // Bytes 4b80 - 4bbf + 0x01, 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, 0xCE, + 0x33, 0x43, 0xE3, 0x82, 0x99, 0x11, 0x04, 0x43, + // Bytes 4bc0 - 4bff + 0xE3, 0x82, 0x9A, 0x11, 0x04, 0x46, 0xE0, 0xBD, + 0xB1, 0xE0, 0xBD, 0xB2, 0xA2, 0x27, 0x46, 0xE0, + 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA6, 0x27, 0x46, + 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, 0x27, + 0x00, 0x01, +} + +// 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 *nfcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[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 := nfcIndex[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 := nfcIndex[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 = nfcIndex[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 := nfcIndex[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 = nfcIndex[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 = nfcIndex[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 *nfcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[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 *nfcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[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 := nfcIndex[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 := nfcIndex[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 = nfcIndex[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 := nfcIndex[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 = nfcIndex[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 = nfcIndex[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 *nfcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfcTrie. Total size: 10798 bytes (10.54 KiB). Checksum: b5981cc85e3bd14. +type nfcTrie struct{} + +func newNfcTrie(i int) *nfcTrie { + return &nfcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 46: + return uint16(nfcValues[n<<6+uint32(b)]) + default: + n -= 46 + return uint16(nfcSparse.lookup(n, b)) + } +} + +// nfcValues: 48 blocks, 3072 entries, 6144 bytes +// The third block is the zero block. +var nfcValues = [3072]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, + // Block 0x5, offset 0x140 + 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0xa000, + // Block 0x6, offset 0x180 + 0x184: 0x8100, 0x185: 0x8100, + 0x186: 0x8100, + 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x8100, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x8100, 0x285: 0x36e2, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x3862, 0x2c1: 0x386e, 0x2c3: 0x385c, + 0x2c6: 0xa000, 0x2c7: 0x384a, + 0x2cc: 0x389e, 0x2cd: 0x3886, 0x2ce: 0x38b0, 0x2d0: 0xa000, + 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, + 0x2d8: 0xa000, 0x2d9: 0x3892, 0x2da: 0xa000, + 0x2de: 0xa000, 0x2e3: 0xa000, + 0x2e7: 0xa000, + 0x2eb: 0xa000, 0x2ed: 0xa000, + 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, + 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x3916, 0x2fa: 0xa000, + 0x2fe: 0xa000, + // Block 0xc, offset 0x300 + 0x301: 0x3874, 0x302: 0x38f8, + 0x310: 0x3850, 0x311: 0x38d4, + 0x312: 0x3856, 0x313: 0x38da, 0x316: 0x3868, 0x317: 0x38ec, + 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x396a, 0x31b: 0x3970, 0x31c: 0x387a, 0x31d: 0x38fe, + 0x31e: 0x3880, 0x31f: 0x3904, 0x322: 0x388c, 0x323: 0x3910, + 0x324: 0x3898, 0x325: 0x391c, 0x326: 0x38a4, 0x327: 0x3928, 0x328: 0xa000, 0x329: 0xa000, + 0x32a: 0x3976, 0x32b: 0x397c, 0x32c: 0x38ce, 0x32d: 0x3952, 0x32e: 0x38aa, 0x32f: 0x392e, + 0x330: 0x38b6, 0x331: 0x393a, 0x332: 0x38bc, 0x333: 0x3940, 0x334: 0x38c2, 0x335: 0x3946, + 0x338: 0x38c8, 0x339: 0x394c, + // Block 0xd, offset 0x340 + 0x351: 0x812e, + 0x352: 0x8133, 0x353: 0x8133, 0x354: 0x8133, 0x355: 0x8133, 0x356: 0x812e, 0x357: 0x8133, + 0x358: 0x8133, 0x359: 0x8133, 0x35a: 0x812f, 0x35b: 0x812e, 0x35c: 0x8133, 0x35d: 0x8133, + 0x35e: 0x8133, 0x35f: 0x8133, 0x360: 0x8133, 0x361: 0x8133, 0x362: 0x812e, 0x363: 0x812e, + 0x364: 0x812e, 0x365: 0x812e, 0x366: 0x812e, 0x367: 0x812e, 0x368: 0x8133, 0x369: 0x8133, + 0x36a: 0x812e, 0x36b: 0x8133, 0x36c: 0x8133, 0x36d: 0x812f, 0x36e: 0x8132, 0x36f: 0x8133, + 0x370: 0x8106, 0x371: 0x8107, 0x372: 0x8108, 0x373: 0x8109, 0x374: 0x810a, 0x375: 0x810b, + 0x376: 0x810c, 0x377: 0x810d, 0x378: 0x810e, 0x379: 0x810f, 0x37a: 0x810f, 0x37b: 0x8110, + 0x37c: 0x8111, 0x37d: 0x8112, 0x37f: 0x8113, + // Block 0xe, offset 0x380 + 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8117, + 0x38c: 0x8118, 0x38d: 0x8119, 0x38e: 0x811a, 0x38f: 0x811b, 0x390: 0x811c, 0x391: 0x811d, + 0x392: 0x811e, 0x393: 0x9933, 0x394: 0x9933, 0x395: 0x992e, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x8133, 0x39b: 0x8133, 0x39c: 0x812e, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x812e, + 0x3b0: 0x811f, + // Block 0xf, offset 0x3c0 + 0x3ca: 0x8133, 0x3cb: 0x8133, + 0x3cc: 0x8133, 0x3cd: 0x8133, 0x3ce: 0x8133, 0x3cf: 0x812e, 0x3d0: 0x812e, 0x3d1: 0x812e, + 0x3d2: 0x812e, 0x3d3: 0x812e, 0x3d4: 0x8133, 0x3d5: 0x8133, 0x3d6: 0x8133, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x8133, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x8133, 0x3e0: 0x8133, 0x3e1: 0x8133, 0x3e3: 0x812e, + 0x3e4: 0x8133, 0x3e5: 0x8133, 0x3e6: 0x812e, 0x3e7: 0x8133, 0x3e8: 0x8133, 0x3e9: 0x812e, + 0x3ea: 0x8133, 0x3eb: 0x8133, 0x3ec: 0x8133, 0x3ed: 0x812e, 0x3ee: 0x812e, 0x3ef: 0x812e, + 0x3f0: 0x8117, 0x3f1: 0x8118, 0x3f2: 0x8119, 0x3f3: 0x8133, 0x3f4: 0x8133, 0x3f5: 0x8133, + 0x3f6: 0x812e, 0x3f7: 0x8133, 0x3f8: 0x8133, 0x3f9: 0x812e, 0x3fa: 0x812e, 0x3fb: 0x8133, + 0x3fc: 0x8133, 0x3fd: 0x8133, 0x3fe: 0x8133, 0x3ff: 0x8133, + // Block 0x10, offset 0x400 + 0x405: 0xa000, + 0x406: 0x2e5d, 0x407: 0xa000, 0x408: 0x2e65, 0x409: 0xa000, 0x40a: 0x2e6d, 0x40b: 0xa000, + 0x40c: 0x2e75, 0x40d: 0xa000, 0x40e: 0x2e7d, 0x411: 0xa000, + 0x412: 0x2e85, + 0x434: 0x8103, 0x435: 0x9900, + 0x43a: 0xa000, 0x43b: 0x2e8d, + 0x43c: 0xa000, 0x43d: 0x2e95, 0x43e: 0xa000, 0x43f: 0xa000, + // Block 0x11, offset 0x440 + 0x440: 0x8133, 0x441: 0x8133, 0x442: 0x812e, 0x443: 0x8133, 0x444: 0x8133, 0x445: 0x8133, + 0x446: 0x8133, 0x447: 0x8133, 0x448: 0x8133, 0x449: 0x8133, 0x44a: 0x812e, 0x44b: 0x8133, + 0x44c: 0x8133, 0x44d: 0x8136, 0x44e: 0x812b, 0x44f: 0x812e, 0x450: 0x812a, 0x451: 0x8133, + 0x452: 0x8133, 0x453: 0x8133, 0x454: 0x8133, 0x455: 0x8133, 0x456: 0x8133, 0x457: 0x8133, + 0x458: 0x8133, 0x459: 0x8133, 0x45a: 0x8133, 0x45b: 0x8133, 0x45c: 0x8133, 0x45d: 0x8133, + 0x45e: 0x8133, 0x45f: 0x8133, 0x460: 0x8133, 0x461: 0x8133, 0x462: 0x8133, 0x463: 0x8133, + 0x464: 0x8133, 0x465: 0x8133, 0x466: 0x8133, 0x467: 0x8133, 0x468: 0x8133, 0x469: 0x8133, + 0x46a: 0x8133, 0x46b: 0x8133, 0x46c: 0x8133, 0x46d: 0x8133, 0x46e: 0x8133, 0x46f: 0x8133, + 0x470: 0x8133, 0x471: 0x8133, 0x472: 0x8133, 0x473: 0x8133, 0x474: 0x8133, 0x475: 0x8133, + 0x476: 0x8134, 0x477: 0x8132, 0x478: 0x8132, 0x479: 0x812e, 0x47a: 0x812d, 0x47b: 0x8133, + 0x47c: 0x8135, 0x47d: 0x812e, 0x47e: 0x8133, 0x47f: 0x812e, + // Block 0x12, offset 0x480 + 0x480: 0x30d8, 0x481: 0x33e4, 0x482: 0x30e2, 0x483: 0x33ee, 0x484: 0x30e7, 0x485: 0x33f3, + 0x486: 0x30ec, 0x487: 0x33f8, 0x488: 0x3a0d, 0x489: 0x3b9c, 0x48a: 0x3105, 0x48b: 0x3411, + 0x48c: 0x310f, 0x48d: 0x341b, 0x48e: 0x311e, 0x48f: 0x342a, 0x490: 0x3114, 0x491: 0x3420, + 0x492: 0x3119, 0x493: 0x3425, 0x494: 0x3a30, 0x495: 0x3bbf, 0x496: 0x3a37, 0x497: 0x3bc6, + 0x498: 0x315a, 0x499: 0x3466, 0x49a: 0x315f, 0x49b: 0x346b, 0x49c: 0x3a45, 0x49d: 0x3bd4, + 0x49e: 0x3164, 0x49f: 0x3470, 0x4a0: 0x3173, 0x4a1: 0x347f, 0x4a2: 0x3191, 0x4a3: 0x349d, + 0x4a4: 0x31a0, 0x4a5: 0x34ac, 0x4a6: 0x3196, 0x4a7: 0x34a2, 0x4a8: 0x31a5, 0x4a9: 0x34b1, + 0x4aa: 0x31aa, 0x4ab: 0x34b6, 0x4ac: 0x31f0, 0x4ad: 0x34fc, 0x4ae: 0x3a4c, 0x4af: 0x3bdb, + 0x4b0: 0x31fa, 0x4b1: 0x350b, 0x4b2: 0x3204, 0x4b3: 0x3515, 0x4b4: 0x320e, 0x4b5: 0x351f, + 0x4b6: 0x4805, 0x4b7: 0x4896, 0x4b8: 0x3a53, 0x4b9: 0x3be2, 0x4ba: 0x3227, 0x4bb: 0x3538, + 0x4bc: 0x3222, 0x4bd: 0x3533, 0x4be: 0x322c, 0x4bf: 0x353d, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x3231, 0x4c1: 0x3542, 0x4c2: 0x3236, 0x4c3: 0x3547, 0x4c4: 0x324a, 0x4c5: 0x355b, + 0x4c6: 0x3254, 0x4c7: 0x3565, 0x4c8: 0x3263, 0x4c9: 0x3574, 0x4ca: 0x325e, 0x4cb: 0x356f, + 0x4cc: 0x3a76, 0x4cd: 0x3c05, 0x4ce: 0x3a84, 0x4cf: 0x3c13, 0x4d0: 0x3a8b, 0x4d1: 0x3c1a, + 0x4d2: 0x3a92, 0x4d3: 0x3c21, 0x4d4: 0x3290, 0x4d5: 0x35a1, 0x4d6: 0x3295, 0x4d7: 0x35a6, + 0x4d8: 0x329f, 0x4d9: 0x35b0, 0x4da: 0x4832, 0x4db: 0x48c3, 0x4dc: 0x3ad8, 0x4dd: 0x3c67, + 0x4de: 0x32b8, 0x4df: 0x35c9, 0x4e0: 0x32c2, 0x4e1: 0x35d3, 0x4e2: 0x4841, 0x4e3: 0x48d2, + 0x4e4: 0x3adf, 0x4e5: 0x3c6e, 0x4e6: 0x3ae6, 0x4e7: 0x3c75, 0x4e8: 0x3aed, 0x4e9: 0x3c7c, + 0x4ea: 0x32d1, 0x4eb: 0x35e2, 0x4ec: 0x32db, 0x4ed: 0x35f1, 0x4ee: 0x32ef, 0x4ef: 0x3605, + 0x4f0: 0x32ea, 0x4f1: 0x3600, 0x4f2: 0x332b, 0x4f3: 0x3641, 0x4f4: 0x333a, 0x4f5: 0x3650, + 0x4f6: 0x3335, 0x4f7: 0x364b, 0x4f8: 0x3af4, 0x4f9: 0x3c83, 0x4fa: 0x3afb, 0x4fb: 0x3c8a, + 0x4fc: 0x333f, 0x4fd: 0x3655, 0x4fe: 0x3344, 0x4ff: 0x365a, + // Block 0x14, offset 0x500 + 0x500: 0x3349, 0x501: 0x365f, 0x502: 0x334e, 0x503: 0x3664, 0x504: 0x335d, 0x505: 0x3673, + 0x506: 0x3358, 0x507: 0x366e, 0x508: 0x3362, 0x509: 0x367d, 0x50a: 0x3367, 0x50b: 0x3682, + 0x50c: 0x336c, 0x50d: 0x3687, 0x50e: 0x338a, 0x50f: 0x36a5, 0x510: 0x33a3, 0x511: 0x36c3, + 0x512: 0x33b2, 0x513: 0x36d2, 0x514: 0x33b7, 0x515: 0x36d7, 0x516: 0x34bb, 0x517: 0x35e7, + 0x518: 0x3678, 0x519: 0x36b4, 0x51b: 0x3712, + 0x520: 0x47e2, 0x521: 0x4873, 0x522: 0x30c4, 0x523: 0x33d0, + 0x524: 0x39b9, 0x525: 0x3b48, 0x526: 0x39b2, 0x527: 0x3b41, 0x528: 0x39c7, 0x529: 0x3b56, + 0x52a: 0x39c0, 0x52b: 0x3b4f, 0x52c: 0x39ff, 0x52d: 0x3b8e, 0x52e: 0x39d5, 0x52f: 0x3b64, + 0x530: 0x39ce, 0x531: 0x3b5d, 0x532: 0x39e3, 0x533: 0x3b72, 0x534: 0x39dc, 0x535: 0x3b6b, + 0x536: 0x3a06, 0x537: 0x3b95, 0x538: 0x47f6, 0x539: 0x4887, 0x53a: 0x3141, 0x53b: 0x344d, + 0x53c: 0x312d, 0x53d: 0x3439, 0x53e: 0x3a1b, 0x53f: 0x3baa, + // Block 0x15, offset 0x540 + 0x540: 0x3a14, 0x541: 0x3ba3, 0x542: 0x3a29, 0x543: 0x3bb8, 0x544: 0x3a22, 0x545: 0x3bb1, + 0x546: 0x3a3e, 0x547: 0x3bcd, 0x548: 0x31d2, 0x549: 0x34de, 0x54a: 0x31e6, 0x54b: 0x34f2, + 0x54c: 0x4828, 0x54d: 0x48b9, 0x54e: 0x3277, 0x54f: 0x3588, 0x550: 0x3a61, 0x551: 0x3bf0, + 0x552: 0x3a5a, 0x553: 0x3be9, 0x554: 0x3a6f, 0x555: 0x3bfe, 0x556: 0x3a68, 0x557: 0x3bf7, + 0x558: 0x3aca, 0x559: 0x3c59, 0x55a: 0x3aae, 0x55b: 0x3c3d, 0x55c: 0x3aa7, 0x55d: 0x3c36, + 0x55e: 0x3abc, 0x55f: 0x3c4b, 0x560: 0x3ab5, 0x561: 0x3c44, 0x562: 0x3ac3, 0x563: 0x3c52, + 0x564: 0x3326, 0x565: 0x363c, 0x566: 0x3308, 0x567: 0x361e, 0x568: 0x3b25, 0x569: 0x3cb4, + 0x56a: 0x3b1e, 0x56b: 0x3cad, 0x56c: 0x3b33, 0x56d: 0x3cc2, 0x56e: 0x3b2c, 0x56f: 0x3cbb, + 0x570: 0x3b3a, 0x571: 0x3cc9, 0x572: 0x3371, 0x573: 0x368c, 0x574: 0x3399, 0x575: 0x36b9, + 0x576: 0x3394, 0x577: 0x36af, 0x578: 0x3380, 0x579: 0x369b, + // Block 0x16, offset 0x580 + 0x580: 0x4945, 0x581: 0x494b, 0x582: 0x4a5f, 0x583: 0x4a77, 0x584: 0x4a67, 0x585: 0x4a7f, + 0x586: 0x4a6f, 0x587: 0x4a87, 0x588: 0x48eb, 0x589: 0x48f1, 0x58a: 0x49cf, 0x58b: 0x49e7, + 0x58c: 0x49d7, 0x58d: 0x49ef, 0x58e: 0x49df, 0x58f: 0x49f7, 0x590: 0x4957, 0x591: 0x495d, + 0x592: 0x3ef9, 0x593: 0x3f09, 0x594: 0x3f01, 0x595: 0x3f11, + 0x598: 0x48f7, 0x599: 0x48fd, 0x59a: 0x3e29, 0x59b: 0x3e39, 0x59c: 0x3e31, 0x59d: 0x3e41, + 0x5a0: 0x496f, 0x5a1: 0x4975, 0x5a2: 0x4a8f, 0x5a3: 0x4aa7, + 0x5a4: 0x4a97, 0x5a5: 0x4aaf, 0x5a6: 0x4a9f, 0x5a7: 0x4ab7, 0x5a8: 0x4903, 0x5a9: 0x4909, + 0x5aa: 0x49ff, 0x5ab: 0x4a17, 0x5ac: 0x4a07, 0x5ad: 0x4a1f, 0x5ae: 0x4a0f, 0x5af: 0x4a27, + 0x5b0: 0x4987, 0x5b1: 0x498d, 0x5b2: 0x3f59, 0x5b3: 0x3f71, 0x5b4: 0x3f61, 0x5b5: 0x3f79, + 0x5b6: 0x3f69, 0x5b7: 0x3f81, 0x5b8: 0x490f, 0x5b9: 0x4915, 0x5ba: 0x3e59, 0x5bb: 0x3e71, + 0x5bc: 0x3e61, 0x5bd: 0x3e79, 0x5be: 0x3e69, 0x5bf: 0x3e81, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x4993, 0x5c1: 0x4999, 0x5c2: 0x3f89, 0x5c3: 0x3f99, 0x5c4: 0x3f91, 0x5c5: 0x3fa1, + 0x5c8: 0x491b, 0x5c9: 0x4921, 0x5ca: 0x3e89, 0x5cb: 0x3e99, + 0x5cc: 0x3e91, 0x5cd: 0x3ea1, 0x5d0: 0x49a5, 0x5d1: 0x49ab, + 0x5d2: 0x3fc1, 0x5d3: 0x3fd9, 0x5d4: 0x3fc9, 0x5d5: 0x3fe1, 0x5d6: 0x3fd1, 0x5d7: 0x3fe9, + 0x5d9: 0x4927, 0x5db: 0x3ea9, 0x5dd: 0x3eb1, + 0x5df: 0x3eb9, 0x5e0: 0x49bd, 0x5e1: 0x49c3, 0x5e2: 0x4abf, 0x5e3: 0x4ad7, + 0x5e4: 0x4ac7, 0x5e5: 0x4adf, 0x5e6: 0x4acf, 0x5e7: 0x4ae7, 0x5e8: 0x492d, 0x5e9: 0x4933, + 0x5ea: 0x4a2f, 0x5eb: 0x4a47, 0x5ec: 0x4a37, 0x5ed: 0x4a4f, 0x5ee: 0x4a3f, 0x5ef: 0x4a57, + 0x5f0: 0x4939, 0x5f1: 0x445f, 0x5f2: 0x37d2, 0x5f3: 0x4465, 0x5f4: 0x4963, 0x5f5: 0x446b, + 0x5f6: 0x37e4, 0x5f7: 0x4471, 0x5f8: 0x3802, 0x5f9: 0x4477, 0x5fa: 0x381a, 0x5fb: 0x447d, + 0x5fc: 0x49b1, 0x5fd: 0x4483, + // Block 0x18, offset 0x600 + 0x600: 0x3ee1, 0x601: 0x3ee9, 0x602: 0x42c5, 0x603: 0x42e3, 0x604: 0x42cf, 0x605: 0x42ed, + 0x606: 0x42d9, 0x607: 0x42f7, 0x608: 0x3e19, 0x609: 0x3e21, 0x60a: 0x4211, 0x60b: 0x422f, + 0x60c: 0x421b, 0x60d: 0x4239, 0x60e: 0x4225, 0x60f: 0x4243, 0x610: 0x3f29, 0x611: 0x3f31, + 0x612: 0x4301, 0x613: 0x431f, 0x614: 0x430b, 0x615: 0x4329, 0x616: 0x4315, 0x617: 0x4333, + 0x618: 0x3e49, 0x619: 0x3e51, 0x61a: 0x424d, 0x61b: 0x426b, 0x61c: 0x4257, 0x61d: 0x4275, + 0x61e: 0x4261, 0x61f: 0x427f, 0x620: 0x4001, 0x621: 0x4009, 0x622: 0x433d, 0x623: 0x435b, + 0x624: 0x4347, 0x625: 0x4365, 0x626: 0x4351, 0x627: 0x436f, 0x628: 0x3ec1, 0x629: 0x3ec9, + 0x62a: 0x4289, 0x62b: 0x42a7, 0x62c: 0x4293, 0x62d: 0x42b1, 0x62e: 0x429d, 0x62f: 0x42bb, + 0x630: 0x37c6, 0x631: 0x37c0, 0x632: 0x3ed1, 0x633: 0x37cc, 0x634: 0x3ed9, + 0x636: 0x4951, 0x637: 0x3ef1, 0x638: 0x3736, 0x639: 0x3730, 0x63a: 0x3724, 0x63b: 0x442f, + 0x63c: 0x373c, 0x63d: 0x8100, 0x63e: 0x0257, 0x63f: 0xa100, + // Block 0x19, offset 0x640 + 0x640: 0x8100, 0x641: 0x36e8, 0x642: 0x3f19, 0x643: 0x37de, 0x644: 0x3f21, + 0x646: 0x497b, 0x647: 0x3f39, 0x648: 0x3742, 0x649: 0x4435, 0x64a: 0x374e, 0x64b: 0x443b, + 0x64c: 0x375a, 0x64d: 0x3cd0, 0x64e: 0x3cd7, 0x64f: 0x3cde, 0x650: 0x37f6, 0x651: 0x37f0, + 0x652: 0x3f41, 0x653: 0x4625, 0x656: 0x37fc, 0x657: 0x3f51, + 0x658: 0x3772, 0x659: 0x376c, 0x65a: 0x3760, 0x65b: 0x4441, 0x65d: 0x3ce5, + 0x65e: 0x3cec, 0x65f: 0x3cf3, 0x660: 0x382c, 0x661: 0x3826, 0x662: 0x3fa9, 0x663: 0x462d, + 0x664: 0x380e, 0x665: 0x3814, 0x666: 0x3832, 0x667: 0x3fb9, 0x668: 0x37a2, 0x669: 0x379c, + 0x66a: 0x3790, 0x66b: 0x444d, 0x66c: 0x378a, 0x66d: 0x36dc, 0x66e: 0x4429, 0x66f: 0x0081, + 0x672: 0x3ff1, 0x673: 0x3838, 0x674: 0x3ff9, + 0x676: 0x49c9, 0x677: 0x4011, 0x678: 0x377e, 0x679: 0x4447, 0x67a: 0x37ae, 0x67b: 0x4459, + 0x67c: 0x37ba, 0x67d: 0x4397, 0x67e: 0xa100, + // Block 0x1a, offset 0x680 + 0x681: 0x3d47, 0x683: 0xa000, 0x684: 0x3d4e, 0x685: 0xa000, + 0x687: 0x3d55, 0x688: 0xa000, 0x689: 0x3d5c, + 0x68d: 0xa000, + 0x6a0: 0x30a6, 0x6a1: 0xa000, 0x6a2: 0x3d6a, + 0x6a4: 0xa000, 0x6a5: 0xa000, + 0x6ad: 0x3d63, 0x6ae: 0x30a1, 0x6af: 0x30ab, + 0x6b0: 0x3d71, 0x6b1: 0x3d78, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3d7f, 0x6b5: 0x3d86, + 0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3d8d, 0x6b9: 0x3d94, 0x6ba: 0xa000, 0x6bb: 0xa000, + 0x6bc: 0xa000, 0x6bd: 0xa000, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3d9b, 0x6c1: 0x3da2, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3db7, 0x6c5: 0x3dbe, + 0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3dc5, 0x6c9: 0x3dcc, + 0x6d1: 0xa000, + 0x6d2: 0xa000, + 0x6e2: 0xa000, + 0x6e8: 0xa000, 0x6e9: 0xa000, + 0x6eb: 0xa000, 0x6ec: 0x3de1, 0x6ed: 0x3de8, 0x6ee: 0x3def, 0x6ef: 0x3df6, + 0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000, + // Block 0x1c, offset 0x700 + 0x706: 0xa000, 0x70b: 0xa000, + 0x70c: 0x4049, 0x70d: 0xa000, 0x70e: 0x4051, 0x70f: 0xa000, 0x710: 0x4059, 0x711: 0xa000, + 0x712: 0x4061, 0x713: 0xa000, 0x714: 0x4069, 0x715: 0xa000, 0x716: 0x4071, 0x717: 0xa000, + 0x718: 0x4079, 0x719: 0xa000, 0x71a: 0x4081, 0x71b: 0xa000, 0x71c: 0x4089, 0x71d: 0xa000, + 0x71e: 0x4091, 0x71f: 0xa000, 0x720: 0x4099, 0x721: 0xa000, 0x722: 0x40a1, + 0x724: 0xa000, 0x725: 0x40a9, 0x726: 0xa000, 0x727: 0x40b1, 0x728: 0xa000, 0x729: 0x40b9, + 0x72f: 0xa000, + 0x730: 0x40c1, 0x731: 0x40c9, 0x732: 0xa000, 0x733: 0x40d1, 0x734: 0x40d9, 0x735: 0xa000, + 0x736: 0x40e1, 0x737: 0x40e9, 0x738: 0xa000, 0x739: 0x40f1, 0x73a: 0x40f9, 0x73b: 0xa000, + 0x73c: 0x4101, 0x73d: 0x4109, + // Block 0x1d, offset 0x740 + 0x754: 0x4041, + 0x759: 0x9904, 0x75a: 0x9904, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000, + 0x75e: 0x4111, + 0x766: 0xa000, + 0x76b: 0xa000, 0x76c: 0x4121, 0x76d: 0xa000, 0x76e: 0x4129, 0x76f: 0xa000, + 0x770: 0x4131, 0x771: 0xa000, 0x772: 0x4139, 0x773: 0xa000, 0x774: 0x4141, 0x775: 0xa000, + 0x776: 0x4149, 0x777: 0xa000, 0x778: 0x4151, 0x779: 0xa000, 0x77a: 0x4159, 0x77b: 0xa000, + 0x77c: 0x4161, 0x77d: 0xa000, 0x77e: 0x4169, 0x77f: 0xa000, + // Block 0x1e, offset 0x780 + 0x780: 0x4171, 0x781: 0xa000, 0x782: 0x4179, 0x784: 0xa000, 0x785: 0x4181, + 0x786: 0xa000, 0x787: 0x4189, 0x788: 0xa000, 0x789: 0x4191, + 0x78f: 0xa000, 0x790: 0x4199, 0x791: 0x41a1, + 0x792: 0xa000, 0x793: 0x41a9, 0x794: 0x41b1, 0x795: 0xa000, 0x796: 0x41b9, 0x797: 0x41c1, + 0x798: 0xa000, 0x799: 0x41c9, 0x79a: 0x41d1, 0x79b: 0xa000, 0x79c: 0x41d9, 0x79d: 0x41e1, + 0x7af: 0xa000, + 0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x4119, + 0x7b7: 0x41e9, 0x7b8: 0x41f1, 0x7b9: 0x41f9, 0x7ba: 0x4201, + 0x7bd: 0xa000, 0x7be: 0x4209, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x1472, 0x7c1: 0x0df6, 0x7c2: 0x14ce, 0x7c3: 0x149a, 0x7c4: 0x0f52, 0x7c5: 0x07e6, + 0x7c6: 0x09da, 0x7c7: 0x1726, 0x7c8: 0x1726, 0x7c9: 0x0b06, 0x7ca: 0x155a, 0x7cb: 0x0a3e, + 0x7cc: 0x0b02, 0x7cd: 0x0cea, 0x7ce: 0x10ca, 0x7cf: 0x125a, 0x7d0: 0x1392, 0x7d1: 0x13ce, + 0x7d2: 0x1402, 0x7d3: 0x1516, 0x7d4: 0x0e6e, 0x7d5: 0x0efa, 0x7d6: 0x0fa6, 0x7d7: 0x103e, + 0x7d8: 0x135a, 0x7d9: 0x1542, 0x7da: 0x166e, 0x7db: 0x080a, 0x7dc: 0x09ae, 0x7dd: 0x0e82, + 0x7de: 0x0fca, 0x7df: 0x138e, 0x7e0: 0x16be, 0x7e1: 0x0bae, 0x7e2: 0x0f72, 0x7e3: 0x137e, + 0x7e4: 0x1412, 0x7e5: 0x0d1e, 0x7e6: 0x12b6, 0x7e7: 0x13da, 0x7e8: 0x0c1a, 0x7e9: 0x0e0a, + 0x7ea: 0x0f12, 0x7eb: 0x1016, 0x7ec: 0x1522, 0x7ed: 0x084a, 0x7ee: 0x08e2, 0x7ef: 0x094e, + 0x7f0: 0x0d86, 0x7f1: 0x0e7a, 0x7f2: 0x0fc6, 0x7f3: 0x10ea, 0x7f4: 0x1272, 0x7f5: 0x1386, + 0x7f6: 0x139e, 0x7f7: 0x14c2, 0x7f8: 0x15ea, 0x7f9: 0x169e, 0x7fa: 0x16ba, 0x7fb: 0x1126, + 0x7fc: 0x1166, 0x7fd: 0x121e, 0x7fe: 0x133e, 0x7ff: 0x1576, + // Block 0x20, offset 0x800 + 0x800: 0x16c6, 0x801: 0x1446, 0x802: 0x0ac2, 0x803: 0x0c36, 0x804: 0x11d6, 0x805: 0x1296, + 0x806: 0x0ffa, 0x807: 0x112e, 0x808: 0x1492, 0x809: 0x15e2, 0x80a: 0x0abe, 0x80b: 0x0b8a, + 0x80c: 0x0e72, 0x80d: 0x0f26, 0x80e: 0x0f5a, 0x80f: 0x120e, 0x810: 0x1236, 0x811: 0x15a2, + 0x812: 0x094a, 0x813: 0x12a2, 0x814: 0x08ee, 0x815: 0x08ea, 0x816: 0x1192, 0x817: 0x1222, + 0x818: 0x1356, 0x819: 0x15aa, 0x81a: 0x1462, 0x81b: 0x0d22, 0x81c: 0x0e6e, 0x81d: 0x1452, + 0x81e: 0x07f2, 0x81f: 0x0b5e, 0x820: 0x0c8e, 0x821: 0x102a, 0x822: 0x10aa, 0x823: 0x096e, + 0x824: 0x1136, 0x825: 0x085a, 0x826: 0x0c72, 0x827: 0x07d2, 0x828: 0x0ee6, 0x829: 0x0d9e, + 0x82a: 0x120a, 0x82b: 0x09c2, 0x82c: 0x0aae, 0x82d: 0x10f6, 0x82e: 0x135e, 0x82f: 0x1436, + 0x830: 0x0eb2, 0x831: 0x14f2, 0x832: 0x0ede, 0x833: 0x0d32, 0x834: 0x1316, 0x835: 0x0d52, + 0x836: 0x10a6, 0x837: 0x0826, 0x838: 0x08a2, 0x839: 0x08e6, 0x83a: 0x0e4e, 0x83b: 0x11f6, + 0x83c: 0x12ee, 0x83d: 0x1442, 0x83e: 0x1556, 0x83f: 0x0956, + // Block 0x21, offset 0x840 + 0x840: 0x0a0a, 0x841: 0x0b12, 0x842: 0x0c2a, 0x843: 0x0dba, 0x844: 0x0f76, 0x845: 0x113a, + 0x846: 0x1592, 0x847: 0x1676, 0x848: 0x16ca, 0x849: 0x16e2, 0x84a: 0x0932, 0x84b: 0x0dee, + 0x84c: 0x0e9e, 0x84d: 0x14e6, 0x84e: 0x0bf6, 0x84f: 0x0cd2, 0x850: 0x0cee, 0x851: 0x0d7e, + 0x852: 0x0f66, 0x853: 0x0fb2, 0x854: 0x1062, 0x855: 0x1186, 0x856: 0x122a, 0x857: 0x128e, + 0x858: 0x14d6, 0x859: 0x1366, 0x85a: 0x14fe, 0x85b: 0x157a, 0x85c: 0x090a, 0x85d: 0x0936, + 0x85e: 0x0a1e, 0x85f: 0x0fa2, 0x860: 0x13ee, 0x861: 0x1436, 0x862: 0x0c16, 0x863: 0x0c86, + 0x864: 0x0d4a, 0x865: 0x0eaa, 0x866: 0x11d2, 0x867: 0x101e, 0x868: 0x0836, 0x869: 0x0a7a, + 0x86a: 0x0b5e, 0x86b: 0x0bc2, 0x86c: 0x0c92, 0x86d: 0x103a, 0x86e: 0x1056, 0x86f: 0x1266, + 0x870: 0x1286, 0x871: 0x155e, 0x872: 0x15de, 0x873: 0x15ee, 0x874: 0x162a, 0x875: 0x084e, + 0x876: 0x117a, 0x877: 0x154a, 0x878: 0x15c6, 0x879: 0x0caa, 0x87a: 0x0812, 0x87b: 0x0872, + 0x87c: 0x0b62, 0x87d: 0x0b82, 0x87e: 0x0daa, 0x87f: 0x0e6e, + // Block 0x22, offset 0x880 + 0x880: 0x0fbe, 0x881: 0x10c6, 0x882: 0x1372, 0x883: 0x1512, 0x884: 0x171e, 0x885: 0x0dde, + 0x886: 0x159e, 0x887: 0x092e, 0x888: 0x0e2a, 0x889: 0x0e36, 0x88a: 0x0f0a, 0x88b: 0x0f42, + 0x88c: 0x1046, 0x88d: 0x10a2, 0x88e: 0x1122, 0x88f: 0x1206, 0x890: 0x1636, 0x891: 0x08aa, + 0x892: 0x0cfe, 0x893: 0x15ae, 0x894: 0x0862, 0x895: 0x0ba6, 0x896: 0x0f2a, 0x897: 0x14da, + 0x898: 0x0c62, 0x899: 0x0cb2, 0x89a: 0x0e3e, 0x89b: 0x102a, 0x89c: 0x15b6, 0x89d: 0x0912, + 0x89e: 0x09fa, 0x89f: 0x0b92, 0x8a0: 0x0dce, 0x8a1: 0x0e1a, 0x8a2: 0x0e5a, 0x8a3: 0x0eee, + 0x8a4: 0x1042, 0x8a5: 0x10b6, 0x8a6: 0x1252, 0x8a7: 0x13f2, 0x8a8: 0x13fe, 0x8a9: 0x1552, + 0x8aa: 0x15d2, 0x8ab: 0x097e, 0x8ac: 0x0f46, 0x8ad: 0x09fe, 0x8ae: 0x0fc2, 0x8af: 0x1066, + 0x8b0: 0x1382, 0x8b1: 0x15ba, 0x8b2: 0x16a6, 0x8b3: 0x16ce, 0x8b4: 0x0e32, 0x8b5: 0x0f22, + 0x8b6: 0x12be, 0x8b7: 0x11b2, 0x8b8: 0x11be, 0x8b9: 0x11e2, 0x8ba: 0x1012, 0x8bb: 0x0f9a, + 0x8bc: 0x145e, 0x8bd: 0x082e, 0x8be: 0x1326, 0x8bf: 0x0916, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0906, 0x8c1: 0x0c06, 0x8c2: 0x0d26, 0x8c3: 0x11ee, 0x8c4: 0x0b4e, 0x8c5: 0x0efe, + 0x8c6: 0x0dea, 0x8c7: 0x14e2, 0x8c8: 0x13e2, 0x8c9: 0x15a6, 0x8ca: 0x141e, 0x8cb: 0x0c22, + 0x8cc: 0x0882, 0x8cd: 0x0a56, 0x8d0: 0x0aaa, + 0x8d2: 0x0dda, 0x8d5: 0x08f2, 0x8d6: 0x101a, 0x8d7: 0x10de, + 0x8d8: 0x1142, 0x8d9: 0x115e, 0x8da: 0x1162, 0x8db: 0x1176, 0x8dc: 0x15f6, 0x8dd: 0x11e6, + 0x8de: 0x126a, 0x8e0: 0x138a, 0x8e2: 0x144e, + 0x8e5: 0x1502, 0x8e6: 0x152e, + 0x8ea: 0x164a, 0x8eb: 0x164e, 0x8ec: 0x1652, 0x8ed: 0x16b6, 0x8ee: 0x1526, 0x8ef: 0x15c2, + 0x8f0: 0x0852, 0x8f1: 0x0876, 0x8f2: 0x088a, 0x8f3: 0x0946, 0x8f4: 0x0952, 0x8f5: 0x0992, + 0x8f6: 0x0a46, 0x8f7: 0x0a62, 0x8f8: 0x0a6a, 0x8f9: 0x0aa6, 0x8fa: 0x0ab2, 0x8fb: 0x0b8e, + 0x8fc: 0x0b96, 0x8fd: 0x0c9e, 0x8fe: 0x0cc6, 0x8ff: 0x0cce, + // Block 0x24, offset 0x900 + 0x900: 0x0ce6, 0x901: 0x0d92, 0x902: 0x0dc2, 0x903: 0x0de2, 0x904: 0x0e52, 0x905: 0x0f16, + 0x906: 0x0f32, 0x907: 0x0f62, 0x908: 0x0fb6, 0x909: 0x0fd6, 0x90a: 0x104a, 0x90b: 0x112a, + 0x90c: 0x1146, 0x90d: 0x114e, 0x90e: 0x114a, 0x90f: 0x1152, 0x910: 0x1156, 0x911: 0x115a, + 0x912: 0x116e, 0x913: 0x1172, 0x914: 0x1196, 0x915: 0x11aa, 0x916: 0x11c6, 0x917: 0x122a, + 0x918: 0x1232, 0x919: 0x123a, 0x91a: 0x124e, 0x91b: 0x1276, 0x91c: 0x12c6, 0x91d: 0x12fa, + 0x91e: 0x12fa, 0x91f: 0x1362, 0x920: 0x140a, 0x921: 0x1422, 0x922: 0x1456, 0x923: 0x145a, + 0x924: 0x149e, 0x925: 0x14a2, 0x926: 0x14fa, 0x927: 0x1502, 0x928: 0x15d6, 0x929: 0x161a, + 0x92a: 0x1632, 0x92b: 0x0c96, 0x92c: 0x184b, 0x92d: 0x12de, + 0x930: 0x07da, 0x931: 0x08de, 0x932: 0x089e, 0x933: 0x0846, 0x934: 0x0886, 0x935: 0x08b2, + 0x936: 0x0942, 0x937: 0x095e, 0x938: 0x0a46, 0x939: 0x0a32, 0x93a: 0x0a42, 0x93b: 0x0a5e, + 0x93c: 0x0aaa, 0x93d: 0x0aba, 0x93e: 0x0afe, 0x93f: 0x0b0a, + // Block 0x25, offset 0x940 + 0x940: 0x0b26, 0x941: 0x0b36, 0x942: 0x0c1e, 0x943: 0x0c26, 0x944: 0x0c56, 0x945: 0x0c76, + 0x946: 0x0ca6, 0x947: 0x0cbe, 0x948: 0x0cae, 0x949: 0x0cce, 0x94a: 0x0cc2, 0x94b: 0x0ce6, + 0x94c: 0x0d02, 0x94d: 0x0d5a, 0x94e: 0x0d66, 0x94f: 0x0d6e, 0x950: 0x0d96, 0x951: 0x0dda, + 0x952: 0x0e0a, 0x953: 0x0e0e, 0x954: 0x0e22, 0x955: 0x0ea2, 0x956: 0x0eb2, 0x957: 0x0f0a, + 0x958: 0x0f56, 0x959: 0x0f4e, 0x95a: 0x0f62, 0x95b: 0x0f7e, 0x95c: 0x0fb6, 0x95d: 0x110e, + 0x95e: 0x0fda, 0x95f: 0x100e, 0x960: 0x101a, 0x961: 0x105a, 0x962: 0x1076, 0x963: 0x109a, + 0x964: 0x10be, 0x965: 0x10c2, 0x966: 0x10de, 0x967: 0x10e2, 0x968: 0x10f2, 0x969: 0x1106, + 0x96a: 0x1102, 0x96b: 0x1132, 0x96c: 0x11ae, 0x96d: 0x11c6, 0x96e: 0x11de, 0x96f: 0x1216, + 0x970: 0x122a, 0x971: 0x1246, 0x972: 0x1276, 0x973: 0x132a, 0x974: 0x1352, 0x975: 0x13c6, + 0x976: 0x140e, 0x977: 0x141a, 0x978: 0x1422, 0x979: 0x143a, 0x97a: 0x144e, 0x97b: 0x143e, + 0x97c: 0x1456, 0x97d: 0x1452, 0x97e: 0x144a, 0x97f: 0x145a, + // Block 0x26, offset 0x980 + 0x980: 0x1466, 0x981: 0x14a2, 0x982: 0x14de, 0x983: 0x150e, 0x984: 0x1546, 0x985: 0x1566, + 0x986: 0x15b2, 0x987: 0x15d6, 0x988: 0x15f6, 0x989: 0x160a, 0x98a: 0x161a, 0x98b: 0x1626, + 0x98c: 0x1632, 0x98d: 0x1686, 0x98e: 0x1726, 0x98f: 0x17e2, 0x990: 0x17dd, 0x991: 0x180f, + 0x992: 0x0702, 0x993: 0x072a, 0x994: 0x072e, 0x995: 0x1891, 0x996: 0x18be, 0x997: 0x1936, + 0x998: 0x1712, 0x999: 0x1722, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x07f6, 0x9c1: 0x07ee, 0x9c2: 0x07fe, 0x9c3: 0x1774, 0x9c4: 0x0842, 0x9c5: 0x0852, + 0x9c6: 0x0856, 0x9c7: 0x085e, 0x9c8: 0x0866, 0x9c9: 0x086a, 0x9ca: 0x0876, 0x9cb: 0x086e, + 0x9cc: 0x06ae, 0x9cd: 0x1788, 0x9ce: 0x088a, 0x9cf: 0x088e, 0x9d0: 0x0892, 0x9d1: 0x08ae, + 0x9d2: 0x1779, 0x9d3: 0x06b2, 0x9d4: 0x089a, 0x9d5: 0x08ba, 0x9d6: 0x1783, 0x9d7: 0x08ca, + 0x9d8: 0x08d2, 0x9d9: 0x0832, 0x9da: 0x08da, 0x9db: 0x08de, 0x9dc: 0x195e, 0x9dd: 0x08fa, + 0x9de: 0x0902, 0x9df: 0x06ba, 0x9e0: 0x091a, 0x9e1: 0x091e, 0x9e2: 0x0926, 0x9e3: 0x092a, + 0x9e4: 0x06be, 0x9e5: 0x0942, 0x9e6: 0x0946, 0x9e7: 0x0952, 0x9e8: 0x095e, 0x9e9: 0x0962, + 0x9ea: 0x0966, 0x9eb: 0x096e, 0x9ec: 0x098e, 0x9ed: 0x0992, 0x9ee: 0x099a, 0x9ef: 0x09aa, + 0x9f0: 0x09b2, 0x9f1: 0x09b6, 0x9f2: 0x09b6, 0x9f3: 0x09b6, 0x9f4: 0x1797, 0x9f5: 0x0f8e, + 0x9f6: 0x09ca, 0x9f7: 0x09d2, 0x9f8: 0x179c, 0x9f9: 0x09de, 0x9fa: 0x09e6, 0x9fb: 0x09ee, + 0x9fc: 0x0a16, 0x9fd: 0x0a02, 0x9fe: 0x0a0e, 0x9ff: 0x0a12, + // Block 0x28, offset 0xa00 + 0xa00: 0x0a1a, 0xa01: 0x0a22, 0xa02: 0x0a26, 0xa03: 0x0a2e, 0xa04: 0x0a36, 0xa05: 0x0a3a, + 0xa06: 0x0a3a, 0xa07: 0x0a42, 0xa08: 0x0a4a, 0xa09: 0x0a4e, 0xa0a: 0x0a5a, 0xa0b: 0x0a7e, + 0xa0c: 0x0a62, 0xa0d: 0x0a82, 0xa0e: 0x0a66, 0xa0f: 0x0a6e, 0xa10: 0x0906, 0xa11: 0x0aca, + 0xa12: 0x0a92, 0xa13: 0x0a96, 0xa14: 0x0a9a, 0xa15: 0x0a8e, 0xa16: 0x0aa2, 0xa17: 0x0a9e, + 0xa18: 0x0ab6, 0xa19: 0x17a1, 0xa1a: 0x0ad2, 0xa1b: 0x0ad6, 0xa1c: 0x0ade, 0xa1d: 0x0aea, + 0xa1e: 0x0af2, 0xa1f: 0x0b0e, 0xa20: 0x17a6, 0xa21: 0x17ab, 0xa22: 0x0b1a, 0xa23: 0x0b1e, + 0xa24: 0x0b22, 0xa25: 0x0b16, 0xa26: 0x0b2a, 0xa27: 0x06c2, 0xa28: 0x06c6, 0xa29: 0x0b32, + 0xa2a: 0x0b3a, 0xa2b: 0x0b3a, 0xa2c: 0x17b0, 0xa2d: 0x0b56, 0xa2e: 0x0b5a, 0xa2f: 0x0b5e, + 0xa30: 0x0b66, 0xa31: 0x17b5, 0xa32: 0x0b6e, 0xa33: 0x0b72, 0xa34: 0x0c4a, 0xa35: 0x0b7a, + 0xa36: 0x06ca, 0xa37: 0x0b86, 0xa38: 0x0b96, 0xa39: 0x0ba2, 0xa3a: 0x0b9e, 0xa3b: 0x17bf, + 0xa3c: 0x0baa, 0xa3d: 0x17c4, 0xa3e: 0x0bb6, 0xa3f: 0x0bb2, + // Block 0x29, offset 0xa40 + 0xa40: 0x0bba, 0xa41: 0x0bca, 0xa42: 0x0bce, 0xa43: 0x06ce, 0xa44: 0x0bde, 0xa45: 0x0be6, + 0xa46: 0x0bea, 0xa47: 0x0bee, 0xa48: 0x06d2, 0xa49: 0x17c9, 0xa4a: 0x06d6, 0xa4b: 0x0c0a, + 0xa4c: 0x0c0e, 0xa4d: 0x0c12, 0xa4e: 0x0c1a, 0xa4f: 0x1990, 0xa50: 0x0c32, 0xa51: 0x17d3, + 0xa52: 0x17d3, 0xa53: 0x12d2, 0xa54: 0x0c42, 0xa55: 0x0c42, 0xa56: 0x06da, 0xa57: 0x17f6, + 0xa58: 0x18c8, 0xa59: 0x0c52, 0xa5a: 0x0c5a, 0xa5b: 0x06de, 0xa5c: 0x0c6e, 0xa5d: 0x0c7e, + 0xa5e: 0x0c82, 0xa5f: 0x0c8a, 0xa60: 0x0c9a, 0xa61: 0x06e6, 0xa62: 0x06e2, 0xa63: 0x0c9e, + 0xa64: 0x17d8, 0xa65: 0x0ca2, 0xa66: 0x0cb6, 0xa67: 0x0cba, 0xa68: 0x0cbe, 0xa69: 0x0cba, + 0xa6a: 0x0cca, 0xa6b: 0x0cce, 0xa6c: 0x0cde, 0xa6d: 0x0cd6, 0xa6e: 0x0cda, 0xa6f: 0x0ce2, + 0xa70: 0x0ce6, 0xa71: 0x0cea, 0xa72: 0x0cf6, 0xa73: 0x0cfa, 0xa74: 0x0d12, 0xa75: 0x0d1a, + 0xa76: 0x0d2a, 0xa77: 0x0d3e, 0xa78: 0x17e7, 0xa79: 0x0d3a, 0xa7a: 0x0d2e, 0xa7b: 0x0d46, + 0xa7c: 0x0d4e, 0xa7d: 0x0d62, 0xa7e: 0x17ec, 0xa7f: 0x0d6a, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0d5e, 0xa81: 0x0d56, 0xa82: 0x06ea, 0xa83: 0x0d72, 0xa84: 0x0d7a, 0xa85: 0x0d82, + 0xa86: 0x0d76, 0xa87: 0x06ee, 0xa88: 0x0d92, 0xa89: 0x0d9a, 0xa8a: 0x17f1, 0xa8b: 0x0dc6, + 0xa8c: 0x0dfa, 0xa8d: 0x0dd6, 0xa8e: 0x06fa, 0xa8f: 0x0de2, 0xa90: 0x06f6, 0xa91: 0x06f2, + 0xa92: 0x08be, 0xa93: 0x08c2, 0xa94: 0x0dfe, 0xa95: 0x0de6, 0xa96: 0x12a6, 0xa97: 0x075e, + 0xa98: 0x0e0a, 0xa99: 0x0e0e, 0xa9a: 0x0e12, 0xa9b: 0x0e26, 0xa9c: 0x0e1e, 0xa9d: 0x180a, + 0xa9e: 0x06fe, 0xa9f: 0x0e3a, 0xaa0: 0x0e2e, 0xaa1: 0x0e4a, 0xaa2: 0x0e52, 0xaa3: 0x1814, + 0xaa4: 0x0e56, 0xaa5: 0x0e42, 0xaa6: 0x0e5e, 0xaa7: 0x0702, 0xaa8: 0x0e62, 0xaa9: 0x0e66, + 0xaaa: 0x0e6a, 0xaab: 0x0e76, 0xaac: 0x1819, 0xaad: 0x0e7e, 0xaae: 0x0706, 0xaaf: 0x0e8a, + 0xab0: 0x181e, 0xab1: 0x0e8e, 0xab2: 0x070a, 0xab3: 0x0e9a, 0xab4: 0x0ea6, 0xab5: 0x0eb2, + 0xab6: 0x0eb6, 0xab7: 0x1823, 0xab8: 0x17ba, 0xab9: 0x1828, 0xaba: 0x0ed6, 0xabb: 0x182d, + 0xabc: 0x0ee2, 0xabd: 0x0eea, 0xabe: 0x0eda, 0xabf: 0x0ef6, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0f06, 0xac1: 0x0f16, 0xac2: 0x0f0a, 0xac3: 0x0f0e, 0xac4: 0x0f1a, 0xac5: 0x0f1e, + 0xac6: 0x1832, 0xac7: 0x0f02, 0xac8: 0x0f36, 0xac9: 0x0f3a, 0xaca: 0x070e, 0xacb: 0x0f4e, + 0xacc: 0x0f4a, 0xacd: 0x1837, 0xace: 0x0f2e, 0xacf: 0x0f6a, 0xad0: 0x183c, 0xad1: 0x1841, + 0xad2: 0x0f6e, 0xad3: 0x0f82, 0xad4: 0x0f7e, 0xad5: 0x0f7a, 0xad6: 0x0712, 0xad7: 0x0f86, + 0xad8: 0x0f96, 0xad9: 0x0f92, 0xada: 0x0f9e, 0xadb: 0x177e, 0xadc: 0x0fae, 0xadd: 0x1846, + 0xade: 0x0fba, 0xadf: 0x1850, 0xae0: 0x0fce, 0xae1: 0x0fda, 0xae2: 0x0fee, 0xae3: 0x1855, + 0xae4: 0x1002, 0xae5: 0x1006, 0xae6: 0x185a, 0xae7: 0x185f, 0xae8: 0x1022, 0xae9: 0x1032, + 0xaea: 0x0716, 0xaeb: 0x1036, 0xaec: 0x071a, 0xaed: 0x071a, 0xaee: 0x104e, 0xaef: 0x1052, + 0xaf0: 0x105a, 0xaf1: 0x105e, 0xaf2: 0x106a, 0xaf3: 0x071e, 0xaf4: 0x1082, 0xaf5: 0x1864, + 0xaf6: 0x109e, 0xaf7: 0x1869, 0xaf8: 0x10aa, 0xaf9: 0x17ce, 0xafa: 0x10ba, 0xafb: 0x186e, + 0xafc: 0x1873, 0xafd: 0x1878, 0xafe: 0x0722, 0xaff: 0x0726, + // Block 0x2c, offset 0xb00 + 0xb00: 0x10f2, 0xb01: 0x1882, 0xb02: 0x187d, 0xb03: 0x1887, 0xb04: 0x188c, 0xb05: 0x10fa, + 0xb06: 0x10fe, 0xb07: 0x10fe, 0xb08: 0x1106, 0xb09: 0x072e, 0xb0a: 0x110a, 0xb0b: 0x0732, + 0xb0c: 0x0736, 0xb0d: 0x1896, 0xb0e: 0x111e, 0xb0f: 0x1126, 0xb10: 0x1132, 0xb11: 0x073a, + 0xb12: 0x189b, 0xb13: 0x1156, 0xb14: 0x18a0, 0xb15: 0x18a5, 0xb16: 0x1176, 0xb17: 0x118e, + 0xb18: 0x073e, 0xb19: 0x1196, 0xb1a: 0x119a, 0xb1b: 0x119e, 0xb1c: 0x18aa, 0xb1d: 0x18af, + 0xb1e: 0x18af, 0xb1f: 0x11b6, 0xb20: 0x0742, 0xb21: 0x18b4, 0xb22: 0x11ca, 0xb23: 0x11ce, + 0xb24: 0x0746, 0xb25: 0x18b9, 0xb26: 0x11ea, 0xb27: 0x074a, 0xb28: 0x11fa, 0xb29: 0x11f2, + 0xb2a: 0x1202, 0xb2b: 0x18c3, 0xb2c: 0x121a, 0xb2d: 0x074e, 0xb2e: 0x1226, 0xb2f: 0x122e, + 0xb30: 0x123e, 0xb31: 0x0752, 0xb32: 0x18cd, 0xb33: 0x18d2, 0xb34: 0x0756, 0xb35: 0x18d7, + 0xb36: 0x1256, 0xb37: 0x18dc, 0xb38: 0x1262, 0xb39: 0x126e, 0xb3a: 0x1276, 0xb3b: 0x18e1, + 0xb3c: 0x18e6, 0xb3d: 0x128a, 0xb3e: 0x18eb, 0xb3f: 0x1292, + // Block 0x2d, offset 0xb40 + 0xb40: 0x17fb, 0xb41: 0x075a, 0xb42: 0x12aa, 0xb43: 0x12ae, 0xb44: 0x0762, 0xb45: 0x12b2, + 0xb46: 0x0b2e, 0xb47: 0x18f0, 0xb48: 0x18f5, 0xb49: 0x1800, 0xb4a: 0x1805, 0xb4b: 0x12d2, + 0xb4c: 0x12d6, 0xb4d: 0x14ee, 0xb4e: 0x0766, 0xb4f: 0x1302, 0xb50: 0x12fe, 0xb51: 0x1306, + 0xb52: 0x093a, 0xb53: 0x130a, 0xb54: 0x130e, 0xb55: 0x1312, 0xb56: 0x131a, 0xb57: 0x18fa, + 0xb58: 0x1316, 0xb59: 0x131e, 0xb5a: 0x1332, 0xb5b: 0x1336, 0xb5c: 0x1322, 0xb5d: 0x133a, + 0xb5e: 0x134e, 0xb5f: 0x1362, 0xb60: 0x132e, 0xb61: 0x1342, 0xb62: 0x1346, 0xb63: 0x134a, + 0xb64: 0x18ff, 0xb65: 0x1909, 0xb66: 0x1904, 0xb67: 0x076a, 0xb68: 0x136a, 0xb69: 0x136e, + 0xb6a: 0x1376, 0xb6b: 0x191d, 0xb6c: 0x137a, 0xb6d: 0x190e, 0xb6e: 0x076e, 0xb6f: 0x0772, + 0xb70: 0x1913, 0xb71: 0x1918, 0xb72: 0x0776, 0xb73: 0x139a, 0xb74: 0x139e, 0xb75: 0x13a2, + 0xb76: 0x13a6, 0xb77: 0x13b2, 0xb78: 0x13ae, 0xb79: 0x13ba, 0xb7a: 0x13b6, 0xb7b: 0x13c6, + 0xb7c: 0x13be, 0xb7d: 0x13c2, 0xb7e: 0x13ca, 0xb7f: 0x077a, + // Block 0x2e, offset 0xb80 + 0xb80: 0x13d2, 0xb81: 0x13d6, 0xb82: 0x077e, 0xb83: 0x13e6, 0xb84: 0x13ea, 0xb85: 0x1922, + 0xb86: 0x13f6, 0xb87: 0x13fa, 0xb88: 0x0782, 0xb89: 0x1406, 0xb8a: 0x06b6, 0xb8b: 0x1927, + 0xb8c: 0x192c, 0xb8d: 0x0786, 0xb8e: 0x078a, 0xb8f: 0x1432, 0xb90: 0x144a, 0xb91: 0x1466, + 0xb92: 0x1476, 0xb93: 0x1931, 0xb94: 0x148a, 0xb95: 0x148e, 0xb96: 0x14a6, 0xb97: 0x14b2, + 0xb98: 0x193b, 0xb99: 0x178d, 0xb9a: 0x14be, 0xb9b: 0x14ba, 0xb9c: 0x14c6, 0xb9d: 0x1792, + 0xb9e: 0x14d2, 0xb9f: 0x14de, 0xba0: 0x1940, 0xba1: 0x1945, 0xba2: 0x151e, 0xba3: 0x152a, + 0xba4: 0x1532, 0xba5: 0x194a, 0xba6: 0x1536, 0xba7: 0x1562, 0xba8: 0x156e, 0xba9: 0x1572, + 0xbaa: 0x156a, 0xbab: 0x157e, 0xbac: 0x1582, 0xbad: 0x194f, 0xbae: 0x158e, 0xbaf: 0x078e, + 0xbb0: 0x1596, 0xbb1: 0x1954, 0xbb2: 0x0792, 0xbb3: 0x15ce, 0xbb4: 0x0bbe, 0xbb5: 0x15e6, + 0xbb6: 0x1959, 0xbb7: 0x1963, 0xbb8: 0x0796, 0xbb9: 0x079a, 0xbba: 0x160e, 0xbbb: 0x1968, + 0xbbc: 0x079e, 0xbbd: 0x196d, 0xbbe: 0x1626, 0xbbf: 0x1626, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x162e, 0xbc1: 0x1972, 0xbc2: 0x1646, 0xbc3: 0x07a2, 0xbc4: 0x1656, 0xbc5: 0x1662, + 0xbc6: 0x166a, 0xbc7: 0x1672, 0xbc8: 0x07a6, 0xbc9: 0x1977, 0xbca: 0x1686, 0xbcb: 0x16a2, + 0xbcc: 0x16ae, 0xbcd: 0x07aa, 0xbce: 0x07ae, 0xbcf: 0x16b2, 0xbd0: 0x197c, 0xbd1: 0x07b2, + 0xbd2: 0x1981, 0xbd3: 0x1986, 0xbd4: 0x198b, 0xbd5: 0x16d6, 0xbd6: 0x07b6, 0xbd7: 0x16ea, + 0xbd8: 0x16f2, 0xbd9: 0x16f6, 0xbda: 0x16fe, 0xbdb: 0x1706, 0xbdc: 0x170e, 0xbdd: 0x1995, +} + +// nfcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32, + 0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35, + 0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x3b, 0x121: 0x3c, 0x122: 0x3d, 0x123: 0x0d, 0x124: 0x3e, 0x125: 0x3f, 0x126: 0x40, 0x127: 0x41, + 0x128: 0x42, 0x129: 0x43, 0x12a: 0x44, 0x12b: 0x45, 0x12c: 0x40, 0x12d: 0x46, 0x12e: 0x47, 0x12f: 0x48, + 0x130: 0x44, 0x131: 0x49, 0x132: 0x4a, 0x133: 0x4b, 0x134: 0x4c, 0x135: 0x4d, 0x137: 0x4e, + 0x138: 0x4f, 0x139: 0x50, 0x13a: 0x51, 0x13b: 0x52, 0x13c: 0x53, 0x13d: 0x54, 0x13e: 0x55, 0x13f: 0x56, + // Block 0x5, offset 0x140 + 0x140: 0x57, 0x142: 0x58, 0x144: 0x59, 0x145: 0x5a, 0x146: 0x5b, 0x147: 0x5c, + 0x14d: 0x5d, + 0x15c: 0x5e, 0x15f: 0x5f, + 0x162: 0x60, 0x164: 0x61, + 0x168: 0x62, 0x169: 0x63, 0x16a: 0x64, 0x16b: 0x65, 0x16c: 0x0e, 0x16d: 0x66, 0x16e: 0x67, 0x16f: 0x68, + 0x170: 0x69, 0x173: 0x6a, 0x177: 0x0f, + 0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17, + // Block 0x6, offset 0x180 + 0x180: 0x6b, 0x183: 0x6c, 0x184: 0x6d, 0x186: 0x6e, 0x187: 0x6f, + 0x188: 0x70, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x71, 0x18c: 0x72, + 0x1ab: 0x73, + 0x1b3: 0x74, 0x1b5: 0x75, 0x1b7: 0x76, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x77, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x78, 0x1c5: 0x79, + 0x1c9: 0x7a, 0x1cc: 0x7b, 0x1cd: 0x7c, + // Block 0x8, offset 0x200 + 0x219: 0x7d, 0x21a: 0x7e, 0x21b: 0x7f, + 0x220: 0x80, 0x223: 0x81, 0x224: 0x82, 0x225: 0x83, 0x226: 0x84, 0x227: 0x85, + 0x22a: 0x86, 0x22b: 0x87, 0x22f: 0x88, + 0x230: 0x89, 0x231: 0x8a, 0x232: 0x8b, 0x233: 0x8c, 0x234: 0x8d, 0x235: 0x8e, 0x236: 0x8f, 0x237: 0x89, + 0x238: 0x8a, 0x239: 0x8b, 0x23a: 0x8c, 0x23b: 0x8d, 0x23c: 0x8e, 0x23d: 0x8f, 0x23e: 0x89, 0x23f: 0x8a, + // Block 0x9, offset 0x240 + 0x240: 0x8b, 0x241: 0x8c, 0x242: 0x8d, 0x243: 0x8e, 0x244: 0x8f, 0x245: 0x89, 0x246: 0x8a, 0x247: 0x8b, + 0x248: 0x8c, 0x249: 0x8d, 0x24a: 0x8e, 0x24b: 0x8f, 0x24c: 0x89, 0x24d: 0x8a, 0x24e: 0x8b, 0x24f: 0x8c, + 0x250: 0x8d, 0x251: 0x8e, 0x252: 0x8f, 0x253: 0x89, 0x254: 0x8a, 0x255: 0x8b, 0x256: 0x8c, 0x257: 0x8d, + 0x258: 0x8e, 0x259: 0x8f, 0x25a: 0x89, 0x25b: 0x8a, 0x25c: 0x8b, 0x25d: 0x8c, 0x25e: 0x8d, 0x25f: 0x8e, + 0x260: 0x8f, 0x261: 0x89, 0x262: 0x8a, 0x263: 0x8b, 0x264: 0x8c, 0x265: 0x8d, 0x266: 0x8e, 0x267: 0x8f, + 0x268: 0x89, 0x269: 0x8a, 0x26a: 0x8b, 0x26b: 0x8c, 0x26c: 0x8d, 0x26d: 0x8e, 0x26e: 0x8f, 0x26f: 0x89, + 0x270: 0x8a, 0x271: 0x8b, 0x272: 0x8c, 0x273: 0x8d, 0x274: 0x8e, 0x275: 0x8f, 0x276: 0x89, 0x277: 0x8a, + 0x278: 0x8b, 0x279: 0x8c, 0x27a: 0x8d, 0x27b: 0x8e, 0x27c: 0x8f, 0x27d: 0x89, 0x27e: 0x8a, 0x27f: 0x8b, + // Block 0xa, offset 0x280 + 0x280: 0x8c, 0x281: 0x8d, 0x282: 0x8e, 0x283: 0x8f, 0x284: 0x89, 0x285: 0x8a, 0x286: 0x8b, 0x287: 0x8c, + 0x288: 0x8d, 0x289: 0x8e, 0x28a: 0x8f, 0x28b: 0x89, 0x28c: 0x8a, 0x28d: 0x8b, 0x28e: 0x8c, 0x28f: 0x8d, + 0x290: 0x8e, 0x291: 0x8f, 0x292: 0x89, 0x293: 0x8a, 0x294: 0x8b, 0x295: 0x8c, 0x296: 0x8d, 0x297: 0x8e, + 0x298: 0x8f, 0x299: 0x89, 0x29a: 0x8a, 0x29b: 0x8b, 0x29c: 0x8c, 0x29d: 0x8d, 0x29e: 0x8e, 0x29f: 0x8f, + 0x2a0: 0x89, 0x2a1: 0x8a, 0x2a2: 0x8b, 0x2a3: 0x8c, 0x2a4: 0x8d, 0x2a5: 0x8e, 0x2a6: 0x8f, 0x2a7: 0x89, + 0x2a8: 0x8a, 0x2a9: 0x8b, 0x2aa: 0x8c, 0x2ab: 0x8d, 0x2ac: 0x8e, 0x2ad: 0x8f, 0x2ae: 0x89, 0x2af: 0x8a, + 0x2b0: 0x8b, 0x2b1: 0x8c, 0x2b2: 0x8d, 0x2b3: 0x8e, 0x2b4: 0x8f, 0x2b5: 0x89, 0x2b6: 0x8a, 0x2b7: 0x8b, + 0x2b8: 0x8c, 0x2b9: 0x8d, 0x2ba: 0x8e, 0x2bb: 0x8f, 0x2bc: 0x89, 0x2bd: 0x8a, 0x2be: 0x8b, 0x2bf: 0x8c, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x8d, 0x2c1: 0x8e, 0x2c2: 0x8f, 0x2c3: 0x89, 0x2c4: 0x8a, 0x2c5: 0x8b, 0x2c6: 0x8c, 0x2c7: 0x8d, + 0x2c8: 0x8e, 0x2c9: 0x8f, 0x2ca: 0x89, 0x2cb: 0x8a, 0x2cc: 0x8b, 0x2cd: 0x8c, 0x2ce: 0x8d, 0x2cf: 0x8e, + 0x2d0: 0x8f, 0x2d1: 0x89, 0x2d2: 0x8a, 0x2d3: 0x8b, 0x2d4: 0x8c, 0x2d5: 0x8d, 0x2d6: 0x8e, 0x2d7: 0x8f, + 0x2d8: 0x89, 0x2d9: 0x8a, 0x2da: 0x8b, 0x2db: 0x8c, 0x2dc: 0x8d, 0x2dd: 0x8e, 0x2de: 0x90, + // Block 0xc, offset 0x300 + 0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20, + 0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x91, 0x32d: 0x92, 0x32e: 0x93, + 0x331: 0x94, 0x332: 0x95, 0x333: 0x96, 0x334: 0x97, + 0x338: 0x98, 0x339: 0x99, 0x33a: 0x9a, 0x33b: 0x9b, 0x33e: 0x9c, 0x33f: 0x9d, + // Block 0xd, offset 0x340 + 0x347: 0x9e, + 0x34b: 0x9f, 0x34d: 0xa0, + 0x368: 0xa1, 0x36b: 0xa2, + 0x374: 0xa3, + 0x37a: 0xa4, 0x37b: 0xa5, 0x37d: 0xa6, 0x37e: 0xa7, + // Block 0xe, offset 0x380 + 0x381: 0xa8, 0x382: 0xa9, 0x384: 0xaa, 0x385: 0x84, 0x387: 0xab, + 0x388: 0xac, 0x38b: 0xad, 0x38c: 0xae, 0x38d: 0xaf, + 0x391: 0xb0, 0x392: 0xb1, 0x393: 0xb2, 0x396: 0xb3, 0x397: 0xb4, + 0x398: 0x75, 0x39a: 0xb5, 0x39c: 0xb6, + 0x3a0: 0xb7, 0x3a4: 0xb8, 0x3a5: 0xb9, 0x3a7: 0xba, + 0x3a8: 0xbb, 0x3a9: 0xbc, 0x3aa: 0xbd, + 0x3b0: 0x75, 0x3b5: 0xbe, 0x3b6: 0xbf, + 0x3bd: 0xc0, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xc1, 0x3ec: 0xc2, + 0x3ff: 0xc3, + // Block 0x10, offset 0x400 + 0x432: 0xc4, + // Block 0x11, offset 0x440 + 0x445: 0xc5, 0x446: 0xc6, 0x447: 0xc7, + 0x449: 0xc8, + // Block 0x12, offset 0x480 + 0x480: 0xc9, 0x482: 0xca, 0x484: 0xc2, + 0x48a: 0xcb, 0x48b: 0xcc, + 0x493: 0xcd, + 0x4a3: 0xce, 0x4a5: 0xcf, + // Block 0x13, offset 0x4c0 + 0x4c8: 0xd0, + // Block 0x14, offset 0x500 + 0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c, + 0x528: 0x2d, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfcSparseOffset: 163 entries, 326 bytes +var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x6e, 0x76, 0x7d, 0x80, 0x88, 0x8c, 0x90, 0x92, 0x94, 0x9d, 0xa1, 0xa8, 0xad, 0xb0, 0xba, 0xbd, 0xc4, 0xcc, 0xcf, 0xd1, 0xd4, 0xd6, 0xdb, 0xec, 0xf8, 0xfa, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10f, 0x112, 0x114, 0x117, 0x11a, 0x11e, 0x124, 0x12b, 0x134, 0x136, 0x139, 0x13b, 0x146, 0x14a, 0x158, 0x15b, 0x161, 0x167, 0x172, 0x176, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x186, 0x18a, 0x18c, 0x18e, 0x196, 0x19a, 0x19d, 0x19f, 0x1a1, 0x1a4, 0x1a7, 0x1a9, 0x1ab, 0x1ad, 0x1af, 0x1b5, 0x1b8, 0x1ba, 0x1c1, 0x1c7, 0x1cd, 0x1d5, 0x1db, 0x1e1, 0x1e7, 0x1eb, 0x1f9, 0x202, 0x205, 0x208, 0x20a, 0x20d, 0x20f, 0x213, 0x218, 0x21a, 0x21c, 0x221, 0x227, 0x229, 0x22b, 0x22d, 0x233, 0x236, 0x238, 0x23a, 0x23c, 0x242, 0x246, 0x24a, 0x252, 0x259, 0x25c, 0x25f, 0x261, 0x264, 0x26c, 0x270, 0x277, 0x27a, 0x280, 0x282, 0x285, 0x287, 0x28a, 0x28f, 0x291, 0x293, 0x295, 0x297, 0x299, 0x29c, 0x29e, 0x2a0, 0x2a2, 0x2a4, 0x2a6, 0x2a8, 0x2b5, 0x2bf, 0x2c1, 0x2c3, 0x2c9, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d5, 0x2d8} + +// nfcSparseValues: 730 entries, 2920 bytes +var nfcSparseValues = [730]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x04}, + {value: 0xa100, lo: 0xa8, hi: 0xa8}, + {value: 0x8100, lo: 0xaf, hi: 0xaf}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb8, hi: 0xb8}, + // Block 0x1, offset 0x5 + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x9 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + // Block 0x3, offset 0xb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x98, hi: 0x9d}, + // Block 0x4, offset 0xd + {value: 0x0006, lo: 0x0a}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x85, hi: 0x85}, + {value: 0xa000, lo: 0x89, hi: 0x89}, + {value: 0x4981, lo: 0x8a, hi: 0x8a}, + {value: 0x499f, lo: 0x8b, hi: 0x8b}, + {value: 0x3808, lo: 0x8c, hi: 0x8c}, + {value: 0x3820, lo: 0x8d, hi: 0x8d}, + {value: 0x49b7, lo: 0x8e, hi: 0x8e}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x383e, lo: 0x93, hi: 0x94}, + // Block 0x5, offset 0x18 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x6, offset 0x28 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x7, offset 0x2a + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x8, offset 0x2f + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x9, offset 0x3a + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0xa, offset 0x49 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xb, offset 0x56 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xc, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xd, offset 0x63 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xe, offset 0x68 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xf, offset 0x6a + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0x10, offset 0x6e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x11, offset 0x76 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x12, offset 0x7d + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x80 + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x14, offset 0x88 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x15, offset 0x8c + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x16, offset 0x90 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x17, offset 0x92 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x18, offset 0x94 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x19, offset 0x9d + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1a, offset 0xa1 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1b, offset 0xa8 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1c, offset 0xad + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1d, offset 0xb0 + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1e, offset 0xba + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1f, offset 0xbd + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x20, offset 0xc4 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x21, offset 0xcc + {value: 0x0000, lo: 0x02}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x22, offset 0xcf + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x23, offset 0xd1 + {value: 0x0000, lo: 0x02}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x24, offset 0xd4 + {value: 0x0000, lo: 0x01}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + // Block 0x25, offset 0xd6 + {value: 0x0000, lo: 0x04}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x26, offset 0xdb + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x8200, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x8200, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x27, offset 0xec + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x28, offset 0xf8 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x29, offset 0xfa + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x2a, offset 0x100 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2b, offset 0x102 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x104 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x106 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x108 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x10a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x10c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x10f + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x112 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x114 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x117 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x11a + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x11e + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x124 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x12b + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x134 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x136 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x139 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x13b + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x146 + {value: 0x0004, lo: 0x03}, + {value: 0x052a, lo: 0x80, hi: 0x81}, + {value: 0x8100, lo: 0x97, hi: 0x97}, + {value: 0x8100, lo: 0xbe, hi: 0xbe}, + // Block 0x3e, offset 0x14a + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x3f, offset 0x158 + {value: 0x43bc, lo: 0x02}, + {value: 0x023c, lo: 0xa6, hi: 0xa6}, + {value: 0x0057, lo: 0xaa, hi: 0xab}, + // Block 0x40, offset 0x15b + {value: 0x0007, lo: 0x05}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x41, offset 0x161 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x42, offset 0x167 + {value: 0x62c7, lo: 0x0a}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x43, offset 0x172 + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x44, offset 0x176 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x45, offset 0x178 + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x46, offset 0x17a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x47, offset 0x17c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x48, offset 0x17e + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x49, offset 0x180 + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xaf}, + // Block 0x4a, offset 0x186 + {value: 0x0000, lo: 0x03}, + {value: 0x4be0, lo: 0xb3, hi: 0xb3}, + {value: 0x4be0, lo: 0xb5, hi: 0xb6}, + {value: 0x4be0, lo: 0xba, hi: 0xbf}, + // Block 0x4b, offset 0x18a + {value: 0x0000, lo: 0x01}, + {value: 0x4be0, lo: 0x8f, hi: 0xa3}, + // Block 0x4c, offset 0x18c + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xae, hi: 0xbe}, + // Block 0x4d, offset 0x18e + {value: 0x0000, lo: 0x07}, + {value: 0x8100, lo: 0x84, hi: 0x84}, + {value: 0x8100, lo: 0x87, hi: 0x87}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + {value: 0x8100, lo: 0x9e, hi: 0x9e}, + {value: 0x8100, lo: 0xa1, hi: 0xa1}, + {value: 0x8100, lo: 0xb2, hi: 0xb2}, + {value: 0x8100, lo: 0xbb, hi: 0xbb}, + // Block 0x4e, offset 0x196 + {value: 0x0000, lo: 0x03}, + {value: 0x8100, lo: 0x80, hi: 0x80}, + {value: 0x8100, lo: 0x8b, hi: 0x8b}, + {value: 0x8100, lo: 0x8e, hi: 0x8e}, + // Block 0x4f, offset 0x19a + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x50, offset 0x19d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x51, offset 0x19f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x52, offset 0x1a1 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x53, offset 0x1a4 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x54, offset 0x1a7 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x55, offset 0x1a9 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x56, offset 0x1ab + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x57, offset 0x1ad + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x58, offset 0x1af + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x59, offset 0x1b5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x5a, offset 0x1b8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x5b, offset 0x1ba + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x5c, offset 0x1c1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x5d, offset 0x1c7 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x5e, offset 0x1cd + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x5f, offset 0x1d5 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x60, offset 0x1db + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x61, offset 0x1e1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x62, offset 0x1e7 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x63, offset 0x1eb + {value: 0x0006, lo: 0x0d}, + {value: 0x44d1, lo: 0x9d, hi: 0x9d}, + {value: 0x8116, lo: 0x9e, hi: 0x9e}, + {value: 0x4543, lo: 0x9f, hi: 0x9f}, + {value: 0x4531, lo: 0xaa, hi: 0xab}, + {value: 0x4635, lo: 0xac, hi: 0xac}, + {value: 0x463d, lo: 0xad, hi: 0xad}, + {value: 0x4489, lo: 0xae, hi: 0xb1}, + {value: 0x44a7, lo: 0xb2, hi: 0xb4}, + {value: 0x44bf, lo: 0xb5, hi: 0xb6}, + {value: 0x44cb, lo: 0xb8, hi: 0xb8}, + {value: 0x44d7, lo: 0xb9, hi: 0xbb}, + {value: 0x44ef, lo: 0xbc, hi: 0xbc}, + {value: 0x44f5, lo: 0xbe, hi: 0xbe}, + // Block 0x64, offset 0x1f9 + {value: 0x0006, lo: 0x08}, + {value: 0x44fb, lo: 0x80, hi: 0x81}, + {value: 0x4507, lo: 0x83, hi: 0x84}, + {value: 0x4519, lo: 0x86, hi: 0x89}, + {value: 0x453d, lo: 0x8a, hi: 0x8a}, + {value: 0x44b9, lo: 0x8b, hi: 0x8b}, + {value: 0x44a1, lo: 0x8c, hi: 0x8c}, + {value: 0x44e9, lo: 0x8d, hi: 0x8d}, + {value: 0x4513, lo: 0x8e, hi: 0x8e}, + // Block 0x65, offset 0x202 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0xa4, hi: 0xa5}, + {value: 0x8100, lo: 0xb0, hi: 0xb1}, + // Block 0x66, offset 0x205 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x9b, hi: 0x9d}, + {value: 0x8200, lo: 0x9e, hi: 0xa3}, + // Block 0x67, offset 0x208 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + // Block 0x68, offset 0x20a + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x99, hi: 0x99}, + {value: 0x8200, lo: 0xb2, hi: 0xb4}, + // Block 0x69, offset 0x20d + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xbc, hi: 0xbd}, + // Block 0x6a, offset 0x20f + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0xa0, hi: 0xa6}, + {value: 0x812e, lo: 0xa7, hi: 0xad}, + {value: 0x8133, lo: 0xae, hi: 0xaf}, + // Block 0x6b, offset 0x213 + {value: 0x0000, lo: 0x04}, + {value: 0x8100, lo: 0x89, hi: 0x8c}, + {value: 0x8100, lo: 0xb0, hi: 0xb2}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb6, hi: 0xbf}, + // Block 0x6c, offset 0x218 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x81, hi: 0x8c}, + // Block 0x6d, offset 0x21a + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xb5, hi: 0xba}, + // Block 0x6e, offset 0x21c + {value: 0x0000, lo: 0x04}, + {value: 0x4be0, lo: 0x9e, hi: 0x9f}, + {value: 0x4be0, lo: 0xa3, hi: 0xa3}, + {value: 0x4be0, lo: 0xa5, hi: 0xa6}, + {value: 0x4be0, lo: 0xaa, hi: 0xaf}, + // Block 0x6f, offset 0x221 + {value: 0x0000, lo: 0x05}, + {value: 0x4be0, lo: 0x82, hi: 0x87}, + {value: 0x4be0, lo: 0x8a, hi: 0x8f}, + {value: 0x4be0, lo: 0x92, hi: 0x97}, + {value: 0x4be0, lo: 0x9a, hi: 0x9c}, + {value: 0x8100, lo: 0xa3, hi: 0xa3}, + // Block 0x70, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x71, offset 0x229 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x72, offset 0x22b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x73, offset 0x22d + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x233 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x75, offset 0x236 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x76, offset 0x238 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x77, offset 0x23a + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x78, offset 0x23c + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x79, offset 0x242 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x7a, offset 0x246 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x7b, offset 0x24a + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x7c, offset 0x252 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x7d, offset 0x259 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7e, offset 0x25c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7f, offset 0x25f + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x80, offset 0x261 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x81, offset 0x264 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x82, offset 0x26c + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x83, offset 0x270 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x84, offset 0x277 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x85, offset 0x27a + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x86, offset 0x280 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x87, offset 0x282 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x88, offset 0x285 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x89, offset 0x287 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x8a, offset 0x28a + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x8b, offset 0x28f + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x8c, offset 0x291 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8d, offset 0x293 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8e, offset 0x295 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8f, offset 0x297 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x90, offset 0x299 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x91, offset 0x29c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x92, offset 0x29e + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x93, offset 0x2a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x94, offset 0x2a2 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x95, offset 0x2a4 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x96, offset 0x2a6 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x97, offset 0x2a8 + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x98, offset 0x2b5 + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x2bf + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x9a, offset 0x2c1 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x9b, offset 0x2c3 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0x80, hi: 0x86}, + {value: 0x8133, lo: 0x88, hi: 0x98}, + {value: 0x8133, lo: 0x9b, hi: 0xa1}, + {value: 0x8133, lo: 0xa3, hi: 0xa4}, + {value: 0x8133, lo: 0xa6, hi: 0xaa}, + // Block 0x9c, offset 0x2c9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0x9d, offset 0x2cb + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0x9e, offset 0x2cd + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0x9f, offset 0x2cf + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xa0, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xa1, offset 0x2d5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xa2, offset 0x2d8 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x93, hi: 0x93}, +} + +// 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 *nfkcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[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 := nfkcIndex[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 := nfkcIndex[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 = nfkcIndex[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 := nfkcIndex[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 = nfkcIndex[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 = nfkcIndex[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 *nfkcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[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 *nfkcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[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 := nfkcIndex[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 := nfkcIndex[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 = nfkcIndex[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 := nfkcIndex[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 = nfkcIndex[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 = nfkcIndex[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 *nfkcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfkcTrie. Total size: 19260 bytes (18.81 KiB). Checksum: 1a0bbc4c8c24da49. +type nfkcTrie struct{} + +func newNfkcTrie(i int) *nfkcTrie { + return &nfkcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 95: + return uint16(nfkcValues[n<<6+uint32(b)]) + default: + n -= 95 + return uint16(nfkcSparse.lookup(n, b)) + } +} + +// nfkcValues: 97 blocks, 6208 entries, 12416 bytes +// The third block is the zero block. +var nfkcValues = [6208]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x132: 0x1a8a, 0x133: 0x1b17, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, 0x13f: 0x1cdc, + // Block 0x5, offset 0x140 + 0x140: 0x1d64, 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, 0x149: 0x1d8c, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0x00a7, + // Block 0x6, offset 0x180 + 0x184: 0x2f2f, 0x185: 0x2f35, + 0x186: 0x2f3b, 0x187: 0x1a9f, 0x188: 0x1aa2, 0x189: 0x1b38, 0x18a: 0x1ab7, 0x18b: 0x1aba, + 0x18c: 0x1b6e, 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b1: 0x1a6f, 0x1b2: 0x1a72, 0x1b3: 0x1aff, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x43e6, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x439b, 0x285: 0x45bc, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c1: 0xa000, 0x2c5: 0xa000, + 0x2c9: 0xa000, 0x2ca: 0x4981, 0x2cb: 0x499f, + 0x2cc: 0x3808, 0x2cd: 0x3820, 0x2ce: 0x49b7, 0x2d0: 0x0242, 0x2d1: 0x0254, + 0x2d2: 0x0230, 0x2d3: 0x444d, 0x2d4: 0x4453, 0x2d5: 0x027e, 0x2d6: 0x026c, + 0x2f0: 0x025a, 0x2f1: 0x026f, 0x2f2: 0x0272, 0x2f4: 0x020c, 0x2f5: 0x024b, + 0x2f9: 0x022a, + // Block 0xc, offset 0x300 + 0x300: 0x3862, 0x301: 0x386e, 0x303: 0x385c, + 0x306: 0xa000, 0x307: 0x384a, + 0x30c: 0x389e, 0x30d: 0x3886, 0x30e: 0x38b0, 0x310: 0xa000, + 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, + 0x318: 0xa000, 0x319: 0x3892, 0x31a: 0xa000, + 0x31e: 0xa000, 0x323: 0xa000, + 0x327: 0xa000, + 0x32b: 0xa000, 0x32d: 0xa000, + 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, + 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x3916, 0x33a: 0xa000, + 0x33e: 0xa000, + // Block 0xd, offset 0x340 + 0x341: 0x3874, 0x342: 0x38f8, + 0x350: 0x3850, 0x351: 0x38d4, + 0x352: 0x3856, 0x353: 0x38da, 0x356: 0x3868, 0x357: 0x38ec, + 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x396a, 0x35b: 0x3970, 0x35c: 0x387a, 0x35d: 0x38fe, + 0x35e: 0x3880, 0x35f: 0x3904, 0x362: 0x388c, 0x363: 0x3910, + 0x364: 0x3898, 0x365: 0x391c, 0x366: 0x38a4, 0x367: 0x3928, 0x368: 0xa000, 0x369: 0xa000, + 0x36a: 0x3976, 0x36b: 0x397c, 0x36c: 0x38ce, 0x36d: 0x3952, 0x36e: 0x38aa, 0x36f: 0x392e, + 0x370: 0x38b6, 0x371: 0x393a, 0x372: 0x38bc, 0x373: 0x3940, 0x374: 0x38c2, 0x375: 0x3946, + 0x378: 0x38c8, 0x379: 0x394c, + // Block 0xe, offset 0x380 + 0x387: 0x1e91, + 0x391: 0x812e, + 0x392: 0x8133, 0x393: 0x8133, 0x394: 0x8133, 0x395: 0x8133, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x812f, 0x39b: 0x812e, 0x39c: 0x8133, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x8133, 0x3a0: 0x8133, 0x3a1: 0x8133, 0x3a2: 0x812e, 0x3a3: 0x812e, + 0x3a4: 0x812e, 0x3a5: 0x812e, 0x3a6: 0x812e, 0x3a7: 0x812e, 0x3a8: 0x8133, 0x3a9: 0x8133, + 0x3aa: 0x812e, 0x3ab: 0x8133, 0x3ac: 0x8133, 0x3ad: 0x812f, 0x3ae: 0x8132, 0x3af: 0x8133, + 0x3b0: 0x8106, 0x3b1: 0x8107, 0x3b2: 0x8108, 0x3b3: 0x8109, 0x3b4: 0x810a, 0x3b5: 0x810b, + 0x3b6: 0x810c, 0x3b7: 0x810d, 0x3b8: 0x810e, 0x3b9: 0x810f, 0x3ba: 0x810f, 0x3bb: 0x8110, + 0x3bc: 0x8111, 0x3bd: 0x8112, 0x3bf: 0x8113, + // Block 0xf, offset 0x3c0 + 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8117, + 0x3cc: 0x8118, 0x3cd: 0x8119, 0x3ce: 0x811a, 0x3cf: 0x811b, 0x3d0: 0x811c, 0x3d1: 0x811d, + 0x3d2: 0x811e, 0x3d3: 0x9933, 0x3d4: 0x9933, 0x3d5: 0x992e, 0x3d6: 0x812e, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x812e, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x812e, + 0x3f0: 0x811f, 0x3f5: 0x1eb4, + 0x3f6: 0x2143, 0x3f7: 0x217f, 0x3f8: 0x217a, + // Block 0x10, offset 0x400 + 0x40a: 0x8133, 0x40b: 0x8133, + 0x40c: 0x8133, 0x40d: 0x8133, 0x40e: 0x8133, 0x40f: 0x812e, 0x410: 0x812e, 0x411: 0x812e, + 0x412: 0x812e, 0x413: 0x812e, 0x414: 0x8133, 0x415: 0x8133, 0x416: 0x8133, 0x417: 0x8133, + 0x418: 0x8133, 0x419: 0x8133, 0x41a: 0x8133, 0x41b: 0x8133, 0x41c: 0x8133, 0x41d: 0x8133, + 0x41e: 0x8133, 0x41f: 0x8133, 0x420: 0x8133, 0x421: 0x8133, 0x423: 0x812e, + 0x424: 0x8133, 0x425: 0x8133, 0x426: 0x812e, 0x427: 0x8133, 0x428: 0x8133, 0x429: 0x812e, + 0x42a: 0x8133, 0x42b: 0x8133, 0x42c: 0x8133, 0x42d: 0x812e, 0x42e: 0x812e, 0x42f: 0x812e, + 0x430: 0x8117, 0x431: 0x8118, 0x432: 0x8119, 0x433: 0x8133, 0x434: 0x8133, 0x435: 0x8133, + 0x436: 0x812e, 0x437: 0x8133, 0x438: 0x8133, 0x439: 0x812e, 0x43a: 0x812e, 0x43b: 0x8133, + 0x43c: 0x8133, 0x43d: 0x8133, 0x43e: 0x8133, 0x43f: 0x8133, + // Block 0x11, offset 0x440 + 0x445: 0xa000, + 0x446: 0x2e5d, 0x447: 0xa000, 0x448: 0x2e65, 0x449: 0xa000, 0x44a: 0x2e6d, 0x44b: 0xa000, + 0x44c: 0x2e75, 0x44d: 0xa000, 0x44e: 0x2e7d, 0x451: 0xa000, + 0x452: 0x2e85, + 0x474: 0x8103, 0x475: 0x9900, + 0x47a: 0xa000, 0x47b: 0x2e8d, + 0x47c: 0xa000, 0x47d: 0x2e95, 0x47e: 0xa000, 0x47f: 0xa000, + // Block 0x12, offset 0x480 + 0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x0104, 0x485: 0x0107, + 0x486: 0x0506, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x011f, 0x48b: 0x0122, + 0x48c: 0x0125, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e6, + 0x492: 0x009f, 0x493: 0x0110, 0x494: 0x050a, 0x495: 0x050e, 0x496: 0x00a1, 0x497: 0x00a9, + 0x498: 0x00ab, 0x499: 0x0516, 0x49a: 0x015b, 0x49b: 0x00ad, 0x49c: 0x051a, 0x49d: 0x0242, + 0x49e: 0x0245, 0x49f: 0x0248, 0x4a0: 0x027e, 0x4a1: 0x0281, 0x4a2: 0x0093, 0x4a3: 0x00a5, + 0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x0242, 0x4a7: 0x0245, 0x4a8: 0x026f, 0x4a9: 0x027e, + 0x4aa: 0x0281, + 0x4b8: 0x02b4, + // Block 0x13, offset 0x4c0 + 0x4db: 0x010a, 0x4dc: 0x0087, 0x4dd: 0x0113, + 0x4de: 0x00d7, 0x4df: 0x0125, 0x4e0: 0x008d, 0x4e1: 0x012b, 0x4e2: 0x0131, 0x4e3: 0x013d, + 0x4e4: 0x0146, 0x4e5: 0x0149, 0x4e6: 0x014c, 0x4e7: 0x051e, 0x4e8: 0x01c7, 0x4e9: 0x0155, + 0x4ea: 0x0522, 0x4eb: 0x01ca, 0x4ec: 0x0161, 0x4ed: 0x015e, 0x4ee: 0x0164, 0x4ef: 0x0167, + 0x4f0: 0x016a, 0x4f1: 0x016d, 0x4f2: 0x0176, 0x4f3: 0x018e, 0x4f4: 0x0191, 0x4f5: 0x00f2, + 0x4f6: 0x019a, 0x4f7: 0x019d, 0x4f8: 0x0512, 0x4f9: 0x01a0, 0x4fa: 0x01a3, 0x4fb: 0x00b5, + 0x4fc: 0x01af, 0x4fd: 0x01b2, 0x4fe: 0x01b5, 0x4ff: 0x0254, + // Block 0x14, offset 0x500 + 0x500: 0x8133, 0x501: 0x8133, 0x502: 0x812e, 0x503: 0x8133, 0x504: 0x8133, 0x505: 0x8133, + 0x506: 0x8133, 0x507: 0x8133, 0x508: 0x8133, 0x509: 0x8133, 0x50a: 0x812e, 0x50b: 0x8133, + 0x50c: 0x8133, 0x50d: 0x8136, 0x50e: 0x812b, 0x50f: 0x812e, 0x510: 0x812a, 0x511: 0x8133, + 0x512: 0x8133, 0x513: 0x8133, 0x514: 0x8133, 0x515: 0x8133, 0x516: 0x8133, 0x517: 0x8133, + 0x518: 0x8133, 0x519: 0x8133, 0x51a: 0x8133, 0x51b: 0x8133, 0x51c: 0x8133, 0x51d: 0x8133, + 0x51e: 0x8133, 0x51f: 0x8133, 0x520: 0x8133, 0x521: 0x8133, 0x522: 0x8133, 0x523: 0x8133, + 0x524: 0x8133, 0x525: 0x8133, 0x526: 0x8133, 0x527: 0x8133, 0x528: 0x8133, 0x529: 0x8133, + 0x52a: 0x8133, 0x52b: 0x8133, 0x52c: 0x8133, 0x52d: 0x8133, 0x52e: 0x8133, 0x52f: 0x8133, + 0x530: 0x8133, 0x531: 0x8133, 0x532: 0x8133, 0x533: 0x8133, 0x534: 0x8133, 0x535: 0x8133, + 0x536: 0x8134, 0x537: 0x8132, 0x538: 0x8132, 0x539: 0x812e, 0x53a: 0x812d, 0x53b: 0x8133, + 0x53c: 0x8135, 0x53d: 0x812e, 0x53e: 0x8133, 0x53f: 0x812e, + // Block 0x15, offset 0x540 + 0x540: 0x30d8, 0x541: 0x33e4, 0x542: 0x30e2, 0x543: 0x33ee, 0x544: 0x30e7, 0x545: 0x33f3, + 0x546: 0x30ec, 0x547: 0x33f8, 0x548: 0x3a0d, 0x549: 0x3b9c, 0x54a: 0x3105, 0x54b: 0x3411, + 0x54c: 0x310f, 0x54d: 0x341b, 0x54e: 0x311e, 0x54f: 0x342a, 0x550: 0x3114, 0x551: 0x3420, + 0x552: 0x3119, 0x553: 0x3425, 0x554: 0x3a30, 0x555: 0x3bbf, 0x556: 0x3a37, 0x557: 0x3bc6, + 0x558: 0x315a, 0x559: 0x3466, 0x55a: 0x315f, 0x55b: 0x346b, 0x55c: 0x3a45, 0x55d: 0x3bd4, + 0x55e: 0x3164, 0x55f: 0x3470, 0x560: 0x3173, 0x561: 0x347f, 0x562: 0x3191, 0x563: 0x349d, + 0x564: 0x31a0, 0x565: 0x34ac, 0x566: 0x3196, 0x567: 0x34a2, 0x568: 0x31a5, 0x569: 0x34b1, + 0x56a: 0x31aa, 0x56b: 0x34b6, 0x56c: 0x31f0, 0x56d: 0x34fc, 0x56e: 0x3a4c, 0x56f: 0x3bdb, + 0x570: 0x31fa, 0x571: 0x350b, 0x572: 0x3204, 0x573: 0x3515, 0x574: 0x320e, 0x575: 0x351f, + 0x576: 0x4805, 0x577: 0x4896, 0x578: 0x3a53, 0x579: 0x3be2, 0x57a: 0x3227, 0x57b: 0x3538, + 0x57c: 0x3222, 0x57d: 0x3533, 0x57e: 0x322c, 0x57f: 0x353d, + // Block 0x16, offset 0x580 + 0x580: 0x3231, 0x581: 0x3542, 0x582: 0x3236, 0x583: 0x3547, 0x584: 0x324a, 0x585: 0x355b, + 0x586: 0x3254, 0x587: 0x3565, 0x588: 0x3263, 0x589: 0x3574, 0x58a: 0x325e, 0x58b: 0x356f, + 0x58c: 0x3a76, 0x58d: 0x3c05, 0x58e: 0x3a84, 0x58f: 0x3c13, 0x590: 0x3a8b, 0x591: 0x3c1a, + 0x592: 0x3a92, 0x593: 0x3c21, 0x594: 0x3290, 0x595: 0x35a1, 0x596: 0x3295, 0x597: 0x35a6, + 0x598: 0x329f, 0x599: 0x35b0, 0x59a: 0x4832, 0x59b: 0x48c3, 0x59c: 0x3ad8, 0x59d: 0x3c67, + 0x59e: 0x32b8, 0x59f: 0x35c9, 0x5a0: 0x32c2, 0x5a1: 0x35d3, 0x5a2: 0x4841, 0x5a3: 0x48d2, + 0x5a4: 0x3adf, 0x5a5: 0x3c6e, 0x5a6: 0x3ae6, 0x5a7: 0x3c75, 0x5a8: 0x3aed, 0x5a9: 0x3c7c, + 0x5aa: 0x32d1, 0x5ab: 0x35e2, 0x5ac: 0x32db, 0x5ad: 0x35f1, 0x5ae: 0x32ef, 0x5af: 0x3605, + 0x5b0: 0x32ea, 0x5b1: 0x3600, 0x5b2: 0x332b, 0x5b3: 0x3641, 0x5b4: 0x333a, 0x5b5: 0x3650, + 0x5b6: 0x3335, 0x5b7: 0x364b, 0x5b8: 0x3af4, 0x5b9: 0x3c83, 0x5ba: 0x3afb, 0x5bb: 0x3c8a, + 0x5bc: 0x333f, 0x5bd: 0x3655, 0x5be: 0x3344, 0x5bf: 0x365a, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3349, 0x5c1: 0x365f, 0x5c2: 0x334e, 0x5c3: 0x3664, 0x5c4: 0x335d, 0x5c5: 0x3673, + 0x5c6: 0x3358, 0x5c7: 0x366e, 0x5c8: 0x3362, 0x5c9: 0x367d, 0x5ca: 0x3367, 0x5cb: 0x3682, + 0x5cc: 0x336c, 0x5cd: 0x3687, 0x5ce: 0x338a, 0x5cf: 0x36a5, 0x5d0: 0x33a3, 0x5d1: 0x36c3, + 0x5d2: 0x33b2, 0x5d3: 0x36d2, 0x5d4: 0x33b7, 0x5d5: 0x36d7, 0x5d6: 0x34bb, 0x5d7: 0x35e7, + 0x5d8: 0x3678, 0x5d9: 0x36b4, 0x5da: 0x1d10, 0x5db: 0x4418, + 0x5e0: 0x47e2, 0x5e1: 0x4873, 0x5e2: 0x30c4, 0x5e3: 0x33d0, + 0x5e4: 0x39b9, 0x5e5: 0x3b48, 0x5e6: 0x39b2, 0x5e7: 0x3b41, 0x5e8: 0x39c7, 0x5e9: 0x3b56, + 0x5ea: 0x39c0, 0x5eb: 0x3b4f, 0x5ec: 0x39ff, 0x5ed: 0x3b8e, 0x5ee: 0x39d5, 0x5ef: 0x3b64, + 0x5f0: 0x39ce, 0x5f1: 0x3b5d, 0x5f2: 0x39e3, 0x5f3: 0x3b72, 0x5f4: 0x39dc, 0x5f5: 0x3b6b, + 0x5f6: 0x3a06, 0x5f7: 0x3b95, 0x5f8: 0x47f6, 0x5f9: 0x4887, 0x5fa: 0x3141, 0x5fb: 0x344d, + 0x5fc: 0x312d, 0x5fd: 0x3439, 0x5fe: 0x3a1b, 0x5ff: 0x3baa, + // Block 0x18, offset 0x600 + 0x600: 0x3a14, 0x601: 0x3ba3, 0x602: 0x3a29, 0x603: 0x3bb8, 0x604: 0x3a22, 0x605: 0x3bb1, + 0x606: 0x3a3e, 0x607: 0x3bcd, 0x608: 0x31d2, 0x609: 0x34de, 0x60a: 0x31e6, 0x60b: 0x34f2, + 0x60c: 0x4828, 0x60d: 0x48b9, 0x60e: 0x3277, 0x60f: 0x3588, 0x610: 0x3a61, 0x611: 0x3bf0, + 0x612: 0x3a5a, 0x613: 0x3be9, 0x614: 0x3a6f, 0x615: 0x3bfe, 0x616: 0x3a68, 0x617: 0x3bf7, + 0x618: 0x3aca, 0x619: 0x3c59, 0x61a: 0x3aae, 0x61b: 0x3c3d, 0x61c: 0x3aa7, 0x61d: 0x3c36, + 0x61e: 0x3abc, 0x61f: 0x3c4b, 0x620: 0x3ab5, 0x621: 0x3c44, 0x622: 0x3ac3, 0x623: 0x3c52, + 0x624: 0x3326, 0x625: 0x363c, 0x626: 0x3308, 0x627: 0x361e, 0x628: 0x3b25, 0x629: 0x3cb4, + 0x62a: 0x3b1e, 0x62b: 0x3cad, 0x62c: 0x3b33, 0x62d: 0x3cc2, 0x62e: 0x3b2c, 0x62f: 0x3cbb, + 0x630: 0x3b3a, 0x631: 0x3cc9, 0x632: 0x3371, 0x633: 0x368c, 0x634: 0x3399, 0x635: 0x36b9, + 0x636: 0x3394, 0x637: 0x36af, 0x638: 0x3380, 0x639: 0x369b, + // Block 0x19, offset 0x640 + 0x640: 0x4945, 0x641: 0x494b, 0x642: 0x4a5f, 0x643: 0x4a77, 0x644: 0x4a67, 0x645: 0x4a7f, + 0x646: 0x4a6f, 0x647: 0x4a87, 0x648: 0x48eb, 0x649: 0x48f1, 0x64a: 0x49cf, 0x64b: 0x49e7, + 0x64c: 0x49d7, 0x64d: 0x49ef, 0x64e: 0x49df, 0x64f: 0x49f7, 0x650: 0x4957, 0x651: 0x495d, + 0x652: 0x3ef9, 0x653: 0x3f09, 0x654: 0x3f01, 0x655: 0x3f11, + 0x658: 0x48f7, 0x659: 0x48fd, 0x65a: 0x3e29, 0x65b: 0x3e39, 0x65c: 0x3e31, 0x65d: 0x3e41, + 0x660: 0x496f, 0x661: 0x4975, 0x662: 0x4a8f, 0x663: 0x4aa7, + 0x664: 0x4a97, 0x665: 0x4aaf, 0x666: 0x4a9f, 0x667: 0x4ab7, 0x668: 0x4903, 0x669: 0x4909, + 0x66a: 0x49ff, 0x66b: 0x4a17, 0x66c: 0x4a07, 0x66d: 0x4a1f, 0x66e: 0x4a0f, 0x66f: 0x4a27, + 0x670: 0x4987, 0x671: 0x498d, 0x672: 0x3f59, 0x673: 0x3f71, 0x674: 0x3f61, 0x675: 0x3f79, + 0x676: 0x3f69, 0x677: 0x3f81, 0x678: 0x490f, 0x679: 0x4915, 0x67a: 0x3e59, 0x67b: 0x3e71, + 0x67c: 0x3e61, 0x67d: 0x3e79, 0x67e: 0x3e69, 0x67f: 0x3e81, + // Block 0x1a, offset 0x680 + 0x680: 0x4993, 0x681: 0x4999, 0x682: 0x3f89, 0x683: 0x3f99, 0x684: 0x3f91, 0x685: 0x3fa1, + 0x688: 0x491b, 0x689: 0x4921, 0x68a: 0x3e89, 0x68b: 0x3e99, + 0x68c: 0x3e91, 0x68d: 0x3ea1, 0x690: 0x49a5, 0x691: 0x49ab, + 0x692: 0x3fc1, 0x693: 0x3fd9, 0x694: 0x3fc9, 0x695: 0x3fe1, 0x696: 0x3fd1, 0x697: 0x3fe9, + 0x699: 0x4927, 0x69b: 0x3ea9, 0x69d: 0x3eb1, + 0x69f: 0x3eb9, 0x6a0: 0x49bd, 0x6a1: 0x49c3, 0x6a2: 0x4abf, 0x6a3: 0x4ad7, + 0x6a4: 0x4ac7, 0x6a5: 0x4adf, 0x6a6: 0x4acf, 0x6a7: 0x4ae7, 0x6a8: 0x492d, 0x6a9: 0x4933, + 0x6aa: 0x4a2f, 0x6ab: 0x4a47, 0x6ac: 0x4a37, 0x6ad: 0x4a4f, 0x6ae: 0x4a3f, 0x6af: 0x4a57, + 0x6b0: 0x4939, 0x6b1: 0x445f, 0x6b2: 0x37d2, 0x6b3: 0x4465, 0x6b4: 0x4963, 0x6b5: 0x446b, + 0x6b6: 0x37e4, 0x6b7: 0x4471, 0x6b8: 0x3802, 0x6b9: 0x4477, 0x6ba: 0x381a, 0x6bb: 0x447d, + 0x6bc: 0x49b1, 0x6bd: 0x4483, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3ee1, 0x6c1: 0x3ee9, 0x6c2: 0x42c5, 0x6c3: 0x42e3, 0x6c4: 0x42cf, 0x6c5: 0x42ed, + 0x6c6: 0x42d9, 0x6c7: 0x42f7, 0x6c8: 0x3e19, 0x6c9: 0x3e21, 0x6ca: 0x4211, 0x6cb: 0x422f, + 0x6cc: 0x421b, 0x6cd: 0x4239, 0x6ce: 0x4225, 0x6cf: 0x4243, 0x6d0: 0x3f29, 0x6d1: 0x3f31, + 0x6d2: 0x4301, 0x6d3: 0x431f, 0x6d4: 0x430b, 0x6d5: 0x4329, 0x6d6: 0x4315, 0x6d7: 0x4333, + 0x6d8: 0x3e49, 0x6d9: 0x3e51, 0x6da: 0x424d, 0x6db: 0x426b, 0x6dc: 0x4257, 0x6dd: 0x4275, + 0x6de: 0x4261, 0x6df: 0x427f, 0x6e0: 0x4001, 0x6e1: 0x4009, 0x6e2: 0x433d, 0x6e3: 0x435b, + 0x6e4: 0x4347, 0x6e5: 0x4365, 0x6e6: 0x4351, 0x6e7: 0x436f, 0x6e8: 0x3ec1, 0x6e9: 0x3ec9, + 0x6ea: 0x4289, 0x6eb: 0x42a7, 0x6ec: 0x4293, 0x6ed: 0x42b1, 0x6ee: 0x429d, 0x6ef: 0x42bb, + 0x6f0: 0x37c6, 0x6f1: 0x37c0, 0x6f2: 0x3ed1, 0x6f3: 0x37cc, 0x6f4: 0x3ed9, + 0x6f6: 0x4951, 0x6f7: 0x3ef1, 0x6f8: 0x3736, 0x6f9: 0x3730, 0x6fa: 0x3724, 0x6fb: 0x442f, + 0x6fc: 0x373c, 0x6fd: 0x43c8, 0x6fe: 0x0257, 0x6ff: 0x43c8, + // Block 0x1c, offset 0x700 + 0x700: 0x43e1, 0x701: 0x45c3, 0x702: 0x3f19, 0x703: 0x37de, 0x704: 0x3f21, + 0x706: 0x497b, 0x707: 0x3f39, 0x708: 0x3742, 0x709: 0x4435, 0x70a: 0x374e, 0x70b: 0x443b, + 0x70c: 0x375a, 0x70d: 0x45ca, 0x70e: 0x45d1, 0x70f: 0x45d8, 0x710: 0x37f6, 0x711: 0x37f0, + 0x712: 0x3f41, 0x713: 0x4625, 0x716: 0x37fc, 0x717: 0x3f51, + 0x718: 0x3772, 0x719: 0x376c, 0x71a: 0x3760, 0x71b: 0x4441, 0x71d: 0x45df, + 0x71e: 0x45e6, 0x71f: 0x45ed, 0x720: 0x382c, 0x721: 0x3826, 0x722: 0x3fa9, 0x723: 0x462d, + 0x724: 0x380e, 0x725: 0x3814, 0x726: 0x3832, 0x727: 0x3fb9, 0x728: 0x37a2, 0x729: 0x379c, + 0x72a: 0x3790, 0x72b: 0x444d, 0x72c: 0x378a, 0x72d: 0x45b5, 0x72e: 0x45bc, 0x72f: 0x0081, + 0x732: 0x3ff1, 0x733: 0x3838, 0x734: 0x3ff9, + 0x736: 0x49c9, 0x737: 0x4011, 0x738: 0x377e, 0x739: 0x4447, 0x73a: 0x37ae, 0x73b: 0x4459, + 0x73c: 0x37ba, 0x73d: 0x439b, 0x73e: 0x43cd, + // Block 0x1d, offset 0x740 + 0x740: 0x1d08, 0x741: 0x1d0c, 0x742: 0x0047, 0x743: 0x1d84, 0x745: 0x1d18, + 0x746: 0x1d1c, 0x747: 0x00ef, 0x749: 0x1d88, 0x74a: 0x008f, 0x74b: 0x0051, + 0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00e0, 0x750: 0x0053, 0x751: 0x0053, + 0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x1abd, + 0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065, + 0x760: 0x1acf, 0x761: 0x1cf8, 0x762: 0x1ad8, + 0x764: 0x0075, 0x766: 0x023c, 0x768: 0x0075, + 0x76a: 0x0057, 0x76b: 0x4413, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b, + 0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0308, + 0x776: 0x030b, 0x777: 0x030e, 0x778: 0x0311, 0x779: 0x0093, 0x77b: 0x1cc8, + 0x77c: 0x026c, 0x77d: 0x0245, 0x77e: 0x01fd, 0x77f: 0x0224, + // Block 0x1e, offset 0x780 + 0x780: 0x055a, 0x785: 0x0049, + 0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095, + 0x790: 0x235e, 0x791: 0x236a, + 0x792: 0x241e, 0x793: 0x2346, 0x794: 0x23ca, 0x795: 0x2352, 0x796: 0x23d0, 0x797: 0x23e8, + 0x798: 0x23f4, 0x799: 0x2358, 0x79a: 0x23fa, 0x79b: 0x2364, 0x79c: 0x23ee, 0x79d: 0x2400, + 0x79e: 0x2406, 0x79f: 0x1dec, 0x7a0: 0x0053, 0x7a1: 0x1a87, 0x7a2: 0x1cd4, 0x7a3: 0x1a90, + 0x7a4: 0x006d, 0x7a5: 0x1adb, 0x7a6: 0x1d00, 0x7a7: 0x1e78, 0x7a8: 0x1a93, 0x7a9: 0x0071, + 0x7aa: 0x1ae7, 0x7ab: 0x1d04, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b, + 0x7b0: 0x0093, 0x7b1: 0x1b14, 0x7b2: 0x1d48, 0x7b3: 0x1b1d, 0x7b4: 0x00ad, 0x7b5: 0x1b92, + 0x7b6: 0x1d7c, 0x7b7: 0x1e8c, 0x7b8: 0x1b20, 0x7b9: 0x00b1, 0x7ba: 0x1b95, 0x7bb: 0x1d80, + 0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x3d47, 0x7c3: 0xa000, 0x7c4: 0x3d4e, 0x7c5: 0xa000, + 0x7c7: 0x3d55, 0x7c8: 0xa000, 0x7c9: 0x3d5c, + 0x7cd: 0xa000, + 0x7e0: 0x30a6, 0x7e1: 0xa000, 0x7e2: 0x3d6a, + 0x7e4: 0xa000, 0x7e5: 0xa000, + 0x7ed: 0x3d63, 0x7ee: 0x30a1, 0x7ef: 0x30ab, + 0x7f0: 0x3d71, 0x7f1: 0x3d78, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3d7f, 0x7f5: 0x3d86, + 0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3d8d, 0x7f9: 0x3d94, 0x7fa: 0xa000, 0x7fb: 0xa000, + 0x7fc: 0xa000, 0x7fd: 0xa000, + // Block 0x20, offset 0x800 + 0x800: 0x3d9b, 0x801: 0x3da2, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3db7, 0x805: 0x3dbe, + 0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3dc5, 0x809: 0x3dcc, + 0x811: 0xa000, + 0x812: 0xa000, + 0x822: 0xa000, + 0x828: 0xa000, 0x829: 0xa000, + 0x82b: 0xa000, 0x82c: 0x3de1, 0x82d: 0x3de8, 0x82e: 0x3def, 0x82f: 0x3df6, + 0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000, + // Block 0x21, offset 0x840 + 0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029, + 0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x19af, + 0x86a: 0x19b2, 0x86b: 0x19b5, 0x86c: 0x19b8, 0x86d: 0x19bb, 0x86e: 0x19be, 0x86f: 0x19c1, + 0x870: 0x19c4, 0x871: 0x19c7, 0x872: 0x19ca, 0x873: 0x19d3, 0x874: 0x1b98, 0x875: 0x1b9c, + 0x876: 0x1ba0, 0x877: 0x1ba4, 0x878: 0x1ba8, 0x879: 0x1bac, 0x87a: 0x1bb0, 0x87b: 0x1bb4, + 0x87c: 0x1bb8, 0x87d: 0x1db0, 0x87e: 0x1db5, 0x87f: 0x1dba, + // Block 0x22, offset 0x880 + 0x880: 0x1dbf, 0x881: 0x1dc4, 0x882: 0x1dc9, 0x883: 0x1dce, 0x884: 0x1dd3, 0x885: 0x1dd8, + 0x886: 0x1ddd, 0x887: 0x1de2, 0x888: 0x19ac, 0x889: 0x19d0, 0x88a: 0x19f4, 0x88b: 0x1a18, + 0x88c: 0x1a3c, 0x88d: 0x1a45, 0x88e: 0x1a4b, 0x88f: 0x1a51, 0x890: 0x1a57, 0x891: 0x1c90, + 0x892: 0x1c94, 0x893: 0x1c98, 0x894: 0x1c9c, 0x895: 0x1ca0, 0x896: 0x1ca4, 0x897: 0x1ca8, + 0x898: 0x1cac, 0x899: 0x1cb0, 0x89a: 0x1cb4, 0x89b: 0x1cb8, 0x89c: 0x1c24, 0x89d: 0x1c28, + 0x89e: 0x1c2c, 0x89f: 0x1c30, 0x8a0: 0x1c34, 0x8a1: 0x1c38, 0x8a2: 0x1c3c, 0x8a3: 0x1c40, + 0x8a4: 0x1c44, 0x8a5: 0x1c48, 0x8a6: 0x1c4c, 0x8a7: 0x1c50, 0x8a8: 0x1c54, 0x8a9: 0x1c58, + 0x8aa: 0x1c5c, 0x8ab: 0x1c60, 0x8ac: 0x1c64, 0x8ad: 0x1c68, 0x8ae: 0x1c6c, 0x8af: 0x1c70, + 0x8b0: 0x1c74, 0x8b1: 0x1c78, 0x8b2: 0x1c7c, 0x8b3: 0x1c80, 0x8b4: 0x1c84, 0x8b5: 0x1c88, + 0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d, + 0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x07ba, 0x8c1: 0x07de, 0x8c2: 0x07ea, 0x8c3: 0x07fa, 0x8c4: 0x0802, 0x8c5: 0x080e, + 0x8c6: 0x0816, 0x8c7: 0x081e, 0x8c8: 0x082a, 0x8c9: 0x087e, 0x8ca: 0x0896, 0x8cb: 0x08a6, + 0x8cc: 0x08b6, 0x8cd: 0x08c6, 0x8ce: 0x08d6, 0x8cf: 0x08f6, 0x8d0: 0x08fa, 0x8d1: 0x08fe, + 0x8d2: 0x0932, 0x8d3: 0x095a, 0x8d4: 0x096a, 0x8d5: 0x0972, 0x8d6: 0x0976, 0x8d7: 0x0982, + 0x8d8: 0x099e, 0x8d9: 0x09a2, 0x8da: 0x09ba, 0x8db: 0x09be, 0x8dc: 0x09c6, 0x8dd: 0x09d6, + 0x8de: 0x0a72, 0x8df: 0x0a86, 0x8e0: 0x0ac6, 0x8e1: 0x0ada, 0x8e2: 0x0ae2, 0x8e3: 0x0ae6, + 0x8e4: 0x0af6, 0x8e5: 0x0b12, 0x8e6: 0x0b3e, 0x8e7: 0x0b4a, 0x8e8: 0x0b6a, 0x8e9: 0x0b76, + 0x8ea: 0x0b7a, 0x8eb: 0x0b7e, 0x8ec: 0x0b96, 0x8ed: 0x0b9a, 0x8ee: 0x0bc6, 0x8ef: 0x0bd2, + 0x8f0: 0x0bda, 0x8f1: 0x0be2, 0x8f2: 0x0bf2, 0x8f3: 0x0bfa, 0x8f4: 0x0c02, 0x8f5: 0x0c2e, + 0x8f6: 0x0c32, 0x8f7: 0x0c3a, 0x8f8: 0x0c3e, 0x8f9: 0x0c46, 0x8fa: 0x0c4e, 0x8fb: 0x0c5e, + 0x8fc: 0x0c7a, 0x8fd: 0x0cf2, 0x8fe: 0x0d06, 0x8ff: 0x0d0a, + // Block 0x24, offset 0x900 + 0x900: 0x0d8a, 0x901: 0x0d8e, 0x902: 0x0da2, 0x903: 0x0da6, 0x904: 0x0dae, 0x905: 0x0db6, + 0x906: 0x0dbe, 0x907: 0x0dca, 0x908: 0x0df2, 0x909: 0x0e02, 0x90a: 0x0e16, 0x90b: 0x0e86, + 0x90c: 0x0e92, 0x90d: 0x0ea2, 0x90e: 0x0eae, 0x90f: 0x0eba, 0x910: 0x0ec2, 0x911: 0x0ec6, + 0x912: 0x0eca, 0x913: 0x0ece, 0x914: 0x0ed2, 0x915: 0x0f8a, 0x916: 0x0fd2, 0x917: 0x0fde, + 0x918: 0x0fe2, 0x919: 0x0fe6, 0x91a: 0x0fea, 0x91b: 0x0ff2, 0x91c: 0x0ff6, 0x91d: 0x100a, + 0x91e: 0x1026, 0x91f: 0x102e, 0x920: 0x106e, 0x921: 0x1072, 0x922: 0x107a, 0x923: 0x107e, + 0x924: 0x1086, 0x925: 0x108a, 0x926: 0x10ae, 0x927: 0x10b2, 0x928: 0x10ce, 0x929: 0x10d2, + 0x92a: 0x10d6, 0x92b: 0x10da, 0x92c: 0x10ee, 0x92d: 0x1112, 0x92e: 0x1116, 0x92f: 0x111a, + 0x930: 0x113e, 0x931: 0x117e, 0x932: 0x1182, 0x933: 0x11a2, 0x934: 0x11b2, 0x935: 0x11ba, + 0x936: 0x11da, 0x937: 0x11fe, 0x938: 0x1242, 0x939: 0x124a, 0x93a: 0x125e, 0x93b: 0x126a, + 0x93c: 0x1272, 0x93d: 0x127a, 0x93e: 0x127e, 0x93f: 0x1282, + // Block 0x25, offset 0x940 + 0x940: 0x129a, 0x941: 0x129e, 0x942: 0x12ba, 0x943: 0x12c2, 0x944: 0x12ca, 0x945: 0x12ce, + 0x946: 0x12da, 0x947: 0x12e2, 0x948: 0x12e6, 0x949: 0x12ea, 0x94a: 0x12f2, 0x94b: 0x12f6, + 0x94c: 0x1396, 0x94d: 0x13aa, 0x94e: 0x13de, 0x94f: 0x13e2, 0x950: 0x13ea, 0x951: 0x1416, + 0x952: 0x141e, 0x953: 0x1426, 0x954: 0x142e, 0x955: 0x146a, 0x956: 0x146e, 0x957: 0x1476, + 0x958: 0x147a, 0x959: 0x147e, 0x95a: 0x14aa, 0x95b: 0x14ae, 0x95c: 0x14b6, 0x95d: 0x14ca, + 0x95e: 0x14ce, 0x95f: 0x14ea, 0x960: 0x14f2, 0x961: 0x14f6, 0x962: 0x151a, 0x963: 0x153a, + 0x964: 0x154e, 0x965: 0x1552, 0x966: 0x155a, 0x967: 0x1586, 0x968: 0x158a, 0x969: 0x159a, + 0x96a: 0x15be, 0x96b: 0x15ca, 0x96c: 0x15da, 0x96d: 0x15f2, 0x96e: 0x15fa, 0x96f: 0x15fe, + 0x970: 0x1602, 0x971: 0x1606, 0x972: 0x1612, 0x973: 0x1616, 0x974: 0x161e, 0x975: 0x163a, + 0x976: 0x163e, 0x977: 0x1642, 0x978: 0x165a, 0x979: 0x165e, 0x97a: 0x1666, 0x97b: 0x167a, + 0x97c: 0x167e, 0x97d: 0x1682, 0x97e: 0x168a, 0x97f: 0x168e, + // Block 0x26, offset 0x980 + 0x986: 0xa000, 0x98b: 0xa000, + 0x98c: 0x4049, 0x98d: 0xa000, 0x98e: 0x4051, 0x98f: 0xa000, 0x990: 0x4059, 0x991: 0xa000, + 0x992: 0x4061, 0x993: 0xa000, 0x994: 0x4069, 0x995: 0xa000, 0x996: 0x4071, 0x997: 0xa000, + 0x998: 0x4079, 0x999: 0xa000, 0x99a: 0x4081, 0x99b: 0xa000, 0x99c: 0x4089, 0x99d: 0xa000, + 0x99e: 0x4091, 0x99f: 0xa000, 0x9a0: 0x4099, 0x9a1: 0xa000, 0x9a2: 0x40a1, + 0x9a4: 0xa000, 0x9a5: 0x40a9, 0x9a6: 0xa000, 0x9a7: 0x40b1, 0x9a8: 0xa000, 0x9a9: 0x40b9, + 0x9af: 0xa000, + 0x9b0: 0x40c1, 0x9b1: 0x40c9, 0x9b2: 0xa000, 0x9b3: 0x40d1, 0x9b4: 0x40d9, 0x9b5: 0xa000, + 0x9b6: 0x40e1, 0x9b7: 0x40e9, 0x9b8: 0xa000, 0x9b9: 0x40f1, 0x9ba: 0x40f9, 0x9bb: 0xa000, + 0x9bc: 0x4101, 0x9bd: 0x4109, + // Block 0x27, offset 0x9c0 + 0x9d4: 0x4041, + 0x9d9: 0x9904, 0x9da: 0x9904, 0x9db: 0x441d, 0x9dc: 0x4423, 0x9dd: 0xa000, + 0x9de: 0x4111, 0x9df: 0x27e4, + 0x9e6: 0xa000, + 0x9eb: 0xa000, 0x9ec: 0x4121, 0x9ed: 0xa000, 0x9ee: 0x4129, 0x9ef: 0xa000, + 0x9f0: 0x4131, 0x9f1: 0xa000, 0x9f2: 0x4139, 0x9f3: 0xa000, 0x9f4: 0x4141, 0x9f5: 0xa000, + 0x9f6: 0x4149, 0x9f7: 0xa000, 0x9f8: 0x4151, 0x9f9: 0xa000, 0x9fa: 0x4159, 0x9fb: 0xa000, + 0x9fc: 0x4161, 0x9fd: 0xa000, 0x9fe: 0x4169, 0x9ff: 0xa000, + // Block 0x28, offset 0xa00 + 0xa00: 0x4171, 0xa01: 0xa000, 0xa02: 0x4179, 0xa04: 0xa000, 0xa05: 0x4181, + 0xa06: 0xa000, 0xa07: 0x4189, 0xa08: 0xa000, 0xa09: 0x4191, + 0xa0f: 0xa000, 0xa10: 0x4199, 0xa11: 0x41a1, + 0xa12: 0xa000, 0xa13: 0x41a9, 0xa14: 0x41b1, 0xa15: 0xa000, 0xa16: 0x41b9, 0xa17: 0x41c1, + 0xa18: 0xa000, 0xa19: 0x41c9, 0xa1a: 0x41d1, 0xa1b: 0xa000, 0xa1c: 0x41d9, 0xa1d: 0x41e1, + 0xa2f: 0xa000, + 0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x4119, + 0xa37: 0x41e9, 0xa38: 0x41f1, 0xa39: 0x41f9, 0xa3a: 0x4201, + 0xa3d: 0xa000, 0xa3e: 0x4209, 0xa3f: 0x27f9, + // Block 0x29, offset 0xa40 + 0xa40: 0x045a, 0xa41: 0x041e, 0xa42: 0x0422, 0xa43: 0x0426, 0xa44: 0x046e, 0xa45: 0x042a, + 0xa46: 0x042e, 0xa47: 0x0432, 0xa48: 0x0436, 0xa49: 0x043a, 0xa4a: 0x043e, 0xa4b: 0x0442, + 0xa4c: 0x0446, 0xa4d: 0x044a, 0xa4e: 0x044e, 0xa4f: 0x4afe, 0xa50: 0x4b04, 0xa51: 0x4b0a, + 0xa52: 0x4b10, 0xa53: 0x4b16, 0xa54: 0x4b1c, 0xa55: 0x4b22, 0xa56: 0x4b28, 0xa57: 0x4b2e, + 0xa58: 0x4b34, 0xa59: 0x4b3a, 0xa5a: 0x4b40, 0xa5b: 0x4b46, 0xa5c: 0x4b4c, 0xa5d: 0x4b52, + 0xa5e: 0x4b58, 0xa5f: 0x4b5e, 0xa60: 0x4b64, 0xa61: 0x4b6a, 0xa62: 0x4b70, 0xa63: 0x4b76, + 0xa64: 0x04b6, 0xa65: 0x0452, 0xa66: 0x0456, 0xa67: 0x04da, 0xa68: 0x04de, 0xa69: 0x04e2, + 0xa6a: 0x04e6, 0xa6b: 0x04ea, 0xa6c: 0x04ee, 0xa6d: 0x04f2, 0xa6e: 0x045e, 0xa6f: 0x04f6, + 0xa70: 0x04fa, 0xa71: 0x0462, 0xa72: 0x0466, 0xa73: 0x046a, 0xa74: 0x0472, 0xa75: 0x0476, + 0xa76: 0x047a, 0xa77: 0x047e, 0xa78: 0x0482, 0xa79: 0x0486, 0xa7a: 0x048a, 0xa7b: 0x048e, + 0xa7c: 0x0492, 0xa7d: 0x0496, 0xa7e: 0x049a, 0xa7f: 0x049e, + // Block 0x2a, offset 0xa80 + 0xa80: 0x04a2, 0xa81: 0x04a6, 0xa82: 0x04fe, 0xa83: 0x0502, 0xa84: 0x04aa, 0xa85: 0x04ae, + 0xa86: 0x04b2, 0xa87: 0x04ba, 0xa88: 0x04be, 0xa89: 0x04c2, 0xa8a: 0x04c6, 0xa8b: 0x04ca, + 0xa8c: 0x04ce, 0xa8d: 0x04d2, 0xa8e: 0x04d6, + 0xa92: 0x07ba, 0xa93: 0x0816, 0xa94: 0x07c6, 0xa95: 0x0a76, 0xa96: 0x07ca, 0xa97: 0x07e2, + 0xa98: 0x07ce, 0xa99: 0x108e, 0xa9a: 0x0802, 0xa9b: 0x07d6, 0xa9c: 0x07be, 0xa9d: 0x0afa, + 0xa9e: 0x0a8a, 0xa9f: 0x082a, + // Block 0x2b, offset 0xac0 + 0xac0: 0x2184, 0xac1: 0x218a, 0xac2: 0x2190, 0xac3: 0x2196, 0xac4: 0x219c, 0xac5: 0x21a2, + 0xac6: 0x21a8, 0xac7: 0x21ae, 0xac8: 0x21b4, 0xac9: 0x21ba, 0xaca: 0x21c0, 0xacb: 0x21c6, + 0xacc: 0x21cc, 0xacd: 0x21d2, 0xace: 0x285d, 0xacf: 0x2866, 0xad0: 0x286f, 0xad1: 0x2878, + 0xad2: 0x2881, 0xad3: 0x288a, 0xad4: 0x2893, 0xad5: 0x289c, 0xad6: 0x28a5, 0xad7: 0x28b7, + 0xad8: 0x28c0, 0xad9: 0x28c9, 0xada: 0x28d2, 0xadb: 0x28db, 0xadc: 0x28ae, 0xadd: 0x2ce3, + 0xade: 0x2c24, 0xae0: 0x21d8, 0xae1: 0x21f0, 0xae2: 0x21e4, 0xae3: 0x2238, + 0xae4: 0x21f6, 0xae5: 0x2214, 0xae6: 0x21de, 0xae7: 0x220e, 0xae8: 0x21ea, 0xae9: 0x2220, + 0xaea: 0x2250, 0xaeb: 0x226e, 0xaec: 0x2268, 0xaed: 0x225c, 0xaee: 0x22aa, 0xaef: 0x223e, + 0xaf0: 0x224a, 0xaf1: 0x2262, 0xaf2: 0x2256, 0xaf3: 0x2280, 0xaf4: 0x222c, 0xaf5: 0x2274, + 0xaf6: 0x229e, 0xaf7: 0x2286, 0xaf8: 0x221a, 0xaf9: 0x21fc, 0xafa: 0x2232, 0xafb: 0x2244, + 0xafc: 0x227a, 0xafd: 0x2202, 0xafe: 0x22a4, 0xaff: 0x2226, + // Block 0x2c, offset 0xb00 + 0xb00: 0x228c, 0xb01: 0x2208, 0xb02: 0x2292, 0xb03: 0x2298, 0xb04: 0x0a2a, 0xb05: 0x0bfe, + 0xb06: 0x0da2, 0xb07: 0x11c2, + 0xb10: 0x1cf4, 0xb11: 0x19d6, + 0xb12: 0x19d9, 0xb13: 0x19dc, 0xb14: 0x19df, 0xb15: 0x19e2, 0xb16: 0x19e5, 0xb17: 0x19e8, + 0xb18: 0x19eb, 0xb19: 0x19ee, 0xb1a: 0x19f7, 0xb1b: 0x19fa, 0xb1c: 0x19fd, 0xb1d: 0x1a00, + 0xb1e: 0x1a03, 0xb1f: 0x1a06, 0xb20: 0x0406, 0xb21: 0x040e, 0xb22: 0x0412, 0xb23: 0x041a, + 0xb24: 0x041e, 0xb25: 0x0422, 0xb26: 0x042a, 0xb27: 0x0432, 0xb28: 0x0436, 0xb29: 0x043e, + 0xb2a: 0x0442, 0xb2b: 0x0446, 0xb2c: 0x044a, 0xb2d: 0x044e, 0xb2e: 0x2f59, 0xb2f: 0x2f61, + 0xb30: 0x2f69, 0xb31: 0x2f71, 0xb32: 0x2f79, 0xb33: 0x2f81, 0xb34: 0x2f89, 0xb35: 0x2f91, + 0xb36: 0x2fa1, 0xb37: 0x2fa9, 0xb38: 0x2fb1, 0xb39: 0x2fb9, 0xb3a: 0x2fc1, 0xb3b: 0x2fc9, + 0xb3c: 0x3014, 0xb3d: 0x2fdc, 0xb3e: 0x2f99, + // Block 0x2d, offset 0xb40 + 0xb40: 0x07ba, 0xb41: 0x0816, 0xb42: 0x07c6, 0xb43: 0x0a76, 0xb44: 0x081a, 0xb45: 0x08aa, + 0xb46: 0x07c2, 0xb47: 0x08a6, 0xb48: 0x0806, 0xb49: 0x0982, 0xb4a: 0x0e02, 0xb4b: 0x0f8a, + 0xb4c: 0x0ed2, 0xb4d: 0x0e16, 0xb4e: 0x155a, 0xb4f: 0x0a86, 0xb50: 0x0dca, 0xb51: 0x0e46, + 0xb52: 0x0e06, 0xb53: 0x1146, 0xb54: 0x09f6, 0xb55: 0x0ffe, 0xb56: 0x1482, 0xb57: 0x115a, + 0xb58: 0x093e, 0xb59: 0x118a, 0xb5a: 0x1096, 0xb5b: 0x0b12, 0xb5c: 0x150a, 0xb5d: 0x087a, + 0xb5e: 0x09a6, 0xb5f: 0x0ef2, 0xb60: 0x1622, 0xb61: 0x083e, 0xb62: 0x08ce, 0xb63: 0x0e96, + 0xb64: 0x07ca, 0xb65: 0x07e2, 0xb66: 0x07ce, 0xb67: 0x0bd6, 0xb68: 0x09ea, 0xb69: 0x097a, + 0xb6a: 0x0b52, 0xb6b: 0x0b46, 0xb6c: 0x10e6, 0xb6d: 0x083a, 0xb6e: 0x1496, 0xb6f: 0x0996, + 0xb70: 0x0aee, 0xb71: 0x1a09, 0xb72: 0x1a0c, 0xb73: 0x1a0f, 0xb74: 0x1a12, 0xb75: 0x1a1b, + 0xb76: 0x1a1e, 0xb77: 0x1a21, 0xb78: 0x1a24, 0xb79: 0x1a27, 0xb7a: 0x1a2a, 0xb7b: 0x1a2d, + 0xb7c: 0x1a30, 0xb7d: 0x1a33, 0xb7e: 0x1a36, 0xb7f: 0x1a3f, + // Block 0x2e, offset 0xb80 + 0xb80: 0x1df6, 0xb81: 0x1e05, 0xb82: 0x1e14, 0xb83: 0x1e23, 0xb84: 0x1e32, 0xb85: 0x1e41, + 0xb86: 0x1e50, 0xb87: 0x1e5f, 0xb88: 0x1e6e, 0xb89: 0x22bc, 0xb8a: 0x22ce, 0xb8b: 0x22e0, + 0xb8c: 0x1a81, 0xb8d: 0x1d34, 0xb8e: 0x1b02, 0xb8f: 0x1cd8, 0xb90: 0x05c6, 0xb91: 0x05ce, + 0xb92: 0x05d6, 0xb93: 0x05de, 0xb94: 0x05e6, 0xb95: 0x05ea, 0xb96: 0x05ee, 0xb97: 0x05f2, + 0xb98: 0x05f6, 0xb99: 0x05fa, 0xb9a: 0x05fe, 0xb9b: 0x0602, 0xb9c: 0x0606, 0xb9d: 0x060a, + 0xb9e: 0x060e, 0xb9f: 0x0612, 0xba0: 0x0616, 0xba1: 0x061e, 0xba2: 0x0622, 0xba3: 0x0626, + 0xba4: 0x062a, 0xba5: 0x062e, 0xba6: 0x0632, 0xba7: 0x0636, 0xba8: 0x063a, 0xba9: 0x063e, + 0xbaa: 0x0642, 0xbab: 0x0646, 0xbac: 0x064a, 0xbad: 0x064e, 0xbae: 0x0652, 0xbaf: 0x0656, + 0xbb0: 0x065a, 0xbb1: 0x065e, 0xbb2: 0x0662, 0xbb3: 0x066a, 0xbb4: 0x0672, 0xbb5: 0x067a, + 0xbb6: 0x067e, 0xbb7: 0x0682, 0xbb8: 0x0686, 0xbb9: 0x068a, 0xbba: 0x068e, 0xbbb: 0x0692, + 0xbbc: 0x0696, 0xbbd: 0x069a, 0xbbe: 0x069e, 0xbbf: 0x282a, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x2c43, 0xbc1: 0x2adf, 0xbc2: 0x2c53, 0xbc3: 0x29b7, 0xbc4: 0x3025, 0xbc5: 0x29c1, + 0xbc6: 0x29cb, 0xbc7: 0x3069, 0xbc8: 0x2aec, 0xbc9: 0x29d5, 0xbca: 0x29df, 0xbcb: 0x29e9, + 0xbcc: 0x2b13, 0xbcd: 0x2b20, 0xbce: 0x2af9, 0xbcf: 0x2b06, 0xbd0: 0x2fea, 0xbd1: 0x2b2d, + 0xbd2: 0x2b3a, 0xbd3: 0x2cf5, 0xbd4: 0x27eb, 0xbd5: 0x2d08, 0xbd6: 0x2d1b, 0xbd7: 0x2c63, + 0xbd8: 0x2b47, 0xbd9: 0x2d2e, 0xbda: 0x2d41, 0xbdb: 0x2b54, 0xbdc: 0x29f3, 0xbdd: 0x29fd, + 0xbde: 0x2ff8, 0xbdf: 0x2b61, 0xbe0: 0x2c73, 0xbe1: 0x3036, 0xbe2: 0x2a07, 0xbe3: 0x2a11, + 0xbe4: 0x2b6e, 0xbe5: 0x2a1b, 0xbe6: 0x2a25, 0xbe7: 0x2800, 0xbe8: 0x2807, 0xbe9: 0x2a2f, + 0xbea: 0x2a39, 0xbeb: 0x2d54, 0xbec: 0x2b7b, 0xbed: 0x2c83, 0xbee: 0x2d67, 0xbef: 0x2b88, + 0xbf0: 0x2a4d, 0xbf1: 0x2a43, 0xbf2: 0x307d, 0xbf3: 0x2b95, 0xbf4: 0x2d7a, 0xbf5: 0x2a57, + 0xbf6: 0x2c93, 0xbf7: 0x2a61, 0xbf8: 0x2baf, 0xbf9: 0x2a6b, 0xbfa: 0x2bbc, 0xbfb: 0x3047, + 0xbfc: 0x2ba2, 0xbfd: 0x2ca3, 0xbfe: 0x2bc9, 0xbff: 0x280e, + // Block 0x30, offset 0xc00 + 0xc00: 0x3058, 0xc01: 0x2a75, 0xc02: 0x2a7f, 0xc03: 0x2bd6, 0xc04: 0x2a89, 0xc05: 0x2a93, + 0xc06: 0x2a9d, 0xc07: 0x2cb3, 0xc08: 0x2be3, 0xc09: 0x2815, 0xc0a: 0x2d8d, 0xc0b: 0x2fd1, + 0xc0c: 0x2cc3, 0xc0d: 0x2bf0, 0xc0e: 0x3006, 0xc0f: 0x2aa7, 0xc10: 0x2ab1, 0xc11: 0x2bfd, + 0xc12: 0x281c, 0xc13: 0x2c0a, 0xc14: 0x2cd3, 0xc15: 0x2823, 0xc16: 0x2da0, 0xc17: 0x2abb, + 0xc18: 0x1de7, 0xc19: 0x1dfb, 0xc1a: 0x1e0a, 0xc1b: 0x1e19, 0xc1c: 0x1e28, 0xc1d: 0x1e37, + 0xc1e: 0x1e46, 0xc1f: 0x1e55, 0xc20: 0x1e64, 0xc21: 0x1e73, 0xc22: 0x22c2, 0xc23: 0x22d4, + 0xc24: 0x22e6, 0xc25: 0x22f2, 0xc26: 0x22fe, 0xc27: 0x230a, 0xc28: 0x2316, 0xc29: 0x2322, + 0xc2a: 0x232e, 0xc2b: 0x233a, 0xc2c: 0x2376, 0xc2d: 0x2382, 0xc2e: 0x238e, 0xc2f: 0x239a, + 0xc30: 0x23a6, 0xc31: 0x1d44, 0xc32: 0x1af6, 0xc33: 0x1a63, 0xc34: 0x1d14, 0xc35: 0x1b77, + 0xc36: 0x1b86, 0xc37: 0x1afc, 0xc38: 0x1d2c, 0xc39: 0x1d30, 0xc3a: 0x1a8d, 0xc3b: 0x2838, + 0xc3c: 0x2846, 0xc3d: 0x2831, 0xc3e: 0x283f, 0xc3f: 0x2c17, + // Block 0x31, offset 0xc40 + 0xc40: 0x1b7a, 0xc41: 0x1b62, 0xc42: 0x1d90, 0xc43: 0x1b4a, 0xc44: 0x1b23, 0xc45: 0x1a96, + 0xc46: 0x1aa5, 0xc47: 0x1a75, 0xc48: 0x1d20, 0xc49: 0x1e82, 0xc4a: 0x1b7d, 0xc4b: 0x1b65, + 0xc4c: 0x1d94, 0xc4d: 0x1da0, 0xc4e: 0x1b56, 0xc4f: 0x1b2c, 0xc50: 0x1a84, 0xc51: 0x1d4c, + 0xc52: 0x1ce0, 0xc53: 0x1ccc, 0xc54: 0x1cfc, 0xc55: 0x1da4, 0xc56: 0x1b59, 0xc57: 0x1af9, + 0xc58: 0x1b2f, 0xc59: 0x1b0e, 0xc5a: 0x1b71, 0xc5b: 0x1da8, 0xc5c: 0x1b5c, 0xc5d: 0x1af0, + 0xc5e: 0x1b32, 0xc5f: 0x1d6c, 0xc60: 0x1d24, 0xc61: 0x1b44, 0xc62: 0x1d54, 0xc63: 0x1d70, + 0xc64: 0x1d28, 0xc65: 0x1b47, 0xc66: 0x1d58, 0xc67: 0x2418, 0xc68: 0x242c, 0xc69: 0x1ac6, + 0xc6a: 0x1d50, 0xc6b: 0x1ce4, 0xc6c: 0x1cd0, 0xc6d: 0x1d78, 0xc6e: 0x284d, 0xc6f: 0x28e4, + 0xc70: 0x1b89, 0xc71: 0x1b74, 0xc72: 0x1dac, 0xc73: 0x1b5f, 0xc74: 0x1b80, 0xc75: 0x1b68, + 0xc76: 0x1d98, 0xc77: 0x1b4d, 0xc78: 0x1b26, 0xc79: 0x1ab1, 0xc7a: 0x1b83, 0xc7b: 0x1b6b, + 0xc7c: 0x1d9c, 0xc7d: 0x1b50, 0xc7e: 0x1b29, 0xc7f: 0x1ab4, + // Block 0x32, offset 0xc80 + 0xc80: 0x1d5c, 0xc81: 0x1ce8, 0xc82: 0x1e7d, 0xc83: 0x1a66, 0xc84: 0x1aea, 0xc85: 0x1aed, + 0xc86: 0x2425, 0xc87: 0x1cc4, 0xc88: 0x1af3, 0xc89: 0x1a78, 0xc8a: 0x1b11, 0xc8b: 0x1a7b, + 0xc8c: 0x1b1a, 0xc8d: 0x1a99, 0xc8e: 0x1a9c, 0xc8f: 0x1b35, 0xc90: 0x1b3b, 0xc91: 0x1b3e, + 0xc92: 0x1d60, 0xc93: 0x1b41, 0xc94: 0x1b53, 0xc95: 0x1d68, 0xc96: 0x1d74, 0xc97: 0x1ac0, + 0xc98: 0x1e87, 0xc99: 0x1cec, 0xc9a: 0x1ac3, 0xc9b: 0x1b8c, 0xc9c: 0x1ad5, 0xc9d: 0x1ae4, + 0xc9e: 0x2412, 0xc9f: 0x240c, 0xca0: 0x1df1, 0xca1: 0x1e00, 0xca2: 0x1e0f, 0xca3: 0x1e1e, + 0xca4: 0x1e2d, 0xca5: 0x1e3c, 0xca6: 0x1e4b, 0xca7: 0x1e5a, 0xca8: 0x1e69, 0xca9: 0x22b6, + 0xcaa: 0x22c8, 0xcab: 0x22da, 0xcac: 0x22ec, 0xcad: 0x22f8, 0xcae: 0x2304, 0xcaf: 0x2310, + 0xcb0: 0x231c, 0xcb1: 0x2328, 0xcb2: 0x2334, 0xcb3: 0x2370, 0xcb4: 0x237c, 0xcb5: 0x2388, + 0xcb6: 0x2394, 0xcb7: 0x23a0, 0xcb8: 0x23ac, 0xcb9: 0x23b2, 0xcba: 0x23b8, 0xcbb: 0x23be, + 0xcbc: 0x23c4, 0xcbd: 0x23d6, 0xcbe: 0x23dc, 0xcbf: 0x1d40, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x1472, 0xcc1: 0x0df6, 0xcc2: 0x14ce, 0xcc3: 0x149a, 0xcc4: 0x0f52, 0xcc5: 0x07e6, + 0xcc6: 0x09da, 0xcc7: 0x1726, 0xcc8: 0x1726, 0xcc9: 0x0b06, 0xcca: 0x155a, 0xccb: 0x0a3e, + 0xccc: 0x0b02, 0xccd: 0x0cea, 0xcce: 0x10ca, 0xccf: 0x125a, 0xcd0: 0x1392, 0xcd1: 0x13ce, + 0xcd2: 0x1402, 0xcd3: 0x1516, 0xcd4: 0x0e6e, 0xcd5: 0x0efa, 0xcd6: 0x0fa6, 0xcd7: 0x103e, + 0xcd8: 0x135a, 0xcd9: 0x1542, 0xcda: 0x166e, 0xcdb: 0x080a, 0xcdc: 0x09ae, 0xcdd: 0x0e82, + 0xcde: 0x0fca, 0xcdf: 0x138e, 0xce0: 0x16be, 0xce1: 0x0bae, 0xce2: 0x0f72, 0xce3: 0x137e, + 0xce4: 0x1412, 0xce5: 0x0d1e, 0xce6: 0x12b6, 0xce7: 0x13da, 0xce8: 0x0c1a, 0xce9: 0x0e0a, + 0xcea: 0x0f12, 0xceb: 0x1016, 0xcec: 0x1522, 0xced: 0x084a, 0xcee: 0x08e2, 0xcef: 0x094e, + 0xcf0: 0x0d86, 0xcf1: 0x0e7a, 0xcf2: 0x0fc6, 0xcf3: 0x10ea, 0xcf4: 0x1272, 0xcf5: 0x1386, + 0xcf6: 0x139e, 0xcf7: 0x14c2, 0xcf8: 0x15ea, 0xcf9: 0x169e, 0xcfa: 0x16ba, 0xcfb: 0x1126, + 0xcfc: 0x1166, 0xcfd: 0x121e, 0xcfe: 0x133e, 0xcff: 0x1576, + // Block 0x34, offset 0xd00 + 0xd00: 0x16c6, 0xd01: 0x1446, 0xd02: 0x0ac2, 0xd03: 0x0c36, 0xd04: 0x11d6, 0xd05: 0x1296, + 0xd06: 0x0ffa, 0xd07: 0x112e, 0xd08: 0x1492, 0xd09: 0x15e2, 0xd0a: 0x0abe, 0xd0b: 0x0b8a, + 0xd0c: 0x0e72, 0xd0d: 0x0f26, 0xd0e: 0x0f5a, 0xd0f: 0x120e, 0xd10: 0x1236, 0xd11: 0x15a2, + 0xd12: 0x094a, 0xd13: 0x12a2, 0xd14: 0x08ee, 0xd15: 0x08ea, 0xd16: 0x1192, 0xd17: 0x1222, + 0xd18: 0x1356, 0xd19: 0x15aa, 0xd1a: 0x1462, 0xd1b: 0x0d22, 0xd1c: 0x0e6e, 0xd1d: 0x1452, + 0xd1e: 0x07f2, 0xd1f: 0x0b5e, 0xd20: 0x0c8e, 0xd21: 0x102a, 0xd22: 0x10aa, 0xd23: 0x096e, + 0xd24: 0x1136, 0xd25: 0x085a, 0xd26: 0x0c72, 0xd27: 0x07d2, 0xd28: 0x0ee6, 0xd29: 0x0d9e, + 0xd2a: 0x120a, 0xd2b: 0x09c2, 0xd2c: 0x0aae, 0xd2d: 0x10f6, 0xd2e: 0x135e, 0xd2f: 0x1436, + 0xd30: 0x0eb2, 0xd31: 0x14f2, 0xd32: 0x0ede, 0xd33: 0x0d32, 0xd34: 0x1316, 0xd35: 0x0d52, + 0xd36: 0x10a6, 0xd37: 0x0826, 0xd38: 0x08a2, 0xd39: 0x08e6, 0xd3a: 0x0e4e, 0xd3b: 0x11f6, + 0xd3c: 0x12ee, 0xd3d: 0x1442, 0xd3e: 0x1556, 0xd3f: 0x0956, + // Block 0x35, offset 0xd40 + 0xd40: 0x0a0a, 0xd41: 0x0b12, 0xd42: 0x0c2a, 0xd43: 0x0dba, 0xd44: 0x0f76, 0xd45: 0x113a, + 0xd46: 0x1592, 0xd47: 0x1676, 0xd48: 0x16ca, 0xd49: 0x16e2, 0xd4a: 0x0932, 0xd4b: 0x0dee, + 0xd4c: 0x0e9e, 0xd4d: 0x14e6, 0xd4e: 0x0bf6, 0xd4f: 0x0cd2, 0xd50: 0x0cee, 0xd51: 0x0d7e, + 0xd52: 0x0f66, 0xd53: 0x0fb2, 0xd54: 0x1062, 0xd55: 0x1186, 0xd56: 0x122a, 0xd57: 0x128e, + 0xd58: 0x14d6, 0xd59: 0x1366, 0xd5a: 0x14fe, 0xd5b: 0x157a, 0xd5c: 0x090a, 0xd5d: 0x0936, + 0xd5e: 0x0a1e, 0xd5f: 0x0fa2, 0xd60: 0x13ee, 0xd61: 0x1436, 0xd62: 0x0c16, 0xd63: 0x0c86, + 0xd64: 0x0d4a, 0xd65: 0x0eaa, 0xd66: 0x11d2, 0xd67: 0x101e, 0xd68: 0x0836, 0xd69: 0x0a7a, + 0xd6a: 0x0b5e, 0xd6b: 0x0bc2, 0xd6c: 0x0c92, 0xd6d: 0x103a, 0xd6e: 0x1056, 0xd6f: 0x1266, + 0xd70: 0x1286, 0xd71: 0x155e, 0xd72: 0x15de, 0xd73: 0x15ee, 0xd74: 0x162a, 0xd75: 0x084e, + 0xd76: 0x117a, 0xd77: 0x154a, 0xd78: 0x15c6, 0xd79: 0x0caa, 0xd7a: 0x0812, 0xd7b: 0x0872, + 0xd7c: 0x0b62, 0xd7d: 0x0b82, 0xd7e: 0x0daa, 0xd7f: 0x0e6e, + // Block 0x36, offset 0xd80 + 0xd80: 0x0fbe, 0xd81: 0x10c6, 0xd82: 0x1372, 0xd83: 0x1512, 0xd84: 0x171e, 0xd85: 0x0dde, + 0xd86: 0x159e, 0xd87: 0x092e, 0xd88: 0x0e2a, 0xd89: 0x0e36, 0xd8a: 0x0f0a, 0xd8b: 0x0f42, + 0xd8c: 0x1046, 0xd8d: 0x10a2, 0xd8e: 0x1122, 0xd8f: 0x1206, 0xd90: 0x1636, 0xd91: 0x08aa, + 0xd92: 0x0cfe, 0xd93: 0x15ae, 0xd94: 0x0862, 0xd95: 0x0ba6, 0xd96: 0x0f2a, 0xd97: 0x14da, + 0xd98: 0x0c62, 0xd99: 0x0cb2, 0xd9a: 0x0e3e, 0xd9b: 0x102a, 0xd9c: 0x15b6, 0xd9d: 0x0912, + 0xd9e: 0x09fa, 0xd9f: 0x0b92, 0xda0: 0x0dce, 0xda1: 0x0e1a, 0xda2: 0x0e5a, 0xda3: 0x0eee, + 0xda4: 0x1042, 0xda5: 0x10b6, 0xda6: 0x1252, 0xda7: 0x13f2, 0xda8: 0x13fe, 0xda9: 0x1552, + 0xdaa: 0x15d2, 0xdab: 0x097e, 0xdac: 0x0f46, 0xdad: 0x09fe, 0xdae: 0x0fc2, 0xdaf: 0x1066, + 0xdb0: 0x1382, 0xdb1: 0x15ba, 0xdb2: 0x16a6, 0xdb3: 0x16ce, 0xdb4: 0x0e32, 0xdb5: 0x0f22, + 0xdb6: 0x12be, 0xdb7: 0x11b2, 0xdb8: 0x11be, 0xdb9: 0x11e2, 0xdba: 0x1012, 0xdbb: 0x0f9a, + 0xdbc: 0x145e, 0xdbd: 0x082e, 0xdbe: 0x1326, 0xdbf: 0x0916, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0906, 0xdc1: 0x0c06, 0xdc2: 0x0d26, 0xdc3: 0x11ee, 0xdc4: 0x0b4e, 0xdc5: 0x0efe, + 0xdc6: 0x0dea, 0xdc7: 0x14e2, 0xdc8: 0x13e2, 0xdc9: 0x15a6, 0xdca: 0x141e, 0xdcb: 0x0c22, + 0xdcc: 0x0882, 0xdcd: 0x0a56, 0xdd0: 0x0aaa, + 0xdd2: 0x0dda, 0xdd5: 0x08f2, 0xdd6: 0x101a, 0xdd7: 0x10de, + 0xdd8: 0x1142, 0xdd9: 0x115e, 0xdda: 0x1162, 0xddb: 0x1176, 0xddc: 0x15f6, 0xddd: 0x11e6, + 0xdde: 0x126a, 0xde0: 0x138a, 0xde2: 0x144e, + 0xde5: 0x1502, 0xde6: 0x152e, + 0xdea: 0x164a, 0xdeb: 0x164e, 0xdec: 0x1652, 0xded: 0x16b6, 0xdee: 0x1526, 0xdef: 0x15c2, + 0xdf0: 0x0852, 0xdf1: 0x0876, 0xdf2: 0x088a, 0xdf3: 0x0946, 0xdf4: 0x0952, 0xdf5: 0x0992, + 0xdf6: 0x0a46, 0xdf7: 0x0a62, 0xdf8: 0x0a6a, 0xdf9: 0x0aa6, 0xdfa: 0x0ab2, 0xdfb: 0x0b8e, + 0xdfc: 0x0b96, 0xdfd: 0x0c9e, 0xdfe: 0x0cc6, 0xdff: 0x0cce, + // Block 0x38, offset 0xe00 + 0xe00: 0x0ce6, 0xe01: 0x0d92, 0xe02: 0x0dc2, 0xe03: 0x0de2, 0xe04: 0x0e52, 0xe05: 0x0f16, + 0xe06: 0x0f32, 0xe07: 0x0f62, 0xe08: 0x0fb6, 0xe09: 0x0fd6, 0xe0a: 0x104a, 0xe0b: 0x112a, + 0xe0c: 0x1146, 0xe0d: 0x114e, 0xe0e: 0x114a, 0xe0f: 0x1152, 0xe10: 0x1156, 0xe11: 0x115a, + 0xe12: 0x116e, 0xe13: 0x1172, 0xe14: 0x1196, 0xe15: 0x11aa, 0xe16: 0x11c6, 0xe17: 0x122a, + 0xe18: 0x1232, 0xe19: 0x123a, 0xe1a: 0x124e, 0xe1b: 0x1276, 0xe1c: 0x12c6, 0xe1d: 0x12fa, + 0xe1e: 0x12fa, 0xe1f: 0x1362, 0xe20: 0x140a, 0xe21: 0x1422, 0xe22: 0x1456, 0xe23: 0x145a, + 0xe24: 0x149e, 0xe25: 0x14a2, 0xe26: 0x14fa, 0xe27: 0x1502, 0xe28: 0x15d6, 0xe29: 0x161a, + 0xe2a: 0x1632, 0xe2b: 0x0c96, 0xe2c: 0x184b, 0xe2d: 0x12de, + 0xe30: 0x07da, 0xe31: 0x08de, 0xe32: 0x089e, 0xe33: 0x0846, 0xe34: 0x0886, 0xe35: 0x08b2, + 0xe36: 0x0942, 0xe37: 0x095e, 0xe38: 0x0a46, 0xe39: 0x0a32, 0xe3a: 0x0a42, 0xe3b: 0x0a5e, + 0xe3c: 0x0aaa, 0xe3d: 0x0aba, 0xe3e: 0x0afe, 0xe3f: 0x0b0a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0b26, 0xe41: 0x0b36, 0xe42: 0x0c1e, 0xe43: 0x0c26, 0xe44: 0x0c56, 0xe45: 0x0c76, + 0xe46: 0x0ca6, 0xe47: 0x0cbe, 0xe48: 0x0cae, 0xe49: 0x0cce, 0xe4a: 0x0cc2, 0xe4b: 0x0ce6, + 0xe4c: 0x0d02, 0xe4d: 0x0d5a, 0xe4e: 0x0d66, 0xe4f: 0x0d6e, 0xe50: 0x0d96, 0xe51: 0x0dda, + 0xe52: 0x0e0a, 0xe53: 0x0e0e, 0xe54: 0x0e22, 0xe55: 0x0ea2, 0xe56: 0x0eb2, 0xe57: 0x0f0a, + 0xe58: 0x0f56, 0xe59: 0x0f4e, 0xe5a: 0x0f62, 0xe5b: 0x0f7e, 0xe5c: 0x0fb6, 0xe5d: 0x110e, + 0xe5e: 0x0fda, 0xe5f: 0x100e, 0xe60: 0x101a, 0xe61: 0x105a, 0xe62: 0x1076, 0xe63: 0x109a, + 0xe64: 0x10be, 0xe65: 0x10c2, 0xe66: 0x10de, 0xe67: 0x10e2, 0xe68: 0x10f2, 0xe69: 0x1106, + 0xe6a: 0x1102, 0xe6b: 0x1132, 0xe6c: 0x11ae, 0xe6d: 0x11c6, 0xe6e: 0x11de, 0xe6f: 0x1216, + 0xe70: 0x122a, 0xe71: 0x1246, 0xe72: 0x1276, 0xe73: 0x132a, 0xe74: 0x1352, 0xe75: 0x13c6, + 0xe76: 0x140e, 0xe77: 0x141a, 0xe78: 0x1422, 0xe79: 0x143a, 0xe7a: 0x144e, 0xe7b: 0x143e, + 0xe7c: 0x1456, 0xe7d: 0x1452, 0xe7e: 0x144a, 0xe7f: 0x145a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x1466, 0xe81: 0x14a2, 0xe82: 0x14de, 0xe83: 0x150e, 0xe84: 0x1546, 0xe85: 0x1566, + 0xe86: 0x15b2, 0xe87: 0x15d6, 0xe88: 0x15f6, 0xe89: 0x160a, 0xe8a: 0x161a, 0xe8b: 0x1626, + 0xe8c: 0x1632, 0xe8d: 0x1686, 0xe8e: 0x1726, 0xe8f: 0x17e2, 0xe90: 0x17dd, 0xe91: 0x180f, + 0xe92: 0x0702, 0xe93: 0x072a, 0xe94: 0x072e, 0xe95: 0x1891, 0xe96: 0x18be, 0xe97: 0x1936, + 0xe98: 0x1712, 0xe99: 0x1722, + // Block 0x3b, offset 0xec0 + 0xec0: 0x1b05, 0xec1: 0x1b08, 0xec2: 0x1b0b, 0xec3: 0x1d38, 0xec4: 0x1d3c, 0xec5: 0x1b8f, + 0xec6: 0x1b8f, + 0xed3: 0x1ea5, 0xed4: 0x1e96, 0xed5: 0x1e9b, 0xed6: 0x1eaa, 0xed7: 0x1ea0, + 0xedd: 0x44d1, + 0xede: 0x8116, 0xedf: 0x4543, 0xee0: 0x0320, 0xee1: 0x0308, 0xee2: 0x0311, 0xee3: 0x0314, + 0xee4: 0x0317, 0xee5: 0x031a, 0xee6: 0x031d, 0xee7: 0x0323, 0xee8: 0x0326, 0xee9: 0x0017, + 0xeea: 0x4531, 0xeeb: 0x4537, 0xeec: 0x4635, 0xeed: 0x463d, 0xeee: 0x4489, 0xeef: 0x448f, + 0xef0: 0x4495, 0xef1: 0x449b, 0xef2: 0x44a7, 0xef3: 0x44ad, 0xef4: 0x44b3, 0xef5: 0x44bf, + 0xef6: 0x44c5, 0xef8: 0x44cb, 0xef9: 0x44d7, 0xefa: 0x44dd, 0xefb: 0x44e3, + 0xefc: 0x44ef, 0xefe: 0x44f5, + // Block 0x3c, offset 0xf00 + 0xf00: 0x44fb, 0xf01: 0x4501, 0xf03: 0x4507, 0xf04: 0x450d, + 0xf06: 0x4519, 0xf07: 0x451f, 0xf08: 0x4525, 0xf09: 0x452b, 0xf0a: 0x453d, 0xf0b: 0x44b9, + 0xf0c: 0x44a1, 0xf0d: 0x44e9, 0xf0e: 0x4513, 0xf0f: 0x1eaf, 0xf10: 0x038c, 0xf11: 0x038c, + 0xf12: 0x0395, 0xf13: 0x0395, 0xf14: 0x0395, 0xf15: 0x0395, 0xf16: 0x0398, 0xf17: 0x0398, + 0xf18: 0x0398, 0xf19: 0x0398, 0xf1a: 0x039e, 0xf1b: 0x039e, 0xf1c: 0x039e, 0xf1d: 0x039e, + 0xf1e: 0x0392, 0xf1f: 0x0392, 0xf20: 0x0392, 0xf21: 0x0392, 0xf22: 0x039b, 0xf23: 0x039b, + 0xf24: 0x039b, 0xf25: 0x039b, 0xf26: 0x038f, 0xf27: 0x038f, 0xf28: 0x038f, 0xf29: 0x038f, + 0xf2a: 0x03c2, 0xf2b: 0x03c2, 0xf2c: 0x03c2, 0xf2d: 0x03c2, 0xf2e: 0x03c5, 0xf2f: 0x03c5, + 0xf30: 0x03c5, 0xf31: 0x03c5, 0xf32: 0x03a4, 0xf33: 0x03a4, 0xf34: 0x03a4, 0xf35: 0x03a4, + 0xf36: 0x03a1, 0xf37: 0x03a1, 0xf38: 0x03a1, 0xf39: 0x03a1, 0xf3a: 0x03a7, 0xf3b: 0x03a7, + 0xf3c: 0x03a7, 0xf3d: 0x03a7, 0xf3e: 0x03aa, 0xf3f: 0x03aa, + // Block 0x3d, offset 0xf40 + 0xf40: 0x03aa, 0xf41: 0x03aa, 0xf42: 0x03b3, 0xf43: 0x03b3, 0xf44: 0x03b0, 0xf45: 0x03b0, + 0xf46: 0x03b6, 0xf47: 0x03b6, 0xf48: 0x03ad, 0xf49: 0x03ad, 0xf4a: 0x03bc, 0xf4b: 0x03bc, + 0xf4c: 0x03b9, 0xf4d: 0x03b9, 0xf4e: 0x03c8, 0xf4f: 0x03c8, 0xf50: 0x03c8, 0xf51: 0x03c8, + 0xf52: 0x03ce, 0xf53: 0x03ce, 0xf54: 0x03ce, 0xf55: 0x03ce, 0xf56: 0x03d4, 0xf57: 0x03d4, + 0xf58: 0x03d4, 0xf59: 0x03d4, 0xf5a: 0x03d1, 0xf5b: 0x03d1, 0xf5c: 0x03d1, 0xf5d: 0x03d1, + 0xf5e: 0x03d7, 0xf5f: 0x03d7, 0xf60: 0x03da, 0xf61: 0x03da, 0xf62: 0x03da, 0xf63: 0x03da, + 0xf64: 0x45af, 0xf65: 0x45af, 0xf66: 0x03e0, 0xf67: 0x03e0, 0xf68: 0x03e0, 0xf69: 0x03e0, + 0xf6a: 0x03dd, 0xf6b: 0x03dd, 0xf6c: 0x03dd, 0xf6d: 0x03dd, 0xf6e: 0x03fb, 0xf6f: 0x03fb, + 0xf70: 0x45a9, 0xf71: 0x45a9, + // Block 0x3e, offset 0xf80 + 0xf93: 0x03cb, 0xf94: 0x03cb, 0xf95: 0x03cb, 0xf96: 0x03cb, 0xf97: 0x03e9, + 0xf98: 0x03e9, 0xf99: 0x03e6, 0xf9a: 0x03e6, 0xf9b: 0x03ec, 0xf9c: 0x03ec, 0xf9d: 0x217f, + 0xf9e: 0x03f2, 0xf9f: 0x03f2, 0xfa0: 0x03e3, 0xfa1: 0x03e3, 0xfa2: 0x03ef, 0xfa3: 0x03ef, + 0xfa4: 0x03f8, 0xfa5: 0x03f8, 0xfa6: 0x03f8, 0xfa7: 0x03f8, 0xfa8: 0x0380, 0xfa9: 0x0380, + 0xfaa: 0x26da, 0xfab: 0x26da, 0xfac: 0x274a, 0xfad: 0x274a, 0xfae: 0x2719, 0xfaf: 0x2719, + 0xfb0: 0x2735, 0xfb1: 0x2735, 0xfb2: 0x272e, 0xfb3: 0x272e, 0xfb4: 0x273c, 0xfb5: 0x273c, + 0xfb6: 0x2743, 0xfb7: 0x2743, 0xfb8: 0x2743, 0xfb9: 0x2720, 0xfba: 0x2720, 0xfbb: 0x2720, + 0xfbc: 0x03f5, 0xfbd: 0x03f5, 0xfbe: 0x03f5, 0xfbf: 0x03f5, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x26e1, 0xfc1: 0x26e8, 0xfc2: 0x2704, 0xfc3: 0x2720, 0xfc4: 0x2727, 0xfc5: 0x1eb9, + 0xfc6: 0x1ebe, 0xfc7: 0x1ec3, 0xfc8: 0x1ed2, 0xfc9: 0x1ee1, 0xfca: 0x1ee6, 0xfcb: 0x1eeb, + 0xfcc: 0x1ef0, 0xfcd: 0x1ef5, 0xfce: 0x1f04, 0xfcf: 0x1f13, 0xfd0: 0x1f18, 0xfd1: 0x1f1d, + 0xfd2: 0x1f2c, 0xfd3: 0x1f3b, 0xfd4: 0x1f40, 0xfd5: 0x1f45, 0xfd6: 0x1f4a, 0xfd7: 0x1f59, + 0xfd8: 0x1f5e, 0xfd9: 0x1f6d, 0xfda: 0x1f72, 0xfdb: 0x1f77, 0xfdc: 0x1f86, 0xfdd: 0x1f8b, + 0xfde: 0x1f90, 0xfdf: 0x1f9a, 0xfe0: 0x1fd6, 0xfe1: 0x1fe5, 0xfe2: 0x1ff4, 0xfe3: 0x1ff9, + 0xfe4: 0x1ffe, 0xfe5: 0x2008, 0xfe6: 0x2017, 0xfe7: 0x201c, 0xfe8: 0x202b, 0xfe9: 0x2030, + 0xfea: 0x2035, 0xfeb: 0x2044, 0xfec: 0x2049, 0xfed: 0x2058, 0xfee: 0x205d, 0xfef: 0x2062, + 0xff0: 0x2067, 0xff1: 0x206c, 0xff2: 0x2071, 0xff3: 0x2076, 0xff4: 0x207b, 0xff5: 0x2080, + 0xff6: 0x2085, 0xff7: 0x208a, 0xff8: 0x208f, 0xff9: 0x2094, 0xffa: 0x2099, 0xffb: 0x209e, + 0xffc: 0x20a3, 0xffd: 0x20a8, 0xffe: 0x20ad, 0xfff: 0x20b7, + // Block 0x40, offset 0x1000 + 0x1000: 0x20bc, 0x1001: 0x20c1, 0x1002: 0x20c6, 0x1003: 0x20d0, 0x1004: 0x20d5, 0x1005: 0x20df, + 0x1006: 0x20e4, 0x1007: 0x20e9, 0x1008: 0x20ee, 0x1009: 0x20f3, 0x100a: 0x20f8, 0x100b: 0x20fd, + 0x100c: 0x2102, 0x100d: 0x2107, 0x100e: 0x2116, 0x100f: 0x2125, 0x1010: 0x212a, 0x1011: 0x212f, + 0x1012: 0x2134, 0x1013: 0x2139, 0x1014: 0x213e, 0x1015: 0x2148, 0x1016: 0x214d, 0x1017: 0x2152, + 0x1018: 0x2161, 0x1019: 0x2170, 0x101a: 0x2175, 0x101b: 0x4561, 0x101c: 0x4567, 0x101d: 0x459d, + 0x101e: 0x45f4, 0x101f: 0x45fb, 0x1020: 0x4602, 0x1021: 0x4609, 0x1022: 0x4610, 0x1023: 0x4617, + 0x1024: 0x26f6, 0x1025: 0x26fd, 0x1026: 0x2704, 0x1027: 0x270b, 0x1028: 0x2720, 0x1029: 0x2727, + 0x102a: 0x1ec8, 0x102b: 0x1ecd, 0x102c: 0x1ed2, 0x102d: 0x1ed7, 0x102e: 0x1ee1, 0x102f: 0x1ee6, + 0x1030: 0x1efa, 0x1031: 0x1eff, 0x1032: 0x1f04, 0x1033: 0x1f09, 0x1034: 0x1f13, 0x1035: 0x1f18, + 0x1036: 0x1f22, 0x1037: 0x1f27, 0x1038: 0x1f2c, 0x1039: 0x1f31, 0x103a: 0x1f3b, 0x103b: 0x1f40, + 0x103c: 0x206c, 0x103d: 0x2071, 0x103e: 0x2080, 0x103f: 0x2085, + // Block 0x41, offset 0x1040 + 0x1040: 0x208a, 0x1041: 0x209e, 0x1042: 0x20a3, 0x1043: 0x20a8, 0x1044: 0x20ad, 0x1045: 0x20c6, + 0x1046: 0x20d0, 0x1047: 0x20d5, 0x1048: 0x20da, 0x1049: 0x20ee, 0x104a: 0x210c, 0x104b: 0x2111, + 0x104c: 0x2116, 0x104d: 0x211b, 0x104e: 0x2125, 0x104f: 0x212a, 0x1050: 0x459d, 0x1051: 0x2157, + 0x1052: 0x215c, 0x1053: 0x2161, 0x1054: 0x2166, 0x1055: 0x2170, 0x1056: 0x2175, 0x1057: 0x26e1, + 0x1058: 0x26e8, 0x1059: 0x26ef, 0x105a: 0x2704, 0x105b: 0x2712, 0x105c: 0x1eb9, 0x105d: 0x1ebe, + 0x105e: 0x1ec3, 0x105f: 0x1ed2, 0x1060: 0x1edc, 0x1061: 0x1eeb, 0x1062: 0x1ef0, 0x1063: 0x1ef5, + 0x1064: 0x1f04, 0x1065: 0x1f0e, 0x1066: 0x1f2c, 0x1067: 0x1f45, 0x1068: 0x1f4a, 0x1069: 0x1f59, + 0x106a: 0x1f5e, 0x106b: 0x1f6d, 0x106c: 0x1f77, 0x106d: 0x1f86, 0x106e: 0x1f8b, 0x106f: 0x1f90, + 0x1070: 0x1f9a, 0x1071: 0x1fd6, 0x1072: 0x1fdb, 0x1073: 0x1fe5, 0x1074: 0x1ff4, 0x1075: 0x1ff9, + 0x1076: 0x1ffe, 0x1077: 0x2008, 0x1078: 0x2017, 0x1079: 0x202b, 0x107a: 0x2030, 0x107b: 0x2035, + 0x107c: 0x2044, 0x107d: 0x2049, 0x107e: 0x2058, 0x107f: 0x205d, + // Block 0x42, offset 0x1080 + 0x1080: 0x2062, 0x1081: 0x2067, 0x1082: 0x2076, 0x1083: 0x207b, 0x1084: 0x208f, 0x1085: 0x2094, + 0x1086: 0x2099, 0x1087: 0x209e, 0x1088: 0x20a3, 0x1089: 0x20b7, 0x108a: 0x20bc, 0x108b: 0x20c1, + 0x108c: 0x20c6, 0x108d: 0x20cb, 0x108e: 0x20df, 0x108f: 0x20e4, 0x1090: 0x20e9, 0x1091: 0x20ee, + 0x1092: 0x20fd, 0x1093: 0x2102, 0x1094: 0x2107, 0x1095: 0x2116, 0x1096: 0x2120, 0x1097: 0x212f, + 0x1098: 0x2134, 0x1099: 0x4591, 0x109a: 0x2148, 0x109b: 0x214d, 0x109c: 0x2152, 0x109d: 0x2161, + 0x109e: 0x216b, 0x109f: 0x2704, 0x10a0: 0x2712, 0x10a1: 0x1ed2, 0x10a2: 0x1edc, 0x10a3: 0x1f04, + 0x10a4: 0x1f0e, 0x10a5: 0x1f2c, 0x10a6: 0x1f36, 0x10a7: 0x1f9a, 0x10a8: 0x1f9f, 0x10a9: 0x1fc2, + 0x10aa: 0x1fc7, 0x10ab: 0x209e, 0x10ac: 0x20a3, 0x10ad: 0x20c6, 0x10ae: 0x2116, 0x10af: 0x2120, + 0x10b0: 0x2161, 0x10b1: 0x216b, 0x10b2: 0x4645, 0x10b3: 0x464d, 0x10b4: 0x4655, 0x10b5: 0x2021, + 0x10b6: 0x2026, 0x10b7: 0x203a, 0x10b8: 0x203f, 0x10b9: 0x204e, 0x10ba: 0x2053, 0x10bb: 0x1fa4, + 0x10bc: 0x1fa9, 0x10bd: 0x1fcc, 0x10be: 0x1fd1, 0x10bf: 0x1f63, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x1f68, 0x10c1: 0x1f4f, 0x10c2: 0x1f54, 0x10c3: 0x1f7c, 0x10c4: 0x1f81, 0x10c5: 0x1fea, + 0x10c6: 0x1fef, 0x10c7: 0x200d, 0x10c8: 0x2012, 0x10c9: 0x1fae, 0x10ca: 0x1fb3, 0x10cb: 0x1fb8, + 0x10cc: 0x1fc2, 0x10cd: 0x1fbd, 0x10ce: 0x1f95, 0x10cf: 0x1fe0, 0x10d0: 0x2003, 0x10d1: 0x2021, + 0x10d2: 0x2026, 0x10d3: 0x203a, 0x10d4: 0x203f, 0x10d5: 0x204e, 0x10d6: 0x2053, 0x10d7: 0x1fa4, + 0x10d8: 0x1fa9, 0x10d9: 0x1fcc, 0x10da: 0x1fd1, 0x10db: 0x1f63, 0x10dc: 0x1f68, 0x10dd: 0x1f4f, + 0x10de: 0x1f54, 0x10df: 0x1f7c, 0x10e0: 0x1f81, 0x10e1: 0x1fea, 0x10e2: 0x1fef, 0x10e3: 0x200d, + 0x10e4: 0x2012, 0x10e5: 0x1fae, 0x10e6: 0x1fb3, 0x10e7: 0x1fb8, 0x10e8: 0x1fc2, 0x10e9: 0x1fbd, + 0x10ea: 0x1f95, 0x10eb: 0x1fe0, 0x10ec: 0x2003, 0x10ed: 0x1fae, 0x10ee: 0x1fb3, 0x10ef: 0x1fb8, + 0x10f0: 0x1fc2, 0x10f1: 0x1f9f, 0x10f2: 0x1fc7, 0x10f3: 0x201c, 0x10f4: 0x1f86, 0x10f5: 0x1f8b, + 0x10f6: 0x1f90, 0x10f7: 0x1fae, 0x10f8: 0x1fb3, 0x10f9: 0x1fb8, 0x10fa: 0x201c, 0x10fb: 0x202b, + 0x10fc: 0x4549, 0x10fd: 0x4549, + // Block 0x44, offset 0x1100 + 0x1110: 0x2441, 0x1111: 0x2456, + 0x1112: 0x2456, 0x1113: 0x245d, 0x1114: 0x2464, 0x1115: 0x2479, 0x1116: 0x2480, 0x1117: 0x2487, + 0x1118: 0x24aa, 0x1119: 0x24aa, 0x111a: 0x24cd, 0x111b: 0x24c6, 0x111c: 0x24e2, 0x111d: 0x24d4, + 0x111e: 0x24db, 0x111f: 0x24fe, 0x1120: 0x24fe, 0x1121: 0x24f7, 0x1122: 0x2505, 0x1123: 0x2505, + 0x1124: 0x252f, 0x1125: 0x252f, 0x1126: 0x254b, 0x1127: 0x2513, 0x1128: 0x2513, 0x1129: 0x250c, + 0x112a: 0x2521, 0x112b: 0x2521, 0x112c: 0x2528, 0x112d: 0x2528, 0x112e: 0x2552, 0x112f: 0x2560, + 0x1130: 0x2560, 0x1131: 0x2567, 0x1132: 0x2567, 0x1133: 0x256e, 0x1134: 0x2575, 0x1135: 0x257c, + 0x1136: 0x2583, 0x1137: 0x2583, 0x1138: 0x258a, 0x1139: 0x2598, 0x113a: 0x25a6, 0x113b: 0x259f, + 0x113c: 0x25ad, 0x113d: 0x25ad, 0x113e: 0x25c2, 0x113f: 0x25c9, + // Block 0x45, offset 0x1140 + 0x1140: 0x25fa, 0x1141: 0x2608, 0x1142: 0x2601, 0x1143: 0x25e5, 0x1144: 0x25e5, 0x1145: 0x260f, + 0x1146: 0x260f, 0x1147: 0x2616, 0x1148: 0x2616, 0x1149: 0x2640, 0x114a: 0x2647, 0x114b: 0x264e, + 0x114c: 0x2624, 0x114d: 0x2632, 0x114e: 0x2655, 0x114f: 0x265c, + 0x1152: 0x262b, 0x1153: 0x26b0, 0x1154: 0x26b7, 0x1155: 0x268d, 0x1156: 0x2694, 0x1157: 0x2678, + 0x1158: 0x2678, 0x1159: 0x267f, 0x115a: 0x26a9, 0x115b: 0x26a2, 0x115c: 0x26cc, 0x115d: 0x26cc, + 0x115e: 0x243a, 0x115f: 0x244f, 0x1160: 0x2448, 0x1161: 0x2472, 0x1162: 0x246b, 0x1163: 0x2495, + 0x1164: 0x248e, 0x1165: 0x24b8, 0x1166: 0x249c, 0x1167: 0x24b1, 0x1168: 0x24e9, 0x1169: 0x2536, + 0x116a: 0x251a, 0x116b: 0x2559, 0x116c: 0x25f3, 0x116d: 0x261d, 0x116e: 0x26c5, 0x116f: 0x26be, + 0x1170: 0x26d3, 0x1171: 0x266a, 0x1172: 0x25d0, 0x1173: 0x269b, 0x1174: 0x25c2, 0x1175: 0x25fa, + 0x1176: 0x2591, 0x1177: 0x25de, 0x1178: 0x2671, 0x1179: 0x2663, 0x117a: 0x25ec, 0x117b: 0x25d7, + 0x117c: 0x25ec, 0x117d: 0x2671, 0x117e: 0x24a3, 0x117f: 0x24bf, + // Block 0x46, offset 0x1180 + 0x1180: 0x2639, 0x1181: 0x25b4, 0x1182: 0x2433, 0x1183: 0x25d7, 0x1184: 0x257c, 0x1185: 0x254b, + 0x1186: 0x24f0, 0x1187: 0x2686, + 0x11b0: 0x2544, 0x11b1: 0x25bb, 0x11b2: 0x28f6, 0x11b3: 0x28ed, 0x11b4: 0x2923, 0x11b5: 0x2911, + 0x11b6: 0x28ff, 0x11b7: 0x291a, 0x11b8: 0x292c, 0x11b9: 0x253d, 0x11ba: 0x2db3, 0x11bb: 0x2c33, + 0x11bc: 0x2908, + // Block 0x47, offset 0x11c0 + 0x11d0: 0x0019, 0x11d1: 0x057e, + 0x11d2: 0x0582, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x05ba, + 0x11d8: 0x05be, 0x11d9: 0x1c8c, + 0x11e0: 0x8133, 0x11e1: 0x8133, 0x11e2: 0x8133, 0x11e3: 0x8133, + 0x11e4: 0x8133, 0x11e5: 0x8133, 0x11e6: 0x8133, 0x11e7: 0x812e, 0x11e8: 0x812e, 0x11e9: 0x812e, + 0x11ea: 0x812e, 0x11eb: 0x812e, 0x11ec: 0x812e, 0x11ed: 0x812e, 0x11ee: 0x8133, 0x11ef: 0x8133, + 0x11f0: 0x19a0, 0x11f1: 0x053a, 0x11f2: 0x0536, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011, + 0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x05b2, 0x11fa: 0x05b6, 0x11fb: 0x05a6, + 0x11fc: 0x05aa, 0x11fd: 0x058e, 0x11fe: 0x0592, 0x11ff: 0x0586, + // Block 0x48, offset 0x1200 + 0x1200: 0x058a, 0x1201: 0x0596, 0x1202: 0x059a, 0x1203: 0x059e, 0x1204: 0x05a2, + 0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x43aa, 0x120a: 0x43aa, 0x120b: 0x43aa, + 0x120c: 0x43aa, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x057e, + 0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003, + 0x1218: 0x053a, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x05b2, + 0x121e: 0x05b6, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b, + 0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009, + 0x122a: 0x000b, 0x122b: 0x0041, + 0x1230: 0x43eb, 0x1231: 0x456d, 0x1232: 0x43f0, 0x1234: 0x43f5, + 0x1236: 0x43fa, 0x1237: 0x4573, 0x1238: 0x43ff, 0x1239: 0x4579, 0x123a: 0x4404, 0x123b: 0x457f, + 0x123c: 0x4409, 0x123d: 0x4585, 0x123e: 0x440e, 0x123f: 0x458b, + // Block 0x49, offset 0x1240 + 0x1240: 0x0329, 0x1241: 0x454f, 0x1242: 0x454f, 0x1243: 0x4555, 0x1244: 0x4555, 0x1245: 0x4597, + 0x1246: 0x4597, 0x1247: 0x455b, 0x1248: 0x455b, 0x1249: 0x45a3, 0x124a: 0x45a3, 0x124b: 0x45a3, + 0x124c: 0x45a3, 0x124d: 0x032c, 0x124e: 0x032c, 0x124f: 0x032f, 0x1250: 0x032f, 0x1251: 0x032f, + 0x1252: 0x032f, 0x1253: 0x0332, 0x1254: 0x0332, 0x1255: 0x0335, 0x1256: 0x0335, 0x1257: 0x0335, + 0x1258: 0x0335, 0x1259: 0x0338, 0x125a: 0x0338, 0x125b: 0x0338, 0x125c: 0x0338, 0x125d: 0x033b, + 0x125e: 0x033b, 0x125f: 0x033b, 0x1260: 0x033b, 0x1261: 0x033e, 0x1262: 0x033e, 0x1263: 0x033e, + 0x1264: 0x033e, 0x1265: 0x0341, 0x1266: 0x0341, 0x1267: 0x0341, 0x1268: 0x0341, 0x1269: 0x0344, + 0x126a: 0x0344, 0x126b: 0x0347, 0x126c: 0x0347, 0x126d: 0x034a, 0x126e: 0x034a, 0x126f: 0x034d, + 0x1270: 0x034d, 0x1271: 0x0350, 0x1272: 0x0350, 0x1273: 0x0350, 0x1274: 0x0350, 0x1275: 0x0353, + 0x1276: 0x0353, 0x1277: 0x0353, 0x1278: 0x0353, 0x1279: 0x0356, 0x127a: 0x0356, 0x127b: 0x0356, + 0x127c: 0x0356, 0x127d: 0x0359, 0x127e: 0x0359, 0x127f: 0x0359, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0359, 0x1281: 0x035c, 0x1282: 0x035c, 0x1283: 0x035c, 0x1284: 0x035c, 0x1285: 0x035f, + 0x1286: 0x035f, 0x1287: 0x035f, 0x1288: 0x035f, 0x1289: 0x0362, 0x128a: 0x0362, 0x128b: 0x0362, + 0x128c: 0x0362, 0x128d: 0x0365, 0x128e: 0x0365, 0x128f: 0x0365, 0x1290: 0x0365, 0x1291: 0x0368, + 0x1292: 0x0368, 0x1293: 0x0368, 0x1294: 0x0368, 0x1295: 0x036b, 0x1296: 0x036b, 0x1297: 0x036b, + 0x1298: 0x036b, 0x1299: 0x036e, 0x129a: 0x036e, 0x129b: 0x036e, 0x129c: 0x036e, 0x129d: 0x0371, + 0x129e: 0x0371, 0x129f: 0x0371, 0x12a0: 0x0371, 0x12a1: 0x0374, 0x12a2: 0x0374, 0x12a3: 0x0374, + 0x12a4: 0x0374, 0x12a5: 0x0377, 0x12a6: 0x0377, 0x12a7: 0x0377, 0x12a8: 0x0377, 0x12a9: 0x037a, + 0x12aa: 0x037a, 0x12ab: 0x037a, 0x12ac: 0x037a, 0x12ad: 0x037d, 0x12ae: 0x037d, 0x12af: 0x0380, + 0x12b0: 0x0380, 0x12b1: 0x0383, 0x12b2: 0x0383, 0x12b3: 0x0383, 0x12b4: 0x0383, 0x12b5: 0x2f41, + 0x12b6: 0x2f41, 0x12b7: 0x2f49, 0x12b8: 0x2f49, 0x12b9: 0x2f51, 0x12ba: 0x2f51, 0x12bb: 0x20b2, + 0x12bc: 0x20b2, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b, + 0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097, + 0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3, + 0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af, + 0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb, + 0x12de: 0x00bd, 0x12df: 0x056e, 0x12e0: 0x0572, 0x12e1: 0x0582, 0x12e2: 0x0596, 0x12e3: 0x059a, + 0x12e4: 0x057e, 0x12e5: 0x06a6, 0x12e6: 0x069e, 0x12e7: 0x05c2, 0x12e8: 0x05ca, 0x12e9: 0x05d2, + 0x12ea: 0x05da, 0x12eb: 0x05e2, 0x12ec: 0x0666, 0x12ed: 0x066e, 0x12ee: 0x0676, 0x12ef: 0x061a, + 0x12f0: 0x06aa, 0x12f1: 0x05c6, 0x12f2: 0x05ce, 0x12f3: 0x05d6, 0x12f4: 0x05de, 0x12f5: 0x05e6, + 0x12f6: 0x05ea, 0x12f7: 0x05ee, 0x12f8: 0x05f2, 0x12f9: 0x05f6, 0x12fa: 0x05fa, 0x12fb: 0x05fe, + 0x12fc: 0x0602, 0x12fd: 0x0606, 0x12fe: 0x060a, 0x12ff: 0x060e, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0612, 0x1301: 0x0616, 0x1302: 0x061e, 0x1303: 0x0622, 0x1304: 0x0626, 0x1305: 0x062a, + 0x1306: 0x062e, 0x1307: 0x0632, 0x1308: 0x0636, 0x1309: 0x063a, 0x130a: 0x063e, 0x130b: 0x0642, + 0x130c: 0x0646, 0x130d: 0x064a, 0x130e: 0x064e, 0x130f: 0x0652, 0x1310: 0x0656, 0x1311: 0x065a, + 0x1312: 0x065e, 0x1313: 0x0662, 0x1314: 0x066a, 0x1315: 0x0672, 0x1316: 0x067a, 0x1317: 0x067e, + 0x1318: 0x0682, 0x1319: 0x0686, 0x131a: 0x068a, 0x131b: 0x068e, 0x131c: 0x0692, 0x131d: 0x06a2, + 0x131e: 0x4bb9, 0x131f: 0x4bbf, 0x1320: 0x04b6, 0x1321: 0x0406, 0x1322: 0x040a, 0x1323: 0x4b7c, + 0x1324: 0x040e, 0x1325: 0x4b82, 0x1326: 0x4b88, 0x1327: 0x0412, 0x1328: 0x0416, 0x1329: 0x041a, + 0x132a: 0x4b8e, 0x132b: 0x4b94, 0x132c: 0x4b9a, 0x132d: 0x4ba0, 0x132e: 0x4ba6, 0x132f: 0x4bac, + 0x1330: 0x045a, 0x1331: 0x041e, 0x1332: 0x0422, 0x1333: 0x0426, 0x1334: 0x046e, 0x1335: 0x042a, + 0x1336: 0x042e, 0x1337: 0x0432, 0x1338: 0x0436, 0x1339: 0x043a, 0x133a: 0x043e, 0x133b: 0x0442, + 0x133c: 0x0446, 0x133d: 0x044a, 0x133e: 0x044e, + // Block 0x4d, offset 0x1340 + 0x1342: 0x4afe, 0x1343: 0x4b04, 0x1344: 0x4b0a, 0x1345: 0x4b10, + 0x1346: 0x4b16, 0x1347: 0x4b1c, 0x134a: 0x4b22, 0x134b: 0x4b28, + 0x134c: 0x4b2e, 0x134d: 0x4b34, 0x134e: 0x4b3a, 0x134f: 0x4b40, + 0x1352: 0x4b46, 0x1353: 0x4b4c, 0x1354: 0x4b52, 0x1355: 0x4b58, 0x1356: 0x4b5e, 0x1357: 0x4b64, + 0x135a: 0x4b6a, 0x135b: 0x4b70, 0x135c: 0x4b76, + 0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x43a5, + 0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x053e, 0x1368: 0x0562, 0x1369: 0x0542, + 0x136a: 0x0546, 0x136b: 0x054a, 0x136c: 0x054e, 0x136d: 0x0566, 0x136e: 0x056a, + // Block 0x4e, offset 0x1380 + 0x1381: 0x01f1, 0x1382: 0x01f4, 0x1383: 0x00d4, 0x1384: 0x01be, 0x1385: 0x010d, + 0x1387: 0x01d3, 0x1388: 0x174e, 0x1389: 0x01d9, 0x138a: 0x01d6, 0x138b: 0x0116, + 0x138c: 0x0119, 0x138d: 0x0526, 0x138e: 0x011c, 0x138f: 0x0128, 0x1390: 0x01e5, 0x1391: 0x013a, + 0x1392: 0x0134, 0x1393: 0x012e, 0x1394: 0x01c1, 0x1395: 0x00e0, 0x1396: 0x01c4, 0x1397: 0x0143, + 0x1398: 0x0194, 0x1399: 0x01e8, 0x139a: 0x01eb, 0x139b: 0x0152, 0x139c: 0x1756, 0x139d: 0x1742, + 0x139e: 0x0158, 0x139f: 0x175b, 0x13a0: 0x01a9, 0x13a1: 0x1760, 0x13a2: 0x00da, 0x13a3: 0x0170, + 0x13a4: 0x0173, 0x13a5: 0x00a3, 0x13a6: 0x017c, 0x13a7: 0x1765, 0x13a8: 0x0182, 0x13a9: 0x0185, + 0x13aa: 0x0188, 0x13ab: 0x01e2, 0x13ac: 0x01dc, 0x13ad: 0x1752, 0x13ae: 0x01df, 0x13af: 0x0197, + 0x13b0: 0x0576, 0x13b2: 0x01ac, 0x13b3: 0x01cd, 0x13b4: 0x01d0, 0x13b5: 0x01bb, + 0x13b6: 0x00f5, 0x13b7: 0x00f8, 0x13b8: 0x00fb, 0x13b9: 0x176a, 0x13ba: 0x176f, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0063, 0x13c1: 0x0065, 0x13c2: 0x0067, 0x13c3: 0x0069, 0x13c4: 0x006b, 0x13c5: 0x006d, + 0x13c6: 0x006f, 0x13c7: 0x0071, 0x13c8: 0x0073, 0x13c9: 0x0075, 0x13ca: 0x0083, 0x13cb: 0x0085, + 0x13cc: 0x0087, 0x13cd: 0x0089, 0x13ce: 0x008b, 0x13cf: 0x008d, 0x13d0: 0x008f, 0x13d1: 0x0091, + 0x13d2: 0x0093, 0x13d3: 0x0095, 0x13d4: 0x0097, 0x13d5: 0x0099, 0x13d6: 0x009b, 0x13d7: 0x009d, + 0x13d8: 0x009f, 0x13d9: 0x00a1, 0x13da: 0x00a3, 0x13db: 0x00a5, 0x13dc: 0x00a7, 0x13dd: 0x00a9, + 0x13de: 0x00ab, 0x13df: 0x00ad, 0x13e0: 0x00af, 0x13e1: 0x00b1, 0x13e2: 0x00b3, 0x13e3: 0x00b5, + 0x13e4: 0x00e3, 0x13e5: 0x0101, 0x13e8: 0x01f7, 0x13e9: 0x01fa, + 0x13ea: 0x01fd, 0x13eb: 0x0200, 0x13ec: 0x0203, 0x13ed: 0x0206, 0x13ee: 0x0209, 0x13ef: 0x020c, + 0x13f0: 0x020f, 0x13f1: 0x0212, 0x13f2: 0x0215, 0x13f3: 0x0218, 0x13f4: 0x021b, 0x13f5: 0x021e, + 0x13f6: 0x0221, 0x13f7: 0x0224, 0x13f8: 0x0227, 0x13f9: 0x020c, 0x13fa: 0x022a, 0x13fb: 0x022d, + 0x13fc: 0x0230, 0x13fd: 0x0233, 0x13fe: 0x0236, 0x13ff: 0x0239, + // Block 0x50, offset 0x1400 + 0x1400: 0x0281, 0x1401: 0x0284, 0x1402: 0x0287, 0x1403: 0x0552, 0x1404: 0x024b, 0x1405: 0x0254, + 0x1406: 0x025a, 0x1407: 0x027e, 0x1408: 0x026f, 0x1409: 0x026c, 0x140a: 0x028a, 0x140b: 0x028d, + 0x140e: 0x0021, 0x140f: 0x0023, 0x1410: 0x0025, 0x1411: 0x0027, + 0x1412: 0x0029, 0x1413: 0x002b, 0x1414: 0x002d, 0x1415: 0x002f, 0x1416: 0x0031, 0x1417: 0x0033, + 0x1418: 0x0021, 0x1419: 0x0023, 0x141a: 0x0025, 0x141b: 0x0027, 0x141c: 0x0029, 0x141d: 0x002b, + 0x141e: 0x002d, 0x141f: 0x002f, 0x1420: 0x0031, 0x1421: 0x0033, 0x1422: 0x0021, 0x1423: 0x0023, + 0x1424: 0x0025, 0x1425: 0x0027, 0x1426: 0x0029, 0x1427: 0x002b, 0x1428: 0x002d, 0x1429: 0x002f, + 0x142a: 0x0031, 0x142b: 0x0033, 0x142c: 0x0021, 0x142d: 0x0023, 0x142e: 0x0025, 0x142f: 0x0027, + 0x1430: 0x0029, 0x1431: 0x002b, 0x1432: 0x002d, 0x1433: 0x002f, 0x1434: 0x0031, 0x1435: 0x0033, + 0x1436: 0x0021, 0x1437: 0x0023, 0x1438: 0x0025, 0x1439: 0x0027, 0x143a: 0x0029, 0x143b: 0x002b, + 0x143c: 0x002d, 0x143d: 0x002f, 0x143e: 0x0031, 0x143f: 0x0033, + // Block 0x51, offset 0x1440 + 0x1440: 0x8133, 0x1441: 0x8133, 0x1442: 0x8133, 0x1443: 0x8133, 0x1444: 0x8133, 0x1445: 0x8133, + 0x1446: 0x8133, 0x1448: 0x8133, 0x1449: 0x8133, 0x144a: 0x8133, 0x144b: 0x8133, + 0x144c: 0x8133, 0x144d: 0x8133, 0x144e: 0x8133, 0x144f: 0x8133, 0x1450: 0x8133, 0x1451: 0x8133, + 0x1452: 0x8133, 0x1453: 0x8133, 0x1454: 0x8133, 0x1455: 0x8133, 0x1456: 0x8133, 0x1457: 0x8133, + 0x1458: 0x8133, 0x145b: 0x8133, 0x145c: 0x8133, 0x145d: 0x8133, + 0x145e: 0x8133, 0x145f: 0x8133, 0x1460: 0x8133, 0x1461: 0x8133, 0x1463: 0x8133, + 0x1464: 0x8133, 0x1466: 0x8133, 0x1467: 0x8133, 0x1468: 0x8133, 0x1469: 0x8133, + 0x146a: 0x8133, + 0x1470: 0x0290, 0x1471: 0x0293, 0x1472: 0x0296, 0x1473: 0x0299, 0x1474: 0x029c, 0x1475: 0x029f, + 0x1476: 0x02a2, 0x1477: 0x02a5, 0x1478: 0x02a8, 0x1479: 0x02ab, 0x147a: 0x02ae, 0x147b: 0x02b1, + 0x147c: 0x02b7, 0x147d: 0x02ba, 0x147e: 0x02bd, 0x147f: 0x02c0, + // Block 0x52, offset 0x1480 + 0x1480: 0x02c3, 0x1481: 0x02c6, 0x1482: 0x02c9, 0x1483: 0x02cc, 0x1484: 0x02cf, 0x1485: 0x02d2, + 0x1486: 0x02d5, 0x1487: 0x02db, 0x1488: 0x02e1, 0x1489: 0x02e4, 0x148a: 0x1736, 0x148b: 0x0302, + 0x148c: 0x02ea, 0x148d: 0x02ed, 0x148e: 0x0305, 0x148f: 0x02f9, 0x1490: 0x02ff, 0x1491: 0x0290, + 0x1492: 0x0293, 0x1493: 0x0296, 0x1494: 0x0299, 0x1495: 0x029c, 0x1496: 0x029f, 0x1497: 0x02a2, + 0x1498: 0x02a5, 0x1499: 0x02a8, 0x149a: 0x02ab, 0x149b: 0x02ae, 0x149c: 0x02b7, 0x149d: 0x02ba, + 0x149e: 0x02c0, 0x149f: 0x02c6, 0x14a0: 0x02c9, 0x14a1: 0x02cc, 0x14a2: 0x02cf, 0x14a3: 0x02d2, + 0x14a4: 0x02d5, 0x14a5: 0x02d8, 0x14a6: 0x02db, 0x14a7: 0x02f3, 0x14a8: 0x02ea, 0x14a9: 0x02e7, + 0x14aa: 0x02f0, 0x14ab: 0x02f6, 0x14ac: 0x1732, 0x14ad: 0x02fc, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x032c, 0x14c1: 0x032f, 0x14c2: 0x033b, 0x14c3: 0x0344, 0x14c5: 0x037d, + 0x14c6: 0x034d, 0x14c7: 0x033e, 0x14c8: 0x035c, 0x14c9: 0x0383, 0x14ca: 0x036e, 0x14cb: 0x0371, + 0x14cc: 0x0374, 0x14cd: 0x0377, 0x14ce: 0x0350, 0x14cf: 0x0362, 0x14d0: 0x0368, 0x14d1: 0x0356, + 0x14d2: 0x036b, 0x14d3: 0x034a, 0x14d4: 0x0353, 0x14d5: 0x0335, 0x14d6: 0x0338, 0x14d7: 0x0341, + 0x14d8: 0x0347, 0x14d9: 0x0359, 0x14da: 0x035f, 0x14db: 0x0365, 0x14dc: 0x0386, 0x14dd: 0x03d7, + 0x14de: 0x03bf, 0x14df: 0x0389, 0x14e1: 0x032f, 0x14e2: 0x033b, + 0x14e4: 0x037a, 0x14e7: 0x033e, 0x14e9: 0x0383, + 0x14ea: 0x036e, 0x14eb: 0x0371, 0x14ec: 0x0374, 0x14ed: 0x0377, 0x14ee: 0x0350, 0x14ef: 0x0362, + 0x14f0: 0x0368, 0x14f1: 0x0356, 0x14f2: 0x036b, 0x14f4: 0x0353, 0x14f5: 0x0335, + 0x14f6: 0x0338, 0x14f7: 0x0341, 0x14f9: 0x0359, 0x14fb: 0x0365, + // Block 0x54, offset 0x1500 + 0x1502: 0x033b, + 0x1507: 0x033e, 0x1509: 0x0383, 0x150b: 0x0371, + 0x150d: 0x0377, 0x150e: 0x0350, 0x150f: 0x0362, 0x1511: 0x0356, + 0x1512: 0x036b, 0x1514: 0x0353, 0x1517: 0x0341, + 0x1519: 0x0359, 0x151b: 0x0365, 0x151d: 0x03d7, + 0x151f: 0x0389, 0x1521: 0x032f, 0x1522: 0x033b, + 0x1524: 0x037a, 0x1527: 0x033e, 0x1528: 0x035c, 0x1529: 0x0383, + 0x152a: 0x036e, 0x152c: 0x0374, 0x152d: 0x0377, 0x152e: 0x0350, 0x152f: 0x0362, + 0x1530: 0x0368, 0x1531: 0x0356, 0x1532: 0x036b, 0x1534: 0x0353, 0x1535: 0x0335, + 0x1536: 0x0338, 0x1537: 0x0341, 0x1539: 0x0359, 0x153a: 0x035f, 0x153b: 0x0365, + 0x153c: 0x0386, 0x153e: 0x03bf, + // Block 0x55, offset 0x1540 + 0x1540: 0x032c, 0x1541: 0x032f, 0x1542: 0x033b, 0x1543: 0x0344, 0x1544: 0x037a, 0x1545: 0x037d, + 0x1546: 0x034d, 0x1547: 0x033e, 0x1548: 0x035c, 0x1549: 0x0383, 0x154b: 0x0371, + 0x154c: 0x0374, 0x154d: 0x0377, 0x154e: 0x0350, 0x154f: 0x0362, 0x1550: 0x0368, 0x1551: 0x0356, + 0x1552: 0x036b, 0x1553: 0x034a, 0x1554: 0x0353, 0x1555: 0x0335, 0x1556: 0x0338, 0x1557: 0x0341, + 0x1558: 0x0347, 0x1559: 0x0359, 0x155a: 0x035f, 0x155b: 0x0365, + 0x1561: 0x032f, 0x1562: 0x033b, 0x1563: 0x0344, + 0x1565: 0x037d, 0x1566: 0x034d, 0x1567: 0x033e, 0x1568: 0x035c, 0x1569: 0x0383, + 0x156b: 0x0371, 0x156c: 0x0374, 0x156d: 0x0377, 0x156e: 0x0350, 0x156f: 0x0362, + 0x1570: 0x0368, 0x1571: 0x0356, 0x1572: 0x036b, 0x1573: 0x034a, 0x1574: 0x0353, 0x1575: 0x0335, + 0x1576: 0x0338, 0x1577: 0x0341, 0x1578: 0x0347, 0x1579: 0x0359, 0x157a: 0x035f, 0x157b: 0x0365, + // Block 0x56, offset 0x1580 + 0x1580: 0x19a6, 0x1581: 0x19a3, 0x1582: 0x19a9, 0x1583: 0x19cd, 0x1584: 0x19f1, 0x1585: 0x1a15, + 0x1586: 0x1a39, 0x1587: 0x1a42, 0x1588: 0x1a48, 0x1589: 0x1a4e, 0x158a: 0x1a54, + 0x1590: 0x1bbc, 0x1591: 0x1bc0, + 0x1592: 0x1bc4, 0x1593: 0x1bc8, 0x1594: 0x1bcc, 0x1595: 0x1bd0, 0x1596: 0x1bd4, 0x1597: 0x1bd8, + 0x1598: 0x1bdc, 0x1599: 0x1be0, 0x159a: 0x1be4, 0x159b: 0x1be8, 0x159c: 0x1bec, 0x159d: 0x1bf0, + 0x159e: 0x1bf4, 0x159f: 0x1bf8, 0x15a0: 0x1bfc, 0x15a1: 0x1c00, 0x15a2: 0x1c04, 0x15a3: 0x1c08, + 0x15a4: 0x1c0c, 0x15a5: 0x1c10, 0x15a6: 0x1c14, 0x15a7: 0x1c18, 0x15a8: 0x1c1c, 0x15a9: 0x1c20, + 0x15aa: 0x2855, 0x15ab: 0x0047, 0x15ac: 0x0065, 0x15ad: 0x1a69, 0x15ae: 0x1ae1, + 0x15b0: 0x0043, 0x15b1: 0x0045, 0x15b2: 0x0047, 0x15b3: 0x0049, 0x15b4: 0x004b, 0x15b5: 0x004d, + 0x15b6: 0x004f, 0x15b7: 0x0051, 0x15b8: 0x0053, 0x15b9: 0x0055, 0x15ba: 0x0057, 0x15bb: 0x0059, + 0x15bc: 0x005b, 0x15bd: 0x005d, 0x15be: 0x005f, 0x15bf: 0x0061, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x27dd, 0x15c1: 0x27f2, 0x15c2: 0x05fe, + 0x15d0: 0x0d0a, 0x15d1: 0x0b42, + 0x15d2: 0x09ce, 0x15d3: 0x4705, 0x15d4: 0x0816, 0x15d5: 0x0aea, 0x15d6: 0x142a, 0x15d7: 0x0afa, + 0x15d8: 0x0822, 0x15d9: 0x0dd2, 0x15da: 0x0faa, 0x15db: 0x0daa, 0x15dc: 0x0922, 0x15dd: 0x0c66, + 0x15de: 0x08ba, 0x15df: 0x0db2, 0x15e0: 0x090e, 0x15e1: 0x1212, 0x15e2: 0x107e, 0x15e3: 0x1486, + 0x15e4: 0x0ace, 0x15e5: 0x0a06, 0x15e6: 0x0f5e, 0x15e7: 0x0d16, 0x15e8: 0x0d42, 0x15e9: 0x07ba, + 0x15ea: 0x07c6, 0x15eb: 0x1506, 0x15ec: 0x0bd6, 0x15ed: 0x07e2, 0x15ee: 0x09ea, 0x15ef: 0x0d36, + 0x15f0: 0x14ae, 0x15f1: 0x0d0e, 0x15f2: 0x116a, 0x15f3: 0x11a6, 0x15f4: 0x09f2, 0x15f5: 0x0f3e, + 0x15f6: 0x0e06, 0x15f7: 0x0e02, 0x15f8: 0x1092, 0x15f9: 0x0926, 0x15fa: 0x0a52, 0x15fb: 0x153e, + // Block 0x58, offset 0x1600 + 0x1600: 0x07f6, 0x1601: 0x07ee, 0x1602: 0x07fe, 0x1603: 0x1774, 0x1604: 0x0842, 0x1605: 0x0852, + 0x1606: 0x0856, 0x1607: 0x085e, 0x1608: 0x0866, 0x1609: 0x086a, 0x160a: 0x0876, 0x160b: 0x086e, + 0x160c: 0x06ae, 0x160d: 0x1788, 0x160e: 0x088a, 0x160f: 0x088e, 0x1610: 0x0892, 0x1611: 0x08ae, + 0x1612: 0x1779, 0x1613: 0x06b2, 0x1614: 0x089a, 0x1615: 0x08ba, 0x1616: 0x1783, 0x1617: 0x08ca, + 0x1618: 0x08d2, 0x1619: 0x0832, 0x161a: 0x08da, 0x161b: 0x08de, 0x161c: 0x195e, 0x161d: 0x08fa, + 0x161e: 0x0902, 0x161f: 0x06ba, 0x1620: 0x091a, 0x1621: 0x091e, 0x1622: 0x0926, 0x1623: 0x092a, + 0x1624: 0x06be, 0x1625: 0x0942, 0x1626: 0x0946, 0x1627: 0x0952, 0x1628: 0x095e, 0x1629: 0x0962, + 0x162a: 0x0966, 0x162b: 0x096e, 0x162c: 0x098e, 0x162d: 0x0992, 0x162e: 0x099a, 0x162f: 0x09aa, + 0x1630: 0x09b2, 0x1631: 0x09b6, 0x1632: 0x09b6, 0x1633: 0x09b6, 0x1634: 0x1797, 0x1635: 0x0f8e, + 0x1636: 0x09ca, 0x1637: 0x09d2, 0x1638: 0x179c, 0x1639: 0x09de, 0x163a: 0x09e6, 0x163b: 0x09ee, + 0x163c: 0x0a16, 0x163d: 0x0a02, 0x163e: 0x0a0e, 0x163f: 0x0a12, + // Block 0x59, offset 0x1640 + 0x1640: 0x0a1a, 0x1641: 0x0a22, 0x1642: 0x0a26, 0x1643: 0x0a2e, 0x1644: 0x0a36, 0x1645: 0x0a3a, + 0x1646: 0x0a3a, 0x1647: 0x0a42, 0x1648: 0x0a4a, 0x1649: 0x0a4e, 0x164a: 0x0a5a, 0x164b: 0x0a7e, + 0x164c: 0x0a62, 0x164d: 0x0a82, 0x164e: 0x0a66, 0x164f: 0x0a6e, 0x1650: 0x0906, 0x1651: 0x0aca, + 0x1652: 0x0a92, 0x1653: 0x0a96, 0x1654: 0x0a9a, 0x1655: 0x0a8e, 0x1656: 0x0aa2, 0x1657: 0x0a9e, + 0x1658: 0x0ab6, 0x1659: 0x17a1, 0x165a: 0x0ad2, 0x165b: 0x0ad6, 0x165c: 0x0ade, 0x165d: 0x0aea, + 0x165e: 0x0af2, 0x165f: 0x0b0e, 0x1660: 0x17a6, 0x1661: 0x17ab, 0x1662: 0x0b1a, 0x1663: 0x0b1e, + 0x1664: 0x0b22, 0x1665: 0x0b16, 0x1666: 0x0b2a, 0x1667: 0x06c2, 0x1668: 0x06c6, 0x1669: 0x0b32, + 0x166a: 0x0b3a, 0x166b: 0x0b3a, 0x166c: 0x17b0, 0x166d: 0x0b56, 0x166e: 0x0b5a, 0x166f: 0x0b5e, + 0x1670: 0x0b66, 0x1671: 0x17b5, 0x1672: 0x0b6e, 0x1673: 0x0b72, 0x1674: 0x0c4a, 0x1675: 0x0b7a, + 0x1676: 0x06ca, 0x1677: 0x0b86, 0x1678: 0x0b96, 0x1679: 0x0ba2, 0x167a: 0x0b9e, 0x167b: 0x17bf, + 0x167c: 0x0baa, 0x167d: 0x17c4, 0x167e: 0x0bb6, 0x167f: 0x0bb2, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0bba, 0x1681: 0x0bca, 0x1682: 0x0bce, 0x1683: 0x06ce, 0x1684: 0x0bde, 0x1685: 0x0be6, + 0x1686: 0x0bea, 0x1687: 0x0bee, 0x1688: 0x06d2, 0x1689: 0x17c9, 0x168a: 0x06d6, 0x168b: 0x0c0a, + 0x168c: 0x0c0e, 0x168d: 0x0c12, 0x168e: 0x0c1a, 0x168f: 0x1990, 0x1690: 0x0c32, 0x1691: 0x17d3, + 0x1692: 0x17d3, 0x1693: 0x12d2, 0x1694: 0x0c42, 0x1695: 0x0c42, 0x1696: 0x06da, 0x1697: 0x17f6, + 0x1698: 0x18c8, 0x1699: 0x0c52, 0x169a: 0x0c5a, 0x169b: 0x06de, 0x169c: 0x0c6e, 0x169d: 0x0c7e, + 0x169e: 0x0c82, 0x169f: 0x0c8a, 0x16a0: 0x0c9a, 0x16a1: 0x06e6, 0x16a2: 0x06e2, 0x16a3: 0x0c9e, + 0x16a4: 0x17d8, 0x16a5: 0x0ca2, 0x16a6: 0x0cb6, 0x16a7: 0x0cba, 0x16a8: 0x0cbe, 0x16a9: 0x0cba, + 0x16aa: 0x0cca, 0x16ab: 0x0cce, 0x16ac: 0x0cde, 0x16ad: 0x0cd6, 0x16ae: 0x0cda, 0x16af: 0x0ce2, + 0x16b0: 0x0ce6, 0x16b1: 0x0cea, 0x16b2: 0x0cf6, 0x16b3: 0x0cfa, 0x16b4: 0x0d12, 0x16b5: 0x0d1a, + 0x16b6: 0x0d2a, 0x16b7: 0x0d3e, 0x16b8: 0x17e7, 0x16b9: 0x0d3a, 0x16ba: 0x0d2e, 0x16bb: 0x0d46, + 0x16bc: 0x0d4e, 0x16bd: 0x0d62, 0x16be: 0x17ec, 0x16bf: 0x0d6a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0d5e, 0x16c1: 0x0d56, 0x16c2: 0x06ea, 0x16c3: 0x0d72, 0x16c4: 0x0d7a, 0x16c5: 0x0d82, + 0x16c6: 0x0d76, 0x16c7: 0x06ee, 0x16c8: 0x0d92, 0x16c9: 0x0d9a, 0x16ca: 0x17f1, 0x16cb: 0x0dc6, + 0x16cc: 0x0dfa, 0x16cd: 0x0dd6, 0x16ce: 0x06fa, 0x16cf: 0x0de2, 0x16d0: 0x06f6, 0x16d1: 0x06f2, + 0x16d2: 0x08be, 0x16d3: 0x08c2, 0x16d4: 0x0dfe, 0x16d5: 0x0de6, 0x16d6: 0x12a6, 0x16d7: 0x075e, + 0x16d8: 0x0e0a, 0x16d9: 0x0e0e, 0x16da: 0x0e12, 0x16db: 0x0e26, 0x16dc: 0x0e1e, 0x16dd: 0x180a, + 0x16de: 0x06fe, 0x16df: 0x0e3a, 0x16e0: 0x0e2e, 0x16e1: 0x0e4a, 0x16e2: 0x0e52, 0x16e3: 0x1814, + 0x16e4: 0x0e56, 0x16e5: 0x0e42, 0x16e6: 0x0e5e, 0x16e7: 0x0702, 0x16e8: 0x0e62, 0x16e9: 0x0e66, + 0x16ea: 0x0e6a, 0x16eb: 0x0e76, 0x16ec: 0x1819, 0x16ed: 0x0e7e, 0x16ee: 0x0706, 0x16ef: 0x0e8a, + 0x16f0: 0x181e, 0x16f1: 0x0e8e, 0x16f2: 0x070a, 0x16f3: 0x0e9a, 0x16f4: 0x0ea6, 0x16f5: 0x0eb2, + 0x16f6: 0x0eb6, 0x16f7: 0x1823, 0x16f8: 0x17ba, 0x16f9: 0x1828, 0x16fa: 0x0ed6, 0x16fb: 0x182d, + 0x16fc: 0x0ee2, 0x16fd: 0x0eea, 0x16fe: 0x0eda, 0x16ff: 0x0ef6, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0f06, 0x1701: 0x0f16, 0x1702: 0x0f0a, 0x1703: 0x0f0e, 0x1704: 0x0f1a, 0x1705: 0x0f1e, + 0x1706: 0x1832, 0x1707: 0x0f02, 0x1708: 0x0f36, 0x1709: 0x0f3a, 0x170a: 0x070e, 0x170b: 0x0f4e, + 0x170c: 0x0f4a, 0x170d: 0x1837, 0x170e: 0x0f2e, 0x170f: 0x0f6a, 0x1710: 0x183c, 0x1711: 0x1841, + 0x1712: 0x0f6e, 0x1713: 0x0f82, 0x1714: 0x0f7e, 0x1715: 0x0f7a, 0x1716: 0x0712, 0x1717: 0x0f86, + 0x1718: 0x0f96, 0x1719: 0x0f92, 0x171a: 0x0f9e, 0x171b: 0x177e, 0x171c: 0x0fae, 0x171d: 0x1846, + 0x171e: 0x0fba, 0x171f: 0x1850, 0x1720: 0x0fce, 0x1721: 0x0fda, 0x1722: 0x0fee, 0x1723: 0x1855, + 0x1724: 0x1002, 0x1725: 0x1006, 0x1726: 0x185a, 0x1727: 0x185f, 0x1728: 0x1022, 0x1729: 0x1032, + 0x172a: 0x0716, 0x172b: 0x1036, 0x172c: 0x071a, 0x172d: 0x071a, 0x172e: 0x104e, 0x172f: 0x1052, + 0x1730: 0x105a, 0x1731: 0x105e, 0x1732: 0x106a, 0x1733: 0x071e, 0x1734: 0x1082, 0x1735: 0x1864, + 0x1736: 0x109e, 0x1737: 0x1869, 0x1738: 0x10aa, 0x1739: 0x17ce, 0x173a: 0x10ba, 0x173b: 0x186e, + 0x173c: 0x1873, 0x173d: 0x1878, 0x173e: 0x0722, 0x173f: 0x0726, + // Block 0x5d, offset 0x1740 + 0x1740: 0x10f2, 0x1741: 0x1882, 0x1742: 0x187d, 0x1743: 0x1887, 0x1744: 0x188c, 0x1745: 0x10fa, + 0x1746: 0x10fe, 0x1747: 0x10fe, 0x1748: 0x1106, 0x1749: 0x072e, 0x174a: 0x110a, 0x174b: 0x0732, + 0x174c: 0x0736, 0x174d: 0x1896, 0x174e: 0x111e, 0x174f: 0x1126, 0x1750: 0x1132, 0x1751: 0x073a, + 0x1752: 0x189b, 0x1753: 0x1156, 0x1754: 0x18a0, 0x1755: 0x18a5, 0x1756: 0x1176, 0x1757: 0x118e, + 0x1758: 0x073e, 0x1759: 0x1196, 0x175a: 0x119a, 0x175b: 0x119e, 0x175c: 0x18aa, 0x175d: 0x18af, + 0x175e: 0x18af, 0x175f: 0x11b6, 0x1760: 0x0742, 0x1761: 0x18b4, 0x1762: 0x11ca, 0x1763: 0x11ce, + 0x1764: 0x0746, 0x1765: 0x18b9, 0x1766: 0x11ea, 0x1767: 0x074a, 0x1768: 0x11fa, 0x1769: 0x11f2, + 0x176a: 0x1202, 0x176b: 0x18c3, 0x176c: 0x121a, 0x176d: 0x074e, 0x176e: 0x1226, 0x176f: 0x122e, + 0x1770: 0x123e, 0x1771: 0x0752, 0x1772: 0x18cd, 0x1773: 0x18d2, 0x1774: 0x0756, 0x1775: 0x18d7, + 0x1776: 0x1256, 0x1777: 0x18dc, 0x1778: 0x1262, 0x1779: 0x126e, 0x177a: 0x1276, 0x177b: 0x18e1, + 0x177c: 0x18e6, 0x177d: 0x128a, 0x177e: 0x18eb, 0x177f: 0x1292, + // Block 0x5e, offset 0x1780 + 0x1780: 0x17fb, 0x1781: 0x075a, 0x1782: 0x12aa, 0x1783: 0x12ae, 0x1784: 0x0762, 0x1785: 0x12b2, + 0x1786: 0x0b2e, 0x1787: 0x18f0, 0x1788: 0x18f5, 0x1789: 0x1800, 0x178a: 0x1805, 0x178b: 0x12d2, + 0x178c: 0x12d6, 0x178d: 0x14ee, 0x178e: 0x0766, 0x178f: 0x1302, 0x1790: 0x12fe, 0x1791: 0x1306, + 0x1792: 0x093a, 0x1793: 0x130a, 0x1794: 0x130e, 0x1795: 0x1312, 0x1796: 0x131a, 0x1797: 0x18fa, + 0x1798: 0x1316, 0x1799: 0x131e, 0x179a: 0x1332, 0x179b: 0x1336, 0x179c: 0x1322, 0x179d: 0x133a, + 0x179e: 0x134e, 0x179f: 0x1362, 0x17a0: 0x132e, 0x17a1: 0x1342, 0x17a2: 0x1346, 0x17a3: 0x134a, + 0x17a4: 0x18ff, 0x17a5: 0x1909, 0x17a6: 0x1904, 0x17a7: 0x076a, 0x17a8: 0x136a, 0x17a9: 0x136e, + 0x17aa: 0x1376, 0x17ab: 0x191d, 0x17ac: 0x137a, 0x17ad: 0x190e, 0x17ae: 0x076e, 0x17af: 0x0772, + 0x17b0: 0x1913, 0x17b1: 0x1918, 0x17b2: 0x0776, 0x17b3: 0x139a, 0x17b4: 0x139e, 0x17b5: 0x13a2, + 0x17b6: 0x13a6, 0x17b7: 0x13b2, 0x17b8: 0x13ae, 0x17b9: 0x13ba, 0x17ba: 0x13b6, 0x17bb: 0x13c6, + 0x17bc: 0x13be, 0x17bd: 0x13c2, 0x17be: 0x13ca, 0x17bf: 0x077a, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x13d2, 0x17c1: 0x13d6, 0x17c2: 0x077e, 0x17c3: 0x13e6, 0x17c4: 0x13ea, 0x17c5: 0x1922, + 0x17c6: 0x13f6, 0x17c7: 0x13fa, 0x17c8: 0x0782, 0x17c9: 0x1406, 0x17ca: 0x06b6, 0x17cb: 0x1927, + 0x17cc: 0x192c, 0x17cd: 0x0786, 0x17ce: 0x078a, 0x17cf: 0x1432, 0x17d0: 0x144a, 0x17d1: 0x1466, + 0x17d2: 0x1476, 0x17d3: 0x1931, 0x17d4: 0x148a, 0x17d5: 0x148e, 0x17d6: 0x14a6, 0x17d7: 0x14b2, + 0x17d8: 0x193b, 0x17d9: 0x178d, 0x17da: 0x14be, 0x17db: 0x14ba, 0x17dc: 0x14c6, 0x17dd: 0x1792, + 0x17de: 0x14d2, 0x17df: 0x14de, 0x17e0: 0x1940, 0x17e1: 0x1945, 0x17e2: 0x151e, 0x17e3: 0x152a, + 0x17e4: 0x1532, 0x17e5: 0x194a, 0x17e6: 0x1536, 0x17e7: 0x1562, 0x17e8: 0x156e, 0x17e9: 0x1572, + 0x17ea: 0x156a, 0x17eb: 0x157e, 0x17ec: 0x1582, 0x17ed: 0x194f, 0x17ee: 0x158e, 0x17ef: 0x078e, + 0x17f0: 0x1596, 0x17f1: 0x1954, 0x17f2: 0x0792, 0x17f3: 0x15ce, 0x17f4: 0x0bbe, 0x17f5: 0x15e6, + 0x17f6: 0x1959, 0x17f7: 0x1963, 0x17f8: 0x0796, 0x17f9: 0x079a, 0x17fa: 0x160e, 0x17fb: 0x1968, + 0x17fc: 0x079e, 0x17fd: 0x196d, 0x17fe: 0x1626, 0x17ff: 0x1626, + // Block 0x60, offset 0x1800 + 0x1800: 0x162e, 0x1801: 0x1972, 0x1802: 0x1646, 0x1803: 0x07a2, 0x1804: 0x1656, 0x1805: 0x1662, + 0x1806: 0x166a, 0x1807: 0x1672, 0x1808: 0x07a6, 0x1809: 0x1977, 0x180a: 0x1686, 0x180b: 0x16a2, + 0x180c: 0x16ae, 0x180d: 0x07aa, 0x180e: 0x07ae, 0x180f: 0x16b2, 0x1810: 0x197c, 0x1811: 0x07b2, + 0x1812: 0x1981, 0x1813: 0x1986, 0x1814: 0x198b, 0x1815: 0x16d6, 0x1816: 0x07b6, 0x1817: 0x16ea, + 0x1818: 0x16f2, 0x1819: 0x16f6, 0x181a: 0x16fe, 0x181b: 0x1706, 0x181c: 0x170e, 0x181d: 0x1995, +} + +// nfkcIndex: 22 blocks, 1408 entries, 2816 bytes +// Block 0 is the zero block. +var nfkcIndex = [1408]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x5f, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x60, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x61, 0xcb: 0x62, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, + 0xd0: 0x0a, 0xd1: 0x63, 0xd2: 0x64, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x65, + 0xd8: 0x66, 0xd9: 0x0d, 0xdb: 0x67, 0xdc: 0x68, 0xdd: 0x69, 0xdf: 0x6a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x6b, 0x121: 0x6c, 0x122: 0x6d, 0x123: 0x0e, 0x124: 0x6e, 0x125: 0x6f, 0x126: 0x70, 0x127: 0x71, + 0x128: 0x72, 0x129: 0x73, 0x12a: 0x74, 0x12b: 0x75, 0x12c: 0x70, 0x12d: 0x76, 0x12e: 0x77, 0x12f: 0x78, + 0x130: 0x74, 0x131: 0x79, 0x132: 0x7a, 0x133: 0x7b, 0x134: 0x7c, 0x135: 0x7d, 0x137: 0x7e, + 0x138: 0x7f, 0x139: 0x80, 0x13a: 0x81, 0x13b: 0x82, 0x13c: 0x83, 0x13d: 0x84, 0x13e: 0x85, 0x13f: 0x86, + // Block 0x5, offset 0x140 + 0x140: 0x87, 0x142: 0x88, 0x143: 0x89, 0x144: 0x8a, 0x145: 0x8b, 0x146: 0x8c, 0x147: 0x8d, + 0x14d: 0x8e, + 0x15c: 0x8f, 0x15f: 0x90, + 0x162: 0x91, 0x164: 0x92, + 0x168: 0x93, 0x169: 0x94, 0x16a: 0x95, 0x16b: 0x96, 0x16c: 0x0f, 0x16d: 0x97, 0x16e: 0x98, 0x16f: 0x99, + 0x170: 0x9a, 0x173: 0x9b, 0x174: 0x9c, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12, + 0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a, + // Block 0x6, offset 0x180 + 0x180: 0x9d, 0x181: 0x9e, 0x182: 0x9f, 0x183: 0xa0, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0xa1, 0x187: 0xa2, + 0x188: 0xa3, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0xa4, 0x18c: 0xa5, + 0x191: 0x1f, 0x192: 0x20, 0x193: 0xa6, + 0x1a8: 0xa7, 0x1a9: 0xa8, 0x1ab: 0xa9, + 0x1b1: 0xaa, 0x1b3: 0xab, 0x1b5: 0xac, 0x1b7: 0xad, + 0x1ba: 0xae, 0x1bb: 0xaf, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xb0, + // Block 0x7, offset 0x1c0 + 0x1c0: 0xb1, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xb2, 0x1c5: 0x27, 0x1c6: 0x28, + 0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30, + // Block 0x8, offset 0x200 + 0x219: 0xb3, 0x21a: 0xb4, 0x21b: 0xb5, 0x21d: 0xb6, 0x21f: 0xb7, + 0x220: 0xb8, 0x223: 0xb9, 0x224: 0xba, 0x225: 0xbb, 0x226: 0xbc, 0x227: 0xbd, + 0x22a: 0xbe, 0x22b: 0xbf, 0x22d: 0xc0, 0x22f: 0xc1, + 0x230: 0xc2, 0x231: 0xc3, 0x232: 0xc4, 0x233: 0xc5, 0x234: 0xc6, 0x235: 0xc7, 0x236: 0xc8, 0x237: 0xc2, + 0x238: 0xc3, 0x239: 0xc4, 0x23a: 0xc5, 0x23b: 0xc6, 0x23c: 0xc7, 0x23d: 0xc8, 0x23e: 0xc2, 0x23f: 0xc3, + // Block 0x9, offset 0x240 + 0x240: 0xc4, 0x241: 0xc5, 0x242: 0xc6, 0x243: 0xc7, 0x244: 0xc8, 0x245: 0xc2, 0x246: 0xc3, 0x247: 0xc4, + 0x248: 0xc5, 0x249: 0xc6, 0x24a: 0xc7, 0x24b: 0xc8, 0x24c: 0xc2, 0x24d: 0xc3, 0x24e: 0xc4, 0x24f: 0xc5, + 0x250: 0xc6, 0x251: 0xc7, 0x252: 0xc8, 0x253: 0xc2, 0x254: 0xc3, 0x255: 0xc4, 0x256: 0xc5, 0x257: 0xc6, + 0x258: 0xc7, 0x259: 0xc8, 0x25a: 0xc2, 0x25b: 0xc3, 0x25c: 0xc4, 0x25d: 0xc5, 0x25e: 0xc6, 0x25f: 0xc7, + 0x260: 0xc8, 0x261: 0xc2, 0x262: 0xc3, 0x263: 0xc4, 0x264: 0xc5, 0x265: 0xc6, 0x266: 0xc7, 0x267: 0xc8, + 0x268: 0xc2, 0x269: 0xc3, 0x26a: 0xc4, 0x26b: 0xc5, 0x26c: 0xc6, 0x26d: 0xc7, 0x26e: 0xc8, 0x26f: 0xc2, + 0x270: 0xc3, 0x271: 0xc4, 0x272: 0xc5, 0x273: 0xc6, 0x274: 0xc7, 0x275: 0xc8, 0x276: 0xc2, 0x277: 0xc3, + 0x278: 0xc4, 0x279: 0xc5, 0x27a: 0xc6, 0x27b: 0xc7, 0x27c: 0xc8, 0x27d: 0xc2, 0x27e: 0xc3, 0x27f: 0xc4, + // Block 0xa, offset 0x280 + 0x280: 0xc5, 0x281: 0xc6, 0x282: 0xc7, 0x283: 0xc8, 0x284: 0xc2, 0x285: 0xc3, 0x286: 0xc4, 0x287: 0xc5, + 0x288: 0xc6, 0x289: 0xc7, 0x28a: 0xc8, 0x28b: 0xc2, 0x28c: 0xc3, 0x28d: 0xc4, 0x28e: 0xc5, 0x28f: 0xc6, + 0x290: 0xc7, 0x291: 0xc8, 0x292: 0xc2, 0x293: 0xc3, 0x294: 0xc4, 0x295: 0xc5, 0x296: 0xc6, 0x297: 0xc7, + 0x298: 0xc8, 0x299: 0xc2, 0x29a: 0xc3, 0x29b: 0xc4, 0x29c: 0xc5, 0x29d: 0xc6, 0x29e: 0xc7, 0x29f: 0xc8, + 0x2a0: 0xc2, 0x2a1: 0xc3, 0x2a2: 0xc4, 0x2a3: 0xc5, 0x2a4: 0xc6, 0x2a5: 0xc7, 0x2a6: 0xc8, 0x2a7: 0xc2, + 0x2a8: 0xc3, 0x2a9: 0xc4, 0x2aa: 0xc5, 0x2ab: 0xc6, 0x2ac: 0xc7, 0x2ad: 0xc8, 0x2ae: 0xc2, 0x2af: 0xc3, + 0x2b0: 0xc4, 0x2b1: 0xc5, 0x2b2: 0xc6, 0x2b3: 0xc7, 0x2b4: 0xc8, 0x2b5: 0xc2, 0x2b6: 0xc3, 0x2b7: 0xc4, + 0x2b8: 0xc5, 0x2b9: 0xc6, 0x2ba: 0xc7, 0x2bb: 0xc8, 0x2bc: 0xc2, 0x2bd: 0xc3, 0x2be: 0xc4, 0x2bf: 0xc5, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xc6, 0x2c1: 0xc7, 0x2c2: 0xc8, 0x2c3: 0xc2, 0x2c4: 0xc3, 0x2c5: 0xc4, 0x2c6: 0xc5, 0x2c7: 0xc6, + 0x2c8: 0xc7, 0x2c9: 0xc8, 0x2ca: 0xc2, 0x2cb: 0xc3, 0x2cc: 0xc4, 0x2cd: 0xc5, 0x2ce: 0xc6, 0x2cf: 0xc7, + 0x2d0: 0xc8, 0x2d1: 0xc2, 0x2d2: 0xc3, 0x2d3: 0xc4, 0x2d4: 0xc5, 0x2d5: 0xc6, 0x2d6: 0xc7, 0x2d7: 0xc8, + 0x2d8: 0xc2, 0x2d9: 0xc3, 0x2da: 0xc4, 0x2db: 0xc5, 0x2dc: 0xc6, 0x2dd: 0xc7, 0x2de: 0xc9, + // Block 0xc, offset 0x300 + 0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34, + 0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c, + 0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44, + 0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xca, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b, + // Block 0xd, offset 0x340 + 0x347: 0xcb, + 0x34b: 0xcc, 0x34d: 0xcd, + 0x35e: 0x4c, + 0x368: 0xce, 0x36b: 0xcf, + 0x374: 0xd0, + 0x37a: 0xd1, 0x37b: 0xd2, 0x37d: 0xd3, 0x37e: 0xd4, + // Block 0xe, offset 0x380 + 0x381: 0xd5, 0x382: 0xd6, 0x384: 0xd7, 0x385: 0xbc, 0x387: 0xd8, + 0x388: 0xd9, 0x38b: 0xda, 0x38c: 0xdb, 0x38d: 0xdc, + 0x391: 0xdd, 0x392: 0xde, 0x393: 0xdf, 0x396: 0xe0, 0x397: 0xe1, + 0x398: 0xe2, 0x39a: 0xe3, 0x39c: 0xe4, + 0x3a0: 0xe5, 0x3a4: 0xe6, 0x3a5: 0xe7, 0x3a7: 0xe8, + 0x3a8: 0xe9, 0x3a9: 0xea, 0x3aa: 0xeb, + 0x3b0: 0xe2, 0x3b5: 0xec, 0x3b6: 0xed, + 0x3bd: 0xee, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xef, 0x3ec: 0xf0, + 0x3ff: 0xf1, + // Block 0x10, offset 0x400 + 0x432: 0xf2, + // Block 0x11, offset 0x440 + 0x445: 0xf3, 0x446: 0xf4, 0x447: 0xf5, + 0x449: 0xf6, + 0x450: 0xf7, 0x451: 0xf8, 0x452: 0xf9, 0x453: 0xfa, 0x454: 0xfb, 0x455: 0xfc, 0x456: 0xfd, 0x457: 0xfe, + 0x458: 0xff, 0x459: 0x100, 0x45a: 0x4d, 0x45b: 0x101, 0x45c: 0x102, 0x45d: 0x103, 0x45e: 0x104, 0x45f: 0x4e, + // Block 0x12, offset 0x480 + 0x480: 0x4f, 0x481: 0x50, 0x482: 0x105, 0x484: 0xf0, + 0x48a: 0x106, 0x48b: 0x107, + 0x493: 0x108, + 0x4a3: 0x109, 0x4a5: 0x10a, + 0x4b8: 0x51, 0x4b9: 0x52, 0x4ba: 0x53, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x54, 0x4c5: 0x10b, 0x4c6: 0x10c, + 0x4c8: 0x55, 0x4c9: 0x10d, + 0x4ef: 0x10e, + // Block 0x14, offset 0x500 + 0x520: 0x56, 0x521: 0x57, 0x522: 0x58, 0x523: 0x59, 0x524: 0x5a, 0x525: 0x5b, 0x526: 0x5c, 0x527: 0x5d, + 0x528: 0x5e, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfkcSparseOffset: 176 entries, 352 bytes +var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1c, 0x26, 0x36, 0x38, 0x3d, 0x48, 0x57, 0x64, 0x6c, 0x71, 0x76, 0x78, 0x7c, 0x84, 0x8b, 0x8e, 0x96, 0x9a, 0x9e, 0xa0, 0xa2, 0xab, 0xaf, 0xb6, 0xbb, 0xbe, 0xc8, 0xcb, 0xd2, 0xda, 0xde, 0xe0, 0xe4, 0xe8, 0xee, 0xff, 0x10b, 0x10d, 0x113, 0x115, 0x117, 0x119, 0x11b, 0x11d, 0x11f, 0x121, 0x124, 0x127, 0x129, 0x12c, 0x12f, 0x133, 0x139, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x174, 0x182, 0x192, 0x1a0, 0x1a7, 0x1ad, 0x1bc, 0x1c0, 0x1c2, 0x1c6, 0x1c8, 0x1cb, 0x1cd, 0x1d0, 0x1d2, 0x1d5, 0x1d7, 0x1d9, 0x1db, 0x1e7, 0x1f1, 0x1fb, 0x1fe, 0x202, 0x204, 0x206, 0x20b, 0x20e, 0x211, 0x213, 0x215, 0x217, 0x219, 0x21f, 0x222, 0x227, 0x229, 0x230, 0x236, 0x23c, 0x244, 0x24a, 0x250, 0x256, 0x25a, 0x25c, 0x25e, 0x260, 0x262, 0x268, 0x26b, 0x26d, 0x26f, 0x271, 0x277, 0x27b, 0x27f, 0x287, 0x28e, 0x291, 0x294, 0x296, 0x299, 0x2a1, 0x2a5, 0x2ac, 0x2af, 0x2b5, 0x2b7, 0x2b9, 0x2bc, 0x2be, 0x2c1, 0x2c6, 0x2c8, 0x2ca, 0x2cc, 0x2ce, 0x2d0, 0x2d3, 0x2d5, 0x2d7, 0x2d9, 0x2db, 0x2dd, 0x2df, 0x2ec, 0x2f6, 0x2f8, 0x2fa, 0x2fe, 0x303, 0x30f, 0x314, 0x31d, 0x323, 0x328, 0x32c, 0x331, 0x335, 0x345, 0x353, 0x361, 0x36f, 0x371, 0x373, 0x375, 0x379, 0x37b, 0x37e, 0x389, 0x38b, 0x395} + +// nfkcSparseValues: 919 entries, 3676 bytes +var nfkcSparseValues = [919]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0002, lo: 0x0d}, + {value: 0x0001, lo: 0xa0, hi: 0xa0}, + {value: 0x43b9, lo: 0xa8, hi: 0xa8}, + {value: 0x0083, lo: 0xaa, hi: 0xaa}, + {value: 0x43a5, lo: 0xaf, hi: 0xaf}, + {value: 0x0025, lo: 0xb2, hi: 0xb3}, + {value: 0x439b, lo: 0xb4, hi: 0xb4}, + {value: 0x0260, lo: 0xb5, hi: 0xb5}, + {value: 0x43d2, lo: 0xb8, hi: 0xb8}, + {value: 0x0023, lo: 0xb9, hi: 0xb9}, + {value: 0x009f, lo: 0xba, hi: 0xba}, + {value: 0x234c, lo: 0xbc, hi: 0xbc}, + {value: 0x2340, lo: 0xbd, hi: 0xbd}, + {value: 0x23e2, lo: 0xbe, hi: 0xbe}, + // Block 0x1, offset 0xe + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x12 + {value: 0x0004, lo: 0x09}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x0091, lo: 0xb0, hi: 0xb0}, + {value: 0x0140, lo: 0xb1, hi: 0xb1}, + {value: 0x0095, lo: 0xb2, hi: 0xb2}, + {value: 0x00a5, lo: 0xb3, hi: 0xb3}, + {value: 0x0179, lo: 0xb4, hi: 0xb4}, + {value: 0x017f, lo: 0xb5, hi: 0xb5}, + {value: 0x018b, lo: 0xb6, hi: 0xb6}, + {value: 0x00af, lo: 0xb7, hi: 0xb8}, + // Block 0x3, offset 0x1c + {value: 0x000a, lo: 0x09}, + {value: 0x43af, lo: 0x98, hi: 0x98}, + {value: 0x43b4, lo: 0x99, hi: 0x9a}, + {value: 0x43d7, lo: 0x9b, hi: 0x9b}, + {value: 0x43a0, lo: 0x9c, hi: 0x9c}, + {value: 0x43c3, lo: 0x9d, hi: 0x9d}, + {value: 0x0137, lo: 0xa0, hi: 0xa0}, + {value: 0x0099, lo: 0xa1, hi: 0xa1}, + {value: 0x00a7, lo: 0xa2, hi: 0xa3}, + {value: 0x01b8, lo: 0xa4, hi: 0xa4}, + // Block 0x4, offset 0x26 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x5, offset 0x36 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x6, offset 0x38 + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x7, offset 0x3d + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x8, offset 0x48 + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0x9, offset 0x57 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xa, offset 0x64 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xb, offset 0x6c + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xc, offset 0x71 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xd, offset 0x76 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xe, offset 0x78 + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0xf, offset 0x7c + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x10, offset 0x84 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x11, offset 0x8b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x8e + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x96 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x14, offset 0x9a + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x15, offset 0x9e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x16, offset 0xa0 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x17, offset 0xa2 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x18, offset 0xab + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x19, offset 0xaf + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1a, offset 0xb6 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1b, offset 0xbb + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0xbe + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1d, offset 0xc8 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1e, offset 0xcb + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1f, offset 0xd2 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x20, offset 0xda + {value: 0x0000, lo: 0x03}, + {value: 0x2751, lo: 0xb3, hi: 0xb3}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x21, offset 0xde + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x22, offset 0xe0 + {value: 0x0000, lo: 0x03}, + {value: 0x2766, lo: 0xb3, hi: 0xb3}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x23, offset 0xe4 + {value: 0x0000, lo: 0x03}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + {value: 0x2758, lo: 0x9c, hi: 0x9c}, + {value: 0x275f, lo: 0x9d, hi: 0x9d}, + // Block 0x24, offset 0xe8 + {value: 0x0000, lo: 0x05}, + {value: 0x03fe, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x25, offset 0xee + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x4735, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x4740, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x26, offset 0xff + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x27, offset 0x10b + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x28, offset 0x10d + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x29, offset 0x113 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2a, offset 0x115 + {value: 0x0000, lo: 0x01}, + {value: 0x0402, lo: 0xbc, hi: 0xbc}, + // Block 0x2b, offset 0x117 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x119 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x11b + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x11d + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x11f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x121 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x124 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x127 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x129 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x12c + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x12f + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x133 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x139 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x140 + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x149 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x14b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x14e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x150 + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x15b + {value: 0x0002, lo: 0x0a}, + {value: 0x0043, lo: 0xac, hi: 0xac}, + {value: 0x00d1, lo: 0xad, hi: 0xad}, + {value: 0x0045, lo: 0xae, hi: 0xae}, + {value: 0x0049, lo: 0xb0, hi: 0xb1}, + {value: 0x00ec, lo: 0xb2, hi: 0xb2}, + {value: 0x004f, lo: 0xb3, hi: 0xba}, + {value: 0x005f, lo: 0xbc, hi: 0xbc}, + {value: 0x00fe, lo: 0xbd, hi: 0xbd}, + {value: 0x0061, lo: 0xbe, hi: 0xbe}, + {value: 0x0065, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x166 + {value: 0x0000, lo: 0x0d}, + {value: 0x0001, lo: 0x80, hi: 0x8a}, + {value: 0x0532, lo: 0x91, hi: 0x91}, + {value: 0x43dc, lo: 0x97, hi: 0x97}, + {value: 0x001d, lo: 0xa4, hi: 0xa4}, + {value: 0x19a0, lo: 0xa5, hi: 0xa5}, + {value: 0x1c8c, lo: 0xa6, hi: 0xa6}, + {value: 0x0001, lo: 0xaf, hi: 0xaf}, + {value: 0x27c1, lo: 0xb3, hi: 0xb3}, + {value: 0x2935, lo: 0xb4, hi: 0xb4}, + {value: 0x27c8, lo: 0xb6, hi: 0xb6}, + {value: 0x293f, lo: 0xb7, hi: 0xb7}, + {value: 0x199a, lo: 0xbc, hi: 0xbc}, + {value: 0x43aa, lo: 0xbe, hi: 0xbe}, + // Block 0x3f, offset 0x174 + {value: 0x0002, lo: 0x0d}, + {value: 0x1a60, lo: 0x87, hi: 0x87}, + {value: 0x1a5d, lo: 0x88, hi: 0x88}, + {value: 0x199d, lo: 0x89, hi: 0x89}, + {value: 0x2ac5, lo: 0x97, hi: 0x97}, + {value: 0x0001, lo: 0x9f, hi: 0x9f}, + {value: 0x0021, lo: 0xb0, hi: 0xb0}, + {value: 0x0093, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb4, hi: 0xb9}, + {value: 0x0017, lo: 0xba, hi: 0xba}, + {value: 0x055e, lo: 0xbb, hi: 0xbb}, + {value: 0x003b, lo: 0xbc, hi: 0xbc}, + {value: 0x0011, lo: 0xbd, hi: 0xbe}, + {value: 0x009d, lo: 0xbf, hi: 0xbf}, + // Block 0x40, offset 0x182 + {value: 0x0002, lo: 0x0f}, + {value: 0x0021, lo: 0x80, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8a}, + {value: 0x055e, lo: 0x8b, hi: 0x8b}, + {value: 0x003b, lo: 0x8c, hi: 0x8c}, + {value: 0x0011, lo: 0x8d, hi: 0x8e}, + {value: 0x0083, lo: 0x90, hi: 0x90}, + {value: 0x008b, lo: 0x91, hi: 0x91}, + {value: 0x009f, lo: 0x92, hi: 0x92}, + {value: 0x00b1, lo: 0x93, hi: 0x93}, + {value: 0x011f, lo: 0x94, hi: 0x94}, + {value: 0x0091, lo: 0x95, hi: 0x95}, + {value: 0x0097, lo: 0x96, hi: 0x99}, + {value: 0x00a1, lo: 0x9a, hi: 0x9a}, + {value: 0x00a7, lo: 0x9b, hi: 0x9c}, + {value: 0x1ac9, lo: 0xa8, hi: 0xa8}, + // Block 0x41, offset 0x192 + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x42, offset 0x1a0 + {value: 0x0007, lo: 0x06}, + {value: 0x22b0, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x43, offset 0x1a7 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x44, offset 0x1ad + {value: 0x017a, lo: 0x0e}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa4}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0x27cf, lo: 0xac, hi: 0xad}, + {value: 0x27d6, lo: 0xaf, hi: 0xaf}, + {value: 0x2953, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x45, offset 0x1bc + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x46, offset 0x1c0 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x47, offset 0x1c2 + {value: 0x0002, lo: 0x03}, + {value: 0x0057, lo: 0x80, hi: 0x8f}, + {value: 0x0083, lo: 0x90, hi: 0xa9}, + {value: 0x0021, lo: 0xaa, hi: 0xaa}, + // Block 0x48, offset 0x1c6 + {value: 0x0000, lo: 0x01}, + {value: 0x2ad2, lo: 0x8c, hi: 0x8c}, + // Block 0x49, offset 0x1c8 + {value: 0x0266, lo: 0x02}, + {value: 0x1cbc, lo: 0xb4, hi: 0xb4}, + {value: 0x1a5a, lo: 0xb5, hi: 0xb6}, + // Block 0x4a, offset 0x1cb + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x4b, offset 0x1cd + {value: 0x0000, lo: 0x02}, + {value: 0x0095, lo: 0xbc, hi: 0xbc}, + {value: 0x006d, lo: 0xbd, hi: 0xbd}, + // Block 0x4c, offset 0x1d0 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x4d, offset 0x1d2 + {value: 0x0000, lo: 0x02}, + {value: 0x057a, lo: 0xaf, hi: 0xaf}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x4e, offset 0x1d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x4f, offset 0x1d7 + {value: 0x0000, lo: 0x01}, + {value: 0x0ebe, lo: 0x9f, hi: 0x9f}, + // Block 0x50, offset 0x1d9 + {value: 0x0000, lo: 0x01}, + {value: 0x172a, lo: 0xb3, hi: 0xb3}, + // Block 0x51, offset 0x1db + {value: 0x0004, lo: 0x0b}, + {value: 0x1692, lo: 0x80, hi: 0x82}, + {value: 0x16aa, lo: 0x83, hi: 0x83}, + {value: 0x16c2, lo: 0x84, hi: 0x85}, + {value: 0x16d2, lo: 0x86, hi: 0x89}, + {value: 0x16e6, lo: 0x8a, hi: 0x8c}, + {value: 0x16fa, lo: 0x8d, hi: 0x8d}, + {value: 0x1702, lo: 0x8e, hi: 0x8e}, + {value: 0x170a, lo: 0x8f, hi: 0x90}, + {value: 0x1716, lo: 0x91, hi: 0x93}, + {value: 0x1726, lo: 0x94, hi: 0x94}, + {value: 0x172e, lo: 0x95, hi: 0x95}, + // Block 0x52, offset 0x1e7 + {value: 0x0004, lo: 0x09}, + {value: 0x0001, lo: 0x80, hi: 0x80}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xae}, + {value: 0x8130, lo: 0xaf, hi: 0xaf}, + {value: 0x05ae, lo: 0xb6, hi: 0xb6}, + {value: 0x0982, lo: 0xb8, hi: 0xba}, + // Block 0x53, offset 0x1f1 + {value: 0x0006, lo: 0x09}, + {value: 0x0406, lo: 0xb1, hi: 0xb1}, + {value: 0x040a, lo: 0xb2, hi: 0xb2}, + {value: 0x4b7c, lo: 0xb3, hi: 0xb3}, + {value: 0x040e, lo: 0xb4, hi: 0xb4}, + {value: 0x4b82, lo: 0xb5, hi: 0xb6}, + {value: 0x0412, lo: 0xb7, hi: 0xb7}, + {value: 0x0416, lo: 0xb8, hi: 0xb8}, + {value: 0x041a, lo: 0xb9, hi: 0xb9}, + {value: 0x4b8e, lo: 0xba, hi: 0xbf}, + // Block 0x54, offset 0x1fb + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x55, offset 0x1fe + {value: 0x0000, lo: 0x03}, + {value: 0x02d8, lo: 0x9c, hi: 0x9c}, + {value: 0x02de, lo: 0x9d, hi: 0x9d}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x56, offset 0x202 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x57, offset 0x204 + {value: 0x0000, lo: 0x01}, + {value: 0x173e, lo: 0xb0, hi: 0xb0}, + // Block 0x58, offset 0x206 + {value: 0x0006, lo: 0x04}, + {value: 0x0047, lo: 0xb2, hi: 0xb3}, + {value: 0x0063, lo: 0xb4, hi: 0xb4}, + {value: 0x00dd, lo: 0xb8, hi: 0xb8}, + {value: 0x00e9, lo: 0xb9, hi: 0xb9}, + // Block 0x59, offset 0x20b + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x5a, offset 0x20e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x5b, offset 0x211 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x5c, offset 0x213 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x5d, offset 0x215 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x5e, offset 0x217 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x5f, offset 0x219 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x60, offset 0x21f + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x61, offset 0x222 + {value: 0x000c, lo: 0x04}, + {value: 0x173a, lo: 0x9c, hi: 0x9d}, + {value: 0x014f, lo: 0x9e, hi: 0x9e}, + {value: 0x174a, lo: 0x9f, hi: 0x9f}, + {value: 0x01a6, lo: 0xa9, hi: 0xa9}, + // Block 0x62, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x63, offset 0x229 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x64, offset 0x230 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x65, offset 0x236 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x66, offset 0x23c + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x67, offset 0x244 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x68, offset 0x24a + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x69, offset 0x250 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x6a, offset 0x256 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x6b, offset 0x25a + {value: 0x0002, lo: 0x01}, + {value: 0x0003, lo: 0x81, hi: 0xbf}, + // Block 0x6c, offset 0x25c + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x6d, offset 0x25e + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x6e, offset 0x260 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x6f, offset 0x262 + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x70, offset 0x268 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x71, offset 0x26b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x72, offset 0x26d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x73, offset 0x26f + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x74, offset 0x271 + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x75, offset 0x277 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x76, offset 0x27b + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x77, offset 0x27f + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x78, offset 0x287 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x79, offset 0x28e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7a, offset 0x291 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7b, offset 0x294 + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x7c, offset 0x296 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x7d, offset 0x299 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x7e, offset 0x2a1 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x7f, offset 0x2a5 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x80, offset 0x2ac + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x81, offset 0x2af + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x82, offset 0x2b5 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x83, offset 0x2b7 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x84, offset 0x2b9 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x85, offset 0x2bc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x86, offset 0x2be + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x87, offset 0x2c1 + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x88, offset 0x2c6 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x89, offset 0x2c8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8a, offset 0x2ca + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8b, offset 0x2cc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8c, offset 0x2ce + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x8d, offset 0x2d0 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x8e, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x8f, offset 0x2d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x90, offset 0x2d7 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x91, offset 0x2d9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x92, offset 0x2db + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x93, offset 0x2dd + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x94, offset 0x2df + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x95, offset 0x2ec + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x96, offset 0x2f6 + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x97, offset 0x2f8 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x98, offset 0x2fa + {value: 0x0002, lo: 0x03}, + {value: 0x0043, lo: 0x80, hi: 0x99}, + {value: 0x0083, lo: 0x9a, hi: 0xb3}, + {value: 0x0043, lo: 0xb4, hi: 0xbf}, + // Block 0x99, offset 0x2fe + {value: 0x0002, lo: 0x04}, + {value: 0x005b, lo: 0x80, hi: 0x8d}, + {value: 0x0083, lo: 0x8e, hi: 0x94}, + {value: 0x0093, lo: 0x96, hi: 0xa7}, + {value: 0x0043, lo: 0xa8, hi: 0xbf}, + // Block 0x9a, offset 0x303 + {value: 0x0002, lo: 0x0b}, + {value: 0x0073, lo: 0x80, hi: 0x81}, + {value: 0x0083, lo: 0x82, hi: 0x9b}, + {value: 0x0043, lo: 0x9c, hi: 0x9c}, + {value: 0x0047, lo: 0x9e, hi: 0x9f}, + {value: 0x004f, lo: 0xa2, hi: 0xa2}, + {value: 0x0055, lo: 0xa5, hi: 0xa6}, + {value: 0x005d, lo: 0xa9, hi: 0xac}, + {value: 0x0067, lo: 0xae, hi: 0xb5}, + {value: 0x0083, lo: 0xb6, hi: 0xb9}, + {value: 0x008d, lo: 0xbb, hi: 0xbb}, + {value: 0x0091, lo: 0xbd, hi: 0xbf}, + // Block 0x9b, offset 0x30f + {value: 0x0002, lo: 0x04}, + {value: 0x0097, lo: 0x80, hi: 0x83}, + {value: 0x00a1, lo: 0x85, hi: 0x8f}, + {value: 0x0043, lo: 0x90, hi: 0xa9}, + {value: 0x0083, lo: 0xaa, hi: 0xbf}, + // Block 0x9c, offset 0x314 + {value: 0x0002, lo: 0x08}, + {value: 0x00af, lo: 0x80, hi: 0x83}, + {value: 0x0043, lo: 0x84, hi: 0x85}, + {value: 0x0049, lo: 0x87, hi: 0x8a}, + {value: 0x0055, lo: 0x8d, hi: 0x94}, + {value: 0x0067, lo: 0x96, hi: 0x9c}, + {value: 0x0083, lo: 0x9e, hi: 0xb7}, + {value: 0x0043, lo: 0xb8, hi: 0xb9}, + {value: 0x0049, lo: 0xbb, hi: 0xbe}, + // Block 0x9d, offset 0x31d + {value: 0x0002, lo: 0x05}, + {value: 0x0053, lo: 0x80, hi: 0x84}, + {value: 0x005f, lo: 0x86, hi: 0x86}, + {value: 0x0067, lo: 0x8a, hi: 0x90}, + {value: 0x0083, lo: 0x92, hi: 0xab}, + {value: 0x0043, lo: 0xac, hi: 0xbf}, + // Block 0x9e, offset 0x323 + {value: 0x0002, lo: 0x04}, + {value: 0x006b, lo: 0x80, hi: 0x85}, + {value: 0x0083, lo: 0x86, hi: 0x9f}, + {value: 0x0043, lo: 0xa0, hi: 0xb9}, + {value: 0x0083, lo: 0xba, hi: 0xbf}, + // Block 0x9f, offset 0x328 + {value: 0x0002, lo: 0x03}, + {value: 0x008f, lo: 0x80, hi: 0x93}, + {value: 0x0043, lo: 0x94, hi: 0xad}, + {value: 0x0083, lo: 0xae, hi: 0xbf}, + // Block 0xa0, offset 0x32c + {value: 0x0002, lo: 0x04}, + {value: 0x00a7, lo: 0x80, hi: 0x87}, + {value: 0x0043, lo: 0x88, hi: 0xa1}, + {value: 0x0083, lo: 0xa2, hi: 0xbb}, + {value: 0x0043, lo: 0xbc, hi: 0xbf}, + // Block 0xa1, offset 0x331 + {value: 0x0002, lo: 0x03}, + {value: 0x004b, lo: 0x80, hi: 0x95}, + {value: 0x0083, lo: 0x96, hi: 0xaf}, + {value: 0x0043, lo: 0xb0, hi: 0xbf}, + // Block 0xa2, offset 0x335 + {value: 0x0003, lo: 0x0f}, + {value: 0x023c, lo: 0x80, hi: 0x80}, + {value: 0x0556, lo: 0x81, hi: 0x81}, + {value: 0x023f, lo: 0x82, hi: 0x9a}, + {value: 0x0552, lo: 0x9b, hi: 0x9b}, + {value: 0x024b, lo: 0x9c, hi: 0x9c}, + {value: 0x0254, lo: 0x9d, hi: 0x9d}, + {value: 0x025a, lo: 0x9e, hi: 0x9e}, + {value: 0x027e, lo: 0x9f, hi: 0x9f}, + {value: 0x026f, lo: 0xa0, hi: 0xa0}, + {value: 0x026c, lo: 0xa1, hi: 0xa1}, + {value: 0x01f7, lo: 0xa2, hi: 0xb2}, + {value: 0x020c, lo: 0xb3, hi: 0xb3}, + {value: 0x022a, lo: 0xb4, hi: 0xba}, + {value: 0x0556, lo: 0xbb, hi: 0xbb}, + {value: 0x023f, lo: 0xbc, hi: 0xbf}, + // Block 0xa3, offset 0x345 + {value: 0x0003, lo: 0x0d}, + {value: 0x024b, lo: 0x80, hi: 0x94}, + {value: 0x0552, lo: 0x95, hi: 0x95}, + {value: 0x024b, lo: 0x96, hi: 0x96}, + {value: 0x0254, lo: 0x97, hi: 0x97}, + {value: 0x025a, lo: 0x98, hi: 0x98}, + {value: 0x027e, lo: 0x99, hi: 0x99}, + {value: 0x026f, lo: 0x9a, hi: 0x9a}, + {value: 0x026c, lo: 0x9b, hi: 0x9b}, + {value: 0x01f7, lo: 0x9c, hi: 0xac}, + {value: 0x020c, lo: 0xad, hi: 0xad}, + {value: 0x022a, lo: 0xae, hi: 0xb4}, + {value: 0x0556, lo: 0xb5, hi: 0xb5}, + {value: 0x023f, lo: 0xb6, hi: 0xbf}, + // Block 0xa4, offset 0x353 + {value: 0x0003, lo: 0x0d}, + {value: 0x025d, lo: 0x80, hi: 0x8e}, + {value: 0x0552, lo: 0x8f, hi: 0x8f}, + {value: 0x024b, lo: 0x90, hi: 0x90}, + {value: 0x0254, lo: 0x91, hi: 0x91}, + {value: 0x025a, lo: 0x92, hi: 0x92}, + {value: 0x027e, lo: 0x93, hi: 0x93}, + {value: 0x026f, lo: 0x94, hi: 0x94}, + {value: 0x026c, lo: 0x95, hi: 0x95}, + {value: 0x01f7, lo: 0x96, hi: 0xa6}, + {value: 0x020c, lo: 0xa7, hi: 0xa7}, + {value: 0x022a, lo: 0xa8, hi: 0xae}, + {value: 0x0556, lo: 0xaf, hi: 0xaf}, + {value: 0x023f, lo: 0xb0, hi: 0xbf}, + // Block 0xa5, offset 0x361 + {value: 0x0003, lo: 0x0d}, + {value: 0x026f, lo: 0x80, hi: 0x88}, + {value: 0x0552, lo: 0x89, hi: 0x89}, + {value: 0x024b, lo: 0x8a, hi: 0x8a}, + {value: 0x0254, lo: 0x8b, hi: 0x8b}, + {value: 0x025a, lo: 0x8c, hi: 0x8c}, + {value: 0x027e, lo: 0x8d, hi: 0x8d}, + {value: 0x026f, lo: 0x8e, hi: 0x8e}, + {value: 0x026c, lo: 0x8f, hi: 0x8f}, + {value: 0x01f7, lo: 0x90, hi: 0xa0}, + {value: 0x020c, lo: 0xa1, hi: 0xa1}, + {value: 0x022a, lo: 0xa2, hi: 0xa8}, + {value: 0x0556, lo: 0xa9, hi: 0xa9}, + {value: 0x023f, lo: 0xaa, hi: 0xbf}, + // Block 0xa6, offset 0x36f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0xa7, offset 0x371 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0xa8, offset 0x373 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0xa9, offset 0x375 + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xaa, offset 0x379 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xab, offset 0x37b + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xac, offset 0x37e + {value: 0x0002, lo: 0x0a}, + {value: 0x0063, lo: 0x80, hi: 0x89}, + {value: 0x1a7e, lo: 0x8a, hi: 0x8a}, + {value: 0x1ab1, lo: 0x8b, hi: 0x8b}, + {value: 0x1acc, lo: 0x8c, hi: 0x8c}, + {value: 0x1ad2, lo: 0x8d, hi: 0x8d}, + {value: 0x1cf0, lo: 0x8e, hi: 0x8e}, + {value: 0x1ade, lo: 0x8f, hi: 0x8f}, + {value: 0x1aa8, lo: 0xaa, hi: 0xaa}, + {value: 0x1aab, lo: 0xab, hi: 0xab}, + {value: 0x1aae, lo: 0xac, hi: 0xac}, + // Block 0xad, offset 0x389 + {value: 0x0000, lo: 0x01}, + {value: 0x1a6c, lo: 0x90, hi: 0x90}, + // Block 0xae, offset 0x38b + {value: 0x0028, lo: 0x09}, + {value: 0x2999, lo: 0x80, hi: 0x80}, + {value: 0x295d, lo: 0x81, hi: 0x81}, + {value: 0x2967, lo: 0x82, hi: 0x82}, + {value: 0x297b, lo: 0x83, hi: 0x84}, + {value: 0x2985, lo: 0x85, hi: 0x86}, + {value: 0x2971, lo: 0x87, hi: 0x87}, + {value: 0x298f, lo: 0x88, hi: 0x88}, + {value: 0x0c6a, lo: 0x90, hi: 0x90}, + {value: 0x09e2, lo: 0x91, hi: 0x91}, + // Block 0xaf, offset 0x395 + {value: 0x0002, lo: 0x01}, + {value: 0x0021, lo: 0xb0, hi: 0xb9}, +} + +// recompMap: 7528 bytes (entries only) +var recompMap map[uint32]rune +var recompMapOnce sync.Once + +const recompMapPacked = "" + + "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0 + "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1 + "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2 + "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3 + "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4 + "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5 + "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7 + "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8 + "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9 + "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA + "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB + "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC + "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD + "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE + "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF + "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1 + "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2 + "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3 + "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4 + "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5 + "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6 + "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9 + "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA + "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB + "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC + "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD + "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0 + "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1 + "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2 + "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3 + "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4 + "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5 + "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7 + "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8 + "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9 + "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA + "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB + "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC + "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED + "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE + "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF + "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1 + "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2 + "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3 + "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4 + "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5 + "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6 + "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9 + "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA + "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB + "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC + "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD + "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF + "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100 + "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101 + "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102 + "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103 + "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104 + "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105 + "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106 + "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107 + "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108 + "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109 + "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A + "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B + "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C + "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D + "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E + "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F + "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112 + "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113 + "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114 + "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115 + "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116 + "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117 + "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118 + "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119 + "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A + "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B + "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C + "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D + "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E + "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F + "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120 + "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121 + "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122 + "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123 + "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124 + "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125 + "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128 + "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129 + "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A + "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B + "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C + "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D + "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E + "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F + "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130 + "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134 + "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135 + "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136 + "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137 + "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139 + "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A + "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B + "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C + "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D + "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E + "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143 + "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144 + "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145 + "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146 + "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147 + "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148 + "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C + "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D + "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E + "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F + "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150 + "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151 + "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154 + "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155 + "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156 + "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157 + "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158 + "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159 + "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A + "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B + "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C + "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D + "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E + "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F + "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160 + "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161 + "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162 + "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163 + "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164 + "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165 + "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168 + "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169 + "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A + "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B + "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C + "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D + "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E + "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F + "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170 + "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171 + "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172 + "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173 + "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174 + "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175 + "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176 + "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177 + "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178 + "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179 + "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A + "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B + "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C + "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D + "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E + "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0 + "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1 + "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF + "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0 + "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD + "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE + "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF + "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0 + "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1 + "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2 + "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3 + "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4 + "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5 + "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6 + "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7 + "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8 + "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9 + "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA + "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB + "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC + "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE + "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF + "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0 + "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1 + "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2 + "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3 + "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6 + "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7 + "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8 + "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9 + "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA + "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB + "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC + "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED + "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE + "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF + "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0 + "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4 + "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5 + "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8 + "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9 + "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA + "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB + "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC + "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD + "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE + "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF + "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200 + "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201 + "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202 + "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203 + "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204 + "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205 + "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206 + "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207 + "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208 + "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209 + "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A + "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B + "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C + "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D + "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E + "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F + "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210 + "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211 + "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212 + "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213 + "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214 + "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215 + "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216 + "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217 + "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218 + "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219 + "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A + "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B + "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E + "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F + "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226 + "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227 + "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228 + "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229 + "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A + "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B + "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C + "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D + "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E + "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F + "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230 + "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231 + "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232 + "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233 + "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385 + "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386 + "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388 + "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389 + "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A + "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C + "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E + "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F + "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390 + "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA + "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB + "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC + "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD + "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE + "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF + "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0 + "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA + "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB + "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC + "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD + "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE + "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3 + "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4 + "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400 + "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401 + "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403 + "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407 + "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C + "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D + "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E + "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419 + "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439 + "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450 + "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451 + "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453 + "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457 + "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C + "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D + "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E + "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476 + "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477 + "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1 + "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2 + "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0 + "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1 + "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2 + "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3 + "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6 + "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7 + "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA + "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB + "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC + "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD + "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE + "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF + "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2 + "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3 + "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4 + "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5 + "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6 + "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7 + "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA + "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB + "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC + "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED + "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE + "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF + "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0 + "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1 + "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2 + "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3 + "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4 + "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5 + "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8 + "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9 + "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622 + "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623 + "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624 + "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625 + "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626 + "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0 + "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2 + "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3 + "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929 + "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931 + "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934 + "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB + "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC + "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48 + "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B + "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C + "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94 + "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA + "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB + "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC + "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48 + "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0 + "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7 + "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8 + "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA + "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB + "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A + "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B + "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C + "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA + "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC + "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD + "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE + "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026 + "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06 + "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08 + "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A + "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C + "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E + "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12 + "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B + "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D + "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40 + "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41 + "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43 + "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00 + "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01 + "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02 + "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03 + "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04 + "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05 + "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06 + "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07 + "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08 + "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09 + "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A + "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B + "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C + "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D + "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E + "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F + "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10 + "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11 + "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12 + "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13 + "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14 + "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15 + "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16 + "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17 + "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18 + "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19 + "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A + "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B + "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C + "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D + "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E + "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F + "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20 + "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21 + "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22 + "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23 + "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24 + "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25 + "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26 + "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27 + "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28 + "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29 + "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A + "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B + "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C + "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D + "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E + "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F + "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30 + "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31 + "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32 + "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33 + "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34 + "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35 + "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36 + "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37 + "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38 + "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39 + "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A + "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B + "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C + "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D + "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E + "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F + "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40 + "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41 + "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42 + "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43 + "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44 + "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45 + "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46 + "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47 + "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48 + "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49 + "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A + "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B + "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C + "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D + "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E + "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F + "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50 + "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51 + "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52 + "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53 + "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54 + "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55 + "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56 + "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57 + "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58 + "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59 + "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A + "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B + "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C + "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D + "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E + "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F + "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60 + "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61 + "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62 + "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63 + "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64 + "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65 + "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66 + "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67 + "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68 + "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69 + "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A + "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B + "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C + "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D + "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E + "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F + "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70 + "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71 + "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72 + "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73 + "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74 + "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75 + "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76 + "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77 + "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78 + "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79 + "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A + "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B + "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C + "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D + "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E + "\x00v\x03#\x00\x00\x1e\x7f" + // 0x00760323: 0x00001E7F + "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80 + "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81 + "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82 + "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83 + "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84 + "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85 + "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86 + "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87 + "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88 + "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89 + "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A + "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B + "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C + "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D + "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E + "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F + "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90 + "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91 + "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92 + "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93 + "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94 + "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95 + "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96 + "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97 + "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98 + "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99 + "\x01\x7f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B + "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0 + "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1 + "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2 + "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3 + "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4 + "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5 + "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6 + "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7 + "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8 + "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9 + "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA + "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB + "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC + "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD + "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE + "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF + "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0 + "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1 + "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2 + "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3 + "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4 + "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5 + "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6 + "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7 + "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8 + "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9 + "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA + "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB + "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC + "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD + "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE + "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF + "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0 + "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1 + "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2 + "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3 + "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4 + "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5 + "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6 + "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7 + "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8 + "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9 + "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA + "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB + "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC + "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD + "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE + "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF + "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0 + "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1 + "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2 + "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3 + "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4 + "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5 + "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6 + "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7 + "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8 + "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9 + "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA + "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB + "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC + "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD + "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE + "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF + "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0 + "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1 + "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2 + "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3 + "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4 + "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5 + "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6 + "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7 + "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8 + "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9 + "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA + "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB + "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC + "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED + "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE + "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF + "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0 + "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1 + "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2 + "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3 + "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4 + "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5 + "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6 + "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7 + "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8 + "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9 + "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00 + "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01 + "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02 + "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03 + "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04 + "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05 + "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06 + "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07 + "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08 + "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09 + "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A + "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B + "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C + "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D + "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E + "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F + "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10 + "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11 + "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12 + "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13 + "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14 + "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15 + "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18 + "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19 + "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A + "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B + "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C + "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D + "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20 + "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21 + "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22 + "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23 + "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24 + "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25 + "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26 + "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27 + "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28 + "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29 + "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A + "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B + "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C + "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D + "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E + "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F + "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30 + "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31 + "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32 + "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33 + "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34 + "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35 + "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36 + "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37 + "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38 + "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39 + "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A + "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B + "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C + "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D + "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E + "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F + "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40 + "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41 + "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42 + "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43 + "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44 + "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45 + "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48 + "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49 + "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A + "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B + "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C + "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D + "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50 + "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51 + "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52 + "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53 + "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54 + "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55 + "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56 + "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57 + "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59 + "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B + "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D + "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F + "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60 + "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61 + "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62 + "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63 + "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64 + "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65 + "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66 + "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67 + "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68 + "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69 + "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A + "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B + "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C + "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D + "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E + "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F + "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70 + "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72 + "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74 + "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76 + "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78 + "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A + "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C + "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80 + "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81 + "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82 + "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83 + "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84 + "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85 + "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86 + "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87 + "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88 + "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89 + "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A + "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B + "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C + "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D + "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E + "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F + "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90 + "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91 + "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92 + "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93 + "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94 + "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95 + "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96 + "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97 + "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98 + "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99 + "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A + "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B + "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C + "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D + "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E + "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F + "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0 + "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1 + "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2 + "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3 + "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4 + "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5 + "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6 + "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7 + "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8 + "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9 + "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA + "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB + "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC + "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD + "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE + "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF + "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0 + "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1 + "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2 + "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3 + "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4 + "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6 + "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7 + "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8 + "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9 + "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA + "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC + "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1 + "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2 + "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3 + "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4 + "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6 + "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7 + "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8 + "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA + "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC + "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD + "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE + "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF + "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0 + "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1 + "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2 + "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6 + "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7 + "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8 + "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9 + "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA + "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD + "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE + "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF + "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0 + "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1 + "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2 + "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4 + "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5 + "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6 + "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7 + "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8 + "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9 + "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA + "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC + "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED + "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2 + "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3 + "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4 + "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6 + "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7 + "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8 + "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA + "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC + "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A + "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B + "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE + "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD + "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE + "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF + "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204 + "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209 + "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C + "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224 + "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226 + "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241 + "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244 + "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247 + "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249 + "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260 + "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262 + "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D + "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E + "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F + "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270 + "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271 + "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274 + "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275 + "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278 + "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279 + "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280 + "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281 + "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284 + "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285 + "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288 + "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289 + "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC + "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD + "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE + "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF + "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0 + "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1 + "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2 + "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3 + "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA + "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB + "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC + "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED + "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C + "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E + "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050 + "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052 + "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054 + "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056 + "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058 + "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A + "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C + "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E + "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060 + "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062 + "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065 + "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067 + "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069 + "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070 + "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071 + "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073 + "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074 + "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076 + "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077 + "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079 + "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A + "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C + "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D + "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094 + "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E + "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC + "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE + "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0 + "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2 + "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4 + "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6 + "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8 + "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA + "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC + "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE + "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0 + "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2 + "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5 + "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7 + "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9 + "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0 + "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1 + "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3 + "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4 + "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6 + "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7 + "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9 + "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA + "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC + "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD + "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4 + "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7 + "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8 + "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9 + "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA + "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE + "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A + "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C + "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB + "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E + "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F + "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B + "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C + "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB + "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC + "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE + "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA + "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB + "\x195\x190\x00\x01\x198" + // 0x19351930: 0x00011938 + "" + // Total size of tables: 56KB (57068 bytes) diff --git a/vendor/golang.org/x/text/width/tables13.0.0.go b/vendor/golang.org/x/text/width/tables13.0.0.go index ab258e3848..b1fcb522cb 100644 --- a/vendor/golang.org/x/text/width/tables13.0.0.go +++ b/vendor/golang.org/x/text/width/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package width diff --git a/vendor/golang.org/x/text/width/tables15.0.0.go b/vendor/golang.org/x/text/width/tables15.0.0.go new file mode 100644 index 0000000000..4b91e3384d --- /dev/null +++ b/vendor/golang.org/x/text/width/tables15.0.0.go @@ -0,0 +1,1368 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package width + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// 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 *widthTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[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 := widthIndex[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 := widthIndex[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 = widthIndex[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 := widthIndex[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 = widthIndex[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 = widthIndex[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 *widthTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[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 *widthTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[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 := widthIndex[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 := widthIndex[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 = widthIndex[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 := widthIndex[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 = widthIndex[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 = widthIndex[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 *widthTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// widthTrie. Total size: 14912 bytes (14.56 KiB). Checksum: 4468b6cd178303d2. +type widthTrie struct{} + +func newWidthTrie(i int) *widthTrie { + return &widthTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *widthTrie) lookupValue(n uint32, b byte) uint16 { + switch { + default: + return uint16(widthValues[n<<6+uint32(b)]) + } +} + +// widthValues: 105 blocks, 6720 entries, 13440 bytes +// The third block is the zero block. +var widthValues = [6720]uint16{ + // Block 0x0, offset 0x0 + 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002, + 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002, + 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002, + 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002, + 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002, + 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002, + // Block 0x1, offset 0x40 + 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003, + 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003, + 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003, + 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003, + 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003, + 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004, + 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004, + 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004, + 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004, + 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004, + 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005, + 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000, + 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008, + 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000, + 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000, + 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000, + // Block 0x4, offset 0x100 + 0x106: 0x2000, + 0x110: 0x2000, + 0x117: 0x2000, + 0x118: 0x2000, + 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000, + 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000, + 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000, + 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000, + 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000, + 0x13c: 0x2000, 0x13e: 0x2000, + // Block 0x5, offset 0x140 + 0x141: 0x2000, + 0x151: 0x2000, + 0x153: 0x2000, + 0x15b: 0x2000, + 0x166: 0x2000, 0x167: 0x2000, + 0x16b: 0x2000, + 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000, + 0x178: 0x2000, + 0x17f: 0x2000, + // Block 0x6, offset 0x180 + 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000, + 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000, + 0x18d: 0x2000, + 0x192: 0x2000, 0x193: 0x2000, + 0x1a6: 0x2000, 0x1a7: 0x2000, + 0x1ab: 0x2000, + // Block 0x7, offset 0x1c0 + 0x1ce: 0x2000, 0x1d0: 0x2000, + 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000, + 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000, + // Block 0x8, offset 0x200 + 0x211: 0x2000, + 0x221: 0x2000, + // Block 0x9, offset 0x240 + 0x244: 0x2000, + 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000, + 0x24d: 0x2000, 0x250: 0x2000, + 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000, + 0x25f: 0x2000, + // Block 0xa, offset 0x280 + 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000, + 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000, + 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000, + 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000, + 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000, + 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000, + 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000, + 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000, + 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000, + 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000, + 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000, + 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000, + 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000, + 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000, + 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000, + 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000, + 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000, + 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000, + // Block 0xc, offset 0x300 + 0x311: 0x2000, + 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000, + 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000, + 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000, + 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000, + 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000, + 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000, + 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000, + // Block 0xd, offset 0x340 + 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000, + 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000, + // Block 0xe, offset 0x380 + 0x381: 0x2000, + 0x390: 0x2000, 0x391: 0x2000, + 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000, + 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000, + 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000, + 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000, + 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000, + 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000, + 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000, + 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000, + 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000, + 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000, + // Block 0x10, offset 0x400 + 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000, + 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000, + 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000, + 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000, + 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000, + 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000, + 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000, + 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000, + 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000, + 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000, + 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000, + // Block 0x11, offset 0x440 + 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000, + 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000, + 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000, + 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000, + 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000, + 0x45e: 0x4000, 0x45f: 0x4000, + // Block 0x12, offset 0x480 + 0x490: 0x2000, + 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000, + 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000, + 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000, + 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000, + 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000, + 0x4bb: 0x2000, + 0x4be: 0x2000, + // Block 0x13, offset 0x4c0 + 0x4f4: 0x2000, + 0x4ff: 0x2000, + // Block 0x14, offset 0x500 + 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000, + 0x529: 0xa009, + 0x52c: 0x2000, + // Block 0x15, offset 0x540 + 0x543: 0x2000, 0x545: 0x2000, + 0x549: 0x2000, + 0x553: 0x2000, 0x556: 0x2000, + 0x561: 0x2000, 0x562: 0x2000, + 0x566: 0x2000, + 0x56b: 0x2000, + // Block 0x16, offset 0x580 + 0x593: 0x2000, 0x594: 0x2000, + 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000, + 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000, + 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000, + 0x5aa: 0x2000, 0x5ab: 0x2000, + 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000, + 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000, + // Block 0x17, offset 0x5c0 + 0x5c9: 0x2000, + 0x5d0: 0x200a, 0x5d1: 0x200b, + 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000, + 0x5d8: 0x2000, 0x5d9: 0x2000, + 0x5f8: 0x2000, 0x5f9: 0x2000, + // Block 0x18, offset 0x600 + 0x612: 0x2000, 0x614: 0x2000, + 0x627: 0x2000, + // Block 0x19, offset 0x640 + 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000, + 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000, + 0x64f: 0x2000, 0x651: 0x2000, + 0x655: 0x2000, + 0x65a: 0x2000, 0x65d: 0x2000, + 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000, + 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000, + 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000, + 0x674: 0x2000, 0x675: 0x2000, + 0x676: 0x2000, 0x677: 0x2000, + 0x67c: 0x2000, 0x67d: 0x2000, + // Block 0x1a, offset 0x680 + 0x688: 0x2000, + 0x68c: 0x2000, + 0x692: 0x2000, + 0x6a0: 0x2000, 0x6a1: 0x2000, + 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000, + 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000, + // Block 0x1b, offset 0x6c0 + 0x6c2: 0x2000, 0x6c3: 0x2000, + 0x6c6: 0x2000, 0x6c7: 0x2000, + 0x6d5: 0x2000, + 0x6d9: 0x2000, + 0x6e5: 0x2000, + 0x6ff: 0x2000, + // Block 0x1c, offset 0x700 + 0x712: 0x2000, + 0x71a: 0x4000, 0x71b: 0x4000, + 0x729: 0x4000, + 0x72a: 0x4000, + // Block 0x1d, offset 0x740 + 0x769: 0x4000, + 0x76a: 0x4000, 0x76b: 0x4000, 0x76c: 0x4000, + 0x770: 0x4000, 0x773: 0x4000, + // Block 0x1e, offset 0x780 + 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000, + 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000, + 0x7aa: 0x2000, 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000, + 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000, + 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000, + 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x2000, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000, + 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000, + 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000, + 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000, + 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000, + 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000, + 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000, + 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000, + 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000, + 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000, + 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000, + // Block 0x20, offset 0x800 + 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x200d, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000, + 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000, + 0x80c: 0x2000, 0x80d: 0x2000, 0x80e: 0x2000, 0x80f: 0x2000, 0x810: 0x2000, 0x811: 0x2000, + 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000, + 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000, + 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000, + 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000, + 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000, + 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, 0x834: 0x2000, 0x835: 0x2000, + 0x836: 0x2000, 0x837: 0x2000, 0x838: 0x2000, 0x839: 0x2000, 0x83a: 0x2000, 0x83b: 0x2000, + 0x83c: 0x2000, 0x83d: 0x2000, 0x83e: 0x2000, 0x83f: 0x2000, + // Block 0x21, offset 0x840 + 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000, + 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000, + 0x850: 0x2000, 0x851: 0x2000, + 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, 0x856: 0x2000, 0x857: 0x2000, + 0x858: 0x2000, 0x859: 0x2000, 0x85a: 0x2000, 0x85b: 0x2000, 0x85c: 0x2000, 0x85d: 0x2000, + 0x85e: 0x2000, 0x85f: 0x2000, 0x860: 0x2000, 0x861: 0x2000, 0x862: 0x2000, 0x863: 0x2000, + 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000, + 0x86a: 0x2000, 0x86b: 0x2000, 0x86c: 0x2000, 0x86d: 0x2000, 0x86e: 0x2000, 0x86f: 0x2000, + 0x870: 0x2000, 0x871: 0x2000, 0x872: 0x2000, 0x873: 0x2000, + // Block 0x22, offset 0x880 + 0x880: 0x2000, 0x881: 0x2000, 0x882: 0x2000, 0x883: 0x2000, 0x884: 0x2000, 0x885: 0x2000, + 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x889: 0x2000, 0x88a: 0x2000, 0x88b: 0x2000, + 0x88c: 0x2000, 0x88d: 0x2000, 0x88e: 0x2000, 0x88f: 0x2000, + 0x892: 0x2000, 0x893: 0x2000, 0x894: 0x2000, 0x895: 0x2000, + 0x8a0: 0x200e, 0x8a1: 0x2000, 0x8a3: 0x2000, + 0x8a4: 0x2000, 0x8a5: 0x2000, 0x8a6: 0x2000, 0x8a7: 0x2000, 0x8a8: 0x2000, 0x8a9: 0x2000, + 0x8b2: 0x2000, 0x8b3: 0x2000, + 0x8b6: 0x2000, 0x8b7: 0x2000, + 0x8bc: 0x2000, 0x8bd: 0x2000, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x2000, 0x8c1: 0x2000, + 0x8c6: 0x2000, 0x8c7: 0x2000, 0x8c8: 0x2000, 0x8cb: 0x200f, + 0x8ce: 0x2000, 0x8cf: 0x2000, 0x8d0: 0x2000, 0x8d1: 0x2000, + 0x8e2: 0x2000, 0x8e3: 0x2000, + 0x8e4: 0x2000, 0x8e5: 0x2000, + 0x8ef: 0x2000, + 0x8fd: 0x4000, 0x8fe: 0x4000, + // Block 0x24, offset 0x900 + 0x905: 0x2000, + 0x906: 0x2000, 0x909: 0x2000, + 0x90e: 0x2000, 0x90f: 0x2000, + 0x914: 0x4000, 0x915: 0x4000, + 0x91c: 0x2000, + 0x91e: 0x2000, + // Block 0x25, offset 0x940 + 0x940: 0x2000, 0x942: 0x2000, + 0x948: 0x4000, 0x949: 0x4000, 0x94a: 0x4000, 0x94b: 0x4000, + 0x94c: 0x4000, 0x94d: 0x4000, 0x94e: 0x4000, 0x94f: 0x4000, 0x950: 0x4000, 0x951: 0x4000, + 0x952: 0x4000, 0x953: 0x4000, + 0x960: 0x2000, 0x961: 0x2000, 0x963: 0x2000, + 0x964: 0x2000, 0x965: 0x2000, 0x967: 0x2000, 0x968: 0x2000, 0x969: 0x2000, + 0x96a: 0x2000, 0x96c: 0x2000, 0x96d: 0x2000, 0x96f: 0x2000, + 0x97f: 0x4000, + // Block 0x26, offset 0x980 + 0x993: 0x4000, + 0x99e: 0x2000, 0x99f: 0x2000, 0x9a1: 0x4000, + 0x9aa: 0x4000, 0x9ab: 0x4000, + 0x9bd: 0x4000, 0x9be: 0x4000, 0x9bf: 0x2000, + // Block 0x27, offset 0x9c0 + 0x9c4: 0x4000, 0x9c5: 0x4000, + 0x9c6: 0x2000, 0x9c7: 0x2000, 0x9c8: 0x2000, 0x9c9: 0x2000, 0x9ca: 0x2000, 0x9cb: 0x2000, + 0x9cc: 0x2000, 0x9cd: 0x2000, 0x9ce: 0x4000, 0x9cf: 0x2000, 0x9d0: 0x2000, 0x9d1: 0x2000, + 0x9d2: 0x2000, 0x9d3: 0x2000, 0x9d4: 0x4000, 0x9d5: 0x2000, 0x9d6: 0x2000, 0x9d7: 0x2000, + 0x9d8: 0x2000, 0x9d9: 0x2000, 0x9da: 0x2000, 0x9db: 0x2000, 0x9dc: 0x2000, 0x9dd: 0x2000, + 0x9de: 0x2000, 0x9df: 0x2000, 0x9e0: 0x2000, 0x9e1: 0x2000, 0x9e3: 0x2000, + 0x9e8: 0x2000, 0x9e9: 0x2000, + 0x9ea: 0x4000, 0x9eb: 0x2000, 0x9ec: 0x2000, 0x9ed: 0x2000, 0x9ee: 0x2000, 0x9ef: 0x2000, + 0x9f0: 0x2000, 0x9f1: 0x2000, 0x9f2: 0x4000, 0x9f3: 0x4000, 0x9f4: 0x2000, 0x9f5: 0x4000, + 0x9f6: 0x2000, 0x9f7: 0x2000, 0x9f8: 0x2000, 0x9f9: 0x2000, 0x9fa: 0x4000, 0x9fb: 0x2000, + 0x9fc: 0x2000, 0x9fd: 0x4000, 0x9fe: 0x2000, 0x9ff: 0x2000, + // Block 0x28, offset 0xa00 + 0xa05: 0x4000, + 0xa0a: 0x4000, 0xa0b: 0x4000, + 0xa28: 0x4000, + 0xa3d: 0x2000, + // Block 0x29, offset 0xa40 + 0xa4c: 0x4000, 0xa4e: 0x4000, + 0xa53: 0x4000, 0xa54: 0x4000, 0xa55: 0x4000, 0xa57: 0x4000, + 0xa76: 0x2000, 0xa77: 0x2000, 0xa78: 0x2000, 0xa79: 0x2000, 0xa7a: 0x2000, 0xa7b: 0x2000, + 0xa7c: 0x2000, 0xa7d: 0x2000, 0xa7e: 0x2000, 0xa7f: 0x2000, + // Block 0x2a, offset 0xa80 + 0xa95: 0x4000, 0xa96: 0x4000, 0xa97: 0x4000, + 0xab0: 0x4000, + 0xabf: 0x4000, + // Block 0x2b, offset 0xac0 + 0xae6: 0x6000, 0xae7: 0x6000, 0xae8: 0x6000, 0xae9: 0x6000, + 0xaea: 0x6000, 0xaeb: 0x6000, 0xaec: 0x6000, 0xaed: 0x6000, + // Block 0x2c, offset 0xb00 + 0xb05: 0x6010, + 0xb06: 0x6011, + // Block 0x2d, offset 0xb40 + 0xb5b: 0x4000, 0xb5c: 0x4000, + // Block 0x2e, offset 0xb80 + 0xb90: 0x4000, + 0xb95: 0x4000, 0xb96: 0x2000, 0xb97: 0x2000, + 0xb98: 0x2000, 0xb99: 0x2000, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x4000, 0xbc1: 0x4000, 0xbc2: 0x4000, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000, + 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000, + 0xbcc: 0x4000, 0xbcd: 0x4000, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000, + 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000, + 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000, + 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000, + 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000, + 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000, + 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000, + 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000, + 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, 0xbff: 0x4000, + // Block 0x30, offset 0xc00 + 0xc00: 0x4000, 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000, + 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000, + 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000, + 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000, + 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000, + 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000, + 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000, + 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000, + 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000, + // Block 0x31, offset 0xc40 + 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000, + 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000, + 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000, + 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000, + 0xc70: 0x4000, 0xc71: 0x4000, 0xc72: 0x4000, 0xc73: 0x4000, 0xc74: 0x4000, 0xc75: 0x4000, + 0xc76: 0x4000, 0xc77: 0x4000, 0xc78: 0x4000, 0xc79: 0x4000, 0xc7a: 0x4000, 0xc7b: 0x4000, + // Block 0x32, offset 0xc80 + 0xc80: 0x9012, 0xc81: 0x4013, 0xc82: 0x4014, 0xc83: 0x4000, 0xc84: 0x4000, 0xc85: 0x4000, + 0xc86: 0x4000, 0xc87: 0x4000, 0xc88: 0x4000, 0xc89: 0x4000, 0xc8a: 0x4000, 0xc8b: 0x4000, + 0xc8c: 0x4015, 0xc8d: 0x4015, 0xc8e: 0x4000, 0xc8f: 0x4000, 0xc90: 0x4000, 0xc91: 0x4000, + 0xc92: 0x4000, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4000, 0xc96: 0x4000, 0xc97: 0x4000, + 0xc98: 0x4000, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4000, 0xc9c: 0x4000, 0xc9d: 0x4000, + 0xc9e: 0x4000, 0xc9f: 0x4000, 0xca0: 0x4000, 0xca1: 0x4000, 0xca2: 0x4000, 0xca3: 0x4000, + 0xca4: 0x4000, 0xca5: 0x4000, 0xca6: 0x4000, 0xca7: 0x4000, 0xca8: 0x4000, 0xca9: 0x4000, + 0xcaa: 0x4000, 0xcab: 0x4000, 0xcac: 0x4000, 0xcad: 0x4000, 0xcae: 0x4000, 0xcaf: 0x4000, + 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x4000, 0xcb3: 0x4000, 0xcb4: 0x4000, 0xcb5: 0x4000, + 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x4000, + 0xcbc: 0x4000, 0xcbd: 0x4000, 0xcbe: 0x4000, + // Block 0x33, offset 0xcc0 + 0xcc1: 0x4000, 0xcc2: 0x4000, 0xcc3: 0x4000, 0xcc4: 0x4000, 0xcc5: 0x4000, + 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000, + 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000, + 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000, + 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000, + 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000, + 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000, + 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, 0xcee: 0x4000, 0xcef: 0x4000, + 0xcf0: 0x4000, 0xcf1: 0x4000, 0xcf2: 0x4000, 0xcf3: 0x4000, 0xcf4: 0x4000, 0xcf5: 0x4000, + 0xcf6: 0x4000, 0xcf7: 0x4000, 0xcf8: 0x4000, 0xcf9: 0x4000, 0xcfa: 0x4000, 0xcfb: 0x4000, + 0xcfc: 0x4000, 0xcfd: 0x4000, 0xcfe: 0x4000, 0xcff: 0x4000, + // Block 0x34, offset 0xd00 + 0xd00: 0x4000, 0xd01: 0x4000, 0xd02: 0x4000, 0xd03: 0x4000, 0xd04: 0x4000, 0xd05: 0x4000, + 0xd06: 0x4000, 0xd07: 0x4000, 0xd08: 0x4000, 0xd09: 0x4000, 0xd0a: 0x4000, 0xd0b: 0x4000, + 0xd0c: 0x4000, 0xd0d: 0x4000, 0xd0e: 0x4000, 0xd0f: 0x4000, 0xd10: 0x4000, 0xd11: 0x4000, + 0xd12: 0x4000, 0xd13: 0x4000, 0xd14: 0x4000, 0xd15: 0x4000, 0xd16: 0x4000, + 0xd19: 0x4016, 0xd1a: 0x4017, 0xd1b: 0x4000, 0xd1c: 0x4000, 0xd1d: 0x4000, + 0xd1e: 0x4000, 0xd1f: 0x4000, 0xd20: 0x4000, 0xd21: 0x4018, 0xd22: 0x4019, 0xd23: 0x401a, + 0xd24: 0x401b, 0xd25: 0x401c, 0xd26: 0x401d, 0xd27: 0x401e, 0xd28: 0x401f, 0xd29: 0x4020, + 0xd2a: 0x4021, 0xd2b: 0x4022, 0xd2c: 0x4000, 0xd2d: 0x4010, 0xd2e: 0x4000, 0xd2f: 0x4023, + 0xd30: 0x4000, 0xd31: 0x4024, 0xd32: 0x4000, 0xd33: 0x4025, 0xd34: 0x4000, 0xd35: 0x4026, + 0xd36: 0x4000, 0xd37: 0x401a, 0xd38: 0x4000, 0xd39: 0x4027, 0xd3a: 0x4000, 0xd3b: 0x4028, + 0xd3c: 0x4000, 0xd3d: 0x4020, 0xd3e: 0x4000, 0xd3f: 0x4029, + // Block 0x35, offset 0xd40 + 0xd40: 0x4000, 0xd41: 0x402a, 0xd42: 0x4000, 0xd43: 0x402b, 0xd44: 0x402c, 0xd45: 0x4000, + 0xd46: 0x4017, 0xd47: 0x4000, 0xd48: 0x402d, 0xd49: 0x4000, 0xd4a: 0x402e, 0xd4b: 0x402f, + 0xd4c: 0x4030, 0xd4d: 0x4017, 0xd4e: 0x4016, 0xd4f: 0x4017, 0xd50: 0x4000, 0xd51: 0x4000, + 0xd52: 0x4031, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4031, 0xd56: 0x4000, 0xd57: 0x4000, + 0xd58: 0x4032, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4032, 0xd5c: 0x4000, 0xd5d: 0x4000, + 0xd5e: 0x4033, 0xd5f: 0x402e, 0xd60: 0x4034, 0xd61: 0x4035, 0xd62: 0x4034, 0xd63: 0x4036, + 0xd64: 0x4037, 0xd65: 0x4024, 0xd66: 0x4035, 0xd67: 0x4025, 0xd68: 0x4038, 0xd69: 0x4038, + 0xd6a: 0x4039, 0xd6b: 0x4039, 0xd6c: 0x403a, 0xd6d: 0x403a, 0xd6e: 0x4000, 0xd6f: 0x4035, + 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x403b, 0xd73: 0x403c, 0xd74: 0x4000, 0xd75: 0x4000, + 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, 0xd7b: 0x403d, + 0xd7c: 0x401c, 0xd7d: 0x4000, 0xd7e: 0x4000, 0xd7f: 0x4000, + // Block 0x36, offset 0xd80 + 0xd85: 0x4000, + 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000, + 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000, + 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000, + 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000, + 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000, + 0xda4: 0x4000, 0xda5: 0x4000, 0xda6: 0x4000, 0xda7: 0x4000, 0xda8: 0x4000, 0xda9: 0x4000, + 0xdaa: 0x4000, 0xdab: 0x4000, 0xdac: 0x4000, 0xdad: 0x4000, 0xdae: 0x4000, 0xdaf: 0x4000, + 0xdb1: 0x403e, 0xdb2: 0x403e, 0xdb3: 0x403e, 0xdb4: 0x403e, 0xdb5: 0x403e, + 0xdb6: 0x403e, 0xdb7: 0x403e, 0xdb8: 0x403e, 0xdb9: 0x403e, 0xdba: 0x403e, 0xdbb: 0x403e, + 0xdbc: 0x403e, 0xdbd: 0x403e, 0xdbe: 0x403e, 0xdbf: 0x403e, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x4037, 0xdc1: 0x4037, 0xdc2: 0x4037, 0xdc3: 0x4037, 0xdc4: 0x4037, 0xdc5: 0x4037, + 0xdc6: 0x4037, 0xdc7: 0x4037, 0xdc8: 0x4037, 0xdc9: 0x4037, 0xdca: 0x4037, 0xdcb: 0x4037, + 0xdcc: 0x4037, 0xdcd: 0x4037, 0xdce: 0x4037, 0xdcf: 0x400e, 0xdd0: 0x403f, 0xdd1: 0x4040, + 0xdd2: 0x4041, 0xdd3: 0x4040, 0xdd4: 0x403f, 0xdd5: 0x4042, 0xdd6: 0x4043, 0xdd7: 0x4044, + 0xdd8: 0x4040, 0xdd9: 0x4041, 0xdda: 0x4040, 0xddb: 0x4045, 0xddc: 0x4009, 0xddd: 0x4045, + 0xdde: 0x4046, 0xddf: 0x4045, 0xde0: 0x4047, 0xde1: 0x400b, 0xde2: 0x400a, 0xde3: 0x400c, + 0xde4: 0x4048, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000, + 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000, + 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000, + 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000, + 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000, + // Block 0x38, offset 0xe00 + 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000, + 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x4000, 0xe09: 0x4000, 0xe0a: 0x4000, 0xe0b: 0x4000, + 0xe0c: 0x4000, 0xe0d: 0x4000, 0xe0e: 0x4000, 0xe10: 0x4000, 0xe11: 0x4000, + 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000, + 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000, + 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000, + 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000, + 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000, + 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000, + 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000, 0xe3b: 0x4000, + 0xe3c: 0x4000, 0xe3d: 0x4000, 0xe3e: 0x4000, 0xe3f: 0x4000, + // Block 0x39, offset 0xe40 + 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000, + 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000, + 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000, + 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000, + 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000, + 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000, + 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000, + 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000, + 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, 0xe7f: 0x4000, + // Block 0x3a, offset 0xe80 + 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000, + 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000, + 0xe8c: 0x4000, 0xe8d: 0x4000, 0xe8e: 0x4000, 0xe8f: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000, + 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000, + 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000, + 0xe9e: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000, + 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000, + 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000, + 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000, + 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000, + 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000, + // Block 0x3b, offset 0xec0 + 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000, + 0xec6: 0x4000, 0xec7: 0x4000, 0xec8: 0x2000, 0xec9: 0x2000, 0xeca: 0x2000, 0xecb: 0x2000, + 0xecc: 0x2000, 0xecd: 0x2000, 0xece: 0x2000, 0xecf: 0x2000, 0xed0: 0x4000, 0xed1: 0x4000, + 0xed2: 0x4000, 0xed3: 0x4000, 0xed4: 0x4000, 0xed5: 0x4000, 0xed6: 0x4000, 0xed7: 0x4000, + 0xed8: 0x4000, 0xed9: 0x4000, 0xeda: 0x4000, 0xedb: 0x4000, 0xedc: 0x4000, 0xedd: 0x4000, + 0xede: 0x4000, 0xedf: 0x4000, 0xee0: 0x4000, 0xee1: 0x4000, 0xee2: 0x4000, 0xee3: 0x4000, + 0xee4: 0x4000, 0xee5: 0x4000, 0xee6: 0x4000, 0xee7: 0x4000, 0xee8: 0x4000, 0xee9: 0x4000, + 0xeea: 0x4000, 0xeeb: 0x4000, 0xeec: 0x4000, 0xeed: 0x4000, 0xeee: 0x4000, 0xeef: 0x4000, + 0xef0: 0x4000, 0xef1: 0x4000, 0xef2: 0x4000, 0xef3: 0x4000, 0xef4: 0x4000, 0xef5: 0x4000, + 0xef6: 0x4000, 0xef7: 0x4000, 0xef8: 0x4000, 0xef9: 0x4000, 0xefa: 0x4000, 0xefb: 0x4000, + 0xefc: 0x4000, 0xefd: 0x4000, 0xefe: 0x4000, 0xeff: 0x4000, + // Block 0x3c, offset 0xf00 + 0xf00: 0x4000, 0xf01: 0x4000, 0xf02: 0x4000, 0xf03: 0x4000, 0xf04: 0x4000, 0xf05: 0x4000, + 0xf06: 0x4000, 0xf07: 0x4000, 0xf08: 0x4000, 0xf09: 0x4000, 0xf0a: 0x4000, 0xf0b: 0x4000, + 0xf0c: 0x4000, 0xf10: 0x4000, 0xf11: 0x4000, + 0xf12: 0x4000, 0xf13: 0x4000, 0xf14: 0x4000, 0xf15: 0x4000, 0xf16: 0x4000, 0xf17: 0x4000, + 0xf18: 0x4000, 0xf19: 0x4000, 0xf1a: 0x4000, 0xf1b: 0x4000, 0xf1c: 0x4000, 0xf1d: 0x4000, + 0xf1e: 0x4000, 0xf1f: 0x4000, 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000, + 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000, + 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000, + 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000, + 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000, + 0xf3c: 0x4000, 0xf3d: 0x4000, 0xf3e: 0x4000, 0xf3f: 0x4000, + // Block 0x3d, offset 0xf40 + 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000, + 0xf46: 0x4000, + // Block 0x3e, offset 0xf80 + 0xfa0: 0x4000, 0xfa1: 0x4000, 0xfa2: 0x4000, 0xfa3: 0x4000, + 0xfa4: 0x4000, 0xfa5: 0x4000, 0xfa6: 0x4000, 0xfa7: 0x4000, 0xfa8: 0x4000, 0xfa9: 0x4000, + 0xfaa: 0x4000, 0xfab: 0x4000, 0xfac: 0x4000, 0xfad: 0x4000, 0xfae: 0x4000, 0xfaf: 0x4000, + 0xfb0: 0x4000, 0xfb1: 0x4000, 0xfb2: 0x4000, 0xfb3: 0x4000, 0xfb4: 0x4000, 0xfb5: 0x4000, + 0xfb6: 0x4000, 0xfb7: 0x4000, 0xfb8: 0x4000, 0xfb9: 0x4000, 0xfba: 0x4000, 0xfbb: 0x4000, + 0xfbc: 0x4000, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x4000, 0xfc1: 0x4000, 0xfc2: 0x4000, 0xfc3: 0x4000, 0xfc4: 0x4000, 0xfc5: 0x4000, + 0xfc6: 0x4000, 0xfc7: 0x4000, 0xfc8: 0x4000, 0xfc9: 0x4000, 0xfca: 0x4000, 0xfcb: 0x4000, + 0xfcc: 0x4000, 0xfcd: 0x4000, 0xfce: 0x4000, 0xfcf: 0x4000, 0xfd0: 0x4000, 0xfd1: 0x4000, + 0xfd2: 0x4000, 0xfd3: 0x4000, 0xfd4: 0x4000, 0xfd5: 0x4000, 0xfd6: 0x4000, 0xfd7: 0x4000, + 0xfd8: 0x4000, 0xfd9: 0x4000, 0xfda: 0x4000, 0xfdb: 0x4000, 0xfdc: 0x4000, 0xfdd: 0x4000, + 0xfde: 0x4000, 0xfdf: 0x4000, 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000, + // Block 0x40, offset 0x1000 + 0x1000: 0x2000, 0x1001: 0x2000, 0x1002: 0x2000, 0x1003: 0x2000, 0x1004: 0x2000, 0x1005: 0x2000, + 0x1006: 0x2000, 0x1007: 0x2000, 0x1008: 0x2000, 0x1009: 0x2000, 0x100a: 0x2000, 0x100b: 0x2000, + 0x100c: 0x2000, 0x100d: 0x2000, 0x100e: 0x2000, 0x100f: 0x2000, 0x1010: 0x4000, 0x1011: 0x4000, + 0x1012: 0x4000, 0x1013: 0x4000, 0x1014: 0x4000, 0x1015: 0x4000, 0x1016: 0x4000, 0x1017: 0x4000, + 0x1018: 0x4000, 0x1019: 0x4000, + 0x1030: 0x4000, 0x1031: 0x4000, 0x1032: 0x4000, 0x1033: 0x4000, 0x1034: 0x4000, 0x1035: 0x4000, + 0x1036: 0x4000, 0x1037: 0x4000, 0x1038: 0x4000, 0x1039: 0x4000, 0x103a: 0x4000, 0x103b: 0x4000, + 0x103c: 0x4000, 0x103d: 0x4000, 0x103e: 0x4000, 0x103f: 0x4000, + // Block 0x41, offset 0x1040 + 0x1040: 0x4000, 0x1041: 0x4000, 0x1042: 0x4000, 0x1043: 0x4000, 0x1044: 0x4000, 0x1045: 0x4000, + 0x1046: 0x4000, 0x1047: 0x4000, 0x1048: 0x4000, 0x1049: 0x4000, 0x104a: 0x4000, 0x104b: 0x4000, + 0x104c: 0x4000, 0x104d: 0x4000, 0x104e: 0x4000, 0x104f: 0x4000, 0x1050: 0x4000, 0x1051: 0x4000, + 0x1052: 0x4000, 0x1054: 0x4000, 0x1055: 0x4000, 0x1056: 0x4000, 0x1057: 0x4000, + 0x1058: 0x4000, 0x1059: 0x4000, 0x105a: 0x4000, 0x105b: 0x4000, 0x105c: 0x4000, 0x105d: 0x4000, + 0x105e: 0x4000, 0x105f: 0x4000, 0x1060: 0x4000, 0x1061: 0x4000, 0x1062: 0x4000, 0x1063: 0x4000, + 0x1064: 0x4000, 0x1065: 0x4000, 0x1066: 0x4000, 0x1068: 0x4000, 0x1069: 0x4000, + 0x106a: 0x4000, 0x106b: 0x4000, + // Block 0x42, offset 0x1080 + 0x1081: 0x9012, 0x1082: 0x9012, 0x1083: 0x9012, 0x1084: 0x9012, 0x1085: 0x9012, + 0x1086: 0x9012, 0x1087: 0x9012, 0x1088: 0x9012, 0x1089: 0x9012, 0x108a: 0x9012, 0x108b: 0x9012, + 0x108c: 0x9012, 0x108d: 0x9012, 0x108e: 0x9012, 0x108f: 0x9012, 0x1090: 0x9012, 0x1091: 0x9012, + 0x1092: 0x9012, 0x1093: 0x9012, 0x1094: 0x9012, 0x1095: 0x9012, 0x1096: 0x9012, 0x1097: 0x9012, + 0x1098: 0x9012, 0x1099: 0x9012, 0x109a: 0x9012, 0x109b: 0x9012, 0x109c: 0x9012, 0x109d: 0x9012, + 0x109e: 0x9012, 0x109f: 0x9012, 0x10a0: 0x9049, 0x10a1: 0x9049, 0x10a2: 0x9049, 0x10a3: 0x9049, + 0x10a4: 0x9049, 0x10a5: 0x9049, 0x10a6: 0x9049, 0x10a7: 0x9049, 0x10a8: 0x9049, 0x10a9: 0x9049, + 0x10aa: 0x9049, 0x10ab: 0x9049, 0x10ac: 0x9049, 0x10ad: 0x9049, 0x10ae: 0x9049, 0x10af: 0x9049, + 0x10b0: 0x9049, 0x10b1: 0x9049, 0x10b2: 0x9049, 0x10b3: 0x9049, 0x10b4: 0x9049, 0x10b5: 0x9049, + 0x10b6: 0x9049, 0x10b7: 0x9049, 0x10b8: 0x9049, 0x10b9: 0x9049, 0x10ba: 0x9049, 0x10bb: 0x9049, + 0x10bc: 0x9049, 0x10bd: 0x9049, 0x10be: 0x9049, 0x10bf: 0x9049, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x9049, 0x10c1: 0x9049, 0x10c2: 0x9049, 0x10c3: 0x9049, 0x10c4: 0x9049, 0x10c5: 0x9049, + 0x10c6: 0x9049, 0x10c7: 0x9049, 0x10c8: 0x9049, 0x10c9: 0x9049, 0x10ca: 0x9049, 0x10cb: 0x9049, + 0x10cc: 0x9049, 0x10cd: 0x9049, 0x10ce: 0x9049, 0x10cf: 0x9049, 0x10d0: 0x9049, 0x10d1: 0x9049, + 0x10d2: 0x9049, 0x10d3: 0x9049, 0x10d4: 0x9049, 0x10d5: 0x9049, 0x10d6: 0x9049, 0x10d7: 0x9049, + 0x10d8: 0x9049, 0x10d9: 0x9049, 0x10da: 0x9049, 0x10db: 0x9049, 0x10dc: 0x9049, 0x10dd: 0x9049, + 0x10de: 0x9049, 0x10df: 0x904a, 0x10e0: 0x904b, 0x10e1: 0xb04c, 0x10e2: 0xb04d, 0x10e3: 0xb04d, + 0x10e4: 0xb04e, 0x10e5: 0xb04f, 0x10e6: 0xb050, 0x10e7: 0xb051, 0x10e8: 0xb052, 0x10e9: 0xb053, + 0x10ea: 0xb054, 0x10eb: 0xb055, 0x10ec: 0xb056, 0x10ed: 0xb057, 0x10ee: 0xb058, 0x10ef: 0xb059, + 0x10f0: 0xb05a, 0x10f1: 0xb05b, 0x10f2: 0xb05c, 0x10f3: 0xb05d, 0x10f4: 0xb05e, 0x10f5: 0xb05f, + 0x10f6: 0xb060, 0x10f7: 0xb061, 0x10f8: 0xb062, 0x10f9: 0xb063, 0x10fa: 0xb064, 0x10fb: 0xb065, + 0x10fc: 0xb052, 0x10fd: 0xb066, 0x10fe: 0xb067, 0x10ff: 0xb055, + // Block 0x44, offset 0x1100 + 0x1100: 0xb068, 0x1101: 0xb069, 0x1102: 0xb06a, 0x1103: 0xb06b, 0x1104: 0xb05a, 0x1105: 0xb056, + 0x1106: 0xb06c, 0x1107: 0xb06d, 0x1108: 0xb06b, 0x1109: 0xb06e, 0x110a: 0xb06b, 0x110b: 0xb06f, + 0x110c: 0xb06f, 0x110d: 0xb070, 0x110e: 0xb070, 0x110f: 0xb071, 0x1110: 0xb056, 0x1111: 0xb072, + 0x1112: 0xb073, 0x1113: 0xb072, 0x1114: 0xb074, 0x1115: 0xb073, 0x1116: 0xb075, 0x1117: 0xb075, + 0x1118: 0xb076, 0x1119: 0xb076, 0x111a: 0xb077, 0x111b: 0xb077, 0x111c: 0xb073, 0x111d: 0xb078, + 0x111e: 0xb079, 0x111f: 0xb067, 0x1120: 0xb07a, 0x1121: 0xb07b, 0x1122: 0xb07b, 0x1123: 0xb07b, + 0x1124: 0xb07b, 0x1125: 0xb07b, 0x1126: 0xb07b, 0x1127: 0xb07b, 0x1128: 0xb07b, 0x1129: 0xb07b, + 0x112a: 0xb07b, 0x112b: 0xb07b, 0x112c: 0xb07b, 0x112d: 0xb07b, 0x112e: 0xb07b, 0x112f: 0xb07b, + 0x1130: 0xb07c, 0x1131: 0xb07c, 0x1132: 0xb07c, 0x1133: 0xb07c, 0x1134: 0xb07c, 0x1135: 0xb07c, + 0x1136: 0xb07c, 0x1137: 0xb07c, 0x1138: 0xb07c, 0x1139: 0xb07c, 0x113a: 0xb07c, 0x113b: 0xb07c, + 0x113c: 0xb07c, 0x113d: 0xb07c, 0x113e: 0xb07c, + // Block 0x45, offset 0x1140 + 0x1142: 0xb07d, 0x1143: 0xb07e, 0x1144: 0xb07f, 0x1145: 0xb080, + 0x1146: 0xb07f, 0x1147: 0xb07e, 0x114a: 0xb081, 0x114b: 0xb082, + 0x114c: 0xb083, 0x114d: 0xb07f, 0x114e: 0xb080, 0x114f: 0xb07f, + 0x1152: 0xb084, 0x1153: 0xb085, 0x1154: 0xb084, 0x1155: 0xb086, 0x1156: 0xb084, 0x1157: 0xb087, + 0x115a: 0xb088, 0x115b: 0xb089, 0x115c: 0xb08a, + 0x1160: 0x908b, 0x1161: 0x908b, 0x1162: 0x908c, 0x1163: 0x908d, + 0x1164: 0x908b, 0x1165: 0x908e, 0x1166: 0x908f, 0x1168: 0xb090, 0x1169: 0xb091, + 0x116a: 0xb092, 0x116b: 0xb091, 0x116c: 0xb093, 0x116d: 0xb094, 0x116e: 0xb095, + 0x117d: 0x2000, + // Block 0x46, offset 0x1180 + 0x11a0: 0x4000, 0x11a1: 0x4000, 0x11a2: 0x4000, 0x11a3: 0x4000, + 0x11a4: 0x4000, + 0x11b0: 0x4000, 0x11b1: 0x4000, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x4000, 0x11c1: 0x4000, 0x11c2: 0x4000, 0x11c3: 0x4000, 0x11c4: 0x4000, 0x11c5: 0x4000, + 0x11c6: 0x4000, 0x11c7: 0x4000, 0x11c8: 0x4000, 0x11c9: 0x4000, 0x11ca: 0x4000, 0x11cb: 0x4000, + 0x11cc: 0x4000, 0x11cd: 0x4000, 0x11ce: 0x4000, 0x11cf: 0x4000, 0x11d0: 0x4000, 0x11d1: 0x4000, + 0x11d2: 0x4000, 0x11d3: 0x4000, 0x11d4: 0x4000, 0x11d5: 0x4000, 0x11d6: 0x4000, 0x11d7: 0x4000, + 0x11d8: 0x4000, 0x11d9: 0x4000, 0x11da: 0x4000, 0x11db: 0x4000, 0x11dc: 0x4000, 0x11dd: 0x4000, + 0x11de: 0x4000, 0x11df: 0x4000, 0x11e0: 0x4000, 0x11e1: 0x4000, 0x11e2: 0x4000, 0x11e3: 0x4000, + 0x11e4: 0x4000, 0x11e5: 0x4000, 0x11e6: 0x4000, 0x11e7: 0x4000, 0x11e8: 0x4000, 0x11e9: 0x4000, + 0x11ea: 0x4000, 0x11eb: 0x4000, 0x11ec: 0x4000, 0x11ed: 0x4000, 0x11ee: 0x4000, 0x11ef: 0x4000, + 0x11f0: 0x4000, 0x11f1: 0x4000, 0x11f2: 0x4000, 0x11f3: 0x4000, 0x11f4: 0x4000, 0x11f5: 0x4000, + 0x11f6: 0x4000, 0x11f7: 0x4000, + // Block 0x48, offset 0x1200 + 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, 0x1203: 0x4000, 0x1204: 0x4000, 0x1205: 0x4000, + 0x1206: 0x4000, 0x1207: 0x4000, 0x1208: 0x4000, 0x1209: 0x4000, 0x120a: 0x4000, 0x120b: 0x4000, + 0x120c: 0x4000, 0x120d: 0x4000, 0x120e: 0x4000, 0x120f: 0x4000, 0x1210: 0x4000, 0x1211: 0x4000, + 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, + // Block 0x49, offset 0x1240 + 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000, + 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, + // Block 0x4a, offset 0x1280 + 0x12b0: 0x4000, 0x12b1: 0x4000, 0x12b2: 0x4000, 0x12b3: 0x4000, 0x12b5: 0x4000, + 0x12b6: 0x4000, 0x12b7: 0x4000, 0x12b8: 0x4000, 0x12b9: 0x4000, 0x12ba: 0x4000, 0x12bb: 0x4000, + 0x12bd: 0x4000, 0x12be: 0x4000, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x4000, 0x12c1: 0x4000, 0x12c2: 0x4000, 0x12c3: 0x4000, 0x12c4: 0x4000, 0x12c5: 0x4000, + 0x12c6: 0x4000, 0x12c7: 0x4000, 0x12c8: 0x4000, 0x12c9: 0x4000, 0x12ca: 0x4000, 0x12cb: 0x4000, + 0x12cc: 0x4000, 0x12cd: 0x4000, 0x12ce: 0x4000, 0x12cf: 0x4000, 0x12d0: 0x4000, 0x12d1: 0x4000, + 0x12d2: 0x4000, 0x12d3: 0x4000, 0x12d4: 0x4000, 0x12d5: 0x4000, 0x12d6: 0x4000, 0x12d7: 0x4000, + 0x12d8: 0x4000, 0x12d9: 0x4000, 0x12da: 0x4000, 0x12db: 0x4000, 0x12dc: 0x4000, 0x12dd: 0x4000, + 0x12de: 0x4000, 0x12df: 0x4000, 0x12e0: 0x4000, 0x12e1: 0x4000, 0x12e2: 0x4000, + 0x12f2: 0x4000, + // Block 0x4c, offset 0x1300 + 0x1310: 0x4000, 0x1311: 0x4000, + 0x1312: 0x4000, 0x1315: 0x4000, + 0x1324: 0x4000, 0x1325: 0x4000, 0x1326: 0x4000, 0x1327: 0x4000, + 0x1330: 0x4000, 0x1331: 0x4000, 0x1332: 0x4000, 0x1333: 0x4000, 0x1334: 0x4000, 0x1335: 0x4000, + 0x1336: 0x4000, 0x1337: 0x4000, 0x1338: 0x4000, 0x1339: 0x4000, 0x133a: 0x4000, 0x133b: 0x4000, + 0x133c: 0x4000, 0x133d: 0x4000, 0x133e: 0x4000, 0x133f: 0x4000, + // Block 0x4d, offset 0x1340 + 0x1340: 0x4000, 0x1341: 0x4000, 0x1342: 0x4000, 0x1343: 0x4000, 0x1344: 0x4000, 0x1345: 0x4000, + 0x1346: 0x4000, 0x1347: 0x4000, 0x1348: 0x4000, 0x1349: 0x4000, 0x134a: 0x4000, 0x134b: 0x4000, + 0x134c: 0x4000, 0x134d: 0x4000, 0x134e: 0x4000, 0x134f: 0x4000, 0x1350: 0x4000, 0x1351: 0x4000, + 0x1352: 0x4000, 0x1353: 0x4000, 0x1354: 0x4000, 0x1355: 0x4000, 0x1356: 0x4000, 0x1357: 0x4000, + 0x1358: 0x4000, 0x1359: 0x4000, 0x135a: 0x4000, 0x135b: 0x4000, 0x135c: 0x4000, 0x135d: 0x4000, + 0x135e: 0x4000, 0x135f: 0x4000, 0x1360: 0x4000, 0x1361: 0x4000, 0x1362: 0x4000, 0x1363: 0x4000, + 0x1364: 0x4000, 0x1365: 0x4000, 0x1366: 0x4000, 0x1367: 0x4000, 0x1368: 0x4000, 0x1369: 0x4000, + 0x136a: 0x4000, 0x136b: 0x4000, 0x136c: 0x4000, 0x136d: 0x4000, 0x136e: 0x4000, 0x136f: 0x4000, + 0x1370: 0x4000, 0x1371: 0x4000, 0x1372: 0x4000, 0x1373: 0x4000, 0x1374: 0x4000, 0x1375: 0x4000, + 0x1376: 0x4000, 0x1377: 0x4000, 0x1378: 0x4000, 0x1379: 0x4000, 0x137a: 0x4000, 0x137b: 0x4000, + // Block 0x4e, offset 0x1380 + 0x1384: 0x4000, + // Block 0x4f, offset 0x13c0 + 0x13cf: 0x4000, + // Block 0x50, offset 0x1400 + 0x1400: 0x2000, 0x1401: 0x2000, 0x1402: 0x2000, 0x1403: 0x2000, 0x1404: 0x2000, 0x1405: 0x2000, + 0x1406: 0x2000, 0x1407: 0x2000, 0x1408: 0x2000, 0x1409: 0x2000, 0x140a: 0x2000, + 0x1410: 0x2000, 0x1411: 0x2000, + 0x1412: 0x2000, 0x1413: 0x2000, 0x1414: 0x2000, 0x1415: 0x2000, 0x1416: 0x2000, 0x1417: 0x2000, + 0x1418: 0x2000, 0x1419: 0x2000, 0x141a: 0x2000, 0x141b: 0x2000, 0x141c: 0x2000, 0x141d: 0x2000, + 0x141e: 0x2000, 0x141f: 0x2000, 0x1420: 0x2000, 0x1421: 0x2000, 0x1422: 0x2000, 0x1423: 0x2000, + 0x1424: 0x2000, 0x1425: 0x2000, 0x1426: 0x2000, 0x1427: 0x2000, 0x1428: 0x2000, 0x1429: 0x2000, + 0x142a: 0x2000, 0x142b: 0x2000, 0x142c: 0x2000, 0x142d: 0x2000, + 0x1430: 0x2000, 0x1431: 0x2000, 0x1432: 0x2000, 0x1433: 0x2000, 0x1434: 0x2000, 0x1435: 0x2000, + 0x1436: 0x2000, 0x1437: 0x2000, 0x1438: 0x2000, 0x1439: 0x2000, 0x143a: 0x2000, 0x143b: 0x2000, + 0x143c: 0x2000, 0x143d: 0x2000, 0x143e: 0x2000, 0x143f: 0x2000, + // Block 0x51, offset 0x1440 + 0x1440: 0x2000, 0x1441: 0x2000, 0x1442: 0x2000, 0x1443: 0x2000, 0x1444: 0x2000, 0x1445: 0x2000, + 0x1446: 0x2000, 0x1447: 0x2000, 0x1448: 0x2000, 0x1449: 0x2000, 0x144a: 0x2000, 0x144b: 0x2000, + 0x144c: 0x2000, 0x144d: 0x2000, 0x144e: 0x2000, 0x144f: 0x2000, 0x1450: 0x2000, 0x1451: 0x2000, + 0x1452: 0x2000, 0x1453: 0x2000, 0x1454: 0x2000, 0x1455: 0x2000, 0x1456: 0x2000, 0x1457: 0x2000, + 0x1458: 0x2000, 0x1459: 0x2000, 0x145a: 0x2000, 0x145b: 0x2000, 0x145c: 0x2000, 0x145d: 0x2000, + 0x145e: 0x2000, 0x145f: 0x2000, 0x1460: 0x2000, 0x1461: 0x2000, 0x1462: 0x2000, 0x1463: 0x2000, + 0x1464: 0x2000, 0x1465: 0x2000, 0x1466: 0x2000, 0x1467: 0x2000, 0x1468: 0x2000, 0x1469: 0x2000, + 0x1470: 0x2000, 0x1471: 0x2000, 0x1472: 0x2000, 0x1473: 0x2000, 0x1474: 0x2000, 0x1475: 0x2000, + 0x1476: 0x2000, 0x1477: 0x2000, 0x1478: 0x2000, 0x1479: 0x2000, 0x147a: 0x2000, 0x147b: 0x2000, + 0x147c: 0x2000, 0x147d: 0x2000, 0x147e: 0x2000, 0x147f: 0x2000, + // Block 0x52, offset 0x1480 + 0x1480: 0x2000, 0x1481: 0x2000, 0x1482: 0x2000, 0x1483: 0x2000, 0x1484: 0x2000, 0x1485: 0x2000, + 0x1486: 0x2000, 0x1487: 0x2000, 0x1488: 0x2000, 0x1489: 0x2000, 0x148a: 0x2000, 0x148b: 0x2000, + 0x148c: 0x2000, 0x148d: 0x2000, 0x148e: 0x4000, 0x148f: 0x2000, 0x1490: 0x2000, 0x1491: 0x4000, + 0x1492: 0x4000, 0x1493: 0x4000, 0x1494: 0x4000, 0x1495: 0x4000, 0x1496: 0x4000, 0x1497: 0x4000, + 0x1498: 0x4000, 0x1499: 0x4000, 0x149a: 0x4000, 0x149b: 0x2000, 0x149c: 0x2000, 0x149d: 0x2000, + 0x149e: 0x2000, 0x149f: 0x2000, 0x14a0: 0x2000, 0x14a1: 0x2000, 0x14a2: 0x2000, 0x14a3: 0x2000, + 0x14a4: 0x2000, 0x14a5: 0x2000, 0x14a6: 0x2000, 0x14a7: 0x2000, 0x14a8: 0x2000, 0x14a9: 0x2000, + 0x14aa: 0x2000, 0x14ab: 0x2000, 0x14ac: 0x2000, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x4000, 0x14c1: 0x4000, 0x14c2: 0x4000, + 0x14d0: 0x4000, 0x14d1: 0x4000, + 0x14d2: 0x4000, 0x14d3: 0x4000, 0x14d4: 0x4000, 0x14d5: 0x4000, 0x14d6: 0x4000, 0x14d7: 0x4000, + 0x14d8: 0x4000, 0x14d9: 0x4000, 0x14da: 0x4000, 0x14db: 0x4000, 0x14dc: 0x4000, 0x14dd: 0x4000, + 0x14de: 0x4000, 0x14df: 0x4000, 0x14e0: 0x4000, 0x14e1: 0x4000, 0x14e2: 0x4000, 0x14e3: 0x4000, + 0x14e4: 0x4000, 0x14e5: 0x4000, 0x14e6: 0x4000, 0x14e7: 0x4000, 0x14e8: 0x4000, 0x14e9: 0x4000, + 0x14ea: 0x4000, 0x14eb: 0x4000, 0x14ec: 0x4000, 0x14ed: 0x4000, 0x14ee: 0x4000, 0x14ef: 0x4000, + 0x14f0: 0x4000, 0x14f1: 0x4000, 0x14f2: 0x4000, 0x14f3: 0x4000, 0x14f4: 0x4000, 0x14f5: 0x4000, + 0x14f6: 0x4000, 0x14f7: 0x4000, 0x14f8: 0x4000, 0x14f9: 0x4000, 0x14fa: 0x4000, 0x14fb: 0x4000, + // Block 0x54, offset 0x1500 + 0x1500: 0x4000, 0x1501: 0x4000, 0x1502: 0x4000, 0x1503: 0x4000, 0x1504: 0x4000, 0x1505: 0x4000, + 0x1506: 0x4000, 0x1507: 0x4000, 0x1508: 0x4000, + 0x1510: 0x4000, 0x1511: 0x4000, + 0x1520: 0x4000, 0x1521: 0x4000, 0x1522: 0x4000, 0x1523: 0x4000, + 0x1524: 0x4000, 0x1525: 0x4000, + // Block 0x55, offset 0x1540 + 0x1540: 0x4000, 0x1541: 0x4000, 0x1542: 0x4000, 0x1543: 0x4000, 0x1544: 0x4000, 0x1545: 0x4000, + 0x1546: 0x4000, 0x1547: 0x4000, 0x1548: 0x4000, 0x1549: 0x4000, 0x154a: 0x4000, 0x154b: 0x4000, + 0x154c: 0x4000, 0x154d: 0x4000, 0x154e: 0x4000, 0x154f: 0x4000, 0x1550: 0x4000, 0x1551: 0x4000, + 0x1552: 0x4000, 0x1553: 0x4000, 0x1554: 0x4000, 0x1555: 0x4000, 0x1556: 0x4000, 0x1557: 0x4000, + 0x1558: 0x4000, 0x1559: 0x4000, 0x155a: 0x4000, 0x155b: 0x4000, 0x155c: 0x4000, 0x155d: 0x4000, + 0x155e: 0x4000, 0x155f: 0x4000, 0x1560: 0x4000, + 0x156d: 0x4000, 0x156e: 0x4000, 0x156f: 0x4000, + 0x1570: 0x4000, 0x1571: 0x4000, 0x1572: 0x4000, 0x1573: 0x4000, 0x1574: 0x4000, 0x1575: 0x4000, + 0x1577: 0x4000, 0x1578: 0x4000, 0x1579: 0x4000, 0x157a: 0x4000, 0x157b: 0x4000, + 0x157c: 0x4000, 0x157d: 0x4000, 0x157e: 0x4000, 0x157f: 0x4000, + // Block 0x56, offset 0x1580 + 0x1580: 0x4000, 0x1581: 0x4000, 0x1582: 0x4000, 0x1583: 0x4000, 0x1584: 0x4000, 0x1585: 0x4000, + 0x1586: 0x4000, 0x1587: 0x4000, 0x1588: 0x4000, 0x1589: 0x4000, 0x158a: 0x4000, 0x158b: 0x4000, + 0x158c: 0x4000, 0x158d: 0x4000, 0x158e: 0x4000, 0x158f: 0x4000, 0x1590: 0x4000, 0x1591: 0x4000, + 0x1592: 0x4000, 0x1593: 0x4000, 0x1594: 0x4000, 0x1595: 0x4000, 0x1596: 0x4000, 0x1597: 0x4000, + 0x1598: 0x4000, 0x1599: 0x4000, 0x159a: 0x4000, 0x159b: 0x4000, 0x159c: 0x4000, 0x159d: 0x4000, + 0x159e: 0x4000, 0x159f: 0x4000, 0x15a0: 0x4000, 0x15a1: 0x4000, 0x15a2: 0x4000, 0x15a3: 0x4000, + 0x15a4: 0x4000, 0x15a5: 0x4000, 0x15a6: 0x4000, 0x15a7: 0x4000, 0x15a8: 0x4000, 0x15a9: 0x4000, + 0x15aa: 0x4000, 0x15ab: 0x4000, 0x15ac: 0x4000, 0x15ad: 0x4000, 0x15ae: 0x4000, 0x15af: 0x4000, + 0x15b0: 0x4000, 0x15b1: 0x4000, 0x15b2: 0x4000, 0x15b3: 0x4000, 0x15b4: 0x4000, 0x15b5: 0x4000, + 0x15b6: 0x4000, 0x15b7: 0x4000, 0x15b8: 0x4000, 0x15b9: 0x4000, 0x15ba: 0x4000, 0x15bb: 0x4000, + 0x15bc: 0x4000, 0x15be: 0x4000, 0x15bf: 0x4000, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x4000, 0x15c1: 0x4000, 0x15c2: 0x4000, 0x15c3: 0x4000, 0x15c4: 0x4000, 0x15c5: 0x4000, + 0x15c6: 0x4000, 0x15c7: 0x4000, 0x15c8: 0x4000, 0x15c9: 0x4000, 0x15ca: 0x4000, 0x15cb: 0x4000, + 0x15cc: 0x4000, 0x15cd: 0x4000, 0x15ce: 0x4000, 0x15cf: 0x4000, 0x15d0: 0x4000, 0x15d1: 0x4000, + 0x15d2: 0x4000, 0x15d3: 0x4000, + 0x15e0: 0x4000, 0x15e1: 0x4000, 0x15e2: 0x4000, 0x15e3: 0x4000, + 0x15e4: 0x4000, 0x15e5: 0x4000, 0x15e6: 0x4000, 0x15e7: 0x4000, 0x15e8: 0x4000, 0x15e9: 0x4000, + 0x15ea: 0x4000, 0x15eb: 0x4000, 0x15ec: 0x4000, 0x15ed: 0x4000, 0x15ee: 0x4000, 0x15ef: 0x4000, + 0x15f0: 0x4000, 0x15f1: 0x4000, 0x15f2: 0x4000, 0x15f3: 0x4000, 0x15f4: 0x4000, 0x15f5: 0x4000, + 0x15f6: 0x4000, 0x15f7: 0x4000, 0x15f8: 0x4000, 0x15f9: 0x4000, 0x15fa: 0x4000, 0x15fb: 0x4000, + 0x15fc: 0x4000, 0x15fd: 0x4000, 0x15fe: 0x4000, 0x15ff: 0x4000, + // Block 0x58, offset 0x1600 + 0x1600: 0x4000, 0x1601: 0x4000, 0x1602: 0x4000, 0x1603: 0x4000, 0x1604: 0x4000, 0x1605: 0x4000, + 0x1606: 0x4000, 0x1607: 0x4000, 0x1608: 0x4000, 0x1609: 0x4000, 0x160a: 0x4000, + 0x160f: 0x4000, 0x1610: 0x4000, 0x1611: 0x4000, + 0x1612: 0x4000, 0x1613: 0x4000, + 0x1620: 0x4000, 0x1621: 0x4000, 0x1622: 0x4000, 0x1623: 0x4000, + 0x1624: 0x4000, 0x1625: 0x4000, 0x1626: 0x4000, 0x1627: 0x4000, 0x1628: 0x4000, 0x1629: 0x4000, + 0x162a: 0x4000, 0x162b: 0x4000, 0x162c: 0x4000, 0x162d: 0x4000, 0x162e: 0x4000, 0x162f: 0x4000, + 0x1630: 0x4000, 0x1634: 0x4000, + 0x1638: 0x4000, 0x1639: 0x4000, 0x163a: 0x4000, 0x163b: 0x4000, + 0x163c: 0x4000, 0x163d: 0x4000, 0x163e: 0x4000, 0x163f: 0x4000, + // Block 0x59, offset 0x1640 + 0x1640: 0x4000, 0x1641: 0x4000, 0x1642: 0x4000, 0x1643: 0x4000, 0x1644: 0x4000, 0x1645: 0x4000, + 0x1646: 0x4000, 0x1647: 0x4000, 0x1648: 0x4000, 0x1649: 0x4000, 0x164a: 0x4000, 0x164b: 0x4000, + 0x164c: 0x4000, 0x164d: 0x4000, 0x164e: 0x4000, 0x164f: 0x4000, 0x1650: 0x4000, 0x1651: 0x4000, + 0x1652: 0x4000, 0x1653: 0x4000, 0x1654: 0x4000, 0x1655: 0x4000, 0x1656: 0x4000, 0x1657: 0x4000, + 0x1658: 0x4000, 0x1659: 0x4000, 0x165a: 0x4000, 0x165b: 0x4000, 0x165c: 0x4000, 0x165d: 0x4000, + 0x165e: 0x4000, 0x165f: 0x4000, 0x1660: 0x4000, 0x1661: 0x4000, 0x1662: 0x4000, 0x1663: 0x4000, + 0x1664: 0x4000, 0x1665: 0x4000, 0x1666: 0x4000, 0x1667: 0x4000, 0x1668: 0x4000, 0x1669: 0x4000, + 0x166a: 0x4000, 0x166b: 0x4000, 0x166c: 0x4000, 0x166d: 0x4000, 0x166e: 0x4000, 0x166f: 0x4000, + 0x1670: 0x4000, 0x1671: 0x4000, 0x1672: 0x4000, 0x1673: 0x4000, 0x1674: 0x4000, 0x1675: 0x4000, + 0x1676: 0x4000, 0x1677: 0x4000, 0x1678: 0x4000, 0x1679: 0x4000, 0x167a: 0x4000, 0x167b: 0x4000, + 0x167c: 0x4000, 0x167d: 0x4000, 0x167e: 0x4000, + // Block 0x5a, offset 0x1680 + 0x1680: 0x4000, 0x1682: 0x4000, 0x1683: 0x4000, 0x1684: 0x4000, 0x1685: 0x4000, + 0x1686: 0x4000, 0x1687: 0x4000, 0x1688: 0x4000, 0x1689: 0x4000, 0x168a: 0x4000, 0x168b: 0x4000, + 0x168c: 0x4000, 0x168d: 0x4000, 0x168e: 0x4000, 0x168f: 0x4000, 0x1690: 0x4000, 0x1691: 0x4000, + 0x1692: 0x4000, 0x1693: 0x4000, 0x1694: 0x4000, 0x1695: 0x4000, 0x1696: 0x4000, 0x1697: 0x4000, + 0x1698: 0x4000, 0x1699: 0x4000, 0x169a: 0x4000, 0x169b: 0x4000, 0x169c: 0x4000, 0x169d: 0x4000, + 0x169e: 0x4000, 0x169f: 0x4000, 0x16a0: 0x4000, 0x16a1: 0x4000, 0x16a2: 0x4000, 0x16a3: 0x4000, + 0x16a4: 0x4000, 0x16a5: 0x4000, 0x16a6: 0x4000, 0x16a7: 0x4000, 0x16a8: 0x4000, 0x16a9: 0x4000, + 0x16aa: 0x4000, 0x16ab: 0x4000, 0x16ac: 0x4000, 0x16ad: 0x4000, 0x16ae: 0x4000, 0x16af: 0x4000, + 0x16b0: 0x4000, 0x16b1: 0x4000, 0x16b2: 0x4000, 0x16b3: 0x4000, 0x16b4: 0x4000, 0x16b5: 0x4000, + 0x16b6: 0x4000, 0x16b7: 0x4000, 0x16b8: 0x4000, 0x16b9: 0x4000, 0x16ba: 0x4000, 0x16bb: 0x4000, + 0x16bc: 0x4000, 0x16bd: 0x4000, 0x16be: 0x4000, 0x16bf: 0x4000, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x4000, 0x16c1: 0x4000, 0x16c2: 0x4000, 0x16c3: 0x4000, 0x16c4: 0x4000, 0x16c5: 0x4000, + 0x16c6: 0x4000, 0x16c7: 0x4000, 0x16c8: 0x4000, 0x16c9: 0x4000, 0x16ca: 0x4000, 0x16cb: 0x4000, + 0x16cc: 0x4000, 0x16cd: 0x4000, 0x16ce: 0x4000, 0x16cf: 0x4000, 0x16d0: 0x4000, 0x16d1: 0x4000, + 0x16d2: 0x4000, 0x16d3: 0x4000, 0x16d4: 0x4000, 0x16d5: 0x4000, 0x16d6: 0x4000, 0x16d7: 0x4000, + 0x16d8: 0x4000, 0x16d9: 0x4000, 0x16da: 0x4000, 0x16db: 0x4000, 0x16dc: 0x4000, 0x16dd: 0x4000, + 0x16de: 0x4000, 0x16df: 0x4000, 0x16e0: 0x4000, 0x16e1: 0x4000, 0x16e2: 0x4000, 0x16e3: 0x4000, + 0x16e4: 0x4000, 0x16e5: 0x4000, 0x16e6: 0x4000, 0x16e7: 0x4000, 0x16e8: 0x4000, 0x16e9: 0x4000, + 0x16ea: 0x4000, 0x16eb: 0x4000, 0x16ec: 0x4000, 0x16ed: 0x4000, 0x16ee: 0x4000, 0x16ef: 0x4000, + 0x16f0: 0x4000, 0x16f1: 0x4000, 0x16f2: 0x4000, 0x16f3: 0x4000, 0x16f4: 0x4000, 0x16f5: 0x4000, + 0x16f6: 0x4000, 0x16f7: 0x4000, 0x16f8: 0x4000, 0x16f9: 0x4000, 0x16fa: 0x4000, 0x16fb: 0x4000, + 0x16fc: 0x4000, 0x16ff: 0x4000, + // Block 0x5c, offset 0x1700 + 0x1700: 0x4000, 0x1701: 0x4000, 0x1702: 0x4000, 0x1703: 0x4000, 0x1704: 0x4000, 0x1705: 0x4000, + 0x1706: 0x4000, 0x1707: 0x4000, 0x1708: 0x4000, 0x1709: 0x4000, 0x170a: 0x4000, 0x170b: 0x4000, + 0x170c: 0x4000, 0x170d: 0x4000, 0x170e: 0x4000, 0x170f: 0x4000, 0x1710: 0x4000, 0x1711: 0x4000, + 0x1712: 0x4000, 0x1713: 0x4000, 0x1714: 0x4000, 0x1715: 0x4000, 0x1716: 0x4000, 0x1717: 0x4000, + 0x1718: 0x4000, 0x1719: 0x4000, 0x171a: 0x4000, 0x171b: 0x4000, 0x171c: 0x4000, 0x171d: 0x4000, + 0x171e: 0x4000, 0x171f: 0x4000, 0x1720: 0x4000, 0x1721: 0x4000, 0x1722: 0x4000, 0x1723: 0x4000, + 0x1724: 0x4000, 0x1725: 0x4000, 0x1726: 0x4000, 0x1727: 0x4000, 0x1728: 0x4000, 0x1729: 0x4000, + 0x172a: 0x4000, 0x172b: 0x4000, 0x172c: 0x4000, 0x172d: 0x4000, 0x172e: 0x4000, 0x172f: 0x4000, + 0x1730: 0x4000, 0x1731: 0x4000, 0x1732: 0x4000, 0x1733: 0x4000, 0x1734: 0x4000, 0x1735: 0x4000, + 0x1736: 0x4000, 0x1737: 0x4000, 0x1738: 0x4000, 0x1739: 0x4000, 0x173a: 0x4000, 0x173b: 0x4000, + 0x173c: 0x4000, 0x173d: 0x4000, + // Block 0x5d, offset 0x1740 + 0x174b: 0x4000, + 0x174c: 0x4000, 0x174d: 0x4000, 0x174e: 0x4000, 0x1750: 0x4000, 0x1751: 0x4000, + 0x1752: 0x4000, 0x1753: 0x4000, 0x1754: 0x4000, 0x1755: 0x4000, 0x1756: 0x4000, 0x1757: 0x4000, + 0x1758: 0x4000, 0x1759: 0x4000, 0x175a: 0x4000, 0x175b: 0x4000, 0x175c: 0x4000, 0x175d: 0x4000, + 0x175e: 0x4000, 0x175f: 0x4000, 0x1760: 0x4000, 0x1761: 0x4000, 0x1762: 0x4000, 0x1763: 0x4000, + 0x1764: 0x4000, 0x1765: 0x4000, 0x1766: 0x4000, 0x1767: 0x4000, + 0x177a: 0x4000, + // Block 0x5e, offset 0x1780 + 0x1795: 0x4000, 0x1796: 0x4000, + 0x17a4: 0x4000, + // Block 0x5f, offset 0x17c0 + 0x17fb: 0x4000, + 0x17fc: 0x4000, 0x17fd: 0x4000, 0x17fe: 0x4000, 0x17ff: 0x4000, + // Block 0x60, offset 0x1800 + 0x1800: 0x4000, 0x1801: 0x4000, 0x1802: 0x4000, 0x1803: 0x4000, 0x1804: 0x4000, 0x1805: 0x4000, + 0x1806: 0x4000, 0x1807: 0x4000, 0x1808: 0x4000, 0x1809: 0x4000, 0x180a: 0x4000, 0x180b: 0x4000, + 0x180c: 0x4000, 0x180d: 0x4000, 0x180e: 0x4000, 0x180f: 0x4000, + // Block 0x61, offset 0x1840 + 0x1840: 0x4000, 0x1841: 0x4000, 0x1842: 0x4000, 0x1843: 0x4000, 0x1844: 0x4000, 0x1845: 0x4000, + 0x184c: 0x4000, 0x1850: 0x4000, 0x1851: 0x4000, + 0x1852: 0x4000, 0x1855: 0x4000, 0x1856: 0x4000, 0x1857: 0x4000, + 0x185c: 0x4000, 0x185d: 0x4000, + 0x185e: 0x4000, 0x185f: 0x4000, + 0x186b: 0x4000, 0x186c: 0x4000, + 0x1874: 0x4000, 0x1875: 0x4000, + 0x1876: 0x4000, 0x1877: 0x4000, 0x1878: 0x4000, 0x1879: 0x4000, 0x187a: 0x4000, 0x187b: 0x4000, + 0x187c: 0x4000, + // Block 0x62, offset 0x1880 + 0x18a0: 0x4000, 0x18a1: 0x4000, 0x18a2: 0x4000, 0x18a3: 0x4000, + 0x18a4: 0x4000, 0x18a5: 0x4000, 0x18a6: 0x4000, 0x18a7: 0x4000, 0x18a8: 0x4000, 0x18a9: 0x4000, + 0x18aa: 0x4000, 0x18ab: 0x4000, + 0x18b0: 0x4000, + // Block 0x63, offset 0x18c0 + 0x18cc: 0x4000, 0x18cd: 0x4000, 0x18ce: 0x4000, 0x18cf: 0x4000, 0x18d0: 0x4000, 0x18d1: 0x4000, + 0x18d2: 0x4000, 0x18d3: 0x4000, 0x18d4: 0x4000, 0x18d5: 0x4000, 0x18d6: 0x4000, 0x18d7: 0x4000, + 0x18d8: 0x4000, 0x18d9: 0x4000, 0x18da: 0x4000, 0x18db: 0x4000, 0x18dc: 0x4000, 0x18dd: 0x4000, + 0x18de: 0x4000, 0x18df: 0x4000, 0x18e0: 0x4000, 0x18e1: 0x4000, 0x18e2: 0x4000, 0x18e3: 0x4000, + 0x18e4: 0x4000, 0x18e5: 0x4000, 0x18e6: 0x4000, 0x18e7: 0x4000, 0x18e8: 0x4000, 0x18e9: 0x4000, + 0x18ea: 0x4000, 0x18eb: 0x4000, 0x18ec: 0x4000, 0x18ed: 0x4000, 0x18ee: 0x4000, 0x18ef: 0x4000, + 0x18f0: 0x4000, 0x18f1: 0x4000, 0x18f2: 0x4000, 0x18f3: 0x4000, 0x18f4: 0x4000, 0x18f5: 0x4000, + 0x18f6: 0x4000, 0x18f7: 0x4000, 0x18f8: 0x4000, 0x18f9: 0x4000, 0x18fa: 0x4000, + 0x18fc: 0x4000, 0x18fd: 0x4000, 0x18fe: 0x4000, 0x18ff: 0x4000, + // Block 0x64, offset 0x1900 + 0x1900: 0x4000, 0x1901: 0x4000, 0x1902: 0x4000, 0x1903: 0x4000, 0x1904: 0x4000, 0x1905: 0x4000, + 0x1907: 0x4000, 0x1908: 0x4000, 0x1909: 0x4000, 0x190a: 0x4000, 0x190b: 0x4000, + 0x190c: 0x4000, 0x190d: 0x4000, 0x190e: 0x4000, 0x190f: 0x4000, 0x1910: 0x4000, 0x1911: 0x4000, + 0x1912: 0x4000, 0x1913: 0x4000, 0x1914: 0x4000, 0x1915: 0x4000, 0x1916: 0x4000, 0x1917: 0x4000, + 0x1918: 0x4000, 0x1919: 0x4000, 0x191a: 0x4000, 0x191b: 0x4000, 0x191c: 0x4000, 0x191d: 0x4000, + 0x191e: 0x4000, 0x191f: 0x4000, 0x1920: 0x4000, 0x1921: 0x4000, 0x1922: 0x4000, 0x1923: 0x4000, + 0x1924: 0x4000, 0x1925: 0x4000, 0x1926: 0x4000, 0x1927: 0x4000, 0x1928: 0x4000, 0x1929: 0x4000, + 0x192a: 0x4000, 0x192b: 0x4000, 0x192c: 0x4000, 0x192d: 0x4000, 0x192e: 0x4000, 0x192f: 0x4000, + 0x1930: 0x4000, 0x1931: 0x4000, 0x1932: 0x4000, 0x1933: 0x4000, 0x1934: 0x4000, 0x1935: 0x4000, + 0x1936: 0x4000, 0x1937: 0x4000, 0x1938: 0x4000, 0x1939: 0x4000, 0x193a: 0x4000, 0x193b: 0x4000, + 0x193c: 0x4000, 0x193d: 0x4000, 0x193e: 0x4000, 0x193f: 0x4000, + // Block 0x65, offset 0x1940 + 0x1970: 0x4000, 0x1971: 0x4000, 0x1972: 0x4000, 0x1973: 0x4000, 0x1974: 0x4000, 0x1975: 0x4000, + 0x1976: 0x4000, 0x1977: 0x4000, 0x1978: 0x4000, 0x1979: 0x4000, 0x197a: 0x4000, 0x197b: 0x4000, + 0x197c: 0x4000, + // Block 0x66, offset 0x1980 + 0x1980: 0x4000, 0x1981: 0x4000, 0x1982: 0x4000, 0x1983: 0x4000, 0x1984: 0x4000, 0x1985: 0x4000, + 0x1986: 0x4000, 0x1987: 0x4000, 0x1988: 0x4000, + 0x1990: 0x4000, 0x1991: 0x4000, + 0x1992: 0x4000, 0x1993: 0x4000, 0x1994: 0x4000, 0x1995: 0x4000, 0x1996: 0x4000, 0x1997: 0x4000, + 0x1998: 0x4000, 0x1999: 0x4000, 0x199a: 0x4000, 0x199b: 0x4000, 0x199c: 0x4000, 0x199d: 0x4000, + 0x199e: 0x4000, 0x199f: 0x4000, 0x19a0: 0x4000, 0x19a1: 0x4000, 0x19a2: 0x4000, 0x19a3: 0x4000, + 0x19a4: 0x4000, 0x19a5: 0x4000, 0x19a6: 0x4000, 0x19a7: 0x4000, 0x19a8: 0x4000, 0x19a9: 0x4000, + 0x19aa: 0x4000, 0x19ab: 0x4000, 0x19ac: 0x4000, 0x19ad: 0x4000, 0x19ae: 0x4000, 0x19af: 0x4000, + 0x19b0: 0x4000, 0x19b1: 0x4000, 0x19b2: 0x4000, 0x19b3: 0x4000, 0x19b4: 0x4000, 0x19b5: 0x4000, + 0x19b6: 0x4000, 0x19b7: 0x4000, 0x19b8: 0x4000, 0x19b9: 0x4000, 0x19ba: 0x4000, 0x19bb: 0x4000, + 0x19bc: 0x4000, 0x19bd: 0x4000, 0x19bf: 0x4000, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x4000, 0x19c1: 0x4000, 0x19c2: 0x4000, 0x19c3: 0x4000, 0x19c4: 0x4000, 0x19c5: 0x4000, + 0x19ce: 0x4000, 0x19cf: 0x4000, 0x19d0: 0x4000, 0x19d1: 0x4000, + 0x19d2: 0x4000, 0x19d3: 0x4000, 0x19d4: 0x4000, 0x19d5: 0x4000, 0x19d6: 0x4000, 0x19d7: 0x4000, + 0x19d8: 0x4000, 0x19d9: 0x4000, 0x19da: 0x4000, 0x19db: 0x4000, + 0x19e0: 0x4000, 0x19e1: 0x4000, 0x19e2: 0x4000, 0x19e3: 0x4000, + 0x19e4: 0x4000, 0x19e5: 0x4000, 0x19e6: 0x4000, 0x19e7: 0x4000, 0x19e8: 0x4000, + 0x19f0: 0x4000, 0x19f1: 0x4000, 0x19f2: 0x4000, 0x19f3: 0x4000, 0x19f4: 0x4000, 0x19f5: 0x4000, + 0x19f6: 0x4000, 0x19f7: 0x4000, 0x19f8: 0x4000, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x2000, 0x1a01: 0x2000, 0x1a02: 0x2000, 0x1a03: 0x2000, 0x1a04: 0x2000, 0x1a05: 0x2000, + 0x1a06: 0x2000, 0x1a07: 0x2000, 0x1a08: 0x2000, 0x1a09: 0x2000, 0x1a0a: 0x2000, 0x1a0b: 0x2000, + 0x1a0c: 0x2000, 0x1a0d: 0x2000, 0x1a0e: 0x2000, 0x1a0f: 0x2000, 0x1a10: 0x2000, 0x1a11: 0x2000, + 0x1a12: 0x2000, 0x1a13: 0x2000, 0x1a14: 0x2000, 0x1a15: 0x2000, 0x1a16: 0x2000, 0x1a17: 0x2000, + 0x1a18: 0x2000, 0x1a19: 0x2000, 0x1a1a: 0x2000, 0x1a1b: 0x2000, 0x1a1c: 0x2000, 0x1a1d: 0x2000, + 0x1a1e: 0x2000, 0x1a1f: 0x2000, 0x1a20: 0x2000, 0x1a21: 0x2000, 0x1a22: 0x2000, 0x1a23: 0x2000, + 0x1a24: 0x2000, 0x1a25: 0x2000, 0x1a26: 0x2000, 0x1a27: 0x2000, 0x1a28: 0x2000, 0x1a29: 0x2000, + 0x1a2a: 0x2000, 0x1a2b: 0x2000, 0x1a2c: 0x2000, 0x1a2d: 0x2000, 0x1a2e: 0x2000, 0x1a2f: 0x2000, + 0x1a30: 0x2000, 0x1a31: 0x2000, 0x1a32: 0x2000, 0x1a33: 0x2000, 0x1a34: 0x2000, 0x1a35: 0x2000, + 0x1a36: 0x2000, 0x1a37: 0x2000, 0x1a38: 0x2000, 0x1a39: 0x2000, 0x1a3a: 0x2000, 0x1a3b: 0x2000, + 0x1a3c: 0x2000, 0x1a3d: 0x2000, +} + +// widthIndex: 23 blocks, 1472 entries, 1472 bytes +// Block 0 is the zero block. +var widthIndex = [1472]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05, + 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b, + 0xd0: 0x0c, 0xd1: 0x0d, + 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06, + 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a, + 0xf0: 0x10, 0xf3: 0x13, 0xf4: 0x14, + // Block 0x4, offset 0x100 + 0x104: 0x0e, 0x105: 0x0f, + // Block 0x5, offset 0x140 + 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16, + 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, 0x14f: 0x1b, + 0x151: 0x1c, 0x152: 0x08, 0x153: 0x1d, 0x154: 0x1e, 0x155: 0x1f, 0x156: 0x20, 0x157: 0x21, + 0x158: 0x22, 0x159: 0x23, 0x15a: 0x24, 0x15b: 0x25, 0x15c: 0x26, 0x15d: 0x27, 0x15e: 0x28, 0x15f: 0x29, + 0x166: 0x2a, + 0x16c: 0x2b, 0x16d: 0x2c, + 0x17a: 0x2d, 0x17b: 0x2e, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2f, + // Block 0x6, offset 0x180 + 0x180: 0x30, 0x181: 0x31, 0x182: 0x32, 0x183: 0x33, 0x184: 0x34, 0x185: 0x35, 0x186: 0x36, 0x187: 0x37, + 0x188: 0x38, 0x189: 0x39, 0x18a: 0x0e, 0x18b: 0x0e, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e, + 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e, + 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e, + 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e, + 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e, + 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e, + 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e, + 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e, + 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e, + 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e, + 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e, + 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e, + 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e, + 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e, + // Block 0x8, offset 0x200 + 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e, + 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e, + 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e, + 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e, + 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e, + 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e, + 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e, + 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e, + // Block 0x9, offset 0x240 + 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e, + 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e, + 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x3a, 0x253: 0x3b, + 0x265: 0x3c, + 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e, + 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e, + // Block 0xa, offset 0x280 + 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e, + 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e, + 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e, + 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08, + 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08, + 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08, + 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08, + 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08, + 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08, + 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08, + 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08, + // Block 0xc, offset 0x300 + 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08, + 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08, + 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08, + 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08, + 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e, + 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e, + 0x338: 0x3e, 0x339: 0x3f, 0x33c: 0x40, 0x33d: 0x41, 0x33e: 0x42, 0x33f: 0x43, + // Block 0xd, offset 0x340 + 0x37f: 0x44, + // Block 0xe, offset 0x380 + 0x380: 0x0e, 0x381: 0x0e, 0x382: 0x0e, 0x383: 0x0e, 0x384: 0x0e, 0x385: 0x0e, 0x386: 0x0e, 0x387: 0x0e, + 0x388: 0x0e, 0x389: 0x0e, 0x38a: 0x0e, 0x38b: 0x0e, 0x38c: 0x0e, 0x38d: 0x0e, 0x38e: 0x0e, 0x38f: 0x0e, + 0x390: 0x0e, 0x391: 0x0e, 0x392: 0x0e, 0x393: 0x0e, 0x394: 0x0e, 0x395: 0x0e, 0x396: 0x0e, 0x397: 0x0e, + 0x398: 0x0e, 0x399: 0x0e, 0x39a: 0x0e, 0x39b: 0x0e, 0x39c: 0x0e, 0x39d: 0x0e, 0x39e: 0x0e, 0x39f: 0x45, + 0x3a0: 0x0e, 0x3a1: 0x0e, 0x3a2: 0x0e, 0x3a3: 0x0e, 0x3a4: 0x0e, 0x3a5: 0x0e, 0x3a6: 0x0e, 0x3a7: 0x0e, + 0x3a8: 0x0e, 0x3a9: 0x0e, 0x3aa: 0x0e, 0x3ab: 0x0e, 0x3ac: 0x0e, 0x3ad: 0x0e, 0x3ae: 0x0e, 0x3af: 0x0e, + 0x3b0: 0x0e, 0x3b1: 0x0e, 0x3b2: 0x0e, 0x3b3: 0x46, 0x3b4: 0x47, + // Block 0xf, offset 0x3c0 + 0x3ff: 0x48, + // Block 0x10, offset 0x400 + 0x400: 0x0e, 0x401: 0x0e, 0x402: 0x0e, 0x403: 0x0e, 0x404: 0x49, 0x405: 0x4a, 0x406: 0x0e, 0x407: 0x0e, + 0x408: 0x0e, 0x409: 0x0e, 0x40a: 0x0e, 0x40b: 0x4b, + // Block 0x11, offset 0x440 + 0x440: 0x4c, 0x443: 0x4d, 0x444: 0x4e, 0x445: 0x4f, 0x446: 0x50, + 0x448: 0x51, 0x449: 0x52, 0x44c: 0x53, 0x44d: 0x54, 0x44e: 0x55, 0x44f: 0x56, + 0x450: 0x57, 0x451: 0x58, 0x452: 0x0e, 0x453: 0x59, 0x454: 0x5a, 0x455: 0x5b, 0x456: 0x5c, 0x457: 0x5d, + 0x458: 0x0e, 0x459: 0x5e, 0x45a: 0x0e, 0x45b: 0x5f, 0x45f: 0x60, + 0x464: 0x61, 0x465: 0x62, 0x466: 0x0e, 0x467: 0x0e, + 0x469: 0x63, 0x46a: 0x64, 0x46b: 0x65, + // Block 0x12, offset 0x480 + 0x496: 0x0b, 0x497: 0x06, + 0x498: 0x0c, 0x49a: 0x0d, 0x49b: 0x0e, 0x49f: 0x0f, + 0x4a0: 0x06, 0x4a1: 0x06, 0x4a2: 0x06, 0x4a3: 0x06, 0x4a4: 0x06, 0x4a5: 0x06, 0x4a6: 0x06, 0x4a7: 0x06, + 0x4a8: 0x06, 0x4a9: 0x06, 0x4aa: 0x06, 0x4ab: 0x06, 0x4ac: 0x06, 0x4ad: 0x06, 0x4ae: 0x06, 0x4af: 0x06, + 0x4b0: 0x06, 0x4b1: 0x06, 0x4b2: 0x06, 0x4b3: 0x06, 0x4b4: 0x06, 0x4b5: 0x06, 0x4b6: 0x06, 0x4b7: 0x06, + 0x4b8: 0x06, 0x4b9: 0x06, 0x4ba: 0x06, 0x4bb: 0x06, 0x4bc: 0x06, 0x4bd: 0x06, 0x4be: 0x06, 0x4bf: 0x06, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x08, 0x4c5: 0x08, 0x4c6: 0x08, 0x4c7: 0x09, + // Block 0x14, offset 0x500 + 0x500: 0x08, 0x501: 0x08, 0x502: 0x08, 0x503: 0x08, 0x504: 0x08, 0x505: 0x08, 0x506: 0x08, 0x507: 0x08, + 0x508: 0x08, 0x509: 0x08, 0x50a: 0x08, 0x50b: 0x08, 0x50c: 0x08, 0x50d: 0x08, 0x50e: 0x08, 0x50f: 0x08, + 0x510: 0x08, 0x511: 0x08, 0x512: 0x08, 0x513: 0x08, 0x514: 0x08, 0x515: 0x08, 0x516: 0x08, 0x517: 0x08, + 0x518: 0x08, 0x519: 0x08, 0x51a: 0x08, 0x51b: 0x08, 0x51c: 0x08, 0x51d: 0x08, 0x51e: 0x08, 0x51f: 0x08, + 0x520: 0x08, 0x521: 0x08, 0x522: 0x08, 0x523: 0x08, 0x524: 0x08, 0x525: 0x08, 0x526: 0x08, 0x527: 0x08, + 0x528: 0x08, 0x529: 0x08, 0x52a: 0x08, 0x52b: 0x08, 0x52c: 0x08, 0x52d: 0x08, 0x52e: 0x08, 0x52f: 0x08, + 0x530: 0x08, 0x531: 0x08, 0x532: 0x08, 0x533: 0x08, 0x534: 0x08, 0x535: 0x08, 0x536: 0x08, 0x537: 0x08, + 0x538: 0x08, 0x539: 0x08, 0x53a: 0x08, 0x53b: 0x08, 0x53c: 0x08, 0x53d: 0x08, 0x53e: 0x08, 0x53f: 0x66, + // Block 0x15, offset 0x540 + 0x560: 0x11, + 0x570: 0x09, 0x571: 0x09, 0x572: 0x09, 0x573: 0x09, 0x574: 0x09, 0x575: 0x09, 0x576: 0x09, 0x577: 0x09, + 0x578: 0x09, 0x579: 0x09, 0x57a: 0x09, 0x57b: 0x09, 0x57c: 0x09, 0x57d: 0x09, 0x57e: 0x09, 0x57f: 0x12, + // Block 0x16, offset 0x580 + 0x580: 0x09, 0x581: 0x09, 0x582: 0x09, 0x583: 0x09, 0x584: 0x09, 0x585: 0x09, 0x586: 0x09, 0x587: 0x09, + 0x588: 0x09, 0x589: 0x09, 0x58a: 0x09, 0x58b: 0x09, 0x58c: 0x09, 0x58d: 0x09, 0x58e: 0x09, 0x58f: 0x12, +} + +// inverseData contains 4-byte entries of the following format: +// +// <length> <modified UTF-8-encoded rune> <0 padding> +// +// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the +// UTF-8 encoding of the original rune. Mappings often have the following +// pattern: +// +// A -> A (U+FF21 -> U+0041) +// B -> B (U+FF22 -> U+0042) +// ... +// +// By xor-ing the last byte the same entry can be shared by many mappings. This +// reduces the total number of distinct entries by about two thirds. +// The resulting entry for the aforementioned mappings is +// +// { 0x01, 0xE0, 0x00, 0x00 } +// +// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get +// +// E0 ^ A1 = 41. +// +// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get +// +// E0 ^ A2 = 42. +// +// Note that because of the xor-ing, the byte sequence stored in the entry is +// not valid UTF-8. +var inverseData = [150][4]byte{ + {0x00, 0x00, 0x00, 0x00}, + {0x03, 0xe3, 0x80, 0xa0}, + {0x03, 0xef, 0xbc, 0xa0}, + {0x03, 0xef, 0xbc, 0xe0}, + {0x03, 0xef, 0xbd, 0xe0}, + {0x03, 0xef, 0xbf, 0x02}, + {0x03, 0xef, 0xbf, 0x00}, + {0x03, 0xef, 0xbf, 0x0e}, + {0x03, 0xef, 0xbf, 0x0c}, + {0x03, 0xef, 0xbf, 0x0f}, + {0x03, 0xef, 0xbf, 0x39}, + {0x03, 0xef, 0xbf, 0x3b}, + {0x03, 0xef, 0xbf, 0x3f}, + {0x03, 0xef, 0xbf, 0x2a}, + {0x03, 0xef, 0xbf, 0x0d}, + {0x03, 0xef, 0xbf, 0x25}, + {0x03, 0xef, 0xbd, 0x1a}, + {0x03, 0xef, 0xbd, 0x26}, + {0x01, 0xa0, 0x00, 0x00}, + {0x03, 0xef, 0xbd, 0x25}, + {0x03, 0xef, 0xbd, 0x23}, + {0x03, 0xef, 0xbd, 0x2e}, + {0x03, 0xef, 0xbe, 0x07}, + {0x03, 0xef, 0xbe, 0x05}, + {0x03, 0xef, 0xbd, 0x06}, + {0x03, 0xef, 0xbd, 0x13}, + {0x03, 0xef, 0xbd, 0x0b}, + {0x03, 0xef, 0xbd, 0x16}, + {0x03, 0xef, 0xbd, 0x0c}, + {0x03, 0xef, 0xbd, 0x15}, + {0x03, 0xef, 0xbd, 0x0d}, + {0x03, 0xef, 0xbd, 0x1c}, + {0x03, 0xef, 0xbd, 0x02}, + {0x03, 0xef, 0xbd, 0x1f}, + {0x03, 0xef, 0xbd, 0x1d}, + {0x03, 0xef, 0xbd, 0x17}, + {0x03, 0xef, 0xbd, 0x08}, + {0x03, 0xef, 0xbd, 0x09}, + {0x03, 0xef, 0xbd, 0x0e}, + {0x03, 0xef, 0xbd, 0x04}, + {0x03, 0xef, 0xbd, 0x05}, + {0x03, 0xef, 0xbe, 0x3f}, + {0x03, 0xef, 0xbe, 0x00}, + {0x03, 0xef, 0xbd, 0x2c}, + {0x03, 0xef, 0xbe, 0x06}, + {0x03, 0xef, 0xbe, 0x0c}, + {0x03, 0xef, 0xbe, 0x0f}, + {0x03, 0xef, 0xbe, 0x0d}, + {0x03, 0xef, 0xbe, 0x0b}, + {0x03, 0xef, 0xbe, 0x19}, + {0x03, 0xef, 0xbe, 0x15}, + {0x03, 0xef, 0xbe, 0x11}, + {0x03, 0xef, 0xbe, 0x31}, + {0x03, 0xef, 0xbe, 0x33}, + {0x03, 0xef, 0xbd, 0x0f}, + {0x03, 0xef, 0xbe, 0x30}, + {0x03, 0xef, 0xbe, 0x3e}, + {0x03, 0xef, 0xbe, 0x32}, + {0x03, 0xef, 0xbe, 0x36}, + {0x03, 0xef, 0xbd, 0x14}, + {0x03, 0xef, 0xbe, 0x2e}, + {0x03, 0xef, 0xbd, 0x1e}, + {0x03, 0xef, 0xbe, 0x10}, + {0x03, 0xef, 0xbf, 0x13}, + {0x03, 0xef, 0xbf, 0x15}, + {0x03, 0xef, 0xbf, 0x17}, + {0x03, 0xef, 0xbf, 0x1f}, + {0x03, 0xef, 0xbf, 0x1d}, + {0x03, 0xef, 0xbf, 0x1b}, + {0x03, 0xef, 0xbf, 0x09}, + {0x03, 0xef, 0xbf, 0x0b}, + {0x03, 0xef, 0xbf, 0x37}, + {0x03, 0xef, 0xbe, 0x04}, + {0x01, 0xe0, 0x00, 0x00}, + {0x03, 0xe2, 0xa6, 0x1a}, + {0x03, 0xe2, 0xa6, 0x26}, + {0x03, 0xe3, 0x80, 0x23}, + {0x03, 0xe3, 0x80, 0x2e}, + {0x03, 0xe3, 0x80, 0x25}, + {0x03, 0xe3, 0x83, 0x1e}, + {0x03, 0xe3, 0x83, 0x14}, + {0x03, 0xe3, 0x82, 0x06}, + {0x03, 0xe3, 0x82, 0x0b}, + {0x03, 0xe3, 0x82, 0x0c}, + {0x03, 0xe3, 0x82, 0x0d}, + {0x03, 0xe3, 0x82, 0x02}, + {0x03, 0xe3, 0x83, 0x0f}, + {0x03, 0xe3, 0x83, 0x08}, + {0x03, 0xe3, 0x83, 0x09}, + {0x03, 0xe3, 0x83, 0x2c}, + {0x03, 0xe3, 0x83, 0x0c}, + {0x03, 0xe3, 0x82, 0x13}, + {0x03, 0xe3, 0x82, 0x16}, + {0x03, 0xe3, 0x82, 0x15}, + {0x03, 0xe3, 0x82, 0x1c}, + {0x03, 0xe3, 0x82, 0x1f}, + {0x03, 0xe3, 0x82, 0x1d}, + {0x03, 0xe3, 0x82, 0x1a}, + {0x03, 0xe3, 0x82, 0x17}, + {0x03, 0xe3, 0x82, 0x08}, + {0x03, 0xe3, 0x82, 0x09}, + {0x03, 0xe3, 0x82, 0x0e}, + {0x03, 0xe3, 0x82, 0x04}, + {0x03, 0xe3, 0x82, 0x05}, + {0x03, 0xe3, 0x82, 0x3f}, + {0x03, 0xe3, 0x83, 0x00}, + {0x03, 0xe3, 0x83, 0x06}, + {0x03, 0xe3, 0x83, 0x05}, + {0x03, 0xe3, 0x83, 0x0d}, + {0x03, 0xe3, 0x83, 0x0b}, + {0x03, 0xe3, 0x83, 0x07}, + {0x03, 0xe3, 0x83, 0x19}, + {0x03, 0xe3, 0x83, 0x15}, + {0x03, 0xe3, 0x83, 0x11}, + {0x03, 0xe3, 0x83, 0x31}, + {0x03, 0xe3, 0x83, 0x33}, + {0x03, 0xe3, 0x83, 0x30}, + {0x03, 0xe3, 0x83, 0x3e}, + {0x03, 0xe3, 0x83, 0x32}, + {0x03, 0xe3, 0x83, 0x36}, + {0x03, 0xe3, 0x83, 0x2e}, + {0x03, 0xe3, 0x82, 0x07}, + {0x03, 0xe3, 0x85, 0x04}, + {0x03, 0xe3, 0x84, 0x10}, + {0x03, 0xe3, 0x85, 0x30}, + {0x03, 0xe3, 0x85, 0x0d}, + {0x03, 0xe3, 0x85, 0x13}, + {0x03, 0xe3, 0x85, 0x15}, + {0x03, 0xe3, 0x85, 0x17}, + {0x03, 0xe3, 0x85, 0x1f}, + {0x03, 0xe3, 0x85, 0x1d}, + {0x03, 0xe3, 0x85, 0x1b}, + {0x03, 0xe3, 0x85, 0x09}, + {0x03, 0xe3, 0x85, 0x0f}, + {0x03, 0xe3, 0x85, 0x0b}, + {0x03, 0xe3, 0x85, 0x37}, + {0x03, 0xe3, 0x85, 0x3b}, + {0x03, 0xe3, 0x85, 0x39}, + {0x03, 0xe3, 0x85, 0x3f}, + {0x02, 0xc2, 0x02, 0x00}, + {0x02, 0xc2, 0x0e, 0x00}, + {0x02, 0xc2, 0x0c, 0x00}, + {0x02, 0xc2, 0x00, 0x00}, + {0x03, 0xe2, 0x82, 0x0f}, + {0x03, 0xe2, 0x94, 0x2a}, + {0x03, 0xe2, 0x86, 0x39}, + {0x03, 0xe2, 0x86, 0x3b}, + {0x03, 0xe2, 0x86, 0x3f}, + {0x03, 0xe2, 0x96, 0x0d}, + {0x03, 0xe2, 0x97, 0x25}, +} + +// Total table size 15512 bytes (15KiB) diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go new file mode 100644 index 0000000000..aa7dfaccf5 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -0,0 +1,764 @@ +// Copyright 2018 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 objectpath defines a naming scheme for types.Objects +// (that is, named entities in Go programs) relative to their enclosing +// package. +// +// Type-checker objects are canonical, so they are usually identified by +// their address in memory (a pointer), but a pointer has meaning only +// within one address space. By contrast, objectpath names allow the +// identity of an object to be sent from one program to another, +// establishing a correspondence between types.Object variables that are +// distinct but logically equivalent. +// +// A single object may have multiple paths. In this example, +// +// type A struct{ X int } +// type B A +// +// the field X has two paths due to its membership of both A and B. +// The For(obj) function always returns one of these paths, arbitrarily +// but consistently. +package objectpath + +import ( + "fmt" + "go/types" + "sort" + "strconv" + "strings" + + "golang.org/x/tools/internal/typeparams" + + _ "unsafe" // for go:linkname +) + +// A Path is an opaque name that identifies a types.Object +// relative to its package. Conceptually, the name consists of a +// sequence of destructuring operations applied to the package scope +// to obtain the original object. +// The name does not include the package itself. +type Path string + +// Encoding +// +// An object path is a textual and (with training) human-readable encoding +// of a sequence of destructuring operators, starting from a types.Package. +// The sequences represent a path through the package/object/type graph. +// We classify these operators by their type: +// +// PO package->object Package.Scope.Lookup +// OT object->type Object.Type +// TT type->type Type.{Elem,Key,Params,Results,Underlying} [EKPRU] +// TO type->object Type.{At,Field,Method,Obj} [AFMO] +// +// All valid paths start with a package and end at an object +// and thus may be defined by the regular language: +// +// objectpath = PO (OT TT* TO)* +// +// The concrete encoding follows directly: +// - The only PO operator is Package.Scope.Lookup, which requires an identifier. +// - The only OT operator is Object.Type, +// which we encode as '.' because dot cannot appear in an identifier. +// - The TT operators are encoded as [EKPRUTC]; +// one of these (TypeParam) requires an integer operand, +// which is encoded as a string of decimal digits. +// - The TO operators are encoded as [AFMO]; +// three of these (At,Field,Method) require an integer operand, +// which is encoded as a string of decimal digits. +// These indices are stable across different representations +// of the same package, even source and export data. +// The indices used are implementation specific and may not correspond to +// the argument to the go/types function. +// +// In the example below, +// +// package p +// +// type T interface { +// f() (a string, b struct{ X int }) +// } +// +// field X has the path "T.UM0.RA1.F0", +// representing the following sequence of operations: +// +// p.Lookup("T") T +// .Type().Underlying().Method(0). f +// .Type().Results().At(1) b +// .Type().Field(0) X +// +// The encoding is not maximally compact---every R or P is +// followed by an A, for example---but this simplifies the +// encoder and decoder. +const ( + // object->type operators + opType = '.' // .Type() (Object) + + // type->type operators + opElem = 'E' // .Elem() (Pointer, Slice, Array, Chan, Map) + opKey = 'K' // .Key() (Map) + opParams = 'P' // .Params() (Signature) + opResults = 'R' // .Results() (Signature) + opUnderlying = 'U' // .Underlying() (Named) + opTypeParam = 'T' // .TypeParams.At(i) (Named, Signature) + opConstraint = 'C' // .Constraint() (TypeParam) + + // type->object operators + opAt = 'A' // .At(i) (Tuple) + opField = 'F' // .Field(i) (Struct) + opMethod = 'M' // .Method(i) (Named or Interface; not Struct: "promoted" names are ignored) + opObj = 'O' // .Obj() (Named, TypeParam) +) + +// For is equivalent to new(Encoder).For(obj). +// +// It may be more efficient to reuse a single Encoder across several calls. +func For(obj types.Object) (Path, error) { + return new(Encoder).For(obj) +} + +// An Encoder amortizes the cost of encoding the paths of multiple objects. +// The zero value of an Encoder is ready to use. +type Encoder struct { + scopeNamesMemo map[*types.Scope][]string // memoization of Scope.Names() + namedMethodsMemo map[*types.Named][]*types.Func // memoization of namedMethods() +} + +// For returns the path to an object relative to its package, +// or an error if the object is not accessible from the package's Scope. +// +// The For function guarantees to return a path only for the following objects: +// - package-level types +// - exported package-level non-types +// - methods +// - parameter and result variables +// - struct fields +// These objects are sufficient to define the API of their package. +// The objects described by a package's export data are drawn from this set. +// +// For does not return a path for predeclared names, imported package +// names, local names, and unexported package-level names (except +// types). +// +// Example: given this definition, +// +// package p +// +// type T interface { +// f() (a string, b struct{ X int }) +// } +// +// For(X) would return a path that denotes the following sequence of operations: +// +// p.Scope().Lookup("T") (TypeName T) +// .Type().Underlying().Method(0). (method Func f) +// .Type().Results().At(1) (field Var b) +// .Type().Field(0) (field Var X) +// +// where p is the package (*types.Package) to which X belongs. +func (enc *Encoder) For(obj types.Object) (Path, error) { + pkg := obj.Pkg() + + // This table lists the cases of interest. + // + // Object Action + // ------ ------ + // nil reject + // builtin reject + // pkgname reject + // label reject + // var + // package-level accept + // func param/result accept + // local reject + // struct field accept + // const + // package-level accept + // local reject + // func + // package-level accept + // init functions reject + // concrete method accept + // interface method accept + // type + // package-level accept + // local reject + // + // The only accessible package-level objects are members of pkg itself. + // + // The cases are handled in four steps: + // + // 1. reject nil and builtin + // 2. accept package-level objects + // 3. reject obviously invalid objects + // 4. search the API for the path to the param/result/field/method. + + // 1. reference to nil or builtin? + if pkg == nil { + return "", fmt.Errorf("predeclared %s has no path", obj) + } + scope := pkg.Scope() + + // 2. package-level object? + if scope.Lookup(obj.Name()) == obj { + // Only exported objects (and non-exported types) have a path. + // Non-exported types may be referenced by other objects. + if _, ok := obj.(*types.TypeName); !ok && !obj.Exported() { + return "", fmt.Errorf("no path for non-exported %v", obj) + } + return Path(obj.Name()), nil + } + + // 3. Not a package-level object. + // Reject obviously non-viable cases. + switch obj := obj.(type) { + case *types.TypeName: + if _, ok := obj.Type().(*typeparams.TypeParam); !ok { + // With the exception of type parameters, only package-level type names + // have a path. + return "", fmt.Errorf("no path for %v", obj) + } + case *types.Const, // Only package-level constants have a path. + *types.Label, // Labels are function-local. + *types.PkgName: // PkgNames are file-local. + return "", fmt.Errorf("no path for %v", obj) + + case *types.Var: + // Could be: + // - a field (obj.IsField()) + // - a func parameter or result + // - a local var. + // Sadly there is no way to distinguish + // a param/result from a local + // so we must proceed to the find. + + case *types.Func: + // A func, if not package-level, must be a method. + if recv := obj.Type().(*types.Signature).Recv(); recv == nil { + return "", fmt.Errorf("func is not a method: %v", obj) + } + + if path, ok := enc.concreteMethod(obj); ok { + // Fast path for concrete methods that avoids looping over scope. + return path, nil + } + + default: + panic(obj) + } + + // 4. Search the API for the path to the var (field/param/result) or method. + + // First inspect package-level named types. + // In the presence of path aliases, these give + // the best paths because non-types may + // refer to types, but not the reverse. + empty := make([]byte, 0, 48) // initial space + names := enc.scopeNames(scope) + for _, name := range names { + o := scope.Lookup(name) + tname, ok := o.(*types.TypeName) + if !ok { + continue // handle non-types in second pass + } + + path := append(empty, name...) + path = append(path, opType) + + T := o.Type() + + if tname.IsAlias() { + // type alias + if r := find(obj, T, path, nil); r != nil { + return Path(r), nil + } + } else { + if named, _ := T.(*types.Named); named != nil { + if r := findTypeParam(obj, typeparams.ForNamed(named), path, nil); r != nil { + // generic named type + return Path(r), nil + } + } + // defined (named) type + if r := find(obj, T.Underlying(), append(path, opUnderlying), nil); r != nil { + return Path(r), nil + } + } + } + + // Then inspect everything else: + // non-types, and declared methods of defined types. + for _, name := range names { + o := scope.Lookup(name) + path := append(empty, name...) + if _, ok := o.(*types.TypeName); !ok { + if o.Exported() { + // exported non-type (const, var, func) + if r := find(obj, o.Type(), append(path, opType), nil); r != nil { + return Path(r), nil + } + } + continue + } + + // Inspect declared methods of defined types. + if T, ok := o.Type().(*types.Named); ok { + path = append(path, opType) + // Note that method index here is always with respect + // to canonical ordering of methods, regardless of how + // they appear in the underlying type. + for i, m := range enc.namedMethods(T) { + path2 := appendOpArg(path, opMethod, i) + if m == obj { + return Path(path2), nil // found declared method + } + if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { + return Path(r), nil + } + } + } + } + + return "", fmt.Errorf("can't find path for %v in %s", obj, pkg.Path()) +} + +func appendOpArg(path []byte, op byte, arg int) []byte { + path = append(path, op) + path = strconv.AppendInt(path, int64(arg), 10) + return path +} + +// concreteMethod returns the path for meth, which must have a non-nil receiver. +// The second return value indicates success and may be false if the method is +// an interface method or if it is an instantiated method. +// +// This function is just an optimization that avoids the general scope walking +// approach. You are expected to fall back to the general approach if this +// function fails. +func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) { + // Concrete methods can only be declared on package-scoped named types. For + // that reason we can skip the expensive walk over the package scope: the + // path will always be package -> named type -> method. We can trivially get + // the type name from the receiver, and only have to look over the type's + // methods to find the method index. + // + // Methods on generic types require special consideration, however. Consider + // the following package: + // + // L1: type S[T any] struct{} + // L2: func (recv S[A]) Foo() { recv.Bar() } + // L3: func (recv S[B]) Bar() { } + // L4: type Alias = S[int] + // L5: func _[T any]() { var s S[int]; s.Foo() } + // + // The receivers of methods on generic types are instantiations. L2 and L3 + // instantiate S with the type-parameters A and B, which are scoped to the + // respective methods. L4 and L5 each instantiate S with int. Each of these + // instantiations has its own method set, full of methods (and thus objects) + // with receivers whose types are the respective instantiations. In other + // words, we have + // + // S[A].Foo, S[A].Bar + // S[B].Foo, S[B].Bar + // S[int].Foo, S[int].Bar + // + // We may thus be trying to produce object paths for any of these objects. + // + // S[A].Foo and S[B].Bar are the origin methods, and their paths are S.Foo + // and S.Bar, which are the paths that this function naturally produces. + // + // S[A].Bar, S[B].Foo, and both methods on S[int] are instantiations that + // don't correspond to the origin methods. For S[int], this is significant. + // The most precise object path for S[int].Foo, for example, is Alias.Foo, + // not S.Foo. Our function, however, would produce S.Foo, which would + // resolve to a different object. + // + // For S[A].Bar and S[B].Foo it could be argued that S.Bar and S.Foo are + // still the correct paths, since only the origin methods have meaningful + // paths. But this is likely only true for trivial cases and has edge cases. + // Since this function is only an optimization, we err on the side of giving + // up, deferring to the slower but definitely correct algorithm. Most users + // of objectpath will only be giving us origin methods, anyway, as referring + // to instantiated methods is usually not useful. + + if typeparams.OriginMethod(meth) != meth { + return "", false + } + + recvT := meth.Type().(*types.Signature).Recv().Type() + if ptr, ok := recvT.(*types.Pointer); ok { + recvT = ptr.Elem() + } + + named, ok := recvT.(*types.Named) + if !ok { + return "", false + } + + if types.IsInterface(named) { + // Named interfaces don't have to be package-scoped + // + // TODO(dominikh): opt: if scope.Lookup(name) == named, then we can apply this optimization to interface + // methods, too, I think. + return "", false + } + + // Preallocate space for the name, opType, opMethod, and some digits. + name := named.Obj().Name() + path := make([]byte, 0, len(name)+8) + path = append(path, name...) + path = append(path, opType) + for i, m := range enc.namedMethods(named) { + if m == meth { + path = appendOpArg(path, opMethod, i) + return Path(path), true + } + } + + // Due to golang/go#59944, go/types fails to associate the receiver with + // certain methods on cgo types. + // + // TODO(rfindley): replace this panic once golang/go#59944 is fixed in all Go + // versions gopls supports. + return "", false + // panic(fmt.Sprintf("couldn't find method %s on type %s; methods: %#v", meth, named, enc.namedMethods(named))) +} + +// find finds obj within type T, returning the path to it, or nil if not found. +// +// The seen map is used to short circuit cycles through type parameters. If +// nil, it will be allocated as necessary. +func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]bool) []byte { + switch T := T.(type) { + case *types.Basic, *types.Named: + // Named types belonging to pkg were handled already, + // so T must belong to another package. No path. + return nil + case *types.Pointer: + return find(obj, T.Elem(), append(path, opElem), seen) + case *types.Slice: + return find(obj, T.Elem(), append(path, opElem), seen) + case *types.Array: + return find(obj, T.Elem(), append(path, opElem), seen) + case *types.Chan: + return find(obj, T.Elem(), append(path, opElem), seen) + case *types.Map: + if r := find(obj, T.Key(), append(path, opKey), seen); r != nil { + return r + } + return find(obj, T.Elem(), append(path, opElem), seen) + case *types.Signature: + if r := findTypeParam(obj, typeparams.ForSignature(T), path, seen); r != nil { + return r + } + if r := find(obj, T.Params(), append(path, opParams), seen); r != nil { + return r + } + return find(obj, T.Results(), append(path, opResults), seen) + case *types.Struct: + for i := 0; i < T.NumFields(); i++ { + fld := T.Field(i) + path2 := appendOpArg(path, opField, i) + if fld == obj { + return path2 // found field var + } + if r := find(obj, fld.Type(), append(path2, opType), seen); r != nil { + return r + } + } + return nil + case *types.Tuple: + for i := 0; i < T.Len(); i++ { + v := T.At(i) + path2 := appendOpArg(path, opAt, i) + if v == obj { + return path2 // found param/result var + } + if r := find(obj, v.Type(), append(path2, opType), seen); r != nil { + return r + } + } + return nil + case *types.Interface: + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + path2 := appendOpArg(path, opMethod, i) + if m == obj { + return path2 // found interface method + } + if r := find(obj, m.Type(), append(path2, opType), seen); r != nil { + return r + } + } + return nil + case *typeparams.TypeParam: + name := T.Obj() + if name == obj { + return append(path, opObj) + } + if seen[name] { + return nil + } + if seen == nil { + seen = make(map[*types.TypeName]bool) + } + seen[name] = true + if r := find(obj, T.Constraint(), append(path, opConstraint), seen); r != nil { + return r + } + return nil + } + panic(T) +} + +func findTypeParam(obj types.Object, list *typeparams.TypeParamList, path []byte, seen map[*types.TypeName]bool) []byte { + for i := 0; i < list.Len(); i++ { + tparam := list.At(i) + path2 := appendOpArg(path, opTypeParam, i) + if r := find(obj, tparam, path2, seen); r != nil { + return r + } + } + return nil +} + +// Object returns the object denoted by path p within the package pkg. +func Object(pkg *types.Package, p Path) (types.Object, error) { + if p == "" { + return nil, fmt.Errorf("empty path") + } + + pathstr := string(p) + var pkgobj, suffix string + if dot := strings.IndexByte(pathstr, opType); dot < 0 { + pkgobj = pathstr + } else { + pkgobj = pathstr[:dot] + suffix = pathstr[dot:] // suffix starts with "." + } + + obj := pkg.Scope().Lookup(pkgobj) + if obj == nil { + return nil, fmt.Errorf("package %s does not contain %q", pkg.Path(), pkgobj) + } + + // abstraction of *types.{Pointer,Slice,Array,Chan,Map} + type hasElem interface { + Elem() types.Type + } + // abstraction of *types.{Named,Signature} + type hasTypeParams interface { + TypeParams() *typeparams.TypeParamList + } + // abstraction of *types.{Named,TypeParam} + type hasObj interface { + Obj() *types.TypeName + } + + // The loop state is the pair (t, obj), + // exactly one of which is non-nil, initially obj. + // All suffixes start with '.' (the only object->type operation), + // followed by optional type->type operations, + // then a type->object operation. + // The cycle then repeats. + var t types.Type + for suffix != "" { + code := suffix[0] + suffix = suffix[1:] + + // Codes [AFM] have an integer operand. + var index int + switch code { + case opAt, opField, opMethod, opTypeParam: + rest := strings.TrimLeft(suffix, "0123456789") + numerals := suffix[:len(suffix)-len(rest)] + suffix = rest + i, err := strconv.Atoi(numerals) + if err != nil { + return nil, fmt.Errorf("invalid path: bad numeric operand %q for code %q", numerals, code) + } + index = int(i) + case opObj: + // no operand + default: + // The suffix must end with a type->object operation. + if suffix == "" { + return nil, fmt.Errorf("invalid path: ends with %q, want [AFMO]", code) + } + } + + if code == opType { + if t != nil { + return nil, fmt.Errorf("invalid path: unexpected %q in type context", opType) + } + t = obj.Type() + obj = nil + continue + } + + if t == nil { + return nil, fmt.Errorf("invalid path: code %q in object context", code) + } + + // Inv: t != nil, obj == nil + + switch code { + case opElem: + hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want pointer, slice, array, chan or map)", code, t, t) + } + t = hasElem.Elem() + + case opKey: + mapType, ok := t.(*types.Map) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want map)", code, t, t) + } + t = mapType.Key() + + case opParams: + sig, ok := t.(*types.Signature) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) + } + t = sig.Params() + + case opResults: + sig, ok := t.(*types.Signature) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) + } + t = sig.Results() + + case opUnderlying: + named, ok := t.(*types.Named) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want named)", code, t, t) + } + t = named.Underlying() + + case opTypeParam: + hasTypeParams, ok := t.(hasTypeParams) // Named, Signature + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want named or signature)", code, t, t) + } + tparams := hasTypeParams.TypeParams() + if n := tparams.Len(); index >= n { + return nil, fmt.Errorf("tuple index %d out of range [0-%d)", index, n) + } + t = tparams.At(index) + + case opConstraint: + tparam, ok := t.(*typeparams.TypeParam) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want type parameter)", code, t, t) + } + t = tparam.Constraint() + + case opAt: + tuple, ok := t.(*types.Tuple) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want tuple)", code, t, t) + } + if n := tuple.Len(); index >= n { + return nil, fmt.Errorf("tuple index %d out of range [0-%d)", index, n) + } + obj = tuple.At(index) + t = nil + + case opField: + structType, ok := t.(*types.Struct) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want struct)", code, t, t) + } + if n := structType.NumFields(); index >= n { + return nil, fmt.Errorf("field index %d out of range [0-%d)", index, n) + } + obj = structType.Field(index) + t = nil + + case opMethod: + switch t := t.(type) { + case *types.Interface: + if index >= t.NumMethods() { + return nil, fmt.Errorf("method index %d out of range [0-%d)", index, t.NumMethods()) + } + obj = t.Method(index) // Id-ordered + + case *types.Named: + methods := namedMethods(t) // (unmemoized) + if index >= len(methods) { + return nil, fmt.Errorf("method index %d out of range [0-%d)", index, len(methods)) + } + obj = methods[index] // Id-ordered + + default: + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want interface or named)", code, t, t) + } + t = nil + + case opObj: + hasObj, ok := t.(hasObj) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want named or type param)", code, t, t) + } + obj = hasObj.Obj() + t = nil + + default: + return nil, fmt.Errorf("invalid path: unknown code %q", code) + } + } + + if obj.Pkg() != pkg { + return nil, fmt.Errorf("path denotes %s, which belongs to a different package", obj) + } + + return obj, nil // success +} + +// namedMethods returns the methods of a Named type in ascending Id order. +func namedMethods(named *types.Named) []*types.Func { + methods := make([]*types.Func, named.NumMethods()) + for i := range methods { + methods[i] = named.Method(i) + } + sort.Slice(methods, func(i, j int) bool { + return methods[i].Id() < methods[j].Id() + }) + return methods +} + +// namedMethods is a memoization of the namedMethods function. Callers must not modify the result. +func (enc *Encoder) namedMethods(named *types.Named) []*types.Func { + m := enc.namedMethodsMemo + if m == nil { + m = make(map[*types.Named][]*types.Func) + enc.namedMethodsMemo = m + } + methods, ok := m[named] + if !ok { + methods = namedMethods(named) // allocates and sorts + m[named] = methods + } + return methods +} + +// scopeNames is a memoization of scope.Names. Callers must not modify the result. +func (enc *Encoder) scopeNames(scope *types.Scope) []string { + m := enc.scopeNamesMemo + if m == nil { + m = make(map[*types.Scope][]string) + enc.scopeNamesMemo = m + } + names, ok := m[scope] + if !ok { + names = scope.Names() // allocates and sorts + m[scope] = names + } + return names +} diff --git a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go index 0372fb3a64..a973dece93 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go @@ -7,6 +7,18 @@ // Package gcimporter provides various functions for reading // gc-generated object files that can be used to implement the // Importer interface defined by the Go 1.5 standard library package. +// +// The encoding is deterministic: if the encoder is applied twice to +// the same types.Package data structure, both encodings are equal. +// This property may be important to avoid spurious changes in +// applications such as build systems. +// +// However, the encoder is not necessarily idempotent. Importing an +// exported package may yield a types.Package that, while it +// represents the same set of Go types as the original, may differ in +// the details of its internal representation. Because of these +// differences, re-encoding the imported package may yield a +// different, but equally valid, encoding of the package. package gcimporter // import "golang.org/x/tools/internal/gcimporter" import ( diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go index ba53cdcdd1..a0dc0b5e27 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go @@ -44,12 +44,12 @@ func IExportShallow(fset *token.FileSet, pkg *types.Package) ([]byte, error) { return out.Bytes(), err } -// IImportShallow decodes "shallow" types.Package data encoded by IExportShallow -// in the same executable. This function cannot import data from +// IImportShallow decodes "shallow" types.Package data encoded by +// IExportShallow in the same executable. This function cannot import data from // cmd/compile or gcexportdata.Write. -func IImportShallow(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string, insert InsertType) (*types.Package, error) { +func IImportShallow(fset *token.FileSet, getPackage GetPackageFunc, data []byte, path string, insert InsertType) (*types.Package, error) { const bundle = false - pkgs, err := iimportCommon(fset, imports, data, bundle, path, insert) + pkgs, err := iimportCommon(fset, getPackage, data, bundle, path, insert) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go index 448f903e86..be6dace153 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go @@ -85,7 +85,7 @@ const ( // If the export data version is not recognized or the format is otherwise // compromised, an error is returned. func IImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (int, *types.Package, error) { - pkgs, err := iimportCommon(fset, imports, data, false, path, nil) + pkgs, err := iimportCommon(fset, GetPackageFromMap(imports), data, false, path, nil) if err != nil { return 0, nil, err } @@ -94,10 +94,33 @@ func IImportData(fset *token.FileSet, imports map[string]*types.Package, data [] // IImportBundle imports a set of packages from the serialized package bundle. func IImportBundle(fset *token.FileSet, imports map[string]*types.Package, data []byte) ([]*types.Package, error) { - return iimportCommon(fset, imports, data, true, "", nil) + return iimportCommon(fset, GetPackageFromMap(imports), data, true, "", nil) } -func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data []byte, bundle bool, path string, insert InsertType) (pkgs []*types.Package, err error) { +// A GetPackageFunc is a function that gets the package with the given path +// from the importer state, creating it (with the specified name) if necessary. +// It is an abstraction of the map historically used to memoize package creation. +// +// Two calls with the same path must return the same package. +// +// If the given getPackage func returns nil, the import will fail. +type GetPackageFunc = func(path, name string) *types.Package + +// GetPackageFromMap returns a GetPackageFunc that retrieves packages from the +// given map of package path -> package. +// +// The resulting func may mutate m: if a requested package is not found, a new +// package will be inserted into m. +func GetPackageFromMap(m map[string]*types.Package) GetPackageFunc { + return func(path, name string) *types.Package { + if _, ok := m[path]; !ok { + m[path] = types.NewPackage(path, name) + } + return m[path] + } +} + +func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, bundle bool, path string, insert InsertType) (pkgs []*types.Package, err error) { const currentVersion = iexportVersionCurrent version := int64(-1) if !debug { @@ -195,10 +218,9 @@ func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data if pkgPath == "" { pkgPath = path } - pkg := imports[pkgPath] + pkg := getPackage(pkgPath, pkgName) if pkg == nil { - pkg = types.NewPackage(pkgPath, pkgName) - imports[pkgPath] = pkg + errorf("internal error: getPackage returned nil package for %s", pkgPath) } else if pkg.Name() != pkgName { errorf("conflicting names %s and %s for package %q", pkg.Name(), pkgName, path) } diff --git a/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go b/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go index b285a11ce2..34fc783f82 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go @@ -12,6 +12,7 @@ package gcimporter import ( "go/token" "go/types" + "sort" "strings" "golang.org/x/tools/internal/pkgbits" @@ -121,6 +122,16 @@ func readUnifiedPackage(fset *token.FileSet, ctxt *types.Context, imports map[st iface.Complete() } + // Imports() of pkg are all of the transitive packages that were loaded. + var imps []*types.Package + for _, imp := range pr.pkgs { + if imp != nil && imp != pkg { + imps = append(imps, imp) + } + } + sort.Sort(byPath(imps)) + pkg.SetImports(imps) + pkg.MarkComplete() return pkg } @@ -260,39 +271,9 @@ func (r *reader) doPkg() *types.Package { pkg := types.NewPackage(path, name) r.p.imports[path] = pkg - imports := make([]*types.Package, r.Len()) - for i := range imports { - imports[i] = r.pkg() - } - pkg.SetImports(flattenImports(imports)) - return pkg } -// flattenImports returns the transitive closure of all imported -// packages rooted from pkgs. -func flattenImports(pkgs []*types.Package) []*types.Package { - var res []*types.Package - seen := make(map[*types.Package]struct{}) - for _, pkg := range pkgs { - if _, ok := seen[pkg]; ok { - continue - } - seen[pkg] = struct{}{} - res = append(res, pkg) - - // pkg.Imports() is already flattened. - for _, pkg := range pkg.Imports() { - if _, ok := seen[pkg]; ok { - continue - } - seen[pkg] = struct{}{} - res = append(res, pkg) - } - } - return res -} - // @@@ Types func (r *reader) typ() types.Type { diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go index d50551693f..3c0afe723b 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -8,10 +8,12 @@ package gocommand import ( "bytes" "context" + "errors" "fmt" "io" "log" "os" + "reflect" "regexp" "runtime" "strconv" @@ -215,6 +217,18 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error { cmd := exec.Command("go", goArgs...) cmd.Stdout = stdout cmd.Stderr = stderr + + // cmd.WaitDelay was added only in go1.20 (see #50436). + if waitDelay := reflect.ValueOf(cmd).Elem().FieldByName("WaitDelay"); waitDelay.IsValid() { + // https://go.dev/issue/59541: don't wait forever copying stderr + // after the command has exited. + // After CL 484741 we copy stdout manually, so we we'll stop reading that as + // soon as ctx is done. However, we also don't want to wait around forever + // for stderr. Give a much-longer-than-reasonable delay and then assume that + // something has wedged in the kernel or runtime. + waitDelay.Set(reflect.ValueOf(30 * time.Second)) + } + // On darwin the cwd gets resolved to the real path, which breaks anything that // expects the working directory to keep the original path, including the // go command when dealing with modules. @@ -229,6 +243,7 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error { cmd.Env = append(cmd.Env, "PWD="+i.WorkingDir) cmd.Dir = i.WorkingDir } + defer func(start time.Time) { log("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now()) return runCmdContext(ctx, cmd) @@ -242,10 +257,85 @@ var DebugHangingGoCommands = false // runCmdContext is like exec.CommandContext except it sends os.Interrupt // before os.Kill. -func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { - if err := cmd.Start(); err != nil { +func runCmdContext(ctx context.Context, cmd *exec.Cmd) (err error) { + // If cmd.Stdout is not an *os.File, the exec package will create a pipe and + // copy it to the Writer in a goroutine until the process has finished and + // either the pipe reaches EOF or command's WaitDelay expires. + // + // However, the output from 'go list' can be quite large, and we don't want to + // keep reading (and allocating buffers) if we've already decided we don't + // care about the output. We don't want to wait for the process to finish, and + // we don't wait to wait for the WaitDelay to expire either. + // + // Instead, if cmd.Stdout requires a copying goroutine we explicitly replace + // it with a pipe (which is an *os.File), which we can close in order to stop + // copying output as soon as we realize we don't care about it. + var stdoutW *os.File + if cmd.Stdout != nil { + if _, ok := cmd.Stdout.(*os.File); !ok { + var stdoutR *os.File + stdoutR, stdoutW, err = os.Pipe() + if err != nil { + return err + } + prevStdout := cmd.Stdout + cmd.Stdout = stdoutW + + stdoutErr := make(chan error, 1) + go func() { + _, err := io.Copy(prevStdout, stdoutR) + if err != nil { + err = fmt.Errorf("copying stdout: %w", err) + } + stdoutErr <- err + }() + defer func() { + // We started a goroutine to copy a stdout pipe. + // Wait for it to finish, or terminate it if need be. + var err2 error + select { + case err2 = <-stdoutErr: + stdoutR.Close() + case <-ctx.Done(): + stdoutR.Close() + // Per https://pkg.go.dev/os#File.Close, the call to stdoutR.Close + // should cause the Read call in io.Copy to unblock and return + // immediately, but we still need to receive from stdoutErr to confirm + // that that has happened. + <-stdoutErr + err2 = ctx.Err() + } + if err == nil { + err = err2 + } + }() + + // Per https://pkg.go.dev/os/exec#Cmd, “If Stdout and Stderr are the + // same writer, and have a type that can be compared with ==, at most + // one goroutine at a time will call Write.” + // + // Since we're starting a goroutine that writes to cmd.Stdout, we must + // also update cmd.Stderr so that that still holds. + func() { + defer func() { recover() }() + if cmd.Stderr == prevStdout { + cmd.Stderr = cmd.Stdout + } + }() + } + } + + err = cmd.Start() + if stdoutW != nil { + // The child process has inherited the pipe file, + // so close the copy held in this process. + stdoutW.Close() + stdoutW = nil + } + if err != nil { return err } + resChan := make(chan error, 1) go func() { resChan <- cmd.Wait() @@ -253,11 +343,14 @@ func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { // If we're interested in debugging hanging Go commands, stop waiting after a // minute and panic with interesting information. - if DebugHangingGoCommands { + debug := DebugHangingGoCommands + if debug { + timer := time.NewTimer(1 * time.Minute) + defer timer.Stop() select { case err := <-resChan: return err - case <-time.After(1 * time.Minute): + case <-timer.C: HandleHangingGoCommand(cmd.Process) case <-ctx.Done(): } @@ -270,30 +363,25 @@ func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { } // Cancelled. Interrupt and see if it ends voluntarily. - cmd.Process.Signal(os.Interrupt) - select { - case err := <-resChan: - return err - case <-time.After(time.Second): + if err := cmd.Process.Signal(os.Interrupt); err == nil { + // (We used to wait only 1s but this proved + // fragile on loaded builder machines.) + timer := time.NewTimer(5 * time.Second) + defer timer.Stop() + select { + case err := <-resChan: + return err + case <-timer.C: + } } // Didn't shut down in response to interrupt. Kill it hard. // TODO(rfindley): per advice from bcmills@, it may be better to send SIGQUIT // on certain platforms, such as unix. - if err := cmd.Process.Kill(); err != nil && DebugHangingGoCommands { - // Don't panic here as this reliably fails on windows with EINVAL. + if err := cmd.Process.Kill(); err != nil && !errors.Is(err, os.ErrProcessDone) && debug { log.Printf("error killing the Go command: %v", err) } - // See above: don't wait indefinitely if we're debugging hanging Go commands. - if DebugHangingGoCommands { - select { - case err := <-resChan: - return err - case <-time.After(10 * time.Second): // a shorter wait as resChan should return quickly following Kill - HandleHangingGoCommand(cmd.Process) - } - } return <-resChan } diff --git a/vendor/golang.org/x/tools/internal/gocommand/version.go b/vendor/golang.org/x/tools/internal/gocommand/version.go index 307a76d474..446c5846a6 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/version.go +++ b/vendor/golang.org/x/tools/internal/gocommand/version.go @@ -23,21 +23,11 @@ import ( func GoVersion(ctx context.Context, inv Invocation, r *Runner) (int, error) { inv.Verb = "list" inv.Args = []string{"-e", "-f", `{{context.ReleaseTags}}`, `--`, `unsafe`} - inv.Env = append(append([]string{}, inv.Env...), "GO111MODULE=off") - // Unset any unneeded flags, and remove them from BuildFlags, if they're - // present. - inv.ModFile = "" + inv.BuildFlags = nil // This is not a build command. inv.ModFlag = "" - var buildFlags []string - for _, flag := range inv.BuildFlags { - // Flags can be prefixed by one or two dashes. - f := strings.TrimPrefix(strings.TrimPrefix(flag, "-"), "-") - if strings.HasPrefix(f, "mod=") || strings.HasPrefix(f, "modfile=") { - continue - } - buildFlags = append(buildFlags, flag) - } - inv.BuildFlags = buildFlags + inv.ModFile = "" + inv.Env = append(inv.Env[:len(inv.Env):len(inv.Env)], "GO111MODULE=off") + stdoutBytes, err := r.Run(ctx, inv) if err != nil { return 0, err diff --git a/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go b/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go index a3fb2d4f29..7e638ec24f 100644 --- a/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go +++ b/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go @@ -7,7 +7,9 @@ package tokeninternal import ( + "fmt" "go/token" + "sort" "sync" "unsafe" ) @@ -57,3 +59,93 @@ func GetLines(file *token.File) []int { panic("unexpected token.File size") } } + +// AddExistingFiles adds the specified files to the FileSet if they +// are not already present. It panics if any pair of files in the +// resulting FileSet would overlap. +func AddExistingFiles(fset *token.FileSet, files []*token.File) { + // Punch through the FileSet encapsulation. + type tokenFileSet struct { + // This type remained essentially consistent from go1.16 to go1.21. + mutex sync.RWMutex + base int + files []*token.File + _ *token.File // changed to atomic.Pointer[token.File] in go1.19 + } + + // If the size of token.FileSet changes, this will fail to compile. + const delta = int64(unsafe.Sizeof(tokenFileSet{})) - int64(unsafe.Sizeof(token.FileSet{})) + var _ [-delta * delta]int + + type uP = unsafe.Pointer + var ptr *tokenFileSet + *(*uP)(uP(&ptr)) = uP(fset) + ptr.mutex.Lock() + defer ptr.mutex.Unlock() + + // Merge and sort. + newFiles := append(ptr.files, files...) + sort.Slice(newFiles, func(i, j int) bool { + return newFiles[i].Base() < newFiles[j].Base() + }) + + // Reject overlapping files. + // Discard adjacent identical files. + out := newFiles[:0] + for i, file := range newFiles { + if i > 0 { + prev := newFiles[i-1] + if file == prev { + continue + } + if prev.Base()+prev.Size()+1 > file.Base() { + panic(fmt.Sprintf("file %s (%d-%d) overlaps with file %s (%d-%d)", + prev.Name(), prev.Base(), prev.Base()+prev.Size(), + file.Name(), file.Base(), file.Base()+file.Size())) + } + } + out = append(out, file) + } + newFiles = out + + ptr.files = newFiles + + // Advance FileSet.Base(). + if len(newFiles) > 0 { + last := newFiles[len(newFiles)-1] + newBase := last.Base() + last.Size() + 1 + if ptr.base < newBase { + ptr.base = newBase + } + } +} + +// FileSetFor returns a new FileSet containing a sequence of new Files with +// the same base, size, and line as the input files, for use in APIs that +// require a FileSet. +// +// Precondition: the input files must be non-overlapping, and sorted in order +// of their Base. +func FileSetFor(files ...*token.File) *token.FileSet { + fset := token.NewFileSet() + for _, f := range files { + f2 := fset.AddFile(f.Name(), f.Base(), f.Size()) + lines := GetLines(f) + f2.SetLines(lines) + } + return fset +} + +// CloneFileSet creates a new FileSet holding all files in fset. It does not +// create copies of the token.Files in fset: they are added to the resulting +// FileSet unmodified. +func CloneFileSet(fset *token.FileSet) *token.FileSet { + var files []*token.File + fset.Iterate(func(f *token.File) bool { + files = append(files, f) + return true + }) + newFileSet := token.NewFileSet() + AddExistingFiles(newFileSet, files) + return newFileSet +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/common.go b/vendor/golang.org/x/tools/internal/typeparams/common.go index 25a1426d30..cfba8189f1 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/common.go +++ b/vendor/golang.org/x/tools/internal/typeparams/common.go @@ -87,7 +87,6 @@ func IsTypeParam(t types.Type) bool { func OriginMethod(fn *types.Func) *types.Func { recv := fn.Type().(*types.Signature).Recv() if recv == nil { - return fn } base := recv.Type() diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go index ce7d4351b2..3c53fbc63b 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -11,6 +11,8 @@ import ( "go/types" "reflect" "unsafe" + + "golang.org/x/tools/go/types/objectpath" ) func SetUsesCgo(conf *types.Config) bool { @@ -50,3 +52,10 @@ func ReadGo116ErrorData(err types.Error) (code ErrorCode, start, end token.Pos, } var SetGoVersion = func(conf *types.Config, version string) bool { return false } + +// NewObjectpathEncoder returns a function closure equivalent to +// objectpath.For but amortized for multiple (sequential) calls. +// It is a temporary workaround, pending the approval of proposal 58668. +// +//go:linkname NewObjectpathFunc golang.org/x/tools/go/types/objectpath.newEncoderFor +func NewObjectpathFunc() func(types.Object) (objectpath.Path, error) diff --git a/vendor/google.golang.org/genproto/googleapis/api/LICENSE b/vendor/google.golang.org/genproto/googleapis/api/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/api/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/api/httpbody/httpbody.pb.go b/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go index af72196c80..3543268f84 100644 --- a/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go @@ -1,4 +1,4 @@ -// Copyright 2015 Google LLC +// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.12.2 +// protoc v3.21.9 // source: google/api/httpbody.proto package httpbody diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/LICENSE b/vendor/google.golang.org/genproto/googleapis/rpc/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/rpc/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/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md index 52338d004c..608aa6e1ac 100644 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -20,6 +20,15 @@ How to get your contributions merged smoothly and quickly. both author's & review's time is wasted. Create more PRs to address different concerns and everyone will be happy. +- If you are searching for features to work on, issues labeled [Status: Help + Wanted](https://github.com/grpc/grpc-go/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Status%3A+Help+Wanted%22) + is a great place to start. These issues are well-documented and usually can be + resolved with a single pull request. + +- If you are adding a new file, make sure it has the copyright message template + at the top as a comment. You can copy over the message from an existing file + and update the year. + - The grpc package should only depend on standard Go packages and a small number of exceptions. If your contribution introduces new dependencies which are NOT in the [list](https://godoc.org/google.golang.org/grpc?imports), you need a @@ -32,14 +41,18 @@ How to get your contributions merged smoothly and quickly. - 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. +- If you want to fix formatting or style, consider whether your changes are an + obvious improvement or might be considered a personal preference. If a style + change is based on preference, it likely will not be accepted. If it corrects + widely agreed-upon anti-patterns, then please do create a PR and explain the + benefits of the change. - 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. + that you'll need to address before merging. We'll mark it as `Status: Requires + Reporter Clarification` if we expect you to respond to these comments in a + timely manner. If the PR remains inactive for 6 days, it will be marked as + `stale` and automatically close 7 days after that if we don't hear back from + you. - Maintain **clean commit history** and use **meaningful commit messages**. PRs with messy commit history are difficult to review and won't be merged. Use diff --git a/vendor/google.golang.org/grpc/attributes/attributes.go b/vendor/google.golang.org/grpc/attributes/attributes.go index 02f5dc5318..3efca45914 100644 --- a/vendor/google.golang.org/grpc/attributes/attributes.go +++ b/vendor/google.golang.org/grpc/attributes/attributes.go @@ -25,6 +25,11 @@ // later release. package attributes +import ( + "fmt" + "strings" +) + // Attributes is an immutable struct for storing and retrieving generic // key/value pairs. Keys must be hashable, and users should define their own // types for keys. Values should not be modified after they are added to an @@ -99,3 +104,27 @@ func (a *Attributes) Equal(o *Attributes) bool { } return true } + +// String prints the attribute map. If any key or values throughout the map +// implement fmt.Stringer, it calls that method and appends. +func (a *Attributes) String() string { + var sb strings.Builder + sb.WriteString("{") + first := true + for k, v := range a.m { + var key, val string + if str, ok := k.(interface{ String() string }); ok { + key = str.String() + } + if str, ok := v.(interface{ String() string }); ok { + val = str.String() + } + if !first { + sb.WriteString(", ") + } + sb.WriteString(fmt.Sprintf("%q: %q, ", key, val)) + first = false + } + sb.WriteString("}") + return sb.String() +} diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go index 392b21fb2d..8f00523c0e 100644 --- a/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -279,6 +279,14 @@ type PickResult struct { // type, Done may not be called. May be nil if the balancer does not wish // to be notified when the RPC completes. Done func(DoneInfo) + + // Metadata provides a way for LB policies to inject arbitrary per-call + // metadata. Any metadata returned here will be merged with existing + // metadata added by the client application. + // + // LB policies with child policies are responsible for propagating metadata + // injected by their children to the ClientConn, as part of Pick(). + Metadata metadata.MD } // TransientFailureError returns e. It exists for backward compatibility and diff --git a/vendor/google.golang.org/grpc/balancer_conn_wrappers.go b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go index 0359956d36..04b9ad4116 100644 --- a/vendor/google.golang.org/grpc/balancer_conn_wrappers.go +++ b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go @@ -25,14 +25,20 @@ import ( "sync" "google.golang.org/grpc/balancer" - "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/internal/balancer/gracefulswitch" - "google.golang.org/grpc/internal/buffer" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/resolver" - "google.golang.org/grpc/status" +) + +type ccbMode int + +const ( + ccbModeActive = iota + ccbModeIdle + ccbModeClosed + ccbModeExitingIdle ) // ccBalancerWrapper sits between the ClientConn and the Balancer. @@ -49,192 +55,101 @@ import ( // It uses the gracefulswitch.Balancer internally to ensure that balancer // switches happen in a graceful manner. type ccBalancerWrapper struct { - cc *ClientConn - - // Since these fields are accessed only from handleXxx() methods which are - // synchronized by the watcher goroutine, we do not need a mutex to protect - // these fields. + // The following fields are initialized when the wrapper is created and are + // read-only afterwards, and therefore can be accessed without a mutex. + cc *ClientConn + opts balancer.BuildOptions + + // Outgoing (gRPC --> balancer) calls are guaranteed to execute in a + // mutually exclusive manner as they are scheduled in the serializer. Fields + // accessed *only* in these serializer callbacks, can therefore be accessed + // without a mutex. balancer *gracefulswitch.Balancer curBalancerName string - updateCh *buffer.Unbounded // Updates written on this channel are processed by watcher(). - resultCh *buffer.Unbounded // Results of calls to UpdateClientConnState() are pushed here. - closed *grpcsync.Event // Indicates if close has been called. - done *grpcsync.Event // Indicates if close has completed its work. + // mu guards access to the below fields. Access to the serializer and its + // cancel function needs to be mutex protected because they are overwritten + // when the wrapper exits idle mode. + mu sync.Mutex + serializer *grpcsync.CallbackSerializer // To serialize all outoing calls. + serializerCancel context.CancelFunc // To close the seralizer at close/enterIdle time. + mode ccbMode // Tracks the current mode of the wrapper. } // newCCBalancerWrapper creates a new balancer wrapper. The underlying balancer // is not created until the switchTo() method is invoked. func newCCBalancerWrapper(cc *ClientConn, bopts balancer.BuildOptions) *ccBalancerWrapper { + ctx, cancel := context.WithCancel(context.Background()) ccb := &ccBalancerWrapper{ - cc: cc, - updateCh: buffer.NewUnbounded(), - resultCh: buffer.NewUnbounded(), - closed: grpcsync.NewEvent(), - done: grpcsync.NewEvent(), + cc: cc, + opts: bopts, + serializer: grpcsync.NewCallbackSerializer(ctx), + serializerCancel: cancel, } - go ccb.watcher() ccb.balancer = gracefulswitch.NewBalancer(ccb, bopts) return ccb } -// The following xxxUpdate structs wrap the arguments received as part of the -// corresponding update. The watcher goroutine uses the 'type' of the update to -// invoke the appropriate handler routine to handle the update. - -type ccStateUpdate struct { - ccs *balancer.ClientConnState -} - -type scStateUpdate struct { - sc balancer.SubConn - state connectivity.State - err error -} - -type exitIdleUpdate struct{} - -type resolverErrorUpdate struct { - err error -} - -type switchToUpdate struct { - name string -} - -type subConnUpdate struct { - acbw *acBalancerWrapper -} - -// watcher is a long-running goroutine which reads updates from a channel and -// invokes corresponding methods on the underlying balancer. It ensures that -// these methods are invoked in a synchronous fashion. It also ensures that -// these methods are invoked in the order in which the updates were received. -func (ccb *ccBalancerWrapper) watcher() { - for { - select { - case u := <-ccb.updateCh.Get(): - ccb.updateCh.Load() - if ccb.closed.HasFired() { - break - } - switch update := u.(type) { - case *ccStateUpdate: - ccb.handleClientConnStateChange(update.ccs) - case *scStateUpdate: - ccb.handleSubConnStateChange(update) - case *exitIdleUpdate: - ccb.handleExitIdle() - case *resolverErrorUpdate: - ccb.handleResolverError(update.err) - case *switchToUpdate: - ccb.handleSwitchTo(update.name) - case *subConnUpdate: - ccb.handleRemoveSubConn(update.acbw) - default: - logger.Errorf("ccBalancerWrapper.watcher: unknown update %+v, type %T", update, update) - } - case <-ccb.closed.Done(): - } - - if ccb.closed.HasFired() { - ccb.handleClose() - return - } - } -} - // updateClientConnState is invoked by grpc to push a ClientConnState update to // the underlying balancer. -// -// Unlike other methods invoked by grpc to push updates to the underlying -// balancer, this method cannot simply push the update onto the update channel -// and return. It needs to return the error returned by the underlying balancer -// back to grpc which propagates that to the resolver. func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error { - ccb.updateCh.Put(&ccStateUpdate{ccs: ccs}) - - var res interface{} - select { - case res = <-ccb.resultCh.Get(): - ccb.resultCh.Load() - case <-ccb.closed.Done(): - // Return early if the balancer wrapper is closed while we are waiting for - // the underlying balancer to process a ClientConnState update. - return nil - } - // If the returned error is nil, attempting to type assert to error leads to - // panic. So, this needs to handled separately. - if res == nil { - return nil - } - return res.(error) -} - -// handleClientConnStateChange handles a ClientConnState update from the update -// channel and invokes the appropriate method on the underlying balancer. -// -// If the addresses specified in the update contain addresses of type "grpclb" -// and the selected LB policy is not "grpclb", these addresses will be filtered -// out and ccs will be modified with the updated address list. -func (ccb *ccBalancerWrapper) handleClientConnStateChange(ccs *balancer.ClientConnState) { - if ccb.curBalancerName != grpclbName { - // Filter any grpclb addresses since we don't have the grpclb balancer. - var addrs []resolver.Address - for _, addr := range ccs.ResolverState.Addresses { - if addr.Type == resolver.GRPCLB { - continue + ccb.mu.Lock() + errCh := make(chan error, 1) + // Here and everywhere else where Schedule() is called, it is done with the + // lock held. But the lock guards only the scheduling part. The actual + // callback is called asynchronously without the lock being held. + ok := ccb.serializer.Schedule(func(_ context.Context) { + // If the addresses specified in the update contain addresses of type + // "grpclb" and the selected LB policy is not "grpclb", these addresses + // will be filtered out and ccs will be modified with the updated + // address list. + if ccb.curBalancerName != grpclbName { + var addrs []resolver.Address + for _, addr := range ccs.ResolverState.Addresses { + if addr.Type == resolver.GRPCLB { + continue + } + addrs = append(addrs, addr) } - addrs = append(addrs, addr) + ccs.ResolverState.Addresses = addrs } - ccs.ResolverState.Addresses = addrs + errCh <- ccb.balancer.UpdateClientConnState(*ccs) + }) + if !ok { + // If we are unable to schedule a function with the serializer, it + // indicates that it has been closed. A serializer is only closed when + // the wrapper is closed or is in idle. + ccb.mu.Unlock() + return fmt.Errorf("grpc: cannot send state update to a closed or idle balancer") } - ccb.resultCh.Put(ccb.balancer.UpdateClientConnState(*ccs)) + ccb.mu.Unlock() + + // We get here only if the above call to Schedule succeeds, in which case it + // is guaranteed that the scheduled function will run. Therefore it is safe + // to block on this channel. + err := <-errCh + if logger.V(2) && err != nil { + logger.Infof("error from balancer.UpdateClientConnState: %v", err) + } + return err } // updateSubConnState is invoked by grpc to push a subConn state update to the // underlying balancer. func (ccb *ccBalancerWrapper) updateSubConnState(sc balancer.SubConn, s connectivity.State, err error) { - // When updating addresses for a SubConn, if the address in use is not in - // the new addresses, the old ac will be tearDown() and a new ac will be - // created. tearDown() generates a state change with Shutdown state, we - // don't want the balancer to receive this state change. So before - // tearDown() on the old ac, ac.acbw (acWrapper) will be set to nil, and - // this function will be called with (nil, Shutdown). We don't need to call - // balancer method in this case. - if sc == nil { - return - } - ccb.updateCh.Put(&scStateUpdate{ - sc: sc, - state: s, - err: err, + ccb.mu.Lock() + ccb.serializer.Schedule(func(_ context.Context) { + ccb.balancer.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: s, ConnectionError: err}) }) -} - -// handleSubConnStateChange handles a SubConnState update from the update -// channel and invokes the appropriate method on the underlying balancer. -func (ccb *ccBalancerWrapper) handleSubConnStateChange(update *scStateUpdate) { - ccb.balancer.UpdateSubConnState(update.sc, balancer.SubConnState{ConnectivityState: update.state, ConnectionError: update.err}) -} - -func (ccb *ccBalancerWrapper) exitIdle() { - ccb.updateCh.Put(&exitIdleUpdate{}) -} - -func (ccb *ccBalancerWrapper) handleExitIdle() { - if ccb.cc.GetState() != connectivity.Idle { - return - } - ccb.balancer.ExitIdle() + ccb.mu.Unlock() } func (ccb *ccBalancerWrapper) resolverError(err error) { - ccb.updateCh.Put(&resolverErrorUpdate{err: err}) -} - -func (ccb *ccBalancerWrapper) handleResolverError(err error) { - ccb.balancer.ResolverError(err) + ccb.mu.Lock() + ccb.serializer.Schedule(func(_ context.Context) { + ccb.balancer.ResolverError(err) + }) + ccb.mu.Unlock() } // switchTo is invoked by grpc to instruct the balancer wrapper to switch to the @@ -248,24 +163,27 @@ func (ccb *ccBalancerWrapper) handleResolverError(err error) { // the ccBalancerWrapper keeps track of the current LB policy name, and skips // the graceful balancer switching process if the name does not change. func (ccb *ccBalancerWrapper) switchTo(name string) { - ccb.updateCh.Put(&switchToUpdate{name: name}) + ccb.mu.Lock() + ccb.serializer.Schedule(func(_ context.Context) { + // TODO: Other languages use case-sensitive balancer registries. We should + // switch as well. See: https://github.com/grpc/grpc-go/issues/5288. + if strings.EqualFold(ccb.curBalancerName, name) { + return + } + ccb.buildLoadBalancingPolicy(name) + }) + ccb.mu.Unlock() } -// handleSwitchTo handles a balancer switch update from the update channel. It -// calls the SwitchTo() method on the gracefulswitch.Balancer with a -// balancer.Builder corresponding to name. If no balancer.Builder is registered -// for the given name, it uses the default LB policy which is "pick_first". -func (ccb *ccBalancerWrapper) handleSwitchTo(name string) { - // TODO: Other languages use case-insensitive balancer registries. We should - // switch as well. See: https://github.com/grpc/grpc-go/issues/5288. - if strings.EqualFold(ccb.curBalancerName, name) { - return - } - - // TODO: Ensure that name is a registered LB policy when we get here. - // We currently only validate the `loadBalancingConfig` field. We need to do - // the same for the `loadBalancingPolicy` field and reject the service config - // if the specified policy is not registered. +// buildLoadBalancingPolicy performs the following: +// - retrieve a balancer builder for the given name. Use the default LB +// policy, pick_first, if no LB policy with name is found in the registry. +// - instruct the gracefulswitch balancer to switch to the above builder. This +// will actually build the new balancer. +// - update the `curBalancerName` field +// +// Must be called from a serializer callback. +func (ccb *ccBalancerWrapper) buildLoadBalancingPolicy(name string) { builder := balancer.Get(name) if builder == nil { channelz.Warningf(logger, ccb.cc.channelzID, "Channel switches to new LB policy %q, since the specified LB policy %q was not registered", PickFirstBalancerName, name) @@ -281,26 +199,114 @@ func (ccb *ccBalancerWrapper) handleSwitchTo(name string) { ccb.curBalancerName = builder.Name() } -// handleRemoveSucConn handles a request from the underlying balancer to remove -// a subConn. -// -// See comments in RemoveSubConn() for more details. -func (ccb *ccBalancerWrapper) handleRemoveSubConn(acbw *acBalancerWrapper) { - ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain) +func (ccb *ccBalancerWrapper) close() { + channelz.Info(logger, ccb.cc.channelzID, "ccBalancerWrapper: closing") + ccb.closeBalancer(ccbModeClosed) } -func (ccb *ccBalancerWrapper) close() { - ccb.closed.Fire() - <-ccb.done.Done() +// enterIdleMode is invoked by grpc when the channel enters idle mode upon +// expiry of idle_timeout. This call blocks until the balancer is closed. +func (ccb *ccBalancerWrapper) enterIdleMode() { + channelz.Info(logger, ccb.cc.channelzID, "ccBalancerWrapper: entering idle mode") + ccb.closeBalancer(ccbModeIdle) +} + +// closeBalancer is invoked when the channel is being closed or when it enters +// idle mode upon expiry of idle_timeout. +func (ccb *ccBalancerWrapper) closeBalancer(m ccbMode) { + ccb.mu.Lock() + if ccb.mode == ccbModeClosed || ccb.mode == ccbModeIdle { + ccb.mu.Unlock() + return + } + + ccb.mode = m + done := ccb.serializer.Done + b := ccb.balancer + ok := ccb.serializer.Schedule(func(_ context.Context) { + // Close the serializer to ensure that no more calls from gRPC are sent + // to the balancer. + ccb.serializerCancel() + // Empty the current balancer name because we don't have a balancer + // anymore and also so that we act on the next call to switchTo by + // creating a new balancer specified by the new resolver. + ccb.curBalancerName = "" + }) + if !ok { + ccb.mu.Unlock() + return + } + ccb.mu.Unlock() + + // Give enqueued callbacks a chance to finish. + <-done + // Spawn a goroutine to close the balancer (since it may block trying to + // cleanup all allocated resources) and return early. + go b.Close() } -func (ccb *ccBalancerWrapper) handleClose() { - ccb.balancer.Close() - ccb.done.Fire() +// exitIdleMode is invoked by grpc when the channel exits idle mode either +// because of an RPC or because of an invocation of the Connect() API. This +// recreates the balancer that was closed previously when entering idle mode. +// +// If the channel is not in idle mode, we know for a fact that we are here as a +// result of the user calling the Connect() method on the ClientConn. In this +// case, we can simply forward the call to the underlying balancer, instructing +// it to reconnect to the backends. +func (ccb *ccBalancerWrapper) exitIdleMode() { + ccb.mu.Lock() + if ccb.mode == ccbModeClosed { + // Request to exit idle is a no-op when wrapper is already closed. + ccb.mu.Unlock() + return + } + + if ccb.mode == ccbModeIdle { + // Recreate the serializer which was closed when we entered idle. + ctx, cancel := context.WithCancel(context.Background()) + ccb.serializer = grpcsync.NewCallbackSerializer(ctx) + ccb.serializerCancel = cancel + } + + // The ClientConn guarantees that mutual exclusion between close() and + // exitIdleMode(), and since we just created a new serializer, we can be + // sure that the below function will be scheduled. + done := make(chan struct{}) + ccb.serializer.Schedule(func(_ context.Context) { + defer close(done) + + ccb.mu.Lock() + defer ccb.mu.Unlock() + + if ccb.mode != ccbModeIdle { + ccb.balancer.ExitIdle() + return + } + + // Gracefulswitch balancer does not support a switchTo operation after + // being closed. Hence we need to create a new one here. + ccb.balancer = gracefulswitch.NewBalancer(ccb, ccb.opts) + ccb.mode = ccbModeActive + channelz.Info(logger, ccb.cc.channelzID, "ccBalancerWrapper: exiting idle mode") + + }) + ccb.mu.Unlock() + + <-done +} + +func (ccb *ccBalancerWrapper) isIdleOrClosed() bool { + ccb.mu.Lock() + defer ccb.mu.Unlock() + return ccb.mode == ccbModeIdle || ccb.mode == ccbModeClosed } func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) { - if len(addrs) <= 0 { + if ccb.isIdleOrClosed() { + return nil, fmt.Errorf("grpc: cannot create SubConn when balancer is closed or idle") + } + + if len(addrs) == 0 { return nil, fmt.Errorf("grpc: cannot create SubConn with empty address list") } ac, err := ccb.cc.newAddrConn(addrs, opts) @@ -309,31 +315,35 @@ func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer return nil, err } acbw := &acBalancerWrapper{ac: ac, producers: make(map[balancer.ProducerBuilder]*refCountedProducer)} - acbw.ac.mu.Lock() ac.acbw = acbw - acbw.ac.mu.Unlock() return acbw, nil } func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) { - // Before we switched the ccBalancerWrapper to use gracefulswitch.Balancer, it - // was required to handle the RemoveSubConn() method asynchronously by pushing - // the update onto the update channel. This was done to avoid a deadlock as - // switchBalancer() was holding cc.mu when calling Close() on the old - // balancer, which would in turn call RemoveSubConn(). - // - // With the use of gracefulswitch.Balancer in ccBalancerWrapper, handling this - // asynchronously is probably not required anymore since the switchTo() method - // handles the balancer switch by pushing the update onto the channel. - // TODO(easwars): Handle this inline. + if ccb.isIdleOrClosed() { + // It it safe to ignore this call when the balancer is closed or in idle + // because the ClientConn takes care of closing the connections. + // + // Not returning early from here when the balancer is closed or in idle + // leads to a deadlock though, because of the following sequence of + // calls when holding cc.mu: + // cc.exitIdleMode --> ccb.enterIdleMode --> gsw.Close --> + // ccb.RemoveAddrConn --> cc.removeAddrConn + return + } + acbw, ok := sc.(*acBalancerWrapper) if !ok { return } - ccb.updateCh.Put(&subConnUpdate{acbw: acbw}) + ccb.cc.removeAddrConn(acbw.ac, errConnDrain) } func (ccb *ccBalancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resolver.Address) { + if ccb.isIdleOrClosed() { + return + } + acbw, ok := sc.(*acBalancerWrapper) if !ok { return @@ -342,6 +352,10 @@ func (ccb *ccBalancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resol } func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { + if ccb.isIdleOrClosed() { + return + } + // Update picker before updating state. Even though the ordering here does // not matter, it can lead to multiple calls of Pick in the common start-up // case where we wait for ready and then perform an RPC. If the picker is @@ -352,6 +366,10 @@ func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { } func (ccb *ccBalancerWrapper) ResolveNow(o resolver.ResolveNowOptions) { + if ccb.isIdleOrClosed() { + return + } + ccb.cc.resolveNow(o) } @@ -362,71 +380,31 @@ func (ccb *ccBalancerWrapper) Target() string { // acBalancerWrapper is a wrapper on top of ac for balancers. // It implements balancer.SubConn interface. type acBalancerWrapper struct { + ac *addrConn // read-only + mu sync.Mutex - ac *addrConn producers map[balancer.ProducerBuilder]*refCountedProducer } -func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) { - acbw.mu.Lock() - defer acbw.mu.Unlock() - if len(addrs) <= 0 { - acbw.ac.cc.removeAddrConn(acbw.ac, errConnDrain) - return - } - if !acbw.ac.tryUpdateAddrs(addrs) { - cc := acbw.ac.cc - opts := acbw.ac.scopts - acbw.ac.mu.Lock() - // Set old ac.acbw to nil so the Shutdown state update will be ignored - // by balancer. - // - // TODO(bar) the state transition could be wrong when tearDown() old ac - // and creating new ac, fix the transition. - acbw.ac.acbw = nil - acbw.ac.mu.Unlock() - acState := acbw.ac.getState() - acbw.ac.cc.removeAddrConn(acbw.ac, errConnDrain) - - if acState == connectivity.Shutdown { - return - } +func (acbw *acBalancerWrapper) String() string { + return fmt.Sprintf("SubConn(id:%d)", acbw.ac.channelzID.Int()) +} - newAC, err := cc.newAddrConn(addrs, opts) - if err != nil { - channelz.Warningf(logger, acbw.ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err) - return - } - acbw.ac = newAC - newAC.mu.Lock() - newAC.acbw = acbw - newAC.mu.Unlock() - if acState != connectivity.Idle { - go newAC.connect() - } - } +func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) { + acbw.ac.updateAddrs(addrs) } func (acbw *acBalancerWrapper) Connect() { - acbw.mu.Lock() - defer acbw.mu.Unlock() go acbw.ac.connect() } -func (acbw *acBalancerWrapper) getAddrConn() *addrConn { - acbw.mu.Lock() - defer acbw.mu.Unlock() - return acbw.ac -} - -var errSubConnNotReady = status.Error(codes.Unavailable, "SubConn not currently connected") - // NewStream begins a streaming RPC on the addrConn. If the addrConn is not -// ready, returns errSubConnNotReady. +// ready, blocks until it is or ctx expires. Returns an error when the context +// expires or the addrConn is shut down. func (acbw *acBalancerWrapper) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { - transport := acbw.ac.getReadyTransport() - if transport == nil { - return nil, errSubConnNotReady + transport, err := acbw.ac.getTransport(ctx) + if err != nil { + return nil, err } return newNonRetryClientStream(ctx, desc, method, transport, acbw.ac, opts...) } diff --git a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go index 66d141fce7..ec2c2fa14d 100644 --- a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go +++ b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go @@ -18,8 +18,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.14.0 +// protoc-gen-go v1.30.0 +// protoc v4.22.0 // source: grpc/binlog/v1/binarylog.proto package grpc_binarylog_v1 diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go index 9e20e4d385..e6a1dc5d75 100644 --- a/vendor/google.golang.org/grpc/call.go +++ b/vendor/google.golang.org/grpc/call.go @@ -27,6 +27,11 @@ import ( // // All errors returned by Invoke are compatible with the status package. func (cc *ClientConn) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...CallOption) error { + if err := cc.idlenessMgr.onCallBegin(); err != nil { + return err + } + defer cc.idlenessMgr.onCallEnd() + // allow interceptor to see all applicable call options, which means those // configured as defaults from dial option as well as per-call options opts = combine(cc.dopts.callOptions, opts) diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index 0456689045..95a7459b02 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -24,7 +24,6 @@ import ( "fmt" "math" "net/url" - "reflect" "strings" "sync" "sync/atomic" @@ -69,6 +68,9 @@ var ( errConnDrain = errors.New("grpc: the connection is drained") // errConnClosing indicates that the connection is closing. errConnClosing = errors.New("grpc: the connection is closing") + // errConnIdling indicates the the connection is being closed as the channel + // is moving to an idle mode due to inactivity. + errConnIdling = errors.New("grpc: the connection is closing due to channel idleness") // invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default // service config. invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid" @@ -134,20 +136,42 @@ func (dcs *defaultConfigSelector) SelectConfig(rpcInfo iresolver.RPCInfo) (*ires // e.g. to use dns resolver, a "dns:///" prefix should be applied to the target. func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { cc := &ClientConn{ - target: target, - csMgr: &connectivityStateManager{}, - conns: make(map[*addrConn]struct{}), - dopts: defaultDialOptions(), - blockingpicker: newPickerWrapper(), - czData: new(channelzData), - firstResolveEvent: grpcsync.NewEvent(), - } + target: target, + csMgr: &connectivityStateManager{}, + conns: make(map[*addrConn]struct{}), + dopts: defaultDialOptions(), + czData: new(channelzData), + } + + // We start the channel off in idle mode, but kick it out of idle at the end + // of this method, instead of waiting for the first RPC. Other gRPC + // implementations do wait for the first RPC to kick the channel out of + // idle. But doing so would be a major behavior change for our users who are + // used to seeing the channel active after Dial. + // + // Taking this approach of kicking it out of idle at the end of this method + // allows us to share the code between channel creation and exiting idle + // mode. This will also make it easy for us to switch to starting the + // channel off in idle, if at all we ever get to do that. + cc.idlenessState = ccIdlenessStateIdle + cc.retryThrottler.Store((*retryThrottler)(nil)) cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{nil}) cc.ctx, cc.cancel = context.WithCancel(context.Background()) + cc.exitIdleCond = sync.NewCond(&cc.mu) - for _, opt := range extraDialOptions { - opt.apply(&cc.dopts) + disableGlobalOpts := false + for _, opt := range opts { + if _, ok := opt.(*disableGlobalDialOptions); ok { + disableGlobalOpts = true + break + } + } + + if !disableGlobalOpts { + for _, opt := range globalDialOptions { + opt.apply(&cc.dopts) + } } for _, opt := range opts { @@ -163,40 +187,11 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * } }() - pid := cc.dopts.channelzParentID - cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, pid, target) - ted := &channelz.TraceEventDesc{ - Desc: "Channel created", - Severity: channelz.CtInfo, - } - if cc.dopts.channelzParentID != nil { - ted.Parent = &channelz.TraceEventDesc{ - Desc: fmt.Sprintf("Nested Channel(id:%d) created", cc.channelzID.Int()), - Severity: channelz.CtInfo, - } - } - channelz.AddTraceEvent(logger, cc.channelzID, 1, ted) - cc.csMgr.channelzID = cc.channelzID + // Register ClientConn with channelz. + cc.channelzRegistration(target) - if cc.dopts.copts.TransportCredentials == nil && cc.dopts.copts.CredsBundle == nil { - return nil, errNoTransportSecurity - } - if cc.dopts.copts.TransportCredentials != nil && cc.dopts.copts.CredsBundle != nil { - return nil, errTransportCredsAndBundle - } - if cc.dopts.copts.CredsBundle != nil && cc.dopts.copts.CredsBundle.TransportCredentials() == nil { - return nil, errNoTransportCredsInBundle - } - transportCreds := cc.dopts.copts.TransportCredentials - if transportCreds == nil { - transportCreds = cc.dopts.copts.CredsBundle.TransportCredentials() - } - if transportCreds.Info().SecurityProtocol == "insecure" { - for _, cd := range cc.dopts.copts.PerRPCCredentials { - if cd.RequireTransportSecurity() { - return nil, errTransportCredentialsMissing - } - } + if err := cc.validateTransportCredentials(); err != nil { + return nil, err } if cc.dopts.defaultServiceConfigRawJSON != nil { @@ -234,35 +229,19 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * } }() - 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 - cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{&sc}) - scSet = true - } - default: - } - } if cc.dopts.bs == nil { cc.dopts.bs = backoff.DefaultExponential } // Determine the resolver to use. - resolverBuilder, err := cc.parseTargetAndFindResolver() - if err != nil { + if err := cc.parseTargetAndFindResolver(); err != nil { return nil, err } - cc.authority, err = determineAuthority(cc.parsedTarget.Endpoint, cc.target, cc.dopts) - if err != nil { + if err = cc.determineAuthority(); err != nil { return nil, err } - channelz.Infof(logger, cc.channelzID, "Channel authority set to %q", cc.authority) - if cc.dopts.scChan != nil && !scSet { + if cc.dopts.scChan != nil { // Blocking wait for the initial service config. select { case sc, ok := <-cc.dopts.scChan: @@ -278,57 +257,224 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * go cc.scWatcher() } + // This creates the name resolver, load balancer, blocking picker etc. + if err := cc.exitIdleMode(); err != nil { + return nil, err + } + + // Configure idleness support with configured idle timeout or default idle + // timeout duration. Idleness can be explicitly disabled by the user, by + // setting the dial option to 0. + cc.idlenessMgr = newIdlenessManager(cc, cc.dopts.idleTimeout) + + // Return early for non-blocking dials. + if !cc.dopts.block { + return cc, nil + } + + // A blocking dial blocks until the clientConn is ready. + for { + s := cc.GetState() + if s == connectivity.Idle { + cc.Connect() + } + if s == connectivity.Ready { + return cc, nil + } else if cc.dopts.copts.FailOnNonTempDialError && s == connectivity.TransientFailure { + if err = cc.connectionError(); err != nil { + terr, ok := err.(interface { + Temporary() bool + }) + if ok && !terr.Temporary() { + return nil, err + } + } + } + if !cc.WaitForStateChange(ctx, s) { + // ctx got timeout or canceled. + if err = cc.connectionError(); err != nil && cc.dopts.returnLastError { + return nil, err + } + return nil, ctx.Err() + } + } +} + +// addTraceEvent is a helper method to add a trace event on the channel. If the +// channel is a nested one, the same event is also added on the parent channel. +func (cc *ClientConn) addTraceEvent(msg string) { + ted := &channelz.TraceEventDesc{ + Desc: fmt.Sprintf("Channel %s", msg), + Severity: channelz.CtInfo, + } + if cc.dopts.channelzParentID != nil { + ted.Parent = &channelz.TraceEventDesc{ + Desc: fmt.Sprintf("Nested channel(id:%d) %s", cc.channelzID.Int(), msg), + Severity: channelz.CtInfo, + } + } + channelz.AddTraceEvent(logger, cc.channelzID, 0, ted) +} + +// exitIdleMode moves the channel out of idle mode by recreating the name +// resolver and load balancer. +func (cc *ClientConn) exitIdleMode() error { + cc.mu.Lock() + if cc.conns == nil { + cc.mu.Unlock() + return errConnClosing + } + if cc.idlenessState != ccIdlenessStateIdle { + cc.mu.Unlock() + logger.Info("ClientConn asked to exit idle mode when not in idle mode") + return nil + } + + defer func() { + // When Close() and exitIdleMode() race against each other, one of the + // following two can happen: + // - Close() wins the race and runs first. exitIdleMode() runs after, and + // sees that the ClientConn is already closed and hence returns early. + // - exitIdleMode() wins the race and runs first and recreates the balancer + // and releases the lock before recreating the resolver. If Close() runs + // in this window, it will wait for exitIdleMode to complete. + // + // We achieve this synchronization using the below condition variable. + cc.mu.Lock() + cc.idlenessState = ccIdlenessStateActive + cc.exitIdleCond.Signal() + cc.mu.Unlock() + }() + + cc.idlenessState = ccIdlenessStateExitingIdle + exitedIdle := false + if cc.blockingpicker == nil { + cc.blockingpicker = newPickerWrapper() + } else { + cc.blockingpicker.exitIdleMode() + exitedIdle = true + } + var credsClone credentials.TransportCredentials if creds := cc.dopts.copts.TransportCredentials; creds != nil { credsClone = creds.Clone() } - cc.balancerWrapper = newCCBalancerWrapper(cc, balancer.BuildOptions{ - DialCreds: credsClone, - CredsBundle: cc.dopts.copts.CredsBundle, - Dialer: cc.dopts.copts.Dialer, - Authority: cc.authority, - CustomUserAgent: cc.dopts.copts.UserAgent, - ChannelzParentID: cc.channelzID, - Target: cc.parsedTarget, - }) + if cc.balancerWrapper == nil { + cc.balancerWrapper = newCCBalancerWrapper(cc, balancer.BuildOptions{ + DialCreds: credsClone, + CredsBundle: cc.dopts.copts.CredsBundle, + Dialer: cc.dopts.copts.Dialer, + Authority: cc.authority, + CustomUserAgent: cc.dopts.copts.UserAgent, + ChannelzParentID: cc.channelzID, + Target: cc.parsedTarget, + }) + } else { + cc.balancerWrapper.exitIdleMode() + } + cc.firstResolveEvent = grpcsync.NewEvent() + cc.mu.Unlock() - // Build the resolver. - rWrapper, err := newCCResolverWrapper(cc, resolverBuilder) - if err != nil { - return nil, fmt.Errorf("failed to build resolver: %v", err) + // This needs to be called without cc.mu because this builds a new resolver + // which might update state or report error inline which needs to be handled + // by cc.updateResolverState() which also grabs cc.mu. + if err := cc.initResolverWrapper(credsClone); err != nil { + return err + } + + if exitedIdle { + cc.addTraceEvent("exiting idle mode") } + return nil +} + +// enterIdleMode puts the channel in idle mode, and as part of it shuts down the +// name resolver, load balancer and any subchannels. +func (cc *ClientConn) enterIdleMode() error { cc.mu.Lock() - cc.resolverWrapper = rWrapper + if cc.conns == nil { + cc.mu.Unlock() + return ErrClientConnClosing + } + if cc.idlenessState != ccIdlenessStateActive { + logger.Error("ClientConn asked to enter idle mode when not active") + return nil + } + + // cc.conns == nil is a proxy for the ClientConn being closed. So, instead + // of setting it to nil here, we recreate the map. This also means that we + // don't have to do this when exiting idle mode. + conns := cc.conns + cc.conns = make(map[*addrConn]struct{}) + + // TODO: Currently, we close the resolver wrapper upon entering idle mode + // and create a new one upon exiting idle mode. This means that the + // `cc.resolverWrapper` field would be overwritten everytime we exit idle + // mode. While this means that we need to hold `cc.mu` when accessing + // `cc.resolverWrapper`, it makes the code simpler in the wrapper. We should + // try to do the same for the balancer and picker wrappers too. + cc.resolverWrapper.close() + cc.blockingpicker.enterIdleMode() + cc.balancerWrapper.enterIdleMode() + cc.csMgr.updateState(connectivity.Idle) + cc.idlenessState = ccIdlenessStateIdle cc.mu.Unlock() - // A blocking dial blocks until the clientConn is ready. - if cc.dopts.block { - for { - cc.Connect() - s := cc.GetState() - if s == connectivity.Ready { - break - } else if cc.dopts.copts.FailOnNonTempDialError && s == connectivity.TransientFailure { - if err = cc.connectionError(); err != nil { - terr, ok := err.(interface { - Temporary() bool - }) - if ok && !terr.Temporary() { - return nil, err - } - } - } - if !cc.WaitForStateChange(ctx, s) { - // ctx got timeout or canceled. - if err = cc.connectionError(); err != nil && cc.dopts.returnLastError { - return nil, err - } - return nil, ctx.Err() + go func() { + cc.addTraceEvent("entering idle mode") + for ac := range conns { + ac.tearDown(errConnIdling) + } + }() + return nil +} + +// validateTransportCredentials performs a series of checks on the configured +// transport credentials. It returns a non-nil error if any of these conditions +// are met: +// - no transport creds and no creds bundle is configured +// - both transport creds and creds bundle are configured +// - creds bundle is configured, but it lacks a transport credentials +// - insecure transport creds configured alongside call creds that require +// transport level security +// +// If none of the above conditions are met, the configured credentials are +// deemed valid and a nil error is returned. +func (cc *ClientConn) validateTransportCredentials() error { + if cc.dopts.copts.TransportCredentials == nil && cc.dopts.copts.CredsBundle == nil { + return errNoTransportSecurity + } + if cc.dopts.copts.TransportCredentials != nil && cc.dopts.copts.CredsBundle != nil { + return errTransportCredsAndBundle + } + if cc.dopts.copts.CredsBundle != nil && cc.dopts.copts.CredsBundle.TransportCredentials() == nil { + return errNoTransportCredsInBundle + } + transportCreds := cc.dopts.copts.TransportCredentials + if transportCreds == nil { + transportCreds = cc.dopts.copts.CredsBundle.TransportCredentials() + } + if transportCreds.Info().SecurityProtocol == "insecure" { + for _, cd := range cc.dopts.copts.PerRPCCredentials { + if cd.RequireTransportSecurity() { + return errTransportCredentialsMissing } } } + return nil +} - return cc, nil +// channelzRegistration registers the newly created ClientConn with channelz and +// stores the returned identifier in `cc.channelzID` and `cc.csMgr.channelzID`. +// A channelz trace event is emitted for ClientConn creation. If the newly +// created ClientConn is a nested one, i.e a valid parent ClientConn ID is +// specified via a dial option, the trace event is also added to the parent. +// +// Doesn't grab cc.mu as this method is expected to be called only at Dial time. +func (cc *ClientConn) channelzRegistration(target string) { + cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target) + cc.addTraceEvent("created") + cc.csMgr.channelzID = cc.channelzID } // chainUnaryClientInterceptors chains all unary client interceptors into one. @@ -474,7 +620,9 @@ type ClientConn struct { authority string // See determineAuthority(). dopts dialOptions // Default and user specified dial options. channelzID *channelz.Identifier // Channelz identifier for the channel. + resolverBuilder resolver.Builder // See parseTargetAndFindResolver(). balancerWrapper *ccBalancerWrapper // Uses gracefulswitch.balancer underneath. + idlenessMgr idlenessManager // The following provide their own synchronization, and therefore don't // require cc.mu to be held to access them. @@ -495,11 +643,31 @@ type ClientConn struct { sc *ServiceConfig // Latest service config received from the resolver. conns map[*addrConn]struct{} // Set to nil on close. mkp keepalive.ClientParameters // May be updated upon receipt of a GoAway. + idlenessState ccIdlenessState // Tracks idleness state of the channel. + exitIdleCond *sync.Cond // Signalled when channel exits idle. lceMu sync.Mutex // protects lastConnectionError lastConnectionError error } +// ccIdlenessState tracks the idleness state of the channel. +// +// Channels start off in `active` and move to `idle` after a period of +// inactivity. When moving back to `active` upon an incoming RPC, they +// transition through `exiting_idle`. This state is useful for synchronization +// with Close(). +// +// This state tracking is mostly for self-protection. The idlenessManager is +// expected to keep track of the state as well, and is expected not to call into +// the ClientConn unnecessarily. +type ccIdlenessState int8 + +const ( + ccIdlenessStateActive ccIdlenessState = iota + ccIdlenessStateIdle + ccIdlenessStateExitingIdle +) + // WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or // ctx expires. A true value is returned in former case and false in latter. // @@ -539,7 +707,10 @@ func (cc *ClientConn) GetState() connectivity.State { // Notice: This API is EXPERIMENTAL and may be changed or removed in a later // release. func (cc *ClientConn) Connect() { - cc.balancerWrapper.exitIdle() + cc.exitIdleMode() + // If the ClientConn was not in idle mode, we need to call ExitIdle on the + // LB policy so that connections can be created. + cc.balancerWrapper.exitIdleMode() } func (cc *ClientConn) scWatcher() { @@ -708,6 +879,7 @@ func (cc *ClientConn) newAddrConn(addrs []resolver.Address, opts balancer.NewSub dopts: cc.dopts, czData: new(channelzData), resetBackoff: make(chan struct{}), + stateChan: make(chan struct{}), } ac.ctx, ac.cancel = context.WithCancel(cc.ctx) // Track ac in cc. This needs to be done before any getTransport(...) is called. @@ -801,9 +973,6 @@ func (ac *addrConn) connect() error { ac.mu.Unlock() return nil } - // Update connectivity state within the lock to prevent subsequent or - // concurrent calls from resetting the transport more than once. - ac.updateConnectivityState(connectivity.Connecting, nil) ac.mu.Unlock() ac.resetTransport() @@ -822,58 +991,62 @@ func equalAddresses(a, b []resolver.Address) bool { return true } -// tryUpdateAddrs tries to update ac.addrs with the new addresses list. -// -// If ac is TransientFailure, it updates ac.addrs and returns true. The updated -// addresses will be picked up by retry in the next iteration after backoff. -// -// If ac is Shutdown or Idle, it updates ac.addrs and returns true. -// -// If the addresses is the same as the old list, it does nothing and returns -// true. -// -// If ac is Connecting, it returns false. The caller should tear down the ac and -// create a new one. Note that the backoff will be reset when this happens. -// -// If ac is Ready, it checks whether current connected address of ac is in the -// new addrs list. -// - If true, it updates ac.addrs and returns true. The ac will keep using -// the existing connection. -// - If false, it does nothing and returns false. -func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool { +// updateAddrs updates ac.addrs with the new addresses list and handles active +// connections or connection attempts. +func (ac *addrConn) updateAddrs(addrs []resolver.Address) { ac.mu.Lock() - defer ac.mu.Unlock() - channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs) + channelz.Infof(logger, ac.channelzID, "addrConn: updateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs) + + if equalAddresses(ac.addrs, addrs) { + ac.mu.Unlock() + return + } + + ac.addrs = addrs + if ac.state == connectivity.Shutdown || ac.state == connectivity.TransientFailure || ac.state == connectivity.Idle { - ac.addrs = addrs - return true + // We were not connecting, so do nothing but update the addresses. + ac.mu.Unlock() + return } - if equalAddresses(ac.addrs, addrs) { - return true + if ac.state == connectivity.Ready { + // Try to find the connected address. + for _, a := range addrs { + a.ServerName = ac.cc.getServerName(a) + if a.Equal(ac.curAddr) { + // We are connected to a valid address, so do nothing but + // update the addresses. + ac.mu.Unlock() + return + } + } } - if ac.state == connectivity.Connecting { - return false - } + // We are either connected to the wrong address or currently connecting. + // Stop the current iteration and restart. - // ac.state is Ready, try to find the connected address. - var curAddrFound bool - for _, a := range addrs { - a.ServerName = ac.cc.getServerName(a) - if reflect.DeepEqual(ac.curAddr, a) { - curAddrFound = true - break - } + ac.cancel() + ac.ctx, ac.cancel = context.WithCancel(ac.cc.ctx) + + // We have to defer here because GracefulClose => Close => onClose, which + // requires locking ac.mu. + if ac.transport != nil { + defer ac.transport.GracefulClose() + ac.transport = nil } - channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound) - if curAddrFound { - ac.addrs = addrs + + if len(addrs) == 0 { + ac.updateConnectivityState(connectivity.Idle, nil) } - return curAddrFound + ac.mu.Unlock() + + // Since we were connecting/connected, we should start a new connection + // attempt. + go ac.resetTransport() } // getServerName determines the serverName to be used in the connection @@ -934,7 +1107,7 @@ func (cc *ClientConn) healthCheckConfig() *healthCheckConfig { return cc.sc.healthCheckConfig } -func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method string) (transport.ClientTransport, func(balancer.DoneInfo), error) { +func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method string) (transport.ClientTransport, balancer.PickResult, error) { return cc.blockingpicker.pick(ctx, failfast, balancer.PickInfo{ Ctx: ctx, FullMethodName: method, @@ -1026,39 +1199,40 @@ func (cc *ClientConn) Close() error { cc.mu.Unlock() return ErrClientConnClosing } + + for cc.idlenessState == ccIdlenessStateExitingIdle { + cc.exitIdleCond.Wait() + } + conns := cc.conns cc.conns = nil cc.csMgr.updateState(connectivity.Shutdown) + pWrapper := cc.blockingpicker rWrapper := cc.resolverWrapper - cc.resolverWrapper = nil bWrapper := cc.balancerWrapper + idlenessMgr := cc.idlenessMgr cc.mu.Unlock() // The order of closing matters here since the balancer wrapper assumes the // picker is closed before it is closed. - cc.blockingpicker.close() + if pWrapper != nil { + pWrapper.close() + } if bWrapper != nil { bWrapper.close() } if rWrapper != nil { rWrapper.close() } + if idlenessMgr != nil { + idlenessMgr.close() + } for ac := range conns { ac.tearDown(ErrClientConnClosing) } - ted := &channelz.TraceEventDesc{ - Desc: "Channel deleted", - Severity: channelz.CtInfo, - } - if cc.dopts.channelzParentID != nil { - ted.Parent = &channelz.TraceEventDesc{ - Desc: fmt.Sprintf("Nested channel(id:%d) deleted", cc.channelzID.Int()), - Severity: channelz.CtInfo, - } - } - channelz.AddTraceEvent(logger, cc.channelzID, 0, ted) + cc.addTraceEvent("deleted") // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add // trace reference to the entity being deleted, and thus prevent it from being // deleted right away. @@ -1088,7 +1262,8 @@ type addrConn struct { addrs []resolver.Address // All addresses that the resolver resolved to. // Use updateConnectivityState for updating addrConn's connectivity state. - state connectivity.State + state connectivity.State + stateChan chan struct{} // closed and recreated on every state change. backoffIdx int // Needs to be stateful for resetConnectBackoff. resetBackoff chan struct{} @@ -1102,8 +1277,15 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) if ac.state == s { return } + // When changing states, reset the state change channel. + close(ac.stateChan) + ac.stateChan = make(chan struct{}) ac.state = s - channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v", s) + if lastErr == nil { + channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v", s) + } else { + channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v, last error: %s", s, lastErr) + } ac.cc.handleSubConnStateChange(ac.acbw, s, lastErr) } @@ -1123,7 +1305,8 @@ func (ac *addrConn) adjustParams(r transport.GoAwayReason) { func (ac *addrConn) resetTransport() { ac.mu.Lock() - if ac.state == connectivity.Shutdown { + acCtx := ac.ctx + if acCtx.Err() != nil { ac.mu.Unlock() return } @@ -1151,15 +1334,14 @@ func (ac *addrConn) resetTransport() { ac.updateConnectivityState(connectivity.Connecting, nil) ac.mu.Unlock() - if err := ac.tryAllAddrs(addrs, connectDeadline); err != nil { + if err := ac.tryAllAddrs(acCtx, addrs, connectDeadline); err != nil { ac.cc.resolveNow(resolver.ResolveNowOptions{}) // After exhausting all addresses, the addrConn enters // TRANSIENT_FAILURE. - ac.mu.Lock() - if ac.state == connectivity.Shutdown { - ac.mu.Unlock() + if acCtx.Err() != nil { return } + ac.mu.Lock() ac.updateConnectivityState(connectivity.TransientFailure, err) // Backoff. @@ -1174,13 +1356,13 @@ func (ac *addrConn) resetTransport() { ac.mu.Unlock() case <-b: timer.Stop() - case <-ac.ctx.Done(): + case <-acCtx.Done(): timer.Stop() return } ac.mu.Lock() - if ac.state != connectivity.Shutdown { + if acCtx.Err() == nil { ac.updateConnectivityState(connectivity.Idle, err) } ac.mu.Unlock() @@ -1195,14 +1377,13 @@ func (ac *addrConn) resetTransport() { // tryAllAddrs tries to creates a connection to the addresses, and stop when at // the first successful one. It returns an error if no address was successfully // connected, or updates ac appropriately with the new transport. -func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.Time) error { +func (ac *addrConn) tryAllAddrs(ctx context.Context, addrs []resolver.Address, connectDeadline time.Time) error { var firstConnErr error for _, addr := range addrs { - ac.mu.Lock() - if ac.state == connectivity.Shutdown { - ac.mu.Unlock() + if ctx.Err() != nil { return errConnClosing } + ac.mu.Lock() ac.cc.mu.RLock() ac.dopts.copts.KeepaliveParams = ac.cc.mkp @@ -1216,7 +1397,7 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T channelz.Infof(logger, ac.channelzID, "Subchannel picks a new address %q to connect", addr.Addr) - err := ac.createTransport(addr, copts, connectDeadline) + err := ac.createTransport(ctx, addr, copts, connectDeadline) if err == nil { return nil } @@ -1233,17 +1414,20 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T // createTransport creates a connection to addr. It returns an error if the // address was not successfully connected, or updates ac appropriately with the // new transport. -func (ac *addrConn) createTransport(addr resolver.Address, copts transport.ConnectOptions, connectDeadline time.Time) error { +func (ac *addrConn) createTransport(ctx context.Context, addr resolver.Address, copts transport.ConnectOptions, connectDeadline time.Time) error { addr.ServerName = ac.cc.getServerName(addr) - hctx, hcancel := context.WithCancel(ac.ctx) + hctx, hcancel := context.WithCancel(ctx) - onClose := grpcsync.OnceFunc(func() { + onClose := func(r transport.GoAwayReason) { ac.mu.Lock() defer ac.mu.Unlock() - if ac.state == connectivity.Shutdown { - // Already shut down. tearDown() already cleared the transport and - // canceled hctx via ac.ctx, and we expected this connection to be - // closed, so do nothing here. + // adjust params based on GoAwayReason + ac.adjustParams(r) + if ctx.Err() != nil { + // Already shut down or connection attempt canceled. tearDown() or + // updateAddrs() already cleared the transport and canceled hctx + // via ac.ctx, and we expected this connection to be closed, so do + // nothing here. return } hcancel() @@ -1260,19 +1444,13 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne // Always go idle and wait for the LB policy to initiate a new // connection attempt. ac.updateConnectivityState(connectivity.Idle, nil) - }) - onGoAway := func(r transport.GoAwayReason) { - ac.mu.Lock() - ac.adjustParams(r) - ac.mu.Unlock() - onClose() } - connectCtx, cancel := context.WithDeadline(ac.ctx, connectDeadline) + connectCtx, cancel := context.WithDeadline(ctx, connectDeadline) defer cancel() copts.ChannelzParentID = ac.channelzID - newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onGoAway, onClose) + newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onClose) if err != nil { if logger.V(2) { logger.Infof("Creating new client transport to %q: %v", addr, err) @@ -1285,7 +1463,7 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne ac.mu.Lock() defer ac.mu.Unlock() - if ac.state == connectivity.Shutdown { + if ctx.Err() != nil { // This can happen if the subConn was removed while in `Connecting` // state. tearDown() would have set the state to `Shutdown`, but // would not have closed the transport since ac.transport would not @@ -1297,6 +1475,9 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne // The error we pass to Close() is immaterial since there are no open // streams at this point, so no trailers with error details will be sent // out. We just need to pass a non-nil error. + // + // This can also happen when updateAddrs is called during a connection + // attempt. go newTr.Close(transport.ErrConnClosing) return nil } @@ -1380,7 +1561,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { if status.Code(err) == codes.Unimplemented { channelz.Error(logger, ac.channelzID, "Subchannel health check is unimplemented at server side, thus health check is disabled") } else { - channelz.Errorf(logger, ac.channelzID, "HealthCheckFunc exits with unexpected error %v", err) + channelz.Errorf(logger, ac.channelzID, "Health checking failed: %v", err) } } }() @@ -1404,6 +1585,29 @@ func (ac *addrConn) getReadyTransport() transport.ClientTransport { return nil } +// getTransport waits until the addrconn is ready and returns the transport. +// If the context expires first, returns an appropriate status. If the +// addrConn is stopped first, returns an Unavailable status error. +func (ac *addrConn) getTransport(ctx context.Context) (transport.ClientTransport, error) { + for ctx.Err() == nil { + ac.mu.Lock() + t, state, sc := ac.transport, ac.state, ac.stateChan + ac.mu.Unlock() + if state == connectivity.Ready { + return t, nil + } + if state == connectivity.Shutdown { + return nil, status.Errorf(codes.Unavailable, "SubConn shutting down") + } + + select { + case <-ctx.Done(): + case <-sc: + } + } + return nil, status.FromContextError(ctx.Err()).Err() +} + // tearDown starts to tear down the addrConn. // // Note that tearDown doesn't remove ac from ac.cc.conns, so the addrConn struct @@ -1531,6 +1735,9 @@ func (c *channelzChannel) ChannelzMetric() *channelz.ChannelInternalMetric { // referenced by users. var ErrClientConnTimeout = errors.New("grpc: timed out when dialing") +// getResolver finds the scheme in the cc's resolvers or the global registry. +// scheme should always be lowercase (typically by virtue of url.Parse() +// performing proper RFC3986 behavior). func (cc *ClientConn) getResolver(scheme string) resolver.Builder { for _, rb := range cc.dopts.resolvers { if scheme == rb.Scheme() { @@ -1552,7 +1759,14 @@ func (cc *ClientConn) connectionError() error { return cc.lastConnectionError } -func (cc *ClientConn) parseTargetAndFindResolver() (resolver.Builder, error) { +// parseTargetAndFindResolver parses the user's dial target and stores the +// parsed target in `cc.parsedTarget`. +// +// The resolver to use is determined based on the scheme in the parsed target +// and the same is stored in `cc.resolverBuilder`. +// +// Doesn't grab cc.mu as this method is expected to be called only at Dial time. +func (cc *ClientConn) parseTargetAndFindResolver() error { channelz.Infof(logger, cc.channelzID, "original dial target is: %q", cc.target) var rb resolver.Builder @@ -1564,7 +1778,8 @@ func (cc *ClientConn) parseTargetAndFindResolver() (resolver.Builder, error) { rb = cc.getResolver(parsedTarget.URL.Scheme) if rb != nil { cc.parsedTarget = parsedTarget - return rb, nil + cc.resolverBuilder = rb + return nil } } @@ -1579,42 +1794,30 @@ func (cc *ClientConn) parseTargetAndFindResolver() (resolver.Builder, error) { parsedTarget, err = parseTarget(canonicalTarget) if err != nil { channelz.Infof(logger, cc.channelzID, "dial target %q parse failed: %v", canonicalTarget, err) - return nil, err + return err } channelz.Infof(logger, cc.channelzID, "parsed dial target is: %+v", parsedTarget) rb = cc.getResolver(parsedTarget.URL.Scheme) if rb == nil { - return nil, fmt.Errorf("could not get resolver for default scheme: %q", parsedTarget.URL.Scheme) + return fmt.Errorf("could not get resolver for default scheme: %q", parsedTarget.URL.Scheme) } cc.parsedTarget = parsedTarget - return rb, nil + cc.resolverBuilder = rb + return nil } // parseTarget uses RFC 3986 semantics to parse the given target into a -// resolver.Target struct containing scheme, authority and endpoint. Query +// resolver.Target struct containing scheme, authority and url. Query // params are stripped from the endpoint. func parseTarget(target string) (resolver.Target, error) { u, err := url.Parse(target) if err != nil { return resolver.Target{}, err } - // For targets of the form "[scheme]://[authority]/endpoint, the endpoint - // value returned from url.Parse() contains a leading "/". Although this is - // in accordance with RFC 3986, we do not want to break existing resolver - // implementations which expect the endpoint without the leading "/". So, we - // end up stripping the leading "/" here. But this will result in an - // incorrect parsing for something like "unix:///path/to/socket". Since we - // own the "unix" resolver, we can workaround in the unix resolver by using - // the `URL` field instead of the `Endpoint` field. - endpoint := u.Path - if endpoint == "" { - endpoint = u.Opaque - } - endpoint = strings.TrimPrefix(endpoint, "/") + return resolver.Target{ Scheme: u.Scheme, Authority: u.Host, - Endpoint: endpoint, URL: *u, }, nil } @@ -1623,7 +1826,15 @@ func parseTarget(target string) (resolver.Target, error) { // - user specified authority override using `WithAuthority` dial option // - creds' notion of server name for the authentication handshake // - endpoint from dial target of the form "scheme://[authority]/endpoint" -func determineAuthority(endpoint, target string, dopts dialOptions) (string, error) { +// +// Stores the determined authority in `cc.authority`. +// +// Returns a non-nil error if the authority returned by the transport +// credentials do not match the authority configured through the dial option. +// +// Doesn't grab cc.mu as this method is expected to be called only at Dial time. +func (cc *ClientConn) determineAuthority() error { + dopts := cc.dopts // Historically, we had two options for users to specify the serverName or // authority for a channel. One was through the transport credentials // (either in its constructor, or through the OverrideServerName() method). @@ -1640,25 +1851,58 @@ func determineAuthority(endpoint, target string, dopts dialOptions) (string, err } authorityFromDialOption := dopts.authority if (authorityFromCreds != "" && authorityFromDialOption != "") && authorityFromCreds != authorityFromDialOption { - return "", fmt.Errorf("ClientConn's authority from transport creds %q and dial option %q don't match", authorityFromCreds, authorityFromDialOption) + return fmt.Errorf("ClientConn's authority from transport creds %q and dial option %q don't match", authorityFromCreds, authorityFromDialOption) } + endpoint := cc.parsedTarget.Endpoint() + target := cc.target switch { case authorityFromDialOption != "": - return authorityFromDialOption, nil + cc.authority = authorityFromDialOption case authorityFromCreds != "": - return authorityFromCreds, nil + cc.authority = authorityFromCreds case strings.HasPrefix(target, "unix:") || strings.HasPrefix(target, "unix-abstract:"): // TODO: remove when the unix resolver implements optional interface to // return channel authority. - return "localhost", nil + cc.authority = "localhost" case strings.HasPrefix(endpoint, ":"): - return "localhost" + endpoint, nil + cc.authority = "localhost" + endpoint default: // TODO: Define an optional interface on the resolver builder to return // the channel authority given the user's dial target. For resolvers // which don't implement this interface, we will use the endpoint from // "scheme://authority/endpoint" as the default authority. - return endpoint, nil + cc.authority = endpoint } + channelz.Infof(logger, cc.channelzID, "Channel authority set to %q", cc.authority) + return nil +} + +// initResolverWrapper creates a ccResolverWrapper, which builds the name +// resolver. This method grabs the lock to assign the newly built resolver +// wrapper to the cc.resolverWrapper field. +func (cc *ClientConn) initResolverWrapper(creds credentials.TransportCredentials) error { + rw, err := newCCResolverWrapper(cc, ccResolverWrapperOpts{ + target: cc.parsedTarget, + builder: cc.resolverBuilder, + bOpts: resolver.BuildOptions{ + DisableServiceConfig: cc.dopts.disableServiceConfig, + DialCreds: creds, + CredsBundle: cc.dopts.copts.CredsBundle, + Dialer: cc.dopts.copts.Dialer, + }, + channelzID: cc.channelzID, + }) + if err != nil { + return fmt.Errorf("failed to build resolver: %v", err) + } + // Resolver implementations may report state update or error inline when + // built (or right after), and this is handled in cc.updateResolverState. + // Also, an error from the resolver might lead to a re-resolution request + // from the balancer, which is handled in resolveNow() where + // `cc.resolverWrapper` is accessed. Hence, we need to hold the lock here. + cc.mu.Lock() + cc.resolverWrapper = rw + cc.mu.Unlock() + return nil } diff --git a/vendor/google.golang.org/grpc/codes/code_string.go b/vendor/google.golang.org/grpc/codes/code_string.go index 0b206a5782..934fac2b09 100644 --- a/vendor/google.golang.org/grpc/codes/code_string.go +++ b/vendor/google.golang.org/grpc/codes/code_string.go @@ -18,7 +18,15 @@ package codes -import "strconv" +import ( + "strconv" + + "google.golang.org/grpc/internal" +) + +func init() { + internal.CanonicalString = canonicalString +} func (c Code) String() string { switch c { @@ -60,3 +68,44 @@ func (c Code) String() string { return "Code(" + strconv.FormatInt(int64(c), 10) + ")" } } + +func canonicalString(c Code) string { + switch c { + case OK: + return "OK" + case Canceled: + return "CANCELLED" + case Unknown: + return "UNKNOWN" + case InvalidArgument: + return "INVALID_ARGUMENT" + case DeadlineExceeded: + return "DEADLINE_EXCEEDED" + case NotFound: + return "NOT_FOUND" + case AlreadyExists: + return "ALREADY_EXISTS" + case PermissionDenied: + return "PERMISSION_DENIED" + case ResourceExhausted: + return "RESOURCE_EXHAUSTED" + case FailedPrecondition: + return "FAILED_PRECONDITION" + case Aborted: + return "ABORTED" + case OutOfRange: + return "OUT_OF_RANGE" + case Unimplemented: + return "UNIMPLEMENTED" + case Internal: + return "INTERNAL" + case Unavailable: + return "UNAVAILABLE" + case DataLoss: + return "DATA_LOSS" + case Unauthenticated: + return "UNAUTHENTICATED" + default: + return "CODE(" + strconv.FormatInt(int64(c), 10) + ")" + } +} diff --git a/vendor/google.golang.org/grpc/credentials/tls.go b/vendor/google.golang.org/grpc/credentials/tls.go index ce2bbc10a1..877b7cd21a 100644 --- a/vendor/google.golang.org/grpc/credentials/tls.go +++ b/vendor/google.golang.org/grpc/credentials/tls.go @@ -23,9 +23,9 @@ import ( "crypto/tls" "crypto/x509" "fmt" - "io/ioutil" "net" "net/url" + "os" credinternal "google.golang.org/grpc/internal/credentials" ) @@ -166,7 +166,7 @@ func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) Transpor // it will override the virtual host name of authority (e.g. :authority header // field) in requests. func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { - b, err := ioutil.ReadFile(certFile) + b, err := os.ReadFile(certFile) if err != nil { return nil, err } diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 8f5b536f11..15a3d5102a 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -38,12 +38,14 @@ import ( func init() { internal.AddGlobalDialOptions = func(opt ...DialOption) { - extraDialOptions = append(extraDialOptions, opt...) + globalDialOptions = append(globalDialOptions, opt...) } internal.ClearGlobalDialOptions = func() { - extraDialOptions = nil + globalDialOptions = nil } internal.WithBinaryLogger = withBinaryLogger + internal.JoinDialOptions = newJoinDialOption + internal.DisableGlobalDialOptions = newDisableGlobalDialOptions } // dialOptions configure a Dial call. dialOptions are set by the DialOption @@ -75,6 +77,7 @@ type dialOptions struct { defaultServiceConfig *ServiceConfig // defaultServiceConfig is parsed from defaultServiceConfigRawJSON. defaultServiceConfigRawJSON *string resolvers []resolver.Builder + idleTimeout time.Duration } // DialOption configures how we set up the connection. @@ -82,7 +85,7 @@ type DialOption interface { apply(*dialOptions) } -var extraDialOptions []DialOption +var globalDialOptions []DialOption // EmptyDialOption does not alter the dial configuration. It can be embedded in // another structure to build custom dial options. @@ -95,6 +98,16 @@ type EmptyDialOption struct{} func (EmptyDialOption) apply(*dialOptions) {} +type disableGlobalDialOptions struct{} + +func (disableGlobalDialOptions) apply(*dialOptions) {} + +// newDisableGlobalDialOptions returns a DialOption that prevents the ClientConn +// from applying the global DialOptions (set via AddGlobalDialOptions). +func newDisableGlobalDialOptions() DialOption { + return &disableGlobalDialOptions{} +} + // funcDialOption wraps a function that modifies dialOptions into an // implementation of the DialOption interface. type funcDialOption struct { @@ -111,6 +124,20 @@ func newFuncDialOption(f func(*dialOptions)) *funcDialOption { } } +type joinDialOption struct { + opts []DialOption +} + +func (jdo *joinDialOption) apply(do *dialOptions) { + for _, opt := range jdo.opts { + opt.apply(do) + } +} + +func newJoinDialOption(opts ...DialOption) DialOption { + return &joinDialOption{opts: opts} +} + // WithWriteBufferSize determines how much data can be batched before doing a // write on the wire. The corresponding memory allocation for this buffer will // be twice the size to keep syscalls low. The default value for this buffer is @@ -269,6 +296,9 @@ func withBackoff(bs internalbackoff.Strategy) DialOption { // WithBlock returns a DialOption which makes callers of Dial block until the // underlying connection is up. Without this, Dial returns immediately and // connecting the server happens in background. +// +// Use of this feature is not recommended. For more information, please see: +// https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md func WithBlock() DialOption { return newFuncDialOption(func(o *dialOptions) { o.block = true @@ -280,6 +310,9 @@ func WithBlock() DialOption { // the context.DeadlineExceeded error. // Implies WithBlock() // +// Use of this feature is not recommended. For more information, please see: +// https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md +// // # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a @@ -422,6 +455,9 @@ func withBinaryLogger(bl binarylog.Logger) DialOption { // FailOnNonTempDialError only affects the initial dial, and does not do // anything useful unless you are also using WithBlock(). // +// Use of this feature is not recommended. For more information, please see: +// https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md +// // # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a @@ -620,3 +656,23 @@ func WithResolvers(rs ...resolver.Builder) DialOption { o.resolvers = append(o.resolvers, rs...) }) } + +// WithIdleTimeout returns a DialOption that configures an idle timeout for the +// channel. If the channel is idle for the configured timeout, i.e there are no +// ongoing RPCs and no new RPCs are initiated, the channel will enter idle mode +// and as a result the name resolver and load balancer will be shut down. The +// channel will exit idle mode when the Connect() method is called or when an +// RPC is initiated. +// +// By default this feature is disabled, which can also be explicitly configured +// by passing zero to this function. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func WithIdleTimeout(d time.Duration) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.idleTimeout = d + }) +} diff --git a/vendor/google.golang.org/grpc/encoding/encoding.go b/vendor/google.golang.org/grpc/encoding/encoding.go index 711763d54f..07a5861352 100644 --- a/vendor/google.golang.org/grpc/encoding/encoding.go +++ b/vendor/google.golang.org/grpc/encoding/encoding.go @@ -75,7 +75,9 @@ var registeredCompressor = make(map[string]Compressor) // registered with the same name, the one registered last will take effect. func RegisterCompressor(c Compressor) { registeredCompressor[c.Name()] = c - grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name()) + if !grpcutil.IsCompressorNameRegistered(c.Name()) { + grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name()) + } } // GetCompressor returns Compressor for the given compressor name. diff --git a/vendor/google.golang.org/grpc/grpclog/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/loggerv2.go index b5560b47ec..5de66e40d3 100644 --- a/vendor/google.golang.org/grpc/grpclog/loggerv2.go +++ b/vendor/google.golang.org/grpc/grpclog/loggerv2.go @@ -22,7 +22,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "log" "os" "strconv" @@ -140,9 +139,9 @@ func newLoggerV2WithConfig(infoW, warningW, errorW io.Writer, c loggerV2Config) // 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 + errorW := io.Discard + warningW := io.Discard + infoW := io.Discard logLevel := os.Getenv("GRPC_GO_LOG_SEVERITY_LEVEL") switch logLevel { diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go index 8e29a62f16..142d35f753 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.14.0 +// protoc-gen-go v1.30.0 +// protoc v4.22.0 // source: grpc/health/v1/health.proto package grpc_health_v1 diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go index a332dfd7b5..a01a1b4d54 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.14.0 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.22.0 // source: grpc/health/v1/health.proto package grpc_health_v1 @@ -35,6 +35,11 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + Health_Check_FullMethodName = "/grpc.health.v1.Health/Check" + Health_Watch_FullMethodName = "/grpc.health.v1.Health/Watch" +) + // HealthClient is the client API for Health service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -70,7 +75,7 @@ func NewHealthClient(cc grpc.ClientConnInterface) HealthClient { func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) { out := new(HealthCheckResponse) - err := c.cc.Invoke(ctx, "/grpc.health.v1.Health/Check", in, out, opts...) + err := c.cc.Invoke(ctx, Health_Check_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -78,7 +83,7 @@ func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts . } func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error) { - stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], "/grpc.health.v1.Health/Watch", opts...) + stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], Health_Watch_FullMethodName, opts...) if err != nil { return nil, err } @@ -166,7 +171,7 @@ func _Health_Check_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/grpc.health.v1.Health/Check", + FullMethod: Health_Check_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(HealthServer).Check(ctx, req.(*HealthCheckRequest)) diff --git a/vendor/google.golang.org/grpc/idle.go b/vendor/google.golang.org/grpc/idle.go new file mode 100644 index 0000000000..dc3dc72f6b --- /dev/null +++ b/vendor/google.golang.org/grpc/idle.go @@ -0,0 +1,287 @@ +/* + * + * Copyright 2023 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" + "math" + "sync" + "sync/atomic" + "time" +) + +// For overriding in unit tests. +var timeAfterFunc = func(d time.Duration, f func()) *time.Timer { + return time.AfterFunc(d, f) +} + +// idlenessEnforcer is the functionality provided by grpc.ClientConn to enter +// and exit from idle mode. +type idlenessEnforcer interface { + exitIdleMode() error + enterIdleMode() error +} + +// idlenessManager defines the functionality required to track RPC activity on a +// channel. +type idlenessManager interface { + onCallBegin() error + onCallEnd() + close() +} + +type noopIdlenessManager struct{} + +func (noopIdlenessManager) onCallBegin() error { return nil } +func (noopIdlenessManager) onCallEnd() {} +func (noopIdlenessManager) close() {} + +// idlenessManagerImpl implements the idlenessManager interface. It uses atomic +// operations to synchronize access to shared state and a mutex to guarantee +// mutual exclusion in a critical section. +type idlenessManagerImpl struct { + // State accessed atomically. + lastCallEndTime int64 // Unix timestamp in nanos; time when the most recent RPC completed. + activeCallsCount int32 // Count of active RPCs; -math.MaxInt32 means channel is idle or is trying to get there. + activeSinceLastTimerCheck int32 // Boolean; True if there was an RPC since the last timer callback. + closed int32 // Boolean; True when the manager is closed. + + // Can be accessed without atomics or mutex since these are set at creation + // time and read-only after that. + enforcer idlenessEnforcer // Functionality provided by grpc.ClientConn. + timeout int64 // Idle timeout duration nanos stored as an int64. + + // idleMu is used to guarantee mutual exclusion in two scenarios: + // - Opposing intentions: + // - a: Idle timeout has fired and handleIdleTimeout() is trying to put + // the channel in idle mode because the channel has been inactive. + // - b: At the same time an RPC is made on the channel, and onCallBegin() + // is trying to prevent the channel from going idle. + // - Competing intentions: + // - The channel is in idle mode and there are multiple RPCs starting at + // the same time, all trying to move the channel out of idle. Only one + // of them should succeed in doing so, while the other RPCs should + // piggyback on the first one and be successfully handled. + idleMu sync.RWMutex + actuallyIdle bool + timer *time.Timer +} + +// newIdlenessManager creates a new idleness manager implementation for the +// given idle timeout. +func newIdlenessManager(enforcer idlenessEnforcer, idleTimeout time.Duration) idlenessManager { + if idleTimeout == 0 { + return noopIdlenessManager{} + } + + i := &idlenessManagerImpl{ + enforcer: enforcer, + timeout: int64(idleTimeout), + } + i.timer = timeAfterFunc(idleTimeout, i.handleIdleTimeout) + return i +} + +// resetIdleTimer resets the idle timer to the given duration. This method +// should only be called from the timer callback. +func (i *idlenessManagerImpl) resetIdleTimer(d time.Duration) { + i.idleMu.Lock() + defer i.idleMu.Unlock() + + if i.timer == nil { + // Only close sets timer to nil. We are done. + return + } + + // It is safe to ignore the return value from Reset() because this method is + // only ever called from the timer callback, which means the timer has + // already fired. + i.timer.Reset(d) +} + +// handleIdleTimeout is the timer callback that is invoked upon expiry of the +// configured idle timeout. The channel is considered inactive if there are no +// ongoing calls and no RPC activity since the last time the timer fired. +func (i *idlenessManagerImpl) handleIdleTimeout() { + if i.isClosed() { + return + } + + if atomic.LoadInt32(&i.activeCallsCount) > 0 { + i.resetIdleTimer(time.Duration(i.timeout)) + return + } + + // There has been activity on the channel since we last got here. Reset the + // timer and return. + if atomic.LoadInt32(&i.activeSinceLastTimerCheck) == 1 { + // Set the timer to fire after a duration of idle timeout, calculated + // from the time the most recent RPC completed. + atomic.StoreInt32(&i.activeSinceLastTimerCheck, 0) + i.resetIdleTimer(time.Duration(atomic.LoadInt64(&i.lastCallEndTime) + i.timeout - time.Now().UnixNano())) + return + } + + // This CAS operation is extremely likely to succeed given that there has + // been no activity since the last time we were here. Setting the + // activeCallsCount to -math.MaxInt32 indicates to onCallBegin() that the + // channel is either in idle mode or is trying to get there. + if !atomic.CompareAndSwapInt32(&i.activeCallsCount, 0, -math.MaxInt32) { + // This CAS operation can fail if an RPC started after we checked for + // activity at the top of this method, or one was ongoing from before + // the last time we were here. In both case, reset the timer and return. + i.resetIdleTimer(time.Duration(i.timeout)) + return + } + + // Now that we've set the active calls count to -math.MaxInt32, it's time to + // actually move to idle mode. + if i.tryEnterIdleMode() { + // Successfully entered idle mode. No timer needed until we exit idle. + return + } + + // Failed to enter idle mode due to a concurrent RPC that kept the channel + // active, or because of an error from the channel. Undo the attempt to + // enter idle, and reset the timer to try again later. + atomic.AddInt32(&i.activeCallsCount, math.MaxInt32) + i.resetIdleTimer(time.Duration(i.timeout)) +} + +// tryEnterIdleMode instructs the channel to enter idle mode. But before +// that, it performs a last minute check to ensure that no new RPC has come in, +// making the channel active. +// +// Return value indicates whether or not the channel moved to idle mode. +// +// Holds idleMu which ensures mutual exclusion with exitIdleMode. +func (i *idlenessManagerImpl) tryEnterIdleMode() bool { + i.idleMu.Lock() + defer i.idleMu.Unlock() + + if atomic.LoadInt32(&i.activeCallsCount) != -math.MaxInt32 { + // We raced and lost to a new RPC. Very rare, but stop entering idle. + return false + } + if atomic.LoadInt32(&i.activeSinceLastTimerCheck) == 1 { + // An very short RPC could have come in (and also finished) after we + // checked for calls count and activity in handleIdleTimeout(), but + // before the CAS operation. So, we need to check for activity again. + return false + } + + // No new RPCs have come in since we last set the active calls count value + // -math.MaxInt32 in the timer callback. And since we have the lock, it is + // safe to enter idle mode now. + if err := i.enforcer.enterIdleMode(); err != nil { + logger.Errorf("Failed to enter idle mode: %v", err) + return false + } + + // Successfully entered idle mode. + i.actuallyIdle = true + return true +} + +// onCallBegin is invoked at the start of every RPC. +func (i *idlenessManagerImpl) onCallBegin() error { + if i.isClosed() { + return nil + } + + if atomic.AddInt32(&i.activeCallsCount, 1) > 0 { + // Channel is not idle now. Set the activity bit and allow the call. + atomic.StoreInt32(&i.activeSinceLastTimerCheck, 1) + return nil + } + + // Channel is either in idle mode or is in the process of moving to idle + // mode. Attempt to exit idle mode to allow this RPC. + if err := i.exitIdleMode(); err != nil { + // Undo the increment to calls count, and return an error causing the + // RPC to fail. + atomic.AddInt32(&i.activeCallsCount, -1) + return err + } + + atomic.StoreInt32(&i.activeSinceLastTimerCheck, 1) + return nil +} + +// exitIdleMode instructs the channel to exit idle mode. +// +// Holds idleMu which ensures mutual exclusion with tryEnterIdleMode. +func (i *idlenessManagerImpl) exitIdleMode() error { + i.idleMu.Lock() + defer i.idleMu.Unlock() + + if !i.actuallyIdle { + // This can happen in two scenarios: + // - handleIdleTimeout() set the calls count to -math.MaxInt32 and called + // tryEnterIdleMode(). But before the latter could grab the lock, an RPC + // came in and onCallBegin() noticed that the calls count is negative. + // - Channel is in idle mode, and multiple new RPCs come in at the same + // time, all of them notice a negative calls count in onCallBegin and get + // here. The first one to get the lock would got the channel to exit idle. + // + // Either way, nothing to do here. + return nil + } + + if err := i.enforcer.exitIdleMode(); err != nil { + return fmt.Errorf("channel failed to exit idle mode: %v", err) + } + + // Undo the idle entry process. This also respects any new RPC attempts. + atomic.AddInt32(&i.activeCallsCount, math.MaxInt32) + i.actuallyIdle = false + + // Start a new timer to fire after the configured idle timeout. + i.timer = timeAfterFunc(time.Duration(i.timeout), i.handleIdleTimeout) + return nil +} + +// onCallEnd is invoked at the end of every RPC. +func (i *idlenessManagerImpl) onCallEnd() { + if i.isClosed() { + return + } + + // Record the time at which the most recent call finished. + atomic.StoreInt64(&i.lastCallEndTime, time.Now().UnixNano()) + + // Decrement the active calls count. This count can temporarily go negative + // when the timer callback is in the process of moving the channel to idle + // mode, but one or more RPCs come in and complete before the timer callback + // can get done with the process of moving to idle mode. + atomic.AddInt32(&i.activeCallsCount, -1) +} + +func (i *idlenessManagerImpl) isClosed() bool { + return atomic.LoadInt32(&i.closed) == 1 +} + +func (i *idlenessManagerImpl) close() { + atomic.StoreInt32(&i.closed, 1) + + i.idleMu.Lock() + i.timer.Stop() + i.timer = nil + i.idleMu.Unlock() +} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go b/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go index 809d73ccaf..755fdebc1b 100644 --- a/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go +++ b/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go @@ -28,8 +28,13 @@ import ( "google.golang.org/grpc/internal/grpcutil" ) -// Logger is the global binary logger. It can be used to get binary logger for -// each method. +var grpclogLogger = grpclog.Component("binarylog") + +// Logger specifies MethodLoggers for method names with a Log call that +// takes a context. +// +// This is used in the 1.0 release of gcp/observability, and thus must not be +// deleted or changed. type Logger interface { GetMethodLogger(methodName string) MethodLogger } @@ -40,8 +45,6 @@ type Logger interface { // It is used to get a MethodLogger for each individual method. var binLogger Logger -var grpclogLogger = grpclog.Component("binarylog") - // SetLogger sets the binary logger. // // Only call this at init time. diff --git a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go index 85e3ff2816..6c3f632215 100644 --- a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go +++ b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go @@ -19,6 +19,7 @@ package binarylog import ( + "context" "net" "strings" "sync/atomic" @@ -26,7 +27,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/golang/protobuf/ptypes" - pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" + binlogpb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" ) @@ -48,8 +49,11 @@ func (g *callIDGenerator) reset() { var idGen callIDGenerator // MethodLogger is the sub-logger for each method. +// +// This is used in the 1.0 release of gcp/observability, and thus must not be +// deleted or changed. type MethodLogger interface { - Log(LogEntryConfig) + Log(context.Context, LogEntryConfig) } // TruncatingMethodLogger is a method logger that truncates headers and messages @@ -64,6 +68,9 @@ type TruncatingMethodLogger struct { } // NewTruncatingMethodLogger returns a new truncating method logger. +// +// This is used in the 1.0 release of gcp/observability, and thus must not be +// deleted or changed. func NewTruncatingMethodLogger(h, m uint64) *TruncatingMethodLogger { return &TruncatingMethodLogger{ headerMaxLen: h, @@ -79,7 +86,7 @@ func NewTruncatingMethodLogger(h, m uint64) *TruncatingMethodLogger { // Build is an internal only method for building the proto message out of the // input event. It's made public to enable other library to reuse as much logic // in TruncatingMethodLogger as possible. -func (ml *TruncatingMethodLogger) Build(c LogEntryConfig) *pb.GrpcLogEntry { +func (ml *TruncatingMethodLogger) Build(c LogEntryConfig) *binlogpb.GrpcLogEntry { m := c.toProto() timestamp, _ := ptypes.TimestampProto(time.Now()) m.Timestamp = timestamp @@ -87,22 +94,22 @@ func (ml *TruncatingMethodLogger) Build(c LogEntryConfig) *pb.GrpcLogEntry { m.SequenceIdWithinCall = ml.idWithinCallGen.next() switch pay := m.Payload.(type) { - case *pb.GrpcLogEntry_ClientHeader: + case *binlogpb.GrpcLogEntry_ClientHeader: m.PayloadTruncated = ml.truncateMetadata(pay.ClientHeader.GetMetadata()) - case *pb.GrpcLogEntry_ServerHeader: + case *binlogpb.GrpcLogEntry_ServerHeader: m.PayloadTruncated = ml.truncateMetadata(pay.ServerHeader.GetMetadata()) - case *pb.GrpcLogEntry_Message: + case *binlogpb.GrpcLogEntry_Message: m.PayloadTruncated = ml.truncateMessage(pay.Message) } return m } // Log creates a proto binary log entry, and logs it to the sink. -func (ml *TruncatingMethodLogger) Log(c LogEntryConfig) { +func (ml *TruncatingMethodLogger) Log(ctx context.Context, c LogEntryConfig) { ml.sink.Write(ml.Build(c)) } -func (ml *TruncatingMethodLogger) truncateMetadata(mdPb *pb.Metadata) (truncated bool) { +func (ml *TruncatingMethodLogger) truncateMetadata(mdPb *binlogpb.Metadata) (truncated bool) { if ml.headerMaxLen == maxUInt { return false } @@ -132,7 +139,7 @@ func (ml *TruncatingMethodLogger) truncateMetadata(mdPb *pb.Metadata) (truncated return truncated } -func (ml *TruncatingMethodLogger) truncateMessage(msgPb *pb.Message) (truncated bool) { +func (ml *TruncatingMethodLogger) truncateMessage(msgPb *binlogpb.Message) (truncated bool) { if ml.messageMaxLen == maxUInt { return false } @@ -144,8 +151,11 @@ func (ml *TruncatingMethodLogger) truncateMessage(msgPb *pb.Message) (truncated } // LogEntryConfig represents the configuration for binary log entry. +// +// This is used in the 1.0 release of gcp/observability, and thus must not be +// deleted or changed. type LogEntryConfig interface { - toProto() *pb.GrpcLogEntry + toProto() *binlogpb.GrpcLogEntry } // ClientHeader configs the binary log entry to be a ClientHeader entry. @@ -159,10 +169,10 @@ type ClientHeader struct { PeerAddr net.Addr } -func (c *ClientHeader) toProto() *pb.GrpcLogEntry { +func (c *ClientHeader) toProto() *binlogpb.GrpcLogEntry { // This function doesn't need to set all the fields (e.g. seq ID). The Log // function will set the fields when necessary. - clientHeader := &pb.ClientHeader{ + clientHeader := &binlogpb.ClientHeader{ Metadata: mdToMetadataProto(c.Header), MethodName: c.MethodName, Authority: c.Authority, @@ -170,16 +180,16 @@ func (c *ClientHeader) toProto() *pb.GrpcLogEntry { if c.Timeout > 0 { clientHeader.Timeout = ptypes.DurationProto(c.Timeout) } - ret := &pb.GrpcLogEntry{ - Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_HEADER, - Payload: &pb.GrpcLogEntry_ClientHeader{ + ret := &binlogpb.GrpcLogEntry{ + Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CLIENT_HEADER, + Payload: &binlogpb.GrpcLogEntry_ClientHeader{ ClientHeader: clientHeader, }, } if c.OnClientSide { - ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT } else { - ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER } if c.PeerAddr != nil { ret.Peer = addrToProto(c.PeerAddr) @@ -195,19 +205,19 @@ type ServerHeader struct { PeerAddr net.Addr } -func (c *ServerHeader) toProto() *pb.GrpcLogEntry { - ret := &pb.GrpcLogEntry{ - Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_HEADER, - Payload: &pb.GrpcLogEntry_ServerHeader{ - ServerHeader: &pb.ServerHeader{ +func (c *ServerHeader) toProto() *binlogpb.GrpcLogEntry { + ret := &binlogpb.GrpcLogEntry{ + Type: binlogpb.GrpcLogEntry_EVENT_TYPE_SERVER_HEADER, + Payload: &binlogpb.GrpcLogEntry_ServerHeader{ + ServerHeader: &binlogpb.ServerHeader{ Metadata: mdToMetadataProto(c.Header), }, }, } if c.OnClientSide { - ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT } else { - ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER } if c.PeerAddr != nil { ret.Peer = addrToProto(c.PeerAddr) @@ -223,7 +233,7 @@ type ClientMessage struct { Message interface{} } -func (c *ClientMessage) toProto() *pb.GrpcLogEntry { +func (c *ClientMessage) toProto() *binlogpb.GrpcLogEntry { var ( data []byte err error @@ -238,19 +248,19 @@ func (c *ClientMessage) toProto() *pb.GrpcLogEntry { } else { grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte") } - ret := &pb.GrpcLogEntry{ - Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE, - Payload: &pb.GrpcLogEntry_Message{ - Message: &pb.Message{ + ret := &binlogpb.GrpcLogEntry{ + Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE, + Payload: &binlogpb.GrpcLogEntry_Message{ + Message: &binlogpb.Message{ Length: uint32(len(data)), Data: data, }, }, } if c.OnClientSide { - ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT } else { - ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER } return ret } @@ -263,7 +273,7 @@ type ServerMessage struct { Message interface{} } -func (c *ServerMessage) toProto() *pb.GrpcLogEntry { +func (c *ServerMessage) toProto() *binlogpb.GrpcLogEntry { var ( data []byte err error @@ -278,19 +288,19 @@ func (c *ServerMessage) toProto() *pb.GrpcLogEntry { } else { grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte") } - ret := &pb.GrpcLogEntry{ - Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE, - Payload: &pb.GrpcLogEntry_Message{ - Message: &pb.Message{ + ret := &binlogpb.GrpcLogEntry{ + Type: binlogpb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE, + Payload: &binlogpb.GrpcLogEntry_Message{ + Message: &binlogpb.Message{ Length: uint32(len(data)), Data: data, }, }, } if c.OnClientSide { - ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT } else { - ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER } return ret } @@ -300,15 +310,15 @@ type ClientHalfClose struct { OnClientSide bool } -func (c *ClientHalfClose) toProto() *pb.GrpcLogEntry { - ret := &pb.GrpcLogEntry{ - Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_HALF_CLOSE, +func (c *ClientHalfClose) toProto() *binlogpb.GrpcLogEntry { + ret := &binlogpb.GrpcLogEntry{ + Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CLIENT_HALF_CLOSE, Payload: nil, // No payload here. } if c.OnClientSide { - ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT } else { - ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER } return ret } @@ -324,7 +334,7 @@ type ServerTrailer struct { PeerAddr net.Addr } -func (c *ServerTrailer) toProto() *pb.GrpcLogEntry { +func (c *ServerTrailer) toProto() *binlogpb.GrpcLogEntry { st, ok := status.FromError(c.Err) if !ok { grpclogLogger.Info("binarylogging: error in trailer is not a status error") @@ -340,10 +350,10 @@ func (c *ServerTrailer) toProto() *pb.GrpcLogEntry { grpclogLogger.Infof("binarylogging: failed to marshal status proto: %v", err) } } - ret := &pb.GrpcLogEntry{ - Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_TRAILER, - Payload: &pb.GrpcLogEntry_Trailer{ - Trailer: &pb.Trailer{ + ret := &binlogpb.GrpcLogEntry{ + Type: binlogpb.GrpcLogEntry_EVENT_TYPE_SERVER_TRAILER, + Payload: &binlogpb.GrpcLogEntry_Trailer{ + Trailer: &binlogpb.Trailer{ Metadata: mdToMetadataProto(c.Trailer), StatusCode: uint32(st.Code()), StatusMessage: st.Message(), @@ -352,9 +362,9 @@ func (c *ServerTrailer) toProto() *pb.GrpcLogEntry { }, } if c.OnClientSide { - ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT } else { - ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER } if c.PeerAddr != nil { ret.Peer = addrToProto(c.PeerAddr) @@ -367,15 +377,15 @@ type Cancel struct { OnClientSide bool } -func (c *Cancel) toProto() *pb.GrpcLogEntry { - ret := &pb.GrpcLogEntry{ - Type: pb.GrpcLogEntry_EVENT_TYPE_CANCEL, +func (c *Cancel) toProto() *binlogpb.GrpcLogEntry { + ret := &binlogpb.GrpcLogEntry{ + Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CANCEL, Payload: nil, } if c.OnClientSide { - ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT } else { - ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER } return ret } @@ -392,15 +402,15 @@ func metadataKeyOmit(key string) bool { return strings.HasPrefix(key, "grpc-") } -func mdToMetadataProto(md metadata.MD) *pb.Metadata { - ret := &pb.Metadata{} +func mdToMetadataProto(md metadata.MD) *binlogpb.Metadata { + ret := &binlogpb.Metadata{} for k, vv := range md { if metadataKeyOmit(k) { continue } for _, v := range vv { ret.Entry = append(ret.Entry, - &pb.MetadataEntry{ + &binlogpb.MetadataEntry{ Key: k, Value: []byte(v), }, @@ -410,26 +420,26 @@ func mdToMetadataProto(md metadata.MD) *pb.Metadata { return ret } -func addrToProto(addr net.Addr) *pb.Address { - ret := &pb.Address{} +func addrToProto(addr net.Addr) *binlogpb.Address { + ret := &binlogpb.Address{} switch a := addr.(type) { case *net.TCPAddr: if a.IP.To4() != nil { - ret.Type = pb.Address_TYPE_IPV4 + ret.Type = binlogpb.Address_TYPE_IPV4 } else if a.IP.To16() != nil { - ret.Type = pb.Address_TYPE_IPV6 + ret.Type = binlogpb.Address_TYPE_IPV6 } else { - ret.Type = pb.Address_TYPE_UNKNOWN + ret.Type = binlogpb.Address_TYPE_UNKNOWN // Do not set address and port fields. break } ret.Address = a.IP.String() ret.IpPort = uint32(a.Port) case *net.UnixAddr: - ret.Type = pb.Address_TYPE_UNIX + ret.Type = binlogpb.Address_TYPE_UNIX ret.Address = a.String() default: - ret.Type = pb.Address_TYPE_UNKNOWN + ret.Type = binlogpb.Address_TYPE_UNKNOWN } return ret } diff --git a/vendor/google.golang.org/grpc/internal/binarylog/sink.go b/vendor/google.golang.org/grpc/internal/binarylog/sink.go index c2fdd58b31..264de387c2 100644 --- a/vendor/google.golang.org/grpc/internal/binarylog/sink.go +++ b/vendor/google.golang.org/grpc/internal/binarylog/sink.go @@ -26,7 +26,7 @@ import ( "time" "github.com/golang/protobuf/proto" - pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" + binlogpb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" ) var ( @@ -42,15 +42,15 @@ type Sink interface { // Write will be called to write the log entry into the sink. // // It should be thread-safe so it can be called in parallel. - Write(*pb.GrpcLogEntry) error + Write(*binlogpb.GrpcLogEntry) error // Close will be called when the Sink is replaced by a new Sink. Close() error } type noopSink struct{} -func (ns *noopSink) Write(*pb.GrpcLogEntry) error { return nil } -func (ns *noopSink) Close() error { return nil } +func (ns *noopSink) Write(*binlogpb.GrpcLogEntry) error { return nil } +func (ns *noopSink) Close() error { return nil } // newWriterSink creates a binary log sink with the given writer. // @@ -66,7 +66,7 @@ type writerSink struct { out io.Writer } -func (ws *writerSink) Write(e *pb.GrpcLogEntry) error { +func (ws *writerSink) Write(e *binlogpb.GrpcLogEntry) error { b, err := proto.Marshal(e) if err != nil { grpclogLogger.Errorf("binary logging: failed to marshal proto message: %v", err) @@ -96,7 +96,7 @@ type bufferedSink struct { done chan struct{} } -func (fs *bufferedSink) Write(e *pb.GrpcLogEntry) error { +func (fs *bufferedSink) Write(e *binlogpb.GrpcLogEntry) error { fs.mu.Lock() defer fs.mu.Unlock() if !fs.flusherStarted { diff --git a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go index 9f6a0c1200..81c2f5fd76 100644 --- a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go +++ b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go @@ -35,6 +35,7 @@ import "sync" // internal/transport/transport.go for an example of this. type Unbounded struct { c chan interface{} + closed bool mu sync.Mutex backlog []interface{} } @@ -47,16 +48,18 @@ func NewUnbounded() *Unbounded { // Put adds t to the unbounded buffer. func (b *Unbounded) Put(t interface{}) { b.mu.Lock() + defer b.mu.Unlock() + if b.closed { + return + } if len(b.backlog) == 0 { select { case b.c <- t: - b.mu.Unlock() return default: } } b.backlog = append(b.backlog, t) - b.mu.Unlock() } // Load sends the earliest buffered data, if any, onto the read channel @@ -64,6 +67,10 @@ func (b *Unbounded) Put(t interface{}) { // value from the read channel. func (b *Unbounded) Load() { b.mu.Lock() + defer b.mu.Unlock() + if b.closed { + return + } if len(b.backlog) > 0 { select { case b.c <- b.backlog[0]: @@ -72,7 +79,6 @@ func (b *Unbounded) Load() { default: } } - b.mu.Unlock() } // Get returns a read channel on which values added to the buffer, via Put(), @@ -80,6 +86,20 @@ func (b *Unbounded) Load() { // // Upon reading a value from this channel, users are expected to call Load() to // send the next buffered value onto the channel if there is any. +// +// If the unbounded buffer is closed, the read channel returned by this method +// is closed. func (b *Unbounded) Get() <-chan interface{} { return b.c } + +// Close closes the unbounded buffer. +func (b *Unbounded) Close() { + b.mu.Lock() + defer b.mu.Unlock() + if b.closed { + return + } + b.closed = true + close(b.c) +} diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go index 7edd196bd3..80fd5c7d2a 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -21,19 +21,46 @@ package envconfig import ( "os" + "strconv" "strings" ) -const ( - prefix = "GRPC_GO_" - txtErrIgnoreStr = prefix + "IGNORE_TXT_ERRORS" - advertiseCompressorsStr = prefix + "ADVERTISE_COMPRESSORS" -) - var ( // TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). - TXTErrIgnore = !strings.EqualFold(os.Getenv(txtErrIgnoreStr), "false") + TXTErrIgnore = boolFromEnv("GRPC_GO_IGNORE_TXT_ERRORS", true) // AdvertiseCompressors is set if registered compressor should be advertised // ("GRPC_GO_ADVERTISE_COMPRESSORS" is not "false"). - AdvertiseCompressors = !strings.EqualFold(os.Getenv(advertiseCompressorsStr), "false") + AdvertiseCompressors = boolFromEnv("GRPC_GO_ADVERTISE_COMPRESSORS", true) + // RingHashCap indicates the maximum ring size which defaults to 4096 + // entries but may be overridden by setting the environment variable + // "GRPC_RING_HASH_CAP". This does not override the default bounds + // checking which NACKs configs specifying ring sizes > 8*1024*1024 (~8M). + RingHashCap = uint64FromEnv("GRPC_RING_HASH_CAP", 4096, 1, 8*1024*1024) + // PickFirstLBConfig is set if we should support configuration of the + // pick_first LB policy, which can be enabled by setting the environment + // variable "GRPC_EXPERIMENTAL_PICKFIRST_LB_CONFIG" to "true". + PickFirstLBConfig = boolFromEnv("GRPC_EXPERIMENTAL_PICKFIRST_LB_CONFIG", false) ) + +func boolFromEnv(envVar string, def bool) bool { + if def { + // The default is true; return true unless the variable is "false". + return !strings.EqualFold(os.Getenv(envVar), "false") + } + // The default is false; return false unless the variable is "true". + return strings.EqualFold(os.Getenv(envVar), "true") +} + +func uint64FromEnv(envVar string, def, min, max uint64) uint64 { + v, err := strconv.ParseUint(os.Getenv(envVar), 10, 64) + if err != nil { + return def + } + if v < min { + return min + } + if v > max { + return max + } + return v +} diff --git a/vendor/google.golang.org/grpc/internal/envconfig/observability.go b/vendor/google.golang.org/grpc/internal/envconfig/observability.go index 821dd0a7c1..dd314cfb18 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/observability.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/observability.go @@ -28,9 +28,15 @@ const ( var ( // ObservabilityConfig is the json configuration for the gcp/observability // package specified directly in the envObservabilityConfig env var. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. ObservabilityConfig = os.Getenv(envObservabilityConfig) // ObservabilityConfigFile is the json configuration for the // gcp/observability specified in a file with the location specified in // envObservabilityConfigFile env var. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. ObservabilityConfigFile = os.Getenv(envObservabilityConfigFile) ) diff --git a/vendor/google.golang.org/grpc/internal/envconfig/xds.go b/vendor/google.golang.org/grpc/internal/envconfig/xds.go index af09711a3e..02b4b6a1c1 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/xds.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/xds.go @@ -20,7 +20,6 @@ package envconfig import ( "os" - "strings" ) const ( @@ -36,16 +35,6 @@ const ( // // When both bootstrap FileName and FileContent are set, FileName is used. XDSBootstrapFileContentEnv = "GRPC_XDS_BOOTSTRAP_CONFIG" - - ringHashSupportEnv = "GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH" - clientSideSecuritySupportEnv = "GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT" - aggregateAndDNSSupportEnv = "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER" - rbacSupportEnv = "GRPC_XDS_EXPERIMENTAL_RBAC" - outlierDetectionSupportEnv = "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION" - federationEnv = "GRPC_EXPERIMENTAL_XDS_FEDERATION" - rlsInXDSEnv = "GRPC_EXPERIMENTAL_XDS_RLS_LB" - - c2pResolverTestOnlyTrafficDirectorURIEnv = "GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI" ) var ( @@ -64,38 +53,43 @@ var ( // XDSRingHash indicates whether ring hash support is enabled, which can be // disabled by setting the environment variable // "GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH" to "false". - XDSRingHash = !strings.EqualFold(os.Getenv(ringHashSupportEnv), "false") + XDSRingHash = boolFromEnv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", true) // XDSClientSideSecurity is used to control processing of security // configuration on the client-side. // // Note that there is no env var protection for the server-side because we // have a brand new API on the server-side and users explicitly need to use // the new API to get security integration on the server. - XDSClientSideSecurity = !strings.EqualFold(os.Getenv(clientSideSecuritySupportEnv), "false") - // XDSAggregateAndDNS indicates whether processing of aggregated cluster - // and DNS cluster is enabled, which can be enabled by setting the - // environment variable - // "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER" to - // "true". - XDSAggregateAndDNS = !strings.EqualFold(os.Getenv(aggregateAndDNSSupportEnv), "false") + XDSClientSideSecurity = boolFromEnv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT", true) + // XDSAggregateAndDNS indicates whether processing of aggregated cluster and + // DNS cluster is enabled, which can be disabled by setting the environment + // variable "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER" + // to "false". + XDSAggregateAndDNS = boolFromEnv("GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER", true) // XDSRBAC indicates whether xDS configured RBAC HTTP Filter is enabled, // which can be disabled by setting the environment variable // "GRPC_XDS_EXPERIMENTAL_RBAC" to "false". - XDSRBAC = !strings.EqualFold(os.Getenv(rbacSupportEnv), "false") + XDSRBAC = boolFromEnv("GRPC_XDS_EXPERIMENTAL_RBAC", true) // XDSOutlierDetection indicates whether outlier detection support is // enabled, which can be disabled by setting the environment variable // "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION" to "false". - XDSOutlierDetection = !strings.EqualFold(os.Getenv(outlierDetectionSupportEnv), "false") - // XDSFederation indicates whether federation support is enabled. - XDSFederation = strings.EqualFold(os.Getenv(federationEnv), "true") + XDSOutlierDetection = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION", true) + // XDSFederation indicates whether federation support is enabled, which can + // be enabled by setting the environment variable + // "GRPC_EXPERIMENTAL_XDS_FEDERATION" to "true". + XDSFederation = boolFromEnv("GRPC_EXPERIMENTAL_XDS_FEDERATION", true) // XDSRLS indicates whether processing of Cluster Specifier plugins and - // support for the RLS CLuster Specifier is enabled, which can be enabled by + // support for the RLS CLuster Specifier is enabled, which can be disabled by // setting the environment variable "GRPC_EXPERIMENTAL_XDS_RLS_LB" to - // "true". - XDSRLS = strings.EqualFold(os.Getenv(rlsInXDSEnv), "true") + // "false". + XDSRLS = boolFromEnv("GRPC_EXPERIMENTAL_XDS_RLS_LB", true) // C2PResolverTestOnlyTrafficDirectorURI is the TD URI for testing. - C2PResolverTestOnlyTrafficDirectorURI = os.Getenv(c2pResolverTestOnlyTrafficDirectorURIEnv) + C2PResolverTestOnlyTrafficDirectorURI = os.Getenv("GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI") + // XDSCustomLBPolicy indicates whether Custom LB Policies are enabled, which + // can be disabled by setting the environment variable + // "GRPC_EXPERIMENTAL_XDS_CUSTOM_LB_CONFIG" to "false". + XDSCustomLBPolicy = boolFromEnv("GRPC_EXPERIMENTAL_XDS_CUSTOM_LB_CONFIG", true) ) diff --git a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go b/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go index 82af70e96f..02224b42ca 100644 --- a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go +++ b/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go @@ -63,6 +63,9 @@ func (pl *PrefixLogger) Errorf(format string, args ...interface{}) { // Debugf does info logging at verbose level 2. func (pl *PrefixLogger) Debugf(format string, args ...interface{}) { + // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe + // rewrite PrefixLogger a little to ensure that we don't use the global + // `Logger` here, and instead use the `logger` field. if !Logger.V(2) { return } @@ -73,6 +76,15 @@ func (pl *PrefixLogger) Debugf(format string, args ...interface{}) { return } InfoDepth(1, fmt.Sprintf(format, args...)) + +} + +// V reports whether verbosity level l is at least the requested verbose level. +func (pl *PrefixLogger) V(l int) bool { + // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe + // rewrite PrefixLogger a little to ensure that we don't use the global + // `Logger` here, and instead use the `logger` field. + return Logger.V(l) } // NewPrefixLogger creates a prefix logger with the given prefix. diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go index 517ea70642..d08e3e9076 100644 --- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go +++ b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go @@ -72,3 +72,17 @@ func Uint64() uint64 { defer mu.Unlock() return r.Uint64() } + +// Uint32 implements rand.Uint32 on the grpcrand global source. +func Uint32() uint32 { + mu.Lock() + defer mu.Unlock() + return r.Uint32() +} + +// Shuffle implements rand.Shuffle on the grpcrand global source. +var Shuffle = func(n int, f func(int, int)) { + mu.Lock() + defer mu.Unlock() + r.Shuffle(n, f) +} diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go new file mode 100644 index 0000000000..37b8d4117e --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go @@ -0,0 +1,119 @@ +/* + * + * Copyright 2022 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 grpcsync + +import ( + "context" + "sync" + + "google.golang.org/grpc/internal/buffer" +) + +// CallbackSerializer provides a mechanism to schedule callbacks in a +// synchronized manner. It provides a FIFO guarantee on the order of execution +// of scheduled callbacks. New callbacks can be scheduled by invoking the +// Schedule() method. +// +// This type is safe for concurrent access. +type CallbackSerializer struct { + // Done is closed once the serializer is shut down completely, i.e all + // scheduled callbacks are executed and the serializer has deallocated all + // its resources. + Done chan struct{} + + callbacks *buffer.Unbounded + closedMu sync.Mutex + closed bool +} + +// NewCallbackSerializer returns a new CallbackSerializer instance. The provided +// context will be passed to the scheduled callbacks. Users should cancel the +// provided context to shutdown the CallbackSerializer. It is guaranteed that no +// callbacks will be added once this context is canceled, and any pending un-run +// callbacks will be executed before the serializer is shut down. +func NewCallbackSerializer(ctx context.Context) *CallbackSerializer { + t := &CallbackSerializer{ + Done: make(chan struct{}), + callbacks: buffer.NewUnbounded(), + } + go t.run(ctx) + return t +} + +// Schedule adds a callback to be scheduled after existing callbacks are run. +// +// Callbacks are expected to honor the context when performing any blocking +// operations, and should return early when the context is canceled. +// +// Return value indicates if the callback was successfully added to the list of +// callbacks to be executed by the serializer. It is not possible to add +// callbacks once the context passed to NewCallbackSerializer is cancelled. +func (t *CallbackSerializer) Schedule(f func(ctx context.Context)) bool { + t.closedMu.Lock() + defer t.closedMu.Unlock() + + if t.closed { + return false + } + t.callbacks.Put(f) + return true +} + +func (t *CallbackSerializer) run(ctx context.Context) { + var backlog []func(context.Context) + + defer close(t.Done) + for ctx.Err() == nil { + select { + case <-ctx.Done(): + // Do nothing here. Next iteration of the for loop will not happen, + // since ctx.Err() would be non-nil. + case callback, ok := <-t.callbacks.Get(): + if !ok { + return + } + t.callbacks.Load() + callback.(func(ctx context.Context))(ctx) + } + } + + // Fetch pending callbacks if any, and execute them before returning from + // this method and closing t.Done. + t.closedMu.Lock() + t.closed = true + backlog = t.fetchPendingCallbacks() + t.callbacks.Close() + t.closedMu.Unlock() + for _, b := range backlog { + b(ctx) + } +} + +func (t *CallbackSerializer) fetchPendingCallbacks() []func(context.Context) { + var backlog []func(context.Context) + for { + select { + case b := <-t.callbacks.Get(): + backlog = append(backlog, b.(func(context.Context))) + t.callbacks.Load() + default: + return backlog + } + } +} diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index fd0ee3dcaf..42ff39c844 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -58,6 +58,12 @@ var ( // gRPC server. An xDS-enabled server needs to know what type of credentials // is configured on the underlying gRPC server. This is set by server.go. GetServerCredentials interface{} // func (*grpc.Server) credentials.TransportCredentials + // CanonicalString returns the canonical string of the code defined here: + // https://github.com/grpc/grpc/blob/master/doc/statuscodes.md. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. + CanonicalString interface{} // func (codes.Code) string // DrainServerTransports initiates a graceful close of existing connections // on a gRPC server accepted on the provided listener address. An // xDS-enabled server invokes this method on a grpc.Server when a particular @@ -66,26 +72,54 @@ var ( // AddGlobalServerOptions adds an array of ServerOption that will be // effective globally for newly created servers. The priority will be: 1. // user-provided; 2. this method; 3. default values. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. AddGlobalServerOptions interface{} // func(opt ...ServerOption) // ClearGlobalServerOptions clears the array of extra ServerOption. This // method is useful in testing and benchmarking. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. ClearGlobalServerOptions func() // AddGlobalDialOptions adds an array of DialOption that will be effective // globally for newly created client channels. The priority will be: 1. // user-provided; 2. this method; 3. default values. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. AddGlobalDialOptions interface{} // func(opt ...DialOption) + // DisableGlobalDialOptions returns a DialOption that prevents the + // ClientConn from applying the global DialOptions (set via + // AddGlobalDialOptions). + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. + DisableGlobalDialOptions interface{} // func() grpc.DialOption // ClearGlobalDialOptions clears the array of extra DialOption. This // method is useful in testing and benchmarking. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. ClearGlobalDialOptions func() + // JoinDialOptions combines the dial options passed as arguments into a + // single dial option. + JoinDialOptions interface{} // func(...grpc.DialOption) grpc.DialOption // JoinServerOptions combines the server options passed as arguments into a // single server option. JoinServerOptions interface{} // func(...grpc.ServerOption) grpc.ServerOption // WithBinaryLogger returns a DialOption that specifies the binary logger // for a ClientConn. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. WithBinaryLogger interface{} // func(binarylog.Logger) grpc.DialOption // BinaryLogger returns a ServerOption that can set the binary logger for a // server. + // + // This is used in the 1.0 release of gcp/observability, and thus must not be + // deleted or changed. BinaryLogger interface{} // func(binarylog.Logger) grpc.ServerOption // NewXDSResolverWithConfigForTesting creates a new xds resolver builder using @@ -127,6 +161,9 @@ var ( // // TODO: Remove this function once the RBAC env var is removed. UnregisterRBACHTTPFilterForTesting func() + + // ORCAAllowAnyMinReportingInterval is for examples/orca use ONLY. + ORCAAllowAnyMinReportingInterval interface{} // func(so *orca.ServiceOptions) ) // HealthChecker defines the signature of the client-side LB channel health checking function. diff --git a/vendor/google.golang.org/grpc/internal/metadata/metadata.go b/vendor/google.golang.org/grpc/internal/metadata/metadata.go index b2980f8ac4..c82e608e07 100644 --- a/vendor/google.golang.org/grpc/internal/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/internal/metadata/metadata.go @@ -76,33 +76,11 @@ func Set(addr resolver.Address, md metadata.MD) resolver.Address { return addr } -// Validate returns an error if the input md contains invalid keys or values. -// -// If the header is not a pseudo-header, the following items are checked: -// - header names must contain one or more characters from this set [0-9 a-z _ - .]. -// - if the header-name ends with a "-bin" suffix, no validation of the header value is performed. -// - otherwise, the header value must contain one or more characters from the set [%x20-%x7E]. +// Validate validates every pair in md with ValidatePair. func Validate(md metadata.MD) error { for k, vals := range md { - // pseudo-header will be ignored - if k[0] == ':' { - continue - } - // check key, for i that saving a conversion if not using for range - for i := 0; i < len(k); i++ { - r := k[i] - if !(r >= 'a' && r <= 'z') && !(r >= '0' && r <= '9') && r != '.' && r != '-' && r != '_' { - return fmt.Errorf("header key %q contains illegal characters not in [0-9a-z-_.]", k) - } - } - if strings.HasSuffix(k, "-bin") { - continue - } - // check value - for _, val := range vals { - if hasNotPrintable(val) { - return fmt.Errorf("header key %q contains value with non-printable ASCII characters", k) - } + if err := ValidatePair(k, vals...); err != nil { + return err } } return nil @@ -118,3 +96,37 @@ func hasNotPrintable(msg string) bool { } return false } + +// ValidatePair validate a key-value pair with the following rules (the pseudo-header will be skipped) : +// +// - key must contain one or more characters. +// - the characters in the key must be contained in [0-9 a-z _ - .]. +// - if the key ends with a "-bin" suffix, no validation of the corresponding value is performed. +// - the characters in the every value must be printable (in [%x20-%x7E]). +func ValidatePair(key string, vals ...string) error { + // key should not be empty + if key == "" { + return fmt.Errorf("there is an empty key in the header") + } + // pseudo-header will be ignored + if key[0] == ':' { + return nil + } + // check key, for i that saving a conversion if not using for range + for i := 0; i < len(key); i++ { + r := key[i] + if !(r >= 'a' && r <= 'z') && !(r >= '0' && r <= '9') && r != '.' && r != '-' && r != '_' { + return fmt.Errorf("header key %q contains illegal characters not in [0-9a-z-_.]", key) + } + } + if strings.HasSuffix(key, "-bin") { + return nil + } + // check value + for _, val := range vals { + if hasNotPrintable(val) { + return fmt.Errorf("header key %q contains value with non-printable ASCII characters", key) + } + } + return nil +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go index b08ac30adf..09a667f33c 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go @@ -116,7 +116,7 @@ type dnsBuilder struct{} // Build creates and starts a DNS resolver that watches the name resolution of the target. func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { - host, port, err := parseTarget(target.Endpoint, defaultPort) + host, port, err := parseTarget(target.Endpoint(), defaultPort) if err != nil { return nil, err } diff --git a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go index c6e08221ff..afac56572a 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go +++ b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go @@ -31,7 +31,7 @@ const scheme = "passthrough" type passthroughBuilder struct{} func (*passthroughBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { - if target.Endpoint == "" && opts.Dialer == nil { + if target.Endpoint() == "" && opts.Dialer == nil { return nil, errors.New("passthrough: received empty target in Build()") } r := &passthroughResolver{ @@ -52,7 +52,7 @@ type passthroughResolver struct { } func (r *passthroughResolver) start() { - r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint}}}) + r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint()}}}) } func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOptions) {} diff --git a/vendor/google.golang.org/grpc/internal/serviceconfig/duration.go b/vendor/google.golang.org/grpc/internal/serviceconfig/duration.go new file mode 100644 index 0000000000..11d82afcc7 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/serviceconfig/duration.go @@ -0,0 +1,130 @@ +/* + * + * Copyright 2023 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 serviceconfig + +import ( + "encoding/json" + "fmt" + "math" + "strconv" + "strings" + "time" +) + +// Duration defines JSON marshal and unmarshal methods to conform to the +// protobuf JSON spec defined [here]. +// +// [here]: https://protobuf.dev/reference/protobuf/google.protobuf/#duration +type Duration time.Duration + +func (d Duration) String() string { + return fmt.Sprint(time.Duration(d)) +} + +// MarshalJSON converts from d to a JSON string output. +func (d Duration) MarshalJSON() ([]byte, error) { + ns := time.Duration(d).Nanoseconds() + sec := ns / int64(time.Second) + ns = ns % int64(time.Second) + + var sign string + if sec < 0 || ns < 0 { + sign, sec, ns = "-", -1*sec, -1*ns + } + + // Generated output always contains 0, 3, 6, or 9 fractional digits, + // depending on required precision. + str := fmt.Sprintf("%s%d.%09d", sign, sec, ns) + str = strings.TrimSuffix(str, "000") + str = strings.TrimSuffix(str, "000") + str = strings.TrimSuffix(str, ".000") + return []byte(fmt.Sprintf("\"%ss\"", str)), nil +} + +// UnmarshalJSON unmarshals b as a duration JSON string into d. +func (d *Duration) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if !strings.HasSuffix(s, "s") { + return fmt.Errorf("malformed duration %q: missing seconds unit", s) + } + neg := false + if s[0] == '-' { + neg = true + s = s[1:] + } + ss := strings.SplitN(s[:len(s)-1], ".", 3) + if len(ss) > 2 { + return fmt.Errorf("malformed duration %q: too many decimals", s) + } + // hasDigits is set if either the whole or fractional part of the number is + // present, since both are optional but one is required. + hasDigits := false + var sec, ns int64 + if len(ss[0]) > 0 { + var err error + if sec, err = strconv.ParseInt(ss[0], 10, 64); err != nil { + return fmt.Errorf("malformed duration %q: %v", s, err) + } + // Maximum seconds value per the durationpb spec. + const maxProtoSeconds = 315_576_000_000 + if sec > maxProtoSeconds { + return fmt.Errorf("out of range: %q", s) + } + hasDigits = true + } + if len(ss) == 2 && len(ss[1]) > 0 { + if len(ss[1]) > 9 { + return fmt.Errorf("malformed duration %q: too many digits after decimal", s) + } + var err error + if ns, err = strconv.ParseInt(ss[1], 10, 64); err != nil { + return fmt.Errorf("malformed duration %q: %v", s, err) + } + for i := 9; i > len(ss[1]); i-- { + ns *= 10 + } + hasDigits = true + } + if !hasDigits { + return fmt.Errorf("malformed duration %q: contains no numbers", s) + } + + if neg { + sec *= -1 + ns *= -1 + } + + // Maximum/minimum seconds/nanoseconds representable by Go's time.Duration. + const maxSeconds = math.MaxInt64 / int64(time.Second) + const maxNanosAtMaxSeconds = math.MaxInt64 % int64(time.Second) + const minSeconds = math.MinInt64 / int64(time.Second) + const minNanosAtMinSeconds = math.MinInt64 % int64(time.Second) + + if sec > maxSeconds || (sec == maxSeconds && ns >= maxNanosAtMaxSeconds) { + *d = Duration(math.MaxInt64) + } else if sec < minSeconds || (sec == minSeconds && ns <= minNanosAtMinSeconds) { + *d = Duration(math.MinInt64) + } else { + *d = Duration(sec*int64(time.Second) + ns) + } + return nil +} diff --git a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go index aaa9c859a3..be5a9c81eb 100644 --- a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go +++ b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go @@ -22,6 +22,7 @@ import ( "bytes" "errors" "fmt" + "net" "runtime" "strconv" "sync" @@ -29,6 +30,7 @@ import ( "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" + "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" "google.golang.org/grpc/status" ) @@ -486,12 +488,14 @@ type loopyWriter struct { hEnc *hpack.Encoder // HPACK encoder. bdpEst *bdpEstimator draining bool + conn net.Conn + logger *grpclog.PrefixLogger // Side-specific handlers ssGoAwayHandler func(*goAway) (bool, error) } -func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator) *loopyWriter { +func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger) *loopyWriter { var buf bytes.Buffer l := &loopyWriter{ side: s, @@ -504,6 +508,8 @@ func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimato hBuf: &buf, hEnc: hpack.NewEncoder(&buf), bdpEst: bdpEst, + conn: conn, + logger: logger, } return l } @@ -521,12 +527,27 @@ const minBatchSize = 1000 // 2. Stream level flow control quota available. // // In each iteration of run loop, other than processing the incoming control -// frame, loopy calls processData, which processes one node from the activeStreams linked-list. -// This results in writing of HTTP2 frames into an underlying write buffer. -// When there's no more control frames to read from controlBuf, loopy flushes the write buffer. -// As an optimization, to increase the batch size for each flush, loopy yields the processor, once -// if the batch size is too low to give stream goroutines a chance to fill it up. +// frame, loopy calls processData, which processes one node from the +// activeStreams linked-list. This results in writing of HTTP2 frames into an +// underlying write buffer. When there's no more control frames to read from +// controlBuf, loopy flushes the write buffer. As an optimization, to increase +// the batch size for each flush, loopy yields the processor, once if the batch +// size is too low to give stream goroutines a chance to fill it up. +// +// Upon exiting, if the error causing the exit is not an I/O error, run() +// flushes and closes the underlying connection. Otherwise, the connection is +// left open to allow the I/O error to be encountered by the reader instead. func (l *loopyWriter) run() (err error) { + defer func() { + if l.logger.V(logLevel) { + l.logger.Infof("loopyWriter exiting with error: %v", err) + } + if !isIOError(err) { + l.framer.writer.Flush() + l.conn.Close() + } + l.cbuf.finish() + }() for { it, err := l.cbuf.get(true) if err != nil { @@ -578,11 +599,11 @@ func (l *loopyWriter) outgoingWindowUpdateHandler(w *outgoingWindowUpdate) error return l.framer.fr.WriteWindowUpdate(w.streamID, w.increment) } -func (l *loopyWriter) incomingWindowUpdateHandler(w *incomingWindowUpdate) error { +func (l *loopyWriter) incomingWindowUpdateHandler(w *incomingWindowUpdate) { // Otherwise update the quota. if w.streamID == 0 { l.sendQuota += w.increment - return nil + return } // Find the stream and update it. if str, ok := l.estdStreams[w.streamID]; ok { @@ -590,10 +611,9 @@ func (l *loopyWriter) incomingWindowUpdateHandler(w *incomingWindowUpdate) error if strQuota := int(l.oiws) - str.bytesOutStanding; strQuota > 0 && str.state == waitingOnStreamQuota { str.state = active l.activeStreams.enqueue(str) - return nil + return } } - return nil } func (l *loopyWriter) outgoingSettingsHandler(s *outgoingSettings) error { @@ -601,13 +621,11 @@ func (l *loopyWriter) outgoingSettingsHandler(s *outgoingSettings) error { } func (l *loopyWriter) incomingSettingsHandler(s *incomingSettings) error { - if err := l.applySettings(s.ss); err != nil { - return err - } + l.applySettings(s.ss) return l.framer.fr.WriteSettingsAck() } -func (l *loopyWriter) registerStreamHandler(h *registerStream) error { +func (l *loopyWriter) registerStreamHandler(h *registerStream) { str := &outStream{ id: h.streamID, state: empty, @@ -615,15 +633,14 @@ func (l *loopyWriter) registerStreamHandler(h *registerStream) error { wq: h.wq, } l.estdStreams[h.streamID] = str - return nil } func (l *loopyWriter) headerHandler(h *headerFrame) error { if l.side == serverSide { str, ok := l.estdStreams[h.streamID] if !ok { - if logger.V(logLevel) { - logger.Warningf("transport: loopy doesn't recognize the stream: %d", h.streamID) + if l.logger.V(logLevel) { + l.logger.Infof("Unrecognized streamID %d in loopyWriter", h.streamID) } return nil } @@ -650,16 +667,18 @@ func (l *loopyWriter) headerHandler(h *headerFrame) error { itl: &itemList{}, wq: h.wq, } - str.itl.enqueue(h) - return l.originateStream(str) + return l.originateStream(str, h) } -func (l *loopyWriter) originateStream(str *outStream) error { - hdr := str.itl.dequeue().(*headerFrame) +func (l *loopyWriter) originateStream(str *outStream, hdr *headerFrame) error { + // l.draining is set when handling GoAway. In which case, we want to avoid + // creating new streams. + if l.draining { + // TODO: provide a better error with the reason we are in draining. + hdr.onOrphaned(errStreamDrain) + return nil + } if err := hdr.initStream(str.id); err != nil { - if err == errStreamDrain { // errStreamDrain need not close transport - return nil - } return err } if err := l.writeHeader(str.id, hdr.endStream, hdr.hf, hdr.onWrite); err != nil { @@ -676,8 +695,8 @@ func (l *loopyWriter) writeHeader(streamID uint32, endStream bool, hf []hpack.He l.hBuf.Reset() for _, f := range hf { if err := l.hEnc.WriteField(f); err != nil { - if logger.V(logLevel) { - logger.Warningf("transport: loopyWriter.writeHeader encountered error while encoding headers: %v", err) + if l.logger.V(logLevel) { + l.logger.Warningf("Encountered error while encoding headers: %v", err) } } } @@ -715,10 +734,10 @@ func (l *loopyWriter) writeHeader(streamID uint32, endStream bool, hf []hpack.He return nil } -func (l *loopyWriter) preprocessData(df *dataFrame) error { +func (l *loopyWriter) preprocessData(df *dataFrame) { str, ok := l.estdStreams[df.streamID] if !ok { - return nil + return } // If we got data for a stream it means that // stream was originated and the headers were sent out. @@ -727,7 +746,6 @@ func (l *loopyWriter) preprocessData(df *dataFrame) error { str.state = active l.activeStreams.enqueue(str) } - return nil } func (l *loopyWriter) pingHandler(p *ping) error { @@ -738,9 +756,8 @@ func (l *loopyWriter) pingHandler(p *ping) error { } -func (l *loopyWriter) outFlowControlSizeRequestHandler(o *outFlowControlSizeRequest) error { +func (l *loopyWriter) outFlowControlSizeRequestHandler(o *outFlowControlSizeRequest) { o.resp <- l.sendQuota - return nil } func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { @@ -757,7 +774,8 @@ func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { return err } } - if l.side == clientSide && l.draining && len(l.estdStreams) == 0 { + if l.draining && len(l.estdStreams) == 0 { + // Flush and close the connection; we are done with it. return errors.New("finished processing active streams while in draining mode") } return nil @@ -793,6 +811,7 @@ func (l *loopyWriter) incomingGoAwayHandler(*incomingGoAway) error { if l.side == clientSide { l.draining = true if len(l.estdStreams) == 0 { + // Flush and close the connection; we are done with it. return errors.New("received GOAWAY with no active streams") } } @@ -811,18 +830,10 @@ func (l *loopyWriter) goAwayHandler(g *goAway) error { return nil } -func (l *loopyWriter) closeConnectionHandler() error { - l.framer.writer.Flush() - // Exit loopyWriter entirely by returning an error here. This will lead to - // the transport closing the connection, and, ultimately, transport - // closure. - return ErrConnClosing -} - func (l *loopyWriter) handle(i interface{}) error { switch i := i.(type) { case *incomingWindowUpdate: - return l.incomingWindowUpdateHandler(i) + l.incomingWindowUpdateHandler(i) case *outgoingWindowUpdate: return l.outgoingWindowUpdateHandler(i) case *incomingSettings: @@ -832,7 +843,7 @@ func (l *loopyWriter) handle(i interface{}) error { case *headerFrame: return l.headerHandler(i) case *registerStream: - return l.registerStreamHandler(i) + l.registerStreamHandler(i) case *cleanupStream: return l.cleanupStreamHandler(i) case *earlyAbortStream: @@ -840,21 +851,24 @@ func (l *loopyWriter) handle(i interface{}) error { case *incomingGoAway: return l.incomingGoAwayHandler(i) case *dataFrame: - return l.preprocessData(i) + l.preprocessData(i) case *ping: return l.pingHandler(i) case *goAway: return l.goAwayHandler(i) case *outFlowControlSizeRequest: - return l.outFlowControlSizeRequestHandler(i) + l.outFlowControlSizeRequestHandler(i) case closeConnection: - return l.closeConnectionHandler() + // Just return a non-I/O error and run() will flush and close the + // connection. + return ErrConnClosing default: return fmt.Errorf("transport: unknown control message type %T", i) } + return nil } -func (l *loopyWriter) applySettings(ss []http2.Setting) error { +func (l *loopyWriter) applySettings(ss []http2.Setting) { for _, s := range ss { switch s.ID { case http2.SettingInitialWindowSize: @@ -873,7 +887,6 @@ func (l *loopyWriter) applySettings(ss []http2.Setting) error { updateHeaderTblSize(l.hEnc, s.Val) } } - return nil } // processData removes the first stream from active streams, writes out at most 16KB @@ -907,7 +920,7 @@ func (l *loopyWriter) processData() (bool, error) { return false, err } if err := l.cleanupStreamHandler(trailer.cleanup); err != nil { - return false, nil + return false, err } } else { l.activeStreams.enqueue(str) diff --git a/vendor/google.golang.org/grpc/internal/transport/defaults.go b/vendor/google.golang.org/grpc/internal/transport/defaults.go index 9fa306b2e0..bc8ee07474 100644 --- a/vendor/google.golang.org/grpc/internal/transport/defaults.go +++ b/vendor/google.golang.org/grpc/internal/transport/defaults.go @@ -47,3 +47,9 @@ const ( defaultClientMaxHeaderListSize = uint32(16 << 20) defaultServerMaxHeaderListSize = uint32(16 << 20) ) + +// MaxStreamID is the upper bound for the stream ID before the current +// transport gracefully closes and new transport is created for subsequent RPCs. +// This is set to 75% of 2^31-1. Streams are identified with an unsigned 31-bit +// integer. It's exported so that tests can override it. +var MaxStreamID = uint32(math.MaxInt32 * 3 / 4) diff --git a/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/vendor/google.golang.org/grpc/internal/transport/handler_server.go index ebe8bfe330..98f80e3fa0 100644 --- a/vendor/google.golang.org/grpc/internal/transport/handler_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/handler_server.go @@ -39,6 +39,7 @@ import ( "golang.org/x/net/http2" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" @@ -65,7 +66,7 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s contentSubtype, validContentType := grpcutil.ContentSubtype(contentType) if !validContentType { msg := fmt.Sprintf("invalid gRPC request content-type %q", contentType) - http.Error(w, msg, http.StatusBadRequest) + http.Error(w, msg, http.StatusUnsupportedMediaType) return nil, errors.New(msg) } if _, ok := w.(http.Flusher); !ok { @@ -83,11 +84,12 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s contentSubtype: contentSubtype, stats: stats, } + st.logger = prefixLoggerForServerHandlerTransport(st) if v := r.Header.Get("grpc-timeout"); v != "" { to, err := decodeTimeout(v) if err != nil { - msg := fmt.Sprintf("malformed time-out: %v", err) + msg := fmt.Sprintf("malformed grpc-timeout: %v", err) http.Error(w, msg, http.StatusBadRequest) return nil, status.Error(codes.Internal, msg) } @@ -150,13 +152,14 @@ type serverHandlerTransport struct { // TODO make sure this is consistent across handler_server and http2_server contentSubtype string - stats []stats.Handler + stats []stats.Handler + logger *grpclog.PrefixLogger } func (ht *serverHandlerTransport) Close(err error) { ht.closeOnce.Do(func() { - if logger.V(logLevel) { - logger.Infof("Closing serverHandlerTransport: %v", err) + if ht.logger.V(logLevel) { + ht.logger.Infof("Closing: %v", err) } close(ht.closedCh) }) @@ -450,7 +453,7 @@ func (ht *serverHandlerTransport) IncrMsgSent() {} func (ht *serverHandlerTransport) IncrMsgRecv() {} -func (ht *serverHandlerTransport) Drain() { +func (ht *serverHandlerTransport) Drain(debugData string) { panic("Drain() is not implemented") } diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index 3e582a2853..326bf08480 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -38,6 +38,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" icredentials "google.golang.org/grpc/internal/credentials" + "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/grpcutil" imetadata "google.golang.org/grpc/internal/metadata" @@ -140,12 +141,12 @@ type http2Client struct { channelzID *channelz.Identifier czData *channelzData - onGoAway func(GoAwayReason) - onClose func() + onClose func(GoAwayReason) bufferPool *bufferPool connectionID uint64 + logger *grpclog.PrefixLogger } func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr resolver.Address, useProxy bool, grpcUA string) (net.Conn, error) { @@ -197,7 +198,7 @@ func isTemporary(err error) bool { // newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 // and starts to receive messages on it. Non-nil error returns if construction // fails. -func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onGoAway func(GoAwayReason), onClose func()) (_ *http2Client, err error) { +func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ *http2Client, err error) { scheme := "http" ctx, cancel := context.WithCancel(ctx) defer func() { @@ -217,7 +218,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts 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) + return nil, connectionErrorf(true, err, "transport: Error while dialing: %v", err) } // Any further errors will close the underlying connection @@ -245,7 +246,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts if err := connectCtx.Err(); err != nil { // connectCtx expired before exiting the function. Hard close the connection. if logger.V(logLevel) { - logger.Infof("newClientTransport: aborting due to connectCtx: %v", err) + logger.Infof("Aborting due to connect deadline expiring: %v", err) } conn.Close() } @@ -343,11 +344,11 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts streamQuota: defaultMaxStreamsClient, streamsQuotaAvailable: make(chan struct{}, 1), czData: new(channelzData), - onGoAway: onGoAway, keepaliveEnabled: keepaliveEnabled, bufferPool: newBufferPool(), onClose: onClose, } + t.logger = prefixLoggerForClientTransport(t) // Add peer information to the http2client context. t.ctx = peer.NewContext(t.ctx, t.getPeer()) @@ -446,15 +447,8 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts return nil, err } go func() { - t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst) - err := t.loopy.run() - if logger.V(logLevel) { - logger.Infof("transport: loopyWriter exited. Closing connection. Err: %v", err) - } - // Do not close the transport. Let reader goroutine handle it since - // there might be data in the buffers. - t.conn.Close() - t.controlBuf.finish() + t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) + t.loopy.run() close(t.writerDone) }() return t, nil @@ -744,15 +738,12 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, endStream: false, initStream: func(id uint32) error { t.mu.Lock() - if state := t.state; state != reachable { + // TODO: handle transport closure in loopy instead and remove this + // initStream is never called when transport is draining. + if t.state == closing { t.mu.Unlock() - // Do a quick cleanup. - err := error(errStreamDrain) - if state == closing { - err = ErrConnClosing - } - cleanup(err) - return err + cleanup(ErrConnClosing) + return ErrConnClosing } if channelz.IsOn() { atomic.AddInt64(&t.czData.streamsStarted, 1) @@ -770,6 +761,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, } firstTry := true var ch chan struct{} + transportDrainRequired := false checkForStreamQuota := func(it interface{}) bool { if t.streamQuota <= 0 { // Can go negative if server decreases it. if firstTry { @@ -785,10 +777,15 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, h := it.(*headerFrame) h.streamID = t.nextID t.nextID += 2 + + // Drain client transport if nextID > MaxStreamID which signals gRPC that + // the connection is closed and a new one must be created for subsequent RPCs. + transportDrainRequired = t.nextID > MaxStreamID + s.id = h.streamID s.fc = &inFlow{limit: uint32(t.initialWindowSize)} t.mu.Lock() - if t.activeStreams == nil { // Can be niled from Close(). + if t.state == draining || t.activeStreams == nil { // Can be niled from Close(). t.mu.Unlock() return false // Don't create a stream if the transport is already closed. } @@ -864,6 +861,12 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, sh.HandleRPC(s.ctx, outHeader) } } + if transportDrainRequired { + if t.logger.V(logLevel) { + t.logger.Infof("Draining transport: t.nextID > MaxStreamID") + } + t.GracefulClose() + } return s, nil } @@ -952,12 +955,14 @@ func (t *http2Client) Close(err error) { t.mu.Unlock() return } - if logger.V(logLevel) { - logger.Infof("transport: closing: %v", err) + if t.logger.V(logLevel) { + t.logger.Infof("Closing: %v", err) } // Call t.onClose ASAP to prevent the client from attempting to create new // streams. - t.onClose() + if t.state != draining { + t.onClose(GoAwayInvalid) + } t.state = closing streams := t.activeStreams t.activeStreams = nil @@ -1007,9 +1012,10 @@ func (t *http2Client) GracefulClose() { t.mu.Unlock() return } - if logger.V(logLevel) { - logger.Infof("transport: GracefulClose called") + if t.logger.V(logLevel) { + t.logger.Infof("GracefulClose called") } + t.onClose(GoAwayInvalid) t.state = draining active := len(t.activeStreams) t.mu.Unlock() @@ -1171,8 +1177,8 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { } statusCode, ok := http2ErrConvTab[f.ErrCode] if !ok { - if logger.V(logLevel) { - logger.Warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error %v", f.ErrCode) + if t.logger.V(logLevel) { + t.logger.Infof("Received a RST_STREAM frame with code %q, but found no mapped gRPC status", f.ErrCode) } statusCode = codes.Unknown } @@ -1254,10 +1260,12 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { t.mu.Unlock() return } - if f.ErrCode == http2.ErrCodeEnhanceYourCalm { - if logger.V(logLevel) { - logger.Infof("Client received GoAway with http2.ErrCodeEnhanceYourCalm.") - } + if f.ErrCode == http2.ErrCodeEnhanceYourCalm && string(f.DebugData()) == "too_many_pings" { + // When a client receives a GOAWAY with error code ENHANCE_YOUR_CALM and debug + // data equal to ASCII "too_many_pings", it should log the occurrence at a log level that is + // enabled by default and double the configure KEEPALIVE_TIME used for new connections + // on that channel. + logger.Errorf("Client received GoAway with error code ENHANCE_YOUR_CALM and debug data equal to ASCII \"too_many_pings\".") } id := f.LastStreamID if id > 0 && id%2 == 0 { @@ -1290,8 +1298,10 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { // Notify the clientconn about the GOAWAY before we set the state to // draining, to allow the client to stop attempting to create streams // before disallowing new streams on this connection. - t.onGoAway(t.goAwayReason) - t.state = draining + if t.state != draining { + t.onClose(t.goAwayReason) + t.state = draining + } } // All streams with IDs greater than the GoAwayId // and smaller than the previous GoAway ID should be killed. @@ -1327,7 +1337,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { // 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 +// It expects a lock on transport's mutex to be held by // the caller. func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) { t.goAwayReason = GoAwayNoReason @@ -1780,3 +1790,9 @@ func (t *http2Client) getOutFlowWindow() int64 { return -2 } } + +func (t *http2Client) stateForTesting() transportState { + t.mu.Lock() + defer t.mu.Unlock() + return t.state +} diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go index 37e089bc84..79e86ba088 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -35,7 +35,9 @@ import ( "github.com/golang/protobuf/proto" "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" + "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" + "google.golang.org/grpc/internal/pretty" "google.golang.org/grpc/internal/syscall" "google.golang.org/grpc/codes" @@ -129,6 +131,8 @@ type http2Server struct { // This lock may not be taken if mu is already held. maxStreamMu sync.Mutex maxStreamID uint32 // max stream ID ever seen + + logger *grpclog.PrefixLogger } // NewServerTransport creates a http2 transport with conn and configuration @@ -267,6 +271,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, czData: new(channelzData), bufferPool: newBufferPool(), } + t.logger = prefixLoggerForServerTransport(t) // Add peer information to the http2server context. t.ctx = peer.NewContext(t.ctx, t.getPeer()) @@ -331,14 +336,9 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, t.handleSettings(sf) go func() { - t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst) + t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler - err := t.loopy.run() - if logger.V(logLevel) { - logger.Infof("transport: loopyWriter exited. Closing connection. Err: %v", err) - } - t.conn.Close() - t.controlBuf.finish() + t.loopy.run() close(t.writerDone) }() go t.keepalive() @@ -380,13 +380,14 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( fc: &inFlow{limit: uint32(t.initialWindowSize)}, } var ( - // If a gRPC Response-Headers has already been received, then it means - // that the peer is speaking gRPC and we are in gRPC mode. - isGRPC = false - mdata = make(map[string][]string) - httpMethod string - // headerError is set if an error is encountered while parsing the headers - headerError bool + // if false, content-type was missing or invalid + isGRPC = false + contentType = "" + mdata = make(metadata.MD, len(frame.Fields)) + httpMethod string + // these are set if an error is encountered while parsing the headers + protocolError bool + headerError *status.Status timeoutSet bool timeout time.Duration @@ -397,11 +398,23 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( case "content-type": contentSubtype, validContentType := grpcutil.ContentSubtype(hf.Value) if !validContentType { + contentType = hf.Value break } mdata[hf.Name] = append(mdata[hf.Name], hf.Value) s.contentSubtype = contentSubtype isGRPC = true + + case "grpc-accept-encoding": + mdata[hf.Name] = append(mdata[hf.Name], hf.Value) + if hf.Value == "" { + continue + } + compressors := hf.Value + if s.clientAdvertisedCompressors != "" { + compressors = s.clientAdvertisedCompressors + "," + compressors + } + s.clientAdvertisedCompressors = compressors case "grpc-encoding": s.recvCompress = hf.Value case ":method": @@ -412,23 +425,23 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( timeoutSet = true var err error if timeout, err = decodeTimeout(hf.Value); err != nil { - headerError = true + headerError = status.Newf(codes.Internal, "malformed grpc-timeout: %v", err) } // "Transports must consider requests containing the Connection header // as malformed." - A41 case "connection": - if logger.V(logLevel) { - logger.Errorf("transport: http2Server.operateHeaders parsed a :connection header which makes a request malformed as per the HTTP/2 spec") + if t.logger.V(logLevel) { + t.logger.Infof("Received a HEADERS frame with a :connection header which makes the request malformed, as per the HTTP/2 spec") } - headerError = true + protocolError = true default: if isReservedHeader(hf.Name) && !isWhitelistedHeader(hf.Name) { break } v, err := decodeMetadataHeader(hf.Name, hf.Value) if err != nil { - headerError = true - logger.Warningf("Failed to decode metadata header (%q, %q): %v", hf.Name, hf.Value, err) + headerError = status.Newf(codes.Internal, "malformed binary metadata %q in header %q: %v", hf.Value, hf.Name, err) + t.logger.Warningf("Failed to decode metadata header (%q, %q): %v", hf.Name, hf.Value, err) break } mdata[hf.Name] = append(mdata[hf.Name], v) @@ -442,11 +455,11 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( // error, this takes precedence over a client not speaking gRPC. if len(mdata[":authority"]) > 1 || len(mdata["host"]) > 1 { errMsg := fmt.Sprintf("num values of :authority: %v, num values of host: %v, both must only have 1 value as per HTTP/2 spec", len(mdata[":authority"]), len(mdata["host"])) - if logger.V(logLevel) { - logger.Errorf("transport: %v", errMsg) + if t.logger.V(logLevel) { + t.logger.Infof("Aborting the stream early: %v", errMsg) } t.controlBuf.put(&earlyAbortStream{ - httpStatus: 400, + httpStatus: http.StatusBadRequest, streamID: streamID, contentSubtype: s.contentSubtype, status: status.New(codes.Internal, errMsg), @@ -455,7 +468,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( return nil } - if !isGRPC || headerError { + if protocolError { t.controlBuf.put(&cleanupStream{ streamID: streamID, rst: true, @@ -464,6 +477,26 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( }) return nil } + if !isGRPC { + t.controlBuf.put(&earlyAbortStream{ + httpStatus: http.StatusUnsupportedMediaType, + streamID: streamID, + contentSubtype: s.contentSubtype, + status: status.Newf(codes.InvalidArgument, "invalid gRPC request content-type %q", contentType), + rst: !frame.StreamEnded(), + }) + return nil + } + if headerError != nil { + t.controlBuf.put(&earlyAbortStream{ + httpStatus: http.StatusBadRequest, + streamID: streamID, + contentSubtype: s.contentSubtype, + status: headerError, + rst: !frame.StreamEnded(), + }) + return nil + } // "If :authority is missing, Host must be renamed to :authority." - A41 if len(mdata[":authority"]) == 0 { @@ -517,9 +550,9 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( } if httpMethod != http.MethodPost { t.mu.Unlock() - errMsg := fmt.Sprintf("http2Server.operateHeaders parsed a :method field: %v which should be POST", httpMethod) - if logger.V(logLevel) { - logger.Infof("transport: %v", errMsg) + errMsg := fmt.Sprintf("Received a HEADERS frame with :method %q which should be POST", httpMethod) + if t.logger.V(logLevel) { + t.logger.Infof("Aborting the stream early: %v", errMsg) } t.controlBuf.put(&earlyAbortStream{ httpStatus: 405, @@ -535,8 +568,8 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( var err error if s.ctx, err = t.inTapHandle(s.ctx, &tap.Info{FullMethodName: s.method}); err != nil { t.mu.Unlock() - if logger.V(logLevel) { - logger.Infof("transport: http2Server.operateHeaders got an error from InTapHandle: %v", err) + if t.logger.V(logLevel) { + t.logger.Infof("Aborting the stream early due to InTapHandle failure: %v", err) } stat, ok := status.FromError(err) if !ok { @@ -573,7 +606,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( LocalAddr: t.localAddr, Compression: s.recvCompress, WireLength: int(frame.Header().Length), - Header: metadata.MD(mdata).Copy(), + Header: mdata.Copy(), } sh.HandleRPC(s.ctx, inHeader) } @@ -610,8 +643,8 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context. atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) if err != nil { if se, ok := err.(http2.StreamError); ok { - if logger.V(logLevel) { - logger.Warningf("transport: http2Server.HandleStreams encountered http2.StreamError: %v", se) + if t.logger.V(logLevel) { + t.logger.Warningf("Encountered http2.StreamError: %v", se) } t.mu.Lock() s := t.activeStreams[se.StreamID] @@ -654,8 +687,8 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context. case *http2.GoAwayFrame: // TODO: Handle GoAway from the client appropriately. default: - if logger.V(logLevel) { - logger.Errorf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame) + if t.logger.V(logLevel) { + t.logger.Infof("Received unsupported frame type %T", frame) } } } @@ -914,8 +947,8 @@ func (t *http2Server) checkForHeaderListSize(it interface{}) bool { var sz int64 for _, f := range hdrFrame.hf { if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) { - if logger.V(logLevel) { - logger.Errorf("header list size to send violates the maximum size (%d bytes) set by client", *t.maxSendHeaderListSize) + if t.logger.V(logLevel) { + t.logger.Infof("Header list size to send violates the maximum size (%d bytes) set by client", *t.maxSendHeaderListSize) } return false } @@ -1028,7 +1061,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { stBytes, err := proto.Marshal(p) if err != nil { // TODO: return error instead, when callers are able to handle it. - logger.Errorf("transport: failed to marshal rpc status: %v, error: %v", p, err) + t.logger.Errorf("Failed to marshal rpc status: %s, error: %v", pretty.ToJSON(p), err) } else { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)}) } @@ -1133,18 +1166,18 @@ func (t *http2Server) keepalive() { if val <= 0 { // The connection has been idle for a duration of keepalive.MaxConnectionIdle or more. // Gracefully close the connection. - t.Drain() + t.Drain("max_idle") return } idleTimer.Reset(val) case <-ageTimer.C: - t.Drain() + t.Drain("max_age") ageTimer.Reset(t.kp.MaxConnectionAgeGrace) select { case <-ageTimer.C: // Close the connection after grace period. - if logger.V(logLevel) { - logger.Infof("transport: closing server transport due to maximum connection age.") + if t.logger.V(logLevel) { + t.logger.Infof("Closing server transport due to maximum connection age") } t.controlBuf.put(closeConnection{}) case <-t.done: @@ -1195,8 +1228,8 @@ func (t *http2Server) Close(err error) { t.mu.Unlock() return } - if logger.V(logLevel) { - logger.Infof("transport: closing: %v", err) + if t.logger.V(logLevel) { + t.logger.Infof("Closing: %v", err) } t.state = closing streams := t.activeStreams @@ -1204,8 +1237,8 @@ func (t *http2Server) Close(err error) { t.mu.Unlock() t.controlBuf.finish() close(t.done) - if err := t.conn.Close(); err != nil && logger.V(logLevel) { - logger.Infof("transport: error closing conn during Close: %v", err) + if err := t.conn.Close(); err != nil && t.logger.V(logLevel) { + t.logger.Infof("Error closing underlying net.Conn during Close: %v", err) } channelz.RemoveEntry(t.channelzID) // Cancel all active streams. @@ -1285,14 +1318,14 @@ func (t *http2Server) RemoteAddr() net.Addr { return t.remoteAddr } -func (t *http2Server) Drain() { +func (t *http2Server) Drain(debugData string) { t.mu.Lock() defer t.mu.Unlock() if t.drainEvent != nil { return } t.drainEvent = grpcsync.NewEvent() - t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte{}, headsUp: true}) + t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte(debugData), headsUp: true}) } var goAwayPing = &ping{data: [8]byte{1, 6, 1, 8, 0, 3, 3, 9}} @@ -1322,9 +1355,6 @@ func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) { return false, err } if retErr != nil { - // Abruptly close the connection following the GoAway (via - // loopywriter). But flush out what's inside the buffer first. - t.framer.writer.Flush() return false, retErr } return true, nil @@ -1337,7 +1367,7 @@ func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) { // originated before the GoAway reaches the client. // After getting the ack or timer expiration send out another GoAway this // time with an ID of the max stream server intends to process. - if err := t.framer.fr.WriteGoAway(math.MaxUint32, http2.ErrCodeNo, []byte{}); err != nil { + if err := t.framer.fr.WriteGoAway(math.MaxUint32, http2.ErrCodeNo, g.debugData); err != nil { return false, err } if err := t.framer.fr.WritePing(false, goAwayPing.data); err != nil { diff --git a/vendor/google.golang.org/grpc/internal/transport/http_util.go b/vendor/google.golang.org/grpc/internal/transport/http_util.go index 2c601a864d..19cbb18f5a 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http_util.go +++ b/vendor/google.golang.org/grpc/internal/transport/http_util.go @@ -21,6 +21,7 @@ package transport import ( "bufio" "encoding/base64" + "errors" "fmt" "io" "math" @@ -37,7 +38,6 @@ import ( "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/status" ) @@ -85,7 +85,6 @@ var ( // 504 Gateway timeout - UNAVAILABLE. http.StatusGatewayTimeout: codes.Unavailable, } - logger = grpclog.Component("transport") ) // isReservedHeader checks whether hdr belongs to HTTP2 headers @@ -330,7 +329,8 @@ func (w *bufWriter) Write(b []byte) (n int, err error) { return 0, w.err } if w.batchSize == 0 { // Buffer has been disabled. - return w.conn.Write(b) + n, err = w.conn.Write(b) + return n, toIOError(err) } for len(b) > 0 { nn := copy(w.buf[w.offset:], b) @@ -352,10 +352,30 @@ func (w *bufWriter) Flush() error { return nil } _, w.err = w.conn.Write(w.buf[:w.offset]) + w.err = toIOError(w.err) w.offset = 0 return w.err } +type ioError struct { + error +} + +func (i ioError) Unwrap() error { + return i.error +} + +func isIOError(err error) bool { + return errors.As(err, &ioError{}) +} + +func toIOError(err error) error { + if err == nil { + return nil + } + return ioError{error: err} +} + type framer struct { writer *bufWriter fr *http2.Framer diff --git a/vendor/google.golang.org/grpc/internal/transport/logging.go b/vendor/google.golang.org/grpc/internal/transport/logging.go new file mode 100644 index 0000000000..42ed2b07af --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/logging.go @@ -0,0 +1,40 @@ +/* + * + * Copyright 2023 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 transport + +import ( + "fmt" + + "google.golang.org/grpc/grpclog" + internalgrpclog "google.golang.org/grpc/internal/grpclog" +) + +var logger = grpclog.Component("transport") + +func prefixLoggerForServerTransport(p *http2Server) *internalgrpclog.PrefixLogger { + return internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[server-transport %p] ", p)) +} + +func prefixLoggerForServerHandlerTransport(p *serverHandlerTransport) *internalgrpclog.PrefixLogger { + return internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[server-handler-transport %p] ", p)) +} + +func prefixLoggerForClientTransport(p *http2Client) *internalgrpclog.PrefixLogger { + return internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[client-transport %p] ", p)) +} diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go index 6cff20c8e0..aa1c896595 100644 --- a/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -257,6 +257,9 @@ type Stream struct { fc *inFlow wq *writeQuota + // Holds compressor names passed in grpc-accept-encoding metadata from the + // client. This is empty for the client side stream. + clientAdvertisedCompressors string // Callback to state application's intentions to read data. This // is used to adjust flow control, if needed. requestRead func(int) @@ -345,8 +348,24 @@ func (s *Stream) RecvCompress() string { } // SetSendCompress sets the compression algorithm to the stream. -func (s *Stream) SetSendCompress(str string) { - s.sendCompress = str +func (s *Stream) SetSendCompress(name string) error { + if s.isHeaderSent() || s.getState() == streamDone { + return errors.New("transport: set send compressor called after headers sent or stream done") + } + + s.sendCompress = name + return nil +} + +// SendCompress returns the send compressor name. +func (s *Stream) SendCompress() string { + return s.sendCompress +} + +// ClientAdvertisedCompressors returns the compressor names advertised by the +// client via grpc-accept-encoding header. +func (s *Stream) ClientAdvertisedCompressors() string { + return s.clientAdvertisedCompressors } // Done returns a channel which is closed when it receives the final status @@ -583,8 +602,8 @@ type ConnectOptions struct { // NewClientTransport establishes the transport with the required ConnectOptions // and returns it to the caller. -func NewClientTransport(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onGoAway func(GoAwayReason), onClose func()) (ClientTransport, error) { - return newHTTP2Client(connectCtx, ctx, addr, opts, onGoAway, onClose) +func NewClientTransport(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (ClientTransport, error) { + return newHTTP2Client(connectCtx, ctx, addr, opts, onClose) } // Options provides additional hints and information for message @@ -707,7 +726,7 @@ type ServerTransport interface { RemoteAddr() net.Addr // Drain notifies the client this ServerTransport stops accepting new RPCs. - Drain() + Drain(debugData string) // IncrMsgSent increments the number of message sent through this transport. IncrMsgSent() diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go index fb4a88f59b..a2cdcaf12a 100644 --- a/vendor/google.golang.org/grpc/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/metadata/metadata.go @@ -91,7 +91,11 @@ func (md MD) Len() int { // Copy returns a copy of md. func (md MD) Copy() MD { - return Join(md) + out := make(MD, len(md)) + for k, v := range md { + out[k] = copyOf(v) + } + return out } // Get obtains the values for a given key. @@ -171,8 +175,11 @@ func AppendToOutgoingContext(ctx context.Context, kv ...string) context.Context md, _ := ctx.Value(mdOutgoingKey{}).(rawMD) added := make([][]string, len(md.added)+1) copy(added, md.added) - added[len(added)-1] = make([]string, len(kv)) - copy(added[len(added)-1], kv) + kvCopy := make([]string, 0, len(kv)) + for i := 0; i < len(kv); i += 2 { + kvCopy = append(kvCopy, strings.ToLower(kv[i]), kv[i+1]) + } + added[len(added)-1] = kvCopy return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md.md, added: added}) } diff --git a/vendor/google.golang.org/grpc/picker_wrapper.go b/vendor/google.golang.org/grpc/picker_wrapper.go index a5d5516ee0..02f9759512 100644 --- a/vendor/google.golang.org/grpc/picker_wrapper.go +++ b/vendor/google.golang.org/grpc/picker_wrapper.go @@ -36,6 +36,7 @@ import ( type pickerWrapper struct { mu sync.Mutex done bool + idle bool blockingCh chan struct{} picker balancer.Picker } @@ -47,7 +48,11 @@ func newPickerWrapper() *pickerWrapper { // updatePicker is called by UpdateBalancerState. It unblocks all blocked pick. func (pw *pickerWrapper) updatePicker(p balancer.Picker) { pw.mu.Lock() - if pw.done { + if pw.done || pw.idle { + // There is a small window where a picker update from the LB policy can + // race with the channel going to idle mode. If the picker is idle here, + // it is because the channel asked it to do so, and therefore it is sage + // to ignore the update from the LB policy. pw.mu.Unlock() return } @@ -58,12 +63,16 @@ func (pw *pickerWrapper) updatePicker(p balancer.Picker) { pw.mu.Unlock() } -func doneChannelzWrapper(acw *acBalancerWrapper, done func(balancer.DoneInfo)) func(balancer.DoneInfo) { - acw.mu.Lock() - ac := acw.ac - acw.mu.Unlock() +// doneChannelzWrapper performs the following: +// - increments the calls started channelz counter +// - wraps the done function in the passed in result to increment the calls +// failed or calls succeeded channelz counter before invoking the actual +// done function. +func doneChannelzWrapper(acbw *acBalancerWrapper, result *balancer.PickResult) { + ac := acbw.ac ac.incrCallsStarted() - return func(b balancer.DoneInfo) { + done := result.Done + result.Done = func(b balancer.DoneInfo) { if b.Err != nil && b.Err != io.EOF { ac.incrCallsFailed() } else { @@ -82,7 +91,7 @@ func doneChannelzWrapper(acw *acBalancerWrapper, done func(balancer.DoneInfo)) f // - the current picker returns other errors and failfast is false. // - the subConn returned by the current picker is not READY // When one of these situations happens, pick blocks until the picker gets updated. -func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (transport.ClientTransport, func(balancer.DoneInfo), error) { +func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (transport.ClientTransport, balancer.PickResult, error) { var ch chan struct{} var lastPickErr error @@ -90,7 +99,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. pw.mu.Lock() if pw.done { pw.mu.Unlock() - return nil, nil, ErrClientConnClosing + return nil, balancer.PickResult{}, ErrClientConnClosing } if pw.picker == nil { @@ -111,9 +120,9 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. } switch ctx.Err() { case context.DeadlineExceeded: - return nil, nil, status.Error(codes.DeadlineExceeded, errStr) + return nil, balancer.PickResult{}, status.Error(codes.DeadlineExceeded, errStr) case context.Canceled: - return nil, nil, status.Error(codes.Canceled, errStr) + return nil, balancer.PickResult{}, status.Error(codes.Canceled, errStr) } case <-ch: } @@ -125,7 +134,6 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. pw.mu.Unlock() pickResult, err := p.Pick(info) - if err != nil { if err == balancer.ErrNoSubConnAvailable { continue @@ -136,7 +144,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. if istatus.IsRestrictedControlPlaneCode(st) { err = status.Errorf(codes.Internal, "received picker error with illegal status: %v", err) } - return nil, nil, dropError{error: err} + return nil, balancer.PickResult{}, dropError{error: err} } // For all other errors, wait for ready RPCs should block and other // RPCs should fail with unavailable. @@ -144,19 +152,20 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. lastPickErr = err continue } - return nil, nil, status.Error(codes.Unavailable, err.Error()) + return nil, balancer.PickResult{}, status.Error(codes.Unavailable, err.Error()) } - acw, ok := pickResult.SubConn.(*acBalancerWrapper) + acbw, ok := pickResult.SubConn.(*acBalancerWrapper) if !ok { logger.Errorf("subconn returned from pick is type %T, not *acBalancerWrapper", pickResult.SubConn) continue } - if t := acw.getAddrConn().getReadyTransport(); t != nil { + if t := acbw.ac.getReadyTransport(); t != nil { if channelz.IsOn() { - return t, doneChannelzWrapper(acw, pickResult.Done), nil + doneChannelzWrapper(acbw, &pickResult) + return t, pickResult, nil } - return t, pickResult.Done, nil + return t, pickResult, nil } if pickResult.Done != nil { // Calling done with nil error, no bytes sent and no bytes received. @@ -181,6 +190,25 @@ func (pw *pickerWrapper) close() { close(pw.blockingCh) } +func (pw *pickerWrapper) enterIdleMode() { + pw.mu.Lock() + defer pw.mu.Unlock() + if pw.done { + return + } + pw.idle = true +} + +func (pw *pickerWrapper) exitIdleMode() { + pw.mu.Lock() + defer pw.mu.Unlock() + if pw.done { + return + } + pw.blockingCh = make(chan struct{}) + pw.idle = false +} + // dropError is a wrapper error that indicates the LB policy wishes to drop the // RPC and not retry it. type dropError struct { diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/pickfirst.go index b3a55481b9..abe266b021 100644 --- a/vendor/google.golang.org/grpc/pickfirst.go +++ b/vendor/google.golang.org/grpc/pickfirst.go @@ -19,11 +19,15 @@ package grpc import ( + "encoding/json" "errors" "fmt" "google.golang.org/grpc/balancer" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/internal/envconfig" + "google.golang.org/grpc/internal/grpcrand" + "google.golang.org/grpc/serviceconfig" ) // PickFirstBalancerName is the name of the pick_first balancer. @@ -43,15 +47,33 @@ func (*pickfirstBuilder) Name() string { return PickFirstBalancerName } +type pfConfig struct { + serviceconfig.LoadBalancingConfig `json:"-"` + + // If set to true, instructs the LB policy to shuffle the order of the list + // of addresses received from the name resolver before attempting to + // connect to them. + ShuffleAddressList bool `json:"shuffleAddressList"` +} + +func (*pickfirstBuilder) ParseConfig(js json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { + cfg := &pfConfig{} + if err := json.Unmarshal(js, cfg); err != nil { + return nil, fmt.Errorf("pickfirst: unable to unmarshal LB policy config: %s, error: %v", string(js), err) + } + return cfg, nil +} + type pickfirstBalancer struct { state connectivity.State cc balancer.ClientConn subConn balancer.SubConn + cfg *pfConfig } func (b *pickfirstBalancer) ResolverError(err error) { if logger.V(2) { - logger.Infof("pickfirstBalancer: ResolverError called with error %v", err) + logger.Infof("pickfirstBalancer: ResolverError called with error: %v", err) } if b.subConn == nil { b.state = connectivity.TransientFailure @@ -69,7 +91,8 @@ func (b *pickfirstBalancer) ResolverError(err error) { } func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { - if len(state.ResolverState.Addresses) == 0 { + addrs := state.ResolverState.Addresses + if len(addrs) == 0 { // The resolver reported an empty address list. Treat it like an error by // calling b.ResolverError. if b.subConn != nil { @@ -82,12 +105,23 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState return balancer.ErrBadResolverState } + if state.BalancerConfig != nil { + cfg, ok := state.BalancerConfig.(*pfConfig) + if !ok { + return fmt.Errorf("pickfirstBalancer: received nil or illegal BalancerConfig (type %T): %v", state.BalancerConfig, state.BalancerConfig) + } + b.cfg = cfg + } + + if envconfig.PickFirstLBConfig && b.cfg != nil && b.cfg.ShuffleAddressList { + grpcrand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) + } if b.subConn != nil { - b.cc.UpdateAddresses(b.subConn, state.ResolverState.Addresses) + b.cc.UpdateAddresses(b.subConn, addrs) return nil } - subConn, err := b.cc.NewSubConn(state.ResolverState.Addresses, balancer.NewSubConnOptions{}) + subConn, err := b.cc.NewSubConn(addrs, balancer.NewSubConnOptions{}) if err != nil { if logger.V(2) { logger.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err) @@ -119,7 +153,6 @@ func (b *pickfirstBalancer) UpdateSubConnState(subConn balancer.SubConn, state b } return } - b.state = state.ConnectivityState if state.ConnectivityState == connectivity.Shutdown { b.subConn = nil return @@ -132,11 +165,21 @@ func (b *pickfirstBalancer) UpdateSubConnState(subConn balancer.SubConn, state b Picker: &picker{result: balancer.PickResult{SubConn: subConn}}, }) case connectivity.Connecting: + if b.state == connectivity.TransientFailure { + // We stay in TransientFailure until we are Ready. See A62. + return + } b.cc.UpdateState(balancer.State{ ConnectivityState: state.ConnectivityState, Picker: &picker{err: balancer.ErrNoSubConnAvailable}, }) case connectivity.Idle: + if b.state == connectivity.TransientFailure { + // We stay in TransientFailure until we are Ready. Also kick the + // subConn out of Idle into Connecting. See A62. + b.subConn.Connect() + return + } b.cc.UpdateState(balancer.State{ ConnectivityState: state.ConnectivityState, Picker: &idlePicker{subConn: subConn}, @@ -147,6 +190,7 @@ func (b *pickfirstBalancer) UpdateSubConnState(subConn balancer.SubConn, state b Picker: &picker{err: state.ConnectionError}, }) } + b.state = state.ConnectivityState } func (b *pickfirstBalancer) Close() { diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go index 967cbc7373..353c10b69a 100644 --- a/vendor/google.golang.org/grpc/resolver/resolver.go +++ b/vendor/google.golang.org/grpc/resolver/resolver.go @@ -22,12 +22,13 @@ package resolver import ( "context" + "fmt" "net" "net/url" + "strings" "google.golang.org/grpc/attributes" "google.golang.org/grpc/credentials" - "google.golang.org/grpc/internal/pretty" "google.golang.org/grpc/serviceconfig" ) @@ -40,8 +41,9 @@ var ( // TODO(bar) install dns resolver in init(){}. -// Register registers the resolver builder to the resolver map. b.Scheme will be -// used as the scheme registered with this builder. +// Register registers the resolver builder to the resolver map. b.Scheme will +// be used as the scheme registered with this builder. The registry is case +// sensitive, and schemes should not contain any uppercase characters. // // NOTE: this function must only be called during initialization time (i.e. in // an init() function), and is not thread-safe. If multiple Resolvers are @@ -122,7 +124,7 @@ type Address struct { Attributes *attributes.Attributes // BalancerAttributes contains arbitrary data about this address intended - // for consumption by the LB policy. These attribes do not affect SubConn + // for consumption by the LB policy. These attributes do not affect SubConn // creation, connection establishment, handshaking, etc. BalancerAttributes *attributes.Attributes @@ -149,7 +151,17 @@ func (a Address) Equal(o Address) bool { // String returns JSON formatted string representation of the address. func (a Address) String() string { - return pretty.ToJSON(a) + var sb strings.Builder + sb.WriteString(fmt.Sprintf("{Addr: %q, ", a.Addr)) + sb.WriteString(fmt.Sprintf("ServerName: %q, ", a.ServerName)) + if a.Attributes != nil { + sb.WriteString(fmt.Sprintf("Attributes: %v, ", a.Attributes.String())) + } + if a.BalancerAttributes != nil { + sb.WriteString(fmt.Sprintf("BalancerAttributes: %v", a.BalancerAttributes.String())) + } + sb.WriteString("}") + return sb.String() } // BuildOptions includes additional information for the builder to create @@ -202,6 +214,15 @@ type State struct { // gRPC to add new methods to this interface. type ClientConn interface { // UpdateState updates the state of the ClientConn appropriately. + // + // If an error is returned, the resolver should try to resolve the + // target again. The resolver should use a backoff timer to prevent + // overloading the server with requests. If a resolver is certain that + // reresolving will not change the result, e.g. because it is + // a watch-based resolver, returned errors can be ignored. + // + // If the resolved State is the same as the last reported one, calling + // UpdateState can be omitted. UpdateState(State) error // ReportError notifies the ClientConn that the Resolver encountered an // error. The ClientConn will notify the load balancer and begin calling @@ -247,9 +268,6 @@ type Target struct { Scheme string // Deprecated: use URL.Host instead. Authority string - // Deprecated: use URL.Path or URL.Opaque instead. The latter is set when - // the former is empty. - Endpoint string // URL contains the parsed dial target with an optional default scheme added // to it if the original dial target contained no scheme or contained an // unregistered scheme. Any query params specified in the original dial @@ -257,6 +275,24 @@ type Target struct { URL url.URL } +// Endpoint retrieves endpoint without leading "/" from either `URL.Path` +// or `URL.Opaque`. The latter is used when the former is empty. +func (t Target) Endpoint() string { + endpoint := t.URL.Path + if endpoint == "" { + endpoint = t.URL.Opaque + } + // For targets of the form "[scheme]://[authority]/endpoint, the endpoint + // value returned from url.Parse() contains a leading "/". Although this is + // in accordance with RFC 3986, we do not want to break existing resolver + // implementations which expect the endpoint without the leading "/". So, we + // end up stripping the leading "/" here. But this will result in an + // incorrect parsing for something like "unix:///path/to/socket". Since we + // own the "unix" resolver, we can workaround in the unix resolver by using + // the `URL` field. + return strings.TrimPrefix(endpoint, "/") +} + // Builder creates a resolver that will be used to watch name resolution updates. type Builder interface { // Build creates a new resolver for the given target. @@ -264,8 +300,10 @@ type Builder interface { // gRPC dial calls Build synchronously, and fails if the returned error is // not nil. Build(target Target, cc ClientConn, opts BuildOptions) (Resolver, error) - // Scheme returns the scheme supported by this resolver. - // Scheme is defined at https://github.com/grpc/grpc/blob/master/doc/naming.md. + // Scheme returns the scheme supported by this resolver. Scheme is defined + // at https://github.com/grpc/grpc/blob/master/doc/naming.md. The returned + // string should not contain uppercase characters, as they will not match + // the parsed target's scheme as defined in RFC 3986. Scheme() string } diff --git a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go index 05a9d4e0ba..b408b3688f 100644 --- a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go +++ b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go @@ -19,11 +19,11 @@ package grpc import ( + "context" "strings" "sync" "google.golang.org/grpc/balancer" - "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/pretty" @@ -31,129 +31,192 @@ import ( "google.golang.org/grpc/serviceconfig" ) +// resolverStateUpdater wraps the single method used by ccResolverWrapper to +// report a state update from the actual resolver implementation. +type resolverStateUpdater interface { + updateResolverState(s resolver.State, err error) error +} + // ccResolverWrapper is a wrapper on top of cc for resolvers. // It implements resolver.ClientConn interface. type ccResolverWrapper struct { - cc *ClientConn - resolverMu sync.Mutex - resolver resolver.Resolver - done *grpcsync.Event - curState resolver.State + // The following fields are initialized when the wrapper is created and are + // read-only afterwards, and therefore can be accessed without a mutex. + cc resolverStateUpdater + channelzID *channelz.Identifier + ignoreServiceConfig bool + opts ccResolverWrapperOpts + serializer *grpcsync.CallbackSerializer // To serialize all incoming calls. + serializerCancel context.CancelFunc // To close the serializer, accessed only from close(). + + // All incoming (resolver --> gRPC) calls are guaranteed to execute in a + // mutually exclusive manner as they are scheduled on the serializer. + // Fields accessed *only* in these serializer callbacks, can therefore be + // accessed without a mutex. + curState resolver.State + + // mu guards access to the below fields. + mu sync.Mutex + closed bool + resolver resolver.Resolver // Accessed only from outgoing calls. +} - incomingMu sync.Mutex // Synchronizes all the incoming calls. +// ccResolverWrapperOpts wraps the arguments to be passed when creating a new +// ccResolverWrapper. +type ccResolverWrapperOpts struct { + target resolver.Target // User specified dial target to resolve. + builder resolver.Builder // Resolver builder to use. + bOpts resolver.BuildOptions // Resolver build options to use. + channelzID *channelz.Identifier // Channelz identifier for the channel. } // newCCResolverWrapper uses the resolver.Builder to build a Resolver and // returns a ccResolverWrapper object which wraps the newly built resolver. -func newCCResolverWrapper(cc *ClientConn, rb resolver.Builder) (*ccResolverWrapper, error) { +func newCCResolverWrapper(cc resolverStateUpdater, opts ccResolverWrapperOpts) (*ccResolverWrapper, error) { + ctx, cancel := context.WithCancel(context.Background()) ccr := &ccResolverWrapper{ - cc: cc, - done: grpcsync.NewEvent(), - } - - var credsClone credentials.TransportCredentials - if creds := cc.dopts.copts.TransportCredentials; creds != nil { - credsClone = creds.Clone() - } - rbo := resolver.BuildOptions{ - DisableServiceConfig: cc.dopts.disableServiceConfig, - DialCreds: credsClone, - CredsBundle: cc.dopts.copts.CredsBundle, - Dialer: cc.dopts.copts.Dialer, - } - - var err error - // We need to hold the lock here while we assign to the ccr.resolver field - // to guard against a data race caused by the following code path, - // rb.Build-->ccr.ReportError-->ccr.poll-->ccr.resolveNow, would end up - // accessing ccr.resolver which is being assigned here. - ccr.resolverMu.Lock() - defer ccr.resolverMu.Unlock() - ccr.resolver, err = rb.Build(cc.parsedTarget, ccr, rbo) + cc: cc, + channelzID: opts.channelzID, + ignoreServiceConfig: opts.bOpts.DisableServiceConfig, + opts: opts, + serializer: grpcsync.NewCallbackSerializer(ctx), + serializerCancel: cancel, + } + + // Cannot hold the lock at build time because the resolver can send an + // update or error inline and these incoming calls grab the lock to schedule + // a callback in the serializer. + r, err := opts.builder.Build(opts.target, ccr, opts.bOpts) if err != nil { + cancel() return nil, err } + + // Any error reported by the resolver at build time that leads to a + // re-resolution request from the balancer is dropped by grpc until we + // return from this function. So, we don't have to handle pending resolveNow + // requests here. + ccr.mu.Lock() + ccr.resolver = r + ccr.mu.Unlock() + return ccr, nil } func (ccr *ccResolverWrapper) resolveNow(o resolver.ResolveNowOptions) { - ccr.resolverMu.Lock() - if !ccr.done.HasFired() { - ccr.resolver.ResolveNow(o) + ccr.mu.Lock() + defer ccr.mu.Unlock() + + // ccr.resolver field is set only after the call to Build() returns. But in + // the process of building, the resolver may send an error update which when + // propagated to the balancer may result in a re-resolution request. + if ccr.closed || ccr.resolver == nil { + return } - ccr.resolverMu.Unlock() + ccr.resolver.ResolveNow(o) } func (ccr *ccResolverWrapper) close() { - ccr.resolverMu.Lock() - ccr.resolver.Close() - ccr.done.Fire() - ccr.resolverMu.Unlock() + ccr.mu.Lock() + if ccr.closed { + ccr.mu.Unlock() + return + } + + channelz.Info(logger, ccr.channelzID, "Closing the name resolver") + + // Close the serializer to ensure that no more calls from the resolver are + // handled, before actually closing the resolver. + ccr.serializerCancel() + ccr.closed = true + r := ccr.resolver + ccr.mu.Unlock() + + // Give enqueued callbacks a chance to finish. + <-ccr.serializer.Done + + // Spawn a goroutine to close the resolver (since it may block trying to + // cleanup all allocated resources) and return early. + go r.Close() +} + +// serializerScheduleLocked is a convenience method to schedule a function to be +// run on the serializer while holding ccr.mu. +func (ccr *ccResolverWrapper) serializerScheduleLocked(f func(context.Context)) { + ccr.mu.Lock() + ccr.serializer.Schedule(f) + ccr.mu.Unlock() } +// UpdateState is called by resolver implementations to report new state to gRPC +// which includes addresses and service config. func (ccr *ccResolverWrapper) UpdateState(s resolver.State) error { - ccr.incomingMu.Lock() - defer ccr.incomingMu.Unlock() - if ccr.done.HasFired() { + errCh := make(chan error, 1) + ok := ccr.serializer.Schedule(func(context.Context) { + ccr.addChannelzTraceEvent(s) + ccr.curState = s + if err := ccr.cc.updateResolverState(ccr.curState, nil); err == balancer.ErrBadResolverState { + errCh <- balancer.ErrBadResolverState + return + } + errCh <- nil + }) + if !ok { + // The only time when Schedule() fail to add the callback to the + // serializer is when the serializer is closed, and this happens only + // when the resolver wrapper is closed. return nil } - ccr.addChannelzTraceEvent(s) - ccr.curState = s - if err := ccr.cc.updateResolverState(ccr.curState, nil); err == balancer.ErrBadResolverState { - return balancer.ErrBadResolverState - } - return nil + return <-errCh } +// ReportError is called by resolver implementations to report errors +// encountered during name resolution to gRPC. func (ccr *ccResolverWrapper) ReportError(err error) { - ccr.incomingMu.Lock() - defer ccr.incomingMu.Unlock() - if ccr.done.HasFired() { - return - } - channelz.Warningf(logger, ccr.cc.channelzID, "ccResolverWrapper: reporting error to cc: %v", err) - ccr.cc.updateResolverState(resolver.State{}, err) + ccr.serializerScheduleLocked(func(_ context.Context) { + channelz.Warningf(logger, ccr.channelzID, "ccResolverWrapper: reporting error to cc: %v", err) + ccr.cc.updateResolverState(resolver.State{}, err) + }) } -// NewAddress is called by the resolver implementation to send addresses to gRPC. +// NewAddress is called by the resolver implementation to send addresses to +// gRPC. func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { - ccr.incomingMu.Lock() - defer ccr.incomingMu.Unlock() - if ccr.done.HasFired() { - return - } - ccr.addChannelzTraceEvent(resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig}) - ccr.curState.Addresses = addrs - ccr.cc.updateResolverState(ccr.curState, nil) + ccr.serializerScheduleLocked(func(_ context.Context) { + ccr.addChannelzTraceEvent(resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig}) + ccr.curState.Addresses = addrs + ccr.cc.updateResolverState(ccr.curState, nil) + }) } // NewServiceConfig is called by the resolver implementation to send service // configs to gRPC. func (ccr *ccResolverWrapper) NewServiceConfig(sc string) { - ccr.incomingMu.Lock() - defer ccr.incomingMu.Unlock() - if ccr.done.HasFired() { - return - } - channelz.Infof(logger, ccr.cc.channelzID, "ccResolverWrapper: got new service config: %s", sc) - if ccr.cc.dopts.disableServiceConfig { - channelz.Info(logger, ccr.cc.channelzID, "Service config lookups disabled; ignoring config") - return - } - scpr := parseServiceConfig(sc) - if scpr.Err != nil { - channelz.Warningf(logger, ccr.cc.channelzID, "ccResolverWrapper: error parsing service config: %v", scpr.Err) - return - } - ccr.addChannelzTraceEvent(resolver.State{Addresses: ccr.curState.Addresses, ServiceConfig: scpr}) - ccr.curState.ServiceConfig = scpr - ccr.cc.updateResolverState(ccr.curState, nil) + ccr.serializerScheduleLocked(func(_ context.Context) { + channelz.Infof(logger, ccr.channelzID, "ccResolverWrapper: got new service config: %s", sc) + if ccr.ignoreServiceConfig { + channelz.Info(logger, ccr.channelzID, "Service config lookups disabled; ignoring config") + return + } + scpr := parseServiceConfig(sc) + if scpr.Err != nil { + channelz.Warningf(logger, ccr.channelzID, "ccResolverWrapper: error parsing service config: %v", scpr.Err) + return + } + ccr.addChannelzTraceEvent(resolver.State{Addresses: ccr.curState.Addresses, ServiceConfig: scpr}) + ccr.curState.ServiceConfig = scpr + ccr.cc.updateResolverState(ccr.curState, nil) + }) } +// ParseServiceConfig is called by resolver implementations to parse a JSON +// representation of the service config. func (ccr *ccResolverWrapper) ParseServiceConfig(scJSON string) *serviceconfig.ParseResult { return parseServiceConfig(scJSON) } +// addChannelzTraceEvent adds a channelz trace event containing the new +// state received from resolver implementations. func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { var updates []string var oldSC, newSC *ServiceConfig @@ -172,5 +235,5 @@ func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { } else if len(ccr.curState.Addresses) == 0 && len(s.Addresses) > 0 { updates = append(updates, "resolver returned new addresses") } - channelz.Infof(logger, ccr.cc.channelzID, "Resolver state updated: %s (%v)", pretty.ToJSON(s), strings.Join(updates, "; ")) + channelz.Infof(logger, ccr.channelzID, "Resolver state updated: %s (%v)", pretty.ToJSON(s), strings.Join(updates, "; ")) } diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index 934fc1aa01..2030736a30 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -25,7 +25,6 @@ import ( "encoding/binary" "fmt" "io" - "io/ioutil" "math" "strings" "sync" @@ -77,7 +76,7 @@ func NewGZIPCompressorWithLevel(level int) (Compressor, error) { return &gzipCompressor{ pool: sync.Pool{ New: func() interface{} { - w, err := gzip.NewWriterLevel(ioutil.Discard, level) + w, err := gzip.NewWriterLevel(io.Discard, level) if err != nil { panic(err) } @@ -143,7 +142,7 @@ func (d *gzipDecompressor) Do(r io.Reader) ([]byte, error) { z.Close() d.pool.Put(z) }() - return ioutil.ReadAll(z) + return io.ReadAll(z) } func (d *gzipDecompressor) Type() string { @@ -160,6 +159,7 @@ type callInfo struct { contentSubtype string codec baseCodec maxRetryRPCBufferSize int + onFinish []func(err error) } func defaultCallInfo() *callInfo { @@ -296,8 +296,44 @@ func (o FailFastCallOption) before(c *callInfo) error { } func (o FailFastCallOption) after(c *callInfo, attempt *csAttempt) {} +// OnFinish returns a CallOption that configures a callback to be called when +// the call completes. The error passed to the callback is the status of the +// RPC, and may be nil. The onFinish callback provided will only be called once +// by gRPC. This is mainly used to be used by streaming interceptors, to be +// notified when the RPC completes along with information about the status of +// the RPC. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func OnFinish(onFinish func(err error)) CallOption { + return OnFinishCallOption{ + OnFinish: onFinish, + } +} + +// OnFinishCallOption is CallOption that indicates a callback to be called when +// the call completes. +// +// # Experimental +// +// Notice: This type is EXPERIMENTAL and may be changed or removed in a +// later release. +type OnFinishCallOption struct { + OnFinish func(error) +} + +func (o OnFinishCallOption) before(c *callInfo) error { + c.onFinish = append(c.onFinish, o.OnFinish) + return nil +} + +func (o OnFinishCallOption) after(c *callInfo, attempt *csAttempt) {} + // MaxCallRecvMsgSize returns a CallOption which sets the maximum message size -// in bytes the client can receive. +// in bytes the client can receive. If this is not set, gRPC uses the default +// 4MB. func MaxCallRecvMsgSize(bytes int) CallOption { return MaxRecvMsgSizeCallOption{MaxRecvMsgSize: bytes} } @@ -320,7 +356,8 @@ func (o MaxRecvMsgSizeCallOption) before(c *callInfo) error { func (o MaxRecvMsgSizeCallOption) after(c *callInfo, attempt *csAttempt) {} // MaxCallSendMsgSize returns a CallOption which sets the maximum message size -// in bytes the client can send. +// in bytes the client can send. If this is not set, gRPC uses the default +// `math.MaxInt32`. func MaxCallSendMsgSize(bytes int) CallOption { return MaxSendMsgSizeCallOption{MaxSendMsgSize: bytes} } @@ -657,12 +694,13 @@ func msgHeader(data, compData []byte) (hdr []byte, payload []byte) { func outPayload(client bool, msg interface{}, data, payload []byte, t time.Time) *stats.OutPayload { return &stats.OutPayload{ - Client: client, - Payload: msg, - Data: data, - Length: len(data), - WireLength: len(payload) + headerLen, - SentTime: t, + Client: client, + Payload: msg, + Data: data, + Length: len(data), + WireLength: len(payload) + headerLen, + CompressedLength: len(payload), + SentTime: t, } } @@ -683,7 +721,7 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool } type payloadInfo struct { - wireLength int // The compressed length got from wire. + compressedLength int // The compressed length got from wire. uncompressedBytes []byte } @@ -693,7 +731,7 @@ func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxRecei return nil, err } if payInfo != nil { - payInfo.wireLength = len(d) + payInfo.compressedLength = len(d) } if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil); st != nil { @@ -711,7 +749,7 @@ func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxRecei d, size, err = decompress(compressor, d, maxReceiveMessageSize) } if err != nil { - return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err) + return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message: %v", err) } if size > maxReceiveMessageSize { // TODO: Revisit the error code. Currently keep it consistent with java @@ -746,7 +784,7 @@ func decompress(compressor encoding.Compressor, d []byte, maxReceiveMessageSize } // Read from LimitReader with limit max+1. So if the underlying // reader is over limit, the result will be bigger than max. - d, err = ioutil.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) + d, err = io.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) return d, len(d), err } @@ -759,7 +797,7 @@ func recv(p *parser, c baseCodec, s *transport.Stream, dc Decompressor, m interf return err } if err := c.Unmarshal(d, m); err != nil { - return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err) + return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message: %v", err) } if payInfo != nil { payInfo.uncompressedBytes = d diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index 2808b7c83e..81969e7c15 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -43,8 +43,8 @@ import ( "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/grpcsync" + "google.golang.org/grpc/internal/grpcutil" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" @@ -74,10 +74,10 @@ func init() { srv.drainServerTransports(addr) } internal.AddGlobalServerOptions = func(opt ...ServerOption) { - extraServerOptions = append(extraServerOptions, opt...) + globalServerOptions = append(globalServerOptions, opt...) } internal.ClearGlobalServerOptions = func() { - extraServerOptions = nil + globalServerOptions = nil } internal.BinaryLogger = binaryLogger internal.JoinServerOptions = newJoinServerOption @@ -145,7 +145,7 @@ type Server struct { channelzID *channelz.Identifier czData *channelzData - serverWorkerChannels []chan *serverWorkerData + serverWorkerChannel chan *serverWorkerData } type serverOptions struct { @@ -183,7 +183,7 @@ var defaultServerOptions = serverOptions{ writeBufferSize: defaultWriteBufSize, readBufferSize: defaultReadBufSize, } -var extraServerOptions []ServerOption +var globalServerOptions []ServerOption // A ServerOption sets options such as credentials, codec and keepalive parameters, etc. type ServerOption interface { @@ -560,47 +560,45 @@ func NumStreamWorkers(numServerWorkers uint32) ServerOption { const serverWorkerResetThreshold = 1 << 16 // serverWorkers blocks on a *transport.Stream channel forever and waits for -// data to be fed by serveStreams. This allows different requests to be +// data to be fed by serveStreams. This allows multiple requests to be // processed by the same goroutine, removing the need for expensive stack // re-allocations (see the runtime.morestack problem [1]). // // [1] https://github.com/golang/go/issues/18138 -func (s *Server) serverWorker(ch chan *serverWorkerData) { - // To make sure all server workers don't reset at the same time, choose a - // random number of iterations before resetting. - threshold := serverWorkerResetThreshold + grpcrand.Intn(serverWorkerResetThreshold) - for completed := 0; completed < threshold; completed++ { - data, ok := <-ch +func (s *Server) serverWorker() { + for completed := 0; completed < serverWorkerResetThreshold; completed++ { + data, ok := <-s.serverWorkerChannel if !ok { return } - s.handleStream(data.st, data.stream, s.traceInfo(data.st, data.stream)) - data.wg.Done() + s.handleSingleStream(data) } - go s.serverWorker(ch) + go s.serverWorker() } -// initServerWorkers creates worker goroutines and channels to process incoming +func (s *Server) handleSingleStream(data *serverWorkerData) { + defer data.wg.Done() + s.handleStream(data.st, data.stream, s.traceInfo(data.st, data.stream)) +} + +// initServerWorkers creates worker goroutines and a channel to process incoming // connections to reduce the time spent overall on runtime.morestack. func (s *Server) initServerWorkers() { - s.serverWorkerChannels = make([]chan *serverWorkerData, s.opts.numServerWorkers) + s.serverWorkerChannel = make(chan *serverWorkerData) for i := uint32(0); i < s.opts.numServerWorkers; i++ { - s.serverWorkerChannels[i] = make(chan *serverWorkerData) - go s.serverWorker(s.serverWorkerChannels[i]) + go s.serverWorker() } } func (s *Server) stopServerWorkers() { - for i := uint32(0); i < s.opts.numServerWorkers; i++ { - close(s.serverWorkerChannels[i]) - } + close(s.serverWorkerChannel) } // NewServer creates a gRPC server which has no service registered and has not // started to accept requests yet. func NewServer(opt ...ServerOption) *Server { opts := defaultServerOptions - for _, o := range extraServerOptions { + for _, o := range globalServerOptions { o.apply(&opts) } for _, o := range opt { @@ -897,7 +895,7 @@ func (s *Server) drainServerTransports(addr string) { s.mu.Lock() conns := s.conns[addr] for st := range conns { - st.Drain() + st.Drain("") } s.mu.Unlock() } @@ -945,26 +943,21 @@ func (s *Server) serveStreams(st transport.ServerTransport) { defer st.Close(errors.New("finished serving streams for the server transport")) var wg sync.WaitGroup - var roundRobinCounter uint32 st.HandleStreams(func(stream *transport.Stream) { wg.Add(1) if s.opts.numServerWorkers > 0 { data := &serverWorkerData{st: st, wg: &wg, stream: stream} select { - case s.serverWorkerChannels[atomic.AddUint32(&roundRobinCounter, 1)%s.opts.numServerWorkers] <- data: + case s.serverWorkerChannel <- data: + return default: // If all stream workers are busy, fallback to the default code path. - go func() { - s.handleStream(st, stream, s.traceInfo(st, stream)) - wg.Done() - }() } - } else { - go func() { - defer wg.Done() - s.handleStream(st, stream, s.traceInfo(st, stream)) - }() } + go func() { + defer wg.Done() + s.handleStream(st, stream, s.traceInfo(st, stream)) + }() }, func(ctx context.Context, method string) context.Context { if !EnableTracing { return ctx @@ -1053,7 +1046,7 @@ func (s *Server) addConn(addr string, st transport.ServerTransport) bool { if s.drain { // Transport added after we drained our existing conns: drain it // immediately. - st.Drain() + st.Drain("") } if s.conns[addr] == nil { @@ -1252,7 +1245,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. logEntry.PeerAddr = peer.Addr } for _, binlog := range binlogs { - binlog.Log(logEntry) + binlog.Log(ctx, logEntry) } } @@ -1263,6 +1256,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. var comp, decomp encoding.Compressor var cp Compressor var dc Decompressor + var sendCompressorName string // If dc is set and matches the stream's compression, use it. Otherwise, try // to find a matching registered compressor for decomp. @@ -1283,12 +1277,18 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. if s.opts.cp != nil { cp = s.opts.cp - stream.SetSendCompress(cp.Type()) + sendCompressorName = cp.Type() } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { // Legacy compressor not specified; attempt to respond with same encoding. comp = encoding.GetCompressor(rc) if comp != nil { - stream.SetSendCompress(rc) + sendCompressorName = comp.Name() + } + } + + if sendCompressorName != "" { + if err := stream.SetSendCompress(sendCompressorName); err != nil { + return status.Errorf(codes.Internal, "grpc: failed to set send compressor: %v", err) } } @@ -1299,7 +1299,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. d, err := recvAndDecompress(&parser{r: stream}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp) if err != nil { if e := t.WriteStatus(stream, status.Convert(err)); e != nil { - channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status %v", e) + channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e) } return err } @@ -1312,11 +1312,12 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. } for _, sh := range shs { sh.HandleRPC(stream.Context(), &stats.InPayload{ - RecvTime: time.Now(), - Payload: v, - WireLength: payInfo.wireLength + headerLen, - Data: d, - Length: len(d), + RecvTime: time.Now(), + Payload: v, + Length: len(d), + WireLength: payInfo.compressedLength + headerLen, + CompressedLength: payInfo.compressedLength, + Data: d, }) } if len(binlogs) != 0 { @@ -1324,7 +1325,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. Message: d, } for _, binlog := range binlogs { - binlog.Log(cm) + binlog.Log(stream.Context(), cm) } } if trInfo != nil { @@ -1357,7 +1358,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. Header: h, } for _, binlog := range binlogs { - binlog.Log(sh) + binlog.Log(stream.Context(), sh) } } st := &binarylog.ServerTrailer{ @@ -1365,7 +1366,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. Err: appErr, } for _, binlog := range binlogs { - binlog.Log(st) + binlog.Log(stream.Context(), st) } } return appErr @@ -1375,6 +1376,11 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. } opts := &transport.Options{Last: true} + // Server handler could have set new compressor by calling SetSendCompressor. + // In case it is set, we need to use it for compressing outbound message. + if stream.SendCompress() != sendCompressorName { + comp = encoding.GetCompressor(stream.SendCompress()) + } if err := s.sendResponse(t, stream, reply, cp, opts, comp); err != nil { if err == io.EOF { // The entire stream is done (for unary RPC only). @@ -1402,8 +1408,8 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. Err: appErr, } for _, binlog := range binlogs { - binlog.Log(sh) - binlog.Log(st) + binlog.Log(stream.Context(), sh) + binlog.Log(stream.Context(), st) } } return err @@ -1417,8 +1423,8 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. Message: reply, } for _, binlog := range binlogs { - binlog.Log(sh) - binlog.Log(sm) + binlog.Log(stream.Context(), sh) + binlog.Log(stream.Context(), sm) } } if channelz.IsOn() { @@ -1430,17 +1436,16 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. // 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? - err = t.WriteStatus(stream, statusOK) if len(binlogs) != 0 { st := &binarylog.ServerTrailer{ Trailer: stream.Trailer(), Err: appErr, } for _, binlog := range binlogs { - binlog.Log(st) + binlog.Log(stream.Context(), st) } } - return err + return t.WriteStatus(stream, statusOK) } // chainStreamServerInterceptors chains all stream server interceptors into one. @@ -1574,7 +1579,7 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp logEntry.PeerAddr = peer.Addr } for _, binlog := range ss.binlogs { - binlog.Log(logEntry) + binlog.Log(stream.Context(), logEntry) } } @@ -1597,12 +1602,18 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. if s.opts.cp != nil { ss.cp = s.opts.cp - stream.SetSendCompress(s.opts.cp.Type()) + ss.sendCompressorName = s.opts.cp.Type() } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { // Legacy compressor not specified; attempt to respond with same encoding. ss.comp = encoding.GetCompressor(rc) if ss.comp != nil { - stream.SetSendCompress(rc) + ss.sendCompressorName = rc + } + } + + if ss.sendCompressorName != "" { + if err := stream.SetSendCompress(ss.sendCompressorName); err != nil { + return status.Errorf(codes.Internal, "grpc: failed to set send compressor: %v", err) } } @@ -1640,16 +1651,16 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp ss.trInfo.tr.SetError() ss.mu.Unlock() } - t.WriteStatus(ss.s, appStatus) if len(ss.binlogs) != 0 { st := &binarylog.ServerTrailer{ Trailer: ss.s.Trailer(), Err: appErr, } for _, binlog := range ss.binlogs { - binlog.Log(st) + binlog.Log(stream.Context(), st) } } + t.WriteStatus(ss.s, appStatus) // TODO: Should we log an error from WriteStatus here and below? return appErr } @@ -1658,17 +1669,16 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp ss.trInfo.tr.LazyLog(stringer("OK"), false) ss.mu.Unlock() } - err = t.WriteStatus(ss.s, statusOK) if len(ss.binlogs) != 0 { st := &binarylog.ServerTrailer{ Trailer: ss.s.Trailer(), Err: appErr, } for _, binlog := range ss.binlogs { - binlog.Log(st) + binlog.Log(stream.Context(), st) } } - return err + return t.WriteStatus(ss.s, statusOK) } func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream, trInfo *traceInfo) { @@ -1846,7 +1856,7 @@ func (s *Server) GracefulStop() { if !s.drain { for _, conns := range s.conns { for st := range conns { - st.Drain() + st.Drain("graceful_stop") } } s.drain = true @@ -1935,6 +1945,60 @@ func SendHeader(ctx context.Context, md metadata.MD) error { return nil } +// SetSendCompressor sets a compressor for outbound messages from the server. +// It must not be called after any event that causes headers to be sent +// (see ServerStream.SetHeader for the complete list). Provided compressor is +// used when below conditions are met: +// +// - compressor is registered via encoding.RegisterCompressor +// - compressor name must exist in the client advertised compressor names +// sent in grpc-accept-encoding header. Use ClientSupportedCompressors to +// get client supported compressor names. +// +// The context provided must be the context passed to the server's handler. +// It must be noted that compressor name encoding.Identity disables the +// outbound compression. +// By default, server messages will be sent using the same compressor with +// which request messages were sent. +// +// It is not safe to call SetSendCompressor concurrently with SendHeader and +// SendMsg. +// +// # Experimental +// +// Notice: This function is EXPERIMENTAL and may be changed or removed in a +// later release. +func SetSendCompressor(ctx context.Context, name string) error { + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + if !ok || stream == nil { + return fmt.Errorf("failed to fetch the stream from the given context") + } + + if err := validateSendCompressor(name, stream.ClientAdvertisedCompressors()); err != nil { + return fmt.Errorf("unable to set send compressor: %w", err) + } + + return stream.SetSendCompress(name) +} + +// ClientSupportedCompressors returns compressor names advertised by the client +// via grpc-accept-encoding header. +// +// The context provided must be the context passed to the server's handler. +// +// # Experimental +// +// Notice: This function is EXPERIMENTAL and may be changed or removed in a +// later release. +func ClientSupportedCompressors(ctx context.Context) ([]string, error) { + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + if !ok || stream == nil { + return nil, fmt.Errorf("failed to fetch the stream from the given context %v", ctx) + } + + return strings.Split(stream.ClientAdvertisedCompressors(), ","), nil +} + // SetTrailer sets the trailer metadata that will be sent when an RPC returns. // When called more than once, all the provided metadata will be merged. // @@ -1969,3 +2033,22 @@ type channelzServer struct { func (c *channelzServer) ChannelzMetric() *channelz.ServerInternalMetric { return c.s.channelzMetric() } + +// validateSendCompressor returns an error when given compressor name cannot be +// handled by the server or the client based on the advertised compressors. +func validateSendCompressor(name, clientCompressors string) error { + if name == encoding.Identity { + return nil + } + + if !grpcutil.IsCompressorNameRegistered(name) { + return fmt.Errorf("compressor not registered %q", name) + } + + for _, c := range strings.Split(clientCompressors, ",") { + if c == name { + return nil // found match + } + } + return fmt.Errorf("client does not support compressor %q", name) +} diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go index 01bbb2025a..0df11fc098 100644 --- a/vendor/google.golang.org/grpc/service_config.go +++ b/vendor/google.golang.org/grpc/service_config.go @@ -23,8 +23,6 @@ import ( "errors" "fmt" "reflect" - "strconv" - "strings" "time" "google.golang.org/grpc/codes" @@ -106,8 +104,8 @@ type healthCheckConfig struct { type jsonRetryPolicy struct { MaxAttempts int - InitialBackoff string - MaxBackoff string + InitialBackoff internalserviceconfig.Duration + MaxBackoff internalserviceconfig.Duration BackoffMultiplier float64 RetryableStatusCodes []codes.Code } @@ -129,50 +127,6 @@ type retryThrottlingPolicy struct { TokenRatio float64 } -func parseDuration(s *string) (*time.Duration, error) { - if s == nil { - return nil, nil - } - if !strings.HasSuffix(*s, "s") { - return nil, fmt.Errorf("malformed duration %q", *s) - } - ss := strings.SplitN((*s)[:len(*s)-1], ".", 3) - if len(ss) > 2 { - return nil, fmt.Errorf("malformed duration %q", *s) - } - // hasDigits is set if either the whole or fractional part of the number is - // present, since both are optional but one is required. - hasDigits := false - var d time.Duration - if len(ss[0]) > 0 { - i, err := strconv.ParseInt(ss[0], 10, 32) - if err != nil { - return nil, fmt.Errorf("malformed duration %q: %v", *s, err) - } - d = time.Duration(i) * time.Second - hasDigits = true - } - if len(ss) == 2 && len(ss[1]) > 0 { - if len(ss[1]) > 9 { - return nil, fmt.Errorf("malformed duration %q", *s) - } - f, err := strconv.ParseInt(ss[1], 10, 64) - if err != nil { - return nil, fmt.Errorf("malformed duration %q: %v", *s, err) - } - for i := 9; i > len(ss[1]); i-- { - f *= 10 - } - d += time.Duration(f) - hasDigits = true - } - if !hasDigits { - return nil, fmt.Errorf("malformed duration %q", *s) - } - - return &d, nil -} - type jsonName struct { Service string Method string @@ -201,7 +155,7 @@ func (j jsonName) generatePath() (string, error) { type jsonMC struct { Name *[]jsonName WaitForReady *bool - Timeout *string + Timeout *internalserviceconfig.Duration MaxRequestMessageBytes *int64 MaxResponseMessageBytes *int64 RetryPolicy *jsonRetryPolicy @@ -226,7 +180,7 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { var rsc jsonSC err := json.Unmarshal([]byte(js), &rsc) if err != nil { - logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) + logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } sc := ServiceConfig{ @@ -252,18 +206,13 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { if m.Name == nil { continue } - d, err := parseDuration(m.Timeout) - if err != nil { - logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) - return &serviceconfig.ParseResult{Err: err} - } mc := MethodConfig{ WaitForReady: m.WaitForReady, - Timeout: d, + Timeout: (*time.Duration)(m.Timeout), } if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil { - logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) + logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } if m.MaxRequestMessageBytes != nil { @@ -283,13 +232,13 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { for i, n := range *m.Name { path, err := n.generatePath() if err != nil { - logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } if _, ok := paths[path]; ok { err = errDuplicatedName - logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } paths[path] = struct{}{} @@ -312,18 +261,10 @@ func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPol if jrp == nil { return nil, nil } - ib, err := parseDuration(&jrp.InitialBackoff) - if err != nil { - return nil, err - } - mb, err := parseDuration(&jrp.MaxBackoff) - if err != nil { - return nil, err - } if jrp.MaxAttempts <= 1 || - *ib <= 0 || - *mb <= 0 || + jrp.InitialBackoff <= 0 || + jrp.MaxBackoff <= 0 || jrp.BackoffMultiplier <= 0 || len(jrp.RetryableStatusCodes) == 0 { logger.Warningf("grpc: ignoring retry policy %v due to illegal configuration", jrp) @@ -332,8 +273,8 @@ func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPol rp := &internalserviceconfig.RetryPolicy{ MaxAttempts: jrp.MaxAttempts, - InitialBackoff: *ib, - MaxBackoff: *mb, + InitialBackoff: time.Duration(jrp.InitialBackoff), + MaxBackoff: time.Duration(jrp.MaxBackoff), BackoffMultiplier: jrp.BackoffMultiplier, RetryableStatusCodes: make(map[codes.Code]bool), } diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go index 0285dcc6a2..7a552a9b78 100644 --- a/vendor/google.golang.org/grpc/stats/stats.go +++ b/vendor/google.golang.org/grpc/stats/stats.go @@ -67,10 +67,18 @@ type InPayload struct { Payload interface{} // Data is the serialized message payload. Data []byte - // Length is the length of uncompressed data. + + // Length is the size of the uncompressed payload data. Does not include any + // framing (gRPC or HTTP/2). Length int - // WireLength is the length of data on wire (compressed, signed, encrypted). + // CompressedLength is the size of the compressed payload data. Does not + // include any framing (gRPC or HTTP/2). Same as Length if compression not + // enabled. + CompressedLength int + // WireLength is the size of the compressed payload data plus gRPC framing. + // Does not include HTTP/2 framing. WireLength int + // RecvTime is the time when the payload is received. RecvTime time.Time } @@ -129,9 +137,15 @@ type OutPayload struct { Payload interface{} // Data is the serialized message payload. Data []byte - // Length is the length of uncompressed data. + // Length is the size of the uncompressed payload data. Does not include any + // framing (gRPC or HTTP/2). Length int - // WireLength is the length of data on wire (compressed, signed, encrypted). + // CompressedLength is the size of the compressed payload data. Does not + // include any framing (gRPC or HTTP/2). Same as Length if compression not + // enabled. + CompressedLength int + // WireLength is the size of the compressed payload data plus gRPC framing. + // Does not include HTTP/2 framing. WireLength int // SentTime is the time when the payload is sent. SentTime time.Time diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go index 623be39f26..53910fb7c9 100644 --- a/vendor/google.golang.org/grpc/status/status.go +++ b/vendor/google.golang.org/grpc/status/status.go @@ -77,7 +77,9 @@ func FromProto(s *spb.Status) *Status { // FromError returns a Status representation of err. // // - If err was produced by this package or implements the method `GRPCStatus() -// *Status`, the appropriate Status is returned. +// *Status`, or if err wraps a type satisfying this, the appropriate Status is +// returned. For wrapped errors, the message returned contains the entire +// err.Error() text and not just the wrapped status. // // - If err is nil, a Status is returned with codes.OK and no message. // @@ -88,10 +90,15 @@ func FromError(err error) (s *Status, ok bool) { if err == nil { return nil, true } - if se, ok := err.(interface { - GRPCStatus() *Status - }); ok { - return se.GRPCStatus(), true + type grpcstatus interface{ GRPCStatus() *Status } + if gs, ok := err.(grpcstatus); ok { + return gs.GRPCStatus(), true + } + var gs grpcstatus + if errors.As(err, &gs) { + p := gs.GRPCStatus().Proto() + p.Message = err.Error() + return status.FromProto(p), true } return New(codes.Unknown, err.Error()), false } @@ -103,19 +110,16 @@ func Convert(err error) *Status { return s } -// Code returns the Code of the error if it is a Status error, codes.OK if err -// is nil, or codes.Unknown otherwise. +// Code returns the Code of the error if it is a Status error or if it wraps a +// Status error. If that is not the case, it returns codes.OK if err is nil, or +// codes.Unknown otherwise. func Code(err error) codes.Code { // Don't use FromError to avoid allocation of OK status. if err == nil { return codes.OK } - if se, ok := err.(interface { - GRPCStatus() *Status - }); ok { - return se.GRPCStatus().Code() - } - return codes.Unknown + + return Convert(err).Code() } // FromContextError converts a context error or wrapped context error into a diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index 0f8e6c0149..10092685b2 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -123,6 +123,9 @@ type ClientStream interface { // 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. It is also // not safe to call CloseSend concurrently with SendMsg. + // + // It is not safe to modify the message after calling SendMsg. Tracing + // libraries and stats handlers may use the message lazily. SendMsg(m interface{}) error // RecvMsg blocks until it receives a message into m or the stream is // done. It returns io.EOF when the stream completes successfully. On @@ -152,6 +155,11 @@ type ClientStream interface { // If none of the above happen, a goroutine and a context will be leaked, and grpc // will not call the optionally-configured stats handler with a stats.End message. func (cc *ClientConn) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { + if err := cc.idlenessMgr.onCallBegin(); err != nil { + return nil, err + } + defer cc.idlenessMgr.onCallEnd() + // allow interceptor to see all applicable call options, which means those // configured as defaults from dial option as well as per-call options opts = combine(cc.dopts.callOptions, opts) @@ -168,10 +176,19 @@ 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) { - if md, _, ok := metadata.FromOutgoingContextRaw(ctx); ok { + if md, added, ok := metadata.FromOutgoingContextRaw(ctx); ok { + // validate md if err := imetadata.Validate(md); err != nil { return nil, status.Error(codes.Internal, err.Error()) } + // validate added + for _, kvs := range added { + for i := 0; i < len(kvs); i += 2 { + if err := imetadata.ValidatePair(kvs[i], kvs[i+1]); err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + } + } } if channelz.IsOn() { cc.incrCallsStarted() @@ -352,7 +369,7 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client } } for _, binlog := range cs.binlogs { - binlog.Log(logEntry) + binlog.Log(cs.ctx, logEntry) } } @@ -438,7 +455,7 @@ func (a *csAttempt) getTransport() error { cs := a.cs var err error - a.t, a.done, err = cs.cc.getTransport(a.ctx, cs.callInfo.failFast, cs.callHdr.Method) + a.t, a.pickResult, err = cs.cc.getTransport(a.ctx, cs.callInfo.failFast, cs.callHdr.Method) if err != nil { if de, ok := err.(dropError); ok { err = de.error @@ -455,6 +472,25 @@ func (a *csAttempt) getTransport() error { func (a *csAttempt) newStream() error { cs := a.cs cs.callHdr.PreviousAttempts = cs.numRetries + + // Merge metadata stored in PickResult, if any, with existing call metadata. + // It is safe to overwrite the csAttempt's context here, since all state + // maintained in it are local to the attempt. When the attempt has to be + // retried, a new instance of csAttempt will be created. + if a.pickResult.Metadata != nil { + // We currently do not have a function it the metadata package which + // merges given metadata with existing metadata in a context. Existing + // function `AppendToOutgoingContext()` takes a variadic argument of key + // value pairs. + // + // TODO: Make it possible to retrieve key value pairs from metadata.MD + // in a form passable to AppendToOutgoingContext(), or create a version + // of AppendToOutgoingContext() that accepts a metadata.MD. + md, _ := metadata.FromOutgoingContext(a.ctx) + md = metadata.Join(md, a.pickResult.Metadata) + a.ctx = metadata.NewOutgoingContext(a.ctx, md) + } + s, err := a.t.NewStream(a.ctx, cs.callHdr) if err != nil { nse, ok := err.(*transport.NewStreamError) @@ -529,12 +565,12 @@ type clientStream struct { // csAttempt implements a single transport stream attempt within a // clientStream. type csAttempt struct { - ctx context.Context - cs *clientStream - t transport.ClientTransport - s *transport.Stream - p *parser - done func(balancer.DoneInfo) + ctx context.Context + cs *clientStream + t transport.ClientTransport + s *transport.Stream + p *parser + pickResult balancer.PickResult finished bool dc Decompressor @@ -781,7 +817,7 @@ func (cs *clientStream) Header() (metadata.MD, error) { } cs.serverHeaderBinlogged = true for _, binlog := range cs.binlogs { - binlog.Log(logEntry) + binlog.Log(cs.ctx, logEntry) } } return m, nil @@ -862,7 +898,7 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { Message: data, } for _, binlog := range cs.binlogs { - binlog.Log(cm) + binlog.Log(cs.ctx, cm) } } return err @@ -886,7 +922,7 @@ func (cs *clientStream) RecvMsg(m interface{}) error { Message: recvInfo.uncompressedBytes, } for _, binlog := range cs.binlogs { - binlog.Log(sm) + binlog.Log(cs.ctx, sm) } } if err != nil || !cs.desc.ServerStreams { @@ -907,7 +943,7 @@ func (cs *clientStream) RecvMsg(m interface{}) error { logEntry.PeerAddr = peer.Addr } for _, binlog := range cs.binlogs { - binlog.Log(logEntry) + binlog.Log(cs.ctx, logEntry) } } } @@ -934,7 +970,7 @@ func (cs *clientStream) CloseSend() error { OnClientSide: true, } for _, binlog := range cs.binlogs { - binlog.Log(chc) + binlog.Log(cs.ctx, chc) } } // We never returned an error here for reasons. @@ -952,6 +988,9 @@ func (cs *clientStream) finish(err error) { return } cs.finished = true + for _, onFinish := range cs.callInfo.onFinish { + onFinish(err) + } cs.commitAttemptLocked() if cs.attempt != nil { cs.attempt.finish(err) @@ -973,7 +1012,7 @@ func (cs *clientStream) finish(err error) { OnClientSide: true, } for _, binlog := range cs.binlogs { - binlog.Log(c) + binlog.Log(cs.ctx, c) } } if err == nil { @@ -1062,9 +1101,10 @@ func (a *csAttempt) recvMsg(m interface{}, payInfo *payloadInfo) (err error) { RecvTime: time.Now(), Payload: m, // TODO truncate large payload. - Data: payInfo.uncompressedBytes, - WireLength: payInfo.wireLength + headerLen, - Length: len(payInfo.uncompressedBytes), + Data: payInfo.uncompressedBytes, + WireLength: payInfo.compressedLength + headerLen, + CompressedLength: payInfo.compressedLength, + Length: len(payInfo.uncompressedBytes), }) } if channelz.IsOn() { @@ -1103,12 +1143,12 @@ func (a *csAttempt) finish(err error) { tr = a.s.Trailer() } - if a.done != nil { + if a.pickResult.Done != nil { br := false if a.s != nil { br = a.s.BytesReceived() } - a.done(balancer.DoneInfo{ + a.pickResult.Done(balancer.DoneInfo{ Err: err, Trailer: tr, BytesSent: a.s != nil, @@ -1233,14 +1273,19 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin as.p = &parser{r: s} ac.incrCallsStarted() if desc != unaryStreamDesc { - // Listen on cc and stream contexts to cleanup when the user closes the - // ClientConn or cancels the stream context. In all other cases, an error - // should already be injected into the recv buffer by the transport, which - // the client will eventually receive, and then we will cancel the stream's - // context in clientStream.finish. + // Listen on stream context to cleanup when the stream context is + // canceled. Also listen for the addrConn's context in case the + // addrConn is closed or reconnects to a different address. In all + // other cases, an error should already be injected into the recv + // buffer by the transport, which the client will eventually receive, + // and then we will cancel the stream's context in + // addrConnStream.finish. go func() { + ac.mu.Lock() + acCtx := ac.ctx + ac.mu.Unlock() select { - case <-ac.ctx.Done(): + case <-acCtx.Done(): as.finish(status.Error(codes.Canceled, "grpc: the SubConn is closing")) case <-ctx.Done(): as.finish(toRPCErr(ctx.Err())) @@ -1464,6 +1509,9 @@ type ServerStream interface { // It is 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. + // + // It is not safe to modify the message after calling SendMsg. Tracing + // libraries and stats handlers may use the message lazily. SendMsg(m interface{}) error // RecvMsg blocks until it receives a message into m or the stream is // done. It returns io.EOF when the client has performed a CloseSend. On @@ -1489,6 +1537,8 @@ type serverStream struct { comp encoding.Compressor decomp encoding.Compressor + sendCompressorName string + maxReceiveMessageSize int maxSendMessageSize int trInfo *traceInfo @@ -1536,7 +1586,7 @@ func (ss *serverStream) SendHeader(md metadata.MD) error { } ss.serverHeaderBinlogged = true for _, binlog := range ss.binlogs { - binlog.Log(sh) + binlog.Log(ss.ctx, sh) } } return err @@ -1581,6 +1631,13 @@ func (ss *serverStream) SendMsg(m interface{}) (err error) { } }() + // Server handler could have set new compressor by calling SetSendCompressor. + // In case it is set, we need to use it for compressing outbound message. + if sendCompressorsName := ss.s.SendCompress(); sendCompressorsName != ss.sendCompressorName { + ss.comp = encoding.GetCompressor(sendCompressorsName) + ss.sendCompressorName = sendCompressorsName + } + // load hdr, payload, data hdr, payload, data, err := prepareMsg(m, ss.codec, ss.cp, ss.comp) if err != nil { @@ -1602,14 +1659,14 @@ func (ss *serverStream) SendMsg(m interface{}) (err error) { } ss.serverHeaderBinlogged = true for _, binlog := range ss.binlogs { - binlog.Log(sh) + binlog.Log(ss.ctx, sh) } } sm := &binarylog.ServerMessage{ Message: data, } for _, binlog := range ss.binlogs { - binlog.Log(sm) + binlog.Log(ss.ctx, sm) } } if len(ss.statsHandler) != 0 { @@ -1657,7 +1714,7 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { if len(ss.binlogs) != 0 { chc := &binarylog.ClientHalfClose{} for _, binlog := range ss.binlogs { - binlog.Log(chc) + binlog.Log(ss.ctx, chc) } } return err @@ -1673,9 +1730,10 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { RecvTime: time.Now(), Payload: m, // TODO truncate large payload. - Data: payInfo.uncompressedBytes, - WireLength: payInfo.wireLength + headerLen, - Length: len(payInfo.uncompressedBytes), + Data: payInfo.uncompressedBytes, + Length: len(payInfo.uncompressedBytes), + WireLength: payInfo.compressedLength + headerLen, + CompressedLength: payInfo.compressedLength, }) } } @@ -1684,7 +1742,7 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { Message: payInfo.uncompressedBytes, } for _, binlog := range ss.binlogs { - binlog.Log(cm) + binlog.Log(ss.ctx, cm) } } return nil diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index 19b419bfeb..0f1f8b9b33 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.52.1" +const Version = "1.56.1" diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh index 1d03c09148..a8e4732b3d 100644 --- a/vendor/google.golang.org/grpc/vet.sh +++ b/vendor/google.golang.org/grpc/vet.sh @@ -41,16 +41,8 @@ if [[ "$1" = "-install" ]]; then github.com/client9/misspell/cmd/misspell popd if [[ -z "${VET_SKIP_PROTO}" ]]; then - if [[ "${TRAVIS}" = "true" ]]; then - PROTOBUF_VERSION=3.14.0 - PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip - pushd /home/travis - wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} - unzip ${PROTOC_FILENAME} - bin/protoc --version - popd - elif [[ "${GITHUB_ACTIONS}" = "true" ]]; then - PROTOBUF_VERSION=3.14.0 + if [[ "${GITHUB_ACTIONS}" = "true" ]]; then + PROTOBUF_VERSION=22.0 # a.k.a v4.22.0 in pb.go files. PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip pushd /home/runner/go wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} @@ -66,6 +58,16 @@ elif [[ "$#" -ne 0 ]]; then die "Unknown argument(s): $*" fi +# - Check that generated proto files are up to date. +if [[ -z "${VET_SKIP_PROTO}" ]]; then + make proto && git status --porcelain 2>&1 | fail_on_output || \ + (git status; git --no-pager diff; exit 1) +fi + +if [[ -n "${VET_ONLY_PROTO}" ]]; then + exit 0 +fi + # - Ensure all source files contain a copyright message. # (Done in two parts because Darwin "git grep" has broken support for compound # exclusion matches.) @@ -93,13 +95,6 @@ git grep '"github.com/envoyproxy/go-control-plane/envoy' -- '*.go' ':(exclude)*. misspell -error . -# - Check that generated proto files are up to date. -if [[ -z "${VET_SKIP_PROTO}" ]]; then - PATH="/home/travis/bin:${PATH}" make proto && \ - git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) -fi - # - gofmt, goimports, golint (with exceptions for generated code), go vet, # go mod tidy. # Perform these checks on each module inside gRPC. @@ -111,7 +106,7 @@ for MOD_FILE in $(find . -name 'go.mod'); do goimports -l . 2>&1 | not grep -vE "\.pb\.go" golint ./... 2>&1 | not grep -vE "/grpc_testing_not_regenerate/.*\.pb\.go:" - go mod tidy + go mod tidy -compat=1.17 git status --porcelain 2>&1 | fail_on_output || \ (git status; git --no-pager diff; exit 1) popd diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/doc.go b/vendor/google.golang.org/protobuf/encoding/protojson/doc.go index 00ea2fecfb..21d5d2cb18 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/doc.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/doc.go @@ -4,7 +4,7 @@ // Package protojson marshals and unmarshals protocol buffer messages as JSON // format. It follows the guide at -// https://developers.google.com/protocol-buffers/docs/proto3#json. +// https://protobuf.dev/programming-guides/proto3#json. // // This package produces a different output than the standard "encoding/json" // package, which does not operate correctly on protocol buffer messages. diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/encode.go b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go index d09d22e139..66b95870e9 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go @@ -106,13 +106,19 @@ func (o MarshalOptions) Format(m proto.Message) string { // MarshalOptions. Do not depend on the output being stable. It may change over // time across different versions of the program. func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { - return o.marshal(m) + return o.marshal(nil, m) +} + +// MarshalAppend appends the JSON format encoding of m to b, +// returning the result. +func (o MarshalOptions) MarshalAppend(b []byte, m proto.Message) ([]byte, error) { + return o.marshal(b, m) } // marshal is a centralized function that all marshal operations go through. // For profiling purposes, avoid changing the name of this function or // introducing other code paths for marshal that do not go through this. -func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { +func (o MarshalOptions) marshal(b []byte, m proto.Message) ([]byte, error) { if o.Multiline && o.Indent == "" { o.Indent = defaultIndent } @@ -120,7 +126,7 @@ func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { o.Resolver = protoregistry.GlobalTypes } - internalEnc, err := json.NewEncoder(o.Indent) + internalEnc, err := json.NewEncoder(b, o.Indent) if err != nil { return nil, err } @@ -128,7 +134,7 @@ func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { // Treat nil message interface as an empty message, // in which case the output in an empty JSON object. if m == nil { - return []byte("{}"), nil + return append(b, '{', '}'), nil } enc := encoder{internalEnc, o} diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go index c85f846948..6c37d41744 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go @@ -814,16 +814,22 @@ func (d decoder) unmarshalTimestamp(m protoreflect.Message) error { return d.unexpectedTokenError(tok) } - t, err := time.Parse(time.RFC3339Nano, tok.ParsedString()) + s := tok.ParsedString() + t, err := time.Parse(time.RFC3339Nano, s) if err != nil { return d.newError(tok.Pos(), "invalid %v value %v", genid.Timestamp_message_fullname, tok.RawString()) } - // Validate seconds. No need to validate nanos because time.Parse would have - // covered that already. + // Validate seconds. secs := t.Unix() if secs < minTimestampSeconds || secs > maxTimestampSeconds { return d.newError(tok.Pos(), "%v value out of range: %v", genid.Timestamp_message_fullname, tok.RawString()) } + // Validate subseconds. + i := strings.LastIndexByte(s, '.') // start of subsecond field + j := strings.LastIndexAny(s, "Z-+") // start of timezone field + if i >= 0 && j >= i && j-i > len(".999999999") { + return d.newError(tok.Pos(), "invalid %v value %v", genid.Timestamp_message_fullname, tok.RawString()) + } fds := m.Descriptor().Fields() fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number) diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go index ebf6c65284..722a7b41df 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go @@ -101,13 +101,19 @@ func (o MarshalOptions) Format(m proto.Message) string { // MarshalOptions object. Do not depend on the output being stable. It may // change over time across different versions of the program. func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { - return o.marshal(m) + return o.marshal(nil, m) +} + +// MarshalAppend appends the textproto format encoding of m to b, +// returning the result. +func (o MarshalOptions) MarshalAppend(b []byte, m proto.Message) ([]byte, error) { + return o.marshal(b, m) } // marshal is a centralized function that all marshal operations go through. // For profiling purposes, avoid changing the name of this function or // introducing other code paths for marshal that do not go through this. -func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { +func (o MarshalOptions) marshal(b []byte, m proto.Message) ([]byte, error) { var delims = [2]byte{'{', '}'} if o.Multiline && o.Indent == "" { @@ -117,7 +123,7 @@ func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { o.Resolver = protoregistry.GlobalTypes } - internalEnc, err := text.NewEncoder(o.Indent, delims, o.EmitASCII) + internalEnc, err := text.NewEncoder(b, o.Indent, delims, o.EmitASCII) if err != nil { return nil, err } @@ -125,7 +131,7 @@ func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { // Treat nil message interface as an empty message, // in which case there is nothing to output. if m == nil { - return []byte{}, nil + return b, nil } enc := encoder{internalEnc, o} diff --git a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go index ce57f57ebd..f4b4686cf9 100644 --- a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +++ b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Package protowire parses and formats the raw wire encoding. -// See https://developers.google.com/protocol-buffers/docs/encoding. +// See https://protobuf.dev/programming-guides/encoding. // // For marshaling and unmarshaling entire protobuf messages, // use the "google.golang.org/protobuf/proto" package instead. @@ -29,12 +29,8 @@ const ( ) // IsValid reports whether the field number is semantically valid. -// -// Note that while numbers within the reserved range are semantically invalid, -// they are syntactically valid in the wire format. -// Implementations may treat records with reserved field numbers as unknown. func (n Number) IsValid() bool { - return MinValidNumber <= n && n < FirstReservedNumber || LastReservedNumber < n && n <= MaxValidNumber + return MinValidNumber <= n && n <= MaxValidNumber } // Type represents the wire type. diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go index b13fd29e81..d043a6ebe0 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go @@ -294,7 +294,7 @@ func (d *Decoder) isValueNext() bool { } // consumeToken constructs a Token for given Kind with raw value derived from -// current d.in and given size, and consumes the given size-lenght of it. +// current d.in and given size, and consumes the given size-length of it. func (d *Decoder) consumeToken(kind Kind, size int) Token { tok := Token{ kind: kind, diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go b/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go index fbdf348734..934f2dcb39 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go @@ -41,8 +41,10 @@ type Encoder struct { // // If indent is a non-empty string, it causes every entry for an Array or Object // to be preceded by the indent and trailed by a newline. -func NewEncoder(indent string) (*Encoder, error) { - e := &Encoder{} +func NewEncoder(buf []byte, indent string) (*Encoder, error) { + e := &Encoder{ + out: buf, + } if len(indent) > 0 { if strings.Trim(indent, " \t") != "" { return nil, errors.New("indent may only be composed of space or tab characters") @@ -176,13 +178,13 @@ func appendFloat(out []byte, n float64, bitSize int) []byte { // WriteInt writes out the given signed integer in JSON number value. func (e *Encoder) WriteInt(n int64) { e.prepareNext(scalar) - e.out = append(e.out, strconv.FormatInt(n, 10)...) + e.out = strconv.AppendInt(e.out, n, 10) } // WriteUint writes out the given unsigned integer in JSON number value. func (e *Encoder) WriteUint(n uint64) { e.prepareNext(scalar) - e.out = append(e.out, strconv.FormatUint(n, 10)...) + e.out = strconv.AppendUint(e.out, n, 10) } // StartObject writes out the '{' symbol. diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go index 427c62d037..87853e786d 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go @@ -412,12 +412,13 @@ func (d *Decoder) parseFieldName() (tok Token, err error) { // Field number. Identify if input is a valid number that is not negative // and is decimal integer within 32-bit range. if num := parseNumber(d.in); num.size > 0 { + str := num.string(d.in) if !num.neg && num.kind == numDec { - if _, err := strconv.ParseInt(string(d.in[:num.size]), 10, 32); err == nil { + if _, err := strconv.ParseInt(str, 10, 32); err == nil { return d.consumeToken(Name, num.size, uint8(FieldNumber)), nil } } - return Token{}, d.newSyntaxError("invalid field number: %s", d.in[:num.size]) + return Token{}, d.newSyntaxError("invalid field number: %s", str) } return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in)) diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go index 81a5d8c861..45c81f0298 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go @@ -15,17 +15,12 @@ func (d *Decoder) parseNumberValue() (Token, bool) { if num.neg { numAttrs |= isNegative } - strSize := num.size - last := num.size - 1 - if num.kind == numFloat && (d.in[last] == 'f' || d.in[last] == 'F') { - strSize = last - } tok := Token{ kind: Scalar, attrs: numberValue, pos: len(d.orig) - len(d.in), raw: d.in[:num.size], - str: string(d.in[:strSize]), + str: num.string(d.in), numAttrs: numAttrs, } d.consume(num.size) @@ -46,6 +41,27 @@ type number struct { kind uint8 neg bool size int + // if neg, this is the length of whitespace and comments between + // the minus sign and the rest fo the number literal + sep int +} + +func (num number) string(data []byte) string { + strSize := num.size + last := num.size - 1 + if num.kind == numFloat && (data[last] == 'f' || data[last] == 'F') { + strSize = last + } + if num.neg && num.sep > 0 { + // strip whitespace/comments between negative sign and the rest + strLen := strSize - num.sep + str := make([]byte, strLen) + str[0] = data[0] + copy(str[1:], data[num.sep+1:strSize]) + return string(str) + } + return string(data[:strSize]) + } // parseNumber constructs a number object from given input. It allows for the @@ -67,19 +83,22 @@ func parseNumber(input []byte) number { } // Optional - + var sep int if s[0] == '-' { neg = true s = s[1:] size++ + // Consume any whitespace or comments between the + // negative sign and the rest of the number + lenBefore := len(s) + s = consume(s, 0) + sep = lenBefore - len(s) + size += sep if len(s) == 0 { return number{} } } - // C++ allows for whitespace and comments in between the negative sign and - // the rest of the number. This logic currently does not but is consistent - // with v1. - switch { case s[0] == '0': if len(s) > 1 { @@ -116,7 +135,7 @@ func parseNumber(input []byte) number { if len(s) > 0 && !isDelim(s[0]) { return number{} } - return number{kind: kind, neg: neg, size: size} + return number{kind: kind, neg: neg, size: size, sep: sep} } } s = s[1:] @@ -188,5 +207,5 @@ func parseNumber(input []byte) number { return number{} } - return number{kind: kind, neg: neg, size: size} + return number{kind: kind, neg: neg, size: size, sep: sep} } diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go index da289ccce6..cf7aed77bc 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go @@ -53,8 +53,10 @@ type encoderState struct { // If outputASCII is true, strings will be serialized in such a way that // multi-byte UTF-8 sequences are escaped. This property ensures that the // overall output is ASCII (as opposed to UTF-8). -func NewEncoder(indent string, delims [2]byte, outputASCII bool) (*Encoder, error) { - e := &Encoder{} +func NewEncoder(buf []byte, indent string, delims [2]byte, outputASCII bool) (*Encoder, error) { + e := &Encoder{ + encoderState: encoderState{out: buf}, + } if len(indent) > 0 { if strings.Trim(indent, " \t") != "" { return nil, errors.New("indent may only be composed of space and tab characters") @@ -195,13 +197,13 @@ func appendFloat(out []byte, n float64, bitSize int) []byte { // WriteInt writes out the given signed integer value. func (e *Encoder) WriteInt(n int64) { e.prepareNext(scalar) - e.out = append(e.out, strconv.FormatInt(n, 10)...) + e.out = strconv.AppendInt(e.out, n, 10) } // WriteUint writes out the given unsigned integer value. func (e *Encoder) WriteUint(n uint64) { e.prepareNext(scalar) - e.out = append(e.out, strconv.FormatUint(n, 10)...) + e.out = strconv.AppendUint(e.out, n, 10) } // WriteLiteral writes out the given string as a literal value without quotes. diff --git a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go index e3cdf1c205..136f1b2157 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go @@ -50,6 +50,7 @@ const ( FileDescriptorProto_Options_field_name protoreflect.Name = "options" FileDescriptorProto_SourceCodeInfo_field_name protoreflect.Name = "source_code_info" FileDescriptorProto_Syntax_field_name protoreflect.Name = "syntax" + FileDescriptorProto_Edition_field_name protoreflect.Name = "edition" FileDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.name" FileDescriptorProto_Package_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.package" @@ -63,6 +64,7 @@ const ( FileDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.options" FileDescriptorProto_SourceCodeInfo_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.source_code_info" FileDescriptorProto_Syntax_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.syntax" + FileDescriptorProto_Edition_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.edition" ) // Field numbers for google.protobuf.FileDescriptorProto. @@ -79,6 +81,7 @@ const ( FileDescriptorProto_Options_field_number protoreflect.FieldNumber = 8 FileDescriptorProto_SourceCodeInfo_field_number protoreflect.FieldNumber = 9 FileDescriptorProto_Syntax_field_number protoreflect.FieldNumber = 12 + FileDescriptorProto_Edition_field_number protoreflect.FieldNumber = 13 ) // Names for google.protobuf.DescriptorProto. @@ -180,13 +183,58 @@ const ( // Field names for google.protobuf.ExtensionRangeOptions. const ( ExtensionRangeOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + ExtensionRangeOptions_Declaration_field_name protoreflect.Name = "declaration" + ExtensionRangeOptions_Verification_field_name protoreflect.Name = "verification" ExtensionRangeOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.uninterpreted_option" + ExtensionRangeOptions_Declaration_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.declaration" + ExtensionRangeOptions_Verification_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.verification" ) // Field numbers for google.protobuf.ExtensionRangeOptions. const ( ExtensionRangeOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 + ExtensionRangeOptions_Declaration_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Verification_field_number protoreflect.FieldNumber = 3 +) + +// Full and short names for google.protobuf.ExtensionRangeOptions.VerificationState. +const ( + ExtensionRangeOptions_VerificationState_enum_fullname = "google.protobuf.ExtensionRangeOptions.VerificationState" + ExtensionRangeOptions_VerificationState_enum_name = "VerificationState" +) + +// Names for google.protobuf.ExtensionRangeOptions.Declaration. +const ( + ExtensionRangeOptions_Declaration_message_name protoreflect.Name = "Declaration" + ExtensionRangeOptions_Declaration_message_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration" +) + +// Field names for google.protobuf.ExtensionRangeOptions.Declaration. +const ( + ExtensionRangeOptions_Declaration_Number_field_name protoreflect.Name = "number" + ExtensionRangeOptions_Declaration_FullName_field_name protoreflect.Name = "full_name" + ExtensionRangeOptions_Declaration_Type_field_name protoreflect.Name = "type" + ExtensionRangeOptions_Declaration_IsRepeated_field_name protoreflect.Name = "is_repeated" + ExtensionRangeOptions_Declaration_Reserved_field_name protoreflect.Name = "reserved" + ExtensionRangeOptions_Declaration_Repeated_field_name protoreflect.Name = "repeated" + + ExtensionRangeOptions_Declaration_Number_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.number" + ExtensionRangeOptions_Declaration_FullName_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.full_name" + ExtensionRangeOptions_Declaration_Type_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.type" + ExtensionRangeOptions_Declaration_IsRepeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.is_repeated" + ExtensionRangeOptions_Declaration_Reserved_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.reserved" + ExtensionRangeOptions_Declaration_Repeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.repeated" +) + +// Field numbers for google.protobuf.ExtensionRangeOptions.Declaration. +const ( + ExtensionRangeOptions_Declaration_Number_field_number protoreflect.FieldNumber = 1 + ExtensionRangeOptions_Declaration_FullName_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Declaration_Type_field_number protoreflect.FieldNumber = 3 + ExtensionRangeOptions_Declaration_IsRepeated_field_number protoreflect.FieldNumber = 4 + ExtensionRangeOptions_Declaration_Reserved_field_number protoreflect.FieldNumber = 5 + ExtensionRangeOptions_Declaration_Repeated_field_number protoreflect.FieldNumber = 6 ) // Names for google.protobuf.FieldDescriptorProto. @@ -494,26 +542,29 @@ const ( // Field names for google.protobuf.MessageOptions. const ( - MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format" - MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" - MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" - MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" - MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format" + MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" + MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" + MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" + MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" - MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" - MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" - MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" - MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" - MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" + MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" + MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" + MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" + MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" + MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated_legacy_json_field_conflicts" + MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" ) // Field numbers for google.protobuf.MessageOptions. const ( - MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1 - MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 - MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 - MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 - MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 + MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1 + MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 + MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 + MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 + MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 11 + MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) // Names for google.protobuf.FieldOptions. @@ -528,16 +579,26 @@ const ( FieldOptions_Packed_field_name protoreflect.Name = "packed" FieldOptions_Jstype_field_name protoreflect.Name = "jstype" FieldOptions_Lazy_field_name protoreflect.Name = "lazy" + FieldOptions_UnverifiedLazy_field_name protoreflect.Name = "unverified_lazy" FieldOptions_Deprecated_field_name protoreflect.Name = "deprecated" FieldOptions_Weak_field_name protoreflect.Name = "weak" + FieldOptions_DebugRedact_field_name protoreflect.Name = "debug_redact" + FieldOptions_Retention_field_name protoreflect.Name = "retention" + FieldOptions_Target_field_name protoreflect.Name = "target" + FieldOptions_Targets_field_name protoreflect.Name = "targets" FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" FieldOptions_Ctype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.ctype" FieldOptions_Packed_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.packed" FieldOptions_Jstype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.jstype" FieldOptions_Lazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.lazy" + FieldOptions_UnverifiedLazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.unverified_lazy" FieldOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.deprecated" FieldOptions_Weak_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.weak" + FieldOptions_DebugRedact_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.debug_redact" + FieldOptions_Retention_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.retention" + FieldOptions_Target_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.target" + FieldOptions_Targets_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.targets" FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" ) @@ -547,8 +608,13 @@ const ( FieldOptions_Packed_field_number protoreflect.FieldNumber = 2 FieldOptions_Jstype_field_number protoreflect.FieldNumber = 6 FieldOptions_Lazy_field_number protoreflect.FieldNumber = 5 + FieldOptions_UnverifiedLazy_field_number protoreflect.FieldNumber = 15 FieldOptions_Deprecated_field_number protoreflect.FieldNumber = 3 FieldOptions_Weak_field_number protoreflect.FieldNumber = 10 + FieldOptions_DebugRedact_field_number protoreflect.FieldNumber = 16 + FieldOptions_Retention_field_number protoreflect.FieldNumber = 17 + FieldOptions_Target_field_number protoreflect.FieldNumber = 18 + FieldOptions_Targets_field_number protoreflect.FieldNumber = 19 FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -564,6 +630,18 @@ const ( FieldOptions_JSType_enum_name = "JSType" ) +// Full and short names for google.protobuf.FieldOptions.OptionRetention. +const ( + FieldOptions_OptionRetention_enum_fullname = "google.protobuf.FieldOptions.OptionRetention" + FieldOptions_OptionRetention_enum_name = "OptionRetention" +) + +// Full and short names for google.protobuf.FieldOptions.OptionTargetType. +const ( + FieldOptions_OptionTargetType_enum_fullname = "google.protobuf.FieldOptions.OptionTargetType" + FieldOptions_OptionTargetType_enum_name = "OptionTargetType" +) + // Names for google.protobuf.OneofOptions. const ( OneofOptions_message_name protoreflect.Name = "OneofOptions" @@ -590,20 +668,23 @@ const ( // Field names for google.protobuf.EnumOptions. const ( - EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" - EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" - EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" + EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" + EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" - EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" - EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" - EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" + EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" + EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" + EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated_legacy_json_field_conflicts" + EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" ) // Field numbers for google.protobuf.EnumOptions. const ( - EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 - EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 - EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 + EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 + EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 + EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 6 + EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) // Names for google.protobuf.EnumValueOptions. @@ -813,11 +894,13 @@ const ( GeneratedCodeInfo_Annotation_SourceFile_field_name protoreflect.Name = "source_file" GeneratedCodeInfo_Annotation_Begin_field_name protoreflect.Name = "begin" GeneratedCodeInfo_Annotation_End_field_name protoreflect.Name = "end" + GeneratedCodeInfo_Annotation_Semantic_field_name protoreflect.Name = "semantic" GeneratedCodeInfo_Annotation_Path_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.path" GeneratedCodeInfo_Annotation_SourceFile_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.source_file" GeneratedCodeInfo_Annotation_Begin_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.begin" GeneratedCodeInfo_Annotation_End_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.end" + GeneratedCodeInfo_Annotation_Semantic_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.semantic" ) // Field numbers for google.protobuf.GeneratedCodeInfo.Annotation. @@ -826,4 +909,11 @@ const ( GeneratedCodeInfo_Annotation_SourceFile_field_number protoreflect.FieldNumber = 2 GeneratedCodeInfo_Annotation_Begin_field_number protoreflect.FieldNumber = 3 GeneratedCodeInfo_Annotation_End_field_number protoreflect.FieldNumber = 4 + GeneratedCodeInfo_Annotation_Semantic_field_number protoreflect.FieldNumber = 5 +) + +// Full and short names for google.protobuf.GeneratedCodeInfo.Annotation.Semantic. +const ( + GeneratedCodeInfo_Annotation_Semantic_enum_fullname = "google.protobuf.GeneratedCodeInfo.Annotation.Semantic" + GeneratedCodeInfo_Annotation_Semantic_enum_name = "Semantic" ) diff --git a/vendor/google.golang.org/protobuf/internal/genid/type_gen.go b/vendor/google.golang.org/protobuf/internal/genid/type_gen.go index 3bc710138a..e0f75fea0a 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/type_gen.go @@ -32,6 +32,7 @@ const ( Type_Options_field_name protoreflect.Name = "options" Type_SourceContext_field_name protoreflect.Name = "source_context" Type_Syntax_field_name protoreflect.Name = "syntax" + Type_Edition_field_name protoreflect.Name = "edition" Type_Name_field_fullname protoreflect.FullName = "google.protobuf.Type.name" Type_Fields_field_fullname protoreflect.FullName = "google.protobuf.Type.fields" @@ -39,6 +40,7 @@ const ( Type_Options_field_fullname protoreflect.FullName = "google.protobuf.Type.options" Type_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Type.source_context" Type_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Type.syntax" + Type_Edition_field_fullname protoreflect.FullName = "google.protobuf.Type.edition" ) // Field numbers for google.protobuf.Type. @@ -49,6 +51,7 @@ const ( Type_Options_field_number protoreflect.FieldNumber = 4 Type_SourceContext_field_number protoreflect.FieldNumber = 5 Type_Syntax_field_number protoreflect.FieldNumber = 6 + Type_Edition_field_number protoreflect.FieldNumber = 7 ) // Names for google.protobuf.Field. @@ -121,12 +124,14 @@ const ( Enum_Options_field_name protoreflect.Name = "options" Enum_SourceContext_field_name protoreflect.Name = "source_context" Enum_Syntax_field_name protoreflect.Name = "syntax" + Enum_Edition_field_name protoreflect.Name = "edition" Enum_Name_field_fullname protoreflect.FullName = "google.protobuf.Enum.name" Enum_Enumvalue_field_fullname protoreflect.FullName = "google.protobuf.Enum.enumvalue" Enum_Options_field_fullname protoreflect.FullName = "google.protobuf.Enum.options" Enum_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Enum.source_context" Enum_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Enum.syntax" + Enum_Edition_field_fullname protoreflect.FullName = "google.protobuf.Enum.edition" ) // Field numbers for google.protobuf.Enum. @@ -136,6 +141,7 @@ const ( Enum_Options_field_number protoreflect.FieldNumber = 3 Enum_SourceContext_field_number protoreflect.FieldNumber = 4 Enum_Syntax_field_number protoreflect.FieldNumber = 5 + Enum_Edition_field_number protoreflect.FieldNumber = 6 ) // Names for google.protobuf.EnumValue. diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert.go b/vendor/google.golang.org/protobuf/internal/impl/convert.go index 11a6128ba5..185ef2efa5 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/convert.go +++ b/vendor/google.golang.org/protobuf/internal/impl/convert.go @@ -59,7 +59,6 @@ func NewConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { default: return newSingularConverter(t, fd) } - panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) } var ( diff --git a/vendor/google.golang.org/protobuf/internal/order/order.go b/vendor/google.golang.org/protobuf/internal/order/order.go index 33745ed062..dea522e127 100644 --- a/vendor/google.golang.org/protobuf/internal/order/order.go +++ b/vendor/google.golang.org/protobuf/internal/order/order.go @@ -33,7 +33,7 @@ var ( return !inOneof(ox) && inOneof(oy) } // Fields in disjoint oneof sets are sorted by declaration index. - if ox != nil && oy != nil && ox != oy { + if inOneof(ox) && inOneof(oy) && ox != oy { return ox.Index() < oy.Index() } // Fields sorted by field number. diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go index fea589c457..61a84d3418 100644 --- a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go @@ -87,7 +87,7 @@ func (sb *Builder) grow(n int) { // Unlike strings.Builder, we do not need to copy over the contents // of the old buffer since our builder provides no API for // retrieving previously created strings. - sb.buf = make([]byte, 2*(cap(sb.buf)+n)) + sb.buf = make([]byte, 0, 2*(cap(sb.buf)+n)) } func (sb *Builder) last(n int) string { diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index b480c5010f..0999f29d50 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -51,8 +51,8 @@ import ( // 10. Send out the CL for review and submit it. const ( Major = 1 - Minor = 28 - Patch = 1 + Minor = 31 + Patch = 0 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/proto/doc.go b/vendor/google.golang.org/protobuf/proto/doc.go index 08d2a46f53..ec71e717fe 100644 --- a/vendor/google.golang.org/protobuf/proto/doc.go +++ b/vendor/google.golang.org/protobuf/proto/doc.go @@ -5,16 +5,13 @@ // Package proto provides functions operating on protocol buffer messages. // // For documentation on protocol buffers in general, see: -// -// https://developers.google.com/protocol-buffers +// https://protobuf.dev. // // For a tutorial on using protocol buffers with Go, see: -// -// https://developers.google.com/protocol-buffers/docs/gotutorial +// https://protobuf.dev/getting-started/gotutorial. // // For a guide to generated Go protocol buffer code, see: -// -// https://developers.google.com/protocol-buffers/docs/reference/go-generated +// https://protobuf.dev/reference/go/go-generated. // // # Binary serialization // diff --git a/vendor/google.golang.org/protobuf/proto/equal.go b/vendor/google.golang.org/protobuf/proto/equal.go index 67948dd1df..1a0be1b03c 100644 --- a/vendor/google.golang.org/protobuf/proto/equal.go +++ b/vendor/google.golang.org/protobuf/proto/equal.go @@ -5,30 +5,39 @@ package proto import ( - "bytes" - "math" "reflect" - "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/reflect/protoreflect" ) -// Equal reports whether two messages are equal. -// If two messages marshal to the same bytes under deterministic serialization, -// then Equal is guaranteed to report true. +// Equal reports whether two messages are equal, +// by recursively comparing the fields of the message. // -// Two messages are equal if they belong to the same message descriptor, -// have the same set of populated known and extension field values, -// and the same set of unknown fields values. If either of the top-level -// messages are invalid, then Equal reports true only if both are invalid. +// - Bytes fields are equal if they contain identical bytes. +// Empty bytes (regardless of nil-ness) are considered equal. // -// Scalar values are compared with the equivalent of the == operator in Go, -// except bytes values which are compared using bytes.Equal and -// floating point values which specially treat NaNs as equal. -// Message values are compared by recursively calling Equal. -// Lists are equal if each element value is also equal. -// Maps are equal if they have the same set of keys, where the pair of values -// for each key is also equal. +// - Floating-point fields are equal if they contain the same value. +// Unlike the == operator, a NaN is equal to another NaN. +// +// - Other scalar fields are equal if they contain the same value. +// +// - Message fields are equal if they have +// the same set of populated known and extension field values, and +// the same set of unknown fields values. +// +// - Lists are equal if they are the same length and +// each corresponding element is equal. +// +// - Maps are equal if they have the same set of keys and +// the corresponding value for each key is equal. +// +// An invalid message is not equal to a valid message. +// An invalid message is only equal to another invalid message of the +// same type. An invalid message often corresponds to a nil pointer +// of the concrete message type. For example, (*pb.M)(nil) is not equal +// to &pb.M{}. +// If two valid messages marshal to the same bytes under deterministic +// serialization, then Equal is guaranteed to report true. func Equal(x, y Message) bool { if x == nil || y == nil { return x == nil && y == nil @@ -42,130 +51,7 @@ func Equal(x, y Message) bool { if mx.IsValid() != my.IsValid() { return false } - return equalMessage(mx, my) -} - -// equalMessage compares two messages. -func equalMessage(mx, my protoreflect.Message) bool { - if mx.Descriptor() != my.Descriptor() { - return false - } - - nx := 0 - equal := true - mx.Range(func(fd protoreflect.FieldDescriptor, vx protoreflect.Value) bool { - nx++ - vy := my.Get(fd) - equal = my.Has(fd) && equalField(fd, vx, vy) - return equal - }) - if !equal { - return false - } - ny := 0 - my.Range(func(fd protoreflect.FieldDescriptor, vx protoreflect.Value) bool { - ny++ - return true - }) - if nx != ny { - return false - } - - return equalUnknown(mx.GetUnknown(), my.GetUnknown()) -} - -// equalField compares two fields. -func equalField(fd protoreflect.FieldDescriptor, x, y protoreflect.Value) bool { - switch { - case fd.IsList(): - return equalList(fd, x.List(), y.List()) - case fd.IsMap(): - return equalMap(fd, x.Map(), y.Map()) - default: - return equalValue(fd, x, y) - } -} - -// equalMap compares two maps. -func equalMap(fd protoreflect.FieldDescriptor, x, y protoreflect.Map) bool { - if x.Len() != y.Len() { - return false - } - equal := true - x.Range(func(k protoreflect.MapKey, vx protoreflect.Value) bool { - vy := y.Get(k) - equal = y.Has(k) && equalValue(fd.MapValue(), vx, vy) - return equal - }) - return equal -} - -// equalList compares two lists. -func equalList(fd protoreflect.FieldDescriptor, x, y protoreflect.List) bool { - if x.Len() != y.Len() { - return false - } - for i := x.Len() - 1; i >= 0; i-- { - if !equalValue(fd, x.Get(i), y.Get(i)) { - return false - } - } - return true -} - -// equalValue compares two singular values. -func equalValue(fd protoreflect.FieldDescriptor, x, y protoreflect.Value) bool { - switch fd.Kind() { - case protoreflect.BoolKind: - return x.Bool() == y.Bool() - case protoreflect.EnumKind: - return x.Enum() == y.Enum() - case protoreflect.Int32Kind, protoreflect.Sint32Kind, - protoreflect.Int64Kind, protoreflect.Sint64Kind, - protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: - return x.Int() == y.Int() - case protoreflect.Uint32Kind, protoreflect.Uint64Kind, - protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: - return x.Uint() == y.Uint() - case protoreflect.FloatKind, protoreflect.DoubleKind: - fx := x.Float() - fy := y.Float() - if math.IsNaN(fx) || math.IsNaN(fy) { - return math.IsNaN(fx) && math.IsNaN(fy) - } - return fx == fy - case protoreflect.StringKind: - return x.String() == y.String() - case protoreflect.BytesKind: - return bytes.Equal(x.Bytes(), y.Bytes()) - case protoreflect.MessageKind, protoreflect.GroupKind: - return equalMessage(x.Message(), y.Message()) - default: - return x.Interface() == y.Interface() - } -} - -// equalUnknown compares unknown fields by direct comparison on the raw bytes -// of each individual field number. -func equalUnknown(x, y protoreflect.RawFields) bool { - if len(x) != len(y) { - return false - } - if bytes.Equal([]byte(x), []byte(y)) { - return true - } - - mx := make(map[protoreflect.FieldNumber]protoreflect.RawFields) - my := make(map[protoreflect.FieldNumber]protoreflect.RawFields) - for len(x) > 0 { - fnum, _, n := protowire.ConsumeField(x) - mx[fnum] = append(mx[fnum], x[:n]...) - x = x[n:] - } - for len(y) > 0 { - fnum, _, n := protowire.ConsumeField(y) - my[fnum] = append(my[fnum], y[:n]...) - y = y[n:] - } - return reflect.DeepEqual(mx, my) + vx := protoreflect.ValueOfMessage(mx) + vy := protoreflect.ValueOfMessage(my) + return vx.Equal(vy) } diff --git a/vendor/google.golang.org/protobuf/proto/size.go b/vendor/google.golang.org/protobuf/proto/size.go index 554b9c6c09..f1692b49b6 100644 --- a/vendor/google.golang.org/protobuf/proto/size.go +++ b/vendor/google.golang.org/protobuf/proto/size.go @@ -73,23 +73,27 @@ func (o MarshalOptions) sizeField(fd protoreflect.FieldDescriptor, value protore } func (o MarshalOptions) sizeList(num protowire.Number, fd protoreflect.FieldDescriptor, list protoreflect.List) (size int) { + sizeTag := protowire.SizeTag(num) + if fd.IsPacked() && list.Len() > 0 { content := 0 for i, llen := 0, list.Len(); i < llen; i++ { content += o.sizeSingular(num, fd.Kind(), list.Get(i)) } - return protowire.SizeTag(num) + protowire.SizeBytes(content) + return sizeTag + protowire.SizeBytes(content) } for i, llen := 0, list.Len(); i < llen; i++ { - size += protowire.SizeTag(num) + o.sizeSingular(num, fd.Kind(), list.Get(i)) + size += sizeTag + o.sizeSingular(num, fd.Kind(), list.Get(i)) } return size } func (o MarshalOptions) sizeMap(num protowire.Number, fd protoreflect.FieldDescriptor, mapv protoreflect.Map) (size int) { + sizeTag := protowire.SizeTag(num) + mapv.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool { - size += protowire.SizeTag(num) + size += sizeTag size += protowire.SizeBytes(o.sizeField(fd.MapKey(), key.Value()) + o.sizeField(fd.MapValue(), value)) return true }) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go index b03c1223c4..717b106f3d 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go @@ -35,6 +35,8 @@ func (p *SourcePath) appendFileDescriptorProto(b []byte) []byte { b = p.appendSingularField(b, "source_code_info", (*SourcePath).appendSourceCodeInfo) case 12: b = p.appendSingularField(b, "syntax", nil) + case 13: + b = p.appendSingularField(b, "edition", nil) } return b } @@ -236,6 +238,8 @@ func (p *SourcePath) appendMessageOptions(b []byte) []byte { b = p.appendSingularField(b, "deprecated", nil) case 7: b = p.appendSingularField(b, "map_entry", nil) + case 11: + b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -279,6 +283,8 @@ func (p *SourcePath) appendEnumOptions(b []byte) []byte { b = p.appendSingularField(b, "allow_alias", nil) case 3: b = p.appendSingularField(b, "deprecated", nil) + case 6: + b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -345,10 +351,20 @@ func (p *SourcePath) appendFieldOptions(b []byte) []byte { b = p.appendSingularField(b, "jstype", nil) case 5: b = p.appendSingularField(b, "lazy", nil) + case 15: + b = p.appendSingularField(b, "unverified_lazy", nil) case 3: b = p.appendSingularField(b, "deprecated", nil) case 10: b = p.appendSingularField(b, "weak", nil) + case 16: + b = p.appendSingularField(b, "debug_redact", nil) + case 17: + b = p.appendSingularField(b, "retention", nil) + case 18: + b = p.appendSingularField(b, "target", nil) + case 19: + b = p.appendRepeatedField(b, "targets", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -404,6 +420,10 @@ func (p *SourcePath) appendExtensionRangeOptions(b []byte) []byte { switch (*p)[0] { case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) + case 2: + b = p.appendRepeatedField(b, "declaration", (*SourcePath).appendExtensionRangeOptions_Declaration) + case 3: + b = p.appendSingularField(b, "verification", nil) } return b } @@ -459,3 +479,24 @@ func (p *SourcePath) appendUninterpretedOption_NamePart(b []byte) []byte { } return b } + +func (p *SourcePath) appendExtensionRangeOptions_Declaration(b []byte) []byte { + if len(*p) == 0 { + return b + } + switch (*p)[0] { + case 1: + b = p.appendSingularField(b, "number", nil) + case 2: + b = p.appendSingularField(b, "full_name", nil) + case 3: + b = p.appendSingularField(b, "type", nil) + case 4: + b = p.appendSingularField(b, "is_repeated", nil) + case 5: + b = p.appendSingularField(b, "reserved", nil) + case 6: + b = p.appendSingularField(b, "repeated", nil) + } + return b +} diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go index f319810778..37601b7819 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go @@ -148,7 +148,7 @@ type Message interface { // be preserved in marshaling or other operations. IsValid() bool - // ProtoMethods returns optional fast-path implementions of various operations. + // ProtoMethods returns optional fast-path implementations of various operations. // This method may return nil. // // The returned methods type is identical to diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go new file mode 100644 index 0000000000..591652541f --- /dev/null +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go @@ -0,0 +1,168 @@ +// Copyright 2022 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 protoreflect + +import ( + "bytes" + "fmt" + "math" + "reflect" + + "google.golang.org/protobuf/encoding/protowire" +) + +// Equal reports whether v1 and v2 are recursively equal. +// +// - Values of different types are always unequal. +// +// - Bytes values are equal if they contain identical bytes. +// Empty bytes (regardless of nil-ness) are considered equal. +// +// - Floating point values are equal if they contain the same value. +// Unlike the == operator, a NaN is equal to another NaN. +// +// - Enums are equal if they contain the same number. +// Since Value does not contain an enum descriptor, +// enum values do not consider the type of the enum. +// +// - Other scalar values are equal if they contain the same value. +// +// - Message values are equal if they belong to the same message descriptor, +// have the same set of populated known and extension field values, +// and the same set of unknown fields values. +// +// - Lists are equal if they are the same length and +// each corresponding element is equal. +// +// - Maps are equal if they have the same set of keys and +// the corresponding value for each key is equal. +func (v1 Value) Equal(v2 Value) bool { + return equalValue(v1, v2) +} + +func equalValue(x, y Value) bool { + eqType := x.typ == y.typ + switch x.typ { + case nilType: + return eqType + case boolType: + return eqType && x.Bool() == y.Bool() + case int32Type, int64Type: + return eqType && x.Int() == y.Int() + case uint32Type, uint64Type: + return eqType && x.Uint() == y.Uint() + case float32Type, float64Type: + return eqType && equalFloat(x.Float(), y.Float()) + case stringType: + return eqType && x.String() == y.String() + case bytesType: + return eqType && bytes.Equal(x.Bytes(), y.Bytes()) + case enumType: + return eqType && x.Enum() == y.Enum() + default: + switch x := x.Interface().(type) { + case Message: + y, ok := y.Interface().(Message) + return ok && equalMessage(x, y) + case List: + y, ok := y.Interface().(List) + return ok && equalList(x, y) + case Map: + y, ok := y.Interface().(Map) + return ok && equalMap(x, y) + default: + panic(fmt.Sprintf("unknown type: %T", x)) + } + } +} + +// equalFloat compares two floats, where NaNs are treated as equal. +func equalFloat(x, y float64) bool { + if math.IsNaN(x) || math.IsNaN(y) { + return math.IsNaN(x) && math.IsNaN(y) + } + return x == y +} + +// equalMessage compares two messages. +func equalMessage(mx, my Message) bool { + if mx.Descriptor() != my.Descriptor() { + return false + } + + nx := 0 + equal := true + mx.Range(func(fd FieldDescriptor, vx Value) bool { + nx++ + vy := my.Get(fd) + equal = my.Has(fd) && equalValue(vx, vy) + return equal + }) + if !equal { + return false + } + ny := 0 + my.Range(func(fd FieldDescriptor, vx Value) bool { + ny++ + return true + }) + if nx != ny { + return false + } + + return equalUnknown(mx.GetUnknown(), my.GetUnknown()) +} + +// equalList compares two lists. +func equalList(x, y List) bool { + if x.Len() != y.Len() { + return false + } + for i := x.Len() - 1; i >= 0; i-- { + if !equalValue(x.Get(i), y.Get(i)) { + return false + } + } + return true +} + +// equalMap compares two maps. +func equalMap(x, y Map) bool { + if x.Len() != y.Len() { + return false + } + equal := true + x.Range(func(k MapKey, vx Value) bool { + vy := y.Get(k) + equal = y.Has(k) && equalValue(vx, vy) + return equal + }) + return equal +} + +// equalUnknown compares unknown fields by direct comparison on the raw bytes +// of each individual field number. +func equalUnknown(x, y RawFields) bool { + if len(x) != len(y) { + return false + } + if bytes.Equal([]byte(x), []byte(y)) { + return true + } + + mx := make(map[FieldNumber]RawFields) + my := make(map[FieldNumber]RawFields) + for len(x) > 0 { + fnum, _, n := protowire.ConsumeField(x) + mx[fnum] = append(mx[fnum], x[:n]...) + x = x[n:] + } + for len(y) > 0 { + fnum, _, n := protowire.ConsumeField(y) + my[fnum] = append(my[fnum], y[:n]...) + y = y[n:] + } + return reflect.DeepEqual(mx, my) +} diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go index ca8e28c5bc..08e5ef73fc 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go @@ -54,11 +54,11 @@ import ( // // Append a 0 to a "repeated int32" field. // // Since the Value returned by Mutable is guaranteed to alias // // the source message, modifying the Value modifies the message. -// message.Mutable(fieldDesc).(List).Append(protoreflect.ValueOfInt32(0)) +// message.Mutable(fieldDesc).List().Append(protoreflect.ValueOfInt32(0)) // // // Assign [0] to a "repeated int32" field by creating a new Value, // // modifying it, and assigning it. -// list := message.NewField(fieldDesc).(List) +// list := message.NewField(fieldDesc).List() // list.Append(protoreflect.ValueOfInt32(0)) // message.Set(fieldDesc, list) // // ERROR: Since it is not defined whether Set aliases the source, diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go index 58352a6978..aeb5597744 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go @@ -46,7 +46,7 @@ var conflictPolicy = "panic" // "panic" | "warn" | "ignore" // It is a variable so that the behavior is easily overridden in another file. var ignoreConflict = func(d protoreflect.Descriptor, err error) bool { const env = "GOLANG_PROTOBUF_REGISTRATION_CONFLICT" - const faq = "https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict" + const faq = "https://protobuf.dev/reference/go/faq#namespace-conflict" policy := conflictPolicy if v := os.Getenv(env); v != "" { policy = v diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go index abe4ab5115..04c00f737c 100644 --- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +++ b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go @@ -48,6 +48,64 @@ import ( sync "sync" ) +// The verification state of the extension range. +type ExtensionRangeOptions_VerificationState int32 + +const ( + // All the extensions of the range must be declared. + ExtensionRangeOptions_DECLARATION ExtensionRangeOptions_VerificationState = 0 + ExtensionRangeOptions_UNVERIFIED ExtensionRangeOptions_VerificationState = 1 +) + +// Enum value maps for ExtensionRangeOptions_VerificationState. +var ( + ExtensionRangeOptions_VerificationState_name = map[int32]string{ + 0: "DECLARATION", + 1: "UNVERIFIED", + } + ExtensionRangeOptions_VerificationState_value = map[string]int32{ + "DECLARATION": 0, + "UNVERIFIED": 1, + } +) + +func (x ExtensionRangeOptions_VerificationState) Enum() *ExtensionRangeOptions_VerificationState { + p := new(ExtensionRangeOptions_VerificationState) + *p = x + return p +} + +func (x ExtensionRangeOptions_VerificationState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExtensionRangeOptions_VerificationState) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor() +} + +func (ExtensionRangeOptions_VerificationState) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[0] +} + +func (x ExtensionRangeOptions_VerificationState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ExtensionRangeOptions_VerificationState) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ExtensionRangeOptions_VerificationState(num) + return nil +} + +// Deprecated: Use ExtensionRangeOptions_VerificationState.Descriptor instead. +func (ExtensionRangeOptions_VerificationState) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3, 0} +} + type FieldDescriptorProto_Type int32 const ( @@ -137,11 +195,11 @@ func (x FieldDescriptorProto_Type) String() string { } func (FieldDescriptorProto_Type) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor() } func (FieldDescriptorProto_Type) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[0] + return &file_google_protobuf_descriptor_proto_enumTypes[1] } func (x FieldDescriptorProto_Type) Number() protoreflect.EnumNumber { @@ -197,11 +255,11 @@ func (x FieldDescriptorProto_Label) String() string { } func (FieldDescriptorProto_Label) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor() } func (FieldDescriptorProto_Label) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[1] + return &file_google_protobuf_descriptor_proto_enumTypes[2] } func (x FieldDescriptorProto_Label) Number() protoreflect.EnumNumber { @@ -258,11 +316,11 @@ func (x FileOptions_OptimizeMode) String() string { } func (FileOptions_OptimizeMode) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor() } func (FileOptions_OptimizeMode) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[2] + return &file_google_protobuf_descriptor_proto_enumTypes[3] } func (x FileOptions_OptimizeMode) Number() protoreflect.EnumNumber { @@ -288,7 +346,13 @@ type FieldOptions_CType int32 const ( // Default mode. - FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_STRING FieldOptions_CType = 0 + // The option [ctype=CORD] may be applied to a non-repeated field of type + // "bytes". It indicates that in C++, the data should be stored in a Cord + // instead of a string. For very large strings, this may reduce memory + // fragmentation. It may also allow better performance when parsing from a + // Cord, or when parsing with aliasing enabled, as the parsed Cord may then + // alias the original buffer. FieldOptions_CORD FieldOptions_CType = 1 FieldOptions_STRING_PIECE FieldOptions_CType = 2 ) @@ -318,11 +382,11 @@ func (x FieldOptions_CType) String() string { } func (FieldOptions_CType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor() } func (FieldOptions_CType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[3] + return &file_google_protobuf_descriptor_proto_enumTypes[4] } func (x FieldOptions_CType) Number() protoreflect.EnumNumber { @@ -380,11 +444,11 @@ func (x FieldOptions_JSType) String() string { } func (FieldOptions_JSType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() } func (FieldOptions_JSType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[4] + return &file_google_protobuf_descriptor_proto_enumTypes[5] } func (x FieldOptions_JSType) Number() protoreflect.EnumNumber { @@ -406,6 +470,152 @@ func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 1} } +// If set to RETENTION_SOURCE, the option will be omitted from the binary. +// Note: as of January 2023, support for this is in progress and does not yet +// have an effect (b/264593489). +type FieldOptions_OptionRetention int32 + +const ( + FieldOptions_RETENTION_UNKNOWN FieldOptions_OptionRetention = 0 + FieldOptions_RETENTION_RUNTIME FieldOptions_OptionRetention = 1 + FieldOptions_RETENTION_SOURCE FieldOptions_OptionRetention = 2 +) + +// Enum value maps for FieldOptions_OptionRetention. +var ( + FieldOptions_OptionRetention_name = map[int32]string{ + 0: "RETENTION_UNKNOWN", + 1: "RETENTION_RUNTIME", + 2: "RETENTION_SOURCE", + } + FieldOptions_OptionRetention_value = map[string]int32{ + "RETENTION_UNKNOWN": 0, + "RETENTION_RUNTIME": 1, + "RETENTION_SOURCE": 2, + } +) + +func (x FieldOptions_OptionRetention) Enum() *FieldOptions_OptionRetention { + p := new(FieldOptions_OptionRetention) + *p = x + return p +} + +func (x FieldOptions_OptionRetention) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FieldOptions_OptionRetention) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[6].Descriptor() +} + +func (FieldOptions_OptionRetention) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[6] +} + +func (x FieldOptions_OptionRetention) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FieldOptions_OptionRetention) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FieldOptions_OptionRetention(num) + return nil +} + +// Deprecated: Use FieldOptions_OptionRetention.Descriptor instead. +func (FieldOptions_OptionRetention) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 2} +} + +// This indicates the types of entities that the field may apply to when used +// as an option. If it is unset, then the field may be freely used as an +// option on any kind of entity. Note: as of January 2023, support for this is +// in progress and does not yet have an effect (b/264593489). +type FieldOptions_OptionTargetType int32 + +const ( + FieldOptions_TARGET_TYPE_UNKNOWN FieldOptions_OptionTargetType = 0 + FieldOptions_TARGET_TYPE_FILE FieldOptions_OptionTargetType = 1 + FieldOptions_TARGET_TYPE_EXTENSION_RANGE FieldOptions_OptionTargetType = 2 + FieldOptions_TARGET_TYPE_MESSAGE FieldOptions_OptionTargetType = 3 + FieldOptions_TARGET_TYPE_FIELD FieldOptions_OptionTargetType = 4 + FieldOptions_TARGET_TYPE_ONEOF FieldOptions_OptionTargetType = 5 + FieldOptions_TARGET_TYPE_ENUM FieldOptions_OptionTargetType = 6 + FieldOptions_TARGET_TYPE_ENUM_ENTRY FieldOptions_OptionTargetType = 7 + FieldOptions_TARGET_TYPE_SERVICE FieldOptions_OptionTargetType = 8 + FieldOptions_TARGET_TYPE_METHOD FieldOptions_OptionTargetType = 9 +) + +// Enum value maps for FieldOptions_OptionTargetType. +var ( + FieldOptions_OptionTargetType_name = map[int32]string{ + 0: "TARGET_TYPE_UNKNOWN", + 1: "TARGET_TYPE_FILE", + 2: "TARGET_TYPE_EXTENSION_RANGE", + 3: "TARGET_TYPE_MESSAGE", + 4: "TARGET_TYPE_FIELD", + 5: "TARGET_TYPE_ONEOF", + 6: "TARGET_TYPE_ENUM", + 7: "TARGET_TYPE_ENUM_ENTRY", + 8: "TARGET_TYPE_SERVICE", + 9: "TARGET_TYPE_METHOD", + } + FieldOptions_OptionTargetType_value = map[string]int32{ + "TARGET_TYPE_UNKNOWN": 0, + "TARGET_TYPE_FILE": 1, + "TARGET_TYPE_EXTENSION_RANGE": 2, + "TARGET_TYPE_MESSAGE": 3, + "TARGET_TYPE_FIELD": 4, + "TARGET_TYPE_ONEOF": 5, + "TARGET_TYPE_ENUM": 6, + "TARGET_TYPE_ENUM_ENTRY": 7, + "TARGET_TYPE_SERVICE": 8, + "TARGET_TYPE_METHOD": 9, + } +) + +func (x FieldOptions_OptionTargetType) Enum() *FieldOptions_OptionTargetType { + p := new(FieldOptions_OptionTargetType) + *p = x + return p +} + +func (x FieldOptions_OptionTargetType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FieldOptions_OptionTargetType) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[7].Descriptor() +} + +func (FieldOptions_OptionTargetType) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[7] +} + +func (x FieldOptions_OptionTargetType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FieldOptions_OptionTargetType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FieldOptions_OptionTargetType(num) + return nil +} + +// Deprecated: Use FieldOptions_OptionTargetType.Descriptor instead. +func (FieldOptions_OptionTargetType) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 3} +} + // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, // or neither? HTTP based RPC implementation may choose GET verb for safe // methods, and PUT verb for idempotent methods instead of the default POST. @@ -442,11 +652,11 @@ func (x MethodOptions_IdempotencyLevel) String() string { } func (MethodOptions_IdempotencyLevel) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[8].Descriptor() } func (MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[5] + return &file_google_protobuf_descriptor_proto_enumTypes[8] } func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber { @@ -468,6 +678,70 @@ func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{17, 0} } +// Represents the identified object's effect on the element in the original +// .proto file. +type GeneratedCodeInfo_Annotation_Semantic int32 + +const ( + // There is no effect or the effect is indescribable. + GeneratedCodeInfo_Annotation_NONE GeneratedCodeInfo_Annotation_Semantic = 0 + // The element is set or otherwise mutated. + GeneratedCodeInfo_Annotation_SET GeneratedCodeInfo_Annotation_Semantic = 1 + // An alias to the element is returned. + GeneratedCodeInfo_Annotation_ALIAS GeneratedCodeInfo_Annotation_Semantic = 2 +) + +// Enum value maps for GeneratedCodeInfo_Annotation_Semantic. +var ( + GeneratedCodeInfo_Annotation_Semantic_name = map[int32]string{ + 0: "NONE", + 1: "SET", + 2: "ALIAS", + } + GeneratedCodeInfo_Annotation_Semantic_value = map[string]int32{ + "NONE": 0, + "SET": 1, + "ALIAS": 2, + } +) + +func (x GeneratedCodeInfo_Annotation_Semantic) Enum() *GeneratedCodeInfo_Annotation_Semantic { + p := new(GeneratedCodeInfo_Annotation_Semantic) + *p = x + return p +} + +func (x GeneratedCodeInfo_Annotation_Semantic) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GeneratedCodeInfo_Annotation_Semantic) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[9].Descriptor() +} + +func (GeneratedCodeInfo_Annotation_Semantic) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[9] +} + +func (x GeneratedCodeInfo_Annotation_Semantic) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *GeneratedCodeInfo_Annotation_Semantic) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = GeneratedCodeInfo_Annotation_Semantic(num) + return nil +} + +// Deprecated: Use GeneratedCodeInfo_Annotation_Semantic.Descriptor instead. +func (GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0, 0} +} + // The protocol compiler can output a FileDescriptorSet containing the .proto // files it parses. type FileDescriptorSet struct { @@ -544,8 +818,12 @@ type FileDescriptorProto struct { // development tools. SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` // The syntax of the proto file. - // The supported values are "proto2" and "proto3". + // The supported values are "proto2", "proto3", and "editions". + // + // If `edition` is present, this value must be "editions". Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + // The edition of the proto file, which is an opaque string. + Edition *string `protobuf:"bytes,13,opt,name=edition" json:"edition,omitempty"` } func (x *FileDescriptorProto) Reset() { @@ -664,6 +942,13 @@ func (x *FileDescriptorProto) GetSyntax() string { return "" } +func (x *FileDescriptorProto) GetEdition() string { + if x != nil && x.Edition != nil { + return *x.Edition + } + return "" +} + // Describes a message type. type DescriptorProto struct { state protoimpl.MessageState @@ -794,7 +1079,21 @@ type ExtensionRangeOptions struct { // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` -} + // go/protobuf-stripping-extension-declarations + // Like Metadata, but we use a repeated field to hold all extension + // declarations. This should avoid the size increases of transforming a large + // extension range into small ranges in generated binaries. + Declaration []*ExtensionRangeOptions_Declaration `protobuf:"bytes,2,rep,name=declaration" json:"declaration,omitempty"` + // The verification state of the range. + // TODO(b/278783756): flip the default to DECLARATION once all empty ranges + // are marked as UNVERIFIED. + Verification *ExtensionRangeOptions_VerificationState `protobuf:"varint,3,opt,name=verification,enum=google.protobuf.ExtensionRangeOptions_VerificationState,def=1" json:"verification,omitempty"` +} + +// Default values for ExtensionRangeOptions fields. +const ( + Default_ExtensionRangeOptions_Verification = ExtensionRangeOptions_UNVERIFIED +) func (x *ExtensionRangeOptions) Reset() { *x = ExtensionRangeOptions{} @@ -835,6 +1134,20 @@ func (x *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption return nil } +func (x *ExtensionRangeOptions) GetDeclaration() []*ExtensionRangeOptions_Declaration { + if x != nil { + return x.Declaration + } + return nil +} + +func (x *ExtensionRangeOptions) GetVerification() ExtensionRangeOptions_VerificationState { + if x != nil && x.Verification != nil { + return *x.Verification + } + return Default_ExtensionRangeOptions_Verification +} + // Describes a field within a message. type FieldDescriptorProto struct { state protoimpl.MessageState @@ -860,7 +1173,6 @@ type FieldDescriptorProto struct { // For booleans, "true" or "false". // For strings, contains the default text contents (not escaped in any way). // For bytes, contains the C escaped value. All bytes >= 128 are escaped. - // TODO(kenton): Base-64 encode? DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` // If set, gives the index of a oneof in the containing type's oneof_decl // list. This field is a member of that oneof. @@ -1382,22 +1694,22 @@ type FileOptions struct { // inappropriate because proto packages do not normally start with backwards // domain names. JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` - // If set, all the classes from the .proto file are wrapped in a single - // outer class with the given name. This applies to both Proto1 - // (equivalent to the old "--one_java_file" option) and Proto2 (where - // a .proto always translates to a single class, but you may want to - // explicitly choose the class name). + // Controls the name of the wrapper Java class generated for the .proto file. + // That class will always contain the .proto file's getDescriptor() method as + // well as any top-level extensions defined in the .proto file. + // If java_multiple_files is disabled, then all the other classes from the + // .proto file will be nested inside the single wrapper outer class. JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` - // If set true, then the Java code generator will generate a separate .java + // If enabled, then the Java code generator will generate a separate .java // file for each top-level message, enum, and service defined in the .proto - // file. Thus, these types will *not* be nested inside the outer class - // named by java_outer_classname. However, the outer class will still be + // file. Thus, these types will *not* be nested inside the wrapper class + // named by java_outer_classname. However, the wrapper class will still be // generated to contain the file's getDescriptor() method as well as any // top-level extensions defined in the file. JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` // This option does nothing. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // If set true, then the Java2 code generator will generate code that // throws an exception whenever an attempt is made to assign a non-UTF-8 @@ -1531,7 +1843,7 @@ func (x *FileOptions) GetJavaMultipleFiles() bool { return Default_FileOptions_JavaMultipleFiles } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. func (x *FileOptions) GetJavaGenerateEqualsAndHash() bool { if x != nil && x.JavaGenerateEqualsAndHash != nil { return *x.JavaGenerateEqualsAndHash @@ -1670,10 +1982,12 @@ type MessageOptions struct { // efficient, has fewer features, and is more complicated. // // The message must be defined exactly as follows: - // message Foo { - // option message_set_wire_format = true; - // extensions 4 to max; - // } + // + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // // Note that the message cannot have any defined fields; MessageSets only // have extensions. // @@ -1692,28 +2006,44 @@ type MessageOptions struct { // for the message, or it will be completely ignored; in the very least, // this is a formalization for deprecating messages. Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + // // Whether the message is an automatically generated map entry type for the // maps field. // // For maps fields: - // map<KeyType, ValueType> map_field = 1; + // + // map<KeyType, ValueType> map_field = 1; + // // The parsed descriptor looks like: - // message MapFieldEntry { - // option map_entry = true; - // optional KeyType key = 1; - // optional ValueType value = 2; - // } - // repeated MapFieldEntry map_field = 1; + // + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; // // Implementations may choose not to generate the map_entry=true message, but // use a native map in the target language to hold the keys and values. // The reflection APIs in such implementations still need to work as // if the field is a repeated message field. - // - // NOTE: Do not set the option in .proto files. Always use the maps syntax - // instead. The option should only be implicitly set by the proto compiler - // parser. MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // Enable the legacy handling of JSON field name conflicts. This lowercases + // and strips underscored from the fields before comparison in proto3 only. + // The new behavior takes `json_name` into account and applies to proto2 as + // well. + // + // This should only be used as a temporary measure against broken builds due + // to the change in behavior for JSON field name conflicts. + // + // TODO(b/261750190) This is legacy behavior we plan to remove once downstream + // teams have had time to migrate. + // + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,11,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -1785,6 +2115,14 @@ func (x *MessageOptions) GetMapEntry() bool { return false } +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *MessageOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { + if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { + return *x.DeprecatedLegacyJsonFieldConflicts + } + return false +} + func (x *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -1800,8 +2138,10 @@ type FieldOptions struct { // The ctype option instructs the C++ code generator to use a different // representation of the field than it normally would. See the specific - // options below. This option is not yet implemented in the open source - // release -- sorry, we'll try to include it in a future version! + // options below. This option is only implemented to support use of + // [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of + // type "bytes" in the open source release -- sorry, we'll try to include + // other types in a future version! Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` // The packed option can be enabled for repeated primitive fields to enable // a more efficient representation on the wire. Rather than repeatedly @@ -1838,7 +2178,6 @@ type FieldOptions struct { // call from multiple threads concurrently, while non-const methods continue // to require exclusive access. // - // // Note that implementations may choose not to check required fields within // a lazy sub-message. That is, calling IsInitialized() on the outer message // may return true even if the inner message has missing required fields. @@ -1849,7 +2188,14 @@ type FieldOptions struct { // implementation must either *always* check its required fields, or *never* // check its required fields, regardless of whether or not the message has // been parsed. + // + // As of May 2022, lazy verifies the contents of the byte stream during + // parsing. An invalid byte stream will cause the overall parsing to fail. Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // unverified_lazy does no correctness checks on the byte stream. This should + // only be used where lazy with verification is prohibitive for performance + // reasons. + UnverifiedLazy *bool `protobuf:"varint,15,opt,name=unverified_lazy,json=unverifiedLazy,def=0" json:"unverified_lazy,omitempty"` // Is this field deprecated? // Depending on the target platform, this can emit Deprecated annotations // for accessors, or it will be completely ignored; in the very least, this @@ -1857,17 +2203,26 @@ type FieldOptions struct { Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` // For Google-internal migration only. Do not use. Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // Indicate that the field value should not be printed out when using debug + // formats, e.g. when the field contains sensitive credentials. + DebugRedact *bool `protobuf:"varint,16,opt,name=debug_redact,json=debugRedact,def=0" json:"debug_redact,omitempty"` + Retention *FieldOptions_OptionRetention `protobuf:"varint,17,opt,name=retention,enum=google.protobuf.FieldOptions_OptionRetention" json:"retention,omitempty"` + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + Target *FieldOptions_OptionTargetType `protobuf:"varint,18,opt,name=target,enum=google.protobuf.FieldOptions_OptionTargetType" json:"target,omitempty"` + Targets []FieldOptions_OptionTargetType `protobuf:"varint,19,rep,name=targets,enum=google.protobuf.FieldOptions_OptionTargetType" json:"targets,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } // Default values for FieldOptions fields. const ( - Default_FieldOptions_Ctype = FieldOptions_STRING - Default_FieldOptions_Jstype = FieldOptions_JS_NORMAL - Default_FieldOptions_Lazy = bool(false) - Default_FieldOptions_Deprecated = bool(false) - Default_FieldOptions_Weak = bool(false) + Default_FieldOptions_Ctype = FieldOptions_STRING + Default_FieldOptions_Jstype = FieldOptions_JS_NORMAL + Default_FieldOptions_Lazy = bool(false) + Default_FieldOptions_UnverifiedLazy = bool(false) + Default_FieldOptions_Deprecated = bool(false) + Default_FieldOptions_Weak = bool(false) + Default_FieldOptions_DebugRedact = bool(false) ) func (x *FieldOptions) Reset() { @@ -1930,6 +2285,13 @@ func (x *FieldOptions) GetLazy() bool { return Default_FieldOptions_Lazy } +func (x *FieldOptions) GetUnverifiedLazy() bool { + if x != nil && x.UnverifiedLazy != nil { + return *x.UnverifiedLazy + } + return Default_FieldOptions_UnverifiedLazy +} + func (x *FieldOptions) GetDeprecated() bool { if x != nil && x.Deprecated != nil { return *x.Deprecated @@ -1944,6 +2306,35 @@ func (x *FieldOptions) GetWeak() bool { return Default_FieldOptions_Weak } +func (x *FieldOptions) GetDebugRedact() bool { + if x != nil && x.DebugRedact != nil { + return *x.DebugRedact + } + return Default_FieldOptions_DebugRedact +} + +func (x *FieldOptions) GetRetention() FieldOptions_OptionRetention { + if x != nil && x.Retention != nil { + return *x.Retention + } + return FieldOptions_RETENTION_UNKNOWN +} + +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *FieldOptions) GetTarget() FieldOptions_OptionTargetType { + if x != nil && x.Target != nil { + return *x.Target + } + return FieldOptions_TARGET_TYPE_UNKNOWN +} + +func (x *FieldOptions) GetTargets() []FieldOptions_OptionTargetType { + if x != nil { + return x.Targets + } + return nil +} + func (x *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2014,6 +2405,15 @@ type EnumOptions struct { // for the enum, or it will be completely ignored; in the very least, this // is a formalization for deprecating enums. Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enable the legacy handling of JSON field name conflicts. This lowercases + // and strips underscored from the fields before comparison in proto3 only. + // The new behavior takes `json_name` into account and applies to proto2 as + // well. + // TODO(b/261750190) Remove this legacy behavior once downstream teams have + // had time to migrate. + // + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,6,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -2069,6 +2469,14 @@ func (x *EnumOptions) GetDeprecated() bool { return Default_EnumOptions_Deprecated } +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *EnumOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { + if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { + return *x.DeprecatedLegacyJsonFieldConflicts + } + return false +} + func (x *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2399,43 +2807,48 @@ type SourceCodeInfo struct { // tools. // // For example, say we have a file like: - // message Foo { - // optional string foo = 1; - // } + // + // message Foo { + // optional string foo = 1; + // } + // // Let's look at just the field definition: - // optional string foo = 1; - // ^ ^^ ^^ ^ ^^^ - // a bc de f ghi + // + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // // We have the following locations: - // span path represents - // [a,i) [ 4, 0, 2, 0 ] The whole field definition. - // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). - // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). - // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). - // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). // // Notes: - // - A location may refer to a repeated field itself (i.e. not to any - // particular index within it). This is used whenever a set of elements are - // logically enclosed in a single code segment. For example, an entire - // extend block (possibly containing multiple extension definitions) will - // have an outer location whose path refers to the "extensions" repeated - // field without an index. - // - Multiple locations may have the same path. This happens when a single - // logical declaration is spread out across multiple places. The most - // obvious example is the "extend" block again -- there may be multiple - // extend blocks in the same scope, each of which will have the same path. - // - A location's span is not always a subset of its parent's span. For - // example, the "extendee" of an extension declaration appears at the - // beginning of the "extend" block and is shared by all extensions within - // the block. - // - Just because a location's span is a subset of some other location's span - // does not mean that it is a descendant. For example, a "group" defines - // both a type and a field in a single declaration. Thus, the locations - // corresponding to the type and field and their components will overlap. - // - Code which tries to interpret locations should probably be designed to - // ignore those that it doesn't understand, as more types of locations could - // be recorded in the future. + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendant. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` } @@ -2651,6 +3064,108 @@ func (x *DescriptorProto_ReservedRange) GetEnd() int32 { return 0 } +type ExtensionRangeOptions_Declaration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The extension number declared within the extension range. + Number *int32 `protobuf:"varint,1,opt,name=number" json:"number,omitempty"` + // The fully-qualified name of the extension field. There must be a leading + // dot in front of the full name. + FullName *string `protobuf:"bytes,2,opt,name=full_name,json=fullName" json:"full_name,omitempty"` + // The fully-qualified type name of the extension field. Unlike + // Metadata.type, Declaration.type must have a leading dot for messages + // and enums. + Type *string `protobuf:"bytes,3,opt,name=type" json:"type,omitempty"` + // Deprecated. Please use "repeated". + // + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + IsRepeated *bool `protobuf:"varint,4,opt,name=is_repeated,json=isRepeated" json:"is_repeated,omitempty"` + // If true, indicates that the number is reserved in the extension range, + // and any extension field with the number will fail to compile. Set this + // when a declared extension field is deleted. + Reserved *bool `protobuf:"varint,5,opt,name=reserved" json:"reserved,omitempty"` + // If true, indicates that the extension must be defined as repeated. + // Otherwise the extension must be defined as optional. + Repeated *bool `protobuf:"varint,6,opt,name=repeated" json:"repeated,omitempty"` +} + +func (x *ExtensionRangeOptions_Declaration) Reset() { + *x = ExtensionRangeOptions_Declaration{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtensionRangeOptions_Declaration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtensionRangeOptions_Declaration) ProtoMessage() {} + +func (x *ExtensionRangeOptions_Declaration) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExtensionRangeOptions_Declaration.ProtoReflect.Descriptor instead. +func (*ExtensionRangeOptions_Declaration) Descriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *ExtensionRangeOptions_Declaration) GetNumber() int32 { + if x != nil && x.Number != nil { + return *x.Number + } + return 0 +} + +func (x *ExtensionRangeOptions_Declaration) GetFullName() string { + if x != nil && x.FullName != nil { + return *x.FullName + } + return "" +} + +func (x *ExtensionRangeOptions_Declaration) GetType() string { + if x != nil && x.Type != nil { + return *x.Type + } + return "" +} + +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *ExtensionRangeOptions_Declaration) GetIsRepeated() bool { + if x != nil && x.IsRepeated != nil { + return *x.IsRepeated + } + return false +} + +func (x *ExtensionRangeOptions_Declaration) GetReserved() bool { + if x != nil && x.Reserved != nil { + return *x.Reserved + } + return false +} + +func (x *ExtensionRangeOptions_Declaration) GetRepeated() bool { + if x != nil && x.Repeated != nil { + return *x.Repeated + } + return false +} + // Range of reserved numeric values. Reserved values may not be used by // entries in the same enum. Reserved ranges may not overlap. // @@ -2669,7 +3184,7 @@ type EnumDescriptorProto_EnumReservedRange struct { func (x *EnumDescriptorProto_EnumReservedRange) Reset() { *x = EnumDescriptorProto_EnumReservedRange{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + mi := &file_google_protobuf_descriptor_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2682,7 +3197,7 @@ func (x *EnumDescriptorProto_EnumReservedRange) String() string { func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} func (x *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + mi := &file_google_protobuf_descriptor_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2715,8 +3230,8 @@ func (x *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { // The name of the uninterpreted option. Each string represents a segment in // a dot-separated name. is_extension is true iff a segment represents an // extension (denoted with parentheses in options specs in .proto files). -// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents -// "foo.(bar.baz).qux". +// E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents +// "foo.(bar.baz).moo". type UninterpretedOption_NamePart struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2729,7 +3244,7 @@ type UninterpretedOption_NamePart struct { func (x *UninterpretedOption_NamePart) Reset() { *x = UninterpretedOption_NamePart{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] + mi := &file_google_protobuf_descriptor_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2742,7 +3257,7 @@ func (x *UninterpretedOption_NamePart) String() string { func (*UninterpretedOption_NamePart) ProtoMessage() {} func (x *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] + mi := &file_google_protobuf_descriptor_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2781,23 +3296,34 @@ type SourceCodeInfo_Location struct { // location. // // Each element is a field number or an index. They form a path from - // the root FileDescriptorProto to the place where the definition. For - // example, this path: - // [ 4, 3, 2, 7, 1 ] + // the root FileDescriptorProto to the place where the definition occurs. + // For example, this path: + // + // [ 4, 3, 2, 7, 1 ] + // // refers to: - // file.message_type(3) // 4, 3 - // .field(7) // 2, 7 - // .name() // 1 + // + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // // This is because FileDescriptorProto.message_type has field number 4: - // repeated DescriptorProto message_type = 4; + // + // repeated DescriptorProto message_type = 4; + // // and DescriptorProto.field has field number 2: - // repeated FieldDescriptorProto field = 2; + // + // repeated FieldDescriptorProto field = 2; + // // and FieldDescriptorProto.name has field number 1: - // optional string name = 1; + // + // optional string name = 1; // // Thus, the above path gives the location of a field name. If we removed // the last element: - // [ 4, 3, 2, 7 ] + // + // [ 4, 3, 2, 7 ] + // // this path refers to the whole field declaration (from the beginning // of the label to the terminating semicolon). Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` @@ -2826,34 +3352,34 @@ type SourceCodeInfo_Location struct { // // Examples: // - // optional int32 foo = 1; // Comment attached to foo. - // // Comment attached to bar. - // optional int32 bar = 2; + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; // - // optional string baz = 3; - // // Comment attached to baz. - // // Another line attached to baz. + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. // - // // Comment attached to qux. - // // - // // Another line attached to qux. - // optional double qux = 4; + // // Comment attached to moo. + // // + // // Another line attached to moo. + // optional double moo = 4; // - // // Detached comment for corge. This is not leading or trailing comments - // // to qux or corge because there are blank lines separating it from - // // both. + // // Detached comment for corge. This is not leading or trailing comments + // // to moo or corge because there are blank lines separating it from + // // both. // - // // Detached comment for corge paragraph 2. + // // Detached comment for corge paragraph 2. // - // optional string corge = 5; - // /* Block comment attached - // * to corge. Leading asterisks - // * will be removed. */ - // /* Block comment attached to - // * grault. */ - // optional int32 grault = 6; + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; // - // // ignored detached comments. + // // ignored detached comments. LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` @@ -2862,7 +3388,7 @@ type SourceCodeInfo_Location struct { func (x *SourceCodeInfo_Location) Reset() { *x = SourceCodeInfo_Location{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] + mi := &file_google_protobuf_descriptor_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2875,7 +3401,7 @@ func (x *SourceCodeInfo_Location) String() string { func (*SourceCodeInfo_Location) ProtoMessage() {} func (x *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] + mi := &file_google_protobuf_descriptor_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2940,15 +3466,16 @@ type GeneratedCodeInfo_Annotation struct { // that relates to the identified object. Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` // Identifies the ending offset in bytes in the generated code that - // relates to the identified offset. The end offset should be one past + // relates to the identified object. The end offset should be one past // the last relevant byte (so the length of the text = end - begin). - End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + Semantic *GeneratedCodeInfo_Annotation_Semantic `protobuf:"varint,5,opt,name=semantic,enum=google.protobuf.GeneratedCodeInfo_Annotation_Semantic" json:"semantic,omitempty"` } func (x *GeneratedCodeInfo_Annotation) Reset() { *x = GeneratedCodeInfo_Annotation{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] + mi := &file_google_protobuf_descriptor_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2961,7 +3488,7 @@ func (x *GeneratedCodeInfo_Annotation) String() string { func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} func (x *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] + mi := &file_google_protobuf_descriptor_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3005,6 +3532,13 @@ func (x *GeneratedCodeInfo_Annotation) GetEnd() int32 { return 0 } +func (x *GeneratedCodeInfo_Annotation) GetSemantic() GeneratedCodeInfo_Annotation_Semantic { + if x != nil && x.Semantic != nil { + return *x.Semantic + } + return GeneratedCodeInfo_Annotation_NONE +} + var File_google_protobuf_descriptor_proto protoreflect.FileDescriptor var file_google_protobuf_descriptor_proto_rawDesc = []byte{ @@ -3016,7 +3550,7 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x22, 0xe4, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x6c, 0x65, 0x22, 0xfe, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, @@ -3054,330 +3588,423 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, - 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, - 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, + 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, - 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, - 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, + 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x7c, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, - 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, - 0x80, 0x80, 0x02, 0x22, 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x64, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, - 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, - 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, - 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, - 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, - 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, - 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, - 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, - 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, - 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, - 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, - 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, - 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, - 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, - 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, - 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, + 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, + 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, + 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, + 0xad, 0x04, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0x88, 0x01, + 0x02, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, + 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x0a, + 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb3, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x63, + 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x23, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x69, 0x73, 0x52, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x34, + 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x01, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, + 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, + 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, - 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, - 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x5d, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, - 0x6e, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, + 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, + 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, + 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, + 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, + 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, + 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, + 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, + 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, + 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, + 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, + 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, + 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, + 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, + 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, + 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, + 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, + 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, + 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x75, + 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, + 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x75, 0x6d, + 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x83, + 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, - 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, - 0x09, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x6a, 0x61, 0x76, 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, - 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, - 0x6c, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x3a, 0x0a, 0x16, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, - 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, - 0x50, 0x45, 0x45, 0x44, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, - 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x12, 0x35, 0x0a, 0x13, 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, - 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x35, 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, - 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, - 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, - 0x70, 0x68, 0x70, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, - 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, - 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, - 0x68, 0x70, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, - 0x0d, 0x70, 0x68, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, - 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x75, 0x62, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, - 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, - 0x03, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, - 0x10, 0x27, 0x22, 0xd1, 0x02, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, - 0x72, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, - 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, - 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xe2, 0x03, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, - 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, - 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, - 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x89, + 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, 0x09, 0x0a, 0x0b, 0x46, + 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x61, + 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, + 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6a, 0x61, 0x76, + 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x61, + 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, + 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x16, + 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, + 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1d, 0x0a, + 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x13, + 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, + 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, 0x5f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x2a, 0x20, + 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, 0x70, 0x68, 0x70, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, + 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, + 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, + 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x63, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x73, 0x68, + 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x27, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, + 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x68, 0x70, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x68, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, + 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x62, 0x79, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, + 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, + 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x22, 0xbb, + 0x03, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, + 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, + 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, + 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, + 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x85, 0x09, 0x0a, + 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, + 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, + 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, + 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, + 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, + 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, + 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x48, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, - 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, - 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, - 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, - 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, - 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, - 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4a, - 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, - 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, - 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, + 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, - 0x22, 0xc0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, - 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, + 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, + 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, + 0x0f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, + 0x0a, 0x10, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, + 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, + 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, + 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, + 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, + 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, + 0x44, 0x10, 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, + 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, + 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x98, 0x02, 0x0a, 0x0b, 0x45, 0x6e, + 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, + 0x08, 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, + 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, @@ -3385,97 +4012,95 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, - 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, - 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x80, 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, + 0x11, 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, + 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, + 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, + 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, + 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, + 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, + 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, + 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, + 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, - 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x11, - 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, - 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, - 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, 0x69, - 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, - 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, - 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, 0x65, - 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, - 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, 0x44, - 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, - 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, - 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, - 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, - 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, - 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x50, - 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, - 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, 0x0a, - 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x42, - 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, 0x61, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, - 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd1, 0x01, - 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0x6d, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x65, 0x67, - 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, - 0x64, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, + 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, + 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, + 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, + 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, + 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd0, + 0x02, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, + 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, + 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x65, 0x6e, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x52, 0x08, 0x73, + 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, + 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, + 0x03, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, + 0x02, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0x5a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, @@ -3498,92 +4123,103 @@ func file_google_protobuf_descriptor_proto_rawDescGZIP() []byte { return file_google_protobuf_descriptor_proto_rawDescData } -var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 10) +var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_google_protobuf_descriptor_proto_goTypes = []interface{}{ - (FieldDescriptorProto_Type)(0), // 0: google.protobuf.FieldDescriptorProto.Type - (FieldDescriptorProto_Label)(0), // 1: google.protobuf.FieldDescriptorProto.Label - (FileOptions_OptimizeMode)(0), // 2: google.protobuf.FileOptions.OptimizeMode - (FieldOptions_CType)(0), // 3: google.protobuf.FieldOptions.CType - (FieldOptions_JSType)(0), // 4: google.protobuf.FieldOptions.JSType - (MethodOptions_IdempotencyLevel)(0), // 5: google.protobuf.MethodOptions.IdempotencyLevel - (*FileDescriptorSet)(nil), // 6: google.protobuf.FileDescriptorSet - (*FileDescriptorProto)(nil), // 7: google.protobuf.FileDescriptorProto - (*DescriptorProto)(nil), // 8: google.protobuf.DescriptorProto - (*ExtensionRangeOptions)(nil), // 9: google.protobuf.ExtensionRangeOptions - (*FieldDescriptorProto)(nil), // 10: google.protobuf.FieldDescriptorProto - (*OneofDescriptorProto)(nil), // 11: google.protobuf.OneofDescriptorProto - (*EnumDescriptorProto)(nil), // 12: google.protobuf.EnumDescriptorProto - (*EnumValueDescriptorProto)(nil), // 13: google.protobuf.EnumValueDescriptorProto - (*ServiceDescriptorProto)(nil), // 14: google.protobuf.ServiceDescriptorProto - (*MethodDescriptorProto)(nil), // 15: google.protobuf.MethodDescriptorProto - (*FileOptions)(nil), // 16: google.protobuf.FileOptions - (*MessageOptions)(nil), // 17: google.protobuf.MessageOptions - (*FieldOptions)(nil), // 18: google.protobuf.FieldOptions - (*OneofOptions)(nil), // 19: google.protobuf.OneofOptions - (*EnumOptions)(nil), // 20: google.protobuf.EnumOptions - (*EnumValueOptions)(nil), // 21: google.protobuf.EnumValueOptions - (*ServiceOptions)(nil), // 22: google.protobuf.ServiceOptions - (*MethodOptions)(nil), // 23: google.protobuf.MethodOptions - (*UninterpretedOption)(nil), // 24: google.protobuf.UninterpretedOption - (*SourceCodeInfo)(nil), // 25: google.protobuf.SourceCodeInfo - (*GeneratedCodeInfo)(nil), // 26: google.protobuf.GeneratedCodeInfo - (*DescriptorProto_ExtensionRange)(nil), // 27: google.protobuf.DescriptorProto.ExtensionRange - (*DescriptorProto_ReservedRange)(nil), // 28: google.protobuf.DescriptorProto.ReservedRange - (*EnumDescriptorProto_EnumReservedRange)(nil), // 29: google.protobuf.EnumDescriptorProto.EnumReservedRange - (*UninterpretedOption_NamePart)(nil), // 30: google.protobuf.UninterpretedOption.NamePart - (*SourceCodeInfo_Location)(nil), // 31: google.protobuf.SourceCodeInfo.Location - (*GeneratedCodeInfo_Annotation)(nil), // 32: google.protobuf.GeneratedCodeInfo.Annotation + (ExtensionRangeOptions_VerificationState)(0), // 0: google.protobuf.ExtensionRangeOptions.VerificationState + (FieldDescriptorProto_Type)(0), // 1: google.protobuf.FieldDescriptorProto.Type + (FieldDescriptorProto_Label)(0), // 2: google.protobuf.FieldDescriptorProto.Label + (FileOptions_OptimizeMode)(0), // 3: google.protobuf.FileOptions.OptimizeMode + (FieldOptions_CType)(0), // 4: google.protobuf.FieldOptions.CType + (FieldOptions_JSType)(0), // 5: google.protobuf.FieldOptions.JSType + (FieldOptions_OptionRetention)(0), // 6: google.protobuf.FieldOptions.OptionRetention + (FieldOptions_OptionTargetType)(0), // 7: google.protobuf.FieldOptions.OptionTargetType + (MethodOptions_IdempotencyLevel)(0), // 8: google.protobuf.MethodOptions.IdempotencyLevel + (GeneratedCodeInfo_Annotation_Semantic)(0), // 9: google.protobuf.GeneratedCodeInfo.Annotation.Semantic + (*FileDescriptorSet)(nil), // 10: google.protobuf.FileDescriptorSet + (*FileDescriptorProto)(nil), // 11: google.protobuf.FileDescriptorProto + (*DescriptorProto)(nil), // 12: google.protobuf.DescriptorProto + (*ExtensionRangeOptions)(nil), // 13: google.protobuf.ExtensionRangeOptions + (*FieldDescriptorProto)(nil), // 14: google.protobuf.FieldDescriptorProto + (*OneofDescriptorProto)(nil), // 15: google.protobuf.OneofDescriptorProto + (*EnumDescriptorProto)(nil), // 16: google.protobuf.EnumDescriptorProto + (*EnumValueDescriptorProto)(nil), // 17: google.protobuf.EnumValueDescriptorProto + (*ServiceDescriptorProto)(nil), // 18: google.protobuf.ServiceDescriptorProto + (*MethodDescriptorProto)(nil), // 19: google.protobuf.MethodDescriptorProto + (*FileOptions)(nil), // 20: google.protobuf.FileOptions + (*MessageOptions)(nil), // 21: google.protobuf.MessageOptions + (*FieldOptions)(nil), // 22: google.protobuf.FieldOptions + (*OneofOptions)(nil), // 23: google.protobuf.OneofOptions + (*EnumOptions)(nil), // 24: google.protobuf.EnumOptions + (*EnumValueOptions)(nil), // 25: google.protobuf.EnumValueOptions + (*ServiceOptions)(nil), // 26: google.protobuf.ServiceOptions + (*MethodOptions)(nil), // 27: google.protobuf.MethodOptions + (*UninterpretedOption)(nil), // 28: google.protobuf.UninterpretedOption + (*SourceCodeInfo)(nil), // 29: google.protobuf.SourceCodeInfo + (*GeneratedCodeInfo)(nil), // 30: google.protobuf.GeneratedCodeInfo + (*DescriptorProto_ExtensionRange)(nil), // 31: google.protobuf.DescriptorProto.ExtensionRange + (*DescriptorProto_ReservedRange)(nil), // 32: google.protobuf.DescriptorProto.ReservedRange + (*ExtensionRangeOptions_Declaration)(nil), // 33: google.protobuf.ExtensionRangeOptions.Declaration + (*EnumDescriptorProto_EnumReservedRange)(nil), // 34: google.protobuf.EnumDescriptorProto.EnumReservedRange + (*UninterpretedOption_NamePart)(nil), // 35: google.protobuf.UninterpretedOption.NamePart + (*SourceCodeInfo_Location)(nil), // 36: google.protobuf.SourceCodeInfo.Location + (*GeneratedCodeInfo_Annotation)(nil), // 37: google.protobuf.GeneratedCodeInfo.Annotation } var file_google_protobuf_descriptor_proto_depIdxs = []int32{ - 7, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto - 8, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto - 12, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 14, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto - 10, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 16, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions - 25, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo - 10, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto - 10, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 8, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto - 12, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 27, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange - 11, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto - 17, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions - 28, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange - 24, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 1, // 16: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label - 0, // 17: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type - 18, // 18: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions - 19, // 19: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions - 13, // 20: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto - 20, // 21: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions - 29, // 22: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange - 21, // 23: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions - 15, // 24: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto - 22, // 25: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions - 23, // 26: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions - 2, // 27: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode - 24, // 28: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 29: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 3, // 30: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType - 4, // 31: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType - 24, // 32: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 33: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 34: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 35: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 36: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 5, // 37: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel - 24, // 38: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 30, // 39: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart - 31, // 40: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location - 32, // 41: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation - 9, // 42: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions - 43, // [43:43] is the sub-list for method output_type - 43, // [43:43] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 11, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto + 12, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto + 16, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto + 18, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto + 14, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto + 20, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions + 29, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo + 14, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto + 14, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto + 12, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto + 16, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto + 31, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange + 15, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto + 21, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions + 32, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange + 28, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 33, // 16: google.protobuf.ExtensionRangeOptions.declaration:type_name -> google.protobuf.ExtensionRangeOptions.Declaration + 0, // 17: google.protobuf.ExtensionRangeOptions.verification:type_name -> google.protobuf.ExtensionRangeOptions.VerificationState + 2, // 18: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label + 1, // 19: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type + 22, // 20: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions + 23, // 21: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions + 17, // 22: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto + 24, // 23: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions + 34, // 24: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange + 25, // 25: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions + 19, // 26: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto + 26, // 27: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions + 27, // 28: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions + 3, // 29: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode + 28, // 30: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 31: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 4, // 32: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType + 5, // 33: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType + 6, // 34: google.protobuf.FieldOptions.retention:type_name -> google.protobuf.FieldOptions.OptionRetention + 7, // 35: google.protobuf.FieldOptions.target:type_name -> google.protobuf.FieldOptions.OptionTargetType + 7, // 36: google.protobuf.FieldOptions.targets:type_name -> google.protobuf.FieldOptions.OptionTargetType + 28, // 37: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 38: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 39: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 40: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 41: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 8, // 42: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel + 28, // 43: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 35, // 44: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart + 36, // 45: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location + 37, // 46: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation + 13, // 47: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions + 9, // 48: google.protobuf.GeneratedCodeInfo.Annotation.semantic:type_name -> google.protobuf.GeneratedCodeInfo.Annotation.Semantic + 49, // [49:49] is the sub-list for method output_type + 49, // [49:49] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_google_protobuf_descriptor_proto_init() } @@ -3887,7 +4523,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumDescriptorProto_EnumReservedRange); i { + switch v := v.(*ExtensionRangeOptions_Declaration); i { case 0: return &v.state case 1: @@ -3899,7 +4535,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UninterpretedOption_NamePart); i { + switch v := v.(*EnumDescriptorProto_EnumReservedRange); i { case 0: return &v.state case 1: @@ -3911,7 +4547,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceCodeInfo_Location); i { + switch v := v.(*UninterpretedOption_NamePart); i { case 0: return &v.state case 1: @@ -3923,6 +4559,18 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SourceCodeInfo_Location); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_descriptor_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GeneratedCodeInfo_Annotation); i { case 0: return &v.state @@ -3940,8 +4588,8 @@ func file_google_protobuf_descriptor_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_protobuf_descriptor_proto_rawDesc, - NumEnums: 6, - NumMessages: 27, + NumEnums: 10, + NumMessages: 28, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/google.golang.org/protobuf/types/dynamicpb/types.go b/vendor/google.golang.org/protobuf/types/dynamicpb/types.go new file mode 100644 index 0000000000..5a8010f18f --- /dev/null +++ b/vendor/google.golang.org/protobuf/types/dynamicpb/types.go @@ -0,0 +1,177 @@ +// Copyright 2023 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 dynamicpb + +import ( + "fmt" + "strings" + "sync" + "sync/atomic" + + "google.golang.org/protobuf/internal/errors" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" +) + +type extField struct { + name protoreflect.FullName + number protoreflect.FieldNumber +} + +// A Types is a collection of dynamically constructed descriptors. +// Its methods are safe for concurrent use. +// +// Types implements protoregistry.MessageTypeResolver and protoregistry.ExtensionTypeResolver. +// A Types may be used as a proto.UnmarshalOptions.Resolver. +type Types struct { + files *protoregistry.Files + + extMu sync.Mutex + atomicExtFiles uint64 + extensionsByMessage map[extField]protoreflect.ExtensionDescriptor +} + +// NewTypes creates a new Types registry with the provided files. +// The Files registry is retained, and changes to Files will be reflected in Types. +// It is not safe to concurrently change the Files while calling Types methods. +func NewTypes(f *protoregistry.Files) *Types { + return &Types{ + files: f, + } +} + +// FindEnumByName looks up an enum by its full name; +// e.g., "google.protobuf.Field.Kind". +// +// This returns (nil, protoregistry.NotFound) if not found. +func (t *Types) FindEnumByName(name protoreflect.FullName) (protoreflect.EnumType, error) { + d, err := t.files.FindDescriptorByName(name) + if err != nil { + return nil, err + } + ed, ok := d.(protoreflect.EnumDescriptor) + if !ok { + return nil, errors.New("found wrong type: got %v, want enum", descName(d)) + } + return NewEnumType(ed), nil +} + +// FindExtensionByName looks up an extension field by the field's full name. +// Note that this is the full name of the field as determined by +// where the extension is declared and is unrelated to the full name of the +// message being extended. +// +// This returns (nil, protoregistry.NotFound) if not found. +func (t *Types) FindExtensionByName(name protoreflect.FullName) (protoreflect.ExtensionType, error) { + d, err := t.files.FindDescriptorByName(name) + if err != nil { + return nil, err + } + xd, ok := d.(protoreflect.ExtensionDescriptor) + if !ok { + return nil, errors.New("found wrong type: got %v, want extension", descName(d)) + } + return NewExtensionType(xd), nil +} + +// FindExtensionByNumber looks up an extension field by the field number +// within some parent message, identified by full name. +// +// This returns (nil, protoregistry.NotFound) if not found. +func (t *Types) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { + // Construct the extension number map lazily, since not every user will need it. + // Update the map if new files are added to the registry. + if atomic.LoadUint64(&t.atomicExtFiles) != uint64(t.files.NumFiles()) { + t.updateExtensions() + } + xd := t.extensionsByMessage[extField{message, field}] + if xd == nil { + return nil, protoregistry.NotFound + } + return NewExtensionType(xd), nil +} + +// FindMessageByName looks up a message by its full name; +// e.g. "google.protobuf.Any". +// +// This returns (nil, protoregistry.NotFound) if not found. +func (t *Types) FindMessageByName(name protoreflect.FullName) (protoreflect.MessageType, error) { + d, err := t.files.FindDescriptorByName(name) + if err != nil { + return nil, err + } + md, ok := d.(protoreflect.MessageDescriptor) + if !ok { + return nil, errors.New("found wrong type: got %v, want message", descName(d)) + } + return NewMessageType(md), nil +} + +// FindMessageByURL looks up a message by a URL identifier. +// See documentation on google.protobuf.Any.type_url for the URL format. +// +// This returns (nil, protoregistry.NotFound) if not found. +func (t *Types) FindMessageByURL(url string) (protoreflect.MessageType, error) { + // This function is similar to FindMessageByName but + // truncates anything before and including '/' in the URL. + message := protoreflect.FullName(url) + if i := strings.LastIndexByte(url, '/'); i >= 0 { + message = message[i+len("/"):] + } + return t.FindMessageByName(message) +} + +func (t *Types) updateExtensions() { + t.extMu.Lock() + defer t.extMu.Unlock() + if atomic.LoadUint64(&t.atomicExtFiles) == uint64(t.files.NumFiles()) { + return + } + defer atomic.StoreUint64(&t.atomicExtFiles, uint64(t.files.NumFiles())) + t.files.RangeFiles(func(fd protoreflect.FileDescriptor) bool { + t.registerExtensions(fd.Extensions()) + t.registerExtensionsInMessages(fd.Messages()) + return true + }) +} + +func (t *Types) registerExtensionsInMessages(mds protoreflect.MessageDescriptors) { + count := mds.Len() + for i := 0; i < count; i++ { + md := mds.Get(i) + t.registerExtensions(md.Extensions()) + t.registerExtensionsInMessages(md.Messages()) + } +} + +func (t *Types) registerExtensions(xds protoreflect.ExtensionDescriptors) { + count := xds.Len() + for i := 0; i < count; i++ { + xd := xds.Get(i) + field := xd.Number() + message := xd.ContainingMessage().FullName() + if t.extensionsByMessage == nil { + t.extensionsByMessage = make(map[extField]protoreflect.ExtensionDescriptor) + } + t.extensionsByMessage[extField{message, field}] = xd + } +} + +func descName(d protoreflect.Descriptor) string { + switch d.(type) { + case protoreflect.EnumDescriptor: + return "enum" + case protoreflect.EnumValueDescriptor: + return "enum value" + case protoreflect.MessageDescriptor: + return "message" + case protoreflect.ExtensionDescriptor: + return "extension" + case protoreflect.ServiceDescriptor: + return "service" + default: + return fmt.Sprintf("%T", d) + } +} diff --git a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go index 8c10797b90..580b232f47 100644 --- a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go @@ -37,8 +37,7 @@ // It is functionally a tuple of the full name of the remote message type and // the serialized bytes of the remote message value. // -// -// Constructing an Any +// # Constructing an Any // // An Any message containing another message value is constructed using New: // @@ -48,8 +47,7 @@ // } // ... // make use of any // -// -// Unmarshaling an Any +// # Unmarshaling an Any // // With a populated Any message, the underlying message can be serialized into // a remote concrete message value in a few ways. @@ -95,8 +93,7 @@ // listed in the case clauses are linked into the Go binary and therefore also // registered in the global registry. // -// -// Type checking an Any +// # Type checking an Any // // In order to type check whether an Any message represents some other message, // then use the MessageIs method: @@ -115,7 +112,6 @@ // } // ... // make use of m // } -// package anypb import ( @@ -136,45 +132,49 @@ import ( // // Example 1: Pack and unpack a message in C++. // -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } // // Example 2: Pack and unpack a message in Java. // -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := anypb.New(foo) -// if err != nil { -// ... -// } -// ... -// foo := &pb.Foo{} -// if err := any.UnmarshalTo(foo); err != nil { -// ... -// } +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// // or ... +// if (any.isSameTypeAs(Foo.getDefaultInstance())) { +// foo = any.unpack(Foo.getDefaultInstance()); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := anypb.New(foo) +// if err != nil { +// ... +// } +// ... +// foo := &pb.Foo{} +// if err := any.UnmarshalTo(foo); err != nil { +// ... +// } // // The pack methods provided by protobuf library will by default use // 'type.googleapis.com/full.type.name' as the type URL and the unpack @@ -182,35 +182,33 @@ import ( // in the type URL, for example "foo.bar.com/x/y.z" will yield type // name "y.z". // -// // JSON // ==== // The JSON representation of an `Any` value uses the regular // representation of the deserialized, embedded message, with an // additional field `@type` which contains the type URL. Example: // -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } // -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": <string>, -// "lastName": <string> -// } +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": <string>, +// "lastName": <string> +// } // // If the embedded message type is well-known and has a custom JSON // representation, that representation will be embedded adding a field // `value` which holds the custom JSON in addition to the `@type` // field. Example (for message [google.protobuf.Duration][]): // -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } type Any struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -228,14 +226,14 @@ type Any struct { // scheme `http`, `https`, or no scheme, one can optionally set up a type // server that maps type URLs to message definitions as follows: // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) + // - If no scheme is provided, `https` is assumed. + // - An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // - Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) // // Note: this functionality is not currently available in the official // protobuf release, and it is not used for type URLs beginning with @@ -243,7 +241,6 @@ type Any struct { // // Schemes other than `http`, `https` (or the empty scheme) might be // used with implementation specific semantics. - // TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` // Must be a valid serialized protocol buffer of the above specified type. Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` diff --git a/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go b/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go index a583ca2f6c..df709a8dd4 100644 --- a/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go @@ -35,8 +35,7 @@ // // The Duration message represents a signed span of time. // -// -// Conversion to a Go Duration +// # Conversion to a Go Duration // // The AsDuration method can be used to convert a Duration message to a // standard Go time.Duration value: @@ -65,15 +64,13 @@ // the resulting value to the closest representable value (e.g., math.MaxInt64 // for positive overflow and math.MinInt64 for negative overflow). // -// -// Conversion from a Go Duration +// # Conversion from a Go Duration // // The durationpb.New function can be used to construct a Duration message // from a standard Go time.Duration value: // // dur := durationpb.New(d) // ... // make use of d as a *durationpb.Duration -// package durationpb import ( @@ -96,43 +93,43 @@ import ( // // Example 1: Compute Duration from two Timestamps in pseudo code. // -// Timestamp start = ...; -// Timestamp end = ...; -// Duration duration = ...; +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; // -// duration.seconds = end.seconds - start.seconds; -// duration.nanos = end.nanos - start.nanos; +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; // -// if (duration.seconds < 0 && duration.nanos > 0) { -// duration.seconds += 1; -// duration.nanos -= 1000000000; -// } else if (duration.seconds > 0 && duration.nanos < 0) { -// duration.seconds -= 1; -// duration.nanos += 1000000000; -// } +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (duration.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } // // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. // -// Timestamp start = ...; -// Duration duration = ...; -// Timestamp end = ...; +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; // -// end.seconds = start.seconds + duration.seconds; -// end.nanos = start.nanos + duration.nanos; +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; // -// if (end.nanos < 0) { -// end.seconds -= 1; -// end.nanos += 1000000000; -// } else if (end.nanos >= 1000000000) { -// end.seconds += 1; -// end.nanos -= 1000000000; -// } +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } // // Example 3: Compute Duration from datetime.timedelta in Python. // -// td = datetime.timedelta(days=3, minutes=10) -// duration = Duration() -// duration.FromTimedelta(td) +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) // // # JSON Mapping // @@ -143,8 +140,6 @@ import ( // encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should // be expressed in JSON format as "3.000000001s", and 3 seconds and 1 // microsecond should be expressed in JSON format as "3.000001s". -// -// type Duration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go b/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go index e7fcea31f6..9a7277ba39 100644 --- a/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go @@ -44,11 +44,9 @@ import ( // 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: // -// service Foo { -// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); -// } -// -// The JSON representation for `Empty` is empty JSON object `{}`. +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } type Empty struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go b/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go index 1b2085d469..e8789cb331 100644 --- a/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go @@ -37,8 +37,7 @@ // The paths are specific to some target message type, // which is not stored within the FieldMask message itself. // -// -// Constructing a FieldMask +// # Constructing a FieldMask // // The New function is used construct a FieldMask: // @@ -61,8 +60,7 @@ // ... // handle error // } // -// -// Type checking a FieldMask +// # Type checking a FieldMask // // In order to verify that a FieldMask represents a set of fields that are // reachable from some target message type, use the IsValid method: @@ -89,8 +87,8 @@ import ( // `FieldMask` represents a set of symbolic field paths, for example: // -// paths: "f.a" -// paths: "f.b.d" +// paths: "f.a" +// paths: "f.b.d" // // Here `f` represents a field in some root message, `a` and `b` // fields in the message found in `f`, and `d` a field found in the @@ -107,27 +105,26 @@ import ( // specified in the mask. For example, if the mask in the previous // example is applied to a response message as follows: // -// f { -// a : 22 -// b { -// d : 1 -// x : 2 -// } -// y : 13 -// } -// z: 8 +// f { +// a : 22 +// b { +// d : 1 +// x : 2 +// } +// y : 13 +// } +// z: 8 // // The result will not contain specific values for fields x,y and z // (their value will be set to the default, and omitted in proto text // output): // -// -// f { -// a : 22 -// b { -// d : 1 -// } -// } +// f { +// a : 22 +// b { +// d : 1 +// } +// } // // A repeated field is not allowed except at the last position of a // paths string. @@ -165,36 +162,36 @@ import ( // // For example, given the target message: // -// f { -// b { -// d: 1 -// x: 2 -// } -// c: [1] -// } +// f { +// b { +// d: 1 +// x: 2 +// } +// c: [1] +// } // // And an update message: // -// f { -// b { -// d: 10 -// } -// c: [2] -// } +// f { +// b { +// d: 10 +// } +// c: [2] +// } // // then if the field mask is: // -// paths: ["f.b", "f.c"] +// paths: ["f.b", "f.c"] // // then the result will be: // -// f { -// b { -// d: 10 -// x: 2 -// } -// c: [1, 2] -// } +// f { +// b { +// d: 10 +// x: 2 +// } +// c: [1, 2] +// } // // An implementation may provide options to override this default behavior for // repeated and message fields. @@ -232,51 +229,51 @@ import ( // // As an example, consider the following message declarations: // -// message Profile { -// User user = 1; -// Photo photo = 2; -// } -// message User { -// string display_name = 1; -// string address = 2; -// } +// message Profile { +// User user = 1; +// Photo photo = 2; +// } +// message User { +// string display_name = 1; +// string address = 2; +// } // // In proto a field mask for `Profile` may look as such: // -// mask { -// paths: "user.display_name" -// paths: "photo" -// } +// mask { +// paths: "user.display_name" +// paths: "photo" +// } // // In JSON, the same mask is represented as below: // -// { -// mask: "user.displayName,photo" -// } +// { +// mask: "user.displayName,photo" +// } // // # Field Masks and Oneof Fields // // Field masks treat fields in oneofs just as regular fields. Consider the // following message: // -// message SampleMessage { -// oneof test_oneof { -// string name = 4; -// SubMessage sub_message = 9; -// } -// } +// message SampleMessage { +// oneof test_oneof { +// string name = 4; +// SubMessage sub_message = 9; +// } +// } // // The field mask can be: // -// mask { -// paths: "name" -// } +// mask { +// paths: "name" +// } // // Or: // -// mask { -// paths: "sub_message" -// } +// mask { +// paths: "sub_message" +// } // // Note that oneof type names ("test_oneof" in this case) cannot be used in // paths. diff --git a/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go b/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go index 586690522a..d2bac8b88e 100644 --- a/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go @@ -44,8 +44,7 @@ // "google.golang.org/protobuf/encoding/protojson" package // ensures that they will be serialized as their JSON equivalent. // -// -// Conversion to and from a Go interface +// # Conversion to and from a Go interface // // The standard Go "encoding/json" package has functionality to serialize // arbitrary types to a large degree. The Value.AsInterface, Struct.AsMap, and @@ -58,8 +57,7 @@ // forms back as Value, Struct, and ListValue messages, use the NewStruct, // NewList, and NewValue constructor functions. // -// -// Example usage +// # Example usage // // Consider the following example JSON object: // @@ -118,7 +116,6 @@ // ... // handle error // } // ... // make use of m as a *structpb.Value -// package structpb import ( @@ -135,7 +132,7 @@ import ( // `NullValue` is a singleton enumeration to represent the null value for the // `Value` type union. // -// The JSON representation for `NullValue` is JSON `null`. +// The JSON representation for `NullValue` is JSON `null`. type NullValue int32 const ( @@ -218,8 +215,9 @@ func NewStruct(v map[string]interface{}) (*Struct, error) { // AsMap converts x to a general-purpose Go map. // The map values are converted by calling Value.AsInterface. func (x *Struct) AsMap() map[string]interface{} { - vs := make(map[string]interface{}) - for k, v := range x.GetFields() { + f := x.GetFields() + vs := make(map[string]interface{}, len(f)) + for k, v := range f { vs[k] = v.AsInterface() } return vs @@ -274,8 +272,8 @@ func (x *Struct) GetFields() map[string]*Value { // `Value` represents a dynamically typed value which can be either // null, a number, a string, a boolean, a recursive struct value, or a -// list of values. A producer of value is expected to set one of that -// variants, absence of any variant indicates an error. +// list of values. A producer of value is expected to set one of these +// variants. Absence of any variant indicates an error. // // The JSON representation for `Value` is JSON value. type Value struct { @@ -286,6 +284,7 @@ type Value struct { // The kind of value. // // Types that are assignable to Kind: + // // *Value_NullValue // *Value_NumberValue // *Value_StringValue @@ -596,8 +595,9 @@ func NewList(v []interface{}) (*ListValue, error) { // AsSlice converts x to a general-purpose Go slice. // The slice elements are converted by calling Value.AsInterface. func (x *ListValue) AsSlice() []interface{} { - vs := make([]interface{}, len(x.GetValues())) - for i, v := range x.GetValues() { + vals := x.GetValues() + vs := make([]interface{}, len(vals)) + for i, v := range vals { vs[i] = v.AsInterface() } return vs diff --git a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go index c9ae92132a..81511a3363 100644 --- a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go @@ -36,8 +36,7 @@ // The Timestamp message represents a timestamp, // an instant in time since the Unix epoch (January 1st, 1970). // -// -// Conversion to a Go Time +// # Conversion to a Go Time // // The AsTime method can be used to convert a Timestamp message to a // standard Go time.Time value in UTC: @@ -59,8 +58,7 @@ // ... // handle error // } // -// -// Conversion from a Go Time +// # Conversion from a Go Time // // The timestamppb.New function can be used to construct a Timestamp message // from a standard Go time.Time value: @@ -72,7 +70,6 @@ // // ts := timestamppb.Now() // ... // make use of ts as a *timestamppb.Timestamp -// package timestamppb import ( @@ -101,52 +98,50 @@ import ( // // Example 1: Compute Timestamp from POSIX `time()`. // -// Timestamp timestamp; -// timestamp.set_seconds(time(NULL)); -// timestamp.set_nanos(0); +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); // // Example 2: Compute Timestamp from POSIX `gettimeofday()`. // -// struct timeval tv; -// gettimeofday(&tv, NULL); +// struct timeval tv; +// gettimeofday(&tv, NULL); // -// Timestamp timestamp; -// timestamp.set_seconds(tv.tv_sec); -// timestamp.set_nanos(tv.tv_usec * 1000); +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); // // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. // -// FILETIME ft; -// GetSystemTimeAsFileTime(&ft); -// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; // -// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z -// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. -// Timestamp timestamp; -// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); -// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); // // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. // -// long millis = System.currentTimeMillis(); -// -// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) -// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// long millis = System.currentTimeMillis(); // +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); // // Example 5: Compute Timestamp from Java `Instant.now()`. // -// Instant now = Instant.now(); -// -// Timestamp timestamp = -// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) -// .setNanos(now.getNano()).build(); +// Instant now = Instant.now(); // +// Timestamp timestamp = +// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) +// .setNanos(now.getNano()).build(); // // Example 6: Compute Timestamp from current time in Python. // -// timestamp = Timestamp() -// timestamp.GetCurrentTime() +// timestamp = Timestamp() +// timestamp.GetCurrentTime() // // # JSON Mapping // @@ -172,10 +167,8 @@ import ( // [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with // the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use // the Joda Time's [`ISODateTimeFormat.dateTime()`]( -// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D +// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() // ) to obtain a formatter capable of generating timestamps in this format. -// -// type Timestamp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go b/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go index 895a8049e2..762a87130f 100644 --- a/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go @@ -27,7 +27,7 @@ // 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. - +// // Wrappers for primitive (non-message) types. These types are useful // for embedding primitives in the `google.protobuf.Any` type and for places // where we need to distinguish between the absence of a primitive diff --git a/vendor/k8s.io/klog/v2/contextual.go b/vendor/k8s.io/klog/v2/contextual.go index 2428963c0e..005513f2a7 100644 --- a/vendor/k8s.io/klog/v2/contextual.go +++ b/vendor/k8s.io/klog/v2/contextual.go @@ -70,11 +70,14 @@ func SetLogger(logger logr.Logger) { // routing log entries through klogr into klog and then into the actual Logger // backend. func SetLoggerWithOptions(logger logr.Logger, opts ...LoggerOption) { - logging.logger = &logger logging.loggerOptions = loggerOptions{} for _, opt := range opts { opt(&logging.loggerOptions) } + logging.logger = &logWriter{ + Logger: logger, + writeKlogBuffer: logging.loggerOptions.writeKlogBuffer, + } } // ContextualLogger determines whether the logger passed to @@ -93,6 +96,22 @@ func FlushLogger(flush func()) LoggerOption { } } +// WriteKlogBuffer sets a callback that will be invoked by klog to write output +// produced by non-structured log calls like Infof. +// +// The buffer will contain exactly the same data that klog normally would write +// into its own output stream(s). In particular this includes the header, if +// klog is configured to write one. The callback then can divert that data into +// its own output streams. The buffer may or may not end in a line break. +// +// Without such a callback, klog will call the logger's Info or Error method +// with just the message string (i.e. no header). +func WriteKlogBuffer(write func([]byte)) LoggerOption { + return func(o *loggerOptions) { + o.writeKlogBuffer = write + } +} + // LoggerOption implements the functional parameter paradigm for // SetLoggerWithOptions. type LoggerOption func(o *loggerOptions) @@ -100,6 +119,13 @@ type LoggerOption func(o *loggerOptions) type loggerOptions struct { contextualLogger bool flush func() + writeKlogBuffer func([]byte) +} + +// logWriter combines a logger (always set) with a write callback (optional). +type logWriter struct { + Logger + writeKlogBuffer func([]byte) } // ClearLogger removes a backing Logger implementation if one was set earlier @@ -152,7 +178,7 @@ func Background() Logger { if logging.loggerOptions.contextualLogger { // Is non-nil because logging.loggerOptions.contextualLogger is // only true if a logger was set. - return *logging.logger + return logging.logger.Logger } return klogLogger diff --git a/vendor/k8s.io/klog/v2/format.go b/vendor/k8s.io/klog/v2/format.go new file mode 100644 index 0000000000..63995ca6db --- /dev/null +++ b/vendor/k8s.io/klog/v2/format.go @@ -0,0 +1,65 @@ +/* +Copyright 2023 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 klog + +import ( + "encoding/json" + "fmt" + "strings" + + "github.com/go-logr/logr" +) + +// Format wraps a value of an arbitrary type and implement fmt.Stringer and +// logr.Marshaler for them. Stringer returns pretty-printed JSON. MarshalLog +// returns the original value with a type that has no special methods, in +// particular no MarshalLog or MarshalJSON. +// +// Wrapping values like that is useful when the value has a broken +// implementation of these special functions (for example, a type which +// inherits String from TypeMeta, but then doesn't re-implement String) or the +// implementation produces output that is less readable or unstructured (for +// example, the generated String functions for Kubernetes API types). +func Format(obj interface{}) interface{} { + return formatAny{Object: obj} +} + +type formatAny struct { + Object interface{} +} + +func (f formatAny) String() string { + var buffer strings.Builder + encoder := json.NewEncoder(&buffer) + encoder.SetIndent("", " ") + if err := encoder.Encode(&f.Object); err != nil { + return fmt.Sprintf("error marshaling %T to JSON: %v", f, err) + } + return buffer.String() +} + +func (f formatAny) MarshalLog() interface{} { + // Returning a pointer to a pointer ensures that zapr doesn't find a + // fmt.Stringer or logr.Marshaler when it checks the type of the + // value. It then falls back to reflection, which dumps the value being + // pointed to (JSON doesn't have pointers). + ptr := &f.Object + return &ptr +} + +var _ fmt.Stringer = formatAny{} +var _ logr.Marshaler = formatAny{} diff --git a/vendor/k8s.io/klog/v2/internal/buffer/buffer.go b/vendor/k8s.io/klog/v2/internal/buffer/buffer.go index d53b49da39..f325ded5e9 100644 --- a/vendor/k8s.io/klog/v2/internal/buffer/buffer.go +++ b/vendor/k8s.io/klog/v2/internal/buffer/buffer.go @@ -55,6 +55,17 @@ func GetBuffer() *Buffer { // PutBuffer returns a buffer to the free list. func PutBuffer(b *Buffer) { + if b.Len() >= 256 { + // Let big buffers die a natural death, without relying on + // sync.Pool behavior. The documentation implies that items may + // get deallocated while stored there ("If the Pool holds the + // only reference when this [= be removed automatically] + // happens, the item might be deallocated."), but + // https://github.com/golang/go/issues/23199 leans more towards + // having such a size limit. + return + } + buffers.Put(b) } @@ -99,7 +110,8 @@ func (buf *Buffer) someDigits(i, d int) int { return copy(buf.Tmp[i:], buf.Tmp[j:]) } -// FormatHeader formats a log header using the provided file name and line number. +// FormatHeader formats a log header using the provided file name and line number +// and writes it into the buffer. func (buf *Buffer) FormatHeader(s severity.Severity, file string, line int, now time.Time) { if line < 0 { line = 0 // not a real line number, but acceptable to someDigits @@ -135,3 +147,30 @@ func (buf *Buffer) FormatHeader(s severity.Severity, file string, line int, now buf.Tmp[n+2] = ' ' buf.Write(buf.Tmp[:n+3]) } + +// SprintHeader formats a log header and returns a string. This is a simpler +// version of FormatHeader for use in ktesting. +func (buf *Buffer) SprintHeader(s severity.Severity, now time.Time) string { + if s > severity.FatalLog { + s = severity.InfoLog // for safety. + } + + // Avoid Fprintf, for speed. The format is so simple that we can do it quickly by hand. + // It's worth about 3X. Fprintf is hard. + _, month, day := now.Date() + hour, minute, second := now.Clock() + // Lmmdd hh:mm:ss.uuuuuu threadid file:line] + buf.Tmp[0] = severity.Char[s] + buf.twoDigits(1, int(month)) + buf.twoDigits(3, day) + buf.Tmp[5] = ' ' + buf.twoDigits(6, hour) + buf.Tmp[8] = ':' + buf.twoDigits(9, minute) + buf.Tmp[11] = ':' + buf.twoDigits(12, second) + buf.Tmp[14] = '.' + buf.nDigits(6, 15, now.Nanosecond()/1000, '0') + buf.Tmp[21] = ']' + return string(buf.Tmp[:22]) +} diff --git a/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go b/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go index f9558c3d28..bcdf5f8ee1 100644 --- a/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go +++ b/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go @@ -18,6 +18,7 @@ package serialize import ( "bytes" + "encoding/json" "fmt" "strconv" @@ -95,9 +96,15 @@ func MergeKVs(first, second []interface{}) []interface{} { return merged } +type Formatter struct { + AnyToStringHook AnyToStringFunc +} + +type AnyToStringFunc func(v interface{}) string + // MergeKVsInto is a variant of MergeKVs which directly formats the key/value // pairs into a buffer. -func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) { +func (f Formatter) MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) { if len(first) == 0 && len(second) == 0 { // Nothing to do at all. return @@ -107,7 +114,7 @@ func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) { // Nothing to be overridden, second slice is well-formed // and can be used directly. for i := 0; i < len(second); i += 2 { - KVFormat(b, second[i], second[i+1]) + f.KVFormat(b, second[i], second[i+1]) } return } @@ -127,24 +134,28 @@ func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) { if overrides[key] { continue } - KVFormat(b, key, first[i+1]) + f.KVFormat(b, key, first[i+1]) } // Round down. l := len(second) l = l / 2 * 2 for i := 1; i < l; i += 2 { - KVFormat(b, second[i-1], second[i]) + f.KVFormat(b, second[i-1], second[i]) } if len(second)%2 == 1 { - KVFormat(b, second[len(second)-1], missingValue) + f.KVFormat(b, second[len(second)-1], missingValue) } } +func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) { + Formatter{}.MergeAndFormatKVs(b, first, second) +} + const missingValue = "(MISSING)" // KVListFormat serializes all key/value pairs into the provided buffer. // A space gets inserted before the first pair and between each pair. -func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) { +func (f Formatter) KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) { for i := 0; i < len(keysAndValues); i += 2 { var v interface{} k := keysAndValues[i] @@ -153,13 +164,17 @@ func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) { } else { v = missingValue } - KVFormat(b, k, v) + f.KVFormat(b, k, v) } } +func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) { + Formatter{}.KVListFormat(b, keysAndValues...) +} + // KVFormat serializes one key/value pair into the provided buffer. // A space gets inserted before the pair. -func KVFormat(b *bytes.Buffer, k, v interface{}) { +func (f Formatter) KVFormat(b *bytes.Buffer, k, v interface{}) { b.WriteByte(' ') // Keys are assumed to be well-formed according to // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/migration-to-structured-logging.md#name-arguments @@ -182,11 +197,11 @@ func KVFormat(b *bytes.Buffer, k, v interface{}) { case textWriter: writeTextWriterValue(b, v) case fmt.Stringer: - writeStringValue(b, true, StringerToString(v)) + writeStringValue(b, StringerToString(v)) case string: - writeStringValue(b, true, v) + writeStringValue(b, v) case error: - writeStringValue(b, true, ErrorToString(v)) + writeStringValue(b, ErrorToString(v)) case logr.Marshaler: value := MarshalerToValue(v) // A marshaler that returns a string is useful for @@ -201,9 +216,9 @@ func KVFormat(b *bytes.Buffer, k, v interface{}) { // value directly. switch value := value.(type) { case string: - writeStringValue(b, true, value) + writeStringValue(b, value) default: - writeStringValue(b, false, fmt.Sprintf("%+v", value)) + f.formatAny(b, value) } case []byte: // In https://github.com/kubernetes/klog/pull/237 it was decided @@ -220,10 +235,35 @@ func KVFormat(b *bytes.Buffer, k, v interface{}) { b.WriteByte('=') b.WriteString(fmt.Sprintf("%+q", v)) default: - writeStringValue(b, false, fmt.Sprintf("%+v", v)) + f.formatAny(b, v) } } +func KVFormat(b *bytes.Buffer, k, v interface{}) { + Formatter{}.KVFormat(b, k, v) +} + +// formatAny is the fallback formatter for a value. It supports a hook (for +// example, for YAML encoding) and itself uses JSON encoding. +func (f Formatter) formatAny(b *bytes.Buffer, v interface{}) { + b.WriteRune('=') + if f.AnyToStringHook != nil { + b.WriteString(f.AnyToStringHook(v)) + return + } + encoder := json.NewEncoder(b) + l := b.Len() + if err := encoder.Encode(v); err != nil { + // This shouldn't happen. We discard whatever the encoder + // wrote and instead dump an error string. + b.Truncate(l) + b.WriteString(fmt.Sprintf(`"<internal error: %v>"`, err)) + return + } + // Remove trailing newline. + b.Truncate(b.Len() - 1) +} + // StringerToString converts a Stringer to a string, // handling panics if they occur. func StringerToString(s fmt.Stringer) (ret string) { @@ -261,7 +301,7 @@ func ErrorToString(err error) (ret string) { } func writeTextWriterValue(b *bytes.Buffer, v textWriter) { - b.WriteRune('=') + b.WriteByte('=') defer func() { if err := recover(); err != nil { fmt.Fprintf(b, `"<panic: %s>"`, err) @@ -270,18 +310,13 @@ func writeTextWriterValue(b *bytes.Buffer, v textWriter) { v.WriteText(b) } -func writeStringValue(b *bytes.Buffer, quote bool, v string) { +func writeStringValue(b *bytes.Buffer, v string) { data := []byte(v) index := bytes.IndexByte(data, '\n') if index == -1 { b.WriteByte('=') - if quote { - // Simple string, quote quotation marks and non-printable characters. - b.WriteString(strconv.Quote(v)) - return - } - // Non-string with no line breaks. - b.WriteString(v) + // Simple string, quote quotation marks and non-printable characters. + b.WriteString(strconv.Quote(v)) return } diff --git a/vendor/k8s.io/klog/v2/k8s_references.go b/vendor/k8s.io/klog/v2/k8s_references.go index ecd3f8b690..786af74bfd 100644 --- a/vendor/k8s.io/klog/v2/k8s_references.go +++ b/vendor/k8s.io/klog/v2/k8s_references.go @@ -178,14 +178,14 @@ func (ks kobjSlice) process() (objs []interface{}, err string) { return objectRefs, "" } -var nilToken = []byte("<nil>") +var nilToken = []byte("null") func (ks kobjSlice) WriteText(out *bytes.Buffer) { s := reflect.ValueOf(ks.arg) switch s.Kind() { case reflect.Invalid: - // nil parameter, print as empty slice. - out.WriteString("[]") + // nil parameter, print as null. + out.Write(nilToken) return case reflect.Slice: // Okay, handle below. @@ -197,15 +197,15 @@ func (ks kobjSlice) WriteText(out *bytes.Buffer) { defer out.Write([]byte{']'}) for i := 0; i < s.Len(); i++ { if i > 0 { - out.Write([]byte{' '}) + out.Write([]byte{','}) } item := s.Index(i).Interface() if item == nil { out.Write(nilToken) } else if v, ok := item.(KMetadata); ok { - KObj(v).writeUnquoted(out) + KObj(v).WriteText(out) } else { - fmt.Fprintf(out, "<KObjSlice needs a slice of values implementing KMetadata, got type %T>", item) + fmt.Fprintf(out, `"<KObjSlice needs a slice of values implementing KMetadata, got type %T>"`, item) return } } diff --git a/vendor/k8s.io/klog/v2/klog.go b/vendor/k8s.io/klog/v2/klog.go index c5d98ad38c..152f8a6bd6 100644 --- a/vendor/k8s.io/klog/v2/klog.go +++ b/vendor/k8s.io/klog/v2/klog.go @@ -91,8 +91,6 @@ import ( "sync/atomic" "time" - "github.com/go-logr/logr" - "k8s.io/klog/v2/internal/buffer" "k8s.io/klog/v2/internal/clock" "k8s.io/klog/v2/internal/dbg" @@ -453,7 +451,7 @@ type settings struct { // logger is the global Logger chosen by users of klog, nil if // none is available. - logger *Logger + logger *logWriter // loggerOptions contains the options that were supplied for // globalLogger. @@ -525,6 +523,11 @@ func (s settings) deepCopy() settings { } s.vmodule.filter = filter + if s.logger != nil { + logger := *s.logger + s.logger = &logger + } + return s } @@ -668,15 +671,16 @@ func (l *loggingT) formatHeader(s severity.Severity, file string, line int) *buf return buf } -func (l *loggingT) println(s severity.Severity, logger *logr.Logger, filter LogFilter, args ...interface{}) { +func (l *loggingT) println(s severity.Severity, logger *logWriter, filter LogFilter, args ...interface{}) { l.printlnDepth(s, logger, filter, 1, args...) } -func (l *loggingT) printlnDepth(s severity.Severity, logger *logr.Logger, filter LogFilter, depth int, args ...interface{}) { +func (l *loggingT) printlnDepth(s severity.Severity, logger *logWriter, filter LogFilter, depth int, args ...interface{}) { buf, file, line := l.header(s, depth) - // if logger is set, we clear the generated header as we rely on the backing - // logger implementation to print headers - if logger != nil { + // If a logger is set and doesn't support writing a formatted buffer, + // we clear the generated header as we rely on the backing + // logger implementation to print headers. + if logger != nil && logger.writeKlogBuffer == nil { buffer.PutBuffer(buf) buf = buffer.GetBuffer() } @@ -687,15 +691,16 @@ func (l *loggingT) printlnDepth(s severity.Severity, logger *logr.Logger, filter l.output(s, logger, buf, depth, file, line, false) } -func (l *loggingT) print(s severity.Severity, logger *logr.Logger, filter LogFilter, args ...interface{}) { +func (l *loggingT) print(s severity.Severity, logger *logWriter, filter LogFilter, args ...interface{}) { l.printDepth(s, logger, filter, 1, args...) } -func (l *loggingT) printDepth(s severity.Severity, logger *logr.Logger, filter LogFilter, depth int, args ...interface{}) { +func (l *loggingT) printDepth(s severity.Severity, logger *logWriter, filter LogFilter, depth int, args ...interface{}) { buf, file, line := l.header(s, depth) - // if logr is set, we clear the generated header as we rely on the backing - // logr implementation to print headers - if logger != nil { + // If a logger is set and doesn't support writing a formatted buffer, + // we clear the generated header as we rely on the backing + // logger implementation to print headers. + if logger != nil && logger.writeKlogBuffer == nil { buffer.PutBuffer(buf) buf = buffer.GetBuffer() } @@ -709,15 +714,16 @@ func (l *loggingT) printDepth(s severity.Severity, logger *logr.Logger, filter L l.output(s, logger, buf, depth, file, line, false) } -func (l *loggingT) printf(s severity.Severity, logger *logr.Logger, filter LogFilter, format string, args ...interface{}) { +func (l *loggingT) printf(s severity.Severity, logger *logWriter, filter LogFilter, format string, args ...interface{}) { l.printfDepth(s, logger, filter, 1, format, args...) } -func (l *loggingT) printfDepth(s severity.Severity, logger *logr.Logger, filter LogFilter, depth int, format string, args ...interface{}) { +func (l *loggingT) printfDepth(s severity.Severity, logger *logWriter, filter LogFilter, depth int, format string, args ...interface{}) { buf, file, line := l.header(s, depth) - // if logr is set, we clear the generated header as we rely on the backing - // logr implementation to print headers - if logger != nil { + // If a logger is set and doesn't support writing a formatted buffer, + // we clear the generated header as we rely on the backing + // logger implementation to print headers. + if logger != nil && logger.writeKlogBuffer == nil { buffer.PutBuffer(buf) buf = buffer.GetBuffer() } @@ -734,11 +740,12 @@ func (l *loggingT) printfDepth(s severity.Severity, logger *logr.Logger, filter // printWithFileLine behaves like print but uses the provided file and line number. If // alsoLogToStderr is true, the log message always appears on standard error; it // will also appear in the log file unless --logtostderr is set. -func (l *loggingT) printWithFileLine(s severity.Severity, logger *logr.Logger, filter LogFilter, file string, line int, alsoToStderr bool, args ...interface{}) { +func (l *loggingT) printWithFileLine(s severity.Severity, logger *logWriter, filter LogFilter, file string, line int, alsoToStderr bool, args ...interface{}) { buf := l.formatHeader(s, file, line) - // if logr is set, we clear the generated header as we rely on the backing - // logr implementation to print headers - if logger != nil { + // If a logger is set and doesn't support writing a formatted buffer, + // we clear the generated header as we rely on the backing + // logger implementation to print headers. + if logger != nil && logger.writeKlogBuffer == nil { buffer.PutBuffer(buf) buf = buffer.GetBuffer() } @@ -753,7 +760,7 @@ func (l *loggingT) printWithFileLine(s severity.Severity, logger *logr.Logger, f } // if loggr is specified, will call loggr.Error, otherwise output with logging module. -func (l *loggingT) errorS(err error, logger *logr.Logger, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) { +func (l *loggingT) errorS(err error, logger *logWriter, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) { if filter != nil { msg, keysAndValues = filter.FilterS(msg, keysAndValues) } @@ -765,7 +772,7 @@ func (l *loggingT) errorS(err error, logger *logr.Logger, filter LogFilter, dept } // if loggr is specified, will call loggr.Info, otherwise output with logging module. -func (l *loggingT) infoS(logger *logr.Logger, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) { +func (l *loggingT) infoS(logger *logWriter, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) { if filter != nil { msg, keysAndValues = filter.FilterS(msg, keysAndValues) } @@ -846,7 +853,7 @@ func LogToStderr(stderr bool) { } // output writes the data to the log files and releases the buffer. -func (l *loggingT) output(s severity.Severity, log *logr.Logger, buf *buffer.Buffer, depth int, file string, line int, alsoToStderr bool) { +func (l *loggingT) output(s severity.Severity, logger *logWriter, buf *buffer.Buffer, depth int, file string, line int, alsoToStderr bool) { var isLocked = true l.mu.Lock() defer func() { @@ -862,13 +869,17 @@ func (l *loggingT) output(s severity.Severity, log *logr.Logger, buf *buffer.Buf } } data := buf.Bytes() - if log != nil { - // TODO: set 'severity' and caller information as structured log info - // keysAndValues := []interface{}{"severity", severityName[s], "file", file, "line", line} - if s == severity.ErrorLog { - logging.logger.WithCallDepth(depth+3).Error(nil, string(data)) + if logger != nil { + if logger.writeKlogBuffer != nil { + logger.writeKlogBuffer(data) } else { - log.WithCallDepth(depth + 3).Info(string(data)) + // TODO: set 'severity' and caller information as structured log info + // keysAndValues := []interface{}{"severity", severityName[s], "file", file, "line", line} + if s == severity.ErrorLog { + logger.WithCallDepth(depth+3).Error(nil, string(data)) + } else { + logger.WithCallDepth(depth + 3).Info(string(data)) + } } } else if l.toStderr { os.Stderr.Write(data) @@ -1217,6 +1228,19 @@ func CopyStandardLogTo(name string) { stdLog.SetOutput(logBridge(sev)) } +// NewStandardLogger returns a Logger that writes to the klog logs for the +// named and lower severities. +// +// Valid names are "INFO", "WARNING", "ERROR", and "FATAL". If the name is not +// recognized, NewStandardLogger panics. +func NewStandardLogger(name string) *stdLog.Logger { + sev, ok := severity.ByName(name) + if !ok { + panic(fmt.Sprintf("klog.NewStandardLogger(%q): unknown severity", name)) + } + return stdLog.New(logBridge(sev), "", stdLog.Lshortfile) +} + // logBridge provides the Write method that enables CopyStandardLogTo to connect // Go's standard logs to the logs provided by this package. type logBridge severity.Severity @@ -1277,7 +1301,7 @@ func (l *loggingT) setV(pc uintptr) Level { // See the documentation of V for more information. type Verbose struct { enabled bool - logr *logr.Logger + logger *logWriter } func newVerbose(level Level, b bool) Verbose { @@ -1285,7 +1309,7 @@ func newVerbose(level Level, b bool) Verbose { return Verbose{b, nil} } v := logging.logger.V(int(level)) - return Verbose{b, &v} + return Verbose{b, &logWriter{Logger: v, writeKlogBuffer: logging.loggerOptions.writeKlogBuffer}} } // V reports whether verbosity at the call site is at least the requested level. @@ -1359,7 +1383,7 @@ func (v Verbose) Enabled() bool { // See the documentation of V for usage. func (v Verbose) Info(args ...interface{}) { if v.enabled { - logging.print(severity.InfoLog, v.logr, logging.filter, args...) + logging.print(severity.InfoLog, v.logger, logging.filter, args...) } } @@ -1367,7 +1391,7 @@ func (v Verbose) Info(args ...interface{}) { // See the documentation of V for usage. func (v Verbose) InfoDepth(depth int, args ...interface{}) { if v.enabled { - logging.printDepth(severity.InfoLog, v.logr, logging.filter, depth, args...) + logging.printDepth(severity.InfoLog, v.logger, logging.filter, depth, args...) } } @@ -1375,7 +1399,7 @@ func (v Verbose) InfoDepth(depth int, args ...interface{}) { // See the documentation of V for usage. func (v Verbose) Infoln(args ...interface{}) { if v.enabled { - logging.println(severity.InfoLog, v.logr, logging.filter, args...) + logging.println(severity.InfoLog, v.logger, logging.filter, args...) } } @@ -1383,7 +1407,7 @@ func (v Verbose) Infoln(args ...interface{}) { // See the documentation of V for usage. func (v Verbose) InfolnDepth(depth int, args ...interface{}) { if v.enabled { - logging.printlnDepth(severity.InfoLog, v.logr, logging.filter, depth, args...) + logging.printlnDepth(severity.InfoLog, v.logger, logging.filter, depth, args...) } } @@ -1391,7 +1415,7 @@ func (v Verbose) InfolnDepth(depth int, args ...interface{}) { // See the documentation of V for usage. func (v Verbose) Infof(format string, args ...interface{}) { if v.enabled { - logging.printf(severity.InfoLog, v.logr, logging.filter, format, args...) + logging.printf(severity.InfoLog, v.logger, logging.filter, format, args...) } } @@ -1399,7 +1423,7 @@ func (v Verbose) Infof(format string, args ...interface{}) { // See the documentation of V for usage. func (v Verbose) InfofDepth(depth int, format string, args ...interface{}) { if v.enabled { - logging.printfDepth(severity.InfoLog, v.logr, logging.filter, depth, format, args...) + logging.printfDepth(severity.InfoLog, v.logger, logging.filter, depth, format, args...) } } @@ -1407,7 +1431,7 @@ func (v Verbose) InfofDepth(depth int, format string, args ...interface{}) { // See the documentation of V for usage. func (v Verbose) InfoS(msg string, keysAndValues ...interface{}) { if v.enabled { - logging.infoS(v.logr, logging.filter, 0, msg, keysAndValues...) + logging.infoS(v.logger, logging.filter, 0, msg, keysAndValues...) } } @@ -1421,14 +1445,14 @@ func InfoSDepth(depth int, msg string, keysAndValues ...interface{}) { // See the documentation of V for usage. func (v Verbose) InfoSDepth(depth int, msg string, keysAndValues ...interface{}) { if v.enabled { - logging.infoS(v.logr, logging.filter, depth, msg, keysAndValues...) + logging.infoS(v.logger, logging.filter, depth, msg, keysAndValues...) } } // Deprecated: Use ErrorS instead. func (v Verbose) Error(err error, msg string, args ...interface{}) { if v.enabled { - logging.errorS(err, v.logr, logging.filter, 0, msg, args...) + logging.errorS(err, v.logger, logging.filter, 0, msg, args...) } } @@ -1436,7 +1460,7 @@ func (v Verbose) Error(err error, msg string, args ...interface{}) { // See the documentation of V for usage. func (v Verbose) ErrorS(err error, msg string, keysAndValues ...interface{}) { if v.enabled { - logging.errorS(err, v.logr, logging.filter, 0, msg, keysAndValues...) + logging.errorS(err, v.logger, logging.filter, 0, msg, keysAndValues...) } } diff --git a/vendor/k8s.io/kube-openapi/pkg/cached/cache.go b/vendor/k8s.io/kube-openapi/pkg/cached/cache.go new file mode 100644 index 0000000000..16e34853af --- /dev/null +++ b/vendor/k8s.io/kube-openapi/pkg/cached/cache.go @@ -0,0 +1,264 @@ +/* +Copyright 2022 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 cache provides a cache mechanism based on etags to lazily +// build, and/or cache results from expensive operation such that those +// operations are not repeated unnecessarily. The operations can be +// created as a tree, and replaced dynamically as needed. +// +// # Dependencies and types of caches +// +// This package uses a source/transform/sink model of caches to build +// the dependency tree, and can be used as follows: +// - [NewSource]: A source cache that recomputes the content every time. +// - [NewStaticSource]: A source cache that always produces the +// same content, it is only called once. +// - [NewTransformer]: A cache that transforms data from one format to +// another. It's only refreshed when the source changes. +// - [NewMerger]: A cache that aggregates multiple caches into one. +// It's only refreshed when the source changes. +// - [Replaceable]: A cache adapter that can be atomically +// replaced with a new one, and saves the previous results in case an +// error pops-up. +// +// # Atomicity +// +// Most of the operations are not atomic/thread-safe, except for +// [Replaceable.Replace] which can be performed while the objects +// are being read. +// +// # Etags +// +// Etags in this library is a cache version identifier. It doesn't +// necessarily strictly match to the semantics of http `etags`, but are +// somewhat inspired from it and function with the same principles. +// Hashing the content is a good way to guarantee that your function is +// never going to be called spuriously. In Kubernetes world, this could +// be a `resourceVersion`, this can be an actual etag, a hash, a UUID +// (if the cache always changes), or even a made-up string when the +// content of the cache never changes. +package cached + +import ( + "fmt" + "sync/atomic" +) + +// Result is the content returned from a call to a cache. It can either +// be created with [NewResultOK] if the call was a success, or +// [NewResultErr] if the call resulted in an error. +type Result[T any] struct { + Data T + Etag string + Err error +} + +// NewResultOK creates a new [Result] for a successful operation. +func NewResultOK[T any](data T, etag string) Result[T] { + return Result[T]{ + Data: data, + Etag: etag, + } +} + +// NewResultErr creates a new [Result] when an error has happened. +func NewResultErr[T any](err error) Result[T] { + return Result[T]{ + Err: err, + } +} + +// Result can be treated as a [Data] if necessary. +func (r Result[T]) Get() Result[T] { + return r +} + +// Data is a cache that performs an action whose result data will be +// cached. It also returns an "etag" identifier to version the cache, so +// that the caller can know if they have the most recent version of the +// cache (and can decide to cache some operation based on that). +// +// The [NewMerger] and [NewTransformer] automatically handle +// that for you by checking if the etag is updated before calling the +// merging or transforming function. +type Data[T any] interface { + // Returns the cached data, as well as an "etag" to identify the + // version of the cache, or an error if something happened. + Get() Result[T] +} + +// T is the source type, V is the destination type. +type merger[K comparable, T, V any] struct { + mergeFn func(map[K]Result[T]) Result[V] + caches map[K]Data[T] + cacheResults map[K]Result[T] + result Result[V] +} + +// NewMerger creates a new merge cache, a cache that merges the result +// of other caches. The function only gets called if any of the +// dependency has changed. +// +// If any of the dependency returned an error before, or any of the +// dependency returned an error this time, or if the mergeFn failed +// before, then the function is reran. +// +// The caches and results are mapped by K so that associated data can be +// retrieved. The map of dependencies can not be modified after +// creation, and a new merger should be created (and probably replaced +// using a [Replaceable]). +// +// Note that this assumes there is no "partial" merge, the merge +// function will remerge all the dependencies together everytime. Since +// the list of dependencies is constant, there is no way to save some +// partial merge information either. +func NewMerger[K comparable, T, V any](mergeFn func(results map[K]Result[T]) Result[V], caches map[K]Data[T]) Data[V] { + return &merger[K, T, V]{ + mergeFn: mergeFn, + caches: caches, + } +} + +func (c *merger[K, T, V]) prepareResults() map[K]Result[T] { + cacheResults := make(map[K]Result[T], len(c.caches)) + for key, cache := range c.caches { + cacheResults[key] = cache.Get() + } + return cacheResults +} + +// Rerun if: +// - The last run resulted in an error +// - Any of the dependency previously returned an error +// - Any of the dependency just returned an error +// - Any of the dependency's etag changed +func (c *merger[K, T, V]) needsRunning(results map[K]Result[T]) bool { + if c.cacheResults == nil { + return true + } + if c.result.Err != nil { + return true + } + if len(results) != len(c.cacheResults) { + panic(fmt.Errorf("invalid number of results: %v (expected %v)", len(results), len(c.cacheResults))) + } + for key, oldResult := range c.cacheResults { + newResult, ok := results[key] + if !ok { + panic(fmt.Errorf("unknown cache entry: %v", key)) + } + + if newResult.Etag != oldResult.Etag || newResult.Err != nil || oldResult.Err != nil { + return true + } + } + return false +} + +func (c *merger[K, T, V]) Get() Result[V] { + cacheResults := c.prepareResults() + if c.needsRunning(cacheResults) { + c.cacheResults = cacheResults + c.result = c.mergeFn(c.cacheResults) + } + return c.result +} + +type transformerCacheKeyType struct{} + +// NewTransformer creates a new cache that transforms the result of +// another cache. The transformFn will only be called if the source +// cache has updated the output, otherwise, the cached result will be +// returned. +// +// If the dependency returned an error before, or it returns an error +// this time, or if the transformerFn failed before, the function is +// reran. +func NewTransformer[T, V any](transformerFn func(Result[T]) Result[V], source Data[T]) Data[V] { + return NewMerger(func(caches map[transformerCacheKeyType]Result[T]) Result[V] { + cache, ok := caches[transformerCacheKeyType{}] + if len(caches) != 1 || !ok { + panic(fmt.Errorf("invalid cache for transformer cache: %v", caches)) + } + return transformerFn(cache) + }, map[transformerCacheKeyType]Data[T]{ + {}: source, + }) +} + +// NewSource creates a new cache that generates some data. This +// will always be called since we don't know the origin of the data and +// if it needs to be updated or not. +func NewSource[T any](sourceFn func() Result[T]) Data[T] { + c := source[T](sourceFn) + return &c +} + +type source[T any] func() Result[T] + +func (c *source[T]) Get() Result[T] { + return (*c)() +} + +// NewStaticSource creates a new cache that always generates the +// same data. This will only be called once (lazily). +func NewStaticSource[T any](staticFn func() Result[T]) Data[T] { + return &static[T]{ + fn: staticFn, + } +} + +type static[T any] struct { + fn func() Result[T] + result *Result[T] +} + +func (c *static[T]) Get() Result[T] { + if c.result == nil { + result := c.fn() + c.result = &result + } + return *c.result +} + +// Replaceable is a cache that carries the result even when the +// cache is replaced. The cache can be replaced atomically (without any +// lock held). This is the type that should typically be stored in +// structs. +type Replaceable[T any] struct { + cache atomic.Pointer[Data[T]] + result *Result[T] +} + +// Get retrieves the data from the underlying source. [Replaceable] +// implements the [Data] interface itself. This is a pass-through +// that calls the most recent underlying cache. If the cache fails but +// previously had returned a success, that success will be returned +// instead. If the cache fails but we never returned a success, that +// failure is returned. +func (c *Replaceable[T]) Get() Result[T] { + result := (*c.cache.Load()).Get() + if result.Err != nil && c.result != nil && c.result.Err == nil { + return *c.result + } + c.result = &result + return *c.result +} + +// Replace changes the cache in a thread-safe way. +func (c *Replaceable[T]) Replace(cache Data[T]) { + c.cache.Swap(&cache) +} diff --git a/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go b/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go index e8fbcd1d37..66b7a68da6 100644 --- a/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go +++ b/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go @@ -24,7 +24,6 @@ import ( "net/http" "net/url" "path" - "sort" "strconv" "strings" "sync" @@ -32,16 +31,18 @@ import ( "github.com/golang/protobuf/proto" openapi_v3 "github.com/google/gnostic/openapiv3" + "github.com/google/uuid" "github.com/munnerz/goautoneg" + "k8s.io/klog/v2" + "k8s.io/kube-openapi/pkg/cached" "k8s.io/kube-openapi/pkg/common" - "k8s.io/kube-openapi/pkg/internal/handler" "k8s.io/kube-openapi/pkg/spec3" - "k8s.io/kube-openapi/pkg/validation/spec" ) const ( - subTypeProtobuf = "com.github.proto-openapi.spec.v3@v1.0+protobuf" - subTypeJSON = "json" + subTypeProtobufDeprecated = "com.github.proto-openapi.spec.v3@v1.0+protobuf" + subTypeProtobuf = "com.github.proto-openapi.spec.v3.v1.0+protobuf" + subTypeJSON = "json" ) // OpenAPIV3Discovery is the format of the Discovery document for OpenAPI V3 @@ -57,23 +58,63 @@ type OpenAPIV3DiscoveryGroupVersion struct { ServerRelativeURL string `json:"serverRelativeURL"` } -// OpenAPIService is the service responsible for serving OpenAPI spec. It has -// the ability to safely change the spec while serving it. -type OpenAPIService struct { - // rwMutex protects All members of this service. - rwMutex sync.RWMutex +func ToV3ProtoBinary(json []byte) ([]byte, error) { + document, err := openapi_v3.ParseDocument(json) + if err != nil { + return nil, err + } + return proto.Marshal(document) +} + +type timedSpec struct { + spec []byte lastModified time.Time - v3Schema map[string]*OpenAPIV3Group } -type OpenAPIV3Group struct { - rwMutex sync.RWMutex +// This type is protected by the lock on OpenAPIService. +type openAPIV3Group struct { + specCache cached.Replaceable[*spec3.OpenAPI] + pbCache cached.Data[timedSpec] + jsonCache cached.Data[timedSpec] +} - lastModified time.Time +func newOpenAPIV3Group() *openAPIV3Group { + o := &openAPIV3Group{} + o.jsonCache = cached.NewTransformer[*spec3.OpenAPI](func(result cached.Result[*spec3.OpenAPI]) cached.Result[timedSpec] { + if result.Err != nil { + return cached.NewResultErr[timedSpec](result.Err) + } + json, err := json.Marshal(result.Data) + if err != nil { + return cached.NewResultErr[timedSpec](err) + } + return cached.NewResultOK(timedSpec{spec: json, lastModified: time.Now()}, computeETag(json)) + }, &o.specCache) + o.pbCache = cached.NewTransformer(func(result cached.Result[timedSpec]) cached.Result[timedSpec] { + if result.Err != nil { + return cached.NewResultErr[timedSpec](result.Err) + } + proto, err := ToV3ProtoBinary(result.Data.spec) + if err != nil { + return cached.NewResultErr[timedSpec](err) + } + return cached.NewResultOK(timedSpec{spec: proto, lastModified: result.Data.lastModified}, result.Etag) + }, o.jsonCache) + return o +} - pbCache handler.HandlerCache - jsonCache handler.HandlerCache - etagCache handler.HandlerCache +func (o *openAPIV3Group) UpdateSpec(openapi cached.Data[*spec3.OpenAPI]) { + o.specCache.Replace(openapi) +} + +// OpenAPIService is the service responsible for serving OpenAPI spec. It has +// the ability to safely change the spec while serving it. +type OpenAPIService struct { + // Mutex protects the schema map. + mutex sync.Mutex + v3Schema map[string]*openAPIV3Group + + discoveryCache cached.Replaceable[timedSpec] } func computeETag(data []byte) string { @@ -92,94 +133,90 @@ func constructServerRelativeURL(gvString, etag string) string { } // NewOpenAPIService builds an OpenAPIService starting with the given spec. -func NewOpenAPIService(spec *spec.Swagger) (*OpenAPIService, error) { +func NewOpenAPIService() *OpenAPIService { o := &OpenAPIService{} - o.v3Schema = make(map[string]*OpenAPIV3Group) - return o, nil + o.v3Schema = make(map[string]*openAPIV3Group) + // We're not locked because we haven't shared the structure yet. + o.discoveryCache.Replace(o.buildDiscoveryCacheLocked()) + return o } -func (o *OpenAPIService) getGroupBytes() ([]byte, error) { - o.rwMutex.RLock() - defer o.rwMutex.RUnlock() - keys := make([]string, len(o.v3Schema)) - i := 0 - for k := range o.v3Schema { - keys[i] = k - i++ +func (o *OpenAPIService) buildDiscoveryCacheLocked() cached.Data[timedSpec] { + caches := make(map[string]cached.Data[timedSpec], len(o.v3Schema)) + for gvName, group := range o.v3Schema { + caches[gvName] = group.jsonCache } - - sort.Strings(keys) - discovery := &OpenAPIV3Discovery{Paths: make(map[string]OpenAPIV3DiscoveryGroupVersion)} - for gvString, groupVersion := range o.v3Schema { - etagBytes, err := groupVersion.etagCache.Get() - if err != nil { - return nil, err + return cached.NewMerger(func(results map[string]cached.Result[timedSpec]) cached.Result[timedSpec] { + discovery := &OpenAPIV3Discovery{Paths: make(map[string]OpenAPIV3DiscoveryGroupVersion)} + for gvName, result := range results { + if result.Err != nil { + return cached.NewResultErr[timedSpec](result.Err) + } + discovery.Paths[gvName] = OpenAPIV3DiscoveryGroupVersion{ + ServerRelativeURL: constructServerRelativeURL(gvName, result.Etag), + } } - discovery.Paths[gvString] = OpenAPIV3DiscoveryGroupVersion{ - ServerRelativeURL: constructServerRelativeURL(gvString, string(etagBytes)), + j, err := json.Marshal(discovery) + if err != nil { + return cached.NewResultErr[timedSpec](err) } - } - j, err := json.Marshal(discovery) - if err != nil { - return nil, err - } - return j, nil + return cached.NewResultOK(timedSpec{spec: j, lastModified: time.Now()}, computeETag(j)) + }, caches) } func (o *OpenAPIService) getSingleGroupBytes(getType string, group string) ([]byte, string, time.Time, error) { - o.rwMutex.RLock() - defer o.rwMutex.RUnlock() + o.mutex.Lock() + defer o.mutex.Unlock() v, ok := o.v3Schema[group] if !ok { return nil, "", time.Now(), fmt.Errorf("Cannot find CRD group %s", group) } - if getType == subTypeJSON { - specBytes, err := v.jsonCache.Get() - if err != nil { - return nil, "", v.lastModified, err - } - etagBytes, err := v.etagCache.Get() - return specBytes, string(etagBytes), v.lastModified, err - } else if getType == subTypeProtobuf { - specPb, err := v.pbCache.Get() - if err != nil { - return nil, "", v.lastModified, err - } - etagBytes, err := v.etagCache.Get() - return specPb, string(etagBytes), v.lastModified, err + result := cached.Result[timedSpec]{} + switch getType { + case subTypeJSON: + result = v.jsonCache.Get() + case subTypeProtobuf, subTypeProtobufDeprecated: + result = v.pbCache.Get() + default: + return nil, "", time.Now(), fmt.Errorf("Invalid accept clause %s", getType) } - return nil, "", time.Now(), fmt.Errorf("Invalid accept clause %s", getType) + return result.Data.spec, result.Etag, result.Data.lastModified, result.Err } -func (o *OpenAPIService) UpdateGroupVersion(group string, openapi *spec3.OpenAPI) (err error) { - o.rwMutex.Lock() - defer o.rwMutex.Unlock() - +// UpdateGroupVersionLazy adds or updates an existing group with the new cached. +func (o *OpenAPIService) UpdateGroupVersionLazy(group string, openapi cached.Data[*spec3.OpenAPI]) { + o.mutex.Lock() + defer o.mutex.Unlock() if _, ok := o.v3Schema[group]; !ok { - o.v3Schema[group] = &OpenAPIV3Group{} + o.v3Schema[group] = newOpenAPIV3Group() + // Since there is a new item, we need to re-build the cache map. + o.discoveryCache.Replace(o.buildDiscoveryCacheLocked()) } - return o.v3Schema[group].UpdateSpec(openapi) + o.v3Schema[group].UpdateSpec(openapi) } -func (o *OpenAPIService) DeleteGroupVersion(group string) { - o.rwMutex.Lock() - defer o.rwMutex.Unlock() - delete(o.v3Schema, group) +func (o *OpenAPIService) UpdateGroupVersion(group string, openapi *spec3.OpenAPI) { + o.UpdateGroupVersionLazy(group, cached.NewResultOK(openapi, uuid.New().String())) } -func ToV3ProtoBinary(json []byte) ([]byte, error) { - document, err := openapi_v3.ParseDocument(json) - if err != nil { - return nil, err - } - return proto.Marshal(document) +func (o *OpenAPIService) DeleteGroupVersion(group string) { + o.mutex.Lock() + defer o.mutex.Unlock() + delete(o.v3Schema, group) + // Rebuild the merge cache map since the items have changed. + o.discoveryCache.Replace(o.buildDiscoveryCacheLocked()) } func (o *OpenAPIService) HandleDiscovery(w http.ResponseWriter, r *http.Request) { - data, _ := o.getGroupBytes() - w.Header().Set("Etag", strconv.Quote(computeETag(data))) + result := o.discoveryCache.Get() + if result.Err != nil { + klog.Errorf("Error serving discovery: %s", result.Err) + w.WriteHeader(http.StatusInternalServerError) + return + } + w.Header().Set("Etag", strconv.Quote(result.Etag)) w.Header().Set("Content-Type", "application/json") - http.ServeContent(w, r, "/openapi/v3", time.Now(), bytes.NewReader(data)) + http.ServeContent(w, r, "/openapi/v3", result.Data.lastModified, bytes.NewReader(result.Data.spec)) } func (o *OpenAPIService) HandleGroupVersion(w http.ResponseWriter, r *http.Request) { @@ -198,11 +235,13 @@ func (o *OpenAPIService) HandleGroupVersion(w http.ResponseWriter, r *http.Reque } accepted := []struct { - Type string - SubType string + Type string + SubType string + ReturnedContentType string }{ - {"application", subTypeJSON}, - {"application", subTypeProtobuf}, + {"application", subTypeJSON, "application/" + subTypeJSON}, + {"application", subTypeProtobuf, "application/" + subTypeProtobuf}, + {"application", subTypeProtobufDeprecated, "application/" + subTypeProtobuf}, } for _, clause := range clauses { @@ -217,6 +256,9 @@ func (o *OpenAPIService) HandleGroupVersion(w http.ResponseWriter, r *http.Reque if err != nil { return } + // Set Content-Type header in the reponse + w.Header().Set("Content-Type", accepts.ReturnedContentType) + // ETag must be enclosed in double quotes: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag w.Header().Set("Etag", strconv.Quote(etag)) @@ -250,30 +292,3 @@ func (o *OpenAPIService) RegisterOpenAPIV3VersionedService(servePath string, han handler.HandlePrefix(servePath+"/", http.HandlerFunc(o.HandleGroupVersion)) return nil } - -func (o *OpenAPIV3Group) UpdateSpec(openapi *spec3.OpenAPI) (err error) { - o.rwMutex.Lock() - defer o.rwMutex.Unlock() - - o.jsonCache = o.jsonCache.New(func() ([]byte, error) { - return json.Marshal(openapi) - }) - o.pbCache = o.pbCache.New(func() ([]byte, error) { - json, err := o.jsonCache.Get() - if err != nil { - return nil, err - } - return ToV3ProtoBinary(json) - }) - // TODO: This forces a json marshal of corresponding group-versions. - // We should look to replace this with a faster hashing mechanism. - o.etagCache = o.etagCache.New(func() ([]byte, error) { - json, err := o.jsonCache.Get() - if err != nil { - return nil, err - } - return []byte(computeETag(json)), nil - }) - o.lastModified = time.Now() - return nil -} diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/flags.go b/vendor/k8s.io/kube-openapi/pkg/internal/flags.go index 3ff3c8d894..bef6037823 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/flags.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/flags.go @@ -18,3 +18,7 @@ package internal // Used by tests to selectively disable experimental JSON unmarshaler var UseOptimizedJSONUnmarshaling bool = true +var UseOptimizedJSONUnmarshalingV3 bool = true + +// Used by tests to selectively disable experimental JSON marshaler +var UseOptimizedJSONMarshaling bool = true diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/handler/handler_cache.go b/vendor/k8s.io/kube-openapi/pkg/internal/handler/handler_cache.go deleted file mode 100644 index e128c26ebe..0000000000 --- a/vendor/k8s.io/kube-openapi/pkg/internal/handler/handler_cache.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2021 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 handler - -import ( - "sync" -) - -// HandlerCache represents a lazy cache for generating a byte array -// It is used to lazily marshal OpenAPI v2/v3 and lazily generate the ETag -type HandlerCache struct { - BuildCache func() ([]byte, error) - once sync.Once - bytes []byte - err error -} - -// Get either returns the cached value or calls BuildCache() once before caching and returning -// its results. If BuildCache returns an error, the last valid value for the cache (from prior -// calls to New()) is used instead if possible. -func (c *HandlerCache) Get() ([]byte, error) { - c.once.Do(func() { - bytes, err := c.BuildCache() - // if there is an error updating the cache, there can be situations where - // c.bytes contains a valid value (carried over from the previous update) - // but c.err is also not nil; the cache user is expected to check for this - c.err = err - if c.err == nil { - // don't override previous spec if we had an error - c.bytes = bytes - } - }) - return c.bytes, c.err -} - -// New creates a new HandlerCache for situations where a cache refresh is needed. -// This function is not thread-safe and should not be called at the same time as Get(). -func (c *HandlerCache) New(cacheBuilder func() ([]byte, error)) HandlerCache { - return HandlerCache{ - bytes: c.bytes, - BuildCache: cacheBuilder, - } -} diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/serialization.go b/vendor/k8s.io/kube-openapi/pkg/internal/serialization.go new file mode 100644 index 0000000000..7393bacf70 --- /dev/null +++ b/vendor/k8s.io/kube-openapi/pkg/internal/serialization.go @@ -0,0 +1,65 @@ +/* +Copyright 2023 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 internal + +import ( + "github.com/go-openapi/jsonreference" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" +) + +// DeterministicMarshal calls the jsonv2 library with the deterministic +// flag in order to have stable marshaling. +func DeterministicMarshal(in any) ([]byte, error) { + return jsonv2.MarshalOptions{Deterministic: true}.Marshal(jsonv2.EncodeOptions{}, in) +} + +// JSONRefFromMap populates a json reference object if the map v contains a $ref key. +func JSONRefFromMap(jsonRef *jsonreference.Ref, v map[string]interface{}) error { + if v == nil { + return nil + } + if vv, ok := v["$ref"]; ok { + if str, ok := vv.(string); ok { + ref, err := jsonreference.New(str) + if err != nil { + return err + } + *jsonRef = ref + } + } + return nil +} + +// SanitizeExtensions sanitizes the input map such that non extension +// keys (non x-*, X-*) keys are dropped from the map. Returns the new +// modified map, or nil if the map is now empty. +func SanitizeExtensions(e map[string]interface{}) map[string]interface{} { + for k := range e { + if !IsExtensionKey(k) { + delete(e, k) + } + } + if len(e) == 0 { + e = nil + } + return e +} + +// IsExtensionKey returns true if the input string is of format x-* or X-* +func IsExtensionKey(k string) bool { + return len(k) > 1 && (k[0] == 'x' || k[0] == 'X') && k[1] == '-' +} diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal.go index febde20f9c..e6c6216ff3 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal.go @@ -34,6 +34,13 @@ type MarshalOptions struct { // unknown JSON object members. DiscardUnknownMembers bool + // Deterministic specifies that the same input value will be serialized + // as the exact same output bytes. Different processes of + // the same program will serialize equal values to the same bytes, + // but different versions of the same program are not guaranteed + // to produce the exact same sequence of bytes. + Deterministic bool + // formatDepth is the depth at which we respect the format flag. formatDepth int // format is custom formatting for the value at the specified depth. diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_any.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_any.go index 204d0648dd..c62b1f3203 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_any.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_any.go @@ -62,7 +62,7 @@ func unmarshalValueAny(uo UnmarshalOptions, dec *Decoder) (any, error) { } return dec.stringCache.make(val), nil case '0': - fv, _ := parseFloat(val, 64) // ignore error since readValue gaurantees val is valid + fv, _ := parseFloat(val, 64) // ignore error since readValue guarantees val is valid return fv, nil default: panic("BUG: invalid kind: " + k.String()) @@ -99,13 +99,32 @@ func marshalObjectAny(mo MarshalOptions, enc *Encoder, obj map[string]any) error if !enc.options.AllowInvalidUTF8 { enc.tokens.last.disableNamespace() } - for name, val := range obj { - if err := enc.WriteToken(String(name)); err != nil { - return err + if !mo.Deterministic || len(obj) <= 1 { + for name, val := range obj { + if err := enc.WriteToken(String(name)); err != nil { + return err + } + if err := marshalValueAny(mo, enc, val); err != nil { + return err + } } - if err := marshalValueAny(mo, enc, val); err != nil { - return err + } else { + names := getStrings(len(obj)) + var i int + for name := range obj { + (*names)[i] = name + i++ + } + names.Sort() + for _, name := range *names { + if err := enc.WriteToken(String(name)); err != nil { + return err + } + if err := marshalValueAny(mo, enc, obj[name]); err != nil { + return err + } } + putStrings(names) } if err := enc.WriteToken(ObjectEnd); err != nil { return err diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_default.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_default.go index fcf3d50000..fd26eba352 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_default.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_default.go @@ -5,6 +5,7 @@ package json import ( + "bytes" "encoding/base32" "encoding/base64" "encoding/hex" @@ -12,6 +13,7 @@ import ( "fmt" "math" "reflect" + "sort" "strconv" "sync" ) @@ -228,13 +230,7 @@ func makeBytesArshaler(t reflect.Type, fncs *arshaler) *arshaler { } } val := enc.UnusedBuffer() - var b []byte - if va.Kind() == reflect.Array { - // TODO(https://go.dev/issue/47066): Avoid reflect.Value.Slice. - b = va.Slice(0, va.Len()).Bytes() - } else { - b = va.Bytes() - } + b := va.Bytes() n := len(`"`) + encodedLen(len(b)) + len(`"`) if cap(val) < n { val = make([]byte, n) @@ -248,19 +244,19 @@ func makeBytesArshaler(t reflect.Type, fncs *arshaler) *arshaler { } unmarshalDefault := fncs.unmarshal fncs.unmarshal = func(uo UnmarshalOptions, dec *Decoder, va addressableValue) error { - decode, decodedLen := decodeBase64, decodedLenBase64 + decode, decodedLen, encodedLen := decodeBase64, decodedLenBase64, encodedLenBase64 if uo.format != "" && uo.formatDepth == dec.tokens.depth() { switch uo.format { case "base64": - decode, decodedLen = decodeBase64, decodedLenBase64 + decode, decodedLen, encodedLen = decodeBase64, decodedLenBase64, encodedLenBase64 case "base64url": - decode, decodedLen = decodeBase64URL, decodedLenBase64URL + decode, decodedLen, encodedLen = decodeBase64URL, decodedLenBase64URL, encodedLenBase64URL case "base32": - decode, decodedLen = decodeBase32, decodedLenBase32 + decode, decodedLen, encodedLen = decodeBase32, decodedLenBase32, encodedLenBase32 case "base32hex": - decode, decodedLen = decodeBase32Hex, decodedLenBase32Hex + decode, decodedLen, encodedLen = decodeBase32Hex, decodedLenBase32Hex, encodedLenBase32Hex case "base16", "hex": - decode, decodedLen = decodeBase16, decodedLenBase16 + decode, decodedLen, encodedLen = decodeBase16, decodedLenBase16, encodedLenBase16 case "array": uo.format = "" return unmarshalDefault(uo, dec, va) @@ -290,23 +286,28 @@ func makeBytesArshaler(t reflect.Type, fncs *arshaler) *arshaler { n-- } n = decodedLen(n) - var b []byte + b := va.Bytes() if va.Kind() == reflect.Array { - // TODO(https://go.dev/issue/47066): Avoid reflect.Value.Slice. - b = va.Slice(0, va.Len()).Bytes() if n != len(b) { err := fmt.Errorf("decoded base64 length of %d mismatches array length of %d", n, len(b)) return &SemanticError{action: "unmarshal", JSONKind: k, GoType: t, Err: err} } } else { - b = va.Bytes() if b == nil || cap(b) < n { b = make([]byte, n) } else { b = b[:n] } } - if _, err := decode(b, val); err != nil { + n2, err := decode(b, val) + if err == nil && len(val) != encodedLen(n2) { + // TODO(https://go.dev/issue/53845): RFC 4648, section 3.3, + // specifies that non-alphabet characters must be rejected. + // Unfortunately, the "base32" and "base64" packages allow + // '\r' and '\n' characters by default. + err = errors.New("illegal data at input byte " + strconv.Itoa(bytes.IndexAny(val, "\r\n"))) + } + if err != nil { return &SemanticError{action: "unmarshal", JSONKind: k, GoType: t, Err: err} } if va.Kind() == reflect.Slice { @@ -412,7 +413,7 @@ func makeUintArshaler(t reflect.Type) *arshaler { return nil } - x := math.Float64frombits(uint64(va.Uint())) + x := math.Float64frombits(va.Uint()) return enc.writeNumber(x, rawUintNumber, mo.StringifyNumbers) } fncs.unmarshal = func(uo UnmarshalOptions, dec *Decoder, va addressableValue) error { @@ -450,7 +451,7 @@ func makeUintArshaler(t reflect.Type) *arshaler { err := fmt.Errorf("cannot parse %q as unsigned integer: %w", val, strconv.ErrRange) return &SemanticError{action: "unmarshal", JSONKind: k, GoType: t, Err: err} } - va.SetUint(uint64(n)) + va.SetUint(n) return nil } return &SemanticError{action: "unmarshal", JSONKind: k, GoType: t} @@ -549,23 +550,9 @@ func makeFloatArshaler(t reflect.Type) *arshaler { return &fncs } -var mapIterPool = sync.Pool{ - New: func() any { return new(reflect.MapIter) }, -} - -func getMapIter(mv reflect.Value) *reflect.MapIter { - iter := mapIterPool.Get().(*reflect.MapIter) - iter.Reset(mv) - return iter -} -func putMapIter(iter *reflect.MapIter) { - iter.Reset(reflect.Value{}) // allow underlying map to be garbage collected - mapIterPool.Put(iter) -} - func makeMapArshaler(t reflect.Type) *arshaler { // NOTE: The logic below disables namespaces for tracking duplicate names - // when handling map keys with a unique represention. + // when handling map keys with a unique representation. // NOTE: Values retrieved from a map are not addressable, // so we shallow copy the values to make them addressable and @@ -641,24 +628,76 @@ func makeMapArshaler(t reflect.Type) *arshaler { enc.tokens.last.disableNamespace() } - // NOTE: Map entries are serialized in a non-deterministic order. - // Users that need stable output should call RawValue.Canonicalize. - // TODO(go1.19): Remove use of a sync.Pool with reflect.MapIter. - // Calling reflect.Value.MapRange no longer allocates. - // See https://go.dev/cl/400675. - iter := getMapIter(va.Value) - defer putMapIter(iter) - for iter.Next() { - k.SetIterKey(iter) - if err := marshalKey(mko, enc, k); err != nil { - // TODO: If err is errMissingName, then wrap it as a - // SemanticError since this key type cannot be serialized - // as a JSON string. - return err + switch { + case !mo.Deterministic || n <= 1: + for iter := va.Value.MapRange(); iter.Next(); { + k.SetIterKey(iter) + if err := marshalKey(mko, enc, k); err != nil { + // TODO: If err is errMissingName, then wrap it as a + // SemanticError since this key type cannot be serialized + // as a JSON string. + return err + } + v.SetIterValue(iter) + if err := marshalVal(mo, enc, v); err != nil { + return err + } } - v.SetIterValue(iter) - if err := marshalVal(mo, enc, v); err != nil { - return err + case !nonDefaultKey && t.Key().Kind() == reflect.String: + names := getStrings(n) + for i, iter := 0, va.Value.MapRange(); i < n && iter.Next(); i++ { + k.SetIterKey(iter) + (*names)[i] = k.String() + } + names.Sort() + for _, name := range *names { + if err := enc.WriteToken(String(name)); err != nil { + return err + } + // TODO(https://go.dev/issue/57061): Use v.SetMapIndexOf. + k.SetString(name) + v.Set(va.MapIndex(k.Value)) + if err := marshalVal(mo, enc, v); err != nil { + return err + } + } + putStrings(names) + default: + type member struct { + name string // unquoted name + key addressableValue + } + members := make([]member, n) + keys := reflect.MakeSlice(reflect.SliceOf(t.Key()), n, n) + for i, iter := 0, va.Value.MapRange(); i < n && iter.Next(); i++ { + // Marshal the member name. + k := addressableValue{keys.Index(i)} // indexed slice element is always addressable + k.SetIterKey(iter) + if err := marshalKey(mko, enc, k); err != nil { + // TODO: If err is errMissingName, then wrap it as a + // SemanticError since this key type cannot be serialized + // as a JSON string. + return err + } + name := enc.unwriteOnlyObjectMemberName() + members[i] = member{name, k} + } + // TODO: If AllowDuplicateNames is enabled, then sort according + // to reflect.Value as well if the names are equal. + // See internal/fmtsort. + // TODO(https://go.dev/issue/47619): Use slices.SortFunc instead. + sort.Slice(members, func(i, j int) bool { + return lessUTF16(members[i].name, members[j].name) + }) + for _, member := range members { + if err := enc.WriteToken(String(member.name)); err != nil { + return err + } + // TODO(https://go.dev/issue/57061): Use v.SetMapIndexOf. + v.Set(va.MapIndex(member.key.Value)) + if err := marshalVal(mo, enc, v); err != nil { + return err + } } } } @@ -856,7 +895,7 @@ func makeStructArshaler(t reflect.Type) *arshaler { // 2. The object namespace is guaranteed to be disabled. // 3. The object name is guaranteed to be valid and pre-escaped. // 4. There is no need to flush the buffer (for unwrite purposes). - // 5. There is no possibility of an error occuring. + // 5. There is no possibility of an error occurring. if optimizeCommon { // Append any delimiters or optional whitespace. if enc.tokens.last.length() > 0 { @@ -996,7 +1035,7 @@ func makeStructArshaler(t reflect.Type) *arshaler { if fields.inlinedFallback == nil { // Skip unknown value since we have no place to store it. - if err := dec.skipValue(); err != nil { + if err := dec.SkipValue(); err != nil { return err } } else { diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_inlined.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_inlined.go index 7476eda301..258a98247d 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_inlined.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_inlined.go @@ -5,6 +5,7 @@ package json import ( + "bytes" "errors" "reflect" ) @@ -89,35 +90,61 @@ func marshalInlinedFallbackAll(mo MarshalOptions, enc *Encoder, va addressableVa } return nil } else { - if v.Len() == 0 { + m := v // must be a map[string]V + n := m.Len() + if n == 0 { return nil } - m := v + mk := newAddressableValue(stringType) mv := newAddressableValue(m.Type().Elem()) - for iter := m.MapRange(); iter.Next(); { - b, err := appendString(enc.UnusedBuffer(), iter.Key().String(), !enc.options.AllowInvalidUTF8, nil) + marshalKey := func(mk addressableValue) error { + b, err := appendString(enc.UnusedBuffer(), mk.String(), !enc.options.AllowInvalidUTF8, nil) if err != nil { return err } if insertUnquotedName != nil { - isVerbatim := consumeSimpleString(b) == len(b) + isVerbatim := bytes.IndexByte(b, '\\') < 0 name := unescapeStringMayCopy(b, isVerbatim) if !insertUnquotedName(name) { return &SyntacticError{str: "duplicate name " + string(b) + " in object"} } } - if err := enc.WriteValue(b); err != nil { - return err + return enc.WriteValue(b) + } + marshalVal := f.fncs.marshal + if mo.Marshalers != nil { + marshalVal, _ = mo.Marshalers.lookup(marshalVal, mv.Type()) + } + if !mo.Deterministic || n <= 1 { + for iter := m.MapRange(); iter.Next(); { + mk.SetIterKey(iter) + if err := marshalKey(mk); err != nil { + return err + } + mv.Set(iter.Value()) + if err := marshalVal(mo, enc, mv); err != nil { + return err + } } - - mv.Set(iter.Value()) - marshal := f.fncs.marshal - if mo.Marshalers != nil { - marshal, _ = mo.Marshalers.lookup(marshal, mv.Type()) + } else { + names := getStrings(n) + for i, iter := 0, m.Value.MapRange(); i < n && iter.Next(); i++ { + mk.SetIterKey(iter) + (*names)[i] = mk.String() } - if err := marshal(mo, enc, mv); err != nil { - return err + names.Sort() + for _, name := range *names { + mk.SetString(name) + if err := marshalKey(mk); err != nil { + return err + } + // TODO(https://go.dev/issue/57061): Use mv.SetMapIndexOf. + mv.Set(m.MapIndex(mk.Value)) + if err := marshalVal(mo, enc, mv); err != nil { + return err + } } + putStrings(names) } return nil } @@ -162,7 +189,7 @@ func unmarshalInlinedFallbackNext(uo UnmarshalOptions, dec *Decoder, va addressa } else { name := string(unquotedName) // TODO: Intern this? - m := v + m := v // must be a map[string]V if m.IsNil() { m.Set(reflect.MakeMap(m.Type())) } diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_methods.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_methods.go index ef4e1f5e3d..20899c868c 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_methods.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_methods.go @@ -21,8 +21,8 @@ var ( ) // MarshalerV1 is implemented by types that can marshal themselves. -// It is recommended that types implement MarshalerV2 unless -// the implementation is trying to avoid a hard dependency on this package. +// It is recommended that types implement MarshalerV2 unless the implementation +// is trying to avoid a hard dependency on the "jsontext" package. // // It is recommended that implementations return a buffer that is safe // for the caller to retain and potentially mutate. diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_time.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_time.go index 22e802221e..fc8d5b0070 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_time.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_time.go @@ -5,6 +5,7 @@ package json import ( + "errors" "fmt" "reflect" "strings" @@ -85,25 +86,39 @@ func makeTimeArshaler(fncs *arshaler, t reflect.Type) *arshaler { fncs.nonDefault = true fncs.marshal = func(mo MarshalOptions, enc *Encoder, va addressableValue) error { format := time.RFC3339Nano + isRFC3339 := true if mo.format != "" && mo.formatDepth == enc.tokens.depth() { var err error - format, err = checkTimeFormat(mo.format) + format, isRFC3339, err = checkTimeFormat(mo.format) if err != nil { return &SemanticError{action: "marshal", GoType: t, Err: err} } } tt := va.Interface().(time.Time) - if y := tt.Year(); y < 0 || y >= 10000 { - // RFC 3339 is clear that years are 4 digits exactly. - // See https://go.dev/issue/4556#c15 for more discussion. - err := fmt.Errorf("year %d outside of range [0,9999]", y) - return &SemanticError{action: "marshal", GoType: t, Err: err} - } b := enc.UnusedBuffer() b = append(b, '"') b = tt.AppendFormat(b, format) b = append(b, '"') + if isRFC3339 { + // Not all Go timestamps can be represented as valid RFC 3339. + // Explicitly check for these edge cases. + // See https://go.dev/issue/4556 and https://go.dev/issue/54580. + var err error + switch b := b[len(`"`) : len(b)-len(`"`)]; { + case b[len("9999")] != '-': // year must be exactly 4 digits wide + err = errors.New("year outside of range [0,9999]") + case b[len(b)-1] != 'Z': + c := b[len(b)-len("Z07:00")] + if ('0' <= c && c <= '9') || parseDec2(b[len(b)-len("07:00"):]) >= 24 { + err = errors.New("timezone hour outside of range [0,23]") + } + } + if err != nil { + return &SemanticError{action: "marshal", GoType: t, Err: err} + } + return enc.WriteValue(b) // RFC 3339 never needs JSON escaping + } // The format may contain special characters that need escaping. // Verify that the result is a valid JSON string (common case), // otherwise escape the string correctly (slower case). @@ -113,10 +128,11 @@ func makeTimeArshaler(fncs *arshaler, t reflect.Type) *arshaler { return enc.WriteValue(b) } fncs.unmarshal = func(uo UnmarshalOptions, dec *Decoder, va addressableValue) error { - format := time.RFC3339Nano + format := time.RFC3339 + isRFC3339 := true if uo.format != "" && uo.formatDepth == dec.tokens.depth() { var err error - format, err = checkTimeFormat(uo.format) + format, isRFC3339, err = checkTimeFormat(uo.format) if err != nil { return &SemanticError{action: "unmarshal", GoType: t, Err: err} } @@ -136,6 +152,29 @@ func makeTimeArshaler(fncs *arshaler, t reflect.Type) *arshaler { case '"': val = unescapeStringMayCopy(val, flags.isVerbatim()) tt2, err := time.Parse(format, string(val)) + if isRFC3339 && err == nil { + // TODO(https://go.dev/issue/54580): RFC 3339 specifies + // the exact grammar of a valid timestamp. However, + // the parsing functionality in "time" is too loose and + // incorrectly accepts invalid timestamps as valid. + // Remove these manual checks when "time" checks it for us. + newParseError := func(layout, value, layoutElem, valueElem, message string) error { + return &time.ParseError{Layout: layout, Value: value, LayoutElem: layoutElem, ValueElem: valueElem, Message: message} + } + switch { + case val[len("2006-01-02T")+1] == ':': // hour must be two digits + err = newParseError(format, string(val), "15", string(val[len("2006-01-02T"):][:1]), "") + case val[len("2006-01-02T15:04:05")] == ',': // sub-second separator must be a period + err = newParseError(format, string(val), ".", ",", "") + case val[len(val)-1] != 'Z': + switch { + case parseDec2(val[len(val)-len("07:00"):]) >= 24: // timezone hour must be in range + err = newParseError(format, string(val), "Z07:00", string(val[len(val)-len("Z07:00"):]), ": timezone hour out of range") + case parseDec2(val[len(val)-len("00"):]) >= 60: // timezone minute must be in range + err = newParseError(format, string(val), "Z07:00", string(val[len(val)-len("Z07:00"):]), ": timezone minute out of range") + } + } + } if err != nil { return &SemanticError{action: "unmarshal", JSONKind: k, GoType: t, Err: err} } @@ -149,48 +188,54 @@ func makeTimeArshaler(fncs *arshaler, t reflect.Type) *arshaler { return fncs } -func checkTimeFormat(format string) (string, error) { +func checkTimeFormat(format string) (string, bool, error) { // We assume that an exported constant in the time package will // always start with an uppercase ASCII letter. if len(format) > 0 && 'A' <= format[0] && format[0] <= 'Z' { switch format { case "ANSIC": - return time.ANSIC, nil + return time.ANSIC, false, nil case "UnixDate": - return time.UnixDate, nil + return time.UnixDate, false, nil case "RubyDate": - return time.RubyDate, nil + return time.RubyDate, false, nil case "RFC822": - return time.RFC822, nil + return time.RFC822, false, nil case "RFC822Z": - return time.RFC822Z, nil + return time.RFC822Z, false, nil case "RFC850": - return time.RFC850, nil + return time.RFC850, false, nil case "RFC1123": - return time.RFC1123, nil + return time.RFC1123, false, nil case "RFC1123Z": - return time.RFC1123Z, nil + return time.RFC1123Z, false, nil case "RFC3339": - return time.RFC3339, nil + return time.RFC3339, true, nil case "RFC3339Nano": - return time.RFC3339Nano, nil + return time.RFC3339Nano, true, nil case "Kitchen": - return time.Kitchen, nil + return time.Kitchen, false, nil case "Stamp": - return time.Stamp, nil + return time.Stamp, false, nil case "StampMilli": - return time.StampMilli, nil + return time.StampMilli, false, nil case "StampMicro": - return time.StampMicro, nil + return time.StampMicro, false, nil case "StampNano": - return time.StampNano, nil + return time.StampNano, false, nil default: // Reject any format that is an exported Go identifier in case // new format constants are added to the time package. if strings.TrimFunc(format, isLetterOrDigit) == "" { - return "", fmt.Errorf("undefined format layout: %v", format) + return "", false, fmt.Errorf("undefined format layout: %v", format) } } } - return format, nil + return format, false, nil +} + +// parseDec2 parses b as an unsigned, base-10, 2-digit number. +// It panics if len(b) < 2. The result is undefined if digits are not base-10. +func parseDec2(b []byte) byte { + return 10*(b[0]-'0') + (b[1] - '0') } diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go index 998ad68fc0..0d68b32338 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go @@ -347,9 +347,9 @@ func (d *Decoder) PeekKind() Kind { return next } -// skipValue is semantically equivalent to calling ReadValue and discarding +// SkipValue is semantically equivalent to calling ReadValue and discarding // the result except that memory is not wasted trying to hold the entire result. -func (d *Decoder) skipValue() error { +func (d *Decoder) SkipValue() error { switch d.PeekKind() { case '{', '[': // For JSON objects and arrays, keep skipping all tokens @@ -374,7 +374,7 @@ func (d *Decoder) skipValue() error { } // ReadToken reads the next Token, advancing the read offset. -// The returned token is only valid until the next Peek or Read call. +// The returned token is only valid until the next Peek, Read, or Skip call. // It returns io.EOF if there are no more tokens. func (d *Decoder) ReadToken() (Token, error) { // Determine the next kind. @@ -585,7 +585,7 @@ func (f valueFlags) isCanonical() bool { return f&stringNonCanonical == 0 } // ReadValue returns the next raw JSON value, advancing the read offset. // The value is stripped of any leading or trailing whitespace. -// The returned value is only valid until the next Peek or Read call and +// The returned value is only valid until the next Peek, Read, or Skip call and // may not be mutated while the Decoder remains in use. // If the decoder is currently at the end token for an object or array, // then it reports a SyntacticError and the internal state remains unchanged. @@ -1013,7 +1013,7 @@ func (d *Decoder) InputOffset() int64 { // UnreadBuffer returns the data remaining in the unread buffer, // which may contain zero or more bytes. // The returned buffer must not be mutated while Decoder continues to be used. -// The buffer contents are valid until the next Peek or Read call. +// The buffer contents are valid until the next Peek, Read, or Skip call. func (d *Decoder) UnreadBuffer() []byte { return d.unreadBuffer() } @@ -1213,7 +1213,7 @@ func consumeStringResumable(flags *valueFlags, b []byte, resumeOffset int, valid return n, &SyntacticError{str: "invalid escape sequence " + strconv.Quote(string(b[n:n+6])) + " within string"} } // Only certain control characters can use the \uFFFF notation - // for canonical formating (per RFC 8785, section 3.2.2.2.). + // for canonical formatting (per RFC 8785, section 3.2.2.2.). switch v1 { // \uFFFF notation not permitted for these characters. case '\b', '\f', '\n', '\r', '\t': diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go index 5f98a8409e..5b81ca15af 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go @@ -347,6 +347,30 @@ func (e *Encoder) unwriteEmptyObjectMember(prevName *string) bool { return true } +// unwriteOnlyObjectMemberName unwrites the only object member name +// and returns the unquoted name. +func (e *Encoder) unwriteOnlyObjectMemberName() string { + if last := e.tokens.last; !last.isObject() || last.length() != 1 { + panic("BUG: must be called on an object after writing first name") + } + + // Unwrite the name and whitespace. + b := trimSuffixString(e.buf) + isVerbatim := bytes.IndexByte(e.buf[len(b):], '\\') < 0 + name := string(unescapeStringMayCopy(e.buf[len(b):], isVerbatim)) + e.buf = trimSuffixWhitespace(b) + + // Undo state changes. + e.tokens.last.decrement() + if !e.options.AllowDuplicateNames { + if e.tokens.last.isActiveNamespace() { + e.namespaces.last().removeLast() + } + e.names.clearLast() + } + return name +} + func trimSuffixWhitespace(b []byte) []byte { // NOTE: The arguments and logic are kept simple to keep this inlineable. n := len(b) - 1 diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/pools.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/pools.go index f722822117..60e93270fb 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/pools.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/pools.go @@ -8,6 +8,7 @@ import ( "bytes" "io" "math/bits" + "sort" "sync" ) @@ -148,3 +149,34 @@ func putStreamingDecoder(d *Decoder) { streamingDecoderPool.Put(d) } } + +var stringsPools = &sync.Pool{New: func() any { return new(stringSlice) }} + +type stringSlice []string + +// getStrings returns a non-nil pointer to a slice with length n. +func getStrings(n int) *stringSlice { + s := stringsPools.Get().(*stringSlice) + if cap(*s) < n { + *s = make([]string, n) + } + *s = (*s)[:n] + return s +} + +func putStrings(s *stringSlice) { + if cap(*s) > 1<<10 { + *s = nil // avoid pinning arbitrarily large amounts of memory + } + stringsPools.Put(s) +} + +// Sort sorts the string slice according to RFC 8785, section 3.2.3. +func (ss *stringSlice) Sort() { + // TODO(https://go.dev/issue/47619): Use slices.SortFunc instead. + sort.Sort(ss) +} + +func (ss *stringSlice) Len() int { return len(*ss) } +func (ss *stringSlice) Less(i, j int) bool { return lessUTF16((*ss)[i], (*ss)[j]) } +func (ss *stringSlice) Swap(i, j int) { (*ss)[i], (*ss)[j] = (*ss)[j], (*ss)[i] } diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/state.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/state.go index d9c33f2b4b..ee14c753fe 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/state.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/state.go @@ -721,7 +721,7 @@ func (s *uintSet) has(i uint) bool { return s.lo.has(i) } else { i -= 64 - iHi, iLo := int(i/64), uint(i%64) + iHi, iLo := int(i/64), i%64 return iHi < len(s.hi) && s.hi[iHi].has(iLo) } } @@ -735,7 +735,7 @@ func (s *uintSet) insert(i uint) bool { return !has } else { i -= 64 - iHi, iLo := int(i/64), uint(i%64) + iHi, iLo := int(i/64), i%64 if iHi >= len(s.hi) { s.hi = append(s.hi, make([]uintSet64, iHi+1-len(s.hi))...) s.hi = s.hi[:cap(s.hi)] diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/token.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/token.go index 08509c296b..9acba7dadf 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/token.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/token.go @@ -112,7 +112,7 @@ func Bool(b bool) Token { return False } -// String construct a Token representing a JSON string. +// String constructs a Token representing a JSON string. // The provided string should contain valid UTF-8, otherwise invalid characters // may be mangled as the Unicode replacement character. func String(s string) Token { @@ -225,7 +225,7 @@ func (t Token) appendString(dst []byte, validateUTF8, preserveRaw bool, escapeRu } // String returns the unescaped string value for a JSON string. -// For other JSON kinds, this returns the raw JSON represention. +// For other JSON kinds, this returns the raw JSON representation. func (t Token) String() string { // This is inlinable to take advantage of "function outlining". // This avoids an allocation for the string(b) conversion @@ -373,10 +373,10 @@ func (t Token) Int() int64 { case 'i': return int64(t.num) case 'u': - if uint64(t.num) > maxInt64 { + if t.num > maxInt64 { return maxInt64 } - return int64(uint64(t.num)) + return int64(t.num) } } @@ -425,7 +425,7 @@ func (t Token) Uint() uint64 { // Handle exact integer value. switch t.str[0] { case 'u': - return uint64(t.num) + return t.num case 'i': if int64(t.num) < minUint64 { return minUint64 diff --git a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go index fe88e4fb5e..e0bd1b31d7 100644 --- a/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go +++ b/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go @@ -263,7 +263,7 @@ func reorderObjects(d *Decoder, scratch *[]byte) { afterValue := d.InputOffset() if isSorted && len(*members) > 0 { - isSorted = lessUTF16(prevName, name) + isSorted = lessUTF16(prevName, []byte(name)) } *members = append(*members, memberName{name, beforeName, afterValue}) prevName = name @@ -317,7 +317,7 @@ func reorderObjects(d *Decoder, scratch *[]byte) { // to the UTF-16 codepoints of the UTF-8 encoded input strings. // This implements the ordering specified in RFC 8785, section 3.2.3. // The inputs must be valid UTF-8, otherwise this may panic. -func lessUTF16(x, y []byte) bool { +func lessUTF16[Bytes []byte | string](x, y Bytes) bool { // NOTE: This is an optimized, allocation-free implementation // of lessUTF16Simple in fuzz_test.go. FuzzLessUTF16 verifies that the // two implementations agree on the result of comparing any two strings. @@ -326,8 +326,13 @@ func lessUTF16(x, y []byte) bool { return ('\u0000' <= r && r <= '\uD7FF') || ('\uE000' <= r && r <= '\uFFFF') } + var invalidUTF8 bool + x0, y0 := x, y for { if len(x) == 0 || len(y) == 0 { + if len(x) == len(y) && invalidUTF8 { + return string(x0) < string(y0) + } return len(x) < len(y) } @@ -341,35 +346,36 @@ func lessUTF16(x, y []byte) bool { } // Decode next pair of runes as UTF-8. - rx, nx := utf8.DecodeRune(x) - ry, ny := utf8.DecodeRune(y) - switch { - - // Both runes encode as either a single or surrogate pair - // of UTF-16 codepoints. - case isUTF16Self(rx) == isUTF16Self(ry): - if rx != ry { - return rx < ry - } + // TODO(https://go.dev/issue/56948): Use a generic implementation + // of utf8.DecodeRune, or rely on a compiler optimization to statically + // hide the cost of a type switch (https://go.dev/issue/57072). + var rx, ry rune + var nx, ny int + switch any(x).(type) { + case string: + rx, nx = utf8.DecodeRuneInString(string(x)) + ry, ny = utf8.DecodeRuneInString(string(y)) + case []byte: + rx, nx = utf8.DecodeRune([]byte(x)) + ry, ny = utf8.DecodeRune([]byte(y)) + } + selfx := isUTF16Self(rx) + selfy := isUTF16Self(ry) + switch { // The x rune is a single UTF-16 codepoint, while // the y rune is a surrogate pair of UTF-16 codepoints. - case isUTF16Self(rx): - ry, _ := utf16.EncodeRune(ry) - if rx != ry { - return rx < ry - } - panic("BUG: invalid UTF-8") // implies rx is an unpaired surrogate half - + case selfx && !selfy: + ry, _ = utf16.EncodeRune(ry) // The y rune is a single UTF-16 codepoint, while // the x rune is a surrogate pair of UTF-16 codepoints. - case isUTF16Self(ry): - rx, _ := utf16.EncodeRune(rx) - if rx != ry { - return rx < ry - } - panic("BUG: invalid UTF-8") // implies ry is an unpaired surrogate half + case selfy && !selfx: + rx, _ = utf16.EncodeRune(rx) + } + if rx != ry { + return rx < ry } + invalidUTF8 = invalidUTF8 || (rx == utf8.RuneError && nx == 1) || (ry == utf8.RuneError && ny == 1) x, y = x[nx:], y[ny:] } } diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/encoding.go b/vendor/k8s.io/kube-openapi/pkg/spec3/encoding.go index 2e2f3d76f3..699291f1d8 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/encoding.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/encoding.go @@ -18,7 +18,10 @@ package spec3 import ( "encoding/json" + "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -41,6 +44,9 @@ func (e *Encoding) MarshalJSON() ([]byte, error) { } func (e *Encoding) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, e) + } if err := json.Unmarshal(data, &e.EncodingProps); err != nil { return err } @@ -50,6 +56,20 @@ func (e *Encoding) UnmarshalJSON(data []byte) error { return nil } +func (e *Encoding) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + EncodingProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + + e.Extensions = internal.SanitizeExtensions(x.Extensions) + e.EncodingProps = x.EncodingProps + return nil +} + type EncodingProps struct { // Content Type for encoding a specific property ContentType string `json:"contentType,omitempty"` diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/example.go b/vendor/k8s.io/kube-openapi/pkg/spec3/example.go index 84e21d7232..03b8727170 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/example.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/example.go @@ -20,6 +20,9 @@ import ( "encoding/json" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" + "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -49,6 +52,9 @@ func (e *Example) MarshalJSON() ([]byte, error) { } func (e *Example) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, e) + } if err := json.Unmarshal(data, &e.Refable); err != nil { return err } @@ -61,6 +67,23 @@ func (e *Example) UnmarshalJSON(data []byte) error { return nil } +func (e *Example) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + ExampleProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + if err := internal.JSONRefFromMap(&e.Ref.Ref, x.Extensions); err != nil { + return err + } + e.Extensions = internal.SanitizeExtensions(x.Extensions) + e.ExampleProps = x.ExampleProps + + return nil +} + type ExampleProps struct { // Summary holds a short description of the example Summary string `json:"summary,omitempty"` diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/external_documentation.go b/vendor/k8s.io/kube-openapi/pkg/spec3/external_documentation.go index 065f4887bf..e79956721a 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/external_documentation.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/external_documentation.go @@ -18,7 +18,10 @@ package spec3 import ( "encoding/json" + "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -48,6 +51,9 @@ func (e *ExternalDocumentation) MarshalJSON() ([]byte, error) { } func (e *ExternalDocumentation) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, e) + } if err := json.Unmarshal(data, &e.ExternalDocumentationProps); err != nil { return err } @@ -56,3 +62,16 @@ func (e *ExternalDocumentation) UnmarshalJSON(data []byte) error { } return nil } + +func (e *ExternalDocumentation) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + ExternalDocumentationProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + e.Extensions = internal.SanitizeExtensions(x.Extensions) + e.ExternalDocumentationProps = x.ExternalDocumentationProps + return nil +} diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go b/vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go new file mode 100644 index 0000000000..bc19dd48ed --- /dev/null +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go @@ -0,0 +1,254 @@ +package spec3 + +import ( + "math/rand" + "strings" + + fuzz "github.com/google/gofuzz" + + "k8s.io/kube-openapi/pkg/validation/spec" +) + +// refChance is the chance that a particular component will use a $ref +// instead of fuzzed. Expressed as a fraction 1/n, currently there is +// a 1/3 chance that a ref will be used. +const refChance = 3 + +const alphaNumChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + +func randAlphanumString() string { + arr := make([]string, rand.Intn(10)+5) + for i := 0; i < len(arr); i++ { + arr[i] = string(alphaNumChars[rand.Intn(len(alphaNumChars))]) + } + return strings.Join(arr, "") +} + +var OpenAPIV3FuzzFuncs []interface{} = []interface{}{ + func(s *string, c fuzz.Continue) { + // All OpenAPI V3 map keys must follow the corresponding + // regex. Note that this restricts the range for all other + // string values as well. + str := randAlphanumString() + *s = str + }, + func(o *OpenAPI, c fuzz.Continue) { + c.FuzzNoCustom(o) + o.Version = "3.0.0" + }, + func(r *interface{}, c fuzz.Continue) { + switch c.Intn(3) { + case 0: + *r = nil + case 1: + n := c.RandString() + "x" + *r = n + case 2: + n := c.Float64() + *r = n + } + }, + func(v **spec.Info, c fuzz.Continue) { + // Info is never nil + *v = &spec.Info{} + c.FuzzNoCustom(*v) + (*v).Title = c.RandString() + "x" + }, + func(v *Paths, c fuzz.Continue) { + c.Fuzz(&v.VendorExtensible) + num := c.Intn(5) + if num > 0 { + v.Paths = make(map[string]*Path) + } + for i := 0; i < num; i++ { + val := Path{} + c.Fuzz(&val) + v.Paths["/"+c.RandString()] = &val + } + }, + func(v *SecurityScheme, c fuzz.Continue) { + if c.Intn(refChance) == 0 { + c.Fuzz(&v.Refable) + return + } + switch c.Intn(4) { + case 0: + v.Type = "apiKey" + v.Name = c.RandString() + "x" + switch c.Intn(3) { + case 0: + v.In = "query" + case 1: + v.In = "header" + case 2: + v.In = "cookie" + } + case 1: + v.Type = "http" + case 2: + v.Type = "oauth2" + v.Flows = make(map[string]*OAuthFlow) + flow := OAuthFlow{} + flow.AuthorizationUrl = c.RandString() + "x" + v.Flows["implicit"] = &flow + flow.Scopes = make(map[string]string) + flow.Scopes["foo"] = "bar" + case 3: + v.Type = "openIdConnect" + v.OpenIdConnectUrl = "https://" + c.RandString() + } + v.Scheme = "basic" + }, + func(v *spec.Ref, c fuzz.Continue) { + switch c.Intn(7) { + case 0: + *v = spec.MustCreateRef("#/components/schemas/" + randAlphanumString()) + case 1: + *v = spec.MustCreateRef("#/components/responses/" + randAlphanumString()) + case 2: + *v = spec.MustCreateRef("#/components/headers/" + randAlphanumString()) + case 3: + *v = spec.MustCreateRef("#/components/securitySchemes/" + randAlphanumString()) + case 5: + *v = spec.MustCreateRef("#/components/parameters/" + randAlphanumString()) + case 6: + *v = spec.MustCreateRef("#/components/requestBodies/" + randAlphanumString()) + } + }, + func(v *Parameter, c fuzz.Continue) { + if c.Intn(refChance) == 0 { + c.Fuzz(&v.Refable) + return + } + c.Fuzz(&v.ParameterProps) + c.Fuzz(&v.VendorExtensible) + + switch c.Intn(3) { + case 0: + // Header param + v.In = "query" + case 1: + v.In = "header" + case 2: + v.In = "cookie" + } + }, + func(v *RequestBody, c fuzz.Continue) { + if c.Intn(refChance) == 0 { + c.Fuzz(&v.Refable) + return + } + c.Fuzz(&v.RequestBodyProps) + c.Fuzz(&v.VendorExtensible) + }, + func(v *Header, c fuzz.Continue) { + if c.Intn(refChance) == 0 { + c.Fuzz(&v.Refable) + return + } + c.Fuzz(&v.HeaderProps) + c.Fuzz(&v.VendorExtensible) + }, + func(v *ResponsesProps, c fuzz.Continue) { + c.Fuzz(&v.Default) + n := c.Intn(5) + for i := 0; i < n; i++ { + r2 := Response{} + c.Fuzz(&r2) + // HTTP Status code in 100-599 Range + code := c.Intn(500) + 100 + v.StatusCodeResponses = make(map[int]*Response) + v.StatusCodeResponses[code] = &r2 + } + }, + func(v *Response, c fuzz.Continue) { + if c.Intn(refChance) == 0 { + c.Fuzz(&v.Refable) + return + } + c.Fuzz(&v.ResponseProps) + c.Fuzz(&v.VendorExtensible) + }, + func(v *spec.Extensions, c fuzz.Continue) { + numChildren := c.Intn(5) + for i := 0; i < numChildren; i++ { + if *v == nil { + *v = spec.Extensions{} + } + (*v)["x-"+c.RandString()] = c.RandString() + } + }, + func(v *spec.ExternalDocumentation, c fuzz.Continue) { + c.Fuzz(&v.Description) + v.URL = "https://" + randAlphanumString() + }, + func(v *spec.SchemaURL, c fuzz.Continue) { + *v = spec.SchemaURL("https://" + randAlphanumString()) + }, + func(v *spec.SchemaOrBool, c fuzz.Continue) { + *v = spec.SchemaOrBool{} + + if c.RandBool() { + v.Allows = c.RandBool() + } else { + v.Schema = &spec.Schema{} + v.Allows = true + c.Fuzz(&v.Schema) + } + }, + func(v *spec.SchemaOrArray, c fuzz.Continue) { + *v = spec.SchemaOrArray{} + if c.RandBool() { + schema := spec.Schema{} + c.Fuzz(&schema) + v.Schema = &schema + } else { + v.Schemas = []spec.Schema{} + numChildren := c.Intn(5) + for i := 0; i < numChildren; i++ { + schema := spec.Schema{} + c.Fuzz(&schema) + v.Schemas = append(v.Schemas, schema) + } + + } + + }, + func(v *spec.SchemaOrStringArray, c fuzz.Continue) { + if c.RandBool() { + *v = spec.SchemaOrStringArray{} + if c.RandBool() { + c.Fuzz(&v.Property) + } else { + c.Fuzz(&v.Schema) + } + } + }, + func(v *spec.Schema, c fuzz.Continue) { + if c.Intn(refChance) == 0 { + c.Fuzz(&v.Ref) + return + } + if c.RandBool() { + // file schema + c.Fuzz(&v.Default) + c.Fuzz(&v.Description) + c.Fuzz(&v.Example) + c.Fuzz(&v.ExternalDocs) + + c.Fuzz(&v.Format) + c.Fuzz(&v.ReadOnly) + c.Fuzz(&v.Required) + c.Fuzz(&v.Title) + v.Type = spec.StringOrArray{"file"} + + } else { + // normal schema + c.Fuzz(&v.SchemaProps) + c.Fuzz(&v.SwaggerSchemaProps) + c.Fuzz(&v.VendorExtensible) + c.Fuzz(&v.ExtraProps) + } + + }, +} diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/header.go b/vendor/k8s.io/kube-openapi/pkg/spec3/header.go index cead4b15d1..ee5a30f797 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/header.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/header.go @@ -20,6 +20,8 @@ import ( "encoding/json" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -50,6 +52,9 @@ func (h *Header) MarshalJSON() ([]byte, error) { } func (h *Header) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, h) + } if err := json.Unmarshal(data, &h.Refable); err != nil { return err } @@ -63,6 +68,22 @@ func (h *Header) UnmarshalJSON(data []byte) error { return nil } +func (h *Header) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + HeaderProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + if err := internal.JSONRefFromMap(&h.Ref.Ref, x.Extensions); err != nil { + return err + } + h.Extensions = internal.SanitizeExtensions(x.Extensions) + h.HeaderProps = x.HeaderProps + return nil +} + // HeaderProps a struct that describes a header object type HeaderProps struct { // Description holds a brief description of the parameter diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/media_type.go b/vendor/k8s.io/kube-openapi/pkg/spec3/media_type.go index d502a465c3..d390e69bcf 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/media_type.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/media_type.go @@ -18,7 +18,10 @@ package spec3 import ( "encoding/json" + "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -44,6 +47,9 @@ func (m *MediaType) MarshalJSON() ([]byte, error) { } func (m *MediaType) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, m) + } if err := json.Unmarshal(data, &m.MediaTypeProps); err != nil { return err } @@ -53,6 +59,20 @@ func (m *MediaType) UnmarshalJSON(data []byte) error { return nil } +func (m *MediaType) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + MediaTypeProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + m.Extensions = internal.SanitizeExtensions(x.Extensions) + m.MediaTypeProps = x.MediaTypeProps + + return nil +} + // MediaTypeProps a struct that allows you to specify content format, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#mediaTypeObject type MediaTypeProps struct { // Schema holds the schema defining the type used for the media type diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/operation.go b/vendor/k8s.io/kube-openapi/pkg/spec3/operation.go index 09ce7eaf12..28230610bd 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/operation.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/operation.go @@ -20,6 +20,8 @@ import ( "encoding/json" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -46,12 +48,28 @@ func (o *Operation) MarshalJSON() ([]byte, error) { // UnmarshalJSON hydrates this items instance with the data from JSON func (o *Operation) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, o) + } if err := json.Unmarshal(data, &o.OperationProps); err != nil { return err } return json.Unmarshal(data, &o.VendorExtensible) } +func (o *Operation) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + OperationProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + o.Extensions = internal.SanitizeExtensions(x.Extensions) + o.OperationProps = x.OperationProps + return nil +} + // OperationProps describes a single API operation on a path, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#operationObject type OperationProps struct { // Tags holds a list of tags for API documentation control diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/parameter.go b/vendor/k8s.io/kube-openapi/pkg/spec3/parameter.go index 0d7180e506..613da71a6d 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/parameter.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/parameter.go @@ -20,6 +20,8 @@ import ( "encoding/json" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -50,6 +52,10 @@ func (p *Parameter) MarshalJSON() ([]byte, error) { } func (p *Parameter) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, p) + } + if err := json.Unmarshal(data, &p.Refable); err != nil { return err } @@ -63,6 +69,22 @@ func (p *Parameter) UnmarshalJSON(data []byte) error { return nil } +func (p *Parameter) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + ParameterProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + if err := internal.JSONRefFromMap(&p.Ref.Ref, x.Extensions); err != nil { + return err + } + p.Extensions = internal.SanitizeExtensions(x.Extensions) + p.ParameterProps = x.ParameterProps + return nil +} + // ParameterProps a struct that describes a single operation parameter, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#parameterObject type ParameterProps struct { // Name holds the name of the parameter diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/path.go b/vendor/k8s.io/kube-openapi/pkg/spec3/path.go index 4a0cae2a4c..40d9061ace 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/path.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/path.go @@ -18,9 +18,12 @@ package spec3 import ( "encoding/json" + "fmt" "strings" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -45,6 +48,9 @@ func (p *Paths) MarshalJSON() ([]byte, error) { // UnmarshalJSON hydrates this items instance with the data from JSON func (p *Paths) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, p) + } var res map[string]json.RawMessage if err := json.Unmarshal(data, &res); err != nil { return err @@ -74,6 +80,59 @@ func (p *Paths) UnmarshalJSON(data []byte) error { return nil } +func (p *Paths) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + tok, err := dec.ReadToken() + if err != nil { + return err + } + switch k := tok.Kind(); k { + case 'n': + *p = Paths{} + return nil + case '{': + for { + tok, err := dec.ReadToken() + if err != nil { + return err + } + + if tok.Kind() == '}' { + return nil + } + + switch k := tok.String(); { + case internal.IsExtensionKey(k): + var ext any + if err := opts.UnmarshalNext(dec, &ext); err != nil { + return err + } + + if p.Extensions == nil { + p.Extensions = make(map[string]any) + } + p.Extensions[k] = ext + case len(k) > 0 && k[0] == '/': + pi := Path{} + if err := opts.UnmarshalNext(dec, &pi); err != nil { + return err + } + + if p.Paths == nil { + p.Paths = make(map[string]*Path) + } + p.Paths[k] = &pi + default: + _, err := dec.ReadValue() // skip value + if err != nil { + return err + } + } + } + default: + return fmt.Errorf("unknown JSON kind: %v", k) + } +} + // Path describes the operations available on a single path, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#pathItemObject // // Note that this struct is actually a thin wrapper around PathProps to make it referable and extensible @@ -101,6 +160,9 @@ func (p *Path) MarshalJSON() ([]byte, error) { } func (p *Path) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, p) + } if err := json.Unmarshal(data, &p.Refable); err != nil { return err } @@ -113,6 +175,24 @@ func (p *Path) UnmarshalJSON(data []byte) error { return nil } +func (p *Path) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + PathProps + } + + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + if err := internal.JSONRefFromMap(&p.Ref.Ref, x.Extensions); err != nil { + return err + } + p.Extensions = internal.SanitizeExtensions(x.Extensions) + p.PathProps = x.PathProps + + return nil +} + // PathProps describes the operations available on a single path, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#pathItemObject type PathProps struct { // Summary holds a summary for all operations in this path diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/request_body.go b/vendor/k8s.io/kube-openapi/pkg/spec3/request_body.go index c00c043bd0..33267ce675 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/request_body.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/request_body.go @@ -20,6 +20,8 @@ import ( "encoding/json" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -50,6 +52,9 @@ func (r *RequestBody) MarshalJSON() ([]byte, error) { } func (r *RequestBody) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, r) + } if err := json.Unmarshal(data, &r.Refable); err != nil { return err } @@ -71,3 +76,19 @@ type RequestBodyProps struct { // Required determines if the request body is required in the request Required bool `json:"required,omitempty"` } + +func (r *RequestBody) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + RequestBodyProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + if err := internal.JSONRefFromMap(&r.Ref.Ref, x.Extensions); err != nil { + return err + } + r.Extensions = internal.SanitizeExtensions(x.Extensions) + r.RequestBodyProps = x.RequestBodyProps + return nil +} diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/response.go b/vendor/k8s.io/kube-openapi/pkg/spec3/response.go index 9be7665608..95b388e6c6 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/response.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/response.go @@ -18,9 +18,12 @@ package spec3 import ( "encoding/json" + "fmt" "strconv" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -46,13 +49,15 @@ func (r *Responses) MarshalJSON() ([]byte, error) { } func (r *Responses) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, r) + } if err := json.Unmarshal(data, &r.ResponsesProps); err != nil { return err } if err := json.Unmarshal(data, &r.VendorExtensible); err != nil { return err } - return nil } @@ -78,25 +83,91 @@ func (r ResponsesProps) MarshalJSON() ([]byte, error) { // UnmarshalJSON unmarshals responses from JSON func (r *ResponsesProps) UnmarshalJSON(data []byte) error { - var res map[string]*Response + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, r) + } + var res map[string]json.RawMessage if err := json.Unmarshal(data, &res); err != nil { - return nil + return err } if v, ok := res["default"]; ok { - r.Default = v + value := Response{} + if err := json.Unmarshal(v, &value); err != nil { + return err + } + r.Default = &value delete(res, "default") } for k, v := range res { + // Take all integral keys if nk, err := strconv.Atoi(k); err == nil { if r.StatusCodeResponses == nil { r.StatusCodeResponses = map[int]*Response{} } - r.StatusCodeResponses[nk] = v + value := Response{} + if err := json.Unmarshal(v, &value); err != nil { + return err + } + r.StatusCodeResponses[nk] = &value } } return nil } +func (r *Responses) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) (err error) { + tok, err := dec.ReadToken() + if err != nil { + return err + } + switch k := tok.Kind(); k { + case 'n': + *r = Responses{} + return nil + case '{': + for { + tok, err := dec.ReadToken() + if err != nil { + return err + } + if tok.Kind() == '}' { + return nil + } + switch k := tok.String(); { + case internal.IsExtensionKey(k): + var ext any + if err := opts.UnmarshalNext(dec, &ext); err != nil { + return err + } + + if r.Extensions == nil { + r.Extensions = make(map[string]any) + } + r.Extensions[k] = ext + case k == "default": + resp := Response{} + if err := opts.UnmarshalNext(dec, &resp); err != nil { + return err + } + r.ResponsesProps.Default = &resp + default: + if nk, err := strconv.Atoi(k); err == nil { + resp := Response{} + if err := opts.UnmarshalNext(dec, &resp); err != nil { + return err + } + + if r.StatusCodeResponses == nil { + r.StatusCodeResponses = map[int]*Response{} + } + r.StatusCodeResponses[nk] = &resp + } + } + } + default: + return fmt.Errorf("unknown JSON kind: %v", k) + } +} + // Response describes a single response from an API Operation, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#responseObject // // Note that this struct is actually a thin wrapper around ResponseProps to make it referable and extensible @@ -124,6 +195,9 @@ func (r *Response) MarshalJSON() ([]byte, error) { } func (r *Response) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, r) + } if err := json.Unmarshal(data, &r.Refable); err != nil { return err } @@ -133,7 +207,22 @@ func (r *Response) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &r.VendorExtensible); err != nil { return err } + return nil +} +func (r *Response) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + ResponseProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + if err := internal.JSONRefFromMap(&r.Ref.Ref, x.Extensions); err != nil { + return err + } + r.Extensions = internal.SanitizeExtensions(x.Extensions) + r.ResponseProps = x.ResponseProps return nil } @@ -174,6 +263,9 @@ func (r *Link) MarshalJSON() ([]byte, error) { } func (r *Link) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, r) + } if err := json.Unmarshal(data, &r.Refable); err != nil { return err } @@ -187,6 +279,22 @@ func (r *Link) UnmarshalJSON(data []byte) error { return nil } +func (l *Link) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + LinkProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + if err := internal.JSONRefFromMap(&l.Ref.Ref, x.Extensions); err != nil { + return err + } + l.Extensions = internal.SanitizeExtensions(x.Extensions) + l.LinkProps = x.LinkProps + return nil +} + // LinkProps describes a single response from an API Operation, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#responseObject type LinkProps struct { // OperationId is the name of an existing, resolvable OAS operation diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/server.go b/vendor/k8s.io/kube-openapi/pkg/spec3/server.go index 77104dff37..d5df0a7811 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/server.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/server.go @@ -18,7 +18,10 @@ package spec3 import ( "encoding/json" + "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -50,6 +53,10 @@ func (s *Server) MarshalJSON() ([]byte, error) { } func (s *Server) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, s) + } + if err := json.Unmarshal(data, &s.ServerProps); err != nil { return err } @@ -59,6 +66,20 @@ func (s *Server) UnmarshalJSON(data []byte) error { return nil } +func (s *Server) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + ServerProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + s.Extensions = internal.SanitizeExtensions(x.Extensions) + s.ServerProps = x.ServerProps + + return nil +} + type ServerVariable struct { ServerVariableProps spec.VendorExtensible @@ -87,6 +108,9 @@ func (s *ServerVariable) MarshalJSON() ([]byte, error) { } func (s *ServerVariable) UnmarshalJSON(data []byte) error { + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, s) + } if err := json.Unmarshal(data, &s.ServerVariableProps); err != nil { return err } @@ -95,3 +119,17 @@ func (s *ServerVariable) UnmarshalJSON(data []byte) error { } return nil } + +func (s *ServerVariable) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error { + var x struct { + spec.Extensions + ServerVariableProps + } + if err := opts.UnmarshalNext(dec, &x); err != nil { + return err + } + s.Extensions = internal.SanitizeExtensions(x.Extensions) + s.ServerVariableProps = x.ServerVariableProps + + return nil +} diff --git a/vendor/k8s.io/kube-openapi/pkg/spec3/spec.go b/vendor/k8s.io/kube-openapi/pkg/spec3/spec.go index 3ff48a3c3d..bed096fb76 100644 --- a/vendor/k8s.io/kube-openapi/pkg/spec3/spec.go +++ b/vendor/k8s.io/kube-openapi/pkg/spec3/spec.go @@ -17,6 +17,10 @@ limitations under the License. package spec3 import ( + "encoding/json" + + "k8s.io/kube-openapi/pkg/internal" + jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -35,3 +39,12 @@ type OpenAPI struct { // ExternalDocs holds additional external documentation ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` } + +func (o *OpenAPI) UnmarshalJSON(data []byte) error { + type OpenAPIWithNoFunctions OpenAPI + p := (*OpenAPIWithNoFunctions)(o) + if internal.UseOptimizedJSONUnmarshalingV3 { + return jsonv2.Unmarshal(data, &p) + } + return json.Unmarshal(data, &p) +} diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/header.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/header.go index 9a2556306a..05310c46b3 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/header.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/header.go @@ -43,6 +43,9 @@ type Header struct { // MarshalJSON marshal this to JSON func (h Header) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(h) + } b1, err := json.Marshal(h.CommonValidations) if err != nil { return nil, err @@ -62,6 +65,20 @@ func (h Header) MarshalJSON() ([]byte, error) { return swag.ConcatJSON(b1, b2, b3, b4), nil } +func (h Header) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + CommonValidations commonValidationsOmitZero `json:",inline"` + SimpleSchema simpleSchemaOmitZero `json:",inline"` + Extensions + HeaderProps + } + x.CommonValidations = commonValidationsOmitZero(h.CommonValidations) + x.SimpleSchema = simpleSchemaOmitZero(h.SimpleSchema) + x.Extensions = internal.SanitizeExtensions(h.Extensions) + x.HeaderProps = h.HeaderProps + return opts.MarshalNext(enc, x) +} + // UnmarshalJSON unmarshals this header from JSON func (h *Header) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { @@ -94,12 +111,8 @@ func (h *Header) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Dec h.CommonValidations = x.CommonValidations h.SimpleSchema = x.SimpleSchema - h.Extensions = x.Extensions + h.Extensions = internal.SanitizeExtensions(x.Extensions) h.HeaderProps = x.HeaderProps - h.Extensions.sanitize() - if len(h.Extensions) == 0 { - h.Extensions = nil - } return nil } diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/info.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/info.go index 395ececae8..d667b705be 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/info.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/info.go @@ -89,17 +89,9 @@ func (e Extensions) GetObject(key string, out interface{}) error { return nil } -func (e Extensions) sanitize() { - for k := range e { - if !isExtensionKey(k) { - delete(e, k) - } - } -} - func (e Extensions) sanitizeWithExtra() (extra map[string]any) { for k, v := range e { - if !isExtensionKey(k) { + if !internal.IsExtensionKey(k) { if extra == nil { extra = make(map[string]any) } @@ -110,10 +102,6 @@ func (e Extensions) sanitizeWithExtra() (extra map[string]any) { return extra } -func isExtensionKey(k string) bool { - return len(k) > 1 && (k[0] == 'x' || k[0] == 'X') && k[1] == '-' -} - // VendorExtensible composition block. type VendorExtensible struct { Extensions Extensions @@ -181,6 +169,9 @@ type Info struct { // MarshalJSON marshal this to JSON func (i Info) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(i) + } b1, err := json.Marshal(i.InfoProps) if err != nil { return nil, err @@ -192,6 +183,16 @@ func (i Info) MarshalJSON() ([]byte, error) { return swag.ConcatJSON(b1, b2), nil } +func (i Info) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + Extensions + InfoProps + } + x.Extensions = i.Extensions + x.InfoProps = i.InfoProps + return opts.MarshalNext(enc, x) +} + // UnmarshalJSON marshal this from JSON func (i *Info) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { @@ -212,11 +213,7 @@ func (i *Info) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decod if err := opts.UnmarshalNext(dec, &x); err != nil { return err } - x.Extensions.sanitize() - if len(x.Extensions) == 0 { - x.Extensions = nil - } - i.VendorExtensible.Extensions = x.Extensions + i.Extensions = internal.SanitizeExtensions(x.Extensions) i.InfoProps = x.InfoProps return nil } diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go index 374f90d28d..4132467d24 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go @@ -37,6 +37,18 @@ type SimpleSchema struct { Example interface{} `json:"example,omitempty"` } +// Marshaling structure only, always edit along with corresponding +// struct (or compilation will fail). +type simpleSchemaOmitZero struct { + Type string `json:"type,omitempty"` + Nullable bool `json:"nullable,omitzero"` + Format string `json:"format,omitempty"` + Items *Items `json:"items,omitzero"` + CollectionFormat string `json:"collectionFormat,omitempty"` + Default interface{} `json:"default,omitempty"` + Example interface{} `json:"example,omitempty"` +} + // CommonValidations describe common JSON-schema validations type CommonValidations struct { Maximum *float64 `json:"maximum,omitempty"` @@ -53,6 +65,23 @@ type CommonValidations struct { Enum []interface{} `json:"enum,omitempty"` } +// Marshaling structure only, always edit along with corresponding +// struct (or compilation will fail). +type commonValidationsOmitZero struct { + Maximum *float64 `json:"maximum,omitempty"` + ExclusiveMaximum bool `json:"exclusiveMaximum,omitzero"` + Minimum *float64 `json:"minimum,omitempty"` + ExclusiveMinimum bool `json:"exclusiveMinimum,omitzero"` + MaxLength *int64 `json:"maxLength,omitempty"` + MinLength *int64 `json:"minLength,omitempty"` + Pattern string `json:"pattern,omitempty"` + MaxItems *int64 `json:"maxItems,omitempty"` + MinItems *int64 `json:"minItems,omitempty"` + UniqueItems bool `json:"uniqueItems,omitzero"` + MultipleOf *float64 `json:"multipleOf,omitempty"` + Enum []interface{} `json:"enum,omitempty"` +} + // Items a limited subset of JSON-Schema's items object. // It is used by parameter definitions that are not located in "body". // @@ -105,18 +134,18 @@ func (i *Items) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Deco if err := i.Refable.Ref.fromMap(x.Extensions); err != nil { return err } - x.Extensions.sanitize() - if len(x.Extensions) == 0 { - x.Extensions = nil - } + i.CommonValidations = x.CommonValidations i.SimpleSchema = x.SimpleSchema - i.VendorExtensible.Extensions = x.Extensions + i.Extensions = internal.SanitizeExtensions(x.Extensions) return nil } // MarshalJSON converts this items object to JSON func (i Items) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(i) + } b1, err := json.Marshal(i.CommonValidations) if err != nil { return nil, err @@ -135,3 +164,17 @@ func (i Items) MarshalJSON() ([]byte, error) { } return swag.ConcatJSON(b4, b3, b1, b2), nil } + +func (i Items) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + CommonValidations commonValidationsOmitZero `json:",inline"` + SimpleSchema simpleSchemaOmitZero `json:",inline"` + Ref string `json:"$ref,omitempty"` + Extensions + } + x.CommonValidations = commonValidationsOmitZero(i.CommonValidations) + x.SimpleSchema = simpleSchemaOmitZero(i.SimpleSchema) + x.Ref = i.Refable.Ref.String() + x.Extensions = internal.SanitizeExtensions(i.Extensions) + return opts.MarshalNext(enc, x) +} diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go index 923769ae08..63eed34601 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go @@ -42,6 +42,23 @@ type OperationProps struct { Responses *Responses `json:"responses,omitempty"` } +// Marshaling structure only, always edit along with corresponding +// struct (or compilation will fail). +type operationPropsOmitZero struct { + Description string `json:"description,omitempty"` + Consumes []string `json:"consumes,omitempty"` + Produces []string `json:"produces,omitempty"` + Schemes []string `json:"schemes,omitempty"` + Tags []string `json:"tags,omitempty"` + Summary string `json:"summary,omitempty"` + ExternalDocs *ExternalDocumentation `json:"externalDocs,omitzero"` + ID string `json:"operationId,omitempty"` + Deprecated bool `json:"deprecated,omitempty,omitzero"` + Security []map[string][]string `json:"security,omitempty"` + Parameters []Parameter `json:"parameters,omitempty"` + Responses *Responses `json:"responses,omitzero"` +} + // MarshalJSON takes care of serializing operation properties to JSON // // We use a custom marhaller here to handle a special cases related to @@ -96,17 +113,16 @@ func (o *Operation) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2. if err := opts.UnmarshalNext(dec, &x); err != nil { return err } - x.Extensions.sanitize() - if len(x.Extensions) == 0 { - x.Extensions = nil - } - o.VendorExtensible.Extensions = x.Extensions + o.Extensions = internal.SanitizeExtensions(x.Extensions) o.OperationProps = OperationProps(x.OperationPropsNoMethods) return nil } // MarshalJSON converts this items object to JSON func (o Operation) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(o) + } b1, err := json.Marshal(o.OperationProps) if err != nil { return nil, err @@ -118,3 +134,13 @@ func (o Operation) MarshalJSON() ([]byte, error) { concated := swag.ConcatJSON(b1, b2) return concated, nil } + +func (o Operation) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + Extensions + OperationProps operationPropsOmitZero `json:",inline"` + } + x.Extensions = internal.SanitizeExtensions(o.Extensions) + x.OperationProps = operationPropsOmitZero(o.OperationProps) + return opts.MarshalNext(enc, x) +} diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go index 7cb229ac13..53d1e0aa94 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go @@ -36,6 +36,17 @@ type ParamProps struct { AllowEmptyValue bool `json:"allowEmptyValue,omitempty"` } +// Marshaling structure only, always edit along with corresponding +// struct (or compilation will fail). +type paramPropsOmitZero struct { + Description string `json:"description,omitempty"` + Name string `json:"name,omitempty"` + In string `json:"in,omitempty"` + Required bool `json:"required,omitzero"` + Schema *Schema `json:"schema,omitzero"` + AllowEmptyValue bool `json:"allowEmptyValue,omitzero"` +} + // Parameter a unique parameter is defined by a combination of a [name](#parameterName) and [location](#parameterIn). // // There are five possible parameter types. @@ -109,19 +120,18 @@ func (p *Parameter) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2. if err := p.Refable.Ref.fromMap(x.Extensions); err != nil { return err } - x.Extensions.sanitize() - if len(x.Extensions) == 0 { - x.Extensions = nil - } p.CommonValidations = x.CommonValidations p.SimpleSchema = x.SimpleSchema - p.VendorExtensible.Extensions = x.Extensions + p.Extensions = internal.SanitizeExtensions(x.Extensions) p.ParamProps = x.ParamProps return nil } // MarshalJSON converts this items object to JSON func (p Parameter) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(p) + } b1, err := json.Marshal(p.CommonValidations) if err != nil { return nil, err @@ -144,3 +154,19 @@ func (p Parameter) MarshalJSON() ([]byte, error) { } return swag.ConcatJSON(b3, b1, b2, b4, b5), nil } + +func (p Parameter) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + CommonValidations commonValidationsOmitZero `json:",inline"` + SimpleSchema simpleSchemaOmitZero `json:",inline"` + ParamProps paramPropsOmitZero `json:",inline"` + Ref string `json:"$ref,omitempty"` + Extensions + } + x.CommonValidations = commonValidationsOmitZero(p.CommonValidations) + x.SimpleSchema = simpleSchemaOmitZero(p.SimpleSchema) + x.Extensions = internal.SanitizeExtensions(p.Extensions) + x.ParamProps = paramPropsOmitZero(p.ParamProps) + x.Ref = p.Refable.Ref.String() + return opts.MarshalNext(enc, x) +} diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go index 03741fcfb5..1d1588cb92 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go @@ -70,24 +70,20 @@ func (p *PathItem) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.D if err := opts.UnmarshalNext(dec, &x); err != nil { return err } - - p.Extensions = x.Extensions - p.PathItemProps = x.PathItemProps - - if err := p.Refable.Ref.fromMap(p.Extensions); err != nil { + if err := p.Refable.Ref.fromMap(x.Extensions); err != nil { return err } - - p.Extensions.sanitize() - if len(p.Extensions) == 0 { - p.Extensions = nil - } + p.Extensions = internal.SanitizeExtensions(x.Extensions) + p.PathItemProps = x.PathItemProps return nil } // MarshalJSON converts this items object to JSON func (p PathItem) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(p) + } b3, err := json.Marshal(p.Refable) if err != nil { return nil, err @@ -103,3 +99,15 @@ func (p PathItem) MarshalJSON() ([]byte, error) { concated := swag.ConcatJSON(b3, b4, b5) return concated, nil } + +func (p PathItem) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + Ref string `json:"$ref,omitempty"` + Extensions + PathItemProps + } + x.Ref = p.Refable.Ref.String() + x.Extensions = internal.SanitizeExtensions(p.Extensions) + x.PathItemProps = p.PathItemProps + return opts.MarshalNext(enc, x) +} diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go index 6699fc4c6e..18f6a9f429 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go @@ -92,7 +92,7 @@ func (p *Paths) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Deco } switch k := tok.String(); { - case isExtensionKey(k): + case internal.IsExtensionKey(k): ext = nil if err := opts.UnmarshalNext(dec, &ext); err != nil { return err @@ -126,6 +126,9 @@ func (p *Paths) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Deco // MarshalJSON converts this items object to JSON func (p Paths) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(p) + } b1, err := json.Marshal(p.VendorExtensible) if err != nil { return nil, err @@ -144,3 +147,18 @@ func (p Paths) MarshalJSON() ([]byte, error) { concated := swag.ConcatJSON(b1, b2) return concated, nil } + +func (p Paths) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + m := make(map[string]any, len(p.Extensions)+len(p.Paths)) + for k, v := range p.Extensions { + if internal.IsExtensionKey(k) { + m[k] = v + } + } + for k, v := range p.Paths { + if strings.HasPrefix(k, "/") { + m[k] = v + } + } + return opts.MarshalNext(enc, m) +} diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go index 1405bfd8ee..775b3b0c36 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go @@ -21,6 +21,8 @@ import ( "path/filepath" "github.com/go-openapi/jsonreference" + + "k8s.io/kube-openapi/pkg/internal" ) // Refable is a struct for things that accept a $ref property @@ -149,19 +151,5 @@ func (r *Ref) UnmarshalJSON(d []byte) error { } func (r *Ref) fromMap(v map[string]interface{}) error { - if v == nil { - return nil - } - - if vv, ok := v["$ref"]; ok { - if str, ok := vv.(string); ok { - ref, err := jsonreference.New(str) - if err != nil { - return err - } - *r = Ref{Ref: ref} - } - } - - return nil + return internal.JSONRefFromMap(&r.Ref, v) } diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go index f01364b75c..3ff1fe1322 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go @@ -30,6 +30,15 @@ type ResponseProps struct { Examples map[string]interface{} `json:"examples,omitempty"` } +// Marshaling structure only, always edit along with corresponding +// struct (or compilation will fail). +type responsePropsOmitZero struct { + Description string `json:"description,omitempty"` + Schema *Schema `json:"schema,omitzero"` + Headers map[string]Header `json:"headers,omitempty"` + Examples map[string]interface{} `json:"examples,omitempty"` +} + // Response describes a single response from an API Operation. // // For more information: http://goo.gl/8us55a#responseObject @@ -68,23 +77,20 @@ func (r *Response) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.D return err } - r.Extensions = x.Extensions - r.ResponseProps = x.ResponseProps - - if err := r.Refable.Ref.fromMap(r.Extensions); err != nil { + if err := r.Refable.Ref.fromMap(x.Extensions); err != nil { return err } - - r.Extensions.sanitize() - if len(r.Extensions) == 0 { - r.Extensions = nil - } + r.Extensions = internal.SanitizeExtensions(x.Extensions) + r.ResponseProps = x.ResponseProps return nil } // MarshalJSON converts this items object to JSON func (r Response) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(r) + } b1, err := json.Marshal(r.ResponseProps) if err != nil { return nil, err @@ -100,6 +106,18 @@ func (r Response) MarshalJSON() ([]byte, error) { return swag.ConcatJSON(b1, b2, b3), nil } +func (r Response) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + Ref string `json:"$ref,omitempty"` + Extensions + ResponseProps responsePropsOmitZero `json:",inline"` + } + x.Ref = r.Refable.Ref.String() + x.Extensions = internal.SanitizeExtensions(r.Extensions) + x.ResponseProps = responsePropsOmitZero(r.ResponseProps) + return opts.MarshalNext(enc, x) +} + // NewResponse creates a new response instance func NewResponse() *Response { return new(Response) diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go index c3fa68191d..d9ad760a43 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go @@ -63,6 +63,9 @@ func (r *Responses) UnmarshalJSON(data []byte) error { // MarshalJSON converts this items object to JSON func (r Responses) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(r) + } b1, err := json.Marshal(r.ResponsesProps) if err != nil { return nil, err @@ -75,6 +78,25 @@ func (r Responses) MarshalJSON() ([]byte, error) { return concated, nil } +func (r Responses) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + type ArbitraryKeys map[string]interface{} + var x struct { + ArbitraryKeys + Default *Response `json:"default,omitempty"` + } + x.ArbitraryKeys = make(map[string]any, len(r.Extensions)+len(r.StatusCodeResponses)) + for k, v := range r.Extensions { + if internal.IsExtensionKey(k) { + x.ArbitraryKeys[k] = v + } + } + for k, v := range r.StatusCodeResponses { + x.ArbitraryKeys[strconv.Itoa(k)] = v + } + x.Default = r.Default + return opts.MarshalNext(enc, x) +} + // ResponsesProps describes all responses for an operation. // It tells what is the default response and maps all responses with a // HTTP status code. @@ -148,7 +170,7 @@ func (r *Responses) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2. return nil } switch k := tok.String(); { - case isExtensionKey(k): + case internal.IsExtensionKey(k): ext = nil if err := opts.UnmarshalNext(dec, &ext); err != nil { return err diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/schema.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/schema.go index 9add0c163d..dfbb2e05cb 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/schema.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/schema.go @@ -196,6 +196,46 @@ type SchemaProps struct { Definitions Definitions `json:"definitions,omitempty"` } +// Marshaling structure only, always edit along with corresponding +// struct (or compilation will fail). +type schemaPropsOmitZero struct { + ID string `json:"id,omitempty"` + Ref Ref `json:"-"` + Schema SchemaURL `json:"-"` + Description string `json:"description,omitempty"` + Type StringOrArray `json:"type,omitzero"` + Nullable bool `json:"nullable,omitzero"` + Format string `json:"format,omitempty"` + Title string `json:"title,omitempty"` + Default interface{} `json:"default,omitzero"` + Maximum *float64 `json:"maximum,omitempty"` + ExclusiveMaximum bool `json:"exclusiveMaximum,omitzero"` + Minimum *float64 `json:"minimum,omitempty"` + ExclusiveMinimum bool `json:"exclusiveMinimum,omitzero"` + MaxLength *int64 `json:"maxLength,omitempty"` + MinLength *int64 `json:"minLength,omitempty"` + Pattern string `json:"pattern,omitempty"` + MaxItems *int64 `json:"maxItems,omitempty"` + MinItems *int64 `json:"minItems,omitempty"` + UniqueItems bool `json:"uniqueItems,omitzero"` + MultipleOf *float64 `json:"multipleOf,omitempty"` + Enum []interface{} `json:"enum,omitempty"` + MaxProperties *int64 `json:"maxProperties,omitempty"` + MinProperties *int64 `json:"minProperties,omitempty"` + Required []string `json:"required,omitempty"` + Items *SchemaOrArray `json:"items,omitzero"` + AllOf []Schema `json:"allOf,omitempty"` + OneOf []Schema `json:"oneOf,omitempty"` + AnyOf []Schema `json:"anyOf,omitempty"` + Not *Schema `json:"not,omitzero"` + Properties map[string]Schema `json:"properties,omitempty"` + AdditionalProperties *SchemaOrBool `json:"additionalProperties,omitzero"` + PatternProperties map[string]Schema `json:"patternProperties,omitempty"` + Dependencies Dependencies `json:"dependencies,omitempty"` + AdditionalItems *SchemaOrBool `json:"additionalItems,omitzero"` + Definitions Definitions `json:"definitions,omitempty"` +} + // SwaggerSchemaProps are additional properties supported by swagger schemas, but not JSON-schema (draft 4) type SwaggerSchemaProps struct { Discriminator string `json:"discriminator,omitempty"` @@ -204,6 +244,15 @@ type SwaggerSchemaProps struct { Example interface{} `json:"example,omitempty"` } +// Marshaling structure only, always edit along with corresponding +// struct (or compilation will fail). +type swaggerSchemaPropsOmitZero struct { + Discriminator string `json:"discriminator,omitempty"` + ReadOnly bool `json:"readOnly,omitzero"` + ExternalDocs *ExternalDocumentation `json:"externalDocs,omitzero"` + Example interface{} `json:"example,omitempty"` +} + // Schema the schema object allows the definition of input and output data types. // These types can be objects, but also primitives and arrays. // This object is based on the [JSON Schema Specification Draft 4](http://json-schema.org/) @@ -434,6 +483,9 @@ func (s *Schema) WithExternalDocs(description, url string) *Schema { // MarshalJSON marshal this to JSON func (s Schema) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(s) + } b1, err := json.Marshal(s.SchemaProps) if err != nil { return nil, fmt.Errorf("schema props %v", err) @@ -465,6 +517,31 @@ func (s Schema) MarshalJSON() ([]byte, error) { return swag.ConcatJSON(b1, b2, b3, b4, b5, b6), nil } +func (s Schema) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + type ArbitraryKeys map[string]interface{} + var x struct { + ArbitraryKeys + SchemaProps schemaPropsOmitZero `json:",inline"` + SwaggerSchemaProps swaggerSchemaPropsOmitZero `json:",inline"` + Schema string `json:"$schema,omitempty"` + Ref string `json:"$ref,omitempty"` + } + x.ArbitraryKeys = make(map[string]any, len(s.Extensions)+len(s.ExtraProps)) + for k, v := range s.Extensions { + if internal.IsExtensionKey(k) { + x.ArbitraryKeys[k] = v + } + } + for k, v := range s.ExtraProps { + x.ArbitraryKeys[k] = v + } + x.SchemaProps = schemaPropsOmitZero(s.SchemaProps) + x.SwaggerSchemaProps = swaggerSchemaPropsOmitZero(s.SwaggerSchemaProps) + x.Ref = s.Ref.String() + x.Schema = string(s.Schema) + return opts.MarshalNext(enc, x) +} + // UnmarshalJSON marshal this from JSON func (s *Schema) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { @@ -547,7 +624,7 @@ func (s *Schema) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Dec } s.ExtraProps = x.Extensions.sanitizeWithExtra() - s.VendorExtensible.Extensions = x.Extensions + s.Extensions = internal.SanitizeExtensions(x.Extensions) s.SchemaProps = x.SchemaProps s.SwaggerSchemaProps = x.SwaggerSchemaProps return nil diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go index 34723fb715..e2b7da14cf 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go @@ -18,6 +18,7 @@ import ( "encoding/json" "github.com/go-openapi/swag" + "k8s.io/kube-openapi/pkg/internal" jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json" ) @@ -45,6 +46,9 @@ type SecurityScheme struct { // MarshalJSON marshal this to JSON func (s SecurityScheme) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(s) + } b1, err := json.Marshal(s.SecuritySchemeProps) if err != nil { return nil, err @@ -56,6 +60,16 @@ func (s SecurityScheme) MarshalJSON() ([]byte, error) { return swag.ConcatJSON(b1, b2), nil } +func (s SecurityScheme) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + Extensions + SecuritySchemeProps + } + x.Extensions = internal.SanitizeExtensions(s.Extensions) + x.SecuritySchemeProps = s.SecuritySchemeProps + return opts.MarshalNext(enc, x) +} + // UnmarshalJSON marshal this from JSON func (s *SecurityScheme) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &s.SecuritySchemeProps); err != nil { @@ -72,11 +86,7 @@ func (s *SecurityScheme) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *js if err := opts.UnmarshalNext(dec, &x); err != nil { return err } - x.Extensions.sanitize() - if len(x.Extensions) == 0 { - x.Extensions = nil - } - s.VendorExtensible.Extensions = x.Extensions + s.Extensions = internal.SanitizeExtensions(x.Extensions) s.SecuritySchemeProps = x.SecuritySchemeProps return nil } diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/swagger.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/swagger.go index f6cb7da3f2..c8f3beaa35 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/swagger.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/swagger.go @@ -35,6 +35,9 @@ type Swagger struct { // MarshalJSON marshals this swagger structure to json func (s Swagger) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(s) + } b1, err := json.Marshal(s.SwaggerProps) if err != nil { return nil, err @@ -46,12 +49,22 @@ func (s Swagger) MarshalJSON() ([]byte, error) { return swag.ConcatJSON(b1, b2), nil } +// MarshalJSON marshals this swagger structure to json +func (s Swagger) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + Extensions + SwaggerProps + } + x.Extensions = internal.SanitizeExtensions(s.Extensions) + x.SwaggerProps = s.SwaggerProps + return opts.MarshalNext(enc, x) +} + // UnmarshalJSON unmarshals a swagger spec from json func (s *Swagger) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { return jsonv2.Unmarshal(data, s) } - var sw Swagger if err := json.Unmarshal(data, &sw.SwaggerProps); err != nil { return err @@ -75,15 +88,8 @@ func (s *Swagger) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.De if err := opts.UnmarshalNext(dec, &x); err != nil { return err } - - s.Extensions = x.Extensions + s.Extensions = internal.SanitizeExtensions(x.Extensions) s.SwaggerProps = x.SwaggerProps - - s.Extensions.sanitize() - if len(s.Extensions) == 0 { - s.Extensions = nil - } - return nil } @@ -126,6 +132,9 @@ var jsFalse = []byte("false") // MarshalJSON convert this object to JSON func (s SchemaOrBool) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(s) + } if s.Schema != nil { return json.Marshal(s.Schema) } @@ -136,6 +145,18 @@ func (s SchemaOrBool) MarshalJSON() ([]byte, error) { return jsTrue, nil } +// MarshalJSON convert this object to JSON +func (s SchemaOrBool) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + if s.Schema != nil { + return opts.MarshalNext(enc, s.Schema) + } + + if s.Schema == nil && !s.Allows { + return enc.WriteToken(jsonv2.False) + } + return enc.WriteToken(jsonv2.True) +} + // UnmarshalJSON converts this bool or schema object from a JSON structure func (s *SchemaOrBool) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { @@ -143,15 +164,15 @@ func (s *SchemaOrBool) UnmarshalJSON(data []byte) error { } var nw SchemaOrBool - if len(data) >= 4 { - if data[0] == '{' { - var sch Schema - if err := json.Unmarshal(data, &sch); err != nil { - return err - } - nw.Schema = &sch + if len(data) > 0 && data[0] == '{' { + var sch Schema + if err := json.Unmarshal(data, &sch); err != nil { + return err } - nw.Allows = !(data[0] == 'f' && data[1] == 'a' && data[2] == 'l' && data[3] == 's' && data[4] == 'e') + nw.Schema = &sch + nw.Allows = true + } else { + json.Unmarshal(data, &nw.Allows) } *s = nw return nil @@ -185,6 +206,9 @@ type SchemaOrStringArray struct { // MarshalJSON converts this schema object or array into JSON structure func (s SchemaOrStringArray) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(s) + } if len(s.Property) > 0 { return json.Marshal(s.Property) } @@ -194,6 +218,17 @@ func (s SchemaOrStringArray) MarshalJSON() ([]byte, error) { return []byte("null"), nil } +// MarshalJSON converts this schema object or array into JSON structure +func (s SchemaOrStringArray) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + if len(s.Property) > 0 { + return opts.MarshalNext(enc, s.Property) + } + if s.Schema != nil { + return opts.MarshalNext(enc, s.Schema) + } + return enc.WriteToken(jsonv2.Null) +} + // UnmarshalJSON converts this schema object or array from a JSON structure func (s *SchemaOrStringArray) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { @@ -347,12 +382,23 @@ func (s *SchemaOrArray) ContainsType(name string) bool { // MarshalJSON converts this schema object or array into JSON structure func (s SchemaOrArray) MarshalJSON() ([]byte, error) { - if len(s.Schemas) > 0 { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(s) + } + if s.Schemas != nil { return json.Marshal(s.Schemas) } return json.Marshal(s.Schema) } +// MarshalJSON converts this schema object or array into JSON structure +func (s SchemaOrArray) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + if s.Schemas != nil { + return opts.MarshalNext(enc, s.Schemas) + } + return opts.MarshalNext(enc, s.Schema) +} + // UnmarshalJSON converts this schema object or array from a JSON structure func (s *SchemaOrArray) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go b/vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go index 69e93b60bd..d105d52ca4 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go @@ -41,6 +41,9 @@ type Tag struct { // MarshalJSON marshal this to JSON func (t Tag) MarshalJSON() ([]byte, error) { + if internal.UseOptimizedJSONMarshaling { + return internal.DeterministicMarshal(t) + } b1, err := json.Marshal(t.TagProps) if err != nil { return nil, err @@ -52,6 +55,16 @@ func (t Tag) MarshalJSON() ([]byte, error) { return swag.ConcatJSON(b1, b2), nil } +func (t Tag) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error { + var x struct { + Extensions + TagProps + } + x.Extensions = internal.SanitizeExtensions(t.Extensions) + x.TagProps = t.TagProps + return opts.MarshalNext(enc, x) +} + // UnmarshalJSON marshal this from JSON func (t *Tag) UnmarshalJSON(data []byte) error { if internal.UseOptimizedJSONUnmarshaling { @@ -72,11 +85,7 @@ func (t *Tag) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decode if err := opts.UnmarshalNext(dec, &x); err != nil { return err } - x.Extensions.sanitize() - if len(x.Extensions) == 0 { - x.Extensions = nil - } - t.VendorExtensible.Extensions = x.Extensions + t.Extensions = internal.SanitizeExtensions(x.Extensions) t.TagProps = x.TagProps return nil } diff --git a/vendor/k8s.io/utils/lru/lru.go b/vendor/k8s.io/utils/lru/lru.go index 5d0077abfb..47f1352813 100644 --- a/vendor/k8s.io/utils/lru/lru.go +++ b/vendor/k8s.io/utils/lru/lru.go @@ -5,7 +5,7 @@ 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 + 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, @@ -22,6 +22,7 @@ import ( ) type Key = groupcache.Key +type EvictionFunc = func(key Key, value interface{}) // Cache is a thread-safe fixed size LRU cache. type Cache struct { @@ -36,6 +37,13 @@ func New(size int) *Cache { } } +// NewWithEvictionFunc creates an LRU of the given size with the given eviction func. +func NewWithEvictionFunc(size int, f EvictionFunc) *Cache { + c := New(size) + c.cache.OnEvicted = f + return c +} + // Add adds a value to the cache. func (c *Cache) Add(key Key, value interface{}) { c.lock.Lock() diff --git a/vendor/knative.dev/eventing/pkg/apis/duck/v1/delivery_types.go b/vendor/knative.dev/eventing/pkg/apis/duck/v1/delivery_types.go index 49c26ced5d..2c0306f200 100644 --- a/vendor/knative.dev/eventing/pkg/apis/duck/v1/delivery_types.go +++ b/vendor/knative.dev/eventing/pkg/apis/duck/v1/delivery_types.go @@ -154,4 +154,26 @@ type DeliveryStatus struct { // where failed events are sent to. // +optional DeadLetterSinkURI *apis.URL `json:"deadLetterSinkUri,omitempty"` + // DeadLetterSinkCACerts are Certification Authority (CA) certificates in PEM format + // according to https://www.rfc-editor.org/rfc/rfc7468. + // +optional + DeadLetterSinkCACerts *string `json:"deadLetterSinkCACerts,omitempty"` +} + +func (ds *DeliveryStatus) IsSet() bool { + return ds.DeadLetterSinkURI != nil +} + +func NewDeliveryStatusFromAddressable(addr *duckv1.Addressable) DeliveryStatus { + return DeliveryStatus{ + DeadLetterSinkURI: addr.URL, + DeadLetterSinkCACerts: addr.CACerts, + } +} + +func NewDestinationFromDeliveryStatus(status DeliveryStatus) duckv1.Destination { + return duckv1.Destination{ + URI: status.DeadLetterSinkURI, + CACerts: status.DeadLetterSinkCACerts, + } } diff --git a/vendor/knative.dev/eventing/pkg/apis/duck/v1/subscribable_types.go b/vendor/knative.dev/eventing/pkg/apis/duck/v1/subscribable_types.go index a56dd79c39..4d95248ff3 100644 --- a/vendor/knative.dev/eventing/pkg/apis/duck/v1/subscribable_types.go +++ b/vendor/knative.dev/eventing/pkg/apis/duck/v1/subscribable_types.go @@ -42,9 +42,19 @@ type SubscriberSpec struct { // SubscriberURI is the endpoint for the subscriber // +optional SubscriberURI *apis.URL `json:"subscriberUri,omitempty"` + // SubscriberCACerts is the Certification Authority (CA) certificates in PEM + // format according to https://www.rfc-editor.org/rfc/rfc7468 for the + // subscriberUri + // +optional + SubscriberCACerts *string `json:"subscriberCACerts,omitempty"` // ReplyURI is the endpoint for the reply // +optional ReplyURI *apis.URL `json:"replyUri,omitempty"` + // ReplyCACerts is the Certification Authority (CA) certificates in PEM + // format according to https://www.rfc-editor.org/rfc/rfc7468 for the + // replyUri. + // +optional + ReplyCACerts *string `json:"replyCACerts,omitempty"` // +optional // DeliverySpec contains options controlling the event delivery // +optional diff --git a/vendor/knative.dev/eventing/pkg/apis/duck/v1/zz_generated.deepcopy.go b/vendor/knative.dev/eventing/pkg/apis/duck/v1/zz_generated.deepcopy.go index d91a3ff628..5dd4986c74 100644 --- a/vendor/knative.dev/eventing/pkg/apis/duck/v1/zz_generated.deepcopy.go +++ b/vendor/knative.dev/eventing/pkg/apis/duck/v1/zz_generated.deepcopy.go @@ -184,6 +184,11 @@ func (in *DeliveryStatus) DeepCopyInto(out *DeliveryStatus) { *out = new(apis.URL) (*in).DeepCopyInto(*out) } + if in.DeadLetterSinkCACerts != nil { + in, out := &in.DeadLetterSinkCACerts, &out.DeadLetterSinkCACerts + *out = new(string) + **out = **in + } return } @@ -310,11 +315,21 @@ func (in *SubscriberSpec) DeepCopyInto(out *SubscriberSpec) { *out = new(apis.URL) (*in).DeepCopyInto(*out) } + if in.SubscriberCACerts != nil { + in, out := &in.SubscriberCACerts, &out.SubscriberCACerts + *out = new(string) + **out = **in + } if in.ReplyURI != nil { in, out := &in.ReplyURI, &out.ReplyURI *out = new(apis.URL) (*in).DeepCopyInto(*out) } + if in.ReplyCACerts != nil { + in, out := &in.ReplyCACerts, &out.ReplyCACerts + *out = new(string) + **out = **in + } if in.Delivery != nil { in, out := &in.Delivery, &out.Delivery *out = new(DeliverySpec) diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/register.go b/vendor/knative.dev/eventing/pkg/apis/eventing/register.go index e90be84184..38141c583c 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/register.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/register.go @@ -60,6 +60,12 @@ const ( // annotation key used to specify the address of its channel. BrokerChannelAddressStatusAnnotationKey = "knative.dev/channelAddress" + // BrokerChannelCACertsStatusAnnotationKey is the broker status annotation + // key used to specify the channels Certification Authority (CA) + // certificates in PEM format according to + // https://www.rfc-editor.org/rfc/rfc7468 + BrokerChannelCACertsStatusAnnotationKey = "knative.dev/channelCACerts" + // BrokerChannelAPIVersionStatusAnnotationKey is the broker status // annotation key used to specify the APIVersion of the channel for // the triggers to subscribe to. diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_lifecycle.go index e85f12ed80..ebe569271e 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_lifecycle.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1/broker_lifecycle.go @@ -21,6 +21,8 @@ import ( "knative.dev/pkg/apis" v1 "knative.dev/pkg/apis/duck/v1" + + eventingduck "knative.dev/eventing/pkg/apis/duck/v1" ) const ( @@ -104,17 +106,17 @@ func (bs *BrokerStatus) InitializeConditions() { bs.GetConditionSet().Manage(bs).InitializeConditions() } -func (bs *BrokerStatus) MarkDeadLetterSinkResolvedSucceeded(deadLetterSinkURI *apis.URL) { - bs.DeadLetterSinkURI = deadLetterSinkURI +func (bs *BrokerStatus) MarkDeadLetterSinkResolvedSucceeded(deadLetterSink eventingduck.DeliveryStatus) { + bs.DeliveryStatus = deadLetterSink bs.GetConditionSet().Manage(bs).MarkTrue(BrokerConditionDeadLetterSinkResolved) } func (bs *BrokerStatus) MarkDeadLetterSinkNotConfigured() { - bs.DeadLetterSinkURI = nil + bs.DeliveryStatus = eventingduck.DeliveryStatus{} bs.GetConditionSet().Manage(bs).MarkTrueWithReason(BrokerConditionDeadLetterSinkResolved, "DeadLetterSinkNotConfigured", "No dead letter sink is configured.") } func (bs *BrokerStatus) MarkDeadLetterSinkResolvedFailed(reason, messageFormat string, messageA ...interface{}) { - bs.DeadLetterSinkURI = nil + bs.DeliveryStatus = eventingduck.DeliveryStatus{} bs.GetConditionSet().Manage(bs).MarkFalse(BrokerConditionDeadLetterSinkResolved, reason, messageFormat, messageA...) } diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1/test_helper.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1/test_helper.go index 5082c9a2fc..80b2510009 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1/test_helper.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1/test_helper.go @@ -19,10 +19,11 @@ package v1 import ( corev1 "k8s.io/api/core/v1" - eventingduckv1 "knative.dev/eventing/pkg/apis/duck/v1" - messagingv1 "knative.dev/eventing/pkg/apis/messaging/v1" "knative.dev/pkg/apis" duckv1 "knative.dev/pkg/apis/duck/v1" + + eventingduckv1 "knative.dev/eventing/pkg/apis/duck/v1" + messagingv1 "knative.dev/eventing/pkg/apis/messaging/v1" ) type testHelper struct{} @@ -61,7 +62,7 @@ func (t testHelper) ReadyBrokerStatus() *BrokerStatus { bs.PropagateTriggerChannelReadiness(t.ReadyChannelStatus()) bs.PropagateFilterAvailability(t.AvailableEndpoints()) bs.SetAddress(apis.HTTP("example.com")) - bs.MarkDeadLetterSinkResolvedSucceeded(nil) + bs.MarkDeadLetterSinkResolvedSucceeded(eventingduckv1.DeliveryStatus{}) return bs } diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_conversion.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_conversion.go index 663c82335c..b3e0ae6ba9 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_conversion.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_conversion.go @@ -19,6 +19,8 @@ package v1beta1 import ( "context" + duckv1 "knative.dev/pkg/apis/duck/v1" + "knative.dev/eventing/pkg/apis/eventing/v1beta2" "knative.dev/pkg/apis" @@ -37,10 +39,24 @@ func (source *EventType) ConvertTo(ctx context.Context, obj apis.Convertible) er Source: source.Spec.Source, Schema: source.Spec.Schema, SchemaData: source.Spec.SchemaData, - Broker: source.Spec.Broker, Description: source.Spec.Description, } + // for old stuff, we play nice here + // default to broker, but as a reference + if source.Spec.Reference == nil && source.Spec.Broker != "" { + sink.Spec.Reference = &duckv1.KReference{ + APIVersion: "eventing.knative.dev/v1", + Kind: "Broker", + Name: source.Spec.Broker, + } + } + + // if we have a reference, use it + if source.Spec.Reference != nil { + sink.Spec.Reference = source.Spec.Reference + } + return nil default: return apis.ConvertToViaProxy(ctx, source, &v1beta2.EventType{}, sink) @@ -61,7 +77,7 @@ func (sink *EventType) ConvertFrom(ctx context.Context, obj apis.Convertible) er Source: source.Spec.Source, Schema: source.Spec.Schema, SchemaData: source.Spec.SchemaData, - Broker: source.Spec.Broker, + Reference: source.Spec.Reference, Description: source.Spec.Description, } diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_defaults.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_defaults.go index bdcfbf3573..115df98d46 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_defaults.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_defaults.go @@ -23,7 +23,7 @@ func (et *EventType) SetDefaults(ctx context.Context) { } func (ets *EventTypeSpec) SetDefaults(ctx context.Context) { - if ets.Broker == "" { + if ets.Reference == nil && ets.Broker == "" { ets.Broker = "default" } } diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_types.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_types.go index 648be1c089..0c3fd2e8ef 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_types.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/eventtype_types.go @@ -41,7 +41,6 @@ type EventType struct { // Status represents the current state of the EventType. // This data may be out of date. // +optional - // TODO might be removed https://github.com/knative/eventing/issues/2750 Status EventTypeStatus `json:"status,omitempty"` } @@ -77,10 +76,13 @@ type EventTypeSpec struct { // The contents are not validated or manipulated by the system. // +optional SchemaData string `json:"schemaData,omitempty"` - // TODO remove https://github.com/knative/eventing/issues/2750 // Broker refers to the Broker that can provide the EventType. // +optional Broker string `json:"broker,omitempty"` + // Reference is a KReference to the belonging addressable. + // For example, this could be a pointer to a Broker. + // +optional + Reference *duckv1.KReference `json:"reference,omitempty"` // Description is an optional field used to describe the EventType, in any meaningful way. // +optional Description string `json:"description,omitempty"` diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/zz_generated.deepcopy.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/zz_generated.deepcopy.go index 20ea81675b..381fbe4f51 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/zz_generated.deepcopy.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta1/zz_generated.deepcopy.go @@ -24,6 +24,7 @@ package v1beta1 import ( runtime "k8s.io/apimachinery/pkg/runtime" apis "knative.dev/pkg/apis" + v1 "knative.dev/pkg/apis/duck/v1" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -100,6 +101,11 @@ func (in *EventTypeSpec) DeepCopyInto(out *EventTypeSpec) { *out = new(apis.URL) (*in).DeepCopyInto(*out) } + if in.Reference != nil { + in, out := &in.Reference, &out.Reference + *out = new(v1.KReference) + (*in).DeepCopyInto(*out) + } return } diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_defaults.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_defaults.go index 67ae41c885..02b6f0f2a3 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_defaults.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_defaults.go @@ -16,14 +16,20 @@ limitations under the License. package v1beta2 -import "context" +import ( + "context" +) func (et *EventType) SetDefaults(ctx context.Context) { et.Spec.SetDefaults(ctx) + setReferenceNs(et) } func (ets *EventTypeSpec) SetDefaults(ctx context.Context) { - if ets.Broker == "" { - ets.Broker = "default" +} + +func setReferenceNs(et *EventType) { + if et.Spec.Reference != nil && et.Spec.Reference.Namespace == "" { + et.Spec.Reference.Namespace = et.GetNamespace() } } diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_lifecycle.go index a8e1bfe846..300114a8cf 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_lifecycle.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_lifecycle.go @@ -17,18 +17,14 @@ limitations under the License. package v1beta2 import ( - corev1 "k8s.io/api/core/v1" - - eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1" "knative.dev/pkg/apis" ) -var eventTypeCondSet = apis.NewLivingConditionSet(EventTypeConditionBrokerExists, EventTypeConditionBrokerReady) +var eventTypeCondSet = apis.NewLivingConditionSet(EventTypeConditionReferenceExists) const ( - EventTypeConditionReady = apis.ConditionReady - EventTypeConditionBrokerExists apis.ConditionType = "BrokerExists" - EventTypeConditionBrokerReady apis.ConditionType = "BrokerReady" + EventTypeConditionReady = apis.ConditionReady + EventTypeConditionReferenceExists apis.ConditionType = "ReferenceExists" ) // GetConditionSet retrieves the condition set for this resource. Implements the KRShaped interface. @@ -56,49 +52,14 @@ func (et *EventTypeStatus) InitializeConditions() { eventTypeCondSet.Manage(et).InitializeConditions() } -func (et *EventTypeStatus) MarkBrokerExists() { - eventTypeCondSet.Manage(et).MarkTrue(EventTypeConditionBrokerExists) -} - -func (et *EventTypeStatus) MarkBrokerDoesNotExist() { - eventTypeCondSet.Manage(et).MarkFalse(EventTypeConditionBrokerExists, "BrokerDoesNotExist", "Broker does not exist") -} - -func (et *EventTypeStatus) MarkBrokerExistsUnknown(reason, messageFormat string, messageA ...interface{}) { - eventTypeCondSet.Manage(et).MarkUnknown(EventTypeConditionBrokerExists, reason, messageFormat, messageA...) -} - -func (et *EventTypeStatus) MarkBrokerReady() { - eventTypeCondSet.Manage(et).MarkTrue(EventTypeConditionBrokerReady) -} - -func (et *EventTypeStatus) MarkBrokerFailed(reason, messageFormat string, messageA ...interface{}) { - eventTypeCondSet.Manage(et).MarkFalse(EventTypeConditionBrokerReady, reason, messageFormat, messageA...) -} - -func (et *EventTypeStatus) MarkBrokerUnknown(reason, messageFormat string, messageA ...interface{}) { - eventTypeCondSet.Manage(et).MarkUnknown(EventTypeConditionBrokerReady, reason, messageFormat, messageA...) +func (et *EventTypeStatus) MarkReferenceExists() { + eventTypeCondSet.Manage(et).MarkTrue(EventTypeConditionReferenceExists) } -func (et *EventTypeStatus) MarkBrokerNotConfigured() { - eventTypeCondSet.Manage(et).MarkUnknown(EventTypeConditionBrokerReady, - "BrokerNotConfigured", "Broker has not yet been reconciled.") +func (et *EventTypeStatus) MarkReferenceDoesNotExist() { + eventTypeCondSet.Manage(et).MarkFalse(EventTypeConditionReferenceExists, "ResourceDoesNotExist", "Resource in spec.reference does not exist") } -func (et *EventTypeStatus) PropagateBrokerStatus(bs *eventingv1.BrokerStatus) { - bc := bs.GetConditionSet().Manage(bs).GetTopLevelCondition() - if bc == nil { - et.MarkBrokerNotConfigured() - return - } - switch { - case bc.Status == corev1.ConditionUnknown: - et.MarkBrokerUnknown(bc.Reason, bc.Message) - case bc.Status == corev1.ConditionTrue: - eventTypeCondSet.Manage(et).MarkTrue(EventTypeConditionBrokerReady) - case bc.Status == corev1.ConditionFalse: - et.MarkBrokerFailed(bc.Reason, bc.Message) - default: - et.MarkBrokerUnknown("BrokerUnknown", "The status of Broker is invalid: %v", bc.Status) - } +func (et *EventTypeStatus) MarkReferenceExistsUnknown(reason, messageFormat string, messageA ...interface{}) { + eventTypeCondSet.Manage(et).MarkUnknown(EventTypeConditionReferenceExists, reason, messageFormat, messageA...) } diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_types.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_types.go index e182e2d813..8356aa3583 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_types.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/eventtype_types.go @@ -41,7 +41,6 @@ type EventType struct { // Status represents the current state of the EventType. // This data may be out of date. // +optional - // TODO might be removed https://github.com/knative/eventing/issues/2750 Status EventTypeStatus `json:"status,omitempty"` } @@ -77,10 +76,14 @@ type EventTypeSpec struct { // The contents are not validated or manipulated by the system. // +optional SchemaData string `json:"schemaData,omitempty"` - // TODO remove https://github.com/knative/eventing/issues/2750 // Broker refers to the Broker that can provide the EventType. + // Deprecated: This field is deprecated and will be removed in a future release. // +optional Broker string `json:"broker,omitempty"` + // Reference is a KReference to the belonging addressable. + //For example, this could be a pointer to a Broker. + // +optional + Reference *duckv1.KReference `json:"reference,omitempty"` // Description is an optional field used to describe the EventType, in any meaningful way. // +optional Description string `json:"description,omitempty"` diff --git a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/zz_generated.deepcopy.go b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/zz_generated.deepcopy.go index 3163151d70..c3e2eb977a 100644 --- a/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/zz_generated.deepcopy.go +++ b/vendor/knative.dev/eventing/pkg/apis/eventing/v1beta2/zz_generated.deepcopy.go @@ -24,6 +24,7 @@ package v1beta2 import ( runtime "k8s.io/apimachinery/pkg/runtime" apis "knative.dev/pkg/apis" + v1 "knative.dev/pkg/apis/duck/v1" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -100,6 +101,11 @@ func (in *EventTypeSpec) DeepCopyInto(out *EventTypeSpec) { *out = new(apis.URL) (*in).DeepCopyInto(*out) } + if in.Reference != nil { + in, out := &in.Reference, &out.Reference + *out = new(v1.KReference) + (*in).DeepCopyInto(*out) + } return } diff --git a/vendor/knative.dev/eventing/pkg/apis/feature/features.go b/vendor/knative.dev/eventing/pkg/apis/feature/features.go index 22e1378cae..b80542945e 100644 --- a/vendor/knative.dev/eventing/pkg/apis/feature/features.go +++ b/vendor/knative.dev/eventing/pkg/apis/feature/features.go @@ -76,6 +76,10 @@ func (e Flags) IsDisabledTransportEncryption() bool { return e != nil && e[TransportEncryption] == Disabled } +func (e Flags) String() string { + return fmt.Sprintf("%+v", map[string]Flag(e)) +} + // NewFlagsConfigFromMap creates a Flags from the supplied Map func NewFlagsConfigFromMap(data map[string]string) (Flags, error) { flags := Flags{} diff --git a/vendor/knative.dev/eventing/pkg/apis/feature/flag_names.go b/vendor/knative.dev/eventing/pkg/apis/feature/flag_names.go index d8dccea6de..e546aed32c 100644 --- a/vendor/knative.dev/eventing/pkg/apis/feature/flag_names.go +++ b/vendor/knative.dev/eventing/pkg/apis/feature/flag_names.go @@ -23,4 +23,5 @@ const ( KReferenceMapping = "kreference-mapping" NewTriggerFilters = "new-trigger-filters" TransportEncryption = "transport-encryption" + EvenTypeAutoCreate = "eventtype-auto-create" ) diff --git a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/channel_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/channel_lifecycle.go index 40aa084b45..2936a1f194 100644 --- a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/channel_lifecycle.go +++ b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/channel_lifecycle.go @@ -19,9 +19,10 @@ package v1 import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" - eventingduck "knative.dev/eventing/pkg/apis/duck/v1" "knative.dev/pkg/apis" duckv1 "knative.dev/pkg/apis/duck/v1" + + eventingduck "knative.dev/eventing/pkg/apis/duck/v1" ) var chCondSet = apis.NewLivingConditionSet( @@ -131,17 +132,17 @@ func (cs *ChannelStatus) PropagateStatuses(chs *eventingduck.ChannelableStatus) cs.SubscribableStatus = chs.SubscribableStatus } -func (cs *ChannelStatus) MarkDeadLetterSinkResolvedSucceeded(deadLetterSinkURI *apis.URL) { - cs.DeliveryStatus.DeadLetterSinkURI = deadLetterSinkURI +func (cs *ChannelStatus) MarkDeadLetterSinkResolvedSucceeded(deadLetterSink eventingduck.DeliveryStatus) { + cs.DeliveryStatus = deadLetterSink chCondSet.Manage(cs).MarkTrue(ChannelConditionDeadLetterSinkResolved) } func (cs *ChannelStatus) MarkDeadLetterSinkNotConfigured() { - cs.DeadLetterSinkURI = nil + cs.DeliveryStatus = eventingduck.DeliveryStatus{} chCondSet.Manage(cs).MarkTrueWithReason(ChannelConditionDeadLetterSinkResolved, "DeadLetterSinkNotConfigured", "No dead letter sink is configured.") } func (cs *ChannelStatus) MarkDeadLetterSinkResolvedFailed(reason, messageFormat string, messageA ...interface{}) { - cs.DeadLetterSinkURI = nil + cs.DeliveryStatus = eventingduck.DeliveryStatus{} chCondSet.Manage(cs).MarkFalse(ChannelConditionDeadLetterSinkResolved, reason, messageFormat, messageA...) } diff --git a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go index 1594a8a38f..6be9e29f33 100644 --- a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go +++ b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/in_memory_channel_lifecycle.go @@ -23,6 +23,8 @@ import ( "k8s.io/utils/pointer" "knative.dev/pkg/apis" v1 "knative.dev/pkg/apis/duck/v1" + + eventingduck "knative.dev/eventing/pkg/apis/duck/v1" ) var imcCondSet = apis.NewLivingConditionSet( @@ -97,10 +99,10 @@ func (imcs *InMemoryChannelStatus) InitializeConditions() { imcCondSet.Manage(imcs).InitializeConditions() } -func (imcs *InMemoryChannelStatus) SetAddress(url *apis.URL) { - imcs.Address = &v1.Addressable{URL: url} - if url != nil { - imcs.Address.Name = pointer.String(url.Scheme) +func (imcs *InMemoryChannelStatus) SetAddress(addr *v1.Addressable) { + imcs.Address = addr + if addr != nil && addr.URL != nil { + imcs.Address.Name = pointer.String(addr.URL.Scheme) imcCondSet.Manage(imcs).MarkTrue(InMemoryChannelConditionAddressable) } else { imcCondSet.Manage(imcs).MarkFalse(InMemoryChannelConditionAddressable, "emptyHostname", "hostname is the empty string") @@ -166,17 +168,17 @@ func (imcs *InMemoryChannelStatus) MarkEndpointsTrue() { imcCondSet.Manage(imcs).MarkTrue(InMemoryChannelConditionEndpointsReady) } -func (imcs *InMemoryChannelStatus) MarkDeadLetterSinkResolvedSucceeded(deadLetterSinkURI *apis.URL) { - imcs.DeliveryStatus.DeadLetterSinkURI = deadLetterSinkURI +func (imcs *InMemoryChannelStatus) MarkDeadLetterSinkResolvedSucceeded(ds eventingduck.DeliveryStatus) { + imcs.DeliveryStatus = ds imcCondSet.Manage(imcs).MarkTrue(InMemoryChannelConditionDeadLetterSinkResolved) } func (imcs *InMemoryChannelStatus) MarkDeadLetterSinkNotConfigured() { - imcs.DeadLetterSinkURI = nil + imcs.DeliveryStatus = eventingduck.DeliveryStatus{} imcCondSet.Manage(imcs).MarkTrueWithReason(InMemoryChannelConditionDeadLetterSinkResolved, "DeadLetterSinkNotConfigured", "No dead letter sink is configured.") } func (imcs *InMemoryChannelStatus) MarkDeadLetterSinkResolvedFailed(reason, messageFormat string, messageA ...interface{}) { - imcs.DeadLetterSinkURI = nil + imcs.DeliveryStatus = eventingduck.DeliveryStatus{} imcCondSet.Manage(imcs).MarkFalse(InMemoryChannelConditionDeadLetterSinkResolved, reason, messageFormat, messageA...) } diff --git a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/subscription_types.go b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/subscription_types.go index ec80fea20e..8f1c8e1083 100644 --- a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/subscription_types.go +++ b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/subscription_types.go @@ -123,10 +123,22 @@ type SubscriptionStatusPhysicalSubscription struct { // +optional SubscriberURI *apis.URL `json:"subscriberUri,omitempty"` + // SubscriberCACerts is the Certification Authority (CA) certificates in PEM + // format according to https://www.rfc-editor.org/rfc/rfc7468 for the + // resolved URI for spec.subscriber. + // +optional + SubscriberCACerts *string `json:"subscriberCACerts,omitempty"` + // ReplyURI is the fully resolved URI for the spec.reply. // +optional ReplyURI *apis.URL `json:"replyUri,omitempty"` + // ReplyCACerts is the Certification Authority (CA) certificates in PEM + // format according to https://www.rfc-editor.org/rfc/rfc7468 for the + // resolved URI for the spec.reply. + // +optional + ReplyCACerts *string `json:"replyCACerts,omitempty"` + // DeliveryStatus contains a resolved URL to the dead letter sink address, and any other // resolved delivery options. eventingduckv1.DeliveryStatus `json:",inline"` diff --git a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/zz_generated.deepcopy.go b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/zz_generated.deepcopy.go index 9748abdd8b..a400fd2e3c 100644 --- a/vendor/knative.dev/eventing/pkg/apis/messaging/v1/zz_generated.deepcopy.go +++ b/vendor/knative.dev/eventing/pkg/apis/messaging/v1/zz_generated.deepcopy.go @@ -377,11 +377,21 @@ func (in *SubscriptionStatusPhysicalSubscription) DeepCopyInto(out *Subscription *out = new(apis.URL) (*in).DeepCopyInto(*out) } + if in.SubscriberCACerts != nil { + in, out := &in.SubscriberCACerts, &out.SubscriberCACerts + *out = new(string) + **out = **in + } if in.ReplyURI != nil { in, out := &in.ReplyURI, &out.ReplyURI *out = new(apis.URL) (*in).DeepCopyInto(*out) } + if in.ReplyCACerts != nil { + in, out := &in.ReplyCACerts, &out.ReplyCACerts + *out = new(string) + **out = **in + } in.DeliveryStatus.DeepCopyInto(&out.DeliveryStatus) return } diff --git a/vendor/knative.dev/eventing/pkg/apis/sources/v1/apiserver_lifecycle.go b/vendor/knative.dev/eventing/pkg/apis/sources/v1/apiserver_lifecycle.go index e12d8a397c..5b8f5d1e3b 100644 --- a/vendor/knative.dev/eventing/pkg/apis/sources/v1/apiserver_lifecycle.go +++ b/vendor/knative.dev/eventing/pkg/apis/sources/v1/apiserver_lifecycle.go @@ -20,6 +20,7 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" + duckv1 "knative.dev/pkg/apis/duck/v1" "knative.dev/pkg/apis" ) @@ -75,9 +76,10 @@ func (s *ApiServerSourceStatus) InitializeConditions() { } // MarkSink sets the condition that the source has a sink configured. -func (s *ApiServerSourceStatus) MarkSink(uri *apis.URL) { - s.SinkURI = uri - if uri != nil { +func (s *ApiServerSourceStatus) MarkSink(addr *duckv1.Addressable) { + if addr != nil { + s.SinkURI = addr.URL + s.SinkCACerts = addr.CACerts apiserverCondSet.Manage(s).MarkTrue(ApiServerConditionSinkProvided) } else { apiserverCondSet.Manage(s).MarkFalse(ApiServerConditionSinkProvided, "SinkEmpty", "Sink has resolved to empty.%s", "") diff --git a/vendor/knative.dev/hack/README.md b/vendor/knative.dev/hack/README.md index b3ad76c5a7..5dc34c8edd 100644 --- a/vendor/knative.dev/hack/README.md +++ b/vendor/knative.dev/hack/README.md @@ -96,7 +96,7 @@ main "$@" This is a helper script for Knative E2E test scripts. To use it: 1. [optional] Customize the test cluster. Pass the flags as described - [here](../tools/kntest/pkg/kubetest2/gke/README.md) to the `initialize` function + [here](https://github.com/knative/toolbox/blob/main/kntest/pkg/kubetest2/gke/README.md) to the `initialize` function call if the default values don't fit your needs. 1. Source the script. diff --git a/vendor/knative.dev/hack/library.sh b/vendor/knative.dev/hack/library.sh index df9d3f9adc..889de55a55 100644 --- a/vendor/knative.dev/hack/library.sh +++ b/vendor/knative.dev/hack/library.sh @@ -657,7 +657,7 @@ function foreach_go_module() { echo "Command '${cmd}' failed in module $gomod_dir: $failed" >&2 return $failed fi - done < <(go_run knative.dev/test-infra/tools/modscope@latest ls -p) + done < <(go_run knative.dev/toolbox/modscope@latest ls -p) } # Update go deps. @@ -709,7 +709,7 @@ function __go_update_deps_for_module() { else group "Upgrading to release ${RELEASE}" fi - FLOATING_DEPS+=( $(go_run knative.dev/test-infra/buoy@latest float ./go.mod "${buoyArgs[@]}") ) + FLOATING_DEPS+=( $(go_run knative.dev/toolbox/buoy@latest float ./go.mod "${buoyArgs[@]}") ) if [[ ${#FLOATING_DEPS[@]} > 0 ]]; then echo "Floating deps to ${FLOATING_DEPS[@]}" go get -d ${FLOATING_DEPS[@]} @@ -754,7 +754,7 @@ function __go_update_deps_for_module() { # Intended to be used like: # export MODULE_NAME=$(go_mod_module_name) function go_mod_module_name() { - go_run knative.dev/test-infra/tools/modscope@latest current + go_run knative.dev/toolbox/modscope@latest current } # Return a GOPATH to a temp directory. Works around the out-of-GOPATH issues diff --git a/vendor/knative.dev/hack/presubmit-tests.sh b/vendor/knative.dev/hack/presubmit-tests.sh index 1f6f18252e..1c6e5a8dfb 100644 --- a/vendor/knative.dev/hack/presubmit-tests.sh +++ b/vendor/knative.dev/hack/presubmit-tests.sh @@ -139,7 +139,7 @@ function __build_test_runner_for_module() { # Don't merge these two lines, or return code will always be 0. # Get all build tags in go code (ignore /vendor, /hack and /third_party) local tags - tags="$(go run knative.dev/test-infra/tools/go-ls-tags@latest --joiner=,)" + tags="$(go run knative.dev/toolbox/go-ls-tags@latest --joiner=,)" local go_pkg_dirs go_pkg_dirs="$(go list -tags "${tags}" ./...)" || return $? if [[ -z "${go_pkg_dirs}" ]]; then diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/certificate_validation.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/certificate_validation.go index 8d95308446..35787c8d56 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/certificate_validation.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/certificate_validation.go @@ -29,7 +29,7 @@ func (c *Certificate) Validate(ctx context.Context) *apis.FieldError { } // Validate inspects and validates CertificateSpec object. -func (spec *CertificateSpec) Validate(ctx context.Context) (all *apis.FieldError) { +func (spec *CertificateSpec) Validate(_ context.Context) (all *apis.FieldError) { // Spec must have at least one DNS Name. if len(spec.DNSNames) == 0 { all = all.Also(apis.ErrMissingField("dnsNames")) diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_defaults.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_defaults.go index a0cec01269..1d3ff93c81 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_defaults.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_defaults.go @@ -28,5 +28,5 @@ func (d *Domain) SetDefaults(ctx context.Context) { } // SetDefaults populates default values in DomainSpec -func (*DomainSpec) SetDefaults(ctx context.Context) { +func (*DomainSpec) SetDefaults(_ context.Context) { } diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_validation.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_validation.go index d2434e234b..85d5569728 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_validation.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/domain_validation.go @@ -50,7 +50,7 @@ func (ds *DomainSpec) Validate(ctx context.Context) *apis.FieldError { return all } -func (lb *LoadBalancerIngressSpec) Validate(ctx context.Context) *apis.FieldError { +func (lb *LoadBalancerIngressSpec) Validate(_ context.Context) *apis.FieldError { var all *apis.FieldError if lb.Domain == "" && lb.DomainInternal == "" && lb.IP == "" && !lb.MeshOnly { return all.Also(apis.ErrMissingOneOf("domain", "domainInternal", "ip", "meshOnly")) @@ -58,7 +58,7 @@ func (lb *LoadBalancerIngressSpec) Validate(ctx context.Context) *apis.FieldErro return all } -func (cfg *IngressConfig) Validate(ctx context.Context) *apis.FieldError { +func (cfg *IngressConfig) Validate(_ context.Context) *apis.FieldError { var all *apis.FieldError if cfg.Name == "" { all = all.Also(apis.ErrMissingField("name")) diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_defaults.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_defaults.go index 890717dd69..6cfc085244 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_defaults.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_defaults.go @@ -38,7 +38,7 @@ func (is *IngressSpec) SetDefaults(ctx context.Context) { } // SetDefaults populates default values in IngressTLS -func (t *IngressTLS) SetDefaults(ctx context.Context) {} +func (t *IngressTLS) SetDefaults(_ context.Context) {} // SetDefaults populates default values in IngressRule func (r *IngressRule) SetDefaults(ctx context.Context) { @@ -56,7 +56,7 @@ func (h *HTTPIngressRuleValue) SetDefaults(ctx context.Context) { } // SetDefaults populates default values in HTTPIngressPath -func (h *HTTPIngressPath) SetDefaults(ctx context.Context) { +func (h *HTTPIngressPath) SetDefaults(_ context.Context) { // If only one split is specified, we default to 100. if len(h.Splits) == 1 && h.Splits[0].Percent == 0 { h.Splits[0].Percent = 100 diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go index ed708d4206..2a49acddbc 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go @@ -152,7 +152,7 @@ func (b IngressBackend) Validate(ctx context.Context) *apis.FieldError { } // Validate inspects and validates IngressTLS object. -func (t *IngressTLS) Validate(ctx context.Context) *apis.FieldError { +func (t *IngressTLS) Validate(_ context.Context) *apis.FieldError { // Provided TLS setting must not be empty. if equality.Semantic.DeepEqual(t, &IngressTLS{}) { return apis.ErrMissingField(apis.CurrentField) @@ -168,7 +168,7 @@ func (t *IngressTLS) Validate(ctx context.Context) *apis.FieldError { return all } -func (t HTTPOption) Validate(ctx context.Context) (all *apis.FieldError) { +func (t HTTPOption) Validate(_ context.Context) (all *apis.FieldError) { switch t { case "", HTTPOptionEnabled, HTTPOptionRedirected: break diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_defaults.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_defaults.go index 85d7c41f1c..5614104be7 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_defaults.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_defaults.go @@ -28,5 +28,5 @@ func (r *Realm) SetDefaults(ctx context.Context) { } // SetDefaults populates default values in RealmSpec -func (*RealmSpec) SetDefaults(ctx context.Context) { +func (*RealmSpec) SetDefaults(_ context.Context) { } diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_validation.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_validation.go index 7137499d78..93caf70167 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_validation.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/realm_validation.go @@ -28,7 +28,7 @@ func (r *Realm) Validate(ctx context.Context) *apis.FieldError { } // Validate inspects and validates RealmSpec object. -func (rs *RealmSpec) Validate(ctx context.Context) *apis.FieldError { +func (rs *RealmSpec) Validate(_ context.Context) *apis.FieldError { var all *apis.FieldError if rs.External == "" && rs.Internal == "" { all = all.Also(apis.ErrMissingOneOf("external", "internal")) diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/serverlessservice_defaults.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/serverlessservice_defaults.go index 884754d096..cb358ad908 100644 --- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/serverlessservice_defaults.go +++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/serverlessservice_defaults.go @@ -24,6 +24,6 @@ func (ss *ServerlessService) SetDefaults(ctx context.Context) { } // SetDefaults sets default values on the ServerlessServiceSpec. -func (*ServerlessServiceSpec) SetDefaults(ctx context.Context) { +func (*ServerlessServiceSpec) SetDefaults(_ context.Context) { // Nothing is defaultable so far. } diff --git a/vendor/knative.dev/pkg/apis/duck/v1/destination.go b/vendor/knative.dev/pkg/apis/duck/v1/destination.go index 15638f4018..8e067a99b5 100644 --- a/vendor/knative.dev/pkg/apis/duck/v1/destination.go +++ b/vendor/knative.dev/pkg/apis/duck/v1/destination.go @@ -18,6 +18,8 @@ package v1 import ( "context" + "crypto/x509" + "encoding/pem" "knative.dev/pkg/apis" ) @@ -53,6 +55,7 @@ func (d *Destination) Validate(ctx context.Context) *apis.FieldError { func ValidateDestination(ctx context.Context, dest Destination) *apis.FieldError { ref := dest.Ref uri := dest.URI + caCerts := dest.CACerts if ref == nil && uri == nil { return apis.ErrGeneric("expected at least one, got none", "ref", "uri") } @@ -67,6 +70,9 @@ func ValidateDestination(ctx context.Context, dest Destination) *apis.FieldError if ref != nil && uri == nil { return ref.Validate(ctx).ViaField("ref") } + if caCerts != nil { + return validateCACerts(caCerts) + } return nil } @@ -88,3 +94,20 @@ func (d *Destination) SetDefaults(ctx context.Context) { d.Ref.Namespace = apis.ParentMeta(ctx).Namespace } } + +func validateCACerts(CACert *string) *apis.FieldError { + // Check the object. + var errs *apis.FieldError + + block, err := pem.Decode([]byte(*CACert)) + if err != nil && block == nil { + errs = errs.Also(apis.ErrInvalidValue("CA Cert provided is invalid", "caCert")) + return errs + } + if block.Type != "CERTIFICATE" { + errs = errs.Also(apis.ErrInvalidValue("CA Cert provided is not a certificate", "caCert")) + } else if _, err := x509.ParseCertificate(block.Bytes); err != nil { + errs = errs.Also(apis.ErrInvalidValue("CA Cert provided is invalid", "caCert")) + } + return errs +} diff --git a/vendor/knative.dev/pkg/apis/duck/v1/kresource_type.go b/vendor/knative.dev/pkg/apis/duck/v1/kresource_type.go index 491c13f1f6..1f6ee8264e 100644 --- a/vendor/knative.dev/pkg/apis/duck/v1/kresource_type.go +++ b/vendor/knative.dev/pkg/apis/duck/v1/kresource_type.go @@ -23,6 +23,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "knative.dev/pkg/apis/duck/ducktypes" "knative.dev/pkg/apis" @@ -41,6 +42,7 @@ type KRShaped interface { // Asserts KResource conformance with KRShaped var _ KRShaped = (*KResource)(nil) +// +genduck // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // KResource is a skeleton type wrapping Conditions in the manner we expect @@ -54,6 +56,11 @@ type KResource struct { Status Status `json:"status"` } +// GetFullType implements duck.Implementable +func (*KResource) GetFullType() ducktypes.Populatable { + return &KResource{} +} + // Populate implements duck.Populatable func (t *KResource) Populate() { t.Status.ObservedGeneration = 42 diff --git a/vendor/knative.dev/pkg/apis/duck/v1beta1/destination.go b/vendor/knative.dev/pkg/apis/duck/v1beta1/destination.go index 4c361d7c1c..ba83f1d4ee 100644 --- a/vendor/knative.dev/pkg/apis/duck/v1beta1/destination.go +++ b/vendor/knative.dev/pkg/apis/duck/v1beta1/destination.go @@ -18,6 +18,8 @@ package v1beta1 import ( "context" + "crypto/x509" + "encoding/pem" corev1 "k8s.io/api/core/v1" "knative.dev/pkg/apis" @@ -117,6 +119,9 @@ func ValidateDestination(dest Destination, allowDeprecatedFields bool) *apis.Fie } return validateDestinationRef(*ref) } + if dest.CACerts != nil { + return validateCACerts(dest.CACerts) + } return nil } @@ -162,3 +167,19 @@ func validateDestinationRef(ref corev1.ObjectReference) *apis.FieldError { return errs } +func validateCACerts(CACert *string) *apis.FieldError { + // Check the object. + var errs *apis.FieldError + + block, err := pem.Decode([]byte(*CACert)) + if err != nil && block == nil { + errs = errs.Also(apis.ErrInvalidValue("CA Cert provided is invalid", "caCert")) + return errs + } + if block.Type != "CERTIFICATE" { + errs = errs.Also(apis.ErrInvalidValue("CA Cert provided is not a certificate", "caCert")) + } else if _, err := x509.ParseCertificate(block.Bytes); err != nil { + errs = errs.Also(apis.ErrInvalidValue("CA Cert provided is invalid", "caCert")) + } + return errs +} diff --git a/vendor/knative.dev/pkg/environment/client_config.go b/vendor/knative.dev/pkg/environment/client_config.go index 04d4220b0a..aef33927ef 100644 --- a/vendor/knative.dev/pkg/environment/client_config.go +++ b/vendor/knative.dev/pkg/environment/client_config.go @@ -19,8 +19,10 @@ package environment import ( "flag" "fmt" + "log" "math" "os" + "strconv" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" @@ -45,9 +47,19 @@ func (c *ClientConfig) InitFlags(fs *flag.FlagSet) { fs.StringVar(&c.Kubeconfig, "kubeconfig", os.Getenv("KUBECONFIG"), "Path to a kubeconfig. Only required if out-of-cluster.") - fs.IntVar(&c.Burst, "kube-api-burst", 0, "Maximum burst for throttle.") + fs.IntVar(&c.Burst, "kube-api-burst", int(envVarOrDefault("KUBE_API_BURST", 0)), "Maximum burst for throttle.") - fs.Float64Var(&c.QPS, "kube-api-qps", 0, "Maximum QPS to the server from the client.") + fs.Float64Var(&c.QPS, "kube-api-qps", envVarOrDefault("KUBE_API_QPS", 0.0), "Maximum QPS to the server from the client.") +} + +func envVarOrDefault(key string, val float64) float64 { + var err error + if v := os.Getenv(key); v != "" { + if val, err = strconv.ParseFloat(v, 64); err != nil { + log.Fatal(err) + } + } + return val } func (c *ClientConfig) GetRESTConfig() (*rest.Config, error) { diff --git a/vendor/knative.dev/pkg/injection/clients.go b/vendor/knative.dev/pkg/injection/clients.go index 92e9912185..b71ef1d943 100644 --- a/vendor/knative.dev/pkg/injection/clients.go +++ b/vendor/knative.dev/pkg/injection/clients.go @@ -62,22 +62,3 @@ func (i *impl) FetchAllClients(ctx context.Context) []interface{} { } return clients } - -// DynamicClientInjector holds the type of a callback that attaches a particular -// client type to a context. -type DynamicClientInjector func(context.Context) context.Context - -func (i *impl) RegisterDynamicClient(ci DynamicClientInjector) { - i.m.Lock() - defer i.m.Unlock() - - i.dynamicClients = append(i.dynamicClients, ci) -} - -func (i *impl) GetDynamicClients() []DynamicClientInjector { - i.m.RLock() - defer i.m.RUnlock() - - // Copy the slice before returning. - return append(i.dynamicClients[:0:0], i.dynamicClients...) -} diff --git a/vendor/knative.dev/pkg/injection/informers.go b/vendor/knative.dev/pkg/injection/informers.go index ce5d481e88..9356f8d7f9 100644 --- a/vendor/knative.dev/pkg/injection/informers.go +++ b/vendor/knative.dev/pkg/injection/informers.go @@ -28,10 +28,6 @@ import ( // informer type to a context. type InformerInjector func(context.Context) (context.Context, controller.Informer) -// DynamicInformerInjector holds the type of a callback that attaches a particular -// informer type (backed by a Dynamic) to a context. -type DynamicInformerInjector func(context.Context) context.Context - // FilteredInformersInjector holds the type of a callback that attaches a set of particular // filtered informers type to a context. type FilteredInformersInjector func(context.Context) (context.Context, []controller.Informer) @@ -43,13 +39,6 @@ func (i *impl) RegisterInformer(ii InformerInjector) { i.informers = append(i.informers, ii) } -func (i *impl) RegisterDynamicInformer(ii DynamicInformerInjector) { - i.m.Lock() - defer i.m.Unlock() - - i.dynamicInformers = append(i.dynamicInformers, ii) -} - func (i *impl) RegisterFilteredInformers(fii FilteredInformersInjector) { i.m.Lock() defer i.m.Unlock() @@ -65,14 +54,6 @@ func (i *impl) GetInformers() []InformerInjector { return append(i.informers[:0:0], i.informers...) } -func (i *impl) GetDynamicInformers() []DynamicInformerInjector { - i.m.RLock() - defer i.m.RUnlock() - - // Copy the slice before returning. - return append(i.dynamicInformers[:0:0], i.dynamicInformers...) -} - func (i *impl) GetFilteredInformers() []FilteredInformersInjector { i.m.RLock() defer i.m.RUnlock() @@ -81,22 +62,6 @@ func (i *impl) GetFilteredInformers() []FilteredInformersInjector { return append(i.filteredInformers[:0:0], i.filteredInformers...) } -func (i *impl) SetupDynamic(ctx context.Context) context.Context { - // Based on the reconcilers we have linked, build up a set of clients and inject - // them onto the context. - for _, ci := range i.GetDynamicClients() { - ctx = ci(ctx) - } - - // Based on the reconcilers we have linked, build up a set of informers - // and inject them onto the context. - for _, ii := range i.GetDynamicInformers() { - ctx = ii(ctx) - } - - return ctx -} - func (i *impl) SetupInformers(ctx context.Context, cfg *rest.Config) (context.Context, []controller.Informer) { // Based on the reconcilers we have linked, build up a set of clients and inject // them onto the context. diff --git a/vendor/knative.dev/pkg/injection/interface.go b/vendor/knative.dev/pkg/injection/interface.go index 158864015f..c6d5715ad5 100644 --- a/vendor/knative.dev/pkg/injection/interface.go +++ b/vendor/knative.dev/pkg/injection/interface.go @@ -78,29 +78,6 @@ type Interface interface { SetupInformers(context.Context, *rest.Config) (context.Context, []controller.Informer) } -// DynamicInterface is the interface for interacting with dynamicclient-based injection -// implementations, such as Dynamic below. -type DynamicInterface interface { - // RegisterDynamicClient registers a new injector callback for associating - // a new dynamicclient-based client with a context. - RegisterDynamicClient(DynamicClientInjector) - - // GetDynamicClients fetches all of the registered dynamicclient-based client injectors. - GetDynamicClients() []DynamicClientInjector - - // RegisterDynamicInformer registers a new injector callback for associating - // a new dynamicclient-based informer with a context. - RegisterDynamicInformer(DynamicInformerInjector) - - // GetDynamicInformers fetches all of the registered dynamicclient-based informer injectors. - GetDynamicInformers() []DynamicInformerInjector - - // SetupDynamic runs all of the injectors against a context, starting with - // the clients and the given stream. A context infused with the various elements - // is returned. - SetupDynamic(context.Context) context.Context -} - type ControllerConstructor func(context.Context, configmap.Watcher) *controller.Impl // NamedControllerConstructor is a ControllerConstructor with an associated name. @@ -120,10 +97,6 @@ var ( // are being run for real. Default Interface = &impl{} - // Dynamic is the injection interface to use when bootstrapping a version - // of things based on the prototype dynamicclient-based reconciler framework. - Dynamic DynamicInterface = &impl{} - // Fake is the injection interface with which informers should register // to make themselves available to the controller process when it is being // unit tested. @@ -134,11 +107,9 @@ type impl struct { m sync.RWMutex clients []ClientInjector - dynamicClients []DynamicClientInjector clientFetchers []ClientFetcher factories []InformerFactoryInjector informers []InformerInjector - dynamicInformers []DynamicInformerInjector filteredInformers []FilteredInformersInjector ducks []DuckFactoryInjector } diff --git a/vendor/knative.dev/serving/pkg/apis/config/features.go b/vendor/knative.dev/serving/pkg/apis/config/features.go index 655188ec4f..32b7345a8c 100644 --- a/vendor/knative.dev/serving/pkg/apis/config/features.go +++ b/vendor/knative.dev/serving/pkg/apis/config/features.go @@ -67,6 +67,7 @@ func defaultFeaturesConfig() *Features { PodSpecPersistentVolumeClaim: Disabled, PodSpecPersistentVolumeWrite: Disabled, QueueProxyMountPodInfo: Disabled, + QueueProxyResourceDefaults: Disabled, PodSpecInitContainers: Disabled, PodSpecDNSPolicy: Disabled, PodSpecDNSConfig: Disabled, @@ -102,6 +103,7 @@ func NewFeaturesConfigFromMap(data map[string]string) (*Features, error) { asFlag("kubernetes.podspec-dnsconfig", &nc.PodSpecDNSConfig), asFlag("secure-pod-defaults", &nc.SecurePodDefaults), asFlag("tag-header-based-routing", &nc.TagHeaderBasedRouting), + asFlag("queueproxy.resource-defaults", &nc.QueueProxyResourceDefaults), asFlag("queueproxy.mount-podinfo", &nc.QueueProxyMountPodInfo), asFlag("autodetect-http2", &nc.AutoDetectHTTP2)); err != nil { return nil, err @@ -134,6 +136,7 @@ type Features struct { PodSpecPersistentVolumeClaim Flag PodSpecPersistentVolumeWrite Flag QueueProxyMountPodInfo Flag + QueueProxyResourceDefaults Flag PodSpecDNSPolicy Flag PodSpecDNSConfig Flag SecurePodDefaults Flag diff --git a/vendor/knative.dev/serving/pkg/apis/serving/register.go b/vendor/knative.dev/serving/pkg/apis/serving/register.go index 51eada3e9d..7fc51964f1 100644 --- a/vendor/knative.dev/serving/pkg/apis/serving/register.go +++ b/vendor/knative.dev/serving/pkg/apis/serving/register.go @@ -116,8 +116,27 @@ const ( // QueueSidecarResourcePercentageAnnotationKey is the percentage of user container resources to be used for queue-proxy // It has to be in [0.1,100] + // Deprecated: Please consider setting resources explicitly for the QP per service, see `QueueSidecarCPUResourceRequestAnnotationKey` for example. QueueSidecarResourcePercentageAnnotationKey = "queue.sidecar." + GroupName + "/resource-percentage" + // QueueSidecarCPUResourceRequestAnnotationKey is the explicit value of the cpu request for queue-proxy's request resources + QueueSidecarCPUResourceRequestAnnotationKey = "queue.sidecar." + GroupName + "/cpu-resource-request" + + // QueueSidecarCPUResourceLimitAnnotationKey is the explicit value of the cpu limit for queue-proxy's limit resources + QueueSidecarCPUResourceLimitAnnotationKey = "queue.sidecar." + GroupName + "/cpu-resource-limit" + + // QueueSidecarMemoryResourceRequestAnnotationKey is the explicit value of the memory request for queue-proxy's request resources + QueueSidecarMemoryResourceRequestAnnotationKey = "queue.sidecar." + GroupName + "/memory-resource-request" + + // QueueSidecarMemoryResourceLimitAnnotationKey is the explicit value of the memory limit for queue-proxy's limit resources + QueueSidecarMemoryResourceLimitAnnotationKey = "queue.sidecar." + GroupName + "/memory-resource-limit" + + // QueueSidecarEphemeralStorageResourceRequestAnnotationKey is the explicit value of the ephemeral storage request for queue-proxy's request resources + QueueSidecarEphemeralStorageResourceRequestAnnotationKey = "queue.sidecar." + GroupName + "/ephemeral-storage-resource-request" + + // QueueSidecarEphemeralStorageResourceLimitAnnotationKey is the explicit value of the ephemeral storage limit for queue-proxy's limit resources + QueueSidecarEphemeralStorageResourceLimitAnnotationKey = "queue.sidecar." + GroupName + "/ephemeral-storage-resource-limit" + // VisibilityClusterLocal is the label value for VisibilityLabelKey // that will result to the Route/KService getting a cluster local // domain suffix. @@ -162,6 +181,24 @@ var ( QueueSidecarResourcePercentageAnnotationKey, "queue.sidecar." + GroupName + "/resourcePercentage", } + QueueSidecarCPUResourceRequestAnnotation = kmap.KeyPriority{ + QueueSidecarCPUResourceRequestAnnotationKey, + } + QueueSidecarCPUResourceLimitAnnotation = kmap.KeyPriority{ + QueueSidecarCPUResourceLimitAnnotationKey, + } + QueueSidecarMemoryResourceRequestAnnotation = kmap.KeyPriority{ + QueueSidecarMemoryResourceRequestAnnotationKey, + } + QueueSidecarMemoryResourceLimitAnnotation = kmap.KeyPriority{ + QueueSidecarMemoryResourceLimitAnnotationKey, + } + QueueSidecarEphemeralStorageResourceRequestAnnotation = kmap.KeyPriority{ + QueueSidecarEphemeralStorageResourceRequestAnnotationKey, + } + QueueSidecarEphemeralStorageResourceLimitAnnotation = kmap.KeyPriority{ + QueueSidecarEphemeralStorageResourceLimitAnnotationKey, + } ProgressDeadlineAnnotation = kmap.KeyPriority{ ProgressDeadlineAnnotationKey, } diff --git a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go index 9351f91f12..2508bf8bbc 100644 --- a/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go +++ b/vendor/knative.dev/serving/pkg/apis/serving/v1/revision_validation.go @@ -23,8 +23,10 @@ import ( "strings" "time" + "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/validation" "knative.dev/pkg/apis" + "knative.dev/pkg/kmap" "knative.dev/pkg/kmp" "knative.dev/serving/pkg/apis/autoscaling" "knative.dev/serving/pkg/apis/config" @@ -68,7 +70,7 @@ func (rts *RevisionTemplateSpec) Validate(ctx context.Context) *apis.FieldError // If the RevisionTemplateSpec has a name specified, then check that // it follows the requirements on the name. errs = errs.Also(validateRevisionName(ctx, rts.Name, rts.GenerateName)) - errs = errs.Also(validateQueueSidecarAnnotation(rts.Annotations).ViaField("metadata.annotations")) + errs = errs.Also(validateQueueSidecarResourceAnnotations(rts.Annotations).ViaField("metadata.annotations")) errs = errs.Also(validateProgressDeadlineAnnotation(rts.Annotations).ViaField("metadata.annotations")) return errs } @@ -179,23 +181,42 @@ func validateTimeoutSeconds(ctx context.Context, timeoutSeconds int64) *apis.Fie return nil } -// validateQueueSidecarAnnotation validates QueueSideCarResourcePercentageAnnotation -func validateQueueSidecarAnnotation(m map[string]string) *apis.FieldError { +// validateQueueSidecarResourceAnnotations validates QueueSideCarResourcePercentageAnnotation and other QP resource related annotations. +func validateQueueSidecarResourceAnnotations(m map[string]string) *apis.FieldError { if len(m) == 0 { return nil } - k, v, ok := serving.QueueSidecarResourcePercentageAnnotation.Get(m) - if !ok { - return nil - } - value, err := strconv.ParseFloat(v, 64) - if err != nil { - return apis.ErrInvalidValue(v, apis.CurrentField).ViaKey(k) + + var errs *apis.FieldError + if k, v, ok := serving.QueueSidecarResourcePercentageAnnotation.Get(m); ok { + errs = apis.ErrGeneric("Queue proxy resource percentage annotation is deprecated. Please use the available annotations to explicitly set resource values per service").ViaKey(k).At(apis.WarningLevel) + value, err := strconv.ParseFloat(v, 64) + if err != nil { + errs = errs.Also(apis.ErrInvalidValue(v, apis.CurrentField).ViaKey(k)) + } else { + if value < 0.1 || value > 100 { + errs = errs.Also(apis.ErrOutOfBoundsValue(value, 0.1, 100.0, apis.CurrentField).ViaKey(k)) + } + } } - if value < 0.1 || value > 100 { - return apis.ErrOutOfBoundsValue(value, 0.1, 100.0, apis.CurrentField).ViaKey(k) + annoKeys := []kmap.KeyPriority{ + serving.QueueSidecarCPUResourceRequestAnnotation, + serving.QueueSidecarCPUResourceLimitAnnotation, + serving.QueueSidecarMemoryResourceRequestAnnotation, + serving.QueueSidecarMemoryResourceLimitAnnotation, + serving.QueueSidecarEphemeralStorageResourceRequestAnnotation, + serving.QueueSidecarEphemeralStorageResourceLimitAnnotation, + } + for _, resAnno := range annoKeys { + k, v, ok := resAnno.Get(m) + if !ok { + continue + } + if _, err := resource.ParseQuantity(v); err != nil { + errs = errs.Also(apis.ErrInvalidValue(v, apis.CurrentField).ViaKey(k)) + } } - return nil + return errs } // ValidateProgressDeadlineAnnotation validates the revision progress deadline annotation. diff --git a/vendor/modules.txt b/vendor/modules.txt index f2b96f17e2..45e0322196 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# cloud.google.com/go/compute v1.15.1 +# cloud.google.com/go/compute v1.20.0 ## explicit; go 1.19 cloud.google.com/go/compute/internal # cloud.google.com/go/compute/metadata v0.2.3 @@ -19,18 +19,18 @@ github.com/AlecAivazis/survey/v2/terminal ## explicit github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry github.com/Azure/azure-sdk-for-go/version -# github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 +# github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 ## explicit; go 1.16 github.com/Azure/go-ansiterm github.com/Azure/go-ansiterm/winterm # github.com/Azure/go-autorest v14.2.0+incompatible ## explicit github.com/Azure/go-autorest -# github.com/Azure/go-autorest/autorest v0.11.28 +# github.com/Azure/go-autorest/autorest v0.11.29 ## explicit; go 1.15 github.com/Azure/go-autorest/autorest github.com/Azure/go-autorest/autorest/azure -# github.com/Azure/go-autorest/autorest/adal v0.9.22 +# github.com/Azure/go-autorest/autorest/adal v0.9.23 ## explicit; go 1.15 github.com/Azure/go-autorest/autorest/adal # github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 @@ -48,48 +48,26 @@ github.com/Azure/go-autorest/logger # github.com/Azure/go-autorest/tracing v0.6.0 ## explicit; go 1.12 github.com/Azure/go-autorest/tracing -# github.com/BurntSushi/toml v1.2.1 +# github.com/BurntSushi/toml v1.3.2 ## explicit; go 1.16 github.com/BurntSushi/toml github.com/BurntSushi/toml/internal # github.com/Masterminds/semver v1.5.0 ## explicit github.com/Masterminds/semver -# github.com/Microsoft/go-winio v0.6.0 +# github.com/Microsoft/go-winio v0.6.1 ## explicit; go 1.17 github.com/Microsoft/go-winio +github.com/Microsoft/go-winio/internal/fs github.com/Microsoft/go-winio/internal/socket +github.com/Microsoft/go-winio/internal/stringbuffer github.com/Microsoft/go-winio/pkg/guid -github.com/Microsoft/go-winio/pkg/security -github.com/Microsoft/go-winio/vhd -# github.com/Microsoft/hcsshim v0.9.6 -## explicit; go 1.13 -github.com/Microsoft/hcsshim -github.com/Microsoft/hcsshim/computestorage -github.com/Microsoft/hcsshim/internal/cow -github.com/Microsoft/hcsshim/internal/hcs -github.com/Microsoft/hcsshim/internal/hcs/schema1 -github.com/Microsoft/hcsshim/internal/hcs/schema2 -github.com/Microsoft/hcsshim/internal/hcserror -github.com/Microsoft/hcsshim/internal/hns -github.com/Microsoft/hcsshim/internal/interop -github.com/Microsoft/hcsshim/internal/jobobject -github.com/Microsoft/hcsshim/internal/log -github.com/Microsoft/hcsshim/internal/logfields -github.com/Microsoft/hcsshim/internal/longpath -github.com/Microsoft/hcsshim/internal/mergemaps -github.com/Microsoft/hcsshim/internal/oc -github.com/Microsoft/hcsshim/internal/queue -github.com/Microsoft/hcsshim/internal/safefile -github.com/Microsoft/hcsshim/internal/timeout -github.com/Microsoft/hcsshim/internal/vmcompute -github.com/Microsoft/hcsshim/internal/wclayer -github.com/Microsoft/hcsshim/internal/winapi -github.com/Microsoft/hcsshim/osversion # github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 ## explicit; go 1.13 github.com/Netflix/go-expect -# github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 +# github.com/OneOfOne/xxhash v1.2.8 +## explicit; go 1.11 +# github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 ## explicit; go 1.13 github.com/ProtonMail/go-crypto/bitcurves github.com/ProtonMail/go-crypto/brainpool @@ -109,7 +87,7 @@ github.com/ProtonMail/go-crypto/openpgp/internal/ecc github.com/ProtonMail/go-crypto/openpgp/internal/encoding github.com/ProtonMail/go-crypto/openpgp/packet github.com/ProtonMail/go-crypto/openpgp/s2k -# github.com/acomagu/bufpipe v1.0.3 +# github.com/acomagu/bufpipe v1.0.4 ## explicit; go 1.12 github.com/acomagu/bufpipe # github.com/agext/levenshtein v1.2.3 @@ -125,7 +103,7 @@ github.com/antlr/antlr4/runtime/Go/antlr ## explicit; go 1.12 github.com/apex/log github.com/apex/log/handlers/memory -# github.com/aws/aws-sdk-go-v2 v1.17.3 +# github.com/aws/aws-sdk-go-v2 v1.18.1 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2 github.com/aws/aws-sdk-go-v2/aws @@ -146,10 +124,10 @@ github.com/aws/aws-sdk-go-v2/internal/shareddefaults github.com/aws/aws-sdk-go-v2/internal/strings github.com/aws/aws-sdk-go-v2/internal/sync/singleflight github.com/aws/aws-sdk-go-v2/internal/timeconv -# github.com/aws/aws-sdk-go-v2/config v1.18.9 +# github.com/aws/aws-sdk-go-v2/config v1.18.27 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/config -# github.com/aws/aws-sdk-go-v2/credentials v1.13.9 +# github.com/aws/aws-sdk-go-v2/credentials v1.13.26 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/credentials github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds @@ -158,43 +136,43 @@ github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client github.com/aws/aws-sdk-go-v2/credentials/processcreds github.com/aws/aws-sdk-go-v2/credentials/ssocreds github.com/aws/aws-sdk-go-v2/credentials/stscreds -# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21 +# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.4 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config -# github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 +# github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.34 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/internal/configsources -# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 +# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.28 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 -# github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28 +# github.com/aws/aws-sdk-go-v2/internal/ini v1.3.35 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/internal/ini -# github.com/aws/aws-sdk-go-v2/service/ecr v1.18.1 +# github.com/aws/aws-sdk-go-v2/service/ecr v1.18.11 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/service/ecr github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ecr/types -# github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.15.0 +# github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.16.2 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/service/ecrpublic github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ecrpublic/types -# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.21 +# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.28 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url -# github.com/aws/aws-sdk-go-v2/service/sso v1.12.0 +# github.com/aws/aws-sdk-go-v2/service/sso v1.12.12 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/service/sso github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sso/types -# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.0 +# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.12 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/service/ssooidc github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ssooidc/types -# github.com/aws/aws-sdk-go-v2/service/sts v1.18.1 +# github.com/aws/aws-sdk-go-v2/service/sts v1.19.2 ## explicit; go 1.15 github.com/aws/aws-sdk-go-v2/service/sts github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints @@ -219,7 +197,7 @@ github.com/aws/smithy-go/time github.com/aws/smithy-go/transport/http github.com/aws/smithy-go/transport/http/internal/io github.com/aws/smithy-go/waiter -# github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230110223219-40efa3093a22 +# github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230522190001-adf1bafd791a ## explicit; go 1.13 github.com/awslabs/amazon-ecr-credential-helper/ecr-login github.com/awslabs/amazon-ecr-credential-helper/ecr-login/api @@ -232,42 +210,45 @@ github.com/beorn7/perks/quantile # github.com/blendle/zapdriver v1.3.1 ## explicit; go 1.12 github.com/blendle/zapdriver -# github.com/buildpacks/imgutil v0.0.0-20230221152838-4cf98dd677d2 -## explicit; go 1.17 +# github.com/buildpacks/imgutil v0.0.0-20230626185301-726f02e4225c +## explicit; go 1.19 github.com/buildpacks/imgutil github.com/buildpacks/imgutil/layer github.com/buildpacks/imgutil/layout github.com/buildpacks/imgutil/layout/sparse github.com/buildpacks/imgutil/local github.com/buildpacks/imgutil/remote -# github.com/buildpacks/lifecycle v0.16.0 -## explicit; go 1.19 +# github.com/buildpacks/lifecycle v0.17.0-rc.3 +## explicit; go 1.20 github.com/buildpacks/lifecycle github.com/buildpacks/lifecycle/api github.com/buildpacks/lifecycle/archive github.com/buildpacks/lifecycle/auth github.com/buildpacks/lifecycle/buildpack github.com/buildpacks/lifecycle/cache +github.com/buildpacks/lifecycle/cmd github.com/buildpacks/lifecycle/env github.com/buildpacks/lifecycle/image github.com/buildpacks/lifecycle/internal/encoding github.com/buildpacks/lifecycle/internal/extend github.com/buildpacks/lifecycle/internal/fsutil github.com/buildpacks/lifecycle/internal/layer +github.com/buildpacks/lifecycle/internal/name github.com/buildpacks/lifecycle/internal/path +github.com/buildpacks/lifecycle/internal/selective github.com/buildpacks/lifecycle/internal/str github.com/buildpacks/lifecycle/launch github.com/buildpacks/lifecycle/layers github.com/buildpacks/lifecycle/log github.com/buildpacks/lifecycle/platform -# github.com/buildpacks/pack v0.29.0 -## explicit; go 1.19 +github.com/buildpacks/lifecycle/platform/files +# github.com/buildpacks/pack v0.30.0-pre3 +## explicit; go 1.20 github.com/buildpacks/pack github.com/buildpacks/pack/builder github.com/buildpacks/pack/buildpackage github.com/buildpacks/pack/internal/build github.com/buildpacks/pack/internal/builder -github.com/buildpacks/pack/internal/cache github.com/buildpacks/pack/internal/config github.com/buildpacks/pack/internal/container github.com/buildpacks/pack/internal/layer @@ -283,6 +264,7 @@ github.com/buildpacks/pack/internal/termui github.com/buildpacks/pack/pkg/archive github.com/buildpacks/pack/pkg/blob github.com/buildpacks/pack/pkg/buildpack +github.com/buildpacks/pack/pkg/cache github.com/buildpacks/pack/pkg/client github.com/buildpacks/pack/pkg/dist github.com/buildpacks/pack/pkg/image @@ -303,7 +285,7 @@ github.com/cespare/xxhash # github.com/cespare/xxhash/v2 v2.2.0 ## explicit; go 1.11 github.com/cespare/xxhash/v2 -# github.com/chrismellard/docker-credential-acr-env v0.0.0-20221129204813-6a4d6ed5d396 +# github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 ## explicit; go 1.18 github.com/chrismellard/docker-credential-acr-env/pkg/credhelper github.com/chrismellard/docker-credential-acr-env/pkg/registry @@ -317,7 +299,7 @@ github.com/cloudevents/sdk-go/sql/v2/gen github.com/cloudevents/sdk-go/sql/v2/parser github.com/cloudevents/sdk-go/sql/v2/runtime github.com/cloudevents/sdk-go/sql/v2/utils -# github.com/cloudevents/sdk-go/v2 v2.13.0 +# github.com/cloudevents/sdk-go/v2 v2.14.0 ## explicit; go 1.17 github.com/cloudevents/sdk-go/v2 github.com/cloudevents/sdk-go/v2/binding @@ -333,8 +315,8 @@ github.com/cloudevents/sdk-go/v2/event/datacodec/xml github.com/cloudevents/sdk-go/v2/protocol github.com/cloudevents/sdk-go/v2/protocol/http github.com/cloudevents/sdk-go/v2/types -# github.com/cloudflare/circl v1.1.0 -## explicit; go 1.15 +# github.com/cloudflare/circl v1.3.3 +## explicit; go 1.19 github.com/cloudflare/circl/dh/x25519 github.com/cloudflare/circl/dh/x448 github.com/cloudflare/circl/ecc/goldilocks @@ -347,41 +329,38 @@ github.com/cloudflare/circl/math/mlsbset github.com/cloudflare/circl/sign github.com/cloudflare/circl/sign/ed25519 github.com/cloudflare/circl/sign/ed448 -# github.com/containerd/cgroups v1.0.4 -## explicit; go 1.17 -github.com/containerd/cgroups/stats/v1 -# github.com/containerd/containerd v1.6.18 -## explicit; go 1.17 +# github.com/containerd/containerd v1.7.2 +## explicit; go 1.19 github.com/containerd/containerd/errdefs github.com/containerd/containerd/log github.com/containerd/containerd/pkg/userns github.com/containerd/containerd/platforms -github.com/containerd/containerd/sys -# github.com/containerd/stargz-snapshotter/estargz v0.13.0 -## explicit; go 1.16 +# github.com/containerd/stargz-snapshotter/estargz v0.14.3 +## explicit; go 1.19 github.com/containerd/stargz-snapshotter/estargz github.com/containerd/stargz-snapshotter/estargz/errorutil # github.com/containerd/typeurl v1.0.2 ## explicit; go 1.13 github.com/containerd/typeurl -# github.com/containers/image/v5 v5.19.1 -## explicit; go 1.13 +# github.com/containers/image/v5 v5.26.1 => github.com/containers/image/v5 v5.23.1 +## explicit; go 1.17 github.com/containers/image/v5/docker/reference -github.com/containers/image/v5/internal/pkg/keyctl github.com/containers/image/v5/internal/rootless github.com/containers/image/v5/pkg/compression/internal github.com/containers/image/v5/pkg/compression/types github.com/containers/image/v5/pkg/docker/config github.com/containers/image/v5/pkg/sysregistriesv2 github.com/containers/image/v5/types -# github.com/containers/storage v1.38.2 -## explicit; go 1.14 +# github.com/containers/storage v1.48.0 +## explicit; go 1.19 github.com/containers/storage/pkg/homedir github.com/containers/storage/pkg/idtools +github.com/containers/storage/pkg/ioutils github.com/containers/storage/pkg/lockfile +github.com/containers/storage/pkg/longpath github.com/containers/storage/pkg/mount github.com/containers/storage/pkg/reexec -github.com/containers/storage/pkg/stringid +github.com/containers/storage/pkg/regexp github.com/containers/storage/pkg/system github.com/containers/storage/pkg/unshare # github.com/coreos/go-semver v0.3.0 @@ -403,7 +382,7 @@ github.com/dgraph-io/ristretto/z # github.com/dimchansky/utfbom v1.1.1 ## explicit github.com/dimchansky/utfbom -# github.com/docker/cli v23.0.1+incompatible +# github.com/docker/cli v24.0.2+incompatible ## explicit github.com/docker/cli/cli/config github.com/docker/cli/cli/config/configfile @@ -412,12 +391,12 @@ github.com/docker/cli/cli/config/types github.com/docker/cli/cli/connhelper github.com/docker/cli/cli/connhelper/commandconn github.com/docker/cli/cli/connhelper/ssh -# github.com/docker/distribution v2.8.1+incompatible +# github.com/docker/distribution v2.8.2+incompatible ## explicit github.com/docker/distribution/digestset github.com/docker/distribution/reference github.com/docker/distribution/registry/client/auth/challenge -# github.com/docker/docker v23.0.0-rc.1+incompatible => github.com/docker/docker v20.10.21+incompatible +# github.com/docker/docker v24.0.5-0.20230718221249-d4a26c153000+incompatible ## explicit github.com/docker/docker/api github.com/docker/docker/api/types @@ -435,17 +414,17 @@ github.com/docker/docker/api/types/swarm/runtime github.com/docker/docker/api/types/time github.com/docker/docker/api/types/versions github.com/docker/docker/api/types/volume -github.com/docker/docker/cli/config github.com/docker/docker/client github.com/docker/docker/errdefs github.com/docker/docker/pkg/archive -github.com/docker/docker/pkg/fileutils github.com/docker/docker/pkg/homedir github.com/docker/docker/pkg/idtools github.com/docker/docker/pkg/ioutils github.com/docker/docker/pkg/jsonmessage github.com/docker/docker/pkg/longpath +github.com/docker/docker/pkg/meminfo github.com/docker/docker/pkg/pools +github.com/docker/docker/pkg/process github.com/docker/docker/pkg/stdcopy github.com/docker/docker/pkg/stringid github.com/docker/docker/pkg/system @@ -484,8 +463,8 @@ github.com/evanphx/json-patch # github.com/evanphx/json-patch/v5 v5.6.0 ## explicit; go 1.12 github.com/evanphx/json-patch/v5 -# github.com/fatih/color v1.13.0 -## explicit; go 1.13 +# github.com/fatih/color v1.15.0 +## explicit; go 1.17 github.com/fatih/color # github.com/fsnotify/fsnotify v1.6.0 ## explicit; go 1.16 @@ -537,13 +516,13 @@ github.com/gdamore/tcell/v2/terminfo/x/xterm_termite # github.com/go-errors/errors v1.4.2 ## explicit; go 1.14 github.com/go-errors/errors -# github.com/go-git/gcfg v1.5.0 -## explicit +# github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 +## explicit; go 1.13 github.com/go-git/gcfg github.com/go-git/gcfg/scanner github.com/go-git/gcfg/token github.com/go-git/gcfg/types -# github.com/go-git/go-billy/v5 v5.4.0 +# github.com/go-git/go-billy/v5 v5.4.1 ## explicit; go 1.13 github.com/go-git/go-billy/v5 github.com/go-git/go-billy/v5/helper/chroot @@ -551,8 +530,8 @@ github.com/go-git/go-billy/v5/helper/polyfill github.com/go-git/go-billy/v5/memfs github.com/go-git/go-billy/v5/osfs github.com/go-git/go-billy/v5/util -# github.com/go-git/go-git/v5 v5.6.0 -## explicit; go 1.13 +# github.com/go-git/go-git/v5 v5.7.0 +## explicit; go 1.18 github.com/go-git/go-git/v5 github.com/go-git/go-git/v5/config github.com/go-git/go-git/v5/internal/revision @@ -601,10 +580,10 @@ github.com/go-git/go-git/v5/utils/sync ## explicit; go 1.17 github.com/go-kit/log github.com/go-kit/log/level -# github.com/go-logfmt/logfmt v0.5.1 +# github.com/go-logfmt/logfmt v0.6.0 ## explicit; go 1.17 github.com/go-logfmt/logfmt -# github.com/go-logr/logr v1.2.3 +# github.com/go-logr/logr v1.2.4 ## explicit; go 1.16 github.com/go-logr/logr # github.com/go-openapi/jsonpointer v0.19.6 @@ -614,23 +593,21 @@ github.com/go-openapi/jsonpointer ## explicit; go 1.13 github.com/go-openapi/jsonreference github.com/go-openapi/jsonreference/internal -# github.com/go-openapi/swag v0.22.3 +# github.com/go-openapi/swag v0.22.4 ## explicit; go 1.18 github.com/go-openapi/swag # github.com/gogo/protobuf v1.3.2 ## explicit; go 1.15 -github.com/gogo/protobuf/gogoproto github.com/gogo/protobuf/proto -github.com/gogo/protobuf/protoc-gen-gogo/descriptor github.com/gogo/protobuf/sortkeys github.com/gogo/protobuf/types -# github.com/golang-jwt/jwt/v4 v4.4.3 +# github.com/golang-jwt/jwt/v4 v4.5.0 ## explicit; go 1.16 github.com/golang-jwt/jwt/v4 # github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da ## explicit github.com/golang/groupcache/lru -# github.com/golang/protobuf v1.5.2 +# github.com/golang/protobuf v1.5.3 ## explicit; go 1.9 github.com/golang/protobuf/jsonpb github.com/golang/protobuf/proto @@ -675,7 +652,7 @@ github.com/google/go-cmp/cmp/internal/diff github.com/google/go-cmp/cmp/internal/flags github.com/google/go-cmp/cmp/internal/function github.com/google/go-cmp/cmp/internal/value -# github.com/google/go-containerregistry v0.13.0 +# github.com/google/go-containerregistry v0.15.2 ## explicit; go 1.18 github.com/google/go-containerregistry/internal/and github.com/google/go-containerregistry/internal/compression @@ -705,6 +682,7 @@ github.com/google/go-containerregistry/pkg/v1/static github.com/google/go-containerregistry/pkg/v1/stream github.com/google/go-containerregistry/pkg/v1/tarball github.com/google/go-containerregistry/pkg/v1/types +github.com/google/go-containerregistry/pkg/v1/validate # github.com/google/go-github/v49 v49.1.0 ## explicit; go 1.17 github.com/google/go-github/v49/github @@ -724,7 +702,7 @@ github.com/google/uuid # github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 ## explicit github.com/gregjones/httpcache -# github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 +# github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 ## explicit; go 1.17 github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule github.com/grpc-ecosystem/grpc-gateway/v2/runtime @@ -735,10 +713,16 @@ github.com/hako/durafmt # github.com/hashicorp/errwrap v1.1.0 ## explicit github.com/hashicorp/errwrap +# github.com/hashicorp/go-cleanhttp v0.5.2 +## explicit; go 1.13 +github.com/hashicorp/go-cleanhttp # github.com/hashicorp/go-multierror v1.1.1 ## explicit; go 1.13 github.com/hashicorp/go-multierror -# github.com/hashicorp/golang-lru v0.5.4 +# github.com/hashicorp/go-retryablehttp v0.7.4 +## explicit; go 1.13 +github.com/hashicorp/go-retryablehttp +# github.com/hashicorp/golang-lru v0.6.0 ## explicit; go 1.12 github.com/hashicorp/golang-lru github.com/hashicorp/golang-lru/simplelru @@ -763,7 +747,7 @@ github.com/hinshun/vt10x # github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 ## explicit github.com/iancoleman/orderedmap -# github.com/imdario/mergo v0.3.13 +# github.com/imdario/mergo v0.3.15 ## explicit; go 1.13 github.com/imdario/mergo # github.com/inconshreveable/mousetrap v1.1.0 @@ -775,8 +759,8 @@ github.com/jbenet/go-context/io # github.com/jmespath/go-jmespath v0.4.0 ## explicit; go 1.14 github.com/jmespath/go-jmespath -# github.com/jonboulle/clockwork v0.3.0 -## explicit; go 1.13 +# github.com/jonboulle/clockwork v0.4.0 +## explicit; go 1.15 github.com/jonboulle/clockwork # github.com/josharian/intern v1.0.0 ## explicit; go 1.5 @@ -793,8 +777,8 @@ github.com/kelseyhightower/envconfig # github.com/kevinburke/ssh_config v1.2.0 ## explicit github.com/kevinburke/ssh_config -# github.com/klauspost/compress v1.15.15 -## explicit; go 1.17 +# github.com/klauspost/compress v1.16.6 +## explicit; go 1.18 github.com/klauspost/compress github.com/klauspost/compress/fse github.com/klauspost/compress/huff0 @@ -811,18 +795,29 @@ github.com/liggitt/tabwriter # github.com/lucasb-eyer/go-colorful v1.2.0 ## explicit; go 1.12 github.com/lucasb-eyer/go-colorful -# github.com/magiconair/properties v1.8.6 -## explicit; go 1.13 +# github.com/magiconair/properties v1.8.7 +## explicit; go 1.19 github.com/magiconair/properties # github.com/mailru/easyjson v0.7.7 ## explicit; go 1.12 github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter +# github.com/manifestival/client-go-client v0.5.0 +## explicit; go 1.15 +github.com/manifestival/client-go-client +github.com/manifestival/client-go-client/pkg/dynamic +# github.com/manifestival/manifestival v0.7.2 +## explicit; go 1.15 +github.com/manifestival/manifestival +github.com/manifestival/manifestival/fake +github.com/manifestival/manifestival/internal/overlay +github.com/manifestival/manifestival/internal/patch +github.com/manifestival/manifestival/internal/sources # github.com/mattn/go-colorable v0.1.13 ## explicit; go 1.15 github.com/mattn/go-colorable -# github.com/mattn/go-isatty v0.0.17 +# github.com/mattn/go-isatty v0.0.19 ## explicit; go 1.15 github.com/mattn/go-isatty # github.com/mattn/go-runewidth v0.0.14 @@ -846,7 +841,7 @@ github.com/mitchellh/ioprogress # github.com/mitchellh/mapstructure v1.5.0 ## explicit; go 1.14 github.com/mitchellh/mapstructure -# github.com/moby/buildkit v0.11.1 +# github.com/moby/buildkit v0.11.6 ## explicit; go 1.18 github.com/moby/buildkit/frontend/dockerfile/command github.com/moby/buildkit/frontend/dockerfile/instructions @@ -854,17 +849,20 @@ github.com/moby/buildkit/frontend/dockerfile/parser github.com/moby/buildkit/frontend/dockerfile/shell github.com/moby/buildkit/util/stack github.com/moby/buildkit/util/suggest +# github.com/moby/patternmatcher v0.5.0 +## explicit; go 1.19 +github.com/moby/patternmatcher # github.com/moby/spdystream v0.2.0 ## explicit; go 1.13 github.com/moby/spdystream github.com/moby/spdystream/spdy -# github.com/moby/sys/mount v0.3.3 -## explicit; go 1.16 -github.com/moby/sys/mount # github.com/moby/sys/mountinfo v0.6.2 ## explicit; go 1.16 github.com/moby/sys/mountinfo -# github.com/moby/term v0.0.0-20221205130635-1aeaba878587 +# github.com/moby/sys/sequential v0.5.0 +## explicit; go 1.17 +github.com/moby/sys/sequential +# github.com/moby/term v0.5.0 ## explicit; go 1.18 github.com/moby/term github.com/moby/term/windows @@ -886,21 +884,20 @@ github.com/munnerz/goautoneg # github.com/opencontainers/go-digest v1.0.0 ## explicit; go 1.13 github.com/opencontainers/go-digest -# github.com/opencontainers/image-spec v1.1.0-rc2 -## explicit; go 1.17 +# github.com/opencontainers/image-spec v1.1.0-rc4 +## explicit; go 1.18 github.com/opencontainers/image-spec/specs-go github.com/opencontainers/image-spec/specs-go/v1 -# github.com/opencontainers/runc v1.1.4 -## explicit; go 1.16 +# github.com/opencontainers/runc v1.1.7 +## explicit; go 1.17 github.com/opencontainers/runc/libcontainer/user -# github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 +# github.com/opencontainers/runtime-spec v1.1.0-rc.3 ## explicit github.com/opencontainers/runtime-spec/specs-go -# github.com/opencontainers/selinux v1.10.2 -## explicit; go 1.13 +# github.com/opencontainers/selinux v1.11.0 +## explicit; go 1.19 github.com/opencontainers/selinux/go-selinux github.com/opencontainers/selinux/go-selinux/label -github.com/opencontainers/selinux/pkg/pwalk github.com/opencontainers/selinux/pkg/pwalkdir # github.com/openshift-pipelines/pipelines-as-code v0.17.1 ## explicit; go 1.18 @@ -911,8 +908,8 @@ github.com/openshift-pipelines/pipelines-as-code/pkg/formatting github.com/openshift-pipelines/pipelines-as-code/pkg/generated/clientset/versioned/scheme github.com/openshift-pipelines/pipelines-as-code/pkg/generated/clientset/versioned/typed/pipelinesascode/v1alpha1 github.com/openshift-pipelines/pipelines-as-code/pkg/git -# github.com/openshift/source-to-image v1.3.1 => github.com/boson-project/source-to-image v1.3.2 -## explicit; go 1.13 +# github.com/openshift/source-to-image v1.3.8 +## explicit; go 1.19 github.com/openshift/source-to-image/pkg/api github.com/openshift/source-to-image/pkg/api/constants github.com/openshift/source-to-image/pkg/api/validation @@ -960,21 +957,21 @@ github.com/pjbgf/sha1cd/ubc # github.com/pkg/errors v0.9.1 ## explicit github.com/pkg/errors -# github.com/prometheus/client_golang v1.14.0 +# github.com/prometheus/client_golang v1.15.1 ## explicit; go 1.17 github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/internal github.com/prometheus/client_golang/prometheus/promhttp -# github.com/prometheus/client_model v0.3.0 -## explicit; go 1.9 +# github.com/prometheus/client_model v0.4.0 +## explicit; go 1.18 github.com/prometheus/client_model/go -# github.com/prometheus/common v0.39.0 -## explicit; go 1.17 +# github.com/prometheus/common v0.44.0 +## explicit; go 1.18 github.com/prometheus/common/expfmt github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg github.com/prometheus/common/model -# github.com/prometheus/procfs v0.9.0 -## explicit; go 1.18 +# github.com/prometheus/procfs v0.10.1 +## explicit; go 1.19 github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util @@ -992,7 +989,7 @@ github.com/rickb777/plural # github.com/rivo/tview v0.0.0-20220307222120-9994674d60a8 ## explicit; go 1.12 github.com/rivo/tview -# github.com/rivo/uniseg v0.4.3 +# github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg # github.com/robfig/cron/v3 v3.0.1 @@ -1010,13 +1007,13 @@ github.com/schollz/progressbar/v3 # github.com/sergi/go-diff v1.2.0 ## explicit; go 1.12 github.com/sergi/go-diff/diffmatchpatch -# github.com/sirupsen/logrus v1.9.0 +# github.com/sirupsen/logrus v1.9.3 ## explicit; go 1.13 github.com/sirupsen/logrus -# github.com/skeema/knownhosts v1.1.0 +# github.com/skeema/knownhosts v1.1.1 ## explicit; go 1.17 github.com/skeema/knownhosts -# github.com/spf13/afero v1.9.3 +# github.com/spf13/afero v1.9.5 ## explicit; go 1.16 github.com/spf13/afero github.com/spf13/afero/internal/common @@ -1024,7 +1021,7 @@ github.com/spf13/afero/mem # github.com/spf13/cast v1.5.0 ## explicit; go 1.18 github.com/spf13/cast -# github.com/spf13/cobra v1.6.1 +# github.com/spf13/cobra v1.7.0 ## explicit; go 1.15 github.com/spf13/cobra github.com/spf13/cobra/doc @@ -1037,14 +1034,14 @@ github.com/spf13/pflag # github.com/stoewer/go-strcase v1.2.1 ## explicit; go 1.11 github.com/stoewer/go-strcase -# github.com/subosito/gotenv v1.4.1 +# github.com/subosito/gotenv v1.4.2 ## explicit; go 1.18 github.com/subosito/gotenv # github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 ## explicit github.com/syndtr/gocapability/capability -# github.com/tektoncd/cli v0.29.1 -## explicit; go 1.17 +# github.com/tektoncd/cli v0.31.1 +## explicit; go 1.18 github.com/tektoncd/cli/pkg/actions github.com/tektoncd/cli/pkg/cli github.com/tektoncd/cli/pkg/formatted @@ -1052,8 +1049,9 @@ github.com/tektoncd/cli/pkg/pipelinerun github.com/tektoncd/cli/pkg/pipelinerun/sort github.com/tektoncd/cli/pkg/printer github.com/tektoncd/cli/pkg/taskrun -# github.com/tektoncd/pipeline v0.44.0 => github.com/tektoncd/pipeline v0.42.0 -## explicit; go 1.18 +github.com/tektoncd/cli/pkg/taskrun/sort +# github.com/tektoncd/pipeline v0.47.0 +## explicit; go 1.19 github.com/tektoncd/pipeline/pkg/apis/config github.com/tektoncd/pipeline/pkg/apis/pipeline github.com/tektoncd/pipeline/pkg/apis/pipeline/pod @@ -1079,14 +1077,12 @@ github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1be github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1 github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1 github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1beta1 -github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned -github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/scheme -github.com/tektoncd/pipeline/pkg/client/resource/clientset/versioned/typed/resource/v1alpha1 github.com/tektoncd/pipeline/pkg/list github.com/tektoncd/pipeline/pkg/reconciler/pipeline/dag -github.com/tektoncd/pipeline/pkg/status +github.com/tektoncd/pipeline/pkg/result +github.com/tektoncd/pipeline/pkg/spire/config github.com/tektoncd/pipeline/pkg/substitution -# github.com/tektoncd/triggers v0.22.0 +# github.com/tektoncd/triggers v0.23.1-0.20230420080448-bf603123cc0f ## explicit; go 1.17 github.com/tektoncd/triggers/pkg/apis/config github.com/tektoncd/triggers/pkg/apis/triggers @@ -1097,12 +1093,15 @@ github.com/tektoncd/triggers/pkg/client/clientset/versioned github.com/tektoncd/triggers/pkg/client/clientset/versioned/scheme github.com/tektoncd/triggers/pkg/client/clientset/versioned/typed/triggers/v1alpha1 github.com/tektoncd/triggers/pkg/client/clientset/versioned/typed/triggers/v1beta1 -# github.com/vbatts/tar-split v0.11.2 +# github.com/vbatts/tar-split v0.11.3 ## explicit; go 1.15 github.com/vbatts/tar-split/archive/tar # github.com/whilp/git-urls v1.0.0 ## explicit; go 1.13 github.com/whilp/git-urls +# github.com/xanzy/go-gitlab v0.83.0 +## explicit; go 1.18 +github.com/xanzy/go-gitlab # github.com/xanzy/ssh-agent v0.3.3 ## explicit; go 1.16 github.com/xanzy/ssh-agent @@ -1153,14 +1152,17 @@ go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit go.uber.org/zap/zapcore -# golang.org/x/crypto v0.7.0 +# golang.org/x/crypto v0.11.0 ## explicit; go 1.17 +golang.org/x/crypto/argon2 +golang.org/x/crypto/blake2b golang.org/x/crypto/blowfish golang.org/x/crypto/cast5 golang.org/x/crypto/chacha20 golang.org/x/crypto/curve25519 golang.org/x/crypto/curve25519/internal/field golang.org/x/crypto/ed25519 +golang.org/x/crypto/hkdf golang.org/x/crypto/internal/alias golang.org/x/crypto/internal/poly1305 golang.org/x/crypto/openpgp @@ -1171,16 +1173,22 @@ golang.org/x/crypto/openpgp/packet golang.org/x/crypto/openpgp/s2k golang.org/x/crypto/pkcs12 golang.org/x/crypto/pkcs12/internal/rc2 +golang.org/x/crypto/sha3 golang.org/x/crypto/ssh golang.org/x/crypto/ssh/agent golang.org/x/crypto/ssh/internal/bcrypt_pbkdf golang.org/x/crypto/ssh/knownhosts -# golang.org/x/mod v0.9.0 +# golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 +## explicit; go 1.20 +golang.org/x/exp/maps +# golang.org/x/mod v0.12.0 ## explicit; go 1.17 golang.org/x/mod/semver -# golang.org/x/net v0.8.0 +# golang.org/x/net v0.12.0 ## explicit; go 1.17 golang.org/x/net/context +golang.org/x/net/html +golang.org/x/net/html/atom golang.org/x/net/http/httpguts golang.org/x/net/http2 golang.org/x/net/http2/h2c @@ -1190,7 +1198,7 @@ golang.org/x/net/internal/socks golang.org/x/net/internal/timeseries golang.org/x/net/proxy golang.org/x/net/trace -# golang.org/x/oauth2 v0.5.0 +# golang.org/x/oauth2 v0.9.0 ## explicit; go 1.17 golang.org/x/oauth2 golang.org/x/oauth2/authhandler @@ -1199,11 +1207,11 @@ golang.org/x/oauth2/google/internal/externalaccount golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt -# golang.org/x/sync v0.1.0 -## explicit +# golang.org/x/sync v0.3.0 +## explicit; go 1.17 golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.6.0 +# golang.org/x/sys v0.10.0 ## explicit; go 1.17 golang.org/x/sys/cpu golang.org/x/sys/execabs @@ -1211,10 +1219,10 @@ golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.6.0 +# golang.org/x/term v0.10.0 ## explicit; go 1.17 golang.org/x/term -# golang.org/x/text v0.8.0 +# golang.org/x/text v0.11.0 ## explicit; go 1.17 golang.org/x/text/cases golang.org/x/text/encoding @@ -1236,12 +1244,13 @@ golang.org/x/text/width # golang.org/x/time v0.3.0 ## explicit golang.org/x/time/rate -# golang.org/x/tools v0.6.0 +# golang.org/x/tools v0.9.1 ## explicit; go 1.18 golang.org/x/tools/cmd/stringer golang.org/x/tools/go/gcexportdata golang.org/x/tools/go/internal/packagesdriver golang.org/x/tools/go/packages +golang.org/x/tools/go/types/objectpath golang.org/x/tools/internal/event golang.org/x/tools/internal/event/core golang.org/x/tools/internal/event/keys @@ -1256,7 +1265,7 @@ golang.org/x/tools/internal/typesinternal # gomodules.xyz/jsonpatch/v2 v2.2.0 ## explicit; go 1.12 gomodules.xyz/jsonpatch/v2 -# google.golang.org/api v0.108.0 +# google.golang.org/api v0.125.0 ## explicit; go 1.19 google.golang.org/api/support/bundler # google.golang.org/appengine v1.6.7 @@ -1271,13 +1280,17 @@ google.golang.org/appengine/internal/modules google.golang.org/appengine/internal/remote_api google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/urlfetch -# google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2 +# google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc +## explicit; go 1.19 +google.golang.org/genproto/protobuf/field_mask +# google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc ## explicit; go 1.19 google.golang.org/genproto/googleapis/api/expr/v1alpha1 google.golang.org/genproto/googleapis/api/httpbody +# google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529 +## explicit; go 1.19 google.golang.org/genproto/googleapis/rpc/status -google.golang.org/genproto/protobuf/field_mask -# google.golang.org/grpc v1.52.1 +# google.golang.org/grpc v1.56.1 ## explicit; go 1.17 google.golang.org/grpc google.golang.org/grpc/attributes @@ -1328,7 +1341,7 @@ google.golang.org/grpc/serviceconfig google.golang.org/grpc/stats google.golang.org/grpc/status google.golang.org/grpc/tap -# google.golang.org/protobuf v1.28.1 +# google.golang.org/protobuf v1.31.0 ## explicit; go 1.11 google.golang.org/protobuf/encoding/protojson google.golang.org/protobuf/encoding/prototext @@ -1390,7 +1403,7 @@ gotest.tools/v3/internal/assert gotest.tools/v3/internal/difflib gotest.tools/v3/internal/format gotest.tools/v3/internal/source -# k8s.io/api v0.26.1 => k8s.io/api v0.25.4 +# k8s.io/api v0.26.5 => k8s.io/api v0.25.4 ## explicit; go 1.19 k8s.io/api/admissionregistration/v1 k8s.io/api/admissionregistration/v1beta1 @@ -1438,11 +1451,11 @@ k8s.io/api/scheduling/v1beta1 k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 -# k8s.io/apiextensions-apiserver v0.26.1 +# k8s.io/apiextensions-apiserver v0.26.5 ## explicit; go 1.19 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 -# k8s.io/apimachinery v0.26.1 => k8s.io/apimachinery v0.25.4 +# k8s.io/apimachinery v0.26.5 => k8s.io/apimachinery v0.25.4 ## explicit; go 1.19 k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -1498,7 +1511,7 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/cli-runtime v0.25.4 +# k8s.io/cli-runtime v0.25.9 ## explicit; go 1.19 k8s.io/cli-runtime/pkg/genericclioptions k8s.io/cli-runtime/pkg/printers @@ -1642,7 +1655,7 @@ k8s.io/client-go/util/jsonpath k8s.io/client-go/util/keyutil k8s.io/client-go/util/retry k8s.io/client-go/util/workqueue -# k8s.io/klog/v2 v2.90.0 +# k8s.io/klog/v2 v2.100.1 ## explicit; go 1.13 k8s.io/klog/v2 k8s.io/klog/v2/internal/buffer @@ -1650,13 +1663,13 @@ k8s.io/klog/v2/internal/clock k8s.io/klog/v2/internal/dbg k8s.io/klog/v2/internal/serialize k8s.io/klog/v2/internal/severity -# k8s.io/kube-openapi v0.0.0-20230123231816-1cb3ae25d79a +# k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a ## explicit; go 1.18 k8s.io/kube-openapi/pkg/builder3/util +k8s.io/kube-openapi/pkg/cached k8s.io/kube-openapi/pkg/common k8s.io/kube-openapi/pkg/handler3 k8s.io/kube-openapi/pkg/internal -k8s.io/kube-openapi/pkg/internal/handler k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json k8s.io/kube-openapi/pkg/openapiconv k8s.io/kube-openapi/pkg/schemaconv @@ -1664,7 +1677,7 @@ k8s.io/kube-openapi/pkg/schemamutation k8s.io/kube-openapi/pkg/spec3 k8s.io/kube-openapi/pkg/util/proto k8s.io/kube-openapi/pkg/validation/spec -# k8s.io/utils v0.0.0-20230115233650-391b47cb4029 +# k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 ## explicit; go 1.18 k8s.io/utils/buffer k8s.io/utils/clock @@ -1677,7 +1690,7 @@ k8s.io/utils/net k8s.io/utils/pointer k8s.io/utils/strings/slices k8s.io/utils/trace -# knative.dev/client-pkg v0.0.0-20230501131754-e5c405e16e90 +# knative.dev/client-pkg v0.0.0-20230726202841-bd83cf476909 ## explicit; go 1.18 knative.dev/client-pkg/pkg/apis/client knative.dev/client-pkg/pkg/apis/client/v1alpha1 @@ -1691,7 +1704,7 @@ knative.dev/client-pkg/pkg/serving/v1 knative.dev/client-pkg/pkg/util knative.dev/client-pkg/pkg/util/test knative.dev/client-pkg/pkg/wait -# knative.dev/eventing v0.37.1-0.20230518094712-4b9fdefe36a3 +# knative.dev/eventing v0.38.0 ## explicit; go 1.19 knative.dev/eventing/pkg/apis/config knative.dev/eventing/pkg/apis/duck @@ -1712,10 +1725,10 @@ knative.dev/eventing/pkg/apis/sources/v1 knative.dev/eventing/pkg/apis/sources/v1beta2 knative.dev/eventing/pkg/client/clientset/versioned/scheme knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1 -# knative.dev/hack v0.0.0-20230501013555-7d81248b4638 +# knative.dev/hack v0.0.0-20230712131415-ddae80293c43 ## explicit; go 1.18 knative.dev/hack -# knative.dev/networking v0.0.0-20230511122402-33636d99d870 +# knative.dev/networking v0.0.0-20230718160410-75dcd54d9510 ## explicit; go 1.18 knative.dev/networking/pkg knative.dev/networking/pkg/apis/networking @@ -1727,7 +1740,7 @@ knative.dev/networking/pkg/http/probe knative.dev/networking/pkg/http/proxy knative.dev/networking/pkg/http/stats knative.dev/networking/pkg/k8s -# knative.dev/pkg v0.0.0-20230518105712-dfb4bf04635d +# knative.dev/pkg v0.0.0-20230718152110-aef227e72ead ## explicit; go 1.18 knative.dev/pkg/apis knative.dev/pkg/apis/duck @@ -1770,7 +1783,7 @@ knative.dev/pkg/tracing/propagation knative.dev/pkg/tracing/propagation/tracecontextb3 knative.dev/pkg/tracker knative.dev/pkg/webhook/resourcesemantics -# knative.dev/serving v0.37.1-0.20230515180909-99800edf6260 +# knative.dev/serving v0.38.0 ## explicit; go 1.18 knative.dev/serving/pkg/apis/autoscaling knative.dev/serving/pkg/apis/autoscaling/v1alpha1 @@ -1791,6 +1804,9 @@ knative.dev/serving/pkg/reconciler/route/resources/labels knative.dev/serving/pkg/reconciler/route/resources/names knative.dev/serving/pkg/reconciler/service/resources/names knative.dev/serving/pkg/testing/v1 +# sigs.k8s.io/controller-runtime v0.7.2 +## explicit; go 1.15 +sigs.k8s.io/controller-runtime/pkg/client/apiutil # sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd ## explicit; go 1.18 sigs.k8s.io/json @@ -1888,10 +1904,8 @@ sigs.k8s.io/structured-merge-diff/v4/value ## explicit; go 1.12 sigs.k8s.io/yaml # github.com/cloudevents/sdk-go/sql/v2 => github.com/cloudevents/sdk-go/sql/v2 v2.0.0-20220930150014-52b12276cc4a -# github.com/docker/docker => github.com/docker/docker v20.10.21+incompatible +# github.com/containers/image/v5 => github.com/containers/image/v5 v5.23.1 # github.com/hinshun/vt10x => github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c -# github.com/openshift/source-to-image => github.com/boson-project/source-to-image v1.3.2 -# github.com/tektoncd/pipeline => github.com/tektoncd/pipeline v0.42.0 # k8s.io/api => k8s.io/api v0.25.4 # k8s.io/apimachinery => k8s.io/apimachinery v0.25.4 # k8s.io/client-go => k8s.io/client-go v0.25.4 diff --git a/vendor/sigs.k8s.io/controller-runtime/LICENSE b/vendor/sigs.k8s.io/controller-runtime/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/LICENSE @@ -0,0 +1,201 @@ + 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/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go new file mode 100644 index 0000000000..b3464c655d --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go @@ -0,0 +1,151 @@ +/* +Copyright 2018 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 apiutil contains utilities for working with raw Kubernetes +// API machinery, such as creating RESTMappers and raw REST clients, +// and extracting the GVK of an object. +package apiutil + +import ( + "fmt" + "sync" + + "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/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/discovery" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" +) + +var ( + protobufScheme = runtime.NewScheme() + protobufSchemeLock sync.RWMutex +) + +func init() { + // Currently only enabled for built-in resources which are guaranteed to implement Protocol Buffers. + // For custom resources, CRDs can not support Protocol Buffers but Aggregated API can. + // See doc: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#advanced-features-and-flexibility + if err := clientgoscheme.AddToScheme(protobufScheme); err != nil { + panic(err) + } +} + +// AddToProtobufScheme add the given SchemeBuilder into protobufScheme, which should +// be additional types that do support protobuf. +func AddToProtobufScheme(addToScheme func(*runtime.Scheme) error) error { + protobufSchemeLock.Lock() + defer protobufSchemeLock.Unlock() + return addToScheme(protobufScheme) +} + +// NewDiscoveryRESTMapper constructs a new RESTMapper based on discovery +// information fetched by a new client with the given config. +func NewDiscoveryRESTMapper(c *rest.Config) (meta.RESTMapper, error) { + // Get a mapper + dc, err := discovery.NewDiscoveryClientForConfig(c) + if err != nil { + return nil, err + } + gr, err := restmapper.GetAPIGroupResources(dc) + if err != nil { + return nil, err + } + return restmapper.NewDiscoveryRESTMapper(gr), nil +} + +// GVKForObject finds the GroupVersionKind associated with the given object, if there is only a single such GVK. +func GVKForObject(obj runtime.Object, scheme *runtime.Scheme) (schema.GroupVersionKind, error) { + // TODO(directxman12): do we want to generalize this to arbitrary container types? + // I think we'd need a generalized form of scheme or something. It's a + // shame there's not a reliable "GetGVK" interface that works by default + // for unpopulated static types and populated "dynamic" types + // (unstructured, partial, etc) + + // check for PartialObjectMetadata, which is analogous to unstructured, but isn't handled by ObjectKinds + _, isPartial := obj.(*metav1.PartialObjectMetadata) + _, isPartialList := obj.(*metav1.PartialObjectMetadataList) + if isPartial || isPartialList { + // we require that the GVK be populated in order to recognize the object + gvk := obj.GetObjectKind().GroupVersionKind() + if len(gvk.Kind) == 0 { + return schema.GroupVersionKind{}, runtime.NewMissingKindErr("unstructured object has no kind") + } + if len(gvk.Version) == 0 { + return schema.GroupVersionKind{}, runtime.NewMissingVersionErr("unstructured object has no version") + } + return gvk, nil + } + + gvks, isUnversioned, err := scheme.ObjectKinds(obj) + if err != nil { + return schema.GroupVersionKind{}, err + } + if isUnversioned { + return schema.GroupVersionKind{}, fmt.Errorf("cannot create group-version-kind for unversioned type %T", obj) + } + + if len(gvks) < 1 { + return schema.GroupVersionKind{}, fmt.Errorf("no group-version-kinds associated with type %T", obj) + } + if len(gvks) > 1 { + // this should only trigger for things like metav1.XYZ -- + // normal versioned types should be fine + return schema.GroupVersionKind{}, fmt.Errorf( + "multiple group-version-kinds associated with type %T, refusing to guess at one", obj) + } + return gvks[0], nil +} + +// RESTClientForGVK constructs a new rest.Interface capable of accessing the resource associated +// with the given GroupVersionKind. The REST client will be configured to use the negotiated serializer from +// baseConfig, if set, otherwise a default serializer will be set. +func RESTClientForGVK(gvk schema.GroupVersionKind, isUnstructured bool, baseConfig *rest.Config, codecs serializer.CodecFactory) (rest.Interface, error) { + cfg := createRestConfig(gvk, isUnstructured, baseConfig) + if cfg.NegotiatedSerializer == nil { + cfg.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: codecs} + } + return rest.RESTClientFor(cfg) +} + +//createRestConfig copies the base config and updates needed fields for a new rest config +func createRestConfig(gvk schema.GroupVersionKind, isUnstructured bool, baseConfig *rest.Config) *rest.Config { + gv := gvk.GroupVersion() + + cfg := rest.CopyConfig(baseConfig) + cfg.GroupVersion = &gv + if gvk.Group == "" { + cfg.APIPath = "/api" + } else { + cfg.APIPath = "/apis" + } + if cfg.UserAgent == "" { + cfg.UserAgent = rest.DefaultKubernetesUserAgent() + } + // TODO(FillZpp): In the long run, we want to check discovery or something to make sure that this is actually true. + if cfg.ContentType == "" && !isUnstructured { + protobufSchemeLock.RLock() + if protobufScheme.Recognizes(gvk) { + cfg.ContentType = runtime.ContentTypeProtobuf + } + protobufSchemeLock.RUnlock() + } + return cfg +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/dynamicrestmapper.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/dynamicrestmapper.go new file mode 100644 index 0000000000..5e9a7b5f53 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/dynamicrestmapper.go @@ -0,0 +1,285 @@ +/* +Copyright 2019 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 apiutil + +import ( + "errors" + "sync" + + "golang.org/x/time/rate" + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" + "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" +) + +// dynamicRESTMapper is a RESTMapper that dynamically discovers resource +// types at runtime. +type dynamicRESTMapper struct { + mu sync.RWMutex // protects the following fields + staticMapper meta.RESTMapper + limiter *rate.Limiter + newMapper func() (meta.RESTMapper, error) + + lazy bool + // Used for lazy init. + initOnce sync.Once +} + +// DynamicRESTMapperOption is a functional option on the dynamicRESTMapper +type DynamicRESTMapperOption func(*dynamicRESTMapper) error + +// WithLimiter sets the RESTMapper's underlying limiter to lim. +func WithLimiter(lim *rate.Limiter) DynamicRESTMapperOption { + return func(drm *dynamicRESTMapper) error { + drm.limiter = lim + return nil + } +} + +// WithLazyDiscovery prevents the RESTMapper from discovering REST mappings +// until an API call is made. +var WithLazyDiscovery DynamicRESTMapperOption = func(drm *dynamicRESTMapper) error { + drm.lazy = true + return nil +} + +// WithCustomMapper supports setting a custom RESTMapper refresher instead of +// the default method, which uses a discovery client. +// +// This exists mainly for testing, but can be useful if you need tighter control +// over how discovery is performed, which discovery endpoints are queried, etc. +func WithCustomMapper(newMapper func() (meta.RESTMapper, error)) DynamicRESTMapperOption { + return func(drm *dynamicRESTMapper) error { + drm.newMapper = newMapper + return nil + } +} + +// NewDynamicRESTMapper returns a dynamic RESTMapper for cfg. The dynamic +// RESTMapper dynamically discovers resource types at runtime. opts +// configure the RESTMapper. +func NewDynamicRESTMapper(cfg *rest.Config, opts ...DynamicRESTMapperOption) (meta.RESTMapper, error) { + client, err := discovery.NewDiscoveryClientForConfig(cfg) + if err != nil { + return nil, err + } + drm := &dynamicRESTMapper{ + limiter: rate.NewLimiter(rate.Limit(defaultRefillRate), defaultLimitSize), + newMapper: func() (meta.RESTMapper, error) { + groupResources, err := restmapper.GetAPIGroupResources(client) + if err != nil { + return nil, err + } + return restmapper.NewDiscoveryRESTMapper(groupResources), nil + }, + } + for _, opt := range opts { + if err = opt(drm); err != nil { + return nil, err + } + } + if !drm.lazy { + if err := drm.setStaticMapper(); err != nil { + return nil, err + } + } + return drm, nil +} + +var ( + // defaultRefilRate is the default rate at which potential calls are + // added back to the "bucket" of allowed calls. + defaultRefillRate = 5 + // defaultLimitSize is the default starting/max number of potential calls + // per second. Once a call is used, it's added back to the bucket at a rate + // of defaultRefillRate per second. + defaultLimitSize = 5 +) + +// setStaticMapper sets drm's staticMapper by querying its client, regardless +// of reload backoff. +func (drm *dynamicRESTMapper) setStaticMapper() error { + newMapper, err := drm.newMapper() + if err != nil { + return err + } + drm.staticMapper = newMapper + return nil +} + +// init initializes drm only once if drm is lazy. +func (drm *dynamicRESTMapper) init() (err error) { + drm.initOnce.Do(func() { + if drm.lazy { + err = drm.setStaticMapper() + } + }) + return err +} + +// checkAndReload attempts to call the given callback, which is assumed to be dependent +// on the data in the restmapper. +// +// If the callback returns an error that matches the given error, it will attempt to reload +// the RESTMapper's data and re-call the callback once that's occurred. +// If the callback returns any other error, the function will return immediately regardless. +// +// It will take care of ensuring that reloads are rate-limited and that extraneous calls +// aren't made. If a reload would exceed the limiters rate, it returns the error return by +// the callback. +// It's thread-safe, and worries about thread-safety for the callback (so the callback does +// not need to attempt to lock the restmapper). +func (drm *dynamicRESTMapper) checkAndReload(needsReloadErr error, checkNeedsReload func() error) error { + // first, check the common path -- data is fresh enough + // (use an IIFE for the lock's defer) + err := func() error { + drm.mu.RLock() + defer drm.mu.RUnlock() + + return checkNeedsReload() + }() + + // NB(directxman12): `Is` and `As` have a confusing relationship -- + // `Is` is like `== or does this implement .Is`, whereas `As` says + // `can I type-assert into` + needsReload := errors.As(err, &needsReloadErr) + if !needsReload { + return err + } + + // if the data wasn't fresh, we'll need to try and update it, so grab the lock... + drm.mu.Lock() + defer drm.mu.Unlock() + + // ... and double-check that we didn't reload in the meantime + err = checkNeedsReload() + needsReload = errors.As(err, &needsReloadErr) + if !needsReload { + return err + } + + // we're still stale, so grab a rate-limit token if we can... + if !drm.limiter.Allow() { + // return error from static mapper here, we have refreshed often enough (exceeding rate of provided limiter) + // so that client's can handle this the same way as a "normal" NoResourceMatchError / NoKindMatchError + return err + } + + // ...reload... + if err := drm.setStaticMapper(); err != nil { + return err + } + + // ...and return the results of the closure regardless + return checkNeedsReload() +} + +// TODO: wrap reload errors on NoKindMatchError with go 1.13 errors. + +func (drm *dynamicRESTMapper) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { + if err := drm.init(); err != nil { + return schema.GroupVersionKind{}, err + } + var gvk schema.GroupVersionKind + err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + var err error + gvk, err = drm.staticMapper.KindFor(resource) + return err + }) + return gvk, err +} + +func (drm *dynamicRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) { + if err := drm.init(); err != nil { + return nil, err + } + var gvks []schema.GroupVersionKind + err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + var err error + gvks, err = drm.staticMapper.KindsFor(resource) + return err + }) + return gvks, err +} + +func (drm *dynamicRESTMapper) ResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, error) { + if err := drm.init(); err != nil { + return schema.GroupVersionResource{}, err + } + + var gvr schema.GroupVersionResource + err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + var err error + gvr, err = drm.staticMapper.ResourceFor(input) + return err + }) + return gvr, err +} + +func (drm *dynamicRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([]schema.GroupVersionResource, error) { + if err := drm.init(); err != nil { + return nil, err + } + var gvrs []schema.GroupVersionResource + err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + var err error + gvrs, err = drm.staticMapper.ResourcesFor(input) + return err + }) + return gvrs, err +} + +func (drm *dynamicRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) { + if err := drm.init(); err != nil { + return nil, err + } + var mapping *meta.RESTMapping + err := drm.checkAndReload(&meta.NoKindMatchError{}, func() error { + var err error + mapping, err = drm.staticMapper.RESTMapping(gk, versions...) + return err + }) + return mapping, err +} + +func (drm *dynamicRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) { + if err := drm.init(); err != nil { + return nil, err + } + var mappings []*meta.RESTMapping + err := drm.checkAndReload(&meta.NoKindMatchError{}, func() error { + var err error + mappings, err = drm.staticMapper.RESTMappings(gk, versions...) + return err + }) + return mappings, err +} + +func (drm *dynamicRESTMapper) ResourceSingularizer(resource string) (string, error) { + if err := drm.init(); err != nil { + return "", err + } + var singular string + err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + var err error + singular, err = drm.staticMapper.ResourceSingularizer(resource) + return err + }) + return singular, err +}